ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjRiNDVhLi4wMDAwMDAwCi0tLSBhLy5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMKLSMgQmVsb3cgYXJlIHNvbWUgbWlub3IgZGV2aWF0aW9ucyBmcm9tIHRoZSBkZWZhdWx0IEdvb2dsZSBzdHlsZSB0bwotIyBhY2NvbW1vZGF0ZSBmb3IgaGFuZGxpbmcgb2YgdGhlIGxhcmdlIGxlZ2FjeSBjb2RlIGJhc2UuCi0jCi0KLUJhc2VkT25TdHlsZTogR29vZ2xlCi1Db21tZW50UHJhZ21hczogTk9MSU5UOi4qCi1EZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQpkaWZmIC0tZ2l0IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmU3NGMuLjAwMDAwMDAKLS0tIGEvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYnVpbGR0b29scwotb3V0Ci10aGlyZF9wYXJ0eS8KLXRhcmdldC8KLUNhcmdvLmxvY2sKLXRhZ3MKLWNzY29wZS5vdXQKLWNzY29wZS5maWxlcwotKi5zdz8KZGlmZiAtLWdpdCBhLy5zdHlsZS55YXBmIGIvLnN0eWxlLnlhcGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTE5MjIuLjAwMDAwMDAKLS0tIGEvLnN0eWxlLnlhcGYKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVtzdHlsZV0KLSMgaHR0cDovL2dvb2dsZS5naXRodWIuaW8vc3R5bGVndWlkZS9weWd1aWRlLmh0bWwKLWJhc2VkX29uX3N0eWxlOiBnb29nbGUKLWluZGVudF93aWR0aDogNAotY29sdW1uX2xpbWl0OiAxMjAKZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ5MzgwLi4wMDAwMDAwCi0tLSBhL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCi0vLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAotLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgotLy8KLS8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KLS8vCi0vLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAotLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCi0vLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgotLy8KLS8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCi0vLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQotLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgotLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotbGljZW5zZSB7Ci0gICAgbmFtZTogInN5c3RlbV9idF9saWNlbnNlIiwKLSAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKLSAgICBsaWNlbnNlX2tpbmRzOiBbCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKLSAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1NSVQiLAotICAgICAgICAibGVnYWN5X3VuZW5jdW1iZXJlZCIsCi0gICAgXSwKLSAgICBsaWNlbnNlX3RleHQ6IFsKLSAgICAgICAgIk5PVElDRSIsCi0gICAgXSwKLX0KLQotc3ViZGlycyA9IFsKLSAgICAiYXBleCIsCi0gICAgImJpbmRlciIsCi0gICAgImJ1aWxkIiwKLSAgICAiYnRpZiIsCi0gICAgImJ0Y29yZSIsCi0gICAgImNvbW1vbiIsCi0gICAgImF1ZGlvX2EyZHBfaHciLAotICAgICJhdWRpb19ibHVldG9vdGhfaHciLAotICAgICJhdWRpb19oYWxfaW50ZXJmYWNlIiwKLSAgICAiYXVkaW9faGVhcmluZ19haWRfaHciLAotICAgICJnZCIsCi0gICAgImhjaSIsCi0gICAgInV0aWxzIiwKLSAgICAiZGV2aWNlIiwKLSAgICAic3RhY2siLAotICAgICJvc2kiLAotICAgICJlbWJkcnYiLAotICAgICJzZXJ2aWNlIiwKLSAgICAiaW5jbHVkZSIsCi0gICAgIm1haW4iLAotICAgICJidGEiLAotICAgICJ2ZW5kb3JfbGlicyIsCi0gICAgInRlc3QiLAotICAgICJ0eXBlcyIsCi0gICAgInVkcnYiLAotICAgICJ0b29scyIsCi0gICAgInByb3RvIiwKLV0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoVGVzdENvbmZpZ1RlbXBsYXRlIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJBbmRyb2lkVGVzdFRlbXBsYXRlLnhtbCIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL0FuZHJvaWRUZXN0VGVtcGxhdGUueG1sIGIvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMWJlOTMuLjAwMDAwMDAKLS0tIGEvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyB7TU9EVUxFfS4iPgotICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdCIgLz4KLSAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QtbmF0aXZlIiAvPgotICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJvb3RUYXJnZXRQcmVwYXJlciIgLz4KLSAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IntNT0RVTEV9LT4vZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+Ci0gIDwvdGFyZ2V0X3ByZXBhcmVyPgotICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9InNldHRpbmdzIHB1dCBnbG9iYWwgYmxlX3NjYW5fYWx3YXlzX2VuYWJsZWQgMCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ic3ZjIGJsdWV0b290aCBkaXNhYmxlIiAvPgotICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5Gb2xkZXJTYXZlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJkZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL3ZlbmRvci9zc3JkdW1wIiAvPgotICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0iIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJydW4tdGVzdC1hcyIgdmFsdWU9IjAiIC8+Ci0gIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL0JVSUxELmduIGIvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYmZhMDcuLjAwMDAwMDAKLS0tIGEvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBpcyB0aGUgcm9vdCBidWlsZCBmaWxlIGZvciBHTi4gR04gd2lsbCBzdGFydCBwcm9jZXNzaW5nIGJ5IGxvYWRpbmcgdGhpcwotIyBmaWxlLCBhbmQgcmVjdXJzaXZlbHkgbG9hZCBhbGwgZGVwZW5kZW5jaWVzIHVudGlsIGFsbCBkZXBlbmRlbmNpZXMgYXJlIGVpdGhlcgotIyByZXNvbHZlZCBvciBrbm93biBub3QgdG8gZXhpc3QgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIGJ1aWxkIHRvIGZhaWwpLiBTbyBpZgotIyB5b3UgYWRkIGEgbmV3IGJ1aWxkIGZpbGUsIHRoZXJlIG11c3QgYmUgc29tZSBwYXRoIG9mIGRlcGVuZGVuY2llcyBmcm9tIHRoaXMKLSMgZmlsZSB0byB5b3VyIG5ldyBvbmUgb3IgR04gd29uJ3Qga25vdyBhYm91dCBpdC4KLQotZ3JvdXAoImFsbCIpIHsKLSAgZGVwcyA9IFsgIjpibHVldG9vdGgiIF0KLQotICAjaWYgKHVzZS50ZXN0KSB7Ci0gICAgI2RlcHMgKz0gWyAiOmJsdWV0b290aF90ZXN0cyIgXQotICAjfQotfQotCi0jIFRoaXMgcHVsbHMgaW4gbWFpbi9CVUlMRC5nbiBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMuCi1ncm91cCgiYmx1ZXRvb3RoIikgewotICBkZXBzID0gWwotICAgICIvL2J0L21haW46Ymx1ZXRvb3RoIiwKLSAgICAiLy9idC9tYWluOmJsdWV0b290aC1zdGF0aWMiLAotICAgICMiLy9idC9zZXJ2aWNlOmJsdWV0b290aHRiZCIsCi0gIF0KLX0KLQotIyBUT0RPKGIvMTkwNzUwMTY3KSAtIFJlLWVuYWJsZSBvbmNlIHdlJ3JlIGZ1bGx5IEJhemVsIGJ1aWxkCi0jaWYgKHVzZS50ZXN0KSB7Ci0gICNncm91cCgiYmx1ZXRvb3RoX3Rlc3RzIikgewotICAgICNkZXBzID0gWwotICAgICAgIyIvL2J0L2J0Y29yZTpuZXRfdGVzdF9idGNvcmUiLAotICAgICAgIyIvL2J0L2NvbW1vbjpibHVldG9vdGhfdGVzdF9jb21tb24iLAotICAgICAgIyIvL2J0L3Byb2ZpbGUvYXZyY3A6bmV0X3Rlc3RfYXZyY3AiLAotICAgICAgIyIvL2J0L3NlcnZpY2U6Ymx1ZXRvb3RodGJkX3Rlc3QiLAotICAgICAgIyIvL2J0L3N0YWNrOm5ldF90ZXN0X2J0bV9pc28iLAotICAgICAgIyIvL2J0L3R5cGVzOm5ldF90ZXN0X3R5cGVzIiwKLQotICAgICAgIyMiLy9idC9wYWNrZXQ6bmV0X3Rlc3RfYnRwYWNrZXRzIiwKLSAgICAjXQotICAjfQotI30KLQotaWYgKGhvc3RfY3B1ID09IHRhcmdldF9jcHUgJiYgaG9zdF9vcyA9PSB0YXJnZXRfb3MpIHsKLSAgZ3JvdXAoInRvb2xzIikgewotICAgIGRlcHMgPSBbCi0gICAgICAiLy9idC9nZC9kdW1wc3lzL2J1bmRsZXI6Ymx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlciIsCi0gICAgICAiLy9idC9nZC9wYWNrZXQvcGFyc2VyOmJsdWV0b290aF9wYWNrZXRnZW4iLAotICAgIF0KLSAgfQotfQotCi1pZiAoZGVmaW5lZCh1c2UuYW5kcm9pZCkgJiYgdXNlLmFuZHJvaWQpIHsKLSAgZ3JvdXAoImFuZHJvaWRfYmx1ZXRvb3RoX3Rlc3RzIikgewotICAgIGRlcHMgPSBbCi0gICAgICAiLy9idC9kZXZpY2U6bmV0X3Rlc3RfZGV2aWNlIiwKLSAgICAgICIvL2J0L2hjaTpuZXRfdGVzdF9oY2kiLAotICAgICAgIi8vYnQvb3NpOm5ldF90ZXN0X29zaSIsCi0gICAgICAiLy9idC90ZXN0L3N1aXRlOm5ldF90ZXN0X2JsdWV0b290aCIsCi0gICAgXQotICB9Ci19Ci0KLWNvbmZpZygidGFyZ2V0X2RlZmF1bHRzIikgewotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQiLAotICAgICIvL2J0L2xpbnV4X2luY2x1ZGUiLAotICAgICIvL2J0L3R5cGVzIiwKLSAgICAiLy9idC9pbmNsdWRlIiwKLQotICAgICMgRm9yIGZsYXRidWZmZXIgZ2VuZXJhdGVkIGhlYWRlcnMKLSAgICAiJHtyb290X2dlbl9kaXJ9L2J0L2dkLyIsCi0gICAgIiR7cm9vdF9nZW5fZGlyfS9idC9nZC9kdW1wc3lzL2J1bmRsZXIiLAotICBdCi0KLSAgY2ZsYWdzID0gWwotICAgICItZlBJQyIsCi0gICAgIi1Xbm8tbm9uLWMtdHlwZWRlZi1mb3ItbGlua2FnZSIsCi0gICAgIi1Xbm8tdW5yZWFjaGFibGUtY29kZS1yZXR1cm4iLAotICAgICItV25vLWRlZmF1bHRlZC1mdW5jdGlvbi1kZWxldGVkIiwKLSAgICAiLVduby1nbnUtdmFyaWFibGUtc2l6ZWQtdHlwZS1ub3QtYXQtZW5kIiwKLSAgICAiLVduby1mb3JtYXQtbm9ubGl0ZXJhbCIsCi0gICAgIi1Xbm8taW5jb25zaXN0ZW50LW1pc3Npbmctb3ZlcnJpZGUiLAotICAgICItV25vLXVucmVhY2hhYmxlLWNvZGUiLAotICAgICItV25vLXJhbmdlLWxvb3AtY29uc3RydWN0IiwKLSAgICAiLVduby1yZW9yZGVyLWluaXQtbGlzdCIsCi0gICAgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIiwKLSAgICAiLVduby11bnVzZWQtcmVzdWx0IiwKLSAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAotICAgICItV25vLXVudXNlZC1jb25zdC12YXJpYWJsZSIsCi0gICAgIi1Xbm8tZm9ybWF0IiwKLSAgICAiLVduby1wZXNzaW1pemluZy1tb3ZlIiwKLSAgICAiLVduby11bmtub3duLXdhcm5pbmctb3B0aW9uIiwKLSAgICAiLVduby1maW5hbC1kdG9yLW5vbi1maW5hbC1jbGFzcyIsCi0gIF0KLQotICBjZmxhZ3NfY2MgPSBbCi0gICAgIi1zdGQ9YysrMTciLAotICBdCi0KLSAgZGVmaW5lcyA9IFsKLSAgICAiSEFTX05PX0JEUk9JRF9CVUlMRENGRyIsCi0gICAgIk9TX0dFTkVSSUMiLAotICAgICJPU19MSU5VWF9HRU5FUklDIiwKLSAgICAiVEFSR0VUX0ZMT1NTIiwKLSAgICAiRVhQT1JUX1NZTUJPTD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKLSAgICAiRkFMTFRIUk9VR0hfSU5URU5ERUQ9W1tjbGFuZzo6ZmFsbHRocm91Z2hdXSIsCi0gIF0KLQotICAjIElmIG5vdCBjb25maWd1cmVkIGFzIGEgZHluYW1pYyBsaWJyYXJ5LCBkZWZhdWx0IHRvIHN0YXRpYyBsaWJyYXJ5Ci0gIGlmICghKGRlZmluZWQodXNlLmJ0X2R5bmxpYikgJiYgdXNlLmJ0X2R5bmxpYikpIHsKLSAgICBkZWZpbmVzICs9IFsKLSAgICAgICJTVEFUSUNfTElCQkxVRVRPT1RIIiwKLSAgICBdCi0gIH0KLQotICBpZiAoIShkZWZpbmVkKHVzZS5idF9ub25zdGFuZGFyZF9jb2RlY3MpICYmIHVzZS5idF9ub25zdGFuZGFyZF9jb2RlY3MpKSB7Ci0gICAgZGVmaW5lcyArPSBbICJFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUyIgXQotICB9Ci0KLSAgY29uZmlncyA9IFsgIjpleHRlcm5hbF9saWJjaHJvbWUiIF0KLX0KLQotZ3JvdXAoImxpYmJ0LXBsYXRmb3JtLXByb3Rvcy1saXRlIikgewotICBkZXBzID0gWwotICAgICIvL2V4dGVybmFsL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoOmxpYmJ0LXBsYXRmb3JtLXByb3Rvcy1saXRlIiwKLSAgXQotfQotCi0jIENvbmZpZ3VyYXRpb25zIHRvIHVzZSBhcyBkZXBlbmRlbmNpZXMgZm9yIEdOIGJ1aWxkCi1jb25maWcoImV4dGVybmFsX2d0ZXN0IikgewotICBjb25maWdzID0gWwotICAgICI6cGtnX2d0ZXN0IiwKLSAgICAiOnBrZ19nbW9jayIsCi0gIF0KLX0KLQotY29uZmlnKCJleHRlcm5hbF9ndGVzdF9tYWluIikgewotICBjb25maWdzID0gWyAiOnBrZ19ndGVzdF9tYWluIiBdCi19Ci0KLWNvbmZpZygiZXh0ZXJuYWxfZ21vY2tfbWFpbiIpIHsKLSAgY29uZmlncyA9IFsgIjpwa2dfZ21vY2tfbWFpbiIgXQotfQotCi1jb25maWcoImV4dGVybmFsX2xpYmNocm9tZSIpIHsKLSAgY29uZmlncyA9IFsgIjpwa2dfbGliY2hyb21lIiBdCi19Ci0KLWNvbmZpZygiZXh0ZXJuYWxfbW9kcF9iNjQiKSB7Ci0gIGNvbmZpZ3MgPSBbICI6cGtnX21vZHBfYjY0IiBdCi19Ci0KLWNvbmZpZygiZXh0ZXJuYWxfdGlueXhtbDIiKSB7Ci0gIGNvbmZpZ3MgPSBbICI6cGtnX3Rpbnl4bWwyIiBdCi19Ci0KLWNvbmZpZygiZXh0ZXJuYWxfZmxhdGJ1ZmZlcnMiKSB7Ci0gIGxpYl9kaXJzID0gWyAiJHtsaWJkaXJ9IiBdCi0KLSAgbGlicyA9IFsgImZsYXRidWZmZXJzIiBdCi19Ci0KLSMgUGFja2FnZSBjb25maWd1cmF0aW9ucyB0byBleHRyYWN0IGRlcGVuZGVuY2llcyBmcm9tIGVudgotcGtnX2NvbmZpZygicGtnX2d0ZXN0IikgewotICBwa2dfZGVwcyA9IFsgImd0ZXN0IiBdCi19Ci0KLXBrZ19jb25maWcoInBrZ19ndGVzdF9tYWluIikgewotICBwa2dfZGVwcyA9IFsgImd0ZXN0X21haW4iIF0KLX0KLQotcGtnX2NvbmZpZygicGtnX2dtb2NrIikgewotICBwa2dfZGVwcyA9IFsgImdtb2NrIiBdCi19Ci0KLXBrZ19jb25maWcoInBrZ19nbW9ja19tYWluIikgewotICBwa2dfZGVwcyA9IFsgImdtb2NrX21haW4iIF0KLX0KLQotcGtnX2NvbmZpZygicGtnX2xpYmNocm9tZSIpIHsKLSAgcGtnX2RlcHMgPSBbICJsaWJjaHJvbWUiIF0KLX0KLQotcGtnX2NvbmZpZygicGtnX21vZHBfYjY0IikgewotICBwa2dfZGVwcyA9IFsgImxpYm1vZHBfYjY0IiBdCi19Ci0KLXBrZ19jb25maWcoInBrZ190aW55eG1sMiIpIHsKLSAgcGtnX2RlcHMgPSBbICJ0aW55eG1sMiIgXQotfQotCi0jIFRvIHVzZSBub24tc3RhbmRhcmQgY29kZWNzIChpLmUuIGxkYWMsIGFhYywgYXB0eCksIHNldCB0aGlzIHVzZSBmbGFnIHdoZW4KLSMgYnVpbGRpbmcuIFRoZXNlIGNvZGVjcyBtYXkgaGF2ZSBsaWNlbnNpbmcgaXNzdWVzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZAotIyBmaXJzdC4KLWlmIChkZWZpbmVkKHVzZS5idF9ub25zdGFuZGFyZF9jb2RlY3MpICYmIHVzZS5idF9ub25zdGFuZGFyZF9jb2RlY3MpIHsKLSAgY29uZmlnKCJleHRlcm5hbF9hYWMiKSB7Ci0gICAgY29uZmlncyA9IFsgIjpwa2dfYWFjIiBdCi0gIH0KLQotICBwa2dfY29uZmlnKCJwa2dfYWFjIikgewotICAgIHBrZ19kZXBzID0gWyAiZmRrLWFhYyIgXQotICB9Ci0KLSAgY29uZmlnKCJleHRlcm5hbF9saWJsZGFjIikgewotICAgIGNvbmZpZ3MgPSBbCi0gICAgICAiOnBrZ19saWJsZGFjQlRfZW5jIiwKLSAgICAgICI6cGtnX2xpYmxkYWNCVF9hYnIiLAotICAgIF0KLSAgfQotCi0gIHBrZ19jb25maWcoInBrZ19saWJsZGFjQlRfZW5jIikgewotICAgIHBrZ19kZXBzID0gWyAibGRhY0JULWVuYyIgXQotICB9Ci0KLSAgcGtnX2NvbmZpZygicGtnX2xpYmxkYWNCVF9hYnIiKSB7Ci0gICAgcGtnX2RlcHMgPSBbICJsZGFjQlQtYWJyIiBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL0NhcmdvLnRvbWwgYi9DYXJnby50b21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRkZDlmLi4wMDAwMDAwCi0tLSBhL0NhcmdvLnRvbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotW3dvcmtzcGFjZV0KLQotbWVtYmVycyA9IFsKLSAgImdkL3J1c3Qvc2hpbSIsCi0gICJnZC9ydXN0L3RvcHNoaW0iLAotICAiZ2QvcnVzdC9saW51eC9tZ210IiwKLSAgImdkL3J1c3QvbGludXgvc2VydmljZSIsCi0gICJnZC9ydXN0L2xpbnV4L2NsaWVudCIsCi1dCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZThjMGEuLjAwMDAwMDAKLS0tIGEvQ2xlYW5TcGVjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIElmIHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCBjbGVhbiBidWlsZCBidXQgd291bGQgbGlrZSB0byB0b3VjaAotIyBhIGZpbGUgb3IgZGVsZXRlIHNvbWUgaW50ZXJtZWRpYXRlIGZpbGVzLCBhZGQgYSBjbGVhbiBzdGVwIHRvIHRoZSBlbmQKLSMgb2YgdGhlIGxpc3QuICBUaGVzZSBzdGVwcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCi0jIHJ1biBiZWZvcmUuCi0jCi0jIEUuZy46Ci0jICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHRvdWNoIC1jIGV4dGVybmFsL3NxbGl0ZS9zcWxpdGUzLmgpCi0jICAgICAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU1RBVElDX0xJQlJBUklFUy9saWJ6X2ludGVybWVkaWF0ZXMpCi0jCi0jIEFsd2F5cyB1c2UgInRvdWNoIC1jIiBhbmQgInJtIC1mIiBvciAicm0gLXJmIiB0byBncmFjZWZ1bGx5IGRlYWwgd2l0aAotIyBmaWxlcyB0aGF0IGFyZSBtaXNzaW5nIG9yIGhhdmUgYmVlbiBtb3ZlZC4KLSMKLSMgVXNlICQoUFJPRFVDVF9PVVQpIHRvIGdldCB0byB0aGUgIm91dC90YXJnZXQvcHJvZHVjdC9ibGFoLyIgZGlyZWN0b3J5LgotIyBVc2UgJChPVVRfRElSKSB0byByZWZlciB0byB0aGUgIm91dCIgZGlyZWN0b3J5LgotIwotIyBJZiB5b3UgbmVlZCB0byByZS1kbyBzb21ldGhpbmcgdGhhdCdzIGFscmVhZHkgbWVudGlvbmVkLCBqdXN0IGNvcHkKLSMgdGhlIGNvbW1hbmQgYW5kIGFkZCBpdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LiAgRS5nLiwgaWYgYSBjaGFuZ2UKLSMgdGhhdCB5b3UgbWFkZSBsYXN0IHdlZWsgcmVxdWlyZWQgdG91Y2hpbmcgYSBmaWxlIGFuZCBhIGNoYW5nZSB5b3UKLSMgbWFkZSB0b2RheSByZXF1aXJlcyB0b3VjaGluZyB0aGUgc2FtZSBmaWxlLCBqdXN0IGNvcHkgdGhlIG9sZAotIyB0b3VjaCBzdGVwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSMKLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBGb3IgZXhhbXBsZToKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0FQUFMvQW5kcm9pZFRlc3RzX2ludGVybWVkaWF0ZXMpCi0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlX2ludGVybWVkaWF0ZXMpCi0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKLSMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCi0KLSMgU3RhcnQgb2YgQ2xlYW4gU3RlcCBsaXN0OgotJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtaW5hbWUgIipibHVlKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQotJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtaW5hbWUgIipiZHJvaWQqIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCi0KLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAotIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWQyMzkuLjAwMDAwMDAKLS0tIGEvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIFRoZSBlbnRyaWVzIGluIHRoaXMgZmlsZSBtYXAgYSBzcGFyc2Ugc2V0IG9mIGxvZyB0YWcgbnVtYmVycyB0byB0YWcgbmFtZXMuCi0jIFRoaXMgaXMgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UsIGluIC9zeXN0ZW0vZXRjLCBhbmQgcGFyc2VkIGJ5IGxvZ2NhdC4KLSMKLSMgVGFnIG51bWJlcnMgYXJlIGRlY2ltYWwgaW50ZWdlcnMsIGZyb20gMCB0byAyXjMxLiAgKExldCdzIGxlYXZlIHRoZQotIyBuZWdhdGl2ZSB2YWx1ZXMgYWxvbmUgZm9yIG5vdy4pCi0jCi0jIFRhZyBuYW1lcyBhcmUgb25lIG9yIG1vcmUgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycyBvciB1bmRlcnNjb3JlcywgaS5lLgotIyAiW0EtWl1bYS16XVswLTldXyIuICBEbyBub3QgaW5jbHVkZSBzcGFjZXMgb3IgcHVuY3R1YXRpb24gKHRoZSBmb3JtZXIKLSMgaW1wYWN0cyBsb2cgcmVhZGFiaWxpdHksIHRoZSBsYXR0ZXIgbWFrZXMgcmVnZXggc2VhcmNoZXMgbW9yZSBhbm5veWluZykuCi0jCi0jIFRhZyBudW1iZXJzIGFuZCBuYW1lcyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuICBCbGFuayBsaW5lcyBhbmQgbGluZXMKLSMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuCi0jCi0jIE9wdGlvbmFsbHksIGFmdGVyIHRoZSB0YWcgbmFtZXMgY2FuIGJlIHB1dCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgdmFsdWUocykKLSMgb2YgdGhlIHRhZy4gRGVzY3JpcHRpb24gYXJlIGluIHRoZSBmb3JtYXQKLSMgICAgKDxuYW1lPnxkYXRhIHR5cGVbfGRhdGEgdW5pdF0pCi0jIE11bHRpcGxlIHZhbHVlcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLSMKLSMgVGhlIGRhdGEgdHlwZSBpcyBhIG51bWJlciBmcm9tIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotIyAxOiBpbnQKLSMgMjogbG9uZwotIyAzOiBzdHJpbmcKLSMgNDogbGlzdAotIwotIyBUaGUgZGF0YSB1bml0IGlzIGEgbnVtYmVyIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgotIyAxOiBOdW1iZXIgb2Ygb2JqZWN0cwotIyAyOiBOdW1iZXIgb2YgYnl0ZXMKLSMgMzogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotIyA0OiBOdW1iZXIgb2YgYWxsb2NhdGlvbnMKLSMgNTogSWQKLSMgNjogUGVyY2VudAotIyBEZWZhdWx0IHZhbHVlIGZvciBkYXRhIG9mIHR5cGUgaW50L2xvbmcgaXMgMiAoYnl0ZXMpLgotIwotIyBUT0RPOiBnZW5lcmF0ZSAiLmphdmEiIGFuZCAiLmgiIGZpbGVzIHdpdGggaW50ZWdlciBjb25zdGFudHMgZnJvbSB0aGlzIGZpbGUuCi0KLTEwMTAwMDAgYnRfaGNpX3RpbWVvdXQgKG9wY29kZXwxKQotMTAxMDAwMSBidF9jb25maWdfc291cmNlIChvcGNvZGV8MSkKLTEwMTAwMDIgYnRfaGNpX3Vua25vd25fdHlwZSAoaGNpX3R5cGV8MSkKZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Nzk3NWMuLjAwMDAwMDAKLS0tIGEvTUVUQURBVEEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXRoaXJkX3BhcnR5IHsKLSAgbGljZW5zZV90eXBlOiBOT1RJQ0UKLX0KZGlmZiAtLWdpdCBhL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODNhMDU1Li4wMDAwMDAwCi0tLSBhL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc2V0IG5vcGFyZW50Ci0KLSMgVGVtcG9yYXJ5IGJsb2NrIGZvciBiLzE5NjAyNjcwOAotYmFsaWdoQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL09XTkVSU19hdXRvbW90aXZlIGIvT1dORVJTX2F1dG9tb3RpdmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjgxNGEuLjAwMDAwMDAKLS0tIGEvT1dORVJTX2F1dG9tb3RpdmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVGVtcG9yYXJ5IGJsb2NrIGZvciBiLzE5NjAyNjcwOAotYmFsaWdoQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL09XTkVSU19jaHJvbWVvcyBiL09XTkVSU19jaHJvbWVvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2ODE0YS4uMDAwMDAwMAotLS0gYS9PV05FUlNfY2hyb21lb3MKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVGVtcG9yYXJ5IGJsb2NrIGZvciBiLzE5NjAyNjcwOAotYmFsaWdoQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL1BSRVVQTE9BRC5jZmcgYi9QUkVVUExPQUQuY2ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk2M2RmLi4wMDAwMDAwCi0tLSBhL1BSRVVQTE9BRC5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1bT3B0aW9uc10KLWlnbm9yZV9tZXJnZWRfY29tbWl0cyA9IHRydWUKLQotW0J1aWx0aW4gSG9va3NdCi1jbGFuZ19mb3JtYXQgPSB0cnVlCi1ydXN0Zm10ID0gdHJ1ZQotCi1bQnVpbHRpbiBIb29rcyBPcHRpb25zXQotcnVzdGZtdCA9IC0tY29uZmlnLXBhdGg9cnVzdGZtdC50b21sCi0KLVtIb29rIFNjcmlwdHNdCi1hb3NwX2ZpcnN0ID0gJHtSRVBPX1JPT1R9L2ZyYW1ld29ya3MvYmFzZS90b29scy9hb3NwL2Fvc3Bfc2hhLnNoICR7UFJFVVBMT0FEX0NPTU1JVH0gIi4qJCIKLXlhcGZfaG9vayA9IC4vdG9vbHMvc2NyaXB0cy95YXBmX2NoZWNrZXIucHkKZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCA0NGNlYjcxLi44ZGYyNTNiIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xLDE4MCArMSBAQAotIyBGbHVvcmlkZSBCbHVldG9vdGggc3RhY2sKLQotIyMgQnVpbGRpbmcgYW5kIHJ1bm5pbmcgb24gQU9TUAotSnVzdCBidWlsZCBBT1NQIC0gRmx1b3JpZGUgaXMgdGhlcmUgYnkgZGVmYXVsdC4KLQotIyMgQnVpbGRpbmcgYW5kIHJ1bm5pbmcgb24gTGludXgKLQotSW5zdHJ1Y3Rpb25zIGZvciBhIERlYmlhbiBiYXNlZCBkaXN0cmlidXRpb246Ci0qIERlYmlhbiBCdWxsc2V5ZSBvciBuZXdlcgotKiBVYnVudHUgMjAuMTAgb3IgbmV3ZXIKLSogQ2xhbmctMTEgb3IgQ2xhbmctMTIKLSogRmxleCAyLjYueAotKiBCaXNvbiAzLngueCAodGVzdGVkIHdpdGggMy4wLngsIDMuMi54IGFuZCAzLjcueCkKLQotWW91J2xsIHdhbnQgdG8gZG93bmxvYWQgc29tZSBwcmUtcmVxdWlzaXRlIHBhY2thZ2VzIGFzIHdlbGwuIElmIHlvdSdyZSBjdXJyZW50bHkKLWNvbmZpZ3VyZWQgZm9yIEFPU1AgZGV2ZWxvcG1lbnQsIHlvdSBzaG91bGQgaGF2ZSBtb3N0IHJlcXVpcmVkIHBhY2thZ2VzLgotT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGFwdC1nZXQgbGlzdCBvciB1c2UgdGhlIGAtLXJ1bi1ib290c3RyYXBgCi1vcHRpb24gb24gYGJ1aWxkLnB5YCAoc2VlIGJlbG93KSB0byBnZXQgYSBsaXN0IG9mIHBhY2thZ2VzIG1pc3Npbmcgb24geW91cgotc3lzdGVtOgotCi1gYGBzaAotc3VkbyBhcHQtZ2V0IGluc3RhbGwgcmVwbyBnaXQtY29yZSBnbnVwZyBmbGV4IGJpc29uIGdwZXJmIGJ1aWxkLWVzc2VudGlhbCBcCi0gIHppcCBjdXJsIHpsaWIxZy1kZXYgZ2NjLW11bHRpbGliIGcrKy1tdWx0aWxpYiBcCi0gIHgxMXByb3RvLWNvcmUtZGV2IGxpYngxMS1kZXYgbGlibmN1cnNlczUgXAotICBsaWJnbDEtbWVzYS1kZXYgbGlieG1sMi11dGlscyB4c2x0cHJvYyB1bnppcCBsaWJsejQtdG9vbCBsaWJzc2wtZGV2IFwKLSAgbGliYysrLWRldiBsaWJldmVudC1kZXYgXAotICBmbGF0YnVmZmVycy1jb21waWxlciBsaWJmbGF0YnVmZmVyczEgb3BlbnNzbCBcCi0gIGxpYmZsYXRidWZmZXJzLWRldiBsaWJ0aW55eG1sMi1kZXYgXAotICBsaWJnbGliMi4wLWRldiBsaWJldmVudC1kZXYgbGlibnNzMy1kZXYgbGliZGJ1cy0xLWRldiBcCi0gIGxpYnByb3RvYnVmLWRldiBuaW5qYS1idWlsZCBnZW5lcmF0ZS1uaW5qYSBwcm90b2J1Zi1jb21waWxlciBcCi0gIGxpYnJlMi05IGRlYm1ha2UgXAotICBsbHZtIGxpYmMrK2FiaS1kZXYKLWBgYAotCi1Zb3Ugd2lsbCBhbHNvIG5lZWQgYSByZWNlbnQtaXNoIHZlcnNpb24gb2YgUnVzdCBhbmQgQ2FyZ28uIFBsZWFzZSBmb2xsb3cgdGhlCi1pbnN0cnVjdGlvbnMgb24gW1J1c3R1cF0oaHR0cHM6Ly9ydXN0dXAucnMvKSB0byBpbnN0YWxsIGEgcmVjZW50IHZlcnNpb24uCi0KLSMjIyBEb3dubG9hZCBzb3VyY2UKLQotYGBgc2gKLW1rZGlyIH4vZmx1b3JpZGUKLWNkIH4vZmx1b3JpZGUKLWdpdCBjbG9uZSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQKLWBgYAotCi0jIyMgVXNpbmcgLS1ydW4tYm9vdHN0cmFwIG9uIGJ1aWxkLnB5Ci0KLWBidWlsZC5weWAgaXMgdGhlIGhlbHBlciBzY3JpcHQgdXNlZCB0byBidWlsZCBGbHVvcmlkZSBmb3IgTGludXggKGkuZS4gRmxvc3MpLgotSXQgYWNjZXB0cyBhIGAtLXJ1bi1ib290c3RyYXBgIG9wdGlvbiB0aGF0IHdpbGwgc2V0IHVwIHlvdXIgYnVpbGQgc3RhZ2luZwotZGlyZWN0b3J5IGFuZCBhbHNvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhbGwgcmVxdWlyZWQgc3lzdGVtIHBhY2thZ2VzIHRvIGJ1aWxkCi0oc2hvdWxkIHdvcmsgb24gRGViaWFuIGFuZCBVYnVudHUpLiBZb3Ugd2lsbCBzdGlsbCBuZWVkIHRvIGJ1aWxkIHNvbWUgdW5wYWNrYWdlZAotZGVwZW5kZW5jaWVzIChsaWtlIGxpYmNocm9tZSwgbW9kcF9iNjQsIGdvb2dsZXRlc3QsIGV0YykuCi0KLVRvIHVzZSBpdDoKLWBgYHNoCi0uL2J1aWxkLnB5IC0tcnVuLWJvb3RzdHJhcAotYGBgCi0KLVRoaXMgd2lsbCBpbnN0YWxsIHlvdXIgYm9vdHN0cmFwcGVkIGJ1aWxkIGVudmlyb25tZW50IHRvIGB+Ly5mbG9zc2AuIElmIHlvdSB3YW50Ci10byBjaGFuZ2UgdGhpcywganVzdCBwYXNzIGluIGAtLWJvb3RzdHJhcC1kaXJgIHRvIHRoZSBzY3JpcHQuCi0KLSMjIyBCdWlsZCBkZXBlbmRlbmNpZXMKLQotVGhlIGZvbGxvd2luZyB0aGlyZC1wYXJ0eSBkZXBlbmRlbmNpZXMgYXJlIG5lY2Vzc2FyeSBidXQgY3VycmVudGx5IHVuYXZhaWxhYmxlCi12aWEgYSBwYWNrYWdlIG1hbmFnZXIuIFlvdSBtYXkgaGF2ZSB0byBidWlsZCB0aGVzZSBmcm9tIHNvdXJjZSBhbmQgaW5zdGFsbCB0aGVtCi10byB5b3VyIGxvY2FsIGVudmlyb25tZW50LgotCi0qIGxpYmNocm9tZQotKiBtb2RwX2I2NAotCi1XZSBwcm92aWRlIGEgc2NyaXB0IHRvIHByb2R1Y2UgZGViaWFuIHBhY2thZ2VzIGZvciB0aG9zZSBjb21wb25lbnRzLiBQbGVhc2UKLXNlZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIGJ1aWxkL2Rwa2cvUkVBRE1FLnR4dCBmb3IgbW9yZSBkZXRhaWxzLgotCi1gYGBzaAotY2QgYnVpbGQvZHBrZwotbWtkaXIgLXAgb3V0ZGlyL3ttb2RwX2I2NCxsaWJjaHJvbWV9Ci0KLSMgQnVpbGQgYW5kIGluc3RhbGwgbW9kcF9iNjQKLXB1c2hkIG1vZHBfYjY0Ci0uL2dlbi1zcmMtcGtnLnNoICQocmVhZGxpbmsgLWYgLi4vb3V0ZGlyL21vZHBfYjY0KQotcG9wZAotc3VkbyBkcGtnIC1pIG91dGRpci9tb2RwX2I2NC8qLmRlYgotCi0jIEJ1aWxkIGFuZCBpbnN0YWxsIGxpYmNocm9tZQotcHVzaGQgbGliY2hyb21lCi0uL2dlbi1zcmMtcGtnLnNoICQocmVhZGxpbmsgLWYgLi4vb3V0ZGlyL2xpYmNocm9tZSkKLXBvcGQKLXN1ZG8gZHBrZyAtaSBvdXRkaXIvbGliY2hyb21lLyouZGViCi1gYGAKLQotVGhlIGdvb2dsZXRlc3QgcGFja2FnZXMgcHJvdmlkZWQgYnkgRGViaWFuL1VidW50dSAobGliZ21vY2stZGV2IGFuZAotbGliZ3Rlc3QtZGV2KSBkbyBub3QgcHJvdmlkZSBwa2ctY29uZmlnIGZpbGVzLCBzbyB5b3UgY2FuIGJ1aWxkIHlvdXIgb3duCi1nb29nbGV0ZXN0IHVzaW5nIHRoZSBzdGVwcyBiZWxvdzoKLQotYGBgc2gKLWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QuZ2l0IC1iIHJlbGVhc2UtMS4xMC4wCi1jZCBnb29nbGV0ZXN0ICAgICAgICAjIE1haW4gZGlyZWN0b3J5IG9mIHRoZSBjbG9uZWQgcmVwb3NpdG9yeS4KLW1rZGlyIGJ1aWxkICAgICAgICAgICMgQ3JlYXRlIGEgZGlyZWN0b3J5IHRvIGhvbGQgdGhlIGJ1aWxkIG91dHB1dC4KLWNkIGJ1aWxkCi1jbWFrZSAuLiAgICAgICAgICAgICAjIEdlbmVyYXRlIG5hdGl2ZSBidWlsZCBzY3JpcHRzIGZvciBHb29nbGVUZXN0Lgotc3VkbyBtYWtlIGluc3RhbGwgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0vdXNyCi0KLSMgT3B0aW9uYWwgc3RlcHMgaWYgcGtnY29uZmlnIGlzbid0IGluc3RhbGxlZCB0byBkZXNpcmVkIGxvY2F0aW9uCi0jIE1vZGlmeSB0aGUgc291cmNlICgvdXNyL2xpYi94ODZfNjQtbGludXgtZ251KSBhbmQgdGFyZ2V0ICgvdXNyL2xpYikgYmFzZWQgb24KLSMgeW91ciBsb2NhbCBpbnN0YWxsYXRpb24uCi1mb3IgZiBpbiAkKGxzIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvcGtnY29uZmlnL3tndGVzdCxnbW9ja30qKTsgZG8gXAotICBsbiAtc2YgJGYgL3Vzci9saWIvcGtnY29uZmlnLyQoYmFzZW5hbWUgJGYpOwotZG9uZQotYGBgCi0KLSMjIyBSdXN0IGRlcGVuZGVuY2llcwotCi0qKk5vdGUqKjogSGFuZGxlZCBieSBgLS1ydW4tYm9vdHN0cmFwYCBvcHRpb24uCi0KLVJ1biB0aGUgZm9sbG93aW5nIHRvIGluc3RhbGwgUnVzdCBkZXBlbmRlbmNpZXM6Ci1gYGAKLWNhcmdvIGluc3RhbGwgY3h4YnJpZGdlLWNtZAotYGBgCi0KLSMjIyBTdGFnZSB5b3VyIGJ1aWxkIGVudmlyb25tZW50Ci0KLSoqTm90ZSoqOiBIYW5kbGVkIGJ5IGAtLXJ1bi1ib290c3RyYXBgIG9wdGlvbi4KLQotRm9yIGhvc3QgYnVpbGQsIHdlIGRlcGVuZCBvbiBhIGZldyBvdGhlciByZXBvc2l0b3JpZXM6Ci0qIFtQbGF0Zm9ybTJdKGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9zL3BsYXRmb3JtMi8pCi0qIFtSdXN0IGNyYXRlc10oaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtb3MvdGhpcmRfcGFydHkvcnVzdF9jcmF0ZXMvKQotKiBbUHJvdG8gbG9nZ2luZ10oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nLykKLQotQ2xvbmUgdGhlc2UgYWxsIHNvbWV3aGVyZSBhbmQgY3JlYXRlIHlvdXIgc3RhZ2luZyBlbnZpcm9ubWVudC4KLWBgYHNoCi1leHBvcnQgU1RBR0lOR19ESVI9cGF0aC90by95b3VyL3N0YWdpbmcvZGlyCi1ta2RpciAke1NUQUdJTkdfRElSfQotbWtkaXIgLXAgJHtTVEFHSU5HX0RJUn0vZXh0ZXJuYWwKLWxuIC1zICQocmVhZGxpbmsgLWYgJHtQTEFURk9STTJfRElSfS9jb21tb24tbWspICR7U1RBR0lOR19ESVJ9L2NvbW1vbi1tawotbG4gLXMgJChyZWFkbGluayAtZiAke1BMQVRGT1JNMl9ESVJ9Ly5nbikgJHtTVEFHSU5HX0RJUn0vLmduCi1sbiAtcyAkKHJlYWRsaW5rIC1mICR7UlVTVF9DUkFURV9ESVJ9KSAke1NUQUdJTkdfRElSfS9leHRlcm5hbC9ydXN0Ci1sbiAtcyAkKHJlYWRsaW5rIC1mICR7UFJPVE9fTE9HX0RJUn0pICR7U1RBR0lOR19ESVJ9L2V4dGVybmFsL3Byb3RvX2xvZ2dpbmcKLWBgYAotCi0jIyMgQnVpbGQKLQotV2UgcHJvdmlkZSBhIGJ1aWxkIHNjcmlwdCB0byBhdXRvbWF0ZSBidWlsZGluZyBhc3N1bWluZyB5b3UndmUgc3RhZ2VkIHlvdXIgYnVpbGQKLWVudmlyb25tZW50IGFscmVhZHkgYXMgYWJvdmUuIEF0IHRoaXMgcG9pbnQsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhbGwgdGhlCi1wcmUtcmVxdWlzaXRlcyBpbnN0YWxsZWQgKGkuZS4gYm9vdHN0cmFwIG9wdGlvbiBhbmQgb3RoZXIgZGVwZW5kZW5jaWVzIGFib3ZlKSBvcgoteW91IHdpbGwgc2VlIGZhaWx1cmVzLiBJbiBhZGRpdGlvbiwgeW91IG1heSBuZWVkIHRvIHNldCBhIGAtLWxpYmRpcj1gIGlmIHlvdXIKLWxpYnJhcmllcyBhcmUgbm90IHN0b3JlZCBpbiBgL3Vzci9saWJgIGJ5IGRlZmF1bHQuCi0KLQotYGBgc2gKLS4vYnVpbGQucHkKLWBgYAotCi1UaGlzIHdpbGwgYnVpbGQgYWxsIHRhcmdldHMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgYXQgYC0tYm9vdHN0cmFwLWRpcmAgKHdoaWNoCi1kZWZhdWx0cyB0byBgfi8uZmxvc3NgKS4gWW91IGNhbiBhbHNvIGJ1aWxkIGVhY2ggc3RhZ2Ugc2VwYXJhdGVseSAoaWYgeW91IHdhbnQKLXRvIGl0ZXJhdGUgb24gc29tZXRoaW5nIHNwZWNpZmljKToKLQotKiBwcmVwYXJlIC0gR2VuZXJhdGUgdGhlIEdOIHJ1bGVzCi0qIHRvb2xzIC0gR2VuZXJhdGUgaG9zdCB0b29scwotKiBydXN0IC0gQnVpbGQgdGhlIHJ1c3QgcG9ydGlvbiBvZiB0aGUgYnVpbGQKLSogbWFpbiAtIEJ1aWxkIGFsbCB0aGUgQy9DKysgY29kZQotKiB0ZXN0IC0gQnVpbGQgYWxsIHRhcmdldHMgYW5kIHJ1biB0aGUgdGVzdHMKLSogY2xlYW4gLSBDbGVhbiB0aGUgb3V0cHV0IGRpcmVjdG9yeQotCi1Zb3UgY2FuIGNob29zZSB0byBydW4gb25seSBhIHNwZWNpZmljIHN0YWdlIGJ5IHBhc3NpbmcgYW4gYXJnIHZpYSBgLS10YXJnZXRgLgotCi1DdXJyZW50bHksIFJ1c3QgYnVpbGRzIGFyZSBhIHNlcGFyYXRlIHN0YWdlIHRoYXQgdXNlcyBDYXJnbyB0byBidWlsZC4gU2VlCi1bZ2QvcnVzdC9SRUFETUUubWRdKGdkL3J1c3QvUkVBRE1FLm1kKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSWYgeW91IGFyZQotaXRlcmF0aW5nIG9uIFJ1c3QgY29kZSBhbmQgd2FudCB0byBhZGQgbmV3IGNyYXRlcywgeW91IG1heSBhbHNvIHdhbnQgdG8gdXNlIHRoZQotYC0tbm8tdmVuZG9yZWQtcnVzdGAgb3B0aW9uICh3aGljaCB3aWxsIGxldCB5b3UgdXNlIGNyYXRlcy5pbyBpbnN0ZWFkIG9mIHVzaW5nCi1hIHByZS1wb3B1bGF0ZWQgdmVuZG9yZWQgY3JhdGVzIHJlcG8pLgotCi0jIyMgUnVuCi0KLUJ5IGRlZmF1bHQgb24gTGludXgsIHdlIHN0YXRpY2FsbHkgbGluayBsaWJibHVldG9vdGggc28geW91IGNhbiBqdXN0IHJ1biB0aGUKLWJpbmFyeSBkaXJlY3RseS4gQnkgZGVmYXVsdCwgaXQgd2lsbCB0cnkgdG8gcnVuIG9uIGhjaTAgYnV0IHlvdSBjYW4gcGFzcyBpdAotLS1oY2k9Tiwgd2hlcmUgTiBjb3JyZXNwb25kcyB0byAvc3lzL2NsYXNzL2JsdWV0b290aC9oY2lOLgotCi1gYGBzaAotJE9VVFBVVF9ESVIvZGVidWcvYnRhZGFwdGVyZCAtLWhjaT0kSENJIElOSVRfZ2RfaGNpPXRydWUKLWBgYAorVGhpcyBjb2RlIGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHBsYXRmb3JtL3BhY2thZ2VzL21vZHVsZXMvQmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9URVNUX01BUFBJTkcgYi9URVNUX01BUFBJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5YTA3MDkuLjAwMDAwMDAKLS0tIGEvVEVTVF9NQVBQSU5HCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotewotICAicG9zdHN1Ym1pdCIgOiBbCi0gICAgewotICAgICAgIm5hbWUiIDogImJsdWV0b290aF90ZXN0X2NvbW1vbiIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJibHVldG9vdGh0YmRfdGVzdCIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF9hdWRpb19hMmRwX2h3IgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X2F2cmNwIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X2J0Y29yZSIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF9idGlmIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X2J0aWZfcHJvZmlsZV9xdWV1ZSIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF9idHBhY2tldHMiCi0gICAgfSwKLSAgICB7Ci0gICAgICAibmFtZSIgOiAibmV0X3Rlc3RfZGV2aWNlIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X2VhdHQiCi0gICAgfSwKLSAgICB7Ci0gICAgICAibmFtZSIgOiAibmV0X3Rlc3RfaGNpIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X3BlcmZvcm1hbmNlIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X3N0YWNrIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X3N0YWNrX2FkX3BhcnNlciIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF9zdGFja19tdWx0aV9hZHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICAibmFtZSIgOiAibmV0X3Rlc3Rfc3RhY2tfcmZjb21tIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X3N0YWNrX3NtcCIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF90eXBlcyIKLSAgICB9Ci0gIF0sCi0gICJwcmVzdWJtaXQiIDogWwotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF9oZl9jbGllbnRfYWRkX3JlY29yZCIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIiA6ICJuZXRfdGVzdF9idGlmX2hmX2NsaWVudF9zZXJ2aWNlIgotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiIDogIm5ldF90ZXN0X3N0YWNrX2J0bSIKLSAgICB9Ci0gIF0KLX0KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwNmRjYS4uMDAwMDAwMAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1hcGV4IHsKLSAgICBuYW1lOiAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCi0gICAgZW5hYmxlZDogZmFsc2UsCi0KLSAgICBtYW5pZmVzdDogImFwZXhfbWFuaWZlc3QuanNvbiIsCi0KLSAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKLSAgICAgICJsaWJibHVldG9vdGhfam5pIiwKLSAgICAgICJsaWJibHVldG9vdGgiCi0gICAgXSwKLSAgICBhcHBzOiBbIkJsdWV0b290aCJdLAotCi0gICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAotCi0gICAga2V5OiAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS5rZXkiLAotICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUuY2VydGlmaWNhdGUiLAotfQotCi1hcGV4X2tleSB7Ci0gICAgbmFtZTogImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUua2V5IiwKLSAgICBwdWJsaWNfa2V5OiAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS5hdmJwdWJrZXkiLAotICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS5wZW0iLAotfQotCi1hbmRyb2lkX2FwcF9jZXJ0aWZpY2F0ZSB7Ci0gICAgbmFtZTogImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUuY2VydGlmaWNhdGUiLAotICAgIGNlcnRpZmljYXRlOiAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCi19CmRpZmYgLS1naXQgYS9hcGV4L2FwZXhfbWFuaWZlc3QuanNvbiBiL2FwZXgvYXBleF9tYW5pZmVzdC5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY0ZDBiLi4wMDAwMDAwCi0tLSBhL2FwZXgvYXBleF9tYW5pZmVzdC5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi17Ci0gICJuYW1lIjogImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAotICAidmVyc2lvbiI6IDIKLX0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS5hdmJwdWJrZXkgYi9hcGV4L2NvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUuYXZicHVia2V5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkyMTFmLi4wMDAwMDAwCi0tLSBhL2FwZXgvY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS5hdmJwdWJrZXkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUucGVtIGIvYXBleC9jb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlLnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiZDJiZS4uMDAwMDAwMAotLS0gYS9hcGV4L2NvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUucGVtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJSktRSUJBQUtDQWdFQTErd3ZjeldxaW9zaUR0VGtiQTNuRU9VejFmalpoZnNXR1Q1YmxET1RaRkVxNG1QNgotaGVUbEV3RWMva1l5OVVUdEczenJ6R3RHUis2SnVlZmZ1STlleGp2c1ZXQmRBWkJjbWI1Y2dKQWtaa3BxT01qbAotc1MwbkhMSHRaVVdhbmlBU0ZKbm9xRlpQRnNxUjVmNW5YQ2NEVVFIMmx0VlY1K2xBcHhuTWdsZGd2bjhuRUFZdgotWXZPVCtONHp3a1l2L2lZcCsvalJ2M1hSc0RlaEpmNjJpTGhYWllrSmRIdHFHU3E1Mlc1T1pGU042MVFMZDFaZAotdCs4ek9RRStuc2hhZ25iRmRKWFhacElUWi9XT0FRVXp1TTlwWnpoMTU1eVBYaHpsRTBkQjUzMnFVa3dDVW1jdgotRUswOUZrUy93RXkyRGM5YWR1QXZ0UklpUzRNb2Jhd1pTUnZxK0kvTVpwNjhpb3hiZERBVzNidUI5VVJCQzBrOAotZXE3ejRUYVJnWVkyUXRRZFJlY3lDUDI2R2VaUFAva3o5Z1lJQXNsR1RZMytCNTh0Uk1ZcDlZd1duUU9sMzdKagotMnZUZzlobUhGUm83Z2FCMGdQaitZT1J0RmhJTHBweC9odTlBU2tsV1Y1WDZ2VnFvRXhNM1NGbmIwNUxFR3dtYwotT3JncDBpS0dGZnFwUkg3OTZZazJndStxbnVwVm9MeUhSS2VxMldLcERseGVrUk5GK2hGMjdCWGxEWk1GUjVldQotSll3SzdmQXEyV25kbFV6MHQyYkZTc21Uci9TMGJycjQ5MzhGMlVVTU9iUXFWci95bndqRTM2OEFEUHJpaHdaWAotZ3NqVy94WEZ3Vy9mdFUxQlN2ZHorUHMrT2tvcWZNM2FjM2hUVmpUMDZqdFhPazlFSlpJcWdLVVdtVGNDQXdFQQotQVFLQ0FnRUFnRitYeG5OOXRXa0xFcTVZTURZRHp2TzJZZHpWMXVaMU9RVHVCYXEwVXN3L0p1SXlMRER1VU9JMAotanFqRjJ6VGprNWd0eVJkdWJZM1FySXJEWkVNNUlicTJ3L3ZLMEFjNFJ0LzZ0eVQ3dnlVM0NoUEhIQk93VVVzbgotelRJWXZ6SnFEWDJENmJHR3pCSWJ0QllROWFUc1A5bGU5a1pZRU0ySTl0QkwycUtBamtHaXc5QXBsRGNsSHExZAotTUgveVFMUUgraHJ3K1ZmZkYxbTdvWTlTanU2cVoxK1dFMzdja2FIcFpQQkVBenFTTmZ0OTViR2ZmcC9rWUZ2eAotRXc0alliV2pwN0QrbzZqdGlMMWhkQkhYc21UK1ViUXJ4VXc3b01TbEhWVWNSYmxjN2hqcXVIdEliQzNUUjg0UQotQXhDWW5KVlBQNllDTnpGVTJuaGNMUGhKQUVKczY4c3RSMkpCNmxGRC9STGZFU21rZ0dpZW9ieFY0VU1IWWxNYwotclRaZ0l3aHBLVERBTURtQm1mWmRSVllhN24zZXVDSFovZE1pTExrTWVlWHFIcGZaNGtEV2ZVbzg5RGZSZGdwMgotWExiME1aK1JyaVpEWlM3UVk3SU4wYVc5TTJVQmZOdEs5WFZ1WG1NaEU3aGFZdEVWeHA1VVpYMklVaWNZdmk2agotcGtvL295Q1FKakVCUW9wWVlVMXRvOGl6R3BQc3hBUkxTbDNtbjZSb1JUQ2FIbVhabml1Nkh6dEJ6dWY2Y3hINAotWmU3OHRIS04vUG5TT2VoR0FpTEd4VkFqbGFoL0Q2cnhybm1EbnZ3YkYwZFVTcVNpU2hvNzhYMkpjcGVDK2pKegotWGJmYXNzRnF2S3hzWnpFejhaS2RjaUd5ZGNSSkh2NWtrMFlmNkREWkJYZUlDSWQra3FFQ2dnRUJBUFJTcEJ1NwotM2hxVDc1TElYckU3T0hkOTNabjYxK2wvd3cwSy9zOFRTdUlWWU9aallNU0VVWGpWSkhzbTJESHhhTWI3LzQ3UAotSVIrTFU5emNSdU5NYTZvMGUzdzlwQUNYbC9WVmJFQ1k1RjhvTlRZYTh0a1pBMUM0bmhXaktKaUNHc0NTekhNQQotRDMrdGN3R2Iyc0ZKZThVWUFreW9ab3poNHJTeHBoVExTMU9ndlEvVDI0b2ZKNWFmUFQ0WlgvdlRjczRQNHNrSwotU2N3Q0c5bUJzQXcwM0RPTlZ2ajdmV1RMUUxFT3JJQndRa1dlbWxUVVUzK2dXWVh6RGkrN0FiN29pQ05WWUNOYwoteU1DdjA1WHBaRlcxL25PR1hnajF6MUVBeWowOUc4QlNnblRINDduLzdwbUh6U1ZSeFRXSzNweDVkUWZET29FZAotd2FlNWJrR01ycnNIU0hzQ2dnRUJBT0krRDBFYncrUm1odWlNR1JFRS92NVZoU0NPREswcWZ5eU41TElwSXA4agotN08xbkx3Zzh1WGxqSFNBNlBJdVpKcHRWdlNnYUtuY3BqbVZMcDhMSFBFcGhGVjFmSDFsZ2xtOWhYVWpaV21ZTAotQU9OVnVtYS9uNkU1eDVCYkQyZExQNEg4RVhzWmRIbVBZYVNPQjhuRDRrMUZlTWdCTlN6Q2pXNjJHbVQ1V1ViSAotaWk3MlRUcnpiMHl0R29YNnFFSWxGalVMM2l2Tm15d3lWQTR0SFNISm15dUpOcEhyTEIrRGFJVVNuQ0s2VkpXRwotYTZhSmxHRFhjQ0ZHSlgrWUF4TC93QVhmeVN2NS9mUmQrUlVRZ05YYWdPelE5QVpGZ0VSZWJ5Yzc3czIrektPcQotbzdlbXZRMnNOaEd4dzZuV0VDMEtGVVNjN1VrSi9rS3JMd3ZIRGMrZ20zVUNnZ0VCQUlDcU9MUkdSbHYyeGphbAotZ0lDVE1GUjFHMHRvdDJYSEc1LzF4MlNqdzA2MmRYWStwWW80S0hPYXc0QjdYMlZGdmFqMHNvdXhkcjhXNzQ0agotRHMzS3cvUTVlVUpmYjh2RUNZbHdkL2E0emFOekdEcXJESExaNGs0VE8yVW5yRXhNVCt4VUlvajVZakFaMXJQbAotTU5tVGFqUE1SZ0c2dVc2OTBsYllLeDlPUkJnQlVTOVJvWTdtZzBHbUVHbHdrWVNid1J6VmJ0ZnlyQlJjay9BQwotaFFTWW5kSWtQOFlWSXQ3K3pzMnZiWmFpQjdTRUpzQS9wTTFVVTNEZ0kvdHMzeWw3YVo0NTZzd1VvOEFkbUM2ZAotWDNKbnlsMXFTSUV0ZWdVdGhsT2pwOGFyYlBvMC9pOUlvWTJHMzdra2k5ZDdqMm9WNkZTek1rOG1yWUkzZStIWAotUlhsSEI1c0NnZ0VBSnRSZjZkektFamxHamtMOVNsNkJKVVdvUTU0ZHJ0ck1XT2xCaHhKb1RzZnJzaE16ajBaYwotenVpajV4UVhzQjNvOG1BVXh2MDJySjBGUTMxb25aVjBVNCsyQ3dCNGNPNlM0eXJpeDg0R0pkMWRtYWJ0QnhWOAotWUQ5NmNOd3dHSnBobS8yWFFubHI5REVYb1JaL1g3R3U5WFFtOXF5K1k2QkFoZS9iTjlsVDZVSDJCWGxnWisyLwotL0hqNVJHVncyMmxpRmxpakdRR0EwR1VTNkJ2MkZBWjJDMUxSZXRuU0NOYVU2Y0gzNmozd3Bua2JvTW1jSGNMYwotQzludU5hZnhYeUZsNDV3MCtzYzlQdU9pREd0NHNUdC9SU1hYdS92UnQrbzlTWTZQdmVBeFh5VzZVNXJhZDY1RwotMldLWklsMExDYS9oVnBWWVpHRENzczZPbElibForMDR3UUtDQVFBUG5RWktIWVJBYk13ZjNoSVNpRDNIVkxRTwotWlJlZ0FGMUp4ZncxOWpTQXpBdUM0S1RDaGlsUzJ0YTVOK3BwaWdiZHJYbU1oUU5sb1gzZE5XZjVRZm44M1drNgotLzFvVnNaU0dMMEdBT1hZZk1GU0I2ZCtvM1YwTlRDZjNTRGZWL1lrMzhmZlJwMEoxR0lWNUJPdmVTNnZRSUNQVgoteUdyN0FqWnpYZHFrU2tRTnNuMld5NFo5a1dReURCbUNrcVlCYlRuNmd3KzFRbGcwMjhxOVlDbFFGUnJBTkR4NAotVnVPUkNLUDJCQ29ZZXhJQ1UrYXdYYW8vSnRnTzFmU0JuRDUydktqR1lhYVBucUtiWXREd0JCbzlNYVExVlNGQwotSmo5djJqVW9jMGoxdUVPMTNJQkF2emViblZ1U3A0UzBFVzhuTStvYWwrZW5yelRMd2dXbkd3NmhUbXdUCi0tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS5wazgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjQ4OWYuLjAwMDAwMDAKLS0tIGEvYXBleC9jb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlLnBrOAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS54NTA5LnBlbSBiL2FwZXgvY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZS54NTA5LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjMTY5Yy4uMDAwMDAwMAotLS0gYS9hcGV4L2NvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUueDUwOS5wZW0KKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUdLVENDQkJHZ0F3SUJBZ0lVWk5WR0ZDY3hjTlhJYlNjczc4SGZVRHhtTGJFd0RRWUpLb1pJaHZjTkFRRUwKLUJRQXdnYUl4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUll3RkFZRFZRUUgKLURBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBd0RnWURWUVFMREFkQmJtUnkKLWIybGtNUjR3SEFZRFZRUUREQlZqYjIwdVlXNWtjbTlwWkM1aWJIVmxkRzl2ZEdneElqQWdCZ2txaGtpRzl3MEIKLUNRRVdFMkZ1WkhKdmFXUkFZVzVrY205cFpDNWpiMjB3SUJjTk1Ua3hNVEV3TURJeU16STVXaGdQTkRjMU56RXcKLU1EWXdNakl6TWpsYU1JR2lNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0F3S1EyRnNhV1p2Y201cFlURVcKLU1CUUdBMVVFQnd3TlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0R0ExVUVDZ3dIUVc1a2NtOXBaREVRTUE0R0ExVUUKLUN3d0hRVzVrY205cFpERWVNQndHQTFVRUF3d1ZZMjl0TG1GdVpISnZhV1F1WW14MVpYUnZiM1JvTVNJd0lBWUoKLUtvWklodmNOQVFrQkZoTmhibVJ5YjJsa1FHRnVaSEp2YVdRdVkyOXRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKLUFBT0NBZzhBTUlJQ0NnS0NBZ0VBczR6RHlsaUVOSFQrK1IvRlJUelNvQ3Y2MTAzYUFIbWUvcFNyWDBxV3g4QTcKLTVJQkV0ZXZDYVlSL0RxQ0gvUWxBWk9uZGYzTVB6ZjFlZUdZU0orWWNCR1hCTlEybmlrVXJwWmQ2YTBjQmFPWHAKLTRTUVYzcXpUYXNQQ0J6Y09FU0VhbmlqY1NZZEIzMVM1bkF0RktRMVF1M1Z0Z213eU93M0MyOUEwRGVTTjF1RFEKLW9aWEwrMTFjckorWmlWeXZSQTVPZE5vS0xwcGNYNDVmTUZFZjBWZWwzQ3ArWGJkRUJ1M3AxRGtFTjBQeEttUE8KLTQzaFMyLzJocGFFbXkzTU0ySjh2MVN6UmR5VGoyRnRjdi9IMkpVMUQ5UlVQS09POGlKa1RXTGdDZXdFOFZWZEMKLWhaUjQvaDZ2WUtCVDR2L2ZFNHpUSFMwc0xsSmhyQ0F6MDhCYm54TklVQUIvV3pjd0hNeStFTzBBYXFaNFBMd2gKLVdmQjJVQlg0L21ydS8yQnNvTDQ3L2FlWHNmUWk1K004TnJmblVSK0tEVUJ1OVNDcVk5blNwdkRWV0xESktNVmgKLU9RbTJRQllDaVBIb0RSQkNsa2tReHRCa1FKM0NlSDVQZXVmb2FtcmQ5b0JjcEppOFpKQ0R0TVdvaTBJZTRkSlIKLWM5YjRBLzI1R2t4T3doU3lOZUlHbWRucTNvc1NLNmYxZ3JEZWZpNkdteHZUY2t5dkJNUTBPUzRCamZhTXdxcHcKLUdwSGU2TkZabkRCM3FmUVBxd0dPV2N3Q2hURmFvYWprTy9FVGd2OW02UlFlbE9CTlFiQjFsSzNQbWNJYjFJQzMKLTl4cTVCcDNiY2IwRGRUQS9jS3VuRTRrakRORSt6RlNhVERLb2V4QjZUdEtqVFdNTUI2aFFneDZLd1pOV2NjOEMKLUF3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZBQzFNZ0lDaXE2d1NRVWlvMlB6a1FmTXpBd21NQjhHQTFVZEl3UVkKLU1CYUFGQUMxTWdJQ2lxNndTUVVpbzJQemtRZk16QXdtTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWkkKLWh2Y05BUUVMQlFBRGdnSUJBSm1lcW5YdWh2eEttd0Vwc0FHTjJZNW1vTU51Y2gwOUtZc3NucVU3TmI5NFZ4eVQKLTFxeXJVSGRpSHhPZmZOME5LcnhsZ2VvTnF0YkRJUmYwTGdtZ094UktHbTBnZjMrWEVtdzBLdEJEMjlOeXp4RHkKLVJmQXZiK203YmlUWWhxNitWMHdrQ29UN0hacWV1aVNDK2wrR3YwM1FhM0NIYzYxM081ZkpDcERKd0FYSWZSdXgKLS9mdkE1ay9QY2kzdXByYThrQXU3eG1aYWQ2RU1pWStITzRlSzRwaDhLcjNUOHRGamtLTVh6bVlnajcwekE0TUQKLWJOa1pkVXNHU3NmVnhycWZCSkMwYUNoMFZ3RHNrR1h3SWJzMHExVWMxUkNwTExqZFkwZ01qa1dWa2dSS05xK3UKLVcvSGlDYXFMYmpCazJRVk9XdWd3SW82cXFWaE1PcUNla3BRamxJYyt6SjhXWkR1bnpGbUYyT2ZtVktWNElrV1UKLW9Ib1U4UTJqbzAyMTFhTy9qTzhMN0x1enNKYjBvZUd0T2tNRGFUbTdJUkUvY1FPZE42YkN4S1Y2ZGE2RWRaWHcKLVlUcFRjZnFnK0Q3cTEvb1lLNER6UXNSZmRmSHJBaDlQSC9TOEJVOGJ1U2NTVDVVTGRUNk4rRzRsY0U1akFjM0MKLWMyL0NUTTNsNkNXQkFnWUsrekRxaDJJempuczNicjI1T1Q1V0V0QWNkckVVM2lnTHNuM1RVMzBnc0sxK3BlZmkKLVBhMGtpMDBwR1lqOEV0NmJJeUJmSFo5bnV1MFNWQWdJS05ndFBXSXU3UW54cXBCSFRzTkgwR2dMSS9mQ1JOcHMKLVh4ZUZTdHNmK05qM05TR1hBVlVCZ1FaR0FXZ2VNTmppRzhzaUpKS2EzQTZvdVJDa2dpUnJxY3lwWUNDaQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9rZXkucGVtIGIvYXBleC9rZXkucGVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdhMDMyLi4wMDAwMDAwCi0tLSBhL2FwZXgva2V5LnBlbQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQotTUlJSlF3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NDUzB3Z2drcEFnRUFBb0lDQVFDempNUEtXSVEwZFA3NQotSDhWRlBOS2dLL3JYVGRvQWVaNytsS3RmU3BiSHdEdmtnRVMxNjhKcGhIOE9vSWY5Q1VCazZkMS9jdy9OL1Y1NAotWmhJbjVod0VaY0UxRGFlS1JTdWxsM3ByUndGbzVlbmhKQlhlck5OcXc4SUhOdzRSSVJxZUtOeEpoMEhmVkxtYwotQzBVcERWQzdkVzJDYkRJN0RjTGIwRFFONUkzVzROQ2hsY3Y3WFZ5c241bUpYSzlFRGs1MDJnb3VtbHhmamw4dwotVVIvUlY2WGNLbjVkdDBRRzdlblVPUVEzUS9FcVk4N2plRkxiL2FHbG9TYkxjd3pZbnkvVkxORjNKT1BZVzF5LwotOGZZbFRVUDFGUThvNDd5SW1STll1QUo3QVR4VlYwS0ZsSGorSHE5Z29GUGkvOThUak5NZExTd3VVbUdzSURQVAotd0Z1ZkUwaFFBSDliTnpBY3pMNFE3UUJxcG5nOHZDRlo4SFpRRmZqK2F1Ny9ZR3lndmp2OXA1ZXg5Q0xuNHp3MgotdCtkUkg0b05RRzcxSUtwajJkS204TlZZc01rb3hXRTVDYlpBRmdLSThlZ05FRUtXU1JERzBHUkFuY0o0Zms5NgotNStocWF0MzJnRnlrbUx4a2tJTzB4YWlMUWg3aDBsRnoxdmdEL2JrYVRFN0NGTEkxNGdhWjJlcmVpeElycC9XQwotc041K0xvYWJHOU55VEs4RXhEUTVMZ0dOOW96Q3FuQWFrZDdvMFZtY01IZXA5QStyQVk1WnpBS0ZNVnFocU9RNwotOFJPQy8yYnBGQjZVNEUxQnNIV1VyYytad2h2VWdMZjNHcmtHbmR0eHZRTjFNRDl3cTZjVGlTTU0wVDdNVkpwTQotTXFoN0VIcE8wcU5OWXd3SHFGQ0RIb3JCazFaeHp3SURBUUFCQW9JQ0FHWGZPRGRXZ2F4QnRXa2ozWW1yT05ZbwotSGVxTEFXWERtN0pXSitXcExHT3BibEgzZFFUQy8wdGZJYmZxM1QxMFFsVC9XKzAwRzRPRWZsVlJsSHVPMDlhcQotNVRSMHl0cG81SnJQbDJYR284WWdyTkpRNXhld2QwUGNUZnBLQW5FMWx5U2xpbGN0cHZKUDMvL3BaUlFsdWVpaQotZDcvSUk3ZmQxdkZnOENmeHhZaGxoZm9vUTlRYTVMb00wOUJjQmhWWENLekVDWUxua2dHbGhkeWtLcWxjVVg3WgotblZrTzRrb01NdDkyZWkzaEhyUXViUFFqRU9CQXg3WngrTkQyTmhPeVBqRjFmR05kU3VrMjdTajYzKzNLS1FTbAotTGpURkFmTis1cnN2ckRpZU90MHc1VTFsTUVEK3FBTHE5SzJXLzdyWDYvQmg4TzlYVHBPYXNjMHpGc2pxNTl1SQotYit1QnNaSVBhR0RwVGprWUJLSzN4cmhOcUl1cTJ5bE4rMEQxNHVBSzQvejRzWHN2UDFYeW1qV2tWTlI5aWk0NQotZG9pRHhBTnZaenFZb1hjUjVhRWtKY08xMjZSYkRJdy9TSWdsV1RhZzZtUnZOWUNuTFZjVHpWZjd1WlhGeUxYYwotWWswTnBUR0FwaFZsNHVWalhGZ3I4WlhmUUlvTTUxekZ2VlZoMytkaG9zTkdtczFsZ2N2R0h6SlJLc09DemFBOAotRWRXbTNtR1pyTThrdnZpcUZvUzRQbmRJSXo2aEI3MU1HaElTRVdiVFVzc0YvQUpTRFdLZHZKRVdwVFNMVWp5WQotT29XYVRBQmpaRWp5Q1hwYUl2c3NRaWx5T2IrVVZQNmF5TUF5ZkRqejVsREtCMjIxNlBob1E5c09iOWZJRHJkSwotMjRYd3FkTVVxRFpKVjZHWThuUUJBb0lCQVFEblMxRFRVWWVRd08xQzgzMWQxbThQOFBoRURwd2lvQlB2NTN5Lwotb3dibWJ3QURUTXhXdlJmR25tWE01QllBZWlERmZFQ3AySFBuQjVTR3BrWE9KT1E4SDhXU3Rna2hSZ2xOSEJiSwoteURhb0xZVFpxa2s0OWVuWUVPNk1OdUZnVHFpT1d3Z08rTVZYUEttanJlZW5oc29BUUFLRkZCUHF5TlU2djlhMgotV0VIdUlNYzZHdisyR2tUN3drVndnbVRaQTFMNThZMkVXWDB3ZERBWUxTKzArNnUreEo1bFBRSTAxNFk3WU5zYQotcXZ1N1BHNWdROGZkVTFmUG1NUms5T094aUhpbExjMEdBUVB0bkY0ZlFZY05kY1o2NkZBUk1qSGpabkZxSENQSQotaXJkZG1GUmVNa0tqK0hIdWZPNkVWZjhLa1dneUlyOUN6Uzl3aDQzUFdXL0NJTHdaQW9JQkFRREd1b000REVWNQotdHIrRm1GM1JyaTFQMEcraUMzQm05b1RhMVMxQUM0cjh5UGlZOVE4L2xWMDA5YW0yZ2J6NlI1VEZtYStvRlUxeQotUjNwbTZBYWlqZUttdXNtaTJOR3RkYnFhOWNVTDk4SHRWQVQ3WlFtenl6OVVlcHlaUW1EeS8wQjRxMmZHT1VYMQotUW54S0lPVTJqOENGVlVrYmlqVW9vUnlwWkc3bUlzL1BzblR0bURiMEpkT3I1NEUyNkJMYUJYYkZjcnhMdUp4WAotU1RwUVZiVTNVL1kyamFMblJjUEY0ZTZiQ3JRYnJzSDM3d01MTTNKVGVzOFBScjBJY1BEczRzcDMwR2o1NXJjTAotdlNZWnFmZVZLYWRBMzEySW41cDRPUEpWNy9IU3pSbDRKRTRKU1dsQ1JMWmVwbUF5MzZrRnBRekk2TjNMVVZNcAotUnVadGYrVVhJVm9uQW9JQkFRQ1ZMRUlveUlDQ242dG1idHdBVlhpejgxcHJxbkNROUdWbmFRbFFIN2tualplWQotaVVPUS9jd0QwYzBlWkV5OGFnZ1ExcDV0N0toejdMT2lWRUxaUFhubVBTZVVBOHZIcGdBQnQ0Z0xxUzEzTWtSbwotamlkRGtYY01YMzg2OTNwTVB1Ny9RVDdsU1JVZHVvWStocjdOa1dWZTIrbkVJcnJseGptZjluSm9rR3VWUlphNAotcHdrZFRid0lFN2Z0Wkd2ZWV3SmRLYWw0SHE5YlBOUjRBMHl0a1ZPbmFmQXVveloxRmp3QXQrc1lQQWEzTDdhUQotWjZiVDNCamFUMUQ3TytaT2JoSkJsbFNROXI2dDFSZnZXTGZkdW9RVWFSaWF2cURtWlAvb3k5VllWZjhGWW1XbgotaXdybjdpaXRBKzVoYzRWV0w0bmdMQURtK0tjTUVLRXBoaWxLTHdxaEFvSUJBQUM3Rk5weTZScCtlb3ZTT0o0WgoteHQ3aFJGZlROUEdiL0hjVmk1b05zTkFuS1FyZTg5Um5CelczcFkwZlF3T2ttYjUwUnpvV0FmZm1uV09kZk5EQwotTnRBb0phK3NubkRGMnc3UTBvMnR0by9aM0Q3VWEwbTIrSitsNThlRWYvakV5WWJvRW5TZkowdTBsK0pwNW8zaAotejNKdUV0dkFFVnY1NDdJWHhYU2hNaVJ3WW8reEhKcWZQUDBIMStqTXg2ejNraTA5czhXUGd6dXE4RVQxVzdvOQotVzgxdGplak56OTk5YWpRMXdOM05NYmRvc0prczhrR3VWTzZZY3YrQjh0RGNNS1JxSnNpc2VZWFloemhXOEtzaQotd1JPeS9wUVBDakZnL0RzbXE3djd0eGxEQU9wMTA2WkR2R3Z5cnEzaE5xem5vM2xscWRNaWxHeTFid2wrQytpZQotM2NjQ2dnRUJBSVNTVldEM293UmY1bjh1bmxWVG1nNjRtaUx2M3JNM3M2N0YrSG42MnFleVltVzNBaE1TUHl0MgotUklrRXIyWXJPS1E1RDhJamszR2FkNGFlNVVkeWVDT1BnNDk1cWs3YkQ1dGhjWUc0TW8vTVZ2Q1FYeGdka2VhSwotVEZIcHp6VXR0Z0tVZTJFQmZDYmt4UGp6V3FmM2JhMG12Y25XNjIxdlVWQStWRHFJVWxCVTlhb3NSTWdET0ZVaQotTis2NjdLajVQMzgyb1pISHhGblVabkNhM1BjenlHRzNXTFlCTFJGQUhsM244a0o5bU9VQUFsVkM4c1JnY1ltWgotejJaWWZjMjJzVVJFYWgra2R4dkR2UjJheW9wbDg2WG95cmRUbkswWEtFbytsVThHaG92YzVLYm9wZjE1S2RXegotL2NBaysxWmtPQXpuNVJJWk5hRkd3MkZLSGRzMU9EUT0KLS0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2F1ZGlvX2EyZHBfaHcvQW5kcm9pZC5icCBiL2F1ZGlvX2EyZHBfaHcvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlMWVlOS4uMDAwMDAwMAotLS0gYS9hdWRpb19hMmRwX2h3L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImF1ZGlvX2EyZHBfaHdfZGVmYXVsdHMiLAotICAgIGRlZmF1bHRzOiBbImxpYmNocm9tZV9zdXBwb3J0X2RlZmF1bHRzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2F1ZGlvX2EyZHBfaHcvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3R5cGVzIiwKLSAgICBdLAotfQotCi0vLyBBdWRpbyBBMkRQIHNoYXJlZCBsaWJyYXJ5IGZvciB0YXJnZXQKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJhdWRpby5hMmRwLmRlZmF1bHQiLAotICAgIGRlZmF1bHRzOiBbImF1ZGlvX2EyZHBfaHdfZGVmYXVsdHMiXSwKLSAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2F1ZGlvX2EyZHBfaHcuY2MiLAotICAgICAgICAic3JjL2F1ZGlvX2EyZHBfaHdfdXRpbHMuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsibGlib3NpIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYXVkaW8tYTJkcC1ody11dGlscyIsCi0gICAgZGVmYXVsdHM6IFsiYXVkaW9fYTJkcF9od19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hdWRpb19hMmRwX2h3X3V0aWxzLmNjIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQotCi0vLyBBdWRpbyBBMkRQIGxpYnJhcnkgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0IGFuZCBob3N0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYXVkaW9fYTJkcF9odyIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiYXVkaW9fYTJkcF9od19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3QvYXVkaW9fYTJkcF9od190ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImF1ZGlvLmEyZHAuZGVmYXVsdCIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9hdWRpb19hMmRwX2h3L2luY2x1ZGUvYXVkaW9fYTJkcF9ody5oIGIvYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzODBhNi4uMDAwMDAwMAotLS0gYS9hdWRpb19hMmRwX2h3L2luY2x1ZGUvYXVkaW9fYTJkcF9ody5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBhdWRpb19hMmRwX2h3LmgKLSAqCi0gKiAgRGVzY3JpcHRpb246Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEFVRElPX0EyRFBfSFdfSAotI2RlZmluZSBBVURJT19BMkRQX0hXX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYXYuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQTJEUF9BVURJT19IQVJEV0FSRV9JTlRFUkZBQ0UgImF1ZGlvLmEyZHAiCi0jZGVmaW5lIEEyRFBfQ1RSTF9QQVRIICIvZGF0YS9taXNjL2JsdWVkcm9pZC8uYTJkcF9jdHJsIgotI2RlZmluZSBBMkRQX0RBVEFfUEFUSCAiL2RhdGEvbWlzYy9ibHVlZHJvaWQvLmEyZHBfZGF0YSIKLQotLy8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU1ogY29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGF1ZGlvIHNvY2tldCBidWZmZXIuCi0vLyBJZiBvbmUgYXNzdW1lcyB0aGUgd3JpdGUgYnVmZmVyIGlzIGFsd2F5cyBmdWxsIGR1cmluZyBub3JtYWwgQlQgcGxheWJhY2ssCi0vLyB0aGVuIGluY3JlYXNpbmcgdGhpcyB2YWx1ZSBpbmNyZWFzZXMgb3VyIHBsYXliYWNrIGxhdGVuY3kuCi0vLwotLy8gRklYTUU6IFRoZSBCVCBIQUwgc2hvdWxkIGNvbnN1bWUgZGF0YSBhdCBhIGNvbnN0YW50IHJhdGUuCi0vLyBBdWRpb0ZsaW5nZXIgYXNzdW1lcyB0aGF0IHRoZSBIQUwgZHJhd3MgZGF0YSBhdCBhIGNvbnN0YW50IHJhdGUsIHdoaWNoIGlzCi0vLyB0cnVlIGZvciBtb3N0IGF1ZGlvIGRldmljZXM7IGhvd2V2ZXIsIHRoZSBCVCBlbmdpbmUgcmVhZHMgZGF0YSBhdCBhIHZhcmlhYmxlCi0vLyByYXRlIChvdmVyIHRoZSBzaG9ydCB0ZXJtKSwgd2hpY2ggY29uZnVzZXMgYm90aCBBdWRpb0ZsaW5nZXIgYXMgd2VsbCBhcwotLy8gYXBwbGljYXRpb25zIHdoaWNoIGRlbGl2ZXIgZGF0YSBhdCBhIChnZW5lcmFsbHkpIGZpeGVkIHJhdGUuCi0vLwotLy8gMjAgKiA1MTIgaXMgbm90IHN1ZmZpY2llbnQgdG8gc21vb3RoIHRoZSB2YXJpYWJpbGl0eSBmb3Igc29tZSBCVCBkZXZpY2VzLAotLy8gcmVzdWx0aW5nIGluIG1peGVyIHNsZWVwIGFuZCB0aHJvdHRsaW5nLiBXZSBpbmNyZWFzZSB0aGlzIHRvIDI4ICogNTEyIHRvIGhlbHAKLS8vIHJlZHVjZSB0aGUgZWZmZWN0IG9mIHZhcmlhYmxlIGRhdGEgY29uc3VtcHRpb24uCi0jZGVmaW5lIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NaICgyOCAqIDUxMikKLSNkZWZpbmUgQVVESU9fU1RSRUFNX0NPTlRST0xfT1VUUFVUX0JVRkZFUl9TWiAyNTYKLQotLy8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyBjb250cm9scyBob3cgdGhlIHNvY2tldCBidWZmZXIgaXMgZGl2aWRlZAotLy8gZm9yIEF1ZGlvRmxpbmdlciBkYXRhIGRlbGl2ZXJ5LiBUaGUgQXVkaW9GbGluZ2VyIG1peGVyIGRlbGl2ZXJzIGRhdGEgaW4KLS8vIGNodW5rcyBvZiBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWiAvIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMuCi0vLyBJZiB0aGUgbnVtYmVyIG9mIHBlcmlvZHMgaXMgMiwgdGhlIHNvY2tldCBidWZmZXIgcmVwcmVzZW50cyAiZG91YmxlCi0vLyBidWZmZXJpbmciIG9mIHRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIgYnVmZmVyLgotLy8KLS8vIEluIGdlbmVyYWwsIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMgKiAxNiAqIDQgc2hvdWxkIGJlIGEgZGl2aXNvcgotLy8gb2YgQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU1ouCi0vLwotLy8gVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBjaG9zZW4gc3VjaCB0aGF0Ci0vLwotLy8gQVVESU9fU1RSRUFNX0JVRkZFUl9TSVpFICogMTAwMCAvIChBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTCi0vLyAgICAgICAgICogQVVESU9fU1RSRUFNX0RFRkFVTFRfUkFURSAqIDQpID4gMjAgKG1zKQotLy8KLS8vIHRvIGF2b2lkIGludHJvZHVjaW5nIHRoZSBGYXN0TWl4ZXIgaW4gQXVkaW9GbGluZ2VyLiBVc2luZyB0aGUgRmFzdE1peGVyCi0vLyByZXN1bHRzIGluIHVubmVjZXNzYXJ5IGxhdGVuY3kgYW5kIENQVSBvdmVyaGVhZCBmb3IgQmx1ZXRvb3RoLgotI2RlZmluZSBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTIDIKLQotI2RlZmluZSBBVURJT19TS1RfRElTQ09OTkVDVEVEICgtMSkKLQotdHlwZWRlZiBlbnVtIHsKLSAgQTJEUF9DVFJMX0NNRF9OT05FLAotICBBMkRQX0NUUkxfQ01EX0NIRUNLX1JFQURZLAotICBBMkRQX0NUUkxfQ01EX1NUQVJULAotICBBMkRQX0NUUkxfQ01EX1NUT1AsCi0gIEEyRFBfQ1RSTF9DTURfU1VTUEVORCwKLSAgQTJEUF9DVFJMX0dFVF9JTlBVVF9BVURJT19DT05GSUcsCi0gIEEyRFBfQ1RSTF9HRVRfT1VUUFVUX0FVRElPX0NPTkZJRywKLSAgQTJEUF9DVFJMX1NFVF9PVVRQVVRfQVVESU9fQ09ORklHLAotICBBMkRQX0NUUkxfR0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwKLX0gdEEyRFBfQ1RSTF9DTUQ7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUywKLSAgQTJEUF9DVFJMX0FDS19GQUlMVVJFLAotICBBMkRQX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFLCAvKiBGYWlsdXJlIHdoZW4gaW4gQ2FsbCovCi0gIEEyRFBfQ1RSTF9BQ0tfVU5TVVBQT1JURUQsCi0gIEEyRFBfQ1RSTF9BQ0tfUEVORElORywKLSAgQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTLAotfSB0QTJEUF9DVFJMX0FDSzsKLQotdHlwZWRlZiB1aW50MzJfdCB0QTJEUF9TQU1QTEVfUkFURTsKLXR5cGVkZWYgdWludDhfdCB0QTJEUF9DSEFOTkVMX0NPVU5UOwotdHlwZWRlZiB1aW50OF90IHRBMkRQX0JJVFNfUEVSX1NBTVBMRTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBkZWZpbml0aW9ucyBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgZGVmaW5pdGlvbnMgYW5kIHJldHVybiB2YWx1ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBDb21wdXRlcyB0aGUgQXVkaW8gQTJEUCBIQUwgb3V0cHV0IGJ1ZmZlciBzaXplLgotLy8gfGNvZGVjX3NhbXBsZV9yYXRlfCBpcyB0aGUgc2FtcGxlIHJhdGUgb2YgdGhlIG91dHB1dCBzdHJlYW0uCi0vLyB8Y29kZWNfYml0c19wZXJfc2FtcGxlfCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBvZiB0aGUgb3V0cHV0Ci0vLyBzdHJlYW0uCi0vLyB8Y29kZWNfY2hhbm5lbF9tb2RlfCBpcyB0aGUgY2hhbm5lbCBtb2RlIG9mIHRoZSBvdXRwdXQgc3RyZWFtLgotLy8KLS8vIFRoZSBidWZmZXIgc2l6ZSBpcyBjb21wdXRlZCBieSB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6Ci0vLwotLy8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU0laRSA9Ci0vLyAgICAoVElNRV9QRVJJT0RfTVMgKiBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTICoKLS8vICAgICBTQU1QTEVfUkFURV9IWiAqIE5VTUJFUl9PRl9DSEFOTkVMUyAqIChCSVRTX1BFUl9TQU1QTEUgLyA4KSkgLyAxMDAwCi0vLwotLy8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyBjb250cm9scyBob3cgdGhlIHNvY2tldCBidWZmZXIgaXMKLS8vIGRpdmlkZWQgZm9yIEF1ZGlvRmxpbmdlciBkYXRhIGRlbGl2ZXJ5LiBUaGUgQXVkaW9GbGluZ2VyIG1peGVyIGRlbGl2ZXJzCi0vLyBkYXRhIGluIGNodW5rcyBvZgotLy8gKEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NJWkUgLyBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTKSAuCi0vLyBJZiB0aGUgbnVtYmVyIG9mIHBlcmlvZHMgaXMgMiwgdGhlIHNvY2tldCBidWZmZXIgcmVwcmVzZW50cyAiZG91YmxlCi0vLyBidWZmZXJpbmciIG9mIHRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIgYnVmZmVyLgotLy8KLS8vIEZ1cnRoZXJtb3JlLCB0aGUgQXVkaW9GbGluZ2VyIGV4cGVjdHMgdGhlIGJ1ZmZlciBzaXplIHRvIGJlIGEgbXVsdGlwbGUKLS8vIG9mIDE2IGZyYW1lcy4KLS8vCi0vLyBOT1RFOiBDdXJyZW50bHksIHRoZSBjb21wdXRhdGlvbiB1c2VzIHRoZSBjb25zZXJ2YXRpdmUgMjBtcyB0aW1lIHBlcmlvZC4KLS8vCi0vLyBSZXR1cm5zIHRoZSBjb21wdXRlZCBidWZmZXIgc2l6ZS4gSWYgYW55IG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzCi0vLyBpbnZhbGlkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkZWZhdWx0IHxBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWnwuCi1zaXplX3QgYXVkaW9fYTJkcF9od19zdHJlYW1fY29tcHV0ZV9idWZmZXJfc2l6ZSgKLSAgICBidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdCBjb2RlY19zYW1wbGVfcmF0ZSwKLSAgICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgY29kZWNfYml0c19wZXJfc2FtcGxlLAotICAgIGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCBjb2RlY19jaGFubmVsX21vZGUpOwotCi0vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGRlbGF5IHJlcG9ydGluZyBwcm9wZXJ0eSBpcyBzZXQuCi1ib29sIGRlbGF5X3JlcG9ydGluZ19lbmFibGVkKCk7Ci0KLS8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgfGV2ZW50fC4KLWNvbnN0IGNoYXIqIGF1ZGlvX2EyZHBfaHdfZHVtcF9jdHJsX2V2ZW50KHRBMkRQX0NUUkxfQ01EIGV2ZW50KTsKLQotI2VuZGlmIC8qIEEyRFBfQVVESU9fSFdfSCAqLwpkaWZmIC0tZ2l0IGEvYXVkaW9fYTJkcF9ody9zcmMvYXVkaW9fYTJkcF9ody5jYyBiL2F1ZGlvX2EyZHBfaHcvc3JjL2F1ZGlvX2EyZHBfaHcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTMwZmQuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYTJkcF9ody9zcmMvYXVkaW9fYTJkcF9ody5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGF1ZGlvX2EyZHBfaHcuYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRzIGhhbCBmb3IgYmx1ZWRyb2lkIGEyZHAgYXVkaW8gZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2EyZHBfaHciCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvaGFzaF9tYXBfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zb2NrZXRfdXRpbHMvc29ja2V0cy5oIgotCi0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDVFJMX0NIQU5fUkVUUllfQ09VTlQgMwotI2RlZmluZSBVU0VDX1BFUl9TRUMgMTAwMDAwMEwKLSNkZWZpbmUgU09DS19TRU5EX1RJTUVPVVRfTVMgMjAwMCAvKiBUaW1lb3V0IGZvciBzZW5kaW5nICovCi0jZGVmaW5lIFNPQ0tfUkVDVl9USU1FT1VUX01TIDUwMDAgLyogVGltZW91dCBmb3IgcmVjZWl2aW5nICovCi0jZGVmaW5lIFNFQ19UT19NUyAxMDAwCi0jZGVmaW5lIFNFQ19UT19OUyAxMDAwMDAwMDAwCi0jZGVmaW5lIE1TX1RPX05TIDEwMDAwMDAKLSNkZWZpbmUgREVMQVlfVE9fTlMgMTAwMDAwCi0KLSNkZWZpbmUgTUlOX0RFTEFZX01TIDEwMAotI2RlZmluZSBNQVhfREVMQVlfTVMgMTAwMAotCi0vLyBzZXQgV1JJVEVfUE9MTF9NUyB0byAwIGZvciBibG9ja2luZyBzb2NrZXRzLCBub256ZXJvIGZvciBwb2xsZWQgbm9uLWJsb2NraW5nCi0vLyBzb2NrZXRzCi0jZGVmaW5lIFdSSVRFX1BPTExfTVMgMjAKLQotI2RlZmluZSBGTkxPRygpIEFMT0dWKCIlczolZCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXykKLSNkZWZpbmUgREVCVUcoZm10LCBhcmdzLi4uKSBcCi0gIEFMT0dEKCIlczolZCAlczogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncykKLSNkZWZpbmUgSU5GTyhmbXQsIGFyZ3MuLi4pIFwKLSAgQUxPR0koIiVzOiVkICVzOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgIyNhcmdzKQotI2RlZmluZSBXQVJOKGZtdCwgYXJncy4uLikgXAotICBBTE9HVygiJXM6JWQgJXM6ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCAjI2FyZ3MpCi0jZGVmaW5lIEVSUk9SKGZtdCwgYXJncy4uLikgXAotICBBTE9HRSgiJXM6JWQgJXM6ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCAjI2FyZ3MpCi0KLSNkZWZpbmUgQVNTRVJUQyhjb25kLCBtc2csIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRVJST1IoIiMjIyBBU1NFUlQgOiAlcyBsaW5lICVkICVzICglZCkgIyMjIiwgX19GSUxFX18sIF9fTElORV9fLCBtc2csIFwKLSAgICAgICAgICB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgQVVESU9fQTJEUF9TVEFURV9TVEFSVElORywKLSAgQVVESU9fQTJEUF9TVEFURV9TVEFSVEVELAotICBBVURJT19BMkRQX1NUQVRFX1NUT1BQSU5HLAotICBBVURJT19BMkRQX1NUQVRFX1NUT1BQRUQsCi0gIC8qIG5lZWQgZXhwbGljaXQgc2V0IHBhcmFtIGNhbGwgdG8gcmVzdW1lIChzdXNwZW5kPWZhbHNlKSAqLwotICBBVURJT19BMkRQX1NUQVRFX1NVU1BFTkRFRCwKLSAgQVVESU9fQTJEUF9TVEFURV9TVEFOREJZIC8qIGFsbG93cyB3cml0ZSB0byBhdXRvcmVzdW1lICovCi19IGEyZHBfc3RhdGVfdDsKLQotc3RydWN0IGEyZHBfc3RyZWFtX2luOwotc3RydWN0IGEyZHBfc3RyZWFtX291dDsKLQotc3RydWN0IGEyZHBfYXVkaW9fZGV2aWNlIHsKLSAgLy8gSW1wb3J0YW50OiBkZXZpY2UgbXVzdCBiZSBmaXJzdCBhcyBhbiBhdWRpb19od19kZXZpY2UqIG1heSBiZSBjYXN0IHRvCi0gIC8vIGEyZHBfYXVkaW9fZGV2aWNlKiB3aGVuIHRoZSB0eXBlIGlzIGltcGxpY2l0bHkga25vd24uCi0gIHN0cnVjdCBhdWRpb19od19kZXZpY2UgZGV2aWNlOwotICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCogbXV0ZXg7ICAvLyBTZWUgbm90ZSBiZWxvdyBvbiBtdXRleCBhY3F1aXNpdGlvbiBvcmRlci4KLSAgc3RydWN0IGEyZHBfc3RyZWFtX2luKiBpbnB1dDsKLSAgc3RydWN0IGEyZHBfc3RyZWFtX291dCogb3V0cHV0OwotfTsKLQotc3RydWN0IGEyZHBfY29uZmlnIHsKLSAgdWludDMyX3QgcmF0ZTsKLSAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbF9tYXNrOwotICBib29sIGlzX3N0ZXJlb190b19tb25vOyAgLy8gVHJ1ZSBpZiBmZXRjaGluZyBTdGVyZW8gYW5kIG1peGluZyBpbnRvIE1vbm8KLSAgaW50IGZvcm1hdDsKLX07Ci0KLS8qIG1vdmUgY3RybF9mZCBvdXRzaWRlIG91dHB1dCBzdHJlYW0gYW5kIGtlZXAgb3BlbiB1bnRpbCBIQUwgdW5sb2FkZWQgPyAqLwotCi1zdHJ1Y3QgYTJkcF9zdHJlYW1fY29tbW9uIHsKLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXgqIG11dGV4OyAgLy8gU2VlIG5vdGUgYmVsb3cgb24gbXV0ZXggYWNxdWlzaXRpb24gb3JkZXIuCi0gIGludCBjdHJsX2ZkOwotICBpbnQgYXVkaW9fZmQ7Ci0gIHNpemVfdCBidWZmZXJfc3o7Ci0gIHN0cnVjdCBhMmRwX2NvbmZpZyBjZmc7Ci0gIGEyZHBfc3RhdGVfdCBzdGF0ZTsKLX07Ci0KLXN0cnVjdCBhMmRwX3N0cmVhbV9vdXQgewotICBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCBzdHJlYW07Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24gY29tbW9uOwotICB1aW50NjRfdCBmcmFtZXNfcHJlc2VudGVkOyAgLy8gZnJhbWVzIHdyaXR0ZW4sIG5ldmVyIHJlc2V0Ci0gIHVpbnQ2NF90IGZyYW1lc19yZW5kZXJlZDsgICAvLyBmcmFtZXMgd3JpdHRlbiwgcmVzZXQgb24gc3RhbmRieQotfTsKLQotc3RydWN0IGEyZHBfc3RyZWFtX2luIHsKLSAgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiBzdHJlYW07Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24gY29tbW9uOwotfTsKLQotLyoKLSAqIE11dGV4IGFjcXVpc2l0aW9uIG9yZGVyOgotICoKLSAqIFRoZSBhMmRwX2F1ZGlvX2RldmljZSAoYWRldikgbXV0ZXggbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUKLSAqIHRoZSBhMmRwX3N0cmVhbV9jb21tb24gKG91dCBvciBpbikgbXV0ZXguCi0gKgotICogVGhpcyBtYXkgZGlmZmVyIGZyb20gb3RoZXIgYXVkaW8gSEFMcy4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIGVuYWJsZV9kZWxheV9yZXBvcnRpbmcgPSBmYWxzZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc2l6ZV90IG91dF9nZXRfYnVmZmVyX3NpemUoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKTsKLXN0YXRpYyB1aW50MzJfdCBvdXRfZ2V0X2xhdGVuY3koY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhMmRwX29wZW5fY3RybF9wYXRoKHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBNaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhc2hfbWFwX3V0aWxzX2R1bXBfc3RyaW5nX2tleXNfc3RyaW5nX3ZhbHVlcygKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbWFwKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcHRyIDogbWFwKSB7Ci0gICAgSU5GTygia2V5OiAnJXMnIHZhbHVlOiAnJXMnXG4iLCBwdHIuZmlyc3QuY19zdHIoKSwgcHRyLnNlY29uZC5jX3N0cigpKTsKLSAgfQotfQotCi0vKiBsb2dzIHRpbWVzdGFtcCB3aXRoIG1pY3Jvc2VjIHByZWNpc2lvbgotICAgcHByZXYgaXMgb3B0aW9uYWwgaW4gY2FzZSBhIGRlZGljYXRlZCBkaWZmIGlzIHJlcXVpcmVkICovCi1zdGF0aWMgdm9pZCB0c19sb2coVU5VU0VEX0FUVFIgY29uc3QgY2hhciogdGFnLCBVTlVTRURfQVRUUiBpbnQgdmFsLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyogcHByZXZfb3B0KSB7Ci0gIHN0cnVjdCB0aW1lc3BlYyBub3c7Ci0gIHN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgcHJldiA9IHswLCAwfTsKLSAgdW5zaWduZWQgbG9uZyBsb25nIG5vd191czsKLSAgdW5zaWduZWQgbG9uZyBsb25nIGRpZmZfdXM7Ci0KLSAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZub3cpOwotCi0gIG5vd191cyA9IG5vdy50dl9zZWMgKiBVU0VDX1BFUl9TRUMgKyBub3cudHZfbnNlYyAvIDEwMDA7Ci0KLSAgaWYgKHBwcmV2X29wdCkgewotICAgIGRpZmZfdXMgPSAobm93LnR2X3NlYyAtIHByZXYudHZfc2VjKSAqIFVTRUNfUEVSX1NFQyArCi0gICAgICAgICAgICAgIChub3cudHZfbnNlYyAtIHByZXYudHZfbnNlYykgLyAxMDAwOwotICAgICpwcHJldl9vcHQgPSBub3c7Ci0gICAgREVCVUcoIlslc10gdHMgJTA4bGxkLCAqZGlmZiAlMDhsbGQsIHZhbCAlZCIsIHRhZywgbm93X3VzLCBkaWZmX3VzLCB2YWwpOwotICB9IGVsc2UgewotICAgIGRpZmZfdXMgPSAobm93LnR2X3NlYyAtIHByZXYudHZfc2VjKSAqIFVTRUNfUEVSX1NFQyArCi0gICAgICAgICAgICAgIChub3cudHZfbnNlYyAtIHByZXYudHZfbnNlYykgLyAxMDAwOwotICAgIHByZXYgPSBub3c7Ci0gICAgREVCVUcoIlslc10gdHMgJTA4bGxkLCBkaWZmICUwOGxsZCwgdmFsICVkIiwgdGFnLCBub3dfdXMsIGRpZmZfdXMsIHZhbCk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBjYWxjX2F1ZGlvdGltZV91c2VjKHN0cnVjdCBhMmRwX2NvbmZpZyBjZmcsIGludCBieXRlcykgewotICBpbnQgY2hhbl9jb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjZmcuY2hhbm5lbF9tYXNrKTsKLSAgaW50IGJ5dGVzX3Blcl9zYW1wbGU7Ci0KLSAgc3dpdGNoIChjZmcuZm9ybWF0KSB7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKLSAgICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUQyhmYWxzZSwgInVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQiLCBjZmcuZm9ybWF0KTsKLSAgICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAyOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gKAotICAgICAgaW50KSgoKGludDY0X3QpYnl0ZXMgKiAoVVNFQ19QRVJfU0VDIC8gKGNoYW5fY291bnQgKiBieXRlc19wZXJfc2FtcGxlKSkpIC8KLSAgICAgICAgICAgY2ZnLnJhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIGJsdWVkcm9pZCBzdGFjayBhZGFwdGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgc2t0X2Nvbm5lY3QoY29uc3QgY2hhciogcGF0aCwgc2l6ZV90IGJ1ZmZlcl9zeikgewotICBpbnQgcmV0OwotICBpbnQgc2t0X2ZkOwotICBpbnQgbGVuOwotCi0gIElORk8oImNvbm5lY3QgdG8gJXMgKHN6ICV6dSkiLCBwYXRoLCBidWZmZXJfc3opOwotCi0gIHNrdF9mZCA9IHNvY2tldChBRl9MT0NBTCwgU09DS19TVFJFQU0sIDApOwotCi0gIGlmIChvc2lfc29ja2V0X2xvY2FsX2NsaWVudF9jb25uZWN0KAotICAgICAgICAgIHNrdF9mZCwgcGF0aCwgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX0FCU1RSQUNULCBTT0NLX1NUUkVBTSkgPCAwKSB7Ci0gICAgRVJST1IoImZhaWxlZCB0byBjb25uZWN0ICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgIGNsb3NlKHNrdF9mZCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgbGVuID0gYnVmZmVyX3N6OwotICByZXQgPQotICAgICAgc2V0c29ja29wdChza3RfZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIChpbnQpc2l6ZW9mKGxlbikpOwotICBpZiAocmV0IDwgMCkgRVJST1IoInNldHNvY2tvcHQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwotCi0gIHJldCA9Ci0gICAgICBzZXRzb2Nrb3B0KHNrdF9mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgKGludClzaXplb2YobGVuKSk7Ci0gIGlmIChyZXQgPCAwKSBFUlJPUigic2V0c29ja29wdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgLyogU29ja2V0IHNlbmQvcmVjZWl2ZSB0aW1lb3V0IHZhbHVlICovCi0gIHN0cnVjdCB0aW1ldmFsIHR2OwotICB0di50dl9zZWMgPSBTT0NLX1NFTkRfVElNRU9VVF9NUyAvIDEwMDA7Ci0gIHR2LnR2X3VzZWMgPSAoU09DS19TRU5EX1RJTUVPVVRfTVMgJSAxMDAwKSAqIDEwMDA7Ci0KLSAgcmV0ID0gc2V0c29ja29wdChza3RfZmQsIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAmdHYsIHNpemVvZih0dikpOwotICBpZiAocmV0IDwgMCkgRVJST1IoInNldHNvY2tvcHQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwotCi0gIHR2LnR2X3NlYyA9IFNPQ0tfUkVDVl9USU1FT1VUX01TIC8gMTAwMDsKLSAgdHYudHZfdXNlYyA9IChTT0NLX1JFQ1ZfVElNRU9VVF9NUyAlIDEwMDApICogMTAwMDsKLQotICByZXQgPSBzZXRzb2Nrb3B0KHNrdF9mZCwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZ0diwgc2l6ZW9mKHR2KSk7Ci0gIGlmIChyZXQgPCAwKSBFUlJPUigic2V0c29ja29wdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgSU5GTygiY29ubmVjdGVkIHRvIHN0YWNrIGZkID0gJWQiLCBza3RfZmQpOwotCi0gIHJldHVybiBza3RfZmQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2t0X3JlYWQoaW50IGZkLCB2b2lkKiBwLCBzaXplX3QgbGVuKSB7Ci0gIHNzaXplX3QgcmVhZDsKLQotICBGTkxPRygpOwotCi0gIHRzX2xvZygic2t0X3JlYWQgcmVjdiIsIGxlbiwgTlVMTCk7Ci0KLSAgT1NJX05PX0lOVFIocmVhZCA9IHJlY3YoZmQsIHAsIGxlbiwgTVNHX05PU0lHTkFMKSk7Ci0gIGlmIChyZWFkID09IC0xKSBFUlJPUigicmVhZCBmYWlsZWQgd2l0aCBlcnJubz0lZFxuIiwgZXJybm8pOwotCi0gIHJldHVybiAoaW50KXJlYWQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2t0X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogcCwgc2l6ZV90IGxlbikgewotICBzc2l6ZV90IHNlbnQ7Ci0gIEZOTE9HKCk7Ci0KLSAgdHNfbG9nKCJza3Rfd3JpdGUiLCBsZW4sIE5VTEwpOwotCi0gIGlmIChXUklURV9QT0xMX01TID09IDApIHsKLSAgICAvLyBkbyBub3QgcG9sbCwgdXNlIGJsb2NraW5nIHNlbmQKLSAgICBPU0lfTk9fSU5UUihzZW50ID0gc2VuZChmZCwgcCwgbGVuLCBNU0dfTk9TSUdOQUwpKTsKLSAgICBpZiAoc2VudCA9PSAtMSkgRVJST1IoIndyaXRlIGZhaWxlZCB3aXRoIGVycm9yKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgICByZXR1cm4gKGludClzZW50OwotICB9Ci0KLSAgLy8gdXNlIG5vbi1ibG9ja2luZyBzZW5kLCBwb2xsCi0gIGludCBtc190aW1lb3V0ID0gU09DS19TRU5EX1RJTUVPVVRfTVM7Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChjb3VudCA8IGxlbikgewotICAgIE9TSV9OT19JTlRSKHNlbnQgPSBzZW5kKGZkLCBwLCBsZW4gLSBjb3VudCwgTVNHX05PU0lHTkFMIHwgTVNHX0RPTlRXQUlUKSk7Ci0gICAgaWYgKHNlbnQgPT0gLTEpIHsKLSAgICAgIGlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgRVJST1IoIndyaXRlIGZhaWxlZCB3aXRoIGVycm9yKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmIChtc190aW1lb3V0ID49IFdSSVRFX1BPTExfTVMpIHsKLSAgICAgICAgdXNsZWVwKFdSSVRFX1BPTExfTVMgKiAxMDAwKTsKLSAgICAgICAgbXNfdGltZW91dCAtPSBXUklURV9QT0xMX01TOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFdBUk4oIndyaXRlIHRpbWVvdXQgZXhjZWVkZWQsIHNlbnQgJXp1IGJ5dGVzIiwgY291bnQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb3VudCArPSBzZW50OwotICAgIHAgPSAoY29uc3QgdWludDhfdCopcCArIHNlbnQ7Ci0gIH0KLSAgcmV0dXJuIChpbnQpY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2t0X2Rpc2Nvbm5lY3QoaW50IGZkKSB7Ci0gIElORk8oImZkICVkIiwgZmQpOwotCi0gIGlmIChmZCAhPSBBVURJT19TS1RfRElTQ09OTkVDVEVEKSB7Ci0gICAgc2h1dGRvd24oZmQsIFNIVVRfUkRXUik7Ci0gICAgY2xvc2UoZmQpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQVVESU8gQ09OVFJPTCBQQVRICi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgYTJkcF9jdHJsX3JlY2VpdmUoc3RydWN0IGEyZHBfc3RyZWFtX2NvbW1vbiogY29tbW9uLCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgc3NpemVfdCByZXQ7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7OyBpKyspIHsKLSAgICBPU0lfTk9fSU5UUihyZXQgPSByZWN2KGNvbW1vbi0+Y3RybF9mZCwgYnVmZmVyLCBsZW5ndGgsIE1TR19OT1NJR05BTCkpOwotICAgIGlmIChyZXQgPiAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICBFUlJPUigicmVjZWl2ZSBjb250cm9sIGRhdGEgZmFpbGVkOiBwZWVyIGNsb3NlZCIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4pIHsKLSAgICAgIEVSUk9SKCJyZWNlaXZlIGNvbnRyb2wgZGF0YSBmYWlsZWQ6IGVycm9yKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPT0gKENUUkxfQ0hBTl9SRVRSWV9DT1VOVCAtIDEpKSB7Ci0gICAgICBFUlJPUigicmVjZWl2ZSBjb250cm9sIGRhdGEgZmFpbGVkOiBtYXggcmV0cnkgY291bnQiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBJTkZPKCJyZWNlaXZlIGNvbnRyb2wgZGF0YSBmYWlsZWQgKCVzKSwgcmV0cnlpbmciLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci0gIGlmIChyZXQgPD0gMCkgewotICAgIHNrdF9kaXNjb25uZWN0KGNvbW1vbi0+Y3RybF9mZCk7Ci0gICAgY29tbW9uLT5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vLyBTZW5kcyBjb250cm9sIGluZm8gZm9yIHN0cmVhbSB8Y29tbW9ufC4gVGhlIGRhdGEgdG8gc2VuZCBpcyBzdG9yZWQgaW4KLS8vIHxidWZmZXJ8IGFuZCBoYXMgc2l6ZSB8bGVuZ3RofC4KLS8vIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIG51bWJlciBvZiBvY3RldHMgc2VudCwgb3RoZXJ3aXNlIC0xLgotc3RhdGljIGludCBhMmRwX2N0cmxfc2VuZChzdHJ1Y3QgYTJkcF9zdHJlYW1fY29tbW9uKiBjb21tb24sIGNvbnN0IHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBzc2l6ZV90IHNlbnQ7Ci0gIHNpemVfdCByZW1haW5pbmcgPSBsZW5ndGg7Ci0gIGludCBpOwotCi0gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDA7ICAvLyBOb3RoaW5nIHRvIGRvCi0KLSAgZm9yIChpID0gMDs7IGkrKykgewotICAgIE9TSV9OT19JTlRSKHNlbnQgPSBzZW5kKGNvbW1vbi0+Y3RybF9mZCwgYnVmZmVyLCByZW1haW5pbmcsIE1TR19OT1NJR05BTCkpOwotICAgIGlmIChzZW50ID09IHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlbWFpbmluZykpIHsKLSAgICAgIHJlbWFpbmluZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHNlbnQgPiAwKSB7Ci0gICAgICBidWZmZXIgPSAoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcikgKyBzZW50KTsKLSAgICAgIHJlbWFpbmluZyAtPSBzZW50OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzZW50IDwgMCkgewotICAgICAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTikgewotICAgICAgICBFUlJPUigic2VuZCBjb250cm9sIGRhdGEgZmFpbGVkOiBlcnJvciglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIElORk8oInNlbmQgY29udHJvbCBkYXRhIGZhaWxlZCAoJXMpLCByZXRyeWluZyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIGlmIChpID49IChDVFJMX0NIQU5fUkVUUllfQ09VTlQgLSAxKSkgewotICAgICAgRVJST1IoInNlbmQgY29udHJvbCBkYXRhIGZhaWxlZDogbWF4IHJldHJ5IGNvdW50Iik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHJlbWFpbmluZyA+IDApIHsKLSAgICBza3RfZGlzY29ubmVjdChjb21tb24tPmN0cmxfZmQpOwotICAgIGNvbW1vbi0+Y3RybF9mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBpbnQgYTJkcF9jb21tYW5kKHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbiwgdEEyRFBfQ1RSTF9DTUQgY21kKSB7Ci0gIGNoYXIgYWNrOwotCi0gIERFQlVHKCJBMkRQIENPTU1BTkQgJXMiLCBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudChjbWQpKTsKLQotICBpZiAoY29tbW9uLT5jdHJsX2ZkID09IEFVRElPX1NLVF9ESVNDT05ORUNURUQpIHsKLSAgICBJTkZPKCJzdGFydGluZyB1cCBvciByZWNvdmVyaW5nIGZyb20gcHJldmlvdXMgZXJyb3I6IGNvbW1hbmQ9JXMiLAotICAgICAgICAgYXVkaW9fYTJkcF9od19kdW1wX2N0cmxfZXZlbnQoY21kKSk7Ci0gICAgYTJkcF9vcGVuX2N0cmxfcGF0aChjb21tb24pOwotICAgIGlmIChjb21tb24tPmN0cmxfZmQgPT0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRCkgewotICAgICAgRVJST1IoImZhaWx1cmUgdG8gb3BlbiBjdHJsIHBhdGg6IGNvbW1hbmQ9JXMiLAotICAgICAgICAgICAgYXVkaW9fYTJkcF9od19kdW1wX2N0cmxfZXZlbnQoY21kKSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgLyogc2VuZCBjb21tYW5kICovCi0gIHNzaXplX3Qgc2VudDsKLSAgT1NJX05PX0lOVFIoc2VudCA9IHNlbmQoY29tbW9uLT5jdHJsX2ZkLCAmY21kLCAxLCBNU0dfTk9TSUdOQUwpKTsKLSAgaWYgKHNlbnQgPT0gLTEpIHsKLSAgICBFUlJPUigiY21kIGZhaWxlZCAoJXMpOiBjb21tYW5kPSVzIiwgc3RyZXJyb3IoZXJybm8pLAotICAgICAgICAgIGF1ZGlvX2EyZHBfaHdfZHVtcF9jdHJsX2V2ZW50KGNtZCkpOwotICAgIHNrdF9kaXNjb25uZWN0KGNvbW1vbi0+Y3RybF9mZCk7Ci0gICAgY29tbW9uLT5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiB3YWl0IGZvciBhY2sgYnl0ZSAqLwotICBpZiAoYTJkcF9jdHJsX3JlY2VpdmUoY29tbW9uLCAmYWNrLCAxKSA8IDApIHsKLSAgICBFUlJPUigiQTJEUCBDT01NQU5EICVzOiBubyBBQ0siLCBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudChjbWQpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBERUJVRygiQTJEUCBDT01NQU5EICVzIERPTkUgU1RBVFVTICVkIiwgYXVkaW9fYTJkcF9od19kdW1wX2N0cmxfZXZlbnQoY21kKSwKLSAgICAgICAgYWNrKTsKLQotICBpZiAoYWNrID09IEEyRFBfQ1RSTF9BQ0tfSU5DQUxMX0ZBSUxVUkUpIHsKLSAgICBFUlJPUigiQTJEUCBDT01NQU5EICVzIGVycm9yICVkIiwgYXVkaW9fYTJkcF9od19kdW1wX2N0cmxfZXZlbnQoY21kKSwgYWNrKTsKLSAgICByZXR1cm4gYWNrOwotICB9Ci0gIGlmIChhY2sgIT0gQTJEUF9DVFJMX0FDS19TVUNDRVNTKSB7Ci0gICAgRVJST1IoIkEyRFAgQ09NTUFORCAlcyBlcnJvciAlZCIsIGF1ZGlvX2EyZHBfaHdfZHVtcF9jdHJsX2V2ZW50KGNtZCksIGFjayk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfYTJkcF9yZWFkeShzdHJ1Y3QgYTJkcF9zdHJlYW1fY29tbW9uKiBjb21tb24pIHsKLSAgaWYgKGEyZHBfY29tbWFuZChjb21tb24sIEEyRFBfQ1RSTF9DTURfQ0hFQ0tfUkVBRFkpIDwgMCkgewotICAgIEVSUk9SKCJjaGVjayBhMmRwIHJlYWR5IGZhaWxlZCIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhMmRwX3JlYWRfaW5wdXRfYXVkaW9fY29uZmlnKHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbikgewotICB0QTJEUF9TQU1QTEVfUkFURSBzYW1wbGVfcmF0ZTsKLSAgdEEyRFBfQ0hBTk5FTF9DT1VOVCBjaGFubmVsX2NvdW50OwotCi0gIGlmIChhMmRwX2NvbW1hbmQoY29tbW9uLCBBMkRQX0NUUkxfR0VUX0lOUFVUX0FVRElPX0NPTkZJRykgPCAwKSB7Ci0gICAgRVJST1IoImdldCBhMmRwIGlucHV0IGF1ZGlvIGNvbmZpZyBmYWlsZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYTJkcF9jdHJsX3JlY2VpdmUoY29tbW9uLCAmc2FtcGxlX3JhdGUsIHNpemVvZih0QTJEUF9TQU1QTEVfUkFURSkpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChhMmRwX2N0cmxfcmVjZWl2ZShjb21tb24sICZjaGFubmVsX2NvdW50LCBzaXplb2YodEEyRFBfQ0hBTk5FTF9DT1VOVCkpIDwKLSAgICAgIDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgY29tbW9uLT5jZmcucmF0ZSA9IHNhbXBsZV9yYXRlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIHNhbXBsZSByYXRlOiAlIiBQUkl1MzIsIHNhbXBsZV9yYXRlKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN3aXRjaCAoY2hhbm5lbF9jb3VudCkgewotICAgIGNhc2UgMToKLSAgICAgIGNvbW1vbi0+Y2ZnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGNvbW1vbi0+Y2ZnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgY291bnQ6ICUiIFBSSXUzMiwgY2hhbm5lbF9jb3VudCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBUT0RPOiBGb3Igbm93IGlucHV0IGF1ZGlvIGZvcm1hdCBpcyBhbHdheXMgaGFyZC1jb2RlZCBhcyBQQ00gMTYtYml0Ci0gIGNvbW1vbi0+Y2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotCi0gIElORk8oImdvdCBpbnB1dCBhdWRpbyBjb25maWcgJWQgJWQiLCBjb21tb24tPmNmZy5mb3JtYXQsIGNvbW1vbi0+Y2ZnLnJhdGUpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGEyZHBfcmVhZF9vdXRwdXRfYXVkaW9fY29uZmlnKAotICAgIHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbiwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBjb2RlY19jb25maWcsCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBjb2RlY19jYXBhYmlsaXR5LCBib29sIHVwZGF0ZV9zdHJlYW1fY29uZmlnKSB7Ci0gIHN0cnVjdCBhMmRwX2NvbmZpZyBzdHJlYW1fY29uZmlnOwotCi0gIGlmIChhMmRwX2NvbW1hbmQoY29tbW9uLCBBMkRQX0NUUkxfR0VUX09VVFBVVF9BVURJT19DT05GSUcpIDwgMCkgewotICAgIEVSUk9SKCJnZXQgYTJkcCBvdXRwdXQgYXVkaW8gY29uZmlnIGZhaWxlZCIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8vIFJlY2VpdmUgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlnCi0gIGlmIChhMmRwX2N0cmxfcmVjZWl2ZShjb21tb24sICZjb2RlY19jb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChhMmRwX2N0cmxfcmVjZWl2ZShjb21tb24sICZjb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGEyZHBfY3RybF9yZWNlaXZlKGNvbW1vbiwgJmNvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCkpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8vIFJlY2VpdmUgdGhlIGN1cnJlbnQgY29kZWMgY2FwYWJpbGl0eQotICBpZiAoYTJkcF9jdHJsX3JlY2VpdmUoY29tbW9uLCAmY29kZWNfY2FwYWJpbGl0eS0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGEyZHBfY3RybF9yZWNlaXZlKGNvbW1vbiwgJmNvZGVjX2NhcGFiaWxpdHktPmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGEyZHBfY3RybF9yZWNlaXZlKGNvbW1vbiwgJmNvZGVjX2NhcGFiaWxpdHktPmNoYW5uZWxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBDaGVjayB0aGUgY29kZWMgY29uZmlnIHNhbXBsZSByYXRlCi0gIHN3aXRjaCAoY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgc3RyZWFtX2NvbmZpZy5yYXRlID0gNDQxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDoKLSAgICAgIHN0cmVhbV9jb25maWcucmF0ZSA9IDQ4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA6Ci0gICAgICBzdHJlYW1fY29uZmlnLnJhdGUgPSA4ODIwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgICAgc3RyZWFtX2NvbmZpZy5yYXRlID0gOTYwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgICBzdHJlYW1fY29uZmlnLnJhdGUgPSAxNzY0MDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDA6Ci0gICAgICBzdHJlYW1fY29uZmlnLnJhdGUgPSAxOTIwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOgotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUigiSW52YWxpZCBzYW1wbGUgcmF0ZTogMHgleCIsIGNvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBiaXRzIHBlciBzYW1wbGUKLSAgc3dpdGNoIChjb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIHN0cmVhbV9jb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICBzdHJlYW1fY29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIHN0cmVhbV9jb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgYml0cyBwZXIgc2FtcGxlOiAweCV4IiwgY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBjaGFubmVsIG1vZGUKLSAgc3dpdGNoIChjb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgc3RyZWFtX2NvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgc3RyZWFtX2NvbmZpZy5pc19zdGVyZW9fdG9fbW9ubyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgc3RyZWFtX2NvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICBzdHJlYW1fY29uZmlnLmlzX3N0ZXJlb190b19tb25vID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgY2hhbm5lbCBtb2RlOiAweCV4IiwgY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChzdHJlYW1fY29uZmlnLmlzX3N0ZXJlb190b19tb25vKSB7Ci0gICAgc3RyZWFtX2NvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbgotICBpZiAodXBkYXRlX3N0cmVhbV9jb25maWcpIHsKLSAgICBjb21tb24tPmNmZy5yYXRlID0gc3RyZWFtX2NvbmZpZy5yYXRlOwotICAgIGNvbW1vbi0+Y2ZnLmNoYW5uZWxfbWFzayA9IHN0cmVhbV9jb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGNvbW1vbi0+Y2ZnLmlzX3N0ZXJlb190b19tb25vID0gc3RyZWFtX2NvbmZpZy5pc19zdGVyZW9fdG9fbW9ubzsKLSAgICBjb21tb24tPmNmZy5mb3JtYXQgPSBzdHJlYW1fY29uZmlnLmZvcm1hdDsKLSAgICBjb21tb24tPmJ1ZmZlcl9zeiA9IGF1ZGlvX2EyZHBfaHdfc3RyZWFtX2NvbXB1dGVfYnVmZmVyX3NpemUoCi0gICAgICAgIGNvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUsIGNvZGVjX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlLAotICAgICAgICBjb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSk7Ci0gICAgaWYgKGNvbW1vbi0+Y2ZnLmlzX3N0ZXJlb190b19tb25vKSB7Ci0gICAgICAvLyBXZSBuZWVkIHRvIGZldGNoIHR3aWNlIGFzIG11Y2ggZGF0YSBmcm9tIHRoZSBBdWRpbyBmcmFtZXdvcmsKLSAgICAgIGNvbW1vbi0+YnVmZmVyX3N6ICo9IDI7Ci0gICAgfQotICB9Ci0KLSAgSU5GTygKLSAgICAgICJnb3Qgb3V0cHV0IGNvZGVjIGNvbmZpZyAodXBkYXRlX3N0cmVhbV9jb25maWc9JXMpOiAiCi0gICAgICAic2FtcGxlX3JhdGU9MHgleCBiaXRzX3Blcl9zYW1wbGU9MHgleCBjaGFubmVsX21vZGU9MHgleCIsCi0gICAgICB1cGRhdGVfc3RyZWFtX2NvbmZpZyA/ICJ0cnVlIiA6ICJmYWxzZSIsIGNvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICBjb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSwgY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUpOwotCi0gIElORk8oCi0gICAgICAiZ290IG91dHB1dCBjb2RlYyBjYXBhYmlsaXR5OiBzYW1wbGVfcmF0ZT0weCV4IGJpdHNfcGVyX3NhbXBsZT0weCV4ICIKLSAgICAgICJjaGFubmVsX21vZGU9MHgleCIsCi0gICAgICBjb2RlY19jYXBhYmlsaXR5LT5zYW1wbGVfcmF0ZSwgY29kZWNfY2FwYWJpbGl0eS0+Yml0c19wZXJfc2FtcGxlLAotICAgICAgY29kZWNfY2FwYWJpbGl0eS0+Y2hhbm5lbF9tb2RlKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhMmRwX3dyaXRlX291dHB1dF9hdWRpb19jb25maWcoc3RydWN0IGEyZHBfc3RyZWFtX2NvbW1vbiogY29tbW9uKSB7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWc7Ci0KLSAgaWYgKGEyZHBfY29tbWFuZChjb21tb24sIEEyRFBfQ1RSTF9TRVRfT1VUUFVUX0FVRElPX0NPTkZJRykgPCAwKSB7Ci0gICAgRVJST1IoInNldCBhMmRwIG91dHB1dCBhdWRpbyBjb25maWcgZmFpbGVkIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gIGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gIGNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0KLSAgc3dpdGNoIChjb21tb24tPmNmZy5yYXRlKSB7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICBjb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg4MjAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc2NDAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTkyMDAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUigiSW52YWxpZCBzYW1wbGUgcmF0ZTogJSIgUFJJdTMyLCBjb21tb24tPmNmZy5yYXRlKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN3aXRjaCAoY29tbW9uLT5jZmcuZm9ybWF0KSB7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgIGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6Ci0gICAgICBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6Ci0gICAgICBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDoKLSAgICAgIC8vIEFsbCAyNC1iaXQgYXVkaW8gaXMgZXhwZWN0ZWQgaW4gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIGZvcm1hdAotICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGF1ZGlvIGZvcm1hdDogMHgleCIsIGNvbW1vbi0+Y2ZnLmZvcm1hdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGNvbW1vbi0+Y2ZnLmNoYW5uZWxfbWFzaykgewotICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzoKLSAgICAgIGNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzoKLSAgICAgIGlmIChjb21tb24tPmNmZy5pc19zdGVyZW9fdG9fbW9ubykgewotICAgICAgICBjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbWFzazogMHgleCIsIGNvbW1vbi0+Y2ZnLmNoYW5uZWxfbWFzayk7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBTZW5kIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZyB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkIGJ5IHVzCi0gIGlmIChhMmRwX2N0cmxfc2VuZChjb21tb24sICZjb2RlY19jb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICBpZiAoYTJkcF9jdHJsX3NlbmQoY29tbW9uLCAmY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGEyZHBfY3RybF9zZW5kKGNvbW1vbiwgJmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgSU5GTygKLSAgICAgICJzZW50IG91dHB1dCBjb2RlYyBjb25maWc6IHNhbXBsZV9yYXRlPTB4JXggYml0c19wZXJfc2FtcGxlPTB4JXggIgotICAgICAgImNoYW5uZWxfbW9kZT0weCV4IiwKLSAgICAgIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSwgY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgIGNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGEyZHBfZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbl9jbWQoc3RydWN0IGEyZHBfc3RyZWFtX2NvbW1vbiogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBieXRlcywgdWludDE2X3QqIGRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyogdGltZXN0YW1wKSB7Ci0gIGlmICgoY29tbW9uLT5jdHJsX2ZkID09IEFVRElPX1NLVF9ESVNDT05ORUNURUQpIHx8Ci0gICAgICAoY29tbW9uLT5zdGF0ZSAhPSBBVURJT19BMkRQX1NUQVRFX1NUQVJURUQpKSB7ICAvLyBBdWRpbyBpcyBub3Qgc3RyZWFtaW5nCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGEyZHBfY29tbWFuZChjb21tb24sIEEyRFBfQ1RSTF9HRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYTJkcF9jdHJsX3JlY2VpdmUoY29tbW9uLCBieXRlcywgc2l6ZW9mKCpieXRlcykpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChhMmRwX2N0cmxfcmVjZWl2ZShjb21tb24sIGRlbGF5LCBzaXplb2YoKmRlbGF5KSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdWludDMyX3Qgc2Vjb25kczsKLSAgaWYgKGEyZHBfY3RybF9yZWNlaXZlKGNvbW1vbiwgJnNlY29uZHMsIHNpemVvZihzZWNvbmRzKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdWludDMyX3QgbnNlYzsKLSAgaWYgKGEyZHBfY3RybF9yZWNlaXZlKGNvbW1vbiwgJm5zZWMsIHNpemVvZihuc2VjKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdGltZXN0YW1wLT50dl9zZWMgPSBzZWNvbmRzOwotICB0aW1lc3RhbXAtPnR2X25zZWMgPSBuc2VjOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYTJkcF9vcGVuX2N0cmxfcGF0aChzdHJ1Y3QgYTJkcF9zdHJlYW1fY29tbW9uKiBjb21tb24pIHsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvbW1vbi0+Y3RybF9mZCAhPSBBVURJT19TS1RfRElTQ09OTkVDVEVEKSByZXR1cm47ICAvLyBhbHJlYWR5IGNvbm5lY3RlZAotCi0gIC8qIHJldHJ5IGxvZ2ljIHRvIGNhdGNoIGFueSB0aW1pbmcgdmFyaWF0aW9ucyBvbiBjb250cm9sIGNoYW5uZWwgKi8KLSAgZm9yIChpID0gMDsgaSA8IENUUkxfQ0hBTl9SRVRSWV9DT1VOVDsgaSsrKSB7Ci0gICAgLyogY29ubmVjdCBjb250cm9sIGNoYW5uZWwgaWYgbm90IGFscmVhZHkgY29ubmVjdGVkICovCi0gICAgaWYgKChjb21tb24tPmN0cmxfZmQgPSBza3RfY29ubmVjdCgKLSAgICAgICAgICAgICBBMkRQX0NUUkxfUEFUSCwgQVVESU9fU1RSRUFNX0NPTlRST0xfT1VUUFVUX0JVRkZFUl9TWikpID49IDApIHsKLSAgICAgIC8qIHN1Y2Nlc3MsIG5vdyBjaGVjayBpZiBzdGFjayBpcyByZWFkeSAqLwotICAgICAgaWYgKGNoZWNrX2EyZHBfcmVhZHkoY29tbW9uKSA9PSAwKSBicmVhazsKLQotICAgICAgRVJST1IoImVycm9yIDogYTJkcCBub3QgcmVhZHksIHdhaXQgMjUwIG1zIGFuZCByZXRyeSIpOwotICAgICAgdXNsZWVwKDI1MDAwMCk7Ci0gICAgICBza3RfZGlzY29ubmVjdChjb21tb24tPmN0cmxfZmQpOwotICAgICAgY29tbW9uLT5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICAvKiBjdHJsIGNoYW5uZWwgbm90IHJlYWR5LCB3YWl0IGEgYml0ICovCi0gICAgdXNsZWVwKDI1MDAwMCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQVVESU8gREFUQSBQQVRICi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGEyZHBfc3RyZWFtX2NvbW1vbl9pbml0KHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbikgewotICBGTkxPRygpOwotCi0gIGNvbW1vbi0+bXV0ZXggPSBuZXcgc3RkOjpyZWN1cnNpdmVfbXV0ZXg7Ci0KLSAgY29tbW9uLT5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgY29tbW9uLT5hdWRpb19mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gIGNvbW1vbi0+c3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgLyogbWFuYWdlcyBtYXggY2FwYWNpdHkgb2Ygc29ja2V0IHBpcGUgKi8KLSAgY29tbW9uLT5idWZmZXJfc3ogPSBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWjsKLX0KLQotc3RhdGljIHZvaWQgYTJkcF9zdHJlYW1fY29tbW9uX2Rlc3Ryb3koc3RydWN0IGEyZHBfc3RyZWFtX2NvbW1vbiogY29tbW9uKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgZGVsZXRlIGNvbW1vbi0+bXV0ZXg7Ci0gIGNvbW1vbi0+bXV0ZXggPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IHN0YXJ0X2F1ZGlvX2RhdGFwYXRoKHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbikgewotICBJTkZPKCJzdGF0ZSAlZCIsIGNvbW1vbi0+c3RhdGUpOwotCi0gIGludCBvbGRzdGF0ZSA9IGNvbW1vbi0+c3RhdGU7Ci0gIGNvbW1vbi0+c3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NUQVJUSU5HOwotCi0gIGludCBhMmRwX3N0YXR1cyA9IGEyZHBfY29tbWFuZChjb21tb24sIEEyRFBfQ1RSTF9DTURfU1RBUlQpOwotICBpZiAoYTJkcF9zdGF0dXMgPCAwKSB7Ci0gICAgRVJST1IoIkF1ZGlvcGF0aCBzdGFydCBmYWlsZWQgKHN0YXR1cyAlZCkiLCBhMmRwX3N0YXR1cyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfSBlbHNlIGlmIChhMmRwX3N0YXR1cyA9PSBBMkRQX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFKSB7Ci0gICAgRVJST1IoIkF1ZGlvcGF0aCBzdGFydCBmYWlsZWQgLSBpbiBjYWxsLCBtb3ZlIHRvIHN1c3BlbmRlZCIpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICAvKiBjb25uZWN0IHNvY2tldCBpZiBub3QgeWV0IGNvbm5lY3RlZCAqLwotICBpZiAoY29tbW9uLT5hdWRpb19mZCA9PSBBVURJT19TS1RfRElTQ09OTkVDVEVEKSB7Ci0gICAgY29tbW9uLT5hdWRpb19mZCA9IHNrdF9jb25uZWN0KEEyRFBfREFUQV9QQVRILCBjb21tb24tPmJ1ZmZlcl9zeik7Ci0gICAgaWYgKGNvbW1vbi0+YXVkaW9fZmQgPCAwKSB7Ci0gICAgICBFUlJPUigiQXVkaW9wYXRoIHN0YXJ0IGZhaWxlZCAtIGVycm9yIG9wZW5pbmcgZGF0YSBzb2NrZXQiKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICB9Ci0gIGNvbW1vbi0+c3RhdGUgPSAoYTJkcF9zdGF0ZV90KUFVRElPX0EyRFBfU1RBVEVfU1RBUlRFRDsKLQotICAvKiBjaGVjayB0byBzZWUgaWYgZGVsYXkgcmVwb3J0aW5nIGlzIGVuYWJsZWQgKi8KLSAgZW5hYmxlX2RlbGF5X3JlcG9ydGluZyA9IGRlbGF5X3JlcG9ydGluZ19lbmFibGVkKCk7Ci0KLSAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICBjb21tb24tPnN0YXRlID0gKGEyZHBfc3RhdGVfdClvbGRzdGF0ZTsKLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IHN0b3BfYXVkaW9fZGF0YXBhdGgoc3RydWN0IGEyZHBfc3RyZWFtX2NvbW1vbiogY29tbW9uKSB7Ci0gIGludCBvbGRzdGF0ZSA9IGNvbW1vbi0+c3RhdGU7Ci0KLSAgSU5GTygic3RhdGUgJWQiLCBjb21tb24tPnN0YXRlKTsKLQotICAvKiBwcmV2ZW50IGFueSBzdHJheSBvdXRwdXQgd3JpdGVzIGZyb20gYXV0b3N0YXJ0aW5nIHRoZSBzdHJlYW0KLSAgICAgd2hpbGUgc3RvcHBpbmcgYXVkaW9wYXRoICovCi0gIGNvbW1vbi0+c3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NUT1BQSU5HOwotCi0gIGlmIChhMmRwX2NvbW1hbmQoY29tbW9uLCBBMkRQX0NUUkxfQ01EX1NUT1ApIDwgMCkgewotICAgIEVSUk9SKCJhdWRpb3BhdGggc3RvcCBmYWlsZWQiKTsKLSAgICBjb21tb24tPnN0YXRlID0gKGEyZHBfc3RhdGVfdClvbGRzdGF0ZTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBjb21tb24tPnN0YXRlID0gKGEyZHBfc3RhdGVfdClBVURJT19BMkRQX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgLyogZGlzY29ubmVjdCBhdWRpbyBwYXRoICovCi0gIHNrdF9kaXNjb25uZWN0KGNvbW1vbi0+YXVkaW9fZmQpOwotICBjb21tb24tPmF1ZGlvX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdXNwZW5kX2F1ZGlvX2RhdGFwYXRoKHN0cnVjdCBhMmRwX3N0cmVhbV9jb21tb24qIGNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YW5kYnkpIHsKLSAgSU5GTygic3RhdGUgJWQiLCBjb21tb24tPnN0YXRlKTsKLQotICBpZiAoY29tbW9uLT5zdGF0ZSA9PSBBVURJT19BMkRQX1NUQVRFX1NUT1BQSU5HKSByZXR1cm4gLTE7Ci0KLSAgaWYgKGEyZHBfY29tbWFuZChjb21tb24sIEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgPCAwKSByZXR1cm4gLTE7Ci0KLSAgaWYgKHN0YW5kYnkpCi0gICAgY29tbW9uLT5zdGF0ZSA9IEFVRElPX0EyRFBfU1RBVEVfU1RBTkRCWTsKLSAgZWxzZQotICAgIGNvbW1vbi0+c3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NVU1BFTkRFRDsKLQotICAvKiBkaXNjb25uZWN0IGF1ZGlvIHBhdGggKi8KLSAgc2t0X2Rpc2Nvbm5lY3QoY29tbW9uLT5hdWRpb19mZCk7Ci0KLSAgY29tbW9uLT5hdWRpb19mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBhdWRpbyBvdXRwdXQgY2FsbGJhY2tzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzc2l6ZV90IG91dF93cml0ZShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLCBjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KilzdHJlYW07Ci0gIGludCBzZW50ID0gLTE7Ci0gIHNpemVfdCB3cml0ZV9ieXRlcyA9IGJ5dGVzOwotCi0gIERFQlVHKCJ3cml0ZSAlenUgYnl0ZXMgKGZkICVkKSIsIGJ5dGVzLCBvdXQtPmNvbW1vbi5hdWRpb19mZCk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqb3V0LT5jb21tb24ubXV0ZXgpOwotICBpZiAob3V0LT5jb21tb24uc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVVNQRU5ERUQgfHwKLSAgICAgIG91dC0+Y29tbW9uLnN0YXRlID09IEFVRElPX0EyRFBfU1RBVEVfU1RPUFBJTkcpIHsKLSAgICBERUJVRygic3RyZWFtIHN1c3BlbmRlZCBvciBjbG9zaW5nIik7Ci0gICAgZ290byBmaW5pc2g7Ci0gIH0KLQotICAvKiBvbmx5IGFsbG93IGF1dG9zdGFydGluZyBpZiB3ZSBhcmUgaW4gc3RvcHBlZCBvciBzdGFuZGJ5ICovCi0gIGlmICgob3V0LT5jb21tb24uc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVE9QUEVEKSB8fAotICAgICAgKG91dC0+Y29tbW9uLnN0YXRlID09IEFVRElPX0EyRFBfU1RBVEVfU1RBTkRCWSkpIHsKLSAgICBpZiAoc3RhcnRfYXVkaW9fZGF0YXBhdGgoJm91dC0+Y29tbW9uKSA8IDApIHsKLSAgICAgIGdvdG8gZmluaXNoOwotICAgIH0KLSAgfSBlbHNlIGlmIChvdXQtPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19BMkRQX1NUQVRFX1NUQVJURUQpIHsKLSAgICBFUlJPUigic3RyZWFtIG5vdCBpbiBzdG9wcGVkIG9yIHN0YW5kYnkiKTsKLSAgICBnb3RvIGZpbmlzaDsKLSAgfQotCi0gIC8vIE1peCB0aGUgc3RlcmVvIGludG8gbW9ubyBpZiBuZWNlc3NhcnkKLSAgaWYgKG91dC0+Y29tbW9uLmNmZy5pc19zdGVyZW9fdG9fbW9ubykgewotICAgIGNvbnN0IHNpemVfdCBmcmFtZXMgPSBieXRlcyAvIGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShzdHJlYW0pOwotICAgIGludDE2X3QqIHNyYyA9IChpbnQxNl90KilidWZmZXI7Ci0gICAgaW50MTZfdCogZHN0ID0gKGludDE2X3QqKWJ1ZmZlcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lczsgaSsrLCBkc3QrKywgc3JjICs9IDIpIHsKLSAgICAgICpkc3QgPSAoaW50MTZfdCkoKChpbnQzMl90KXNyY1swXSArIChpbnQzMl90KXNyY1sxXSkgPj4gMSk7Ci0gICAgfQotICAgIHdyaXRlX2J5dGVzIC89IDI7Ci0gICAgREVCVUcoInN0ZXJlby10by1tb25vIG1peGluZzogd3JpdGUgJXp1IGJ5dGVzIChmZCAlZCkiLCB3cml0ZV9ieXRlcywKLSAgICAgICAgICBvdXQtPmNvbW1vbi5hdWRpb19mZCk7Ci0gIH0KLQotICBsb2NrLnVubG9jaygpOwotICBzZW50ID0gc2t0X3dyaXRlKG91dC0+Y29tbW9uLmF1ZGlvX2ZkLCBidWZmZXIsIHdyaXRlX2J5dGVzKTsKLSAgbG9jay5sb2NrKCk7Ci0KLSAgaWYgKHNlbnQgPT0gLTEpIHsKLSAgICBza3RfZGlzY29ubmVjdChvdXQtPmNvbW1vbi5hdWRpb19mZCk7Ci0gICAgb3V0LT5jb21tb24uYXVkaW9fZmQgPSBBVURJT19TS1RfRElTQ09OTkVDVEVEOwotICAgIGlmICgob3V0LT5jb21tb24uc3RhdGUgIT0gQVVESU9fQTJEUF9TVEFURV9TVVNQRU5ERUQpICYmCi0gICAgICAgIChvdXQtPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19BMkRQX1NUQVRFX1NUT1BQSU5HKSkgewotICAgICAgb3V0LT5jb21tb24uc3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NUT1BQRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVSUk9SKCJ3cml0ZSBmYWlsZWQgOiBzdHJlYW0gc3VzcGVuZGVkLCBhdm9pZCByZXNldHRpbmcgc3RhdGUiKTsKLSAgICB9Ci0gICAgZ290byBmaW5pc2g7Ci0gIH0KLQotZmluaXNoOjsKLSAgY29uc3Qgc2l6ZV90IGZyYW1lcyA9IGJ5dGVzIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKHN0cmVhbSk7Ci0gIG91dC0+ZnJhbWVzX3JlbmRlcmVkICs9IGZyYW1lczsKLSAgb3V0LT5mcmFtZXNfcHJlc2VudGVkICs9IGZyYW1lczsKLSAgbG9jay51bmxvY2soKTsKLQotICAvLyBJZiBzZW5kIGRpZG4ndCB3b3JrIG91dCwgc2xlZXAgdG8gZW11bGF0ZSB3cml0ZSBkZWxheS4KLSAgaWYgKHNlbnQgPT0gLTEpIHsKLSAgICBjb25zdCBpbnQgdXNfZGVsYXkgPSBjYWxjX2F1ZGlvdGltZV91c2VjKG91dC0+Y29tbW9uLmNmZywgYnl0ZXMpOwotICAgIERFQlVHKCJlbXVsYXRlIGEyZHAgd3JpdGUgZGVsYXkgKCVkIHVzKSIsIHVzX2RlbGF5KTsKLSAgICB1c2xlZXAodXNfZGVsYXkpOwotICB9Ci0gIHJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHVpbnQzMl90IG91dF9nZXRfc2FtcGxlX3JhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKSB7Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgREVCVUcoInJhdGUgJSIgUFJJdTMyLCBvdXQtPmNvbW1vbi5jZmcucmF0ZSk7Ci0KLSAgcmV0dXJuIG91dC0+Y29tbW9uLmNmZy5yYXRlOwotfQotCi1zdGF0aWMgaW50IG91dF9zZXRfc2FtcGxlX3JhdGUoc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLCB1aW50MzJfdCByYXRlKSB7Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgREVCVUcoIm91dF9zZXRfc2FtcGxlX3JhdGUgOiAlIiBQUkl1MzIsIHJhdGUpOwotCi0gIG91dC0+Y29tbW9uLmNmZy5yYXRlID0gcmF0ZTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHNpemVfdCBvdXRfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGEyZHBfc3RyZWFtX291dCopc3RyZWFtOwotICAvLyBwZXJpb2Rfc2l6ZSBpcyB0aGUgQXVkaW9GbGluZ2VyIG1peGVyIGJ1ZmZlciBzaXplLgotICBjb25zdCBzaXplX3QgcGVyaW9kX3NpemUgPQotICAgICAgb3V0LT5jb21tb24uYnVmZmVyX3N6IC8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUzsKLQotICBERUJVRygic29ja2V0IGJ1ZmZlciBzaXplOiAlenUgIHBlcmlvZCBzaXplOiAlenUiLCBvdXQtPmNvbW1vbi5idWZmZXJfc3osCi0gICAgICAgIHBlcmlvZF9zaXplKTsKLQotICByZXR1cm4gcGVyaW9kX3NpemU7Ci19Ci0KLXNpemVfdCBhdWRpb19hMmRwX2h3X3N0cmVhbV9jb21wdXRlX2J1ZmZlcl9zaXplKAotICAgIGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGNvZGVjX3NhbXBsZV9yYXRlLAotICAgIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBjb2RlY19iaXRzX3Blcl9zYW1wbGUsCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNvZGVjX2NoYW5uZWxfbW9kZSkgewotICBzaXplX3QgYnVmZmVyX3N6ID0gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU1o7ICAvLyBEZWZhdWx0IHZhbHVlCi0gIGNvbnN0IHVpbnQ2NF90IHRpbWVfcGVyaW9kX21zID0gMjA7ICAgICAgICAgICAgICAgIC8vIENvbnNlcnZhdGl2ZSAyMG1zCi0gIHVpbnQzMl90IHNhbXBsZV9yYXRlOwotICB1aW50MzJfdCBiaXRzX3Blcl9zYW1wbGU7Ci0gIHVpbnQzMl90IG51bWJlcl9vZl9jaGFubmVsczsKLQotICAvLyBDaGVjayB0aGUgY29kZWMgY29uZmlnIHNhbXBsZSByYXRlCi0gIHN3aXRjaCAoY29kZWNfc2FtcGxlX3JhdGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDoKLSAgICAgIHNhbXBsZV9yYXRlID0gNDQxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDoKLSAgICAgIHNhbXBsZV9yYXRlID0gNDgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICAgIHNhbXBsZV9yYXRlID0gODgyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDoKLSAgICAgIHNhbXBsZV9yYXRlID0gOTYwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgICBzYW1wbGVfcmF0ZSA9IDE3NjQwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDoKLSAgICAgIHNhbXBsZV9yYXRlID0gMTkyMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgc2FtcGxlIHJhdGU6IDB4JXgiLCBjb2RlY19zYW1wbGVfcmF0ZSk7Ci0gICAgICByZXR1cm4gYnVmZmVyX3N6OwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBiaXRzIHBlciBzYW1wbGUKLSAgc3dpdGNoIChjb2RlY19iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY6Ci0gICAgICBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDoKLSAgICAgIGJpdHNfcGVyX3NhbXBsZSA9IDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgICAgYml0c19wZXJfc2FtcGxlID0gMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgYml0cyBwZXIgc2FtcGxlOiAweCV4IiwgY29kZWNfYml0c19wZXJfc2FtcGxlKTsKLSAgICAgIHJldHVybiBidWZmZXJfc3o7Ci0gIH0KLQotICAvLyBDaGVjayB0aGUgY29kZWMgY29uZmlnIGNoYW5uZWwgbW9kZQotICBzd2l0Y2ggKGNvZGVjX2NoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgbnVtYmVyX29mX2NoYW5uZWxzID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICBudW1iZXJfb2ZfY2hhbm5lbHMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbW9kZTogMHgleCIsIGNvZGVjX2NoYW5uZWxfbW9kZSk7Ci0gICAgICByZXR1cm4gYnVmZmVyX3N6OwotICB9Ci0KLSAgLy8KLSAgLy8gVGhlIGJ1ZmZlciBzaXplIGlzIGNvbXB1dGVkIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKLSAgLy8KLSAgLy8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU0laRSA9Ci0gIC8vICAgIChUSU1FX1BFUklPRF9NUyAqIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMgKgotICAvLyAgICAgU0FNUExFX1JBVEVfSFogKiBOVU1CRVJfT0ZfQ0hBTk5FTFMgKiAoQklUU19QRVJfU0FNUExFIC8gOCkpIC8gMTAwMAotICAvLwotICAvLyBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTIGNvbnRyb2xzIGhvdyB0aGUgc29ja2V0IGJ1ZmZlciBpcwotICAvLyBkaXZpZGVkIGZvciBBdWRpb0ZsaW5nZXIgZGF0YSBkZWxpdmVyeS4gVGhlIEF1ZGlvRmxpbmdlciBtaXhlciBkZWxpdmVycwotICAvLyBkYXRhIGluIGNodW5rcyBvZgotICAvLyAoQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU0laRSAvIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMpIC4KLSAgLy8gSWYgdGhlIG51bWJlciBvZiBwZXJpb2RzIGlzIDIsIHRoZSBzb2NrZXQgYnVmZmVyIHJlcHJlc2VudHMgImRvdWJsZQotICAvLyBidWZmZXJpbmciIG9mIHRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIgYnVmZmVyLgotICAvLwotICAvLyBGdXJ0aGVybW9yZSwgdGhlIEF1ZGlvRmxpbmdlciBleHBlY3RzIHRoZSBidWZmZXIgc2l6ZSB0byBiZSBhIG11bHRpcGxlCi0gIC8vIG9mIDE2IGZyYW1lcy4KLSAgY29uc3Qgc2l6ZV90IGRpdmlzb3IgPSAoQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyAqIDE2ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NoYW5uZWxzICogYml0c19wZXJfc2FtcGxlKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgODsKLQotICBidWZmZXJfc3ogPSAodGltZV9wZXJpb2RfbXMgKiBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTICoKLSAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlICogbnVtYmVyX29mX2NoYW5uZWxzICogKGJpdHNfcGVyX3NhbXBsZSAvIDgpKSAvCi0gICAgICAgICAgICAgIDEwMDA7Ci0KLSAgLy8gQWRqdXN0IHRoZSBidWZmZXIgc2l6ZSBzbyBpdCBjYW4gYmUgZGl2aWRlZCBieSB0aGUgZGl2aXNvcgotICBjb25zdCBzaXplX3QgcmVtYWluZGVyID0gYnVmZmVyX3N6ICUgZGl2aXNvcjsKLSAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgYnVmZmVyX3N6ICs9IGRpdmlzb3IgLSByZW1haW5kZXI7Ci0gIH0KLQotICByZXR1cm4gYnVmZmVyX3N6OwotfQotCi1zdGF0aWMgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0X2dldF9jaGFubmVscygKLSAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgc3RydWN0IGEyZHBfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqKXN0cmVhbTsKLQotICBERUJVRygiY2hhbm5lbHMgMHglIiBQUkl4MzIsIG91dC0+Y29tbW9uLmNmZy5jaGFubmVsX21hc2spOwotCi0gIHJldHVybiAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpb3V0LT5jb21tb24uY2ZnLmNoYW5uZWxfbWFzazsKLX0KLQotc3RhdGljIGF1ZGlvX2Zvcm1hdF90IG91dF9nZXRfZm9ybWF0KGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGEyZHBfc3RyZWFtX291dCopc3RyZWFtOwotICBERUJVRygiZm9ybWF0IDB4JXgiLCBvdXQtPmNvbW1vbi5jZmcuZm9ybWF0KTsKLSAgcmV0dXJuIChhdWRpb19mb3JtYXRfdClvdXQtPmNvbW1vbi5jZmcuZm9ybWF0OwotfQotCi1zdGF0aWMgaW50IG91dF9zZXRfZm9ybWF0KFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gIERFQlVHKCJzZXR0aW5nIGZvcm1hdCBub3QgeWV0IHN1cHBvcnRlZCAoMHgleCkiLCBmb3JtYXQpOwotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBvdXRfc3RhbmRieShzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgc3RydWN0IGEyZHBfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqKXN0cmVhbTsKLSAgaW50IHJldFZhbCA9IDA7Ci0KLSAgRk5MT0coKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKm91dC0+Y29tbW9uLm11dGV4KTsKLSAgLy8gRG8gbm90aGluZyBpbiBTVVNQRU5ERUQgc3RhdGUuCi0gIGlmIChvdXQtPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19BMkRQX1NUQVRFX1NVU1BFTkRFRCkKLSAgICByZXRWYWwgPSBzdXNwZW5kX2F1ZGlvX2RhdGFwYXRoKCZvdXQtPmNvbW1vbiwgdHJ1ZSk7Ci0gIG91dC0+ZnJhbWVzX3JlbmRlcmVkID0gMDsgIC8vIHJlbmRlcmVkIGlzIHJlc2V0LCBwcmVzZW50ZWQgaXMgbm90Ci0KLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotc3RhdGljIGludCBvdXRfZHVtcChVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGludCBmZCkgewotICBGTkxPRygpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdXRfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga3ZwYWlycykgewotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGEyZHBfc3RyZWFtX291dCopc3RyZWFtOwotCi0gIElORk8oInN0YXRlICVkIGt2cGFpcnMgJXMiLCBvdXQtPmNvbW1vbi5zdGF0ZSwga3ZwYWlycyk7Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyYW1zID0KLSAgICAgIGhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMoa3ZwYWlycyk7Ci0gIGludCBzdGF0dXMgPSAwOwotCi0gIGlmIChwYXJhbXMuZW1wdHkoKSkgcmV0dXJuIHN0YXR1czsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKm91dC0+Y29tbW9uLm11dGV4KTsKLQotICAvKiBkdW1wIHBhcmFtcyAqLwotICBoYXNoX21hcF91dGlsc19kdW1wX3N0cmluZ19rZXlzX3N0cmluZ192YWx1ZXMocGFyYW1zKTsKLQotICBpZiAocGFyYW1zWyJjbG9zaW5nIl0uY29tcGFyZSgidHJ1ZSIpID09IDApIHsKLSAgICBERUJVRygic3RyZWFtIGNsb3NpbmcsIGRpc2FsbG93IGFueSB3cml0ZXMiKTsKLSAgICBvdXQtPmNvbW1vbi5zdGF0ZSA9IEFVRElPX0EyRFBfU1RBVEVfU1RPUFBJTkc7Ci0gIH0KLQotICBpZiAocGFyYW1zWyJBMmRwU3VzcGVuZGVkIl0uY29tcGFyZSgidHJ1ZSIpID09IDApIHsKLSAgICBpZiAob3V0LT5jb21tb24uc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVEFSVEVEKQotICAgICAgc3RhdHVzID0gc3VzcGVuZF9hdWRpb19kYXRhcGF0aCgmb3V0LT5jb21tb24sIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBEbyBub3Qgc3RhcnQgdGhlIHN0cmVhbWluZyBhdXRvbWF0aWNhbGx5LiBJZiB0aGUgcGhvbmUgd2FzIHN0cmVhbWluZwotICAgICAqIHByaW9yIHRvIGJlaW5nIHN1c3BlbmRlZCwgdGhlIG5leHQgb3V0X3dyaXRlIHNoYWxsIHRyaWdnZXIgdGhlCi0gICAgICogQVZEVFAgc3RhcnQgcHJvY2VkdXJlICovCi0gICAgaWYgKG91dC0+Y29tbW9uLnN0YXRlID09IEFVRElPX0EyRFBfU1RBVEVfU1VTUEVOREVEKQotICAgICAgb3V0LT5jb21tb24uc3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NUQU5EQlk7Ci0gICAgLyogSXJyZXNwZWN0aXZlIG9mIHRoZSBzdGF0ZSwgcmV0dXJuIDAgKi8KLSAgfQotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBjaGFyKiBvdXRfZ2V0X3BhcmFtZXRlcnMoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXlzKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NhcGFiaWxpdHk7Ci0KLSAgc3RydWN0IGEyZHBfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqKXN0cmVhbTsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXMgPQotICAgICAgaGFzaF9tYXBfdXRpbHNfbmV3X2Zyb21fc3RyaW5nX3BhcmFtcyhrZXlzKTsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcmV0dXJuX3BhcmFtczsKLQotICBpZiAocGFyYW1zLmVtcHR5KCkpIHJldHVybiBzdHJkdXAoIiIpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqb3V0LT5jb21tb24ubXV0ZXgpOwotCi0gIGlmIChhMmRwX3JlYWRfb3V0cHV0X2F1ZGlvX2NvbmZpZygmb3V0LT5jb21tb24sICZjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHVwZGF0ZV9zdHJlYW1fY29uZmlnICovKSA8IDApIHsKLSAgICBFUlJPUigiYTJkcF9yZWFkX291dHB1dF9hdWRpb19jb25maWcgZmFpbGVkIik7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBmb3JtYXQKLSAgaWYgKHBhcmFtcy5maW5kKEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpICE9IHBhcmFtcy5lbmQoKSkgewotICAgIHN0ZDo6c3RyaW5nIHBhcmFtOwotICAgIGlmIChjb2RlY19jYXBhYmlsaXR5LmJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYpIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCkgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMikgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiOwotICAgIH0KLSAgICBpZiAocGFyYW0uZW1wdHkoKSkgewotICAgICAgRVJST1IoIkludmFsaWQgY29kZWMgY2FwYWJpbGl0eSBiaXRzX3Blcl9zYW1wbGU9MHgleCIsCi0gICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5LmJpdHNfcGVyX3NhbXBsZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybl9wYXJhbXNbQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUU10gPSBwYXJhbTsKLSAgICB9Ci0gIH0KLQotICAvLyBBZGQgdGhlIHNhbXBsZSByYXRlCi0gIGlmIChwYXJhbXMuZmluZChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykgIT0gcGFyYW1zLmVuZCgpKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGFyYW07Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjQ0MTAwIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjQ4MDAwIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjg4MjAwIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjk2MDAwIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwKSB7Ci0gICAgICBpZiAoIXBhcmFtLmVtcHR5KCkpIHBhcmFtICs9ICJ8IjsKLSAgICAgIHBhcmFtICs9ICIxNzY0MDAiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjE5MjAwMCI7Ci0gICAgfQotICAgIGlmIChwYXJhbS5lbXB0eSgpKSB7Ci0gICAgICBFUlJPUigiSW52YWxpZCBjb2RlYyBjYXBhYmlsaXR5IHNhbXBsZV9yYXRlPTB4JXgiLAotICAgICAgICAgICAgY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybl9wYXJhbXNbQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVNdID0gcGFyYW07Ci0gICAgfQotICB9Ci0KLSAgLy8gQWRkIHRoZSBjaGFubmVsIG1hc2sKLSAgaWYgKHBhcmFtcy5maW5kKEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSAhPSBwYXJhbXMuZW5kKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBwYXJhbTsKLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5jaGFubmVsX21vZGUgJiBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk8pIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIkFVRElPX0NIQU5ORUxfT1VUX01PTk8iOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5jaGFubmVsX21vZGUgJiBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIjsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLmVtcHR5KCkpIHsKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGNvZGVjIGNhcGFiaWxpdHkgY2hhbm5lbF9tb2RlPTB4JXgiLAotICAgICAgICAgICAgY29kZWNfY2FwYWJpbGl0eS5jaGFubmVsX21vZGUpOwotICAgICAgZ290byBkb25lOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm5fcGFyYW1zW0FVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTXSA9IHBhcmFtOwotICAgIH0KLSAgfQotCi1kb25lOgotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGZvciAoY29uc3QgYXV0byYgcHRyIDogcmV0dXJuX3BhcmFtcykgewotICAgIHJlc3VsdCArPSBwdHIuZmlyc3QgKyAiPSIgKyBwdHIuc2Vjb25kICsgIjsiOwotICB9Ci0KLSAgSU5GTygiZ2V0IHBhcmFtZXRlcnMgcmVzdWx0ID0gJXMiLCByZXN1bHQuY19zdHIoKSk7Ci0KLSAgcmV0dXJuIHN0cmR1cChyZXN1bHQuY19zdHIoKSk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBvdXRfZ2V0X2xhdGVuY3koY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSkgewotICBpbnQgbGF0ZW5jeV91czsKLQotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGEyZHBfc3RyZWFtX291dCopc3RyZWFtOwotCi0gIEZOTE9HKCk7Ci0KLSAgbGF0ZW5jeV91cyA9Ci0gICAgICAoKG91dC0+Y29tbW9uLmJ1ZmZlcl9zeiAqIDEwMDApIC8KLSAgICAgICBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUoJm91dC0+c3RyZWFtKSAvIG91dC0+Y29tbW9uLmNmZy5yYXRlKSAqCi0gICAgICAxMDAwOwotCi0gIHJldHVybiAobGF0ZW5jeV91cyAvIDEwMDApICsgMjAwOwotfQotCi1zdGF0aWMgaW50IG91dF9zZXRfdm9sdW1lKFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGZsb2F0IGxlZnQsIFVOVVNFRF9BVFRSIGZsb2F0IHJpZ2h0KSB7Ci0gIEZOTE9HKCk7Ci0KLSAgLyogdm9sdW1lIGNvbnRyb2xsZWQgaW4gYXVkaW9mbGluZ2VyIG1peGVyIChkaWdpdGFsKSAqLwotCi0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IG91dF9nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyogdGltZXN0YW1wKSB7Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgRk5MT0coKTsKLSAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGZyYW1lcyA9PSBOVUxMIHx8IHRpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gLUVJTlZBTDsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKm91dC0+Y29tbW9uLm11dGV4KTsKLQotICAvLyBieXRlcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgYnkgdGhlIEJsdWV0b290aCBzdGFjayB0byBhCi0gIC8vIHJlbW90ZSBoZWFkc2V0Ci0gIHVpbnQ2NF90IGJ5dGVzID0gMDsKLQotICAvLyBkZWxheV9yZXBvcnQgaXMgdGhlIGF1ZGlvIGRlbGF5IGZyb20gdGhlIHJlbW90ZSBoZWFkc2V0IHJlY2VpdmluZyBkYXRhIHRvCi0gIC8vIHRoZSBoZWFkc2V0IHBsYXlpbmcgc291bmQgaW4gdW5pdHMgb2YgMS8xMG1zCi0gIHVpbnQxNl90IGRlbGF5X3JlcG9ydCA9IDA7Ci0KLSAgLy8gSWYgZm9yIHNvbWUgcmVhc29uIGdldHRpbmcgYSBkZWxheSBmYWlscyBvciBkZWxheSByZXBvcnRzIGFyZSBkaXNhYmxlZCwKLSAgLy8gZGVmYXVsdCB0byBvbGQgZGVsYXkKLSAgaWYgKGVuYWJsZV9kZWxheV9yZXBvcnRpbmcgJiYKLSAgICAgIGEyZHBfZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbl9jbWQoJm91dC0+Y29tbW9uLCAmYnl0ZXMsICZkZWxheV9yZXBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCkgPT0gMCkgewotICAgIHVpbnQ2NF90IGRlbGF5X25zID0gZGVsYXlfcmVwb3J0ICogREVMQVlfVE9fTlM7Ci0gICAgaWYgKGRlbGF5X25zID4gTUlOX0RFTEFZX01TICogTVNfVE9fTlMgJiYKLSAgICAgICAgZGVsYXlfbnMgPCBNQVhfREVMQVlfTVMgKiBNU19UT19OUykgewotICAgICAgKmZyYW1lcyA9IGJ5dGVzIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKHN0cmVhbSk7Ci0KLSAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyArPSBkZWxheV9uczsKLSAgICAgIGlmICh0aW1lc3RhbXAtPnR2X25zZWMgPiAxICogU0VDX1RPX05TKSB7Ci0gICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjKys7Ci0gICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyAtPSBTRUNfVE9fTlM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICB1aW50NjRfdCBsYXRlbmN5X2ZyYW1lcyA9Ci0gICAgICAodWludDY0X3Qpb3V0X2dldF9sYXRlbmN5KHN0cmVhbSkgKiBvdXQtPmNvbW1vbi5jZmcucmF0ZSAvIDEwMDA7Ci0gIGlmIChvdXQtPmZyYW1lc19wcmVzZW50ZWQgPj0gbGF0ZW5jeV9mcmFtZXMpIHsKLSAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgdGltZXN0YW1wKTsKLSAgICAqZnJhbWVzID0gb3V0LT5mcmFtZXNfcHJlc2VudGVkIC0gbGF0ZW5jeV9mcmFtZXM7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gLUVXT1VMREJMT0NLOwotfQotCi1zdGF0aWMgaW50IG91dF9nZXRfcmVuZGVyX3Bvc2l0aW9uKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3BfZnJhbWVzKSB7Ci0gIHN0cnVjdCBhMmRwX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgRk5MT0coKTsKLSAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGRzcF9mcmFtZXMgPT0gTlVMTCkgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCpvdXQtPmNvbW1vbi5tdXRleCk7Ci0gIHVpbnQ2NF90IGxhdGVuY3lfZnJhbWVzID0KLSAgICAgICh1aW50NjRfdClvdXRfZ2V0X2xhdGVuY3koc3RyZWFtKSAqIG91dC0+Y29tbW9uLmNmZy5yYXRlIC8gMTAwMDsKLSAgaWYgKG91dC0+ZnJhbWVzX3JlbmRlcmVkID49IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgKmRzcF9mcmFtZXMgPSAodWludDMyX3QpKG91dC0+ZnJhbWVzX3JlbmRlcmVkIC0gbGF0ZW5jeV9mcmFtZXMpOwotICB9IGVsc2UgewotICAgICpkc3BfZnJhbWVzID0gMDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdXRfYWRkX2F1ZGlvX2VmZmVjdChVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3QpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3JlbW92ZV9hdWRpb19lZmZlY3QoCi0gICAgVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgIFVOVVNFRF9BVFRSIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3QpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBVURJTyBJTlBVVCBTVFJFQU0KLSAqLwotCi1zdGF0aWMgdWludDMyX3QgaW5fZ2V0X3NhbXBsZV9yYXRlKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qIGluID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9pbiopc3RyZWFtOwotCi0gIEZOTE9HKCk7Ci0gIHJldHVybiBpbi0+Y29tbW9uLmNmZy5yYXRlOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sIHVpbnQzMl90IHJhdGUpIHsKLSAgc3RydWN0IGEyZHBfc3RyZWFtX2luKiBpbiA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qKXN0cmVhbTsKLQotICBGTkxPRygpOwotCi0gIGlmIChpbi0+Y29tbW9uLmNmZy5yYXRlID4gMCAmJiBpbi0+Y29tbW9uLmNmZy5yYXRlID09IHJhdGUpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBzaXplX3QgaW5fZ2V0X2J1ZmZlcl9zaXplKAotICAgIFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBGTkxPRygpOwotICByZXR1cm4gMzIwOwotfQotCi1zdGF0aWMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5fZ2V0X2NoYW5uZWxzKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qIGluID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9pbiopc3RyZWFtOwotCi0gIEZOTE9HKCk7Ci0gIHJldHVybiAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpaW4tPmNvbW1vbi5jZmcuY2hhbm5lbF9tYXNrOwotfQotCi1zdGF0aWMgYXVkaW9fZm9ybWF0X3QgaW5fZ2V0X2Zvcm1hdCgKLSAgICBVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9mb3JtYXQoVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICBGTkxPRygpOwotICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGluX3N0YW5kYnkoVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKSB7Ci0gIEZOTE9HKCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX2R1bXAoVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGludCBmZCkgewotICBGTkxPRygpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbl9zZXRfcGFyYW1ldGVycyhVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IGNoYXIqIGt2cGFpcnMpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyKiBpbl9nZXRfcGFyYW1ldGVycyhVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgY2hhcioga2V5cykgewotICBGTkxPRygpOwotICByZXR1cm4gc3RyZHVwKCIiKTsKLX0KLQotc3RhdGljIGludCBpbl9zZXRfZ2FpbihVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGZsb2F0IGdhaW4pIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGluX3JlYWQoc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykgewotICBzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qIGluID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9pbiopc3RyZWFtOwotICBpbnQgcmVhZDsKLSAgaW50IHVzX2RlbGF5OwotCi0gIERFQlVHKCJyZWFkICV6dSBieXRlcywgc3RhdGU6ICVkIiwgYnl0ZXMsIGluLT5jb21tb24uc3RhdGUpOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKmluLT5jb21tb24ubXV0ZXgpOwotICBpZiAoaW4tPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19BMkRQX1NUQVRFX1NVU1BFTkRFRCB8fAotICAgICAgaW4tPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19BMkRQX1NUQVRFX1NUT1BQSU5HKSB7Ci0gICAgREVCVUcoInN0cmVhbSBzdXNwZW5kZWQiKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgLyogb25seSBhbGxvdyBhdXRvc3RhcnRpbmcgaWYgd2UgYXJlIGluIHN0b3BwZWQgb3Igc3RhbmRieSAqLwotICBpZiAoKGluLT5jb21tb24uc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVE9QUEVEKSB8fAotICAgICAgKGluLT5jb21tb24uc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVEFOREJZKSkgewotICAgIGlmIChzdGFydF9hdWRpb19kYXRhcGF0aCgmaW4tPmNvbW1vbikgPCAwKSB7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgfSBlbHNlIGlmIChpbi0+Y29tbW9uLnN0YXRlICE9IEFVRElPX0EyRFBfU1RBVEVfU1RBUlRFRCkgewotICAgIEVSUk9SKCJzdHJlYW0gbm90IGluIHN0b3BwZWQgb3Igc3RhbmRieSIpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBsb2NrLnVubG9jaygpOwotICByZWFkID0gc2t0X3JlYWQoaW4tPmNvbW1vbi5hdWRpb19mZCwgYnVmZmVyLCBieXRlcyk7Ci0gIGxvY2subG9jaygpOwotICBpZiAocmVhZCA9PSAtMSkgewotICAgIHNrdF9kaXNjb25uZWN0KGluLT5jb21tb24uYXVkaW9fZmQpOwotICAgIGluLT5jb21tb24uYXVkaW9fZmQgPSBBVURJT19TS1RfRElTQ09OTkVDVEVEOwotICAgIGlmICgoaW4tPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19BMkRQX1NUQVRFX1NVU1BFTkRFRCkgJiYKLSAgICAgICAgKGluLT5jb21tb24uc3RhdGUgIT0gQVVESU9fQTJEUF9TVEFURV9TVE9QUElORykpIHsKLSAgICAgIGluLT5jb21tb24uc3RhdGUgPSBBVURJT19BMkRQX1NUQVRFX1NUT1BQRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVSUk9SKCJyZWFkIGZhaWxlZCA6IHN0cmVhbSBzdXNwZW5kZWQsIGF2b2lkIHJlc2V0dGluZyBzdGF0ZSIpOwotICAgIH0KLSAgICBnb3RvIGVycm9yOwotICB9IGVsc2UgaWYgKHJlYWQgPT0gMCkgewotICAgIERFQlVHKCJyZWFkIHRpbWUgb3V0IC0gcmV0dXJuIHplcm9zIik7Ci0gICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXMpOwotICAgIHJlYWQgPSBieXRlczsKLSAgfQotICBsb2NrLnVubG9jaygpOwotCi0gIERFQlVHKCJyZWFkICVkIGJ5dGVzIG91dCBvZiAlenUgYnl0ZXMiLCByZWFkLCBieXRlcyk7Ci0gIHJldHVybiByZWFkOwotCi1lcnJvcjoKLSAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXMpOwotICB1c19kZWxheSA9IGNhbGNfYXVkaW90aW1lX3VzZWMoaW4tPmNvbW1vbi5jZmcsIGJ5dGVzKTsKLSAgREVCVUcoImVtdWxhdGUgYTJkcCByZWFkIGRlbGF5ICglZCB1cykiLCB1c19kZWxheSk7Ci0KLSAgdXNsZWVwKHVzX2RlbGF5KTsKLSAgcmV0dXJuIGJ5dGVzOwotfQotCi1zdGF0aWMgdWludDMyX3QgaW5fZ2V0X2lucHV0X2ZyYW1lc19sb3N0KAotICAgIFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSkgewotICBGTkxPRygpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbl9hZGRfYXVkaW9fZWZmZWN0KFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0KSB7Ci0gIEZOTE9HKCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX3JlbW92ZV9hdWRpb19lZmZlY3QoVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3QpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZGV2X29wZW5fb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnKiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0Kiogc3RyZWFtX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgY2hhciogYWRkcmVzcykKLQotewotICBzdHJ1Y3QgYTJkcF9hdWRpb19kZXZpY2UqIGEyZHBfZGV2ID0gKHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSopZGV2OwotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQ7Ci0gIGludCByZXQgPSAwOwotCi0gIElORk8oIm9wZW5pbmcgb3V0cHV0Iik7Ci0gIC8vIHByb3RlY3QgYWdhaW5zdCBhZGV2LT5vdXRwdXQgYW5kIHN0cmVhbV9vdXQgZnJvbSBiZWluZyBpbmNvbnNpc3RlbnQKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCphMmRwX2Rldi0+bXV0ZXgpOwotICBvdXQgPSAoc3RydWN0IGEyZHBfc3RyZWFtX291dCopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KSk7Ci0KLSAgaWYgKCFvdXQpIHJldHVybiAtRU5PTUVNOwotCi0gIG91dC0+c3RyZWFtLmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUgPSBvdXRfZ2V0X3NhbXBsZV9yYXRlOwotICBvdXQtPnN0cmVhbS5jb21tb24uc2V0X3NhbXBsZV9yYXRlID0gb3V0X3NldF9zYW1wbGVfcmF0ZTsKLSAgb3V0LT5zdHJlYW0uY29tbW9uLmdldF9idWZmZXJfc2l6ZSA9IG91dF9nZXRfYnVmZmVyX3NpemU7Ci0gIG91dC0+c3RyZWFtLmNvbW1vbi5nZXRfY2hhbm5lbHMgPSBvdXRfZ2V0X2NoYW5uZWxzOwotICBvdXQtPnN0cmVhbS5jb21tb24uZ2V0X2Zvcm1hdCA9IG91dF9nZXRfZm9ybWF0OwotICBvdXQtPnN0cmVhbS5jb21tb24uc2V0X2Zvcm1hdCA9IG91dF9zZXRfZm9ybWF0OwotICBvdXQtPnN0cmVhbS5jb21tb24uc3RhbmRieSA9IG91dF9zdGFuZGJ5OwotICBvdXQtPnN0cmVhbS5jb21tb24uZHVtcCA9IG91dF9kdW1wOwotICBvdXQtPnN0cmVhbS5jb21tb24uc2V0X3BhcmFtZXRlcnMgPSBvdXRfc2V0X3BhcmFtZXRlcnM7Ci0gIG91dC0+c3RyZWFtLmNvbW1vbi5nZXRfcGFyYW1ldGVycyA9IG91dF9nZXRfcGFyYW1ldGVyczsKLSAgb3V0LT5zdHJlYW0uY29tbW9uLmFkZF9hdWRpb19lZmZlY3QgPSBvdXRfYWRkX2F1ZGlvX2VmZmVjdDsKLSAgb3V0LT5zdHJlYW0uY29tbW9uLnJlbW92ZV9hdWRpb19lZmZlY3QgPSBvdXRfcmVtb3ZlX2F1ZGlvX2VmZmVjdDsKLSAgb3V0LT5zdHJlYW0uZ2V0X2xhdGVuY3kgPSBvdXRfZ2V0X2xhdGVuY3k7Ci0gIG91dC0+c3RyZWFtLnNldF92b2x1bWUgPSBvdXRfc2V0X3ZvbHVtZTsKLSAgb3V0LT5zdHJlYW0ud3JpdGUgPSBvdXRfd3JpdGU7Ci0gIG91dC0+c3RyZWFtLmdldF9yZW5kZXJfcG9zaXRpb24gPSBvdXRfZ2V0X3JlbmRlcl9wb3NpdGlvbjsKLSAgb3V0LT5zdHJlYW0uZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9IG91dF9nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uOwotCi0gIC8qIGluaXRpYWxpemUgYTJkcCBzcGVjaWZpY3MgKi8KLSAgYTJkcF9zdHJlYW1fY29tbW9uX2luaXQoJm91dC0+Y29tbW9uKTsKLQotICAvLyBNYWtlIHN1cmUgd2UgYWx3YXlzIGhhdmUgdGhlIGZlZWRpbmcgcGFyYW1ldGVycyBjb25maWd1cmVkCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWc7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jYXBhYmlsaXR5OwotICBpZiAoYTJkcF9yZWFkX291dHB1dF9hdWRpb19jb25maWcoJm91dC0+Y29tbW9uLCAmY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHVwZGF0ZV9zdHJlYW1fY29uZmlnICovKSA8IDApIHsKLSAgICBFUlJPUigiYTJkcF9yZWFkX291dHB1dF9hdWRpb19jb25maWcgZmFpbGVkIik7Ci0gICAgcmV0ID0gLTE7Ci0gICAgZ290byBlcnJfb3BlbjsKLSAgfQotICAvLyBhMmRwX3JlYWRfb3V0cHV0X2F1ZGlvX2NvbmZpZygpIG9wZW5zIHRoZSBzb2NrZXQgY29udHJvbCBwYXRoIChvciBmYWlscykKLQotICAvKiBzZXQgb3V0cHV0IGNvbmZpZyB2YWx1ZXMgKi8KLSAgaWYgKGNvbmZpZyAhPSBudWxscHRyKSB7Ci0gICAgLy8gVHJ5IHRvIHVzZSB0aGUgY29uZmlnIHBhcmFtZXRlcnMgYW5kIHNlbmQgaXQgdG8gdGhlIHJlbW90ZSBzaWRlCi0gICAgLy8gVE9ETzogU2hhbGwgd2UgdXNlIG91dF9zZXRfZm9ybWF0KCkgYW5kIHNpbWlsYXI/Ci0gICAgaWYgKGNvbmZpZy0+Zm9ybWF0ICE9IDApIG91dC0+Y29tbW9uLmNmZy5mb3JtYXQgPSBjb25maWctPmZvcm1hdDsKLSAgICBpZiAoY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSAwKSBvdXQtPmNvbW1vbi5jZmcucmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7Ci0gICAgaWYgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IDApCi0gICAgICBvdXQtPmNvbW1vbi5jZmcuY2hhbm5lbF9tYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7Ci0gICAgaWYgKChvdXQtPmNvbW1vbi5jZmcuZm9ybWF0ICE9IDApIHx8IChvdXQtPmNvbW1vbi5jZmcucmF0ZSAhPSAwKSB8fAotICAgICAgICAob3V0LT5jb21tb24uY2ZnLmNoYW5uZWxfbWFzayAhPSAwKSkgewotICAgICAgaWYgKGEyZHBfd3JpdGVfb3V0cHV0X2F1ZGlvX2NvbmZpZygmb3V0LT5jb21tb24pIDwgMCkgewotICAgICAgICBFUlJPUigiYTJkcF93cml0ZV9vdXRwdXRfYXVkaW9fY29uZmlnIGZhaWxlZCIpOwotICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgZ290byBlcnJfb3BlbjsKLSAgICAgIH0KLSAgICAgIC8vIFJlYWQgYWdhaW4gYW5kIG1ha2Ugc3VyZSB3ZSB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgcmVtb3RlIHNpZGUKLSAgICAgIGlmIChhMmRwX3JlYWRfb3V0cHV0X2F1ZGlvX2NvbmZpZygmb3V0LT5jb21tb24sICZjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB1cGRhdGVfc3RyZWFtX2NvbmZpZyAqLykgPCAwKSB7Ci0gICAgICAgIEVSUk9SKCJhMmRwX3JlYWRfb3V0cHV0X2F1ZGlvX2NvbmZpZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIGdvdG8gZXJyX29wZW47Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbmZpZy0+Zm9ybWF0ID0gb3V0X2dldF9mb3JtYXQoKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qKSZvdXQtPnN0cmVhbSk7Ci0gICAgY29uZmlnLT5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgIG91dF9nZXRfc2FtcGxlX3JhdGUoKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qKSZvdXQtPnN0cmVhbSk7Ci0gICAgY29uZmlnLT5jaGFubmVsX21hc2sgPQotICAgICAgICBvdXRfZ2V0X2NoYW5uZWxzKChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKikmb3V0LT5zdHJlYW0pOwotCi0gICAgSU5GTygKLSAgICAgICAgIk91dHB1dCBzdHJlYW0gY29uZmlnOiBmb3JtYXQ9MHgleCBzYW1wbGVfcmF0ZT0lZCBjaGFubmVsX21hc2s9MHgleCAiCi0gICAgICAgICJidWZmZXJfc3o9JXp1IiwKLSAgICAgICAgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICBvdXQtPmNvbW1vbi5idWZmZXJfc3opOwotICB9Ci0gICpzdHJlYW1fb3V0ID0gJm91dC0+c3RyZWFtOwotICBhMmRwX2Rldi0+b3V0cHV0ID0gb3V0OwotCi0gIERFQlVHKCJzdWNjZXNzIik7Ci0gIC8qIERlbGF5IHRvIGVuc3VyZSBIZWFkc2V0IGlzIGluIHByb3BlciBzdGF0ZSB3aGVuIFNUQVJUIGlzIGluaXRpYXRlZCBmcm9tCi0gICAqIERVVCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29ubmVjdGlvbiBkdWUgdG8gb25nb2luZyBtdXNpYyBwbGF5YmFjay4gKi8KLSAgdXNsZWVwKDI1MDAwMCk7Ci0gIHJldHVybiAwOwotCi1lcnJfb3BlbjoKLSAgYTJkcF9zdHJlYW1fY29tbW9uX2Rlc3Ryb3koJm91dC0+Y29tbW9uKTsKLSAgZnJlZShvdXQpOwotICAqc3RyZWFtX291dCA9IE5VTEw7Ci0gIGEyZHBfZGV2LT5vdXRwdXQgPSBOVUxMOwotICBFUlJPUigiZmFpbGVkIik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZXZfY2xvc2Vfb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSkgewotICBzdHJ1Y3QgYTJkcF9hdWRpb19kZXZpY2UqIGEyZHBfZGV2ID0gKHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSopZGV2OwotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGEyZHBfc3RyZWFtX291dCopc3RyZWFtOwotCi0gIElORk8oIiVzOiBzdGF0ZSAlZCIsIF9fZnVuY19fLCBvdXQtPmNvbW1vbi5zdGF0ZSk7Ci0KLSAgLy8gcHJldmVudCBpbnRlcmZlcmVuY2Ugd2l0aCBhZGV2X3NldF9wYXJhbWV0ZXJzLgotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKmEyZHBfZGV2LT5tdXRleCk7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKm91dC0+Y29tbW9uLm11dGV4KTsKLSAgICBjb25zdCBhMmRwX3N0YXRlX3Qgc3RhdGUgPSBvdXQtPmNvbW1vbi5zdGF0ZTsKLSAgICBJTkZPKCJjbG9zaW5nIG91dHB1dCAoc3RhdGUgJWQpIiwgKGludClzdGF0ZSk7Ci0gICAgaWYgKChzdGF0ZSA9PSBBVURJT19BMkRQX1NUQVRFX1NUQVJURUQpIHx8Ci0gICAgICAgIChzdGF0ZSA9PSBBVURJT19BMkRQX1NUQVRFX1NUT1BQSU5HKSkgewotICAgICAgc3RvcF9hdWRpb19kYXRhcGF0aCgmb3V0LT5jb21tb24pOwotICAgIH0KLQotICAgIHNrdF9kaXNjb25uZWN0KG91dC0+Y29tbW9uLmN0cmxfZmQpOwotICAgIG91dC0+Y29tbW9uLmN0cmxfZmQgPSBBVURJT19TS1RfRElTQ09OTkVDVEVEOwotICB9Ci0KLSAgYTJkcF9zdHJlYW1fY29tbW9uX2Rlc3Ryb3koJm91dC0+Y29tbW9uKTsKLSAgZnJlZShzdHJlYW0pOwotICBhMmRwX2Rldi0+b3V0cHV0ID0gTlVMTDsKLQotICBERUJVRygiZG9uZSIpOwotfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGt2cGFpcnMpIHsKLSAgc3RydWN0IGEyZHBfYXVkaW9fZGV2aWNlKiBhMmRwX2RldiA9IChzdHJ1Y3QgYTJkcF9hdWRpb19kZXZpY2UqKWRldjsKLSAgaW50IHJldHZhbCA9IDA7Ci0KLSAgLy8gcHJldmVudCBpbnRlcmZlcmVuY2Ugd2l0aCBhZGV2X2Nsb3NlX291dHB1dF9zdHJlYW0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCphMmRwX2Rldi0+bXV0ZXgpOwotICBzdHJ1Y3QgYTJkcF9zdHJlYW1fb3V0KiBvdXQgPSBhMmRwX2Rldi0+b3V0cHV0OwotCi0gIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuIHJldHZhbDsKLQotICBJTkZPKCJzdGF0ZSAlZCIsIG91dC0+Y29tbW9uLnN0YXRlKTsKLQotICByZXR2YWwgPQotICAgICAgb3V0LT5zdHJlYW0uY29tbW9uLnNldF9wYXJhbWV0ZXJzKChzdHJ1Y3QgYXVkaW9fc3RyZWFtKilvdXQsIGt2cGFpcnMpOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjaGFyKiBhZGV2X2dldF9wYXJhbWV0ZXJzKFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleXMpIHsKLSAgRk5MT0coKTsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXMgPQotICAgICAgaGFzaF9tYXBfdXRpbHNfbmV3X2Zyb21fc3RyaW5nX3BhcmFtcyhrZXlzKTsKLSAgaGFzaF9tYXBfdXRpbHNfZHVtcF9zdHJpbmdfa2V5c19zdHJpbmdfdmFsdWVzKHBhcmFtcyk7Ci0KLSAgcmV0dXJuIHN0cmR1cCgiIik7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9pbml0X2NoZWNrKFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldikgewotICBGTkxPRygpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X3ZvaWNlX3ZvbHVtZShVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBmbG9hdCB2b2x1bWUpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBhZGV2X3NldF9tYXN0ZXJfdm9sdW1lKFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBmbG9hdCB2b2x1bWUpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBhZGV2X3NldF9tb2RlKFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBhdWRpb19tb2RlX3QgbW9kZSkgewotICBGTkxPRygpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X21pY19tdXRlKFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYm9vbCBzdGF0ZSkgewotICBGTkxPRygpOwotCi0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IGFkZXZfZ2V0X21pY19tdXRlKFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYm9vbCogc3RhdGUpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIHNpemVfdCBhZGV2X2dldF9pbnB1dF9idWZmZXJfc2l6ZSgKLSAgICBVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyogY29uZmlnKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgcmV0dXJuIDMyMDsKLX0KLQotc3RhdGljIGludCBhZGV2X29wZW5faW5wdXRfc3RyZWFtKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX2NvbmZpZyogY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1faW4qKiBzdHJlYW1faW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCBjaGFyKiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewotICBzdHJ1Y3QgYTJkcF9hdWRpb19kZXZpY2UqIGEyZHBfZGV2ID0gKHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSopZGV2OwotICBzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qIGluOwotICBpbnQgcmV0OwotCi0gIEZOTE9HKCk7Ci0KLSAgLy8gcHJvdGVjdCBhZ2FpbnN0IGFkZXYtPmlucHV0IGFuZCBzdHJlYW1faW4gZnJvbSBiZWluZyBpbmNvbnNpc3RlbnQKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCphMmRwX2Rldi0+bXV0ZXgpOwotICBpbiA9IChzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGEyZHBfc3RyZWFtX2luKSk7Ci0KLSAgaWYgKCFpbikgcmV0dXJuIC1FTk9NRU07Ci0KLSAgaW4tPnN0cmVhbS5jb21tb24uZ2V0X3NhbXBsZV9yYXRlID0gaW5fZ2V0X3NhbXBsZV9yYXRlOwotICBpbi0+c3RyZWFtLmNvbW1vbi5zZXRfc2FtcGxlX3JhdGUgPSBpbl9zZXRfc2FtcGxlX3JhdGU7Ci0gIGluLT5zdHJlYW0uY29tbW9uLmdldF9idWZmZXJfc2l6ZSA9IGluX2dldF9idWZmZXJfc2l6ZTsKLSAgaW4tPnN0cmVhbS5jb21tb24uZ2V0X2NoYW5uZWxzID0gaW5fZ2V0X2NoYW5uZWxzOwotICBpbi0+c3RyZWFtLmNvbW1vbi5nZXRfZm9ybWF0ID0gaW5fZ2V0X2Zvcm1hdDsKLSAgaW4tPnN0cmVhbS5jb21tb24uc2V0X2Zvcm1hdCA9IGluX3NldF9mb3JtYXQ7Ci0gIGluLT5zdHJlYW0uY29tbW9uLnN0YW5kYnkgPSBpbl9zdGFuZGJ5OwotICBpbi0+c3RyZWFtLmNvbW1vbi5kdW1wID0gaW5fZHVtcDsKLSAgaW4tPnN0cmVhbS5jb21tb24uc2V0X3BhcmFtZXRlcnMgPSBpbl9zZXRfcGFyYW1ldGVyczsKLSAgaW4tPnN0cmVhbS5jb21tb24uZ2V0X3BhcmFtZXRlcnMgPSBpbl9nZXRfcGFyYW1ldGVyczsKLSAgaW4tPnN0cmVhbS5jb21tb24uYWRkX2F1ZGlvX2VmZmVjdCA9IGluX2FkZF9hdWRpb19lZmZlY3Q7Ci0gIGluLT5zdHJlYW0uY29tbW9uLnJlbW92ZV9hdWRpb19lZmZlY3QgPSBpbl9yZW1vdmVfYXVkaW9fZWZmZWN0OwotICBpbi0+c3RyZWFtLnNldF9nYWluID0gaW5fc2V0X2dhaW47Ci0gIGluLT5zdHJlYW0ucmVhZCA9IGluX3JlYWQ7Ci0gIGluLT5zdHJlYW0uZ2V0X2lucHV0X2ZyYW1lc19sb3N0ID0gaW5fZ2V0X2lucHV0X2ZyYW1lc19sb3N0OwotCi0gIC8qIGluaXRpYWxpemUgYTJkcCBzcGVjaWZpY3MgKi8KLSAgYTJkcF9zdHJlYW1fY29tbW9uX2luaXQoJmluLT5jb21tb24pOwotCi0gICpzdHJlYW1faW4gPSAmaW4tPnN0cmVhbTsKLSAgYTJkcF9kZXYtPmlucHV0ID0gaW47Ci0KLSAgaWYgKGEyZHBfcmVhZF9pbnB1dF9hdWRpb19jb25maWcoJmluLT5jb21tb24pIDwgMCkgewotICAgIEVSUk9SKCJhMmRwX3JlYWRfaW5wdXRfYXVkaW9fY29uZmlnIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXQgPSAtMTsKLSAgICBnb3RvIGVycl9vcGVuOwotICB9Ci0gIC8vIGEyZHBfcmVhZF9pbnB1dF9hdWRpb19jb25maWcoKSBvcGVucyBzb2NrZXQgY29udHJvbCBwYXRoIChvciBmYWlscykKLQotICBERUJVRygic3VjY2VzcyIpOwotICByZXR1cm4gMDsKLQotZXJyX29wZW46Ci0gIGEyZHBfc3RyZWFtX2NvbW1vbl9kZXN0cm95KCZpbi0+Y29tbW9uKTsKLSAgZnJlZShpbik7Ci0gICpzdHJlYW1faW4gPSBOVUxMOwotICBhMmRwX2Rldi0+aW5wdXQgPSBOVUxMOwotICBFUlJPUigiZmFpbGVkIik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZXZfY2xvc2VfaW5wdXRfc3RyZWFtKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSkgewotICBzdHJ1Y3QgYTJkcF9hdWRpb19kZXZpY2UqIGEyZHBfZGV2ID0gKHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSopZGV2OwotICBzdHJ1Y3QgYTJkcF9zdHJlYW1faW4qIGluID0gKHN0cnVjdCBhMmRwX3N0cmVhbV9pbiopc3RyZWFtOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqYTJkcF9kZXYtPm11dGV4KTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqaW4tPmNvbW1vbi5tdXRleCk7Ci0gICAgY29uc3QgYTJkcF9zdGF0ZV90IHN0YXRlID0gaW4tPmNvbW1vbi5zdGF0ZTsKLSAgICBJTkZPKCJjbG9zaW5nIGlucHV0IChzdGF0ZSAlZCkiLCAoaW50KXN0YXRlKTsKLQotICAgIGlmICgoc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVEFSVEVEKSB8fAotICAgICAgICAoc3RhdGUgPT0gQVVESU9fQTJEUF9TVEFURV9TVE9QUElORykpCi0gICAgICBzdG9wX2F1ZGlvX2RhdGFwYXRoKCZpbi0+Y29tbW9uKTsKLQotICAgIHNrdF9kaXNjb25uZWN0KGluLT5jb21tb24uY3RybF9mZCk7Ci0gICAgaW4tPmNvbW1vbi5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgfQotICBhMmRwX3N0cmVhbV9jb21tb25fZGVzdHJveSgmaW4tPmNvbW1vbik7Ci0gIGZyZWUoc3RyZWFtKTsKLSAgYTJkcF9kZXYtPmlucHV0ID0gTlVMTDsKLQotICBERUJVRygiZG9uZSIpOwotfQotCi1zdGF0aWMgaW50IGFkZXZfZHVtcChVTlVTRURfQVRUUiBjb25zdCBhdWRpb19od19kZXZpY2VfdCogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgaW50IGZkKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9jbG9zZShod19kZXZpY2VfdCogZGV2aWNlKSB7Ci0gIHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSogYTJkcF9kZXYgPSAoc3RydWN0IGEyZHBfYXVkaW9fZGV2aWNlKilkZXZpY2U7Ci0gIEZOTE9HKCk7Ci0KLSAgZGVsZXRlIGEyZHBfZGV2LT5tdXRleDsKLSAgYTJkcF9kZXYtPm11dGV4ID0gbnVsbHB0cjsKLSAgZnJlZShkZXZpY2UpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZGV2X29wZW4oY29uc3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGh3X2RldmljZV90KiogZGV2aWNlKSB7Ci0gIHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSogYWRldjsKLQotICBJTkZPKCIgYWRldl9vcGVuIGluIEEyZHBfaHcgbW9kdWxlIik7Ci0gIEZOTE9HKCk7Ci0KLSAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9JTlRFUkZBQ0UpICE9IDApIHsKLSAgICBFUlJPUigiaW50ZXJmYWNlICVzIG5vdCBtYXRjaGluZyBbJXNdIiwgbmFtZSwgQVVESU9fSEFSRFdBUkVfSU5URVJGQUNFKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIGFkZXYgPSAoc3RydWN0IGEyZHBfYXVkaW9fZGV2aWNlKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBhMmRwX2F1ZGlvX2RldmljZSkpOwotCi0gIGlmICghYWRldikgcmV0dXJuIC1FTk9NRU07Ci0KLSAgYWRldi0+bXV0ZXggPSBuZXcgc3RkOjpyZWN1cnNpdmVfbXV0ZXg7Ci0KLSAgYWRldi0+ZGV2aWNlLmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOwotICBhZGV2LT5kZXZpY2UuY29tbW9uLnZlcnNpb24gPSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOwotICBhZGV2LT5kZXZpY2UuY29tbW9uLm1vZHVsZSA9IChzdHJ1Y3QgaHdfbW9kdWxlX3QqKW1vZHVsZTsKLSAgYWRldi0+ZGV2aWNlLmNvbW1vbi5jbG9zZSA9IGFkZXZfY2xvc2U7Ci0KLSAgYWRldi0+ZGV2aWNlLmluaXRfY2hlY2sgPSBhZGV2X2luaXRfY2hlY2s7Ci0gIGFkZXYtPmRldmljZS5zZXRfdm9pY2Vfdm9sdW1lID0gYWRldl9zZXRfdm9pY2Vfdm9sdW1lOwotICBhZGV2LT5kZXZpY2Uuc2V0X21hc3Rlcl92b2x1bWUgPSBhZGV2X3NldF9tYXN0ZXJfdm9sdW1lOwotICBhZGV2LT5kZXZpY2Uuc2V0X21vZGUgPSBhZGV2X3NldF9tb2RlOwotICBhZGV2LT5kZXZpY2Uuc2V0X21pY19tdXRlID0gYWRldl9zZXRfbWljX211dGU7Ci0gIGFkZXYtPmRldmljZS5nZXRfbWljX211dGUgPSBhZGV2X2dldF9taWNfbXV0ZTsKLSAgYWRldi0+ZGV2aWNlLnNldF9wYXJhbWV0ZXJzID0gYWRldl9zZXRfcGFyYW1ldGVyczsKLSAgYWRldi0+ZGV2aWNlLmdldF9wYXJhbWV0ZXJzID0gYWRldl9nZXRfcGFyYW1ldGVyczsKLSAgYWRldi0+ZGV2aWNlLmdldF9pbnB1dF9idWZmZXJfc2l6ZSA9IGFkZXZfZ2V0X2lucHV0X2J1ZmZlcl9zaXplOwotICBhZGV2LT5kZXZpY2Uub3Blbl9vdXRwdXRfc3RyZWFtID0gYWRldl9vcGVuX291dHB1dF9zdHJlYW07Ci0gIGFkZXYtPmRldmljZS5jbG9zZV9vdXRwdXRfc3RyZWFtID0gYWRldl9jbG9zZV9vdXRwdXRfc3RyZWFtOwotICBhZGV2LT5kZXZpY2Uub3Blbl9pbnB1dF9zdHJlYW0gPSBhZGV2X29wZW5faW5wdXRfc3RyZWFtOwotICBhZGV2LT5kZXZpY2UuY2xvc2VfaW5wdXRfc3RyZWFtID0gYWRldl9jbG9zZV9pbnB1dF9zdHJlYW07Ci0gIGFkZXYtPmRldmljZS5kdW1wID0gYWRldl9kdW1wOwotCi0gIGFkZXYtPm91dHB1dCA9IE5VTEw7Ci0KLSAgKmRldmljZSA9ICZhZGV2LT5kZXZpY2UuY29tbW9uOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgaGFsX21vZHVsZV9tZXRob2RzID0gewotICAgIC5vcGVuID0gYWRldl9vcGVuLAotfTsKLQotX19hdHRyaWJ1dGVfXygoCi0gICAgdmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgc3RydWN0IGF1ZGlvX21vZHVsZSBIQUxfTU9EVUxFX0lORk9fU1lNID0gewotICAgIC5jb21tb24gPQotICAgICAgICB7Ci0gICAgICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKLSAgICAgICAgICAgIC52ZXJzaW9uX21ham9yID0gMSwKLSAgICAgICAgICAgIC52ZXJzaW9uX21pbm9yID0gMCwKLSAgICAgICAgICAgIC5pZCA9IEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgICAgIC5uYW1lID0gIkEyRFAgQXVkaW8gSFcgSEFMIiwKLSAgICAgICAgICAgIC5hdXRob3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgICAgICAgICAubWV0aG9kcyA9ICZoYWxfbW9kdWxlX21ldGhvZHMsCi0gICAgICAgIH0sCi19OwpkaWZmIC0tZ2l0IGEvYXVkaW9fYTJkcF9ody9zcmMvYXVkaW9fYTJkcF9od191dGlscy5jYyBiL2F1ZGlvX2EyZHBfaHcvc3JjL2F1ZGlvX2EyZHBfaHdfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTE1YzYuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYTJkcF9ody9zcmMvYXVkaW9fYTJkcF9od191dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJhdWRpb19hMmRwX2h3LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1NUUihjb25zdCkgXAotICBjYXNlIGNvbnN0OiAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvbnN0OwotCi1jb25zdCBjaGFyKiBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudCh0QTJEUF9DVFJMX0NNRCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEEyRFBfQ1RSTF9DTURfTk9ORSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQTJEUF9DVFJMX0NNRF9DSEVDS19SRUFEWSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQTJEUF9DVFJMX0NNRF9TVEFSVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQTJEUF9DVFJMX0NNRF9TVE9QKQotICAgIENBU0VfUkVUVVJOX1NUUihBMkRQX0NUUkxfQ01EX1NVU1BFTkQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEEyRFBfQ1RSTF9HRVRfSU5QVVRfQVVESU9fQ09ORklHKQotICAgIENBU0VfUkVUVVJOX1NUUihBMkRQX0NUUkxfR0VUX09VVFBVVF9BVURJT19DT05GSUcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEEyRFBfQ1RSTF9TRVRfT1VUUFVUX0FVRElPX0NPTkZJRykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQTJEUF9DVFJMX0dFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04pCi0gIH0KLQotICByZXR1cm4gIlVOS05PV04gQTJEUF9DVFJMX0NNRCI7Ci19Ci0KLWJvb2wgZGVsYXlfcmVwb3J0aW5nX2VuYWJsZWQoKSB7Ci0gIHJldHVybiAhb3NpX3Byb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5kaXNhYmxlZGVsYXlyZXBvcnRzIiwgZmFsc2UpOwotfQpkaWZmIC0tZ2l0IGEvYXVkaW9fYTJkcF9ody90ZXN0L2F1ZGlvX2EyZHBfaHdfdGVzdC5jYyBiL2F1ZGlvX2EyZHBfaHcvdGVzdC9hdWRpb19hMmRwX2h3X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2JhZTUuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYTJkcF9ody90ZXN0L2F1ZGlvX2EyZHBfaHdfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF1ZGlvX2EyZHBfaHcvaW5jbHVkZS9hdWRpb19hMmRwX2h3LmgiCi0KLW5hbWVzcGFjZSB7Ci1zdGF0aWMgdWludDMyX3QgY29kZWNfc2FtcGxlX3JhdGUydmFsdWUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QgY29kZWNfc2FtcGxlX3JhdGUpIHsKLSAgc3dpdGNoIChjb2RlY19zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgcmV0dXJuIDQ0MTAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgcmV0dXJuIDQ4MDAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOgotICAgICAgcmV0dXJuIDg4MjAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgICAgcmV0dXJuIDk2MDAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDoKLSAgICAgIHJldHVybiAxNzY0MDA7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgICAgcmV0dXJuIDE5MjAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNjAwMDoKLSAgICAgIHJldHVybiAxNjAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMDoKLSAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBjb2RlY19iaXRzX3Blcl9zYW1wbGUydmFsdWUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZSkgewotICBzd2l0Y2ggKGNvZGVjX2JpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIHJldHVybiAxNjsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICByZXR1cm4gMjQ7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgICAgcmV0dXJuIDMyOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBjb2RlY19jaGFubmVsX21vZGUydmFsdWUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNvZGVjX2NoYW5uZWxfbW9kZSkgewotICBzd2l0Y2ggKGNvZGVjX2NoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBBdWRpb0EyZHBId1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIEF1ZGlvQTJkcEh3VGVzdCgpIHt9Ci0KLSBwcml2YXRlOgotfTsKLQotVEVTVF9GKEF1ZGlvQTJkcEh3VGVzdCwgdGVzdF9jb21wdXRlX2J1ZmZlcl9zaXplKSB7Ci0gIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGNvZGVjX3NhbXBsZV9yYXRlX2FycmF5W10gPSB7Ci0gICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSwgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMCwKLSAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMCwgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwLAotICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwLCBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwLAotICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMH07Ci0KLSAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZV9hcnJheVtdID0gewotICAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FLCBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2LAotICAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCwgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMn07Ci0KLSAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNvZGVjX2NoYW5uZWxfbW9kZV9hcnJheVtdID0gewotICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FLCBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk8sCi0gICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFT307Ci0KLSAgZm9yIChjb25zdCBhdXRvIGNvZGVjX3NhbXBsZV9yYXRlIDogY29kZWNfc2FtcGxlX3JhdGVfYXJyYXkpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8gY29kZWNfYml0c19wZXJfc2FtcGxlIDogY29kZWNfYml0c19wZXJfc2FtcGxlX2FycmF5KSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8gY29kZWNfY2hhbm5lbF9tb2RlIDogY29kZWNfY2hhbm5lbF9tb2RlX2FycmF5KSB7Ci0gICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9IGF1ZGlvX2EyZHBfaHdfc3RyZWFtX2NvbXB1dGVfYnVmZmVyX3NpemUoCi0gICAgICAgICAgICBjb2RlY19zYW1wbGVfcmF0ZSwgY29kZWNfYml0c19wZXJfc2FtcGxlLCBjb2RlY19jaGFubmVsX21vZGUpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIGlucHV0Ci0gICAgICAgIGlmICgoY29kZWNfc2FtcGxlX3JhdGUgPT0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUpIHx8Ci0gICAgICAgICAgICAoY29kZWNfYml0c19wZXJfc2FtcGxlID09IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORSkgfHwKLSAgICAgICAgICAgIChjb2RlY19jaGFubmVsX21vZGUgPT0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FKSkgewotICAgICAgICAgIEVYUEVDVF9FUShidWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWikpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSBjb2RlY19zYW1wbGVfcmF0ZTJ2YWx1ZShjb2RlY19zYW1wbGVfcmF0ZSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHNhbXBsZV9yYXRlICE9IDApOwotCi0gICAgICAgIHVpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICAgICAgICBjb2RlY19iaXRzX3Blcl9zYW1wbGUydmFsdWUoY29kZWNfYml0c19wZXJfc2FtcGxlKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoYml0c19wZXJfc2FtcGxlICE9IDApOwotCi0gICAgICAgIHVpbnQzMl90IG51bWJlcl9vZl9jaGFubmVscyA9Ci0gICAgICAgICAgICBjb2RlY19jaGFubmVsX21vZGUydmFsdWUoY29kZWNfY2hhbm5lbF9tb2RlKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobnVtYmVyX29mX2NoYW5uZWxzICE9IDApOwotCi0gICAgICAgIGNvbnN0IHVpbnQ2NF90IHRpbWVfcGVyaW9kX21zID0gMjA7ICAvLyBUT0RPOiBNdXN0IGJlIGEgcGFyYW1ldGVyCi0gICAgICAgIHNpemVfdCBleHBlY3RlZF9idWZmZXJfc2l6ZSA9Ci0gICAgICAgICAgICAodGltZV9wZXJpb2RfbXMgKiBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTICogc2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgIG51bWJlcl9vZl9jaGFubmVscyAqIChiaXRzX3Blcl9zYW1wbGUgLyA4KSkgLwotICAgICAgICAgICAgMTAwMDsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBkaXZpc29yIGFuZCBhZGp1c3QgdGhlIGJ1ZmZlciBzaXplCi0gICAgICAgIGNvbnN0IHNpemVfdCBkaXZpc29yID0gKEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMgKiAxNiAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaGFubmVscyAqIGJpdHNfcGVyX3NhbXBsZSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg7Ci0gICAgICAgIGNvbnN0IHNpemVfdCByZW1haW5kZXIgPSBleHBlY3RlZF9idWZmZXJfc2l6ZSAlIGRpdmlzb3I7Ci0gICAgICAgIGlmIChyZW1haW5kZXIgIT0gMCkgewotICAgICAgICAgIGV4cGVjdGVkX2J1ZmZlcl9zaXplICs9IGRpdmlzb3IgLSByZW1haW5kZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFWFBFQ1RfRVEoYnVmZmVyX3NpemUsIGV4cGVjdGVkX2J1ZmZlcl9zaXplKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2F1ZGlvX2JsdWV0b290aF9ody9BbmRyb2lkLmJwIGIvYXVkaW9fYmx1ZXRvb3RoX2h3L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MmYxZGIuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYmx1ZXRvb3RoX2h3L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLyBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIGlzIGF1ZGlvLjx0eXBlPi48aGFyZHdhcmUvZXRjPi5zbwotCi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImF1ZGlvLmJsdWV0b290aC5kZWZhdWx0IiwKLSAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCi0gICAgcHJvcHJpZXRhcnk6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiYXVkaW9fYmx1ZXRvb3RoX2h3LmNjIiwKLSAgICAgICAgInN0cmVhbV9hcGlzLmNjIiwKLSAgICAgICAgImRldmljZV9wb3J0X3Byb3h5LmNjIiwKLSAgICAgICAgInV0aWxzLmNjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmhhcmR3YXJlX2hlYWRlcnMiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMSIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliYmx1ZXRvb3RoX2F1ZGlvX3Nlc3Npb24iLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImF1ZGlvX2JsdWV0b290aF9od190ZXN0IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ1dGlscy5jYyIsCi0gICAgICAgICJ1dGlsc191bml0dGVzdC5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9hdWRpb19ibHVldG9vdGhfaHcvYXVkaW9fYmx1ZXRvb3RoX2h3LmNjIGIvYXVkaW9fYmx1ZXRvb3RoX2h3L2F1ZGlvX2JsdWV0b290aF9ody5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3YzRlMy4uMDAwMDAwMAotLS0gYS9hdWRpb19ibHVldG9vdGhfaHcvYXVkaW9fYmx1ZXRvb3RoX2h3LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQlRBdWRpb0h3IgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi0jaW5jbHVkZSAic3RyZWFtX2FwaXMuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OnV0aWxzOjpHZXRBdWRpb1BhcmFtU3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpibHVldG9vdGg6OmF1ZGlvOjp1dGlsczo6UGFyc2VBdWRpb1BhcmFtczsKLQotc3RhdGljIGludCBhZGV2X3NldF9wYXJhbWV0ZXJzKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrdnBhaXJzKSB7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBrZXZwYWlycz1bIiA8PCBrdnBhaXJzIDw8ICJdIjsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyYW1zID0KLSAgICAgIFBhcnNlQXVkaW9QYXJhbXMoa3ZwYWlycyk7Ci0gIGlmIChwYXJhbXMuZW1wdHkoKSkgcmV0dXJuIDA7Ci0KLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IFBhcmFtc01hcD1bIiA8PCBHZXRBdWRpb1BhcmFtU3RyaW5nKHBhcmFtcykKLSAgICAgICAgICAgICAgIDw8ICJdIjsKLSAgaWYgKHBhcmFtcy5maW5kKCJBMmRwU3VzcGVuZGVkIikgPT0gcGFyYW1zLmVuZCgpKSB7Ci0gICAgcmV0dXJuIC1FTk9TWVM7Ci0gIH0KLQotICBhdXRvKiBibHVldG9vdGhfZGV2aWNlID0gcmVpbnRlcnByZXRfY2FzdDxCbHVldG9vdGhBdWRpb0RldmljZSo+KGRldik7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChibHVldG9vdGhfZGV2aWNlLT5tdXRleF8pOwotICBmb3IgKGF1dG8gc291dCA6IGJsdWV0b290aF9kZXZpY2UtPm9wZW5lZF9zdHJlYW1fb3V0c18pIHsKLSAgICBpZiAoc291dC0+c3RyZWFtX291dF8uY29tbW9uLnNldF9wYXJhbWV0ZXJzICE9IG51bGxwdHIpIHsKLSAgICAgIHNvdXQtPnN0cmVhbV9vdXRfLmNvbW1vbi5zZXRfcGFyYW1ldGVycygmc291dC0+c3RyZWFtX291dF8uY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt2cGFpcnMpOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIqIGFkZXZfZ2V0X3BhcmFtZXRlcnMoY29uc3Qgc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5cykgewotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjoga2V5cz1bIiA8PCBrZXlzIDw8ICJdIjsKLSAgcmV0dXJuIHN0cmR1cCgiIik7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9pbml0X2NoZWNrKGNvbnN0IHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldikgeyByZXR1cm4gMDsgfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X3ZvaWNlX3ZvbHVtZShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsIGZsb2F0IHZvbHVtZSkgewotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogdm9sdW1lPSIgPDwgdm9sdW1lOwotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBhZGV2X3NldF9tYXN0ZXJfdm9sdW1lKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwgZmxvYXQgdm9sdW1lKSB7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiB2b2x1bWU9IiA8PCB2b2x1bWU7Ci0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IGFkZXZfZ2V0X21hc3Rlcl92b2x1bWUoc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LCBmbG9hdCogdm9sdW1lKSB7Ci0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X21hc3Rlcl9tdXRlKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwgYm9vbCBtdXRlZCkgewotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogbXV0ZT0iIDw8IG11dGVkOwotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBhZGV2X2dldF9tYXN0ZXJfbXV0ZShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsIGJvb2wqIG11dGVkKSB7Ci0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X21vZGUoc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LCBhdWRpb19tb2RlX3QgbW9kZSkgewotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogbW9kZT0iIDw8IG1vZGU7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZXZfc2V0X21pY19tdXRlKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwgYm9vbCBzdGF0ZSkgewotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBzdGF0ZTsKLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9nZXRfbWljX211dGUoY29uc3Qgc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LCBib29sKiBzdGF0ZSkgewotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBhZGV2X2R1bXAoY29uc3QgYXVkaW9faHdfZGV2aWNlX3QqIGRldmljZSwgaW50IGZkKSB7IHJldHVybiAwOyB9Ci0KLXN0YXRpYyBpbnQgYWRldl9jbG9zZShod19kZXZpY2VfdCogZGV2aWNlKSB7Ci0gIGF1dG8qIGJsdWV0b290aF9kZXZpY2UgPSByZWludGVycHJldF9jYXN0PEJsdWV0b290aEF1ZGlvRGV2aWNlKj4oZGV2aWNlKTsKLSAgZGVsZXRlIGJsdWV0b290aF9kZXZpY2U7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZXZfb3Blbihjb25zdCBod19tb2R1bGVfdCogbW9kdWxlLCBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgaHdfZGV2aWNlX3QqKiBkZXZpY2UpIHsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IG5hbWU9WyIgPDwgbmFtZSA8PCAiXSI7Ci0gIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfSU5URVJGQUNFKSAhPSAwKSByZXR1cm4gLUVJTlZBTDsKLQotICBhdXRvIGJsdWV0b290aF9hdWRpb19kZXZpY2UgPSBuZXcgQmx1ZXRvb3RoQXVkaW9EZXZpY2V7fTsKLSAgc3RydWN0IGF1ZGlvX2h3X2RldmljZSogYWRldiA9ICZibHVldG9vdGhfYXVkaW9fZGV2aWNlLT5hdWRpb19kZXZpY2VfOwotICBpZiAoIWFkZXYpIHJldHVybiAtRU5PTUVNOwotCi0gIGFkZXYtPmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOwotICBhZGV2LT5jb21tb24udmVyc2lvbiA9IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8yXzA7Ci0gIGFkZXYtPmNvbW1vbi5tb2R1bGUgPSAoc3RydWN0IGh3X21vZHVsZV90Kiltb2R1bGU7Ci0gIGFkZXYtPmNvbW1vbi5jbG9zZSA9IGFkZXZfY2xvc2U7Ci0KLSAgYWRldi0+aW5pdF9jaGVjayA9IGFkZXZfaW5pdF9jaGVjazsKLSAgYWRldi0+c2V0X3ZvaWNlX3ZvbHVtZSA9IGFkZXZfc2V0X3ZvaWNlX3ZvbHVtZTsKLSAgYWRldi0+c2V0X21hc3Rlcl92b2x1bWUgPSBhZGV2X3NldF9tYXN0ZXJfdm9sdW1lOwotICBhZGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9IGFkZXZfZ2V0X21hc3Rlcl92b2x1bWU7Ci0gIGFkZXYtPnNldF9tb2RlID0gYWRldl9zZXRfbW9kZTsKLSAgYWRldi0+c2V0X21pY19tdXRlID0gYWRldl9zZXRfbWljX211dGU7Ci0gIGFkZXYtPmdldF9taWNfbXV0ZSA9IGFkZXZfZ2V0X21pY19tdXRlOwotICBhZGV2LT5zZXRfcGFyYW1ldGVycyA9IGFkZXZfc2V0X3BhcmFtZXRlcnM7Ci0gIGFkZXYtPmdldF9wYXJhbWV0ZXJzID0gYWRldl9nZXRfcGFyYW1ldGVyczsKLSAgYWRldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplID0gYWRldl9nZXRfaW5wdXRfYnVmZmVyX3NpemU7Ci0gIGFkZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSA9IGFkZXZfb3Blbl9vdXRwdXRfc3RyZWFtOwotICBhZGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtID0gYWRldl9jbG9zZV9vdXRwdXRfc3RyZWFtOwotICBhZGV2LT5vcGVuX2lucHV0X3N0cmVhbSA9IGFkZXZfb3Blbl9pbnB1dF9zdHJlYW07Ci0gIGFkZXYtPmNsb3NlX2lucHV0X3N0cmVhbSA9IGFkZXZfY2xvc2VfaW5wdXRfc3RyZWFtOwotICBhZGV2LT5kdW1wID0gYWRldl9kdW1wOwotICBhZGV2LT5zZXRfbWFzdGVyX211dGUgPSBhZGV2X3NldF9tYXN0ZXJfbXV0ZTsKLSAgYWRldi0+Z2V0X21hc3Rlcl9tdXRlID0gYWRldl9nZXRfbWFzdGVyX211dGU7Ci0KLSAgKmRldmljZSA9ICZhZGV2LT5jb21tb247Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgaGFsX21vZHVsZV9tZXRob2RzID0gewotICAgIC5vcGVuID0gYWRldl9vcGVuLAotfTsKLQotc3RydWN0IGF1ZGlvX21vZHVsZSBIQUxfTU9EVUxFX0lORk9fU1lNID0gewotICAgIC5jb21tb24gPQotICAgICAgICB7Ci0gICAgICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKLSAgICAgICAgICAgIC5tb2R1bGVfYXBpX3ZlcnNpb24gPSBBVURJT19NT0RVTEVfQVBJX1ZFUlNJT05fMF8xLAotICAgICAgICAgICAgLmhhbF9hcGlfdmVyc2lvbiA9IEhBUkRXQVJFX0hBTF9BUElfVkVSU0lPTiwKLSAgICAgICAgICAgIC5pZCA9IEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgICAgIC5uYW1lID0gIkJsdWV0b290aCBBdWRpbyBIVyBIQUwiLAotICAgICAgICAgICAgLmF1dGhvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgICAgIC5tZXRob2RzID0gJmhhbF9tb2R1bGVfbWV0aG9kcywKLSAgICAgICAgfSwKLX07CmRpZmYgLS1naXQgYS9hdWRpb19ibHVldG9vdGhfaHcvZGV2aWNlX3BvcnRfcHJveHkuY2MgYi9hdWRpb19ibHVldG9vdGhfaHcvZGV2aWNlX3BvcnRfcHJveHkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTg3NDIuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYmx1ZXRvb3RoX2h3L2RldmljZV9wb3J0X3Byb3h5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQlRBdWRpb0hhbERldmljZVByb3h5IgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiQmx1ZXRvb3RoQXVkaW9TZXNzaW9uQ29udHJvbF8yXzEuaCIKLSNpbmNsdWRlICJkZXZpY2VfcG9ydF9wcm94eS5oIgotI2luY2x1ZGUgInN0cmVhbV9hcGlzLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotCi11c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9TZXNzaW9uQ29udHJvbF8yXzE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpCaXRzUGVyU2FtcGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Q2hhbm5lbE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpQY21QYXJhbWV0ZXJzOwotdXNpbmcgU2FtcGxlUmF0ZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OlNhbXBsZVJhdGU7Ci11c2luZyBTYW1wbGVSYXRlXzJfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OlNhbXBsZVJhdGU7Ci11c2luZyBCbHVldG9vdGhBdWRpb1N0YXR1cyA9Ci0gICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U3RhdHVzOwotdXNpbmcgQ29udHJvbFJlc3VsdENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKAotICAgIHVpbnQxNl90IGNvb2tpZSwgYm9vbCBzdGFydF9yZXNwLCBjb25zdCBCbHVldG9vdGhBdWRpb1N0YXR1cyYgc3RhdHVzKT47Ci11c2luZyBTZXNzaW9uQ2hhbmdlZENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQxNl90IGNvb2tpZSk+OwotCi1uYW1lc3BhY2UgewotCi11bnNpZ25lZCBpbnQgU2FtcGxlUmF0ZVRvQXVkaW9Gb3JtYXQoU2FtcGxlUmF0ZV8yXzEgc2FtcGxlX3JhdGUpIHsKLSAgc3dpdGNoIChzYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfODAwMDoKLSAgICAgIHJldHVybiA4MDAwOwotICAgIGNhc2UgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMTYwMDA6Ci0gICAgICByZXR1cm4gMTYwMDA7Ci0gICAgY2FzZSBTYW1wbGVSYXRlXzJfMTo6UkFURV8yNDAwMDoKLSAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIFNhbXBsZVJhdGVfMl8xOjpSQVRFXzMyMDAwOgotICAgICAgcmV0dXJuIDMyMDAwOwotICAgIGNhc2UgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfNDQxMDA6Ci0gICAgICByZXR1cm4gNDQxMDA7Ci0gICAgY2FzZSBTYW1wbGVSYXRlXzJfMTo6UkFURV80ODAwMDoKLSAgICAgIHJldHVybiA0ODAwMDsKLSAgICBjYXNlIFNhbXBsZVJhdGVfMl8xOjpSQVRFXzg4MjAwOgotICAgICAgcmV0dXJuIDg4MjAwOwotICAgIGNhc2UgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfOTYwMDA6Ci0gICAgICByZXR1cm4gOTYwMDA7Ci0gICAgY2FzZSBTYW1wbGVSYXRlXzJfMTo6UkFURV8xNzY0MDA6Ci0gICAgICByZXR1cm4gMTc2NDAwOwotICAgIGNhc2UgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMTkyMDAwOgotICAgICAgcmV0dXJuIDE5MjAwMDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGtCbHVldG9vdGhEZWZhdWx0U2FtcGxlUmF0ZTsKLSAgfQotfQotYXVkaW9fY2hhbm5lbF9tYXNrX3QgT3V0cHV0Q2hhbm5lbE1vZGVUb0F1ZGlvRm9ybWF0KENoYW5uZWxNb2RlIGNoYW5uZWxfbW9kZSkgewotICBzd2l0Y2ggKGNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQ2hhbm5lbE1vZGU6Ok1PTk86Ci0gICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKLSAgICBjYXNlIENoYW5uZWxNb2RlOjpTVEVSRU86Ci0gICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4ga0JsdWV0b290aERlZmF1bHRPdXRwdXRDaGFubmVsTW9kZU1hc2s7Ci0gIH0KLX0KLQotYXVkaW9fY2hhbm5lbF9tYXNrX3QgSW5wdXRDaGFubmVsTW9kZVRvQXVkaW9Gb3JtYXQoQ2hhbm5lbE1vZGUgY2hhbm5lbF9tb2RlKSB7Ci0gIHN3aXRjaCAoY2hhbm5lbF9tb2RlKSB7Ci0gICAgY2FzZSBDaGFubmVsTW9kZTo6TU9OTzoKLSAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOX01PTk87Ci0gICAgY2FzZSBDaGFubmVsTW9kZTo6U1RFUkVPOgotICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4ga0JsdWV0b290aERlZmF1bHRJbnB1dENoYW5uZWxNb2RlTWFzazsKLSAgfQotfQotCi1hdWRpb19mb3JtYXRfdCBCaXRzUGVyU2FtcGxlVG9BdWRpb0Zvcm1hdChCaXRzUGVyU2FtcGxlIGJpdHNfcGVyX3NhbXBsZSkgewotICBzd2l0Y2ggKGJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQml0c1BlclNhbXBsZTo6QklUU18xNjoKLSAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBjYXNlIEJpdHNQZXJTYW1wbGU6OkJJVFNfMjQ6Ci0gICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOwotICAgIGNhc2UgQml0c1BlclNhbXBsZTo6QklUU18zMjoKLSAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGtCbHVldG9vdGhEZWZhdWx0QXVkaW9Gb3JtYXRCaXRzUGVyU2FtcGxlOwotICB9Ci19Ci0KLS8vIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZTo6d2FpdF9mb3IoKQotY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4V2FpdGluZ1RpbWVNcyA9IDQ1MDA7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1CbHVldG9vdGhBdWRpb1BvcnQ6OkJsdWV0b290aEF1ZGlvUG9ydCgpCi0gICAgOiBjb29raWVfKGFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OmtPYnNlcnZlcnNDb29raWVVbmRlZmluZWQpLAotICAgICAgc3RhdGVfKEJsdWV0b290aFN0cmVhbVN0YXRlOjpESVNBQkxFRCksCi0gICAgICBzZXNzaW9uX3R5cGVfKFNlc3Npb25UeXBlXzJfMTo6VU5LTk9XTikge30KLQotYm9vbCBCbHVldG9vdGhBdWRpb1BvcnQ6OlNldFVwKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSB7Ci0gIGlmICghaW5pdF9zZXNzaW9uX3R5cGUoZGV2aWNlcykpIHJldHVybiBmYWxzZTsKLQotICBzdGF0ZV8gPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBTkRCWTsKLQotICBhdXRvIGNvbnRyb2xfcmVzdWx0X2NiID0gW3BvcnQgPSB0aGlzXSh1aW50MTZfdCBjb29raWUsIGJvb2wgc3RhcnRfcmVzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmx1ZXRvb3RoQXVkaW9TdGF0dXMmIHN0YXR1cykgewotICAgIGlmICghcG9ydC0+aW5fdXNlKCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgImNvbnRyb2xfcmVzdWx0X2NiOiBCbHVldG9vdGhBdWRpb1BvcnQgaXMgbm90IGluIHVzZSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwb3J0LT5jb29raWVfICE9IGNvb2tpZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiY29udHJvbF9yZXN1bHRfY2I6IHByb3h5IG9mIGRldmljZSBwb3J0IChjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWUpCi0gICAgICAgICAgICAgICAgIDw8ICIpIGlzIGNvcnJ1cHRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHBvcnQtPkNvbnRyb2xSZXN1bHRIYW5kbGVyKHN0YXR1cyk7Ci0gIH07Ci0gIGF1dG8gc2Vzc2lvbl9jaGFuZ2VkX2NiID0gW3BvcnQgPSB0aGlzXSh1aW50MTZfdCBjb29raWUpIHsKLSAgICBpZiAoIXBvcnQtPmluX3VzZSgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJzZXNzaW9uX2NoYW5nZWRfY2I6IEJsdWV0b290aEF1ZGlvUG9ydCBpcyBub3QgaW4gdXNlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBvcnQtPmNvb2tpZV8gIT0gY29va2llKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJzZXNzaW9uX2NoYW5nZWRfY2I6IHByb3h5IG9mIGRldmljZSBwb3J0IChjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWUpCi0gICAgICAgICAgICAgICAgIDw8ICIpIGlzIGNvcnJ1cHRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHBvcnQtPlNlc3Npb25DaGFuZ2VkSGFuZGxlcigpOwotICB9OwotICA6OmFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OlBvcnRTdGF0dXNDYWxsYmFja3MgY2JhY2tzID0gewotICAgICAgLmNvbnRyb2xfcmVzdWx0X2NiXyA9IGNvbnRyb2xfcmVzdWx0X2NiLAotICAgICAgLnNlc3Npb25fY2hhbmdlZF9jYl8gPSBzZXNzaW9uX2NoYW5nZWRfY2J9OwotICBjb29raWVfID0gQmx1ZXRvb3RoQXVkaW9TZXNzaW9uQ29udHJvbF8yXzE6OlJlZ2lzdGVyQ29udHJvbFJlc3VsdENiYWNrKAotICAgICAgc2Vzc2lvbl90eXBlXywgY2JhY2tzKTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pOwotCi0gIHJldHVybiAoY29va2llXyAhPSBhbmRyb2lkOjpibHVldG9vdGg6OmF1ZGlvOjprT2JzZXJ2ZXJzQ29va2llVW5kZWZpbmVkKTsKLX0KLQotYm9vbCBCbHVldG9vdGhBdWRpb1BvcnQ6OmluaXRfc2Vzc2lvbl90eXBlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKLSAgc3dpdGNoIChkZXZpY2UpIHsKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6Ci0gICAgICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPUFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgKEhFQURQSE9ORVMvU1BFQUtFUikgKCIKLSAgICAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiUjeCIsIGRldmljZSkgPDwgIikiOwotICAgICAgc2Vzc2lvbl90eXBlXyA9IFNlc3Npb25UeXBlXzJfMTo6QTJEUF9TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDoKLSAgICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9QVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCAoTUVESUEvVk9JQ0UpICgiIDw8IFN0cmluZ1ByaW50ZigiJSN4IiwgZGV2aWNlKQotICAgICAgICAgICAgICAgICAgIDw8ICIpIjsKLSAgICAgIHNlc3Npb25fdHlwZV8gPSBTZXNzaW9uVHlwZV8yXzE6OkhFQVJJTkdfQUlEX1NPRlRXQVJFX0VOQ09ESU5HX0RBVEFQQVRIOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgotICAgICAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogZGV2aWNlPUFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQgKE1FRElBL1ZPSUNFKSAoIgotICAgICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiJSN4IiwgZGV2aWNlKSA8PCAiKSI7Ci0gICAgICBzZXNzaW9uX3R5cGVfID0gU2Vzc2lvblR5cGVfMl8xOjpMRV9BVURJT19TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKLSAgICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IGRldmljZT1BVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIChNRURJQSkgKCIKLSAgICAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiUjeCIsIGRldmljZSkgPDwgIikiOwotICAgICAgc2Vzc2lvbl90eXBlXyA9IFNlc3Npb25UeXBlXzJfMTo6TEVfQVVESU9fU09GVFdBUkVfRU5DT0RJTkdfREFUQVBBVEg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVDoKLSAgICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IGRldmljZT1BVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQgKFZPSUNFKSAoIgotICAgICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiJSN4IiwgZGV2aWNlKSA8PCAiKSI7Ci0gICAgICBzZXNzaW9uX3R5cGVfID0gU2Vzc2lvblR5cGVfMl8xOjpMRV9BVURJT19TT0ZUV0FSRV9ERUNPREVEX0RBVEFQQVRIOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5rbm93biBkZXZpY2U9IiA8PCBTdHJpbmdQcmludGYoIiUjeCIsIGRldmljZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIUJsdWV0b290aEF1ZGlvU2Vzc2lvbkNvbnRyb2xfMl8xOjpJc1Nlc3Npb25SZWFkeShzZXNzaW9uX3R5cGVfKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgU3RyaW5nUHJpbnRmKCIlI3giLCBkZXZpY2UpIDw8ICIsIHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICA8PCAiIGlzIG5vdCByZWFkeSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJsdWV0b290aEF1ZGlvUG9ydDo6VGVhckRvd24oKSB7Ci0gIGlmICghaW5fdXNlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKSA8PCAiIHVua25vd24gbW9uaXRvciI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pOwotICBCbHVldG9vdGhBdWRpb1Nlc3Npb25Db250cm9sXzJfMTo6VW5yZWdpc3RlckNvbnRyb2xSZXN1bHRDYmFjayhzZXNzaW9uX3R5cGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVfKTsKLSAgY29va2llXyA9IGFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OmtPYnNlcnZlcnNDb29raWVVbmRlZmluZWQ7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXVkaW9Qb3J0OjpDb250cm9sUmVzdWx0SGFuZGxlcigKLSAgICBjb25zdCBCbHVldG9vdGhBdWRpb1N0YXR1cyYgc3RhdHVzKSB7Ci0gIGlmICghaW5fdXNlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvUG9ydGlzIG5vdCBpbiB1c2UiOwotICAgIHJldHVybjsKLSAgfQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IHBvcnRfbG9jayhjdl9tdXRleF8pOwotICBCbHVldG9vdGhTdHJlYW1TdGF0ZSBwcmV2aW91c19zdGF0ZSA9IHN0YXRlXzsKLSAgTE9HKElORk8pIDw8ICJjb250cm9sX3Jlc3VsdF9jYjogc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykKLSAgICAgICAgICAgIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pIDw8ICIsIHByZXZpb3VzX3N0YXRlPSIgPDwgcHJldmlvdXNfc3RhdGUKLSAgICAgICAgICAgIDw8ICIsIHN0YXR1cz0iIDw8IHRvU3RyaW5nKHN0YXR1cyk7Ci0KLSAgc3dpdGNoIChwcmV2aW91c19zdGF0ZSkgewotICAgIGNhc2UgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJUSU5HOgotICAgICAgaWYgKHN0YXR1cyA9PSBCbHVldG9vdGhBdWRpb1N0YXR1czo6U1VDQ0VTUykgewotICAgICAgICBzdGF0ZV8gPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRFRDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNldCB0byBzdGFuZGJ5IHNpbmNlIHRoZSBzdGFjayBtYXkgYmUgYnVzeSBzd2l0Y2hpbmcgYmV0d2VlbiBvdXRwdXRzCi0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiY29udHJvbF9yZXN1bHRfY2I6IHN0YXR1cz0iIDw8IHRvU3RyaW5nKHN0YXR1cykKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbHVyZSBmb3Igc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pIDw8ICIsIHByZXZpb3VzX3N0YXRlPSIgPDwgcHJldmlvdXNfc3RhdGU7Ci0gICAgICAgIHN0YXRlXyA9IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFOREJZOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1VTUEVORElORzoKLSAgICAgIGlmIChzdGF0dXMgPT0gQmx1ZXRvb3RoQXVkaW9TdGF0dXM6OlNVQ0NFU1MpIHsKLSAgICAgICAgc3RhdGVfID0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQU5EQlk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBJdCB3aWxsIGJlIGZhaWxlZCBpZiB0aGUgaGVhZHNldCBpcyBkaXNjb25uZWN0aW5nLCBhbmQgc2V0IHRvIGRpc2FibGUKLSAgICAgICAgLy8gdG8gd2FpdCBmb3IgcmUtaW5pdCBhZ2FpbgotICAgICAgICBMT0coV0FSTklORykgPDwgImNvbnRyb2xfcmVzdWx0X2NiOiBzdGF0dXM9IiA8PCB0b1N0cmluZyhzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWx1cmUgZm9yIHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKSA8PCAiLCBwcmV2aW91c19zdGF0ZT0iIDw8IHByZXZpb3VzX3N0YXRlOwotICAgICAgICBzdGF0ZV8gPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCAiY29udHJvbF9yZXN1bHRfY2I6IHVuZXhwZWN0ZWQgc3RhdHVzPSIgPDwgdG9TdHJpbmcoc3RhdHVzKQotICAgICAgICAgICAgICAgICA8PCAiIGZvciBzZXNzaW9uX3R5cGU9IiA8PCB0b1N0cmluZyhzZXNzaW9uX3R5cGVfKSA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKQotICAgICAgICAgICAgICAgICA8PCAiLCBwcmV2aW91c19zdGF0ZT0iIDw8IHByZXZpb3VzX3N0YXRlOwotICAgICAgcmV0dXJuOwotICB9Ci0gIHBvcnRfbG9jay51bmxvY2soKTsKLSAgaW50ZXJuYWxfY3ZfLm5vdGlmeV9hbGwoKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdWRpb1BvcnQ6OlNlc3Npb25DaGFuZ2VkSGFuZGxlcigpIHsKLSAgaWYgKCFpbl91c2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9Qb3J0IGlzIG5vdCBpbiB1c2UiOwotICAgIHJldHVybjsKLSAgfQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IHBvcnRfbG9jayhjdl9tdXRleF8pOwotICBCbHVldG9vdGhTdHJlYW1TdGF0ZSBwcmV2aW91c19zdGF0ZSA9IHN0YXRlXzsKLSAgTE9HKElORk8pIDw8ICJzZXNzaW9uX2NoYW5nZWRfY2I6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKSA8PCAiLCBwcmV2aW91c19zdGF0ZT0iIDw8IHByZXZpb3VzX3N0YXRlOwotICBpZiAocHJldmlvdXNfc3RhdGUgIT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OkRJU0FCTEVEKSB7Ci0gICAgc3RhdGVfID0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OkRJU0FCTEVEOwotICB9IGVsc2UgewotICAgIHN0YXRlXyA9IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFOREJZOwotICB9Ci0gIHBvcnRfbG9jay51bmxvY2soKTsKLSAgaW50ZXJuYWxfY3ZfLm5vdGlmeV9hbGwoKTsKLX0KLQotYm9vbCBCbHVldG9vdGhBdWRpb1BvcnQ6OmluX3VzZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChjb29raWVfICE9IGFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OmtPYnNlcnZlcnNDb29raWVVbmRlZmluZWQpOwotfQotCi1ib29sIEJsdWV0b290aEF1ZGlvUG9ydE91dDo6TG9hZEF1ZGlvQ29uZmlnKGF1ZGlvX2NvbmZpZ190KiBhdWRpb19jZmcpIGNvbnN0IHsKLSAgaWYgKCFpbl91c2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9Qb3J0T3V0IGlzIG5vdCBpbiB1c2UiOwotICAgIGF1ZGlvX2NmZy0+c2FtcGxlX3JhdGUgPSBrQmx1ZXRvb3RoRGVmYXVsdFNhbXBsZVJhdGU7Ci0gICAgYXVkaW9fY2ZnLT5jaGFubmVsX21hc2sgPSBrQmx1ZXRvb3RoRGVmYXVsdE91dHB1dENoYW5uZWxNb2RlTWFzazsKLSAgICBhdWRpb19jZmctPmZvcm1hdCA9IGtCbHVldG9vdGhEZWZhdWx0QXVkaW9Gb3JtYXRCaXRzUGVyU2FtcGxlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OkF1ZGlvQ29uZmlndXJhdGlvbiYKLSAgICAgIGhhbF9hdWRpb19jZmcgPQotICAgICAgICAgIEJsdWV0b290aEF1ZGlvU2Vzc2lvbkNvbnRyb2xfMl8xOjpHZXRBdWRpb0NvbmZpZyhzZXNzaW9uX3R5cGVfKTsKLSAgaWYgKGhhbF9hdWRpb19jZmcuZ2V0RGlzY3JpbWluYXRvcigpICE9Ci0gICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8xOjpBdWRpb0NvbmZpZ3VyYXRpb246OgotICAgICAgICAgIGhpZGxfZGlzY3JpbWluYXRvcjo6cGNtQ29uZmlnKSB7Ci0gICAgYXVkaW9fY2ZnLT5zYW1wbGVfcmF0ZSA9IGtCbHVldG9vdGhEZWZhdWx0U2FtcGxlUmF0ZTsKLSAgICBhdWRpb19jZmctPmNoYW5uZWxfbWFzayA9IGtCbHVldG9vdGhEZWZhdWx0T3V0cHV0Q2hhbm5lbE1vZGVNYXNrOwotICAgIGF1ZGlvX2NmZy0+Zm9ybWF0ID0ga0JsdWV0b290aERlZmF1bHRBdWRpb0Zvcm1hdEJpdHNQZXJTYW1wbGU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OlBjbVBhcmFtZXRlcnMmIHBjbV9jZmcgPQotICAgICAgaGFsX2F1ZGlvX2NmZy5wY21Db25maWcoKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKSA8PCAiLCBzdGF0ZT0iIDw8IHN0YXRlXyA8PCAiLCBQY21Db25maWc9WyIKLSAgICAgICAgICAgICAgIDw8IHRvU3RyaW5nKHBjbV9jZmcpIDw8ICJdIjsKLSAgaWYgKHBjbV9jZmcuc2FtcGxlUmF0ZSA9PSBTYW1wbGVSYXRlXzJfMTo6UkFURV9VTktOT1dOIHx8Ci0gICAgICBwY21fY2ZnLmNoYW5uZWxNb2RlID09IENoYW5uZWxNb2RlOjpVTktOT1dOIHx8Ci0gICAgICBwY21fY2ZnLmJpdHNQZXJTYW1wbGUgPT0gQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1ZGlvX2NmZy0+c2FtcGxlX3JhdGUgPSBTYW1wbGVSYXRlVG9BdWRpb0Zvcm1hdChwY21fY2ZnLnNhbXBsZVJhdGUpOwotICBhdWRpb19jZmctPmNoYW5uZWxfbWFzayA9Ci0gICAgICAoaXNfc3RlcmVvX3RvX21vbm9fCi0gICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCi0gICAgICAgICAgIDogT3V0cHV0Q2hhbm5lbE1vZGVUb0F1ZGlvRm9ybWF0KHBjbV9jZmcuY2hhbm5lbE1vZGUpKTsKLSAgYXVkaW9fY2ZnLT5mb3JtYXQgPSBCaXRzUGVyU2FtcGxlVG9BdWRpb0Zvcm1hdChwY21fY2ZnLmJpdHNQZXJTYW1wbGUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbHVldG9vdGhBdWRpb1BvcnRJbjo6TG9hZEF1ZGlvQ29uZmlnKGF1ZGlvX2NvbmZpZ190KiBhdWRpb19jZmcpIGNvbnN0IHsKLSAgaWYgKCFpbl91c2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9Qb3J0SW4gaXMgbm90IGluIHVzZSI7Ci0gICAgYXVkaW9fY2ZnLT5zYW1wbGVfcmF0ZSA9IGtCbHVldG9vdGhEZWZhdWx0U2FtcGxlUmF0ZTsKLSAgICBhdWRpb19jZmctPmNoYW5uZWxfbWFzayA9IGtCbHVldG9vdGhEZWZhdWx0SW5wdXRDaGFubmVsTW9kZU1hc2s7Ci0gICAgYXVkaW9fY2ZnLT5mb3JtYXQgPSBrQmx1ZXRvb3RoRGVmYXVsdEF1ZGlvRm9ybWF0Qml0c1BlclNhbXBsZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8xOjpBdWRpb0NvbmZpZ3VyYXRpb24mCi0gICAgICBoYWxfYXVkaW9fY2ZnID0KLSAgICAgICAgICBCbHVldG9vdGhBdWRpb1Nlc3Npb25Db250cm9sXzJfMTo6R2V0QXVkaW9Db25maWcoc2Vzc2lvbl90eXBlXyk7Ci0gIGlmIChoYWxfYXVkaW9fY2ZnLmdldERpc2NyaW1pbmF0b3IoKSAhPQotICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMTo6QXVkaW9Db25maWd1cmF0aW9uOjoKLSAgICAgICAgICBoaWRsX2Rpc2NyaW1pbmF0b3I6OnBjbUNvbmZpZykgewotICAgIGF1ZGlvX2NmZy0+c2FtcGxlX3JhdGUgPSBrQmx1ZXRvb3RoRGVmYXVsdFNhbXBsZVJhdGU7Ci0gICAgYXVkaW9fY2ZnLT5jaGFubmVsX21hc2sgPSBrQmx1ZXRvb3RoRGVmYXVsdElucHV0Q2hhbm5lbE1vZGVNYXNrOwotICAgIGF1ZGlvX2NmZy0+Zm9ybWF0ID0ga0JsdWV0b290aERlZmF1bHRBdWRpb0Zvcm1hdEJpdHNQZXJTYW1wbGU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OlBjbVBhcmFtZXRlcnMmIHBjbV9jZmcgPQotICAgICAgaGFsX2F1ZGlvX2NmZy5wY21Db25maWcoKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKQotICAgICAgICAgICAgICAgPDwgIiwgc3RhdGU9IiA8PCBzdGF0ZV8gPDwgIiwgUGNtQ29uZmlnPVsiIDw8IHRvU3RyaW5nKHBjbV9jZmcpCi0gICAgICAgICAgICAgICA8PCAiXSI7Ci0gIGlmIChwY21fY2ZnLnNhbXBsZVJhdGUgPT0gU2FtcGxlUmF0ZV8yXzE6OlJBVEVfVU5LTk9XTiB8fAotICAgICAgcGNtX2NmZy5jaGFubmVsTW9kZSA9PSBDaGFubmVsTW9kZTo6VU5LTk9XTiB8fAotICAgICAgcGNtX2NmZy5iaXRzUGVyU2FtcGxlID09IEJpdHNQZXJTYW1wbGU6OkJJVFNfVU5LTk9XTikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGF1ZGlvX2NmZy0+c2FtcGxlX3JhdGUgPSBTYW1wbGVSYXRlVG9BdWRpb0Zvcm1hdChwY21fY2ZnLnNhbXBsZVJhdGUpOwotICBhdWRpb19jZmctPmNoYW5uZWxfbWFzayA9IElucHV0Q2hhbm5lbE1vZGVUb0F1ZGlvRm9ybWF0KHBjbV9jZmcuY2hhbm5lbE1vZGUpOwotICBhdWRpb19jZmctPmZvcm1hdCA9IEJpdHNQZXJTYW1wbGVUb0F1ZGlvRm9ybWF0KHBjbV9jZmcuYml0c1BlclNhbXBsZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJsdWV0b290aEF1ZGlvUG9ydDo6Q29uZHdhaXRTdGF0ZShCbHVldG9vdGhTdHJlYW1TdGF0ZSBzdGF0ZSkgewotICBib29sIHJldHZhbDsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBwb3J0X2xvY2soY3ZfbXV0ZXhfKTsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJUSU5HOgotICAgICAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgY29va2llPSIgPDwgU3RyaW5nUHJpbnRmKCIlI2h4IiwgY29va2llXykgPDwgIiB3YWl0aW5nIGZvciBTVEFSVEVEIjsKLSAgICAgIHJldHZhbCA9IGludGVybmFsX2N2Xy53YWl0X2ZvcigKLSAgICAgICAgICBwb3J0X2xvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoa01heFdhaXRpbmdUaW1lTXMpLAotICAgICAgICAgIFt0aGlzXSB7IHJldHVybiB0aGlzLT5zdGF0ZV8gIT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJUSU5HOyB9KTsKLSAgICAgIHJldHZhbCA9IHJldHZhbCAmJiBzdGF0ZV8gPT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJURUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVVNQRU5ESU5HOgotICAgICAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgY29va2llPSIgPDwgU3RyaW5nUHJpbnRmKCIlI2h4IiwgY29va2llXykgPDwgIiB3YWl0aW5nIGZvciBTVVNQRU5ERUQiOwotICAgICAgcmV0dmFsID0gaW50ZXJuYWxfY3ZfLndhaXRfZm9yKAotICAgICAgICAgIHBvcnRfbG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhrTWF4V2FpdGluZ1RpbWVNcyksCi0gICAgICAgICAgW3RoaXNdIHsgcmV0dXJuIHRoaXMtPnN0YXRlXyAhPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1VTUEVORElORzsgfSk7Ci0gICAgICByZXR2YWwgPSByZXR2YWwgJiYgc3RhdGVfID09IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFOREJZOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXNzaW9uX3R5cGU9IiA8PCB0b1N0cmluZyhzZXNzaW9uX3R5cGVfKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pIDw8ICIgd2FpdGluZyBmb3IgS05PV04iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsgIC8vIGZhbHNlIGlmIGFueSBmYWlsdXJlIGxpa2UgdGltZW91dAotfQotCi1ib29sIEJsdWV0b290aEF1ZGlvUG9ydDo6U3RhcnQoKSB7Ci0gIGlmICghaW5fdXNlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvUG9ydCBpcyBub3QgaW4gdXNlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykgPDwgIiwgY29va2llPSIgPDwgU3RyaW5nUHJpbnRmKCIlI2h4IiwgY29va2llXykKLSAgICAgICAgICAgIDw8ICIsIHN0YXRlPSIgPDwgc3RhdGVfIDw8ICIsIG1vbm89IiA8PCAoaXNfc3RlcmVvX3RvX21vbm9fID8gInRydWUiIDogImZhbHNlIikgPDwgIiByZXF1ZXN0IjsKLSAgYm9vbCByZXR2YWwgPSBmYWxzZTsKLSAgaWYgKHN0YXRlXyA9PSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBTkRCWSkgewotICAgIHN0YXRlXyA9IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFSVElORzsKLSAgICBpZiAoQmx1ZXRvb3RoQXVkaW9TZXNzaW9uQ29udHJvbF8yXzE6OlN0YXJ0U3RyZWFtKHNlc3Npb25fdHlwZV8pKSB7Ci0gICAgICByZXR2YWwgPSBDb25kd2FpdFN0YXRlKEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFSVElORyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykKLSAgICAgICAgICAgICAgICAgPDwgIiwgY29va2llPSIgPDwgU3RyaW5nUHJpbnRmKCIlI2h4IiwgY29va2llXykgPDwgIiwgc3RhdGU9IiA8PCBzdGF0ZV8gPDwgIiBIYWwgZmFpbHMiOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXR2YWwpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykKLSAgICAgICAgICAgICAgPDwgIiwgY29va2llPSIgPDwgU3RyaW5nUHJpbnRmKCIlI2h4IiwgY29va2llXykgPDwgIiwgc3RhdGU9IiA8PCBzdGF0ZV8KLSAgICAgICAgICAgICAgPDwgIiwgbW9ubz0iIDw8IChpc19zdGVyZW9fdG9fbW9ub18gPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiIGRvbmUiOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykKLSAgICAgICAgICAgICAgIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pIDw8ICIsIHN0YXRlPSIgPDwgc3RhdGVfIDw8ICIgZmFpbHVyZSI7Ci0gIH0KLQotICByZXR1cm4gcmV0dmFsOyAgLy8gZmFsc2UgaWYgYW55IGZhaWx1cmUgbGlrZSB0aW1lb3V0Ci19Ci0KLWJvb2wgQmx1ZXRvb3RoQXVkaW9Qb3J0OjpTdXNwZW5kKCkgewotICBpZiAoIWluX3VzZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb1BvcnQgaXMgbm90IGluIHVzZSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pCi0gICAgICAgICAgICA8PCAiLCBzdGF0ZT0iIDw8IHN0YXRlXyA8PCAiIHJlcXVlc3QiOwotICBib29sIHJldHZhbCA9IGZhbHNlOwotICBpZiAoc3RhdGVfID09IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFSVEVEKSB7Ci0gICAgc3RhdGVfID0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNVU1BFTkRJTkc7Ci0gICAgaWYgKEJsdWV0b290aEF1ZGlvU2Vzc2lvbkNvbnRyb2xfMl8xOjpTdXNwZW5kU3RyZWFtKHNlc3Npb25fdHlwZV8pKSB7Ci0gICAgICByZXR2YWwgPSBDb25kd2FpdFN0YXRlKEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVVNQRU5ESU5HKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXNzaW9uX3R5cGU9IiA8PCB0b1N0cmluZyhzZXNzaW9uX3R5cGVfKQotICAgICAgICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKSA8PCAiLCBzdGF0ZT0iIDw8IHN0YXRlXyA8PCAiIEhhbCBmYWlscyI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJldHZhbCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXNzaW9uX3R5cGU9IiA8PCB0b1N0cmluZyhzZXNzaW9uX3R5cGVfKQotICAgICAgICAgICAgICA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKSA8PCAiLCBzdGF0ZT0iIDw8IHN0YXRlXyA8PCAiIGRvbmUiOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogc2Vzc2lvbl90eXBlPSIgPDwgdG9TdHJpbmcoc2Vzc2lvbl90eXBlXykKLSAgICAgICAgICAgICAgIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pIDw8ICIsIHN0YXRlPSIgPDwgc3RhdGVfIDw8ICIgZmFpbHVyZSI7Ci0gIH0KLQotICByZXR1cm4gcmV0dmFsOyAgLy8gZmFsc2UgaWYgYW55IGZhaWx1cmUgbGlrZSB0aW1lb3V0Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXVkaW9Qb3J0OjpTdG9wKCkgewotICBpZiAoIWluX3VzZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb1BvcnQgaXMgbm90IGluIHVzZSI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXNzaW9uX3R5cGU9IiA8PCB0b1N0cmluZyhzZXNzaW9uX3R5cGVfKSA8PCAiLCBjb29raWU9IiA8PCBTdHJpbmdQcmludGYoIiUjaHgiLCBjb29raWVfKQotICAgICAgICAgICAgPDwgIiwgc3RhdGU9IiA8PCBzdGF0ZV8gPDwgIiByZXF1ZXN0IjsKLSAgc3RhdGVfID0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OkRJU0FCTEVEOwotICBCbHVldG9vdGhBdWRpb1Nlc3Npb25Db250cm9sXzJfMTo6U3RvcFN0cmVhbShzZXNzaW9uX3R5cGVfKTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pCi0gICAgICAgICAgICA8PCAiLCBzdGF0ZT0iIDw8IHN0YXRlXyA8PCAiIGRvbmUiOwotfQotCi1zaXplX3QgQmx1ZXRvb3RoQXVkaW9Qb3J0T3V0OjpXcml0ZURhdGEoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpIGNvbnN0IHsKLSAgaWYgKCFpbl91c2UoKSkgcmV0dXJuIDA7Ci0gIGlmICghaXNfc3RlcmVvX3RvX21vbm9fKSB7Ci0gICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvU2Vzc2lvbkNvbnRyb2xfMl8xOjpPdXRXcml0ZVBjbURhdGEoc2Vzc2lvbl90eXBlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ5dGVzKTsKLSAgfQotCi0gIC8vIFdBUiB0byBtaXggdGhlIHN0ZXJlbyBpbnRvIE1vbm8gKDE2IGJpdHMgcGVyIHNhbXBsZSkKLSAgY29uc3Qgc2l6ZV90IHdyaXRlX2ZyYW1lcyA9IGJ5dGVzID4+IDI7Ci0gIGlmICh3cml0ZV9mcmFtZXMgPT0gMCkgcmV0dXJuIDA7Ci0gIGF1dG8gc3JjID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCo+KGJ1ZmZlcik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbnQxNl90W10+IGRzdHtuZXcgaW50MTZfdFt3cml0ZV9mcmFtZXNdfTsKLSAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoZHN0LmdldCgpLCBzcmMsIHdyaXRlX2ZyYW1lcyk7Ci0gIC8vIGEgZnJhbWUgaXMgMTYgYml0cywgYW5kIHRoZSBzaXplIG9mIGEgbW9ubyBmcmFtZSBpcyBlcXVhbCB0byBoYWxmIGEgc3RlcmVvLgotICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9TZXNzaW9uQ29udHJvbF8yXzE6Ok91dFdyaXRlUGNtRGF0YSgKLSAgICAgICAgICAgICBzZXNzaW9uX3R5cGVfLCBkc3QuZ2V0KCksIHdyaXRlX2ZyYW1lcyAqIDIpICoKLSAgICAgICAgIDI7Ci19Ci0KLXNpemVfdCBCbHVldG9vdGhBdWRpb1BvcnRJbjo6UmVhZERhdGEodm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpIGNvbnN0IHsKLSAgaWYgKCFpbl91c2UoKSkgcmV0dXJuIDA7Ci0gIHJldHVybiBCbHVldG9vdGhBdWRpb1Nlc3Npb25Db250cm9sXzJfMTo6SW5SZWFkUGNtRGF0YShzZXNzaW9uX3R5cGVfLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyk7Ci19Ci0KLWJvb2wgQmx1ZXRvb3RoQXVkaW9Qb3J0OjpHZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCogZGVsYXlfbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjKiB0aW1lc3RhbXApIGNvbnN0IHsKLSAgaWYgKCFpbl91c2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9Qb3J0IGlzIG5vdCBpbiB1c2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBib29sIHJldHZhbCA9IEJsdWV0b290aEF1ZGlvU2Vzc2lvbkNvbnRyb2xfMl8xOjpHZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgIHNlc3Npb25fdHlwZV8sIGRlbGF5X25zLCBieXRlcywgdGltZXN0YW1wKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoaHgiLCBzZXNzaW9uX3R5cGVfKQotICAgICAgICAgICAgICAgPDwgIiwgY29va2llPSIgPDwgU3RyaW5nUHJpbnRmKCIlI2h4IiwgY29va2llXykgPDwgIiwgc3RhdGU9IiA8PCBzdGF0ZV8gPDwgIiwgZGVsYXk9IiA8PCAqZGVsYXlfbnMKLSAgICAgICAgICAgICAgIDw8ICJucywgZGF0YT0iIDw8ICpieXRlcyA8PCAiIGJ5dGVzLCB0aW1lc3RhbXA9IiA8PCB0aW1lc3RhbXAtPnR2X3NlYyA8PCAiLiIKLSAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiJTA5bGQiLCB0aW1lc3RhbXAtPnR2X25zZWMpIDw8ICJzIjsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi12b2lkIEJsdWV0b290aEF1ZGlvUG9ydDo6VXBkYXRlTWV0YWRhdGEoCi0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhKiBzb3VyY2VfbWV0YWRhdGEpIGNvbnN0IHsKLSAgaWYgKCFpbl91c2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9Qb3J0IGlzIG5vdCBpbiB1c2UiOwotICAgIHJldHVybjsKLSAgfQotICBMT0coREVCVUcpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iIDw8IHRvU3RyaW5nKHNlc3Npb25fdHlwZV8pIDw8ICIsIGNvb2tpZT0iIDw8IFN0cmluZ1ByaW50ZigiJSNoeCIsIGNvb2tpZV8pCi0gICAgICAgICAgICAgPDwgIiwgc3RhdGU9IiA8PCBzdGF0ZV8gPDwgIiwgIiA8PCBzb3VyY2VfbWV0YWRhdGEtPnRyYWNrX2NvdW50IDw8ICIgdHJhY2socykiOwotICBpZiAoc291cmNlX21ldGFkYXRhLT50cmFja19jb3VudCA9PSAwKSByZXR1cm47Ci0gIEJsdWV0b290aEF1ZGlvU2Vzc2lvbkNvbnRyb2xfMl8xOjpVcGRhdGVUcmFja3NNZXRhZGF0YShzZXNzaW9uX3R5cGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX21ldGFkYXRhKTsKLX0KLQotQmx1ZXRvb3RoU3RyZWFtU3RhdGUgQmx1ZXRvb3RoQXVkaW9Qb3J0OjpHZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQotCi12b2lkIEJsdWV0b290aEF1ZGlvUG9ydDo6U2V0U3RhdGUoQmx1ZXRvb3RoU3RyZWFtU3RhdGUgc3RhdGUpIHsKLSAgc3RhdGVfID0gc3RhdGU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdWRpbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2F1ZGlvX2JsdWV0b290aF9ody9kZXZpY2VfcG9ydF9wcm94eS5oIGIvYXVkaW9fYmx1ZXRvb3RoX2h3L2RldmljZV9wb3J0X3Byb3h5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTEzOTIuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYmx1ZXRvb3RoX2h3L2RldmljZV9wb3J0X3Byb3h5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2JsdWV0b290aC9hdWRpby8yLjEvdHlwZXMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi1lbnVtIGNsYXNzIEJsdWV0b290aFN0cmVhbVN0YXRlIDogdWludDhfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotCi11c2luZyBTZXNzaW9uVHlwZV8yXzEgPQotICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OlNlc3Npb25UeXBlOwotCi0vLyBQcm94eSBmb3IgQmx1ZXRvb3RoIEF1ZGlvIEhXIE1vZHVsZSB0byBjb21tdW5pY2F0ZSB3aXRoIEJsdWV0b290aCBBdWRpbwotLy8gU2Vzc2lvbiBDb250cm9sLiBBbGwgbWV0aG9kcyBhcmUgbm90IHRocmVhZCBzYWZlLCBzbyB1c2VycyBtdXN0IGFjcXVpcmUgYQotLy8gbG9jay4gTm90ZTogY3VycmVudGx5LCBpbiBzdHJlYW1fYXBpcy5jYywgaWYgR2V0U3RhdGUoKSBpcyBvbmx5IHVzZWQgZm9yCi0vLyB2ZXJib3NlIGxvZ2dpbmcsIGl0IGlzIG5vdCBsb2NrZWQsIHNvIHRoZSBzdGF0ZSBtYXkgbm90IGJlIHN5bmNocm9uaXplZC4KLWNsYXNzIEJsdWV0b290aEF1ZGlvUG9ydCB7Ci0gcHVibGljOgotICBCbHVldG9vdGhBdWRpb1BvcnQoKTsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoQXVkaW9Qb3J0KCkgPSBkZWZhdWx0OwotCi0gIC8vIEZldGNoIG91dHB1dCBjb250cm9sIC8gZGF0YSBwYXRoIG9mIEJsdWV0b290aEF1ZGlvUG9ydCBhbmQgc2V0dXAKLSAgLy8gY2FsbGJhY2tzIGludG8gQmx1ZXRvb3RoQXVkaW9Qcm92aWRlci4gSWYgU2V0VXAoKSByZXR1cm5zIGZhbHNlLCB0aGUgYXVkaW8KLSAgLy8gSEFMIG11c3QgZGVsZXRlIHRoaXMgQmx1ZXRvb3RoQXVkaW9Qb3J0IGFuZCByZXR1cm4gRUlOVkFMIHRvIGNhbGxlcgotICBib29sIFNldFVwKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKTsKLQotICAvLyBVbnJlZ2lzdGVyIHRoaXMgQmx1ZXRvb3RoQXVkaW9Qb3J0IGZyb20gQmx1ZXRvb3RoQXVkaW9TZXNzaW9uQ29udHJvbC4KLSAgLy8gQXVkaW8gSEFMIG11c3QgZGVsZXRlIHRoaXMgQmx1ZXRvb3RoQXVkaW9Qb3J0IGFmdGVyIGNhbGxpbmcgdGhpcy4KLSAgdm9pZCBUZWFyRG93bigpOwotCi0gIC8vIFdoZW4gdGhlIEF1ZGlvIGZyYW1ld29yayAvIEhBTCB0cmllcyB0byBxdWVyeSBhdWRpbyBjb25maWcgYWJvdXQgZm9ybWF0LAotICAvLyBjaGFubmVsIG1hc2sgYW5kIHNhbXBsZSByYXRlLCBpdCB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gZmV0Y2ggZnJvbSB0aGUKLSAgLy8gQmx1ZXRvb3RoIHN0YWNrCi0gIHZpcnR1YWwgYm9vbCBMb2FkQXVkaW9Db25maWcoYXVkaW9fY29uZmlnX3QqIGF1ZGlvX2NmZykgY29uc3QgPSAwOwotCi0gIC8vIFdBUiB0byBzdXBwb3J0IE1vbm8gbW9kZSAvIDE2IGJpdHMgcGVyIHNhbXBsZQotICB2b2lkIEZvcmNlUGNtU3RlcmVvVG9Nb25vKGJvb2wgZm9yY2UpIHsKLSAgICBpc19zdGVyZW9fdG9fbW9ub18gPSBmb3JjZTsKLSAgfQotCi0gIC8vIFdoZW4gdGhlIEF1ZGlvIGZyYW1ld29yayAvIEhBTCB3YW50cyB0byBjaGFuZ2UgdGhlIHN0cmVhbSBzdGF0ZSwgaXQgaW52b2tlcwotICAvLyB0aGVzZSAzIGZ1bmN0aW9ucyB0byBjb250cm9sIHRoZSBCbHVldG9vdGggc3RhY2sgKEF1ZGlvIENvbnRyb2wgUGF0aCkuCi0gIC8vIE5vdGU6IEJvdGggU3RhcnQoKSBhbmQgU3VzcGVuZCgpIHdpbGwgcmV0dXJuIHR1cmUgd2hlbiB0aGVyZSBhcmUgbm8gZXJyb3JzLgotICAvLyBDYWxsZWQgYnkgQXVkaW8gZnJhbWV3b3JrIC8gSEFMIHRvIHN0YXJ0IHRoZSBzdHJlYW0KLSAgYm9vbCBTdGFydCgpOwotICAvLyBDYWxsZWQgYnkgQXVkaW8gZnJhbWV3b3JrIC8gSEFMIHRvIHN1c3BlbmQgdGhlIHN0cmVhbQotICBib29sIFN1c3BlbmQoKTsKLSAgLy8gQ2FsbGVkIGJ5IEF1ZGlvIGZyYW1ld29yayAvIEhBTCB0byBzdG9wIHRoZSBzdHJlYW0KLSAgdm9pZCBTdG9wKCk7Ci0KLSAgLy8gQ2FsbGVkIGJ5IHRoZSBBdWRpbyBmcmFtZXdvcmsgLyBIQUwgdG8gZmV0Y2ggaW5mb3JtYWl0b24gYWJvdXQgYXVkaW8gZnJhbWVzCi0gIC8vIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBzaW5rLCBvciBmcmFtZXMgcHJlc2VudGVkIGZyb3IgYW4gaW50ZXJuYWwgc2luawotICBib29sIEdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90KiBkZWxheV9ucywgdWludDY0X3QqIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjKiB0aW1lc3RhbXApIGNvbnN0OwotCi0gIC8vIENhbGxlZCBieSB0aGUgQXVkaW8gZnJhbWV3b3JrIC8gSEFMIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncwotICAvLyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgdm9pZCBVcGRhdGVNZXRhZGF0YShjb25zdCBzb3VyY2VfbWV0YWRhdGEqIHNvdXJjZV9tZXRhZGF0YSkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IEJsdWV0b290aFN0cmVhbVN0YXRlCi0gIEJsdWV0b290aFN0cmVhbVN0YXRlIEdldFN0YXRlKCkgY29uc3Q7Ci0KLSAgLy8gU2V0IHRoZSBjdXJyZW50IEJsdWV0b290aFN0cmVhbVN0YXRlCi0gIHZvaWQgU2V0U3RhdGUoQmx1ZXRvb3RoU3RyZWFtU3RhdGUgc3RhdGUpOwotCi0gIGJvb2wgSXNBMmRwKCkgY29uc3QgewotICAgIHJldHVybiBzZXNzaW9uX3R5cGVfID09IFNlc3Npb25UeXBlXzJfMTo6QTJEUF9TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSCB8fAotICAgICAgICAgICBzZXNzaW9uX3R5cGVfID09IFNlc3Npb25UeXBlXzJfMTo6QTJEUF9IQVJEV0FSRV9PRkZMT0FEX0RBVEFQQVRIOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQxNl90IGNvb2tpZV87Ci0gIEJsdWV0b290aFN0cmVhbVN0YXRlIHN0YXRlXzsKLSAgU2Vzc2lvblR5cGVfMl8xIHNlc3Npb25fdHlwZV87Ci0gIC8vIFdSIHRvIHN1cHBvcnQgTW9ubzogVHJ1ZSBpZiBmZXRjaGluZyBTdGVyZW8gYW5kIG1peGluZyBpbnRvIE1vbm8KLSAgYm9vbCBpc19zdGVyZW9fdG9fbW9ub18gPSBmYWxzZTsKLSAgYm9vbCBpbl91c2UoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIG11dGFibGUgc3RkOjptdXRleCBjdl9tdXRleF87Ci0gIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGludGVybmFsX2N2XzsKLQotICAvLyBDaGVjayBhbmQgaW5pdGlhbGl6ZSBzZXNzaW9uIHR5cGUgZm9yIHxkZXZpY2VzfCBJZiBmYWlsZWQsIHRoaXMKLSAgLy8gQmx1ZXRvb3RoQXVkaW9Qb3J0IGlzIG5vdCBpbml0aWFsaXplZCBhbmQgbXVzdCBiZSBkZWxldGVkLgotICBib29sIGluaXRfc2Vzc2lvbl90eXBlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gIGJvb2wgQ29uZHdhaXRTdGF0ZShCbHVldG9vdGhTdHJlYW1TdGF0ZSBzdGF0ZSk7Ci0KLSAgdm9pZCBDb250cm9sUmVzdWx0SGFuZGxlcigKLSAgICAgIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OlN0YXR1cyYgc3RhdHVzKTsKLSAgdm9pZCBTZXNzaW9uQ2hhbmdlZEhhbmRsZXIoKTsKLX07Ci0KLWNsYXNzIEJsdWV0b290aEF1ZGlvUG9ydE91dCA6IHB1YmxpYyBCbHVldG9vdGhBdWRpb1BvcnQgewotIHB1YmxpYzoKLSAgfkJsdWV0b290aEF1ZGlvUG9ydE91dCgpID0gZGVmYXVsdDsKLQotICAvLyBUaGUgYXVkaW8gZGF0YSBwYXRoIHRvIHRoZSBCbHVldG9vdGggc3RhY2sgKFNvZnR3YXJlIGVuY29kaW5nKQotICBzaXplX3QgV3JpdGVEYXRhKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKSBjb25zdDsKLSAgYm9vbCBMb2FkQXVkaW9Db25maWcoYXVkaW9fY29uZmlnX3QqIGF1ZGlvX2NmZykgY29uc3Q7Ci19OwotCi1jbGFzcyBCbHVldG9vdGhBdWRpb1BvcnRJbiA6IHB1YmxpYyBCbHVldG9vdGhBdWRpb1BvcnQgewotIHB1YmxpYzoKLSAgfkJsdWV0b290aEF1ZGlvUG9ydEluKCkgPSBkZWZhdWx0OwotCi0gIC8vIFRoZSBhdWRpbyBkYXRhIHBhdGggZnJvbSB0aGUgQmx1ZXRvb3RoIHN0YWNrIChTb2Z0d2FyZSBkZWNvZGVkKQotICBzaXplX3QgUmVhZERhdGEodm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpIGNvbnN0OwotICBib29sIExvYWRBdWRpb0NvbmZpZyhhdWRpb19jb25maWdfdCogYXVkaW9fY2ZnKSBjb25zdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdWRpbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2F1ZGlvX2JsdWV0b290aF9ody9zdHJlYW1fYXBpcy5jYyBiL2F1ZGlvX2JsdWV0b290aF9ody9zdHJlYW1fYXBpcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwMmQ3YmMuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYmx1ZXRvb3RoX2h3L3N0cmVhbV9hcGlzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJUQXVkaW9IYWxTdHJlYW0iCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAic3RyZWFtX2FwaXMuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9Qb3J0T3V0OwotdXNpbmcgOjphbmRyb2lkOjpibHVldG9vdGg6OmF1ZGlvOjp1dGlsczo6R2V0QXVkaW9QYXJhbVN0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjphdWRpbzo6dXRpbHM6OlBhcnNlQXVkaW9QYXJhbXM7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga01pbmltdW1EZWxheU1zID0gNTA7Ci1jb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhpbXVtRGVsYXlNcyA9IDEwMDA7Ci1jb25zdGV4cHIgaW50IGtFeHRyYUF1ZGlvU3luY01zID0gMjAwOwotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgYXVkaW9fY29uZmlnJiBjb25maWcpIHsKLSAgcmV0dXJuIG9zIDw8ICJhdWRpb19jb25maWdbc2FtcGxlX3JhdGU9IiA8PCBjb25maWcuc2FtcGxlX3JhdGUKLSAgICAgICAgICAgIDw8ICIsIGNoYW5uZWxzPSIgPDwgU3RyaW5nUHJpbnRmKCIlI3giLCBjb25maWcuY2hhbm5lbF9tYXNrKQotICAgICAgICAgICAgPDwgIiwgZm9ybWF0PSIgPDwgY29uZmlnLmZvcm1hdCA8PCAiXSI7Ci19Ci0KLXZvaWQgb3V0X2NhbGN1bGF0ZV9mZWVkaW5nX2RlbGF5X21zKGNvbnN0IEJsdWV0b290aFN0cmVhbU91dCogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGxhdGVuY3lfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogZnJhbWVzID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyogdGltZXN0YW1wID0gbnVsbHB0cikgewotICBpZiAobGF0ZW5jeV9tcyA9PSBudWxscHRyICYmIGZyYW1lcyA9PSBudWxscHRyICYmIHRpbWVzdGFtcCA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gZGVsYXlfcmVwb3J0IGlzIHRoZSBhdWRpbyBkZWxheSBmcm9tIHRoZSByZW1vdGUgaGVhZHNldCByZWNlaXZpbmcgZGF0YSB0bwotICAvLyB0aGUgaGVhZHNldCBwbGF5aW5nIHNvdW5kIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzCi0gIHVpbnQ2NF90IGRlbGF5X3JlcG9ydF9ucyA9IDA7Ci0gIHVpbnQ2NF90IGRlbGF5X3JlcG9ydF9tcyA9IDA7Ci0gIC8vIGFic29yYmVkX2J5dGVzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2VudCBieSB0aGUgQmx1ZXRvb3RoIHN0YWNrIHRvCi0gIC8vIGEgcmVtb3RlIGhlYWRzZXQKLSAgdWludDY0X3QgYWJzb3JiZWRfYnl0ZXMgPSAwOwotICAvLyBhYnNvcmJlZF90aW1lc3RhbXAgaXMgdGhlIC4uLgotICBzdHJ1Y3QgdGltZXNwZWMgYWJzb3JiZWRfdGltZXN0YW1wID0ge307Ci0gIGJvb2wgdGltZXN0YW1wX2ZldGNoZWQgPSBmYWxzZTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sob3V0LT5tdXRleF8pOwotICBpZiAob3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgICAmZGVsYXlfcmVwb3J0X25zLCAmYWJzb3JiZWRfYnl0ZXMsICZhYnNvcmJlZF90aW1lc3RhbXApKSB7Ci0gICAgZGVsYXlfcmVwb3J0X21zID0gZGVsYXlfcmVwb3J0X25zIC8gMTAwMDAwMDsKLSAgICAvLyBhc3N1bWUga01pbmltdW1EZWxheU1zICg1MG1zKSA8IGRlbGF5X3JlcG9ydF9ucyA8IGtNYXhpbXVtRGVsYXlNcwotICAgIC8vICgxMDAwbXMpLCBvciBpdCBpcyBpbnZhbGlkIC8gaWdub3JlZCBhbmQgdXNlIG9sZCBkZWxheSBjYWxjdWxhdGVkCi0gICAgLy8gYnkgb3Vyc2VsdmVzLgotICAgIGlmIChkZWxheV9yZXBvcnRfbXMgPiBrTWluaW11bURlbGF5TXMgJiYKLSAgICAgICAgZGVsYXlfcmVwb3J0X21zIDwga01heGltdW1EZWxheU1zKSB7Ci0gICAgICB0aW1lc3RhbXBfZmV0Y2hlZCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChkZWxheV9yZXBvcnRfbXMgPj0ga01heGltdW1EZWxheU1zKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICA8PCAiLCBkZWxheV9yZXBvcnQ9IiA8PCBkZWxheV9yZXBvcnRfbnMgPDwgIm5zIGFibm9ybWFsIjsKLSAgICB9Ci0gIH0KLSAgaWYgKCF0aW1lc3RhbXBfZmV0Y2hlZCkgewotICAgIC8vIGRlZmF1bHQgdG8gb2xkIGRlbGF5IGlmIGFueSBmYWlsdXJlIGlzIGZvdW5kIHdoZW4gZmV0Y2hpbmcgZnJvbSBwb3J0cwotICAgIC8vIGF1ZGlvX2EyZHBfaHc6Ci0gICAgLy8gICBmcmFtZXNfY291bnQgPSBidWZmZXJfc2l6ZSAvIGZyYW1lX3NpemUKLSAgICAvLyAgIGxhdGVuY3kgKHNlYy4pID0gZnJhbWVzX2NvdW50IC8gc2FtcGxlc19wZXJfc2Vjb25kIChzYW1wbGVfcmF0ZSkKLSAgICAvLyBTeW5jIGZyb20gYXVkaW9fYTJkcF9odyB0byBhZGQgZXh0cmEgZGVsYXkga0V4dHJhQXVkaW9TeW5jTXMoKzIwMG1zKQotICAgIGRlbGF5X3JlcG9ydF9tcyA9Ci0gICAgICAgIG91dC0+ZnJhbWVzX2NvdW50XyAqIDEwMDAgLyBvdXQtPnNhbXBsZV9yYXRlXyArIGtFeHRyYUF1ZGlvU3luY01zOwotICAgIGlmICh0aW1lc3RhbXAgIT0gbnVsbHB0cikgewotICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhYnNvcmJlZF90aW1lc3RhbXApOwotICAgIH0KLSAgICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiB1c2VzIHRoZSBsZWdhY3kgZGVsYXkgIiA8PCBkZWxheV9yZXBvcnRfbXMgPDwgIiBtcyI7Ci0gIH0KLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBkZWxheT0iIDw8IGRlbGF5X3JlcG9ydF9tcyA8PCAibXMsIGRhdGE9IiA8PCBhYnNvcmJlZF9ieXRlcwotICAgICAgICAgICAgICAgPDwgIiBieXRlcywgdGltZXN0YW1wPSIgPDwgYWJzb3JiZWRfdGltZXN0YW1wLnR2X3NlYyA8PCAiLiIKLSAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiJTA5bGQiLCBhYnNvcmJlZF90aW1lc3RhbXAudHZfbnNlYykgPDwgInMiOwotCi0gIGlmIChsYXRlbmN5X21zICE9IG51bGxwdHIpIHsKLSAgICAqbGF0ZW5jeV9tcyA9IGRlbGF5X3JlcG9ydF9tczsKLSAgfQotICBpZiAoZnJhbWVzICE9IG51bGxwdHIpIHsKLSAgICBjb25zdCB1aW50NjRfdCBsYXRlbmN5X2ZyYW1lcyA9IGRlbGF5X3JlcG9ydF9tcyAqIG91dC0+c2FtcGxlX3JhdGVfIC8gMTAwMDsKLSAgICAqZnJhbWVzID0gYWJzb3JiZWRfYnl0ZXMgLyBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUoJm91dC0+c3RyZWFtX291dF8pOwotICAgIGlmIChvdXQtPmZyYW1lc19wcmVzZW50ZWRfIDwgKmZyYW1lcykgewotICAgICAgLy8gQXJlIHdlICh0aGUgYXVkaW8gSEFMKSByZXNldD8hIFRoZSBzdGFjayBjb3VudGVyIGlzIG9ic29sZXRlZC4KLSAgICAgICpmcmFtZXMgPSBvdXQtPmZyYW1lc19wcmVzZW50ZWRfOwotICAgIH0gZWxzZSBpZiAoKG91dC0+ZnJhbWVzX3ByZXNlbnRlZF8gLSAqZnJhbWVzKSA+IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgICAvLyBJcyB0aGUgQmx1ZXRvb3RoIG91dHB1dCByZXNldCAvIHJlc3RhcnRlZCBieSBBVkRUUCByZWNvbmZpZz8hIEl0cwotICAgICAgLy8gY291bnRlciB3YXMgcmVzZXQgYnV0IGNvdWxkIG5vdCBiZSB1c2VkLgotICAgICAgKmZyYW1lcyA9IG91dC0+ZnJhbWVzX3ByZXNlbnRlZF87Ci0gICAgfQotICAgIC8vIHN1cHBvc2UgZnJhbWVzIHdvdWxkIGJlIHF1ZXVlZCBpbiB0aGUgaGVhZHNldCBidWZmZXIgZm9yIGRlbGF5X3JlcG9ydAotICAgIC8vIHBlcmlvZCwgc28gdGhvc2UgZnJhbWVzIGluIGJ1ZmZlcnMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgbnVtYmVyCi0gICAgLy8gb2YgcHJlc2VudGVkIGZyYW1lcyBhdCB0aGUgdGltZXN0YW1wLgotICAgIGlmICgqZnJhbWVzID4gbGF0ZW5jeV9mcmFtZXMpIHsKLSAgICAgICpmcmFtZXMgLT0gbGF0ZW5jeV9mcmFtZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpmcmFtZXMgPSAwOwotICAgIH0KLSAgfQotICBpZiAodGltZXN0YW1wICE9IG51bGxwdHIpIHsKLSAgICAqdGltZXN0YW1wID0gYWJzb3JiZWRfdGltZXN0YW1wOwotICB9Ci19Ci0KLXZvaWQgaW5fY2FsY3VsYXRlX3N0YXJ2aW5nX2RlbGF5X21zKGNvbnN0IEJsdWV0b290aFN0cmVhbUluKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGZyYW1lcywgaW50NjRfdCogdGltZSkgewotICAvLyBkZWxheV9yZXBvcnQgaXMgdGhlIGF1ZGlvIGRlbGF5IGZyb20gdGhlIHJlbW90ZSBoZWFkc2V0IHJlY2VpdmluZyBkYXRhIHRvCi0gIC8vIHRoZSBoZWFkc2V0IHBsYXlpbmcgc291bmQgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMKLSAgdWludDY0X3QgZGVsYXlfcmVwb3J0X25zID0gMDsKLSAgdWludDY0X3QgZGVsYXlfcmVwb3J0X21zID0gMDsKLSAgLy8gZGlzcGVyc2VkX2J5dGVzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgYnkgdGhlIEJsdWV0b290aAotICAvLyBzdGFjayBmcm9tIGEgcmVtb3RlIGhlYWRzZXQKLSAgdWludDY0X3QgZGlzcGVyc2VkX2J5dGVzID0gMDsKLSAgc3RydWN0IHRpbWVzcGVjIGRpc3BlcnNlZF90aW1lc3RhbXAgPSB7fTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW4tPm11dGV4Xyk7Ci0gIGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgJmRlbGF5X3JlcG9ydF9ucywgJmRpc3BlcnNlZF9ieXRlcywgJmRpc3BlcnNlZF90aW1lc3RhbXApOwotICBkZWxheV9yZXBvcnRfbXMgPSBkZWxheV9yZXBvcnRfbnMgLyAxMDAwMDAwOwotCi0gIGNvbnN0IHVpbnQ2NF90IGxhdGVuY3lfZnJhbWVzID0gZGVsYXlfcmVwb3J0X21zICogaW4tPnNhbXBsZV9yYXRlXyAvIDEwMDA7Ci0gICpmcmFtZXMgPSBkaXNwZXJzZWRfYnl0ZXMgLyBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZSgmaW4tPnN0cmVhbV9pbl8pOwotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGRlbGF5PSIgPDwgZGVsYXlfcmVwb3J0X21zCi0gICAgICAgICAgICAgICA8PCAibXMsIGRhdGE9IiA8PCBkaXNwZXJzZWRfYnl0ZXMKLSAgICAgICAgICAgICAgIDw8ICIgYnl0ZXMsIHRpbWVzdGFtcD0iIDw8IGRpc3BlcnNlZF90aW1lc3RhbXAudHZfc2VjIDw8ICIuIgotICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIlMDlsZCIsIGRpc3BlcnNlZF90aW1lc3RhbXAudHZfbnNlYykgPDwgInMiOwotCi0gIGlmIChpbi0+ZnJhbWVzX3ByZXNlbnRlZF8gPCAqZnJhbWVzKSB7Ci0gICAgLy8gV2FzIGF1ZGlvIEhBTCByZXNldD8hIFRoZSBzdGFjayBjb3VudGVyIGlzIG9ic29sZXRlZC4KLSAgICAqZnJhbWVzID0gaW4tPmZyYW1lc19wcmVzZW50ZWRfOwotICB9IGVsc2UgaWYgKChpbi0+ZnJhbWVzX3ByZXNlbnRlZF8gLSAqZnJhbWVzKSA+IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgLy8gSXMgdGhlIEJsdWV0b290aCBpbnB1dCByZXNldCA/ISBJdHMgY291bnRlciB3YXMgcmVzZXQgYnV0IGNvdWxkIG5vdCBiZQotICAgIC8vIHVzZWQuCi0gICAgKmZyYW1lcyA9IGluLT5mcmFtZXNfcHJlc2VudGVkXzsKLSAgfQotICAvLyBzdXBwb3NlIGZyYW1lcyB3b3VsZCBiZSBxdWV1ZWQgaW4gdGhlIGhlYWRzZXQgYnVmZmVyIGZvciBkZWxheV9yZXBvcnQKLSAgLy8gcGVyaW9kLCBzbyB0aG9zZSBmcmFtZXMgaW4gYnVmZmVycyBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBudW1iZXIKLSAgLy8gb2YgcHJlc2VudGVkIGZyYW1lcyBhdCB0aGUgdGltZXN0YW1wLgotICBpZiAoKmZyYW1lcyA+IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgKmZyYW1lcyAtPSBsYXRlbmN5X2ZyYW1lczsKLSAgfSBlbHNlIHsKLSAgICAqZnJhbWVzID0gMDsKLSAgfQotCi0gICp0aW1lID0gKGRpc3BlcnNlZF90aW1lc3RhbXAudHZfc2VjICogMTAwMDAwMDAwMExMICsKLSAgICAgICAgICAgZGlzcGVyc2VkX3RpbWVzdGFtcC50dl9uc2VjKSAvCi0gICAgICAgICAgMTAwMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCbHVldG9vdGhTdHJlYW1TdGF0ZSYgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OkRJU0FCTEVEOgotICAgICAgcmV0dXJuIG9zIDw8ICJESVNBQkxFRCI7Ci0gICAgY2FzZSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBTkRCWToKLSAgICAgIHJldHVybiBvcyA8PCAiU1RBTkRCWSI7Ci0gICAgY2FzZSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRJTkc6Ci0gICAgICByZXR1cm4gb3MgPDwgIlNUQVJUSU5HIjsKLSAgICBjYXNlIEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFSVEVEOgotICAgICAgcmV0dXJuIG9zIDw8ICJTVEFSVEVEIjsKLSAgICBjYXNlIEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVVNQRU5ESU5HOgotICAgICAgcmV0dXJuIG9zIDw8ICJTVVNQRU5ESU5HIjsKLSAgICBjYXNlIEJsdWV0b290aFN0cmVhbVN0YXRlOjpVTktOT1dOOgotICAgICAgcmV0dXJuIG9zIDw8ICJVTktOT1dOIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJSNoaHgiLCBzdGF0ZSk7Ci0gIH0KLX0KLQotc3RhdGljIHVpbnQzMl90IG91dF9nZXRfc2FtcGxlX3JhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKSB7Ci0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgYXVkaW9fY29uZmlnX3QgYXVkaW9fY2ZnOwotICBpZiAob3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5Mb2FkQXVkaW9Db25maWcoJmF1ZGlvX2NmZykpIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBhdWRpb19jZmc9IiA8PCBhdWRpb19jZmc7Ci0gICAgcmV0dXJuIGF1ZGlvX2NmZy5zYW1wbGVfcmF0ZTsKLSAgfSBlbHNlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgc2FtcGxlX3JhdGU9IiA8PCBvdXQtPnNhbXBsZV9yYXRlXyA8PCAiIGZhaWxlZCI7Ci0gICAgcmV0dXJuIG91dC0+c2FtcGxlX3JhdGVfOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3NldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sIHVpbnQzMl90IHJhdGUpIHsKLSAgYXV0byogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxCbHVldG9vdGhTdHJlYW1PdXQqPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIHNhbXBsZV9yYXRlPSIgPDwgb3V0LT5zYW1wbGVfcmF0ZV87Ci0gIHJldHVybiAocmF0ZSA9PSBvdXQtPnNhbXBsZV9yYXRlXyA/IDAgOiAtMSk7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgb3V0X2dldF9idWZmZXJfc2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgY29uc3QgYXV0byogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCbHVldG9vdGhTdHJlYW1PdXQqPihzdHJlYW0pOwotICBzaXplX3QgYnVmZmVyX3NpemUgPQotICAgICAgb3V0LT5mcmFtZXNfY291bnRfICogYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKCZvdXQtPnN0cmVhbV9vdXRfKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBidWZmZXJfc2l6ZT0iIDw8IGJ1ZmZlcl9zaXplOwotICByZXR1cm4gYnVmZmVyX3NpemU7Ci19Ci0KLXN0YXRpYyBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRfZ2V0X2NoYW5uZWxzKAotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBjb25zdCBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIGF1ZGlvX2NvbmZpZ190IGF1ZGlvX2NmZzsKLSAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uTG9hZEF1ZGlvQ29uZmlnKCZhdWRpb19jZmcpKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgYXVkaW9fY2ZnPSIgPDwgYXVkaW9fY2ZnOwotICAgIHJldHVybiBhdWRpb19jZmcuY2hhbm5lbF9tYXNrOwotICB9IGVsc2UgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiLCBjaGFubmVscz0iIDw8IFN0cmluZ1ByaW50ZigiJSN4Iiwgb3V0LT5jaGFubmVsX21hc2tfKSA8PCAiIGZhaWx1cmUiOwotICAgIHJldHVybiBvdXQtPmNoYW5uZWxfbWFza187Ci0gIH0KLX0KLQotc3RhdGljIGF1ZGlvX2Zvcm1hdF90IG91dF9nZXRfZm9ybWF0KGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBjb25zdCBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIGF1ZGlvX2NvbmZpZ190IGF1ZGlvX2NmZzsKLSAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uTG9hZEF1ZGlvQ29uZmlnKCZhdWRpb19jZmcpKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgYXVkaW9fY2ZnPSIgPDwgYXVkaW9fY2ZnOwotICAgIHJldHVybiBhdWRpb19jZmcuZm9ybWF0OwotICB9IGVsc2UgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiLCBmb3JtYXQ9IiA8PCBvdXQtPmZvcm1hdF8gPDwgIiBmYWlsdXJlIjsKLSAgICByZXR1cm4gb3V0LT5mb3JtYXRfOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3NldF9mb3JtYXQoc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgYXV0byogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxCbHVldG9vdGhTdHJlYW1PdXQqPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGZvcm1hdD0iIDw8IG91dC0+Zm9ybWF0XzsKLSAgcmV0dXJuIChmb3JtYXQgPT0gb3V0LT5mb3JtYXRfID8gMCA6IC0xKTsKLX0KLQotc3RhdGljIGludCBvdXRfc3RhbmRieShzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgYXV0byogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxCbHVldG9vdGhTdHJlYW1PdXQqPihzdHJlYW0pOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sob3V0LT5tdXRleF8pOwotICBpbnQgcmV0dmFsID0gMDsKLQotICAvLyBvdXQtPmxhc3Rfd3JpdGVfdGltZV91c18gPSAwOyB1bm5lY2Vzc2FyeSBhcyBhIHN0YWxlIHdyaXRlIHRpbWUgaGFzIHNhbWUKLSAgLy8gZWZmZWN0Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiBiZWluZyBzdGFuZGJ5IChzdXNwZW5kKSI7Ci0gIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJURUQpIHsKLSAgICBvdXQtPmZyYW1lc19yZW5kZXJlZF8gPSAwOwotICAgIHJldHZhbCA9IChvdXQtPmJsdWV0b290aF9vdXRwdXRfLlN1c3BlbmQoKSA/IDAgOiAtRUlPKTsKLSAgfSBlbHNlIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0KLSAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJUSU5HIHx8Ci0gICAgICAgICAgICAgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpID09Ci0gICAgICAgICAgICAgICAgIEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVVNQRU5ESU5HKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgTk9UIHJlYWR5IHRvIGJlIHN0YW5kYnkiOwotICAgIHJldHZhbCA9IC1FQlVTWTsKLSAgfSBlbHNlIHsKLSAgICBMT0coREVCVUcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiIHN0YW5kYnkgYWxyZWFkeSI7Ci0gIH0KLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiIHN0YW5kYnkgKHN1c3BlbmQpIHJldHZhbD0iIDw8IHJldHZhbDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IG91dF9kdW1wKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwgaW50IGZkKSB7Ci0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdXRfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga3ZwYWlycykgewotICBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhvdXQtPm11dGV4Xyk7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwga3ZwYWlycz1bIiA8PCBrdnBhaXJzIDw8ICJdIjsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXMgPQotICAgICAgUGFyc2VBdWRpb1BhcmFtcyhrdnBhaXJzKTsKLSAgaWYgKHBhcmFtcy5lbXB0eSgpKSByZXR1cm4gcmV0dmFsOwotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBQYXJhbXNNYXA9WyIgPDwgR2V0QXVkaW9QYXJhbVN0cmluZyhwYXJhbXMpCi0gICAgICAgICAgICAgICA8PCAiXSI7Ci0KLSAgYXVkaW9fY29uZmlnX3QgYXVkaW9fY2ZnOwotICBpZiAocGFyYW1zLmZpbmQoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpICE9IHBhcmFtcy5lbmQoKSB8fAotICAgICAgcGFyYW1zLmZpbmQoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpICE9IHBhcmFtcy5lbmQoKSB8fAotICAgICAgcGFyYW1zLmZpbmQoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykgIT0gcGFyYW1zLmVuZCgpKSB7Ci0gICAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uTG9hZEF1ZGlvQ29uZmlnKCZhdWRpb19jZmcpKSB7Ci0gICAgICBvdXQtPnNhbXBsZV9yYXRlXyA9IGF1ZGlvX2NmZy5zYW1wbGVfcmF0ZTsKLSAgICAgIG91dC0+Y2hhbm5lbF9tYXNrXyA9IGF1ZGlvX2NmZy5jaGFubmVsX21hc2s7Ci0gICAgICBvdXQtPmZvcm1hdF8gPSBhdWRpb19jZmcuZm9ybWF0OwotICAgICAgTE9HKFZFUkJPU0UpIDw8ICJzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSA8PCAiLCBzYW1wbGVfcmF0ZT0iIDw8IG91dC0+c2FtcGxlX3JhdGVfCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgY2hhbm5lbHM9IiA8PCBTdHJpbmdQcmludGYoIiUjeCIsIG91dC0+Y2hhbm5lbF9tYXNrXykgPDwgIiwgZm9ybWF0PSIgPDwgb3V0LT5mb3JtYXRfOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkIHRvIGdldCBhdWRpbyBjb25maWciOwotICAgIH0KLSAgfQotCi0gIGlmIChwYXJhbXMuZmluZCgicm91dGluZyIpICE9IHBhcmFtcy5lbmQoKSkgewotICAgIGF1dG8gcm91dGluZ19wYXJhbSA9IHBhcmFtcy5maW5kKCJyb3V0aW5nIik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgIDw8ICIsIHN0cmVhbSBwYXJhbSAnIiA8PCByb3V0aW5nX3BhcmFtLT5maXJzdC5jX3N0cigpIDw8ICI9IgotICAgICAgICAgICAgICA8PCByb3V0aW5nX3BhcmFtLT5zZWNvbmQuY19zdHIoKSA8PCAiJyI7Ci0gIH0KLQotICBpZiAocGFyYW1zLmZpbmQoIkEyZHBTdXNwZW5kZWQiKSAhPSBwYXJhbXMuZW5kKCkgJiYKLSAgICAgIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uSXNBMmRwKCkpIHsKLSAgICBpZiAocGFyYW1zWyJBMmRwU3VzcGVuZGVkIl0gPT0gInRydWUiKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICA8PCAiIHN0cmVhbSBwYXJhbSBzdG9wcGVkIjsKLSAgICAgIG91dC0+ZnJhbWVzX3JlbmRlcmVkXyA9IDA7Ci0gICAgICBpZiAob3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpID09IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFSVEVEKSB7Ci0gICAgICAgIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uU3VzcGVuZCgpOwotICAgICAgICBvdXQtPmJsdWV0b290aF9vdXRwdXRfLlNldFN0YXRlKEJsdWV0b290aFN0cmVhbVN0YXRlOjpESVNBQkxFRCk7Ci0gICAgICB9IGVsc2UgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSAhPQotICAgICAgICAgICAgICAgICBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQpIHsKLSAgICAgICAgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5TdG9wKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgIDw8ICIgc3RyZWFtIHBhcmFtIHN0YW5kYnkiOwotICAgICAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSA9PSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQpIHsKLSAgICAgICAgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5TZXRTdGF0ZShCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBTkRCWSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBhcmFtcy5maW5kKCJjbG9zaW5nIikgIT0gcGFyYW1zLmVuZCgpKSB7Ci0gICAgaWYgKHBhcmFtc1siY2xvc2luZyJdID09ICJ0cnVlIikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgPDwgIiBzdHJlYW0gcGFyYW0gY2xvc2luZywgZGlzYWxsb3cgYW55IHdyaXRlcz8iOwotICAgICAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSAhPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQpIHsKLSAgICAgICAgb3V0LT5mcmFtZXNfcmVuZGVyZWRfID0gMDsKLSAgICAgICAgb3V0LT5mcmFtZXNfcHJlc2VudGVkXyA9IDA7Ci0gICAgICAgIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uU3RvcCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChwYXJhbXMuZmluZCgiZXhpdGluZyIpICE9IHBhcmFtcy5lbmQoKSkgewotICAgIGlmIChwYXJhbXNbImV4aXRpbmciXSA9PSAiMSIpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgIDw8ICIgc3RyZWFtIHBhcmFtIGV4aXRpbmciOwotICAgICAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSAhPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQpIHsKLSAgICAgICAgb3V0LT5mcmFtZXNfcmVuZGVyZWRfID0gMDsKLSAgICAgICAgb3V0LT5mcmFtZXNfcHJlc2VudGVkXyA9IDA7Ci0gICAgICAgIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uU3RvcCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwga3ZwYWlycz1bIiA8PCBrdnBhaXJzIDw8ICJdLCByZXR2YWw9IiA8PCByZXR2YWw7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjaGFyKiBvdXRfZ2V0X3BhcmFtZXRlcnMoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXlzKSB7Ci0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG91dC0+bXV0ZXhfKTsKLQotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGtleXM9WyIgPDwga2V5cyA8PCAiXSI7Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyYW1zID0gUGFyc2VBdWRpb1BhcmFtcyhrZXlzKTsKLSAgaWYgKHBhcmFtcy5lbXB0eSgpKSByZXR1cm4gc3RyZHVwKCIiKTsKLQotICBhdWRpb19jb25maWdfdCBhdWRpb19jZmc7Ci0gIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkxvYWRBdWRpb0NvbmZpZygmYXVkaW9fY2ZnKSkgewotICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiIGF1ZGlvX2NmZz0iIDw8IGF1ZGlvX2NmZzsKLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiIGZhaWxlZCB0byBnZXQgYXVkaW8gY29uZmlnIjsKLSAgfQotCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJldHVybl9wYXJhbXM7Ci0gIGlmIChwYXJhbXMuZmluZChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykgIT0gcGFyYW1zLmVuZCgpKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGFyYW07Ci0gICAgaWYgKGF1ZGlvX2NmZy5zYW1wbGVfcmF0ZSA9PSAxNjAwMCkgewotICAgICAgcGFyYW0gPSAiMTYwMDAiOwotICAgIH0KLSAgICBpZiAoYXVkaW9fY2ZnLnNhbXBsZV9yYXRlID09IDI0MDAwKSB7Ci0gICAgICBwYXJhbSA9ICIyNDAwMCI7Ci0gICAgfQotICAgIGlmIChhdWRpb19jZmcuc2FtcGxlX3JhdGUgPT0gNDQxMDApIHsKLSAgICAgIHBhcmFtID0gIjQ0MTAwIjsKLSAgICB9Ci0gICAgaWYgKGF1ZGlvX2NmZy5zYW1wbGVfcmF0ZSA9PSA0ODAwMCkgewotICAgICAgcGFyYW0gPSAiNDgwMDAiOwotICAgIH0KLSAgICBpZiAoYXVkaW9fY2ZnLnNhbXBsZV9yYXRlID09IDg4MjAwKSB7Ci0gICAgICBwYXJhbSA9ICI4ODIwMCI7Ci0gICAgfQotICAgIGlmIChhdWRpb19jZmcuc2FtcGxlX3JhdGUgPT0gOTYwMDApIHsKLSAgICAgIHBhcmFtID0gIjk2MDAwIjsKLSAgICB9Ci0gICAgaWYgKGF1ZGlvX2NmZy5zYW1wbGVfcmF0ZSA9PSAxNzY0MDApIHsKLSAgICAgIHBhcmFtID0gIjE3NjQwMCI7Ci0gICAgfQotICAgIGlmIChhdWRpb19jZmcuc2FtcGxlX3JhdGUgPT0gMTkyMDAwKSB7Ci0gICAgICBwYXJhbSA9ICIxOTIwMDAiOwotICAgIH0KLSAgICByZXR1cm5fcGFyYW1zW0FVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTXSA9IHBhcmFtOwotICB9Ci0KLSAgaWYgKHBhcmFtcy5maW5kKEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSAhPSBwYXJhbXMuZW5kKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBwYXJhbTsKLSAgICBpZiAoYXVkaW9fY2ZnLmNoYW5uZWxfbWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7Ci0gICAgICBwYXJhbSA9ICJBVURJT19DSEFOTkVMX09VVF9NT05PIjsKLSAgICB9Ci0gICAgaWYgKGF1ZGlvX2NmZy5jaGFubmVsX21hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7Ci0gICAgICBwYXJhbSA9ICJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iOwotICAgIH0KLSAgICByZXR1cm5fcGFyYW1zW0FVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTXSA9IHBhcmFtOwotICB9Ci0KLSAgaWYgKHBhcmFtcy5maW5kKEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpICE9IHBhcmFtcy5lbmQoKSkgewotICAgIHN0ZDo6c3RyaW5nIHBhcmFtOwotICAgIGlmIChhdWRpb19jZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICBwYXJhbSA9ICJBVURJT19GT1JNQVRfUENNXzE2X0JJVCI7Ci0gICAgfQotICAgIGlmIChhdWRpb19jZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCkgewotICAgICAgcGFyYW0gPSAiQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIjsKLSAgICB9Ci0gICAgaWYgKGF1ZGlvX2NmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQpIHsKLSAgICAgIHBhcmFtID0gIkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIjsKLSAgICB9Ci0gICAgcmV0dXJuX3BhcmFtc1tBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTXSA9IHBhcmFtOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBmb3IgKGNvbnN0IGF1dG8mIHB0ciA6IHJldHVybl9wYXJhbXMpIHsKLSAgICByZXN1bHQgKz0gcHRyLmZpcnN0ICsgIj0iICsgcHRyLnNlY29uZCArICI7IjsKLSAgfQotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgcmVzdWx0PVsiIDw8IHJlc3VsdCA8PCAiXSI7Ci0gIHJldHVybiBzdHJkdXAocmVzdWx0LmNfc3RyKCkpOwotfQotCi1zdGF0aWMgdWludDMyX3Qgb3V0X2dldF9sYXRlbmN5X21zKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0pIHsKLSAgY29uc3QgYXV0byogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCbHVldG9vdGhTdHJlYW1PdXQqPihzdHJlYW0pOwotICB1aW50MzJfdCBsYXRlbmN5X21zID0gMDsKLSAgb3V0X2NhbGN1bGF0ZV9mZWVkaW5nX2RlbGF5X21zKG91dCwgJmxhdGVuY3lfbXMpOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGxhdGVuY3k9IiA8PCBsYXRlbmN5X21zIDw8ICJtcyI7Ci0gIHJldHVybiBsYXRlbmN5X21zOwotfQotCi1zdGF0aWMgaW50IG91dF9zZXRfdm9sdW1lKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0sIGZsb2F0IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0KSB7Ci0gIGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBMZWZ0PSIgPDwgbGVmdCA8PCAiLCBSaWdodD0iIDw8IHJpZ2h0OwotICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG91dF93cml0ZShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLCBjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG91dC0+bXV0ZXhfKTsKLSAgc2l6ZV90IHRvdGFsV3JpdHRlbiA9IDA7Ci0KLSAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSAhPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRFRCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICA8PCAiIGZpcnN0IHRpbWUgYnl0ZXM9IiA8PCBieXRlczsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGlmIChzdHJlYW0tPnJlc3VtZShzdHJlYW0pKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkIHRvIHJlc3VtZSI7Ci0gICAgICBpZiAob3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpID09IEJsdWV0b290aFN0cmVhbVN0YXRlOjpESVNBQkxFRCkgewotICAgICAgICAvLyBkcm9wIGRhdGEgZm9yIGNhc2VzIG9mIEEyZHBTdXNwZW5kZWQ9dHJ1ZSAvIGNsb3Npbmc9dHJ1ZQotICAgICAgICB0b3RhbFdyaXR0ZW4gPSBieXRlczsKLSAgICAgIH0KLSAgICAgIHVzbGVlcChrQmx1ZXRvb3RoRGVmYXVsdE91dHB1dEJ1ZmZlck1zICogMTAwMCk7Ci0gICAgICByZXR1cm4gdG90YWxXcml0dGVuOwotICAgIH0KLSAgICBsb2NrLmxvY2soKTsKLSAgfQotICBsb2NrLnVubG9jaygpOwotICB0b3RhbFdyaXR0ZW4gPSBvdXQtPmJsdWV0b290aF9vdXRwdXRfLldyaXRlRGF0YShidWZmZXIsIGJ5dGVzKTsKLSAgbG9jay5sb2NrKCk7Ci0KLSAgc3RydWN0IHRpbWVzcGVjIHRzID0gey50dl9zZWMgPSAwLCAudHZfbnNlYyA9IDB9OwotICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKLSAgaWYgKHRvdGFsV3JpdHRlbikgewotICAgIGNvbnN0IHNpemVfdCBmcmFtZXMgPSBieXRlcyAvIGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShzdHJlYW0pOwotICAgIG91dC0+ZnJhbWVzX3JlbmRlcmVkXyArPSBmcmFtZXM7Ci0gICAgb3V0LT5mcmFtZXNfcHJlc2VudGVkXyArPSBmcmFtZXM7Ci0gICAgb3V0LT5sYXN0X3dyaXRlX3RpbWVfdXNfID0gKHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHRzLnR2X25zZWMpIC8gMTAwMDsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBpbnQ2NF90IG5vdyA9ICh0cy50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyB0cy50dl9uc2VjKSAvIDEwMDA7Ci0gICAgY29uc3QgaW50NjRfdCBlbGFwc2VkX3RpbWVfc2luY2VfbGFzdF93cml0ZSA9Ci0gICAgICAgIG5vdyAtIG91dC0+bGFzdF93cml0ZV90aW1lX3VzXzsKLSAgICAvLyBmcmFtZXNfY291bnQgPSB3cml0dGVuX2RhdGEgLyBmcmFtZV9zaXplCi0gICAgLy8gcGxheV90aW1lIChtcykgPSBmcmFtZXNfY291bnQgLyAoc2FtcGxlX3JhdGUgKFNlYy4pIC8gMTAwMDAwMCkKLSAgICAvLyBzbGVlcF90aW1lIChtcykgPSBwbGF5X3RpbWUgLSBlbGFwc2VkX3RpbWUKLSAgICBpbnQ2NF90IHNsZWVwX3RpbWUgPSBieXRlcyAqIDEwMDAwMDBMTCAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShzdHJlYW0pIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2dldF9zYW1wbGVfcmF0ZSgmc3RyZWFtLT5jb21tb24pIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkX3RpbWVfc2luY2VfbGFzdF93cml0ZTsKLSAgICBpZiAoc2xlZXBfdGltZSA+IDApIHsKLSAgICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzbGVlcCAiIDw8IChzbGVlcF90aW1lIC8gMTAwMCkKLSAgICAgICAgICAgICAgICAgICA8PCAiIG1zIHdoZW4gd3JpdHRpbmcgRk1RIGRhdGFwYXRoIjsKLSAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICB1c2xlZXAoc2xlZXBfdGltZSk7Ci0gICAgICBsb2NrLmxvY2soKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gd2UgZG9uJ3Qgc2xlZXAgd2hlbiB3ZSBleGl0IHN0YW5kYnkgKHRoaXMgaXMgdHlwaWNhbCBmb3IgYSByZWFsIGFsc2EKLSAgICAgIC8vIGJ1ZmZlcikuCi0gICAgICBzbGVlcF90aW1lID0gMDsKLSAgICB9Ci0gICAgb3V0LT5sYXN0X3dyaXRlX3RpbWVfdXNfID0gbm93ICsgc2xlZXBfdGltZTsKLSAgfQotICByZXR1cm4gdG90YWxXcml0dGVuOwotfQotCi1zdGF0aWMgaW50IG91dF9nZXRfcmVuZGVyX3Bvc2l0aW9uKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3BfZnJhbWVzKSB7Ci0gIGlmIChkc3BfZnJhbWVzID09IG51bGxwdHIpIHJldHVybiAtRUlOVkFMOwotCi0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgLy8gZnJhbWVzID0gKGxhdGVuY3kgKG1zKSAvIDEwMDApICogc2FtcGxlc19wZXJfc2Vjb25kIChzYW1wbGVfcmF0ZSkKLSAgY29uc3QgdWludDY0X3QgbGF0ZW5jeV9mcmFtZXMgPQotICAgICAgKHVpbnQ2NF90KW91dF9nZXRfbGF0ZW5jeV9tcyhzdHJlYW0pICogb3V0LT5zYW1wbGVfcmF0ZV8gLyAxMDAwOwotICBpZiAob3V0LT5mcmFtZXNfcmVuZGVyZWRfID49IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgKmRzcF9mcmFtZXMgPSAodWludDMyX3QpKG91dC0+ZnJhbWVzX3JlbmRlcmVkXyAtIGxhdGVuY3lfZnJhbWVzKTsKLSAgfSBlbHNlIHsKLSAgICAqZHNwX2ZyYW1lcyA9IDA7Ci0gIH0KLQotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGRzcF9mcmFtZXM9IiA8PCAqZHNwX2ZyYW1lczsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X2FkZF9hdWRpb19lZmZlY3QoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0KSB7Ci0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBlZmZlY3Q9IiA8PCBlZmZlY3Q7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG91dF9yZW1vdmVfYXVkaW9fZWZmZWN0KGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90IGVmZmVjdCkgewotICBjb25zdCBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgZWZmZWN0PSIgPDwgZWZmZWN0OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdXRfZ2V0X25leHRfd3JpdGVfdGltZXN0YW1wKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogdGltZXN0YW1wKSB7Ci0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgKnRpbWVzdGFtcCA9IDA7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgdGltZXN0YW1wPSIgPDwgKnRpbWVzdGFtcDsKLSAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3BhdXNlKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0pIHsKLSAgYXV0byogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxCbHVldG9vdGhTdHJlYW1PdXQqPihzdHJlYW0pOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sob3V0LT5tdXRleF8pOwotICBpbnQgcmV0dmFsID0gMDsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBwYXVzaW5nIChzdXNwZW5kKSI7Ci0gIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJURUQpIHsKLSAgICBvdXQtPmZyYW1lc19yZW5kZXJlZF8gPSAwOwotICAgIHJldHZhbCA9IChvdXQtPmJsdWV0b290aF9vdXRwdXRfLlN1c3BlbmQoKSA/IDAgOiAtRUlPKTsKLSAgfSBlbHNlIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0KLSAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQVJUSU5HIHx8Ci0gICAgICAgICAgICAgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpID09Ci0gICAgICAgICAgICAgICAgIEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVVNQRU5ESU5HKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgTk9UIHJlYWR5IHRvIHBhdXNlPyEiOwotICAgIHJldHZhbCA9IC1FQlVTWTsKLSAgfSBlbHNlIHsKLSAgICBMT0coREVCVUcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiIHBhdXNlZCBhbHJlYWR5IjsKLSAgfQotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIHBhdXNpbmcgKHN1c3BlbmQpIHJldHZhbD0iIDw8IHJldHZhbDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IG91dF9yZXN1bWUoc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSkgewotICBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhvdXQtPm11dGV4Xyk7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgcmVzdW1pbmcgKHN0YXJ0KSI7Ci0gIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQU5EQlkpIHsKLSAgICByZXR2YWwgPSAob3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5TdGFydCgpID8gMCA6IC1FSU8pOwotICB9IGVsc2UgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSA9PQotICAgICAgICAgICAgICAgICBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRJTkcgfHwKLSAgICAgICAgICAgICBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0KLSAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNVU1BFTkRJTkcpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBOT1QgcmVhZHkgdG8gcmVzdW1lPyEiOwotICAgIHJldHZhbCA9IC1FQlVTWTsKLSAgfSBlbHNlIGlmIChvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkgPT0KLSAgICAgICAgICAgICBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBOT1QgYWxsb3cgdG8gcmVzdW1lPyEiOwotICAgIHJldHZhbCA9IC1FSU5WQUw7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKERFQlVHKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiByZXN1bWVkIGFscmVhZHkiOwotICB9Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgcmVzdW1pbmcgKHN0YXJ0KSByZXR2YWw9IiA8PCByZXR2YWw7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGludCBvdXRfZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMqIHRpbWVzdGFtcCkgewotICBpZiAoZnJhbWVzID09IG51bGxwdHIgfHwgdGltZXN0YW1wID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIGNvbnN0IGF1dG8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtT3V0Kj4oc3RyZWFtKTsKLSAgb3V0X2NhbGN1bGF0ZV9mZWVkaW5nX2RlbGF5X21zKG91dCwgbnVsbHB0ciwgZnJhbWVzLCB0aW1lc3RhbXApOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lcz0iIDw8ICpmcmFtZXMgPDwgIiwgdGltZXN0YW1wPSIgPDwgdGltZXN0YW1wLT50dl9zZWMKLSAgICAgICAgICAgICAgIDw8ICIuIiA8PCBTdHJpbmdQcmludGYoIiUwOWxkIiwgdGltZXN0YW1wLT50dl9uc2VjKSA8PCAicyI7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvdXRfdXBkYXRlX3NvdXJjZV9tZXRhZGF0YSgKLSAgICBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLAotICAgIGNvbnN0IHN0cnVjdCBzb3VyY2VfbWV0YWRhdGEqIHNvdXJjZV9tZXRhZGF0YSkgewotICBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhvdXQtPm11dGV4Xyk7Ci0gIGlmIChzb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0ciB8fCBzb3VyY2VfbWV0YWRhdGEtPnRyYWNrX2NvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCAiIDw8IHNvdXJjZV9tZXRhZGF0YS0+dHJhY2tfY291bnQgPDwgIiB0cmFjayhzKSI7Ci0gIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uVXBkYXRlTWV0YWRhdGEoc291cmNlX21ldGFkYXRhKTsKLX0KLQotc3RhdGljIHNpemVfdCBzYW1wbGVzX3Blcl90aWNrcyhzaXplX3QgbWlsbGlzZWNvbmRzLCB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNoYW5uZWxfY291bnQpIHsKLSAgcmV0dXJuIG1pbGxpc2Vjb25kcyAqIHNhbXBsZV9yYXRlICogY2hhbm5lbF9jb3VudCAvIDEwMDA7Ci19Ci0KLWludCBhZGV2X29wZW5fb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnKiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqKiBzdHJlYW1fb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgX191bnVzZWQpIHsKLSAgKnN0cmVhbV9vdXQgPSBudWxscHRyOwotICBhdXRvKiBvdXQgPSBuZXcgQmx1ZXRvb3RoU3RyZWFtT3V0e307Ci0gIGlmICghb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5TZXRVcChkZXZpY2VzKSkgewotICAgIGRlbGV0ZSBvdXQ7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IFN0cmluZ1ByaW50ZigiJSN4IiwgZGV2aWNlcyk7Ci0KLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uZ2V0X3NhbXBsZV9yYXRlID0gb3V0X2dldF9zYW1wbGVfcmF0ZTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uc2V0X3NhbXBsZV9yYXRlID0gb3V0X3NldF9zYW1wbGVfcmF0ZTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uZ2V0X2J1ZmZlcl9zaXplID0gb3V0X2dldF9idWZmZXJfc2l6ZTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uZ2V0X2NoYW5uZWxzID0gb3V0X2dldF9jaGFubmVsczsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uZ2V0X2Zvcm1hdCA9IG91dF9nZXRfZm9ybWF0OwotICBvdXQtPnN0cmVhbV9vdXRfLmNvbW1vbi5zZXRfZm9ybWF0ID0gb3V0X3NldF9mb3JtYXQ7Ci0gIG91dC0+c3RyZWFtX291dF8uY29tbW9uLnN0YW5kYnkgPSBvdXRfc3RhbmRieTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uZHVtcCA9IG91dF9kdW1wOwotICBvdXQtPnN0cmVhbV9vdXRfLmNvbW1vbi5zZXRfcGFyYW1ldGVycyA9IG91dF9zZXRfcGFyYW1ldGVyczsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24uZ2V0X3BhcmFtZXRlcnMgPSBvdXRfZ2V0X3BhcmFtZXRlcnM7Ci0gIG91dC0+c3RyZWFtX291dF8uY29tbW9uLmFkZF9hdWRpb19lZmZlY3QgPSBvdXRfYWRkX2F1ZGlvX2VmZmVjdDsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5jb21tb24ucmVtb3ZlX2F1ZGlvX2VmZmVjdCA9IG91dF9yZW1vdmVfYXVkaW9fZWZmZWN0OwotICBvdXQtPnN0cmVhbV9vdXRfLmdldF9sYXRlbmN5ID0gb3V0X2dldF9sYXRlbmN5X21zOwotICBvdXQtPnN0cmVhbV9vdXRfLnNldF92b2x1bWUgPSBvdXRfc2V0X3ZvbHVtZTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy53cml0ZSA9IG91dF93cml0ZTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5nZXRfcmVuZGVyX3Bvc2l0aW9uID0gb3V0X2dldF9yZW5kZXJfcG9zaXRpb247Ci0gIG91dC0+c3RyZWFtX291dF8uZ2V0X25leHRfd3JpdGVfdGltZXN0YW1wID0gb3V0X2dldF9uZXh0X3dyaXRlX3RpbWVzdGFtcDsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5wYXVzZSA9IG91dF9wYXVzZTsKLSAgb3V0LT5zdHJlYW1fb3V0Xy5yZXN1bWUgPSBvdXRfcmVzdW1lOwotICBvdXQtPnN0cmVhbV9vdXRfLmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPSBvdXRfZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbjsKLSAgb3V0LT5zdHJlYW1fb3V0Xy51cGRhdGVfc291cmNlX21ldGFkYXRhID0gb3V0X3VwZGF0ZV9zb3VyY2VfbWV0YWRhdGE7Ci0KLSAgaWYgKCFvdXQtPmJsdWV0b290aF9vdXRwdXRfLkxvYWRBdWRpb0NvbmZpZyhjb25maWcpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQgdG8gZ2V0IGF1ZGlvIGNvbmZpZyI7Ci0gIH0KLSAgLy8gV0FSIHRvIHN1cHBvcnQgTW9ubyAvIDE2IGJpdHMgcGVyIHNhbXBsZSBhcyB0aGUgQmx1ZXRvb3RoIHN0YWNrIHJlcXVpcmVkCi0gIGlmIChjb25maWctPmNoYW5uZWxfbWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PICYmIGNvbmZpZy0+Zm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGZvcmNlIGNoYW5uZWxzPSIgPDwgU3RyaW5nUHJpbnRmKCIlI3giLCBvdXQtPmNoYW5uZWxfbWFza18pCi0gICAgICAgICAgICAgIDw8ICIgdG8gYmUgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIjsKLSAgICBvdXQtPmJsdWV0b290aF9vdXRwdXRfLkZvcmNlUGNtU3RlcmVvVG9Nb25vKHRydWUpOwotICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICB9Ci0gIG91dC0+c2FtcGxlX3JhdGVfID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgb3V0LT5jaGFubmVsX21hc2tfID0gY29uZmlnLT5jaGFubmVsX21hc2s7Ci0gIG91dC0+Zm9ybWF0XyA9IGNvbmZpZy0+Zm9ybWF0OwotICAvLyBmcmFtZSBpcyBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbAotICBvdXQtPmZyYW1lc19jb3VudF8gPQotICAgICAgc2FtcGxlc19wZXJfdGlja3Moa0JsdWV0b290aERlZmF1bHRPdXRwdXRCdWZmZXJNcywgb3V0LT5zYW1wbGVfcmF0ZV8sIDEpOwotICBvdXQtPmZyYW1lc19yZW5kZXJlZF8gPSAwOwotICBvdXQtPmZyYW1lc19wcmVzZW50ZWRfID0gMDsKLQotICB7Ci0gICAgYXV0byogYmx1ZXRvb3RoX2RldmljZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoQXVkaW9EZXZpY2UqPihkZXYpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChibHVldG9vdGhfZGV2aWNlLT5tdXRleF8pOwotICAgIGJsdWV0b290aF9kZXZpY2UtPm9wZW5lZF9zdHJlYW1fb3V0c18ucHVzaF9iYWNrKG91dCk7Ci0gIH0KLSAgKnN0cmVhbV9vdXQgPSAmb3V0LT5zdHJlYW1fb3V0XzsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpIDw8ICIsIHNhbXBsZV9yYXRlPSIgPDwgb3V0LT5zYW1wbGVfcmF0ZV8KLSAgICAgICAgICAgIDw8ICIsIGNoYW5uZWxzPSIgPDwgU3RyaW5nUHJpbnRmKCIlI3giLCBvdXQtPmNoYW5uZWxfbWFza18pIDw8ICIsIGZvcm1hdD0iIDw8IG91dC0+Zm9ybWF0XwotICAgICAgICAgICAgPDwgIiwgZnJhbWVzPSIgPDwgb3V0LT5mcmFtZXNfY291bnRfOwotICByZXR1cm4gMDsKLX0KLQotdm9pZCBhZGV2X2Nsb3NlX291dHB1dF9zdHJlYW0oc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSkgewotICBhdXRvKiBvdXQgPSByZWludGVycHJldF9jYXN0PEJsdWV0b290aFN0cmVhbU91dCo+KHN0cmVhbSk7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgc3RvcHBpbmciOwotICB7Ci0gICAgYXV0byogYmx1ZXRvb3RoX2RldmljZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoQXVkaW9EZXZpY2UqPihkZXYpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChibHVldG9vdGhfZGV2aWNlLT5tdXRleF8pOwotICAgIGJsdWV0b290aF9kZXZpY2UtPm9wZW5lZF9zdHJlYW1fb3V0c18ucmVtb3ZlKG91dCk7Ci0gIH0KLSAgaWYgKG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uR2V0U3RhdGUoKSAhPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6RElTQUJMRUQpIHsKLSAgICBvdXQtPmZyYW1lc19yZW5kZXJlZF8gPSAwOwotICAgIG91dC0+ZnJhbWVzX3ByZXNlbnRlZF8gPSAwOwotICAgIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uU3RvcCgpOwotICB9Ci0gIG91dC0+Ymx1ZXRvb3RoX291dHB1dF8uVGVhckRvd24oKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgb3V0LT5ibHVldG9vdGhfb3V0cHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBzdG9wcGVkIjsKLSAgZGVsZXRlIG91dDsKLX0KLQotc2l6ZV90IGFkZXZfZ2V0X2lucHV0X2J1ZmZlcl9zaXplKGNvbnN0IHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnKiBjb25maWcpIHsKLSAgLyogVE9ETzogQWRqdXN0IHRoaXMgdmFsdWUgKi8KLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fOwotICByZXR1cm4gMzIwOwotfQotCi1zdGF0aWMgdWludDMyX3QgaW5fZ2V0X3NhbXBsZV9yYXRlKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotCi0gIHJldHVybiBpbi0+c2FtcGxlX3JhdGVfOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sIHVpbnQzMl90IHJhdGUpIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLQotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBzYW1wbGVfcmF0ZT0iIDw8IGluLT5zYW1wbGVfcmF0ZV87Ci0gIHJldHVybiAocmF0ZSA9PSBpbi0+c2FtcGxlX3JhdGVfID8gMCA6IC1FTk9TWVMpOwotfQotCi1zdGF0aWMgc2l6ZV90IGluX2dldF9idWZmZXJfc2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLSAgc2l6ZV90IGJ1ZmZlcl9zaXplID0KLSAgICAgIGluLT5mcmFtZXNfY291bnRfICogYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUoJmluLT5zdHJlYW1faW5fKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVyX3NpemU9IiA8PCBidWZmZXJfc2l6ZTsKLSAgcmV0dXJuIGJ1ZmZlcl9zaXplOwotfQotCi1zdGF0aWMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5fZ2V0X2NoYW5uZWxzKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBhdWRpb19jb25maWdfdCBhdWRpb19jZmc7Ci0gIGlmIChpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5Mb2FkQXVkaW9Db25maWcoJmF1ZGlvX2NmZykpIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgYXVkaW9fY2ZnPSIgPDwgYXVkaW9fY2ZnOwotICAgIHJldHVybiBhdWRpb19jZmcuY2hhbm5lbF9tYXNrOwotICB9IGVsc2UgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgY2hhbm5lbHM9IiA8PCBTdHJpbmdQcmludGYoIiUjeCIsIGluLT5jaGFubmVsX21hc2tfKQotICAgICAgICAgICAgICAgICA8PCAiIGZhaWx1cmUiOwotICAgIHJldHVybiBpbi0+Y2hhbm5lbF9tYXNrXzsKLSAgfQotfQotCi1zdGF0aWMgYXVkaW9fZm9ybWF0X3QgaW5fZ2V0X2Zvcm1hdChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLSAgYXVkaW9fY29uZmlnX3QgYXVkaW9fY2ZnOwotICBpZiAoaW4tPmJsdWV0b290aF9pbnB1dF8uTG9hZEF1ZGlvQ29uZmlnKCZhdWRpb19jZmcpKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiIGF1ZGlvX2NmZz0iIDw8IGF1ZGlvX2NmZzsKLSAgICByZXR1cm4gYXVkaW9fY2ZnLmZvcm1hdDsKLSAgfSBlbHNlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGZvcm1hdD0iIDw8IGluLT5mb3JtYXRfIDw8ICIgZmFpbHVyZSI7Ci0gICAgcmV0dXJuIGluLT5mb3JtYXRfOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgaW5fc2V0X2Zvcm1hdChzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBmb3JtYXQ9IiA8PCBpbi0+Zm9ybWF0XzsKLSAgcmV0dXJuIChmb3JtYXQgPT0gaW4tPmZvcm1hdF8gPyAwIDogLUVOT1NZUyk7Ci19Ci0KLXN0YXRpYyBib29sIGluX3N0YXRlX3RyYW5zaXRpb25fdGltZW91dChCbHVldG9vdGhTdHJlYW1JbiogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiYgbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbHVldG9vdGhTdHJlYW1TdGF0ZSYgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dF9tcykgewotICAvKiBEb24ndCBsb29zZSBzdXNwZW5kIHJlcXVlc3QsIEFGIHdpbGwgbm90IHJldHJ5ICovCi0gIHdoaWxlIChpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpID09IHN0YXRlKSB7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICB1c2xlZXAoMTAwMCk7Ci0gICAgbG9jay5sb2NrKCk7Ci0KLSAgICAvKiBEb24ndCBibG9jayBBRiBmb3JldmVyICovCi0gICAgaWYgKC0tdGltZW91dF9tcyA8PSAwKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiwgY2FuJ3Qgc3VzcGVuZCAtIHN0dWNrZWQgaW46ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRlKSA8PCAiIHN0YXRlIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBpbl9zdGFuZGJ5KHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW4tPm11dGV4Xyk7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIgYmVpbmcgc3RhbmRieSAoc3VzcGVuZCkiOwotCi0gIC8qIEdpdmUgc29tZSB0aW1lIHRvIHN0YXJ0IHVwICovCi0gIGlmICghaW5fc3RhdGVfdHJhbnNpdGlvbl90aW1lb3V0KGluLCBsb2NrLCBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCbHVldG9vdGhEZWZhdWx0SW5wdXRTdGF0ZVRpbWVvdXRNcykpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiBOT1QgcmVhZHkgdG8gYnkgc3RhbmRieSI7Ci0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIGlmIChpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpID09IEJsdWV0b290aFN0cmVhbVN0YXRlOjpTVEFSVEVEKSB7Ci0gICAgcmV0dmFsID0gKGluLT5ibHVldG9vdGhfaW5wdXRfLlN1c3BlbmQoKSA/IDAgOiAtRUlPKTsKLSAgfSBlbHNlIGlmIChpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpICE9Ci0gICAgICAgICAgICAgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNVU1BFTkRJTkcpIHsKLSAgICBMT0coREVCVUcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiBzdGFuZGJ5IGFscmVhZHkiOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KLQotICAvKiBHaXZlIHNvbWUgdGltZSB0byBzdXNwZW5kICovCi0gIGlmICghaW5fc3RhdGVfdHJhbnNpdGlvbl90aW1lb3V0KGluLCBsb2NrLCBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1VTUEVORElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JsdWV0b290aERlZmF1bHRJbnB1dFN0YXRlVGltZW91dE1zKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiIE5PVCByZWFkeSB0byBieSBzdGFuZGJ5IjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIgc3RhbmRieSAoc3VzcGVuZCkgcmV0dmFsPSIgPDwgcmV0dmFsOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fZHVtcChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sIGludCBmZCkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9wYXJhbWV0ZXJzKHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhcioga3ZwYWlycykgewotICBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW4tPm11dGV4Xyk7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgPDwgIjogTk9UIEhBTkRMRUQhIHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgPDwgIiwga3ZwYWlycz1bIiA8PCBrdnBhaXJzIDw8ICJdIjsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXMgPQotICAgICAgUGFyc2VBdWRpb1BhcmFtcyhrdnBhaXJzKTsKLQotICBpZiAocGFyYW1zLmVtcHR5KCkpIHJldHVybiByZXR2YWw7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFBhcmFtc01hcD1bIiA8PCBHZXRBdWRpb1BhcmFtU3RyaW5nKHBhcmFtcykKLSAgICAgICAgICAgIDw8ICJdIjsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgY2hhciogaW5fZ2V0X3BhcmFtZXRlcnMoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleXMpIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGluLT5tdXRleF8pOwotCi0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogTk9UIEhBTkRMRUQhIHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgPDwgIiwga2V5cz1bIiA8PCBrZXlzIDw8ICJdIjsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXMgPSBQYXJzZUF1ZGlvUGFyYW1zKGtleXMpOwotICBpZiAocGFyYW1zLmVtcHR5KCkpIHJldHVybiBzdHJkdXAoIiIpOwotCi0gIGF1ZGlvX2NvbmZpZ190IGF1ZGlvX2NmZzsKLSAgaWYgKGluLT5ibHVldG9vdGhfaW5wdXRfLkxvYWRBdWRpb0NvbmZpZygmYXVkaW9fY2ZnKSkgewotICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBhdWRpb19jZmc9IiA8PCBhdWRpb19jZmc7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkIHRvIGdldCBhdWRpbyBjb25maWciOwotICB9Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcmV0dXJuX3BhcmFtczsKLQotICAvKiBUT0RPOiBJbXBsZW1lbnQgcGFyYW1ldGVyIGdldHRlciAqLwotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yIChjb25zdCBhdXRvJiBwdHIgOiByZXR1cm5fcGFyYW1zKSB7Ci0gICAgcmVzdWx0ICs9IHB0ci5maXJzdCArICI9IiArIHB0ci5zZWNvbmQgKyAiOyI7Ci0gIH0KLQotICByZXR1cm4gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLX0KLQotc3RhdGljIGludCBpbl9hZGRfYXVkaW9fZWZmZWN0KGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0KSB7Ci0gIGNvbnN0IGF1dG8qIGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCbHVldG9vdGhTdHJlYW1Jbio+KHN0cmVhbSk7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIGVmZmVjdD0iIDw8IGVmZmVjdDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fcmVtb3ZlX2F1ZGlvX2VmZmVjdChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90IGVmZmVjdCkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICA8PCAiLCBlZmZlY3Q9IiA8PCBlZmZlY3Q7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9nYWluKHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSwgZmxvYXQgZ2FpbikgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IE5PVCBIQU5ETEVEISBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGluX3JlYWQoc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykgewotICBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW4tPm11dGV4Xyk7Ci0gIHNpemVfdCB0b3RhbFJlYWQgPSAwOwotCi0gIC8qIEdpdmUgc29tZSB0aW1lIHRvIHN0YXJ0IHVwICovCi0gIGlmICghaW5fc3RhdGVfdHJhbnNpdGlvbl90aW1lb3V0KGluLCBsb2NrLCBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCbHVldG9vdGhEZWZhdWx0SW5wdXRTdGF0ZVRpbWVvdXRNcykpCi0gICAgcmV0dXJuIC1FQlVTWTsKLQotICBpZiAoaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKSAhPSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBUlRFRCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgPDwgIiBmaXJzdCB0aW1lIGJ5dGVzPSIgPDwgYnl0ZXM7Ci0KLSAgICBpbnQgcmV0dmFsID0gMDsKLSAgICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIsIHN0YXJ0aW5nIjsKLSAgICBpZiAoaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKSA9PSBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1RBTkRCWSkgewotICAgICAgcmV0dmFsID0gKGluLT5ibHVldG9vdGhfaW5wdXRfLlN0YXJ0KCkgPyAwIDogLUVJTyk7Ci0gICAgfSBlbHNlIGlmIChpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpID09Ci0gICAgICAgICAgICAgICBCbHVldG9vdGhTdHJlYW1TdGF0ZTo6U1VTUEVORElORykgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgTk9UIHJlYWR5IHRvIHN0YXJ0PyEiOwotICAgICAgcmV0dmFsID0gLUVCVVNZOwotICAgIH0gZWxzZSBpZiAoaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKSA9PQotICAgICAgICAgICAgICAgQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OkRJU0FCTEVEKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiBOT1QgYWxsb3cgdG8gc3RhcnQ/ISI7Ci0gICAgICByZXR2YWwgPSAtRUlOVkFMOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coREVCVUcpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiIHN0YXJ0ZWQgYWxyZWFkeSI7Ci0gICAgfQotICAgIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgc3RhcnRpbmcgKHN0YXJ0KSByZXR2YWw9IiA8PCByZXR2YWw7Ci0KLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZCB0byBzdGFydCI7Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLSAgfQotCi0gIGxvY2sudW5sb2NrKCk7Ci0gIHRvdGFsUmVhZCA9IGluLT5ibHVldG9vdGhfaW5wdXRfLlJlYWREYXRhKGJ1ZmZlciwgYnl0ZXMpOwotICBsb2NrLmxvY2soKTsKLQotICBzdHJ1Y3QgdGltZXNwZWMgdHMgPSB7LnR2X3NlYyA9IDAsIC50dl9uc2VjID0gMH07Ci0gIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOwotICBpbi0+bGFzdF9yZWFkX3RpbWVfdXNfID0gKHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHRzLnR2X25zZWMpIC8gMTAwMDsKLQotICBjb25zdCBzaXplX3QgZnJhbWVzID0gdG90YWxSZWFkIC8gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUoc3RyZWFtKTsKLSAgaW4tPmZyYW1lc19wcmVzZW50ZWRfICs9IGZyYW1lczsKLQotICByZXR1cm4gdG90YWxSZWFkOwotfQotCi1zdGF0aWMgdWludDMyX3QgaW5fZ2V0X2lucHV0X2ZyYW1lc19sb3N0KHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IE5PVCBIQU5ETEVEISBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fZ2V0X2NhcHR1cmVfcG9zaXRpb24oY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBmcmFtZXMsIGludDY0X3QqIHRpbWUpIHsKLSAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGZyYW1lcyA9PSBOVUxMIHx8IHRpbWUgPT0gTlVMTCkgewotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0gIGNvbnN0IGF1dG8qIGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCbHVldG9vdGhTdHJlYW1Jbio+KHN0cmVhbSk7Ci0KLSAgaWYgKGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoU3RyZWFtU3RhdGU6OlNUQU5EQlkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdGU9ICIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKTsKLSAgICByZXR1cm4gLUVOT1NZUzsKLSAgfQotCi0gIGluX2NhbGN1bGF0ZV9zdGFydmluZ19kZWxheV9tcyhpbiwgZnJhbWVzLCB0aW1lKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbl9zdGFydChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiBzdHJlYW0pIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBOT1QgSEFORExFRCEgc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX3N0b3AoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtKSB7Ci0gIGNvbnN0IGF1dG8qIGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCbHVldG9vdGhTdHJlYW1Jbio+KHN0cmVhbSk7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogTk9UIEhBTkRMRUQhIHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbl9jcmVhdGVfbW1hcF9idWZmZXIoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5fc2l6ZV9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyogaW5mbykgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IE5PVCBIQU5ETEVEISBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCk7Ci0KLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fZ2V0X21tYXBfcG9zaXRpb24oY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiogcG9zaXRpb24pIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBOT1QgSEFORExFRCEgc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpOwotCi0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IGluX2dldF9hY3RpdmVfbWljcm9waG9uZXMoCi0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLAotICAgIHN0cnVjdCBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QqIG1pY19hcnJheSwgc2l6ZV90KiBtaWNfY291bnQpIHsKLSAgY29uc3QgYXV0byogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IEJsdWV0b290aFN0cmVhbUluKj4oc3RyZWFtKTsKLSAgTE9HKFZFUkJPU0UpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBOT1QgSEFORExFRCEgc3RhdGU9IiA8PCBpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpOwotCi0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9taWNyb3Bob25lX2RpcmVjdGlvbihjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IE5PVCBIQU5ETEVEISBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCk7Ci0KLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fc2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uKAotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSwgZmxvYXQgem9vbSkgewotICBjb25zdCBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotICBMT0coVkVSQk9TRSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IE5PVCBIQU5ETEVEISBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCk7Ci0KLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyB2b2lkIGluX3VwZGF0ZV9zaW5rX21ldGFkYXRhKHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzaW5rX21ldGFkYXRhKiBzaW5rX21ldGFkYXRhKSB7Ci0gIGNvbnN0IGF1dG8qIGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCbHVldG9vdGhTdHJlYW1Jbio+KHN0cmVhbSk7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogTk9UIEhBTkRMRUQhIHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKTsKLX0KLQotaW50IGFkZXZfb3Blbl9pbnB1dF9zdHJlYW0oc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcqIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1faW4qKiBzdHJlYW1faW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcyBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgewotICAqc3RyZWFtX2luID0gbnVsbHB0cjsKLSAgYXV0byogaW4gPSBuZXcgQmx1ZXRvb3RoU3RyZWFtSW57fTsKLSAgaWYgKCFpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5TZXRVcChkZXZpY2VzKSkgewotICAgIGRlbGV0ZSBpbjsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9IiA8PCBTdHJpbmdQcmludGYoIiUjeCIsIGRldmljZXMpOwotCi0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUgPSBpbl9nZXRfc2FtcGxlX3JhdGU7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5zZXRfc2FtcGxlX3JhdGUgPSBpbl9zZXRfc2FtcGxlX3JhdGU7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5nZXRfYnVmZmVyX3NpemUgPSBpbl9nZXRfYnVmZmVyX3NpemU7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5nZXRfY2hhbm5lbHMgPSBpbl9nZXRfY2hhbm5lbHM7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5nZXRfZm9ybWF0ID0gaW5fZ2V0X2Zvcm1hdDsKLSAgaW4tPnN0cmVhbV9pbl8uY29tbW9uLnNldF9mb3JtYXQgPSBpbl9zZXRfZm9ybWF0OwotICBpbi0+c3RyZWFtX2luXy5jb21tb24uc3RhbmRieSA9IGluX3N0YW5kYnk7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5kdW1wID0gaW5fZHVtcDsKLSAgaW4tPnN0cmVhbV9pbl8uY29tbW9uLnNldF9wYXJhbWV0ZXJzID0gaW5fc2V0X3BhcmFtZXRlcnM7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5nZXRfcGFyYW1ldGVycyA9IGluX2dldF9wYXJhbWV0ZXJzOwotICBpbi0+c3RyZWFtX2luXy5jb21tb24uYWRkX2F1ZGlvX2VmZmVjdCA9IGluX2FkZF9hdWRpb19lZmZlY3Q7Ci0gIGluLT5zdHJlYW1faW5fLmNvbW1vbi5yZW1vdmVfYXVkaW9fZWZmZWN0ID0gaW5fcmVtb3ZlX2F1ZGlvX2VmZmVjdDsKLSAgaW4tPnN0cmVhbV9pbl8uc2V0X2dhaW4gPSBpbl9zZXRfZ2FpbjsKLSAgaW4tPnN0cmVhbV9pbl8ucmVhZCA9IGluX3JlYWQ7Ci0gIGluLT5zdHJlYW1faW5fLmdldF9pbnB1dF9mcmFtZXNfbG9zdCA9IGluX2dldF9pbnB1dF9mcmFtZXNfbG9zdDsKLSAgaW4tPnN0cmVhbV9pbl8uZ2V0X2NhcHR1cmVfcG9zaXRpb24gPSBpbl9nZXRfY2FwdHVyZV9wb3NpdGlvbjsKLSAgaW4tPnN0cmVhbV9pbl8uc3RhcnQgPSBpbl9zdGFydDsKLSAgaW4tPnN0cmVhbV9pbl8uc3RvcCA9IGluX3N0b3A7Ci0gIGluLT5zdHJlYW1faW5fLmNyZWF0ZV9tbWFwX2J1ZmZlciA9IGluX2NyZWF0ZV9tbWFwX2J1ZmZlcjsKLSAgaW4tPnN0cmVhbV9pbl8uZ2V0X21tYXBfcG9zaXRpb24gPSBpbl9nZXRfbW1hcF9wb3NpdGlvbjsKLSAgaW4tPnN0cmVhbV9pbl8uZ2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9IGluX2dldF9hY3RpdmVfbWljcm9waG9uZXM7Ci0gIGluLT5zdHJlYW1faW5fLnNldF9taWNyb3Bob25lX2RpcmVjdGlvbiA9IGluX3NldF9taWNyb3Bob25lX2RpcmVjdGlvbjsKLSAgaW4tPnN0cmVhbV9pbl8uc2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uID0KLSAgICAgIGluX3NldF9taWNyb3Bob25lX2ZpZWxkX2RpbWVuc2lvbjsKLSAgaW4tPnN0cmVhbV9pbl8udXBkYXRlX3NpbmtfbWV0YWRhdGEgPSBpbl91cGRhdGVfc2lua19tZXRhZGF0YTsKLQotICBpZiAoIWluLT5ibHVldG9vdGhfaW5wdXRfLkxvYWRBdWRpb0NvbmZpZyhjb25maWcpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkIHRvIGdldCBhdWRpbyBjb25maWciOwotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0KLSAgaW4tPnNhbXBsZV9yYXRlXyA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7Ci0gIGluLT5jaGFubmVsX21hc2tfID0gY29uZmlnLT5jaGFubmVsX21hc2s7Ci0gIGluLT5mb3JtYXRfID0gY29uZmlnLT5mb3JtYXQ7Ci0gIC8vIGZyYW1lIGlzIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsCi0gIGluLT5mcmFtZXNfY291bnRfID0KLSAgICAgIHNhbXBsZXNfcGVyX3RpY2tzKGtCbHVldG9vdGhEZWZhdWx0SW5wdXRCdWZmZXJNcywgaW4tPnNhbXBsZV9yYXRlXywgMSk7Ci0gIGluLT5mcmFtZXNfcHJlc2VudGVkXyA9IDA7Ci0KLSAgKnN0cmVhbV9pbiA9ICZpbi0+c3RyZWFtX2luXzsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgaW4tPmJsdWV0b290aF9pbnB1dF8uR2V0U3RhdGUoKQotICAgICAgICAgICAgPDwgIiwgc2FtcGxlX3JhdGU9IiA8PCBpbi0+c2FtcGxlX3JhdGVfCi0gICAgICAgICAgICA8PCAiLCBjaGFubmVscz0iIDw8IFN0cmluZ1ByaW50ZigiJSN4IiwgaW4tPmNoYW5uZWxfbWFza18pCi0gICAgICAgICAgICA8PCAiLCBmb3JtYXQ9IiA8PCBpbi0+Zm9ybWF0XyA8PCAiLCBmcmFtZXM9IiA8PCBpbi0+ZnJhbWVzX2NvdW50XzsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBhZGV2X2Nsb3NlX2lucHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSkgewotICBhdXRvKiBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qmx1ZXRvb3RoU3RyZWFtSW4qPihzdHJlYW0pOwotCi0gIGlmIChpbi0+Ymx1ZXRvb3RoX2lucHV0Xy5HZXRTdGF0ZSgpICE9IEJsdWV0b290aFN0cmVhbVN0YXRlOjpESVNBQkxFRCkgewotICAgIGluLT5ibHVldG9vdGhfaW5wdXRfLlN0b3AoKTsKLSAgfQotCi0gIGluLT5ibHVldG9vdGhfaW5wdXRfLlRlYXJEb3duKCk7Ci0gIExPRyhWRVJCT1NFKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZT0iIDw8IGluLT5ibHVldG9vdGhfaW5wdXRfLkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgIDw8ICIsIHN0b3BwZWQiOwotCi0gIGRlbGV0ZSBpbjsKLX0KZGlmZiAtLWdpdCBhL2F1ZGlvX2JsdWV0b290aF9ody9zdHJlYW1fYXBpcy5oIGIvYXVkaW9fYmx1ZXRvb3RoX2h3L3N0cmVhbV9hcGlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMWE4NDIuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYmx1ZXRvb3RoX2h3L3N0cmVhbV9hcGlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlICJkZXZpY2VfcG9ydF9wcm94eS5oIgotCi1jb25zdGV4cHIgdW5zaWduZWQgaW50IGtCbHVldG9vdGhEZWZhdWx0U2FtcGxlUmF0ZSA9IDQ0MTAwOwotY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtCbHVldG9vdGhEZWZhdWx0QXVkaW9Gb3JtYXRCaXRzUGVyU2FtcGxlID0KLSAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLQotY29uc3RleHByIHVuc2lnbmVkIGludCBrQmx1ZXRvb3RoRGVmYXVsdElucHV0QnVmZmVyTXMgPSAyMDsKLWNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga0JsdWV0b290aERlZmF1bHRJbnB1dFN0YXRlVGltZW91dE1zID0gMjA7Ci0KLWNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga0JsdWV0b290aERlZmF1bHRPdXRwdXRCdWZmZXJNcyA9IDI7Ci1jb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3Qga0JsdWV0b290aERlZmF1bHRPdXRwdXRDaGFubmVsTW9kZU1hc2sgPQotICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLWNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQmx1ZXRvb3RoRGVmYXVsdElucHV0Q2hhbm5lbE1vZGVNYXNrID0KLSAgICBBVURJT19DSEFOTkVMX0lOX01PTk87Ci0KLWVudW0gY2xhc3MgQmx1ZXRvb3RoU3RyZWFtU3RhdGUgOiB1aW50OF90IHsKLSAgRElTQUJMRUQgPSAwLCAgLy8gVGhpcyBzdHJlYW0gaXMgY2xvc2luZyBvciBzZXQgcGFyYW0gInN1c3BlbmQ9dHJ1ZSIKLSAgU1RBTkRCWSwKLSAgU1RBUlRJTkcsCi0gIFNUQVJURUQsCi0gIFNVU1BFTkRJTkcsCi0gIFVOS05PV04sCi19OwotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQmx1ZXRvb3RoU3RyZWFtU3RhdGUmIHN0YXRlKTsKLQotc3RydWN0IEJsdWV0b290aFN0cmVhbU91dCB7Ci0gIC8vIE11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciBzbyBpdCBjYW4gYmUgY2FzdCBmcm9tIGF1ZGlvX3N0cmVhbQotICAvLyBvciBhdWRpb19zdHJlYW1fb3V0IHBvaW50ZXIKLSAgYXVkaW9fc3RyZWFtX291dCBzdHJlYW1fb3V0X3t9OwotICA6OmFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OkJsdWV0b290aEF1ZGlvUG9ydE91dCBibHVldG9vdGhfb3V0cHV0XzsKLSAgaW50NjRfdCBsYXN0X3dyaXRlX3RpbWVfdXNfOwotICAvLyBBdWRpbyBQQ00gQ29uZmlncwotICB1aW50MzJfdCBzYW1wbGVfcmF0ZV87Ci0gIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxfbWFza187Ci0gIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdF87Ci0gIC8vIGZyYW1lIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbAotICAvLyBmcmFtZXMgY291bnQgcGVyIHRpY2sKLSAgc2l6ZV90IGZyYW1lc19jb3VudF87Ci0gIC8vIHRvdGFsIGZyYW1lcyB3cml0dGVuLCByZXNldCBvbiBzdGFuZGJ5Ci0gIHVpbnQ2NF90IGZyYW1lc19yZW5kZXJlZF87Ci0gIC8vIHRvdGFsIGZyYW1lcyB3cml0dGVuIGFmdGVyIG9wZW5lZCwgbmV2ZXIgcmVzZXQKLSAgdWludDY0X3QgZnJhbWVzX3ByZXNlbnRlZF87Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci19OwotCi1zdHJ1Y3QgQmx1ZXRvb3RoQXVkaW9EZXZpY2UgewotICAvLyBJbXBvcnRhbnQ6IGRldmljZSBtdXN0IGJlIGZpcnN0IGFzIGFuIGF1ZGlvX2h3X2RldmljZSogbWF5IGJlIGNhc3QgdG8KLSAgLy8gQmx1ZXRvb3RoQXVkaW9EZXZpY2UqIHdoZW4gdGhlIHR5cGUgaXMgaW1wbGljaXRseSBrbm93bi4KLSAgYXVkaW9faHdfZGV2aWNlIGF1ZGlvX2RldmljZV97fTsKLSAgLy8gcHJvdGVjdCBhZ2FpbnN0IGRldmljZS0+b3V0cHV0IGFuZCBzdHJlYW1fb3V0IGZyb20gYmVpbmcgaW5jb25zaXN0ZW50Ci0gIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICBzdGQ6Omxpc3Q8Qmx1ZXRvb3RoU3RyZWFtT3V0Kj4gb3BlbmVkX3N0cmVhbV9vdXRzXyA9Ci0gICAgICBzdGQ6Omxpc3Q8Qmx1ZXRvb3RoU3RyZWFtT3V0Kj4oMCk7Ci19OwotCi1zdHJ1Y3QgQmx1ZXRvb3RoU3RyZWFtSW4gewotICAvLyBNdXN0IGJlIHRoZSBmaXJzdCBtZW1iZXIgc28gaXQgY2FuIGJlIGNhc3QgZnJvbSBhdWRpb19zdHJlYW0KLSAgLy8gb3IgYXVkaW9fc3RyZWFtX2luIHBvaW50ZXIKLSAgYXVkaW9fc3RyZWFtX2luIHN0cmVhbV9pbl87Ci0gIDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9Qb3J0SW4gYmx1ZXRvb3RoX2lucHV0XzsKLSAgaW50NjRfdCBsYXN0X3JlYWRfdGltZV91c187Ci0gIC8vIEF1ZGlvIFBDTSBDb25maWdzCi0gIHVpbnQzMl90IHNhbXBsZV9yYXRlXzsKLSAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbF9tYXNrXzsKLSAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0XzsKLSAgLy8gZnJhbWUgaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsCi0gIC8vIGZyYW1lcyBjb3VudCBwZXIgdGljawotICBzaXplX3QgZnJhbWVzX2NvdW50XzsKLSAgLy8gdG90YWwgZnJhbWVzIHJlYWQgYWZ0ZXIgb3BlbmVkLCBuZXZlciByZXNldAotICB1aW50NjRfdCBmcmFtZXNfcHJlc2VudGVkXzsKLSAgbXV0YWJsZSBzdGQ6Om11dGV4IG11dGV4XzsKLX07Ci0KLWludCBhZGV2X29wZW5fb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnKiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqKiBzdHJlYW1fb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgX191bnVzZWQpOwotCi12b2lkIGFkZXZfY2xvc2Vfb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtKTsKLQotc2l6ZV90IGFkZXZfZ2V0X2lucHV0X2J1ZmZlcl9zaXplKGNvbnN0IHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnKiBjb25maWcpOwotCi1pbnQgYWRldl9vcGVuX2lucHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyogY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbioqIHN0cmVhbV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlIF9fdW51c2VkKTsKLQotdm9pZCBhZGV2X2Nsb3NlX2lucHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIGluKTsKZGlmZiAtLWdpdCBhL2F1ZGlvX2JsdWV0b290aF9ody91dGlscy5jYyBiL2F1ZGlvX2JsdWV0b290aF9ody91dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhYzdhNS4uMDAwMDAwMAotLS0gYS9hdWRpb19ibHVldG9vdGhfaHcvdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJUQXVkaW9IYWxVdGlscyIKLQotI2luY2x1ZGUgInV0aWxzLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdWRpbyB7Ci1uYW1lc3BhY2UgdXRpbHMgewotCi1zdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBQYXJzZUF1ZGlvUGFyYW1zKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbXMpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNlZ21lbnRzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQocGFyYW1zLCAiOyIpOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJhbXNfbWFwOwotICBmb3IgKGNvbnN0IGF1dG8mIHNlZ21lbnQgOiBzZWdtZW50cykgewotICAgIGlmIChzZWdtZW50Lmxlbmd0aCgpID09IDApIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ga3YgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChzZWdtZW50LCAiPSIpOwotICAgIGlmIChrdlswXS5lbXB0eSgpKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogSW52YWxpZCBhdWRpbyBwYXJhbWV0ZXIgIiA8PCBzZWdtZW50OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHBhcmFtc19tYXBba3ZbMF1dID0gKGt2LnNpemUoKSA+IDEgPyBrdlsxXSA6ICIiKTsKLSAgfQotICByZXR1cm4gcGFyYW1zX21hcDsKLX0KLQotc3RkOjpzdHJpbmcgR2V0QXVkaW9QYXJhbVN0cmluZygKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyYW1zX21hcCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc291dDsKLSAgZm9yIChjb25zdCBhdXRvJiBwdHIgOiBwYXJhbXNfbWFwKSB7Ci0gICAgc291dCA8PCAia2V5OiAnIiA8PCBwdHIuZmlyc3QgPDwgIicgdmFsdWU6ICciIDw8IHB0ci5zZWNvbmQgPDwgIidcbiI7Ci0gIH0KLSAgcmV0dXJuIHNvdXQuc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1dGlscwotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYXVkaW9fYmx1ZXRvb3RoX2h3L3V0aWxzLmggYi9hdWRpb19ibHVldG9vdGhfaHcvdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3YTQzMi4uMDAwMDAwMAotLS0gYS9hdWRpb19ibHVldG9vdGhfaHcvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF1ZGlvIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLS8vIENyZWF0ZXMgYSBoYXNoIG1hcCBiYXNlZCBvbiB0aGUgfHBhcmFtc3wgc3RyaW5nIGNvbnRhaW5pbmcga2V5IGFuZCB2YWx1ZQotLy8gcGFpcnMuICBQYWlycyBhcmUgZXhwZWN0ZWQgaW4gdGhlIGZvcm0gImtleT12YWx1ZSIgc2VwYXJhdGVkIGJ5IHRoZSAnOycKLS8vIGNoYXJhY3Rlci4gIEJvdGggJzsnIGFuZCAnPScgY2hhcmFjdGVycyBhcmUgaW52YWxpZCBpbiBrZXlzIG9yIHZhbHVlcy4KLS8vIEV4YW1wbGVzOgotLy8gICAia2V5MCIgICAgICAgICAgICAgICAgICAgICAgLT4gbWFwOiBba2V5MF09IiIKLS8vICAgImtleTA9dmFsdWUwO2tleTE9dmFsdWUxOyIgIC0+IG1hcDogW2tleTBdPSJ2YWx1ZTAiIFtrZXkxXT0idmFsdWUxIgotLy8gICAia2V5MD07a2V5MT12YWx1ZTE7IiAgICAgICAgLT4gbWFwOiBba2V5MF09IiIgW2tleTFdPSJ2YWx1ZTEiCi0vLyAgICI9dmFsdWUwO2tleTE9dmFsdWUxOyIgICAgICAtPiBtYXA6IFtrZXkxXT0idmFsdWUxIgotc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gUGFyc2VBdWRpb1BhcmFtcygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1zKTsKLQotLy8gRHVtcHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBoYXNoX21hcCB0byB0aGUgbG9nIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0vLyBJZiB8bWFwfCBpcyBub3QgTlVMTCwgYWxsIGVudHJpZXMgb2YgfG1hcHwgd2lsbCBiZSBkdW1wZWQsIG90aGVyd2lzZQotLy8gbm90aGluZyB3aWxsIGJlIGR1bXBlZC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZSB0aGUgb3duZXJzaGlwCi0vLyBvZiB0aGUgfG1hcHwuCi1zdGQ6OnN0cmluZyBHZXRBdWRpb1BhcmFtU3RyaW5nKAotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJhbXNfbWFwKTsKLQotfSAgLy8gbmFtZXNwYWNlIHV0aWxzCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hdWRpb19ibHVldG9vdGhfaHcvdXRpbHNfdW5pdHRlc3QuY2MgYi9hdWRpb19ibHVldG9vdGhfaHcvdXRpbHNfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NWRlYTYuLjAwMDAwMDAKLS0tIGEvYXVkaW9fYmx1ZXRvb3RoX2h3L3V0aWxzX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJ1dGlscy5oIgotCi1uYW1lc3BhY2UgewotCi11c2luZyA6OmFuZHJvaWQ6OmJsdWV0b290aDo6YXVkaW86OnV0aWxzOjpQYXJzZUF1ZGlvUGFyYW1zOwotCi1jbGFzcyBVdGlsc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgbWFwXy5jbGVhcigpOyB9Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwXzsKLX07Ci0KLVRFU1RfRihVdGlsc1Rlc3QsIEhhc2hNYXBFbXB0eVBhcmFtcykgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAiIjsKLSAgbWFwXyA9IFBhcnNlQXVkaW9QYXJhbXMocGFyYW1zKTsKLSAgLy8gbWFwID0ge30KLSAgRVhQRUNUX1RSVUUobWFwXy5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKFV0aWxzVGVzdCwgSGFzaE1hcERlbGltaXRPbmx5KSB7Ci0gIHN0ZDo6c3RyaW5nIHBhcmFtcyA9ICI7IjsKLSAgbWFwXyA9IFBhcnNlQXVkaW9QYXJhbXMocGFyYW1zKTsKLSAgLy8gbWFwID0ge30KLSAgRVhQRUNUX1RSVUUobWFwXy5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKFV0aWxzVGVzdCwgSGFzaE1hcE5vdEtleVZhbHVlUGFpcikgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAia2V5MCI7Ci0gIG1hcF8gPSBQYXJzZUF1ZGlvUGFyYW1zKHBhcmFtcyk7Ci0gIC8vIG1hcCA9IHtba2V5MF09IiJ9Ci0gIEVYUEVDVF9FUShtYXBfLnNpemUoKSwgMSk7Ci0gIEVYUEVDVF9ORShtYXBfLmZpbmQoImtleTAiKSwgbWFwXy5lbmQoKSk7Ci0gIEVYUEVDVF9FUShtYXBfWyJrZXkwIl0ubGVuZ3RoKCksIDApOwotfQotCi1URVNUX0YoVXRpbHNUZXN0LCBIYXNoTWFwRW1wdHlWYWx1ZSkgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAia2V5MD0iOwotICBtYXBfID0gUGFyc2VBdWRpb1BhcmFtcyhwYXJhbXMpOwotICAvLyBtYXAgPSB7W2tleTBdPSIifQotICBFWFBFQ1RfRVEobWFwXy5zaXplKCksIDEpOwotICBFWFBFQ1RfTkUobWFwXy5maW5kKCJrZXkwIiksIG1hcF8uZW5kKCkpOwotICBFWFBFQ1RfRVEobWFwX1sia2V5MCJdLmxlbmd0aCgpLCAwKTsKLX0KLQotVEVTVF9GKFV0aWxzVGVzdCwgSGFzaE1hcEVtcHR5VmFsdWVXaXRoRGVsaW1pdCkgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAia2V5MD07IjsKLSAgbWFwXyA9IFBhcnNlQXVkaW9QYXJhbXMocGFyYW1zKTsKLSAgLy8gbWFwID0ge1trZXkwXT0iIn0KLSAgRVhQRUNUX0VRKG1hcF8uc2l6ZSgpLCAxKTsKLSAgRVhQRUNUX05FKG1hcF8uZmluZCgia2V5MCIpLCBtYXBfLmVuZCgpKTsKLSAgRVhQRUNUX0VRKG1hcF9bImtleTAiXS5sZW5ndGgoKSwgMCk7Ci19Ci0KLVRFU1RfRihVdGlsc1Rlc3QsIEhhc2hNYXBPbmVLZXlWYWx1ZVBhaXIpIHsKLSAgc3RkOjpzdHJpbmcgcGFyYW1zID0gImtleTA9dmFsdWUwIjsKLSAgbWFwXyA9IFBhcnNlQXVkaW9QYXJhbXMocGFyYW1zKTsKLSAgLy8gbWFwID0ge1trZXkwXT0idmFsdWUwIn0KLSAgRVhQRUNUX0VRKG1hcF8uc2l6ZSgpLCAxKTsKLSAgRVhQRUNUX0VRKG1hcF9bImtleTAiXSwgInZhbHVlMCIpOwotfQotCi1URVNUX0YoVXRpbHNUZXN0LCBIYXNoTWFwT25lS2V5VmFsdWVQYWlyV2l0aERlbGltaXQpIHsKLSAgc3RkOjpzdHJpbmcgcGFyYW1zID0gImtleTA9dmFsdWUwOyI7Ci0gIG1hcF8gPSBQYXJzZUF1ZGlvUGFyYW1zKHBhcmFtcyk7Ci0gIC8vIG1hcCA9IHtba2V5MF09InZhbHVlMCJ9Ci0gIEVYUEVDVF9FUShtYXBfLnNpemUoKSwgMSk7Ci0gIEVYUEVDVF9FUShtYXBfWyJrZXkwIl0sICJ2YWx1ZTAiKTsKLX0KLQotVEVTVF9GKFV0aWxzVGVzdCwgSGFzaE1hcFR3b0tleVZhbHVlUGFpcnMpIHsKLSAgc3RkOjpzdHJpbmcgcGFyYW1zID0gImtleTA9dmFsdWUwO2tleTE9dmFsdWUxIjsKLSAgbWFwXyA9IFBhcnNlQXVkaW9QYXJhbXMocGFyYW1zKTsKLSAgLy8gbWFwID0ge1trZXkwXT0idmFsdWUwIiwgW2tleTFdPSJ2YWx1ZTEifQotICBFWFBFQ1RfRVEobWFwXy5zaXplKCksIDIpOwotICBFWFBFQ1RfRVEobWFwX1sia2V5MCJdLCAidmFsdWUwIik7Ci0gIEVYUEVDVF9FUShtYXBfWyJrZXkxIl0sICJ2YWx1ZTEiKTsKLX0KLQotVEVTVF9GKFV0aWxzVGVzdCwgSGFzaE1hcEVtcHR5S2V5KSB7Ci0gIHN0ZDo6c3RyaW5nIHBhcmFtcyA9ICI9dmFsdWUiOwotICBtYXBfID0gUGFyc2VBdWRpb1BhcmFtcyhwYXJhbXMpOwotICAvLyBtYXAgPSB7fQotICBFWFBFQ1RfVFJVRShtYXBfLmVtcHR5KCkpOwotfQotCi1URVNUX0YoVXRpbHNUZXN0LCBIYXNoTWFwRW1wdHlLZXlXaXRoRGVsaW1pdCkgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAiPXZhbHVlOyI7Ci0gIG1hcF8gPSBQYXJzZUF1ZGlvUGFyYW1zKHBhcmFtcyk7Ci0gIC8vIG1hcCA9IHt9Ci0gIEVYUEVDVF9UUlVFKG1hcF8uZW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihVdGlsc1Rlc3QsIEhhc2hNYXBFcXVpdmFsZW50T25seSkgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAiPSI7Ci0gIG1hcF8gPSBQYXJzZUF1ZGlvUGFyYW1zKHBhcmFtcyk7Ci0gIC8vIG1hcCA9IHt9Ci0gIEVYUEVDVF9UUlVFKG1hcF8uZW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihVdGlsc1Rlc3QsIEhhc2hNYXBOb0tleVZhbHVlUGFpcikgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAiPTsiOwotICBtYXBfID0gUGFyc2VBdWRpb1BhcmFtcyhwYXJhbXMpOwotICAvLyBtYXAgPSB7fQotICBFWFBFQ1RfVFJVRShtYXBfLmVtcHR5KCkpOwotfQotCi1URVNUX0YoVXRpbHNUZXN0LCBIYXNoTWFwVHdvUGFpcnNXaXRoRmlyc3RLZXlFbXB0eSkgewotICBzdGQ6OnN0cmluZyBwYXJhbXMgPSAiPXZhbHVlMDtrZXkxPXZhbHVlMSI7Ci0gIG1hcF8gPSBQYXJzZUF1ZGlvUGFyYW1zKHBhcmFtcyk7Ci0gIC8vIG1hcCA9IHtba2V5MV09InZhbHVlMSJ9Ci0gIEVYUEVDVF9FUShtYXBfLnNpemUoKSwgMSk7Ci0gIEVYUEVDVF9FUShtYXBfWyJrZXkxIl0sICJ2YWx1ZTEiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL0FuZHJvaWQuYnAgYi9hdWRpb19oYWxfaW50ZXJmYWNlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MWFkMTYuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gQmx1ZXRvb3RoIEF1ZGlvIGxpYnJhcnkgZm9yIHRhcmdldAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidC1hdWRpby1oYWwtaW50ZXJmYWNlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QvcnVzdC9zaGltIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4xIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJsaWJmbXEiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAiYTJkcF9lbmNvZGluZy5jYyIsCi0gICAgICAgICAgICAgICAgImNsaWVudF9pbnRlcmZhY2UuY2MiLAotICAgICAgICAgICAgICAgICJjb2RlY19zdGF0dXMuY2MiLAotICAgICAgICAgICAgICAgICJoZWFyaW5nX2FpZF9zb2Z0d2FyZV9lbmNvZGluZy5jYyIsCi0gICAgICAgICAgICAgICAgImxlX2F1ZGlvX3NvZnR3YXJlLmNjIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAiYTJkcF9lbmNvZGluZ19ob3N0LmNjIiwKLSAgICAgICAgICAgICAgICAiaGVhcmluZ19haWRfc29mdHdhcmVfZW5jb2RpbmdfaG9zdC5jYyIsCi0gICAgICAgICAgICAgICAgImxlX2F1ZGlvX3NvZnR3YXJlX2hvc3QuY2MiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICB9LAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotLy8gQmx1ZXRvb3RoIEF1ZGlvIGNsaWVudCBpbnRlcmZhY2UgbGlicmFyeSB1bml0IHRlc3RzIGZvciB0YXJnZXQgYW5kIGhvc3QKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJibHVldG9vdGgtdGVzdC1hdWRpby1oYWwtaW50ZXJmYWNlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjbGllbnRfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4xIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1hdWRpby1oYWwtaW50ZXJmYWNlIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL0JVSUxELmduIGIvYXVkaW9faGFsX2ludGVyZmFjZS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMzg1Ni4uMDAwMDAwMAotLS0gYS9hdWRpb19oYWxfaW50ZXJmYWNlL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXN0YXRpY19saWJyYXJ5KCJhdWRpb19oYWxfaW50ZXJmYWNlIikgewotICBzb3VyY2VzID0gWwotICAgICJhMmRwX2VuY29kaW5nX2hvc3QuY2MiLAotICAgICJoZWFyaW5nX2FpZF9zb2Z0d2FyZV9lbmNvZGluZ19ob3N0LmNjIiwKLSAgXQotCi0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiLy9idC9idGEvaW5jbHVkZSIsCi0gICAgIi8vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAiLy9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAiLy9idC9nZC9ydXN0L3NoaW0iLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0OnRhcmdldF9kZWZhdWx0cyIgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvY29tbW9uIiwKLSAgICAiLy9idC9vc2k6b3NpIiwKLSAgXQotfQpkaWZmIC0tZ2l0IGEvYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nLmNjIGIvYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZhOTQzLi4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJhMmRwX2VuY29kaW5nIgotCi0jaW5jbHVkZSAiYTJkcF9lbmNvZGluZy5oIgotCi0jaW5jbHVkZSAiYTJkcF9zYmNfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiYnRpZl9hMmRwX3NvdXJjZS5oIgotI2luY2x1ZGUgImJ0aWZfYXYuaCIKLSNpbmNsdWRlICJidGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAiYnRpZl9oZi5oIgotI2luY2x1ZGUgImNsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2RlY19zdGF0dXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpBdWRpb0NhcGFiaWxpdGllczsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6QXVkaW9Db25maWd1cmF0aW9uOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpCaXRzUGVyU2FtcGxlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb0N0cmxBY2s7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OkNoYW5uZWxNb2RlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpQY21QYXJhbWV0ZXJzOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpTYW1wbGVSYXRlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpTZXNzaW9uVHlwZTsKLQotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2U7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpBMmRwQWFjVG9IYWxDb25maWc7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpBMmRwQXB0eFRvSGFsQ29uZmlnOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpjb2RlYzo6QTJkcENvZGVjVG9IYWxCaXRzUGVyU2FtcGxlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpjb2RlYzo6QTJkcENvZGVjVG9IYWxDaGFubmVsTW9kZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Y29kZWM6OkEyZHBDb2RlY1RvSGFsU2FtcGxlUmF0ZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Y29kZWM6OkEyZHBMZGFjVG9IYWxDb25maWc7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpBMmRwU2JjVG9IYWxDb25maWc7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpDb2RlY0NvbmZpZ3VyYXRpb247Ci0KLUJsdWV0b290aEF1ZGlvQ3RybEFjayBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2Fjayh0QTJEUF9DVFJMX0FDSyBhY2spOwotCi0vLyBQcm92aWRlIGNhbGwtaW4gQVBJcyBmb3IgdGhlIEJsdWV0b290aCBBdWRpbyBIQUwKLWNsYXNzIEEyZHBUcmFuc3BvcnQKLSAgICA6IHB1YmxpYyA6OmJsdWV0b290aDo6YXVkaW86OklCbHVldG9vdGhTaW5rVHJhbnNwb3J0SW5zdGFuY2UgewotIHB1YmxpYzoKLSAgQTJkcFRyYW5zcG9ydChTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkKLSAgICAgIDogSUJsdWV0b290aFNpbmtUcmFuc3BvcnRJbnN0YW5jZShzZXNzaW9uVHlwZSwge30pLAotICAgICAgICB0b3RhbF9ieXRlc19yZWFkXygwKSwKLSAgICAgICAgZGF0YV9wb3NpdGlvbl8oe30pIHsKLSAgICBhMmRwX3BlbmRpbmdfY21kXyA9IEEyRFBfQ1RSTF9DTURfTk9ORTsKLSAgICByZW1vdGVfZGVsYXlfcmVwb3J0XyA9IDA7Ci0gIH0KLQotICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgU3RhcnRSZXF1ZXN0KCkgb3ZlcnJpZGUgewotICAgIC8vIENoZWNrIGlmIGEgcHJldmlvdXMgcmVxdWVzdCBpcyBub3QgZmluaXNoZWQKLSAgICBpZiAoYTJkcF9wZW5kaW5nX2NtZF8gPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEEyRFBfQ1RSTF9DTURfU1RBUlQgaW4gcHJvZ3Jlc3MiOwotICAgICAgcmV0dXJuIGEyZHBfYWNrX3RvX2J0X2F1ZGlvX2N0cmxfYWNrKEEyRFBfQ1RSTF9BQ0tfUEVORElORyk7Ci0gICAgfSBlbHNlIGlmIChhMmRwX3BlbmRpbmdfY21kXyAhPSBBMkRQX0NUUkxfQ01EX05PTkUpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBidXN5IGluIHBlbmRpbmdfY21kPSIgPDwgYTJkcF9wZW5kaW5nX2NtZF87Ci0gICAgICByZXR1cm4gYTJkcF9hY2tfdG9fYnRfYXVkaW9fY3RybF9hY2soQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBzZW5kIFNUQVJUIHJlcXVlc3QgdG8gc3RhY2sgd2hpbGUgd2UgYXJlIGluIGEgY2FsbAotICAgIGlmICghYmx1ZXRvb3RoOjpoZWFkc2V0OjpJc0NhbGxJZGxlKCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2FsbCBzdGF0ZSBpcyBidXN5IjsKLSAgICAgIHJldHVybiBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2FjayhBMkRQX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICBpZiAoYnRpZl9hdl9zdHJlYW1fc3RhcnRlZF9yZWFkeSgpKSB7Ci0gICAgICAvLyBBbHJlYWR5IHN0YXJ0ZWQsIEFDSyBiYWNrIGltbWVkaWF0ZWx5LgotICAgICAgcmV0dXJuIGEyZHBfYWNrX3RvX2J0X2F1ZGlvX2N0cmxfYWNrKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfQotICAgIGlmIChidGlmX2F2X3N0cmVhbV9yZWFkeSgpKSB7Ci0gICAgICAvKgotICAgICAgICogUG9zdCBzdGFydCBldmVudCBhbmQgd2FpdCBmb3IgYXVkaW8gcGF0aCB0byBvcGVuLgotICAgICAgICogSWYgd2UgYXJlIHRoZSBzb3VyY2UsIHRoZSBBQ0sgd2lsbCBiZSBzZW50IGFmdGVyIHRoZSBzdGFydAotICAgICAgICogcHJvY2VkdXJlIGlzIGNvbXBsZXRlZCwgb3RoZXdpc2Ugc2VuZCBpdCBub3cuCi0gICAgICAgKi8KLSAgICAgIGEyZHBfcGVuZGluZ19jbWRfID0gQTJEUF9DVFJMX0NNRF9TVEFSVDsKLSAgICAgIGJ0aWZfYXZfc3RyZWFtX3N0YXJ0KCk7Ci0gICAgICBpZiAoYnRpZl9hdl9nZXRfcGVlcl9zZXAoKSAhPSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhY2NlcHRlZCI7Ci0gICAgICAgIHJldHVybiBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2FjayhBMkRQX0NUUkxfQUNLX1BFTkRJTkcpOwotICAgICAgfQotICAgICAgYTJkcF9wZW5kaW5nX2NtZF8gPSBBMkRQX0NUUkxfQ01EX05PTkU7Ci0gICAgICByZXR1cm4gYTJkcF9hY2tfdG9fYnRfYXVkaW9fY3RybF9hY2soQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICB9Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBBViBzdHJlYW0gaXMgbm90IHJlYWR5IHRvIHN0YXJ0IjsKLSAgICByZXR1cm4gYTJkcF9hY2tfdG9fYnRfYXVkaW9fY3RybF9hY2soQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgfQotCi0gIEJsdWV0b290aEF1ZGlvQ3RybEFjayBTdXNwZW5kUmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICAvLyBQcmV2aW91cyByZXF1ZXN0IGlzIG5vdCBmaW5pc2hlZAotICAgIGlmIChhMmRwX3BlbmRpbmdfY21kXyA9PSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBBMkRQX0NUUkxfQ01EX1NVU1BFTkQgaW4gcHJvZ3Jlc3MiOwotICAgICAgcmV0dXJuIGEyZHBfYWNrX3RvX2J0X2F1ZGlvX2N0cmxfYWNrKEEyRFBfQ1RSTF9BQ0tfUEVORElORyk7Ci0gICAgfSBlbHNlIGlmIChhMmRwX3BlbmRpbmdfY21kXyAhPSBBMkRQX0NUUkxfQ01EX05PTkUpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBidXN5IGluIHBlbmRpbmdfY21kPSIgPDwgYTJkcF9wZW5kaW5nX2NtZF87Ci0gICAgICByZXR1cm4gYTJkcF9hY2tfdG9fYnRfYXVkaW9fY3RybF9hY2soQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICB9Ci0gICAgLy8gTG9jYWwgc3VzcGVuZAotICAgIGlmIChidGlmX2F2X3N0cmVhbV9zdGFydGVkX3JlYWR5KCkpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhY2NlcHRlZCI7Ci0gICAgICBhMmRwX3BlbmRpbmdfY21kXyA9IEEyRFBfQ1RSTF9DTURfU1VTUEVORDsKLSAgICAgIGJ0aWZfYXZfc3RyZWFtX3N1c3BlbmQoKTsKLSAgICAgIHJldHVybiBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlBFTkRJTkc7Ci0gICAgfQotICAgIC8qIElmIHdlIGFyZSBub3QgaW4gc3RhcnRlZCBzdGF0ZSwganVzdCBhY2sgYmFjayBvayBhbmQgbGV0Ci0gICAgICogYXVkaW9mbGluZ2VyIGNsb3NlIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgYXJlCi0gICAgICogcmVtb3RlbHkgc3VzcGVuZGVkLCBjbGVhciBSRU1PVEUgU1VTUEVORCBmbGFnLgotICAgICAqLwotICAgIGJ0aWZfYXZfY2xlYXJfcmVtb3RlX3N1c3BlbmRfZmxhZygpOwotICAgIHJldHVybiBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2FjayhBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICB9Ci0KLSAgdm9pZCBTdG9wUmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICBpZiAoYnRpZl9hdl9nZXRfcGVlcl9zZXAoKSA9PSBBVkRUX1RTRVBfU05LICYmCi0gICAgICAgICFidGlmX2F2X3N0cmVhbV9zdGFydGVkX3JlYWR5KCkpIHsKLSAgICAgIGJ0aWZfYXZfY2xlYXJfcmVtb3RlX3N1c3BlbmRfZmxhZygpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogaGFuZGxpbmciOwotICAgIGEyZHBfcGVuZGluZ19jbWRfID0gQTJEUF9DVFJMX0NNRF9TVE9QOwotICAgIGJ0aWZfYXZfc3RyZWFtX3N0b3AoUmF3QWRkcmVzczo6a0VtcHR5KTsKLSAgfQotCi0gIGJvb2wgR2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QqIHJlbW90ZV9kZWxheV9yZXBvcnRfbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHRvdGFsX2J5dGVzX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNwZWMqIGRhdGFfcG9zaXRpb24pIG92ZXJyaWRlIHsKLSAgICAqcmVtb3RlX2RlbGF5X3JlcG9ydF9ucyA9IHJlbW90ZV9kZWxheV9yZXBvcnRfICogMTAwMDAwdTsKLSAgICAqdG90YWxfYnl0ZXNfcmVhZCA9IHRvdGFsX2J5dGVzX3JlYWRfOwotICAgICpkYXRhX3Bvc2l0aW9uID0gZGF0YV9wb3NpdGlvbl87Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZWxheT0iIDw8IHJlbW90ZV9kZWxheV9yZXBvcnRfCi0gICAgICAgICAgICA8PCAiLzEwbXMsIGRhdGE9IiA8PCB0b3RhbF9ieXRlc19yZWFkXwotICAgICAgICAgICAgPDwgIiBieXRlKHMpLCB0aW1lc3RhbXA9IiA8PCBkYXRhX3Bvc2l0aW9uXy50dl9zZWMgPDwgIi4iCi0gICAgICAgICAgICA8PCBkYXRhX3Bvc2l0aW9uXy50dl9uc2VjIDw8ICJzIjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgTWV0YWRhdGFDaGFuZ2VkKGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90JiBzb3VyY2VfbWV0YWRhdGEpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHRyYWNrX2NvdW50ID0gc291cmNlX21ldGFkYXRhLnRyYWNrX2NvdW50OwotICAgIGF1dG8gdHJhY2tzID0gc291cmNlX21ldGFkYXRhLnRyYWNrczsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgdHJhY2tfY291bnQgPDwgIiB0cmFjayhzKSByZWNlaXZlZCI7Ci0gICAgd2hpbGUgKHRyYWNrX2NvdW50KSB7Ci0gICAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHVzYWdlPSIgPDwgdHJhY2tzLT51c2FnZQotICAgICAgICAgICAgICA8PCAiLCBjb250ZW50X3R5cGU9IiA8PCB0cmFja3MtPmNvbnRlbnRfdHlwZQotICAgICAgICAgICAgICA8PCAiLCBnYWluPSIgPDwgdHJhY2tzLT5nYWluOwotICAgICAgLS10cmFja19jb3VudDsKLSAgICAgICsrdHJhY2tzOwotICAgIH0KLSAgfQotCi0gIHRBMkRQX0NUUkxfQ01EIEdldFBlbmRpbmdDbWQoKSBjb25zdCB7IHJldHVybiBhMmRwX3BlbmRpbmdfY21kXzsgfQotCi0gIHZvaWQgUmVzZXRQZW5kaW5nQ21kKCkgeyBhMmRwX3BlbmRpbmdfY21kXyA9IEEyRFBfQ1RSTF9DTURfTk9ORTsgfQotCi0gIHZvaWQgUmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpIG92ZXJyaWRlIHsKLSAgICByZW1vdGVfZGVsYXlfcmVwb3J0XyA9IDA7Ci0gICAgdG90YWxfYnl0ZXNfcmVhZF8gPSAwOwotICAgIGRhdGFfcG9zaXRpb25fID0ge307Ci0gIH0KLQotICB2b2lkIExvZ0J5dGVzUmVhZChzaXplX3QgYnl0ZXNfcmVhZCkgb3ZlcnJpZGUgewotICAgIGlmIChieXRlc19yZWFkICE9IDApIHsKLSAgICAgIHRvdGFsX2J5dGVzX3JlYWRfICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmRhdGFfcG9zaXRpb25fKTsKLSAgICB9Ci0gIH0KLQotICAvLyBkZWxheSByZXBvcnRzIGZyb20gQVZEVFAgaXMgYmFzZWQgb24gMS8xMCBtcyAoMTAwdXMpCi0gIHZvaWQgU2V0UmVtb3RlRGVsYXkodWludDE2X3QgZGVsYXlfcmVwb3J0KSB7Ci0gICAgcmVtb3RlX2RlbGF5X3JlcG9ydF8gPSBkZWxheV9yZXBvcnQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB0QTJEUF9DVFJMX0NNRCBhMmRwX3BlbmRpbmdfY21kXzsKLSAgc3RhdGljIHVpbnQxNl90IHJlbW90ZV9kZWxheV9yZXBvcnRfOwotICB1aW50NjRfdCB0b3RhbF9ieXRlc19yZWFkXzsKLSAgdGltZXNwZWMgZGF0YV9wb3NpdGlvbl87Ci19OwotCi10QTJEUF9DVFJMX0NNRCBBMmRwVHJhbnNwb3J0OjphMmRwX3BlbmRpbmdfY21kXyA9IEEyRFBfQ1RSTF9DTURfTk9ORTsKLXVpbnQxNl90IEEyZHBUcmFuc3BvcnQ6OnJlbW90ZV9kZWxheV9yZXBvcnRfID0gMDsKLQotLy8gQ29tbW9uIGludGVyZmFjZSB0byBjYWxsLW91dCBpbnRvIEJsdWV0b290aCBBdWRpbyBIQUwKLUJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSogc29mdHdhcmVfaGFsX2ludGVyZmFjZSA9IG51bGxwdHI7Ci1CbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UqIG9mZmxvYWRpbmdfaGFsX2ludGVyZmFjZSA9IG51bGxwdHI7Ci1CbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UqIGFjdGl2ZV9oYWxfaW50ZXJmYWNlID0gbnVsbHB0cjsKLQotLy8gU2F2ZSB0aGUgdmFsdWUgaWYgdGhlIHJlbW90ZSByZXBvcnRzIGl0cyBkZWxheSBiZWZvcmUgdGhpcyBpbnRlcmZhY2UgaXMKLS8vIGluaXRpYWxpemVkCi11aW50MTZfdCByZW1vdGVfZGVsYXkgPSAwOwotCi1ib29sIGJ0YXVkaW9fYTJkcF9kaXNhYmxlZCA9IGZhbHNlOwotYm9vbCBpc19jb25maWd1cmVkID0gZmFsc2U7Ci0KLUJsdWV0b290aEF1ZGlvQ3RybEFjayBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2Fjayh0QTJEUF9DVFJMX0FDSyBhY2spIHsKLSAgc3dpdGNoIChhY2spIHsKLSAgICBjYXNlIEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzoKLSAgICAgIHJldHVybiBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlNVQ0NFU1NfRklOSVNIRUQ7Ci0gICAgY2FzZSBBMkRQX0NUUkxfQUNLX1BFTkRJTkc6Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpQRU5ESU5HOwotICAgIGNhc2UgQTJEUF9DVFJMX0FDS19JTkNBTExfRkFJTFVSRToKLSAgICAgIHJldHVybiBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OkZBSUxVUkVfQlVTWTsKLSAgICBjYXNlIEEyRFBfQ1RSTF9BQ0tfRElTQ09OTkVDVF9JTl9QUk9HUkVTUzoKLSAgICAgIHJldHVybiBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OkZBSUxVUkVfRElTQ09OTkVDVElORzsKLSAgICBjYXNlIEEyRFBfQ1RSTF9BQ0tfVU5TVVBQT1JURUQ6IC8qIE9mZmxvYWRpbmcgYnV0IHJlc291cmNlIGZhaWx1cmUgKi8KLSAgICAgIHJldHVybiBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OkZBSUxVUkVfVU5TVVBQT1JURUQ7Ci0gICAgY2FzZSBBMkRQX0NUUkxfQUNLX0ZBSUxVUkU6Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFOwotICB9Ci19Ci0KLWJvb2wgYTJkcF9nZXRfc2VsZWN0ZWRfaGFsX2NvZGVjX2NvbmZpZyhDb2RlY0NvbmZpZ3VyYXRpb24qIGNvZGVjX2NvbmZpZykgewotICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29uZmlnID0gYnRhX2F2X2dldF9hMmRwX2N1cnJlbnRfY29kZWMoKTsKLSAgaWYgKGEyZHBfY29uZmlnID09IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZmFpbHVyZSB0byBnZXQgQTJEUCBjb2RlYyBjb25maWciOwotICAgICpjb2RlY19jb25maWcgPSA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjprSW52YWxpZENvZGVjQ29uZmlndXJhdGlvbjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGN1cnJlbnRfY29kZWMgPSBhMmRwX2NvbmZpZy0+Z2V0Q29kZWNDb25maWcoKTsKLSAgc3dpdGNoIChjdXJyZW50X2NvZGVjLmNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDOgotICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDOiB7Ci0gICAgICBpZiAoIUEyZHBTYmNUb0hhbENvbmZpZyhjb2RlY19jb25maWcsIGEyZHBfY29uZmlnKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQzogewotICAgICAgaWYgKCFBMmRwQWFjVG9IYWxDb25maWcoY29kZWNfY29uZmlnLCBhMmRwX2NvbmZpZykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYOgotICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hEOiB7Ci0gICAgICBpZiAoIUEyZHBBcHR4VG9IYWxDb25maWcoY29kZWNfY29uZmlnLCBhMmRwX2NvbmZpZykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9MREFDOiB7Ci0gICAgICBpZiAoIUEyZHBMZGFjVG9IYWxDb25maWcoY29kZWNfY29uZmlnLCBhMmRwX2NvbmZpZykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDoKLSAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBVbmtub3duIGNvZGVjX3R5cGU9IiA8PCBjdXJyZW50X2NvZGVjLmNvZGVjX3R5cGU7Ci0gICAgICAqY29kZWNfY29uZmlnID0gOjpibHVldG9vdGg6OmF1ZGlvOjpjb2RlYzo6a0ludmFsaWRDb2RlY0NvbmZpZ3VyYXRpb247Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY29kZWNfY29uZmlnLT5lbmNvZGVkQXVkaW9CaXRyYXRlID0gYTJkcF9jb25maWctPmdldFRyYWNrQml0UmF0ZSgpOwotICAvLyBPYnRhaW4gdGhlIE1UVQotICBSYXdBZGRyZXNzIHBlZXJfYWRkciA9IGJ0aWZfYXZfc291cmNlX2FjdGl2ZV9wZWVyKCk7Ci0gIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwZWVyX3BhcmFtOwotICBidGFfYXZfY29fZ2V0X3BlZXJfcGFyYW1zKHBlZXJfYWRkciwgJnBlZXJfcGFyYW0pOwotICBpbnQgZWZmZWN0aXZlTXR1ID0gYnRhX2F2X2NvX2dldF9lbmNvZGVyX2VmZmVjdGl2ZV9mcmFtZV9zaXplKCk7Ci0gIGlmIChlZmZlY3RpdmVNdHUgPiAwICYmIGVmZmVjdGl2ZU10dSA8IHBlZXJfcGFyYW0ucGVlcl9tdHUpIHsKLSAgICBjb2RlY19jb25maWctPnBlZXJNdHUgPSBlZmZlY3RpdmVNdHU7Ci0gIH0gZWxzZSB7Ci0gICAgY29kZWNfY29uZmlnLT5wZWVyTXR1ID0gcGVlcl9wYXJhbS5wZWVyX210dTsKLSAgfQotICBpZiAoY3VycmVudF9jb2RlYy5jb2RlY190eXBlID09IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDICYmCi0gICAgICBjb2RlY19jb25maWctPmNvbmZpZy5zYmNDb25maWcoKS5tYXhCaXRwb29sIDw9Ci0gICAgICAgICAgQTJEUF9TQkNfQklUUE9PTF9NSURETEVfUVVBTElUWSkgewotICAgIGNvZGVjX2NvbmZpZy0+cGVlck10dSA9IE1BWF8yTUJQU19BVkRUUF9NVFU7Ci0gIH0gZWxzZSBpZiAoY29kZWNfY29uZmlnLT5wZWVyTXR1ID4gTUFYXzNNQlBTX0FWRFRQX01UVSkgewotICAgIGNvZGVjX2NvbmZpZy0+cGVlck10dSA9IE1BWF8zTUJQU19BVkRUUF9NVFU7Ci0gIH0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IENvZGVjQ29uZmlndXJhdGlvbj0iIDw8IHRvU3RyaW5nKCpjb2RlY19jb25maWcpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBhMmRwX2dldF9zZWxlY3RlZF9oYWxfcGNtX2NvbmZpZyhQY21QYXJhbWV0ZXJzKiBwY21fY29uZmlnKSB7Ci0gIGlmIChwY21fY29uZmlnID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZ3MgPSBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYygpOwotICBpZiAoYTJkcF9jb2RlY19jb25maWdzID09IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZmFpbHVyZSB0byBnZXQgQTJEUCBjb2RlYyBjb25maWciOwotICAgICpwY21fY29uZmlnID0gQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlOjprSW52YWxpZFBjbUNvbmZpZ3VyYXRpb247Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGN1cnJlbnRfY29kZWMgPSBhMmRwX2NvZGVjX2NvbmZpZ3MtPmdldENvZGVjQ29uZmlnKCk7Ci0gIHBjbV9jb25maWctPnNhbXBsZVJhdGUgPSBBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoY3VycmVudF9jb2RlYyk7Ci0gIHBjbV9jb25maWctPmJpdHNQZXJTYW1wbGUgPSBBMmRwQ29kZWNUb0hhbEJpdHNQZXJTYW1wbGUoY3VycmVudF9jb2RlYyk7Ci0gIHBjbV9jb25maWctPmNoYW5uZWxNb2RlID0gQTJkcENvZGVjVG9IYWxDaGFubmVsTW9kZShjdXJyZW50X2NvZGVjKTsKLSAgcmV0dXJuIChwY21fY29uZmlnLT5zYW1wbGVSYXRlICE9IFNhbXBsZVJhdGU6OlJBVEVfVU5LTk9XTiAmJgotICAgICAgICAgIHBjbV9jb25maWctPmJpdHNQZXJTYW1wbGUgIT0gQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOICYmCi0gICAgICAgICAgcGNtX2NvbmZpZy0+Y2hhbm5lbE1vZGUgIT0gQ2hhbm5lbE1vZGU6OlVOS05PV04pOwotfQotCi0vLyBDaGVja2luZyBpZiBuZXcgYmx1ZXRvb3RoX2F1ZGlvIGlzIHN1cHBvcnRlZAotYm9vbCBpc19oYWxfMl8wX2ZvcmNlX2Rpc2FibGVkKCkgewotICBpZiAoIWlzX2NvbmZpZ3VyZWQpIHsKLSAgICBidGF1ZGlvX2EyZHBfZGlzYWJsZWQgPSBvc2lfcHJvcGVydHlfZ2V0X2Jvb2woQkxVRVRPT1RIX0FVRElPX0hBTF9QUk9QX0RJU0FCTEVELCBmYWxzZSk7Ci0gICAgaXNfY29uZmlndXJlZCA9IHRydWU7Ci0gIH0KLSAgcmV0dXJuIGJ0YXVkaW9fYTJkcF9kaXNhYmxlZDsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdWRpbyB7Ci1uYW1lc3BhY2UgYTJkcCB7Ci0KLWJvb2wgdXBkYXRlX2NvZGVjX29mZmxvYWRpbmdfY2FwYWJpbGl0aWVzKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGZyYW1ld29ya19wcmVmZXJlbmNlKSB7Ci0gIHJldHVybiA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpVcGRhdGVPZmZsb2FkaW5nQ2FwYWJpbGl0aWVzKAotICAgICAgZnJhbWV3b3JrX3ByZWZlcmVuY2UpOwotfQotCi0vLyBDaGVja2luZyBpZiBuZXcgYmx1ZXRvb3RoX2F1ZGlvIGlzIGVuYWJsZWQKLWJvb2wgaXNfaGFsXzJfMF9lbmFibGVkKCkgeyByZXR1cm4gYWN0aXZlX2hhbF9pbnRlcmZhY2UgIT0gbnVsbHB0cjsgfQotCi0vLyBDaGVjayBpZiBuZXcgYmx1ZXRvb3RoX2F1ZGlvIGlzIHJ1bm5pbmcgd2l0aCBvZmZsb2FkaW5nIGVuY29kZXJzCi1ib29sIGlzX2hhbF8yXzBfb2ZmbG9hZGluZygpIHsKLSAgaWYgKCFpc19oYWxfMl8wX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gYWN0aXZlX2hhbF9pbnRlcmZhY2UtPkdldFRyYW5zcG9ydEluc3RhbmNlKCktPkdldFNlc3Npb25UeXBlKCkgPT0KLSAgICAgICAgIFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEg7Ci19Ci0KLS8vIEluaXRpYWxpemUgQmx1ZXRvb3RoQXVkaW8gSEFMOiBvcGVuUHJvdmlkZXIKLWJvb2wgaW5pdChibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIG1lc3NhZ2VfbG9vcCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgaWYgKGlzX2hhbF8yXzBfZm9yY2VfZGlzYWJsZWQoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW8gSEFMIGlzIGRpc2FibGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdXRvIGEyZHBfc2luayA9Ci0gICAgICBuZXcgQTJkcFRyYW5zcG9ydChTZXNzaW9uVHlwZTo6QTJEUF9TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSCk7Ci0gIHNvZnR3YXJlX2hhbF9pbnRlcmZhY2UgPQotICAgICAgbmV3IEJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZShhMmRwX3NpbmssIG1lc3NhZ2VfbG9vcCk7Ci0gIGlmICghc29mdHdhcmVfaGFsX2ludGVyZmFjZS0+SXNWYWxpZCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBmb3IgQTJEUCBpcyBpbnZhbGlkPyEiOwotICAgIGRlbGV0ZSBzb2Z0d2FyZV9oYWxfaW50ZXJmYWNlOwotICAgIHNvZnR3YXJlX2hhbF9pbnRlcmZhY2UgPSBudWxscHRyOwotICAgIGRlbGV0ZSBhMmRwX3Npbms7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX2VuYWJsZWQoKSkgewotICAgIGEyZHBfc2luayA9IG5ldyBBMmRwVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICAgIG9mZmxvYWRpbmdfaGFsX2ludGVyZmFjZSA9Ci0gICAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UoYTJkcF9zaW5rLCBtZXNzYWdlX2xvb3ApOwotICAgIGlmICghb2ZmbG9hZGluZ19oYWxfaW50ZXJmYWNlLT5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogQmx1ZXRvb3RoQXVkaW8gSEFMIGZvciBBMkRQIG9mZmxvYWRpbmcgaXMgaW52YWxpZD8hIjsKLSAgICAgIGRlbGV0ZSBvZmZsb2FkaW5nX2hhbF9pbnRlcmZhY2U7Ci0gICAgICBvZmZsb2FkaW5nX2hhbF9pbnRlcmZhY2UgPSBudWxscHRyOwotICAgICAgZGVsZXRlIGEyZHBfc2luazsKLSAgICAgIGEyZHBfc2luayA9IHN0YXRpY19jYXN0PEEyZHBUcmFuc3BvcnQqPigKLSAgICAgICAgICBzb2Z0d2FyZV9oYWxfaW50ZXJmYWNlLT5HZXRUcmFuc3BvcnRJbnN0YW5jZSgpKTsKLSAgICAgIGRlbGV0ZSBzb2Z0d2FyZV9oYWxfaW50ZXJmYWNlOwotICAgICAgc29mdHdhcmVfaGFsX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgICBkZWxldGUgYTJkcF9zaW5rOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGFjdGl2ZV9oYWxfaW50ZXJmYWNlID0KLSAgICAgIChvZmZsb2FkaW5nX2hhbF9pbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG9mZmxvYWRpbmdfaGFsX2ludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29mdHdhcmVfaGFsX2ludGVyZmFjZSk7Ci0KLSAgaWYgKHJlbW90ZV9kZWxheSAhPSAwKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHJlc3RvcmUgREVMQVkgIgotICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxmbG9hdD4ocmVtb3RlX2RlbGF5IC8gMTAuMCkgPDwgIiBtcyI7Ci0gICAgc3RhdGljX2Nhc3Q8QTJkcFRyYW5zcG9ydCo+KGFjdGl2ZV9oYWxfaW50ZXJmYWNlLT5HZXRUcmFuc3BvcnRJbnN0YW5jZSgpKQotICAgICAgICAtPlNldFJlbW90ZURlbGF5KHJlbW90ZV9kZWxheSk7Ci0gICAgcmVtb3RlX2RlbGF5ID0gMDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQ2xlYW4gdXAgQmx1ZXRvb3RoQXVkaW8gSEFMCi12b2lkIGNsZWFudXAoKSB7Ci0gIGlmICghaXNfaGFsXzJfMF9lbmFibGVkKCkpIHJldHVybjsKLSAgZW5kX3Nlc3Npb24oKTsKLQotICBhdXRvIGEyZHBfc2luayA9IGFjdGl2ZV9oYWxfaW50ZXJmYWNlLT5HZXRUcmFuc3BvcnRJbnN0YW5jZSgpOwotICBzdGF0aWNfY2FzdDxBMmRwVHJhbnNwb3J0Kj4oYTJkcF9zaW5rKS0+UmVzZXRQZW5kaW5nQ21kKCk7Ci0gIHN0YXRpY19jYXN0PEEyZHBUcmFuc3BvcnQqPihhMmRwX3NpbmspLT5SZXNldFByZXNlbnRhdGlvblBvc2l0aW9uKCk7Ci0gIGFjdGl2ZV9oYWxfaW50ZXJmYWNlID0gbnVsbHB0cjsKLQotICBhMmRwX3NpbmsgPSBzb2Z0d2FyZV9oYWxfaW50ZXJmYWNlLT5HZXRUcmFuc3BvcnRJbnN0YW5jZSgpOwotICBkZWxldGUgc29mdHdhcmVfaGFsX2ludGVyZmFjZTsKLSAgc29mdHdhcmVfaGFsX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0gIGRlbGV0ZSBhMmRwX3Npbms7Ci0gIGlmIChvZmZsb2FkaW5nX2hhbF9pbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIGEyZHBfc2luayA9IG9mZmxvYWRpbmdfaGFsX2ludGVyZmFjZS0+R2V0VHJhbnNwb3J0SW5zdGFuY2UoKTsKLSAgICBkZWxldGUgb2ZmbG9hZGluZ19oYWxfaW50ZXJmYWNlOwotICAgIG9mZmxvYWRpbmdfaGFsX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgZGVsZXRlIGEyZHBfc2luazsKLSAgfQotCi0gIHJlbW90ZV9kZWxheSA9IDA7Ci19Ci0KLS8vIFNldCB1cCB0aGUgY29kZWMgaW50byBCbHVldG9vdGhBdWRpbyBIQUwKLWJvb2wgc2V0dXBfY29kZWMoKSB7Ci0gIGlmICghaXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBpcyBub3QgZW5hYmxlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWd7fTsKLSAgaWYgKCFhMmRwX2dldF9zZWxlY3RlZF9oYWxfY29kZWNfY29uZmlnKCZjb2RlY19jb25maWcpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBGYWlsZWQgdG8gZ2V0IENvZGVjQ29uZmlndXJhdGlvbiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgc2hvdWxkX2NvZGVjX29mZmxvYWRpbmcgPQotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6Y29kZWM6OklzQ29kZWNPZmZsb2FkaW5nRW5hYmxlZChjb2RlY19jb25maWcpOwotICBpZiAoc2hvdWxkX2NvZGVjX29mZmxvYWRpbmcgJiYgIWlzX2hhbF8yXzBfb2ZmbG9hZGluZygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFN3aXRjaGluZyBCbHVldG9vdGhBdWRpbyBIQUwgdG8gSGFyZHdhcmUiOwotICAgIGVuZF9zZXNzaW9uKCk7Ci0gICAgYWN0aXZlX2hhbF9pbnRlcmZhY2UgPSBvZmZsb2FkaW5nX2hhbF9pbnRlcmZhY2U7Ci0gIH0gZWxzZSBpZiAoIXNob3VsZF9jb2RlY19vZmZsb2FkaW5nICYmIGlzX2hhbF8yXzBfb2ZmbG9hZGluZygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFN3aXRjaGluZyBCbHVldG9vdGhBdWRpbyBIQUwgdG8gU29mdHdhcmUiOwotICAgIGVuZF9zZXNzaW9uKCk7Ci0gICAgYWN0aXZlX2hhbF9pbnRlcmZhY2UgPSBzb2Z0d2FyZV9oYWxfaW50ZXJmYWNlOwotICB9Ci0KLSAgQXVkaW9Db25maWd1cmF0aW9uIGF1ZGlvX2NvbmZpZ3t9OwotICBpZiAoYWN0aXZlX2hhbF9pbnRlcmZhY2UtPkdldFRyYW5zcG9ydEluc3RhbmNlKCktPkdldFNlc3Npb25UeXBlKCkgPT0KLSAgICAgIFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpIHsKLSAgICBhdWRpb19jb25maWcuY29kZWNDb25maWcoY29kZWNfY29uZmlnKTsKLSAgfSBlbHNlIHsKLSAgICBQY21QYXJhbWV0ZXJzIHBjbV9jb25maWd7fTsKLSAgICBpZiAoIWEyZHBfZ2V0X3NlbGVjdGVkX2hhbF9wY21fY29uZmlnKCZwY21fY29uZmlnKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBGYWlsZWQgdG8gZ2V0IFBjbUNvbmZpZ3VyYXRpb24iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdWRpb19jb25maWcucGNtQ29uZmlnKHBjbV9jb25maWcpOwotICB9Ci0gIHJldHVybiBhY3RpdmVfaGFsX2ludGVyZmFjZS0+VXBkYXRlQXVkaW9Db25maWcoYXVkaW9fY29uZmlnKTsKLX0KLQotdm9pZCBzdGFydF9zZXNzaW9uKCkgewotICBpZiAoIWlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpbyBIQUwgaXMgbm90IGVuYWJsZWQiOwotICAgIHJldHVybjsKLSAgfQotICBhY3RpdmVfaGFsX2ludGVyZmFjZS0+U3RhcnRTZXNzaW9uKCk7Ci19Ci0KLXZvaWQgZW5kX3Nlc3Npb24oKSB7Ci0gIGlmICghaXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBpcyBub3QgZW5hYmxlZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFjdGl2ZV9oYWxfaW50ZXJmYWNlLT5FbmRTZXNzaW9uKCk7Ci0gIHN0YXRpY19jYXN0PEEyZHBUcmFuc3BvcnQqPihhY3RpdmVfaGFsX2ludGVyZmFjZS0+R2V0VHJhbnNwb3J0SW5zdGFuY2UoKSkKLSAgICAgIC0+UmVzZXRQZW5kaW5nQ21kKCk7Ci0gIHN0YXRpY19jYXN0PEEyZHBUcmFuc3BvcnQqPihhY3RpdmVfaGFsX2ludGVyZmFjZS0+R2V0VHJhbnNwb3J0SW5zdGFuY2UoKSkKLSAgICAgIC0+UmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpOwotfQotCi12b2lkIGFja19zdHJlYW1fc3RhcnRlZChjb25zdCB0QTJEUF9DVFJMX0FDSyYgYWNrKSB7Ci0gIGF1dG8gY3RybF9hY2sgPSBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2FjayhhY2spOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcmVzdWx0PSIgPDwgY3RybF9hY2s7Ci0gIGF1dG8gYTJkcF9zaW5rID0KLSAgICAgIHN0YXRpY19jYXN0PEEyZHBUcmFuc3BvcnQqPihhY3RpdmVfaGFsX2ludGVyZmFjZS0+R2V0VHJhbnNwb3J0SW5zdGFuY2UoKSk7Ci0gIGF1dG8gcGVuZGluZ19jbWQgPSBhMmRwX3NpbmstPkdldFBlbmRpbmdDbWQoKTsKLSAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICBhY3RpdmVfaGFsX2ludGVyZmFjZS0+U3RyZWFtU3RhcnRlZChjdHJsX2Fjayk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHBlbmRpbmc9IiA8PCBwZW5kaW5nX2NtZAotICAgICAgICAgICAgICAgICA8PCAiIGlnbm9yZSByZXN1bHQ9IiA8PCBjdHJsX2FjazsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGN0cmxfYWNrICE9IGJsdWV0b290aDo6YXVkaW86OkJsdWV0b290aEF1ZGlvQ3RybEFjazo6UEVORElORykgewotICAgIGEyZHBfc2luay0+UmVzZXRQZW5kaW5nQ21kKCk7Ci0gIH0KLX0KLQotdm9pZCBhY2tfc3RyZWFtX3N1c3BlbmRlZChjb25zdCB0QTJEUF9DVFJMX0FDSyYgYWNrKSB7Ci0gIGF1dG8gY3RybF9hY2sgPSBhMmRwX2Fja190b19idF9hdWRpb19jdHJsX2FjayhhY2spOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcmVzdWx0PSIgPDwgY3RybF9hY2s7Ci0gIGF1dG8gYTJkcF9zaW5rID0KLSAgICAgIHN0YXRpY19jYXN0PEEyZHBUcmFuc3BvcnQqPihhY3RpdmVfaGFsX2ludGVyZmFjZS0+R2V0VHJhbnNwb3J0SW5zdGFuY2UoKSk7Ci0gIGF1dG8gcGVuZGluZ19jbWQgPSBhMmRwX3NpbmstPkdldFBlbmRpbmdDbWQoKTsKLSAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgewotICAgIGFjdGl2ZV9oYWxfaW50ZXJmYWNlLT5TdHJlYW1TdXNwZW5kZWQoY3RybF9hY2spOwotICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBBMkRQX0NUUkxfQ01EX1NUT1AgcmVzdWx0PSIgPDwgY3RybF9hY2s7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHBlbmRpbmc9IiA8PCBwZW5kaW5nX2NtZAotICAgICAgICAgICAgICAgICA8PCAiIGlnbm9yZSByZXN1bHQ9IiA8PCBjdHJsX2FjazsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGN0cmxfYWNrICE9IGJsdWV0b290aDo6YXVkaW86OkJsdWV0b290aEF1ZGlvQ3RybEFjazo6UEVORElORykgewotICAgIGEyZHBfc2luay0+UmVzZXRQZW5kaW5nQ21kKCk7Ci0gIH0KLX0KLQotLy8gUmVhZCBmcm9tIHRoZSBGTVEgb2YgQmx1ZXRvb3RoQXVkaW8gSEFMCi1zaXplX3QgcmVhZCh1aW50OF90KiBwX2J1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmICghaXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBpcyBub3QgZW5hYmxlZCI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSBpZiAoaXNfaGFsXzJfMF9vZmZsb2FkaW5nKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb25fdHlwZT0iCi0gICAgICAgICAgICAgICA8PCB0b1N0cmluZyhhY3RpdmVfaGFsX2ludGVyZmFjZS0+R2V0VHJhbnNwb3J0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0U2Vzc2lvblR5cGUoKSkKLSAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IEEyRFBfU09GVFdBUkVfRU5DT0RJTkdfREFUQVBBVEgiOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBhY3RpdmVfaGFsX2ludGVyZmFjZS0+UmVhZEF1ZGlvRGF0YShwX2J1ZiwgbGVuKTsKLX0KLQotLy8gVXBkYXRlIEEyRFAgZGVsYXkgcmVwb3J0IHRvIEJsdWV0b290aEF1ZGlvIEhBTAotdm9pZCBzZXRfcmVtb3RlX2RlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydCkgewotICBpZiAoIWlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICBub3QgcmVhZHkgZm9yIERlbGF5UmVwb3J0ICIKLSAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRlbGF5X3JlcG9ydCAvIDEwLjApIDw8ICIgbXMiOwotICAgIHJlbW90ZV9kZWxheSA9IGRlbGF5X3JlcG9ydDsKLSAgICByZXR1cm47Ci0gIH0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBERUxBWSAiIDw8IHN0YXRpY19jYXN0PGZsb2F0PihkZWxheV9yZXBvcnQgLyAxMC4wKQotICAgICAgICAgIDw8ICIgbXMiOwotICBzdGF0aWNfY2FzdDxBMmRwVHJhbnNwb3J0Kj4oYWN0aXZlX2hhbF9pbnRlcmZhY2UtPkdldFRyYW5zcG9ydEluc3RhbmNlKCkpCi0gICAgICAtPlNldFJlbW90ZURlbGF5KGRlbGF5X3JlcG9ydCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhMmRwCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZy5oIGIvYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZWNkZTcuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImF1ZGlvX2EyZHBfaHcvaW5jbHVkZS9hdWRpb19hMmRwX2h3LmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGEyZHAgewotCi1ib29sIHVwZGF0ZV9jb2RlY19vZmZsb2FkaW5nX2NhcGFiaWxpdGllcygKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBmcmFtZXdvcmtfcHJlZmVyZW5jZSk7Ci0KLS8vIENoZWNrIGlmIG5ldyBibHVldG9vdGhfYXVkaW8gaXMgZW5hYmxlZAotYm9vbCBpc19oYWxfMl8wX2VuYWJsZWQoKTsKLQotLy8gQ2hlY2sgaWYgbmV3IGJsdWV0b290aF9hdWRpbyBpcyBydW5uaW5nIHdpdGggb2ZmbG9hZGluZyBlbmNvZGVycwotYm9vbCBpc19oYWxfMl8wX29mZmxvYWRpbmcoKTsKLQotLy8gSW5pdGlhbGl6ZSBCbHVldG9vdGhBdWRpbyBIQUw6IG9wZW5Qcm92aWRlcgotYm9vbCBpbml0KGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wKTsKLQotLy8gQ2xlYW4gdXAgQmx1ZXRvb3RoQXVkaW8gSEFMCi12b2lkIGNsZWFudXAoKTsKLQotLy8gU2V0IHVwIHRoZSBjb2RlYyBpbnRvIEJsdWV0b290aEF1ZGlvIEhBTAotYm9vbCBzZXR1cF9jb2RlYygpOwotCi0vLyBTZW5kIGNvbW1hbmQgdG8gdGhlIEJsdWV0b290aEF1ZGlvIEhBTDogU3RhcnRTZXNzaW9uLCBFbmRTZXNzaW9uLAotLy8gU3RyZWFtU3RhcnRlZCwgU3RyZWFtU3VzcGVuZGVkCi12b2lkIHN0YXJ0X3Nlc3Npb24oKTsKLXZvaWQgZW5kX3Nlc3Npb24oKTsKLXZvaWQgYWNrX3N0cmVhbV9zdGFydGVkKGNvbnN0IHRBMkRQX0NUUkxfQUNLJiBzdGF0dXMpOwotdm9pZCBhY2tfc3RyZWFtX3N1c3BlbmRlZChjb25zdCB0QTJEUF9DVFJMX0FDSyYgc3RhdHVzKTsKLQotLy8gUmVhZCBmcm9tIHRoZSBGTVEgb2YgQmx1ZXRvb3RoQXVkaW8gSEFMCi1zaXplX3QgcmVhZCh1aW50OF90KiBwX2J1ZiwgdWludDMyX3QgbGVuKTsKLQotLy8gVXBkYXRlIEEyRFAgZGVsYXkgcmVwb3J0IHRvIEJsdWV0b290aEF1ZGlvIEhBTAotdm9pZCBzZXRfcmVtb3RlX2RlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhMmRwCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZ19ob3N0LmNjIGIvYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nX2hvc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTdmZDQuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nX2hvc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImEyZHBfZW5jb2RpbmdfaG9zdC5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYTJkcF9lbmNvZGluZy5oIgotI2luY2x1ZGUgImEyZHBfc2JjX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgImJ0aWZfYTJkcF9zb3VyY2UuaCIKLSNpbmNsdWRlICJidGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZl9hdl9jby5oIgotI2luY2x1ZGUgImJ0aWZfaGYuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLSNpbmNsdWRlICJ1ZHJ2L2luY2x1ZGUvdWlwYy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNkZWZpbmUgQTJEUF9EQVRBX1JFQURfUE9MTF9NUyAxMAotI2RlZmluZSBBMkRQX0hPU1RfREFUQV9QQVRIICIvdmFyL3J1bi9ibHVldG9vdGgvYXVkaW8vLmEyZHBfZGF0YSIKLS8vIFRPRE8oYi8xOTgyNjAzNzUpOiBNYWtlIEEyRFAgZGF0YSBvd25lciBncm91cCBjb25maWd1cmFibGUuCi0jZGVmaW5lIEEyRFBfSE9TVF9EQVRBX0dST1VQICJibHVldG9vdGgtYXVkaW8iCi0KLW5hbWVzcGFjZSB7Ci0KLXN0ZDo6dW5pcXVlX3B0cjx0VUlQQ19TVEFURT4gYTJkcF91aXBjID0gbnVsbHB0cjsKLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX2RhdGFfY2IoW1ttYXliZV91bnVzZWRdXSB0VUlQQ19DSF9JRCBjaF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRVSVBDX0VWRU5UIGV2ZW50KSB7Ci0gIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEJUSUYgTUVESUEgKEEyRFAtREFUQSkgRVZFTlQgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGR1bXBfdWlwY19ldmVudChldmVudCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFVJUENfT1BFTl9FVlQ6Ci0gICAgICAvKgotICAgICAgICogUmVhZCBkaXJlY3RseSBmcm9tIG1lZGlhIHRhc2sgZnJvbSBoZXJlIG9uIChrZWVwIGNhbGxiYWNrIGZvcgotICAgICAgICogY29ubmVjdGlvbiBldmVudHMuCi0gICAgICAgKi8KLSAgICAgIFVJUENfSW9jdGwoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTywKLSAgICAgICAgICAgICAgICAgVUlQQ19SRUdfUkVNT1ZFX0FDVElWRV9SRUFEU0VULCBOVUxMKTsKLSAgICAgIFVJUENfSW9jdGwoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTywgVUlQQ19TRVRfUkVBRF9QT0xMX1RNTywKLSAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oQTJEUF9EQVRBX1JFQURfUE9MTF9NUykpOwotCi0gICAgICAvLyBXaWxsIHN0YXJ0IGF1ZGlvIG9uIGJ0aWZfYTJkcF9vbl9zdGFydGVkCi0KLSAgICAgIC8qIEFDSyBiYWNrIHdoZW4gbWVkaWEgdGFzayBpcyBmdWxseSBzdGFydGVkICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgVUlQQ19DTE9TRV9FVlQ6Ci0gICAgICAvKgotICAgICAgICogU2VuZCBzdG9wIHJlcXVlc3Qgb25seSBpZiB3ZSBhcmUgYWN0aXZlbHkgc3RyZWFtaW5nIGFuZCBoYXZlbid0Ci0gICAgICAgKiByZWNlaXZlZCBhIHN0b3AgcmVxdWVzdC4gUG90ZW50aWFsbHksIHRoZSBhdWRpb2ZsaW5nZXIgZGV0YWNoZWQKLSAgICAgICAqIGFibm9ybWFsbHkuCi0gICAgICAgKi8KLSAgICAgIGlmIChidGlmX2EyZHBfc291cmNlX2lzX3N0cmVhbWluZygpKSB7Ci0gICAgICAgIC8qIFBvc3Qgc3RvcCBldmVudCBhbmQgd2FpdCBmb3IgYXVkaW8gcGF0aCB0byBzdG9wICovCi0gICAgICAgIGJ0aWZfYXZfc3RyZWFtX3N0b3AoUmF3QWRkcmVzczo6a0VtcHR5KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiAjIyMgQTJEUC1EQVRBIEVWRU5UICVkIE5PVCBIQU5ETEVEICMjIyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vLyBJZiBBMkRQX0hPU1RfREFUQV9HUk9VUCBleGlzdHMgd2UgZXhwZWN0IGF1ZGlvIHNlcnZlciBhbmQgQlQgYm90aCBhcmUKLS8vIGluIHRoaXMgZ3JvdXAgdGhlcmVmb3JlIGhhdmUgYWNjZXNzIHRvIEEyRFAgc29ja2V0LiBPdGhlcndpc2UgYXVkaW8KLS8vIHNlcnZlciBzaG91bGQgYmUgaW4gdGhlIHNhbWUgZ3JvdXAgdGhhdCBCVCBzdGFjayBydW5zIHdpdGggdG8gYWNjZXNzCi0vLyBBMkRQIHNvY2tldC4KLXN0YXRpYyB2b2lkIGEyZHBfZGF0YV9wYXRoX29wZW4oKSB7Ci0gIFVJUENfT3BlbigqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBidGlmX2EyZHBfZGF0YV9jYiwKLSAgICAgICAgICAgIEEyRFBfSE9TVF9EQVRBX1BBVEgpOwotICBzdHJ1Y3QgZ3JvdXAqIGdycCA9IGdldGdybmFtKEEyRFBfSE9TVF9EQVRBX0dST1VQKTsKLSAgY2htb2QoQTJEUF9IT1NUX0RBVEFfUEFUSCwgMDc3MCk7Ci0gIGlmIChncnApIHsKLSAgICBpbnQgcmVzID0gY2hvd24oQTJEUF9IT1NUX0RBVEFfUEFUSCwgLTEsIGdycC0+Z3JfZ2lkKTsKLSAgICBpZiAocmVzID09IC0xKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICB9Ci0gIH0KLX0KLQotdEEyRFBfQ1RSTF9DTUQgYTJkcF9wZW5kaW5nX2NtZF8gPSBBMkRQX0NUUkxfQ01EX05PTkU7Ci11aW50NjRfdCB0b3RhbF9ieXRlc19yZWFkXzsKLXRpbWVzcGVjIGRhdGFfcG9zaXRpb25fOwotdWludDE2X3QgcmVtb3RlX2RlbGF5X3JlcG9ydF87Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdWRpbyB7Ci1uYW1lc3BhY2UgYTJkcCB7Ci0KLS8vIEludm9rZWQgYnkgYXVkaW8gc2VydmVyIHRvIHNldCBhdWRpbyBjb25maWcgKFBDTSBmb3Igbm93KQotYm9vbCBTZXRBdWRpb0NvbmZpZyhBdWRpb0NvbmZpZyBjb25maWcpIHsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZzsKLSAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0gY29uZmlnLmJpdHNfcGVyX3NhbXBsZTsKLSAgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX21vZGU7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfZmVlZGluZ191cGRhdGVfcmVxKGNvZGVjX2NvbmZpZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBJbnZva2VkIGJ5IGF1ZGlvIHNlcnZlciB3aGVuIGl0IGhhcyBhdWRpbyBkYXRhIHRvIHN0cmVhbS4KLWJvb2wgU3RhcnRSZXF1ZXN0KCkgewotICAvLyBDaGVjayBpZiBhIHByZXZpb3VzIHJlcXVlc3QgaXMgbm90IGZpbmlzaGVkCi0gIGlmIChhMmRwX3BlbmRpbmdfY21kXyA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEEyRFBfQ1RSTF9DTURfU1RBUlQgaW4gcHJvZ3Jlc3MiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmIChhMmRwX3BlbmRpbmdfY21kXyAhPSBBMkRQX0NUUkxfQ01EX05PTkUpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogYnVzeSBpbiBwZW5kaW5nX2NtZD0iIDw8IGEyZHBfcGVuZGluZ19jbWRfOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIERvbid0IHNlbmQgU1RBUlQgcmVxdWVzdCB0byBzdGFjayB3aGlsZSB3ZSBhcmUgaW4gYSBjYWxsCi0gIGlmICghYmx1ZXRvb3RoOjpoZWFkc2V0OjpJc0NhbGxJZGxlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNhbGwgc3RhdGUgaXMgYnVzeSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJ0aWZfYXZfc3RyZWFtX3N0YXJ0ZWRfcmVhZHkoKSkgewotICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgQUNLIGJhY2sgaW1tZWRpYXRlbHkuCi0gICAgYTJkcF9kYXRhX3BhdGhfb3BlbigpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChidGlmX2F2X3N0cmVhbV9yZWFkeSgpKSB7Ci0gICAgYTJkcF9kYXRhX3BhdGhfb3BlbigpOwotICAgIC8qCi0gICAgICogUG9zdCBzdGFydCBldmVudCBhbmQgd2FpdCBmb3IgYXVkaW8gcGF0aCB0byBvcGVuLgotICAgICAqIElmIHdlIGFyZSB0aGUgc291cmNlLCB0aGUgQUNLIHdpbGwgYmUgc2VudCBhZnRlciB0aGUgc3RhcnQKLSAgICAgKiBwcm9jZWR1cmUgaXMgY29tcGxldGVkLCBvdGhld2lzZSBzZW5kIGl0IG5vdy4KLSAgICAgKi8KLSAgICBhMmRwX3BlbmRpbmdfY21kXyA9IEEyRFBfQ1RSTF9DTURfU1RBUlQ7Ci0gICAgYnRpZl9hdl9zdHJlYW1fc3RhcnQoKTsKLSAgICBpZiAoYnRpZl9hdl9nZXRfcGVlcl9zZXAoKSAhPSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYWNjZXB0ZWQiOwotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVE9ETzogc2hvdWxkIGJlIHBlbmRpbmcKLSAgICB9Ci0gICAgYTJkcF9wZW5kaW5nX2NtZF8gPSBBMkRQX0NUUkxfQ01EX05PTkU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBBViBzdHJlYW0gaXMgbm90IHJlYWR5IHRvIHN0YXJ0IjsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBJbnZva2VkIGJ5IGF1ZGlvIHNlcnZlciB3aGVuIGF1ZGlvIHN0cmVhbWluZyBpcyBkb25lLgotYm9vbCBTdG9wUmVxdWVzdCgpIHsKLSAgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NOSyAmJgotICAgICAgIWJ0aWZfYXZfc3RyZWFtX3N0YXJ0ZWRfcmVhZHkoKSkgewotICAgIGJ0aWZfYXZfY2xlYXJfcmVtb3RlX3N1c3BlbmRfZmxhZygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYW5kbGluZyI7Ci0gIGEyZHBfcGVuZGluZ19jbWRfID0gQTJEUF9DVFJMX0NNRF9TVE9QOwotICBidGlmX2F2X3N0cmVhbV9zdG9wKFJhd0FkZHJlc3M6OmtFbXB0eSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBJbnZva2VkIGJ5IGF1ZGlvIHNlcnZlciB0byBjaGVjayBhdWRpbyBwcmVzZW50YXRpb24gcG9zaXRpb24gcGVyaW9kaWNhbGx5LgotUHJlc2VudGF0aW9uUG9zaXRpb24gR2V0UHJlc2VudGF0aW9uUG9zaXRpb24oKSB7Ci0gIFByZXNlbnRhdGlvblBvc2l0aW9uIHByZXNlbnRhdGlvbl9wb3NpdGlvbnsKLSAgICAgIC5yZW1vdGVfZGVsYXlfcmVwb3J0X25zID0gcmVtb3RlX2RlbGF5X3JlcG9ydF8gKiAxMDAwMDB1LAotICAgICAgLnRvdGFsX2J5dGVzX3JlYWQgPSB0b3RhbF9ieXRlc19yZWFkXywKLSAgICAgIC5kYXRhX3Bvc2l0aW9uID0gZGF0YV9wb3NpdGlvbl8sCi0gIH07Ci0gIHJldHVybiBwcmVzZW50YXRpb25fcG9zaXRpb247Ci19Ci0KLS8vIGRlbGF5IHJlcG9ydHMgZnJvbSBBVkRUUCBpcyBiYXNlZCBvbiAxLzEwIG1zICgxMDB1cykKLXZvaWQgc2V0X3JlbW90ZV9kZWxheSh1aW50MTZfdCBkZWxheV9yZXBvcnQpIHsKLSAgcmVtb3RlX2RlbGF5X3JlcG9ydF8gPSBkZWxheV9yZXBvcnQ7Ci19Ci0KLS8vIEluZm9ybSBhdWRpbyBzZXJ2ZXIgYWJvdXQgb2ZmbG9hZGluZyBjb2RlYzsgbm90IHVzZWQgZm9yIG5vdwotYm9vbCB1cGRhdGVfY29kZWNfb2ZmbG9hZGluZ19jYXBhYmlsaXRpZXMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgZnJhbWV3b3JrX3ByZWZlcmVuY2UpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBDaGVja2luZyBpZiBuZXcgYmx1ZXRvb3RoX2F1ZGlvIGlzIGVuYWJsZWQKLWJvb2wgaXNfaGFsXzJfMF9lbmFibGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0vLyBDaGVjayBpZiBuZXcgYmx1ZXRvb3RoX2F1ZGlvIGlzIHJ1bm5pbmcgd2l0aCBvZmZsb2FkaW5nIGVuY29kZXJzCi1ib29sIGlzX2hhbF8yXzBfb2ZmbG9hZGluZygpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLS8vIEluaXRpYWxpemUgQmx1ZXRvb3RoQXVkaW8gSEFMOiBvcGVuUHJvdmlkZXIKLWJvb2wgaW5pdChibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIG1lc3NhZ2VfbG9vcCkgewotICBhMmRwX3VpcGMgPSBVSVBDX0luaXQoKTsKLSAgdG90YWxfYnl0ZXNfcmVhZF8gPSAwOwotICBkYXRhX3Bvc2l0aW9uXyA9IHt9OwotICByZW1vdGVfZGVsYXlfcmVwb3J0XyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIENsZWFuIHVwIEJsdWV0b290aEF1ZGlvIEhBTAotdm9pZCBjbGVhbnVwKCkgewotICBlbmRfc2Vzc2lvbigpOwotCi0gIGlmIChhMmRwX3VpcGMgIT0gbnVsbHB0cikgewotICAgIFVJUENfQ2xvc2UoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BTEwpOwotICB9Ci19Ci0KLS8vIFNldCB1cCB0aGUgY29kZWMgaW50byBCbHVldG9vdGhBdWRpbyBIQUwKLWJvb2wgc2V0dXBfY29kZWMoKSB7Ci0gIC8vIFRPRE86IHNldHVwIGNvZGVjCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIHN0YXJ0X3Nlc3Npb24oKSB7Ci0gIC8vIFRPRE86IE5vdGlmeSBzZXJ2ZXI7IG9yIGRvIHdlIGhhbmRsZSBpdCBkdXJpbmcgY29ubmVjdGVkPwotfQotCi12b2lkIGVuZF9zZXNzaW9uKCkgewotICAvLyBUT0RPOiBOb3RpZnkgc2VydmVyOyBvciBkbyB3ZSBoYW5kbGUgaXQgZHVyaW5nIGRpc2Nvbm5lY3RlZD8KLX0KLQotdm9pZCBhY2tfc3RyZWFtX3N0YXJ0ZWQoY29uc3QgdEEyRFBfQ1RSTF9BQ0smIGFjaykgewotICBhMmRwX3BlbmRpbmdfY21kXyA9IEEyRFBfQ1RSTF9DTURfTk9ORTsKLSAgLy8gVE9ETzogTm90aWZ5IHNlcnZlcgotfQotCi12b2lkIGFja19zdHJlYW1fc3VzcGVuZGVkKGNvbnN0IHRBMkRQX0NUUkxfQUNLJiBhY2spIHsKLSAgYTJkcF9wZW5kaW5nX2NtZF8gPSBBMkRQX0NUUkxfQ01EX05PTkU7Ci0gIC8vIFRPRE86IE5vdGlmeSBzZXJ2ZXIKLX0KLQotLy8gUmVhZCBmcm9tIHRoZSBGTVEgb2YgQmx1ZXRvb3RoQXVkaW8gSEFMCi1zaXplX3QgcmVhZCh1aW50OF90KiBwX2J1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChhMmRwX3VpcGMgPT0gbnVsbHB0cikgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBVSVBDX1JlYWQoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTywgcF9idWYsIGxlbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhMmRwCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZ19ob3N0LmggYi9hdWRpb19oYWxfaW50ZXJmYWNlL2EyZHBfZW5jb2RpbmdfaG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTAzZWJiLi4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZ19ob3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfYXYuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGEyZHAgewotCi0vLyBBdWRpbyBjb25maWcgZnJvbSBhdWRpbyBzZXJ2ZXI7IFBDTSBmb3JtYXQgZm9yIG5vdwotc3RydWN0IEF1ZGlvQ29uZmlnIHsKLSAgYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3Qgc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBiaXRzX3Blcl9zYW1wbGUgPQotICAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDsKLSAgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNoYW5uZWxfbW9kZSA9Ci0gICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLX07Ci0KLS8vIEludm9rZWQgYnkgYXVkaW8gc2VydmVyIHRvIHNldCBhdWRpbyBjb25maWcgKFBDTSBmb3Igbm93KQotYm9vbCBTZXRBdWRpb0NvbmZpZyhBdWRpb0NvbmZpZyk7Ci0KLS8vIEludm9rZWQgYnkgYXVkaW8gc2VydmVyIHdoZW4gaXQgaGFzIGF1ZGlvIGRhdGEgdG8gc3RyZWFtLgotYm9vbCBTdGFydFJlcXVlc3QoKTsKLQotLy8gSW52b2tlZCBieSBhdWRpbyBzZXJ2ZXIgd2hlbiBhdWRpbyBzdHJlYW1pbmcgaXMgZG9uZS4KLWJvb2wgU3RvcFJlcXVlc3QoKTsKLQotc3RydWN0IFByZXNlbnRhdGlvblBvc2l0aW9uIHsKLSAgdWludDY0X3QgcmVtb3RlX2RlbGF5X3JlcG9ydF9uczsKLSAgdWludDY0X3QgdG90YWxfYnl0ZXNfcmVhZDsKLSAgdGltZXNwZWMgZGF0YV9wb3NpdGlvbjsKLX07Ci0KLS8vIEludm9rZWQgYnkgYXVkaW8gc2VydmVyIHRvIGNoZWNrIGF1ZGlvIHByZXNlbnRhdGlvbiBwb3NpdGlvbiBwZXJpb2RpY2FsbHkuCi1QcmVzZW50YXRpb25Qb3NpdGlvbiBHZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpOwotCi19ICAvLyBuYW1lc3BhY2UgYTJkcAotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL2NsaWVudF9pbnRlcmZhY2UuY2MgYi9hdWRpb19oYWxfaW50ZXJmYWNlL2NsaWVudF9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmY0M2YuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9jbGllbnRfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQlRBdWRpb0NsaWVudElmIgotCi0jaW5jbHVkZSAiY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhbF92ZXJzaW9uX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoL2F1ZGlvLzIuMC9JQmx1ZXRvb3RoQXVkaW9Qb3J0Lmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJjb21tb24vc3RvcF93YXRjaF9sZWdhY3kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNV8wOjpTb3VyY2VNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OklCbHVldG9vdGhBdWRpb1BvcnQ7Ci11c2luZyA6OmJsdWV0b290aDo6Y29tbW9uOjpTdG9wV2F0Y2hMZWdhY3k7Ci0KLXVzaW5nIERhdGFNUSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTwKLSAgICB1aW50OF90LCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKLQotc3RhdGljIGNvbnN0ZXhwciBpbnQga0RlZmF1bHREYXRhUmVhZFRpbWVvdXRNcyA9IDEwOyAgICAgICAvLyAxMCBtcwotc3RhdGljIGNvbnN0ZXhwciBpbnQga0RlZmF1bHREYXRhV3JpdGVUaW1lb3V0TXMgPSAxMDsgICAgICAvLyAxMCBtcwotc3RhdGljIGNvbnN0ZXhwciBpbnQga0RlZmF1bHREYXRhUmVhZFBvbGxJbnRlcnZhbE1zID0gMTsgICAvLyBub24tYmxvY2tpbmcgcG9sbAotc3RhdGljIGNvbnN0ZXhwciBpbnQga0RlZmF1bHREYXRhV3JpdGVQb2xsSW50ZXJ2YWxNcyA9IDE7ICAvLyBub24tYmxvY2tpbmcgcG9sbAotCi1zdGQ6OnVuaXF1ZV9wdHI8SGFsVmVyc2lvbk1hbmFnZXI+IEhhbFZlcnNpb25NYW5hZ2VyOjppbnN0YW5jZV9wdHIgPQotICAgIHN0ZDo6dW5pcXVlX3B0cjxIYWxWZXJzaW9uTWFuYWdlcj4obmV3IEhhbFZlcnNpb25NYW5hZ2VyKCkpOwotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrJiBhY2spIHsKLSAgc3dpdGNoIChhY2spIHsKLSAgICBjYXNlIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6U1VDQ0VTU19GSU5JU0hFRDoKLSAgICAgIHJldHVybiBvcyA8PCAiU1VDQ0VTU19GSU5JU0hFRCI7Ci0gICAgY2FzZSBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlBFTkRJTkc6Ci0gICAgICByZXR1cm4gb3MgPDwgIlBFTkRJTkciOwotICAgIGNhc2UgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFX1VOU1VQUE9SVEVEOgotICAgICAgcmV0dXJuIG9zIDw8ICJGQUlMVVJFX1VOU1VQUE9SVEVEIjsKLSAgICBjYXNlIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6RkFJTFVSRV9CVVNZOgotICAgICAgcmV0dXJuIG9zIDw8ICJGQUlMVVJFX0JVU1kiOwotICAgIGNhc2UgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICByZXR1cm4gb3MgPDwgIkZBSUxVUkVfRElTQ09OTkVDVElORyI7Ci0gICAgY2FzZSBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OkZBSUxVUkU6Ci0gICAgICByZXR1cm4gb3MgPDwgIkZBSUxVUkUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gb3MgPDwgIlVOREVGSU5FRCAiIDw8IHN0YXRpY19jYXN0PGludDhfdD4oYWNrKTsKLSAgfQotfQotCi1jbGFzcyBCbHVldG9vdGhBdWRpb1BvcnRJbXBsIDogcHVibGljIElCbHVldG9vdGhBdWRpb1BvcnQgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoQXVkaW9Qb3J0SW1wbChJQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UqIHRyYW5zcG9ydF9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcj4mIHByb3ZpZGVyKQotICAgICAgOiB0cmFuc3BvcnRfaW5zdGFuY2VfKHRyYW5zcG9ydF9pbnN0YW5jZSksIHByb3ZpZGVyXyhwcm92aWRlcikge30KLQotICBSZXR1cm48dm9pZD4gc3RhcnRTdHJlYW0oKSBvdmVycmlkZSB7Ci0gICAgU3RvcFdhdGNoTGVnYWN5KF9fZnVuY19fKTsKLSAgICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgYWNrID0gdHJhbnNwb3J0X2luc3RhbmNlXy0+U3RhcnRSZXF1ZXN0KCk7Ci0gICAgaWYgKGFjayAhPSBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlBFTkRJTkcpIHsKLSAgICAgIGF1dG8gaGlkbF9yZXR2YWwgPQotICAgICAgICAgIHByb3ZpZGVyXy0+c3RyZWFtU3RhcnRlZChCbHVldG9vdGhBdWRpb0N0cmxBY2tUb0hhbFN0YXR1cyhhY2spKTsKLSAgICAgIGlmICghaGlkbF9yZXR2YWwuaXNPaygpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9IYWwgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgICAgIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gc3VzcGVuZFN0cmVhbSgpIG92ZXJyaWRlIHsKLSAgICBTdG9wV2F0Y2hMZWdhY3koX19mdW5jX18pOwotICAgIEJsdWV0b290aEF1ZGlvQ3RybEFjayBhY2sgPSB0cmFuc3BvcnRfaW5zdGFuY2VfLT5TdXNwZW5kUmVxdWVzdCgpOwotICAgIGlmIChhY2sgIT0gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpQRU5ESU5HKSB7Ci0gICAgICBhdXRvIGhpZGxfcmV0dmFsID0KLSAgICAgICAgICBwcm92aWRlcl8tPnN0cmVhbVN1c3BlbmRlZChCbHVldG9vdGhBdWRpb0N0cmxBY2tUb0hhbFN0YXR1cyhhY2spKTsKLSAgICAgIGlmICghaGlkbF9yZXR2YWwuaXNPaygpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9IYWwgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgICAgIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gc3RvcFN0cmVhbSgpIG92ZXJyaWRlIHsKLSAgICBTdG9wV2F0Y2hMZWdhY3koX19mdW5jX18pOwotICAgIHRyYW5zcG9ydF9pbnN0YW5jZV8tPlN0b3BSZXF1ZXN0KCk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLSAgfQotCi0gIFJldHVybjx2b2lkPiBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgIGdldFByZXNlbnRhdGlvblBvc2l0aW9uX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgU3RvcFdhdGNoTGVnYWN5KF9fZnVuY19fKTsKLSAgICB1aW50NjRfdCByZW1vdGVfZGVsYXlfcmVwb3J0X25zOwotICAgIHVpbnQ2NF90IHRvdGFsX2J5dGVzX3JlYWQ7Ci0gICAgdGltZXNwZWMgZGF0YV9wb3NpdGlvbjsKLSAgICBib29sIHJldHZhbCA9IHRyYW5zcG9ydF9pbnN0YW5jZV8tPkdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAmcmVtb3RlX2RlbGF5X3JlcG9ydF9ucywgJnRvdGFsX2J5dGVzX3JlYWQsICZkYXRhX3Bvc2l0aW9uKTsKLQotICAgIFRpbWVTcGVjIHRyYW5zbWl0dGVkT2N0ZXRzVGltZVN0YW1wOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgIHRyYW5zbWl0dGVkT2N0ZXRzVGltZVN0YW1wID0gdGltZXNwZWNfY29udmVydF90b19oYWwoZGF0YV9wb3NpdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlbW90ZV9kZWxheV9yZXBvcnRfbnMgPSAwOwotICAgICAgdG90YWxfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICB0cmFuc21pdHRlZE9jdGV0c1RpbWVTdGFtcCA9IHt9OwotICAgIH0KLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHJlc3VsdD0iIDw8IHJldHZhbAotICAgICAgICAgICAgPDwgIiwgZGVsYXk9IiA8PCByZW1vdGVfZGVsYXlfcmVwb3J0X25zCi0gICAgICAgICAgICA8PCAiLCBkYXRhPSIgPDwgdG90YWxfYnl0ZXNfcmVhZAotICAgICAgICAgICAgPDwgIiBieXRlKHMpLCB0aW1lc3RhbXA9IiA8PCB0b1N0cmluZyh0cmFuc21pdHRlZE9jdGV0c1RpbWVTdGFtcCk7Ci0gICAgX2hpZGxfY2IoKHJldHZhbCA/IEJsdWV0b290aEF1ZGlvU3RhdHVzOjpTVUNDRVNTCi0gICAgICAgICAgICAgICAgICAgICA6IEJsdWV0b290aEF1ZGlvU3RhdHVzOjpGQUlMVVJFKSwKLSAgICAgICAgICAgICByZW1vdGVfZGVsYXlfcmVwb3J0X25zLCB0b3RhbF9ieXRlc19yZWFkLAotICAgICAgICAgICAgIHRyYW5zbWl0dGVkT2N0ZXRzVGltZVN0YW1wKTsKLSAgICByZXR1cm4gVm9pZCgpOwotICB9Ci0KLSAgUmV0dXJuPHZvaWQ+IHVwZGF0ZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGUgewotICAgIFN0b3BXYXRjaExlZ2FjeShfX2Z1bmNfXyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKQotICAgICAgICAgICAgICA8PCAiIHRyYWNrKHMpIjsKLSAgICAvLyByZWZlciB0byBTdHJlYW1PdXQuaW1wbC5oIHdpdGhpbiBBdWRpbyBIQUwgKEFVRElPX0hBTF9WRVJTSU9OXzVfMCkKLSAgICBzdGQ6OnZlY3RvcjxwbGF5YmFja190cmFja19tZXRhZGF0YT4gbWV0YWRhdGFfdmVjOwotICAgIG1ldGFkYXRhX3ZlYy5yZXNlcnZlKHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byYgbWV0YWRhdGEgOiBzb3VyY2VNZXRhZGF0YS50cmFja3MpIHsKLSAgICAgIG1ldGFkYXRhX3ZlYy5wdXNoX2JhY2soewotICAgICAgICAgIC51c2FnZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KG1ldGFkYXRhLnVzYWdlKSwKLSAgICAgICAgICAuY29udGVudF90eXBlID0KLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY29udGVudF90eXBlX3Q+KG1ldGFkYXRhLmNvbnRlbnRUeXBlKSwKLSAgICAgICAgICAuZ2FpbiA9IG1ldGFkYXRhLmdhaW4sCi0gICAgICB9KTsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3Qgc291cmNlX21ldGFkYXRhID0gewotICAgICAgICAudHJhY2tfY291bnQgPSBtZXRhZGF0YV92ZWMuc2l6ZSgpLCAudHJhY2tzID0gbWV0YWRhdGFfdmVjLmRhdGEoKX07Ci0gICAgdHJhbnNwb3J0X2luc3RhbmNlXy0+TWV0YWRhdGFDaGFuZ2VkKHNvdXJjZV9tZXRhZGF0YSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgSUJsdWV0b290aFRyYW5zcG9ydEluc3RhbmNlKiB0cmFuc3BvcnRfaW5zdGFuY2VfOwotICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcj4gcHJvdmlkZXJfOwotICBUaW1lU3BlYyB0aW1lc3BlY19jb252ZXJ0X3RvX2hhbChjb25zdCB0aW1lc3BlYyYgdHMpIHsKLSAgICByZXR1cm4gey50dlNlYyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0cy50dl9zZWMpLAotICAgICAgICAgICAgLnR2TlNlYyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0cy50dl9uc2VjKX07Ci0gIH0KLX07Ci0KLWNsYXNzIEJsdWV0b290aEF1ZGlvRGVhdGhSZWNpcGllbnQKLSAgICA6IHB1YmxpYyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7Ci0gcHVibGljOgotICBCbHVldG9vdGhBdWRpb0RlYXRoUmVjaXBpZW50KAotICAgICAgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2UqIGNsaWVudGlmLAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApCi0gICAgICA6IGJsdWV0b290aF9hdWRpb19jbGllbnRpZl8oY2xpZW50aWYpLCBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCkge30KLSAgdm9pZCBzZXJ2aWNlRGllZCgKLSAgICAgIHVpbnQ2NF90IC8qY29va2llKi8sCi0gICAgICBjb25zdCA6OmFuZHJvaWQ6OndwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKndobyovKQotICAgICAgb3ZlcnJpZGUgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiByZXN0YXJ0aW5nIGNvbm5lY3Rpb24gd2l0aCBuZXcgQXVkaW8gSGFsIjsKLSAgICBpZiAoYmx1ZXRvb3RoX2F1ZGlvX2NsaWVudGlmXyAhPSBudWxscHRyICYmIG1lc3NhZ2VfbG9vcF8gIT0gbnVsbHB0cikgewotICAgICAgLy8gcmVzdGFydCB0aGUgc2Vzc2lvbiBvbiB0aGUgY29ycmVjdCB0aHJlYWQKLSAgICAgIG1lc3NhZ2VfbG9vcF8tPkRvSW5UaHJlYWQoCi0gICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAmQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OlJlbmV3QXVkaW9Qcm92aWRlckFuZFNlc3Npb24sCi0gICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYmx1ZXRvb3RoX2F1ZGlvX2NsaWVudGlmXykpKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZSBjb3JydXB0ZWQiOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2UqIGJsdWV0b290aF9hdWRpb19jbGllbnRpZl87Ci0gIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wXzsKLX07Ci0KLS8vIENvbnN0cnVjdHMgYW4gQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgdG8KLS8vIEJsdWV0b290aEF1ZGlvIEhBTC4gfG1lc3NhZ2VfbG9vcHwgaXMgdGhlIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYXJlCi0vLyBpbnZva2VkLgotQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OkJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlKAotICAgIGFuZHJvaWQ6OnNwPEJsdWV0b290aEF1ZGlvRGVhdGhSZWNpcGllbnQ+IGRlYXRoX3JlY2lwaWVudCwKLSAgICBJQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UqIGluc3RhbmNlKQotICAgIDogcHJvdmlkZXJfKG51bGxwdHIpLAotICAgICAgcHJvdmlkZXJfMl8xXyhudWxscHRyKSwKLSAgICAgIHNlc3Npb25fc3RhcnRlZF8oZmFsc2UpLAotICAgICAgbURhdGFNUShudWxscHRyKSwKLSAgICAgIHRyYW5zcG9ydF8oaW5zdGFuY2UpIHsKLSAgZGVhdGhfcmVjaXBpZW50XyA9IGRlYXRoX3JlY2lwaWVudDsKLX0KLQotc3RkOjp2ZWN0b3I8QXVkaW9DYXBhYmlsaXRpZXM+Ci1CbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6R2V0QXVkaW9DYXBhYmlsaXRpZXMoKSBjb25zdCB7Ci0gIHJldHVybiBjYXBhYmlsaXRpZXNfOwotfQotCi1zdGQ6OnZlY3RvcjxBdWRpb0NhcGFiaWxpdGllc18yXzE+Ci1CbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6R2V0QXVkaW9DYXBhYmlsaXRpZXNfMl8xKCkgY29uc3QgewotICByZXR1cm4gY2FwYWJpbGl0aWVzXzJfMV87Ci19Ci0KLXN0ZDo6dmVjdG9yPEF1ZGlvQ2FwYWJpbGl0aWVzPgotQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OkdldEF1ZGlvQ2FwYWJpbGl0aWVzKFNlc3Npb25UeXBlIHNlc3Npb25fdHlwZSkgewotICBzdGQ6OnZlY3RvcjxBdWRpb0NhcGFiaWxpdGllcz4gY2FwYWJpbGl0aWVzKDApOwotCi0gIGlmIChIYWxWZXJzaW9uTWFuYWdlcjo6R2V0SGFsVmVyc2lvbigpID09Ci0gICAgICBCbHVldG9vdGhBdWRpb0hhbFZlcnNpb246OlZFUlNJT05fVU5BVkFJTEFCTEUpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGNhbid0IGdldCBjYXBhYmlsaXR5IGZyb20gdW5rbm93biBmYWN0b3J5IjsKLSAgICByZXR1cm4gY2FwYWJpbGl0aWVzOwotICB9Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeV8yXzA+IHByb3ZpZGVyc0ZhY3RvcnkgPQotICAgICAgSGFsVmVyc2lvbk1hbmFnZXI6OkdldFByb3ZpZGVyc0ZhY3RvcnlfMl8wKCk7Ci0gIENIRUNLKHByb3ZpZGVyc0ZhY3RvcnkgIT0gbnVsbHB0cikKLSAgICAgIDw8ICJJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgZmFpbGVkIjsKLQotICBhdXRvIGdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzX2NiID0KLSAgICAgIFsmY2FwYWJpbGl0aWVzXShjb25zdCBoaWRsX3ZlYzxBdWRpb0NhcGFiaWxpdGllcz4mIGF1ZGlvQ2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIGZvciAoYXV0byBjYXBhYmlsaXR5IDogYXVkaW9DYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgICBjYXBhYmlsaXRpZXMucHVzaF9iYWNrKGNhcGFiaWxpdHkpOwotICAgICAgICB9Ci0gICAgICB9OwotICBhdXRvIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJzRmFjdG9yeS0+Z2V0UHJvdmlkZXJDYXBhYmlsaXRpZXMoCi0gICAgICBzZXNzaW9uX3R5cGUsIGdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzX2NiKTsKLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbDo6Z2V0UHJvdmlkZXJDYXBhYmlsaXRpZXMgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgfQotICByZXR1cm4gY2FwYWJpbGl0aWVzOwotfQotCi1zdGQ6OnZlY3RvcjxBdWRpb0NhcGFiaWxpdGllc18yXzE+Ci1CbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6R2V0QXVkaW9DYXBhYmlsaXRpZXNfMl8xKAotICAgIFNlc3Npb25UeXBlXzJfMSBzZXNzaW9uX3R5cGVfMl8xKSB7Ci0gIHN0ZDo6dmVjdG9yPEF1ZGlvQ2FwYWJpbGl0aWVzXzJfMT4gY2FwYWJpbGl0aWVzXzJfMSgwKTsKLQotICBpZiAoSGFsVmVyc2lvbk1hbmFnZXI6OkdldEhhbFZlcnNpb24oKSAhPQotICAgICAgQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OXzJfMSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgY2FuJ3QgZ2V0IGNhcGFiaWxpdHkgZm9yIEhBTCAyLjEiOwotICAgIHJldHVybiBjYXBhYmlsaXRpZXNfMl8xOwotICB9Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeV8yXzE+IHByb3ZpZGVyc0ZhY3RvcnkgPQotICAgICAgSGFsVmVyc2lvbk1hbmFnZXI6OkdldFByb3ZpZGVyc0ZhY3RvcnlfMl8xKCk7Ci0gIENIRUNLKHByb3ZpZGVyc0ZhY3RvcnkgIT0gbnVsbHB0cikKLSAgICAgIDw8ICJJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgZmFpbGVkIjsKLQotICBhdXRvIGdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzX2NiID0KLSAgICAgIFsmY2FwYWJpbGl0aWVzXzJfMV0oCi0gICAgICAgICAgY29uc3QgaGlkbF92ZWM8QXVkaW9DYXBhYmlsaXRpZXNfMl8xPiYgYXVkaW9DYXBhYmlsaXRpZXNfMl8xKSB7Ci0gICAgICAgIGZvciAoYXV0byBjYXBhYmlsaXR5XzJfMSA6IGF1ZGlvQ2FwYWJpbGl0aWVzXzJfMSkgewotICAgICAgICAgIGNhcGFiaWxpdGllc18yXzEucHVzaF9iYWNrKGNhcGFiaWxpdHlfMl8xKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgYXV0byBoaWRsX3JldHZhbCA9IHByb3ZpZGVyc0ZhY3RvcnktPmdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzXzJfMSgKLSAgICAgIHNlc3Npb25fdHlwZV8yXzEsIGdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzX2NiKTsKLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbDo6Z2V0UHJvdmlkZXJDYXBhYmlsaXRpZXMgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgfQotICByZXR1cm4gY2FwYWJpbGl0aWVzXzJfMTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6RmV0Y2hBdWRpb1Byb3ZpZGVyKCkgewotICBpZiAocHJvdmlkZXJfICE9IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogcmVmbGFzaCI7Ci0gIH0KLQotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5XzJfMD4gcHJvdmlkZXJzRmFjdG9yeSA9Ci0gICAgICBIYWxWZXJzaW9uTWFuYWdlcjo6R2V0UHJvdmlkZXJzRmFjdG9yeV8yXzAoKTsKLSAgQ0hFQ0socHJvdmlkZXJzRmFjdG9yeSAhPSBudWxscHRyKQotICAgICAgPDwgIklCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSBmYWlsZWQiOwotCi0gIGF1dG8gZ2V0UHJvdmlkZXJDYXBhYmlsaXRpZXNfY2IgPQotICAgICAgWyZjYXBhYmlsaXRpZXMgPSB0aGlzLT5jYXBhYmlsaXRpZXNfXSgKLSAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxBdWRpb0NhcGFiaWxpdGllcz4mIGF1ZGlvQ2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5jbGVhcigpOwotICAgICAgICBmb3IgKGF1dG8gY2FwYWJpbGl0eSA6IGF1ZGlvQ2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgICAgY2FwYWJpbGl0aWVzLnB1c2hfYmFjayhjYXBhYmlsaXR5KTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgYXV0byBoaWRsX3JldHZhbCA9IHByb3ZpZGVyc0ZhY3RvcnktPmdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzKAotICAgICAgdHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGUoKSwgZ2V0UHJvdmlkZXJDYXBhYmlsaXRpZXNfY2IpOwotICBpZiAoIWhpZGxfcmV0dmFsLmlzT2soKSkgewotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsOjpnZXRQcm92aWRlckNhcGFiaWxpdGllcyBmYWlsdXJlOiAiCi0gICAgICAgICAgICAgICA8PCBoaWRsX3JldHZhbC5kZXNjcmlwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoY2FwYWJpbGl0aWVzXy5lbXB0eSgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IFNlc3Npb25UeXBlPSIgPDwgdG9TdHJpbmcodHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGUoKSkKLSAgICAgICAgICAgICAgICAgPDwgIiBOb3Qgc3VwcG9ydGVkIGJ5IEJsdWV0b290aEF1ZGlvSGFsIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsIFNlc3Npb25UeXBlPSIKLSAgICAgICAgICAgIDw8IHRvU3RyaW5nKHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlKCkpIDw8ICIgaGFzICIKLSAgICAgICAgICAgIDw8IGNhcGFiaWxpdGllc18uc2l6ZSgpIDw8ICIgQXVkaW9DYXBhYmlsaXRpZXMiOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBvcGVuUHJvdmlkZXJfcHJvbWlzZTsKLSAgYXV0byBvcGVuUHJvdmlkZXJfZnV0dXJlID0gb3BlblByb3ZpZGVyX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBhdXRvIG9wZW5Qcm92aWRlcl9jYiA9Ci0gICAgICBbJnByb3ZpZGVyXyA9IHRoaXMtPnByb3ZpZGVyXywgJm9wZW5Qcm92aWRlcl9wcm9taXNlXSgKLSAgICAgICAgICBCbHVldG9vdGhBdWRpb1N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUHJvdmlkZXI+JiBwcm92aWRlcikgewotICAgICAgICBMT0coSU5GTykgPDwgIm9wZW5Qcm92aWRlcl9jYigiIDw8IHRvU3RyaW5nKHN0YXR1cykgPDwgIikiOwotICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEF1ZGlvU3RhdHVzOjpTVUNDRVNTKSB7Ci0gICAgICAgICAgcHJvdmlkZXJfID0gcHJvdmlkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0VfSUYoIXByb3ZpZGVyXywgIkZhaWxlZCB0byBvcGVuIEJsdWV0b290aEF1ZGlvIHByb3ZpZGVyIik7Ci0gICAgICAgIG9wZW5Qcm92aWRlcl9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgfTsKLSAgaGlkbF9yZXR2YWwgPSBwcm92aWRlcnNGYWN0b3J5LT5vcGVuUHJvdmlkZXIodHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblByb3ZpZGVyX2NiKTsKLSAgb3BlblByb3ZpZGVyX2Z1dHVyZS5nZXQoKTsKLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsOjpvcGVuUHJvdmlkZXIgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgfQotICBDSEVDSyhwcm92aWRlcl8gIT0gbnVsbHB0cik7Ci0KLSAgaWYgKCFwcm92aWRlcl8tPmxpbmtUb0RlYXRoKGRlYXRoX3JlY2lwaWVudF8sIDApLmlzT2soKSkgewotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9EZWF0aFJlY2lwaWVudCBmYWlsdXJlOiAiCi0gICAgICAgICAgICAgICA8PCBoaWRsX3JldHZhbC5kZXNjcmlwdGlvbigpOwotICB9Ci0KLSAgTE9HKElORk8pIDw8ICJJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5OjpvcGVuUHJvdmlkZXIoKSByZXR1cm5lZCAiCi0gICAgICAgICAgICA8PCBwcm92aWRlcl8uZ2V0KCkKLSAgICAgICAgICAgIDw8IChwcm92aWRlcl8tPmlzUmVtb3RlKCkgPyAiIChyZW1vdGUpIiA6ICIgKGxvY2FsKSIpOwotfQotCi12b2lkIEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpGZXRjaEF1ZGlvUHJvdmlkZXJfMl8xKCkgewotICBpZiAocHJvdmlkZXJfMl8xXyAhPSBudWxscHRyKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHJlZmxhc2giOwotICB9Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeV8yXzE+IHByb3ZpZGVyc0ZhY3RvcnkgPQotICAgICAgSGFsVmVyc2lvbk1hbmFnZXI6OkdldFByb3ZpZGVyc0ZhY3RvcnlfMl8xKCk7Ci0gIENIRUNLKHByb3ZpZGVyc0ZhY3RvcnkgIT0gbnVsbHB0cikKLSAgICAgIDw8ICJJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5XzJfMTo6Z2V0U2VydmljZSgpIGZhaWxlZCI7Ci0KLSAgYXV0byBnZXRQcm92aWRlckNhcGFiaWxpdGllc19jYiA9Ci0gICAgICBbJmNhcGFiaWxpdGllc18yXzEgPSB0aGlzLT5jYXBhYmlsaXRpZXNfMl8xX10oCi0gICAgICAgICAgY29uc3QgaGlkbF92ZWM8QXVkaW9DYXBhYmlsaXRpZXNfMl8xPiYgYXVkaW9DYXBhYmlsaXRpZXNfMl8xKSB7Ci0gICAgICAgIGNhcGFiaWxpdGllc18yXzEuY2xlYXIoKTsKLSAgICAgICAgZm9yIChhdXRvIGNhcGFiaWxpdHlfMl8xIDogYXVkaW9DYXBhYmlsaXRpZXNfMl8xKSB7Ci0gICAgICAgICAgY2FwYWJpbGl0aWVzXzJfMS5wdXNoX2JhY2soY2FwYWJpbGl0eV8yXzEpOwotICAgICAgICB9Ci0gICAgICB9OwotICBhdXRvIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJzRmFjdG9yeS0+Z2V0UHJvdmlkZXJDYXBhYmlsaXRpZXNfMl8xKAotICAgICAgdHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGVfMl8xKCksIGdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzX2NiKTsKLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbDo6Z2V0UHJvdmlkZXJDYXBhYmlsaXRpZXMgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGNhcGFiaWxpdGllc18yXzFfLmVtcHR5KCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogU2Vzc2lvblR5cGU9IgotICAgICAgICAgICAgICAgICA8PCB0b1N0cmluZyh0cmFuc3BvcnRfLT5HZXRTZXNzaW9uVHlwZV8yXzEoKSkKLSAgICAgICAgICAgICAgICAgPDwgIiBOb3Qgc3VwcG9ydGVkIGJ5IEJsdWV0b290aEF1ZGlvSGFsIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsIFNlc3Npb25UeXBlPSIKLSAgICAgICAgICAgIDw8IHRvU3RyaW5nKHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlXzJfMSgpKSA8PCAiIGhhcyAiCi0gICAgICAgICAgICA8PCBjYXBhYmlsaXRpZXNfMl8xXy5zaXplKCkgPDwgIiBBdWRpb0NhcGFiaWxpdGllcyI7Ci0KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IG9wZW5Qcm92aWRlcl9wcm9taXNlOwotICBhdXRvIG9wZW5Qcm92aWRlcl9mdXR1cmUgPSBvcGVuUHJvdmlkZXJfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGF1dG8gb3BlblByb3ZpZGVyX2NiID0KLSAgICAgIFsmcHJvdmlkZXJfMl8xXyA9IHRoaXMtPnByb3ZpZGVyXzJfMV8sICZvcGVuUHJvdmlkZXJfcHJvbWlzZV0oCi0gICAgICAgICAgQmx1ZXRvb3RoQXVkaW9TdGF0dXMgc3RhdHVzLAotICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyXzJfMT4mIHByb3ZpZGVyXzJfMSkgewotICAgICAgICBMT0coSU5GTykgPDwgIm9wZW5Qcm92aWRlcl9jYigiIDw8IHRvU3RyaW5nKHN0YXR1cykgPDwgIikiOwotICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEF1ZGlvU3RhdHVzOjpTVUNDRVNTKSB7Ci0gICAgICAgICAgcHJvdmlkZXJfMl8xXyA9IHByb3ZpZGVyXzJfMTsKLSAgICAgICAgfQotICAgICAgICBBTE9HRV9JRighcHJvdmlkZXJfMl8xXywgIkZhaWxlZCB0byBvcGVuIEJsdWV0b290aEF1ZGlvIHByb3ZpZGVyXzJfMSIpOwotICAgICAgICBvcGVuUHJvdmlkZXJfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgIH07Ci0gIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJzRmFjdG9yeS0+b3BlblByb3ZpZGVyXzJfMSgKLSAgICAgIHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlXzJfMSgpLCBvcGVuUHJvdmlkZXJfY2IpOwotICBvcGVuUHJvdmlkZXJfZnV0dXJlLmdldCgpOwotICBpZiAoIWhpZGxfcmV0dmFsLmlzT2soKSkgewotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9IYWw6Om9wZW5Qcm92aWRlciBmYWlsdXJlOiAiCi0gICAgICAgICAgICAgICA8PCBoaWRsX3JldHZhbC5kZXNjcmlwdGlvbigpOwotICB9Ci0gIENIRUNLKHByb3ZpZGVyXzJfMV8gIT0gbnVsbHB0cik7Ci0KLSAgaWYgKCFwcm92aWRlcl8yXzFfLT5saW5rVG9EZWF0aChkZWF0aF9yZWNpcGllbnRfLCAwKS5pc09rKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvRGVhdGhSZWNpcGllbnQgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCAiSUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeTo6b3BlblByb3ZpZGVyKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgPDwgcHJvdmlkZXJfMl8xXy5nZXQoKQotICAgICAgICAgICAgPDwgKHByb3ZpZGVyXzJfMV8tPmlzUmVtb3RlKCkgPyAiIChyZW1vdGUpIiA6ICIgKGxvY2FsKSIpOwotfQotCi1CbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2U6OkJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSgKLSAgICBJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlKiBzaW5rLAotICAgIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wKQotICAgIDogQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2V7bmV3IEJsdWV0b290aEF1ZGlvRGVhdGhSZWNpcGllbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbWVzc2FnZV9sb29wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmt9LAotICAgICAgc2lua18oc2luaykgewotICBpZiAoSGFsVmVyc2lvbk1hbmFnZXI6OkdldEhhbFZlcnNpb24oKSA9PQotICAgICAgQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OX1VOQVZBSUxBQkxFKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKChIYWxWZXJzaW9uTWFuYWdlcjo6R2V0SGFsVmVyc2lvbigpID09Ci0gICAgICAgQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OXzJfMSkgJiYKLSAgICAgIChzaW5rXy0+R2V0U2Vzc2lvblR5cGVfMl8xKCkgIT0gU2Vzc2lvblR5cGVfMl8xOjpVTktOT1dOKSkgewotICAgIEZldGNoQXVkaW9Qcm92aWRlcl8yXzEoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRmV0Y2hBdWRpb1Byb3ZpZGVyKCk7Ci19Ci0KLUJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZTo6fkJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSgpIHsKLSAgaWYgKHByb3ZpZGVyXyAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBoaWRsX3JldHZhbCA9IHByb3ZpZGVyXy0+dW5saW5rVG9EZWF0aChkZWF0aF9yZWNpcGllbnRfKTsKLSAgICBpZiAoIWhpZGxfcmV0dmFsLmlzT2soKSkgewotICAgICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb0RlYXRoUmVjaXBpZW50IGZhaWx1cmU6ICIKLSAgICAgICAgICAgICAgICAgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgICB9Ci0gIH0KLSAgaWYgKHByb3ZpZGVyXzJfMV8gIT0gbnVsbHB0cikgewotICAgIGF1dG8gaGlkbF9yZXR2YWwgPSBwcm92aWRlcl8yXzFfLT51bmxpbmtUb0RlYXRoKGRlYXRoX3JlY2lwaWVudF8pOwotICAgIGlmICghaGlkbF9yZXR2YWwuaXNPaygpKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvRGVhdGhSZWNpcGllbnQgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgICA8PCBoaWRsX3JldHZhbC5kZXNjcmlwdGlvbigpOwotICAgIH0KLSAgfQotfQotCi1CbHVldG9vdGhBdWRpb1NvdXJjZUNsaWVudEludGVyZmFjZTo6Qmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2UoCi0gICAgSUJsdWV0b290aFNvdXJjZVRyYW5zcG9ydEluc3RhbmNlKiBzb3VyY2UsCi0gICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApCi0gICAgOiBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZXtuZXcgQmx1ZXRvb3RoQXVkaW9EZWF0aFJlY2lwaWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBtZXNzYWdlX2xvb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlfSwKLSAgICAgIHNvdXJjZV8oc291cmNlKSB7Ci0gIGlmIChIYWxWZXJzaW9uTWFuYWdlcjo6R2V0SGFsVmVyc2lvbigpID09Ci0gICAgICBCbHVldG9vdGhBdWRpb0hhbFZlcnNpb246OlZFUlNJT05fVU5BVkFJTEFCTEUpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoKEhhbFZlcnNpb25NYW5hZ2VyOjpHZXRIYWxWZXJzaW9uKCkgPT0KLSAgICAgICBCbHVldG9vdGhBdWRpb0hhbFZlcnNpb246OlZFUlNJT05fMl8xKSAmJgotICAgICAgKHNvdXJjZV8tPkdldFNlc3Npb25UeXBlXzJfMSgpICE9IFNlc3Npb25UeXBlXzJfMTo6VU5LTk9XTikpIHsKLSAgICBGZXRjaEF1ZGlvUHJvdmlkZXJfMl8xKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEZldGNoQXVkaW9Qcm92aWRlcigpOwotfQotCi1CbHVldG9vdGhBdWRpb1NvdXJjZUNsaWVudEludGVyZmFjZTo6fkJsdWV0b290aEF1ZGlvU291cmNlQ2xpZW50SW50ZXJmYWNlKCkgewotICBpZiAocHJvdmlkZXJfICE9IG51bGxwdHIpIHsKLSAgICBhdXRvIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJfLT51bmxpbmtUb0RlYXRoKGRlYXRoX3JlY2lwaWVudF8pOwotICAgIGlmICghaGlkbF9yZXR2YWwuaXNPaygpKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvRGVhdGhSZWNpcGllbnQgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgICA8PCBoaWRsX3JldHZhbC5kZXNjcmlwdGlvbigpOwotICAgIH0KLSAgfQotICBpZiAocHJvdmlkZXJfMl8xXyAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBoaWRsX3JldHZhbCA9IHByb3ZpZGVyXzJfMV8tPnVubGlua1RvRGVhdGgoZGVhdGhfcmVjaXBpZW50Xyk7Ci0gICAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9EZWF0aFJlY2lwaWVudCBmYWlsdXJlOiAiCi0gICAgICAgICAgICAgICAgIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OlVwZGF0ZUF1ZGlvQ29uZmlnKAotICAgIGNvbnN0IEF1ZGlvQ29uZmlndXJhdGlvbiYgYXVkaW9fY29uZmlnKSB7Ci0gIGJvb2wgaXNfc29mdHdhcmVfc2Vzc2lvbiA9Ci0gICAgICAodHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGUoKSA9PQotICAgICAgICAgICBTZXNzaW9uVHlwZTo6QTJEUF9TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSCB8fAotICAgICAgIHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlKCkgPT0KLSAgICAgICAgICAgU2Vzc2lvblR5cGU6OkhFQVJJTkdfQUlEX1NPRlRXQVJFX0VOQ09ESU5HX0RBVEFQQVRIKTsKLSAgYm9vbCBpc19vZmZsb2FkX3Nlc3Npb24gPSAodHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uVHlwZTo6QTJEUF9IQVJEV0FSRV9PRkZMT0FEX0RBVEFQQVRIKTsKLSAgYXV0byBhdWRpb19jb25maWdfZGlzY3JpbWluYXRvciA9IGF1ZGlvX2NvbmZpZy5nZXREaXNjcmltaW5hdG9yKCk7Ci0gIGJvb2wgaXNfc29mdHdhcmVfYXVkaW9fY29uZmlnID0KLSAgICAgIChpc19zb2Z0d2FyZV9zZXNzaW9uICYmCi0gICAgICAgYXVkaW9fY29uZmlnX2Rpc2NyaW1pbmF0b3IgPT0KLSAgICAgICAgICAgQXVkaW9Db25maWd1cmF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBjbUNvbmZpZyk7Ci0gIGJvb2wgaXNfb2ZmbG9hZF9hdWRpb19jb25maWcgPQotICAgICAgKGlzX29mZmxvYWRfc2Vzc2lvbiAmJgotICAgICAgIGF1ZGlvX2NvbmZpZ19kaXNjcmltaW5hdG9yID09Ci0gICAgICAgICAgIEF1ZGlvQ29uZmlndXJhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpjb2RlY0NvbmZpZyk7Ci0gIGlmICghaXNfc29mdHdhcmVfYXVkaW9fY29uZmlnICYmICFpc19vZmZsb2FkX2F1ZGlvX2NvbmZpZykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB0cmFuc3BvcnRfLT5VcGRhdGVBdWRpb0NvbmZpZ3VyYXRpb24oYXVkaW9fY29uZmlnKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OlVwZGF0ZUF1ZGlvQ29uZmlnXzJfMSgKLSAgICBjb25zdCBBdWRpb0NvbmZpZ3VyYXRpb25fMl8xJiBhdWRpb19jb25maWdfMl8xKSB7Ci0gIGJvb2wgaXNfc29mdHdhcmVfc2Vzc2lvbiA9Ci0gICAgICAodHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGVfMl8xKCkgPT0KLSAgICAgICAgICAgU2Vzc2lvblR5cGVfMl8xOjpBMkRQX1NPRlRXQVJFX0VOQ09ESU5HX0RBVEFQQVRIIHx8Ci0gICAgICAgdHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGVfMl8xKCkgPT0KLSAgICAgICAgICAgU2Vzc2lvblR5cGVfMl8xOjpIRUFSSU5HX0FJRF9TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSCB8fAotICAgICAgIHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlXzJfMSgpID09Ci0gICAgICAgICAgIFNlc3Npb25UeXBlXzJfMTo6TEVfQVVESU9fU09GVFdBUkVfRU5DT0RJTkdfREFUQVBBVEggfHwKLSAgICAgICB0cmFuc3BvcnRfLT5HZXRTZXNzaW9uVHlwZV8yXzEoKSA9PQotICAgICAgICAgICBTZXNzaW9uVHlwZV8yXzE6OkxFX0FVRElPX1NPRlRXQVJFX0RFQ09ERURfREFUQVBBVEgpOwotICBib29sIGlzX29mZmxvYWRfc2Vzc2lvbiA9ICh0cmFuc3BvcnRfLT5HZXRTZXNzaW9uVHlwZV8yXzEoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uVHlwZV8yXzE6OkEyRFBfSEFSRFdBUkVfT0ZGTE9BRF9EQVRBUEFUSCk7Ci0gIGF1dG8gYXVkaW9fY29uZmlnX2Rpc2NyaW1pbmF0b3IgPSBhdWRpb19jb25maWdfMl8xLmdldERpc2NyaW1pbmF0b3IoKTsKLSAgYm9vbCBpc19zb2Z0d2FyZV9hdWRpb19jb25maWcgPQotICAgICAgKGlzX3NvZnR3YXJlX3Nlc3Npb24gJiYKLSAgICAgICBhdWRpb19jb25maWdfZGlzY3JpbWluYXRvciA9PQotICAgICAgICAgICBBdWRpb0NvbmZpZ3VyYXRpb25fMl8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBjbUNvbmZpZyk7Ci0gIGJvb2wgaXNfb2ZmbG9hZF9hdWRpb19jb25maWcgPQotICAgICAgKGlzX29mZmxvYWRfc2Vzc2lvbiAmJgotICAgICAgIGF1ZGlvX2NvbmZpZ19kaXNjcmltaW5hdG9yID09Ci0gICAgICAgICAgIEF1ZGlvQ29uZmlndXJhdGlvbl8yXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Y29kZWNDb25maWcpOwotICBpZiAoIWlzX3NvZnR3YXJlX2F1ZGlvX2NvbmZpZyAmJiAhaXNfb2ZmbG9hZF9hdWRpb19jb25maWcpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdHJhbnNwb3J0Xy0+VXBkYXRlQXVkaW9Db25maWd1cmF0aW9uXzJfMShhdWRpb19jb25maWdfMl8xKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6U3RhcnRTZXNzaW9uKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgaWYgKHByb3ZpZGVyXyA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBudWxscHRyIjsKLSAgICBzZXNzaW9uX3N0YXJ0ZWRfID0gZmFsc2U7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgaWYgKHNlc3Npb25fc3RhcnRlZF8pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb24gc3RhcnRlZCBhbHJlYWR5IjsKLSAgICByZXR1cm4gLUVCVVNZOwotICB9Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUG9ydD4gc3RhY2tfaWYgPQotICAgICAgbmV3IEJsdWV0b290aEF1ZGlvUG9ydEltcGwodHJhbnNwb3J0XywgcHJvdmlkZXJfKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICBCbHVldG9vdGhBdWRpb1N0YXR1cyBzZXNzaW9uX3N0YXR1czsKLQotICBzdGQ6OnByb21pc2U8dm9pZD4gaGlkbF9zdGFydFNlc3Npb25fcHJvbWlzZTsKLSAgYXV0byBoaWRsX3N0YXJ0U2Vzc2lvbl9mdXR1cmUgPSBoaWRsX3N0YXJ0U2Vzc2lvbl9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgYXV0byBoaWRsX2NiID0gWyZzZXNzaW9uX3N0YXR1cywgJnRlbXBEYXRhTVEsICZoaWRsX3N0YXJ0U2Vzc2lvbl9wcm9taXNlXSgKLSAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEF1ZGlvU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RKSB7Ci0gICAgTE9HKElORk8pIDw8ICJzdGFydFNlc3Npb25fY2IoIiA8PCB0b1N0cmluZyhzdGF0dXMpIDw8ICIpIjsKLSAgICBzZXNzaW9uX3N0YXR1cyA9IHN0YXR1czsKLSAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEF1ZGlvU3RhdHVzOjpTVUNDRVNTICYmIGRhdGFNUS5pc0hhbmRsZVZhbGlkKCkpIHsKLSAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICB9Ci0gICAgaGlkbF9zdGFydFNlc3Npb25fcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfTsKLSAgYXV0byBoaWRsX3JldHZhbCA9IHByb3ZpZGVyXy0+c3RhcnRTZXNzaW9uKAotICAgICAgc3RhY2tfaWYsIHRyYW5zcG9ydF8tPkdldEF1ZGlvQ29uZmlndXJhdGlvbigpLCBoaWRsX2NiKTsKLSAgaGlkbF9zdGFydFNlc3Npb25fZnV0dXJlLmdldCgpOwotICBpZiAoIWhpZGxfcmV0dmFsLmlzT2soKSkgewotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsIGZhaWx1cmU6ICIgPDwgaGlkbF9yZXR2YWwuZGVzY3JpcHRpb24oKTsKLSAgICByZXR1cm4gLUVQUk9UTzsKLSAgfQotCi0gIGlmICh0ZW1wRGF0YU1RICYmIHRlbXBEYXRhTVEtPmlzVmFsaWQoKSkgewotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gIH0gZWxzZSBpZiAodHJhbnNwb3J0Xy0+R2V0U2Vzc2lvblR5cGUoKSA9PQotICAgICAgICAgICAgICAgICBTZXNzaW9uVHlwZTo6QTJEUF9IQVJEV0FSRV9PRkZMT0FEX0RBVEFQQVRIICYmCi0gICAgICAgICAgICAgc2Vzc2lvbl9zdGF0dXMgPT0gQmx1ZXRvb3RoQXVkaW9TdGF0dXM6OlNVQ0NFU1MpIHsKLSAgICB0cmFuc3BvcnRfLT5SZXNldFByZXNlbnRhdGlvblBvc2l0aW9uKCk7Ci0gICAgc2Vzc2lvbl9zdGFydGVkXyA9IHRydWU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG1EYXRhTVEgJiYgbURhdGFNUS0+aXNWYWxpZCgpKSB7Ci0gICAgdHJhbnNwb3J0Xy0+UmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpOwotICAgIHNlc3Npb25fc3RhcnRlZF8gPSB0cnVlOwotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIEFMT0dFX0lGKCFtRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBhdWRpbyBkYXRhIHBhdGgiKTsKLSAgICBBTE9HRV9JRihtRGF0YU1RICYmICFtRGF0YU1RLT5pc1ZhbGlkKCksICJBdWRpbyBkYXRhIHBhdGggaXMgaW52YWxpZCIpOwotICAgIHNlc3Npb25fc3RhcnRlZF8gPSBmYWxzZTsKLSAgICByZXR1cm4gLUVJTzsKLSAgfQotfQotCi1pbnQgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OlN0YXJ0U2Vzc2lvbl8yXzEoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChpbnRlcm5hbF9tdXRleF8pOwotICBpZiAocHJvdmlkZXJfMl8xXyA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBudWxscHRyIjsKLSAgICBzZXNzaW9uX3N0YXJ0ZWRfID0gZmFsc2U7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgaWYgKHNlc3Npb25fc3RhcnRlZF8pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb24gc3RhcnRlZCBhbHJlYWR5IjsKLSAgICByZXR1cm4gLUVCVVNZOwotICB9Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUG9ydD4gc3RhY2tfaWYgPQotICAgICAgbmV3IEJsdWV0b290aEF1ZGlvUG9ydEltcGwodHJhbnNwb3J0XywgcHJvdmlkZXJfMl8xXyk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgQmx1ZXRvb3RoQXVkaW9TdGF0dXMgc2Vzc2lvbl9zdGF0dXM7Ci0KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGhpZGxfc3RhcnRTZXNzaW9uX3Byb21pc2U7Ci0gIGF1dG8gaGlkbF9zdGFydFNlc3Npb25fZnV0dXJlID0gaGlkbF9zdGFydFNlc3Npb25fcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGF1dG8gaGlkbF9jYiA9IFsmc2Vzc2lvbl9zdGF0dXMsICZ0ZW1wRGF0YU1RLCAmaGlkbF9zdGFydFNlc3Npb25fcHJvbWlzZV0oCi0gICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBdWRpb1N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSkgewotICAgIExPRyhJTkZPKSA8PCAic3RhcnRTZXNzaW9uX2NiKCIgPDwgdG9TdHJpbmcoc3RhdHVzKSA8PCAiKSI7Ci0gICAgc2Vzc2lvbl9zdGF0dXMgPSBzdGF0dXM7Ci0gICAgaWYgKHN0YXR1cyA9PSBCbHVldG9vdGhBdWRpb1N0YXR1czo6U1VDQ0VTUyAmJiBkYXRhTVEuaXNIYW5kbGVWYWxpZCgpKSB7Ci0gICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgfQotICAgIGhpZGxfc3RhcnRTZXNzaW9uX3Byb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gIH07Ci0gIGF1dG8gaGlkbF9yZXR2YWwgPSBwcm92aWRlcl8yXzFfLT5zdGFydFNlc3Npb25fMl8xKAotICAgICAgc3RhY2tfaWYsIHRyYW5zcG9ydF8tPkdldEF1ZGlvQ29uZmlndXJhdGlvbl8yXzEoKSwgaGlkbF9jYik7Ci0gIGhpZGxfc3RhcnRTZXNzaW9uX2Z1dHVyZS5nZXQoKTsKLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBmYWlsdXJlOiAiIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gICAgcmV0dXJuIC1FUFJPVE87Ci0gIH0KLQotICBpZiAodGVtcERhdGFNUSAmJiB0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkpIHsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICB9IGVsc2UgaWYgKHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlXzJfMSgpID09Ci0gICAgICAgICAgICAgICAgIFNlc3Npb25UeXBlXzJfMTo6QTJEUF9IQVJEV0FSRV9PRkZMT0FEX0RBVEFQQVRIICYmCi0gICAgICAgICAgICAgc2Vzc2lvbl9zdGF0dXMgPT0gQmx1ZXRvb3RoQXVkaW9TdGF0dXM6OlNVQ0NFU1MpIHsKLSAgICB0cmFuc3BvcnRfLT5SZXNldFByZXNlbnRhdGlvblBvc2l0aW9uKCk7Ci0gICAgc2Vzc2lvbl9zdGFydGVkXyA9IHRydWU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG1EYXRhTVEgJiYgbURhdGFNUS0+aXNWYWxpZCgpKSB7Ci0gICAgdHJhbnNwb3J0Xy0+UmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpOwotICAgIHNlc3Npb25fc3RhcnRlZF8gPSB0cnVlOwotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIEFMT0dFX0lGKCFtRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBhdWRpbyBkYXRhIHBhdGgiKTsKLSAgICBBTE9HRV9JRihtRGF0YU1RICYmICFtRGF0YU1RLT5pc1ZhbGlkKCksICJBdWRpbyBkYXRhIHBhdGggaXMgaW52YWxpZCIpOwotICAgIHNlc3Npb25fc3RhcnRlZF8gPSBmYWxzZTsKLSAgICByZXR1cm4gLUVJTzsKLSAgfQotfQotCi12b2lkIEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTdHJlYW1TdGFydGVkKAotICAgIGNvbnN0IEJsdWV0b290aEF1ZGlvQ3RybEFjayYgYWNrKSB7Ci0gIGlmIChwcm92aWRlcl8gPT0gbnVsbHB0ciAmJiBwcm92aWRlcl8yXzFfID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsIG51bGxwdHIiOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYWNrID09IEJsdWV0b290aEF1ZGlvQ3RybEFjazo6UEVORElORykgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IGFjayA8PCAiIGlnbm9yZWQiOwotICAgIHJldHVybjsKLSAgfQotICBCbHVldG9vdGhBdWRpb1N0YXR1cyBzdGF0dXMgPSBCbHVldG9vdGhBdWRpb0N0cmxBY2tUb0hhbFN0YXR1cyhhY2spOwotCi0gIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBoaWRsX3JldHZhbDsKLSAgaWYgKHByb3ZpZGVyXzJfMV8gIT0gbnVsbHB0cikKLSAgICBoaWRsX3JldHZhbCA9IHByb3ZpZGVyXzJfMV8tPnN0cmVhbVN0YXJ0ZWQoc3RhdHVzKTsKLSAgZWxzZQotICAgIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJfLT5zdHJlYW1TdGFydGVkKHN0YXR1cyk7Ci0KLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBmYWlsdXJlOiAiIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gIH0KLX0KLQotdm9pZCBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6U3RyZWFtU3VzcGVuZGVkKAotICAgIGNvbnN0IEJsdWV0b290aEF1ZGlvQ3RybEFjayYgYWNrKSB7Ci0gIGlmIChwcm92aWRlcl8gPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoQXVkaW9IYWwgbnVsbHB0ciI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChhY2sgPT0gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpQRU5ESU5HKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgYWNrIDw8ICIgaWdub3JlZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEJsdWV0b290aEF1ZGlvU3RhdHVzIHN0YXR1cyA9IEJsdWV0b290aEF1ZGlvQ3RybEFja1RvSGFsU3RhdHVzKGFjayk7Ci0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGhpZGxfcmV0dmFsOwotICBpZiAocHJvdmlkZXJfMl8xXyAhPSBudWxscHRyKQotICAgIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJfMl8xXy0+c3RyZWFtU3VzcGVuZGVkKHN0YXR1cyk7Ci0gIGVsc2UKLSAgICBoaWRsX3JldHZhbCA9IHByb3ZpZGVyXy0+c3RyZWFtU3VzcGVuZGVkKHN0YXR1cyk7Ci0KLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBmYWlsdXJlOiAiIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gIH0KLX0KLQotaW50IEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpFbmRTZXNzaW9uKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgaWYgKCFzZXNzaW9uX3N0YXJ0ZWRfKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlc3Npb24gZW5kZWQgYWxyZWFkeSI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzZXNzaW9uX3N0YXJ0ZWRfID0gZmFsc2U7Ci0gIGlmIChwcm92aWRlcl8yXzFfID09IG51bGxwdHIgJiYgcHJvdmlkZXJfID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsIG51bGxwdHIiOwotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0gIG1EYXRhTVEgPSBudWxscHRyOwotCi0gIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBoaWRsX3JldHZhbDsKLSAgaWYgKHByb3ZpZGVyXzJfMV8gIT0gbnVsbHB0cikKLSAgICBoaWRsX3JldHZhbCA9IHByb3ZpZGVyXzJfMV8tPmVuZFNlc3Npb24oKTsKLSAgZWxzZQotICAgIGhpZGxfcmV0dmFsID0gcHJvdmlkZXJfLT5lbmRTZXNzaW9uKCk7Ci0KLSAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBmYWlsdXJlOiAiIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gICAgcmV0dXJuIC1FUFJPVE87Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2U6OkZsdXNoQXVkaW9EYXRhKCkgewotICBzaXplX3Qgc2l6ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICB1aW50OF90IHBfYnVmW3NpemVdOwotCi0gIGlmIChtRGF0YU1RLT5yZWFkKHBfYnVmLCBzaXplKSAhPSBzaXplKQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBmYWlsZWQgdG8gZmx1c2ggZGF0YSBxdWV1ZSEiOwotfQotCi1zaXplX3QgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlOjpSZWFkQXVkaW9EYXRhKHVpbnQ4X3QqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKCFJc1ZhbGlkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvSGFsIGlzIG5vdCB2YWxpZCI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKHBfYnVmID09IG51bGxwdHIgfHwgbGVuID09IDApIHJldHVybiAwOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChpbnRlcm5hbF9tdXRleF8pOwotCi0gIHNpemVfdCB0b3RhbF9yZWFkID0gMDsKLSAgaW50IHRpbWVvdXRfbXMgPSBrRGVmYXVsdERhdGFSZWFkVGltZW91dE1zOwotICBkbyB7Ci0gICAgaWYgKG1EYXRhTVEgPT0gbnVsbHB0ciB8fCAhbURhdGFNUS0+aXNWYWxpZCgpKSBicmVhazsKLQotICAgIHNpemVfdCBhdmFpbF90b19yZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7Ci0gICAgaWYgKGF2YWlsX3RvX3JlYWQpIHsKLSAgICAgIGlmIChhdmFpbF90b19yZWFkID4gbGVuIC0gdG90YWxfcmVhZCkgewotICAgICAgICBhdmFpbF90b19yZWFkID0gbGVuIC0gdG90YWxfcmVhZDsKLSAgICAgIH0KLSAgICAgIGlmIChtRGF0YU1RLT5yZWFkKHBfYnVmICsgdG90YWxfcmVhZCwgYXZhaWxfdG9fcmVhZCkgPT0gMCkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbGVuPSIgPDwgbGVuCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIHRvdGFsX3JlYWQ9IiA8PCB0b3RhbF9yZWFkIDw8ICIgZmFpbGVkIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB0b3RhbF9yZWFkICs9IGF2YWlsX3RvX3JlYWQ7Ci0gICAgfSBlbHNlIGlmICh0aW1lb3V0X21zID49IGtEZWZhdWx0RGF0YVJlYWRQb2xsSW50ZXJ2YWxNcykgewotICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAotICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoa0RlZmF1bHREYXRhUmVhZFBvbGxJbnRlcnZhbE1zKSk7Ci0gICAgICB0aW1lb3V0X21zIC09IGtEZWZhdWx0RGF0YVJlYWRQb2xsSW50ZXJ2YWxNczsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogIiA8PCAobGVuIC0gdG90YWxfcmVhZCkgPDwgIi8iIDw8IGxlbgotICAgICAgICAgICAgICAgICAgIDw8ICIgbm8gZGF0YSAiIDw8IChrRGVmYXVsdERhdGFSZWFkVGltZW91dE1zIC0gdGltZW91dF9tcykKLSAgICAgICAgICAgICAgICAgICA8PCAiIG1zIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAodG90YWxfcmVhZCA8IGxlbik7Ci0KLSAgaWYgKHRpbWVvdXRfbXMgPAotICAgICAgICAgIChrRGVmYXVsdERhdGFSZWFkVGltZW91dE1zIC0ga0RlZmF1bHREYXRhUmVhZFBvbGxJbnRlcnZhbE1zKSAmJgotICAgICAgdGltZW91dF9tcyA+PSBrRGVmYXVsdERhdGFSZWFkUG9sbEludGVydmFsTXMpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHVuZGVyZmxvdyAiIDw8IGxlbiA8PCAiIC0+ICIgPDwgdG90YWxfcmVhZAotICAgICAgICAgICAgPDwgIiByZWFkICIgPDwgKGtEZWZhdWx0RGF0YVJlYWRUaW1lb3V0TXMgLSB0aW1lb3V0X21zKSA8PCAiIG1zIjsKLSAgfSBlbHNlIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgbGVuIDw8ICIgLT4gIiA8PCB0b3RhbF9yZWFkIDw8ICIgcmVhZCI7Ci0gIH0KLQotICBzaW5rXy0+TG9nQnl0ZXNSZWFkKHRvdGFsX3JlYWQpOwotICByZXR1cm4gdG90YWxfcmVhZDsKLX0KLQotdm9pZCBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTo6UmVuZXdBdWRpb1Byb3ZpZGVyQW5kU2Vzc2lvbigpIHsKLSAgLy8gTk9URTogbXVzdCBiZSBpbnZva2VkIG9uIHRoZSBzYW1lIHRocmVhZCB3aGVyZSB0aGlzCi0gIC8vIEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlIGlzIHJ1bm5pbmcKLSAgaWYgKChIYWxWZXJzaW9uTWFuYWdlcjo6R2V0SGFsVmVyc2lvbigpID09Ci0gICAgICAgQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OXzJfMSkgJiYKLSAgICAgICh0cmFuc3BvcnRfLT5HZXRTZXNzaW9uVHlwZV8yXzEoKSAhPSBTZXNzaW9uVHlwZV8yXzE6OlVOS05PV04pKSB7Ci0gICAgRmV0Y2hBdWRpb1Byb3ZpZGVyXzJfMSgpOwotICB9IGVsc2UgaWYgKHRyYW5zcG9ydF8tPkdldFNlc3Npb25UeXBlKCkgIT0gU2Vzc2lvblR5cGU6OlVOS05PV04pIHsKLSAgICBGZXRjaEF1ZGlvUHJvdmlkZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICIsIGNhbm5vdCByZW5ldyBhdWRpbyBwcm92aWRlciI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHNlc3Npb25fc3RhcnRlZF8pIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogUmVzdGFydCB0aGUgc2Vzc2lvbiB3aGlsZSBhdWRpbyBIQUwgcmVjb3ZlcmluZyI7Ci0gICAgc2Vzc2lvbl9zdGFydGVkXyA9IGZhbHNlOwotCi0gICAgaWYgKHByb3ZpZGVyXzJfMV8gIT0gbnVsbHB0cikKLSAgICAgIFN0YXJ0U2Vzc2lvbl8yXzEoKTsKLSAgICBlbHNlCi0gICAgICBTdGFydFNlc3Npb24oKTsKLSAgfQotfQotCi1zaXplX3QgQmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2U6OldyaXRlQXVkaW9EYXRhKGNvbnN0IHVpbnQ4X3QqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHByb3ZpZGVyXyA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCbHVldG9vdGhBdWRpb0hhbCBudWxscHRyIjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAocF9idWYgPT0gbnVsbHB0ciB8fCBsZW4gPT0gMCkgcmV0dXJuIDA7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0KLSAgc2l6ZV90IHRvdGFsX3dyaXR0ZW4gPSAwOwotICBpbnQgdGltZW91dF9tcyA9IGtEZWZhdWx0RGF0YVdyaXRlVGltZW91dE1zOwotICBkbyB7Ci0gICAgaWYgKG1EYXRhTVEgPT0gbnVsbHB0ciB8fCAhbURhdGFNUS0+aXNWYWxpZCgpKSBicmVhazsKLQotICAgIHNpemVfdCBhdmFpbF90b193cml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICBpZiAoYXZhaWxfdG9fd3JpdGUpIHsKLSAgICAgIGlmIChhdmFpbF90b193cml0ZSA+IGxlbiAtIHRvdGFsX3dyaXR0ZW4pIHsKLSAgICAgICAgYXZhaWxfdG9fd3JpdGUgPSBsZW4gLSB0b3RhbF93cml0dGVuOwotICAgICAgfQotICAgICAgaWYgKG1EYXRhTVEtPndyaXRlKHBfYnVmICsgdG90YWxfd3JpdHRlbiwgYXZhaWxfdG9fd3JpdGUpID09IDApIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGxlbj0iIDw8IGxlbgotICAgICAgICAgICAgICAgICAgICAgPDwgIiB0b3RhbF93cml0dGVuPSIgPDwgdG90YWxfd3JpdHRlbiA8PCAiIGZhaWxlZCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgdG90YWxfd3JpdHRlbiArPSBhdmFpbF90b193cml0ZTsKLSAgICB9IGVsc2UgaWYgKHRpbWVvdXRfbXMgPj0ga0RlZmF1bHREYXRhV3JpdGVQb2xsSW50ZXJ2YWxNcykgewotICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAotICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoa0RlZmF1bHREYXRhV3JpdGVQb2xsSW50ZXJ2YWxNcykpOwotICAgICAgdGltZW91dF9tcyAtPSBrRGVmYXVsdERhdGFXcml0ZVBvbGxJbnRlcnZhbE1zOwotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IChsZW4gLSB0b3RhbF93cml0dGVuKSA8PCAiLyIgPDwgbGVuCi0gICAgICAgICAgICAgICAgICAgPDwgIiBubyBkYXRhICIgPDwgKGtEZWZhdWx0RGF0YVdyaXRlVGltZW91dE1zIC0gdGltZW91dF9tcykKLSAgICAgICAgICAgICAgICAgICA8PCAiIG1zIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAodG90YWxfd3JpdHRlbiA8IGxlbik7Ci0KLSAgaWYgKHRpbWVvdXRfbXMgPAotICAgICAgICAgIChrRGVmYXVsdERhdGFXcml0ZVRpbWVvdXRNcyAtIGtEZWZhdWx0RGF0YVdyaXRlUG9sbEludGVydmFsTXMpICYmCi0gICAgICB0aW1lb3V0X21zID49IGtEZWZhdWx0RGF0YVdyaXRlUG9sbEludGVydmFsTXMpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHVuZGVyZmxvdyAiIDw8IGxlbiA8PCAiIC0+ICIgPDwgdG90YWxfd3JpdHRlbgotICAgICAgICAgICAgPDwgIiByZWFkICIgPDwgKGtEZWZhdWx0RGF0YVdyaXRlVGltZW91dE1zIC0gdGltZW91dF9tcykgPDwgIiBtcyI7Ci0gIH0gZWxzZSB7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IGxlbiA8PCAiIC0+ICIgPDwgdG90YWxfd3JpdHRlbiA8PCAiIHdyaXR0ZW4iOwotICB9Ci0KLSAgc291cmNlXy0+TG9nQnl0ZXNXcml0dGVuKHRvdGFsX3dyaXR0ZW4pOwotICByZXR1cm4gdG90YWxfd3JpdHRlbjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL2NsaWVudF9pbnRlcmZhY2UuaCBiL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY2xpZW50X2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYxOGI5Li4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY2xpZW50X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoL2F1ZGlvLzIuMS9JQmx1ZXRvb3RoQXVkaW9Qcm92aWRlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoL2F1ZGlvLzIuMS90eXBlcy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLQotI2RlZmluZSBCTFVFVE9PVEhfQVVESU9fSEFMX1BST1BfRElTQUJMRUQgInBlcnNpc3QuYmx1ZXRvb3RoLmJsdWV0b290aF9hdWRpb19oYWwuZGlzYWJsZWQiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF1ZGlvIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6SUJsdWV0b290aEF1ZGlvUG9ydDsKLXVzaW5nIEF1ZGlvQ2FwYWJpbGl0aWVzID0KLSAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpBdWRpb0NhcGFiaWxpdGllczsKLXVzaW5nIEF1ZGlvQ2FwYWJpbGl0aWVzXzJfMSA9Ci0gICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMTo6QXVkaW9DYXBhYmlsaXRpZXM7Ci11c2luZyBBdWRpb0NvbmZpZ3VyYXRpb24gPQotICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkF1ZGlvQ29uZmlndXJhdGlvbjsKLXVzaW5nIEF1ZGlvQ29uZmlndXJhdGlvbl8yXzEgPQotICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OkF1ZGlvQ29uZmlndXJhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkJpdHNQZXJTYW1wbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpDaGFubmVsTW9kZTsKLXVzaW5nIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyID0KLSAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcjsKLXVzaW5nIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyXzJfMSA9Ci0gICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMTo6SUJsdWV0b290aEF1ZGlvUHJvdmlkZXI7Ci11c2luZyBQY21QYXJhbWV0ZXJzID0KLSAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpQY21QYXJhbWV0ZXJzOwotdXNpbmcgUGNtUGFyYW1ldGVyc18yXzEgPQotICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OlBjbVBhcmFtZXRlcnM7Ci11c2luZyBTYW1wbGVSYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U2FtcGxlUmF0ZTsKLXVzaW5nIFNhbXBsZVJhdGVfMl8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMTo6U2FtcGxlUmF0ZTsKLXVzaW5nIFNlc3Npb25UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U2Vzc2lvblR5cGU7Ci11c2luZyBTZXNzaW9uVHlwZV8yXzEgPQotICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzE6OlNlc3Npb25UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyBCbHVldG9vdGhBdWRpb1N0YXR1cyA9Ci0gICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U3RhdHVzOwotCi1lbnVtIGNsYXNzIEJsdWV0b290aEF1ZGlvQ3RybEFjayA6IHVpbnQ4X3QgewotICBTVUNDRVNTX0ZJTklTSEVEID0gMCwKLSAgUEVORElORywKLSAgRkFJTFVSRV9VTlNVUFBPUlRFRCwKLSAgRkFJTFVSRV9CVVNZLAotICBGQUlMVVJFX0RJU0NPTk5FQ1RJTkcsCi0gIEZBSUxVUkUKLX07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCbHVldG9vdGhBdWRpb0N0cmxBY2smIGFjayk7Ci0KLWlubGluZSBCbHVldG9vdGhBdWRpb1N0YXR1cyBCbHVldG9vdGhBdWRpb0N0cmxBY2tUb0hhbFN0YXR1cygKLSAgICBjb25zdCBCbHVldG9vdGhBdWRpb0N0cmxBY2smIGFjaykgewotICBzd2l0Y2ggKGFjaykgewotICAgIGNhc2UgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpTVUNDRVNTX0ZJTklTSEVEOgotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvU3RhdHVzOjpTVUNDRVNTOwotICAgIGNhc2UgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFX1VOU1VQUE9SVEVEOgotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvU3RhdHVzOjpVTlNVUFBPUlRFRF9DT0RFQ19DT05GSUdVUkFUSU9OOwotICAgIGNhc2UgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpQRU5ESU5HOgotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvU3RhdHVzOjpGQUlMVVJFOwotICAgIGNhc2UgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFX0JVU1k6Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9TdGF0dXM6OkZBSUxVUkU7Ci0gICAgY2FzZSBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OkZBSUxVUkVfRElTQ09OTkVDVElORzoKLSAgICAgIHJldHVybiBCbHVldG9vdGhBdWRpb1N0YXR1czo6RkFJTFVSRTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvU3RhdHVzOjpGQUlMVVJFOwotICB9Ci19Ci0KLS8vIEFuIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEJsdWV0b290aAotLy8gYXVkaW8gdHJhbnNwb3J0LCBzdWNoIGFzIEEyRFAgb3IgSGVhcmluZyBBaWQsIHRvIGhhbmRsZSBjYWxsYmFja3MgZnJvbSBBdWRpbwotLy8gSEFMLgotY2xhc3MgSUJsdWV0b290aFRyYW5zcG9ydEluc3RhbmNlIHsKLSBwdWJsaWM6Ci0gIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZShTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29uZmlndXJhdGlvbiBhdWRpb0NvbmZpZykKLSAgICAgIDogc2Vzc2lvbl90eXBlXyhzZXNzaW9uVHlwZSksCi0gICAgICAgIHNlc3Npb25fdHlwZV8yXzFfKFNlc3Npb25UeXBlXzJfMTo6VU5LTk9XTiksCi0gICAgICAgIGF1ZGlvX2NvbmZpZ18oc3RkOjptb3ZlKGF1ZGlvQ29uZmlnKSksCi0gICAgICAgIGF1ZGlvX2NvbmZpZ18yXzFfKHt9KXt9OwotICBJQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UoU2Vzc2lvblR5cGVfMl8xIHNlc3Npb25UeXBlXzJfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29uZmlndXJhdGlvbl8yXzEgYXVkaW9Db25maWdfMl8xKQotICAgICAgOiBzZXNzaW9uX3R5cGVfKFNlc3Npb25UeXBlOjpVTktOT1dOKSwKLSAgICAgICAgc2Vzc2lvbl90eXBlXzJfMV8oc2Vzc2lvblR5cGVfMl8xKSwKLSAgICAgICAgYXVkaW9fY29uZmlnXyh7fSksCi0gICAgICAgIGF1ZGlvX2NvbmZpZ18yXzFfKHN0ZDo6bW92ZShhdWRpb0NvbmZpZ18yXzEpKXt9OwotICB2aXJ0dWFsIH5JQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgU2Vzc2lvblR5cGUgR2V0U2Vzc2lvblR5cGUoKSBjb25zdCB7IHJldHVybiBzZXNzaW9uX3R5cGVfOyB9Ci0gIFNlc3Npb25UeXBlXzJfMSBHZXRTZXNzaW9uVHlwZV8yXzEoKSBjb25zdCB7IHJldHVybiBzZXNzaW9uX3R5cGVfMl8xXzsgfQotCi0gIEF1ZGlvQ29uZmlndXJhdGlvbiBHZXRBdWRpb0NvbmZpZ3VyYXRpb24oKSBjb25zdCB7IHJldHVybiBhdWRpb19jb25maWdfOyB9Ci0gIEF1ZGlvQ29uZmlndXJhdGlvbl8yXzEgR2V0QXVkaW9Db25maWd1cmF0aW9uXzJfMSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYXVkaW9fY29uZmlnXzJfMV87Ci0gIH0KLQotICB2b2lkIFVwZGF0ZUF1ZGlvQ29uZmlndXJhdGlvbihjb25zdCBBdWRpb0NvbmZpZ3VyYXRpb24mIGF1ZGlvX2NvbmZpZykgewotICAgIGF1ZGlvX2NvbmZpZ18gPSBhdWRpb19jb25maWc7Ci0gIH0KLSAgdm9pZCBVcGRhdGVBdWRpb0NvbmZpZ3VyYXRpb25fMl8xKAotICAgICAgY29uc3QgQXVkaW9Db25maWd1cmF0aW9uXzJfMSYgYXVkaW9fY29uZmlnXzJfMSkgewotICAgIGF1ZGlvX2NvbmZpZ18yXzFfID0gYXVkaW9fY29uZmlnXzJfMTsKLSAgfQotCi0gIHZpcnR1YWwgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrIFN0YXJ0UmVxdWVzdCgpID0gMDsKLQotICB2aXJ0dWFsIEJsdWV0b290aEF1ZGlvQ3RybEFjayBTdXNwZW5kUmVxdWVzdCgpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgU3RvcFJlcXVlc3QoKSA9IDA7Ci0KLSAgdmlydHVhbCBib29sIEdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90KiByZW1vdGVfZGVsYXlfcmVwb3J0X25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHRvdGFsX2J5dGVzX3JlYWRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjKiBkYXRhX3Bvc2l0aW9uKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE1ldGFkYXRhQ2hhbmdlZChjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCYgc291cmNlX21ldGFkYXRhKSA9IDA7Ci0KLSAgLy8gSW52b2tlZCB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgcmVxdWVzdGVkIHRvIHJlc2V0IHByZXNlbnRhdGlvbiBwb3NpdGlvbgotICB2aXJ0dWFsIHZvaWQgUmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpID0gMDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IFNlc3Npb25UeXBlIHNlc3Npb25fdHlwZV87Ci0gIGNvbnN0IFNlc3Npb25UeXBlXzJfMSBzZXNzaW9uX3R5cGVfMl8xXzsKLSAgQXVkaW9Db25maWd1cmF0aW9uIGF1ZGlvX2NvbmZpZ187Ci0gIEF1ZGlvQ29uZmlndXJhdGlvbl8yXzEgYXVkaW9fY29uZmlnXzJfMV87Ci19OwotCi0vLyBBbiBJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgQmx1ZXRvb3RoCi0vLyBhdWRpbyB0cmFuc3BvcnQsIHN1Y2ggYXMgQTJEUCwgSGVhcmluZyBBaWQgb3IgTGVBdWRpbywgdG8gaGFuZGxlIGNhbGxiYWNrcwotLy8gZnJvbSBBdWRpbyBIQUwuCi1jbGFzcyBJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlIDogcHVibGljIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZSB7Ci0gcHVibGljOgotICBJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlKFNlc3Npb25UeXBlXzJfMSBzZXNzaW9uVHlwZV8yXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Db25maWd1cmF0aW9uXzJfMSBhdWRpb0NvbmZpZ18yXzEpCi0gICAgICA6IElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZXtzZXNzaW9uVHlwZV8yXzEsIGF1ZGlvQ29uZmlnXzJfMX0ge30KLSAgSUJsdWV0b290aFNpbmtUcmFuc3BvcnRJbnN0YW5jZShTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbmZpZ3VyYXRpb24gYXVkaW9Db25maWcpCi0gICAgICA6IElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZXtzZXNzaW9uVHlwZSwgYXVkaW9Db25maWd9IHt9Ci0gIHZpcnR1YWwgfklCbHVldG9vdGhTaW5rVHJhbnNwb3J0SW5zdGFuY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gSW52b2tlZCB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgcmVxdWVzdGVkIHRvIGxvZyBieXRlcyByZWFkCi0gIHZpcnR1YWwgdm9pZCBMb2dCeXRlc1JlYWQoc2l6ZV90IGJ5dGVzX3JlYWRlZCkgPSAwOwotfTsKLQotY2xhc3MgSUJsdWV0b290aFNvdXJjZVRyYW5zcG9ydEluc3RhbmNlIDogcHVibGljIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZSB7Ci0gcHVibGljOgotICBJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2UoU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbmZpZ3VyYXRpb24gYXVkaW9Db25maWcpCi0gICAgICA6IElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZXtzZXNzaW9uVHlwZSwgYXVkaW9Db25maWd9IHt9Ci0gIElCbHVldG9vdGhTb3VyY2VUcmFuc3BvcnRJbnN0YW5jZShTZXNzaW9uVHlwZV8yXzEgc2Vzc2lvblR5cGVfMl8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Db25maWd1cmF0aW9uXzJfMSBhdWRpb0NvbmZpZ18yXzEpCi0gICAgICA6IElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZXtzZXNzaW9uVHlwZV8yXzEsIGF1ZGlvQ29uZmlnXzJfMX0ge30KLSAgdmlydHVhbCB+SUJsdWV0b290aFNvdXJjZVRyYW5zcG9ydEluc3RhbmNlKCkgPSBkZWZhdWx0OwotCi0gIC8vIEludm9rZWQgd2hlbiB0aGUgdHJhbnNwb3J0IGlzIHJlcXVlc3RlZCB0byBsb2cgYnl0ZXMgd3JpdHRlbgotICB2aXJ0dWFsIHZvaWQgTG9nQnl0ZXNXcml0dGVuKHNpemVfdCBieXRlc193cml0dGVuKSA9IDA7Ci19OwotCi0vLyBjb21tb24gb2JqZWN0IGlzIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBraW5kIG9mIFNlc3Npb25UeXBlCi1jbGFzcyBCbHVldG9vdGhBdWRpb0RlYXRoUmVjaXBpZW50OwotCi0vLyBUaGUgY2xpZW50IGludGVyZmFjZSBjb25uZWN0cyBhbiBJQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UgdG8KLS8vIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyIGFuZCBoZWxwcyB0byByb3V0ZSBjYWxsYmFja3MgdG8KLS8vIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZQotY2xhc3MgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2UoCi0gICAgICBhbmRyb2lkOjpzcDxCbHVldG9vdGhBdWRpb0RlYXRoUmVjaXBpZW50PiBkZWF0aF9yZWNpcGllbnQsCi0gICAgICBJQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UqIGluc3RhbmNlKTsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgYm9vbCBJc1ZhbGlkKCkgY29uc3QgewotICAgIHJldHVybiBwcm92aWRlcl8gIT0gbnVsbHB0ciB8fCBwcm92aWRlcl8yXzFfICE9IG51bGxwdHI7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxBdWRpb0NhcGFiaWxpdGllcz4gR2V0QXVkaW9DYXBhYmlsaXRpZXMoKSBjb25zdDsKLSAgc3RkOjp2ZWN0b3I8QXVkaW9DYXBhYmlsaXRpZXNfMl8xPiBHZXRBdWRpb0NhcGFiaWxpdGllc18yXzEoKSBjb25zdDsKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPEF1ZGlvQ2FwYWJpbGl0aWVzPiBHZXRBdWRpb0NhcGFiaWxpdGllcygKLSAgICAgIFNlc3Npb25UeXBlIHNlc3Npb25fdHlwZSk7Ci0gIHN0YXRpYyBzdGQ6OnZlY3RvcjxBdWRpb0NhcGFiaWxpdGllc18yXzE+IEdldEF1ZGlvQ2FwYWJpbGl0aWVzXzJfMSgKLSAgICAgIFNlc3Npb25UeXBlXzJfMSBzZXNzaW9uX3R5cGVfMl8xKTsKLQotICB2b2lkIFN0cmVhbVN0YXJ0ZWQoY29uc3QgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrJiBhY2spOwotCi0gIHZvaWQgU3RyZWFtU3VzcGVuZGVkKGNvbnN0IEJsdWV0b290aEF1ZGlvQ3RybEFjayYgYWNrKTsKLQotICBpbnQgU3RhcnRTZXNzaW9uKCk7Ci0gIGludCBTdGFydFNlc3Npb25fMl8xKCk7Ci0KLSAgLy8gUmVuZXcgdGhlIGNvbm5lY3Rpb24gYW5kIHVzdWFsbHkgaXMgdXNlZCB3aGVuIEhJREwgcmVzdGFydGVkCi0gIHZvaWQgUmVuZXdBdWRpb1Byb3ZpZGVyQW5kU2Vzc2lvbigpOwotCi0gIGludCBFbmRTZXNzaW9uKCk7Ci0KLSAgYm9vbCBVcGRhdGVBdWRpb0NvbmZpZyhjb25zdCBBdWRpb0NvbmZpZ3VyYXRpb24mIGF1ZGlvQ29uZmlnKTsKLSAgYm9vbCBVcGRhdGVBdWRpb0NvbmZpZ18yXzEoY29uc3QgQXVkaW9Db25maWd1cmF0aW9uXzJfMSYgYXVkaW9Db25maWdfMl8xKTsKLQotICB2b2lkIEZsdXNoQXVkaW9EYXRhKCk7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBQY21QYXJhbWV0ZXJzIGtJbnZhbGlkUGNtQ29uZmlndXJhdGlvbiA9IHsKLSAgICAgIC5zYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTo6UkFURV9VTktOT1dOLAotICAgICAgLmNoYW5uZWxNb2RlID0gQ2hhbm5lbE1vZGU6OlVOS05PV04sCi0gICAgICAuYml0c1BlclNhbXBsZSA9IEJpdHNQZXJTYW1wbGU6OkJJVFNfVU5LTk9XTn07Ci0KLSBwcm90ZWN0ZWQ6Ci0gIG11dGFibGUgc3RkOjptdXRleCBpbnRlcm5hbF9tdXRleF87Ci0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb25uZWN0IHRvIGFuIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyCi0gIHZvaWQgRmV0Y2hBdWRpb1Byb3ZpZGVyKCk7Ci0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb25uZWN0IHRvIGFuIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyIDIuMQotICB2b2lkIEZldGNoQXVkaW9Qcm92aWRlcl8yXzEoKTsKLQotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcj4gcHJvdmlkZXJfOwotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcl8yXzE+IHByb3ZpZGVyXzJfMV87Ci0gIGJvb2wgc2Vzc2lvbl9zdGFydGVkXzsKLSAgc3RkOjp1bmlxdWVfcHRyPDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTwKLSAgICAgIHVpbnQ4X3QsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+PgotICAgICAgbURhdGFNUTsKLSAgYW5kcm9pZDo6c3A8Qmx1ZXRvb3RoQXVkaW9EZWF0aFJlY2lwaWVudD4gZGVhdGhfcmVjaXBpZW50XzsKLQotIHByaXZhdGU6Ci0gIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZSogdHJhbnNwb3J0XzsKLSAgc3RkOjp2ZWN0b3I8QXVkaW9DYXBhYmlsaXRpZXM+IGNhcGFiaWxpdGllc187Ci0gIHN0ZDo6dmVjdG9yPEF1ZGlvQ2FwYWJpbGl0aWVzXzJfMT4gY2FwYWJpbGl0aWVzXzJfMV87Ci19OwotCi0vLyBUaGUgY2xpZW50IGludGVyZmFjZSBjb25uZWN0cyBhbiBJQmx1ZXRvb3RoVHJhbnNwb3J0SW5zdGFuY2UgdG8KLS8vIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyIGFuZCBoZWxwcyB0byByb3V0ZSBjYWxsYmFja3MgdG8KLS8vIElCbHVldG9vdGhUcmFuc3BvcnRJbnN0YW5jZQotY2xhc3MgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlIDogcHVibGljIEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHRvCi0gIC8vIEJsdWV0b290aEF1ZGlvIEhBTC4gfHNpbmt8IGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHRyYW5zcG9ydCwgYW5kCi0gIC8vIHxtZXNzYWdlX2xvb3B8IGlzIHRoZSB0aHJlYWQgd2hlcmUgY2FsbGJhY2tzIGFyZSBpbnZva2VkLgotICBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UoCi0gICAgICBJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlKiBzaW5rLAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApOwotICB2aXJ0dWFsIH5CbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UoKTsKLQotICBJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlKiBHZXRUcmFuc3BvcnRJbnN0YW5jZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2lua187Ci0gIH0KLQotICAvLyBSZWFkIGRhdGEgZnJvbSBhdWRpbyAgSEFMIHRocm91Z2ggZm1xCi0gIHNpemVfdCBSZWFkQXVkaW9EYXRhKHVpbnQ4X3QqIHBfYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gcHJpdmF0ZToKLSAgSUJsdWV0b290aFNpbmtUcmFuc3BvcnRJbnN0YW5jZSogc2lua187Ci19OwotCi1jbGFzcyBCbHVldG9vdGhBdWRpb1NvdXJjZUNsaWVudEludGVyZmFjZQotICAgIDogcHVibGljIEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gQmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgdG8KLSAgLy8gQmx1ZXRvb3RoQXVkaW8gSEFMLiB8c291cmNlfCBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB0cmFuc3BvcnQsIGFuZAotICAvLyB8bWVzc2FnZV9sb29wfCBpcyB0aGUgdGhyZWFkIHdoZXJlIGNhbGxiYWNrcyBhcmUgaW52b2tlZC4KLSAgQmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2UoCi0gICAgICBJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2UqIHNvdXJjZSwKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wKTsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2UoKTsKLQotICAvLyBXcml0ZSBkYXRhIHRvIGF1ZGlvIEhBTCB0aHJvdWdoIGZtcQotICBzaXplX3QgV3JpdGVBdWRpb0RhdGEoY29uc3QgdWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbik7Ci0KLSBwcml2YXRlOgotICBJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2UqIHNvdXJjZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY2xpZW50X2ludGVyZmFjZV91bml0dGVzdC5jYyBiL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY2xpZW50X2ludGVyZmFjZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5NTRjNy4uMDAwMDAwMAotLS0gYS9hdWRpb19oYWxfaW50ZXJmYWNlL2NsaWVudF9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvZGVjX3N0YXR1cy5oIgotCi1uYW1lc3BhY2UgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpBYWNPYmplY3RUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6QWFjUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkFhY1ZhcmlhYmxlQml0UmF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkFwdHhQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Q29kZWNDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpDb2RlY1R5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpMZGFjQ2hhbm5lbE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpMZGFjUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkxkYWNRdWFsaXR5SW5kZXg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpTYmNBbGxvY01ldGhvZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OlNiY0Jsb2NrTGVuZ3RoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U2JjQ2hhbm5lbE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpTYmNOdW1TdWJiYW5kczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OlNiY1BhcmFtZXRlcnM7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6QXVkaW9DYXBhYmlsaXRpZXM7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OkF1ZGlvQ2FwYWJpbGl0aWVzXzJfMTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6QXVkaW9Db25maWd1cmF0aW9uOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpBdWRpb0NvbmZpZ3VyYXRpb25fMl8xOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb1NvdXJjZUNsaWVudEludGVyZmFjZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9TdGF0dXM7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlBjbVBhcmFtZXRlcnM7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlBjbVBhcmFtZXRlcnNfMl8xOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpTYW1wbGVSYXRlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpTYW1wbGVSYXRlXzJfMTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6U2Vzc2lvblR5cGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlNlc3Npb25UeXBlXzJfMTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Y29kZWM6OkEyZHBDb2RlY1RvSGFsQml0c1BlclNhbXBsZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Y29kZWM6OkEyZHBDb2RlY1RvSGFsQ2hhbm5lbE1vZGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpCaXRzUGVyU2FtcGxlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpjb2RlYzo6Q2hhbm5lbE1vZGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpDb2RlY0NvbmZpZ3VyYXRpb247Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpJc0NvZGVjT2ZmbG9hZGluZ0VuYWJsZWQ7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmNvZGVjOjpVcGRhdGVPZmZsb2FkaW5nQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwotCi1zdHJ1Y3QgU2FtcGxlUmF0ZVBhaXIgewotICBTYW1wbGVSYXRlIGhhbF9zYW1wbGVfcmF0ZV87Ci0gIGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGJ0YXZfc2FtcGxlX3JhdGVfOwotfTsKLWNvbnN0ZXhwciBTYW1wbGVSYXRlUGFpciBrU2FtcGxlUmF0ZVBhaXJzWzldID0gewotICAgIHsuaGFsX3NhbXBsZV9yYXRlXyA9IFNhbXBsZVJhdGU6OlJBVEVfVU5LTk9XTiwKLSAgICAgLmJ0YXZfc2FtcGxlX3JhdGVfID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkV9LAotICAgIHsuaGFsX3NhbXBsZV9yYXRlXyA9IFNhbXBsZVJhdGU6OlJBVEVfNDQxMDAsCi0gICAgIC5idGF2X3NhbXBsZV9yYXRlXyA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMH0sCi0gICAgey5oYWxfc2FtcGxlX3JhdGVfID0gU2FtcGxlUmF0ZTo6UkFURV80ODAwMCwKLSAgICAgLmJ0YXZfc2FtcGxlX3JhdGVfID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwfSwKLSAgICB7LmhhbF9zYW1wbGVfcmF0ZV8gPSBTYW1wbGVSYXRlOjpSQVRFXzg4MjAwLAotICAgICAuYnRhdl9zYW1wbGVfcmF0ZV8gPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDB9LAotICAgIHsuaGFsX3NhbXBsZV9yYXRlXyA9IFNhbXBsZVJhdGU6OlJBVEVfOTYwMDAsCi0gICAgIC5idGF2X3NhbXBsZV9yYXRlXyA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMH0sCi0gICAgey5oYWxfc2FtcGxlX3JhdGVfID0gU2FtcGxlUmF0ZTo6UkFURV8xNzY0MDAsCi0gICAgIC5idGF2X3NhbXBsZV9yYXRlXyA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDB9LAotICAgIHsuaGFsX3NhbXBsZV9yYXRlXyA9IFNhbXBsZVJhdGU6OlJBVEVfMTkyMDAwLAotICAgICAuYnRhdl9zYW1wbGVfcmF0ZV8gPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwfSwKLSAgICB7LmhhbF9zYW1wbGVfcmF0ZV8gPSBTYW1wbGVSYXRlOjpSQVRFXzE2MDAwLAotICAgICAuYnRhdl9zYW1wbGVfcmF0ZV8gPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDB9LAotICAgIHsuaGFsX3NhbXBsZV9yYXRlXyA9IFNhbXBsZVJhdGU6OlJBVEVfMjQwMDAsCi0gICAgIC5idGF2X3NhbXBsZV9yYXRlXyA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMH19OwotCi1jb25zdGV4cHIgU2FtcGxlUmF0ZV8yXzEga1NhbXBsZVJhdGVzXzJfMVtdID0gewotICAgIFNhbXBsZVJhdGVfMl8xOjpSQVRFX1VOS05PV04sIFNhbXBsZVJhdGVfMl8xOjpSQVRFXzgwMDAsCi0gICAgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMTYwMDAsICAgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMjQwMDAsCi0gICAgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMzIwMDAsICAgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfNDQxMDAsCi0gICAgU2FtcGxlUmF0ZV8yXzE6OlJBVEVfNDgwMDB9OwotCi1jb25zdGV4cHIgdWludDMyX3Qga0RhdGFJbnRlcnZhbFVzW10gPSB7MCAvKiBJbnZhbGlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwIC8qIFZhbGlkIDEwbXMgKi99OwotCi1zdHJ1Y3QgQml0c1BlclNhbXBsZVBhaXIgewotICBCaXRzUGVyU2FtcGxlIGhhbF9iaXRzX3Blcl9zYW1wbGVfOwotICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgYnRhdl9iaXRzX3Blcl9zYW1wbGVfOwotfTsKLWNvbnN0ZXhwciBCaXRzUGVyU2FtcGxlUGFpciBrQml0c1BlclNhbXBsZVBhaXJzWzRdID0gewotICAgIHsuaGFsX2JpdHNfcGVyX3NhbXBsZV8gPSBCaXRzUGVyU2FtcGxlOjpCSVRTX1VOS05PV04sCi0gICAgIC5idGF2X2JpdHNfcGVyX3NhbXBsZV8gPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkV9LAotICAgIHsuaGFsX2JpdHNfcGVyX3NhbXBsZV8gPSBCaXRzUGVyU2FtcGxlOjpCSVRTXzE2LAotICAgICAuYnRhdl9iaXRzX3Blcl9zYW1wbGVfID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNn0sCi0gICAgey5oYWxfYml0c19wZXJfc2FtcGxlXyA9IEJpdHNQZXJTYW1wbGU6OkJJVFNfMjQsCi0gICAgIC5idGF2X2JpdHNfcGVyX3NhbXBsZV8gPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0fSwKLSAgICB7LmhhbF9iaXRzX3Blcl9zYW1wbGVfID0gQml0c1BlclNhbXBsZTo6QklUU18zMiwKLSAgICAgLmJ0YXZfYml0c19wZXJfc2FtcGxlXyA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzJ9fTsKLQotc3RydWN0IENoYW5uZWxNb2RlUGFpciB7Ci0gIENoYW5uZWxNb2RlIGhhbF9jaGFubmVsX21vZGVfOwotICBidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QgYnRhdl9jaGFubmVsX21vZGVfOwotfTsKLWNvbnN0ZXhwciBDaGFubmVsTW9kZVBhaXIga0NoYW5uZWxNb2RlUGFpcnNbM10gPSB7Ci0gICAgey5oYWxfY2hhbm5lbF9tb2RlXyA9IENoYW5uZWxNb2RlOjpVTktOT1dOLAotICAgICAuYnRhdl9jaGFubmVsX21vZGVfID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FfSwKLSAgICB7LmhhbF9jaGFubmVsX21vZGVfID0gQ2hhbm5lbE1vZGU6Ok1PTk8sCi0gICAgIC5idGF2X2NoYW5uZWxfbW9kZV8gPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk99LAotICAgIHsuaGFsX2NoYW5uZWxfbW9kZV8gPSBDaGFubmVsTW9kZTo6U1RFUkVPLAotICAgICAuYnRhdl9jaGFubmVsX21vZGVfID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU99fTsKLQotY29uc3RleHByIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4ZXNbXSA9IHsKLSAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQywgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDLAotICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWCwgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hELAotICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTERBQywgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDLAotICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQywgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfTERBQ307Ci1jb25zdGV4cHIgdWludDE2X3Qga1BlZXJNdHVzWzVdID0gezY2MCwgNjYzLCA4ODMsIDEwMDUsIDE1MDB9OwotCi1jbGFzcyBUZXN0U2lua1RyYW5zcG9ydAotICAgIDogcHVibGljIGJsdWV0b290aDo6YXVkaW86OklCbHVldG9vdGhTaW5rVHJhbnNwb3J0SW5zdGFuY2UgewotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1JlbW90ZURlbGF5UmVwb3J0TXMgPSAyMDA7Ci0KLSBwdWJsaWM6Ci0gIFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlIHNlc3Npb25fdHlwZSkKLSAgICAgIDogYmx1ZXRvb3RoOjphdWRpbzo6SUJsdWV0b290aFNpbmtUcmFuc3BvcnRJbnN0YW5jZShzZXNzaW9uX3R5cGUsIHt9KXt9OwotICBUZXN0U2lua1RyYW5zcG9ydChTZXNzaW9uVHlwZV8yXzEgc2Vzc2lvbl90eXBlXzJfMSkKLSAgICAgIDogYmx1ZXRvb3RoOjphdWRpbzo6SUJsdWV0b290aFNpbmtUcmFuc3BvcnRJbnN0YW5jZShzZXNzaW9uX3R5cGVfMl8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KXt9OwotICBibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb0N0cmxBY2sgU3RhcnRSZXF1ZXN0KCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlNVQ0NFU1NfRklOSVNIRUQ7Ci0gIH0KLSAgYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9DdHJsQWNrIFN1c3BlbmRSZXF1ZXN0KCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlNVQ0NFU1NfRklOSVNIRUQ7Ci0gIH0KLSAgdm9pZCBTdG9wUmVxdWVzdCgpIG92ZXJyaWRlIHt9Ci0gIGJvb2wgR2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QqIHJlbW90ZV9kZWxheV9yZXBvcnRfbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHRvdGFsX2J5dGVzX3JlYWRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3BlYyogZGF0YV9wb3NpdGlvbikgb3ZlcnJpZGUgewotICAgIGlmIChyZW1vdGVfZGVsYXlfcmVwb3J0X25zKSB7Ci0gICAgICAqcmVtb3RlX2RlbGF5X3JlcG9ydF9ucyA9IGtSZW1vdGVEZWxheVJlcG9ydE1zICogMTAwMDAwMDsKLSAgICB9Ci0gICAgaWYgKHRvdGFsX2J5dGVzX3JlYWRlZCkgewotICAgICAgKnRvdGFsX2J5dGVzX3JlYWRlZCA9IDA7Ci0gICAgfQotICAgIGlmIChkYXRhX3Bvc2l0aW9uKSB7Ci0gICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgZGF0YV9wb3NpdGlvbik7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHZvaWQgTWV0YWRhdGFDaGFuZ2VkKAotICAgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QmIHNvdXJjZV9tZXRhZGF0YSBfX3VudXNlZCkgb3ZlcnJpZGUge30KLSAgdm9pZCBSZXNldFByZXNlbnRhdGlvblBvc2l0aW9uKCkgb3ZlcnJpZGV7fTsKLSAgdm9pZCBMb2dCeXRlc1JlYWQoc2l6ZV90IGJ5dGVzX3JlYWRlZCBfX3VudXNlZCkgb3ZlcnJpZGV7fTsKLX07Ci0KLWNsYXNzIFRlc3RTb3VyY2VUcmFuc3BvcnQKLSAgICA6IHB1YmxpYyBibHVldG9vdGg6OmF1ZGlvOjpJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2UgewotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1JlbW90ZURlbGF5UmVwb3J0TXMgPSAyMDA7Ci0KLSBwdWJsaWM6Ci0gIFRlc3RTb3VyY2VUcmFuc3BvcnQoU2Vzc2lvblR5cGUgc2Vzc2lvbl90eXBlKQotICAgICAgOiBibHVldG9vdGg6OmF1ZGlvOjpJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2Uoc2Vzc2lvbl90eXBlLCB7fSl7fTsKLSAgVGVzdFNvdXJjZVRyYW5zcG9ydChTZXNzaW9uVHlwZV8yXzEgc2Vzc2lvbl90eXBlXzJfMSkKLSAgICAgIDogYmx1ZXRvb3RoOjphdWRpbzo6SUJsdWV0b290aFNvdXJjZVRyYW5zcG9ydEluc3RhbmNlKHNlc3Npb25fdHlwZV8yXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSl7fTsKLSAgYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9DdHJsQWNrIFN0YXJ0UmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpTVUNDRVNTX0ZJTklTSEVEOwotICB9Ci0gIGJsdWV0b290aDo6YXVkaW86OkJsdWV0b290aEF1ZGlvQ3RybEFjayBTdXNwZW5kUmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpTVUNDRVNTX0ZJTklTSEVEOwotICB9Ci0gIHZvaWQgU3RvcFJlcXVlc3QoKSBvdmVycmlkZSB7fQotICBib29sIEdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90KiByZW1vdGVfZGVsYXlfcmVwb3J0X25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB0b3RhbF9ieXRlc193cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjKiBkYXRhX3Bvc2l0aW9uKSBvdmVycmlkZSB7Ci0gICAgaWYgKHJlbW90ZV9kZWxheV9yZXBvcnRfbnMpIHsKLSAgICAgICpyZW1vdGVfZGVsYXlfcmVwb3J0X25zID0ga1JlbW90ZURlbGF5UmVwb3J0TXMgKiAxMDAwMDAwOwotICAgIH0KLSAgICBpZiAodG90YWxfYnl0ZXNfd3JpdHRlbikgewotICAgICAgKnRvdGFsX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgIH0KLSAgICBpZiAoZGF0YV9wb3NpdGlvbikgewotICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIGRhdGFfcG9zaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2b2lkIE1ldGFkYXRhQ2hhbmdlZCgKLSAgICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90JiBzb3VyY2VfbWV0YWRhdGEgX191bnVzZWQpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgUmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpIG92ZXJyaWRle307Ci0gIHZvaWQgTG9nQnl0ZXNXcml0dGVuKHNpemVfdCBieXRlc193cml0dGVuIF9fdW51c2VkKSBvdmVycmlkZXt9OwotfTsKLQotY2xhc3MgQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2VUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgVGVzdFNpbmtUcmFuc3BvcnQqIHRlc3Rfc2lua190cmFuc3BvcnRfID0gbnVsbHB0cjsKLSAgVGVzdFNvdXJjZVRyYW5zcG9ydCogdGVzdF9zb3VyY2VfdHJhbnNwb3J0XyA9IG51bGxwdHI7Ci0gIEJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSogY2xpZW50aWZfc2lua18gPSBudWxscHRyOwotICBCbHVldG9vdGhBdWRpb1NvdXJjZUNsaWVudEludGVyZmFjZSogY2xpZW50aWZfc291cmNlXyA9IG51bGxwdHI7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0NsaWVudElmUmV0dXJuU3VjY2VzcyA9IDA7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBpZiAoY2xpZW50aWZfc2lua18gIT0gbnVsbHB0cikgZGVsZXRlIGNsaWVudGlmX3NpbmtfOwotICAgIGNsaWVudGlmX3NpbmtfID0gbnVsbHB0cjsKLSAgICBpZiAodGVzdF9zaW5rX3RyYW5zcG9ydF8gIT0gbnVsbHB0cikgZGVsZXRlIHRlc3Rfc2lua190cmFuc3BvcnRfOwotICAgIHRlc3Rfc2lua190cmFuc3BvcnRfID0gbnVsbHB0cjsKLQotICAgIGlmIChjbGllbnRpZl9zb3VyY2VfICE9IG51bGxwdHIpIGRlbGV0ZSBjbGllbnRpZl9zb3VyY2VfOwotICAgIGNsaWVudGlmX3NvdXJjZV8gPSBudWxscHRyOwotICAgIGlmICh0ZXN0X3NvdXJjZV90cmFuc3BvcnRfICE9IG51bGxwdHIpIGRlbGV0ZSB0ZXN0X3NvdXJjZV90cmFuc3BvcnRfOwotICAgIHRlc3Rfc291cmNlX3RyYW5zcG9ydF8gPSBudWxscHRyOwotICB9Ci0KLSAgYm9vbCBJc1NvZnR3YXJlUGNtUGFyYW1ldGVyc1N1cHBvcnRlZChjb25zdCBQY21QYXJhbWV0ZXJzJiBwY21fY29uZmlnKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9DYXBhYmlsaXRpZXM+JiBjYXBhYmlsaXRpZXMgPQotICAgICAgICBjbGllbnRpZl9zaW5rXy0+R2V0QXVkaW9DYXBhYmlsaXRpZXMoKTsKLSAgICBQY21QYXJhbWV0ZXJzIHBjbV9jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNbMF0ucGNtQ2FwYWJpbGl0aWVzKCk7Ci0gICAgYm9vbCBpc19wY21fY29uZmlnX3ZhbGlkID0KLSAgICAgICAgKHBjbV9jb25maWcuc2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlOjpSQVRFX1VOS05PV04gJiYKLSAgICAgICAgIHBjbV9jb25maWcuYml0c1BlclNhbXBsZSAhPSBCaXRzUGVyU2FtcGxlOjpCSVRTX1VOS05PV04gJiYKLSAgICAgICAgIHBjbV9jb25maWcuY2hhbm5lbE1vZGUgIT0gQ2hhbm5lbE1vZGU6OlVOS05PV04pOwotICAgIGJvb2wgaXNfcGNtX2NvbmZpZ19zdXBwb3J0ZWQgPQotICAgICAgICAocGNtX2NvbmZpZy5zYW1wbGVSYXRlICYgcGNtX2NhcGFiaWxpdGllcy5zYW1wbGVSYXRlICYmCi0gICAgICAgICBwY21fY29uZmlnLmJpdHNQZXJTYW1wbGUgJiBwY21fY2FwYWJpbGl0aWVzLmJpdHNQZXJTYW1wbGUgJiYKLSAgICAgICAgIHBjbV9jb25maWcuY2hhbm5lbE1vZGUgJiBwY21fY2FwYWJpbGl0aWVzLmNoYW5uZWxNb2RlKTsKLSAgICByZXR1cm4gKGlzX3BjbV9jb25maWdfdmFsaWQgJiYgaXNfcGNtX2NvbmZpZ19zdXBwb3J0ZWQpOwotICB9Ci0KLSAgYm9vbCBJc1NpbmtTb2Z0d2FyZVBjbVBhcmFtZXRlcnNfMl8xX1N1cHBvcnRlZCgKLSAgICAgIGNvbnN0IFBjbVBhcmFtZXRlcnNfMl8xJiBwY21fY29uZmlnKSB7Ci0gICAgcmV0dXJuIElzU29mdHdhcmVQY21QYXJhbWV0ZXJzXzJfMV9TdXBwb3J0ZWQocGNtX2NvbmZpZywgY2xpZW50aWZfc2lua18pOwotICB9Ci0KLSAgYm9vbCBJc1NvdXJjZVNvZnR3YXJlUGNtUGFyYW1ldGVyc18yXzFfU3VwcG9ydGVkKAotICAgICAgY29uc3QgUGNtUGFyYW1ldGVyc18yXzEmIHBjbV9jb25maWcpIHsKLSAgICByZXR1cm4gSXNTb2Z0d2FyZVBjbVBhcmFtZXRlcnNfMl8xX1N1cHBvcnRlZChwY21fY29uZmlnLCBjbGllbnRpZl9zb3VyY2VfKTsKLSAgfQotCi0gIGJvb2wgSXNDb2RlY09mZmxvYWRpbmdTdXBwb3J0ZWQoY29uc3QgQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY19jb25maWcpIHsKLSAgICBDb2RlY0NhcGFiaWxpdGllcyBjb2RlY19jYXBhYmlsaXR5ID0ge307Ci0gICAgZm9yIChhdXRvIGF1ZGlvX2NhcGFiaWxpdHkgOiBjbGllbnRpZl9zaW5rXy0+R2V0QXVkaW9DYXBhYmlsaXRpZXMoKSkgewotICAgICAgaWYgKGF1ZGlvX2NhcGFiaWxpdHkuY29kZWNDYXBhYmlsaXRpZXMoKS5jb2RlY1R5cGUgPT0KLSAgICAgICAgICBjb2RlY19jb25maWcuY29kZWNUeXBlKSB7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHkgPSBhdWRpb19jYXBhYmlsaXR5LmNvZGVjQ2FwYWJpbGl0aWVzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChjb2RlY19jYXBhYmlsaXR5LmNvZGVjVHlwZSAhPSBjb2RlY19jb25maWcuY29kZWNUeXBlKSB7Ci0gICAgICAvLyBjb2RlYyBpcyB1bnN1cHBvcnRlZAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBib29sIGlzX2NvZGVjX2NvbmZpZ19zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICBzd2l0Y2ggKGNvZGVjX2NvbmZpZy5jb2RlY1R5cGUpIHsKLSAgICAgIGNhc2UgQ29kZWNUeXBlOjpTQkM6IHsKLSAgICAgICAgU2JjUGFyYW1ldGVycyBzYmNfY29uZmlnID0gY29kZWNfY29uZmlnLmNvbmZpZy5zYmNDb25maWcoKTsKLSAgICAgICAgU2JjUGFyYW1ldGVycyBzYmNfY2FwYWJpbGl0eSA9Ci0gICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5LmNhcGFiaWxpdGllcy5zYmNDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgaXNfY29kZWNfY29uZmlnX3N1cHBvcnRlZCA9Ci0gICAgICAgICAgICAoc2JjX2NvbmZpZy5zYW1wbGVSYXRlICYgc2JjX2NhcGFiaWxpdHkuc2FtcGxlUmF0ZSAmJgotICAgICAgICAgICAgIHNiY19jb25maWcuY2hhbm5lbE1vZGUgJiBzYmNfY2FwYWJpbGl0eS5jaGFubmVsTW9kZSAmJgotICAgICAgICAgICAgIHNiY19jb25maWcuYmxvY2tMZW5ndGggJiBzYmNfY2FwYWJpbGl0eS5ibG9ja0xlbmd0aCAmJgotICAgICAgICAgICAgIHNiY19jb25maWcubnVtU3ViYmFuZHMgJiBzYmNfY2FwYWJpbGl0eS5udW1TdWJiYW5kcyAmJgotICAgICAgICAgICAgIHNiY19jb25maWcuYWxsb2NNZXRob2QgJiBzYmNfY2FwYWJpbGl0eS5hbGxvY01ldGhvZCAmJgotICAgICAgICAgICAgIHNiY19jb25maWcuYml0c1BlclNhbXBsZSAmIHNiY19jYXBhYmlsaXR5LmJpdHNQZXJTYW1wbGUgJiYKLSAgICAgICAgICAgICAoc2JjX2NhcGFiaWxpdHkubWluQml0cG9vbCA8PSBzYmNfY29uZmlnLm1pbkJpdHBvb2wgJiYKLSAgICAgICAgICAgICAgc2JjX2NvbmZpZy5taW5CaXRwb29sIDw9IHNiY19jb25maWcubWF4Qml0cG9vbCAmJgotICAgICAgICAgICAgICBzYmNfY29uZmlnLm1heEJpdHBvb2wgPD0gc2JjX2NhcGFiaWxpdHkubWF4Qml0cG9vbCkpOwotICAgICAgICByZXR1cm4gaXNfY29kZWNfY29uZmlnX3N1cHBvcnRlZDsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ29kZWNUeXBlOjpBQUM6IHsKLSAgICAgICAgQWFjUGFyYW1ldGVycyBhYWNfY29uZmlnID0gY29kZWNfY29uZmlnLmNvbmZpZy5hYWNDb25maWcoKTsKLSAgICAgICAgQWFjUGFyYW1ldGVycyBhYWNfY2FwYWJpbGl0eSA9Ci0gICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5LmNhcGFiaWxpdGllcy5hYWNDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgaXNfY29kZWNfY29uZmlnX3N1cHBvcnRlZCA9Ci0gICAgICAgICAgICAoYWFjX2NvbmZpZy5vYmplY3RUeXBlICYgYWFjX2NhcGFiaWxpdHkub2JqZWN0VHlwZSAmJgotICAgICAgICAgICAgIGFhY19jb25maWcuc2FtcGxlUmF0ZSAmIGFhY19jYXBhYmlsaXR5LnNhbXBsZVJhdGUgJiYKLSAgICAgICAgICAgICBhYWNfY29uZmlnLmNoYW5uZWxNb2RlICYgYWFjX2NhcGFiaWxpdHkuY2hhbm5lbE1vZGUgJiYKLSAgICAgICAgICAgICAoYWFjX2NvbmZpZy52YXJpYWJsZUJpdFJhdGVFbmFibGVkID09Ci0gICAgICAgICAgICAgICAgICBBYWNWYXJpYWJsZUJpdFJhdGU6OkRJU0FCTEVEIHx8Ci0gICAgICAgICAgICAgIGFhY19jYXBhYmlsaXR5LnZhcmlhYmxlQml0UmF0ZUVuYWJsZWQgPT0KLSAgICAgICAgICAgICAgICAgIEFhY1ZhcmlhYmxlQml0UmF0ZTo6RU5BQkxFRCkgJiYKLSAgICAgICAgICAgICBhYWNfY29uZmlnLmJpdHNQZXJTYW1wbGUgJiBhYWNfY2FwYWJpbGl0eS5iaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgcmV0dXJuIGlzX2NvZGVjX2NvbmZpZ19zdXBwb3J0ZWQ7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvZGVjVHlwZTo6TERBQzogewotICAgICAgICBMZGFjUGFyYW1ldGVycyBsZGFjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZy5jb25maWcubGRhY0NvbmZpZygpOwotICAgICAgICBMZGFjUGFyYW1ldGVycyBsZGFjX2NhcGFiaWxpdHkgPQotICAgICAgICAgICAgY29kZWNfY2FwYWJpbGl0eS5jYXBhYmlsaXRpZXMubGRhY0NhcGFiaWxpdGllcygpOwotICAgICAgICBpc19jb2RlY19jb25maWdfc3VwcG9ydGVkID0KLSAgICAgICAgICAgIChsZGFjX2NvbmZpZy5zYW1wbGVSYXRlICYgbGRhY19jYXBhYmlsaXR5LnNhbXBsZVJhdGUgJiYKLSAgICAgICAgICAgICBsZGFjX2NvbmZpZy5jaGFubmVsTW9kZSAmIGxkYWNfY2FwYWJpbGl0eS5jaGFubmVsTW9kZSAmJgotICAgICAgICAgICAgIGxkYWNfY29uZmlnLmJpdHNQZXJTYW1wbGUgJiBsZGFjX2NhcGFiaWxpdHkuYml0c1BlclNhbXBsZSk7Ci0gICAgICAgIHJldHVybiBpc19jb2RlY19jb25maWdfc3VwcG9ydGVkOwotICAgICAgfQotICAgICAgY2FzZSBDb2RlY1R5cGU6OkFQVFg6Ci0gICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgIGNhc2UgQ29kZWNUeXBlOjpBUFRYX0hEOiB7Ci0gICAgICAgIEFwdHhQYXJhbWV0ZXJzIGFwdHhfY29uZmlnID0gY29kZWNfY29uZmlnLmNvbmZpZy5hcHR4Q29uZmlnKCk7Ci0gICAgICAgIEFwdHhQYXJhbWV0ZXJzIGFwdHhfY2FwYWJpbGl0eSA9Ci0gICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5LmNhcGFiaWxpdGllcy5hcHR4Q2FwYWJpbGl0aWVzKCk7Ci0gICAgICAgIGlzX2NvZGVjX2NvbmZpZ19zdXBwb3J0ZWQgPQotICAgICAgICAgICAgKGFwdHhfY29uZmlnLnNhbXBsZVJhdGUgJiBhcHR4X2NhcGFiaWxpdHkuc2FtcGxlUmF0ZSAmJgotICAgICAgICAgICAgIGFwdHhfY29uZmlnLmNoYW5uZWxNb2RlICYgYXB0eF9jYXBhYmlsaXR5LmNoYW5uZWxNb2RlICYmCi0gICAgICAgICAgICAgYXB0eF9jb25maWcuYml0c1BlclNhbXBsZSAmIGFwdHhfY2FwYWJpbGl0eS5iaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgcmV0dXJuIGlzX2NvZGVjX2NvbmZpZ19zdXBwb3J0ZWQ7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvZGVjVHlwZTo6VU5LTk9XTjoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCBJc1NvZnR3YXJlUGNtUGFyYW1ldGVyc18yXzFfU3VwcG9ydGVkKAotICAgICAgY29uc3QgUGNtUGFyYW1ldGVyc18yXzEmIHBjbV9jb25maWcsCi0gICAgICBjb25zdCBCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZSogY2xpZW50aWZfKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9DYXBhYmlsaXRpZXNfMl8xPiYgY2FwYWJpbGl0aWVzID0KLSAgICAgICAgY2xpZW50aWZfLT5HZXRBdWRpb0NhcGFiaWxpdGllc18yXzEoKTsKLSAgICBQY21QYXJhbWV0ZXJzXzJfMSBwY21fY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzWzBdLnBjbUNhcGFiaWxpdGllcygpOwotICAgIGJvb2wgaXNfcGNtX2NvbmZpZ192YWxpZCA9Ci0gICAgICAgIChwY21fY29uZmlnLnNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZV8yXzE6OlJBVEVfVU5LTk9XTiAmJgotICAgICAgICAgcGNtX2NvbmZpZy5iaXRzUGVyU2FtcGxlICE9IEJpdHNQZXJTYW1wbGU6OkJJVFNfVU5LTk9XTiAmJgotICAgICAgICAgcGNtX2NvbmZpZy5jaGFubmVsTW9kZSAhPSBDaGFubmVsTW9kZTo6VU5LTk9XTiAmJgotICAgICAgICAgcGNtX2NvbmZpZy5kYXRhSW50ZXJ2YWxVcyAhPSAwKTsKLSAgICBib29sIGlzX3BjbV9jb25maWdfc3VwcG9ydGVkID0KLSAgICAgICAgKHBjbV9jb25maWcuc2FtcGxlUmF0ZSAmIHBjbV9jYXBhYmlsaXRpZXMuc2FtcGxlUmF0ZSAmJgotICAgICAgICAgcGNtX2NvbmZpZy5iaXRzUGVyU2FtcGxlICYgcGNtX2NhcGFiaWxpdGllcy5iaXRzUGVyU2FtcGxlICYmCi0gICAgICAgICBwY21fY29uZmlnLmNoYW5uZWxNb2RlICYgcGNtX2NhcGFiaWxpdGllcy5jaGFubmVsTW9kZSk7Ci0gICAgcmV0dXJuIChpc19wY21fY29uZmlnX3ZhbGlkICYmIGlzX3BjbV9jb25maWdfc3VwcG9ydGVkKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsIEEyZHBDb2RlY1RvSGFsUGNtQ29uZmlnKSB7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBhMmRwX2NvZGVjX2NvbmZpZyA9IHt9OwotICBmb3IgKGF1dG8gc2FtcGxlX3JhdGVfcGFpciA6IGtTYW1wbGVSYXRlUGFpcnMpIHsKLSAgICBhMmRwX2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlX3BhaXIuYnRhdl9zYW1wbGVfcmF0ZV87Ci0gICAgZm9yIChhdXRvIGJpdHNfcGVyX3NhbXBsZV9wYWlyIDoga0JpdHNQZXJTYW1wbGVQYWlycykgewotICAgICAgYTJkcF9jb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0KLSAgICAgICAgICBiaXRzX3Blcl9zYW1wbGVfcGFpci5idGF2X2JpdHNfcGVyX3NhbXBsZV87Ci0gICAgICBmb3IgKGF1dG8gY2hhbm5lbF9tb2RlX3BhaXIgOiBrQ2hhbm5lbE1vZGVQYWlycykgewotICAgICAgICBhMmRwX2NvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPSBjaGFubmVsX21vZGVfcGFpci5idGF2X2NoYW5uZWxfbW9kZV87Ci0gICAgICAgIEFTU0VSVF9FUShBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoYTJkcF9jb2RlY19jb25maWcpLAotICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGVfcGFpci5oYWxfc2FtcGxlX3JhdGVfKTsKLSAgICAgICAgQVNTRVJUX0VRKEEyZHBDb2RlY1RvSGFsQml0c1BlclNhbXBsZShhMmRwX2NvZGVjX2NvbmZpZyksCi0gICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGVfcGFpci5oYWxfYml0c19wZXJfc2FtcGxlXyk7Ci0gICAgICAgIEFTU0VSVF9FUShBMmRwQ29kZWNUb0hhbENoYW5uZWxNb2RlKGEyZHBfY29kZWNfY29uZmlnKSwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbW9kZV9wYWlyLmhhbF9jaGFubmVsX21vZGVfKTsKLSAgICAgIH0gIC8vIENoYW5uZWxNb2RlCi0gICAgfSAgICAvLyBCaXRzUGVyU2FtcHBsZQotICB9ICAgICAgLy8gU2FtcGxlUmF0ZQotfQotCi1URVNUX0YoQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2VUZXN0LCBTdGFydEFuZEVuZEEyZHBTb2Z0d2FyZVNlc3Npb24pIHsKLSAgdGVzdF9zaW5rX3RyYW5zcG9ydF8gPQotICAgICAgbmV3IFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX1NPRlRXQVJFX0VOQ09ESU5HX0RBVEFQQVRIKTsKLSAgY2xpZW50aWZfc2lua18gPQotICAgICAgbmV3IEJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSh0ZXN0X3NpbmtfdHJhbnNwb3J0XywgbnVsbHB0cik7Ci0gIEF1ZGlvQ29uZmlndXJhdGlvbiBhdWRpb19jb25maWcgPSB7fTsKLSAgUGNtUGFyYW1ldGVycyBwY21fY29uZmlnID0ge307Ci0gIGZvciAoYXV0byBzYW1wbGVfcmF0ZV9wYWlyIDoga1NhbXBsZVJhdGVQYWlycykgewotICAgIHBjbV9jb25maWcuc2FtcGxlUmF0ZSA9IHNhbXBsZV9yYXRlX3BhaXIuaGFsX3NhbXBsZV9yYXRlXzsKLSAgICBmb3IgKGF1dG8gYml0c19wZXJfc2FtcGxlX3BhaXIgOiBrQml0c1BlclNhbXBsZVBhaXJzKSB7Ci0gICAgICBwY21fY29uZmlnLmJpdHNQZXJTYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGVfcGFpci5oYWxfYml0c19wZXJfc2FtcGxlXzsKLSAgICAgIGZvciAoYXV0byBjaGFubmVsX21vZGVfcGFpciA6IGtDaGFubmVsTW9kZVBhaXJzKSB7Ci0gICAgICAgIHBjbV9jb25maWcuY2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGVfcGFpci5oYWxfY2hhbm5lbF9tb2RlXzsKLSAgICAgICAgYXVkaW9fY29uZmlnLnBjbUNvbmZpZyhwY21fY29uZmlnKTsKLSAgICAgICAgY2xpZW50aWZfc2lua18tPlVwZGF0ZUF1ZGlvQ29uZmlnKGF1ZGlvX2NvbmZpZyk7Ci0gICAgICAgIGlmIChJc1NvZnR3YXJlUGNtUGFyYW1ldGVyc1N1cHBvcnRlZChwY21fY29uZmlnKSkgewotICAgICAgICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFTU0VSVF9ORShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+RW5kU2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICAgIH0gIC8vIENoYW5uZWxNb2RlCi0gICAgfSAgICAvLyBCaXRzUGVyU2FtcHBsZQotICB9ICAgICAgLy8gU2FtcGxlUmF0ZQotfQotCi1zdHJ1Y3QgQ29kZWNPZmZsb2FkaW5nUHJlZmVyZW5jZSB7Ci0gIGJvb2wgaXNfdGFyZ2V0X2NvZGVjX2luY2x1ZGVkXzsKLSAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBwcmVmZXJlbmNlXzsKLX07Ci0KLXN0ZDo6dmVjdG9yPENvZGVjT2ZmbG9hZGluZ1ByZWZlcmVuY2U+IENvZGVjT2ZmbG9hZGluZ1ByZWZlcmVuY2VHZW5lcmF0b3IoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgdGFyZ2V0X2NvZGVjX2luZGV4KSB7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjT2ZmbG9hZGluZ1ByZWZlcmVuY2U+IGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZXMgPSB7Ci0gICAgICB7LmlzX3RhcmdldF9jb2RlY19pbmNsdWRlZF8gPSBmYWxzZSwKLSAgICAgICAucHJlZmVyZW5jZV8gPSBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+KDApfX07Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBhMmRwX2NvZGVjX2NvbmZpZyA9IHt9OwotICBmb3IgKGF1dG8gY29kZWNfaW5kZXggOiBjb2RlY19pbmRleGVzKSB7Ci0gICAgYTJkcF9jb2RlY19jb25maWcuY29kZWNfdHlwZSA9IGNvZGVjX2luZGV4OwotICAgIGF1dG8gZHVwbGljYXRlZF9wcmVmZXJlbmNlcyA9IGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZXM7Ci0gICAgZm9yIChhdXRvIGl0ZXIgPSBkdXBsaWNhdGVkX3ByZWZlcmVuY2VzLmJlZ2luKCk7Ci0gICAgICAgICBpdGVyICE9IGR1cGxpY2F0ZWRfcHJlZmVyZW5jZXMuZW5kKCk7ICsraXRlcikgewotICAgICAgaWYgKGNvZGVjX2luZGV4ID09IHRhcmdldF9jb2RlY19pbmRleCkgewotICAgICAgICBpdGVyLT5pc190YXJnZXRfY29kZWNfaW5jbHVkZWRfID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGl0ZXItPnByZWZlcmVuY2VfLnB1c2hfYmFjayhhMmRwX2NvZGVjX2NvbmZpZyk7Ci0gICAgfQotICAgIGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZXMuaW5zZXJ0KGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZF9wcmVmZXJlbmNlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWRfcHJlZmVyZW5jZXMuZW5kKCkpOwotICB9Ci0gIHJldHVybiBjb2RlY19vZmZsb2FkaW5nX3ByZWZlcmVuY2VzOwotfQotCi1zdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZ3VyYXRpb24+IFNiY0NvZGVjQ29uZmlndXJhdGlvbnNHZW5lcmF0b3IoKSB7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlndXJhdGlvbj4gc2JjX2NvZGVjX2NvbmZpZ3M7Ci0gIENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgPSB7fTsKLSAgU2JjQmxvY2tMZW5ndGggYmxvY2tfbGVuZ3Roc1s0XSA9IHsKLSAgICAgIFNiY0Jsb2NrTGVuZ3RoOjpCTE9DS1NfNCwgU2JjQmxvY2tMZW5ndGg6OkJMT0NLU184LAotICAgICAgU2JjQmxvY2tMZW5ndGg6OkJMT0NLU18xMiwgU2JjQmxvY2tMZW5ndGg6OkJMT0NLU18xNn07Ci0gIFNiY051bVN1YmJhbmRzIG51bV9zdWJiYW5kc1syXSA9IHtTYmNOdW1TdWJiYW5kczo6U1VCQkFORF80LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JjTnVtU3ViYmFuZHM6OlNVQkJBTkRfOH07Ci0gIFNiY0FsbG9jTWV0aG9kIGFsbG9jX21ldGhvZHNbMl0gPSB7U2JjQWxsb2NNZXRob2Q6OkFMTE9DX01EX1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JjQWxsb2NNZXRob2Q6OkFMTE9DX01EX0x9OwotICBmb3IgKGF1dG8gc2FtcGxlX3JhdGVfcGFpciA6IGtTYW1wbGVSYXRlUGFpcnMpIHsKLSAgICBmb3IgKGF1dG8gYml0c19wZXJfc2FtcGxlX3BhaXIgOiBrQml0c1BlclNhbXBsZVBhaXJzKSB7Ci0gICAgICBmb3IgKGF1dG8gY2hhbm5lbF9tb2RlX3BhaXIgOiBrQ2hhbm5lbE1vZGVQYWlycykgewotICAgICAgICBmb3IgKGF1dG8gcGVlcl9tdHUgOiBrUGVlck10dXMpIHsKLSAgICAgICAgICBmb3IgKGF1dG8gYmxvY2tfbGVuZ3RoIDogYmxvY2tfbGVuZ3RocykgewotICAgICAgICAgICAgZm9yIChhdXRvIG51bV9zdWJiYW5kIDogbnVtX3N1YmJhbmRzKSB7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byBhbGxvY19tZXRob2QgOiBhbGxvY19tZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgY29kZWNfY29uZmlnLmNvZGVjVHlwZSA9IENvZGVjVHlwZTo6U0JDOwotICAgICAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5wZWVyTXR1ID0gcGVlcl9tdHU7Ci0gICAgICAgICAgICAgICAgY29kZWNfY29uZmlnLmlzU2Ntc3RFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfREVGQVVMVF9CSVRSQVRFCi0gICAgICAgICAgICAgICAgY29kZWNfY29uZmlnLmVuY29kZWRBdWRpb0JpdHJhdGUgPSAzMjgwMDA7Ci0gICAgICAgICAgICAgICAgU2JjUGFyYW1ldGVycyBzYmMgPSB7Ci0gICAgICAgICAgICAgICAgICAgIC5zYW1wbGVSYXRlID0gc2FtcGxlX3JhdGVfcGFpci5oYWxfc2FtcGxlX3JhdGVfLAotICAgICAgICAgICAgICAgICAgICAuY2hhbm5lbE1vZGUgPSAoY2hhbm5lbF9tb2RlX3BhaXIuaGFsX2NoYW5uZWxfbW9kZV8gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbE1vZGU6Ok1PTk8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNiY0NoYW5uZWxNb2RlOjpNT05PCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTYmNDaGFubmVsTW9kZTo6Sk9JTlRfU1RFUkVPKSwKLSAgICAgICAgICAgICAgICAgICAgLmJsb2NrTGVuZ3RoID0gYmxvY2tfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAubnVtU3ViYmFuZHMgPSBudW1fc3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgLmFsbG9jTWV0aG9kID0gYWxsb2NfbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAuYml0c1BlclNhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZV9wYWlyLmhhbF9iaXRzX3Blcl9zYW1wbGVfLAotICAgICAgICAgICAgICAgICAgICAubWluQml0cG9vbCA9IDIsCi0gICAgICAgICAgICAgICAgICAgIC5tYXhCaXRwb29sID0gNTN9OwotICAgICAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5jb25maWcuc2JjQ29uZmlnKHNiYyk7Ci0gICAgICAgICAgICAgICAgc2JjX2NvZGVjX2NvbmZpZ3MucHVzaF9iYWNrKGNvZGVjX2NvbmZpZyk7Ci0gICAgICAgICAgICAgIH0gIC8vIFNiY0FsbG9jTWV0aG9kCi0gICAgICAgICAgICB9ICAgIC8vIFNiY051bVN1YmJhbmRzCi0gICAgICAgICAgfSAgICAgIC8vIFNiY0Jsb2NrTGVuZ3RoCi0gICAgICAgIH0gICAgICAgIC8vIHBlZXJNdHUKLSAgICAgIH0gICAgICAgICAgLy8gQ2hhbm5lbE1vZGUKLSAgICB9ICAgICAgICAgICAgLy8gQml0c1BlclNhbXBwbGUKLSAgfSAgICAgICAgICAgICAgLy8gU2FtcGxlUmF0ZQotICByZXR1cm4gc2JjX2NvZGVjX2NvbmZpZ3M7Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsIEEyZHBTYmNDb2RlY09mZmxvYWRpbmdTdGF0ZSkgewotICB0ZXN0X3NpbmtfdHJhbnNwb3J0XyA9Ci0gICAgICBuZXcgVGVzdFNpbmtUcmFuc3BvcnQoU2Vzc2lvblR5cGU6OkEyRFBfSEFSRFdBUkVfT0ZGTE9BRF9EQVRBUEFUSCk7Ci0gIGNsaWVudGlmX3NpbmtfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UodGVzdF9zaW5rX3RyYW5zcG9ydF8sIG51bGxwdHIpOwotICBhdXRvIHNiY19jb2RlY19jb25maWdzID0gU2JjQ29kZWNDb25maWd1cmF0aW9uc0dlbmVyYXRvcigpOwotICBmb3IgKGF1dG8gY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlIDoKLSAgICAgICBDb2RlY09mZmxvYWRpbmdQcmVmZXJlbmNlR2VuZXJhdG9yKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDKSkgewotICAgIFVwZGF0ZU9mZmxvYWRpbmdDYXBhYmlsaXRpZXMoY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlLnByZWZlcmVuY2VfKTsKLSAgICBmb3IgKENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgOiBzYmNfY29kZWNfY29uZmlncykgewotICAgICAgaWYgKElzQ29kZWNPZmZsb2FkaW5nU3VwcG9ydGVkKGNvZGVjX2NvbmZpZykgJiYKLSAgICAgICAgICBjb2RlY19vZmZsb2FkaW5nX3ByZWZlcmVuY2UuaXNfdGFyZ2V0X2NvZGVjX2luY2x1ZGVkXykgewotICAgICAgICBBU1NFUlRfVFJVRShJc0NvZGVjT2ZmbG9hZGluZ0VuYWJsZWQoY29kZWNfY29uZmlnKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlRfRkFMU0UoSXNDb2RlY09mZmxvYWRpbmdFbmFibGVkKGNvZGVjX2NvbmZpZykpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1URVNUX0YoQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2VUZXN0LCBTdGFydEFuZEVuZEEyZHBPZmZsb2FkU2JjU2Vzc2lvbikgewotICB0ZXN0X3NpbmtfdHJhbnNwb3J0XyA9Ci0gICAgICBuZXcgVGVzdFNpbmtUcmFuc3BvcnQoU2Vzc2lvblR5cGU6OkEyRFBfSEFSRFdBUkVfT0ZGTE9BRF9EQVRBUEFUSCk7Ci0gIGNsaWVudGlmX3NpbmtfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UodGVzdF9zaW5rX3RyYW5zcG9ydF8sIG51bGxwdHIpOwotICBBdWRpb0NvbmZpZ3VyYXRpb24gYXVkaW9fY29uZmlnID0ge307Ci0gIGZvciAoQ29kZWNDb25maWd1cmF0aW9uIGNvZGVjX2NvbmZpZyA6IFNiY0NvZGVjQ29uZmlndXJhdGlvbnNHZW5lcmF0b3IoKSkgewotICAgIGF1ZGlvX2NvbmZpZy5jb2RlY0NvbmZpZyhjb2RlY19jb25maWcpOwotICAgIGNsaWVudGlmX3NpbmtfLT5VcGRhdGVBdWRpb0NvbmZpZyhhdWRpb19jb25maWcpOwotICAgIGlmIChJc0NvZGVjT2ZmbG9hZGluZ1N1cHBvcnRlZChjb2RlY19jb25maWcpKSB7Ci0gICAgICBBU1NFUlRfRVEoY2xpZW50aWZfc2lua18tPlN0YXJ0U2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUX05FKGNsaWVudGlmX3NpbmtfLT5TdGFydFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+RW5kU2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgfQotfQotCi1zdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZ3VyYXRpb24+IEFhY0NvZGVjQ29uZmlndXJhdGlvbnNHZW5lcmF0b3IoKSB7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlndXJhdGlvbj4gYWFjX2NvZGVjX2NvbmZpZ3M7Ci0gIENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgPSB7fTsKLSAgQWFjT2JqZWN0VHlwZSBvYmplY3RfdHlwZXNbNF0gPSB7Ci0gICAgICBBYWNPYmplY3RUeXBlOjpNUEVHMl9MQywgQWFjT2JqZWN0VHlwZTo6TVBFRzRfTEMsCi0gICAgICBBYWNPYmplY3RUeXBlOjpNUEVHNF9MVFAsIEFhY09iamVjdFR5cGU6Ok1QRUc0X1NDQUxBQkxFfTsKLSAgQWFjVmFyaWFibGVCaXRSYXRlIHZhcmlhYmxlX2JpdHJhdGVzWzJdID0ge0FhY1ZhcmlhYmxlQml0UmF0ZTo6RElTQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYWNWYXJpYWJsZUJpdFJhdGU6OkVOQUJMRUR9OwotICBmb3IgKGF1dG8gc2FtcGxlX3JhdGVfcGFpciA6IGtTYW1wbGVSYXRlUGFpcnMpIHsKLSAgICBmb3IgKGF1dG8gYml0c19wZXJfc2FtcGxlX3BhaXIgOiBrQml0c1BlclNhbXBsZVBhaXJzKSB7Ci0gICAgICBmb3IgKGF1dG8gY2hhbm5lbF9tb2RlX3BhaXIgOiBrQ2hhbm5lbE1vZGVQYWlycykgewotICAgICAgICBmb3IgKGF1dG8gcGVlcl9tdHUgOiBrUGVlck10dXMpIHsKLSAgICAgICAgICBmb3IgKGF1dG8gb2JqZWN0X3R5cGUgOiBvYmplY3RfdHlwZXMpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byB2YXJpYWJsZV9iaXRyYXRlIDogdmFyaWFibGVfYml0cmF0ZXMpIHsKLSAgICAgICAgICAgICAgY29kZWNfY29uZmlnLmNvZGVjVHlwZSA9IENvZGVjVHlwZTo6QUFDOwotICAgICAgICAgICAgICBjb2RlY19jb25maWcucGVlck10dSA9IHBlZXJfbXR1OwotICAgICAgICAgICAgICBjb2RlY19jb25maWcuaXNTY21zdEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgLy8gQTJEUF9BQUNfREVGQVVMVF9CSVRSQVRFCi0gICAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5lbmNvZGVkQXVkaW9CaXRyYXRlID0gMzIwMDAwOwotICAgICAgICAgICAgICBBYWNQYXJhbWV0ZXJzIGFhYyA9IHsKLSAgICAgICAgICAgICAgICAgIC5vYmplY3RUeXBlID0gb2JqZWN0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAuc2FtcGxlUmF0ZSA9IHNhbXBsZV9yYXRlX3BhaXIuaGFsX3NhbXBsZV9yYXRlXywKLSAgICAgICAgICAgICAgICAgIC5jaGFubmVsTW9kZSA9IGNoYW5uZWxfbW9kZV9wYWlyLmhhbF9jaGFubmVsX21vZGVfLAotICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlQml0UmF0ZUVuYWJsZWQgPSB2YXJpYWJsZV9iaXRyYXRlLAotICAgICAgICAgICAgICAgICAgLmJpdHNQZXJTYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGVfcGFpci5oYWxfYml0c19wZXJfc2FtcGxlX307Ci0gICAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5jb25maWcuYWFjQ29uZmlnKGFhYyk7Ci0gICAgICAgICAgICAgIGFhY19jb2RlY19jb25maWdzLnB1c2hfYmFjayhjb2RlY19jb25maWcpOwotICAgICAgICAgICAgfSAgLy8gQWFjVmFyaWFibGVCaXRSYXRlCi0gICAgICAgICAgfSAgICAvLyBBYWNPYmplY3RUeXBlCi0gICAgICAgIH0gICAgICAvLyBwZWVyTXR1Ci0gICAgICB9ICAgICAgICAvLyBDaGFubmVsTW9kZQotICAgIH0gICAgICAgICAgLy8gQml0c1BlclNhbXBwbGUKLSAgfSAgICAgICAgICAgIC8vIFNhbXBsZVJhdGUKLSAgcmV0dXJuIGFhY19jb2RlY19jb25maWdzOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2VUZXN0LCBBMmRwQWFjQ29kZWNPZmZsb2FkaW5nU3RhdGUpIHsKLSAgdGVzdF9zaW5rX3RyYW5zcG9ydF8gPQotICAgICAgbmV3IFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICBjbGllbnRpZl9zaW5rXyA9Ci0gICAgICBuZXcgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKHRlc3Rfc2lua190cmFuc3BvcnRfLCBudWxscHRyKTsKLSAgYXV0byBhYWNfY29kZWNfY29uZmlncyA9IEFhY0NvZGVjQ29uZmlndXJhdGlvbnNHZW5lcmF0b3IoKTsKLSAgZm9yIChhdXRvIGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZSA6Ci0gICAgICAgQ29kZWNPZmZsb2FkaW5nUHJlZmVyZW5jZUdlbmVyYXRvcihCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQykpIHsKLSAgICBVcGRhdGVPZmZsb2FkaW5nQ2FwYWJpbGl0aWVzKGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZS5wcmVmZXJlbmNlXyk7Ci0gICAgZm9yIChDb2RlY0NvbmZpZ3VyYXRpb24gY29kZWNfY29uZmlnIDogYWFjX2NvZGVjX2NvbmZpZ3MpIHsKLSAgICAgIGlmIChJc0NvZGVjT2ZmbG9hZGluZ1N1cHBvcnRlZChjb2RlY19jb25maWcpICYmCi0gICAgICAgICAgY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlLmlzX3RhcmdldF9jb2RlY19pbmNsdWRlZF8pIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoSXNDb2RlY09mZmxvYWRpbmdFbmFibGVkKGNvZGVjX2NvbmZpZykpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX0ZBTFNFKElzQ29kZWNPZmZsb2FkaW5nRW5hYmxlZChjb2RlY19jb25maWcpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlVGVzdCwgU3RhcnRBbmRFbmRBMmRwT2ZmbG9hZEFhY1Nlc3Npb24pIHsKLSAgdGVzdF9zaW5rX3RyYW5zcG9ydF8gPQotICAgICAgbmV3IFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICBjbGllbnRpZl9zaW5rXyA9Ci0gICAgICBuZXcgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKHRlc3Rfc2lua190cmFuc3BvcnRfLCBudWxscHRyKTsKLSAgQXVkaW9Db25maWd1cmF0aW9uIGF1ZGlvX2NvbmZpZyA9IHt9OwotICBmb3IgKENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgOiBBYWNDb2RlY0NvbmZpZ3VyYXRpb25zR2VuZXJhdG9yKCkpIHsKLSAgICBhdWRpb19jb25maWcuY29kZWNDb25maWcoY29kZWNfY29uZmlnKTsKLSAgICBjbGllbnRpZl9zaW5rXy0+VXBkYXRlQXVkaW9Db25maWcoYXVkaW9fY29uZmlnKTsKLSAgICBpZiAoSXNDb2RlY09mZmxvYWRpbmdTdXBwb3J0ZWQoY29kZWNfY29uZmlnKSkgewotICAgICAgQVNTRVJUX0VRKGNsaWVudGlmX3NpbmtfLT5TdGFydFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9ORShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoY2xpZW50aWZfc2lua18tPkVuZFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gIH0KLX0KLQotc3RkOjp2ZWN0b3I8Q29kZWNDb25maWd1cmF0aW9uPiBMZGFjQ29kZWNDb25maWd1cmF0aW9uc0dlbmVyYXRvcigpIHsKLSAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWd1cmF0aW9uPiBsZGFjX2NvZGVjX2NvbmZpZ3M7Ci0gIENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgPSB7fTsKLSAgTGRhY1F1YWxpdHlJbmRleCBxdWFsaXR5X2luZGV4ZXNbNF0gPSB7Ci0gICAgICBMZGFjUXVhbGl0eUluZGV4OjpRVUFMSVRZX0hJR0gsIExkYWNRdWFsaXR5SW5kZXg6OlFVQUxJVFlfTUlELAotICAgICAgTGRhY1F1YWxpdHlJbmRleDo6UVVBTElUWV9MT1csIExkYWNRdWFsaXR5SW5kZXg6OlFVQUxJVFlfQUJSfTsKLSAgZm9yIChhdXRvIHNhbXBsZV9yYXRlX3BhaXIgOiBrU2FtcGxlUmF0ZVBhaXJzKSB7Ci0gICAgZm9yIChhdXRvIGJpdHNfcGVyX3NhbXBsZV9wYWlyIDoga0JpdHNQZXJTYW1wbGVQYWlycykgewotICAgICAgZm9yIChhdXRvIGNoYW5uZWxfbW9kZV9wYWlyIDoga0NoYW5uZWxNb2RlUGFpcnMpIHsKLSAgICAgICAgZm9yIChhdXRvIHBlZXJfbXR1IDoga1BlZXJNdHVzKSB7Ci0gICAgICAgICAgZm9yIChhdXRvIHF1YWxpdHlfaW5kZXggOiBxdWFsaXR5X2luZGV4ZXMpIHsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5jb2RlY1R5cGUgPSBDb2RlY1R5cGU6OkxEQUM7Ci0gICAgICAgICAgICBjb2RlY19jb25maWcucGVlck10dSA9IHBlZXJfbXR1OwotICAgICAgICAgICAgY29kZWNfY29uZmlnLmlzU2Ntc3RFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBjb2RlY19jb25maWcuZW5jb2RlZEF1ZGlvQml0cmF0ZSA9IDk5MDAwMDsKLSAgICAgICAgICAgIExkYWNQYXJhbWV0ZXJzIGxkYWMgPSB7Ci0gICAgICAgICAgICAgICAgLnNhbXBsZVJhdGUgPSBzYW1wbGVfcmF0ZV9wYWlyLmhhbF9zYW1wbGVfcmF0ZV8sCi0gICAgICAgICAgICAgICAgLmNoYW5uZWxNb2RlID0KLSAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxfbW9kZV9wYWlyLmhhbF9jaGFubmVsX21vZGVfID09IENoYW5uZWxNb2RlOjpNT05PCi0gICAgICAgICAgICAgICAgICAgICAgICAgPyBMZGFjQ2hhbm5lbE1vZGU6Ok1PTk8KLSAgICAgICAgICAgICAgICAgICAgICAgICA6IExkYWNDaGFubmVsTW9kZTo6U1RFUkVPKSwKLSAgICAgICAgICAgICAgICAucXVhbGl0eUluZGV4ID0gcXVhbGl0eV9pbmRleCwKLSAgICAgICAgICAgICAgICAuYml0c1BlclNhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZV9wYWlyLmhhbF9iaXRzX3Blcl9zYW1wbGVffTsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5jb25maWcubGRhY0NvbmZpZyhsZGFjKTsKLSAgICAgICAgICAgIGxkYWNfY29kZWNfY29uZmlncy5wdXNoX2JhY2soY29kZWNfY29uZmlnKTsKLSAgICAgICAgICB9ICAvLyBMZGFjUXVhbGl0eUluZGV4Ci0gICAgICAgIH0gICAgLy8gcGVlck10dQotICAgICAgfSAgICAgIC8vIENoYW5uZWxNb2RlCi0gICAgfSAgICAgICAgLy8gQml0c1BlclNhbXBwbGUKLSAgfSAgICAgICAgICAvLyBTYW1wbGVSYXRlCi0gIHJldHVybiBsZGFjX2NvZGVjX2NvbmZpZ3M7Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsIEEyZHBMZGFjQ29kZWNPZmZsb2FkaW5nU3RhdGUpIHsKLSAgdGVzdF9zaW5rX3RyYW5zcG9ydF8gPQotICAgICAgbmV3IFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICBjbGllbnRpZl9zaW5rXyA9Ci0gICAgICBuZXcgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKHRlc3Rfc2lua190cmFuc3BvcnRfLCBudWxscHRyKTsKLSAgYXV0byBsZGFjX2NvZGVjX2NvbmZpZ3MgPSBMZGFjQ29kZWNDb25maWd1cmF0aW9uc0dlbmVyYXRvcigpOwotICBmb3IgKGF1dG8gY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlIDoKLSAgICAgICBDb2RlY09mZmxvYWRpbmdQcmVmZXJlbmNlR2VuZXJhdG9yKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTERBQykpIHsKLSAgICBVcGRhdGVPZmZsb2FkaW5nQ2FwYWJpbGl0aWVzKGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZS5wcmVmZXJlbmNlXyk7Ci0gICAgZm9yIChDb2RlY0NvbmZpZ3VyYXRpb24gY29kZWNfY29uZmlnIDogbGRhY19jb2RlY19jb25maWdzKSB7Ci0gICAgICBpZiAoSXNDb2RlY09mZmxvYWRpbmdTdXBwb3J0ZWQoY29kZWNfY29uZmlnKSAmJgotICAgICAgICAgIGNvZGVjX29mZmxvYWRpbmdfcHJlZmVyZW5jZS5pc190YXJnZXRfY29kZWNfaW5jbHVkZWRfKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKElzQ29kZWNPZmZsb2FkaW5nRW5hYmxlZChjb2RlY19jb25maWcpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVF9GQUxTRShJc0NvZGVjT2ZmbG9hZGluZ0VuYWJsZWQoY29kZWNfY29uZmlnKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsIFN0YXJ0QW5kRW5kQTJkcE9mZmxvYWRMZGFjU2Vzc2lvbikgewotICB0ZXN0X3NpbmtfdHJhbnNwb3J0XyA9Ci0gICAgICBuZXcgVGVzdFNpbmtUcmFuc3BvcnQoU2Vzc2lvblR5cGU6OkEyRFBfSEFSRFdBUkVfT0ZGTE9BRF9EQVRBUEFUSCk7Ci0gIGNsaWVudGlmX3NpbmtfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UodGVzdF9zaW5rX3RyYW5zcG9ydF8sIG51bGxwdHIpOwotICBBdWRpb0NvbmZpZ3VyYXRpb24gYXVkaW9fY29uZmlnID0ge307Ci0gIGZvciAoQ29kZWNDb25maWd1cmF0aW9uIGNvZGVjX2NvbmZpZyA6IExkYWNDb2RlY0NvbmZpZ3VyYXRpb25zR2VuZXJhdG9yKCkpIHsKLSAgICBhdWRpb19jb25maWcuY29kZWNDb25maWcoY29kZWNfY29uZmlnKTsKLSAgICBjbGllbnRpZl9zaW5rXy0+VXBkYXRlQXVkaW9Db25maWcoYXVkaW9fY29uZmlnKTsKLSAgICBpZiAoSXNDb2RlY09mZmxvYWRpbmdTdXBwb3J0ZWQoY29kZWNfY29uZmlnKSkgewotICAgICAgQVNTRVJUX0VRKGNsaWVudGlmX3NpbmtfLT5TdGFydFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9ORShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoY2xpZW50aWZfc2lua18tPkVuZFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gIH0KLX0KLQotc3RkOjp2ZWN0b3I8Q29kZWNDb25maWd1cmF0aW9uPiBBcHR4Q29kZWNDb25maWd1cmF0aW9uc0dlbmVyYXRvcigKLSAgICBDb2RlY1R5cGUgY29kZWNfdHlwZSkgewotICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZ3VyYXRpb24+IGFwdHhfY29kZWNfY29uZmlnczsKLSAgaWYgKGNvZGVjX3R5cGUgIT0gQ29kZWNUeXBlOjpBUFRYICYmIGNvZGVjX3R5cGUgIT0gQ29kZWNUeXBlOjpBUFRYX0hEKQotICAgIHJldHVybiBhcHR4X2NvZGVjX2NvbmZpZ3M7Ci0gIENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgPSB7fTsKLSAgZm9yIChhdXRvIHNhbXBsZV9yYXRlX3BhaXIgOiBrU2FtcGxlUmF0ZVBhaXJzKSB7Ci0gICAgZm9yIChhdXRvIGJpdHNfcGVyX3NhbXBsZV9wYWlyIDoga0JpdHNQZXJTYW1wbGVQYWlycykgewotICAgICAgZm9yIChhdXRvIGNoYW5uZWxfbW9kZV9wYWlyIDoga0NoYW5uZWxNb2RlUGFpcnMpIHsKLSAgICAgICAgZm9yIChhdXRvIHBlZXJfbXR1IDoga1BlZXJNdHVzKSB7Ci0gICAgICAgICAgY29kZWNfY29uZmlnLmNvZGVjVHlwZSA9IGNvZGVjX3R5cGU7Ci0gICAgICAgICAgY29kZWNfY29uZmlnLnBlZXJNdHUgPSBwZWVyX210dTsKLSAgICAgICAgICBjb2RlY19jb25maWcuaXNTY21zdEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICBjb2RlY19jb25maWcuZW5jb2RlZEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgIChjb2RlY190eXBlID09IENvZGVjVHlwZTo6QVBUWCA/IDM1MjAwMCA6IDU3NjAwMCk7Ci0gICAgICAgICAgQXB0eFBhcmFtZXRlcnMgYXB0eCA9IHsKLSAgICAgICAgICAgICAgLnNhbXBsZVJhdGUgPSBzYW1wbGVfcmF0ZV9wYWlyLmhhbF9zYW1wbGVfcmF0ZV8sCi0gICAgICAgICAgICAgIC5jaGFubmVsTW9kZSA9IGNoYW5uZWxfbW9kZV9wYWlyLmhhbF9jaGFubmVsX21vZGVfLAotICAgICAgICAgICAgICAuYml0c1BlclNhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZV9wYWlyLmhhbF9iaXRzX3Blcl9zYW1wbGVffTsKLSAgICAgICAgICBjb2RlY19jb25maWcuY29uZmlnLmFwdHhDb25maWcoYXB0eCk7Ci0gICAgICAgICAgYXB0eF9jb2RlY19jb25maWdzLnB1c2hfYmFjayhjb2RlY19jb25maWcpOwotICAgICAgICB9ICAvLyBwZWVyTXR1Ci0gICAgICB9ICAgIC8vIENoYW5uZWxNb2RlCi0gICAgfSAgICAgIC8vIEJpdHNQZXJTYW1wcGxlCi0gIH0gICAgICAgIC8vIFNhbXBsZVJhdGUKLSAgcmV0dXJuIGFwdHhfY29kZWNfY29uZmlnczsKLX0KLQotVEVTVF9GKEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlVGVzdCwgQTJkcEFwdHhDb2RlY09mZmxvYWRpbmdTdGF0ZSkgewotICB0ZXN0X3NpbmtfdHJhbnNwb3J0XyA9Ci0gICAgICBuZXcgVGVzdFNpbmtUcmFuc3BvcnQoU2Vzc2lvblR5cGU6OkEyRFBfSEFSRFdBUkVfT0ZGTE9BRF9EQVRBUEFUSCk7Ci0gIGNsaWVudGlmX3NpbmtfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UodGVzdF9zaW5rX3RyYW5zcG9ydF8sIG51bGxwdHIpOwotICBhdXRvIGFwdHhfY29kZWNfY29uZmlncyA9IEFwdHhDb2RlY0NvbmZpZ3VyYXRpb25zR2VuZXJhdG9yKENvZGVjVHlwZTo6QVBUWCk7Ci0gIGZvciAoYXV0byBjb2RlY19vZmZsb2FkaW5nX3ByZWZlcmVuY2UgOgotICAgICAgIENvZGVjT2ZmbG9hZGluZ1ByZWZlcmVuY2VHZW5lcmF0b3IoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYKSkgewotICAgIFVwZGF0ZU9mZmxvYWRpbmdDYXBhYmlsaXRpZXMoY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlLnByZWZlcmVuY2VfKTsKLSAgICBmb3IgKENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgOiBhcHR4X2NvZGVjX2NvbmZpZ3MpIHsKLSAgICAgIGlmIChJc0NvZGVjT2ZmbG9hZGluZ1N1cHBvcnRlZChjb2RlY19jb25maWcpICYmCi0gICAgICAgICAgY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlLmlzX3RhcmdldF9jb2RlY19pbmNsdWRlZF8pIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoSXNDb2RlY09mZmxvYWRpbmdFbmFibGVkKGNvZGVjX2NvbmZpZykpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX0ZBTFNFKElzQ29kZWNPZmZsb2FkaW5nRW5hYmxlZChjb2RlY19jb25maWcpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlVGVzdCwgU3RhcnRBbmRFbmRBMmRwT2ZmbG9hZEFwdHhTZXNzaW9uKSB7Ci0gIHRlc3Rfc2lua190cmFuc3BvcnRfID0KLSAgICAgIG5ldyBUZXN0U2lua1RyYW5zcG9ydChTZXNzaW9uVHlwZTo6QTJEUF9IQVJEV0FSRV9PRkZMT0FEX0RBVEFQQVRIKTsKLSAgY2xpZW50aWZfc2lua18gPQotICAgICAgbmV3IEJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSh0ZXN0X3NpbmtfdHJhbnNwb3J0XywgbnVsbHB0cik7Ci0gIEF1ZGlvQ29uZmlndXJhdGlvbiBhdWRpb19jb25maWcgPSB7fTsKLSAgZm9yIChDb2RlY0NvbmZpZ3VyYXRpb24gY29kZWNfY29uZmlnIDoKLSAgICAgICBBcHR4Q29kZWNDb25maWd1cmF0aW9uc0dlbmVyYXRvcihDb2RlY1R5cGU6OkFQVFgpKSB7Ci0gICAgYXVkaW9fY29uZmlnLmNvZGVjQ29uZmlnKGNvZGVjX2NvbmZpZyk7Ci0gICAgY2xpZW50aWZfc2lua18tPlVwZGF0ZUF1ZGlvQ29uZmlnKGF1ZGlvX2NvbmZpZyk7Ci0gICAgaWYgKElzQ29kZWNPZmZsb2FkaW5nU3VwcG9ydGVkKGNvZGVjX2NvbmZpZykpIHsKLSAgICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlRfTkUoY2xpZW50aWZfc2lua18tPlN0YXJ0U2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKGNsaWVudGlmX3NpbmtfLT5FbmRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICB9Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsIEEyZHBBcHR4SGRDb2RlY09mZmxvYWRpbmdTdGF0ZSkgewotICB0ZXN0X3NpbmtfdHJhbnNwb3J0XyA9Ci0gICAgICBuZXcgVGVzdFNpbmtUcmFuc3BvcnQoU2Vzc2lvblR5cGU6OkEyRFBfSEFSRFdBUkVfT0ZGTE9BRF9EQVRBUEFUSCk7Ci0gIGNsaWVudGlmX3NpbmtfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UodGVzdF9zaW5rX3RyYW5zcG9ydF8sIG51bGxwdHIpOwotICBhdXRvIGFwdHhfaGRfY29kZWNfY29uZmlncyA9Ci0gICAgICBBcHR4Q29kZWNDb25maWd1cmF0aW9uc0dlbmVyYXRvcihDb2RlY1R5cGU6OkFQVFhfSEQpOwotICBmb3IgKGF1dG8gY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlIDogQ29kZWNPZmZsb2FkaW5nUHJlZmVyZW5jZUdlbmVyYXRvcigKLSAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hEKSkgewotICAgIFVwZGF0ZU9mZmxvYWRpbmdDYXBhYmlsaXRpZXMoY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlLnByZWZlcmVuY2VfKTsKLSAgICBmb3IgKENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgOiBhcHR4X2hkX2NvZGVjX2NvbmZpZ3MpIHsKLSAgICAgIGlmIChJc0NvZGVjT2ZmbG9hZGluZ1N1cHBvcnRlZChjb2RlY19jb25maWcpICYmCi0gICAgICAgICAgY29kZWNfb2ZmbG9hZGluZ19wcmVmZXJlbmNlLmlzX3RhcmdldF9jb2RlY19pbmNsdWRlZF8pIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoSXNDb2RlY09mZmxvYWRpbmdFbmFibGVkKGNvZGVjX2NvbmZpZykpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX0ZBTFNFKElzQ29kZWNPZmZsb2FkaW5nRW5hYmxlZChjb2RlY19jb25maWcpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlVGVzdCwgU3RhcnRBbmRFbmRBMmRwT2ZmbG9hZEFwdHhIZFNlc3Npb24pIHsKLSAgdGVzdF9zaW5rX3RyYW5zcG9ydF8gPQotICAgICAgbmV3IFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICBjbGllbnRpZl9zaW5rXyA9Ci0gICAgICBuZXcgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKHRlc3Rfc2lua190cmFuc3BvcnRfLCBudWxscHRyKTsKLSAgQXVkaW9Db25maWd1cmF0aW9uIGF1ZGlvX2NvbmZpZyA9IHt9OwotICBmb3IgKENvZGVjQ29uZmlndXJhdGlvbiBjb2RlY19jb25maWcgOgotICAgICAgIEFwdHhDb2RlY0NvbmZpZ3VyYXRpb25zR2VuZXJhdG9yKENvZGVjVHlwZTo6QVBUWF9IRCkpIHsKLSAgICBhdWRpb19jb25maWcuY29kZWNDb25maWcoY29kZWNfY29uZmlnKTsKLSAgICBjbGllbnRpZl9zaW5rXy0+VXBkYXRlQXVkaW9Db25maWcoYXVkaW9fY29uZmlnKTsKLSAgICBpZiAoSXNDb2RlY09mZmxvYWRpbmdTdXBwb3J0ZWQoY29kZWNfY29uZmlnKSkgewotICAgICAgQVNTRVJUX0VRKGNsaWVudGlmX3NpbmtfLT5TdGFydFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9ORShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoY2xpZW50aWZfc2lua18tPkVuZFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gIH0KLX0KLQotVEVTVF9GKEJsdWV0b290aEF1ZGlvQ2xpZW50SW50ZXJmYWNlVGVzdCwKLSAgICAgICBTdGFydEFuZEVuZEEyZHBPZmZsb2FkVW5rbm93blNlc3Npb24pIHsKLSAgdGVzdF9zaW5rX3RyYW5zcG9ydF8gPQotICAgICAgbmV3IFRlc3RTaW5rVHJhbnNwb3J0KFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICBjbGllbnRpZl9zaW5rXyA9Ci0gICAgICBuZXcgQmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKHRlc3Rfc2lua190cmFuc3BvcnRfLCBudWxscHRyKTsKLSAgQXVkaW9Db25maWd1cmF0aW9uIGF1ZGlvX2NvbmZpZyA9IHt9OwotICBDb2RlY0NvbmZpZ3VyYXRpb24gY29kZWNfY29uZmlnID0ge307Ci0gIGNvZGVjX2NvbmZpZy5jb2RlY1R5cGUgPSBDb2RlY1R5cGU6OlVOS05PV047Ci0gIGNvZGVjX2NvbmZpZy5wZWVyTXR1ID0gMTAwNTsKLSAgY29kZWNfY29uZmlnLmlzU2Ntc3RFbmFibGVkID0gZmFsc2U7Ci0gIGNvZGVjX2NvbmZpZy5lbmNvZGVkQXVkaW9CaXRyYXRlID0gMzI4MDAwOwotICBjb2RlY19jb25maWcuY29uZmlnID0ge307Ci0gIGF1ZGlvX2NvbmZpZy5jb2RlY0NvbmZpZyhjb2RlY19jb25maWcpOwotICBjbGllbnRpZl9zaW5rXy0+VXBkYXRlQXVkaW9Db25maWcoYXVkaW9fY29uZmlnKTsKLSAgaWYgKElzQ29kZWNPZmZsb2FkaW5nU3VwcG9ydGVkKGNvZGVjX2NvbmZpZykpIHsKLSAgICBBU1NFUlRfRVEoY2xpZW50aWZfc2lua18tPlN0YXJ0U2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgfSBlbHNlIHsKLSAgICBBU1NFUlRfTkUoY2xpZW50aWZfc2lua18tPlN0YXJ0U2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgfQotICBBU1NFUlRfRVEoY2xpZW50aWZfc2lua18tPkVuZFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsCi0gICAgICAgU3RhcnRBbmRFbmRIZWFyaW5nQWlkU29mdHdhcmVTZXNzaW9uKSB7Ci0gIHRlc3Rfc2lua190cmFuc3BvcnRfID0gbmV3IFRlc3RTaW5rVHJhbnNwb3J0KAotICAgICAgU2Vzc2lvblR5cGU6OkhFQVJJTkdfQUlEX1NPRlRXQVJFX0VOQ09ESU5HX0RBVEFQQVRIKTsKLSAgY2xpZW50aWZfc2lua18gPQotICAgICAgbmV3IEJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSh0ZXN0X3NpbmtfdHJhbnNwb3J0XywgbnVsbHB0cik7Ci0gIEF1ZGlvQ29uZmlndXJhdGlvbiBhdWRpb19jb25maWcgPSB7fTsKLSAgUGNtUGFyYW1ldGVycyBwY21fY29uZmlnID0ge307Ci0gIGZvciAoYXV0byBzYW1wbGVfcmF0ZV9wYWlyIDoga1NhbXBsZVJhdGVQYWlycykgewotICAgIHBjbV9jb25maWcuc2FtcGxlUmF0ZSA9IHNhbXBsZV9yYXRlX3BhaXIuaGFsX3NhbXBsZV9yYXRlXzsKLSAgICBmb3IgKGF1dG8gYml0c19wZXJfc2FtcGxlX3BhaXIgOiBrQml0c1BlclNhbXBsZVBhaXJzKSB7Ci0gICAgICBwY21fY29uZmlnLmJpdHNQZXJTYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGVfcGFpci5oYWxfYml0c19wZXJfc2FtcGxlXzsKLSAgICAgIGZvciAoYXV0byBjaGFubmVsX21vZGVfcGFpciA6IGtDaGFubmVsTW9kZVBhaXJzKSB7Ci0gICAgICAgIHBjbV9jb25maWcuY2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGVfcGFpci5oYWxfY2hhbm5lbF9tb2RlXzsKLSAgICAgICAgYXVkaW9fY29uZmlnLnBjbUNvbmZpZyhwY21fY29uZmlnKTsKLSAgICAgICAgY2xpZW50aWZfc2lua18tPlVwZGF0ZUF1ZGlvQ29uZmlnKGF1ZGlvX2NvbmZpZyk7Ci0gICAgICAgIGlmIChJc1NvZnR3YXJlUGNtUGFyYW1ldGVyc1N1cHBvcnRlZChwY21fY29uZmlnKSkgewotICAgICAgICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFTU0VSVF9ORShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+RW5kU2Vzc2lvbigpLCBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICAgIH0gIC8vIENoYW5uZWxNb2RlCi0gICAgfSAgICAvLyBCaXRzUGVyU2FtcHBsZQotICB9ICAgICAgLy8gU2FtcGxlUmF0ZQotfQotCi1URVNUX0YoQmx1ZXRvb3RoQXVkaW9DbGllbnRJbnRlcmZhY2VUZXN0LAotICAgICAgIFN0YXJ0QW5kRW5kTGVBdWRpb0VuY29kaW5nU29mdHdhcmVTZXNzaW9uKSB7Ci0gIHRlc3Rfc2lua190cmFuc3BvcnRfID0gbmV3IFRlc3RTaW5rVHJhbnNwb3J0KAotICAgICAgU2Vzc2lvblR5cGVfMl8xOjpMRV9BVURJT19TT0ZUV0FSRV9FTkNPRElOR19EQVRBUEFUSCk7Ci0gIGNsaWVudGlmX3NpbmtfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UodGVzdF9zaW5rX3RyYW5zcG9ydF8sIG51bGxwdHIpOwotICBBdWRpb0NvbmZpZ3VyYXRpb25fMl8xIGF1ZGlvX2NvbmZpZyA9IHt9OwotICBQY21QYXJhbWV0ZXJzXzJfMSBwY21fY29uZmlnID0ge307Ci0gIGZvciAoYXV0byBzYW1wbGVfcmF0ZSA6IGtTYW1wbGVSYXRlc18yXzEpIHsKLSAgICBwY21fY29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVfcmF0ZTsKLSAgICBmb3IgKGF1dG8gYml0c19wZXJfc2FtcGxlX3BhaXIgOiBrQml0c1BlclNhbXBsZVBhaXJzKSB7Ci0gICAgICBwY21fY29uZmlnLmJpdHNQZXJTYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGVfcGFpci5oYWxfYml0c19wZXJfc2FtcGxlXzsKLSAgICAgIGZvciAoYXV0byBjaGFubmVsX21vZGVfcGFpciA6IGtDaGFubmVsTW9kZVBhaXJzKSB7Ci0gICAgICAgIHBjbV9jb25maWcuY2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGVfcGFpci5oYWxfY2hhbm5lbF9tb2RlXzsKLSAgICAgICAgZm9yIChhdXRvIGRhdGFfaW50ZXJ2YWxfdXMgOiBrRGF0YUludGVydmFsVXMpIHsKLSAgICAgICAgICBwY21fY29uZmlnLmRhdGFJbnRlcnZhbFVzID0gZGF0YV9pbnRlcnZhbF91czsKLSAgICAgICAgICBhdWRpb19jb25maWcucGNtQ29uZmlnKHBjbV9jb25maWcpOwotICAgICAgICAgIGNsaWVudGlmX3NpbmtfLT5VcGRhdGVBdWRpb0NvbmZpZ18yXzEoYXVkaW9fY29uZmlnKTsKLSAgICAgICAgICBpZiAoSXNTaW5rU29mdHdhcmVQY21QYXJhbWV0ZXJzXzJfMV9TdXBwb3J0ZWQocGNtX2NvbmZpZykpIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUShjbGllbnRpZl9zaW5rXy0+U3RhcnRTZXNzaW9uXzJfMSgpLAotICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoY2xpZW50aWZfc2lua18tPlN0YXJ0U2Vzc2lvbl8yXzEoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQVNTRVJUX0VRKGNsaWVudGlmX3NpbmtfLT5FbmRTZXNzaW9uKCksIGtDbGllbnRJZlJldHVyblN1Y2Nlc3MpOwotICAgICAgICB9ICAvLyBkYXRhSW50ZXJ2YWxVcwotICAgICAgfSAgICAvLyBDaGFubmVsTW9kZQotICAgIH0gICAgICAvLyBCaXRzUGVyU2FtcHBsZQotICB9ICAgICAgICAvLyBTYW1wbGVSYXRlCi19Ci0KLVRFU1RfRihCbHVldG9vdGhBdWRpb0NsaWVudEludGVyZmFjZVRlc3QsCi0gICAgICAgU3RhcnRBbmRFbmRMZUF1ZGlvRGVjb2RlZFNvZnR3YXJlU2Vzc2lvbikgewotICB0ZXN0X3NvdXJjZV90cmFuc3BvcnRfID0gbmV3IFRlc3RTb3VyY2VUcmFuc3BvcnQoCi0gICAgICBTZXNzaW9uVHlwZV8yXzE6OkxFX0FVRElPX1NPRlRXQVJFX0RFQ09ERURfREFUQVBBVEgpOwotICBjbGllbnRpZl9zb3VyY2VfID0KLSAgICAgIG5ldyBCbHVldG9vdGhBdWRpb1NvdXJjZUNsaWVudEludGVyZmFjZSh0ZXN0X3NvdXJjZV90cmFuc3BvcnRfLCBudWxscHRyKTsKLSAgQXVkaW9Db25maWd1cmF0aW9uXzJfMSBhdWRpb19jb25maWcgPSB7fTsKLSAgUGNtUGFyYW1ldGVyc18yXzEgcGNtX2NvbmZpZyA9IHt9OwotICBmb3IgKGF1dG8gc2FtcGxlX3JhdGUgOiBrU2FtcGxlUmF0ZXNfMl8xKSB7Ci0gICAgcGNtX2NvbmZpZy5zYW1wbGVSYXRlID0gc2FtcGxlX3JhdGU7Ci0gICAgZm9yIChhdXRvIGJpdHNfcGVyX3NhbXBsZV9wYWlyIDoga0JpdHNQZXJTYW1wbGVQYWlycykgewotICAgICAgcGNtX2NvbmZpZy5iaXRzUGVyU2FtcGxlID0gYml0c19wZXJfc2FtcGxlX3BhaXIuaGFsX2JpdHNfcGVyX3NhbXBsZV87Ci0gICAgICBmb3IgKGF1dG8gY2hhbm5lbF9tb2RlX3BhaXIgOiBrQ2hhbm5lbE1vZGVQYWlycykgewotICAgICAgICBwY21fY29uZmlnLmNoYW5uZWxNb2RlID0gY2hhbm5lbF9tb2RlX3BhaXIuaGFsX2NoYW5uZWxfbW9kZV87Ci0gICAgICAgIGZvciAoYXV0byBkYXRhX2ludGVydmFsX3VzIDoga0RhdGFJbnRlcnZhbFVzKSB7Ci0gICAgICAgICAgcGNtX2NvbmZpZy5kYXRhSW50ZXJ2YWxVcyA9IGRhdGFfaW50ZXJ2YWxfdXM7Ci0gICAgICAgICAgYXVkaW9fY29uZmlnLnBjbUNvbmZpZyhwY21fY29uZmlnKTsKLSAgICAgICAgICBjbGllbnRpZl9zb3VyY2VfLT5VcGRhdGVBdWRpb0NvbmZpZ18yXzEoYXVkaW9fY29uZmlnKTsKLSAgICAgICAgICBpZiAoSXNTb3VyY2VTb2Z0d2FyZVBjbVBhcmFtZXRlcnNfMl8xX1N1cHBvcnRlZChwY21fY29uZmlnKSkgewotICAgICAgICAgICAgQVNTRVJUX0VRKGNsaWVudGlmX3NvdXJjZV8tPlN0YXJ0U2Vzc2lvbl8yXzEoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNTRVJUX05FKGNsaWVudGlmX3NvdXJjZV8tPlN0YXJ0U2Vzc2lvbl8yXzEoKSwKLSAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50SWZSZXR1cm5TdWNjZXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQVNTRVJUX0VRKGNsaWVudGlmX3NvdXJjZV8tPkVuZFNlc3Npb24oKSwga0NsaWVudElmUmV0dXJuU3VjY2Vzcyk7Ci0gICAgICAgIH0gIC8vIGRhdGFJbnRlcnZhbFVzCi0gICAgICB9ICAgIC8vIENoYW5uZWxNb2RlCi0gICAgfSAgICAgIC8vIEJpdHNQZXJTYW1wcGxlCi0gIH0gICAgICAgIC8vIFNhbXBsZVJhdGUKLX0KZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY29kZWNfc3RhdHVzLmNjIGIvYXVkaW9faGFsX2ludGVyZmFjZS9jb2RlY19zdGF0dXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODcwNjYuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9jb2RlY19zdGF0dXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGgiCi0KLSNpbmNsdWRlICJjb2RlY19zdGF0dXMuaCIKLSNpbmNsdWRlICJjbGllbnRfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJhMmRwX2FhY19jb25zdGFudHMuaCIKLSNpbmNsdWRlICJhMmRwX3NiY19jb25zdGFudHMuaCIKLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9hcHR4X2NvbnN0YW50cy5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yX2FwdHhfaGRfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhY19jb25zdGFudHMuaCIKLSNpbmNsdWRlICJidGEvYXYvYnRhX2F2X2ludC5oIgotCi1uYW1lc3BhY2UgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpBYWNPYmplY3RUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6QWFjUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkFhY1ZhcmlhYmxlQml0UmF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkFwdHhQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6QXVkaW9DYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpCaXRzUGVyU2FtcGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Q2hhbm5lbE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpDb2RlY1R5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpMZGFjQ2hhbm5lbE1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpMZGFjUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkxkYWNRdWFsaXR5SW5kZXg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpTYW1wbGVSYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U2JjQWxsb2NNZXRob2Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpTYmNCbG9ja0xlbmd0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OlNiY0NoYW5uZWxNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U2JjTnVtU3ViYmFuZHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OmF1ZGlvOjpWMl8wOjpTYmNQYXJhbWV0ZXJzOwotCi0vLyBjYXBhYmlsaXRpZXMgZnJvbSBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2U6OkdldEF1ZGlvQ2FwYWJpbGl0aWVzKCkKLXN0ZDo6dmVjdG9yPEF1ZGlvQ2FwYWJpbGl0aWVzPiBhdWRpb19oYWxfY2FwYWJpbGl0aWVzKDApOwotLy8gY2FwYWJpbGl0aWVzIHRoYXQgYXVkaW8gSEFMIHN1cHBvcnRzIGFuZCBmcmFtZXdvcmtzIC8gQmx1ZXRvb3RoIFNvQyAvIHJ1bnRpbWUKLS8vIHByZWZlcmVuY2Ugd291bGQgbGlrZSB0byB1c2UuCi1zdGQ6OnZlY3RvcjxBdWRpb0NhcGFiaWxpdGllcz4gb2ZmbG9hZGluZ19wcmVmZXJlbmNlKDApOwotCi1ib29sIHNiY19vZmZsb2FkaW5nX2NhcGFiaWxpdHlfbWF0Y2goY29uc3QgU2JjUGFyYW1ldGVycyYgc2JjX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JjUGFyYW1ldGVycyYgc2JjX2NvbmZpZykgewotICBpZiAoKHN0YXRpY19jYXN0PFNhbXBsZVJhdGU+KHNiY19jYXBhYmlsaXR5LnNhbXBsZVJhdGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiY19jb25maWcuc2FtcGxlUmF0ZSkgPT0KLSAgICAgICBTYW1wbGVSYXRlOjpSQVRFX1VOS05PV04pIHx8Ci0gICAgICAoc3RhdGljX2Nhc3Q8U2JjQ2hhbm5lbE1vZGU+KHNiY19jYXBhYmlsaXR5LmNoYW5uZWxNb2RlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JjX2NvbmZpZy5jaGFubmVsTW9kZSkgPT0KLSAgICAgICBTYmNDaGFubmVsTW9kZTo6VU5LTk9XTikgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxTYmNCbG9ja0xlbmd0aD4oc2JjX2NhcGFiaWxpdHkuYmxvY2tMZW5ndGggJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmNfY29uZmlnLmJsb2NrTGVuZ3RoKSA9PQotICAgICAgIHN0YXRpY19jYXN0PFNiY0Jsb2NrTGVuZ3RoPigwKSkgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxTYmNOdW1TdWJiYW5kcz4oc2JjX2NhcGFiaWxpdHkubnVtU3ViYmFuZHMgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmNfY29uZmlnLm51bVN1YmJhbmRzKSA9PQotICAgICAgIHN0YXRpY19jYXN0PFNiY051bVN1YmJhbmRzPigwKSkgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxTYmNBbGxvY01ldGhvZD4oc2JjX2NhcGFiaWxpdHkuYWxsb2NNZXRob2QgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmNfY29uZmlnLmFsbG9jTWV0aG9kKSA9PQotICAgICAgIHN0YXRpY19jYXN0PFNiY0FsbG9jTWV0aG9kPigwKSkgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxCaXRzUGVyU2FtcGxlPihzYmNfY2FwYWJpbGl0eS5iaXRzUGVyU2FtcGxlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmNfY29uZmlnLmJpdHNQZXJTYW1wbGUpID09Ci0gICAgICAgQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOKSB8fAotICAgICAgKHNiY19jb25maWcubWluQml0cG9vbCA8IHNiY19jYXBhYmlsaXR5Lm1pbkJpdHBvb2wgfHwKLSAgICAgICBzYmNfY29uZmlnLm1heEJpdHBvb2wgPCBzYmNfY29uZmlnLm1pbkJpdHBvb2wgfHwKLSAgICAgICBzYmNfY2FwYWJpbGl0eS5tYXhCaXRwb29sIDwgc2JjX2NvbmZpZy5tYXhCaXRwb29sKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzb2Z0d2FyZSBjb2RlYz0iIDw8IHRvU3RyaW5nKHNiY19jb25maWcpCi0gICAgICAgICAgICAgICAgIDw8ICIgY2FwYWJpbGl0eT0iIDw8IHRvU3RyaW5nKHNiY19jYXBhYmlsaXR5KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBvZmZsb2FkaW5nIGNvZGVjPSIgPDwgdG9TdHJpbmcoc2JjX2NvbmZpZykKLSAgICAgICAgICA8PCAiIGNhcGFiaWxpdHk9IiA8PCB0b1N0cmluZyhzYmNfY2FwYWJpbGl0eSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFhY19vZmZsb2FkaW5nX2NhcGFiaWxpdHlfbWF0Y2goY29uc3QgQWFjUGFyYW1ldGVycyYgYWFjX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWFjUGFyYW1ldGVycyYgYWFjX2NvbmZpZykgewotICBpZiAoKHN0YXRpY19jYXN0PEFhY09iamVjdFR5cGU+KGFhY19jYXBhYmlsaXR5Lm9iamVjdFR5cGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY19jb25maWcub2JqZWN0VHlwZSkgPT0KLSAgICAgICBzdGF0aWNfY2FzdDxBYWNPYmplY3RUeXBlPigwKSkgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxTYW1wbGVSYXRlPihhYWNfY2FwYWJpbGl0eS5zYW1wbGVSYXRlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNfY29uZmlnLnNhbXBsZVJhdGUpID09Ci0gICAgICAgU2FtcGxlUmF0ZTo6UkFURV9VTktOT1dOKSB8fAotICAgICAgKHN0YXRpY19jYXN0PENoYW5uZWxNb2RlPihhYWNfY2FwYWJpbGl0eS5jaGFubmVsTW9kZSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY19jb25maWcuY2hhbm5lbE1vZGUpID09Ci0gICAgICAgQ2hhbm5lbE1vZGU6OlVOS05PV04pIHx8Ci0gICAgICAoYWFjX2NhcGFiaWxpdHkudmFyaWFibGVCaXRSYXRlRW5hYmxlZCAhPSBBYWNWYXJpYWJsZUJpdFJhdGU6OkVOQUJMRUQgJiYKLSAgICAgICBhYWNfY29uZmlnLnZhcmlhYmxlQml0UmF0ZUVuYWJsZWQgIT0gQWFjVmFyaWFibGVCaXRSYXRlOjpESVNBQkxFRCkgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxCaXRzUGVyU2FtcGxlPihhYWNfY2FwYWJpbGl0eS5iaXRzUGVyU2FtcGxlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNfY29uZmlnLmJpdHNQZXJTYW1wbGUpID09Ci0gICAgICAgQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzb2Z0d2FyZSBjb2RlYz0iIDw8IHRvU3RyaW5nKGFhY19jb25maWcpCi0gICAgICAgICAgICAgICAgIDw8ICIgY2FwYWJpbGl0eT0iIDw8IHRvU3RyaW5nKGFhY19jYXBhYmlsaXR5KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBvZmZsb2FkaW5nIGNvZGVjPSIgPDwgdG9TdHJpbmcoYWFjX2NvbmZpZykKLSAgICAgICAgICA8PCAiIGNhcGFiaWxpdHk9IiA8PCB0b1N0cmluZyhhYWNfY2FwYWJpbGl0eSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwdHhfb2ZmbG9hZGluZ19jYXBhYmlsaXR5X21hdGNoKGNvbnN0IEFwdHhQYXJhbWV0ZXJzJiBhcHR4X2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFwdHhQYXJhbWV0ZXJzJiBhcHR4X2NvbmZpZykgewotICBpZiAoKHN0YXRpY19jYXN0PFNhbXBsZVJhdGU+KGFwdHhfY2FwYWJpbGl0eS5zYW1wbGVSYXRlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHR4X2NvbmZpZy5zYW1wbGVSYXRlKSA9PQotICAgICAgIFNhbXBsZVJhdGU6OlJBVEVfVU5LTk9XTikgfHwKLSAgICAgIChzdGF0aWNfY2FzdDxDaGFubmVsTW9kZT4oYXB0eF9jYXBhYmlsaXR5LmNoYW5uZWxNb2RlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXB0eF9jb25maWcuY2hhbm5lbE1vZGUpID09Ci0gICAgICAgQ2hhbm5lbE1vZGU6OlVOS05PV04pIHx8Ci0gICAgICAoc3RhdGljX2Nhc3Q8Qml0c1BlclNhbXBsZT4oYXB0eF9jYXBhYmlsaXR5LmJpdHNQZXJTYW1wbGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwdHhfY29uZmlnLmJpdHNQZXJTYW1wbGUpID09Ci0gICAgICAgQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzb2Z0d2FyZSBjb2RlYz0iIDw8IHRvU3RyaW5nKGFwdHhfY29uZmlnKQotICAgICAgICAgICAgICAgICA8PCAiIGNhcGFiaWxpdHk9IiA8PCB0b1N0cmluZyhhcHR4X2NhcGFiaWxpdHkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IG9mZmxvYWRpbmcgY29kZWM9IiA8PCB0b1N0cmluZyhhcHR4X2NvbmZpZykKLSAgICAgICAgICA8PCAiIGNhcGFiaWxpdHk9IiA8PCB0b1N0cmluZyhhcHR4X2NhcGFiaWxpdHkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBsZGFjX29mZmxvYWRpbmdfY2FwYWJpbGl0eV9tYXRjaChjb25zdCBMZGFjUGFyYW1ldGVycyYgbGRhY19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMZGFjUGFyYW1ldGVycyYgbGRhY19jb25maWcpIHsKLSAgaWYgKChzdGF0aWNfY2FzdDxTYW1wbGVSYXRlPihsZGFjX2NhcGFiaWxpdHkuc2FtcGxlUmF0ZSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRhY19jb25maWcuc2FtcGxlUmF0ZSkgPT0KLSAgICAgICBTYW1wbGVSYXRlOjpSQVRFX1VOS05PV04pIHx8Ci0gICAgICAoc3RhdGljX2Nhc3Q8TGRhY0NoYW5uZWxNb2RlPihsZGFjX2NhcGFiaWxpdHkuY2hhbm5lbE1vZGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRhY19jb25maWcuY2hhbm5lbE1vZGUpID09Ci0gICAgICAgTGRhY0NoYW5uZWxNb2RlOjpVTktOT1dOKSB8fAotICAgICAgKHN0YXRpY19jYXN0PEJpdHNQZXJTYW1wbGU+KGxkYWNfY2FwYWJpbGl0eS5iaXRzUGVyU2FtcGxlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGFjX2NvbmZpZy5iaXRzUGVyU2FtcGxlKSA9PQotICAgICAgIEJpdHNQZXJTYW1wbGU6OkJJVFNfVU5LTk9XTikpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc29mdHdhcmUgY29kZWM9IiA8PCB0b1N0cmluZyhsZGFjX2NvbmZpZykKLSAgICAgICAgICAgICAgICAgPDwgIiBjYXBhYmlsaXR5PSIgPDwgdG9TdHJpbmcobGRhY19jYXBhYmlsaXR5KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBvZmZsb2FkaW5nIGNvZGVjPSIgPDwgdG9TdHJpbmcobGRhY19jb25maWcpCi0gICAgICAgICAgPDwgIiBjYXBhYmlsaXR5PSIgPDwgdG9TdHJpbmcobGRhY19jYXBhYmlsaXR5KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGNvZGVjIHsKLQotY29uc3QgQ29kZWNDb25maWd1cmF0aW9uIGtJbnZhbGlkQ29kZWNDb25maWd1cmF0aW9uID0gewotICAgIC5jb2RlY1R5cGUgPSBDb2RlY1R5cGU6OlVOS05PV04sCi0gICAgLmVuY29kZWRBdWRpb0JpdHJhdGUgPSAweDAwMDAwMDAwLAotICAgIC5wZWVyTXR1ID0gMHhmZmZmLAotICAgIC5pc1NjbXN0RW5hYmxlZCA9IGZhbHNlLAotICAgIC5jb25maWcgPSB7fX07Ci0KLVNhbXBsZVJhdGUgQTJkcENvZGVjVG9IYWxTYW1wbGVSYXRlKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgYTJkcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChhMmRwX2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGU6OlJBVEVfNDQxMDA7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICByZXR1cm4gU2FtcGxlUmF0ZTo6UkFURV80ODAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlOjpSQVRFXzg4MjAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGU6OlJBVEVfOTYwMDA7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGU6OlJBVEVfMTc2NDAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlOjpSQVRFXzE5MjAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNjAwMDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlOjpSQVRFXzE2MDAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGU6OlJBVEVfMjQwMDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlOjpSQVRFX1VOS05PV047Ci0gIH0KLX0KLQotQml0c1BlclNhbXBsZSBBMmRwQ29kZWNUb0hhbEJpdHNQZXJTYW1wbGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBhMmRwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKGEyZHBfY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlOjpCSVRTXzE2OwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDoKLSAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlOjpCSVRTXzI0OwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlOjpCSVRTXzMyOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOOwotICB9Ci19Ci0KLUNoYW5uZWxNb2RlIEEyZHBDb2RlY1RvSGFsQ2hhbm5lbE1vZGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBhMmRwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKGEyZHBfY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgcmV0dXJuIENoYW5uZWxNb2RlOjpNT05POwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICByZXR1cm4gQ2hhbm5lbE1vZGU6OlNURVJFTzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIENoYW5uZWxNb2RlOjpVTktOT1dOOwotICB9Ci19Ci0KLWJvb2wgQTJkcFNiY1RvSGFsQ29uZmlnKENvZGVjQ29uZmlndXJhdGlvbiogY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvbmZpZykgewotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY3VycmVudF9jb2RlYyA9IGEyZHBfY29uZmlnLT5nZXRDb2RlY0NvbmZpZygpOwotICBpZiAoY3VycmVudF9jb2RlYy5jb2RlY190eXBlICE9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDICYmCi0gICAgICBjdXJyZW50X2NvZGVjLmNvZGVjX3R5cGUgIT0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDKSB7Ci0gICAgKmNvZGVjX2NvbmZpZyA9IHt9OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB0QlRfQTJEUF9PRkZMT0FEIGEyZHBfb2ZmbG9hZDsKLSAgYTJkcF9jb25maWctPmdldENvZGVjU3BlY2lmaWNDb25maWcoJmEyZHBfb2ZmbG9hZCk7Ci0gIGNvZGVjX2NvbmZpZy0+Y29kZWNUeXBlID0gQ29kZWNUeXBlOjpTQkM7Ci0gIGNvZGVjX2NvbmZpZy0+Y29uZmlnLnNiY0NvbmZpZyh7fSk7Ci0gIGF1dG8gc2JjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZy0+Y29uZmlnLnNiY0NvbmZpZygpOwotICBzYmNfY29uZmlnLnNhbXBsZVJhdGUgPSBBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoY3VycmVudF9jb2RlYyk7Ci0gIGlmIChzYmNfY29uZmlnLnNhbXBsZVJhdGUgPT0gU2FtcGxlUmF0ZTo6UkFURV9VTktOT1dOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogVW5rbm93biBTQkMgc2FtcGxlX3JhdGU9IiA8PCBjdXJyZW50X2NvZGVjLnNhbXBsZV9yYXRlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50OF90IGNoYW5uZWxfbW9kZSA9IGEyZHBfb2ZmbG9hZC5jb2RlY19pbmZvWzNdICYgQTJEUF9TQkNfSUVfQ0hfTURfTVNLOwotICBzd2l0Y2ggKGNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQ6Ci0gICAgICBzYmNfY29uZmlnLmNoYW5uZWxNb2RlID0gU2JjQ2hhbm5lbE1vZGU6OkpPSU5UX1NURVJFTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfQ0hfTURfU1RFUkVPOgotICAgICAgc2JjX2NvbmZpZy5jaGFubmVsTW9kZSA9IFNiY0NoYW5uZWxNb2RlOjpTVEVSRU87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0NIX01EX0RVQUw6Ci0gICAgICBzYmNfY29uZmlnLmNoYW5uZWxNb2RlID0gU2JjQ2hhbm5lbE1vZGU6OkRVQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0NIX01EX01PTk86Ci0gICAgICBzYmNfY29uZmlnLmNoYW5uZWxNb2RlID0gU2JjQ2hhbm5lbE1vZGU6Ok1PTk87Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmtub3duIFNCQyBjaGFubmVsX21vZGU9IiA8PCBjaGFubmVsX21vZGU7Ci0gICAgICBzYmNfY29uZmlnLmNoYW5uZWxNb2RlID0gU2JjQ2hhbm5lbE1vZGU6OlVOS05PV047Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDhfdCBibG9ja19sZW5ndGggPSBhMmRwX29mZmxvYWQuY29kZWNfaW5mb1swXSAmIEEyRFBfU0JDX0lFX0JMT0NLU19NU0s7Ci0gIHN3aXRjaCAoYmxvY2tfbGVuZ3RoKSB7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9CTE9DS1NfNDoKLSAgICAgIHNiY19jb25maWcuYmxvY2tMZW5ndGggPSBTYmNCbG9ja0xlbmd0aDo6QkxPQ0tTXzQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0JMT0NLU184OgotICAgICAgc2JjX2NvbmZpZy5ibG9ja0xlbmd0aCA9IFNiY0Jsb2NrTGVuZ3RoOjpCTE9DS1NfODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfQkxPQ0tTXzEyOgotICAgICAgc2JjX2NvbmZpZy5ibG9ja0xlbmd0aCA9IFNiY0Jsb2NrTGVuZ3RoOjpCTE9DS1NfMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0JMT0NLU18xNjoKLSAgICAgIHNiY19jb25maWcuYmxvY2tMZW5ndGggPSBTYmNCbG9ja0xlbmd0aDo6QkxPQ0tTXzE2OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBTQkMgYmxvY2tfbGVuZ3RoPSIgPDwgYmxvY2tfbGVuZ3RoOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQ4X3Qgc3ViX2JhbmRzID0gYTJkcF9vZmZsb2FkLmNvZGVjX2luZm9bMF0gJiBBMkRQX1NCQ19JRV9TVUJCQU5EX01TSzsKLSAgc3dpdGNoIChzdWJfYmFuZHMpIHsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX1NVQkJBTkRfNDoKLSAgICAgIHNiY19jb25maWcubnVtU3ViYmFuZHMgPSBTYmNOdW1TdWJiYW5kczo6U1VCQkFORF80OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9TVUJCQU5EXzg6Ci0gICAgICBzYmNfY29uZmlnLm51bVN1YmJhbmRzID0gU2JjTnVtU3ViYmFuZHM6OlNVQkJBTkRfODsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFVua25vd24gU0JDIFN1YmJhbmRzPSIgPDwgc3ViX2JhbmRzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQ4X3QgYWxsb2NfbWV0aG9kID0gYTJkcF9vZmZsb2FkLmNvZGVjX2luZm9bMF0gJiBBMkRQX1NCQ19JRV9BTExPQ19NRF9NU0s7Ci0gIHN3aXRjaCAoYWxsb2NfbWV0aG9kKSB7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9BTExPQ19NRF9TOgotICAgICAgc2JjX2NvbmZpZy5hbGxvY01ldGhvZCA9IFNiY0FsbG9jTWV0aG9kOjpBTExPQ19NRF9TOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9BTExPQ19NRF9MOgotICAgICAgc2JjX2NvbmZpZy5hbGxvY01ldGhvZCA9IFNiY0FsbG9jTWV0aG9kOjpBTExPQ19NRF9MOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBTQkMgYWxsb2NfbWV0aG9kPSIgPDwgYWxsb2NfbWV0aG9kOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHNiY19jb25maWcubWluQml0cG9vbCA9IGEyZHBfb2ZmbG9hZC5jb2RlY19pbmZvWzFdOwotICBzYmNfY29uZmlnLm1heEJpdHBvb2wgPSBhMmRwX29mZmxvYWQuY29kZWNfaW5mb1syXTsKLSAgc2JjX2NvbmZpZy5iaXRzUGVyU2FtcGxlID0gQTJkcENvZGVjVG9IYWxCaXRzUGVyU2FtcGxlKGN1cnJlbnRfY29kZWMpOwotICBpZiAoc2JjX2NvbmZpZy5iaXRzUGVyU2FtcGxlID09IEJpdHNQZXJTYW1wbGU6OkJJVFNfVU5LTk9XTikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBTQkMgYml0c19wZXJfc2FtcGxlPSIKLSAgICAgICAgICAgICAgIDw8IGN1cnJlbnRfY29kZWMuYml0c19wZXJfc2FtcGxlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb2RlY19jb25maWctPmNvbmZpZy5zYmNDb25maWcoc2JjX2NvbmZpZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyZHBBYWNUb0hhbENvbmZpZyhDb2RlY0NvbmZpZ3VyYXRpb24qIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb25maWcpIHsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGN1cnJlbnRfY29kZWMgPSBhMmRwX2NvbmZpZy0+Z2V0Q29kZWNDb25maWcoKTsKLSAgaWYgKGN1cnJlbnRfY29kZWMuY29kZWNfdHlwZSAhPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQyAmJgotICAgICAgY3VycmVudF9jb2RlYy5jb2RlY190eXBlICE9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQykgewotICAgICpjb2RlY19jb25maWcgPSB7fTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdEJUX0EyRFBfT0ZGTE9BRCBhMmRwX29mZmxvYWQ7Ci0gIGEyZHBfY29uZmlnLT5nZXRDb2RlY1NwZWNpZmljQ29uZmlnKCZhMmRwX29mZmxvYWQpOwotICBjb2RlY19jb25maWctPmNvZGVjVHlwZSA9IENvZGVjVHlwZTo6QUFDOwotICBjb2RlY19jb25maWctPmNvbmZpZy5hYWNDb25maWcoe30pOwotICBhdXRvIGFhY19jb25maWcgPSBjb2RlY19jb25maWctPmNvbmZpZy5hYWNDb25maWcoKTsKLSAgdWludDhfdCBvYmplY3RfdHlwZSA9IGEyZHBfb2ZmbG9hZC5jb2RlY19pbmZvWzBdOwotICBzd2l0Y2ggKG9iamVjdF90eXBlKSB7Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQzoKLSAgICAgIGFhY19jb25maWcub2JqZWN0VHlwZSA9IEFhY09iamVjdFR5cGU6Ok1QRUcyX0xDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9MQzoKLSAgICAgIGFhY19jb25maWcub2JqZWN0VHlwZSA9IEFhY09iamVjdFR5cGU6Ok1QRUc0X0xDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9MVFA6Ci0gICAgICBhYWNfY29uZmlnLm9iamVjdFR5cGUgPSBBYWNPYmplY3RUeXBlOjpNUEVHNF9MVFA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X1NDQUxBQkxFOgotICAgICAgYWFjX2NvbmZpZy5vYmplY3RUeXBlID0gQWFjT2JqZWN0VHlwZTo6TVBFRzRfU0NBTEFCTEU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmtub3duIEFBQyBvYmplY3RfdHlwZT0iIDw8ICtvYmplY3RfdHlwZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhYWNfY29uZmlnLnNhbXBsZVJhdGUgPSBBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoY3VycmVudF9jb2RlYyk7Ci0gIGlmIChhYWNfY29uZmlnLnNhbXBsZVJhdGUgPT0gU2FtcGxlUmF0ZTo6UkFURV9VTktOT1dOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogVW5rbm93biBBQUMgc2FtcGxlX3JhdGU9IiA8PCBjdXJyZW50X2NvZGVjLnNhbXBsZV9yYXRlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhYWNfY29uZmlnLmNoYW5uZWxNb2RlID0gQTJkcENvZGVjVG9IYWxDaGFubmVsTW9kZShjdXJyZW50X2NvZGVjKTsKLSAgaWYgKGFhY19jb25maWcuY2hhbm5lbE1vZGUgPT0gQ2hhbm5lbE1vZGU6OlVOS05PV04pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBVbmtub3duIEFBQyBjaGFubmVsX21vZGU9IiA8PCBjdXJyZW50X2NvZGVjLmNoYW5uZWxfbW9kZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDhfdCB2YnJfZW5hYmxlZCA9Ci0gICAgICBhMmRwX29mZmxvYWQuY29kZWNfaW5mb1sxXSAmIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX01BU0s7Ci0gIHN3aXRjaCAodmJyX2VuYWJsZWQpIHsKLSAgICBjYXNlIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0VOQUJMRUQ6Ci0gICAgICBhYWNfY29uZmlnLnZhcmlhYmxlQml0UmF0ZUVuYWJsZWQgPSBBYWNWYXJpYWJsZUJpdFJhdGU6OkVOQUJMRUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0RJU0FCTEVEOgotICAgICAgYWFjX2NvbmZpZy52YXJpYWJsZUJpdFJhdGVFbmFibGVkID0gQWFjVmFyaWFibGVCaXRSYXRlOjpESVNBQkxFRDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFVua25vd24gQUFDIFZCUj0iIDw8ICt2YnJfZW5hYmxlZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhYWNfY29uZmlnLmJpdHNQZXJTYW1wbGUgPSBBMmRwQ29kZWNUb0hhbEJpdHNQZXJTYW1wbGUoY3VycmVudF9jb2RlYyk7Ci0gIGlmIChhYWNfY29uZmlnLmJpdHNQZXJTYW1wbGUgPT0gQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmtub3duIEFBQyBiaXRzX3Blcl9zYW1wbGU9IgotICAgICAgICAgICAgICAgPDwgY3VycmVudF9jb2RlYy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvZGVjX2NvbmZpZy0+Y29uZmlnLmFhY0NvbmZpZyhhYWNfY29uZmlnKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcEFwdHhUb0hhbENvbmZpZyhDb2RlY0NvbmZpZ3VyYXRpb24qIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29uZmlnKSB7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjdXJyZW50X2NvZGVjID0gYTJkcF9jb25maWctPmdldENvZGVjQ29uZmlnKCk7Ci0gIGlmIChjdXJyZW50X2NvZGVjLmNvZGVjX3R5cGUgIT0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYICYmCi0gICAgICBjdXJyZW50X2NvZGVjLmNvZGVjX3R5cGUgIT0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hEKSB7Ci0gICAgKmNvZGVjX2NvbmZpZyA9IHt9OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB0QlRfQTJEUF9PRkZMT0FEIGEyZHBfb2ZmbG9hZDsKLSAgYTJkcF9jb25maWctPmdldENvZGVjU3BlY2lmaWNDb25maWcoJmEyZHBfb2ZmbG9hZCk7Ci0gIGlmIChjdXJyZW50X2NvZGVjLmNvZGVjX3R5cGUgPT0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYKSB7Ci0gICAgY29kZWNfY29uZmlnLT5jb2RlY1R5cGUgPSBDb2RlY1R5cGU6OkFQVFg7Ci0gIH0gZWxzZSB7Ci0gICAgY29kZWNfY29uZmlnLT5jb2RlY1R5cGUgPSBDb2RlY1R5cGU6OkFQVFhfSEQ7Ci0gIH0KLSAgY29kZWNfY29uZmlnLT5jb25maWcuYXB0eENvbmZpZyh7fSk7Ci0gIGF1dG8gYXB0eF9jb25maWcgPSBjb2RlY19jb25maWctPmNvbmZpZy5hcHR4Q29uZmlnKCk7Ci0gIGFwdHhfY29uZmlnLnNhbXBsZVJhdGUgPSBBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoY3VycmVudF9jb2RlYyk7Ci0gIGlmIChhcHR4X2NvbmZpZy5zYW1wbGVSYXRlID09IFNhbXBsZVJhdGU6OlJBVEVfVU5LTk9XTikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IFVua25vd24gYXB0WCBzYW1wbGVfcmF0ZT0iIDw8IGN1cnJlbnRfY29kZWMuc2FtcGxlX3JhdGU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGFwdHhfY29uZmlnLmNoYW5uZWxNb2RlID0gQTJkcENvZGVjVG9IYWxDaGFubmVsTW9kZShjdXJyZW50X2NvZGVjKTsKLSAgaWYgKGFwdHhfY29uZmlnLmNoYW5uZWxNb2RlID09IENoYW5uZWxNb2RlOjpVTktOT1dOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogVW5rbm93biBhcHRYIGNoYW5uZWxfbW9kZT0iIDw8IGN1cnJlbnRfY29kZWMuY2hhbm5lbF9tb2RlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhcHR4X2NvbmZpZy5iaXRzUGVyU2FtcGxlID0gQTJkcENvZGVjVG9IYWxCaXRzUGVyU2FtcGxlKGN1cnJlbnRfY29kZWMpOwotICBpZiAoYXB0eF9jb25maWcuYml0c1BlclNhbXBsZSA9PSBCaXRzUGVyU2FtcGxlOjpCSVRTX1VOS05PV04pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFVua25vd24gYXB0WCBiaXRzX3Blcl9zYW1wbGU9IgotICAgICAgICAgICAgICAgPDwgY3VycmVudF9jb2RlYy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvZGVjX2NvbmZpZy0+Y29uZmlnLmFwdHhDb25maWcoYXB0eF9jb25maWcpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMmRwTGRhY1RvSGFsQ29uZmlnKENvZGVjQ29uZmlndXJhdGlvbiogY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb25maWcpIHsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGN1cnJlbnRfY29kZWMgPSBhMmRwX2NvbmZpZy0+Z2V0Q29kZWNDb25maWcoKTsKLSAgaWYgKGN1cnJlbnRfY29kZWMuY29kZWNfdHlwZSAhPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUMpIHsKLSAgICBjb2RlY19jb25maWcgPSB7fTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdEJUX0EyRFBfT0ZGTE9BRCBhMmRwX29mZmxvYWQ7Ci0gIGEyZHBfY29uZmlnLT5nZXRDb2RlY1NwZWNpZmljQ29uZmlnKCZhMmRwX29mZmxvYWQpOwotICBjb2RlY19jb25maWctPmNvZGVjVHlwZSA9IENvZGVjVHlwZTo6TERBQzsKLSAgY29kZWNfY29uZmlnLT5jb25maWcubGRhY0NvbmZpZyh7fSk7Ci0gIGF1dG8gbGRhY19jb25maWcgPSBjb2RlY19jb25maWctPmNvbmZpZy5sZGFjQ29uZmlnKCk7Ci0gIGxkYWNfY29uZmlnLnNhbXBsZVJhdGUgPSBBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoY3VycmVudF9jb2RlYyk7Ci0gIGlmIChsZGFjX2NvbmZpZy5zYW1wbGVSYXRlID09IFNhbXBsZVJhdGU6OlJBVEVfVU5LTk9XTikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IFVua25vd24gTERBQyBzYW1wbGVfcmF0ZT0iIDw8IGN1cnJlbnRfY29kZWMuc2FtcGxlX3JhdGU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN3aXRjaCAoYTJkcF9vZmZsb2FkLmNvZGVjX2luZm9bN10pIHsKLSAgICBjYXNlIEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgbGRhY19jb25maWcuY2hhbm5lbE1vZGUgPSBMZGFjQ2hhbm5lbE1vZGU6OlNURVJFTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9EVUFMOgotICAgICAgbGRhY19jb25maWcuY2hhbm5lbE1vZGUgPSBMZGFjQ2hhbm5lbE1vZGU6OkRVQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfTERBQ19DSEFOTkVMX01PREVfTU9OTzoKLSAgICAgIGxkYWNfY29uZmlnLmNoYW5uZWxNb2RlID0gTGRhY0NoYW5uZWxNb2RlOjpNT05POwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBMREFDIGNoYW5uZWxfbW9kZT0iCi0gICAgICAgICAgICAgICAgIDw8IGEyZHBfb2ZmbG9hZC5jb2RlY19pbmZvWzddOwotICAgICAgbGRhY19jb25maWcuY2hhbm5lbE1vZGUgPSBMZGFjQ2hhbm5lbE1vZGU6OlVOS05PV047Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3dpdGNoIChhMmRwX29mZmxvYWQuY29kZWNfaW5mb1s2XSkgewotICAgIGNhc2UgQTJEUF9MREFDX1FVQUxJVFlfSElHSDoKLSAgICAgIGxkYWNfY29uZmlnLnF1YWxpdHlJbmRleCA9IExkYWNRdWFsaXR5SW5kZXg6OlFVQUxJVFlfSElHSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQTJEUF9MREFDX1FVQUxJVFlfTUlEOgotICAgICAgbGRhY19jb25maWcucXVhbGl0eUluZGV4ID0gTGRhY1F1YWxpdHlJbmRleDo6UVVBTElUWV9NSUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfTERBQ19RVUFMSVRZX0xPVzoKLSAgICAgIGxkYWNfY29uZmlnLnF1YWxpdHlJbmRleCA9IExkYWNRdWFsaXR5SW5kZXg6OlFVQUxJVFlfTE9XOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX0xEQUNfUVVBTElUWV9BQlJfT0ZGTE9BRDoKLSAgICAgIGxkYWNfY29uZmlnLnF1YWxpdHlJbmRleCA9IExkYWNRdWFsaXR5SW5kZXg6OlFVQUxJVFlfQUJSOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBMREFDIFF1YWxpdHlJbmRleD0iCi0gICAgICAgICAgICAgICAgIDw8IGEyZHBfb2ZmbG9hZC5jb2RlY19pbmZvWzZdOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGxkYWNfY29uZmlnLmJpdHNQZXJTYW1wbGUgPSBBMmRwQ29kZWNUb0hhbEJpdHNQZXJTYW1wbGUoY3VycmVudF9jb2RlYyk7Ci0gIGlmIChsZGFjX2NvbmZpZy5iaXRzUGVyU2FtcGxlID09IEJpdHNQZXJTYW1wbGU6OkJJVFNfVU5LTk9XTikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBMREFDIGJpdHNfcGVyX3NhbXBsZT0iCi0gICAgICAgICAgICAgICA8PCBjdXJyZW50X2NvZGVjLmJpdHNfcGVyX3NhbXBsZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY29kZWNfY29uZmlnLT5jb25maWcubGRhY0NvbmZpZyhsZGFjX2NvbmZpZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVwZGF0ZU9mZmxvYWRpbmdDYXBhYmlsaXRpZXMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgZnJhbWV3b3JrX3ByZWZlcmVuY2UpIHsKLSAgYXVkaW9faGFsX2NhcGFiaWxpdGllcyA9Ci0gICAgICBCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2U6OkdldEF1ZGlvQ2FwYWJpbGl0aWVzKAotICAgICAgICAgIFNlc3Npb25UeXBlOjpBMkRQX0hBUkRXQVJFX09GRkxPQURfREFUQVBBVEgpOwotICB1aW50MzJfdCBjb2RlY190eXBlX21hc2tzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KENvZGVjVHlwZTo6VU5LTk9XTik7Ci0gIGZvciAoYXV0byBwcmVmZXJlbmNlIDogZnJhbWV3b3JrX3ByZWZlcmVuY2UpIHsKLSAgICBzd2l0Y2ggKHByZWZlcmVuY2UuY29kZWNfdHlwZSkgewotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzoKLSAgICAgICAgY29kZWNfdHlwZV9tYXNrcyB8PSBDb2RlY1R5cGU6OlNCQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDOgotICAgICAgICBjb2RlY190eXBlX21hc2tzIHw9IENvZGVjVHlwZTo6QUFDOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYOgotICAgICAgICBjb2RlY190eXBlX21hc2tzIHw9IENvZGVjVHlwZTo6QVBUWDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRDoKLSAgICAgICAgY29kZWNfdHlwZV9tYXNrcyB8PSBDb2RlY1R5cGU6OkFQVFhfSEQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM6Ci0gICAgICAgIGNvZGVjX3R5cGVfbWFza3MgfD0gQ29kZWNUeXBlOjpMREFDOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDOgotICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQzoKLSAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19MREFDOgotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IElnbm9yZSBzaW5rIGNvZGVjX3R5cGU9IiA8PCBwcmVmZXJlbmNlLmNvZGVjX3R5cGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOgotICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogVW5rbm93biBjb2RlY190eXBlPSIgPDwgcHJlZmVyZW5jZS5jb2RlY190eXBlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIG9mZmxvYWRpbmdfcHJlZmVyZW5jZS5jbGVhcigpOwotICBmb3IgKGF1dG8gY2FwYWJpbGl0eSA6IGF1ZGlvX2hhbF9jYXBhYmlsaXRpZXMpIHsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8Q29kZWNUeXBlPihjYXBhYmlsaXR5LmNvZGVjQ2FwYWJpbGl0aWVzKCkuY29kZWNUeXBlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlX21hc2tzKSAhPSBDb2RlY1R5cGU6OlVOS05PV04pIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgIDw8ICI6IGVuYWJsZWQgb2ZmbG9hZGluZyBjYXBhYmlsaXR5PSIgPDwgdG9TdHJpbmcoY2FwYWJpbGl0eSk7Ci0gICAgICBvZmZsb2FkaW5nX3ByZWZlcmVuY2UucHVzaF9iYWNrKGNhcGFiaWxpdHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiOiBkaXNhYmxlZCBvZmZsb2FkaW5nIGNhcGFiaWxpdHk9IiA8PCB0b1N0cmluZyhjYXBhYmlsaXR5KTsKLSAgICB9Ci0gIH0KLSAgLy8gVE9ETzogQmx1ZXRvb3RoIFNvQyBhbmQgcnVudGltZSBwcm9wZXJ0eQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQ2hlY2sgd2hldGhlciB0aGlzIGNvZGVjIGlzIHN1cHBvcnRlZCBieSB0aGUgYXVkaW8gSEFMIGFuZCBpcyBhbGxvd2VkIHRvIHVzZQotLy8gYnkgcHJlZmVybmVjZSBvZiBmcmFtZXdvcmsgLyBCbHVldG9vdGggU29DIC8gcnVudGltZSBwcm9wZXJ0eS4KLWJvb2wgSXNDb2RlY09mZmxvYWRpbmdFbmFibGVkKGNvbnN0IENvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNfY29uZmlnKSB7Ci0gIGZvciAoYXV0byBwcmVmZXJlbmNlIDogb2ZmbG9hZGluZ19wcmVmZXJlbmNlKSB7Ci0gICAgaWYgKGNvZGVjX2NvbmZpZy5jb2RlY1R5cGUgIT0gcHJlZmVyZW5jZS5jb2RlY0NhcGFiaWxpdGllcygpLmNvZGVjVHlwZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGF1dG8gY29kZWNfY2FwYWJpbGl0eSA9IHByZWZlcmVuY2UuY29kZWNDYXBhYmlsaXRpZXMoKTsKLSAgICBzd2l0Y2ggKGNvZGVjX2NhcGFiaWxpdHkuY29kZWNUeXBlKSB7Ci0gICAgICBjYXNlIENvZGVjVHlwZTo6U0JDOiB7Ci0gICAgICAgIGF1dG8gc2JjX2NhcGFiaWxpdHkgPSBjb2RlY19jYXBhYmlsaXR5LmNhcGFiaWxpdGllcy5zYmNDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgYXV0byBzYmNfY29uZmlnID0gY29kZWNfY29uZmlnLmNvbmZpZy5zYmNDb25maWcoKTsKLSAgICAgICAgcmV0dXJuIHNiY19vZmZsb2FkaW5nX2NhcGFiaWxpdHlfbWF0Y2goc2JjX2NhcGFiaWxpdHksIHNiY19jb25maWcpOwotICAgICAgfQotICAgICAgY2FzZSBDb2RlY1R5cGU6OkFBQzogewotICAgICAgICBhdXRvIGFhY19jYXBhYmlsaXR5ID0gY29kZWNfY2FwYWJpbGl0eS5jYXBhYmlsaXRpZXMuYWFjQ2FwYWJpbGl0aWVzKCk7Ci0gICAgICAgIGF1dG8gYWFjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZy5jb25maWcuYWFjQ29uZmlnKCk7Ci0gICAgICAgIHJldHVybiBhYWNfb2ZmbG9hZGluZ19jYXBhYmlsaXR5X21hdGNoKGFhY19jYXBhYmlsaXR5LCBhYWNfY29uZmlnKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ29kZWNUeXBlOjpBUFRYOgotICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICBjYXNlIENvZGVjVHlwZTo6QVBUWF9IRDogewotICAgICAgICBhdXRvIGFwdHhfY2FwYWJpbGl0eSA9IGNvZGVjX2NhcGFiaWxpdHkuY2FwYWJpbGl0aWVzLmFwdHhDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgYXV0byBhcHR4X2NvbmZpZyA9IGNvZGVjX2NvbmZpZy5jb25maWcuYXB0eENvbmZpZygpOwotICAgICAgICByZXR1cm4gYXB0eF9vZmZsb2FkaW5nX2NhcGFiaWxpdHlfbWF0Y2goYXB0eF9jYXBhYmlsaXR5LCBhcHR4X2NvbmZpZyk7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvZGVjVHlwZTo6TERBQzogewotICAgICAgICBhdXRvIGxkYWNfY2FwYWJpbGl0eSA9IGNvZGVjX2NhcGFiaWxpdHkuY2FwYWJpbGl0aWVzLmxkYWNDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgYXV0byBsZGFjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZy5jb25maWcubGRhY0NvbmZpZygpOwotICAgICAgICByZXR1cm4gbGRhY19vZmZsb2FkaW5nX2NhcGFiaWxpdHlfbWF0Y2gobGRhY19jYXBhYmlsaXR5LCBsZGFjX2NvbmZpZyk7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvZGVjVHlwZTo6VU5LTk9XTjoKLSAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmtub3duIGNvZGVjVHlwZT0iCi0gICAgICAgICAgICAgICAgICAgPDwgdG9TdHJpbmcoY29kZWNfY2FwYWJpbGl0eS5jb2RlY1R5cGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzb2Z0d2FyZSBjb2RlYz0iIDw8IHRvU3RyaW5nKGNvZGVjX2NvbmZpZyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvZGVjCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY29kZWNfc3RhdHVzLmggYi9hdWRpb19oYWxfaW50ZXJmYWNlL2NvZGVjX3N0YXR1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI1OTFiLi4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvY29kZWNfc3RhdHVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoL2F1ZGlvLzIuMS90eXBlcy5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGNvZGVjIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Qml0c1BlclNhbXBsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkNoYW5uZWxNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Q29kZWNDb25maWd1cmF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6U2FtcGxlUmF0ZTsKLQotZXh0ZXJuIGNvbnN0IENvZGVjQ29uZmlndXJhdGlvbiBrSW52YWxpZENvZGVjQ29uZmlndXJhdGlvbjsKLQotU2FtcGxlUmF0ZSBBMmRwQ29kZWNUb0hhbFNhbXBsZVJhdGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBhMmRwX2NvZGVjX2NvbmZpZyk7Ci1CaXRzUGVyU2FtcGxlIEEyZHBDb2RlY1RvSGFsQml0c1BlclNhbXBsZSgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGEyZHBfY29kZWNfY29uZmlnKTsKLUNoYW5uZWxNb2RlIEEyZHBDb2RlY1RvSGFsQ2hhbm5lbE1vZGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBhMmRwX2NvZGVjX2NvbmZpZyk7Ci0KLWJvb2wgQTJkcFNiY1RvSGFsQ29uZmlnKENvZGVjQ29uZmlndXJhdGlvbiogY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvbmZpZyk7Ci1ib29sIEEyZHBBYWNUb0hhbENvbmZpZyhDb2RlY0NvbmZpZ3VyYXRpb24qIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb25maWcpOwotYm9vbCBBMmRwQXB0eFRvSGFsQ29uZmlnKENvZGVjQ29uZmlndXJhdGlvbiogY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb25maWcpOwotYm9vbCBBMmRwTGRhY1RvSGFsQ29uZmlnKENvZGVjQ29uZmlndXJhdGlvbiogY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb25maWcpOwotCi1ib29sIFVwZGF0ZU9mZmxvYWRpbmdDYXBhYmlsaXRpZXMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgZnJhbWV3b3JrX3ByZWZlcmVuY2UpOwotLy8gQ2hlY2sgd2hldGhlciB0aGlzIGNvZGVjIGlzIHN1cHBvcnRlZCBieSB0aGUgYXVkaW8gSEFMIGFuZCBpcyBhbGxvd2VkIHRvIHVzZQotLy8gYnkgcHJlZmVybmVjZSBvZiBmcmFtZXdvcmsgLyBCbHVldG9vdGggU29DIC8gcnVudGltZSBwcm9wZXJ0eS4KLWJvb2wgSXNDb2RlY09mZmxvYWRpbmdFbmFibGVkKGNvbnN0IENvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNfY29uZmlnKTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvZGVjCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvaGFsX3ZlcnNpb25fbWFuYWdlci5oIGIvYXVkaW9faGFsX2ludGVyZmFjZS9oYWxfdmVyc2lvbl9tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OWVhM2UuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9oYWxfdmVyc2lvbl9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2JsdWV0b290aC9hdWRpby8yLjEvSUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoL2F1ZGlvLzIuMS90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF1ZGlvIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLXVzaW5nIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3RvcnlfMl8wID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjoKLSAgICBhdWRpbzo6VjJfMDo6SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeTsKLXVzaW5nIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3RvcnlfMl8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjoKLSAgICBhdWRpbzo6VjJfMTo6SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeTsKLQotY29uc3RleHByIGNoYXIga0Z1bGx5UXVhbGlmaWVkSW50ZXJmYWNlTmFtZV8yXzBbXSA9Ci0gICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMDo6SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeSI7Ci1jb25zdGV4cHIgY2hhciBrRnVsbHlRdWFsaWZpZWRJbnRlcmZhY2VOYW1lXzJfMVtdID0KLSAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4xOjpJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5IjsKLQotZW51bSBjbGFzcyBCbHVldG9vdGhBdWRpb0hhbFZlcnNpb24gOiB1aW50OF90IHsKLSAgVkVSU0lPTl8yXzAgPSAwLAotICBWRVJTSU9OXzJfMSwKLSAgVkVSU0lPTl9VTkFWQUlMQUJMRSwKLX07Ci0KLWNsYXNzIEhhbFZlcnNpb25NYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBCbHVldG9vdGhBdWRpb0hhbFZlcnNpb24gR2V0SGFsVmVyc2lvbigpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQoaW5zdGFuY2VfcHRyLT5tdXRleF8pOwotICAgIHJldHVybiBpbnN0YW5jZV9wdHItPmhhbF92ZXJzaW9uXzsKLSAgfQotCi0gIHN0YXRpYyBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5XzJfMT4KLSAgR2V0UHJvdmlkZXJzRmFjdG9yeV8yXzEoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKGluc3RhbmNlX3B0ci0+bXV0ZXhfKTsKLSAgICBpZiAoaW5zdGFuY2VfcHRyLT5oYWxfdmVyc2lvbl8gIT0gQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OXzJfMSkgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3RvcnlfMl8xPiBwcm92aWRlcnNfZmFjdG9yeSA9Ci0gICAgICAgIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3RvcnlfMl8xOjpnZXRTZXJ2aWNlKCk7Ci0gICAgQ0hFQ0socHJvdmlkZXJzX2ZhY3RvcnkpCi0gICAgICAgIDw8ICJWMl8xOjpJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgZmFpbGVkIjsKLQotICAgIExPRyhJTkZPKSA8PCAiVjJfMTo6SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeTo6Z2V0U2VydmljZSgpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgPDwgcHJvdmlkZXJzX2ZhY3RvcnkuZ2V0KCkKLSAgICAgICAgICAgICAgPDwgKHByb3ZpZGVyc19mYWN0b3J5LT5pc1JlbW90ZSgpID8gIiAocmVtb3RlKSIgOiAiIChsb2NhbCkiKTsKLSAgICByZXR1cm4gcHJvdmlkZXJzX2ZhY3Rvcnk7Ci0gIH0KLQotICBzdGF0aWMgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeV8yXzA+Ci0gIEdldFByb3ZpZGVyc0ZhY3RvcnlfMl8wKCkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoaW5zdGFuY2VfcHRyLT5tdXRleF8pOwotICAgIGlmIChpbnN0YW5jZV9wdHItPmhhbF92ZXJzaW9uXyA9PSBCbHVldG9vdGhBdWRpb0hhbFZlcnNpb246OlZFUlNJT05fMl8xKSB7Ci0gICAgICBndWFyZC51bmxvY2soKTsKLSAgICAgIHJldHVybiBpbnN0YW5jZV9wdHItPkdldFByb3ZpZGVyc0ZhY3RvcnlfMl8xKCk7Ci0gICAgfQotICAgIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3RvcnlfMl8wPiBwcm92aWRlcnNfZmFjdG9yeSA9Ci0gICAgICAgIElCbHVldG9vdGhBdWRpb1Byb3ZpZGVyc0ZhY3RvcnlfMl8wOjpnZXRTZXJ2aWNlKCk7Ci0gICAgQ0hFQ0socHJvdmlkZXJzX2ZhY3RvcnkpCi0gICAgICAgIDw8ICJWMl8wOjpJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcnNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgZmFpbGVkIjsKLQotICAgIExPRyhJTkZPKSA8PCAiVjJfMDo6SUJsdWV0b290aEF1ZGlvUHJvdmlkZXJzRmFjdG9yeTo6Z2V0U2VydmljZSgpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgPDwgcHJvdmlkZXJzX2ZhY3RvcnkuZ2V0KCkKLSAgICAgICAgICAgICAgPDwgKHByb3ZpZGVyc19mYWN0b3J5LT5pc1JlbW90ZSgpID8gIiAocmVtb3RlKSIgOiAiIChsb2NhbCkiKTsKLSAgICBndWFyZC51bmxvY2soKTsKLSAgICByZXR1cm4gcHJvdmlkZXJzX2ZhY3Rvcnk7Ci0gIH0KLQotICBIYWxWZXJzaW9uTWFuYWdlcigpIHsKLSAgICBhdXRvIHNlcnZpY2VfbWFuYWdlciA9IGFuZHJvaWQ6OmhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKLSAgICBDSEVDSyhzZXJ2aWNlX21hbmFnZXIgIT0gbnVsbHB0cik7Ci0gICAgc2l6ZV90IGluc3RhbmNlX2NvdW50ID0gMDsKLSAgICBhdXRvIGxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlX2NiID0KLSAgICAgICAgWyZpbnN0YW5jZV9jb3VudF0oCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBpbnN0YW5jZU5hbWVzKSB7Ci0gICAgICAgICAgaW5zdGFuY2VfY291bnQgPSBpbnN0YW5jZU5hbWVzLnNpemUoKTsKLSAgICAgICAgfTsKLSAgICBhdXRvIGhpZGxfcmV0dmFsID0gc2VydmljZV9tYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKLSAgICAgICAga0Z1bGx5UXVhbGlmaWVkSW50ZXJmYWNlTmFtZV8yXzEsIGxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlX2NiKTsKLSAgICBpZiAoIWhpZGxfcmV0dmFsLmlzT2soKSkgewotICAgICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiOiBJU2VydmljZU1hbmFnZXI6Omxpc3RCeUludGVyZmFjZSBmYWlsdXJlOiAiCi0gICAgICAgICAgICAgICAgIDw8IGhpZGxfcmV0dmFsLmRlc2NyaXB0aW9uKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGluc3RhbmNlX2NvdW50ID4gMCkgewotICAgICAgaGFsX3ZlcnNpb25fID0gQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OXzJfMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBoaWRsX3JldHZhbCA9IHNlcnZpY2VfbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoCi0gICAgICAgIGtGdWxseVF1YWxpZmllZEludGVyZmFjZU5hbWVfMl8wLCBsaXN0TWFuaWZlc3RCeUludGVyZmFjZV9jYik7Ci0gICAgaWYgKCFoaWRsX3JldHZhbC5pc09rKCkpIHsKLSAgICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIjogSVNlcnZpY2VNYW5hZ2VyOjpsaXN0QnlJbnRlcmZhY2UgZmFpbHVyZTogIgotICAgICAgICAgICAgICAgICA8PCBoaWRsX3JldHZhbC5kZXNjcmlwdGlvbigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpbnN0YW5jZV9jb3VudCA+IDApIHsKLSAgICAgIGhhbF92ZXJzaW9uXyA9IEJsdWV0b290aEF1ZGlvSGFsVmVyc2lvbjo6VkVSU0lPTl8yXzA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaGFsX3ZlcnNpb25fID0gQmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OX1VOQVZBSUxBQkxFOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBObyBzdXBwb3J0ZWQgSEFMIHZlcnNpb24iOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEhhbFZlcnNpb25NYW5hZ2VyPiBpbnN0YW5jZV9wdHI7Ci0gIHN0ZDo6bXV0ZXggbXV0ZXhfOwotCi0gIEJsdWV0b290aEF1ZGlvSGFsVmVyc2lvbiBoYWxfdmVyc2lvbl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvaGVhcmluZ19haWRfc29mdHdhcmVfZW5jb2RpbmcuY2MgYi9hdWRpb19oYWxfaW50ZXJmYWNlL2hlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgyNTAyLi4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvaGVhcmluZ19haWRfc29mdHdhcmVfZW5jb2RpbmcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJCVEF1ZGlvQ2xpZW50SGVhcmluZ0FpZCIKLQotI2luY2x1ZGUgImhlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nLmgiCi0jaW5jbHVkZSAiY2xpZW50X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYXVkaW9faGVhcmluZ19haWRfaHcvaW5jbHVkZS9hdWRpb19oZWFyaW5nX2FpZF9ody5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Q29kZWNUeXBlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpBdWRpb0NvbmZpZ3VyYXRpb247Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OkJpdHNQZXJTYW1wbGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OkJsdWV0b290aEF1ZGlvQ3RybEFjazsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Q2hhbm5lbE1vZGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlBjbVBhcmFtZXRlcnM7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlNhbXBsZVJhdGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlNlc3Npb25UeXBlOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpTZXNzaW9uVHlwZV8yXzE7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjpTdHJlYW1DYWxsYmFja3M7Ci0KLS8vIFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiBmb3IgSGVhcmluZyBBaWRzCi1jbGFzcyBIZWFyaW5nQWlkVHJhbnNwb3J0Ci0gICAgOiBwdWJsaWMgYmx1ZXRvb3RoOjphdWRpbzo6SUJsdWV0b290aFNpbmtUcmFuc3BvcnRJbnN0YW5jZSB7Ci0gcHVibGljOgotICBIZWFyaW5nQWlkVHJhbnNwb3J0KFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IpCi0gICAgICA6IElCbHVldG9vdGhTaW5rVHJhbnNwb3J0SW5zdGFuY2UoCi0gICAgICAgICAgICBTZXNzaW9uVHlwZTo6SEVBUklOR19BSURfU09GVFdBUkVfRU5DT0RJTkdfREFUQVBBVEgsIHt9KSwKLSAgICAgICAgc3RyZWFtX2NiXyhzdGQ6Om1vdmUoc3RyZWFtX2NiKSksCi0gICAgICAgIHJlbW90ZV9kZWxheV9yZXBvcnRfbXNfKDApLAotICAgICAgICB0b3RhbF9ieXRlc19yZWFkXygwKSwKLSAgICAgICAgZGF0YV9wb3NpdGlvbl8oe30pe307Ci0KLSAgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrIFN0YXJ0UmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgaWYgKHN0cmVhbV9jYl8ub25fcmVzdW1lXyh0cnVlKSkgewotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6U1VDQ0VTU19GSU5JU0hFRDsKLSAgICB9Ci0gICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6RkFJTFVSRTsKLSAgfQotCi0gIEJsdWV0b290aEF1ZGlvQ3RybEFjayBTdXNwZW5kUmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgaWYgKHN0cmVhbV9jYl8ub25fc3VzcGVuZF8oKSkgewotICAgICAgdWludDhfdCBwX2J1ZltBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWiAqIDJdOwotICAgICAgOjpibHVldG9vdGg6OmF1ZGlvOjpoZWFyaW5nX2FpZDo6cmVhZChwX2J1Ziwgc2l6ZW9mKHBfYnVmKSk7Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpTVUNDRVNTX0ZJTklTSEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU3RvcFJlcXVlc3QoKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIGlmIChzdHJlYW1fY2JfLm9uX3N1c3BlbmRfKCkpIHsKLSAgICAgIC8vIGZsdXNoCi0gICAgICB1aW50OF90IHBfYnVmW0FVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NaICogMl07Ci0gICAgICA6OmJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjpyZWFkKHBfYnVmLCBzaXplb2YocF9idWYpKTsKLSAgICB9Ci0gIH0KLQotICBib29sIEdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90KiByZW1vdGVfZGVsYXlfcmVwb3J0X25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB0b3RhbF9ieXRlc19yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjKiBkYXRhX3Bvc2l0aW9uKSBvdmVycmlkZSB7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBkYXRhPSIgPDwgdG90YWxfYnl0ZXNfcmVhZF8KLSAgICAgICAgICAgIDw8ICIgYnl0ZShzKSwgdGltZXN0YW1wPSIgPDwgZGF0YV9wb3NpdGlvbl8udHZfc2VjIDw8ICIuIgotICAgICAgICAgICAgPDwgZGF0YV9wb3NpdGlvbl8udHZfbnNlYwotICAgICAgICAgICAgPDwgInMsIGRlbGF5IHJlcG9ydD0iIDw8IHJlbW90ZV9kZWxheV9yZXBvcnRfbXNfIDw8ICIgbXNlYy4iOwotICAgIGlmIChyZW1vdGVfZGVsYXlfcmVwb3J0X25zICE9IG51bGxwdHIpIHsKLSAgICAgICpyZW1vdGVfZGVsYXlfcmVwb3J0X25zID0gcmVtb3RlX2RlbGF5X3JlcG9ydF9tc18gKiAxMDAwMDAwdTsKLSAgICB9Ci0gICAgaWYgKHRvdGFsX2J5dGVzX3JlYWQgIT0gbnVsbHB0cikgKnRvdGFsX2J5dGVzX3JlYWQgPSB0b3RhbF9ieXRlc19yZWFkXzsKLSAgICBpZiAoZGF0YV9wb3NpdGlvbiAhPSBudWxscHRyKSAqZGF0YV9wb3NpdGlvbiA9IGRhdGFfcG9zaXRpb25fOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIE1ldGFkYXRhQ2hhbmdlZChjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCYgc291cmNlX21ldGFkYXRhKSBvdmVycmlkZSB7Ci0gICAgYXV0byB0cmFja19jb3VudCA9IHNvdXJjZV9tZXRhZGF0YS50cmFja19jb3VudDsKLSAgICBhdXRvIHRyYWNrcyA9IHNvdXJjZV9tZXRhZGF0YS50cmFja3M7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgdHJhY2tfY291bnQgPDwgIiB0cmFjayhzKSByZWNlaXZlZCI7Ci0gICAgd2hpbGUgKHRyYWNrX2NvdW50KSB7Ci0gICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHVzYWdlPSIgPDwgdHJhY2tzLT51c2FnZQotICAgICAgICAgICAgICA8PCAiLCBjb250ZW50X3R5cGU9IiA8PCB0cmFja3MtPmNvbnRlbnRfdHlwZQotICAgICAgICAgICAgICA8PCAiLCBnYWluPSIgPDwgdHJhY2tzLT5nYWluOwotICAgICAgLS10cmFja19jb3VudDsKLSAgICAgICsrdHJhY2tzOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IGNhbGxlZC4iOwotICAgIHJlbW90ZV9kZWxheV9yZXBvcnRfbXNfID0gMDsKLSAgICB0b3RhbF9ieXRlc19yZWFkXyA9IDA7Ci0gICAgZGF0YV9wb3NpdGlvbl8gPSB7fTsKLSAgfQotCi0gIHZvaWQgTG9nQnl0ZXNSZWFkKHNpemVfdCBieXRlc19yZWFkKSBvdmVycmlkZSB7Ci0gICAgaWYgKGJ5dGVzX3JlYWQpIHsKLSAgICAgIHRvdGFsX2J5dGVzX3JlYWRfICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmRhdGFfcG9zaXRpb25fKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNldFJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcykgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZWxheV9yZXBvcnQ9IiA8PCBkZWxheV9yZXBvcnRfbXMgPDwgIiBtc2VjIjsKLSAgICByZW1vdGVfZGVsYXlfcmVwb3J0X21zXyA9IGRlbGF5X3JlcG9ydF9tczsKLSAgfQotCi0gcHJpdmF0ZToKLSAgU3RyZWFtQ2FsbGJhY2tzIHN0cmVhbV9jYl87Ci0gIHVpbnQxNl90IHJlbW90ZV9kZWxheV9yZXBvcnRfbXNfOwotICB1aW50NjRfdCB0b3RhbF9ieXRlc19yZWFkXzsKLSAgdGltZXNwZWMgZGF0YV9wb3NpdGlvbl87Ci19OwotCi1ib29sIEhlYXJpbmdBaWRHZXRTZWxlY3RlZEhhbFBjbUNvbmZpZyhQY21QYXJhbWV0ZXJzKiBoYWxfcGNtX2NvbmZpZykgewotICBpZiAoaGFsX3BjbV9jb25maWcgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAvLyBUT0RPOiB3ZSBvbmx5IHN1cHBvcnQgb25lIGNvbmZpZyBmb3Igbm93IQotICBoYWxfcGNtX2NvbmZpZy0+c2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU6OlJBVEVfMTYwMDA7Ci0gIGhhbF9wY21fY29uZmlnLT5iaXRzUGVyU2FtcGxlID0gQml0c1BlclNhbXBsZTo6QklUU18xNjsKLSAgaGFsX3BjbV9jb25maWctPmNoYW5uZWxNb2RlID0gQ2hhbm5lbE1vZGU6OlNURVJFTzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNpbmsgaW5zdGFuY2Ugb2YgSGVhcmluZyBBaWRzIHRvIHByb3ZpZGUgY2FsbC1pbiBBUElzIGZvciBCbHVldG9vdGggQXVkaW8gSGFsCi1IZWFyaW5nQWlkVHJhbnNwb3J0KiBoZWFyaW5nX2FpZF9zaW5rID0gbnVsbHB0cjsKLS8vIENvbW1vbiBpbnRlcmZhY2UgdG8gY2FsbC1vdXQgaW50byBCbHVldG9vdGggQXVkaW8gSGFsCi1ibHVldG9vdGg6OmF1ZGlvOjpCbHVldG9vdGhBdWRpb1NpbmtDbGllbnRJbnRlcmZhY2UqCi0gICAgaGVhcmluZ19haWRfaGFsX2NsaWVudGludGVyZmFjZSA9IG51bGxwdHI7Ci1ib29sIGJ0YXVkaW9faGVhcmluZ19haWRfZGlzYWJsZWQgPSBmYWxzZTsKLWJvb2wgaXNfY29uZmlndXJlZCA9IGZhbHNlOwotCi0vLyBTYXZlIHRoZSB2YWx1ZSBpZiB0aGUgcmVtb3RlIHJlcG9ydHMgaXRzIGRlbGF5IGJlZm9yZSBoZWFyaW5nX2FpZF9zaW5rIGlzCi0vLyBpbml0aWFsaXplZAotdWludDE2X3QgcmVtb3RlX2RlbGF5X21zID0gMDsKLQotYm9vbCBpc19oYWxfMl8wX2ZvcmNlX2Rpc2FibGVkKCkgewotICBpZiAoIWlzX2NvbmZpZ3VyZWQpIHsKLSAgICBidGF1ZGlvX2hlYXJpbmdfYWlkX2Rpc2FibGVkID0gb3NpX3Byb3BlcnR5X2dldF9ib29sKEJMVUVUT09USF9BVURJT19IQUxfUFJPUF9ESVNBQkxFRCwgZmFsc2UpOwotICAgIGlzX2NvbmZpZ3VyZWQgPSB0cnVlOwotICB9Ci0gIHJldHVybiBidGF1ZGlvX2hlYXJpbmdfYWlkX2Rpc2FibGVkOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGhlYXJpbmdfYWlkIHsKLQotYm9vbCBpc19oYWxfMl8wX2VuYWJsZWQoKSB7IHJldHVybiBoZWFyaW5nX2FpZF9oYWxfY2xpZW50aW50ZXJmYWNlICE9IG51bGxwdHI7IH0KLQotYm9vbCBpbml0KFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gIGlmIChpc19oYWxfMl8wX2ZvcmNlX2Rpc2FibGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBpcyBkaXNhYmxlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaGVhcmluZ19haWRfc2luayA9IG5ldyBIZWFyaW5nQWlkVHJhbnNwb3J0KHN0ZDo6bW92ZShzdHJlYW1fY2IpKTsKLSAgaGVhcmluZ19haWRfaGFsX2NsaWVudGludGVyZmFjZSA9Ci0gICAgICBuZXcgYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKGhlYXJpbmdfYWlkX3NpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9vcCk7Ci0gIGlmICghaGVhcmluZ19haWRfaGFsX2NsaWVudGludGVyZmFjZS0+SXNWYWxpZCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBmb3IgSGVhcmluZyBBaWQgaXMgaW52YWxpZD8hIjsKLSAgICBkZWxldGUgaGVhcmluZ19haWRfaGFsX2NsaWVudGludGVyZmFjZTsKLSAgICBoZWFyaW5nX2FpZF9oYWxfY2xpZW50aW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgICBkZWxldGUgaGVhcmluZ19haWRfc2luazsKLSAgICBoZWFyaW5nX2FpZF9zaW5rID0gbnVsbHB0cjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocmVtb3RlX2RlbGF5X21zICE9IDApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcmVzdG9yZSBERUxBWSAiIDw8IHJlbW90ZV9kZWxheV9tcyA8PCAiIG1zIjsKLSAgICBoZWFyaW5nX2FpZF9zaW5rLT5TZXRSZW1vdGVEZWxheShyZW1vdGVfZGVsYXlfbXMpOwotICAgIHJlbW90ZV9kZWxheV9tcyA9IDA7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBjbGVhbnVwKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIGlmICghaXNfaGFsXzJfMF9lbmFibGVkKCkpIHJldHVybjsKLSAgZW5kX3Nlc3Npb24oKTsKLSAgZGVsZXRlIGhlYXJpbmdfYWlkX2hhbF9jbGllbnRpbnRlcmZhY2U7Ci0gIGhlYXJpbmdfYWlkX2hhbF9jbGllbnRpbnRlcmZhY2UgPSBudWxscHRyOwotICBkZWxldGUgaGVhcmluZ19haWRfc2luazsKLSAgaGVhcmluZ19haWRfc2luayA9IG51bGxwdHI7Ci0gIHJlbW90ZV9kZWxheV9tcyA9IDA7Ci19Ci0KLXZvaWQgc3RhcnRfc2Vzc2lvbigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoIWlzX2hhbF8yXzBfZW5hYmxlZCgpKSByZXR1cm47Ci0gIEF1ZGlvQ29uZmlndXJhdGlvbiBhdWRpb19jb25maWc7Ci0gIFBjbVBhcmFtZXRlcnMgcGNtX2NvbmZpZ3t9OwotICBpZiAoIUhlYXJpbmdBaWRHZXRTZWxlY3RlZEhhbFBjbUNvbmZpZygmcGNtX2NvbmZpZykpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNhbm5vdCBnZXQgUENNIGNvbmZpZyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1ZGlvX2NvbmZpZy5wY21Db25maWcocGNtX2NvbmZpZyk7Ci0gIGlmICghaGVhcmluZ19haWRfaGFsX2NsaWVudGludGVyZmFjZS0+VXBkYXRlQXVkaW9Db25maWcoYXVkaW9fY29uZmlnKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2Fubm90IHVwZGF0ZSBhdWRpbyBjb25maWcgdG8gSEFMIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaGVhcmluZ19haWRfaGFsX2NsaWVudGludGVyZmFjZS0+U3RhcnRTZXNzaW9uKCk7Ci19Ci0KLXZvaWQgZW5kX3Nlc3Npb24oKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFpc19oYWxfMl8wX2VuYWJsZWQoKSkgcmV0dXJuOwotICBoZWFyaW5nX2FpZF9oYWxfY2xpZW50aW50ZXJmYWNlLT5FbmRTZXNzaW9uKCk7Ci19Ci0KLXNpemVfdCByZWFkKHVpbnQ4X3QqIHBfYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKCFpc19oYWxfMl8wX2VuYWJsZWQoKSkgcmV0dXJuIDA7Ci0gIHJldHVybiBoZWFyaW5nX2FpZF9oYWxfY2xpZW50aW50ZXJmYWNlLT5SZWFkQXVkaW9EYXRhKHBfYnVmLCBsZW4pOwotfQotCi0vLyBVcGRhdGUgSGVhcmluZyBBaWRzIGRlbGF5IHJlcG9ydCB0byBCbHVldG9vdGhBdWRpbyBIQUwKLXZvaWQgc2V0X3JlbW90ZV9kZWxheSh1aW50MTZfdCBkZWxheV9yZXBvcnRfbXMpIHsKLSAgaWYgKCFpc19oYWxfMl8wX2VuYWJsZWQoKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAgbm90IHJlYWR5IGZvciBEZWxheVJlcG9ydCAiIDw8IGRlbGF5X3JlcG9ydF9tcwotICAgICAgICAgICAgICA8PCAiIG1zIjsKLSAgICByZW1vdGVfZGVsYXlfbXMgPSBkZWxheV9yZXBvcnRfbXM7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZWxheV9yZXBvcnRfbXM9IiA8PCBkZWxheV9yZXBvcnRfbXMgPDwgIiBtcyI7Ci0gIGhlYXJpbmdfYWlkX3NpbmstPlNldFJlbW90ZURlbGF5KGRlbGF5X3JlcG9ydF9tcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFyaW5nX2FpZAotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL2hlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nLmggYi9hdWRpb19oYWxfaW50ZXJmYWNlL2hlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjRmY2QuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9oZWFyaW5nX2FpZF9zb2Z0d2FyZV9lbmNvZGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF1ZGlvIHsKLW5hbWVzcGFjZSBoZWFyaW5nX2FpZCB7Ci0KLXN0cnVjdCBTdHJlYW1DYWxsYmFja3MgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woYm9vbCBzdGFydF9tZWRpYV90YXNrKT4gb25fcmVzdW1lXzsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHZvaWQpPiBvbl9zdXNwZW5kXzsKLX07Ci0KLS8vIENoZWNrIGlmIG5ldyBibHVldG9vdGhfYXVkaW8gaXMgZW5hYmxlZAotYm9vbCBpc19oYWxfMl8wX2VuYWJsZWQoKTsKLQotLy8gSW5pdGlhbGl6ZSBCbHVldG9vdGhBdWRpbyBIQUw6IG9wZW5Qcm92aWRlcgotYm9vbCBpbml0KFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApOwotCi0vLyBDbGVhbiB1cCBCbHVldG9vdGhBdWRpbyBIQUwKLXZvaWQgY2xlYW51cCgpOwotCi0vLyBTZW5kIGNvbW1hbmQgdG8gdGhlIEJsdWV0b290aEF1ZGlvIEhBTDogU3RhcnRTZXNzaW9uLCBFbmRTZXNzaW9uCi12b2lkIHN0YXJ0X3Nlc3Npb24oKTsKLXZvaWQgZW5kX3Nlc3Npb24oKTsKLQotdm9pZCBzZXRfcmVtb3RlX2RlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcyk7Ci0KLS8vIFJlYWQgZnJvbSB0aGUgRk1RIG9mIEJsdWV0b290aEF1ZGlvIEhBTAotc2l6ZV90IHJlYWQodWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFyaW5nX2FpZAotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL2hlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nX2hvc3QuY2MgYi9hdWRpb19oYWxfaW50ZXJmYWNlL2hlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nX2hvc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDViYjIuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9oZWFyaW5nX2FpZF9zb2Z0d2FyZV9lbmNvZGluZ19ob3N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImF1ZGlvX2hhbF9pbnRlcmZhY2UvaGVhcmluZ19haWRfc29mdHdhcmVfZW5jb2RpbmcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGhlYXJpbmdfYWlkIHsKLQotYm9vbCBpc19oYWxfMl8wX2VuYWJsZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi1ib29sIGluaXQoU3RyZWFtQ2FsbGJhY2tzIHN0cmVhbV9jYiwKLSAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIG1lc3NhZ2VfbG9vcCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgY2xlYW51cCgpIHt9Ci0KLXZvaWQgc3RhcnRfc2Vzc2lvbigpIHt9Ci0KLXZvaWQgZW5kX3Nlc3Npb24oKSB7fQotCi1zaXplX3QgcmVhZCh1aW50OF90KiBwX2J1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiAwOyB9Ci0KLXZvaWQgc2V0X3JlbW90ZV9kZWxheSh1aW50MTZfdCBkZWxheV9yZXBvcnRfbXMpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFyaW5nX2FpZAotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL2xlX2F1ZGlvX3NvZnR3YXJlLmNjIGIvYXVkaW9faGFsX2ludGVyZmFjZS9sZV9hdWRpb19zb2Z0d2FyZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllM2E1Mi4uMDAwMDAwMAotLS0gYS9hdWRpb19oYWxfaW50ZXJmYWNlL2xlX2F1ZGlvX3NvZnR3YXJlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQlRBdWRpb0NsaWVudExlQXVkaW8iCi0KLSNpbmNsdWRlICJsZV9hdWRpb19zb2Z0d2FyZS5oIgotCi0jaW5jbHVkZSAiY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Qml0c1BlclNhbXBsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YXVkaW86OlYyXzA6OkNoYW5uZWxNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMDo6Q29kZWNUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjphdWRpbzo6VjJfMTo6UGNtUGFyYW1ldGVyczsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9DdHJsQWNrOwotdXNpbmcgOjpibHVldG9vdGg6OmF1ZGlvOjpTYW1wbGVSYXRlXzJfMTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6U2Vzc2lvblR5cGU7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OlNlc3Npb25UeXBlXzJfMTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OkxlQXVkaW9DbGllbnRJbnRlcmZhY2U7Ci11c2luZyA6OmJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpTdHJlYW1DYWxsYmFja3M7Ci0KLWJsdWV0b290aDo6YXVkaW86OkJsdWV0b290aEF1ZGlvU2lua0NsaWVudEludGVyZmFjZSoKLSAgICBsZV9hdWRpb19zaW5rX2hhbF9jbGllbnRpbnRlcmZhY2UgPSBudWxscHRyOwotYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2UqCi0gICAgbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2UgPSBudWxscHRyOwotCi1zdGF0aWMgYm9vbCBpc19zb3VyY2VfaGFsX2VuYWJsZWQoKSB7Ci0gIHJldHVybiBsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZSAhPSBudWxscHRyOwotfQotCi1zdGF0aWMgYm9vbCBpc19zaW5rX2hhbF9lbmFibGVkKCkgewotICByZXR1cm4gbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlICE9IG51bGxwdHI7Ci19Ci0KLWNsYXNzIExlQXVkaW9UcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgTGVBdWRpb1RyYW5zcG9ydCh2b2lkICgqZmx1c2gpKHZvaWQpLCBTdHJlYW1DYWxsYmFja3Mgc3RyZWFtX2NiLAotICAgICAgICAgICAgICAgICAgIFBjbVBhcmFtZXRlcnMgcGNtX2NvbmZpZykKLSAgICAgIDogZmx1c2hfKHN0ZDo6bW92ZShmbHVzaCkpLAotICAgICAgICBzdHJlYW1fY2JfKHN0ZDo6bW92ZShzdHJlYW1fY2IpKSwKLSAgICAgICAgcmVtb3RlX2RlbGF5X3JlcG9ydF9tc18oMCksCi0gICAgICAgIHRvdGFsX2J5dGVzX3Byb2Nlc3NlZF8oMCksCi0gICAgICAgIGRhdGFfcG9zaXRpb25fKHt9KSwKLSAgICAgICAgcGNtX2NvbmZpZ18oc3RkOjptb3ZlKHBjbV9jb25maWcpKSwKLSAgICAgICAgaXNfcGVuZGluZ19zdGFydF9yZXF1ZXN0XyhmYWxzZSl7fTsKLQotICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgU3RhcnRSZXF1ZXN0KCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIC8qCi0gICAgICogU2V0IHN1Y2Nlc3NmdWwgc3RhdGUgYXMgaW5pdGlhbCwgaXQgbWF5IGJlIG92ZXJ3cml0dGVuIHdpdGggY2FuY2VsYXRpb24KLSAgICAgKiBkdXJpbmcgb25fcmVzdW1lIGhhbmRsaW5nCi0gICAgICovCi0gICAgcGVuZGluZ19zdGFydF9yZXF1ZXN0X3N0YXRlXyA9IEJsdWV0b290aEF1ZGlvQ3RybEFjazo6UEVORElORzsKLQotICAgIGlmIChzdHJlYW1fY2JfLm9uX3Jlc3VtZV8odHJ1ZSkpIHsKLSAgICAgIGlmIChwZW5kaW5nX3N0YXJ0X3JlcXVlc3Rfc3RhdGVfID09IEJsdWV0b290aEF1ZGlvQ3RybEFjazo6UEVORElORykKLSAgICAgICAgaXNfcGVuZGluZ19zdGFydF9yZXF1ZXN0XyA9IHRydWU7Ci0KLSAgICAgIHJldHVybiBwZW5kaW5nX3N0YXJ0X3JlcXVlc3Rfc3RhdGVfOwotICAgIH0KLQotICAgIHJldHVybiBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OkZBSUxVUkU7Ci0gIH0KLQotICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgU3VzcGVuZFJlcXVlc3QoKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIGlmIChzdHJlYW1fY2JfLm9uX3N1c3BlbmRfKCkpIHsKLSAgICAgIGZsdXNoXygpOwotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6U1VDQ0VTU19GSU5JU0hFRDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6RkFJTFVSRTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFN0b3BSZXF1ZXN0KCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICBpZiAoc3RyZWFtX2NiXy5vbl9zdXNwZW5kXygpKSB7Ci0gICAgICBmbHVzaF8oKTsKLSAgICB9Ci0gIH0KLQotICBib29sIEdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90KiByZW1vdGVfZGVsYXlfcmVwb3J0X25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB0b3RhbF9ieXRlc19wcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNwZWMqIGRhdGFfcG9zaXRpb24pIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IGRhdGE9IiA8PCB0b3RhbF9ieXRlc19wcm9jZXNzZWRfCi0gICAgICAgICAgICA8PCAiIGJ5dGUocyksIHRpbWVzdGFtcD0iIDw8IGRhdGFfcG9zaXRpb25fLnR2X3NlYyA8PCAiLiIKLSAgICAgICAgICAgIDw8IGRhdGFfcG9zaXRpb25fLnR2X25zZWMKLSAgICAgICAgICAgIDw8ICJzLCBkZWxheSByZXBvcnQ9IiA8PCByZW1vdGVfZGVsYXlfcmVwb3J0X21zXyA8PCAiIG1zZWMuIjsKLSAgICBpZiAocmVtb3RlX2RlbGF5X3JlcG9ydF9ucyAhPSBudWxscHRyKSB7Ci0gICAgICAqcmVtb3RlX2RlbGF5X3JlcG9ydF9ucyA9IHJlbW90ZV9kZWxheV9yZXBvcnRfbXNfICogMTAwMDAwMHU7Ci0gICAgfQotICAgIGlmICh0b3RhbF9ieXRlc19wcm9jZXNzZWQgIT0gbnVsbHB0cikKLSAgICAgICp0b3RhbF9ieXRlc19wcm9jZXNzZWQgPSB0b3RhbF9ieXRlc19wcm9jZXNzZWRfOwotICAgIGlmIChkYXRhX3Bvc2l0aW9uICE9IG51bGxwdHIpICpkYXRhX3Bvc2l0aW9uID0gZGF0YV9wb3NpdGlvbl87Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgTWV0YWRhdGFDaGFuZ2VkKGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90JiBzb3VyY2VfbWV0YWRhdGEpIHsKLSAgICBhdXRvIHRyYWNrX2NvdW50ID0gc291cmNlX21ldGFkYXRhLnRyYWNrX2NvdW50OwotCi0gICAgaWYgKHRyYWNrX2NvdW50ID09IDApIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiLCBpbnZhbGlkIG51bWJlciBvZiBtZXRhZGF0YSBjaGFuZ2VkIHRyYWNrcyI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RyZWFtX2NiXy5vbl9tZXRhZGF0YV91cGRhdGVfKHNvdXJjZV9tZXRhZGF0YSk7Ci0gIH0KLQotICB2b2lkIFJlc2V0UHJlc2VudGF0aW9uUG9zaXRpb24oKSB7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYWxsZWQuIjsKLSAgICByZW1vdGVfZGVsYXlfcmVwb3J0X21zXyA9IDA7Ci0gICAgdG90YWxfYnl0ZXNfcHJvY2Vzc2VkXyA9IDA7Ci0gICAgZGF0YV9wb3NpdGlvbl8gPSB7fTsKLSAgfQotCi0gIHZvaWQgTG9nQnl0ZXNQcm9jZXNzZWQoc2l6ZV90IGJ5dGVzX3Byb2Nlc3NlZCkgewotICAgIGlmIChieXRlc19wcm9jZXNzZWQpIHsKLSAgICAgIHRvdGFsX2J5dGVzX3Byb2Nlc3NlZF8gKz0gYnl0ZXNfcHJvY2Vzc2VkOwotICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZkYXRhX3Bvc2l0aW9uXyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTZXRSZW1vdGVEZWxheSh1aW50MTZfdCBkZWxheV9yZXBvcnRfbXMpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGVsYXlfcmVwb3J0PSIgPDwgZGVsYXlfcmVwb3J0X21zIDw8ICIgbXNlYyI7Ci0gICAgcmVtb3RlX2RlbGF5X3JlcG9ydF9tc18gPSBkZWxheV9yZXBvcnRfbXM7Ci0gIH0KLQotICBjb25zdCBQY21QYXJhbWV0ZXJzJiBMZUF1ZGlvR2V0U2VsZWN0ZWRIYWxQY21Db25maWcoKSB7IHJldHVybiBwY21fY29uZmlnXzsgfQotCi0gIHZvaWQgTGVBdWRpb1NldFNlbGVjdGVkSGFsUGNtQ29uZmlnKFNhbXBsZVJhdGVfMl8xIHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzUGVyU2FtcGxlIGJpdF9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTW9kZSBjaGFubmVsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfaW50ZXJ2YWwpIHsKLSAgICBwY21fY29uZmlnXy5zYW1wbGVSYXRlID0gc2FtcGxlX3JhdGU7Ci0gICAgcGNtX2NvbmZpZ18uYml0c1BlclNhbXBsZSA9IGJpdF9yYXRlOwotICAgIHBjbV9jb25maWdfLmNoYW5uZWxNb2RlID0gY2hhbm5lbF9tb2RlOwotICAgIHBjbV9jb25maWdfLmRhdGFJbnRlcnZhbFVzID0gZGF0YV9pbnRlcnZhbDsKLSAgfQotCi0gIGJvb2wgU2V0QXVkaW9DdHJsQWNrU3RhdGVBbmRSZXNldFBlbmRpbmdTdGFydFN0cmVhbUZsYWcoCi0gICAgICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgc3RhdGUpIHsKLSAgICBib29sIHJldCA9IGlzX3BlbmRpbmdfc3RhcnRfcmVxdWVzdF87Ci0gICAgaXNfcGVuZGluZ19zdGFydF9yZXF1ZXN0XyA9IGZhbHNlOwotICAgIHBlbmRpbmdfc3RhcnRfcmVxdWVzdF9zdGF0ZV8gPSBzdGF0ZTsKLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgKCpmbHVzaF8pKHZvaWQpOwotICBTdHJlYW1DYWxsYmFja3Mgc3RyZWFtX2NiXzsKLSAgdWludDE2X3QgcmVtb3RlX2RlbGF5X3JlcG9ydF9tc187Ci0gIHVpbnQ2NF90IHRvdGFsX2J5dGVzX3Byb2Nlc3NlZF87Ci0gIHRpbWVzcGVjIGRhdGFfcG9zaXRpb25fOwotICBQY21QYXJhbWV0ZXJzIHBjbV9jb25maWdfOwotICBib29sIGlzX3BlbmRpbmdfc3RhcnRfcmVxdWVzdF87Ci0gIEJsdWV0b290aEF1ZGlvQ3RybEFjayBwZW5kaW5nX3N0YXJ0X3JlcXVlc3Rfc3RhdGVfOwotfTsKLQotc3RhdGljIHZvaWQgZmx1c2hfc2luaygpIHsKLSAgaWYgKCFpc19zaW5rX2hhbF9lbmFibGVkKCkpIHJldHVybjsKLQotICBsZV9hdWRpb19zaW5rX2hhbF9jbGllbnRpbnRlcmZhY2UtPkZsdXNoQXVkaW9EYXRhKCk7Ci19Ci0KLS8vIFNpbmsgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIGZvciBMZSBBdWRpbwotY2xhc3MgTGVBdWRpb1NpbmtUcmFuc3BvcnQKLSAgICA6IHB1YmxpYyBibHVldG9vdGg6OmF1ZGlvOjpJQmx1ZXRvb3RoU2lua1RyYW5zcG9ydEluc3RhbmNlIHsKLSBwdWJsaWM6Ci0gIExlQXVkaW9TaW5rVHJhbnNwb3J0KFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IpCi0gICAgICA6IElCbHVldG9vdGhTaW5rVHJhbnNwb3J0SW5zdGFuY2UoCi0gICAgICAgICAgICBTZXNzaW9uVHlwZV8yXzE6OkxFX0FVRElPX1NPRlRXQVJFX0VOQ09ESU5HX0RBVEFQQVRILCB7fSkgewotICAgIHRyYW5zcG9ydF8gPQotICAgICAgICBuZXcgTGVBdWRpb1RyYW5zcG9ydChmbHVzaF9zaW5rLCBzdGQ6Om1vdmUoc3RyZWFtX2NiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1NhbXBsZVJhdGVfMl8xOjpSQVRFXzE2MDAwLCBDaGFubmVsTW9kZTo6U1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c1BlclNhbXBsZTo6QklUU18xNiwgMH0pOwotICB9OwotCi0gIH5MZUF1ZGlvU2lua1RyYW5zcG9ydCgpIHsgZGVsZXRlIHRyYW5zcG9ydF87IH0KLQotICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgU3RhcnRSZXF1ZXN0KCkgb3ZlcnJpZGUgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5TdGFydFJlcXVlc3QoKTsKLSAgfQotCi0gIEJsdWV0b290aEF1ZGlvQ3RybEFjayBTdXNwZW5kUmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+U3VzcGVuZFJlcXVlc3QoKTsKLSAgfQotCi0gIHZvaWQgU3RvcFJlcXVlc3QoKSBvdmVycmlkZSB7IHRyYW5zcG9ydF8tPlN0b3BSZXF1ZXN0KCk7IH0KLQotICBib29sIEdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90KiByZW1vdGVfZGVsYXlfcmVwb3J0X25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB0b3RhbF9ieXRlc19yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjKiBkYXRhX3Bvc2l0aW9uKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPkdldFByZXNlbnRhdGlvblBvc2l0aW9uKHJlbW90ZV9kZWxheV9yZXBvcnRfbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3JlYWQsIGRhdGFfcG9zaXRpb24pOwotICB9Ci0KLSAgdm9pZCBNZXRhZGF0YUNoYW5nZWQoY29uc3Qgc291cmNlX21ldGFkYXRhX3QmIHNvdXJjZV9tZXRhZGF0YSkgb3ZlcnJpZGUgewotICAgIHRyYW5zcG9ydF8tPk1ldGFkYXRhQ2hhbmdlZChzb3VyY2VfbWV0YWRhdGEpOwotICB9Ci0KLSAgdm9pZCBSZXNldFByZXNlbnRhdGlvblBvc2l0aW9uKCkgb3ZlcnJpZGUgewotICAgIHRyYW5zcG9ydF8tPlJlc2V0UHJlc2VudGF0aW9uUG9zaXRpb24oKTsKLSAgfQotCi0gIHZvaWQgTG9nQnl0ZXNSZWFkKHNpemVfdCBieXRlc19yZWFkKSBvdmVycmlkZSB7Ci0gICAgdHJhbnNwb3J0Xy0+TG9nQnl0ZXNQcm9jZXNzZWQoYnl0ZXNfcmVhZCk7Ci0gIH0KLQotICB2b2lkIFNldFJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcykgewotICAgIHRyYW5zcG9ydF8tPlNldFJlbW90ZURlbGF5KGRlbGF5X3JlcG9ydF9tcyk7Ci0gIH0KLQotICBjb25zdCBQY21QYXJhbWV0ZXJzJiBMZUF1ZGlvR2V0U2VsZWN0ZWRIYWxQY21Db25maWcoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPkxlQXVkaW9HZXRTZWxlY3RlZEhhbFBjbUNvbmZpZygpOwotICB9Ci0KLSAgdm9pZCBMZUF1ZGlvU2V0U2VsZWN0ZWRIYWxQY21Db25maWcoU2FtcGxlUmF0ZV8yXzEgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHNQZXJTYW1wbGUgYml0X3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxNb2RlIGNoYW5uZWxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9pbnRlcnZhbCkgewotICAgIHRyYW5zcG9ydF8tPkxlQXVkaW9TZXRTZWxlY3RlZEhhbFBjbUNvbmZpZyhzYW1wbGVfcmF0ZSwgYml0X3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbW9kZSwgZGF0YV9pbnRlcnZhbCk7Ci0gIH0KLQotICBib29sIFNldEF1ZGlvQ3RybEFja1N0YXRlQW5kUmVzZXRQZW5kaW5nU3RhcnRTdHJlYW1GbGFnKAotICAgICAgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrIHN0YXRlID0gQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpQRU5ESU5HKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPlNldEF1ZGlvQ3RybEFja1N0YXRlQW5kUmVzZXRQZW5kaW5nU3RhcnRTdHJlYW1GbGFnKAotICAgICAgICBzdGF0ZSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIExlQXVkaW9UcmFuc3BvcnQqIHRyYW5zcG9ydF87Ci19OwotCi1zdGF0aWMgdm9pZCBmbHVzaF9zb3VyY2UoKSB7Ci0gIGlmIChsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2UtPkZsdXNoQXVkaW9EYXRhKCk7Ci19Ci0KLWNsYXNzIExlQXVkaW9Tb3VyY2VUcmFuc3BvcnQKLSAgICA6IHB1YmxpYyBibHVldG9vdGg6OmF1ZGlvOjpJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2UgewotIHB1YmxpYzoKLSAgTGVBdWRpb1NvdXJjZVRyYW5zcG9ydChTdHJlYW1DYWxsYmFja3Mgc3RyZWFtX2NiKQotICAgICAgOiBJQmx1ZXRvb3RoU291cmNlVHJhbnNwb3J0SW5zdGFuY2UoCi0gICAgICAgICAgICBTZXNzaW9uVHlwZV8yXzE6OkxFX0FVRElPX1NPRlRXQVJFX0RFQ09ERURfREFUQVBBVEgsIHt9KSB7Ci0gICAgdHJhbnNwb3J0XyA9Ci0gICAgICAgIG5ldyBMZUF1ZGlvVHJhbnNwb3J0KGZsdXNoX3NvdXJjZSwgc3RkOjptb3ZlKHN0cmVhbV9jYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTYW1wbGVSYXRlXzJfMTo6UkFURV8xNjAwMCwgQ2hhbm5lbE1vZGU6Ok1PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzUGVyU2FtcGxlOjpCSVRTXzE2LCAwfSk7Ci0gIH07Ci0KLSAgfkxlQXVkaW9Tb3VyY2VUcmFuc3BvcnQoKSB7IGRlbGV0ZSB0cmFuc3BvcnRfOyB9Ci0KLSAgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrIFN0YXJ0UmVxdWVzdCgpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+U3RhcnRSZXF1ZXN0KCk7Ci0gIH0KLQotICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgU3VzcGVuZFJlcXVlc3QoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPlN1c3BlbmRSZXF1ZXN0KCk7Ci0gIH0KLQotICB2b2lkIFN0b3BSZXF1ZXN0KCkgb3ZlcnJpZGUgeyB0cmFuc3BvcnRfLT5TdG9wUmVxdWVzdCgpOyB9Ci0KLSAgYm9vbCBHZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCogcmVtb3RlX2RlbGF5X3JlcG9ydF9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogdG90YWxfYnl0ZXNfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3BlYyogZGF0YV9wb3NpdGlvbikgb3ZlcnJpZGUgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5HZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgcmVtb3RlX2RlbGF5X3JlcG9ydF9ucywgdG90YWxfYnl0ZXNfd3JpdHRlbiwgZGF0YV9wb3NpdGlvbik7Ci0gIH0KLQotICB2b2lkIE1ldGFkYXRhQ2hhbmdlZChjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCYgc291cmNlX21ldGFkYXRhKSBvdmVycmlkZSB7Ci0gICAgdHJhbnNwb3J0Xy0+TWV0YWRhdGFDaGFuZ2VkKHNvdXJjZV9tZXRhZGF0YSk7Ci0gIH0KLQotICB2b2lkIFJlc2V0UHJlc2VudGF0aW9uUG9zaXRpb24oKSBvdmVycmlkZSB7Ci0gICAgdHJhbnNwb3J0Xy0+UmVzZXRQcmVzZW50YXRpb25Qb3NpdGlvbigpOwotICB9Ci0KLSAgdm9pZCBMb2dCeXRlc1dyaXR0ZW4oc2l6ZV90IGJ5dGVzX3dyaXR0ZW4pIG92ZXJyaWRlIHsKLSAgICB0cmFuc3BvcnRfLT5Mb2dCeXRlc1Byb2Nlc3NlZChieXRlc193cml0dGVuKTsKLSAgfQotCi0gIHZvaWQgU2V0UmVtb3RlRGVsYXkodWludDE2X3QgZGVsYXlfcmVwb3J0X21zKSB7Ci0gICAgdHJhbnNwb3J0Xy0+U2V0UmVtb3RlRGVsYXkoZGVsYXlfcmVwb3J0X21zKTsKLSAgfQotCi0gIGNvbnN0IFBjbVBhcmFtZXRlcnMmIExlQXVkaW9HZXRTZWxlY3RlZEhhbFBjbUNvbmZpZygpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+TGVBdWRpb0dldFNlbGVjdGVkSGFsUGNtQ29uZmlnKCk7Ci0gIH0KLQotICB2b2lkIExlQXVkaW9TZXRTZWxlY3RlZEhhbFBjbUNvbmZpZyhTYW1wbGVSYXRlXzJfMSBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c1BlclNhbXBsZSBiaXRfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbE1vZGUgY2hhbm5lbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2ludGVydmFsKSB7Ci0gICAgdHJhbnNwb3J0Xy0+TGVBdWRpb1NldFNlbGVjdGVkSGFsUGNtQ29uZmlnKHNhbXBsZV9yYXRlLCBiaXRfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tb2RlLCBkYXRhX2ludGVydmFsKTsKLSAgfQotCi0gIGJvb2wgU2V0QXVkaW9DdHJsQWNrU3RhdGVBbmRSZXNldFBlbmRpbmdTdGFydFN0cmVhbUZsYWcoCi0gICAgICBCbHVldG9vdGhBdWRpb0N0cmxBY2sgc3RhdGUgPSBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlBFTkRJTkcpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+U2V0QXVkaW9DdHJsQWNrU3RhdGVBbmRSZXNldFBlbmRpbmdTdGFydFN0cmVhbUZsYWcoCi0gICAgICAgIHN0YXRlKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTGVBdWRpb1RyYW5zcG9ydCogdHJhbnNwb3J0XzsKLX07Ci0KLS8vIEluc3RhbmNlIG9mIExlIEF1ZGlvIHRvIHByb3ZpZGUgY2FsbC1pbiBBUElzIGZvciBCbHVldG9vdGggQXVkaW8gSGFsCi1MZUF1ZGlvU2lua1RyYW5zcG9ydCogbGVfYXVkaW9fc2luayA9IG51bGxwdHI7Ci1MZUF1ZGlvU291cmNlVHJhbnNwb3J0KiBsZV9hdWRpb19zb3VyY2UgPSBudWxscHRyOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF1ZGlvIHsKLW5hbWVzcGFjZSBsZV9hdWRpbyB7Ci0KLUxlQXVkaW9DbGllbnRJbnRlcmZhY2UqIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OmludGVyZmFjZSA9IG51bGxwdHI7Ci1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXQoKSB7Ci0gIGlmIChvc2lfcHJvcGVydHlfZ2V0X2Jvb2woQkxVRVRPT1RIX0FVRElPX0hBTF9QUk9QX0RJU0FCTEVELCBmYWxzZSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJsdWV0b290aEF1ZGlvIEhBTCBpcyBkaXNhYmxlZCI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoTGVBdWRpb0NsaWVudEludGVyZmFjZTo6aW50ZXJmYWNlID09IG51bGxwdHIpCi0gICAgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6aW50ZXJmYWNlID0gbmV3IExlQXVkaW9DbGllbnRJbnRlcmZhY2UoKTsKLQotICByZXR1cm4gTGVBdWRpb0NsaWVudEludGVyZmFjZTo6aW50ZXJmYWNlOwotfQotCi1zdGF0aWMgU2FtcGxlUmF0ZV8yXzEgbGVfYXVkaW9fc2FtcGxlX3JhdGUyYXVkaW9faGFsKHVpbnQzMl90IHNhbXBsZV9yYXRlXzJfMSkgewotICBzd2l0Y2ggKHNhbXBsZV9yYXRlXzJfMSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlXzJfMTo6UkFURV84MDAwOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICByZXR1cm4gU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMTYwMDA7Ci0gICAgY2FzZSAyNDAwMDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlXzJfMTo6UkFURV8yNDAwMDsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGVfMl8xOjpSQVRFXzMyMDAwOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICByZXR1cm4gU2FtcGxlUmF0ZV8yXzE6OlJBVEVfNDQxMDA7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgIHJldHVybiBTYW1wbGVSYXRlXzJfMTo6UkFURV80ODAwMDsKLSAgICBjYXNlIDg4MjAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGVfMl8xOjpSQVRFXzg4MjAwOwotICAgIGNhc2UgOTYwMDA6Ci0gICAgICByZXR1cm4gU2FtcGxlUmF0ZV8yXzE6OlJBVEVfOTYwMDA7Ci0gICAgY2FzZSAxNzY0MDA6Ci0gICAgICByZXR1cm4gU2FtcGxlUmF0ZV8yXzE6OlJBVEVfMTc2NDAwOwotICAgIGNhc2UgMTkyMDAwOgotICAgICAgcmV0dXJuIFNhbXBsZVJhdGVfMl8xOjpSQVRFXzE5MjAwMDsKLSAgfTsKLSAgcmV0dXJuIFNhbXBsZVJhdGVfMl8xOjpSQVRFX1VOS05PV047Ci19Ci0KLXN0YXRpYyBCaXRzUGVyU2FtcGxlIGxlX2F1ZGlvX2JpdF9yYXRlMmF1ZGlvX2hhbCh1aW50OF90IGJpdHNfcGVyX3NhbXBsZSkgewotICBzd2l0Y2ggKGJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgMTY6Ci0gICAgICByZXR1cm4gQml0c1BlclNhbXBsZTo6QklUU18xNjsKLSAgICBjYXNlIDI0OgotICAgICAgcmV0dXJuIEJpdHNQZXJTYW1wbGU6OkJJVFNfMjQ7Ci0gICAgY2FzZSAzMjoKLSAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlOjpCSVRTXzMyOwotICB9OwotICByZXR1cm4gQml0c1BlclNhbXBsZTo6QklUU19VTktOT1dOOwotfQotCi1zdGF0aWMgQ2hhbm5lbE1vZGUgbGVfYXVkaW9fY2hhbm5lbF9tb2RlMmF1ZGlvX2hhbCh1aW50OF90IGNoYW5uZWxzX2NvdW50KSB7Ci0gIHN3aXRjaCAoY2hhbm5lbHNfY291bnQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gQ2hhbm5lbE1vZGU6Ok1PTk87Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIENoYW5uZWxNb2RlOjpTVEVSRU87Ci0gIH0KLSAgcmV0dXJuIENoYW5uZWxNb2RlOjpVTktOT1dOOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbms6OkNsZWFudXAoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHNpbmsiOwotICBTdG9wU2Vzc2lvbigpOwotICBkZWxldGUgbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlOwotICBsZV9hdWRpb19zaW5rX2hhbF9jbGllbnRpbnRlcmZhY2UgPSBudWxscHRyOwotICBkZWxldGUgbGVfYXVkaW9fc2luazsKLSAgbGVfYXVkaW9fc2luayA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6U2V0UGNtUGFyYW1ldGVycygKLSAgICBjb25zdCBQY21QYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgbGVfYXVkaW9fc2luay0+TGVBdWRpb1NldFNlbGVjdGVkSGFsUGNtQ29uZmlnKAotICAgICAgbGVfYXVkaW9fc2FtcGxlX3JhdGUyYXVkaW9faGFsKHBhcmFtcy5zYW1wbGVfcmF0ZSksCi0gICAgICBsZV9hdWRpb19iaXRfcmF0ZTJhdWRpb19oYWwocGFyYW1zLmJpdHNfcGVyX3NhbXBsZSksCi0gICAgICBsZV9hdWRpb19jaGFubmVsX21vZGUyYXVkaW9faGFsKHBhcmFtcy5jaGFubmVsc19jb3VudCksCi0gICAgICBwYXJhbXMuZGF0YV9pbnRlcnZhbF91cyk7Ci19Ci0KLS8vIFVwZGF0ZSBMZSBBdWRpbyBkZWxheSByZXBvcnQgdG8gQmx1ZXRvb3RoQXVkaW8gSEFMCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbms6OlNldFJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcykgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGVsYXlfcmVwb3J0X21zPSIgPDwgZGVsYXlfcmVwb3J0X21zIDw8ICIgbXMiOwotICBsZV9hdWRpb19zaW5rLT5TZXRSZW1vdGVEZWxheShkZWxheV9yZXBvcnRfbXMpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbms6OlN0YXJ0U2Vzc2lvbigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBBdWRpb0NvbmZpZ3VyYXRpb25fMl8xIGF1ZGlvX2NvbmZpZzsKLSAgYXVkaW9fY29uZmlnLnBjbUNvbmZpZyhsZV9hdWRpb19zaW5rLT5MZUF1ZGlvR2V0U2VsZWN0ZWRIYWxQY21Db25maWcoKSk7Ci0gIGlmICghbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlLT5VcGRhdGVBdWRpb0NvbmZpZ18yXzEoYXVkaW9fY29uZmlnKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2Fubm90IHVwZGF0ZSBhdWRpbyBjb25maWcgdG8gSEFMIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlLT5TdGFydFNlc3Npb25fMl8xKCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFsZV9hdWRpb19zaW5rLT5TZXRBdWRpb0N0cmxBY2tTdGF0ZUFuZFJlc2V0UGVuZGluZ1N0YXJ0U3RyZWFtRmxhZygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICIsIG5vIHBlbmRpbmcgc3RhcnQgc3RyZWFtIHJlcXVlc3QiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxlX2F1ZGlvX3NpbmtfaGFsX2NsaWVudGludGVyZmFjZS0+U3RyZWFtU3RhcnRlZCgKLSAgICAgIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6U1VDQ0VTU19GSU5JU0hFRCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6Q2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoIWxlX2F1ZGlvX3NpbmstPlNldEF1ZGlvQ3RybEFja1N0YXRlQW5kUmVzZXRQZW5kaW5nU3RhcnRTdHJlYW1GbGFnKAotICAgICAgICAgIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6RkFJTFVSRSkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIiwgbm8gcGVuZGluZyBzdGFydCBzdHJlYW0gcmVxdWVzdCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlLT5TdHJlYW1TdGFydGVkKAotICAgICAgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rOjpTdG9wU2Vzc2lvbigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2luayI7Ci0gIGxlX2F1ZGlvX3NpbmstPlNldEF1ZGlvQ3RybEFja1N0YXRlQW5kUmVzZXRQZW5kaW5nU3RhcnRTdHJlYW1GbGFnKCk7Ci0gIGxlX2F1ZGlvX3NpbmtfaGFsX2NsaWVudGludGVyZmFjZS0+RW5kU2Vzc2lvbigpOwotfQotCi1zaXplX3QgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6UmVhZCh1aW50OF90KiBwX2J1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHJldHVybiBsZV9hdWRpb19zaW5rX2hhbF9jbGllbnRpbnRlcmZhY2UtPlJlYWRBdWRpb0RhdGEocF9idWYsIGxlbik7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlOjpDbGVhbnVwKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzb3VyY2UiOwotICBTdG9wU2Vzc2lvbigpOwotICBkZWxldGUgbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2U7Ci0gIGxlX2F1ZGlvX3NvdXJjZV9oYWxfY2xpZW50aW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgZGVsZXRlIGxlX2F1ZGlvX3NvdXJjZTsKLSAgbGVfYXVkaW9fc291cmNlID0gbnVsbHB0cjsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2U6OlNldFBjbVBhcmFtZXRlcnMoCi0gICAgY29uc3QgUGNtUGFyYW1ldGVycyYgcGFyYW1zKSB7Ci0gIGxlX2F1ZGlvX3NvdXJjZS0+TGVBdWRpb1NldFNlbGVjdGVkSGFsUGNtQ29uZmlnKAotICAgICAgbGVfYXVkaW9fc2FtcGxlX3JhdGUyYXVkaW9faGFsKHBhcmFtcy5zYW1wbGVfcmF0ZSksCi0gICAgICBsZV9hdWRpb19iaXRfcmF0ZTJhdWRpb19oYWwocGFyYW1zLmJpdHNfcGVyX3NhbXBsZSksCi0gICAgICBsZV9hdWRpb19jaGFubmVsX21vZGUyYXVkaW9faGFsKHBhcmFtcy5jaGFubmVsc19jb3VudCksCi0gICAgICBwYXJhbXMuZGF0YV9pbnRlcnZhbF91cyk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlOjpTZXRSZW1vdGVEZWxheSh1aW50MTZfdCBkZWxheV9yZXBvcnRfbXMpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRlbGF5X3JlcG9ydF9tcz0iIDw8IGRlbGF5X3JlcG9ydF9tcyA8PCAiIG1zIjsKLSAgbGVfYXVkaW9fc291cmNlLT5TZXRSZW1vdGVEZWxheShkZWxheV9yZXBvcnRfbXMpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6U3RhcnRTZXNzaW9uKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIGlmICghaXNfc291cmNlX2hhbF9lbmFibGVkKCkpIHJldHVybjsKLSAgQXVkaW9Db25maWd1cmF0aW9uXzJfMSBhdWRpb19jb25maWc7Ci0gIGF1ZGlvX2NvbmZpZy5wY21Db25maWcobGVfYXVkaW9fc291cmNlLT5MZUF1ZGlvR2V0U2VsZWN0ZWRIYWxQY21Db25maWcoKSk7Ci0gIGlmICghbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2UtPlVwZGF0ZUF1ZGlvQ29uZmlnXzJfMSgKLSAgICAgICAgICBhdWRpb19jb25maWcpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW5ub3QgdXBkYXRlIGF1ZGlvIGNvbmZpZyB0byBIQUwiOwotICAgIHJldHVybjsKLSAgfQotICBsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZS0+U3RhcnRTZXNzaW9uXzJfMSgpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFsZV9hdWRpb19zb3VyY2UtPlNldEF1ZGlvQ3RybEFja1N0YXRlQW5kUmVzZXRQZW5kaW5nU3RhcnRTdHJlYW1GbGFnKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIiwgbm8gcGVuZGluZyBzdGFydCBzdHJlYW0gcmVxdWVzdCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2UtPlN0cmVhbVN0YXJ0ZWQoCi0gICAgICBCbHVldG9vdGhBdWRpb0N0cmxBY2s6OlNVQ0NFU1NfRklOSVNIRUQpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6Q2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoIWxlX2F1ZGlvX3NvdXJjZS0+U2V0QXVkaW9DdHJsQWNrU3RhdGVBbmRSZXNldFBlbmRpbmdTdGFydFN0cmVhbUZsYWcoCi0gICAgICAgICAgQmx1ZXRvb3RoQXVkaW9DdHJsQWNrOjpGQUlMVVJFKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiLCBubyBwZW5kaW5nIHN0YXJ0IHN0cmVhbSByZXF1ZXN0IjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZS0+U3RyZWFtU3RhcnRlZCgKLSAgICAgIEJsdWV0b290aEF1ZGlvQ3RybEFjazo6RkFJTFVSRSk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlOjpTdG9wU2Vzc2lvbigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc291cmNlIjsKLSAgbGVfYXVkaW9fc291cmNlLT5TZXRBdWRpb0N0cmxBY2tTdGF0ZUFuZFJlc2V0UGVuZGluZ1N0YXJ0U3RyZWFtRmxhZygpOwotICBsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZS0+RW5kU2Vzc2lvbigpOwotfQotCi1zaXplX3QgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlOjpXcml0ZShjb25zdCB1aW50OF90KiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbikgewotICByZXR1cm4gbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2UtPldyaXRlQXVkaW9EYXRhKHBfYnVmLCBsZW4pOwotfQotCi1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXRTaW5rKAotICAgIFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApIHsKLSAgaWYgKHNpbmtfID09IG51bGxwdHIpIHsKLSAgICBzaW5rXyA9IG5ldyBTaW5rKCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIFNpbmsgaXMgYWxyZWFkeSBhY3F1aXJlZCI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgbGVfYXVkaW9fc2luayA9IG5ldyBMZUF1ZGlvU2lua1RyYW5zcG9ydChzdGQ6Om1vdmUoc3RyZWFtX2NiKSk7Ci0gIGxlX2F1ZGlvX3NpbmtfaGFsX2NsaWVudGludGVyZmFjZSA9Ci0gICAgICBuZXcgYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9TaW5rQ2xpZW50SW50ZXJmYWNlKGxlX2F1ZGlvX3NpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9vcCk7Ci0gIGlmICghbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlLT5Jc1ZhbGlkKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogQmx1ZXRvb3RoQXVkaW8gSEFMIGZvciBMZSBBdWRpbyBpcyBpbnZhbGlkPyEiOwotICAgIGRlbGV0ZSBsZV9hdWRpb19zaW5rX2hhbF9jbGllbnRpbnRlcmZhY2U7Ci0gICAgbGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgICBkZWxldGUgbGVfYXVkaW9fc2luazsKLSAgICBsZV9hdWRpb19zaW5rID0gbnVsbHB0cjsKLSAgICBkZWxldGUgc2lua187Ci0gICAgc2lua18gPSBudWxscHRyOwotCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICByZXR1cm4gc2lua187Ci19Ci0KLWJvb2wgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6SXNTaW5rQWNxdWlyZWQoKSB7IHJldHVybiBzaW5rXyAhPSBudWxscHRyOyB9Ci0KLWJvb2wgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6UmVsZWFzZVNpbmsoTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luayogc2luaykgewotICBpZiAoc2luayAhPSBzaW5rXykgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBjYW4ndCByZWxlYXNlIG5vdCBhY3F1aXJlZCBzaW5rIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobGVfYXVkaW9fc2lua19oYWxfY2xpZW50aW50ZXJmYWNlICYmIGxlX2F1ZGlvX3NpbmspIHNpbmstPkNsZWFudXAoKTsKLQotICBkZWxldGUgKHNpbmtfKTsKLSAgc2lua18gPSBudWxscHRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2UqIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OkdldFNvdXJjZSgKLSAgICBTdHJlYW1DYWxsYmFja3Mgc3RyZWFtX2NiLAotICAgIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wKSB7Ci0gIGlmIChzb3VyY2VfID09IG51bGxwdHIpIHsKLSAgICBzb3VyY2VfID0gbmV3IFNvdXJjZSgpOwotICB9IGVsc2UgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBTb3VyY2UgaXMgYWxyZWFkeSBhY3F1aXJlZCI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgbGVfYXVkaW9fc291cmNlID0gbmV3IExlQXVkaW9Tb3VyY2VUcmFuc3BvcnQoc3RkOjptb3ZlKHN0cmVhbV9jYikpOwotICBsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZSA9Ci0gICAgICBuZXcgYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9Tb3VyY2VDbGllbnRJbnRlcmZhY2UobGVfYXVkaW9fc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9vcCk7Ci0gIGlmICghbGVfYXVkaW9fc291cmNlX2hhbF9jbGllbnRpbnRlcmZhY2UtPklzVmFsaWQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBCbHVldG9vdGhBdWRpbyBIQUwgZm9yIExlIEF1ZGlvIGlzIGludmFsaWQ/ISI7Ci0gICAgZGVsZXRlIGxlX2F1ZGlvX3NvdXJjZV9oYWxfY2xpZW50aW50ZXJmYWNlOwotICAgIGxlX2F1ZGlvX3NvdXJjZV9oYWxfY2xpZW50aW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgICBkZWxldGUgbGVfYXVkaW9fc291cmNlOwotICAgIGxlX2F1ZGlvX3NvdXJjZSA9IG51bGxwdHI7Ci0gICAgZGVsZXRlIHNvdXJjZV87Ci0gICAgc291cmNlXyA9IG51bGxwdHI7Ci0KLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHJldHVybiBzb3VyY2VfOwotfQotCi1ib29sIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OklzU291cmNlQWNxdWlyZWQoKSB7IHJldHVybiBzb3VyY2VfICE9IG51bGxwdHI7IH0KLQotYm9vbCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpSZWxlYXNlU291cmNlKAotICAgIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZSogc291cmNlKSB7Ci0gIGlmIChzb3VyY2UgIT0gc291cmNlXykgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBjYW4ndCByZWxlYXNlIG5vdCBhY3F1aXJlZCBzb3VyY2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChsZV9hdWRpb19zb3VyY2VfaGFsX2NsaWVudGludGVyZmFjZSAmJiBsZV9hdWRpb19zb3VyY2UpIHNvdXJjZS0+Q2xlYW51cCgpOwotCi0gIGRlbGV0ZSAoc291cmNlXyk7Ci0gIHNvdXJjZV8gPSBudWxscHRyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBhdWRpbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvYXVkaW9faGFsX2ludGVyZmFjZS9sZV9hdWRpb19zb2Z0d2FyZS5oIGIvYXVkaW9faGFsX2ludGVyZmFjZS9sZV9hdWRpb19zb2Z0d2FyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTk1ZTZkLi4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hhbF9pbnRlcmZhY2UvbGVfYXVkaW9fc29mdHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLQotY29uc3RleHByIHVpbnQ4X3Qga0NoYW5uZWxOdW1iZXJNb25vID0gMTsKLWNvbnN0ZXhwciB1aW50OF90IGtDaGFubmVsTnVtYmVyU3RlcmVvID0gMjsKLQotY29uc3RleHByIHVpbnQzMl90IGtTYW1wbGVSYXRlNDgwMDAgPSA0ODAwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrU2FtcGxlUmF0ZTQ0MTAwID0gNDQxMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga1NhbXBsZVJhdGUzMjAwMCA9IDMyMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtTYW1wbGVSYXRlMjQwMDAgPSAyNDAwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrU2FtcGxlUmF0ZTE2MDAwID0gMTYwMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga1NhbXBsZVJhdGU4MDAwID0gODAwMDsKLQotY29uc3RleHByIHVpbnQ4X3Qga0JpdHNQZXJTYW1wbGUxNiA9IDE2OwotY29uc3RleHByIHVpbnQ4X3Qga0JpdHNQZXJTYW1wbGUyNCA9IDI0OwotY29uc3RleHByIHVpbnQ4X3Qga0JpdHNQZXJTYW1wbGUzMiA9IDMyOwotCi1zdHJ1Y3QgU3RyZWFtQ2FsbGJhY2tzIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGJvb2wgc3RhcnRfbWVkaWFfdGFzayk+IG9uX3Jlc3VtZV87Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh2b2lkKT4gb25fc3VzcGVuZF87Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCYpPiBvbl9tZXRhZGF0YV91cGRhdGVfOwotfTsKLQotY2xhc3MgTGVBdWRpb0NsaWVudEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdHJ1Y3QgUGNtUGFyYW1ldGVycyB7Ci0gICAgdWludDMyX3QgZGF0YV9pbnRlcnZhbF91czsKLSAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLSAgICB1aW50OF90IGJpdHNfcGVyX3NhbXBsZTsKLSAgICB1aW50OF90IGNoYW5uZWxzX2NvdW50OwotICB9OwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSUNsaWVudEludGVyZmFjZUVuZHBvaW50IHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JQ2xpZW50SW50ZXJmYWNlRW5kcG9pbnQoKSA9IGRlZmF1bHQ7Ci0gICAgdmlydHVhbCB2b2lkIENsZWFudXAoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFNldFBjbVBhcmFtZXRlcnMoY29uc3QgUGNtUGFyYW1ldGVycyYgcGFyYW1zKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFNldFJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBTdGFydFNlc3Npb24oKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFN0b3BTZXNzaW9uKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpID0gMDsKLSAgfTsKLQotIHB1YmxpYzoKLSAgY2xhc3MgU2luayA6IHB1YmxpYyBJQ2xpZW50SW50ZXJmYWNlRW5kcG9pbnQgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgflNpbmsoKSA9IGRlZmF1bHQ7Ci0KLSAgICB2b2lkIENsZWFudXAoKSBvdmVycmlkZTsKLSAgICB2b2lkIFNldFBjbVBhcmFtZXRlcnMoY29uc3QgUGNtUGFyYW1ldGVycyYgcGFyYW1zKSBvdmVycmlkZTsKLSAgICB2b2lkIFNldFJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcykgb3ZlcnJpZGU7Ci0gICAgdm9pZCBTdGFydFNlc3Npb24oKSBvdmVycmlkZTsKLSAgICB2b2lkIFN0b3BTZXNzaW9uKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpIG92ZXJyaWRlOwotICAgIHZvaWQgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpIG92ZXJyaWRlOwotCi0gICAgLy8gUmVhZCB0aGUgc3RyZWFtIG9mIGJ5dGVzIHNpbmtlZCB0byB1cyBieSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgc2l6ZV90IFJlYWQodWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbik7Ci0gIH07Ci0gIGNsYXNzIFNvdXJjZSA6IHB1YmxpYyBJQ2xpZW50SW50ZXJmYWNlRW5kcG9pbnQgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgflNvdXJjZSgpID0gZGVmYXVsdDsKLQotICAgIHZvaWQgQ2xlYW51cCgpIG92ZXJyaWRlOwotICAgIHZvaWQgU2V0UGNtUGFyYW1ldGVycyhjb25zdCBQY21QYXJhbWV0ZXJzJiBwYXJhbXMpIG92ZXJyaWRlOwotICAgIHZvaWQgU2V0UmVtb3RlRGVsYXkodWludDE2X3QgZGVsYXlfcmVwb3J0X21zKSBvdmVycmlkZTsKLSAgICB2b2lkIFN0YXJ0U2Vzc2lvbigpIG92ZXJyaWRlOwotICAgIHZvaWQgU3RvcFNlc3Npb24oKSBvdmVycmlkZTsKLSAgICB2b2lkIENvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBTb3VyY2UgdGhlIGdpdmVuIHN0cmVhbSBvZiBieXRlcyB0byBiZSBzaW5rZWQgaW50byB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgc2l6ZV90IFdyaXRlKGNvbnN0IHVpbnQ4X3QqIHBfYnVmLCB1aW50MzJfdCBsZW4pOwotICB9OwotCi0gIC8vIEdldCBMRSBBdWRpbyBzaW5rIGNsaWVudCBpbnRlcmZhY2UgaWYgaXQncyBub3QgcHJldmlvdXNseSBhY3F1aXJlZCBhbmQgbm90Ci0gIC8vIHlldCByZWxlYXNlZC4KLSAgU2luayogR2V0U2luayhTdHJlYW1DYWxsYmFja3Mgc3RyZWFtX2NiLAotICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wKTsKLSAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0cnlpbmcgdG8gZ2V0IHNpbmsgaW50ZXJmYWNlCi0gIGJvb2wgSXNTaW5rQWNxdWlyZWQoKTsKLSAgLy8gUmVsZWFzZSBzaW5rIGludGVyZmFjZSBpZiBiZWxvbmdzIHRvIExFIGF1ZGlvIGNsaWVudCBpbnRlcmZhY2UKLSAgYm9vbCBSZWxlYXNlU2luayhTaW5rKiBzaW5rKTsKLQotICAvLyBHZXQgTEUgQXVkaW8gc291cmNlIGNsaWVudCBpbnRlcmZhY2UgaWYgaXQncyBub3QgcHJldmlvdXNseSBhY3F1aXJlZCBhbmQKLSAgLy8gbm90IHlldCByZWxlYXNlZC4KLSAgU291cmNlKiBHZXRTb3VyY2UoU3RyZWFtQ2FsbGJhY2tzIHN0cmVhbV9jYiwKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApOwotICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRyeWluZyB0byBnZXQgc291cmNlIGludGVyZmFjZQotICBib29sIElzU291cmNlQWNxdWlyZWQoKTsKLSAgLy8gUmVsZWFzZSBzb3VyY2UgaW50ZXJmYWNlIGlmIGJlbG9uZ3MgdG8gTEUgYXVkaW8gY2xpZW50IGludGVyZmFjZQotICBib29sIFJlbGVhc2VTb3VyY2UoU291cmNlKiBzb3VyY2UpOwotCi0gIC8vIEdldCBpbnRlcmZhY2UsIGlmIHByZXZpb3VzbHkgbm90IGluaXRpYWxpemVkIC0gaXQnbGwgaW5pdGlhbGl6ZSBzaW5nbGV0b24uCi0gIHN0YXRpYyBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBHZXQoKTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBpbnRlcmZhY2U7Ci0gIFNpbmsqIHNpbmtfID0gbnVsbHB0cjsKLSAgU291cmNlKiBzb3VyY2VfID0gbnVsbHB0cjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZV9hdWRpbwotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9hdWRpb19oYWxfaW50ZXJmYWNlL2xlX2F1ZGlvX3NvZnR3YXJlX2hvc3QuY2MgYi9hdWRpb19oYWxfaW50ZXJmYWNlL2xlX2F1ZGlvX3NvZnR3YXJlX2hvc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTU1MmEuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGFsX2ludGVyZmFjZS9sZV9hdWRpb19zb2Z0d2FyZV9ob3N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImF1ZGlvX2hhbF9pbnRlcmZhY2UvaGFsX3ZlcnNpb25fbWFuYWdlci5oIgotI2luY2x1ZGUgImF1ZGlvX2hhbF9pbnRlcmZhY2UvbGVfYXVkaW9fc29mdHdhcmUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotCi1uYW1lc3BhY2UgbGVfYXVkaW8gewotCi1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXQoKSB7IHJldHVybiBudWxscHRyOyB9Ci0KLWJvb2wgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6SXNTaW5rQWNxdWlyZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi1ib29sIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlJlbGVhc2VTaW5rKExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbmsqIHNpbmspIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXRTaW5rKAotICAgIFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXNpemVfdCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rOjpSZWFkKHVpbnQ4X3QqIHBfYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLUxlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZSogTGVBdWRpb0NsaWVudEludGVyZmFjZTo6R2V0U291cmNlKAotICAgIFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXNpemVfdCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2U6OldyaXRlKGNvbnN0IHVpbnQ4X3QqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuKSB7Ci0gIHJldHVybiAwOwotfQotCi1ib29sIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OklzU291cmNlQWNxdWlyZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi1ib29sIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlJlbGVhc2VTb3VyY2UoCi0gICAgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlKiBzb3VyY2UpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBhdWRpbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvYXVkaW9faGVhcmluZ19haWRfaHcvQW5kcm9pZC5icCBiL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZmExNWYuLjAwMDAwMDAKLS0tIGEvYXVkaW9faGVhcmluZ19haWRfaHcvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiYXVkaW9faGVhcmluZ19haWRfaHdfZGVmYXVsdHMiLAotICAgIGRlZmF1bHRzOiBbImxpYmNocm9tZV9zdXBwb3J0X2RlZmF1bHRzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC90eXBlcyIsCi0gICAgXSwKLX0KLQotLy8gQXVkaW8gQTJEUCBzaGFyZWQgbGlicmFyeSBmb3IgdGFyZ2V0Ci1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAiYXVkaW8uaGVhcmluZ19haWQuZGVmYXVsdCIsCi0gICAgZGVmYXVsdHM6IFsiYXVkaW9faGVhcmluZ19haWRfaHdfZGVmYXVsdHMiXSwKLSAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2F1ZGlvX2hlYXJpbmdfYWlkX2h3LmNjIiwKLSAgICAgICAgInNyYy9hdWRpb19oZWFyaW5nX2FpZF9od191dGlscy5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbImxpYm9zaSJdLAotfQotCi0vLyBBdWRpbyBBMkRQIGxpYnJhcnkgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0IGFuZCBob3N0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYXVkaW9faGVhcmluZ19haWRfaHciLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbImF1ZGlvX2hlYXJpbmdfYWlkX2h3X2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9hdWRpb19oZWFyaW5nX2FpZF9od190ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImF1ZGlvLmhlYXJpbmdfYWlkLmRlZmF1bHQiLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvYXVkaW9faGVhcmluZ19haWRfaHcvaW5jbHVkZS9hdWRpb19oZWFyaW5nX2FpZF9ody5oIGIvYXVkaW9faGVhcmluZ19haWRfaHcvaW5jbHVkZS9hdWRpb19oZWFyaW5nX2FpZF9ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTRmMjU1Li4wMDAwMDAwCi0tLSBhL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L2luY2x1ZGUvYXVkaW9faGVhcmluZ19haWRfaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYXVkaW9faGVhcmluZ19haWRfaHcuaAotICoKLSAqICBEZXNjcmlwdGlvbjoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQVVESU9fSEVBUklOR19BSURfSFdfSAotI2RlZmluZSBBVURJT19IRUFSSU5HX0FJRF9IV19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEhFQVJJTkdfQUlEX0FVRElPX0hBUkRXQVJFX0lOVEVSRkFDRSAiYXVkaW8uaGVhcmluZ19haWQiCi0jZGVmaW5lIEhFQVJJTkdfQUlEX0NUUkxfUEFUSCAiL2RhdGEvbWlzYy9ibHVlZHJvaWQvLmhlYXJpbmdfYWlkX2N0cmwiCi0jZGVmaW5lIEhFQVJJTkdfQUlEX0RBVEFfUEFUSCAiL2RhdGEvbWlzYy9ibHVlZHJvaWQvLmhlYXJpbmdfYWlkX2RhdGEiCi0KLS8vIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NaIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBhdWRpbyBzb2NrZXQgYnVmZmVyLgotLy8gSWYgb25lIGFzc3VtZXMgdGhlIHdyaXRlIGJ1ZmZlciBpcyBhbHdheXMgZnVsbCBkdXJpbmcgbm9ybWFsIEJUIHBsYXliYWNrLAotLy8gdGhlbiBpbmNyZWFzaW5nIHRoaXMgdmFsdWUgaW5jcmVhc2VzIG91ciBwbGF5YmFjayBsYXRlbmN5LgotLy8KLS8vIEZJWE1FOiBUaGUgQlQgSEFMIHNob3VsZCBjb25zdW1lIGRhdGEgYXQgYSBjb25zdGFudCByYXRlLgotLy8gQXVkaW9GbGluZ2VyIGFzc3VtZXMgdGhhdCB0aGUgSEFMIGRyYXdzIGRhdGEgYXQgYSBjb25zdGFudCByYXRlLCB3aGljaCBpcwotLy8gdHJ1ZSBmb3IgbW9zdCBhdWRpbyBkZXZpY2VzOyBob3dldmVyLCB0aGUgQlQgZW5naW5lIHJlYWRzIGRhdGEgYXQgYSB2YXJpYWJsZQotLy8gcmF0ZSAob3ZlciB0aGUgc2hvcnQgdGVybSksIHdoaWNoIGNvbmZ1c2VzIGJvdGggQXVkaW9GbGluZ2VyIGFzIHdlbGwgYXMKLS8vIGFwcGxpY2F0aW9ucyB3aGljaCBkZWxpdmVyIGRhdGEgYXQgYSAoZ2VuZXJhbGx5KSBmaXhlZCByYXRlLgotLy8KLS8vIDIwICogNTEyIGlzIG5vdCBzdWZmaWNpZW50IHRvIHNtb290aCB0aGUgdmFyaWFiaWxpdHkgZm9yIHNvbWUgQlQgZGV2aWNlcywKLS8vIHJlc3VsdGluZyBpbiBtaXhlciBzbGVlcCBhbmQgdGhyb3R0bGluZy4gV2UgaW5jcmVhc2UgdGhpcyB0byAyOCAqIDUxMiB0byBoZWxwCi0vLyByZWR1Y2UgdGhlIGVmZmVjdCBvZiB2YXJpYWJsZSBkYXRhIGNvbnN1bXB0aW9uLgotI2RlZmluZSBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWiAoMjggKiA1MTIpCi0jZGVmaW5lIEFVRElPX1NUUkVBTV9DT05UUk9MX09VVFBVVF9CVUZGRVJfU1ogMjU2Ci0KLS8vIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMgY29udHJvbHMgaG93IHRoZSBzb2NrZXQgYnVmZmVyIGlzIGRpdmlkZWQKLS8vIGZvciBBdWRpb0ZsaW5nZXIgZGF0YSBkZWxpdmVyeS4gVGhlIEF1ZGlvRmxpbmdlciBtaXhlciBkZWxpdmVycyBkYXRhIGluCi0vLyBjaHVua3Mgb2YgQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU1ogLyBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTLgotLy8gSWYgdGhlIG51bWJlciBvZiBwZXJpb2RzIGlzIDIsIHRoZSBzb2NrZXQgYnVmZmVyIHJlcHJlc2VudHMgImRvdWJsZQotLy8gYnVmZmVyaW5nIiBvZiB0aGUgQXVkaW9GbGluZ2VyIG1peGVyIGJ1ZmZlci4KLS8vCi0vLyBJbiBnZW5lcmFsLCBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTICogMTYgKiA0IHNob3VsZCBiZSBhIGRpdmlzb3IKLS8vIG9mIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NaLgotLy8KLS8vIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgY2hvc2VuIHN1Y2ggdGhhdAotLy8KLS8vIEFVRElPX1NUUkVBTV9CVUZGRVJfU0laRSAqIDEwMDAgLyAoQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUwotLy8gICAgICAgICAqIEFVRElPX1NUUkVBTV9ERUZBVUxUX1JBVEUgKiA0KSA+IDIwIChtcykKLS8vCi0vLyB0byBhdm9pZCBpbnRyb2R1Y2luZyB0aGUgRmFzdE1peGVyIGluIEF1ZGlvRmxpbmdlci4gVXNpbmcgdGhlIEZhc3RNaXhlcgotLy8gcmVzdWx0cyBpbiB1bm5lY2Vzc2FyeSBsYXRlbmN5IGFuZCBDUFUgb3ZlcmhlYWQgZm9yIEJsdWV0b290aC4KLSNkZWZpbmUgQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyAyCi0KLSNkZWZpbmUgQVVESU9fU0tUX0RJU0NPTk5FQ1RFRCAoLTEpCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEhFQVJJTkdfQUlEX0NUUkxfQ01EX05PTkUsCi0gIEhFQVJJTkdfQUlEX0NUUkxfQ01EX0NIRUNLX1JFQURZLAotICBIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVEFSVCwKLSAgSEVBUklOR19BSURfQ1RSTF9DTURfU1RPUCwKLSAgSEVBUklOR19BSURfQ1RSTF9DTURfU1VTUEVORCwKLSAgSEVBUklOR19BSURfQ1RSTF9HRVRfSU5QVVRfQVVESU9fQ09ORklHLAotICBIRUFSSU5HX0FJRF9DVFJMX0dFVF9PVVRQVVRfQVVESU9fQ09ORklHLAotICBIRUFSSU5HX0FJRF9DVFJMX1NFVF9PVVRQVVRfQVVESU9fQ09ORklHLAotICBIRUFSSU5HX0FJRF9DVFJMX0NNRF9PRkZMT0FEX1NUQVJULAotfSB0SEVBUklOR19BSURfQ1RSTF9DTUQ7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEhFQVJJTkdfQUlEX0NUUkxfQUNLX1NVQ0NFU1MsCi0gIEhFQVJJTkdfQUlEX0NUUkxfQUNLX0ZBSUxVUkUsCi0gIEhFQVJJTkdfQUlEX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFLCAvKiBGYWlsdXJlIHdoZW4gaW4gQ2FsbCovCi0gIEhFQVJJTkdfQUlEX0NUUkxfQUNLX1VOU1VQUE9SVEVECi19IHRIRUFSSU5HX0FJRF9DVFJMX0FDSzsKLQotdHlwZWRlZiB1aW50MzJfdCB0SEFfU0FNUExFX1JBVEU7Ci10eXBlZGVmIHVpbnQ4X3QgdEhBX0NIQU5ORUxfQ09VTlQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGNhbGxiYWNrIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIGRlZmluaXRpb25zIGFuZCByZXR1cm4gdmFsdWVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybiB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gQ29tcHV0ZXMgdGhlIEF1ZGlvIEhlYXJpbmcgQWlkIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUuCi0vLyB8Y29kZWNfc2FtcGxlX3JhdGV8IGlzIHRoZSBzYW1wbGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHN0cmVhbS4KLS8vIHxjb2RlY19iaXRzX3Blcl9zYW1wbGV8IGlzIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIG9mIHRoZSBvdXRwdXQKLS8vIHN0cmVhbS4KLS8vIHxjb2RlY19jaGFubmVsX21vZGV8IGlzIHRoZSBjaGFubmVsIG1vZGUgb2YgdGhlIG91dHB1dCBzdHJlYW0uCi0vLwotLy8gVGhlIGJ1ZmZlciBzaXplIGlzIGNvbXB1dGVkIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKLS8vCi0vLyBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TSVpFID0KLS8vICAgIChUSU1FX1BFUklPRF9NUyAqIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMgKgotLy8gICAgIFNBTVBMRV9SQVRFX0haICogTlVNQkVSX09GX0NIQU5ORUxTICogKEJJVFNfUEVSX1NBTVBMRSAvIDgpKSAvIDEwMDAKLS8vCi0vLyBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTIGNvbnRyb2xzIGhvdyB0aGUgc29ja2V0IGJ1ZmZlciBpcwotLy8gZGl2aWRlZCBmb3IgQXVkaW9GbGluZ2VyIGRhdGEgZGVsaXZlcnkuIFRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIgZGVsaXZlcnMKLS8vIGRhdGEgaW4gY2h1bmtzIG9mCi0vLyAoQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU0laRSAvIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMpIC4KLS8vIElmIHRoZSBudW1iZXIgb2YgcGVyaW9kcyBpcyAyLCB0aGUgc29ja2V0IGJ1ZmZlciByZXByZXNlbnRzICJkb3VibGUKLS8vIGJ1ZmZlcmluZyIgb2YgdGhlIEF1ZGlvRmxpbmdlciBtaXhlciBidWZmZXIuCi0vLwotLy8gRnVydGhlcm1vcmUsIHRoZSBBdWRpb0ZsaW5nZXIgZXhwZWN0cyB0aGUgYnVmZmVyIHNpemUgdG8gYmUgYSBtdWx0aXBsZQotLy8gb2YgMTYgZnJhbWVzLgotLy8KLS8vIE5PVEU6IEN1cnJlbnRseSwgdGhlIGNvbXB1dGF0aW9uIHVzZXMgdGhlIGNvbnNlcnZhdGl2ZSAyMG1zIHRpbWUgcGVyaW9kLgotLy8KLS8vIFJldHVybnMgdGhlIGNvbXB1dGVkIGJ1ZmZlciBzaXplLiBJZiBhbnkgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaXMKLS8vIGludmFsaWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRlZmF1bHQgfEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NafC4KLWV4dGVybiBzaXplX3QgYXVkaW9faGFfaHdfc3RyZWFtX2NvbXB1dGVfYnVmZmVyX3NpemUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QgY29kZWNfc2FtcGxlX3JhdGUsCi0gICAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZSwKLSAgICBidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QgY29kZWNfY2hhbm5lbF9tb2RlKTsKLQotI2VuZGlmIC8qIEFVRElPX0hFQVJJTkdfQUlEX0hXX0ggKi8KZGlmZiAtLWdpdCBhL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3NyYy9hdWRpb19oZWFyaW5nX2FpZF9ody5jYyBiL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3NyYy9hdWRpb19oZWFyaW5nX2FpZF9ody5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5MTkxZS4uMDAwMDAwMAotLS0gYS9hdWRpb19oZWFyaW5nX2FpZF9ody9zcmMvYXVkaW9faGVhcmluZ19haWRfaHcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEltcGxlbWVudHMgaGFsIGZvciBibHVlZHJvaWQgaGEgYXVkaW8gZGV2aWNlICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfaGVhcmluZ19haWRfaHciCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvaGFzaF9tYXBfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zb2NrZXRfdXRpbHMvc29ja2V0cy5oIgotCi0jaW5jbHVkZSAiYXVkaW9faGVhcmluZ19haWRfaHcvaW5jbHVkZS9hdWRpb19oZWFyaW5nX2FpZF9ody5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDVFJMX0NIQU5fUkVUUllfQ09VTlQgMwotI2RlZmluZSBVU0VDX1BFUl9TRUMgMTAwMDAwMEwKLSNkZWZpbmUgU09DS19TRU5EX1RJTUVPVVRfTVMgMjAwMCAvKiBUaW1lb3V0IGZvciBzZW5kaW5nICovCi0jZGVmaW5lIFNPQ0tfUkVDVl9USU1FT1VUX01TIDUwMDAgLyogVGltZW91dCBmb3IgcmVjZWl2aW5nICovCi0KLS8vIHNldCBXUklURV9QT0xMX01TIHRvIDAgZm9yIGJsb2NraW5nIHNvY2tldHMsIG5vbnplcm8gZm9yIHBvbGxlZCBub24tYmxvY2tpbmcKLS8vIHNvY2tldHMKLSNkZWZpbmUgV1JJVEVfUE9MTF9NUyAyMAotCi0jZGVmaW5lIEZOTE9HKCkgQUxPR1YoIiVzOiVkICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKQotI2RlZmluZSBERUJVRyhmbXQsIGFyZ3MuLi4pIFwKLSAgQUxPR0QoIiVzOiVkICVzOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgIyNhcmdzKQotI2RlZmluZSBJTkZPKGZtdCwgYXJncy4uLikgXAotICBBTE9HSSgiJXM6JWQgJXM6ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCAjI2FyZ3MpCi0jZGVmaW5lIFdBUk4oZm10LCBhcmdzLi4uKSBcCi0gIEFMT0dXKCIlczolZCAlczogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncykKLSNkZWZpbmUgRVJST1IoZm10LCBhcmdzLi4uKSBcCi0gIEFMT0dFKCIlczolZCAlczogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncykKLQotI2RlZmluZSBBU1NFUlRDKGNvbmQsIG1zZywgdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFUlJPUigiIyMjIEFTU0VSVCA6ICVzIGxpbmUgJWQgJXMgKCVkKSAjIyMiLCBfX0ZJTEVfXywgX19MSU5FX18sIG1zZywgXAotICAgICAgICAgIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBDQVNFX1JFVFVSTl9TVFIoY29uc3QpIFwKLSAgY2FzZSBjb25zdDogICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb25zdDsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGF1ZGlvX2hhX2h3X2R1bXBfY3RybF9ldmVudCh0SEVBUklOR19BSURfQ1RSTF9DTUQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0NNRF9OT05FKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0NNRF9DSEVDS19SRUFEWSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9DTURfU1RBUlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfQ01EX1NUT1ApCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfQ01EX1NVU1BFTkQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfR0VUX0lOUFVUX0FVRElPX0NPTkZJRykKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9HRVRfT1VUUFVUX0FVRElPX0NPTkZJRykKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9TRVRfT1VUUFVUX0FVRElPX0NPTkZJRykKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9DTURfT0ZGTE9BRF9TVEFSVCkKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gIlVOS05PV04gSEVBUklOR19BSURfQ1RSTF9DTUQiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBMb2NhbCB0eXBlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEFVRElPX0hBX1NUQVRFX1NUQVJUSU5HLAotICBBVURJT19IQV9TVEFURV9TVEFSVEVELAotICBBVURJT19IQV9TVEFURV9TVE9QUElORywKLSAgQVVESU9fSEFfU1RBVEVfU1RPUFBFRCwKLSAgLyogbmVlZCBleHBsaWNpdCBzZXQgcGFyYW0gY2FsbCB0byByZXN1bWUgKHN1c3BlbmQ9ZmFsc2UpICovCi0gIEFVRElPX0hBX1NUQVRFX1NVU1BFTkRFRCwKLSAgQVVESU9fSEFfU1RBVEVfU1RBTkRCWSAvKiBhbGxvd3Mgd3JpdGUgdG8gYXV0b3Jlc3VtZSAqLwotfSBoYV9zdGF0ZV90OwotCi1zdHJ1Y3QgaGFfc3RyZWFtX2luOwotc3RydWN0IGhhX3N0cmVhbV9vdXQ7Ci0KLXN0cnVjdCBoYV9hdWRpb19kZXZpY2UgewotICAvLyBJbXBvcnRhbnQ6IGRldmljZSBtdXN0IGJlIGZpcnN0IGFzIGFuIGF1ZGlvX2h3X2RldmljZSogbWF5IGJlIGNhc3QgdG8KLSAgLy8gaGFfYXVkaW9fZGV2aWNlKiB3aGVuIHRoZSB0eXBlIGlzIGltcGxpY2l0bHkga25vd24uCi0gIHN0cnVjdCBhdWRpb19od19kZXZpY2UgZGV2aWNlOwotICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCogbXV0ZXg7ICAvLyBTZWUgbm90ZSBiZWxvdyBvbiBtdXRleCBhY3F1aXNpdGlvbiBvcmRlci4KLSAgc3RydWN0IGhhX3N0cmVhbV9pbiogaW5wdXQ7Ci0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXRwdXQ7Ci19OwotCi1zdHJ1Y3QgaGFfY29uZmlnIHsKLSAgdWludDMyX3QgcmF0ZTsKLSAgdWludDMyX3QgY2hhbm5lbF9tYXNrOwotICBib29sIGlzX3N0ZXJlb190b19tb25vOyAgLy8gVHJ1ZSBpZiBmZXRjaGluZyBTdGVyZW8gYW5kIG1peGluZyBpbnRvIE1vbm8KLSAgaW50IGZvcm1hdDsKLX07Ci0KLS8qIG1vdmUgY3RybF9mZCBvdXRzaWRlIG91dHB1dCBzdHJlYW0gYW5kIGtlZXAgb3BlbiB1bnRpbCBIQUwgdW5sb2FkZWQgPyAqLwotCi1zdHJ1Y3QgaGFfc3RyZWFtX2NvbW1vbiB7Ci0gIHN0ZDo6cmVjdXJzaXZlX211dGV4KiBtdXRleDsgIC8vIFNlZSBub3RlIGJlbG93IG9uIG11dGV4IGFjcXVpc2l0aW9uIG9yZGVyLgotICBpbnQgY3RybF9mZDsKLSAgaW50IGF1ZGlvX2ZkOwotICBzaXplX3QgYnVmZmVyX3N6OwotICBzdHJ1Y3QgaGFfY29uZmlnIGNmZzsKLSAgaGFfc3RhdGVfdCBzdGF0ZTsKLX07Ci0KLXN0cnVjdCBoYV9zdHJlYW1fb3V0IHsKLSAgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgc3RyZWFtOwotICBzdHJ1Y3QgaGFfc3RyZWFtX2NvbW1vbiBjb21tb247Ci0gIHVpbnQ2NF90IGZyYW1lc19wcmVzZW50ZWQ7ICAvLyBmcmFtZXMgd3JpdHRlbiwgbmV2ZXIgcmVzZXQKLSAgdWludDY0X3QgZnJhbWVzX3JlbmRlcmVkOyAgIC8vIGZyYW1lcyB3cml0dGVuLCByZXNldCBvbiBzdGFuZGJ5Ci19OwotCi1zdHJ1Y3QgaGFfc3RyZWFtX2luIHsKLSAgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiBzdHJlYW07Ci0gIHN0cnVjdCBoYV9zdHJlYW1fY29tbW9uIGNvbW1vbjsKLX07Ci0KLS8qCi0gKiBNdXRleCBhY3F1aXNpdGlvbiBvcmRlcjoKLSAqCi0gKiBUaGUgaGFfYXVkaW9fZGV2aWNlIChhZGV2KSBtdXRleCBtdXN0IGJlIGFjcXVpcmVkIGJlZm9yZQotICogdGhlIGhhX3N0cmVhbV9jb21tb24gKG91dCBvciBpbikgbXV0ZXguCi0gKgotICogVGhpcyBtYXkgZGlmZmVyIGZyb20gb3RoZXIgYXVkaW8gSEFMcy4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhc2hfbWFwX3V0aWxzX2R1bXBfc3RyaW5nX2tleXNfc3RyaW5nX3ZhbHVlcygKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbWFwKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcHRyIDogbWFwKSB7Ci0gICAgSU5GTygia2V5OiAnJXMnIHZhbHVlOiAnJXMnXG4iLCBwdHIuZmlyc3QuY19zdHIoKSwgcHRyLnNlY29uZC5jX3N0cigpKTsKLSAgfQotfQotCi1zdGF0aWMgc2l6ZV90IG91dF9nZXRfYnVmZmVyX3NpemUoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhX29wZW5fY3RybF9wYXRoKHN0cnVjdCBoYV9zdHJlYW1fY29tbW9uKiBjb21tb24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgTWlzY2VsbGFuZW91cyBoZWxwZXIgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGxvZ3MgdGltZXN0YW1wIHdpdGggbWljcm9zZWMgcHJlY2lzaW9uCi0gICBwcHJldiBpcyBvcHRpb25hbCBpbiBjYXNlIGEgZGVkaWNhdGVkIGRpZmYgaXMgcmVxdWlyZWQgKi8KLXN0YXRpYyB2b2lkIHRzX2xvZyhVTlVTRURfQVRUUiBjb25zdCBjaGFyKiB0YWcsIFVOVVNFRF9BVFRSIGludCB2YWwsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjKiBwcHJldl9vcHQpIHsKLSAgc3RydWN0IHRpbWVzcGVjIG5vdzsKLSAgc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBwcmV2ID0gezAsIDB9OwotICB1bnNpZ25lZCBsb25nIGxvbmcgbm93X3VzOwotICB1bnNpZ25lZCBsb25nIGxvbmcgZGlmZl91czsKLQotICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm5vdyk7Ci0KLSAgbm93X3VzID0gbm93LnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIG5vdy50dl9uc2VjIC8gMTAwMDsKLQotICBpZiAocHByZXZfb3B0KSB7Ci0gICAgZGlmZl91cyA9IChub3cudHZfc2VjIC0gcHJldi50dl9zZWMpICogVVNFQ19QRVJfU0VDICsKLSAgICAgICAgICAgICAgKG5vdy50dl9uc2VjIC0gcHJldi50dl9uc2VjKSAvIDEwMDA7Ci0gICAgKnBwcmV2X29wdCA9IG5vdzsKLSAgICBERUJVRygiWyVzXSB0cyAlMDhsbGQsICpkaWZmICUwOGxsZCwgdmFsICVkIiwgdGFnLCBub3dfdXMsIGRpZmZfdXMsIHZhbCk7Ci0gIH0gZWxzZSB7Ci0gICAgZGlmZl91cyA9IChub3cudHZfc2VjIC0gcHJldi50dl9zZWMpICogVVNFQ19QRVJfU0VDICsKLSAgICAgICAgICAgICAgKG5vdy50dl9uc2VjIC0gcHJldi50dl9uc2VjKSAvIDEwMDA7Ci0gICAgcHJldiA9IG5vdzsKLSAgICBERUJVRygiWyVzXSB0cyAlMDhsbGQsIGRpZmYgJTA4bGxkLCB2YWwgJWQiLCB0YWcsIG5vd191cywgZGlmZl91cywgdmFsKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IGNhbGNfYXVkaW90aW1lX3VzZWMoc3RydWN0IGhhX2NvbmZpZyBjZmcsIGludCBieXRlcykgewotICBpbnQgY2hhbl9jb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjZmcuY2hhbm5lbF9tYXNrKTsKLSAgaW50IGJ5dGVzX3Blcl9zYW1wbGU7Ci0KLSAgc3dpdGNoIChjZmcuZm9ybWF0KSB7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKLSAgICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgotICAgICAgYnl0ZXNfcGVyX3NhbXBsZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUQyhmYWxzZSwgInVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQiLCBjZmcuZm9ybWF0KTsKLSAgICAgIGJ5dGVzX3Blcl9zYW1wbGUgPSAyOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gKAotICAgICAgaW50KSgoKGludDY0X3QpYnl0ZXMgKiAoVVNFQ19QRVJfU0VDIC8gKGNoYW5fY291bnQgKiBieXRlc19wZXJfc2FtcGxlKSkpIC8KLSAgICAgICAgICAgY2ZnLnJhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIGJsdWVkcm9pZCBzdGFjayBhZGFwdGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgc2t0X2Nvbm5lY3QoY29uc3QgY2hhciogcGF0aCwgc2l6ZV90IGJ1ZmZlcl9zeikgewotICBpbnQgcmV0OwotICBpbnQgc2t0X2ZkOwotICBpbnQgbGVuOwotCi0gIElORk8oImNvbm5lY3QgdG8gJXMgKHN6ICV6dSkiLCBwYXRoLCBidWZmZXJfc3opOwotCi0gIHNrdF9mZCA9IHNvY2tldChBRl9MT0NBTCwgU09DS19TVFJFQU0sIDApOwotCi0gIGlmIChvc2lfc29ja2V0X2xvY2FsX2NsaWVudF9jb25uZWN0KAotICAgICAgICAgIHNrdF9mZCwgcGF0aCwgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX0FCU1RSQUNULCBTT0NLX1NUUkVBTSkgPCAwKSB7Ci0gICAgRVJST1IoImZhaWxlZCB0byBjb25uZWN0ICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgIGNsb3NlKHNrdF9mZCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgbGVuID0gYnVmZmVyX3N6OwotICByZXQgPQotICAgICAgc2V0c29ja29wdChza3RfZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIChpbnQpc2l6ZW9mKGxlbikpOwotICBpZiAocmV0IDwgMCkgRVJST1IoInNldHNvY2tvcHQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwotCi0gIHJldCA9Ci0gICAgICBzZXRzb2Nrb3B0KHNrdF9mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgKGludClzaXplb2YobGVuKSk7Ci0gIGlmIChyZXQgPCAwKSBFUlJPUigic2V0c29ja29wdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgLyogU29ja2V0IHNlbmQvcmVjZWl2ZSB0aW1lb3V0IHZhbHVlICovCi0gIHN0cnVjdCB0aW1ldmFsIHR2OwotICB0di50dl9zZWMgPSBTT0NLX1NFTkRfVElNRU9VVF9NUyAvIDEwMDA7Ci0gIHR2LnR2X3VzZWMgPSAoU09DS19TRU5EX1RJTUVPVVRfTVMgJSAxMDAwKSAqIDEwMDA7Ci0KLSAgcmV0ID0gc2V0c29ja29wdChza3RfZmQsIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAmdHYsIHNpemVvZih0dikpOwotICBpZiAocmV0IDwgMCkgRVJST1IoInNldHNvY2tvcHQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwotCi0gIHR2LnR2X3NlYyA9IFNPQ0tfUkVDVl9USU1FT1VUX01TIC8gMTAwMDsKLSAgdHYudHZfdXNlYyA9IChTT0NLX1JFQ1ZfVElNRU9VVF9NUyAlIDEwMDApICogMTAwMDsKLQotICByZXQgPSBzZXRzb2Nrb3B0KHNrdF9mZCwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZ0diwgc2l6ZW9mKHR2KSk7Ci0gIGlmIChyZXQgPCAwKSBFUlJPUigic2V0c29ja29wdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgSU5GTygiY29ubmVjdGVkIHRvIHN0YWNrIGZkID0gJWQiLCBza3RfZmQpOwotCi0gIHJldHVybiBza3RfZmQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2t0X3JlYWQoaW50IGZkLCB2b2lkKiBwLCBzaXplX3QgbGVuKSB7Ci0gIHNzaXplX3QgcmVhZDsKLQotICBGTkxPRygpOwotCi0gIHRzX2xvZygic2t0X3JlYWQgcmVjdiIsIGxlbiwgTlVMTCk7Ci0KLSAgT1NJX05PX0lOVFIocmVhZCA9IHJlY3YoZmQsIHAsIGxlbiwgTVNHX05PU0lHTkFMKSk7Ci0gIGlmIChyZWFkID09IC0xKSBFUlJPUigicmVhZCBmYWlsZWQgd2l0aCBlcnJubz0lZFxuIiwgZXJybm8pOwotCi0gIHJldHVybiAoaW50KXJlYWQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2t0X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogcCwgc2l6ZV90IGxlbikgewotICBzc2l6ZV90IHNlbnQ7Ci0gIEZOTE9HKCk7Ci0KLSAgdHNfbG9nKCJza3Rfd3JpdGUiLCBsZW4sIE5VTEwpOwotCi0gIGlmIChXUklURV9QT0xMX01TID09IDApIHsKLSAgICAvLyBkbyBub3QgcG9sbCwgdXNlIGJsb2NraW5nIHNlbmQKLSAgICBPU0lfTk9fSU5UUihzZW50ID0gc2VuZChmZCwgcCwgbGVuLCBNU0dfTk9TSUdOQUwpKTsKLSAgICBpZiAoc2VudCA9PSAtMSkgRVJST1IoIndyaXRlIGZhaWxlZCB3aXRoIGVycm9yKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgICByZXR1cm4gKGludClzZW50OwotICB9Ci0KLSAgLy8gdXNlIG5vbi1ibG9ja2luZyBzZW5kLCBwb2xsCi0gIGludCBtc190aW1lb3V0ID0gU09DS19TRU5EX1RJTUVPVVRfTVM7Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChjb3VudCA8IGxlbikgewotICAgIE9TSV9OT19JTlRSKHNlbnQgPSBzZW5kKGZkLCBwLCBsZW4gLSBjb3VudCwgTVNHX05PU0lHTkFMIHwgTVNHX0RPTlRXQUlUKSk7Ci0gICAgaWYgKHNlbnQgPT0gLTEpIHsKLSAgICAgIGlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgRVJST1IoIndyaXRlIGZhaWxlZCB3aXRoIGVycm9yKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmIChtc190aW1lb3V0ID49IFdSSVRFX1BPTExfTVMpIHsKLSAgICAgICAgdXNsZWVwKFdSSVRFX1BPTExfTVMgKiAxMDAwKTsKLSAgICAgICAgbXNfdGltZW91dCAtPSBXUklURV9QT0xMX01TOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFdBUk4oIndyaXRlIHRpbWVvdXQgZXhjZWVkZWQsIHNlbnQgJXp1IGJ5dGVzIiwgY291bnQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb3VudCArPSBzZW50OwotICAgIHAgPSAoY29uc3QgdWludDhfdCopcCArIHNlbnQ7Ci0gIH0KLSAgcmV0dXJuIChpbnQpY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2t0X2Rpc2Nvbm5lY3QoaW50IGZkKSB7Ci0gIElORk8oImZkICVkIiwgZmQpOwotCi0gIGlmIChmZCAhPSBBVURJT19TS1RfRElTQ09OTkVDVEVEKSB7Ci0gICAgc2h1dGRvd24oZmQsIFNIVVRfUkRXUik7Ci0gICAgY2xvc2UoZmQpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQVVESU8gQ09OVFJPTCBQQVRICi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgaGFfY3RybF9yZWNlaXZlKHN0cnVjdCBoYV9zdHJlYW1fY29tbW9uKiBjb21tb24sIHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgc3NpemVfdCByZXQ7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7OyBpKyspIHsKLSAgICBPU0lfTk9fSU5UUihyZXQgPSByZWN2KGNvbW1vbi0+Y3RybF9mZCwgYnVmZmVyLCBsZW5ndGgsIE1TR19OT1NJR05BTCkpOwotICAgIGlmIChyZXQgPiAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICBFUlJPUigicmVjZWl2ZSBjb250cm9sIGRhdGEgZmFpbGVkOiBwZWVyIGNsb3NlZCIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4pIHsKLSAgICAgIEVSUk9SKCJyZWNlaXZlIGNvbnRyb2wgZGF0YSBmYWlsZWQ6IGVycm9yKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPT0gKENUUkxfQ0hBTl9SRVRSWV9DT1VOVCAtIDEpKSB7Ci0gICAgICBFUlJPUigicmVjZWl2ZSBjb250cm9sIGRhdGEgZmFpbGVkOiBtYXggcmV0cnkgY291bnQiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBJTkZPKCJyZWNlaXZlIGNvbnRyb2wgZGF0YSBmYWlsZWQgKCVzKSwgcmV0cnlpbmciLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci0gIGlmIChyZXQgPD0gMCkgewotICAgIHNrdF9kaXNjb25uZWN0KGNvbW1vbi0+Y3RybF9mZCk7Ci0gICAgY29tbW9uLT5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vLyBTZW5kcyBjb250cm9sIGluZm8gZm9yIHN0cmVhbSB8Y29tbW9ufC4gVGhlIGRhdGEgdG8gc2VuZCBpcyBzdG9yZWQgaW4KLS8vIHxidWZmZXJ8IGFuZCBoYXMgc2l6ZSB8bGVuZ3RofC4KLS8vIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIG51bWJlciBvZiBvY3RldHMgc2VudCwgb3RoZXJ3aXNlIC0xLgotc3RhdGljIGludCBoYV9jdHJsX3NlbmQoc3RydWN0IGhhX3N0cmVhbV9jb21tb24qIGNvbW1vbiwgY29uc3Qgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBzc2l6ZV90IHNlbnQ7Ci0gIHNpemVfdCByZW1haW5pbmcgPSBsZW5ndGg7Ci0gIGludCBpOwotCi0gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDA7ICAvLyBOb3RoaW5nIHRvIGRvCi0KLSAgZm9yIChpID0gMDs7IGkrKykgewotICAgIE9TSV9OT19JTlRSKHNlbnQgPSBzZW5kKGNvbW1vbi0+Y3RybF9mZCwgYnVmZmVyLCByZW1haW5pbmcsIE1TR19OT1NJR05BTCkpOwotICAgIGlmIChzZW50ID09IHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlbWFpbmluZykpIHsKLSAgICAgIHJlbWFpbmluZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHNlbnQgPiAwKSB7Ci0gICAgICBidWZmZXIgPSAoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcikgKyBzZW50KTsKLSAgICAgIHJlbWFpbmluZyAtPSBzZW50OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzZW50IDwgMCkgewotICAgICAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTikgewotICAgICAgICBFUlJPUigic2VuZCBjb250cm9sIGRhdGEgZmFpbGVkOiBlcnJvciglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIElORk8oInNlbmQgY29udHJvbCBkYXRhIGZhaWxlZCAoJXMpLCByZXRyeWluZyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIGlmIChpID49IChDVFJMX0NIQU5fUkVUUllfQ09VTlQgLSAxKSkgewotICAgICAgRVJST1IoInNlbmQgY29udHJvbCBkYXRhIGZhaWxlZDogbWF4IHJldHJ5IGNvdW50Iik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHJlbWFpbmluZyA+IDApIHsKLSAgICBza3RfZGlzY29ubmVjdChjb21tb24tPmN0cmxfZmQpOwotICAgIGNvbW1vbi0+Y3RybF9mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBpbnQgaGFfY29tbWFuZChzdHJ1Y3QgaGFfc3RyZWFtX2NvbW1vbiogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgIHRIRUFSSU5HX0FJRF9DVFJMX0NNRCBjbWQpIHsKLSAgY2hhciBhY2s7Ci0KLSAgREVCVUcoIkhFQVJJTkdfQUlEIENPTU1BTkQgJXMiLCBhdWRpb19oYV9od19kdW1wX2N0cmxfZXZlbnQoY21kKSk7Ci0KLSAgaWYgKGNvbW1vbi0+Y3RybF9mZCA9PSBBVURJT19TS1RfRElTQ09OTkVDVEVEKSB7Ci0gICAgSU5GTygic3RhcnRpbmcgdXAgb3IgcmVjb3ZlcmluZyBmcm9tIHByZXZpb3VzIGVycm9yIik7Ci0gICAgaGFfb3Blbl9jdHJsX3BhdGgoY29tbW9uKTsKLSAgICBpZiAoY29tbW9uLT5jdHJsX2ZkID09IEFVRElPX1NLVF9ESVNDT05ORUNURUQpIHsKLSAgICAgIEVSUk9SKCJmYWlsdXJlIHRvIG9wZW4gY3RybCBwYXRoIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgLyogc2VuZCBjb21tYW5kICovCi0gIHNzaXplX3Qgc2VudDsKLSAgT1NJX05PX0lOVFIoc2VudCA9IHNlbmQoY29tbW9uLT5jdHJsX2ZkLCAmY21kLCAxLCBNU0dfTk9TSUdOQUwpKTsKLSAgaWYgKHNlbnQgPT0gLTEpIHsKLSAgICBFUlJPUigiY21kIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBza3RfZGlzY29ubmVjdChjb21tb24tPmN0cmxfZmQpOwotICAgIGNvbW1vbi0+Y3RybF9mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogd2FpdCBmb3IgYWNrIGJ5dGUgKi8KLSAgaWYgKGhhX2N0cmxfcmVjZWl2ZShjb21tb24sICZhY2ssIDEpIDwgMCkgewotICAgIEVSUk9SKCJIRUFSSU5HX0FJRCBDT01NQU5EICVzOiBubyBBQ0siLCBhdWRpb19oYV9od19kdW1wX2N0cmxfZXZlbnQoY21kKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgREVCVUcoIkhFQVJJTkdfQUlEIENPTU1BTkQgJXMgRE9ORSBTVEFUVVMgJWQiLAotICAgICAgICBhdWRpb19oYV9od19kdW1wX2N0cmxfZXZlbnQoY21kKSwgYWNrKTsKLQotICBpZiAoYWNrID09IEhFQVJJTkdfQUlEX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFKSByZXR1cm4gYWNrOwotICBpZiAoYWNrICE9IEhFQVJJTkdfQUlEX0NUUkxfQUNLX1NVQ0NFU1MpIHsKLSAgICBFUlJPUigiSEVBUklOR19BSUQgQ09NTUFORCAlcyBlcnJvciAlZCIsIGF1ZGlvX2hhX2h3X2R1bXBfY3RybF9ldmVudChjbWQpLAotICAgICAgICAgIGFjayk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfaGFfcmVhZHkoc3RydWN0IGhhX3N0cmVhbV9jb21tb24qIGNvbW1vbikgewotICBpZiAoaGFfY29tbWFuZChjb21tb24sIEhFQVJJTkdfQUlEX0NUUkxfQ01EX0NIRUNLX1JFQURZKSA8IDApIHsKLSAgICBFUlJPUigiY2hlY2sgaGEgcmVhZHkgZmFpbGVkIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhhX3JlYWRfaW5wdXRfYXVkaW9fY29uZmlnKHN0cnVjdCBoYV9zdHJlYW1fY29tbW9uKiBjb21tb24pIHsKLSAgdEhBX1NBTVBMRV9SQVRFIHNhbXBsZV9yYXRlOwotICB0SEFfQ0hBTk5FTF9DT1VOVCBjaGFubmVsX2NvdW50OwotCi0gIGlmIChoYV9jb21tYW5kKGNvbW1vbiwgSEVBUklOR19BSURfQ1RSTF9HRVRfSU5QVVRfQVVESU9fQ09ORklHKSA8IDApIHsKLSAgICBFUlJPUigiZ2V0IGhhIGlucHV0IGF1ZGlvIGNvbmZpZyBmYWlsZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoaGFfY3RybF9yZWNlaXZlKGNvbW1vbiwgJnNhbXBsZV9yYXRlLCBzaXplb2YodEhBX1NBTVBMRV9SQVRFKSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGhhX2N0cmxfcmVjZWl2ZShjb21tb24sICZjaGFubmVsX2NvdW50LCBzaXplb2YodEhBX0NIQU5ORUxfQ09VTlQpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICBjYXNlIDI0MDAwOgotICAgIGNhc2UgNDQxMDA6Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgIGNvbW1vbi0+Y2ZnLnJhdGUgPSBzYW1wbGVfcmF0ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUigiSW52YWxpZCBzYW1wbGUgcmF0ZTogJSIgUFJJdTMyLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGNoYW5uZWxfY291bnQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBjb21tb24tPmNmZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBjb21tb24tPmNmZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUigiSW52YWxpZCBjaGFubmVsIGNvdW50OiAlIiBQUkl1MzIsIGNoYW5uZWxfY291bnQpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gVE9ETzogRm9yIG5vdyBpbnB1dCBhdWRpbyBmb3JtYXQgaXMgYWx3YXlzIGhhcmQtY29kZWQgYXMgUENNIDE2LWJpdAotICBjb21tb24tPmNmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLQotICBJTkZPKCJnb3QgaW5wdXQgYXVkaW8gY29uZmlnICVkICVkIiwgY29tbW9uLT5jZmcuZm9ybWF0LCBjb21tb24tPmNmZy5yYXRlKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoYV9yZWFkX291dHB1dF9hdWRpb19jb25maWcoCi0gICAgc3RydWN0IGhhX3N0cmVhbV9jb21tb24qIGNvbW1vbiwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBjb2RlY19jb25maWcsCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBjb2RlY19jYXBhYmlsaXR5LCBib29sIHVwZGF0ZV9zdHJlYW1fY29uZmlnKSB7Ci0gIHN0cnVjdCBoYV9jb25maWcgc3RyZWFtX2NvbmZpZzsKLQotICBpZiAoaGFfY29tbWFuZChjb21tb24sIEhFQVJJTkdfQUlEX0NUUkxfR0VUX09VVFBVVF9BVURJT19DT05GSUcpIDwgMCkgewotICAgIEVSUk9SKCJnZXQgaGEgb3V0cHV0IGF1ZGlvIGNvbmZpZyBmYWlsZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBSZWNlaXZlIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZwotICBpZiAoaGFfY3RybF9yZWNlaXZlKGNvbW1vbiwgJmNvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChoYV9jdHJsX3JlY2VpdmUoY29tbW9uLCAmY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCkpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoaGFfY3RybF9yZWNlaXZlKGNvbW1vbiwgJmNvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBSZWNlaXZlIHRoZSBjdXJyZW50IGNvZGVjIGNhcGFiaWxpdHkKLSAgaWYgKGhhX2N0cmxfcmVjZWl2ZShjb21tb24sICZjb2RlY19jYXBhYmlsaXR5LT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGhhX2N0cmxfcmVjZWl2ZShjb21tb24sICZjb2RlY19jYXBhYmlsaXR5LT5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCkpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoaGFfY3RybF9yZWNlaXZlKGNvbW1vbiwgJmNvZGVjX2NhcGFiaWxpdHktPmNoYW5uZWxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBzYW1wbGUgcmF0ZQotICBzd2l0Y2ggKGNvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDoKLSAgICAgIHN0cmVhbV9jb25maWcucmF0ZSA9IDQ0MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICBzdHJlYW1fY29uZmlnLnJhdGUgPSA0ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOgotICAgICAgc3RyZWFtX2NvbmZpZy5yYXRlID0gODgyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDoKLSAgICAgIHN0cmVhbV9jb25maWcucmF0ZSA9IDk2MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOgotICAgICAgc3RyZWFtX2NvbmZpZy5yYXRlID0gMTc2NDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgICAgc3RyZWFtX2NvbmZpZy5yYXRlID0gMTkyMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgICBzdHJlYW1fY29uZmlnLnJhdGUgPSAxNjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgICAgc3RyZWFtX2NvbmZpZy5yYXRlID0gMjQwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOgotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUigiSW52YWxpZCBzYW1wbGUgcmF0ZTogMHgleCIsIGNvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBiaXRzIHBlciBzYW1wbGUKLSAgc3dpdGNoIChjb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIHN0cmVhbV9jb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICBzdHJlYW1fY29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIHN0cmVhbV9jb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgYml0cyBwZXIgc2FtcGxlOiAweCV4IiwgY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBjaGFubmVsIG1vZGUKLSAgc3dpdGNoIChjb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgc3RyZWFtX2NvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgc3RyZWFtX2NvbmZpZy5pc19zdGVyZW9fdG9fbW9ubyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgc3RyZWFtX2NvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICBzdHJlYW1fY29uZmlnLmlzX3N0ZXJlb190b19tb25vID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgY2hhbm5lbCBtb2RlOiAweCV4IiwgY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChzdHJlYW1fY29uZmlnLmlzX3N0ZXJlb190b19tb25vKSB7Ci0gICAgc3RyZWFtX2NvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbgotICBpZiAodXBkYXRlX3N0cmVhbV9jb25maWcpIHsKLSAgICBjb21tb24tPmNmZy5yYXRlID0gc3RyZWFtX2NvbmZpZy5yYXRlOwotICAgIGNvbW1vbi0+Y2ZnLmNoYW5uZWxfbWFzayA9IHN0cmVhbV9jb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGNvbW1vbi0+Y2ZnLmlzX3N0ZXJlb190b19tb25vID0gc3RyZWFtX2NvbmZpZy5pc19zdGVyZW9fdG9fbW9ubzsKLSAgICBjb21tb24tPmNmZy5mb3JtYXQgPSBzdHJlYW1fY29uZmlnLmZvcm1hdDsKLSAgICBjb21tb24tPmJ1ZmZlcl9zeiA9IGF1ZGlvX2hhX2h3X3N0cmVhbV9jb21wdXRlX2J1ZmZlcl9zaXplKAotICAgICAgICBjb2RlY19jb25maWctPnNhbXBsZV9yYXRlLCBjb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUpOwotICAgIGlmIChjb21tb24tPmNmZy5pc19zdGVyZW9fdG9fbW9ubykgewotICAgICAgLy8gV2UgbmVlZCB0byBmZXRjaCB0d2ljZSBhcyBtdWNoIGRhdGEgZnJvbSB0aGUgQXVkaW8gZnJhbWV3b3JrCi0gICAgICBjb21tb24tPmJ1ZmZlcl9zeiAqPSAyOwotICAgIH0KLSAgfQotCi0gIElORk8oCi0gICAgICAiZ290IG91dHB1dCBjb2RlYyBjb25maWcgKHVwZGF0ZV9zdHJlYW1fY29uZmlnPSVzKTogIgotICAgICAgInNhbXBsZV9yYXRlPTB4JXggYml0c19wZXJfc2FtcGxlPTB4JXggY2hhbm5lbF9tb2RlPTB4JXgiLAotICAgICAgdXBkYXRlX3N0cmVhbV9jb25maWcgPyAidHJ1ZSIgOiAiZmFsc2UiLCBjb2RlY19jb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUsIGNvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlKTsKLQotICBJTkZPKAotICAgICAgImdvdCBvdXRwdXQgY29kZWMgY2FwYWJpbGl0eTogc2FtcGxlX3JhdGU9MHgleCBiaXRzX3Blcl9zYW1wbGU9MHgleCAiCi0gICAgICAiY2hhbm5lbF9tb2RlPTB4JXgiLAotICAgICAgY29kZWNfY2FwYWJpbGl0eS0+c2FtcGxlX3JhdGUsIGNvZGVjX2NhcGFiaWxpdHktPmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHktPmNoYW5uZWxfbW9kZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGFfd3JpdGVfb3V0cHV0X2F1ZGlvX2NvbmZpZyhzdHJ1Y3QgaGFfc3RyZWFtX2NvbW1vbiogY29tbW9uKSB7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWc7Ci0KLSAgaWYgKGhhX2NvbW1hbmQoY29tbW9uLCBIRUFSSU5HX0FJRF9DVFJMX1NFVF9PVVRQVVRfQVVESU9fQ09ORklHKSA8IDApIHsKLSAgICBFUlJPUigic2V0IGhhIG91dHB1dCBhdWRpbyBjb25maWcgZmFpbGVkIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gIGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gIGNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0KLSAgc3dpdGNoIChjb21tb24tPmNmZy5yYXRlKSB7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICBjb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg4MjAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc2NDAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTkyMDAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICBjb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIHNhbXBsZSByYXRlOiAlIiBQUkl1MzIsIGNvbW1vbi0+Y2ZnLnJhdGUpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChjb21tb24tPmNmZy5mb3JtYXQpIHsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKLSAgICAgIGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKLSAgICAgIGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgotICAgICAgLy8gQWxsIDI0LWJpdCBhdWRpbyBpcyBleHBlY3RlZCBpbiBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgZm9ybWF0Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgYXVkaW8gZm9ybWF0OiAweCV4IiwgY29tbW9uLT5jZmcuZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN3aXRjaCAoY29tbW9uLT5jZmcuY2hhbm5lbF9tYXNrKSB7Ci0gICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9NT05POgotICAgICAgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOgotICAgICAgaWYgKGNvbW1vbi0+Y2ZnLmlzX3N0ZXJlb190b19tb25vKSB7Ci0gICAgICAgIGNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IoIkludmFsaWQgY2hhbm5lbCBtYXNrOiAweCV4IiwgY29tbW9uLT5jZmcuY2hhbm5lbF9tYXNrKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8vIFNlbmQgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlnIHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQgYnkgdXMKLSAgaWYgKGhhX2N0cmxfc2VuZChjb21tb24sICZjb2RlY19jb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGhhX2N0cmxfc2VuZChjb21tb24sICZjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGhhX2N0cmxfc2VuZChjb21tb24sICZjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBJTkZPKAotICAgICAgInNlbnQgb3V0cHV0IGNvZGVjIGNvbmZpZzogc2FtcGxlX3JhdGU9MHgleCBiaXRzX3Blcl9zYW1wbGU9MHgleCAiCi0gICAgICAiY2hhbm5lbF9tb2RlPTB4JXgiLAotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlLCBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlLAotICAgICAgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhX29wZW5fY3RybF9wYXRoKHN0cnVjdCBoYV9zdHJlYW1fY29tbW9uKiBjb21tb24pIHsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvbW1vbi0+Y3RybF9mZCAhPSBBVURJT19TS1RfRElTQ09OTkVDVEVEKSByZXR1cm47ICAvLyBhbHJlYWR5IGNvbm5lY3RlZAotCi0gIC8qIHJldHJ5IGxvZ2ljIHRvIGNhdGNoIGFueSB0aW1pbmcgdmFyaWF0aW9ucyBvbiBjb250cm9sIGNoYW5uZWwgKi8KLSAgZm9yIChpID0gMDsgaSA8IENUUkxfQ0hBTl9SRVRSWV9DT1VOVDsgaSsrKSB7Ci0gICAgLyogY29ubmVjdCBjb250cm9sIGNoYW5uZWwgaWYgbm90IGFscmVhZHkgY29ubmVjdGVkICovCi0gICAgaWYgKChjb21tb24tPmN0cmxfZmQgPSBza3RfY29ubmVjdCgKLSAgICAgICAgICAgICBIRUFSSU5HX0FJRF9DVFJMX1BBVEgsIEFVRElPX1NUUkVBTV9DT05UUk9MX09VVFBVVF9CVUZGRVJfU1opKSA+PQotICAgICAgICAwKSB7Ci0gICAgICAvKiBzdWNjZXNzLCBub3cgY2hlY2sgaWYgc3RhY2sgaXMgcmVhZHkgKi8KLSAgICAgIGlmIChjaGVja19oYV9yZWFkeShjb21tb24pID09IDApIGJyZWFrOwotCi0gICAgICBFUlJPUigiZXJyb3IgOiBoYSBub3QgcmVhZHksIHdhaXQgMjUwIG1zIGFuZCByZXRyeSIpOwotICAgICAgdXNsZWVwKDI1MDAwMCk7Ci0gICAgICBza3RfZGlzY29ubmVjdChjb21tb24tPmN0cmxfZmQpOwotICAgICAgY29tbW9uLT5jdHJsX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICAvKiBjdHJsIGNoYW5uZWwgbm90IHJlYWR5LCB3YWl0IGEgYml0ICovCi0gICAgdXNsZWVwKDI1MDAwMCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQVVESU8gREFUQSBQQVRICi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGhhX3N0cmVhbV9jb21tb25faW5pdChzdHJ1Y3QgaGFfc3RyZWFtX2NvbW1vbiogY29tbW9uKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgY29tbW9uLT5tdXRleCA9IG5ldyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleDsKLQotICBjb21tb24tPmN0cmxfZmQgPSBBVURJT19TS1RfRElTQ09OTkVDVEVEOwotICBjb21tb24tPmF1ZGlvX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgY29tbW9uLT5zdGF0ZSA9IEFVRElPX0hBX1NUQVRFX1NUT1BQRUQ7Ci0KLSAgLyogbWFuYWdlcyBtYXggY2FwYWNpdHkgb2Ygc29ja2V0IHBpcGUgKi8KLSAgY29tbW9uLT5idWZmZXJfc3ogPSBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9TWjsKLX0KLQotc3RhdGljIHZvaWQgaGFfc3RyZWFtX2NvbW1vbl9kZXN0cm95KHN0cnVjdCBoYV9zdHJlYW1fY29tbW9uKiBjb21tb24pIHsKLSAgRk5MT0coKTsKLQotICBkZWxldGUgY29tbW9uLT5tdXRleDsKLSAgY29tbW9uLT5tdXRleCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgc3RhcnRfYXVkaW9fZGF0YXBhdGgoc3RydWN0IGhhX3N0cmVhbV9jb21tb24qIGNvbW1vbikgewotICBJTkZPKCJzdGF0ZSAlZCIsIGNvbW1vbi0+c3RhdGUpOwotCi0gIGludCBvbGRzdGF0ZSA9IGNvbW1vbi0+c3RhdGU7Ci0gIGNvbW1vbi0+c3RhdGUgPSBBVURJT19IQV9TVEFURV9TVEFSVElORzsKLQotICBpbnQgaGFfc3RhdHVzID0gaGFfY29tbWFuZChjb21tb24sIEhFQVJJTkdfQUlEX0NUUkxfQ01EX1NUQVJUKTsKLSAgaWYgKGhhX3N0YXR1cyA8IDApIHsKLSAgICBFUlJPUigiQXVkaW9wYXRoIHN0YXJ0IGZhaWxlZCAoc3RhdHVzICVkKSIsIGhhX3N0YXR1cyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfSBlbHNlIGlmIChoYV9zdGF0dXMgPT0gSEVBUklOR19BSURfQ1RSTF9BQ0tfSU5DQUxMX0ZBSUxVUkUpIHsKLSAgICBFUlJPUigiQXVkaW9wYXRoIHN0YXJ0IGZhaWxlZCAtIGluIGNhbGwsIG1vdmUgdG8gc3VzcGVuZGVkIik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIC8qIGNvbm5lY3Qgc29ja2V0IGlmIG5vdCB5ZXQgY29ubmVjdGVkICovCi0gIGlmIChjb21tb24tPmF1ZGlvX2ZkID09IEFVRElPX1NLVF9ESVNDT05ORUNURUQpIHsKLSAgICBjb21tb24tPmF1ZGlvX2ZkID0gc2t0X2Nvbm5lY3QoSEVBUklOR19BSURfREFUQV9QQVRILCBjb21tb24tPmJ1ZmZlcl9zeik7Ci0gICAgaWYgKGNvbW1vbi0+YXVkaW9fZmQgPCAwKSB7Ci0gICAgICBFUlJPUigiQXVkaW9wYXRoIHN0YXJ0IGZhaWxlZCAtIGVycm9yIG9wZW5pbmcgZGF0YSBzb2NrZXQiKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICB9Ci0gIGNvbW1vbi0+c3RhdGUgPSAoaGFfc3RhdGVfdClBVURJT19IQV9TVEFURV9TVEFSVEVEOwotICByZXR1cm4gMDsKLQotZXJyb3I6Ci0gIGNvbW1vbi0+c3RhdGUgPSAoaGFfc3RhdGVfdClvbGRzdGF0ZTsKLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IHN0b3BfYXVkaW9fZGF0YXBhdGgoc3RydWN0IGhhX3N0cmVhbV9jb21tb24qIGNvbW1vbikgewotICBpbnQgb2xkc3RhdGUgPSBjb21tb24tPnN0YXRlOwotCi0gIElORk8oInN0YXRlICVkIiwgY29tbW9uLT5zdGF0ZSk7Ci0KLSAgLyogcHJldmVudCBhbnkgc3RyYXkgb3V0cHV0IHdyaXRlcyBmcm9tIGF1dG9zdGFydGluZyB0aGUgc3RyZWFtCi0gICAgIHdoaWxlIHN0b3BwaW5nIGF1ZGlvcGF0aCAqLwotICBjb21tb24tPnN0YXRlID0gQVVESU9fSEFfU1RBVEVfU1RPUFBJTkc7Ci0KLSAgaWYgKGhhX2NvbW1hbmQoY29tbW9uLCBIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVE9QKSA8IDApIHsKLSAgICBFUlJPUigiYXVkaW9wYXRoIHN0b3AgZmFpbGVkIik7Ci0gICAgY29tbW9uLT5zdGF0ZSA9IChoYV9zdGF0ZV90KW9sZHN0YXRlOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGNvbW1vbi0+c3RhdGUgPSAoaGFfc3RhdGVfdClBVURJT19IQV9TVEFURV9TVE9QUEVEOwotCi0gIC8qIGRpc2Nvbm5lY3QgYXVkaW8gcGF0aCAqLwotICBza3RfZGlzY29ubmVjdChjb21tb24tPmF1ZGlvX2ZkKTsKLSAgY29tbW9uLT5hdWRpb19mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3VzcGVuZF9hdWRpb19kYXRhcGF0aChzdHJ1Y3QgaGFfc3RyZWFtX2NvbW1vbiogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhbmRieSkgewotICBJTkZPKCJzdGF0ZSAlZCIsIGNvbW1vbi0+c3RhdGUpOwotCi0gIGlmIChjb21tb24tPnN0YXRlID09IEFVRElPX0hBX1NUQVRFX1NUT1BQSU5HKSByZXR1cm4gLTE7Ci0KLSAgaWYgKGhhX2NvbW1hbmQoY29tbW9uLCBIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVVNQRU5EKSA8IDApIHJldHVybiAtMTsKLQotICBpZiAoc3RhbmRieSkKLSAgICBjb21tb24tPnN0YXRlID0gQVVESU9fSEFfU1RBVEVfU1RBTkRCWTsKLSAgZWxzZQotICAgIGNvbW1vbi0+c3RhdGUgPSBBVURJT19IQV9TVEFURV9TVVNQRU5ERUQ7Ci0KLSAgLyogZGlzY29ubmVjdCBhdWRpbyBwYXRoICovCi0gIHNrdF9kaXNjb25uZWN0KGNvbW1vbi0+YXVkaW9fZmQpOwotCi0gIGNvbW1vbi0+YXVkaW9fZmQgPSBBVURJT19TS1RfRElTQ09OTkVDVEVEOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgYXVkaW8gb3V0cHV0IGNhbGxiYWNrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3NpemVfdCBvdXRfd3JpdGUoc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSwgY29uc3Qgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykgewotICBzdHJ1Y3QgaGFfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KilzdHJlYW07Ci0gIGludCBzZW50ID0gLTE7Ci0gIHNpemVfdCB3cml0ZV9ieXRlcyA9IGJ5dGVzOwotCi0gIERFQlVHKCJ3cml0ZSAlenUgYnl0ZXMgKGZkICVkKSIsIGJ5dGVzLCBvdXQtPmNvbW1vbi5hdWRpb19mZCk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqb3V0LT5jb21tb24ubXV0ZXgpOwotICBpZiAob3V0LT5jb21tb24uc3RhdGUgPT0gQVVESU9fSEFfU1RBVEVfU1VTUEVOREVEIHx8Ci0gICAgICBvdXQtPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVE9QUElORykgewotICAgIERFQlVHKCJzdHJlYW0gc3VzcGVuZGVkIG9yIGNsb3NpbmciKTsKLSAgICBnb3RvIGZpbmlzaDsKLSAgfQotCi0gIC8qIG9ubHkgYWxsb3cgYXV0b3N0YXJ0aW5nIGlmIHdlIGFyZSBpbiBzdG9wcGVkIG9yIHN0YW5kYnkgKi8KLSAgaWYgKChvdXQtPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVE9QUEVEKSB8fAotICAgICAgKG91dC0+Y29tbW9uLnN0YXRlID09IEFVRElPX0hBX1NUQVRFX1NUQU5EQlkpKSB7Ci0gICAgaWYgKHN0YXJ0X2F1ZGlvX2RhdGFwYXRoKCZvdXQtPmNvbW1vbikgPCAwKSB7Ci0gICAgICBnb3RvIGZpbmlzaDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAob3V0LT5jb21tb24uc3RhdGUgIT0gQVVESU9fSEFfU1RBVEVfU1RBUlRFRCkgewotICAgIEVSUk9SKCJzdHJlYW0gbm90IGluIHN0b3BwZWQgb3Igc3RhbmRieSIpOwotICAgIGdvdG8gZmluaXNoOwotICB9Ci0KLSAgLy8gTWl4IHRoZSBzdGVyZW8gaW50byBtb25vIGlmIG5lY2Vzc2FyeQotICBpZiAob3V0LT5jb21tb24uY2ZnLmlzX3N0ZXJlb190b19tb25vKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGZyYW1lcyA9IGJ5dGVzIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKHN0cmVhbSk7Ci0gICAgaW50MTZfdCogc3JjID0gKGludDE2X3QqKWJ1ZmZlcjsKLSAgICBpbnQxNl90KiBkc3QgPSAoaW50MTZfdCopYnVmZmVyOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVzOyBpKyssIGRzdCsrLCBzcmMgKz0gMikgewotICAgICAgKmRzdCA9IChpbnQxNl90KSgoKGludDMyX3Qpc3JjWzBdICsgKGludDMyX3Qpc3JjWzFdKSA+PiAxKTsKLSAgICB9Ci0gICAgd3JpdGVfYnl0ZXMgLz0gMjsKLSAgICBERUJVRygic3RlcmVvLXRvLW1vbm8gbWl4aW5nOiB3cml0ZSAlenUgYnl0ZXMgKGZkICVkKSIsIHdyaXRlX2J5dGVzLAotICAgICAgICAgIG91dC0+Y29tbW9uLmF1ZGlvX2ZkKTsKLSAgfQotCi0gIGxvY2sudW5sb2NrKCk7Ci0gIHNlbnQgPSBza3Rfd3JpdGUob3V0LT5jb21tb24uYXVkaW9fZmQsIGJ1ZmZlciwgd3JpdGVfYnl0ZXMpOwotICBsb2NrLmxvY2soKTsKLQotICBpZiAoc2VudCA9PSAtMSkgewotICAgIHNrdF9kaXNjb25uZWN0KG91dC0+Y29tbW9uLmF1ZGlvX2ZkKTsKLSAgICBvdXQtPmNvbW1vbi5hdWRpb19mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gICAgaWYgKChvdXQtPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19IQV9TVEFURV9TVVNQRU5ERUQpICYmCi0gICAgICAgIChvdXQtPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19IQV9TVEFURV9TVE9QUElORykpIHsKLSAgICAgIG91dC0+Y29tbW9uLnN0YXRlID0gQVVESU9fSEFfU1RBVEVfU1RPUFBFRDsKLSAgICB9IGVsc2UgewotICAgICAgRVJST1IoIndyaXRlIGZhaWxlZCA6IHN0cmVhbSBzdXNwZW5kZWQsIGF2b2lkIHJlc2V0dGluZyBzdGF0ZSIpOwotICAgIH0KLSAgICBnb3RvIGZpbmlzaDsKLSAgfQotCi1maW5pc2g6OwotICBjb25zdCBzaXplX3QgZnJhbWVzID0gYnl0ZXMgLyBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUoc3RyZWFtKTsKLSAgb3V0LT5mcmFtZXNfcmVuZGVyZWQgKz0gZnJhbWVzOwotICBvdXQtPmZyYW1lc19wcmVzZW50ZWQgKz0gZnJhbWVzOwotICBsb2NrLnVubG9jaygpOwotCi0gIC8vIElmIHNlbmQgZGlkbid0IHdvcmsgb3V0LCBzbGVlcCB0byBlbXVsYXRlIHdyaXRlIGRlbGF5LgotICBpZiAoc2VudCA9PSAtMSkgewotICAgIGNvbnN0IGludCB1c19kZWxheSA9IGNhbGNfYXVkaW90aW1lX3VzZWMob3V0LT5jb21tb24uY2ZnLCBieXRlcyk7Ci0gICAgREVCVUcoImVtdWxhdGUgaGEgd3JpdGUgZGVsYXkgKCVkIHVzKSIsIHVzX2RlbGF5KTsKLSAgICB1c2xlZXAodXNfZGVsYXkpOwotICB9Ci0gIHJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHVpbnQzMl90IG91dF9nZXRfc2FtcGxlX3JhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKSB7Ci0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGhhX3N0cmVhbV9vdXQqKXN0cmVhbTsKLQotICBERUJVRygicmF0ZSAlIiBQUkl1MzIsIG91dC0+Y29tbW9uLmNmZy5yYXRlKTsKLQotICByZXR1cm4gb3V0LT5jb21tb24uY2ZnLnJhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3NldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sIHVpbnQzMl90IHJhdGUpIHsKLSAgc3RydWN0IGhhX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgaGFfc3RyZWFtX291dCopc3RyZWFtOwotCi0gIERFQlVHKCJvdXRfc2V0X3NhbXBsZV9yYXRlIDogJSIgUFJJdTMyLCByYXRlKTsKLQotICBvdXQtPmNvbW1vbi5jZmcucmF0ZSA9IHJhdGU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgb3V0X2dldF9idWZmZXJfc2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgc3RydWN0IGhhX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgaGFfc3RyZWFtX291dCopc3RyZWFtOwotICAvLyBwZXJpb2Rfc2l6ZSBpcyB0aGUgQXVkaW9GbGluZ2VyIG1peGVyIGJ1ZmZlciBzaXplLgotICBjb25zdCBzaXplX3QgcGVyaW9kX3NpemUgPQotICAgICAgb3V0LT5jb21tb24uYnVmZmVyX3N6IC8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUzsKLQotICBERUJVRygic29ja2V0IGJ1ZmZlciBzaXplOiAlenUgIHBlcmlvZCBzaXplOiAlenUiLCBvdXQtPmNvbW1vbi5idWZmZXJfc3osCi0gICAgICAgIHBlcmlvZF9zaXplKTsKLQotICByZXR1cm4gcGVyaW9kX3NpemU7Ci19Ci0KLXNpemVfdCBhdWRpb19oYV9od19zdHJlYW1fY29tcHV0ZV9idWZmZXJfc2l6ZSgKLSAgICBidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdCBjb2RlY19zYW1wbGVfcmF0ZSwKLSAgICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgY29kZWNfYml0c19wZXJfc2FtcGxlLAotICAgIGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCBjb2RlY19jaGFubmVsX21vZGUpIHsKLSAgc2l6ZV90IGJ1ZmZlcl9zeiA9IEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NaOyAgLy8gRGVmYXVsdCB2YWx1ZQotICBjb25zdCB1aW50NjRfdCB0aW1lX3BlcmlvZF9tcyA9IDIwOyAgICAgICAgICAgICAgICAvLyBDb25zZXJ2YXRpdmUgMjBtcwotICB1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLSAgdWludDMyX3QgYml0c19wZXJfc2FtcGxlOwotICB1aW50MzJfdCBudW1iZXJfb2ZfY2hhbm5lbHM7Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBzYW1wbGUgcmF0ZQotICBzd2l0Y2ggKGNvZGVjX3NhbXBsZV9yYXRlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA6Ci0gICAgICBzYW1wbGVfcmF0ZSA9IDQ0MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICBzYW1wbGVfcmF0ZSA9IDQ4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA6Ci0gICAgICBzYW1wbGVfcmF0ZSA9IDg4MjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA6Ci0gICAgICBzYW1wbGVfcmF0ZSA9IDk2MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOgotICAgICAgc2FtcGxlX3JhdGUgPSAxNzY0MDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDA6Ci0gICAgICBzYW1wbGVfcmF0ZSA9IDE5MjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOgotICAgICAgc2FtcGxlX3JhdGUgPSAxNjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgICAgc2FtcGxlX3JhdGUgPSAyNDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIHNhbXBsZSByYXRlOiAweCV4IiwgY29kZWNfc2FtcGxlX3JhdGUpOwotICAgICAgcmV0dXJuIGJ1ZmZlcl9zejsKLSAgfQotCi0gIC8vIENoZWNrIHRoZSBjb2RlYyBjb25maWcgYml0cyBwZXIgc2FtcGxlCi0gIHN3aXRjaCAoY29kZWNfYml0c19wZXJfc2FtcGxlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OgotICAgICAgYml0c19wZXJfc2FtcGxlID0gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICBiaXRzX3Blcl9zYW1wbGUgPSAyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIGJpdHNfcGVyX3NhbXBsZSA9IDMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGJpdHMgcGVyIHNhbXBsZTogMHgleCIsIGNvZGVjX2JpdHNfcGVyX3NhbXBsZSk7Ci0gICAgICByZXR1cm4gYnVmZmVyX3N6OwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNvbmZpZyBjaGFubmVsIG1vZGUKLSAgc3dpdGNoIChjb2RlY19jaGFubmVsX21vZGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzoKLSAgICAgIG51bWJlcl9vZl9jaGFubmVscyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgbnVtYmVyX29mX2NoYW5uZWxzID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOgotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJPUigiSW52YWxpZCBjaGFubmVsIG1vZGU6IDB4JXgiLCBjb2RlY19jaGFubmVsX21vZGUpOwotICAgICAgcmV0dXJuIGJ1ZmZlcl9zejsKLSAgfQotCi0gIC8vCi0gIC8vIFRoZSBidWZmZXIgc2l6ZSBpcyBjb21wdXRlZCBieSB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6Ci0gIC8vCi0gIC8vIEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NJWkUgPQotICAvLyAgICAoVElNRV9QRVJJT0RfTVMgKiBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTICoKLSAgLy8gICAgIFNBTVBMRV9SQVRFX0haICogTlVNQkVSX09GX0NIQU5ORUxTICogKEJJVFNfUEVSX1NBTVBMRSAvIDgpKSAvIDEwMDAKLSAgLy8KLSAgLy8gQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyBjb250cm9scyBob3cgdGhlIHNvY2tldCBidWZmZXIgaXMKLSAgLy8gZGl2aWRlZCBmb3IgQXVkaW9GbGluZ2VyIGRhdGEgZGVsaXZlcnkuIFRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIgZGVsaXZlcnMKLSAgLy8gZGF0YSBpbiBjaHVua3Mgb2YKLSAgLy8gKEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NJWkUgLyBBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTKSAuCi0gIC8vIElmIHRoZSBudW1iZXIgb2YgcGVyaW9kcyBpcyAyLCB0aGUgc29ja2V0IGJ1ZmZlciByZXByZXNlbnRzICJkb3VibGUKLSAgLy8gYnVmZmVyaW5nIiBvZiB0aGUgQXVkaW9GbGluZ2VyIG1peGVyIGJ1ZmZlci4KLSAgLy8KLSAgLy8gRnVydGhlcm1vcmUsIHRoZSBBdWRpb0ZsaW5nZXIgZXhwZWN0cyB0aGUgYnVmZmVyIHNpemUgdG8gYmUgYSBtdWx0aXBsZQotICAvLyBvZiAxNiBmcmFtZXMuCi0gIGNvbnN0IHNpemVfdCBkaXZpc29yID0gKEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1BFUklPRFMgKiAxNiAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaGFubmVscyAqIGJpdHNfcGVyX3NhbXBsZSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgIDg7Ci0KLSAgYnVmZmVyX3N6ID0gKHRpbWVfcGVyaW9kX21zICogQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyAqCi0gICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSAqIG51bWJlcl9vZl9jaGFubmVscyAqIChiaXRzX3Blcl9zYW1wbGUgLyA4KSkgLwotICAgICAgICAgICAgICAxMDAwOwotCi0gIC8vIEFkanVzdCB0aGUgYnVmZmVyIHNpemUgc28gaXQgY2FuIGJlIGRpdmlkZWQgYnkgdGhlIGRpdmlzb3IKLSAgY29uc3Qgc2l6ZV90IHJlbWFpbmRlciA9IGJ1ZmZlcl9zeiAlIGRpdmlzb3I7Ci0gIGlmIChyZW1haW5kZXIgIT0gMCkgewotICAgIGJ1ZmZlcl9zeiArPSBkaXZpc29yIC0gcmVtYWluZGVyOwotICB9Ci0KLSAgcmV0dXJuIGJ1ZmZlcl9zejsKLX0KLQotc3RhdGljIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dF9nZXRfY2hhbm5lbHMoCi0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKSB7Ci0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGhhX3N0cmVhbV9vdXQqKXN0cmVhbTsKLQotICBERUJVRygiY2hhbm5lbHMgMHglIiBQUkl4MzIsIG91dC0+Y29tbW9uLmNmZy5jaGFubmVsX21hc2spOwotCi0gIHJldHVybiAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpb3V0LT5jb21tb24uY2ZnLmNoYW5uZWxfbWFzazsKLX0KLQotc3RhdGljIGF1ZGlvX2Zvcm1hdF90IG91dF9nZXRfZm9ybWF0KGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgaGFfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KilzdHJlYW07Ci0gIERFQlVHKCJmb3JtYXQgMHgleCIsIG91dC0+Y29tbW9uLmNmZy5mb3JtYXQpOwotICByZXR1cm4gKGF1ZGlvX2Zvcm1hdF90KW91dC0+Y29tbW9uLmNmZy5mb3JtYXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3NldF9mb3JtYXQoVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgREVCVUcoInNldHRpbmcgZm9ybWF0IG5vdCB5ZXQgc3VwcG9ydGVkICgweCV4KSIsIGZvcm1hdCk7Ci0gIHJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IG91dF9zdGFuZGJ5KHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgaGFfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KilzdHJlYW07Ci0gIGludCByZXRWYWwgPSAwOwotCi0gIEZOTE9HKCk7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCpvdXQtPmNvbW1vbi5tdXRleCk7Ci0gIC8vIERvIG5vdGhpbmcgaW4gU1VTUEVOREVEIHN0YXRlLgotICBpZiAob3V0LT5jb21tb24uc3RhdGUgIT0gQVVESU9fSEFfU1RBVEVfU1VTUEVOREVEKQotICAgIHJldFZhbCA9IHN1c3BlbmRfYXVkaW9fZGF0YXBhdGgoJm91dC0+Y29tbW9uLCB0cnVlKTsKLSAgb3V0LT5mcmFtZXNfcmVuZGVyZWQgPSAwOyAgLy8gcmVuZGVyZWQgaXMgcmVzZXQsIHByZXNlbnRlZCBpcyBub3QKLQotICByZXR1cm4gcmV0VmFsOwotfQotCi1zdGF0aWMgaW50IG91dF9kdW1wKFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgaW50IGZkKSB7Ci0gIEZOTE9HKCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG91dF9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrdnBhaXJzKSB7Ci0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGhhX3N0cmVhbV9vdXQqKXN0cmVhbTsKLQotICBJTkZPKCJzdGF0ZSAlZCBrdnBhaXJzICVzIiwgb3V0LT5jb21tb24uc3RhdGUsIGt2cGFpcnMpOwotCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHBhcmFtcyA9Ci0gICAgICBoYXNoX21hcF91dGlsc19uZXdfZnJvbV9zdHJpbmdfcGFyYW1zKGt2cGFpcnMpOwotICBpbnQgc3RhdHVzID0gMDsKLQotICBpZiAocGFyYW1zLmVtcHR5KCkpIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCpvdXQtPmNvbW1vbi5tdXRleCk7Ci0KLSAgLyogZHVtcCBwYXJhbXMgKi8KLSAgaGFzaF9tYXBfdXRpbHNfZHVtcF9zdHJpbmdfa2V5c19zdHJpbmdfdmFsdWVzKHBhcmFtcyk7Ci0KLSAgaWYgKHBhcmFtc1siY2xvc2luZyJdLmNvbXBhcmUoInRydWUiKSA9PSAwKSB7Ci0gICAgREVCVUcoInN0cmVhbSBjbG9zaW5nLCBkaXNhbGxvdyBhbnkgd3JpdGVzIik7Ci0gICAgb3V0LT5jb21tb24uc3RhdGUgPSBBVURJT19IQV9TVEFURV9TVE9QUElORzsKLSAgfQotCi0gIGlmIChwYXJhbXNbIkhlYXJpbmdBaWRTdXNwZW5kZWQiXS5jb21wYXJlKCJ0cnVlIikgPT0gMCkgewotICAgIGlmIChvdXQtPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVEFSVEVEKQotICAgICAgc3RhdHVzID0gc3VzcGVuZF9hdWRpb19kYXRhcGF0aCgmb3V0LT5jb21tb24sIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBEbyBub3Qgc3RhcnQgdGhlIHN0cmVhbWluZyBhdXRvbWF0aWNhbGx5LiBJZiB0aGUgcGhvbmUgd2FzIHN0cmVhbWluZwotICAgICAqIHByaW9yIHRvIGJlaW5nIHN1c3BlbmRlZCwgdGhlIG5leHQgb3V0X3dyaXRlIHNoYWxsIHRyaWdnZXIgdGhlCi0gICAgICogQVZEVFAgc3RhcnQgcHJvY2VkdXJlICovCi0gICAgaWYgKG91dC0+Y29tbW9uLnN0YXRlID09IEFVRElPX0hBX1NUQVRFX1NVU1BFTkRFRCkKLSAgICAgIG91dC0+Y29tbW9uLnN0YXRlID0gQVVESU9fSEFfU1RBVEVfU1RBTkRCWTsKLSAgICAvKiBJcnJlc3BlY3RpdmUgb2YgdGhlIHN0YXRlLCByZXR1cm4gMCAqLwotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGNoYXIqIG91dF9nZXRfcGFyYW1ldGVycyhjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleXMpIHsKLSAgRk5MT0coKTsKLQotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY2FwYWJpbGl0eTsKLQotICBzdHJ1Y3QgaGFfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyYW1zID0KLSAgICAgIGhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMoa2V5cyk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJldHVybl9wYXJhbXM7Ci0KLSAgaWYgKHBhcmFtcy5lbXB0eSgpKSByZXR1cm4gc3RyZHVwKCIiKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKm91dC0+Y29tbW9uLm11dGV4KTsKLQotICBpZiAoaGFfcmVhZF9vdXRwdXRfYXVkaW9fY29uZmlnKCZvdXQtPmNvbW1vbiwgJmNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiB1cGRhdGVfc3RyZWFtX2NvbmZpZyAqLykgPCAwKSB7Ci0gICAgRVJST1IoImhhX3JlYWRfb3V0cHV0X2F1ZGlvX2NvbmZpZyBmYWlsZWQiKTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLQotICAvLyBBZGQgdGhlIGZvcm1hdAotICBpZiAocGFyYW1zLmZpbmQoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykgIT0gcGFyYW1zLmVuZCgpKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGFyYW07Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNikgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5iaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0KSB7Ci0gICAgICBpZiAoIXBhcmFtLmVtcHR5KCkpIHBhcmFtICs9ICJ8IjsKLSAgICAgIHBhcmFtICs9ICJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5iaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyKSB7Ci0gICAgICBpZiAoIXBhcmFtLmVtcHR5KCkpIHBhcmFtICs9ICJ8IjsKLSAgICAgIHBhcmFtICs9ICJBVURJT19GT1JNQVRfUENNXzMyX0JJVCI7Ci0gICAgfQotICAgIGlmIChwYXJhbS5lbXB0eSgpKSB7Ci0gICAgICBFUlJPUigiSW52YWxpZCBjb2RlYyBjYXBhYmlsaXR5IGJpdHNfcGVyX3NhbXBsZT0weCV4IiwKLSAgICAgICAgICAgIGNvZGVjX2NhcGFiaWxpdHkuYml0c19wZXJfc2FtcGxlKTsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuX3BhcmFtc1tBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTXSA9IHBhcmFtOwotICAgIH0KLSAgfQotCi0gIC8vIEFkZCB0aGUgc2FtcGxlIHJhdGUKLSAgaWYgKHBhcmFtcy5maW5kKEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSAhPSBwYXJhbXMuZW5kKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBwYXJhbTsKLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMCkgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiNDQxMDAiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMCkgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiNDgwMDAiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMCkgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiODgyMDAiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMCkgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiOTYwMDAiOwotICAgIH0KLSAgICBpZiAoY29kZWNfY2FwYWJpbGl0eS5zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjE3NjQwMCI7Ci0gICAgfQotICAgIGlmIChjb2RlY19jYXBhYmlsaXR5LnNhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMCkgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiMTkyMDAwIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjE2MDAwIjsKLSAgICB9Ci0gICAgaWYgKGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDApIHsKLSAgICAgIGlmICghcGFyYW0uZW1wdHkoKSkgcGFyYW0gKz0gInwiOwotICAgICAgcGFyYW0gKz0gIjI0MDAwIjsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLmVtcHR5KCkpIHsKLSAgICAgIEVSUk9SKCJJbnZhbGlkIGNvZGVjIGNhcGFiaWxpdHkgc2FtcGxlX3JhdGU9MHgleCIsCi0gICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5LnNhbXBsZV9yYXRlKTsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuX3BhcmFtc1tBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFU10gPSBwYXJhbTsKLSAgICB9Ci0gIH0KLQotICAvLyBBZGQgdGhlIGNoYW5uZWwgbWFzawotICBpZiAocGFyYW1zLmZpbmQoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpICE9IHBhcmFtcy5lbmQoKSkgewotICAgIHN0ZDo6c3RyaW5nIHBhcmFtOwotICAgIGlmIChjb2RlY19jYXBhYmlsaXR5LmNoYW5uZWxfbW9kZSAmIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgICAgaWYgKCFwYXJhbS5lbXB0eSgpKSBwYXJhbSArPSAifCI7Ci0gICAgICBwYXJhbSArPSAiQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyI7Ci0gICAgfQotICAgIGlmIChjb2RlY19jYXBhYmlsaXR5LmNoYW5uZWxfbW9kZSAmIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgICBpZiAoIXBhcmFtLmVtcHR5KCkpIHBhcmFtICs9ICJ8IjsKLSAgICAgIHBhcmFtICs9ICJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iOwotICAgIH0KLSAgICBpZiAocGFyYW0uZW1wdHkoKSkgewotICAgICAgRVJST1IoIkludmFsaWQgY29kZWMgY2FwYWJpbGl0eSBjaGFubmVsX21vZGU9MHgleCIsCi0gICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5LmNoYW5uZWxfbW9kZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybl9wYXJhbXNbQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFNdID0gcGFyYW07Ci0gICAgfQotICB9Ci0KLWRvbmU6Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yIChjb25zdCBhdXRvJiBwdHIgOiByZXR1cm5fcGFyYW1zKSB7Ci0gICAgcmVzdWx0ICs9IHB0ci5maXJzdCArICI9IiArIHB0ci5zZWNvbmQgKyAiOyI7Ci0gIH0KLQotICBJTkZPKCJnZXQgcGFyYW1ldGVycyByZXN1bHQgPSAlcyIsIHJlc3VsdC5jX3N0cigpKTsKLQotICByZXR1cm4gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IG91dF9nZXRfbGF0ZW5jeShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtKSB7Ci0gIGludCBsYXRlbmN5X3VzOwotCi0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXQgPSAoc3RydWN0IGhhX3N0cmVhbV9vdXQqKXN0cmVhbTsKLQotICBGTkxPRygpOwotCi0gIGxhdGVuY3lfdXMgPQotICAgICAgKChvdXQtPmNvbW1vbi5idWZmZXJfc3ogKiAxMDAwKSAvCi0gICAgICAgYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKCZvdXQtPnN0cmVhbSkgLyBvdXQtPmNvbW1vbi5jZmcucmF0ZSkgKgotICAgICAgMTAwMDsKLQotICByZXR1cm4gKGxhdGVuY3lfdXMgLyAxMDAwKSArIDIwMDsKLX0KLQotc3RhdGljIGludCBvdXRfc2V0X3ZvbHVtZShVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBmbG9hdCBsZWZ0LCBVTlVTRURfQVRUUiBmbG9hdCByaWdodCkgewotICBGTkxPRygpOwotCi0gIC8qIHZvbHVtZSBjb250cm9sbGVkIGluIGF1ZGlvZmxpbmdlciBtaXhlciAoZGlnaXRhbCkgKi8KLQotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBvdXRfZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMqIHRpbWVzdGFtcCkgewotICBzdHJ1Y3QgaGFfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgRk5MT0coKTsKLSAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGZyYW1lcyA9PSBOVUxMIHx8IHRpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gLUVJTlZBTDsKLQotICBpbnQgcmV0ID0gLUVXT1VMREJMT0NLOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKm91dC0+Y29tbW9uLm11dGV4KTsKLSAgdWludDY0X3QgbGF0ZW5jeV9mcmFtZXMgPQotICAgICAgKHVpbnQ2NF90KW91dF9nZXRfbGF0ZW5jeShzdHJlYW0pICogb3V0LT5jb21tb24uY2ZnLnJhdGUgLyAxMDAwOwotICBpZiAob3V0LT5mcmFtZXNfcHJlc2VudGVkID49IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgKmZyYW1lcyA9IG91dC0+ZnJhbWVzX3ByZXNlbnRlZCAtIGxhdGVuY3lfZnJhbWVzOwotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLAotICAgICAgICAgICAgICAgICAgdGltZXN0YW1wKTsgIC8vIGNvdWxkIGFsc28gYmUgYXNzb2NpYXRlZCB3aXRoIG91dF93cml0ZSgpLgotICAgIHJldCA9IDA7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvdXRfZ2V0X3JlbmRlcl9wb3NpdGlvbihjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHNwX2ZyYW1lcykgewotICBzdHJ1Y3QgaGFfc3RyZWFtX291dCogb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KilzdHJlYW07Ci0KLSAgRk5MT0coKTsKLSAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGRzcF9mcmFtZXMgPT0gTlVMTCkgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCpvdXQtPmNvbW1vbi5tdXRleCk7Ci0gIHVpbnQ2NF90IGxhdGVuY3lfZnJhbWVzID0KLSAgICAgICh1aW50NjRfdClvdXRfZ2V0X2xhdGVuY3koc3RyZWFtKSAqIG91dC0+Y29tbW9uLmNmZy5yYXRlIC8gMTAwMDsKLSAgaWYgKG91dC0+ZnJhbWVzX3JlbmRlcmVkID49IGxhdGVuY3lfZnJhbWVzKSB7Ci0gICAgKmRzcF9mcmFtZXMgPSAodWludDMyX3QpKG91dC0+ZnJhbWVzX3JlbmRlcmVkIC0gbGF0ZW5jeV9mcmFtZXMpOwotICB9IGVsc2UgewotICAgICpkc3BfZnJhbWVzID0gMDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdXRfYWRkX2F1ZGlvX2VmZmVjdChVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3QpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3V0X3JlbW92ZV9hdWRpb19lZmZlY3QoCi0gICAgVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgIFVOVVNFRF9BVFRSIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3QpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBVURJTyBJTlBVVCBTVFJFQU0KLSAqLwotCi1zdGF0aWMgdWludDMyX3QgaW5fZ2V0X3NhbXBsZV9yYXRlKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSkgewotICBzdHJ1Y3QgaGFfc3RyZWFtX2luKiBpbiA9IChzdHJ1Y3QgaGFfc3RyZWFtX2luKilzdHJlYW07Ci0KLSAgRk5MT0coKTsKLSAgcmV0dXJuIGluLT5jb21tb24uY2ZnLnJhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fc2V0X3NhbXBsZV9yYXRlKHN0cnVjdCBhdWRpb19zdHJlYW0qIHN0cmVhbSwgdWludDMyX3QgcmF0ZSkgewotICBzdHJ1Y3QgaGFfc3RyZWFtX2luKiBpbiA9IChzdHJ1Y3QgaGFfc3RyZWFtX2luKilzdHJlYW07Ci0KLSAgRk5MT0coKTsKLQotICBpZiAoaW4tPmNvbW1vbi5jZmcucmF0ZSA+IDAgJiYgaW4tPmNvbW1vbi5jZmcucmF0ZSA9PSByYXRlKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgc2l6ZV90IGluX2dldF9idWZmZXJfc2l6ZSgKLSAgICBVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDMyMDsKLX0KLQotc3RhdGljIGF1ZGlvX2NoYW5uZWxfbWFza190IGluX2dldF9jaGFubmVscyhjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgc3RydWN0IGhhX3N0cmVhbV9pbiogaW4gPSAoc3RydWN0IGhhX3N0cmVhbV9pbiopc3RyZWFtOwotCi0gIEZOTE9HKCk7Ci0gIHJldHVybiAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpaW4tPmNvbW1vbi5jZmcuY2hhbm5lbF9tYXNrOwotfQotCi1zdGF0aWMgYXVkaW9fZm9ybWF0X3QgaW5fZ2V0X2Zvcm1hdCgKLSAgICBVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0pIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotfQotCi1zdGF0aWMgaW50IGluX3NldF9mb3JtYXQoVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICBGTkxPRygpOwotICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGluX3N0YW5kYnkoVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtKSB7Ci0gIEZOTE9HKCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX2R1bXAoVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGludCBmZCkgewotICBGTkxPRygpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbl9zZXRfcGFyYW1ldGVycyhVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IGNoYXIqIGt2cGFpcnMpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyKiBpbl9nZXRfcGFyYW1ldGVycyhVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgY2hhcioga2V5cykgewotICBGTkxPRygpOwotICByZXR1cm4gc3RyZHVwKCIiKTsKLX0KLQotc3RhdGljIGludCBpbl9zZXRfZ2FpbihVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGZsb2F0IGdhaW4pIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGluX3JlYWQoc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtLCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykgewotICBzdHJ1Y3QgaGFfc3RyZWFtX2luKiBpbiA9IChzdHJ1Y3QgaGFfc3RyZWFtX2luKilzdHJlYW07Ci0gIGludCByZWFkOwotICBpbnQgdXNfZGVsYXk7Ci0KLSAgREVCVUcoInJlYWQgJXp1IGJ5dGVzLCBzdGF0ZTogJWQiLCBieXRlcywgaW4tPmNvbW1vbi5zdGF0ZSk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqaW4tPmNvbW1vbi5tdXRleCk7Ci0gIGlmIChpbi0+Y29tbW9uLnN0YXRlID09IEFVRElPX0hBX1NUQVRFX1NVU1BFTkRFRCB8fAotICAgICAgaW4tPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVE9QUElORykgewotICAgIERFQlVHKCJzdHJlYW0gc3VzcGVuZGVkIik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIC8qIG9ubHkgYWxsb3cgYXV0b3N0YXJ0aW5nIGlmIHdlIGFyZSBpbiBzdG9wcGVkIG9yIHN0YW5kYnkgKi8KLSAgaWYgKChpbi0+Y29tbW9uLnN0YXRlID09IEFVRElPX0hBX1NUQVRFX1NUT1BQRUQpIHx8Ci0gICAgICAoaW4tPmNvbW1vbi5zdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVEFOREJZKSkgewotICAgIGlmIChzdGFydF9hdWRpb19kYXRhcGF0aCgmaW4tPmNvbW1vbikgPCAwKSB7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgfSBlbHNlIGlmIChpbi0+Y29tbW9uLnN0YXRlICE9IEFVRElPX0hBX1NUQVRFX1NUQVJURUQpIHsKLSAgICBFUlJPUigic3RyZWFtIG5vdCBpbiBzdG9wcGVkIG9yIHN0YW5kYnkiKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgbG9jay51bmxvY2soKTsKLSAgcmVhZCA9IHNrdF9yZWFkKGluLT5jb21tb24uYXVkaW9fZmQsIGJ1ZmZlciwgYnl0ZXMpOwotICBsb2NrLmxvY2soKTsKLSAgaWYgKHJlYWQgPT0gLTEpIHsKLSAgICBza3RfZGlzY29ubmVjdChpbi0+Y29tbW9uLmF1ZGlvX2ZkKTsKLSAgICBpbi0+Y29tbW9uLmF1ZGlvX2ZkID0gQVVESU9fU0tUX0RJU0NPTk5FQ1RFRDsKLSAgICBpZiAoKGluLT5jb21tb24uc3RhdGUgIT0gQVVESU9fSEFfU1RBVEVfU1VTUEVOREVEKSAmJgotICAgICAgICAoaW4tPmNvbW1vbi5zdGF0ZSAhPSBBVURJT19IQV9TVEFURV9TVE9QUElORykpIHsKLSAgICAgIGluLT5jb21tb24uc3RhdGUgPSBBVURJT19IQV9TVEFURV9TVE9QUEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBFUlJPUigicmVhZCBmYWlsZWQgOiBzdHJlYW0gc3VzcGVuZGVkLCBhdm9pZCByZXNldHRpbmcgc3RhdGUiKTsKLSAgICB9Ci0gICAgZ290byBlcnJvcjsKLSAgfSBlbHNlIGlmIChyZWFkID09IDApIHsKLSAgICBERUJVRygicmVhZCB0aW1lIG91dCAtIHJldHVybiB6ZXJvcyIpOwotICAgIG1lbXNldChidWZmZXIsIDAsIGJ5dGVzKTsKLSAgICByZWFkID0gYnl0ZXM7Ci0gIH0KLSAgbG9jay51bmxvY2soKTsKLQotICBERUJVRygicmVhZCAlZCBieXRlcyBvdXQgb2YgJXp1IGJ5dGVzIiwgcmVhZCwgYnl0ZXMpOwotICByZXR1cm4gcmVhZDsKLQotZXJyb3I6Ci0gIG1lbXNldChidWZmZXIsIDAsIGJ5dGVzKTsKLSAgdXNfZGVsYXkgPSBjYWxjX2F1ZGlvdGltZV91c2VjKGluLT5jb21tb24uY2ZnLCBieXRlcyk7Ci0gIERFQlVHKCJlbXVsYXRlIGhhIHJlYWQgZGVsYXkgKCVkIHVzKSIsIHVzX2RlbGF5KTsKLQotICB1c2xlZXAodXNfZGVsYXkpOwotICByZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBpbl9nZXRfaW5wdXRfZnJhbWVzX2xvc3QoCi0gICAgVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtKSB7Ci0gIEZOTE9HKCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluX2FkZF9hdWRpb19lZmZlY3QoVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3QpIHsKLSAgRk5MT0coKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW5fcmVtb3ZlX2F1ZGlvX2VmZmVjdChVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgZWZmZWN0X2hhbmRsZV90IGVmZmVjdCkgewotICBGTkxPRygpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZXZfb3Blbl9vdXRwdXRfc3RyZWFtKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcqIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqKiBzdHJlYW1fb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCBjaGFyKiBhZGRyZXNzKQotCi17Ci0gIHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqIGhhX2RldiA9IChzdHJ1Y3QgaGFfYXVkaW9fZGV2aWNlKilkZXY7Ci0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXQ7Ci0gIGludCByZXQgPSAwOwotCi0gIElORk8oIm9wZW5pbmcgb3V0cHV0Iik7Ci0gIC8vIHByb3RlY3QgYWdhaW5zdCBhZGV2LT5vdXRwdXQgYW5kIHN0cmVhbV9vdXQgZnJvbSBiZWluZyBpbmNvbnNpc3RlbnQKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCpoYV9kZXYtPm11dGV4KTsKLSAgb3V0ID0gKHN0cnVjdCBoYV9zdHJlYW1fb3V0KiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBoYV9zdHJlYW1fb3V0KSk7Ci0KLSAgaWYgKCFvdXQpIHJldHVybiAtRU5PTUVNOwotCi0gIG91dC0+c3RyZWFtLmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUgPSBvdXRfZ2V0X3NhbXBsZV9yYXRlOwotICBvdXQtPnN0cmVhbS5jb21tb24uc2V0X3NhbXBsZV9yYXRlID0gb3V0X3NldF9zYW1wbGVfcmF0ZTsKLSAgb3V0LT5zdHJlYW0uY29tbW9uLmdldF9idWZmZXJfc2l6ZSA9IG91dF9nZXRfYnVmZmVyX3NpemU7Ci0gIG91dC0+c3RyZWFtLmNvbW1vbi5nZXRfY2hhbm5lbHMgPSBvdXRfZ2V0X2NoYW5uZWxzOwotICBvdXQtPnN0cmVhbS5jb21tb24uZ2V0X2Zvcm1hdCA9IG91dF9nZXRfZm9ybWF0OwotICBvdXQtPnN0cmVhbS5jb21tb24uc2V0X2Zvcm1hdCA9IG91dF9zZXRfZm9ybWF0OwotICBvdXQtPnN0cmVhbS5jb21tb24uc3RhbmRieSA9IG91dF9zdGFuZGJ5OwotICBvdXQtPnN0cmVhbS5jb21tb24uZHVtcCA9IG91dF9kdW1wOwotICBvdXQtPnN0cmVhbS5jb21tb24uc2V0X3BhcmFtZXRlcnMgPSBvdXRfc2V0X3BhcmFtZXRlcnM7Ci0gIG91dC0+c3RyZWFtLmNvbW1vbi5nZXRfcGFyYW1ldGVycyA9IG91dF9nZXRfcGFyYW1ldGVyczsKLSAgb3V0LT5zdHJlYW0uY29tbW9uLmFkZF9hdWRpb19lZmZlY3QgPSBvdXRfYWRkX2F1ZGlvX2VmZmVjdDsKLSAgb3V0LT5zdHJlYW0uY29tbW9uLnJlbW92ZV9hdWRpb19lZmZlY3QgPSBvdXRfcmVtb3ZlX2F1ZGlvX2VmZmVjdDsKLSAgb3V0LT5zdHJlYW0uZ2V0X2xhdGVuY3kgPSBvdXRfZ2V0X2xhdGVuY3k7Ci0gIG91dC0+c3RyZWFtLnNldF92b2x1bWUgPSBvdXRfc2V0X3ZvbHVtZTsKLSAgb3V0LT5zdHJlYW0ud3JpdGUgPSBvdXRfd3JpdGU7Ci0gIG91dC0+c3RyZWFtLmdldF9yZW5kZXJfcG9zaXRpb24gPSBvdXRfZ2V0X3JlbmRlcl9wb3NpdGlvbjsKLSAgb3V0LT5zdHJlYW0uZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9IG91dF9nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uOwotCi0gIC8qIGluaXRpYWxpemUgaGEgc3BlY2lmaWNzICovCi0gIGhhX3N0cmVhbV9jb21tb25faW5pdCgmb3V0LT5jb21tb24pOwotCi0gIC8vIE1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSB0aGUgZmVlZGluZyBwYXJhbWV0ZXJzIGNvbmZpZ3VyZWQKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NhcGFiaWxpdHk7Ci0gIGlmIChoYV9yZWFkX291dHB1dF9hdWRpb19jb25maWcoJm91dC0+Y29tbW9uLCAmY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogdXBkYXRlX3N0cmVhbV9jb25maWcgKi8pIDwgMCkgewotICAgIEVSUk9SKCJoYV9yZWFkX291dHB1dF9hdWRpb19jb25maWcgZmFpbGVkIik7Ci0gICAgcmV0ID0gLTE7Ci0gICAgZ290byBlcnJfb3BlbjsKLSAgfQotICAvLyBoYV9yZWFkX291dHB1dF9hdWRpb19jb25maWcoKSBvcGVucyB0aGUgc29ja2V0IGNvbnRyb2wgcGF0aCAob3IgZmFpbHMpCi0KLSAgLyogc2V0IG91dHB1dCBjb25maWcgdmFsdWVzICovCi0gIGlmIChjb25maWcgIT0gbnVsbHB0cikgewotICAgIC8vIFRyeSB0byB1c2UgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzIGFuZCBzZW5kIGl0IHRvIHRoZSByZW1vdGUgc2lkZQotICAgIC8vIFRPRE86IFNoYWxsIHdlIHVzZSBvdXRfc2V0X2Zvcm1hdCgpIGFuZCBzaW1pbGFyPwotICAgIGlmIChjb25maWctPmZvcm1hdCAhPSAwKSBvdXQtPmNvbW1vbi5jZmcuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7Ci0gICAgaWYgKGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gMCkgb3V0LT5jb21tb24uY2ZnLnJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwotICAgIGlmIChjb25maWctPmNoYW5uZWxfbWFzayAhPSAwKQotICAgICAgb3V0LT5jb21tb24uY2ZnLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgIGlmICgob3V0LT5jb21tb24uY2ZnLmZvcm1hdCAhPSAwKSB8fCAob3V0LT5jb21tb24uY2ZnLnJhdGUgIT0gMCkgfHwKLSAgICAgICAgKG91dC0+Y29tbW9uLmNmZy5jaGFubmVsX21hc2sgIT0gMCkpIHsKLSAgICAgIGlmIChoYV93cml0ZV9vdXRwdXRfYXVkaW9fY29uZmlnKCZvdXQtPmNvbW1vbikgPCAwKSB7Ci0gICAgICAgIEVSUk9SKCJoYV93cml0ZV9vdXRwdXRfYXVkaW9fY29uZmlnIGZhaWxlZCIpOwotICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgZ290byBlcnJfb3BlbjsKLSAgICAgIH0KLSAgICAgIC8vIFJlYWQgYWdhaW4gYW5kIG1ha2Ugc3VyZSB3ZSB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgcmVtb3RlIHNpZGUKLSAgICAgIGlmIChoYV9yZWFkX291dHB1dF9hdWRpb19jb25maWcoJm91dC0+Y29tbW9uLCAmY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB1cGRhdGVfc3RyZWFtX2NvbmZpZyAqLykgPCAwKSB7Ci0gICAgICAgIEVSUk9SKCJoYV9yZWFkX291dHB1dF9hdWRpb19jb25maWcgZmFpbGVkIik7Ci0gICAgICAgIHJldCA9IC0xOwotICAgICAgICBnb3RvIGVycl9vcGVuOwotICAgICAgfQotICAgIH0KLSAgICBjb25maWctPmZvcm1hdCA9IG91dF9nZXRfZm9ybWF0KChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKikmb3V0LT5zdHJlYW0pOwotICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgPQotICAgICAgICBvdXRfZ2V0X3NhbXBsZV9yYXRlKChjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtKikmb3V0LT5zdHJlYW0pOwotICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0KLSAgICAgICAgb3V0X2dldF9jaGFubmVscygoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbSopJm91dC0+c3RyZWFtKTsKLQotICAgIElORk8oCi0gICAgICAgICJPdXRwdXQgc3RyZWFtIGNvbmZpZzogZm9ybWF0PTB4JXggc2FtcGxlX3JhdGU9JWQgY2hhbm5lbF9tYXNrPTB4JXggIgotICAgICAgICAiYnVmZmVyX3N6PSV6dSIsCi0gICAgICAgIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgb3V0LT5jb21tb24uYnVmZmVyX3N6KTsKLSAgfQotICAqc3RyZWFtX291dCA9ICZvdXQtPnN0cmVhbTsKLSAgaGFfZGV2LT5vdXRwdXQgPSBvdXQ7Ci0KLSAgREVCVUcoInN1Y2Nlc3MiKTsKLSAgLyogRGVsYXkgdG8gZW5zdXJlIEhlYWRzZXQgaXMgaW4gcHJvcGVyIHN0YXRlIHdoZW4gU1RBUlQgaXMgaW5pdGlhdGVkIGZyb20KLSAgICogRFVUIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb25uZWN0aW9uIGR1ZSB0byBvbmdvaW5nIG11c2ljIHBsYXliYWNrLiAqLwotICB1c2xlZXAoMjUwMDAwKTsKLSAgcmV0dXJuIDA7Ci0KLWVycl9vcGVuOgotICBoYV9zdHJlYW1fY29tbW9uX2Rlc3Ryb3koJm91dC0+Y29tbW9uKTsKLSAgZnJlZShvdXQpOwotICAqc3RyZWFtX291dCA9IE5VTEw7Ci0gIGhhX2Rldi0+b3V0cHV0ID0gTlVMTDsKLSAgRVJST1IoImZhaWxlZCIpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBhZGV2X2Nsb3NlX291dHB1dF9zdHJlYW0oc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0pIHsKLSAgc3RydWN0IGhhX2F1ZGlvX2RldmljZSogaGFfZGV2ID0gKHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqKWRldjsKLSAgc3RydWN0IGhhX3N0cmVhbV9vdXQqIG91dCA9IChzdHJ1Y3QgaGFfc3RyZWFtX291dCopc3RyZWFtOwotCi0gIC8vIHByZXZlbnQgaW50ZXJmZXJlbmNlIHdpdGggYWRldl9zZXRfcGFyYW1ldGVycy4KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKCpoYV9kZXYtPm11dGV4KTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqb3V0LT5jb21tb24ubXV0ZXgpOwotICAgIGNvbnN0IGhhX3N0YXRlX3Qgc3RhdGUgPSBvdXQtPmNvbW1vbi5zdGF0ZTsKLSAgICBJTkZPKCJjbG9zaW5nIG91dHB1dCAoc3RhdGUgJWQpIiwgKGludClzdGF0ZSk7Ci0gICAgaWYgKChzdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVEFSVEVEKSB8fAotICAgICAgICAoc3RhdGUgPT0gQVVESU9fSEFfU1RBVEVfU1RPUFBJTkcpKSB7Ci0gICAgICBzdG9wX2F1ZGlvX2RhdGFwYXRoKCZvdXQtPmNvbW1vbik7Ci0gICAgfQotCi0gICAgc2t0X2Rpc2Nvbm5lY3Qob3V0LT5jb21tb24uY3RybF9mZCk7Ci0gICAgb3V0LT5jb21tb24uY3RybF9mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gIH0KLQotICBoYV9zdHJlYW1fY29tbW9uX2Rlc3Ryb3koJm91dC0+Y29tbW9uKTsKLSAgZnJlZShzdHJlYW0pOwotICBoYV9kZXYtPm91dHB1dCA9IE5VTEw7Ci0KLSAgREVCVUcoImRvbmUiKTsKLX0KLQotc3RhdGljIGludCBhZGV2X3NldF9wYXJhbWV0ZXJzKHN0cnVjdCBhdWRpb19od19kZXZpY2UqIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrdnBhaXJzKSB7Ci0gIHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqIGhhX2RldiA9IChzdHJ1Y3QgaGFfYXVkaW9fZGV2aWNlKilkZXY7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIC8vIHByZXZlbnQgaW50ZXJmZXJlbmNlIHdpdGggYWRldl9jbG9zZV9vdXRwdXRfc3RyZWFtCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqaGFfZGV2LT5tdXRleCk7Ci0gIHN0cnVjdCBoYV9zdHJlYW1fb3V0KiBvdXQgPSBoYV9kZXYtPm91dHB1dDsKLQotICBpZiAob3V0ID09IE5VTEwpIHJldHVybiByZXR2YWw7Ci0KLSAgSU5GTygic3RhdGUgJWQiLCBvdXQtPmNvbW1vbi5zdGF0ZSk7Ci0KLSAgcmV0dmFsID0KLSAgICAgIG91dC0+c3RyZWFtLmNvbW1vbi5zZXRfcGFyYW1ldGVycygoc3RydWN0IGF1ZGlvX3N0cmVhbSopb3V0LCBrdnBhaXJzKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgY2hhciogYWRldl9nZXRfcGFyYW1ldGVycyhVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXlzKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyYW1zID0KLSAgICAgIGhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMoa2V5cyk7Ci0gIGhhc2hfbWFwX3V0aWxzX2R1bXBfc3RyaW5nX2tleXNfc3RyaW5nX3ZhbHVlcyhwYXJhbXMpOwotCi0gIHJldHVybiBzdHJkdXAoIiIpOwotfQotCi1zdGF0aWMgaW50IGFkZXZfaW5pdF9jaGVjayhVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZGV2X3NldF92b2ljZV92b2x1bWUoVU5VU0VEX0FUVFIgc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgZmxvYXQgdm9sdW1lKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9zZXRfbWFzdGVyX3ZvbHVtZShVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgZmxvYXQgdm9sdW1lKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9zZXRfbW9kZShVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZGV2X3NldF9taWNfbXV0ZShVTlVTRURfQVRUUiBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGJvb2wgc3RhdGUpIHsKLSAgRk5MT0coKTsKLQotICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBhZGV2X2dldF9taWNfbXV0ZShVTlVTRURfQVRUUiBjb25zdCBzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGJvb2wqIHN0YXRlKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBzaXplX3QgYWRldl9nZXRfaW5wdXRfYnVmZmVyX3NpemUoCi0gICAgVU5VU0VEX0FUVFIgY29uc3Qgc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2LAotICAgIFVOVVNFRF9BVFRSIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcqIGNvbmZpZykgewotICBGTkxPRygpOwotCi0gIHJldHVybiAzMjA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9vcGVuX2lucHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHN0cnVjdCBhdWRpb19jb25maWcqIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiogc3RyZWFtX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgY2hhciogYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKLSAgc3RydWN0IGhhX2F1ZGlvX2RldmljZSogaGFfZGV2ID0gKHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqKWRldjsKLSAgc3RydWN0IGhhX3N0cmVhbV9pbiogaW47Ci0gIGludCByZXQ7Ci0KLSAgRk5MT0coKTsKLQotICAvLyBwcm90ZWN0IGFnYWluc3QgYWRldi0+aW5wdXQgYW5kIHN0cmVhbV9pbiBmcm9tIGJlaW5nIGluY29uc2lzdGVudAotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKmhhX2Rldi0+bXV0ZXgpOwotICBpbiA9IChzdHJ1Y3QgaGFfc3RyZWFtX2luKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBoYV9zdHJlYW1faW4pKTsKLQotICBpZiAoIWluKSByZXR1cm4gLUVOT01FTTsKLQotICBpbi0+c3RyZWFtLmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUgPSBpbl9nZXRfc2FtcGxlX3JhdGU7Ci0gIGluLT5zdHJlYW0uY29tbW9uLnNldF9zYW1wbGVfcmF0ZSA9IGluX3NldF9zYW1wbGVfcmF0ZTsKLSAgaW4tPnN0cmVhbS5jb21tb24uZ2V0X2J1ZmZlcl9zaXplID0gaW5fZ2V0X2J1ZmZlcl9zaXplOwotICBpbi0+c3RyZWFtLmNvbW1vbi5nZXRfY2hhbm5lbHMgPSBpbl9nZXRfY2hhbm5lbHM7Ci0gIGluLT5zdHJlYW0uY29tbW9uLmdldF9mb3JtYXQgPSBpbl9nZXRfZm9ybWF0OwotICBpbi0+c3RyZWFtLmNvbW1vbi5zZXRfZm9ybWF0ID0gaW5fc2V0X2Zvcm1hdDsKLSAgaW4tPnN0cmVhbS5jb21tb24uc3RhbmRieSA9IGluX3N0YW5kYnk7Ci0gIGluLT5zdHJlYW0uY29tbW9uLmR1bXAgPSBpbl9kdW1wOwotICBpbi0+c3RyZWFtLmNvbW1vbi5zZXRfcGFyYW1ldGVycyA9IGluX3NldF9wYXJhbWV0ZXJzOwotICBpbi0+c3RyZWFtLmNvbW1vbi5nZXRfcGFyYW1ldGVycyA9IGluX2dldF9wYXJhbWV0ZXJzOwotICBpbi0+c3RyZWFtLmNvbW1vbi5hZGRfYXVkaW9fZWZmZWN0ID0gaW5fYWRkX2F1ZGlvX2VmZmVjdDsKLSAgaW4tPnN0cmVhbS5jb21tb24ucmVtb3ZlX2F1ZGlvX2VmZmVjdCA9IGluX3JlbW92ZV9hdWRpb19lZmZlY3Q7Ci0gIGluLT5zdHJlYW0uc2V0X2dhaW4gPSBpbl9zZXRfZ2FpbjsKLSAgaW4tPnN0cmVhbS5yZWFkID0gaW5fcmVhZDsKLSAgaW4tPnN0cmVhbS5nZXRfaW5wdXRfZnJhbWVzX2xvc3QgPSBpbl9nZXRfaW5wdXRfZnJhbWVzX2xvc3Q7Ci0KLSAgLyogaW5pdGlhbGl6ZSBoYSBzcGVjaWZpY3MgKi8KLSAgaGFfc3RyZWFtX2NvbW1vbl9pbml0KCZpbi0+Y29tbW9uKTsKLQotICAqc3RyZWFtX2luID0gJmluLT5zdHJlYW07Ci0gIGhhX2Rldi0+aW5wdXQgPSBpbjsKLQotICBpZiAoaGFfcmVhZF9pbnB1dF9hdWRpb19jb25maWcoJmluLT5jb21tb24pIDwgMCkgewotICAgIEVSUk9SKCJoYV9yZWFkX2lucHV0X2F1ZGlvX2NvbmZpZyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0ID0gLTE7Ci0gICAgZ290byBlcnJfb3BlbjsKLSAgfQotICAvLyBoYV9yZWFkX2lucHV0X2F1ZGlvX2NvbmZpZygpIG9wZW5zIHNvY2tldCBjb250cm9sIHBhdGggKG9yIGZhaWxzKQotCi0gIERFQlVHKCJzdWNjZXNzIik7Ci0gIHJldHVybiAwOwotCi1lcnJfb3BlbjoKLSAgaGFfc3RyZWFtX2NvbW1vbl9kZXN0cm95KCZpbi0+Y29tbW9uKTsKLSAgZnJlZShpbik7Ci0gICpzdHJlYW1faW4gPSBOVUxMOwotICBoYV9kZXYtPmlucHV0ID0gTlVMTDsKLSAgRVJST1IoImZhaWxlZCIpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBhZGV2X2Nsb3NlX2lucHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiBzdHJlYW0pIHsKLSAgc3RydWN0IGhhX2F1ZGlvX2RldmljZSogaGFfZGV2ID0gKHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqKWRldjsKLSAgc3RydWN0IGhhX3N0cmVhbV9pbiogaW4gPSAoc3RydWN0IGhhX3N0cmVhbV9pbiopc3RyZWFtOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqaGFfZGV2LT5tdXRleCk7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soKmluLT5jb21tb24ubXV0ZXgpOwotICAgIGNvbnN0IGhhX3N0YXRlX3Qgc3RhdGUgPSBpbi0+Y29tbW9uLnN0YXRlOwotICAgIElORk8oImNsb3NpbmcgaW5wdXQgKHN0YXRlICVkKSIsIChpbnQpc3RhdGUpOwotCi0gICAgaWYgKChzdGF0ZSA9PSBBVURJT19IQV9TVEFURV9TVEFSVEVEKSB8fCAoc3RhdGUgPT0gQVVESU9fSEFfU1RBVEVfU1RPUFBJTkcpKQotICAgICAgc3RvcF9hdWRpb19kYXRhcGF0aCgmaW4tPmNvbW1vbik7Ci0KLSAgICBza3RfZGlzY29ubmVjdChpbi0+Y29tbW9uLmN0cmxfZmQpOwotICAgIGluLT5jb21tb24uY3RybF9mZCA9IEFVRElPX1NLVF9ESVNDT05ORUNURUQ7Ci0gIH0KLSAgaGFfc3RyZWFtX2NvbW1vbl9kZXN0cm95KCZpbi0+Y29tbW9uKTsKLSAgZnJlZShzdHJlYW0pOwotICBoYV9kZXYtPmlucHV0ID0gTlVMTDsKLQotICBERUJVRygiZG9uZSIpOwotfQotCi1zdGF0aWMgaW50IGFkZXZfZHVtcChVTlVTRURfQVRUUiBjb25zdCBhdWRpb19od19kZXZpY2VfdCogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgaW50IGZkKSB7Ci0gIEZOTE9HKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRldl9jbG9zZShod19kZXZpY2VfdCogZGV2aWNlKSB7Ci0gIHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqIGhhX2RldiA9IChzdHJ1Y3QgaGFfYXVkaW9fZGV2aWNlKilkZXZpY2U7Ci0gIEZOTE9HKCk7Ci0KLSAgZGVsZXRlIGhhX2Rldi0+bXV0ZXg7Ci0gIGhhX2Rldi0+bXV0ZXggPSBudWxscHRyOwotICBmcmVlKGRldmljZSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZXZfb3Blbihjb25zdCBod19tb2R1bGVfdCogbW9kdWxlLCBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgaHdfZGV2aWNlX3QqKiBkZXZpY2UpIHsKLSAgc3RydWN0IGhhX2F1ZGlvX2RldmljZSogYWRldjsKLQotICBJTkZPKCIgYWRldl9vcGVuIGluIGhhX2h3IG1vZHVsZSIpOwotICBGTkxPRygpOwotCi0gIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfSU5URVJGQUNFKSAhPSAwKSB7Ci0gICAgRVJST1IoImludGVyZmFjZSAlcyBub3QgbWF0Y2hpbmcgWyVzXSIsIG5hbWUsIEFVRElPX0hBUkRXQVJFX0lOVEVSRkFDRSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLQotICBhZGV2ID0gKHN0cnVjdCBoYV9hdWRpb19kZXZpY2UqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGhhX2F1ZGlvX2RldmljZSkpOwotCi0gIGlmICghYWRldikgcmV0dXJuIC1FTk9NRU07Ci0KLSAgYWRldi0+bXV0ZXggPSBuZXcgc3RkOjpyZWN1cnNpdmVfbXV0ZXg7Ci0KLSAgYWRldi0+ZGV2aWNlLmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOwotICBhZGV2LT5kZXZpY2UuY29tbW9uLnZlcnNpb24gPSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOwotICBhZGV2LT5kZXZpY2UuY29tbW9uLm1vZHVsZSA9IChzdHJ1Y3QgaHdfbW9kdWxlX3QqKW1vZHVsZTsKLSAgYWRldi0+ZGV2aWNlLmNvbW1vbi5jbG9zZSA9IGFkZXZfY2xvc2U7Ci0KLSAgYWRldi0+ZGV2aWNlLmluaXRfY2hlY2sgPSBhZGV2X2luaXRfY2hlY2s7Ci0gIGFkZXYtPmRldmljZS5zZXRfdm9pY2Vfdm9sdW1lID0gYWRldl9zZXRfdm9pY2Vfdm9sdW1lOwotICBhZGV2LT5kZXZpY2Uuc2V0X21hc3Rlcl92b2x1bWUgPSBhZGV2X3NldF9tYXN0ZXJfdm9sdW1lOwotICBhZGV2LT5kZXZpY2Uuc2V0X21vZGUgPSBhZGV2X3NldF9tb2RlOwotICBhZGV2LT5kZXZpY2Uuc2V0X21pY19tdXRlID0gYWRldl9zZXRfbWljX211dGU7Ci0gIGFkZXYtPmRldmljZS5nZXRfbWljX211dGUgPSBhZGV2X2dldF9taWNfbXV0ZTsKLSAgYWRldi0+ZGV2aWNlLnNldF9wYXJhbWV0ZXJzID0gYWRldl9zZXRfcGFyYW1ldGVyczsKLSAgYWRldi0+ZGV2aWNlLmdldF9wYXJhbWV0ZXJzID0gYWRldl9nZXRfcGFyYW1ldGVyczsKLSAgYWRldi0+ZGV2aWNlLmdldF9pbnB1dF9idWZmZXJfc2l6ZSA9IGFkZXZfZ2V0X2lucHV0X2J1ZmZlcl9zaXplOwotICBhZGV2LT5kZXZpY2Uub3Blbl9vdXRwdXRfc3RyZWFtID0gYWRldl9vcGVuX291dHB1dF9zdHJlYW07Ci0gIGFkZXYtPmRldmljZS5jbG9zZV9vdXRwdXRfc3RyZWFtID0gYWRldl9jbG9zZV9vdXRwdXRfc3RyZWFtOwotICBhZGV2LT5kZXZpY2Uub3Blbl9pbnB1dF9zdHJlYW0gPSBhZGV2X29wZW5faW5wdXRfc3RyZWFtOwotICBhZGV2LT5kZXZpY2UuY2xvc2VfaW5wdXRfc3RyZWFtID0gYWRldl9jbG9zZV9pbnB1dF9zdHJlYW07Ci0gIGFkZXYtPmRldmljZS5kdW1wID0gYWRldl9kdW1wOwotCi0gIGFkZXYtPm91dHB1dCA9IE5VTEw7Ci0KLSAgKmRldmljZSA9ICZhZGV2LT5kZXZpY2UuY29tbW9uOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgaGFsX21vZHVsZV9tZXRob2RzID0gewotICAgIC5vcGVuID0gYWRldl9vcGVuLAotfTsKLQotX19hdHRyaWJ1dGVfXygoCi0gICAgdmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgc3RydWN0IGF1ZGlvX21vZHVsZSBIQUxfTU9EVUxFX0lORk9fU1lNID0gewotICAgIC5jb21tb24gPQotICAgICAgICB7Ci0gICAgICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKLSAgICAgICAgICAgIC52ZXJzaW9uX21ham9yID0gMSwKLSAgICAgICAgICAgIC52ZXJzaW9uX21pbm9yID0gMCwKLSAgICAgICAgICAgIC5pZCA9IEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgICAgIC5uYW1lID0gIkhlYXJpbmcgQWlkIEF1ZGlvIEhXIEhBTCIsCi0gICAgICAgICAgICAuYXV0aG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICAgICAgLm1ldGhvZHMgPSAmaGFsX21vZHVsZV9tZXRob2RzLAotICAgICAgICB9LAotfTsKZGlmZiAtLWdpdCBhL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3NyYy9hdWRpb19oZWFyaW5nX2FpZF9od191dGlscy5jYyBiL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3NyYy9hdWRpb19oZWFyaW5nX2FpZF9od191dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxZWVlNy4uMDAwMDAwMAotLS0gYS9hdWRpb19oZWFyaW5nX2FpZF9ody9zcmMvYXVkaW9faGVhcmluZ19haWRfaHdfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYXVkaW9faGVhcmluZ19haWRfaHcvaW5jbHVkZS9hdWRpb19oZWFyaW5nX2FpZF9ody5oIgotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1NUUihjb25zdCkgXAotICBjYXNlIGNvbnN0OiAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvbnN0OwotCi1jb25zdCBjaGFyKiBhdWRpb19oYV9od19kdW1wX2N0cmxfZXZlbnQodEhFQVJJTkdfQUlEX0NUUkxfQ01EIGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9DTURfTk9ORSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9DTURfQ0hFQ0tfUkVBRFkpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfQ01EX1NUQVJUKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVE9QKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVVNQRU5EKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0dFVF9JTlBVVF9BVURJT19DT05GSUcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfR0VUX09VVFBVVF9BVURJT19DT05GSUcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfU0VUX09VVFBVVF9BVURJT19DT05GSUcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfQ01EX09GRkxPQURfU1RBUlQpCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuICJVTktOT1dOIEhFQVJJTkdfQUlEX0NUUkxfQ01EIjsKLX0KZGlmZiAtLWdpdCBhL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3Rlc3QvYXVkaW9faGVhcmluZ19haWRfaHdfdGVzdC5jYyBiL2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3Rlc3QvYXVkaW9faGVhcmluZ19haWRfaHdfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkMGUyYi4uMDAwMDAwMAotLS0gYS9hdWRpb19oZWFyaW5nX2FpZF9ody90ZXN0L2F1ZGlvX2hlYXJpbmdfYWlkX2h3X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdWRpb19oZWFyaW5nX2FpZF9ody9pbmNsdWRlL2F1ZGlvX2hlYXJpbmdfYWlkX2h3LmgiCi0KLW5hbWVzcGFjZSB7Ci1zdGF0aWMgdWludDMyX3QgY29kZWNfc2FtcGxlX3JhdGUydmFsdWUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QgY29kZWNfc2FtcGxlX3JhdGUpIHsKLSAgc3dpdGNoIChjb2RlY19zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgcmV0dXJuIDQ0MTAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgcmV0dXJuIDQ4MDAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOgotICAgICAgcmV0dXJuIDg4MjAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgICAgcmV0dXJuIDk2MDAwOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDoKLSAgICAgIHJldHVybiAxNzY0MDA7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgICAgcmV0dXJuIDE5MjAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNjAwMDoKLSAgICAgIHJldHVybiAxNjAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMDoKLSAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBjb2RlY19iaXRzX3Blcl9zYW1wbGUydmFsdWUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZSkgewotICBzd2l0Y2ggKGNvZGVjX2JpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIHJldHVybiAxNjsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICByZXR1cm4gMjQ7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgICAgcmV0dXJuIDMyOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBjb2RlY19jaGFubmVsX21vZGUydmFsdWUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNvZGVjX2NoYW5uZWxfbW9kZSkgewotICBzd2l0Y2ggKGNvZGVjX2NoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBBdWRpb0EyZHBId1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIEF1ZGlvQTJkcEh3VGVzdCgpIHt9Ci0KLSBwcml2YXRlOgotfTsKLQotVEVTVF9GKEF1ZGlvQTJkcEh3VGVzdCwgdGVzdF9jb21wdXRlX2J1ZmZlcl9zaXplKSB7Ci0gIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGNvZGVjX3NhbXBsZV9yYXRlX2FycmF5W10gPSB7Ci0gICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSwgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMCwKLSAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMCwgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwLAotICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwLCBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwLAotICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMH07Ci0KLSAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZV9hcnJheVtdID0gewotICAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FLCBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2LAotICAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCwgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMn07Ci0KLSAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNvZGVjX2NoYW5uZWxfbW9kZV9hcnJheVtdID0gewotICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FLCBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk8sCi0gICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFT307Ci0KLSAgZm9yIChjb25zdCBhdXRvIGNvZGVjX3NhbXBsZV9yYXRlIDogY29kZWNfc2FtcGxlX3JhdGVfYXJyYXkpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8gY29kZWNfYml0c19wZXJfc2FtcGxlIDogY29kZWNfYml0c19wZXJfc2FtcGxlX2FycmF5KSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8gY29kZWNfY2hhbm5lbF9tb2RlIDogY29kZWNfY2hhbm5lbF9tb2RlX2FycmF5KSB7Ci0gICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9IGF1ZGlvX2hhX2h3X3N0cmVhbV9jb21wdXRlX2J1ZmZlcl9zaXplKAotICAgICAgICAgICAgY29kZWNfc2FtcGxlX3JhdGUsIGNvZGVjX2JpdHNfcGVyX3NhbXBsZSwgY29kZWNfY2hhbm5lbF9tb2RlKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBpbnB1dAotICAgICAgICBpZiAoKGNvZGVjX3NhbXBsZV9yYXRlID09IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FKSB8fAotICAgICAgICAgICAgKGNvZGVjX2JpdHNfcGVyX3NhbXBsZSA9PSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpIHx8Ci0gICAgICAgICAgICAoY29kZWNfY2hhbm5lbF9tb2RlID09IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkpIHsKLSAgICAgICAgICBFWFBFQ1RfRVEoYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU1opKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gY29kZWNfc2FtcGxlX3JhdGUydmFsdWUoY29kZWNfc2FtcGxlX3JhdGUpOwotICAgICAgICBFWFBFQ1RfVFJVRShzYW1wbGVfcmF0ZSAhPSAwKTsKLQotICAgICAgICB1aW50MzJfdCBiaXRzX3Blcl9zYW1wbGUgPQotICAgICAgICAgICAgY29kZWNfYml0c19wZXJfc2FtcGxlMnZhbHVlKGNvZGVjX2JpdHNfcGVyX3NhbXBsZSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGJpdHNfcGVyX3NhbXBsZSAhPSAwKTsKLQotICAgICAgICB1aW50MzJfdCBudW1iZXJfb2ZfY2hhbm5lbHMgPQotICAgICAgICAgICAgY29kZWNfY2hhbm5lbF9tb2RlMnZhbHVlKGNvZGVjX2NoYW5uZWxfbW9kZSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG51bWJlcl9vZl9jaGFubmVscyAhPSAwKTsKLQotICAgICAgICBjb25zdCB1aW50NjRfdCB0aW1lX3BlcmlvZF9tcyA9IDIwOyAgLy8gVE9ETzogTXVzdCBiZSBhIHBhcmFtZXRlcgotICAgICAgICBzaXplX3QgZXhwZWN0ZWRfYnVmZmVyX3NpemUgPQotICAgICAgICAgICAgKHRpbWVfcGVyaW9kX21zICogQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfUEVSSU9EUyAqIHNhbXBsZV9yYXRlICoKLSAgICAgICAgICAgICBudW1iZXJfb2ZfY2hhbm5lbHMgKiAoYml0c19wZXJfc2FtcGxlIC8gOCkpIC8KLSAgICAgICAgICAgIDEwMDA7Ci0KLSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZGl2aXNvciBhbmQgYWRqdXN0IHRoZSBidWZmZXIgc2l6ZQotICAgICAgICBjb25zdCBzaXplX3QgZGl2aXNvciA9IChBVURJT19TVFJFQU1fT1VUUFVUX0JVRkZFUl9QRVJJT0RTICogMTYgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfY2hhbm5lbHMgKiBiaXRzX3Blcl9zYW1wbGUpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OwotICAgICAgICBjb25zdCBzaXplX3QgcmVtYWluZGVyID0gZXhwZWN0ZWRfYnVmZmVyX3NpemUgJSBkaXZpc29yOwotICAgICAgICBpZiAocmVtYWluZGVyICE9IDApIHsKLSAgICAgICAgICBleHBlY3RlZF9idWZmZXJfc2l6ZSArPSBkaXZpc29yIC0gcmVtYWluZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRVhQRUNUX0VRKGJ1ZmZlcl9zaXplLCBleHBlY3RlZF9idWZmZXJfc2l6ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvQW5kcm9pZC5icCBiL2JpbmRlci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ2ZjZiLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBsaWJibHVldG9vdGgtYmluZGVyIGFuZCBmcmFtZXdvcmsuamFyCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGgtYmluZGVyLWFpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcC5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU2luay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2xsZXIuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXQuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ3NpcFNldENvb3JkaW5hdG9yLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckNhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckxvY2tDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhQcm9maWxlU2VydmljZUNvbm5lY3Rpb24uYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFyaW5nQWlkLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFZvbHVtZUNvbnRyb2wuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGlkSG9zdC5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZUF1ZGlvLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFBhbi5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNYW5hZ2VyLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNYXAuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTWFwQ2xpZW50LmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1jcFNlcnZpY2VNYW5hZ2VyLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFBiYXAuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcENsaWVudC5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhTYXAuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoU29ja2V0TWFuYWdlci5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhTdGF0ZUNoYW5nZUNhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXRDbGllbnQuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGlkRGV2aWNlLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhpZERldmljZUNhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHQuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dENhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1ldGFkYXRhTGlzdGVuZXIuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE9vYkRhdGFDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL2xlL0lBZHZlcnRpc2luZ1NldENhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvbGUvSVBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL2xlL0lTY2FubmVyQ2FsbGJhY2suYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrLmFpZGwiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQWN0aXZpdHlFbmVyZ3lJbmZvLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQWN0aXZpdHlFbmVyZ3lJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTAwMTkuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFjdGl2aXR5RW5lcmd5SW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhBY3Rpdml0eUVuZXJneUluZm87CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXVkaW9Db25maWcuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBdWRpb0NvbmZpZy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWYxMTNkLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBdWRpb0NvbmZpZy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhBdWRpb0NvbmZpZzsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBdnJjcFBsYXllclNldHRpbmdzLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXZyY3BQbGF5ZXJTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWI4YWY2Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBdnJjcFBsYXllclNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIEJsdWV0b290aEF2cmNwUGxheWVyU2V0dGluZ3M7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njk5YjFlLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgQmx1ZXRvb3RoQ2xhc3M7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ29kZWNDb25maWcuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkwNjM3Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhDb2RlY0NvbmZpZzsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY1N0YXR1cy5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjU3RhdHVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzRkYjcuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjU3RhdHVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIEJsdWV0b290aENvZGVjU3RhdHVzOwpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZS5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWIwNTg5Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgQmx1ZXRvb3RoRGV2aWNlIGNwcF9oZWFkZXIgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9kZXZpY2UuaCI7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2M2I3YTcuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWM7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0RGVzY3JpcHRvci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDRjZGViLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0RGVzY3JpcHRvci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhHYXR0RGVzY3JpcHRvcjsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dEluY2x1ZGVkU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTExOTczLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIEJsdWV0b290aEdhdHRJbmNsdWRlZFNlcnZpY2U7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dFNlcnZpY2UuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0U2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTcyYmE5Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0U2VydmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhHYXR0U2VydmljZTsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0Q2xpZW50Q2FsbC5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXRDbGllbnRDYWxsLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MDNkNTEuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXRDbGllbnRDYWxsLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhIZWFkc2V0Q2xpZW50Q2FsbDsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIaWREZXZpY2VBcHBRb3NTZXR0aW5ncy5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhpZERldmljZUFwcFFvc1NldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjkxMTQuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhpZERldmljZUFwcFFvc1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgQmx1ZXRvb3RoSGlkRGV2aWNlQXBwUW9zU2V0dGluZ3M7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGlkRGV2aWNlQXBwU2RwU2V0dGluZ3MuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIaWREZXZpY2VBcHBTZHBTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RkMTBlLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIaWREZXZpY2VBcHBTZHBTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIEJsdWV0b290aEhpZERldmljZUFwcFNkcFNldHRpbmdzOwpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0J1ZmZlckNvbnN0cmFpbnRzLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQnVmZmVyQ29uc3RyYWludHMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxZjVhYy4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQnVmZmVyQ29uc3RyYWludHMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCdWZmZXJDb25zdHJhaW50czsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTc4ZjViLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhNZXRhZGF0YUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhPb2JEYXRhQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aFNvY2tldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aFN0YXRlQ2hhbmdlQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWN0aXZpdHlFbmVyZ3lJbmZvOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENsYXNzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5Pb2JEYXRhOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotCi0vKioKLSAqIFN5c3RlbSBwcml2YXRlIEFQSSBmb3IgdGFsa2luZyB3aXRoIHRoZSBCbHVldG9vdGggc2VydmljZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoCi17Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBpbnQgZ2V0U3RhdGUoKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBlbmFibGUoYm9vbGVhbiBxdWlldE1vZGUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZGlzYWJsZShpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTE9DQUxfTUFDX0FERFJFU1N9KSIpCi0gICAgU3RyaW5nIGdldEFkZHJlc3MoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkxPQ0FMX01BQ19BRERSRVNTfSkiKQotICAgIFN0cmluZyBnZXRBZGRyZXNzV2l0aEF0dHJpYnV0aW9uKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIFBhcmNlbFV1aWRbXSBnZXRVdWlkcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNldE5hbWUoaW4gU3RyaW5nIG5hbWUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIFN0cmluZyBnZXROYW1lKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQURWRVJUSVNFKSIpCi0gICAgaW50IGdldE5hbWVMZW5ndGhGb3JBZHZlcnRpc2UoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgQmx1ZXRvb3RoQ2xhc3MgZ2V0Qmx1ZXRvb3RoQ2xhc3MoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRCbHVldG9vdGhDbGFzcyhpbiBCbHVldG9vdGhDbGFzcyBibHVldG9vdGhDbGFzcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0SW9DYXBhYmlsaXR5KGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0SW9DYXBhYmlsaXR5KGludCBjYXBhYmlsaXR5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0TGVJb0NhcGFiaWxpdHkoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRMZUlvQ2FwYWJpbGl0eShpbnQgY2FwYWJpbGl0eSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1NDQU4pIikKLSAgICBpbnQgZ2V0U2Nhbk1vZGUoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9TQ0FOKSIpCi0gICAgYm9vbGVhbiBzZXRTY2FuTW9kZShpbnQgbW9kZSwgaW50IGR1cmF0aW9uLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfU0NBTikiKQotICAgIGludCBnZXREaXNjb3ZlcmFibGVUaW1lb3V0KGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfU0NBTikiKQotICAgIGJvb2xlYW4gc2V0RGlzY292ZXJhYmxlVGltZW91dChpbnQgdGltZW91dCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1NDQU4pIikKLSAgICBib29sZWFuIHN0YXJ0RGlzY292ZXJ5KGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfU0NBTikiKQotICAgIGJvb2xlYW4gY2FuY2VsRGlzY292ZXJ5KGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfU0NBTikiKQotICAgIGJvb2xlYW4gaXNEaXNjb3ZlcmluZyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBsb25nIGdldERpc2NvdmVyeUVuZE1pbGxpcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGludCBnZXRBZGFwdGVyQ29ubmVjdGlvblN0YXRlKCk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBpbnQgZ2V0UHJvZmlsZUNvbm5lY3Rpb25TdGF0ZShpbnQgcHJvZmlsZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIEJsdWV0b290aERldmljZVtdIGdldEJvbmRlZERldmljZXMoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBjcmVhdGVCb25kKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIGludCB0cmFuc3BvcnQsIGluIE9vYkRhdGEgcDE5MkRhdGEsIGluIE9vYkRhdGEgcDI1NkRhdGEsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gY2FuY2VsQm9uZFByb2Nlc3MoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiByZW1vdmVCb25kKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRCb25kU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc0JvbmRpbmdJbml0aWF0ZWRMb2NhbGx5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGxvbmcgZ2V0U3VwcG9ydGVkUHJvZmlsZXMoKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGVXaXRoQXR0cmlidXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgU3RyaW5nIGdldFJlbW90ZU5hbWUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldFJlbW90ZVR5cGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBTdHJpbmcgZ2V0UmVtb3RlQWxpYXMoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBTdHJpbmcgZ2V0UmVtb3RlQWxpYXNXaXRoQXR0cmlidXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IHNldFJlbW90ZUFsaWFzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIFN0cmluZyBuYW1lLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0UmVtb3RlQ2xhc3MoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgUGFyY2VsVXVpZFtdIGdldFJlbW90ZVV1aWRzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBmZXRjaFJlbW90ZVV1aWRzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBmZXRjaFJlbW90ZVV1aWRzV2l0aEF0dHJpYnV0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIGludCB0cmFuc3BvcnQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2RwU2VhcmNoKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIFBhcmNlbFV1aWQgdXVpZCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldEJhdHRlcnlMZXZlbChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0TWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBzZXRQaW4oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBhY2NlcHQsIGludCBsZW4sIGluIGJ5dGVbXSBwaW5Db2RlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNldFBhc3NrZXkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBhY2NlcHQsIGludCBsZW4sIGluIGJ5dGVbXSBwYXNza2V5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldFBhaXJpbmdDb25maXJtYXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBhY2NlcHQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldFBob25lYm9va0FjY2Vzc1Blcm1pc3Npb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRTaWxlbmNlTW9kZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIHNpbGVuY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gZ2V0U2lsZW5jZU1vZGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRQaG9uZWJvb2tBY2Nlc3NQZXJtaXNzaW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCB2YWx1ZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldE1lc3NhZ2VBY2Nlc3NQZXJtaXNzaW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0TWVzc2FnZUFjY2Vzc1Blcm1pc3Npb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHZhbHVlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0U2ltQWNjZXNzUGVybWlzc2lvbihpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldFNpbUFjY2Vzc1Blcm1pc3Npb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHZhbHVlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhpbiBJQmx1ZXRvb3RoQ2FsbGJhY2sgY2FsbGJhY2ssIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIHZvaWQgdW5yZWdpc3RlckNhbGxiYWNrKGluIElCbHVldG9vdGhDYWxsYmFjayBjYWxsYmFjaywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgLy8gRm9yIFNvY2tldAotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgSUJsdWV0b290aFNvY2tldE1hbmFnZXIgZ2V0U29ja2V0TWFuYWdlcigpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIGZhY3RvcnlSZXNldChpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGJvb2xlYW4gaXNNdWx0aUFkdmVydGlzZW1lbnRTdXBwb3J0ZWQoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGJvb2xlYW4gaXNPZmZsb2FkZWRGaWx0ZXJpbmdTdXBwb3J0ZWQoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGJvb2xlYW4gaXNPZmZsb2FkZWRTY2FuQmF0Y2hpbmdTdXBwb3J0ZWQoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGJvb2xlYW4gaXNBY3Rpdml0eUFuZEVuZXJneVJlcG9ydGluZ1N1cHBvcnRlZCgpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgYm9vbGVhbiBpc0xlMk1QaHlTdXBwb3J0ZWQoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGJvb2xlYW4gaXNMZUNvZGVkUGh5U3VwcG9ydGVkKCk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBib29sZWFuIGlzTGVFeHRlbmRlZEFkdmVydGlzaW5nU3VwcG9ydGVkKCk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBib29sZWFuIGlzTGVQZXJpb2RpY0FkdmVydGlzaW5nU3VwcG9ydGVkKCk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBpbnQgaXNDaXNDZW50cmFsU3VwcG9ydGVkKCk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBpbnQgaXNMZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJTZW5kZXJTdXBwb3J0ZWQoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGludCBnZXRMZU1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGgoKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgQmx1ZXRvb3RoQWN0aXZpdHlFbmVyZ3lJbmZvIHJlcG9ydEFjdGl2aXR5SW5mbyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICAvLyBGb3IgTWV0YWRhdGEKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gcmVnaXN0ZXJNZXRhZGF0YUxpc3RlbmVyKGluIElCbHVldG9vdGhNZXRhZGF0YUxpc3RlbmVyIGxpc3RlbmVyLCBpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHVucmVnaXN0ZXJNZXRhZGF0YUxpc3RlbmVyKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0TWV0YWRhdGEoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gaW50IGtleSwgaW4gYnl0ZVtdIHZhbHVlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBieXRlW10gZ2V0TWV0YWRhdGEoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gaW50IGtleSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdHMgdGhlIGNvbnRyb2xsZXIgYWN0aXZpdHkgaW5mbyBhc3luY2hyb25vdXNseS4KLSAgICAgKiBUaGUgaW1wbGVtZW50b3IgaXMgZXhwZWN0ZWQgdG8gcmVwbHkgd2l0aCB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWN0aXZpdHlFbmVyZ3lJbmZvfSBvYmplY3QgcGxhY2VkIGludG8gdGhlIEJ1bmRsZSB3aXRoIHRoZQotICAgICAqIGtleSB7QGxpbmsgYW5kcm9pZC5vcy5CYXR0ZXJ5U3RhdHMjUkVTVUxUX1JFQ0VJVkVSX0NPTlRST0xMRVJfS0VZfS4KLSAgICAgKiBUaGUgcmVzdWx0IGNvZGUgaXMgaWdub3JlZC4KLSAgICAgKi8KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIG9uZXdheSB2b2lkIHJlcXVlc3RBY3Rpdml0eUluZm8oaW4gUmVzdWx0UmVjZWl2ZXIgcmVzdWx0LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIHZvaWQgb25MZVNlcnZpY2VVcChpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICB2b2lkIG9uQnJFZHJEb3duKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURX0pIikKLSAgICBpbnQgY29ubmVjdEFsbEVuYWJsZWRQcm9maWxlcyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBpbnQgZGlzY29ubmVjdEFsbEVuYWJsZWRQcm9maWxlcyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VELGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEV9KSIpCi0gICAgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gaW50IHByb2ZpbGVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0QWN0aXZlRGV2aWNlcyhpbiBpbnQgcHJvZmlsZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldE1vc3RSZWNlbnRseUNvbm5lY3RlZERldmljZXMoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURX0pIikKLSAgICBib29sZWFuIHJlbW92ZUFjdGl2ZURldmljZShpbiBpbnQgcHJvZmlsZXMsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiByZWdpc3RlckJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayhpbiBJQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHVucmVnaXN0ZXJCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2soaW4gSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIGNhbkJvbmRXaXRob3V0RGlhbG9nKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIHZvaWQgZ2VuZXJhdGVMb2NhbE9vYkRhdGEoaW4gaW50IHRyYW5zcG9ydCwgSUJsdWV0b290aE9vYkRhdGFDYWxsYmFjayBjYWxsYmFjaywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHAuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzNzlhZi4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHAuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY1N0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQnVmZmVyQ29uc3RyYWludHM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIEFQSXMgZm9yIEJsdWV0b290aCBBMkRQIHNlcnZpY2UKLSAqCi0gKiBAaGlkZQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aEEyZHAgewotICAgIC8vIFB1YmxpYyBBUEkKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBjb25uZWN0V2l0aEF0dHJpYnV0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0V2l0aEF0dHJpYnV0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzV2l0aEF0dHJpYnV0aW9uKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzV2l0aEF0dHJpYnV0aW9uKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZVdpdGhBdHRyaWJ1dGlvbihpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNldEFjdGl2ZURldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBCbHVldG9vdGhEZXZpY2UgZ2V0QWN0aXZlRGV2aWNlKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29ubmVjdGlvblBvbGljeSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgYm9vbGVhbiBpc0F2cmNwQWJzb2x1dGVWb2x1bWVTdXBwb3J0ZWQoKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIG9uZXdheSB2b2lkIHNldEF2cmNwQWJzb2x1dGVWb2x1bWUoaW50IHZvbHVtZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc0EyZHBQbGF5aW5nKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIEJsdWV0b290aENvZGVjU3RhdHVzIGdldENvZGVjU3RhdHVzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIG9uZXdheSB2b2lkIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBCbHVldG9vdGhDb2RlY0NvbmZpZyBjb2RlY0NvbmZpZywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgb25ld2F5IHZvaWQgZW5hYmxlT3B0aW9uYWxDb2RlY3MoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgb25ld2F5IHZvaWQgZGlzYWJsZU9wdGlvbmFsQ29kZWNzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBzdXBwb3J0c09wdGlvbmFsQ29kZWNzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRPcHRpb25hbENvZGVjc0VuYWJsZWQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgb25ld2F5IHZvaWQgc2V0T3B0aW9uYWxDb2RlY3NFbmFibGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCB2YWx1ZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgaW50IGdldER5bmFtaWNCdWZmZXJTdXBwb3J0KGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIEJ1ZmZlckNvbnN0cmFpbnRzIGdldEJ1ZmZlckNvbnN0cmFpbnRzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0QnVmZmVyTGVuZ3RoTWlsbGlzKGludCBjb2RlYywgaW50IHNpemUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTaW5rLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTaW5rLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzEyMTYuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU2luay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF1ZGlvQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2U7Ci0KLS8qKgotICogQVBJcyBmb3IgQmx1ZXRvb3RoIEEyRFAgc2luayBzZXJ2aWNlCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhBMmRwU2luayB7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIGNvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBCbHVldG9vdGhBdWRpb0NvbmZpZyBnZXRBdWRpb0NvbmZpZyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3ksIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gaXNBMmRwUGxheWluZyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEF2cmNwQ29udHJvbGxlci5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2xsZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZmZjYi4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEF2cmNwQ29udHJvbGxlci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF2cmNwUGxheWVyU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci0KLS8qKgotICogQVBJcyBmb3IgQmx1ZXRvb3RoIEFWUkNQIGNvbnRyb2xsZXIgc2VydmljZQotICoKLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoQXZyY3BDb250cm9sbGVyIHsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBCbHVldG9vdGhBdnJjcFBsYXllclNldHRpbmdzIGdldFBsYXllclNldHRpbmdzKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2V0UGxheWVyQXBwbGljYXRpb25TZXR0aW5nKGluIEJsdWV0b290aEF2cmNwUGxheWVyU2V0dGluZ3MgcGxBcHBTZXR0aW5nLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHNlbmRHcm91cE5hdmlnYXRpb25DbWQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGtleUNvZGUsIGludCBrZXlTdGF0ZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcFRhcmdldC5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcFRhcmdldC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGZiYjdjLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLS8qKgotICogQVBJIGZvciBCbHVldG9vdGggQVZSQ1AgVGFyZ2V0IEludGVyZmFjZQotICoKLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoQXZyY3BUYXJnZXQgewotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHNlbmRWb2x1bWVDaGFuZ2VkKGluIGludCB2b2x1bWUpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDYWxsYmFjay5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzA2ODBmLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLS8qKgotICogU3lzdGVtIHByaXZhdGUgQVBJIGZvciBCbHVldG9vdGggc2VydmljZSBjYWxsYmFja3MuCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aENhbGxiYWNrCi17Ci0gICAgLy92b2lkIG9uUmZjb21tQ2hhbm5lbEZvdW5kKGludCBjaGFubmVsKTsKLSAgICB2b2lkIG9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2UoaW50IHByZXZTdGF0ZSwgaW50IG5ld1N0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRlNDljLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLQotLyoqCi0gKiBDYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgaWRlbnRpZnlpbmcgd2hlbiBhbiBBQ0wgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIGhhcHBlbnMKLSAqIEBoaWRlCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayB7Ci0gICAgdm9pZCBvbkRldmljZUNvbm5lY3RlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIGludCBoY2lSZWFzb24pOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDc2lwU2V0Q29vcmRpbmF0b3IuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ3NpcFNldENvb3JkaW5hdG9yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDUxY2QuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDc2lwU2V0Q29vcmRpbmF0b3IuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ3NpcFNldENvb3JkaW5hdG9yTG9ja0NhbGxiYWNrOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQVBJcyBmb3IgQmx1ZXRvb3RoIENTSVAgU2V0IENvb3JkaW5hdG9yCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhDc2lwU2V0Q29vcmRpbmF0b3IgewotICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRCkiKQotICBib29sZWFuIGNvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRCkiKQotICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQpIikKLSAgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEKSIpCi0gIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAvKioKLSAgICAqIEdldCB0aGUgbGlzdCBvZiBncm91cCBpZGVudGlmaWVycyBmb3IgdGhlIGdpdmVuIGNvbnRleHQge0B2YXIgdXVpZH0uCi0gICAgKiBAcmV0dXJuIGdyb3VwIGlkZW50aWZpZXJzIGFzIDxjb2RlPkxpc3Q8SW50ZWdlcj48L2NvZGU+Ci0gICAgKi8KLSAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgTGlzdCBnZXRBbGxHcm91cElkcyhpbiBQYXJjZWxVdWlkIHV1aWQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAvKioKLSAgICAqIEdldCBhbGwgZ3JvdXBzIHRoYXQge0B2YXIgZGV2aWNlfSBiZWxvbmdzIHRvLgotICAgICogQHJldHVybiBncm91cCBpZGVudGlmaWVycyBhbmQgdGhlaXIgY29udGV4dCB1dWlkcyBhcyA8Y29kZT5NYXA8SW50ZWdlciwgUGFyY2VsVXVpZD48L2NvZGU+Ci0gICAgKi8KLSAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgTWFwIGdldEdyb3VwVXVpZE1hcEJ5RGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2Yga25vd24gZ3JvdXAgbWVtYmVycyBvcgotICAgKiB7QGxpbmsgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvci5DU0lTX0dST1VQX1NJWkVfVU5LTk9XTn0gaWYgdW5rbm93bi4KLSAgICogQHJldHVybiBncm91cCBzaXplCi0gICAqLwotICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICBpbnQgZ2V0RGVzaXJlZEdyb3VwU2l6ZShpbiBpbnQgZ3JvdXBfaWQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAvKioKLSAgICogTG9jayBncm91cCBpZGVudGlmaWVkIHdpdGgge0B2YXIgZ3JvdXBJZH0uCi0gICAqIEByZXR1cm4gdW5pcXVlIGxvY2sgaWRlbnRpZmllciByZXF1aXJlZCBmb3IgdW5sb2NraW5nCi0gICAqLwotICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICBQYXJjZWxVdWlkIGdyb3VwTG9jayhpbnQgZ3JvdXBJZCwgaW4gSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckxvY2tDYWxsYmFjayBjYWxsYmFjaywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gIC8qKgotICAgKiBVbmxvY2sgZ3JvdXAgdXNpbmcge0B2YXIgbG9ja1V1aWR9IGFjcXVpcmVkIHRocm91Z2gKLSAgICoge0BsaW5rIGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDc2lwU2V0Q29vcmRpbmF0b3IuZ3JvdXBMb2NrfS4KLSAgICovCi0gIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gIHZvaWQgZ3JvdXBVbmxvY2soaW4gUGFyY2VsVXVpZCBsb2NrVXVpZCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gIGNvbnN0IGludCBDU0lTX0dST1VQX0lEX0lOVkFMSUQgPSAtMTsKLSAgY29uc3QgaW50IENTSVNfR1JPVVBfU0laRV9VTktOT1dOID0gMTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ3NpcFNldENvb3JkaW5hdG9yQ2FsbGJhY2suYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ3NpcFNldENvb3JkaW5hdG9yQ2FsbGJhY2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlMTFjYi4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLQotLyoqCi0gKiBDYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDU0lQIFNldCBDb29yZGluYXRvcgotICoKLSAqIEBoaWRlCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckNhbGxiYWNrIHsKLSAgICB2b2lkIG9uQ3Npc1NldE1lbWJlckF2YWlsYWJsZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBpbnQgZ3JvdXBJZCk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckxvY2tDYWxsYmFjay5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDc2lwU2V0Q29vcmRpbmF0b3JMb2NrQ2FsbGJhY2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiYTM3MS4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckxvY2tDYWxsYmFjay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotLyoqCi0gKiBDYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDU0lQIFNldCBDb29yZGluYXRvciBncm91cCBsb2NraW5nIG1ldGhvZAotICoKLSAqIEBoaWRlCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aENzaXBTZXRDb29yZGluYXRvckxvY2tDYWxsYmFjayB7Ci0gICAgdm9pZCBvbkdyb3VwTG9ja1NldChpbiBpbnQgZ3JvdXBJZCwgaW4gaW50IG9wU3RhdHVzLCBpbiBib29sZWFuIGlzTG9ja2VkKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dC5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjkzOTguLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkFkdmVydGlzZVNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkFkdmVydGlzZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuQWR2ZXJ0aXNpbmdTZXRQYXJhbWV0ZXJzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5GaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuUmVzdWx0U3RvcmFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLm9zLldvcmtTb3VyY2U7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoR2F0dENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuSUFkdmVydGlzaW5nU2V0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuSVBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5JU2Nhbm5lckNhbGxiYWNrOwotCi0vKioKLSAqIEFQSSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBCTEUgLyBHQVRUCi0gKiBAaGlkZQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aEdhdHQgewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfU0NBTikiKQotICAgIHZvaWQgcmVnaXN0ZXJTY2FubmVyKGluIElTY2FubmVyQ2FsbGJhY2sgY2FsbGJhY2ssIGluIFdvcmtTb3VyY2Ugd29ya1NvdXJjZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9TQ0FOKSIpCi0gICAgdm9pZCB1bnJlZ2lzdGVyU2Nhbm5lcihpbiBpbnQgc2Nhbm5lcklkLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1NDQU4pIikKLSAgICB2b2lkIHN0YXJ0U2NhbihpbiBpbnQgc2Nhbm5lcklkLCBpbiBTY2FuU2V0dGluZ3Mgc2V0dGluZ3MsIGluIExpc3Q8U2NhbkZpbHRlcj4gZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1NDQU4pIikKLSAgICB2b2lkIHN0YXJ0U2NhbkZvckludGVudChpbiBQZW5kaW5nSW50ZW50IGludGVudCwgaW4gU2NhblNldHRpbmdzIHNldHRpbmdzLCBpbiBMaXN0PFNjYW5GaWx0ZXI+IGZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9TQ0FOKSIpCi0gICAgdm9pZCBzdG9wU2NhbkZvckludGVudChpbiBQZW5kaW5nSW50ZW50IGludGVudCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9TQ0FOKSIpCi0gICAgdm9pZCBzdG9wU2NhbihpbiBpbnQgc2Nhbm5lcklkLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1NDQU4pIikKLSAgICB2b2lkIGZsdXNoUGVuZGluZ0JhdGNoUmVzdWx0cyhpbiBpbnQgc2Nhbm5lcklkLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQURWRVJUSVNFKSIpCi0gICAgdm9pZCBzdGFydEFkdmVydGlzaW5nU2V0KGluIEFkdmVydGlzaW5nU2V0UGFyYW1ldGVycyBwYXJhbWV0ZXJzLCBpbiBBZHZlcnRpc2VEYXRhIGFkdmVydGlzZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEFkdmVydGlzZURhdGEgc2NhblJlc3BvbnNlLCBpbiBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyBwZXJpb2RpY1BhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEFkdmVydGlzZURhdGEgcGVyaW9kaWNEYXRhLCBpbiBpbnQgZHVyYXRpb24sIGluIGludCBtYXhFeHRBZHZFdmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIElBZHZlcnRpc2luZ1NldENhbGxiYWNrIGNhbGxiYWNrLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0FEVkVSVElTRSkiKQotICAgIHZvaWQgc3RvcEFkdmVydGlzaW5nU2V0KGluIElBZHZlcnRpc2luZ1NldENhbGxiYWNrIGNhbGxiYWNrLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0FEVkVSVElTRSxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgdm9pZCBnZXRPd25BZGRyZXNzKGluIGludCBhZHZlcnRpc2VySWQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQURWRVJUSVNFKSIpCi0gICAgdm9pZCBlbmFibGVBZHZlcnRpc2luZ1NldChpbiBpbnQgYWR2ZXJ0aXNlcklkLCBpbiBib29sZWFuIGVuYWJsZSwgaW4gaW50IGR1cmF0aW9uLCBpbiBpbnQgbWF4RXh0QWR2RXZlbnRzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0FEVkVSVElTRSkiKQotICAgIHZvaWQgc2V0QWR2ZXJ0aXNpbmdEYXRhKGluIGludCBhZHZlcnRpc2VySWQsIGluIEFkdmVydGlzZURhdGEgZGF0YSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRFZFUlRJU0UpIikKLSAgICB2b2lkIHNldFNjYW5SZXNwb25zZURhdGEoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gQWR2ZXJ0aXNlRGF0YSBkYXRhLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0FEVkVSVElTRSkiKQotICAgIHZvaWQgc2V0QWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKGluIGludCBhZHZlcnRpc2VySWQsIGluIEFkdmVydGlzaW5nU2V0UGFyYW1ldGVycyBwYXJhbWV0ZXJzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0FEVkVSVElTRSkiKQotICAgIHZvaWQgc2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGFyYW1ldGVycywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRFZFUlRJU0UpIikKLSAgICB2b2lkIHNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhKGluIGludCBhZHZlcnRpc2VySWQsIGluIEFkdmVydGlzZURhdGEgZGF0YSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRFZFUlRJU0UpIikKLSAgICB2b2lkIHNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gYm9vbGVhbiBlbmFibGUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9TQ0FOKSIpCi0gICAgdm9pZCByZWdpc3RlclN5bmMoaW4gU2NhblJlc3VsdCBzY2FuUmVzdWx0LCBpbiBpbnQgc2tpcCwgaW4gaW50IHRpbWVvdXQsIGluIElQZXJpb2RpY0FkdmVydGlzaW5nQ2FsbGJhY2sgY2FsbGJhY2ssIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfU0NBTikiKQotICAgIHZvaWQgdW5yZWdpc3RlclN5bmMoaW4gSVBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjayBjYWxsYmFjaywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgcmVnaXN0ZXJDbGllbnQoaW4gUGFyY2VsVXVpZCBhcHBJZCwgaW4gSUJsdWV0b290aEdhdHRDYWxsYmFjayBjYWxsYmFjaywgYm9vbGVhbiBlYXR0X3N1cHBvcnQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHVucmVnaXN0ZXJDbGllbnQoaW4gaW50IGNsaWVudElmLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGNsaWVudENvbm5lY3QoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gYm9vbGVhbiBpc0RpcmVjdCwgaW4gaW50IHRyYW5zcG9ydCwgaW4gYm9vbGVhbiBvcHBvcnR1bmlzdGljLCBpbiBpbnQgcGh5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGNsaWVudERpc2Nvbm5lY3QoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBjbGllbnRTZXRQcmVmZXJyZWRQaHkoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IHR4UGh5LCBpbiBpbnQgcnhQaHksIGluIGludCBwaHlPcHRpb25zLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGNsaWVudFJlYWRQaHkoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZXMpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCByZWZyZXNoRGV2aWNlKGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgZGlzY292ZXJTZXJ2aWNlcyhpbiBpbnQgY2xpZW50SWYsIGluIFN0cmluZyBhZGRyZXNzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGRpc2NvdmVyU2VydmljZUJ5VXVpZChpbiBpbnQgY2xpZW50SWYsIGluIFN0cmluZyBhZGRyZXNzLCBpbiBQYXJjZWxVdWlkIHV1aWQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgcmVhZENoYXJhY3RlcmlzdGljKGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBoYW5kbGUsIGluIGludCBhdXRoUmVxLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHJlYWRVc2luZ0NoYXJhY3RlcmlzdGljVXVpZChpbiBpbnQgY2xpZW50SWYsIGluIFN0cmluZyBhZGRyZXNzLCBpbiBQYXJjZWxVdWlkIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgc3RhcnRIYW5kbGUsIGluIGludCBlbmRIYW5kbGUsIGluIGludCBhdXRoUmVxLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgd3JpdGVDaGFyYWN0ZXJpc3RpYyhpbiBpbnQgY2xpZW50SWYsIGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCB3cml0ZVR5cGUsIGluIGludCBhdXRoUmVxLCBpbiBieXRlW10gdmFsdWUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgcmVhZERlc2NyaXB0b3IoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IGhhbmRsZSwgaW4gaW50IGF1dGhSZXEsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCB3cml0ZURlc2NyaXB0b3IoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgYXV0aFJlcSwgaW4gYnl0ZVtdIHZhbHVlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uKGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBoYW5kbGUsIGluIGJvb2xlYW4gZW5hYmxlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGJlZ2luUmVsaWFibGVXcml0ZShpbiBpbnQgY2xpZW50SWYsIGluIFN0cmluZyBhZGRyZXNzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGVuZFJlbGlhYmxlV3JpdGUoaW4gaW50IGNsaWVudElmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gYm9vbGVhbiBleGVjdXRlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHJlYWRSZW1vdGVSc3NpKGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgY29uZmlndXJlTVRVKGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBtdHUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgY29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZShpbiBpbnQgY2xpZW50SWYsIGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgY29ubmVjdGlvblByaW9yaXR5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIGxlQ29ubmVjdGlvblVwZGF0ZShpbnQgY2xpZW50SWYsIFN0cmluZyBhZGRyZXNzLCBpbnQgbWluSW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEludGVydmFsLCBpbnQgcGVyaXBoZXJhbExhdGVuY3ksIGludCBzdXBlcnZpc2lvblRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbkNvbm5lY3Rpb25FdmVudExlbiwgaW50IG1heENvbm5lY3Rpb25FdmVudExlbiwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHJlZ2lzdGVyU2VydmVyKGluIFBhcmNlbFV1aWQgYXBwSWQsIGluIElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sgY2FsbGJhY2ssIGJvb2xlYW4gZWF0dF9zdXBwb3J0LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHVucmVnaXN0ZXJTZXJ2ZXIoaW4gaW50IHNlcnZlcklmLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHNlcnZlckNvbm5lY3QoaW4gaW50IHNlcnZlcklmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gYm9vbGVhbiBpc0RpcmVjdCwgaW4gaW50IHRyYW5zcG9ydCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXJ2ZXJEaXNjb25uZWN0KGluIGludCBzZXJ2ZXJJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgc2VydmVyU2V0UHJlZmVycmVkUGh5KGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCB0eFBoeSwgaW4gaW50IHJ4UGh5LCBpbiBpbnQgcGh5T3B0aW9ucywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXJ2ZXJSZWFkUGh5KGluIGludCBjbGllbnRJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgYWRkU2VydmljZShpbiBpbnQgc2VydmVySWYsIGluIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgcmVtb3ZlU2VydmljZShpbiBpbnQgc2VydmVySWYsIGluIGludCBoYW5kbGUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgY2xlYXJTZXJ2aWNlcyhpbiBpbnQgc2VydmVySWYsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgc2VuZFJlc3BvbnNlKGluIGludCBzZXJ2ZXJJZiwgaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IHN0YXR1cywgaW4gaW50IG9mZnNldCwgaW4gYnl0ZVtdIHZhbHVlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHNlbmROb3RpZmljYXRpb24oaW4gaW50IHNlcnZlcklmLCBpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIGNvbmZpcm0sIGluIGJ5dGVbXSB2YWx1ZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBkaXNjb25uZWN0QWxsKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgdW5yZWdBbGwoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IG51bUh3VHJhY2tGaWx0ZXJzQXZhaWxhYmxlKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dENhbGxiYWNrLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQwZWE5Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dENhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0U2VydmljZTsKLQotLyoqCi0gKiBDYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBCTEUgLyBHQVRUCi0gKiBAaGlkZQotICovCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhHYXR0Q2FsbGJhY2sgewotICAgIHZvaWQgb25DbGllbnRSZWdpc3RlcmVkKGluIGludCBzdGF0dXMsIGluIGludCBjbGllbnRJZik7Ci0gICAgdm9pZCBvbkNsaWVudENvbm5lY3Rpb25TdGF0ZShpbiBpbnQgc3RhdHVzLCBpbiBpbnQgY2xpZW50SWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIGNvbm5lY3RlZCwgaW4gU3RyaW5nIGFkZHJlc3MpOwotICAgIHZvaWQgb25QaHlVcGRhdGUoaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCB0eFBoeSwgaW4gaW50IHJ4UGh5LCBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uUGh5UmVhZChpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IHR4UGh5LCBpbiBpbnQgcnhQaHksIGluIGludCBzdGF0dXMpOwotICAgIHZvaWQgb25TZWFyY2hDb21wbGV0ZShpbiBTdHJpbmcgYWRkcmVzcywgaW4gTGlzdDxCbHVldG9vdGhHYXR0U2VydmljZT4gc2VydmljZXMsIGluIGludCBzdGF0dXMpOwotICAgIHZvaWQgb25DaGFyYWN0ZXJpc3RpY1JlYWQoaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBzdGF0dXMsIGluIGludCBoYW5kbGUsIGluIGJ5dGVbXSB2YWx1ZSk7Ci0gICAgdm9pZCBvbkNoYXJhY3RlcmlzdGljV3JpdGUoaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBzdGF0dXMsIGluIGludCBoYW5kbGUsIGluIGJ5dGVbXSB2YWx1ZSk7Ci0gICAgdm9pZCBvbkV4ZWN1dGVXcml0ZShpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IHN0YXR1cyk7Ci0gICAgdm9pZCBvbkRlc2NyaXB0b3JSZWFkKGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgc3RhdHVzLCBpbiBpbnQgaGFuZGxlLCBpbiBieXRlW10gdmFsdWUpOwotICAgIHZvaWQgb25EZXNjcmlwdG9yV3JpdGUoaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBzdGF0dXMsIGluIGludCBoYW5kbGUsIGluIGJ5dGVbXSB2YWx1ZSk7Ci0gICAgdm9pZCBvbk5vdGlmeShpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IGhhbmRsZSwgaW4gYnl0ZVtdIHZhbHVlKTsKLSAgICB2b2lkIG9uUmVhZFJlbW90ZVJzc2koaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCByc3NpLCBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uQ29uZmlndXJlTVRVKGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgbXR1LCBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uQ29ubmVjdGlvblVwZGF0ZWQoaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCBpbnRlcnZhbCwgaW4gaW50IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCB0aW1lb3V0LCBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uU2VydmljZUNoYW5nZWQoaW4gU3RyaW5nIGFkZHJlc3MpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2suYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGVlMjAuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2suYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dFNlcnZpY2U7Ci0KLS8qKgotICogQ2FsbGJhY2sgZGVmaW5pdGlvbnMgZm9yIGludGVyYWN0aW5nIHdpdGggQkxFIC8gR0FUVAotICogQGhpZGUKLSAqLwotb25ld2F5IGludGVyZmFjZSBJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrIHsKLSAgICB2b2lkIG9uU2VydmVyUmVnaXN0ZXJlZChpbiBpbnQgc3RhdHVzLCBpbiBpbnQgc2VydmVySWYpOwotICAgIHZvaWQgb25TZXJ2ZXJDb25uZWN0aW9uU3RhdGUoaW4gaW50IHN0YXR1cywgaW4gaW50IHNlcnZlcklmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYm9vbGVhbiBjb25uZWN0ZWQsIGluIFN0cmluZyBhZGRyZXNzKTsKLSAgICB2b2lkIG9uU2VydmljZUFkZGVkKGluIGludCBzdGF0dXMsIGluIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UpOwotICAgIHZvaWQgb25DaGFyYWN0ZXJpc3RpY1JlYWRSZXF1ZXN0KGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgdHJhbnNJZCwgaW4gaW50IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIGlzTG9uZywgaW4gaW50IGhhbmRsZSk7Ci0gICAgdm9pZCBvbkRlc2NyaXB0b3JSZWFkUmVxdWVzdChpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IHRyYW5zSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IG9mZnNldCwgaW4gYm9vbGVhbiBpc0xvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGhhbmRsZSk7Ci0gICAgdm9pZCBvbkNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0KGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgdHJhbnNJZCwgaW4gaW50IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgbGVuZ3RoLCBpbiBib29sZWFuIGlzUHJlcCwgaW4gYm9vbGVhbiBuZWVkUnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBoYW5kbGUsIGluIGJ5dGVbXSB2YWx1ZSk7Ci0gICAgdm9pZCBvbkRlc2NyaXB0b3JXcml0ZVJlcXVlc3QoaW4gU3RyaW5nIGFkZHJlc3MsIGluIGludCB0cmFuc0lkLCBpbiBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBsZW5ndGgsIGluIGJvb2xlYW4gaXNQcmVwLCBpbiBib29sZWFuIG5lZWRSc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGhhbmRsZSwgaW4gYnl0ZVtdIHZhbHVlKTsKLSAgICB2b2lkIG9uRXhlY3V0ZVdyaXRlKGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgdHJhbnNJZCwgaW4gYm9vbGVhbiBleGVjV3JpdGUpOwotICAgIHZvaWQgb25Ob3RpZmljYXRpb25TZW50KGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uTXR1Q2hhbmdlZChpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IG10dSk7Ci0gICAgdm9pZCBvblBoeVVwZGF0ZShpbiBTdHJpbmcgYWRkcmVzcywgaW4gaW50IHR4UGh5LCBpbiBpbnQgcnhQaHksIGluIGludCBzdGF0dXMpOwotICAgIHZvaWQgb25QaHlSZWFkKGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgdHhQaHksIGluIGludCByeFBoeSwgaW4gaW50IHN0YXR1cyk7Ci0gICAgdm9pZCBvbkNvbm5lY3Rpb25VcGRhdGVkKGluIFN0cmluZyBhZGRyZXNzLCBpbiBpbnQgaW50ZXJ2YWwsIGluIGludCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgdGltZW91dCwgaW4gaW50IHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRjZTVhLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIEFQSSBmb3IgQmx1ZXRvb3RoIEhlYWRzZXQgc2VydmljZQotICoKLSAqIE5vdGUgYmVmb3JlIGFkZGluZyBhbnl0aGluZyBuZXc6Ci0gKiAgIEludGVybmFsIGludGVyYWN0aW9ucyB3aXRoaW4gY29tLmFuZHJvaWQuYmx1ZXRvb3RoIHNob3VsZCBiZSBoYW5kbGVkIHRocm91Z2gKLSAqICAgSGVhZHNldFNlcnZpY2UgZGlyZWN0bHkgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIGJpbmRlcgotICoKLSAqIHtAaGlkZX0KLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhIZWFkc2V0IHsKLSAgICAvLyBQdWJsaWMgQVBJCi0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlc1dpdGhBdHRyaWJ1dGlvbihpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbiBpbnRbXSBzdGF0ZXMsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGVXaXRoQXR0cmlidXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFfSkiKQotICAgIGJvb2xlYW4gc3RhcnRWb2ljZVJlY29nbml0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc3RvcFZvaWNlUmVjb2duaXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc0F1ZGlvQ29ubmVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2VuZFZlbmRvclNwZWNpZmljUmVzdWx0Q29kZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBTdHJpbmcgY29tbWFuZCwgaW4gU3RyaW5nIGFyZywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgLy8gSGlkZGVuIEFQSQotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEV9KSIpCi0gICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFfSkiKQotICAgIGJvb2xlYW4gY29ubmVjdFdpdGhBdHRyaWJ1dGlvbihpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZGlzY29ubmVjdFdpdGhBdHRyaWJ1dGlvbihpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFfSkiKQotICAgIGJvb2xlYW4gc2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29ubmVjdGlvblBvbGljeSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldEF1ZGlvU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc0F1ZGlvT24oaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBjb25uZWN0QXVkaW8oaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0QXVkaW8oaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXRBdWRpb1JvdXRlQWxsb3dlZChib29sZWFuIGFsbG93ZWQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZ2V0QXVkaW9Sb3V0ZUFsbG93ZWQoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXRGb3JjZVNjb0F1ZGlvKGJvb2xlYW4gZm9yY2VkLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEV9KSIpCi0gICAgYm9vbGVhbiBzdGFydFNjb1VzaW5nVmlydHVhbFZvaWNlQ2FsbChpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEV9KSIpCi0gICAgYm9vbGVhbiBzdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURX0pIikKLSAgICBvbmV3YXkgdm9pZCBwaG9uZVN0YXRlQ2hhbmdlZChpbnQgbnVtQWN0aXZlLCBpbnQgbnVtSGVsZCwgaW50IGNhbGxTdGF0ZSwgU3RyaW5nIG51bWJlciwgaW50IHR5cGUsIFN0cmluZyBuYW1lLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEV9KSIpCi0gICAgdm9pZCBjbGNjUmVzcG9uc2UoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uLCBpbnQgc3RhdHVzLCBpbnQgbW9kZSwgYm9vbGVhbiBtcHR5LCBTdHJpbmcgbnVtYmVyLCBpbnQgdHlwZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFfSkiKQotICAgIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIEJsdWV0b290aERldmljZSBnZXRBY3RpdmVEZXZpY2UoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc0luYmFuZFJpbmdpbmdFbmFibGVkKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURX0pIikKLSAgICBib29sZWFuIHNldFByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0UHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGlzTm9pc2VSZWR1Y3Rpb25TdXBwb3J0ZWQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc1ZvaWNlUmVjb2duaXRpb25TdXBwb3J0ZWQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0Q2xpZW50LmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXRDbGllbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyMzU5MC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXRDbGllbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldENsaWVudENhbGw7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIEFQSSBmb3IgQmx1ZXRvb3RoIEhlYWRzZXQgQ2xpZW50IHNlcnZpY2UgKEhGUCBIRiBSb2xlKQotICoKLSAqIHtAaGlkZX0KLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhIZWFkc2V0Q2xpZW50IHsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbiBpbnRbXSBzdGF0ZXMsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc3RhcnRWb2ljZVJlY29nbml0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc3RvcFZvaWNlUmVjb2duaXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aEhlYWRzZXRDbGllbnRDYWxsPiBnZXRDdXJyZW50Q2FsbHMoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgQnVuZGxlIGdldEN1cnJlbnRBZ0V2ZW50cyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gYWNjZXB0Q2FsbChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgZmxhZywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBob2xkQ2FsbChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHJlamVjdENhbGwoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiB0ZXJtaW5hdGVDYWxsKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEJsdWV0b290aEhlYWRzZXRDbGllbnRDYWxsIGNhbGwsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBlbnRlclByaXZhdGVNb2RlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBpbmRleCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBleHBsaWNpdENhbGxUcmFuc2ZlcihpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIEJsdWV0b290aEhlYWRzZXRDbGllbnRDYWxsIGRpYWwoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgU3RyaW5nIG51bWJlciwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNlbmREVE1GKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJ5dGUgY29kZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBnZXRMYXN0Vm9pY2VUYWdOdW1iZXIoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0QXVkaW9TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGNvbm5lY3RBdWRpbyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGRpc2Nvbm5lY3RBdWRpbyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICB2b2lkIHNldEF1ZGlvUm91dGVBbGxvd2VkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gYWxsb3dlZCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBnZXRBdWRpb1JvdXRlQWxsb3dlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNlbmRWZW5kb3JBdENvbW1hbmQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHZlbmRvcklkLCBTdHJpbmcgYXRDb21tYW5kLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIEJ1bmRsZSBnZXRDdXJyZW50QWdGZWF0dXJlcyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYXJpbmdBaWQuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhcmluZ0FpZC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFlM2VlLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhcmluZ0FpZC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2U7Ci0KLS8qKgotICogQVBJcyBmb3IgQmx1ZXRvb3RoIEhlYXJpbmcgQWlkIHNlcnZpY2UKLSAqCi0gKiBAaGlkZQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aEhlYXJpbmdBaWQgewotICAgIC8vIFB1YmxpYyBBUEkKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRBY3RpdmVEZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29ubmVjdGlvblBvbGljeSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXRWb2x1bWUoaW50IHZvbHVtZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgY29uc3QgaW50IEhJX1NZTkNfSURfSU5WQUxJRCA9IDA7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBsb25nIGdldEhpU3luY0lkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIGNvbnN0IGludCBTSURFX0xFRlQgPSAwOwotICAgIGNvbnN0IGludCBTSURFX1JJR0hUID0gMTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXREZXZpY2VTaWRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIGNvbnN0IGludCBNT0RFX01PTkFVUkFMID0gMDsKLSAgICBjb25zdCBpbnQgTU9ERV9CSU5BVVJBTCA9IDE7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0RGV2aWNlTW9kZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhpZERldmljZS5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIaWREZXZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZDFlNi4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhpZERldmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGlkRGV2aWNlQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGlkRGV2aWNlQXBwU2RwU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGlkRGV2aWNlQXBwUW9zU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoSGlkRGV2aWNlIHsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gcmVnaXN0ZXJBcHAoaW4gQmx1ZXRvb3RoSGlkRGV2aWNlQXBwU2RwU2V0dGluZ3Mgc2RwLCBpbiBCbHVldG9vdGhIaWREZXZpY2VBcHBRb3NTZXR0aW5ncyBpblFvcywgaW4gQmx1ZXRvb3RoSGlkRGV2aWNlQXBwUW9zU2V0dGluZ3Mgb3V0UW9zLCBpbiBJQmx1ZXRvb3RoSGlkRGV2aWNlQ2FsbGJhY2sgY2FsbGJhY2ssIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gdW5yZWdpc3RlckFwcChpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNlbmRSZXBvcnQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gaW50IGlkLCBpbiBieXRlW10gZGF0YSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiByZXBseVJlcG9ydChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBieXRlIHR5cGUsIGluIGJ5dGUgaWQsIGluIGJ5dGVbXSBkYXRhLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHJlcG9ydEVycm9yKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJ5dGUgZXJyb3IsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gdW5wbHVnKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIFN0cmluZyBnZXRVc2VyQXBwTmFtZShpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3ksIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGlkRGV2aWNlQ2FsbGJhY2suYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGlkRGV2aWNlQ2FsbGJhY2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwNWM2Ny4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhpZERldmljZUNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLQotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSUJsdWV0b290aEhpZERldmljZUNhbGxiYWNrIHsKLSAgIHZvaWQgb25BcHBTdGF0dXNDaGFuZ2VkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gcmVnaXN0ZXJlZCk7Ci0gICB2b2lkIG9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBpbnQgc3RhdGUpOwotICAgdm9pZCBvbkdldFJlcG9ydChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBieXRlIHR5cGUsIGluIGJ5dGUgaWQsIGluIGludCBidWZmZXJTaXplKTsKLSAgIHZvaWQgb25TZXRSZXBvcnQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gYnl0ZSB0eXBlLCBpbiBieXRlIGlkLCBpbiBieXRlW10gZGF0YSk7Ci0gICB2b2lkIG9uU2V0UHJvdG9jb2woaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gYnl0ZSBwcm90b2NvbCk7Ci0gICB2b2lkIG9uSW50ZXJydXB0RGF0YShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBieXRlIHJlcG9ydElkLCBpbiBieXRlW10gZGF0YSk7Ci0gICB2b2lkIG9uVmlydHVhbENhYmxlVW5wbHVnKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIaWRIb3N0LmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhpZEhvc3QuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmYmQ2MC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhpZEhvc3QuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIEFQSSBmb3IgQmx1ZXRvb3RoIEhJRCBzZXJ2aWNlCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aEhpZEhvc3QgewotICAgIC8vIFB1YmxpYyBBUEkKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gc2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29ubmVjdGlvblBvbGljeSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBnZXRQcm90b2NvbE1vZGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiB2aXJ0dWFsVW5wbHVnKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2V0UHJvdG9jb2xNb2RlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcm90b2NvbE1vZGUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZ2V0UmVwb3J0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJ5dGUgcmVwb3J0VHlwZSwgYnl0ZSByZXBvcnRJZCwgaW50IGJ1ZmZlclNpemUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2V0UmVwb3J0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJ5dGUgcmVwb3J0VHlwZSwgU3RyaW5nIHJlcG9ydCwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBzZW5kRGF0YShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBTdHJpbmcgcmVwb3J0LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGdldElkbGVUaW1lKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gc2V0SWRsZVRpbWUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYnl0ZSBpZGxlVGltZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZUF1ZGlvLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlQXVkaW8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNThlMy4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlQXVkaW8uYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIEFQSXMgZm9yIEJsdWV0b290aCBMRSBBdWRpbyBzZXJ2aWNlCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhMZUF1ZGlvIHsKLSAgICAvLyBQdWJsaWMgQVBJCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGNvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIHNldEFjdGl2ZURldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0QWN0aXZlRGV2aWNlcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3ksIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIC8qIFNhbWUgdmFsdWUgYXMgYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24gKi8KLSAgICBjb25zdCBpbnQgTEVfQVVESU9fR1JPVVBfSURfSU5WQUxJRCA9IC0xOwotCi0gICAgY29uc3QgaW50IEdST1VQX1NUQVRVU19JTkFDVElWRSA9IDA7Ci0gICAgY29uc3QgaW50IEdST1VQX1NUQVRVU19BQ1RJVkUgPSAxOwotCi0gICAgY29uc3QgaW50IEdST1VQX05PREVfQURERUQgPSAxOwotICAgIGNvbnN0IGludCBHUk9VUF9OT0RFX1JFTU9WRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogR2V0IGRldmljZSBncm91cCBpZC4gRGV2aWNlcyB3aXRoIHNhbWUgZ3JvdXAgaWQgYmVsb25nIHRvIHNhbWUgZ3JvdXAgKGkuZSBsZWZ0IGFuZCByaWdodAotICAgICAqIGVhcmJ1ZCkKLSAgICAgKi8KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRHcm91cElkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIHZvaWQgc2V0Vm9sdW1lKGludCB2b2x1bWUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gZ3JvdXBBZGROb2RlKGludCBncm91cF9pZCwgaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBncm91cFJlbW92ZU5vZGUoaW50IGdyb3VwX2lkLCBpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1hbmFnZXIuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTWFuYWdlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGNjMjA0Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTWFuYWdlci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGg7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEdhdHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhTdGF0ZUNoYW5nZUNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLQotLyoqCi0gKiBTeXN0ZW0gcHJpdmF0ZSBBUEkgZm9yIHRhbGtpbmcgd2l0aCB0aGUgQmx1ZXRvb3RoIHNlcnZpY2UuCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aE1hbmFnZXIKLXsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIElCbHVldG9vdGggcmVnaXN0ZXJBZGFwdGVyKGluIElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgdm9pZCB1bnJlZ2lzdGVyQWRhcHRlcihpbiBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIHZvaWQgcmVnaXN0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrKGluIElCbHVldG9vdGhTdGF0ZUNoYW5nZUNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIHZvaWQgdW5yZWdpc3RlclN0YXRlQ2hhbmdlQ2FsbGJhY2soaW4gSUJsdWV0b290aFN0YXRlQ2hhbmdlQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBlbmFibGUoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBlbmFibGVOb0F1dG9Db25uZWN0KGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZGlzYWJsZShpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSwgYm9vbGVhbiBwZXJzaXN0KTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGludCBnZXRTdGF0ZSgpOwotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBJQmx1ZXRvb3RoR2F0dCBnZXRCbHVldG9vdGhHYXR0KCk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIGJvb2xlYW4gYmluZEJsdWV0b290aFByb2ZpbGVTZXJ2aWNlKGludCBwcm9maWxlLCBJQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VDb25uZWN0aW9uIHByb3h5KTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNOb1Blcm1pc3Npb24iKQotICAgIHZvaWQgdW5iaW5kQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2UoaW50IHByb2ZpbGUsIElCbHVldG9vdGhQcm9maWxlU2VydmljZUNvbm5lY3Rpb24gcHJveHkpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5MT0NBTF9NQUNfQUREUkVTU30pIikKLSAgICBTdHJpbmcgZ2V0QWRkcmVzcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBTdHJpbmcgZ2V0TmFtZShpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0KLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gb25GYWN0b3J5UmVzZXQoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBib29sZWFuIGlzQmxlU2NhbkFsd2F5c0F2YWlsYWJsZSgpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBlbmFibGVCbGUoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsIElCaW5kZXIgYik7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGRpc2FibGVCbGUoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsIElCaW5kZXIgYik7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uIikKLSAgICBib29sZWFuIGlzQmxlQXBwUHJlc2VudCgpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgYm9vbGVhbiBpc0hlYXJpbmdBaWRQcm9maWxlU3VwcG9ydGVkKCk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjay5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhZDJhMC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGg7Ci0KLS8qKgotICogQVBJIGZvciBDb21tdW5pY2F0aW9uIGJldHdlZW4gQmx1ZXRvb3RoQWRhcHRlciBhbmQgQmx1ZXRvb3RoTWFuYWdlcgotICoKLSAqIHtAaGlkZX0KLSAqLwotb25ld2F5IGludGVyZmFjZSBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrIHsKLSAgICB2b2lkIG9uQmx1ZXRvb3RoU2VydmljZVVwKGluIElCbHVldG9vdGggYmx1ZXRvb3RoU2VydmljZSk7Ci0gICAgdm9pZCBvbkJsdWV0b290aFNlcnZpY2VEb3duKCk7Ci0gICAgdm9pZCBvbkJyRWRyRG93bigpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNYXAuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTWFwLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjIwMDUuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNYXAuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIFN5c3RlbSBwcml2YXRlIEFQSSBmb3IgQmx1ZXRvb3RoIE1BUCBzZXJ2aWNlCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aE1hcCB7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0U3RhdGUoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgQmx1ZXRvb3RoRGV2aWNlIGdldENsaWVudChpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBpc0Nvbm5lY3RlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbiBpbnRbXSBzdGF0ZXMsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1hcENsaWVudC5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNYXBDbGllbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhYTJjNC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE1hcENsaWVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci0KLS8qKgotICogU3lzdGVtIHByaXZhdGUgQVBJIGZvciBCbHVldG9vdGggTUFQIE1DRSBzZXJ2aWNlCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aE1hcENsaWVudCB7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQgfSkiKQotICAgIGJvb2xlYW4gY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQgfSkiKQotICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGlzQ29ubmVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQgfSkiKQotICAgIGJvb2xlYW4gc2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLGluIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQgfSkiKQotICAgIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0geyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRU5EX1NNUyB9KSIpCi0gICAgYm9vbGVhbiBzZW5kTWVzc2FnZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBVcmlbXSBjb250YWN0cywgaW4gIFN0cmluZyBtZXNzYWdlLCBpbiBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIGluIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0geyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NNUyB9KSIpCi0gICAgYm9vbGVhbiBnZXRVbnJlYWRNZXNzYWdlcyhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBpbnQgZ2V0U3VwcG9ydGVkRmVhdHVyZXMoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2YgPSB7IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfU01TIH0pIikKLSAgICBib29sZWFuIHNldE1lc3NhZ2VTdGF0dXMoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gU3RyaW5nIGhhbmRsZSwgaW4gaW50IHN0YXR1cywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNY3BTZXJ2aWNlTWFuYWdlci5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNY3BTZXJ2aWNlTWFuYWdlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNlZGYwLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTWNwU2VydmljZU1hbmFnZXIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIE1lZGlhIENvbnRyb2wgUHJvZmlsZSBzZXJ2aWNlIG1hbmFnZXIKLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoTWNwU2VydmljZU1hbmFnZXIKLXsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRCkiKQotICAgIHZvaWQgc2V0RGV2aWNlQXV0aG9yaXplZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIGlzQXV0aG9yaXplZCwgaW4gQXR0cmlidXRpb25Tb3VyY2Ugc291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTWV0YWRhdGFMaXN0ZW5lci5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNZXRhZGF0YUxpc3RlbmVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODkxOWYuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhNZXRhZGF0YUxpc3RlbmVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLQotLyoqCi0gKiBDYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBkYXRhYmFzZSBjaGFuZ2UKLSAqIEBoaWRlCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aE1ldGFkYXRhTGlzdGVuZXIgewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlcywgaW4gaW50IGtleSwgaW4gYnl0ZVtdIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoT29iRGF0YUNhbGxiYWNrLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aE9vYkRhdGFDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk3NWI2Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoT29iRGF0YUNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5Pb2JEYXRhOwotCi0vKioKLSAqIEFQSSBmb3IgcmVjZWl2aW5nIE9vYkRhdGEgZnJvbSB0aGUgaG9zdCBzdGFjawotICoKLSAqIHtAaGlkZX0KLSAqLwotb25ld2F5IGludGVyZmFjZSBJQmx1ZXRvb3RoT29iRGF0YUNhbGxiYWNrIHsKLSAgICB2b2lkIG9uT29iRGF0YShpbnQgdHJhbnNwb3J0LCBpbiBPb2JEYXRhIG9vYkRhdGEpOwotICAgIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGFuLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFBhbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWU2NjRlLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGFuLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLQotLyoqCi0gKiBBUEkgZm9yIEJsdWV0b290aCBQYW4gc2VydmljZQotICoKLSAqIHtAaGlkZX0KLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhQYW4gewotICAgIC8vIFB1YmxpYyBBUEkKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gaXNUZXRoZXJpbmdPbihpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVEVUSEVSX1BSSVZJTEVHRUR9KSIpCi0gICAgdm9pZCBzZXRCbHVldG9vdGhUZXRoZXJpbmcoYm9vbGVhbiB2YWx1ZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbiBpbnRbXSBzdGF0ZXMsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFBiYXAuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRmMzM0Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2U7Ci0KLS8qKgotICogU3lzdGVtIHByaXZhdGUgQVBJIGZvciBCbHVldG9vdGggcGJhcCBzZXJ2aWNlCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aFBiYXAgewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3ksIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcENsaWVudC5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhQYmFwQ2xpZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTJlNDQuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhQYmFwQ2xpZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLQotLyoqCi0gKiBBUEkgZm9yIEJsdWV0b290aCBQaG9uZSBCb29rIEFjY2VzcyBQcm92aWxlIENsaWVudCBTaWRlCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aFBiYXBDbGllbnQgewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcyhpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbiBpbnRbXSBzdGF0ZXMsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCxhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUR9KSIpCi0gICAgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5LCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBpbnQgZ2V0Q29ubmVjdGlvblBvbGljeShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlQ29ubmVjdGlvbi5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhQcm9maWxlU2VydmljZUNvbm5lY3Rpb24uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNDhjZi4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlQ29ubmVjdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLQotLyoqCi0gKiBDYWxsYmFjayBmb3IgYmx1ZXRvb3RoIHByb2ZpbGUgY29ubmVjdGlvbnMuCi0gKgotICoge0BoaWRlfQotICovCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhQcm9maWxlU2VydmljZUNvbm5lY3Rpb24gewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW4gQ29tcG9uZW50TmFtZSBjb21wLCBpbiBJQmluZGVyIHNlcnZpY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc05vUGVybWlzc2lvbiIpCi0gICAgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW4gQ29tcG9uZW50TmFtZSBjb21wKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoU2FwLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFNhcC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc0MDNlLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoU2FwLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZTsKLQotLyoqCi0gKiBTeXN0ZW0gcHJpdmF0ZSBBUEkgZm9yIEJsdWV0b290aCBTQVAgc2VydmljZQotICoKLSAqIHtAaGlkZX0KLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhTYXAgewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldFN0YXRlKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIEJsdWV0b290aERldmljZSBnZXRDbGllbnQoaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGlzQ29ubmVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3ksIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoU29ja2V0TWFuYWdlci5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhTb2NrZXRNYW5hZ2VyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTViNDIuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhTb2NrZXRNYW5hZ2VyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotCi0vKioKLSAqIEFQSSBmb3IgQmx1ZXRvb3RoIFNvY2tldHMgc2VydmljZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoU29ja2V0TWFuYWdlcgotewotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgQG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGNvbm5lY3RTb2NrZXQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHR5cGUsIGluIEBudWxsYWJsZSBQYXJjZWxVdWlkIHV1aWQsIGludCBwb3J0LCBpbnQgZmxhZyk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBAbnVsbGFibGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgY3JlYXRlU29ja2V0Q2hhbm5lbChpbnQgdHlwZSwgaW4gQG51bGxhYmxlIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW4gQG51bGxhYmxlIFBhcmNlbFV1aWQgdXVpZCwgaW50IHBvcnQsIGludCBmbGFnKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIHZvaWQgcmVxdWVzdE1heGltdW1UeERhdGFMZW5ndGgoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFN0YXRlQ2hhbmdlQ2FsbGJhY2suYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoU3RhdGVDaGFuZ2VDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE2ODAxLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoU3RhdGVDaGFuZ2VDYWxsYmFjay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotLyoqCi0gKiBTeXN0ZW0gcHJpdmF0ZSBBUEkgZm9yIEJsdWV0b290aCBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2suCi0gKgotICoge0BoaWRlfQotICovCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhTdGF0ZUNoYW5nZUNhbGxiYWNrCi17Ci0gICAgdm9pZCBvbkJsdWV0b290aFN0YXRlQ2hhbmdlKGJvb2xlYW4gb24pOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhWb2x1bWVDb250cm9sLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFZvbHVtZUNvbnRyb2wuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MGJmMC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFZvbHVtZUNvbnRyb2wuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotCi0vKioKLSAqIEFQSXMgZm9yIEJsdWV0b290aCBWb2x1bWUgQ29udHJvbCBzZXJ2aWNlCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhWb2x1bWVDb250cm9sIHsKLSAgICAvKiBQdWJsaWMgQVBJICovCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QpIikKLSAgICBib29sZWFuIGNvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVCkiKQotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcywgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbiBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNULGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRH0pIikKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3ksIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1QsYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9QUklWSUxFR0VEfSkiKQotICAgIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXRWb2x1bWUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHZvbHVtZSwgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUKSIpCi0gICAgdm9pZCBzZXRWb2x1bWVHcm91cChpbnQgZ3JvdXBfaWQsIGludCB2b2x1bWUsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9Pb2JEYXRhLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvT29iRGF0YS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjllMGIwLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9Pb2JEYXRhLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIE9vYkRhdGE7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2RldmljZS5jYyBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ3Y2Y5Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9kZXZpY2UuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RhdHVzX3QgQmx1ZXRvb3RoRGV2aWNlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSkpOwotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBCbHVldG9vdGhEZXZpY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIFN0cmluZzE2IHRtcDsKLQotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKFN0cmluZzgodG1wKS5zdHJpbmcoKSwgYWRkcmVzcyk7Ci0gIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZGV2aWNlLmggYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWJjMDBhLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEJsdWV0b290aERldmljZSA6IHB1YmxpYyBhbmRyb2lkOjpQYXJjZWxhYmxlIHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aERldmljZSgpID0gZGVmYXVsdDsKLSAgfkJsdWV0b290aERldmljZSgpID0gZGVmYXVsdDsKLQotICAvLyBXcml0ZSB8dGhpc3wgcGFyY2VsYWJsZSB0byB0aGUgZ2l2ZW4gfHBhcmNlbHwuICBLZWVwIGluIG1pbmQgdGhhdAotICAvLyBpbXBsZW1lbnRhdGlvbnMgb2Ygd3JpdGVUb1BhcmNlbCBtdXN0IGJlIG1hbnVhbGx5IGtlcHQgaW4gc3luYwotICAvLyB3aXRoIHJlYWRGcm9tUGFyY2VsIGFuZCB0aGUgSmF2YSBlcXVpdmFsZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBhbmRyb2lkOjpzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBSZWFkIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gfHBhcmNlbHwgaW50byB8dGhpc3wuICBBZnRlciByZWFkRnJvbVBhcmNlbAotICAvLyBjb21wbGV0ZXMsIHx0aGlzfCBzaG91bGQgaGF2ZSBlcXVpdmFsZW50IHN0YXRlIHRvIHRoZSBvYmplY3QgdGhhdAotICAvLyB3cm90ZSBpdHNlbGYgdG8gdGhlIHBhcmNlbC4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIGFuZHJvaWQ6OnN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQotICBSYXdBZGRyZXNzIGFkZHJlc3M7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0FkdmVydGlzZURhdGEuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9BZHZlcnRpc2VEYXRhLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMzYzNWQuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0FkdmVydGlzZURhdGEuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGgubGU7Ci0KLXBhcmNlbGFibGUgQWR2ZXJ0aXNlRGF0YTsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9BZHZlcnRpc2VTZXR0aW5ncy5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0FkdmVydGlzZVNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzdlNzUuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0FkdmVydGlzZVNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoLmxlOwotCi1wYXJjZWxhYmxlIEFkdmVydGlzZVNldHRpbmdzOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9BZHZlcnRpc2luZ1NldFBhcmFtZXRlcnMuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9BZHZlcnRpc2luZ1NldFBhcmFtZXRlcnMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxODg2NC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvQWR2ZXJ0aXNpbmdTZXRQYXJhbWV0ZXJzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoLmxlOwotCi1wYXJjZWxhYmxlIEFkdmVydGlzaW5nU2V0UGFyYW1ldGVyczsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9JQWR2ZXJ0aXNpbmdTZXRDYWxsYmFjay5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0lBZHZlcnRpc2luZ1NldENhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzI0MWMuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0lBZHZlcnRpc2luZ1NldENhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aC5sZTsKLQotLyoqCi0gKiBDYWxsYmFjayBkZWZpbml0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBBZHZlcnRpc2VyCi0gKiBAaGlkZQotICovCi1vbmV3YXkgaW50ZXJmYWNlIElBZHZlcnRpc2luZ1NldENhbGxiYWNrIHsKLSAgdm9pZCBvbkFkdmVydGlzaW5nU2V0U3RhcnRlZChpbiBpbnQgYWR2ZXJ0aXNlcklkLCBpbiBpbnQgdHhfcG93ZXIsIGluIGludCBzdGF0dXMpOwotICB2b2lkIG9uT3duQWRkcmVzc1JlYWQoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gaW50IGFkZHJlc3NUeXBlLCBpbiBTdHJpbmcgYWRkcmVzcyk7Ci0gIHZvaWQgb25BZHZlcnRpc2luZ1NldFN0b3BwZWQoaW4gaW50IGFkdmVydGlzZXJJZCk7Ci0gIHZvaWQgb25BZHZlcnRpc2luZ0VuYWJsZWQoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gYm9vbGVhbiBlbmFibGUsIGluIGludCBzdGF0dXMpOwotICB2b2lkIG9uQWR2ZXJ0aXNpbmdEYXRhU2V0KGluIGludCBhZHZlcnRpc2VySWQsIGluIGludCBzdGF0dXMpOwotICB2b2lkIG9uU2NhblJlc3BvbnNlRGF0YVNldChpbiBpbnQgYWR2ZXJ0aXNlcklkLCBpbiBpbnQgc3RhdHVzKTsKLSAgdm9pZCBvbkFkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gaW50IHR4X3Bvd2VyLCBpbiBpbnQgc3RhdHVzKTsKLSAgdm9pZCBvblBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZChpbiBpbnQgYWR2ZXJ0aXNlcklkLCBpbiBpbnQgc3RhdHVzKTsKLSAgdm9pZCBvblBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhU2V0KGluIGludCBhZHZlcnRpc2VySWQsIGluIGludCBzdGF0dXMpOwotICB2b2lkIG9uUGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZWQoaW4gaW50IGFkdmVydGlzZXJJZCwgaW4gYm9vbGVhbiBlbmFibGUsIGluIGludCBzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0lQZXJpb2RpY0FkdmVydGlzaW5nQ2FsbGJhY2suYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9JUGVyaW9kaWNBZHZlcnRpc2luZ0NhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YmJjMTQuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL0lQZXJpb2RpY0FkdmVydGlzaW5nQ2FsbGJhY2suYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoLmxlOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlBlcmlvZGljQWR2ZXJ0aXNpbmdSZXBvcnQ7Ci0KLS8qKgotICogQ2FsbGJhY2sgZGVmaW5pdGlvbnMgZm9yIGludGVyYWN0aW5nIHdpdGggUGVyaW9kaWMgQWR2ZXJ0aXNpbmcKLSAqIEBoaWRlCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSVBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjayB7Ci0KLSAgdm9pZCBvblN5bmNFc3RhYmxpc2hlZChpbiBpbnQgc3luY0hhbmRsZSwgaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW4gaW50IGFkdmVydGlzaW5nU2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBza2lwLCBpbiBpbnQgdGltZW91dCwgaW4gaW50IHN0YXR1cyk7Ci0gIHZvaWQgb25QZXJpb2RpY0FkdmVydGlzaW5nUmVwb3J0KGluIFBlcmlvZGljQWR2ZXJ0aXNpbmdSZXBvcnQgcmVwb3J0KTsKLSAgdm9pZCBvblN5bmNMb3N0KGluIGludCBzeW5jSGFuZGxlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9JU2Nhbm5lckNhbGxiYWNrLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvSVNjYW5uZXJDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVlN2ZmLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9JU2Nhbm5lckNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aC5sZTsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5SZXN1bHQ7Ci0KLS8qKgotICogQ2FsbGJhY2sgZGVmaW5pdGlvbnMgZm9yIGludGVyYWN0aW5nIHdpdGggQWR2ZXJ0aXNlcgotICogQGhpZGUKLSAqLwotb25ld2F5IGludGVyZmFjZSBJU2Nhbm5lckNhbGxiYWNrIHsKLSAgICB2b2lkIG9uU2Nhbm5lclJlZ2lzdGVyZWQoaW4gaW50IHN0YXR1cywgaW4gaW50IHNjYW5uZXJJZCk7Ci0KLSAgICB2b2lkIG9uU2NhblJlc3VsdChpbiBTY2FuUmVzdWx0IHNjYW5SZXN1bHQpOwotICAgIHZvaWQgb25CYXRjaFNjYW5SZXN1bHRzKGluIExpc3Q8U2NhblJlc3VsdD4gYmF0Y2hSZXN1bHRzKTsKLSAgICB2b2lkIG9uRm91bmRPckxvc3QoaW4gYm9vbGVhbiBvbkZvdW5kLCBpbiBTY2FuUmVzdWx0IHNjYW5SZXN1bHQpOwotICAgIHZvaWQgb25TY2FuTWFuYWdlckVycm9yQ2FsbGJhY2soaW4gaW50IGVycm9yQ29kZSk7Ci19CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9QZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjcxNGYwLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9QZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aC5sZTsKLQotcGFyY2VsYWJsZSBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVyczsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9QZXJpb2RpY0FkdmVydGlzaW5nUmVwb3J0LmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvUGVyaW9kaWNBZHZlcnRpc2luZ1JlcG9ydC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODZhYzYxLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9QZXJpb2RpY0FkdmVydGlzaW5nUmVwb3J0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoLmxlOwotCi1wYXJjZWxhYmxlIFBlcmlvZGljQWR2ZXJ0aXNpbmdSZXBvcnQ7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvUmVzdWx0U3RvcmFnZURlc2NyaXB0b3IuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9SZXN1bHRTdG9yYWdlRGVzY3JpcHRvci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmMxYjQxLi4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9SZXN1bHRTdG9yYWdlRGVzY3JpcHRvci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aC5sZTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLQotcGFyY2VsYWJsZSBSZXN1bHRTdG9yYWdlRGVzY3JpcHRvcjsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9TY2FuRmlsdGVyLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvU2NhbkZpbHRlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ViZDg1Li4wMDAwMDAwCi0tLSBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9TY2FuRmlsdGVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoLmxlOwotCi1wYXJjZWxhYmxlIFNjYW5GaWx0ZXI7CmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvU2NhblJlc3VsdC5haWRsIGIvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL1NjYW5SZXN1bHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2ZGMxOC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvU2NhblJlc3VsdC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aC5sZTsKLQotcGFyY2VsYWJsZSBTY2FuUmVzdWx0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9TY2FuU2V0dGluZ3MuYWlkbCBiL2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9sZS9TY2FuU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0ZTA3OC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvbGUvU2NhblNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoLmxlOwotCi1wYXJjZWxhYmxlIFNjYW5TZXR0aW5nczsKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL29zL3BhcmNlbF91dWlkLmNjIGIvYmluZGVyL2FuZHJvaWQvb3MvcGFyY2VsX3V1aWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTcxMDQuLjAwMDAwMDAKLS0tIGEvYmluZGVyL2FuZHJvaWQvb3MvcGFyY2VsX3V1aWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYW5kcm9pZC9vcy9wYXJjZWxfdXVpZC5oIgotCi11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgOjpibHVldG9vdGg6OlV1aWQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLW5hbWVzcGFjZSB7Ci1zdGF0aWMgdWludDY0X3QgdXVpZF9sc2IoY29uc3QgVXVpZCYgdXVpZCkgewotICB1aW50NjRfdCBsc2IgPSAwOwotCi0gIGF1dG8gdXUgPSB1dWlkLlRvMTI4Qml0QkUoKTsKLSAgZm9yIChpbnQgaSA9IDg7IGkgPD0gMTU7IGkrKykgewotICAgIGxzYiA8PD0gODsKLSAgICBsc2IgfD0gdXVbaV07Ci0gIH0KLQotICByZXR1cm4gbHNiOwotfQotCi1zdGF0aWMgdWludDY0X3QgdXVpZF9tc2IoY29uc3QgVXVpZCYgdXVpZCkgewotICB1aW50NjRfdCBtc2IgPSAwOwotCi0gIGF1dG8gdXUgPSB1dWlkLlRvMTI4Qml0QkUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPD0gNzsgaSsrKSB7Ci0gICAgbXNiIDw8PSA4OwotICAgIG1zYiB8PSB1dVtpXTsKLSAgfQotCi0gIHJldHVybiBtc2I7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotc3RhdHVzX3QgUGFyY2VsVXVpZDo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50NjQodXVpZF9tc2IodXVpZCkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQ2NCh1dWlkX2xzYih1dWlkKSk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFBhcmNlbFV1aWQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDY0X3QgdXVpZF9tc2IsIHV1aWRfbHNiOwotCi0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDY0KCZ1dWlkX21zYik7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50NjQoJnV1aWRfbHNiKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIFV1aWQ6OmtOdW1CeXRlczEyOD4gdXU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgdXVbNyAtIGldID0gKHV1aWRfbXNiID4+ICg4ICogaSkpICYgMHhGRjsKLSAgICB1dVsxNSAtIGldID0gKHV1aWRfbHNiID4+ICg4ICogaSkpICYgMHhGRjsKLSAgfQotCi0gIHV1aWQgPSBVdWlkOjpGcm9tMTI4Qml0QkUodXUpOwotICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW5kZXIvYW5kcm9pZC9vcy9wYXJjZWxfdXVpZC5oIGIvYmluZGVyL2FuZHJvaWQvb3MvcGFyY2VsX3V1aWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZjljNC4uMDAwMDAwMAotLS0gYS9iaW5kZXIvYW5kcm9pZC9vcy9wYXJjZWxfdXVpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1jbGFzcyBQYXJjZWxVdWlkIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgewotIHB1YmxpYzoKLSAgUGFyY2VsVXVpZCgpID0gZGVmYXVsdDsKLSAgflBhcmNlbFV1aWQoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgYW5kcm9pZDo6c3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBhbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KLSAgOjpibHVldG9vdGg6OlV1aWQgdXVpZDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS9jb250cm9sbGVycy9hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2UucHkgYi9ibHVlYmVycnkvY29udHJvbGxlcnMvYW5kcm9pZF9idF90YXJnZXRfZGV2aWNlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTdhZWJmLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS9jb250cm9sbGVycy9hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotIiIiQ29udHJvbGxlciBjbGFzcyBmb3IgYW4gYW5kcm9pZCBidCBkZXZpY2Ugd2l0aCBnaXRfbWFzdGVyLWJkcy1kZXYgYnVpbGQuCi0KLVRoZSBjb25maWcgZm9yIHRoaXMgZGVyaXZlZF9idF90YXJnZXRfZGV2aWNlIGluIG1vYmlsZWhhcm5lc3MgaXM6Ci0tIG5hbWU6IGFuZHJvaWRfYnRfdGFyZ2V0X2RldmljZQotICBkZXZpY2VzOgotICAtIHR5cGU6IE1pc2NUZXN0YmVkU3ViRGV2aWNlCi0gICAgZGltZW5zaW9uczoKLSAgICAgIG1vYmx5X3R5cGU6IERlcml2ZWRCdERldmljZQotICAgIHByb3BlcnRpZXM6Ci0gICAgICBNb2R1bGVOYW1lOiBhbmRyb2lkX2J0X3RhcmdldF9kZXZpY2UKLSAgICAgIENsYXNzTmFtZTogQW5kcm9pZEJ0VGFyZ2V0RGV2aWNlCi0gICAgICBQYXJhbXM6Ci0gICAgICAgIGNvbmZpZzoKLSAgICAgICAgICBkZXZpY2VfaWQ6IHBob25lX3NlcmlhbF9udW1iZXIKLSAgICAgICAgICBhdWRpb19wYXJhbXM6Ci0gICAgICAgICAgICBjaGFubmVsOiAyCi0gICAgICAgICAgICBkdXJhdGlvbjogNTAKLSAgICAgICAgICAgIG11c2ljX2ZpbGU6ICJtdXNpYy53YXYiCi0gICAgICAgICAgICBzYW1wbGVfcmF0ZTogNDQxMDAKLSIiIgotCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1pbXBvcnQgdGltZQotCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzCi1mcm9tIG1vYmx5LmNvbnRyb2xsZXJzLmFuZHJvaWRfZGV2aWNlIGltcG9ydCBBbmRyb2lkRGV2aWNlCi1mcm9tIG1vYmx5LnNpZ25hbHMgaW1wb3J0IENvbnRyb2xsZXJFcnJvcgotIyBJbnRlcm5hbCBpbXBvcnQKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF9jb25zdGFudHMKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzLmFuZHJvaWRfYmx1ZXRvb3RoX2RlY29yYXRvciBpbXBvcnQgQW5kcm9pZEJsdWV0b290aERlY29yYXRvcgotaW1wb3J0IGJsdWViZXJyeS51dGlscy5idF90ZXN0X3V0aWxzIGFzIGJ0dXRpbHMKLQotQURCX0ZJTEUgPSAicmVjLnBjbSIKLUFEQl9QQVRIID0gIi9zZGNhcmQvTXVzaWMvIgotV0FWRV9GSUxFX1RFTVBMQVRFID0gInJlY29yZGVkX2F1ZGlvXyVzLndhdiIKLURFRkFVTFRfV0FJVF9USU1FID0gMy4wCi0KLSMgQSBNZWRpYUJyb3dzZXJTZXJ2aWNlIGltcGxlbWVudGVkIGluIHRoZSBTTDRBIGFwcCB0byBpbnRlcmNlcHQgTWVkaWEga2V5cyBhbmQKLSMgY29tbWFuZHMuCi1CTFVFVE9PVEhfU0w0QV9BVURJT19TUkNfTUJTID0gIkJsdWV0b290aFNMNEFBdWRpb1NyY01CUyIKLQotQTJEUF9IRlBfUFJPRklMRVMgPSBbCi0gICAgYnRfY29uc3RhbnRzLkJsdWV0b290aFByb2ZpbGUuQTJEUF9TSU5LLAotICAgIGJ0X2NvbnN0YW50cy5CbHVldG9vdGhQcm9maWxlLkhFQURTRVRfQ0xJRU5UCi1dCi0KLQotY2xhc3MgQW5kcm9pZEJ0VGFyZ2V0RGV2aWNlKG9iamVjdCk6Ci0gICIiIkltcGxlbWVudHMgYW4gYW5kcm9pZCBkZXZpY2UgYXMgYSBoZnAgYW5kIGEyZHAgc2luayBkZXZpY2UuCi0KLSAgV2l0aCBnaXRfbWFzdGVyLWJkcy1kZXYgYnVpbGQsIHRoZSBhbmRyb2lkIGRldmljZSBjYW4gYWN0IGFzIGEgYmx1ZXRvb3RoCi0gIGhmcCBhbmQgYTJkcCBzaW5rIGRldmljZS4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZyk6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgYW4gYW5kcm9pZCBoZnAgZGV2aWNlLiIiIgotICAgIGxvZ2dpbmcuaW5mbygiSW5pdGlhbGl6ZXMgdGhlIGFuZHJvaWQgaGZwIGRldmljZSIpCi0gICAgc2VsZi5wcmlfYWQgPSBOb25lCi0gICAgc2VsZi5zZWNfYWQgPSBOb25lCi0gICAgc2VsZi5zZXJpYWwgPSBjb25maWcuZ2V0KCJkZXZpY2VfaWQiLCBOb25lKQotICAgIHNlbGYuYXVkaW9fcGFyYW1zID0gY29uZmlnLmdldCgiYXVkaW9fcGFyYW1zIiwgTm9uZSkKLQotICAgIGlmIHNlbGYuc2VyaWFsOgotICAgICAgIyBzZWxmLl9hZCBmb3IgYWNjZXNzaW5nIHRoZSBkZXZpY2UgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdAotICAgICAgc2VsZi5fYWQgPSBBbmRyb2lkRGV2aWNlKHNlbGYuc2VyaWFsKQotICAgICAgc2VsZi5hdWQgPSBhZGJfdWlfZGV2aWNlLkFkYlVpRGV2aWNlKHNlbGYuX2FkKQotICAgICAgc2VsZi5wcmlfYWQgPSBBbmRyb2lkQmx1ZXRvb3RoRGVjb3JhdG9yKHNlbGYuX2FkKQotICAgICAgc2VsZi5wcmlfYWQuaW5pdF9zZXR1cCgpCi0gICAgICBzZWxmLnByaV9hZC5zbDRhX3NldHVwKCkKLSAgICAgIHNlbGYuc2w0YSA9IHNlbGYuX2FkLnNlcnZpY2VzLnNsNGEKLSAgICAgIHNlbGYubWFjX2FkZHJlc3MgPSBzZWxmLnNsNGEuYmx1ZXRvb3RoR2V0TG9jYWxBZGRyZXNzKCkKLQotICAgICAgaWYgc2VsZi5hdWRpb19wYXJhbXM6Ci0gICAgICAgIHNlbGYuX2luaXRpYWxpemVfYXVkaW9fcGFyYW1zKCkKLSAgICBzZWxmLmF2cmNwX3JlYWR5ID0gRmFsc2UKLQotICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Ci0gICAgcmV0dXJuIGdldGF0dHIoc2VsZi5wcmlfYWQsIG5hbWUpCi0KLSAgZGVmIF9kaXNhYmxlX3Byb2ZpbGVzKHNlbGYpOgotICAgIGlmIHNlbGYuc2VjX2FkIGlzIE5vbmU6Ci0gICAgICByYWlzZSBNaXNzaW5nQnRDbGllbnREZXZpY2VFcnJvcigiUGxlYXNlIHByb3ZpZGUgc2VjX2FkIGZvcnNldHRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsZXMiKQotICAgIHNlbGYuc2V0X3Byb2ZpbGVzX3BvbGljeV9vZmYoc2VsZi5zZWNfYWQsIEEyRFBfSEZQX1BST0ZJTEVTKQotCi0gIGRlZiBfaW5pdGlhbGl6ZV9hdWRpb19wYXJhbXMoc2VsZik6Ci0gICAgc2VsZi5hdWRpb19jYXB0dXJlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fYWQubG9nX3BhdGgsICJhdWRpb19jYXB0dXJlIikKLSAgICBvcy5tYWtlZGlycyhzZWxmLmF1ZGlvX2NhcHR1cmVfcGF0aCkKLSAgICBzZWxmLmFkYl9wYXRoID0gb3MucGF0aC5qb2luKEFEQl9QQVRILCBBREJfRklMRSkKLSAgICBzZWxmLndhdmVfZmlsZV90ZW1wbGF0ZSA9IG9zLnBhdGguam9pbihzZWxmLmF1ZGlvX2NhcHR1cmVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVZFX0ZJTEVfVEVNUExBVEUpCi0gICAgc2VsZi53YXZlX2ZpbGVfbnVtYmVyID0gMAotCi0gIGRlZiBfdmVyaWZ5X3ByaV9hZChzZWxmKToKLSAgICBpZiBub3Qgc2VsZi5wcmlfYWQ6Ci0gICAgICByYWlzZSBDb250cm9sbGVyRXJyb3IoIk5vIGJlIHRhcmdldCBkZXZpY2UiKQotCi0gIGRlZiBjbGVhbl91cChzZWxmKToKLSAgICAiIiJSZXNldHMgQmx1ZXRvb3RoIGFuZCBzdG9wcyBhbGwgc2VydmljZXMgd2hlbiB0aGUgZGV2aWNlIGlzIGRlc3Ryb3llZC4iIiIKLSAgICBzZWxmLmRlYWN0aXZhdGVfYmxlX3BhaXJpbmdfbW9kZSgpCi0gICAgc2VsZi5mYWN0b3J5X3Jlc2V0X2JsdWV0b290aCgpCi0gICAgc2VsZi5fYWQuc2VydmljZXMuc3RvcF9hbGwoKQotCi0gIGRlZiBhMmRwX3NpbmtfY29ubmVjdChzZWxmKToKLSAgICAiIiJFc3RhYmxpc2hlcyB0aGUgaGZ0IGNvbm5lY3Rpb24gYmV0d2VlbiBzZWxmLnByaV9hZCBhbmQgc2VsZi5zZWNfYWQuIiIiCi0gICAgc2VsZi5fdmVyaWZ5X3ByaV9hZCgpCi0gICAgY29ubmVjdGVkID0gc2VsZi5wcmlfYWQuYTJkcF9zaW5rX2Nvbm5lY3Qoc2VsZi5zZWNfYWQpCi0gICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgY29ubmVjdGVkLCAiVGhlIGEyZHAgc2luayBjb25uZWN0aW9uIGJldHdlZW4ge30gYW5kIHt9IGZhaWxlZCIuZm9ybWF0KAotICAgICAgICAgICAgc2VsZi5zZXJpYWwsIHNlbGYuc2VjX2FkLnNlcmlhbCkpCi0gICAgc2VsZi5sb2cuaW5mbygiVGhlIGEyZHAgc2luayBjb25uZWN0aW9uIGJldHdlZW4gJXMgYW5kICVzIHN1Y2NlZWRlZCIsCi0gICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbCwgc2VsZi5zZWNfYWQuc2VyaWFsKQotICAgIHJldHVybiBUcnVlCi0KLSAgZGVmIGFjdGl2YXRlX3BhaXJpbmdfbW9kZShzZWxmKToKLSAgICAiIiJNYWtlcyB0aGUgYW5kcm9pZCBoZnAgZGV2aWNlIGRpc2NvdmVyYWJsZSBvdmVyIEJsdWV0b290aC4iIiIKLSAgICBzZWxmLmxvZy5pbmZvKCJBY3RpdmF0aW5nIHRoZSBwYWlyaW5nIG1vZGUgb2YgdGhlIGFuZHJvaWQgdGFyZ2V0IGRldmljZSIpCi0gICAgc2VsZi5wcmlfYWQuYWN0aXZhdGVfcGFpcmluZ19tb2RlKCkKLQotICBkZWYgYWN0aXZhdGVfYmxlX3BhaXJpbmdfbW9kZShzZWxmKToKLSAgICAiIiJBY3RpdmF0ZXMgQkxFIHBhaXJpbmcgbW9kZSBvbiBhbiBBbmRyb2lkQnRUYXJnZXREZXZpY2UuIiIiCi0gICAgc2VsZi5wcmlfYWQuYWN0aXZhdGVfYmxlX3BhaXJpbmdfbW9kZSgpCi0KLSAgZGVmIGRlYWN0aXZhdGVfYmxlX3BhaXJpbmdfbW9kZShzZWxmKToKLSAgICAiIiJEZWFjdGl2YXRlcyBCTEUgcGFpcmluZyBtb2RlIG9uIGFuIEFuZHJvaWRCdFRhcmdldERldmljZS4iIiIKLSAgICBzZWxmLnByaV9hZC5kZWFjdGl2YXRlX2JsZV9wYWlyaW5nX21vZGUoKQotCi0gIGRlZiBhZGRfcHJpX2FkX2RldmljZShzZWxmLCBwcmlfYWQpOgotICAgICIiIkFkZHMgcHJpbWFyeSBhbmRyb2lkIGRldmljZSBhcyBidCB0YXJnZXQgZGV2aWNlLgotCi0gICAgVGhlIHByaW1hcnkgYW5kcm9pZCBkZXZpY2Ugc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoCi0gICAgYW5kcm9pZF9ibHVldG9vdGhfZGVjb3JhdG9yLgotCi0gICAgQXJnczoKLSAgICAgIHByaV9hZDogdGhlIHByaW1hcnkgYW5kcm9pZCBkZXZpY2UgYXMgYnQgdGFyZ2V0IGRldmljZS4KLSAgICAiIiIKLSAgICBzZWxmLl9hZCA9IHByaV9hZAotICAgIHNlbGYucHJpX2FkID0gcHJpX2FkCi0gICAgc2VsZi5zbDRhID0gc2VsZi5fYWQuc2VydmljZXMuc2w0YQotICAgIHNlbGYubWFjX2FkZHJlc3MgPSBzZWxmLnNsNGEuYmx1ZXRvb3RoR2V0TG9jYWxBZGRyZXNzKCkKLSAgICBzZWxmLmxvZyA9IHNlbGYucHJpX2FkLmxvZwotICAgIHNlbGYuc2VyaWFsID0gc2VsZi5wcmlfYWQuc2VyaWFsCi0gICAgc2VsZi5sb2cuaW5mbygKLSAgICAgICAgIkFkZHMgcHJpbWFyeSBhbmRyb2lkIGRldmljZSB3aXRoIGlkICVzIGZvciB0aGUgYmx1ZXRvb3RoIgotICAgICAgICAiY29ubmVjdGlvbiIsIHByaV9hZC5zZXJpYWwpCi0gICAgaWYgc2VsZi5hdWRpb19wYXJhbXM6Ci0gICAgICBzZWxmLl9pbml0aWFsaXplX2F1ZGlvX3BhcmFtcygpCi0KLSAgZGVmIGFkZF9zZWNfYWRfZGV2aWNlKHNlbGYsIHNlY19hZCk6Ci0gICAgIiIiQWRkcyBzZWNvbmQgYW5kcm9pZCBkZXZpY2UgZm9yIGJsdWV0b290aCBjb25uZWN0aW9uLgotCi0gICAgVGhlIHNlY29uZCBhbmRyb2lkIGRldmljZSBzaG91bGQgaGF2ZSBzbDRhIHNlcnZpY2UgYWNpdHZhdGVkLgotCi0gICAgQXJnczoKLSAgICAgIHNlY19hZDogdGhlIHNlY29uZCBhbmRyb2lkIGRldmljZSBmb3IgYmx1ZXRvb3RoIGNvbm5lY3Rpb24uCi0gICAgIiIiCi0gICAgc2VsZi5sb2cuaW5mbygKLSAgICAgICAgIkFkZHMgc2Vjb25kIGFuZHJvaWQgZGV2aWNlIHdpdGggaWQgJXMgZm9yIHRoZSBibHVldG9vdGgiCi0gICAgICAgICJjb25uZWN0aW9uIiwgc2VjX2FkLnNlcmlhbCkKLSAgICBzZWxmLnNlY19hZCA9IHNlY19hZAotICAgIHNlbGYuc2VjX2FkX21hY19hZGRyZXNzID0gc2VsZi5zZWNfYWQuc2w0YS5ibHVldG9vdGhHZXRMb2NhbEFkZHJlc3MoKQotCi0gIGRlZiBhbnN3ZXJfcGhvbmVfY2FsbChzZWxmKToKLSAgICAiIiJBbnN3ZXJzIGFuIGluY29taW5nIHBob25lIGNhbGwuIiIiCi0gICAgaWYgbm90IHNlbGYuaXNfaGZwX2Nvbm5lY3RlZCgpOgotICAgICAgc2VsZi5oZnBfY29ubmVjdCgpCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRldmljZSBpcyBpbiByaW5naW5nIHN0YXRlLgotICAgIGlmIG5vdCBzZWxmLndhaXRfZm9yX2NhbGxfc3RhdGUoCi0gICAgICAgIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1JJTkdJTkcsIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1RJTUVPVVRfU0VDKToKLSAgICAgIHJhaXNlIENvbnRyb2xsZXJFcnJvcigKLSAgICAgICAgICAiVGltZWQgb3V0IGFmdGVyICVkcyB3YWl0aW5nIGZvciB0aGUgZGV2aWNlICVzIHRvIGJlIHJpbmdpbmcgc3RhdGUgIgotICAgICAgICAgICJiZWZvcmUgYW53c2VyaW5nIHRoZSBpbmNvbWluZyBwaG9uZSBjYWxsLiIgJQotICAgICAgICAgIChidF9jb25zdGFudHMuQ0FMTF9TVEFURV9USU1FT1VUX1NFQywgc2VsZi5zZXJpYWwpKQotICAgIHNlbGYubG9nLmluZm8oIkFuc3dlcnMgdGhlIGluY29taW5nIHBob25lIGNhbGwgZnJvbSBoZiBwaG9uZSAlcyBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfYWRkcmVzcywgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0gICAgcmV0dXJuIHNlbGYuc2w0YS5ibHVldG9vdGhIZnBDbGllbnRBY2NlcHRDYWxsKHNlbGYuc2VjX2FkX21hY19hZGRyZXNzKQotCi0gIGRlZiBjYWxsX3ZvbHVtZV9kb3duKHNlbGYpOgotICAgICIiIkxvd2VycyB0aGUgdm9sdW1lLiIiIgotICAgIGN1cnJlbnRfdm9sdW1lID0gc2VsZi5tYnMuZ2V0Vm9pY2VDYWxsVm9sdW1lKCkKLSAgICBpZiBjdXJyZW50X3ZvbHVtZSA+IDA6Ci0gICAgICBjaGFuZ2Vfdm9sdW1lID0gY3VycmVudF92b2x1bWUgLSAxCi0gICAgICBzZWxmLmxvZy5kZWJ1ZygiU2V0IHZvaWNlIGNhbGwgdm9sdW1lIGZyb20gJWQgdG8gJWQuIiAlCi0gICAgICAgICAgICAgICAgICAgICAoY3VycmVudF92b2x1bWUsIGNoYW5nZV92b2x1bWUpKQotICAgICAgc2VsZi5tYnMuc2V0Vm9pY2VDYWxsVm9sdW1lKGNoYW5nZV92b2x1bWUpCi0KLSAgZGVmIGNhbGxfdm9sdW1lX3VwKHNlbGYpOgotICAgICIiIlJhaXNlcyB0aGUgdm9sdW1lLiIiIgotICAgIGN1cnJlbnRfdm9sdW1lID0gc2VsZi5tYnMuZ2V0Vm9pY2VDYWxsVm9sdW1lKCkKLSAgICBpZiBjdXJyZW50X3ZvbHVtZSA8IHNlbGYubWJzLmdldFZvaWNlQ2FsbE1heFZvbHVtZSgpOgotICAgICAgY2hhbmdlX3ZvbHVtZSA9IGN1cnJlbnRfdm9sdW1lICsgMQotICAgICAgc2VsZi5sb2cuZGVidWcoIlNldCB2b2ljZSBjYWxsIHZvbHVtZSBmcm9tICVkIHRvICVkLiIgJQotICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdm9sdW1lLCBjaGFuZ2Vfdm9sdW1lKSkKLSAgICAgIHNlbGYubWJzLnNldFZvaWNlQ2FsbFZvbHVtZShjaGFuZ2Vfdm9sdW1lKQotCi0gIGRlZiBkaXNjb25uZWN0X2FsbChzZWxmKToKLSAgICBzZWxmLl9kaXNhYmxlX3Byb2ZpbGVzKCkKLQotICBkZWYgZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoc2VsZik6Ci0gICAgIiIiRmFjdG9yeSByZXNldHMgQmx1ZXRvb3RoIG9uIHRoZSBhbmRyb2lkIGhmcCBkZXZpY2UuIiIiCi0gICAgc2VsZi5sb2cuaW5mbygiRmFjdG9yeSByZXNldHMgQmx1ZXRvb3RoIG9uIHRoZSBhbmRyb2lkIHRhcmdldCBkZXZpY2UiKQotICAgIHNlbGYucHJpX2FkLmZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKCkKLQotICBkZWYgZ2V0X2JsdWV0b290aF9tYWNfYWRkcmVzcyhzZWxmKToKLSAgICAiIiJHZXRzIEJsdWV0b290aCBtYWMgYWRkcmVzcyBvZiB0aGlzIGFuZHJvaWRfYnRfZGV2aWNlLiIiIgotICAgIHNlbGYubG9nLmluZm8oIkdldHRpbmcgQmx1ZXRvb3RoIG1hYyBhZGRyZXNzIGZvciBBbmRyb2lkQnRUYXJnZXREZXZpY2UuIikKLSAgICBtYWNfYWRkcmVzcyA9IHNlbGYuc2w0YS5ibHVldG9vdGhHZXRMb2NhbEFkZHJlc3MoKQotICAgIHNlbGYubG9nLmluZm8oIkJsdWV0b290aCBtYWMgYWRkcmVzcyBvZiBBbmRyb2lkQnRUYXJnZXREZXZpY2U6ICVzIiwKLSAgICAgICAgICAgICAgICAgIG1hY19hZGRyZXNzKQotICAgIHJldHVybiBtYWNfYWRkcmVzcwotCi0gIGRlZiBnZXRfYXVkaW9fcGFyYW1zKHNlbGYpOgotICAgICIiIkdldHMgYXVkaW8gcGFyYW1zIGZyb20gdGhlIGFuZHJvaWRfYnRfdGFyZ2V0X2RldmljZS4iIiIKLSAgICByZXR1cm4gc2VsZi5hdWRpb19wYXJhbXMKLQotICBkZWYgZ2V0X25ld193YXZlX2ZpbGVfcGF0aChzZWxmKToKLSAgICAiIiJHZXRzIGEgbmV3IHdhdmUgZmlsZSBwYXRoIGZvciB0aGUgYXVkaW8gY2FwdHVyZS4iIiIKLSAgICB3YXZlX2ZpbGVfcGF0aCA9IHNlbGYud2F2ZV9maWxlX3RlbXBsYXRlICUgc2VsZi53YXZlX2ZpbGVfbnVtYmVyCi0gICAgd2hpbGUgb3MucGF0aC5leGlzdHMod2F2ZV9maWxlX3BhdGgpOgotICAgICAgc2VsZi53YXZlX2ZpbGVfbnVtYmVyICs9IDEKLSAgICAgIHdhdmVfZmlsZV9wYXRoID0gc2VsZi53YXZlX2ZpbGVfdGVtcGxhdGUgJSBzZWxmLndhdmVfZmlsZV9udW1iZXIKLSAgICByZXR1cm4gd2F2ZV9maWxlX3BhdGgKLQotICBkZWYgZ2V0X3VucmVhZF9tZXNzYWdlcyhzZWxmKSAtPiBOb25lOgotICAgICIiIkdldHMgdW5yZWFkIG1lc3NhZ2VzIGZyb20gdGhlIGNvbm5lY3RlZCBkZXZpY2UgKE1TRSkuIiIiCi0gICAgc2VsZi5zbDRhLm1hcEdldFVucmVhZE1lc3NhZ2VzKHNlbGYuc2VjX2FkX21hY19hZGRyZXNzKQotCi0gIGRlZiBoYW5ndXBfcGhvbmVfY2FsbChzZWxmKToKLSAgICAiIiJIYW5ncyB1cCBhbiBvbmdvaW5nIHBob25lIGNhbGwuIiIiCi0gICAgaWYgbm90IHNlbGYuaXNfaGZwX2Nvbm5lY3RlZCgpOgotICAgICAgc2VsZi5oZnBfY29ubmVjdCgpCi0gICAgc2VsZi5sb2cuaW5mbygiSGFuZ3MgdXAgdGhlIHBob25lIGNhbGwgZnJvbSBoZiBwaG9uZSAlcyBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfYWRkcmVzcywgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0gICAgcmV0dXJuIHNlbGYuc2w0YS5ibHVldG9vdGhIZnBDbGllbnRUZXJtaW5hdGVBbGxDYWxscygKLSAgICAgICAgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0KLSAgZGVmIGhmcF9jb25uZWN0KHNlbGYpOgotICAgICIiIkVzdGFibGlzaGVzIHRoZSBoZnQgY29ubmVjdGlvbiBiZXR3ZWVuIHNlbGYucHJpX2FkIGFuZCBzZWxmLnNlY19hZC4iIiIKLSAgICBzZWxmLl92ZXJpZnlfcHJpX2FkKCkKLSAgICBjb25uZWN0ZWQgPSBzZWxmLnByaV9hZC5oZnBfY29ubmVjdChzZWxmLnNlY19hZCkKLSAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICBjb25uZWN0ZWQsICJUaGUgaGZwIGNvbm5lY3Rpb24gYmV0d2VlbiB7fSBhbmQge30gZmFpbGVkIi5mb3JtYXQoCi0gICAgICAgICAgICBzZWxmLnNlcmlhbCwgc2VsZi5zZWNfYWQuc2VyaWFsKSkKLSAgICBzZWxmLmxvZy5pbmZvKCJUaGUgaGZwIGNvbm5lY3Rpb24gYmV0d2VlbiAlcyBhbmQgJXMgc3VjY2VlZCIsIHNlbGYuc2VyaWFsLAotICAgICAgICAgICAgICAgICAgc2VsZi5zZWNfYWQuc2VyaWFsKQotICAgIHJldHVybiBjb25uZWN0ZWQKLQotICBkZWYgaW5pdF9hbWJzX2Zvcl9hdnJjcChzZWxmKToKLSAgICAiIiJJbml0aWFsaXplcyBtZWRpYSBicm93c2VyIHNlcnZpY2UgZm9yIGF2cmNwLgotCi0gICAgVGhpcyBpcyByZXF1aXJlZCB0byBiZSBkb25lIGJlZm9yZSBydW5uaW5nIGFueSBvZiB0aGUgcGFzc3Rocm91Z2gKLSAgICBjb21tYW5kcy4KLQotICAgIFN0ZXBzOgotICAgICAgMS4gU3RhcnRzIHVwIHRoZSBBdnJjcE1lZGlhQnJvd3NlclNlcnZpY2Ugb24gdGhlIEEyZHAgc291cmNlIHBob25lLiBUaGlzCi0gICAgICAgICAgIE1lZGlhQnJvd3NlclNlcnZpY2UgaXMgcGFydCBvZiB0aGUgU0w0QSBhcHAuCi0gICAgICAyLiBTd2l0Y2ggdGhlIHBsYXliYWNrIHN0YXRlIHRvIGJlIHBhdXNlZC4KLSAgICAgIDMuIENvbm5lY3RzIGEgTWVkaWFCcm93c2VyIHRvIHRoZSBBMmRwIHNpbmsncyBBMmRwTWVkaWFCcm93c2VyU2VydmljZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlOiBpZiBpdCBpcyBhdnJjcCByZWFkeSBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24uCi0gICAgICBGYWxzZTogaWYgaXQgaXMgc3RpbGwgbm90IGF2cmNwIHJlYWR5IGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbi4KLQotICAgIFJhaXNlczoKLSAgICAgIFNpZ25hbHMuQ29udHJvbGxlckVycm9yOiByYWlzZSBpZiBBdnJjcE1lZGlhQnJvd3NlclNlcnZpY2Ugb24gdGhlIEEyZHAKLSAgICAgICAgICBzb3VyY2UgcGhvbmUgZmFpbHMgdG8gYmUgc3RhcnRlZC4KLSAgICAiIiIKLSAgICBpZiBzZWxmLmlzX2F2cmNwX3JlYWR5KCk6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgIGlmIG5vdCBzZWxmLmlzX2EyZHBfc2lua19jb25uZWN0ZWQoKToKLSAgICAgIHNlbGYuYTJkcF9zaW5rX2Nvbm5lY3QoKQotCi0gICAgc2VsZi5zZWNfYWQubG9nLmluZm8oIlN0YXJ0aW5nIEF2cmNwTWVkaWFCcm93c2VyU2VydmljZSIpCi0gICAgc2VsZi5zZWNfYWQuc2w0YS5ibHVldG9vdGhNZWRpYVBob25lU0w0QU1CU1N0YXJ0KCkKLQotICAgIHRpbWUuc2xlZXAoREVGQVVMVF9XQUlUX1RJTUUpCi0KLSAgICAjIENoZWNrIGlmIHRoZSBtZWRpYSBzZXNzaW9uICJCbHVldG9vdGhTTDRBQXVkaW9TcmNNQlMiIGlzIGFjdGl2ZSBvbiBzZWNfYWQuCi0gICAgYWN0aXZlX3Nlc3Npb25zID0gc2VsZi5zZWNfYWQuc2w0YS5ibHVldG9vdGhNZWRpYUdldEFjdGl2ZU1lZGlhU2Vzc2lvbnMoKQotICAgIGlmIEJMVUVUT09USF9TTDRBX0FVRElPX1NSQ19NQlMgbm90IGluIGFjdGl2ZV9zZXNzaW9uczoKLSAgICAgIHJhaXNlIENvbnRyb2xsZXJFcnJvcigiRmFpbGVkIHRvIHN0YXJ0IEF2cmNwTWVkaWFCcm93c2VyU2VydmljZS4iKQotCi0gICAgc2VsZi5sb2cuaW5mbygiQ29ubmVjdGluZyB0byBBMmRwIG1lZGlhIGJyb3dzZXIgc2VydmljZSIpCi0gICAgc2VsZi5zbDRhLmJsdWV0b290aE1lZGlhQ29ubmVjdFRvQ2FyTUJTKCkKLQotICAgICMgVE9ETyh1c2VyKSBXYWl0IGZvciBhbiBldmVudCBiYWNrIGluc3RlYWQgb2Ygc2xlZXAKLSAgICB0aW1lLnNsZWVwKERFRkFVTFRfV0FJVF9USU1FKQotICAgIHNlbGYuYXZyY3BfcmVhZHkgPSBUcnVlCi0gICAgcmV0dXJuIHNlbGYuYXZyY3BfcmVhZHkKLQotICBkZWYgaXNfYXZyY3BfcmVhZHkoc2VsZik6Ci0gICAgIiIiQ2hlY2tzIGlmIHRoZSBwcmlfYWQgYW5kIHNlY19hZCBhcmUgcmVhZHkgZm9yIGF2cmNwLiIiIgotICAgIHNlbGYuX3ZlcmlmeV9wcmlfYWQoKQotICAgIGlmIHNlbGYuYXZyY3BfcmVhZHk6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgIGFjdGl2ZV9zZXNzaW9ucyA9IHNlbGYuc2w0YS5ibHVldG9vdGhNZWRpYUdldEFjdGl2ZU1lZGlhU2Vzc2lvbnMoKQotICAgIGlmIG5vdCBhY3RpdmVfc2Vzc2lvbnM6Ci0gICAgICBzZWxmLmxvZy5pbmZvKCJUaGUgZGV2aWNlIGlzIG5vdCBhdnJjcCByZWFkeSIpCi0gICAgICBzZWxmLmF2cmNwX3JlYWR5ID0gRmFsc2UKLSAgICBlbHNlOgotICAgICAgc2VsZi5sb2cuaW5mbygiVGhlIGRldmljZSBpcyBhdnJjcCByZWFkeSIpCi0gICAgICBzZWxmLmF2cmNwX3JlYWR5ID0gVHJ1ZQotICAgIHJldHVybiBzZWxmLmF2cmNwX3JlYWR5Ci0KLSAgZGVmIGlzX2hmcF9jb25uZWN0ZWQoc2VsZik6Ci0gICAgIiIiQ2hlY2tzIGlmIHRoZSBwcmlfYWQgYW5kIHNlY19hZCBhcmUgaGZwIGNvbm5lY3RlZC4iIiIKLSAgICBzZWxmLl92ZXJpZnlfcHJpX2FkKCkKLSAgICBpZiBzZWxmLnNlY19hZCBpcyBOb25lOgotICAgICAgcmFpc2UgTWlzc2luZ0J0Q2xpZW50RGV2aWNlRXJyb3IoIlRoZSBzZWNfYWQgd2FzIG5vdCBhZGRlZCIpCi0gICAgcmV0dXJuIHNlbGYuc2w0YS5ibHVldG9vdGhIZnBDbGllbnRHZXRDb25uZWN0aW9uU3RhdHVzKAotICAgICAgICBzZWxmLnNlY19hZF9tYWNfYWRkcmVzcykKLQotICBkZWYgaXNfYTJkcF9zaW5rX2Nvbm5lY3RlZChzZWxmKToKLSAgICAiIiJDaGVja3MgaWYgdGhlIHByaV9hZCBhbmQgc2VjX2FkIGFyZSBoZnAgY29ubmVjdGVkLiIiIgotICAgIHNlbGYuX3ZlcmlmeV9wcmlfYWQoKQotICAgIGlmIHNlbGYuc2VjX2FkIGlzIE5vbmU6Ci0gICAgICByYWlzZSBNaXNzaW5nQnRDbGllbnREZXZpY2VFcnJvcigiVGhlIHNlY19hZCB3YXMgbm90IGFkZGVkIikKLSAgICByZXR1cm4gc2VsZi5zbDRhLmJsdWV0b290aEEyZHBTaW5rR2V0Q29ubmVjdGlvblN0YXR1cygKLSAgICAgICAgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0KLSAgZGVmIGxhc3RfbnVtYmVyX2RpYWwoc2VsZik6Ci0gICAgIiIiUmVkaWFscyBsYXN0IG91dGdvaW5nIHBob25lIG51bWJlci4iIiIKLSAgICBpZiBub3Qgc2VsZi5pc19oZnBfY29ubmVjdGVkKCk6Ci0gICAgICBzZWxmLmhmcF9jb25uZWN0KCkKLSAgICBzZWxmLmxvZy5pbmZvKCJSZWRpYWxzIGxhc3QgbnVtYmVyIGZyb20gaGYgcGhvbmUgJXMgZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgIHNlbGYubWFjX2FkZHJlc3MsIHNlbGYuc2VjX2FkX21hY19hZGRyZXNzKQotICAgIHNlbGYuc2w0YS5ibHVldG9vdGhIZnBDbGllbnREaWFsKHNlbGYuc2VjX2FkX21hY19hZGRyZXNzLCBOb25lKQotCi0gIGRlZiBtYXBfY29ubmVjdChzZWxmKToKLSAgICAiIiJFc3RhYmxpc2hlcyB0aGUgbWFwIGNvbm5lY3Rpb24gYmV0d2VlbiBzZWxmLnByaV9hZCBhbmQgc2VsZi5zZWNfYWQuIiIiCi0gICAgc2VsZi5fdmVyaWZ5X3ByaV9hZCgpCi0gICAgY29ubmVjdGVkID0gc2VsZi5wcmlfYWQubWFwX2Nvbm5lY3Qoc2VsZi5zZWNfYWQpCi0gICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgY29ubmVjdGVkLCAiVGhlIG1hcCBjb25uZWN0aW9uIGJldHdlZW4ge30gYW5kIHt9IGZhaWxlZCIuZm9ybWF0KAotICAgICAgICAgICAgc2VsZi5zZXJpYWwsIHNlbGYuc2VjX2FkLnNlcmlhbCkpCi0gICAgc2VsZi5sb2cuaW5mbygiVGhlIG1hcCBjb25uZWN0aW9uIGJldHdlZW4gJXMgYW5kICVzIHN1Y2NlZWQiLCBzZWxmLnNlcmlhbCwKLSAgICAgICAgICAgICAgICAgIHNlbGYuc2VjX2FkLnNlcmlhbCkKLQotICBkZWYgbWFwX2Rpc2Nvbm5lY3Qoc2VsZikgLT4gTm9uZToKLSAgICAiIiJJbml0aWF0ZXMgYSBtYXAgZGlzY29ubmVjdGlvbiB0byB0aGUgY29ubmVjdGVkIGRldmljZS4KLQotICAgIFJhaXNlczoKLSAgICAgIEJsdWV0b290aFByb2ZpbGVDb25uZWN0aW9uRXJyb3I6IHJhaXNlZCBpZiBmYWlsZWQgdG8gZGlzY29ubmVjdC4KLSAgICAiIiIKLSAgICBzZWxmLl92ZXJpZnlfcHJpX2FkKCkKLSAgICBpZiBub3Qgc2VsZi5wcmlfYWQubWFwX2Rpc2Nvbm5lY3Qoc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpOgotICAgICAgcmFpc2UgQmx1ZXRvb3RoUHJvZmlsZUNvbm5lY3Rpb25FcnJvcigKLSAgICAgICAgICAnRmFpbGVkIHRvIHRlcm1pbmF0ZSB0aGUgTUFQIGNvbm5lY3Rpb24gd2l0aCB0aGUgZGV2aWNlICIlcyIuJyAlCi0gICAgICAgICAgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0KLSAgZGVmIHBiYXBfY29ubmVjdChzZWxmKToKLSAgICAiIiJFc3RhYmxpc2hlcyB0aGUgcGJhcCBjb25uZWN0aW9uIGJldHdlZW4gc2VsZi5wcmlfYWQgYW5kIHNlbGYuc2VjX2FkLiIiIgotICAgIGNvbm5lY3RlZCA9IHNlbGYucHJpX2FkLnBiYXBfY29ubmVjdChzZWxmLnNlY19hZCkKLSAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICBjb25uZWN0ZWQsICJUaGUgcGJhcCBjb25uZWN0aW9uIGJldHdlZW4ge30gYW5kIHt9IGZhaWxlZCIuZm9ybWF0KAotICAgICAgICAgICAgc2VsZi5zZXJpYWwsIHNlbGYuc2VjX2FkLnNlcmlhbCkpCi0gICAgc2VsZi5sb2cuaW5mbygiVGhlIHBiYXAgY29ubmVjdGlvbiBiZXR3ZWVuICVzIGFuZCAlcyBzdWNjZWVkIiwgc2VsZi5zZXJpYWwsCi0gICAgICAgICAgICAgICAgICBzZWxmLnNlY19hZC5zZXJpYWwpCi0KLSAgZGVmIHBhdXNlKHNlbGYpOgotICAgICIiIlNlbmRzIEF2cmNwIHBhdXNlIGNvbW1hbmQuIiIiCi0gICAgc2VsZi5zZW5kX21lZGlhX3Bhc3N0aHJvdWdoX2NtZChidF9jb25zdGFudHMuQ01EX01FRElBX1BBVVNFLCBzZWxmLnNlY19hZCkKLQotICBkZWYgcGxheShzZWxmKToKLSAgICAiIiJTZW5kcyBBdnJjcCBwbGF5IGNvbW1hbmQuIiIiCi0gICAgc2VsZi5zZW5kX21lZGlhX3Bhc3N0aHJvdWdoX2NtZChidF9jb25zdGFudHMuQ01EX01FRElBX1BMQVksIHNlbGYuc2VjX2FkKQotCi0gIGRlZiBwb3dlcl9vbihzZWxmKToKLSAgICAiIiJUdXJucyB0aGUgQmx1ZXRvb3RoIG9uIHRoZSBhbmRyb2lkIGJ0IGdhcmdldCBkZXZpY2UuIiIiCi0gICAgc2VsZi5sb2cuaW5mbygiVHVybnMgb24gdGhlIGJsdWV0b290aCIpCi0gICAgcmV0dXJuIHNlbGYuc2w0YS5ibHVldG9vdGhUb2dnbGVTdGF0ZShUcnVlKQotCi0gIGRlZiBwb3dlcl9vZmYoc2VsZik6Ci0gICAgIiIiVHVybnMgdGhlIEJsdWV0b290aCBvZmYgdGhlIGFuZHJvaWQgYnQgZ2FyZ2V0IGRldmljZS4iIiIKLSAgICBzZWxmLmxvZy5pbmZvKCJUdXJucyBvZmYgdGhlIGJsdWV0b290aCIpCi0gICAgcmV0dXJuIHNlbGYuc2w0YS5ibHVldG9vdGhUb2dnbGVTdGF0ZShGYWxzZSkKLQotICBkZWYgcm91dGVfY2FsbF9hdWRpbyhzZWxmLCBjb25uZWN0PUZhbHNlKToKLSAgICAiIiJSb3V0ZXMgY2FsbCBhdWRpbyBkdXJpbmcgYSBjYWxsLiIiIgotICAgIGlmIG5vdCBzZWxmLmlzX2hmcF9jb25uZWN0ZWQoKToKLSAgICAgIHNlbGYuaGZwX2Nvbm5lY3QoKQotICAgIHNlbGYubG9nLmluZm8oCi0gICAgICAgICJSb3V0ZXMgY2FsbCBhdWRpbyBkdXJpbmcgYSBjYWxsIGZyb20gaGYgcGhvbmUgJXMgZm9yICVzICIKLSAgICAgICAgImF1ZGlvIGNvbm5lY3Rpb24gJXMgYWZ0ZXIgcm91dGluZyIsIHNlbGYubWFjX2FkZHJlc3MsCi0gICAgICAgIHNlbGYuc2VjX2FkX21hY19hZGRyZXNzLCBjb25uZWN0KQotICAgIGlmIGNvbm5lY3Q6Ci0gICAgICBzZWxmLnNsNGEuYmx1ZXRvb3RoSGZwQ2xpZW50Q29ubmVjdEF1ZGlvKHNlbGYuc2VjX2FkX21hY19hZGRyZXNzKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnNsNGEuYmx1ZXRvb3RoSGZwQ2xpZW50RGlzY29ubmVjdEF1ZGlvKHNlbGYuc2VjX2FkX21hY19hZGRyZXNzKQotCi0gIGRlZiByZWplY3RfcGhvbmVfY2FsbChzZWxmKToKLSAgICAiIiJSZWplY3RzIGFuIGluY29taW5nIHBob25lIGNhbGwuIiIiCi0gICAgaWYgbm90IHNlbGYuaXNfaGZwX2Nvbm5lY3RlZCgpOgotICAgICAgc2VsZi5oZnBfY29ubmVjdCgpCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRldmljZSBpcyBpbiByaW5naW5nIHN0YXRlLgotICAgIGlmIG5vdCBzZWxmLndhaXRfZm9yX2NhbGxfc3RhdGUoCi0gICAgICAgIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1JJTkdJTkcsIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1RJTUVPVVRfU0VDKToKLSAgICAgIHJhaXNlIENvbnRyb2xsZXJFcnJvcigKLSAgICAgICAgICAiVGltZWQgb3V0IGFmdGVyICVkcyB3YWl0aW5nIGZvciB0aGUgZGV2aWNlICVzIHRvIGJlIHJpbmdpbmcgc3RhdGUgIgotICAgICAgICAgICJiZWZvcmUgcmVqZWN0aW5nIHRoZSBpbmNvbWluZyBwaG9uZSBjYWxsLiIgJQotICAgICAgICAgIChidF9jb25zdGFudHMuQ0FMTF9TVEFURV9USU1FT1VUX1NFQywgc2VsZi5zZXJpYWwpKQotICAgIHNlbGYubG9nLmluZm8oIlJlamVjdHMgdGhlIGluY29taW5nIHBob25lIGNhbGwgZnJvbSBoZiBwaG9uZSAlcyBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfYWRkcmVzcywgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0gICAgcmV0dXJuIHNlbGYuc2w0YS5ibHVldG9vdGhIZnBDbGllbnRSZWplY3RDYWxsKHNlbGYuc2VjX2FkX21hY19hZGRyZXNzKQotCi0gIGRlZiBzZXRfYXVkaW9fcGFyYW1zKHNlbGYsIGF1ZGlvX3BhcmFtcyk6Ci0gICAgIiIiU2V0cyBhdWRpbyBwYXJhbXMgdG8gdGhlIGFuZHJvaWRfYnRfdGFyZ2V0X2RldmljZS4iIiIKLSAgICBzZWxmLmF1ZGlvX3BhcmFtcyA9IGF1ZGlvX3BhcmFtcwotCi0gIGRlZiB0cmFja19wcmV2aW91cyhzZWxmKToKLSAgICAiIiJTZW5kcyBBdnJjcCBza2lwIHByZXYgY29tbWFuZC4iIiIKLSAgICBzZWxmLnNlbmRfbWVkaWFfcGFzc3Rocm91Z2hfY21kKAotICAgICAgICBidF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfUFJFViwgc2VsZi5zZWNfYWQpCi0KLSAgZGVmIHRyYWNrX25leHQoc2VsZik6Ci0gICAgIiIiU2VuZHMgQXZyY3Agc2tpcCBuZXh0IGNvbW1hbmQuIiIiCi0gICAgc2VsZi5zZW5kX21lZGlhX3Bhc3N0aHJvdWdoX2NtZCgKLSAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX05FWFQsIHNlbGYuc2VjX2FkKQotCi0gIGRlZiBzdGFydF9hdWRpb19jYXB0dXJlKHNlbGYpOgotICAgICIiIlN0YXJ0cyB0aGUgYXVkaW8gY2FwdHVyZSBvdmVyIGFkYi4iIiIKLSAgICBpZiBzZWxmLmF1ZGlvX3BhcmFtcyBpcyBOb25lOgotICAgICAgcmFpc2UgTWlzc2luZ0F1ZGlvUGFyYW1zRXJyb3IoIk1pc3NpbmcgYXVkaW8gcGFyYW1zIGZvciBjYXB0dXJlaW5nIGF1ZGlvIikKLSAgICBpZiBub3Qgc2VsZi5pc19hMmRwX3NpbmtfY29ubmVjdGVkKCk6Ci0gICAgICBzZWxmLmEyZHBfc2lua19jb25uZWN0KCkKLSAgICBjbWQgPSAiYXAyZiAtLXVzYWdlIDEgLS1zdGFydCAtLWR1cmF0aW9uIHt9IC0tdGFyZ2V0IHt9Ii5mb3JtYXQoCi0gICAgICAgIHNlbGYuYXVkaW9fcGFyYW1zWyJkdXJhdGlvbiJdLCBzZWxmLmFkYl9wYXRoKQotICAgIHNlbGYubG9nLmluZm8oIlN0YXJ0cyBjYXB0dXJpbmcgYXVkaW8gd2l0aCBhZGIgc2hlbGwgY29tbWFuZCAlcyIsIGNtZCkKLSAgICBzZWxmLmFkYi5zaGVsbChjbWQpCi0KLSAgZGVmIHN0b3BfYXVkaW9fY2FwdHVyZShzZWxmKToKLSAgICAiIiJTdG9wcyB0aGUgYXVkaW8gY2FwdHVyZSBhbmQgc3RvcmVzIGl0IGluIHdhdmUgZmlsZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBGaWxlIG5hbWUgb2YgdGhlIHJlY29yZGVkIGZpbGUuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBNaXNzaW5nQXVkaW9QYXJhbXNFcnJvcjogd2hlbiBzZWxmLmF1ZGlvX3BhcmFtcyBpcyBOb25lCi0gICAgIiIiCi0gICAgaWYgc2VsZi5hdWRpb19wYXJhbXMgaXMgTm9uZToKLSAgICAgIHJhaXNlIE1pc3NpbmdBdWRpb1BhcmFtc0Vycm9yKCJNaXNzaW5nIGF1ZGlvIHBhcmFtcyBmb3IgY2FwdHVyZWluZyBhdWRpbyIpCi0gICAgaWYgbm90IHNlbGYuaXNfYTJkcF9zaW5rX2Nvbm5lY3RlZCgpOgotICAgICAgc2VsZi5hMmRwX3NpbmtfY29ubmVjdCgpCi0gICAgYWRiX3B1bGxfYXJncyA9IFtzZWxmLmFkYl9wYXRoLCBzZWxmLmF1ZGlvX2NhcHR1cmVfcGF0aF0KLSAgICBzZWxmLmxvZy5pbmZvKCJzdGFydCBhZGIgLXMgJXMgcHVsbCAlcyIsIHNlbGYuc2VyaWFsLCBhZGJfcHVsbF9hcmdzKQotICAgIHNlbGYuX2FkLmFkYi5wdWxsKGFkYl9wdWxsX2FyZ3MpCi0gICAgcGNtX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmF1ZGlvX2NhcHR1cmVfcGF0aCwgQURCX0ZJTEUpCi0gICAgc2VsZi5sb2cuaW5mbygiZGVsZXRlIHRoZSByZWNvcmVkIGZpbGUgJXMiLCBzZWxmLmFkYl9wYXRoKQotICAgIHNlbGYuX2FkLmFkYi5zaGVsbCgicm0ge30iLmZvcm1hdChzZWxmLmFkYl9wYXRoKSkKLSAgICB3YXZlX2ZpbGVfcGF0aCA9IHNlbGYuZ2V0X25ld193YXZlX2ZpbGVfcGF0aCgpCi0gICAgc2VsZi5sb2cuaW5mbygiY29udmVydCBwY20gZmlsZSAlcyB0byB3YXYgZmlsZSAlcyIsIHBjbV9maWxlX3BhdGgsCi0gICAgICAgICAgICAgICAgICB3YXZlX2ZpbGVfcGF0aCkKLSAgICBidHV0aWxzLmNvbnZlcnRfcGNtX3RvX3dhdihwY21fZmlsZV9wYXRoLCB3YXZlX2ZpbGVfcGF0aCwgc2VsZi5hdWRpb19wYXJhbXMpCi0gICAgcmV0dXJuIHdhdmVfZmlsZV9wYXRoCi0KLSAgZGVmIHN0b3BfYWxsX3NlcnZpY2VzKHNlbGYpOgotICAgICIiIlN0b3BzIGFsbCBzZXJ2aWNlcyBmb3IgdGhlIHByaV9hZCBkZXZpY2UuIiIiCi0gICAgc2VsZi5sb2cuaW5mbygiU3RvcHMgYWxsIHNlcnZpY2VzIG9uIHRoZSBhbmRyb2lkIGJ0IHRhcmdldCBkZXZpY2UiKQotICAgIHNlbGYuX2FkLnNlcnZpY2VzLnN0b3BfYWxsKCkKLQotICBkZWYgc3RvcF9hbWJzX2Zvcl9hdnJjcChzZWxmKToKLSAgICAiIiJTdG9wcyBtZWRpYSBicm93c2VyIHNlcnZpY2UgZm9yIGF2cmNwLiIiIgotICAgIGlmIHNlbGYuaXNfYXZyY3BfcmVhZHkoKToKLSAgICAgIHNlbGYubG9nLmluZm8oIlN0b3BzIGF2cmNwIGNvbm5lY3Rpb24iKQotICAgICAgc2VsZi5zZWNfYWQuc2w0YS5ibHVldG9vdGhNZWRpYVBob25lU0w0QU1CU1N0b3AoKQotICAgICAgc2VsZi5hdnJjcF9yZWFkeSA9IEZhbHNlCi0KLSAgZGVmIHN0b3Bfdm9pY2VfZGlhbChzZWxmKToKLSAgICAiIiJTdG9wcyB2b2ljZSBkaWFsLiIiIgotICAgIGlmIG5vdCBzZWxmLmlzX2hmcF9jb25uZWN0ZWQoKToKLSAgICAgIHNlbGYuaGZwX2Nvbm5lY3QoKQotICAgIHNlbGYubG9nLmluZm8oIlN0b3BzIHZvaWNlIGRpYWwgZnJvbSBoZiBwaG9uZSAlcyBmb3IgJXMiLCBzZWxmLm1hY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0gICAgaWYgc2VsZi5pc19oZnBfY29ubmVjdGVkKCk6Ci0gICAgICBzZWxmLnNsNGEuYmx1ZXRvb3RoSGZwQ2xpZW50U3RvcFZvaWNlUmVjb2duaXRpb24oCi0gICAgICAgICAgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0KLSAgZGVmIHRha2VfYnVnX3JlcG9ydChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgIGJlZ2luX3RpbWU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PTMwMCwKLSAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbj1Ob25lKToKLSAgICAiIiJXcmFwcGVyIG1ldGhvZCB0byBjYXB0dXJlIGJ1Z3JlcG9ydCBvbiB0aGUgYW5kcm9pZCBidCB0YXJnZXQgZGV2aWNlLiIiIgotICAgIHNlbGYuX2FkLnRha2VfYnVnX3JlcG9ydCh0ZXN0X25hbWUsIGJlZ2luX3RpbWUsIHRpbWVvdXQsIGRlc3RpbmF0aW9uKQotCi0gIGRlZiB2b2ljZV9kaWFsKHNlbGYpOgotICAgICIiIlRyaWdnZXJzIHZvaWNlIGRpYWwuIiIiCi0gICAgaWYgbm90IHNlbGYuaXNfaGZwX2Nvbm5lY3RlZCgpOgotICAgICAgc2VsZi5oZnBfY29ubmVjdCgpCi0gICAgc2VsZi5sb2cuaW5mbygiVHJpZ2dlcnMgdm9pY2UgZGlhbCBmcm9tIGhmIHBob25lICVzIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgICBzZWxmLm1hY19hZGRyZXNzLCBzZWxmLnNlY19hZF9tYWNfYWRkcmVzcykKLSAgICBpZiBzZWxmLmlzX2hmcF9jb25uZWN0ZWQoKToKLSAgICAgIHNlbGYuc2w0YS5ibHVldG9vdGhIZnBDbGllbnRTdGFydFZvaWNlUmVjb2duaXRpb24oCi0gICAgICAgICAgc2VsZi5zZWNfYWRfbWFjX2FkZHJlc3MpCi0KLSAgZGVmIGxvZ190eXBlKHNlbGYpOgotICAgICIiIkdldHMgdGhlIGxvZyB0eXBlIG9mIEFuZHJvaWQgYnQgdGFyZ2V0IGRldmljZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIHN0cmluZywgdGhlIGxvZyB0eXBlIG9mIEFuZHJvaWQgYnQgdGFyZ2V0IGRldmljZS4KLSAgICAiIiIKLSAgICByZXR1cm4gYnRfY29uc3RhbnRzLkxvZ1R5cGUuQkxVRVRPT1RIX0RFVklDRV9TSU1VTEFUT1IKLQotCi1jbGFzcyBCbHVldG9vdGhQcm9maWxlQ29ubmVjdGlvbkVycm9yKEV4Y2VwdGlvbik6Ci0gICIiIkVycm9yIGZvciBCbHVldG9vdGggUHJvZmlsZSBjb25uZWN0aW9uIHByb2JsZW1zLiIiIgotCi0KLWNsYXNzIE1pc3NpbmdCdENsaWVudERldmljZUVycm9yKEV4Y2VwdGlvbik6Ci0gICIiIkVycm9yIGZvciBtaXNzaW5nIHJlcXVpcmVkIGJsdWV0b290aCBjbGllbnQgZGV2aWNlLiIiIgotCi0KLWNsYXNzIE1pc3NpbmdBdWRpb1BhcmFtc0Vycm9yKEV4Y2VwdGlvbik6Ci0gICIiIkVycm9yIGZvciBtaXNzaW5nIHRoZSBhdWRpbyBwYXJhbXMuIiIiCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvY29udHJvbGxlcnMvYnRfc3R1Yi5weSBiL2JsdWViZXJyeS9jb250cm9sbGVycy9idF9zdHViLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2QwMjRlLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS9jb250cm9sbGVycy9idF9zdHViLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLSIiIkJsdWV0b290aCBzdHViIGNsYXNzLgotCi1UaGlzIGNvbnRyb2xsZXIgb2ZmZXJzIG5vIGRpcmVjdCBjb250cm9sIHRvIGFueSBkZXZpY2UuIEl0IHNpbXBseSBwcm9tcHRzIHRoZQotdXNlciB0byBwZXJmb3JtIGEgY2VydGFpbiBhY3Rpb24gb24gdGhlIGRldmljZSBpdCBpcyBzdGFuZGluZyBpbiBmb3IuIEZvciB1c2UKLWluIHRlc3Qgc2NyaXB0cyB3aGVyZSBubyBjb250cm9sbGVyIGZvciB0aGUgRFVUIGV4aXN0cy4KLSIiIgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgc2l4Ci0KLQotY2xhc3MgQnRTdHViKG9iamVjdCk6Ci0gICIiIlN0dWIgZm9yIHdoZW4gY29udHJvbGxlciBjbGFzcyBkb2VzIG5vdCBleGlzdCBmb3IgYSBCbHVldG9vdGggZGV2aWNlLgotCi0gIFRoaXMgY2xhc3Mgd2lsbCBzaW11bGF0ZSBzZW1pLWF1dG9tYXRpb24gYnkgcHJvbXB0aW5nIHVzZXIgdG8gbWFudWFsbHkKLSAgcGVyZm9ybSBhY3Rpb25zIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLgotICAiIiIKLQotICAjIENvbm5lY3Rpb24gQ29tbWFuZHMKLSAgZGVmIHBvd2VyX29mZihzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcG93ZXIgb2ZmIHRoZSBCbHVldG9vdGggZGV2aWNlLiIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUG93ZXIgT2ZmIEJsdWV0b290aCBkZXZpY2UsIHRoZW4gcHJlc3MgZW50ZXIuIikKLQotICBkZWYgcG93ZXJfb24oc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHBvd2VyIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLiIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUG93ZXIgT04gQmx1ZXRvb3RoIGRldmljZSwgdGhlbiBwcmVzcyBlbnRlci4iKQotCi0gIGRlZiBhY3RpdmF0ZV9wYWlyaW5nX21vZGUoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHB1dCB0aGUgQmx1ZXRvb3RoIGRldmljZSBpbnRvIHBhaXJpbmcgbW9kZS4iIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlB1dCBCbHVldG9vdGggZGV2aWNlIGludG8gcGFpcmluZyBtb2RlLCIKLSAgICAgICAgICAgICAgICAgICAgInRoZW4gcHJlc3MgZW50ZXIuIikKLQotICBkZWYgZ2V0X2JsdWV0b290aF9tYWNfYWRkcmVzcyhzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gaW5wdXQgdGhlIEJsdWV0b290aCBNQUMgYWRkcmVzcyBmb3IgdGhpcyBkZXZpY2UuCi0KLSAgICBSZXR1cm5zOgotICAgICAgbWFjX2FkZHJlc3MgKHN0cik6IHRoZSBzdHJpbmcgcmVjZWl2ZWQgZnJvbSB1c2VyIGlucHV0LgotICAgICIiIgotICAgIG1hY19hZGRyZXNzID0gc2l4Lm1vdmVzLmlucHV0KCJFbnRlciBCVCBNQUMgYWRkcmVzcywgdGhlbiBwcmVzcyBlbnRlci4iKQotICAgIHJldHVybiBtYWNfYWRkcmVzcwotCi0gIGRlZiBzZXRfZGV2aWNlX25hbWUoc2VsZiwgZGV2aWNlX25hbWUpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBzZXQgdGhlIGRldmljZSBuYW1lIChDYXJraXQgT25seSkuCi0KLSAgICBBcmdzOgotICAgICAgZGV2aWNlX25hbWU6IFN0cmluZyBvZiBkZXZpY2UgbmFtZSB0byBiZSBzZXQuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJEZXZpY2UgbmFtZSBpczogJXMiLCBkZXZpY2VfbmFtZSkKLQotICBkZWYgZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIGZhY3RvcnkgcmVzZXQgQmx1ZXRvb3RoIG9uIHRoZSBkZXZpY2UuIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJGYWN0b3J5IHJlc2V0IEJsdWV0b290aCBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAidGhlbiBwcmVzcyBlbnRlci4iKQotCi0gICMgQTJEUDogQmx1ZXRvb3RoIHN0ZXJlbyBzdHJlYW1pbmcgcHJvdG9jb2wgbWV0aG9kcy4KLSAgZGVmIGlzX2F1ZGlvX3BsYXlpbmcoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIGluZGljYXRlIGlmIHRoZSBhdWRpbyBpcyBwbGF5aW5nLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgQm9vbCwgdHJ1ZSBpcyBhdWRpbyBpcyBwbGF5aW5nLCBmYWxzZSBpZiBub3QuCi0gICAgIiIiCi0gICAgYXVkaW9fcGxheWluZyA9IHNpeC5tb3Zlcy5pbnB1dCgiSW5kaWNhdGUgaWYgYXVkaW8gaXMgcGxheWluZzogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRydWUvZmFsc2UuIikKLSAgICByZXR1cm4gYm9vbChhdWRpb19wbGF5aW5nKQotCi0gICMgQVZSQ1AgQ29tbWFuZHMKLSAgZGVmIHZvbHVtZV91cChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcmFpc2UgdGhlIHZvbHVtZSBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZS4iIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlByZXNzIHRoZSBWb2x1bWUgVXAgQnV0dG9uIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLCAiCi0gICAgICAgICAgICAgICAgICAgICJ0aGVuIHByZXNzIGVudGVyLiIpCi0KLSAgZGVmIHZvbHVtZV9kb3duKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBsb3dlciB0aGUgdm9sdW1lIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLiIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFZvbHVtZSBEb3duIEJ1dHRvbiBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAidGhlbiBwcmVzcyBlbnRlci4iKQotCi0gIGRlZiB0cmFja19uZXh0KHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBza2lwIHRoZSB0cmFjayBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZS4iIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlByZXNzIHRoZSBTa2lwIFRyYWNrIEJ1dHRvbiBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAidGhlbiBwcmVzcyBlbnRlci4iKQotCi0gIGRlZiB0cmFja19wcmV2aW91cyhzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcmV3aW5kIHRoZSB0cmFjayBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZS4iIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlByZXNzIHRoZSBSZXdpbmQgVHJhY2sgQnV0dG9uIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLCAiCi0gICAgICAgICAgICAgICAgICAgICJ0aGVuIHByZXNzIGVudGVyLiIpCi0KLSAgZGVmIHBsYXkoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHByZXNzIHBsYXkgb24gdGhlIEJsdWV0b290aCBkZXZpY2UuIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgUGxheSBCdXR0b24gb24gdGhlIEJsdWV0b290aCBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgInRoZW4gcHJlc3MgZW50ZXIuIikKLQotICBkZWYgcGF1c2Uoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHByZXNzIHBhdXNlIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLiIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFBhdXNlIEJ1dHRvbiBvbiB0aGUgQmx1ZXRvb3RoIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAidGhlbiBwcmVzcyBlbnRlci4iKQotCi0gIGRlZiByZXBlYXQoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHNldCB0aGUgcmVwZWF0IG9wdGlvbiBvbiB0aGUgZGV2aWNlLiIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFJlcGVhdCBCdXR0b24gb24gdGhlIEJsdWV0b290aCBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgInRoZW4gcHJlc3MgZW50ZXIuIikKLQotICBkZWYgZmFzdF9mb3J3YXJkKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBwcmVzcyB0aGUgZmFzdCBmb3J3YXJkIG9wdGlvbi9idXR0b24gb24gdGhlIGRldmljZS4KLQotICAgIFJldHVybnM6IE5vbmUKLSAgICAiIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlByZXNzIHRoZSBGYXN0IEZvcndhcmQgQnV0dG9uIG9uIHRoZSBCbHVldG9vdGggZGV2aWNlLCAiCi0gICAgICAgICAgICAgICAgICAgICJ0aGVuIHByZXNzIGVudGVyLiIpCi0KLSAgZGVmIHJld2luZChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcHJlc3MgUmV3aW5kIG9wdGlvbiBvbiB0aGUgZGV2aWNlLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFJld2luZCBvcHRpb24gb24gdGhlIEJsdWV0b290aCBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgInRoZW4gcHJlc3MgZW50ZXIuIikKLQotICAjIFRPRE8odXNlcik6IGJyb3dzZV9tZWRpYV9jb250ZW50IG1heSBuZWVkIG1vcmUgd29yayBpbiB0ZXJtcyBvZiBpbnB1dAotICAjIHBhcmFtcyBhbmQgdmFsdWUocykgcmV0dXJuZWQKLSAgZGVmIGJyb3dzZV9tZWRpYV9jb250ZW50KHNlbGYsIGRpcmVjdG9yeT0iIik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIGVudGVyIHRvIHRoZSBwYWlyZWQgZGV2aWNlIG1lZGlhIGZvbGRlcnMuCi0KLSAgICBBcmdzOgotICAgICAgZGlyZWN0b3J5OiBBIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byBicm93c2UgdG8uCi0KLSAgICBSZXR1cm5zOgotICAgICAgTGlzdCAtIGVtcHR5Ci0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJOYXZpZ2F0ZSB0byBkaXJlY3Rvcnk6ICVzIiwgZGlyZWN0b3J5KQotICAgIHJldHVybiBbXQotCi0gIGRlZiBkZWxldGVfc29uZyhzZWxmLCBmaWxlX3BhdGg9IiIpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBkZWxldGUgYSBzb25nLgotCi0gICAgQXJnczoKLSAgICAgIGZpbGVfcGF0aCAob3B0aW9uYWwpOiBBIGZpbGUgcGF0aCB0byB0aGUgc29uZyB0byBiZSBkZWxldGVkLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiRGVsZXRlIGEgc29uZyAlcyIsIGZpbGVfcGF0aCkKLQotICBkZWYgc2h1ZmZsZV9zb25nKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBzaHVmZmxlIGEgcGxheWxpc3QuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJTaHVmZmxlIGEgcGxheWxpc3QiKQotCi0gICMgSEZQIChIYW5kcyBGcmVlIFBob25lIHByb3RvY29sKSBDb21tYW5kcwotICBkZWYgY2FsbF92b2x1bWVfdXAoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHByZXNzIHRoZSB2b2x1bWUgdXAgYnV0dG9uIG9uIGFuIGFjdGl2ZSBjYWxsLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIHZvbHVtZSB1cCBidXR0b24gZm9yIGFuIGFjdGl2ZSBjYWxsLiIpCi0KLSAgZGVmIGNhbGxfdm9sdW1lX2Rvd24oc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHByZXNzIHRoZSB2b2x1bWUgZG93biBidXR0b24gb24gYW4gYWN0aXZlIGNhbGwuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgdm9sdW1lIGRvd24gYnV0dG9uIGZvciBhbiBhY3RpdmUgY2FsbC4iKQotCi0gIGRlZiBhbnN3ZXJfcGhvbmVfY2FsbChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcHJlc3MgdGhlIGJ1dHRvbiB0byBhbnN3ZXIgYSBwaG9uZSBjYWxsLi4KLQotICAgIFJldHVybnM6IE5vbmUKLSAgICAiIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlByZXNzIHRoZSBidXR0b24gdG8gYW5zd2VyIHRoZSBwaG9uZSBjYWxsLiIpCi0KLSAgZGVmIGhhbmd1cF9waG9uZV9jYWxsKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBwcmVzcyB0aGUgYnV0dG9uIHRvIGhhbmcgdXAgb24gYW4gYWN0aXZlIHBob25lIGNhbGwuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgYnV0dG9uIHRvIGhhbmcgdXAgb24gdGhlIHBob25lIGNhbGwuIikKLQotICBkZWYgY2FsbF9jb250YWN0KHNlbGYsIG5hbWUpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBjb250YWN0IGZyb20gdGhlIHBob25lYm9vayBhbmQgY2FsbC4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBzdHJpbmcgbmFtZSBvZiBjb250YWN0IHRvIGNhbGwKLQotICAgIFJldHVybnM6IE5vbmUKLSAgICAiIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlNlbGVjdCBjb250YWN0LCAlcywgdG8gY2FsbC4iLCBuYW1lKQotCi0gIGRlZiBjYWxsX251bWJlcihzZWxmLCBwaG9uZV9udW1iZXIpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBkaWFsIGEgcGhvbmUgbnVtYmVyIGFuZCBjYWxsLgotCi0gICAgQXJnczoKLSAgICAgIHBob25lX251bWJlcjogc3RyaW5nIG9mIHBob25lIG51bWJlciB0byBkaWFsIGFuZCBjYWxsCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJEaWFsIHBob25lIG51bWJlciBhbmQgaW5pdGlhdGUgYSBjYWxsLiAlcyIsIHBob25lX251bWJlcikKLQotICBkZWYgc3dhcF9jYWxsKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBwdXNoIHRoZSBidXR0b24gdG8gc3dhcC4KLQotICAgICAgIEZ1bmN0aW9uIHN3YXBzIGJldHdlZW4gdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjYWxscy4gIE9uZSBjYWxsIHdpbGwKLSAgICAgICBiZSBhY3RpdmUgYW5kIHRoZSBvdGhlciB3aWxsIGJlIG9uIGhvbGQuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgYnV0dG9uIHRvIHN3YXAgY2FsbHMuIikKLQotICBkZWYgbWVyZ2VfY2FsbChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcHVzaCB0aGUgYnV0dG9uIHRvIG1lcmdlIGNhbGxzLgotCi0gICAgICAgTWVyZ2VzIGNhbGxzIGJldHdlZW4gdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjYWxscyBpbnRvIGEgY29uZmVyZW5jZQotICAgICAgIGNhbGwuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgYnV0dG9uIHRvIG1lcmdlIGNhbGxzIGludG8gYSBjb25mZXJlbmNlIGNhbGwuIikKLQotICBkZWYgaG9sZF9jYWxsKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBwdXQgdGhlIHByaW1hcnkgY2FsbCBvbiBob2xkLgotCi0gICAgUHJpbWFyeSBjYWxsIHdpbGwgYmUgb24gaG9sZCwgd2hpbGUgdGhlIHNlY29uZGFyeSBjYWxsIGJlY29tZXMgYWN0aXZlLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIGhvbGQgYnV0dG9uIHRvIHB1dCBwcmltYXJ5IGNhbGwgb24gaG9sZC4iKQotCi0gIGRlZiBtdXRlX2NhbGwoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIG11dGUgdGhlIG9uZ29pbmcgYWN0aXZlIGNhbGwuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyBNdXRlIGJ1dHRvbiBvbiBhY3RpdmUgY2FsbC4iKQotCi0gIGRlZiB1bm11dGVfY2FsbChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gdW5tdXRlIHRoZSBvbmdvaW5nIGFjdGl2ZSBjYWxsLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFVubXV0ZSBidXR0b24gb24gYW4gYWN0aXZlIGNhbGwuIikKLQotICBkZWYgcmVqZWN0X3Bob25lX2NhbGwoc2VsZik6Ci0gICAgIiIiUHJvbXB0IHRoZSB1c2VyIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFJlamVjdCBidXR0b24gdG8gcmVqZWN0IGFuIGluY29taW5nIGNhbGwuIikKLQotICBkZWYgYW5zd2VyX3ZvaXBfY2FsbChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcHJlc3MgdGhlIGJ1dHRvbiB0byBhbnN3ZXIgYSBWT0lQIGNhbGwuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgQW5zd2VyIGJ1dHRvbiBvbiBhbiBpbmNvbWluZyBWT0lQIHBob25lIGNhbGwuIikKLQotICBkZWYgaGFuZ3VwX3ZvaXBfY2FsbChzZWxmKToKLSAgICAiIiJQcm9tcHQgdGhlIHVzZXIgdG8gcHJlc3MgdGhlIGJ1dHRvbiB0byBoYW5ndXAgb24gdGhlIGFjdGl2ZSBWT0lQIGNhbGwuCi0KLSAgICBSZXR1cm5zOiBOb25lCi0gICAgIiIiCi0gICAgc2l4Lm1vdmVzLmlucHV0KCJQcmVzcyB0aGUgaGFuZ3VwIGJ1dHRvbiBvbiB0aGUgYWN0aXZlIFZPSVAgY2FsbC4iKQotCi0gIGRlZiByZWplY3Rfdm9pcF9jYWxsKHNlbGYpOgotICAgICIiIlByb21wdCB0aGUgdXNlciB0byBwcmVzcyB0aGUgUmVqZWN0IGJ1dHRvbiBvbiB0aGUgaW5jb21pbmcgVk9JUCBjYWxsLgotCi0gICAgUmV0dXJuczogTm9uZQotICAgICIiIgotICAgIHNpeC5tb3Zlcy5pbnB1dCgiUHJlc3MgdGhlIFJlamVjdCBidXR0b24gb24gdGhlIGluY29taW5nIFZPSVAgY2FsbC4iKQotCi0gIGRlZiB2b2ljZV9kaWFsKHNlbGYpOgotICAgICIiIlByb21wdCB1c2VyIHRvIGluaXRpYXRlIGEgdm9pY2UgZGlhbCBmcm9tIHRoZSBwaG9uZS4KLQotICAgIFJldHVybnM6IE5vbmUKLSAgICAiIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIkluaXRpYXRlIGEgdm9pY2UgZGlhbC4iKQotCi0gIGRlZiBsYXN0X251bWJlcl9kaWFsKHNlbGYpOgotICAgICIiIlByb21wdCB1c2VyIHRvIGluaWF0ZSBhIGNhbGwgdG8gdGhlIGxhc3QgbnVtYmVyIGRpYWxlZC4KLQotICAgIFJldHVybnM6IE5vbmUKLSAgICAiIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIkluaXRpYXRlIGEgY2FsbCB0byB0aGUgbGFzdCBudW1iZXIgZGlhbGVkLiIpCi0KLSAgIyBUT0RPKHVzZXIpOiBkb2VzIHRoaXMgbWV0aG9kIG5lZWQgYSBpbnB1dCBwYXJhbWV0ZXI/Ci0gIGRlZiByb3V0ZV9jYWxsX2F1ZGlvKHNlbGYpOgotICAgICIiIlByb21wdCB1c2VyIHRvIHJvdXRlIGEgY2FsbCBmcm9tIEFHIHRvIEhGLCBhbmQgdmljZSB2ZXJzYS4KLQotICAgIFJldHVybnM6IE5vbmUKLSAgICAiIiIKLSAgICBzaXgubW92ZXMuaW5wdXQoIlJlcm91dGUgY2FsbCBhdWRpby4iKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L2NvbnRyb2xsZXJzL2Rlcml2ZWRfYnRfZGV2aWNlLnB5IGIvYmx1ZWJlcnJ5L2NvbnRyb2xsZXJzL2Rlcml2ZWRfYnRfZGV2aWNlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2ZhZmMxLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS9jb250cm9sbGVycy9kZXJpdmVkX2J0X2RldmljZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSIiIkNvbnRyb2xsZXIgY2xhc3MgZm9yIGEgQmx1ZXRvb3RoIERldmljZS4KLQotVGhpcyBjb250cm9sbGVyIHdpbGwgaW5zdGFudGlhdGUgZGVyaXZlZCBjbGFzc2VzIGZyb20gQnREZXZpY2UgYW5kIHRoZQotbW9kdWxlL2NsYXNzIHNwZWNpZmllZCB2aWEgc3RyaW5ncyBpbiBjb25maWdzIGRpY3Rpb25hcnkuCi0KLVRoZSBpZGVhIGlzIHRvIGFsbG93IHZlbmRvcnMgdG8gcnVuIGJsdWViZXJyeSB0ZXN0cyB3aXRoIHRoZWlyIGNvbnRyb2xsZXIgY2xhc3MKLXRocm91Z2ggdGhpcyBjb250cm9sbGVyIG1vZHVsZSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gZWRpdCB0aGUgdGVzdCBjbGFzc2VzCi10aGVtc2VsdmVzLgotIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCi0KLWltcG9ydCBpbXBvcnRsaWIKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgeWFtbAotCi1NT0JMWV9DT05UUk9MTEVSX0NPTkZJR19OQU1FID0gIkRlcml2ZWRCdERldmljZSIKLU1PQkxZX0NPTlRST0xMRVJfQ09ORklHX01PRFVMRV9LRVkgPSAiTW9kdWxlTmFtZSIKLU1PQkxZX0NPTlRST0xMRVJfQ09ORklHX0NMQVNTX0tFWSA9ICJDbGFzc05hbWUiCi1NT0JMWV9DT05UUk9MTEVSX0NPTkZJR19QQVJBTVNfS0VZID0gIlBhcmFtcyIKLQotCi1kZWYgY3JlYXRlKGNvbmZpZ3MpOgotICAiIiJDcmVhdGVzIERlcml2ZWRCdERldmljZSBjb250cm9sbGVyIG9iamVjdHMuCi0KLSAgRm9yIGVhY2ggY29uZmlnIGRpY3QgaW4gY29uZmlnczoKLSAgICBJbXBvcnQgZGVzaXJlZCBjb250cm9sbGVyIGNsYXNzIGZyb20gY29uZmlnLCBjb21wb3NlIERlcml2ZWRCdERldmljZSBjbGFzcwotICAgIGZyb20gdGhhdCBjbGFzcyBhbmQgQnREZXZpY2UsIGluc3RhbnRpYXRlIHdpdGggcGFyYW1zIGZyb20gY29uZmlnLgotCi0gIEFyZ3M6Ci0gICAgY29uZmlncyAobGlzdCk6IEEgbGlzdCBvZiBkaWN0cywgZWFjaCByZXByZXNlbnRpbmcgYSBjb25maWd1cmF0aW9uIGZvciBhCi0gICAgICAgIEJsdWV0b290aCBkZXZpY2UuIEVhY2ggZGljdCBzaG91bGQgYmUgb2YgdGhlIGZvcm1hdDoKLSAgICAgICAgICB7Ik1vZHVsZU5hbWUiOiA8bmFtZSBvZiBtb2R1bGUgaW4gYmx1ZWJlcnJ5LmNvbnRyb2xsZXJzPiwKLSAgICAgICAgICAgIkNsYXNzTmFtZSI6IDxuYW1lIG9mIGNsYXNzIHRvIGRlcml2ZSBjb250cm9sbGVyIGZyb20+LAotICAgICAgICAgICAiUGFyYW1zIjogPGt3YXJncyBpbiBkaWN0IGZvcm0gdG8gaW5zdGFudGlhdGUgY2xhc3Mgd2l0aD59Ci0KLSAgUmV0dXJuczoKLSAgICBBIGxpc3Qgd2l0aCBEZXJpdmVkQnREZXZpY2Ugb2JqZWN0cy4KLSAgIiIiCi0gIHJldHVybiBbX2NyZWF0ZV9idF9kZXZpY2VfY2xhc3MoY29uZmlnKSBmb3IgY29uZmlnIGluIGNvbmZpZ3NdCi0KLQotZGVmIF9jcmVhdGVfYnRfZGV2aWNlX2NsYXNzKGNvbmZpZyk6Ci0gICIiIkNyZWF0ZWQgbmV3IGRldmljZSBjbGFzcyBmcm9tIGFzc29jaWF0ZWQgZGV2aWNlIGNvbnRyb2xsZXIgZnJvbSBjb25maWcuIiIiCi0gIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKAotICAgICAgImJsdWViZXJyeS5jb250cm9sbGVycy4lcyIgJQotICAgICAgY29uZmlnW01PQkxZX0NPTlRST0xMRVJfQ09ORklHX01PRFVMRV9LRVldKQotICBsb2dnaW5nLmluZm8oIkNyZWF0aW5nIERlcml2ZWRCdERldmljZSBmcm9tICVyIiwgY29uZmlnKQotICBjbHMgPSBnZXRhdHRyKG1vZHVsZSwgY29uZmlnW01PQkxZX0NPTlRST0xMRVJfQ09ORklHX0NMQVNTX0tFWV0pCi0gIHBhcmFtcyA9IHlhbWwuc2FmZV9sb2FkKCIlcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0KE1PQkxZX0NPTlRST0xMRVJfQ09ORklHX1BBUkFNU19LRVksIHt9KSkKLSAgbmV3X2NsYXNzID0gdHlwZShNT0JMWV9DT05UUk9MTEVSX0NPTkZJR19OQU1FLCAoY2xzLCBCdERldmljZSksIHBhcmFtcykKLSAgbmV3X2NsYXNzX2luc3QgPSBuZXdfY2xhc3MoKipwYXJhbXMpCi0gIHJldHVybiBuZXdfY2xhc3NfaW5zdAotCi0KLWRlZiBkZXN0cm95KGRlcml2ZWRfYnRfZGV2aWNlcyk6Ci0gICIiIkNsZWFucyB1cCBEZXJpdmVkQnREZXZpY2Ugb2JqZWN0cy4iIiIKLSAgZm9yIGRldmljZSBpbiBkZXJpdmVkX2J0X2RldmljZXM6Ci0gICAgIyBFeGVjdXRlIGNsZWFudXAgaWYgdGhlIGNvbnRyb2xsZXIgY2xhc3MgaGFzIHRoZSBtZXRob2QgImNsZWFuX3VwIi4KLSAgICBpZiBoYXNhdHRyKGRldmljZSwgImNsZWFuX3VwIik6Ci0gICAgICBkZXZpY2UuY2xlYW5fdXAoKQotICBkZWwgZGVyaXZlZF9idF9kZXZpY2VzCi0KLQotY2xhc3MgQnREZXZpY2Uob2JqZWN0KToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIEJsdWV0b290aCBEZXZpY2VzLgotCi0gIFByb3ZpZGVzIGFkZGl0aW9uYWwgbmVjZXNzYXJ5IGZ1bmN0aW9uYWxpdHkgZm9yIHVzZSB3aXRoaW4gYmx1ZWJlcnJ5LgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgYSBkZXJpdmVkIGJ0IGJhc2UgY2xhc3MuIiIiCi0gICAgc2VsZi5fdXNlcl9wYXJhbXMgPSB7fQotCi0gIGRlZiBzZXR1cChzZWxmKToKLSAgICAiIiJGb3IgZGV2aWNlcyB0aGF0IG5lZWQgZXh0cmEgc2V0dXAuIiIiCi0KLSAgZGVmIHNldF91c2VyX3BhcmFtcyhzZWxmLCBwYXJhbXMpOgotICAgICIiIkludGVuZGVkIGZvciBwYXNzaW5nIG1vYmx5IHVzZXJfcGFyYW1zIGludG8gYSBkZXJpdmVkIGRldmljZSBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBwYXJhbXM6IE1vYmx5IHVzZXIgcGFyYW1zLgotICAgICIiIgotICAgIHNlbGYuX3VzZXJfcGFyYW1zID0gcGFyYW1zCi0KLSAgZGVmIGdldF91c2VyX3BhcmFtcyhzZWxmKToKLSAgICAiIiJSZXR1cm4gc2F2ZWQgdXNlcl9wYXJhbXMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgdXNlcl9wYXJhbXMuCi0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGYuX3VzZXJfcGFyYW1zCi0KLSAgZGVmIGZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiRmFjdG9yeSByZXNldHMgQmx1ZXRvb3RoIG9uIGFuIEJUIERldmljZS4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIGFjdGl2YXRlX3BhaXJpbmdfbW9kZShzZWxmKSAtPiBOb25lOgotICAgICIiIkFjdGl2YXRlcyBwYWlyaW5nIG1vZGUgb24gYW4gQW5kcm9pZERldmljZS4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvY29udHJvbGxlcnMvZ3JwY19idF9zeW5jX21vY2sucHkgYi9ibHVlYmVycnkvY29udHJvbGxlcnMvZ3JwY19idF9zeW5jX21vY2sucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTAwZTguLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L2NvbnRyb2xsZXJzL2dycGNfYnRfc3luY19tb2NrLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIiIiQSBnZW5lcmljIGdSUEMgbW9jayBkZXZpY2UgY29udHJvbGxlci4KLQotRXhhbXBsZSBNSCB0ZXN0YmVkIGNvbmZpZyBmb3IgSG9zdHNpZGU6Ci0tIG5hbWU6IEdycGNCdFN5bmNTdHViLTEKLSAgZGV2aWNlczoKLSAgLSB0eXBlOiBNaXNjVGVzdGJlZFN1YkRldmljZQotICAgIGRpbWVuc2lvbnM6Ci0gICAgICBtb2JseV90eXBlOiBEZXJpdmVkQnREZXZpY2UKLSAgICBwcm9wZXJ0aWVzOgotICAgICAgTW9kdWxlTmFtZTogZ3JwY19idF9zeW5jX21vY2sKLSAgICAgIENsYXNzTmFtZTogR3JwY0J0U3luY01vY2sKLSAgICAgIFBhcmFtczoKLSAgICAgICAgY29uZmlnOgotICAgICAgICAgIG1hY19hZGRyZXNzOiBGRTpFRDpCRTpFRjpDQTpGRQotICBkaW1lbnNpb25zOgotICAgIGRldmljZTogR3JwY0J0U3luY1N0dWIKLSIiIgotaW1wb3J0IHN1YnByb2Nlc3MKLQotZnJvbSBhYnNsIGltcG9ydCBmbGFncwotZnJvbSBhYnNsIGltcG9ydCBsb2dnaW5nCi1pbXBvcnQgZ3JwYwotCi0jIEludGVybmFsIGltcG9ydAotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMgotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjCi0KLUZMQUdTID0gZmxhZ3MuRkxBR1MKLWZsYWdzLkRFRklORV9zdHJpbmcoJ3NlcnZlcicsICdkbnM6Ly8vWzo6MV06MTAwMDAnLCAnc2VydmVyIGFkZHJlc3MnKQotCi0KLWNsYXNzIEdycGNCdFN5bmNNb2NrKG9iamVjdCk6Ci0gICIiIkdlbmVyaWMgR1JQQyBkZXZpY2UgY29udHJvbGxlci4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKLSAgICAiIiJJbml0aWFsaXplIEdSUEMgb2JqZWN0LiIiIgotICAgIHN1cGVyKEdycGNCdFN5bmNNb2NrLCBzZWxmKS5fX2luaXRfXygpCi0gICAgc2VsZi5tYWNfYWRkcmVzcyA9IGNvbmZpZ1snbWFjX2FkZHJlc3MnXQotCi0gIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgIHNlbGYuc2VydmVyX3Byb2MudGVybWluYXRlKCkKLSAgICBkZWwgc2VsZi5jaGFubmVsX2NyZWRzCi0gICAgZGVsIHNlbGYuY2hhbm5lbAotICAgIGRlbCBzZWxmLnN0dWIKLQotICBkZWYgc2V0dXAoc2VsZik6Ci0gICAgIiIiU2V0dXAgdGhlIGdSUEMgc2VydmVyIHRoYXQgdGhlIHN5bmMgbW9jayB3aWxsIHJlc3BvbmQgdG8uIiIiCi0gICAgc2VydmVyX3BhdGggPSBzZWxmLmdldF91c2VyX3BhcmFtcygpWydtaF9maWxlcyddWydncnBjX3NlcnZlciddWzBdCi0gICAgbG9nZ2luZy5pbmZvKCdTdGFydCBnUlBDIHNlcnZlcjogJXMnLCBzZXJ2ZXJfcGF0aCkKLSAgICBzZWxmLnNlcnZlcl9wcm9jID0gc3VicHJvY2Vzcy5Qb3Blbihbc2VydmVyX3BhdGhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZT0wKQotCi0gICAgc2VsZi5jaGFubmVsX2NyZWRzID0gbG9hczIubG9hczJfY2hhbm5lbF9jcmVkZW50aWFscygpCi0gICAgc2VsZi5jaGFubmVsID0gZ3JwYy5zZWN1cmVfY2hhbm5lbChGTEFHUy5zZXJ2ZXIsIHNlbGYuY2hhbm5lbF9jcmVkcykKLSAgICBncnBjLmNoYW5uZWxfcmVhZHlfZnV0dXJlKHNlbGYuY2hhbm5lbCkucmVzdWx0KCkKLSAgICBzZWxmLnN0dWIgPSBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfcGIyX2dycGMuQmx1ZWJlcnJ5RGV2aWNlQ29udHJvbGxlclN0dWIoCi0gICAgICAgIHNlbGYuY2hhbm5lbCkKLQotICBkZWYgaW5pdF9zZXR1cChzZWxmKToKLSAgICBsb2dnaW5nLmluZm8oJ2luaXQgc2V0dXAgVE8gQkUgSU1QTEVNRU5URUQnKQotCi0gIGRlZiBzZXRfdGFyZ2V0KHNlbGYsIGJ0X2RldmljZSk6Ci0gICAgc2VsZi5fdGFyZ2V0X2RldmljZSA9IGJ0X2RldmljZQotCi0gIGRlZiBwYWlyX2FuZF9jb25uZWN0X2JsdWV0b290aChzZWxmLCB0YXJnZXRfbWFjX2FkZHJlc3MpOgotICAgICIiIlBhaXIgYW5kIGNvbm5lY3QgdG8gYSBwZXJpcGhlcmFsIEJsdWV0b290aCBkZXZpY2UuIiIiCi0gICAgcmVxdWVzdCA9IGJsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlcl9wYjIuVGFyZ2V0TWFjQWRkcmVzcygKLSAgICAgICAgbWFjX2FkZHJlc3M9dGFyZ2V0X21hY19hZGRyZXNzKQotICAgIHRyeToKLSAgICAgIHJlc3BvbnNlID0gc2VsZi5zdHViLlBhaXJBbmRDb25uZWN0Qmx1ZXRvb3RoKHJlcXVlc3QpCi0gICAgICBsb2dnaW5nLmluZm8oJ3BhaXIgYW5kIGNvbm5lY3QgYmx1ZXRvb3RoIHJlc3BvbnNlOiAlcycsIHJlc3BvbnNlKQotICAgICAgaWYgcmVzcG9uc2UuZXJyb3I6Ci0gICAgICAgIHByaW50KCdlcnJvciBoYW5kbGVyIFRPIEJFIElNUExFTUVOVEVEJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiByZXNwb25zZS5wYWlyaW5nX3RpbWVfc2VjLCByZXNwb25zZS5jb25uZWN0aW9uX3RpbWVfc2VjCi0gICAgZXhjZXB0IGdycGMuUnBjRXJyb3IgYXMgcnBjX2Vycm9yOgotICAgICAgcHJpbnQocnBjX2Vycm9yKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L2NvbnRyb2xsZXJzL2dycGNfYnRfdGFyZ2V0X21vY2sucHkgYi9ibHVlYmVycnkvY29udHJvbGxlcnMvZ3JwY19idF90YXJnZXRfbW9jay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNmI1MS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvY29udHJvbGxlcnMvZ3JwY19idF90YXJnZXRfbW9jay5weQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSIiImdSUEMgbW9jayB0YXJnZXQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0KLUV4YW1wbGUgTUggdGVzdGJlZCBjb25maWcgZm9yIEhvc3RzaWRlOgotLSBuYW1lOiBHcnBjQnRUYXJnZXRTdHViLTEKLSAgZGV2aWNlczoKLSAgLSB0eXBlOiBNaXNjVGVzdGJlZFN1YkRldmljZQotICAgIGRpbWVuc2lvbnM6Ci0gICAgICBtb2JseV90eXBlOiBEZXJpdmVkQnREZXZpY2UKLSAgICBwcm9wZXJ0aWVzOgotICAgICAgTW9kdWxlTmFtZTogZ3JwY19idF90YXJnZXRfbW9jawotICAgICAgQ2xhc3NOYW1lOiBHcnBjQnRUYXJnZXRNb2NrCi0gICAgICBQYXJhbXM6Ci0gICAgICAgIGNvbmZpZzoKLSAgICAgICAgICBtYWNfYWRkcmVzczogRkU6RUQ6QkU6RUY6Q0E6RkUKLSAgZGltZW5zaW9uczoKLSAgICBkZXZpY2U6IEdycGNCdFRhcmdldFN0dWIKLSIiIgotaW1wb3J0IHN1YnByb2Nlc3MKLQotZnJvbSBhYnNsIGltcG9ydCBmbGFncwotZnJvbSBhYnNsIGltcG9ydCBsb2dnaW5nCi1pbXBvcnQgZ3JwYwotCi0jIEludGVybmFsIGltcG9ydAotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMgotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjCi0KLUZMQUdTID0gZmxhZ3MuRkxBR1MKLQotCi1jbGFzcyBHcnBjQnRUYXJnZXRNb2NrKG9iamVjdCk6Ci0gICIiIkJUIE1vY2sgVGFyZ2V0IGZvciB0ZXN0aW5nIHRoZSBHUlBDIGludGVyZmFjZS4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKLSAgICAiIiJJbml0aWFsaXplIEdSUEMgb2JqZWN0LiIiIgotICAgIHN1cGVyKEdycGNCdFRhcmdldE1vY2ssIHNlbGYpLl9faW5pdF9fKCkKLSAgICBzZWxmLm1hY19hZGRyZXNzID0gY29uZmlnWydtYWNfYWRkcmVzcyddCi0KLSAgZGVmIF9fZGVsX18oc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJfcHJvYy50ZXJtaW5hdGUoKQotICAgIGRlbCBzZWxmLmNoYW5uZWxfY3JlZHMKLSAgICBkZWwgc2VsZi5jaGFubmVsCi0gICAgZGVsIHNlbGYuc3R1YgotCi0gIGRlZiBzZXR1cChzZWxmKToKLSAgICAiIiJTZXR1cCB0aGUgZ1JQQyBzZXJ2ZXIgdGhhdCB0aGUgdGFyZ2V0IG1vY2sgd2lsbCByZXNwb25kIHRvLiIiIgotICAgIHNlcnZlcl9wYXRoID0gc2VsZi5nZXRfdXNlcl9wYXJhbXMoKVsnbWhfZmlsZXMnXVsnZ3JwY19zZXJ2ZXInXVswXQotICAgIGxvZ2dpbmcuaW5mbygnU3RhcnQgZ1JQQyBzZXJ2ZXI6ICVzJywgc2VydmVyX3BhdGgpCi0gICAgc2VsZi5zZXJ2ZXJfcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW3NlcnZlcl9wYXRoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU9MCkKLQotICAgIHNlbGYuY2hhbm5lbF9jcmVkcyA9IGxvYXMyLmxvYXMyX2NoYW5uZWxfY3JlZGVudGlhbHMoKQotICAgIHNlbGYuY2hhbm5lbCA9IGdycGMuc2VjdXJlX2NoYW5uZWwoRkxBR1Muc2VydmVyLCBzZWxmLmNoYW5uZWxfY3JlZHMpCi0gICAgZ3JwYy5jaGFubmVsX3JlYWR5X2Z1dHVyZShzZWxmLmNoYW5uZWwpLnJlc3VsdCgpCi0gICAgc2VsZi5zdHViID0gYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjLkJsdWViZXJyeURldmljZUNvbnRyb2xsZXJTdHViKAotICAgICAgICBzZWxmLmNoYW5uZWwpCi0KLSAgZGVmIGFjdGl2YXRlX3BhaXJpbmdfbW9kZShzZWxmKToKLSAgICBsb2dnaW5nLmluZm8oJ2FjdGl2YXRlIHBhaXJpbmcgbW9kZSBUTyBCRSBJTVBMRU1FTlRFRCcpCi0gICAgcmVxdWVzdCA9IGJsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlcl9wYjIuRGlzY292ZXJhYmxlTW9kZShtb2RlPVRydWUpCi0gICAgdHJ5OgotICAgICAgcmVzcG9uc2UgPSBzZWxmLnN0dWIuU2V0RGlzY292ZXJhYmxlTW9kZShyZXF1ZXN0KQotICAgICAgbG9nZ2luZy5pbmZvKCdzZXQgZGlzY292ZXJhZ2VibGUgcmVzcG9uc2U6ICVzJywgcmVzcG9uc2UpCi0gICAgICByZXR1cm4gMAotICAgIGV4Y2VwdCBncnBjLlJwY0Vycm9yIGFzIHJwY19lcnJvcjoKLSAgICAgIHByaW50KHJwY19lcnJvcikKLSAgICAgIHJldHVybiAtMQotCi0gIGRlZiBmYWN0b3J5X3Jlc2V0X2JsdWV0b290aChzZWxmKToKLSAgICBsb2dnaW5nLmluZm8oJ2ZhY3RvcnkgcmVzZXQgVE8gQkUgSU1QTEVNRU5URUQnKQotCi0gIGRlZiBnZXRfYmx1ZXRvb3RoX21hY19hZGRyZXNzKHNlbGYpOgotICAgIGxvZ2dpbmcuaW5mbygnbWFjX2FkZHJlc3M6ICVzJywgc2VsZi5tYWNfYWRkcmVzcykKLSAgICByZXR1cm4gc2VsZi5tYWNfYWRkcmVzcwpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L2RlY29yYXRvcnMvYW5kcm9pZF9ibHVldG9vdGhfY2xpZW50X2RlY29yYXRvci5weSBiL2JsdWViZXJyeS9kZWNvcmF0b3JzL2FuZHJvaWRfYmx1ZXRvb3RoX2NsaWVudF9kZWNvcmF0b3IucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODM0ZWEuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L2RlY29yYXRvcnMvYW5kcm9pZF9ibHVldG9vdGhfY2xpZW50X2RlY29yYXRvci5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSIiIkEgQmx1ZXRvb3RoIENsaWVudCBEZWNvcmF0b3IgdXRpbCBmb3IgYW4gQW5kcm9pZCBEZXZpY2UuCi0KLVRoaXMgdXRpbGl0eSBhbGxvd3MgdGhlIHVzZXIgdG8gZGVjb3JhdGUgYW4gZGV2aWNlIHdpdGggYSBjdXN0b20gZGVjb3JhdG9yIGZyb20KLXRoZSBibHVlYmVycnkvZGVjb3JhdG9ycyBkaXJlY3RvcnkuCi0iIiIKLQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgaW1wb3J0bGliCi1pbXBvcnQgcmUKLWZyb20gbW9ibHkuY29udHJvbGxlcnMuYW5kcm9pZF9kZXZpY2UgaW1wb3J0IEFuZHJvaWREZXZpY2UKLQotCi1kZWYgZGVjb3JhdGUoYWQsIGRlY29yYXRvcik6Ci0gICIiIlV0aWxpdHkgdG8gZGVjb3JhdGUgYW4gQW5kcm9pZERldmljZS4KLQotICBBcmdzOgotICAgIGFkOiBEZXZpY2UsIG11c3QgYmUgb2YgdHlwZSBBbmRyb2lkRGV2aWNlLgotICAgIGRlY29yYXRvcjogU3RyaW5nLCBjbGFzcyBuYW1lIG9mIHRoZSBkZWNvcmF0b3IgdG8gdXNlLgotICBSZXR1cm5zOgotICAgIEFuZHJvaWREZXZpY2Ugb2JqZWN0LgotICAiIiIKLQotICBpZiBub3QgaXNpbnN0YW5jZShhZCwgQW5kcm9pZERldmljZSk6Ci0gICAgcmFpc2UgVHlwZUVycm9yKCdNdXN0IGFwcGx5IEFuZHJvaWRCbHVldG9vdGhDbGllbnREZWNvcmF0b3IgdG8gYW4gJwotICAgICAgICAgICAgICAgICAgICAnQW5kcm9pZERldmljZScpCi0gIGRlY29yYXRvcl9tb2R1bGUgPSBjYW1lbF90b19zbmFrZShkZWNvcmF0b3IpCi0gIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKAotICAgICAgJ2JsdWViZXJyeS5kZWNvcmF0b3JzLiVzJyAlIGRlY29yYXRvcl9tb2R1bGUpCi0gIGNscyA9IGdldGF0dHIobW9kdWxlLCBkZWNvcmF0b3IpCi0gIGFkID0gY2xzKGFkKQotCi0gIHJldHVybiBhZAotCi0KLWRlZiBjYW1lbF90b19zbmFrZShjbHNfbmFtZSk6Ci0gICIiIlV0aWxpdHkgdG8gY29udmVydCBhIGNsYXNzIG5hbWUgZnJvbSBjYW1lbCBjYXNlIHRvIHNuYWtlIGNhc2UuCi0KLSAgQXJnczoKLSAgICBjbHNfbmFtZTogc3RyaW5nCi0gIFJldHVybnM6Ci0gICAgc3RyaW5nCi0gICIiIgotICBzMSA9IHJlLnN1YignKC4pKFtBLVpdW2Etel0rKScsIHInXDFfXDInLCBjbHNfbmFtZSkKLSAgcmV0dXJuIHJlLnN1YignKFthLXowLTldKShbQS1aXSknLCByJ1wxX1wyJywgczEpLmxvd2VyKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS9kZWNvcmF0b3JzL2FuZHJvaWRfYmx1ZXRvb3RoX2NsaWVudF90ZXN0X2RlY29yYXRvci5weSBiL2JsdWViZXJyeS9kZWNvcmF0b3JzL2FuZHJvaWRfYmx1ZXRvb3RoX2NsaWVudF90ZXN0X2RlY29yYXRvci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5NTc5ZS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvZGVjb3JhdG9ycy9hbmRyb2lkX2JsdWV0b290aF9jbGllbnRfdGVzdF9kZWNvcmF0b3IucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0iIiJBbiBleGFtcGxlIEJsdWV0b290aCBDbGllbnQgRGVjb3JhdG9yLgotIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KLQotZnJvbSBtb2JseS5jb250cm9sbGVycy5hbmRyb2lkX2RldmljZSBpbXBvcnQgQW5kcm9pZERldmljZQotCi0KLWNsYXNzIEFuZHJvaWRCbHVldG9vdGhDbGllbnRUZXN0RGVjb3JhdG9yKEFuZHJvaWREZXZpY2UpOgotICAiIiJBIGNsYXNzIHVzZWQgdG8gdGVzdCBCbHVlYmVycnkncyBCVCBDbGllbnQgUHJvZmlsZSBkZWNvcmF0aW9uLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBhZCk6Ci0gICAgc2VsZi5fYWQgPSBhZAotICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuX2FkLCBBbmRyb2lkRGV2aWNlKToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcignTXVzdCBhcHBseSBBbmRyb2lkQmx1ZXRvb3RoQ2xpZW50VGVzdERlY29yYXRvciB0byBhbiAnCi0gICAgICAgICAgICAgICAgICAgICAgJ0FuZHJvaWREZXZpY2UnKQotCi0gIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKLSAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9hZCwgbmFtZSkKLQotICBkZWYgdGVzdF9kZWNvcmF0aW9uKHNlbGYpOgotICAgIHJldHVybiAnSSBtYWtlIHRoaXMgZGV2aWNlIGZhbmN5IScKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS9ncnBjL2JsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlci5weSBiL2JsdWViZXJyeS9ncnBjL2JsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5YTIwNC4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvZ3JwYy9ibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0iIiJCbHVlYmVycnkgZ1JQQyBkZXZpY2UgY29udHJvbGxlci4KLQotVGhpcyBpcyBhIHNlcnZlciB0byBhY3QgYXMgYSBtb2NrIGRldmljZSBmb3IgdGVzdGluZyB0aGUgQmx1ZWJlcnJ5IGdSUEMKLWludGVyZmFjZS4KLSIiIgotCi1mcm9tIGNvbmN1cnJlbnQgaW1wb3J0IGZ1dHVyZXMKLWZyb20gYWJzbCBpbXBvcnQgYXBwCi1mcm9tIGFic2wgaW1wb3J0IGZsYWdzCi0KLWltcG9ydCBncnBjCi0KLSMgSW50ZXJuYWwgaW1wb3J0Ci1mcm9tIGJsdWViZXJyeS5ncnBjIGltcG9ydCBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfc2VydmljZQotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjCi0KLQotX0hPU1QgPSAnWzo6XScKLQotRkxBR1MgPSBmbGFncy5GTEFHUwotZmxhZ3MuREVGSU5FX2ludGVnZXIoJ3BvcnQnLCAxMDAwMCwgJ3BvcnQgdG8gbGlzdGVuIG9uJykKLWZsYWdzLkRFRklORV9pbnRlZ2VyKCd0aHJlYWRzJywgMTAsICdudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgaW4gdGhyZWFkIHBvb2wnKQotCi0KLWRlZiBtYWluKHVudXNlZF9hcmd2KToKLSAgc2VydmVyID0gZ3JwYy5zZXJ2ZXIoCi0gICAgICBmdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz1GTEFHUy50aHJlYWRzKSwKLSAgICAgIHBvcnRzPShGTEFHUy5wb3J0LCkpICAjIHB5dHlwZTogZGlzYWJsZT13cm9uZy1rZXl3b3JkLWFyZ3MKLSAgc2VydmljZXIgPSAoCi0gICAgICBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfc2VydmljZS5CbHVlYmVycnlEZXZpY2VDb250cm9sbGVyU2VydmljZXIoKSkKLSAgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjLmFkZF9CbHVlYmVycnlEZXZpY2VDb250cm9sbGVyU2VydmljZXJfdG9fc2VydmVyKAotICAgICAgc2VydmljZXIsIHNlcnZlcikKLSAgc2VydmVyX2NyZWRzID0gbG9hczIubG9hczJfc2VydmVyX2NyZWRlbnRpYWxzKCkKLSAgc2VydmVyLmFkZF9zZWN1cmVfcG9ydChmJ3tfSE9TVH06e0ZMQUdTLnBvcnR9Jywgc2VydmVyX2NyZWRzKQotICBzZXJ2ZXIuc3RhcnQoKQotICBzZXJ2ZXIud2FpdF9mb3JfdGVybWluYXRpb24oKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGFwcC5ydW4obWFpbikKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS9ncnBjL2JsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlcl9zZXJ2aWNlLnB5IGIvYmx1ZWJlcnJ5L2dycGMvYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3NlcnZpY2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2Q3ZGIuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L2dycGMvYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3NlcnZpY2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0iIiJCbHVlYmVycnkgZ1JQQyBNb2NrIFNlcnZpY2UuCi0KLVRoaXMgaXMgc2ltcGxlIG1vY2sgc2VydmljZSB0aGF0IGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLUJsdWViZXJyeSBnUlBDIGRldmljZSBjb250cm9sbGVyIGludGVyZmFjZS4KLSIiIgotCi1mcm9tIGJsdWViZXJyeS5ncnBjLnByb3RvIGltcG9ydCBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfcGIyCi1mcm9tIGJsdWViZXJyeS5ncnBjLnByb3RvIGltcG9ydCBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfcGIyX2dycGMKLQotCi1jbGFzcyBCbHVlYmVycnlEZXZpY2VDb250cm9sbGVyU2VydmljZXIoCi0gICAgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjLkJsdWViZXJyeURldmljZUNvbnRyb2xsZXJTZXJ2aWNlcik6Ci0gICIiIkEgQmx1ZWJlcnJ5VGVzdCBnUlBDIHNlcnZlci4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICBzdXBlcihCbHVlYmVycnlEZXZpY2VDb250cm9sbGVyU2VydmljZXIsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKLSAgICBzZWxmLl9lcnJvciA9ICJ0ZXN0aW5nIDEyMyIKLQotICBkZWYgU2V0RGlzY292ZXJhYmxlTW9kZShzZWxmLCByZXF1ZXN0LCBzZXJ2aWNlcl9jb250ZXh0KToKLSAgICAiIiJTZXRzIHRoZSBkZXZpY2UncyBkaXNjb3ZlcmFibGUgbW9kZS4KLQotICAgIEFyZ3M6Ci0gICAgICByZXF1ZXN0OiBhIGJsdWViZXJyeV90ZXN0X3NlcnZlcl9wYjIuRGlzY292ZXJhYmxlTW9kZSBvYmplY3QgY29udGFpbmluZwotICAgICAgICB0aGUgIm1vZGUiIHRvIHNldCB0aGUgZGV2aWNlIHRvLgotICAgICAgc2VydmljZXJfY29udGV4dDogQSBncnBjLlNlcnZpY2VyQ29udGV4dCBmb3IgdXNlIGR1cmluZyBzZXJ2aWNlIG9mIHRoZQotICAgICAgICBSUEMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBibHVlYmVycnlfdGVzdF9zZXJ2ZXJfcGIyLkRpc2NvdmVyYWJsZVJlc3VsdAotICAgICIiIgotICAgIHJldHVybiBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfcGIyLkRpc2NvdmVyYWJsZVJlc3VsdCgKLSAgICAgICAgcmVzdWx0PVRydWUsCi0gICAgICAgIGVycm9yPXNlbGYuX2Vycm9yKQotCi0gIGRlZiBQYWlyQW5kQ29ubmVjdEJsdWV0b290aChzZWxmLCByZXF1ZXN0LCBzZXJ2aWNlcl9jb250ZXh0KToKLSAgICByZXR1cm4gYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMi5QYWlyQW5kQ29ubmVjdEJsdWV0b290aFJlc3VsdCgKLSAgICAgICAgcGFpcmluZ190aW1lX3NlYz0wLjEsIGNvbm5lY3Rpb25fdGltZV9zZWM9MC4yLCBlcnJvcj1Ob25lKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L2dycGMvYmx1ZWJlcnJ5X3Rlc3RfY2xpZW50LnB5IGIvYmx1ZWJlcnJ5L2dycGMvYmx1ZWJlcnJ5X3Rlc3RfY2xpZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU4ZWIxLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS9ncnBjL2JsdWViZXJyeV90ZXN0X2NsaWVudC5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSIiIkJsdWViZXJyeSBUZXN0IENsaWVudC4KLQotU2ltcGxlIGdSUEMgY2xpZW50IHRvIHRlc3QgdGhlIEJsdWViZXJyeSBNb2NrIHNlcnZlci4KLSIiIgotCi1mcm9tIGFic2wgaW1wb3J0IGFwcAotZnJvbSBhYnNsIGltcG9ydCBmbGFncwotCi1pbXBvcnQgZ3JwYwotCi0jIEludGVybmFsIGltcG9ydAotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMgotZnJvbSBibHVlYmVycnkuZ3JwYy5wcm90byBpbXBvcnQgYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMl9ncnBjCi0KLUZMQUdTID0gZmxhZ3MuRkxBR1MKLWZsYWdzLkRFRklORV9zdHJpbmcoJ3NlcnZlcicsICdkbnM6Ly8vWzo6MV06MTAwMDAnLCAnc2VydmVyIGFkZHJlc3MnKQotCi0KLWRlZiBfVXBkYXRlRGlzY292ZXJ5TW9kZShzdHViLCByZXF1ZXN0KToKLSAgdHJ5OgotICAgIHByaW50KCd0cnkgU2V0RGlzY292ZXJhYmxlTW9kZScpCi0gICAgcmVzcG9uc2UgPSBzdHViLlNldERpc2NvdmVyYWJsZU1vZGUocmVxdWVzdCkKLSAgICBwcmludCgnY29tcGxldGUgcmVzcG9uc2UnKQotICAgIHByaW50KHJlc3BvbnNlKQotICAgIHJldHVybiAwCi0gIGV4Y2VwdCBncnBjLlJwY0Vycm9yIGFzIHJwY19lcnJvcjoKLSAgICBwcmludChycGNfZXJyb3IpCi0gICAgcmV0dXJuIC0xCi0KLQotZGVmIG1haW4odW51c2VkX2FyZ3YpOgotICBjaGFubmVsX2NyZWRzID0gbG9hczIubG9hczJfY2hhbm5lbF9jcmVkZW50aWFscygpCi0gIHdpdGggZ3JwYy5zZWN1cmVfY2hhbm5lbChGTEFHUy5zZXJ2ZXIsIGNoYW5uZWxfY3JlZHMpIGFzIGNoYW5uZWw6Ci0gICAgZ3JwYy5jaGFubmVsX3JlYWR5X2Z1dHVyZShjaGFubmVsKS5yZXN1bHQoKQotICAgIHN0dWIgPSBibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXJfcGIyX2dycGMuQmx1ZWJlcnJ5RGV2aWNlQ29udHJvbGxlclN0dWIoCi0gICAgICAgIGNoYW5uZWwpCi0KLSAgICBwcmludCgncmVxdWVzdCBncnBjJykKLSAgICByZXF1ZXN0ID0gYmx1ZWJlcnJ5X2RldmljZV9jb250cm9sbGVyX3BiMi5EaXNjb3ZlcmFibGVNb2RlKAotICAgICAgICBtb2RlPVRydWUpCi0gICAgcHJpbnQoJ0NhbGwgX1VwZGF0ZURpc2NvdmVyeU1vZGUnKQotICAgIHJldHVybiBfVXBkYXRlRGlzY292ZXJ5TW9kZShzdHViLCByZXF1ZXN0KQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGFwcC5ydW4obWFpbikKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS9ncnBjL3Byb3RvL2JsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlci5wcm90byBiL2JsdWViZXJyeS9ncnBjL3Byb3RvL2JsdWViZXJyeV9kZXZpY2VfY29udHJvbGxlci5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmMzkwNi4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvZ3JwYy9wcm90by9ibHVlYmVycnlfZGV2aWNlX2NvbnRyb2xsZXIucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSB3ZWFyYWJsZXMucWEuYmx1ZWJlcnJ5LmdycGM7Ci0KLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLW9wdGlvbiBqc3BiX3VzZV9jb3JyZWN0X3Byb3RvMl9zZW1hbnRpY3MgPSB0cnVlOwotCi1tZXNzYWdlIERpc2NvdmVyYWJsZU1vZGUgewotICBib29sIG1vZGUgPSAxOyAgLy8gVHJ1ZSB0byBzZXQgZGlzY292ZXJhYmxlIG9uLCBGYWxzZSB0byBzZXQgZGlzY292ZXJhYmxlIG9mZi4KLX0KLQotbWVzc2FnZSBEaXNjb3ZlcmFibGVSZXN1bHQgewotICBib29sIHJlc3VsdCA9IDE7ICAgLy8gVHJ1ZSBpZiBzdWNjZXNzZnVsLCBGYWxzZSBpZiB1bnN1Y2Nlc3NmdWwuCi0gIHN0cmluZyBlcnJvciA9IDI7ICAvLyBFcnJvciBtZXNzYWdlIGlmIHVuc3VjY2Vzc2Z1bC4KLX0KLQotbWVzc2FnZSBUYXJnZXRNYWNBZGRyZXNzIHsKLSAgc3RyaW5nIG1hY19hZGRyZXNzID0gMTsgIC8vIE1hYyBBZGRyZXNzIG9mIHRhcmdldCBkZXZpY2UuCi19Ci0KLW1lc3NhZ2UgUGFpckFuZENvbm5lY3RCbHVldG9vdGhSZXN1bHQgewotICBkb3VibGUgcGFpcmluZ190aW1lX3NlYyA9Ci0gICAgICAxOyAgLy8gVGhlIHRpbWUgaXQgdGFrZXMgaW4gc2Vjb25kcyB0byBwYWlyIHRoZSBkZXZpY2VzLgotICBkb3VibGUgY29ubmVjdGlvbl90aW1lX3NlYyA9Ci0gICAgICAyOyAgICAgICAgICAgICAvLyBUaGUgdGltZSBpdCB0YWtlcyBpbiBzZWNvbmRzIHRvIGNvbm5lY3QgdGhlIGRldmljZXMuCi0gIHN0cmluZyBlcnJvciA9IDM7ICAvLyBFcnJvciBtZXNzYWdlIGlmIHVuc3VjY2Vzc2Z1bC4KLX0KLQotc2VydmljZSBCbHVlYmVycnlEZXZpY2VDb250cm9sbGVyIHsKLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gYSByZXF1ZXN0IHRvIHNldCBkZXZpY2UgdG8gZGlzY292ZXJhYmxlLgotICBycGMgU2V0RGlzY292ZXJhYmxlTW9kZShEaXNjb3ZlcmFibGVNb2RlKSByZXR1cm5zIChEaXNjb3ZlcmFibGVSZXN1bHQpIHt9Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gYSByZXF1ZXN0IHRvIGNvbm5lY3QgdG8gYSB0YXJnZXQgZGV2aWNlLgotICBycGMgUGFpckFuZENvbm5lY3RCbHVldG9vdGgoVGFyZ2V0TWFjQWRkcmVzcykKLSAgICAgIHJldHVybnMgKFBhaXJBbmRDb25uZWN0Qmx1ZXRvb3RoUmVzdWx0KSB7fQotfQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3NhbXBsZV90ZXN0YmVkLnlhbWwgYi9ibHVlYmVycnkvc2FtcGxlX3Rlc3RiZWQueWFtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkYTM4NC4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvc2FtcGxlX3Rlc3RiZWQueWFtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVRlc3RCZWRzOgotICAtIE5hbWU6IFNhbXBsZVRlc3RCZWQKLSAgICBDb250cm9sbGVyczoKLSAgICAgIEFuZHJvaWREZXZpY2U6Ci0gICAgICAgIC0gc2VyaWFsOiA5NEdBWjAwQTVDCi0gICAgICAgICAgcGhvbmVfbnVtYmVyOiAxMjM0MTIzNAotICAgICAgRGVyaXZlZEJ0RGV2aWNlOgotICAgICAgICAtIE1vZHVsZU5hbWU6IGljbGV2ZXJfaGIwMQotICAgICAgICAgIENsYXNzTmFtZTogIEljbGV2ZXJIYjAxCi0gICAgICAgICAgUGFyYW1zOiAneyJjb25maWciOnsibWFjX2FkZHJlc3MiOiJDNDo0NTo2NzowMjo5NDpGMCIsImZpZm9faWQiOiJBSDA2SVZKUCIsImFyZHVpbm9fcG9ydCI6IjEifX0nCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvYTJkcC9ibHVldG9vdGhfYTJkcF90ZXN0LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2EyZHAvYmx1ZXRvb3RoX2EyZHBfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1NzhiZS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvYTJkcC9ibHVldG9vdGhfYTJkcF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLSMgTGludCBhczogcHl0aG9uMwotIiIiVGVzdHMgZm9yIEJsdWV0b290aCBBMkRQIGF1ZGlvIHN0cmVhbW1pbmcuIiIiCi0KLWltcG9ydCB0aW1lCi0KLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi0KLWZyb20gYmx1ZWJlcnJ5LmNvbnRyb2xsZXJzIGltcG9ydCBhbmRyb2lkX2J0X3RhcmdldF9kZXZpY2UKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBibHVlYmVycnlfYmFzZV90ZXN0Ci1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgYnRfYXVkaW9fdXRpbHMKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF9jb25zdGFudHMKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF90ZXN0X3V0aWxzCi0KLSMgTnVtYmVyIG9mIHNlY29uZHMgZm9yIEEyRFAgYXVkaW8gY2hlY2suCi1BMkRQX0FVRElPX0NIRUNLX1RJTUVPVVRfU0VDID0gMwotCi0jIE51bWJlciBvZiBzZWNvbmRzIGZvciBkdXJhdGlvbiBvZiByZWZlcmVuY2UgYXVkaW8uCi1SRUZFUkVOQ0VfQVVESU9fRFVSQVRJT05fU0VDID0gMS4wCi0KLSMgRGVmYXVsdCB0aHJlc2hvbGQgb2YgdGhlIG1lYW4gb3BpbmlvbiBzY29yZSAoTU9TKS4KLU1PU19USFJFU0hPTEQgPSA0LjUKLQotIyBUaGUgYXVkaW8gcGFyYW1ldGVycyBmb3IgY3JlYXRpbmcgYSBzaW5lIHdhdmUuCi1BVURJT19QQVJBTVMgPSB7Ci0gICAgJ2ZpbGVfcGF0aCc6ICcvc2RjYXJkL011c2ljJywKLSAgICAnZnJlcXVlbmN5JzogNDgwLAotICAgICdjaGFubmVsJzogMiwKLSAgICAnc2FtcGxlX3JhdGUnOiA0ODAwMCwKLSAgICAnc2FtcGxlX2Zvcm1hdCc6IDE2LAotICAgICdkdXJhdGlvbl9zZWMnOiA2MAotfQotCi0KLWNsYXNzIEJsdWV0b290aEEyZHBUZXN0KGJsdWViZXJyeV9iYXNlX3Rlc3QuQmx1ZWJlcnJ5QmFzZVRlc3QpOgotICAiIiJUZXN0IGNsYXNzIGZvciBCbHVldG9vdGggQTJEUCB0ZXN0LgotCi0gIFRoaXMgdGVzdCB1c2VzIGEgZml4ZWQgZnJlcXVlbmN5IHNpbmUgd2F2ZSB0byBiZSB0aGUgcmVmZXJlbmNlIGF1ZGlvLCBtYWtlcyBhCi0gIERVVCBwbGF5IHRoaXMgYXVkaW8gYW5kIHRoZW4gc3RhcnRzIGF1ZGlvIGNhcHR1cmUgZnJvbSBhIGNvbm5lY3RlZCBCbHVldG9vdGgKLSAgc2luayBkZXZpY2UsIG1lYXN1cmVzIG1lYW4gb3BpbmlvbiBzY29yZSAoTU9TKSBvZiB0aGUgcmVjb3JkZWQgYXVkaW8gYW5kCi0gIGNvbXBhcmVzIHRoZSBNT1Mgd2l0aCBhIHRocmVzaG9sZCB0byBkZXRlbWluZSB0aGUgdGVzdCByZXN1bHQuCi0gICIiIgotCi0gIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAiIiJTdGFuZGFyZCBNb2JseSBzZXR1cCBjbGFzcy4iIiIKLSAgICBzdXBlcihCbHVldG9vdGhBMmRwVGVzdCwgc2VsZikuc2V0dXBfY2xhc3MoKQotCi0gICAgIyBUaHJlc2hvbGQgb2YgdGhlIE1PUyB0byBkZXRlcm1pbmUgYSB0ZXN0IHJlc3VsdC4gRGVmYXVsdCB2YWx1ZSBpcyA0LjUuCi0gICAgc2VsZi50aHJlc2hvbGQgPSBmbG9hdChzZWxmLnVzZXJfcGFyYW1zLmdldCgnbW9zX3RocmVzaG9sZCcsIE1PU19USFJFU0hPTEQpKQotCi0gICAgc2VsZi5waG9uZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdCi0gICAgc2VsZi5waG9uZS5pbml0X3NldHVwKCkKLSAgICBzZWxmLnBob25lLnNsNGFfc2V0dXAoKQotCi0gICAgIyBHZW5lcmF0ZXMgYSBzaW5lIHdhdmUgdG8gYmUgcmVmZXJlbmNlIGF1ZGlvIGluIGNvbXBhcmlzb24sIGFuZCBwdXNoIGl0IHRvCi0gICAgIyB0aGUgcGhvbmUgc3RvcmFnZS4KLSAgICBzZWxmLmF1ZGlvX2ZpbGVfb25fZGV2aWNlLCBzZWxmLmF1ZGlvX2ZpbGVfb25faG9zdCA9ICgKLSAgICAgICAgYnRfYXVkaW9fdXRpbHMuZ2VuZXJhdGVfc2luZV93YXZlX3RvX2RldmljZSgKLSAgICAgICAgICAgIHNlbGYucGhvbmUsCi0gICAgICAgICAgICBBVURJT19QQVJBTVNbJ2ZpbGVfcGF0aCddLAotICAgICAgICAgICAgQVVESU9fUEFSQU1TWydmcmVxdWVuY3knXSwKLSAgICAgICAgICAgIEFVRElPX1BBUkFNU1snY2hhbm5lbCddLAotICAgICAgICAgICAgQVVESU9fUEFSQU1TWydzYW1wbGVfcmF0ZSddLAotICAgICAgICAgICAgQVVESU9fUEFSQU1TWydzYW1wbGVfZm9ybWF0J10sCi0gICAgICAgICAgICBBVURJT19QQVJBTVNbJ2R1cmF0aW9uX3NlYyddKQotICAgICAgICApCi0KLSAgICAjIFRyaW1zIHRoZSBhdWRpbyB0byAxIHNlY29uZCBkdXJhdGlvbiBmb3IgcmVmZXJlbmNlLgotICAgIHNlbGYucmVmZXJlbmNlX2F1ZGlvX2ZpbGUgPSBidF9hdWRpb191dGlscy50cmltX2F1ZGlvKAotICAgICAgICBhdWRpb19maWxlPXNlbGYuYXVkaW9fZmlsZV9vbl9ob3N0LAotICAgICAgICBkdXJhdGlvbl9zZWM9UkVGRVJFTkNFX0FVRElPX0RVUkFUSU9OX1NFQykKLQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlc1swXQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYWN0aXZhdGVfcGFpcmluZ19tb2RlKCkKLSAgICBzZWxmLm1hY19hZGRyZXNzID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5nZXRfYmx1ZXRvb3RoX21hY19hZGRyZXNzKCkKLSAgICBzZWxmLnBob25lLnBhaXJfYW5kX2Nvbm5lY3RfYmx1ZXRvb3RoKHNlbGYubWFjX2FkZHJlc3MpCi0KLSAgICAjIFNsZWVwIHVudGlsIHRoZSBjb25uZWN0aW9uIHN0YWJpbGl6ZXMuCi0gICAgdGltZS5zbGVlcCgzKQotCi0gICAgIyBBZGRzIHRoZSBwaG9uZSB0byBiZSB0aGUgc2Vjb25kYXJ5IGRldmljZSBpbiB0aGUgYW5kcm9pZC10by1hbmRyb2lkIGNhc2UuCi0gICAgaWYgaXNpbnN0YW5jZShzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgYW5kcm9pZF9idF90YXJnZXRfZGV2aWNlLkFuZHJvaWRCdFRhcmdldERldmljZSk6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmFkZF9zZWNfYWRfZGV2aWNlKHNlbGYucGhvbmUpCi0KLSAgZGVmIGFzc2VydF9hMmRwX2V4cGVjdGVkX3N0YXR1cyhzZWxmLCBpc19wbGF5aW5nLCBmYWlsX21zZyk6Ci0gICAgIiIiQXNzZXJ0cyB0aGF0IEEyRFAgYXVkaW8gaXMgaW4gdGhlIGV4cGVjdGVkIHN0YXR1cy4KLQotICAgIEFyZ3M6Ci0gICAgICBpc19wbGF5aW5nOiBib29sLCBUcnVlIGlmIEEyRFAgYXVkaW8gaXMgcGxheWluZyBhcyBleHBlY3RlZC4KLSAgICAgIGZhaWxfbXNnOiBzdHJpbmcsIGEgbWVzc2FnZSBleHBsYWluaW5nIHRoZSBkZXRhaWxzIG9mIHRlc3QgZmFpbHVyZS4KLSAgICAiIiIKLSAgICBidF90ZXN0X3V0aWxzLndhaXRfdW50aWwoCi0gICAgICAgIHRpbWVvdXRfc2VjPUEyRFBfQVVESU9fQ0hFQ0tfVElNRU9VVF9TRUMsCi0gICAgICAgIGNvbmRpdGlvbl9mdW5jPXNlbGYucGhvbmUubWJzLmJ0SXNBMmRwUGxheWluZywKLSAgICAgICAgZnVuY19hcmdzPVtzZWxmLm1hY19hZGRyZXNzXSwKLSAgICAgICAgZXhwZWN0ZWRfdmFsdWU9aXNfcGxheWluZywKLSAgICAgICAgZXhjZXB0aW9uPXNpZ25hbHMuVGVzdEZhaWx1cmUoZmFpbF9tc2cpKQotCi0gIGRlZiB0ZXN0X3BsYXlfYTJkcF9hdWRpbyhzZWxmKToKLSAgICAiIiJUZXN0IGZvciBwbGF5aW5nIEEyRFAgYXVkaW8gdGhyb3VnaCBCbHVldG9vdGguIiIiCi0KLSAgICAjIFBsYXlzIG1lZGlhIGF1ZGlvIGZyb20gdGhlIHBob25lLgotICAgIGF1ZGlvX2ZpbGVfdXJsID0gJ2ZpbGU6Ly8nICsgc2VsZi5hdWRpb19maWxlX29uX2RldmljZQotICAgIGlmIG5vdCBzZWxmLnBob25lLnNsNGEubWVkaWFQbGF5T3BlbihhdWRpb19maWxlX3VybCk6Ci0gICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAnRmFpbGVkIHRvIG9wZW4gYW5kIHBsYXkgIiVzIiBvbiB0aGUgcGhvbmUgIiVzIi4nICUKLSAgICAgICAgICAoc2VsZi5hdWRpb19maWxlX29uX2RldmljZSwgc2VsZi5waG9uZS5zZXJpYWwpKQotICAgIHNlbGYucGhvbmUuc2w0YS5tZWRpYVBsYXlTdGFydCgpCi0KLSAgICAjIFN0YXJ0cyBhdWRpbyBjYXB0dXJlIGZvciBCbHVldG9vdGggYXVkaW8gc3RyZWFtLgotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2Uuc3RhcnRfYXVkaW9fY2FwdHVyZSgpCi0KLSAgICAjIFN0b3BzIGF1ZGlvIGNhcHR1cmUgYW5kIGdlbmVyYXRlcyBhbiByZWNvcmRlZCBhdWRpbyBmaWxlLgotICAgIHJlY29yZGVkX2F1ZGlvX2ZpbGUgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnN0b3BfYXVkaW9fY2FwdHVyZSgpCi0gICAgc2VsZi5waG9uZS5zbDRhLm1lZGlhUGxheVN0b3AoKQotICAgIHNlbGYucGhvbmUuc2w0YS5tZWRpYVBsYXlDbG9zZSgpCi0KLSAgICAjIE1lYXN1cmVzIE1PUyBmb3IgdGhlIHJlY29yZGVkIGF1ZGlvLgotICAgIG1vcyA9IGJ0X2F1ZGlvX3V0aWxzLm1lYXN1cmVfYXVkaW9fbW9zKHJlY29yZGVkX2F1ZGlvX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZlcmVuY2VfYXVkaW9fZmlsZSkKLQotICAgICMgQXNzZXJ0cyB0aGF0IHRoZSBtZWFzdXJlZCBNT1Mgc2hvdWxkIGJlIG1vcmUgdGhhbiB0aGUgdGhyZXNob2xkLgotICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgIG1vcyA+PSBzZWxmLnRocmVzaG9sZCwKLSAgICAgICAgJ01PUyBvZiB0aGUgcmVjb3JkZWQgYXVkaW8gIiUuM2YiIGlzIGxvd2VyIHRoYW4gdGhlIHRocmVzaG9sZCAiJS4zZiIuJyAlCi0gICAgICAgIChtb3MsIHNlbGYudGhyZXNob2xkKSkKLQotICBkZWYgdGVzdF9yZXN1bWVfYTJkcF9hdWRpb19hZnRlcl9waG9uZV9jYWxsX2VuZGVkKHNlbGYpOgotICAgICIiIlRlc3QgZm9yIHJlc3VtaW5nIEEyRFAgYXVkaW8gYWZ0ZXIgYSBwaG9uZSBjYWxsIGVuZGVkLgotCi0gICAgVGVzdHMgdGhhdCBBMkRQIGF1ZGlvIGNhbiBiZSBwYXVzZWQgd2hlbiByZWNlaXZpbmcgYSBpbmNvbWluZyBwaG9uZSBjYWxsLAotICAgIGFuZCByZXN1bWVkIGFmdGVyIHRoaXMgcGhvbmUgY2FsbCBlbmRlZC4KLSAgICAiIiIKLSAgICAjIENoZWNrcyBpZiB0d28gYW5kcm9pZCBkZXZpY2UgZXhpc3QuCi0gICAgaWYgbGVuKHNlbGYuYW5kcm9pZF9kZXZpY2VzKSA8IDI6Ci0gICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcignVGhpcyB0ZXN0IHJlcXVpcmVzIHR3byBhbmRyb2lkIGRldmljZXMuJykKLSAgICBwcmlfcGhvbmUgPSBzZWxmLnBob25lCi0gICAgc2VjX3Bob25lID0gc2VsZi5hbmRyb2lkX2RldmljZXNbMV0KLSAgICBzZWNfcGhvbmUuaW5pdF9zZXR1cCgpCi0gICAgcHJpX251bWJlciA9IHByaV9waG9uZS5kaW1lbnNpb25zLmdldCgncGhvbmVfbnVtYmVyJykKLSAgICBpZiBub3QgcHJpX251bWJlcjoKLSAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKCdQbGVhc2Ugc2V0IHRoZSBkaW1lbnNpb24gInBob25lX251bWJlciIgdG8gdGhlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmltYXJ5IHBob25lLicpCi0gICAgc2VjX251bWJlciA9IHNlY19waG9uZS5kaW1lbnNpb25zLmdldCgncGhvbmVfbnVtYmVyJykKLSAgICBpZiBub3Qgc2VjX251bWJlcjoKLSAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKCdQbGVhc2Ugc2V0IHRoZSBkaW1lbnNpb24gInBob25lX251bWJlciIgdG8gdGhlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWNvbmRhcnkgcGhvbmUuJykKLQotICAgICMgUGxheXMgbWVkaWEgYXVkaW8gZnJvbSB0aGUgcGhvbmUuCi0gICAgYXVkaW9fZmlsZV91cmwgPSAnZmlsZTovLycgKyBzZWxmLmF1ZGlvX2ZpbGVfb25fZGV2aWNlCi0gICAgaWYgbm90IHNlbGYucGhvbmUuc2w0YS5tZWRpYVBsYXlPcGVuKGF1ZGlvX2ZpbGVfdXJsKToKLSAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKAotICAgICAgICAgICdGYWlsZWQgdG8gb3BlbiBhbmQgcGxheSAiJXMiIG9uIHRoZSBwaG9uZSAiJXMiLicgJQotICAgICAgICAgIChzZWxmLmF1ZGlvX2ZpbGVfb25fZGV2aWNlLCBzZWxmLnBob25lLnNlcmlhbCkpCi0gICAgc2VsZi5waG9uZS5zbDRhLm1lZGlhUGxheVN0YXJ0KCkKLQotICAgICMgQ2hlY2tzIGlmIEEyRFAgYXVkaW8gaXMgcGxheWluZy4KLSAgICBzZWxmLmFzc2VydF9hMmRwX2V4cGVjdGVkX3N0YXR1cygKLSAgICAgICAgaXNfcGxheWluZz1UcnVlLAotICAgICAgICBmYWlsX21zZz0nQTJEUCBhdWRpbyBpcyBub3QgcGxheWluZy4nKQotCi0gICAgdHJ5OgotICAgICAgIyBNYWtlcyBhIGluY29taW5nIHBob25lIGNhbGwuCi0gICAgICBzZWNfcGhvbmUuc2w0YS50ZWxlY29tQ2FsbE51bWJlcihwcmlfbnVtYmVyKQotICAgICAgc2VjX3Bob25lLmxvZy5pbmZvKCdNYWRlIGEgcGhvbmUgY2FsbCB0byBkZXZpY2UgIiVzIi4nICUgcHJpX3Bob25lLnNlcmlhbCkKLSAgICAgIHByaV9waG9uZS5sb2cuaW5mbygnV2FpdGluZyBmb3IgdGhlIGluY29taW5nIGNhbGwgZnJvbSBkZXZpY2UgIiVzIi4uLicKLSAgICAgICAgICAgICAgICAgICAgICAgICAlIHNlY19waG9uZS5zZXJpYWwpCi0KLSAgICAgIGlzX3JpbmdpbmcgPSBwcmlfcGhvbmUud2FpdF9mb3JfY2FsbF9zdGF0ZSgKLSAgICAgICAgICBidF9jb25zdGFudHMuQ0FMTF9TVEFURV9SSU5HSU5HLAotICAgICAgICAgIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1RJTUVPVVRfU0VDKQotICAgICAgaWYgbm90IGlzX3Jpbmdpbmc6Ci0gICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKAotICAgICAgICAgICAgJ1RpbWVkIG91dCBhZnRlciAlZHMgd2FpdGluZyBmb3IgdGhlIGluY29taW5nIGNhbGwgZnJvbSBkZXZpY2UgJwotICAgICAgICAgICAgJyIlcyIuJyAlIChidF9jb25zdGFudHMuQ0FMTF9TVEFURV9USU1FT1VUX1NFQywgc2VjX3Bob25lLnNlcmlhbCkpCi0KLSAgICAgICMgQ2hlY2tzIGlmIEEyRFAgYXVkaW8gaXMgcGF1c2VkLgotICAgICAgc2VsZi5hc3NlcnRfYTJkcF9leHBlY3RlZF9zdGF0dXMoCi0gICAgICAgICAgaXNfcGxheWluZz1GYWxzZSwKLSAgICAgICAgICBmYWlsX21zZz0nQTJEUCBhdWRpbyBpcyBub3QgcGF1c2VkIHdoZW4gcmVjZWl2aW5nIGEgcGhvbmUgY2FsbC4nKQotICAgIGZpbmFsbHk6Ci0gICAgICAjIEVuZHMgdGhlIGluY29taW5nIHBob25lIGNhbGwuCi0gICAgICBzZWNfcGhvbmUuc2w0YS50ZWxlY29tRW5kQ2FsbCgpCi0gICAgICBzZWNfcGhvbmUubG9nLmluZm8oJ0VuZGVkIHRoZSBwaG9uZSBjYWxsLicpCi0gICAgICBpc19pZGxlID0gcHJpX3Bob25lLndhaXRfZm9yX2NhbGxfc3RhdGUoCi0gICAgICAgICAgYnRfY29uc3RhbnRzLkNBTExfU1RBVEVfSURMRSwKLSAgICAgICAgICBidF9jb25zdGFudHMuQ0FMTF9TVEFURV9USU1FT1VUX1NFQykKLSAgICAgIGlmIG5vdCBpc19pZGxlOgotICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAgICdUaW1lZCBvdXQgYWZ0ZXIgJWRzIHdhaXRpbmcgZm9yIHRoZSBwaG9uZSBjYWxsIHRvIGJlIGVuZGVkLicgJQotICAgICAgICAgICAgYnRfY29uc3RhbnRzLkNBTExfU1RBVEVfVElNRU9VVF9TRUMpCi0KLSAgICAjIENoZWNrcyBpZiBBMkRQIGF1ZGlvIGlzIHJlc3VtZWQuCi0gICAgc2VsZi5hc3NlcnRfYTJkcF9leHBlY3RlZF9zdGF0dXMoCi0gICAgICAgIGlzX3BsYXlpbmc9VHJ1ZSwKLSAgICAgICAgZmFpbF9tc2c9J0EyRFAgYXVkaW8gaXMgbm90IHJlc3VtZWQgd2hlbiB0aGUgcGhvbmUgY2FsbCBpcyBlbmRlZC4nKQotCi0gICAgIyBTdGFydHMgYXVkaW8gY2FwdHVyZSBmb3IgQmx1ZXRvb3RoIGF1ZGlvIHN0cmVhbS4KLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnN0YXJ0X2F1ZGlvX2NhcHR1cmUoKQotCi0gICAgIyBTdG9wcyBhdWRpbyBjYXB0dXJlIGFuZCBnZW5lcmF0ZXMgYW4gcmVjb3JkZWQgYXVkaW8gZmlsZS4KLSAgICByZWNvcmRlZF9hdWRpb19maWxlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5zdG9wX2F1ZGlvX2NhcHR1cmUoKQotICAgIHByaV9waG9uZS5zbDRhLm1lZGlhUGxheVN0b3AoKQotICAgIHByaV9waG9uZS5zbDRhLm1lZGlhUGxheUNsb3NlKCkKLQotICAgICMgTWVhc3VyZXMgTU9TIGZvciB0aGUgcmVjb3JkZWQgYXVkaW8uCi0gICAgbW9zID0gYnRfYXVkaW9fdXRpbHMubWVhc3VyZV9hdWRpb19tb3MocmVjb3JkZWRfYXVkaW9fZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZmVyZW5jZV9hdWRpb19maWxlKQotCi0gICAgIyBBc3NlcnRzIHRoYXQgdGhlIG1lYXN1cmVkIE1PUyBzaG91bGQgYmUgbW9yZSB0aGFuIHRoZSB0aHJlc2hvbGQuCi0gICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgbW9zID49IHNlbGYudGhyZXNob2xkLAotICAgICAgICAnTU9TIG9mIHRoZSByZWNvcmRlZCBhdWRpbyAiJS4zZiIgaXMgbG93ZXIgdGhhbiB0aGUgdGhyZXNob2xkICIlLjNmIi4nICUKLSAgICAgICAgKG1vcywgc2VsZi50aHJlc2hvbGQpKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2F1ZGlvX2NhcHR1cmUvYmx1ZXRvb3RoX2F1ZGlvX2NhcHR1cmVfdGVzdC5weSBiL2JsdWViZXJyeS90ZXN0cy9hdWRpb19jYXB0dXJlL2JsdWV0b290aF9hdWRpb19jYXB0dXJlX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTg3MDUuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2F1ZGlvX2NhcHR1cmUvYmx1ZXRvb3RoX2F1ZGlvX2NhcHR1cmVfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSMgTGludCBhczogcHl0aG9uMwotIiIiVGVzdHMgZm9yIHRlc3RpbmcgYXVkaW8gY2FwdHVyZSBpbiBhbmRyb2lkIGJ0IHRhcmdldCBjb250cm9sbGVyLgotCi0gIGxvY2F0aW9uIG9mIHRoZSBjb250cm9sbGVyOgotICAgIGJsdWViZXJyeS5jb250cm9sbGVycy5hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2UKLSAgQmVmb3JlIHRoZSB0ZXN0LCB0aGUgbXVzaWMgZmlsZSBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgcHJpX3Bob25lLiBUaGUgYTJkcCBzaW5rIHBob25lIHNob3VsZCBiZSB3aXRoIHRoZSBhbmRyb2lkIGJ1aWxkIHRoYXQgY2FuCi0gIHN1cHBvcnQgYTJkcCBzaW5rIHByb2ZpbGUgKGZvciBleGFtcGxlLCB0aGUgZ2l0X21hc3Rlci1iZHMtZGV2KS4KLSIiIgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IHRpbWUKLQotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotZnJvbSBtb2JseSBpbXBvcnQgdGVzdF9ydW5uZXIKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBibHVlYmVycnlfYmFzZV90ZXN0Ci1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgYnRfdGVzdF91dGlscwotCi1NVVNJQ19GSUxFID0gJzFraHoud2F2JwotCi0KLWNsYXNzIEJsdWV0b290aEF1ZGlvQ2FwdHVyZVRlc3QoYmx1ZWJlcnJ5X2Jhc2VfdGVzdC5CbHVlYmVycnlCYXNlVGVzdCk6Ci0KLSAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICIiIlN0YW5kYXJkIE1vYmx5IHNldHVwIGNsYXNzLiIiIgotICAgIHN1cGVyKEJsdWV0b290aEF1ZGlvQ2FwdHVyZVRlc3QsIHNlbGYpLnNldHVwX2NsYXNzKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZXNbMF0KLSAgICBmb3IgZGV2aWNlIGluIHNlbGYuYW5kcm9pZF9kZXZpY2VzOgotICAgICAgZGV2aWNlLmluaXRfc2V0dXAoKQotICAgICAgZGV2aWNlLnNsNGFfc2V0dXAoKQotICAgIHNlbGYucHJpX3Bob25lID0gc2VsZi5hbmRyb2lkX2RldmljZXNbMF0KLSAgICBzZWxmLm1hY19hZGRyZXNzID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5nZXRfYmx1ZXRvb3RoX21hY19hZGRyZXNzKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmFjdGl2YXRlX3BhaXJpbmdfbW9kZSgpCi0gICAgc2VsZi5wcmlfcGhvbmUuc2w0YS5ibHVldG9vdGhEaXNjb3ZlckFuZEJvbmQoc2VsZi5tYWNfYWRkcmVzcykKLSAgICBzZWxmLnByaV9waG9uZS53YWl0X2Zvcl9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZi5tYWNfYWRkcmVzcykKLSAgICAjIEdpdmVzIG1vcmUgdGltZSBmb3IgdGhlIHBhaXJpbmcgYmV0d2VlbiB0aGUgcHJpX3Bob25lIGFuZCB0aGUKLSAgICAjIGRlcml2ZWRfYnRfZGV2aWNlICh0aGUgYW5kcm9pZCBidCB0YXJnZXQgZGV2aWNlKQotICAgIHRpbWUuc2xlZXAoMykKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmFkZF9zZWNfYWRfZGV2aWNlKHNlbGYucHJpX3Bob25lKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuZGlzY29ubmVjdF9hbGwoKQotICAgIHNlbGYuZHVyYXRpb24gPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmF1ZGlvX3BhcmFtc1snZHVyYXRpb24nXQotICAgIHNlbGYucmVjb3JkZWRfZHVyYXRpb24gPSAwCi0KLSAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgIiIiU2V0dXAgZm9yIGJsdWV0b290aCBsYXRlbmN5IHRlc3QuIiIiCi0gICAgbG9nZ2luZy5pbmZvKCdTZXR1cCBUZXN0IGZvciBhdWRpbyBjYXB0dXJlIHRlc3QnKQotICAgIHN1cGVyKEJsdWV0b290aEF1ZGlvQ2FwdHVyZVRlc3QsIHNlbGYpLnNldHVwX3Rlc3QoKQotICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5kZXJpdmVkX2J0X2RldmljZS5hMmRwX3NpbmtfY29ubmVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBlc3RhYmxpc2ggQTJkcCBTaW5rIGNvbm5lY3Rpb24nKQotCi0gIGRlZiB0ZXN0X2F1ZGlvX2NhcHR1cmUoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIGF1ZGlvIGNhcHR1cmUgZm9yIHRoZSBhbmRyb2lkIGJ0IHRhcmdldCBkZXZpY2UuIiIiCi0KLSAgICBtdXNpY19maWxlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5hdWRpb19wYXJhbXMuZ2V0KAotICAgICAgICAnbXVzaWNfZmlsZScsIE1VU0lDX0ZJTEUpCi0gICAgbXVzaWNfZmlsZSA9ICdmaWxlOi8vL3NkY2FyZC9NdXNpYy97fScuZm9ybWF0KG11c2ljX2ZpbGUpCi0gICAgc2VsZi5wcmlfcGhvbmUuc2w0YS5tZWRpYVBsYXlPcGVuKG11c2ljX2ZpbGUpCi0gICAgc2VsZi5wcmlfcGhvbmUuc2w0YS5tZWRpYVBsYXlTZXRMb29waW5nKCkKLSAgICBzZWxmLnByaV9waG9uZS5zbDRhLm1lZGlhUGxheVN0YXJ0KCkKLSAgICB0aW1lLnNsZWVwKDMpCi0gICAgc2VsZi5wcmlfcGhvbmUubG9nLmluZm8oc2VsZi5wcmlfcGhvbmUuc2w0YS5tZWRpYVBsYXlHZXRJbmZvKCkpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5zdGFydF9hdWRpb19jYXB0dXJlKCkKLSAgICB0aW1lLnNsZWVwKHNlbGYuZHVyYXRpb24pCi0gICAgYXVkaW9fY2FwdHVyZWQgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnN0b3BfYXVkaW9fY2FwdHVyZSgpCi0gICAgc2VsZi5wcmlfcGhvbmUuc2w0YS5tZWRpYVBsYXlTdG9wKCkKLSAgICBzZWxmLnByaV9waG9uZS5zbDRhLm1lZGlhUGxheUNsb3NlKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmxvZy5pbmZvKCdBdWRpbyBwbGF5IGFuZCByZWNvcmQgc3RvcHBlZCcpCi0gICAgc2VsZi5yZWNvcmRlZF9kdXJhdGlvbiA9IGJ0X3Rlc3RfdXRpbHMuZ2V0X2R1cmF0aW9uX3NlY29uZHMoYXVkaW9fY2FwdHVyZWQpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5sb2cuaW5mbygKLSAgICAgICAgJ1RoZSBjYXB0dXJlIGR1cmF0aW9uIGlzICVzIHMgYW5kIHRoZSByZWNvcmRlZCBkdXJhdGlvbiBpcyAlcyBzJywKLSAgICAgICAgc2VsZi5kdXJhdGlvbiwgc2VsZi5yZWNvcmRlZF9kdXJhdGlvbikKLQotICBkZWYgdGVhcmRvd25fY2xhc3Moc2VsZik6Ci0gICAgbG9nZ2luZy5pbmZvKCdGYWN0b3J5IHJlc2V0dGluZyBCbHVldG9vdGggb24gZGV2aWNlcy4nKQotICAgIHNlbGYucHJpX3Bob25lLmZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKCkKLSAgICBzdXBlcihCbHVldG9vdGhBdWRpb0NhcHR1cmVUZXN0LCBzZWxmKS50ZWFyZG93bl9jbGFzcygpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5zdG9wX2FsbF9zZXJ2aWNlcygpCi0gICAgc2VsZi5yZWNvcmRfZGF0YSh7Ci0gICAgICAgICdUZXN0IE5hbWUnOiAndGVzdF9hdWRpb19jYXB0dXJlJywKLSAgICAgICAgJ3Nwb25nZV9wcm9wZXJ0aWVzJzogewotICAgICAgICAgICAgJ2R1cmF0aW9uJzogc2VsZi5kdXJhdGlvbiwKLSAgICAgICAgICAgICdyZWNvcmRlZCBkdXJhdGlvbic6IHNlbGYucmVjb3JkZWRfZHVyYXRpb24KLSAgICAgICAgfQotICAgIH0pCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvYXZyY3AvYmx1ZXRvb3RoX2F2cmNwX3Rlc3QucHkgYi9ibHVlYmVycnkvdGVzdHMvYXZyY3AvYmx1ZXRvb3RoX2F2cmNwX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGZjZDkuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2F2cmNwL2JsdWV0b290aF9hdnJjcF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLSMgTGludCBhczogcHl0aG9uMwotIiIiVGVzdHMgZm9yIEFWUkNQIGJhc2ljIGZ1bmN0aW9uYWxpdHkuIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCi0KLWltcG9ydCB0aW1lCi0KLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi1mcm9tIG1vYmx5LmNvbnRyb2xsZXJzLmFuZHJvaWRfZGV2aWNlX2xpYiBpbXBvcnQgYWRiCi1mcm9tIGJsdWViZXJyeS5jb250cm9sbGVycyBpbXBvcnQgYW5kcm9pZF9idF90YXJnZXRfZGV2aWNlCi1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgYmx1ZWJlcnJ5X2Jhc2VfdGVzdAotZnJvbSBibHVlYmVycnkudXRpbHMgaW1wb3J0IGJ0X2NvbnN0YW50cwotCi0jIFRoZSBhdWRpbyBzb3VyY2UgcGF0aCBvZiBCbHVldG9vdGhNZWRpYVBsYXliYWNrIGluIHRoZSBTTDRBIGFwcC4KLUFORFJPSURfTUVESUFfUEFUSCA9ICcvc2RjYXJkL011c2ljL3Rlc3QnCi0KLSMgVGltZW91dCBmb3IgdHJhY2sgY2hhbmdlIGFuZCBwbGF5YmFjayBzdGF0ZSB1cGRhdGUgaW4gc2Vjb25kLgotTUVESUFfVVBEQVRFX1RJTUVPVVRfU0VDID0gMwotCi0KLWNsYXNzIEJsdWV0b290aEF2cmNwVGVzdChibHVlYmVycnlfYmFzZV90ZXN0LkJsdWViZXJyeUJhc2VUZXN0KToKLSAgIiIiVGVzdCBDbGFzcyBmb3IgQmx1ZXRvb3RoIEFWUkNQLgotCi0gIFRoaXMgdGVzdCByZXF1aXJlcyB0d28gb3IgbW9yZSBhdWRpbyBmaWxlcyBleGlzdCBpbiBwYXRoICIvc2RjYXJkL011c2ljL3Rlc3QiCi0gIG9uIHRoZSBwcmltYXJ5IGRldmljZSwgYW5kIGRldmljZSBjb250cm9sbGVycyBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBBUElzOgotICAgIDEuIHBsYXkoKQotICAgIDIuIHBhdXNlKCkKLSAgICAzLiB0cmFja19wcmV2aW91cygpCi0gICAgNC4gdHJhY2tfbmV4dCgpCi0gICIiIgotCi0gIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAiIiJTdGFuZGFyZCBNb2JseSBzZXR1cCBjbGFzcy4iIiIKLSAgICBzdXBlcihCbHVldG9vdGhBdnJjcFRlc3QsIHNlbGYpLnNldHVwX2NsYXNzKCkKLQotICAgIGZvciBkZXZpY2UgaW4gc2VsZi5hbmRyb2lkX2RldmljZXM6Ci0gICAgICBkZXZpY2UuaW5pdF9zZXR1cCgpCi0gICAgICBkZXZpY2Uuc2w0YV9zZXR1cCgpCi0KLSAgICAjIFRoZSBkZXZpY2Ugd2hpY2ggcm9sZSBpcyBBVlJDUCBUYXJnZXQgKFRHKS4KLSAgICBzZWxmLnByaV9kZXZpY2UgPSBzZWxmLmFuZHJvaWRfZGV2aWNlc1swXQotCi0gICAgaWYgbGVuKHNlbGYuYW5kcm9pZF9kZXZpY2VzKSA+IDEgYW5kIG5vdCBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlczoKLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UgPSBzZWxmLmFuZHJvaWRfZGV2aWNlc1sxXQotICAgIGVsc2U6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZXNbMF0KLQotICAgICMgQ2hlY2sgaWYgdGhlIGRlcml2ZWQgYnQgZGV2aWNlIGlzIGFuZHJvaWQgYnQgdGFyZ2V0IGRldmljZS4KLSAgICBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZSA9IGlzaW5zdGFuY2UoCi0gICAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UsIGFuZHJvaWRfYnRfdGFyZ2V0X2RldmljZS5BbmRyb2lkQnRUYXJnZXREZXZpY2UpCi0KLSAgICAjIENoZWNrIGlmIHRoZSBhdWRpbyBmaWxlcyBleGlzdCBvbiB0aGUgcHJpbWFyeSBkZXZpY2UuCi0gICAgdHJ5OgotICAgICAgc2VsZi5hdWRpb19maWxlcyA9IHNlbGYucHJpX2RldmljZS5hZGIuc2hlbGwoCi0gICAgICAgICAgJ2xzICVzJyAlIEFORFJPSURfTUVESUFfUEFUSCkuZGVjb2RlKCkuc3BsaXQoJ1xuJylbOi0xXQotICAgICAgaWYgbGVuKHNlbGYuYXVkaW9fZmlsZXMpIDwgMjoKLSAgICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoCi0gICAgICAgICAgICAnUGxlYXNlIHB1c2ggdHdvIG9yIG1vcmUgYXVkaW8gZmlsZXMgdG8gJXMgb24gdGhlIHByaW1hcnkgZGV2aWNlICcKLSAgICAgICAgICAgICciJXMiLicgJSAoQU5EUk9JRF9NRURJQV9QQVRILCBzZWxmLnByaV9kZXZpY2Uuc2VyaWFsKSkKLSAgICBleGNlcHQgYWRiLkFkYkVycm9yIGFzIGVycm9yOgotICAgICAgaWYgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknIGluIHN0cihlcnJvcik6Ci0gICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKAotICAgICAgICAgICAgJ05vIGRpcmVjdG9yeSAiJXMiIGZvdW5kIG9uIHRoZSBwcmltYXJ5IGRldmljZSAiJXMiLicgJQotICAgICAgICAgICAgKEFORFJPSURfTUVESUFfUEFUSCwgc2VsZi5wcmlfZGV2aWNlLnNlcmlhbCkpCi0gICAgICByYWlzZSBlcnJvcgotCi0gICAgc2VsZi5tYWNfYWRkcmVzcyA9IHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuZ2V0X2JsdWV0b290aF9tYWNfYWRkcmVzcygpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5hY3RpdmF0ZV9wYWlyaW5nX21vZGUoKQotICAgIHNlbGYucHJpX2RldmljZS5zZXRfdGFyZ2V0KHNlbGYuZGVyaXZlZF9idF9kZXZpY2UpCi0gICAgc2VsZi5wcmlfZGV2aWNlLnBhaXJfYW5kX2Nvbm5lY3RfYmx1ZXRvb3RoKHNlbGYubWFjX2FkZHJlc3MpCi0gICAgc2VsZi5wcmlfZGV2aWNlLmFsbG93X2V4dHJhX3Blcm1pc3Npb25zKCkKLSAgICAjIEdpdmVzIG1vcmUgdGltZSBmb3IgdGhlIHBhaXJpbmcgYmV0d2VlbiB0d28gZGV2aWNlcy4KLSAgICB0aW1lLnNsZWVwKDMpCi0KLSAgICBpZiBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZToKLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYWRkX3NlY19hZF9kZXZpY2Uoc2VsZi5wcmlfZGV2aWNlKQotCi0gICAgIyBTdGFydHMgQmx1ZXRvb3RoU0w0QUF1ZGlvU3JjTUJTIG9uIHRoZSBwaG9uZS4KLSAgICBpZiBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZToKLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuaW5pdF9hbWJzX2Zvcl9hdnJjcCgpCi0gICAgZWxzZToKLSAgICAgIHNlbGYucHJpX2RldmljZS5zbDRhLmJsdWV0b290aE1lZGlhUGhvbmVTTDRBTUJTU3RhcnQoKQotICAgICAgIyBXYWl0cyBmb3IgQmx1ZXRvb3RoU0w0QUF1ZGlvU3JjTUJTIHRvIGJlIGFjdGl2ZS4KLSAgICAgIHRpbWUuc2xlZXAoMSkKLSAgICAjIENoYW5nZXMgdGhlIHBsYXliYWNrIHN0YXRlIHRvIFBsYXlpbmcgaW4gb3JkZXIgdG8gb3RoZXIgTWVkaWEgcGFzc3Rocm91Z2gKLSAgICAjIGNvbW1hbmRzIGNhbiB3b3JrLgotICAgIHNlbGYucHJpX2RldmljZS5zbDRhLmJsdWV0b290aE1lZGlhSGFuZGxlTWVkaWFDb21tYW5kT25QaG9uZSgKLSAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9QTEFZKQotCi0gICAgIyBDb2xsZWN0cyBtZWRpYSBtZXRhZGF0YSBvZiBhbGwgdHJhY2tzLgotICAgIHNlbGYudHJhY2tzID0gW10KLSAgICBmb3IgXyBpbiByYW5nZShsZW4oc2VsZi5hdWRpb19maWxlcykpOgotICAgICAgc2VsZi50cmFja3MuYXBwZW5kKHNlbGYucHJpX2RldmljZS5nZXRfY3VycmVudF90cmFja19pbmZvKCkpCi0gICAgICBzZWxmLnByaV9kZXZpY2Uuc2w0YS5ibHVldG9vdGhNZWRpYUhhbmRsZU1lZGlhQ29tbWFuZE9uUGhvbmUoCi0gICAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX05FWFQpCi0gICAgc2VsZi5wcmlfZGV2aWNlLmxvZy5pbmZvKCdUcmFja3M6ICVzJyAlIHNlbGYudHJhY2tzKQotCi0gICAgIyBTZXRzIFBsYXliYWNrIHN0YXRlIHRvIFBhdXNlZCBhcyBkZWZhdWx0LgotICAgIHNlbGYucHJpX2RldmljZS5zbDRhLmJsdWV0b290aE1lZGlhSGFuZGxlTWVkaWFDb21tYW5kT25QaG9uZSgKLSAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9QQVVTRSkKLQotICBkZWYgdGVhcmRvd25fY2xhc3Moc2VsZik6Ci0gICAgIiIiVGVhcmRvd24gY2xhc3MgZm9yIGJsdWV0b290aCBhdnJjcCBtZWRpYSBwbGF5IHRlc3QuIiIiCi0gICAgc3VwZXIoQmx1ZXRvb3RoQXZyY3BUZXN0LCBzZWxmKS50ZWFyZG93bl9jbGFzcygpCi0gICAgIyBTdG9wcyBCbHVldG9vdGhTTDRBQXVkaW9TcmNNQlMgYWZ0ZXIgYWxsIHRlc3QgbWV0aG9kcyBmaW5pc2guCi0gICAgaWYgc2VsZi5pc19hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2U6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnN0b3BfYW1ic19mb3JfYXZyY3AoKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnByaV9kZXZpY2Uuc2w0YS5ibHVldG9vdGhNZWRpYVBob25lU0w0QU1CU1N0b3AoKQotCi0gIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICIiIlRlYXJkb3duIHRlc3QgZm9yIGJsdWV0b290aCBhdnJjcCBtZWRpYSBwbGF5IHRlc3QuIiIiCi0gICAgc3VwZXIoQmx1ZXRvb3RoQXZyY3BUZXN0LCBzZWxmKS50ZWFyZG93bl90ZXN0KCkKLSAgICAjIFNldHMgUGxheWJhY2sgc3RhdGUgdG8gUGF1c2VkIGFmdGVyIGEgdGVzdCBtZXRob2QgZmluaXNoZXMuCi0gICAgc2VsZi5wcmlfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoTWVkaWFIYW5kbGVNZWRpYUNvbW1hbmRPblBob25lKAotICAgICAgICBidF9jb25zdGFudHMuQ01EX01FRElBX1BBVVNFKQotCi0gIGRlZiB3YWl0X2Zvcl9tZWRpYV9pbmZvX3N5bmMoc2VsZik6Ci0gICAgIiIiV2FpdHMgZm9yIHN5bmMgTWVkaWEgaW5mb3JtYXRpb24gYmV0d2VlbiB0d28gc2lkZXMuCi0KLSAgICBXYWl0cyBmb3Igc3luYyB0aGUgY3VycmVudCBwbGF5YmFjayBzdGF0ZSBhbmQgTm93IHBsYXlpbmcgdHJhY2sgaW5mbyBmcm9tCi0gICAgdGhlIGFuZHJvaWQgYnQgdGFyZ2V0IGRldmljZSB0byB0aGUgcGhvbmUuCi0gICAgIiIiCi0gICAgIyBDaGVjayBpZiBQbGF5YmFjayBzdGF0ZSBpcyBzeW5jLgotICAgIGV4cGVjdGVkX3N0YXRlID0gc2VsZi5wcmlfZGV2aWNlLmdldF9jdXJyZW50X3BsYXliYWNrX3N0YXRlKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnZlcmlmeV9wbGF5YmFja19zdGF0ZV9jaGFuZ2VkKAotICAgICAgICBleHBlY3RlZF9zdGF0ZT1leHBlY3RlZF9zdGF0ZSwKLSAgICAgICAgZXhjZXB0aW9uPXNpZ25hbHMuVGVzdEVycm9yKAotICAgICAgICAgICAgJ1BsYXliYWNrIHN0YXRlIGlzIG5vdCBlcXVpdmFsZW50IGJldHdlZW4gdHdvIHNpZGVzLiAnCi0gICAgICAgICAgICAnIiVzIiAhPSAiJXMiJyAlCi0gICAgICAgICAgICAoc2VsZi5kZXJpdmVkX2J0X2RldmljZS5nZXRfY3VycmVudF9wbGF5YmFja19zdGF0ZSgpLAotICAgICAgICAgICAgIGV4cGVjdGVkX3N0YXRlKSkpCi0KLSAgICAjIENoZWNrIGlmIE5vdyBQbGF5aW5nIHRyYWNrIGlzIHN5bmMuCi0gICAgZXhwZWN0ZWRfdHJhY2sgPSBzZWxmLnByaV9kZXZpY2UuZ2V0X2N1cnJlbnRfdHJhY2tfaW5mbygpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS52ZXJpZnlfY3VycmVudF90cmFja19jaGFuZ2VkKAotICAgICAgICBleHBlY3RlZF90cmFjaz1leHBlY3RlZF90cmFjaywKLSAgICAgICAgZXhjZXB0aW9uPXNpZ25hbHMuVGVzdEVycm9yKAotICAgICAgICAgICAgJ05vdyBQbGF5aW5nIHRyYWNrIGlzIG5vdCBlcXVpdmFsZW50IGJldHdlZW4gdHdvIHNpZGVzLiAnCi0gICAgICAgICAgICAnIiVzIiAhPSAiJXMiJyAlCi0gICAgICAgICAgICAoc2VsZi5kZXJpdmVkX2J0X2RldmljZS5nZXRfY3VycmVudF90cmFja19pbmZvKCksIGV4cGVjdGVkX3RyYWNrKSkpCi0KLSAgZGVmIGV4ZWN1dGVfbWVkaWFfcGxheV9wYXVzZV90ZXN0X2xvZ2ljKHNlbGYsIGNvbW1hbmRfc2VuZGVyLCB0ZXN0X2NvbW1hbmQpOgotICAgICIiIkV4ZWN1dGVzIHRoZSB0ZXN0IGxvZ2ljIG9mIHRoZSBtZWRpYSBjb21tYW5kICJwbGF5IiBvciAicGF1c2UiLgotCi0gICAgU3RlcHM6Ci0gICAgICAxLiBDb3JyZWN0IHRoZSBwbGF5YmFjayBzdGF0ZSBpZiBuZWVkZWQuCi0gICAgICAyLiBTZW5kIGEgbWVkaWEgcGFzc3Rocm91Z2ggY29tbWFuZC4KLSAgICAgIDMuIFZlcmlmeSB0aGF0IHRoZSBwbGF5YmFjayBzdGF0ZSBpcyBjaGFuZ2VkIGZyb20gQVZSQ1AgVEcgYW5kIENULgotCi0gICAgQXJnczoKLSAgICAgIGNvbW1hbmRfc2VuZGVyOiBhIGRldmljZSBjb250cm9sbGVyIHNlbmRpbmcgdGhlIGNvbW1hbmQuCi0gICAgICB0ZXN0X2NvbW1hbmQ6IHN0cmluZywgdGhlIG1lZGlhIHBhc3N0aHJvdWdoIGNvbW1hbmQgZm9yIHRlc3RpbmcsIGVpdGhlcgotICAgICAgICAgICJwbGF5IiBvciAicGF1c2UiLgotCi0gICAgUmFpc2VzOgotICAgICAgc2lnbmFscy5UZXN0RXJyb3I6IHJhaXNlZCBpZiB0aGUgdGVzdCBjb21tYW5kIGlzIGludmFsaWQuCi0gICAgIiIiCi0gICAgIyBDaGVja3MgaWYgdGhlIHRlc3QgY29tbWFuZCBpcyB2YWxpZC4KLSAgICBpZiB0ZXN0X2NvbW1hbmQgbm90IGluIFtidF9jb25zdGFudHMuQ01EX01FRElBX1BMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9QQVVTRV06Ci0gICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAnQ29tbWFuZCAiJXMiIGlzIGludmFsaWQuIFRoZSB0ZXN0IGNvbW1hbmQgc2hvdWxkIGJlICIlcyIgb3IgIiVzIi4nICUKLSAgICAgICAgICAodGVzdF9jb21tYW5kLCBidF9jb25zdGFudHMuQ01EX01FRElBX1BMQVksCi0gICAgICAgICAgIGJ0X2NvbnN0YW50cy5DTURfTUVESUFfUEFVU0UpKQotCi0gICAgIyBNYWtlIHN1cmUgdGhlIHBsYXliYWNrIHN0YXRlIGlzIHBsYXlpbmcgaWYgdGVzdGluZyB0aGUgY29tbWFuZCAicGF1c2UiLgotICAgIGlmIChzZWxmLnByaV9kZXZpY2UuZ2V0X2N1cnJlbnRfcGxheWJhY2tfc3RhdGUoKSAhPQotICAgICAgICBidF9jb25zdGFudHMuU1RBVEVfUExBWUlORyBhbmQKLSAgICAgICAgdGVzdF9jb21tYW5kID09IGJ0X2NvbnN0YW50cy5DTURfTUVESUFfUEFVU0UpOgotICAgICAgc2VsZi5wcmlfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoTWVkaWFIYW5kbGVNZWRpYUNvbW1hbmRPblBob25lKAotICAgICAgICAgIGJ0X2NvbnN0YW50cy5DTURfTUVESUFfUExBWSkKLQotICAgICMgTWFrZXMgc3VyZSBNZWRpYSBpbmZvIGlzIHRoZSBzYW1lIGJldHdlZW4gdHdvIHNpZGVzLgotICAgIGlmIHNlbGYuaXNfYW5kcm9pZF9idF90YXJnZXRfZGV2aWNlOgotICAgICAgc2VsZi53YWl0X2Zvcl9tZWRpYV9pbmZvX3N5bmMoKQotICAgIHNlbGYucHJpX2RldmljZS5sb2cuaW5mbygKLSAgICAgICAgJ0N1cnJlbnQgcGxheWJhY2sgc3RhdGU6ICVzJyAlCi0gICAgICAgIHNlbGYucHJpX2RldmljZS5nZXRfY3VycmVudF9wbGF5YmFja19zdGF0ZSgpKQotCi0gICAgZXhwZWN0ZWRfc3RhdGUgPSBOb25lCi0gICAgaWYgdGVzdF9jb21tYW5kID09IGJ0X2NvbnN0YW50cy5DTURfTUVESUFfUExBWToKLSAgICAgIGNvbW1hbmRfc2VuZGVyLnBsYXkoKQotICAgICAgZXhwZWN0ZWRfc3RhdGUgPSBidF9jb25zdGFudHMuU1RBVEVfUExBWUlORwotICAgIGVsaWYgdGVzdF9jb21tYW5kID09IGJ0X2NvbnN0YW50cy5DTURfTUVESUFfUEFVU0U6Ci0gICAgICBjb21tYW5kX3NlbmRlci5wYXVzZSgpCi0gICAgICBleHBlY3RlZF9zdGF0ZSA9IGJ0X2NvbnN0YW50cy5TVEFURV9QQVVTRUQKLQotICAgICMgVmVyaWZ5IHRoYXQgdGhlIHBsYXliYWNrIHN0YXRlIGlzIGNoYW5nZWQuCi0gICAgc2VsZi5wcmlfZGV2aWNlLmxvZy5pbmZvKCdFeHBlY3RlZCBwbGF5YmFjayBzdGF0ZTogJXMnICUgZXhwZWN0ZWRfc3RhdGUpCi0gICAgZGV2aWNlX2NoZWNrX2xpc3QgPSBbc2VsZi5wcmlfZGV2aWNlXQotICAgICMgQ2hlY2sgdGhlIHBsYXliYWNrIHN0YXRlIGZyb20gdGhlIGFuZHJvaWQgYnQgdGFyZ2V0IGRldmljZS4KLSAgICBpZiBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZToKLSAgICAgIGRldmljZV9jaGVja19saXN0LmFwcGVuZChzZWxmLmRlcml2ZWRfYnRfZGV2aWNlKQotICAgIGZvciBkZXZpY2UgaW4gZGV2aWNlX2NoZWNrX2xpc3Q6Ci0gICAgICBkZXZpY2UudmVyaWZ5X3BsYXliYWNrX3N0YXRlX2NoYW5nZWQoCi0gICAgICAgICAgZXhwZWN0ZWRfc3RhdGU9ZXhwZWN0ZWRfc3RhdGUsCi0gICAgICAgICAgZXhjZXB0aW9uPXNpZ25hbHMuVGVzdEZhaWx1cmUoCi0gICAgICAgICAgICAgICdQbGF5YmFjayBzdGF0ZSBpcyBub3QgY2hhbmdlZCB0byAiJXMiIGZyb20gdGhlIGRldmljZSAiJXMiLiAnCi0gICAgICAgICAgICAgICdDdXJyZW50IHN0YXRlOiAlcycgJQotICAgICAgICAgICAgICAoZXhwZWN0ZWRfc3RhdGUsIGRldmljZS5zZXJpYWwsCi0gICAgICAgICAgICAgICBkZXZpY2UuZ2V0X2N1cnJlbnRfcGxheWJhY2tfc3RhdGUoKSkpKQotCi0gIGRlZiBleGVjdXRlX3NraXBfbmV4dF9wcmV2X3Rlc3RfbG9naWMoc2VsZiwgY29tbWFuZF9zZW5kZXIsIHRlc3RfY29tbWFuZCk6Ci0gICAgIiIiRXhlY3V0ZXMgdGhlIHRlc3QgbG9naWMgb2YgdGhlIG1lZGlhIGNvbW1hbmQgInNraXBOZXh0IiBvciAic2tpcFByZXYiLgotCi0gICAgU3RlcHM6Ci0gICAgICAxLiBDb3JyZWN0IHRoZSBOb3cgUGxheWluZyB0cmFjayBpZiBuZWVkZWQuCi0gICAgICAyLiBTZW5kIGEgbWVkaWEgcGFzc3Rocm91Z2ggY29tbWFuZC4KLSAgICAgIDMuIFZlcmlmeSB0aGF0IHRoZSBOb3cgUGxheWluZyB0cmFjayBpcyBjaGFuZ2VkIGZyb20gQVZSQ1AgVEcgYW5kIENULgotCi0gICAgQXJnczoKLSAgICAgIGNvbW1hbmRfc2VuZGVyOiBhIGRldmljZSBjb250cm9sbGVyIHNlbmRpbmcgdGhlIGNvbW1hbmQuCi0gICAgICB0ZXN0X2NvbW1hbmQ6IHN0cmluZywgdGhlIG1lZGlhIHBhc3N0aHJvdWdoIGNvbW1hbmQgZm9yIHRlc3RpbmcsIGVpdGhlcgotICAgICAgICAgICJza2lwTmV4dCIgb3IgInNraXBQcmV2Ii4KLQotICAgIFJhaXNlczoKLSAgICAgIHNpZ25hbHMuVGVzdEVycm9yOiByYWlzZWQgaWYgdGhlIHRlc3QgY29tbWFuZCBpcyBpbnZhbGlkLgotICAgICIiIgotICAgICMgQ2hlY2tzIGlmIHRoZSB0ZXN0IGNvbW1hbmQgaXMgdmFsaWQuCi0gICAgaWYgdGVzdF9jb21tYW5kIG5vdCBpbiBbYnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX05FWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX1BSRVZdOgotICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoCi0gICAgICAgICAgJ0NvbW1hbmQgIiVzIiBpcyBpbnZhbGlkLiBUaGUgdGVzdCBjb21tYW5kIHNob3VsZCBiZSAiJXMiIG9yICIlcyIuJyAlCi0gICAgICAgICAgKHRlc3RfY29tbWFuZCwgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX05FWFQsCi0gICAgICAgICAgIGJ0X2NvbnN0YW50cy5DTURfTUVESUFfU0tJUF9QUkVWKSkKLQotICAgICMgTWFrZSBzdXJlIHRoZSB0cmFjayBpbmRleCBpcyBub3QgMCBpZiB0ZXN0aW5nIHRoZSBjb21tYW5kICJza2lwUHJldiIuCi0gICAgaWYgKHNlbGYudHJhY2tzLmluZGV4KHNlbGYucHJpX2RldmljZS5nZXRfY3VycmVudF90cmFja19pbmZvKCkpID09IDAKLSAgICAgICAgYW5kIHRlc3RfY29tbWFuZCA9PSBidF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfUFJFVik6Ci0gICAgICBzZWxmLnByaV9kZXZpY2Uuc2w0YS5ibHVldG9vdGhNZWRpYUhhbmRsZU1lZGlhQ29tbWFuZE9uUGhvbmUoCi0gICAgICAgICAgYnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX05FWFQpCi0KLSAgICAjIE1ha2VzIHN1cmUgTWVkaWEgaW5mbyBpcyB0aGUgc2FtZSBiZXR3ZWVuIHR3byBzaWRlcy4KLSAgICBpZiBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZToKLSAgICAgIHNlbGYud2FpdF9mb3JfbWVkaWFfaW5mb19zeW5jKCkKLSAgICBjdXJyZW50X3RyYWNrID0gc2VsZi5wcmlfZGV2aWNlLmdldF9jdXJyZW50X3RyYWNrX2luZm8oKQotICAgIGN1cnJlbnRfaW5kZXggPSBzZWxmLnRyYWNrcy5pbmRleChjdXJyZW50X3RyYWNrKQotICAgIHNlbGYucHJpX2RldmljZS5sb2cuaW5mbygnQ3VycmVudCB0cmFjazogJXMnICUgY3VycmVudF90cmFjaykKLQotICAgIGV4cGVjdGVkX3RyYWNrID0gTm9uZQotICAgIGlmIHRlc3RfY29tbWFuZCA9PSBidF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfTkVYVDoKLSAgICAgIGNvbW1hbmRfc2VuZGVyLnRyYWNrX25leHQoKQotICAgICAgIyBJdCB3aWxsIHJldHVybiB0byB0aGUgZmlyc3QgdHJhY2sgYnkgc2tpcE5leHQgaWYgbm93IHBsYXlpbmcgaXMgdGhlIGxhc3QKLSAgICAgICMgdHJhY2suCi0gICAgICBpZiBjdXJyZW50X2luZGV4ICsgMSA9PSBsZW4oc2VsZi50cmFja3MpOgotICAgICAgICBleHBlY3RlZF90cmFjayA9IHNlbGYudHJhY2tzWzBdCi0gICAgICBlbHNlOgotICAgICAgICBleHBlY3RlZF90cmFjayA9IHNlbGYudHJhY2tzW2N1cnJlbnRfaW5kZXggKyAxXQotICAgIGVsaWYgdGVzdF9jb21tYW5kID09IGJ0X2NvbnN0YW50cy5DTURfTUVESUFfU0tJUF9QUkVWOgotICAgICAgY29tbWFuZF9zZW5kZXIudHJhY2tfcHJldmlvdXMoKQotICAgICAgZXhwZWN0ZWRfdHJhY2sgPSBzZWxmLnRyYWNrc1tjdXJyZW50X2luZGV4IC0gMV0KLQotICAgICMgVmVyaWZ5IHRoYXQgdGhlIG5vdyBwbGF5aW5nIHRyYWNrIGlzIGNoYW5nZWQuCi0gICAgc2VsZi5wcmlfZGV2aWNlLmxvZy5pbmZvKCdFeHBlY3RlZCB0cmFjazogJXMnICUgZXhwZWN0ZWRfdHJhY2spCi0gICAgZGV2aWNlX2NoZWNrX2xpc3QgPSBbc2VsZi5wcmlfZGV2aWNlXQotICAgICMgQ2hlY2sgdGhlIHBsYXliYWNrIHN0YXRlIGZyb20gdGhlIGFuZHJvaWQgYnQgdGFyZ2V0IGRldmljZS4KLSAgICBpZiBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZToKLSAgICAgIGRldmljZV9jaGVja19saXN0LmFwcGVuZChzZWxmLmRlcml2ZWRfYnRfZGV2aWNlKQotICAgIGZvciBkZXZpY2UgaW4gZGV2aWNlX2NoZWNrX2xpc3Q6Ci0gICAgICBkZXZpY2UudmVyaWZ5X2N1cnJlbnRfdHJhY2tfY2hhbmdlZCgKLSAgICAgICAgICBleHBlY3RlZF90cmFjaz1leHBlY3RlZF90cmFjaywKLSAgICAgICAgICBleGNlcHRpb249c2lnbmFscy5UZXN0RmFpbHVyZSgKLSAgICAgICAgICAgICAgJ05vdyBQbGF5aW5nIHRyYWNrIGlzIG5vdCBjaGFuZ2VkIHRvICIlcyIgZnJvbSB0aGUgZGV2aWNlICIlcyIuICcKLSAgICAgICAgICAgICAgJ0N1cnJlbnQgdHJhY2s6ICVzJyAlCi0gICAgICAgICAgICAgIChleHBlY3RlZF90cmFjaywgZGV2aWNlLnNlcmlhbCwgZGV2aWNlLmdldF9jdXJyZW50X3RyYWNrX2luZm8oKSkpKQotCi0gIGRlZiB0ZXN0X21lZGlhX3BhdXNlKHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSBtZWRpYSBwYXVzZSBmcm9tIEFWUkNQIENvbnRyb2xsZXIuIiIiCi0gICAgc2VsZi5leGVjdXRlX21lZGlhX3BsYXlfcGF1c2VfdGVzdF9sb2dpYygKLSAgICAgICAgY29tbWFuZF9zZW5kZXI9c2VsZi5kZXJpdmVkX2J0X2RldmljZSwKLSAgICAgICAgdGVzdF9jb21tYW5kPWJ0X2NvbnN0YW50cy5DTURfTUVESUFfUEFVU0UpCi0KLSAgZGVmIHRlc3RfbWVkaWFfcGxheShzZWxmKToKLSAgICAiIiJUZXN0cyB0aGUgbWVkaWEgcGxheSBmcm9tIEFWUkNQIENvbnRyb2xsZXIuIiIiCi0gICAgc2VsZi5leGVjdXRlX21lZGlhX3BsYXlfcGF1c2VfdGVzdF9sb2dpYygKLSAgICAgICAgY29tbWFuZF9zZW5kZXI9c2VsZi5kZXJpdmVkX2J0X2RldmljZSwKLSAgICAgICAgdGVzdF9jb21tYW5kPWJ0X2NvbnN0YW50cy5DTURfTUVESUFfUExBWSkKLQotICBkZWYgdGVzdF9tZWRpYV9za2lwX3ByZXYoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIG1lZGlhIHNraXAgcHJldiBmcm9tIEFWUkNQIENvbnRyb2xsZXIuIiIiCi0gICAgc2VsZi5leGVjdXRlX3NraXBfbmV4dF9wcmV2X3Rlc3RfbG9naWMoCi0gICAgICAgIGNvbW1hbmRfc2VuZGVyPXNlbGYuZGVyaXZlZF9idF9kZXZpY2UsCi0gICAgICAgIHRlc3RfY29tbWFuZD1idF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfUFJFVikKLQotICBkZWYgdGVzdF9tZWRpYV9za2lwX25leHQoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIG1lZGlhIHNraXAgbmV4dCBmcm9tIEFWUkNQIENvbnRyb2xsZXIuIiIiCi0gICAgc2VsZi5leGVjdXRlX3NraXBfbmV4dF9wcmV2X3Rlc3RfbG9naWMoCi0gICAgICAgIGNvbW1hbmRfc2VuZGVyPXNlbGYuZGVyaXZlZF9idF9kZXZpY2UsCi0gICAgICAgIHRlc3RfY29tbWFuZD1idF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfTkVYVCkKLQotICBkZWYgdGVzdF9tZWRpYV9wYXVzZV9mcm9tX3Bob25lKHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSBtZWRpYSBwYXVzZSBmcm9tIEFWUkNQIFRhcmdldC4KLQotICAgIFRlc3RzIHRoYXQgUGxheWJhY2sgc3RhdGUgb2YgQVZSQ1AgQ29udHJvbGxlciB3aWxsIGJlIGNoYW5nZWQgdG8gcGF1c2VkIHdoZW4KLSAgICBBVlJDUCBUYXJnZXQgc2VuZHMgdGhlIGNvbW1hbmQgInBhdXNlIi4KLSAgICAiIiIKLSAgICBpZiBub3Qgc2VsZi5pc19hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2U6Ci0gICAgICBzaWduYWxzLlRlc3RFcnJvcignVGhlIHRlc3QgcmVxdWlyZXMgYW4gYW5kcm9pZCBidCB0YXJnZXQgZGV2aWNlLicpCi0KLSAgICBzZWxmLmV4ZWN1dGVfbWVkaWFfcGxheV9wYXVzZV90ZXN0X2xvZ2ljKAotICAgICAgICBjb21tYW5kX3NlbmRlcj1zZWxmLnByaV9kZXZpY2UsCi0gICAgICAgIHRlc3RfY29tbWFuZD1idF9jb25zdGFudHMuQ01EX01FRElBX1BBVVNFKQotCi0gIGRlZiB0ZXN0X21lZGlhX3BsYXlfZnJvbV9waG9uZShzZWxmKToKLSAgICAiIiJUZXN0cyB0aGUgbWVkaWEgcGxheSBmcm9tIEFWUkNQIFRhcmdldC4KLQotICAgIFRlc3RzIHRoYXQgUGxheWJhY2sgc3RhdGUgb2YgQVZSQ1AgQ29udHJvbGxlciB3aWxsIGJlIGNoYW5nZWQgdG8gcGxheWluZwotICAgIHdoZW4gQVZSQ1AgVGFyZ2V0IHNlbmRzIHRoZSBjb21tYW5kICJwbGF5Ii4KLSAgICAiIiIKLSAgICBpZiBub3Qgc2VsZi5pc19hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2U6Ci0gICAgICBzaWduYWxzLlRlc3RFcnJvcignVGhlIHRlc3QgcmVxdWlyZXMgYW4gYW5kcm9pZCBidCB0YXJnZXQgZGV2aWNlLicpCi0KLSAgICBzZWxmLmV4ZWN1dGVfbWVkaWFfcGxheV9wYXVzZV90ZXN0X2xvZ2ljKAotICAgICAgICBjb21tYW5kX3NlbmRlcj1zZWxmLnByaV9kZXZpY2UsCi0gICAgICAgIHRlc3RfY29tbWFuZD1idF9jb25zdGFudHMuQ01EX01FRElBX1BMQVkpCi0KLSAgZGVmIHRlc3RfbWVkaWFfc2tpcF9wcmV2X2Zyb21fcGhvbmUoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIG1lZGlhIHNraXAgcHJldiBmcm9tIEFWUkNQIFRhcmdldC4KLQotICAgIFRlc3RzIHRoYXQgTm93IFBsYXlpbmcgdHJhY2sgb2YgQVZSQ1AgQ29udHJvbGxlciB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlCi0gICAgcHJldmlvdXMgdHJhY2sgd2hlbiBBVlJDUCBUYXJnZXQgc2VuZHMgdGhlIGNvbW1hbmQgInNraXBQcmV2Ii4KLSAgICAiIiIKLSAgICBpZiBub3Qgc2VsZi5pc19hbmRyb2lkX2J0X3RhcmdldF9kZXZpY2U6Ci0gICAgICBzaWduYWxzLlRlc3RFcnJvcignVGhlIHRlc3QgcmVxdWlyZXMgYW4gYW5kcm9pZCBidCB0YXJnZXQgZGV2aWNlLicpCi0KLSAgICBzZWxmLmV4ZWN1dGVfc2tpcF9uZXh0X3ByZXZfdGVzdF9sb2dpYygKLSAgICAgICAgY29tbWFuZF9zZW5kZXI9c2VsZi5wcmlfZGV2aWNlLAotICAgICAgICB0ZXN0X2NvbW1hbmQ9YnRfY29uc3RhbnRzLkNNRF9NRURJQV9TS0lQX1BSRVYpCi0KLSAgZGVmIHRlc3RfbWVkaWFfc2tpcF9uZXh0X2Zyb21fcGhvbmUoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIG1lZGlhIHNraXAgbmV4dCBmcm9tIEFWUkNQIFRhcmdldC4KLQotICAgIFRlc3RzIHRoYXQgTm93IFBsYXlpbmcgdHJhY2sgb2YgQVZSQ1AgQ29udHJvbGxlciB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlIG5leHQKLSAgICB0cmFjayB3aGVuIEFWUkNQIFRhcmdldCBzZW5kcyB0aGUgY29tbWFuZCAic2tpcE5leHQiLgotICAgICIiIgotICAgIGlmIG5vdCBzZWxmLmlzX2FuZHJvaWRfYnRfdGFyZ2V0X2RldmljZToKLSAgICAgIHNpZ25hbHMuVGVzdEVycm9yKCdUaGUgdGVzdCByZXF1aXJlcyBhbiBhbmRyb2lkIGJ0IHRhcmdldCBkZXZpY2UuJykKLQotICAgIHNlbGYuZXhlY3V0ZV9za2lwX25leHRfcHJldl90ZXN0X2xvZ2ljKAotICAgICAgICBjb21tYW5kX3NlbmRlcj1zZWxmLnByaV9kZXZpY2UsCi0gICAgICAgIHRlc3RfY29tbWFuZD1idF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfTkVYVCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9jb25uZWN0aXZpdHkvYmx1ZXRvb3RoX2Nvbm5lY3Rpb25fdGVzdC5weSBiL2JsdWViZXJyeS90ZXN0cy9jb25uZWN0aXZpdHkvYmx1ZXRvb3RoX2Nvbm5lY3Rpb25fdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YWYzOC4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvY29ubmVjdGl2aXR5L2JsdWV0b290aF9jb25uZWN0aW9uX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0iIiJUZXN0cyBmb3IgQmx1ZXRvb3RoIGNvbm5lY3Rpb24gd2l0aCBBbmRyb2lkIGRldmljZSBhbmQgYSBCbHVldG9vdGggZGV2aWNlLiIiIgotCi1pbXBvcnQgdGltZQotCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotZnJvbSBibHVlYmVycnkudXRpbHMgaW1wb3J0IGJsdWViZXJyeV9iYXNlX3Rlc3QKLQotIyBDb25uZWN0aW9uIHN0YXRlIGNoYW5nZSBzbGVlcCB0aW1lIGluIHNlY29uZHMuCi1DT05ORUNUSU9OX1NUQVRFX0NIQU5HRV9TTEVFUF9TRUMgPSA1Ci0KLQotY2xhc3MgQmx1ZXRvb3RoQ29ubmVjdGlvblRlc3QoYmx1ZWJlcnJ5X2Jhc2VfdGVzdC5CbHVlYmVycnlCYXNlVGVzdCk6Ci0gICIiIlRlc3QgQ2xhc3MgZm9yIEJsdWV0b290aCBjb25uZWN0aW9uIHRlc3RpbmcuCi0KLSAgQXR0cmlidXRlczoKLSAgICBwcmltYXJ5X2RldmljZTogQSBwcmltYXJ5IGRldmljZSB1bmRlciB0ZXN0LgotICAgIGRlcml2ZWRfYnRfZGV2aWNlOiBBIEJsdWV0b290aCBkZXZpY2Ugd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0ZWQgdG8gdGhlCi0gICAgICAgIHByaW1hcnkgZGV2aWNlIGluIHRoZSB0ZXN0LgotICAiIiIKLQotICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgc3VwZXIoKS5zZXR1cF9jbGFzcygpCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS5pbml0X3NldHVwKCkKLQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlc1swXQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoKQotICAgIHNlbGYubWFjX2FkZHJlc3MgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmdldF9ibHVldG9vdGhfbWFjX2FkZHJlc3MoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYWN0aXZhdGVfcGFpcmluZ19tb2RlKCkKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLnBhaXJfYW5kX2Nvbm5lY3RfYmx1ZXRvb3RoKHNlbGYubWFjX2FkZHJlc3MpCi0KLSAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgc3VwZXIoKS5zZXR1cF90ZXN0KCkKLSAgICAjIENoZWNrcyBpZiBBMkRQIGFuZCBIU1AgcHJvZmlsZXMgYXJlIGNvbm5lY3RlZC4KLSAgICBzZWxmLndhaXRfZm9yX2EyZHBfYW5kX2hzcF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3RlZD1UcnVlKQotICAgICMgQnVmZmVyIGJldHdlZW4gdGVzdHMuCi0gICAgdGltZS5zbGVlcChDT05ORUNUSU9OX1NUQVRFX0NIQU5HRV9TTEVFUF9TRUMpCi0KLSAgZGVmIHdhaXRfZm9yX2EyZHBfYW5kX2hzcF9jb25uZWN0aW9uX3N0YXRlKHNlbGYsIGNvbm5lY3RlZCk6Ci0gICAgIiIiQXNzZXJ0cyB0aGF0IEEyRFAgYW5kIEhTUCBjb25uZWN0aW9ucyBhcmUgaW4gdGhlIGV4cGVjdGVkIHN0YXRlLgotCi0gICAgQXJnczoKLSAgICAgIGNvbm5lY3RlZDogYm9vbCwgVHJ1ZSBpZiB0aGUgZXhwZWN0ZWQgc3RhdGUgaXMgY29ubmVjdGVkIGVsc2UgRmFsc2UuCi0gICAgIiIiCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS53YWl0X2Zvcl9hMmRwX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZi5tYWNfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQpCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS53YWl0X2Zvcl9oc3BfY29ubmVjdGlvbl9zdGF0ZShzZWxmLm1hY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkKQotCi0gIGRlZiB0ZXN0X2Rpc2Nvbm5lY3RfYW5kX2Nvbm5lY3Qoc2VsZik6Ci0gICAgIiIiVGVzdCBmb3IgRFVUIGRpc2Nvbm5lY3RpbmcgYW5kIHRoZW4gY29ubmVjdGluZyB0byB0aGUgcmVtb3RlIGRldmljZS4iIiIKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLmxvZy5pbmZvKCdEaXNjb25uZWN0aW5nIHRoZSBkZXZpY2UgIiVzIi4uLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNfYWRkcmVzcykKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLmRpc2Nvbm5lY3RfYmx1ZXRvb3RoKHNlbGYubWFjX2FkZHJlc3MpCi0gICAgc2VsZi53YWl0X2Zvcl9hMmRwX2FuZF9oc3BfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0ZWQ9RmFsc2UpCi0gICAgIyBCdWZmZXIgdGltZSBmb3IgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UuCi0gICAgdGltZS5zbGVlcChDT05ORUNUSU9OX1NUQVRFX0NIQU5HRV9TTEVFUF9TRUMpCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS5sb2cuaW5mbygnQ29ubmVjdGluZyB0aGUgZGV2aWNlICIlcyIuLi4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFjX2FkZHJlc3MpCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS5jb25uZWN0X2JsdWV0b290aChzZWxmLm1hY19hZGRyZXNzKQotICAgIHNlbGYud2FpdF9mb3JfYTJkcF9hbmRfaHNwX2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGVkPVRydWUpCi0KLSAgZGVmIHRlc3RfcmVjb25uZWN0X3doZW5fZW5hYmxpbmdfYmx1ZXRvb3RoKHNlbGYpOgotICAgICIiIlRlc3QgZm9yIERVVCByZWNvbm5lY3RpbmcgdG8gdGhlIHJlbW90ZSBkZXZpY2Ugd2hlbiBCbHVldG9vdGggZW5hYmxlZC4iIiIKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLmxvZy5pbmZvKCdUdXJuaW5nIG9mZiBCbHVldG9vdGguLi4nKQotICAgIHNlbGYucHJpbWFyeV9kZXZpY2Uuc2w0YS5ibHVldG9vdGhUb2dnbGVTdGF0ZShGYWxzZSkKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLndhaXRfZm9yX2JsdWV0b290aF90b2dnbGVfc3RhdGUoZW5hYmxlZD1GYWxzZSkKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLndhaXRfZm9yX2Rpc2Nvbm5lY3Rpb25fc3VjY2VzcyhzZWxmLm1hY19hZGRyZXNzKQotICAgIHRpbWUuc2xlZXAoQ09OTkVDVElPTl9TVEFURV9DSEFOR0VfU0xFRVBfU0VDKQotICAgIHNlbGYucHJpbWFyeV9kZXZpY2UubG9nLmluZm8oJ1R1cm5pbmcgb24gQmx1ZXRvb3RoLi4uJykKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoVG9nZ2xlU3RhdGUoVHJ1ZSkKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLndhaXRfZm9yX2JsdWV0b290aF90b2dnbGVfc3RhdGUoZW5hYmxlZD1UcnVlKQotICAgIHNlbGYucHJpbWFyeV9kZXZpY2Uud2FpdF9mb3JfY29ubmVjdGlvbl9zdWNjZXNzKHNlbGYubWFjX2FkZHJlc3MpCi0gICAgc2VsZi53YWl0X2Zvcl9hMmRwX2FuZF9oc3BfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0ZWQ9VHJ1ZSkKLQotICBkZWYgdGVzdF9yZWNvbm5lY3Rfd2hlbl9jb25uZWN0ZWRfZGV2aWNlX3Bvd2VyZWRfb24oc2VsZik6Ci0gICAgIiIiVGVzdCBmb3IgdGhlIHJlbW90ZSBkZXZpY2UgcmVjb25uZWN0aW5nIHRvIERVVC4KLQotICAgIFRlc3RzIHRoYXQgRFVUIGNhbiBiZSBkaXNjb25uZWN0ZWQgd2hlbiB0aGUgcmVtb3RlZCBkZXZpY2UgaXMgcG93ZXJkIG9mZiwKLSAgICBhbmQgdGhlbiByZWNvbm5lY3RlZCB3aGVuIHRoZSByZW1vdGUgZGV2aWNlIGlzIHBvd2VyZWQgb24uCi0gICAgIiIiCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS5sb2cuaW5mbygKLSAgICAgICAgJ1RoZSBjb25uZWN0ZWQgZGV2aWNlICIlcyIgaXMgYmVpbmcgcG93ZXJlZCBvZmYuLi4nICUgc2VsZi5tYWNfYWRkcmVzcykKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnBvd2VyX29mZigpCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS53YWl0X2Zvcl9kaXNjb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZi5tYWNfYWRkcmVzcykKLSAgICBzZWxmLndhaXRfZm9yX2EyZHBfYW5kX2hzcF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3RlZD1GYWxzZSkKLSAgICB0aW1lLnNsZWVwKENPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFX1NMRUVQX1NFQykKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnBvd2VyX29uKCkKLSAgICBzZWxmLnByaW1hcnlfZGV2aWNlLmxvZy5pbmZvKAotICAgICAgICAnVGhlIGNvbm5lY3RlZCBkZXZpY2UgIiVzIiBpcyBiZWluZyBwb3dlcmVkIG9uLi4uJyAlIHNlbGYubWFjX2FkZHJlc3MpCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZS53YWl0X2Zvcl9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZi5tYWNfYWRkcmVzcykKLSAgICBzZWxmLndhaXRfZm9yX2EyZHBfYW5kX2hzcF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3RlZD1UcnVlKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2Nvbm5lY3Rpdml0eS9ibHVldG9vdGhfbGF0ZW5jeV90ZXN0LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2Nvbm5lY3Rpdml0eS9ibHVldG9vdGhfbGF0ZW5jeV90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmFjYmRjLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9jb25uZWN0aXZpdHkvYmx1ZXRvb3RoX2xhdGVuY3lfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0jIExpbnQgYXM6IHB5dGhvbjMKLSIiIlRlc3RzIGZvciBibHVlYmVycnkudGVzdHMuYmx1ZXRvb3RoLmJsdWV0b290aF9sYXRlbmN5LiIiIgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG1hdGgKLWltcG9ydCByYW5kb20KLWltcG9ydCBzdHJpbmcKLWltcG9ydCB0aW1lCi0KLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi1mcm9tIG1vYmx5LnNpZ25hbHMgaW1wb3J0IFRlc3RBYm9ydENsYXNzCi0jIEludGVybmFsIGltcG9ydAotZnJvbSBibHVlYmVycnkudXRpbHMgaW1wb3J0IGJsdWViZXJyeV9iYXNlX3Rlc3QKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF90ZXN0X3V0aWxzCi1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgbWV0cmljc191dGlscwotIyBJbnRlcm5hbCBpbXBvcnQKLQotCi1jbGFzcyBCbHVldG9vdGhMYXRlbmN5VGVzdChibHVlYmVycnlfYmFzZV90ZXN0LkJsdWViZXJyeUJhc2VUZXN0KToKLQotICBAcmV0cnkubG9nZ2VkX3JldHJ5X29uX2V4Y2VwdGlvbigKLSAgICAgIHJldHJ5X2ludGVydmFscz1yZXRyeS5GdXp6ZWRFeHBvbmVudGlhbEludGVydmFscygKLSAgICAgICAgICBpbml0aWFsX2RlbGF5X3NlYz0yLCBmYWN0b3I9NSwgbnVtX3JldHJpZXM9NSwgbWF4X2RlbGF5X3NlYz0zMDApKQotICBkZWYgX21lYXN1cmVfbGF0ZW5jeShzZWxmKToKLSAgICAiIiJNZWFzdXJlcyB0aGUgbGF0ZW5jeSBvZiBkYXRhIHRyYW5zZmVyIG92ZXIgUkZDT01NLgotCi0gICAgU2VuZHMgZGF0YSBmcm9tIHRoZSBjbGllbnQgZGV2aWNlIHRoYXQgaXMgcmVhZCBieSB0aGUgc2VydmVyIGRldmljZS4KLSAgICBDYWxjdWxhdGVzIHRoZSBsYXRlbmN5IG9mIHRoZSB0cmFuc2Zlci4KLQotICAgIFJldHVybnM6Ci0gICAgICAgIFRoZSBsYXRlbmN5IG9mIHRoZSB0cmFuc2ZlciBtaWxsaXNlY29uZHMuCi0gICAgIiIiCi0KLSAgICAjIEdlbmVyYXRlcyBhIHJhbmRvbSBtZXNzYWdlIHRvIHRyYW5zZmVyCi0gICAgbWVzc2FnZSA9ICgnJy5qb2luKAotICAgICAgICByYW5kb20uY2hvaWNlKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykgZm9yIF8gaW4gcmFuZ2UoNikpKQotICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgIHdyaXRlX3JlYWRfc3VjY2Vzc2Z1bCA9IGJ0X3Rlc3RfdXRpbHMud3JpdGVfcmVhZF92ZXJpZnlfZGF0YV9zbDRhKAotICAgICAgICBzZWxmLnBob25lLCBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLCBtZXNzYWdlLCBGYWxzZSkKLSAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSh3cml0ZV9yZWFkX3N1Y2Nlc3NmdWwsICdGYWlsZWQgdG8gc2VuZC9yZWNlaXZlIG1lc3NhZ2UnKQotICAgIHJldHVybiAoZW5kX3RpbWUgLSBzdGFydF90aW1lKSAqIDEwMDAKLQotICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgIiIiU3RhbmRhcmQgTW9ibHkgc2V0dXAgY2xhc3MuIiIiCi0gICAgc3VwZXIoQmx1ZXRvb3RoTGF0ZW5jeVRlc3QsIHNlbGYpLnNldHVwX2NsYXNzKCkKLSAgICBpZiBsZW4oc2VsZi5hbmRyb2lkX2RldmljZXMpIDwgMjoKLSAgICAgIHJhaXNlIFRlc3RBYm9ydENsYXNzKAotICAgICAgICAgICdOb3QgZW5vdWdoIGFuZHJvaWQgcGhvbmVzIGRldGVjdGVkIChuZWVkIGF0IGxlYXN0IHR3byknKQotICAgIHNlbGYucGhvbmUgPSBzZWxmLmFuZHJvaWRfZGV2aWNlc1swXQotICAgIHNlbGYucGhvbmUuaW5pdF9zZXR1cCgpCi0gICAgc2VsZi5waG9uZS5zbDRhX3NldHVwKCkKLQotICAgICMgV2UgdHJlYXQgdGhlIHNlY29uZGFyeSBwaG9uZSBhcyBhIGRlcml2ZWRfYnRfZGV2aWNlIGluIG9yZGVyIGZvciB0aGUKLSAgICAjIGdlbmVyaWMgc2NyaXB0IHRvIHdvcmsgd2l0aCB0aGlzIGFuZHJvaWQgcGhvbmUgcHJvcGVybHkuIERhdGEgd2lsbCBiZSBzZW50Ci0gICAgIyBmcm9tIGZpcnN0IHBob25lIHRvIHRoZSBzZWNvbmQgcGhvbmUuCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzFdCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5pbml0X3NldHVwKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnNsNGFfc2V0dXAoKQotICAgIHNlbGYuc2V0X2J0c25vb3Bsb2dtb2RlX2Z1bGwoc2VsZi5waG9uZSkKLSAgICBzZWxmLnNldF9idHNub29wbG9nbW9kZV9mdWxsKHNlbGYuZGVyaXZlZF9idF9kZXZpY2UpCi0KLSAgICBzZWxmLm1ldHJpY3MgPSAoCi0gICAgICAgIG1ldHJpY3NfdXRpbHMuQmx1ZXRvb3RoTWV0cmljTG9nZ2VyKAotICAgICAgICAgICAgbWV0cmljc19wYjIuQmx1ZXRvb3RoRGF0YVRlc3RSZXN1bHQoKSkpCi0gICAgc2VsZi5tZXRyaWNzLmFkZF9wcmltYXJ5X2RldmljZV9tZXRyaWNzKHNlbGYucGhvbmUpCi0gICAgc2VsZi5tZXRyaWNzLmFkZF9jb25uZWN0ZWRfZGV2aWNlX21ldHJpY3Moc2VsZi5kZXJpdmVkX2J0X2RldmljZSkKLQotICAgIHNlbGYuZGF0YV90cmFuc2Zlcl90eXBlID0gbWV0cmljc19wYjIuQmx1ZXRvb3RoRGF0YVRlc3RSZXN1bHQuUkZDT01NCi0gICAgc2VsZi5pdGVyYXRpb25zID0gaW50KHNlbGYudXNlcl9wYXJhbXMuZ2V0KCdpdGVyYXRpb25zJywgMzAwKSkKLSAgICBsb2dnaW5nLmluZm8oJ1J1bm5pbmcgQmx1ZXRvb3RoIGxhdGVuY3kgdGVzdCAlcyB0aW1lcy4nLCBzZWxmLml0ZXJhdGlvbnMpCi0gICAgbG9nZ2luZy5pbmZvKCdTdWNjZXNzZnVsbHkgZm91bmQgcmVxdWlyZWQgZGV2aWNlcy4nKQotCi0gIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICIiIlNldHVwIGZvciBibHVldG9vdGggbGF0ZW5jeSB0ZXN0LiIiIgotICAgIGxvZ2dpbmcuaW5mbygnU2V0dXAgVGVzdCBmb3IgdGVzdF9ibHVldG9vdGhfbGF0ZW5jeScpCi0gICAgc3VwZXIoQmx1ZXRvb3RoTGF0ZW5jeVRlc3QsIHNlbGYpLnNldHVwX3Rlc3QoKQotICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5waG9uZS5jb25uZWN0X3dpdGhfcmZjb21tKHNlbGYuZGVyaXZlZF9idF9kZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBlc3RhYmxpc2ggUkZDT01NIGNvbm5lY3Rpb24nKQotCi0gIGRlZiB0ZXN0X2JsdWV0b290aF9sYXRlbmN5KHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSBsYXRlbmN5IGZvciBhIGRhdGEgdHJhbnNmZXIgb3ZlciBSRkNPTU0uIiIiCi0KLSAgICBtZXRyaWNzID0ge30KLSAgICBsYXRlbmN5X2xpc3QgPSBbXQotCi0gICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi5pdGVyYXRpb25zKToKLSAgICAgIGxhdGVuY3lfbGlzdC5hcHBlbmQoc2VsZi5fbWVhc3VyZV9sYXRlbmN5KCkpCi0KLSAgICBtZXRyaWNzWydkYXRhX3RyYW5zZmVyX3Byb3RvY29sJ10gPSBzZWxmLmRhdGFfdHJhbnNmZXJfdHlwZQotICAgIG1ldHJpY3NbJ2RhdGFfbGF0ZW5jeV9taW5fbWlsbGlzJ10gPSBpbnQobWluKGxhdGVuY3lfbGlzdCkpCi0gICAgbWV0cmljc1snZGF0YV9sYXRlbmN5X21heF9taWxsaXMnXSA9IGludChtYXgobGF0ZW5jeV9saXN0KSkKLSAgICBtZXRyaWNzWydkYXRhX2xhdGVuY3lfYXZnX21pbGxpcyddID0gaW50KAotICAgICAgICBtYXRoLmZzdW0obGF0ZW5jeV9saXN0KSAvIGZsb2F0KGxlbihsYXRlbmN5X2xpc3QpKSkKLSAgICBsb2dnaW5nLmluZm8oJ0xhdGVuY3k6ICVzJywgbWV0cmljcykKLQotICAgIGFzc2VydHMuYXNzZXJ0X3RydWUobWV0cmljc1snZGF0YV9sYXRlbmN5X21pbl9taWxsaXMnXSA+IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAnTWluaW11bSBsYXRlbmN5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAhJykKLSAgICBzZWxmLm1ldHJpY3MuYWRkX3Rlc3RfbWV0cmljcyhtZXRyaWNzKQotICAgIGZvciBtZXRyaWMgaW4gbWV0cmljczoKLSAgICAgIHNlbGYucmVjb3JkX2RhdGEoewotICAgICAgICAgICdUZXN0IE5hbWUnOiAndGVzdF9ibHVldG9vdGhfbGF0ZW5jeScsCi0gICAgICAgICAgJ3Nwb25nZV9wcm9wZXJ0aWVzJzogewotICAgICAgICAgICAgICBtZXRyaWM6IG1ldHJpY3NbbWV0cmljXSwKLSAgICAgICAgICB9Ci0gICAgICB9KQotCi0gIGRlZiB0ZWFyZG93bl9jbGFzcyhzZWxmKToKLSAgICBsb2dnaW5nLmluZm8oJ0ZhY3RvcnkgcmVzZXR0aW5nIEJsdWV0b290aCBvbiBkZXZpY2VzLicpCi0gICAgc2VsZi5waG9uZS5zbDRhLmJsdWV0b290aFNvY2tldENvbm5TdG9wKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoU29ja2V0Q29ublN0b3AoKQotICAgIHNlbGYucGhvbmUuZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoKQotICAgIHN1cGVyKEJsdWV0b290aExhdGVuY3lUZXN0LCBzZWxmKS50ZWFyZG93bl9jbGFzcygpCi0gICAgc2VsZi5yZWNvcmRfZGF0YSh7Ci0gICAgICAgICdUZXN0IE5hbWUnOiAndGVzdF9ibHVldG9vdGhfbGF0ZW5jeScsCi0gICAgICAgICdzcG9uZ2VfcHJvcGVydGllcyc6IHsKLSAgICAgICAgICAgICdwcm90b19hc2NpaSc6Ci0gICAgICAgICAgICAgICAgc2VsZi5tZXRyaWNzLnByb3RvX21lc3NhZ2VfdG9fYXNjaWkoKSwKLSAgICAgICAgICAgICdwcmltYXJ5X2RldmljZV9idWlsZCc6Ci0gICAgICAgICAgICAgICAgc2VsZi5waG9uZS5nZXRfZGV2aWNlX2luZm8oKVsnYW5kcm9pZF9yZWxlYXNlX2lkJ10KLSAgICAgICAgfQotICAgIH0pCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvY29ubmVjdGl2aXR5L2JsdWV0b290aF9wYWlyaW5nX3Rlc3QucHkgYi9ibHVlYmVycnkvdGVzdHMvY29ubmVjdGl2aXR5L2JsdWV0b290aF9wYWlyaW5nX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzE3NzAuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2Nvbm5lY3Rpdml0eS9ibHVldG9vdGhfcGFpcmluZ190ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIiIiVGVzdHMgZm9yIGJsdWViZXJyeS50ZXN0cy5ibHVldG9vdGhfcGFpcmluZy4iIiIKLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCi0KLWltcG9ydCBsb2dnaW5nCi0KLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgYmx1ZWJlcnJ5X2Jhc2VfdGVzdAotCi0KLWNsYXNzIEJsdWV0b290aFBhaXJpbmdUZXN0KGJsdWViZXJyeV9iYXNlX3Rlc3QuQmx1ZWJlcnJ5QmFzZVRlc3QpOgotICAiIiJUZXN0IENsYXNzIGZvciBCbHVldG9vdGggUGFpcmluZyBUZXN0LgotCi0gIFRlc3Qgd2lsbCByZXNldCB0aGUgYmx1ZXRvb3RoIHNldHRpbmdzIG9uIHRoZSBwaG9uZSBhbmQgYXR0ZW1wdCB0byBwYWlyCi0gIHdpdGggdGhlIGRlcml2ZWRfYnRfZGV2aWNlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAiIiIKLQotICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgIiIiU3RhbmRhcmQgTW9ibHkgc2V0dXAgY2xhc3MuIiIiCi0gICAgc3VwZXIoQmx1ZXRvb3RoUGFpcmluZ1Rlc3QsIHNlbGYpLnNldHVwX2NsYXNzKCkKLSAgICAjIEFkZHMgYSB1c2UgY2FzZSB0aGF0IGRlcml2ZWRfYnRfZGV2aWNlIGluaXRpYXRlcyBhIHBhaXJpbmcgcmVxdWVzdCB0bwotICAgICMgcHJpbWFyeV9kZXZpY2UuIEVuYWJsZSB0aGlzIGNhc2UgaWYgYWxsb3dfcGFpcmluZ19yZXZlcnNlIGlzIDEuCi0gICAgc2VsZi5hbGxvd19wYWlyaW5nX3JldmVyc2UgPSBpbnQoc2VsZi51c2VyX3BhcmFtcy5nZXQoCi0gICAgICAgICdhbGxvd19wYWlyaW5nX3JldmVyc2UnLCAwKSkKLQotICAgIGlmIHNlbGYuYW5kcm9pZF9kZXZpY2VzOgotICAgICAgc2VsZi5wcmltYXJ5X2RldmljZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdCi0gICAgICBzZWxmLnByaW1hcnlfZGV2aWNlLmluaXRfc2V0dXAoKQotICAgICAgc2VsZi5wcmltYXJ5X2RldmljZS5zbDRhX3NldHVwKCkKLQotICAgICAgaWYgbGVuKHNlbGYuYW5kcm9pZF9kZXZpY2VzKSA+IDEgYW5kIG5vdCBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlczoKLSAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBwYWlyaW5nIHBob25lIHRvIHBob25lLCB3ZSBuZWVkIHRvIHRyZWF0IHRoZQotICAgICAgICAjIHNlY29uZGFyeSBwaG9uZSBhcyBhIGRlcml2ZWRfYnRfZGV2aWNlIGluIG9yZGVyIGZvciB0aGUgZ2VuZXJpYyBzY3JpcHQKLSAgICAgICAgIyB0byB3b3JrIHdpdGggdGhpcyBhbmRyb2lkIHBob25lIHByb3Blcmx5LgotICAgICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlID0gc2VsZi5hbmRyb2lkX2RldmljZXNbMV0KLSAgICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5pbml0X3NldHVwKCkKLSAgICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5zbDRhX3NldHVwKCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlc1swXQotICAgICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKCkKLSAgICBlbHNlOgotICAgICAgIyBJbiB0aGUgY2FzZSBvZiBwYWlyaW5nIG1vY2sgdG8gbW9jaywgYXQgbGVhc3QgMiBkZXJpdmVkX2J0X2RldmljZSBpcwotICAgICAgIyByZXF1aXJlZC4gVGhlIGZpcnN0IGRlcml2ZWRfYnRfZGV2aWNlIGlzIHRyZWF0ZWQgYXMgcHJpbWFyeV9kZXZpY2UuCi0gICAgICBzZWxmLnByaW1hcnlfZGV2aWNlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZXNbMF0KLSAgICAgIHNlbGYucHJpbWFyeV9kZXZpY2UuaW5pdF9zZXR1cCgpCi0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZXNbMV0KLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoKQotCi0gIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICIiIlNldHVwIGZvciBwYWlyaW5nIHRlc3QuIiIiCi0gICAgbG9nZ2luZy5pbmZvKCdTZXR1cCBUZXN0IGZvciB0ZXN0X3BhaXJfYW5kX2JvbmQnKQotICAgIHN1cGVyKEJsdWV0b290aFBhaXJpbmdUZXN0LCBzZWxmKS5zZXR1cF90ZXN0KCkKLQotICBkZWYgdGVzdF9wYWlyX2FuZF9ib25kKHNlbGYpOgotICAgICIiIlRlc3QgZm9yIHBhaXJpbmcgYW5kIGJvbmRpbmcgYSBwaG9uZSB3aXRoIGEgYmx1ZXRvb3RoIGRldmljZS4KLQotICAgIEluaXRpYXRlcyBwYWlyaW5nIGZyb20gdGhlIHBob25lIGFuZCBjaGVja3MgZm9yIDIwIHNlY29uZHMgdGhhdAotICAgIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICIiIgotICAgIGRldmljZV9saXN0ID0gWyhzZWxmLnByaW1hcnlfZGV2aWNlLCBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlKV0KLSAgICBpZiBzZWxmLmFsbG93X3BhaXJpbmdfcmV2ZXJzZToKLSAgICAgIGRldmljZV9saXN0LmFwcGVuZCgoc2VsZi5kZXJpdmVkX2J0X2RldmljZSwgc2VsZi5wcmltYXJ5X2RldmljZSkpCi0gICAgZm9yIGluaXRpYXRvciwgcmVjZWl2ZXIgaW4gZGV2aWNlX2xpc3Q6Ci0gICAgICAjIGdldCBtYWMgYWRkcmVzcyBvZiBkZXZpY2UgdG8gcGFpciB3aXRoCi0gICAgICBtYWNfYWRkcmVzcyA9IHJlY2VpdmVyLmdldF9ibHVldG9vdGhfbWFjX2FkZHJlc3MoKQotICAgICAgbG9nZ2luZy5pbmZvKCdSZWNlaXZlciBCVCBNQUMgQWRkcmVzczogJXMnLCBtYWNfYWRkcmVzcykKLSAgICAgICMgcHV0IGRldmljZSBpbnRvIHBhaXJpbmcgbW9kZQotICAgICAgcmVjZWl2ZXIuYWN0aXZhdGVfcGFpcmluZ19tb2RlKCkKLSAgICAgICMgaW5pdGlhdGUgcGFpcmluZyBmcm9tIGluaXRpYXRvcgotICAgICAgaW5pdGlhdG9yLnNldF90YXJnZXQocmVjZWl2ZXIpCi0gICAgICBpbml0aWF0b3IucGFpcl9hbmRfY29ubmVjdF9ibHVldG9vdGgobWFjX2FkZHJlc3MpCi0gICAgICBpZiBzZWxmLmFsbG93X3BhaXJpbmdfcmV2ZXJzZSBhbmQgaW5pdGlhdG9yICE9IHNlbGYuZGVyaXZlZF9idF9kZXZpY2U6Ci0gICAgICAgIGxvZ2dpbmcuaW5mbygnPT09PT0gUmV2ZXJzaW5nIFBhaXJpbmcgPT09PT0nKQotICAgICAgICAjIFJlc2V0cyBCbHVldG9vdGggc3RhdHVzIGZvciB0d28gc2lkZXMuCi0gICAgICAgIGluaXRpYXRvci5mYWN0b3J5X3Jlc2V0X2JsdWV0b290aCgpCi0gICAgICAgIHJlY2VpdmVyLmZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9jb25uZWN0aXZpdHkvYmx1ZXRvb3RoX3Rocm91Z2hwdXRfdGVzdC5weSBiL2JsdWViZXJyeS90ZXN0cy9jb25uZWN0aXZpdHkvYmx1ZXRvb3RoX3Rocm91Z2hwdXRfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhYzJlMi4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvY29ubmVjdGl2aXR5L2JsdWV0b290aF90aHJvdWdocHV0X3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotIyBMaW50IGFzOiBweXRob24zCi0iIiJUZXN0cyBmb3IgYmx1ZWJlcnJ5LnRlc3RzLmJsdWV0b290aC5ibHVldG9vdGhfdGhyb3VnaHB1dC4iIiIKLQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KLQotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBtYXRoCi0KLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi1mcm9tIG1vYmx5LmNvbnRyb2xsZXJzLmFuZHJvaWRfZGV2aWNlX2xpYi5qc29ucnBjX2NsaWVudF9iYXNlIGltcG9ydCBBcGlFcnJvcgotZnJvbSBtb2JseS5zaWduYWxzIGltcG9ydCBUZXN0QWJvcnRDbGFzcwotIyBJbnRlcm5hbCBpbXBvcnQKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBibHVlYmVycnlfYmFzZV90ZXN0Ci1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgbWV0cmljc191dGlscwotIyBJbnRlcm5hbCBpbXBvcnQKLQotCi1jbGFzcyBCbHVldG9vdGhUaHJvdWdocHV0VGVzdChibHVlYmVycnlfYmFzZV90ZXN0LkJsdWViZXJyeUJhc2VUZXN0KToKLQotICBAcmV0cnkubG9nZ2VkX3JldHJ5X29uX2V4Y2VwdGlvbigKLSAgICAgIHJldHJ5X2ludGVydmFscz1yZXRyeS5GdXp6ZWRFeHBvbmVudGlhbEludGVydmFscygKLSAgICAgICAgICBpbml0aWFsX2RlbGF5X3NlYz0yLCBmYWN0b3I9NSwgbnVtX3JldHJpZXM9NSwgbWF4X2RlbGF5X3NlYz0zMDApKQotICBkZWYgX21lYXN1cmVfdGhyb3VnaHB1dChzZWxmLCBudW1fb2ZfYnVmZmVycywgYnVmZmVyX3NpemUpOgotICAgICIiIk1lYXN1cmVzIHRoZSB0aHJvdWdocHV0IG9mIGEgZGF0YSB0cmFuc2Zlci4KLQotICAgIFNlbmRzIGRhdGEgZnJvbSB0aGUgY2xpZW50IGRldmljZSB0aGF0IGlzIHJlYWQgYnkgdGhlIHNlcnZlciBkZXZpY2UuCi0gICAgQ2FsY3VsYXRlcyB0aGUgdGhyb3VnaHB1dCBmb3IgdGhlIHRyYW5zZmVyLgotCi0gICAgQXJnczoKLSAgICAgICAgbnVtX29mX2J1ZmZlcnM6IEFuIGludGVnZXIgdmFsdWUgZGVzaWduYXRpbmcgdGhlIG51bWJlciBvZiBidWZmZXJzCi0gICAgICAgICAgICAgICAgICAgICAgdG8gYmUgc2VudC4KLSAgICAgICAgYnVmZmVyX3NpemU6IEFuIGludGVnZXIgdmFsdWUgZGVzaWduYXRpbmcgdGhlIHNpemUgb2YgZWFjaCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgaW4gYnl0ZXMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgICBUaGUgdGhyb3VnaHB1dCBvZiB0aGUgdHJhbnNmZXIgaW4gYnl0ZXMgcGVyIHNlY29uZC4KLSAgICAiIiIKLQotICAgICMgVE9ETyh1c2VyKTogTmVlZCB0byBmaXggdGhyb3VnaHB1dCBzZW5kL3JlY2VpdmUgbWV0aG9kcwotICAgIChzZWxmLnBob25lLnNsNGEKLSAgICAgLmJsdWV0b290aENvbm5lY3Rpb25UaHJvdWdocHV0U2VuZChudW1fb2ZfYnVmZmVycywgYnVmZmVyX3NpemUpKQotCi0gICAgdGhyb3VnaHB1dCA9IChzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnNsNGEKLSAgICAgICAgICAgICAgICAgIC5ibHVldG9vdGhDb25uZWN0aW9uVGhyb3VnaHB1dFJlYWQobnVtX29mX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplKSkKLSAgICByZXR1cm4gdGhyb3VnaHB1dAotCi0gIGRlZiBfdGhyb3VnaHB1dF90ZXN0KHNlbGYsIGJ1ZmZlcl9zaXplLCB0ZXN0X25hbWUpOgotICAgIGxvZ2dpbmcuaW5mbygndGhyb3VnaHB1dCB0ZXN0IHdpdGggYnVmZmVyX3NpemU6ICVkIGFuZCB0ZXN0bmFtZTogJXMnLAotICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZSwgdGVzdF9uYW1lKQotICAgIG1ldHJpY3MgPSB7fQotICAgIHRocm91Z2hwdXRfbGlzdCA9IFtdCi0gICAgbnVtX29mX2J1ZmZlcnMgPSAxCi0gICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi5pdGVyYXRpb25zKToKLSAgICAgIHRocm91Z2hwdXQgPSBzZWxmLl9tZWFzdXJlX3Rocm91Z2hwdXQobnVtX29mX2J1ZmZlcnMsIGJ1ZmZlcl9zaXplKQotICAgICAgbG9nZ2luZy5pbmZvKCdUaHJvdWdocHV0OiAlZCBieXRlcy1wZXItc2VjJywgdGhyb3VnaHB1dCkKLSAgICAgIHRocm91Z2hwdXRfbGlzdC5hcHBlbmQodGhyb3VnaHB1dCkKLQotICAgIG1ldHJpY3NbJ2RhdGFfdHJhbnNmZXJfcHJvdG9jb2wnXSA9IHNlbGYuZGF0YV90cmFuc2Zlcl90eXBlCi0gICAgbWV0cmljc1snZGF0YV9wYWNrZXRfc2l6ZSddID0gYnVmZmVyX3NpemUKLSAgICBtZXRyaWNzWydkYXRhX3Rocm91Z2hwdXRfbWluX2J5dGVzX3Blcl9zZWNvbmQnXSA9IGludCgKLSAgICAgICAgbWluKHRocm91Z2hwdXRfbGlzdCkpCi0gICAgbWV0cmljc1snZGF0YV90aHJvdWdocHV0X21heF9ieXRlc19wZXJfc2Vjb25kJ10gPSBpbnQoCi0gICAgICAgIG1heCh0aHJvdWdocHV0X2xpc3QpKQotICAgIG1ldHJpY3NbJ2RhdGFfdGhyb3VnaHB1dF9hdmdfYnl0ZXNfcGVyX3NlY29uZCddID0gaW50KAotICAgICAgICBtYXRoLmZzdW0odGhyb3VnaHB1dF9saXN0KSAvIGZsb2F0KGxlbih0aHJvdWdocHV0X2xpc3QpKSkKLQotICAgIGxvZ2dpbmcuaW5mbygnVGhyb3VnaHB1dCBhdCBsYXJnZSBidWZmZXI6ICVzJywgbWV0cmljcykKLQotICAgIGFzc2VydHMuYXNzZXJ0X3RydWUobWV0cmljc1snZGF0YV90aHJvdWdocHV0X21pbl9ieXRlc19wZXJfc2Vjb25kJ10gPiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgJ01pbmltdW0gdGhyb3VnaHB1dCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIScpCi0KLSAgICBzZWxmLm1ldHJpY3MuYWRkX3Rlc3RfbWV0cmljcyhtZXRyaWNzKQotICAgIGZvciBtZXRyaWMgaW4gbWV0cmljczoKLSAgICAgIHNlbGYucmVjb3JkX2RhdGEoewotICAgICAgICAgICdUZXN0IE5hbWUnOiB0ZXN0X25hbWUsCi0gICAgICAgICAgJ3Nwb25nZV9wcm9wZXJ0aWVzJzogewotICAgICAgICAgICAgICBtZXRyaWM6IG1ldHJpY3NbbWV0cmljXSwKLSAgICAgICAgICB9Ci0gICAgICB9KQotICAgIHNlbGYucmVjb3JkX2RhdGEoewotICAgICAgICAnVGVzdCBOYW1lJzogdGVzdF9uYW1lLAotICAgICAgICAnc3BvbmdlX3Byb3BlcnRpZXMnOiB7Ci0gICAgICAgICAgICAncHJvdG9fYXNjaWknOgotICAgICAgICAgICAgICAgIHNlbGYubWV0cmljcy5wcm90b19tZXNzYWdlX3RvX2FzY2lpKCksCi0gICAgICAgICAgICAncHJpbWFyeV9kZXZpY2VfYnVpbGQnOgotICAgICAgICAgICAgICAgIHNlbGYucGhvbmUuZ2V0X2RldmljZV9pbmZvKClbJ2FuZHJvaWRfcmVsZWFzZV9pZCddCi0gICAgICAgIH0KLSAgICB9KQotCi0gIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAiIiJTdGFuZGFyZCBNb2JseSBzZXR1cCBjbGFzcy4iIiIKLSAgICBzdXBlcihCbHVldG9vdGhUaHJvdWdocHV0VGVzdCwgc2VsZikuc2V0dXBfY2xhc3MoKQotICAgIGlmIGxlbihzZWxmLmFuZHJvaWRfZGV2aWNlcykgPCAyOgotICAgICAgcmFpc2UgVGVzdEFib3J0Q2xhc3MoCi0gICAgICAgICAgJ05vdCBlbm91Z2ggYW5kcm9pZCBwaG9uZXMgZGV0ZWN0ZWQgKG5lZWQgYXQgbGVhc3QgdHdvKScpCi0gICAgc2VsZi5waG9uZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdCi0KLSAgICAjIFdlIHRyZWF0IHRoZSBzZWNvbmRhcnkgcGhvbmUgYXMgYSBkZXJpdmVkX2J0X2RldmljZSBpbiBvcmRlciBmb3IgdGhlCi0gICAgIyBnZW5lcmljIHNjcmlwdCB0byB3b3JrIHdpdGggdGhpcyBhbmRyb2lkIHBob25lIHByb3Blcmx5LiBEYXRhIHdpbGwgYmUgc2VudAotICAgICMgZnJvbSBmaXJzdCBwaG9uZSB0byB0aGUgc2Vjb25kIHBob25lLgotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UgPSBzZWxmLmFuZHJvaWRfZGV2aWNlc1sxXQotICAgIHNlbGYucGhvbmUuaW5pdF9zZXR1cCgpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5pbml0X3NldHVwKCkKLSAgICBzZWxmLnBob25lLnNsNGFfc2V0dXAoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2Uuc2w0YV9zZXR1cCgpCi0gICAgc2VsZi5zZXRfYnRzbm9vcGxvZ21vZGVfZnVsbChzZWxmLnBob25lKQotICAgIHNlbGYuc2V0X2J0c25vb3Bsb2dtb2RlX2Z1bGwoc2VsZi5kZXJpdmVkX2J0X2RldmljZSkKLQotICAgIHNlbGYubWV0cmljcyA9ICgKLSAgICAgICAgbWV0cmljc191dGlscy5CbHVldG9vdGhNZXRyaWNMb2dnZXIoCi0gICAgICAgICAgICBtZXRyaWNzX3BiMi5CbHVldG9vdGhEYXRhVGVzdFJlc3VsdCgpKSkKLSAgICBzZWxmLm1ldHJpY3MuYWRkX3ByaW1hcnlfZGV2aWNlX21ldHJpY3Moc2VsZi5waG9uZSkKLSAgICBzZWxmLm1ldHJpY3MuYWRkX2Nvbm5lY3RlZF9kZXZpY2VfbWV0cmljcyhzZWxmLmRlcml2ZWRfYnRfZGV2aWNlKQotCi0gICAgc2VsZi5kYXRhX3RyYW5zZmVyX3R5cGUgPSBtZXRyaWNzX3BiMi5CbHVldG9vdGhEYXRhVGVzdFJlc3VsdC5SRkNPTU0KLSAgICBzZWxmLml0ZXJhdGlvbnMgPSBpbnQoc2VsZi51c2VyX3BhcmFtcy5nZXQoJ2l0ZXJhdGlvbnMnLCAzMDApKQotICAgIGxvZ2dpbmcuaW5mbygnUnVubmluZyBCbHVldG9vdGggdGhyb3VnaHB1dCB0ZXN0ICVzIHRpbWVzLicsIHNlbGYuaXRlcmF0aW9ucykKLSAgICBsb2dnaW5nLmluZm8oJ1N1Y2Nlc3NmdWxseSBmb3VuZCByZXF1aXJlZCBkZXZpY2VzLicpCi0KLSAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgIiIiU2V0dXAgZm9yIGJsdWV0b290aCBsYXRlbmN5IHRlc3QuIiIiCi0gICAgbG9nZ2luZy5pbmZvKCdTZXR1cCBUZXN0IGZvciB0ZXN0X2JsdWV0b290aF90aHJvdWdocHV0JykKLSAgICBzdXBlcihCbHVldG9vdGhUaHJvdWdocHV0VGVzdCwgc2VsZikuc2V0dXBfdGVzdCgpCi0gICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShzZWxmLnBob25lLmNvbm5lY3Rfd2l0aF9yZmNvbW0oc2VsZi5kZXJpdmVkX2J0X2RldmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGVzdGFibGlzaCBSRkNPTU0gY29ubmVjdGlvbicpCi0KLSAgZGVmIHRlc3RfYmx1ZXRvb3RoX3Rocm91Z2hwdXRfbGFyZ2VfYnVmZmVyKHNlbGYpOgotICAgICIiIlRlc3RzIHRoZSB0aHJvdWdocHV0IHdpdGggbGFyZ2UgYnVmZmVyIHNpemUuCi0KLSAgICBUZXN0cyB0aGUgdGhyb3VnaHB1dCBvdmVyIGEgc2VyaWVzIG9mIGRhdGEgdHJhbnNmZXJzIHdpdGggbGFyZ2UgYnVmZmVyIHNpemUuCi0gICAgIiIiCi0gICAgbGFyZ2VfYnVmZmVyX3NpemUgPSAzMDAKLSAgICB0ZXN0X25hbWUgPSAndGVzdF9ibHVldG9vdGhfdGhyb3VnaHB1dF9sYXJnZV9idWZmZXInCi0gICAgc2VsZi5fdGhyb3VnaHB1dF90ZXN0KGxhcmdlX2J1ZmZlcl9zaXplLCB0ZXN0X25hbWUpCi0KLSAgZGVmIHRlc3RfYmx1ZXRvb3RoX3Rocm91Z2hwdXRfbWVkaXVtX2J1ZmZlcihzZWxmKToKLSAgICAiIiJUZXN0cyB0aGUgdGhyb3VnaHB1dCB3aXRoIG1lZGl1bSBidWZmZXIgc2l6ZS4KLQotICAgIFRlc3RzIHRoZSB0aHJvdWdocHV0IG92ZXIgYSBzZXJpZXMgb2YgZGF0YSB0cmFuc2ZlcnMgd2l0aCBtZWRpdW0gYnVmZmVyCi0gICAgc2l6ZS4KLSAgICAiIiIKLSAgICBtZWRpdW1fYnVmZmVyX3NpemUgPSAxMDAKLSAgICB0ZXN0X25hbWUgPSAndGVzdF9ibHVldG9vdGhfdGhyb3VnaHB1dF9tZWRpdW1fYnVmZmVyJwotICAgIHNlbGYuX3Rocm91Z2hwdXRfdGVzdChtZWRpdW1fYnVmZmVyX3NpemUsIHRlc3RfbmFtZSkKLQotICBkZWYgdGVzdF9ibHVldG9vdGhfdGhyb3VnaHB1dF9zbWFsbF9idWZmZXIoc2VsZik6Ci0gICAgIiIiVGVzdHMgdGhlIHRocm91Z2hwdXQgd2l0aCBzbWFsbCBidWZmZXIgc2l6ZS4KLQotICAgIFRlc3RzIHRoZSB0aHJvdWdocHV0IG92ZXIgYSBzZXJpZXMgb2YgZGF0YSB0cmFuc2ZlcnMgd2l0aCBzbWFsbCBidWZmZXIgc2l6ZS4KLSAgICAiIiIKLSAgICBzbWFsbF9idWZmZXJfc2l6ZSA9IDEwCi0gICAgdGVzdF9uYW1lID0gJ3Rlc3RfYmx1ZXRvb3RoX3Rocm91Z2hwdXRfc21hbGxfYnVmZmVyJwotICAgIHNlbGYuX3Rocm91Z2hwdXRfdGVzdChzbWFsbF9idWZmZXJfc2l6ZSwgdGVzdF9uYW1lKQotCi0gIGRlZiB0ZXN0X21heGltdW1fYnVmZmVyX3NpemUoc2VsZik6Ci0gICAgIiIiQ2FsY3VsYXRlcyB0aGUgbWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplIGZvciBvbmUgcGFja2V0LiIiIgotICAgIGN1cnJlbnRfYnVmZmVyX3NpemUgPSAzMDAKLSAgICB0aHJvdWdocHV0ID0gLTEKLSAgICBudW1fb2ZfYnVmZmVycyA9IDEKLSAgICB3aGlsZSBUcnVlOgotICAgICAgbG9nZ2luZy5pbmZvKCdUcnlpbmcgYnVmZmVyIHNpemUgJWQnLCBjdXJyZW50X2J1ZmZlcl9zaXplKQotICAgICAgdHJ5OgotICAgICAgICB0aHJvdWdocHV0ID0gc2VsZi5fbWVhc3VyZV90aHJvdWdocHV0KAotICAgICAgICAgICAgbnVtX29mX2J1ZmZlcnMsIGN1cnJlbnRfYnVmZmVyX3NpemUpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygnVGhlIHRocm91Z2hwdXQgaXMgJWQgYXQgYnVmZmVyIHNpemUgb2YgJWQnLCB0aHJvdWdocHV0LAotICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXJfc2l6ZSkKLSAgICAgIGV4Y2VwdCBBcGlFcnJvcjoKLSAgICAgICAgbWF4aW11bV9idWZmZXJfc2l6ZSA9IGN1cnJlbnRfYnVmZmVyX3NpemUgLSAxCi0gICAgICAgIGxvZ2dpbmcuaW5mbygnTWF4IGJ1ZmZlciBzaXplOiAlZCBieXRlcycsIG1heGltdW1fYnVmZmVyX3NpemUpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygnTWF4IHRocm91Z2hwdXQ6ICVkIGJ5dGVzLXBlci1zZWNvbmQnLCB0aHJvdWdocHV0KQotICAgICAgICBzZWxmLnJlY29yZF9kYXRhKHsKLSAgICAgICAgICAgICdUZXN0IE5hbWUnOiAndGVzdF9tYXhpbXVtX2J1ZmZlcl9zaXplJywKLSAgICAgICAgICAgICdzcG9uZ2VfcHJvcGVydGllcyc6IHsKLSAgICAgICAgICAgICAgICAnbWF4aW11bV9idWZmZXJfc2l6ZSc6IG1heGltdW1fYnVmZmVyX3NpemUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgIGN1cnJlbnRfYnVmZmVyX3NpemUgKz0gMQotCi0gIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgIHNlbGYucGhvbmUuc2w0YS5ibHVldG9vdGhTb2NrZXRDb25uU3RvcCgpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5zbDRhLmJsdWV0b290aFNvY2tldENvbm5TdG9wKCkKLQotICBkZWYgdGVhcmRvd25fY2xhc3Moc2VsZik6Ci0gICAgc2VsZi5waG9uZS5mYWN0b3J5X3Jlc2V0X2JsdWV0b290aCgpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5mYWN0b3J5X3Jlc2V0X2JsdWV0b290aCgpCi0gICAgbG9nZ2luZy5pbmZvKCdGYWN0b3J5IHJlc2V0dGluZyBCbHVldG9vdGggb24gZGV2aWNlcy4nKQotICAgIHN1cGVyKEJsdWV0b290aFRocm91Z2hwdXRUZXN0LCBzZWxmKS50ZWFyZG93bl9jbGFzcygpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9hZGIucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9hZGIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDAxMTAuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvYWRiLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxNiAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGVuY29kaW5ncwotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCByZQotaW1wb3J0IHNobGV4Ci1pbXBvcnQgc2h1dGlsCi0KLWZyb20gbW9ibHkuY29udHJvbGxlcnMuYW5kcm9pZF9kZXZpY2VfbGliLmFkYiBpbXBvcnQgQWRiUHJveHkKLQotUk9PVF9VU0VSX0lEID0gJzAnCi1TSEVMTF9VU0VSX0lEID0gJzIwMDAnCi1VVEZfOCA9IGVuY29kaW5ncy51dGZfOC5nZXRyZWdlbnRyeSgpLm5hbWUKLQotCi1jbGFzcyBCbHVlYmVycnlBZGJQcm94eShBZGJQcm94eSk6Ci0gICAgIiIiUHJveHkgY2xhc3MgZm9yIEFEQi4KLQotICAgIEZvciBzeW50YWN0aWMgcmVhc29ucywgdGhlICctJyBpbiBhZGIgY29tbWFuZHMgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoCi0gICAgJ18nLiBDYW4gZGlyZWN0bHkgZXhlY3V0ZSBhZGIgY29tbWFuZHMgb24gYW4gb2JqZWN0OgotICAgID4+IGFkYiA9IEJsdWViZXJyeUFkYlByb3h5KDxzZXJpYWw+KQotICAgID4+IGFkYi5zdGFydF9zZXJ2ZXIoKQotICAgID4+IGFkYi5kZXZpY2VzKCkgIyB3aWxsIHJldHVybiB0aGUgY29uc29sZSBvdXRwdXQgb2YgImFkYiBkZXZpY2VzIi4KLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJpYWw9IiIsIHNzaF9jb25uZWN0aW9uPU5vbmUpOgotICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgQWRiUHJveHkuCi0KLSAgICAgICAgQXJnczoKLSAgICAgICAgICAgIHNlcmlhbDogc3RyIHNlcmlhbCBudW1iZXIgb2YgQW5kcm9pZCBkZXZpY2UgZnJvbSBgYWRiIGRldmljZXNgCi0gICAgICAgICAgICBzc2hfY29ubmVjdGlvbjogU3NoQ29ubmVjdGlvbiBpbnN0YW5jZSBpZiB0aGUgQW5kcm9pZCBkZXZpY2UgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gYSByZW1vdGUgaG9zdCB0aGF0IHdlIGNhbiByZWFjaCB2aWEgU1NILgotICAgICAgICAiIiIKLSAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhzZXJpYWwpCi0gICAgICAgIHNlbGYuX3NlcnZlcl9sb2NhbF9wb3J0ID0gTm9uZQotICAgICAgICBhZGJfcGF0aCA9IHNodXRpbC53aGljaCgnYWRiJykKLSAgICAgICAgYWRiX2NtZCA9IFtzaGxleC5xdW90ZShhZGJfcGF0aCldCi0gICAgICAgIGlmIHNlcmlhbDoKLSAgICAgICAgICAgIGFkYl9jbWQuYXBwZW5kKCItcyAlcyIgJSBzZXJpYWwpCi0gICAgICAgIGlmIHNzaF9jb25uZWN0aW9uIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgIyBLaWxsIGFsbCBleGlzdGluZyBhZGIgcHJvY2Vzc2VzIG9uIHRoZSByZW1vdGUgaG9zdCAoaWYgYW55KQotICAgICAgICAgICAgIyBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vbmUsIHRoZW4gcGtpbGwgZXhpdHMgd2l0aCBub24temVybyBzdGF0dXMKLSAgICAgICAgICAgIHNzaF9jb25uZWN0aW9uLnJ1bigicGtpbGwgYWRiIiwgaWdub3JlX3N0YXR1cz1UcnVlKQotICAgICAgICAgICAgIyBDb3B5IG92ZXIgdGhlIGFkYiBiaW5hcnkgdG8gYSB0ZW1wIGRpcgotICAgICAgICAgICAgdGVtcF9kaXIgPSBzc2hfY29ubmVjdGlvbi5ydW4oIm1rdGVtcCAtZCIpLnN0ZG91dC5zdHJpcCgpCi0gICAgICAgICAgICBzc2hfY29ubmVjdGlvbi5zZW5kX2ZpbGUoYWRiX3BhdGgsIHRlbXBfZGlyKQotICAgICAgICAgICAgIyBTdGFydCB1cCBhIG5ldyBhZGIgc2VydmVyIHJ1bm5pbmcgYXMgcm9vdCBmcm9tIHRoZSBjb3BpZWQgYmluYXJ5LgotICAgICAgICAgICAgcmVtb3RlX2FkYl9jbWQgPSAiJXMvYWRiICVzIHJvb3QiICUgKHRlbXBfZGlyLCAiLXMgJXMiICUgc2VyaWFsIGlmIHNlcmlhbCBlbHNlICIiKQotICAgICAgICAgICAgc3NoX2Nvbm5lY3Rpb24ucnVuKHJlbW90ZV9hZGJfY21kKQotICAgICAgICAgICAgIyBQcm94eSBhIGxvY2FsIHBvcnQgdG8gdGhlIGFkYiBzZXJ2ZXIgcG9ydAotICAgICAgICAgICAgbG9jYWxfcG9ydCA9IHNzaF9jb25uZWN0aW9uLmNyZWF0ZV9zc2hfdHVubmVsKDUwMzcpCi0gICAgICAgICAgICBzZWxmLl9zZXJ2ZXJfbG9jYWxfcG9ydCA9IGxvY2FsX3BvcnQKLQotICAgICAgICBpZiBzZWxmLl9zZXJ2ZXJfbG9jYWxfcG9ydDoKLSAgICAgICAgICAgIGFkYl9jbWQuYXBwZW5kKCItUCAlZCIgJSBsb2NhbF9wb3J0KQotICAgICAgICBzZWxmLmFkYl9zdHIgPSAiICIuam9pbihhZGJfY21kKQotICAgICAgICBzZWxmLl9zc2hfY29ubmVjdGlvbiA9IHNzaF9jb25uZWN0aW9uCi0KLSAgICBkZWYgZ2V0X3VzZXJfaWQoc2VsZik6Ci0gICAgICAgICIiIlJldHVybnMgdGhlIGFkYiB1c2VyLiBFaXRoZXIgMjAwMCAoc2hlbGwpIG9yIDAgKHJvb3QpLiIiIgotICAgICAgICByZXR1cm4gc2VsZi5zaGVsbCgnaWQgLXUnKS5kZWNvZGUoVVRGXzgpLnJzdHJpcCgpCi0KLSAgICBkZWYgaXNfcm9vdChzZWxmLCB1c2VyX2lkPU5vbmUpOgotICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHVzZXIgaXMgcm9vdC4KLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgdXNlcl9pZDogaWYgc3VwcGxpZWQsIHRoZSBpZCB0byBjaGVjayBhZ2FpbnN0LgotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgdXNlciBpcyByb290LiBGYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICIiIgotICAgICAgICBpZiBub3QgdXNlcl9pZDoKLSAgICAgICAgICAgIHVzZXJfaWQgPSBzZWxmLmdldF91c2VyX2lkKCkKLSAgICAgICAgcmV0dXJuIHVzZXJfaWQgPT0gUk9PVF9VU0VSX0lECi0KLSAgICBkZWYgZW5zdXJlX3Jvb3Qoc2VsZik6Ci0gICAgICAgICIiIkVuc3VyZXMgdGhlIHVzZXIgaXMgcm9vdCBhZnRlciBtYWtpbmcgdGhpcyBjYWxsLgotCi0gICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgc3RpbGwgZmFpbCBpZiB0aGUgZGV2aWNlIGlzIGEgdXNlciBidWlsZCwgYXMgcm9vdAotICAgICAgICBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIGEgdXNlciBidWlsZC4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgRmFsc2UgaWYgdGhlIGRldmljZSBpcyBhIHVzZXIgYnVpbGQuIFRydWUgb3RoZXJ3aXNlLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5lbnN1cmVfdXNlcihST09UX1VTRVJfSUQpCi0gICAgICAgIHJldHVybiBzZWxmLmlzX3Jvb3QoKQotCi0gICAgZGVmIGVuc3VyZV91c2VyKHNlbGYsIHVzZXJfaWQ9U0hFTExfVVNFUl9JRCk6Ci0gICAgICAgICIiIkVuc3VyZXMgdGhlIHVzZXIgaXMgc2V0IHRvIHRoZSBnaXZlbiB1c2VyLgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICB1c2VyX2lkOiBUaGUgaWQgb2YgdGhlIHVzZXIuCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLmlzX3Jvb3QodXNlcl9pZCk6Ci0gICAgICAgICAgICBzZWxmLnJvb3QoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi51bnJvb3QoKQotICAgICAgICBzZWxmLndhaXRfZm9yX2RldmljZSgpCi0gICAgICAgIHJldHVybiBzZWxmLmdldF91c2VyX2lkKCkgPT0gdXNlcl9pZAotCi0gICAgZGVmIHRjcF9mb3J3YXJkKHNlbGYsIGhvc3RfcG9ydCwgZGV2aWNlX3BvcnQpOgotICAgICAgICAiIiJTdGFydHMgdGNwIGZvcndhcmRpbmcgZnJvbSBsb2NhbGhvc3QgdG8gdGhpcyBhbmRyb2lkIGRldmljZS4KLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgaG9zdF9wb3J0OiBQb3J0IG51bWJlciB0byB1c2Ugb24gbG9jYWxob3N0Ci0gICAgICAgICAgICBkZXZpY2VfcG9ydDogUG9ydCBudW1iZXIgdG8gdXNlIG9uIHRoZSBhbmRyb2lkIGRldmljZS4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgRm9yd2FyZGVkIHBvcnQgb24gaG9zdCBhcyBpbnQgb3IgY29tbWFuZCBvdXRwdXQgc3RyaW5nIG9uIGVycm9yCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLl9zc2hfY29ubmVjdGlvbjoKLSAgICAgICAgICAgICMgV2UgaGF2ZSB0byBob3AgdGhyb3VnaCBhIHJlbW90ZSBob3N0IGZpcnN0LgotICAgICAgICAgICAgIyAgMSkgRmluZCBzb21lIGZyZWUgcG9ydCBvbiB0aGUgcmVtb3RlIGhvc3QncyBsb2NhbGhvc3QKLSAgICAgICAgICAgICMgIDIpIFNldHVwIGZvcndhcmRpbmcgYmV0d2VlbiB0aGF0IHJlbW90ZSBwb3J0IGFuZCB0aGUgcmVxdWVzdGVkCi0gICAgICAgICAgICAjICAgICBkZXZpY2UgcG9ydAotICAgICAgICAgICAgcmVtb3RlX3BvcnQgPSBzZWxmLl9zc2hfY29ubmVjdGlvbi5maW5kX2ZyZWVfcG9ydCgpCi0gICAgICAgICAgICBob3N0X3BvcnQgPSBzZWxmLl9zc2hfY29ubmVjdGlvbi5jcmVhdGVfc3NoX3R1bm5lbChyZW1vdGVfcG9ydCwgbG9jYWxfcG9ydD1ob3N0X3BvcnQpCi0gICAgICAgIG91dHB1dCA9IHNlbGYuZm9yd2FyZChbInRjcDolZCIgJSBob3N0X3BvcnQsICJ0Y3A6JWQiICUgZGV2aWNlX3BvcnRdKQotICAgICAgICAjIElmIGhpbnRlZF9wb3J0IGlzIDAsIHRoZSBvdXRwdXQgd2lsbCBiZSB0aGUgc2VsZWN0ZWQgcG9ydC4KLSAgICAgICAgIyBPdGhlcndpc2UsIHRoZXJlIHdpbGwgYmUgbm8gb3V0cHV0IHVwb24gc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICMgZm9yd2FyZGluZyB0aGUgaGludGVkIHBvcnQuCi0gICAgICAgIGlmIG5vdCBvdXRwdXQ6Ci0gICAgICAgICAgICByZXR1cm4gaG9zdF9wb3J0Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG91dHB1dF9pbnQgPSBpbnQob3V0cHV0KQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHJldHVybiBvdXRwdXQKLSAgICAgICAgcmV0dXJuIG91dHB1dF9pbnQKLQotICAgIGRlZiByZW1vdmVfdGNwX2ZvcndhcmQoc2VsZiwgaG9zdF9wb3J0KToKLSAgICAgICAgIiIiU3RvcCB0Y3AgZm9yd2FyZGluZyBhIHBvcnQgZnJvbSBsb2NhbGhvc3QgdG8gdGhpcyBhbmRyb2lkIGRldmljZS4KLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgaG9zdF9wb3J0OiBQb3J0IG51bWJlciB0byB1c2Ugb24gbG9jYWxob3N0Ci0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLl9zc2hfY29ubmVjdGlvbjoKLSAgICAgICAgICAgIHJlbW90ZV9wb3J0ID0gc2VsZi5fc3NoX2Nvbm5lY3Rpb24uY2xvc2Vfc3NoX3R1bm5lbChob3N0X3BvcnQpCi0gICAgICAgICAgICBpZiByZW1vdGVfcG9ydCBpcyBOb25lOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiQ2Fubm90IGNsb3NlIHVua25vd24gZm9yd2FyZGVkIHRjcCBwb3J0OiAlZCIsIGhvc3RfcG9ydCkKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICMgVGhlIGFjdHVhbCBwb3J0IHdlIG5lZWQgdG8gZGlzYWJsZSB2aWEgYWRiIGlzIG9uIHRoZSByZW1vdGUgaG9zdC4KLSAgICAgICAgICAgIGhvc3RfcG9ydCA9IHJlbW90ZV9wb3J0Ci0gICAgICAgIHNlbGYuZm9yd2FyZChbIi0tcmVtb3ZlIiwgInRjcDolZCIgJSBob3N0X3BvcnRdKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvYXNzZXJ0cy5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L2Fzc2VydHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTg4NDkuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvYXNzZXJ0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBtb2JseS5hc3NlcnRzIGltcG9ydCAqCi0KLQotIyBIYXZlIGFuIGluc3RhbmNlIG9mIHVuaXR0ZXN0LlRlc3RDYXNlIHNvIHdlIGNvdWxkIHJldXNlIHNvbWUgbG9naWMgZnJvbQotIyBweXRob24ncyBvd24gdW5pdHRlc3QuCi0jIF9Qcm94eVRlc3QgaXMgcmVxdWlyZWQgYmVjYXVzZSBweTIgZG9lcyBub3QgYWxsb3cgaW5zdGFudGlhdGluZwotIyB1bml0dGVzdC5UZXN0Q2FzZSBkaXJlY3RseS4KLWNsYXNzIF9Qcm94eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICAgZGVmIHJ1blRlc3Qoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotCi1fcHl1bml0X3Byb3h5ID0gX1Byb3h5VGVzdCgpCi0KLQotZGVmIGFzc2VydF9hbG1vc3RfZXF1YWwoZmlyc3QsIHNlY29uZCwgcGxhY2VzPTcsIG1zZz1Ob25lLCBkZWx0YT1Ob25lLCBleHRyYXM9Tm9uZSk6Ci0gICAgIiIiCi0gICAgQXNzZXJ0IEZJUlNUIHRvIGJlIHdpdGhpbiArLy0gREVMVEEgdG8gU0VDT05ELCBvdGhlcndpc2UgZmFpbCB0aGUKLSAgICB0ZXN0LgotICAgIDpwYXJhbSBmaXJzdDogVGhlIGZpcnN0IGFyZ3VtZW50LCBMSFMKLSAgICA6cGFyYW0gc2Vjb25kOiBUaGUgc2Vjb25kIGFyZ3VtZW50LCBSSFMKLSAgICA6cGFyYW0gcGxhY2VzOiBGb3IgZmxvYXRpbmcgcG9pbnRzLCBob3cgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBsb29rIGludG8KLSAgICA6cGFyYW0gbXNnOiBNZXNzYWdlIHRvIGRpc3BsYXkgb24gZmFpbHVyZQotICAgIDpwYXJhbSBkZWx0YTogVGhlICsvLSBmaXJzdCBhbmQgc2Vjb25kIGNvdWxkIGJlIGFwYXJ0IGZyb20gZWFjaCBvdGhlcgotICAgIDpwYXJhbSBleHRyYXM6IEV4dHJhIG9iamVjdCBwYXNzZWQgdG8gdGVzdCBmYWlsdXJlIGhhbmRsZXIKLSAgICA6cmV0dXJuOgotICAgICIiIgotICAgIG15X21zZyA9IE5vbmUKLSAgICB0cnk6Ci0gICAgICAgIGlmIGRlbHRhOgotICAgICAgICAgICAgX3B5dW5pdF9wcm94eS5hc3NlcnRBbG1vc3RFcXVhbChmaXJzdCwgc2Vjb25kLCBtc2c9bXNnLCBkZWx0YT1kZWx0YSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIF9weXVuaXRfcHJveHkuYXNzZXJ0QWxtb3N0RXF1YWwoZmlyc3QsIHNlY29uZCwgcGxhY2VzPXBsYWNlcywgbXNnPW1zZykKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgIG15X21zZyA9IHN0cihlKQotICAgICAgICBpZiBtc2c6Ci0gICAgICAgICAgICBteV9tc2cgPSAiJXMgJXMiICUgKG15X21zZywgbXNnKQotICAgICMgVGhpcyBpcyBhIGhhY2sgdG8gcmVtb3ZlIHRoZSBzdGFja3RyYWNlIHByb2R1Y2VkIGJ5IHRoZSBhYm92ZSBleGNlcHRpb24uCi0gICAgaWYgbXlfbXNnIGlzIG5vdCBOb25lOgotICAgICAgICBmYWlsKG15X21zZywgZXh0cmFzPWV4dHJhcykKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L2NlcnRfc2VsZl90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L2NlcnRfc2VsZl90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwYTFjZi4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9jZXJ0X3NlbGZfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0Lm1ldGFkYXRhIGltcG9ydCBtZXRhZGF0YQotCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzCi1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotZnJvbSBtb2JseSBpbXBvcnQgYmFzZV90ZXN0Ci0KLWZyb20gY2VydC5jZXJ0X3NlbGZfdGVzdF9saWIgaW1wb3J0ICoKLQotCi1jbGFzcyBDZXJ0U2VsZlRlc3RCYihiYXNlX3Rlc3QuQmFzZVRlc3RDbGFzcyk6Ci0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0X29jY3Vyc19hdF9sZWFzdF9wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0X29jY3Vyc19hdF9sZWFzdF9wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRfb2NjdXJzX3Bhc3NlcyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRfb2NjdXJzX3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydF9vY2N1cnNfZmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0X29jY3Vyc19mYWlsc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydF9vY2N1cnNfYXRfbW9zdF9wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0X29jY3Vyc19hdF9tb3N0X3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydF9vY2N1cnNfYXRfbW9zdF9mYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRfb2NjdXJzX2F0X21vc3RfZmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9za2lwX2FfdGVzdChzZWxmKToKLSAgICAgICAgdGVzdF9za2lwX2FfdGVzdF9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X25lc3RlZF9wYWNrZXRzKHNlbGYpOgotICAgICAgICB0ZXN0X25lc3RlZF9wYWNrZXRzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfbDJjYXBfY29uZmlnX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIHRlc3RfbDJjYXBfY29uZmlnX29wdGlvbnNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2Jvb2xlYW5fc3VjY2VzcyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2Jvb2xlYW5fc3VjY2Vzc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfYm9vbGVhbl9mYWxzZUlzVHJ1ZShzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2Jvb2xlYW5fZmFsc2VJc1RydWVfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2Jvb2xlYW5fdHJ1ZUlzRmFsc2Uoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ib29sZWFuX3RydWVJc0ZhbHNlX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3Rfc3VjY2VzcyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9zdWNjZXNzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNFcXVhbFRvRmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNFcXVhbFRvRmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9pc05vdEVxdWFsVG9GYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9pc05vdEVxdWFsVG9GYWlsc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzTm9uZUZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzTm9uZUZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNOb3ROb25lRmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNOb3ROb25lRmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX3Bhc3NlcyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfdGhlbl9wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c190aGVuX3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfZmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c19mYWlsc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfdGhlbl9mYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX3RoZW5fZmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzSW5PcmRlcl9wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c0luT3JkZXJfcGFzc2VzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c0luQW55T3JkZXJfcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbkFueU9yZGVyX3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbk9yZGVyX2ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbk9yZGVyX2ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c0luQW55T3JkZXJfZmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c0luQW55T3JkZXJfZmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV9wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfcGFzc2VzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfcGFzc2VzX2FmdGVyXzFfc2Vjb25kKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3Bhc3Nlc19hZnRlcl8xX3NlY29uZF9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX2ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX2ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfemVyb19wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfemVyb19wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV96ZXJvX3Bhc3Nlc19hZnRlcl9vbmVfc2Vjb25kKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3plcm9fcGFzc2VzX2FmdGVyX29uZV9zZWNvbmRfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV96ZXJvX2ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3plcm9fZmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9maWx0ZXJpbmdfZXZlbnRfc3RyZWFtX25vbmVfZmlsdGVyX2Z1bmN0aW9uKHNlbGYpOgotICAgICAgICB0ZXN0X2ZpbHRlcmluZ19ldmVudF9zdHJlYW1fbm9uZV9maWx0ZXJfZnVuY3Rpb25fY29yZSgpCi0KLSAgICBkZWYgdGVzdF9tZXRhZGF0YV9lbXB0eShzZWxmKToKLQotICAgICAgICBAbWV0YWRhdGEoKQotICAgICAgICBkZWYgc2ltcGxlX3Bhc3NfdGVzdChhcmcpOgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNpbXBsZV9wYXNzX3Rlc3QoMSkKLSAgICAgICAgZXhjZXB0IHNpZ25hbHMuVGVzdEZhaWx1cmU6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiQG1ldGFkYXRhKCkgc2hvdWxkIG9ubHkgcmFpc2Ugc2lnbmFscy5UZXN0RmFpbHVyZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgcmFpc2VkICVzIHdpdGggbXNnICVzIGluc3RlYWQiICUgKGUuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoZSkpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJAbWV0YWRhdGEoKSBzaG91bGQgbm90IHdvcmsiKQotCi0gICAgZGVmIHRlc3RfbWV0YWRhdGFfZW1wdHlfbm9fZnVuY3Rpb25fY2FsbChzZWxmKToKLQotICAgICAgICBAbWV0YWRhdGEKLSAgICAgICAgZGVmIHNpbXBsZV9wYXNzX3Rlc3QoYXJnKToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaW1wbGVfcGFzc190ZXN0KDEpCi0gICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RGYWlsdXJlOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkBtZXRhZGF0YSBzaG91bGQgb25seSByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCByYWlzZWQgJXMgd2l0aCBtc2cgJXMgaW5zdGVhZCIgJSAoZS5fX2NsYXNzX18uX19uYW1lX18sIHN0cihlKSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkBtZXRhZGF0YSBzaG91bGQgbm90IHdvcmsiKQotCi0gICAgZGVmIHRlc3RfbWV0YWRhdGFfcHRzX21pc3NpbmdfaWQoc2VsZik6Ci0KLSAgICAgICAgQG1ldGFkYXRhKHB0c190ZXN0X25hbWU9IkhlbGxvIHdvcmxkIikKLSAgICAgICAgZGVmIHNpbXBsZV9wYXNzX3Rlc3QoYXJnKToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaW1wbGVfcGFzc190ZXN0KDEpCi0gICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RGYWlsdXJlOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoInNob3VsZCBvbmx5IHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHJhaXNlZCAlcyB3aXRoIG1zZyAlcyBpbnN0ZWFkIiAlIChlLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKGUpKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgibWlzc2luZyBwdHNfdGVzdF9pZCBzaG91bGQgbm90IHdvcmsiKQotCi0gICAgZGVmIHRlc3RfbWV0YWRhdGFfcHRzX21pc3NpbmdfbmFtZShzZWxmKToKLQotICAgICAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkEvQi9DIikKLSAgICAgICAgZGVmIHNpbXBsZV9wYXNzX3Rlc3QoYXJnKToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaW1wbGVfcGFzc190ZXN0KDEpCi0gICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RGYWlsdXJlOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoInNob3VsZCBvbmx5IHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHJhaXNlZCAlcyB3aXRoIG1zZyAlcyBpbnN0ZWFkIiAlIChlLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKGUpKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgibWlzc2luZyBwdHNfdGVzdF9uYW1lIHNob3VsZCBub3Qgd29yayIpCi0KLSAgICBkZWYgdGVzdF9tZXRhZGF0YV9wdHNfdGVzdF9pZF9hbmRfZGVzY3JpcHRpb24oc2VsZik6Ci0KLSAgICAgICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJBL0IvQyIsIHB0c190ZXN0X25hbWU9IkhlbGxvIHdvcmxkIikKLSAgICAgICAgZGVmIHNpbXBsZV9wYXNzX3Rlc3QoYXJnKToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaW1wbGVfcGFzc190ZXN0KDEpCi0gICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RQYXNzIGFzIGU6Ci0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKCJwdHNfdGVzdF9pZCIgaW4gZS5leHRyYXMsIG1zZz0oInB0c190ZXN0X2lkIG5vdCBpbiBleHRyYTogJXMiICUgc3RyKGUuZXh0cmFzKSkpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF9lcXVhbChlLmV4dHJhc1sicHRzX3Rlc3RfaWQiXSwgIkEvQi9DIikKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoInB0c190ZXN0X25hbWUiIGluIGUuZXh0cmFzLCBtc2c9KCJwdHNfdGVzdF9uYW1lIG5vdCBpbiBleHRyYTogJXMiICUgc3RyKGUuZXh0cmFzKSkpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF9lcXVhbChlLmV4dHJhc1sicHRzX3Rlc3RfbmFtZSJdLCAiSGVsbG8gd29ybGQiKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJNdXN0IHRocm93IGFuIGV4Y2VwdGlvbiB1c2luZyBAbWV0YWRhdGEgZGVjb3JhdG9yIikKLQotICAgIGRlZiB0ZXN0X21ldGFkYXRhX3Rlc3Rfd2l0aF9leGNlcHRpb25fc3RhY2t0cmFjZShzZWxmKToKLQotICAgICAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkEvQi9DIiwgcHRzX3Rlc3RfbmFtZT0iSGVsbG8gd29ybGQiKQotICAgICAgICBkZWYgc2ltcGxlX2ZhaWxfdGVzdChmYWlsdXJlX2FyZ3VtZW50KToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZmFpbHVyZV9hcmd1bWVudCkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaW1wbGVfZmFpbF90ZXN0KCJCRUVGQkVFRiIpCi0gICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RFcnJvciBhcyBlOgotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgicHRzX3Rlc3RfaWQiIGluIGUuZXh0cmFzLCBtc2c9KCJwdHNfdGVzdF9pZCBub3QgaW4gZXh0cmE6ICVzIiAlIHN0cihlLmV4dHJhcykpKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoZS5leHRyYXNbInB0c190ZXN0X2lkIl0sICJBL0IvQyIpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKCJwdHNfdGVzdF9uYW1lIiBpbiBlLmV4dHJhcywgbXNnPSgicHRzX3Rlc3RfbmFtZSBub3QgaW4gZXh0cmE6ICVzIiAlIHN0cihlLmV4dHJhcykpKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoZS5leHRyYXNbInB0c190ZXN0X25hbWUiXSwgIkhlbGxvIHdvcmxkIikKLSAgICAgICAgICAgIHRyYWNlX3N0ciA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICAgICAgInJhaXNlIFZhbHVlRXJyb3IoZmFpbHVyZV9hcmd1bWVudCkiIGluIHRyYWNlX3N0ciwKLSAgICAgICAgICAgICAgICBtc2c9IkZhaWxlZCB0ZXN0IG1ldGhvZCBub3QgaW4gZXJyb3Igc3RhY2sgdHJhY2U6ICVzIiAlIHRyYWNlX3N0cikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiTXVzdCB0aHJvdyBhbiBleGNlcHRpb24gdXNpbmcgQG1ldGFkYXRhIGRlY29yYXRvciIpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3Jfc2ltcGxlKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9zaW1wbGVfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3RoZW5fc2luZ2xlX19jYXB0dXJlc19vbmUoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3NpbmdsZV9fY2FwdHVyZXNfb25lX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3RpbWVzX19jYXB0dXJlc19hbGwoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3RpbWVzX19jYXB0dXJlc19hbGxfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX2Fsd2F5c19fY2FwdHVyZXNfYWxsKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fYWx3YXlzX19jYXB0dXJlc19hbGxfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX21hdGNoZXJfX2NhcHR1cmVzX3JlbGV2YW50KHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fbWF0Y2hlcl9fY2FwdHVyZXNfcmVsZXZhbnRfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3RoZW5fcmVwZWF0ZWRfX2NhcHR1cmVzX3JlbGV2YW50KHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fdGhlbl9yZXBlYXRlZF9fY2FwdHVyZXNfcmVsZXZhbnRfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX2ZhbGxiYWNrX19jYXB0dXJlc19yZWxldmFudChzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX2ZhbGxiYWNrX19jYXB0dXJlc19yZWxldmFudF9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fZGVmYXVsdF91bmhhbmRsZWRfY3Jhc2goc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19kZWZhdWx0X3VuaGFuZGxlZF9jcmFzaF9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fc2V0X2RlZmF1bHRfd29ya3Moc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19zZXRfZGVmYXVsdF93b3Jrc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfZGlmZmVyZW50X2xhbWJkYShzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9kaWZmZXJlbnRfbGFtYmRhX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfYW55dGhpbmcoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfYW55dGhpbmdfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9ub3RfaGFwcGVuZWQoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfbm90X2hhcHBlbmVkX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfd2l0aF9kZWZhdWx0KHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX3dpdGhfZGVmYXVsdF9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX3R3b19ldmVudHNfQUEoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfdHdvX2V2ZW50c19BQV9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX3R3b19ldmVudHNfQUIoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfdHdvX2V2ZW50c19BQl9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX29ubHlfb25lX2V2ZW50X2lzX2RvbmUoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfb25seV9vbmVfZXZlbnRfaXNfZG9uZV9jb3JlKCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvY29udGV4dC5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L2NvbnRleHQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTkyYWIuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvY29udGV4dC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTggLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBlbnVtCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi0KLQotY2xhc3MgQ29udGV4dExldmVsKGVudW0uSW50RW51bSk6Ci0gICAgUk9PVCA9IDAKLSAgICBURVNUQ0xBU1MgPSAxCi0gICAgVEVTVENBU0UgPSAyCi0KLQotZGVmIGdldF9jdXJyZW50X2NvbnRleHQoZGVwdGg9Tm9uZSk6Ci0gICAgIiIiR2V0IHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCBhdCB0aGUgc3BlY2lmaWVkIGRlcHRoLgotICAgIFB1bGxzIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgY29udGV4dCwgd2l0aCBhIGxldmVsIGF0IG9yIGJlbG93IHRoZSBnaXZlbgotICAgIGRlcHRoLCBmcm9tIHRoZSBfY29udGV4dHMgc3RhY2suCi0KLSAgICBBcmdzOgotICAgICAgICBkZXB0aDogVGhlIGRlc2lyZWQgY29udGV4dCBsZXZlbC4gRm9yIGV4YW1wbGUsIHRoZSBURVNUQ0xBU1MgbGV2ZWwgd291bGQKLSAgICAgICAgICAgIHlpZWxkIHRoZSBjdXJyZW50IHRlc3QgY2xhc3MgY29udGV4dCwgZXZlbiBpZiB0aGUgdGVzdCBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgIHdpdGhpbiBhIHRlc3QgY2FzZS4KLQotICAgIFJldHVybnM6IEFuIGluc3RhbmNlIG9mIFRlc3RDb250ZXh0LgotICAgICIiIgotICAgIGlmIGRlcHRoIGlzIE5vbmU6Ci0gICAgICAgIHJldHVybiBfY29udGV4dHNbLTFdCi0gICAgcmV0dXJuIF9jb250ZXh0c1ttaW4oZGVwdGgsIGxlbihfY29udGV4dHMpIC0gMSldCi0KLQotZGVmIGFwcGVuZF90ZXN0X2NvbnRleHQodGVzdF9jbGFzc19uYW1lLCB0ZXN0X25hbWUpOgotICAgICIiIkFkZCB0ZXN0LXNwZWNpZmljIGNvbnRleHQgdG8gdGhlIF9jb250ZXh0cyBzdGFjay4KLSAgICBBIHRlc3Qgc2hvdWxkIHNob3VsZCBjYWxsIGFwcGVuZF90ZXN0X2NvbnRleHQoKSBhdCB0ZXN0IHN0YXJ0IGFuZAotICAgIHBvcF90ZXN0X2NvbnRleHQoKSB1cG9uIHRlc3QgZW5kLgotCi0gICAgQXJnczoKLSAgICAgICAgdGVzdF9jbGFzc19uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNsYXNzLgotICAgICAgICB0ZXN0X25hbWU6IG5hbWUgb2YgdGhlIHRlc3QuCi0gICAgIiIiCi0gICAgaWYgX2NvbnRleHRzOgotICAgICAgICBfY29udGV4dHMuYXBwZW5kKFRlc3RDYXNlQ29udGV4dCh0ZXN0X2NsYXNzX25hbWUsIHRlc3RfbmFtZSkpCi0KLQotZGVmIHBvcF90ZXN0X2NvbnRleHQoKToKLSAgICAiIiJSZW1vdmUgdGhlIGxhdGVzdCB0ZXN0LXNwZWNpZmljIGNvbnRleHQgZnJvbSB0aGUgX2NvbnRleHRzIHN0YWNrLgotICAgIEEgdGVzdCBzaG91bGQgc2hvdWxkIGNhbGwgYXBwZW5kX3Rlc3RfY29udGV4dCgpIGF0IHRlc3Qgc3RhcnQgYW5kCi0gICAgcG9wX3Rlc3RfY29udGV4dCgpIHVwb24gdGVzdCBlbmQuCi0gICAgIiIiCi0gICAgaWYgX2NvbnRleHRzOgotICAgICAgICBfY29udGV4dHMucG9wKCkKLQotCi1jbGFzcyBUZXN0Q29udGV4dChvYmplY3QpOgotICAgICIiIkFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBpbiB3aGljaCBhIHRlc3QgaXMgZXhlY3V0aW5nLgotCi0gICAgVGhlIGNvbnRleHQgZW5jb2RlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdGVzdCBydW5uZXIgd2l0aCByZXNwZWN0IHRvIGEKLSAgICBwYXJ0aWN1bGFyIHNjZW5hcmlvIGluIHdoaWNoIGNvZGUgaXMgYmVpbmcgZXhlY3V0ZWQuIEZvciBleGFtcGxlLCBpZiBzb21lCi0gICAgY29kZSBpcyBiZWluZyBleGVjdXRlZCBhcyBwYXJ0IG9mIGEgdGVzdCBjYXNlLCB0aGVuIHRoZSBjb250ZXh0IHNob3VsZAotICAgIGVuY29kZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IHRlc3QgY2FzZSBzdWNoIGFzIGl0cyBuYW1lIG9yIGVuY2xvc2luZwotICAgIGNsYXNzLgotCi0gICAgVGhlIHN1YmNvbnRleHQgc3BlY2lmaWVzIGEgcmVsYXRpdmUgcGF0aCBpbiB3aGljaCBjZXJ0YWluIG91dHB1dHMsCi0gICAgZS5nLiBsb2djYXQsIHNob3VsZCBiZSBrZXB0IGZvciB0aGUgZ2l2ZW4gY29udGV4dC4KLQotICAgIFRoZSBmdWxsIG91dHB1dCBwYXRoIGlzIGdpdmVuIGJ5Ci0gICAgPGJhc2Vfb3V0cHV0X3BhdGg+Lzxjb250ZXh0X2Rpcj4vPHN1YmNvbnRleHQ+LgotCi0gICAgQXR0cmlidXRlczoKLSAgICAgICAgX2Jhc2Vfb3V0cHV0X3BhdGhzOiBhIGRpY3Rpb25hcnkgbWFwcGluZyBhIGxvZ2dlcidzIG5hbWUgdG8gaXRzIGJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcGF0aAotICAgICAgICBfc3ViY29udGV4dHM6IGEgZGljdGlvbmFyeSBtYXBwaW5nIGEgbG9nZ2VyJ3MgbmFtZSB0byBpdHMKLSAgICAgICAgICAgICAgICAgICAgICBzdWJjb250ZXh0LWxldmVsIG91dHB1dCBkaXJlY3RvcnkKLSAgICAiIiIKLQotICAgIF9iYXNlX291dHB1dF9wYXRocyA9IHt9Ci0gICAgX3N1YmNvbnRleHRzID0ge30KLQotICAgIGRlZiBnZXRfYmFzZV9vdXRwdXRfcGF0aChzZWxmLCBsb2dfbmFtZT1Ob25lKToKLSAgICAgICAgIiIiR2V0cyB0aGUgYmFzZSBvdXRwdXQgcGF0aCBmb3IgdGhpcyBsb2dnZXIuCi0KLSAgICAgICAgVGhlIGJhc2Ugb3V0cHV0IHBhdGggaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIHJlcG9ydGluZyByb290IGZvciB0aGUKLSAgICAgICAgZW50aXJlIHRlc3QgcnVubmVyLgotCi0gICAgICAgIElmIGEgcGF0aCBoYXMgYmVlbiBhZGRlZCB3aXRoIGFkZF9iYXNlX291dHB1dF9wYXRoLCBpdCBpcyByZXR1cm5lZC4KLSAgICAgICAgT3RoZXJ3aXNlLCBhIGRlZmF1bHQgaXMgZGV0ZXJtaW5lZCBieSBfZ2V0X2RlZmF1bHRfYmFzZV9vdXRwdXRfcGF0aCgpLgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBsb2dfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGxvZ2dlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVGhlIG91dHB1dCBwYXRoLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgbG9nX25hbWUgaW4gc2VsZi5fYmFzZV9vdXRwdXRfcGF0aHM6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fYmFzZV9vdXRwdXRfcGF0aHNbbG9nX25hbWVdCi0gICAgICAgIHJldHVybiBzZWxmLl9nZXRfZGVmYXVsdF9iYXNlX291dHB1dF9wYXRoKCkKLQotICAgIGRlZiBnZXRfc3ViY29udGV4dChzZWxmLCBsb2dfbmFtZT1Ob25lKToKLSAgICAgICAgIiIiR2V0cyB0aGUgc3ViY29udGV4dCBmb3IgdGhpcyBsb2dnZXIuCi0KLSAgICAgICAgVGhlIHN1YmNvbnRleHQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIGRpcmVjdG9yeSwgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgIGNvbnRleHQtbGV2ZWwgcGF0aCwgd2hlcmUgYWxsIG91dHB1dHMgb2YgdGhlIGdpdmVuIGxvZ2dlciBhcmUgc3RvcmVkLgotCi0gICAgICAgIElmIGEgcGF0aCBoYXMgYmVlbiBhZGRlZCB3aXRoIGFkZF9zdWJjb250ZXh0LCBpdCBpcyByZXR1cm5lZC4KLSAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBsb2dfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGxvZ2dlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVGhlIG91dHB1dCBwYXRoLgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuX3N1YmNvbnRleHRzLmdldChsb2dfbmFtZSwgJycpCi0KLSAgICBkZWYgZ2V0X2Z1bGxfb3V0cHV0X3BhdGgoc2VsZiwgbG9nX25hbWU9Tm9uZSk6Ci0gICAgICAgICIiIkdldHMgdGhlIGZ1bGwgb3V0cHV0IHBhdGggZm9yIHRoaXMgY29udGV4dC4KLQotICAgICAgICBUaGUgZnVsbCBwYXRoIHJlcHJlc2VudHMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG91dHB1dCBkaXJlY3RvcnksCi0gICAgICAgIGFzIGdpdmVuIGJ5IDxiYXNlX291dHB1dF9wYXRoPi88Y29udGV4dF9kaXI+LzxzdWJjb250ZXh0PgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBsb2dfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGxvZ2dlci4gVXNlZCB0byBzcGVjaWZ5IHRoZSBiYXNlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgIHBhdGggYW5kIHRoZSBzdWJjb250ZXh0LgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBUaGUgb3V0cHV0IHBhdGguCi0gICAgICAgICIiIgotCi0gICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICBzZWxmLmdldF9iYXNlX291dHB1dF9wYXRoKGxvZ19uYW1lKSwgc2VsZi5fZ2V0X2RlZmF1bHRfY29udGV4dF9kaXIoKSwgc2VsZi5nZXRfc3ViY29udGV4dChsb2dfbmFtZSkpCi0gICAgICAgIG9zLm1ha2VkaXJzKHBhdGgsIGV4aXN0X29rPVRydWUpCi0gICAgICAgIHJldHVybiBwYXRoCi0KLSAgICBkZWYgX2dldF9kZWZhdWx0X2Jhc2Vfb3V0cHV0X3BhdGgoc2VsZik6Ci0gICAgICAgICIiIkdldHMgdGhlIGRlZmF1bHQgYmFzZSBvdXRwdXQgcGF0aC4KLQotICAgICAgICBUaGlzIHdpbGwgYXR0ZW1wdCB0byB1c2UgbG9nZ2luZyBwYXRoIHNldCB1cCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgIGxvZ2dlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVGhlIGxvZ2dpbmcgcGF0aC4KLQotICAgICAgICBSYWlzZXM6Ci0gICAgICAgICAgICBFbnZpcm9ubWVudEVycm9yOiBJZiBsb2dnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIGxvZ2dpbmcubG9nX3BhdGgKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGU6Ci0gICAgICAgICAgICByYWlzZSBFbnZpcm9ubWVudEVycm9yKCdUaGUgTW9ibHkgbG9nZ2VyIGhhcyBub3QgYmVlbiBzZXQgdXAgYW5kJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICJiYXNlX291dHB1dF9wYXRoIiBoYXMgbm90IGJlZW4gc2V0LicpIGZyb20gZQotCi0gICAgZGVmIF9nZXRfZGVmYXVsdF9jb250ZXh0X2RpcihzZWxmKToKLSAgICAgICAgIiIiR2V0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGlzIGNvbnRleHQuIiIiCi0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQotCi0KLWNsYXNzIFJvb3RDb250ZXh0KFRlc3RDb250ZXh0KToKLSAgICAiIiJBIFRlc3RDb250ZXh0IHRoYXQgcmVwcmVzZW50cyBhIHRlc3QgcnVuLiIiIgotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGlkZW50aWZpZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiAncm9vdCcKLQotICAgIGRlZiBfZ2V0X2RlZmF1bHRfY29udGV4dF9kaXIoc2VsZik6Ci0gICAgICAgICIiIkdldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhpcyBjb250ZXh0LgotCi0gICAgICAgIExvZ3MgYXQgdGhlIHJvb3QgbGV2ZWwgY29udGV4dCBhcmUgcGxhY2VkIGRpcmVjdGx5IGluIHRoZSBiYXNlIGxldmVsCi0gICAgICAgIGRpcmVjdG9yeSwgc28gbm8gY29udGV4dC1sZXZlbCBwYXRoIGV4aXN0cy4iIiIKLSAgICAgICAgcmV0dXJuICcnCi0KLQotY2xhc3MgVGVzdENhc2VDb250ZXh0KFRlc3RDb250ZXh0KToKLSAgICAiIiJBIFRlc3RDb250ZXh0IHRoYXQgcmVwcmVzZW50cyBhIHRlc3QgY2FzZS4KLQotICAgIEF0dHJpYnV0ZXM6Ci0gICAgICAgIHRlc3RfY2FzZTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZS4KLSAgICAgICAgdGVzdF9jbGFzczogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9jbGFzcywgdGVzdF9jYXNlKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZXMgYSBUZXN0Q2FzZUNvbnRleHQgZm9yIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCi0KLSAgICAgICAgQXJnczoKLSAgICAgICAgICAgIHRlc3RfY2xhc3M6IHRlc3QtY2xhc3MgbmFtZS4KLSAgICAgICAgICAgIHRlc3RfY2FzZTogdGVzdCBuYW1lLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi50ZXN0X2NsYXNzID0gdGVzdF9jbGFzcwotICAgICAgICBzZWxmLnRlc3RfY2FzZSA9IHRlc3RfY2FzZQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIHRlc3RfY2FzZV9uYW1lKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi50ZXN0X2Nhc2UKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiB0ZXN0X2NsYXNzX25hbWUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLnRlc3RfY2xhc3MKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiBpZGVudGlmaWVyKHNlbGYpOgotICAgICAgICByZXR1cm4gJyVzLiVzJyAlIChzZWxmLnRlc3RfY2xhc3NfbmFtZSwgc2VsZi50ZXN0X2Nhc2VfbmFtZSkKLQotICAgIGRlZiBfZ2V0X2RlZmF1bHRfY29udGV4dF9kaXIoc2VsZik6Ci0gICAgICAgICIiIkdldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhpcyBjb250ZXh0LgotCi0gICAgICAgIEZvciBUZXN0Q2FzZUNvbnRleHRzLCB0aGlzIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlIHRlc3QgaXRzZWxmLgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGVzdF9jYXNlX25hbWUKLQotCi0jIHN0YWNrIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dAotX2NvbnRleHRzID0gW1Jvb3RDb250ZXh0KCldCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9nZF9iYXNlX3Rlc3QucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9nZF9iYXNlX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMWY2YmUuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvZ2RfYmFzZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGltcG9ydGxpYgotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBvcwotaW1wb3J0IHRyYWNlYmFjawotCi1mcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKLWZyb20gZ3JwYyBpbXBvcnQgUnBjRXJyb3IKLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdF9saWIgaW1wb3J0IHNldHVwX3Jvb3RjYW5hbAotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdF9saWIgaW1wb3J0IHRlYXJkb3duX3Jvb3RjYW5hbAotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdF9saWIgaW1wb3J0IGR1bXBfY3Jhc2hlc19jb3JlCi1mcm9tIGNlcnQuZ2RfZGV2aWNlX2xpYiBpbXBvcnQgZ2VuZXJhdGVfY292ZXJhZ2VfcmVwb3J0X2Zvcl9ob3N0Ci0KLWZyb20gZmFjYWRlIGltcG9ydCByb290c2VydmljZV9wYjIgYXMgZmFjYWRlX3Jvb3RzZXJ2aWNlCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQuY29udGV4dCBpbXBvcnQgYXBwZW5kX3Rlc3RfY29udGV4dCwgZ2V0X2N1cnJlbnRfY29udGV4dCwgcG9wX3Rlc3RfY29udGV4dCwgQ29udGV4dExldmVsCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0LmdkX2RldmljZSBpbXBvcnQgTU9CTFlfQ09OVFJPTExFUl9DT05GSUdfTkFNRSBhcyBDT05UUk9MTEVSX0NPTkZJR19OQU1FCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0LnRyYWNlbG9nZ2VyIGltcG9ydCBUcmFjZUxvZ2dlcgotCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzLCBzaWduYWxzCi1mcm9tIG1vYmx5IGltcG9ydCBiYXNlX3Rlc3QKLQotCi1jbGFzcyBHZEJhc2VUZXN0Q2xhc3MoYmFzZV90ZXN0LkJhc2VUZXN0Q2xhc3MpOgotCi0gICAgU1VCUFJPQ0VTU19XQUlUX1RJTUVPVVRfU0VDT05EUyA9IDEwCi0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZSwgY2VydF9tb2R1bGUpOgotICAgICAgICBzZWxmLmR1dF9tb2R1bGUgPSBkdXRfbW9kdWxlCi0gICAgICAgIHNlbGYuY2VydF9tb2R1bGUgPSBjZXJ0X21vZHVsZQotICAgICAgICBzZWxmLmxvZyA9IFRyYWNlTG9nZ2VyKGxvZ2dpbmcuZ2V0TG9nZ2VyKCkpCi0gICAgICAgIHNlbGYuZHV0X2NvdmVyYWdlX2luZm8gPSBOb25lCi0gICAgICAgIHNlbGYuY2VydF9jb3ZlcmFnZV9pbmZvID0gTm9uZQotCi0gICAgZGVmIHRlYXJkb3duX2NsYXNzKHNlbGYpOgotICAgICAgICAjIGFzc3VtZSBlYWNoIHRlc3QgcnVucyB0aGUgc2FtZSBiaW5hcnkgZm9yIGR1dCBhbmQgY2VydAotICAgICAgICAjIGdlbmVyYXRlIGNvdmVyYWdlIHJlcG9ydCBhZnRlciBydW5uaW5nIGFsbCB0ZXN0cyBpbiBhIGNsYXNzCi0gICAgICAgIGlmIHNlbGYuZHV0X2NvdmVyYWdlX2luZm86Ci0gICAgICAgICAgICBnZW5lcmF0ZV9jb3ZlcmFnZV9yZXBvcnRfZm9yX2hvc3Qoc2VsZi5kdXRfY292ZXJhZ2VfaW5mbykKLSAgICAgICAgICAgIHNlbGYuZHV0X2NvdmVyYWdlX2luZm8gPSBOb25lCi0gICAgICAgIGlmIHNlbGYuY2VydF9jb3ZlcmFnZV9pbmZvOgotICAgICAgICAgICAgZ2VuZXJhdGVfY292ZXJhZ2VfcmVwb3J0X2Zvcl9ob3N0KHNlbGYuY2VydF9jb3ZlcmFnZV9pbmZvKQotICAgICAgICAgICAgc2VsZi5jZXJ0X2NvdmVyYWdlX2luZm8gPSBOb25lCi0KLSAgICBkZWYgc2V0X2NvbnRyb2xsZXJfcHJvcGVydGllc19wYXRoKHNlbGYsIHBhdGgpOgotICAgICAgICBHRF9ESVIgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIG9zLnBhcmRpcikKLSAgICAgICAgc2VsZi5jb250cm9sbGVyX3Byb3BlcnRpZXNfZmlsZSA9IG9zLnBhdGguam9pbihHRF9ESVIsIHBhdGgpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgYXBwZW5kX3Rlc3RfY29udGV4dCh0ZXN0X2NsYXNzX25hbWU9c2VsZi5UQUcsIHRlc3RfbmFtZT1zZWxmLmN1cnJlbnRfdGVzdF9pbmZvLm5hbWUpCi0gICAgICAgIHNlbGYubG9nX3BhdGhfYmFzZSA9IGdldF9jdXJyZW50X2NvbnRleHQoKS5nZXRfZnVsbF9vdXRwdXRfcGF0aCgpCi0gICAgICAgIHNlbGYudmVyYm9zZV9tb2RlID0gYm9vbChzZWxmLnVzZXJfcGFyYW1zLmdldCgndmVyYm9zZV9tb2RlJywgRmFsc2UpKQotICAgICAgICBmb3IgY29uZmlnIGluIHNlbGYuY29udHJvbGxlcl9jb25maWdzW0NPTlRST0xMRVJfQ09ORklHX05BTUVdOgotICAgICAgICAgICAgY29uZmlnWyd2ZXJib3NlX21vZGUnXSA9IHNlbGYudmVyYm9zZV9tb2RlCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUgPSBzZWxmLmNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIGNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlID0gJycKLQotICAgICAgICBzZWxmLmluZm8gPSBzZXR1cF9yb290Y2FuYWwoCi0gICAgICAgICAgICBkdXRfbW9kdWxlPXNlbGYuZHV0X21vZHVsZSwKLSAgICAgICAgICAgIGNlcnRfbW9kdWxlPXNlbGYuY2VydF9tb2R1bGUsCi0gICAgICAgICAgICB2ZXJib3NlX21vZGU9c2VsZi52ZXJib3NlX21vZGUsCi0gICAgICAgICAgICBsb2dfcGF0aF9iYXNlPXNlbGYubG9nX3BhdGhfYmFzZSwKLSAgICAgICAgICAgIGNvbnRyb2xsZXJfY29uZmlncz1zZWxmLmNvbnRyb2xsZXJfY29uZmlncywKLSAgICAgICAgICAgIGNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlPWNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlKQotICAgICAgICBzZWxmLnJvb3RjYW5hbF9ydW5uaW5nID0gc2VsZi5pbmZvWydyb290Y2FuYWxfcnVubmluZyddCi0gICAgICAgIHNlbGYucm9vdGNhbmFsX2xvZ3BhdGggPSBzZWxmLmluZm9bJ3Jvb3RjYW5hbF9sb2dwYXRoJ10KLSAgICAgICAgc2VsZi5yb290Y2FuYWxfcHJvY2VzcyA9IHNlbGYuaW5mb1sncm9vdGNhbmFsX3Byb2Nlc3MnXQotICAgICAgICBzZWxmLnJvb3RjYW5hbF9sb2dnZXIgPSBzZWxmLmluZm9bJ3Jvb3RjYW5hbF9sb2dnZXInXQotCi0gICAgICAgIGlmICdyb290Y2FuYWwnIGluIHNlbGYuY29udHJvbGxlcl9jb25maWdzOgotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShzZWxmLmluZm9bJ3Jvb3RjYW5hbF9leGlzdCddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUm9vdCBjYW5hbCBkb2VzIG5vdCBleGlzdCBhdCAlcyIgJSBzZWxmLmluZm9bJ3Jvb3RjYW5hbCddKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShzZWxmLmluZm9bJ21ha2Vfcm9vdGNhbmFsX3BvcnRzX2F2YWlsYWJsZSddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG1ha2Ugcm9vdCBjYW5hbCBwb3J0cyBhdmFpbGFibGUiKQotCi0gICAgICAgICAgICBzZWxmLmxvZy5kZWJ1ZygiUnVubmluZyAlcyIgJSAiICIuam9pbihzZWxmLmluZm9bJ3Jvb3RjYW5hbF9jbWQnXSkpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICAgICAgICAgIHNlbGYuaW5mb1snaXNfcm9vdGNhbmFsX3Byb2Nlc3Nfc3RhcnRlZCddLAotICAgICAgICAgICAgICAgIG1zZz0iQ2Fubm90IHN0YXJ0IHJvb3QtY2FuYWwgYXQgIiArIHN0cihzZWxmLmluZm9bJ3Jvb3RjYW5hbCddKSkKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5pbmZvWydpc19zdWJwcm9jZXNzX2FsaXZlJ10sIG1zZz0icm9vdC1jYW5hbCBzdG9wcGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJ1bm5pbmciKQotCi0gICAgICAgICAgICBzZWxmLmNvbnRyb2xsZXJfY29uZmlncyA9IHNlbGYuaW5mb1snY29udHJvbGxlcl9jb25maWdzJ10KLQotICAgICAgICAjIFBhcnNlIGFuZCBjb25zdHJ1Y3QgR0QgZGV2aWNlIG9iamVjdHMKLSAgICAgICAgc2VsZi5yZWdpc3Rlcl9jb250cm9sbGVyKGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCdibHVlYmVycnkudGVzdHMuZ2QuY2VydC5nZF9kZXZpY2UnKSwgYnVpbHRpbj1UcnVlKQotICAgICAgICBzZWxmLmR1dCA9IHNlbGYuZ2RfZGV2aWNlWzFdCi0gICAgICAgIHNlbGYuY2VydCA9IHNlbGYuZ2RfZGV2aWNlWzBdCi0gICAgICAgIGlmIHNlbGYuZHV0Lmhvc3Rfb25seV9kZXZpY2U6Ci0gICAgICAgICAgICBuZXdfZHV0X2NvdmVyYWdlX2luZm8gPSBzZWxmLmR1dC5nZXRfY292ZXJhZ2VfaW5mbygpCi0gICAgICAgICAgICBpZiBzZWxmLmR1dF9jb3ZlcmFnZV9pbmZvOgotICAgICAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZHV0X2NvdmVyYWdlX2luZm8gPT0gbmV3X2R1dF9jb3ZlcmFnZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICBtc2c9IkRVVCBjb3ZlcmFnZSBpbmZvIG11c3QgYmUgdGhlIHNhbWUgZm9yIGVhY2ggdGVzdCBydW4sIG9sZDoge30sIG5ldzoge30iLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHV0X2NvdmVyYWdlX2luZm8sIG5ld19kdXRfY292ZXJhZ2VfaW5mbykpCi0gICAgICAgICAgICBzZWxmLmR1dF9jb3ZlcmFnZV9pbmZvID0gbmV3X2R1dF9jb3ZlcmFnZV9pbmZvCi0gICAgICAgIGlmIHNlbGYuY2VydC5ob3N0X29ubHlfZGV2aWNlOgotICAgICAgICAgICAgbmV3X2NlcnRfY292ZXJhZ2VfaW5mbyA9IHNlbGYuY2VydC5nZXRfY292ZXJhZ2VfaW5mbygpCi0gICAgICAgICAgICBpZiBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbzoKLSAgICAgICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICAgICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbyA9PSBuZXdfY2VydF9jb3ZlcmFnZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICBtc2c9IkNFUlQgY292ZXJhZ2UgaW5mbyBtdXN0IGJlIHRoZSBzYW1lIGZvciBlYWNoIHRlc3QgcnVuLCBvbGQ6IHt9LCBuZXc6IHt9Ii5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbywgbmV3X2NlcnRfY292ZXJhZ2VfaW5mbykpCi0gICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbyA9IG5ld19jZXJ0X2NvdmVyYWdlX2luZm8KLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmR1dC5yb290c2VydmljZS5TdGFydFN0YWNrKAotICAgICAgICAgICAgICAgIGZhY2FkZV9yb290c2VydmljZS5TdGFydFN0YWNrUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3VuZGVyX3Rlc3Q9ZmFjYWRlX3Jvb3RzZXJ2aWNlLkJsdWV0b290aE1vZHVsZS5WYWx1ZShzZWxmLmR1dF9tb2R1bGUpKSkKLSAgICAgICAgZXhjZXB0IFJwY0Vycm9yIGFzIHJwY19lcnJvcjoKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IERVVCBzdGFjaywgUnBjRXJyb3I9eyFyfSIuZm9ybWF0KHJwY19lcnJvcikpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuY2VydC5yb290c2VydmljZS5TdGFydFN0YWNrKAotICAgICAgICAgICAgICAgIGZhY2FkZV9yb290c2VydmljZS5TdGFydFN0YWNrUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3VuZGVyX3Rlc3Q9ZmFjYWRlX3Jvb3RzZXJ2aWNlLkJsdWV0b290aE1vZHVsZS5WYWx1ZShzZWxmLmNlcnRfbW9kdWxlKSkpCi0gICAgICAgIGV4Y2VwdCBScGNFcnJvciBhcyBycGNfZXJyb3I6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkZhaWxlZCB0byBzdGFydCBDRVJUIHN0YWNrLCBScGNFcnJvcj17IXJ9Ii5mb3JtYXQocnBjX2Vycm9yKSkKLSAgICAgICAgc2VsZi5kdXQud2FpdF9jaGFubmVsX3JlYWR5KCkKLSAgICAgICAgc2VsZi5jZXJ0LndhaXRfY2hhbm5lbF9yZWFkeSgpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc3RhY2sgPSAiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzdGFjayA9ICJDRVJUIgotICAgICAgICAgICAgc2VsZi5jZXJ0LnJvb3RzZXJ2aWNlLlN0b3BTdGFjayhmYWNhZGVfcm9vdHNlcnZpY2UuU3RvcFN0YWNrUmVxdWVzdCgpKQotICAgICAgICAgICAgc3RhY2sgPSAiRFVUIgotICAgICAgICAgICAgc2VsZi5kdXQucm9vdHNlcnZpY2UuU3RvcFN0YWNrKGZhY2FkZV9yb290c2VydmljZS5TdG9wU3RhY2tSZXF1ZXN0KCkpCi0gICAgICAgIGV4Y2VwdCBScGNFcnJvciBhcyBycGNfZXJyb3I6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkZhaWxlZCB0byBzdG9wIHt9IHN0YWNrLCBScGNFcnJvcj17IXJ9Ii5mb3JtYXQoc3RhY2ssIHJwY19lcnJvcikpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAjIERlc3Ryb3kgR0QgZGV2aWNlIG9iamVjdHMKLSAgICAgICAgICAgIHNlbGYuX2NvbnRyb2xsZXJfbWFuYWdlci51bnJlZ2lzdGVyX2NvbnRyb2xsZXJzKCkKLSAgICAgICAgICAgIHRlYXJkb3duX3Jvb3RjYW5hbCgKLSAgICAgICAgICAgICAgICByb290Y2FuYWxfcnVubmluZz1zZWxmLnJvb3RjYW5hbF9ydW5uaW5nLAotICAgICAgICAgICAgICAgIHJvb3RjYW5hbF9wcm9jZXNzPXNlbGYucm9vdGNhbmFsX3Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgcm9vdGNhbmFsX2xvZ2dlcj1zZWxmLnJvb3RjYW5hbF9sb2dnZXIsCi0gICAgICAgICAgICAgICAgc3VicHJvY2Vzc193YWl0X3RpbWVvdXRfc2Vjb25kcz1zZWxmLlNVQlBST0NFU1NfV0FJVF9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgICAgICBwb3BfdGVzdF9jb250ZXh0KCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgZ2V0X21vZHVsZV9yZWZlcmVuY2VfbmFtZShhX21vZHVsZSk6Ci0gICAgICAgICIiIlJldHVybnMgdGhlIG1vZHVsZSdzIG1vZHVsZSdzIHN1Ym1vZHVsZSBuYW1lIGFzIHJlZmVyZW5jZSBuYW1lLgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBhX21vZHVsZTogQW55IG1vZHVsZS4gSWRlYWxseSwgYSBjb250cm9sbGVyIG1vZHVsZS4KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZSdzIG5hbWUuCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gYV9tb2R1bGUuX19uYW1lX18uc3BsaXQoJy4nKVstMV0KLQotICAgIGRlZiByZWdpc3Rlcl9jb250cm9sbGVyKHNlbGYsIGNvbnRyb2xsZXJfbW9kdWxlLCByZXF1aXJlZD1UcnVlLCBidWlsdGluPUZhbHNlKToKLSAgICAgICAgIiIiUmVnaXN0ZXJzIGFuIGNvbnRyb2xsZXIgbW9kdWxlIGZvciBhIHRlc3QgY2xhc3MuIEludm9rZXMgTW9ibHkncwotICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiByZWdpc3Rlcl9jb250cm9sbGVyLgotICAgICAgICAiIiIKLSAgICAgICAgbW9kdWxlX3JlZl9uYW1lID0gc2VsZi5nZXRfbW9kdWxlX3JlZmVyZW5jZV9uYW1lKGNvbnRyb2xsZXJfbW9kdWxlKQotICAgICAgICBtb2R1bGVfY29uZmlnX25hbWUgPSBjb250cm9sbGVyX21vZHVsZS5NT0JMWV9DT05UUk9MTEVSX0NPTkZJR19OQU1FCi0KLSAgICAgICAgIyBHZXQgY29udHJvbGxlciBvYmplY3RzIGZyb20gTW9ibHkncyByZWdpc3Rlcl9jb250cm9sbGVyCi0gICAgICAgIGNvbnRyb2xsZXJzID0gc2VsZi5fY29udHJvbGxlcl9tYW5hZ2VyLnJlZ2lzdGVyX2NvbnRyb2xsZXIoY29udHJvbGxlcl9tb2R1bGUsIHJlcXVpcmVkPXJlcXVpcmVkKQotICAgICAgICBpZiBub3QgY29udHJvbGxlcnM6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgICMgTG9nIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24KLSAgICAgICAgIyBJbXBsZW1lbnRhdGlvbiBvZiAiZ2V0X2luZm8iIGlzIG9wdGlvbmFsIGZvciBhIGNvbnRyb2xsZXIgbW9kdWxlLgotICAgICAgICBpZiBoYXNhdHRyKGNvbnRyb2xsZXJfbW9kdWxlLCAiZ2V0X2luZm8iKToKLSAgICAgICAgICAgIGNvbnRyb2xsZXJfaW5mbyA9IGNvbnRyb2xsZXJfbW9kdWxlLmdldF9pbmZvKGNvbnRyb2xsZXJzKQotICAgICAgICAgICAgc2VsZi5sb2cuaW5mbygiQ29udHJvbGxlciAlczogJXMiLCBtb2R1bGVfY29uZmlnX25hbWUsIGNvbnRyb2xsZXJfaW5mbykKLQotICAgICAgICBpZiBidWlsdGluOgotICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtb2R1bGVfcmVmX25hbWUsIGNvbnRyb2xsZXJzKQotICAgICAgICByZXR1cm4gY29udHJvbGxlcnMKLQotICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgotICAgICAgICBhdHRyID0gc3VwZXIoKS5fX2dldGF0dHJpYnV0ZV9fKG5hbWUpCi0gICAgICAgIGlmIG5vdCBjYWxsYWJsZShhdHRyKSBvciBub3QgR2RCYXNlVGVzdENsYXNzLl9faXNfZW50cnlfZnVuY3Rpb24obmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gYXR0cgotCi0gICAgICAgIEB3cmFwcyhhdHRyKQotICAgICAgICBkZWYgX193cmFwcGVkKCphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHIoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICAgICAgZXhjZXB0IFJwY0Vycm9yIGFzIGU6Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uX2luZm8gPSAiIi5qb2luKHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGUuX19jbGFzc19fLCBlLCBlLl9fdHJhY2ViYWNrX18pKQotICAgICAgICAgICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoCi0gICAgICAgICAgICAgICAgICAgICJScGNFcnJvciBkdXJpbmcgdGVzdFxuXG5ScGNFcnJvcjpcblxuJXNcbiVzIiAlIChleGNlcHRpb25faW5mbywgc2VsZi5fX2R1bXBfY3Jhc2hlcygpKSkKLQotICAgICAgICByZXR1cm4gX193cmFwcGVkCi0KLSAgICBfX0VOVFJZX01FVEhPRFMgPSB7InNldHVwX2NsYXNzIiwgInRlYXJkb3duX2NsYXNzIiwgInNldHVwX3Rlc3QiLCAidGVhcmRvd25fdGVzdCJ9Ci0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9faXNfZW50cnlfZnVuY3Rpb24obmFtZSk6Ci0gICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c3dpdGgoInRlc3RfIikgb3IgbmFtZSBpbiBHZEJhc2VUZXN0Q2xhc3MuX19FTlRSWV9NRVRIT0RTCi0KLSAgICBkZWYgX19kdW1wX2NyYXNoZXMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICByZXR1cm46IGZvcm1hdHRlZCBzdGFjayB0cmFjZXMgaWYgZm91bmQsIG9yIGxhc3QgZmV3IGxpbmVzIG9mIGxvZwotICAgICAgICAiIiIKLSAgICAgICAgY3Jhc2hfZGV0YWlsID0gZHVtcF9jcmFzaGVzX2NvcmUoCi0gICAgICAgICAgICBkdXQ9c2VsZi5kdXQsCi0gICAgICAgICAgICBjZXJ0PXNlbGYuY2VydCwKLSAgICAgICAgICAgIHJvb3RjYW5hbF9ydW5uaW5nPXNlbGYucm9vdGNhbmFsX3J1bm5pbmcsCi0gICAgICAgICAgICByb290Y2FuYWxfcHJvY2Vzcz1zZWxmLnJvb3RjYW5hbF9wcm9jZXNzLAotICAgICAgICAgICAgcm9vdGNhbmFsX2xvZ3BhdGg9c2VsZi5yb290Y2FuYWxfbG9ncGF0aCkKLSAgICAgICAgcmV0dXJuIGNyYXNoX2RldGFpbApkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvZ2RfZGV2aWNlLnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvZ2RfZGV2aWNlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGM4YjI3Li4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L2dkX2RldmljZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYWJjIGltcG9ydCBBQkMKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCi1pbXBvcnQgaW5zcGVjdAotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBvcwotaW1wb3J0IHBhdGhsaWIKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaWduYWwKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgdGltZQotZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLQotaW1wb3J0IGdycGMKLQotZnJvbSBjZXJ0LmFzeW5jX3N1YnByb2Nlc3NfbG9nZ2VyIGltcG9ydCBBc3luY1N1YnByb2Nlc3NMb2dnZXIKLWZyb20gY2VydC5nZF9kZXZpY2VfbGliIGltcG9ydCBjcmVhdGVfY29yZQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IGRlc3Ryb3lfY29yZQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IGdldF9pbmZvCi1mcm9tIGNlcnQuZ2RfZGV2aWNlX2xpYiBpbXBvcnQgcmVwbGFjZV92YXJzCi1mcm9tIGNlcnQuZ2RfZGV2aWNlX2xpYiBpbXBvcnQgR2REZXZpY2VCYXNlQ29yZQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IGdldF9jb3ZlcmFnZV9wcm9mZGF0YV9wYXRoX2Zvcl9ob3N0Ci1mcm9tIGNlcnQuZ2RfZGV2aWNlX2xpYiBpbXBvcnQgbWVyZ2VfY292ZXJhZ2VfcHJvZmRhdGFfZm9yX2hvc3QKLWZyb20gY2VydC5nZF9kZXZpY2VfbGliIGltcG9ydCBNT0JMWV9DT05UUk9MTEVSX0NPTkZJR19OQU1FCi1mcm9tIGNlcnQubG9nZ2luZ19jbGllbnRfaW50ZXJjZXB0b3IgaW1wb3J0IExvZ2dpbmdDbGllbnRJbnRlcmNlcHRvcgotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBnZXRfZ2Rfcm9vdAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCByZWFkX2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsCi1mcm9tIGNlcnQub3NfdXRpbHMgaW1wb3J0IGlzX3N1YnByb2Nlc3NfYWxpdmUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgbWFrZV9wb3J0c19hdmFpbGFibGUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgVGVybWluYWxDb2xvcgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBhc3NlcnRzCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0LmFkYiBpbXBvcnQgQmx1ZWJlcnJ5QWRiUHJveHkKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQuYWRiIGltcG9ydCBVVEZfOAotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydC5jb250ZXh0IGltcG9ydCBnZXRfY3VycmVudF9jb250ZXh0Ci0KLWZyb20gbW9ibHkgaW1wb3J0IHV0aWxzCi1mcm9tIG1vYmx5LmNvbnRyb2xsZXJzLmFuZHJvaWRfZGV2aWNlX2xpYi5hZGIgaW1wb3J0IEFkYkVycm9yCi0KLUFEQl9GSUxFX05PVF9FWElTVF9FUlJPUiA9ICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IgotUE9SVF9GT1JXQVJESU5HX0VSUk9SX01TR19QUkVGSVggPSAiRHVyaW5nIHBvcnQgZm9yd2FyZGluZyBjbGVhbnVwOiAiCi1QVUxMX0xPR19GSUxFX0VSUk9SX01TR19QUkVGSVggPSAiV2hpbGUgdHJ5aW5nIHRvIHB1bGwgbG9nIGZpbGVzIgotCi0KLWRlZiBjcmVhdGUoY29uZmlncyk6Ci0gICAgY3JlYXRlX2NvcmUoY29uZmlncykKLSAgICByZXR1cm4gZ2V0X2luc3RhbmNlc193aXRoX2NvbmZpZ3MoY29uZmlncykKLQotCi1kZWYgZGVzdHJveShkZXZpY2VzKToKLSAgICBkZXN0cm95X2NvcmUoZGV2aWNlcykKLQotCi1kZWYgZ2V0X2luc3RhbmNlc193aXRoX2NvbmZpZ3MoY29uZmlncyk6Ci0gICAgcHJpbnQoY29uZmlncykKLSAgICBkZXZpY2VzID0gW10KLSAgICBmb3IgY29uZmlnIGluIGNvbmZpZ3M6Ci0gICAgICAgIHJlc29sdmVkX2NtZCA9IFtdCi0gICAgICAgIGZvciBhcmcgaW4gY29uZmlnWyJjbWQiXToKLSAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoYXJnKQotICAgICAgICAgICAgcmVzb2x2ZWRfY21kLmFwcGVuZChyZXBsYWNlX3ZhcnMoYXJnLCBjb25maWcpKQotICAgICAgICB2ZXJib3NlX21vZGUgPSBib29sKGNvbmZpZy5nZXQoJ3ZlcmJvc2VfbW9kZScsIEZhbHNlKSkKLSAgICAgICAgaWYgY29uZmlnLmdldCgic2VyaWFsX251bWJlciIpOgotICAgICAgICAgICAgZGV2aWNlID0gR2RBbmRyb2lkRGV2aWNlKGNvbmZpZ1siZ3JwY19wb3J0Il0sIGNvbmZpZ1siZ3JwY19yb290X3NlcnZlcl9wb3J0Il0sIGNvbmZpZ1sic2lnbmFsX3BvcnQiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZF9jbWQsIGNvbmZpZ1sibGFiZWwiXSwgTU9CTFlfQ09OVFJPTExFUl9DT05GSUdfTkFNRSwgY29uZmlnWyJuYW1lIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnWyJzZXJpYWxfbnVtYmVyIl0sIHZlcmJvc2VfbW9kZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGRldmljZSA9IEdkSG9zdE9ubHlEZXZpY2UoY29uZmlnWyJncnBjX3BvcnQiXSwgY29uZmlnWyJncnBjX3Jvb3Rfc2VydmVyX3BvcnQiXSwgY29uZmlnWyJzaWduYWxfcG9ydCJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZF9jbWQsIGNvbmZpZ1sibGFiZWwiXSwgTU9CTFlfQ09OVFJPTExFUl9DT05GSUdfTkFNRSwgY29uZmlnWyJuYW1lIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2VfbW9kZSkKLSAgICAgICAgZGV2aWNlLnNldHVwKCkKLSAgICAgICAgZGV2aWNlcy5hcHBlbmQoZGV2aWNlKQotICAgIHJldHVybiBkZXZpY2VzCi0KLQotY2xhc3MgR2REZXZpY2VCYXNlKEdkRGV2aWNlQmFzZUNvcmUpOgotICAgICIiIgotICAgIEJhc2UgR0QgZGV2aWNlIGNsYXNzIHRoYXQgY292ZXJzIGNvbW1vbiB0cmFpdHMgd2hpY2ggYXNzdW1lcyB0aGF0IHRoZQotICAgIGRldmljZSBtdXN0IGJlIGRyaXZlbiBieSBhIGRyaXZlci1saWtlIGJhY2tpbmcgcHJvY2VzcyB0aGF0IHRha2VzIGZvbGxvd2luZwotICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHM6Ci0gICAgLS1ncnBjLXBvcnQ6IG1haW4gZW50cnkgcG9ydCBmb3IgZmFjYWRlIHNlcnZpY2VzCi0gICAgLS1yb290LXNlcnZlci1wb3J0OiBtYW5hZ2VtZW50IHBvcnQgZm9yIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBzZXJ2aWNlcwotICAgIC0tYnRzbm9vcDogcGF0aCB0byBidHNub29wIEhDSSBsb2cKLSAgICAtLXNpZ25hbC1wb3J0OiBzaWduYWxpbmcgcG9ydCB0byBpbmRpY2F0ZSB0aGF0IGJhY2tpbmcgcHJvY2VzcyBpcyBzdGFydGVkCi0gICAgLS1yb290Y2FuYWwtcG9ydDogcm9vdC1jYW5hbCBIQ0kgcG9ydCwgb3B0aW9uYWwKLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncnBjX3BvcnQ6IHN0ciwgZ3JwY19yb290X3NlcnZlcl9wb3J0OiBzdHIsIHNpZ25hbF9wb3J0OiBzdHIsIGNtZDogTGlzdFtzdHJdLCBsYWJlbDogc3RyLAotICAgICAgICAgICAgICAgICB0eXBlX2lkZW50aWZpZXI6IHN0ciwgbmFtZTogc3RyLCB2ZXJib3NlX21vZGU6IGJvb2wpOgotICAgICAgICAiIiJWZXJpZnkgYXJndW1lbnRzIGFuZCBsb2cgcGF0aCwgaW5pdGlhbGl6ZSBCYXNlIEdEIGRldmljZSwgY29tbW9uIHRyYWl0cwotICAgICAgICAgZm9yIGJvdGggZGV2aWNlIGJhc2VkIGFuZCBob3N0IG9ubHkgR0QgY2VydCB0ZXN0cwotICAgICAgICA6cGFyYW0gZ3JwY19wb3J0OiBtYWluIGdSUEMgc2VydmljZSBwb3J0Ci0gICAgICAgIDpwYXJhbSBncnBjX3Jvb3Rfc2VydmVyX3BvcnQ6IGdSUEMgcm9vdCBzZXJ2ZXIgcG9ydAotICAgICAgICA6cGFyYW0gc2lnbmFsX3BvcnQ6IHNpZ25hbGluZyBwb3J0IGZvciBiYWNraW5nIHByb2Nlc3Mgc3RhcnQgdXAKLSAgICAgICAgOnBhcmFtIGNtZDogbGlzdCBvZiBhcmd1bWVudHMgdG8gcnVuIGluIGJhY2tpbmcgcHJvY2VzcwotICAgICAgICA6cGFyYW0gbGFiZWw6IGRldmljZSBsYWJlbCB1c2VkIGluIGxvZ3MKLSAgICAgICAgOnBhcmFtIHR5cGVfaWRlbnRpZmllcjogZGV2aWNlIHR5cGUgaWRlbnRpZmllciB1c2VkIGluIGxvZ3MKLSAgICAgICAgOnBhcmFtIG5hbWU6IG5hbWUgb2YgZGV2aWNlIHVzZWQgaW4gbG9ncwotICAgICAgICAiIiIKLSAgICAgICAgIyBNdXN0IGJlIGF0IHRoZSBmaXJzdCBsaW5lIG9mIF9faW5pdF9fIG1ldGhvZAotICAgICAgICB2YWx1ZXMgPSBsb2NhbHMoKQotICAgICAgICBhcmd1bWVudHMgPSBbdmFsdWVzW2FyZ10gZm9yIGFyZyBpbiBpbnNwZWN0LmdldGZ1bGxhcmdzcGVjKEdkRGV2aWNlQmFzZS5fX2luaXRfXykuYXJncyBpZiBhcmcgIT0gInZlcmJvc2VfbW9kZSJdCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoYWxsKGFyZ3VtZW50cyksICJBbGwgYXJndW1lbnRzIHRvIEdkRGV2aWNlQmFzZSBtdXN0IG5vdCBiZSBOb25lIG5vciBlbXB0eSIpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoYWxsKGNtZCksICJjbWQgbGlzdCBzaG91bGQgbm90IGhhdmUgTm9uZSBub3IgZW1wdHkgY29tcG9uZW50IikKLQotICAgICAgICBzZWxmLmxvZ19wYXRoX2Jhc2UgPSBnZXRfY3VycmVudF9jb250ZXh0KCkuZ2V0X2Z1bGxfb3V0cHV0X3BhdGgoKQotICAgICAgICBzZWxmLnRlc3RfcnVubmVyX2Jhc2VfcGF0aCA9IFwKLSAgICAgICAgICAgIGdldF9jdXJyZW50X2NvbnRleHQoKS5nZXRfYmFzZV9vdXRwdXRfcGF0aCgpCi0KLSAgICAgICAgR2REZXZpY2VCYXNlQ29yZS5fX2luaXRfXyhzZWxmLCBncnBjX3BvcnQsIGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCwgc2lnbmFsX3BvcnQsIGNtZCwgbGFiZWwsIHR5cGVfaWRlbnRpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2ZXJib3NlX21vZGUsIHNlbGYubG9nX3BhdGhfYmFzZSwgc2VsZi50ZXN0X3J1bm5lcl9iYXNlX3BhdGgpCi0KLSAgICBkZWYgc2V0dXAoc2VsZik6Ci0gICAgICAgICIiIkluaGVyaXRlZCBzZXR1cCBtZXRob2QgZnJvbSBiYXNlIGNsYXNzIHRvIHNldCB1cCB0aGlzIGRldmljZSBmb3IgdGVzdCwKLSAgICAgICAgZW5zdXJlIHNpZ25hbCBwb3J0IGlzIGF2YWlsYWJsZSBhbmQgYmFja2luZyBwcm9jZXNzIGlzIHN0YXJ0ZWQgYW5kIGFsaXZlLAotICAgICAgICBtdXN0IHJ1biBiZWZvcmUgdXNpbmcgdGhpcyBkZXZpY2UKLSAgICAgICAgLSBBZnRlciBjYWxsaW5nIHRoaXMsIHRlYXJkb3duKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB0ZXN0IGZpbmlzaGVzCi0gICAgICAgIC0gU2hvdWxkIGJlIGV4ZWN1dGVkIGFmdGVyIGNoaWxkcmVuIGNsYXNzZXMnIHNldHVwKCkgbWV0aG9kcwotICAgICAgICA6cmV0dXJuOgotICAgICAgICAiIiIKLSAgICAgICAgR2REZXZpY2VCYXNlQ29yZS5zZXR1cChzZWxmKQotCi0gICAgICAgICMgRW5zdXJlIGJhY2tpbmcgcHJvY2VzcyBpcyBzdGFydGVkIGFuZCBhbGl2ZQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKHNlbGYuYmFja2luZ19wcm9jZXNzLCBtc2c9IkNhbm5vdCBzdGFydCBiYWNraW5nX3Byb2Nlc3MgYXQgIiArICIgIi5qb2luKHNlbGYuY21kKSkKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgICAgIHNlbGYuaXNfYmFja2luZ19wcm9jZXNzX2FsaXZlLAotICAgICAgICAgICAgbXNnPSJiYWNraW5nX3Byb2Nlc3Mgc3RvcHBlZCBpbW1lZGlhdGVseSBhZnRlciBydW5uaW5nICIgKyAiICIuam9pbihzZWxmLmNtZCkpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICBzZWxmLmdycGNfcm9vdF9zZXJ2ZXJfcmVhZHksIG1zZz0iZ1JQQyByb290IHNlcnZlciBkaWQgbm90IHN0YXJ0IGFmdGVyIHJ1bm5pbmcgIiArICIgIi5qb2luKHNlbGYuY21kKSkKLQotICAgIGRlZiBnZXRfY3Jhc2hfc25pcHBldF9hbmRfbG9nX3RhaWwoc2VsZik6Ci0gICAgICAgIEdkRGV2aWNlQmFzZUNvcmUuZ2V0X2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsKHNlbGYpCi0KLSAgICBkZWYgdGVhcmRvd24oc2VsZik6Ci0gICAgICAgICIiIkluaGVyaXRlZCB0ZWFyZG93biBtZXRob2QgZnJvbSBiYXNlIGNsYXNzIHRvIHRlYXIgZG93biB0aGlzIGRldmljZQotICAgICAgICBhbmQgY2xlYW4gdXAgYW55IHJlc291cmNlcy4KLSAgICAgICAgLSBNdXN0IGJlIGNhbGxlZCBhZnRlciBzZXR1cCgpCi0gICAgICAgIC0gU2hvdWxkIGJlIGV4ZWN1dGVkIGJlZm9yZSBjaGlsZHJlbiBjbGFzc2VzJyB0ZWFyZG93bigpCi0gICAgICAgIDpyZXR1cm46Ci0gICAgICAgICIiIgotICAgICAgICBHZERldmljZUJhc2VDb3JlLnRlYXJkb3duKHNlbGYpCi0KLSAgICBkZWYgd2FpdF9jaGFubmVsX3JlYWR5KHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBHZERldmljZUJhc2VDb3JlLndhaXRfY2hhbm5lbF9yZWFkeShzZWxmKQotICAgICAgICBleGNlcHQgZ3JwYy5GdXR1cmVUaW1lb3V0RXJyb3I6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIlslc10gd2FpdCBjaGFubmVsIHJlYWR5IHRpbWVvdXQiICUgc2VsZi5sYWJlbCkKLQotCi1jbGFzcyBHZEhvc3RPbmx5RGV2aWNlKEdkRGV2aWNlQmFzZSk6Ci0gICAgIiIiCi0gICAgSG9zdCBvbmx5IGRldmljZSB3aGVyZSB0aGUgYmFja2luZyBwcm9jZXNzIGlzIHJ1bm5pbmcgb24gdGhlIGhvc3QgbWFjaGluZQotICAgICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGdycGNfcG9ydDogc3RyLCBncnBjX3Jvb3Rfc2VydmVyX3BvcnQ6IHN0ciwgc2lnbmFsX3BvcnQ6IHN0ciwgY21kOiBMaXN0W3N0cl0sIGxhYmVsOiBzdHIsCi0gICAgICAgICAgICAgICAgIHR5cGVfaWRlbnRpZmllcjogc3RyLCBuYW1lOiBzdHIsIHZlcmJvc2VfbW9kZTogYm9vbCk6Ci0gICAgICAgIHN1cGVyKCkuX19pbml0X18oZ3JwY19wb3J0LCBncnBjX3Jvb3Rfc2VydmVyX3BvcnQsIHNpZ25hbF9wb3J0LCBjbWQsIGxhYmVsLCBNT0JMWV9DT05UUk9MTEVSX0NPTkZJR19OQU1FLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2VfbW9kZSkKLSAgICAgICAgc2VsZi5ob3N0X29ubHlfZGV2aWNlID0gVHJ1ZQotICAgICAgICAjIEVuYWJsZSBMTFZNIGNvZGUgY292ZXJhZ2Ugb3V0cHV0IGZvciBob3N0IG9ubHkgdGVzdHMKLSAgICAgICAgc2VsZi5iYWNraW5nX3Byb2Nlc3NfcHJvZnJhd19wYXRoID0gcGF0aGxpYi5QYXRoKHNlbGYubG9nX3BhdGhfYmFzZSkuam9pbnBhdGgoCi0gICAgICAgICAgICAiJXNfJXNfYmFja2luZ19jb3ZlcmFnZS5wcm9mcmF3IiAlIChzZWxmLnR5cGVfaWRlbnRpZmllciwgc2VsZi5sYWJlbCkpCi0gICAgICAgIHNlbGYuZW52aXJvbm1lbnRbIkxMVk1fUFJPRklMRV9GSUxFIl0gPSBzdHIoc2VsZi5iYWNraW5nX3Byb2Nlc3NfcHJvZnJhd19wYXRoKQotICAgICAgICBsbHZtX2JpbnV0aWxzID0gcGF0aGxpYi5QYXRoKGdldF9nZF9yb290KCkpLmpvaW5wYXRoKCJsbHZtX2JpbnV0aWxzIikuam9pbnBhdGgoImJpbiIpCi0gICAgICAgIGxsdm1fc3ltYm9saXplciA9IGxsdm1fYmludXRpbHMuam9pbnBhdGgoImxsdm0tc3ltYm9saXplciIpCi0gICAgICAgIGlmIGxsdm1fc3ltYm9saXplci5pc19maWxlKCk6Ci0gICAgICAgICAgICBzZWxmLmVudmlyb25tZW50WyJBU0FOX1NZTUJPTElaRVJfUEFUSCJdID0gbGx2bV9zeW1ib2xpemVyCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIlslc10gQ2Fubm90IGZpbmQgTExWTSBzeW1ib2xpemVyIGF0ICVzIiAlIChzZWxmLmxhYmVsLCBzdHIobGx2bV9zeW1ib2xpemVyKSkpCi0gICAgICAgIHNlbGYucHJvZmRhdGFfcGF0aCA9IGdldF9jb3ZlcmFnZV9wcm9mZGF0YV9wYXRoX2Zvcl9ob3N0KHNlbGYudGVzdF9ydW5uZXJfYmFzZV9wYXRoLCBzZWxmLnR5cGVfaWRlbnRpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbCkKLQotICAgIGRlZiB0ZWFyZG93bihzZWxmKToKLSAgICAgICAgc3VwZXIoKS50ZWFyZG93bigpCi0gICAgICAgIG1lcmdlX2NvdmVyYWdlX3Byb2ZkYXRhX2Zvcl9ob3N0KHNlbGYuYmFja2luZ19wcm9jZXNzX3Byb2ZyYXdfcGF0aCwgc2VsZi5wcm9mZGF0YV9wYXRoLCBzZWxmLmxhYmVsKQotCi0gICAgZGVmIGdldF9jb3ZlcmFnZV9pbmZvKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgR2V0IGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY292ZXJhZ2UgcmVwb3J0aW5nCi0gICAgICAgIDpyZXR1cm46IGEgZGljdGlvbmFyeSB3aXRoIGFsbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNvdmVyYWdlIHJlcG9ydGluZwotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICJwcm9mZGF0YV9wYXRoIjogc2VsZi5wcm9mZGF0YV9wYXRoLAotICAgICAgICAgICAgImxhYmVsIjogc2VsZi5sYWJlbCwKLSAgICAgICAgICAgICJ0ZXN0X3J1bm5lcl9iYXNlX3BhdGgiOiBzZWxmLnRlc3RfcnVubmVyX2Jhc2VfcGF0aCwKLSAgICAgICAgICAgICJ0eXBlX2lkZW50aWZpZXIiOiBzZWxmLnR5cGVfaWRlbnRpZmllciwKLSAgICAgICAgICAgICJzdGFja19iaW4iOiBzZWxmLmNtZFswXQotICAgICAgICB9Ci0KLSAgICBkZWYgc2V0dXAoc2VsZik6Ci0gICAgICAgICMgRW5zdXJlIHBvcnRzIGFyZSBhdmFpbGFibGUKLSAgICAgICAgIyBPbmx5IGNoZWNrIG9uIGhvc3Qgb25seSB0ZXN0LCBmb3IgQW5kcm9pZCBkZXZpY2VzLCB0aGVzZSBwb3J0cyB3aWxsCi0gICAgICAgICMgYmUgb3BlbmVkIG9uIEFuZHJvaWQgZGV2aWNlIGFuZCBob3N0IG1hY2hpbmUgcG9ydHMgd2lsbCBiZSBvY2N1cGllZAotICAgICAgICAjIGJ5IHNzaGQgb3IgYWRiIGZvcndhcmRpbmcKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgICAgIG1ha2VfcG9ydHNfYXZhaWxhYmxlKChzZWxmLmdycGNfcG9ydCwgc2VsZi5ncnBjX3Jvb3Rfc2VydmVyX3BvcnQpKSwKLSAgICAgICAgICAgICJbJXNdIEZhaWxlZCB0byBtYWtlIGJhY2tpbmcgcHJvY2VzcyBwb3J0cyBhdmFpbGFibGUiICUgc2VsZi5sYWJlbCkKLSAgICAgICAgc3VwZXIoKS5zZXR1cCgpCi0KLQotY2xhc3MgR2RBbmRyb2lkRGV2aWNlKEdkRGV2aWNlQmFzZSk6Ci0gICAgIiIiUmVhbCBBbmRyb2lkIGRldmljZSB3aGVyZSB0aGUgYmFja2luZyBwcm9jZXNzIGlzIHJ1bm5pbmcgb24gaXQKLSAgICAiIiIKLQotICAgIFdBSVRfRk9SX0RFVklDRV9USU1FT1VUX1NFQ09ORFMgPSAxODAKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncnBjX3BvcnQ6IHN0ciwgZ3JwY19yb290X3NlcnZlcl9wb3J0OiBzdHIsIHNpZ25hbF9wb3J0OiBzdHIsIGNtZDogTGlzdFtzdHJdLCBsYWJlbDogc3RyLAotICAgICAgICAgICAgICAgICB0eXBlX2lkZW50aWZpZXI6IHN0ciwgbmFtZTogc3RyLCBzZXJpYWxfbnVtYmVyOiBzdHIsIHZlcmJvc2VfbW9kZTogYm9vbCk6Ci0gICAgICAgIHN1cGVyKCkuX19pbml0X18oZ3JwY19wb3J0LCBncnBjX3Jvb3Rfc2VydmVyX3BvcnQsIHNpZ25hbF9wb3J0LCBjbWQsIGxhYmVsLCB0eXBlX2lkZW50aWZpZXIsIG5hbWUsIHZlcmJvc2VfbW9kZSkKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShzZXJpYWxfbnVtYmVyLCAic2VyaWFsX251bWJlciBtdXN0IG5vdCBiZSBOb25lIG5vciBlbXB0eSIpCi0gICAgICAgIHNlbGYuc2VyaWFsX251bWJlciA9IHNlcmlhbF9udW1iZXIKLSAgICAgICAgc2VsZi5hZGIgPSBCbHVlYmVycnlBZGJQcm94eShzZXJpYWxfbnVtYmVyKQotCi0gICAgZGVmIHNldHVwKHNlbGYpOgotICAgICAgICBsb2dnaW5nLmluZm8oIlNldHRpbmcgdXAgZGV2aWNlICVzICVzIiAlIChzZWxmLmxhYmVsLCBzZWxmLnNlcmlhbF9udW1iZXIpKQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKHNlbGYuYWRiLmVuc3VyZV9yb290KCksICJkZXZpY2UgJXMgY2Fubm90IHJ1biBhcyByb290Iiwgc2VsZi5zZXJpYWxfbnVtYmVyKQotICAgICAgICBzZWxmLmVuc3VyZV92ZXJpdHlfZGlzYWJsZWQoKQotCi0gICAgICAgICMgVHJ5IGZyZWVpbmcgcG9ydHMgYW5kIGlnbm9yZSByZXN1bHRzCi0gICAgICAgIHNlbGYuY2xlYW51cF9wb3J0X2ZvcndhcmRpbmcoKQotICAgICAgICBzZWxmLnN5bmNfZGV2aWNlX3RpbWUoKQotCi0gICAgICAgICMgU2V0IHVwIHBvcnQgZm9yd2FyZGluZyBvciByZXZlcnNlIG9yIGRpZQotICAgICAgICBzZWxmLnRjcF9mb3J3YXJkX29yX2RpZShzZWxmLmdycGNfcG9ydCwgc2VsZi5ncnBjX3BvcnQpCi0gICAgICAgIHNlbGYudGNwX2ZvcndhcmRfb3JfZGllKHNlbGYuZ3JwY19yb290X3NlcnZlcl9wb3J0LCBzZWxmLmdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkKLSAgICAgICAgc2VsZi50Y3BfcmV2ZXJzZV9vcl9kaWUoc2VsZi5zaWduYWxfcG9ydCwgc2VsZi5zaWduYWxfcG9ydCkKLQotICAgICAgICAjIFB1c2ggdGVzdCBiaW5hcmllcwotICAgICAgICBzZWxmLnB1c2hfb3JfZGllKG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAidGFyZ2V0IiwgImJsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIpLCAic3lzdGVtL2JpbiIpCi0gICAgICAgIHNlbGYucHVzaF9vcl9kaWUoCi0gICAgICAgICAgICBvcy5wYXRoLmpvaW4oZ2V0X2dkX3Jvb3QoKSwgInRhcmdldCIsICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLmNvbnRyb2wtVjEtbmRrLnNvIiksICJzeXN0ZW0vbGliNjQiKQotICAgICAgICBzZWxmLnB1c2hfb3JfZGllKG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAidGFyZ2V0IiwgImxpYmJsdWV0b290aF9nZC5zbyIpLCAic3lzdGVtL2xpYjY0IikKLSAgICAgICAgc2VsZi5wdXNoX29yX2RpZShvcy5wYXRoLmpvaW4oZ2V0X2dkX3Jvb3QoKSwgInRhcmdldCIsICJsaWJncnBjKytfdW5zZWN1cmUuc28iKSwgInN5c3RlbS9saWI2NCIpCi0gICAgICAgIHNlbGYucHVzaF9vcl9kaWUob3MucGF0aC5qb2luKGdldF9nZF9yb290KCksICJ0YXJnZXQiLCAibGliZ3JwYysrLnNvIiksICJzeXN0ZW0vbGliNjQiKQotICAgICAgICBzZWxmLnB1c2hfb3JfZGllKG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAidGFyZ2V0IiwgImxpYmdycGNfd3JhcC5zbyIpLCAic3lzdGVtL2xpYjY0IikKLSAgICAgICAgc2VsZi5wdXNoX29yX2RpZShvcy5wYXRoLmpvaW4oZ2V0X2dkX3Jvb3QoKSwgInRhcmdldCIsICJsaWJzdGF0c2xvZ19idC5zbyIpLCAic3lzdGVtL2xpYjY0IikKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5zaGVsbCgicm0gL2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub29wX2hjaS5sb2ciKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICBpZiBBREJfRklMRV9OT1RfRVhJU1RfRVJST1Igbm90IGluIHN0cihlcnJvcik6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiRXJyb3IgZHVyaW5nIHNldHVwOiAiICsgc3RyKGVycm9yKSkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5zaGVsbCgicm0gL2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub296X2hjaS5sb2ciKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICBpZiBBREJfRklMRV9OT1RfRVhJU1RfRVJST1Igbm90IGluIHN0cihlcnJvcik6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiRXJyb3IgZHVyaW5nIHNldHVwOiAiICsgc3RyKGVycm9yKSkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5zaGVsbCgicm0gL2RhdGEvbWlzYy9ibHVlZHJvaWQvYnRfY29uZmlnLmNvbmYiKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICBpZiBBREJfRklMRV9OT1RfRVhJU1RfRVJST1Igbm90IGluIHN0cihlcnJvcik6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiRXJyb3IgZHVyaW5nIHNldHVwOiAiICsgc3RyKGVycm9yKSkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5zaGVsbCgicm0gL2RhdGEvbWlzYy9ibHVlZHJvaWQvYnRfY29uZmlnLmJhayIpCi0gICAgICAgIGV4Y2VwdCBBZGJFcnJvciBhcyBlcnJvcjoKLSAgICAgICAgICAgIGlmIEFEQl9GSUxFX05PVF9FWElTVF9FUlJPUiBub3QgaW4gc3RyKGVycm9yKToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJFcnJvciBkdXJpbmcgc2V0dXA6ICIgKyBzdHIoZXJyb3IpKQotCi0gICAgICAgIHNlbGYuZW5zdXJlX25vX291dHB1dChzZWxmLmFkYi5zaGVsbCgic3ZjIGJsdWV0b290aCBkaXNhYmxlIikpCi0KLSAgICAgICAgIyBTdGFydCBsb2djYXQgbG9nZ2luZwotICAgICAgICBzZWxmLmxvZ2NhdF9vdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbigKLSAgICAgICAgICAgIHNlbGYubG9nX3BhdGhfYmFzZSwgJyVzXyVzXyVzX2xvZ2NhdF9sb2dzLnR4dCcgJSAoc2VsZi50eXBlX2lkZW50aWZpZXIsIHNlbGYubGFiZWwsIHNlbGYuc2VyaWFsX251bWJlcikpCi0gICAgICAgIHNlbGYubG9nY2F0X2NtZCA9IFsiYWRiIiwgIi1zIiwgc2VsZi5zZXJpYWxfbnVtYmVyLCAibG9nY2F0IiwgIi1UIiwgIjEiLCAiLXYiLCAieWVhciIsICItdiIsICJ1aWQiXQotICAgICAgICBsb2dnaW5nLmRlYnVnKCJSdW5uaW5nICVzIiwgIiAiLmpvaW4oc2VsZi5sb2djYXRfY21kKSkKLSAgICAgICAgc2VsZi5sb2djYXRfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgICAgICBzZWxmLmxvZ2NhdF9jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5sb2djYXRfcHJvY2VzcywgbXNnPSJDYW5ub3Qgc3RhcnQgbG9nY2F0X3Byb2Nlc3MgYXQgIiArICIgIi5qb2luKHNlbGYubG9nY2F0X2NtZCkpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICBpc19zdWJwcm9jZXNzX2FsaXZlKHNlbGYubG9nY2F0X3Byb2Nlc3MpLAotICAgICAgICAgICAgbXNnPSJsb2djYXRfcHJvY2VzcyBzdG9wcGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJ1bm5pbmcgIiArICIgIi5qb2luKHNlbGYubG9nY2F0X2NtZCkpCi0gICAgICAgIHNlbGYubG9nY2F0X2xvZ2dlciA9IEFzeW5jU3VicHJvY2Vzc0xvZ2dlcigKLSAgICAgICAgICAgIHNlbGYubG9nY2F0X3Byb2Nlc3MsIFtzZWxmLmxvZ2NhdF9vdXRwdXRfcGF0aF0sCi0gICAgICAgICAgICBsb2dfdG9fc3Rkb3V0PXNlbGYudmVyYm9zZV9tb2RlLAotICAgICAgICAgICAgdGFnPSIlc18lcyIgJSAoc2VsZi5sYWJlbCwgc2VsZi5zZXJpYWxfbnVtYmVyKSwKLSAgICAgICAgICAgIGNvbG9yPXNlbGYudGVybWluYWxfY29sb3IpCi0KLSAgICAgICAgIyBEb25lIHJ1biBwYXJlbnQgc2V0dXAKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJEb25lIHByZXBhcmF0aW9uIGZvciAlcywgc3RhcnRpbmcgYmFja2luZyBwcm9jZXNzIiAlIHNlbGYuc2VyaWFsX251bWJlcikKLSAgICAgICAgc3VwZXIoKS5zZXR1cCgpCi0KLSAgICBkZWYgdGVhcmRvd24oc2VsZik6Ci0gICAgICAgIHN1cGVyKCkudGVhcmRvd24oKQotICAgICAgICBzdG9wX3NpZ25hbCA9IHNpZ25hbC5TSUdJTlQKLSAgICAgICAgc2VsZi5sb2djYXRfcHJvY2Vzcy5zZW5kX3NpZ25hbChzdG9wX3NpZ25hbCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSBzZWxmLmxvZ2NhdF9wcm9jZXNzLndhaXQodGltZW91dD1zZWxmLldBSVRfQ0hBTk5FTF9SRUFEWV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiWyVzXyVzXSBGYWlsZWQgdG8gaW50ZXJydXB0IGxvZ2NhdCBwcm9jZXNzIHZpYSBTSUdJTlQsIHNlbmRpbmcgU0lHS0lMTCIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sYWJlbCwgc2VsZi5zZXJpYWxfbnVtYmVyKSkKLSAgICAgICAgICAgIHN0b3Bfc2lnbmFsID0gc2lnbmFsLlNJR0tJTEwKLSAgICAgICAgICAgIHNlbGYubG9nY2F0X3Byb2Nlc3Mua2lsbCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSBzZWxmLmxvZ2NhdF9wcm9jZXNzLndhaXQodGltZW91dD1zZWxmLldBSVRfQ0hBTk5FTF9SRUFEWV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJGYWlsZWQgdG8ga2lsbCBsb2djYXRfcHJvY2VzcyAlcyAlcyIgJSAoc2VsZi5sYWJlbCwgc2VsZi5zZXJpYWxfbnVtYmVyKSkKLSAgICAgICAgICAgICAgICByZXR1cm5fY29kZSA9IC02NTUzNgotICAgICAgICBpZiByZXR1cm5fY29kZSBub3QgaW4gWy1zdG9wX3NpZ25hbCwgMF06Ci0gICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJsb2djYXRfcHJvY2VzcyAlc18lcyBzdG9wcGVkIHdpdGggY29kZTogJWQiICUgKHNlbGYubGFiZWwsIHNlbGYuc2VyaWFsX251bWJlciwgcmV0dXJuX2NvZGUpKQotICAgICAgICBzZWxmLmxvZ2NhdF9sb2dnZXIuc3RvcCgpCi0gICAgICAgIHNlbGYuY2xlYW51cF9wb3J0X2ZvcndhcmRpbmcoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5wdWxsKFsKLSAgICAgICAgICAgICAgICAiL2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub29wX2hjaS5sb2ciLAotICAgICAgICAgICAgICAgIHN0cihvcy5wYXRoLmpvaW4oc2VsZi5sb2dfcGF0aF9iYXNlLCAiJXNfYnRzbm9vcF9oY2kubG9nIiAlIHNlbGYubGFiZWwpKQotICAgICAgICAgICAgXSkKLSAgICAgICAgZXhjZXB0IEFkYkVycm9yIGFzIGVycm9yOgotICAgICAgICAgICAgIyBTb21lIHRlc3RzIGhhdmUgbm8gc25vb3AgbG9ncywgYW5kIHRoYXQncyBPSwotICAgICAgICAgICAgaWYgQURCX0ZJTEVfTk9UX0VYSVNUX0VSUk9SIG5vdCBpbiBzdHIoZXJyb3IpOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoUFVMTF9MT0dfRklMRV9FUlJPUl9NU0dfUFJFRklYICsgc3RyKGVycm9yKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hZGIucHVsbChbCi0gICAgICAgICAgICAgICAgIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIiwKLSAgICAgICAgICAgICAgICBzdHIob3MucGF0aC5qb2luKHNlbGYubG9nX3BhdGhfYmFzZSwgIiVzX2J0X2NvbmZpZy5jb25mIiAlIHNlbGYubGFiZWwpKQotICAgICAgICAgICAgXSkKLSAgICAgICAgZXhjZXB0IEFkYkVycm9yIGFzIGVycm9yOgotICAgICAgICAgICAgIyBTb21lIHRlc3RzIGhhdmUgbm8gY29uZmlnIGZpbGUsIGFuZCB0aGF0J3MgT0sKLSAgICAgICAgICAgIGlmIEFEQl9GSUxFX05PVF9FWElTVF9FUlJPUiBub3QgaW4gc3RyKGVycm9yKToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKFBVTExfTE9HX0ZJTEVfRVJST1JfTVNHX1BSRUZJWCArIHN0cihlcnJvcikpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYWRiLnB1bGwoWwotICAgICAgICAgICAgICAgICIvZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuYmFrIiwKLSAgICAgICAgICAgICAgICBzdHIob3MucGF0aC5qb2luKHNlbGYubG9nX3BhdGhfYmFzZSwgIiVzX2J0X2NvbmZpZy5iYWsiICUgc2VsZi5sYWJlbCkpCi0gICAgICAgICAgICBdKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICAjIFNvbWUgdGVzdHMgaGF2ZSBubyBjb25maWcuYmFrIGZpbGUsIGFuZCB0aGF0J3MgT0sKLSAgICAgICAgICAgIGlmIEFEQl9GSUxFX05PVF9FWElTVF9FUlJPUiBub3QgaW4gc3RyKGVycm9yKToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKFBVTExfTE9HX0ZJTEVfRVJST1JfTVNHX1BSRUZJWCArIHN0cihlcnJvcikpCi0KLSAgICBkZWYgY2xlYW51cF9wb3J0X2ZvcndhcmRpbmcoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYWRiLnJlbW92ZV90Y3BfZm9yd2FyZChzZWxmLmdycGNfcG9ydCkKLSAgICAgICAgZXhjZXB0IEFkYkVycm9yIGFzIGVycm9yOgotICAgICAgICAgICAgbXNnID0gUE9SVF9GT1JXQVJESU5HX0VSUk9SX01TR19QUkVGSVggKyBzdHIoZXJyb3IpCi0gICAgICAgICAgICBpZiAibm90IGZvdW5kIiBpbiBtc2c6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKG1zZykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcihtc2cpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hZGIucmVtb3ZlX3RjcF9mb3J3YXJkKHNlbGYuZ3JwY19yb290X3NlcnZlcl9wb3J0KQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICBtc2cgPSBQT1JUX0ZPUldBUkRJTkdfRVJST1JfTVNHX1BSRUZJWCArIHN0cihlcnJvcikKLSAgICAgICAgICAgIGlmICJub3QgZm91bmQiIGluIG1zZzoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8obXNnKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKG1zZykKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5yZXZlcnNlKFsiLS1yZW1vdmUiLCAidGNwOiVkIiAlIHNlbGYuc2lnbmFsX3BvcnRdKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICBtc2cgPSBQT1JUX0ZPUldBUkRJTkdfRVJST1JfTVNHX1BSRUZJWCArIHN0cihlcnJvcikKLSAgICAgICAgICAgIGlmICJub3QgZm91bmQiIGluIG1zZzoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8obXNnKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKG1zZykKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgZW5zdXJlX25vX291dHB1dChyZXN1bHQpOgotICAgICAgICAiIiIKLSAgICAgICAgRW5zdXJlIGEgY29tbWFuZCBoYXMgbm90IG91dHB1dAotICAgICAgICAiIiIKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgICAgIHJlc3VsdCBpcyBOb25lIG9yIGxlbihyZXN1bHQpID09IDAsIG1zZz0iY29tbWFuZCByZXR1cm5lZCBzb21ldGhpbmcgd2hlbiBpdCBzaG91bGRuJ3Q6ICVzIiAlIHJlc3VsdCkKLQotICAgIGRlZiBzeW5jX2RldmljZV90aW1lKHNlbGYpOgotICAgICAgICBzZWxmLmFkYi5zaGVsbCgic2V0dGluZ3MgcHV0IGdsb2JhbCBhdXRvX3RpbWUgMCIpCi0gICAgICAgIHNlbGYuYWRiLnNoZWxsKCJzZXR0aW5ncyBwdXQgZ2xvYmFsIGF1dG9fdGltZV96b25lIDAiKQotICAgICAgICBkZXZpY2VfdHogPSBzZWxmLmFkYi5zaGVsbCgiZGF0ZSArJXoiKS5kZWNvZGUoVVRGXzgpLnJzdHJpcCgpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoZGV2aWNlX3R6LCAiZGF0ZSArJXogbXVzdCByZXR1cm4gZGV2aWNlIHRpbWV6b25lLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCB7fSBpbnN0ZWFkIi5mb3JtYXQoZGV2aWNlX3R6KSkKLSAgICAgICAgaG9zdF90eiA9IHRpbWUuc3RyZnRpbWUoIiV6IikKLSAgICAgICAgaWYgZGV2aWNlX3R6ICE9IGhvc3RfdHo6Ci0gICAgICAgICAgICB0YXJnZXRfdGltZXpvbmUgPSB1dGlscy5nZXRfdGltZXpvbmVfb2xzb25faWQoKQotICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiRGV2aWNlIHRpbWV6b25lICVzIGRvZXMgbm90IG1hdGNoIGhvc3QgdGltZXpvbmUgJXMsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bmNpbmcgdGhlbSBieSBzZXR0aW5nIHRpbWV6b25lIHRvICVzIiAlIChkZXZpY2VfdHosIGhvc3RfdHosIHRhcmdldF90aW1lem9uZSkpCi0gICAgICAgICAgICBzZWxmLmFkYi5zaGVsbCgic2V0cHJvcCBwZXJzaXN0LnN5cy50aW1lem9uZSAlcyIgJSB0YXJnZXRfdGltZXpvbmUpCi0gICAgICAgICAgICBzZWxmLnJlYm9vdCgpCi0gICAgICAgICAgICBzZWxmLmFkYi5yZW1vdW50KCkKLSAgICAgICAgICAgIGRldmljZV90eiA9IHNlbGYuYWRiLnNoZWxsKCJkYXRlICsleiIpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF9lcXVhbCgKLSAgICAgICAgICAgICAgICBob3N0X3R6LCBkZXZpY2VfdHosICJEZXZpY2UgdGltZXpvbmUgJXMgc3RpbGwgZG9lcyBub3QgbWF0Y2ggaG9zdCAiCi0gICAgICAgICAgICAgICAgInRpbWV6b25lICVzIGFmdGVyIHJlc2V0IiAlIChkZXZpY2VfdHosIGhvc3RfdHopKQotICAgICAgICBzZWxmLmFkYi5zaGVsbCgiZGF0ZSAlcyIgJSB0aW1lLnN0cmZ0aW1lKCIlbSVkJUglTSVZLiVTIikpCi0gICAgICAgIGRhdGV0aW1lX2Zvcm1hdCA9ICIlWS0lbS0lZFQlSDolTTolUyV6IgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkZXZpY2VfdGltZSA9IGRhdGV0aW1lLnN0cnB0aW1lKAotICAgICAgICAgICAgICAgIHNlbGYuYWRiLnNoZWxsKCJkYXRlICsnJXMnIiAlIGRhdGV0aW1lX2Zvcm1hdCkuZGVjb2RlKFVURl84KS5yc3RyaXAoKSwgZGF0ZXRpbWVfZm9ybWF0KQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiRmFpbGVkIHRvIGdldCB0aW1lIGFmdGVyIHN5bmMiKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICMgSW5jbHVkZSBBREIgZGVsYXkgdGhhdCBtaWdodCBiZSBsb25nZXIgaW4gU1NIIGVudmlyb25tZW50Ci0gICAgICAgIG1heF9kZWx0YV9zZWNvbmRzID0gMwotICAgICAgICBob3N0X3RpbWUgPSBkYXRldGltZS5ub3codHo9ZGV2aWNlX3RpbWUudHppbmZvKQotICAgICAgICBhc3NlcnRzLmFzc2VydF9hbG1vc3RfZXF1YWwoCi0gICAgICAgICAgICAoZGV2aWNlX3RpbWUgLSBob3N0X3RpbWUpLnRvdGFsX3NlY29uZHMoKSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICBtc2c9IkRldmljZSB0aW1lICVzIGFuZCBob3N0IHRpbWUgJXMgb2ZmIGJ5ID4lZG1zIGFmdGVyIHN5bmMiICUKLSAgICAgICAgICAgIChkZXZpY2VfdGltZS5pc29mb3JtYXQoKSwgaG9zdF90aW1lLmlzb2Zvcm1hdCgpLCBpbnQobWF4X2RlbHRhX3NlY29uZHMgKiAxMDAwKSksCi0gICAgICAgICAgICBkZWx0YT1tYXhfZGVsdGFfc2Vjb25kcykKLQotICAgIGRlZiBwdXNoX29yX2RpZShzZWxmLCBzcmNfZmlsZV9wYXRoLCBkc3RfZmlsZV9wYXRoLCBwdXNoX3RpbWVvdXQ9MzAwKToKLSAgICAgICAgIiIiUHVzaGVzIGEgZmlsZSB0byB0aGUgQW5kcm9pZCBkZXZpY2UKLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgc3JjX2ZpbGVfcGF0aDogVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gaW5zdGFsbC4KLSAgICAgICAgICAgIGRzdF9maWxlX3BhdGg6IFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgIHB1c2hfdGltZW91dDogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHB1c2ggdG8gZmluaXNoIGluIHNlY29uZHMKLSAgICAgICAgIiIiCi0gICAgICAgIG91dCA9IHNlbGYuYWRiLnB1c2goW3NyY19maWxlX3BhdGgsIGRzdF9maWxlX3BhdGhdLCB0aW1lb3V0PXB1c2hfdGltZW91dCkuZGVjb2RlKFVURl84KS5yc3RyaXAoKQotICAgICAgICBpZiAnZXJyb3InIGluIG91dDoKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgnVW5hYmxlIHRvIHB1c2ggZmlsZSAlcyB0byAlcyBkdWUgdG8gJXMnICUgKHNyY19maWxlX3BhdGgsIGRzdF9maWxlX3BhdGgsIG91dCkpCi0KLSAgICBkZWYgdGNwX2ZvcndhcmRfb3JfZGllKHNlbGYsIGhvc3RfcG9ydCwgZGV2aWNlX3BvcnQsIG51bV9yZXRyeT0xKToKLSAgICAgICAgIiIiCi0gICAgICAgIEZvcndhcmQgYSBUQ1AgcG9ydCBmcm9tIGhvc3QgdG8gZGV2aWNlIG9yIGZhaWwKLSAgICAgICAgOnBhcmFtIGhvc3RfcG9ydDogaG9zdCBwb3J0LCBpbnQsIDAgZm9yIGFkYiB0byBhc3NpZ24gb25lCi0gICAgICAgIDpwYXJhbSBkZXZpY2VfcG9ydDogZGV2aWNlIHBvcnQsIGludAotICAgICAgICA6cGFyYW0gbnVtX3JldHJ5OiBudW1iZXIgb2YgdGltZXMgdG8gcmVib290IGFuZCByZXRyeSB0aGlzIGJlZm9yZSBkeWluZwotICAgICAgICA6cmV0dXJuOiBob3N0IHBvcnQgaW50Ci0gICAgICAgICIiIgotICAgICAgICBlcnJvcl9vcl9wb3J0ID0gc2VsZi5hZGIudGNwX2ZvcndhcmQoaG9zdF9wb3J0LCBkZXZpY2VfcG9ydCkKLSAgICAgICAgaWYgbm90IGVycm9yX29yX3BvcnQ6Ci0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJob3N0IHBvcnQgJWQgd2FzIGFscmVhZHkgZm9yd2FyZGVkIiAlIGhvc3RfcG9ydCkKLSAgICAgICAgICAgIHJldHVybiBob3N0X3BvcnQKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXJyb3Jfb3JfcG9ydCwgaW50KToKLSAgICAgICAgICAgIGlmIG51bV9yZXRyeSA+IDA6Ci0gICAgICAgICAgICAgICAgIyBJZiByZXF1ZXN0ZWQsIHJlYm9vdCBhbiByZXRyeQotICAgICAgICAgICAgICAgIG51bV9yZXRyeSAtPSAxCi0gICAgICAgICAgICAgICAgbG9nZ2luZy53YXJuaW5nKAotICAgICAgICAgICAgICAgICAgICAiWyVzXSBGYWlsZWQgdG8gVENQIGZvcndhcmQgaG9zdCBwb3J0ICVkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgImRldmljZSBwb3J0ICVkLCBudW1fcmV0cmllcyBsZWZ0IGlzICVkIiAlIChzZWxmLmxhYmVsLCBob3N0X3BvcnQsIGRldmljZV9wb3J0LCBudW1fcmV0cnkpKQotICAgICAgICAgICAgICAgIHNlbGYucmVib290KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFkYi5yZW1vdW50KCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50Y3BfZm9yd2FyZF9vcl9kaWUoaG9zdF9wb3J0LCBkZXZpY2VfcG9ydCwgbnVtX3JldHJ5PW51bV9yZXRyeSkKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgKLSAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIGZvcndhcmQgaG9zdCBwb3J0ICVkIHRvIGRldmljZSBwb3J0ICVkLCBlcnJvciAlcycgJSAoaG9zdF9wb3J0LCBkZXZpY2VfcG9ydCwgZXJyb3Jfb3JfcG9ydCkpCi0gICAgICAgIHJldHVybiBlcnJvcl9vcl9wb3J0Ci0KLSAgICBkZWYgdGNwX3JldmVyc2Vfb3JfZGllKHNlbGYsIGRldmljZV9wb3J0LCBob3N0X3BvcnQsIG51bV9yZXRyeT0xKToKLSAgICAgICAgIiIiCi0gICAgICAgIEZvcndhcmQgYSBUQ1AgcG9ydCBmcm9tIGRldmljZSB0byBob3N0IG9yIGZhaWwKLSAgICAgICAgOnBhcmFtIGRldmljZV9wb3J0OiBkZXZpY2UgcG9ydCwgaW50LCAwIGZvciBhZGIgdG8gYXNzaWduIG9uZQotICAgICAgICA6cGFyYW0gaG9zdF9wb3J0OiBob3N0IHBvcnQsIGludAotICAgICAgICA6cGFyYW0gbnVtX3JldHJ5OiBudW1iZXIgb2YgdGltZXMgdG8gcmVib290IGFuZCByZXRyeSB0aGlzIGJlZm9yZSBkeWluZwotICAgICAgICA6cmV0dXJuOiBkZXZpY2UgcG9ydCBpbnQKLSAgICAgICAgIiIiCi0gICAgICAgIGVycm9yX29yX3BvcnQgPSBzZWxmLmFkYi5yZXZlcnNlKFsidGNwOiVkIiAlIGRldmljZV9wb3J0LCAidGNwOiVkIiAlIGhvc3RfcG9ydF0pCi0gICAgICAgIGlmIG5vdCBlcnJvcl9vcl9wb3J0OgotICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiZGV2aWNlIHBvcnQgJWQgd2FzIGFscmVhZHkgcmV2ZXJzZWQiICUgZGV2aWNlX3BvcnQpCi0gICAgICAgICAgICByZXR1cm4gZGV2aWNlX3BvcnQKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZXJyb3Jfb3JfcG9ydCA9IGludChlcnJvcl9vcl9wb3J0KQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIGlmIG51bV9yZXRyeSA+IDA6Ci0gICAgICAgICAgICAgICAgIyBJZiByZXF1ZXN0ZWQsIHJlYm9vdCBhbiByZXRyeQotICAgICAgICAgICAgICAgIG51bV9yZXRyeSAtPSAxCi0gICAgICAgICAgICAgICAgbG9nZ2luZy53YXJuaW5nKAotICAgICAgICAgICAgICAgICAgICAiWyVzXSBGYWlsZWQgdG8gVENQIHJldmVyc2UgZGV2aWNlIHBvcnQgJWQgdG8gIgotICAgICAgICAgICAgICAgICAgICAiaG9zdCBwb3J0ICVkLCBudW1fcmV0cmllcyBsZWZ0IGlzICVkIiAlIChzZWxmLmxhYmVsLCBkZXZpY2VfcG9ydCwgaG9zdF9wb3J0LCBudW1fcmV0cnkpKQotICAgICAgICAgICAgICAgIHNlbGYucmVib290KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFkYi5yZW1vdW50KCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50Y3BfcmV2ZXJzZV9vcl9kaWUoZGV2aWNlX3BvcnQsIGhvc3RfcG9ydCwgbnVtX3JldHJ5PW51bV9yZXRyeSkKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgKLSAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHJldmVyc2UgZGV2aWNlIHBvcnQgJWQgdG8gaG9zdCBwb3J0ICVkLCBlcnJvciAlcycgJSAoZGV2aWNlX3BvcnQsIGhvc3RfcG9ydCwgZXJyb3Jfb3JfcG9ydCkpCi0gICAgICAgIHJldHVybiBlcnJvcl9vcl9wb3J0Ci0KLSAgICBkZWYgZW5zdXJlX3Zlcml0eV9kaXNhYmxlZChzZWxmKToKLSAgICAgICAgIiIiRW5zdXJlcyB0aGF0IHZlcml0eSBpcyBlbmFibGVkLgotCi0gICAgICAgIElmIHZlcml0eSBpcyBub3QgZW5hYmxlZCwgdGhpcyBjYWxsIHdpbGwgcmVib290IHRoZSBwaG9uZS4gTm90ZSB0aGF0Ci0gICAgICAgIHRoaXMgb25seSB3b3JrcyBvbiBkZWJ1Z2dhYmxlIGJ1aWxkcy4KLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIkRpc2FibGluZyB2ZXJpdHkgYW5kIHJlbW91bnQgZm9yICVzIiwgc2VsZi5zZXJpYWxfbnVtYmVyKQotICAgICAgICAjIFRoZSBiZWxvdyBwcm9wZXJ0aWVzIHdpbGwgb25seSBleGlzdCBpZiB2ZXJpdHkgaGFzIGJlZW4gZW5hYmxlZC4KLSAgICAgICAgc3lzdGVtX3Zlcml0eSA9IHNlbGYuYWRiLmdldHByb3AoJ3BhcnRpdGlvbi5zeXN0ZW0udmVyaWZpZWQnKQotICAgICAgICB2ZW5kb3JfdmVyaXR5ID0gc2VsZi5hZGIuZ2V0cHJvcCgncGFydGl0aW9uLnZlbmRvci52ZXJpZmllZCcpCi0gICAgICAgIGlmIHN5c3RlbV92ZXJpdHkgb3IgdmVuZG9yX3Zlcml0eToKLSAgICAgICAgICAgIHNlbGYuYWRiLmRpc2FibGVfdmVyaXR5KCkKLSAgICAgICAgICAgIHNlbGYucmVib290KCkKLSAgICAgICAgc2VsZi5hZGIucmVtb3VudCgpCi0gICAgICAgIHNlbGYuYWRiLndhaXRfZm9yX2RldmljZSh0aW1lb3V0PXNlbGYuV0FJVF9GT1JfREVWSUNFX1RJTUVPVVRfU0VDT05EUykKLQotICAgIGRlZiByZWJvb3Qoc2VsZiwgdGltZW91dF9taW51dGVzPTE1LjApOgotICAgICAgICAiIiJSZWJvb3RzIHRoZSBkZXZpY2UuCi0KLSAgICAgICAgUmVib290IHRoZSBkZXZpY2UsIHdhaXQgZm9yIGRldmljZSB0byBjb21wbGV0ZSBib290aW5nLgotICAgICAgICAiIiIKLSAgICAgICAgbG9nZ2luZy5kZWJ1ZygiUmVib290aW5nICVzIiwgc2VsZi5zZXJpYWxfbnVtYmVyKQotICAgICAgICBzZWxmLmFkYi5yZWJvb3QoKQotCi0gICAgICAgIHRpbWVvdXRfc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgICAgICB0aW1lb3V0ID0gdGltZW91dF9taW51dGVzICogNjAKLSAgICAgICAgIyBBbmRyb2lkIHNvbWV0aW1lcyByZXR1cm4gZWFybHkgYWZ0ZXIgYGFkYiByZWJvb3RgIGlzIGNhbGxlZC4gVGhpcwotICAgICAgICAjIG1lYW5zIHN1YnNlcXVlbnQgY2FsbHMgbWF5IG1ha2UgaXQgdG8gdGhlIGRldmljZSBiZWZvcmUgdGhlIHJlYm9vdAotICAgICAgICAjIGdvZXMgdGhyb3VnaCwgcmV0dXJuIGZhbHNlIHBvc2l0aXZlcyBmb3IgZ2V0cHJvcHMgc3VjaCBhcwotICAgICAgICAjIHN5cy5ib290X2NvbXBsZXRlZC4KLSAgICAgICAgd2hpbGUgdGltZS50aW1lKCkgPCB0aW1lb3V0X3N0YXJ0ICsgdGltZW91dDoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmFkYi5nZXRfc3RhdGUoKQotICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoLjEpCi0gICAgICAgICAgICBleGNlcHQgQWRiRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBnZXRfc3RhdGUgd2lsbCByYWlzZSBhbiBlcnJvciBpZiB0aGUgZGV2aWNlIGlzIG5vdCBmb3VuZC4gV2UKLSAgICAgICAgICAgICAgICAjIHdhbnQgdGhlIGRldmljZSB0byBiZSBtaXNzaW5nIHRvIHByb3ZlIHRoZSBkZXZpY2UgaGFzIGtpY2tlZAotICAgICAgICAgICAgICAgICMgb2ZmIHRoZSByZWJvb3QuCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbWludXRlc19sZWZ0ID0gdGltZW91dF9taW51dGVzIC0gKHRpbWUudGltZSgpIC0gdGltZW91dF9zdGFydCkgLyA2MC4wCi0gICAgICAgIHNlbGYud2FpdF9mb3JfYm9vdF9jb21wbGV0aW9uKHRpbWVvdXRfbWludXRlcz1taW51dGVzX2xlZnQpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5hZGIuZW5zdXJlX3Jvb3QoKSwgImRldmljZSAlcyBjYW5ub3QgcnVuIGFzIHJvb3QgYWZ0ZXIgcmVib290IiAlIHNlbGYuc2VyaWFsX251bWJlcikKLQotICAgIGRlZiB3YWl0X2Zvcl9ib290X2NvbXBsZXRpb24oc2VsZiwgdGltZW91dF9taW51dGVzPTE1LjApOgotICAgICAgICAiIiIKLSAgICAgICAgV2FpdHMgZm9yIEFuZHJvaWQgZnJhbWV3b3JrIHRvIGJyb2FkY2FzdCBBQ1RJT05fQk9PVF9DT01QTEVURUQuCi0gICAgICAgIDpwYXJhbSB0aW1lb3V0X21pbnV0ZXM6IG51bWJlciBvZiBtaW51dGVzIHRvIHdhaXQKLSAgICAgICAgIiIiCi0gICAgICAgIHRpbWVvdXRfc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgICAgICB0aW1lb3V0ID0gdGltZW91dF9taW51dGVzICogNjAKLQotICAgICAgICBzZWxmLmFkYi53YWl0X2Zvcl9kZXZpY2UodGltZW91dD1zZWxmLldBSVRfRk9SX0RFVklDRV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgIHdoaWxlIHRpbWUudGltZSgpIDwgdGltZW91dF9zdGFydCArIHRpbWVvdXQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY29tcGxldGVkID0gc2VsZi5hZGIuZ2V0cHJvcCgic3lzLmJvb3RfY29tcGxldGVkIikKLSAgICAgICAgICAgICAgICBpZiBjb21wbGV0ZWQgPT0gJzEnOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGV4Y2VwdCBBZGJFcnJvcjoKLSAgICAgICAgICAgICAgICAjIGFkYiBzaGVsbCBjYWxscyBtYXkgZmFpbCBkdXJpbmcgY2VydGFpbiBwZXJpb2Qgb2YgYm9vdGluZwotICAgICAgICAgICAgICAgICMgcHJvY2Vzcywgd2hpY2ggaXMgbm9ybWFsLiBJZ25vcmluZyB0aGVzZSBlcnJvcnMuCi0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdGltZS5zbGVlcCg1KQotICAgICAgICBhc3NlcnRzLmZhaWwobXNnPSdEZXZpY2UgJXMgYm9vdGluZyBwcm9jZXNzIHRpbWVkIG91dC4nICUgc2VsZi5zZXJpYWxfbnVtYmVyKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvbWV0YWRhdGEucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9tZXRhZGF0YS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExYmM5YS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9tZXRhZGF0YS5weQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGZ1bmN0b29scwotaW1wb3J0IGluc3BlY3QKLQotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0LnRlc3RfZGVjb3JhdG9ycyBpbXBvcnQgdGVzdF9pbmZvCi0KLQotZGVmIF9mYWlsX2RlY29yYXRvcihtc2cpOgotCi0gICAgZGVmIGZhaWxfZGVjb3JhdG9yKGZ1bmMpOgotCi0gICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKLSAgICAgICAgZGVmIGZhaWwoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbChtc2cpCi0KLSAgICAgICAgcmV0dXJuIGZhaWwKLQotICAgIHJldHVybiBmYWlsX2RlY29yYXRvcgotCi0KLWRlZiBtZXRhZGF0YShfZG9fbm90X3VzZT1Ob25lLCBwdHNfdGVzdF9pZD1Ob25lLCBwdHNfdGVzdF9uYW1lPU5vbmUpOgotICAgICIiIgotICAgIFJlY29yZCBhIHBpZWNlIG9mIHRlc3QgbWV0YWRhdGEgaW4gdGhlIEV4dHJhIHNlY3Rpb24gb2YgdGhlIHRlc3QgUmVjb3JkIGluCi0gICAgdGhlIHRlc3Qgc3VtbWFyeSBmaWxlLiBUaGUgbWV0YWRhdGEgd2lsbCBjb21lIHdpdGggYSB0aW1lc3RhbXAsIGJ1dCB0aGVyZQotICAgIGlzIG5vIGd1YXJhbnRlZSBvbiB0aGUgb3JkZXIgb2Ygd2hlbiB0aGUgbWV0YWRhdGEgd2lsbCBiZSB3cml0dGVuCi0KLSAgICBOb3RlOgotICAgIC0gTWV0YWRhdGEgaXMgcmVjb3JkZWQgcGVyIHRlc3QgY2FzZSBhcyBrZXktdmFsdWUgcGFpcnMuCi0gICAgLSBNZXRhZGF0YSBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgd3JpdHRlbiB3aGVuIHRoZSB0ZXN0IHJlc3VsdCBpcyBQQVNTLAotICAgICAgRkFJTCBvciBTS0lQUEVELiBXaGVuIHRoZXJlIGFyZSB0ZXN0IGluZnJhc3RydWN0dXJhbCBlcnJvcnMsIG1ldGFkYXRhCi0gICAgICBtaWdodCBub3QgYmUgd3JpdHRlbiBzdWNjZXNzZnVsbHkKLSAgICA6cGFyYW0gX2RvX25vdF91c2U6IGEgcG9zaXRpb25hbCBhcmd1bWVudCB3aXRoIGRlZmF1bHQgdmFsdWUuIFRoaXMgYXJndW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGVuc3VyZSB0aGF0IEBtZXRhZGF0YShrZXk9dmFsdWUpIGlzIHVzZWQgaW4gYQotICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbCBmb3JtIGluc3RlYWQgb2YgQG1ldGFkYXRhIG9yIEBtZXRhZGF0YShhKQotICAgIDpwYXJhbSBwdHNfdGVzdF9pZDogQSBmdWxseSBxdWFsaWZpZWQgUFRTIHRlc3QgSUQgc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVAvQ09TL0lFWC9CVi0wMS1DCi0gICAgOnBhcmFtIHB0c190ZXN0X25hbWU6IEEgaHVtYW4gcmVhZGFibGUgdGVzdCBuYW1lIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgQ29ubmVjdGlvbiIgZm9yIHRoZSBhYm92ZSBleGFtcGxlCi0gICAgOnJldHVybjogZGVjb3JhdGVkIHRlc3QgY2FzZSBmdW5jdGlvbiBvYmplY3QKLSAgICAiIiIKLSAgICBpZiBfZG9fbm90X3VzZSBpcyBub3QgTm9uZToKLQotICAgICAgICBkZWYgZmFpbCgqYXJncywgKiprd2FyZ3MpOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJAbWV0YWRhdGEgbXVzdCBiZSB1c2VkIGluIGZ1bmN0aW9uYWwgZm9ybSBzdWNoICIgImFzIEBtZXRhZHRhKGtleT12YWx1ZSkiKQotCi0gICAgICAgIHJldHVybiBmYWlsCi0KLSAgICAjIENyZWF0ZSBhIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycwotICAgIHZhbHVlcyA9IGxvY2FscygpCi0gICAgYXJncyA9IHthcmc6IHZhbHVlc1thcmddIGZvciBhcmcgaW4gaW5zcGVjdC5nZXRmdWxsYXJnc3BlYyhtZXRhZGF0YSkuYXJnc30KLSAgICBkZWwgYXJnc1siX2RvX25vdF91c2UiXQotCi0gICAgIyBDaGVjayBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHZhbGlkCi0gICAgaWYgbm90IGFueShhcmdzLnZhbHVlcygpKToKLSAgICAgICAgcmV0dXJuIF9mYWlsX2RlY29yYXRvcigiYXQgbGVhc3Qgb25lIG9wdGlvbmFsIGFyZ3VtZW50IHNob3VsZCBiZSB2YWxpZCIpCi0KLSAgICAjIFZhbGlkYXRlIHB0c190ZXN0X2lkIGFuZCBwdHNfdGVzdF9uYW1lCi0gICAgaWYgYW55KChwdHNfdGVzdF9pZCwgcHRzX3Rlc3RfbmFtZSkpIGFuZCBcCi0gICAgICAgICAgICBub3QgYWxsKChwdHNfdGVzdF9pZCwgcHRzX3Rlc3RfbmFtZSkpOgotICAgICAgICByZXR1cm4gX2ZhaWxfZGVjb3JhdG9yKCJwdHNfdGVzdF9pZCBhbmQgcHRzX3Rlc3RfbmFtZSBtdXN0IGJvdGggIiAiYmUgdmFsaWQgaWYgb25lIG9mIHRoZW0gaXMgdmFsaWQiKQotCi0gICAgcmV0dXJuIHRlc3RfaW5mbygqKmFyZ3MpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9wdHNfYmFzZV90ZXN0LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvcHRzX2Jhc2VfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4Yjk5YS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9wdHNfYmFzZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIG1vYmx5IGltcG9ydCBiYXNlX3Rlc3QKLQotaW1wb3J0IGltcG9ydGxpYgotCi0KLWNsYXNzIFBUU0Jhc2VUZXN0Q2xhc3MoYmFzZV90ZXN0LkJhc2VUZXN0Q2xhc3MpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZ3MpOgotICAgICAgICBCYXNlVGVzdENsYXNzLl9faW5pdF9fKHNlbGYsIGNvbmZpZ3MpCi0KLSAgICAgICAgZ2RfZGV2aWNlcyA9IHNlbGYuY29udHJvbGxlcl9jb25maWdzLmdldCgiR2REZXZpY2UiKQotCi0gICAgICAgIHNlbGYucmVnaXN0ZXJfY29udHJvbGxlcihpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnY2VydC5nZF9kZXZpY2UnKSwgYnVpbHRpbj1UcnVlKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvdGVzdF9kZWNvcmF0b3JzLnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2NlcnQvdGVzdF9kZWNvcmF0b3JzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMwNjJlLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L3Rlc3RfZGVjb3JhdG9ycy5weQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jIENvcHlyaWdodCAyMDE3IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi0KLQotZGVmIHRlc3RfaW5mbyhwcmVkaWNhdGU9Tm9uZSwgKiprZXllZF9pbmZvKToKLSAgICAiIiJBZGRzIGluZm8gYWJvdXQgdGVzdC4KLQotICAgIEV4dHJhIGluZm8gdG8gaW5jbHVkZSBhYm91dCB0aGUgdGVzdC4gVGhpcyBpbmZvIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZQotICAgIHRlc3Qgb3V0cHV0LiBOb3RlIHRoYXQgaWYgYSBrZXkgaXMgZ2l2ZW4gbXVsdGlwbGUgdGltZXMgaXQgd2lsbCBiZSBhZGRlZAotICAgIGFzIGEgbGlzdCBvZiBhbGwgdmFsdWVzLiBJZiBtdWx0aXBsZXMgb2YgdGhlc2UgYXJlIHN0YWNrZWQgdGhlaXIgcmVzdWx0cwotICAgIHdpbGwgYmUgbWVyZ2VkLgotCi0gICAgRXhhbXBsZToKLSAgICAgICAgIyBUaGlzIHRlc3Qgd2lsbCBoYXZlIGEgdmFyaWFibGUgbXlfdmFyCi0gICAgICAgIEB0ZXN0X2luZm8obXlfdmFyPSdUSElTIElTIE1ZIFRFU1QnKQotICAgICAgICBkZWYgbXlfdGVzdChzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgQXJnczoKLSAgICAgICAgcHJlZGljYXRlOiBBIGZ1bmMgdG8gY2FsbCB0aGF0IGlmIGZhbHNlIHdpbGwgc2tpcCBhZGRpbmcgdGhpcyB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgaW5mby4gRnVuY3Rpb24gc2lnbmF0dXJlIGlzIGJvb2wodGVzdF9vYmosIGFyZ3MsIGt3YXJncykKLSAgICAgICAgKiprZXllZF9pbmZvOiBUaGUga2V5LCB2YWx1ZSBpbmZvIHRvIGluY2x1ZGUgaW4gdGhlIGV4dHJhcyBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgIHRlc3QuCi0gICAgIiIiCi0KLSAgICBkZWYgdGVzdF9pbmZvX2RlY29yYXRvcihmdW5jKToKLSAgICAgICAgcmV0dXJuIF9UZXN0SW5mb0RlY29yYXRvckZ1bmMoZnVuYywgcHJlZGljYXRlLCBrZXllZF9pbmZvKQotCi0gICAgcmV0dXJuIHRlc3RfaW5mb19kZWNvcmF0b3IKLQotCi1kZWYgX19zZWxlY3RfbGFzdCh0ZXN0X3NpZ25hbHMsIF8pOgotICAgIHJldHVybiB0ZXN0X3NpZ25hbHNbLTFdCi0KLQotZGVmIHJlcGVhdGVkX3Rlc3QobnVtX3Bhc3NlcywgYWNjZXB0YWJsZV9mYWlsdXJlcz0wLCByZXN1bHRfc2VsZWN0b3I9X19zZWxlY3RfbGFzdCk6Ci0gICAgIiIiQSBkZWNvcmF0b3IgdGhhdCBydW5zIGEgdGVzdCBjYXNlIG11bHRpcGxlIHRpbWVzLgotCi0gICAgVGhpcyBkZWNvcmF0b3IgY2FuIGJlIHVzZWQgdG8gcnVuIGEgdGVzdCBtdWx0aXBsZSB0aW1lcyBhbmQgYWdncmVnYXRlIHRoZQotICAgIGRhdGEgaW50byBhIHNpbmdsZSB0ZXN0IHJlc3VsdC4gQnkgc2V0dGluZyBgcmVzdWx0X3NlbGVjdG9yYCwgdGhlIHVzZXIgY2FuCi0gICAgYWNjZXNzIHRoZSByZXR1cm5lZCByZXN1bHQgb2YgZWFjaCBydW4sIGFsbG93aW5nIHRoZW0gdG8gYXZlcmFnZSByZXN1bHRzLAotICAgIHJldHVybiB0aGUgbWVkaWFuLCBvciBnYXRoZXIgYW5kIHJldHVybiBzdGFuZGFyZCBkZXZpYXRpb24gdmFsdWVzLgotCi0gICAgVGhpcyBkZWNvcmF0b3Igc2hvdWxkIGJlIHVzZWQgb24gdGVzdCBjYXNlcywgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBvbgotICAgIHN0YXRpYyBvciBjbGFzcyBtZXRob2RzLiBUaGUgdGVzdCBjYXNlIG11c3QgdGFrZSBpbiBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50LAotICAgIGBhdHRlbXB0X251bWJlcmAsIHdoaWNoIHJldHVybnMgdGhlIGN1cnJlbnQgYXR0ZW1wdCBudW1iZXIsIHN0YXJ0aW5nIGZyb20KLSAgICAxLgotCi0gICAgTm90ZSB0aGF0IGFueSBUZXN0U2lnbmFsIGludGVuZGVkIHRvIGFib3J0IG9yIHNraXAgdGhlIHRlc3Qgd2lsbCB0YWtlCi0gICAgYWJvcnQgb3Igc2tpcCBpbW1lZGlhdGVseS4KLQotICAgIEFyZ3M6Ci0gICAgICAgIG51bV9wYXNzZXM6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHRlc3QgbmVlZHMgdG8gcGFzcyB0byByZXBvcnQgdGhlCi0gICAgICAgICAgICB0ZXN0IGNhc2UgYXMgcGFzc2luZy4KLSAgICAgICAgYWNjZXB0YWJsZV9mYWlsdXJlczogVGhlIG51bWJlciBvZiBmYWlsdXJlcyBhY2NlcHRlZC4gSWYgdGhlIGZhaWx1cmVzCi0gICAgICAgICAgICBleGNlZWRzIHRoaXMgbnVtYmVyLCB0aGUgdGVzdCB3aWxsIHN0b3AgcmVwZWF0aW5nLiBUaGUgbWF4aW11bQotICAgICAgICAgICAgbnVtYmVyIG9mIHJ1bnMgaXMgYG51bV9wYXNzZXMgKyBhY2NlcHRhYmxlX2ZhaWx1cmVzYC4gSWYgdGhlIHRlc3QKLSAgICAgICAgICAgIGRvZXMgZmFpbCwgcmVzdWx0X3NlbGVjdG9yIHdpbGwgc3RpbGwgYmUgY2FsbGVkLgotICAgICAgICByZXN1bHRfc2VsZWN0b3I6IEEgbGFtYmRhIHRoYXQgdGFrZXMgaW4gdGhlIGxpc3Qgb2YgVGVzdFNpZ25hbHMgYW5kCi0gICAgICAgICAgICByZXR1cm5zIHRoZSB0ZXN0IHNpZ25hbCB0byByZXBvcnQgdGhlIHRlc3QgY2FzZSBhcy4gTm90ZSB0aGF0IHRoZQotICAgICAgICAgICAgbGlzdCBhbHNvIGNvbnRhaW5zIGFueSB1bmNhdWdodCBleGNlcHRpb25zIGZyb20gdGhlIHRlc3QgZXhlY3V0aW9uLgotICAgICIiIgotCi0gICAgZGVmIGRlY29yYXRvcihmdW5jKToKLSAgICAgICAgaWYgbm90IGZ1bmMuX19uYW1lX18uc3RhcnRzd2l0aCgndGVzdF8nKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Rlc3RzIG11c3Qgc3RhcnQgd2l0aCAidGVzdF8iLicpCi0KLSAgICAgICAgZGVmIHRlc3Rfd3JhcHBlcihzZWxmKToKLSAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9IDAKLSAgICAgICAgICAgIG51bV9zZWVuX3Bhc3NlcyA9IDAKLSAgICAgICAgICAgIHRlc3Rfc2lnbmFsc19yZWNlaXZlZCA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fcGFzc2VzICsgYWNjZXB0YWJsZV9mYWlsdXJlcyk6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBmdW5jKHNlbGYsIGkgKyAxKQotICAgICAgICAgICAgICAgIGV4Y2VwdCAoc2lnbmFscy5UZXN0RmFpbHVyZSwgc2lnbmFscy5UZXN0RXJyb3IsIEFzc2VydGlvbkVycm9yKSBhcyBzaWduYWw6Ci0gICAgICAgICAgICAgICAgICAgIHRlc3Rfc2lnbmFsc19yZWNlaXZlZC5hcHBlbmQoc2lnbmFsKQotICAgICAgICAgICAgICAgICAgICBudW1fZmFpbHVyZXMgKz0gMQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RQYXNzIGFzIHNpZ25hbDoKLSAgICAgICAgICAgICAgICAgICAgdGVzdF9zaWduYWxzX3JlY2VpdmVkLmFwcGVuZChzaWduYWwpCi0gICAgICAgICAgICAgICAgICAgIG51bV9zZWVuX3Bhc3NlcyArPSAxCi0gICAgICAgICAgICAgICAgZXhjZXB0IChzaWduYWxzLlRlc3RTaWduYWwsIEtleWJvYXJkSW50ZXJydXB0KToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHNpZ25hbDoKLSAgICAgICAgICAgICAgICAgICAgdGVzdF9zaWduYWxzX3JlY2VpdmVkLmFwcGVuZChzaWduYWwpCi0gICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyArPSAxCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbnVtX3NlZW5fcGFzc2VzICs9IDEKLSAgICAgICAgICAgICAgICAgICAgdGVzdF9zaWduYWxzX3JlY2VpdmVkLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbHMuVGVzdFBhc3MoJ1Rlc3QgaXRlcmF0aW9uICVzIG9mICVzIHBhc3NlZCB3aXRob3V0IGRldGFpbHMuJyAlIChpLCBmdW5jLl9fbmFtZV9fKSkpCi0KLSAgICAgICAgICAgICAgICBpZiBudW1fZmFpbHVyZXMgPiBhY2NlcHRhYmxlX2ZhaWx1cmVzOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGVsaWYgbnVtX3NlZW5fcGFzc2VzID09IG51bV9wYXNzZXM6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWFyZG93bl90ZXN0KCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXR1cF90ZXN0KCkKLQotICAgICAgICAgICAgcmFpc2UgcmVzdWx0X3NlbGVjdG9yKHRlc3Rfc2lnbmFsc19yZWNlaXZlZCwgc2VsZikKLQotICAgICAgICByZXR1cm4gdGVzdF93cmFwcGVyCi0KLSAgICByZXR1cm4gZGVjb3JhdG9yCi0KLQotZGVmIHRlc3RfdHJhY2tlcl9pbmZvKHV1aWQsIGV4dHJhX2Vudmlyb25tZW50X2luZm89Tm9uZSwgcHJlZGljYXRlPU5vbmUpOgotICAgICIiIkRlY29yYXRvciBmb3IgYWRkaW5nIHRlc3QgdHJhY2tlciBpbmZvIHRvIHRlc3RzIHJlc3VsdHMuCi0KLSAgICBXaWxsIGFkZCB0ZXN0IHRyYWNrZXIgaW5mbyBpbnNpZGUgb2YgRXh0cmFzL3Rlc3RfdHJhY2tlcl9pbmZvLgotCi0gICAgRXhhbXBsZToKLSAgICAgICAgIyBUaGlzIHRlc3Qgd2lsbCBiZSBsaW5rZWQgdG8gdGVzdCB0cmFja2VyIHV1aWQgYWJjZAotICAgICAgICBAdGVzdF90cmFja2VyX2luZm8odXVpZD0nYWJjZCcpCi0gICAgICAgIGRlZiBteV90ZXN0KHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBBcmdzOgotICAgICAgICB1dWlkOiBUaGUgdXVpZCBvZiB0aGUgdGVzdCBjYXNlIGluIHRlc3QgdHJhY2tlci4KLSAgICAgICAgZXh0cmFfZW52aXJvbm1lbnRfaW5mbzogRXh0cmEgaW5mbyBhYm91dCB0aGUgdGVzdCB0cmFja2VyIGVudmlyb25tZW50LgotICAgICAgICBwcmVkaWNhdGU6IEEgZnVuYyB0aGF0IGlmIGZhbHNlIHdoZW4gY2FsbGVkIHdpbGwgaWdub3JlIHRoaXMgaW5mby4KLSAgICAiIiIKLSAgICByZXR1cm4gdGVzdF9pbmZvKHRlc3RfdHJhY2tlcl91dWlkPXV1aWQsIHRlc3RfdHJhY2tlcl9lbnZpcm9ubWVudF9pbmZvPWV4dHJhX2Vudmlyb25tZW50X2luZm8sIHByZWRpY2F0ZT1wcmVkaWNhdGUpCi0KLQotY2xhc3MgX1Rlc3RJbmZvRGVjb3JhdG9yRnVuYyhvYmplY3QpOgotICAgICIiIk9iamVjdCB0aGF0IGFjdHMgYXMgYSBmdW5jdGlvbiBkZWNvcmF0b3IgdGVzdCBpbmZvLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMsIHByZWRpY2F0ZSwga2V5ZWRfaW5mbyk6Ci0gICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKLSAgICAgICAgc2VsZi5wcmVkaWNhdGUgPSBwcmVkaWNhdGUKLSAgICAgICAgc2VsZi5rZXllZF9pbmZvID0ga2V5ZWRfaW5mbwotICAgICAgICBzZWxmLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXwotICAgICAgICBzZWxmLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KLSAgICAgICAgc2VsZi5fX21vZHVsZV9fID0gZnVuYy5fX21vZHVsZV9fCi0KLSAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpOgotICAgICAgICAiIiJDYWxsZWQgYnkgUHl0aG9uIHRvIGNyZWF0ZSBhIGJpbmRpbmcgZm9yIGFuIGluc3RhbmNlIGNsb3N1cmUuCi0KLSAgICAgICAgV2hlbiBjYWxsZWQgYnkgUHl0aG9uIHRoaXMgb2JqZWN0IHdpbGwgY3JlYXRlIGEgc3BlY2lhbCBiaW5kaW5nIGZvcgotICAgICAgICB0aGF0IGluc3RhbmNlLiBUaGF0IGJpbmRpbmcgd2lsbCBrbm93IGhvdyB0byBpbnRlcmFjdCB3aXRoIHRoaXMKLSAgICAgICAgc3BlY2lmaWMgZGVjb3JhdG9yLgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIF9UZXN0SW5mb0JpbmRpbmcoc2VsZiwgaW5zdGFuY2UpCi0KLSAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgIiIiCi0gICAgICAgIFdoZW4gY2FsbGVkIHJ1bnMgdGhlIHVuZGVybHlpbmcgZnVuYyBhbmQgdGhlbiBhdHRhY2hlcyB0ZXN0IGluZm8KLSAgICAgICAgdG8gYSBzaWduYWwuCi0gICAgICAgICIiIgotICAgICAgICBjYXVzZSA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mdW5jKCphcmdzLCAqKmt3YXJncykKLQotICAgICAgICAgICAgaWYgcmVzdWx0IG9yIHJlc3VsdCBpcyBOb25lOgotICAgICAgICAgICAgICAgIG5ld19zaWduYWwgPSBzaWduYWxzLlRlc3RQYXNzKCcnKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBuZXdfc2lnbmFsID0gc2lnbmFscy5UZXN0RmFpbHVyZSgnJykKLSAgICAgICAgZXhjZXB0IHNpZ25hbHMuVGVzdFNpZ25hbCBhcyBzaWduYWw6Ci0gICAgICAgICAgICBuZXdfc2lnbmFsID0gc2lnbmFsCi0gICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6Ci0gICAgICAgICAgICBjYXVzZSA9IGV4Ci0gICAgICAgICAgICBuZXdfc2lnbmFsID0gc2lnbmFscy5UZXN0RXJyb3IoY2F1c2UpCi0KLSAgICAgICAgaWYgbmV3X3NpZ25hbC5leHRyYXMgaXMgTm9uZToKLSAgICAgICAgICAgIG5ld19zaWduYWwuZXh0cmFzID0ge30KLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmV3X3NpZ25hbC5leHRyYXMsIGRpY3QpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGVzdF9pbmZvIGNhbiBvbmx5IGFwcGVuZCB0byBzaWduYWwgZGF0YSB0aGF0IGhhcyBhIGRpY3QgYXMgdGhlIGV4dHJhIHZhbHVlLicpCi0KLSAgICAgICAgZ2F0aGVyZWRfZXh0cmFzID0gc2VsZi5fZ2F0aGVyX2xvY2FsX2luZm8oTm9uZSwgKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBmb3IgaywgdiBpbiBnYXRoZXJlZF9leHRyYXMuaXRlbXMoKToKLSAgICAgICAgICAgIGlmIGsgbm90IGluIG5ld19zaWduYWwuZXh0cmFzOgotICAgICAgICAgICAgICAgIG5ld19zaWduYWwuZXh0cmFzW2tdID0gdgotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuZXdfc2lnbmFsLmV4dHJhc1trXSwgbGlzdCk6Ci0gICAgICAgICAgICAgICAgICAgIG5ld19zaWduYWwuZXh0cmFzW2tdID0gW25ld19zaWduYWwuZXh0cmFzW2tdXQotCi0gICAgICAgICAgICAgICAgbmV3X3NpZ25hbC5leHRyYXNba10uaW5zZXJ0KDAsIHYpCi0KLSAgICAgICAgcmFpc2UgbmV3X3NpZ25hbCBmcm9tIGNhdXNlCi0KLSAgICBkZWYgZ2F0aGVyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgICIiIgotICAgICAgICBHYXRoZXJzIHRoZSBpbmZvIGZyb20gdGhpcyBkZWNvcmF0b3Igd2l0aG91dCBpbnZva2luZyB0aGUgdW5kZXJseWluZwotICAgICAgICBmdW5jdGlvbi4gVGhpcyB3aWxsIGFsc28gZ2F0aGVyIGFsbCBjaGlsZCBpbmZvIGlmIHRoZSB1bmRlcmx5aW5nIGZ1bmMKLSAgICAgICAgaGFzIHRoYXQgYWJpbGl0eS4KLQotICAgICAgICBSZXR1cm5zOiBBIGRpY3Rpb25hcnkgb2YgaW5mby4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mdW5jLCAnZ2F0aGVyJyk6Ci0gICAgICAgICAgICBleHRyYXMgPSBzZWxmLmZ1bmMuZ2F0aGVyKCphcmdzLCAqKmt3YXJncykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGV4dHJhcyA9IHt9Ci0KLSAgICAgICAgc2VsZi5fZ2F0aGVyX2xvY2FsX2luZm8oZXh0cmFzLCAqYXJncywgKiprd2FyZ3MpCi0KLSAgICAgICAgcmV0dXJuIGV4dHJhcwotCi0gICAgZGVmIF9nYXRoZXJfbG9jYWxfaW5mbyhzZWxmLCBnYXRoZXJfaW50bywgKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgIiIiR2F0aGVycyBpbmZvIGZyb20gdGhpcyBkZWNvcmF0b3IgYW5kIGlnbm9yZXMgY2hpbGRyZW4uCi0KLSAgICAgICAgQXJnczoKLSAgICAgICAgICAgIGdhdGhlcl9pbnRvOiBHYXRoZXJzIGludG8gYSBkaWN0aW9uYXJ5IHRoYXQgYWxyZWFkeSBleGlzdHMuCi0KLSAgICAgICAgUmV0dXJuczogVGhlIGRpY3Rpb25hcnkgd2l0aCBnYXRoZXJlZCBpbmZvIGluIGl0LgotICAgICAgICAiIiIKLSAgICAgICAgaWYgZ2F0aGVyX2ludG8gaXMgTm9uZToKLSAgICAgICAgICAgIGV4dHJhcyA9IHt9Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBleHRyYXMgPSBnYXRoZXJfaW50bwotICAgICAgICBpZiBub3Qgc2VsZi5wcmVkaWNhdGUgb3Igc2VsZi5wcmVkaWNhdGUoYXJncywga3dhcmdzKToKLSAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYua2V5ZWRfaW5mby5pdGVtcygpOgotICAgICAgICAgICAgICAgIGlmIHYgYW5kIGsgbm90IGluIGV4dHJhczoKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzW2tdID0gdgotICAgICAgICAgICAgICAgIGVsaWYgdiBhbmQgayBpbiBleHRyYXM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhc1trXSwgbGlzdCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYXNba10gPSBbZXh0cmFzW2tdXQotICAgICAgICAgICAgICAgICAgICBleHRyYXNba10uaW5zZXJ0KDAsIHYpCi0KLSAgICAgICAgcmV0dXJuIGV4dHJhcwotCi0KLWNsYXNzIF9UZXN0SW5mb0JpbmRpbmcob2JqZWN0KToKLSAgICAiIiIKLSAgICBXaGVuIFB5dGhvbiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGFuIG9iamVjdCBpdCBjcmVhdGVzIGEgYmluZGluZyBvYmplY3QKLSAgICBmb3IgZWFjaCBjbG9zdXJlIHRoYXQgY29udGFpbnMgd2hhdCB0aGUgaW5zdGFuY2UgdmFyaWFibGUgc2hvdWxkIGJlIHdoZW4KLSAgICBjYWxsZWQuIFRoaXMgb2JqZWN0IGlzIGEgc2ltaWxhciBiaW5kaW5nIGZvciBfVGVzdEluZm9EZWNvcmF0b3JGdW5jLgotICAgIFdoZW4gUHl0aG9uIHRyaWVzIHRvIGNyZWF0ZSBhIGJpbmRpbmcgb2YgYSBfVGVzdEluZm9EZWNvcmF0b3JGdW5jIGl0Ci0gICAgd2lsbCByZXR1cm4gb25lIG9mIHRoZXNlIG9iamVjdHMgdG8gaG9sZCB0aGUgaW5zdGFuY2UgZm9yIHRoYXQgY2xvc3VyZS4KLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQsIGluc3RhbmNlKToKLSAgICAgICAgIiIiCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICB0YXJnZXQ6IFRoZSB0YXJnZXQgZm9yIGNyZWF0aW5nIGEgYmluZGluZyB0by4KLSAgICAgICAgICAgIGluc3RhbmNlOiBUaGUgaW5zdGFuY2UgdG8gYmluZCB0aGUgdGFyZ2V0IHdpdGguCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldAotICAgICAgICBzZWxmLmluc3RhbmNlID0gaW5zdGFuY2UKLSAgICAgICAgc2VsZi5fX25hbWVfXyA9IHRhcmdldC5fX25hbWVfXwotCi0gICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgICIiIgotICAgICAgICBXaGVuIHRoaXMgb2JqZWN0IGlzIGNhbGxlZCBpdCB3aWxsIGNhbGwgdGhlIHRhcmdldCB3aXRoIHRoZSBib3VuZAotICAgICAgICBpbnN0YW5jZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRhcmdldChzZWxmLmluc3RhbmNlLCAqYXJncywgKiprd2FyZ3MpCi0KLSAgICBkZWYgZ2F0aGVyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgICIiIgotICAgICAgICBXaWxsIGdhdGhlciB0aGUgdGFyZ2V0IHdpdGggdGhlIGJvdW5kIGluc3RhbmNlLgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0LmdhdGhlcihzZWxmLmluc3RhbmNlLCAqYXJncywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC90cmFjZWxvZ2dlci5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L3RyYWNlbG9nZ2VyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU1YTIyLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0L3RyYWNlbG9nZ2VyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyBDb3B5cmlnaHQgMjAxNiAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGluc3BlY3QKLWltcG9ydCBvcwotCi0KLWNsYXNzIFRyYWNlTG9nZ2VyKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nZ2VyKToKLSAgICAgICAgc2VsZi5fbG9nZ2VyID0gbG9nZ2VyCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9nZXRfdHJhY2VfaW5mbyhsZXZlbD0xLCBvZmZzZXQ9Mik6Ci0gICAgICAgICMgV2Ugd2FudCB0aGUgc3RhY2sgZnJhbWUgYWJvdmUgdGhpcyBhbmQgYWJvdmUgdGhlIGVycm9yL3dhcm5pbmcvaW5mbwotICAgICAgICBpbnNwZWN0X3N0YWNrID0gaW5zcGVjdC5zdGFjaygpCi0gICAgICAgIHRyYWNlX2luZm8gPSAnJwotICAgICAgICBmb3IgaSBpbiByYW5nZShsZXZlbCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3RhY2tfZnJhbWVzID0gaW5zcGVjdF9zdGFja1tvZmZzZXQgKyBpXQotICAgICAgICAgICAgICAgIGluZm8gPSBpbnNwZWN0LmdldGZyYW1laW5mbyhzdGFja19mcmFtZXNbMF0pCi0gICAgICAgICAgICAgICAgdHJhY2VfaW5mbyA9ICclc1slczolczolc10nICUgKHRyYWNlX2luZm8sIG9zLnBhdGguYmFzZW5hbWUoaW5mby5maWxlbmFtZSksIGluZm8uZnVuY3Rpb24sIGluZm8ubGluZW5vKQotICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgcmV0dXJuIHRyYWNlX2luZm8KLQotICAgIGRlZiBfbG9nX3dpdGgoc2VsZiwgbG9nZ2luZ19sYW1iZGEsIHRyYWNlX2xldmVsLCBtc2csICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIHRyYWNlX2luZm8gPSBUcmFjZUxvZ2dlci5fZ2V0X3RyYWNlX2luZm8obGV2ZWw9dHJhY2VfbGV2ZWwsIG9mZnNldD0zKQotICAgICAgICBsb2dnaW5nX2xhbWJkYSgnJXMgJXMnICUgKG1zZywgdHJhY2VfaW5mbyksICphcmdzLCAqKmt3YXJncykKLQotICAgIGRlZiBleGNlcHRpb24oc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgICBzZWxmLl9sb2dfd2l0aChzZWxmLl9sb2dnZXIuZXhjZXB0aW9uLCA1LCBtc2csICphcmdzLCAqKmt3YXJncykKLQotICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIHNlbGYuX2xvZ193aXRoKHNlbGYuX2xvZ2dlci5kZWJ1ZywgMywgbXNnLCAqYXJncywgKiprd2FyZ3MpCi0KLSAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgICBzZWxmLl9sb2dfd2l0aChzZWxmLl9sb2dnZXIuZXJyb3IsIDMsIG1zZywgKmFyZ3MsICoqa3dhcmdzKQotCi0gICAgZGVmIHdhcm4oc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgICBzZWxmLl9sb2dfd2l0aChzZWxmLl9sb2dnZXIud2FybiwgMywgbXNnLCAqYXJncywgKiprd2FyZ3MpCi0KLSAgICBkZWYgd2FybmluZyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIHNlbGYuX2xvZ193aXRoKHNlbGYuX2xvZ2dlci53YXJuaW5nLCAzLCBtc2csICphcmdzLCAqKmt3YXJncykKLQotICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgc2VsZi5fbG9nX3dpdGgoc2VsZi5fbG9nZ2VyLmluZm8sIDEsIG1zZywgKmFyZ3MsICoqa3dhcmdzKQotCi0gICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgotICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9sb2dnZXIsIG5hbWUpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvZGV2aWNlc19jb25maWcueWFtbCBiL2JsdWViZXJyeS90ZXN0cy9nZC9kZXZpY2VzX2NvbmZpZy55YW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhiYmM4Li4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9kZXZpY2VzX2NvbmZpZy55YW1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotX2Rlc2NyaXB0aW9uOiBCbHVldG9vdGggY2VydCB0ZXN0aW5nCi1UZXN0QmVkczoKLSAgLSBOYW1lOiBBbmRyb2lkRGV2aWNlQ2VydAotICAgIENvbnRyb2xsZXJzOgotICAgICAgR2REZXZpY2U6Ci0gICAgICAgIC0gZ3JwY19wb3J0OiAnODg5OCcKLSAgICAgICAgICBncnBjX3Jvb3Rfc2VydmVyX3BvcnQ6ICc4ODk2JwotICAgICAgICAgIHNpZ25hbF9wb3J0OiAnODg5NCcKLSAgICAgICAgICBsYWJlbDogY2VydAotICAgICAgICAgIHNlcmlhbF9udW1iZXI6ICdDRVJUJwotICAgICAgICAgIG5hbWU6IENlcnQgRGV2aWNlCi0gICAgICAgICAgY21kOgotICAgICAgICAgICAgLSAiYWRiIgotICAgICAgICAgICAgLSAiLXMiCi0gICAgICAgICAgICAtICIkKHNlcmlhbF9udW1iZXIpIgotICAgICAgICAgICAgLSAic2hlbGwiCi0gICAgICAgICAgICAtICJBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIgotICAgICAgICAgICAgLSAiL3N5c3RlbS9iaW4vYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlIgotICAgICAgICAgICAgLSAiLS1ncnBjLXBvcnQ9JChncnBjX3BvcnQpIgotICAgICAgICAgICAgLSAiLS1yb290LXNlcnZlci1wb3J0PSQoZ3JwY19yb290X3NlcnZlcl9wb3J0KSIKLSAgICAgICAgICAgIC0gIi0tYnRzbm9vcD0vZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyIKLSAgICAgICAgICAgIC0gIi0tYnRzbm9vej0vZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3pfaGNpLmxvZyIKLSAgICAgICAgICAgIC0gIi0tYnRjb25maWc9L2RhdGEvbWlzYy9ibHVlZHJvaWQvYnRfY29uZmlnLmNvbmYiCi0gICAgICAgICAgICAtICItLXNpZ25hbC1wb3J0PSQoc2lnbmFsX3BvcnQpIgotICAgICAgICAtIGdycGNfcG9ydDogJzg4OTknCi0gICAgICAgICAgZ3JwY19yb290X3NlcnZlcl9wb3J0OiAnODg5NycKLSAgICAgICAgICBzaWduYWxfcG9ydDogJzg4OTUnCi0gICAgICAgICAgbGFiZWw6IGR1dAotICAgICAgICAgIHNlcmlhbF9udW1iZXI6ICdEVVQnCi0gICAgICAgICAgbmFtZTogRFVUIERldmljZQotICAgICAgICAgIGNtZDoKLSAgICAgICAgICAgIC0gImFkYiIKLSAgICAgICAgICAgIC0gIi1zIgotICAgICAgICAgICAgLSAiJChzZXJpYWxfbnVtYmVyKSIKLSAgICAgICAgICAgIC0gInNoZWxsIgotICAgICAgICAgICAgLSAiQVNBTl9PUFRJT05TPWRldGVjdF9jb250YWluZXJfb3ZlcmZsb3c9MCIKLSAgICAgICAgICAgIC0gIi9zeXN0ZW0vYmluL2JsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIKLSAgICAgICAgICAgIC0gIi0tZ3JwYy1wb3J0PSQoZ3JwY19wb3J0KSIKLSAgICAgICAgICAgIC0gIi0tcm9vdC1zZXJ2ZXItcG9ydD0kKGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkiCi0gICAgICAgICAgICAtICItLWJ0c25vb3A9L2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub29wX2hjaS5sb2ciCi0gICAgICAgICAgICAtICItLWJ0c25vb3o9L2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub296X2hjaS5sb2ciCi0gICAgICAgICAgICAtICItLWJ0Y29uZmlnPS9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIgotICAgICAgICAgICAgLSAiLS1zaWduYWwtcG9ydD0kKHNpZ25hbF9wb3J0KSIKLWxvZ3BhdGg6ICIvdG1wL2xvZ3MiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2dkX2FsbF90ZXN0cy5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9nZF9hbGxfdGVzdHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGU4YzEuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2dkX2FsbF90ZXN0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydC5jZXJ0X3NlbGZfdGVzdF9ibHVlYmVycnkgaW1wb3J0IENlcnRTZWxmVGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5oYWwuc2ltcGxlX2hhbF90ZXN0X2JsdWViZXJyeSBpbXBvcnQgU2ltcGxlSGFsVGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5oY2kuYWNsX21hbmFnZXJfdGVzdF9ibHVlYmVycnkgaW1wb3J0IEFjbE1hbmFnZXJUZXN0QmIKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmhjaS5jb250cm9sbGVyX3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBDb250cm9sbGVyVGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5oY2kuZGlyZWN0X2hjaV90ZXN0X2JsdWViZXJyeSBpbXBvcnQgRGlyZWN0SGNpVGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5oY2kubGVfYWNsX21hbmFnZXJfdGVzdF9ibHVlYmVycnkgaW1wb3J0IExlQWNsTWFuYWdlclRlc3RCYgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuaGNpLmxlX2FkdmVydGlzaW5nX21hbmFnZXJfdGVzdF9ibHVlYmVycnkgaW1wb3J0IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5oY2kubGVfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0X2JsdWViZXJyeSBpbXBvcnQgTGVTY2FubmluZ01hbmFnZXJUZXN0QmIKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmhjaS5sZV9zY2FubmluZ193aXRoX3NlY3VyaXR5X3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBMZVNjYW5uaW5nV2l0aFNlY3VyaXR5VGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5pc28ubGVfaXNvX3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBMZUlzb1Rlc3RCYgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QubDJjYXAuY2xhc3NpYy5sMmNhcF9wZXJmb3JtYW5jZV90ZXN0X2JsdWViZXJyeSBpbXBvcnQgTDJjYXBQZXJmb3JtYW5jZVRlc3RCYgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QubDJjYXAuY2xhc3NpYy5sMmNhcF90ZXN0X2JsdWViZXJyeSBpbXBvcnQgTDJjYXBUZXN0QmIKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmwyY2FwLmxlLmR1YWxfbDJjYXBfdGVzdF9ibHVlYmVycnkgaW1wb3J0IER1YWxMMmNhcFRlc3RCYgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QubDJjYXAubGUubGVfbDJjYXBfdGVzdF9ibHVlYmVycnkgaW1wb3J0IExlTDJjYXBUZXN0QmIKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLm5laWdoYm9yLm5laWdoYm9yX3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBOZWlnaGJvclRlc3RCYgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2Quc2VjdXJpdHkubGVfc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkgaW1wb3J0IExlU2VjdXJpdHlUZXN0QmIKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLnNlY3VyaXR5LnNlY3VyaXR5X3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBTZWN1cml0eVRlc3RCYgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2Quc2hpbS5zaGltX3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBTaGltVGVzdEJiCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5zaGltLnN0YWNrX3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBTdGFja1Rlc3RCYgotCi1mcm9tIG1vYmx5IGltcG9ydCBzdWl0ZV9ydW5uZXIKLQotQUxMX1RFU1RTID0gewotICAgIENlcnRTZWxmVGVzdEJiLCBTaW1wbGVIYWxUZXN0QmIsIEFjbE1hbmFnZXJUZXN0QmIsIENvbnRyb2xsZXJUZXN0QmIsIERpcmVjdEhjaVRlc3RCYiwgTGVBY2xNYW5hZ2VyVGVzdEJiLAotICAgIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdEJiLCBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYiwgTGVTY2FubmluZ1dpdGhTZWN1cml0eVRlc3RCYiwgTGVJc29UZXN0QmIsCi0gICAgTDJjYXBQZXJmb3JtYW5jZVRlc3RCYiwgTDJjYXBUZXN0QmIsIER1YWxMMmNhcFRlc3RCYiwgTGVMMmNhcFRlc3RCYiwgTmVpZ2hib3JUZXN0QmIsIExlU2VjdXJpdHlUZXN0QmIsCi0gICAgU2VjdXJpdHlUZXN0QmIsIFNoaW1UZXN0QmIsIFN0YWNrVGVzdEJiCi19Ci0KLURJU0FCTEVEX1RFU1RTID0gc2V0KCkKLQotRU5BQkxFRF9URVNUUyA9IGxpc3QoQUxMX1RFU1RTIC0gRElTQUJMRURfVEVTVFMpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgc3VpdGVfcnVubmVyLnJ1bl9zdWl0ZShFTkFCTEVEX1RFU1RTKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2dkX3Bvc3RzdWJtaXRfdGVzdHMucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvZ2RfcG9zdHN1Ym1pdF90ZXN0cy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjOGE2Yy4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvZ2RfcG9zdHN1Ym1pdF90ZXN0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuZ2RfYWxsX3Rlc3RzIGltcG9ydCBBTExfVEVTVFMKLQotZnJvbSBtb2JseSBpbXBvcnQgc3VpdGVfcnVubmVyCi0KLURJU0FCTEVEX1RFU1RTID0gc2V0KCkKLQotRU5BQkxFRF9URVNUUyA9IGxpc3QoQUxMX1RFU1RTIC0gRElTQUJMRURfVEVTVFMpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgc3VpdGVfcnVubmVyLnJ1bl9zdWl0ZShFTkFCTEVEX1RFU1RTKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2dkX3ByZXN1Ym1pdF90ZXN0cy5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9nZF9wcmVzdWJtaXRfdGVzdHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2Y2MGEuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2dkX3ByZXN1Ym1pdF90ZXN0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuZ2RfYWxsX3Rlc3RzIGltcG9ydCBBTExfVEVTVFMKLQotZnJvbSBtb2JseSBpbXBvcnQgc3VpdGVfcnVubmVyCi0KLSMgVE9ETyhiLzE5NDcyMzI0Nik6IEludmVzdGlnYXRlIGZhaWx1cmVzIHRvIHJlLWFjdGl2YXRlIHRoZSB0ZXN0IGNsYXNzLgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuaGNpLmxlX3NjYW5uaW5nX21hbmFnZXJfdGVzdF9ibHVlYmVycnkgaW1wb3J0IExlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJiCi0KLSMgVE9ETyhiLzE5NDcyMzI0Nik6IEludmVzdGlnYXRlIGZhaWx1cmVzIHRvIHJlLWFjdGl2YXRlIHRoZSB0ZXN0IGNsYXNzLgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QubDJjYXAuY2xhc3NpYy5sMmNhcF90ZXN0X2JsdWViZXJyeSBpbXBvcnQgTDJjYXBUZXN0QmIKLQotIyBUT0RPKGIvMTk0NzIzMjQ2KTogSW52ZXN0aWdhdGUgZmFpbHVyZXMgdG8gcmUtYWN0aXZhdGUgdGhlIHRlc3QgY2xhc3MuCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5sMmNhcC5sZS5sZV9sMmNhcF90ZXN0X2JsdWViZXJyeSBpbXBvcnQgTGVMMmNhcFRlc3RCYgotCi0jIFRPRE8oYi8xOTQ3MjMyNDYpOiBJbnZlc3RpZ2F0ZSBmYWlsdXJlcyB0byByZS1hY3RpdmF0ZSB0aGUgdGVzdCBjbGFzcy4KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLnNlY3VyaXR5LmxlX3NlY3VyaXR5X3Rlc3RfYmx1ZWJlcnJ5IGltcG9ydCBMZVNlY3VyaXR5VGVzdEJiCi0KLSMgVE9ETyhiLzE5NDcyMzI0Nik6IEludmVzdGlnYXRlIGZhaWx1cmVzIHRvIHJlLWFjdGl2YXRlIHRoZSB0ZXN0IGNsYXNzLgotZnJvbSBibHVlYmVycnkudGVzdHMuZ2Quc2VjdXJpdHkuc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkgaW1wb3J0IFNlY3VyaXR5VGVzdEJiCi0KLURJU0FCTEVEX1RFU1RTID0ge0xlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJiLCBMMmNhcFRlc3RCYiwgTGVMMmNhcFRlc3RCYiwgTGVTZWN1cml0eVRlc3RCYiwgU2VjdXJpdHlUZXN0QmJ9Ci0KLUVOQUJMRURfVEVTVFMgPSBsaXN0KEFMTF9URVNUUyAtIERJU0FCTEVEX1RFU1RTKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHN1aXRlX3J1bm5lci5ydW5fc3VpdGUoRU5BQkxFRF9URVNUUykKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9oYWwvc2ltcGxlX2hhbF90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9oYWwvc2ltcGxlX2hhbF90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2YzQ0ZS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvaGFsL3NpbXBsZV9oYWxfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBoYWwuY2VydC5zaW1wbGVfaGFsX3Rlc3RfbGliIGltcG9ydCBTaW1wbGVIYWxUZXN0QmFzZQotZnJvbSBtb2JseSBpbXBvcnQgdGVzdF9ydW5uZXIKLQotX0dSUENfVElNRU9VVCA9IDEwCi0KLQotY2xhc3MgU2ltcGxlSGFsVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIFNpbXBsZUhhbFRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQUwnLCBjZXJ0X21vZHVsZT0nSEFMJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgU2ltcGxlSGFsVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIFNpbXBsZUhhbFRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvYWNsX21hbmFnZXJfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2FjbF9tYW5hZ2VyX3Rlc3RfYmx1ZWJlcnJ5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgxZjFjLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvYWNsX21hbmFnZXJfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBoY2kuY2VydC5hY2xfbWFuYWdlcl90ZXN0X2xpYiBpbXBvcnQgQWNsTWFuYWdlclRlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIEFjbE1hbmFnZXJUZXN0QmIoZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcywgQWNsTWFuYWdlclRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycsIGNlcnRfbW9kdWxlPSdIQ0knKQotCi0gICAgIyB0b2RvOiBtb3ZlIGludG8gR2RCYXNlVGVzdENsYXNzLCBiYXNlZCBvbiBtb2R1bGVzIGluaXRlZAotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgQWNsTWFuYWdlclRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotICAgIGRlZiB0ZXN0X2R1dF9jb25uZWN0cyhzZWxmKToKLSAgICAgICAgQWNsTWFuYWdlclRlc3RCYXNlLnRlc3RfZHV0X2Nvbm5lY3RzKHNlbGYpCi0KLSAgICBkZWYgdGVzdF9jZXJ0X2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVzdF9jZXJ0X2Nvbm5lY3RzKHNlbGYpCi0KLSAgICBkZWYgdGVzdF9yZWplY3RfYnJvYWRjYXN0KHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVzdF9yZWplY3RfYnJvYWRjYXN0KHNlbGYpCi0KLSAgICBkZWYgdGVzdF9jZXJ0X2Nvbm5lY3RzX2Rpc2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVzdF9jZXJ0X2Nvbm5lY3RzX2Rpc2Nvbm5lY3RzKHNlbGYpCi0KLSAgICBkZWYgdGVzdF9yZWNvbWJpbmF0aW9uX2wyY2FwX3BhY2tldChzZWxmKToKLSAgICAgICAgQWNsTWFuYWdlclRlc3RCYXNlLnRlc3RfcmVjb21iaW5hdGlvbl9sMmNhcF9wYWNrZXQoc2VsZikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hjaS9jb250cm9sbGVyX3Rlc3RfYmx1ZWJlcnJ5LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hjaS9jb250cm9sbGVyX3Rlc3RfYmx1ZWJlcnJ5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWRhNmUzLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvY29udHJvbGxlcl90ZXN0X2JsdWViZXJyeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydCBpbXBvcnQgZ2RfYmFzZV90ZXN0Ci1mcm9tIGhjaS5jZXJ0LmNvbnRyb2xsZXJfdGVzdF9saWIgaW1wb3J0IENvbnRyb2xsZXJUZXN0QmFzZQotZnJvbSBtb2JseSBpbXBvcnQgdGVzdF9ydW5uZXIKLQotCi1jbGFzcyBDb250cm9sbGVyVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIENvbnRyb2xsZXJUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnLCBjZXJ0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnKQotCi0gICAgZGVmIHRlc3RfZ2V0X2FkZHJlc3NlcyhzZWxmKToKLSAgICAgICAgQ29udHJvbGxlclRlc3RCYXNlLnRlc3RfZ2V0X2FkZHJlc3NlcyhzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlc3Rfd3JpdGVfbG9jYWxfbmFtZShzZWxmKToKLSAgICAgICAgQ29udHJvbGxlclRlc3RCYXNlLnRlc3Rfd3JpdGVfbG9jYWxfbmFtZShzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlc3RfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfc3VwcG9ydChzZWxmKToKLSAgICAgICAgQ29udHJvbGxlclRlc3RCYXNlLnRlc3RfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfc3VwcG9ydChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2RpcmVjdF9oY2lfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2RpcmVjdF9oY2lfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYmE1YjAuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hjaS9kaXJlY3RfaGNpX3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gaGNpLmNlcnQuZGlyZWN0X2hjaV90ZXN0X2xpYiBpbXBvcnQgRGlyZWN0SGNpVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgRGlyZWN0SGNpVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIERpcmVjdEhjaVRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQ0knLCBjZXJ0X21vZHVsZT0nSEFMJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgRGlyZWN0SGNpVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIERpcmVjdEhjaVRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfYWNsX21hbmFnZXJfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2xlX2FjbF9tYW5hZ2VyX3Rlc3RfYmx1ZWJlcnJ5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE4MjNiLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfYWNsX21hbmFnZXJfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBoY2kuY2VydC5sZV9hY2xfbWFuYWdlcl90ZXN0X2xpYiBpbXBvcnQgTGVBY2xNYW5hZ2VyVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgTGVBY2xNYW5hZ2VyVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIExlQWNsTWFuYWdlclRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycsIGNlcnRfbW9kdWxlPSdIQ0knKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3Muc2V0dXBfdGVzdChzZWxmKQotICAgICAgICBMZUFjbE1hbmFnZXJUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgTGVBY2xNYW5hZ2VyVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX3Rlc3RfYmx1ZWJlcnJ5LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX3Rlc3RfYmx1ZWJlcnJ5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWMwZjViLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0X2JsdWViZXJyeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydCBpbXBvcnQgZ2RfYmFzZV90ZXN0Ci1mcm9tIGhjaS5jZXJ0LmxlX2FkdmVydGlzaW5nX21hbmFnZXJfdGVzdF9saWIgaW1wb3J0IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0QmIoZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcywgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnLCBjZXJ0X21vZHVsZT0nSENJJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMZUFkdmVydGlzaW5nTWFuYWdlclRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfZXh0ZW5kZWRfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfZXh0ZW5kZWRfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1MDJhNC4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2xlX2V4dGVuZGVkX3NjYW5uaW5nX21hbmFnZXJfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBoY2kuY2VydC5sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3RfbGliIGltcG9ydCBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIExlRXh0ZW5kZWRTY2FubmluZ01hbmFnZXJUZXN0KGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldF9jb250cm9sbGVyX3Byb3BlcnRpZXNfcGF0aChzZWxmLCAnaGNpL2NlcnQvbGVfZXh0ZW5kZWRfY29uZmlnLmpzb24nKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVTY2FubmluZ01hbmFnZXJUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZTI5YS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2xlX3NjYW5uaW5nX21hbmFnZXJfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBoY2kuY2VydC5sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3RfbGliIGltcG9ydCBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldF9jb250cm9sbGVyX3Byb3BlcnRpZXNfcGF0aChzZWxmLCAnaGNpL2NlcnQvbGVfbGVnYWN5X2NvbmZpZy5qc29uJykKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgTGVTY2FubmluZ01hbmFnZXJUZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2xlX3NjYW5uaW5nX3dpdGhfc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvaGNpL2xlX3NjYW5uaW5nX3dpdGhfc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWIzZjYuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hjaS9sZV9zY2FubmluZ193aXRoX3NlY3VyaXR5X3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gaGNpLmNlcnQubGVfc2Nhbm5pbmdfd2l0aF9zZWN1cml0eV90ZXN0X2xpYiBpbXBvcnQgTGVTY2FubmluZ1dpdGhTZWN1cml0eVRlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIExlU2Nhbm5pbmdXaXRoU2VjdXJpdHlUZXN0QmIoZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcywgTGVTY2FubmluZ1dpdGhTZWN1cml0eVRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdTRUNVUklUWScsIGNlcnRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9ob3N0X2NvbmZpZy55YW1sIGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hvc3RfY29uZmlnLnlhbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTU1ZGIuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2hvc3RfY29uZmlnLnlhbWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1fZGVzY3JpcHRpb246IEJsdWV0b290aCBjZXJ0IHRlc3RpbmcKLVRlc3RCZWRzOgotICAtIE5hbWU6IEhvc3RPbmx5Q2VydAotICAgIENvbnRyb2xsZXJzOgotICAgICAgcm9vdGNhbmFsOgotICAgICAgICB0ZXN0X3BvcnQ6ICc2NDAxJwotICAgICAgICBoY2lfcG9ydDogJzY0MDInCi0gICAgICAgIGxpbmtfbGF5ZXJfcG9ydDogJzY0MDMnCi0gICAgICBHZERldmljZToKLSAgICAgICAgLSBncnBjX3BvcnQ6ICc4OTk4JwotICAgICAgICAgIGdycGNfcm9vdF9zZXJ2ZXJfcG9ydDogJzg5OTYnCi0gICAgICAgICAgc2lnbmFsX3BvcnQ6ICc4OTk0JwotICAgICAgICAgIGxhYmVsOiBjZXJ0Ci0gICAgICAgICAgbmFtZTogQ2VydCBEZXZpY2UKLSAgICAgICAgICBjbWQ6Ci0gICAgICAgICAgICAtICIkR0RfUk9PVC9ibHVldG9vdGhfc3RhY2tfd2l0aF9mYWNhZGUiCi0gICAgICAgICAgICAtICItLWdycGMtcG9ydD0kKGdycGNfcG9ydCkiCi0gICAgICAgICAgICAtICItLXJvb3Qtc2VydmVyLXBvcnQ9JChncnBjX3Jvb3Rfc2VydmVyX3BvcnQpIgotICAgICAgICAgICAgLSAiLS1yb290Y2FuYWwtcG9ydD0kKHJvb3RjYW5hbF9wb3J0KSIKLSAgICAgICAgICAgIC0gIi0tc2lnbmFsLXBvcnQ9JChzaWduYWxfcG9ydCkiCi0gICAgICAgIC0gZ3JwY19wb3J0OiAnODk5OScKLSAgICAgICAgICBncnBjX3Jvb3Rfc2VydmVyX3BvcnQ6ICc4OTk3JwotICAgICAgICAgIHNpZ25hbF9wb3J0OiAnODk5NScKLSAgICAgICAgICBsYWJlbDogZHV0Ci0gICAgICAgICAgbmFtZTogRFVUIERldmljZQotICAgICAgICAgIGNtZDoKLSAgICAgICAgICAgIC0gIiRHRF9ST09UL2JsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIKLSAgICAgICAgICAgIC0gIi0tZ3JwYy1wb3J0PSQoZ3JwY19wb3J0KSIKLSAgICAgICAgICAgIC0gIi0tcm9vdC1zZXJ2ZXItcG9ydD0kKGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkiCi0gICAgICAgICAgICAtICItLXJvb3RjYW5hbC1wb3J0PSQocm9vdGNhbmFsX3BvcnQpIgotICAgICAgICAgICAgLSAiLS1zaWduYWwtcG9ydD0kKHNpZ25hbF9wb3J0KSIKLWxvZ3BhdGg6ICIvdG1wL2xvZ3MiCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvaXNvL2xlX2lzb190ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9pc28vbGVfaXNvX3Rlc3RfYmx1ZWJlcnJ5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQ5M2FjLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9pc28vbGVfaXNvX3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDIxIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gaXNvLmNlcnQubGVfaXNvX3Rlc3RfbGliIGltcG9ydCBMZUlzb1Rlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIExlSXNvVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIExlSXNvVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0wyQ0FQJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVJc29UZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgTGVJc29UZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF9wZXJmb3JtYW5jZV90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX3BlcmZvcm1hbmNlX3Rlc3RfYmx1ZWJlcnJ5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY2ODA1Li4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX3BlcmZvcm1hbmNlX3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gbDJjYXAuY2xhc3NpYy5jZXJ0LmwyY2FwX3BlcmZvcm1hbmNlX3Rlc3RfbGliIGltcG9ydCBMMmNhcFBlcmZvcm1hbmNlVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgTDJjYXBQZXJmb3JtYW5jZVRlc3RCYihnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLCBMMmNhcFBlcmZvcm1hbmNlVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0wyQ0FQJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTDJjYXBQZXJmb3JtYW5jZVRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMMmNhcFBlcmZvcm1hbmNlVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2wyY2FwL2NsYXNzaWMvbDJjYXBfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1N2ZlNC4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF90ZXN0X2JsdWViZXJyeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydCBpbXBvcnQgZ2RfYmFzZV90ZXN0Ci1mcm9tIGwyY2FwLmNsYXNzaWMuY2VydC5sMmNhcF90ZXN0X2xpYiBpbXBvcnQgTDJjYXBUZXN0QmFzZQotZnJvbSBtb2JseSBpbXBvcnQgdGVzdF9ydW5uZXIKLQotCi1jbGFzcyBMMmNhcFRlc3RCYihnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLCBMMmNhcFRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdMMkNBUCcsIGNlcnRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIEwyY2FwVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEwyY2FwVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2wyY2FwL2xlL2R1YWxfbDJjYXBfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvbGUvZHVhbF9sMmNhcF90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxZDMyNC4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvbGUvZHVhbF9sMmNhcF90ZXN0X2JsdWViZXJyeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydCBpbXBvcnQgZ2RfYmFzZV90ZXN0Ci1mcm9tIGwyY2FwLmxlLmNlcnQuZHVhbF9sMmNhcF90ZXN0X2xpYiBpbXBvcnQgRHVhbEwyY2FwVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgRHVhbEwyY2FwVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIER1YWxMMmNhcFRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdMMkNBUCcsIGNlcnRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIER1YWxMMmNhcFRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBEdWFsTDJjYXBUZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvbGUvbGVfbDJjYXBfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2QvbDJjYXAvbGUvbGVfbDJjYXBfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhN2U5ZjQuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL2wyY2FwL2xlL2xlX2wyY2FwX3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gbDJjYXAubGUuY2VydC5sZV9sMmNhcF90ZXN0X2xpYiBpbXBvcnQgTGVMMmNhcFRlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIExlTDJjYXBUZXN0QmIoZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcywgTGVMMmNhcFRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdMMkNBUCcsIGNlcnRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIExlTDJjYXBUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgTGVMMmNhcFRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9uZWlnaGJvci9uZWlnaGJvcl90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9uZWlnaGJvci9uZWlnaGJvcl90ZXN0X2JsdWViZXJyeS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkYTk5ZS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvZ2QvbmVpZ2hib3IvbmVpZ2hib3JfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBuZWlnaGJvci5jZXJ0Lm5laWdoYm9yX3Rlc3RfbGliIGltcG9ydCBOZWlnaGJvclRlc3RCYXNlCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotCi0KLWNsYXNzIE5laWdoYm9yVGVzdEJiKGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MsIE5laWdoYm9yVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJywgY2VydF9tb2R1bGU9J0hDSScpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIE5laWdoYm9yVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIE5laWdoYm9yVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvYWRhcHRlcl90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL2FkYXB0ZXJfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTM2MWQuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvYWRhcHRlcl90ZXN0X2JsdWViZXJyeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBydXN0LnRvcHNoaW0uZmFjYWRlIGltcG9ydCBhZGFwdGVyX3Rlc3QKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLWNsYXNzIEFkYXB0ZXJUZXN0QmIoYWRhcHRlcl90ZXN0LkFkYXB0ZXJUZXN0KToKLSAgICBwYXNzCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2Qvc2VjdXJpdHkvbGVfc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2Qvc2VjdXJpdHkvbGVfc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDVhYTQuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3NlY3VyaXR5L2xlX3NlY3VyaXR5X3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gc2VjdXJpdHkuY2VydC5sZV9zZWN1cml0eV90ZXN0X2xpYiBpbXBvcnQgTGVTZWN1cml0eVRlc3RCYXNlCi0KLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgTGVTZWN1cml0eVRlc3RCYihnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLCBMZVNlY3VyaXR5VGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J1NFQ1VSSVRZJywgY2VydF9tb2R1bGU9J1NFQ1VSSVRZJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBhc3NlcnRzLnNraXAoIlVuaGFuZGxlZCByYWNlIGNvbmRpdGlvbiAtIEZsYWt5IHRlc3QiKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVTZWN1cml0eVRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICByZXR1cm4gICMgdGVzdCBza2lwcGVkCi0gICAgICAgIExlU2VjdXJpdHlUZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIGdkX2Jhc2VfdGVzdC5HZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvZ2Qvc2VjdXJpdHkvc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkucHkgYi9ibHVlYmVycnkvdGVzdHMvZ2Qvc2VjdXJpdHkvc2VjdXJpdHlfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmVjOWQuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3NlY3VyaXR5L3NlY3VyaXR5X3Rlc3RfYmx1ZWJlcnJ5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0IGltcG9ydCBnZF9iYXNlX3Rlc3QKLWZyb20gc2VjdXJpdHkuY2VydC5zZWN1cml0eV90ZXN0X2xpYiBpbXBvcnQgU2VjdXJpdHlUZXN0QmFzZQotZnJvbSBtb2JseSBpbXBvcnQgdGVzdF9ydW5uZXIKLQotCi1jbGFzcyBTZWN1cml0eVRlc3RCYihnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLCBTZWN1cml0eVRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdTRUNVUklUWScsIGNlcnRfbW9kdWxlPSdMMkNBUCcpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIFNlY3VyaXR5VGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIFNlY3VyaXR5VGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3NoaW0vc2hpbV90ZXN0X2JsdWViZXJyeS5weSBiL2JsdWViZXJyeS90ZXN0cy9nZC9zaGltL3NoaW1fdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Nzk4NTUuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3NoaW0vc2hpbV90ZXN0X2JsdWViZXJyeS5weQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydCBpbXBvcnQgZ2RfYmFzZV90ZXN0Ci1mcm9tIHNoaW0uY2VydC5zaGltX3Rlc3RfbGliIGltcG9ydCBTaGltVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgU2hpbVRlc3RCYihnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLCBTaGltVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBnZF9iYXNlX3Rlc3QuR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J1NISU0nLCBjZXJ0X21vZHVsZT0nU0hJTScpCi0KLSAgICBkZWYgdGVzdF9kdW1wc3lzKHNlbGYpOgotICAgICAgICBTaGltVGVzdEJhc2UudGVzdF9kdW1wc3lzKHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3J1bm5lci5tYWluKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS90ZXN0cy9nZC9zaGltL3N0YWNrX3Rlc3RfYmx1ZWJlcnJ5LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3NoaW0vc3RhY2tfdGVzdF9ibHVlYmVycnkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOWMwNDUuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3Rlc3RzL2dkL3NoaW0vc3RhY2tfdGVzdF9ibHVlYmVycnkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQgaW1wb3J0IGdkX2Jhc2VfdGVzdAotZnJvbSBzaGltLmNlcnQuc3RhY2tfdGVzdF9saWIgaW1wb3J0IFN0YWNrVGVzdEJhc2UKLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi0KLQotY2xhc3MgU3RhY2tUZXN0QmIoZ2RfYmFzZV90ZXN0LkdkQmFzZVRlc3RDbGFzcywgU3RhY2tUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIHN1cGVyKCkuc2V0dXBfY2xhc3MoZHV0X21vZHVsZT0nU0hJTScsIGNlcnRfbW9kdWxlPSdTSElNJykKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3Rlc3RzL21hcC9ibHVldG9vdGhfbWFwX3Rlc3QucHkgYi9ibHVlYmVycnkvdGVzdHMvbWFwL2JsdWV0b290aF9tYXBfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiZWU0ZS4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvbWFwL2JsdWV0b290aF9tYXBfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0iIiJUZXN0cyBmb3IgYmx1ZWJlcnJ5Lm1hcC5ibHVldG9vdGhfbWFwLiIiIgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KLQotaW1wb3J0IHF1ZXVlCi1pbXBvcnQgdGltZQotCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotZnJvbSBtb2JseSBpbXBvcnQgc2lnbmFscwotZnJvbSBtb2JseSBpbXBvcnQgdXRpbHMKLQotZnJvbSBibHVlYmVycnkuY29udHJvbGxlcnMgaW1wb3J0IGFuZHJvaWRfYnRfdGFyZ2V0X2RldmljZQotZnJvbSBibHVlYmVycnkudXRpbHMgaW1wb3J0IGJsdWViZXJyeV9iYXNlX3Rlc3QKLQotX1NNU19NU0dfRVZFTlQgPSAnU21zUmVjZWl2ZWQnCi1fTUFQX01TR19FVkVOVCA9ICdNYXBNZXNzYWdlUmVjZWl2ZWQnCi0KLV9FVkVOVF9USU1FT1VUX1NFQyA9IDE4MAotX1RFWFRfTEVOR1RIID0gMTAKLV9URVhUX0NPVU5UID0gNQotCi0KLWNsYXNzIEJsdWV0b290aE1hcFRlc3QoYmx1ZWJlcnJ5X2Jhc2VfdGVzdC5CbHVlYmVycnlCYXNlVGVzdCk6Ci0gICIiIlRlc3QgQ2xhc3MgZm9yIEJsdWV0b290aCBNQVAgVGVzdC4iIiIKLQotICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgIiIiU3RhbmRhcmQgTW9ibHkgc2V0dXAgY2xhc3MuIiIiCi0gICAgc3VwZXIoKS5zZXR1cF9jbGFzcygpCi0gICAgZm9yIGRldmljZSBpbiBzZWxmLmFuZHJvaWRfZGV2aWNlczoKLSAgICAgIGRldmljZS5pbml0X3NldHVwKCkKLSAgICAgIGRldmljZS5zbDRhX3NldHVwKCkKLQotICAgICMgUHJpbWFyeSBwaG9uZSB3aGljaCByb2xlIGlzIE1lc3NhZ2UgU2VydmVyIEVxdWlwbWVudCAoTVNFKS4KLSAgICBzZWxmLnByaV9waG9uZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdCi0gICAgc2VsZi5wcmlfcGhvbmUuc2w0YS5zbXNTdGFydFRyYWNraW5nSW5jb21pbmdTbXNNZXNzYWdlKCkKLSAgICBzZWxmLnByaV9udW1iZXIgPSBzZWxmLnByaV9waG9uZS5kaW1lbnNpb25zWydwaG9uZV9udW1iZXInXQotCi0gICAgIyBTZWNvbmRhcnkgcGhvbmUgd2hpY2ggaXMgdXNlZCB0byBzZW5kIFNNUyBtZXNzYWdlcyB0byBwcmltYXJ5IHBob25lLgotICAgIHNlbGYuc2VjX3Bob25lID0gc2VsZi5hbmRyb2lkX2RldmljZXNbMV0KLQotICAgICMgQmx1ZXRvb3RoIGNhcmtpdCB3aGljaCByb2xlIGlzIE1lc3NhZ2UgQ2xpZW50IEVxdWlwbWVudCAoTUNFKS4KLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZXNbMF0KLQotICAgIG1hY19hZGRyZXNzID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5nZXRfYmx1ZXRvb3RoX21hY19hZGRyZXNzKCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmFjdGl2YXRlX3BhaXJpbmdfbW9kZSgpCi0gICAgc2VsZi5wcmlfcGhvbmUucGFpcl9hbmRfY29ubmVjdF9ibHVldG9vdGgobWFjX2FkZHJlc3MpCi0gICAgIyBTbGVlcCB0byBtYWtlIHRoZSBjb25uZWN0aW9uIHRvIGJlIHN0ZWFkeS4KLSAgICB0aW1lLnNsZWVwKDUpCi0KLSAgICBpZiBpc2luc3RhbmNlKAotICAgICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLCBhbmRyb2lkX2J0X3RhcmdldF9kZXZpY2UuQW5kcm9pZEJ0VGFyZ2V0RGV2aWNlKToKLSAgICAgICMgQWxsb3cgc2w0YSB0byByZWNlaXZlIHRoZSBpbnRlbnQgd2l0aCBBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRC4KLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYWRiLnNoZWxsKAotICAgICAgICAgICdwbSBncmFudCBjb20uZ29vZ2xlY29kZS5hbmRyb2lkX3NjcmlwdGluZyAnCi0gICAgICAgICAgJ2FuZHJvaWQucGVybWlzc2lvbi5SRUNFSVZFX1NNUycpCi0gICAgICAjIENvbm5lY3QgZGVyaXZlZCBidCBkZXZpY2UgdG8gcHJpbWFyeSBwaG9uZSB2aWEgTUFQIE1DRSBwcm9maWxlLgotICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5hZGRfc2VjX2FkX2RldmljZShzZWxmLnByaV9waG9uZSkKLQotICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAiIiJTdGFuZGFyZCBNb2JseSB0ZWFyZG93biB0ZXN0LgotCi0gICAgRGlzY29ubmVjdHMgdGhlIE1BUCBjb25uZWN0aW9uIGFmdGVyIGEgdGVzdCBjb21wbGV0ZXMuCi0gICAgIiIiCi0gICAgc3VwZXIoKS50ZWFyZG93bl90ZXN0KCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLm1hcF9kaXNjb25uZWN0KCkKLQotICBkZWYgX3dhaXRfZm9yX21lc3NhZ2Vfb25fbWNlKHNlbGYsIHRleHQpOgotICAgICIiIldhaXRzIGZvciB0aGF0IE1DRSBnZXRzIGFuIGV2ZW50IHdpdGggc3BlY2lmaWMgbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICB0ZXh0OiBTdHJpbmcsIFRleHQgb2YgdGhlIG1lc3NhZ2UuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBUZXN0RmFpbHVyZTogUmFpc2VkIGlmIHRpbWVkIG91dC4KLSAgICAiIiIKLSAgICB0cnk6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmVkLndhaXRfZm9yX2V2ZW50KAotICAgICAgICAgIF9NQVBfTVNHX0VWRU5ULCBsYW1iZGEgZTogZVsnZGF0YSddID09IHRleHQsIF9FVkVOVF9USU1FT1VUX1NFQykKLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UubG9nLmluZm8oCi0gICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBnb3QgdGhlIHVucmVhZCBtZXNzYWdlOiAlcycgJSB0ZXh0KQotICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKLSAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoCi0gICAgICAgICAgJ1RpbWVkIG91dCBhZnRlciAlZHMgd2FpdGluZyBmb3IgIiVzIiBldmVudCB3aXRoIHRoZSBtZXNzYWdlOiAlcycgJQotICAgICAgICAgIChfRVZFTlRfVElNRU9VVF9TRUMsIF9NQVBfTVNHX0VWRU5ULCB0ZXh0KSkKLQotICBkZWYgX3dhaXRfZm9yX21lc3NhZ2Vfb25fbXNlKHNlbGYsIHRleHQpOgotICAgICIiIldhaXRzIGZvciB0aGF0IE1TRSBnZXRzIGFuIGV2ZW50IHdpdGggc3BlY2lmaWMgbWVzc2FnZS4KLQotICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgTVNFIGhhcyByZWNlaXZlZCB0aGUgdGVzdCBtZXNzYWdlLgotCi0gICAgQXJnczoKLSAgICAgIHRleHQ6IFN0cmluZywgVGV4dCBvZiB0aGUgbWVzc2FnZS4KLQotICAgIFJhaXNlczoKLSAgICAgIFRlc3RFcnJvcjogUmFpc2VkIGlmIHRpbWVkIG91dC4KLSAgICAiIiIKLSAgICB0cnk6Ci0gICAgICBzZWxmLnByaV9waG9uZS5lZC53YWl0X2Zvcl9ldmVudCgKLSAgICAgICAgICBfU01TX01TR19FVkVOVCwgbGFtYmRhIGU6IGVbJ2RhdGEnXVsnVGV4dCddID09IHRleHQsCi0gICAgICAgICAgX0VWRU5UX1RJTUVPVVRfU0VDKQotICAgICAgc2VsZi5wcmlfcGhvbmUubG9nLmluZm8oCi0gICAgICAgICAgJ1N1Y2Nlc3NmdWxseSByZWNlaXZlZCB0aGUgaW5jb21pbmcgbWVzc2FnZTogJXMnICUgdGV4dCkKLSAgICBleGNlcHQgcXVldWUuRW1wdHk6Ci0gICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAnVGltZWQgb3V0IGFmdGVyICVkcyB3YWl0aW5nIGZvciAiJXMiIGV2ZW50IHdpdGggdGhlIG1lc3NhZ2U6ICVzJyAlCi0gICAgICAgICAgKF9FVkVOVF9USU1FT1VUX1NFQywgX1NNU19NU0dfRVZFTlQsIHRleHQpKQotCi0gIGRlZiBfY3JlYXRlX21lc3NhZ2Vfb25fbXNlKHNlbGYsIHRleHQpOgotICAgICIiIkNyZWF0ZXMgYSBuZXcgaW5jb21pbmcgbWVzc2FnZSBvbiBNU0UuCi0KLSAgICBBcmdzOgotICAgICAgdGV4dDogU3RyaW5nLCBUZXh0IG9mIHRoZSBtZXNzYWdlLgotICAgICIiIgotICAgIHNlbGYuc2VjX3Bob25lLnNsNGEuc21zU2VuZFRleHRNZXNzYWdlKHNlbGYucHJpX251bWJlciwgdGV4dCwgRmFsc2UpCi0gICAgc2VsZi5fd2FpdF9mb3JfbWVzc2FnZV9vbl9tc2UodGV4dCkKLQotICBkZWYgdGVzdF9nZXRfZXhpc3RpbmdfdW5yZWFkX21lc3NhZ2VzKHNlbGYpOgotICAgICIiIlRlc3QgZm9yIHRoZSBmZWF0dXJlIG9mIGdldHRpbmcgZXhpc3RpbmcgdW5yZWFkIG1lc3NhZ2VzIG9uIE1DRS4KLQotICAgIFRlc3RzIE1DRSBjYW4gbGlzdCBleGlzdGluZyBtZXNzYWdlcyBvZiBNU0UuCi0gICAgIiIiCi0gICAgdGV4dF9saXN0ID0gW10KLSAgICAjIENyZWF0ZXMgNSBTTVMgbWVzc2FnZXMgb24gTVNFIGJlZm9yZSBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbi4KLSAgICBmb3IgXyBpbiByYW5nZShfVEVYVF9DT1VOVCk6Ci0gICAgICB0ZXh0ID0gdXRpbHMucmFuZF9hc2NpaV9zdHIoX1RFWFRfTEVOR1RIKQotICAgICAgc2VsZi5fY3JlYXRlX21lc3NhZ2Vfb25fbXNlKHRleHQpCi0gICAgICB0ZXh0X2xpc3QuYXBwZW5kKHRleHQpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5tYXBfY29ubmVjdCgpCi0gICAgIyBHZXRzIHRoZSB1bnJlYWQgbWVzc2FnZXMgb2YgTVNFIGFuZCBjaGVja3MgaWYgdGhleSBhcmUgZG93bmxvYWRlZAotICAgICMgc3VjY2Vzc2Z1bGx5IG9uIE1DRS4KLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmdldF91bnJlYWRfbWVzc2FnZXMoKQotICAgIGZvciB0ZXh0IGluIHRleHRfbGlzdDoKLSAgICAgIHNlbGYuX3dhaXRfZm9yX21lc3NhZ2Vfb25fbWNlKHRleHQpCi0KLSAgZGVmIHRlc3RfcmVjZWl2ZV91bnJlYWRfbWVzc2FnZShzZWxmKToKLSAgICAiIiJUZXN0IGZvciB0aGUgZmVhdHVyZSBvZiByZWNlaXZpbmcgdW5yZWFkIG1lc3NhZ2Ugb24gTUNFLgotCi0gICAgVGVzdHMgTUNFIGNhbiBnZXQgYW4gdW5yZWFkIG1lc3NhZ2Ugd2hlbiBNU0UgcmVjZWl2ZXMgYW4gaW5jb21pbmcgbWVzc2FnZS4KLSAgICAiIiIKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLm1hcF9jb25uZWN0KCkKLSAgICB0ZXh0ID0gdXRpbHMucmFuZF9hc2NpaV9zdHIoX1RFWFRfTEVOR1RIKQotICAgIHNlbGYuX2NyZWF0ZV9tZXNzYWdlX29uX21zZSh0ZXh0KQotICAgIHNlbGYuX3dhaXRfZm9yX21lc3NhZ2Vfb25fbWNlKHRleHQpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvcGFuL2JsdWV0b290aF9wYW5fdGVzdC5weSBiL2JsdWViZXJyeS90ZXN0cy9wYW4vYmx1ZXRvb3RoX3Bhbl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjJkYThlLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9wYW4vYmx1ZXRvb3RoX3Bhbl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLSIiIlRlc3RzIGZvciBCbHVldG9vdGggUEFOIHByb2ZpbGUgZnVuY3Rpb25hbGl0aWVzLiIiIgotCi1pbXBvcnQgY29udGV4dGxpYgotaW1wb3J0IHRpbWUKLQotZnJvbSBtb2JseSBpbXBvcnQgdGVzdF9ydW5uZXIKLWZyb20gbW9ibHkgaW1wb3J0IHNpZ25hbHMKLWZyb20gbW9ibHkuY29udHJvbGxlcnMuYW5kcm9pZF9kZXZpY2VfbGliIGltcG9ydCBqc29ucnBjX2NsaWVudF9iYXNlCi1mcm9tIGJsdWViZXJyeS51dGlscyBpbXBvcnQgYmx1ZWJlcnJ5X2Jhc2VfdGVzdAotZnJvbSBibHVlYmVycnkudXRpbHMgaW1wb3J0IGJ0X3Rlc3RfdXRpbHMKLQotIyBUaW1lb3V0IHRvIHdhaXQgZm9yIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24gdG8gYmUgc3BlY2lmaWMgc3RhdGUgaW4gc2Vjb25kLgotQ09OTkVDVElPTl9USU1FT1VUX1NFQ1MgPSAyMAotCi0jIEludGVydmFsIHRpbWUgYmV0d2VlbiBwaW5nIHJlcXVlc3RzIGluIHNlY29uZC4KLVBJTkdfSU5URVJWQUxfVElNRV9TRUMgPSAyCi0KLSMgVGltZW91dCB0byB3YWl0IGZvciBwaW5nIHN1Y2Nlc3MgaW4gc2Vjb25kLgotUElOR19USU1FT1VUX1NFQyA9IDYwCi0KLSMgQSBVUkwgaXMgdXNlZCB0byB2ZXJpZnkgaW50ZXJuZXQgYnkgcGluZyByZXF1ZXN0LgotVEVTVF9VUkwgPSAnaHR0cDovL3d3dy5nb29nbGUuY29tJwotCi0jIEEgc3RyaW5nIHJlcHJlc2VudGluZyBTSU0gU3RhdGUgaXMgcmVhZHkuCi1TSU1fU1RBVEVfUkVBRFkgPSAnUkVBRFknCi0KLQotY2xhc3MgQmx1ZXRvb3RoUGFuVGVzdChibHVlYmVycnlfYmFzZV90ZXN0LkJsdWViZXJyeUJhc2VUZXN0KToKLSAgIiIiVGVzdCBjbGFzcyBmb3IgQmx1ZXRvb3RoIFBBTihQZXJzb25hbCBBcmVhIE5ldHdvcmtpbmcpIHByb2ZpbGUuCi0KLSAgVGVzdCBpbnRlcm5ldCBjb25uZWN0aW9uIHNoYXJpbmcgdmlhIEJsdWV0b290aCBiZXR3ZWVuIHR3byBBbmRyb2lkIGRldmljZXMuCi0gIE9uZSBkZXZpY2Ugd2hpY2ggaXMgcmVmZXJyZWQgdG8gYXMgTkFQKE5ldHdvcmsgQWNjZXNzIFBvaW50KSB1c2VzIEJsdWV0b290aAotICB0ZXRoZXJpbmcgdG8gc2hhcmUgaW50ZXJuZXQgY29ubmVjdGlvbiB3aXRoIGFub3RoZXIgZGV2aWNlIHdoaWNoIGlzIHJlZmVycmVkCi0gIHRvIGFzIFBBTlUoUGVyc29uYWwgQXJlYSBOZXR3b3JraW5nIFVzZXIpLgotICAiIiIKLQotICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgIiIiU3RhbmRhcmQgTW9ibHkgc2V0dXAgY2xhc3MuIiIiCi0gICAgc3VwZXIoQmx1ZXRvb3RoUGFuVGVzdCwgc2VsZikuc2V0dXBfY2xhc3MoKQotICAgICMgTnVtYmVyIG9mIGF0dGVtcHRzIHRvIGluaXRpYXRlIGNvbm5lY3Rpb24uIDUgYXR0ZW1wdHMgYXMgZGVmYXVsdC4KLSAgICBzZWxmLnBhbl9jb25uZWN0X2F0dGVtcHRzID0gc2VsZi51c2VyX3BhcmFtcy5nZXQoJ3Bhbl9jb25uZWN0X2F0dGVtcHRzJywgNSkKLQotICAgIGZvciBkZXZpY2UgaW4gc2VsZi5hbmRyb2lkX2RldmljZXM6Ci0gICAgICBkZXZpY2UuaW5pdF9zZXR1cCgpCi0gICAgICBkZXZpY2Uuc2w0YV9zZXR1cCgpCi0gICAgICBkZXZpY2UubWFjX2FkZHJlc3MgPSBkZXZpY2UuZ2V0X2JsdWV0b290aF9tYWNfYWRkcmVzcygpCi0KLSAgICAgICMgQ2hlY2sgaWYgdGhlIGRldmljZSBoYXMgaW5zZXJ0ZWQgYSBTSU0gY2FyZC4KLSAgICAgIGlmIGRldmljZS5zbDRhLnRlbGVwaG9ueUdldFNpbVN0YXRlKCkgIT0gU0lNX1NUQVRFX1JFQURZOgotICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcignU0lNIGNhcmQgaXMgbm90IHJlYWR5IG9uIERldmljZSAiJXMiLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Uuc2VyaWFsKQotCi0gICAgc2VsZi5wcmltYXJ5X2RldmljZSA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdCi0gICAgc2VsZi5zZWNvbmRhcnlfZGV2aWNlID0gc2VsZi5hbmRyb2lkX2RldmljZXNbMV0KLQotICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAiIiJTdGFuZGFyZCBNb2JseSB0ZWFyZG93biB0ZXN0LgotCi0gICAgUmVzZXQgZXZlcnkgZGV2aWNlcyB3aGVuIGEgdGVzdCBmaW5pc2hlZC4KLSAgICAiIiIKLSAgICBzdXBlcihCbHVldG9vdGhQYW5UZXN0LCBzZWxmKS50ZWFyZG93bl90ZXN0KCkKLSAgICAjIFJldmVydCBkZWJ1ZyB0YWdzLgotICAgIGZvciBkZXZpY2UgaW4gc2VsZi5hbmRyb2lkX2RldmljZXM6Ci0gICAgICBkZXZpY2UuZGVidWdfdGFnID0gZGV2aWNlLnNlcmlhbAotICAgICAgZGV2aWNlLmZhY3RvcnlfcmVzZXRfYmx1ZXRvb3RoKCkKLQotICBkZWYgd2FpdF9mb3JfbmFwX3NlcnZpY2VfY29ubmVjdGlvbigKLSAgICAgIHNlbGYsCi0gICAgICBkZXZpY2UsCi0gICAgICBjb25uZWN0ZWRfbWFjX2FkZHIsCi0gICAgICBzdGF0ZV9jb25uZWN0ZWQ9VHJ1ZSk6Ci0gICAgIiIiV2FpdHMgZm9yIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24gdG8gYmUgZXhwZWN0ZWQgc3RhdGUuCi0KLSAgICBBcmdzOgotICAgICAgZGV2aWNlOiBBbmRyb2lkRGV2aWNlLCBBIGRldmljZSBpcyB1c2VkIHRvIGNoZWNrIHRoaXMgY29ubmVjdGlvbi4KLSAgICAgIGNvbm5lY3RlZF9tYWNfYWRkcjogU3RyaW5nLCBCbHVldG9vdGggTWFjIGFkZHJlc3MgaXMgbmVlZGVkIHRvIGJlIGNoZWNrZWQuCi0gICAgICBzdGF0ZV9jb25uZWN0ZWQ6IEJvb2wsIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYXMgZXhwZWN0ZWQKLSAgICAgICAgICBpZiBUcnVlLCBlbHNlIHRlcm1pbmF0ZWQgYXMgZXhwZWN0ZWQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBUZXN0RmFpbHVyZTogUmFpc2VkIGlmIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24gaXMgbm90IGV4cGVjdGVkIHN0YXRlLgotICAgICIiIgotICAgIGRlZiBpc19kZXZpY2VfY29ubmVjdGVkKCk6Ci0gICAgICAiIiJSZXR1cm5zIFRydWUgaWYgY29ubmVjdGVkIGVsc2UgRmFsc2UuIiIiCi0gICAgICBjb25uZWN0ZWRfZGV2aWNlcyA9IChkZXZpY2Uuc2w0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aFBhbkdldENvbm5lY3RlZERldmljZXMoKSkKLSAgICAgICMgQ2hlY2sgaWYgdGhlIEJsdWV0b290aCBtYWMgYWRkcmVzcyBpcyBpbiB0aGUgY29ubmVjdGVkIGRldmljZSBsaXN0LgotICAgICAgcmV0dXJuIGNvbm5lY3RlZF9tYWNfYWRkciBpbiBbZFsnYWRkcmVzcyddIGZvciBkIGluIGNvbm5lY3RlZF9kZXZpY2VzXQotCi0gICAgYnRfdGVzdF91dGlscy53YWl0X3VudGlsKAotICAgICAgICB0aW1lb3V0X3NlYz1DT05ORUNUSU9OX1RJTUVPVVRfU0VDUywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9aXNfZGV2aWNlX2Nvbm5lY3RlZCwKLSAgICAgICAgZnVuY19hcmdzPVtdLAotICAgICAgICBleHBlY3RlZF92YWx1ZT1zdGF0ZV9jb25uZWN0ZWQsCi0gICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RGYWlsdXJlKAotICAgICAgICAgICAgJ05BUCBzZXJ2aWNlIGNvbm5lY3Rpb24gZmFpbGVkIHRvIGJlICVzIGluICVkcy4nICUKLSAgICAgICAgICAgICgnZXN0YWJsaXNoZWQnIGlmIHN0YXRlX2Nvbm5lY3RlZCBlbHNlICd0ZXJtaW5hdGVkJywKLSAgICAgICAgICAgICBDT05ORUNUSU9OX1RJTUVPVVRfU0VDUykpKQotCi0gIGRlZiBpbml0aWF0ZV9uYXBfc2VydmljZV9jb25uZWN0aW9uKAotICAgICAgc2VsZiwKLSAgICAgIGluaXRpYXRvcl9kZXZpY2UsCi0gICAgICBjb25uZWN0ZWRfbWFjX2FkZHIpOgotICAgICIiIkluaXRpYXRlcyBOQVAgc2VydmljZSBjb25uZWN0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIGluaXRpYXRvcl9kZXZpY2U6IEFuZHJvaWREZXZpY2UsIEEgZGV2aWNlIGludGlhdGluZyBjb25uZWN0aW9uLgotICAgICAgY29ubmVjdGVkX21hY19hZGRyOiBTdHJpbmcsIEJsdWV0b290aCBNYWMgYWRkcmVzcyBvZiBjb25uZWN0ZWQgZGV2aWNlLgotCi0gICAgUmFpc2VzOgotICAgICAgVGVzdEZhaWx1cmU6IFJhaXNlZCBpZiBOQVAgc2VydmljZSBjb25uZWN0aW9uIGZhaWxzIHRvIGJlIGVzdGFibGlzaGVkLgotICAgICIiIgotICAgIGNvdW50ID0gMAotICAgIGZvciBfIGluIHJhbmdlKHNlbGYucGFuX2Nvbm5lY3RfYXR0ZW1wdHMpOgotICAgICAgY291bnQgKz0gMQotICAgICAgdHJ5OgotICAgICAgICBpbml0aWF0b3JfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoQ29ubmVjdEJvbmRlZChjb25uZWN0ZWRfbWFjX2FkZHIpCi0gICAgICAgIHNlbGYud2FpdF9mb3JfbmFwX3NlcnZpY2VfY29ubmVjdGlvbigKLSAgICAgICAgICAgIGRldmljZT1pbml0aWF0b3JfZGV2aWNlLAotICAgICAgICAgICAgY29ubmVjdGVkX21hY19hZGRyPWNvbm5lY3RlZF9tYWNfYWRkciwKLSAgICAgICAgICAgIHN0YXRlX2Nvbm5lY3RlZD1UcnVlKQotICAgICAgICByZXR1cm4KLSAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RGYWlsdXJlOgotICAgICAgICBpZiBjb3VudCA9PSBzZWxmLnBhbl9jb25uZWN0X2F0dGVtcHRzOgotICAgICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoCi0gICAgICAgICAgICAgICdOQVAgc2VydmljZSBjb25uZWN0aW9uIHN0aWxsIGZhaWxlZCB0byBiZSBlc3RhYmxpc2hlZCAnCi0gICAgICAgICAgICAgICdhZnRlciByZXRyaWVkICVkIHRpbWVzLicgJQotICAgICAgICAgICAgICBzZWxmLnBhbl9jb25uZWN0X2F0dGVtcHRzKQotCi0gIGRlZiB0ZXJtaW5hdGVfbmFwX3NlcnZpY2VfY29ubmVjdGlvbigKLSAgICAgIHNlbGYsCi0gICAgICBpbml0aWF0b3JfZGV2aWNlLAotICAgICAgY29ubmVjdGVkX21hY19hZGRyKToKLSAgICAiIiJUZXJtaW5hdGVzIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24uCi0KLSAgICBBcmdzOgotICAgICAgaW5pdGlhdG9yX2RldmljZTogQW5kcm9pZERldmljZSwgQSBkZXZpY2UgaW50aWF0aW5nIGRpc2Nvbm5lY3Rpb24uCi0gICAgICBjb25uZWN0ZWRfbWFjX2FkZHI6IFN0cmluZywgQmx1ZXRvb3RoIE1hYyBhZGRyZXNzIG9mIGNvbm5lY3RlZCBkZXZpY2UuCi0gICAgIiIiCi0gICAgaW5pdGlhdG9yX2RldmljZS5sb2cuaW5mbygnVGVybWluYXRlIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24uJykKLSAgICBpbml0aWF0b3JfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoRGlzY29ubmVjdENvbm5lY3RlZChjb25uZWN0ZWRfbWFjX2FkZHIpCi0gICAgc2VsZi53YWl0X2Zvcl9uYXBfc2VydmljZV9jb25uZWN0aW9uKAotICAgICAgICBkZXZpY2U9aW5pdGlhdG9yX2RldmljZSwKLSAgICAgICAgY29ubmVjdGVkX21hY19hZGRyPWNvbm5lY3RlZF9tYWNfYWRkciwKLSAgICAgICAgc3RhdGVfY29ubmVjdGVkPUZhbHNlKQotCi0gIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCi0gIGRlZiBlc3RhYmxpc2hfbmFwX3NlcnZpY2VfY29ubmVjdGlvbihzZWxmLCBuYXBfZGV2aWNlLCBwYW51X2RldmljZSk6Ci0gICAgIiIiRXN0YWJsaXNoZXMgTkFQIHNlcnZpY2UgY29ubmVjdGlvbiBiZXR3ZWVuIGJvdGggQW5kcm9pZCBkZXZpY2VzLgotCi0gICAgVGhlIGNvbnRleHQgaXMgdXNlZCB0byBmb3JtIGEgYmFzaWMgbmV0d29yayBjb25uZWN0aW9uIGJldHdlZW4gZGV2aWNlcwotICAgIGJlZm9yZSBleGVjdXRpbmcgYSB0ZXN0LgotCi0gICAgU3RlcHM6Ci0gICAgICAxLiBEaXNhYmxlIE1vYmlsZSBkYXRhIHRvIGF2b2lkIGludGVybmV0IGFjY2VzcyBvbiBQQU5VIGRldmljZS4KLSAgICAgIDIuIE1ha2Ugc3VyZSBNb2JpbGUgZGF0YSBhdmFpbGFibGUgb24gTkFQIGRldmljZS4KLSAgICAgIDMuIEVuYWJsZSBCbHVldG9vdGggZnJvbSBQQU5VIGRldmljZS4KLSAgICAgIDQuIEVuYWJsZSBCbHVldG9vdGggdGV0aGVyaW5nIG9uIE5BUCBkZXZpY2UuCi0gICAgICA1LiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gZnJvbSBQQU5VIGRldmljZS4KLSAgICAgIDYuIENoZWNrIGlmIFBBTlUgZGV2aWNlIGhhcyBpbnRlcm5ldCBhY2Nlc3MgdmlhIHRoZSBjb25uZWN0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIG5hcF9kZXZpY2U6IEFuZHJvaWREZXZpY2UsIEEgZGV2aWNlIHNoYXJpbmcgaW50ZXJuZXQgY29ubmVjdGlvbiB2aWEKLSAgICAgICAgICBCbHVldG9vdGggdGV0aGVyaW5nLgotICAgICAgcGFudV9kZXZpY2U6IEFuZHJvaWREZXZpY2UsIEEgZGV2aWNlIGdhaW5pbmcgaW50ZXJuZXQgYWNjZXNzIHZpYQotICAgICAgICAgIEJsdWV0b290aCB0ZXRoZXJpbmcuCi0KLSAgICBZaWVsZHM6Ci0gICAgICBOb25lLCB0aGUgY29udGV4dCBqdXN0IGV4ZWN1dGUgYSBwcmUgcHJvY2VkdXJlIGZvciBQQU4gdGVzdGluZy4KLQotICAgIFJhaXNlczoKLSAgICAgIHNpZ25hbHMuVGVzdEVycm9yOiByYWlzZWQgaWYgYSBzdGVwIGZhaWxzLgotICAgICAgc2lnbmFscy5UZXN0RmFpbHVyZTogcmFpc2VkIGlmIFBBTlUgZGV2aWNlIGZhaWxzIHRvIGFjY2VzcyBpbnRlcm5ldC4KLSAgICAiIiIKLSAgICBuYXBfZGV2aWNlLmRlYnVnX3RhZyA9ICdOQVAnCi0gICAgcGFudV9kZXZpY2UuZGVidWdfdGFnID0gJ1BBTlUnCi0gICAgdHJ5OgotICAgICAgIyBEaXNhYmxlIE1vYmlsZSBkYXRhIHRvIGF2b2lkIGludGVybmV0IGFjY2VzcyBvbiBQQU5VIGRldmljZS4KLSAgICAgIHBhbnVfZGV2aWNlLmxvZy5pbmZvKCdEaXNhYmxpbmcgTW9iaWxlIGRhdGEuLi4nKQotICAgICAgcGFudV9kZXZpY2Uuc2w0YS5zZXRNb2JpbGVEYXRhRW5hYmxlZChGYWxzZSkKLSAgICAgIHNlbGYudmVyaWZ5X2ludGVybmV0KAotICAgICAgICAgIGFsbG93X2FjY2Vzcz1GYWxzZSwKLSAgICAgICAgICBkZXZpY2U9cGFudV9kZXZpY2UsCi0gICAgICAgICAgZXhjZXB0aW9uPXNpZ25hbHMuVGVzdEVycm9yKAotICAgICAgICAgICAgICAnUEFOVSBkZXZpY2UgIiVzIiBzdGlsbCBjb25uZWN0ZWQgdG8gaW50ZXJuZXQgd2hlbiBNb2JpbGUgZGF0YSAnCi0gICAgICAgICAgICAgICdoYWQgYmVlbiBkaXNhYmxlZC4nICUgcGFudV9kZXZpY2Uuc2VyaWFsKSkKLQotICAgICAgIyBNYWtlIHN1cmUgTkFQIGRldmljZSBoYXMgTW9iaWxlIGRhdGEgZm9yIGludGVybmV0IHNoYXJpbmcuCi0gICAgICBuYXBfZGV2aWNlLmxvZy5pbmZvKCdFbmFibGluZyBNb2JpbGUgZGF0YS4uLicpCi0gICAgICBuYXBfZGV2aWNlLnNsNGEuc2V0TW9iaWxlRGF0YUVuYWJsZWQoVHJ1ZSkKLSAgICAgIHNlbGYudmVyaWZ5X2ludGVybmV0KAotICAgICAgICAgIGFsbG93X2FjY2Vzcz1UcnVlLAotICAgICAgICAgIGRldmljZT1uYXBfZGV2aWNlLAotICAgICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAgICAgJ05BUCBkZXZpY2UgIiVzIiBkaWQgbm90IGhhdmUgaW50ZXJuZXQgYWNjZXNzIHdoZW4gTW9iaWxlIGRhdGEgJwotICAgICAgICAgICAgICAnaGFkIGJlZW4gZW5hYmxlZC4nICUgbmFwX2RldmljZS5zZXJpYWwpKQotCi0gICAgICAjIEVuYWJsZSBCbHVldG9vdGggdGV0aGVyaW5nIGZyb20gTkFQIGRldmljZS4KLSAgICAgIG5hcF9kZXZpY2Uuc2V0X2JsdWV0b290aF90ZXRoZXJpbmcoc3RhdHVzX2VuYWJsZWQ9VHJ1ZSkKLSAgICAgICMgV2FpdCB1bnRpbCBCbHVldG9vdGggdGV0aGVyaW5nIHN0YWJpbGl6ZXMuIFRoaXMgd2FpdGluZyB0aW1lIGF2b2lkcyBQQU5VCi0gICAgICAjIGRldmljZSBpbml0aWF0ZXMgYSBjb25uZWN0aW9uIHRvIE5BUCBkZXZpY2UgaW1tZWRpYXRlbHkgd2hlbiBOQVAgZGV2aWNlCi0gICAgICAjIGVuYWJsZXMgQmx1ZXRvb3RoIHRldGhlcmluZy4KLSAgICAgIHRpbWUuc2xlZXAoNSkKLQotICAgICAgbmFwX2RldmljZS5hY3RpdmF0ZV9wYWlyaW5nX21vZGUoKQotICAgICAgcGFudV9kZXZpY2UubG9nLmluZm8oJ1BhaXIgdG8gTkFQIGRldmljZSAiJXMiLicgJSBuYXBfZGV2aWNlLnNlcmlhbCkKLSAgICAgIHBhbnVfZGV2aWNlLnBhaXJfYW5kX2Nvbm5lY3RfYmx1ZXRvb3RoKG5hcF9kZXZpY2UubWFjX2FkZHJlc3MpCi0KLSAgICAgICMgSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIE5BUCBkZXZpY2UuCi0gICAgICBwYW51X2RldmljZS5sb2cuaW5mbygnSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIE5BUCBkZXZpY2UgIiVzIi4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hcF9kZXZpY2Uuc2VyaWFsKQotICAgICAgc2VsZi5pbml0aWF0ZV9uYXBfc2VydmljZV9jb25uZWN0aW9uKAotICAgICAgICAgIGluaXRpYXRvcl9kZXZpY2U9cGFudV9kZXZpY2UsCi0gICAgICAgICAgY29ubmVjdGVkX21hY19hZGRyPW5hcF9kZXZpY2UubWFjX2FkZHJlc3MpCi0KLSAgICAgICMgQ2hlY2sgaWYgUEFOVSBkZXZpY2UgY2FuIGFjY2VzcyBpbnRlcm5ldCB2aWEgTkFQIHNlcnZpY2UgY29ubmVjdGlvbi4KLSAgICAgIHNlbGYudmVyaWZ5X2ludGVybmV0KAotICAgICAgICAgIGFsbG93X2FjY2Vzcz1UcnVlLAotICAgICAgICAgIGRldmljZT1wYW51X2RldmljZSwKLSAgICAgICAgICBleGNlcHRpb249c2lnbmFscy5UZXN0RmFpbHVyZSgKLSAgICAgICAgICAgICAgJ1BBTlUgZGV2aWNlICIlcyIgZmFpbGVkIHRvIGFjY2VzcyBpbnRlcm5ldCB2aWEgTkFQIHNlcnZpY2UgJwotICAgICAgICAgICAgICAnY29ubmVjdGlvbi4nICUgcGFudV9kZXZpY2Uuc2VyaWFsKSkKLSAgICAgIHlpZWxkCi0gICAgZmluYWxseToKLSAgICAgICMgRGlzYWJsZSBCbHVldG9vdGggdGV0aGVyaW5nIGZyb20gTkFQIGRldmljZS4KLSAgICAgIG5hcF9kZXZpY2Uuc2V0X2JsdWV0b290aF90ZXRoZXJpbmcoc3RhdHVzX2VuYWJsZWQ9RmFsc2UpCi0gICAgICBwYW51X2RldmljZS5zbDRhLnNldE1vYmlsZURhdGFFbmFibGVkKFRydWUpCi0KLSAgZGVmIHZlcmlmeV9pbnRlcm5ldChzZWxmLCBhbGxvd19hY2Nlc3MsIGRldmljZSwgZXhjZXB0aW9uKToKLSAgICAiIiJWZXJpZmllcyB0aGF0IGludGVybmV0IGlzIGluIGV4cGVjdGVkIHN0YXRlLgotCi0gICAgQ29udGludW91c2x5IG1ha2UgcGluZyByZXF1ZXN0IHRvIGEgVVJMIGZvciBpbnRlcm5ldCB2ZXJpZmljYXRpb24uCi0KLSAgICBBcmdzOgotICAgICAgYWxsb3dfYWNjZXNzOiBCb29sLCBEZXZpY2UgY2FuIGhhdmUgaW50ZXJuZXQgYWNjZXNzIGFzIGV4cGVjdGVkIGlmIFRydWUsCi0gICAgICAgICAgZWxzZSBubyBpbnRlcm5ldCBhY2Nlc3MgYXMgZXhwZWN0ZWQuCi0gICAgICBkZXZpY2U6IEFuZHJvaWREZXZpY2UsIERldmljZSB0byBiZSBjaGVjayBpbnRlcm5ldCBzdGF0ZS4KLSAgICAgIGV4Y2VwdGlvbjogRXhjZXB0aW9uLCBSYWlzZWQgaWYgaW50ZXJuZXQgaXMgbm90IGluIGV4cGVjdGVkIHN0YXRlLgotICAgICIiIgotICAgIGRldmljZS5sb2cuaW5mbygnVmVyaWZ5IHRoYXQgaW50ZXJuZXQgJXMgYmUgdXNlZC4nICUKLSAgICAgICAgICAgICAgICAgICAgKCdjYW4nIGlmIGFsbG93X2FjY2VzcyBlbHNlICdjYW4gbm90JykpCi0KLSAgICBkZWYgaHR0cF9waW5nKCk6Ci0gICAgICAiIiJSZXR1cm5zIFRydWUgaWYgaHR0cCBwaW5nIHN1Y2Nlc3MgZWxzZSBGYWxzZS4iIiIKLSAgICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGJvb2woZGV2aWNlLnNsNGEuaHR0cFBpbmcoVEVTVF9VUkwpKQotICAgICAgZXhjZXB0IGpzb25ycGNfY2xpZW50X2Jhc2UuQXBpRXJyb3IgYXMgZToKLSAgICAgICAgIyBBcGlFcnJvciBpcyByYWlzZWQgYnkgaHR0cFBpbmcoKSB3aGVuIG5vIGludGVybmV0LgotICAgICAgICBkZXZpY2UubG9nLmRlYnVnKHN0cihlKSkKLSAgICAgIHJldHVybiBGYWxzZQotCi0gICAgYnRfdGVzdF91dGlscy53YWl0X3VudGlsKAotICAgICAgICB0aW1lb3V0X3NlYz1QSU5HX1RJTUVPVVRfU0VDLAotICAgICAgICBjb25kaXRpb25fZnVuYz1odHRwX3BpbmcsCi0gICAgICAgIGZ1bmNfYXJncz1bXSwKLSAgICAgICAgZXhwZWN0ZWRfdmFsdWU9YWxsb3dfYWNjZXNzLAotICAgICAgICBleGNlcHRpb249ZXhjZXB0aW9uLAotICAgICAgICBpbnRlcnZhbF9zZWM9UElOR19JTlRFUlZBTF9USU1FX1NFQykKLQotICBkZWYgdGVzdF9nYWluX2ludGVybmV0X2FuZF90ZXJtaW5hdGVfbmFwX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IERVVCBjYW4gYWNjZXNzIGludGVybmV0IGFuZCB0ZXJtaW5hdGUgTkFQIHNlcnZpY2UgY29ubmVjdGlvbi4KLQotICAgIEluIHRoaXMgdGVzdCBjYXNlLCBwcmltYXJ5IGRldmljZSBpcyBQQU5VIGFuZCBzZWNvbmRhcnkgZGV2aWNlIGlzIE5BUC4gV2hpbGUKLSAgICBhIGNvbm5lY3Rpb24gaGFzIGVzdGFibGlzaGVkIGJldHdlZW4gYm90aCBkZXZpY2VzLCBQQU5VIHNob3VsZCBiZSBhYmxlIHRvCi0gICAgdXNlIGludGVybmV0IGFuZCB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gdG8gZGlzYWJsZSBpbnRlcm5ldCBhY2Nlc3MuCi0KLSAgICBTdGVwczoKLSAgICAgIDEuIEVzdGFibGlzaCBOQVAgc2VydmljZSBjb25uZWN0aW9uIGJldHdlZW4gYm90aCBkZXZpY2VzLgotICAgICAgMi4gVGVybWluYWwgdGhlIGNvbm5lY3Rpb24gZnJvbSBQQU5VIGRldmljZS4KLSAgICAgIDMuIFZlcmlmeSB0aGF0IFBBTlUgZGV2aWNlIGNhbm5vdCBhY2Nlc3MgaW50ZXJuZXQuCi0gICAgIiIiCi0gICAgd2l0aCBzZWxmLmVzdGFibGlzaF9uYXBfc2VydmljZV9jb25uZWN0aW9uKAotICAgICAgICBuYXBfZGV2aWNlPXNlbGYuc2Vjb25kYXJ5X2RldmljZSwKLSAgICAgICAgcGFudV9kZXZpY2U9c2VsZi5wcmltYXJ5X2RldmljZSk6Ci0KLSAgICAgICMgVGVybWluYXRlIHRoZSBjb25uZWN0aW9uIGZyb20gRFVULgotICAgICAgc2VsZi50ZXJtaW5hdGVfbmFwX3NlcnZpY2VfY29ubmVjdGlvbigKLSAgICAgICAgICBpbml0aWF0b3JfZGV2aWNlPXNlbGYucHJpbWFyeV9kZXZpY2UsCi0gICAgICAgICAgY29ubmVjdGVkX21hY19hZGRyPXNlbGYuc2Vjb25kYXJ5X2RldmljZS5tYWNfYWRkcmVzcykKLQotICAgICAgIyBWZXJpZnkgdGhhdCBQQU5VIGRldmljZSBjYW5ub3QgYWNjZXNzIGludGVybmV0LgotICAgICAgc2VsZi52ZXJpZnlfaW50ZXJuZXQoCi0gICAgICAgICAgYWxsb3dfYWNjZXNzPUZhbHNlLAotICAgICAgICAgIGRldmljZT1zZWxmLnByaW1hcnlfZGV2aWNlLAotICAgICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RGYWlsdXJlKAotICAgICAgICAgICAgICAnUEFOVSBkZXZpY2UgIiVzIiBjYW4gc3RpbGwgYWNjZXNzIGludGVybmV0IHdoZW4gaXQgaGFkICcKLSAgICAgICAgICAgICAgJ3Rlcm1pbmF0ZWQgTkFQIHNlcnZpY2UgY29ubmVjdGlvbi4nICUKLSAgICAgICAgICAgICAgc2VsZi5wcmltYXJ5X2RldmljZS5zZXJpYWwpKQotCi0gIGRlZiB0ZXN0X3NoYXJlX2ludGVybmV0X2FuZF9kaXNhYmxlX2JsdWV0b290aF90ZXRoZXJpbmcoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IERVVCBjYW4gc2hhcmUgaW50ZXJuZXQgYW5kIHN0b3AgaW50ZXJuZXQgc2hhcmluZy4KLQotICAgIEluIHRoaXMgdGVzdCBjYXNlLCBwcmltYXJ5IGRldmljZSBpcyBOQVAgYW5kIHNlY29uZGFyeSBkZXZpY2UgaXMgUEFOVS4gV2hpbGUKLSAgICBhIGNvbm5lY3Rpb24gaGFzIGVzdGFibGlzaGVkIGJldHdlZW4gYm90aCBkZXZpY2VzLCBOQVAgc2hvdWxkIGJlIGFibGUgdG8KLSAgICBzaGFyZSBpbnRlcm5ldCBhbmQgZGlzYWJsZSBCbHVldG9vdGggdGhldGhlcmluZyB0byBzdG9wIGludGVybmV0IHNoYXJpbmcuCi0KLSAgICBTdGVwczoKLSAgICAgIDEuIEVzdGFibGlzaCBOQVAgc2VydmljZSBjb25uZWN0aW9uIGJldHdlZW4gYm90aCBkZXZpY2VzLgotICAgICAgMy4gRGlzYWJsZSBCbHVldG9vdGggdGV0aGVyaW5nIGZyb20gTkFQIGRldmljZS4KLSAgICAgIDQuIFZlcmlmeSB0aGF0IFBBTlUgZGV2aWNlIGNhbm5vdCBhY2Nlc3MgaW50ZXJuZXQuCi0gICAgIiIiCi0gICAgd2l0aCBzZWxmLmVzdGFibGlzaF9uYXBfc2VydmljZV9jb25uZWN0aW9uKAotICAgICAgICBuYXBfZGV2aWNlPXNlbGYucHJpbWFyeV9kZXZpY2UsCi0gICAgICAgIHBhbnVfZGV2aWNlPXNlbGYuc2Vjb25kYXJ5X2RldmljZSk6Ci0KLSAgICAgICMgRGlzYWJsZSBCbHVldG9vdGggdGV0aGVyaW5nIGZyb20gRFVUIGFuZCBjaGVjayBpZiB0aGUgbmFwIGNvbm5lY3Rpb24gaXMKLSAgICAgICMgdGVybWluYXRlZC4KLSAgICAgIHNlbGYucHJpbWFyeV9kZXZpY2Uuc2V0X2JsdWV0b290aF90ZXRoZXJpbmcoc3RhdHVzX2VuYWJsZWQ9RmFsc2UpCi0gICAgICBzZWxmLndhaXRfZm9yX25hcF9zZXJ2aWNlX2Nvbm5lY3Rpb24oCi0gICAgICAgICAgZGV2aWNlPXNlbGYucHJpbWFyeV9kZXZpY2UsCi0gICAgICAgICAgY29ubmVjdGVkX21hY19hZGRyPXNlbGYuc2Vjb25kYXJ5X2RldmljZS5tYWNfYWRkcmVzcywKLSAgICAgICAgICBzdGF0ZV9jb25uZWN0ZWQ9RmFsc2UpCi0KLSAgICAgICMgVmVyaWZ5IHRoYXQgUEFOVSBkZXZpY2UgY2Fubm90IGFjY2VzcyBpbnRlcm5ldC4KLSAgICAgIHNlbGYudmVyaWZ5X2ludGVybmV0KAotICAgICAgICAgIGFsbG93X2FjY2Vzcz1GYWxzZSwKLSAgICAgICAgICBkZXZpY2U9c2VsZi5zZWNvbmRhcnlfZGV2aWNlLAotICAgICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RGYWlsdXJlKAotICAgICAgICAgICAgICAnUEFOVSBkZXZpY2UgIiVzIiBjYW4gc3RpbGwgYWNjZXNzIGludGVybmV0IHdoZW4gaXQgaGFkICcKLSAgICAgICAgICAgICAgJ3Rlcm1pbmF0ZWQgTkFQIHNlcnZpY2UgY29ubmVjdGlvbi4nICUKLSAgICAgICAgICAgICAgc2VsZi5zZWNvbmRhcnlfZGV2aWNlLnNlcmlhbCkpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvcGJhcC9ibHVldG9vdGhfcGJhcF90ZXN0LnB5IGIvYmx1ZWJlcnJ5L3Rlc3RzL3BiYXAvYmx1ZXRvb3RoX3BiYXBfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3YzAzMi4uMDAwMDAwMAotLS0gYS9ibHVlYmVycnkvdGVzdHMvcGJhcC9ibHVldG9vdGhfcGJhcF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLSIiIlRlc3RzIGZvciBibHVlYmVycnkucGJhcC5ibHVldG9vdGhfcGJhcC4iIiIKLQotaW1wb3J0IG9zCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgdGltZQotCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzCi1mcm9tIG1vYmx5IGltcG9ydCB0ZXN0X3J1bm5lcgotZnJvbSBtb2JseSBpbXBvcnQgc2lnbmFscwotZnJvbSBtb2JseSBpbXBvcnQgdXRpbHMKLQotZnJvbSBtb2JseS5jb250cm9sbGVycyBpbXBvcnQgYW5kcm9pZF9kZXZpY2UKLQotZnJvbSBibHVlYmVycnkudXRpbHMgaW1wb3J0IGJsdWViZXJyeV9iYXNlX3Rlc3QKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF9jb25zdGFudHMKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF90ZXN0X3V0aWxzCi0KLSMgVGhlIHBhdGggaXMgdXNlZCB0byBwbGFjZSB0aGUgY3JlYXRlZCB2Y2YgZmlsZXMuCi1TVE9SQUdFX1BBVEggPSAnL3N0b3JhZ2UvZW11bGF0ZWQvMCcKLQotIyBVUkkgZm9yIGNvbnRhY3RzIGRhdGFiYXNlLgotQ09OVEFDVFNfVVJJID0gJ2NvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9kYXRhL3Bob25lcycKLQotIyBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBjb250YWN0cyBhbmQgY2FsbCBsb2dzIHVwZGF0ZS4KLVdBSVRJTkdfVElNRU9VVF9TRUMgPSA2MAotCi0jIE51bWJlciBvZiBjb250YWN0cyBhbmQgY2FsbCBsb2dzIHRvIGJlIHRlc3RlZC4KLVRFU1RfREFUQV9DT1VOVCA9IDEwMDAKLQotIyBQZXJtaXNzaW9ucyBmb3IgQ29udGFjdHMgYXBwLgotUEVSTUlTU0lPTl9MSVNUID0gWwotICAgICdhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DT05UQUNUUycsCi0gICAgJ2FuZHJvaWQucGVybWlzc2lvbi5XUklURV9DT05UQUNUUycsCi1dCi0KLQotY2xhc3MgQmx1ZXRvb3RoUGJhcFRlc3QoYmx1ZWJlcnJ5X2Jhc2VfdGVzdC5CbHVlYmVycnlCYXNlVGVzdCk6Ci0gICIiIlRlc3QgQ2xhc3MgZm9yIEJsdWV0b290aCBQQkFQIFRlc3QuIiIiCi0KLSAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICIiIlN0YW5kYXJkIE1vYmx5IHNldHVwIGNsYXNzLiIiIgotICAgIHN1cGVyKEJsdWV0b290aFBiYXBUZXN0LCBzZWxmKS5zZXR1cF9jbGFzcygpCi0KLSAgICAjIEJsdWV0b290aCBjYXJraXQgd2hpY2ggcm9sZSBpcyBQaG9uZSBCb29rIENsaWVudCBFcXVpcG1lbnQgKFBDRSkuCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZSA9IHNlbGYuZGVyaXZlZF9idF9kZXZpY2VzWzBdCi0KLSAgICAjIFByaW1hcnkgcGhvbmUgd2hpY2ggcm9sZSBpcyBQaG9uZSBCb29rIFNlcnZlciBFcXVpcG1lbnQgKFBTRSkuCi0gICAgc2VsZi5wcmlfcGhvbmUgPSBzZWxmLmFuZHJvaWRfZGV2aWNlc1swXQotICAgIHNlbGYucHJpX3Bob25lLmluaXRfc2V0dXAoKQotICAgIHNlbGYucHJpX3Bob25lLnNsNGFfc2V0dXAoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYWRkX3NlY19hZF9kZXZpY2Uoc2VsZi5wcmlfcGhvbmUpCi0KLSAgICAjIEdyYW50IHRoZSBwZXJtaXNzaW9ucyB0byBDb250YWN0cyBhcHAuCi0gICAgZm9yIGRldmljZSBpbiBbc2VsZi5wcmlfcGhvbmUsIHNlbGYuZGVyaXZlZF9idF9kZXZpY2VdOgotICAgICAgcmVxdWlyZWRfcGVybWlzc2lvbnMgPSBQRVJNSVNTSU9OX0xJU1QKLSAgICAgICMgQXBwIHJlcXVpcmVzIFJFQURfRVhURVJOQUxfU1RPUkFHRSB0byByZWFkIGNvbnRhY3RzIGlmIFNESyA8IDMwLgotICAgICAgaWYgaW50KGRldmljZS5idWlsZF9pbmZvWydidWlsZF92ZXJzaW9uX3NkayddKSA8IDMwOgotICAgICAgICByZXF1aXJlZF9wZXJtaXNzaW9ucy5hcHBlbmQoJ2FuZHJvaWQucGVybWlzc2lvbi5SRUFEX0VYVEVSTkFMX1NUT1JBR0UnKQotICAgICAgZm9yIHBlcm1pc3Npb24gaW4gcmVxdWlyZWRfcGVybWlzc2lvbnM6Ci0gICAgICAgIGRldmljZS5hZGIuc2hlbGwoJ3BtIGdyYW50IGNvbS5nb29nbGUuYW5kcm9pZC5jb250YWN0cyAlcycgJSBwZXJtaXNzaW9uKQotICAgIHNlbGYucHNlX21hY19hZGRyZXNzID0gc2VsZi5wcmlfcGhvbmUuZ2V0X2JsdWV0b290aF9tYWNfYWRkcmVzcygpCi0gICAgbWFjX2FkZHJlc3MgPSBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmdldF9ibHVldG9vdGhfbWFjX2FkZHJlc3MoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYWN0aXZhdGVfcGFpcmluZ19tb2RlKCkKLSAgICBzZWxmLnByaV9waG9uZS5wYWlyX2FuZF9jb25uZWN0X2JsdWV0b290aChtYWNfYWRkcmVzcykKLSAgICAjIFNsZWVwIHVudGlsIHRoZSBjb25uZWN0aW9uIHN0YWJpbGl6ZXMuCi0gICAgdGltZS5zbGVlcCg1KQotCi0gICAgIyBBbGxvdyBwZXJtaXNzaW9uIGFjY2VzcyBmb3IgUEJBUCBwcm9maWxlLgotICAgIHNlbGYucHJpX3Bob25lLnNsNGEuYmx1ZXRvb3RoQ2hhbmdlUHJvZmlsZUFjY2Vzc1Blcm1pc3Npb24oCi0gICAgICAgIG1hY19hZGRyZXNzLAotICAgICAgICBidF9jb25zdGFudHMuQmx1ZXRvb3RoUHJvZmlsZS5QQkFQLnZhbHVlLAotICAgICAgICBidF9jb25zdGFudHMuQmx1ZXRvb3RoQWNjZXNzTGV2ZWwuQUNDRVNTX0FMTE9XRUQudmFsdWUpCi0KLSAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgc3VwZXIoQmx1ZXRvb3RoUGJhcFRlc3QsIHNlbGYpLnNldHVwX3Rlc3QoKQotICAgICMgTWFrZSBzdXJlIFBCQVAgaXMgbm90IGNvbm5lY3RlZCBiZWZvcmUgcnVubmluZyB0ZXN0cy4KLSAgICBzZWxmLl90ZXJtaW5hdGVfcGJhcF9jb25uZWN0aW9uKCkKLQotICBkZWYgX2ltcG9ydF92Y2ZfdG9fcHNlKHNlbGYsIGZpbGVfbmFtZSwgZXhwZWN0ZWRfY29udGFjdF9jb3VudCk6Ci0gICAgIiIiSW1wb3J0cyB0aGUgdmNmIGZpbGUgdG8gUFNFLiIiIgotICAgICMgT3BlbiBJbXBvcnRWY2FyZEFjdGl2aXR5IGFuZCBjbGljayAiT0siIGluIHRoZSBwb3AtdXAgZGlhbG9nLCB0aGVuCi0gICAgIyBQaWNrQWN0aXZpdHkgd2lsbCBiZSBsYXVuY2hlZCBhbmQgYnJvd3NlcyB0aGUgZXhpc3RpbmcgdmNmIGZpbGVzLgotICAgIHNlbGYucHJpX3Bob25lLmFkYi5zaGVsbCgKLSAgICAgICAgJ2FtIHN0YXJ0IGNvbS5nb29nbGUuYW5kcm9pZC5jb250YWN0cy8nCi0gICAgICAgICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jb250YWN0cy52Y2FyZC5JbXBvcnRWQ2FyZEFjdGl2aXR5JykKLSAgICBzZWxmLnByaV9waG9uZS5hdWQodGV4dD0nT0snKS5jbGljaygpCi0KLSAgICAjIENoZWNrIGlmIHRoZSB2Y2YgZmlsZSBhcHBlYXJzIGluIHRoZSBQaWNrQWN0aXZpdHkuCi0gICAgaWYgbm90IHNlbGYucHJpX3Bob25lLmF1ZCh0ZXh0PWZpbGVfbmFtZSkuZXhpc3RzKCk6Ci0gICAgICByYWlzZSBhbmRyb2lkX2RldmljZS5EZXZpY2VFcnJvcigKLSAgICAgICAgICBzZWxmLnByaV9waG9uZSwKLSAgICAgICAgICAnTm8gZmlsZSBuYW1lIG1hdGNoZXMgIiVzIiBpbiBQaWNrQWN0aXZpdHkuJyAlIGZpbGVfbmFtZSkKLQotICAgICMgVE9ETyh1c2VyKTogUmVtb3ZlIHRoZSBjaGVjayBvZiBjb2RlIG5hbWUgZm9yIFMgYnVpbGQuCi0gICAgaWYgKHNlbGYucHJpX3Bob25lLmJ1aWxkX2luZm9bJ2J1aWxkX3ZlcnNpb25fY29kZW5hbWUnXSAhPSAnUycgYW5kCi0gICAgICAgIGludChzZWxmLnByaV9waG9uZS5idWlsZF9pbmZvWydidWlsZF92ZXJzaW9uX3NkayddKSA8PSAzMCk6Ci0gICAgICAjIFNpbmNlIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBjYW5ub3Qgd29yayBpbiBQaWNrQWN0aXZpdHkgYmVmb3JlIFIgYnVpbGQsCi0gICAgICAjIHNlbmQgVEFCIGFuZCBFTkVURVIgS2V5IGV2ZW50cyB0byBzZWxlY3QgYW5kIGltcG9ydCB0aGUgdmNmIGZpbGUuCi0gICAgICBpZiBzZWxmLnByaV9waG9uZS5hdWQoY29udGVudF9kZXNjPSdHcmlkIHZpZXcnKS5leGlzdHMoKToKLSAgICAgICAgIyBTd2l0Y2ggR3JpZCBtb2RlIHNpbmNlIEVOVEVSIEtleSBldmVudCBjYW5ub3Qgd29yayBpbiBMaXN0IG1vZGUgb24KLSAgICAgICAgIyBnaXRfcnZjLWQyLXJlbGVhc2UgYnJhbmNoLgotICAgICAgICBzZWxmLnByaV9waG9uZS5hdWQoY29udGVudF9kZXNjPSdHcmlkIHZpZXcnKS5jbGljaygpCi0gICAgICBzZWxmLnByaV9waG9uZS5hdWQuc2VuZF9rZXlfY29kZSgnS0VZQ09ERV9UQUInKQotICAgICAgc2VsZi5wcmlfcGhvbmUuYXVkLnNlbmRfa2V5X2NvZGUoJ0tFWUNPREVfRU5URVInKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnByaV9waG9uZS5hdWQodGV4dD1maWxlX25hbWUpLmNsaWNrKCkKLSAgICBzZWxmLnByaV9waG9uZS5sb2cuaW5mbygnSW1wb3J0aW5nICIlcyIuLi4nICUgZmlsZV9uYW1lKQotICAgIGN1cnJlbnRfY291bnQgPSBzZWxmLl93YWl0X2FuZF9nZXRfY29udGFjdF9jb3VudCgKLSAgICAgICAgc2VsZi5wcmlfcGhvbmUsIGV4cGVjdGVkX2NvbnRhY3RfY291bnQsIFdBSVRJTkdfVElNRU9VVF9TRUMpCi0gICAgaWYgY3VycmVudF9jb3VudCAhPSBleHBlY3RlZF9jb250YWN0X2NvdW50OgotICAgICAgcmFpc2UgYW5kcm9pZF9kZXZpY2UuRGV2aWNlRXJyb3IoCi0gICAgICAgICAgc2VsZi5wcmlfcGhvbmUsCi0gICAgICAgICAgJ0ZhaWxlZCB0byBpbXBvcnQgJWQgY29udGFjdChzKSB3aXRoaW4gJWRzLiBBY3R1YWwgY291bnQ6ICVkJyAlCi0gICAgICAgICAgKGV4cGVjdGVkX2NvbnRhY3RfY291bnQsIFdBSVRJTkdfVElNRU9VVF9TRUMsIGN1cnJlbnRfY291bnQpKQotICAgIHNlbGYucHJpX3Bob25lLmxvZy5pbmZvKAotICAgICAgICAnU3VjY2Vzc2Z1bGx5IGFkZGVkICVkIGNvbnRhY3QocykuJyAlIGN1cnJlbnRfY291bnQpCi0KLSAgZGVmIF9nZW5lcmF0ZV9jb250YWN0c19vbl9wc2Uoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29mX2NvbnRhY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbmFtZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZV9udW1iZXI9Tm9uZSk6Ci0gICAgIiIiR2VuZXJhdGVzIGNvbnRhY3RzIHRvIGJlIHRlc3RlZCBvbiBQU0UuIiIiCi0gICAgdmNmX2ZpbGUgPSBidF90ZXN0X3V0aWxzLmNyZWF0ZV92Y2ZfZnJvbV92Y2FyZCgKLSAgICAgICAgb3V0cHV0X3BhdGg9c2VsZi5wcmlfcGhvbmUubG9nX3BhdGgsCi0gICAgICAgIG51bV9vZl9jb250YWN0cz1udW1fb2ZfY29udGFjdHMsCi0gICAgICAgIGZpcnN0X25hbWU9Zmlyc3RfbmFtZSwKLSAgICAgICAgbGFzdF9uYW1lPWxhc3RfbmFtZSwKLSAgICAgICAgcGhvbmVfbnVtYmVyPXBob25lX251bWJlcikKLSAgICBzZWxmLnByaV9waG9uZS5hZGIucHVzaChbdmNmX2ZpbGUsIFNUT1JBR0VfUEFUSF0pCi0gICAgIyBGb3IgUiBidWlsZCwgc2luY2UgdGhlIHB1c2hlZCB2Y2YgZmlsZSBwcm9iYWJseSBub3QgZm91bmQgd2hlbiBpbXBvcnRpbmcKLSAgICAjIGNvbnRhY3RzLCBkbyBhIG1lZGlhIHNjYW4gdG8gcmVjb2duaXplIHRoZSBmaWxlLgotICAgIGlmIGludChzZWxmLnByaV9waG9uZS5idWlsZF9pbmZvWydidWlsZF92ZXJzaW9uX3NkayddKSA+IDI5OgotICAgICAgc2VsZi5wcmlfcGhvbmUuYWRiLnNoZWxsKCdjb250ZW50IGNhbGwgLS11cmkgY29udGVudDovL21lZGlhLyAtLW1ldGhvZCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjYW5fdm9sdW1lIC0tYXJnIGV4dGVybmFsX3ByaW1hcnknKQotICAgIGZpbGVfbmFtZSA9IHZjZl9maWxlLnNwbGl0KCcvJylbLTFdCi0gICAgc2VsZi5faW1wb3J0X3ZjZl90b19wc2UoZmlsZV9uYW1lLCBudW1fb2ZfY29udGFjdHMpCi0gICAgc2VsZi5wcmlfcGhvbmUuYWRiLnNoZWxsKAotICAgICAgICAncm0gLXJmICVzJyAlIG9zLnBhdGguam9pbihTVE9SQUdFX1BBVEgsIGZpbGVfbmFtZSkpCi0KLSAgZGVmIF9nZW5lcmF0ZV9jYWxsX2xvZ3Nfb25fcHNlKHNlbGYsIGNhbGxfbG9nX3R5cGUsIG51bV9vZl9jYWxsX2xvZ3MpOgotICAgICIiIkdlbmVyYXRlcyBjYWxsIGxvZ3MgdG8gYmUgdGVzdGVkIG9uIFBTRS4iIiIKLSAgICBzZWxmLnByaV9waG9uZS5sb2cuaW5mbygnUHV0dGluZyAlZCBjYWxsIGxvZyhzKSB3aGljaCB0eXBlIGFyZSAiJXMiLi4uJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9vZl9jYWxsX2xvZ3MsIGNhbGxfbG9nX3R5cGUpKQotICAgIGZvciBfIGluIHJhbmdlKG51bV9vZl9jYWxsX2xvZ3MpOgotICAgICAgc2VsZi5wcmlfcGhvbmUuc2w0YS5jYWxsTG9nc1B1dChkaWN0KAotICAgICAgICAgIHR5cGU9Y2FsbF9sb2dfdHlwZSwKLSAgICAgICAgICBudW1iZXI9Jzg4MDklZCcgJSByYW5kb20ucmFuZHJhbmdlKGludCgxMGU4KSksCi0gICAgICAgICAgdGltZT1pbnQoMTAwMCAqIGZsb2F0KHNlbGYucHJpX3Bob25lLmFkYi5zaGVsbCgnZGF0ZSArJXMuJU4nKSkpKSkKLSAgICBjdXJyZW50X2NvdW50ID0gc2VsZi5fd2FpdF9hbmRfZ2V0X2NhbGxfbG9nX2NvdW50KAotICAgICAgICBzZWxmLnByaV9waG9uZSwKLSAgICAgICAgY2FsbF9sb2dfdHlwZSwKLSAgICAgICAgbnVtX29mX2NhbGxfbG9ncywKLSAgICAgICAgV0FJVElOR19USU1FT1VUX1NFQykKLSAgICBpZiBjdXJyZW50X2NvdW50ICE9IG51bV9vZl9jYWxsX2xvZ3M6Ci0gICAgICByYWlzZSBhbmRyb2lkX2RldmljZS5EZXZpY2VFcnJvcigKLSAgICAgICAgICBzZWxmLnByaV9waG9uZSwKLSAgICAgICAgICAnRmFpbGVkIHRvIGdlbmVyYXRlICVkIGNhbGwgbG9nKHMpIHdpdGhpbiAlZHMuICcKLSAgICAgICAgICAnQWN0dWFsIGNvdW50OiAlZCwgQ2FsbCBsb2cgdHlwZTogJXMnICUKLSAgICAgICAgICAobnVtX29mX2NhbGxfbG9ncywgV0FJVElOR19USU1FT1VUX1NFQywgY3VycmVudF9jb3VudCwgY2FsbF9sb2dfdHlwZSkpCi0gICAgc2VsZi5wcmlfcGhvbmUubG9nLmluZm8oCi0gICAgICAgICdTdWNjZXNzZnVsbHkgYWRkZWQgJWQgY2FsbCBsb2cocykuJyAlIGN1cnJlbnRfY291bnQpCi0KLSAgZGVmIF93YWl0X2FuZF9nZXRfY29udGFjdF9jb3VudChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9jb250YWN0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfc2VjKToKLSAgICAiIiJXYWl0cyBmb3IgY29udGFjdCB1cGRhdGUgZm9yIGEgcGVyaW9kIHRpbWUgYW5kIHJldHVybnMgY29udGFjdCBjb3VudC4KLQotICAgIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW4gYSBkZXZpY2UgaW1wb3J0cyBzb21lIG5ldyBjb250YWN0cy4gSXQgY2FuCi0gICAgd2FpdCBzb21lIHRpbWUgZm9yIGNvbnRhY3QgdXBkYXRlIHVudGlsIGV4cGVjdGF0aW9uIG9yIHRpbWVvdXQgYW5kIHRoZW4KLSAgICByZXR1cm4gY29udGFjdCBjb3VudC4KLQotICAgIEFyZ3M6Ci0gICAgICBkZXZpY2U6IEFuZHJvaWREZXZpY2UsIE1vYmx5IEFuZHJvaWQgY29udHJvbGxlciBjbGFzcy4KLSAgICAgIGV4cGVjdGVkX2NvbnRhY3RfY291bnQ6IEludCwgTnVtYmVyIG9mIGNvbnRhY3RzIGFzIGV4cGVjdGVkLgotICAgICAgdGltZW91dF9zZWM6IEludCwgTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgY29udGFjdCB1cGRhdGUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgY3VycmVudF9jb3VudDogSW50LCBudW1iZXIgb2YgdGhlIGV4aXN0aW5nIGNvbnRhY3RzIG9uIHRoZSBkZXZpY2UuCi0gICAgIiIiCi0gICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgdGltZW91dF9zZWMKLSAgICBjdXJyZW50X2NvdW50ID0gMAotICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZW5kX3RpbWU6Ci0gICAgICBjdXJyZW50X2NvdW50ID0gZGV2aWNlLnNsNGEuY29udGFjdHNHZXRDb3VudCgpCi0gICAgICBpZiBjdXJyZW50X2NvdW50ID09IGV4cGVjdGVkX2NvbnRhY3RfY291bnQ6Ci0gICAgICAgIGJyZWFrCi0gICAgICAjIEludGVydmFsIGJldHdlZW4gYXR0ZW1wdHMgdG8gZ2V0IGNvbnRhY3RzLgotICAgICAgdGltZS5zbGVlcCgxKQotICAgIGlmIGN1cnJlbnRfY291bnQgIT0gZXhwZWN0ZWRfY29udGFjdF9jb3VudDoKLSAgICAgIGRldmljZS5sb2cud2FybmluZygKLSAgICAgICAgICAnRmFpbGVkIHRvIGdldCBleHBlY3RlZCBjb250YWN0IGNvdW50OiAlZC4gJwotICAgICAgICAgICdBY3R1YWwgY29udGFjdCBjb3VudDogJWQuJyAlCi0gICAgICAgICAgKGV4cGVjdGVkX2NvbnRhY3RfY291bnQsIGN1cnJlbnRfY291bnQpKQotICAgIHJldHVybiBjdXJyZW50X2NvdW50Ci0KLSAgZGVmIF93YWl0X2FuZF9nZXRfY2FsbF9sb2dfY291bnQoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX2xvZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9jYWxsX2xvZ19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9zZWMpOgotICAgICIiIldhaXRzIGZvciBjYWxsIGxvZyB1cGRhdGUgZm9yIGEgcGVyaW9kIHRpbWUgYW5kIHJldHVybnMgY2FsbCBsb2cgY291bnQuCi0KLSAgICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIGEgZGV2aWNlIGFkZHMgc29tZSBuZXcgY2FsbCBsb2dzLiBJdCBjYW4KLSAgICB3YWl0IHNvbWUgdGltZSBmb3IgY2FsbCBsb2cgdXBkYXRlIHVudGlsIGV4cGVjdGF0aW9uIG9yIHRpbWVvdXQgYW5kIHRoZW4KLSAgICByZXR1cm4gY2FsbCBsb2cgY291bnQuCi0KLSAgICBBcmdzOgotICAgICAgZGV2aWNlOiBBbmRyb2lkRGV2aWNlLCBNb2JseSBBbmRyb2lkIGNvbnRyb2xsZXIgY2xhc3MuCi0gICAgICBjYWxsX2xvZ190eXBlOiBTdHJpbmcsIFR5cGUgb2YgdGhlIGNhbGwgbG9ncy4KLSAgICAgIGV4cGVjdGVkX2NhbGxfbG9nX2NvdW50OiBJbnQsIE51bWJlciBvZiBjYWxsIGxvZ3MgYXMgZXhwZWN0ZWQuCi0gICAgICB0aW1lb3V0X3NlYzogSW50LCBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBjYWxsIGxvZyB1cGRhdGUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgY3VycmVudF9jb3VudDogSW50LCBudW1iZXIgb2YgdGhlIGV4aXN0aW5nIGNhbGwgbG9ncyBvbiB0aGUgZGV2aWNlLgotICAgICIiIgotICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgIGVuZF90aW1lID0gc3RhcnRfdGltZSArIHRpbWVvdXRfc2VjCi0gICAgY3VycmVudF9jb3VudCA9IDAKLSAgICB3aGlsZSB0aW1lLnRpbWUoKSA8IGVuZF90aW1lOgotICAgICAgY3VycmVudF9jb3VudCA9IGxlbihkZXZpY2Uuc2w0YS5jYWxsTG9nc0dldChjYWxsX2xvZ190eXBlKSkKLSAgICAgIGlmIGN1cnJlbnRfY291bnQgPT0gZXhwZWN0ZWRfY2FsbF9sb2dfY291bnQ6Ci0gICAgICAgIGJyZWFrCi0gICAgICAjIEludGVydmFsIGJldHdlZW4gYXR0ZW1wdHMgdG8gZ2V0IGNhbGwgbG9ncy4KLSAgICAgIHRpbWUuc2xlZXAoMSkKLSAgICBpZiBjdXJyZW50X2NvdW50ICE9IGV4cGVjdGVkX2NhbGxfbG9nX2NvdW50OgotICAgICAgZGV2aWNlLmxvZy53YXJuaW5nKAotICAgICAgICAgICdGYWlsZWQgdG8gZ2V0IGV4cGVjdGVkIGNhbGwgbG9nIGNvdW50OiAlZC4gJwotICAgICAgICAgICdBY3R1YWwgY2FsbCBsb2cgY291bnQ6ICVkLicgJQotICAgICAgICAgIChleHBlY3RlZF9jYWxsX2xvZ19jb3VudCwgY3VycmVudF9jb3VudCkpCi0gICAgcmV0dXJuIGN1cnJlbnRfY291bnQKLQotICBkZWYgX3Rlcm1pbmF0ZV9wYmFwX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgc3RhdHVzID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5zbDRhLmJsdWV0b290aFBiYXBDbGllbnRHZXRDb25uZWN0aW9uU3RhdHVzKAotICAgICAgICBzZWxmLnBzZV9tYWNfYWRkcmVzcykKLSAgICBpZiBzdGF0dXMgPT0gYnRfY29uc3RhbnRzLkJsdWV0b290aENvbm5lY3Rpb25TdGF0dXMuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgcmV0dXJuCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5sb2cuaW5mbygnRGlzY29ubmVjdGluZyBQQkFQLi4uJykKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnNsNGEuYmx1ZXRvb3RoUGJhcENsaWVudERpc2Nvbm5lY3QoCi0gICAgICAgIHNlbGYucHNlX21hY19hZGRyZXNzKQotICAgICMgQnVmZmVyIGZvciB0aGUgY29ubmVjdGlvbiBzdGF0dXMgY2hlY2suCi0gICAgdGltZS5zbGVlcCgzKQotICAgIHN0YXR1cyA9IHNlbGYuZGVyaXZlZF9idF9kZXZpY2Uuc2w0YS5ibHVldG9vdGhQYmFwQ2xpZW50R2V0Q29ubmVjdGlvblN0YXR1cygKLSAgICAgICAgc2VsZi5wc2VfbWFjX2FkZHJlc3MpCi0gICAgaWYgc3RhdHVzICE9IGJ0X2NvbnN0YW50cy5CbHVldG9vdGhDb25uZWN0aW9uU3RhdHVzLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKCdQQkFQIGNvbm5lY3Rpb24gZmFpbGVkIHRvIGJlIHRlcm1pbmF0ZWQuJykKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmxvZy5pbmZvKCdTdWNjZXNzZnVsbHkgZGlzY29ubmVjdGVkIFBCQVAuJykKLQotICBkZWYgdGVzdF9kb3dubG9hZF9jb250YWN0cyhzZWxmKToKLSAgICAiIiJUZXN0IGZvciB0aGUgZmVhdHVyZSBvZiBkb3dubG9hZGluZyBjb250YWN0cy4KLQotICAgIFRlc3RzIHRoYXQgUENFIGNhbiBkb3dubG9hZCBjb250YWN0cyBmcm9tIFBTRS4KLSAgICAiIiIKLSAgICAjIE1ha2Ugc3VyZSBubyBhbnkgY29udGFjdHMgZXhpc3Qgb24gdGhlIGRldmljZXMuCi0gICAgZm9yIGRldmljZSBpbiBbc2VsZi5wcmlfcGhvbmUsIHNlbGYuZGVyaXZlZF9idF9kZXZpY2VdOgotICAgICAgZGV2aWNlLnNsNGEuY29udGFjdHNFcmFzZUFsbCgpCi0KLSAgICAjIEFkZCBjb250YWN0cyB0byBQU0UuCi0gICAgc2VsZi5fZ2VuZXJhdGVfY29udGFjdHNfb25fcHNlKFRFU1RfREFUQV9DT1VOVCkKLQotICAgICMgV2hlbiBQQ0UgaXMgY29ubmVjdGVkIHRvIFBTRSwgaXQgd2lsbCBkb3dubG9hZCBQU0UncyBjb250YWN0cy4KLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLnBiYXBfY29ubmVjdCgpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5sb2cuaW5mbygnRG93bmxvYWRpbmcgY29udGFjdHMgZnJvbSBQU0UuLi4nKQotICAgIGN1cnJlbnRfY291bnQgPSBzZWxmLl93YWl0X2FuZF9nZXRfY29udGFjdF9jb3VudCgKLSAgICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZSwgVEVTVF9EQVRBX0NPVU5ULCBXQUlUSU5HX1RJTUVPVVRfU0VDKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UubG9nLmluZm8oCi0gICAgICAgICdTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAlZCBjb250YWN0KHMpLicgJSBjdXJyZW50X2NvdW50KQotCi0gICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgY3VycmVudF9jb3VudCA9PSBURVNUX0RBVEFfQ09VTlQsCi0gICAgICAgICdQQ0UgZmFpbGVkIHRvIGRvd25sb2FkICVkIGNvbnRhY3Qocykgd2l0aGluICVkcywgJwotICAgICAgICAnYWN0dWFsbHkgZG93bmxvYWRlZCAlZCBjb250YWN0KHMpLicgJQotICAgICAgICAoVEVTVF9EQVRBX0NPVU5ULCBXQUlUSU5HX1RJTUVPVVRfU0VDLCBjdXJyZW50X2NvdW50KSkKLQotICBkZWYgdGVzdF9kb3dubG9hZF9jYWxsX2xvZ3Moc2VsZik6Ci0gICAgIiIiVGVzdCBmb3IgdGhlIGZlYXR1cmUgb2YgZG93bmxvYWRpbmcgY2FsbCBsb2dzLgotCi0gICAgVGVzdHMgdGhhdCBQQ0UgY2FuIGRvd25sb2FkIGluY29taW5nL291dGdvaW5nL21pc3NlZCBjYWxsIGxvZ3MgZnJvbSBQU0UuCi0gICAgIiIiCi0gICAgIyBNYWtlIHN1cmUgbm8gYW55IGNhbGwgbG9ncyBleGlzdCBvbiB0aGUgZGV2aWNlcy4KLSAgICBmb3IgZGV2aWNlIGluIFtzZWxmLnByaV9waG9uZSwgc2VsZi5kZXJpdmVkX2J0X2RldmljZV06Ci0gICAgICBkZXZpY2Uuc2w0YS5jYWxsTG9nc0VyYXNlQWxsKCkKLQotICAgIGNhbGxfbG9nX3R5cGVzID0gWwotICAgICAgICBidF9jb25zdGFudHMuSU5DT01JTkdfQ0FMTF9MT0dfVFlQRSwKLSAgICAgICAgYnRfY29uc3RhbnRzLk9VVEdPSU5HX0NBTExfTE9HX1RZUEUsCi0gICAgICAgIGJ0X2NvbnN0YW50cy5NSVNTRURfQ0FMTF9MT0dfVFlQRSwKLSAgICBdCi0gICAgZm9yIGNhbGxfbG9nX3R5cGUgaW4gY2FsbF9sb2dfdHlwZXM6Ci0gICAgICAjIEFkZCBjYWxsIGxvZ3MgdG8gUFNFLgotICAgICAgc2VsZi5fZ2VuZXJhdGVfY2FsbF9sb2dzX29uX3BzZShjYWxsX2xvZ190eXBlLCBURVNUX0RBVEFfQ09VTlQpCi0KLSAgICAjIFdoZW4gUENFIGlzIGNvbm5lY3RlZCB0byBQU0UsIGl0IHdpbGwgZG93bmxvYWQgUFNFJ3MgY29udGFjdHMuCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5wYmFwX2Nvbm5lY3QoKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UubG9nLmluZm8oJ0Rvd25sb2FkaW5nIGNhbGwgbG9ncy4uLicpCi0KLSAgICBmb3IgY2FsbF9sb2dfdHlwZSBpbiBjYWxsX2xvZ190eXBlczoKLSAgICAgIGN1cnJlbnRfY291bnQgPSBzZWxmLl93YWl0X2FuZF9nZXRfY2FsbF9sb2dfY291bnQoCi0gICAgICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZSwKLSAgICAgICAgICBjYWxsX2xvZ190eXBlLAotICAgICAgICAgIFRFU1RfREFUQV9DT1VOVCwKLSAgICAgICAgICBXQUlUSU5HX1RJTUVPVVRfU0VDKQotICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5sb2cuaW5mbygKLSAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgJWQgY2FsbCBsb2cocykgd2hpY2ggdHlwZSBhcmUgIiVzIi4nICUKLSAgICAgICAgICAoY3VycmVudF9jb3VudCwgY2FsbF9sb2dfdHlwZSkpCi0KLSAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgY3VycmVudF9jb3VudCA9PSBURVNUX0RBVEFfQ09VTlQsCi0gICAgICAgICAgJ1BDRSBmYWlsZWQgdG8gZG93bmxvYWQgJWQgY2FsbCBsb2cocykgd2hpY2ggdHlwZSBhcmUgIiVzIiB3aXRoaW4gJWRzJwotICAgICAgICAgICcsIGFjdHVhbGx5IGRvd25sb2FkZWQgJWQgY2FsbCBsb2cocykuJyAlCi0gICAgICAgICAgKFRFU1RfREFUQV9DT1VOVCwgY2FsbF9sb2dfdHlwZSwgV0FJVElOR19USU1FT1VUX1NFQywgY3VycmVudF9jb3VudCkpCi0KLSAgZGVmIHRlc3Rfc2hvd19jYWxsZXJfbmFtZShzZWxmKToKLSAgICAiIiJUZXN0IGZvciBjYWxsZXIgbmFtZSBvZiB0aGUgaW5jb21pbmcgcGhvbmUgY2FsbCBpcyBjb3JyZWN0IG9uIFBDRS4KLQotICAgIFRlc3RzIHRoYXQgY2FsbGVyIG5hbWUgbWF0Y2hlcyBjb250YWN0IG5hbWUgd2hpY2ggaXMgZG93bmxvYWRlZCB2aWEgUEJBUC4KLSAgICAiIiIKLSAgICAjIENoZWNrcyBpZiB0d28gYW5kcm9pZCBkZXZpY2VzIGV4aXN0LgotICAgIGlmIGxlbihzZWxmLmFuZHJvaWRfZGV2aWNlcykgPCAyOgotICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoJ1RoaXMgdGVzdCByZXF1aXJlcyB0d28gQW5kcm9pZCBkZXZpY2VzLicpCi0gICAgcHJpbWFyeV9waG9uZSA9IHNlbGYucHJpX3Bob25lCi0gICAgc2Vjb25kYXJ5X3Bob25lID0gc2VsZi5hbmRyb2lkX2RldmljZXNbMV0KLSAgICBzZWNvbmRhcnlfcGhvbmUuaW5pdF9zZXR1cCgpCi0gICAgZm9yIHBob25lIGluIFtwcmltYXJ5X3Bob25lLCBzZWNvbmRhcnlfcGhvbmVdOgotICAgICAgIyBDaGVja3MgaWYgU0lNIHN0YXRlIGlzIGxvYWRlZCBmb3IgZXZlcnkgZGV2aWNlcy4KLSAgICAgIGlmIG5vdCBwaG9uZS5pc19zaW1fc3RhdGVfbG9hZGVkKCk6Ci0gICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKGYnUGxlYXNlIGluc2VydCBhIFNJTSBDYXJkIHRvIHRoZSBwaG9uZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYnIntwaG9uZS5zZXJpYWx9Ii4nKQotICAgICAgIyBDaGVja3MgaWYgcGhvbmVfbnVtYmVyIGlzIHByb3ZpZGVkIGluIHRoZSBzdXBwb3J0IGRpbWVuc2lvbnMuCi0gICAgICBwaG9uZS5waG9uZV9udW1iZXIgPSBwaG9uZS5kaW1lbnNpb25zLmdldCgncGhvbmVfbnVtYmVyJykKLSAgICAgIGlmIG5vdCBwaG9uZS5waG9uZV9udW1iZXI6Ci0gICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKGYnUGxlYXNlIGFkZCAicGhvbmVfbnVtYmVyIiB0byBzdXBwb3J0ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZidkaW1lbnNpb25zIG9mIHRoZSBwaG9uZSAie3Bob25lLnNlcmlhbH0iLicpCi0gICAgIyBNYWtlIHN1cmUgbm8gYW55IGNvbnRhY3RzIGV4aXN0IG9uIHRoZSBkZXZpY2VzLgotICAgIGZvciBkZXZpY2UgaW4gW3ByaW1hcnlfcGhvbmUsIHNlbGYuZGVyaXZlZF9idF9kZXZpY2VdOgotICAgICAgZGV2aWNlLnNsNGEuY29udGFjdHNFcmFzZUFsbCgpCi0gICAgIyBHZW5lcmF0ZSBhIGNvbnRhY3QgbmFtZSByYW5kb21seS4KLSAgICBmaXJzdF9uYW1lID0gdXRpbHMucmFuZF9hc2NpaV9zdHIoNCkKLSAgICBsYXN0X25hbWUgPSB1dGlscy5yYW5kX2FzY2lpX3N0cig0KQotICAgIGZ1bGxfbmFtZSA9IGYne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JwotICAgIHByaW1hcnlfcGhvbmUubG9nLmluZm8oJ0NyZWF0aW5nIGEgY29udGFjdCAiJXMiLi4uJywgZnVsbF9uYW1lKQotICAgIHNlbGYuX2dlbmVyYXRlX2NvbnRhY3RzX29uX3BzZSgKLSAgICAgICAgbnVtX29mX2NvbnRhY3RzPTEsCi0gICAgICAgIGZpcnN0X25hbWU9Zmlyc3RfbmFtZSwKLSAgICAgICAgbGFzdF9uYW1lPWxhc3RfbmFtZSwKLSAgICAgICAgcGhvbmVfbnVtYmVyPXNlY29uZGFyeV9waG9uZS5waG9uZV9udW1iZXIpCi0gICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZS5sb2cuaW5mbygnQ29ubmVjdGluZyB0byBQU0UuLi4nKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UucGJhcF9jb25uZWN0KCkKLSAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmxvZy5pbmZvKCdEb3dubG9hZGluZyBjb250YWN0cyBmcm9tIFBTRS4uLicpCi0gICAgY3VycmVudF9jb3VudCA9IHNlbGYuX3dhaXRfYW5kX2dldF9jb250YWN0X2NvdW50KAotICAgICAgICBkZXZpY2U9c2VsZi5kZXJpdmVkX2J0X2RldmljZSwKLSAgICAgICAgZXhwZWN0ZWRfY29udGFjdF9jb3VudD0xLAotICAgICAgICB0aW1lb3V0X3NlYz1XQUlUSU5HX1RJTUVPVVRfU0VDKQotICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBkb3dubG9hZGVkICVkIGNvbnRhY3QocykuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY291bnQpCi0gICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoCi0gICAgICAgIGZpcnN0PWN1cnJlbnRfY291bnQsCi0gICAgICAgIHNlY29uZD0xLAotICAgICAgICBtc2c9ZidGYWlsZWQgdG8gZG93bmxvYWQgdGhlIGNvbnRhY3QgIntmdWxsX25hbWV9Ii4nKQotICAgIHNlY29uZGFyeV9waG9uZS5zbDRhLnRlbGVjb21DYWxsTnVtYmVyKHByaW1hcnlfcGhvbmUucGhvbmVfbnVtYmVyKQotICAgIHNlY29uZGFyeV9waG9uZS5sb2cuaW5mbygnTWFkZSBhIHBob25lIGNhbGwgdG8gZGV2aWNlICIlcyIuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeV9waG9uZS5zZXJpYWwpCi0gICAgcHJpbWFyeV9waG9uZS5sb2cuaW5mbygnV2FpdGluZyBmb3IgdGhlIGluY29taW5nIGNhbGwgZnJvbSBkZXZpY2UgIiVzIi4uLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlfcGhvbmUuc2VyaWFsKQotICAgIGlzX3JpbmdpbmcgPSBwcmltYXJ5X3Bob25lLndhaXRfZm9yX2NhbGxfc3RhdGUoCi0gICAgICAgIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1JJTkdJTkcsCi0gICAgICAgIGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1RJTUVPVVRfU0VDKQotICAgIGlmIG5vdCBpc19yaW5naW5nOgotICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoCi0gICAgICAgICAgZidUaW1lZCBvdXQgYWZ0ZXIge2J0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1RJTUVPVVRfU0VDfXMgd2FpdGluZyBmb3IgJwotICAgICAgICAgIGYndGhlIGluY29taW5nIGNhbGwgZnJvbSBkZXZpY2UgIntzZWNvbmRhcnlfcGhvbmUuc2VyaWFsfSIuJykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlLmF1ZC5vcGVuX25vdGlmaWNhdGlvbigpCi0gICAgICB0YXJnZXRfbm9kZV9tYXRjaF9kaWN0ID0gewotICAgICAgICAgICdyZXNvdXJjZV9pZCc6ICdhbmRyb2lkOmlkL2xpbmUxJywKLSAgICAgICAgICAnY2hpbGQnOiB7Ci0gICAgICAgICAgICAgICdyZXNvdXJjZV9pZCc6ICdhbmRyb2lkOmlkL3RpdGxlJwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGhmcF9hZGRyZXNzID0gcHJpbWFyeV9waG9uZS5nZXRfYmx1ZXRvb3RoX21hY19hZGRyZXNzKCkKLSAgICAgIHRhcmdldF9ub2RlID0gc2VsZi5kZXJpdmVkX2J0X2RldmljZS5hdWQoCi0gICAgICAgICAgc2libGluZz10YXJnZXRfbm9kZV9tYXRjaF9kaWN0LAotICAgICAgICAgIHRleHQ9ZidJbmNvbWluZyBjYWxsIHZpYSBIRlAge2hmcF9hZGRyZXNzfScpCi0gICAgICBjYWxsZXJfbmFtZSA9IHRhcmdldF9ub2RlLmdldF9hdHRyaWJ1dGVfdmFsdWUoJ3RleHQnKQotICAgICAgbWVzc2FnZSA9IChmJ0NhbGxlciBuYW1lIGlzIGluY29ycmVjdC4gQWN0dWFsOiB7Y2FsbGVyX25hbWV9LCAnCi0gICAgICAgICAgICAgICAgIGYnQ29ycmVjdDoge2Z1bGxfbmFtZX0nKQotICAgICAgIyBBc3NlcnRzIHRoYXQgY2FsbGVyIG5hbWUgb2YgdGhlIGluY29taW5nIHBob25lIGNhbGwgaXMgY29ycmVjdCBpbiB0aGUKLSAgICAgICMgbm90aWZpY2F0aW9uIGJhci4KLSAgICAgIGFzc2VydHMuYXNzZXJ0X2VxdWFsKAotICAgICAgICAgIGZpcnN0PWNhbGxlcl9uYW1lLAotICAgICAgICAgIHNlY29uZD1mdWxsX25hbWUsCi0gICAgICAgICAgbXNnPW1lc3NhZ2UpCi0gICAgZmluYWxseToKLSAgICAgICMgUmVjb3ZlcnkgYWN0aW9ucy4KLSAgICAgIHNlbGYuZGVyaXZlZF9idF9kZXZpY2UuYXVkLmNsb3NlX25vdGlmaWNhdGlvbigpCi0gICAgICBzZWNvbmRhcnlfcGhvbmUuc2w0YS50ZWxlY29tRW5kQ2FsbCgpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdGVzdF9ydW5uZXIubWFpbigpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdGVzdHMvcGJhdC9ibHVldG9vdGhfYWNjZXB0YW5jZV9zdWl0ZS5weSBiL2JsdWViZXJyeS90ZXN0cy9wYmF0L2JsdWV0b290aF9hY2NlcHRhbmNlX3N1aXRlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWExMTUxLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS90ZXN0cy9wYmF0L2JsdWV0b290aF9hY2NlcHRhbmNlX3N1aXRlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIiIiU3VpdGUgY29sbGVjdGluZyBibHVldG9vdGggdGVzdCBjbGFzc2VzIGZvciBhY2NlcHRhbmNlIHRlc3RpbmcuIiIiCi0KLWltcG9ydCBsb2dnaW5nCi0KLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyX3N1aXRlCi0KLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmEyZHAgaW1wb3J0IGJsdWV0b290aF9hMmRwX3Rlc3QKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmF2cmNwIGltcG9ydCBibHVldG9vdGhfYXZyY3BfdGVzdAotZnJvbSBibHVlYmVycnkudGVzdHMuY29ubmVjdGl2aXR5IGltcG9ydCBibGVfcGFpcmluZ190ZXN0Ci1mcm9tIGJsdWViZXJyeS50ZXN0cy5jb25uZWN0aXZpdHkgaW1wb3J0IGJsdWV0b290aF9wYWlyaW5nX3Rlc3QKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmhmcCBpbXBvcnQgYmx1ZXRvb3RoX2hmcF90ZXN0Ci1mcm9tIGJsdWViZXJyeS50ZXN0cy5tYXAgaW1wb3J0IGJsdWV0b290aF9tYXBfdGVzdAotZnJvbSBibHVlYmVycnkudGVzdHMub3BwIGltcG9ydCBibHVldG9vdGhfb3BwX3Rlc3QKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLnBhbiBpbXBvcnQgYmx1ZXRvb3RoX3Bhbl90ZXN0Ci1mcm9tIGJsdWViZXJyeS50ZXN0cy5wYmFwIGltcG9ydCBibHVldG9vdGhfcGJhcF90ZXN0Ci0KLSMgVGVzdCBjbGFzc2VzIGZvciB0aGUgQmx1ZXRvb3RoIGFjY2VwdGFuY2Ugc3VpdGUuCi1URVNUX0NMQVNTRVMgPSBbCi0gICAgYmx1ZXRvb3RoX3BhaXJpbmdfdGVzdC5CbHVldG9vdGhQYWlyaW5nVGVzdCwKLSAgICBibGVfcGFpcmluZ190ZXN0LkJsZVBhaXJpbmdUZXN0LAotICAgIGJsdWV0b290aF9hMmRwX3Rlc3QuQmx1ZXRvb3RoQTJkcFRlc3QsCi0gICAgYmx1ZXRvb3RoX2F2cmNwX3Rlc3QuQmx1ZXRvb3RoQXZyY3BUZXN0LAotICAgIGJsdWV0b290aF9oZnBfdGVzdC5CbHVldG9vdGhIZnBUZXN0LAotICAgIGJsdWV0b290aF9tYXBfdGVzdC5CbHVldG9vdGhNYXBUZXN0LAotICAgIGJsdWV0b290aF9wYmFwX3Rlc3QuQmx1ZXRvb3RoUGJhcFRlc3QsCi0gICAgYmx1ZXRvb3RoX29wcF90ZXN0LkJsdWV0b290aE9wcFRlc3QsCi0gICAgYmx1ZXRvb3RoX3Bhbl90ZXN0LkJsdWV0b290aFBhblRlc3QKLV0KLQotCi1jbGFzcyBCbHVldG9vdGhBY2NlcHRhbmNlU3VpdGUobW9ibHlfZzNfc3VpdGUuQmFzZVN1aXRlKToKLSAgIiIiQmx1ZXRvb3RoIEFjY2VwdGFuY2UgU3VpdGUuCi0KLSAgVXNhZ2Ugb2YgVGVzdCBzZWxlY3RvcjoKLSAgQWRkIHRoZSBwYXJhbWV0ZXIgImFjY2VwdGFuY2VfdGVzdF9zZWxlY3RvciIgaW4gdGhlIE1vYmx5IGNvbmZpZ3VyYXRpb24sIGl0J3MKLSAgdmFsdWUgaXMgbGlrZSAidGVzdF9tZXRob2RfMSx0ZXN0X21ldGhvZF8yLC4uLiIuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotICB1c2VkLCBhbGwgdGVzdHMgd2lsbCBiZSBydW5uaW5nLgotICAiIiIKLQotICBkZWYgc2V0dXBfc3VpdGUoc2VsZiwgY29uZmlnKToKLSAgICBzZWxlY3RlZF90ZXN0cyA9IE5vbmUKLSAgICBzZWxlY3RvciA9IGNvbmZpZy51c2VyX3BhcmFtcy5nZXQoJ2FjY2VwdGFuY2VfdGVzdF9zZWxlY3RvcicpCi0gICAgaWYgc2VsZWN0b3I6Ci0gICAgICBzZWxlY3RlZF90ZXN0cyA9IHNlbGVjdG9yLnNwbGl0KCcsJykKLSAgICAgIGxvZ2dpbmcuaW5mbygnU2VsZWN0ZWQgdGVzdHM6ICVzJywgJyAnLmpvaW4oc2VsZWN0ZWRfdGVzdHMpKQotICAgICMgRW5hYmxlIGFsbCBCbHVldG9vdGggbG9nZ2luZyBpbiB0aGUgZmlyc3QgdGVzdC4KLSAgICBmaXJzdF90ZXN0X2NvbmZpZyA9IGNvbmZpZy5jb3B5KCkKLSAgICBmaXJzdF90ZXN0X2NvbmZpZy51c2VyX3BhcmFtcy51cGRhdGUoewotICAgICAgICAnZW5hYmxlX2FsbF9ibHVldG9vdGhfbG9nZ2luZyc6IDEsCi0gICAgfSkKLSAgICBmb3IgaW5kZXgsIGNsYXp6IGluIGVudW1lcmF0ZShURVNUX0NMQVNTRVMpOgotICAgICAgaWYgc2VsZWN0ZWRfdGVzdHM6Ci0gICAgICAgIG1hdGNoZWRfdGVzdHMgPSBOb25lCi0gICAgICAgICMgR2V0cyB0aGUgc2FtZSBlbGVtZW50cyBiZXR3ZWVuIHNlbGVjdGVkX3Rlc3RzIGFuZCBkaXIoY2xhenopLgotICAgICAgICBtYXRjaGVkX3Rlc3RzID0gbGlzdChzZXQoc2VsZWN0ZWRfdGVzdHMpICYgc2V0KGRpcihjbGF6eikpKQotICAgICAgICAjIEFkZHMgdGhlIHRlc3QgY2xhc3MgaWYgaXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRlc3RzLgotICAgICAgICBpZiBtYXRjaGVkX3Rlc3RzOgotICAgICAgICAgIHNlbGYuYWRkX3Rlc3RfY2xhc3MoCi0gICAgICAgICAgICAgIGNsYXp6PWNsYXp6LAotICAgICAgICAgICAgICBjb25maWc9Zmlyc3RfdGVzdF9jb25maWcgaWYgaW5kZXggPT0gMCBlbHNlIGNvbmZpZywKLSAgICAgICAgICAgICAgdGVzdHM9bWF0Y2hlZF90ZXN0cykKLSAgICAgICAgICBsb2dnaW5nLmluZm8oJ0FkZGVkIHRoZSB0ZXN0cyBvZiAiJXMiOiAlcycsIGNsYXp6Ll9fbmFtZV9fLAotICAgICAgICAgICAgICAgICAgICAgICAnICcuam9pbihtYXRjaGVkX3Rlc3RzKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuYWRkX3Rlc3RfY2xhc3MoCi0gICAgICAgICAgICBjbGF6ej1jbGF6eiwKLSAgICAgICAgICAgIGNvbmZpZz1maXJzdF90ZXN0X2NvbmZpZyBpZiBpbmRleCA9PSAwIGVsc2UgY29uZmlnKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIG1vYmx5X2czX3N1aXRlLm1haW4oKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3V0aWxzL2FuZHJvaWRfYmx1ZXRvb3RoX2RlY29yYXRvci5weSBiL2JsdWViZXJyeS91dGlscy9hbmRyb2lkX2JsdWV0b290aF9kZWNvcmF0b3IucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzA4OTcuLjAwMDAwMDAKLS0tIGEvYmx1ZWJlcnJ5L3V0aWxzL2FuZHJvaWRfYmx1ZXRvb3RoX2RlY29yYXRvci5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3MjkgKzAsMCBAQAotIyBMaW50IGFzOiBweXRob24zCi0iIiJBbmRyb2lkQmx1ZXRvb3RoRGVjb3JhdG9yIGNsYXNzLgotCi1UaGlzIGRlY29yYXRvciBpcyB1c2VkIGZvciBnaXZpbmcgYW4gQW5kcm9pZERldmljZSBCbHVldG9vdGgtc3BlY2lmaWMKLWZ1bmN0aW9uYWxpdHkuCi0iIiIKLQotaW1wb3J0IGRhdGV0aW1lCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1pbXBvcnQgcXVldWUKLWltcG9ydCByYW5kb20KLWltcG9ydCByZQotaW1wb3J0IHN0cmluZwotaW1wb3J0IHRpbWUKLWZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBBbnksIFRleHQsIE9wdGlvbmFsLCBUdXBsZSwgU2VxdWVuY2UsIFVuaW9uCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzCi1mcm9tIG1vYmx5IGltcG9ydCBsb2dnZXIgYXMgbW9ibHlfbG9nZ2VyCi1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi1mcm9tIG1vYmx5IGltcG9ydCB1dGlscwotZnJvbSBtb2JseS5jb250cm9sbGVycy5hbmRyb2lkX2RldmljZSBpbXBvcnQgQW5kcm9pZERldmljZQotZnJvbSBtb2JseS5jb250cm9sbGVycy5hbmRyb2lkX2RldmljZV9saWIgaW1wb3J0IGFkYgotZnJvbSBtb2JseS5jb250cm9sbGVycy5hbmRyb2lkX2RldmljZV9saWIgaW1wb3J0IGpzb25ycGNfY2xpZW50X2Jhc2UKLWZyb20gbW9ibHkuY29udHJvbGxlcnMuYW5kcm9pZF9kZXZpY2VfbGliLnNlcnZpY2VzIGltcG9ydCBzbDRhX3NlcnZpY2UKLSMgSW50ZXJuYWwgaW1wb3J0Ci1mcm9tIGJsdWViZXJyeS5jb250cm9sbGVycy5kZXJpdmVkX2J0X2RldmljZSBpbXBvcnQgQnREZXZpY2UKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF9jb25zdGFudHMKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzIGltcG9ydCBidF90ZXN0X3V0aWxzCi1mcm9tIGJsdWViZXJyeS51dGlscy5idF9jb25zdGFudHMgaW1wb3J0IEF2cmNwRXZlbnQKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzLmJ0X2NvbnN0YW50cyBpbXBvcnQgQmx1ZXRvb3RoQ29ubmVjdGlvblBvbGljeQotZnJvbSBibHVlYmVycnkudXRpbHMuYnRfY29uc3RhbnRzIGltcG9ydCBCbHVldG9vdGhDb25uZWN0aW9uU3RhdHVzCi1mcm9tIGJsdWViZXJyeS51dGlscy5idF9jb25zdGFudHMgaW1wb3J0IEJsdWV0b290aFByb2ZpbGUKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzLmJ0X2NvbnN0YW50cyBpbXBvcnQgQ2FsbExvZ1R5cGUKLWZyb20gYmx1ZWJlcnJ5LnV0aWxzLmJ0X2NvbnN0YW50cyBpbXBvcnQgQ2FsbFN0YXRlCi0KLQotIyBNYXAgZm9yIG1lZGlhIHBhc3N0aHJvdWdoIGNvbW1hbmRzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMuCi1NRURJQV9DTURfTUFQID0gewotICAgIGJ0X2NvbnN0YW50cy5DTURfTUVESUFfUEFVU0U6IGJ0X2NvbnN0YW50cy5FVkVOVF9QQVVTRV9SRUNFSVZFRCwKLSAgICBidF9jb25zdGFudHMuQ01EX01FRElBX1BMQVk6IGJ0X2NvbnN0YW50cy5FVkVOVF9QTEFZX1JFQ0VJVkVELAotICAgIGJ0X2NvbnN0YW50cy5DTURfTUVESUFfU0tJUF9QUkVWOiBidF9jb25zdGFudHMuRVZFTlRfU0tJUF9QUkVWX1JFQ0VJVkVELAotICAgIGJ0X2NvbnN0YW50cy5DTURfTUVESUFfU0tJUF9ORVhUOiBidF9jb25zdGFudHMuRVZFTlRfU0tJUF9ORVhUX1JFQ0VJVkVECi19Ci0KLSMgVGltZW91dCBmb3IgdHJhY2sgY2hhbmdlIGFuZCBwbGF5YmFjayBzdGF0ZSB1cGRhdGUgaW4gc2Vjb25kLgotTUVESUFfVVBEQVRFX1RJTUVPVVRfU0VDID0gMwotCi0jIFRpbWVvdXQgZm9yIHRoZSBldmVudCBvZiBNZWRpYSBwYXNzdGhyb3VnaCBjb21tYW5kcyBpbiBzZWNvbmQuCi1NRURJQV9FVkVOVF9USU1FT1VUX1NFQyA9IDEKLQotQlRfQ09OTkVDVElPTl9XQUlUSU5HX1RJTUVfU0VDT05EUyA9IDEwCi0KLUFEQl9XQUlUSU5HX1RJTUVfU0VDT05EUyA9IDEKLQotIyBDb21tb24gdGltZW91dCBmb3IgdG9nZ2xlIHN0YXR1cyBpbiBzZWNvbmRzLgotQ09NTU9OX1RJTUVPVVRfU0VDT05EUyA9IDUKLQotIyBMb2NhbCBjb25zdGFudAotX0RBVEVUSU1FX0ZNVCA9ICclbS0lZCAlSDolTTolUy4lZicKLQotIyBJbnRlcnZhbCB0aW1lIGJldHdlZW4gcGluZyByZXF1ZXN0cyBpbiBzZWNvbmQuCi1QSU5HX0lOVEVSVkFMX1RJTUVfU0VDID0gMgotCi0jIFRpbWVvdXQgdG8gd2FpdCBmb3IgcGluZyBzdWNjZXNzIGluIHNlY29uZC4KLVBJTkdfVElNRU9VVF9TRUMgPSA2MAotCi0jIEEgVVJMIGlzIHVzZWQgdG8gdmVyaWZ5IGludGVybmV0IGJ5IHBpbmcgcmVxdWVzdC4KLVRFU1RfVVJMID0gJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbScKLQotCi1jbGFzcyBEaXNjb3ZlcnlFcnJvcihzaWduYWxzLkNvbnRyb2xsZXJFcnJvcik6Ci0gICIiIkV4Y2VwdGlvbiByYWlzZWQgZm9yIEJsdWV0b290aCBkZXZpY2UgZGlzY292ZXJ5IGZhaWx1cmVzLiIiIgotICBwYXNzCi0KLQotY2xhc3MgQW5kcm9pZEJsdWV0b290aERlY29yYXRvcihBbmRyb2lkRGV2aWNlKToKLSAgIiIiRGVjb3JhdGVzIGFuIEFuZHJvaWREZXZpY2Ugd2l0aCBCbHVldG9vdGgtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eS4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgYWQ6IEFuZHJvaWREZXZpY2UpOgotICAgIHNlbGYuX2FkID0gYWQKLSAgICBzZWxmLl91c2VyX3BhcmFtcyA9IE5vbmUKLSAgICBpZiBub3Qgc2VsZi5fYWQgb3Igbm90IGlzaW5zdGFuY2Uoc2VsZi5fYWQsIEFuZHJvaWREZXZpY2UpOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCdNdXN0IGFwcGx5IEFuZHJvaWRCbHVldG9vdGhEZWNvcmF0b3IgdG8gYW4gJwotICAgICAgICAgICAgICAgICAgICAgICdBbmRyb2lkRGV2aWNlJykKLSAgICBzZWxmLmJsZV9hZHZlcnRpc2VfY2FsbGJhY2sgPSBOb25lCi0gICAgc2VsZi5yZWdleF9sb2djYXRfdGltZSA9IHJlLmNvbXBpbGUoCi0gICAgICAgIHInKD9QPGRhdGV0aW1lPltcZF17Mn0tW1xkXXsyfSBbXGRdezJ9OltcZF17Mn06W1xkXXsyfS5bXGRdezN9KScKLSAgICAgICAgcidbIF0rXGQrLionKQotICAgIHNlbGYuX3JlZ2V4X2J0X2NyYXNoID0gcmUuY29tcGlsZSgKLSAgICAgICAgcidCbHVldG9vdGggY3Jhc2hlZCAoP1A8bnVtX2J0X2NyYXNoZXM+XGQrKSB0aW1lcycpCi0KLSAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWU6IEFueSkgLT4gQW55OgotICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2FkLCBuYW1lKQotCi0gIGRlZiBfaXNfZGV2aWNlX2Nvbm5lY3RlZChzZWxmLCBtYWNfYWRkcmVzcyk6Ci0gICAgIiIiV3JhcHBlciBtZXRob2QgdG8gaGVscCB3aXRoIHVuaXQgdGVzdGFiaWxpdHkgb2YgdGhpcyBjbGFzcy4iIiIKLSAgICByZXR1cm4gc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhJc0RldmljZUNvbm5lY3RlZChtYWNfYWRkcmVzcykKLQotICBkZWYgX2lzX3Byb2ZpbGVfY29ubmVjdGVkKHNlbGYsIG1hY19hZGRyZXNzLCBwcm9maWxlKToKLSAgICAiIiJDaGVja3MgaWYgdGhlIHByb2ZpbGUgaXMgY29ubmVjdGVkLiIiIgotICAgIHN0YXR1cyA9IE5vbmUKLSAgICBwcmlfYWQgPSBzZWxmLl9hZAotICAgIGlmIHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUX0NMSUVOVDoKLSAgICAgIHN0YXR1cyA9IHByaV9hZC5zbDRhLmJsdWV0b290aEhmcENsaWVudEdldENvbm5lY3Rpb25TdGF0dXMobWFjX2FkZHJlc3MpCi0gICAgZWxpZiBwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuQTJEUF9TSU5LOgotICAgICAgc3RhdHVzID0gcHJpX2FkLnNsNGEuYmx1ZXRvb3RoQTJkcFNpbmtHZXRDb25uZWN0aW9uU3RhdHVzKG1hY19hZGRyZXNzKQotICAgIGVsaWYgcHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLlBCQVBfQ0xJRU5UOgotICAgICAgc3RhdHVzID0gcHJpX2FkLnNsNGEuYmx1ZXRvb3RoUGJhcENsaWVudEdldENvbm5lY3Rpb25TdGF0dXMobWFjX2FkZHJlc3MpCi0gICAgZWxpZiBwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuTUFQX01DRToKLSAgICAgIGNvbm5lY3RlZF9kZXZpY2VzID0gc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhNYXBDbGllbnRHZXRDb25uZWN0ZWREZXZpY2VzKCkKLSAgICAgIHJldHVybiBhbnkoCi0gICAgICAgICAgbWFjX2FkZHJlc3MgaW4gZGV2aWNlWydhZGRyZXNzJ10gZm9yIGRldmljZSBpbiBjb25uZWN0ZWRfZGV2aWNlcykKLSAgICBlbHNlOgotICAgICAgcHJpX2FkLmxvZy53YXJuaW5nKAotICAgICAgICAgICdUaGUgY29ubmVjdGlvbiBjaGVjayBmb3IgcHJvZmlsZSAlcyBpcyBub3Qgc3VwcG9ydGVkICcKLSAgICAgICAgICAneWV0JywgcHJvZmlsZSkKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBzdGF0dXMgPT0gQmx1ZXRvb3RoQ29ubmVjdGlvblN0YXR1cy5TVEFURV9DT05ORUNURUQKLQotICBkZWYgX2dldF9ibHVldG9vdGhfbGVfc3RhdGUoc2VsZik6Ci0gICAgIiIiV3JhcHBlciBtZXRob2QgdG8gaGVscCB3aXRoIHVuaXQgdGVzdGFiaWxpdHkgb2YgdGhpcyBjbGFzcy4iIiIKLSAgICByZXR1cm4gc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhHZXRMZVN0YXRlCi0KLSAgZGVmIF9nZW5lcmF0ZV9pZF9ieV9zaXplKHNlbGYsIHNpemUpOgotICAgICIiIkdlbmVyYXRlIHN0cmluZyBvZiByYW5kb20gYXNjaWkgbGV0dGVycyBhbmQgZGlnaXRzLgotCi0gICAgQXJnczoKLSAgICAgIHNpemU6IHJlcXVpcmVkIHNpemUgb2Ygc3RyaW5nLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFN0cmluZyBvZiByYW5kb20gY2hhcnMuCi0gICAgIiIiCi0gICAgcmV0dXJuICcnLmpvaW4oCi0gICAgICAgIHJhbmRvbS5jaG9pY2Uoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzKQotICAgICAgICBmb3IgXyBpbiByYW5nZShzaXplKSkKLQotICBkZWYgX3dhaXRfZm9yX2JsdWV0b290aF9tYW5hZ2VyX3N0YXRlKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PTEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZD01KToKLSAgICAiIiJXYWl0cyBmb3IgQmx1ZXRvb3RoIG5vcm1hbGl6ZWQgc3RhdGUgb3Igbm9ybWFsaXplZCBleHBsaWNpdCBzdGF0ZS4KLQotICAgIEFyZ3M6Ci0gICAgICBzdGF0ZTogZXhwZWN0ZWQgQmx1ZXRvb3RoIHN0YXRlCi0gICAgICB0aW1lb3V0OiBtYXggdGltZW91dCB0aHJlc2hvbGQKLSAgICAgIHRocmVzaG9sZDogbGlzdCBsZW4gb2YgYnQgc3RhdGUKLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bnN1Y2Nlc3NmdWwuCi0gICAgIiIiCi0gICAgYWxsX3N0YXRlcyA9IFtdCi0gICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgd2hpbGUgdGltZS50aW1lKCkgPCBzdGFydF90aW1lICsgdGltZW91dDoKLSAgICAgIGFsbF9zdGF0ZXMuYXBwZW5kKHNlbGYuX2dldF9ibHVldG9vdGhfbGVfc3RhdGUoKSkKLSAgICAgIGlmIGxlbihhbGxfc3RhdGVzKSA+PSB0aHJlc2hvbGQ6Ci0gICAgICAgICMgZm9yIGFueSBub3JtYWxpemVkIHN0YXRlCi0gICAgICAgIGlmIHN0YXRlIGlzIE5vbmU6Ci0gICAgICAgICAgaWYgbGVuKGFsbF9zdGF0ZXNbLXRocmVzaG9sZDpdKSA9PSAxOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdTdGF0ZSBub3JtYWxpemVkICVzJywgYWxsX3N0YXRlc1stdGhyZXNob2xkOl0pCi0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICBlbHNlOgotICAgICAgICAgICMgZXhwbGljaXQgY2hlY2sgYWdhaW5zdCBub3JtYWxpemVkIHN0YXRlCi0gICAgICAgICAgaWYgc3RhdGUgaW4gYWxsX3N0YXRlc1stdGhyZXNob2xkOl06Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgdGltZS5zbGVlcCgwLjUpCi0gICAgbG9nZ2luZy5lcnJvcigKLSAgICAgICAgJ0JsdWV0b290aCBzdGF0ZSBmYWlscyB0byBub3JtYWxpemUnIGlmIHN0YXRlIGlzIE5vbmUgZWxzZQotICAgICAgICAnRmFpbGVkIHRvIG1hdGNoIGJsdWV0b290aCBzdGF0ZSwgY3VycmVudCBzdGF0ZSB7fSBleHBlY3RlZCBzdGF0ZSB7fScKLSAgICAgICAgLmZvcm1hdChzZWxmLl9nZXRfYmx1ZXRvb3RoX2xlX3N0YXRlKCksIHN0YXRlKSkKLSAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgaW5pdF9zZXR1cChzZWxmKSAtPiBOb25lOgotICAgICIiIlNldHMgdXAgYW5kcm9pZCBkZXZpY2UgZm9yIGJsdWV0b290aCB0ZXN0cy4iIiIKLSAgICBzZWxmLl9hZC5zZXJ2aWNlcy5yZWdpc3Rlcignc2w0YScsIHNsNGFfc2VydmljZS5TbDRhU2VydmljZSkKLSAgICBzZWxmLl9hZC5sb2FkX3NuaXBwZXQoJ21icycsICdjb20uZ29vZ2xlLmFuZHJvaWQubW9ibHkuc25pcHBldC5idW5kbGVkJykKLSAgICBzZWxmLl9hZC5hZGIuc2hlbGwoJ3NldGVuZm9yY2UgMCcpCi0KLSAgICAjIEFkZHMgMiBzZWNvbmRzIHdhaXRpbmcgdGltZSB0byBzZWUgaXQgY2FuIGZpeCB0aGUgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAjIHdoZW4gZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgc2w0YS5ibHVldG9vdGhTdGFydFBhaXJpbmdIZWxwZXIgbWV0aG9kLgotICAgIHRpbWUuc2xlZXAoMikKLSAgICBzZWxmLl9hZC5zbDRhLmJsdWV0b290aFN0YXJ0UGFpcmluZ0hlbHBlcigpCi0gICAgc2VsZi5mYWN0b3J5X3Jlc2V0X2JsdWV0b290aCgpCi0KLSAgZGVmIHNsNGFfc2V0dXAoc2VsZikgLT4gTm9uZToKLSAgICAiIiJBIGNvbW1vbiBzZXR1cCByb3V0aW5lIGZvciBhbmRyb2lkIGRldmljZSBzbDRhIGZ1bmN0aW9uLgotCi0gICAgVGhpbmdzIHRoaXMgbWV0aG9kIHNldHVwOgotICAgIDEuIFNldCBCbHVldG9vdGggbG9jYWwgbmFtZSB0byByYW5kb20gc3RyaW5nIG9mIHNpemUgNAotICAgIDIuIERpc2FibGUgQkxFIGJhY2tncm91bmQgc2Nhbm5pbmcuCi0gICAgIiIiCi0KLSAgICBzbDRhID0gc2VsZi5fYWQuc2w0YQotICAgIHNsNGEuYmx1ZXRvb3RoU3RhcnRDb25uZWN0aW9uU3RhdGVDaGFuZ2VNb25pdG9yKCcnKQotICAgIHNldHVwX3Jlc3VsdCA9IHNsNGEuYmx1ZXRvb3RoU2V0TG9jYWxOYW1lKHNlbGYuX2dlbmVyYXRlX2lkX2J5X3NpemUoNCkpCi0gICAgaWYgbm90IHNldHVwX3Jlc3VsdDoKLSAgICAgIHNlbGYubG9nLmVycm9yKCdGYWlsZWQgdG8gc2V0IGRldmljZSBuYW1lLicpCi0gICAgICByZXR1cm4KLSAgICBzbDRhLmJsdWV0b290aERpc2FibGVCTEUoKQotICAgIGJvbmRlZF9kZXZpY2VzID0gc2w0YS5ibHVldG9vdGhHZXRCb25kZWREZXZpY2VzKCkKLSAgICBmb3IgYiBpbiBib25kZWRfZGV2aWNlczoKLSAgICAgIHNlbGYubG9nLmluZm8oJ1JlbW92aW5nIGJvbmQgZm9yIGRldmljZSB7fScuZm9ybWF0KGJbJ2FkZHJlc3MnXSkpCi0gICAgICBzbDRhLmJsdWV0b290aFVuYm9uZChiWydhZGRyZXNzJ10pCi0KLSAgZGVmIHNldF91c2VyX3BhcmFtcyhzZWxmLCBwYXJhbXM6IERpY3Rbc3RyLCBBbnldKSAtPiBOb25lOgotICAgIHNlbGYuX3VzZXJfcGFyYW1zID0gcGFyYW1zCi0KLSAgZGVmIGdldF91c2VyX3BhcmFtcyhzZWxmKSAtPiBEaWN0W3N0ciwgQW55XToKLSAgICByZXR1cm4gc2VsZi5fdXNlcl9wYXJhbXMKLQotICBkZWYgaXNfc2ltX3N0YXRlX2xvYWRlZChzZWxmKSAtPiBib29sOgotICAgICIiIkNoZWNrcyBpZiBTSU0gc3RhdGUgaXMgbG9hZGVkLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRydWUgaWYgU0lNIHN0YXRlIGlzIGxvYWRlZCBlbHNlIEZhbHNlLgotICAgICIiIgotICAgIHN0YXRlID0gc2VsZi5fYWQuYWRiLnNoZWxsKCdnZXRwcm9wIGdzbS5zaW0uc3RhdGUnKS5kZWNvZGUoKS5zdHJpcCgpCi0gICAgcmV0dXJuIHN0YXRlID09ICdMT0FERUQnCi0KLSAgZGVmIGlzX3BhY2thZ2VfaW5zdGFsbGVkKHNlbGYsIHBhY2thZ2VfbmFtZTogc3RyKSAtPiBib29sOgotICAgICIiIkNoZWNrcyBpZiBhIHBhY2thZ2UgaXMgaW5zdGFsbGVkLgotCi0gICAgQXJnczoKLSAgICAgIHBhY2thZ2VfbmFtZTogc3RyaW5nLCBhIHBhY2thZ2UgdG8gYmUgY2hlY2tlZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBlbHNlIEZhbHNlLgotICAgICIiIgotICAgICMgVGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGlmIHJlc3VsdCBpcyAxLCBub3QgaW5zdGFsbGVkIGlmIHJlc3VsdCBpcyAwLgotICAgIHJlc3VsdCA9IGludChzZWxmLl9hZC5hZGIuc2hlbGwoJ3BtIGxpc3QgcGFja2FnZXMgfCBncmVwIC1pICVzJCB8IHdjIC1sJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWUpKQotICAgIHJldHVybiBib29sKHJlc3VsdCkKLQotICBkZWYgY29ubmVjdF93aXRoX3JmY29tbShzZWxmLCBvdGhlcl9hZDogQW5kcm9pZERldmljZSkgLT4gYm9vbDoKLSAgICAiIiJFc3RhYmxpc2hlcyBhbiBSRkNPTU0gY29ubmVjdGlvbiB3aXRoIG90aGVyIGFuZHJvaWQgZGV2aWNlLgotCi0gICAgQ29ubmVjdHMgdGhpcyBhbmRyb2lkIGRldmljZSAoYXMgYSBjbGllbnQpIHRvIHRoZSBvdGhlciBhbmRyb2lkIGRldmljZQotICAgIChhcyBhIHNlcnZlcikuCi0KLSAgICBBcmdzOgotICAgICAgb3RoZXJfYWQ6IHRoZSBBbmRyb2lkIGRldmljZSBhY2NlcHRpbmcgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGlzIGRldmljZS4KLQotICAgIFJldHVybnM6Ci0gICAgICAgIFRydWUgaWYgY29ubmVjdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgRmFsc2UgaWYgdW5zdWNjZXNzZnVsLgotICAgICIiIgotICAgIHNlcnZlcl9hZGRyZXNzID0gb3RoZXJfYWQuc2w0YS5ibHVldG9vdGhHZXRMb2NhbEFkZHJlc3MoKQotICAgIGxvZ2dpbmcuaW5mbygnUGFpcmluZyBhbmQgY29ubmVjdGluZyBkZXZpY2VzJykKLSAgICBpZiBub3Qgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhEaXNjb3ZlckFuZEJvbmQoc2VydmVyX2FkZHJlc3MpOgotICAgICAgbG9nZ2luZy5pbmZvKCdGYWlsZWQgdG8gcGFpciBhbmQgY29ubmVjdCBkZXZpY2VzJykKLSAgICAgIHJldHVybiBGYWxzZQotCi0gICAgIyBDcmVhdGUgUkZDT01NIGNvbm5lY3Rpb24KLSAgICBsb2dnaW5nLmluZm8oJ2VzdGFibGlzaGluZyBSRkNPTU0gY29ubmVjdGlvbicpCi0gICAgcmV0dXJuIHNlbGYub3JjaGVzdHJhdGVfcmZjb21tX2Nvbm5lY3Rpb24ob3RoZXJfYWQpCi0KLSAgZGVmIG9yY2hlc3RyYXRlX3JmY29tbV9jb25uZWN0aW9uKAotICAgICAgc2VsZiwKLSAgICAgIG90aGVyX2FkOiBBbmRyb2lkRGV2aWNlLAotICAgICAgYWNjZXB0X3RpbWVvdXRfbXM6IGludCA9IGJ0X2NvbnN0YW50cy5ERUZBVUxUX1JGQ09NTV9USU1FT1VUX01TLAotICAgICAgdXVpZDogT3B0aW9uYWxbVGV4dF0gPSBOb25lKSAtPiBib29sOgotICAgICIiIlNldHMgdXAgdGhlIFJGQ09NTSBjb25uZWN0aW9uIHRvIGFub3RoZXIgYW5kcm9pZCBkZXZpY2UuCi0KLSAgICBJdCBzZXRzIHVwIHRoZSBjb25uZWN0aW9uIHdpdGggYSBCbHVldG9vdGggU29ja2V0IGNvbm5lY3Rpb24gd2l0aCBvdGhlcgotICAgIGRldmljZS4KLQotICAgIEFyZ3M6Ci0gICAgICAgIG90aGVyX2FkOiB0aGUgQW5kcm9pZCBkZXZpY2UgYWNjZXB0aW5nIHRoZSBjb25uZWN0aW9uIGZyb20gdGhpcyBkZXZpY2UuCi0gICAgICAgIGFjY2VwdF90aW1lb3V0X21zOiB0aGUgdGltZW91dCBpbiBtcyBmb3IgdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgIHV1aWQ6IHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyLgotCi0gICAgUmV0dXJuczoKLSAgICAgICAgVHJ1ZSBpZiBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsLCBGYWxzZSBpZiB1bnN1Y2Nlc3NmdWwuCi0gICAgIiIiCi0gICAgaWYgdXVpZCBpcyBOb25lOgotICAgICAgdXVpZCA9IGJ0X2NvbnN0YW50cy5CVF9SRkNPTU1fVVVJRFNbJ2RlZmF1bHRfdXVpZCddCi0gICAgb3RoZXJfYWQuc2w0YS5ibHVldG9vdGhTdGFydFBhaXJpbmdIZWxwZXIoKQotICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoU3RhcnRQYWlyaW5nSGVscGVyKCkKLSAgICBvdGhlcl9hZC5zbDRhLmJsdWV0b290aFNvY2tldENvbm5CZWdpbkFjY2VwdFRocmVhZFV1aWQodXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3RpbWVvdXRfbXMpCi0gICAgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhTb2NrZXRDb25uQmVnaW5Db25uZWN0VGhyZWFkVXVpZCgKLSAgICAgICAgb3RoZXJfYWQuc2w0YS5ibHVldG9vdGhHZXRMb2NhbEFkZHJlc3MoKSwgdXVpZCkKLQotICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkgKyBidF9jb25zdGFudHMuQlRfREVGQVVMVF9USU1FT1VUX1NFQ09ORFMKLSAgICB0ZXN0X3Jlc3VsdCA9IFRydWUKLQotICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZW5kX3RpbWU6Ci0gICAgICBudW1iZXJfc29ja2V0X2Nvbm5lY3Rpb25zID0gbGVuKAotICAgICAgICAgIG90aGVyX2FkLnNsNGEuYmx1ZXRvb3RoU29ja2V0Q29ubkFjdGl2ZUNvbm5lY3Rpb25zKCkpCi0gICAgICBjb25uZWN0ZWQgPSBudW1iZXJfc29ja2V0X2Nvbm5lY3Rpb25zID4gMAotICAgICAgaWYgY29ubmVjdGVkOgotICAgICAgICB0ZXN0X3Jlc3VsdCA9IFRydWUKLSAgICAgICAgb3RoZXJfYWQubG9nLmluZm8oJ0JsdWV0b290aCBzb2NrZXQgQ2xpZW50IENvbm5lY3Rpb24gQWN0aXZlJykKLSAgICAgICAgYnJlYWsKLSAgICAgIGVsc2U6Ci0gICAgICAgIHRlc3RfcmVzdWx0ID0gRmFsc2UKLSAgICAgIHRpbWUuc2xlZXAoMSkKLSAgICBpZiBub3QgdGVzdF9yZXN1bHQ6Ci0gICAgICBvdGhlcl9hZC5sb2cuZXJyb3IoJ0ZhaWxlZCB0byBlc3RhYmxpc2ggYSBCbHVldG9vdGggc29ja2V0IGNvbm5lY3Rpb24nKQotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKLQotICBkZWYgd2FpdF9mb3JfZGlzY292ZXJ5X3N1Y2Nlc3MoCi0gICAgICBzZWxmLAotICAgICAgbWFjX2FkZHJlc3M6IHN0ciwKLSAgICAgIHRpbWVvdXQ6IGZsb2F0ID0gMzApIC0+IGZsb2F0OgotICAgICIiIldhaXRzIGZvciBhIGRldmljZSB0byBiZSBkaXNjb3ZlcmVkIGJ5IEFuZHJvaWREZXZpY2UuCi0KLSAgICBBcmdzOgotICAgICAgbWFjX2FkZHJlc3M6IFRoZSBCbHVldG9vdGggbWFjIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwgZGV2aWNlLgotICAgICAgdGltZW91dDogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgZGV2aWNlIGRpc2NvdmVyeS4KLQotICAgIFJldHVybnM6Ci0gICAgICBkaXNjb3ZlcnlfdGltZTogVGhlIHRpbWUgaXQgdGFrZXMgdG8gcGFpciBpbiBzZWNvbmRzLgotCi0gICAgUmFpc2VzOgotICAgICAgRGlzY292ZXJ5RXJyb3IKLSAgICAiIiIKLSAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICB0cnk6Ci0gICAgICBzZWxmLl9hZC5lZC53YWl0X2Zvcl9ldmVudCgnRGlzY292ZXJ5JXMnICUgbWFjX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogeFsnZGF0YSddWydTdGF0dXMnXSwgdGltZW91dCkKLSAgICAgIGRpc2NvdmVyeV90aW1lID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCi0gICAgICByZXR1cm4gZGlzY292ZXJ5X3RpbWUKLQotICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKLSAgICAgIHJhaXNlIERpc2NvdmVyeUVycm9yKCdGYWlsZWQgdG8gZGlzY292ZXIgZGV2aWNlICVzIGFmdGVyICVkIHNlY29uZHMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNfYWRkcmVzcywgdGltZW91dCkpCi0KLSAgZGVmIHdhaXRfZm9yX3BhaXJpbmdfc3VjY2VzcygKLSAgICAgIHNlbGYsCi0gICAgICBtYWNfYWRkcmVzczogc3RyLAotICAgICAgdGltZW91dDogZmxvYXQgPSAzMCkgLT4gZmxvYXQ6Ci0gICAgIiIiV2FpdHMgZm9yIGEgZGV2aWNlIHRvIHBhaXIgd2l0aCB0aGUgQW5kcm9pZERldmljZS4KLQotICAgIEFyZ3M6Ci0gICAgICBtYWNfYWRkcmVzczogVGhlIEJsdWV0b290aCBtYWMgYWRkcmVzcyBvZiB0aGUgcGVyaXBoZXJhbCBkZXZpY2UuCi0gICAgICB0aW1lb3V0OiBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgZGV2aWNlcyB0byBwYWlyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIHBhaXJpbmdfdGltZTogVGhlIHRpbWUgaXQgdGFrZXMgdG8gcGFpciBpbiBzZWNvbmRzLgotCi0gICAgUmFpc2VzOgotICAgICAgQ29udHJvbGxlckVycm9yCi0gICAgIiIiCi0gICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgdHJ5OgotICAgICAgc2VsZi5fYWQuZWQud2FpdF9mb3JfZXZlbnQoJ0JvbmQlcycgJSBtYWNfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiB4WydkYXRhJ11bJ1N0YXR1cyddLCB0aW1lb3V0KQotICAgICAgcGFpcmluZ190aW1lID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCi0gICAgICByZXR1cm4gcGFpcmluZ190aW1lCi0KLSAgICBleGNlcHQgcXVldWUuRW1wdHk6Ci0gICAgICByYWlzZSBzaWduYWxzLkNvbnRyb2xsZXJFcnJvcigKLSAgICAgICAgICAnRmFpbGVkIHRvIGJvbmQgd2l0aCBkZXZpY2UgJXMgYWZ0ZXIgJWQgc2Vjb25kcycgJQotICAgICAgICAgIChtYWNfYWRkcmVzcywgdGltZW91dCkpCi0KLSAgZGVmIHdhaXRfZm9yX2Nvbm5lY3Rpb25fc3VjY2VzcygKLSAgICAgIHNlbGYsCi0gICAgICBtYWNfYWRkcmVzczogc3RyLAotICAgICAgdGltZW91dDogaW50ID0gMzApIC0+IGZsb2F0OgotICAgICIiIldhaXRzIGZvciBhIGRldmljZSB0byBjb25uZWN0IHdpdGggdGhlIEFuZHJvaWREZXZpY2UuCi0KLSAgICBBcmdzOgotICAgICAgbWFjX2FkZHJlc3M6IFRoZSBCbHVldG9vdGggbWFjIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwgZGV2aWNlLgotICAgICAgdGltZW91dDogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGRldmljZXMgdG8gY29ubmVjdC4KLQotICAgIFJldHVybnM6Ci0gICAgICBjb25uZWN0aW9uX3RpbWU6IFRoZSB0aW1lIGl0IHRha2VzIHRvIGNvbm5lY3QgaW4gc2Vjb25kcy4KLQotICAgIFJhaXNlczoKLSAgICAgIENvbnRyb2xsZXJFcnJvcgotICAgICIiIgotICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgIGVuZF90aW1lID0gc3RhcnRfdGltZSArIHRpbWVvdXQKLSAgICB3aGlsZSB0aW1lLnRpbWUoKSA8IGVuZF90aW1lOgotICAgICAgaWYgc2VsZi5faXNfZGV2aWNlX2Nvbm5lY3RlZChtYWNfYWRkcmVzcyk6Ci0gICAgICAgIGNvbm5lY3Rpb25fdGltZSA9ICh0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygnQ29ubmVjdGVkIGRldmljZSAlcyBpbiAlZCBzZWNvbmRzJywgbWFjX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3RpbWUpCi0gICAgICAgIHJldHVybiBjb25uZWN0aW9uX3RpbWUKLQotICAgIHJhaXNlIHNpZ25hbHMuQ29udHJvbGxlckVycm9yKAotICAgICAgICAnRmFpbGVkIHRvIGNvbm5lY3QgZGV2aWNlIHdpdGhpbiAlZCBzZWNvbmRzLicgJSB0aW1lb3V0KQotCi0gIGRlZiBmYWN0b3J5X3Jlc2V0X2JsdWV0b290aChzZWxmKSAtPiBOb25lOgotICAgICIiIkZhY3RvcnkgcmVzZXRzIEJsdWV0b290aCBvbiBhbiBBbmRyb2lkRGV2aWNlLiIiIgotCi0gICAgbG9nZ2luZy5pbmZvKCdGYWN0b3J5IHJlc2V0dGluZyBCbHVldG9vdGggZm9yIEFuZHJvaWREZXZpY2UuJykKLSAgICBzZWxmLl9hZC5zbDRhLmJsdWV0b290aFRvZ2dsZVN0YXRlKFRydWUpCi0gICAgcGFpcmVkX2RldmljZXMgPSBzZWxmLl9hZC5tYnMuYnRHZXRQYWlyZWREZXZpY2VzKCkKLSAgICBmb3IgZGV2aWNlIGluIHBhaXJlZF9kZXZpY2VzOgotICAgICAgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhVbmJvbmQoZGV2aWNlWydBZGRyZXNzJ10pCi0gICAgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhGYWN0b3J5UmVzZXQoKQotICAgIHNlbGYuX3dhaXRfZm9yX2JsdWV0b290aF9tYW5hZ2VyX3N0YXRlKCkKLSAgICBzZWxmLl9hZC5zbDRhLmJsdWV0b290aFRvZ2dsZVN0YXRlKFRydWUpCi0KLSAgZGVmIGdldF9kZXZpY2VfaW5mbyhzZWxmKSAtPiBEaWN0W3N0ciwgQW55XToKLSAgICAiIiJHZXRzIHRoZSBjb25maWd1cmF0aW9uIGluZm8gb2YgYW4gQW5kcm9pZERldmljZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBkaWN0LCBBIGRpY3Rpb25hcnkgbWFwcGluZyBtZXRyaWMga2V5cyB0byB0aGVpciByZXNwZWN0aXZlIHZhbHVlcy4KLSAgICAiIiIKLQotICAgIGRldmljZV9pbmZvID0gewotICAgICAgICAnZGV2aWNlX2NsYXNzJzoKLSAgICAgICAgICAgICdBbmRyb2lkRGV2aWNlJywKLSAgICAgICAgJ2RldmljZV9tb2RlbCc6Ci0gICAgICAgICAgICBzZWxmLl9hZC5kZXZpY2VfaW5mb1snbW9kZWwnXSwKLSAgICAgICAgJ2hhcmR3YXJlX3ZlcnNpb24nOgotICAgICAgICAgICAgc2VsZi5fYWQuYWRiLmdldHByb3AoJ3JvLmJvb3QuaGFyZHdhcmUucmV2aXNpb24nKSwKLSAgICAgICAgJ3NvZnR3YXJlX3ZlcnNpb24nOgotICAgICAgICAgICAgc2VsZi5fYWQuYnVpbGRfaW5mb1snYnVpbGRfaWQnXSwKLSAgICAgICAgJ2FuZHJvaWRfYnVpbGRfdHlwZSc6Ci0gICAgICAgICAgICBzZWxmLl9hZC5idWlsZF9pbmZvWydidWlsZF90eXBlJ10sCi0gICAgICAgICdhbmRyb2lkX2J1aWxkX251bWJlcic6Ci0gICAgICAgICAgICBzZWxmLl9hZC5hZGIuZ2V0cHJvcCgncm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbCcpLAotICAgICAgICAnYW5kcm9pZF9yZWxlYXNlX2lkJzoKLSAgICAgICAgICAgIHNlbGYuX2FkLmJ1aWxkX2luZm9bJ2J1aWxkX2lkJ10KLSAgICB9Ci0KLSAgICByZXR1cm4gZGV2aWNlX2luZm8KLQotICBkZWYgcGFpcl9hbmRfY29ubmVjdF9ibHVldG9vdGgoCi0gICAgICBzZWxmLAotICAgICAgbWFjX2FkZHJlc3M6IHN0ciwKLSAgICAgIGF0dGVtcHRzOiBpbnQgPSAzLAotICAgICAgZW5hYmxlX3BhaXJpbmdfcmV0cnk6IGJvb2wgPSBUcnVlKSAtPiBUdXBsZVtmbG9hdCwgZmxvYXRdOgotICAgICIiIlBhaXJzIGFuZCBjb25uZWN0cyBhbiBBbmRyb2lkRGV2aWNlIHdpdGggYSBwZXJpcGhlcmFsIEJsdWV0b290aCBkZXZpY2UuCi0KLSAgICBFbnN1cmVzIHRoYXQgYW4gQW5kcm9pZERldmljZSBpcyBwYWlyZWQgYW5kIGNvbm5lY3RlZCB0byBhIHBlcmlwaGVyYWwKLSAgICBkZXZpY2UuIElmIHRoZSBkZXZpY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCwgZG9lcyBub3RoaW5nLiBJZgotICAgIHRoZSBkZXZpY2VzIGFyZSBwYWlyZWQgYnV0IG5vdCBjb25uZWN0ZWQsIGNvbm5lY3RzIHRoZSBkZXZpY2VzLiBJZiB0aGUKLSAgICBkZXZpY2VzIGFyZSBuZWl0aGVyIHBhaXJlZCBub3IgY29ubmVjdGVkLCB0aGlzIG1ldGhvZCBwYWlycyBhbmQgY29ubmVjdHMgdGhlCi0gICAgZGV2aWNlcy4KLQotICAgIFN1Z2dlc3RzIHRvIHVzZSB0aGUgcmV0cnkgbWVjaGFuaXNtIG9uIERpc2NvdmVyeSBiZWNhdXNlIGl0IHNvbWV0aW1lcyBmYWlsCi0gICAgZXZlbiBpZiB0aGUgZGV2aWNlcyBhcmUgdGVzdGluZyBpbiBzaGllbGRpbmcuIEluIG9yZGVyIHRvIGF2b2lkIHRoZSByZW1vdGUKLSAgICBkZXZpY2UgbWF5IG5vdCByZXNwb25kIGEgaW5jb21pbmcgcGFpcmluZyByZXF1ZXN0IGNhdXNpbmcgdG8gYm9uZGluZyBmYWlsdXJlCi0gICAgLCBpdCBzdWdnZXN0cyB0byByZXRyeSBwYWlyaW5nIHRvby4KLQotICAgIEFyZ3M6Ci0gICAgICBtYWNfYWRkcmVzczogVGhlIEJsdWV0b290aCBtYWMgYWRkcmVzcyBvZiB0aGUgcGVyaXBoZXJhbCBkZXZpY2UuCi0gICAgICBhdHRlbXB0czogTnVtYmVyIG9mIGF0dGVtcHRzIHRvIGRpc2NvdmVyIGFuZCBwYWlyIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgIGVuYWJsZV9wYWlyaW5nX3JldHJ5OiBCb29sIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgcmV0cnkgbWVjaGFuaXNtIGlzIHVzZWQKLSAgICAgICAgICBvbiBib25kaW5nIGZhaWx1cmUsIGl0J3MgZW5hYmxlZCBpZiBUcnVlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIHBhaXJpbmdfdGltZTogVGhlIHRpbWUsIGluIHNlY29uZHMsIGl0IHRha2VzIHRvIHBhaXIgdGhlIGRldmljZXMuCi0gICAgICBjb25uZWN0aW9uX3RpbWU6IFRoZSB0aW1lLCBpbiBzZWNvbmRzLCBpdCB0YWtlcyB0byBjb25uZWN0IHRoZQotICAgICAgZGV2aWNlcyBhZnRlciBwYWlyaW5nIGlzIGNvbXBsZXRlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIERpc2NvdmVyeUVycm9yOiBSYWlzZWQgaWYgZmFpbGVkIHRvIGRpc2NvdmVyIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgIENvbnRyb2xsZXJFcnJvcjogUmFpc2VkIGlmIGZhaWxlZCB0byBib25kIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAiIiIKLQotICAgIGNvbm5lY3RlZCA9IHNlbGYuX2lzX2RldmljZV9jb25uZWN0ZWQobWFjX2FkZHJlc3MpCi0gICAgcGFpcmluZ190aW1lID0gMAotICAgIGNvbm5lY3Rpb25fdGltZSA9IDAKLSAgICBpZiBjb25uZWN0ZWQ6Ci0gICAgICBsb2dnaW5nLmluZm8oJ0RldmljZSAlcyBhbHJlYWR5IHBhaXJlZCBhbmQgY29ubmVjdGVkJywgbWFjX2FkZHJlc3MpCi0gICAgICByZXR1cm4gcGFpcmluZ190aW1lLCBjb25uZWN0aW9uX3RpbWUKLQotICAgIHBhaXJlZF9kZXZpY2VzID0gW2RldmljZVsnYWRkcmVzcyddIGZvciBkZXZpY2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZC5zbDRhLmJsdWV0b290aEdldEJvbmRlZERldmljZXMoKV0KLSAgICBpZiBtYWNfYWRkcmVzcyBpbiBwYWlyZWRfZGV2aWNlczoKLSAgICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoQ29ubmVjdEJvbmRlZChtYWNfYWRkcmVzcykKLSAgICAgIHJldHVybiBwYWlyaW5nX3RpbWUsIHNlbGYud2FpdF9mb3JfY29ubmVjdGlvbl9zdWNjZXNzKG1hY19hZGRyZXNzKQotCi0gICAgbG9nZ2luZy5pbmZvKCdJbml0aWF0ZSBwYWlyaW5nIHRvIHRoZSBkZXZpY2UgIiVzIi4nLCBtYWNfYWRkcmVzcykKLSAgICBmb3IgaSBpbiByYW5nZShhdHRlbXB0cyk6Ci0gICAgICBzZWxmLl9hZC5zbDRhLmJsdWV0b290aERpc2NvdmVyQW5kQm9uZChtYWNfYWRkcmVzcykKLSAgICAgIHRyeToKLSAgICAgICAgc2VsZi53YWl0X2Zvcl9kaXNjb3Zlcnlfc3VjY2VzcyhtYWNfYWRkcmVzcykKLSAgICAgICAgcGFpcmluZ190aW1lID0gc2VsZi53YWl0X2Zvcl9wYWlyaW5nX3N1Y2Nlc3MobWFjX2FkZHJlc3MpCi0gICAgICAgIGJyZWFrCi0gICAgICBleGNlcHQgRGlzY292ZXJ5RXJyb3I6Ci0gICAgICAgIGlmIGkgKyAxIDwgYXR0ZW1wdHM6Ci0gICAgICAgICAgbG9nZ2luZy5lcnJvcigKLSAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBmaW5kIHRoZSBkZXZpY2UgIiVzIiBvbiBBdHRlbXB0ICVkLiAnCi0gICAgICAgICAgICAgICdSZXRyeWluZyBkaXNjb3ZlcnkuLi4nLCBtYWNfYWRkcmVzcywgaSArIDEpCi0gICAgICAgICAgY29udGludWUKLSAgICAgICAgcmFpc2UgRGlzY292ZXJ5RXJyb3IoJ0ZhaWxlZCB0byBmaW5kIHRoZSBkZXZpY2UgIiVzIi4nICUgbWFjX2FkZHJlc3MpCi0gICAgICBleGNlcHQgc2lnbmFscy5Db250cm9sbGVyRXJyb3I6Ci0gICAgICAgIGlmIGkgKyAxIDwgYXR0ZW1wdHMgYW5kIGVuYWJsZV9wYWlyaW5nX3JldHJ5OgotICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoCi0gICAgICAgICAgICAgICdGYWlsZWQgdG8gYm9uZCB0aGUgZGV2aWNlICIlcyIgb24gQXR0ZW1wdCAlZC4gJwotICAgICAgICAgICAgICAnUmV0cnlpbmcgcGFpcmluZy4uLicsIG1hY19hZGRyZXNzLCBpICsgMSkKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICByYWlzZSBzaWduYWxzLkNvbnRyb2xsZXJFcnJvcignRmFpbGVkIHRvIGJvbmQgdGhlIGRldmljZSAiJXMiLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNfYWRkcmVzcykKLQotICAgIGNvbm5lY3Rpb25fdGltZSA9IHNlbGYud2FpdF9mb3JfY29ubmVjdGlvbl9zdWNjZXNzKG1hY19hZGRyZXNzKQotICAgIHJldHVybiBwYWlyaW5nX3RpbWUsIGNvbm5lY3Rpb25fdGltZQotCi0gIGRlZiBkaXNjb25uZWN0X2JsdWV0b290aCgKLSAgICAgIHNlbGYsCi0gICAgICBtYWNfYWRkcmVzczogc3RyLAotICAgICAgdGltZW91dDogZmxvYXQgPSAzMCkgLT4gZmxvYXQ6Ci0gICAgIiIiRGlzY29ubmVjdHMgQmx1ZXRvb3RoIGJldHdlZW4gYW4gQW5kcm9pZERldmljZSBhbmQgcGVyaXBoZXJhbCBkZXZpY2UuCi0KLSAgICBBcmdzOgotICAgICAgbWFjX2FkZHJlc3M6IFRoZSBCbHVldG9vdGggbWFjIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwgZGV2aWNlLgotICAgICAgdGltZW91dDogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGRldmljZXMgdG8gZGlzY29ubmVjdCB0aGUKLSAgICAgIHBlcmlwaGVyYWwgZGV2aWNlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIGRpc2Nvbm5lY3Rpb25fdGltZTogVGhlIHRpbWUsIGluIHNlY29uZHMsIGl0IHRha2VzIHRvIGRpc2Nvbm5lY3QgdGhlCi0gICAgICBwZXJpcGhlcmFsIGRldmljZS4KLQotICAgIFJhaXNlczoKLSAgICAgIENvbnRyb2xsZXJFcnJvcjogUmFpc2VkIGlmIGZhaWxlZCB0byBkaXNjb25uZWN0IHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAiIiIKLSAgICBpZiBub3Qgc2VsZi5faXNfZGV2aWNlX2Nvbm5lY3RlZChtYWNfYWRkcmVzcyk6Ci0gICAgICBsb2dnaW5nLmluZm8oJ0RldmljZSAlcyBhbHJlYWR5IGRpc2Nvbm5lY3RlZCcsIG1hY19hZGRyZXNzKQotICAgICAgcmV0dXJuIDAKLQotICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoRGlzY29ubmVjdENvbm5lY3RlZChtYWNfYWRkcmVzcykKLSAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpICsgdGltZW91dAotICAgIHdoaWxlIHRpbWUudGltZSgpIDwgZW5kX3RpbWU6Ci0gICAgICBjb25uZWN0ZWQgPSBzZWxmLl9pc19kZXZpY2VfY29ubmVjdGVkKG1hY19hZGRyZXNzKQotICAgICAgaWYgbm90IGNvbm5lY3RlZDoKLSAgICAgICAgbG9nZ2luZy5pbmZvKCdEZXZpY2UgJXMgZGlzY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4nLCBtYWNfYWRkcmVzcykKLSAgICAgICAgcmV0dXJuIHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQotCi0gICAgcmFpc2Ugc2lnbmFscy5Db250cm9sbGVyRXJyb3IoCi0gICAgICAgICdGYWlsZWQgdG8gZGlzY29ubmVjdCBkZXZpY2Ugd2l0aGluICVkIHNlY29uZHMuJyAlIHRpbWVvdXQpCi0KLSAgZGVmIGNvbm5lY3RfYmx1ZXRvb3RoKHNlbGYsIG1hY19hZGRyZXNzOiBzdHIsIHRpbWVvdXQ6IGZsb2F0ID0gMzApIC0+IGZsb2F0OgotICAgICIiIkNvbm5lY3RzIEJsdWV0b290aCBiZXR3ZWVuIGFuIEFuZHJvaWREZXZpY2UgYW5kIHBlcmlwaGVyYWwgZGV2aWNlLgotCi0gICAgQXJnczoKLSAgICAgIG1hY19hZGRyZXNzOiBUaGUgQmx1ZXRvb3RoIG1hYyBhZGRyZXNzIG9mIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgIHRpbWVvdXQ6IE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBkZXZpY2VzIHRvIGNvbm5lY3QgdGhlCi0gICAgICBwZXJpcGhlcmFsIGRldmljZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBjb25uZWN0aW9uX3RpbWU6IFRoZSB0aW1lLCBpbiBzZWNvbmRzLCBpdCB0YWtlcyB0byBjb25uZWN0IHRoZQotICAgICAgcGVyaXBoZXJhbCBkZXZpY2UuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBDb250cm9sbGVyRXJyb3I6IFJhaXNlZCBpZiBmYWlsZWQgdG8gY29ubmVjdCB0aGUgcGVyaXBoZXJhbCBkZXZpY2UuCi0gICAgIiIiCi0gICAgaWYgc2VsZi5faXNfZGV2aWNlX2Nvbm5lY3RlZChtYWNfYWRkcmVzcyk6Ci0gICAgICBsb2dnaW5nLmluZm8oJ0RldmljZSAlcyBhbHJlYWR5IGNvbm5lY3RlZCcsIG1hY19hZGRyZXNzKQotICAgICAgcmV0dXJuIDAKLQotICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoQ29ubmVjdEJvbmRlZChtYWNfYWRkcmVzcykKLSAgICBjb25uZWN0X3RpbWUgPSBzZWxmLndhaXRfZm9yX2Nvbm5lY3Rpb25fc3VjY2VzcyhtYWNfYWRkcmVzcykKLQotICAgIHJldHVybiBjb25uZWN0X3RpbWUKLQotICBkZWYgYWN0aXZhdGVfcGFpcmluZ19tb2RlKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiQWN0aXZhdGVzIHBhaXJpbmcgbW9kZSBvbiBhbiBBbmRyb2lkRGV2aWNlLiIiIgotICAgIGxvZ2dpbmcuaW5mbygnQWN0aXZhdGluZyBwYWlyaW5nIG1vZGUgb24gQW5kcm9pZERldmljZS4nKQotICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoTWFrZURpc2NvdmVyYWJsZSgpCi0gICAgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhTdGFydFBhaXJpbmdIZWxwZXIoKQotCi0gIGRlZiBhY3RpdmF0ZV9ibGVfcGFpcmluZ19tb2RlKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiQWN0aXZhdGVzIEJMRSBwYWlyaW5nIG1vZGUgb24gYW4gQW5kcm9pZERldmljZS4iIiIKLSAgICBzZWxmLmJsZV9hZHZlcnRpc2VfY2FsbGJhY2sgPSBzZWxmLl9hZC5zbDRhLmJsZUdlbkJsZUFkdmVydGlzZUNhbGxiYWNrKCkKLSAgICBzZWxmLl9hZC5zbDRhLmJsZVNldEFkdmVydGlzZURhdGFJbmNsdWRlRGV2aWNlTmFtZShUcnVlKQotICAgICMgU2V0cyBhZHZlcnRpc2UgbW9kZSB0byBsb3cgbGF0ZW5jeS4KLSAgICBzZWxmLl9hZC5zbDRhLmJsZVNldEFkdmVydGlzZVNldHRpbmdzQWR2ZXJ0aXNlTW9kZSgKLSAgICAgICAgYnRfY29uc3RhbnRzLkJsZUFkdmVydGlzZVNldHRpbmdzTW9kZS5MT1dfTEFURU5DWSkKLSAgICBzZWxmLl9hZC5zbDRhLmJsZVNldEFkdmVydGlzZVNldHRpbmdzSXNDb25uZWN0YWJsZShUcnVlKQotICAgICMgU2V0cyBUWCBwb3dlciBsZXZlbCB0byBIaWdoLgotICAgIHNlbGYuX2FkLnNsNGEuYmxlU2V0QWR2ZXJ0aXNlU2V0dGluZ3NUeFBvd2VyTGV2ZWwoCi0gICAgICAgIGJ0X2NvbnN0YW50cy5CbGVBZHZlcnRpc2VTZXR0aW5nc1R4UG93ZXIuSElHSCkKLSAgICBhZHZlcnRpc2VfZGF0YSA9IHNlbGYuX2FkLnNsNGEuYmxlQnVpbGRBZHZlcnRpc2VEYXRhKCkKLSAgICBhZHZlcnRpc2Vfc2V0dGluZ3MgPSBzZWxmLl9hZC5zbDRhLmJsZUJ1aWxkQWR2ZXJ0aXNlU2V0dGluZ3MoKQotICAgIGxvZ2dpbmcuaW5mbygnQWN0aXZhdGluZyBCTEUgcGFpcmluZyBtb2RlIG9uIEFuZHJvaWREZXZpY2UuJykKLSAgICBzZWxmLl9hZC5zbDRhLmJsZVN0YXJ0QmxlQWR2ZXJ0aXNpbmcoCi0gICAgICAgIHNlbGYuYmxlX2FkdmVydGlzZV9jYWxsYmFjaywgYWR2ZXJ0aXNlX2RhdGEsIGFkdmVydGlzZV9zZXR0aW5ncykKLQotICBkZWYgZGVhY3RpdmF0ZV9ibGVfcGFpcmluZ19tb2RlKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiRGVhY3RpdmF0ZXMgQkxFIHBhaXJpbmcgbW9kZSBvbiBhbiBBbmRyb2lkRGV2aWNlLiIiIgotICAgIGlmIG5vdCBzZWxmLmJsZV9hZHZlcnRpc2VfY2FsbGJhY2s6Ci0gICAgICBzZWxmLl9hZC5sb2cuZGVidWcoJ0JMRSBwYWlyaW5nIG1vZGUgaXMgbm90IGFjdGl2YXRlZC4nKQotICAgICAgcmV0dXJuCi0gICAgbG9nZ2luZy5pbmZvKCdEZWFjdGl2YXRpbmcgQkxFIHBhaXJpbmcgbW9kZSBvbiBBbmRyb2lkRGV2aWNlLicpCi0gICAgc2VsZi5fYWQuc2w0YS5ibGVTdG9wQmxlQWR2ZXJ0aXNpbmcoc2VsZi5ibGVfYWR2ZXJ0aXNlX2NhbGxiYWNrKQotICAgIHNlbGYuYmxlX2FkdmVydGlzZV9jYWxsYmFjayA9IE5vbmUKLQotICBkZWYgZ2V0X2JsdWV0b290aF9tYWNfYWRkcmVzcyhzZWxmKSAtPiBzdHI6Ci0gICAgIiIiR2V0cyBCbHVldG9vdGggbWFjIGFkZHJlc3Mgb2YgYW4gQW5kcm9pZERldmljZS4iIiIKLSAgICBsb2dnaW5nLmluZm8oJ0dldHRpbmcgQmx1ZXRvb3RoIG1hYyBhZGRyZXNzIGZvciBBbmRyb2lkRGV2aWNlLicpCi0gICAgbWFjX2FkZHJlc3MgPSBzZWxmLl9hZC5zbDRhLmJsdWV0b290aEdldExvY2FsQWRkcmVzcygpCi0gICAgbG9nZ2luZy5pbmZvKCdCbHVldG9vdGggbWFjIGFkZHJlc3Mgb2YgQW5kcm9pZERldmljZTogJXMnLCBtYWNfYWRkcmVzcykKLSAgICByZXR1cm4gbWFjX2FkZHJlc3MKLQotICBkZWYgc2Nhbl9hbmRfZ2V0X2JsZV9kZXZpY2VfYWRkcmVzcygKLSAgICAgIHNlbGYsCi0gICAgICBkZXZpY2VfbmFtZTogc3RyLAotICAgICAgdGltZW91dF9zZWM6IGZsb2F0ID0gMzApIC0+IHN0cjoKLSAgICAiIiJTZWFyY2hzIGEgQkxFIGRldmljZSBieSBCTEUgc2Nhbm5lciBhbmQgcmV0dXJucyBpdCdzIEJMRSBtYWMgYWRkcmVzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBkZXZpY2VfbmFtZTogc3RyaW5nLCB0aGUgbmFtZSBvZiBCTEUgZGV2aWNlLgotICAgICAgdGltZW91dF9zZWM6IGludCwgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgZmluZGluZyB0aGUgYWR2ZXJ0aXNlbWVudC4KLQotICAgIFJldHVybnM6Ci0gICAgICBTdHJpbmcgb2YgdGhlIEJMRSBtYWMgYWRkcmVzcy4KLQotICAgIFJhaXNlczoKLSAgICAgIENvbnRyb2xsZXJFcnJvcjogUmFpc2VkIGlmIGZhaWxlZCB0byBnZXQgdGhlIEJMRSBkZXZpY2UgYWRkcmVzcwotICAgICIiIgotICAgIGZpbHRlcl9saXN0ID0gc2VsZi5fYWQuc2w0YS5ibGVHZW5GaWx0ZXJMaXN0KCkKLSAgICBzY2FuX3NldHRpbmdzID0gc2VsZi5fYWQuc2w0YS5ibGVCdWlsZFNjYW5TZXR0aW5nKCkKLSAgICBzY2FuX2NhbGxiYWNrID0gc2VsZi5fYWQuc2w0YS5ibGVHZW5TY2FuQ2FsbGJhY2soKQotICAgIHNlbGYuX2FkLnNsNGEuYmxlU2V0U2NhbkZpbHRlckRldmljZU5hbWUoZGV2aWNlX25hbWUpCi0gICAgc2VsZi5fYWQuc2w0YS5ibGVCdWlsZFNjYW5GaWx0ZXIoZmlsdGVyX2xpc3QpCi0gICAgc2VsZi5fYWQuc2w0YS5ibGVTdGFydEJsZVNjYW4oZmlsdGVyX2xpc3QsIHNjYW5fc2V0dGluZ3MsIHNjYW5fY2FsbGJhY2spCi0gICAgdHJ5OgotICAgICAgZXZlbnQgPSBzZWxmLl9hZC5lZC5wb3BfZXZlbnQoCi0gICAgICAgICAgJ0JsZVNjYW4lc29uU2NhblJlc3VsdHMnICUgc2Nhbl9jYWxsYmFjaywgdGltZW91dF9zZWMpCi0gICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgotICAgICAgcmFpc2Ugc2lnbmFscy5Db250cm9sbGVyRXJyb3IoCi0gICAgICAgICAgJ1RpbWVkIG91dCAlZHMgYWZ0ZXIgd2FpdGluZyBmb3IgcGhvbmUgZmluZGluZyBCTEUgZGV2aWNlOiAlcy4nICUKLSAgICAgICAgICAodGltZW91dF9zZWMsIGRldmljZV9uYW1lKSkKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fYWQuc2w0YS5ibGVTdG9wQmxlU2NhbihzY2FuX2NhbGxiYWNrKQotICAgIHJldHVybiBldmVudFsnZGF0YSddWydSZXN1bHQnXVsnZGV2aWNlSW5mbyddWydhZGRyZXNzJ10KLQotICBkZWYgZ2V0X2RldmljZV9uYW1lKHNlbGYpIC0+IHN0cjoKLSAgICAiIiJHZXRzIEJsdWV0b290aCBkZXZpY2UgbmFtZSBvZiBhbiBBbmRyb2lkRGV2aWNlLiIiIgotICAgIGxvZ2dpbmcuaW5mbygnR2V0dGluZyBCbHVldG9vdGggZGV2aWNlIG5hbWUgZm9yIEFuZHJvaWREZXZpY2UuJykKLSAgICBkZXZpY2VfbmFtZSA9IHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoR2V0TG9jYWxOYW1lKCkKLSAgICBsb2dnaW5nLmluZm8oJ0JsdWV0b290aCBkZXZpY2UgbmFtZSBvZiBBbmRyb2lkRGV2aWNlOiAlcycsIGRldmljZV9uYW1lKQotICAgIHJldHVybiBkZXZpY2VfbmFtZQotCi0gIGRlZiBpc19ibHVldG9vdGhfc2NvX29uKHNlbGYpIC0+IGJvb2w6Ci0gICAgIiIiQ2hlY2tzIHdoZXRoZXIgY29tbXVuaWNhdGlvbnMgdXNlIEJsdWV0b290aCBTQ08uIiIiCi0gICAgY21kID0gJ2R1bXBzeXMgYmx1ZXRvb3RoX21hbmFnZXIgfCBncmVwICJpc0JsdWV0b290aFNjb09uIicKLSAgICBnZXRfc3RhdHVzID0gc2VsZi5fYWQuYWRiLnNoZWxsKGNtZCkKLSAgICBpZiBpc2luc3RhbmNlKGdldF9zdGF0dXMsIGJ5dGVzKToKLSAgICAgIGdldF9zdGF0dXMgPSBnZXRfc3RhdHVzLmRlY29kZSgpCi0gICAgcmV0dXJuICd0cnVlJyBpbiBnZXRfc3RhdHVzCi0KLSAgZGVmIGNvbm5lY3Rfd2l0aF9wcm9maWxlKAotICAgICAgc2VsZiwKLSAgICAgIHNuZF9hZF9tYWNfYWRkcmVzczogc3RyLAotICAgICAgcHJvZmlsZTogQmx1ZXRvb3RoUHJvZmlsZSkgLT4gYm9vbDoKLSAgICAiIiJDb25uZWN0cyB3aXRoIHRoZSBwcm9maWxlLgotCi0gICAgVGhlIGNvbm5lY3Rpb24gY2FuIG9ubHkgYmUgY29tcGxldGVkIGFmdGVyIHRoZSBibHVldG9vdGggZGV2aWNlcyBhcmUgcGFpcmVkLgotICAgIFRvIGNvbm5lY3RlZCB3aXRoIHRoZSBwcm9maWxlLCB0aGUgYmx1ZXRvb3RoIGNvbm5lY3Rpb24gcG9saWN5IGlzIHNldCB0bwotICAgIGZvcmJpZGRlbiBmaXJzdCBhbmQgdGhlbiBzZXQgdG8gYWxsb3dlZC4gVGhlIHBhaXJlZCBibHVldG9vdGggZGV2aWNlcyB3aWxsCi0gICAgc3RhcnQgdG8gbWFrZSBjb25uZWN0aW9uLiBUaGUgY29ubmVjdGlvbiB0aW1lIGNvdWxkIGJlIGxvbmcuIFRoZSB3YWl0dGluZwotICAgIHRpbWUgaXMgc2V0IHRvIEJUX0NPTk5FQ1RJT05fV0FJVElOR19USU1FX1NFQ09ORFMgKGN1cnJlbnRseSAxMCBzZWNvbmRzKS4KLQotICAgIEFyZ3M6Ci0gICAgICBzbmRfYWRfbWFjX2FkZHJlc3M6IHRoZSBtYWMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFjY2VwdGluZyBjb25uZWN0aW9uLgotICAgICAgcHJvZmlsZTogdGhlIHByb2ZpbGVzIHRvIGJlIHNldAotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBwcm9maWxlIGNvbm5lY3Rpb24gc3VjY2VlZC9mYWlsCi0gICAgIiIiCi0gICAgaWYgcHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLk1BUF9NQ0U6Ci0gICAgICBzZWxmLl9hZC5zbDRhLmJsdWV0b290aE1hcENsaWVudENvbm5lY3Qoc25kX2FkX21hY19hZGRyZXNzKQotICAgIGVsaWYgcHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLlBCQVBfQ0xJRU5UOgotICAgICAgc2VsZi5zZXRfcHJvZmlsZV9wb2xpY3koCi0gICAgICAgICAgc25kX2FkX21hY19hZGRyZXNzLCBwcm9maWxlLAotICAgICAgICAgIEJsdWV0b290aENvbm5lY3Rpb25Qb2xpY3kuQ09OTkVDVElPTl9QT0xJQ1lfQUxMT1dFRCkKLSAgICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoUGJhcENsaWVudENvbm5lY3Qoc25kX2FkX21hY19hZGRyZXNzKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnNldF9wcm9maWxlX3BvbGljeSgKLSAgICAgICAgICBzbmRfYWRfbWFjX2FkZHJlc3MsIHByb2ZpbGUsCi0gICAgICAgICAgQmx1ZXRvb3RoQ29ubmVjdGlvblBvbGljeS5DT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU4pCi0gICAgICBzZWxmLnNldF9wcm9maWxlX3BvbGljeSgKLSAgICAgICAgICBzbmRfYWRfbWFjX2FkZHJlc3MsIHByb2ZpbGUsCi0gICAgICAgICAgQmx1ZXRvb3RoQ29ubmVjdGlvblBvbGljeS5DT05ORUNUSU9OX1BPTElDWV9BTExPV0VEKQotICAgICAgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhDb25uZWN0Qm9uZGVkKHNuZF9hZF9tYWNfYWRkcmVzcykKLSAgICB0aW1lLnNsZWVwKEJUX0NPTk5FQ1RJT05fV0FJVElOR19USU1FX1NFQ09ORFMpCi0gICAgaXNfY29ubmVjdGVkID0gc2VsZi5faXNfcHJvZmlsZV9jb25uZWN0ZWQoc25kX2FkX21hY19hZGRyZXNzLCBwcm9maWxlKQotICAgIHNlbGYubG9nLmluZm8oJ1RoZSBjb25uZWN0aW9uIGJldHdlZW4gJXMgYW5kICVzIGZvciBwcm9maWxlICVzIHN1Y2NlZWQ6ICVzJywKLSAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsLCBzbmRfYWRfbWFjX2FkZHJlc3MsIHByb2ZpbGUsIGlzX2Nvbm5lY3RlZCkKLSAgICByZXR1cm4gaXNfY29ubmVjdGVkCi0KLSAgZGVmIGNvbm5lY3RfdG9fc25kX3dpdGhfcHJvZmlsZSgKLSAgICAgIHNlbGYsCi0gICAgICBzbmRfYWQ6IEFuZHJvaWREZXZpY2UsCi0gICAgICBwcm9maWxlOiBCbHVldG9vdGhQcm9maWxlLAotICAgICAgYXR0ZW1wdHM6IGludCA9IDUpIC0+IGJvb2w6Ci0gICAgIiIiQ29ubmVjdHMgcHJpIGFuZHJvaWQgZGV2aWNlIHRvIHNuZCBhbmRyb2lkIGRldmljZSB3aXRoIHByb2ZpbGUuCi0KLSAgICBBcmdzOgotICAgICAgICBzbmRfYWQ6IGFuZHJvaWQgZGV2aWNlIGFjY2VwdGluZyBjb25uZWN0aW9uCi0gICAgICAgIHByb2ZpbGU6IHRoZSBwcm9maWxlIHRvIGJlIGNvbm5lY3RlZAotICAgICAgICBhdHRlbXB0czogTnVtYmVyIG9mIGF0dGVtcHRzIHRvIHRyeSB1bnRpbCBmYWlsdXJlLgotCi0gICAgUmV0dXJuczoKLSAgICAgICAgQm9vbGVhbiBvZiBjb25uZWN0aW5nIHJlc3VsdAotICAgICIiIgotICAgIHByaV9hZCA9IHNlbGYuX2FkCi0gICAgY3Vycl9hdHRlbXB0cyA9IDAKLSAgICBzbmRfYWRfbWFjX2FkZHJlc3MgPSBzbmRfYWQuc2w0YS5ibHVldG9vdGhHZXRMb2NhbEFkZHJlc3MoKQotICAgIGlmIG5vdCBzZWxmLmlzX2J0X3BhaXJlZChzbmRfYWRfbWFjX2FkZHJlc3MpOgotICAgICAgc2VsZi5sb2cuZXJyb3IoJ0RldmljZXMgJXMgYW5kICVzIG5vdCBwYWlyZWQgYmVmb3JlIGNvbm5lY3RpbmcnLAotICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWwsIHNuZF9hZC5zZXJpYWwpCi0gICAgICByZXR1cm4gRmFsc2UKLSAgICB3aGlsZSBjdXJyX2F0dGVtcHRzIDwgYXR0ZW1wdHM6Ci0gICAgICBjdXJyX2F0dGVtcHRzICs9IDEKLSAgICAgIHNlbGYubG9nLmluZm8oJ0Nvbm5lY3Rpb24gb2YgcHJvZmlsZSAlcyBhdCBjdXJyIGF0dGVtcHQgJWQgKHRvdGFsICVkKScsCi0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIGN1cnJfYXR0ZW1wdHMsIGF0dGVtcHRzKQotICAgICAgaWYgc2VsZi5jb25uZWN0X3dpdGhfcHJvZmlsZShzbmRfYWRfbWFjX2FkZHJlc3MsIHByb2ZpbGUpOgotICAgICAgICBzZWxmLmxvZy5pbmZvKCdDb25uZWN0aW9uIGJldHdlZW4gZGV2aWNlcyAlcyBhbmQgJXMgc3VjY2VlZHMgYXQgJWQgdHJ5JywKLSAgICAgICAgICAgICAgICAgICAgICBwcmlfYWQuc2VyaWFsLCBzbmRfYWQuc2VyaWFsLCBjdXJyX2F0dGVtcHRzKQotICAgICAgICByZXR1cm4gVHJ1ZQotICAgIHNlbGYubG9nLmVycm9yKCdDb25uZWN0aW9uIG9mIHByb2ZpbGUgJXMgZmFpbGVkIGFmdGVyICVkIGF0dGVtcHRzJywgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICBhdHRlbXB0cykKLSAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgaXNfYnRfcGFpcmVkKHNlbGYsIG1hY19hZGRyZXNzOiBzdHIpIC0+IGJvb2w6Ci0gICAgIiIiQ2hlY2sgaWYgdGhlIGJsdWV0b290aCBkZXZpY2Ugd2l0aCBtYWNfYWRkcmVzcyBpcyBwYWlyZWQgdG8gYWQuCi0KLSAgICBBcmdzOgotICAgICAgbWFjX2FkZHJlc3M6IHRoZSBtYWMgYWRkcmVzcyBvZiB0aGUgYmx1ZXRvb3RoIGRldmljZSBmb3IgcGFpcmluZwotCi0gICAgUmV0dXJuczoKLSAgICAgIFRydWUgaWYgdGhleSBhcmUgcGFpcmVkCi0gICAgIiIiCi0gICAgYm9uZGVkX2luZm8gPSBzZWxmLl9hZC5zbDRhLmJsdWV0b290aEdldEJvbmRlZERldmljZXMoKQotICAgIHJldHVybiBtYWNfYWRkcmVzcyBpbiBbaW5mb1snYWRkcmVzcyddIGZvciBpbmZvIGluIGJvbmRlZF9pbmZvXQotCi0gIGRlZiBpc19hMmRwX3NpbmtfY29ubmVjdGVkKHNlbGYsIG1hY19hZGRyZXNzOiBzdHIpIC0+IGJvb2w6Ci0gICAgIiIiQ2hlY2tzIGlmIHRoZSBBbmRyb2lkIGRldmljZSBjb25uZWN0cyB0byBhIEEyRFAgc2luayBkZXZpY2UuCi0KLSAgICBBcmdzOgotICAgICAgbWFjX2FkZHJlc3M6IFN0cmluZywgQmx1ZXRvb3RoIE1BQyBhZGRyZXNzIG9mIHRoZSBBMkRQIHNpbmsgZGV2aWNlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRydWUgaWYgY29ubmVjdGVkIGVsc2UgRmFsc2UuCi0gICAgIiIiCi0gICAgY29ubmVjdGVkX2RldmljZXMgPSBzZWxmLl9hZC5zbDRhLmJsdWV0b290aEEyZHBHZXRDb25uZWN0ZWREZXZpY2VzKCkKLSAgICByZXR1cm4gbWFjX2FkZHJlc3MgaW4gW2RbJ2FkZHJlc3MnXSBmb3IgZCBpbiBjb25uZWN0ZWRfZGV2aWNlc10KLQotICBkZWYgaGZwX2Nvbm5lY3Qoc2VsZiwgYWdfYWQ6IEFuZHJvaWREZXZpY2UpIC0+IGJvb2w6Ci0gICAgIiIiSGZwIGNvbm5lY3RpbmcgaGYgYW5kcm9pZCBkZXZpY2UgdG8gYWcgYW5kcm9pZCBkZXZpY2UuCi0KLSAgICBUaGUgYW5kcm9pZCBkZXZpY2Ugc2hvdWxkIHN1cHBvcnQgdGhlIEhlYWRzZXQgQ2xpZW50IHByb2ZpbGUuIEZvciBleGFtcGxlLAotICAgIHRoZSBhbmRyb2lkIGRldmljZSB3aXRoIGdpdF9tYXN0ZXItYmRzLWRldiBidWlsZC4KLQotICAgIEFyZ3M6Ci0gICAgICAgIGFnX2FkOiBBdWRpbyBHYXRld2F5IChhZykgYW5kcm9pZCBkZXZpY2UKLQotICAgIFJldHVybnM6Ci0gICAgICAgIEJvb2xlYW4gb2YgY29ubmVjdGluZyByZXN1bHQKLSAgICAiIiIKLSAgICByZXR1cm4gc2VsZi5jb25uZWN0X3RvX3NuZF93aXRoX3Byb2ZpbGUoYWdfYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVF9DTElFTlQpCi0KLSAgZGVmIGEyZHBfc2lua19jb25uZWN0KHNlbGYsIHNyY19hZDogQW5kcm9pZERldmljZSkgLT4gYm9vbDoKLSAgICAiIiJDb25uZWN0cyBwcmkgYW5kcm9pZCBkZXZpY2UgdG8gc2Vjb25kYXJ5IGFuZHJvaWQgZGV2aWNlLgotCi0gICAgVGhlIGFuZHJvaWQgZGV2aWNlIHNob3VsZCBzdXBwb3J0IHRoZSBBMmRwIFNpbmsgcHJvZmlsZS4gRm9yIGV4YW1wbGUsIHRoZQotICAgIGFuZHJvaWQgZGV2aWNlIHdpdGggZ2l0X21hc3Rlci1iZHMtZGV2IGJ1aWxkLgotCi0gICAgQXJnczoKLSAgICAgIHNyY19hZDogQTJkcCBzb3VyY2UgYW5kcm9pZCBkZXZpY2UKLQotICAgIFJldHVybnM6Ci0gICAgICBCb29sZWFuIG9mIGNvbm5lY3RpbmcgcmVzdWx0Ci0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGYuY29ubmVjdF90b19zbmRfd2l0aF9wcm9maWxlKHNyY19hZCwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQX1NJTkspCi0KLSAgZGVmIG1hcF9jb25uZWN0KHNlbGYsIG1hcF9hZDogQW5kcm9pZERldmljZSkgLT4gYm9vbDoKLSAgICAiIiJDb25uZWN0cyBwcmltYXJ5IGRldmljZSB0byBzZWNvbmRhcnkgZGV2aWNlIHZpYSBNQVAgTUNFIHByb2ZpbGUuCi0KLSAgICBUaGUgcHJpbWFyeSBkZXZpY2Ugc2hvdWxkIHN1cHBvcnQgdGhlIE1BUCBNQ0UgcHJvZmlsZS4gRm9yIGV4YW1wbGUsCi0gICAgdGhlIGFuZHJvaWQgZGV2aWNlIHdpdGggZ2l0X21hc3Rlci1iZHMtZGV2IGJ1aWxkLgotCi0gICAgQXJnczoKLSAgICAgICAgbWFwX2FkOiBBbmRyb2lkRGV2aWNlLCBhIGFuZHJvaWQgZGV2aWNlIHN1cHBvcnRpbmcgTUFQIHByb2ZpbGUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgICBCb29sZWFuIG9mIGNvbm5lY3RpbmcgcmVzdWx0Ci0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGYuY29ubmVjdF90b19zbmRfd2l0aF9wcm9maWxlKG1hcF9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5NQVBfTUNFKQotCi0gIGRlZiBtYXBfZGlzY29ubmVjdChzZWxmLCBibHVldG9vdGhfYWRkcmVzczogc3RyKSAtPiBib29sOgotICAgICIiIkRpc2Nvbm5lY3RzIGEgTUFQIE1TRSBkZXZpY2Ugd2l0aCBzcGVjaWZpZWQgQmx1ZXRvb3RoIE1BQyBhZGRyZXNzLgotCi0gICAgQXJnczoKLSAgICAgIGJsdWV0b290aF9hZGRyZXNzOiBhIGNvbm5lY3RlZCBkZXZpY2UncyBibHVldG9vdGggYWRkcmVzcy4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmIHRoZSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkIGVsc2UgRmFsc2UuCi0gICAgIiIiCi0gICAgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhNYXBDbGllbnREaXNjb25uZWN0KGJsdWV0b290aF9hZGRyZXNzKQotICAgIHJldHVybiBidF90ZXN0X3V0aWxzLndhaXRfdW50aWwoCi0gICAgICAgIHRpbWVvdXRfc2VjPUNPTU1PTl9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgIGNvbmRpdGlvbl9mdW5jPXNlbGYuX2lzX3Byb2ZpbGVfY29ubmVjdGVkLAotICAgICAgICBmdW5jX2FyZ3M9W2JsdWV0b290aF9hZGRyZXNzLCBCbHVldG9vdGhQcm9maWxlLk1BUF9NQ0VdLAotICAgICAgICBleHBlY3RlZF92YWx1ZT1GYWxzZSkKLQotICBkZWYgcGJhcF9jb25uZWN0KHNlbGYsIHBiYXBfYWQ6IEFuZHJvaWREZXZpY2UpIC0+IGJvb2w6Ci0gICAgIiIiQ29ubmVjdHMgcHJpbWFyeSBkZXZpY2UgdG8gc2Vjb25kYXJ5IGRldmljZSB2aWEgUEJBUCBjbGllbnQgcHJvZmlsZS4KLQotICAgIFRoZSBwcmltYXJ5IGRldmljZSBzaG91bGQgc3VwcG9ydCB0aGUgUEJBUCBjbGllbnQgcHJvZmlsZS4gRm9yIGV4YW1wbGUsCi0gICAgdGhlIGFuZHJvaWQgZGV2aWNlIHdpdGggZ2l0X21hc3Rlci1iZHMtZGV2IGJ1aWxkLgotCi0gICAgQXJnczoKLSAgICAgICAgcGJhcF9hZDogQW5kcm9pZERldmljZSwgYSBhbmRyb2lkIGRldmljZSBzdXBwb3J0aW5nIFBCQVAgcHJvZmlsZS4KLQotICAgIFJldHVybnM6Ci0gICAgICAgIEJvb2xlYW4gb2YgY29ubmVjdGluZyByZXN1bHQKLSAgICAiIiIKLSAgICByZXR1cm4gc2VsZi5jb25uZWN0X3RvX3NuZF93aXRoX3Byb2ZpbGUocGJhcF9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5QQkFQX0NMSUVOVCkKLQotICBkZWYgc2V0X2JsdWV0b290aF90ZXRoZXJpbmcoc2VsZiwgc3RhdHVzX2VuYWJsZWQ6IGJvb2wpIC0+IE5vbmU6Ci0gICAgIiIiU2V0cyBCbHVldG9vdGggdGV0aGVyaW5nIHRvIGJlIHNwZWNpZmljIHN0YXR1cy4KLQotICAgIEFyZ3M6Ci0gICAgICBzdGF0dXNfZW5hYmxlZDogQm9vbCwgQmx1ZXRvb3RoIHRldGhlcmluZyB3aWxsIGJlIHNldCB0byBlbmFibGUgaWYgVHJ1ZSwKLSAgICAgICAgICBlbHNlIGRpc2FibGUuCi0gICAgIiIiCi0gICAgaWYgc2VsZi5fYWQuc2w0YS5ibHVldG9vdGhQYW5Jc1RldGhlcmluZ09uKCkgPT0gc3RhdHVzX2VuYWJsZWQ6Ci0gICAgICBzZWxmLl9hZC5sb2cuaW5mbygnQWxyZWFkeSAlcyBCbHVldG9vdGggdGV0aGVyaW5nLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgKCdlbmFibGVkJyBpZiBzdGF0dXNfZW5hYmxlZCBlbHNlICdkaXNhYmxlZCcpKQotICAgICAgcmV0dXJuCi0KLSAgICBzZWxmLl9hZC5sb2cuaW5mbygnJXMgQmx1ZXRvb3RoIHRldGhlcmluZy4nICUKLSAgICAgICAgICAgICAgICAgICAgICAoJ0VuYWJsZScgaWYgc3RhdHVzX2VuYWJsZWQgZWxzZSAnRGlzYWJsZScpKQotICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoUGFuU2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKHN0YXR1c19lbmFibGVkKQotCi0gICAgYnRfdGVzdF91dGlscy53YWl0X3VudGlsKAotICAgICAgICB0aW1lb3V0X3NlYz1DT01NT05fVElNRU9VVF9TRUNPTkRTLAotICAgICAgICBjb25kaXRpb25fZnVuYz1zZWxmLl9hZC5zbDRhLmJsdWV0b290aFBhbklzVGV0aGVyaW5nT24sCi0gICAgICAgIGZ1bmNfYXJncz1bXSwKLSAgICAgICAgZXhwZWN0ZWRfdmFsdWU9c3RhdHVzX2VuYWJsZWQsCi0gICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLkNvbnRyb2xsZXJFcnJvcigKLSAgICAgICAgICAgICdGYWlsZWQgdG8gJXMgQmx1ZXRvb3RoIHRldGhlcmluZy4nICUKLSAgICAgICAgICAgICgnZW5hYmxlJyBpZiBzdGF0dXNfZW5hYmxlZCBlbHNlICdkaXNhYmxlJykpKQotCi0gIGRlZiBzZXRfcHJvZmlsZV9wb2xpY3koCi0gICAgICBzZWxmLAotICAgICAgc25kX2FkX21hY19hZGRyZXNzOiBzdHIsCi0gICAgICBwcm9maWxlOiBCbHVldG9vdGhQcm9maWxlLAotICAgICAgcG9saWN5OiBCbHVldG9vdGhDb25uZWN0aW9uUG9saWN5KSAtPiBOb25lOgotICAgICIiIlNldHMgcG9saWN5IG9mIHRoZSBwcm9maWxlIGNhciByZWxhdGVkIHByb2ZpbGVzIHRvIE9GRi4KLQotICAgIFRoaXMgYXZvaWRzIGF1dG9jb25uZWN0IGJlaW5nIHRyaWdnZXJlZCByYW5kb21seS4gVGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCi0gICAgaXMgZW5jb3VyYWdlZCB3aGVuIHlvdSdyZSB0ZXN0aW5nIGluZGl2aWR1YWwgcHJvZmlsZXMgaW4gaXNvbGF0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIHNuZF9hZF9tYWNfYWRkcmVzczogdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYWNjZXB0aW5nIGNvbm5lY3Rpb24uCi0gICAgICBwcm9maWxlOiB0aGUgcHJvZmlsZXMgdG8gYmUgc2V0Ci0gICAgICBwb2xpY3k6IHRoZSBwb2xpY3kgdmFsdWUgdG8gYmUgc2V0Ci0gICAgIiIiCi0gICAgcHJpX2FkID0gc2VsZi5fYWQKLSAgICBwcmlfYWRfbG9jYWxfbmFtZSA9IHByaV9hZC5zbDRhLmJsdWV0b290aEdldExvY2FsTmFtZSgpCi0gICAgcHJpX2FkLmxvZy5pbmZvKCdTZXRzIHByb2ZpbGUgJXMgb24gJXMgZm9yICVzIHRvIHBvbGljeSAlcycsIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgIHByaV9hZF9sb2NhbF9uYW1lLCBzbmRfYWRfbWFjX2FkZHJlc3MsIHBvbGljeSkKLSAgICBpZiBwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuQTJEUDoKLSAgICAgIHByaV9hZC5zbDRhLmJsdWV0b290aEEyZHBTZXRQcmlvcml0eShzbmRfYWRfbWFjX2FkZHJlc3MsIHBvbGljeS52YWx1ZSkKLSAgICBlbGlmIHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5BMkRQX1NJTks6Ci0gICAgICBwcmlfYWQuc2w0YS5ibHVldG9vdGhBMmRwU2lua1NldFByaW9yaXR5KHNuZF9hZF9tYWNfYWRkcmVzcywgcG9saWN5LnZhbHVlKQotICAgIGVsaWYgcHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVRfQ0xJRU5UOgotICAgICAgcHJpX2FkLnNsNGEuYmx1ZXRvb3RoSGZwQ2xpZW50U2V0UHJpb3JpdHkoc25kX2FkX21hY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LnZhbHVlKQotICAgIGVsaWYgcHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLlBCQVBfQ0xJRU5UOgotICAgICAgcHJpX2FkLnNsNGEuYmx1ZXRvb3RoUGJhcENsaWVudFNldFByaW9yaXR5KHNuZF9hZF9tYWNfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kudmFsdWUpCi0gICAgZWxpZiBwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSElEX0hPU1Q6Ci0gICAgICBwcmlfYWQuc2w0YS5ibHVldG9vdGhIaWRTZXRQcmlvcml0eShzbmRfYWRfbWFjX2FkZHJlc3MsIHBvbGljeS52YWx1ZSkKLSAgICBlbHNlOgotICAgICAgcHJpX2FkLmxvZy5lcnJvcignUHJvZmlsZSAlcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgcG9saWN5IHNldHRpbmdzJywKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSkKLQotICBkZWYgc2V0X3Byb2ZpbGVzX3BvbGljeSgKLSAgICAgIHNlbGYsCi0gICAgICBzbmRfYWQ6IEFuZHJvaWREZXZpY2UsCi0gICAgICBwcm9maWxlX2xpc3Q6IFNlcXVlbmNlW0JsdWV0b290aFByb2ZpbGVdLAotICAgICAgcG9saWN5OiBCbHVldG9vdGhDb25uZWN0aW9uUG9saWN5KSAtPiBOb25lOgotICAgICIiIlNldHMgdGhlIHBvbGljeSBvZiBzYWlkIHByb2ZpbGUocykgb24gcHJpX2FkIGZvciBzbmRfYWQuCi0KLSAgICBBcmdzOgotICAgICAgc25kX2FkOiBhbmRyb2lkIGRldmljZSBhY2NlcHRpbmcgY29ubmVjdGlvbgotICAgICAgcHJvZmlsZV9saXN0OiBsaXN0IG9mIHRoZSBwcm9maWxlcyB0byBiZSBzZXQKLSAgICAgIHBvbGljeTogdGhlIHBvbGljeSB0byBiZSBzZXQKLSAgICAiIiIKLSAgICBtYWNfYWRkcmVzcyA9IHNuZF9hZC5zbDRhLmJsdWV0b290aEdldExvY2FsQWRkcmVzcygpCi0gICAgZm9yIHByb2ZpbGUgaW4gcHJvZmlsZV9saXN0OgotICAgICAgc2VsZi5zZXRfcHJvZmlsZV9wb2xpY3kobWFjX2FkZHJlc3MsIHByb2ZpbGUsIHBvbGljeSkKLQotICBkZWYgc2V0X3Byb2ZpbGVzX3BvbGljeV9vZmYoCi0gICAgICBzZWxmLAotICAgICAgc25kX2FkOiBBbmRyb2lkRGV2aWNlLAotICAgICAgcHJvZmlsZV9saXN0OiBTZXF1ZW5jZVtCbHVldG9vdGhQcm9maWxlXSkgLT4gTm9uZToKLSAgICAiIiJTZXRzIHBvbGljeSBvZiB0aGUgcHJvZmlsZXMgdG8gT0ZGLgotCi0gICAgVGhpcyBhdm9pZHMgYXV0b2Nvbm5lY3QgYmVpbmcgdHJpZ2dlcmVkIHJhbmRvbWx5LiBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24KLSAgICBpcyBlbmNvdXJhZ2VkIHdoZW4geW91J3JlIHRlc3RpbmcgaW5kaXZpZHVhbCBwcm9maWxlcyBpbiBpc29sYXRpb24KLQotICAgIEFyZ3M6Ci0gICAgICBzbmRfYWQ6IGFuZHJvaWQgZGV2aWNlIGFjY2VwdGluZyBjb25uZWN0aW9uCi0gICAgICBwcm9maWxlX2xpc3Q6IGxpc3Qgb2YgdGhlIHByb2ZpbGVzIHRvIGJlIHR1cm5lZCBvZmYKLSAgICAiIiIKLSAgICBzZWxmLnNldF9wcm9maWxlc19wb2xpY3koCi0gICAgICAgIHNuZF9hZCwgcHJvZmlsZV9saXN0LAotICAgICAgICBCbHVldG9vdGhDb25uZWN0aW9uUG9saWN5LkNPTk5FQ1RJT05fUE9MSUNZX0ZPUkJJRERFTikKLQotICBkZWYgd2FpdF9mb3JfY2FsbF9zdGF0ZSgKLSAgICAgIHNlbGYsCi0gICAgICBjYWxsX3N0YXRlOiBVbmlvbltpbnQsIENhbGxTdGF0ZV0sCi0gICAgICB0aW1lb3V0X3NlYzogZmxvYXQsCi0gICAgICB3YWl0X2ludGVydmFsOiBpbnQgPSAzKSAtPiBib29sOgotICAgICIiIldhaXRzIGZvciBjYWxsIHN0YXRlIG9mIHRoZSBkZXZpY2UgdG8gYmUgY2hhbmdlZC4KLQotICAgIEFyZ3M6Ci0gICAgICBjYWxsX3N0YXRlOiBpbnQsIHRoZSBleHBlY3RlZCBjYWxsIHN0YXRlLiBDYWxsIHN0YXRlIHZhbHVlcyBhcmU6Ci0gICAgICAgIDA6IElETEUKLSAgICAgICAgMTogUklOR0lORwotICAgICAgICAyOiBPRkZIT09LCi0gICAgICB0aW1lb3V0X3NlYzogaW50LCBudW1iZXIgb2Ygc2Vjb25kcyBvZiBleHBpcmF0aW9uIHRpbWUKLSAgICAgIHdhaXRfaW50ZXJ2YWw6IGludCwgbnVtYmVyIG9mIHNlY29uZHMgb2Ygd2FpdGluZyBpbiBlYWNoIGN5Y2xlCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiB0aGUgY2FsbCBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkIGVsc2UgRmFsc2UuCi0gICAgIiIiCi0gICAgIyBUT0RPKHVzZXIpOiBGb3JjZSBleHRlcm5hbCBjYWxsIHRvIHVzZSBDYWxsU3RhdGUgaW5zdGVhZCBvZiBpbnQKLSAgICBpZiBpc2luc3RhbmNlKGNhbGxfc3RhdGUsIENhbGxTdGF0ZSk6Ci0gICAgICBjYWxsX3N0YXRlID0gY2FsbF9zdGF0ZS52YWx1ZQotICAgIGV4cGlyYXRpb25fdGltZSA9IHRpbWUudGltZSgpICsgdGltZW91dF9zZWMKLSAgICB3aGljaF9jeWNsZSA9IDEKLSAgICB3aGlsZSB0aW1lLnRpbWUoKSA8IGV4cGlyYXRpb25fdGltZToKLSAgICAgICMgV2FpdHMgZm9yIHRoZSBjYWxsIHN0YXRlIGNoYW5nZSBpbiBldmVyeSBjeWNsZS4KLSAgICAgIHRpbWUuc2xlZXAod2FpdF9pbnRlcnZhbCkKLSAgICAgIHNlbGYuX2FkLmxvZy5pbmZvKAotICAgICAgICAgICdpbiBjeWNsZSAlZCBvZiB3YWl0aW5nIGZvciBjYWxsIHN0YXRlICVkJywgd2hpY2hfY3ljbGUsIGNhbGxfc3RhdGUpCi0gICAgICBpZiBjYWxsX3N0YXRlID09IHNlbGYuX2FkLm1icy5nZXRUZWxlcGhvbnlDYWxsU3RhdGUoKToKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICBzZWxmLl9hZC5sb2cuaW5mbygnVGhlIGNhbGwgc3RhdGUgZGlkIG5vdCBjaGFuZ2UgdG8gJWQgYmVmb3JlIHRpbWVvdXQnLAotICAgICAgICAgICAgICAgICAgICAgIGNhbGxfc3RhdGUpCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIHBsYXlfYXVkaW9fZmlsZV93aXRoX2dvb2dsZV9wbGF5X211c2ljKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiUGxheXMgYW4gYXVkaW8gZmlsZSBvbiBhbiBBbmRyb2lkRGV2aWNlIHdpdGggR29vZ2xlIFBsYXkgTXVzaWMgYXBwLgotCi0gICAgUmV0dXJuczoKLSAgICAgIE5vbmUKLSAgICAiIiIKLSAgICB0cnk6Ci0gICAgICBzZWxmLl9hZC5hdWQuYWRkX3dhdGNoZXIoJ0xPR0lOJykud2hlbih0ZXh0PSdTS0lQJykuY2xpY2sodGV4dD0nU0tJUCcpCi0gICAgICBzZWxmLl9hZC5hdWQuYWRkX3dhdGNoZXIoJ05FVFdPUksnKS53aGVuKHRleHQ9J1NlcnZlciBlcnJvcicpLmNsaWNrKAotICAgICAgICAgIHRleHQ9J09LJykKLSAgICAgIHNlbGYuX2FkLmF1ZC5hZGRfd2F0Y2hlcignTUVOVScpLndoZW4odGV4dD0nU2V0dGluZ3MnKS5jbGljaygKLSAgICAgICAgICB0ZXh0PSdMaXN0ZW4gTm93JykKLSAgICBleGNlcHQgYWRiX3VpLkVycm9yOgotICAgICAgbG9nZ2luZy5pbmZvKCdUaGUgd2F0Y2hlciBoYXMgYmVlbiBhZGRlZC4nKQotICAgIHNlbGYuX2FkLnNsNGEuYXBwTGF1bmNoKCdjb20uZ29vZ2xlLmFuZHJvaWQubXVzaWMnKQotICAgIGlmIHNlbGYuX2FkLmF1ZCh0ZXh0PSdObyBNdXNpYyBhdmFpbGFibGUnKS5leGlzdHMoMTApOgotICAgICAgc2VsZi5fYWQucmVib290KCkKLSAgICAgIHNlbGYuX2FkLnNsNGEuYXBwTGF1bmNoKCdjb20uZ29vZ2xlLmFuZHJvaWQubXVzaWMnKQotICAgIHNlbGYuX2FkLmF1ZCgKLSAgICAgICAgcmVzb3VyY2VfaWQ9J2NvbS5nb29nbGUuYW5kcm9pZC5tdXNpYzppZC9saV90aHVtYm5haWxfZnJhbWUnKS5jbGljaygpCi0gICAgdGltZS5zbGVlcCg2KSAgIyBXYWl0IGZvciBhdWRpbyBwbGF5YmFjayB0byByZWFjaCBzdGVhZHkgc3RhdGUKLQotICBkZWYgYWRkX2NhbGxfbG9nKAotICAgICAgc2VsZiwKLSAgICAgIGNhbGxfbG9nX3R5cGU6IFVuaW9uW2ludCwgQ2FsbExvZ1R5cGVdLAotICAgICAgcGhvbmVfbnVtYmVyOiBzdHIsCi0gICAgICBjYWxsX3RpbWU6IGludCkgLT4gTm9uZToKLSAgICAiIiJBZGQgY2FsbCBudW1iZXIgYW5kIHRpbWUgdG8gc3BlY2lmaWVkIGxvZy4KLQotICAgIEFyZ3M6Ci0gICAgICBjYWxsX2xvZ190eXBlOiBpbnQsIG51bWJlciBvZiBjYWxsIGxvZyB0eXBlLiBDYWxsIGxvZyB0eXBlIHZhbHVlcyBhcmU6Ci0gICAgICAgIDE6IEluY29taW5nIGNhbGwKLSAgICAgICAgMjogT3V0Z29pbmcgY2FsbAotICAgICAgICAzOiBNaXNzZWQgY2FsbAotICAgICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcsIHBob25lIG51bWJlciB0byBiZSBhZGRlZCBpbiBjYWxsIGxvZy4KLSAgICAgIGNhbGxfdGltZTogaW50LCBjYWxsIHRpbWUgdG8gYmUgYWRkZWQgaW4gY2FsbCBsb2cuCi0KLSAgICBSZXR1cm5zOgotICAgICAgTm9uZQotICAgICIiIgotICAgICMgVE9ETyh1c2VyKTogRm9yY2UgZXh0ZXJuYWwgY2FsbCB0byB1c2UgQ2FsbExvZ1R5cGUgaW5zdGVhZCBvZiBpbnQKLSAgICBpZiBpc2luc3RhbmNlKGNhbGxfbG9nX3R5cGUsIENhbGxMb2dUeXBlKToKLSAgICAgIGNhbGxfbG9nX3R5cGUgPSBjYWxsX2xvZ190eXBlLnZhbHVlCi0gICAgbmV3X2NhbGxfbG9nID0ge30KLSAgICBuZXdfY2FsbF9sb2dbJ3R5cGUnXSA9IHN0cihjYWxsX2xvZ190eXBlKQotICAgIG5ld19jYWxsX2xvZ1snbnVtYmVyJ10gPSBwaG9uZV9udW1iZXIKLSAgICBuZXdfY2FsbF9sb2dbJ3RpbWUnXSA9IHN0cihjYWxsX3RpbWUpCi0gICAgc2VsZi5fYWQuc2w0YS5jYWxsTG9nc1B1dChuZXdfY2FsbF9sb2cpCi0KLSAgZGVmIGdldF9jYWxsX3ZvbHVtZShzZWxmKSAtPiBpbnQ6Ci0gICAgIiIiR2V0cyBjdXJyZW50IGNhbGwgdm9sdW1lIG9mIGFuIEFuZHJvaWREZXZpY2Ugd2hlbiBCbHVldG9vdGggU0NPIE9uLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGN1cnJlbnQgY2FsbCB2b2x1bWUgbGV2ZWwuCi0gICAgIiIiCi0gICAgY21kID0gJ2R1bXBzeXMgYXVkaW8gfCBncmVwICJTVFJFQU1fQkxVRVRPT1RIX1NDTyIgfCB0YWlsIC0xJwotICAgIG91dCA9IHNlbGYuX2FkLmFkYi5zaGVsbChjbWQpLmRlY29kZSgpCi0gICAgIyBUT0RPKHVzZXIpOiBTaG91bGQgd2UgaGFuZGxlIHRoZSBjYXNlIHRoYXQgcmUuc2VhcmNoKC4uLikgcmV0dXJuIE5vbmUKLSAgICAjIGJlbG93PwotICAgIHBhdHRlcm4gPSByJyg/PD1TQ08gaW5kZXg6KVtcZF0rJwotICAgIHJldHVybiBpbnQocmUuc2VhcmNoKHBhdHRlcm4sIG91dCkuZ3JvdXAoKSkKLQotICBkZWYgbWFrZV9waG9uZV9jYWxsKAotICAgICAgc2VsZiwKLSAgICAgIGNhbGxlZTogQW5kcm9pZERldmljZSwKLSAgICAgIHRpbWVvdXRfc2VjOiBmbG9hdCA9IDMwKSAtPiBOb25lOgotICAgICIiIk1ha2UgYSBwaG9uZSBjYWxsIHRvIGNhbGxlZSBhbmQgY2hlY2sgaWYgY2FsbGVlIGlzIHJpbmdpbmcuCi0KLSAgICBBcmdzOgotICAgICAgY2FsbGVlOiBBbmRyb2lkRGV2aWNlLCBUaGUgY2FsbGVlIGluIHRoZSBwaG9uZSBjYWxsLgotICAgICAgdGltZW91dF9zZWM6IGludCwgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGNhbGxlZSByaW5naW5nLgotCi0gICAgUmFpc2VzOgotICAgICAgVGVzdEVycm9yCi0gICAgIiIiCi0gICAgc2VsZi5fYWQuc2w0YS50ZWxlY29tQ2FsbE51bWJlcihjYWxsZWUuZGltZW5zaW9uc1sncGhvbmVfbnVtYmVyJ10pCi0gICAgaXNfcmluZ2luZyA9IGNhbGxlZS53YWl0X2Zvcl9jYWxsX3N0YXRlKGJ0X2NvbnN0YW50cy5DQUxMX1NUQVRFX1JJTkdJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfc2VjKQotICAgIGlmIG5vdCBpc19yaW5naW5nOgotICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoCi0gICAgICAgICAgJ1RpbWVkIG91dCBhZnRlciAlZHMgd2FpdGluZyBmb3IgY2FsbCBzdGF0ZTogUklOR0lORycgJSB0aW1lb3V0X3NlYykKLQotICBkZWYgd2FpdF9mb3JfZGlzY29ubmVjdGlvbl9zdWNjZXNzKAotICAgICAgc2VsZiwKLSAgICAgIG1hY19hZGRyZXNzOiBzdHIsCi0gICAgICB0aW1lb3V0OiBmbG9hdCA9IDMwKSAtPiBmbG9hdDoKLSAgICAiIiJXYWl0cyBmb3IgYSBkZXZpY2UgdG8gY29ubmVjdCB3aXRoIHRoZSBBbmRyb2lkRGV2aWNlLgotCi0gICAgQXJnczoKLSAgICAgIG1hY19hZGRyZXNzOiBUaGUgQmx1ZXRvb3RoIG1hYyBhZGRyZXNzIG9mIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgIHRpbWVvdXQ6IE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBkZXZpY2VzIHRvIGNvbm5lY3QuCi0KLSAgICBSZXR1cm5zOgotICAgICAgY29ubmVjdGlvbl90aW1lOiBUaGUgdGltZSBpdCB0YWtlcyB0byBjb25uZWN0IGluIHNlY29uZHMuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBDb250cm9sbGVyRXJyb3IKLSAgICAiIiIKLSAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyB0aW1lb3V0Ci0gICAgd2hpbGUgdGltZS50aW1lKCkgPCBlbmRfdGltZToKLSAgICAgIGlmIG5vdCBzZWxmLl9hZC5zbDRhLmJsdWV0b290aElzRGV2aWNlQ29ubmVjdGVkKG1hY19hZGRyZXNzKToKLSAgICAgICAgZGlzY29ubmVjdGlvbl90aW1lID0gKHRpbWUudGltZSgpIC0gc3RhcnRfdGltZSkKLSAgICAgICAgbG9nZ2luZy5pbmZvKCdEaXNjb25uZWN0ZWQgZGV2aWNlICVzIGluICVkIHNlY29uZHMnLCBtYWNfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rpb25fdGltZSkKLSAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3Rpb25fdGltZQotCi0gICAgcmFpc2Ugc2lnbmFscy5Db250cm9sbGVyRXJyb3IoCi0gICAgICAgICdGYWlsZWQgdG8gZGlzY29ubmVjdCBkZXZpY2Ugd2l0aGluICVkIHNlY29uZHMuJyAlIHRpbWVvdXQpCi0KLSAgZGVmIGZpcnN0X3BhaXJfYW5kX2Nvbm5lY3RfYmx1ZXRvb3RoKHNlbGYsIGJ0X2RldmljZTogQnREZXZpY2UpIC0+IE5vbmU6Ci0gICAgIiIiUGFpcnMgYW5kIGNvbm5lY3RzIGFuIEFuZHJvaWREZXZpY2Ugd2l0aCBhIEJsdWV0b290aCBkZXZpY2UuCi0KLSAgICBUaGlzIG1ldGhvZCBkb2VzIGZhY3RvcnkgcmVzZXQgYmx1ZXRvb3RoIGZpcnN0IGFuZCB0aGVuIHBhaXJzIGFuZCBjb25uZWN0cwotICAgIHRoZSBkZXZpY2VzLgotCi0gICAgQXJnczoKLSAgICAgIGJ0X2RldmljZTogVGhlIHBlcmlwaGVyYWwgQmx1ZXRvb3RoIGRldmljZSBvciBhbiBBbmRyb2lkRGV2aWNlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIE5vbmUKLSAgICAiIiIKLSAgICBidF9kZXZpY2UuZmFjdG9yeV9yZXNldF9ibHVldG9vdGgoKQotICAgIG1hY19hZGRyZXNzID0gYnRfZGV2aWNlLmdldF9ibHVldG9vdGhfbWFjX2FkZHJlc3MoKQotICAgIGJ0X2RldmljZS5hY3RpdmF0ZV9wYWlyaW5nX21vZGUoKQotICAgIHNlbGYucGFpcl9hbmRfY29ubmVjdF9ibHVldG9vdGgobWFjX2FkZHJlc3MpCi0KLSAgZGVmIGdldF9kZXZpY2VfdGltZShzZWxmKSAtPiBzdHI6Ci0gICAgIiIiR2V0IGRldmljZSBlcG9jaCB0aW1lIGFuZCB0cmFuc2ZlciB0byBsb2djYXQgdGltZXN0YW1wIGZvcm1hdC4KLQotICAgIFJldHVybnM6Ci0gICAgICBTdHJpbmcgb2YgdGhlIGRldmljZSB0aW1lLgotICAgICIiIgotICAgIHJldHVybiBzZWxmLl9hZC5hZGIuc2hlbGwoCi0gICAgICAgICdkYXRlICsiJW0tJWQgJUg6JU06JVMuMDAwIicpLmRlY29kZSgpLnNwbGl0bGluZXMoKVswXQotCi0gIGRlZiBsb2djYXRfZmlsdGVyKAotICAgICAgc2VsZiwKLSAgICAgIHN0YXJ0X3RpbWU6IHN0ciwKLSAgICAgIHRleHRfZmlsdGVyOiBzdHIgPSAnJykgLT4gc3RyOgotICAgICIiIlJldHVybnMgbG9nY2F0IGFmdGVyIGEgZ2l2ZW4gdGltZS4KLQotICAgIFRoaXMgbWV0aG9kIGNhbGxzIGZyb20gdGhlIGFuZHJvaWRfZGV2aWNlIGxvZ2NhdCBzZXJ2aWNlIGZpbGUgYW5kIGZpbHRlcnMKLSAgICBhbGwgbG9nY2F0IGxpbmUgcHJpb3IgdG8gdGhlIHN0YXJ0X3RpbWUuCi0KLSAgICBBcmdzOgotICAgICAgc3RhcnRfdGltZTogc3RhcnQgdGltZSBpbiBzdHJpbmcgZm9ybWF0IG9mIF9EQVRFVElNRV9GTVQuCi0gICAgICB0ZXh0X2ZpbHRlcjogb25seSByZXR1cm4gbG9nY2F0IGxpbmVzIHRoYXQgaW5jbHVkZSB0aGlzIHN0cmluZy4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIGxvZ2NhdCBvdXRwdXQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBWYWx1ZUVycm9yIEV4Y2VwdGlvbiBpZiBzdGFydF90aW1lIGlzIGludmFsaWQgZm9ybWF0LgotICAgICIiIgotICAgIHRyeToKLSAgICAgIHN0YXJ0X3RpbWVfY29udiA9IGRhdGV0aW1lLmRhdGV0aW1lLnN0cnB0aW1lKHN0YXJ0X3RpbWUsIF9EQVRFVElNRV9GTVQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXg6Ci0gICAgICBsb2dnaW5nLmVycm9yKCdJbnZhbGlkIHRpbWUgZm9ybWF0IScpCi0gICAgICByYWlzZSBleAotICAgIGxvZ2NhdF9yZXNwb25zZSA9ICcnCi0gICAgd2l0aCBvcGVuKHNlbGYuX2FkLmFkYl9sb2djYXRfZmlsZV9wYXRoLCAncicsIGVycm9ycz0ncmVwbGFjZScpIFwKLSAgICAgICAgYXMgbG9nY2F0X2ZpbGU6Ci0gICAgICBwb3N0X3N0YXJ0X3RpbWUgPSBGYWxzZQotICAgICAgZm9yIGxpbmUgaW4gbG9nY2F0X2ZpbGU6Ci0gICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9sb2djYXRfdGltZS5tYXRjaChsaW5lKQotICAgICAgICBpZiBtYXRjaDoKLSAgICAgICAgICBpZiAoZGF0ZXRpbWUuZGF0ZXRpbWUuc3RycHRpbWUoCi0gICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCdkYXRldGltZScpLCBfREFURVRJTUVfRk1UKSA+PSBzdGFydF90aW1lX2NvbnYpOgotICAgICAgICAgICAgcG9zdF9zdGFydF90aW1lID0gVHJ1ZQotICAgICAgICAgIGlmIHBvc3Rfc3RhcnRfdGltZSBhbmQgbGluZS5maW5kKHRleHRfZmlsdGVyKSA+PSAwOgotICAgICAgICAgICAgbG9nY2F0X3Jlc3BvbnNlICs9IGxpbmUKLSAgICByZXR1cm4gbG9nY2F0X3Jlc3BvbnNlCi0KLSAgZGVmIGxvZ2NhdF9maWx0ZXJfbWVzc2FnZSgKLSAgICAgIHNlbGYsCi0gICAgICBjdXJyZW50X3RpbWU6IHN0ciwKLSAgICAgIHRleHQ6IHN0ciA9ICcnKSAtPiBzdHI6Ci0gICAgIiIiREVQUkVDQVRFRCBCdWlsZHMgdGhlIGxvZ2NhdCBjb21tYW5kLgotCi0gICAgVGhpcyBtZXRob2QgYnVpbGRzIHRoZSBsb2djYXQgY29tbWFuZCB0byBjaGVjayBmb3IgYSBzcGVjaWZpZWQgbG9nCi0gICAgbWVzc2FnZSBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUuIElmIHRleHQ9Tm9uZSwgdGhlIGxvZ2NhdCByZXR1cm5lZCB3aWxsIGJlCi0gICAgdW5maWx0ZXJlZC4KLQotICAgIEFyZ3M6Ci0gICAgICBjdXJyZW50X3RpbWU6IHRpbWUgY3V0b2ZmIGZvciBncmVwcGluZyBmb3IgdGhlIHNwZWNpZmllZAotICAgICAgICBtZXNzYWdlLCBmb3JtYXQgPSAoJyVtLSVkICVIOiVNOiVTLjAwMCcpLgotICAgICAgdGV4dDogdGV4dCB0byBzZWFyY2ggZm9yLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSByZXNwb25zZSBvZiB0aGUgbG9nY2F0IGZpbHRlci4KLSAgICAiIiIKLSAgICByZXR1cm4gc2VsZi5sb2djYXRfZmlsdGVyKGN1cnJlbnRfdGltZSwgdGV4dCkKLQotICBkZWYgc2VuZF9tZWRpYV9wYXNzdGhyb3VnaF9jbWQoCi0gICAgICBzZWxmLAotICAgICAgY29tbWFuZDogc3RyLAotICAgICAgZXZlbnRfcmVjZWl2ZXI6IE9wdGlvbmFsW0FuZHJvaWREZXZpY2VdID0gTm9uZSkgLT4gTm9uZToKLSAgICAiIiJTZW5kcyBhIG1lZGlhIHBhc3N0aHJvdWdoIGNvbW1hbmQuCi0KLSAgICBBcmdzOgotICAgICAgY29tbWFuZDogc3RyaW5nLCBtZWRpYSBwYXNzdGhyb3VnaCBjb21tYW5kLgotICAgICAgZXZlbnRfcmVjZWl2ZXI6IEFuZHJvaWREZXZpY2UsIGEgZGV2aWNlIHdoaWNoIHN0YXJ0cwotICAgICAgICAgIEJsdWV0b290aFNMNEFBdWRpb1NyY01CUy4KLQotICAgIFJhaXNlczoKLSAgICAgIHNpZ25hbHMuQ29udHJvbGxlckVycm9yOiByYWlzZWQgaWYgdGhlIGV2ZW50IGlzIG5vdCByZWNlaXZlZC4KLSAgICAiIiIKLSAgICBzZWxmLl9hZC5sb2cuaW5mbygnU2VuZGluZyBNZWRpYSBQYXNzdGhvdWdoOiAlcycgJSBjb21tYW5kKQotICAgIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoTWVkaWFQYXNzdGhyb3VnaChjb21tYW5kKQotICAgIHRyeToKLSAgICAgIGlmIG5vdCBldmVudF9yZWNlaXZlcjoKLSAgICAgICAgZXZlbnRfcmVjZWl2ZXIgPSBzZWxmLl9hZAotICAgICAgZXZlbnRfcmVjZWl2ZXIuZWQucG9wX2V2ZW50KE1FRElBX0NNRF9NQVBbY29tbWFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVZFTlRfVElNRU9VVF9TRUMpCi0gICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgotICAgICAgcmFpc2Ugc2lnbmFscy5Db250cm9sbGVyRXJyb3IoCi0gICAgICAgICAgJ0RldmljZSAiJXMiIGZhaWxlZCB0byByZWNlaXZlIHRoZSBldmVudCAiJXMiICcKLSAgICAgICAgICAnd2hlbiB0aGUgY29tbWFuZCAiJXMiIHdhcyBzZW50LicgJQotICAgICAgICAgIChldmVudF9yZWNlaXZlci5zZXJpYWwsIE1FRElBX0NNRF9NQVBbY29tbWFuZF0sIGNvbW1hbmQpKQotCi0gIGRlZiBwYXVzZShzZWxmKSAtPiBOb25lOgotICAgICIiIlNlbmRzIHRoZSBBVlJDUCBjb21tYW5kICJwYXVzZSIuIiIiCi0gICAgc2VsZi5zZW5kX21lZGlhX3Bhc3N0aHJvdWdoX2NtZChidF9jb25zdGFudHMuQ01EX01FRElBX1BBVVNFKQotCi0gIGRlZiBwbGF5KHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiU2VuZHMgdGhlIEFWUkNQIGNvbW1hbmQgInBsYXkiLiIiIgotICAgIHNlbGYuc2VuZF9tZWRpYV9wYXNzdGhyb3VnaF9jbWQoYnRfY29uc3RhbnRzLkNNRF9NRURJQV9QTEFZKQotCi0gIGRlZiB0cmFja19wcmV2aW91cyhzZWxmKSAtPiBOb25lOgotICAgICIiIlNlbmRzIHRoZSBBVlJDUCBjb21tYW5kICJza2lwUHJldiIuIiIiCi0gICAgc2VsZi5zZW5kX21lZGlhX3Bhc3N0aHJvdWdoX2NtZChidF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfUFJFVikKLQotICBkZWYgdHJhY2tfbmV4dChzZWxmKSAtPiBOb25lOgotICAgICIiIlNlbmRzIHRoZSBBVlJDUCBjb21tYW5kICJza2lwTmV4dCIuIiIiCi0gICAgc2VsZi5zZW5kX21lZGlhX3Bhc3N0aHJvdWdoX2NtZChidF9jb25zdGFudHMuQ01EX01FRElBX1NLSVBfTkVYVCkKLQotICBkZWYgZ2V0X2N1cnJlbnRfdHJhY2tfaW5mbyhzZWxmKSAtPiBEaWN0W3N0ciwgQW55XToKLSAgICAiIiJSZXR1cm5zIERpY3QgKE1lZGlhIG1ldGFkYXRhKSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdHJhY2suIiIiCi0gICAgcmV0dXJuIHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoTWVkaWFHZXRDdXJyZW50TWVkaWFNZXRhRGF0YSgpCi0KLSAgZGVmIGdldF9jdXJyZW50X3BsYXliYWNrX3N0YXRlKHNlbGYpIC0+IGludDoKLSAgICAiIiJSZXR1cm5zIEludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHBsYXliYWNrIHN0YXRlLiIiIgotICAgIHJldHVybiBzZWxmLl9hZC5zbDRhLmJsdWV0b290aE1lZGlhR2V0Q3VycmVudFBsYXliYWNrU3RhdGUoKVsnc3RhdGUnXQotCi0gIGRlZiB2ZXJpZnlfcGxheWJhY2tfc3RhdGVfY2hhbmdlZCgKLSAgICAgIHNlbGYsCi0gICAgICBleHBlY3RlZF9zdGF0ZTogc3RyLAotICAgICAgZXhjZXB0aW9uOiBPcHRpb25hbFtFeGNlcHRpb25dID0gTm9uZSkgLT4gYm9vbDoKLSAgICAiIiJWZXJpZmllcyB0aGUgcGxheWJhY2sgc3RhdGUgaXMgY2hhbmdlZCB0byBiZSB0aGUgZXhwZWN0ZWQgc3RhdGUuCi0KLSAgICBBcmdzOgotICAgICAgZXhwZWN0ZWRfc3RhdGU6IHN0cmluZywgdGhlIGNoYW5nZWQgc3RhdGUgYXMgZXhwZWN0ZWQuCi0gICAgICBleGNlcHRpb246IEV4Y2VwdGlvbiwgcmFpc2VkIHdoZW4gdGhlIHN0YXRlIGlzIG5vdCBjaGFuZ2VkIGlmIG5lZWRlZC4KLSAgICAiIiIKLSAgICBidF90ZXN0X3V0aWxzLndhaXRfdW50aWwoCi0gICAgICAgIHRpbWVvdXRfc2VjPU1FRElBX1VQREFURV9USU1FT1VUX1NFQywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9c2VsZi5nZXRfY3VycmVudF9wbGF5YmFja19zdGF0ZSwKLSAgICAgICAgZnVuY19hcmdzPVtdLAotICAgICAgICBleHBlY3RlZF92YWx1ZT1leHBlY3RlZF9zdGF0ZSwKLSAgICAgICAgZXhjZXB0aW9uPWV4Y2VwdGlvbikKLQotICBkZWYgdmVyaWZ5X2N1cnJlbnRfdHJhY2tfY2hhbmdlZCgKLSAgICAgIHNlbGYsCi0gICAgICBleHBlY3RlZF90cmFjazogc3RyLAotICAgICAgZXhjZXB0aW9uOiBPcHRpb25hbFtFeGNlcHRpb25dID0gTm9uZSkgLT4gYm9vbDoKLSAgICAiIiJWZXJpZmllcyB0aGUgTm93IHBsYXlpbmcgdHJhY2sgaXMgY2hhbmdlZCB0byBiZSB0aGUgZXhwZWN0ZWQgdHJhY2suCi0KLSAgICBBcmdzOgotICAgICAgZXhwZWN0ZWRfdHJhY2s6IHN0cmluZywgdGhlIGNoYW5nZWQgdHJhY2sgYXMgZXhwZWN0ZWQuCi0gICAgICBleGNlcHRpb246IEV4Y2VwdGlvbiwgcmFpc2VkIHdoZW4gdGhlIHRyYWNrIGlzIG5vdCBjaGFuZ2VkIGlmIG5lZWRlZC4KLSAgICAiIiIKLSAgICBidF90ZXN0X3V0aWxzLndhaXRfdW50aWwoCi0gICAgICAgIHRpbWVvdXRfc2VjPU1FRElBX1VQREFURV9USU1FT1VUX1NFQywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9c2VsZi5nZXRfY3VycmVudF90cmFja19pbmZvLAotICAgICAgICBmdW5jX2FyZ3M9W10sCi0gICAgICAgIGV4cGVjdGVkX3ZhbHVlPWV4cGVjdGVkX3RyYWNrLAotICAgICAgICBleGNlcHRpb249ZXhjZXB0aW9uKQotCi0gIGRlZiB2ZXJpZnlfYXZyY3BfZXZlbnQoCi0gICAgICBzZWxmLAotICAgICAgZXZlbnRfbmFtZTogQXZyY3BFdmVudCwKLSAgICAgIGNoZWNrX3RpbWU6IHN0ciwKLSAgICAgIHRpbWVvdXRfc2VjOiBmbG9hdCA9IDIwKSAtPiBib29sOgotICAgICIiIlZlcmlmaWVzIHRoYXQgYW4gQVZSQ1AgZXZlbnQgd2FzIHJlY2VpdmVkIGJ5IGFuIEFuZHJvaWREZXZpY2UuCi0KLSAgICBDaGVja3MgbG9nY2F0IHRvIHZlcmlmeSB0aGF0IGFuIEFWUkNQIGV2ZW50IHdhcyByZWNlaXZlZCBhZnRlciBhIGdpdmVuCi0gICAgdGltZS4KLQotICAgIEFyZ3M6Ci0gICAgICBldmVudF9uYW1lOiBlbnVtLCBBVlJDUCBldmVudCBuYW1lLiBDdXJyZW50bHkgc3VwcG9ydHMgcGxheSwgcGF1c2UsCi0gICAgICB0cmFja19wcmV2aW91cywgYW5kIHRyYWNrX25leHQuCi0gICAgICBjaGVja190aW1lOiBzdHJpbmcsIFRoZSBlYXJsaWVzdCBkZXNpcmVkIGN1dG9mZiB0aW1lIHRvIGNoZWNrIHRoZSBsb2djYXQuCi0gICAgICBNdXN0IGJlIGluIGZvcm1hdCAnJW0tJWQgJUg6JU06JVMuMDAwJy4gVXNlCi0gICAgICBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZSgnJW0tJWQgJUg6JU06JVMuJWYnKSB0byBnZXQgY3VycmVudCB0aW1lCi0gICAgICBpbiB0aGlzIGZvcm1hdC4KLSAgICAgIHRpbWVvdXRfc2VjOiBpbnQsIE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgQVZSQ1AgZXZlbnQKLSAgICAgICAgYmUgZm91bmQgaW4gbG9nY2F0LgotCi0gICAgUmFpc2VzOgotICAgICAgVGVzdEVycm9yCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHJlY2VpdmVkLgotICAgICIiIgotICAgIGF2cmNwX2V2ZW50cyA9IFsKLSAgICAgICAgJ1N0YXRlOk5PVF9QTEFZSU5HLT5QTEFZSU5HJywgJ1N0YXRlOlBMQVlJTkctPk5PVF9QTEFZSU5HJywKLSAgICAgICAgJ3NlbmRNZWRpYUtleUV2ZW50OiBrZXlFdmVudD03NicsICdzZW5kTWVkaWFLZXlFdmVudDoga2V5RXZlbnQ9NzUnCi0gICAgXQotICAgIGlmIGV2ZW50X25hbWUudmFsdWUgbm90IGluIGF2cmNwX2V2ZW50czoKLSAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEVycm9yKCdBbiB1bmV4cGVjdGVkIEFWUkNQIGV2ZW50IGlzIHNwZWNpZmllZC4nKQotCi0gICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKSArIHRpbWVvdXRfc2VjCi0gICAgd2hpbGUgdGltZS50aW1lKCkgPCBlbmRfdGltZToKLSAgICAgIGlmIHNlbGYubG9nY2F0X2ZpbHRlcl9tZXNzYWdlKGNoZWNrX3RpbWUsIGV2ZW50X25hbWUudmFsdWUpOgotICAgICAgICBsb2dnaW5nLmluZm8oJyVzIGV2ZW50IHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4nLCBldmVudF9uYW1lKQotICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgdGltZS5zbGVlcCgxKQotICAgIGxvZ2dpbmcuZXJyb3IoJ0FuZHJvaWREZXZpY2UgZmFpbGVkIHRvIHJlY2VpdmUgJXMgZXZlbnQuJywgZXZlbnRfbmFtZSkKLSAgICBsb2dnaW5nLmluZm8oJ0xvZ2NhdDpcbiVzJywgc2VsZi5sb2djYXRfZmlsdGVyX21lc3NhZ2UoY2hlY2tfdGltZSkpCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIGFkZF9nb29nbGVfYWNjb3VudChzZWxmLCByZXRyaWVzOiBpbnQgPSA1KSAtPiBib29sOgotICAgICIiIkxvZ2luIEdvb2dsZSBhY2NvdW50LgotCi0gICAgQXJnczoKLSAgICAgICAgcmV0cmllczogaW50LCB0aGUgbnVtYmVyIG9mIHJldHJpZXMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiBhY2NvdW50IGlzIGFkZGVkIHN1Y2Nlc3NmdWxseS4KLQotICAgIFJhaXNlczoKLSAgICAgIFRlc3RFcnJvcgotICAgICIiIgotICAgIGZvciBfIGluIHJhbmdlKHJldHJpZXMpOgotICAgICAgb3V0cHV0ID0gc2VsZi5fYWQuYWRiLnNoZWxsKAotICAgICAgICAgICdhbSBpbnN0cnVtZW50IC13IC1lIGFjY291bnQgIiVzIiAtZSBwYXNzd29yZCAnCi0gICAgICAgICAgJyIlcyIgLWUgc3luYyB0cnVlIC1lIHdhaXQtZm9yLWNoZWNraW4gZmFsc2UgJwotICAgICAgICAgICdjb20uZ29vZ2xlLmFuZHJvaWQudHJhZGVmZWQuYWNjb3VudC8uQWRkQWNjb3VudCcgJQotICAgICAgICAgIChzZWxmLl9hZC5kaW1lbnNpb25zWydnb29nbGVfYWNjb3VudCddLAotICAgICAgICAgICBzZWxmLl9hZC5kaW1lbnNpb25zWydnb29nbGVfYWNjb3VudF9wYXNzd29yZCddKSkuZGVjb2RlKCkKLSAgICAgIGlmICdyZXN1bHQ9U1VDQ0VTUycgaW4gb3V0cHV0OgotICAgICAgICBsb2dnaW5nLmluZm8oJ0dvb2dsZSBhY2NvdW50IGlzIGFkZGVkIHN1Y2Nlc3NmdWxseScpCi0gICAgICAgIHRpbWUuc2xlZXAoMykgICMgV2FpdCBmb3IgYWNjb3VudCB0byBzdGVhZHkgc3RhdGUKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcignRmFpbGVkIHRvIGFkZCBnb29nbGUgYWNjb3VudDogJXMnICUgb3V0cHV0KQotCi0gIGRlZiByZW1vdmVfZ29vZ2xlX2FjY291bnQoc2VsZiwgcmV0cmllczogaW50ID0gNSkgLT4gYm9vbDoKLSAgICAiIiJSZW1vdmUgR29vZ2xlIGFjY291bnQuCi0KLSAgICBBcmdzOgotICAgICAgICByZXRyaWVzOiBpbnQsIHRoZSBudW1iZXIgb2YgcmV0cmllcy4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmIGFjY291bnQgaXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBUZXN0RXJyb3IKLSAgICAiIiIKLSAgICBmb3IgXyBpbiByYW5nZShyZXRyaWVzKToKLSAgICAgIG91dHB1dCA9IHNlbGYuX2FkLmFkYi5zaGVsbCgKLSAgICAgICAgICAnYW0gaW5zdHJ1bWVudCAtdyBjb20uZ29vZ2xlLmFuZHJvaWQudHJhZGVmZWQuYWNjb3VudC8uUmVtb3ZlQWNjb3VudHMnCi0gICAgICApLmRlY29kZSgpCi0gICAgICBpZiAncmVzdWx0PVNVQ0NFU1MnIGluIG91dHB1dDoKLSAgICAgICAgbG9nZ2luZy5pbmZvKCdHb29nbGUgYWNjb3VudCBpcyByZW1vdmVkIHN1Y2Nlc3NmdWxseScpCi0gICAgICAgIHJldHVybiBUcnVlCi0gICAgICB0aW1lLnNsZWVwKDEpICAjIEJ1ZmZlciBiZXR3ZWVuIHJldHJpZXMuCi0gICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoJ0ZhaWxlZCB0byByZW1vdmUgZ29vZ2xlIGFjY291bnQ6ICVzJyAlIG91dHB1dCkKLQotICBkZWYgbWFrZV9oYW5nb3V0c192b2ljZV9jYWxsKHNlbGYsIGNhbGxlZTogQW5kcm9pZERldmljZSkgLT4gTm9uZToKLSAgICAiIiJNYWtlIEhhbmdvdXRzIFZPSVAgdm9pY2UgY2FsbC4KLQotICAgIEFyZ3M6Ci0gICAgICAgIGNhbGxlZTogQW5kcm9pZCBEZXZpY2UsIHRoZSBhbmRyb2lkIGRldmljZSBvZiBjYWxsZWUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgTm9uZQotICAgICIiIgotICAgIHRyeToKLSAgICAgIHNlbGYuX2FkLmF1ZC5hZGRfd2F0Y2hlcignU0VUVVAnKS53aGVuKHRleHQ9J1NLSVAnKS5jbGljayh0ZXh0PSdTS0lQJykKLSAgICAgIHNlbGYuX2FkLmF1ZC5hZGRfd2F0Y2hlcignUkVNSU5ERVInKS53aGVuKHRleHQ9J0dvdCBpdCcpLmNsaWNrKAotICAgICAgICAgIHRleHQ9J0dvdCBpdCcpCi0gICAgZXhjZXB0IGFkYl91aS5FcnJvcjoKLSAgICAgICMgVE9ETyh1c2VyKTogTmVlZCB0byBmaWd1cmUgb3V0IHRoZSBsb2dpYyBoZXJlIHdoeSB1c2UgaW5mbyBpbgotICAgICAgIyBleGNlcHRpb24gY2F0Y2ggYmxvY2sgaW5zdGVhZCBvZiB3YXJuaW5nL2Vycm9yCi0gICAgICBsb2dnaW5nLmluZm8oJ1RoZSB3YXRjaGVyIGhhcyBiZWVuIGFkZGVkLicpCi0gICAgc2VsZi5fYWQuc2w0YS5hcHBMYXVuY2goJ2NvbS5nb29nbGUuYW5kcm9pZC50YWxrJykKLSAgICBjYWxsZWUuc2w0YS5hcHBMYXVuY2goJ2NvbS5nb29nbGUuYW5kcm9pZC50YWxrJykKLSAgICAjIE1ha2Ugdm9pY2UgY2FsbCB0byBjYWxsZWUKLSAgICB0cnk6Ci0gICAgICAjIENsaWNrIHRoZSBjYWxsZWUgaWNvbgotICAgICAgc2VsZi5fYWQuYXVkKHJlc291cmNlX2lkPSdjb20uZ29vZ2xlLmFuZHJvaWQudGFsazppZC9hdmF0YXJWaWV3JykuY2xpY2soKQotICAgIGV4Y2VwdCBhZGJfdWkuRXJyb3I6Ci0gICAgICAjIFByZXNzIEJBQ0sga2V5IHR3aWNlIGFuZCByZS1sYXVuY2ggSGFuZ291dHMgaWYgaXQgaXMgbm90IGluIG1haW4gcGFnZQotICAgICAgZm9yIF8gaW4gcmFuZ2UoMik6Ci0gICAgICAgIHNlbGYuX2FkLmF1ZC5zZW5kX2tleV9jb2RlKDQpCi0gICAgICBzZWxmLl9hZC5zbDRhLmFwcExhdW5jaCgnY29tLmdvb2dsZS5hbmRyb2lkLnRhbGsnKQotICAgICAgc2VsZi5fYWQuYXVkKHJlc291cmNlX2lkPSdjb20uZ29vZ2xlLmFuZHJvaWQudGFsazppZC9hdmF0YXJWaWV3JykuY2xpY2soKQotICAgICMgQ2xpY2sgdGhlIGJ1dHRvbiB0byBtYWtlIGEgdm9pY2UgY2FsbAotICAgIHNlbGYuX2FkLmF1ZChjb250ZW50X2Rlc2M9J0NhbGwnKS5jbGljaygpCi0gICAgIyBBbnN3ZXIgYnkgY2FsbGVlCi0gICAgaWYgY2FsbGVlLmF1ZCh0ZXh0PSdBbnN3ZXInKS5leGlzdHMoNSk6Ci0gICAgICBjYWxsZWUuYXVkKHRleHQ9J0Fuc3dlcicpLmNsaWNrKCkKLSAgICBlbHNlOgotICAgICAgY2FsbGVlLmF1ZChjb250ZW50X2Rlc2M9J0pvaW4gdm9pY2UgY2FsbCcpLmNsaWNrKCkKLQotICBkZWYgaGFuZ191cF9oYW5nb3V0c19jYWxsKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiSGFuZyB1cCBIYW5nb3V0cyBWT0lQIHZvaWNlIGNhbGwuCi0KLSAgICBSZXR1cm5zOgotICAgICAgTm9uZQotICAgICIiIgotICAgICMgQ2xpY2sgdGhlIGluIGNhbGwgaWNvbiB0byBzaG93IHRoZSBlbmQgY2FsbCBidXR0b24KLSAgICBzZWxmLl9hZC5hdWQoCi0gICAgICAgIHJlc291cmNlX2lkPSdjb20uZ29vZ2xlLmFuZHJvaWQudGFsazppZC9pbl9jYWxsX21haW5fYXZhdGFyJykuY2xpY2soKQotICAgICMgQ2xpY2sgdGhlIGJ1dHRvbiB0byBoYW5nIHVwIGNhbGwKLSAgICBzZWxmLl9hZC5hdWQoY29udGVudF9kZXNjPSdIYW5nIHVwJykuY2xpY2soKQotICAgIHRpbWUuc2xlZXAoMykgICMgV2FpdCBmb3IgVm9JUCBjYWxsIHN0YXRlIHRvIHJlYWNoIGlkbGUgc3RhdGUKLQotICBkZWYgZGV0ZWN0X2FuZF9wdWxsX3NzcmR1bXAoc2VsZiwgcmFtZHVtcF90eXBlOiBzdHIgPSAncmFtZHVtcF9idCcpIC0+IGJvb2w6Ci0gICAgIiIiRGV0ZWN0IGFuZCBwdWxsIFJBTURVTVAgbG9nLgotCi0gICAgQXJnczoKLSAgICAgIHJhbWR1bXBfdHlwZTogc3RyLCB0aGUgcGFydGlhbCBvZiBmaWxlIG5hbWVzIHRvIHNlYXJjaCBmb3IgaW4gcmFtZHVtcAotICAgICAgICBmaWxlcyBwYXRoLiAncmFtZHVtcF9idCcgaXMgdXNlZCBmb3Igc2VhcmNoaW5nIEJsdWV0b290aCByYW1kdW1wIGxvZwotICAgICAgICBmaWxlcy4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmIHRoZXJlIGlzIGEgZmlsZSB3aXRoIGZpbGUgbmFtZSBtYXRjaGluZyB0aGUgcmFtZHVtcCB0eXBlLgotICAgICIiIgotICAgIGZpbGVzID0gc2VsZi5fYWQuYWRiLnNoZWxsKCdscyAlcycgJSBidF9jb25zdGFudHMuUkFNRFVNUF9QQVRIKS5kZWNvZGUoKQotICAgIGlmIHJhbWR1bXBfdHlwZSBpbiBmaWxlczoKLSAgICAgIGxvZ2dpbmcuaW5mbygnUkFNRFVNUCBpcyBmb3VuZC4nKQotICAgICAgbG9nX25hbWVfdGltZXN0YW1wID0gbW9ibHlfbG9nZ2VyLmdldF9sb2dfZmlsZV90aW1lc3RhbXAoKQotICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5fYWQubG9nX3BhdGgsICdSYW1kdW1wTG9ncycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbmFtZV90aW1lc3RhbXApCi0gICAgICB1dGlscy5jcmVhdGVfZGlyKGRlc3RpbmF0aW9uKQotICAgICAgc2VsZi5fYWQuYWRiLnB1bGwoW2J0X2NvbnN0YW50cy5SQU1EVU1QX1BBVEgsIGRlc3RpbmF0aW9uXSkKLSAgICAgIHJldHVybiBUcnVlCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIGdldF9idF9udW1fb2ZfY3Jhc2hlcyhzZWxmKSAtPiBpbnQ6Ci0gICAgIiIiR2V0IG51bWJlciBvZiBCbHVldG9vdGggY3Jhc2ggdGltZXMgZnJvbSBibHVldG9vdGhfbWFuYWdlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBOdW1iZXIgb2YgQmx1ZXRvb3RoIGNyYXNoZWQgdGltZXMuCi0gICAgIiIiCi0gICAgb3V0ID0gc2VsZi5fcmVnZXhfYnRfY3Jhc2guc2VhcmNoKAotICAgICAgICBzZWxmLl9hZC5hZGIuc2hlbGwoJ2R1bXBzeXMgYmx1ZXRvb3RoX21hbmFnZXInKS5kZWNvZGUoKSkKLSAgICAjIFRPRE8odXNlcik6IE5lZWQgdG8gY29uc2lkZXIgdGhlIGNhc2UgIm91dD1Ob25lIiB3aGVuIG1pc3MgaW4KLSAgICAjIG1hdGNoaW5nCi0gICAgcmV0dXJuIGludChvdXQuZ3JvdXAoJ251bV9idF9jcmFzaGVzJykpCi0KLSAgZGVmIGNsZWFuX3NzcmR1bXAoc2VsZikgLT4gTm9uZToKLSAgICAiIiJDbGVhbiBSQU1EVU1QIGxvZy4KLQotICAgIFJldHVybnM6Ci0gICAgICBOb25lCi0gICAgIiIiCi0gICAgc2VsZi5fYWQuYWRiLnNoZWxsKCdybSAtcmYgJXMvKicgJSBidF9jb25zdGFudHMuUkFNRFVNUF9QQVRIKQotCi0gIGRlZiBzZXRfdGFyZ2V0KHNlbGYsIGJ0X2RldmljZTogQnREZXZpY2UpIC0+IE5vbmU6Ci0gICAgIiIiQWxsb3dzIGZvciB1c2UgdG8gZ2V0IHRhcmdldCBkZXZpY2Ugb2JqZWN0IGZvciB0YXJnZXQgaW50ZXJhY3Rpb24uIiIiCi0gICAgc2VsZi5fdGFyZ2V0X2RldmljZSA9IGJ0X2RldmljZQotCi0gIGRlZiB3YWl0X2Zvcl9oc3BfY29ubmVjdGlvbl9zdGF0ZShzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX2FkZHJlc3M6IHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZDogYm9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfc2VjOiBmbG9hdCA9IDMwKSAtPiBib29sOgotICAgICIiIldhaXRzIGZvciBIU1AgY29ubmVjdGlvbiB0byBiZSBpbiBhIGV4cGVjdGVkIHN0YXRlIG9uIEFuZHJvaWQgZGV2aWNlLgotCi0gICAgQXJnczoKLSAgICAgIG1hY19hZGRyZXNzOiBUaGUgQmx1ZXRvb3RoIG1hYyBhZGRyZXNzIG9mIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgIGNvbm5lY3RlZDogVHJ1ZSBpZiBIU1AgY29ubmVjdGlvbiBzdGF0ZSBpcyBjb25uZWN0ZWQgYXMgZXhwZWN0ZWQuCi0gICAgICB0aW1lb3V0X3NlYzogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgSFNQIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgotICAgICIiIgotICAgIGV4cGVjdGVkX3N0YXRlID0gQmx1ZXRvb3RoQ29ubmVjdGlvblN0YXR1cy5TVEFURV9ESVNDT05ORUNURUQKLSAgICBpZiBjb25uZWN0ZWQ6Ci0gICAgICBleHBlY3RlZF9zdGF0ZSA9IEJsdWV0b290aENvbm5lY3Rpb25TdGF0dXMuU1RBVEVfQ09OTkVDVEVECi0gICAgYnRfdGVzdF91dGlscy53YWl0X3VudGlsKAotICAgICAgICB0aW1lb3V0X3NlYz10aW1lb3V0X3NlYywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9c2VsZi5fYWQuc2w0YS5ibHVldG9vdGhIc3BHZXRDb25uZWN0aW9uU3RhdHVzLAotICAgICAgICBmdW5jX2FyZ3M9W21hY19hZGRyZXNzXSwKLSAgICAgICAgZXhwZWN0ZWRfdmFsdWU9ZXhwZWN0ZWRfc3RhdGUsCi0gICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAgICdGYWlsZWQgdG8gJXMgdGhlIGRldmljZSAiJXMiIHdpdGhpbiAlZCBzZWNvbmRzIHZpYSBIU1AuJyAlCi0gICAgICAgICAgICAoJ2Nvbm5lY3QnIGlmIGNvbm5lY3RlZCBlbHNlICdkaXNjb25uZWN0JywgbWFjX2FkZHJlc3MsCi0gICAgICAgICAgICAgdGltZW91dF9zZWMpKSkKLQotICBkZWYgd2FpdF9mb3JfYmx1ZXRvb3RoX3RvZ2dsZV9zdGF0ZShzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBib29sID0gVHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9zZWM6IGZsb2F0ID0gMzApIC0+IGJvb2w6Ci0gICAgIiIiV2FpdHMgZm9yIEJsdWV0b290aCB0byBiZSBpbiBhbiBleHBlY3RlZCBzdGF0ZS4KLQotICAgIEFyZ3M6Ci0gICAgICBlbmFibGVkOiBUcnVlIGlmIEJsdWV0b290aCBzdGF0dXMgaXMgZW5hYmxlZCBhcyBleHBlY3RlZC4KLSAgICAgIHRpbWVvdXRfc2VjOiBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBCbHVldG9vdGggdG8gYmUgaW4gdGhlIGV4cGVjdGVkCi0gICAgICAgICAgc3RhdGUuCi0gICAgIiIiCi0gICAgYnRfdGVzdF91dGlscy53YWl0X3VudGlsKAotICAgICAgICB0aW1lb3V0X3NlYz10aW1lb3V0X3NlYywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9c2VsZi5fYWQubWJzLmJ0SXNFbmFibGVkLAotICAgICAgICBmdW5jX2FyZ3M9W10sCi0gICAgICAgIGV4cGVjdGVkX3ZhbHVlPWVuYWJsZWQsCi0gICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAgICdCbHVldG9vdGggaXMgbm90ICVzIHdpdGhpbiAlZCBzZWNvbmRzIG9uIHRoZSBkZXZpY2UgIiVzIi4nICUKLSAgICAgICAgICAgICgnZW5hYmxlZCcgaWYgZW5hYmxlZCBlbHNlICdkaXNhYmxlZCcsIHRpbWVvdXRfc2VjLAotICAgICAgICAgICAgIHNlbGYuX2FkLnNlcmlhbCkpKQotCi0gIGRlZiB3YWl0X2Zvcl9hMmRwX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNfYWRkcmVzczogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZDogYm9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X3NlYzogZmxvYXQgPSAzMCkgLT4gYm9vbDoKLSAgICAiIiJXYWl0cyBmb3IgQTJEUCBjb25uZWN0aW9uIHRvIGJlIGluIGEgZXhwZWN0ZWQgc3RhdGUgb24gQW5kcm9pZCBkZXZpY2UuCi0KLSAgICBBcmdzOgotICAgICAgbWFjX2FkZHJlc3M6IFRoZSBCbHVldG9vdGggbWFjIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwgZGV2aWNlLgotICAgICAgY29ubmVjdGVkOiBUcnVlIGlmIEEyRFAgY29ubmVjdGlvbiBzdGF0ZSBpcyBjb25uZWN0ZWQgYXMgZXhwZWN0ZWQuCi0gICAgICB0aW1lb3V0X3NlYzogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgQTJEUCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZS4KLSAgICAiIiIKLSAgICBidF90ZXN0X3V0aWxzLndhaXRfdW50aWwoCi0gICAgICAgIHRpbWVvdXRfc2VjPXRpbWVvdXRfc2VjLAotICAgICAgICBjb25kaXRpb25fZnVuYz1zZWxmLmlzX2EyZHBfc2lua19jb25uZWN0ZWQsCi0gICAgICAgIGZ1bmNfYXJncz1bbWFjX2FkZHJlc3NdLAotICAgICAgICBleHBlY3RlZF92YWx1ZT1jb25uZWN0ZWQsCi0gICAgICAgIGV4Y2VwdGlvbj1zaWduYWxzLlRlc3RFcnJvcigKLSAgICAgICAgICAgICdGYWlsZWQgdG8gJXMgdGhlIGRldmljZSAiJXMiIHdpdGhpbiAlZCBzZWNvbmRzIHZpYSBBMkRQLicgJQotICAgICAgICAgICAgKCdjb25uZWN0JyBpZiBjb25uZWN0ZWQgZWxzZSAnZGlzY29ubmVjdCcsIG1hY19hZGRyZXNzLAotICAgICAgICAgICAgIHRpbWVvdXRfc2VjKSkpCi0KLSAgZGVmIHdhaXRfZm9yX25hcF9zZXJ2aWNlX2Nvbm5lY3Rpb24oCi0gICAgICBzZWxmLAotICAgICAgY29ubmVjdGVkX21hY19hZGRyOiBzdHIsCi0gICAgICBzdGF0ZV9jb25uZWN0ZWQ6IGJvb2wsCi0gICAgICBleGNlcHRpb246IEV4Y2VwdGlvbikgLT4gYm9vbDoKLSAgICAiIiJXYWl0cyBmb3IgTkFQIHNlcnZpY2UgY29ubmVjdGlvbiB0byBiZSBleHBlY3RlZCBzdGF0ZS4KLQotICAgIEFyZ3M6Ci0gICAgICBjb25uZWN0ZWRfbWFjX2FkZHI6IFN0cmluZywgQmx1ZXRvb3RoIE1hYyBhZGRyZXNzIGlzIG5lZWRlZCB0byBiZSBjaGVja2VkLgotICAgICAgc3RhdGVfY29ubmVjdGVkOiBCb29sLCBOQVAgc2VydmljZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFzIGV4cGVjdGVkCi0gICAgICAgICAgaWYgVHJ1ZSwgZWxzZSB0ZXJtaW5hdGVkIGFzIGV4cGVjdGVkLgotICAgICAgZXhjZXB0aW9uOiBFeGNlcHRpb24sIFJhaXNlZCBpZiBOQVAgc2VydmljZSBjb25uZWN0aW9uIGlzIG5vdCBleHBlY3RlZAotICAgICAgICBzdGF0ZS4KLQotICAgIFJhaXNlczoKLSAgICAgIGV4Y2VwdGlvbjogUmFpc2VkIGlmIE5BUCBzZXJ2aWNlIGNvbm5lY3Rpb24gaXMgbm90IGV4cGVjdGVkIHN0YXRlLgotICAgICIiIgotICAgIGRlZiBpc19kZXZpY2VfY29ubmVjdGVkKCk6Ci0gICAgICAiIiJSZXR1cm5zIFRydWUgaWYgY29ubmVjdGVkIGVsc2UgRmFsc2UuIiIiCi0gICAgICBjb25uZWN0ZWRfZGV2aWNlcyA9IHNlbGYuX2FkLnNsNGEuYmx1ZXRvb3RoUGFuR2V0Q29ubmVjdGVkRGV2aWNlcygpCi0gICAgICAjIENoZWNrIGlmIHRoZSBCbHVldG9vdGggbWFjIGFkZHJlc3MgaXMgaW4gdGhlIGNvbm5lY3RlZCBkZXZpY2UgbGlzdC4KLSAgICAgIHJldHVybiBjb25uZWN0ZWRfbWFjX2FkZHIgaW4gW2RbJ2FkZHJlc3MnXSBmb3IgZCBpbiBjb25uZWN0ZWRfZGV2aWNlc10KLQotICAgIGJ0X3Rlc3RfdXRpbHMud2FpdF91bnRpbCgKLSAgICAgICAgdGltZW91dF9zZWM9YnRfY29uc3RhbnRzLk5BUF9DT05ORUNUSU9OX1RJTUVPVVRfU0VDUywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9aXNfZGV2aWNlX2Nvbm5lY3RlZCwKLSAgICAgICAgZnVuY19hcmdzPVtdLAotICAgICAgICBleHBlY3RlZF92YWx1ZT1zdGF0ZV9jb25uZWN0ZWQsCi0gICAgICAgIGV4Y2VwdGlvbj1leGNlcHRpb24pCi0KLSAgZGVmIHZlcmlmeV9pbnRlcm5ldChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2FjY2VzczogYm9vbCwKLSAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3VybDogc3RyID0gVEVTVF9VUkwsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfc2VjOiBpbnQgPSBQSU5HX0lOVEVSVkFMX1RJTUVfU0VDLAotICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfc2VjOiBmbG9hdCA9IFBJTkdfVElNRU9VVF9TRUMpIC0+IGJvb2w6Ci0gICAgIiIiVmVyaWZpZXMgdGhhdCBpbnRlcm5ldCBpcyBpbiBleHBlY3RlZCBzdGF0ZS4KLQotICAgIENvbnRpbnVvdXNseSBtYWtlIHBpbmcgcmVxdWVzdCB0byBhIFVSTCBmb3IgaW50ZXJuZXQgdmVyaWZpY2F0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIGFsbG93X2FjY2VzczogQm9vbCwgRGV2aWNlIGNhbiBoYXZlIGludGVybmV0IGFjY2VzcyBhcyBleHBlY3RlZCBpZiBUcnVlLAotICAgICAgICAgIGVsc2Ugbm8gaW50ZXJuZXQgYWNjZXNzIGFzIGV4cGVjdGVkLgotICAgICAgZXhjZXB0aW9uOiBFeGNlcHRpb24sIFJhaXNlZCBpZiBpbnRlcm5ldCBpcyBub3QgaW4gZXhwZWN0ZWQgc3RhdGUuCi0gICAgICB0ZXN0X3VybDogU3RyaW5nLCBBIFVSTCBpcyB1c2VkIHRvIHZlcmlmeSBpbnRlcm5ldCBieSBwaW5nIHJlcXVlc3QuCi0gICAgICBpbnRlcnZhbF9zZWM6IEludCwgSW50ZXJ2YWwgdGltZSBiZXR3ZWVuIHBpbmcgcmVxdWVzdHMgaW4gc2Vjb25kLgotICAgICAgdGltZW91dF9zZWM6IEludCwgTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgcGluZyBzdWNjZXNzIGlmCi0gICAgICAgIGFsbG93X2FjY2VzcyBpcyBUcnVlIGVsc2Ugd2FpdCBmb3IgcGluZyBmYWlsdXJlIGlmIGFsbG93X2FjY2VzcyBpcwotICAgICAgICBGYWxzZS4KLQotICAgIFJhaXNlczoKLSAgICAgIGV4Y2VwdGlvbjogUmFpc2VkIGlmIGludGVybmV0IGlzIG5vdCBpbiBleHBlY3RlZCBzdGF0ZS4KLSAgICAiIiIKLSAgICBzZWxmLl9hZC5sb2cuaW5mbygnVmVyaWZ5IHRoYXQgaW50ZXJuZXQgJXMgYmUgdXNlZC4nICUKLSAgICAgICAgICAgICAgICAgICAgICAoJ2NhbicgaWYgYWxsb3dfYWNjZXNzIGVsc2UgJ2NhbiBub3QnKSkKLQotICAgIGRlZiBodHRwX3BpbmcoKToKLSAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiBodHRwIHBpbmcgc3VjY2VzcyBlbHNlIEZhbHNlLiIiIgotICAgICAgdHJ5OgotICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9hZC5zbDRhLmh0dHBQaW5nKHRlc3RfdXJsKSkKLSAgICAgIGV4Y2VwdCBqc29ucnBjX2NsaWVudF9iYXNlLkFwaUVycm9yIGFzIGU6Ci0gICAgICAgICMgQXBpRXJyb3IgaXMgcmFpc2VkIGJ5IGh0dHBQaW5nKCkgd2hlbiBubyBpbnRlcm5ldC4KLSAgICAgICAgc2VsZi5fYWQubG9nLmRlYnVnKHN0cihlKSkKLSAgICAgIHJldHVybiBGYWxzZQotCi0gICAgYnRfdGVzdF91dGlscy53YWl0X3VudGlsKAotICAgICAgICB0aW1lb3V0X3NlYz10aW1lb3V0X3NlYywKLSAgICAgICAgY29uZGl0aW9uX2Z1bmM9aHR0cF9waW5nLAotICAgICAgICBmdW5jX2FyZ3M9W10sCi0gICAgICAgIGV4cGVjdGVkX3ZhbHVlPWFsbG93X2FjY2VzcywKLSAgICAgICAgZXhjZXB0aW9uPWV4Y2VwdGlvbiwKLSAgICAgICAgaW50ZXJ2YWxfc2VjPWludGVydmFsX3NlYykKLQotICBkZWYgYWxsb3dfZXh0cmFfcGVybWlzc2lvbnMoc2VsZikgLT4gTm9uZToKLSAgICAiIiJBIG1ldGhvZCB0byBhbGxvdyBleHRyYSBwZXJtaXNzaW9ucy4KLQotICAgIFRoaXMgbWV0aG9kIGhhcyBubyBhbnkgbG9naWNzLiBJdCBpcyB1c2VkIHRvIHNraXAgdGhlIG9wZXJhdGlvbiB3aGVuIGl0IGlzCi0gICAgY2FsbGVkIGlmIGEgdGVzdCBpcyBub3QgV2VhciBPUyB1c2UgY2FzZS4KLSAgICAiIiIKLQotICBkZWYgZ290b19ibHVldG9vdGhfZGV2aWNlX2RldGFpbHMoc2VsZikgLT4gTm9uZToKLSAgICAiIiJHb2VzIHRvIGJsdWV0b290aCBkZXZpY2UgZGV0YWlsIHBhZ2UuIiIiCi0gICAgc2VsZi5fYWQuYWRiLnNoZWxsKCdhbSBmb3JjZS1zdG9wIGNvbS5hbmRyb2lkLnNldHRpbmdzJykKLSAgICBzZWxmLl9hZC5hZGIuc2hlbGwoJ2FtIHN0YXJ0IC1hIGFuZHJvaWQuc2V0dGluZ3MuQkxVRVRPT1RIX1NFVFRJTkdTJykKLSAgICBzZWxmLl9hZC5hdWQoCi0gICAgICAgIHJlc291cmNlX2lkPSdjb20uYW5kcm9pZC5zZXR0aW5nczppZC9zZXR0aW5nc19idXR0b24nKS5jbGljaygpCi0KLSAgZGVmIGJsdWV0b290aF91aV9mb3JnZXRfZGV2aWNlKHNlbGYpIC0+IE5vbmU6Ci0gICAgIiIiQ2xpY2tzIHRoZSBmb3JnZXQgZGV2aWNlIGJ1dHRvbi4iIiIKLSAgICBzZWxmLmdvdG9fYmx1ZXRvb3RoX2RldmljZV9kZXRhaWxzKCkKLSAgICBzZWxmLl9hZC5hdWQocmVzb3VyY2VfaWQ9J2NvbS5hbmRyb2lkLnNldHRpbmdzOmlkL2J1dHRvbjEnKS5jbGljaygpCi0KLSAgZGVmIGJsdWV0b290aF91aV9kaXNjb25uZWN0X2RldmljZShzZWxmKSAtPiBOb25lOgotICAgICIiIkNsaWNrcyB0aGUgZGlzY29ubmVjdCBkZXZpY2UgYnV0dG9uLiIiIgotICAgIHNlbGYuZ290b19ibHVldG9vdGhfZGV2aWNlX2RldGFpbHMoKQotICAgIHNlbGYuX2FkLmF1ZChyZXNvdXJjZV9pZD0nY29tLmFuZHJvaWQuc2V0dGluZ3M6aWQvYnV0dG9uMicpLmNsaWNrKCkKLQotICBkZWYgX2ZpbmRfYnRfZGV2aWNlX2RldGFpbHNfdWlfc3dpdGNoKHNlbGYsIHN3aXRjaF9uYW1lOiBzdHIpOgotICAgICIiIlJldHVybnMgdGhlIFVJIG5vZGUgZm9yIGEgQlQgc3dpdGNoLgotCi0gICAgQXJnczoKLSAgICAgIHN3aXRjaF9uYW1lOiBlYWNoIHN3aXRjaCBidXR0b24gbmFtZSBpbiBibHVldG9vdGggY29ubmVjdCBkZXZpY2UgZGV0YWlsCi0gICAgICBwYWdlLiBzd2l0Y2ggbmFtZSBsaWtlICdQaG9uZSBjYWxscycsICdNZWRpYSBhdWRpbycsIGV0Yy4KLQotICAgIFJldHVybnM6Ci0gICAgICBhZGJfdWlfZGV2aWNlLlhNTCBub2RlIFVJIGVsZW1lbnQgb2YgdGhlIEJUIGVhY2ggb3B0aW9uIHN3aXRjaCBidXR0b24uCi0gICAgIiIiCi0gICAgc3dpdGNoX2J1dHRvbl9uYW1lID0gKCdQaG9uZSBjYWxscycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdNZWRpYSBhdWRpbycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdDb250YWN0IHNoYXJpbmcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnVGV4dCBNZXNzYWdlcycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgIGlmIHN3aXRjaF9uYW1lIG5vdCBpbiBzd2l0Y2hfYnV0dG9uX25hbWU6Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKGYnVW5rbm93biBzd2l0Y2ggbmFtZSB7c3dpdGNoX25hbWV9LicpCi0gICAgc2VsZi5nb3RvX2JsdWV0b290aF9kZXZpY2VfZGV0YWlscygpCi0gICAgdGV4dF9ub2RlID0gYWRiX3VpLndhaXRfYW5kX2dldF94bWxfbm9kZSgKLSAgICAgICAgc2VsZi5fYWQsIHRpbWVvdXQ9MTAsIHRleHQ9c3dpdGNoX25hbWUpCi0gICAgdGV4dF9ncmFuZHBhcmVudF9ub2RlID0gdGV4dF9ub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZQotICAgIHN3aXRjaF9ub2RlID0gYWRiX3VpLlNlbGVjdG9yKAotICAgICAgICByZXNvdXJjZV9pZD0nYW5kcm9pZDppZC9zd2l0Y2hfd2lkZ2V0JykuZmluZF9ub2RlKHRleHRfZ3JhbmRwYXJlbnRfbm9kZSkKLSAgICByZXR1cm4gc3dpdGNoX25vZGUKLQotICBkZWYgZ2V0X2J0X2RldmljZV9kZXRhaWxzX3VpX3N3aXRjaF9zdGF0ZShzZWxmLCBzd2l0Y2hfbmFtZTogc3RyKSAtPiBib29sOgotICAgICIiIkdldHMgYmx1ZXRvb3RoIGVhY2ggb3B0aW9uIHN3aXRjaCBidXR0b24gc3RhdGUgdmFsdWUuCi0KLSAgICBBcmdzOgotICAgICAgc3dpdGNoX25hbWU6IGVhY2ggc3dpdGNoIGJ1dHRvbiBuYW1lIGluIGJsdWV0b290aCBjb25uZWN0IGRldmljZSBkZXRhaWwKLSAgICAgIHBhZ2UuCi0KLSAgICBSZXR1cm5zOgotICAgICAgU3RhdGUgVHJ1ZSBvciBGYWxzZS4KLSAgICAiIiIKLSAgICBzd2l0Y2hfbm9kZSA9IHNlbGYuX2ZpbmRfYnRfZGV2aWNlX2RldGFpbHNfdWlfc3dpdGNoKHN3aXRjaF9uYW1lKQotICAgIGN1cnJlbnRfc3RhdGUgPSBzd2l0Y2hfbm9kZS5hdHRyaWJ1dGVzWydjaGVja2VkJ10udmFsdWUgPT0gJ3RydWUnCi0gICAgcmV0dXJuIGN1cnJlbnRfc3RhdGUKLQotICBkZWYgc2V0X2J0X2RldmljZV9kZXRhaWxzX3VpX3N3aXRjaF9zdGF0ZSgKLSAgICAgIHNlbGYsIHN3aXRjaF9uYW1lOiBzdHIsCi0gICAgICB0YXJnZXRfc3RhdGU6IGJvb2wpIC0+IE5vbmU6Ci0gICAgIiIiU2V0cyBhbmQgY2hlY2tzIHRoZSBCVCBlYWNoIG9wdGlvbiBidXR0b24gaXMgdGhlIHRhcmdldCBlbmFibGUgc3RhdGUuCi0KLSAgICBBcmdzOgotICAgICAgc3dpdGNoX25hbWU6IGVhY2ggc3dpdGNoIGJ1dHRvbiBuYW1lIGluIGJsdWV0b290aCBjb25uZWN0IGRldmljZSBkZXRhaWwKLSAgICAgIHBhZ2UuCi0gICAgICB0YXJnZXRfc3RhdGU6IFRoZSBkZXNpcmVkIHN0YXRlIGV4cGVjdGVkIGZyb20gdGhlIHN3aXRjaC4gSWYgdGhlIHN0YXRlIG9mCi0gICAgICB0aGUgc3dpdGNoIGFscmVhZHkgbWVldCBleHBlY3RhdGlvbiwgbm8gYWN0aW9uIHdpbGwgYmUgdGFrZW4uCi0gICAgIiIiCi0gICAgaWYgc2VsZi5nZXRfYnRfZGV2aWNlX2RldGFpbHNfdWlfc3dpdGNoX3N0YXRlKHN3aXRjaF9uYW1lKSA9PSB0YXJnZXRfc3RhdGU6Ci0gICAgICByZXR1cm4KLSAgICBzd2l0Y2hfbm9kZSA9IHNlbGYuX2ZpbmRfYnRfZGV2aWNlX2RldGFpbHNfdWlfc3dpdGNoKHN3aXRjaF9uYW1lKQotICAgIHgsIHkgPSBhZGJfdWkuZmluZF9wb2ludF9pbl9ib3VuZHMoc3dpdGNoX25vZGUuYXR0cmlidXRlc1snYm91bmRzJ10udmFsdWUpCi0gICAgc2VsZi5fYWQuYXVkLmNsaWNrKHgsIHkpCi0KLSAgZGVmIGdldF9idF9xdWlja19zZXR0aW5nX3N3aXRjaF9zdGF0ZShzZWxmKSAtPiBib29sOgotICAgICIiIkdldHMgYmx1ZXRvb3RoIHF1aWNrIHNldHRpbmdzIHN3aXRjaCBidXR0b24gc3RhdGUgdmFsdWUuIiIiCi0gICAgc2VsZi5fYWQub3Blbl9ub3RpZmljYXRpb24oKQotICAgIHN3aXRjaF9ub2RlID0gc2VsZi5fYWRfYXVkKGNsYXNzX25hbWU9J2FuZHJvaWQud2lkZ2V0LlN3aXRjaCcsIGluZGV4PScxJykKLSAgICBjdXJyZW50X3N0YXRlID0gc3dpdGNoX25vZGUuYXR0cmlidXRlc1snY29udGVudC1kZXNjJ10udmFsdWUgPT0gJ0JsdWV0b290aC4nCi0gICAgcmV0dXJuIGN1cnJlbnRfc3RhdGUKLQotICBkZWYgYXNzZXJ0X2J0X2RldmljZV9kZXRhaWxzX3N0YXRlKHNlbGYsIHRhcmdldF9zdGF0ZTogYm9vbCkgLT4gTm9uZToKLSAgICAiIiJBc3NlcnRzIHRoZSBCbHVldG9vdGggY29ubmVjdGlvbiBzdGF0ZS4KLQotICAgICAgIEFzc2VydHMgdGhlIEJUIGVhY2ggb3B0aW9uIGJ1dHRvbiBpbiBkZXZpY2UgZGV0YWlsLAotICAgICAgIEJUIHF1aWNrIHNldHRpbmcgc3RhdGUgYW5kIEJUIG1hbmFnZXIgc2VydmljZSBmcm9tIGxvZyBhcmUgYXQgdGhlIHRhcmdldAotICAgICAgIHN0YXRlLgotCi0gICAgQXJnczoKLSAgICAgIHRhcmdldF9zdGF0ZTogQlQgZWFjaCBvcHRpb24gYnV0dG9uLCBxdWljayBzZXR0aW5nIGFuZCBibHVldG9vdGggbWFuYWdlcgotICAgICAgc2VydmljZSB0YXJnZXQgc3RhdGUuCi0KLSAgICAiIiIKLSAgICBmb3Igc3dpdGNoX25hbWUgaW4gWydQaG9uZSBjYWxscycsICdNZWRpYSBhdWRpbyddOgotICAgICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoCi0gICAgICAgICAgc2VsZi5fYWQuZ2V0X2J0X2RldmljZV9kZXRhaWxzX3VpX3N3aXRjaF9zdGF0ZShzd2l0Y2hfbmFtZSksCi0gICAgICAgICAgdGFyZ2V0X3N0YXRlLAotICAgICAgICAgIGYnVGhlIEJUIE1lZGlhIGNhbGxzIHN3aXRjaCBidXR0b24gc3RhdGUgaXMgbm90IHt0YXJnZXRfc3RhdGV9LicpCi0gICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoc2VsZi5fYWQuaXNfc2VydmljZV9ydW5uaW5nKCksIHRhcmdldF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmJ1RoZSBCVCBzZXJ2aWNlIHN0YXRlIGlzIG5vdCB7dGFyZ2V0X3N0YXRlfS4nKQotICAgIGFzc2VydHMuYXNzZXJ0X2VxdWFsKAotICAgICAgICBzZWxmLl9hZC5nZXRfYnRfcXVpY2tfc2V0dGluZ19zd2l0Y2hfc3RhdGUoKSwgdGFyZ2V0X3N0YXRlLAotICAgICAgICBmJ1RoZSBCVCBlYWNoIHN3aXRjaCBidXR0b24gc3RhdGUgaXMgbm90IHt0YXJnZXRfc3RhdGV9LicpCi0KLSAgZGVmIGlzX3NlcnZpY2VfcnVubmluZygKLSAgICAgIHNlbGYsCi0gICAgICBtYWNfYWRkcmVzczogc3RyLAotICAgICAgdGltZW91dF9zZWM6IGZsb2F0KSAtPiBib29sOgotICAgICIiIkNoZWNrcyBibHVldG9vdGggcHJvZmlsZSBzdGF0ZS4KLQotICAgICAgIENoZWNrIGJsdWV0b290aCBoZWFkc2V0L2EyZHAgcHJvZmlsZSBjb25uZWN0aW9uCi0gICAgICAgc3RhdHVzIGZyb20gYmx1ZXRvb3RoIG1hbmFnZXIgbG9nLgotCi0gICAgQXJnczoKLSAgICAgIG1hY19hZGRyZXNzOiBUaGUgQmx1ZXRvb3RoIG1hYyBhZGRyZXNzIG9mIHRoZSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgIHRpbWVvdXRfc2VjOiBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UKLSAgICAgIGJlIGZvdW5kIGluIGJsdWV0b290aCBtYW5hZ2VyIGxvZy4KLQotICAgIFJldHVybnM6Ci0gICAgICAgIFRydWU6IElmIHBhdHRlcm4gbWF0Y2ggd2l0aCBibHVldG9vdGhfbWFuYWdlcl9sb2cuCi0gICAgIiIiCi0gICAgcGF0dGVybl9oZWFkc2V0ID0gKHInXHNtXHcrZTpcc0NcdytkJykKLSAgICBwYXR0ZXJuX2EyZHAgPSAocidTdGF0ZU1hY2hpbmU6LipzdGF0ZT1Db25uZWN0ZWQnKQotICAgIG91dHB1dF9oZWFkc2V0ID0gc2VsZi5fYWQuYWRiLnNoZWxsKAotICAgICAgICAnZHVtcHN5cyBibHVldG9vdGhfbWFuYWdlciB8IGVncmVwIC1BMjAgIlByb2ZpbGU6IEhlYWRzZXRTZXJ2aWNlIicKLSAgICApLmRlY29kZSgpCi0gICAgb3V0cHV0X2EyZHAgPSBzZWxmLl9hZC5hZGIuc2hlbGwoCi0gICAgICAgICdkdW1wc3lzIGJsdWV0b290aF9tYW5hZ2VyIHwgZWdyZXAgLUEzMCAiUHJvZmlsZTogQTJkcFNlcnZpY2UiJykuZGVjb2RlKAotICAgICAgICApCi0gICAgc2VydmljZV90eXBlID0gewotICAgICAgICAnYTJkcCc6ICgocGF0dGVybl9hMmRwKSwgKG91dHB1dF9hMmRwKSksCi0gICAgICAgICdoZWFkc2V0JzogKChwYXR0ZXJuX2hlYWRzZXQpLCAob3V0cHV0X2hlYWRzZXQpKQotICAgIH0KLSAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyB0aW1lb3V0X3NlYwotICAgIHdoaWxlIHN0YXJ0X3RpbWUgPCBlbmRfdGltZToKLSAgICAgIHRyeToKLSAgICAgICAgbWF0Y2ggPSBzZXJ2aWNlX3R5cGUKLSAgICAgICAgaWYgbWF0Y2ggYW5kIG1hY19hZGRyZXNzIGluIHNlcnZpY2VfdHlwZToKLSAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgZXhjZXB0IGFkYi5BZGJFcnJvciBhcyBlOgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihlKQotICAgICAgdGltZS5zbGVlcChBREJfV0FJVElOR19USU1FX1NFQ09ORFMpCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIGJyb3dzZV9pbnRlcm5ldChzZWxmLCB1cmw6IHN0ciA9ICd3d3cuZ29vZ2xlLmNvbScpIC0+IE5vbmU6Ci0gICAgIiIiQnJvd3NlcyBpbnRlcm5ldCBieSBDaHJvbWUuCi0KLSAgICBBcmdzOgotICAgICAgdXJsOiB3ZWIgYWRkcmVzcy4KLQotICAgIFJhaXNlczoKLSAgICAgIHNpZ25hbHMuVGVzdEVycm9yOiByYWlzZWQgaWYgaXQgZmFpbGVkIHRvIGJyb3dzZSBpbnRlcm5ldCBieSBDaHJvbWUuCi0gICAgIiIiCi0gICAgYnJvd3NlX3VybCA9ICgKLSAgICAgICAgJ2FtIHN0YXJ0IC1uIGNvbS5hbmRyb2lkLmNocm9tZS9jb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbiAtZCcKLSAgICAgICAgJyAlcycgJSB1cmwKLSAgICApCi0gICAgc2VsZi5fYWQuYWRiLnNoZWxsKGJyb3dzZV91cmwpCi0gICAgc2VsZi5fYWQuYXVkLmFkZF93YXRjaGVyKCdXZWxjb21lJykud2hlbigKLSAgICAgICAgdGV4dD0nQWNjZXB0ICYgY29udGludWUnKS5jbGljayh0ZXh0PSdBY2NlcHQgJiBjb250aW51ZScpCi0gICAgc2VsZi5fYWQuYXVkLmFkZF93YXRjaGVyKCdzeW5jIHBhZ2UnKS53aGVuKAotICAgICAgICB0ZXh0PSdObyB0aGFua3MnKS5jbGljayh0ZXh0PSdObyB0aGFua3MnKQotICAgIGlmIHNlbGYuX2FkLmF1ZCh0ZXh0PSdObyBpbnRlcm5ldCcpLmV4aXN0cygpOgotICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RXJyb3IoJ05vIGNvbm5lY3QgaW50ZXJuZXQuJykKLQotICBkZWYgY29ubmVjdF93aWZpX2Zyb21fb3RoZXJfZGV2aWNlX2hvdHNwb3QoCi0gICAgICBzZWxmLCB3aWZpX2hvdHNwb3RfZGV2aWNlOiBBbmRyb2lkRGV2aWNlKSAtPiBOb25lOgotICAgICIiIlR1cm5zIG9uIDIuNEcgV2lmaSBob3RzcG90IGZyb20gdGhlIG90aGVyIGFuZHJvaWQgZGV2aWNlIGFuZCBjb25uZWN0IG9uIHRoZSBhbmRyb2lkIGRldmljZS4KLQotICAgIEFyZ3M6Ci0gICAgICB3aWZpX2hvdHNwb3RfZGV2aWNlOiBBbmRyb2lkIGRldmljZSwgdHVybiBvbiAyLjRHIFdpZmkgaG90c3BvdC4KLSAgICAiIiIKLSAgICAjIFR1cm4gb24gMi40RyBXaWZpIGhvdHNwb3Qgb24gdGhlIHNlY29uZGFyeSBwaG9uZS4KLSAgICB3aWZpX2hvdHNwb3RfZGV2aWNlLnNsNGEud2lmaVNldFdpZmlBcENvbmZpZ3VyYXRpb24oCi0gICAgICAgIGJ0X2NvbnN0YW50cy5XSUZJX0hPVFNQT1RfMl80RykKLSAgICB3aWZpX2hvdHNwb3RfZGV2aWNlLnNsNGEuY29ubmVjdGl2aXR5U3RhcnRUZXRoZXJpbmcoMCwgRmFsc2UpCi0gICAgIyBDb25uZWN0IHRoZSAyLjRHIFdpZmkgb24gdGhlIHByaW1hcnkgcGhvbmUuCi0gICAgc2VsZi5fYWQubWJzLndpZmlFbmFibGUoKQotICAgIHNlbGYuX2FkLm1icy53aWZpQ29ubmVjdFNpbXBsZSgKLSAgICAgICAgYnRfY29uc3RhbnRzLldJRklfSE9UU1BPVF8yXzRHWydTU0lEJ10sCi0gICAgICAgIGJ0X2NvbnN0YW50cy5XSUZJX0hPVFNQT1RfMl80R1sncGFzc3dvcmQnXSkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS91dGlscy9hcmR1aW5vX2Jhc2UucHkgYi9ibHVlYmVycnkvdXRpbHMvYXJkdWlub19iYXNlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M5MTQ2Li4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9hcmR1aW5vX2Jhc2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0iIiJCYXNlIGNsYXNzIGZvciBCbHVlYmVycnkgY29udHJvbGxlcnMgdXNpbmcgQXJkdWlubyBib2FyZC4KLQotVGhpcyBtb2R1bGUgdXNlcyBweXNlcmlhbCBsaWJyYXJ5IHRvIGNvbW11bmljYXRlIHdpdGggQXJkdWlubyBVTk8gYm9hcmQuCi0KLUFib3V0IEFyZHVpbm8gY29kZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBjb2RlIG9mIGZvbGxvd2luZyBBcmR1aW5vIHByb2plY3Q6Ci1JbnRlcm5hbCBsaW5rCi0iIiIKLQotaW1wb3J0IHRpbWUKLWZyb20gbW9ibHkuc2lnbmFscyBpbXBvcnQgQ29udHJvbGxlckVycm9yCi1pbXBvcnQgc2VyaWFsCi0KLQotY2xhc3MgQXJkdWlub0Jhc2Uob2JqZWN0KToKLSAgIiIiSW1wbGVtZW50cyBhbiBBcmR1aW5vIGJhc2UgY2xhc3MuCi0KLSAgQXR0cmlidXRlczoKLSAgICBzZXJpYWw6IHNlcmlhbCBvYmplY3QsIGEgc2VyaWFsIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGgKLSAgICAgIEFyZHVpbm8gYm9hcmQuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgotICAgICIiIkluaXRpYWxpemVzIGFuIEFyZHVpbm8gYmFzZSBjbGFzcy4iIiIKLSAgICBzZWxmLl92ZXJpZnlfY29uZmlnKGNvbmZpZykKLSAgICBzZWxmLnNlcmlhbCA9IHNlcmlhbC5TZXJpYWwoY29uZmlnWydhcmR1aW5vX3BvcnQnXSwgOTYwMCkKLSAgICBzZWxmLnNlcmlhbC50aW1lb3V0ID0gMzAKLSAgICAjIEJ1ZmZlciBiZXR3ZWVuIGNhbGxpbmcgc2VyaWFsLlNlcmlhbCgpIGFuZCBzZXJpYWwuU2VyaWFsLndyaXRlKCkuCi0gICAgdGltZS5zbGVlcCgyKQotCi0gIGRlZiBfdmVyaWZ5X2NvbmZpZyhzZWxmLCBjb25maWcpOgotICAgICIiIkNoZWNrcyB0aGUgZGV2aWNlIGNvbmZpZydzIHJlcXVpcmVkIGNvbmZpZyBwYXJhbWV0ZXJzLgotCi0gICAgQXJnczoKLSAgICAgIGNvbmZpZzogZGljdCwgTW9ibHkgY29udHJvbGxlciBjb25maWcgZm9yIEFyZHVpbm9CYXNzLiBUaGUgY29uZmlnIHNob3VsZAotICAgICAgICBpbmNsdWRlIHRoZSBrZXkgImFyZHVpbm9fcG9ydCIgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nCi0gICAgICAgIEFyZHVpbm8gYm9hcmQgbmFtZS4gZS5nLiAvZGV2L3R0eUFDTTAuCi0gICAgIiIiCi0gICAgaWYgJ2FyZHVpbm9fcG9ydCcgbm90IGluIGNvbmZpZzoKLSAgICAgIHJhaXNlIENvbnRyb2xsZXJFcnJvcignUGxlYXNlIHByb3ZpZGUgYW4gQXJkdWlubyBib2FyZCBwb3J0IGZvciB0aGUnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBBcmR1aW5vQmFzZSBpbiBNb2JpbGUgSGFybmVzcyBjb25maWcnKQotCi0gIGRlZiBfc2VuZF9zdHJpbmdfdG9fYXJkdWlubyhzZWxmLCB0eF9zdHJpbmcpOgotICAgICIiIlNlbmRzIGEgcGFydGljdWxhciBzdHJpbmcgdG8gY29tbXVuaWNhdGUgd2l0aCBBcmR1aW5vLgotCi0gICAgVGhlIG1ldGhvZCByZXF1aXJlcyB0aGF0IEFyZHVpbm8gY29kZSBjYW4gcmVhZCBzdHJpbmcgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbQotICAgIGEgcHl0aG9uIHNlcmlhbCBvYmplY3QgYW5kIHRoZW4gc2VuZCB0aGUgc2FtZSBzdHJpbmcgdG8gdGhlIHNlcmlhbCBvYmplY3QuCi0KLSAgICBBbiBleGFtcGxlIG9mIEFyZHVpbm8gY29kZToKLSAgICAgIFN0cmluZyBrUnhTdHJpbmcgPSAiIjsKLSAgICAgIHZvaWQgc2V0dXAoKSB7Ci0gICAgICAgIC4uLgotICAgICAgfQotICAgICAgdm9pZCBsb29wKCkgewotICAgICAgICBpZiAoU2VyaWFsLmF2YWlsYWJsZSgpID4gMCkgewotICAgICAgICAgIGtSeFN0cmluZyA9IFNlcmlhbC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgLi4uCi0gICAgICAgICAgU2VyaWFsLndyaXRlKGtSeFN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgQXJnczoKLSAgICAgIHR4X3N0cmluZzogc3RyaW5nLCBpcyB1c2VkIHRvIGJlIHNlbnQgdG8gQXJkdWlubyBwb3J0IGZvciBtYWtpbmcgdGhlCi0gICAgICAgIGNvbnRyb2xsZWQgZGV2aWNlIHBlcmZvcm0gYWN0aW9uLiBBZnRlciBBcmR1aW5vIHJlY2VpdmVzIHRoZSBzdHJpbmcsIGl0Ci0gICAgICAgIHdpbGwgc2VuZCBhIHJlc3BvbnNlIHdoaWNoIGlzIHRoZSBzYW1lIHN0cmluZy4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgdGltZSBpdCB0YWtlcyBmb3Igd2FpdGluZyBhIHJlc3BvbnNlLCBpbiBzZWNvbmRzLgotCi0gICAgUmFpc2VzOgotICAgICAgQ29udHJvbGxlckVycm9yOiByYWlzZWQgaWYgbm90IHJlY2VpdmVkIGEgcmVzcG9uc2UgZnJvbSBBcmR1aW5vLgotICAgICIiIgotICAgIHNlbGYuc2VyaWFsLndyaXRlKHN0ci5lbmNvZGUodHhfc3RyaW5nKSkKLSAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICByeF9zdHJpbmcgPSBzZWxmLnNlcmlhbC5yZWFkX3VudGlsKHR4X3N0cmluZywgbGVuKHR4X3N0cmluZykpLmRlY29kZSgpCi0gICAgaWYgcnhfc3RyaW5nID09IHR4X3N0cmluZzoKLSAgICAgIHJldHVybiB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKLSAgICByYWlzZSBDb250cm9sbGVyRXJyb3IoJ1RpbWVkIG91dCBhZnRlciAlZHMgd2FpdGluZyBmb3IgdGhlIHN0cmluZyAiJXMiIGZyb20nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICcgQXJkdWluby4nICUgKHNlbGYuc2VyaWFsLnRpbWVvdXQsIHR4X3N0cmluZykpCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdXRpbHMvYmx1ZWJlcnJ5X2Jhc2VfdGVzdC5weSBiL2JsdWViZXJyeS91dGlscy9ibHVlYmVycnlfYmFzZV90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmUxOWNkLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9ibHVlYmVycnlfYmFzZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLSIiIkJhc2UgdGVzdCBjbGFzcyBmb3IgQmx1ZWJlcnJ5LiIiIgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgcmUKLQotZnJvbSBtb2JseSBpbXBvcnQgYmFzZV90ZXN0Ci1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi1mcm9tIG1vYmx5LmNvbnRyb2xsZXJzIGltcG9ydCBhbmRyb2lkX2RldmljZQotZnJvbSBtb2JseS5jb250cm9sbGVycy5hbmRyb2lkX2RldmljZV9saWIgaW1wb3J0IGFkYgotCi0jIEludGVybmFsIGltcG9ydAotIyBJbnRlcm5hbCBpbXBvcnQKLSMgSW50ZXJuYWwgaW1wb3J0Ci0jIEludGVybmFsIGltcG9ydAotZnJvbSBibHVlYmVycnkuY29udHJvbGxlcnMgaW1wb3J0IGRlcml2ZWRfYnRfZGV2aWNlCi1mcm9tIGJsdWViZXJyeS5kZWNvcmF0b3JzIGltcG9ydCBhbmRyb2lkX2JsdWV0b290aF9jbGllbnRfZGVjb3JhdG9yCi1mcm9tIGJsdWViZXJyeS51dGlscy5hbmRyb2lkX2JsdWV0b290aF9kZWNvcmF0b3IgaW1wb3J0IEFuZHJvaWRCbHVldG9vdGhEZWNvcmF0b3IKLQotCi1jbGFzcyBCbHVlYmVycnlCYXNlVGVzdChiYXNlX3Rlc3QuQmFzZVRlc3RDbGFzcyk6Ci0gICIiIkJhc2UgdGVzdCBjbGFzcyBmb3IgYWxsIEJsdWViZXJyeSB0ZXN0cyB0byBpbmhlcml0IGZyb20uCi0KLSAgVGhpcyBjbGFzcyBhc3Npc3RzIHdpdGggZGV2aWNlIHNldHVwIGZvciBkZXZpY2UgbG9nZ2luZyBhbmQgb3RoZXIgcHJlIHRlc3QKLSAgc2V0dXAgcmVxdWlyZWQgZm9yIEJsdWV0b290aCB0ZXN0cy4KLSAgIiIiCi0KLSAgZGVmIHNldHVwX2dlbmVyYXRlZF90ZXN0cyhzZWxmKToKLSAgICAiIiJHZW5lcmF0ZXMgbXVsdGlwbGUgdGhlIHNhbWUgdGVzdHMgZm9yIHBpbG90IHJ1bi4KLQotICAgIFRoaXMgaXMgdXNlZCB0byBsZXQgZGV2ZWxvcGVycyBjYW4gZWFzaWx5IHBpbG90IHJ1biB0aGVpciB0ZXN0cyBtYW55IHRpbWVzLAotICAgIGhlbHAgdGhlbSB0byBjaGVjayB0ZXN0IHN0YWJpbGl0eSBhbmQgcmVsaWFiaWxpdHkuIElmIG5lZWQgdG8gdXNlIHRoaXMsCi0gICAgcGxlYXNlIGFkZCBhIGZsYWcgY2FsbGVkICJ0ZXN0X2l0ZXJhdGlvbnMiIHRvIFRlc3RQYXJhbXMgaW4gTW9ibHkgdGVzdAotICAgIGNvbmZpZ3VyYXRpb24gYW5kIGl0cyB2YWx1ZSBpcyBudW1iZXIgb2YgdGVzdCBtZXRob2RzIHRvIGJlIGdlbmVyYXRlZC4gVGhlCi0gICAgbmFtaW5nIHJ1bGUgb2YgdGVzdCBtZXRob2Qgb24gU3BvbmdlIGlzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBleGFtcGxlOgotICAgICAgdGVzdF9zZW5kX2ZpbGVfdmlhX2JsdWV0b290aF9vcHBfMV9vZl81MAotICAgICAgdGVzdF9zZW5kX2ZpbGVfdmlhX2JsdWV0b290aF9vcHBfMl9vZl81MAotICAgICAgdGVzdF9zZW5kX2ZpbGVfdmlhX2JsdWV0b290aF9vcHBfM19vZl81MAotICAgICAgLi4uCi0gICAgICB0ZXN0X3NlbmRfZmlsZV92aWFfYmx1ZXRvb3RoX29wcF81MF9vZl81MAotCi0gICAgRG9uJ3QgdXNlICJ0ZXN0X2Nhc2Vfc2VsZWN0b3IiIHdoZW4gdXNpbmcgInRlc3RfaXRlcmF0aW9ucyIsIGFuZCBwbGVhc2UgdXNlCi0gICAgInRlc3RfbWV0aG9kX3NlbGVjdG9yIiB0byByZXBsYWNlIGl0LgotICAgICIiIgotICAgIHRlc3RfaXRlcmF0aW9ucyA9IGludChzZWxmLnVzZXJfcGFyYW1zLmdldCgndGVzdF9pdGVyYXRpb25zJywgMCkpCi0gICAgaWYgdGVzdF9pdGVyYXRpb25zIDwgMjoKLSAgICAgIHJldHVybgotCi0gICAgdGVzdF9tZXRob2Rfc2VsZWN0b3IgPSBzZWxmLnVzZXJfcGFyYW1zLmdldCgndGVzdF9tZXRob2Rfc2VsZWN0b3InLCAnYWxsJykKLSAgICBleGlzdGluZ190ZXN0X25hbWVzID0gc2VsZi5nZXRfZXhpc3RpbmdfdGVzdF9uYW1lcygpCi0KLSAgICBzZWxlY3RlZF90ZXN0X25hbWVzID0gTm9uZQotICAgIGlmIHRlc3RfbWV0aG9kX3NlbGVjdG9yID09ICdhbGwnOgotICAgICAgc2VsZWN0ZWRfdGVzdF9uYW1lcyA9IGV4aXN0aW5nX3Rlc3RfbmFtZXMKLSAgICBlbHNlOgotICAgICAgc2VsZWN0ZWRfdGVzdF9uYW1lcyA9IHRlc3RfbWV0aG9kX3NlbGVjdG9yLnNwbGl0KCcgJykKLSAgICAgICMgQ2hlY2sgaWYgc2VsZWN0ZWQgdGVzdCBtZXRob2RzIGV4aXN0IGluIHRoZSB0ZXN0IGNsYXNzLgotICAgICAgZm9yIHRlc3RfbmFtZSBpbiBzZWxlY3RlZF90ZXN0X25hbWVzOgotICAgICAgICBpZiB0ZXN0X25hbWUgbm90IGluIGV4aXN0aW5nX3Rlc3RfbmFtZXM6Ci0gICAgICAgICAgcmFpc2UgYmFzZV90ZXN0LkVycm9yKCclcyBkb2VzIG5vdCBoYXZlIHRlc3QgbWV0aG9kICIlcyIuJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLlRBRywgdGVzdF9uYW1lKSkKLQotICAgIGZvciB0ZXN0X25hbWUgaW4gc2VsZWN0ZWRfdGVzdF9uYW1lczoKLSAgICAgIHRlc3RfbWV0aG9kID0gZ2V0YXR0cihzZWxmLl9fY2xhc3NfXywgdGVzdF9uYW1lKQotICAgICAgIyBMaXN0IG9mICg8bmV3IHRlc3QgbmFtZT4sIDx0ZXN0IG1ldGhvZD4pLgotICAgICAgdGVzdF9hcmdfc2V0cyA9IFsoJyVzXyVzX29mXyVzJyAlICh0ZXN0X25hbWUsIGkgKyAxLCB0ZXN0X2l0ZXJhdGlvbnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9tZXRob2QpIGZvciBpIGluIHJhbmdlKHRlc3RfaXRlcmF0aW9ucyldCi0gICAgICAjIHB5bGludDogZGlzYWJsZT1jZWxsLXZhci1mcm9tLWxvb3AKLSAgICAgIHNlbGYuZ2VuZXJhdGVfdGVzdHMoCi0gICAgICAgICAgdGVzdF9sb2dpYz1sYW1iZGEgXywgdGVzdDogdGVzdChzZWxmKSwKLSAgICAgICAgICBuYW1lX2Z1bmM9bGFtYmRhIG5hbWUsIF86IG5hbWUsCi0gICAgICAgICAgYXJnX3NldHM9dGVzdF9hcmdfc2V0cykKLQotICAgICMgRGVsZXRlIG9yaWdpbiB0ZXN0IG1ldGhvZHMgaW4gb3JkZXIgdG8gYXZvaWQgYmVsb3cgc2l0dWF0aW9uOgotICAgICMgICB0ZXN0X3NlbmRfZmlsZV92aWFfYmx1ZXRvb3RoX29wcCAgPC0tIG9yaWdpbiB0ZXN0IG1ldGhvZAotICAgICMgICB0ZXN0X3NlbmRfZmlsZV92aWFfYmx1ZXRvb3RoX29wcF8xX29mXzUwCi0gICAgIyAgIHRlc3Rfc2VuZF9maWxlX3ZpYV9ibHVldG9vdGhfb3BwXzJfb2ZfNTAKLSAgICBmb3IgdGVzdF9uYW1lIGluIGV4aXN0aW5nX3Rlc3RfbmFtZXM6Ci0gICAgICBkZWxhdHRyKHNlbGYuX19jbGFzc19fLCB0ZXN0X25hbWUpCi0KLSAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICIiIlNldHVwIGNsYXNzIGlzIGNhbGxlZCBiZWZvcmUgcnVubmluZyBhbnkgdGVzdHMuIiIiCi0gICAgc3VwZXIoQmx1ZWJlcnJ5QmFzZVRlc3QsIHNlbGYpLnNldHVwX2NsYXNzKCkKLSAgICBzZWxmLmNhcHR1cmVfYnVncmVwb3J0X29uX2ZhaWwgPSBpbnQoc2VsZi51c2VyX3BhcmFtcy5nZXQoCi0gICAgICAgICdjYXB0dXJlX2J1Z3JlcG9ydF9vbl9mYWlsJywgMCkpCi0gICAgc2VsZi5pZ25vcmVfZGV2aWNlX3NldHVwX2ZhaWx1cmVzID0gaW50KHNlbGYudXNlcl9wYXJhbXMuZ2V0KAotICAgICAgICAnaWdub3JlX2RldmljZV9zZXR1cF9mYWlsdXJlcycsIDApKQotICAgIHNlbGYuZW5hYmxlX2JsdWV0b290aF92ZXJib3NlX2xvZ2dpbmcgPSBpbnQoc2VsZi51c2VyX3BhcmFtcy5nZXQoCi0gICAgICAgICdlbmFibGVfYmx1ZXRvb3RoX3ZlcmJvc2VfbG9nZ2luZycsIDApKQotICAgIHNlbGYuZW5hYmxlX2hjaV9zbm9vcF9sb2dnaW5nID0gaW50KHNlbGYudXNlcl9wYXJhbXMuZ2V0KAotICAgICAgICAnZW5hYmxlX2hjaV9zbm9vcF9sb2dnaW5nJywgMCkpCi0gICAgc2VsZi5pbmNyZWFzZV9sb2dnZXJfYnVmZmVycyA9IGludChzZWxmLnVzZXJfcGFyYW1zLmdldCgKLSAgICAgICAgJ2luY3JlYXNlX2xvZ2dlcl9idWZmZXJzJywgMCkpCi0gICAgc2VsZi5lbmFibGVfYWxsX2JsdWV0b290aF9sb2dnaW5nID0gaW50KHNlbGYudXNlcl9wYXJhbXMuZ2V0KAotICAgICAgICAnZW5hYmxlX2FsbF9ibHVldG9vdGhfbG9nZ2luZycsIDApKQotCi0gICAgIyBiYXNlIHRlc3Qgc2hvdWxkIGluY2x1ZGUgdGhlIHRlc3QgYmV0d2VlbiBwcmltYXJ5IGRldmljZSB3aXRoIEJsdWV0b290aAotICAgICMgcGVyaXBoZXJhbCBkZXZpY2UuCi0gICAgc2VsZi5hbmRyb2lkX2RldmljZXMgPSBzZWxmLnJlZ2lzdGVyX2NvbnRyb2xsZXIoCi0gICAgICAgIGFuZHJvaWRfZGV2aWNlLCByZXF1aXJlZD1GYWxzZSkKLQotICAgICMgSW4gdGhlIGNhc2Ugb2Ygbm8gYW5kcm9pZF9kZXZpY2UgYXNzaWduZWQsIGF0IGxlYXN0IDIgZGVyaXZlZF9idF9kZXZpY2UKLSAgICAjIGlzIHJlcXVpcmVkLgotICAgIGlmIHNlbGYuYW5kcm9pZF9kZXZpY2VzIGlzIE5vbmU6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlcyA9IHNlbGYucmVnaXN0ZXJfY29udHJvbGxlcigKLSAgICAgICAgICBtb2R1bGU9ZGVyaXZlZF9idF9kZXZpY2UsIG1pbl9udW1iZXI9MikKLSAgICBlbHNlOgotICAgICAgc2VsZi5kZXJpdmVkX2J0X2RldmljZXMgPSBzZWxmLnJlZ2lzdGVyX2NvbnRyb2xsZXIoCi0gICAgICAgICAgbW9kdWxlPWRlcml2ZWRfYnRfZGV2aWNlLCByZXF1aXJlZD1GYWxzZSkKLQotICAgIGlmIHNlbGYuZGVyaXZlZF9idF9kZXZpY2VzIGlzIE5vbmU6Ci0gICAgICBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlcyA9IFtdCi0gICAgZWxzZToKLSAgICAgIGZvciBkZXJpdmVkX2RldmljZSBpbiBzZWxmLmRlcml2ZWRfYnRfZGV2aWNlczoKLSAgICAgICAgZGVyaXZlZF9kZXZpY2Uuc2V0X3VzZXJfcGFyYW1zKHNlbGYudXNlcl9wYXJhbXMpCi0gICAgICAgIGRlcml2ZWRfZGV2aWNlLnNldHVwKCkKLQotICAgIHNlbGYuYW5kcm9pZF91aV9kZXZpY2VzID0ge30KLSAgICAjIENyZWF0ZSBhIGRpY3Rpb25hcnkgb2YgQW5kcm9pZCBVSSBEZXZpY2VzCi0gICAgZm9yIGRldmljZSBpbiBzZWxmLmFuZHJvaWRfZGV2aWNlczoKLSAgICAgIHNlbGYuYW5kcm9pZF91aV9kZXZpY2VzW2RldmljZS5zZXJpYWxdID0gQWRiVWlEZXZpY2UoZGV2aWNlKQotICAgICAgbW9ibHlfY29uZmlnID0geydhdWQnOiBzZWxmLmFuZHJvaWRfdWlfZGV2aWNlc1tkZXZpY2Uuc2VyaWFsXX0KLSAgICAgIGRldmljZS5sb2FkX2NvbmZpZyhtb2JseV9jb25maWcpCi0gICAgICBuZWVkX3Jlc3RhcnRfYmx1ZXRvb3RoID0gRmFsc2UKLSAgICAgIGlmIChzZWxmLmVuYWJsZV9ibHVldG9vdGhfdmVyYm9zZV9sb2dnaW5nIG9yCi0gICAgICAgICAgc2VsZi5lbmFibGVfYWxsX2JsdWV0b290aF9sb2dnaW5nKToKLSAgICAgICAgaWYgc2VsZi5zZXRfYnRfdHJjX2xldmVsX3ZlcmJvc2UoZGV2aWNlKToKLSAgICAgICAgICBuZWVkX3Jlc3RhcnRfYmx1ZXRvb3RoID0gVHJ1ZQotICAgICAgaWYgc2VsZi5lbmFibGVfaGNpX3Nub29wX2xvZ2dpbmcgb3Igc2VsZi5lbmFibGVfYWxsX2JsdWV0b290aF9sb2dnaW5nOgotICAgICAgICBpZiBzZWxmLnNldF9idHNub29wbG9nbW9kZV9mdWxsKGRldmljZSk6Ci0gICAgICAgICAgbmVlZF9yZXN0YXJ0X2JsdWV0b290aCA9IFRydWUKLSAgICAgIGlmIHNlbGYuaW5jcmVhc2VfbG9nZ2VyX2J1ZmZlcnMgb3Igc2VsZi5lbmFibGVfYWxsX2JsdWV0b290aF9sb2dnaW5nOgotICAgICAgICBzZWxmLnNldF9sb2dnZXJfYnVmZmVyX3NpemVfMTZtKGRldmljZSkKLQotICAgICAgIyBSZXN0YXJ0cyBCbHVldG9vdGggdG8gdGFrZSBCVCBWRVJCT1NFIGFuZCBIQ0kgU25vb3AgbG9nZ2luZyBlZmZlY3QuCi0gICAgICBpZiBuZWVkX3Jlc3RhcnRfYmx1ZXRvb3RoOgotICAgICAgICBkZXZpY2UubG9nLmluZm8oJ1Jlc3RhcnRpbmcgQmx1ZXRvb3RoIGJ5IGFpcnBsYW5lIG1vZGUuLi4nKQotICAgICAgICBzZWxmLnJlc3RhcnRfYmx1ZXRvb3RoX2J5X2FpcnBsYW5lX21vZGUoZGV2aWNlKQotICAgIHNlbGYuYW5kcm9pZF9kZXZpY2VzID0gW0FuZHJvaWRCbHVldG9vdGhEZWNvcmF0b3IoZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZXZpY2UgaW4gc2VsZi5hbmRyb2lkX2RldmljZXNdCi0gICAgZm9yIGRldmljZSBpbiBzZWxmLmFuZHJvaWRfZGV2aWNlczoKLSAgICAgIGRldmljZS5zZXRfdXNlcl9wYXJhbXMoc2VsZi51c2VyX3BhcmFtcykKLQotICAgIHNlbGYuY2xpZW50X2RlY29yYXRvcnMgPSBzZWxmLnVzZXJfcGFyYW1zLmdldCgnc3luY19kZWNvcmF0b3InLCBbXSkKLSAgICBpZiBzZWxmLmNsaWVudF9kZWNvcmF0b3JzOgotICAgICAgc2VsZi5jbGllbnRfZGVjb3JhdG9ycyA9IHNlbGYuY2xpZW50X2RlY29yYXRvcnMuc3BsaXQoJywnKQotCi0gICAgc2VsZi50YXJnZXRfZGVjb3JhdG9ycyA9IHNlbGYudXNlcl9wYXJhbXMuZ2V0KCd0YXJnZXRfZGVjb3JhdG9yJywgW10pCi0gICAgaWYgc2VsZi50YXJnZXRfZGVjb3JhdG9yczoKLSAgICAgIHNlbGYudGFyZ2V0X2RlY29yYXRvcnMgPSBzZWxmLnRhcmdldF9kZWNvcmF0b3JzLnNwbGl0KCcsJykKLQotICAgIGZvciBkZWNvcmF0b3IgaW4gc2VsZi5jbGllbnRfZGVjb3JhdG9yczoKLSAgICAgIHNlbGYuYW5kcm9pZF9kZXZpY2VzWzBdID0gYW5kcm9pZF9ibHVldG9vdGhfY2xpZW50X2RlY29yYXRvci5kZWNvcmF0ZSgKLSAgICAgICAgICBzZWxmLmFuZHJvaWRfZGV2aWNlc1swXSwgZGVjb3JhdG9yKQotCi0gICAgZm9yIG51bV9kZXZpY2VzIGluIHJhbmdlKDEsIGxlbihzZWxmLmFuZHJvaWRfZGV2aWNlcykpOgotICAgICAgZm9yIGRlY29yYXRvciBpbiBzZWxmLnRhcmdldF9kZWNvcmF0b3JzOgotICAgICAgICBzZWxmLmFuZHJvaWRfZGV2aWNlc1sKLSAgICAgICAgICAgIG51bV9kZXZpY2VzXSA9IGFuZHJvaWRfYmx1ZXRvb3RoX2NsaWVudF9kZWNvcmF0b3IuZGVjb3JhdGUoCi0gICAgICAgICAgICAgICAgc2VsZi5hbmRyb2lkX2RldmljZXNbbnVtX2RldmljZXNdLCBkZWNvcmF0b3IpCi0KLSAgZGVmIG9uX2ZhaWwoc2VsZiwgcmVjb3JkKToKLSAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIHRlc3QgZmFpbHVyZS4iIiIKLSAgICAjIENhcHR1cmUgYnVncmVwb3J0cyBvbiBmYWlsIGlmIGVuYWJsZWQuCi0gICAgaWYgc2VsZi5jYXB0dXJlX2J1Z3JlcG9ydF9vbl9mYWlsOgotICAgICAgZGV2aWNlcyA9IHNlbGYuYW5kcm9pZF9kZXZpY2VzCi0gICAgICAjIEFsc28gY2FwdHVyZSBidWdyZXBvcnQgb2YgQW5kcm9pZEJ0VGFyZ2V0RGV2aWNlLgotICAgICAgZm9yIGQgaW4gc2VsZi5kZXJpdmVkX2J0X2RldmljZXM6Ci0gICAgICAgIGlmIGhhc2F0dHIoZCwgJ3Rha2VfYnVnX3JlcG9ydCcpOgotICAgICAgICAgIGRldmljZXMgPSBkZXZpY2VzICsgW2RdCi0gICAgICBhbmRyb2lkX2RldmljZS50YWtlX2J1Z19yZXBvcnRzKAotICAgICAgICAgIGRldmljZXMsCi0gICAgICAgICAgcmVjb3JkLnRlc3RfbmFtZSwKLSAgICAgICAgICByZWNvcmQuYmVnaW5fdGltZSwKLSAgICAgICAgICBkZXN0aW5hdGlvbj1zZWxmLmN1cnJlbnRfdGVzdF9pbmZvLm91dHB1dF9wYXRoKQotCi0gIGRlZiBzZXRfbG9nZ2VyX2J1ZmZlcl9zaXplXzE2bShzZWxmLCBkZXZpY2UpOgotICAgICIiIlNldHMgYWxsIGxvZ2dlciBzaXplcyBwZXIgbG9nIGJ1ZmZlciB0byAxNk0uIiIiCi0gICAgZGV2aWNlLmxvZy5pbmZvKCdTZXR0aW5nIGFsbCBsb2dnZXIgc2l6ZXMgcGVyIGxvZyBidWZmZXIgdG8gMTZNLi4uJykKLSAgICAjIExvZ2dlciBidWZmZXIgaW5mbzoKLSAgICAjIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvbG9nY2F0I2FsdGVybmF0aXZlQnVmZmVycwotICAgIGxvZ2dlcl9idWZmZXJzID0gWydtYWluJywgJ3N5c3RlbScsICdjcmFzaCcsICdyYWRpbycsICdldmVudHMnLCAna2VybmVsJ10KLSAgICBmb3IgYnVmZmVyIGluIGxvZ2dlcl9idWZmZXJzOiAgIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLWJ1aWx0aW4KLSAgICAgIGRldmljZS5hZGIuc2hlbGwoJ2xvZ2NhdCAtYiAlcyAtRyAxNk0nICUgYnVmZmVyKQotICAgICAgYnVmZmVyX3NpemUgPSBkZXZpY2UuYWRiLnNoZWxsKCdsb2djYXQgLWIgJXMgLWcnICUgYnVmZmVyKQotICAgICAgaWYgaXNpbnN0YW5jZShidWZmZXJfc2l6ZSwgYnl0ZXMpOgotICAgICAgICBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplLmRlY29kZSgpCi0gICAgICBpZiAncmluZyBidWZmZXIgaXMgMTYnIGluIGJ1ZmZlcl9zaXplOgotICAgICAgICBkZXZpY2UubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBzZXQgIiVzIiBidWZmZXIgc2l6ZSB0byAxNk0uJyAlIGJ1ZmZlcikKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1zZyA9ICdGYWlsZWQgdG8gc2V0ICIlcyIgYnVmZmVyIHNpemUgdG8gMTZNLicgJSBidWZmZXIKLSAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2RldmljZV9zZXR1cF9mYWlsdXJlczoKLSAgICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcihtc2cpCi0gICAgICAgIGRldmljZS5sb2cud2FybmluZyhtc2cpCi0KLSAgZGVmIHNldF9idF90cmNfbGV2ZWxfdmVyYm9zZShzZWxmLCBkZXZpY2UpOgotICAgICIiIk1vZGlmaWVzIGV0Yy9ibHVldG9vdGgvYnRfc3RhY2suY29uZiB0byBlbmFibGUgQmx1ZXRvb3RoIFZFUkJPU0UgbG9nLiIiIgotICAgIGRldmljZS5sb2cuaW5mbygnRW5hYmxpbmcgQmx1ZXRvb3RoIFZFUkJPU0UgbG9nZ2luZy4uLicpCi0gICAgYnRfc3RhY2tfY29uZiA9IGRldmljZS5hZGIuc2hlbGwoJ2NhdCBldGMvYmx1ZXRvb3RoL2J0X3N0YWNrLmNvbmYnKQotICAgIGlmIGlzaW5zdGFuY2UoYnRfc3RhY2tfY29uZiwgYnl0ZXMpOgotICAgICAgYnRfc3RhY2tfY29uZiA9IGJ0X3N0YWNrX2NvbmYuZGVjb2RlKCkKLSAgICAjIENoZWNrIGlmIDE5IHRyYWNlIGxldmVsIHNldHRpbmdzIGFyZSBzZXQgdG8gNihWRVJCT1NFKS4gRS5nLiBUUkNfSENJPTYuCi0gICAgaWYgbGVuKHJlLmZpbmRhbGwoJ1RSQy4qPVs2XScsIGJ0X3N0YWNrX2NvbmYpKSA9PSAxOToKLSAgICAgIGRldmljZS5sb2cuaW5mbygnQmx1ZXRvb3RoIFZFUkJPU0UgbG9nZ2luZyBoYXMgYWxyZWFkeSBlbmFibGVkLicpCi0gICAgICByZXR1cm4gRmFsc2UKLSAgICAjIFN1Z2dlc3QgdG8gdXNlIEFuZHJvaWREZXZpY2VTZXR0aW5nc0RlY29yYXRvciB0byBkaXNhYmxlIHZlcml0eSBhbmQgdGhlbgotICAgICMgcmVib290IChiLzE0MDI3NzQ0MykuCi0gICAgZGlzYWJsZV92ZXJpdHlfY2hlY2soZGV2aWNlKQotICAgIGRldmljZS5hZGIucmVtb3VudCgpCi0gICAgdHJ5OgotICAgICAgZGV2aWNlLmFkYi5zaGVsbChyJ3NlZCAtaSAicy9cKFRSQy4qPVwpMi9cMTYvZztzLyNcKExvZ2dpbmdWPS0tdj1cKTAvXDEzJwotICAgICAgICAgICAgICAgICAgICAgICAnLyIgZXRjL2JsdWV0b290aC9idF9zdGFjay5jb25mJykKLSAgICAgIGRldmljZS5sb2cuaW5mbygnU3VjY2Vzc2Z1bGx5IGVuYWJsZWQgQmx1ZXRvb3RoIFZFUkJPU0UgTG9nZ2luZy4nKQotICAgICAgcmV0dXJuIFRydWUKLSAgICBleGNlcHQgYWRiLkFkYkVycm9yOgotICAgICAgbXNnID0gJ0ZhaWxlZCB0byBlbmFibGUgQmx1ZXRvb3RoIFZFUkJPU0UgTG9nZ2luZy4nCi0gICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfZGV2aWNlX3NldHVwX2ZhaWx1cmVzOgotICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcihtc2cpCi0gICAgICBkZXZpY2UubG9nLndhcm5pbmcobXNnKQotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIHNldF9idHNub29wbG9nbW9kZV9mdWxsKHNlbGYsIGRldmljZSk6Ci0gICAgIiIiRW5hYmxlcyBibHVldG9vdGggc25vb3AgbG9nZ2luZy4iIiIKLSAgICBkZXZpY2UubG9nLmluZm8oJ0VuYWJsaW5nIEJsdWV0b290aCBIQ0kgU25vb3AgbG9nZ2luZy4uLicpCi0gICAgZGV2aWNlLmFkYi5zaGVsbCgnc2V0cHJvcCBwZXJzaXN0LmJsdWV0b290aC5idHNub29wbG9nbW9kZSBmdWxsJykKLSAgICBvdXQgPSBkZXZpY2UuYWRiLnNoZWxsKCdnZXRwcm9wIHBlcnNpc3QuYmx1ZXRvb3RoLmJ0c25vb3Bsb2dtb2RlJykKLSAgICBpZiBpc2luc3RhbmNlKG91dCwgYnl0ZXMpOgotICAgICAgb3V0ID0gb3V0LmRlY29kZSgpCi0gICAgIyBUaGUgZXhwZWN0ZWQgb3V0cHV0IGlzICJmdWxsL24iLgotICAgIGlmICdmdWxsJyBpbiBvdXQ6Ci0gICAgICBkZXZpY2UubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBlbmFibGVkIEJsdWV0b290aCBIQ0kgU25vb3AgTG9nZ2luZy4nKQotICAgICAgcmV0dXJuIFRydWUKLSAgICBtc2cgPSAnRmFpbGVkIHRvIGVuYWJsZSBCbHVldG9vdGggSENJIFNub29wIExvZ2dpbmcuJwotICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9kZXZpY2Vfc2V0dXBfZmFpbHVyZXM6Ci0gICAgICByYWlzZSBzaWduYWxzLlRlc3RFcnJvcihtc2cpCi0gICAgZGV2aWNlLmxvZy53YXJuaW5nKG1zZykKLSAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgcmVzdGFydF9ibHVldG9vdGhfYnlfYWlycGxhbmVfbW9kZShzZWxmLCBkZXZpY2UpOgotICAgICIiIlJlc3RhcnRzIGJsdWV0b290aCBieSBhaXJwbGFuZSBtb2RlLiIiIgotICAgIGVuYWJsZV9haXJwbGFuZV9tb2RlKGRldmljZSwgMykKLSAgICBkaXNhYmxlX2FpcnBsYW5lX21vZGUoZGV2aWNlLCAzKQpkaWZmIC0tZ2l0IGEvYmx1ZWJlcnJ5L3V0aWxzL2J0X2F1ZGlvX3V0aWxzLnB5IGIvYmx1ZWJlcnJ5L3V0aWxzL2J0X2F1ZGlvX3V0aWxzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGMyZThlLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9idF9hdWRpb191dGlscy5weQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0jIExpbnQgYXM6IHB5dGhvbjMKLSIiIlV0aWxzIGZvciBibHVldG9vdGggYXVkaW8gdGVzdGluZy4iIiIKLQotaW1wb3J0IGxvZ2dpbmcgYXMgbG9nCi1pbXBvcnQgb3MKLWltcG9ydCBudW1weSBhcyBucAotZnJvbSBzY2lweSBpbXBvcnQgc2lnbmFsIGFzIHNjaXB5X3NpZ25hbAotZnJvbSBzY2lweS5pbyBpbXBvcnQgd2F2ZmlsZQotIyBJbnRlcm5hbCBpbXBvcnQKLSMgSW50ZXJuYWwgaW1wb3J0Ci0KLQotZGVmIGdlbmVyYXRlX3NpbmVfd2F2ZV90b19kZXZpY2UoCi0gICAgZGV2aWNlLAotICAgIHB1c2hlZF9maWxlX3BhdGg9Jy9zZGNhcmQvTXVzaWMnLAotICAgIGZyZXF1ZW5jeT00ODAsCi0gICAgY2hhbm5lbD0yLAotICAgIHNhbXBsZV9yYXRlPTQ4MDAwLAotICAgIHNhbXBsZV9mb3JtYXQ9MTYsCi0gICAgZHVyYXRpb25fc2VjPTEwKToKLSAgIiIiR2VuZXJhdGVzIGEgZml4ZWQgZnJlcXVlbmN5IHNpbmUgd2F2ZSBmaWxlIGFuZCBwdXNoIGl0IHRvIHRoZSBkZXZpY2UuCi0KLSAgR2VuZXJhdGVzIGEgc2luZSB3YXZlIHRvIHRoZSBNb2JseSBkZXZpY2UgZGlyZWN0b3J5IGFuZCBwdXNoIGl0IHRvIHRoZSBkZXZpY2UKLSAgc3RvcmFnZS4gVGhlIG91dHB1dCBmaWxlIG5hbWUgZm9ybWF0IGlzIHN1Y2ggYXMgdGhlIGV4YW1wbGU6Ci0gICAgc2luZV80ODBoel8yY2hfNDgwMDByYXRlXzE2Yml0XzEwc2VjLndhdgotCi0gIEFyZ3M6Ci0gICAgZGV2aWNlOiBBbmRyb2lkRGV2aWNlLCBNb2JseSBBbmRyb2lkIGNvbnRyb2xsZXIgY2xhc3MuCi0gICAgcHVzaGVkX2ZpbGVfcGF0aDogc3RyaW5nLCB0aGUgd2F2ZSBmaWxlIHBhdGggd2hpY2ggaXMgcHVzaGVkIHRvIHRoZSBkZXZpY2UKLSAgICAgICAgc3RvcmFnZS4gRS5nLiAvc2RjYXJkL011c2ljCi0gICAgZnJlcXVlbmN5OiBpbnQsIGZpeGVkIGZyZXF1ZW5jeSBpbiBIei4KLSAgICBjaGFubmVsOiBpbnQsIG51bWJlciBvZiBjaGFubmVscy4KLSAgICBzYW1wbGVfcmF0ZTogaW50LCBzYW1wbGluZyByYXRlIGluIEh6LgotICAgIHNhbXBsZV9mb3JtYXQ6IGludCwgc2FtcGxpbmcgZm9ybWF0IGluIGJpdC4KLSAgICBkdXJhdGlvbl9zZWM6IGludCwgYXVkaW8gZHVyYXRpb24gaW4gc2Vjb25kLgotCi0gIFJldHVybnM6Ci0gICAgZGV2aWNlX3N0b3JhZ2VfcGF0aDogc3RyaW5nLCB0aGUgd2F2ZSBmaWxlIG9uIHRoZSBkZXZpY2Ugc3RvcmFnZS4KLSAgICBtb2JseV9kaXJlY3RvcnlfcGF0aDogc3RyaW5nLCB0aGUgd2F2ZSBmaWxlIG9uIHRoZSBNb2JseSBkZXZpY2UgZGlyZWN0b3J5LgotICAiIiIKLSAgZmlsZV9uYW1lID0gJ3NpbmVfJWRoel8lZGNoXyVkcmF0ZV8lZGJpdF8lZHNlYy53YXYnICUgKAotICAgICAgZnJlcXVlbmN5LCBjaGFubmVsLCBzYW1wbGVfcmF0ZSwgc2FtcGxlX2Zvcm1hdCwgZHVyYXRpb25fc2VjKQotICBtb2JseV9kaXJlY3RvcnlfcGF0aCA9IG9zLnBhdGguam9pbihkZXZpY2UubG9nX3BhdGgsIGZpbGVfbmFtZSkKLSAgb3Muc3lzdGVtKCclcyAtbiAtYyAlZCAtciAlZCAtYiAlZCAlcyBzeW50aCAlZCBzaW5lICVkJyAlCi0gICAgICAgICAgICAoYXVkaW9fcHJvY2Vzc29yLkF1ZGlvUHJvY2Vzc29yLlNPWCwgY2hhbm5lbCwgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgc2FtcGxlX2Zvcm1hdCwgbW9ibHlfZGlyZWN0b3J5X3BhdGgsIGR1cmF0aW9uX3NlYywgZnJlcXVlbmN5KSkKLSAgZGV2aWNlLmFkYi5wdXNoKFttb2JseV9kaXJlY3RvcnlfcGF0aCwgcHVzaGVkX2ZpbGVfcGF0aF0pCi0gIGRldmljZV9zdG9yYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4ocHVzaGVkX2ZpbGVfcGF0aCwgZmlsZV9uYW1lKQotICByZXR1cm4gZGV2aWNlX3N0b3JhZ2VfcGF0aCwgbW9ibHlfZGlyZWN0b3J5X3BhdGgKLQotCi1kZWYgbWVhc3VyZV9hdWRpb19tb3MocmVjb3JkZWRfYXVkaW9fZmlsZSwgcmVmZXJlbmNlX2F1ZGlvX2ZpbGUpOgotICAiIiJNZWFzdXJlcyBtZWFuIG9waW5pb24gc2NvcmUgKE1PUykgb2YgYSByZWNvcmRlZCBhdWRpby4KLQotICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIG1vZHVsZSBvZiBBL1YgQW5hbHlzaXMgU2VydmljZSB0byBtZWFzdXJlIE1PUzoKLSAgSW50ZXJuYWwgcmVmZXJlbmNlCi0KLSAgQXJnczoKLSAgICByZWNvcmRlZF9hdWRpb19maWxlOiBzdHJpbmcsIHRoZSByZWNvcmRlZCBhdWRpbyBmaWxlIHRvIGJlIG1lYXN1cmVkLgotICAgIHJlZmVyZW5jZV9hdWRpb19maWxlOiBzdHJpbmcsIHRoZSByZWZlcmVuY2UgYXVkaW8gZmlsZSBmb3IgY29tcGFyaXNvbi4KLQotICBSZXR1cm5zOgotICAgIEZsb2F0IHdoaWNoIGlzIHRoZSBtZWFuIG9waW5pb24gc2NvcmUgb2YgdGhlIHJlY29yZGVkIGF1ZGlvLgotICAiIiIKLSAgcmVzdWx0cyA9IGF1ZGlvX2NhbGN1bGF0b3IuQXVkaW9BbmFseXplcigpLkFuYWx5emUocmVmZXJlbmNlX2F1ZGlvX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZGVkX2F1ZGlvX2ZpbGUpCi0gICMgUmV0dXJucyAwLjAgaWYgdGhlIHJlc3VsdHMgZmFpbHMgdG8gYmUgZ2VuZXJhdGVkLgotICBpZiBub3QgcmVzdWx0czoKLSAgICBsb2cud2FybmluZygnRmFpbGVkIHRvIGdlbmVyYXRlIHRoZSBhdWRpbyBhbmFseXNpcyByZXN1bHRzLicpCi0gICAgcmV0dXJuIDAuMAotICByZXR1cm4gcmVzdWx0c1swXS5tb3MKLQotCi1kZWYgbWVhc3VyZV9mdW5kYW1lbnRhbF9mcmVxdWVuY3koc2lnbmFsLCBzYW1wbGVfcmF0ZSk6Ci0gICIiIk1lYXN1cmVzIGZ1bmRhbWVudGFsIGZyZXF1ZW5jeSBvZiBhIHNpZ25hbC4KLQotICBBcmdzOgotICAgIHNpZ25hbDogQW4gMS1EIGFycmF5IHJlcHJlc2VudGluZyB0aGUgc2lnbmFsIGRhdGEuCi0gICAgc2FtcGxlX3JhdGU6IGludCwgc2FtcGxlIHJhdGUgb2YgdGhlIHNpZ25hbC4KLQotICBSZXR1cm5zOgotICAgIEZsb2F0IHJlcHJlc2VudGluZyB0aGUgZnVuZGFtZW50YWwgZnJlcXVlbmN5LgotICAiIiIKLSAgcmV0dXJuIHNhbXBsZV9yYXRlICogKG5wLmFyZ21heChucC5hYnMobnAuZmZ0LnJmZnQoc2lnbmFsKSkpIC8gbGVuKHNpZ25hbCkpCi0KLQotZGVmIG1lYXN1cmVfcm1zKHNpZ25hbCk6Ci0gICIiIk1lYXN1cmVzIFJvb3QgTWVhbiBTcXVhcmUgKFJNUykgb2YgYSBzaWduYWwuCi0KLSAgQXJnczoKLSAgICBzaWduYWw6IEFuIDEtRCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHNpZ25hbCBkYXRhLgotCi0gIFJldHVybnM6Ci0gICAgRmxvYXQgcmVwcmVzZW50aW5nIHRoZSByb290IG1lYW4gc3F1YXJlLgotICAiIiIKLSAgcmV0dXJuIG5wLnNxcnQobnAubWVhbihucC5hYnNvbHV0ZShzaWduYWwpKioyKSkKLQotCi1kZWYgbWVhc3VyZV90aGRuKHNpZ25hbCwgc2FtcGxlX3JhdGUsIHEsIGZyZXF1ZW5jeT1Ob25lKToKLSAgIiIiTWVhc3VyZXMgVG90YWwgSGFybW9uaWMgRGlzdG9ydGlvbiArIE5vaXNlIChUSEQrTikgb2YgYSBzaWduYWwuCi0KLSAgQXJnczoKLSAgICBzaWduYWw6IEFuIDEtRCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHNpZ25hbCBkYXRhLgotICAgIHNhbXBsZV9yYXRlOiBpbnQsIHNhbXBsZSByYXRlIG9mIHRoZSBzaWduYWwuCi0gICAgcTogZmxvYXQsIHF1YWxpdHkgZmFjdG9yIGZvciB0aGUgbm90Y2ggZmlsdGVyLgotICAgIGZyZXF1ZW5jeTogZmxvYXQsIGZ1bmRhbWVudGFsIGZyZXF1ZW5jeSBvZiB0aGUgc2lnbmFsLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMKLSAgICAgICAgYXJlIG5vaXNlLiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGN1bGF0ZWQgdXNpbmcgRkZULgotCi0gIFJldHVybnM6Ci0gICAgRmxvYXQgcmVwcmVzZW50aW5nIFRIRCtOIHJhdGlvIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmF0aW8gb2YgUk1TIG9mIHB1cmUKLSAgICAgICAgaGFybW9uaWNzIGFuZCBub2lzZSBzaWduYWwgdG8gUk1TIG9mIG9yaWdpbmFsIHNpZ25hbC4KLSAgIiIiCi0gICMgTm9ybWFsaXplcyB0aGUgc2lnbmFsLgotICBzaWduYWwgLT0gbnAubWVhbihzaWduYWwpCi0gICMgR2V0cyBCbGFja21hbi1IYXJyaXMgd2luZG93IGZyb20gdGhlIHNpZ25hbC4KLSAgd2luZG93ID0gc2lnbmFsICogc2NpcHlfc2lnbmFsLmJsYWNrbWFuaGFycmlzKGxlbihzaWduYWwpKQotICAjIEZpbmRzIHRoZSBmdW5kYW1lbnRhbCBmcmVxdWVuY3kgdG8gcmVtb3ZlIGlmIG5vdCBzcGVjaWZpZWQuCi0gIGlmIG5vdCBmcmVxdWVuY3k6Ci0gICAgZnJlcXVlbmN5ID0gbWVhc3VyZV9mdW5kYW1lbnRhbF9mcmVxdWVuY3kod2luZG93LCBzYW1wbGVfcmF0ZSkKLSAgIyBDcmVhdGVzIGEgbm90Y2ggZmlsdGVyIHRvIGdldCBub2lzZSBmcm9tIHRoZSBzaWduYWwuCi0gIHdvID0gZnJlcXVlbmN5IC8gKHNhbXBsZV9yYXRlIC8gMikKLSAgYiwgYSA9IHNjaXB5X3NpZ25hbC5paXJub3RjaCh3bywgcSkKLSAgbm9pc2UgPSBzY2lweV9zaWduYWwubGZpbHRlcihiLCBhLCB3aW5kb3cpCi0gIHJldHVybiBtZWFzdXJlX3Jtcyhub2lzZSkgLyBtZWFzdXJlX3Jtcyh3aW5kb3cpCi0KLQotZGVmIG1lYXN1cmVfYXVkaW9fdGhkbl9wZXJfd2luZG93KAotICAgIGF1ZGlvX2ZpbGUsCi0gICAgdGhkbl90aHJlc2hvbGQsCi0gICAgc3RlcF9zaXplLAotICAgIHdpbmRvd19zaXplLAotICAgIHEsCi0gICAgZnJlcXVlbmN5PU5vbmUpOgotICAiIiJNZWFzdXJlcyBUb3RhbCBIYXJtb25pYyBEaXN0b3J0aW9uICsgTm9pc2UgKFRIRCtOKSBvZiBhbiBhdWRpbyBmaWxlLgotCi0gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjYXB0dXJlIGF1ZGlvIGdsaXRjaGVzIGZyb20gYSByZWNvcmRlZCBhdWRpbyBmaWxlLAotICBhbmQgdGhlIGF1ZGlvIGZpbGUgc2hhbGwgcmVjb3JkIGEgZml4ZWQgZnJlcXVlbmN5IHNpbmUgd2F2ZS4KLQotICBBcmdzOgotICAgIGF1ZGlvX2ZpbGU6IEEgLndhdiBmaWxlIHRvIGJlIG1lYXN1cmVkLgotICAgIHRoZG5fdGhyZXNob2xkOiBmbG9hdCwgYSBUSEQrTiB0aHJlc2hvbGQgdXNlZCB0byBjb21wYXJlIHdpdGggdGhlIG1lYXN1cmVkCi0gICAgICAgIFRIRCtOIGZvciBldmVyeSB3aW5kb3dzLiBJZiBUSEQrTiBvZiBhIHdpbmRvdyBpcyBncmVhdGVyIHRoYW4gdGhlCi0gICAgICAgIHRocmVzaG9sZCwgd2lsbCByZWNvcmQgdGhpcyB0byByZXN1bHRzLgotICAgIHN0ZXBfc2l6ZTogaW50LCBudW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlIHRoZSB3aW5kb3cgYnkgZm9yIGVhY2ggYW5hbHlzaXMuCi0gICAgd2luZG93X3NpemU6IGludCwgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYW5hbHl6ZSBlYWNoIHRpbWUuCi0gICAgcTogZmxvYXQsIHF1YWxpdHkgZmFjdG9yIGZvciB0aGUgbm90Y2ggZmlsdGVyLgotICAgIGZyZXF1ZW5jeTogZmxvYXQsIGZ1bmRhbWVudGFsIGZyZXF1ZW5jeSBvZiB0aGUgc2lnbmFsLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMKLSAgICAgICAgYXJlIG5vaXNlLiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGN1bGF0ZWQgdXNpbmcgRkZULgotCi0gIFJldHVybnM6Ci0gICAgTGlzdCBjb250YWluaW5nIGVhY2ggcmVzdWx0IG9mIGNoYW5uZWxzLiBMaWtlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICAgICBgYGAKLSAgICAgICAgICBbCi0gICAgICAgICAgICAgIFsgICMgcmVzdWx0IG9mIGNoYW5uZWwgMQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICJ0aGQrbiI6IDxmbG9hdD4sICAjIFRIRCtOIG9mIGEgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X3RpbWUiOiA8ZmxvYXQ+LCAgIyBzdGFydCB0aW1lIG9mIGEgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgICAgImVuZF90aW1lIjogPGZsb2F0PiwgICMgZW5kIHRpbWUgb2YgYSB3aW5kb3cKLSAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAuLi4sCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgIFsuLi4sXSAgIyByZXN1bHQgb2YgY2hhbm5lbCAyCi0gICAgICAgICAgICAgIC4uLiwKLSAgICAgICAgICBdCi0gICAgICAgIGBgYAotICAiIiIKLSAgaWYgc3RlcF9zaXplIDw9IDA6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcignc3RlcF9zaXplIHNoYWxsIGJlIGdyZWF0ZXIgdGhhbiAwLicpCi0gIGlmIHdpbmRvd19zaXplIDw9IDA6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcignd2luZG93X3NpemUgc2hhbGwgYmUgZ3JlYXRlciB0aGFuIDAuJykKLSAgc2FtcGxlX3JhdGUsIHdhdmVfZGF0YSA9IHdhdmZpbGUucmVhZChhdWRpb19maWxlKQotICB3YXZlX2RhdGEgPSB3YXZlX2RhdGEuYXN0eXBlKCdmbG9hdDY0JykKLSAgIyBDb2xsZWN0cyB0aGUgcmVzdWx0IGZvciBlYWNoIGNoYW5uZWxzLgotICByZXN1bHRzID0gW10KLSAgZm9yIHNpZ25hbCBpbiB3YXZlX2RhdGEudHJhbnNwb3NlKCk6Ci0gICAgY3VycmVudF9wb3NpdGlvbiA9IDAKLSAgICBjaGFubmVsX3Jlc3VsdCA9IFtdCi0gICAgd2hpbGUgY3VycmVudF9wb3NpdGlvbiArIHdpbmRvd19zaXplIDwgbGVuKHNpZ25hbCk6Ci0gICAgICB3aW5kb3cgPSBzaWduYWxbY3VycmVudF9wb3NpdGlvbjpjdXJyZW50X3Bvc2l0aW9uICsgd2luZG93X3NpemVdCi0gICAgICB0aGRuID0gbWVhc3VyZV90aGRuKAotICAgICAgICAgIHNpZ25hbD13aW5kb3csCi0gICAgICAgICAgc2FtcGxlX3JhdGU9c2FtcGxlX3JhdGUsCi0gICAgICAgICAgcT1xLAotICAgICAgICAgIGZyZXF1ZW5jeT1mcmVxdWVuY3kpCi0gICAgICBzdGFydF90aW1lID0gY3VycmVudF9wb3NpdGlvbiAvIHNhbXBsZV9yYXRlCi0gICAgICBlbmRfdGltZSA9IChjdXJyZW50X3Bvc2l0aW9uICsgd2luZG93X3NpemUpIC8gc2FtcGxlX3JhdGUKLSAgICAgIGlmIHRoZG4gPiB0aGRuX3RocmVzaG9sZDoKLSAgICAgICAgY2hhbm5lbF9yZXN1bHQuYXBwZW5kKHsKLSAgICAgICAgICAgICd0aGQrbic6IHRoZG4sCi0gICAgICAgICAgICAnc3RhcnRfdGltZSc6IHN0YXJ0X3RpbWUsCi0gICAgICAgICAgICAnZW5kX3RpbWUnOiBlbmRfdGltZQotICAgICAgICB9KQotICAgICAgY3VycmVudF9wb3NpdGlvbiArPSBzdGVwX3NpemUKLSAgICByZXN1bHRzLmFwcGVuZChjaGFubmVsX3Jlc3VsdCkKLSAgcmV0dXJuIHJlc3VsdHMKLQotCi1kZWYgdHJpbV9hdWRpbyhhdWRpb19maWxlOiBzdHIsCi0gICAgICAgICAgICAgICBkdXJhdGlvbl9zZWM6IGZsb2F0LAotICAgICAgICAgICAgICAgc3RhcnRfdGltZV9zZWM6IGZsb2F0ID0gMC4wKSAtPiBzdHI6Ci0gICIiIlRyaW1zIGFuIGF1ZGlvIGZpbGUgd2l0aCBhIHNwZWNpZmljIHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uLgotCi0gIEdlbmVyYXRlcyBhIG91dHB1dCBmaWxlIGFuZCBpdHMgbmFtZSBpcyBzdWNoIGFzIGJlbG93IGZvcm1hdDoKLSAgICBgPGlucHV0IGZpbGUgbmFtZT5fPHN0YXJ0IHRpbWUgc2VjPi08ZHVyYXRpb24gc2VjPi48aW5wdXQgZmlsZSB0eXBlPmAKLQotICBBcmdzOgotICAgIGF1ZGlvX2ZpbGU6IHN0cmluZywgYW4gYXVkaW8gZmlsZSB0byBiZSB0cmltZWQuCi0gICAgZHVyYXRpb25fc2VjOiBmbG9hdCwgdGhlIGR1cmF0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZSBpbiBzZWNvbmRzLgotICAgIHN0YXJ0X3RpbWVfc2VjOiBmbG9hdCwgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGF1ZGlvIGZpbGUgdG8gYmUgdHJpbW1lZCBpbgotICAgICAgICBzZWNvbmRzLiBEZWZhdWx0IHZhbHVlIGlzIDAuMCBzZWNvbmQgaWYgbm90IHNwZWNpZmllZC4KLQotICBSZXR1cm5zOgotICAgIFN0cmluZywgdGhlIG91dHB1dCBmaWxlIG9mIHRoZSBzYW1lIHBhdGggb2YgdGhlIG9yaWdpbiBmaWxlLgotICAiIiIKLSAgZmlsZV9wYXRoLCBmaWxlX25hbWUgPSBvcy5wYXRoLnNwbGl0KGF1ZGlvX2ZpbGUpCi0gIGZpbGVfbmFtZSwgZmlsZV9leHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVfbmFtZSkKLSAgb3V0cHV0X2ZpbGVfbmFtZSA9ICclc18lcy0lcyVzJyAlICgKLSAgICAgIGZpbGVfbmFtZSwKLSAgICAgIHN0YXJ0X3RpbWVfc2VjLAotICAgICAgKHN0YXJ0X3RpbWVfc2VjICsgZHVyYXRpb25fc2VjKSwKLSAgICAgIGZpbGVfZXh0KQotICBvdXRwdXRfZmlsZSA9IG9zLnBhdGguam9pbihmaWxlX3BhdGgsIG91dHB1dF9maWxlX25hbWUpCi0gIHByb2Nlc3NvciA9IGF1ZGlvX3Byb2Nlc3Nvci5BdWRpb1Byb2Nlc3NvcigpCi0gIHByb2Nlc3Nvci5UcmltQXVkaW8oCi0gICAgICBpbnB1dF9maWxlPWF1ZGlvX2ZpbGUsCi0gICAgICBvdXRwdXRfZmlsZT1vdXRwdXRfZmlsZSwKLSAgICAgIGR1cmF0aW9uPWR1cmF0aW9uX3NlYywKLSAgICAgIHN0YXJ0PXN0YXJ0X3RpbWVfc2VjKQotICByZXR1cm4gb3V0cHV0X2ZpbGUKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS91dGlscy9idF9jb25zdGFudHMucHkgYi9ibHVlYmVycnkvdXRpbHMvYnRfY29uc3RhbnRzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk0ZTgzLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9idF9jb25zdGFudHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotIyBMaW50IGFzOiBweXRob24zCi0iIiJDb25zdGFudHMgdXNlZCBmb3IgYmx1ZXRvb3RoIHRlc3QuIiIiCi0KLWltcG9ydCBlbnVtCi0KLQotIyMjIEdlbmVyaWMgQ29uc3RhbnRzIEJlZ2luICMjIwotQlRfREVGQVVMVF9USU1FT1VUX1NFQ09ORFMgPSAxNQotREVGQVVMVF9SRkNPTU1fVElNRU9VVF9NUyA9IDEwMDAwCi1DQUxMX1NUQVRFX0lETEUgPSAwCi1DQUxMX1NUQVRFX1JJTkdJTkcgPSAxCi1DQUxMX1NUQVRFX09GRkhPT0sgPSAyCi1DQUxMX1NUQVRFX1RJTUVPVVRfU0VDID0gMzAKLU5BUF9DT05ORUNUSU9OX1RJTUVPVVRfU0VDUyA9IDIwCi0KLSMgQ2FsbCBsb2cgdHlwZXMuCi1JTkNPTUlOR19DQUxMX0xPR19UWVBFID0gJzEnCi1PVVRHT0lOR19DQUxMX0xPR19UWVBFID0gJzInCi1NSVNTRURfQ0FMTF9MT0dfVFlQRSA9ICczJwotCi0jIFBhc3N0aHJvdWdoIENvbW1hbmRzIHNlbnQgdG8gdGhlIFJQQyBTZXJ2ZXIuCi1DTURfTUVESUFfUExBWSA9ICdwbGF5JwotQ01EX01FRElBX1BBVVNFID0gJ3BhdXNlJwotQ01EX01FRElBX1NLSVBfTkVYVCA9ICdza2lwTmV4dCcKLUNNRF9NRURJQV9TS0lQX1BSRVYgPSAnc2tpcFByZXYnCi0KLSMgRXZlbnRzIGRpc3BhdGNoZWQgZnJvbSB0aGUgUlBDIFNlcnZlci4KLUVWRU5UX1BMQVlfUkVDRUlWRUQgPSAncGxheVJlY2VpdmVkJwotRVZFTlRfUEFVU0VfUkVDRUlWRUQgPSAncGF1c2VSZWNlaXZlZCcKLUVWRU5UX1NLSVBfTkVYVF9SRUNFSVZFRCA9ICdza2lwTmV4dFJlY2VpdmVkJwotRVZFTlRfU0tJUF9QUkVWX1JFQ0VJVkVEID0gJ3NraXBQcmV2UmVjZWl2ZWQnCi0KLSMgQSBwbGF5YmFjayBzdGF0ZSBpbmRpY2F0aW5nIHRoZSBtZWRpYSBzZXNzaW9uIGlzIGN1cnJlbnRseSBwYXVzZWQuCi1TVEFURV9QQVVTRUQgPSAyCi1TVEFURV9QTEFZSU5HID0gMwotCi0jIEZpbGUgcGF0aAotUkFNRFVNUF9QQVRIID0gJ2RhdGEvdmVuZG9yL3NzcmR1bXAnCi0KLSMgVWlBdXRvSGVscGVyIHBhY2thZ2UgbmFtZS4KLVVJQVVUT19IRUxQRVJfUEFDS0FHRV9OQU1FID0gJ2NvbS5nb29nbGUuYW5kcm9pZC51aWF1dG9oZWxwZXInCi0KLSMgVGVzdCBSdW5uZXIgZm9yIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIHRlc3QuCi1BTkRST0lEWF9URVNUX1JVTk5FUiA9ICdhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXInCi0KLSMgV2lmaSBob3RzcG90IHNldHRpbmcKLVdJRklfSE9UU1BPVF8yXzRHID0geydTU0lEJzogJ3BxbUJUJywgJ3Bhc3N3b3JkJzogJ3Bhc3N3b3JkJywgJ2FwQmFuZCc6IDB9Ci0KLQotY2xhc3MgQXZyY3BFdmVudChlbnVtLkVudW0pOgotICAiIiJFbnVtZXJhdGlvbiBvZiBBVlJDUCBldmVudCB0eXBlcy4iIiIKLSAgUExBWSA9ICdTdGF0ZTpOT1RfUExBWUlORy0+UExBWUlORycKLSAgUEFVU0UgPSAnU3RhdGU6UExBWUlORy0+Tk9UX1BMQVlJTkcnCi0gIFRSQUNLX1BSRVZJT1VTID0gJ3NlbmRNZWRpYUtleUV2ZW50OiBrZXlFdmVudD03NicKLSAgVFJBQ0tfTkVYVCA9ICdzZW5kTWVkaWFLZXlFdmVudDoga2V5RXZlbnQ9NzUnCi0KLSMgQmx1ZXRvb3RoIFJGQ09NTSBVVUlEcyBhcyBkZWZpbmVkIGJ5IHRoZSBTSUcKLUJUX1JGQ09NTV9VVUlEUyA9IHsKLSAgICAnZGVmYXVsdF91dWlkJzogJzQ1NzgwN2MwLTQ4OTctMTFkZi05ODc5LTA4MDAyMDBjOWE2NicsCi0gICAgJ2Jhc2VfdXVpZCc6ICcwMDAwMDAwMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInLAotICAgICdzZHAnOiAnMDAwMDAwMDEtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAndWRwJzogJzAwMDAwMDAyLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ3JmY29tbSc6ICcwMDAwMDAwMy0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInLAotICAgICd0Y3AnOiAnMDAwMDAwMDQtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAndGNzX2Jpbic6ICcwMDAwMDAwNS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInLAotICAgICd0Y3NfYXQnOiAnMDAwMDAwMDYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnYXR0JzogJzAwMDAwMDA3LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ29iZXgnOiAnMDAwMDAwMDgtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnaXAnOiAnMDAwMDAwMDktMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnZnRwJzogJzAwMDAwMDBBLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ2h0dHAnOiAnMDAwMDAwMEMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnd3NwJzogJzAwMDAwMDBFLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ2JuZXAnOiAnMDAwMDAwMEYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAndXBucCc6ICcwMDAwMDAxMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInLAotICAgICdoaWRwJzogJzAwMDAwMDExLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ2hhcmRjb3B5X2NvbnRyb2xfY2hhbm5lbCc6ICcwMDAwMDAxMi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInLAotICAgICdoYXJkY29weV9kYXRhX2NoYW5uZWwnOiAnMDAwMDAwMTQtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnaGFyZGNvcHlfbm90aWZpY2F0aW9uJzogJzAwMDAwMDE2LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ2F2Y3RwJzogJzAwMDAwMDE3LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ2F2ZHRwJzogJzAwMDAwMDE5LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQicsCi0gICAgJ2NtdHAnOiAnMDAwMDAwMUItMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnbWNhcF9jb250cm9sX2NoYW5uZWwnOiAnMDAwMDAwMUUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnbWNhcF9kYXRhX2NoYW5uZWwnOiAnMDAwMDAwMUYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJywKLSAgICAnbDJjYXAnOiAnMDAwMDAxMDAtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCJwotfQotCi0KLWNsYXNzIEJsdWV0b290aEFjY2Vzc0xldmVsKGVudW0uSW50RW51bSk6Ci0gICIiIkVudW0gY2xhc3MgZm9yIGJsdWV0b290aCBwcm9maWxlIGFjY2VzcyBsZXZlbHMuIiIiCi0gIEFDQ0VTU19BTExPV0VEID0gMQotICBBQ0NFU1NfREVOSUVEID0gMgotCi0KLWNsYXNzIEJsdWV0b290aFByb2ZpbGUoZW51bS5JbnRFbnVtKToKLSAgIiIiRW51bSBjbGFzcyBmb3IgYmx1ZXRvb3RoIHByb2ZpbGUgdHlwZXMuCi0KLSAgU2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoCi0gIC8vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlLmphdmEKLSAgIiIiCi0KLSAgSEVBRFNFVCA9IDEKLSAgQTJEUCA9IDIKLSAgSEVBTFRIID0gMwotICBISURfSE9TVCA9IDQKLSAgUEFOID0gNQotICBQQkFQID0gNgotICBHQVRUID0gNwotICBHQVRUX1NFUlZFUiA9IDgKLSAgTUFQID0gOQotICBTQVAgPSAxMAotICBBMkRQX1NJTksgPSAxMQotICBBVlJDUF9DT05UUk9MTEVSID0gMTIKLSAgQVZSQ1AgPSAxMwotICBIRUFEU0VUX0NMSUVOVCA9IDE2Ci0gIFBCQVBfQ0xJRU5UID0gMTcKLSAgTUFQX01DRSA9IDE4Ci0gIEhJRF9ERVZJQ0UgPSAxOQotICBPUFAgPSAyMAotICBIRUFSSU5HX0FJRCA9IDIxCi0KLQotY2xhc3MgQmx1ZXRvb3RoQ29ubmVjdGlvblBvbGljeShlbnVtLkludEVudW0pOgotICAiIiJFbnVtIGNsYXNzIGZvciBibHVldG9vdGggYmx1ZXRvb3RoIGNvbm5lY3Rpb24gcG9saWN5LgotCi0gIGJsdWV0b290aCBjb25uZWN0aW9uIHBvbGljeSBhcyBkZWZpbmVkIGluCi0gIC8vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlLmphdmEKLSAgIiIiCi0gIENPTk5FQ1RJT05fUE9MSUNZX1VOS05PV04gPSAtMQotICBDT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU4gPSAwCi0gIENPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUQgPSAxMDAKLQotCi1jbGFzcyBCbHVldG9vdGhDb25uZWN0aW9uU3RhdHVzKGVudW0uSW50RW51bSk6Ci0gICIiIkVudW0gY2xhc3MgZm9yIGJsdWV0b290aCBjb25uZWN0aW9uIHN0YXR1cy4KLQotICBCbHVldG9vdGggY29ubmVjdGlvbiBzdGF0dXMgYXMgZGVmaW5lZCBpbgotICAvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZS5qYXZhCi0gICIiIgotICBTVEFURV9ESVNDT05ORUNURUQgPSAwCi0gIFNUQVRFX0NPTk5FQ1RJTkcgPSAxCi0gIFNUQVRFX0NPTk5FQ1RFRCA9IDIKLSAgU1RBVEVfRElTQ09OTkVDVElORyA9IDMKLQotCi1jbGFzcyBCbHVldG9vdGhQcmlvcml0eUxldmVsKGVudW0uSW50RW51bSk6Ci0gICIiIkVudW0gY2xhc3MgZm9yIGJsdWV0b290aCBwcmlvcml0eSBsZXZlbC4KLQotICBQcmlvcml0eSBsZXZlbHMgYXMgZGVmaW5lZCBpbgotICAvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZS5qYXZhCi0gICIiIgotCi0gIFBSSU9SSVRZX0FVVE9fQ09OTkVDVCA9IDEwMDAKLSAgUFJJT1JJVFlfT04gPSAxMDAKLSAgUFJJT1JJVFlfT0ZGID0gMAotICBQUklPUklUWV9VTkRFRklORUQgPSAtMQotCi0KLWNsYXNzIEJsZUFkdmVydGlzZVNldHRpbmdzTW9kZShlbnVtLkludEVudW0pOgotICAiIiJFbnVtIGNsYXNzIGZvciBCTEUgYWR2ZXJ0aXNlIHNldHRpbmdzIG1vZGUuIiIiCi0gIExPV19QT1dFUiA9IDAKLSAgQkFMQU5DRUQgPSAxCi0gIExPV19MQVRFTkNZID0gMgotCi0KLWNsYXNzIEJsZUFkdmVydGlzZVNldHRpbmdzVHhQb3dlcihlbnVtLkludEVudW0pOgotICAiIiJFbnVtIGNsYXNzIGZvciBCTEUgYWR2ZXJ0aXNlIHNldHRpbmdzIHR4IHBvd2VyLiIiIgotICBVTFRSQV9MT1cgPSAwCi0gIExPVyA9IDEKLSAgTUVESVVNID0gMgotICBISUdIID0gMwotCi0KLWNsYXNzIExvZ1R5cGUoZW51bS5FbnVtKToKLSAgIiIiRW51bWVyYXRpb24gb2YgZGV2aWNlIGxvZyB0eXBlLiIiIgotICBERUZBVUxUX1ZBTFVFID0gJ0dFTkVSSUMnCi0gIEJMVUVUT09USF9ERVZJQ0VfU0lNVUxBVE9SID0gJ0JEUycKLSAgSUNMRVZFUl9IQjAxID0gJ0dFTkVSSUMnCi0KLQotY2xhc3MgQ2FsbFN0YXRlKGVudW0uSW50RW51bSk6Ci0gICIiIkVudW0gY2xhc3MgZm9yIHBob25lIGNhbGwgc3RhdGUuIiIiCi0gIElETEUgPSAwCi0gIFJJTkdJTkcgPSAxCi0gIE9GRkhPT0sgPSAyCi0KLQotY2xhc3MgQ2FsbExvZ1R5cGUoZW51bS5JbnRFbnVtKToKLSAgIiIiRW51bSBjbGFzcyBmb3IgcGhvbmUgY2FsbCBsb2cgdHlwZS4iIiIKLSAgSU5DT01JTkdfQ0FMTCA9IDEKLSAgT1VUR09JTkdfQ0FMTCA9IDIKLSAgTUlTU0VEX0NBTEwgPSAzCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdXRpbHMvYnRfdGVzdF91dGlscy5weSBiL2JsdWViZXJyeS91dGlscy9idF90ZXN0X3V0aWxzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ2ZWMwLi4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9idF90ZXN0X3V0aWxzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLSMgTGludCBhczogcHl0aG9uMwotIiIiVXRpbHMgZm9yIGJsdWUgdG9vdGggdGVzdHMuCi0KLVBhcnRseSBwb3J0ZWQgZnJvbSBhY3RzL2ZyYW1ld29yay9hY3RzL3Rlc3RfdXRpbHMvYnQvYnRfdGVzdF91dGlscy5weQotIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCi0KLWltcG9ydCBsb2dnaW5nIGFzIGxvZwotaW1wb3J0IG9zCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgdGltZQotaW1wb3J0IHdhdmUKLQotCi1kZWYgY29udmVydF9wY21fdG9fd2F2KHBjbV9maWxlX3BhdGgsIHdhdmVfZmlsZV9wYXRoLCBhdWRpb19wYXJhbXMpOgotICAiIiJDb252ZXJ0cyByYXcgcGNtIGRhdGEgaW50byB3YXZlIGZpbGUuCi0KLSAgQXJnczoKLSAgICAgIHBjbV9maWxlX3BhdGg6IEZpbGUgcGF0aCBvZiBvcmlnaW4gcGNtIGZpbGUuCi0gICAgICB3YXZlX2ZpbGVfcGF0aDogRmlsZSBwYXRoIG9mIGNvbnZlcnRlZCB3YXZlIGZpbGUuCi0gICAgICBhdWRpb19wYXJhbXM6IEEgZGljdCB3aXRoIGF1ZGlvIGNvbmZpZ3VyYXRpb24uCi0gICIiIgotICB3aXRoIG9wZW4ocGNtX2ZpbGVfcGF0aCwgJ3JiJykgYXMgcGNtX2ZpbGU6Ci0gICAgZnJhbWVzID0gcGNtX2ZpbGUucmVhZCgpCi0gIHdyaXRlX3JlY29yZF9maWxlKHdhdmVfZmlsZV9wYXRoLCBhdWRpb19wYXJhbXMsIGZyYW1lcykKLQotCi1kZWYgY3JlYXRlX3ZjZl9mcm9tX3ZjYXJkKG91dHB1dF9wYXRoOiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vZl9jb250YWN0czogaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lOiBzdHIgPSBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X25hbWU6IHN0ciA9IE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lX251bWJlcjogaW50ID0gTm9uZSkgLT4gc3RyOgotICAiIiJDcmVhdGVzIGEgdmNmIGZpbGUgZnJvbSB2Q2FyZC4KLQotICBBcmdzOgotICAgIG91dHB1dF9wYXRoOiBQYXRoIG9mIHRoZSBvdXRwdXQgdmNmIGZpbGUuCi0gICAgbnVtX29mX2NvbnRhY3RzOiBOdW1iZXIgb2YgY29udGFjdHMgdG8gYmUgZ2VuZXJhdGVkLgotICAgIGZpcnN0X25hbWU6IEZpcnN0IG5hbWUgb2YgdGhlIGNvbnRhY3RzLgotICAgIGxhc3RfbmFtZTogTGFzdCBuYW1lIG9mIHRoZSBjb250YWN0cy4KLSAgICBwaG9uZV9udW1iZXI6IFBob25lIG51bWJlciBvZiB0aGUgY29udGFjdHMuCi0KLSAgUmV0dXJuczoKLSAgICB2Y2ZfZmlsZV9wYXRoOiBQYXRoIG9mIHRoZSBvdXRwdXQgdmNmIGZpbGUuIEUuZy4KLSAgICAgICAgIi88b3V0cHV0X3BhdGg+L2NvbnRhY3RzXzx0aW1lPi52Y2YiLgotICAiIiIKLSAgZmlsZV9uYW1lID0gZidjb250YWN0c197aW50KHRpbWUudGltZSgpKX0udmNmJwotICB2Y2ZfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKG91dHB1dF9wYXRoLCBmaWxlX25hbWUpCi0gIHdpdGggb3Blbih2Y2ZfZmlsZV9wYXRoLCAndysnKSBhcyBmOgotICAgIGZvciBpIGluIHJhbmdlKG51bV9vZl9jb250YWN0cyk6Ci0gICAgICBsaW5lcyA9IFtdCi0gICAgICBpZiBmaXJzdF9uYW1lIGlzIE5vbmU6Ci0gICAgICAgIGZpcnN0X25hbWUgPSAnUGVyc29uJwotICAgICAgdmNhcmRfbGFzdF9uYW1lID0gbGFzdF9uYW1lCi0gICAgICBpZiBsYXN0X25hbWUgaXMgTm9uZToKLSAgICAgICAgdmNhcmRfbGFzdF9uYW1lID0gaQotICAgICAgdmNhcmRfcGhvbmVfbnVtYmVyID0gcGhvbmVfbnVtYmVyCi0gICAgICBpZiBwaG9uZV9udW1iZXIgaXMgTm9uZToKLSAgICAgICAgdmNhcmRfcGhvbmVfbnVtYmVyID0gcmFuZG9tLnJhbmRyYW5nZShpbnQoMTBlMTApKQotICAgICAgbGluZXMuYXBwZW5kKCdCRUdJTjpWQ0FSRFxuJykKLSAgICAgIGxpbmVzLmFwcGVuZCgnVkVSU0lPTjoyLjFcbicpCi0gICAgICBsaW5lcy5hcHBlbmQoZidOOnt2Y2FyZF9sYXN0X25hbWV9O3tmaXJzdF9uYW1lfTs7O1xuJykKLSAgICAgIGxpbmVzLmFwcGVuZChmJ0ZOOntmaXJzdF9uYW1lfSB7dmNhcmRfbGFzdF9uYW1lfVxuJykKLSAgICAgIGxpbmVzLmFwcGVuZChmJ1RFTDtDRUxMOnt2Y2FyZF9waG9uZV9udW1iZXJ9XG4nKQotICAgICAgbGluZXMuYXBwZW5kKGYnRU1BSUw7UFJFRjp7Zmlyc3RfbmFtZX17dmNhcmRfbGFzdF9uYW1lfUBnbWFpbC5jb21cbicpCi0gICAgICBsaW5lcy5hcHBlbmQoJ0VORDpWQ0FSRFxuJykKLSAgICAgIGYud3JpdGUoJycuam9pbihsaW5lcykpCi0gIHJldHVybiB2Y2ZfZmlsZV9wYXRoCi0KLQotZGVmIGdlbmVyYXRlX2lkX2J5X3NpemUoc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzPShzdHJpbmcuYXNjaWlfbG93ZXJjYXNlICsgc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmRpZ2l0cykpOgotICAiIiJHZW5lcmF0ZSByYW5kb20gYXNjaWkgY2hhcmFjdGVycyBvZiBpbnB1dCBzaXplIGFuZCBpbnB1dCBjaGFyIHR5cGVzLgotCi0gIEFyZ3M6Ci0gICAgICBzaXplOiBJbnB1dCBzaXplIG9mIHN0cmluZy4KLSAgICAgIGNoYXJzOiAoT3B0aW9uYWwpIENoYXJzIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGEgcmFuZG9tIHN0cmluZy4KLQotICBSZXR1cm5zOgotICAgICAgU3RyaW5nIG9mIHJhbmRvbSBpbnB1dCBjaGFycyBhdCB0aGUgaW5wdXQgc2l6ZS4KLSAgIiIiCi0gIHJldHVybiAnJy5qb2luKHJhbmRvbS5jaG9pY2UoY2hhcnMpIGZvciBfIGluIHJhbmdlKHNpemUpKQotCi0KLWRlZiBnZXRfZHVyYXRpb25fc2Vjb25kcyh3YXZfZmlsZV9wYXRoKToKLSAgIiIiR2V0IGR1cmF0aW9uIG9mIG1vc3QgcmVjZW50bHkgcmVjb3JkZWQgZmlsZS4KLQotICBBcmdzOgotICAgICAgd2F2X2ZpbGVfcGF0aDogcGF0aCBvZiB0aGUgd2F2ZSBmaWxlLgotCi0gIFJldHVybnM6Ci0gICAgICBkdXJhdGlvbiAoZmxvYXQpOiBkdXJhdGlvbiBvZiByZWNvcmRlZCBmaWxlIGluIHNlY29uZHMuCi0gICIiIgotICBmID0gd2F2ZS5vcGVuKHdhdl9maWxlX3BhdGgsICdyJykKLSAgZnJhbWVzID0gZi5nZXRuZnJhbWVzKCkKLSAgcmF0ZSA9IGYuZ2V0ZnJhbWVyYXRlKCkKLSAgZHVyYXRpb24gPSAoZnJhbWVzIC8gZmxvYXQocmF0ZSkpCi0gIGYuY2xvc2UoKQotICByZXR1cm4gZHVyYXRpb24KLQotCi1kZWYgd2FpdF91bnRpbCh0aW1lb3V0X3NlYywKLSAgICAgICAgICAgICAgIGNvbmRpdGlvbl9mdW5jLAotICAgICAgICAgICAgICAgZnVuY19hcmdzLAotICAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsdWUsCi0gICAgICAgICAgICAgICBleGNlcHRpb249Tm9uZSwKLSAgICAgICAgICAgICAgIGludGVydmFsX3NlYz0wLjUpOgotICAiIiJXYWl0cyB1bnRpbCBhIGZ1bmN0aW9uIHJldHVybnMgYSBleHBlY3RlZCB2YWx1ZSBvciB0aW1lb3V0IGlzIHJlYWNoZWQuCi0KLSAgRXhhbXBsZSB1c2FnZToKLSAgICBgYGAKLSAgICBkZWYgaXNfYmx1ZXRvb3RoX2VuYWJsZWQoZGV2aWNlKSAtPiBib29sOgotICAgICAgZG8gc29tZXRoaW5nIGFuZCByZXR1cm4gc29tZXRoaW5nLi4uCi0KLSAgICAjIFdhaXRzIGFuZCBjaGVja3MgaWYgQmx1ZXRvb3RoIGlzIHR1cm5lZCBvbi4KLSAgICBidF90ZXN0X3V0aWxzLndhaXRfdW50aWwoCi0gICAgICAgIHRpbWVvdXRfc2VjPTEwLAotICAgICAgICBjb25kaXRpb25fZnVuYz1pc19ibHVldG9vdGhfZW5hYmxlZCwKLSAgICAgICAgZnVuY19hcmdzPVtkdXRdLAotICAgICAgICBleHBlY3RlZF92YWx1ZT1UcnVlLAotICAgICAgICBleGNlcHRpb249c2lnbmFscy5UZXN0RmFpbHVyZSgnRmFpbGVkIHRvIHR1cm4gb24gQmx1ZXRvb3RoLicpLAotICAgICAgICBpbnRlcnZhbF9zZWM9MSkKLSAgICBgYGAKLQotICBBcmdzOgotICAgIHRpbWVvdXRfc2VjOiBmbG9hdCwgbWF4IHdhaXRpbmcgdGltZSBpbiBzZWNvbmRzLgotICAgIGNvbmRpdGlvbl9mdW5jOiBmdW5jdGlvbiwgd2hlbiB0aGUgY29uZGljdGlvbiBmdW5jdGlvbiByZXR1cm5zIHRoZSBleHBlY3RlZAotICAgICAgICB2YWx1ZSwgdGhlIHdhaXRpbmcgbWVjaGFuaXNtIHdpbGwgYmUgaW50ZXJydXB0ZWQuCi0gICAgZnVuY19hcmdzOiB0dXBsZSBvciBsaXN0LCB0aGUgYXJndW1lbnRzIGZvciB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uLgotICAgIGV4cGVjdGVkX3ZhbHVlOiBhIGV4cGVjdGVkIHZhbHVlIHRoYXQgdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiByZXR1cm5zLgotICAgIGV4Y2VwdGlvbjogRXhjZXB0aW9uLCBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQgd2hlbiB0aW1lZCBvdXQgaWYgbmVlZGVkLgotICAgIGludGVydmFsX3NlYzogZmxvYXQsIGludGVydmFsIHRpbWUgYmV0d2VlbiBjYWxscyBvZiB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uCi0gICAgICAgIGluIHNlY29uZHMuCi0KLSAgUmV0dXJuczoKLSAgICBUcnVlIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBleHBlY3RlZCB2YWx1ZSBlbHNlIEZhbHNlLgotICAiIiIKLSAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gIGVuZF90aW1lID0gc3RhcnRfdGltZSArIHRpbWVvdXRfc2VjCi0gIHdoaWxlIHRpbWUudGltZSgpIDwgZW5kX3RpbWU6Ci0gICAgaWYgY29uZGl0aW9uX2Z1bmMoKmZ1bmNfYXJncykgPT0gZXhwZWN0ZWRfdmFsdWU6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWxfc2VjKQotICBhcmdzX3N0cmluZyA9ICcsICcuam9pbihsaXN0KG1hcChzdHIsIGZ1bmNfYXJncykpKQotICBsb2cud2FybmluZygnVGltZWQgb3V0IGFmdGVyICUuMWZzIHdhaXRpbmcgZm9yICIlcyglcykiIHRvIGJlICIlcyIuJywKLSAgICAgICAgICAgICAgdGltZW91dF9zZWMsIGNvbmRpdGlvbl9mdW5jLl9fbmFtZV9fLCBhcmdzX3N0cmluZywgZXhwZWN0ZWRfdmFsdWUpCi0gIGlmIGV4Y2VwdGlvbjoKLSAgICByYWlzZSBleGNlcHRpb24KLSAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHdyaXRlX3JlYWRfdmVyaWZ5X2RhdGFfc2w0YShjbGllbnRfYWQsIHNlcnZlcl9hZCwgbXNnLCBiaW5hcnk9RmFsc2UpOgotICAiIiJWZXJpZnkgdGhhdCB0aGUgY2xpZW50IHdyb3RlIGRhdGEgdG8gdGhlIHNlcnZlciBBbmRyb2lkIGRldmljZSBjb3JyZWN0bHkuCi0KLSAgQXJnczoKLSAgICAgIGNsaWVudF9hZDogdGhlIEFuZHJvaWQgZGV2aWNlIHRvIHBlcmZvcm0gdGhlIHdyaXRlLgotICAgICAgc2VydmVyX2FkOiB0aGUgQW5kcm9pZCBkZXZpY2UgdG8gcmVhZCB0aGUgZGF0YSB3cml0dGVuLgotICAgICAgbXNnOiB0aGUgbWVzc2FnZSB0byB3cml0ZS4KLSAgICAgIGJpbmFyeTogaWYgdGhlIG1zZyBhcmcgaXMgYmluYXJ5IG9yIG5vdC4KLQotICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZiB0aGUgZGF0YSB3cml0dGVuIG1hdGNoZXMgdGhlIGRhdGEgcmVhZCwgZmFsc2UgaWYgbm90LgotICAiIiIKLSAgY2xpZW50X2FkLmxvZy5pbmZvKCdXcml0ZSBtZXNzYWdlICVzLicsIG1zZykKLSAgaWYgYmluYXJ5OgotICAgIGNsaWVudF9hZC5zbDRhLmJsdWV0b290aFNvY2tldENvbm5Xcml0ZUJpbmFyeShtc2cpCi0gIGVsc2U6Ci0gICAgY2xpZW50X2FkLnNsNGEuYmx1ZXRvb3RoU29ja2V0Q29ubldyaXRlKG1zZykKLSAgc2VydmVyX2FkLmxvZy5pbmZvKCdSZWFkIG1lc3NhZ2UgJXMuJywgbXNnKQotICBpZiBiaW5hcnk6Ci0gICAgcmVhZF9tc2cgPSBzZXJ2ZXJfYWQuc2w0YS5ibHVldG9vdGhTb2NrZXRDb25uUmVhZEJpbmFyeSgpLnJzdHJpcCgnXHJcbicpCi0gIGVsc2U6Ci0gICAgcmVhZF9tc2cgPSBzZXJ2ZXJfYWQuc2w0YS5ibHVldG9vdGhTb2NrZXRDb25uUmVhZCgpCi0gIGxvZy5pbmZvKCdWZXJpZnkgbWVzc2FnZS4nKQotICBpZiBtc2cgIT0gcmVhZF9tc2c6Ci0gICAgbG9nLmVycm9yKCdNaXNtYXRjaCEgUmVhZDogJXMsIEV4cGVjdGVkOiAlcycsIHJlYWRfbXNnLCBtc2cpCi0gICAgcmV0dXJuIEZhbHNlCi0gIGxvZy5pbmZvKCdNYXRjaGVkISBSZWFkOiAlcywgRXhwZWN0ZWQ6ICVzJywgcmVhZF9tc2csIG1zZykKLSAgcmV0dXJuIFRydWUKLQotCi1kZWYgd3JpdGVfcmVjb3JkX2ZpbGUoZmlsZV9uYW1lLCBhdWRpb19wYXJhbXMsIGZyYW1lcyk6Ci0gICIiIldyaXRlcyB0aGUgcmVjb3JkZWQgYXVkaW8gaW50byB0aGUgZmlsZS4KLQotICBBcmdzOgotICAgICAgZmlsZV9uYW1lOiBUaGUgZmlsZSBuYW1lIGZvciB3cml0aW5nIHRoZSByZWNvcmRlZCBhdWRpby4KLSAgICAgIGF1ZGlvX3BhcmFtczogQSBkaWN0IHdpdGggYXVkaW8gY29uZmlndXJhdGlvbi4KLSAgICAgIGZyYW1lczogUmVjb3JkZWQgYXVkaW8gZnJhbWVzLgotICAiIiIKLSAgbG9nLmRlYnVnKCd3cml0aW5nIGZyYW1lIHRvICVzJywgZmlsZV9uYW1lKQotICB3ZiA9IHdhdmUub3BlbihmaWxlX25hbWUsICd3YicpCi0gIHdmLnNldG5jaGFubmVscyhhdWRpb19wYXJhbXNbJ2NoYW5uZWwnXSkKLSAgd2Yuc2V0c2FtcHdpZHRoKGF1ZGlvX3BhcmFtcy5nZXQoJ3NhbXBsZV93aWR0aCcsIDEpKQotICB3Zi5zZXRmcmFtZXJhdGUoYXVkaW9fcGFyYW1zWydzYW1wbGVfcmF0ZSddKQotICB3Zi53cml0ZWZyYW1lcyhmcmFtZXMpCi0gIHdmLmNsb3NlKCkKZGlmZiAtLWdpdCBhL2JsdWViZXJyeS91dGlscy9jb21tYW5kX2xpbmVfcnVubmVyL3J1bl9ibHVldG9vdGhfdGVzdHMucHkgYi9ibHVlYmVycnkvdXRpbHMvY29tbWFuZF9saW5lX3J1bm5lci9ydW5fYmx1ZXRvb3RoX3Rlc3RzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE4NmI4Li4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9jb21tYW5kX2xpbmVfcnVubmVyL3J1bl9ibHVldG9vdGhfdGVzdHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotIiIiQ29tbWFuZC1saW5lIHRlc3QgcnVubmVyIHNjcmlwdCBmb3IgcnVubmluZyBCbHVldG9vdGggdGVzdHMuCi0KLVRoaXMgbW9kdWxlIGFsbG93cyB1c2VycyB0byBpbml0aWF0ZSBCbHVldG9vdGggdGVzdCB0YXJnZXRzIGFuZCBydW4gdGhlbSBhZ2FpbnN0Ci1zcGVjaWZpZWQgRFVUcyAoZGV2aWNlcy11bmRlci10ZXN0KSB1c2luZyBhIHNpbXBsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KLQotaW1wb3J0IGJhc2U2NAotCi1mcm9tIGFic2wgaW1wb3J0IGFwcAotZnJvbSBhYnNsIGltcG9ydCBmbGFncwotZnJvbSBhYnNsIGltcG9ydCBsb2dnaW5nCi0KLSMgSW50ZXJuYWwgaW1wb3J0Ci0jIEludGVybmFsIGltcG9ydAotIyBJbnRlcm5hbCBpbXBvcnQKLSMgSW50ZXJuYWwgaW1wb3J0Ci0jIEludGVybmFsIGltcG9ydAotCi1GTEFHUyA9IGZsYWdzLkZMQUdTCi0KLWZsYWdzLkRFRklORV9tdWx0aV9zdHJpbmcoJ2J0X3Rlc3QnLCBOb25lLCAnQmx1ZXRvb3RoIHRlc3QgdG8gcnVuLicpCi1mbGFncy5ERUZJTkVfbXVsdGlfc3RyaW5nKCdidF9kdXQnLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnQmx1ZXRvb3RoIGRldmljZSB0byBhbGxvY2F0ZSBmb3IgdGVzdHMuJykKLQotCi0jIFZhbGlkIGNvbmZpZyBrZXlzIGZvciB0aGUgLS1idF90ZXN0IGNvbW1hbmQgbGluZSBmbGFnLgotQlRfVEVTVF9DT05GSUdfS0VZUyA9IHsndGFyZ2V0J30KLQotIyBWYWxpZCBjb25maWcga2V5cyBmb3IgdGhlIC0tYnRfZHV0IChkZXZpY2UtdW5kZXItdGVzdCkgY29tbWFuZCBsaW5lIGZsYWcuCi1CVF9EVVRfQ09ORklHX0tFWVMgPSB7J2hhcmR3YXJlJ30KLQotVEVTVF9GTEFHUyA9ICgnLS1ub3Rlc3RfbG9hc2QgLS10ZXN0X291dHB1dD1zdHJlYW1lZCAnCi0gICAgICAgICAgICAgICctLXRlc3RfYXJnPS0tcGFyYW1fZHV0X2NvbmZpZz0lcycpCi0KLQotY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgbW9kdWxlIGV4Y2VwdGlvbnMuIiIiCi0gIHBhc3MKLQotCi1jbGFzcyBUZXN0Q29uZmlnRXJyb3IoRXJyb3IpOgotICAiIiJSYWlzZWQgd2hlbiAtLWJ0X3Rlc3QgY29uZmlnIGZsYWdzIGFyZSBzcGVjaWZpZWQgaW5jb3JyZWN0bHkuIiIiCi0gIHBhc3MKLQotCi1jbGFzcyBEdXRDb25maWdFcnJvcihFcnJvcik6Ci0gICIiIlJhaXNlZCB3aGVuIC0tYnRfZHV0IGNvbmZpZyBmbGFncyBhcmUgc3BlY2lmaWVkIGluY29ycmVjdGx5LiIiIgotICBwYXNzCi0KLQotZGVmIHZhbGlkYXRlX2J0X3Rlc3RfZmxhZ3MoZmxhZ192YWx1ZSk6Ci0gICIiIlZhbGlkYXRlcyB0aGUgZm9ybWF0IG9mIHNwZWNpZmllZCAtLWJ0X3Rlc3QgZmxhZ3MuCi0KLSAgQXJnczoKLSAgICBmbGFnX3ZhbHVlOiBzdHJpbmcsIHRoZSBjb25maWcgZmxhZyB2YWx1ZSBmb3IgYSBnaXZlbiAtLWJ0X3Rlc3QgZmxhZy4KLQotICBSZXR1cm5zOgotICAgIGJvb2wsIFRydWUgaWYgLS1idF90ZXN0IGZsYWdzIGhhdmUgYmVlbiBzcGVjaWZpZWQgY29ycmVjdGx5LgotICAiIiIKLSAgaWYgbm90IGZsYWdfdmFsdWU6Ci0gICAgbG9nZ2luZy5lcnJvcignTm8gdGVzdHMgc3BlY2lmaWVkISBQbGVhc2Ugc3BlY2lmeSBhdCBsZWFzdCBvbmUgJwotICAgICAgICAgICAgICAgICAgJ3Rlc3QgdXNpbmcgdGhlIC0tYnRfdGVzdCBmbGFnLicpCi0gICAgcmV0dXJuIEZhbHNlCi0gIGZvciB0ZXN0IGluIGZsYWdfdmFsdWU6Ci0gICAgY29uZmlnX2FyZ3MgPSB0ZXN0LnNwbGl0KCcsJykKLSAgICBmb3IgY29uZmlnX2FyZyBpbiBjb25maWdfYXJnczoKLSAgICAgIGlmIGNvbmZpZ19hcmcuc3BsaXQoJz0nKVswXSBub3QgaW4gQlRfVEVTVF9DT05GSUdfS0VZUzoKLSAgICAgICAgbG9nZ2luZy5lcnJvcignLS1idF90ZXN0IGNvbmZpZyBrZXkgIiVzIiBpcyBpbnZhbGlkIScsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2FyZy5zcGxpdCgnPScpWzBdKQotICAgICAgICByZXR1cm4gRmFsc2UKLSAgcmV0dXJuIFRydWUKLQotCi1kZWYgdmFsaWRhdGVfYnRfZHV0X2ZsYWdzKGZsYWdfdmFsdWUpOgotICAiIiJWYWxpZGF0ZXMgdGhlIGZvcm1hdCBvZiBzcGVjaWZpZWQgLS1idF9kdXQgZmxhZ3MuCi0KLSAgQXJnczoKLSAgICBmbGFnX3ZhbHVlOiBzdHJpbmcsIHRoZSBjb25maWcgZmxhZyB2YWx1ZSBmb3IgYSBnaXZlbiAtLWJ0X2R1dCBmbGFnLgotCi0gIFJldHVybnM6Ci0gICAgYm9vbCwgVHJ1ZSBpZiAtLWJ0X2R1dCBmbGFncyBoYXZlIGJlZW4gc3BlY2lmaWVkIGNvcnJlY3RseS4KLSAgIiIiCi0gIGlmIG5vdCBmbGFnX3ZhbHVlOgotICAgIGxvZ2dpbmcuZXJyb3IoJ05vIERVVHMgc3BlY2lmaWVkISBQbGVhc2Ugc3BlY2lmeSBhdCBsZWFzdCBvbmUgJwotICAgICAgICAgICAgICAgICAgJ0RVVCB1c2luZyB0aGUgLS1idF9kdXQgZmxhZy4nKQotICAgIHJldHVybiBGYWxzZQotICBmb3IgZHV0IGluIGZsYWdfdmFsdWU6Ci0gICAgY29uZmlnX2FyZ3MgPSBkdXQuc3BsaXQoJywnKQotICAgIGZvciBjb25maWdfYXJnIGluIGNvbmZpZ19hcmdzOgotICAgICAgaWYgY29uZmlnX2FyZy5zcGxpdCgnPScpWzBdIG5vdCBpbiBCVF9EVVRfQ09ORklHX0tFWVM6Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoJy0tYnRfZHV0IGNvbmZpZyBrZXkgIiVzIiBpcyBpbnZhbGlkIScsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2FyZy5zcGxpdCgnPScpWzBdKQotICAgICAgICByZXR1cm4gRmFsc2UKLSAgcmV0dXJuIFRydWUKLQotZmxhZ3MucmVnaXN0ZXJfdmFsaWRhdG9yKAotICAgICdidF90ZXN0JywgdmFsaWRhdGVfYnRfdGVzdF9mbGFncywKLSAgICAoJ0ludmFsaWQgLS1idF90ZXN0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIScKLSAgICAgJyBWYWxpZCBjb25maWd1cmF0aW9uIGZpZWxkcyBpbmNsdWRlOiAlcycpCi0gICAgJSBCVF9URVNUX0NPTkZJR19LRVlTKQotCi0KLWZsYWdzLnJlZ2lzdGVyX3ZhbGlkYXRvcigKLSAgICAnYnRfZHV0JywgdmFsaWRhdGVfYnRfZHV0X2ZsYWdzLAotICAgICgnSW52YWxpZCAtLWJ0X2R1dCBjb25maWd1cmF0aW9uIHNwZWNpZmllZCEnCi0gICAgICcgVmFsaWQgY29uZmlndXJhdGlvbiBmaWVsZHMgaW5jbHVkZTogJXMnKQotICAgICUgQlRfRFVUX0NPTkZJR19LRVlTKQotCi0KLWRlZiBwYXJzZV9mbGFnX3ZhbHVlKGZsYWdfdmFsdWUpOgotICAiIiJQYXJzZXMgYSBjb25maWcgZmxhZyB2YWx1ZSBzdHJpbmcgaW50byBhIGRpY3QuCi0KLSAgRXhhbXBsZSBpbnB1dDogJ3RhcmdldD0vL3Rlc3RzOmJsdWV0b290aF9wYWlyaW5nX3Rlc3QnCi0gIEV4YW1wbGUgb3V0cHV0OiB7J3RhcmdldCc6ICcvL3Rlc3RzOmJsdWV0b290aF9wYWlyaW5nX3Rlc3QnfQotCi0gIEFyZ3M6Ci0gICAgZmxhZ192YWx1ZTogc3RyaW5nLCB0aGUgY29uZmlnIGZsYWcgdmFsdWUgZm9yIGEgZ2l2ZW4gZmxhZy4KLQotICBSZXR1cm5zOgotICAgIGRpY3QsIEEgZGljdCBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgYSBjb25maWcgZmxhZyB2YWx1ZS4KLSAgIiIiCi0gIGNvbmZpZ19kaWN0ID0ge30KLSAgY29uZmlnX2FyZ3MgPSBmbGFnX3ZhbHVlLnNwbGl0KCcsJykKLSAgZm9yIGNvbmZpZ19hcmcgaW4gY29uZmlnX2FyZ3M6Ci0gICAgY29uZmlnX2RpY3RbY29uZmlnX2FyZy5zcGxpdCgnPScpWzBdXSA9IGNvbmZpZ19hcmcuc3BsaXQoJz0nKVsxXQotICByZXR1cm4gY29uZmlnX2RpY3QKLQotCi1kZWYgZ2V0X2RldmljZV90eXBlKGdhdGV3YXlfc3R1YiwgZHV0X2NvbmZpZ19kaWN0KToKLSAgIiIiRGV0ZXJtaW5lcyBhIGRldmljZSB0eXBlIGJhc2VkIG9uIGEgZGV2aWNlIHF1ZXJ5LgotCi0gIEFyZ3M6Ci0gICAgZ2F0ZXdheV9zdHViOiBBbiBSUEMyIHN0dWIgb2JqZWN0LgotICAgIGR1dF9jb25maWdfZGljdDogZGljdCwgQSBkaWN0IG9mIGRldmljZSBjb25maWcgYXJncy4KLQotICBSZXR1cm5zOgotICAgIHN0cmluZywgVGhlIE1vYmlsZUhhcm5lc3MgZGV2aWNlIHR5cGUuCi0KLSAgUmFpc2VzOgotICAgIER1dENvbmZpZ0Vycm9yOiBJZiAtLWJ0X2R1dCBmbGFnKHMpIGFyZSBpbmNvcnJlY3RseSBzcGVjaWZpZWQuCi0gICIiIgotICBkZXZpY2VfcXVlcnlfZmlsdGVyID0gZGV2aWNlX3F1ZXJ5X3BiMi5EZXZpY2VRdWVyeUZpbHRlcigpCi0gIGRldmljZV9xdWVyeV9maWx0ZXIudHlwZV9yZWdleC5hcHBlbmQoJ0FuZHJvaWRSZWFsRGV2aWNlJykKLSAgZm9yIGR1dF9jb25maWdfa2V5IGluIGR1dF9jb25maWdfZGljdDoKLSAgICBkaW1lbnNpb25fZmlsdGVyID0gZGV2aWNlX3F1ZXJ5X2ZpbHRlci5kaW1lbnNpb25fZmlsdGVyLmFkZCgpCi0gICAgZGltZW5zaW9uX2ZpbHRlci5uYW1lID0gZHV0X2NvbmZpZ19rZXkKLSAgICBkaW1lbnNpb25fZmlsdGVyLnZhbHVlX3JlZ2V4ID0gZHV0X2NvbmZpZ19kaWN0W2R1dF9jb25maWdfa2V5XQotICByZXF1ZXN0ID0gZ2F0ZXdheV9zZXJ2aWNlX3BiMi5RdWVyeURldmljZVJlcXVlc3QoCi0gICAgICBkZXZpY2VfcXVlcnlfZmlsdGVyPWRldmljZV9xdWVyeV9maWx0ZXIpCi0gIHJlc3BvbnNlID0gZ2F0ZXdheV9zdHViLlF1ZXJ5RGV2aWNlKHJlcXVlc3QpCi0gIGlmIHJlc3BvbnNlLmRldmljZV9xdWVyeV9yZXN1bHQuZGV2aWNlX2luZm86Ci0gICAgcmV0dXJuICdBbmRyb2lkUmVhbERldmljZScKLQotICBkZXZpY2VfcXVlcnlfZmlsdGVyLkNsZWFyRmllbGQoJ3R5cGVfcmVnZXgnKQotICBkZXZpY2VfcXVlcnlfZmlsdGVyLnR5cGVfcmVnZXguYXBwZW5kKCdUZXN0YmVkRGV2aWNlJykKLSAgcmVxdWVzdCA9IGdhdGV3YXlfc2VydmljZV9wYjIuUXVlcnlEZXZpY2VSZXF1ZXN0KAotICAgICAgZGV2aWNlX3F1ZXJ5X2ZpbHRlcj1kZXZpY2VfcXVlcnlfZmlsdGVyKQotICByZXNwb25zZSA9IGdhdGV3YXlfc3R1Yi5RdWVyeURldmljZShyZXF1ZXN0KQotICBpZiByZXNwb25zZS5kZXZpY2VfcXVlcnlfcmVzdWx0LmRldmljZV9pbmZvOgotICAgIHJldHVybiAnVGVzdGJlZERldmljZScKLQotICByYWlzZSBEdXRDb25maWdFcnJvcignSW52YWxpZCAtLWJ0X2R1dCBjb25maWcgc3BlY2lmaWVkOiAlcycgJQotICAgICAgICAgICAgICAgICAgICAgICBkdXRfY29uZmlnX2RpY3QpCi0KLQotZGVmIGdlbmVyYXRlX2R1dF9jb25maWdzKGdhdGV3YXlfc3R1Yik6Ci0gICIiIkdlbmVyYXRlcyBhIHVuaWNvZGUgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGRlc2lyZWQgRFVUIGNvbmZpZ3VyYXRpb25zLgotCi0gIEFyZ3M6Ci0gICAgZ2F0ZXdheV9zdHViOiBBbiBSUEMyIHN0dWIgb2JqZWN0LgotCi0gIFJldHVybnM6Ci0gICAgc3RyaW5nLCBVbmljb2RlIHN0cmluZyBzcGVjaWZ5aW5nIERVVCBjb25maWd1cmF0aW9ucy4KLQotICBSYWlzZXM6Ci0gICAgRHV0Q29uZmlnRXJyb3I6IElmIC0tYnRfZHV0IGZsYWcocykgYXJlIGluY29ycmVjdGx5IHNwZWNpZmllZC4KLSAgIiIiCi0gIGR1dF9saXN0ID0gam9iX2NvbmZpZ19wYjIuSm9iQ29uZmlnKCkuRGV2aWNlTGlzdCgpCi0gIGR1dF9jb25maWdfZGljdF9saXN0ID0gW3BhcnNlX2ZsYWdfdmFsdWUodmFsdWUpIGZvciB2YWx1ZSBpbiBGTEFHUy5idF9kdXRdCi0KLSAgZm9yIGR1dF9jb25maWdfZGljdCBpbiBkdXRfY29uZmlnX2RpY3RfbGlzdDoKLSAgICBkdXRfY29uZmlnX2RpY3RbJ3Bvb2wnXSA9ICdibHVldG9vdGgtaW9wJwotICAgIGR1dCA9IGpvYl9jb25maWdfcGIyLkpvYkNvbmZpZygpLlN1YkRldmljZVNwZWMoKQotICAgIGlmICdoYXJkd2FyZScgbm90IGluIGR1dF9jb25maWdfZGljdDoKLSAgICAgIHJhaXNlIER1dENvbmZpZ0Vycm9yKCdNdXN0IHNwZWNpZnkgaGFyZHdhcmUgbmFtZSBmb3IgYnRfZHV0OiAlcycgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0X2NvbmZpZ19kaWN0KQotICAgIGR1dC50eXBlID0gZ2V0X2RldmljZV90eXBlKGdhdGV3YXlfc3R1YiwgZHV0X2NvbmZpZ19kaWN0KQotICAgIGZvciBjb25maWdfa2V5IGluIGR1dF9jb25maWdfZGljdDoKLSAgICAgIGR1dC5kaW1lbnNpb25zLmNvbnRlbnRbY29uZmlnX2tleV0gPSBkdXRfY29uZmlnX2RpY3RbY29uZmlnX2tleV0KLSAgICBkdXRfbGlzdC5zdWJfZGV2aWNlX3NwZWMuYXBwZW5kKGR1dCkKLSAgbG9nZ2luZy5pbmZvKGJhc2U2NC5iNjRlbmNvZGUoZHV0X2xpc3QuU2VyaWFsaXplVG9TdHJpbmcoKSkuZGVjb2RlKCd1dGYtOCcpKQotICByZXR1cm4gYmFzZTY0LmI2NGVuY29kZShkdXRfbGlzdC5TZXJpYWxpemVUb1N0cmluZygpKS5kZWNvZGUoJ3V0Zi04JykKLQotCi1kZWYgZ2VuZXJhdGVfYmxhemVfdGFyZ2V0cyhzZXNzaW9uX2NvbmZpZywgZ2F0ZXdheV9zdHViKToKLSAgIiIiR2VuZXJhdGVzIGFuZCBhcHBlbmRzIGJsYXplIHRlc3QgdGFyZ2V0cyB0byBhIE1vYmlsZUhhcm5lc3Mgc2Vzc2lvbi4KLQotICBBcmdzOgotICAgIHNlc3Npb25fY29uZmlnOiBUaGUgU2Vzc2lvbkNvbmZpZyBvYmplY3QgdG8gYXBwZW5kIGJsYXplIHRlc3QgdGFyZ2V0cyB0by4KLSAgICBnYXRld2F5X3N0dWI6IEFuIFJQQzIgc3R1YiBvYmplY3QuCi0KLSAgUmFpc2VzOgotICAgICBUZXN0Q29uZmlnRXJyb3I6IElmIC0tYnRfdGVzdCBmbGFnKHMpIGFyZSBpbmNvcnJlY3RseSBzcGVjaWZpZWQuCi0gICIiIgotICB0ZXN0X2NvbmZpZ19kaWN0X2xpc3QgPSBbcGFyc2VfZmxhZ192YWx1ZSh2YWx1ZSkgZm9yIHZhbHVlIGluIEZMQUdTLmJ0X3Rlc3RdCi0KLSAgZm9yIHRlc3RfY29uZmlnX2RpY3QgaW4gdGVzdF9jb25maWdfZGljdF9saXN0OgotICAgIHRhcmdldCA9IHNldHRpbmdfcGIyLkJsYXplVGFyZ2V0KCkKLSAgICBpZiAndGFyZ2V0JyBub3QgaW4gdGVzdF9jb25maWdfZGljdDoKLSAgICAgIHJhaXNlIFRlc3RDb25maWdFcnJvcignTXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IGZvciBidF90ZXN0OiAlcycgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY29uZmlnX2RpY3QpCi0gICAgdGFyZ2V0LnRhcmdldF9uYW1lID0gdGVzdF9jb25maWdfZGljdFsndGFyZ2V0J10KLSAgICB0YXJnZXQudGVzdF9mbGFncyA9IFRFU1RfRkxBR1MgJSBnZW5lcmF0ZV9kdXRfY29uZmlncyhnYXRld2F5X3N0dWIpCi0gICAgc2Vzc2lvbl9jb25maWcuYmxhemVfdGFyZ2V0LmFwcGVuZCh0YXJnZXQpCi0KLQotZGVmIHJ1bl9zZXNzaW9uKCk6Ci0gICIiIlJ1bnMgYSBjb25maWd1cmVkIHRlc3Qgc2Vzc2lvbi4KLQotICBSZXR1cm5zOgotICAgIEEgUnVuU2Vzc2lvblJlc3BvbnNlIG9iamVjdC4KLSAgIiIiCi0gIHNlc3Npb25fY29uZmlnID0gc2V0dGluZ19wYjIuU2Vzc2lvbkNvbmZpZygpCi0gIGNoYW5uZWwgPSBycGN1dGlsLkdldE5ld0NoYW5uZWwoJ2JsYWRlOm1vYmlsZWhhcm5lc3MtZ2F0ZXdheScpCi0gIGdhdGV3YXlfc3R1YiA9IGdhdGV3YXlfc2VydmljZV9wYjIuR2F0ZXdheVNlcnZpY2UuTmV3UlBDMlN0dWIoY2hhbm5lbD1jaGFubmVsKQotICBnZW5lcmF0ZV9ibGF6ZV90YXJnZXRzKHNlc3Npb25fY29uZmlnLCBnYXRld2F5X3N0dWIpCi0gIHJlcXVlc3QgPSBnYXRld2F5X3NlcnZpY2VfcGIyLlJ1blNlc3Npb25SZXF1ZXN0KCkKLSAgcmVxdWVzdC5zZXNzaW9uX2NvbmZpZy5Db3B5RnJvbShzZXNzaW9uX2NvbmZpZykKLSAgcmVzcG9uc2UgPSBnYXRld2F5X3N0dWIuUnVuU2Vzc2lvbihyZXF1ZXN0KQotICBsb2dnaW5nLmluZm8oJ1Nwb25nZSBsaW5rOiAlcycsIHJlc3BvbnNlLnNwb25nZSkKLSAgbG9nZ2luZy5pbmZvKCdTZXNzaW9uIElEOiAlcycsIHJlc3BvbnNlLnNlc3Npb25faWQpCi0gIHJldHVybiByZXNwb25zZQotCi0KLWRlZiBtYWluKGFyZ3YpOgotICBsb2dnaW5nLnVzZV9weXRob25fbG9nZ2luZygpCi0gIGRlbCBhcmd2Ci0gIHJ1bl9zZXNzaW9uKCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgZmxhZ3MubWFya19mbGFnX2FzX3JlcXVpcmVkKCdidF90ZXN0JykKLSAgZmxhZ3MubWFya19mbGFnX2FzX3JlcXVpcmVkKCdidF9kdXQnKQotICBhcHAucnVuKG1haW4pCmRpZmYgLS1naXQgYS9ibHVlYmVycnkvdXRpbHMvbWV0cmljc191dGlscy5weSBiL2JsdWViZXJyeS91dGlscy9tZXRyaWNzX3V0aWxzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJiOWU5Li4wMDAwMDAwCi0tLSBhL2JsdWViZXJyeS91dGlscy9tZXRyaWNzX3V0aWxzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSIiIk1ldHJpY3MgcmVwb3J0aW5nIG1vZHVsZSBmb3IgQmx1ZWJlcnJ5IHVzaW5nIHByb3RvYnVmLgotCi1JbnRlcm5hbCByZWZlcmVuY2UKLSIiIgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCi0KLWltcG9ydCBiYXNlNjQKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgdGltZQotCi0jIEludGVybmFsIGltcG9ydAotCi0KLWNsYXNzIEJsdWV0b290aE1ldHJpY0xvZ2dlcihvYmplY3QpOgotICAiIiJBIGNsYXNzIHVzZWQgZm9yIGdhdGhlcmluZyBtZXRyaWNzIGZyb20gdGVzdHMgYW5kIGRldmljZXMuCi0KLSAgVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIGFsbG93IHRlc3Qgd3JpdGVycyB0byBlYXNpbHkgZXhwb3J0IG1ldHJpY3MKLSAgZnJvbSB0aGVpciB0ZXN0cyBhcyBwcm90b2J1ZiBtZXNzYWdlcy4KLQotICBBdHRyaWJ1dGVzOgotICAgIF9tZXRyaWNzOiBUaGUgQmx1ZXRvb3RoIHRlc3QgcHJvdG8gbWVzc2FnZSB0byBhZGQgbWV0cmljcyB0by4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGJsdWV0b290aF90ZXN0X3Byb3RvX21lc3NhZ2UpOgotICAgIHNlbGYuX21ldHJpY3MgPSBibHVldG9vdGhfdGVzdF9wcm90b19tZXNzYWdlCi0gICAgc2VsZi5fc3RhcnRfdGltZSA9IGludCh0aW1lLnRpbWUoKSkKLQotICBkZWYgYWRkX3ByaW1hcnlfZGV2aWNlX21ldHJpY3Moc2VsZiwgZGV2aWNlKToKLSAgICAiIiJBZGRzIHByaW1hcnkgZGV2aWNlIG1ldHJpY3MgdG8gdGhlIHRlc3QgcHJvdG8gbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICBkZXZpY2U6IFRoZSBCbHVldG9vdGggZGV2aWNlIG9iamVjdCB0byBnYXRoZXIgZGV2aWNlIG1ldHJpY3MgZnJvbS4KLSAgICAiIiIKLSAgICBkZXZpY2VfbWVzc2FnZSA9IHNlbGYuX21ldHJpY3MuY29uZmlndXJhdGlvbl9kYXRhLnByaW1hcnlfZGV2aWNlCi0gICAgbWVzc2FnZV9maWVsZHMgPSBkZXZpY2VfbWVzc2FnZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lLmtleXMoKQotICAgIHRyeToKLSAgICAgIGRldmljZV9tZXRyaWNzX2RpY3QgPSBkZXZpY2UuZ2V0X2RldmljZV9pbmZvKCkKLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICBsb2dnaW5nLmluZm8oCi0gICAgICAgICAgJ011c3QgaW1wbGVtZW50IGdldF9kZXZpY2VfaW5mbyBtZXRob2QgZm9yIHRoaXMgY29udHJvbGxlciBpbiBvcmRlciB0byB1cGxvYWQgZGV2aWNlIG1ldHJpY3MuJwotICAgICAgKQotICAgICAgcmV0dXJuCi0KLSAgICBmb3IgbWV0cmljIGluIGRldmljZV9tZXRyaWNzX2RpY3Q6Ci0gICAgICBpZiBtZXRyaWMgaW4gbWVzc2FnZV9maWVsZHM6Ci0gICAgICAgIHNldGF0dHIoZGV2aWNlX21lc3NhZ2UsIG1ldHJpYywgZGV2aWNlX21ldHJpY3NfZGljdFttZXRyaWNdKQotICAgICAgZWxzZToKLSAgICAgICAgbG9nZ2luZy5pbmZvKCclcyBpcyBub3QgYSB2YWxpZCBtZXRyaWMgZmllbGQuJywgbWV0cmljKQotCi0gIGRlZiBhZGRfY29ubmVjdGVkX2RldmljZV9tZXRyaWNzKHNlbGYsIGRldmljZSk6Ci0gICAgIiIiQWRkcyBjb25uZWN0ZWQgZGV2aWNlIG1ldHJpY3MgdG8gdGhlIHRlc3QgcHJvdG8gbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICBkZXZpY2U6IFRoZSBCbHVldG9vdGggZGV2aWNlIG9iamVjdCB0byBnYXRoZXIgZGV2aWNlIG1ldHJpY3MgZnJvbS4KLSAgICAiIiIKLSAgICBkZXZpY2VfbWVzc2FnZSA9IHNlbGYuX21ldHJpY3MuY29uZmlndXJhdGlvbl9kYXRhLmNvbm5lY3RlZF9kZXZpY2UKLSAgICBtZXNzYWdlX2ZpZWxkcyA9IGRldmljZV9tZXNzYWdlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWUua2V5cygpCi0gICAgdHJ5OgotICAgICAgZGV2aWNlX21ldHJpY3NfZGljdCA9IGRldmljZS5nZXRfZGV2aWNlX2luZm8oKQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgIGxvZ2dpbmcuaW5mbygKLSAgICAgICAgICAnTXVzdCBpbXBsZW1lbnQgZ2V0X2RldmljZV9pbmZvIG1ldGhvZCBmb3IgdGhpcyBjb250cm9sbGVyIGluIG9yZGVyIHRvIHVwbG9hZCBkZXZpY2UgbWV0cmljcy4nCi0gICAgICApCi0gICAgICByZXR1cm4KLQotICAgIGZvciBtZXRyaWMgaW4gZGV2aWNlX21ldHJpY3NfZGljdDoKLSAgICAgIGlmIG1ldHJpYyBpbiBtZXNzYWdlX2ZpZWxkczoKLSAgICAgICAgc2V0YXR0cihkZXZpY2VfbWVzc2FnZSwgbWV0cmljLCBkZXZpY2VfbWV0cmljc19kaWN0W21ldHJpY10pCi0gICAgICBlbHNlOgotICAgICAgICBsb2dnaW5nLndhcm5pbmcoJyVzIGlzIG5vdCBhIHZhbGlkIG1ldHJpYyBmaWVsZC4nLCBtZXRyaWMpCi0KLSAgZGVmIGFkZF90ZXN0X21ldHJpY3Moc2VsZiwgdGVzdF9tZXRyaWNzX2RpY3QpOgotICAgICIiIkFkZHMgdGVzdCBtZXRyaWNzIHRvIHRoZSB0ZXN0IHByb3RvIG1lc3NhZ2UuCi0KLSAgICBBcmdzOgotICAgICAgdGVzdF9tZXRyaWNzX2RpY3Q6IEEgZGljdGlvbmFyeSBvZiBtZXRyaWNzIHRvIGFkZCB0byB0aGUgdGVzdCBwcm90bwotICAgICAgbWVzc2FnZS4gTWV0cmljIHdpbGwgb25seSBiZSBhZGRlZCBpZiB0aGUga2V5IGV4aXN0cyBhcyBhIGZpZWxkIGluIHRoZQotICAgICAgdGVzdCBwcm90byBtZXNzYWdlLgotICAgICIiIgotICAgIGlmIGhhc2F0dHIoc2VsZi5fbWV0cmljcywgJ2NvbmZpZ3VyYXRpb25fZGF0YScpOgotICAgICAgc2VsZi5fbWV0cmljcy5jb25maWd1cmF0aW9uX2RhdGEudGVzdF9kYXRlX3RpbWUgPSBzZWxmLl9zdGFydF90aW1lCi0gICAgbWVzc2FnZV9maWVsZHMgPSBzZWxmLl9tZXRyaWNzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWUua2V5cygpCi0gICAgZm9yIG1ldHJpYyBpbiB0ZXN0X21ldHJpY3NfZGljdDoKLSAgICAgIGlmIG1ldHJpYyBpbiBtZXNzYWdlX2ZpZWxkczoKLSAgICAgICAgbWV0cmljX3ZhbHVlID0gdGVzdF9tZXRyaWNzX2RpY3RbbWV0cmljXQotICAgICAgICBpZiBpc2luc3RhbmNlKG1ldHJpY192YWx1ZSwgKGxpc3QsIHR1cGxlKSk6Ci0gICAgICAgICAgZ2V0YXR0cihzZWxmLl9tZXRyaWNzLCBtZXRyaWMpLmV4dGVuZChtZXRyaWNfdmFsdWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2V0YXR0cihzZWxmLl9tZXRyaWNzLCBtZXRyaWMsIG1ldHJpY192YWx1ZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGxvZ2dpbmcud2FybmluZygnJXMgaXMgbm90IGEgdmFsaWQgbWV0cmljIGZpZWxkLicsIG1ldHJpYykKLQotICBkZWYgcHJvdG9fbWVzc2FnZV90b19iYXNlNjQoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgYSBwcm90byBtZXNzYWdlIHRvIGEgYmFzZTY0IHN0cmluZy4KLQotICAgIFJldHVybnM6Ci0gICAgc3RyaW5nLCBNZXNzYWdlIGZvcm1hdHRlZCBhcyBhIGJhc2U2NCBzdHJpbmcuCi0gICAgIiIiCi0gICAgcmV0dXJuIGJhc2U2NC5iNjRlbmNvZGUoc2VsZi5fbWV0cmljcy5TZXJpYWxpemVUb1N0cmluZygpKS5kZWNvZGUoJ3V0Zi04JykKLQotICBkZWYgcHJvdG9fbWVzc2FnZV90b19hc2NpaShzZWxmKToKLSAgICAiIiJDb252ZXJ0cyBhIHByb3RvIG1lc3NhZ2UgdG8gYW4gQVNDSUkgc3RyaW5nLgotCi0gICAgUmV0dXJuczoKLSAgICAgIHN0cmluZywgTWVzc2FnZSBmb3JtYXR0ZWQgYXMgYW4gQVNDSUkgc3RyaW5nLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy4KLSAgICAiIiIKLSAgICByZXR1cm4gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHNlbGYuX21ldHJpY3MpCmRpZmYgLS1naXQgYS9idGEvQW5kcm9pZC5icCBiL2J0YS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFkYjM0Li4wMDAwMDAwCi0tLSBhL2J0YS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZmx1b3JpZGVfYnRhX2RlZmF1bHRzIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJzeXMiLAotICAgICAgICAiZG0iLAotICAgICAgICAiaGQiLAotICAgICAgICAiaGgiLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRpZi9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2J0bSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdWRydi9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC92bmQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QvcnVzdC9zaGltIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLSAgICBjZmxhZ3M6IFsiLURCVUlMRENGRyJdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiQnRhRG1Tb3VyY2VzIiwKLSAgc3JjczogWwotICAgICJkbS9idGFfZG1fYWN0LmNjIiwKLSAgICAiZG0vYnRhX2RtX2FwaS5jYyIsCi0gICAgImRtL2J0YV9kbV9jZmcuY2MiLAotICAgICJkbS9idGFfZG1fY2kuY2MiLAotICAgICJkbS9idGFfZG1fbWFpbi5jYyIsCi0gICAgImRtL2J0YV9kbV9wbS5jYyIsCi0gIF0sCi19Ci0KLS8vIEJUQSBzdGF0aWMgbGlicmFyeSBmb3IgdGFyZ2V0Ci1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0LWJ0YSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfYnRhX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiOkJ0YURtU291cmNlcyIsCi0gICAgICAgICJhZy9idGFfYWdfYWN0LmNjIiwKLSAgICAgICAgImFnL2J0YV9hZ19hcGkuY2MiLAotICAgICAgICAiYWcvYnRhX2FnX2F0LmNjIiwKLSAgICAgICAgImFnL2J0YV9hZ19jZmcuY2MiLAotICAgICAgICAiYWcvYnRhX2FnX2NtZC5jYyIsCi0gICAgICAgICJhZy9idGFfYWdfbWFpbi5jYyIsCi0gICAgICAgICJhZy9idGFfYWdfcmZjLmNjIiwKLSAgICAgICAgImFnL2J0YV9hZ19zY28uY2MiLAotICAgICAgICAiYWcvYnRhX2FnX3NkcC5jYyIsCi0gICAgICAgICJhci9idGFfYXIuY2MiLAotICAgICAgICAiYXYvYnRhX2F2X2FhY3QuY2MiLAotICAgICAgICAiYXYvYnRhX2F2X2FjdC5jYyIsCi0gICAgICAgICJhdi9idGFfYXZfYXBpLmNjIiwKLSAgICAgICAgImF2L2J0YV9hdl9jZmcuY2MiLAotICAgICAgICAiYXYvYnRhX2F2X2NpLmNjIiwKLSAgICAgICAgImF2L2J0YV9hdl9tYWluLmNjIiwKLSAgICAgICAgImF2L2J0YV9hdl9zc20uY2MiLAotICAgICAgICAiY3Npcy9jc2lzX2NsaWVudC5jYyIsCi0gICAgICAgICJnYXR0L2J0YV9nYXR0Y19hY3QuY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dGNfYXBpLmNjIiwKLSAgICAgICAgImdhdHQvYnRhX2dhdHRjX2NhY2hlLmNjIiwKLSAgICAgICAgImdhdHQvYnRhX2dhdHRjX21haW4uY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dGNfcXVldWUuY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dGNfdXRpbHMuY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dHNfYWN0LmNjIiwKLSAgICAgICAgImdhdHQvYnRhX2dhdHRzX2FwaS5jYyIsCi0gICAgICAgICJnYXR0L2J0YV9nYXR0c19tYWluLmNjIiwKLSAgICAgICAgImdhdHQvYnRhX2dhdHRzX3V0aWxzLmNjIiwKLSAgICAgICAgImdhdHQvZGF0YWJhc2UuY2MiLAotICAgICAgICAiZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmNjIiwKLSAgICAgICAgImdyb3Vwcy9ncm91cHMuY2MiLAotICAgICAgICAidmMvZGV2aWNlLmNjIiwKLSAgICAgICAgInZjL3ZjLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2NsaWVudC5jYyIsCi0gICAgICAgICJsZV9hdWRpby9kZXZpY2VzLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2hhbF92ZXJpZmllci5jYyIsCi0gICAgICAgICJsZV9hdWRpby9zdGF0ZV9tYWNoaW5lLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2NsaWVudF9wYXJzZXIuY2MiLAotICAgICAgICAibGVfYXVkaW8vY2xpZW50X2F1ZGlvLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2xlX2F1ZGlvX3R5cGVzLmNjIiwKLSAgICAgICAgImhlYXJpbmdfYWlkL2hlYXJpbmdfYWlkLmNjIiwKLSAgICAgICAgImhlYXJpbmdfYWlkL2hlYXJpbmdfYWlkX2F1ZGlvX3NvdXJjZS5jYyIsCi0gICAgICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hY3QuY2MiLAotICAgICAgICAiaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXBpLmNjIiwKLSAgICAgICAgImhmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmNjIiwKLSAgICAgICAgImhmX2NsaWVudC9idGFfaGZfY2xpZW50X21haW4uY2MiLAotICAgICAgICAiaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfcmZjLmNjIiwKLSAgICAgICAgImhmX2NsaWVudC9idGFfaGZfY2xpZW50X3Njby5jYyIsCi0gICAgICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuY2MiLAotICAgICAgICAiaGgvYnRhX2hoX2FjdC5jYyIsCi0gICAgICAgICJoaC9idGFfaGhfYXBpLmNjIiwKLSAgICAgICAgImhoL2J0YV9oaF9jZmcuY2MiLAotICAgICAgICAiaGgvYnRhX2hoX2xlLmNjIiwKLSAgICAgICAgImhoL2J0YV9oaF9tYWluLmNjIiwKLSAgICAgICAgImhoL2J0YV9oaF91dGlscy5jYyIsCi0gICAgICAgICJoZC9idGFfaGRfYWN0LmNjIiwKLSAgICAgICAgImhkL2J0YV9oZF9hcGkuY2MiLAotICAgICAgICAiaGQvYnRhX2hkX21haW4uY2MiLAotICAgICAgICAianYvYnRhX2p2X2FjdC5jYyIsCi0gICAgICAgICJqdi9idGFfanZfYXBpLmNjIiwKLSAgICAgICAgImp2L2J0YV9qdl9jZmcuY2MiLAotICAgICAgICAicGFuL2J0YV9wYW5fYWN0LmNjIiwKLSAgICAgICAgInBhbi9idGFfcGFuX2FwaS5jYyIsCi0gICAgICAgICJwYW4vYnRhX3Bhbl9jaS5jYyIsCi0gICAgICAgICJwYW4vYnRhX3Bhbl9tYWluLmNjIiwKLSAgICAgICAgInNkcC9idGFfc2RwLmNjIiwKLSAgICAgICAgInNkcC9idGFfc2RwX2FjdC5jYyIsCi0gICAgICAgICJzZHAvYnRhX3NkcF9hcGkuY2MiLAotICAgICAgICAic2RwL2J0YV9zZHBfY2ZnLmNjIiwKLSAgICAgICAgInN5cy9idGFfc3lzX2Nvbm4uY2MiLAotICAgICAgICAic3lzL2J0YV9zeXNfbWFpbi5jYyIsCi0gICAgICAgICJzeXMvdXRsLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhdnJjcC10YXJnZXQtc2VydmljZSIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMSIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotLy8gYnRhIHVuaXQgdGVzdHMgZm9yIHRhcmdldAotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2J0YSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfYnRhX2RlZmF1bHRzIl0sCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiOlRlc3RNb2NrU3RhY2tCdG0iLAotICAgICAgICAiOlRlc3RDb21tb25Nb2NrRnVuY3Rpb25zIiwKLSAgICAgICAgInRlc3QvYnRhX2hmX2NsaWVudF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvYnRhX2RtX2N1c3RfdXVpZF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvYnRhX2RpcF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvZ2F0dC9kYXRhYmFzZV9idWlsZGVyX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9nYXR0L2RhdGFiYXNlX2J1aWxkZXJfc2FtcGxlX2RldmljZV90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvZ2F0dC9kYXRhYmFzZV90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJjcnlwdG9fdG9vbGJveF9mb3JfdGVzdHMiLAotICAgICAgICAibGliYnRjb3JlIiwKLSAgICAgICAgImxpYmJ0LWJ0YSIsCi0gICAgICAgICJsaWJidC1hdWRpby1oYWwtaW50ZXJmYWNlIiwKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICBdLAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiYnRfaG9zdF90ZXN0X2J0YSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfYnRhX2RlZmF1bHRzIl0sCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6T3NpQ29tcGF0U291cmNlcyIsCi0gICAgICAgICI6VGVzdENvbW1vbk1haW5IYW5kbGVyIiwKLSAgICAgICAgIjpUZXN0TW9ja0J0aWYiLAotICAgICAgICAiOlRlc3RNb2NrRGV2aWNlIiwKLSAgICAgICAgIjpUZXN0TW9ja01haW5TaGltIiwKLSAgICAgICAgIjpUZXN0TW9ja09zaSIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFjayIsCi0gICAgICAgICJhci9idGFfYXIuY2MiLAotICAgICAgICAiZG0vYnRhX2RtX2FwaS5jYyIsCi0gICAgICAgICJkbS9idGFfZG1fYWN0LmNjIiwKLSAgICAgICAgImRtL2J0YV9kbV9jZmcuY2MiLAotICAgICAgICAiZG0vYnRhX2RtX2NpLmNjIiwKLSAgICAgICAgImRtL2J0YV9kbV9tYWluLmNjIiwKLSAgICAgICAgImRtL2J0YV9kbV9wbS5jYyIsCi0gICAgICAgICJnYXR0L2J0YV9nYXR0Y19hY3QuY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dGNfYXBpLmNjIiwKLSAgICAgICAgImdhdHQvYnRhX2dhdHRjX2NhY2hlLmNjIiwKLSAgICAgICAgImdhdHQvYnRhX2dhdHRjX21haW4uY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dGNfcXVldWUuY2MiLAotICAgICAgICAiZ2F0dC9idGFfZ2F0dGNfdXRpbHMuY2MiLAotICAgICAgICAiZ2F0dC9kYXRhYmFzZS5jYyIsCi0gICAgICAgICJnYXR0L2RhdGFiYXNlX2J1aWxkZXIuY2MiLAotICAgICAgICAiaGgvYnRhX2hoX2FjdC5jYyIsCi0gICAgICAgICJoaC9idGFfaGhfYXBpLmNjIiwKLSAgICAgICAgImhoL2J0YV9oaF9jZmcuY2MiLAotICAgICAgICAiaGgvYnRhX2hoX2xlLmNjIiwKLSAgICAgICAgImhoL2J0YV9oaF9tYWluLmNjIiwKLSAgICAgICAgImhoL2J0YV9oaF91dGlscy5jYyIsCi0gICAgICAgICJwYW4vYnRhX3Bhbl9hY3QuY2MiLAotICAgICAgICAicGFuL2J0YV9wYW5fYXBpLmNjIiwKLSAgICAgICAgInBhbi9idGFfcGFuX21haW4uY2MiLAotICAgICAgICAic3lzL2J0YV9zeXNfY29ubi5jYyIsCi0gICAgICAgICJzeXMvYnRhX3N5c19tYWluLmNjIiwKLSAgICAgICAgInRlc3QvYnRhX2RtX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9idGFfZ2F0dF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvYnRhX3Bhbl90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJidGNvcmUiLAotICAgICAgICAibGliZ21vY2siLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJib3VuZHMiXSwKLSAgICB9LAotfQotCi0vLyBidGEgaGYgY2xpZW50IGFkZCByZWNvcmQgdGVzdHMgZm9yIHRhcmdldAotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2hmX2NsaWVudF9hZGRfcmVjb3JkIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2J0YV9oZl9jbGllbnRfYWRkX3JlY29yZF90ZXN0LmNjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbIi1EQlVJTERDRkciXSwKLX0KLQotLy8gY3NpcyB1bml0IHRlc3RzIGZvciBob3N0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoX2NzaXNfdGVzdCIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX2J0YV9kZWZhdWx0cyIsCi0gICAgICAgICJjbGFuZ19jb3ZlcmFnZV9iaW4iLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9ncm91cHMiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvdGVzdC9jb21tb24iLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvb3NpL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjcyA6IFsKLSAgICAgICAgIjpUZXN0TW9ja0J0aWYiLAotICAgICAgICAiY3Npcy9jc2lzX2NsaWVudC5jYyIsCi0gICAgICAgICJjc2lzL2NzaXNfY2xpZW50X3Rlc3QuY2MiLAotICAgICAgICAiZ3JvdXBzL2dyb3Vwcy5jYyIsCi0gICAgICAgICJnYXR0L2RhdGFiYXNlLmNjIiwKLSAgICAgICAgImdhdHQvZGF0YWJhc2VfYnVpbGRlci5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9idGFfZG1fYXBpX21vY2suY2MiLAotICAgICAgICAidGVzdC9jb21tb24vYnRhX2dhdHRfYXBpX21vY2suY2MiLAotICAgICAgICAidGVzdC9jb21tb24vYnRhX2dhdHRfcXVldWVfbW9jay5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9idG1fYXBpX21vY2suY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGlicyA6IFsKLSAgICAgICAgImNyeXB0b190b29sYm94X2Zvcl90ZXN0cyIsCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgc2NzOiB0cnVlLAotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBhbGxfdW5kZWZpbmVkOiB0cnVlLAotICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICB1bmRlZmluZWQgOiB0cnVlCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotLy8gZ3JvdXBzIHVuaXQgdGVzdHMgZm9yIGhvc3QKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJibHVldG9vdGhfZ3JvdXBzX3Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJmbHVvcmlkZV9idGFfZGVmYXVsdHMiLAotICAgICAgICAiY2xhbmdfY292ZXJhZ2VfYmluIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzIDogWwotICAgICAgICAiOlRlc3RNb2NrQnRpZiIsCi0gICAgICAgICJncm91cHMvZ3JvdXBzX3Rlc3QuY2MiLAotICAgICAgICAiZ3JvdXBzL2dyb3Vwcy5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzIDogWwotICAgICAgICAiY3J5cHRvX3Rvb2xib3hfZm9yX3Rlc3RzIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBzY3M6IHRydWUsCi0gICAgICAgIGFkZHJlc3M6IHRydWUsCi0gICAgICAgIGFsbF91bmRlZmluZWQ6IHRydWUsCi0gICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIHVuZGVmaW5lZCA6IHRydWUKLSAgICAgICAgfSwKLSAgICB9LAotfQotCi0vLyBidGEgdW5pdCB0ZXN0cyBmb3IgaG9zdAotY2NfdGVzdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF92Y190ZXN0IiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfYnRhX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2NvdmVyYWdlX2JpbiIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS90ZXN0L2NvbW1vbiIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzIDogWwotICAgICAgICAiOlRlc3RNb2NrT3NpIiwKLSAgICAgICAgImdhdHQvZGF0YWJhc2UuY2MiLAotICAgICAgICAiZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL2J0YV9nYXR0X2FwaV9tb2NrLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL2J0YV9nYXR0X3F1ZXVlX21vY2suY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19jc2lzX2NsaWVudC5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9idG1fYXBpX21vY2suY2MiLAotICAgICAgICAidmMvZGV2aWNlc190ZXN0LmNjIiwKLSAgICAgICAgInZjL2RldmljZS5jYyIsCi0gICAgICAgICJ2Yy92Yy5jYyIsCi0gICAgICAgICJ2Yy92Y190ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnMgOiBbCi0gICAgICAgICJjcnlwdG9fdG9vbGJveF9mb3JfdGVzdHMiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYm9zaSIKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogZmFsc2UsCi0gICAgfSwKLX0KLQotLy8gYnRhIHVuaXQgdGVzdHMgZm9yIExFIEF1ZGlvCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF9sZV9hdWRpb190ZXN0IiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfZGVmYXVsdHMiLAotICAgICAgICAiY2xhbmdfY292ZXJhZ2VfYmluIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL3Rlc3QvY29tbW9uIiwKLSAgICAgICAgInN5c3RlbS9idC9idGlmL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3MgOiBbCi0gICAgICAgICI6VGVzdFN0dWJPc2kiLAotICAgICAgICAidGVzdC9jb21tb24vYnRhX2dhdHRfYXBpX21vY2suY2MiLAotICAgICAgICAidGVzdC9jb21tb24vYnRhX2dhdHRfcXVldWVfbW9jay5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9idG1fYXBpX21vY2suY2MiLAotICAgICAgICAibGVfYXVkaW8vY2xpZW50X2F1ZGlvLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2NsaWVudF9hdWRpb190ZXN0LmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2NsaWVudF9wYXJzZXIuY2MiLAotICAgICAgICAibGVfYXVkaW8vY2xpZW50X3BhcnNlcl90ZXN0LmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2RldmljZXMuY2MiLAotICAgICAgICAibGVfYXVkaW8vZGV2aWNlc190ZXN0LmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2xlX2F1ZGlvX3R5cGVzLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2xlX2F1ZGlvX3R5cGVzX3Rlc3QuY2MiLAotICAgICAgICAibGVfYXVkaW8vbW9ja19pc29fbWFuYWdlci5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuY2MiLAotICAgICAgICAibGVfYXVkaW8vc3RhdGVfbWFjaGluZS5jYyIsCi0gICAgICAgICJsZV9hdWRpby9zdGF0ZV9tYWNoaW5lX3Rlc3QuY2MiCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmxvZyIsICAvLyBfX2FuZHJvaWRfbG9nX3ByaW50Ci0gICAgXSwKLSAgICBzdGF0aWNfbGlicyA6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiBmYWxzZSwKLSAgICB9LAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoX2xlX2F1ZGlvX2NsaWVudF90ZXN0IiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfYnRhX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2NvdmVyYWdlX2JpbiIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS90ZXN0L2NvbW1vbiIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzIDogWwotICAgICAgICAiOlRlc3RNb2NrQnRhTGVBdWRpb0hhbFZlcmlmaWVyIiwKLSAgICAgICAgImdhdHQvZGF0YWJhc2UuY2MiLAotICAgICAgICAiZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2NsaWVudC5jYyIsCi0gICAgICAgICJsZV9hdWRpby9jbGllbnRfcGFyc2VyLmNjIiwKLSAgICAgICAgImxlX2F1ZGlvL2RldmljZXMuY2MiLAotICAgICAgICAibGVfYXVkaW8vbGVfYXVkaW9fY2xpZW50X3Rlc3QuY2MiLAotICAgICAgICAibGVfYXVkaW8vbGVfYXVkaW9fdHlwZXMuY2MiLAotICAgICAgICAibGVfYXVkaW8vbW9ja19pc29fbWFuYWdlci5jYyIsCi0gICAgICAgICJsZV9hdWRpby9tb2NrX2xlX2F1ZGlvX2NsaWVudF9hdWRpby5jYyIsCi0gICAgICAgICJsZV9hdWRpby9tb2NrX3N0YXRlX21hY2hpbmUuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vYnRtX2FwaV9tb2NrLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL2J0YV9nYXR0X2FwaV9tb2NrLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL2J0YV9nYXR0X3F1ZXVlX21vY2suY2MiLAotICAgICAgICAidGVzdC9jb21tb24vYnRpZl9zdG9yYWdlX21vY2suY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19jc2lzX2NsaWVudC5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19kZXZpY2VfZ3JvdXBzLmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4xIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnMgOiBbCi0gICAgICAgICJjcnlwdG9fdG9vbGJveF9mb3JfdGVzdHMiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJsYzNjb2RlYyIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIHNjczogdHJ1ZSwKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgYWxsX3VuZGVmaW5lZDogdHJ1ZSwKLSAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgdW5kZWZpbmVkIDogdHJ1ZQotICAgICAgICB9LAotICAgIH0sCi19Ci0KZGlmZiAtLWdpdCBhL2J0YS9CVUlMRC5nbiBiL2J0YS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjN2I5Mi4uMDAwMDAwMAotLS0gYS9idGEvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXN0YXRpY19saWJyYXJ5KCJidGEiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImFnL2J0YV9hZ19hY3QuY2MiLAotICAgICJhZy9idGFfYWdfYXBpLmNjIiwKLSAgICAiYWcvYnRhX2FnX2F0LmNjIiwKLSAgICAiYWcvYnRhX2FnX2NmZy5jYyIsCi0gICAgImFnL2J0YV9hZ19jbWQuY2MiLAotICAgICJhZy9idGFfYWdfbWFpbi5jYyIsCi0gICAgImFnL2J0YV9hZ19yZmMuY2MiLAotICAgICJhZy9idGFfYWdfc2NvLmNjIiwKLSAgICAiYWcvYnRhX2FnX3NkcC5jYyIsCi0gICAgImFyL2J0YV9hci5jYyIsCi0gICAgImF2L2J0YV9hdl9hYWN0LmNjIiwKLSAgICAiYXYvYnRhX2F2X2FjdC5jYyIsCi0gICAgImF2L2J0YV9hdl9hcGkuY2MiLAotICAgICJhdi9idGFfYXZfY2ZnLmNjIiwKLSAgICAiYXYvYnRhX2F2X2NpLmNjIiwKLSAgICAiYXYvYnRhX2F2X21haW4uY2MiLAotICAgICJhdi9idGFfYXZfc3NtLmNjIiwKLSAgICAiY3Npcy9jc2lzX2NsaWVudC5jYyIsCi0gICAgImRtL2J0YV9kbV9hY3QuY2MiLAotICAgICJkbS9idGFfZG1fYXBpLmNjIiwKLSAgICAiZG0vYnRhX2RtX2NmZy5jYyIsCi0gICAgImRtL2J0YV9kbV9jaS5jYyIsCi0gICAgImRtL2J0YV9kbV9tYWluLmNjIiwKLSAgICAiZG0vYnRhX2RtX3BtLmNjIiwKLSAgICAiZ2F0dC9idGFfZ2F0dGNfYWN0LmNjIiwKLSAgICAiZ2F0dC9idGFfZ2F0dGNfYXBpLmNjIiwKLSAgICAiZ2F0dC9idGFfZ2F0dGNfY2FjaGUuY2MiLAotICAgICJnYXR0L2J0YV9nYXR0Y19tYWluLmNjIiwKLSAgICAiZ2F0dC9idGFfZ2F0dGNfdXRpbHMuY2MiLAotICAgICJnYXR0L2J0YV9nYXR0Y19xdWV1ZS5jYyIsCi0gICAgImdhdHQvYnRhX2dhdHRzX2FjdC5jYyIsCi0gICAgImdhdHQvYnRhX2dhdHRzX2FwaS5jYyIsCi0gICAgImdhdHQvYnRhX2dhdHRzX21haW4uY2MiLAotICAgICJnYXR0L2J0YV9nYXR0c191dGlscy5jYyIsCi0gICAgImdhdHQvZGF0YWJhc2UuY2MiLAotICAgICJnYXR0L2RhdGFiYXNlX2J1aWxkZXIuY2MiLAotICAgICJncm91cHMvZ3JvdXBzLmNjIiwKLSAgICAiaGVhcmluZ19haWQvaGVhcmluZ19haWQuY2MiLAotICAgICJoZWFyaW5nX2FpZC9oZWFyaW5nX2FpZF9hdWRpb19zb3VyY2UuY2MiLAotICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hY3QuY2MiLAotICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hcGkuY2MiLAotICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hdC5jYyIsCi0gICAgImhmX2NsaWVudC9idGFfaGZfY2xpZW50X21haW4uY2MiLAotICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9yZmMuY2MiLAotICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuY2MiLAotICAgICJoZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zY28uY2MiLAotICAgICJoaC9idGFfaGhfYWN0LmNjIiwKLSAgICAiaGgvYnRhX2hoX2FwaS5jYyIsCi0gICAgImhoL2J0YV9oaF9jZmcuY2MiLAotICAgICJoaC9idGFfaGhfbGUuY2MiLAotICAgICJoaC9idGFfaGhfbWFpbi5jYyIsCi0gICAgImhoL2J0YV9oaF91dGlscy5jYyIsCi0gICAgImhkL2J0YV9oZF9hY3QuY2MiLAotICAgICJoZC9idGFfaGRfYXBpLmNjIiwKLSAgICAiaGQvYnRhX2hkX21haW4uY2MiLAotICAgICJqdi9idGFfanZfYWN0LmNjIiwKLSAgICAianYvYnRhX2p2X2FwaS5jYyIsCi0gICAgImp2L2J0YV9qdl9jZmcuY2MiLAotICAgICJsZV9hdWRpby9jbGllbnRfbGludXguY2MiLAotICAgICJsZV9hdWRpby9oYWxfdmVyaWZpZXJfbGludXguY2MiLAotICAgICJwYW4vYnRhX3Bhbl9hY3QuY2MiLAotICAgICJwYW4vYnRhX3Bhbl9hcGkuY2MiLAotICAgICJwYW4vYnRhX3Bhbl9jaS5jYyIsCi0gICAgInBhbi9idGFfcGFuX21haW4uY2MiLAotICAgICJzZHAvYnRhX3NkcC5jYyIsCi0gICAgInNkcC9idGFfc2RwX2FjdC5jYyIsCi0gICAgInNkcC9idGFfc2RwX2FwaS5jYyIsCi0gICAgInNkcC9idGFfc2RwX2NmZy5jYyIsCi0gICAgInN5cy9idGFfc3lzX2Nvbm4uY2MiLAotICAgICJzeXMvYnRhX3N5c19tYWluLmNjIiwKLSAgICAic3lzL3V0bC5jYyIsCi0gICAgInZjL2RldmljZS5jYyIsCi0gICAgInZjL3ZjLmNjIiwKLSAgXQotCi0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiY2xvc3VyZSIsCi0gICAgImRtIiwKLSAgICAiaGgiLAotICAgICJoZCIsCi0gICAgImluY2x1ZGUiLAotICAgICJzeXMiLAotICAgICIvL2J0LyIsCi0gICAgIi8vYnQvbGludXhfaW5jbHVkZSIsCi0gICAgIi8vYnQvYnRhIiwKLSAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgIi8vYnQvaGNpL2luY2x1ZGUiLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2J0bSIsCi0gICAgIi8vYnQvdWRydi9pbmNsdWRlIiwKLSAgICAiLy9idC91dGlscy9pbmNsdWRlIiwKLSAgICAiLy9idC92bmQvaW5jbHVkZSIsCi0gICAgIi8vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAiLy9idC9idGlmL2F2cmNwIiwKLSAgICAiLy9idC9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwIiwKLSAgICAiLy9idC9wcm9maWxlL2F2cmNwIiwKLSAgICAiLy9idC9wYWNrZXQvYXZyY3AiLAotICAgICIvL2J0L3BhY2tldC9iYXNlIiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWwotICAgICIvL2J0OnRhcmdldF9kZWZhdWx0cyIKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOnNoaW1fYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOm1lc3NhZ2VfbG9vcF90aHJlYWRfYnJpZGdlX2hlYWRlciIsCi0gIF0KLX0KLQotaWYgKHVzZS50ZXN0KSB7Ci0gIGV4ZWN1dGFibGUoIm5ldF90ZXN0X2J0YSIpIHsKLSAgICBzb3VyY2VzID0gWwotICAgICAgImdhdHQvZGF0YWJhc2VfYnVpbGRlci5jYyIsCi0gICAgICAidGVzdC9nYXR0L2RhdGFiYXNlX2J1aWxkZXJfdGVzdC5jYyIsCi0gICAgICAidGVzdC9nYXR0L2RhdGFiYXNlX2J1aWxkZXJfc2FtcGxlX2RldmljZV90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L2dhdHQvZGF0YWJhc2VfdGVzdC5jYyIsCi0gICAgXQotCi0gICAgaW5jbHVkZV9kaXJzID0gWwotICAgICAgImluY2x1ZGUiLAotICAgICAgIi8vYnQvIiwKLSAgICAgICIvL2J0L2J0YSIsCi0gICAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAiLy9idC9oY2kvaW5jbHVkZSIsCi0gICAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICIvL2J0L3N0YWNrL2J0bSIsCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICIvL2J0L2J0YSIsCi0gICAgICAiLy9idC90eXBlcyIsCi0gICAgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9nbW9ja19tYWluIiwKLSAgICAgICIvL2J0OnRhcmdldF9kZWZhdWx0cyIsCi0gICAgXQotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX2FjdC5jYyBiL2J0YS9hZy9idGFfYWdfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYwOGJlLi4wMDAwMDAwCi0tLSBhL2J0YS9hZy9idGFfYWdfYWN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFjdGlvbiBmdW5jdGlvbnMgZm9yIHRoZSBhdWRpbyBnYXRld2F5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJidGEvYWcvYnRhX2FnX2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9kbV9hcGkuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogbWF4aW11bSBsZW5ndGggb2YgZGF0YSB0byByZWFkIGZyb20gUkZDT01NICovCi0jZGVmaW5lIEJUQV9BR19SRkNfUkVBRF9NQVggNTEyCi0KLS8qIG1heGltdW0gQVQgY29tbWFuZCBsZW5ndGggKi8KLSNkZWZpbmUgQlRBX0FHX0NNRF9NQVggNTEyCi0KLWNvbnN0IHVpbnQxNl90IGJ0YV9hZ191dWlkW0JUQV9BR19OVU1fSURYXSA9IHsKLSAgICBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVksIFVVSURfU0VSVkNMQVNTX0FHX0hBTkRTRlJFRX07Ci0KLWNvbnN0IHVpbnQ4X3QgYnRhX2FnX3NlY19pZFtCVEFfQUdfTlVNX0lEWF0gPSB7QlRNX1NFQ19TRVJWSUNFX0hFQURTRVRfQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TRUNfU0VSVklDRV9BR19IQU5EU0ZSRUV9OwotCi1jb25zdCB0QlRBX1NFUlZJQ0VfSUQgYnRhX2FnX3N2Y19pZFtCVEFfQUdfTlVNX0lEWF0gPSB7QlRBX0hTUF9TRVJWSUNFX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRlBfU0VSVklDRV9JRH07Ci0KLWNvbnN0IHRCVEFfU0VSVklDRV9NQVNLIGJ0YV9hZ19zdmNfbWFza1tCVEFfQUdfTlVNX0lEWF0gPSB7Ci0gICAgQlRBX0hTUF9TRVJWSUNFX01BU0ssIEJUQV9IRlBfU0VSVklDRV9NQVNLfTsKLQotdHlwZWRlZiB2b2lkICgqdEJUQV9BR19BVENNRF9DQkFDSykodEJUQV9BR19TQ0IqIHBfc2NiLCB1aW50MTZfdCBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFyZ190eXBlLCBjaGFyKiBwX2FyZywgY2hhciogcF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGludF9hcmcpOwotCi1jb25zdCB0QlRBX0FHX0FUQ01EX0NCQUNLIGJ0YV9hZ19hdF9jYmFja190YmxbQlRBX0FHX05VTV9JRFhdID0gewotICAgIGJ0YV9hZ19hdF9oc3BfY2JhY2ssIGJ0YV9hZ19hdF9oZnBfY2JhY2t9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NiYWNrX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgb3BlbiBjYWxsYmFjayBldmVudCB0byBhcHBsaWNhdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19jYmFja19vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfU1RBVFVTIHN0YXR1cykgewotICB0QlRBX0FHX09QRU4gb3BlbiA9IHt9OwotCi0gIC8qIGNhbGwgYXBwIGNhbGxiYWNrIHdpdGggb3BlbiBldmVudCAqLwotICBvcGVuLmhkci5oYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7Ci0gIG9wZW4uaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7Ci0gIG9wZW4uc3RhdHVzID0gc3RhdHVzOwotICBvcGVuLnNlcnZpY2VfaWQgPSBidGFfYWdfc3ZjX2lkW3Bfc2NiLT5jb25uX3NlcnZpY2VdOwotICBvcGVuLmJkX2FkZHIgPSBiZF9hZGRyOwotCi0gICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19PUEVOX0VWVCwgKHRCVEFfQUcqKSZvcGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB2YWx1ZXMgb2YgdGhlIEFHIGNiIGFuZCBzZXRzIHVwCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBTRFAgcmVjb3JkIGZvciB0aGUgc2VydmljZXMuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19yZWdpc3Rlcih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiBpbml0aWFsaXplIGNvbnRyb2wgYmxvY2sgKi8KLSAgcF9zY2ItPnJlZ19zZXJ2aWNlcyA9IGRhdGEuYXBpX3JlZ2lzdGVyLnNlcnZpY2VzOwotICBwX3NjYi0+ZmVhdHVyZXMgPSBkYXRhLmFwaV9yZWdpc3Rlci5mZWF0dXJlczsKLSAgcF9zY2ItPm1hc2tlZF9mZWF0dXJlcyA9IGRhdGEuYXBpX3JlZ2lzdGVyLmZlYXR1cmVzOwotICBwX3NjYi0+YXBwX2lkID0gZGF0YS5hcGlfcmVnaXN0ZXIuYXBwX2lkOwotCi0gIC8qIGNyZWF0ZSBTRFAgcmVjb3JkcyAqLwotICBidGFfYWdfY3JlYXRlX3JlY29yZHMocF9zY2IsIGRhdGEpOwotCi0gIC8qIHN0YXJ0IFJGQ09NTSBzZXJ2ZXJzICovCi0gIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKLQotICAvKiBjYWxsIGFwcCBjYWxsYmFjayB3aXRoIHJlZ2lzdGVyIGV2ZW50ICovCi0gIHRCVEFfQUdfUkVHSVNURVIgcmVnID0ge307Ci0gIHJlZy5oZHIuaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwotICByZWcuaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7Ci0gIHJlZy5zdGF0dXMgPSBCVEFfQUdfU1VDQ0VTUzsKLSAgKCpidGFfYWdfY2IucF9jYmFjaykoQlRBX0FHX1JFR0lTVEVSX0VWVCwgKHRCVEFfQUcqKSZyZWcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgc2RwIHJlY29yZHMsIGNsb3NlcyB0aGUgUkZDT01NCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZlcnMsIGFuZCBkZWFsbG9jYXRlcyB0aGUgc2VydmljZSBjb250cm9sIGJsb2NrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfZGVyZWdpc3Rlcih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiBzZXQgZGVhbGxvYyAqLwotICBwX3NjYi0+ZGVhbGxvYyA9IHRydWU7Ci0KLSAgLyogcmVtb3ZlIHNkcCByZWNvcmRzICovCi0gIGJ0YV9hZ19kZWxfcmVjb3JkcyhwX3NjYik7Ci0KLSAgLyogcmVtb3ZlIHJmY29tbSBzZXJ2ZXJzICovCi0gIGJ0YV9hZ19jbG9zZV9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKLQotICAvKiBkZWFsbG9jICovCi0gIGJ0YV9hZ19zY2JfZGVhbGxvYyhwX3NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc3RhcnRfZGVyZWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IGEgZGVyZWdpc3RlciBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3N0YXJ0X2RlcmVnKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIC8qIHNldCBkZWFsbG9jICovCi0gIHBfc2NiLT5kZWFsbG9jID0gdHJ1ZTsKLQotICAvKiByZW1vdmUgc2RwIHJlY29yZHMgKi8KLSAgYnRhX2FnX2RlbF9yZWNvcmRzKHBfc2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zdGFydF9vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHN0YXJ0cyBhbiBBRyBvcGVuLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc3RhcnRfb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICBwX3NjYi0+cGVlcl9hZGRyID0gZGF0YS5hcGlfb3Blbi5iZF9hZGRyOwotICBwX3NjYi0+b3Blbl9zZXJ2aWNlcyA9IHBfc2NiLT5yZWdfc2VydmljZXM7Ci0KLSAgLyogQ2hlY2sgaWYgUkZDT01NIGhhcyBhbnkgaW5jb21pbmcgY29ubmVjdGlvbiB0byBhdm9pZCBjb2xsaXNpb24uICovCi0gIFJhd0FkZHJlc3MgcGVuZGluZ19iZF9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBpZiAoUE9SVF9Jc09wZW5pbmcoJnBlbmRpbmdfYmRfYWRkcikpIHsKLSAgICAvKiBMZXQgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gZ29lcyB0aHJvdWdoLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSXNzdWUgY29sbGlzaW9uIGZvciB0aGlzIHNjYiBmb3Igbm93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIHdpbGwgZGVjaWRlIHdoYXQgdG8gZG8gd2hlbiB3ZSBmaW5kIGluY29taW5nIGNvbm5ldGlvbiBsYXRlci4gKi8KLSAgICBidGFfYWdfY29sbGlzaW9uX2NiYWNrKEJUQV9TWVNfQ09OTl9PUEVOLCBCVEFfSURfQUcsIDAsIHBfc2NiLT5wZWVyX2FkZHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIGNsb3NlIHNlcnZlcnMgKi8KLSAgYnRhX2FnX2Nsb3NlX3NlcnZlcnMocF9zY2IsIHBfc2NiLT5yZWdfc2VydmljZXMpOwotCi0gIC8qIHNldCByb2xlICovCi0gIHBfc2NiLT5yb2xlID0gQlRBX0FHX0lOVDsKLQotICAvKiBkbyBzZXJ2aWNlIHNlYXJjaCAqLwotICBidGFfYWdfZG9fZGlzYyhwX3NjYiwgcF9zY2ItPm9wZW5fc2VydmljZXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2Rpc2NfaW50X3JlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGEgZGlzY292ZXJ5IHJlc3VsdCB3aGVuIGluaXRpYXRvci4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2Rpc2NfaW50X3Jlcyh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICB1aW50MTZfdCBldmVudCA9IEJUQV9BR19ESVNDX0ZBSUxfRVZUOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19kaXNjX2ludF9yZXM6IFN0YXR1czogJWQiLCBkYXRhLmRpc2NfcmVzdWx0LnN0YXR1cyk7Ci0KLSAgLyogaWYgZm91bmQgc2VydmljZSAqLwotICBpZiAoZGF0YS5kaXNjX3Jlc3VsdC5zdGF0dXMgPT0gU0RQX1NVQ0NFU1MgfHwKLSAgICAgIGRhdGEuZGlzY19yZXN1bHQuc3RhdHVzID09IFNEUF9EQl9GVUxMKSB7Ci0gICAgLyogZ2V0IGF0dHJpYnV0ZXMgKi8KLSAgICBpZiAoYnRhX2FnX3NkcF9maW5kX2F0dHIocF9zY2IsIHBfc2NiLT5vcGVuX3NlcnZpY2VzKSkgewotICAgICAgLyogc2V0IGNvbm5lY3RlZCBzZXJ2aWNlICovCi0gICAgICBwX3NjYi0+Y29ubl9zZXJ2aWNlID0gYnRhX2FnX3NlcnZpY2VfdG9faWR4KHBfc2NiLT5vcGVuX3NlcnZpY2VzKTsKLQotICAgICAgLyogc2VuZCBvdXJzZWx2ZXMgc2RwIG9rIGV2ZW50ICovCi0gICAgICBldmVudCA9IEJUQV9BR19ESVNDX09LX0VWVDsKLSAgICB9Ci0gIH0KLQotICAvKiBmcmVlIGRpc2NvdmVyeSBkYiAqLwotICBidGFfYWdfZnJlZV9kYihwX3NjYiwgZGF0YSk7Ci0KLSAgLyogaWYgc2VydmljZSBub3QgZm91bmQgY2hlY2sgaWYgd2Ugc2hvdWxkIHNlYXJjaCBmb3Igb3RoZXIgc2VydmljZSAqLwotICBpZiAoKGV2ZW50ID09IEJUQV9BR19ESVNDX0ZBSUxfRVZUKSAmJgotICAgICAgKGRhdGEuZGlzY19yZXN1bHQuc3RhdHVzID09IFNEUF9TVUNDRVNTIHx8Ci0gICAgICAgZGF0YS5kaXNjX3Jlc3VsdC5zdGF0dXMgPT0gU0RQX0RCX0ZVTEwgfHwKLSAgICAgICBkYXRhLmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfTk9fUkVDU19NQVRDSCkpIHsKLSAgICBpZiAoKHBfc2NiLT5vcGVuX3NlcnZpY2VzICYgQlRBX0hGUF9TRVJWSUNFX01BU0spICYmCi0gICAgICAgIChwX3NjYi0+b3Blbl9zZXJ2aWNlcyAmIEJUQV9IU1BfU0VSVklDRV9NQVNLKSkgewotICAgICAgLyogc2VhcmNoIGZvciBIU1AgKi8KLSAgICAgIHBfc2NiLT5vcGVuX3NlcnZpY2VzICY9IH5CVEFfSEZQX1NFUlZJQ0VfTUFTSzsKLSAgICAgIGJ0YV9hZ19kb19kaXNjKHBfc2NiLCBwX3NjYi0+b3Blbl9zZXJ2aWNlcyk7Ci0gICAgfSBlbHNlIGlmICgocF9zY2ItPm9wZW5fc2VydmljZXMgJiBCVEFfSFNQX1NFUlZJQ0VfTUFTSykgJiYKLSAgICAgICAgICAgICAgIChwX3NjYi0+aHNwX3ZlcnNpb24gPT0gSFNQX1ZFUlNJT05fMV8yKSkgewotICAgICAgLyogc2VhcmNoIGZvciBVVUlEX1NFUlZDTEFTU19IRUFEU0VUIGluc3RlYWQgKi8KLSAgICAgIHBfc2NiLT5oc3BfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMDsKLSAgICAgIGJ0YV9hZ19kb19kaXNjKHBfc2NiLCBwX3NjYi0+b3Blbl9zZXJ2aWNlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHNlbmQgb3Vyc2VsdmVzIHNkcCBvay9mYWlsIGV2ZW50ICovCi0gICAgICBidGFfYWdfc21fZXhlY3V0ZShwX3NjYiwgZXZlbnQsIGRhdGEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBzZW5kIG91cnNlbHZlcyBzZHAgb2svZmFpbCBldmVudCAqLwotICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBldmVudCwgZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19kaXNjX2FjcF9yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2NvdmVyeSByZXN1bHQgd2hlbiBhY2NlcHRvci4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2Rpc2NfYWNwX3Jlcyh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiBpZiBmb3VuZCBzZXJ2aWNlICovCi0gIGlmIChkYXRhLmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfU1VDQ0VTUyB8fAotICAgICAgZGF0YS5kaXNjX3Jlc3VsdC5zdGF0dXMgPT0gU0RQX0RCX0ZVTEwpIHsKLSAgICAvKiBnZXQgYXR0cmlidXRlcyAqLwotICAgIGJ0YV9hZ19zZHBfZmluZF9hdHRyKHBfc2NiLCBidGFfYWdfc3ZjX21hc2tbcF9zY2ItPmNvbm5fc2VydmljZV0pOwotICB9Ci0KLSAgLyogZnJlZSBkaXNjb3ZlcnkgZGIgKi8KLSAgYnRhX2FnX2ZyZWVfZGIocF9zY2IsIGRhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2Rpc2NfZmFpbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGEgZGlzY292ZXJ5IGZhaWx1cmUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19kaXNjX2ZhaWwodEJUQV9BR19TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiByZW9wZW4gcmVnaXN0ZXJlZCBzZXJ2ZXJzICovCi0gIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKLQotICAvKiByZWluaXRpYWxpemUgc3R1ZmYgKi8KLQotICAvKiBjbGVhciB0aGUgcmVtb3RlIEJEIGFkZHJlc3MgKi8KLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHIgPSBwX3NjYi0+cGVlcl9hZGRyOwotICBwX3NjYi0+cGVlcl9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotCi0gIC8qIGNhbGwgb3BlbiBjYmFjayB3LiBmYWlsdXJlICovCi0gIGJ0YV9hZ19jYmFja19vcGVuKHBfc2NiLCBwZWVyX2FkZHIsIEJUQV9BR19GQUlMX1NEUCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfb3Blbl9mYWlsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBvcGVuIGNvbm5lY3Rpb24gZmFpbGVkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfb3Blbl9mYWlsKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIC8qIGNhbGwgb3BlbiBjYmFjayB3LiBmYWlsdXJlICovCi0gIGJ0YV9hZ19jYmFja19vcGVuKHBfc2NiLCBkYXRhLmFwaV9vcGVuLmJkX2FkZHIsIEJUQV9BR19GQUlMX1JFU09VUkNFUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcmZjX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJGQ09NTSBjb25uZWN0aW9uIGZhaWxlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3JmY19mYWlsKHRCVEFfQUdfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIFJhd0FkZHJlc3MgcGVlcl9hZGRyID0gcF9zY2ItPnBlZXJfYWRkcjsKLSAgLyogcmVpbml0aWFsaXplIHN0dWZmICovCi0gIHBfc2NiLT5jb25uX2hhbmRsZSA9IDA7Ci0gIHBfc2NiLT5jb25uX3NlcnZpY2UgPSAwOwotICBwX3NjYi0+cGVlcl9mZWF0dXJlcyA9IDA7Ci0gIHBfc2NiLT5wZWVyX2NvZGVjcyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKLSAgcF9zY2ItPnNjb19jb2RlYyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKLSAgcF9zY2ItPnJvbGUgPSAwOwotICBwX3NjYi0+c3ZjX2Nvbm4gPSBmYWxzZTsKLSAgcF9zY2ItPmhzcF92ZXJzaW9uID0gSFNQX1ZFUlNJT05fMV8yOwotICAvKkNsZWFyIHRoZSBCRCBhZGRyZXNzKi8KLSAgcF9zY2ItPnBlZXJfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLQotICAvKiByZW9wZW4gcmVnaXN0ZXJlZCBzZXJ2ZXJzICovCi0gIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKLQotICAvKiBjYWxsIG9wZW4gY2JhY2sgdy4gZmFpbHVyZSAqLwotICBidGFfYWdfY2JhY2tfb3BlbihwX3NjYiwgcGVlcl9hZGRyLCBCVEFfQUdfRkFJTF9SRkNPTU0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIGNvbm5lY3Rpb24gY2xvc2VkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfcmZjX2Nsb3NlKHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgdEJUQV9BR19DTE9TRSBjbG9zZSA9IHt9OwotICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlczsKLSAgaW50IGksIG51bV9hY3RpdmVfY29ubiA9IDA7Ci0KLSAgLyogcmVpbml0aWFsaXplIHN0dWZmICovCi0gIHBfc2NiLT5jb25uX3NlcnZpY2UgPSAwOwotICBwX3NjYi0+cGVlcl9mZWF0dXJlcyA9IDA7Ci0gIHBfc2NiLT5tYXNrZWRfZmVhdHVyZXMgPSBwX3NjYi0+ZmVhdHVyZXM7Ci0gIHBfc2NiLT5wZWVyX2NvZGVjcyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKLSAgcF9zY2ItPnNjb19jb2RlYyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKLSAgLyogQ2xlYXIgdGhlc2UgZmxhZ3MgdXBvbiBTTEMgdGVhcmRvd24gKi8KLSAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSBmYWxzZTsKLSAgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrID0gZmFsc2U7Ci0gIHBfc2NiLT5jb2RlY19tc2JjX3NldHRpbmdzID0gQlRBX0FHX1NDT19NU0JDX1NFVFRJTkdTX1QyOwotICBwX3NjYi0+cm9sZSA9IDA7Ci0gIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOwotICBwX3NjYi0+c3ZjX2Nvbm4gPSBmYWxzZTsKLSAgcF9zY2ItPmhzcF92ZXJzaW9uID0gSFNQX1ZFUlNJT05fMV8yOwotICBidGFfYWdfYXRfcmVpbml0KCZwX3NjYi0+YXRfY2IpOwotCi0gIGZvciAoYXV0byYgcGVlcl9oZl9pbmRpY2F0b3IgOiBwX3NjYi0+cGVlcl9oZl9pbmRpY2F0b3JzKSB7Ci0gICAgcGVlcl9oZl9pbmRpY2F0b3IgPSB7fTsKLSAgfQotICBmb3IgKGF1dG8mIGxvY2FsX2hmX2luZGljYXRvciA6IHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzKSB7Ci0gICAgbG9jYWxfaGZfaW5kaWNhdG9yID0ge307Ci0gIH0KLQotICAvKiBzdG9wIHRpbWVycyAqLwotICBhbGFybV9jYW5jZWwocF9zY2ItPnJpbmdfdGltZXIpOwotICBhbGFybV9jYW5jZWwocF9zY2ItPmNvZGVjX25lZ290aWF0aW9uX3RpbWVyKTsKLQotICBjbG9zZS5oZHIuaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwotICBjbG9zZS5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKLSAgY2xvc2UuYmRfYWRkciA9IHBfc2NiLT5wZWVyX2FkZHI7Ci0KLSAgYnRhX3N5c19jb25uX2Nsb3NlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0KLSAgaWYgKGJ0YV9hZ19nZXRfYWN0aXZlX2RldmljZSgpID09IHBfc2NiLT5wZWVyX2FkZHIpIHsKLSAgICBidGFfY2xlYXJfYWN0aXZlX2RldmljZSgpOwotICB9Ci0KLSAgLyogY2FsbCBjbG9zZSBjYmFjayAqLwotICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShCVEFfQUdfQ0xPU0VfRVZULCAodEJUQV9BRyopJmNsb3NlKTsKLQotICAvKiBpZiBub3QgZGVyZWdpc3RlcmluZyAoZGVhbGxvY2F0aW5nKSByZW9wZW4gcmVnaXN0ZXJlZCBzZXJ2ZXJzICovCi0gIGlmICghcF9zY2ItPmRlYWxsb2MpIHsKLSAgICAvKiBDbGVhciBwZWVyIGJkX2FkZHIgc28gaW5zdGFuY2UgY2FuIGJlIHJldXNlZCAqLwotICAgIHBfc2NiLT5wZWVyX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0KLSAgICAvKiBzdGFydCBvbmx5IHVub3BlbmVkIHNlcnZlciAqLwotICAgIHNlcnZpY2VzID0gcF9zY2ItPnJlZ19zZXJ2aWNlczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFggJiYgc2VydmljZXMgIT0gMDsgaSsrKSB7Ci0gICAgICBpZiAocF9zY2ItPnNlcnZfaGFuZGxlW2ldKQotICAgICAgICBzZXJ2aWNlcyAmPSB+KCh0QlRBX1NFUlZJQ0VfTUFTSykxIDw8IChCVEFfSFNQX1NFUlZJQ0VfSUQgKyBpKSk7Ci0gICAgfQotICAgIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBzZXJ2aWNlcyk7Ci0KLSAgICBwX3NjYi0+Y29ubl9oYW5kbGUgPSAwOwotCi0gICAgLyogTWFrZSBzdXJlIFNDTyBzdGF0ZSBpcyBCVEFfQUdfU0NPX1NIVVRET1dOX1NUICovCi0gICAgYnRhX2FnX3Njb19zaHV0ZG93bihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotCi0gICAgLyogQ2hlY2sgaWYgYWxsIHRoZSBTTENzIGFyZSBkb3duICovCi0gICAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19NQVhfTlVNX0NMSUVOVFM7IGkrKykgewotICAgICAgaWYgKGJ0YV9hZ19jYi5zY2JbaV0uaW5fdXNlICYmIGJ0YV9hZ19jYi5zY2JbaV0uc3ZjX2Nvbm4pCi0gICAgICAgIG51bV9hY3RpdmVfY29ubisrOwotICAgIH0KLQotICAgIGlmICghbnVtX2FjdGl2ZV9jb25uKSB7Ci0gICAgICBidGFfc3lzX3Njb191bnVzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwotICAgIH0KLQotICB9Ci0gIC8qIGVsc2UgY2xvc2UgcG9ydCBhbmQgZGVhbGxvY2F0ZSBzY2IgKi8KLSAgZWxzZSB7Ci0gICAgUkZDT01NX1JlbW92ZVNlcnZlcihwX3NjYi0+Y29ubl9oYW5kbGUpOwotICAgIGJ0YV9hZ19zY2JfZGVhbGxvYyhwX3NjYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZmNfb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIFJGQ09NTSBjaGFubmVsIG9wZW4uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19yZmNfb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiBpbml0aWFsaXplIEFUIGZlYXR1cmUgdmFyaWFibGVzICovCi0gIHBfc2NiLT5jbGlwX2VuYWJsZWQgPSBmYWxzZTsKLSAgcF9zY2ItPmNjd2FfZW5hYmxlZCA9IGZhbHNlOwotICBwX3NjYi0+Y21lcl9lbmFibGVkID0gZmFsc2U7Ci0gIHBfc2NiLT5jbWVlX2VuYWJsZWQgPSBmYWxzZTsKLSAgcF9zY2ItPmluYmFuZF9lbmFibGVkID0KLSAgICAgICgocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfSU5CQU5EKSA9PSBCVEFfQUdfRkVBVF9JTkJBTkQpOwotICBpZiAocF9zY2ItPmNvbm5fc2VydmljZSA9PSBCVEFfQUdfSEZQKSB7Ci0gICAgc2l6ZV90IHZlcnNpb25fdmFsdWVfc2l6ZSA9IHNpemVvZihwX3NjYi0+cGVlcl92ZXJzaW9uKTsKLSAgICBpZiAoIWJ0aWZfY29uZmlnX2dldF9iaW4oCi0gICAgICAgICAgICBwX3NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCksIEhGUF9WRVJTSU9OX0NPTkZJR19LRVksCi0gICAgICAgICAgICAodWludDhfdCopJnBfc2NiLT5wZWVyX3ZlcnNpb24sICZ2ZXJzaW9uX3ZhbHVlX3NpemUpKSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBGYWlsZWQgcmVhZCBjYWNoZWQgcGVlciBIRlAgdmVyc2lvbiBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBwX3NjYi0+cGVlcl92ZXJzaW9uID0gSEZQX0hTUF9WRVJTSU9OX1VOS05PV047Ci0gICAgfQotICAgIHNpemVfdCBzZHBfZmVhdHVyZXNfc2l6ZSA9IHNpemVvZihwX3NjYi0+cGVlcl9zZHBfZmVhdHVyZXMpOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfYmluKAotICAgICAgICAgICAgcF9zY2ItPnBlZXJfYWRkci5Ub1N0cmluZygpLCBIRlBfU0RQX0ZFQVRVUkVTX0NPTkZJR19LRVksCi0gICAgICAgICAgICAodWludDhfdCopJnBfc2NiLT5wZWVyX3NkcF9mZWF0dXJlcywgJnNkcF9mZWF0dXJlc19zaXplKSkgewotICAgICAgYm9vbCBzZHBfd2JzX3N1cHBvcnQgPSBwX3NjYi0+cGVlcl9zZHBfZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9XQlNfU1VQUE9SVDsKLSAgICAgIGlmICghcF9zY2ItPnJlY2VpdmVkX2F0X2JhYyAmJiBzZHBfd2JzX3N1cHBvcnQpIHsKLSAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSB0cnVlOwotICAgICAgICBwX3NjYi0+cGVlcl9jb2RlY3MgPSBCVE1fU0NPX0NPREVDX0NWU0QgJiBCVE1fU0NPX0NPREVDX01TQkM7Ci0gICAgICAgIHBfc2NiLT5zY29fY29kZWMgPSBVVUlEX0NPREVDX01TQkM7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEZhaWxlZCByZWFkIGNhY2hlZCBwZWVyIEhGUCBTRFAgZmVhdHVyZXMgZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9zY2ItPnBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIC8qIHNldCB1cCBBVCBjb21tYW5kIGludGVycHJldGVyICovCi0gIHBfc2NiLT5hdF9jYi5wX2F0X3RibCA9IGJ0YV9hZ19hdF90YmxbcF9zY2ItPmNvbm5fc2VydmljZV07Ci0gIHBfc2NiLT5hdF9jYi5wX2NtZF9jYmFjayA9IGJ0YV9hZ19hdF9jYmFja190YmxbcF9zY2ItPmNvbm5fc2VydmljZV07Ci0gIHBfc2NiLT5hdF9jYi5wX2Vycl9jYmFjayA9IGJ0YV9hZ19hdF9lcnJfY2JhY2s7Ci0gIHBfc2NiLT5hdF9jYi5wX3VzZXIgPSBwX3NjYjsKLSAgcF9zY2ItPmF0X2NiLmNtZF9tYXhfbGVuID0gQlRBX0FHX0NNRF9NQVg7Ci0gIGJ0YV9hZ19hdF9pbml0KCZwX3NjYi0+YXRfY2IpOwotCi0gIGJ0YV9zeXNfY29ubl9vcGVuKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0KLSAgYnRhX2FnX2NiYWNrX29wZW4ocF9zY2IsIHBfc2NiLT5wZWVyX2FkZHIsIEJUQV9BR19TVUNDRVNTKTsKLQotICBpZiAocF9zY2ItPmNvbm5fc2VydmljZSA9PSBCVEFfQUdfSEZQKSB7Ci0gICAgLyogaWYgaGZwIHN0YXJ0IHRpbWVyIGZvciBzZXJ2aWNlIGxldmVsIGNvbm4gKi8KLSAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5yaW5nX3RpbWVyLCBwX2J0YV9hZ19jZmctPmNvbm5fdG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19TVkNfVElNRU9VVF9FVlQsIGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZWxzZSBzZXJ2aWNlIGxldmVsIGNvbm4gaXMgb3BlbiAqLwotICAgIGJ0YV9hZ19zdmNfY29ubl9vcGVuKHBfc2NiLCBkYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19hY3Bfb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIFJGQ09NTSBjaGFubmVsIG9wZW4gd2hlbiBhY2NlcHRpbmcgY29ubmVjdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3JmY19hY3Bfb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogc2Vydl9oYW5kbGUwID0gJWQgc2Vydl9oYW5kbGUgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zZXJ2X2hhbmRsZVswXSwgcF9zY2ItPnNlcnZfaGFuZGxlWzFdKTsKLSAgLyogc2V0IHJvbGUgKi8KLSAgcF9zY2ItPnJvbGUgPSBCVEFfQUdfQUNQOwotCi0gIC8qIGdldCBiZCBhZGRyIG9mIHBlZXIgKi8KLSAgdWludDE2X3QgbGNpZCA9IDA7Ci0gIFJhd0FkZHJlc3MgZGV2X2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIGludCBzdGF0dXMgPSBQT1JUX0NoZWNrQ29ubmVjdGlvbihkYXRhLnJmYy5wb3J0X2hhbmRsZSwgJmRldl9hZGRyLCAmbGNpZCk7Ci0gIGlmIChzdGF0dXMgIT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBQT1JUX0NoZWNrQ29ubmVjdGlvbiByZXR1cm5lZCAiIDw8IHN0YXR1czsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBDb2xsaXNpb24gSGFuZGxpbmcgKi8KLSAgZm9yICh0QlRBX0FHX1NDQiYgYWdfc2NiIDogYnRhX2FnX2NiLnNjYikgewotICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyBjb2xsaXNpb24gdGltZXJzCi0gICAgaWYgKGFnX3NjYi5pbl91c2UgJiYgYWxhcm1faXNfc2NoZWR1bGVkKGFnX3NjYi5jb2xsaXNpb25fdGltZXIpKSB7Ci0gICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGNhbmNlbCBjb2xsaXNpb24gYWxhcm0gZm9yICIKLSAgICAgICAgICAgICAgPDwgYWdfc2NiLnBlZXJfYWRkcjsKLSAgICAgIGFsYXJtX2NhbmNlbChhZ19zY2IuY29sbGlzaW9uX3RpbWVyKTsKLSAgICAgIGlmIChkZXZfYWRkciAhPSBhZ19zY2IucGVlcl9hZGRyICYmIHBfc2NiICE9ICZhZ19zY2IpIHsKLSAgICAgICAgLy8gUmVzdW1lIG91dGdvaW5nIGNvbm5lY3Rpb24gaWYgaW5jb21pbmcgaXMgbm90IG9uIHRoZSBzYW1lIGRldmljZQotICAgICAgICBidGFfYWdfcmVzdW1lX29wZW4oJmFnX3NjYik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChkZXZfYWRkciA9PSBhZ19zY2IucGVlcl9hZGRyICYmIHBfc2NiICE9ICZhZ19zY2IpIHsKLSAgICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogZmFpbCBvdXRnb2luZyBjb25uZWN0aW9uIGJlZm9yZSBhY2NlcHRpbmcgIgotICAgICAgICAgICAgICA8PCBhZ19zY2IucGVlcl9hZGRyOwotICAgICAgLy8gRmFpbCB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbiB0byBjbGVhbiB1cCBhbnkgdXBwZXIgbGF5ZXIgc3RhdGVzCi0gICAgICBidGFfYWdfcmZjX2ZhaWwoJmFnX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgLy8gSWYgY2xpZW50IHBvcnQgaXMgb3BlbmVkLCBjbG9zZSBpdAotICAgICAgaWYgKGFnX3NjYi5jb25uX2hhbmRsZSA+IDApIHsKLSAgICAgICAgc3RhdHVzID0gUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24oYWdfc2NiLmNvbm5faGFuZGxlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBQT1JUX1NVQ0NFU1MpIHsKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24gZmFpbGVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGRldl9hZGRyIDw8ICIsIGhhbmRsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGFnX3NjYi5jb25uX2hhbmRsZSkgPDwgIiwgZXJyb3IgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZfYWRkcj0iIDw8IGRldl9hZGRyCi0gICAgICAgICAgICA8PCAiLCBwZWVyX2FkZHI9IiA8PCBhZ19zY2IucGVlcl9hZGRyCi0gICAgICAgICAgICA8PCAiLCBpbl91c2U9IiA8PCBhZ19zY2IuaW5fdXNlCi0gICAgICAgICAgICA8PCAiLCBpbmRleD0iIDw8IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKLSAgfQotCi0gIHBfc2NiLT5wZWVyX2FkZHIgPSBkZXZfYWRkcjsKLQotICAvKiBkZXRlcm1pbmUgY29ubmVjdGVkIHNlcnZpY2UgZnJvbSBwb3J0IGhhbmRsZSAqLwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBCVEFfQUdfTlVNX0lEWDsgaSsrKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygKLSAgICAgICAgImJ0YV9hZ19yZmNfYWNwX29wZW46IGkgPSAlZCBzZXJ2X2hhbmRsZSA9ICVkIHBvcnRfaGFuZGxlID0gJWQiLCBpLAotICAgICAgICBwX3NjYi0+c2Vydl9oYW5kbGVbaV0sIGRhdGEucmZjLnBvcnRfaGFuZGxlKTsKLQotICAgIGlmIChwX3NjYi0+c2Vydl9oYW5kbGVbaV0gPT0gZGF0YS5yZmMucG9ydF9oYW5kbGUpIHsKLSAgICAgIHBfc2NiLT5jb25uX3NlcnZpY2UgPSBpOwotICAgICAgcF9zY2ItPmNvbm5faGFuZGxlID0gZGF0YS5yZmMucG9ydF9oYW5kbGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYWdfcmZjX2FjcF9vcGVuOiBjb25uX3NlcnZpY2UgPSAlZCBjb25uX2hhbmRsZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+Y29ubl9zZXJ2aWNlLCBwX3NjYi0+Y29ubl9oYW5kbGUpOwotCi0gIC8qIGNsb3NlIGFueSB1bm9wZW5lZCBzZXJ2ZXIgKi8KLSAgYnRhX2FnX2Nsb3NlX3NlcnZlcnMoCi0gICAgICBwX3NjYiwgKHBfc2NiLT5yZWdfc2VydmljZXMgJiB+YnRhX2FnX3N2Y19tYXNrW3Bfc2NiLT5jb25uX3NlcnZpY2VdKSk7Ci0KLSAgLyogZG8gc2VydmljZSBkaXNjb3ZlcnkgdG8gZ2V0IGZlYXR1cmVzICovCi0gIGJ0YV9hZ19kb19kaXNjKHBfc2NiLCBidGFfYWdfc3ZjX21hc2tbcF9zY2ItPmNvbm5fc2VydmljZV0pOwotCi0gIC8qIGNvbnRpbnVlIHdpdGggY29tbW9uIG9wZW4gcHJvY2Vzc2luZyAqLwotICBidGFfYWdfcmZjX29wZW4ocF9zY2IsIGRhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWFkIGFuZCBwcm9jZXNzIGRhdGEgZnJvbSBSRkNPTU0uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19yZmNfZGF0YSh0QlRBX0FHX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICB1aW50MTZfdCBsZW47Ci0gIGNoYXIgYnVmW0JUQV9BR19SRkNfUkVBRF9NQVhdID0gIiI7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogZG8gdGhlIGZvbGxvd2luZyAqLwotICBmb3IgKDs7KSB7Ci0gICAgLyogcmVhZCBkYXRhIGZyb20gcmZjb21tOyBpZiBiYWQgc3RhdHVzLCB3ZSdyZSBkb25lICovCi0gICAgaWYgKFBPUlRfUmVhZERhdGEocF9zY2ItPmNvbm5faGFuZGxlLCBidWYsIEJUQV9BR19SRkNfUkVBRF9NQVgsICZsZW4pICE9Ci0gICAgICAgIFBPUlRfU1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgdG8gcmVhZCBkYXRhICIgPDwgcF9zY2ItPnBlZXJfYWRkcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGlmIG5vIGRhdGEsIHdlJ3JlIGRvbmUgKi8KLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBubyBkYXRhIGZvciAiIDw8IHBfc2NiLT5wZWVyX2FkZHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBydW4gQVQgY29tbWFuZCBpbnRlcnByZXRlciBvbiBkYXRhICovCi0gICAgYnRhX3N5c19idXN5KEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0gICAgYnRhX2FnX2F0X3BhcnNlKCZwX3NjYi0+YXRfY2IsIGJ1ZiwgbGVuKTsKLSAgICBpZiAoKHBfc2NiLT5zY29faWR4ICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkgJiYKLSAgICAgICAgYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSkgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgY2hhbmdlIGxpbmsgcG9saWN5IGZvciBTQ08iLCBfX2Z1bmNfXyk7Ci0gICAgICBidGFfc3lzX3Njb19vcGVuKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ0YV9zeXNfaWRsZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwotICAgIH0KLQotICAgIC8qIG5vIG1vcmUgZGF0YSB0byByZWFkLCB3ZSdyZSBkb25lICovCi0gICAgaWYgKGxlbiA8IEJUQV9BR19SRkNfUkVBRF9NQVgpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3N0YXJ0X2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCB0aGUgcHJvY2VzcyBvZiBjbG9zaW5nIFNDTyBhbmQgUkZDT01NIGNvbm5lY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zdGFydF9jbG9zZSh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiBUYWtlIHRoZSBsaW5rIG91dCBvZiBzbmlmZiBhbmQgc2V0IEwyQyBpZGxlIHRpbWUgdG8gMCAqLwotICBidGFfZG1fcG1fYWN0aXZlKHBfc2NiLT5wZWVyX2FkZHIpOwotICBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIocF9zY2ItPnBlZXJfYWRkciwgMCwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0KLSAgLyogaWYgU0NPIGlzIG9wZW4gY2xvc2UgU0NPIGFuZCB3YWl0IG9uIFJGQ09NTSBjbG9zZSAqLwotICBpZiAoYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSkgewotICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19DTE9TRV9SRkM7Ci0gIH0gZWxzZSB7Ci0gICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7Ci0gICAgYnRhX2FnX3JmY19kb19jbG9zZShwX3NjYiwgZGF0YSk7Ci0gIH0KLQotICAvKiBhbHdheXMgZG8gU0NPIHNodXRkb3duIHRvIGhhbmRsZSBhbGwgU0NPIGNvcm5lciBjYXNlcyAqLwotICBidGFfYWdfc2NvX3NodXRkb3duKHBfc2NiLCBkYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19wb3N0X3Njb19vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQZXJmb3JtIHBvc3QtU0NPIG9wZW4gYWN0aW9uLCBpZiBhbnkKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3Bvc3Rfc2NvX29wZW4odEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgc3dpdGNoIChwX3NjYi0+cG9zdF9zY28pIHsKLSAgICBjYXNlIEJUQV9BR19QT1NUX1NDT19SSU5HOgotICAgICAgYnRhX2FnX3NlbmRfcmluZyhwX3NjYiwgZGF0YSk7Ci0gICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fTk9ORTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9DT05OOgotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUyk7Ci0gICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fTk9ORTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcG9zdF9zY29fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFBlcmZvcm0gcG9zdC1TQ08gY2xvc2UgYWN0aW9uLCBpZiBhbnkKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3Bvc3Rfc2NvX2Nsb3NlKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIHN3aXRjaCAocF9zY2ItPnBvc3Rfc2NvKSB7Ci0gICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0xPU0VfUkZDOgotICAgICAgYnRhX2FnX3JmY19kb19jbG9zZShwX3NjYiwgZGF0YSk7Ci0gICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fTk9ORTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9DT05OOgotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUyk7Ci0gICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fTk9ORTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9PUklHOgotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBCVEFfQUdfT1VUX0NBTExfT1JJR19SRVMpOwotICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX1BPU1RfU0NPX0NBTExfRU5EOgotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBCVEFfQUdfRU5EX0NBTExfUkVTKTsKLSAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19QT1NUX1NDT19DQUxMX0VORF9JTkNBTEw6Ci0gICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMocF9zY2IsIEJUQV9BR19FTkRfQ0FMTF9SRVMpOwotCi0gICAgICAvKiBTZW5kaW5nIGNhbGxzZXR1cCBJTkQgYW5kIFJpbmcgd2VyZSBkZWZlcmVkIHRvIGFmdGVyIFNDTyBjbG9zZS4gKi8KLSAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgQlRBX0FHX0lOX0NBTExfUkVTKTsKLQotICAgICAgaWYgKGJ0YV9hZ19pbmJhbmRfZW5hYmxlZChwX3NjYikgJiYKLSAgICAgICAgICAhKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkgewotICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fUklORzsKLSAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCBkYXRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOwotICAgICAgICBidGFfYWdfc2VuZF9yaW5nKHBfc2NiLCBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc3ZjX2Nvbm5fb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VydmljZSBsZXZlbCBjb25uZWN0aW9uIG9wZW5lZAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc3ZjX2Nvbm5fb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICB0QlRBX0FHX0NPTk4gZXZ0ID0ge307Ci0KLSAgaWYgKCFwX3NjYi0+c3ZjX2Nvbm4pIHsKLSAgICAvKiBzZXQgc3RhdGUgdmFyaWFibGUgKi8KLSAgICBwX3NjYi0+c3ZjX2Nvbm4gPSB0cnVlOwotCi0gICAgLyogQ2xlYXIgQVQrQklBIG1hc2sgZnJvbSBwcmV2aW91cyBTTEMgaWYgYW55LiAqLwotICAgIHBfc2NiLT5iaWFfbWFza2VkX291dCA9IDA7Ci0KLSAgICBhbGFybV9jYW5jZWwocF9zY2ItPnJpbmdfdGltZXIpOwotCi0gICAgLyogY2FsbCBjYWxsYmFjayAqLwotICAgIGV2dC5oZHIuaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwotICAgIGV2dC5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKLSAgICBldnQucGVlcl9mZWF0ID0gcF9zY2ItPnBlZXJfZmVhdHVyZXM7Ci0gICAgZXZ0LmJkX2FkZHIgPSBwX3NjYi0+cGVlcl9hZGRyOwotICAgIGV2dC5wZWVyX2NvZGVjID0gcF9zY2ItPnBlZXJfY29kZWNzOwotCi0gICAgaWYgKChwX3NjYi0+Y2FsbF9pbmQgIT0gQlRBX0FHX0NBTExfSU5BQ1RJVkUpIHx8Ci0gICAgICAgIChwX3NjYi0+Y2FsbHNldHVwX2luZCAhPSBCVEFfQUdfQ0FMTFNFVFVQX05PTkUpKSB7Ci0gICAgICBidGFfc3lzX3Njb191c2UoQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKLSAgICB9Ci0gICAgaWYgKGJ0YV9hZ19nZXRfYWN0aXZlX2RldmljZSgpLklzRW1wdHkoKSkgewotICAgICAgYnRhX2FnX2FwaV9zZXRfYWN0aXZlX2RldmljZShwX3NjYi0+cGVlcl9hZGRyKTsKLSAgICB9Ci0gICAgKCpidGFfYWdfY2IucF9jYmFjaykoQlRBX0FHX0NPTk5fRVZULCAodEJUQV9BRyopJmV2dCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZXRjb2RlYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIEFQSSBTZXRDb2RlYwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2V0Y29kZWModEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgdEJUQV9BR19QRUVSX0NPREVDIGNvZGVjX3R5cGUgPSBkYXRhLmFwaV9zZXRjb2RlYy5jb2RlYzsKLSAgdEJUQV9BR19WQUwgdmFsID0ge307Ci0gIHZhbC5oZHIuaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwotCi0gIC8qIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgY29kZWMgdHlwZSBpcyB2YWxpZCAqLwotICBpZiAoKGNvZGVjX3R5cGUgIT0gQlRNX1NDT19DT0RFQ19OT05FKSAmJgotICAgICAgKGNvZGVjX3R5cGUgIT0gQlRNX1NDT19DT0RFQ19DVlNEKSAmJgotICAgICAgKGNvZGVjX3R5cGUgIT0gQlRNX1NDT19DT0RFQ19NU0JDKSkgewotICAgIHZhbC5udW0gPSBjb2RlY190eXBlOwotICAgIHZhbC5oZHIuc3RhdHVzID0gQlRBX0FHX0ZBSUxfUkVTT1VSQ0VTOwotICAgIEFQUExfVFJBQ0VfRVJST1IoImJ0YV9hZ19zZXRjb2RlYyBlcnJvcjogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlKTsKLSAgICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShCVEFfQUdfV0JTX0VWVCwgKHRCVEFfQUcqKSZ2YWwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICgocF9zY2ItPnBlZXJfY29kZWNzICYgY29kZWNfdHlwZSkgfHwgKGNvZGVjX3R5cGUgPT0gQlRNX1NDT19DT0RFQ19OT05FKSB8fAotICAgICAgKGNvZGVjX3R5cGUgPT0gQlRNX1NDT19DT0RFQ19DVlNEKSkgewotICAgIHBfc2NiLT5zY29fY29kZWMgPSBjb2RlY190eXBlOwotICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gdHJ1ZTsKLSAgICB2YWwubnVtID0gY29kZWNfdHlwZTsKLSAgICB2YWwuaGRyLnN0YXR1cyA9IEJUQV9BR19TVUNDRVNTOwotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19zZXRjb2RlYzogVXBkYXRlZCBjb2RlYyB0eXBlICVkIiwgY29kZWNfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFsLm51bSA9IGNvZGVjX3R5cGU7Ci0gICAgdmFsLmhkci5zdGF0dXMgPSBCVEFfQUdfRkFJTF9SRVNPVVJDRVM7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiYnRhX2FnX3NldGNvZGVjIGVycm9yOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUpOwotICB9Ci0KLSAgKCpidGFfYWdfY2IucF9jYmFjaykoQlRBX0FHX1dCU19FVlQsICh0QlRBX0FHKikmdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2FnX2NvbGxpc2lvbl90aW1lcl9jYmFjayh2b2lkKiBkYXRhKSB7Ci0gIGlmIChkYXRhID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGRhdGEgc2hvdWxkIG5ldmVyIGJlIG51bGwgaW4gYSB0aW1lciBjYWxsYmFjayI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIElmIHRoZSBwZWVyIGhhdmVuJ3Qgb3BlbmVkIEFHIGNvbm5lY3Rpb24gICAgICovCi0gIC8qIHdlIHdpbGwgcmVzdGFydCBvcGVuaW5nIHByb2Nlc3MuICAgICAgICAgICAgICovCi0gIGJ0YV9hZ19yZXN1bWVfb3BlbihzdGF0aWNfY2FzdDx0QlRBX0FHX1NDQio+KGRhdGEpKTsKLX0KLQotdm9pZCBidGFfYWdfaGFuZGxlX2NvbGxpc2lvbih0QlRBX0FHX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICAvKiBDYW5jZWwgU0RQIGlmIGl0IGhhZCBiZWVuIHN0YXJ0ZWQuICovCi0gIGlmIChwX3NjYi0+cF9kaXNjX2RiKSB7Ci0gICAgU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2gocF9zY2ItPnBfZGlzY19kYik7Ci0gICAgYnRhX2FnX2ZyZWVfZGIocF9zY2IsIHRCVEFfQUdfREFUQTo6a0VtcHR5KTsKLSAgfQotCi0gIC8qIHJlb3BlbiByZWdpc3RlcmVkIHNlcnZlcnMgKi8KLSAgLyogQ29sbGlzaW9uIG1heSBiZSBkZXRlY3RlZCBiZWZvcmUgb3IgYWZ0ZXIgd2UgY2xvc2Ugc2VydmVycy4gKi8KLSAgaWYgKGJ0YV9hZ19pc19zZXJ2ZXJfY2xvc2VkKHBfc2NiKSkgewotICAgIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKLSAgfQotCi0gIC8qIFN0YXJ0IHRpbWVyIHRvIGhhbiAqLwotICBhbGFybV9zZXRfb25fbWxvb3AocF9zY2ItPmNvbGxpc2lvbl90aW1lciwgQlRBX0FHX0NPTExJU0lPTl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NvbGxpc2lvbl90aW1lcl9jYmFjaywgcF9zY2IpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19hcGkuY2MgYi9idGEvYWcvYnRhX2FnX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0NzljYi4uMDAwMDAwMAotLS0gYS9idGEvYWcvYnRhX2FnX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZm9yIHRoZSBhdWRpbyBnYXRld2F5IChBRykKLSAqICBzdWJzeXN0ZW0gb2YgQlRBLCBCcm9hZGNvbSdzIEJsdWV0b290aCBhcHBsaWNhdGlvbiBsYXllciBmb3IgbW9iaWxlCi0gKiAgcGhvbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYWdfYXBpLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRhL2FnL2J0YV9hZ19pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgLy8gZG9faW5fbWFpbl90aHJlYWQKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY29uc3QgdEJUQV9TWVNfUkVHIGJ0YV9hZ19yZWcgPSB7YnRhX2FnX2hkbF9ldmVudCwgQlRBX0FnRGlzYWJsZX07Ci1jb25zdCB0QlRBX0FHX1JFU19EQVRBIHRCVEFfQUdfUkVTX0RBVEE6OmtFbXB0eSA9IHt9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnRW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGUgdGhlIGF1ZGlvIGdhdGV3YXkgc2VydmljZS4gV2hlbiB0aGUgZW5hYmxlCi0gKiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQgd2l0aCBhIEJUQV9BR19FTkFCTEVfRVZULiBUaGlzIGZ1bmN0aW9uIG11c3QKLSAqICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBmdW5jdGlvbiBpbiB0aGUgQUcgQVBJIGFyZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiBPSywgQlRBX0ZBSUxVUkUgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX1NUQVRVUyBCVEFfQWdFbmFibGUodEJUQV9BR19DQkFDSyogcF9jYmFjaykgewotICAvKiBFcnJvciBpZiBBRyBpcyBhbHJlYWR5IGVuYWJsZWQsIG9yIEFHIGlzIGluIHRoZSBtaWRkbGUgb2YgZGlzYWJsaW5nLiAqLwotICBmb3IgKGNvbnN0IHRCVEFfQUdfU0NCJiBzY2IgOiBidGFfYWdfY2Iuc2NiKSB7Ci0gICAgaWYgKHNjYi5pbl91c2UpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIkJUQV9BZ0VuYWJsZTogRkFJTEVELCBBRyBhbHJlYWR5IGVuYWJsZWQuIik7Ci0gICAgICByZXR1cm4gQlRBX0ZBSUxVUkU7Ci0gICAgfQotICB9Ci0gIGJ0YV9zeXNfcmVnaXN0ZXIoQlRBX0lEX0FHLCAmYnRhX2FnX3JlZyk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2FnX2FwaV9lbmFibGUsIHBfY2JhY2spKTsKLSAgcmV0dXJuIEJUQV9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzYWJsZSB0aGUgYXVkaW8gZ2F0ZXdheSBzZXJ2aWNlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ0Rpc2FibGUoKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2FnX2FwaV9kaXNhYmxlKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXIgYW4gQXVkaW8gR2F0ZXdheSBzZXJ2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdSZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywgdEJUQV9BR19GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHNlcnZpY2VfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2FnX2FwaV9yZWdpc3Rlciwgc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcywgc2VydmljZV9uYW1lcywgYXBwX2lkKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdEZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZXJlZ2lzdGVyIGFuIGF1ZGlvIGdhdGV3YXkgc2VydmljZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnRGVyZWdpc3Rlcih1aW50MTZfdCBoYW5kbGUpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0YV9hZ19zbV9leGVjdXRlX2J5X2hhbmRsZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BUElfREVSRUdJU1RFUl9FVlQsIHRCVEFfQUdfREFUQTo6a0VtcHR5KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVucyBhIGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0IG9yIGhhbmRzLWZyZWUgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBXaGVuIGNvbm5lY3Rpb24gaXMgb3BlbiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIEJUQV9BR19PUEVOX0VWVC4gT25seSB0aGUgZGF0YSBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5lZC4gVGhlIGF1ZGlvIGNvbm5lY3Rpb24gaXMgbm90IG9wZW5lZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnT3Blbih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUQV9BR19EQVRBIGRhdGEgPSB7fTsKLSAgZGF0YS5hcGlfb3Blbi5iZF9hZGRyID0gYmRfYWRkcjsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGFfYWdfc21fZXhlY3V0ZV9ieV9oYW5kbGUsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BUElfT1BFTl9FVlQsIGRhdGEpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIHRvIGEgaGVhZHNldCBvciBhIGhhbmRzZnJlZQotICogICAgICAgICAgICAgICAgICBBbnkgY3VycmVudCBhdWRpbyBjb25uZWN0aW9uIHdpbGwgYWxzbyBiZSBjbG9zZWQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ0Nsb3NlKHVpbnQxNl90IGhhbmRsZSkgewotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0YV9hZ19zbV9leGVjdXRlX2J5X2hhbmRsZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BUElfQ0xPU0VfRVZULCB0QlRBX0FHX0RBVEE6OmtFbXB0eSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQXVkaW9PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVucyBhbiBhdWRpbyBjb25uZWN0aW9uIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIGhlYWRzZXQgb3IgaG5hZHNmcmVlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdBdWRpb09wZW4odWludDE2X3QgaGFuZGxlKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGFfYWdfc21fZXhlY3V0ZV9ieV9oYW5kbGUsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVBJX0FVRElPX09QRU5fRVZULCB0QlRBX0FHX0RBVEE6OmtFbXB0eSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQXVkaW9DbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgYXVkaW8gY29ubmVjdGlvbiB0byBhIGhlYWRzZXQKLSAqICAgICAgICAgICAgICAgICAgb3IgaG5hZHNmcmVlLiBUaGUgZGF0YSBjb25uZWN0aW9uIHJlbWFpbnMgb3BlbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdBdWRpb0Nsb3NlKHVpbnQxNl90IGhhbmRsZSkgewotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2FnX3NtX2V4ZWN1dGVfYnlfaGFuZGxlLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FQSV9BVURJT19DTE9TRV9FVlQsIHRCVEFfQUdfREFUQTo6a0VtcHR5KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdSZXN1bHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gQVQgcmVzdWx0IGNvZGUgdG8gYSBoZWFkc2V0IG9yIGhhbmRzLWZyZWUgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBBRyBwYXJzZSBtb2RlIGlzIHNldAotICogICAgICAgICAgICAgICAgICB0byBCVEFfQUdfUEFSU0UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ1Jlc3VsdCh1aW50MTZfdCBoYW5kbGUsIHRCVEFfQUdfUkVTIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfUkVTX0RBVEEmIGRhdGEpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZidGFfYWdfYXBpX3Jlc3VsdCwgaGFuZGxlLCByZXN1bHQsIGRhdGEpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ1NldENvZGVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTcGVjaWZ5IHRoZSBjb2RlYyB0eXBlIHRvIGJlIHVzZWQgZm9yIHRoZSBzdWJzZXF1ZW50Ci0gKiAgICAgICAgICAgICAgICAgIGF1ZGlvIGNvbm5lY3Rpb24uCi0gKgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdTZXRDb2RlYyh1aW50MTZfdCBoYW5kbGUsIHRCVEFfQUdfUEVFUl9DT0RFQyBjb2RlYykgewotICB0QlRBX0FHX0RBVEEgZGF0YSA9IHt9OwotICBkYXRhLmFwaV9zZXRjb2RlYy5jb2RlYyA9IGNvZGVjOwotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0YV9hZ19zbV9leGVjdXRlX2J5X2hhbmRsZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FQSV9TRVRDT0RFQ19FVlQsIGRhdGEpKTsKLX0KLQotdm9pZCBCVEFfQWdTZXRTY29BbGxvd2VkKGJvb2wgdmFsdWUpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGFfYWdfc2V0X3Njb19hbGxvd2VkLCB2YWx1ZSkpOwotfQotCi12b2lkIEJUQV9BZ1NldEFjdGl2ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhY3RpdmVfZGV2aWNlX2FkZHIpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0YV9hZ19hcGlfc2V0X2FjdGl2ZV9kZXZpY2UsIGFjdGl2ZV9kZXZpY2VfYWRkcikpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19hdC5jYyBiL2J0YS9hZy9idGFfYWdfYXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2E2NGIuLjAwMDAwMDAKLS0tIGEvYnRhL2FnL2J0YV9hZ19hdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEJUQSBBRyBBVCBjb21tYW5kIGludGVycHJldGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExPR19UQUcgImJ0YV9hZ19hdCIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb246Ci0KLSNpbmNsdWRlICJidGEvYWcvYnRhX2FnX2F0LmgiCi0jaW5jbHVkZSAiYnRhL2FnL2J0YV9hZ19pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS91dGwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemUgdGhlIEFUIGNvbW1hbmQgcGFyc2VyIGNvbnRyb2wgYmxvY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2F0X2luaXQodEJUQV9BR19BVF9DQiogcF9jYikgewotICBwX2NiLT5wX2NtZF9idWYgPSBudWxscHRyOwotICBwX2NiLT5jbWRfcG9zID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X3JlaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmUtaW5pdGlhbGl6ZSB0aGUgQVQgY29tbWFuZCBwYXJzZXIgY29udHJvbCBibG9jay4gIFRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXRzIHRoZSBBVCBjb21tYW5kIHBhcnNlciBzdGF0ZSBhbmQgZnJlZXMKLSAqICAgICAgICAgICAgICAgICAgYW55IEdLSSBidWZmZXIuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2F0X3JlaW5pdCh0QlRBX0FHX0FUX0NCKiBwX2NiKSB7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2NiLT5wX2NtZF9idWYpOwotICBwX2NiLT5jbWRfcG9zID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Byb2Nlc3NfYXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFBhcnNlIEFUIGNvbW1hbmRzLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIGlucHV0Ci0gKiAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmcgYW5kIHBhcnNlIGl0IGZvciBBVCBjb21tYW5kcyBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIEFUIGNvbW1hbmQgdGFibGUgcGFzc2VkIGluIHRoZSBjb250cm9sIGJsb2NrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19wcm9jZXNzX2F0KHRCVEFfQUdfQVRfQ0IqIHBfY2IsIGNoYXIqIHBfZW5kKSB7Ci0gIHVpbnQxNl90IGlkeDsKLSAgdWludDhfdCBhcmdfdHlwZTsKLSAgY2hhciogcF9hcmc7Ci0gIGludDE2X3QgaW50X2FyZyA9IDA7Ci0gIC8qIGxvb3AgdGhyb3VnaCBhdCBjb21tYW5kIHRhYmxlIGxvb2tpbmcgZm9yIG1hdGNoICovCi0gIGZvciAoaWR4ID0gMDsgcF9jYi0+cF9hdF90YmxbaWR4XS5wX2NtZFswXSAhPSAwOyBpZHgrKykgewotICAgIGlmICghdXRsX3N0cnVjbXAocF9jYi0+cF9hdF90YmxbaWR4XS5wX2NtZCwgcF9jYi0+cF9jbWRfYnVmKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyogaWYgdGhlcmUgaXMgYSBtYXRjaDsgdmVyaWZ5IGFyZ3VtZW50IHR5cGUgKi8KLSAgaWYgKHBfY2ItPnBfYXRfdGJsW2lkeF0ucF9jbWRbMF0gIT0gMCkgewotICAgIC8qIHN0YXJ0IG9mIGFyZ3VtZW50IGlzIHAgKyBzdHJsZW4gbWF0Y2hpbmcgY29tbWFuZCAqLwotICAgIHBfYXJnID0gcF9jYi0+cF9jbWRfYnVmICsgc3RybGVuKHBfY2ItPnBfYXRfdGJsW2lkeF0ucF9jbWQpOwotICAgIGlmIChwX2FyZyA+IHBfZW5kKSB7Ci0gICAgICAoKnBfY2ItPnBfZXJyX2NiYWNrKSgodEJUQV9BR19TQ0IqKXBfY2ItPnBfdXNlciwgZmFsc2UsIG51bGxwdHIpOwotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTI4NjA0ODciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBpZiBubyBhcmd1bWVudCAqLwotICAgIGlmIChwX2FyZ1swXSA9PSAwKSB7Ci0gICAgICBhcmdfdHlwZSA9IEJUQV9BR19BVF9OT05FOwotICAgIH0KLSAgICAvKiBlbHNlIGlmIGFyZyBpcyAnPycgYW5kIGl0IGlzIGxhc3QgY2hhcmFjdGVyICovCi0gICAgZWxzZSBpZiAocF9hcmdbMF0gPT0gJz8nICYmIHBfYXJnWzFdID09IDApIHsKLSAgICAgIC8qIHdlIGhhdmUgYSByZWFkICovCi0gICAgICBhcmdfdHlwZSA9IEJUQV9BR19BVF9SRUFEOwotICAgIH0KLSAgICAvKiBlbHNlIGlmIGFyZyBpcyAnPScgKi8KLSAgICBlbHNlIGlmIChwX2FyZ1swXSA9PSAnPScgJiYgcF9hcmdbMV0gIT0gMCkgewotICAgICAgaWYgKHBfYXJnWzFdID09ICc/JyAmJiBwX2FyZ1syXSA9PSAwKSB7Ci0gICAgICAgIC8qIHdlIGhhdmUgYSB0ZXN0ICovCi0gICAgICAgIGFyZ190eXBlID0gQlRBX0FHX0FUX1RFU1Q7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiB3ZSBoYXZlIGEgc2V0ICovCi0gICAgICAgIGFyZ190eXBlID0gQlRBX0FHX0FUX1NFVDsKLQotICAgICAgICAvKiBza2lwIHBhc3QgJz0nICovCi0gICAgICAgIHBfYXJnKys7Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgLyogZWxzZSBpdCBpcyBmcmVlZm9ybSBhcmd1bWVudCAqLwotICAgIHsKLSAgICAgIGFyZ190eXBlID0gQlRBX0FHX0FUX0ZSRUU7Ci0gICAgfQotCi0gICAgLyogaWYgYXJndW1lbnRzIG1hdGNoIGNvbW1hbmQgY2FwYWJpbGl0aWVzICovCi0gICAgaWYgKChhcmdfdHlwZSAmIHBfY2ItPnBfYXRfdGJsW2lkeF0uYXJnX3R5cGUpICE9IDApIHsKLSAgICAgIC8qIGlmIGl0J3MgYSBzZXQgaW50ZWdlciBjaGVjayBtYXgsIG1pbiByYW5nZSAqLwotICAgICAgaWYgKGFyZ190eXBlID09IEJUQV9BR19BVF9TRVQgJiYKLSAgICAgICAgICBwX2NiLT5wX2F0X3RibFtpZHhdLmZtdCA9PSBCVEFfQUdfQVRfSU5UKSB7Ci0gICAgICAgIGludF9hcmcgPSB1dGxfc3RyMmludChwX2FyZyk7Ci0gICAgICAgIGlmIChpbnRfYXJnIDwgKGludDE2X3QpcF9jYi0+cF9hdF90YmxbaWR4XS5taW4gfHwKLSAgICAgICAgICAgIGludF9hcmcgPiAoaW50MTZfdClwX2NiLT5wX2F0X3RibFtpZHhdLm1heCkgewotICAgICAgICAgIC8qIGFyZyBvdXQgb2YgcmFuZ2U7IGVycm9yICovCi0gICAgICAgICAgTE9HX1dBUk4oImFyZyBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAoKnBfY2ItPnBfZXJyX2NiYWNrKSgodEJUQV9BR19TQ0IqKXBfY2ItPnBfdXNlciwgZmFsc2UsIG51bGxwdHIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICgqcF9jYi0+cF9jbWRfY2JhY2spKCh0QlRBX0FHX1NDQiopcF9jYi0+cF91c2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnBfYXRfdGJsW2lkeF0uY29tbWFuZF9pZCwgYXJnX3R5cGUsIHBfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5kLCBpbnRfYXJnKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKCpwX2NiLT5wX2NtZF9jYmFjaykoKHRCVEFfQUdfU0NCKilwX2NiLT5wX3VzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnBfYXRfdGJsW2lkeF0uY29tbWFuZF9pZCwgYXJnX3R5cGUsIHBfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuZCwgaW50X2FyZyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGVsc2UgZXJyb3IgKi8KLSAgICAgIExPR19XQVJOKCJJbmNvbWluZyBhcmcgdHlwZSAweCV4IGRvZXMgbm90IG1hdGNoIGNtZCBhcmcgdHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgIGFyZ190eXBlLCBwX2NiLT5wX2F0X3RibFtpZHhdLmFyZ190eXBlKTsKLSAgICAgICgqcF9jYi0+cF9lcnJfY2JhY2spKCh0QlRBX0FHX1NDQiopcF9jYi0+cF91c2VyLCBmYWxzZSwgbnVsbHB0cik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGVsc2Ugbm8gbWF0Y2ggY2FsbCBlcnJvciBjYWxsYmFjayAqLwotICAgIExPR19XQVJOKCJVbm1hdGNoZWQgY29tbWFuZCBpbmRleCAlZCIsIGlkeCk7Ci0gICAgKCpwX2NiLT5wX2Vycl9jYmFjaykoKHRCVEFfQUdfU0NCKilwX2NiLT5wX3VzZXIsIHRydWUsIHBfY2ItPnBfY21kX2J1Zik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X3BhcnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQYXJzZSBBVCBjb21tYW5kcy4gIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBpbnB1dAotICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nIGFuZCBwYXJzZSBpdCBmb3IgQVQgY29tbWFuZHMgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBBVCBjb21tYW5kIHRhYmxlIHBhc3NlZCBpbiB0aGUgY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfYXRfcGFyc2UodEJUQV9BR19BVF9DQiogcF9jYiwgY2hhciogcF9idWYsIHVpbnQxNl90IGxlbikgewotICBpbnQgaSA9IDA7Ci0gIGNoYXIqIHBfc2F2ZTsKLQotICBpZiAocF9jYi0+cF9jbWRfYnVmID09IG51bGxwdHIpIHsKLSAgICBwX2NiLT5wX2NtZF9idWYgPSAoY2hhciopb3NpX21hbGxvYyhwX2NiLT5jbWRfbWF4X2xlbik7Ci0gICAgcF9jYi0+Y21kX3BvcyA9IDA7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOykgewotICAgIHdoaWxlIChwX2NiLT5jbWRfcG9zIDwgcF9jYi0+Y21kX21heF9sZW4gLSAxICYmIGkgPCBsZW4pIHsKLSAgICAgIC8qIFNraXAgbnVsbCBjaGFyYWN0ZXJzIGJldHdlZW4gQVQgY29tbWFuZHMuICovCi0gICAgICBpZiAoKHBfY2ItPmNtZF9wb3MgPT0gMCkgJiYgKHBfYnVmW2ldID09IDApKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHBfY2ItPnBfY21kX2J1ZltwX2NiLT5jbWRfcG9zXSA9IHBfYnVmW2krK107Ci0gICAgICBpZiAocF9jYi0+cF9jbWRfYnVmW3BfY2ItPmNtZF9wb3NdID09ICdccicgfHwKLSAgICAgICAgICBwX2NiLT5wX2NtZF9idWZbcF9jYi0+Y21kX3Bvc10gPT0gJ1xuJykgewotICAgICAgICBwX2NiLT5wX2NtZF9idWZbcF9jYi0+Y21kX3Bvc10gPSAwOwotICAgICAgICBpZiAoKHBfY2ItPmNtZF9wb3MgPiAyKSAmJgotICAgICAgICAgICAgKHBfY2ItPnBfY21kX2J1ZlswXSA9PSAnQScgfHwgcF9jYi0+cF9jbWRfYnVmWzBdID09ICdhJykgJiYKLSAgICAgICAgICAgIChwX2NiLT5wX2NtZF9idWZbMV0gPT0gJ1QnIHx8IHBfY2ItPnBfY21kX2J1ZlsxXSA9PSAndCcpKSB7Ci0gICAgICAgICAgcF9zYXZlID0gcF9jYi0+cF9jbWRfYnVmOwotICAgICAgICAgIGNoYXIqIHBfZW5kID0gcF9jYi0+cF9jbWRfYnVmICsgcF9jYi0+Y21kX3BvczsKLSAgICAgICAgICBwX2NiLT5wX2NtZF9idWYgKz0gMjsKLSAgICAgICAgICBidGFfYWdfcHJvY2Vzc19hdChwX2NiLCBwX2VuZCk7Ci0gICAgICAgICAgcF9jYi0+cF9jbWRfYnVmID0gcF9zYXZlOwotICAgICAgICB9Ci0KLSAgICAgICAgcF9jYi0+Y21kX3BvcyA9IDA7Ci0KLSAgICAgIH0gZWxzZSBpZiAocF9jYi0+cF9jbWRfYnVmW3BfY2ItPmNtZF9wb3NdID09IDB4MUEgfHwKLSAgICAgICAgICAgICAgICAgcF9jYi0+cF9jbWRfYnVmW3BfY2ItPmNtZF9wb3NdID09IDB4MUIpIHsKLSAgICAgICAgcF9jYi0+cF9jbWRfYnVmWysrcF9jYi0+Y21kX3Bvc10gPSAwOwotICAgICAgICAoKnBfY2ItPnBfZXJyX2NiYWNrKSgodEJUQV9BR19TQ0IqKXBfY2ItPnBfdXNlciwgdHJ1ZSwgcF9jYi0+cF9jbWRfYnVmKTsKLSAgICAgICAgcF9jYi0+Y21kX3BvcyA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICArK3BfY2ItPmNtZF9wb3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGkgPCBsZW4pIHBfY2ItPmNtZF9wb3MgPSAwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX2F0LmggYi9idGEvYWcvYnRhX2FnX2F0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjRlMTkuLjAwMDAwMDAKLS0tIGEvYnRhL2FnL2J0YV9hZ19hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgSW50ZXJmYWNlIGZpbGUgZm9yIEJUQSBBRyBBVCBjb21tYW5kIGludGVycHJldGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9BR19BVF9ICi0jZGVmaW5lIEJUQV9BR19BVF9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFUIGNvbW1hbmQgYXJndW1lbnQgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEJUQV9BR19BVF9OT05FIDB4MDEgLyogbm8gYXJndW1lbnQgKi8KLSNkZWZpbmUgQlRBX0FHX0FUX1NFVCAweDAyICAvKiBzZXQgdmFsdWUgKi8KLSNkZWZpbmUgQlRBX0FHX0FUX1JFQUQgMHgwNCAvKiByZWFkIHZhbHVlICovCi0jZGVmaW5lIEJUQV9BR19BVF9URVNUIDB4MDggLyogdGVzdCB2YWx1ZSByYW5nZSAqLwotI2RlZmluZSBCVEFfQUdfQVRfRlJFRSAweDEwIC8qIGZyZWVmb3JtIGFyZ3VtZW50ICovCi0KLS8qIEFUIGNvbW1hbmQgYXJndW1lbnQgZm9ybWF0ICovCi0jZGVmaW5lIEJUQV9BR19BVF9TVFIgMCAvKiBzdHJpbmcgKi8KLSNkZWZpbmUgQlRBX0FHX0FUX0lOVCAxIC8qIGludGVnZXIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRGF0YSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFUIGNvbW1hbmQgdGFibGUgZWxlbWVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiBwX2NtZDsgLyogQVQgY29tbWFuZCBzdHJpbmcgKi8KLSAgc2l6ZV90IGNvbW1hbmRfaWQ7IC8qIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgb24gcF9jbWQgbWF0Y2ggKi8KLSAgdWludDhfdCBhcmdfdHlwZTsgIC8qIGFsbG93YWJsZSBhcmd1bWVudCB0eXBlIHN5bnRheCAqLwotICB1aW50OF90IGZtdDsgICAgICAgLyogd2hldGhlciBhcmcgaXMgaW50IG9yIHN0cmluZyAqLwotICB1aW50OF90IG1pbjsgICAgICAgLyogbWluaW11bSB2YWx1ZSBmb3IgaW50IGFyZyAqLwotICBpbnQxNl90IG1heDsgICAgICAgLyogbWF4aW11bSB2YWx1ZSBmb3IgaW50IGFyZyAqLwotfSB0QlRBX0FHX0FUX0NNRDsKLQotLyogY2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBjb21tYW5kIGlzIHBhcnNlZCAqLwotc3RydWN0IHRCVEFfQUdfU0NCOwotdHlwZWRlZiB2b2lkKHRCVEFfQUdfQVRfQ01EX0NCQUNLKSh0QlRBX0FHX1NDQiogcF91c2VyLCB1aW50MTZfdCBjb21tYW5kX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFyZ190eXBlLCBjaGFyKiBwX2FyZywgY2hhciogcF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgaW50X2FyZyk7Ci0KLS8qIGNhbGxiYWNrIGZ1bmN0aW9uIGV4ZWN1dGVkIHRvIHNlbmQgIkVSUk9SIiByZXN1bHQgY29kZSAqLwotdHlwZWRlZiB2b2lkKHRCVEFfQUdfQVRfRVJSX0NCQUNLKSh0QlRBX0FHX1NDQiogcF91c2VyLCBib29sIHVua25vd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfYXJnKTsKLQotLyogQVQgY29tbWFuZCBwYXJzaW5nIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgdEJUQV9BR19BVF9DTUQqIHBfYXRfdGJsOyAgICAvKiBBVCBjb21tYW5kIHRhYmxlICovCi0gIHRCVEFfQUdfQVRfQ01EX0NCQUNLKiBwX2NtZF9jYmFjazsgLyogY29tbWFuZCBjYWxsYmFjayAqLwotICB0QlRBX0FHX0FUX0VSUl9DQkFDSyogcF9lcnJfY2JhY2s7IC8qIGVycm9yIGNhbGxiYWNrICovCi0gIHZvaWQqIHBfdXNlcjsgICAgICAgICAgICAgICAgICAgICAgLyogdXNlci1kZWZpbmVkIGRhdGEgKi8KLSAgY2hhciogcF9jbWRfYnVmOyAgICAgICAgICAgICAgICAgICAvKiB0ZW1wIHBhcnNpbmcgYnVmZmVyICovCi0gIHVpbnQxNl90IGNtZF9wb3M7ICAgICAgICAgICAgICAgICAgLyogcG9zaXRpb24gaW4gdGVtcCBidWZmZXIgKi8KLSAgdWludDE2X3QgY21kX21heF9sZW47ICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgdGVtcCBidWZmZXIgdG8gYWxsb2NhdGUgKi8KLSAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAvKiBwYXJzaW5nIHN0YXRlICovCi19IHRCVEFfQUdfQVRfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hdF9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplIHRoZSBBVCBjb21tYW5kIHBhcnNlciBjb250cm9sIGJsb2NrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hZ19hdF9pbml0KHRCVEFfQUdfQVRfQ0IqIHBfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hdF9yZWluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlLWluaXRpYWxpemUgdGhlIEFUIGNvbW1hbmQgcGFyc2VyIGNvbnRyb2wgYmxvY2suICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlc2V0cyB0aGUgQVQgY29tbWFuZCBwYXJzZXIgc3RhdGUgYW5kIGZyZWVzCi0gKiAgICAgICAgICAgICAgICAgIGFueSBHS0kgYnVmZmVyLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hZ19hdF9yZWluaXQodEJUQV9BR19BVF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X3BhcnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQYXJzZSBBVCBjb21tYW5kcy4gIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBpbnB1dAotICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nIGFuZCBwYXJzZSBpdCBmb3IgQVQgY29tbWFuZHMgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBBVCBjb21tYW5kIHRhYmxlIHBhc3NlZCBpbiB0aGUgY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYWdfYXRfcGFyc2UodEJUQV9BR19BVF9DQiogcF9jYiwgY2hhciogcF9idWYsIHVpbnQxNl90IGxlbik7Ci0KLSNlbmRpZiAvKiBCVEFfQUdfQVRfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19jZmcuY2MgYi9idGEvYWcvYnRhX2FnX2NmZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzMTk3My4uMDAwMDAwMAotLS0gYS9idGEvYWcvYnRhX2FnX2NmZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvbXBpbGUtdGltZSBjb25maWd1cmFibGUgY29uc3RhbnRzIGZvciB0aGUgYXVkaW8KLSAqICBnYXRld2F5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvYWcvYnRhX2FnX2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9lc2NvX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0KLSNpZm5kZWYgQlRBX0FHX0NJTkRfSU5GTwotI2RlZmluZSBCVEFfQUdfQ0lORF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIihcImNhbGxcIiwoMCwxKSksKFwiY2FsbHNldHVwXCIsKDAtMykpLChcInNlcnZpY2VcIiwoMC0zKSksKFwic2lnbmFsXCIsKDAtIiBcCi0gICI2KSksKFwicm9hbVwiLCgwLDEpKSwoXCJiYXR0Y2hnXCIsKDAtNSkpLChcImNhbGxoZWxkXCIsKDAtMikpLChcImJlYXJlclwiLCIgXAotICAiKDAtNykpIgotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0FHX0NITERfVkFMX0VDQwotI2RlZmluZSBCVEFfQUdfQ0hMRF9WQUxfRUNDICIoMCwxLDF4LDIsMngsMyw0KSIKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9BR19DSExEX1ZBTAotI2RlZmluZSBCVEFfQUdfQ0hMRF9WQUwgIigwLDEsMiwzLDQpIgotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0FHX0NPTk5fVElNRU9VVAotI2RlZmluZSBCVEFfQUdfQ09OTl9USU1FT1VUIDUwMDAKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9BR19TQ09fUEtUX1RZUEVTCi0vKiBTMSBwYWNrZXQgdHlwZSBzZXR0aW5nIGZyb20gSEZQIDEuNSBzcGVjICovCi0jZGVmaW5lIEJUQV9BR19TQ09fUEtUX1RZUEVTIC8qIEJUTV9TQ09fTElOS19BTExfUEtUX01BU0sgKi8gICAgIFwKLSAgKEJUTV9TQ09fTElOS19PTkxZX01BU0sgfCBFU0NPX1BLVF9UWVBFU19NQVNLX0VWMyB8ICAgICAgICAgICAgXAotICAgRVNDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWMyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgfCBcCi0gICBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVY1KQotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0FHX0JJTkRfSU5GTwotI2RlZmluZSBCVEFfQUdfQklORF9JTkZPICIoMSkiCi0jZW5kaWYKLQotY29uc3QgdEJUQV9BR19IRl9JTkQgYnRhX2FnX2xvY2FsX2hmX2luZF9jZmdbXSA9IHsKLSAgICAvKiBUaGUgZmlyc3Qgcm93IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgaW5kaWNhdG9ycy4gTmVlZCB0byBiZSB1cGRhdGVkCi0gICAgICAgYWNjb3JkaW5nbHkgKi8KLSAgICB7QlRBX0FHX05VTV9MT0NBTF9IRl9JTkQsIGZhbHNlLCBmYWxzZSwgMCwgMH0sCi0KLSAgICB7MSwgdHJ1ZSwgdHJ1ZSwgMCwKLSAgICAgMX0sIC8qIEVuaGFuY2VkIERyaXZlciBTdGF0dXMsIHN1cHBvcnRlZCwgZW5hYmxlZCwgcmFuZ2UgMCB+IDEgKi8KLSAgICB7MiwgdHJ1ZSwgdHJ1ZSwgMCwKLSAgICAgMTAwfSAvKiBCYXR0ZXJ5IExldmVsIFN0YXR1cywgc3VwcG9ydGVkLCBlbmFibGVkLCByYW5nZSAwIH4gMTAwICovCi19OwotCi1jb25zdCB0QlRBX0FHX0NGRyBidGFfYWdfY2ZnID0ge0JUQV9BR19DSU5EX0lORk8sICAgICAgICBCVEFfQUdfQklORF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfTlVNX0xPQ0FMX0hGX0lORCwgQlRBX0FHX0NPTk5fVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX1NDT19QS1RfVFlQRVMsICAgIEJUQV9BR19DSExEX1ZBTF9FQ0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19DSExEX1ZBTH07Ci0KLWNvbnN0IHRCVEFfQUdfQ0ZHKiBwX2J0YV9hZ19jZmcgPSAmYnRhX2FnX2NmZzsKZGlmZiAtLWdpdCBhL2J0YS9hZy9idGFfYWdfY21kLmNjIGIvYnRhL2FnL2J0YV9hZ19jbWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDYyMjYuLjAwMDAwMDAKLS0tIGEvYnRhL2FnL2J0YV9hZ19jbWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRhX2FnX2NtZCIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgImJ0YS9hZy9idGFfYWdfYXQuaCIKLSNpbmNsdWRlICJidGEvYWcvYnRhX2FnX2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS91dGwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSaW5nIHRpbWVvdXQgKi8KLSNkZWZpbmUgQlRBX0FHX1JJTkdfVElNRU9VVF9NUyAoNSAqIDEwMDApIC8qIDUgc2Vjb25kcyAqLwotCi0jZGVmaW5lIEJUQV9BR19DTURfTUFYX1ZBTCAzMjc2NyAvKiBNYXhpbXVtIHZhbHVlIGlzIHNpZ25lZCAxNi1iaXQgdmFsdWUgKi8KLQotLyogSW52YWxpZCBDaGxkIGNvbW1hbmQgKi8KLSNkZWZpbmUgQlRBX0FHX0lOVkFMSURfQ0hMRCAyNTUKLQotI2RlZmluZSBDT0xPTl9JRFhfNF9WR1NWR00gNAotCi0vKiBMb2NhbCBldmVudHMgd2hpY2ggd2lsbCBub3QgdHJpZ2dlciBhIGhpZ2hlciBsYXllciBjYWxsYmFjayAqLwotZW51bSB7Ci0gIEJUQV9BR19MT0NBTF9FVlRfRklSU1QgPSAweDEwMCwKLSAgQlRBX0FHX0xPQ0FMX0VWVF9DQ1dBLAotICBCVEFfQUdfTE9DQUxfRVZUX0NMSVAsCi0gIEJUQV9BR19MT0NBTF9FVlRfQ01FUiwKLSAgQlRBX0FHX0xPQ0FMX0VWVF9CUlNGLAotICBCVEFfQUdfTE9DQUxfRVZUX0NNRUUsCi0gIEJUQV9BR19MT0NBTF9FVlRfQkNDLAotfTsKLQotLyogQVQgY29tbWFuZCBpbnRlcnByZXRlciB0YWJsZSBmb3IgSFNQICovCi1zdGF0aWMgY29uc3QgdEJUQV9BR19BVF9DTUQgYnRhX2FnX2hzcF9jbWRbXSA9IHsKLSAgICB7IitDS1BEIiwgQlRBX0FHX0FUX0NLUERfRVZULCBCVEFfQUdfQVRfU0VULCBCVEFfQUdfQVRfSU5ULCAyMDAsIDIwMH0sCi0gICAgeyIrVkdTIiwgQlRBX0FHX1NQS19FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsIDAsIDE1fSwKLSAgICB7IitWR00iLCBCVEFfQUdfTUlDX0VWVCwgQlRBX0FHX0FUX1NFVCwgQlRBX0FHX0FUX0lOVCwgMCwgMTV9LAotICAgIC8qIEVuZC1vZi10YWJsZSBtYXJrZXIgdXNlZCB0byBzdG9wIGxvb2t1cCBpdGVyYXRpb24gKi8KLSAgICB7IiIsIDAsIDAsIDAsIDAsIDB9fTsKLQotLyogQVQgY29tbWFuZCBpbnRlcnByZXRlciB0YWJsZSBmb3IgSEZQICovCi1zdGF0aWMgY29uc3QgdEJUQV9BR19BVF9DTUQgYnRhX2FnX2hmcF9jbWRbXSA9IHsKLSAgICB7IkEiLCBCVEFfQUdfQVRfQV9FVlQsIEJUQV9BR19BVF9OT05FLCBCVEFfQUdfQVRfU1RSLCAwLCAwfSwKLSAgICB7IkQiLCBCVEFfQUdfQVRfRF9FVlQsIEJUQV9BR19BVF9OT05FIHwgQlRBX0FHX0FUX0ZSRUUsIEJUQV9BR19BVF9TVFIsIDAsCi0gICAgIDB9LAotICAgIHsiK1ZHUyIsIEJUQV9BR19TUEtfRVZULCBCVEFfQUdfQVRfU0VULCBCVEFfQUdfQVRfSU5ULCAwLCAxNX0sCi0gICAgeyIrVkdNIiwgQlRBX0FHX01JQ19FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsIDAsIDE1fSwKLSAgICB7IitDQ1dBIiwgQlRBX0FHX0xPQ0FMX0VWVF9DQ1dBLCBCVEFfQUdfQVRfU0VULCBCVEFfQUdfQVRfSU5ULCAwLCAxfSwKLSAgICAvKiBDb25zaWRlciBDSExEIGFzIHN0ciB0byB0YWtlIGNhcmUgb2YgaW5kZXhlcyBmb3IgRUNDICovCi0gICAgeyIrQ0hMRCIsIEJUQV9BR19BVF9DSExEX0VWVCwgQlRBX0FHX0FUX1NFVCB8IEJUQV9BR19BVF9URVNULCBCVEFfQUdfQVRfU1RSLAotICAgICAwLCA0fSwKLSAgICB7IitDSFVQIiwgQlRBX0FHX0FUX0NIVVBfRVZULCBCVEFfQUdfQVRfTk9ORSwgQlRBX0FHX0FUX1NUUiwgMCwgMH0sCi0gICAgeyIrQ0lORCIsIEJUQV9BR19BVF9DSU5EX0VWVCwgQlRBX0FHX0FUX1JFQUQgfCBCVEFfQUdfQVRfVEVTVCwKLSAgICAgQlRBX0FHX0FUX1NUUiwgMCwgMH0sCi0gICAgeyIrQ0xJUCIsIEJUQV9BR19MT0NBTF9FVlRfQ0xJUCwgQlRBX0FHX0FUX1NFVCwgQlRBX0FHX0FUX0lOVCwgMCwgMX0sCi0gICAgeyIrQ01FUiIsIEJUQV9BR19MT0NBTF9FVlRfQ01FUiwgQlRBX0FHX0FUX1NFVCwgQlRBX0FHX0FUX1NUUiwgMCwgMH0sCi0gICAgeyIrVlRTIiwgQlRBX0FHX0FUX1ZUU19FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9TVFIsIDAsIDB9LAotICAgIHsiK0JJTlAiLCBCVEFfQUdfQVRfQklOUF9FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsIDEsIDF9LAotICAgIHsiK0JMRE4iLCBCVEFfQUdfQVRfQkxETl9FVlQsIEJUQV9BR19BVF9OT05FLCBCVEFfQUdfQVRfU1RSLCAwLCAwfSwKLSAgICB7IitCVlJBIiwgQlRBX0FHX0FUX0JWUkFfRVZULCBCVEFfQUdfQVRfU0VULCBCVEFfQUdfQVRfSU5ULCAwLCAxfSwKLSAgICB7IitCUlNGIiwgQlRBX0FHX0xPQ0FMX0VWVF9CUlNGLCBCVEFfQUdfQVRfU0VULCBCVEFfQUdfQVRfSU5ULCAwLAotICAgICBCVEFfQUdfQ01EX01BWF9WQUx9LAotICAgIHsiK05SRUMiLCBCVEFfQUdfQVRfTlJFQ19FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsIDAsIDB9LAotICAgIHsiK0NOVU0iLCBCVEFfQUdfQVRfQ05VTV9FVlQsIEJUQV9BR19BVF9OT05FLCBCVEFfQUdfQVRfU1RSLCAwLCAwfSwKLSAgICB7IitCVFJIIiwgQlRBX0FHX0FUX0JUUkhfRVZULCBCVEFfQUdfQVRfUkVBRCB8IEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsCi0gICAgIDAsIDJ9LAotICAgIHsiK0NMQ0MiLCBCVEFfQUdfQVRfQ0xDQ19FVlQsIEJUQV9BR19BVF9OT05FLCBCVEFfQUdfQVRfU1RSLCAwLCAwfSwKLSAgICB7IitDT1BTIiwgQlRBX0FHX0FUX0NPUFNfRVZULCBCVEFfQUdfQVRfUkVBRCB8IEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9TVFIsCi0gICAgIDAsIDB9LAotICAgIHsiK0NNRUUiLCBCVEFfQUdfTE9DQUxfRVZUX0NNRUUsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsIDAsIDF9LAotICAgIHsiK0JJQSIsIEJUQV9BR19BVF9CSUFfRVZULCBCVEFfQUdfQVRfU0VULCBCVEFfQUdfQVRfU1RSLCAwLCAyMH0sCi0gICAgeyIrQ0JDIiwgQlRBX0FHX0FUX0NCQ19FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9JTlQsIDAsIDEwMH0sCi0gICAgeyIrQkNDIiwgQlRBX0FHX0xPQ0FMX0VWVF9CQ0MsIEJUQV9BR19BVF9OT05FLCBCVEFfQUdfQVRfU1RSLCAwLCAwfSwKLSAgICB7IitCQ1MiLCBCVEFfQUdfQVRfQkNTX0VWVCwgQlRBX0FHX0FUX1NFVCwgQlRBX0FHX0FUX0lOVCwgMCwKLSAgICAgQlRBX0FHX0NNRF9NQVhfVkFMfSwKLSAgICB7IitCSU5EIiwgQlRBX0FHX0FUX0JJTkRfRVZULAotICAgICBCVEFfQUdfQVRfU0VUIHwgQlRBX0FHX0FUX1JFQUQgfCBCVEFfQUdfQVRfVEVTVCwgQlRBX0FHX0FUX1NUUiwgMCwgMH0sCi0gICAgeyIrQklFViIsIEJUQV9BR19BVF9CSUVWX0VWVCwgQlRBX0FHX0FUX1NFVCwgQlRBX0FHX0FUX1NUUiwgMCwgMH0sCi0gICAgeyIrQkFDIiwgQlRBX0FHX0FUX0JBQ19FVlQsIEJUQV9BR19BVF9TRVQsIEJUQV9BR19BVF9TVFIsIDAsIDB9LAotICAgIC8qIEVuZC1vZi10YWJsZSBtYXJrZXIgdXNlZCB0byBzdG9wIGxvb2t1cCBpdGVyYXRpb24gKi8KLSAgICB7IiIsIDAsIDAsIDAsIDAsIDB9fTsKLQotLyogQVQgcmVzdWx0IGNvZGUgdGFibGUgZWxlbWVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiByZXN1bHRfc3RyaW5nOyAvKiBBVCByZXN1bHQgc3RyaW5nICovCi0gIHNpemVfdCByZXN1bHRfaWQ7ICAgICAgICAgIC8qIExvY2FsIG9yIEJUQSByZXN1bHQgaWQgKi8KLSAgdWludDhfdCBhcmdfdHlwZTsgICAgICAgICAgLyogd2hldGhlciBhcmd1bWVudCBpcyBpbnQgb3Igc3RyaW5nICovCi19IHRCVEFfQUdfUkVTVUxUOwotCi0vKiBBVCByZXN1bHQgY29kZSBhcmd1bWVudCB0eXBlcyAqLwotZW51bSB7Ci0gIEJUQV9BR19SRVNfRk1UX05PTkUsIC8qIG5vIGFyZ3VtZW50ICovCi0gIEJUQV9BR19SRVNfRk1UX0lOVCwgIC8qIGludGVnZXIgYXJndW1lbnQgKi8KLSAgQlRBX0FHX1JFU19GTVRfU1RSICAgLyogc3RyaW5nIGFyZ3VtZW50ICovCi19OwotCi0vKiBMb2NhbCBBVCBjb21tYW5kIHJlc3VsdCBjb2RlcyBub3QgZGVmaW5lZCBpbiBidGFfYWdfYXBpLmggKi8KLWVudW0gewotICBCVEFfQUdfTE9DQUxfUkVTX0ZJUlNUID0gMHgwMTAwLAotICBCVEFfQUdfTE9DQUxfUkVTX09LLAotICBCVEFfQUdfTE9DQUxfUkVTX0VSUk9SLAotICBCVEFfQUdfTE9DQUxfUkVTX1JJTkcsCi0gIEJUQV9BR19MT0NBTF9SRVNfQ0xJUCwKLSAgQlRBX0FHX0xPQ0FMX1JFU19CUlNGLAotICBCVEFfQUdfTE9DQUxfUkVTX0NNRUUsCi0gIEJUQV9BR19MT0NBTF9SRVNfQkNTCi19OwotCi0vKiBBVCByZXN1bHQgY29kZSBjb25zdGFudCB0YWJsZSAqLwotc3RhdGljIGNvbnN0IHRCVEFfQUdfUkVTVUxUIGJ0YV9hZ19yZXN1bHRfdGJsW10gPSB7Ci0gICAgeyJPSyIsIEJUQV9BR19MT0NBTF9SRVNfT0ssIEJUQV9BR19SRVNfRk1UX05PTkV9LAotICAgIHsiRVJST1IiLCBCVEFfQUdfTE9DQUxfUkVTX0VSUk9SLCBCVEFfQUdfUkVTX0ZNVF9OT05FfSwKLSAgICB7IlJJTkciLCBCVEFfQUdfTE9DQUxfUkVTX1JJTkcsIEJUQV9BR19SRVNfRk1UX05PTkV9LAotICAgIHsiK1ZHUzogIiwgQlRBX0FHX1NQS19SRVMsIEJUQV9BR19SRVNfRk1UX0lOVH0sCi0gICAgeyIrVkdNOiAiLCBCVEFfQUdfTUlDX1JFUywgQlRBX0FHX1JFU19GTVRfSU5UfSwKLSAgICB7IitDQ1dBOiAiLCBCVEFfQUdfQ0FMTF9XQUlUX1JFUywgQlRBX0FHX1JFU19GTVRfU1RSfSwKLSAgICB7IitDSExEOiAiLCBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUywgQlRBX0FHX1JFU19GTVRfU1RSfSwKLSAgICB7IitDSU5EOiAiLCBCVEFfQUdfQ0lORF9SRVMsIEJUQV9BR19SRVNfRk1UX1NUUn0sCi0gICAgeyIrQ0xJUDogIiwgQlRBX0FHX0xPQ0FMX1JFU19DTElQLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAotICAgIHsiK0NJRVY6ICIsIEJUQV9BR19JTkRfUkVTLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAotICAgIHsiK0JJTlA6ICIsIEJUQV9BR19CSU5QX1JFUywgQlRBX0FHX1JFU19GTVRfU1RSfSwKLSAgICB7IitCVlJBOiAiLCBCVEFfQUdfQlZSQV9SRVMsIEJUQV9BR19SRVNfRk1UX0lOVH0sCi0gICAgeyIrQlJTRjogIiwgQlRBX0FHX0xPQ0FMX1JFU19CUlNGLCBCVEFfQUdfUkVTX0ZNVF9JTlR9LAotICAgIHsiK0JTSVI6ICIsIEJUQV9BR19JTkJBTkRfUklOR19SRVMsIEJUQV9BR19SRVNfRk1UX0lOVH0sCi0gICAgeyIrQ05VTTogIiwgQlRBX0FHX0NOVU1fUkVTLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAotICAgIHsiK0JUUkg6ICIsIEJUQV9BR19CVFJIX1JFUywgQlRBX0FHX1JFU19GTVRfSU5UfSwKLSAgICB7IitDTENDOiAiLCBCVEFfQUdfQ0xDQ19SRVMsIEJUQV9BR19SRVNfRk1UX1NUUn0sCi0gICAgeyIrQ09QUzogIiwgQlRBX0FHX0NPUFNfUkVTLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAotICAgIHsiK0NNRSBFUlJPUjogIiwgQlRBX0FHX0xPQ0FMX1JFU19DTUVFLCBCVEFfQUdfUkVTX0ZNVF9JTlR9LAotICAgIHsiK0JDUzogIiwgQlRBX0FHX0xPQ0FMX1JFU19CQ1MsIEJUQV9BR19SRVNfRk1UX0lOVH0sCi0gICAgeyIrQklORDogIiwgQlRBX0FHX0JJTkRfUkVTLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAotICAgIHsiIiwgQlRBX0FHX1VOQVRfUkVTLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9fTsKLQotc3RhdGljIGNvbnN0IHRCVEFfQUdfUkVTVUxUKiBidGFfYWdfcmVzdWx0X2J5X2NvZGUoc2l6ZV90IGNvZGUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgaSAhPSBzaXplb2YoYnRhX2FnX3Jlc3VsdF90YmwpIC8gc2l6ZW9mKGJ0YV9hZ19yZXN1bHRfdGJsWzBdKTsgKytpKSB7Ci0gICAgaWYgKGNvZGUgPT0gYnRhX2FnX3Jlc3VsdF90YmxbaV0ucmVzdWx0X2lkKSByZXR1cm4gJmJ0YV9hZ19yZXN1bHRfdGJsW2ldOwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1jb25zdCB0QlRBX0FHX0FUX0NNRCogYnRhX2FnX2F0X3RibFtCVEFfQUdfTlVNX0lEWF0gPSB7YnRhX2FnX2hzcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2hmcF9jbWR9OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNpemVfdCByZXN1bHRfY29kZTsKLSAgc2l6ZV90IGluZGljYXRvcjsKLX0gdEJUQV9BR19JTkRJQ0FUT1JfTUFQOwotCi0vKiBjYWxsc2V0dXAgaW5kaWNhdG9yIHZhbHVlIGxvb2t1cCB0YWJsZSAqLwotc3RhdGljIGNvbnN0IHRCVEFfQUdfSU5ESUNBVE9SX01BUCBjYWxsc2V0dXBfaW5kaWNhdG9yX21hcFtdID0gewotICAgIHtCVEFfQUdfSU5fQ0FMTF9SRVMsIEJUQV9BR19DQUxMU0VUVVBfSU5DT01JTkd9LAotICAgIHtCVEFfQUdfQ0FMTF9XQUlUX1JFUywgQlRBX0FHX0NBTExTRVRVUF9JTkNPTUlOR30sCi0gICAge0JUQV9BR19PVVRfQ0FMTF9PUklHX1JFUywgQlRBX0FHX0NBTExTRVRVUF9PVVRHT0lOR30sCi0gICAge0JUQV9BR19PVVRfQ0FMTF9BTEVSVF9SRVMsIEJUQV9BR19DQUxMU0VUVVBfQUxFUlRJTkd9fTsKLQotc3RhdGljIHNpemVfdCBidGFfYWdfaW5kaWNhdG9yX2J5X3Jlc3VsdF9jb2RlKHNpemVfdCBjb2RlKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgIGkgIT0KLSAgICAgICBzaXplb2YoY2FsbHNldHVwX2luZGljYXRvcl9tYXApIC8gc2l6ZW9mKGNhbGxzZXR1cF9pbmRpY2F0b3JfbWFwWzBdKTsKLSAgICAgICArK2kpIHsKLSAgICBpZiAoY29kZSA9PSBjYWxsc2V0dXBfaW5kaWNhdG9yX21hcFtpXS5yZXN1bHRfY29kZSkKLSAgICAgIHJldHVybiBjYWxsc2V0dXBfaW5kaWNhdG9yX21hcFtpXS5pbmRpY2F0b3I7Ci0gIH0KLSAgcmV0dXJuIEJUQV9BR19DQUxMU0VUVVBfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBBVCByZXN1bHQgY29kZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX3Jlc3VsdCh0QlRBX0FHX1NDQiogcF9zY2IsIHNpemVfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfYXJnLCBpbnQxNl90IGludF9hcmcpIHsKLSAgY29uc3QgdEJUQV9BR19SRVNVTFQqIHJlc3VsdCA9IGJ0YV9hZ19yZXN1bHRfYnlfY29kZShjb2RlKTsKLSAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBVbmFibGUgdG8gbG9va3VwIHJlc3VsdCBmb3IgY29kZSAlenUiLCBfX2Z1bmNfXywgY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2hhciBidWZbQlRBX0FHX0FUX01BWF9MRU4gKyAxNl0gPSAiIjsKLSAgY2hhciogcCA9IGJ1ZjsKLQotICAvKiBpbml0IHdpdGggXHJcbiAqLwotICAqcCsrID0gJ1xyJzsKLSAgKnArKyA9ICdcbic7Ci0KLSAgLyogY29weSByZXN1bHQgY29kZSBzdHJpbmcgKi8KLSAgc3RybGNweShwLCByZXN1bHQtPnJlc3VsdF9zdHJpbmcsIHNpemVvZihidWYpIC0gMik7Ci0KLSAgaWYgKHBfc2NiLT5jb25uX3NlcnZpY2UgPT0gQlRBX0FHX0hTUCkgewotICAgIC8qIElmIEhTUCB0aGVuICI6InN5bWJvbCBzaG91bGQgYmUgY2hhbmdlZCBhcyAiPSIgZm9yIEhTUCBjb21wYXRpYmlsaXR5ICovCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICBjYXNlIEJUQV9BR19TUEtfUkVTOgotICAgICAgY2FzZSBCVEFfQUdfTUlDX1JFUzoKLSAgICAgICAgaWYgKCoocCArIENPTE9OX0lEWF80X1ZHU1ZHTSkgPT0gJzonKSB7Ci0gICAgICAgICAgKihwICsgQ09MT05fSURYXzRfVkdTVkdNKSA9ICc9JzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBwICs9IHN0cmxlbihyZXN1bHQtPnJlc3VsdF9zdHJpbmcpOwotCi0gIC8qIGNvcHkgYXJndW1lbnQgaWYgYW55ICovCi0gIGlmIChyZXN1bHQtPmFyZ190eXBlID09IEJUQV9BR19SRVNfRk1UX0lOVCkgewotICAgIHAgKz0gdXRsX2l0b2EoKHVpbnQxNl90KWludF9hcmcsIHApOwotICB9IGVsc2UgaWYgKHJlc3VsdC0+YXJnX3R5cGUgPT0gQlRBX0FHX1JFU19GTVRfU1RSKSB7Ci0gICAgc3RyY3B5KHAsIHBfYXJnKTsKLSAgICBwICs9IHN0cmxlbihwX2FyZyk7Ci0gIH0KLQotICAvKiBmaW5pc2ggd2l0aCBcclxuICovCi0gICpwKysgPSAnXHInOwotICAqcCsrID0gJ1xuJzsKLQotICAvKiBzZW5kIHRvIFJGQ09NTSAqLwotICB1aW50MTZfdCBsZW4gPSAwOwotICBQT1JUX1dyaXRlRGF0YShwX3NjYi0+Y29ubl9oYW5kbGUsIGJ1ZiwgKHVpbnQxNl90KShwIC0gYnVmKSwgJmxlbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2VuZF9vawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBPSyByZXN1bHQgY29kZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX29rKHRCVEFfQUdfU0NCKiBwX3NjYikgewotICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIEJUQV9BR19MT0NBTF9SRVNfT0ssIG51bGxwdHIsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gRVJST1IgcmVzdWx0IGNvZGUuCi0gKiAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlIC0gdXNlZCB0byBzZW5kIHZlcmJvc2UgZXJyb2NvZGUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX2Vycm9yKHRCVEFfQUdfU0NCKiBwX3NjYiwgaW50MTZfdCBlcnJjb2RlKSB7Ci0gIC8qIElmIEhGUCBhbmQgZXh0ZW5kZWQgYXVkaW8gZ2F0ZXdheSBlcnJvciBjb2RlcyBhcmUgZW5hYmxlZCAqLwotICBpZiAocF9zY2ItPmNvbm5fc2VydmljZSA9PSBCVEFfQUdfSEZQICYmIHBfc2NiLT5jbWVlX2VuYWJsZWQpCi0gICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfTE9DQUxfUkVTX0NNRUUsIG51bGxwdHIsIGVycmNvZGUpOwotICBlbHNlCi0gICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfTE9DQUxfUkVTX0VSUk9SLCBudWxscHRyLCAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBpbmRpY2F0b3IgQ0lFViByZXN1bHQgY29kZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX2luZCh0QlRBX0FHX1NDQiogcF9zY2IsIHVpbnQxNl90IGlkLCB1aW50MTZfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uX2RlbWFuZCkgewotICBjaGFyIHN0clsxMl07Ci0gIGNoYXIqIHAgPSBzdHI7Ci0KLSAgLyogSWYgdGhlIGluZGljYXRvciBpcyBtYXNrZWQgb3V0LCBqdXN0IHJldHVybiAqLwotICAvKiBNYW5kYXRvcnkgaW5kaWNhdG9ycyBjYW4gbm90IGJlIG1hc2tlZCBvdXQuICovCi0gIGlmICgocF9zY2ItPmJpYV9tYXNrZWRfb3V0ICYgKCh1aW50MzJfdCkxIDw8IGlkKSkgJiYKLSAgICAgICgoaWQgIT0gQlRBX0FHX0lORF9DQUxMKSAmJiAoaWQgIT0gQlRBX0FHX0lORF9DQUxMU0VUVVApICYmCi0gICAgICAgKGlkICE9IEJUQV9BR19JTkRfQ0FMTEhFTEQpKSkKLSAgICByZXR1cm47Ci0KLSAgLyogRW5zdXJlIHdlIGRvIG5vdCBzZW5kIGR1cGxpY2F0ZSBpbmRpY2F0b3JzIGlmIG5vdCByZXF1ZXN0ZWQgYnkgYXBwICovCi0gIC8qIElmIGl0IHdhcyByZXF1ZXN0ZWQgYnkgYXBwLCB0cmFuc21pdCBDSUVWIGV2ZW4gaWYgaXQgaXMgZHVwbGljYXRlLiAqLwotICBpZiAoaWQgPT0gQlRBX0FHX0lORF9DQUxMKSB7Ci0gICAgaWYgKCh2YWx1ZSA9PSBwX3NjYi0+Y2FsbF9pbmQpICYmICghb25fZGVtYW5kKSkgcmV0dXJuOwotCi0gICAgcF9zY2ItPmNhbGxfaW5kID0gKHVpbnQ4X3QpdmFsdWU7Ci0gIH0KLQotICBpZiAoKGlkID09IEJUQV9BR19JTkRfQ0FMTFNFVFVQKSAmJiAoIW9uX2RlbWFuZCkpIHsKLSAgICBpZiAodmFsdWUgPT0gcF9zY2ItPmNhbGxzZXR1cF9pbmQpIHJldHVybjsKLQotICAgIHBfc2NiLT5jYWxsc2V0dXBfaW5kID0gKHVpbnQ4X3QpdmFsdWU7Ci0gIH0KLQotICBpZiAoKGlkID09IEJUQV9BR19JTkRfU0VSVklDRSkgJiYgKCFvbl9kZW1hbmQpKSB7Ci0gICAgaWYgKHZhbHVlID09IHBfc2NiLT5zZXJ2aWNlX2luZCkgcmV0dXJuOwotCi0gICAgcF9zY2ItPnNlcnZpY2VfaW5kID0gKHVpbnQ4X3QpdmFsdWU7Ci0gIH0KLSAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX1NJR05BTCkgJiYgKCFvbl9kZW1hbmQpKSB7Ci0gICAgaWYgKHZhbHVlID09IHBfc2NiLT5zaWduYWxfaW5kKSByZXR1cm47Ci0KLSAgICBwX3NjYi0+c2lnbmFsX2luZCA9ICh1aW50OF90KXZhbHVlOwotICB9Ci0gIGlmICgoaWQgPT0gQlRBX0FHX0lORF9ST0FNKSAmJiAoIW9uX2RlbWFuZCkpIHsKLSAgICBpZiAodmFsdWUgPT0gcF9zY2ItPnJvYW1faW5kKSByZXR1cm47Ci0KLSAgICBwX3NjYi0+cm9hbV9pbmQgPSAodWludDhfdCl2YWx1ZTsKLSAgfQotICBpZiAoKGlkID09IEJUQV9BR19JTkRfQkFUVENIRykgJiYgKCFvbl9kZW1hbmQpKSB7Ci0gICAgaWYgKHZhbHVlID09IHBfc2NiLT5iYXR0Y2hnX2luZCkgcmV0dXJuOwotCi0gICAgcF9zY2ItPmJhdHRjaGdfaW5kID0gKHVpbnQ4X3QpdmFsdWU7Ci0gIH0KLQotICBpZiAoKGlkID09IEJUQV9BR19JTkRfQ0FMTEhFTEQpICYmICghb25fZGVtYW5kKSkgewotICAgIC8qIGNhbGwgc3dhcCBjb3VsZCByZXN1bHQgaW4gc2VuZGluZyBjYWxsaGVsZD0xIG11bHRpcGxlIHRpbWVzICovCi0gICAgaWYgKCh2YWx1ZSAhPSAxKSAmJiAodmFsdWUgPT0gcF9zY2ItPmNhbGxoZWxkX2luZCkpIHJldHVybjsKLQotICAgIHBfc2NiLT5jYWxsaGVsZF9pbmQgPSAodWludDhfdCl2YWx1ZTsKLSAgfQotCi0gIGlmIChwX3NjYi0+Y21lcl9lbmFibGVkKSB7Ci0gICAgcCArPSB1dGxfaXRvYShpZCwgcCk7Ci0gICAgKnArKyA9ICcsJzsKLSAgICB1dGxfaXRvYSh2YWx1ZSwgcCk7Ci0gICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfSU5EX1JFUywgc3RyLCAwKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3BhcnNlX2NtZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFBhcnNlIEFUK0NNRVIgcGFyYW1ldGVyIHN0cmluZy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHBhcnNlZCBvaywgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidGFfYWdfcGFyc2VfY21lcihjaGFyKiBwX3MsIGNoYXIqIHBfZW5kLCBib29sKiBwX2VuYWJsZWQpIHsKLSAgaW50MTZfdCBuWzRdID0gey0xLCAtMSwgLTEsIC0xfTsKLSAgaW50IGk7Ci0gIGNoYXIqIHA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgcF9zID0gcCArIDEpIHsKLSAgICAvKiBza2lwIHRvIGNvbW1hIGRlbGltaXRlciAqLwotICAgIGZvciAocCA9IHBfczsgcCA8IHBfZW5kICYmICpwICE9ICcsJyAmJiAqcCAhPSAwOyBwKyspCi0gICAgICA7Ci0KLSAgICAvKiBnZXQgaW50ZWdlciB2YWx1ZSAqLwotICAgIGlmIChwID4gcF9lbmQpIHsKLSAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTEyODYwNDg3Iik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICpwID0gMDsKLSAgICBuW2ldID0gdXRsX3N0cjJpbnQocF9zKTsKLSAgfQotCi0gIC8qIHByb2Nlc3MgdmFsdWVzICovCi0gIGlmIChuWzBdIDwgMCB8fCBuWzNdIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICgoblswXSA9PSAzKSAmJiAoKG5bM10gPT0gMSkgfHwgKG5bM10gPT0gMCkpKSB7Ci0gICAgKnBfZW5hYmxlZCA9IChib29sKW5bM107Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19wYXJzZV9jaGxkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQYXJzZSBBVCtDSExEIHBhcmFtZXRlciBzdHJpbmcuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgUmV0dXJucyBpZHggKDEtNyksIDAgaWYgRUNDIG5vdCBlbmFibGVkIG9yCi0gQlRBX0FHX0lOVkFMSURfQ0hMRAotICAgICAgICAgICAgICAgICAgICBpZiBpZHggZG9lc24ndCBleGlzdC8xc3QgY2hhcmFjdGVyIG9mIGFyZ3VtZW50IGlzIG5vdCBhCi0gZGlnaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRhX2FnX3BhcnNlX2NobGQoVU5VU0VEX0FUVFIgdEJUQV9BR19TQ0IqIHBfc2NiLCBjaGFyKiBwX3MpIHsKLSAgdWludDhfdCByZXR2YWwgPSAwOwotCi0gIGlmICghaXNkaWdpdChwX3NbMF0pKSB7Ci0gICAgcmV0dXJuIEJUQV9BR19JTlZBTElEX0NITEQ7Ci0gIH0KLQotICBpZiAocF9zWzFdICE9IDApIHsKLSAgICAvKiBwX2lkeHN0cisrOyAgcG9pbnQgdG8gYmVnaW5uaW5nIG9mIGNhbGwgbnVtYmVyICovCi0gICAgaW50MTZfdCBpZHggPSB1dGxfc3RyMmludCgmcF9zWzFdKTsKLSAgICBpZiAoaWR4ICE9IC0xICYmIGlkeCA8IDI1NSkgewotICAgICAgcmV0dmFsID0gKHVpbnQ4X3QpaWR4OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR2YWwgPSBCVEFfQUdfSU5WQUxJRF9DSExEOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19wYXJzZV9iYWMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFBhcnNlIEFUK0JBQyBwYXJhbWV0ZXIgc3RyaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUmV0dXJucyBiaXRtYXAgb2Ygc3VwcG9ydGVkIGNvZGVjcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVEFfQUdfUEVFUl9DT0RFQyBidGFfYWdfcGFyc2VfYmFjKHRCVEFfQUdfU0NCKiBwX3NjYiwgY2hhciogcF9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHBfZW5kKSB7Ci0gIHRCVEFfQUdfUEVFUl9DT0RFQyByZXR2YWwgPSBCVE1fU0NPX0NPREVDX05PTkU7Ci0gIHVpbnQxNl90IHV1aWRfY29kZWM7Ci0gIGNoYXIqIHA7Ci0KLSAgd2hpbGUgKHBfcykgewotICAgIC8qIHNraXAgdG8gY29tbWEgZGVsaW1pdGVyICovCi0gICAgZm9yIChwID0gcF9zOyBwIDwgcF9lbmQgJiYgKnAgIT0gJywnICYmICpwICE9IDA7IHArKykKLSAgICAgIDsKLQotICAgIC8qIGdldCBpbnRlZ2VyIHZhbHVlICovCi0gICAgaWYgKHAgPiBwX2VuZCkgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTI4NjA0ODciKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBib29sIGNvbnQgPSBmYWxzZTsgIC8vIENvbnRpbnVlIHByb2Nlc3NpbmcKLSAgICBpZiAoKnAgIT0gMCkgewotICAgICAgKnAgPSAwOwotICAgICAgY29udCA9IHRydWU7Ci0gICAgfQotICAgIHV1aWRfY29kZWMgPSB1dGxfc3RyMmludChwX3MpOwotICAgIHN3aXRjaCAodXVpZF9jb2RlYykgewotICAgICAgY2FzZSBVVUlEX0NPREVDX0NWU0Q6Ci0gICAgICAgIHJldHZhbCB8PSBCVE1fU0NPX0NPREVDX0NWU0Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVVUlEX0NPREVDX01TQkM6Ci0gICAgICAgIHJldHZhbCB8PSBCVE1fU0NPX0NPREVDX01TQkM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiVW5rbm93biBDb2RlYyBVVUlEKCVkKSByZWNlaXZlZCIsIHV1aWRfY29kZWMpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY29udCkKLSAgICAgIHBfcyA9IHAgKyAxOwotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Byb2Nlc3NfdW5hdF9yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgdGhlIHVuYXQgcmVzcG9uc2UgZGF0YSBhbmQgcmVtb3ZlIGV4dHJhIGNhcnJpYWdlCi0gKiAgICAgICAgICAgICAgICAgIHJldHVybiBhbmQgbGluZSBmZWVkCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGJ0YV9hZ19wcm9jZXNzX3VuYXRfcmVzKGNoYXIqIHVuYXRfcmVzdWx0KSB7Ci0gIHVpbnQ4X3QgaiA9IDA7Ci0gIHVpbnQ4X3QgcGFpcnNfb2ZfbmxfY3I7Ci0gIGNoYXIgdHJpbV9kYXRhW0JUQV9BR19BVF9NQVhfTEVOXTsKLQotICB1aW50OF90IHN0cl9sZW5nID0gc3RybGVuKHVuYXRfcmVzdWx0KTsKLQotICAvKiBJZiBubyBleHRyYSBDUiBhbmQgTEYsIGp1c3QgcmV0dXJuICovCi0gIGlmIChzdHJfbGVuZyA8IDQpIHJldHVybjsKLQotICAvKiBSZW1vdmUgdGhlIGNhcnJpYWdlIHJldHVybiBhbmQgbGVmdCBmZWVkICovCi0gIHdoaWxlICh1bmF0X3Jlc3VsdFswXSA9PSAnXHInICYmIHVuYXRfcmVzdWx0WzFdID09ICdcbicgJiYKLSAgICAgICAgIHVuYXRfcmVzdWx0W3N0cl9sZW5nIC0gMl0gPT0gJ1xyJyAmJgotICAgICAgICAgdW5hdF9yZXN1bHRbc3RyX2xlbmcgLSAxXSA9PSAnXG4nKSB7Ci0gICAgcGFpcnNfb2ZfbmxfY3IgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHN0cl9sZW5nIC0gNCAqIHBhaXJzX29mX25sX2NyKTsgaSsrKSB7Ci0gICAgICB0cmltX2RhdGFbaisrXSA9IHVuYXRfcmVzdWx0W2kgKyBwYWlyc19vZl9ubF9jciAqIDJdOwotICAgIH0KLSAgICAvKiBBZGQgRU9GICovCi0gICAgdHJpbV9kYXRhW2pdID0gJ1wwJzsKLSAgICBzdHJfbGVuZyA9IHN0cl9sZW5nIC0gNDsKLSAgICBzdHJsY3B5KHVuYXRfcmVzdWx0LCB0cmltX2RhdGEsIHN0cl9sZW5nICsgMSk7Ci0gICAgaiA9IDA7Ci0KLSAgICBpZiAoc3RyX2xlbmcgPCA0KSByZXR1cm47Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19pbmJhbmRfZW5hYmxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgaW4tYmFuZCByaW5nIGNhbiBiZSB1c2VkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYWdfaW5iYW5kX2VuYWJsZWQodEJUQV9BR19TQ0IqIHBfc2NiKSB7Ci0gIC8qIGlmIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgbm8gb3RoZXIgc2NicyBjb25uZWN0ZWQgKi8KLSAgcmV0dXJuIHBfc2NiLT5pbmJhbmRfZW5hYmxlZCAmJiAhYnRhX2FnX290aGVyX3NjYl9vcGVuKHBfc2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBjYWxsIGFuZCBjYWxsc2V0dXAgaW5kaWNhdG9ycy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHRCVEFfQUdfU0NCKiBwX3NjYiwgdEJUQV9BR19SRVMgcmVzdWx0KSB7Ci0gIHVpbnQ4X3QgY2FsbDsKLQotICAvKiBzZXQgbmV3IGNhbGwgYW5kIGNhbGxzZXR1cCB2YWx1ZXMgYmFzZWQgb24gQlRBX0FnUmVzdWx0ICovCi0gIHNpemVfdCBjYWxsc2V0dXAgPSBidGFfYWdfaW5kaWNhdG9yX2J5X3Jlc3VsdF9jb2RlKHJlc3VsdCk7Ci0KLSAgaWYgKHJlc3VsdCA9PSBCVEFfQUdfRU5EX0NBTExfUkVTKSB7Ci0gICAgY2FsbCA9IEJUQV9BR19DQUxMX0lOQUNUSVZFOwotICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUyB8fAotICAgICAgICAgICAgIHJlc3VsdCA9PSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVMgfHwKLSAgICAgICAgICAgICByZXN1bHQgPT0gQlRBX0FHX0lOX0NBTExfSEVMRF9SRVMpIHsKLSAgICBjYWxsID0gQlRBX0FHX0NBTExfQUNUSVZFOwotICB9IGVsc2UgewotICAgIGNhbGwgPSBwX3NjYi0+Y2FsbF9pbmQ7Ci0gIH0KLQotICAvKiBTZW5kIGluZGljYXRvciBmdW5jdGlvbiB0cmFja3MgaWYgdGhlIHZhbHVlcyBoYXZlIGFjdHVhbGx5IGNoYW5nZWQgKi8KLSAgYnRhX2FnX3NlbmRfaW5kKHBfc2NiLCBCVEFfQUdfSU5EX0NBTEwsIGNhbGwsIGZhbHNlKTsKLSAgYnRhX2FnX3NlbmRfaW5kKHBfc2NiLCBCVEFfQUdfSU5EX0NBTExTRVRVUCwgY2FsbHNldHVwLCBmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXRfaHNwX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBVCBjb21tYW5kIHByb2Nlc3NpbmcgY2FsbGJhY2sgZm9yIEhTUC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2F0X2hzcF9jYmFjayh0QlRBX0FHX1NDQiogcF9zY2IsIHVpbnQxNl90IGNvbW1hbmRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcmdfdHlwZSwgY2hhciogcF9hcmcsIGNoYXIqIHBfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgaW50X2FyZykgewotICBBUFBMX1RSQUNFX0RFQlVHKCJBVCBjbWQ6JWQgYXJnX3R5cGU6JWQgYXJnOiVkIGFyZzolcyIsIGNvbW1hbmRfaWQsIGFyZ190eXBlLAotICAgICAgICAgICAgICAgICAgIGludF9hcmcsIHBfYXJnKTsKLQotICBidGFfYWdfc2VuZF9vayhwX3NjYik7Ci0KLSAgdEJUQV9BR19WQUwgdmFsID0ge307Ci0gIHZhbC5oZHIuaGFuZGxlID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwotICB2YWwuaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7Ci0gIHZhbC5udW0gPSAodWludDE2X3QpaW50X2FyZzsKLQotICBpZiAoKHBfZW5kIC0gcF9hcmcgKyAxKSA+PSAobG9uZylzaXplb2YodmFsLnN0cikpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcF9hcmcgaXMgdG9vIGxvbmcsIHNlbmQgZXJyb3IgYW5kIHJldHVybiIsIF9fZnVuY19fKTsKLSAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9URVhUX1RPT19MT05HKTsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMjg2MDQ4NyIpOwotICAgIHJldHVybjsKLSAgfQotICBzdHJsY3B5KHZhbC5zdHIsIHBfYXJnLCBzaXplb2YodmFsLnN0cikpOwotCi0gIC8qIGNhbGwgY2FsbGJhY2sgd2l0aCBldmVudCAqLwotICBpZiAoY29tbWFuZF9pZCAmIDB4ZmYwMCkgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCB2YWx1ZSB0aGF0IGV4Y2VlZHMgZGF0YSB0eXBlIC0gbG9zdCBpbmZvcm1hdGlvbiIpOwotICB9Ci0gIHRCVEFfQUdfRVZUIGV2ZW50ID0gc3RhdGljX2Nhc3Q8dEJUQV9BR19FVlQ+KGNvbW1hbmRfaWQpOwotICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShldmVudCwgKHRCVEFfQUcqKSZ2YWwpOwotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVfc3BhY2VzKGNoYXIqIHN0cikgewotICBjaGFyKiBkZXN0X3N0ciA9IHN0cjsKLQotICB3aGlsZSAoKnN0cikgewotICAgIGlmICgqc3RyID09ICcgJykgewotICAgICAgc3RyKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpkZXN0X3N0cisrID0gKnN0cisrOwotICAgIH0KLSAgfQotICAqZGVzdF9zdHIgPSAnXDAnOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2ZpbmRfZW1wdHlfaGZfaW5kKQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbmRleCBvZiBhbiBlbXB0eSBIRiBpbmRpY2F0b3IKLSAqICAgICAgICAgICAgICAgICAgc3RydWN0dXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgaW50IDogaW5kZXggb2YgdGhlIGVtcHR5IEhGIGluZGljYXRvciBzdHJ1Y3R1cmUgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIGlmIG5vIGVtcHR5IGluZGljYXRvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXZhaWxhYmxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGJ0YV9hZ19maW5kX2VtcHR5X2hmX2luZCh0QlRBX0FHX1NDQiogcF9zY2IpIHsKLSAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IEJUQV9BR19NQVhfTlVNX1BFRVJfSEZfSU5EOyBpbmRleCsrKSB7Ci0gICAgaWYgKHBfc2NiLT5wZWVyX2hmX2luZGljYXRvcnNbaW5kZXhdLmluZF9pZCA9PSAwKSByZXR1cm4gaW5kZXg7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfZmluZF9oZl9pbmRfYnlfaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIEhGIGluZGljYXRvcgotICogICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgYnkgdGhlIGluZGljYXRvciBpZAotICoKLSAqIFJldHVybnMgICAgICAgICAgaW50IDogaW5kZXggb2YgdGhlIEhGIGluZGljYXRvciBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIGlmIHRoZSBpbmRpY2F0b3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgYnRhX2FnX2ZpbmRfaGZfaW5kX2J5X2lkKHRCVEFfQUdfSEZfSU5EKiBwX2hmX2luZCwgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRfaWQpIHsKLSAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7IGluZGV4KyspIHsKLSAgICBpZiAocF9oZl9pbmRbaW5kZXhdLmluZF9pZCA9PSBpbmRfaWQpIHJldHVybiBpbmRleDsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19wYXJzZV9iaW5kX3NldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUGFyc2UgQVQrQklORCBzZXQgY29tbWFuZCBhbmQgc2F2ZSB0aGUgaW5kaWNhdG9ycwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0YV9hZ19wYXJzZV9iaW5kX3NldCh0QlRBX0FHX1NDQiogcF9zY2IsIHRCVEFfQUdfVkFMIHZhbCkgewotICBjaGFyKiBwX3Rva2VuID0gc3RydG9rKHZhbC5zdHIsICIsIik7Ci0gIGlmIChwX3Rva2VuID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLQotICB3aGlsZSAocF90b2tlbiAhPSBudWxscHRyKSB7Ci0gICAgdWludDE2X3QgcmN2X2luZF9pZCA9IGF0b2kocF90b2tlbik7Ci0gICAgaW50IGluZGV4ID0gYnRhX2FnX2ZpbmRfZW1wdHlfaGZfaW5kKHBfc2NiKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXMgQ2FuJ3Qgc2F2ZSBtb3JlIGluZGljYXRvcnMiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcF9zY2ItPnBlZXJfaGZfaW5kaWNhdG9yc1tpbmRleF0uaW5kX2lkID0gcmN2X2luZF9pZDsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBwZWVyX2hmX2luZFslZF0gPSAlZCIsIF9fZnVuY19fLCBpbmRleCwgcmN2X2luZF9pZCk7Ci0KLSAgICBwX3Rva2VuID0gc3RydG9rKG51bGxwdHIsICIsIik7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19iaW5kX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIHJlc3BvbnNlIGZvciB0aGUgQVQrQklORCBjb21tYW5kIChIRlAgMS43KSByZWNlaXZlZAotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBoZWFkc2V0IGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX2JpbmRfcmVzcG9uc2UodEJUQV9BR19TQ0IqIHBfc2NiLCB1aW50OF90IGFyZ190eXBlKSB7Ci0gIGNoYXIgYnVmZmVyW0JUQV9BR19BVF9NQVhfTEVOXSA9ICIiOwotCi0gIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfVEVTVCkgewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgYnVmZmVyW2luZGV4KytdID0gJygnOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGJ0YV9hZ19sb2NhbF9oZl9pbmRfY2ZnWzBdLmluZF9pZDsgaSsrKSB7Ci0gICAgICBpZiAoYnRhX2FnX2xvY2FsX2hmX2luZF9jZmdbaSArIDFdLmlzX3N1cHBvcnRlZCkgewotICAgICAgICAvKiBBZGQgJywnIGZyb20gc2Vjb25kIGluZGljYXRvciAqLwotICAgICAgICBpZiAoaW5kZXggPiAxKSBidWZmZXJbaW5kZXgrK10gPSAnLCc7Ci0gICAgICAgIHNucHJpbnRmKCZidWZmZXJbaW5kZXgrK10sIDIsICIlZCIsCi0gICAgICAgICAgICAgICAgIGJ0YV9hZ19sb2NhbF9oZl9pbmRfY2ZnW2kgKyAxXS5pbmRfaWQpOwotICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlcltpbmRleCsrXSA9ICcpJzsKLQotICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX0JJTkRfUkVTLCBidWZmZXIsIDApOwotICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfUkVBRCkgewotICAgIGNoYXIqIHAgPSBidWZmZXI7Ci0KLSAgICAvKiBidGFfYWdfbG9jYWxfaGZfaW5kX2NmZ1swXS5pbmRfaWQgaXMgdXNlZCBhcyBCVEFfQUdfTlVNX0xPQ0FMX0hGX0lORCAqLwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBidGFfYWdfbG9jYWxfaGZfaW5kX2NmZ1swXS5pbmRfaWQ7IGkrKykgewotICAgICAgaWYgKGkgPT0gQlRBX0FHX01BWF9OVU1fTE9DQUxfSEZfSU5EKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXMgTm8gc3BhY2UgZm9yIG1vcmUgSEYgaW5kaWNhdG9ycyIsIF9fZnVuY19fKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2ldLmluZF9pZCA9Ci0gICAgICAgICAgYnRhX2FnX2xvY2FsX2hmX2luZF9jZmdbaSArIDFdLmluZF9pZDsKLSAgICAgIHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2ldLmlzX3N1cHBvcnRlZCA9Ci0gICAgICAgICAgYnRhX2FnX2xvY2FsX2hmX2luZF9jZmdbaSArIDFdLmlzX3N1cHBvcnRlZDsKLSAgICAgIHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2ldLmlzX2VuYWJsZSA9Ci0gICAgICAgICAgYnRhX2FnX2xvY2FsX2hmX2luZF9jZmdbaSArIDFdLmlzX2VuYWJsZTsKLQotICAgICAgaW50IHBlZXJfaW5kZXggPSBidGFfYWdfZmluZF9oZl9pbmRfYnlfaWQoCi0gICAgICAgICAgcF9zY2ItPnBlZXJfaGZfaW5kaWNhdG9ycywgQlRBX0FHX01BWF9OVU1fUEVFUl9IRl9JTkQsCi0gICAgICAgICAgcF9zY2ItPmxvY2FsX2hmX2luZGljYXRvcnNbaV0uaW5kX2lkKTsKLQotICAgICAgLyogQ2hlY2sgd2hldGhlciBsb2NhbCBhbmQgcGVlciBzaWRlcyBzdXBwb3J0IHRoaXMgaW5kaWNhdG9yICovCi0gICAgICBpZiAocF9zY2ItPmxvY2FsX2hmX2luZGljYXRvcnNbaV0uaXNfc3VwcG9ydGVkICYmIHBlZXJfaW5kZXggIT0gLTEpIHsKLSAgICAgICAgLyogSW4gdGhlIGZvcm1hdCBvZiBpbmQsIHN0YXRlICovCi0gICAgICAgIHAgKz0gdXRsX2l0b2EoKHVpbnQxNl90KXBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2ldLmluZF9pZCwgcCk7Ci0gICAgICAgICpwKysgPSAnLCc7Ci0gICAgICAgIHAgKz0gdXRsX2l0b2EoKHVpbnQxNl90KXBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2ldLmlzX2VuYWJsZSwgcCk7Ci0KLSAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfQklORF9SRVMsIGJ1ZmZlciwgMCk7Ci0gICAgICAgIC8vIGhhdmUgdG8gdXNlIG1lbXNldCBoZXJlIGJlY2F1c2UgYXNzaWduaW5nIHRvICIiIHdpbGwgbm90IHplcm8KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyCi0gICAgICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgcCA9IGJ1ZmZlcjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIElmIGluZGljYXRvciBpcyBub3Qgc3VwcG9ydGVkLCBhbHNvIHNldCBpdCB0byBkaXNhYmxlICovCi0gICAgICAgIHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2ldLmlzX2VuYWJsZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLQotICAgIC8qIElmIHRoZSBzZXJ2aWNlIGxldmVsIGNvbm5lY3Rpb24gd2FuJ3QgYWxyZWFkeSBvcGVuLCBub3cgaXQncyBvcGVuICovCi0gICAgaWYgKCFwX3NjYi0+c3ZjX2Nvbm4pIHsKLSAgICAgIGJ0YV9hZ19zdmNfY29ubl9vcGVuKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcGFyc2VfYmlldl9yZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCByZXNwb25zZSBmb3IgQVQrQklFViBjb21tYW5kIChIRlAgMS43KSByZWNlaXZlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBoZWFkc2V0IGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgdGhlIHJlc3BvbnNlIHdhcyBwYXJzZWQgc3VjY2Vzc2Z1bGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0YV9hZ19wYXJzZV9iaWV2X3Jlc3BvbnNlKHRCVEFfQUdfU0NCKiBwX3NjYiwgdEJUQV9BR19WQUwqIHZhbCkgewotICBjaGFyKiBwX3Rva2VuID0gc3RydG9rKHZhbC0+c3RyLCAiLCIpOwotICBpZiAocF90b2tlbiA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gIHVpbnQxNl90IHJjdl9pbmRfaWQgPSBhdG9pKHBfdG9rZW4pOwotCi0gIHBfdG9rZW4gPSBzdHJ0b2sobnVsbHB0ciwgIiwiKTsKLSAgaWYgKHBfdG9rZW4gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICB1aW50MTZfdCByY3ZfaW5kX3ZhbCA9IGF0b2kocF90b2tlbik7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgQklFViBpbmRpY2F0b3IgaWQgJWQsIHZhbHVlICVkIiwgX19mdW5jX18sIHJjdl9pbmRfaWQsCi0gICAgICAgICAgICAgICAgICAgcmN2X2luZF92YWwpOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgaW5kaWNhdG9yIElEIGlzIHZhbGlkIG9yIG5vdCAqLwotICBpZiAocmN2X2luZF9pZCA+IEJUQV9BR19OVU1fTE9DQUxfSEZfSU5EKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlcyByZWNlaXZlZCBpbnZhbGlkIGluZGljYXRvciBpZCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICByY3ZfaW5kX2lkKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBDaGVjayB0aGlzIGluZGljYXRvciBpcyBzdXBwb3J0IG9yIG5vdCBhbmQgZW5hYmxlZCBvciBub3QgKi8KLSAgaW50IGxvY2FsX2luZGV4ID0gYnRhX2FnX2ZpbmRfaGZfaW5kX2J5X2lkKAotICAgICAgcF9zY2ItPmxvY2FsX2hmX2luZGljYXRvcnMsIEJUQV9BR19NQVhfTlVNX0xPQ0FMX0hGX0lORCwgcmN2X2luZF9pZCk7Ci0gIGlmIChsb2NhbF9pbmRleCA9PSAtMSB8fAotICAgICAgIXBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2xvY2FsX2luZGV4XS5pc19zdXBwb3J0ZWQgfHwKLSAgICAgICFwX3NjYi0+bG9jYWxfaGZfaW5kaWNhdG9yc1tsb2NhbF9pbmRleF0uaXNfZW5hYmxlKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlcyBpbmRpY2F0b3IgaWQgJWQgbm90IHN1cHBvcnRlZCBvciBkaXNhYmxlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICByY3ZfaW5kX2lkKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBGb3IgZWFjaCBpbmRpY2F0b3IgSUQsIGNoZWNrIHdoZXRoZXIgdGhlIGluZGljYXRvciB2YWx1ZSBpcyBpbiByYW5nZSAqLwotICBpZiAocmN2X2luZF92YWwgPCBidGFfYWdfbG9jYWxfaGZfaW5kX2NmZ1tyY3ZfaW5kX2lkXS5pbmRfbWluX3ZhbCB8fAotICAgICAgcmN2X2luZF92YWwgPiBidGFfYWdfbG9jYWxfaGZfaW5kX2NmZ1tyY3ZfaW5kX2lkXS5pbmRfbWF4X3ZhbCkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXMgaW52YWxpZCBpbmRfdmFsICVkIiwgX19mdW5jX18sIHJjdl9pbmRfdmFsKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2YWwtPmxpZHggPSByY3ZfaW5kX2lkOwotICB2YWwtPm51bSA9IHJjdl9pbmRfdmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2JpbmRfdGltZXJfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZXMgYmluZCB0aW1lciBjYWxsYmFjawotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FnX2JpbmRfdGltZXJfY2JhY2sodm9pZCogZGF0YSkgewotICB0QlRBX0FHX1NDQiogcF9zY2IgPSAodEJUQV9BR19TQ0IqKWRhdGE7Ci0gIGJ0YV9hZ19zdmNfY29ubl9vcGVuKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXRfaGZwX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBVCBjb21tYW5kIHByb2Nlc3NpbmcgY2FsbGJhY2sgZm9yIEhGUC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2F0X2hmcF9jYmFjayh0QlRBX0FHX1NDQiogcF9zY2IsIHVpbnQxNl90IGNtZCwgdWludDhfdCBhcmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX2FyZywgY2hhciogcF9lbmQsIGludDE2X3QgaW50X2FyZykgewotICB0QlRBX0FHX1ZBTCB2YWwgPSB7fTsKLSAgdEJUQV9BR19TQ0IqIGFnX3NjYjsKLSAgdWludDMyX3QgaSwgaW5kX2lkOwotICB1aW50MzJfdCBiaWFfbWFza2VkX291dDsKLSAgaWYgKHBfYXJnID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigicF9hcmcgaXMgbnVsbCBmb3IgY21kIDB4JXgsIHNlbmQgZXJyb3IgYW5kIHJldHVybiIsIGNtZCk7Ci0gICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfSU5WX0NIQVJfSU5fVFNUUik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEFUIGNvbW1hbmQgJWQsIGFyZ190eXBlICVkLCBpbnRfYXJnICVkLCBhcmcgJXMiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbWQsIGFyZ190eXBlLCBpbnRfYXJnLCBwX2FyZyk7Ci0KLSAgdmFsLmhkci5oYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7Ci0gIHZhbC5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKLSAgdmFsLmhkci5zdGF0dXMgPSBCVEFfQUdfU1VDQ0VTUzsKLSAgdmFsLm51bSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpbnRfYXJnKTsKLSAgdmFsLmJkX2FkZHIgPSBwX3NjYi0+cGVlcl9hZGRyOwotCi0gIGlmICgocF9lbmQgLSBwX2FyZyArIDEpID49IChsb25nKXNpemVvZih2YWwuc3RyKSkgewotICAgIExPR19FUlJPUigicF9hcmcgaXMgdG9vIGxvbmcgZm9yIGNtZCAweCV4LCBzZW5kIGVycm9yIGFuZCByZXR1cm4iLCBjbWQpOwotICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX1RFWFRfVE9PX0xPTkcpOwotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTEyODYwNDg3Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0cmxjcHkodmFsLnN0ciwgcF9hcmcsIHNpemVvZih2YWwuc3RyKSk7Ci0KLSAgLyoqCi0gICAqIFVubGVzcyB0aGlzIHRoaXMgaXMgYSBsb2NhbCBldmVudCwgYnkgZGVmYXVsdCB3ZSdsbCBmb3J3YXJkCi0gICAqIHRoZSBldmVudCBjb2RlIHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICogSWYgfGV2ZW50fCBpcyAwIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiwgdGhlIGFwcGxpY2F0aW9uCi0gICAqIGNhbGxiYWNrIGlzIE5PVCBpbnZva2VkLgotICAgKi8KLSAgdEJUQV9BR19FVlQgZXZlbnQgPSBCVEFfQUdfRU5BQkxFX0VWVDsKLSAgaWYgKGNtZCA8IEJUQV9BR19MT0NBTF9FVlRfRklSU1QpIHsKLSAgICBldmVudCA9IHN0YXRpY19jYXN0PHRCVEFfQUdfRVZUPihjbWQpOwotICB9Ci0KLSAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIEJUQV9BR19BVF9BX0VWVDoKLSAgICBjYXNlIEJUQV9BR19TUEtfRVZUOgotICAgIGNhc2UgQlRBX0FHX01JQ19FVlQ6Ci0gICAgY2FzZSBCVEFfQUdfQVRfQ0JDX0VWVDoKLSAgICAgIC8qIHNlbmQgT0sgKi8KLSAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQ0hVUF9FVlQ6Ci0gICAgICBpZiAoIWJ0YV9hZ19zY29faXNfYWN0aXZlX2RldmljZShwX3NjYi0+cGVlcl9hZGRyKSkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQVQrQ0hVUCByZWplY3RlZCBhcyAiIDw8IHBfc2NiLT5wZWVyX2FkZHIKLSAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCB0aGUgYWN0aXZlIGRldmljZSI7Ci0gICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9BTExPV0VEKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQkxETl9FVlQ6Ci0gICAgICAvKiBEbyBub3Qgc2VuZCBPSywgQXBwIHdpbGwgc2VuZCBlcnJvciBvciBPSyBkZXBlbmRpbmcgb24KLSAgICAgICoqIGxhc3QgZGlhbCBudW1iZXIgZW5hYmxlZCBvciBub3QgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfRF9FVlQ6Ci0gICAgICAvKiBEbyBub3Qgc2VuZCBPSyBmb3IgRGlhbCBjbWRzCi0gICAgICAqKiBMZXQgYXBwbGljYXRpb24gZGVjaWRlIHdoZXRoZXIgdG8gc2VuZCBPSyBvciBFUlJPUiovCi0KLSAgICAgIC8qIGlmIG1lbSBkaWFsIGNtZCwgbWFrZSBzdXJlIHN0cmluZyBjb250YWlucyBvbmx5IGRpZ2l0cyAqLwotICAgICAgaWYgKHZhbC5zdHJbMF0gPT0gJz4nKSB7Ci0gICAgICAgIC8qIFNvbWUgY2FyIGtpdHMgbWF5IGFkZCBzb21lIHVud2FudGVkIHNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlCi0gICAgICAgICoqIGlucHV0IHN0cmluZy4gVGhpcyB3b3JrYXJvdW5kIHdpbGwgdHJpbSB0aGUgdW53YW50ZWQgY2hhcnMuICovCi0gICAgICAgIHJlbW92ZV9zcGFjZXModmFsLnN0ciArIDEpOwotCi0gICAgICAgIGlmICghdXRsX2lzaW50c3RyKHZhbC5zdHIgKyAxKSkgewotICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfSU5WX0NIQVJfSU5fRFNUUik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodmFsLnN0clswXSA9PSAnVicpIC8qIEFURFYgOiBEaWFsIFZvSVAgQ2FsbCAqLwotICAgICAgewotICAgICAgICAvKiBXZSBkbyBub3QgY2hlY2sgc3RyaW5nLiBDb2RlIHdpbGwgYmUgYWRkZWQgbGF0ZXIgaWYgbmVlZGVkLiAqLwotICAgICAgICBpZiAoISgocF9zY2ItPnBlZXJfZmVhdHVyZXMgJiBCVEFfQUdfUEVFUl9GRUFUX1ZPSVApICYmCi0gICAgICAgICAgICAgIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9WT0lQKSkpIHsKLSAgICAgICAgICBldmVudCA9IEJUQV9BR19FTkFCTEVfRVZUOwotICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBJZiBkaWFsIGNtZCwgbWFrZSBzdXJlIHN0cmluZyBjb250YWlucyBvbmx5IGRpYWwgZGlnaXRzCi0gICAgICAqKiBEaWFsIGRpZ2l0cyBhcmUgMC05LCBBLUMsICosICMsICsgKi8KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBTb21lIGNhciBraXRzIG1heSBhZGQgc29tZSB1bndhbnRlZCBzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZQotICAgICAgICAqKiBpbnB1dCBzdHJpbmcuIFRoaXMgd29ya2Fyb3VuZCB3aWxsIHRyaW0gdGhlIHVud2FudGVkIGNoYXJzLiAqLwotICAgICAgICByZW1vdmVfc3BhY2VzKHZhbC5zdHIpOwotCi0gICAgICAgIGlmICghdXRsX2lzZGlhbHN0cih2YWwuc3RyKSkgewotICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfSU5WX0NIQVJfSU5fRFNUUik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfTE9DQUxfRVZUX0NDV0E6Ci0gICAgICAvKiBzdG9yZSBzZXR0aW5nICovCi0gICAgICBwX3NjYi0+Y2N3YV9lbmFibGVkID0gKGJvb2wpaW50X2FyZzsKLQotICAgICAgLyogc2VuZCBPSyAqLwotICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9DSExEX0VWVDoKLSAgICAgIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfVEVTVCkgewotICAgICAgICAvKiBkb24ndCBjYWxsIGNhbGxiYWNrICovCi0gICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0KLSAgICAgICAgLyogc2VuZCBDSExEIHN0cmluZyAqLwotICAgICAgICAvKiBGb3JtIHN0cmluZyBiYXNlZCBvbiBzdXBwb3J0ZWQgMS41IGZlYXR1cmUgKi8KLSAgICAgICAgaWYgKChwX3NjYi0+cGVlcl92ZXJzaW9uID49IEhGUF9WRVJTSU9OXzFfNSkgJiYKLSAgICAgICAgICAgIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9FQ0MpICYmCi0gICAgICAgICAgICAocF9zY2ItPnBlZXJfZmVhdHVyZXMgJiBCVEFfQUdfUEVFUl9GRUFUX0VDQykpCi0gICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idGFfYWdfY2ZnLT5jaGxkX3ZhbF9lY2MsIDApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idGFfYWdfY2ZnLT5jaGxkX3ZhbCwgMCk7Ci0KLSAgICAgICAgLyogc2VuZCBPSyAqLwotICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7Ci0KLSAgICAgICAgLyogaWYgc2VydmljZSBsZXZlbCBjb25uLiBub3QgYWxyZWFkeSBvcGVuIGFuZCBvdXIgZmVhdHVyZXMgYW5kCi0gICAgICAgICoqIHBlZXIgZmVhdHVyZXMgZG8gbm90IGhhdmUgSEYgSW5kaWNhdG9ycywgc2VydmljZSBsZXZlbCBjb25uLiBub3cgb3BlbgotICAgICAgICAqLwotICAgICAgICBpZiAoIXBfc2NiLT5zdmNfY29ubiAmJgotICAgICAgICAgICAgISgocF9zY2ItPm1hc2tlZF9mZWF0dXJlcyAmIEJUQV9BR19GRUFUX0hGX0lORCkgJiYKLSAgICAgICAgICAgICAgKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9IRl9JTkQpKSkgewotICAgICAgICAgIGJ0YV9hZ19zdmNfY29ubl9vcGVuKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHBfc2NiLT5wZWVyX3ZlcnNpb24gPj0gSEZQX1ZFUlNJT05fMV83ICYmCi0gICAgICAgICAgICAgIGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX1NMQ19TS0lQX0JJTkRfQ09NTUFORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3NjYi0+cGVlcl9hZGRyKSkgewotICAgICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfc2NiLT5iaW5kX3RpbWVyLCBCVEFfQUdfQklORF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19iaW5kX3RpbWVyX2NiYWNrLCBwX3NjYik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2YWwuaWR4ID0gYnRhX2FnX3BhcnNlX2NobGQocF9zY2IsIHZhbC5zdHIpOwotCi0gICAgICAgIGlmICh2YWwuaWR4ID09IEJUQV9BR19JTlZBTElEX0NITEQpIHsKLSAgICAgICAgICBldmVudCA9IEJUQV9BR19FTkFCTEVfRVZUOwotICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWwuaWR4ICYmCi0gICAgICAgICAgICAhKChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9FQ0MpICYmCi0gICAgICAgICAgICAgIChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfRUNDKSkpIHsKLSAgICAgICAgICAvKiB3ZSBkbyBub3Qgc3VwcG9ydCBFQ0MsIGJ1dCBIRiBpcyBzZW5kaW5nIHVzIGEgQ0hMRCB3aXRoIGNhbGwKLSAgICAgICAgICAgKiBpbmRleCovCi0gICAgICAgICAgZXZlbnQgPSBCVEFfQUdfRU5BQkxFX0VWVDsKLSAgICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIElmIGl0IGlzIHN3YXAgYmV0d2VlbiBjYWxscywgc2V0IGNhbGwgaGVsZCBpbmRpY2F0b3IgdG8gMyhvdXQgb2YKLSAgICAgICAgICAqdmFsaWQgMC0yKQotICAgICAgICAgICoqIEFwcGxpY2F0aW9uIHdpbGwgc2V0IGl0IGJhY2sgdG8gMQotICAgICAgICAgICoqIGNhbGxoZWxkIGluZGljYXRvciB3aWxsIGJlIHNlbnQgYWNyb3NzIHRvIHRoZSBwZWVyLiAqLwotICAgICAgICAgIGlmICh2YWwuc3RyWzBdID09ICcyJykgewotICAgICAgICAgICAgZm9yIChpID0gMCwgYWdfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07IGkgPCBCVEFfQUdfTUFYX05VTV9DTElFTlRTOwotICAgICAgICAgICAgICAgICBpKyssIGFnX3NjYisrKSB7Ci0gICAgICAgICAgICAgIGlmIChhZ19zY2ItPmluX3VzZSkgewotICAgICAgICAgICAgICAgIGlmICgoYWdfc2NiLT5jYWxsX2luZCA9PSBCVEFfQUdfQ0FMTF9BQ1RJVkUpICYmCi0gICAgICAgICAgICAgICAgICAgIChhZ19zY2ItPmNhbGxzZXR1cF9pbmQgPT0gQlRBX0FHX0NBTExTRVRVUF9OT05FKSkKLSAgICAgICAgICAgICAgICAgIGFnX3NjYi0+Y2FsbGhlbGRfaW5kID0gQlRBX0FHX0NBTExIRUxEX05PQUNUSVZFICsgMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERvIG5vdCBzZW5kIE9LLiBMZXQgYXBwIGRlY2lkZSBhZnRlciBwYXJzaW5nIHRoZSB2YWwgc3RyICovCi0gICAgICAgIC8qIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQklORF9FVlQ6Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBCVEFfQUdfQVRfQklORF9FVlQgYXJnX3R5cGU6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlKTsKLSAgICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+YmluZF90aW1lcik7Ci0gICAgICBpZiAoYXJnX3R5cGUgPT0gQlRBX0FHX0FUX1NFVCkgewotICAgICAgICBpZiAoYnRhX2FnX3BhcnNlX2JpbmRfc2V0KHBfc2NiLCB2YWwpKSB7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7IC8qIGRvbid0IGNhbGwgY2FsbGJhY2sgKi8KLSAgICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9JTlZBTElEX0lOREVYKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2FnX2JpbmRfcmVzcG9uc2UocF9zY2IsIGFyZ190eXBlKTsKLQotICAgICAgICAvKiBOZWVkIG5vdCBwYXNzIHRoaXMgY29tbWFuZCBiZXlvbmQgQlRJRi4qLwotICAgICAgICAvKiBTdGFjayBoYW5kbGVzIGl0IGludGVybmFsbHkgKi8KLSAgICAgICAgZXZlbnQgPSBCVEFfQUdfRU5BQkxFX0VWVDsgLyogZG9uJ3QgY2FsbCBjYWxsYmFjayAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9CSUVWX0VWVDoKLSAgICAgIGlmIChidGFfYWdfcGFyc2VfYmlldl9yZXNwb25zZShwX3NjYiwgJnZhbCkpIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfSU5WQUxJRF9JTkRFWCk7Ci0gICAgICAgIC8qIGRvbid0IGNhbGwgY2FsbGJhY2sgcmVjZWl2aW5nIGludmFsaWQgaW5kaWNhdG9yICovCi0gICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0NJTkRfRVZUOgotICAgICAgaWYgKGFyZ190eXBlID09IEJUQV9BR19BVF9URVNUKSB7Ci0gICAgICAgIC8qIGRvbid0IGNhbGwgY2FsbGJhY2sgKi8KLSAgICAgICAgZXZlbnQgPSBCVEFfQUdfRU5BQkxFX0VWVDsKLQotICAgICAgICAvKiBzZW5kIENJTkQgc3RyaW5nLCBzZW5kIE9LICovCi0gICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX0NJTkRfUkVTLCBwX2J0YV9hZ19jZmctPmNpbmRfaW5mbywgMCk7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfTE9DQUxfRVZUX0NMSVA6Ci0gICAgICAvKiBzdG9yZSBzZXR0aW5nLCBzZW5kIE9LICovCi0gICAgICBwX3NjYi0+Y2xpcF9lbmFibGVkID0gKGJvb2wpaW50X2FyZzsKLSAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfTE9DQUxfRVZUX0NNRVI6Ci0gICAgICAvKiBpZiBwYXJzZWQgb2sgc3RvcmUgc2V0dGluZywgc2VuZCBPSyAqLwotICAgICAgaWYgKGJ0YV9hZ19wYXJzZV9jbWVyKHBfYXJnLCBwX2VuZCwgJnBfc2NiLT5jbWVyX2VuYWJsZWQpKSB7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLQotICAgICAgICAvKiBpZiBzZXJ2aWNlIGxldmVsIGNvbm4uIG5vdCBhbHJlYWR5IG9wZW4gYW5kIG91ciBmZWF0dXJlcyBhbmQKLSAgICAgICAgICogcGVlciBmZWF0dXJlcyBkbyBub3QgaGF2ZSAzLXdheSBvciBIRiBJbmRpY2F0b3JzLCBzZXJ2aWNlIGxldmVsIGNvbm4uCi0gICAgICAgICAqIG5vdyBvcGVuICovCi0gICAgICAgIGlmICghcF9zY2ItPnN2Y19jb25uICYmCi0gICAgICAgICAgICAhKChwX3NjYi0+bWFza2VkX2ZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfM1dBWSkgJiYKLSAgICAgICAgICAgICAgKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF8zV0FZKSkgJiYKLSAgICAgICAgICAgICEoKHBfc2NiLT5tYXNrZWRfZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9IRl9JTkQpICYmCi0gICAgICAgICAgICAgIChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfSEZfSU5EKSkpIHsKLSAgICAgICAgICBidGFfYWdfc3ZjX2Nvbm5fb3BlbihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9JTlZfQ0hBUl9JTl9UU1RSKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfVlRTX0VWVDoKLSAgICAgIC8qIGNoZWNrIGFyZ3VtZW50ICovCi0gICAgICBpZiAoc3RybGVuKHBfYXJnKSA9PSAxKSB7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX1RTVFIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9CSU5QX0VWVDoKLSAgICAgIC8qIGlmIGZlYXR1cmUgbm90IHNldCBkb24ndCBjYWxsIGNhbGxiYWNrLCBzZW5kIEVSUk9SICovCi0gICAgICBpZiAoIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9WVEFHKSkgewotICAgICAgICBldmVudCA9IEJUQV9BR19FTkFCTEVfRVZUOwotICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQlZSQV9FVlQ6Ci0gICAgICAvKiBpZiBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQgZG9uJ3QgY2FsbCBjYWxsYmFjaywgc2VuZCBFUlJPUi4gQXBwIHdpbGwgc2VuZAotICAgICAgICogT0sgKi8KLSAgICAgIGlmICghKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX1ZSRUMpKSB7Ci0gICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19MT0NBTF9FVlRfQlJTRjogewotICAgICAgLyogc3RvcmUgcGVlciBmZWF0dXJlcyAqLwotICAgICAgcF9zY2ItPnBlZXJfZmVhdHVyZXMgPSAodWludDE2X3QpaW50X2FyZzsKLQotICAgICAgaWYgKHBfc2NiLT5wZWVyX3ZlcnNpb24gPCBIRlBfVkVSU0lPTl8xXzcpIHsKLSAgICAgICAgcF9zY2ItPm1hc2tlZF9mZWF0dXJlcyAmPSBIRlBfMV82X0ZFQVRfTUFTSzsKLSAgICAgIH0KLQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgQlJTRiBIRjogMHgleCwgcGhvbmU6IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfZmVhdHVyZXMsIHBfc2NiLT5tYXNrZWRfZmVhdHVyZXMpOwotCi0gICAgICAvKiBzZW5kIEJSU0YsIHNlbmQgT0sgKi8KLSAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX0xPQ0FMX1JFU19CUlNGLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KXBfc2NiLT5tYXNrZWRfZmVhdHVyZXMpOwotICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfQUdfQVRfTlJFQ19FVlQ6Ci0gICAgICAvKiBpZiBmZWF0dXJlIHNlbmQgT0ssIGVsc2UgZG9uJ3QgY2FsbCBjYWxsYmFjaywgc2VuZCBFUlJPUiAqLwotICAgICAgaWYgKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX0VDTlIpIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXZlbnQgPSBCVEFfQUdfRU5BQkxFX0VWVDsKLSAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0JUUkhfRVZUOgotICAgICAgLyogaWYgZmVhdHVyZSBzZW5kIEJUUkgsIHNlbmQgT0s6LCBlbHNlIGRvbid0IGNhbGwgY2FsbGJhY2ssIHNlbmQgRVJST1IgKi8KLSAgICAgIGlmIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9CVFJIKSB7Ci0gICAgICAgIC8qIElmIHNldCBjb21tYW5kOyBzZW5kIHJlc3BvbnNlIGFuZCBub3RpZnkgYXBwICovCi0gICAgICAgIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfU0VUKSB7Ci0gICAgICAgICAgZm9yIChpID0gMCwgYWdfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07IGkgPCBCVEFfQUdfTUFYX05VTV9DTElFTlRTOwotICAgICAgICAgICAgICAgaSsrLCBhZ19zY2IrKykgewotICAgICAgICAgICAgaWYgKGFnX3NjYi0+aW5fdXNlKSB7Ci0gICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChhZ19zY2IsIEJUQV9BR19CVFJIX1JFUywgbnVsbHB0ciwgaW50X2FyZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgICAgfSBlbHNlIC8qIFJlYWQgQ29tbWFuZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgdmFsLm51bSA9IEJUQV9BR19CVFJIX1JFQUQ7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9DT1BTX0VWVDoKLSAgICAgIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfU0VUKSB7Ci0gICAgICAgIC8qIGRvbid0IGNhbGwgY2FsbGJhY2sgKi8KLSAgICAgICAgZXZlbnQgPSBCVEFfQUdfRU5BQkxFX0VWVDsKLQotICAgICAgICAvKiBzZW5kIE9LICovCi0gICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfTE9DQUxfRVZUX0NNRUU6Ci0gICAgICBpZiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfRVhURVJSKSB7Ci0gICAgICAgIC8qIHN0b3JlIHNldHRpbmcgKi8KLSAgICAgICAgcF9zY2ItPmNtZWVfZW5hYmxlZCA9IChib29sKWludF9hcmc7Ci0KLSAgICAgICAgLyogc2VuZCBPSyAqLwotICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgIH0KLSAgICAgIC8qIGRvbid0IGNhbGwgY2FsbGJhY2sgKi8KLSAgICAgIGV2ZW50ID0gQlRBX0FHX0VOQUJMRV9FVlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0JJQV9FVlQ6Ci0gICAgICBiaWFfbWFza2VkX291dCA9IHBfc2NiLT5iaWFfbWFza2VkX291dDsKLQotICAgICAgLyogUGFyc2UgdGhlIGluZGljYXRvciBtYXNrICovCi0gICAgICBmb3IgKGkgPSAwLCBpbmRfaWQgPSAxOyAodmFsLnN0cltpXSAhPSAwKSAmJiAoaW5kX2lkIDw9IDIwKTsKLSAgICAgICAgICAgaSsrLCBpbmRfaWQrKykgewotICAgICAgICBpZiAodmFsLnN0cltpXSA9PSAnLCcpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWwuc3RyW2ldID09ICcwJykgewotICAgICAgICAgIGJpYV9tYXNrZWRfb3V0IHw9ICgodWludDMyX3QpMSA8PCBpbmRfaWQpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbC5zdHJbaV0gPT0gJzEnKSB7Ci0gICAgICAgICAgYmlhX21hc2tlZF9vdXQgJj0gfigodWludDMyX3QpMSA8PCBpbmRfaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaSsrOwotICAgICAgICBpZiAodmFsLnN0cltpXSAhPSAnLCcpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHZhbC5zdHJbaV0gPT0gMCkgewotICAgICAgICBwX3NjYi0+YmlhX21hc2tlZF9vdXQgPSBiaWFfbWFza2VkX291dDsKLSAgICAgICAgdmFsLm51bSA9IGJpYV9tYXNrZWRfb3V0OwotICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBldmVudCA9IEJUQV9BR19FTkFCTEVfRVZUOwotICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9JTlZBTElEX0lOREVYKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQ05VTV9FVlQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0NMQ0NfRVZUOgotICAgICAgaWYgKCEocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfRUNTKSkgewotICAgICAgICBldmVudCA9IEJUQV9BR19FTkFCTEVfRVZUOwotICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQkFDX0VWVDoKLSAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIHBfc2NiLT5yZWNlaXZlZF9hdF9iYWMgPSB0cnVlOwotCi0gICAgICAvKiBzdG9yZSBhdmFpbGFibGUgY29kZWNzIGZyb20gdGhlIHBlZXIgKi8KLSAgICAgIGlmICgocF9zY2ItPnBlZXJfZmVhdHVyZXMgJiBCVEFfQUdfUEVFUl9GRUFUX0NPREVDKSAmJgotICAgICAgICAgIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9DT0RFQykpIHsKLSAgICAgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gYnRhX2FnX3BhcnNlX2JhYyhwX3NjYiwgcF9hcmcsIHBfZW5kKTsKLSAgICAgICAgcF9zY2ItPmNvZGVjX3VwZGF0ZWQgPSB0cnVlOwotCi0gICAgICAgIGlmIChwX3NjYi0+cGVlcl9jb2RlY3MgJiBCVE1fU0NPX0NPREVDX01TQkMpIHsKLSAgICAgICAgICBwX3NjYi0+c2NvX2NvZGVjID0gVVVJRF9DT0RFQ19NU0JDOwotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIlJlY2VpdmVkIEFUK0JBQywgdXBkYXRpbmcgc2NvIGNvZGVjIHRvIE1TQkMiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwX3NjYi0+c2NvX2NvZGVjID0gVVVJRF9DT0RFQ19DVlNEOwotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIlJlY2VpdmVkIEFUK0JBQywgdXBkYXRpbmcgc2NvIGNvZGVjIHRvIENWU0QiKTsKLSAgICAgICAgfQotICAgICAgICAvKiBUaGUgYWJvdmUgbG9naWMgc2V0cyB0aGUgc3RhY2sgcHJlZmVycmVkIGNvZGVjIGJhc2VkIG9uIGxvY2FsIGFuZAotICAgICAgICBwZWVyIGNvZGVjCi0gICAgICAgIGNhcGFiaWxpdGllcy4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGVwZW5kaW5nIG9uIGl0cwotICAgICAgICBwcmVmZXJlbmNlCi0gICAgICAgIHVzaW5nIHRoZSBidGFfYWdfc2V0Y29kZWMgQVBJLiBXZSBzZW5kIHRoZSBwZWVyX2NvZGVjcyB0byB0aGUKLSAgICAgICAgYXBwbGljYXRpb24uICovCi0gICAgICAgIHZhbC5udW0gPSBwX3NjYi0+cGVlcl9jb2RlY3M7Ci0gICAgICAgIC8qIFJlY2VpdmVkIEJBQyB3aGlsZSBpbiBjb2RlYyBuZWdvdGlhdGlvbi4gKi8KLSAgICAgICAgaWYgKChidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fQ09ERUNfU1QpICYmCi0gICAgICAgICAgICAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID09IHBfc2NiKSkgewotICAgICAgICAgIGJ0YV9hZ19jb2RlY19uZWdvdGlhdGUocF9zY2IpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX3NjYi0+cGVlcl9jb2RlY3MgPSBCVE1fU0NPX0NPREVDX0NWU0Q7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiVW5leHBlY3RlZCBDTUQ6QVQrQkFDLCBDb2RlYyBOZWdvdGlhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0JDU19FVlQ6IHsKLSAgICAgIHRCVEFfQUdfUEVFUl9DT0RFQyBjb2RlY190eXBlLCBjb2RlY19zZW50OwotICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgYWxhcm1fY2FuY2VsKHBfc2NiLT5jb2RlY19uZWdvdGlhdGlvbl90aW1lcik7Ci0KLSAgICAgIHN3aXRjaCAoaW50X2FyZykgewotICAgICAgICBjYXNlIFVVSURfQ09ERUNfQ1ZTRDoKLSAgICAgICAgICBjb2RlY190eXBlID0gQlRNX1NDT19DT0RFQ19DVlNEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVVSURfQ09ERUNfTVNCQzoKLSAgICAgICAgICBjb2RlY190eXBlID0gQlRNX1NDT19DT0RFQ19NU0JDOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIlVua25vd24gY29kZWNfdXVpZCAlZCIsIGludF9hcmcpOwotICAgICAgICAgIGNvZGVjX3R5cGUgPSAweEZGRkY7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX3NjYi0+Y29kZWNfZmFsbGJhY2spCi0gICAgICAgIGNvZGVjX3NlbnQgPSBCVE1fU0NPX0NPREVDX0NWU0Q7Ci0gICAgICBlbHNlCi0gICAgICAgIGNvZGVjX3NlbnQgPSBwX3NjYi0+c2NvX2NvZGVjOwotCi0gICAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28ocF9zY2IsIGNvZGVjX3R5cGUgPT0gY29kZWNfc2VudCk7Ci0KLSAgICAgIC8qIHNlbmQgZmluYWwgY29kZWMgaW5mbyB0byBjYWxsYmFjayAqLwotICAgICAgdmFsLm51bSA9IGNvZGVjX3NlbnQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfQUdfTE9DQUxfRVZUX0JDQzogewotICAgICAgaWYgKCFidGFfYWdfc2NvX2lzX2FjdGl2ZV9kZXZpY2UocF9zY2ItPnBlZXJfYWRkcikpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEFUK0JDQyByZWplY3RlZCBhcyAiIDw8IHBfc2NiLT5wZWVyX2FkZHIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IHRoZSBhY3RpdmUgZGV2aWNlIjsKLSAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX0FMTE9XRUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogY2FsbCBjYWxsYmFjayAqLwotICBpZiAoZXZlbnQgIT0gQlRBX0FHX0VOQUJMRV9FVlQpIHsKLSAgICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShldmVudCwgKHRCVEFfQUcqKSZ2YWwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXRfZXJyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBVCBjb21tYW5kIHBhcnNlciBlcnJvciBjYWxsYmFjay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2F0X2Vycl9jYmFjayh0QlRBX0FHX1NDQiogcF9zY2IsIGJvb2wgdW5rbm93biwgY29uc3QgY2hhciogcF9hcmcpIHsKLSAgaWYgKHVua25vd24gJiYgKCFzdHJsZW4ocF9hcmcpKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIkVtcHR5IEFUIGNtZCBzdHJpbmcgcmVjZWl2ZWQiKTsKLSAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9BR19WQUwgdmFsID0ge307Ci0gIC8qIGlmIHVua25vd24gQVQgY29tbWFuZCBhbmQgY29uZmlndXJlZCB0byBwYXNzIHRoZXNlIHRvIGFwcCAqLwotICBpZiAodW5rbm93biAmJiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfVU5BVCkpIHsKLSAgICB2YWwuaGRyLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKLSAgICB2YWwuaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7Ci0gICAgdmFsLmhkci5zdGF0dXMgPSBCVEFfQUdfU1VDQ0VTUzsKLSAgICB2YWwubnVtID0gMDsKLSAgICBzdHJsY3B5KHZhbC5zdHIsIHBfYXJnLCBzaXplb2YodmFsLnN0cikpOwotICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19BVF9VTkFUX0VWVCwgKHRCVEFfQUcqKSZ2YWwpOwotICB9IGVsc2UgewotICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfaHNwX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIEFQSSByZXN1bHQgZm9yIEhTUCBjb25uZWN0aW9ucy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19oc3BfcmVzdWx0KHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfQVBJX1JFU1VMVCYgcmVzdWx0KSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19oc3BfcmVzdWx0IDogcmVzID0gJWQiLCByZXN1bHQucmVzdWx0KTsKLQotICBzd2l0Y2ggKHJlc3VsdC5yZXN1bHQpIHsKLSAgICBjYXNlIEJUQV9BR19TUEtfUkVTOgotICAgIGNhc2UgQlRBX0FHX01JQ19SRVM6Ci0gICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIHJlc3VsdC5yZXN1bHQsIG51bGxwdHIsIHJlc3VsdC5kYXRhLm51bSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0lOX0NBTExfUkVTOgotICAgICAgLyogdGVsbCBzeXMgdG8gc3RvcCBhdiBpZiBhbnkgKi8KLSAgICAgIGJ0YV9zeXNfc2NvX3VzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwotCi0gICAgICAvKiBpZiBzY28gYWxyZWFkeSBvcGVuZWQgb3Igbm8gaW5iYW5kIHJpbmcgc2VuZCByaW5nIG5vdyAqLwotICAgICAgaWYgKGJ0YV9hZ19zY29faXNfb3BlbihwX3NjYikgfHwgIWJ0YV9hZ19pbmJhbmRfZW5hYmxlZChwX3NjYikgfHwKLSAgICAgICAgICAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfTk9TQ08pKSB7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX3JpbmcocF9zY2IsIHRCVEFfQUdfREFUQTo6a0VtcHR5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGVsc2Ugb3BlbiBzY28sIHNlbmQgcmluZyBhZnRlciBzY28gb3BlbmVkICovCi0gICAgICAgIC8qIEhTUHYxLjI6IEFHIHNoYWxsIG5vdCBzZW5kIFJJTkcgaWYgdXNpbmcgaW4tYmFuZCByaW5nIHRvbmUuICovCi0gICAgICAgIGlmIChwX3NjYi0+cGVlcl92ZXJzaW9uID49IEhTUF9WRVJTSU9OXzFfMikgewotICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19SSU5HOwotICAgICAgICB9Ci0gICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTOgotICAgIGNhc2UgQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTOgotICAgICAgLyogaWYgaW5jb21pbmcgY2FsbCBjb25uZWN0ZWQgc3RvcCByaW5nIHRpbWVyICovCi0gICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PSBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUykgewotICAgICAgICBhbGFybV9jYW5jZWwocF9zY2ItPnJpbmdfdGltZXIpOwotICAgICAgfQotCi0gICAgICBpZiAoIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpIHsKLSAgICAgICAgLyogaWYgYXVkaW8gY29ubmVjdGVkIHRvIHRoaXMgc2NiIEFORCBzY28gaXMgbm90IG9wZW5lZCwgb3BlbiBzY28gKi8KLSAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgJiYKLSAgICAgICAgICAgICFidGFfYWdfc2NvX2lzX29wZW4ocF9zY2IpKSB7Ci0gICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmRhdGEuYXVkaW9faGFuZGxlID09IEJUQV9BR19IQU5ETEVfTk9ORSAmJgotICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29faXNfb3BlbihwX3NjYikpIHsKLSAgICAgICAgICAvKiBlbHNlIGlmIG5vIGF1ZGlvIGF0IGNhbGwgY2xvc2Ugc2NvICovCi0gICAgICAgICAgYnRhX2FnX3Njb19jbG9zZShwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0VORF9DQUxMX1JFUzoKLSAgICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+cmluZ190aW1lcik7Ci0KLSAgICAgIC8qIGNsb3NlIHNjbyAqLwotICAgICAgaWYgKChidGFfYWdfc2NvX2lzX29wZW4ocF9zY2IpIHx8IGJ0YV9hZ19zY29faXNfb3BlbmluZyhwX3NjYikpICYmCi0gICAgICAgICAgIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpIHsKLSAgICAgICAgYnRhX2FnX3Njb19jbG9zZShwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogaWYgYXYgZ290IHN1c3BlbmRlZCBieSB0aGlzIGNhbGwsIGxldCBpdCByZXN1bWUuICovCi0gICAgICAgIGJ0YV9zeXNfc2NvX3VudXNlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0lOQkFORF9SSU5HX1JFUzoKLSAgICAgIHBfc2NiLT5pbmJhbmRfZW5hYmxlZCA9IHJlc3VsdC5kYXRhLnN0YXRlOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiaW5iYW5kX2VuYWJsZWQgc2V0IHRvICVkIiwgcF9zY2ItPmluYmFuZF9lbmFibGVkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfVU5BVF9SRVM6Ci0gICAgICBpZiAocmVzdWx0LmRhdGEub2tfZmxhZyAhPSBCVEFfQUdfT0tfRVJST1IpIHsKLSAgICAgICAgaWYgKHJlc3VsdC5kYXRhLnN0clswXSAhPSAwKSB7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCByZXN1bHQucmVzdWx0LCByZXN1bHQuZGF0YS5zdHIsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdC5kYXRhLm9rX2ZsYWcgPT0gQlRBX0FHX09LX0RPTkUpIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX1RTVFIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogaWdub3JlIGFsbCBvdGhlcnMgKi8KLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfaGZwX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIEFQSSByZXN1bHQgZm9yIEhGUCBjb25uZWN0aW9ucy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19oZnBfcmVzdWx0KHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfQVBJX1JFU1VMVCYgcmVzdWx0KSB7Ci0gIExPR19ERUJVRygiSEZQIGNvbm5lY3Rpb24gcmVzdWx0OiVzIiwgcmVzdWx0LlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgc3dpdGNoIChyZXN1bHQucmVzdWx0KSB7Ci0gICAgY2FzZSBCVEFfQUdfU1BLX1JFUzoKLSAgICBjYXNlIEJUQV9BR19NSUNfUkVTOgotICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCByZXN1bHQucmVzdWx0LCBudWxscHRyLCByZXN1bHQuZGF0YS5udW0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19JTl9DQUxMX1JFUzogewotICAgICAgLyogdGVsbCBzeXMgdG8gc3RvcCBhdiBpZiBhbnkgKi8KLSAgICAgIGJ0YV9zeXNfc2NvX3VzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwotCi0gICAgICBwX3NjYi0+Y2xpcFswXSA9IDA7Ci0gICAgICBpZiAocmVzdWx0LmRhdGEuc3RyWzBdICE9IDApIHsKLSAgICAgICAgc25wcmludGYocF9zY2ItPmNsaXAsIHNpemVvZihwX3NjYi0+Y2xpcCksICIlcyIsIHJlc3VsdC5kYXRhLnN0cik7Ci0gICAgICB9Ci0gICAgICAvKiBzZW5kIGNhbGxzZXR1cCBpbmRpY2F0b3IgKi8KLSAgICAgIGlmIChwX3NjYi0+cG9zdF9zY28gPT0gQlRBX0FHX1BPU1RfU0NPX0NBTExfRU5EKSB7Ci0gICAgICAgIC8qIE5lZWQgdG8gc2VudCAyIGNhbGxzZXR1cCBJTkQncyhDYWxsIEVuZCBhbmQgSW5jb21pbmcgY2FsbCkgYWZ0ZXIgU0NPCi0gICAgICAgICAqIGNsb3NlLiAqLwotICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkRfSU5DQUxMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCByZXN1bHQucmVzdWx0KTsKLQotICAgICAgICAvKiBpZiBzY28gYWxyZWFkeSBvcGVuZWQgb3Igbm8gaW5iYW5kIHJpbmcgc2VuZCByaW5nIG5vdyAqLwotICAgICAgICBpZiAoYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSB8fCAhYnRhX2FnX2luYmFuZF9lbmFibGVkKHBfc2NiKSB8fAotICAgICAgICAgICAgKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSB8fAotICAgICAgICAgICAgKHJlc3VsdC5kYXRhLmF1ZGlvX2hhbmRsZSAhPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikpKSB7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfcmluZyhwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIGVsc2Ugb3BlbiBzY28sIHNlbmQgcmluZyBhZnRlciBzY28gb3BlbmVkICovCi0gICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX1JJTkc7Ci0gICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTOgotICAgICAgYWxhcm1fY2FuY2VsKHBfc2NiLT5yaW5nX3RpbWVyKTsKLQotICAgICAgLyogaWYgc2NvIG5vdCBvcGVuZWQgYW5kIHdlIG5lZWQgdG8gb3BlbiBpdCwgc2VuZCBpbmRpY2F0b3JzIGZpcnN0Ci0gICAgICAqKiB0aGVuICBvcGVuIHNjby4KLSAgICAgICovCi0gICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMocF9zY2IsIHJlc3VsdC5yZXN1bHQpOwotCi0gICAgICBpZiAoIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpIHsKLSAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgJiYKLSAgICAgICAgICAgICFidGFfYWdfc2NvX2lzX29wZW4ocF9zY2IpKSB7Ci0gICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHJlc3VsdC5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBCVEFfQUdfSEFORExFX05PTkUpICYmCi0gICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSkgewotICAgICAgICAgIGJ0YV9hZ19zY29fY2xvc2UocF9zY2IsIHRCVEFfQUdfREFUQTo6a0VtcHR5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19JTl9DQUxMX0hFTERfUkVTOgotICAgICAgYWxhcm1fY2FuY2VsKHBfc2NiLT5yaW5nX3RpbWVyKTsKLQotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCByZXN1bHQucmVzdWx0KTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19PVVRfQ0FMTF9PUklHX1JFUzoKLSAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgcmVzdWx0LnJlc3VsdCk7Ci0gICAgICBpZiAocmVzdWx0LmRhdGEuYXVkaW9faGFuZGxlID09IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSAmJgotICAgICAgICAgICEocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfTk9TQ08pKSB7Ci0gICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19PVVRfQ0FMTF9BTEVSVF9SRVM6Ci0gICAgICAvKiBzZW5kIGluZGljYXRvcnMgKi8KLSAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgcmVzdWx0LnJlc3VsdCk7Ci0gICAgICBpZiAocmVzdWx0LmRhdGEuYXVkaW9faGFuZGxlID09IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSAmJgotICAgICAgICAgICEocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfTk9TQ08pKSB7Ci0gICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19NVUxUSV9DQUxMX1JFUzoKLSAgICAgIC8qIG9wZW4gU0NPIGF0IFNMQyBmb3IgdGhpcyB0aHJlZSB3YXkgY2FsbCAqLwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiSGVhZHNldCBDb25uZWN0ZWQgaW4gdGhyZWUgd2F5IGNhbGwiKTsKLSAgICAgIGlmICghKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkgewotICAgICAgICBpZiAocmVzdWx0LmRhdGEuYXVkaW9faGFuZGxlID09IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSkgewotICAgICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBCVEFfQUdfSEFORExFX05PTkUpIHsKLSAgICAgICAgICBidGFfYWdfc2NvX2Nsb3NlKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVM6Ci0gICAgICAvKiBzZW5kIGluZGljYXRvcnMgKi8KLSAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgcmVzdWx0LnJlc3VsdCk7Ci0KLSAgICAgIC8qIG9wZW4gb3IgY2xvc2Ugc2NvICovCi0gICAgICBpZiAoIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpIHsKLSAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikpIHsKLSAgICAgICAgICBidGFfYWdfc2NvX29wZW4ocF9zY2IsIHRCVEFfQUdfREFUQTo6a0VtcHR5KTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZGF0YS5hdWRpb19oYW5kbGUgPT0gQlRBX0FHX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgYnRhX2FnX3Njb19jbG9zZShwX3NjYiwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0NBTExfQ0FOQ0VMX1JFUzoKLSAgICAgIC8qIHNlbmQgaW5kaWNhdG9ycyAqLwotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCByZXN1bHQucmVzdWx0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfRU5EX0NBTExfUkVTOgotICAgICAgYWxhcm1fY2FuY2VsKHBfc2NiLT5yaW5nX3RpbWVyKTsKLQotICAgICAgLyogaWYgc2NvIG9wZW4sIGNsb3NlIHNjbyB0aGVuIHNlbmQgaW5kaWNhdG9yIHZhbHVlcyAqLwotICAgICAgaWYgKChidGFfYWdfc2NvX2lzX29wZW4ocF9zY2IpIHx8IGJ0YV9hZ19zY29faXNfb3BlbmluZyhwX3NjYikpICYmCi0gICAgICAgICAgIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpIHsKLSAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX0NBTExfRU5EOwotICAgICAgICBidGFfYWdfc2NvX2Nsb3NlKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICB9IGVsc2UgaWYgKHBfc2NiLT5wb3N0X3NjbyA9PSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkRfSU5DQUxMKSB7Ci0gICAgICAgIC8qIHNjbyBjbG9zaW5nIGZvciBvdXRnb2luZyBjYWxsIGJlY2F1c2Ugb2YgaW5jb21pbmcgY2FsbCAqLwotICAgICAgICAvKiBTZW5kIG9ubHkgY2FsbHNldHVwIGVuZCBpbmRpY2F0b3IgYWZ0ZXIgc2NvIGNsb3NlICovCi0gICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19DQUxMX0VORDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgcmVzdWx0LnJlc3VsdCk7Ci0KLSAgICAgICAgLyogaWYgYXYgZ290IHN1c3BlbmRlZCBieSB0aGlzIGNhbGwsIGxldCBpdCByZXN1bWUuICovCi0gICAgICAgIGJ0YV9zeXNfc2NvX3VudXNlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0lOQkFORF9SSU5HX1JFUzoKLSAgICAgIHBfc2NiLT5pbmJhbmRfZW5hYmxlZCA9IHJlc3VsdC5kYXRhLnN0YXRlOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiaW5iYW5kX2VuYWJsZWQgc2V0IHRvICVkIiwgcF9zY2ItPmluYmFuZF9lbmFibGVkKTsKLSAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgcmVzdWx0LnJlc3VsdCwgbnVsbHB0ciwgcmVzdWx0LmRhdGEuc3RhdGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19DSU5EX1JFUzoKLSAgICAgIC8qIHN0b3JlIGxvY2FsIHZhbHVlcyAqLwotICAgICAgcF9zY2ItPmNhbGxfaW5kID0gcmVzdWx0LmRhdGEuc3RyWzBdIC0gJzAnOwotICAgICAgcF9zY2ItPmNhbGxzZXR1cF9pbmQgPSByZXN1bHQuZGF0YS5zdHJbMl0gLSAnMCc7Ci0gICAgICBwX3NjYi0+c2VydmljZV9pbmQgPSByZXN1bHQuZGF0YS5zdHJbNF0gLSAnMCc7Ci0gICAgICBwX3NjYi0+c2lnbmFsX2luZCA9IHJlc3VsdC5kYXRhLnN0cls2XSAtICcwJzsKLSAgICAgIHBfc2NiLT5yb2FtX2luZCA9IHJlc3VsdC5kYXRhLnN0cls4XSAtICcwJzsKLSAgICAgIHBfc2NiLT5iYXR0Y2hnX2luZCA9IHJlc3VsdC5kYXRhLnN0clsxMF0gLSAnMCc7Ci0gICAgICBwX3NjYi0+Y2FsbGhlbGRfaW5kID0gcmVzdWx0LmRhdGEuc3RyWzEyXSAtICcwJzsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoImNpbmQgY2FsbDolZCBjYWxsc2V0dXA6JWQiLCBwX3NjYi0+Y2FsbF9pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5jYWxsc2V0dXBfaW5kKTsKLQotICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCByZXN1bHQucmVzdWx0LCByZXN1bHQuZGF0YS5zdHIsIDApOwotICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19CSU5QX1JFUzoKLSAgICBjYXNlIEJUQV9BR19DTlVNX1JFUzoKLSAgICBjYXNlIEJUQV9BR19DTENDX1JFUzoKLSAgICBjYXNlIEJUQV9BR19DT1BTX1JFUzoKLSAgICAgIGlmIChyZXN1bHQuZGF0YS5va19mbGFnICE9IEJUQV9BR19PS19FUlJPUikgewotICAgICAgICBpZiAocmVzdWx0LmRhdGEuc3RyWzBdICE9IDApIHsKLSAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIHJlc3VsdC5yZXN1bHQsIHJlc3VsdC5kYXRhLnN0ciwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0LmRhdGEub2tfZmxhZyA9PSBCVEFfQUdfT0tfRE9ORSkgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIHJlc3VsdC5kYXRhLmVycmNvZGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19VTkFUX1JFUzogewotICAgICAgaWYgKHJlc3VsdC5kYXRhLm9rX2ZsYWcgIT0gQlRBX0FHX09LX0VSUk9SKSB7Ci0gICAgICAgIGlmIChyZXN1bHQuZGF0YS5zdHJbMF0gIT0gMCkgewotICAgICAgICAgIHRCVEFfQUdfQVBJX1JFU1VMVCByZXN1bHRfY29weShyZXN1bHQpOwotICAgICAgICAgIGJ0YV9hZ19wcm9jZXNzX3VuYXRfcmVzKHJlc3VsdF9jb3B5LmRhdGEuc3RyKTsKLSAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCJCVEFfQUdfUkVTIDolcyIsIHJlc3VsdF9jb3B5LmRhdGEuc3RyKTsKLSAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIHJlc3VsdF9jb3B5LnJlc3VsdCwgcmVzdWx0X2NvcHkuZGF0YS5zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQuZGF0YS5va19mbGFnID09IEJUQV9BR19PS19ET05FKSB7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgcmVzdWx0LmRhdGEuZXJyY29kZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9BR19DQUxMX1dBSVRfUkVTOgotICAgICAgaWYgKHBfc2NiLT5jY3dhX2VuYWJsZWQpIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCByZXN1bHQucmVzdWx0LCByZXN1bHQuZGF0YS5zdHIsIDApOwotICAgICAgfQotICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCByZXN1bHQucmVzdWx0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfSU5EX1JFUzoKLSAgICAgIGJ0YV9hZ19zZW5kX2luZChwX3NjYiwgcmVzdWx0LmRhdGEuaW5kLmlkLCByZXN1bHQuZGF0YS5pbmQudmFsdWUsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfSU5EX1JFU19PTl9ERU1BTkQ6Ci0gICAgICBidGFfYWdfc2VuZF9pbmQocF9zY2IsIHJlc3VsdC5kYXRhLmluZC5pZCwgcmVzdWx0LmRhdGEuaW5kLnZhbHVlLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQlZSQV9SRVM6Ci0gICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIHJlc3VsdC5yZXN1bHQsIG51bGxwdHIsIHJlc3VsdC5kYXRhLnN0YXRlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQlRSSF9SRVM6Ci0gICAgICBpZiAocmVzdWx0LmRhdGEub2tfZmxhZyAhPSBCVEFfQUdfT0tfRVJST1IpIHsKLSAgICAgICAgLyogRG9uJ3QgcmVzcG9uZCB0byByZWFkIGlmIG5vdCBpbiByZXNwb25zZSAmIGhvbGQgc3RhdGUgKi8KLSAgICAgICAgaWYgKHJlc3VsdC5kYXRhLm51bSAhPSBCVEFfQUdfQlRSSF9OT19SRVNQKSB7Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCByZXN1bHQucmVzdWx0LCBudWxscHRyLCByZXN1bHQuZGF0YS5udW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBhIHJlc3BvbnNlIHRvIGEgcmVhZCByZXF1ZXN0IHdlIG5lZWQgdG8gc2VuZCBPSyAqLwotICAgICAgICBpZiAocmVzdWx0LmRhdGEub2tfZmxhZyA9PSBCVEFfQUdfT0tfRE9ORSkgewotICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIHJlc3VsdC5kYXRhLmVycmNvZGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19CSU5EX1JFUzogewotICAgICAgLyogRmluZCB3aGV0aGVyIGluZF9pZCBpcyBzdXBwb3J0ZWQgYnkgbG9jYWwgZGV2aWNlIG9yIG5vdCAqLwotICAgICAgaW50IGxvY2FsX2luZGV4ID0gYnRhX2FnX2ZpbmRfaGZfaW5kX2J5X2lkKHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19NQVhfTlVNX0xPQ0FMX0hGX0lORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZGF0YS5pbmQuaWQpOwotICAgICAgaWYgKGxvY2FsX2luZGV4ID09IC0xKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXMgSW52YWxpZCBIRiBJbmRpY2F0b3IgSUQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmluZC5pZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogRmluZCB3aGV0aGVyIGluZF9pZCBpcyBzdXBwb3J0ZWQgYnkgcGVlciBkZXZpY2Ugb3Igbm90ICovCi0gICAgICBpbnQgcGVlcl9pbmRleCA9IGJ0YV9hZ19maW5kX2hmX2luZF9ieV9pZChwX3NjYi0+cGVlcl9oZl9pbmRpY2F0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX01BWF9OVU1fUEVFUl9IRl9JTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZGF0YS5pbmQuaWQpOwotICAgICAgaWYgKHBlZXJfaW5kZXggPT0gLTEpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlcyBJbnZhbGlkIEhGIEluZGljYXRvciBJRCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRhdGEuaW5kLmlkKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB1cHBlciBsYXllciByZXF1ZXN0Ci0gICAgICAgICAgIGNoYW5nZSBjdXJyZW50IHN0YXRlIGFuZCBzZW5kIG91dCB0aGUgcmVzdWx0ICovCi0gICAgICAgIGlmIChwX3NjYi0+bG9jYWxfaGZfaW5kaWNhdG9yc1tsb2NhbF9pbmRleF0uaXNfZW5hYmxlICE9Ci0gICAgICAgICAgICByZXN1bHQuZGF0YS5pbmQub25fZGVtYW5kKSB7Ci0gICAgICAgICAgY2hhciBidWZmZXJbQlRBX0FHX0FUX01BWF9MRU5dID0gezB9OwotICAgICAgICAgIGNoYXIqIHAgPSBidWZmZXI7Ci0KLSAgICAgICAgICBwX3NjYi0+bG9jYWxfaGZfaW5kaWNhdG9yc1tsb2NhbF9pbmRleF0uaXNfZW5hYmxlID0KLSAgICAgICAgICAgICAgcmVzdWx0LmRhdGEuaW5kLm9uX2RlbWFuZDsKLSAgICAgICAgICBwICs9IHV0bF9pdG9hKHJlc3VsdC5kYXRhLmluZC5pZCwgcCk7Ci0gICAgICAgICAgKnArKyA9ICcsJzsKLSAgICAgICAgICBwICs9IHV0bF9pdG9hKHBfc2NiLT5sb2NhbF9oZl9pbmRpY2F0b3JzW2xvY2FsX2luZGV4XS5pc19lbmFibGUsIHApOwotCi0gICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCByZXN1bHQucmVzdWx0LCBidWZmZXIsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICIlcyBIRiBJbmRpY2F0b3IgJWQgYWxyZWFkeSAlcyIsIHJlc3VsdC5kYXRhLmluZC5pZCwKLSAgICAgICAgICAgICAgKHJlc3VsdC5kYXRhLmluZC5vbl9kZW1hbmQpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZXN1bHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBBUEkgcmVzdWx0LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfcmVzdWx0KHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIGlmIChwX3NjYi0+Y29ubl9zZXJ2aWNlID09IEJUQV9BR19IU1ApIHsKLSAgICBidGFfYWdfaHNwX3Jlc3VsdChwX3NjYiwgZGF0YS5hcGlfcmVzdWx0KTsKLSAgfSBlbHNlIHsKLSAgICBidGFfYWdfaGZwX3Jlc3VsdChwX3NjYiwgZGF0YS5hcGlfcmVzdWx0KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NlbmRfYmNzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kICtCQ1MgQVQgY29tbWFuZCB0byBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zZW5kX2Jjcyh0QlRBX0FHX1NDQiogcF9zY2IpIHsKLSAgdWludDE2X3QgY29kZWNfdXVpZDsKLQotICBpZiAocF9zY2ItPmNvZGVjX2ZhbGxiYWNrKSB7Ci0gICAgY29kZWNfdXVpZCA9IFVVSURfQ09ERUNfQ1ZTRDsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKHBfc2NiLT5zY29fY29kZWMpIHsKLSAgICAgIGNhc2UgQlRNX1NDT19DT0RFQ19OT05FOgotICAgICAgICBjb2RlY191dWlkID0gVVVJRF9DT0RFQ19DVlNEOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRNX1NDT19DT0RFQ19DVlNEOgotICAgICAgICBjb2RlY191dWlkID0gVVVJRF9DT0RFQ19DVlNEOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRNX1NDT19DT0RFQ19NU0JDOgotICAgICAgICBjb2RlY191dWlkID0gVVVJRF9DT0RFQ19NU0JDOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoImJ0YV9hZ19zZW5kX2JjczogdW5rbm93biBjb2RlYyAlZCwgdXNlIENWU0QiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zY29fY29kZWMpOwotICAgICAgICBjb2RlY191dWlkID0gVVVJRF9DT0RFQ19DVlNEOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiBzZW5kICtCQ1MgKi8KLSAgQVBQTF9UUkFDRV9ERUJVRygic2VuZCArQkNTIGNvZGVjIGlzICVkIiwgY29kZWNfdXVpZCk7Ci0gIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX0xPQ0FMX1JFU19CQ1MsIG51bGxwdHIsIGNvZGVjX3V1aWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NlbmRfcmluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBSSU5HIHJlc3VsdCBjb2RlIHRvIHBlZXIuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zZW5kX3JpbmcodEJUQV9BR19TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICBpZiAoKHBfc2NiLT5jb25uX3NlcnZpY2UgPT0gQlRBX0FHX0hGUCkgJiYKLSAgICAgIHBfc2NiLT5jYWxsc2V0dXBfaW5kICE9IEJUQV9BR19DQUxMU0VUVVBfSU5DT01JTkcpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZG9uJ3Qgc2VuZCBSSU5HLCBjb25uX3NlcnZpY2U9IgotICAgICAgICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhwX3NjYi0+Y29ubl9zZXJ2aWNlKQotICAgICAgICAgICAgICAgICA8PCAiLCBjYWxsc2V0dXBfaW5kPSIgPDwgc3RkOjp0b19zdHJpbmcocF9zY2ItPmNhbGxzZXR1cF9pbmQpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBzZW5kIFJJTkcgKi8KLSAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfTE9DQUxfUkVTX1JJTkcsIG51bGxwdHIsIDApOwotCi0gIC8qIGlmIEhGUCBhbmQgY2xpcCBlbmFibGVkIGFuZCBjbGlwIGRhdGEgc2VuZCBDTElQICovCi0gIGlmIChwX3NjYi0+Y29ubl9zZXJ2aWNlID09IEJUQV9BR19IRlAgJiYgcF9zY2ItPmNsaXBfZW5hYmxlZCAmJgotICAgICAgcF9zY2ItPmNsaXBbMF0gIT0gMCkgewotICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX0xPQ0FMX1JFU19DTElQLCBwX3NjYi0+Y2xpcCwgMCk7Ci0gIH0KLQotICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5yaW5nX3RpbWVyLCBCVEFfQUdfUklOR19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19SSU5HX1RJTUVPVVRfRVZULCBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19pbnQuaCBiL2J0YS9hZy9idGFfYWdfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZGQ4MDQuLjAwMDAwMDAKLS0tIGEvYnRhL2FnL2J0YV9hZ19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHByaXZhdGUgaW50ZXJmYWNlIGZpbGUgZm9yIHRoZSBCVEEgYXVkaW8gZ2F0ZXdheS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfQUdfSU5UX0gKLSNkZWZpbmUgQlRBX0FHX0lOVF9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2FnL2J0YV9hZ19hdC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGltZSB0byB3YWl0IGZvciByZXRyeSBpbiBjYXNlIG9mIGNvbGxpc2lvbiAqLwotI2lmbmRlZiBCVEFfQUdfQ09MTElTSU9OX1RJTUVPVVRfTVMKLSNkZWZpbmUgQlRBX0FHX0NPTExJU0lPTl9USU1FT1VUX01TICgyICogMTAwMCkgLyogMiBzZWNvbmRzICovCi0jZW5kaWYKLQotLyogUkZDT01NIE1UVSBTSVpFICovCi0jZGVmaW5lIEJUQV9BR19NVFUgMjU2Ci0KLS8qIE1heCBudW1iZXIgb2YgcGVlciBhbmQgbG9jYWwgSEYgaW5kaWNhdG9ycyAqLwotI2RlZmluZSBCVEFfQUdfTUFYX05VTV9QRUVSX0hGX0lORCAyMAotI2RlZmluZSBCVEFfQUdfTUFYX05VTV9MT0NBTF9IRl9JTkQgNAotCi0vKiBJbnRlcm5hbCBwcm9maWxlIGluZGV4ZXMgKi8KLSNkZWZpbmUgQlRBX0FHX0hTUCAwICAgICAvKiBpbmRleCBmb3IgSFNQICovCi0jZGVmaW5lIEJUQV9BR19IRlAgMSAgICAgLyogaW5kZXggZm9yIEhGUCAqLwotI2RlZmluZSBCVEFfQUdfTlVNX0lEWCAyIC8qIG51bWJlciBvZiBwcm9maWxlIGluZGV4ZXMgKi8KLQotLyogcHJvZmlsZSByb2xlIGZvciBjb25uZWN0aW9uICovCi0jZGVmaW5lIEJUQV9BR19BQ1AgMCAvKiBhY2NlcHRlZCBjb25uZWN0aW9uICovCi0jZGVmaW5lIEJUQV9BR19JTlQgMSAvKiBpbml0aWF0aW5nIGNvbm5lY3Rpb24gKi8KLQotI2RlZmluZSBCVEFfQUdfU0RQX0ZFQVRfU1BFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQlRBX0FHX0ZFQVRfM1dBWSB8IEJUQV9BR19GRUFUX0VDTlIgfCBCVEFfQUdfRkVBVF9WUkVDIHwgXAotICAgQlRBX0FHX0ZFQVRfSU5CQU5EIHwgQlRBX0FHX0ZFQVRfVlRBRykKLQotLyogVGltZW91dCBmb3IgYWxhcm0gaW4gMjAxOCB0b3lvdGEgY2FtcnkgY2Fya2l0IHdvcmthcm91bmQgKi8KLSNkZWZpbmUgQlRBX0FHX0JJTkRfVElNRU9VVF9NUyA1MDAKLQotZW51bSB7Ci0gIC8qIHRoZXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSB0aGUgc3RhdGUgbWFjaGluZSAqLwotICBCVEFfQUdfQVBJX1JFR0lTVEVSX0VWVCA9IEJUQV9TWVNfRVZUX1NUQVJUKEJUQV9JRF9BRyksCi0gIEJUQV9BR19BUElfREVSRUdJU1RFUl9FVlQsCi0gIEJUQV9BR19BUElfT1BFTl9FVlQsCi0gIEJUQV9BR19BUElfQ0xPU0VfRVZULAotICBCVEFfQUdfQVBJX0FVRElPX09QRU5fRVZULAotICBCVEFfQUdfQVBJX0FVRElPX0NMT1NFX0VWVCwKLSAgQlRBX0FHX0FQSV9SRVNVTFRfRVZULAotICBCVEFfQUdfQVBJX1NFVENPREVDX0VWVCwKLSAgQlRBX0FHX1JGQ19PUEVOX0VWVCwKLSAgQlRBX0FHX1JGQ19DTE9TRV9FVlQsCi0gIEJUQV9BR19SRkNfU1JWX0NMT1NFX0VWVCwKLSAgQlRBX0FHX1JGQ19EQVRBX0VWVCwKLSAgQlRBX0FHX1NDT19PUEVOX0VWVCwKLSAgQlRBX0FHX1NDT19DTE9TRV9FVlQsCi0gIEJUQV9BR19ESVNDX0FDUF9SRVNfRVZULAotICBCVEFfQUdfRElTQ19JTlRfUkVTX0VWVCwKLSAgQlRBX0FHX0RJU0NfT0tfRVZULAotICBCVEFfQUdfRElTQ19GQUlMX0VWVCwKLSAgQlRBX0FHX1JJTkdfVElNRU9VVF9FVlQsCi0gIEJUQV9BR19TVkNfVElNRU9VVF9FVlQsCi0gIEJUQV9BR19DT0xMSVNJT05fRVZULAotICBCVEFfQUdfTUFYX0VWVCwKLX07Ci0KLS8qIEFjdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIFNDTyBldmVudCAqLwotZW51bSB7Ci0gIEJUQV9BR19QT1NUX1NDT19OT05FLCAgICAgIC8qIG5vIGFjdGlvbiAqLwotICBCVEFfQUdfUE9TVF9TQ09fQ0xPU0VfUkZDLCAvKiBjbG9zZSBSRkNPTU0gY2hhbm5lbCBhZnRlciBTQ08gY2xvc2VzICovCi0gIEJUQV9BR19QT1NUX1NDT19SSU5HLCAgICAgIC8qIHNlbmQgUklORyByZXN1bHQgY29kZSBhZnRlciBTQ08gb3BlbnMgKi8KLSAgQlRBX0FHX1BPU1RfU0NPX0NBTExfQ09OTiwgLyogc2VuZCBjYWxsIGluZGljYXRvcnMgYWZ0ZXIgU0NPIG9wZW5zL2Nsb3NlcyAqLwotICBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9PUklHLCAvKiBzZW5kIGNhbGwgaW5kaWNhdG9ycyBhZnRlciBTQ08gY2xvc2VzICovCi0gIEJUQV9BR19QT1NUX1NDT19DQUxMX0VORCwgIC8qIHNlbmQgY2FsbCBpbmRpY2F0b3JzIGFmdGVyIFNDTyBjbG9zZXMgKi8KLSAgQlRBX0FHX1BPU1RfU0NPX0NBTExfRU5EX0lOQ0FMTCAvKiBzZW5kIGNhbGwgaW5kaWNhdG9ycyBmb3IgZW5kIGNhbGwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGNhbGwgYWZ0ZXIgU0NPIGNsb3NlcyAqLwotfTsKLQotLyogc2NvIHN0YXRlcyAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEJUQV9BR19TQ09fU0hVVERPV05fU1QsICAgLyogbm8gc2NvIGxpc3RlbmluZywgYWxsIHNjbyBjb25uZWN0aW9ucyBjbG9zZWQgKi8KLSAgQlRBX0FHX1NDT19MSVNURU5fU1QsICAgICAvKiBzY28gbGlzdGVuaW5nICovCi0gIEJUQV9BR19TQ09fQ09ERUNfU1QsICAgICAgLyogc2NvIGNvZGVjIG5lZ290aWF0aW9uICovCi0gIEJUQV9BR19TQ09fT1BFTklOR19TVCwgICAgLyogc2NvIGNvbm5lY3Rpb24gb3BlbmluZyAqLwotICBCVEFfQUdfU0NPX09QRU5fQ0xfU1QsICAgIC8qIG9wZW5pbmcgc2NvIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkICovCi0gIEJUQV9BR19TQ09fT1BFTl9YRkVSX1NULCAgLyogb3BlbmluZyBzY28gY29ubmVjdGlvbiBiZWluZyB0cmFuc2ZlcnJlZCAqLwotICBCVEFfQUdfU0NPX09QRU5fU1QsICAgICAgIC8qIHNjbyBvcGVuICovCi0gIEJUQV9BR19TQ09fQ0xPU0lOR19TVCwgICAgLyogc2NvIGNsb3NpbmcgKi8KLSAgQlRBX0FHX1NDT19DTE9TRV9PUF9TVCwgICAvKiBjbG9zaW5nIHNjbyBiZWluZyBvcGVuZWQgKi8KLSAgQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NULCAvKiBjbG9zaW5nIHNjbyBiZWluZyB0cmFuc2ZlcnJlZCAqLwotICBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUICAgIC8qIHNjbyBzaHV0dGluZyBkb3duICovCi19IHRCVEFfQUdfU0NPOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBEYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfQVBJX1JFR0lTVEVSX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyIHBfbmFtZVsyXVtCVEFfU0VSVklDRV9OQU1FX0xFTiArIDFdOwotICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlczsKLSAgdEJUQV9BR19GRUFUIGZlYXR1cmVzOwotICB1aW50OF90IGFwcF9pZDsKLX0gdEJUQV9BR19BUElfUkVHSVNURVI7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FHX0FQSV9PUEVOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci19IHRCVEFfQUdfQVBJX09QRU47Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FHX0FQSV9SRVNVTFRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfQUdfUkVTIHJlc3VsdDsKLSAgdEJUQV9BR19SRVNfREFUQSBkYXRhOwotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCJyZXN1bHQ6JXMiLCBidGFfYWdfcmVzdWx0X3RleHQocmVzdWx0KS5jX3N0cigpKTsKLSAgfQotfSB0QlRBX0FHX0FQSV9SRVNVTFQ7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FHX0FQSV9TRVRDT0RFQ19FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BR19QRUVSX0NPREVDIGNvZGVjOwotfSB0QlRBX0FHX0FQSV9TRVRDT0RFQzsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfRElTQ19SRVNVTFRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHN0YXR1czsKLX0gdEJUQV9BR19ESVNDX1JFU1VMVDsKLQotLyogZGF0YSB0eXBlIGZvciBSRkNPTU0gZXZlbnRzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHBvcnRfaGFuZGxlOwotfSB0QlRBX0FHX1JGQzsKLQotLyogdW5pb24gb2YgYWxsIGV2ZW50IGRhdGF0eXBlcyAqLwotdW5pb24gdEJUQV9BR19EQVRBIHsKLSAgdEJUQV9BR19BUElfUkVHSVNURVIgYXBpX3JlZ2lzdGVyOwotICB0QlRBX0FHX0FQSV9PUEVOIGFwaV9vcGVuOwotICB0QlRBX0FHX0FQSV9SRVNVTFQgYXBpX3Jlc3VsdDsKLSAgdEJUQV9BR19BUElfU0VUQ09ERUMgYXBpX3NldGNvZGVjOwotICB0QlRBX0FHX0RJU0NfUkVTVUxUIGRpc2NfcmVzdWx0OwotICB0QlRBX0FHX1JGQyByZmM7Ci0gIHN0YXRpYyBjb25zdCB0QlRBX0FHX0RBVEEga0VtcHR5OwotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0d28gdEJUQV9BR19EQVRBIGFyZSBlcXVhbCBpbiBtZW1vcnkKLSAgICoKLSAgICogQHBhcmFtIHJocyBvdGhlciB0QlRBX0FHX0RBVEEKLSAgICogQHJldHVybiB0cnVlIGlmIGJvdGggdW5pb25zIGFyZSBlcXVhbCBpbiBtZW1vcnkKLSAgICovCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0QlRBX0FHX0RBVEEmIHJocykgY29uc3QgewotICAgIHJldHVybiAoc3RkOjptZW1jbXAodGhpcywgJnJocywgc2l6ZW9mKHRCVEFfQUdfREFUQSkpID09IDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoaXMgdW5pb24gaXMgZW1wdHkgYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBrRW1wdHkgY29uc3RhbnQKLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdW5pb24gaXMgZW1wdHkKLSAgICovCi0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzID09IGtFbXB0eTsgfQotfTsKLQotLyogdHlwZSBmb3IgZWFjaCBwcm9maWxlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHNkcF9oYW5kbGU7Ci0gIHVpbnQ4X3Qgc2NuOwotfSB0QlRBX0FHX1BST0ZJTEU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HU19UMiA9IDAsIC8qIHByZWZlcnJlZC9kZWZhdWx0IHdoZW4gY29kZWMgaXMgbVNCQyAqLwotICBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDEsCi19IHRCVEFfQUdfU0NPX01TQkNfU0VUVElOR1M7Ci0KLS8qIHR5cGUgZm9yIGVhY2ggc2VydmljZSBjb250cm9sIGJsb2NrICovCi1zdHJ1Y3QgdEJUQV9BR19TQ0IgewotICBjaGFyIGNsaXBbQlRBX0FHX0FUX01BWF9MRU4gKyAxXTsgICAgIC8qIG51bWJlciBzdHJpbmcgdXNlZCBmb3IgQ0xJUCAqLwotICB1aW50MTZfdCBzZXJ2X2hhbmRsZVtCVEFfQUdfTlVNX0lEWF07IC8qIFJGQ09NTSBzZXJ2ZXIgaGFuZGxlcyAqLwotICB0QlRBX0FHX0FUX0NCIGF0X2NiOyAgICAgICAgICAgICAgICAgIC8qIEFUIGNvbW1hbmQgaW50ZXJwcmV0ZXIgKi8KLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7ICAgICAgICAgICAgICAgICAvKiBwZWVyIGJkIGFkZHJlc3MgKi8KLSAgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGlzY19kYjsgICAgICAgICAvKiBwb2ludGVyIHRvIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotICB0QlRBX1NFUlZJQ0VfTUFTSyByZWdfc2VydmljZXM7ICAgICAgIC8qIHNlcnZpY2VzIHNwZWNpZmllZCBpbiByZWdpc3RlciBBUEkgKi8KLSAgdEJUQV9TRVJWSUNFX01BU0sgb3Blbl9zZXJ2aWNlczsgICAgICAvKiBzZXJ2aWNlcyBzcGVjaWZpZWQgaW4gb3BlbiBBUEkgKi8KLSAgdWludDE2X3QgY29ubl9oYW5kbGU7ICAgICAgICAgICAgICAgICAvKiBSRkNPTU0gaGFuZGxlIG9mIGNvbm5lY3RlZCBzZXJ2aWNlICovCi0gIHRCVEFfQUdfRkVBVCBmZWF0dXJlczsgICAgICAgICAgICAgICAgLyogZmVhdHVyZXMgcmVnaXN0ZXJlZCBieSBhcHBsaWNhdGlvbiAqLwotICB0QlRBX0FHX0ZFQVQgbWFza2VkX2ZlYXR1cmVzOyAgICAgICAgIC8qIGxvY2FsIEJSU0YgZmVhdHVyZXMgZm9yIHRoaXMgY29ubmVjdGlvbiAqLwotICB0QlRBX0FHX1BFRVJfRkVBVCBwZWVyX2ZlYXR1cmVzOyAgICAgIC8qIHBlZXIgZGV2aWNlIGZlYXR1cmVzICovCi0gIHVpbnQxNl90IHBlZXJfc2RwX2ZlYXR1cmVzOyAgICAgICAgICAgLyogcGVlciBkZXZpY2UgU0RQIGZlYXR1cmVzICovCi0gIHVpbnQxNl90IHBlZXJfdmVyc2lvbjsgICAgICAgICAgICAgICAgLyogcHJvZmlsZSB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCi0gIHVpbnQxNl90IGhzcF92ZXJzaW9uOyAgICAgICAgICAgICAgICAgLyogSFNQIHByb2ZpbGUgdmVyc2lvbiBiZWZvcmUgU0RQICovCi0gIHVpbnQxNl90IHNjb19pZHg7ICAgICAgICAgICAgICAgICAgICAgLyogU0NPIGhhbmRsZSAqLwotICBib29sIGluX3VzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYiBpbiB1c2UgKi8KLSAgYm9vbCBkZWFsbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHNlcnZpY2Ugc2h1dHRpbmcgZG93biAqLwotICBib29sIGNsaXBfZW5hYmxlZDsgICAgICAgIC8qIHNldCB0byB0cnVlIGlmIEhGIGVuYWJsZXMgQ0xJUCByZXBvcnRpbmcgKi8KLSAgYm9vbCBjY3dhX2VuYWJsZWQ7ICAgICAgICAvKiBzZXQgdG8gdHJ1ZSBpZiBIRiBlbmFibGVzIENDV0EgcmVwb3J0aW5nICovCi0gIGJvb2wgY21lcl9lbmFibGVkOyAgICAgICAgLyogc2V0IHRvIHRydWUgaWYgSEYgZW5hYmxlcyBDTUVSIHJlcG9ydGluZyAqLwotICBib29sIGNtZWVfZW5hYmxlZDsgICAgICAgIC8qIHNldCB0byB0cnVlIGlmIEhGIGVuYWJsZXMgQ01FIEVSUk9SIHJlcG9ydGluZyAqLwotICBib29sIGluYmFuZF9lbmFibGVkOyAgICAgIC8qIHNldCB0byB0cnVlIGlmIGluYmFuZCByaW5nIGVuYWJsZWQgKi8KLSAgYm9vbCBzdmNfY29ubjsgICAgICAgICAgICAvKiBzZXQgdG8gdHJ1ZSB3aGVuIHNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiB1cCAqLwotICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KLSAgdWludDhfdCBjb25uX3NlcnZpY2U7ICAgICAvKiBjb25uZWN0ZWQgc2VydmljZSAqLwotICB1aW50OF90IHBlZXJfc2NuOyAgICAgICAgIC8qIHBlZXIgc2NuICovCi0gIHVpbnQ4X3QgYXBwX2lkOyAgICAgICAgICAgLyogYXBwbGljYXRpb24gaWQgKi8KLSAgdWludDhfdCByb2xlOyAgICAgICAgICAgICAvKiBpbml0aWF0b3IvYWNjZXB0b3Igcm9sZSAqLwotICB1aW50OF90IHBvc3Rfc2NvOyAgICAgICAgIC8qIGFjdGlvbiB0byBwZXJmb3JtIGFmdGVyIHNjbyBldmVudCAqLwotICB1aW50OF90IGNhbGxfaW5kOyAgICAgICAgIC8qIENJRVYgY2FsbCBpbmRpY2F0b3IgdmFsdWUgKi8KLSAgdWludDhfdCBjYWxsc2V0dXBfaW5kOyAgICAvKiBDSUVWIGNhbGxzZXR1cCBpbmRpY2F0b3IgdmFsdWUgKi8KLSAgdWludDhfdCBzZXJ2aWNlX2luZDsgICAgICAvKiBDSUVWIHNlcnZpY2UgaW5kaWNhdG9yIHZhbHVlICovCi0gIHVpbnQ4X3Qgc2lnbmFsX2luZDsgICAgICAgLyogQ0lFViBzaWduYWwgaW5kaWNhdG9yIHZhbHVlICovCi0gIHVpbnQ4X3Qgcm9hbV9pbmQ7ICAgICAgICAgLyogQ0lFViByb2FtIGluZGljYXRvciB2YWx1ZSAqLwotICB1aW50OF90IGJhdHRjaGdfaW5kOyAgICAgIC8qIENJRVYgYmF0dGVyeSBjaGFyZ2UgaW5kaWNhdG9yIHZhbHVlICovCi0gIHVpbnQ4X3QgY2FsbGhlbGRfaW5kOyAgICAgLyogQ0lFViBjYWxsIGhlbGQgaW5kaWNhdG9yIHZhbHVlICovCi0gIHVpbnQzMl90IGJpYV9tYXNrZWRfb3V0OyAgLyogaW5kaWNhdG9ycyBIRiBkb2VzIG5vdCB3YW50IHVzIHRvIHNlbmQgKi8KLSAgYWxhcm1fdCogYmluZF90aW1lcjsgICAgICAvKiBUaW1lciBmb3IgdG95b3RhIGNhbXJ5IDIwMTggY2Fya2l0IHdvcmthcm91bmQgKi8KLSAgYWxhcm1fdCogY29sbGlzaW9uX3RpbWVyOwotICBhbGFybV90KiByaW5nX3RpbWVyOwotICBhbGFybV90KiBjb2RlY19uZWdvdGlhdGlvbl90aW1lcjsKLSAgYm9vbCByZWNlaXZlZF9hdF9iYWM7IC8qIGluZGljYXRlIEFUK0JBQyBpcyByZWNlaXZlZCBhdCBsZWFzdCBvbmNlICovCi0gIHRCVEFfQUdfUEVFUl9DT0RFQyBwZWVyX2NvZGVjczsgLyogY29kZWNzIGZvciBlU0NPIHN1cHBvcnRlZCBieSB0aGUgcGVlciAqLwotICB0QlRBX0FHX1BFRVJfQ09ERUMgc2NvX2NvZGVjOyAgIC8qIGNvZGVjIHRvIGJlIHVzZWQgZm9yIGVTQ08gY29ubmVjdGlvbiAqLwotICB0QlRBX0FHX1BFRVJfQ09ERUMKLSAgICAgIGludXNlX2NvZGVjOyAgICAgLyogY29kZWMgYmVpbmcgdXNlZCBmb3IgdGhlIGN1cnJlbnQgU0NPIGNvbm5lY3Rpb24gKi8KLSAgYm9vbCBjb2RlY191cGRhdGVkOyAgLyogc2V0IHRvIHRydWUgd2hlbmV2ZXIgdGhlIGFwcCB1cGRhdGVzIGNvZGVjIHR5cGUgKi8KLSAgYm9vbCBjb2RlY19mYWxsYmFjazsgLyogSWYgc2NvIG5lZ28gZmFpbHMgZm9yIG1TQkMsIGZhbGxiYWNrIHRvIENWU0QgKi8KLSAgdEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HUwotICAgICAgY29kZWNfbXNiY19zZXR0aW5nczsgLyogc2V0dGluZ3MgdG8gYmUgdXNlZCBmb3IgdGhlIGltcGVuZGluZyBlU0NPICovCi0KLSAgdEJUQV9BR19IRl9JTkQKLSAgICAgIHBlZXJfaGZfaW5kaWNhdG9yc1tCVEFfQUdfTUFYX05VTV9QRUVSX0hGX0lORF07IC8qIFBlZXIgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhGIGluZGljYXRvcnMgKi8KLSAgdEJUQV9BR19IRl9JTkQKLSAgICAgIGxvY2FsX2hmX2luZGljYXRvcnNbQlRBX0FHX01BWF9OVU1fTE9DQUxfSEZfSU5EXTsgLyogTG9jYWwgc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEYgaW5kaWNhdG9ycyAqLwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICJjb2RlY191cGRhdGVkPSVkLCBjb2RlY19mYWxsYmFjaz0lZCwgIgotICAgICAgICAic2NvX2NvZGVjPSVkLCBwZWVyX2NvZGVjPSVkLCBtc2JjX3NldHRpbmdzPSVkLCBkZXZpY2U9JXMiLAotICAgICAgICBjb2RlY191cGRhdGVkLCBjb2RlY19mYWxsYmFjaywgc2NvX2NvZGVjLCBwZWVyX2NvZGVjcywKLSAgICAgICAgY29kZWNfbXNiY19zZXR0aW5ncywgcGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLX07Ci0KLS8qIHR5cGUgZm9yIHNjbyBkYXRhICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVE1fRVNDT19DT05OX1JFUV9FVlRfREFUQSBjb25uX2RhdGE7IC8qIFNDTyBkYXRhIGZvciBwZW5kaW5nIGNvbm4gcmVxdWVzdCAqLwotICB0QlRBX0FHX1NDQiogcF9jdXJyX3NjYjsgIC8qIFNDQiBhc3NvY2lhdGVkIHdpdGggU0NPIGNvbm5lY3Rpb24gKi8KLSAgdEJUQV9BR19TQ0IqIHBfeGZlcl9zY2I7ICAvKiBTQ0IgYXNzb2NpYXRlZCB3aXRoIFNDTyB0cmFuc2ZlciAqLwotICB1aW50MTZfdCBjdXJfaWR4OyAgICAgICAgIC8qIFNDTyBoYW5kbGUgKi8KLSAgdEJUQV9BR19TQ08gc3RhdGU7ICAgICAgICAvKiBTQ08gc3RhdGUgdmFyaWFibGUgKi8KLSAgYm9vbCBpc19sb2NhbDsgICAgICAgICAgICAvKiBTQ08gY29ubmVjdGlvbiBpbml0aWF0ZWQgbG9jYWxseSBvciByZW1vdGVseSAqLwotfSB0QlRBX0FHX1NDT19DQjsKLQotLyogdHlwZSBmb3IgQUcgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0FHX1NDQiBzY2JbQlRBX0FHX01BWF9OVU1fQ0xJRU5UU107IC8qIHNlcnZpY2UgY29udHJvbCBibG9ja3MgKi8KLSAgdEJUQV9BR19QUk9GSUxFIHByb2ZpbGVbQlRBX0FHX05VTV9JRFhdOyAvKiBwcm9maWxlLXNwZWNpZmljIGRhdGEgKi8KLSAgdEJUQV9BR19TQ09fQ0Igc2NvOyAgICAgICAgICAgICAgICAgICAgICAvKiBTQ08gZGF0YSAqLwotICB0QlRBX0FHX0NCQUNLKiBwX2NiYWNrOyAgICAgICAgICAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGNhbGxiYWNrICovCi19IHRCVEFfQUdfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEdsb2JhbCBkYXRhCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogY29uc3RhbnQgbG9va3VwIHRhYmxlcyAqLwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGJ0YV9hZ191dWlkW0JUQV9BR19OVU1fSURYXTsKLWV4dGVybiBjb25zdCB1aW50OF90IGJ0YV9hZ19zZWNfaWRbQlRBX0FHX05VTV9JRFhdOwotZXh0ZXJuIGNvbnN0IHRCVEFfQUdfQVRfQ01EKiBidGFfYWdfYXRfdGJsW0JUQV9BR19OVU1fSURYXTsKLQotLyogY29udHJvbCBibG9jayBkZWNsYXJhdGlvbiAqLwotZXh0ZXJuIHRCVEFfQUdfQ0IgYnRhX2FnX2NiOwotCi0vKiBjb25maWcgc3RydWN0ICovCi1leHRlcm4gY29uc3QgdEJUQV9BR19DRkcqIHBfYnRhX2FnX2NmZzsKLWV4dGVybiBjb25zdCB0QlRBX0FHX0hGX0lORCBidGFfYWdfbG9jYWxfaGZfaW5kX2NmZ1tdOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiBwcm90b3R5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2FnX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKTsKLQotLyogQVBJIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2FnX2FwaV9lbmFibGUodEJUQV9BR19DQkFDSyogcF9jYmFjayk7Ci1leHRlcm4gdm9pZCBidGFfYWdfYXBpX2Rpc2FibGUoKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19hcGlfc2V0X2FjdGl2ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgbmV3X2FjdGl2ZV9kZXZpY2UpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2FwaV9yZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BR19GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHNlcnZpY2VfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19hcGlfcmVzdWx0KHVpbnQxNl90IGhhbmRsZSwgdEJUQV9BR19SRVMgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9BR19SRVNfREFUQSYgcmVzdWx0X2RhdGEpOwotCi0vKiBtYWluIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2FnX3NjYl9kZWFsbG9jKHRCVEFfQUdfU0NCKiBwX3NjYik7Ci1leHRlcm4gdWludDE2X3QgYnRhX2FnX3NjYl90b19pZHgodEJUQV9BR19TQ0IqIHBfc2NiKTsKLWV4dGVybiB0QlRBX0FHX1NDQiogYnRhX2FnX3NjYl9ieV9pZHgodWludDE2X3QgaWR4KTsKLWV4dGVybiB1aW50OF90IGJ0YV9hZ19zZXJ2aWNlX3RvX2lkeCh0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcyk7Ci1leHRlcm4gdWludDE2X3QgYnRhX2FnX2lkeF9ieV9iZGFkZHIoY29uc3QgUmF3QWRkcmVzcyogcGVlcl9hZGRyKTsKLWV4dGVybiBib29sIGJ0YV9hZ19vdGhlcl9zY2Jfb3Blbih0QlRBX0FHX1NDQiogcF9jdXJyX3NjYik7Ci1leHRlcm4gYm9vbCBidGFfYWdfc2NiX29wZW4odEJUQV9BR19TQ0IqIHBfY3Vycl9zY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3NtX2V4ZWN1dGUodEJUQV9BR19TQ0IqIHBfc2NiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfc21fZXhlY3V0ZV9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2NvbGxpc2lvbl9jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3Jlc3VtZV9vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYik7Ci0KLS8qIFNEUCBmdW5jdGlvbnMgKi8KLWV4dGVybiBib29sIGJ0YV9hZ19hZGRfcmVjb3JkKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgY29uc3QgY2hhciogcF9zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjbiwgdEJUQV9BR19GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2RwX2hhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfY3JlYXRlX3JlY29yZHModEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2RlbF9yZWNvcmRzKHRCVEFfQUdfU0NCKiBwX3NjYik7Ci1leHRlcm4gYm9vbCBidGFfYWdfc2RwX2ZpbmRfYXR0cih0QlRBX0FHX1NDQiogcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2UpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2RvX2Rpc2ModEJUQV9BR19TQ0IqIHBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19mcmVlX2RiKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLQotLyogUkZDT01NIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2FnX3N0YXJ0X3NlcnZlcnModEJUQV9BR19TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2Nsb3NlX3NlcnZlcnModEJUQV9BR19TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpOwotZXh0ZXJuIGJvb2wgYnRhX2FnX2lzX3NlcnZlcl9jbG9zZWQodEJUQV9BR19TQ0IqIHBfc2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19yZmNfZG9fY2xvc2UodEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3JmY19kb19vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLQotLyogU0NPIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGJvb2wgYnRhX2FnX3Njb19pc19hY3RpdmVfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRhX2FnX3Njb19pc19vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYik7Ci1leHRlcm4gYm9vbCBidGFfYWdfc2NvX2lzX29wZW5pbmcodEJUQV9BR19TQ0IqIHBfc2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19zY29fY29ubl9yc3AodEJUQV9BR19TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0VTQ09fQ09OTl9SRVFfRVZUX0RBVEEqIGRhdGEpOwotCi0vKiBBVCBjb21tYW5kIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X2hzcF9jYmFjayh0QlRBX0FHX1NDQiogcF9zY2IsIHVpbnQxNl90IGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcmdfdHlwZSwgY2hhciogcF9hcmcsIGNoYXIqIHBfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGludF9hcmcpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X2hmcF9jYmFjayh0QlRBX0FHX1NDQiogcF9zY2IsIHVpbnQxNl90IGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcmdfdHlwZSwgY2hhciogcF9hcmcsIGNoYXIqIHBfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGludF9hcmcpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X2Vycl9jYmFjayh0QlRBX0FHX1NDQiogcF9zY2IsIGJvb2wgdW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcF9hcmcpOwotZXh0ZXJuIGJvb2wgYnRhX2FnX2luYmFuZF9lbmFibGVkKHRCVEFfQUdfU0NCKiBwX3NjYik7Ci1leHRlcm4gdm9pZCBidGFfYWdfc2VuZF9jYWxsX2luZHModEJUQV9BR19TQ0IqIHBfc2NiLCB0QlRBX0FHX1JFUyByZXN1bHQpOwotCi0vKiBBY3Rpb24gZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBidGFfYWdfcmVnaXN0ZXIodEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2RlcmVnaXN0ZXIodEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3N0YXJ0X2RlcmVnKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19zdGFydF9jbG9zZSh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfc3RhcnRfb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfZGlzY19pbnRfcmVzKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19kaXNjX2FjcF9yZXModEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2Rpc2NfZmFpbCh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfb3Blbl9mYWlsKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19yZmNfZmFpbCh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfcmZjX2Nsb3NlKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19yZmNfb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfcmZjX2FjcF9vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19yZmNfZGF0YSh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfc2NvX2xpc3Rlbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfc2NvX29wZW4odEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19jbG9zZSh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfc2NvX3NodXRkb3duKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19zY29fY29ubl9vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hZ19zY29fY29ubl9jbG9zZSh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfcG9zdF9zY29fb3Blbih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfcG9zdF9zY29fY2xvc2UodEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3N2Y19jb25uX29wZW4odEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3Jlc3VsdCh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfc2V0Y29kZWModEJUQV9BR19TQ0IqIHBfc2NiLCBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3NlbmRfcmluZyh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYWdfaGFuZGxlX2NvbGxpc2lvbih0QlRBX0FHX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpOwotCi0vKiBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19jb2RlY19uZWdvKHRCVEFfQUdfU0NCKiBwX3NjYiwgYm9vbCByZXN1bHQpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX2NvZGVjX25lZ290aWF0ZSh0QlRBX0FHX1NDQiogcF9zY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2FnX3NlbmRfYmNzKHRCVEFfQUdfU0NCKiBwX3NjYik7Ci1leHRlcm4gdm9pZCBidGFfYWdfc2V0X3Njb19hbGxvd2VkKGJvb2wgdmFsdWUpOwotZXh0ZXJuIGNvbnN0IFJhd0FkZHJlc3MmIGJ0YV9hZ19nZXRfYWN0aXZlX2RldmljZSgpOwotZXh0ZXJuIHZvaWQgYnRhX2NsZWFyX2FjdGl2ZV9kZXZpY2UoKTsKLQotI2VuZGlmIC8qIEJUQV9BR19JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19tYWluLmNjIGIvYnRhL2FnL2J0YV9hZ19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdlOWQ5Li4wMDAwMDAwCi0tLSBhL2J0YS9hZy9idGFfYWdfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIG1haW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgdGhlIEJUQSBhdWRpbyBnYXRld2F5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRhL2FnL2J0YV9hZ19pbnQuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29uc3RhbnRzIGFuZCB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSB7IEJUQV9BR19JTklUX1NULCBCVEFfQUdfT1BFTklOR19TVCwgQlRBX0FHX09QRU5fU1QsIEJUQV9BR19DTE9TSU5HX1NUIH07Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fU1RSKGNvbnN0KSBcCi0gIGNhc2UgY29uc3Q6ICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29uc3Q7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfYWdfcmVzX3N0cih0QlRBX0FHX1JFUyByZXN1bHQpIHsKLSAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NQS19SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19NSUNfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfSU5CQU5EX1JJTkdfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQ0lORF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19CSU5QX1JFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0lORF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19CVlJBX1JFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0NOVU1fUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQlRSSF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19DTENDX1JFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0NPUFNfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfSU5fQ0FMTF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQ0FMTF9XQUlUX1JFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfT1VUX0NBTExfQUxFUlRfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19DQUxMX0NBTkNFTF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19FTkRfQ0FMTF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19JTl9DQUxMX0hFTERfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfVU5BVF9SRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19NVUxUSV9DQUxMX1JFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0JJTkRfUkVTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfSU5EX1JFU19PTl9ERU1BTkQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBBRyBSZXN1bHQiOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfYWdfZXZ0X3N0cih1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BUElfUkVHSVNURVJfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVBJX0RFUkVHSVNURVJfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVBJX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVBJX0NMT1NFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FQSV9BVURJT19PUEVOX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FQSV9BVURJT19DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BUElfUkVTVUxUX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FQSV9TRVRDT0RFQ19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19SRkNfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19SRkNfQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfUkZDX1NSVl9DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19SRkNfREFUQV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfRElTQ19BQ1BfUkVTX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0RJU0NfSU5UX1JFU19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19ESVNDX09LX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0RJU0NfRkFJTF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19SSU5HX1RJTUVPVVRfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU1ZDX1RJTUVPVVRfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQ09MTElTSU9OX0VWVCkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIEFHIEV2ZW50IjsKLSAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2FnX3N0YXRlX3N0cih1aW50OF90IHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0lOSVRfU1QpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19PUEVOSU5HX1NUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfT1BFTl9TVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0NMT1NJTkdfU1QpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBBRyBTdGF0ZSI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFHIGNvbnRyb2wgYmxvY2sgKi8KLXRCVEFfQUdfQ0IgYnRhX2FnX2NiOwotY29uc3QgdEJUQV9BR19EQVRBIHRCVEFfQUdfREFUQTo6a0VtcHR5ID0ge307Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NiX2FsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBbGxvY2F0ZSBhbiBBRyBzZXJ2aWNlIGNvbnRyb2wgYmxvY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2NiLCBvciBOVUxMIGlmIG5vbmUgY291bGQgYmUgYWxsb2NhdGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUQV9BR19TQ0IqIGJ0YV9hZ19zY2JfYWxsb2Modm9pZCkgewotICB0QlRBX0FHX1NDQiogcF9zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19NQVhfTlVNX0NMSUVOVFM7IGkrKywgcF9zY2IrKykgewotICAgIGlmICghcF9zY2ItPmluX3VzZSkgewotICAgICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KLSAgICAgIHBfc2NiLT5pbl91c2UgPSB0cnVlOwotICAgICAgcF9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7Ci0gICAgICBwX3NjYi0+cmVjZWl2ZWRfYXRfYmFjID0gZmFsc2U7Ci0gICAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IGZhbHNlOwotICAgICAgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrID0gZmFsc2U7Ci0gICAgICBwX3NjYi0+cGVlcl9jb2RlY3MgPSBCVE1fU0NPX0NPREVDX0NWU0Q7Ci0gICAgICBwX3NjYi0+c2NvX2NvZGVjID0gQlRNX1NDT19DT0RFQ19DVlNEOwotICAgICAgcF9zY2ItPnBlZXJfdmVyc2lvbiA9IEhGUF9IU1BfVkVSU0lPTl9VTktOT1dOOwotICAgICAgcF9zY2ItPmhzcF92ZXJzaW9uID0gSFNQX1ZFUlNJT05fMV8yOwotICAgICAgcF9zY2ItPnBlZXJfc2RwX2ZlYXR1cmVzID0gMDsKLSAgICAgIC8qIHNldCB1cCB0aW1lcnMgKi8KLSAgICAgIHBfc2NiLT5yaW5nX3RpbWVyID0gYWxhcm1fbmV3KCJidGFfYWcuc2NiX3JpbmdfdGltZXIiKTsKLSAgICAgIHBfc2NiLT5jb2xsaXNpb25fdGltZXIgPSBhbGFybV9uZXcoImJ0YV9hZy5zY2JfY29sbGlzaW9uX3RpbWVyIik7Ci0gICAgICBwX3NjYi0+Y29kZWNfbmVnb3RpYXRpb25fdGltZXIgPQotICAgICAgICAgIGFsYXJtX25ldygiYnRhX2FnLnNjYl9jb2RlY19uZWdvdGlhdGlvbl90aW1lciIpOwotICAgICAgLyogc2V0IGVTQ08gbVNCQyBzZXR0aW5nIHRvIFQyIGFzIHRoZSBwcmVmZXJyZWQgKi8KLSAgICAgIHBfc2NiLT5jb2RlY19tc2JjX3NldHRpbmdzID0gQlRBX0FHX1NDT19NU0JDX1NFVFRJTkdTX1QyOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2FnX3NjYl9hbGxvYyAlZCIsIGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoaSA9PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSB7Ci0gICAgLyogb3V0IG9mIHNjYnMgKi8KLSAgICBwX3NjYiA9IG51bGxwdHI7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogT3V0IG9mIHNjYnMiLCBfX2Z1bmNfXyk7Ci0gIH0KLSAgcmV0dXJuIHBfc2NiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NjYl9kZWFsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZWFsbG9jYXRlIGEgc2VydmljZSBjb250cm9sIGJsb2NrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2NiX2RlYWxsb2ModEJUQV9BR19TQ0IqIHBfc2NiKSB7Ci0gIHVpbnQ4X3QgaWR4OwotICBib29sIGFsbG9jYXRlZCA9IGZhbHNlOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19zY2JfZGVhbGxvYyAlZCIsIGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSk7Ci0KLSAgLyogc3RvcCBhbmQgZnJlZSB0aW1lcnMgKi8KLSAgYWxhcm1fZnJlZShwX3NjYi0+cmluZ190aW1lcik7Ci0gIGFsYXJtX2ZyZWUocF9zY2ItPmNvZGVjX25lZ290aWF0aW9uX3RpbWVyKTsKLSAgYWxhcm1fZnJlZShwX3NjYi0+Y29sbGlzaW9uX3RpbWVyKTsKLQotICAvKiBpbml0aWFsaXplIGNvbnRyb2wgYmxvY2sgKi8KLSAgKnBfc2NiID0ge307Ci0gIHBfc2NiLT5zY29faWR4ID0gQlRNX0lOVkFMSURfU0NPX0lOREVYOwotCi0gIC8qIElmIGFsbCBzY2JzIGFyZSBkZWFsbG9jYXRlZCwgY2FsbGJhY2sgd2l0aCBkaXNhYmxlIGV2ZW50ICovCi0gIGlmICghYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfQUcpKSB7Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCBCVEFfQUdfTUFYX05VTV9DTElFTlRTOyBpZHgrKykgewotICAgICAgaWYgKGJ0YV9hZ19jYi5zY2JbaWR4XS5pbl91c2UpIHsKLSAgICAgICAgYWxsb2NhdGVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFhbGxvY2F0ZWQpIHsKLSAgICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19ESVNBQkxFX0VWVCwgbnVsbHB0cik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NiX3RvX2lkeAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gYSBwb2ludGVyIHRvIGFuIHNjYiwgcmV0dXJuIGl0cyBpbmRleC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBJbmRleCBvZiBzY2Igc3RhcnRpbmcgZnJvbSAxCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IGJ0YV9hZ19zY2JfdG9faWR4KHRCVEFfQUdfU0NCKiBwX3NjYikgewotICAvKiB1c2UgYXJyYXkgYXJpdGhtZXRpYyB0byBkZXRlcm1pbmUgaW5kZXggKi8KLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihwX3NjYiAtIGJ0YV9hZ19jYi5zY2IgKyAxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY2JfYnlfaWR4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiBhbiBzY2IgaW5kZXggcmV0dXJuIHBvaW50ZXIgdG8gc2NiLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gc2NiIG9yIE5VTEwgaWYgbm90IGFsbG9jYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9BR19TQ0IqIGJ0YV9hZ19zY2JfYnlfaWR4KHVpbnQxNl90IGlkeCkgewotICB0QlRBX0FHX1NDQiogcF9zY2I7Ci0KLSAgLyogdmVyaWZ5IGluZGV4ICovCi0gIGlmIChpZHggPiAwICYmIGlkeCA8PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSB7Ci0gICAgcF9zY2IgPSAmYnRhX2FnX2NiLnNjYltpZHggLSAxXTsKLSAgICBpZiAoIXBfc2NiLT5pbl91c2UpIHsKLSAgICAgIHBfc2NiID0gbnVsbHB0cjsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiYWcgc2NiIGlkeCAlZCBub3QgYWxsb2NhdGVkIiwgaWR4KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcF9zY2IgPSBudWxscHRyOwotICAgIEFQUExfVFJBQ0VfREVCVUcoImFnIHNjYiBpZHggJWQgb3V0IG9mIHJhbmdlIiwgaWR4KTsKLSAgfQotICByZXR1cm4gcF9zY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2VydmljZV90b19pZHgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIGEgQlRBIHNlcnZpY2UgbWFzayBjb252ZXJ0IHRvIHByb2ZpbGUgaW5kZXguCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgUHJvZmlsZSBuZGV4IG9mIHNjYi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBidGFfYWdfc2VydmljZV90b19pZHgodEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpIHsKLSAgaWYgKHNlcnZpY2VzICYgQlRBX0hGUF9TRVJWSUNFX01BU0spIHsKLSAgICByZXR1cm4gQlRBX0FHX0hGUDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gQlRBX0FHX0hTUDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2lkeF9ieV9iZGFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgU0NCIGFzc29jaWF0ZWQgd2l0aCBwZWVyIEJEIGFkZHJlc3MuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgSW5kZXggb2YgU0NCIG9yIHplcm8gaWYgbm9uZSBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgYnRhX2FnX2lkeF9ieV9iZGFkZHIoY29uc3QgUmF3QWRkcmVzcyogcGVlcl9hZGRyKSB7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOwotICBpZiAocGVlcl9hZGRyICE9IG51bGxwdHIpIHsKLSAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgQlRBX0FHX01BWF9OVU1fQ0xJRU5UUzsgaSsrLCBwX3NjYisrKSB7Ci0gICAgICBpZiAocF9zY2ItPmluX3VzZSAmJiAqcGVlcl9hZGRyID09IHBfc2NiLT5wZWVyX2FkZHIpIHsKLSAgICAgICAgcmV0dXJuIChpICsgMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogbm8gc2NiIGZvdW5kICovCi0gIEFQUExfVFJBQ0VfV0FSTklORygiTm8gYWcgc2NiIGZvciBwZWVyIGFkZHIiKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfb3RoZXJfc2NiX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHdoZXRoZXIgYW55IG90aGVyIHNjYiBpcyBpbiBvcGVuIHN0YXRlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYW5vdGhlciBzY2IgaXMgaW4gb3BlbiBzdGF0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9hZ19vdGhlcl9zY2Jfb3Blbih0QlRBX0FHX1NDQiogcF9jdXJyX3NjYikgewotICB0QlRBX0FHX1NDQiogcF9zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQUdfTUFYX05VTV9DTElFTlRTOyBpKyssIHBfc2NiKyspIHsKLSAgICBpZiAocF9zY2ItPmluX3VzZSAmJiBwX3NjYiAhPSBwX2N1cnJfc2NiICYmCi0gICAgICAgIHBfc2NiLT5zdGF0ZSA9PSBCVEFfQUdfT1BFTl9TVCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIC8qIG5vIG90aGVyIHNjYiBmb3VuZCAqLwotICBBUFBMX1RSQUNFX0RFQlVHKCJObyBvdGhlciBhZyBzY2Igb3BlbiIpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NiX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHdoZXRoZXIgZ2l2ZW4gc2NiIGlzIGluIG9wZW4gc3RhdGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY2IgaXMgaW4gb3BlbiBzdGF0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9hZ19zY2Jfb3Blbih0QlRBX0FHX1NDQiogcF9jdXJyX3NjYikgewotICByZXR1cm4gcF9jdXJyX3NjYiAmJiBwX2N1cnJfc2NiLT5pbl91c2UgJiYKLSAgICAgICAgIHBfY3Vycl9zY2ItPnN0YXRlID09IEJUQV9BR19PUEVOX1NUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NvbGxpc2lvbl9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IG5vdGlmaWVkIGFib3V0IGNvbGxpc2lvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2NvbGxpc2lvbl9jYmFjayhVTlVTRURfQVRUUiB0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIC8qIENoZWNrIGlmIHdlIGhhdmUgb3BlbmluZyBzY2IgZm9yIHRoZSBwZWVyIGRldmljZS4gKi8KLSAgdWludDE2X3QgaGFuZGxlID0gYnRhX2FnX2lkeF9ieV9iZGFkZHIoJnBlZXJfYWRkcik7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGhhbmRsZSk7Ci0KLSAgaWYgKHBfc2NiICYmIChwX3NjYi0+c3RhdGUgPT0gQlRBX0FHX09QRU5JTkdfU1QpKSB7Ci0gICAgaWYgKGlkID09IEJUQV9JRF9TWVMpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBBRyBmb3VuZCBjb2xsaXNpb24gKEFDTCkgZm9yIGhhbmRsZSAiCi0gICAgICAgICAgICAgICAgICAgPDwgdW5zaWduZWQoaGFuZGxlKSA8PCAiIGRldmljZSAiIDw8IHBlZXJfYWRkcjsKLSAgICB9IGVsc2UgaWYgKGlkID09IEJUQV9JRF9BRykgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEFHIGZvdW5kIGNvbGxpc2lvbiAoUkZDT01NKSBmb3IgaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgICA8PCB1bnNpZ25lZChoYW5kbGUpIDw8ICIgZGV2aWNlICIgPDwgcGVlcl9hZGRyOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQUcgZm91bmQgY29sbGlzaW9uIChVTktOT1dOKSBmb3IgaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgICA8PCB1bnNpZ25lZChoYW5kbGUpIDw8ICIgZGV2aWNlICIgPDwgcGVlcl9hZGRyOwotICAgIH0KLSAgICBidGFfYWdfc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FHX0NPTExJU0lPTl9FVlQsIHRCVEFfQUdfREFUQTo6a0VtcHR5KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Jlc3VtZV9vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXN1bWUgb3BlbmluZyBwcm9jZXNzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfcmVzdW1lX29wZW4odEJUQV9BR19TQ0IqIHBfc2NiKSB7Ci0gIGlmIChwX3NjYi0+c3RhdGUgPT0gQlRBX0FHX0lOSVRfU1QpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogUmVzdW1lIGNvbm5lY3Rpb24gdG8gIiA8PCBwX3NjYi0+cGVlcl9hZGRyCi0gICAgICAgICAgICAgIDw8ICIsIGhhbmRsZSIgPDwgYnRhX2FnX3NjYl90b19pZHgocF9zY2IpOwotICAgIHRCVEFfQUdfREFUQSBvcGVuX2RhdGEgPSB7LmFwaV9vcGVuID0gey5iZF9hZGRyID0gcF9zY2ItPnBlZXJfYWRkcn19OwotICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBCVEFfQUdfQVBJX09QRU5fRVZULCBvcGVuX2RhdGEpOwotICB9IGVsc2UgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlICIgPDwgcF9zY2ItPnBlZXJfYWRkcgotICAgICAgICAgICAgPDwgIiBpcyBhbHJlYWR5IGluIHN0YXRlICIgPDwgc3RkOjp0b19zdHJpbmcocF9zY2ItPnN0YXRlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2FwaV9lbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhbiBBUEkgZW5hYmxlIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfYXBpX2VuYWJsZSh0QlRBX0FHX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIC8qIGluaXRpYWxpemUgY29udHJvbCBibG9jayAqLwotICBmb3IgKHRCVEFfQUdfU0NCJiBzY2IgOiBidGFfYWdfY2Iuc2NiKSB7Ci0gICAgYWxhcm1fZnJlZShzY2IucmluZ190aW1lcik7Ci0gICAgYWxhcm1fZnJlZShzY2IuY29kZWNfbmVnb3RpYXRpb25fdGltZXIpOwotICAgIGFsYXJtX2ZyZWUoc2NiLmNvbGxpc2lvbl90aW1lcik7Ci0gICAgc2NiID0ge307Ci0gIH0KLQotICAvKiBzdG9yZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotICBidGFfYWdfY2IucF9jYmFjayA9IHBfY2JhY2s7Ci0KLSAgLyogY2FsbCBpbml0IGNhbGwtb3V0ICovCi0gIEJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MoQUdfVk9JQ0VfU0VUVElOR1MpOwotCi0gIGJ0YV9zeXNfY29sbGlzaW9uX3JlZ2lzdGVyKEJUQV9JRF9BRywgYnRhX2FnX2NvbGxpc2lvbl9jYmFjayk7Ci0KLSAgLyogY2FsbCBjYWxsYmFjayB3aXRoIGVuYWJsZSBldmVudCAqLwotICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShCVEFfQUdfRU5BQkxFX0VWVCwgbnVsbHB0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXBpX2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhbiBBUEkgZGlzYWJsZSBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2FwaV9kaXNhYmxlKCkgewotICAvKiBkZXJlZ2lzdGVyIGFsbCBzY2JzIGluIHVzZSAqLwotICB0QlRBX0FHX1NDQiogcF9zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsKLSAgYm9vbCBkb19kZXJlZyA9IGZhbHNlOwotICBpbnQgaTsKLQotICBpZiAoIWJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0FHKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIkJUQSBBRyBpcyBhbHJlYWR5IGRpc2FibGVkLCBpZ25vcmluZyAuLi4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBEZS1yZWdpc3RlciB3aXRoIEJUQSBzeXN0ZW0gbWFuYWdlciAqLwotICBidGFfc3lzX2RlcmVnaXN0ZXIoQlRBX0lEX0FHKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX01BWF9OVU1fQ0xJRU5UUzsgaSsrLCBwX3NjYisrKSB7Ci0gICAgaWYgKHBfc2NiLT5pbl91c2UpIHsKLSAgICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBCVEFfQUdfQVBJX0RFUkVHSVNURVJfRVZULCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gICAgICBkb19kZXJlZyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFkb19kZXJlZykgewotICAgIC8qIERvbmUsIHNlbmQgY2FsbGJhY2sgZXZ0IHRvIGFwcCAqLwotICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19ESVNBQkxFX0VWVCwgbnVsbHB0cik7Ci0gIH0KLQotICBidGFfc3lzX2NvbGxpc2lvbl9yZWdpc3RlcihCVEFfSURfQUcsIG51bGxwdHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2FwaV9yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIEFQSSBldmVudCByZWdpc3RlcnMgYSBuZXcgc2VydmljZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2FwaV9yZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywgdEJUQV9BR19GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc2VydmljZV9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCkgewotICB0QlRBX0FHX1NDQiogcF9zY2IgPSBidGFfYWdfc2NiX2FsbG9jKCk7Ci0gIGlmIChwX3NjYikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9hZ19hcGlfcmVnaXN0ZXI6IHBfc2NiIDB4JTA4eCAiLCBwX3NjYik7Ci0gICAgdEJUQV9BR19EQVRBIGRhdGEgPSB7fTsKLSAgICBkYXRhLmFwaV9yZWdpc3Rlci5mZWF0dXJlcyA9IGZlYXR1cmVzOwotICAgIGRhdGEuYXBpX3JlZ2lzdGVyLnNlcnZpY2VzID0gc2VydmljZXM7Ci0gICAgZGF0YS5hcGlfcmVnaXN0ZXIuYXBwX2lkID0gYXBwX2lkOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFg7IGkrKykgewotICAgICAgaWYgKCFzZXJ2aWNlX25hbWVzW2ldLmVtcHR5KCkpIHsKLSAgICAgICAgc3RybGNweShkYXRhLmFwaV9yZWdpc3Rlci5wX25hbWVbaV0sIHNlcnZpY2VfbmFtZXNbaV0uY19zdHIoKSwKLSAgICAgICAgICAgICAgICBCVEFfU0VSVklDRV9OQU1FX0xFTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkYXRhLmFwaV9yZWdpc3Rlci5wX25hbWVbaV1bMF0gPSAwOwotICAgICAgfQotICAgIH0KLSAgICBidGFfYWdfc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FHX0FQSV9SRUdJU1RFUl9FVlQsIGRhdGEpOwotICB9IGVsc2UgewotICAgIHRCVEFfQUcgYnRhX2FnID0ge307Ci0gICAgYnRhX2FnLnJlZy5zdGF0dXMgPSBCVEFfQUdfRkFJTF9SRVNPVVJDRVM7Ci0gICAgKCpidGFfYWdfY2IucF9jYmFjaykoQlRBX0FHX1JFR0lTVEVSX0VWVCwgJmJ0YV9hZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hcGlfcmVzdWx0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gQVBJIHJlc3VsdCBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2FwaV9yZXN1bHQodWludDE2X3QgaGFuZGxlLCB0QlRBX0FHX1JFUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfUkVTX0RBVEEmIHJlc3VsdF9kYXRhKSB7Ci0gIHRCVEFfQUdfREFUQSBldmVudF9kYXRhID0ge307Ci0gIGV2ZW50X2RhdGEuYXBpX3Jlc3VsdC5yZXN1bHQgPSByZXN1bHQ7Ci0gIGV2ZW50X2RhdGEuYXBpX3Jlc3VsdC5kYXRhID0gcmVzdWx0X2RhdGE7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYjsKLSAgaWYgKGhhbmRsZSAhPSBCVEFfQUdfSEFORExFX0FMTCkgewotICAgIHBfc2NiID0gYnRhX2FnX3NjYl9ieV9pZHgoaGFuZGxlKTsKLSAgICBpZiAocF9zY2IpIHsKLSAgICAgIExPR19ERUJVRygiQXVkaW8gZ2F0ZXdheSBldmVudCBmb3Igb25lIGNsaWVudCBoYW5kbGU6JWh1IHNjYjolcyIsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICBwX3NjYi0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBzdGF0aWNfY2FzdDx1aW50MTZfdD4oQlRBX0FHX0FQSV9SRVNVTFRfRVZUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfV0FSTigKLSAgICAgICAgICAiUmVjZWl2ZWQgYXVkaW8gZ2F0ZXdheSBldmVudCBmb3IgdW5rbm93biBBRyBjb250cm9sIGJsb2NrICIKLSAgICAgICAgICAiaGFuZGxlOiVodSIsCi0gICAgICAgICAgaGFuZGxlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMCwgcF9zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsgaSA8IEJUQV9BR19NQVhfTlVNX0NMSUVOVFM7Ci0gICAgICAgICBpKyssIHBfc2NiKyspIHsKLSAgICAgIGlmIChwX3NjYi0+aW5fdXNlICYmIHBfc2NiLT5zdmNfY29ubikgewotICAgICAgICBMT0dfREVCVUcoIkF1ZGlvIGdhdGV3YXkgZXZlbnQgZm9yIGFsbCBjbGllbnRzIHNjYjolcyIsCi0gICAgICAgICAgICAgICAgICBwX3NjYi0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgYnRhX2FnX3NtX2V4ZWN1dGUocF9zY2IsIHN0YXRpY19jYXN0PHVpbnQxNl90PihCVEFfQUdfQVBJX1JFU1VMVF9FVlQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9kYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2FnX2JldHRlcl9zdGF0ZV9tYWNoaW5lKHRCVEFfQUdfU0NCKiBwX3NjYiwgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIHN3aXRjaCAocF9zY2ItPnN0YXRlKSB7Ci0gICAgY2FzZSBCVEFfQUdfSU5JVF9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfQUdfQVBJX1JFR0lTVEVSX0VWVDoKLSAgICAgICAgICBidGFfYWdfcmVnaXN0ZXIocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19BUElfREVSRUdJU1RFUl9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX2RlcmVnaXN0ZXIocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19BUElfT1BFTl9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FHX09QRU5JTkdfU1Q7Ci0gICAgICAgICAgYnRhX2FnX3N0YXJ0X29wZW4ocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19SRkNfT1BFTl9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FHX09QRU5fU1Q7Ci0gICAgICAgICAgYnRhX2FnX3JmY19hY3Bfb3BlbihwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnRhX2FnX3Njb19saXN0ZW4ocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX3Njb19jb25uX29wZW4ocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRVZUOgotICAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9jbG9zZShwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0RJU0NfQUNQX1JFU19FVlQ6Ci0gICAgICAgICAgYnRhX2FnX2ZyZWVfZGIocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIExPR19FUlJPUigidW5rbm93biBldmVudCAlZCBhdCBzdGF0ZSAlZCIsIGV2ZW50LCBwX3NjYi0+c3RhdGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQUdfT1BFTklOR19TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfQUdfQVBJX0RFUkVHSVNURVJfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BR19DTE9TSU5HX1NUOwotICAgICAgICAgIGJ0YV9hZ19yZmNfZG9fY2xvc2UocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJ0YV9hZ19zdGFydF9kZXJlZyhwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0FQSV9PUEVOX0VWVDoKLSAgICAgICAgICBidGFfYWdfb3Blbl9mYWlsKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfQVBJX0NMT1NFX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQUdfQ0xPU0lOR19TVDsKLSAgICAgICAgICBidGFfYWdfcmZjX2RvX2Nsb3NlKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfUkZDX09QRU5fRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BR19PUEVOX1NUOwotICAgICAgICAgIGJ0YV9hZ19yZmNfb3BlbihwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnRhX2FnX3Njb19saXN0ZW4ocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19SRkNfQ0xPU0VfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BR19JTklUX1NUOwotICAgICAgICAgIGJ0YV9hZ19yZmNfZmFpbChwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19PUEVOX0VWVDoKLSAgICAgICAgICBidGFfYWdfc2NvX2Nvbm5fb3BlbihwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX3Njb19jb25uX2Nsb3NlKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfRElTQ19JTlRfUkVTX0VWVDoKLSAgICAgICAgICBidGFfYWdfZGlzY19pbnRfcmVzKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfRElTQ19PS19FVlQ6Ci0gICAgICAgICAgYnRhX2FnX3JmY19kb19vcGVuKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfRElTQ19GQUlMX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQUdfSU5JVF9TVDsKLSAgICAgICAgICBidGFfYWdfZGlzY19mYWlsKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfQ09MTElTSU9OX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQUdfSU5JVF9TVDsKLSAgICAgICAgICBidGFfYWdfaGFuZGxlX2NvbGxpc2lvbihwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTE9HX0VSUk9SKCJ1bmtub3duIGV2ZW50ICVkIGF0IHN0YXRlICVkIiwgZXZlbnQsIHBfc2NiLT5zdGF0ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BR19PUEVOX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9BR19BUElfREVSRUdJU1RFUl9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FHX0NMT1NJTkdfU1Q7Ci0gICAgICAgICAgYnRhX2FnX3N0YXJ0X2Nsb3NlKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBidGFfYWdfc3RhcnRfZGVyZWcocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19BUElfT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX29wZW5fZmFpbChwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FHX0NMT1NJTkdfU1Q7Ci0gICAgICAgICAgYnRhX2FnX3N0YXJ0X2Nsb3NlKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfQVBJX0FVRElPX09QRU5fRVZUOgotICAgICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0FQSV9BVURJT19DTE9TRV9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX3Njb19jbG9zZShwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0FQSV9SRVNVTFRfRVZUOgotICAgICAgICAgIGJ0YV9hZ19yZXN1bHQocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19BUElfU0VUQ09ERUNfRVZUOgotICAgICAgICAgIGJ0YV9hZ19zZXRjb2RlYyhwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1JGQ19DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FHX0lOSVRfU1Q7Ci0gICAgICAgICAgYnRhX2FnX3JmY19jbG9zZShwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1JGQ19EQVRBX0VWVDoKLSAgICAgICAgICBidGFfYWdfcmZjX2RhdGEocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX3Njb19jb25uX29wZW4ocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJ0YV9hZ19wb3N0X3Njb19vcGVuKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0VWVDoKLSAgICAgICAgICBidGFfYWdfc2NvX2Nvbm5fY2xvc2UocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJ0YV9hZ19wb3N0X3Njb19jbG9zZShwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0RJU0NfQUNQX1JFU19FVlQ6Ci0gICAgICAgICAgYnRhX2FnX2Rpc2NfYWNwX3JlcyhwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1JJTkdfVElNRU9VVF9FVlQ6Ci0gICAgICAgICAgYnRhX2FnX3NlbmRfcmluZyhwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NWQ19USU1FT1VUX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQUdfQ0xPU0lOR19TVDsKLSAgICAgICAgICBidGFfYWdfc3RhcnRfY2xvc2UocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIExPR19FUlJPUigidW5rbm93biBldmVudCAlZCBhdCBzdGF0ZSAlZCIsIGV2ZW50LCBwX3NjYi0+c3RhdGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQUdfQ0xPU0lOR19TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfQUdfQVBJX0RFUkVHSVNURVJfRVZUOgotICAgICAgICAgIGJ0YV9hZ19zdGFydF9kZXJlZyhwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0FQSV9PUEVOX0VWVDoKLSAgICAgICAgICBidGFfYWdfb3Blbl9mYWlsKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfUkZDX0NMT1NFX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQUdfSU5JVF9TVDsKLSAgICAgICAgICBidGFfYWdfcmZjX2Nsb3NlKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fRVZUOgotICAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9vcGVuKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0VWVDoKLSAgICAgICAgICBidGFfYWdfc2NvX2Nvbm5fY2xvc2UocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJ0YV9hZ19wb3N0X3Njb19jbG9zZShwX3NjYiwgZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FHX0RJU0NfQUNQX1JFU19FVlQ6Ci0gICAgICAgICAgYnRhX2FnX2ZyZWVfZGIocF9zY2IsIGRhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BR19ESVNDX0lOVF9SRVNfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BR19JTklUX1NUOwotICAgICAgICAgIGJ0YV9hZ19mcmVlX2RiKHBfc2NiLCBkYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfRVJST1IoInVua25vd24gZXZlbnQgJWQgYXQgc3RhdGUgJWQiLCBldmVudCwgcF9zY2ItPnN0YXRlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc21fZXhlY3V0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhdGUgbWFjaGluZSBldmVudCBoYW5kbGluZyBmdW5jdGlvbiBmb3IgQUcKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3NtX2V4ZWN1dGUodEJUQV9BR19TQ0IqIHBfc2NiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIHVpbnQxNl90IHByZXZpb3VzX2V2ZW50ID0gZXZlbnQ7Ci0gIHVpbnQ4X3QgcHJldmlvdXNfc3RhdGUgPSBwX3NjYi0+c3RhdGU7Ci0KLSAgTE9HX0RFQlVHKAotICAgICAgIkV4ZWN1dGUgQUcgZXZlbnQgaGFuZGxlOjB4JTA0eCBiZF9hZGRyOiVzIHN0YXRlOiVzWzB4JTAyeF0iCi0gICAgICAiIGV2ZW50OiVzWzB4JTA0eF0gcmVzdWx0OiVzWzB4JTAyeF0iLAotICAgICAgYnRhX2FnX3NjYl90b19pZHgocF9zY2IpLCBQUklWQVRFX0FERFJFU1MocF9zY2ItPnBlZXJfYWRkciksCi0gICAgICBidGFfYWdfc3RhdGVfc3RyKHBfc2NiLT5zdGF0ZSksIHBfc2NiLT5zdGF0ZSwgYnRhX2FnX2V2dF9zdHIoZXZlbnQpLAotICAgICAgZXZlbnQsIGJ0YV9hZ19yZXNfc3RyKGRhdGEuYXBpX3Jlc3VsdC5yZXN1bHQpLCBkYXRhLmFwaV9yZXN1bHQucmVzdWx0KTsKLQotICBidGFfYWdfYmV0dGVyX3N0YXRlX21hY2hpbmUocF9zY2IsIGV2ZW50LCBkYXRhKTsKLQotICBpZiAocF9zY2ItPnN0YXRlICE9IHByZXZpb3VzX3N0YXRlKSB7Ci0gICAgTE9HX0RFQlVHKAotICAgICAgICAiU3RhdGUgY2hhbmdlZCBoYW5kbGU6MHglMDR4IGJkX2FkZHI6JXMgIgotICAgICAgICAic3RhdGVfY2hhbmdlOiVzWzB4JTAyeF0tPiVzWzB4JTAyeF0iCi0gICAgICAgICIgZXZlbnQ6JXNbMHglMDR4XSByZXN1bHQ6JXNbMHglMDJ4XSIsCi0gICAgICAgIGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSwgUFJJVkFURV9BRERSRVNTKHBfc2NiLT5wZWVyX2FkZHIpLAotICAgICAgICBidGFfYWdfc3RhdGVfc3RyKHByZXZpb3VzX3N0YXRlKSwgcHJldmlvdXNfc3RhdGUsCi0gICAgICAgIGJ0YV9hZ19zdGF0ZV9zdHIocF9zY2ItPnN0YXRlKSwgcF9zY2ItPnN0YXRlLAotICAgICAgICBidGFfYWdfZXZ0X3N0cihwcmV2aW91c19ldmVudCksIHByZXZpb3VzX2V2ZW50LAotICAgICAgICBidGFfYWdfcmVzX3N0cihkYXRhLmFwaV9yZXN1bHQucmVzdWx0KSwgZGF0YS5hcGlfcmVzdWx0LnJlc3VsdCk7Ci0gIH0KLX0KLQotdm9pZCBidGFfYWdfc21fZXhlY3V0ZV9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICB0QlRBX0FHX1NDQiogcF9zY2IgPSBidGFfYWdfc2NiX2J5X2lkeChoYW5kbGUpOwotICBpZiAocF9zY2IpIHsKLSAgICBMT0dfREVCVUcoIkFHIHN0YXRlIG1hY2hpbmUgZXZlbnQ6JXNbMHglMDR4XSBoYW5kbGU6MHglMDR4IiwKLSAgICAgICAgICAgICAgYnRhX2FnX2V2dF9zdHIoZXZlbnQpLCBldmVudCwgaGFuZGxlKTsKLSAgICBidGFfYWdfc21fZXhlY3V0ZShwX3NjYiwgZXZlbnQsIGRhdGEpOwotICB9Ci19Ci0KLS8qKgotICogSGFuZGxlcyBldmVudCBmcm9tIGJ0YV9zeXNfc2VuZG1zZygpLiBJdCBpcyBoZXJlIHRvIHN1cHBvcnQgbGVnYWN5IGFsYXJtCi0gKiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1haW5seSBmb3IgdGltZW91dHMuCi0gKgotICogQHBhcmFtIHBfbXNnIGV2ZW50IG1lc3NhZ2UKLSAqIEByZXR1cm4gVHJ1ZSB0byBmcmVlIHBfbXNnLCBvciBGYWxzZSBpZiBwX21zZyBpcyBmcmVlZCB3aXRoaW4gdGhpcyBmdW5jdGlvbgotICovCi1ib29sIGJ0YV9hZ19oZGxfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZykgewotICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkgewotICAgIGNhc2UgQlRBX0FHX1JJTkdfVElNRU9VVF9FVlQ6Ci0gICAgY2FzZSBCVEFfQUdfU1ZDX1RJTUVPVVRfRVZUOgotICAgICAgYnRhX2FnX3NtX2V4ZWN1dGVfYnlfaGFuZGxlKHBfbXNnLT5sYXllcl9zcGVjaWZpYywgcF9tc2ctPmV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfREFUQTo6a0VtcHR5KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IGJhZCBldmVudCAiIDw8IHBfbXNnLT5ldmVudAotICAgICAgICAgICAgICAgICA8PCAiIGxheWVyX3NwZWNpZmljPSIgPDwgcF9tc2ctPmxheWVyX3NwZWNpZmljOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX3JmYy5jYyBiL2J0YS9hZy9idGFfYWdfcmZjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA4ZTI1Li4wMDAwMDAwCi0tLSBhL2J0YS9hZy9idGFfYWdfcmZjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhdWRpbyBnYXRld2F5IGZ1bmN0aW9ucyBjb250cm9sbGluZyB0aGUgUkZDT01NCi0gKiAgY29ubmVjdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgImJ0YS9hZy9idGFfYWdfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIEV2ZW50IG1hc2sgZm9yIFJmQ09NTSBwb3J0IGNhbGxiYWNrICovCi0jZGVmaW5lIEJUQV9BR19QT1JUX0VWX01BU0sgUE9SVF9FVl9SWENIQVIKLQotLyogZWFjaCBzY2IgaGFzIGl0cyBvd24gcmZjb21tIGNhbGxiYWNrcyAqLwotdm9pZCBidGFfYWdfcG9ydF9jYmFja18xKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKLXZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfMih1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSk7Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzModWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwotdm9pZCBidGFfYWdfcG9ydF9jYmFja180KHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKLXZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfNSh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSk7Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzYodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwotdm9pZCBidGFfYWdfbWdtdF9jYmFja18xKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMih1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSk7Ci12b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzModWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwotdm9pZCBidGFfYWdfbWdtdF9jYmFja180KHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfNSh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSk7Ci12b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzYodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwotCi0vKiByZmNvbW0gY2FsbGJhY2sgZnVuY3Rpb24gdGFibGVzICovCi10eXBlZGVmIHRQT1JUX0NBTExCQUNLKiB0QlRBX0FHX1BPUlRfQ0JBQ0s7Ci1jb25zdCB0QlRBX0FHX1BPUlRfQ0JBQ0sgYnRhX2FnX3BvcnRfY2JhY2tfdGJsW10gPSB7Ci0gICAgYnRhX2FnX3BvcnRfY2JhY2tfMSwgYnRhX2FnX3BvcnRfY2JhY2tfMiwgYnRhX2FnX3BvcnRfY2JhY2tfMywKLSAgICBidGFfYWdfcG9ydF9jYmFja180LCBidGFfYWdfcG9ydF9jYmFja181LCBidGFfYWdfcG9ydF9jYmFja182fTsKLQotY29uc3QgdEJUQV9BR19QT1JUX0NCQUNLIGJ0YV9hZ19tZ210X2NiYWNrX3RibFtdID0gewotICAgIGJ0YV9hZ19tZ210X2NiYWNrXzEsIGJ0YV9hZ19tZ210X2NiYWNrXzIsIGJ0YV9hZ19tZ210X2NiYWNrXzMsCi0gICAgYnRhX2FnX21nbXRfY2JhY2tfNCwgYnRhX2FnX21nbXRfY2JhY2tfNSwgYnRhX2FnX21nbXRfY2JhY2tfNn07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcG9ydF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIFBvcnQgY2FsbGJhY2sKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrKFVOVVNFRF9BVFRSIHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGhhbmRsZSk7Ci0gIGlmIChwX3NjYiAhPSBudWxscHRyKSB7Ci0gICAgLyogaWdub3JlIHBvcnQgZXZlbnRzIGZvciBwb3J0IGhhbmRsZXMgb3RoZXIgdGhhbiBjb25uZWN0ZWQgaGFuZGxlICovCi0gICAgaWYgKHBvcnRfaGFuZGxlICE9IHBfc2NiLT5jb25uX2hhbmRsZSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiYWdfcG9ydF9jYmFjayBpZ25vcmluZyBoYW5kbGU6JWQgY29ubl9oYW5kbGUgPSAlZCBvdGhlciBoYW5kbGUgPSAlZCIsCi0gICAgICAgICAgcG9ydF9oYW5kbGUsIHBfc2NiLT5jb25uX2hhbmRsZSwgaGFuZGxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFidGFfYWdfc2NiX29wZW4ocF9zY2IpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHJmY29tbSBkYXRhIG9uIGFuIHVub3BlbmVkIGNvbnRyb2wgYmxvY2sgIgotICAgICAgICAgICAgICAgICA8PCBoYW5kbGUgPDwgIiBwZWVyX2FkZHIgIiA8PCBwX3NjYi0+cGVlcl9hZGRyIDw8ICIgc3RhdGUgIgotICAgICAgICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhwX3NjYi0+c3RhdGUpOwotICAgIH0KLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRhX2FnX3NtX2V4ZWN1dGVfYnlfaGFuZGxlLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfUkZDX0RBVEFfRVZULCB0QlRBX0FHX0RBVEE6OmtFbXB0eSkpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfbWdtdF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIG1hbmFnZW1lbnQgY2FsbGJhY2sKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19tZ210X2NiYWNrKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGhhbmRsZSk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb2RlPSVkLCBwb3J0X2hhbmRsZT0lZCwgc2NiX2hhbmRsZT0lZCwgcF9zY2I9MHglMDh4IiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgcG9ydF9oYW5kbGUsIGhhbmRsZSwgcF9zY2IpOwotICBpZiAocF9zY2IgPT0gbnVsbHB0cikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW5ub3QgZmluZCBzY2IsIGNvZGU9IiA8PCBjb2RlCi0gICAgICAgICAgICAgICAgIDw8ICIsIHBvcnRfaGFuZGxlPSIgPDwgcG9ydF9oYW5kbGUgPDwgIiwgaGFuZGxlPSIgPDwgaGFuZGxlOwotICAgIHJldHVybjsKLSAgfQotICAvKiBpZ25vcmUgY2xvc2UgZXZlbnQgZm9yIHBvcnQgaGFuZGxlcyBvdGhlciB0aGFuIGNvbm5lY3RlZCBoYW5kbGUgKi8KLSAgaWYgKChjb2RlICE9IFBPUlRfU1VDQ0VTUykgJiYgKHBvcnRfaGFuZGxlICE9IHBfc2NiLT5jb25uX2hhbmRsZSkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogaWdub3JlIG9wZW4gZmFpbHVyZSBmb3IgdW5tYXRjaGVkICIKLSAgICAgICAgICAgICAgICAgPDwgInBvcnRfaGFuZGxlICIgPDwgcG9ydF9oYW5kbGUgPDwgIiwgc2NiX2hhbmRsZT0iIDw8IGhhbmRsZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDE2X3QgZXZlbnQ7Ci0gIGlmIChjb2RlID09IFBPUlRfU1VDQ0VTUykgewotICAgIGJvb2wgZm91bmRfaGFuZGxlID0gZmFsc2U7Ci0gICAgaWYgKHBfc2NiLT5jb25uX2hhbmRsZSkgewotICAgICAgLyogT3V0Z29pbmcgY29ubmVjdGlvbiAqLwotICAgICAgaWYgKHBvcnRfaGFuZGxlID09IHBfc2NiLT5jb25uX2hhbmRsZSkgewotICAgICAgICBmb3VuZF9oYW5kbGUgPSB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBJbmNvbWluZyBjb25uZWN0aW9uICovCi0gICAgICBmb3IgKHVpbnQxNl90IHNlcnZpY2VfcG9ydF9oYW5kbGUgOiBwX3NjYi0+c2Vydl9oYW5kbGUpIHsKLSAgICAgICAgaWYgKHBvcnRfaGFuZGxlID09IHNlcnZpY2VfcG9ydF9oYW5kbGUpIHsKLSAgICAgICAgICBmb3VuZF9oYW5kbGUgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmRfaGFuZGxlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHBvcnQgb3BlbmVkIHN1Y2Nlc3NmdWxseSwgYnV0IHBvcnRfaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgPDwgcG9ydF9oYW5kbGUgPDwgIiBpcyB1bmtub3duIgotICAgICAgICAgICAgICAgICA8PCAiLCBzY2JfaGFuZGxlPSIgPDwgaGFuZGxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBldmVudCA9IEJUQV9BR19SRkNfT1BFTl9FVlQ7Ci0gIH0gZWxzZSBpZiAocG9ydF9oYW5kbGUgPT0gcF9zY2ItPmNvbm5faGFuZGxlKSB7Ci0gICAgLyogZGlzdGluZ3Vpc2ggc2VydmVyIGNsb3NlIGV2ZW50cyAqLwotICAgIGV2ZW50ID0gQlRBX0FHX1JGQ19DTE9TRV9FVlQ7Ci0gIH0gZWxzZSB7Ci0gICAgZXZlbnQgPSBCVEFfQUdfUkZDX1NSVl9DTE9TRV9FVlQ7Ci0gIH0KLQotICB0QlRBX0FHX0RBVEEgZGF0YSA9IHt9OwotICBkYXRhLnJmYy5wb3J0X2hhbmRsZSA9IHBvcnRfaGFuZGxlOwotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2FnX3NtX2V4ZWN1dGVfYnlfaGFuZGxlLCBoYW5kbGUsIGV2ZW50LCBkYXRhKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcG9ydF9jYmFja18xIHRvIDYKLSAqICAgICAgICAgICAgICAgICAgYnRhX2FnX21nbXRfY2JhY2tfMSB0byA2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSRkNPTU0gY2FsbGJhY2sgZnVuY3Rpb25zLiAgVGhpcyBpcyBhbiBlYXN5IHdheSB0bwotICogICAgICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBzY2IgZnJvbSB0aGUgY2FsbGJhY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzEodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgYnRhX2FnX21nbXRfY2JhY2soY29kZSwgcG9ydF9oYW5kbGUsIDEpOwotfQotdm9pZCBidGFfYWdfbWdtdF9jYmFja18yKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKSB7Ci0gIGJ0YV9hZ19tZ210X2NiYWNrKGNvZGUsIHBvcnRfaGFuZGxlLCAyKTsKLX0KLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMyh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICBidGFfYWdfbWdtdF9jYmFjayhjb2RlLCBwb3J0X2hhbmRsZSwgMyk7Ci19Ci12b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzQodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgYnRhX2FnX21nbXRfY2JhY2soY29kZSwgcG9ydF9oYW5kbGUsIDQpOwotfQotdm9pZCBidGFfYWdfbWdtdF9jYmFja181KHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKSB7Ci0gIGJ0YV9hZ19tZ210X2NiYWNrKGNvZGUsIHBvcnRfaGFuZGxlLCA1KTsKLX0KLXZvaWQgYnRhX2FnX21nbXRfY2JhY2tfNih1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICBidGFfYWdfbWdtdF9jYmFjayhjb2RlLCBwb3J0X2hhbmRsZSwgNik7Ci19Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzEodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgYnRhX2FnX3BvcnRfY2JhY2soY29kZSwgcG9ydF9oYW5kbGUsIDEpOwotfQotdm9pZCBidGFfYWdfcG9ydF9jYmFja18yKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKSB7Ci0gIGJ0YV9hZ19wb3J0X2NiYWNrKGNvZGUsIHBvcnRfaGFuZGxlLCAyKTsKLX0KLXZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfMyh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICBidGFfYWdfcG9ydF9jYmFjayhjb2RlLCBwb3J0X2hhbmRsZSwgMyk7Ci19Ci12b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzQodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgYnRhX2FnX3BvcnRfY2JhY2soY29kZSwgcG9ydF9oYW5kbGUsIDQpOwotfQotdm9pZCBidGFfYWdfcG9ydF9jYmFja181KHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlKSB7Ci0gIGJ0YV9hZ19wb3J0X2NiYWNrKGNvZGUsIHBvcnRfaGFuZGxlLCA1KTsKLX0KLXZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfNih1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICBidGFfYWdfcG9ydF9jYmFjayhjb2RlLCBwb3J0X2hhbmRsZSwgNik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2V0dXBfcG9ydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0dXAgUkZDT01NIHBvcnQgZm9yIHVzZSBieSBBRy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3NldHVwX3BvcnQodEJUQV9BR19TQ0IqIHBfc2NiLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgaW50IHBvcnRfY2FsbGJhY2tfaW5kZXggPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxOwotICBDSEVDS19HRShwb3J0X2NhbGxiYWNrX2luZGV4LCAwKQotICAgICAgPDwgImludmFsaWQgY2FsbGJhY2sgaW5kZXgsIGhhbmRsZT0iIDw8IGhhbmRsZSA8PCAiLCBiZF9hZGRyIgotICAgICAgPDwgcF9zY2ItPnBlZXJfYWRkcjsKLSAgQ0hFQ0tfTFQocG9ydF9jYWxsYmFja19pbmRleCwKLSAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoYnRhX2FnX3BvcnRfY2JhY2tfdGJsKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YV9hZ19wb3J0X2NiYWNrX3RibFswXSkpKQotICAgICAgPDwgImNhbGxiYWNrIGluZGV4IG91dCBvZiBib3VuZCwgaGFuZGxlPSIgPDwgaGFuZGxlIDw8ICIsIGJkX2FkZHIiCi0gICAgICA8PCBwX3NjYi0+cGVlcl9hZGRyOwotICBQT1JUX1NldEV2ZW50TWFzayhoYW5kbGUsIEJUQV9BR19QT1JUX0VWX01BU0spOwotICBQT1JUX1NldEV2ZW50Q2FsbGJhY2soaGFuZGxlLCBidGFfYWdfcG9ydF9jYmFja190YmxbcG9ydF9jYWxsYmFja19pbmRleF0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3N0YXJ0X3NlcnZlcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHVwIFJGQ09NTSBzZXJ2ZXJzIGZvciB1c2UgYnkgQUcuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHRCVEFfQUdfU0NCKiBwX3NjYiwgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpIHsKLSAgc2VydmljZXMgPj49IEJUQV9IU1BfU0VSVklDRV9JRDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQUdfTlVNX0lEWCAmJiBzZXJ2aWNlcyAhPSAwOyBpKyssIHNlcnZpY2VzID4+PSAxKSB7Ci0gICAgLyogaWYgc2VydmljZSBpcyBzZXQgaW4gbWFzayAqLwotICAgIGlmIChzZXJ2aWNlcyAmIDEpIHsKLSAgICAgIGludCBtYW5hZ2VtZW50X2NhbGxiYWNrX2luZGV4ID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpIC0gMTsKLSAgICAgIENIRUNLX0dFKG1hbmFnZW1lbnRfY2FsbGJhY2tfaW5kZXgsIDApCi0gICAgICAgICAgPDwgImludmFsaWQgY2FsbGJhY2sgaW5kZXgsIHNlcnZpY2VzPSIgPDwgbG9naGV4KHNlcnZpY2VzKQotICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX3NjYi0+cGVlcl9hZGRyOwotICAgICAgQ0hFQ0tfTFQobWFuYWdlbWVudF9jYWxsYmFja19pbmRleCwKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKGJ0YV9hZ19tZ210X2NiYWNrX3RibCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhX2FnX21nbXRfY2JhY2tfdGJsWzBdKSkpCi0gICAgICAgICAgPDwgImNhbGxiYWNrIGluZGV4IG91dCBvZiBib3VuZCwgc2VydmljZXM9IiA8PCBsb2doZXgoc2VydmljZXMpCi0gICAgICAgICAgPDwgIiwgYmRfYWRkciIgPDwgcF9zY2ItPnBlZXJfYWRkcjsKLSAgICAgIGludCBzdGF0dXMgPSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbldpdGhTZWN1cml0eSgKLSAgICAgICAgICBidGFfYWdfdXVpZFtpXSwgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2NuLCB0cnVlLCBCVEFfQUdfTVRVLAotICAgICAgICAgIFJhd0FkZHJlc3M6OmtBbnksICYocF9zY2ItPnNlcnZfaGFuZGxlW2ldKSwKLSAgICAgICAgICBidGFfYWdfbWdtdF9jYmFja190YmxbbWFuYWdlbWVudF9jYWxsYmFja19pbmRleF0sCi0gICAgICAgICAgQlRBX1NFQ19BVVRIRU5USUNBVEUgfCBCVEFfU0VDX0VOQ1JZUFQpOwotICAgICAgaWYgKHN0YXR1cyA9PSBQT1JUX1NVQ0NFU1MpIHsKLSAgICAgICAgYnRhX2FnX3NldHVwX3BvcnQocF9zY2IsIHBfc2NiLT5zZXJ2X2hhbmRsZVtpXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBUT0RPOiBDUiMxMzcxMjUgdG8gaGFuZGxlIHRvIGVycm9yIHByb3Blcmx5ICovCi0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb25XaXRoU2VjdXJpdHkgRVJST1IgIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLCBwX3NjYj0iIDw8IHBfc2NiCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgc2VydmljZXM9IiA8PCBsb2doZXgoc2VydmljZXMpCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgbWdtdF9jYmFja19pbmRleD0iIDw8IG1hbmFnZW1lbnRfY2FsbGJhY2tfaW5kZXg7Ci0gICAgICB9Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcF9zY2I9MHglMDh4LCBzZXJ2aWNlcz0weCUwNHgsIG1nbXRfY2JhY2tfaW5kZXg9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9zY2IsIHNlcnZpY2VzLCBtYW5hZ2VtZW50X2NhbGxiYWNrX2luZGV4KTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19jbG9zZV9zZXJ2ZXJzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBSRkNPTU0gc2VydmVycyBwb3J0IGZvciB1c2UgYnkgQUcuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19jbG9zZV9zZXJ2ZXJzKHRCVEFfQUdfU0NCKiBwX3NjYiwgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpIHsKLSAgc2VydmljZXMgPj49IEJUQV9IU1BfU0VSVklDRV9JRDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQUdfTlVNX0lEWCAmJiBzZXJ2aWNlcyAhPSAwOyBpKyssIHNlcnZpY2VzID4+PSAxKSB7Ci0gICAgLyogaWYgc2VydmljZSBpcyBzZXQgaW4gbWFzayAqLwotICAgIGlmIChzZXJ2aWNlcyAmIDEpIHsKLSAgICAgIFJGQ09NTV9SZW1vdmVTZXJ2ZXIocF9zY2ItPnNlcnZfaGFuZGxlW2ldKTsKLSAgICAgIHBfc2NiLT5zZXJ2X2hhbmRsZVtpXSA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfaXNfc2VydmVyX2Nsb3NlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyB0cnVlIGlmIGFsbCBzZXJ2ZXJzIGFyZSBjbG9zZWQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhbGwgc2VydmVycyBhcmUgY2xvc2VkLCBmYWxzZSBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYWdfaXNfc2VydmVyX2Nsb3NlZCh0QlRBX0FHX1NDQiogcF9zY2IpIHsKLSAgdWludDhfdCB4eDsKLSAgYm9vbCBpc19jbG9zZWQgPSB0cnVlOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUQV9BR19OVU1fSURYOyB4eCsrKSB7Ci0gICAgaWYgKHBfc2NiLT5zZXJ2X2hhbmRsZVt4eF0gIT0gMCkgaXNfY2xvc2VkID0gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gaXNfY2xvc2VkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19kb19vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVuIGFuIFJGQ09NTSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3JmY19kb19vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYiwgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIGludCBtYW5hZ2VtZW50X2NhbGxiYWNrX2luZGV4ID0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpIC0gMTsKLSAgaW50IHN0YXR1cyA9IFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uV2l0aFNlY3VyaXR5KAotICAgICAgYnRhX2FnX3V1aWRbcF9zY2ItPmNvbm5fc2VydmljZV0sIHBfc2NiLT5wZWVyX3NjbiwgZmFsc2UsIEJUQV9BR19NVFUsCi0gICAgICBwX3NjYi0+cGVlcl9hZGRyLCAmKHBfc2NiLT5jb25uX2hhbmRsZSksCi0gICAgICBidGFfYWdfbWdtdF9jYmFja190YmxbbWFuYWdlbWVudF9jYWxsYmFja19pbmRleF0sCi0gICAgICBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IHBfc2NiPTB4JTA4eCwgY29ubl9oYW5kbGU9JWQsIG1nbXRfY2JhY2tfaW5kZXg9JWQsIgotICAgICAgIiBzdGF0dXM9JWQiLAotICAgICAgX19mdW5jX18sIHBfc2NiLCBwX3NjYi0+Y29ubl9oYW5kbGUsIG1hbmFnZW1lbnRfY2FsbGJhY2tfaW5kZXgsIHN0YXR1cyk7Ci0gIGlmIChzdGF0dXMgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgYnRhX2FnX3NldHVwX3BvcnQocF9zY2IsIHBfc2NiLT5jb25uX2hhbmRsZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogUkZDT01NIGNyZWF0ZSBjb25uZWN0aW9uIGZhaWxlZDsgc2VuZCBvdXJzZWx2ZXMgUkZDT01NIGNsb3NlIGV2ZW50ICovCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbiBFUlJPUiAiIDw8IHN0YXR1cwotICAgICAgICAgICAgICAgPDwgIiBmb3IgIiA8PCBwX3NjYi0+cGVlcl9hZGRyOwotICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBCVEFfQUdfUkZDX0NMT1NFX0VWVCwgZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZmNfZG9fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIFJGQ09NTSBjb25uZWN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfcmZjX2RvX2Nsb3NlKHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgaWYgKHBfc2NiLT5jb25uX2hhbmRsZSkgewotICAgIFJGQ09NTV9SZW1vdmVDb25uZWN0aW9uKHBfc2NiLT5jb25uX2hhbmRsZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQ2xvc2UgQVBJIHdhcyBjYWxsZWQgd2hpbGUgQUcgaXMgaW4gT3BlbmluZyBzdGF0ZS4gICAgICAgICAgICAgICAqLwotICAgIC8qIE5lZWQgdG8gdHJpZ2dlciB0aGUgc3RhdGUgbWFjaGluZSB0byBzZW5kIGNhbGxiYWNrIHRvIHRoZSBhcHAgICAgKi8KLSAgICAvKiBhbmQgbW92ZSBiYWNrIHRvIElOSVQgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZCgmYnRhX2FnX3NtX2V4ZWN1dGVfYnlfaGFuZGxlLCBidGFfYWdfc2NiX3RvX2lkeChwX3NjYiksCi0gICAgICAgICAgICAgICAgICAgQlRBX0FHX1JGQ19DTE9TRV9FVlQsIHRCVEFfQUdfREFUQTo6a0VtcHR5KSk7Ci0KLSAgICAvKiBDYW5jZWwgU0RQIGlmIGl0IGhhZCBiZWVuIHN0YXJ0ZWQuICovCi0gICAgLyoKLSAgICBpZihwX3NjYi0+cF9kaXNjX2RiKQotICAgIHsKLSAgICAgICAgKHZvaWQpU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2ggKHBfc2NiLT5wX2Rpc2NfZGIpOwotICAgIH0KLSAgICAqLwotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvYWcvYnRhX2FnX3Njby5jYyBiL2J0YS9hZy9idGFfYWdfc2NvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzM1MzBhLi4wMDAwMDAwCi0tLSBhL2J0YS9hZy9idGFfYWdfc2NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSBTQ08gY29ubmVjdGlvbiB1c2VkIGluIEFHLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIgICAvLyBMZWdhY3kgdHJhY2UgbG9nZ2luZwotCi0jaW5jbHVkZSAiYnRhL2FnL2J0YV9hZ19pbnQuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zY28uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgLy8gZG9faW5fbWFpbl90aHJlYWQKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKiBDb2RlYyBuZWdvdGlhdGlvbiB0aW1lb3V0ICovCi0jaWZuZGVmIEJUQV9BR19DT0RFQ19ORUdPVElBVElPTl9USU1FT1VUX01TCi0jZGVmaW5lIEJUQV9BR19DT0RFQ19ORUdPVElBVElPTl9USU1FT1VUX01TICgzICogMTAwMCkgLyogMyBzZWNvbmRzICovCi0jZW5kaWYKLQotc3RhdGljIGJvb2wgc2NvX2FsbG93ZWQgPSB0cnVlOwotc3RhdGljIFJhd0FkZHJlc3MgYWN0aXZlX2RldmljZV9hZGRyID0ge307Ci0KLS8qIHNjbyBldmVudHMgKi8KLWVudW0gewotICBCVEFfQUdfU0NPX0xJU1RFTl9FLCAgICAgLyogbGlzdGVuIHJlcXVlc3QgKi8KLSAgQlRBX0FHX1NDT19PUEVOX0UsICAgICAgIC8qIG9wZW4gcmVxdWVzdCAqLwotICBCVEFfQUdfU0NPX1hGRVJfRSwgICAgICAgLyogdHJhbnNmZXIgcmVxdWVzdCAqLwotICBCVEFfQUdfU0NPX0NOX0RPTkVfRSwgICAgLyogY29kZWMgbmVnb3RpYXRpb24gZG9uZSAqLwotICBCVEFfQUdfU0NPX1JFT1BFTl9FLCAgICAgLyogUmV0cnkgd2l0aCBvdGhlciBjb2RlYyB3aGVuIGZhaWxlZCAqLwotICBCVEFfQUdfU0NPX0NMT1NFX0UsICAgICAgLyogY2xvc2UgcmVxdWVzdCAqLwotICBCVEFfQUdfU0NPX1NIVVRET1dOX0UsICAgLyogc2h1dGRvd24gcmVxdWVzdCAqLwotICBCVEFfQUdfU0NPX0NPTk5fT1BFTl9FLCAgLyogc2NvIG9wZW4gKi8KLSAgQlRBX0FHX1NDT19DT05OX0NMT1NFX0UsIC8qIHNjbyBjbG9zZWQgKi8KLX07Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fU1RSKGNvbnN0KSBcCi0gIGNhc2UgY29uc3Q6ICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29uc3Q7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfYWdfc2NvX2V2dF9zdHIodWludDhfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fTElTVEVOX0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fT1BFTl9FKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX1hGRVJfRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NDT19DTl9ET05FX0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fUkVPUEVOX0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fQ0xPU0VfRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NDT19TSFVURE9XTl9FKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX0NPTk5fT1BFTl9FKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRSkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIFNDTyBFdmVudCI7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9hZ19zY29fc3RhdGVfc3RyKHVpbnQ4X3Qgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX1NIVVRET1dOX1NUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX0xJU1RFTl9TVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NDT19DT0RFQ19TVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NDT19PUEVOSU5HX1NUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX09QRU5fQ0xfU1QpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fT1BFTl9YRkVSX1NUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX09QRU5fU1QpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TQ09fQ0xPU0lOR19TVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NDT19DTE9TRV9PUF9TVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfU0NPX1NIVVRUSU5HX1NUKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gU0NPIFN0YXRlIjsKLSAgfQotfQotCi0vKioKLSAqIENoZWNrIGlmIGJkX2FkZHIgaXMgdGhlIGN1cnJlbnQgYWN0aXZlIGRldmljZS4KLSAqCi0gKiBAcGFyYW0gYmRfYWRkciB0YXJnZXQgZGV2aWNlIGFkZHJlc3MKLSAqIEByZXR1cm4gVHJ1ZSBpZiBiZF9hZGRyIGlzIHRoZSBjdXJyZW50IGFjdGl2ZSBkZXZpY2UsIEZhbHNlIG90aGVyd2lzZSBvciBpZgotICogbm8gYWN0aXZlIGRldmljZSBpcyBzZXQgKGkuZS4gYWN0aXZlX2RldmljZV9hZGRyIGlzIGVtcHR5KQotICovCi1ib29sIGJ0YV9hZ19zY29faXNfYWN0aXZlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiAhYWN0aXZlX2RldmljZV9hZGRyLklzRW1wdHkoKSAmJiBhY3RpdmVfZGV2aWNlX2FkZHIgPT0gYmRfYWRkcjsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2FnX2NyZWF0ZV9wZW5kaW5nX3Njbyh0QlRBX0FHX1NDQiogcF9zY2IsIGJvb2wgaXNfbG9jYWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19jb25uX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCVE0gU0NPIGNvbm5lY3Rpb24gY2FsbGJhY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYWdfc2NvX2Nvbm5fY2JhY2sodWludDE2X3Qgc2NvX2lkeCkgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYjsKLQotICAvKiBtYXRjaCBjYWxsYmFjayB0byBzY2I7IGZpcnN0IGNoZWNrIGN1cnJlbnQgc2NvIHNjYiAqLwotICBpZiAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiICE9IG51bGxwdHIgJiYgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5pbl91c2UpIHsKLSAgICBoYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IpOwotICB9Ci0gIC8qIHRoZW4gY2hlY2sgZm9yIHNjYiBjb25uZWN0ZWQgdG8gdGhpcyBwZWVyICovCi0gIGVsc2UgewotICAgIC8qIENoZWNrIGlmIFNMQyBpcyB1cCAqLwotICAgIGhhbmRsZSA9IGJ0YV9hZ19pZHhfYnlfYmRhZGRyKEJUTV9SZWFkU2NvQmRBZGRyKHNjb19pZHgpKTsKLSAgICBwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGhhbmRsZSk7Ci0gICAgaWYgKHBfc2NiICYmICFwX3NjYi0+c3ZjX2Nvbm4pIGhhbmRsZSA9IDA7Ci0gIH0KLQotICBpZiAoaGFuZGxlICE9IDApIHsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRhX2FnX3NtX2V4ZWN1dGVfYnlfaGFuZGxlLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfU0NPX09QRU5fRVZULCB0QlRBX0FHX0RBVEE6OmtFbXB0eSkpOwotICB9IGVsc2UgewotICAgIC8qIG5vIG1hdGNoIGZvdW5kOyBkaXNjb25uZWN0IHNjbywgaW5pdCBzY28gdmFyaWFibGVzICovCi0gICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gbnVsbHB0cjsKLSAgICBidGFfYWdfY2Iuc2NvLnN0YXRlID0gQlRBX0FHX1NDT19TSFVURE9XTl9TVDsKLSAgICBCVE1fUmVtb3ZlU2NvKHNjb19pZHgpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX2Rpc2NfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUTSBTQ08gZGlzY29ubmVjdGlvbiBjYWxsYmFjay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zY29fZGlzY19jYmFjayh1aW50MTZfdCBzY29faWR4KSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDA7Ci0KLSAgTE9HX0RFQlVHKAotICAgICAgInNjb19pZHg6IDB4JXggc2NvLnN0YXRlOiVzIiwgc2NvX2lkeCwKLSAgICAgIHNjb19zdGF0ZV90ZXh0KHN0YXRpY19jYXN0PHRTQ09fU1RBVEU+KGJ0YV9hZ19jYi5zY28uc3RhdGUpKS5jX3N0cigpKTsKLSAgTE9HX0RFQlVHKAotICAgICAgIiAgc2NiWzBdIGluX3VzZTolcyBzY29faWR4OiAweCV4IHNjbyBzdGF0ZTolcyIsCi0gICAgICBsb2dib29sKGJ0YV9hZ19jYi5zY2JbMF0uaW5fdXNlKS5jX3N0cigpLCBidGFfYWdfY2Iuc2NiWzBdLnNjb19pZHgsCi0gICAgICBzY29fc3RhdGVfdGV4dChzdGF0aWNfY2FzdDx0U0NPX1NUQVRFPihidGFfYWdfY2Iuc2NiWzBdLnN0YXRlKSkuY19zdHIoKSk7Ci0gIExPR19ERUJVRygKLSAgICAgICIgIHNjYlsxXSBpbl91c2U6JXMgc2NvX2lkeDoweCV4IHNjbyBzdGF0ZTolcyIsCi0gICAgICBsb2dib29sKGJ0YV9hZ19jYi5zY2JbMV0uaW5fdXNlKS5jX3N0cigpLCBidGFfYWdfY2Iuc2NiWzFdLnNjb19pZHgsCi0gICAgICBzY29fc3RhdGVfdGV4dChzdGF0aWNfY2FzdDx0U0NPX1NUQVRFPihidGFfYWdfY2Iuc2NiWzFdLnN0YXRlKSkuY19zdHIoKSk7Ci0KLSAgLyogbWF0Y2ggY2FsbGJhY2sgdG8gc2NiICovCi0gIGlmIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgIT0gbnVsbHB0ciAmJiBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPmluX3VzZSkgewotICAgIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBjYWxsYmFja3MgZm9yIHRoZSBhY3RpdmUgU0NPICovCi0gICAgaWYgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+c2NvX2lkeCAhPSBzY29faWR4KSB7Ci0gICAgICBpZiAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5zY29faWR4ICE9IDB4RkZGRikgcmV0dXJuOwotICAgIH0KLSAgICBoYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IpOwotICB9Ci0KLSAgaWYgKGhhbmRsZSAhPSAwKSB7Ci0gICAgLyogUmVzdG9yZSBzZXR0aW5ncyAqLwotICAgIGlmIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPmludXNlX2NvZGVjID09IEJUTV9TQ09fQ09ERUNfTVNCQykgewotICAgICAgLyogQnlwYXNzIHZlbmRvciBzcGVjaWZpYyBhbmQgdm9pY2Ugc2V0dGluZ3MgaWYgZW5oYW5jZWQgZVNDTyBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmICghKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgLT5zdXBwb3J0c19lbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uKCkpKSB7Ci0gICAgICAgIEJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MoQlRNX1ZPSUNFX1NFVFRJTkdfQ1ZTRCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIElmIFNDTyBvcGVuIHdhcyBpbml0aWF0ZWQgYnkgQUcgYW5kIGZhaWxlZCBmb3IgbVNCQyBUMiwgdHJ5IG1TQkMgVDEKLSAgICAgICAqICdTYWZlIHNldHRpbmcnIGZpcnN0LiBJZiBUMSBhbHNvIGZhaWxzLCB0cnkgQ1ZTRCAqLwotICAgICAgaWYgKGJ0YV9hZ19zY29faXNfb3BlbmluZyhidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IpKSB7Ci0gICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+c3RhdGUgPSBCVEFfQUdfU0NPX0NPREVDX1NUOwotICAgICAgICBpZiAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5jb2RlY19tc2JjX3NldHRpbmdzID09Ci0gICAgICAgICAgICBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDIpIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICIlczogZVNDTy9TQ08gZmFpbGVkIHRvIG9wZW4sIGZhbGxpbmcgYmFjayB0byBtU0JDIFQxIHNldHRpbmdzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9Ci0gICAgICAgICAgICAgIEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HU19UMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICIlczogZVNDTy9TQ08gZmFpbGVkIHRvIG9wZW4sIGZhbGxpbmcgYmFjayB0byBDVlNEIiwgX19mdW5jX18pOwotICAgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+Y29kZWNfZmFsbGJhY2sgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChidGFfYWdfc2NvX2lzX29wZW5pbmcoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiKSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGVTQ08vU0NPIGZhaWxlZCB0byBvcGVuLCBubyBtb3JlIGZhbGwgYmFjayIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICB9Ci0KLSAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPmludXNlX2NvZGVjID0gQlRNX1NDT19DT0RFQ19OT05FOwotCi0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0YV9hZ19zbV9leGVjdXRlX2J5X2hhbmRsZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX1NDT19DTE9TRV9FVlQsIHRCVEFfQUdfREFUQTo6a0VtcHR5KSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogbm8gbWF0Y2ggZm91bmQgKi8KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJubyBzY2IgZm9yIGFnX3Njb19kaXNjX2NiYWNrIik7Ci0KLSAgICAvKiBzY28gY291bGQgYmUgY2xvc2VkIGFmdGVyIHNjYiBkZWFsbG9jJ2VkICovCi0gICAgaWYgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiAhPSBudWxscHRyKSB7Ci0gICAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7Ci0gICAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPSBudWxscHRyOwotICAgICAgYnRhX2FnX2NiLnNjby5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVERPV05fU1Q7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIFNDTyBmcm9tIHRoZSBzeXN0ZW0uCi0gKiAgICAgICAgICAgICAgICAgIElmIG9ubHlfYWN0aXZlIGlzIHRydWUsIHRoZW4gU0NPIGlzIG9ubHkgcmVtb3ZlZCBpZgotICogICAgICAgICAgICAgICAgICBjb25uZWN0ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wgICAtIHRydWUgaWYgU0NPIHJlbW92YWwgd2FzIHN0YXJ0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRhX2FnX3JlbW92ZV9zY28odEJUQV9BR19TQ0IqIHBfc2NiLCBib29sIG9ubHlfYWN0aXZlKSB7Ci0gIGlmIChwX3NjYi0+c2NvX2lkeCAhPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVgpIHsKLSAgICBpZiAoIW9ubHlfYWN0aXZlIHx8IHBfc2NiLT5zY29faWR4ID09IGJ0YV9hZ19jYi5zY28uY3VyX2lkeCkgewotICAgICAgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX1JlbW92ZVNjbyhwX3NjYi0+c2NvX2lkeCk7Ci0gICAgICBMT0dfREVCVUcoIlJlbW92ZWQgU0NPIGluZGV4OjB4JTA0eCBzdGF0dXM6JXMiLCBwX3NjYi0+c2NvX2lkeCwKLSAgICAgICAgICAgICAgICBidG1fc3RhdHVzX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICAgIC8qIFNDTyBpcyBjb25uZWN0ZWQ7IHNldCBjdXJyZW50IGNvbnRyb2wgYmxvY2sgKi8KLSAgICAgICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gcF9zY2I7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIGlmICgoc3RhdHVzID09IEJUTV9TVUNDRVNTKSB8fCAoc3RhdHVzID09IEJUTV9VTktOT1dOX0FERFIpKSB7Ci0gICAgICAgIC8qIElmIG5vIGNvbm5lY3Rpb24gcmVzZXQgdGhlIFNDTyBoYW5kbGUgKi8KLSAgICAgICAgcF9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19lc2NvX2Nvbm5yZXFfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUTSBlU0NPIGNvbm5lY3Rpb24gcmVxdWVzdHMgYW5kIGVTQ08gY2hhbmdlIHJlcXVlc3RzCi0gKiAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdHMgYXJlIHByb2Nlc3NlZCBieSBCVEEuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19lc2NvX2Nvbm5yZXFfY2JhY2sodEJUTV9FU0NPX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9FU0NPX0VWVF9EQVRBKiBwX2RhdGEpIHsKLSAgLyogT25seSBwcm9jZXNzIGNvbm5lY3Rpb24gcmVxdWVzdHMgKi8KLSAgaWYgKGV2ZW50ID09IEJUTV9FU0NPX0NPTk5fUkVRX0VWVCkgewotICAgIHVpbnQxNl90IHNjb19pbnggPSBwX2RhdGEtPmNvbm5fZXZ0LnNjb19pbng7Ci0gICAgY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYSA9IEJUTV9SZWFkU2NvQmRBZGRyKHNjb19pbngpOwotICAgIHRCVEFfQUdfU0NCKiBwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGJ0YV9hZ19pZHhfYnlfYmRhZGRyKHJlbW90ZV9iZGEpKTsKLSAgICBpZiAocmVtb3RlX2JkYSAmJiBidGFfYWdfc2NvX2lzX2FjdGl2ZV9kZXZpY2UoKnJlbW90ZV9iZGEpICYmIHBfc2NiICYmCi0gICAgICAgIHBfc2NiLT5zdmNfY29ubikgewotICAgICAgcF9zY2ItPnNjb19pZHggPSBzY29faW54OwotCi0gICAgICAvKiBJZiBubyBvdGhlciBTQ08gYWN0aXZlLCBhbGxvdyB0aGlzIG9uZSAqLwotICAgICAgaWYgKCFidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FVkVOVCgiJXM6IEFjY2VwdCBDb25uIFJlcXVlc3QgKHNjb19pbnggMHglMDR4KSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNjb19pbngpOwotICAgICAgICBidGFfYWdfc2NvX2Nvbm5fcnNwKHBfc2NiLCAmcF9kYXRhLT5jb25uX2V2dCk7Ci0KLSAgICAgICAgYnRhX2FnX2NiLnNjby5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKLSAgICAgICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gcF9zY2I7Ci0gICAgICAgIGJ0YV9hZ19jYi5zY28uY3VyX2lkeCA9IHBfc2NiLT5zY29faWR4OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogQmVnaW4gYSB0cmFuc2ZlcjogQ2xvc2UgY3VycmVudCBTQ08gYmVmb3JlIHJlc3BvbmRpbmcgKi8KLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2FnX2VzY29fY29ubnJlcV9jYmFjazogQmVnaW4gWEZFUiIpOwotICAgICAgICBidGFfYWdfY2Iuc2NvLnBfeGZlcl9zY2IgPSBwX3NjYjsKLSAgICAgICAgYnRhX2FnX2NiLnNjby5jb25uX2RhdGEgPSBwX2RhdGEtPmNvbm5fZXZ0OwotICAgICAgICBidGFfYWdfY2Iuc2NvLnN0YXRlID0gQlRBX0FHX1NDT19PUEVOX1hGRVJfU1Q7Ci0KLSAgICAgICAgaWYgKCFidGFfYWdfcmVtb3ZlX3NjbyhidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IsIHRydWUpKSB7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICAgIiVzOiBOb3RoaW5nIHRvIHJlbW92ZSxzbyBhY2NlcHQgQ29ubiBSZXF1ZXN0KHNjb19pbnggMHglMDR4KSIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBzY29faW54KTsKLSAgICAgICAgICBidGFfYWdfY2Iuc2NvLnBfeGZlcl9zY2IgPSBudWxscHRyOwotICAgICAgICAgIGJ0YV9hZ19jYi5zY28uc3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKLQotICAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9yc3AocF9zY2IsICZwX2RhdGEtPmNvbm5fZXZ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiByZWplY3QgaW5jb21pbmcgU0NPIGNvbm5lY3Rpb24sIHJlbW90ZV9iZGE9IgotICAgICAgICAgICAgICAgICAgIDw8IChyZW1vdGVfYmRhID8gKnJlbW90ZV9iZGEgOiBSYXdBZGRyZXNzOjprRW1wdHkpCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgYWN0aXZlX2JkYT0iIDw8IGFjdGl2ZV9kZXZpY2VfYWRkciA8PCAiLCBjdXJyZW50X2JkYT0iCi0gICAgICAgICAgICAgICAgICAgPDwgKHBfc2NiID8gcF9zY2ItPnBlZXJfYWRkciA6IFJhd0FkZHJlc3M6OmtFbXB0eSk7Ci0gICAgICBCVE1fRVNjb0Nvbm5Sc3AocF9kYXRhLT5jb25uX2V2dC5zY29faW54LCBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgICAoZW5oX2VzY29fcGFyYW1zX3QqKW51bGxwdHIpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NiYWNrX3NjbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbCBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIFNDTyBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19jYmFja19zY28odEJUQV9BR19TQ0IqIHBfc2NiLCB0QlRBX0FHX0VWVCBldmVudCkgewotICB0QlRBX0FHX0hEUiBzY28gPSB7fTsKLSAgc2NvLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKLSAgc2NvLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7Ci0gIC8qIGNhbGwgY2xvc2UgY2JhY2sgKi8KLSAgKCpidGFfYWdfY2IucF9jYmFjaykoc3RhdGljX2Nhc3Q8dEJUQV9BR19FVlQ+KGV2ZW50KSwgKHRCVEFfQUcqKSZzY28pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENyZWF0ZSBhIFNDTyBjb25uZWN0aW9uIGZvciBhIGdpdmVuIGNvbnRyb2wgYmxvY2sKLSAqICAgICAgICAgICAgICAgICAgcF9zY2IgOiBQb2ludGVyIHRvIHRoZSB0YXJnZXQgQUcgY29udHJvbCBibG9jawotICogICAgICAgICAgICAgICAgICBpc19vcmlnIDogV2hldGhlciB0byBpbml0aWF0ZSBvciBsaXN0ZW4gZm9yIFNDTyBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19jcmVhdGVfc2NvKHRCVEFfQUdfU0NCKiBwX3NjYiwgYm9vbCBpc19vcmlnKSB7Ci0gIExPR19ERUJVRygiQkVGT1JFICVzIiwgcF9zY2ItPlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIHRCVEFfQUdfUEVFUl9DT0RFQyBlc2NvX2NvZGVjID0gQlRNX1NDT19DT0RFQ19DVlNEOwotCi0gIGlmICghYnRhX2FnX3Njb19pc19hY3RpdmVfZGV2aWNlKHBfc2NiLT5wZWVyX2FkZHIpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZSAiIDw8IHBfc2NiLT5wZWVyX2FkZHIKLSAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYWN0aXZlLCBhY3RpdmVfZGV2aWNlPSIgPDwgYWN0aXZlX2RldmljZV9hZGRyOwotICAgIGlmIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgIT0gbnVsbHB0ciAmJgotICAgICAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPmluX3VzZSAmJiBwX3NjYiA9PSBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IpIHsKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2FnX3NtX2V4ZWN1dGUsIHBfc2NiLCBCVEFfQUdfU0NPX0NMT1NFX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BR19EQVRBOjprRW1wdHkpKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIE1ha2Ugc3VyZSB0aGlzIFNDTyBoYW5kbGUgaXMgbm90IGFscmVhZHkgaW4gdXNlICovCi0gIGlmIChwX3NjYi0+c2NvX2lkeCAhPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVgpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogZGV2aWNlICVzLCBpbmRleCAweCUwNHggYWxyZWFkeSBpbiB1c2UhIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPnNjb19pZHgpOwotICAgIHJldHVybjsKLSAgfQotCi0jaWYgKERJU0FCTEVfV0JTID09IEZBTFNFKQotICBpZiAoKHBfc2NiLT5zY29fY29kZWMgPT0gQlRNX1NDT19DT0RFQ19NU0JDKSAmJiAhcF9zY2ItPmNvZGVjX2ZhbGxiYWNrKQotICAgIGVzY29fY29kZWMgPSBCVE1fU0NPX0NPREVDX01TQkM7Ci0jZW5kaWYKLQotICBpZiAocF9zY2ItPmNvZGVjX2ZhbGxiYWNrKSB7Ci0gICAgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrID0gZmFsc2U7Ci0gICAgLyogRm9yY2UgQUcgdG8gc2VuZCArQkNTIGZvciB0aGUgbmV4dCBhdWRpbyBjb25uZWN0aW9uLiAqLwotICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gdHJ1ZTsKLSAgICAvKiBSZXNldCBtU0JDIHNldHRpbmdzIHRvIFQyIGZvciB0aGUgbmV4dCBhdWRpbyBjb25uZWN0aW9uICovCi0gICAgcF9zY2ItPmNvZGVjX21zYmNfc2V0dGluZ3MgPSBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDI7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIGVTQ08gcGFyYW1ldGVycyAqLwotICBlbmhfZXNjb19wYXJhbXNfdCBwYXJhbXMgPSB7fTsKLSAgLyogSWYgV0JTIGluY2x1ZGVkLCB1c2UgQ1ZTRCBieSBkZWZhdWx0LCBpbmRleCBpcyAwIGZvciBDVlNEIGJ5Ci0gICAqIGluaXRpYWxpemF0aW9uLiBJZiBlU0NPIGNvZGVjIGlzIG1TQkMsIGluZGV4IGlzIFQyIG9yIFQxICovCi0gIGlmIChlc2NvX2NvZGVjID09IEJUTV9TQ09fQ09ERUNfTVNCQykgewotICAgIGlmIChwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9PSBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDIpIHsKLSAgICAgIHBhcmFtcyA9IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMoRVNDT19DT0RFQ19NU0JDX1QyKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFyYW1zID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhFU0NPX0NPREVDX01TQkNfVDEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9FU0NPX1M0ICYmCi0gICAgICAgIChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfRVNDT19TNCkpIHsKLSAgICAgIC8vIEhGUCA+PTEuNyBlU0NPCi0gICAgICBwYXJhbXMgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKEVTQ09fQ09ERUNfQ1ZTRF9TNCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEhGUCA8PTEuNiBlU0NPCi0gICAgICBwYXJhbXMgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKEVTQ09fQ09ERUNfQ1ZTRF9TMyk7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgaW5pdGlhdGluZywgc2V0dXAgcGFyYW1ldGVycyB0byBzdGFydCBTQ08vZVNDTyBjb25uZWN0aW9uICovCi0gIGlmIChpc19vcmlnKSB7Ci0gICAgYnRhX2FnX2NiLnNjby5pc19sb2NhbCA9IHRydWU7Ci0gICAgLyogU2V0IGVTQ08gTW9kZSAqLwotICAgIEJUTV9TZXRFU2NvTW9kZSgmcGFyYW1zKTsKLSAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPSBwX3NjYjsKLSAgICAvKiBzYXZlIHRoZSBjdXJyZW50IGNvZGVjIGFzIHNjb19jb2RlYyBjYW4gYmUgdXBkYXRlZCB3aGlsZSBTQ08gaXMgb3Blbi4gKi8KLSAgICBwX3NjYi0+aW51c2VfY29kZWMgPSBlc2NvX2NvZGVjOwotCi0gICAgLyogdGVsbCBzeXMgdG8gc3RvcCBhdiBpZiBhbnkgKi8KLSAgICBidGFfc3lzX3Njb191c2UoQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKLQotICAgIC8qIFNlbmQgcGVuZGluZyBjb21tYW5kcyB0byBjcmVhdGUgU0NPIGNvbm5lY3Rpb24gdG8gcGVlciAqLwotICAgIGJ0YV9hZ19jcmVhdGVfcGVuZGluZ19zY28ocF9zY2IsIGJ0YV9hZ19jYi5zY28uaXNfbG9jYWwpOwotICAgIExPR19ERUJVRygiSW5pdGlhdGluZyBBRyBTQ08gaW54IDB4JTA0eCwgcGt0IHR5cGVzIDB4JTA0eCIsIHBfc2NiLT5zY29faWR4LAotICAgICAgICAgICAgICBwYXJhbXMucGFja2V0X3R5cGVzKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBOb3QgaW5pdGlhdGluZywgZ28gdG8gbGlzdGVuIG1vZGUgKi8KLSAgICB0QlRNX1NUQVRVUyBidG1fc3RhdHVzID0gQlRNX0NyZWF0ZVNjbygKLSAgICAgICAgJnBfc2NiLT5wZWVyX2FkZHIsIGZhbHNlLCBwYXJhbXMucGFja2V0X3R5cGVzLCAmcF9zY2ItPnNjb19pZHgsCi0gICAgICAgIGJ0YV9hZ19zY29fY29ubl9jYmFjaywgYnRhX2FnX3Njb19kaXNjX2NiYWNrKTsKLSAgICBpZiAoYnRtX3N0YXR1cyA9PSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgIEJUTV9SZWdGb3JFU2NvRXZ0cyhwX3NjYi0+c2NvX2lkeCwgYnRhX2FnX2VzY29fY29ubnJlcV9jYmFjayk7Ci0gICAgfQotICAgIExPR19ERUJVRygiTGlzdGVuaW5nIEFHIFNDTyBpbnggMHglMDR4IHN0YXR1czolcyBwa3QgdHlwZXMgMHglMDR4IiwKLSAgICAgICAgICAgICAgcF9zY2ItPnNjb19pZHgsIGJ0bV9zdGF0dXNfdGV4dChidG1fc3RhdHVzKS5jX3N0cigpLAotICAgICAgICAgICAgICBwYXJhbXMucGFja2V0X3R5cGVzKTsKLSAgfQotICBMT0dfREVCVUcoIkFGVEVSICVzIiwgcF9zY2ItPlRvU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY3JlYXRlX3BlbmRpbmdfc2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIEZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgcHJlLVNDTyB2ZW5kb3Igc2V0dXAgaXMKLSAqICAgICAgICAgICAgICAgICAgZG9uZSBmb3IgdGhlIEJUQSB0byBjb250aW51ZSBhbmQgc2VuZCB0aGUgSENJIENvbW1hbmRzIGZvcgotICogICAgICAgICAgICAgICAgICBjcmVhdGluZy9hY2NlcHRpbmcgU0NPIGNvbm5lY3Rpb24gd2l0aCBwZWVyIGJhc2VkIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBpc19sb2NhbCBwYXJhbWV0ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19jcmVhdGVfcGVuZGluZ19zY28odEJUQV9BR19TQ0IqIHBfc2NiLCBib29sIGlzX2xvY2FsKSB7Ci0gIHRCVEFfQUdfUEVFUl9DT0RFQyBlc2NvX2NvZGVjID0gcF9zY2ItPmludXNlX2NvZGVjOwotICBlbmhfZXNjb19wYXJhbXNfdCBwYXJhbXMgPSB7fTsKLSAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gcF9zY2I7Ci0gIGJ0YV9hZ19jYi5zY28uY3VyX2lkeCA9IHBfc2NiLT5zY29faWR4OwotCi0gIC8qIExvY2FsIGRldmljZSByZXF1ZXN0ZWQgU0NPIGNvbm5lY3Rpb24gdG8gcGVlciAqLwotICBpZiAoaXNfbG9jYWwpIHsKLSAgICBpZiAoZXNjb19jb2RlYyA9PSBCVE1fU0NPX0NPREVDX01TQkMpIHsKLSAgICAgIGlmIChwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9PSBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDIpIHsKLSAgICAgICAgcGFyYW1zID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhFU0NPX0NPREVDX01TQkNfVDIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFyYW1zID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhFU0NPX0NPREVDX01TQkNfVDEpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9FU0NPX1M0ICYmCi0gICAgICAgICAgKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9FU0NPX1M0KSkgewotICAgICAgICAvLyBIRlAgPj0xLjcgZVNDTwotICAgICAgICBwYXJhbXMgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKEVTQ09fQ09ERUNfQ1ZTRF9TNCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIRlAgPD0xLjYgZVNDTwotICAgICAgICBwYXJhbXMgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKEVTQ09fQ09ERUNfQ1ZTRF9TMyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogQnlwYXNzIHZvaWNlIHNldHRpbmdzIGlmIGVuaGFuY2VkIFNDTyBzZXR1cCBjb21tYW5kIGlzIHN1cHBvcnRlZCAqLwotICAgIGlmICghKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgICAgIC0+c3VwcG9ydHNfZW5oYW5jZWRfc2V0dXBfc3luY2hyb25vdXNfY29ubmVjdGlvbigpKSkgewotICAgICAgaWYgKGVzY29fY29kZWMgPT0gQlRNX1NDT19DT0RFQ19NU0JDKSB7Ci0gICAgICAgIEJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MoQlRNX1ZPSUNFX1NFVFRJTkdfVFJBTlMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRNX1dyaXRlVm9pY2VTZXR0aW5ncyhCVE1fVk9JQ0VfU0VUVElOR19DVlNEKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoQlRNX0NyZWF0ZVNjbygmcF9zY2ItPnBlZXJfYWRkciwgdHJ1ZSwgcGFyYW1zLnBhY2tldF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAmcF9zY2ItPnNjb19pZHgsIGJ0YV9hZ19zY29fY29ubl9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2Rpc2NfY2JhY2spID09IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgLyogSW5pdGlhdGluZyB0aGUgY29ubmVjdGlvbiwgc2V0IHRoZSBjdXJyZW50IHNjbyBoYW5kbGUgKi8KLSAgICAgIGJ0YV9hZ19jYi5zY28uY3VyX2lkeCA9IHBfc2NiLT5zY29faWR4OwotICAgIH0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogaW5pdGlhdGVkIFNDTyBjb25uZWN0aW9uIiwgX19mdW5jX18pOwotICB9IGVsc2UgewotICAgIC8vIExvY2FsIGRldmljZSBhY2NlcHRlZCBTQ08gY29ubmVjdGlvbiBmcm9tIHBlZXIoSEYpCi0gICAgLy8gQmVjYXVzZSBIRiBkZXZpY2VzIHVzdWFsbHkgZG8gbm90IHNlbmQgQVQrQkFDIGFuZCArQkNTIGNvbW1hbmQsCi0gICAgLy8gYW5kIHRoZXJlIGlzIG5vIHBsYW4gdG8gaW1wbGVtZW50IGNvcnJlc3BvbmRpbmcgY29tbWFuZCBoYW5kbGVycywKLSAgICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBDVlNEIGNvbm5lY3Rpb24gZnJvbSBIRiBubyBtYXR0ZXIgd2hhdCdzCi0gICAgLy8gcmVxdWVzdGVkLgotICAgIGlmIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfUEVFUl9GRUFUX0VTQ09fUzQgJiYKLSAgICAgICAgKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9FU0NPX1M0KSkgewotICAgICAgLy8gSEZQID49MS43IGVTQ08KLSAgICAgIHBhcmFtcyA9IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMoRVNDT19DT0RFQ19DVlNEX1M0KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSEZQIDw9MS42IGVTQ08KLSAgICAgIHBhcmFtcyA9IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMoRVNDT19DT0RFQ19DVlNEX1MzKTsKLSAgICB9Ci0KLSAgICBCVE1fRVNjb0Nvbm5Sc3AocF9zY2ItPnNjb19pZHgsIEhDSV9TVUNDRVNTLCAmcGFyYW1zKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbGlzdGVuaW5nIGZvciBTQ08gY29ubmVjdGlvbiIsIF9fZnVuY19fKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NvZGVjX25lZ290aWF0aW9uX3RpbWVyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19jb2RlY19uZWdvdGlhdGlvbl90aW1lcl9jYmFjayh2b2lkKiBkYXRhKSB7Ci0gIExPR19XQVJOKCJDb2RlYyBuZWdvdGlhdGlvbiB0aW1lb3V0Iik7Ci0gIHRCVEFfQUdfU0NCKiBwX3NjYiA9ICh0QlRBX0FHX1NDQiopZGF0YTsKLQotICAvKiBBbm5vdW5jZSB0aGF0IGNvZGVjIG5lZ290aWF0aW9uIGZhaWxlZC4gKi8KLSAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCBmYWxzZSk7Ci0KLSAgLyogY2FsbCBhcHAgY2FsbGJhY2sgKi8KLSAgYnRhX2FnX2NiYWNrX3NjbyhwX3NjYiwgQlRBX0FHX0FVRElPX0NMT1NFX0VWVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY29kZWNfbmVnb3RpYXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWF0ZSBjb2RlYyBuZWdvdGlhdGlvbiBieSBzZW5kaW5nIEFUIGNvbW1hbmQuCi0gKiAgICAgICAgICAgICAgICAgIElmIG5vdCBuZWNlc3NhcnksIHNraXAgbmVnb3RpYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2NvZGVjX25lZ290aWF0ZSh0QlRBX0FHX1NDQiogcF9zY2IpIHsKLSAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gcF9zY2I7Ci0gIHVpbnQ4X3QqIHBfcmVtX2ZlYXQgPSBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzKHBfc2NiLT5wZWVyX2FkZHIpOwotICBib29sIHNkcF93YnNfc3VwcG9ydCA9IHBfc2NiLT5wZWVyX3NkcF9mZWF0dXJlcyAmIEJUQV9BR19GRUFUX1dCU19TVVBQT1JUOwotCi0gIGlmIChwX3JlbV9mZWF0ID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiU2tpcCBjb2RlYyBuZWdvdGlhdGlvbiwgZmFpbGVkIHRvIHJlYWQgcmVtb3RlIGZlYXR1cmVzIik7Ci0gICAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCBmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gV29ya2Fyb3VuZCBmb3IgbWlzYmVoYXZpbmcgSEZzLCB3aGljaCBpbmRpY2F0ZSB3aGljaCBvbmUgaXMgbm90IHN1cHBvcnQgb24KLSAgLy8gVHJhbnNwYXJlbnQgU3luY2hyb25vdXMgRGF0YSBpbiBSZW1vdGUgU3VwcG9ydGVkIEZlYXR1cmVzLCBXQlMgaW4gU0RQIGFuZAotICAvLyBhbmQgQ29kZWMgTmVnb3RpYXRpb24gaW4gQlJTRi4gRmx1b3JpZGUgd2lsbCBhc3N1bWUgQ1ZTRCBjb2RlYyBieSBkZWZhdWx0LgotICAvLyBJbiBTb255IFhBViBBWDEwMCBjYXIga2l0IGFuZCBTb255IE1XNjAwIEhlYWRzZXQgY2FzZSwgd2hpY2ggaW5kaWNhdGUKLSAgLy8gVHJhbnNwYXJlbnQgU3luY2hyb25vdXMgRGF0YSBhbmQgV0JTIHN1cHBvcnQsIGJ1dCBubyBjb2RlYyBuZWdvdGlhdGlvbgotICAvLyBzdXBwb3J0LCB1c2luZyBtU0JDIGNvZGVjIGNhbiByZXN1bHQgYmFja2dyb3VuZCBub2lzZSBvciBubyBhdWRpby4KLSAgLy8gSW4gU2t1bGxjYW5keSBKSUIgY2FzZSwgd2hpY2ggaW5kaWNhdGUgV0JTIGFuZCBjb2RlYyBuZWdvdGlhdGlvbiBzdXBwb3J0LAotICAvLyBidXQgbm8gVHJhbnNwYXJlbnQgU3luY2hyb25vdXMgRGF0YSBzdXBwb3J0LCB1c2luZyBtU0JDIGNvZGVjIGNhbiByZXN1bHQKLSAgLy8gU0NPIHNldHVwIGZhaWwgYnkgRmlybXdhcmUgcmVqZWN0LgotICBpZiAoIUhDSV9MTVBfVFJBTlNQTlRfU1VQUE9SVEVEKHBfcmVtX2ZlYXQpIHx8ICFzZHBfd2JzX3N1cHBvcnQgfHwKLSAgICAgICEocF9zY2ItPnBlZXJfZmVhdHVyZXMgJiBCVEFfQUdfUEVFUl9GRUFUX0NPREVDKSkgewotICAgIExPR19JTkZPKCJBc3N1bWUgQ1ZTRCBieSBkZWZhdWx0IGR1ZSB0byBtYXNrIG1pc21hdGNoIik7Ci0gICAgcF9zY2ItPnNjb19jb2RlYyA9IFVVSURfQ09ERUNfQ1ZTRDsKLSAgfQotCi0gIGlmICgocF9zY2ItPmNvZGVjX3VwZGF0ZWQgfHwgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrKSAmJgotICAgICAgKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9DT0RFQykpIHsKLSAgICBMT0dfSU5GTygiU3RhcnRpbmcgY29kZWMgbmVnb3RpYXRpb24iKTsKLSAgICAvKiBDaGFuZ2UgdGhlIHBvd2VyIG1vZGUgdG8gQWN0aXZlIHVudGlsIFNDTyBvcGVuIGlzIGNvbXBsZXRlZC4gKi8KLSAgICBidGFfc3lzX2J1c3koQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKLQotICAgIC8qIFNlbmQgK0JDUyB0byB0aGUgcGVlciAqLwotICAgIGJ0YV9hZ19zZW5kX2JjcyhwX3NjYik7Ci0KLSAgICAvKiBTdGFydCB0aW1lciB0byBoYW5kbGUgdGltZW91dCAqLwotICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX3NjYi0+Y29kZWNfbmVnb3RpYXRpb25fdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19DT0RFQ19ORUdPVElBVElPTl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY29kZWNfbmVnb3RpYXRpb25fdGltZXJfY2JhY2ssIHBfc2NiKTsKLSAgfSBlbHNlIHsKLSAgICAvKiB1c2Ugc2FtZSBjb2RlYyB0eXBlIGFzIHByZXZpb3VzIFNDTyBjb25uZWN0aW9uLCBza2lwIGNvZGVjIG5lZ290aWF0aW9uICovCi0gICAgTE9HX0lORk8oIlNraXAgY29kZWMgbmVnb3RpYXRpb24sIHVzaW5nIHRoZSBzYW1lIGNvZGVjIik7Ci0gICAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCB0cnVlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFfYWdfc2NvX2V2ZW50KHRCVEFfQUdfU0NCKiBwX3NjYiwgdWludDhfdCBldmVudCkgewotICB0QlRBX0FHX1NDT19DQiogcF9zY28gPSAmYnRhX2FnX2NiLnNjbzsKLSAgdWludDhfdCBwcmV2aW91c19zdGF0ZSA9IHBfc2NvLT5zdGF0ZTsKLSAgTE9HX0lORk8oImRldmljZTolcyBpbmRleDoweCUwNHggc3RhdGU6JXNbJWRdIGV2ZW50OiVzWyVkXSIsCi0gICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX3NjYi0+cGVlcl9hZGRyKSwgcF9zY2ItPnNjb19pZHgsCi0gICAgICAgICAgIGJ0YV9hZ19zY29fc3RhdGVfc3RyKHBfc2NvLT5zdGF0ZSksIHBfc2NvLT5zdGF0ZSwKLSAgICAgICAgICAgYnRhX2FnX3Njb19ldnRfc3RyKGV2ZW50KSwgZXZlbnQpOwotCi0gIHN3aXRjaCAocF9zY28tPnN0YXRlKSB7Ci0gICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9BR19TQ09fTElTVEVOX0U6Ci0gICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiQlRBX0FHX1NDT19TSFVURE9XTl9TVDogSWdub3JpbmcgZXZlbnQgJXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2V2dF9zdHIoZXZlbnQpLCBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKLSAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCi0gICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FOgotICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0KLSNpZiAoRElTQUJMRV9XQlMgPT0gRkFMU0UpCi0gICAgICAgICAgLyogc3RhcnQgY29kZWMgbmVnb3RpYXRpb24gKi8KLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NPREVDX1NUOwotICAgICAgICAgIGJ0YV9hZ19jb2RlY19uZWdvdGlhdGUocF9zY2IpOwotI2Vsc2UKLSAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgdHJ1ZSk7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOwotI2VuZGlmCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6Ci0gICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKLQotICAgICAgICAgIGlmIChwX3NjYiA9PSBwX3Njby0+cF9jdXJyX3NjYikgcF9zY28tPnBfY3Vycl9zY2IgPSBudWxscHRyOwotCi0gICAgICAgICAgLyogSWYgbGFzdCBTQ08gaW5zdGFuY2UgdGhlbiBmaW5pc2ggc2h1dHRpbmcgZG93biAqLwotICAgICAgICAgIGlmICghYnRhX2FnX290aGVyX3NjYl9vcGVuKHBfc2NiKSkgewotICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVURE9XTl9TVDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0U6Ci0gICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCi0gICAgICAgICAgLyogSWdub3JlIHRoZSBldmVudC4gS2VlcCBsaXN0ZW5pbmcgU0NPIGZvciB0aGUgYWN0aXZlIFNMQyAqLwotICAgICAgICAgIExPR19XQVJOKCJCVEFfQUdfU0NPX0xJU1RFTl9TVDogSWdub3JpbmcgZXZlbnQgJXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2V2dF9zdHIoZXZlbnQpLCBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKLSAgICAgICAgICAvKiBzY28gZmFpbGVkOyBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIGZhbHNlKTsKLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIExPR19XQVJOKCJCVEFfQUdfU0NPX0xJU1RFTl9TVDogSWdub3JpbmcgZXZlbnQgJXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2V2dF9zdHIoZXZlbnQpLCBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX1NDT19DT0RFQ19TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgotICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KLSAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTl9ET05FX0U6Ci0gICAgICAgICAgLyogY3JlYXRlIHNjbyBjb25uZWN0aW9uIHRvIHBlZXIgKi8KLSAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgdHJ1ZSk7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19YRkVSX0U6Ci0gICAgICAgICAgLyogc2F2ZSB4ZmVyIHNjYiAqLwotICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9FOgotICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0KLSAgICAgICAgICBpZiAocF9zY2IgPT0gcF9zY28tPnBfY3Vycl9zY2IpIHBfc2NvLT5wX2N1cnJfc2NiID0gbnVsbHB0cjsKLQotICAgICAgICAgIC8qIElmIGxhc3QgU0NPIGluc3RhbmNlIHRoZW4gZmluaXNoIHNodXR0aW5nIGRvd24gKi8KLSAgICAgICAgICBpZiAoIWJ0YV9hZ19vdGhlcl9zY2Jfb3BlbihwX3NjYikpIHsKLSAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVERPV05fU1Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FOgotICAgICAgICAgIC8qIHNjbyBvcGVuIGlzIG5vdCBzdGFydGVkIHlldC4ganVzdCBnbyBiYWNrIHRvIGxpc3RlbmluZyAqLwotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6Ci0gICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiQlRBX0FHX1NDT19DT0RFQ19TVDogSWdub3JpbmcgZXZlbnQgJXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2V2dF9zdHIoZXZlbnQpLCBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX1NDT19PUEVOSU5HX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9BR19TQ09fTElTVEVOX0U6Ci0gICAgICAgICAgLyogc2Vjb25kIGhlYWRzZXQgaGFzIG5vdyBqb2luZWQgKi8KLSAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCi0gICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotI2lmIChESVNBQkxFX1dCUyA9PSBGQUxTRSkKLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1JFT1BFTl9FOgotICAgICAgICAgIC8qIHN0YXJ0IGNvZGVjIG5lZ290aWF0aW9uICovCi0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DT0RFQ19TVDsKLSAgICAgICAgICBidGFfYWdfY29kZWNfbmVnb3RpYXRlKHBfc2NiKTsKLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19YRkVSX0U6Ci0gICAgICAgICAgLyogc2F2ZSB4ZmVyIHNjYiAqLwotICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FOgotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTl9DTF9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKLSAgICAgICAgICAvKiBJZiBub3Qgb3BlbmluZyBzY2IsIGp1c3QgY2xvc2UgaXQgKi8KLSAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpIHsKLSAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q7Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9PUEVOX0U6Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6Ci0gICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiQlRBX0FHX1NDT19PUEVOSU5HX1NUOiBJZ25vcmluZyBldmVudCAlc1slZF0iLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCksIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fQ0xfU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19YRkVSX0U6Ci0gICAgICAgICAgLyogc2F2ZSB4ZmVyIHNjYiAqLwotICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7Ci0KLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NFX1hGRVJfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fRToKLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX09QRU5JTkdfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6Ci0gICAgICAgICAgLyogSWYgbm90IG9wZW5pbmcgc2NiLCBqdXN0IGNsb3NlIGl0ICovCi0gICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICAvKiByZW1vdmUgbGlzdGVuaW5nIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fT1BFTl9FOgotICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIHRydWUpOwotCi0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6Ci0gICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotCi0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiQlRBX0FHX1NDT19PUEVOX0NMX1NUOiBJZ25vcmluZyBldmVudCAlc1slZF0iLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCksIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fWEZFUl9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0U6Ci0gICAgICAgICAgLyogY2xvc2Ugc2NvIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgdHJ1ZSk7Ci0KLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6Ci0gICAgICAgICAgLyogcmVtb3ZlIGFsbCBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKLSAgICAgICAgICAvKiBjbG9zZWQgc2NvOyBwbGFjZSBpbiBsaXN0ZW4gbW9kZSBhbmQKLSAgICAgICAgICAgICBhY2NlcHQgdGhlIHRyYW5zZmVycmVkIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOyAvKiBCYWNrIGludG8gbGlzdGVuIG1vZGUgKi8KLQotICAgICAgICAgIC8qIEFjY2VwdCBzY28gY29ubmVjdGlvbiB3aXRoIHhmZXIgc2NiICovCi0gICAgICAgICAgYnRhX2FnX3Njb19jb25uX3JzcChwX3Njby0+cF94ZmVyX3NjYiwgJnBfc2NvLT5jb25uX2RhdGEpOwotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKLSAgICAgICAgICBwX3Njby0+cF9jdXJyX3NjYiA9IHBfc2NvLT5wX3hmZXJfc2NiOwotICAgICAgICAgIHBfc2NvLT5jdXJfaWR4ID0gcF9zY28tPnBfeGZlcl9zY2ItPnNjb19pZHg7Ci0gICAgICAgICAgcF9zY28tPnBfeGZlcl9zY2IgPSBudWxscHRyOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTE9HX1dBUk4oIkJUQV9BR19TQ09fT1BFTl9YRkVSX1NUOiBJZ25vcmluZyBldmVudCAlc1slZF0iLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCksIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKLSAgICAgICAgICAvKiBzZWNvbmQgaGVhZHNldCBoYXMgbm93IGpvaW5lZCAqLwotICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KLSAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpIHsKLSAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19YRkVSX0U6Ci0gICAgICAgICAgLyogY2xvc2UgY3VycmVudCBzY28gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NvLT5wX2N1cnJfc2NiLCB0cnVlKTsKLQotICAgICAgICAgIC8qIHNhdmUgeGZlciBzY2IgKi8KLSAgICAgICAgICBwX3Njby0+cF94ZmVyX3NjYiA9IHBfc2NiOwotCi0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FOgotICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uIGlmIGFjdGl2ZSAqLwotICAgICAgICAgIGlmIChidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgdHJ1ZSkpIHsKLSAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ0xPU0lOR19TVDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6Ci0gICAgICAgICAgLyogcmVtb3ZlIGFsbCBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgKi8KLSAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgZmFsc2UpOwotCi0gICAgICAgICAgLyogSWYgU0NPIHdhcyBhY3RpdmUgb24gdGhpcyBzY2IsIGNsb3NlIGl0ICovCi0gICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9DTE9TRV9FOgotICAgICAgICAgIC8qIHBlZXIgY2xvc2VkIHNjbzsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiQlRBX0FHX1NDT19PUEVOX1NUOiBJZ25vcmluZyBldmVudCAlc1slZF0iLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCksIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKLSAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCi0gICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FOgotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ0xPU0VfT1BfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1hGRVJfRToKLSAgICAgICAgICAvKiBzYXZlIHhmZXIgc2NiICovCi0gICAgICAgICAgcF9zY28tPnBfeGZlcl9zY2IgPSBwX3NjYjsKLQotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ0xPU0VfWEZFUl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKLSAgICAgICAgICAvKiBJZiBub3QgY2xvc2luZyBzY2IsIGp1c3QgY2xvc2UgaXQgKi8KLSAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpIHsKLSAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIGZhbHNlKTsKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q7Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9DTE9TRV9FOgotICAgICAgICAgIC8qIHBlZXIgY2xvc2VkIHNjbzsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0KLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIExPR19XQVJOKCJCVEFfQUdfU0NPX0NMT1NJTkdfU1Q6IElnbm9yaW5nIGV2ZW50ICVzWyVkXSIsCi0gICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19ldnRfc3RyKGV2ZW50KSwgZXZlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfT1BfU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FOgotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ0xPU0lOR19TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6Ci0gICAgICAgICAgLyogc3RhcnQgY29kZWMgbmVnb3RpYXRpb24gKi8KLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NPREVDX1NUOwotICAgICAgICAgIGJ0YV9hZ19jb2RlY19uZWdvdGlhdGUocF9zY2IpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKLSAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCi0gICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIExPR19XQVJOKCJCVEFfQUdfU0NPX0NMT1NFX09QX1NUOiBJZ25vcmluZyBldmVudCAlc1slZF0iLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCksIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX1hGRVJfU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX09QRU5fRToKLSAgICAgICAgICAvKiBjbG9zZSBzY28gY29ubmVjdGlvbiBzbyBoZWFkc2V0IGNhbiBiZSB0cmFuc2ZlcnJlZAotICAgICAgICAgICAgIFByb2JhYmx5IGVudGVyZWQgdGhpcyBzdGF0ZSBmcm9tICJvcGVuaW5nIHN0YXRlIiAqLwotICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRToKLSAgICAgICAgICAvKiBjbGVhciB4ZmVyIHNjYiAqLwotICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gbnVsbHB0cjsKLQotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ0xPU0lOR19TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKLSAgICAgICAgICAvKiBjbGVhciB4ZmVyIHNjYiAqLwotICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gbnVsbHB0cjsKLQotICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRTogewotICAgICAgICAgIC8qIGNsb3NlZCBzY287IHBsYWNlIG9sZCBzY28gaW4gbGlzdGVuIG1vZGUsCi0gICAgICAgICAgICAgdGFrZSBjdXJyZW50IHNjbyBvdXQgb2YgbGlzdGVuLCBhbmQKLSAgICAgICAgICAgICBjcmVhdGUgb3JpZ2luYXRpbmcgc2NvIGZvciBjdXJyZW50ICovCi0gICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIGZhbHNlKTsKLSAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3Njby0+cF94ZmVyX3NjYiwgZmFsc2UpOwotCi0jaWYgKERJU0FCTEVfV0JTID09IEZBTFNFKQotICAgICAgICAgIC8qIHN0YXJ0IGNvZGVjIG5lZ290aWF0aW9uICovCi0gICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DT0RFQ19TVDsKLSAgICAgICAgICB0QlRBX0FHX1NDQiogcF9jbl9zY2IgPSBwX3Njby0+cF94ZmVyX3NjYjsKLSAgICAgICAgICBwX3Njby0+cF94ZmVyX3NjYiA9IG51bGxwdHI7Ci0gICAgICAgICAgYnRhX2FnX2NvZGVjX25lZ290aWF0ZShwX2NuX3NjYik7Ci0jZWxzZQotICAgICAgICAgIC8qIGNyZWF0ZSBzY28gY29ubmVjdGlvbiB0byBwZWVyICovCi0gICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY28tPnBfeGZlcl9zY2IsIHRydWUpOwotICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gbnVsbHB0cjsKLSAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX09QRU5JTkdfU1Q7Ci0jZW5kaWYKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTE9HX1dBUk4oIiBCVEFfQUdfU0NPX0NMT1NFX1hGRVJfU1Q6IElnbm9yaW5nIGV2ZW50ICVzWyVkXSIsCi0gICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19ldnRfc3RyKGV2ZW50KSwgZXZlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX09QRU5fRToKLSAgICAgICAgICAvKiBjbG9zZSBzY28gY29ubmVjdGlvbjsgd2FpdCBmb3IgY29ubiBjbG9zZSBldmVudCAqLwotICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9DTE9TRV9FOgotICAgICAgICAgIC8qIElmIGxhc3QgU0NPIGluc3RhbmNlIHRoZW4gZmluaXNoIHNodXR0aW5nIGRvd24gKi8KLSAgICAgICAgICBpZiAoIWJ0YV9hZ19vdGhlcl9zY2Jfb3BlbihwX3NjYikpIHsKLSAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVERPV05fU1Q7Ci0gICAgICAgICAgfSBlbHNlIC8qIE90aGVyIGluc3RhbmNlIGlzIHN0aWxsIGxpc3RlbmluZyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIElmIFNDTyBjbG9zZWQgZm9yIG90aGVyIEhTIHdoaWNoIGlzIG5vdCBiZWluZyBkaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgdGhlbiBjcmVhdGUgbGlzdGVuIHNjbyBjb25uZWN0aW9uIGZvciBpdCBhcyBzY2Igc3RpbGwgb3BlbiAqLwotICAgICAgICAgIGlmIChidGFfYWdfc2NiX29wZW4ocF9zY2IpKSB7Ci0gICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgZmFsc2UpOwotICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICBwX3Njby0+cF9jdXJyX3NjYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKLSAgICAgICAgICAgIHBfc2NvLT5wX2N1cnJfc2NiID0gbnVsbHB0cjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgotICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KLSAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpIHsKLSAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9FOgotICAgICAgICAgIGlmICghYnRhX2FnX290aGVyX3NjYl9vcGVuKHBfc2NiKSkgewotICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVURE9XTl9TVDsKLSAgICAgICAgICB9IGVsc2UgLyogT3RoZXIgaW5zdGFuY2UgaXMgc3RpbGwgbGlzdGVuaW5nICovCi0gICAgICAgICAgewotICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKSB7Ci0gICAgICAgICAgICBwX3Njby0+cF9jdXJyX3NjYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKLSAgICAgICAgICAgIHBfc2NvLT5wX2N1cnJfc2NiID0gbnVsbHB0cjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiQlRBX0FHX1NDT19TSFVUVElOR19TVDogSWdub3JpbmcgZXZlbnQgJXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2V2dF9zdHIoZXZlbnQpLCBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAocF9zY28tPnN0YXRlICE9IHByZXZpb3VzX3N0YXRlKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJTQ09fc3RhdGVfY2hhbmdlOiBbJXMoMHglMDJ4KV0tPlslcygweCUwMngpXSAiCi0gICAgICAgICJhZnRlciBldmVudCBbJXMoMHglMDJ4KV0iLAotICAgICAgICBidGFfYWdfc2NvX3N0YXRlX3N0cihwcmV2aW91c19zdGF0ZSksIHByZXZpb3VzX3N0YXRlLAotICAgICAgICBidGFfYWdfc2NvX3N0YXRlX3N0cihwX3Njby0+c3RhdGUpLCBwX3Njby0+c3RhdGUsCi0gICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCksIGV2ZW50KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19pc19vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiBzY28gaXMgb3BlbiBmb3IgdGhpcyBzY2IuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY28gb3BlbiBmb3IgdGhpcyBzY2IsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYWdfc2NvX2lzX29wZW4odEJUQV9BR19TQ0IqIHBfc2NiKSB7Ci0gIHJldHVybiAoKGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19PUEVOX1NUKSAmJgotICAgICAgICAgIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPT0gcF9zY2IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29faXNfb3BlbmluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgc2NvIGlzIGluIE9wZW5pbmcgc3RhdGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY28gaXMgaW4gT3BlbmluZyBzdGF0ZSBmb3IgdGhpcyBzY2IsIGZhbHNlCi0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYWdfc2NvX2lzX29wZW5pbmcodEJUQV9BR19TQ0IqIHBfc2NiKSB7Ci0gIHJldHVybiAoKGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19PUEVOSU5HX1NUKSAmJgotICAgICAgICAgIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPT0gcF9zY2IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fbGlzdGVuCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3Njb19saXN0ZW4odEJUQV9BR19TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgcF9zY2ItPnBlZXJfYWRkcjsKLSAgYnRhX2FnX3Njb19ldmVudChwX3NjYiwgQlRBX0FHX1NDT19MSVNURU5fRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2NvX29wZW4odEJUQV9BR19TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgaWYgKCFzY29fYWxsb3dlZCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBub3Qgb3BlbmluZyBzY28sIGJ5IHBvbGljeSI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIGlmIGFub3RoZXIgc2NiIHVzaW5nIHNjbywgdGhpcyBpcyBhIHRyYW5zZmVyICovCi0gIGlmIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgJiYgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiICE9IHBfc2NiKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHRyYW5zZmVyICIKLSAgICAgICAgICAgICAgPDwgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5wZWVyX2FkZHIgPDwgIiAtPiAiCi0gICAgICAgICAgICAgIDw8IHBfc2NiLT5wZWVyX2FkZHI7Ci0gICAgYnRhX2FnX3Njb19ldmVudChwX3NjYiwgQlRBX0FHX1NDT19YRkVSX0UpOwotICB9IGVsc2UgewotICAgIC8qIGVsc2UgaXQgaXMgYW4gb3BlbiAqLwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBvcGVuICIgPDwgcF9zY2ItPnBlZXJfYWRkcjsKLSAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX09QRU5fRSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2NvX2Nsb3NlKHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgLyogaWYgc2NiIGlzIGluIHVzZSAqLwotICAvKiBzY29faWR4IGlzIG5vdCBhbGxvY2F0ZWQgaW4gU0NPX0NPREVDX1NULCBzdGlsbCBuZWVkIHRvIG1vdmUgdG8gbGlzdGVuCi0gICAqIHN0YXRlLiAqLwotICBpZiAoKHBfc2NiLT5zY29faWR4ICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkgfHwKLSAgICAgIChidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fQ09ERUNfU1QpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2FnX3Njb19jbG9zZTogc2NvX2lueCA9ICVkIiwgcF9zY2ItPnNjb19pZHgpOwotICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fQ0xPU0VfRSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fY29kZWNfbmVnbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlcyByZXN1bHQgb2YgZVNDTyBjb2RlYyBuZWdvdGlhdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2NvX2NvZGVjX25lZ28odEJUQV9BR19TQ0IqIHBfc2NiLCBib29sIHJlc3VsdCkgewotICBpZiAocmVzdWx0KSB7Ci0gICAgLyogU3Vic2VxdWVudCBTQ08gY29ubmVjdGlvbiB3aWxsIHNraXAgY29kZWMgbmVnb3RpYXRpb24gKi8KLSAgICBMT0dfSU5GTygiU3VjY2VlZGVkIGZvciBpbmRleCAweCUwNHgsIGRldmljZSAlcyIsIHBfc2NiLT5zY29faWR4LAotICAgICAgICAgICAgIHBfc2NiLT5wZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IGZhbHNlOwotICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fQ05fRE9ORV9FKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBjb2RlYyBuZWdvdGlhdGlvbiBmYWlsZWQgKi8KLSAgICBMT0dfSU5GTygiRmFpbGVkIGZvciBpbmRleCAweCUwNHgsIGRldmljZSAlcyIsIHBfc2NiLT5zY29faWR4LAotICAgICAgICAgICAgIHBfc2NiLT5wZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX0NMT1NFX0UpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX3NodXRkb3duCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX3Njb19zaHV0ZG93bih0QlRBX0FHX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fU0hVVERPV05fRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX2Nvbm5fb3BlbgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zY29fY29ubl9vcGVuKHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9BR19EQVRBJiBkYXRhKSB7Ci0gIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fQ09OTl9PUEVOX0UpOwotCi0gIGJ0YV9zeXNfc2NvX29wZW4oQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKLQotICAvKiBjYWxsIGFwcCBjYWxsYmFjayAqLwotICBidGFfYWdfY2JhY2tfc2NvKHBfc2NiLCBCVEFfQUdfQVVESU9fT1BFTl9FVlQpOwotCi0gIC8qIHJlc2V0IHRvIG1TQkMgVDIgc2V0dGluZ3MgYXMgdGhlIHByZWZlcnJlZCAqLwotICBwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9IEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HU19UMjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zY29fY29ubl9jbG9zZSh0QlRBX0FHX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB0QlRBX0FHX0RBVEEmIGRhdGEpIHsKLSAgLyogY2xlYXIgY3VycmVudCBzY2IgKi8KLSAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gbnVsbHB0cjsKLSAgcF9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7Ci0KLSAgLyogY29kZWNfZmFsbGJhY2sgaXMgc2V0IHdoZW4gQUcgaXMgaW5pdGlhdG9yIGFuZCBjb25uZWN0aW9uIGZhaWxlZCBmb3IgbVNCQy4KLSAgICogT1IgaWYgY29kZWMgaXMgbXNiYyBhbmQgVDIgc2V0dGluZ3MgZmFpbGVkLCB0aGVuIHJldHJ5IFNhZmUgVDEgc2V0dGluZ3MgKi8KLSAgaWYgKHBfc2NiLT5zdmNfY29ubiAmJgotICAgICAgKHBfc2NiLT5jb2RlY19mYWxsYmFjayB8fAotICAgICAgIChwX3NjYi0+c2NvX2NvZGVjID09IEJUTV9TQ09fQ09ERUNfTVNCQyAmJgotICAgICAgICBwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9PSBCVEFfQUdfU0NPX01TQkNfU0VUVElOR1NfVDEpKSkgewotICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fUkVPUEVOX0UpOwotICB9IGVsc2UgewotICAgIC8qIEluZGljYXRlIGlmIHRoZSBjbG9zaW5nIG9mIGF1ZGlvIGlzIGJlY2F1c2Ugb2YgdHJhbnNmZXIgKi8KLSAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRSk7Ci0KLSAgICBidGFfc3lzX3Njb19jbG9zZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOwotCi0gICAgLyogaWYgYXYgZ290IHN1c3BlbmRlZCBieSB0aGlzIGNhbGwsIGxldCBpdCByZXN1bWUuICovCi0gICAgLyogSW4gY2FzZSBjYWxsIHN0YXlzIGFsaXZlIHJlZ2FyZGxlc3Mgb2Ygc2NvLCBhdiBzaG91bGQgbm90IGJlIGFmZmVjdGVkLiAqLwotICAgIGlmICgoKHBfc2NiLT5jYWxsX2luZCA9PSBCVEFfQUdfQ0FMTF9JTkFDVElWRSkgJiYKLSAgICAgICAgIChwX3NjYi0+Y2FsbHNldHVwX2luZCA9PSBCVEFfQUdfQ0FMTFNFVFVQX05PTkUpKSB8fAotICAgICAgICAocF9zY2ItPnBvc3Rfc2NvID09IEJUQV9BR19QT1NUX1NDT19DQUxMX0VORCkpIHsKLSAgICAgIGJ0YV9zeXNfc2NvX3VudXNlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7Ci0gICAgfQotCi0gICAgLyogY2FsbCBhcHAgY2FsbGJhY2sgKi8KLSAgICBidGFfYWdfY2JhY2tfc2NvKHBfc2NiLCBCVEFfQUdfQVVESU9fQ0xPU0VfRVZUKTsKLSAgICBwX3NjYi0+Y29kZWNfbXNiY19zZXR0aW5ncyA9IEJUQV9BR19TQ09fTVNCQ19TRVRUSU5HU19UMjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19jb25uX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyB0aGUgU0NPIGNvbm5lY3Rpb24gcmVxdWVzdAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfc2NvX2Nvbm5fcnNwKHRCVEFfQUdfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0VTQ09fQ09OTl9SRVFfRVZUX0RBVEEqIHBfZGF0YSkgewotICBidGFfYWdfY2Iuc2NvLmlzX2xvY2FsID0gZmFsc2U7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGVTQ08gJWQsIHN0YXRlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgLT5zdXBwb3J0c19lbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5zdGF0ZSk7Ci0KLSAgaWYgKGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19MSVNURU5fU1QgfHwKLSAgICAgIGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUIHx8Ci0gICAgICBidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fT1BFTl9YRkVSX1NUKSB7Ci0gICAgLyogdGVsbCBzeXMgdG8gc3RvcCBhdiBpZiBhbnkgKi8KLSAgICBidGFfc3lzX3Njb191c2UoQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKLSAgICAvKiBXaGVuIEhTIGluaXRpYXRlZCBTQ08sIGl0IGNhbm5vdCBiZSBXQlMuICovCi0gIH0KLQotICAvKiBJZiBTQ08gb3BlbiB3YXMgaW5pdGlhdGVkIGZyb20gSFMsIGl0IG11c3QgYmUgQ1ZTRCAqLwotICBwX3NjYi0+aW51c2VfY29kZWMgPSBCVE1fU0NPX0NPREVDX05PTkU7Ci0gIC8qIFNlbmQgcGVuZGluZyBjb21tYW5kcyB0byBjcmVhdGUgU0NPIGNvbm5lY3Rpb24gdG8gcGVlciAqLwotICBidGFfYWdfY3JlYXRlX3BlbmRpbmdfc2NvKHBfc2NiLCBidGFfYWdfY2Iuc2NvLmlzX2xvY2FsKTsKLX0KLQotdm9pZCBidGFfYWdfc2V0X3Njb19hbGxvd2VkKGJvb2wgdmFsdWUpIHsKLSAgc2NvX2FsbG93ZWQgPSB2YWx1ZTsKLSAgQVBQTF9UUkFDRV9ERUJVRyhzY29fYWxsb3dlZCA/ICJzY28gbm93IGFsbG93ZWQiIDogInNjbyBub3cgbm90IGFsbG93ZWQiKTsKLX0KLQotY29uc3QgUmF3QWRkcmVzcyYgYnRhX2FnX2dldF9hY3RpdmVfZGV2aWNlKCkgeyByZXR1cm4gYWN0aXZlX2RldmljZV9hZGRyOyB9Ci0KLXZvaWQgYnRhX2NsZWFyX2FjdGl2ZV9kZXZpY2UoKSB7IGFjdGl2ZV9kZXZpY2VfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsgfQotCi12b2lkIGJ0YV9hZ19hcGlfc2V0X2FjdGl2ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgbmV3X2FjdGl2ZV9kZXZpY2UpIHsKLSAgaWYgKG5ld19hY3RpdmVfZGV2aWNlLklzRW1wdHkoKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBlbXB0eSBkZXZpY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFjdGl2ZV9kZXZpY2VfYWRkciA9IG5ld19hY3RpdmVfZGV2aWNlOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2FnL2J0YV9hZ19zZHAuY2MgYi9idGEvYWcvYnRhX2FnX3NkcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhZjE1Yy4uMDAwMDAwMAotLS0gYS9idGEvYWcvYnRhX2FnX3NkcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYXVkaW8gZ2F0ZXdheSBmdW5jdGlvbnMgcGVyZm9ybWluZyBTRFAKLSAqICBvcGVyYXRpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIExlZ2FjeSBzdGFjayBjb25maWcKLSNpbmNsdWRlICJidF90cmFjZS5oIiAgIC8vIExlZ2FjeSB0cmFjZSBsb2dnaW5nCi0KLSNpbmNsdWRlICJidGEvYWcvYnRhX2FnX2ludC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiICAvLyBkb19pbl9tYWluX3RocmVhZAotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLS8qIE51bWJlciBvZiBwcm90b2NvbCBlbGVtZW50cyBpbiBwcm90b2NvbCBlbGVtZW50IGxpc3QuICovCi0jZGVmaW5lIEJUQV9BR19OVU1fUFJPVE9fRUxFTVMgMgotCi0vKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc2VydmljZSBjbGFzcyBpZCBsaXN0LiAqLwotI2RlZmluZSBCVEFfQUdfTlVNX1NWQ19FTEVNUyAyCi0KLS8qIHNpemUgb2YgZGF0YWJhc2UgZm9yIHNlcnZpY2UgZGlzY292ZXJ5ICovCi0jaWZuZGVmIEJUQV9BR19ESVNDX0JVRl9TSVpFCi0jZGVmaW5lIEJUQV9BR19ESVNDX0JVRl9TSVpFIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLSNlbmRpZgotCi0vKiBkZWNsYXJlIHNkcCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLXZvaWQgYnRhX2FnX3NkcF9jYmFja18xKHRTRFBfUkVTVUxUKTsKLXZvaWQgYnRhX2FnX3NkcF9jYmFja18yKHRTRFBfUkVTVUxUKTsKLXZvaWQgYnRhX2FnX3NkcF9jYmFja18zKHRTRFBfUkVTVUxUKTsKLXZvaWQgYnRhX2FnX3NkcF9jYmFja180KHRTRFBfUkVTVUxUKTsKLXZvaWQgYnRhX2FnX3NkcF9jYmFja181KHRTRFBfUkVTVUxUKTsKLXZvaWQgYnRhX2FnX3NkcF9jYmFja182KHRTRFBfUkVTVUxUKTsKLQotLyogU0RQIGNhbGxiYWNrIGZ1bmN0aW9uIHRhYmxlICovCi10eXBlZGVmIHRTRFBfRElTQ19DTVBMX0NCKiB0QlRBX0FHX1NEUF9DQkFDSzsKLWNvbnN0IHRCVEFfQUdfU0RQX0NCQUNLIGJ0YV9hZ19zZHBfY2JhY2tfdGJsW10gPSB7Ci0gICAgYnRhX2FnX3NkcF9jYmFja18xLCBidGFfYWdfc2RwX2NiYWNrXzIsIGJ0YV9hZ19zZHBfY2JhY2tfMywKLSAgICBidGFfYWdfc2RwX2NiYWNrXzQsIGJ0YV9hZ19zZHBfY2JhY2tfNSwgYnRhX2FnX3NkcF9jYmFja182fTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZHBfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNEUCBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hZ19zZHBfY2JhY2sodWludDE2X3Qgc3RhdHVzLCB1aW50OF90IGlkeCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBzdGF0dXM6MHgleCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICB0QlRBX0FHX1NDQiogcF9zY2IgPSBidGFfYWdfc2NiX2J5X2lkeChpZHgpOwotICBpZiAocF9zY2IpIHsKLSAgICB1aW50MTZfdCBldmVudDsKLSAgICAvKiBzZXQgZXZlbnQgYWNjb3JkaW5nIHRvIGludC9hY3AgKi8KLSAgICBpZiAocF9zY2ItPnJvbGUgPT0gQlRBX0FHX0FDUCkgewotICAgICAgZXZlbnQgPSBCVEFfQUdfRElTQ19BQ1BfUkVTX0VWVDsKLSAgICB9IGVsc2UgewotICAgICAgZXZlbnQgPSBCVEFfQUdfRElTQ19JTlRfUkVTX0VWVDsKLSAgICB9Ci0gICAgdEJUQV9BR19EQVRBIGRpc2NfcmVzdWx0ID0gey5kaXNjX3Jlc3VsdCA9IHsuc3RhdHVzID0gc3RhdHVzfX07Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGFfYWdfc21fZXhlY3V0ZV9ieV9oYW5kbGUsIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGRpc2NfcmVzdWx0KSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZHBfY2JhY2tfMSB0byA2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTRFAgY2FsbGJhY2sgZnVuY3Rpb25zLiAgU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvCi0gKiAgICAgICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIHNjYiBmcm9tIHRoZSBjYWxsYmFjayB3ZSBuZWVkIHNlcGFyYXRlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyBmb3IgZWFjaCBzY2IuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMSh0U0RQX1NUQVRVUyBzdGF0dXMpIHsgYnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDEpOyB9Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMih0U0RQX1NUQVRVUyBzdGF0dXMpIHsgYnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDIpOyB9Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMyh0U0RQX1NUQVRVUyBzdGF0dXMpIHsgYnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDMpOyB9Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfNCh0U0RQX1NUQVRVUyBzdGF0dXMpIHsgYnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDQpOyB9Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfNSh0U0RQX1NUQVRVUyBzdGF0dXMpIHsgYnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDUpOyB9Ci12b2lkIGJ0YV9hZ19zZHBfY2JhY2tfNih0U0RQX1NUQVRVUyBzdGF0dXMpIHsgYnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDYpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hZGRfcmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIHNlcnZlciBhcHBsaWNhdGlvbiB0byBhZGQKLSAqICAgICAgICAgICAgICAgICAgSFNQIG9yIEhGUCBpbmZvcm1hdGlvbiB0byBhbiBTRFAgcmVjb3JkLiAgUHJpb3IgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgU0RQX0NyZWF0ZVJlY29yZCgpIHRvIGNyZWF0ZSBhbiBTRFAgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBmdW5jdGlvbiBleGVjdXRpb24gc3VjY2VlZGVkLAotICogICAgICAgICAgICAgICAgICBmYWxzZSBpZiBmdW5jdGlvbiBleGVjdXRpb24gZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2FnX2FkZF9yZWNvcmQodWludDE2X3Qgc2VydmljZV91dWlkLCBjb25zdCBjaGFyKiBwX3NlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY24sIHRCVEFfQUdfRkVBVCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2RwX2hhbmRsZSkgewotICB0U0RQX1BST1RPQ09MX0VMRU0gcHJvdG9fZWxlbV9saXN0W0JUQV9BR19OVU1fUFJPVE9fRUxFTVNdOwotICB1aW50MTZfdCBzdmNfY2xhc3NfaWRfbGlzdFtCVEFfQUdfTlVNX1NWQ19FTEVNU107Ci0gIHVpbnQxNl90IGJyb3dzZV9saXN0W10gPSB7VVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUH07Ci0gIHVpbnQxNl90IHZlcnNpb247Ci0gIHVpbnQxNl90IHByb2ZpbGVfdXVpZDsKLSAgdWludDhfdCBuZXR3b3JrOwotICBib29sIHJlc3VsdCA9IHRydWU7Ci0gIGJvb2wgY29kZWNfc3VwcG9ydGVkID0gZmFsc2U7Ci0gIHVpbnQ4X3QgYnVmWzJdOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIHV1aWQ6ICV4IiwgX19mdW5jX18sIHNlcnZpY2VfdXVpZCk7Ci0KLSAgZm9yIChhdXRvJiBwcm90b19lbGVtZW50IDogcHJvdG9fZWxlbV9saXN0KSB7Ci0gICAgcHJvdG9fZWxlbWVudCA9IHt9OwotICB9Ci0KLSAgLyogYWRkIHRoZSBwcm90b2NvbCBlbGVtZW50IHNlcXVlbmNlICovCi0gIHByb3RvX2VsZW1fbGlzdFswXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9MMkNBUDsKLSAgcHJvdG9fZWxlbV9saXN0WzBdLm51bV9wYXJhbXMgPSAwOwotICBwcm90b19lbGVtX2xpc3RbMV0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfUkZDT01NOwotICBwcm90b19lbGVtX2xpc3RbMV0ubnVtX3BhcmFtcyA9IDE7Ci0gIHByb3RvX2VsZW1fbGlzdFsxXS5wYXJhbXNbMF0gPSBzY247Ci0gIHJlc3VsdCAmPQotICAgICAgU0RQX0FkZFByb3RvY29sTGlzdChzZHBfaGFuZGxlLCBCVEFfQUdfTlVNX1BST1RPX0VMRU1TLCBwcm90b19lbGVtX2xpc3QpOwotCi0gIC8qIGFkZCBzZXJ2aWNlIGNsYXNzIGlkIGxpc3QgKi8KLSAgc3ZjX2NsYXNzX2lkX2xpc3RbMF0gPSBzZXJ2aWNlX3V1aWQ7Ci0gIHN2Y19jbGFzc19pZF9saXN0WzFdID0gVVVJRF9TRVJWQ0xBU1NfR0VORVJJQ19BVURJTzsKLSAgcmVzdWx0ICY9IFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3Qoc2RwX2hhbmRsZSwgQlRBX0FHX05VTV9TVkNfRUxFTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19jbGFzc19pZF9saXN0KTsKLQotICAvKiBhZGQgcHJvZmlsZSBkZXNjcmlwdG9yIGxpc3QgKi8KLSAgaWYgKHNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUpIHsKLSAgICBwcm9maWxlX3V1aWQgPSBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUU7Ci0gICAgdmVyc2lvbiA9IEJUQV9IRlBfVkVSU0lPTjsKLSAgfSBlbHNlIHsKLSAgICBwcm9maWxlX3V1aWQgPSBVVUlEX1NFUlZDTEFTU19IRUFEU0VUOwotICAgIHZlcnNpb24gPSBIU1BfVkVSU0lPTl8xXzI7Ci0gIH0KLSAgcmVzdWx0ICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3Qoc2RwX2hhbmRsZSwgcHJvZmlsZV91dWlkLCB2ZXJzaW9uKTsKLQotICAvKiBhZGQgc2VydmljZSBuYW1lICovCi0gIGlmIChwX3NlcnZpY2VfbmFtZSAhPSBudWxscHRyICYmIHBfc2VydmljZV9uYW1lWzBdICE9IDApIHsKLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZSgKLSAgICAgICAgc2RwX2hhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX05BTUUsIFRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9zZXJ2aWNlX25hbWUpICsgMSksICh1aW50OF90KilwX3NlcnZpY2VfbmFtZSk7Ci0gIH0KLQotICAvKiBhZGQgZmVhdHVyZXMgYW5kIG5ldHdvcmsgKi8KLSAgaWYgKHNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUpIHsKLSAgICBuZXR3b3JrID0gKGZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfUkVKRUNUKSA/IDEgOiAwOwotICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfREFUQV9TVE9SRVNfT1JfTkVUV09SSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgMSwgJm5ldHdvcmspOwotCi0gICAgaWYgKGZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfQ09ERUMpIGNvZGVjX3N1cHBvcnRlZCA9IHRydWU7Ci0KLSAgICBmZWF0dXJlcyAmPSBCVEFfQUdfU0RQX0ZFQVRfU1BFQzsKLQotICAgIC8qIENvZGVjIGJpdCBwb3NpdGlvbiBpcyBkaWZmZXJlbnQgaW4gU0RQIGFuZCBpbiBCUlNGICovCi0gICAgaWYgKGNvZGVjX3N1cHBvcnRlZCkgZmVhdHVyZXMgfD0gMHgwMDIwOwotCi0gICAgVUlOVDE2X1RPX0JFX0ZJRUxEKGJ1ZiwgZmVhdHVyZXMpOwotICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfREVTQ19UWVBFLCAyLCBidWYpOwotICB9Ci0KLSAgLyogYWRkIGJyb3dzZSBncm91cCBsaXN0ICovCi0gIHJlc3VsdCAmPSBTRFBfQWRkVXVpZFNlcXVlbmNlKHNkcF9oYW5kbGUsIEFUVFJfSURfQlJPV1NFX0dST1VQX0xJU1QsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZV9saXN0KTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NyZWF0ZV9yZWNvcmRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGUgU0RQIHJlY29yZHMgZm9yIHJlZ2lzdGVyZWQgc2VydmljZXMuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZ19jcmVhdGVfcmVjb3Jkcyh0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICBpbnQgaTsKLSAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXM7Ci0KLSAgc2VydmljZXMgPSBwX3NjYi0+cmVnX3NlcnZpY2VzID4+IEJUQV9IU1BfU0VSVklDRV9JRDsKLSAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19OVU1fSURYICYmIHNlcnZpY2VzICE9IDA7IGkrKywgc2VydmljZXMgPj49IDEpIHsKLSAgICAvKiBpZiBzZXJ2aWNlIGlzIHNldCBpbiBtYXNrICovCi0gICAgaWYgKHNlcnZpY2VzICYgMSkgewotICAgICAgLyogYWRkIHNkcCByZWNvcmQgaWYgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCAqLwotICAgICAgaWYgKGJ0YV9hZ19jYi5wcm9maWxlW2ldLnNkcF9oYW5kbGUgPT0gMCkgewotICAgICAgICBidGFfYWdfY2IucHJvZmlsZVtpXS5zZHBfaGFuZGxlID0gU0RQX0NyZWF0ZVJlY29yZCgpOwotICAgICAgICBidGFfYWdfY2IucHJvZmlsZVtpXS5zY24gPSBCVE1fQWxsb2NhdGVTQ04oKTsKLSAgICAgICAgYnRhX2FnX2FkZF9yZWNvcmQoYnRhX2FnX3V1aWRbaV0sIGRhdGEuYXBpX3JlZ2lzdGVyLnBfbmFtZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2NuLCBkYXRhLmFwaV9yZWdpc3Rlci5mZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2RwX2hhbmRsZSk7Ci0gICAgICAgIGJ0YV9zeXNfYWRkX3V1aWQoYnRhX2FnX3V1aWRbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RlbF9yZWNvcmRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZWxldGUgU0RQIHJlY29yZHMgZm9yIGFueSByZWdpc3RlcmVkIHNlcnZpY2VzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfZGVsX3JlY29yZHModEJUQV9BR19TQ0IqIHBfc2NiKSB7Ci0gIHRCVEFfQUdfU0NCKiBwID0gJmJ0YV9hZ19jYi5zY2JbMF07Ci0gIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzOwotICB0QlRBX1NFUlZJQ0VfTUFTSyBvdGhlcnMgPSAwOwotICBpbnQgaTsKLQotICAvKiBnZXQgc2VydmljZXMgb2YgYWxsIG90aGVyIHJlZ2lzdGVyZWQgc2VydmVycyAqLwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFg7IGkrKywgcCsrKSB7Ci0gICAgaWYgKHBfc2NiID09IHApIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmIChwLT5pbl91c2UgJiYgIXAtPmRlYWxsb2MpIHsKLSAgICAgIG90aGVycyB8PSBwLT5yZWdfc2VydmljZXM7Ci0gICAgfQotICB9Ci0KLSAgb3RoZXJzID4+PSBCVEFfSFNQX1NFUlZJQ0VfSUQ7Ci0gIHNlcnZpY2VzID0gcF9zY2ItPnJlZ19zZXJ2aWNlcyA+PiBCVEFfSFNQX1NFUlZJQ0VfSUQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVEFfQUdfTlVNX0lEWCAmJiBzZXJ2aWNlcyAhPSAwOwotICAgICAgIGkrKywgc2VydmljZXMgPj49IDEsIG90aGVycyA+Pj0gMSkgewotICAgIC8qIGlmIHNlcnZpY2UgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzY2IgYW5kIG5vdCByZWdpc3RlcmVkIGZvciBhbnkgb3RoZXIgc2NiCi0gICAgICovCi0gICAgaWYgKCgoc2VydmljZXMgJiAxKSA9PSAxKSAmJiAoKG90aGVycyAmIDEpID09IDApKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfYWdfZGVsX3JlY29yZHMgJWQiLCBpKTsKLSAgICAgIGlmIChidGFfYWdfY2IucHJvZmlsZVtpXS5zZHBfaGFuZGxlICE9IDApIHsKLSAgICAgICAgU0RQX0RlbGV0ZVJlY29yZChidGFfYWdfY2IucHJvZmlsZVtpXS5zZHBfaGFuZGxlKTsKLSAgICAgICAgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2RwX2hhbmRsZSA9IDA7Ci0gICAgICB9Ci0gICAgICBCVE1fRnJlZVNDTihidGFfYWdfY2IucHJvZmlsZVtpXS5zY24pOwotICAgICAgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQoYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2NuKTsKLSAgICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoYnRhX2FnX3V1aWRbaV0pOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NkcF9maW5kX2F0dHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgU0RQIGRpc2NvdmVyeSByZXN1bHRzIHRvIGZpbmQgcmVxdWVzdGVkIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgICAgICAgICAgZm9yIHJlcXVlc3RlZCBzZXJ2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVzdWx0cyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9hZ19zZHBfZmluZF9hdHRyKHRCVEFfQUdfU0NCKiBwX3NjYiwgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZSkgewotICB0U0RQX0RJU0NfUkVDKiBwX3JlYyA9IG51bGxwdHI7Ci0gIHRTRFBfRElTQ19BVFRSKiBwX2F0dHI7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLSAgdWludDE2X3QgdXVpZDsKLSAgYm9vbCByZXN1bHQgPSBmYWxzZTsKLQotICBpZiAoc2VydmljZSAmIEJUQV9IRlBfU0VSVklDRV9NQVNLKSB7Ci0gICAgdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRTsKLSAgICAvKiBJZiB0aGVyZSBpcyBubyBjYWNoZWQgcGVlciB2ZXJzaW9uLCB1c2UgZGVmYXVsdCBvbmUgKi8KLSAgICBpZiAocF9zY2ItPnBlZXJfdmVyc2lvbiA9PSBIRlBfSFNQX1ZFUlNJT05fVU5LTk9XTikgewotICAgICAgcF9zY2ItPnBlZXJfdmVyc2lvbiA9IEhGUF9WRVJTSU9OXzFfMTsgLyogRGVmYXVsdCB2ZXJzaW9uICovCi0gICAgfQotICB9IGVsc2UgaWYgKHNlcnZpY2UgJiBCVEFfSFNQX1NFUlZJQ0VfTUFTSyAmJiBwX3NjYi0+cm9sZSA9PSBCVEFfQUdfSU5UKSB7Ci0gICAgdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFM7Ci0gICAgcF9zY2ItPnBlZXJfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMjsgLyogRGVmYXVsdCB2ZXJzaW9uICovCi0gIH0gZWxzZSB7Ci0gICAgdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFM7Ci0gICAgcF9zY2ItPnBlZXJfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMDsKLSAgfQotCi0gIC8qIGxvb3AgdGhyb3VnaCBhbGwgcmVjb3JkcyB3ZSBmb3VuZCAqLwotICB3aGlsZSAodHJ1ZSkgewotICAgIC8qIGdldCBuZXh0IHJlY29yZDsgaWYgbm9uZSBmb3VuZCwgd2UncmUgZG9uZSAqLwotICAgIHBfcmVjID0gU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX3NjYi0+cF9kaXNjX2RiLCB1dWlkLCBwX3JlYyk7Ci0gICAgaWYgKHBfcmVjID09IG51bGxwdHIpIHsKLSAgICAgIGlmICh1dWlkID09IFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFMpIHsKLSAgICAgICAgLyogU2VhcmNoIGFnYWluIGluIGNhc2UgdGhlIHBlZXIgZGV2aWNlIHVzZXMgdGhlIG9sZCBIU1AgVVVJRCAqLwotICAgICAgICB1dWlkID0gVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVDsKLSAgICAgICAgcF9zY2ItPnBlZXJfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMDsKLSAgICAgICAgcF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKHBfc2NiLT5wX2Rpc2NfZGIsIHV1aWQsIHBfcmVjKTsKLSAgICAgICAgaWYgKHBfcmVjID09IG51bGxwdHIpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGdldCBzY24gZnJvbSBwcm90byBkZXNjIGxpc3QgaWYgaW5pdGlhdG9yICovCi0gICAgaWYgKHBfc2NiLT5yb2xlID09IEJUQV9BR19JTlQpIHsKLSAgICAgIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3JlYywgVVVJRF9QUk9UT0NPTF9SRkNPTU0sICZwZSkpIHsKLSAgICAgICAgcF9zY2ItPnBlZXJfc2NuID0gKHVpbnQ4X3QpcGUucGFyYW1zWzBdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZ2V0IHByb2ZpbGUgdmVyc2lvbiAoaWYgZmFpbHVyZSwgdmVyc2lvbiBwYXJhbWV0ZXIgaXMgbm90IHVwZGF0ZWQpICovCi0gICAgdWludDE2X3QgcGVlcl92ZXJzaW9uID0gSEZQX0hTUF9WRVJTSU9OX1VOS05PV047Ci0gICAgaWYgKCFTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMocF9yZWMsIHV1aWQsICZwZWVyX3ZlcnNpb24pKSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBHZXQgcGVlcl92ZXJzaW9uIGZhaWxlZCwgdXNpbmcgZGVmYXVsdCAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3NjYi0+cGVlcl92ZXJzaW9uKTsKLSAgICAgIHBlZXJfdmVyc2lvbiA9IHBfc2NiLT5wZWVyX3ZlcnNpb247Ci0gICAgfQotCi0gICAgaWYgKHNlcnZpY2UgJiBCVEFfSEZQX1NFUlZJQ0VfTUFTSykgewotICAgICAgLyogVXBkYXRlIGNhY2hlZCBwZWVyIHZlcnNpb24gaWYgdGhlIG5ldyBvbmUgaXMgZGlmZmVyZW50ICovCi0gICAgICBpZiAocGVlcl92ZXJzaW9uICE9IHBfc2NiLT5wZWVyX3ZlcnNpb24pIHsKLSAgICAgICAgcF9zY2ItPnBlZXJfdmVyc2lvbiA9IHBlZXJfdmVyc2lvbjsKLSAgICAgICAgaWYgKGJ0aWZfY29uZmlnX3NldF9iaW4oCi0gICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfYWRkci5Ub1N0cmluZygpLCBIRlBfVkVSU0lPTl9DT05GSUdfS0VZLAotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmcGVlcl92ZXJzaW9uLCBzaXplb2YocGVlcl92ZXJzaW9uKSkpIHsKLSAgICAgICAgICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogRmFpbGVkIHRvIHN0b3JlIHBlZXIgSEZQIHZlcnNpb24gZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5wZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLyogZ2V0IGZlYXR1cmVzIGlmIEhGUCAqLwotICAgICAgcF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVMpOwotICAgICAgaWYgKHBfYXR0ciAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8qIEZvdW5kIGF0dHJpYnV0ZS4gR2V0IHZhbHVlLiAqLwotICAgICAgICAvKiBUaGVyZSBtaWdodCBiZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIFNEUCBhbmQgQlJTRi4gICovCi0gICAgICAgIC8qIERvIG5vdCB1cGRhdGUgaWYgd2UgYWxyZWFkeSByZWNlaXZlZCBCUlNGLiAgICAgICAgICAgKi8KLSAgICAgICAgdWludDE2X3Qgc2RwX2ZlYXR1cmVzID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgICAgICBib29sIHNkcF93YnNfc3VwcG9ydCA9IHNkcF9mZWF0dXJlcyAmIEJUQV9BR19GRUFUX1dCU19TVVBQT1JUOwotICAgICAgICBpZiAoIXBfc2NiLT5yZWNlaXZlZF9hdF9iYWMgJiYgc2RwX3dic19zdXBwb3J0KSB7Ci0gICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgbWlzYmVoYXZpbmcgSEZzIChlLmcuIHNvbWUgSHl1bmRhaSBjYXIga2l0KSB0aGF0OgotICAgICAgICAgIC8vIDEuIEluZGljYXRlIFdCUyBzdXBwb3J0IGluIFNEUCBhbmQgY29kZWMgbmVnb3RpYXRpb24gaW4gQlJTRgotICAgICAgICAgIC8vIDIuIEJ1dCBkbyBub3Qgc2VuZCByZXF1aXJlZCBBVCtCQUMgY29tbWFuZAotICAgICAgICAgIC8vIFdpbGwgYXNzdW1lIG1TQkMgaXMgZW5hYmxlZCBhbmQgdHJ5IGNvZGVjIG5lZ290aWF0aW9uIGJ5IGRlZmF1bHQKLSAgICAgICAgICBwX3NjYi0+Y29kZWNfdXBkYXRlZCA9IHRydWU7Ci0gICAgICAgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gQlRNX1NDT19DT0RFQ19DVlNEICYgQlRNX1NDT19DT0RFQ19NU0JDOwotICAgICAgICAgIHBfc2NiLT5zY29fY29kZWMgPSBVVUlEX0NPREVDX01TQkM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNkcF9mZWF0dXJlcyAhPSBwX3NjYi0+cGVlcl9zZHBfZmVhdHVyZXMpIHsKLSAgICAgICAgICBwX3NjYi0+cGVlcl9zZHBfZmVhdHVyZXMgPSBzZHBfZmVhdHVyZXM7Ci0gICAgICAgICAgaWYgKGJ0aWZfY29uZmlnX3NldF9iaW4oCi0gICAgICAgICAgICAgICAgICBwX3NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCksIEhGUF9TRFBfRkVBVFVSRVNfQ09ORklHX0tFWSwKLSAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90Kikmc2RwX2ZlYXR1cmVzLCBzaXplb2Yoc2RwX2ZlYXR1cmVzKSkpIHsKLSAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN0b3JlIHBlZXIgSEZQIFNEUCBGZWF0dXJlcyBmb3IgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBwX3NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwX3NjYi0+cGVlcl9mZWF0dXJlcyA9PSAwKSB7Ci0gICAgICAgICAgcF9zY2ItPnBlZXJfZmVhdHVyZXMgPSBzZHBfZmVhdHVyZXMgJiBIRlBfU0RQX0JSU0ZfRkVBVFVSRVNfTUFTSzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBObyBwZWVyIHZlcnNpb24gY2FjaGluZyBmb3IgSFNQLCB1c2UgZGlzY292ZXJlZCBvbmUgZGlyZWN0bHkgKi8KLSAgICAgIHBfc2NiLT5wZWVyX3ZlcnNpb24gPSBwZWVyX3ZlcnNpb247Ci0gICAgICAvKiBnZXQgZmVhdHVyZXMgaWYgSFNQICovCi0gICAgICBwX2F0dHIgPQotICAgICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfUkVNT1RFX0FVRElPX1ZPTFVNRV9DT05UUk9MKTsKLSAgICAgIGlmIChwX2F0dHIgIT0gbnVsbHB0cikgewotICAgICAgICAvKiBSZW1vdGUgdm9sdW1lIGNvbnRyb2wgb2YgSFNQICovCi0gICAgICAgIGlmIChwX2F0dHItPmF0dHJfdmFsdWUudi51OCkKLSAgICAgICAgICBwX3NjYi0+cGVlcl9mZWF0dXJlcyB8PSBCVEFfQUdfUEVFUl9GRUFUX1ZPTDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBfc2NiLT5wZWVyX2ZlYXR1cmVzICY9IH5CVEFfQUdfUEVFUl9GRUFUX1ZPTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmb3VuZCB3aGF0IHdlIG5lZWRlZCAqLwotICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19kb19kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEbyBzZXJ2aWNlIGRpc2NvdmVyeS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FnX2RvX2Rpc2ModEJUQV9BR19TQ0IqIHBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlKSB7Ci0gIFV1aWQgdXVpZF9saXN0WzFdOwotICB1aW50MTZfdCBudW1fdXVpZCA9IDE7Ci0gIHVpbnQxNl90IGF0dHJfbGlzdFs0XTsKLSAgdWludDhfdCBudW1fYXR0cjsKLQotICAvKiBIRlAgaW5pdGlhdG9yOyBnZXQgcHJvdG8gbGlzdCBhbmQgZmVhdHVyZXMgKi8KLSAgaWYgKHNlcnZpY2UgJiBCVEFfSEZQX1NFUlZJQ0VfTUFTSyAmJiBwX3NjYi0+cm9sZSA9PSBCVEFfQUdfSU5UKSB7Ci0gICAgYXR0cl9saXN0WzBdID0gQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1Q7Ci0gICAgYXR0cl9saXN0WzFdID0gQVRUUl9JRF9QUk9UT0NPTF9ERVNDX0xJU1Q7Ci0gICAgYXR0cl9saXN0WzJdID0gQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVDsKLSAgICBhdHRyX2xpc3RbM10gPSBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUzsKLSAgICBudW1fYXR0ciA9IDQ7Ci0gICAgdXVpZF9saXN0WzBdID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRSk7Ci0gIH0KLSAgLyogSEZQIGFjY2VwdG9yOyBnZXQgZmVhdHVyZXMgKi8KLSAgZWxzZSBpZiAoc2VydmljZSAmIEJUQV9IRlBfU0VSVklDRV9NQVNLICYmIHBfc2NiLT5yb2xlID09IEJUQV9BR19BQ1ApIHsKLSAgICBhdHRyX2xpc3RbMF0gPSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVDsKLSAgICBhdHRyX2xpc3RbMV0gPSBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNUOwotICAgIGF0dHJfbGlzdFsyXSA9IEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTOwotICAgIG51bV9hdHRyID0gMzsKLSAgICB1dWlkX2xpc3RbMF0gPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfSEZfSEFORFNGUkVFKTsKLSAgfQotICAvKiBIU1AgaW5pdGlhdG9yOyBnZXQgcHJvdG8gbGlzdCAqLwotICBlbHNlIGlmIChzZXJ2aWNlICYgQlRBX0hTUF9TRVJWSUNFX01BU0sgJiYgcF9zY2ItPnJvbGUgPT0gQlRBX0FHX0lOVCkgewotICAgIGF0dHJfbGlzdFswXSA9IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUOwotICAgIGF0dHJfbGlzdFsxXSA9IEFUVFJfSURfUFJPVE9DT0xfREVTQ19MSVNUOwotICAgIGF0dHJfbGlzdFsyXSA9IEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1Q7Ci0gICAgYXR0cl9saXN0WzNdID0gQVRUUl9JRF9SRU1PVEVfQVVESU9fVk9MVU1FX0NPTlRST0w7Ci0gICAgbnVtX2F0dHIgPSA0OwotICAgIC8vIEFsdGhvdWdoIFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFMgKDB4MTEzMSkgaXMgdG8gYmUgdXNlZCBpbiBIU1AgMS4yLAotICAgIC8vIHNvbWUgSFNQIDEuMiBpbXBsZW1lbnRhdGlvbnMsIHN1Y2ggYXMgUFRTLCBzdGlsbCB1c2UKLSAgICAvLyBVVUlEX1NFUlZDTEFTU19IRUFEU0VUICgweDExMDgpIHRvIHN0b3JlIGl0cyBzZXJ2aWNlIHJlY29yZC4gSG93ZXZlciwKLSAgICAvLyBtb3N0IG9mIHN1Y2ggZGV2aWNlcyBhcmUgSFNQIDEuMCBkZXZpY2VzLgotICAgIGlmIChwX3NjYi0+aHNwX3ZlcnNpb24gPj0gSFNQX1ZFUlNJT05fMV8yKSB7Ci0gICAgICB1dWlkX2xpc3RbMF0gPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVF9IUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHV1aWRfbGlzdFswXSA9IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19IRUFEU0VUKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogSFNQIGFjY2VwdG9yOyBnZXQgZmVhdHVyZXMgKi8KLSAgICBhdHRyX2xpc3RbMF0gPSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVDsKLSAgICBhdHRyX2xpc3RbMV0gPSBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVDsKLSAgICBhdHRyX2xpc3RbMl0gPSBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNUOwotICAgIGF0dHJfbGlzdFszXSA9IEFUVFJfSURfUkVNT1RFX0FVRElPX1ZPTFVNRV9DT05UUk9MOwotICAgIG51bV9hdHRyID0gNDsKLQotICAgIGlmIChwX3NjYi0+aHNwX3ZlcnNpb24gPj0gSFNQX1ZFUlNJT05fMV8yKSB7Ci0gICAgICB1dWlkX2xpc3RbMF0gPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVF9IUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIExlZ2FjeSBmcm9tIEhTUCB2MS4wICovCi0gICAgICB1dWlkX2xpc3RbMF0gPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBfc2NiLT5wX2Rpc2NfZGIgIT0gbnVsbHB0cikgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc0MDUyMTQ4Iik7Ci0gICAgTE9HX0VSUk9SKCJEaXNjb3ZlcnkgYWxyZWFkeSBpbiBwcm9ncmVzcy4uLiByZXR1cm5pbmcuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciBzZHAgZGF0YWJhc2UgKi8KLSAgcF9zY2ItPnBfZGlzY19kYiA9ICh0U0RQX0RJU0NPVkVSWV9EQiopb3NpX21hbGxvYyhCVEFfQUdfRElTQ19CVUZfU0laRSk7Ci0gIC8qIHNldCB1cCBzZXJ2aWNlIGRpc2NvdmVyeSBkYXRhYmFzZTsgYXR0ciBoYXBwZW5zIHRvIGJlIGF0dHJfbGlzdCBsZW4gKi8KLSAgaWYgKFNEUF9Jbml0RGlzY292ZXJ5RGIocF9zY2ItPnBfZGlzY19kYiwgQlRBX0FHX0RJU0NfQlVGX1NJWkUsIG51bV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2xpc3QsIG51bV9hdHRyLCBhdHRyX2xpc3QpKSB7Ci0gICAgaWYgKFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdCgKLSAgICAgICAgICAgIHBfc2NiLT5wZWVyX2FkZHIsIHBfc2NiLT5wX2Rpc2NfZGIsCi0gICAgICAgICAgICBidGFfYWdfc2RwX2NiYWNrX3RibFtidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxXSkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgdG8gc3RhcnQgU0RQIGRpc2NvdmVyeSBmb3IgIgotICAgICAgICAgICAgICAgICA8PCBwX3NjYi0+cGVlcl9hZGRyOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBpbml0IFNEUCBkaXNjb3ZlcnkgZGF0YWJhc2UgZm9yICIKLSAgICAgICAgICAgICAgIDw8IHBfc2NiLT5wZWVyX2FkZHI7Ci0gIH0KLSAgLy8gRmFpbHVyZSBhY3Rpb25zCi0gIGJ0YV9hZ19mcmVlX2RiKHBfc2NiLCB0QlRBX0FHX0RBVEE6OmtFbXB0eSk7Ci0gIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBCVEFfQUdfRElTQ19GQUlMX0VWVCwgdEJUQV9BR19EQVRBOjprRW1wdHkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2ZyZWVfZGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZyZWUgZGlzY292ZXJ5IGRhdGFiYXNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYWdfZnJlZV9kYih0QlRBX0FHX1NDQiogcF9zY2IsIGNvbnN0IHRCVEFfQUdfREFUQSYgZGF0YSkgewotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9zY2ItPnBfZGlzY19kYik7Ci19CmRpZmYgLS1naXQgYS9idGEvYXIvYnRhX2FyLmNjIGIvYnRhL2FyL2J0YV9hci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2MTA4Zi4uMDAwMDAwMAotLS0gYS9idGEvYXIvYnRhX2FyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDgtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBhdWRpby92aWRlbyByZWdpc3RyYXRpb24gbW9kdWxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2FyL2J0YV9hcl9pbnQuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2Y3RfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdnJjX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIEFWIGNvbnRyb2wgYmxvY2sgKi8KLXRCVEFfQVJfQ0IgYnRhX2FyX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIHRvIEFWRFRQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hcl9pbml0KHZvaWQpIHsKLSAgLyogaW5pdGlhbGl6ZSBjb250cm9sIGJsb2NrICovCi0gIG1lbXNldCgmYnRhX2FyX2NiLCAwLCBzaXplb2YodEJUQV9BUl9DQikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX3JlZ19hdmR0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3RlciB0byBBVkRUUC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2FyX2F2ZHRfY2JhY2sodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYl9pbmRleCkgewotICAvKiByb3V0ZSB0aGUgQVZEVCByZWdpc3RyYXRpb24gY2FsbGJhY2sgdG8gYXYgb3IgYXZrICovCi0gIGlmIChidGFfYXJfY2IucF9hdl9jb25uX2NiYWNrKQotICAgICgqYnRhX2FyX2NiLnBfYXZfY29ubl9jYmFjaykoaGFuZGxlLCBiZF9hZGRyLCBldmVudCwgcF9kYXRhLCBzY2JfaW5kZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX3JlZ19hdmR0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBBUiBtb2R1bGUgcmVnaXN0cmF0aW9uIHRvIEFWRFQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FyX3JlZ19hdmR0KEF2ZHRwUmNiKiBwX3JlZywgdEFWRFRfQ1RSTF9DQkFDSyogcF9jYmFjaykgewotICBidGFfYXJfY2IucF9hdl9jb25uX2NiYWNrID0gcF9jYmFjazsKLSAgaWYgKGJ0YV9hcl9jYi5hdmR0X3JlZ2lzdGVyZWQgPT0gMCkgewotICAgIEFWRFRfUmVnaXN0ZXIocF9yZWcsIGJ0YV9hcl9hdmR0X2NiYWNrKTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBkb2Vzbid0IHJlZ2lzdGVyIGFnYWluIChyZWdpc3RlcmVkOiVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBidGFfYXJfY2IuYXZkdF9yZWdpc3RlcmVkKTsKLSAgfQotICBidGFfYXJfY2IuYXZkdF9yZWdpc3RlcmVkIHw9IEJUQV9BUl9BVl9NQVNLOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX2RlcmVnX2F2ZHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlLXJlZ2lzdGVyIGZyb20gQVZEVFAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2FyX2RlcmVnX2F2ZHQoKSB7Ci0gIGJ0YV9hcl9jYi5wX2F2X2Nvbm5fY2JhY2sgPSBOVUxMOwotICBidGFfYXJfY2IuYXZkdF9yZWdpc3RlcmVkICY9IH5CVEFfQVJfQVZfTUFTSzsKLQotICBpZiAoYnRhX2FyX2NiLmF2ZHRfcmVnaXN0ZXJlZCA9PSAwKSBBVkRUX0RlcmVnaXN0ZXIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hcl9hdmR0X2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGxldCBhciBrbm93IHRoYXQgc29tZSBBVkRUUAotICogICAgICAgICAgICAgICAgICBwcm9maWxlIGlzIGNvbm5lY3RlZCBmb3IgdGhpcyBzeXNfaWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBvdGhlciBzeXMgbW9kdWxlcyBzdGFydGVkIGEgdGltZXIgZm9yIFBFTkRJTkdfRVZULAotICogICAgICAgICAgICAgICAgICB0aGUgdGltZXIgY2FuIGJlIHN0b3BwZWQgbm93LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hcl9hdmR0X2Nvbm4odEJUQV9TWVNfSUQgc3lzX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NiX2luZGV4KSB7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXJfcmVnX2F2Y3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIHRvIEFWQ1RQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hcl9yZWdfYXZjdCgpIHsKLSAgaWYgKGJ0YV9hcl9jYi5hdmN0X3JlZ2lzdGVyZWQgPT0gMCkgewotICAgIEFWQ1RfUmVnaXN0ZXIoKTsKLSAgfQotICBidGFfYXJfY2IuYXZjdF9yZWdpc3RlcmVkIHw9IEJUQV9BUl9BVl9NQVNLOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX2RlcmVnX2F2Y3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlcmVnaXN0ZXIgZnJvbSBBVkNUUC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXJfZGVyZWdfYXZjdCgpIHsKLSAgYnRhX2FyX2NiLmF2Y3RfcmVnaXN0ZXJlZCAmPSB+QlRBX0FSX0FWX01BU0s7Ci0KLSAgaWYgKGJ0YV9hcl9jYi5hdmN0X3JlZ2lzdGVyZWQgPT0gMCkgQVZDVF9EZXJlZ2lzdGVyKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hcl9yZWdfYXZyYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYW4gU0RQIHJlY29yZCBmb3IgQVZSQ1AuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXJfcmVnX2F2cmModWludDE2X3Qgc2VydmljZV91dWlkLCBjb25zdCBjaGFyKiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm92aWRlcl9uYW1lLCB1aW50MTZfdCBjYXRlZ29yaWVzLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBicm93c2Vfc3VwcG9ydGVkLCB1aW50MTZfdCBwcm9maWxlX3ZlcnNpb24pIHsKLSAgdWludDhfdCBtYXNrID0gQlRBX0FSX0FWX01BU0s7Ci0gIHVpbnQ4X3QgdGVtcFs4XSwgKnA7Ci0KLSAgaWYgKCFjYXRlZ29yaWVzKSByZXR1cm47Ci0KLSAgaWYgKHNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQpIHsKLSAgICBpZiAoYnRhX2FyX2NiLnNkcF90Z19oYW5kbGUgPT0gMCkgewotICAgICAgYnRhX2FyX2NiLnRnX3JlZ2lzdGVyZWQgPSBtYXNrOwotICAgICAgYnRhX2FyX2NiLnNkcF90Z19oYW5kbGUgPSBTRFBfQ3JlYXRlUmVjb3JkKCk7Ci0gICAgICBBVlJDX0FkZFJlY29yZChzZXJ2aWNlX3V1aWQsIHNlcnZpY2VfbmFtZSwgcHJvdmlkZXJfbmFtZSwgY2F0ZWdvcmllcywKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9hcl9jYi5zZHBfdGdfaGFuZGxlLCBicm93c2Vfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uLCAwKTsKLSAgICAgIGJ0YV9zeXNfYWRkX3V1aWQoc2VydmljZV91dWlkKTsKLSAgICB9Ci0gICAgLyogb25seSBvbmUgVEcgaXMgYWxsb3dlZCAoZmlyc3QtY29tZSwgZmlyc3Qtc2VydmVkKS4KLSAgICAgKiBJZiBzZHBfdGdfaGFuZGxlIGlzIG5vbi0wLCBpZ25vcmUgdGhpcyByZXF1ZXN0ICovCi0gIH0gZWxzZSBpZiAoKHNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCkgfHwKLSAgICAgICAgICAgICAoc2VydmljZV91dWlkID09IFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX0NPTlRST0wpKSB7Ci0gICAgYnRhX2FyX2NiLmN0X2NhdGVnb3JpZXNbbWFzayAtIDFdID0gY2F0ZWdvcmllczsKLSAgICBjYXRlZ29yaWVzID0gYnRhX2FyX2NiLmN0X2NhdGVnb3JpZXNbMF0gfCBidGFfYXJfY2IuY3RfY2F0ZWdvcmllc1sxXTsKLSAgICBpZiAoYnRhX2FyX2NiLnNkcF9jdF9oYW5kbGUgPT0gMCkgewotICAgICAgYnRhX2FyX2NiLnNkcF9jdF9oYW5kbGUgPSBTRFBfQ3JlYXRlUmVjb3JkKCk7Ci0gICAgICBBVlJDX0FkZFJlY29yZChzZXJ2aWNlX3V1aWQsIHNlcnZpY2VfbmFtZSwgcHJvdmlkZXJfbmFtZSwgY2F0ZWdvcmllcywKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9hcl9jYi5zZHBfY3RfaGFuZGxlLCBicm93c2Vfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uLCAwKTsKLSAgICAgIGJ0YV9zeXNfYWRkX3V1aWQoc2VydmljZV91dWlkKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogbXVsdGlwbGUgQ1RzIGFyZSBhbGxvd2VkLgotICAgICAgICogQ2hhbmdlIHN1cHBvcnRlZCBjYXRlZ29yaWVzIG9uIHRoZSBzZWNvbmQgb25lICovCi0gICAgICBwID0gdGVtcDsKLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgY2F0ZWdvcmllcyk7Ci0gICAgICBTRFBfQWRkQXR0cmlidXRlKGJ0YV9hcl9jYi5zZHBfY3RfaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsICh1aW50MzJfdCkyLCAodWludDhfdCopdGVtcCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hcl9kZXJlZ19hdnJjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZS1yZWdpc3Rlci9kZWxldGUgYW4gU0RQIHJlY29yZAotICogICAgICAgICAgICAgICAgICBmb3IgQVZSQ1AuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXJfZGVyZWdfYXZyYyh1aW50MTZfdCBzZXJ2aWNlX3V1aWQpIHsKLSAgdWludDhfdCBtYXNrID0gQlRBX0FSX0FWX01BU0s7Ci0gIHVpbnQxNl90IGNhdGVnb3JpZXMgPSAwOwotICB1aW50OF90IHRlbXBbOF0sICpwOwotCi0gIGlmIChzZXJ2aWNlX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUKSB7Ci0gICAgaWYgKGJ0YV9hcl9jYi5zZHBfdGdfaGFuZGxlICYmIG1hc2sgPT0gYnRhX2FyX2NiLnRnX3JlZ2lzdGVyZWQpIHsKLSAgICAgIGJ0YV9hcl9jYi50Z19yZWdpc3RlcmVkID0gMDsKLSAgICAgIFNEUF9EZWxldGVSZWNvcmQoYnRhX2FyX2NiLnNkcF90Z19oYW5kbGUpOwotICAgICAgYnRhX2FyX2NiLnNkcF90Z19oYW5kbGUgPSAwOwotICAgICAgYnRhX3N5c19yZW1vdmVfdXVpZChzZXJ2aWNlX3V1aWQpOwotICAgIH0KLSAgfSBlbHNlIGlmIChzZXJ2aWNlX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpIHsKLSAgICBpZiAoYnRhX2FyX2NiLnNkcF9jdF9oYW5kbGUpIHsKLSAgICAgIGJ0YV9hcl9jYi5jdF9jYXRlZ29yaWVzW21hc2sgLSAxXSA9IDA7Ci0gICAgICBjYXRlZ29yaWVzID0gYnRhX2FyX2NiLmN0X2NhdGVnb3JpZXNbMF0gfCBidGFfYXJfY2IuY3RfY2F0ZWdvcmllc1sxXTsKLSAgICAgIGlmICghY2F0ZWdvcmllcykgewotICAgICAgICAvKiBubyBDVCBpcyBzdGlsbCByZWdpc3RlcmVkIC0gY2xlYXVwICovCi0gICAgICAgIFNEUF9EZWxldGVSZWNvcmQoYnRhX2FyX2NiLnNkcF9jdF9oYW5kbGUpOwotICAgICAgICBidGFfYXJfY2Iuc2RwX2N0X2hhbmRsZSA9IDA7Ci0gICAgICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoc2VydmljZV91dWlkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGNoYW5nZSBzdXBwb3J0ZWQgY2F0ZWdvcmllcyB0byB0aGUgcmVtYW5pbmcgb25lICovCi0gICAgICAgIHAgPSB0ZW1wOwotICAgICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIGNhdGVnb3JpZXMpOwotICAgICAgICBTRFBfQWRkQXR0cmlidXRlKGJ0YV9hcl9jYi5zZHBfY3RfaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgKHVpbnQzMl90KTIsICh1aW50OF90Kil0ZW1wKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0YS9hci9idGFfYXJfaW50LmggYi9idGEvYXIvYnRhX2FyX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjY3NmE3Li4wMDAwMDAwCi0tLSBhL2J0YS9hci9idGFfYXJfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA4LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHByaXZhdGUgaW50ZXJmYWNlIGZpbGUgZm9yIHRoZSBCVEEgYXVkaW8vdmlkZW8gcmVnaXN0cmF0aW9uCi0gKiAgbW9kdWxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9BUl9JTlRfSAotI2RlZmluZSBCVEFfQVJfSU5UX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXZfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdmR0X2FwaS5oIgotCi0jZGVmaW5lIEJUQV9BUl9BVl9NQVNLIDB4MDEKLSNkZWZpbmUgQlRBX0FSX0FWS19NQVNLIDB4MDIKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FSICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfYXZfY29ubl9jYmFjazsgIC8qIGF2IGNvbm5lY3Rpb24gY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgdWludDhfdCBhdmR0X3JlZ2lzdGVyZWQ7Ci0gIHVpbnQ4X3QgYXZjdF9yZWdpc3RlcmVkOwotICB1aW50MzJfdCBzZHBfdGdfaGFuZGxlOwotICB1aW50MzJfdCBzZHBfY3RfaGFuZGxlOwotICB1aW50MTZfdCBjdF9jYXRlZ29yaWVzWzJdOwotICB1aW50OF90IHRnX3JlZ2lzdGVyZWQ7Ci0gIHRCVEFfQVZfSE5ETCBobmRsOyAvKiBIYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0gdGhhdCByZWplY3RlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICovCi19IHRCVEFfQVJfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEdsb2JhbCBkYXRhCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogY29udHJvbCBibG9jayBkZWNsYXJhdGlvbiAqLwotZXh0ZXJuIHRCVEFfQVJfQ0IgYnRhX2FyX2NiOwotCi0jZW5kaWYgLyogQlRBX0FSX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2FhY3QuY2MgYi9idGEvYXYvYnRhX2F2X2FhY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjAzZmQuLjAwMDAwMDAKLS0tIGEvYnRhL2F2L2J0YV9hdl9hYWN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBhY3Rpb24gZnVuY3Rpb25zIGZvciBhZHZhbmNlZCBhdWRpby92aWRlbyBzdHJlYW0KLSAqICBzdGF0ZSBtYWNoaW5lLiB0aGVzZSBmdW5jdGlvbnMgYXJlIHNoYXJlZCBieSBib3RoIGF1ZGlvIGFuZCB2aWRlbwotICogIHN0cmVhbXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfYXYiCi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXJfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2NvLmgiCi0jaW5jbHVkZSAiYnRpZi9hdnJjcC9hdnJjcF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXZfY28uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYTJkcF9zYmMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciBjaGFyIGtCdG1Mb2dUYWdbXSA9ICJBMkRQIjsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiB0aGUgZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc3RhcnQgc2VydmljZSBkaXNjb3Zlcnkgb24gQVZSQ1AgKi8KLSNpZm5kZWYgQlRBX0FWX1JDX0RJU0NfVElNRV9WQUwKLSNkZWZpbmUgQlRBX0FWX1JDX0RJU0NfVElNRV9WQUwgMzUwMAotI2VuZGlmCi0KLS8qIHRoZSB0aW1lciBpbiBtaWxsaXNlY29uZHMgdG8gZ3VhcmQgYWdhaW5zdCBsaW5rIGJ1c3kgYW5kIEFWRFRfQ2xvc2VSZXEgZmFpbGVkCi0gKiB0byBiZSBzZW50ICovCi0jaWZuZGVmIEJUQV9BVl9DTE9TRV9SRVFfVElNRV9WQUwKLSNkZWZpbmUgQlRBX0FWX0NMT1NFX1JFUV9USU1FX1ZBTCA0MDAwCi0jZW5kaWYKLQotLyogbnVtYmVyIHRvIHJldHJ5IG9uIHJlY29uZmlndXJlIGZhaWx1cmUgLSBzb21lIGhlYWRzZXRzIHJlcXVpcnMgdGhpcyBudW1iZXIgdG8KLSAqIGJlIG1vcmUgdGhhbiAxICovCi0jaWZuZGVmIEJUQV9BVl9SRUNPTkZJR19SRVRSWQotI2RlZmluZSBCVEFfQVZfUkVDT05GSUdfUkVUUlkgNgotI2VuZGlmCi0KLS8qIEFDTCBxdW90YSB3ZSBhcmUgbGV0dGluZyBGVyB1c2UgZm9yIEEyRFAgT2ZmbG9hZCBUeC4gKi8KLSNkZWZpbmUgQlRBX0FWX0EyRFBfT0ZGTE9BRF9YTUlUX1FVT1RBIDQKLQotc3RhdGljIHZvaWQgYnRhX2F2X29mZmxvYWRfY29kZWNfYnVpbGRlcih0QlRBX0FWX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9BMkRQX09GRkxPQUQqIHBfYTJkcF9vZmZsb2FkKTsKLQotLyogc3RhdGUgbWFjaGluZSBzdGF0ZXMgKi8KLWVudW0gewotICBCVEFfQVZfSU5JVF9TU1QsCi0gIEJUQV9BVl9JTkNPTUlOR19TU1QsCi0gIEJUQV9BVl9PUEVOSU5HX1NTVCwKLSAgQlRBX0FWX09QRU5fU1NULAotICBCVEFfQVZfUkNGR19TU1QsCi0gIEJUQV9BVl9DTE9TSU5HX1NTVAotfTsKLQotLyogdGhlIGNhbGwgb3V0IGZ1bmN0aW9ucyBmb3IgYXVkaW8gc3RyZWFtICovCi1jb25zdCB0QlRBX0FWX0NPX0ZVTkNUUyBidGFfYXZfYTJkcF9jb3MgPSB7YnRhX2F2X2NvX2F1ZGlvX2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NvX2F1ZGlvX2Rpc2NfcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19nZXRjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NvX2F1ZGlvX3NldGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfY29fYXVkaW9fb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfY29fYXVkaW9fY2xvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NvX2F1ZGlvX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19zdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19zb3VyY2VfZGF0YV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19kZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfY29fYXVkaW9fdXBkYXRlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfY29fZ2V0X3NjbXN0X2luZm99OwotCi0vKiB0aGVzZSB0YWJsZXMgdHJhbnNsYXRlIEFWRFQgZXZlbnRzIHRvIFNTTSBldmVudHMgKi8KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBidGFfYXZfc3RyZWFtX2V2dF9va1tdID0gewotICAgIEJUQV9BVl9TVFJfRElTQ19PS19FVlQsICAgICAgLyogQVZEVF9ESVNDT1ZFUl9DRk1fRVZUICovCi0gICAgQlRBX0FWX1NUUl9HRVRDQVBfT0tfRVZULCAgICAvKiBBVkRUX0dFVENBUF9DRk1fRVZUICovCi0gICAgQlRBX0FWX1NUUl9PUEVOX09LX0VWVCwgICAgICAvKiBBVkRUX09QRU5fQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfT1BFTl9PS19FVlQsICAgICAgLyogQVZEVF9PUEVOX0lORF9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX0NPTkZJR19JTkRfRVZULCAgIC8qIEFWRFRfQ09ORklHX0lORF9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX1NUQVJUX09LX0VWVCwgICAgIC8qIEFWRFRfU1RBUlRfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfU1RBUlRfT0tfRVZULCAgICAgLyogQVZEVF9TVEFSVF9JTkRfRVZUICovCi0gICAgQlRBX0FWX1NUUl9TVVNQRU5EX0NGTV9FVlQsICAvKiBBVkRUX1NVU1BFTkRfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfU1VTUEVORF9DRk1fRVZULCAgLyogQVZEVF9TVVNQRU5EX0lORF9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX0NMT1NFX0VWVCwgICAgICAgIC8qIEFWRFRfQ0xPU0VfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfQ0xPU0VfRVZULCAgICAgICAgLyogQVZEVF9DTE9TRV9JTkRfRVZUICovCi0gICAgQlRBX0FWX1NUUl9SRUNPTkZJR19DRk1fRVZULCAvKiBBVkRUX1JFQ09ORklHX0NGTV9FVlQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFWRFRfUkVDT05GSUdfSU5EX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfU0VDVVJJVFlfQ0ZNX0VWVCwgLyogQVZEVF9TRUNVUklUWV9DRk1fRVZUICovCi0gICAgQlRBX0FWX1NUUl9TRUNVUklUWV9JTkRfRVZULCAvKiBBVkRUX1NFQ1VSSVRZX0lORF9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX1dSSVRFX0NGTV9FVlQsICAgIC8qIEFWRFRfV1JJVEVfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9BVkRUX0NPTk5FQ1RfRVZULCAgICAgLyogQVZEVF9DT05ORUNUX0lORF9FVlQgKi8KLSAgICBCVEFfQVZfQVZEVF9ESVNDT05ORUNUX0VWVCwgIC8qIEFWRFRfRElTQ09OTkVDVF9JTkRfRVZUICovCi0gICAgQlRBX0FWX0FWRFRfUlBUX0NPTk5fRVZULCAvKiBBVkRUX1JFUE9SVF9DT05OX0VWVCAqLwotICAgIEJUQV9BVl9BVkRUX1JQVF9DT05OX0VWVCwgLyogQVZEVF9SRVBPUlRfRElTQ09OTl9FVlQgKi8KLSAgICBCVEFfQVZfQVZEVF9ERUxBWV9SUFRfRVZULCAvKiBBVkRUX0RFTEFZX1JFUE9SVF9FVlQgKi8KLSAgICBCVEFfQVZfQVZEVF9ERUxBWV9SUFRfQ0ZNX0VWVCwgLyogQVZEVF9ERUxBWV9SRVBPUlRfQ0ZNX0VWVCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJ0YV9hdl9zdHJlYW1fZXZ0X2ZhaWxbXSA9IHsKLSAgICBCVEFfQVZfU1RSX0RJU0NfRkFJTF9FVlQsICAgIC8qIEFWRFRfRElTQ09WRVJfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfR0VUQ0FQX0ZBSUxfRVZULCAgLyogQVZEVF9HRVRDQVBfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfT1BFTl9GQUlMX0VWVCwgICAgLyogQVZEVF9PUEVOX0NGTV9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX09QRU5fT0tfRVZULCAgICAgIC8qIEFWRFRfT1BFTl9JTkRfRVZUICovCi0gICAgQlRBX0FWX1NUUl9DT05GSUdfSU5EX0VWVCwgICAvKiBBVkRUX0NPTkZJR19JTkRfRVZUICovCi0gICAgQlRBX0FWX1NUUl9TVEFSVF9GQUlMX0VWVCwgICAvKiBBVkRUX1NUQVJUX0NGTV9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX1NUQVJUX09LX0VWVCwgICAgIC8qIEFWRFRfU1RBUlRfSU5EX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfU1VTUEVORF9DRk1fRVZULCAgLyogQVZEVF9TVVNQRU5EX0NGTV9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX1NVU1BFTkRfQ0ZNX0VWVCwgIC8qIEFWRFRfU1VTUEVORF9JTkRfRVZUICovCi0gICAgQlRBX0FWX1NUUl9DTE9TRV9FVlQsICAgICAgICAvKiBBVkRUX0NMT1NFX0NGTV9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX0NMT1NFX0VWVCwgICAgICAgIC8qIEFWRFRfQ0xPU0VfSU5EX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfUkVDT05GSUdfQ0ZNX0VWVCwgLyogQVZEVF9SRUNPTkZJR19DRk1fRVZUICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBVkRUX1JFQ09ORklHX0lORF9FVlQgKi8KLSAgICBCVEFfQVZfU1RSX1NFQ1VSSVRZX0NGTV9FVlQsIC8qIEFWRFRfU0VDVVJJVFlfQ0ZNX0VWVCAqLwotICAgIEJUQV9BVl9TVFJfU0VDVVJJVFlfSU5EX0VWVCwgLyogQVZEVF9TRUNVUklUWV9JTkRfRVZUICovCi0gICAgQlRBX0FWX1NUUl9XUklURV9DRk1fRVZULCAgICAvKiBBVkRUX1dSSVRFX0NGTV9FVlQgKi8KLSAgICBCVEFfQVZfQVZEVF9DT05ORUNUX0VWVCwgICAgIC8qIEFWRFRfQ09OTkVDVF9JTkRfRVZUICovCi0gICAgQlRBX0FWX0FWRFRfRElTQ09OTkVDVF9FVlQsICAvKiBBVkRUX0RJU0NPTk5FQ1RfSU5EX0VWVCAqLwotICAgIEJUQV9BVl9BVkRUX1JQVF9DT05OX0VWVCwgLyogQVZEVF9SRVBPUlRfQ09OTl9FVlQgKi8KLSAgICBCVEFfQVZfQVZEVF9SUFRfQ09OTl9FVlQsIC8qIEFWRFRfUkVQT1JUX0RJU0NPTk5fRVZUICovCi0gICAgQlRBX0FWX0FWRFRfREVMQVlfUlBUX0VWVCwgLyogQVZEVF9ERUxBWV9SRVBPUlRfRVZUICovCi0gICAgQlRBX0FWX0FWRFRfREVMQVlfUlBUX0NGTV9FVlQsIC8qIEFWRFRfREVMQVlfUkVQT1JUX0NGTV9FVlQgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dldF9zY2JfaGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBnaXZlcyB0aGUgcmVnaXN0ZXJlZCBBVkRUIGhhbmRsZS5ieSBjaGVja2luZyB3aXRoIHNlcF90eXBlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRhX2F2X2dldF9zY2JfaGFuZGxlKHRCVEFfQVZfU0NCKiBwX3NjYiwgdWludDhfdCBsb2NhbF9zZXApIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOyBpKyspIHsKLSAgICBpZiAoKHBfc2NiLT5zZXBzW2ldLnRzZXAgPT0gbG9jYWxfc2VwKSAmJgotICAgICAgICBBMkRQX0NvZGVjVHlwZUVxdWFscyhwX3NjYi0+c2Vwc1tpXS5jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+Y2ZnLmNvZGVjX2luZm8pKSB7Ci0gICAgICByZXR1cm4gKHBfc2NiLT5zZXBzW2ldLmF2X2hhbmRsZSk7Ci0gICAgfQotICB9Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsb2NhbCBzZXBfdHlwZSAlZCBub3QgZm91bmQiLCBfX2Z1bmNfXywgbG9jYWxfc2VwKQotICByZXR1cm4gMDsgLyogcmV0dXJuIGludmFsaWQgaGFuZGxlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2dldF9zY2Jfc2VwX3R5cGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGdpdmVzIHRoZSBzZXAgdHlwZSBieSBjcm9zcy1jaGVja2luZyB3aXRoIEFWRFQgaGFuZGxlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidGFfYXZfZ2V0X3NjYl9zZXBfdHlwZSh0QlRBX0FWX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRhdmR0X2hhbmRsZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVg7IGkrKykgewotICAgIGlmIChwX3NjYi0+c2Vwc1tpXS5hdl9oYW5kbGUgPT0gdGF2ZHRfaGFuZGxlKSByZXR1cm4gKHBfc2NiLT5zZXBzW2ldLnRzZXApOwotICB9Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBhdmR0X2hhbmRsZSAlZCBub3QgZm91bmQiLCBfX2Z1bmNfXywgdGF2ZHRfaGFuZGxlKQotICByZXR1cm4gQVZEVF9UU0VQX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2F2ZV9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBjb3B5IHRoZSBiZF9hZGRyIGFuZCBtYXliZSByZXNldCB0aGUgc3VwcG9ydGVkIGZsYWdzCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfc2F2ZV9hZGRyKHRCVEFfQVZfU0NCKiBwX3NjYiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlcj0lcyByZWNmZ19zdXA6JWQsIHN1c3BlbmRfc3VwOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5yZWNmZ19zdXAsCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPnN1c3BlbmRfc3VwKTsKLSAgaWYgKHBfc2NiLT5QZWVyQWRkcmVzcygpICE9IGJkX2FkZHIpIHsKLSAgICBMT0dfSU5GTygiJXM6IHJlc2V0IGZsYWdzIG9sZF9hZGRyPSVzIG5ld19hZGRyPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAvKiBhIG5ldyBhZGRyLCByZXNldCB0aGUgc3VwcG9ydGVkIGZsYWdzICovCi0gICAgcF9zY2ItPnJlY2ZnX3N1cCA9IHRydWU7Ci0gICAgcF9zY2ItPnN1c3BlbmRfc3VwID0gdHJ1ZTsKLSAgfQotCi0gIC8qIGRvIHRoaXMgY29weSBhbnl3YXksIGp1c3QgaW4gY2FzZSB0aGUgZmlyc3QgYWRkciBtYXRjaGVzCi0gICAqIHRoZSBjb250cm9sIGJsb2NrIG9uZSBieSBhY2NpZGVudCAqLwotICBwX3NjYi0+T25Db25uZWN0ZWQoYmRfYWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBub3RpZnlfc3RhcnRfZmFpbGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBub3RpZnkgdXAtbGF5ZXIgQVYgc3RhcnQgZmFpbGVkCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBub3RpZnlfc3RhcnRfZmFpbGVkKHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBMT0dfRVJST1IoIiVzOiBwZWVyICVzIHJvbGU6MHgleCBidGFfY2hhbm5lbDolZCBidGFfaGFuZGxlOjB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPnJvbGUsIHBfc2NiLT5jaG5sLAotICAgICAgICAgICAgcF9zY2ItPmhuZGwpOwotICB0QlRBX0FWX1NUQVJUIHN0YXJ0OwotICAvKiBpZiBzdGFydCBmYWlsZWQsIGNsZWFyIHJvbGUgKi8KLSAgcF9zY2ItPnJvbGUgJj0gfkJUQV9BVl9ST0xFX1NUQVJUX0lOVDsKLSAgc3RhcnQuY2hubCA9IHBfc2NiLT5jaG5sOwotICBzdGFydC5zdGF0dXMgPSBCVEFfQVZfRkFJTDsKLSAgc3RhcnQuaW5pdGlhdG9yID0gdHJ1ZTsKLSAgc3RhcnQuaG5kbCA9IHBfc2NiLT5obmRsOwotCi0gIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gIGJ0YV9hdl9kYXRhLnN0YXJ0ID0gc3RhcnQ7Ci0gICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9TVEFSVF9FVlQsICZidGFfYXZfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc3RfcmNfdGltZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHN0YXJ0IHRoZSBBVlJDIHRpbWVyIGlmIG5vIFJDIGNvbm5lY3Rpb24gJiBDVCBpcyBzdXBwb3J0ZWQgJgotICogICAgICAgICAgICAgICAgICBSQyBpcyB1c2VkIG9yCi0gKiAgICAgICAgICAgICAgICAgIGFzIEFDUCAod2UgZG8gbm90IHJlYWxseSBrbm93IGlmIHdlIHdhbnQgQVZSQykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc3RfcmNfdGltZXIodEJUQV9BVl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmNfaGFuZGxlOiVkLCB1c2VfcmM6ICVkIiwgX19mdW5jX18sIHBfc2NiLT5yY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPnVzZV9yYyk7Ci0gIC8qIGZvciBvdXRnb2luZyBSQyBjb25uZWN0aW9uIGFzIElOVC9DVCAqLwotICBpZiAoKHBfc2NiLT5yY19oYW5kbGUgPT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FKSAmJgotICAgICAgLyogKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpICYmICovCi0gICAgICAocF9zY2ItPnVzZV9yYyB8fCAocF9zY2ItPnJvbGUgJiBCVEFfQVZfUk9MRV9BRF9BQ1ApKSkgewotICAgIGlmICgocF9zY2ItPndhaXQgJiBCVEFfQVZfV0FJVF9ST0xFX1NXX0JJVFMpID09IDApIHsKLSAgICAgIGJ0YV9zeXNfc3RhcnRfdGltZXIocF9zY2ItPmF2cmNfY3RfdGltZXIsIEJUQV9BVl9SQ19ESVNDX1RJTUVfVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQVZfQVZSQ19USU1FUl9FVlQsIHBfc2NiLT5obmRsKTsKLSAgICB9IGVsc2UgewotICAgICAgcF9zY2ItPndhaXQgfD0gQlRBX0FWX1dBSVRfQ0hFQ0tfUkM7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfbmV4dF9nZXRjYXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBnZXRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIG5leHQgYXZhaWxhYmxlCi0gKiAgICAgICAgICAgICAgICAgIHN0cmVhbSBmb3VuZCBpbiB0aGUgZGlzY292ZXJ5IHJlc3VsdHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHdlIHNlbnQgcmVxdWVzdCB0byBBVkRULCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0YV9hdl9uZXh0X2dldGNhcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIGludCBpOwotICBib29sIHNlbnRfY21kID0gZmFsc2U7Ci0gIHVpbnQxNl90IHV1aWRfaW50ID0gcF9zY2ItPnV1aWRfaW50OwotICB1aW50OF90IHNlcF9yZXF1ZXN0ZWQgPSAwOwotCi0gIGlmICh1dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UpCi0gICAgc2VwX3JlcXVlc3RlZCA9IEFWRFRfVFNFUF9TTks7Ci0gIGVsc2UgaWYgKHV1aWRfaW50ID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspCi0gICAgc2VwX3JlcXVlc3RlZCA9IEFWRFRfVFNFUF9TUkM7Ci0KLSAgZm9yIChpID0gcF9zY2ItPnNlcF9pbmZvX2lkeDsgaSA8IHBfc2NiLT5udW1fc2VwczsgaSsrKSB7Ci0gICAgLyogc3RlYW0gbm90IGluIHVzZSwgaXMgYSBzaW5rLCBhbmQgaXMgdGhlIHJpZ2h0IG1lZGlhIHR5cGUgKGF1ZGlvL3ZpZGVvKSAqLwotICAgIGlmICgoIXBfc2NiLT5zZXBfaW5mb1tpXS5pbl91c2UpICYmCi0gICAgICAgIChwX3NjYi0+c2VwX2luZm9baV0udHNlcCA9PSBzZXBfcmVxdWVzdGVkKSAmJgotICAgICAgICAocF9zY2ItPnNlcF9pbmZvW2ldLm1lZGlhX3R5cGUgPT0gcF9zY2ItPm1lZGlhX3R5cGUpKSB7Ci0gICAgICBwX3NjYi0+c2VwX2luZm9faWR4ID0gaTsKLQotICAgICAgLyogd2UgZ290IGEgc3RyZWFtOyBnZXQgaXRzIGNhcGFiaWxpdGllcyAqLwotICAgICAgYm9vbCBnZXRfYWxsX2NhcCA9IChwX3NjYi0+QXZkdHBWZXJzaW9uKCkgPj0gQVZEVF9WRVJTSU9OXzFfMykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoQTJEUF9HZXRBdmR0cFZlcnNpb24oKSA+PSBBVkRUX1ZFUlNJT05fMV8zKTsKLSAgICAgIEFWRFRfR2V0Q2FwUmVxKHBfc2NiLT5QZWVyQWRkcmVzcygpLCBwX3NjYi0+aGRpLCBwX3NjYi0+c2VwX2luZm9baV0uc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICZwX3NjYi0+cGVlcl9jYXAsICZidGFfYXZfcHJvY19zdHJlYW1fZXZ0LCBnZXRfYWxsX2NhcCk7Ci0gICAgICBzZW50X2NtZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiBubyBzdHJlYW1zIGF2YWlsYWJsZSB0aGVuIHN0cmVhbSBvcGVuIGZhaWxzICovCi0gIGlmICghc2VudF9jbWQpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQlRBX0FWX1NUUl9HRVRDQVBfRkFJTF9FVlQ6IHBlZXJfYWRkcj0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9TVFJfR0VUQ0FQX0ZBSUxfRVZULCBwX2RhdGEpOwotICB9Ci0KLSAgcmV0dXJuIHNlbnRfY21kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXRpbGl0eSBmdW5jdGlvbiB0byBjb21wb3NlIHN0cmVhbSBldmVudHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dCh1aW50OF90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2JfaW5kZXgpIHsKLSAgQ0hFQ0tfTFQoc2NiX2luZGV4LCBCVEFfQVZfTlVNX1NUUlMpOwotICB0QlRBX0FWX1NDQiogcF9zY2IgPSBidGFfYXZfY2IucF9zY2Jbc2NiX2luZGV4XTsKLSAgdWludDE2X3Qgc2VjX2xlbiA9IDA7Ci0KLSAgQVBQTF9UUkFDRV9FVkVOVCgKLSAgICAgICIlczogcGVlcl9hZGRyZXNzOiAlcyBhdmR0X2hhbmRsZTogJWQgZXZlbnQ9MHgleCBzY2JfaW5kZXg9JWQgcF9zY2I9JXAiLAotICAgICAgX19mdW5jX18sIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBoYW5kbGUsIGV2ZW50LCBzY2JfaW5kZXgsIHBfc2NiKTsKLQotICBpZiAocF9kYXRhKSB7Ci0gICAgaWYgKGV2ZW50ID09IEFWRFRfU0VDVVJJVFlfSU5EX0VWVCkgewotICAgICAgc2VjX2xlbiA9IChwX2RhdGEtPnNlY3VyaXR5X2luZC5sZW4gPCBCVEFfQVZfU0VDVVJJVFlfTUFYX0xFTikKLSAgICAgICAgICAgICAgICAgICAgPyBwX2RhdGEtPnNlY3VyaXR5X2luZC5sZW4KLSAgICAgICAgICAgICAgICAgICAgOiBCVEFfQVZfU0VDVVJJVFlfTUFYX0xFTjsKLSAgICB9IGVsc2UgaWYgKGV2ZW50ID09IEFWRFRfU0VDVVJJVFlfQ0ZNX0VWVCAmJiBwX2RhdGEtPmhkci5lcnJfY29kZSA9PSAwKSB7Ci0gICAgICBzZWNfbGVuID0gKHBfZGF0YS0+c2VjdXJpdHlfY2ZtLmxlbiA8IEJUQV9BVl9TRUNVUklUWV9NQVhfTEVOKQotICAgICAgICAgICAgICAgICAgICA/IHBfZGF0YS0+c2VjdXJpdHlfY2ZtLmxlbgotICAgICAgICAgICAgICAgICAgICA6IEJUQV9BVl9TRUNVUklUWV9NQVhfTEVOOwotICAgIH0KLSAgfQotCi0gIGlmIChwX3NjYikgewotICAgIHRCVEFfQVZfU1RSX01TRyogcF9tc2cgPQotICAgICAgICAodEJUQV9BVl9TVFJfTVNHKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX1NUUl9NU0cpICsgc2VjX2xlbik7Ci0KLSAgICAvKiBjb3B5IGV2ZW50IGRhdGEsIGJkIGFkZHIsIGFuZCBoYW5kbGUgdG8gZXZlbnQgbWVzc2FnZSBidWZmZXIgKi8KLSAgICBwX21zZy0+aGRyLm9mZnNldCA9IDA7Ci0KLSAgICBwX21zZy0+YmRfYWRkciA9IGJkX2FkZHI7Ci0gICAgcF9tc2ctPnNjYl9pbmRleCA9IHNjYl9pbmRleDsKLSAgICBBUFBMX1RSQUNFX0VWRU5UKCIlczogc3RyZWFtIGV2ZW50IGJkX2FkZHI6ICVzIHNjYl9pbmRleDogJXUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgc2NiX2luZGV4KTsKLQotICAgIGlmIChwX2RhdGEgIT0gTlVMTCkgewotICAgICAgbWVtY3B5KCZwX21zZy0+bXNnLCBwX2RhdGEsIHNpemVvZih0QVZEVF9DVFJMKSk7Ci0gICAgICAvKiBjb3B5IGNvbmZpZyBwYXJhbXMgdG8gZXZlbnQgbWVzc2FnZSBidWZmZXIgKi8KLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBBVkRUX0NPTkZJR19JTkRfRVZUOgotICAgICAgICAgIHBfbXNnLT5jZmcgPSAqcF9kYXRhLT5jb25maWdfaW5kLnBfY2ZnOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZEVF9TRUNVUklUWV9JTkRfRVZUOgotICAgICAgICAgIHBfbXNnLT5tc2cuc2VjdXJpdHlfaW5kLnBfZGF0YSA9ICh1aW50OF90KikocF9tc2cgKyAxKTsKLSAgICAgICAgICBtZW1jcHkocF9tc2ctPm1zZy5zZWN1cml0eV9pbmQucF9kYXRhLCBwX2RhdGEtPnNlY3VyaXR5X2luZC5wX2RhdGEsCi0gICAgICAgICAgICAgICAgIHNlY19sZW4pOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZEVF9TRUNVUklUWV9DRk1fRVZUOgotICAgICAgICAgIHBfbXNnLT5tc2cuc2VjdXJpdHlfY2ZtLnBfZGF0YSA9ICh1aW50OF90KikocF9tc2cgKyAxKTsKLSAgICAgICAgICBpZiAocF9kYXRhLT5oZHIuZXJyX2NvZGUgPT0gMCkgewotICAgICAgICAgICAgbWVtY3B5KHBfbXNnLT5tc2cuc2VjdXJpdHlfY2ZtLnBfZGF0YSwgcF9kYXRhLT5zZWN1cml0eV9jZm0ucF9kYXRhLAotICAgICAgICAgICAgICAgICAgIHNlY19sZW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFWRFRfU1VTUEVORF9JTkRfRVZUOgotICAgICAgICAgIHBfbXNnLT5tc2cuaGRyLmVycl9jb2RlID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFWRFRfQ09OTkVDVF9JTkRfRVZUOgotICAgICAgICAgIHBfc2NiLT5yZWNmZ19zdXAgPSB0cnVlOwotICAgICAgICAgIHBfc2NiLT5zdXNwZW5kX3N1cCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcF9tc2ctPm1zZy5oZHIuZXJyX2NvZGUgPSAwOwotICAgIH0KLQotICAgIC8qIGxvb2sgdXAgYXBwbGljYXRpb24gZXZlbnQgKi8KLSAgICBpZiAoKHBfZGF0YSA9PSBOVUxMKSB8fCAocF9kYXRhLT5oZHIuZXJyX2NvZGUgPT0gMCkpIHsKLSAgICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBidGFfYXZfc3RyZWFtX2V2dF9va1tldmVudF07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBidGFfYXZfc3RyZWFtX2V2dF9mYWlsW2V2ZW50XTsKLSAgICB9Ci0KLSAgICBwX21zZy0+aW5pdGlhdG9yID0gZmFsc2U7Ci0gICAgaWYgKGV2ZW50ID09IEFWRFRfU1VTUEVORF9DRk1fRVZUKSBwX21zZy0+aW5pdGlhdG9yID0gdHJ1ZTsKLQotICAgIEFQUExfVFJBQ0VfVkVSQk9TRSgiJXM6IGJ0YV9oYW5kbGU6MHgleCBhdmR0X2hhbmRsZTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+aG5kbCwgaGFuZGxlKTsKLSAgICBwX21zZy0+aGRyLmxheWVyX3NwZWNpZmljID0gcF9zY2ItPmhuZGw7Ci0gICAgcF9tc2ctPmhhbmRsZSA9IGhhbmRsZTsKLSAgICBwX21zZy0+YXZkdF9ldmVudCA9IGV2ZW50OwotICAgIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci0gIH0KLQotICBpZiAocF9kYXRhKSB7Ci0gICAgYnRhX2F2X2Nvbm5fY2JhY2soaGFuZGxlLCBiZF9hZGRyLCBldmVudCwgcF9kYXRhLCBzY2JfaW5kZXgpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwX2RhdGEgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3NpbmtfZGF0YV9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgQVZEVFAgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNpbmsgc3RyZWFtIGV2ZW50cy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc2lua19kYXRhX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCBCVF9IRFIqIHBfcGt0LCB1aW50MzJfdCB0aW1lX3N0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbV9wdCkgewotICBpbnQgaW5kZXggPSAwOwotICB0QlRBX0FWX1NDQiogcF9zY2I7Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IGF2ZHRfaGFuZGxlOiAlZCBwa3RfbGVuPTB4JXggIG9mZnNldCA9IDB4JXggIgotICAgICAgIm51bWJlciBvZiBmcmFtZXMgMHgleCBzZXF1ZW5jZSBudW1iZXIgMHgleCIsCi0gICAgICBfX2Z1bmNfXywgaGFuZGxlLCBwX3BrdC0+bGVuLCBwX3BrdC0+b2Zmc2V0LAotICAgICAgKigodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0KSwgcF9wa3QtPmxheWVyX3NwZWNpZmljKTsKLSAgLyogR2V0IFNDQiBhbmQgY29ycmVjdCBzZXAgdHlwZSAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBCVEFfQVZfTlVNX1NUUlM7IGluZGV4KyspIHsKLSAgICBwX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYltpbmRleF07Ci0gICAgaWYgKChwX3NjYi0+YXZkdF9oYW5kbGUgPT0gaGFuZGxlKSAmJgotICAgICAgICAocF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLnRzZXAgPT0gQVZEVF9UU0VQX1NOSykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoaW5kZXggPT0gQlRBX0FWX05VTV9TVFJTKSB7Ci0gICAgLyogY2Fubm90IGZpbmQgY29ycmVjdCBoYW5kbGVyICovCi0gICAgb3NpX2ZyZWUocF9wa3QpOwotICAgIHJldHVybjsKLSAgfQotICBwX3BrdC0+ZXZlbnQgPSBCVEFfQVZfU0lOS19NRURJQV9EQVRBX0VWVDsKLSAgcF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLnBfYXBwX3NpbmtfZGF0YV9jYmFjaygKLSAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLCBCVEFfQVZfU0lOS19NRURJQV9EQVRBX0VWVCwgKHRCVEFfQVZfTUVESUEqKXBfcGt0KTsKLSAgLyogRnJlZSB0aGUgYnVmZmVyOiBhIGNvcHkgb2YgdGhlIHBhY2tldCBoYXMgYmVlbiBkZWxpdmVyZWQgKi8KLSAgb3NpX2ZyZWUocF9wa3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2EyZHBfc2RwX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBMkRQIHNlcnZpY2UgZGlzY292ZXJ5IGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfYTJkcF9zZHBfY2JhY2soYm9vbCBmb3VuZCwgdEEyRFBfU2VydmljZSogcF9zZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyA6IGZvdW5kPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgKGZvdW5kKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0gIHRCVEFfQVZfU0NCKiBwX3NjYiA9IE5VTEw7Ci0gIGlmIChwZWVyX2FkZHJlc3MgIT0gUmF3QWRkcmVzczo6a0VtcHR5KSB7Ci0gICAgcF9zY2IgPSBidGFfYXZfYWRkcl90b19zY2IocGVlcl9hZGRyZXNzKTsKLSAgfQotICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgIHBfc2NiID0gYnRhX2F2X2huZGxfdG9fc2NiKGJ0YV9hdl9jYi5oYW5kbGUpOwotICB9Ci0gIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IG5vIHNjYiBmb3VuZCBmb3IgU0RQIGhhbmRsZSgweCV4KSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLmhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChidGFfYXZfY2IuaGFuZGxlICE9IHBfc2NiLT5obmRsKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogU0RQIGJ0YV9oYW5kbGUgZXhwZWN0ZWQ9MHgleCBwcm9jZXNzaW5nPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnRhX2F2X2NiLmhhbmRsZSwgcF9zY2ItPmhuZGwpOwotICB9Ci0KLSAgaWYgKCFmb3VuZCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwZWVyICVzIEEyRFAgc2VydmljZSBkaXNjb3ZlcnkgZmFpbGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGZvdW5kPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIChmb3VuZCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotICB0QlRBX0FWX1NEUF9SRVMqIHBfbXNnID0KLSAgICAgICh0QlRBX0FWX1NEUF9SRVMqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfU0RQX1JFUykpOwotICBpZiAoZm91bmQpIHsKLSAgICBwX21zZy0+aGRyLmV2ZW50ID0gQlRBX0FWX1NEUF9ESVNDX09LX0VWVDsKLSAgfSBlbHNlIHsKLSAgICBwX21zZy0+aGRyLmV2ZW50ID0gQlRBX0FWX1NEUF9ESVNDX0ZBSUxfRVZUOwotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBCVEFfQVZfU0RQX0RJU0NfRkFJTF9FVlQ6IHBlZXJfYWRkcj0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotICBpZiAoZm91bmQgJiYgKHBfc2VydmljZSAhPSBOVUxMKSkgewotICAgIHBfc2NiLT5TZXRBdmR0cFZlcnNpb24ocF9zZXJ2aWNlLT5hdmR0X3ZlcnNpb24pOwotICAgIGlmIChwX3NlcnZpY2UtPmF2ZHRfdmVyc2lvbiAhPSAwKSB7Ci0gICAgICBpZiAoYnRpZl9jb25maWdfc2V0X2JpbihwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEVFBfVkVSU0lPTl9DT05GSUdfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZwX3NlcnZpY2UtPmF2ZHRfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwX3NlcnZpY2UtPmF2ZHRfdmVyc2lvbikpKSB7Ci0gICAgICAgIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEZhaWxlZCB0byBzdG9yZSBwZWVyIEFWRFRQIHZlcnNpb24gZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwX3NjYi0+U2V0QXZkdHBWZXJzaW9uKDApOwotICB9Ci0gIHBfbXNnLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBwX3NjYi0+aG5kbDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2FkanVzdF9zZXBzX2lkeAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgYWRqdXN0IHRoZSBzZXBfaWR4Ci0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfYWRqdXN0X3NlcHNfaWR4KHRCVEFfQVZfU0NCKiBwX3NjYiwgdWludDhfdCBhdmR0X2hhbmRsZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY05hbWUocF9zY2ItPmNmZy5jb2RlY19pbmZvKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsgaSsrKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGF2ZHRfaGFuZGxlOiAlZCBjb2RlYzogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zZXBzW2ldLmF2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNOYW1lKHBfc2NiLT5zZXBzW2ldLmNvZGVjX2luZm8pKTsKLSAgICBpZiAocF9zY2ItPnNlcHNbaV0uYXZfaGFuZGxlICYmIChwX3NjYi0+c2Vwc1tpXS5hdl9oYW5kbGUgPT0gYXZkdF9oYW5kbGUpICYmCi0gICAgICAgIEEyRFBfQ29kZWNUeXBlRXF1YWxzKHBfc2NiLT5zZXBzW2ldLmNvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5jZmcuY29kZWNfaW5mbykpIHsKLSAgICAgIHBfc2NiLT5zZXBfaWR4ID0gaTsKLSAgICAgIHBfc2NiLT5hdmR0X2hhbmRsZSA9IHBfc2NiLT5zZXBzW2ldLmF2X2hhbmRsZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N3aXRjaF9yb2xlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTd2l0Y2ggcm9sZSB3YXMgbm90IHN0YXJ0ZWQgYW5kIGEgdGltZXIgd2FzIHN0YXJ0ZWQuCi0gKiAgICAgICAgICAgICAgICAgIGFub3RoZXIgYXR0ZW1wdCB0byBzd2l0Y2ggcm9sZSBub3cgLSBzdGlsbCBvcGVuaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zd2l0Y2hfcm9sZSh0QlRBX0FWX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfUlNfUkVTIHN3aXRjaF9yZXMgPSBCVEFfQVZfUlNfTk9ORTsKLSAgdEJUQV9BVl9BUElfT1BFTiogcF9idWYgPSAmcF9zY2ItPnFfaW5mby5vcGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIHdhaXQ6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPndhaXQpOwotICBpZiAocF9zY2ItPndhaXQgJiBCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19TVEFSVCkKLSAgICBwX3NjYi0+d2FpdCB8PSBCVEFfQVZfV0FJVF9ST0xFX1NXX1JFVFJZOwotCi0gIC8qIGNsZWFyIHRoZSBtYXNrcyBzZXQgd2hlbiB0aGUgdGltZXIgaXMgc3RhcnRlZCAqLwotICBwX3NjYi0+d2FpdCAmPQotICAgICAgfihCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19PUEVOIHwgQlRBX0FWX1dBSVRfUk9MRV9TV19SRVNfU1RBUlQpOwotCi0gIGlmIChwX3NjYi0+cV90YWcgPT0gQlRBX0FWX1FfVEFHX09QRU4pIHsKLSAgICBpZiAoYnRhX2F2X3N3aXRjaF9pZl9uZWVkZWQocF9zY2IpIHx8Ci0gICAgICAgICFidGFfYXZfbGlua19yb2xlX29rKHBfc2NiLCBBMkRQX1NFVF9NVUxUTF9CSVQpKSB7Ci0gICAgICBwX3NjYi0+d2FpdCB8PSBCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19PUEVOOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGluIHRoZW9yeS4gSnVzdCBpbiBjYXNlLi4uCi0gICAgICAgKiBjb250aW51ZSB0byBkb19kaXNjX2EyZHAgKi8KLSAgICAgIHN3aXRjaF9yZXMgPSBCVEFfQVZfUlNfRE9ORTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogcmVwb3J0IGZhaWx1cmUgb24gT1BFTiAqLwotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwZWVyICVzIHJvbGUgc3dpdGNoIGZhaWxlZCAod2FpdD0weCV4KSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+d2FpdCk7Ci0gICAgc3dpdGNoX3JlcyA9IEJUQV9BVl9SU19GQUlMOwotICB9Ci0KLSAgaWYgKHN3aXRjaF9yZXMgIT0gQlRBX0FWX1JTX05PTkUpIHsKLSAgICBpZiAoYnRhX2F2X2NiLnJzX2lkeCA9PSAocF9zY2ItPmhkaSArIDEpKSB7Ci0gICAgICBidGFfYXZfY2IucnNfaWR4ID0gMDsKLSAgICB9Ci0gICAgcF9zY2ItPndhaXQgJj0gfkJUQV9BVl9XQUlUX1JPTEVfU1dfUkVUUlk7Ci0gICAgcF9zY2ItPnFfdGFnID0gMDsKLSAgICBwX2J1Zi0+c3dpdGNoX3JlcyA9IHN3aXRjaF9yZXM7Ci0gICAgYnRhX2F2X2RvX2Rpc2NfYTJkcChwX3NjYiwgKHRCVEFfQVZfREFUQSopcF9idWYpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcm9sZV9yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSB0aGUgcm9sZSBjaGFuZ2VkIGV2ZW50Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yb2xlX3Jlcyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIGJvb2wgaW5pdGlhdG9yID0gZmFsc2U7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgcV90YWc6JWQsIHdhaXQ6MHgleCwgcm9sZToweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+cV90YWcsCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPndhaXQsIHBfc2NiLT5yb2xlKTsKLSAgaWYgKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfU1RBUlRfSU5UKSBpbml0aWF0b3IgPSB0cnVlOwotCi0gIGlmIChwX3NjYi0+cV90YWcgPT0gQlRBX0FWX1FfVEFHX1NUQVJUKSB7Ci0gICAgaWYgKHBfc2NiLT53YWl0ICYgQlRBX0FWX1dBSVRfUk9MRV9TV19TVEFSVEVEKSB7Ci0gICAgICBwX3NjYi0+d2FpdCAmPSB+QlRBX0FWX1dBSVRfUk9MRV9TV19CSVRTOwotICAgICAgaWYgKHBfZGF0YS0+cm9sZV9yZXMuaGNpX3N0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgICAgICBwX3NjYi0+cm9sZSAmPSB+QlRBX0FWX1JPTEVfU1RBUlRfSU5UOwotICAgICAgICBidGFfc3lzX2lkbGUoQlRBX0lEX0FWLCBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQsIHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLSAgICAgICAgLyogc3RhcnQgZmFpbGVkIGJlY2F1c2Ugb2Ygcm9sZSBzd2l0Y2guICovCi0gICAgICAgIHRCVEFfQVZfU1RBUlQgc3RhcnQ7Ci0gICAgICAgIHN0YXJ0LmNobmwgPSBwX3NjYi0+Y2hubDsKLSAgICAgICAgc3RhcnQuc3RhdHVzID0gQlRBX0FWX0ZBSUxfUk9MRTsKLSAgICAgICAgc3RhcnQuaG5kbCA9IHBfc2NiLT5obmRsOwotICAgICAgICBzdGFydC5pbml0aWF0b3IgPSBpbml0aWF0b3I7Ci0gICAgICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgICAgIGJ0YV9hdl9kYXRhLnN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9TVEFSVF9FVlQsICZidGFfYXZfZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfYXZfc3RhcnRfb2socF9zY2IsIHBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwX3NjYi0+d2FpdCAmIEJUQV9BVl9XQUlUX1JPTEVfU1dfUkVTX1NUQVJUKQotICAgICAgcF9zY2ItPndhaXQgfD0gQlRBX0FWX1dBSVRfUk9MRV9TV19GQUlMRUQ7Ci0gIH0gZWxzZSBpZiAocF9zY2ItPnFfdGFnID09IEJUQV9BVl9RX1RBR19PUEVOKSB7Ci0gICAgaWYgKHBfc2NiLT53YWl0ICYgQlRBX0FWX1dBSVRfUk9MRV9TV19SRVNfT1BFTikgewotICAgICAgcF9zY2ItPnJvbGUgJj0gfkJUQV9BVl9ST0xFX1NUQVJUX0lOVDsKLSAgICAgIHBfc2NiLT53YWl0ICY9IH5CVEFfQVZfV0FJVF9ST0xFX1NXX0JJVFM7Ci0KLSAgICAgIGlmIChwX2RhdGEtPnJvbGVfcmVzLmhjaV9zdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgLyogT3BlbiBmYWlsZWQgYmVjYXVzZSBvZiByb2xlIHN3aXRjaC4gKi8KLSAgICAgICAgdEJUQV9BVl9PUEVOIGF2X29wZW47Ci0gICAgICAgIGF2X29wZW4uYmRfYWRkciA9IHBfc2NiLT5QZWVyQWRkcmVzcygpOwotICAgICAgICBhdl9vcGVuLmNobmwgPSBwX3NjYi0+Y2hubDsKLSAgICAgICAgYXZfb3Blbi5obmRsID0gcF9zY2ItPmhuZGw7Ci0gICAgICAgIGF2X29wZW4uc3RhdHVzID0gQlRBX0FWX0ZBSUxfUk9MRTsKLSAgICAgICAgaWYgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwID09IEFWRFRfVFNFUF9TUkMpIHsKLSAgICAgICAgICBhdl9vcGVuLnNlcCA9IEFWRFRfVFNFUF9TTks7Ci0gICAgICAgIH0gZWxzZSBpZiAocF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLnRzZXAgPT0gQVZEVF9UU0VQX1NOSykgewotICAgICAgICAgIGF2X29wZW4uc2VwID0gQVZEVF9UU0VQX1NSQzsKLSAgICAgICAgfQotICAgICAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgICAgICBidGFfYXZfZGF0YS5vcGVuID0gYXZfb3BlbjsKLSAgICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX09QRU5fRVZULCAmYnRhX2F2X2RhdGEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogQ29udGludWUgYXYgb3BlbiBwcm9jZXNzICovCi0gICAgICAgIHBfc2NiLT5xX2luZm8ub3Blbi5zd2l0Y2hfcmVzID0gQlRBX0FWX1JTX0RPTkU7Ci0gICAgICAgIGJ0YV9hdl9kb19kaXNjX2EyZHAocF9zY2IsICh0QlRBX0FWX0RBVEEqKSYocF9zY2ItPnFfaW5mby5vcGVuKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiJXM6IHBlZXIgJXMgdW5leHBlY3RlZCByb2xlIHN3aXRjaCBldmVudDogcV90YWcgPSAlZCB3YWl0ID0gMHgleCIsCi0gICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPnFfdGFnLAotICAgICAgICAgIHBfc2NiLT53YWl0KTsKLSAgICB9Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyB3YWl0OjB4JXgsIHJvbGU6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPndhaXQsCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPnJvbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2RlbGF5X2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsIHRoZSBkZWxheSBjYWxsLW91dCBmdW5jdGlvbiB0byByZXBvcnQgdGhlIGRlbGF5IHJlcG9ydAotICogICAgICAgICAgICAgICAgICBmcm9tIFNOSwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9kZWxheV9jbyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6MHgleCBkZWxheTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmhuZGwsCi0gICAgICAgICAgICAgICAgICAgcF9kYXRhLT5zdHJfbXNnLm1zZy5kZWxheV9ycHRfY21kLmRlbGF5KTsKLSAgcF9zY2ItPnBfY29zLT5kZWxheShwX3NjYi0+aG5kbCwgcF9zY2ItPlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5zdHJfbXNnLm1zZy5kZWxheV9ycHRfY21kLmRlbGF5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9kb19kaXNjX2EyZHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERvIHNlcnZpY2UgZGlzY292ZXJ5IGZvciBBMkRQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9kb19kaXNjX2EyZHAodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBib29sIG9rX2NvbnRpbnVlID0gZmFsc2U7Ci0gIHRBMkRQX1NEUF9EQl9QQVJBTVMgZGJfcGFyYW1zOwotICB1aW50MTZfdCBhdHRyX2xpc3RbXSA9IHtBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9JRF9QUk9UT0NPTF9ERVNDX0xJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1R9OwotICB1aW50MTZfdCBzZHBfdXVpZCA9IDA7IC8qIFVVSUQgZm9yIHdoaWNoIFNEUCBoYXMgdG8gYmUgZG9uZSAqLwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyX2FkZHI6ICVzIHVzZV9yYzogJWQgc3dpdGNoX3JlczolZCwgb2M6JWQiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2RhdGEtPmFwaV9vcGVuLmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX29wZW4udXNlX3JjLCBwX2RhdGEtPmFwaV9vcGVuLnN3aXRjaF9yZXMsCi0gICAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250KTsKLQotICBtZW1jcHkoJihwX3NjYi0+b3Blbl9hcGkpLCAmKHBfZGF0YS0+YXBpX29wZW4pLCBzaXplb2YodEJUQV9BVl9BUElfT1BFTikpOwotCi0gIHN3aXRjaCAocF9kYXRhLT5hcGlfb3Blbi5zd2l0Y2hfcmVzKSB7Ci0gICAgY2FzZSBCVEFfQVZfUlNfTk9ORToKLSAgICAgIGlmIChidGFfYXZfc3dpdGNoX2lmX25lZWRlZChwX3NjYikgfHwKLSAgICAgICAgICAhYnRhX2F2X2xpbmtfcm9sZV9vayhwX3NjYiwgQTJEUF9TRVRfTVVMVExfQklUKSkgewotICAgICAgICAvKiB3YWl0aW5nIGZvciByb2xlIHN3aXRjaCByZXN1bHQuIHNhdmUgdGhlIGFwaSB0byBjb250cm9sIGJsb2NrICovCi0gICAgICAgIG1lbWNweSgmcF9zY2ItPnFfaW5mby5vcGVuLCAmcF9kYXRhLT5hcGlfb3BlbiwKLSAgICAgICAgICAgICAgIHNpemVvZih0QlRBX0FWX0FQSV9PUEVOKSk7Ci0gICAgICAgIHBfc2NiLT53YWl0IHw9IEJUQV9BVl9XQUlUX1JPTEVfU1dfUkVTX09QRU47Ci0gICAgICAgIHBfc2NiLT5xX3RhZyA9IEJUQV9BVl9RX1RBR19PUEVOOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2tfY29udGludWUgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9SU19GQUlMOgotICAgICAgLyogcmVwb3J0IGEgbmV3IGZhaWx1cmUgZXZlbnQgICovCi0gICAgICBwX3NjYi0+b3Blbl9zdGF0dXMgPSBCVEFfQVZfRkFJTF9ST0xFOwotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEJUQV9BVl9TRFBfRElTQ19GQUlMX0VWVDogcGVlcl9hZGRyPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9TRFBfRElTQ19GQUlMX0VWVCwgTlVMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1JTX09LOgotICAgICAgcF9kYXRhID0gKHRCVEFfQVZfREFUQSopJnBfc2NiLT5xX2luZm8ub3BlbjsKLSAgICAgIC8qIGNvbnRpbnVlIHRvIG9wZW4gaWYgbGluayByb2xlIGlzIG9rICovCi0gICAgICBpZiAoYnRhX2F2X2xpbmtfcm9sZV9vayhwX3NjYiwgQTJEUF9TRVRfTVVMVExfQklUKSkgewotICAgICAgICBva19jb250aW51ZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX3NjYi0+d2FpdCB8PSBCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19PUEVOOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9SU19ET05FOgotICAgICAgb2tfY29udGludWUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogb2tfY29udGludWU6ICVkIHdhaXQ6MHgleCwgcV90YWc6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgb2tfY29udGludWUsIHBfc2NiLT53YWl0LCBwX3NjYi0+cV90YWcpOwotICBpZiAoIW9rX2NvbnRpbnVlKSByZXR1cm47Ci0KLSAgLyogY2xlYXIgdGhlIHJvbGUgc3dpdGNoIGJpdHMgKi8KLSAgcF9zY2ItPndhaXQgJj0gfkJUQV9BVl9XQUlUX1JPTEVfU1dfQklUUzsKLQotICBpZiAocF9zY2ItPndhaXQgJiBCVEFfQVZfV0FJVF9DSEVDS19SQykgewotICAgIHBfc2NiLT53YWl0ICY9IH5CVEFfQVZfV0FJVF9DSEVDS19SQzsKLSAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5hdnJjX2N0X3RpbWVyLCBCVEFfQVZfUkNfRElTQ19USU1FX1ZBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BVl9BVlJDX1RJTUVSX0VWVCwgcF9zY2ItPmhuZGwpOwotICB9Ci0KLSAgLyogc3RvcmUgcGVlciBhZGRyIG90aGVyIHBhcmFtZXRlcnMgKi8KLSAgYnRhX2F2X3NhdmVfYWRkcihwX3NjYiwgcF9kYXRhLT5hcGlfb3Blbi5iZF9hZGRyKTsKLSAgcF9zY2ItPnVzZV9yYyA9IHBfZGF0YS0+YXBpX29wZW4udXNlX3JjOwotCi0gIGJ0YV9zeXNfYXBwX29wZW4oQlRBX0lEX0FWLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0KLSAgLyogc2V0IHVwIHBhcmFtZXRlcnMgKi8KLSAgZGJfcGFyYW1zLmRiX2xlbiA9IEJUQV9BVl9ESVNDX0JVRl9TSVpFOwotICBkYl9wYXJhbXMubnVtX2F0dHIgPSAzOwotICBkYl9wYXJhbXMucF9hdHRycyA9IGF0dHJfbGlzdDsKLSAgcF9zY2ItPnV1aWRfaW50ID0gcF9kYXRhLT5hcGlfb3Blbi51dWlkOwotICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gdHJ1ZTsKLSAgaWYgKHBfc2NiLT51dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKQotICAgIHNkcF91dWlkID0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFOwotICBlbHNlIGlmIChwX3NjYi0+dXVpZF9pbnQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKQotICAgIHNkcF91dWlkID0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSzsKLQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBJbml0aWF0ZSBTRFAgZGlzY292ZXJ5IGZvciBwZWVyICVzIDogdXVpZF9pbnQ9MHgleCAiCi0gICAgICAic2RwX3V1aWQ9MHgleCIsCi0gICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+dXVpZF9pbnQsCi0gICAgICBzZHBfdXVpZCk7Ci0gIHRBMkRQX1NUQVRVUyBmaW5kX3NlcnZpY2Vfc3RhdHVzID0gQTJEUF9GaW5kU2VydmljZSgKLSAgICAgIHNkcF91dWlkLCBwX3NjYi0+UGVlckFkZHJlc3MoKSwgJmRiX3BhcmFtcywgYnRhX2F2X2EyZHBfc2RwX2NiYWNrKTsKLSAgaWYgKGZpbmRfc2VydmljZV9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgIiVzOiBBMkRQX0ZpbmRTZXJ2aWNlKCkgZmFpbGVkIGZvciBwZWVyICVzIHV1aWRfaW50PTB4JXggIgotICAgICAgICAic2RwX3V1aWQ9MHgleCA6IHN0YXR1cz0lZCIsCi0gICAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT51dWlkX2ludCwKLSAgICAgICAgc2RwX3V1aWQsIGZpbmRfc2VydmljZV9zdGF0dXMpOwotICAgIGJ0YV9hdl9hMmRwX3NkcF9jYmFjayhmYWxzZSwgbnVsbHB0ciwgcF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICB9IGVsc2UgewotICAgIC8qIG9ubHkgb25lIEEyRFAgZmluZCBzZXJ2aWNlIGlzIGFjdGl2ZSBhdCBhIHRpbWUgKi8KLSAgICBidGFfYXZfY2IuaGFuZGxlID0gcF9zY2ItPmhuZGw7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jbGVhbnVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBjbGVhbnVwIEFWIHN0cmVhbSBjb250cm9sIGJsb2NrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jbGVhbnVwKHRCVEFfQVZfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9DT05OX0NIRyBtc2c7Ci0gIHVpbnQ4X3Qgcm9sZSA9IEJUQV9BVl9ST0xFX0FEX0lOVDsKLQotICBMT0dfSU5GTygiJXMgcGVlciAlcyIsIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8qIGZyZWUgYW55IGJ1ZmZlcnMgKi8KLSAgcF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCA9IGZhbHNlOwotICBwX3NjYi0+U2V0QXZkdHBWZXJzaW9uKDApOwotCi0gIC8qIGluaXRpYWxpemUgc29tZSBjb250cm9sIGJsb2NrIHZhcmlhYmxlcyAqLwotICBwX3NjYi0+b3Blbl9zdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLQotICAvKiBpZiBkZS1yZWdpc3RlcmluZyBzaHV0IGV2ZXJ5dGhpbmcgZG93biAqLwotICBtc2cuaGRyLmxheWVyX3NwZWNpZmljID0gcF9zY2ItPmhuZGw7Ci0gIHBfc2NiLT5zdGFydGVkID0gZmFsc2U7Ci0gIHBfc2NiLT51c2VfcnRwX2hlYWRlcl9tYXJrZXJfYml0ID0gZmFsc2U7Ci0gIHBfc2NiLT5jb25nID0gZmFsc2U7Ci0gIHBfc2NiLT5yb2xlID0gcm9sZTsKLSAgcF9zY2ItPmN1cl9wc2NfbWFzayA9IDA7Ci0gIHBfc2NiLT53YWl0ID0gMDsKLSAgcF9zY2ItPm51bV9kaXNjX3Nua3MgPSAwOwotICBwX3NjYi0+Y29sbF9tYXNrID0gMDsKLSAgYWxhcm1fY2FuY2VsKHBfc2NiLT5hdnJjX2N0X3RpbWVyKTsKLSAgYWxhcm1fY2FuY2VsKHBfc2NiLT5saW5rX3NpZ25hbGxpbmdfdGltZXIpOwotICBhbGFybV9jYW5jZWwocF9zY2ItPmFjY2VwdF9zaWduYWxsaW5nX3RpbWVyKTsKLQotICAvKiBUT0RPKGVpc2VuYmFjaCk6IFJFLUlNUExFTUVOVCBVU0lORyBWU0MgT1IgSEFMIEVYVEVOU0lPTgotICAgIHZlbmRvcl9nZXRfaW50ZXJmYWNlKCktPnNlbmRfY29tbWFuZCgKLSAgICAgICAgKHZlbmRvcl9vcGNvZGVfdClCVF9WTkRfT1BfQTJEUF9PRkZMT0FEX1NUT1AsICh2b2lkKikmcF9zY2ItPmwyY19jaWQpOwotICAgIGlmIChwX3NjYi0+b2ZmbG9hZF9zdGFydF9wZW5kaW5nKSB7Ci0gICAgICB0QlRBX0FWX1NUQVRVUyBzdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07Ci0gICAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgICAgYnRhX2F2X2RhdGEuc3RhdHVzID0gc3RhdHVzOwotICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX09GRkxPQURfU1RBUlRfUlNQX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICB9Ci0gICovCi0KLSAgaWYgKHBfc2NiLT5kZXJlZ2lzdGVyaW5nKSB7Ci0gICAgLyogcmVtb3ZlIHN0cmVhbSAqLwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsgaSsrKSB7Ci0gICAgICBpZiAocF9zY2ItPnNlcHNbaV0uYXZfaGFuZGxlKSBBVkRUX1JlbW92ZVN0cmVhbShwX3NjYi0+c2Vwc1tpXS5hdl9oYW5kbGUpOwotICAgICAgcF9zY2ItPnNlcHNbaV0uYXZfaGFuZGxlID0gMDsKLSAgICB9Ci0KLSAgICBidGFfYXZfZGVyZWdfY29tcCgodEJUQV9BVl9EQVRBKikmbXNnKTsKLSAgfSBlbHNlIHsKLSAgICAvKiByZXBvcnQgc3RyZWFtIGNsb3NlZCB0byBtYWluIFNNICovCi0gICAgbXNnLmlzX3VwID0gZmFsc2U7Ci0gICAgbXNnLnBlZXJfYWRkciA9IHBfc2NiLT5QZWVyQWRkcmVzcygpOwotICAgIGJ0YV9hdl9jb25uX2NoZygodEJUQV9BVl9EQVRBKikmbXNnKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2ZyZWVfc2RiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlIHNlcnZpY2UgZGlzY292ZXJ5IGRiIGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZnJlZV9zZGIodEJUQV9BVl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29uZmlnX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGEgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbiBmcm9tIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb25maWdfaW5kKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9DSV9TRVRDT05GSUcgc2V0Y29uZmlne307Ci0gIHRBVkRUX1NFUF9JTkZPKiBwX2luZm87Ci0gIGNvbnN0IEF2ZHRwU2VwQ29uZmlnKiBwX2V2dF9jZmcgPSAmcF9kYXRhLT5zdHJfbXNnLmNmZzsKLSAgdWludDhfdCBwc2NfbWFzayA9IChwX2V2dF9jZmctPnBzY19tYXNrIHwgcF9zY2ItPmNmZy5wc2NfbWFzayk7Ci0gIHVpbnQ4X3QKLSAgICAgIGxvY2FsX3NlcDsgLyogc2VwIHR5cGUgb2YgbG9jYWwgaGFuZGxlIG9uIHdoaWNoIGNvbm5lY3Rpb24gd2FzIHJlY2VpdmVkICovCi0gIHRCVEFfQVZfU1RSX01TRyogcF9tc2cgPSAodEJUQV9BVl9TVFJfTVNHKilwX2RhdGE7Ci0KLSAgbG9jYWxfc2VwID0gYnRhX2F2X2dldF9zY2Jfc2VwX3R5cGUocF9zY2IsIHBfbXNnLT5oYW5kbGUpOwotICBwX3NjYi0+YXZkdF9sYWJlbCA9IHBfZGF0YS0+c3RyX21zZy5tc2cuaGRyLmxhYmVsOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6MHgleCBsb2NhbF9zZXA6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLAotICAgICAgICAgICAgICAgICAgIGxvY2FsX3NlcCk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb2RlYzogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBBMkRQX0NvZGVjSW5mb1N0cmluZyhwX2V2dF9jZmctPmNvZGVjX2luZm8pLmNfc3RyKCkpOwotCi0gIG1lbWNweShwX3NjYi0+Y2ZnLmNvZGVjX2luZm8sIHBfZXZ0X2NmZy0+Y29kZWNfaW5mbywgQVZEVF9DT0RFQ19TSVpFKTsKLSAgYnRhX2F2X3NhdmVfYWRkcihwX3NjYiwgcF9kYXRhLT5zdHJfbXNnLmJkX2FkZHIpOwotCi0gIC8qIENsZWFyIGNvbGxpc2lvbiBtYXNrICovCi0gIHBfc2NiLT5jb2xsX21hc2sgPSAwOwotICBhbGFybV9jYW5jZWwocF9zY2ItPmFjY2VwdF9zaWduYWxsaW5nX3RpbWVyKTsKLQotICAvKiBpZiBubyBjb2RlYyBwYXJhbWV0ZXJzIGluIGNvbmZpZ3VyYXRpb24sIGZhaWwgKi8KLSAgaWYgKChwX2V2dF9jZmctPm51bV9jb2RlYyA9PSAwKSB8fAotICAgICAgLyogb3IgdGhlIHBlZXIgcmVxdWVzdHMgZm9yIGEgc2VydmljZSB3ZSBkbyBub3Qgc3VwcG9ydCAqLwotICAgICAgKChwc2NfbWFzayAhPSBwX3NjYi0+Y2ZnLnBzY19tYXNrKSAmJgotICAgICAgIChwc2NfbWFzayAhPSAocF9zY2ItPmNmZy5wc2NfbWFzayAmIH5BVkRUX1BTQ19ERUxBWV9SUFQpKSkpIHsKLSAgICBzZXRjb25maWcuaG5kbCA9IHBfc2NiLT5obmRsOyAvKiB3ZSBtYXkgbm90IG5lZWQgdGhpcyAqLwotICAgIHNldGNvbmZpZy5lcnJfY29kZSA9IEFWRFRfRVJSX1VOU1VQX0NGRzsKLSAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9DSV9TRVRDT05GSUdfRkFJTF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICh0QlRBX0FWX0RBVEEqKSZzZXRjb25maWcpOwotICB9IGVsc2UgewotICAgIHBfaW5mbyA9ICZwX3NjYi0+c2VwX2luZm9bMF07Ci0gICAgcF9pbmZvLT5pbl91c2UgPSAwOwotICAgIHBfaW5mby0+bWVkaWFfdHlwZSA9IHBfc2NiLT5tZWRpYV90eXBlOwotICAgIHBfaW5mby0+c2VpZCA9IHBfZGF0YS0+c3RyX21zZy5tc2cuY29uZmlnX2luZC5pbnRfc2VpZDsKLQotICAgIC8qIFNlcCB0eXBlIG9mIFBlZXIgd2lsbCBiZSBvcHBzaXRlIHJvbGUgdG8gb3VyIGxvY2FsIHNlcCAqLwotICAgIGlmIChsb2NhbF9zZXAgPT0gQVZEVF9UU0VQX1NSQykKLSAgICAgIHBfaW5mby0+dHNlcCA9IEFWRFRfVFNFUF9TTks7Ci0gICAgZWxzZSBpZiAobG9jYWxfc2VwID09IEFWRFRfVFNFUF9TTkspCi0gICAgICBwX2luZm8tPnRzZXAgPSBBVkRUX1RTRVBfU1JDOwotCi0gICAgcF9zY2ItPnJvbGUgfD0gQlRBX0FWX1JPTEVfQURfQUNQOwotICAgIHBfc2NiLT5jdXJfcHNjX21hc2sgPSBwX2V2dF9jZmctPnBzY19tYXNrOwotICAgIGlmIChidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKQotICAgICAgcF9zY2ItPnVzZV9yYyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgcF9zY2ItPnVzZV9yYyA9IGZhbHNlOwotCi0gICAgcF9zY2ItPm51bV9zZXBzID0gMTsKLSAgICBwX3NjYi0+c2VwX2luZm9faWR4ID0gMDsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU0VJRDogJWQgdXNlX3JjOiAlZCBjdXJfcHNjX21hc2s6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9pbmZvLT5zZWlkLCBwX3NjYi0+dXNlX3JjLCBwX3NjYi0+Y3VyX3BzY19tYXNrKTsKLSAgICAvKiAgaW4gY2FzZSBvZiBBMkRQIFNJTksgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBwZWVyIGRhdGEgaXMgYmVpbmcgc2VudCB0bwotICAgICAqIGNvIGZ1bmN0aW9ucyAqLwotICAgIGlmIChsb2NhbF9zZXAgPT0gQVZEVF9UU0VQX1NOSykgewotICAgICAgcF9zY2ItPnBfY29zLT5zZXRjZmcocF9zY2ItPmhuZGwsIHBfc2NiLT5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ldnRfY2ZnLT5jb2RlY19pbmZvLCBwX2luZm8tPnNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2V2dF9jZmctPm51bV9wcm90ZWN0LCBwX2V2dF9jZmctPnByb3RlY3RfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRFRfVFNFUF9TTkssIHBfbXNnLT5oYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwX3NjYi0+cF9jb3MtPnNldGNmZyhwX3NjYi0+aG5kbCwgcF9zY2ItPlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2V2dF9jZmctPmNvZGVjX2luZm8sIHBfaW5mby0+c2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZXZ0X2NmZy0+bnVtX3Byb3RlY3QsIHBfZXZ0X2NmZy0+cHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEVF9UU0VQX1NSQywgcF9tc2ctPmhhbmRsZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfZGlzY29ubmVjdF9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2Nvbm5lY3QgQVZEVFAgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZGlzY29ubmVjdF9yZXEodEJUQV9BVl9TQ0IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiOwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlczogY29ubl9sY2I6IDB4JXggcGVlcl9hZGRyOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICBidGFfYXZfY2IuY29ubl9sY2IsIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgYWxhcm1fY2FuY2VsKHBfc2NiLT5saW5rX3NpZ25hbGxpbmdfdGltZXIpOwotICBhbGFybV9jYW5jZWwocF9zY2ItPmFjY2VwdF9zaWduYWxsaW5nX3RpbWVyKTsKLSAgYWxhcm1fY2FuY2VsKHBfc2NiLT5hdnJjX2N0X3RpbWVyKTsKLQotICAvLyBjb25uX2xjYiBpcyB0aGUgaW5kZXggYml0bWFzayBvZiBhbGwgdXNlZCBMQ0JzLCBhbmQgc2luY2UgTENCIGFuZCBTQ0IgdXNlCi0gIC8vIHRoZSBzYW1lIGluZGV4LCBpdCBzaG91bGQgYmUgc2FmZSB0byB1c2UgU0NCIGluZGV4IGhlcmUuCi0gIGlmICgoYnRhX2F2X2NiLmNvbm5fbGNiICYgKDEgPDwgcF9zY2ItPmhkaSkpICE9IDApIHsKLSAgICBwX3JjYiA9IGJ0YV9hdl9nZXRfcmNiX2J5X3NoZGwoKHVpbnQ4X3QpKHBfc2NiLT5oZGkgKyAxKSk7Ci0gICAgaWYgKHBfcmNiKSBidGFfYXZfZGVsX3JjKHBfcmNiKTsKLSAgICBBVkRUX0Rpc2Nvbm5lY3RSZXEocF9zY2ItPlBlZXJBZGRyZXNzKCksICZidGFfYXZfcHJvY19zdHJlYW1fZXZ0KTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBjb25uX2xjYj0weCV4IGJ0YV9oYW5kbGU9MHgleCAoaGRpPSV1KSBubyBsaW5rIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ0YV9hdl9jYi5jb25uX2xjYiwgcF9zY2ItPmhuZGwsIHBfc2NiLT5oZGkpOwotICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FWX0FWRFRfRElTQ09OTkVDVF9FVlQsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2VjdXJpdHlfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIEFWRFRQIHNlY3VyaXR5IHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NlY3VyaXR5X3JlcSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIGlmIChidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9QUk9URUNUKSB7Ci0gICAgQVZEVF9TZWN1cml0eVJlcShwX3NjYi0+YXZkdF9oYW5kbGUsIHBfZGF0YS0+YXBpX3Byb3RlY3RfcmVxLnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX3Byb3RlY3RfcmVxLmxlbik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zZWN1cml0eV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gQVZEVFAgc2VjdXJpdHkgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NlY3VyaXR5X3JzcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIGlmIChidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9QUk9URUNUKSB7Ci0gICAgQVZEVF9TZWN1cml0eVJzcChwX3NjYi0+YXZkdF9oYW5kbGUsIHBfc2NiLT5hdmR0X2xhYmVsLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfcHJvdGVjdF9yc3AuZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX3Byb3RlY3RfcnNwLnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX3Byb3RlY3RfcnNwLmxlbik7Ci0gIH0gZWxzZSB7Ci0gICAgQVZEVF9TZWN1cml0eVJzcChwX3NjYi0+YXZkdF9oYW5kbGUsIHBfc2NiLT5hdmR0X2xhYmVsLCBBVkRUX0VSUl9OU0MsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAwKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3NldGNvbmZpZ19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNldGNvbmZpZyBpcyBPSwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zZXRjb25maWdfcnNwKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCBudW0gPSBwX2RhdGEtPmNpX3NldGNvbmZpZy5udW1fc2VpZCArIDE7Ci0gIHVpbnQ4X3QgYXZkdF9oYW5kbGUgPSBwX2RhdGEtPmNpX3NldGNvbmZpZy5hdmR0X2hhbmRsZTsKLSAgdWludDhfdCogcF9zZWlkID0gcF9kYXRhLT5jaV9zZXRjb25maWcucF9zZWlkOwotICBpbnQgaTsKLSAgdWludDhfdCBsb2NhbF9zZXA7Ci0KLSAgLyogd2UgbGlrZSB0aGlzIGNvZGVjX3R5cGUuIGZpbmQgdGhlIHNlcF9pZHggKi8KLSAgbG9jYWxfc2VwID0gYnRhX2F2X2dldF9zY2Jfc2VwX3R5cGUocF9zY2IsIGF2ZHRfaGFuZGxlKTsKLSAgYnRhX2F2X2FkanVzdF9zZXBzX2lkeChwX3NjYiwgYXZkdF9oYW5kbGUpOwotICBMT0dfSU5GTygKLSAgICAgICIlczogcGVlciAlcyBidGFfaGFuZGxlPTB4JXggYXZkdF9oYW5kbGU9JWQgc2VwX2lkeD0lZCBjdXJfcHNjX21hc2s6MHgleCIsCi0gICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+aG5kbCwKLSAgICAgIHBfc2NiLT5hdmR0X2hhbmRsZSwgcF9zY2ItPnNlcF9pZHgsIHBfc2NiLT5jdXJfcHNjX21hc2spOwotCi0gIGlmICgoQVZEVF9UU0VQX1NOSyA9PSBsb2NhbF9zZXApICYmCi0gICAgICAocF9kYXRhLT5jaV9zZXRjb25maWcuZXJyX2NvZGUgPT0gQVZEVF9TVUNDRVNTKSAmJgotICAgICAgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS5wX2FwcF9zaW5rX2RhdGFfY2JhY2sgIT0gTlVMTCkpIHsKLSAgICB0QlRBX0FWX01FRElBIGF2X3NpbmtfY29kZWNfaW5mbzsKLSAgICBhdl9zaW5rX2NvZGVjX2luZm8uYXZrX2NvbmZpZy5iZF9hZGRyID0gcF9zY2ItPlBlZXJBZGRyZXNzKCk7Ci0gICAgYXZfc2lua19jb2RlY19pbmZvLmF2a19jb25maWcuY29kZWNfaW5mbyA9IHBfc2NiLT5jZmcuY29kZWNfaW5mbzsKLSAgICBwX3NjYi0+c2Vwc1twX3NjYi0+c2VwX2lkeF0ucF9hcHBfc2lua19kYXRhX2NiYWNrKAotICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKSwgQlRBX0FWX1NJTktfTUVESUFfQ0ZHX0VWVCwgJmF2X3NpbmtfY29kZWNfaW5mbyk7Ci0gIH0KLQotICBBVkRUX0NvbmZpZ1JzcChwX3NjYi0+YXZkdF9oYW5kbGUsIHBfc2NiLT5hdmR0X2xhYmVsLAotICAgICAgICAgICAgICAgICBwX2RhdGEtPmNpX3NldGNvbmZpZy5lcnJfY29kZSwgcF9kYXRhLT5jaV9zZXRjb25maWcuY2F0ZWdvcnkpOwotCi0gIGFsYXJtX2NhbmNlbChwX3NjYi0+bGlua19zaWduYWxsaW5nX3RpbWVyKTsKLQotICBpZiAocF9kYXRhLT5jaV9zZXRjb25maWcuZXJyX2NvZGUgPT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgcF9zY2ItPndhaXQgPSBCVEFfQVZfV0FJVF9BQ1BfQ0FQU19PTjsKLSAgICBpZiAocF9kYXRhLT5jaV9zZXRjb25maWcucmVjZmdfbmVlZGVkKQotICAgICAgcF9zY2ItPnJvbGUgfD0gQlRBX0FWX1JPTEVfU1VTUEVORF9PUFQ7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJlY2ZnX25lZWRlZDolZCByb2xlOjB4JXggbnVtOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNpX3NldGNvbmZpZy5yZWNmZ19uZWVkZWQsIHBfc2NiLT5yb2xlLCBudW0pOwotICAgIC8qIGNhbGxvdXQgbW9kdWxlIHRlbGxzIEJUQSB0aGUgbnVtYmVyIG9mICJnb29kIiBTRVBzIGFuZCB0aGVpciBTRUlEcy4KLSAgICAgKiBnZXRjYXAgb24gdGhlc2UgU0VJRCAqLwotICAgIHBfc2NiLT5udW1fc2VwcyA9IG51bTsKLQotICAgIGlmIChwX3NjYi0+Y3VyX3BzY19tYXNrICYgQVZEVF9QU0NfREVMQVlfUlBUKQotICAgICAgcF9zY2ItPlNldEF2ZHRwVmVyc2lvbihBVkRUX1ZFUlNJT05fMV8zKTsKLQotICAgIGlmIChBMkRQX0dldENvZGVjVHlwZShwX3NjYi0+Y2ZnLmNvZGVjX2luZm8pID09IEEyRFBfTUVESUFfQ1RfU0JDIHx8Ci0gICAgICAgIG51bSA+IDEpIHsKLSAgICAgIC8qIGlmIFNCQyBpcyB1c2VkIGJ5IHRoZSBTTksgYXMgSU5ULCBkaXNjb3ZlciByZXEgaXMgbm90IHNlbnQgaW4KLSAgICAgICAqIGJ0YV9hdl9jb25maWdfaW5kLgotICAgICAgICogY2FsbCBkaXNjX3JlcyBub3cgKi8KLSAgICAgIC8qIHRoaXMgaXMgY2FsbGVkIGluIEEyRFAgU1JDIHBhdGggb25seSwgSW4gY2FzZSBvZiBTSU5LIHdlIGRvbid0IG5lZWQgaXQKLSAgICAgICAqLwotICAgICAgaWYgKGxvY2FsX3NlcCA9PSBBVkRUX1RTRVBfU1JDKQotICAgICAgICBwX3NjYi0+cF9jb3MtPmRpc2NfcmVzKHBfc2NiLT5obmRsLCBwX3NjYi0+UGVlckFkZHJlc3MoKSwgbnVtLCBudW0sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogd2UgZG8gbm90IGtub3cgdGhlIHBlZXIgZGV2aWNlIGFuZCBpdCBpcyB1c2luZyBub24tU0JDIGNvZGVjCi0gICAgICAgKiB3ZSBuZWVkIHRvIGtub3cgYWxsIHRoZSBTRVBzIG9uIFNOSyAqLwotICAgICAgaWYgKHBfc2NiLT51dWlkX2ludCA9PSAwKSBwX3NjYi0+dXVpZF9pbnQgPSBwX3NjYi0+b3Blbl9hcGkudXVpZDsKLSAgICAgIGJ0YV9hdl9kaXNjb3Zlcl9yZXEocF9zY2IsIE5VTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDE7IGkgPCBudW07IGkrKykgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNlcF9pbmZvWyVkXSBTRUlEOiAlZCIsIF9fZnVuY19fLCBpLCBwX3NlaWRbaSAtIDFdKTsKLSAgICAgIC8qIGluaXRpYWxpemUgdGhlIHNlcF9pbmZvW10gdG8gZ2V0IGNhcGFiaWxpdGllcyAqLwotICAgICAgcF9zY2ItPnNlcF9pbmZvW2ldLmluX3VzZSA9IGZhbHNlOwotICAgICAgcF9zY2ItPnNlcF9pbmZvW2ldLnRzZXAgPSBBVkRUX1RTRVBfU05LOwotICAgICAgcF9zY2ItPnNlcF9pbmZvW2ldLm1lZGlhX3R5cGUgPSBwX3NjYi0+bWVkaWFfdHlwZTsKLSAgICAgIHBfc2NiLT5zZXBfaW5mb1tpXS5zZWlkID0gcF9zZWlkW2kgLSAxXTsKLSAgICB9Ci0KLSAgICAvKiBvbmx5IGluIGNhc2Ugb2YgbG9jYWwgc2VwIGFzIFNSQyB3ZSBuZWVkIHRvIGxvb2sgZm9yIG90aGVyIFNFUHMsIEluIGNhc2UKLSAgICAgKiBvZiBTSU5LIHdlIGRvbid0ICovCi0gICAgaWYgKGxvY2FsX3NlcCA9PSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgICAvKiBNYWtlIHN1cmUgVVVJRCBoYXMgYmVlbiBpbml0aWFsaXplZC4uLiAqLwotICAgICAgaWYgKHBfc2NiLT51dWlkX2ludCA9PSAwKSBwX3NjYi0+dXVpZF9pbnQgPSBwX3NjYi0+b3Blbl9hcGkudXVpZDsKLSAgICAgIGJ0YV9hdl9uZXh0X2dldGNhcChwX3NjYiwgcF9kYXRhKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zdHJfb3BlbmVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdHJlYW0gb3BlbmVkIE9LIChpbmNvbWluZy9vdXRnb2luZykuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3N0cl9vcGVuZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX0NPTk5fQ0hHIG1zZzsKLSAgY2hhciByZW1vdGVfbmFtZVtCVE1fTUFYX1JFTV9CRF9OQU1FX0xFTl0gPSAiIjsKLSAgdWludDhfdCogcDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyBidGFfaGFuZGxlOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+aG5kbCk7Ci0KLSAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyA9IHBfc2NiLT5obmRsOwotICBtc2cuaXNfdXAgPSB0cnVlOwotICBtc2cucGVlcl9hZGRyID0gcF9zY2ItPlBlZXJBZGRyZXNzKCk7Ci0gIHBfc2NiLT5sMmNfY2lkID0gQVZEVF9HZXRMMkNhcENoYW5uZWwocF9zY2ItPmF2ZHRfaGFuZGxlKTsKLSAgYnRhX2F2X2Nvbm5fY2hnKCh0QlRBX0FWX0RBVEEqKSZtc2cpOwotICAvKiBzZXQgdGhlIGNvbmdlc3Rpb24gZmxhZywgc28gQVYgd291bGQgbm90IHNlbmQgbWVkaWEgcGFja2V0cyBieSBhY2NpZGVudCAqLwotICBwX3NjYi0+Y29uZyA9IHRydWU7Ci0gIC8vIERvbid0IHVzZSBBVkRUUCBTVVNQRU5EIGZvciByZXN0cmljdCBsaXN0ZWQgZGV2aWNlcwotICBidGlmX3N0b3JhZ2VfZ2V0X3N0b3JlZF9yZW1vdGVfbmFtZShwX3NjYi0+UGVlckFkZHJlc3MoKSwgcmVtb3RlX25hbWUpOwotICBpZiAoaW50ZXJvcF9tYXRjaF9uYW1lKElOVEVST1BfRElTQUJMRV9BVkRUUF9TVVNQRU5ELCByZW1vdGVfbmFtZSkgfHwKLSAgICAgIGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfQVZEVFBfU1VTUEVORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zY2ItPlBlZXJBZGRyZXNzKCkpKSB7Ci0gICAgTE9HX0lORk8oIiVzOiBkaXNhYmxlIEFWRFRQIFNVU1BFTkQ6IGludGVyb3AgbWF0Y2hlZCBuYW1lICVzIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgIF9fZnVuY19fLCByZW1vdGVfbmFtZSwgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBwX3NjYi0+c3VzcGVuZF9zdXAgPSBmYWxzZTsKLSAgfQotCi0gIHBfc2NiLT5zdHJlYW1fbXR1ID0KLSAgICAgIHBfZGF0YS0+c3RyX21zZy5tc2cub3Blbl9pbmQucGVlcl9tdHUgLSBBVkRUX01FRElBX0hEUl9TSVpFOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbDJjX2NpZDogMHgleCBzdHJlYW1fbXR1OiAlZCIsIF9fZnVuY19fLCBwX3NjYi0+bDJjX2NpZCwKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+c3RyZWFtX210dSk7Ci0KLSAgLyogU2V0IHRoZSBtZWRpYSBjaGFubmVsIGFzIGhpZ2ggcHJpb3JpdHkgKi8KLSAgTDJDQV9TZXRUeFByaW9yaXR5KHBfc2NiLT5sMmNfY2lkLCBMMkNBUF9DSE5MX1BSSU9SSVRZX0hJR0gpOwotICBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkocF9zY2ItPmwyY19jaWQsIHRydWUpOwotCi0gIGJ0YV9zeXNfY29ubl9vcGVuKEJUQV9JRF9BViwgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICBtZW1zZXQoJnBfc2NiLT5xX2luZm8sIDAsIHNpemVvZih0QlRBX0FWX1FfSU5GTykpOwotCi0gIHBfc2NiLT5sMmNfYnVmcyA9IDA7Ci0gIHBfc2NiLT5wX2Nvcy0+b3BlbihwX3NjYi0+aG5kbCwgcF9zY2ItPlBlZXJBZGRyZXNzKCksIHBfc2NiLT5zdHJlYW1fbXR1KTsKLQotICB7Ci0gICAgLyogVE9ETyBjaGVjayBpZiBvdGhlciBhdWRpbyBjaGFubmVsIGlzIG9wZW4uCi0gICAgICogSWYgeWVzLCBjaGVjayBpZiByZWNvbmZpZyBpcyBuZWVkZWQKLSAgICAgKiBSaWd0IG5vdyB3ZSBkbyBub3QgZG8gdGhpcyBraW5kIG9mIGNoZWNraW5nLgotICAgICAqIEJUQS1BViBpcyBJTlQgZm9yIDJuZCBhdWRpbyBjb25uZWN0aW9uLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY29kZWNfaW5mbyBpcyBwcm9wZXIuCi0gICAgICogSWYgb25lIGF1ZGlvIGNvbm5lY3Rpb24gaXMgb3BlbiBhbmQgYW5vdGhlciBTTksgYXR0ZW1wdHMgdG8gY29ubmVjdCB0bwotICAgICAqIEFWLAotICAgICAqIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVqZWN0ZWQuCi0gICAgICovCi0gICAgLyogY2hlY2sgaWYgb3RoZXIgYXVkaW8gY2hhbm5lbCBpcyBzdGFydGVkLiBJZiB5ZXMsIHN0YXJ0ICovCi0gICAgdEJUQV9BVl9PUEVOIG9wZW47Ci0gICAgb3Blbi5iZF9hZGRyID0gcF9zY2ItPlBlZXJBZGRyZXNzKCk7Ci0gICAgb3Blbi5jaG5sID0gcF9zY2ItPmNobmw7Ci0gICAgb3Blbi5obmRsID0gcF9zY2ItPmhuZGw7Ci0gICAgb3Blbi5zdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICBvcGVuLmVkciA9IDA7Ci0gICAgcCA9IEJUTV9SZWFkUmVtb3RlRmVhdHVyZXMocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgIGlmIChIQ0lfRURSX0FDTF8yTVBTX1NVUFBPUlRFRChwKSkgb3Blbi5lZHIgfD0gQlRBX0FWX0VEUl8yTUJQUzsKLSAgICAgIGlmIChIQ0lfRURSX0FDTF8zTVBTX1NVUFBPUlRFRChwKSkgewotICAgICAgICBpZiAoIWludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QXzJNQlBTX0xJTktfT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc2NiLT5QZWVyQWRkcmVzcygpKSkgewotICAgICAgICAgIG9wZW4uZWRyIHw9IEJUQV9BVl9FRFJfM01CUFM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYnRhX2FyX2F2ZHRfY29ubihCVEFfSURfQVYsIG9wZW4uYmRfYWRkciwgcF9zY2ItPmhkaSk7Ci0gICAgaWYgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwID09IEFWRFRfVFNFUF9TUkMpIHsKLSAgICAgIG9wZW4uc3RhcnRpbmcgPSBmYWxzZTsKLSAgICAgIG9wZW4uc2VwID0gQVZEVF9UU0VQX1NOSzsKLSAgICB9IGVsc2UgaWYgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwID09IEFWRFRfVFNFUF9TTkspIHsKLSAgICAgIG9wZW4uc3RhcnRpbmcgPSBidGFfYXZfY2hrX3N0YXJ0KHBfc2NiKTsKLSAgICAgIG9wZW4uc2VwID0gQVZEVF9UU0VQX1NSQzsKLSAgICB9Ci0KLSAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgIGJ0YV9hdl9kYXRhLm9wZW4gPSBvcGVuOwotICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9PUEVOX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICBpZiAob3Blbi5zdGFydGluZykgewotICAgICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQVBfU1RBUlRfRVZULCBOVUxMKTsKLSAgICB9Ci0gIH0KLQotICAvLyBUaGlzIGNvZGUgaXMgdXNlZCB0byBwYXNzIFBUUyBUQyBmb3IgQVZEVFAgQUJPUlQKLSAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICBpZiAoKG9zaV9wcm9wZXJ0eV9nZXQoImJsdWV0b290aC5wdHMuZm9yY2VfYTJkcF9hYm9ydCIsIHZhbHVlLCAiZmFsc2UiKSkgJiYKLSAgICAgICghc3RyY21wKHZhbHVlLCAidHJ1ZSIpKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBDYWxsaW5nIEFWRFRfQWJvcnRSZXEiLCBfX2Z1bmNfXyk7Ci0gICAgQVZEVF9BYm9ydFJlcShwX3NjYi0+YXZkdF9oYW5kbGUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2VjdXJpdHlfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gQVZEVFAgc2VjdXJpdHkgaW5kaWNhdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc2VjdXJpdHlfaW5kKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgcF9zY2ItPmF2ZHRfbGFiZWwgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmhkci5sYWJlbDsKLQotICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUFJPVEVDVCkgewotICAgIHRCVEFfQVZfUFJPVEVDVF9SRVEgcHJvdGVjdF9yZXE7Ci0gICAgcHJvdGVjdF9yZXEuY2hubCA9IHBfc2NiLT5jaG5sOwotICAgIHByb3RlY3RfcmVxLmhuZGwgPSBwX3NjYi0+aG5kbDsKLSAgICBwcm90ZWN0X3JlcS5wX2RhdGEgPSBwX2RhdGEtPnN0cl9tc2cubXNnLnNlY3VyaXR5X2luZC5wX2RhdGE7Ci0gICAgcHJvdGVjdF9yZXEubGVuID0gcF9kYXRhLT5zdHJfbXNnLm1zZy5zZWN1cml0eV9pbmQubGVuOwotCi0gICAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgICBidGFfYXZfZGF0YS5wcm90ZWN0X3JlcSA9IHByb3RlY3RfcmVxOwotICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9QUk9URUNUX1JFUV9FVlQsICZidGFfYXZfZGF0YSk7Ci0gIH0KLSAgLyogYXBwIGRvZXNuJ3Qgc3VwcG9ydCBzZWN1cml0eSBpbmRpY2F0aW9uOyByZXNwb25kIHdpdGggZmFpbHVyZSAqLwotICBlbHNlIHsKLSAgICBBVkRUX1NlY3VyaXR5UnNwKHBfc2NiLT5hdmR0X2hhbmRsZSwgcF9zY2ItPmF2ZHRfbGFiZWwsIEFWRFRfRVJSX05TQywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIDApOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2VjdXJpdHlfY2ZtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gQVZEVFAgc2VjdXJpdHkgY29uZmlybS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc2VjdXJpdHlfY2ZtKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgaWYgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1BST1RFQ1QpIHsKLSAgICB0QlRBX0FWX1BST1RFQ1RfUlNQIHByb3RlY3RfcnNwOwotICAgIHByb3RlY3RfcnNwLmNobmwgPSBwX3NjYi0+Y2hubDsKLSAgICBwcm90ZWN0X3JzcC5obmRsID0gcF9zY2ItPmhuZGw7Ci0gICAgcHJvdGVjdF9yc3AucF9kYXRhID0gcF9kYXRhLT5zdHJfbXNnLm1zZy5zZWN1cml0eV9jZm0ucF9kYXRhOwotICAgIHByb3RlY3RfcnNwLmxlbiA9IHBfZGF0YS0+c3RyX21zZy5tc2cuc2VjdXJpdHlfY2ZtLmxlbjsKLSAgICBwcm90ZWN0X3JzcC5lcnJfY29kZSA9IHBfZGF0YS0+c3RyX21zZy5tc2cuaGRyLmVycl9jb2RlOwotCi0gICAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgICBidGFfYXZfZGF0YS5wcm90ZWN0X3JzcCA9IHByb3RlY3RfcnNwOwotICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9QUk9URUNUX1JTUF9FVlQsICZidGFfYXZfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9kb19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2Ugc3RyZWFtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9kb19jbG9zZSh0QlRBX0FWX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwX3NjYi0+Y29fc3RhcnRlZD0lZCIsIF9fZnVuY19fLCBwX3NjYi0+Y29fc3RhcnRlZCk7Ci0KLSAgLyogc3RvcCBzdHJlYW0gaWYgc3RhcnRlZCAqLwotICBpZiAocF9zY2ItPmNvX3N0YXJ0ZWQpIHsKLSAgICBidGFfYXZfc3RyX3N0b3BwZWQocF9zY2IsIE5VTEwpOwotICB9Ci0gIGFsYXJtX2NhbmNlbChwX3NjYi0+bGlua19zaWduYWxsaW5nX3RpbWVyKTsKLQotICAvKiBjbG9zZSBzdHJlYW0gKi8KLSAgcF9zY2ItPnN0YXJ0ZWQgPSBmYWxzZTsKLSAgcF9zY2ItPnVzZV9ydHBfaGVhZGVyX21hcmtlcl9iaXQgPSBmYWxzZTsKLQotICAvKiBkcm9wIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBMMkNBUCAqLwotICBMMkNBX0ZsdXNoQ2hhbm5lbChwX3NjYi0+bDJjX2NpZCwgTDJDQVBfRkxVU0hfQ0hBTlNfQUxMKTsKLQotICBBVkRUX0Nsb3NlUmVxKHBfc2NiLT5hdmR0X2hhbmRsZSk7Ci0gIC8qIGp1c3QgaW4gY2FzZSB0aGF0IHRoZSBsaW5rIGlzIGNvbmdlc3RlZCwgbGluayBpcyBmbG93IGNvbnRyb2xlZCBieSBwZWVyIG9yCi0gICAqIGZvciB3aGF0ZXZlciByZWFzb24gdGhlIHRoZSBjbG9zZSByZXF1ZXN0IGNhbiBub3QgYmUgc2VudCBpbiB0aW1lLgotICAgKiB3aGVuIHRoaXMgdGltZXIgZXhwaXJlcywgQVZEVF9EaXNjb25uZWN0UmVxIHdpbGwgYmUgY2FsbGVkIHRvIGRpc2Nvbm5lY3QKLSAgICogdGhlIGxpbmsKLSAgICovCi0gIGJ0YV9zeXNfc3RhcnRfdGltZXIocF9zY2ItPmF2cmNfY3RfdGltZXIsIEJUQV9BVl9DTE9TRV9SRVFfVElNRV9WQUwsCi0gICAgICAgICAgICAgICAgICAgICAgQlRBX0FWX0FQSV9DTE9TRV9FVlQsIHBfc2NiLT5obmRsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jb25uZWN0X3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29ubmVjdCBBVkRUUCBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb25uZWN0X3JlcSh0QlRBX0FWX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGNvbGxfbWFzaz0weCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5jb2xsX21hc2spOwotICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gZmFsc2U7Ci0gIGlmIChwX3NjYi0+Y29sbF9tYXNrICYgQlRBX0FWX0NPTExfSU5DX1RNUikgewotICAgIC8qIFNOSyBpbml0aWF0ZWQgTDJDIGNvbm5lY3Rpb24gd2hpbGUgU1JDIHdhcyBkb2luZyBTRFAuICAgICovCi0gICAgLyogV2FpdCB1bnRpbCB0aW1lb3V0IHRvIGNoZWNrIGlmIFNOSyBzdGFydHMgc2lnbmFsbGluZy4gICAgKi8KLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBjb2xsX21hc2s9MHglMDJ4IGluY29taW5nIHRpbWVyIGlzIHVwIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5jb2xsX21hc2spOwotICAgIHBfc2NiLT5jb2xsX21hc2sgfD0gQlRBX0FWX0NPTExfQVBJX0NBTExFRDsKLSAgICBBUFBMX1RSQUNFX0VWRU5UKCIlczogdXBkYXRlZCBjb2xsX21hc2s9MHglMDJ4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+Y29sbF9tYXNrKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBVkRUX0Nvbm5lY3RSZXEocF9zY2ItPlBlZXJBZGRyZXNzKCksIHBfc2NiLT5oZGksICZidGFfYXZfcHJvY19zdHJlYW1fZXZ0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zZHBfZmFpbGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXJ2aWNlIGRpc2NvdmVyeSBmYWlsZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NkcF9mYWlsZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcGVlcl9hZGRyPSVzIG9wZW5fc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+b3Blbl9zdGF0dXMpOwotCi0gIGlmIChwX3NjYi0+b3Blbl9zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpIHsKLSAgICBwX3NjYi0+b3Blbl9zdGF0dXMgPSBCVEFfQVZfRkFJTF9TRFA7Ci0gIH0KLQotICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID0gZmFsc2U7Ci0gIGJ0YV9hdl9zdHJfY2xvc2VkKHBfc2NiLCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2Rpc2NfcmVzdWx0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIHRoZSBBVkRUUCBkaXNjb3ZlciByZXN1bHRzLiAgU2VhcmNoIHRocm91Z2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHJlc3VsdHMgYW5kIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBzdHJlYW0sIGFuZCBnZXQKLSAqICAgICAgICAgICAgICAgICAgaXRzIGNhcGFiaWxpdGllcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZGlzY19yZXN1bHRzKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCBudW1fc25rcyA9IDAsIG51bV9zcmNzID0gMCwgaTsKLSAgLyogb3VyIHV1aWQgaW4gY2FzZSB3ZSBpbml0aWF0ZSBjb25uZWN0aW9uICovCi0gIHVpbnQxNl90IHV1aWRfaW50ID0gcF9zY2ItPnV1aWRfaW50OwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6IDB4JXggaW5pdGlhdG9yIFVVSUQgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmhuZGwsCi0gICAgICAgICAgICAgICAgICAgdXVpZF9pbnQpOwotCi0gIC8qIHN0b3JlIG51bWJlciBvZiBzdHJlYW0gZW5kcG9pbnRzIHJldHVybmVkICovCi0gIHBfc2NiLT5udW1fc2VwcyA9IHBfZGF0YS0+c3RyX21zZy5tc2cuZGlzY292ZXJfY2ZtLm51bV9zZXBzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwX3NjYi0+bnVtX3NlcHM7IGkrKykgewotICAgIC8qIHN0ZWFtIG5vdCBpbiB1c2UsIGlzIGEgc2luaywgYW5kIGlzIGF1ZGlvICovCi0gICAgaWYgKCghcF9zY2ItPnNlcF9pbmZvW2ldLmluX3VzZSkgJiYKLSAgICAgICAgKHBfc2NiLT5zZXBfaW5mb1tpXS5tZWRpYV90eXBlID09IHBfc2NiLT5tZWRpYV90eXBlKSkgewotICAgICAgaWYgKChwX3NjYi0+c2VwX2luZm9baV0udHNlcCA9PSBBVkRUX1RTRVBfU05LKSAmJgotICAgICAgICAgICh1dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UpKQotICAgICAgICBudW1fc25rcysrOwotCi0gICAgICBpZiAoKHBfc2NiLT5zZXBfaW5mb1tpXS50c2VwID09IEFWRFRfVFNFUF9TUkMpICYmCi0gICAgICAgICAgKHV1aWRfaW50ID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspKQotICAgICAgICBudW1fc3JjcysrOwotICAgIH0KLSAgfQotCi0gIHBfc2NiLT5wX2Nvcy0+ZGlzY19yZXMocF9zY2ItPmhuZGwsIHBfc2NiLT5QZWVyQWRkcmVzcygpLCBwX3NjYi0+bnVtX3NlcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Nua3MsIG51bV9zcmNzLCB1dWlkX2ludCk7Ci0gIHBfc2NiLT5udW1fZGlzY19zbmtzID0gbnVtX3Nua3M7Ci0gIHBfc2NiLT5udW1fZGlzY19zcmNzID0gbnVtX3NyY3M7Ci0KLSAgLyogaWYgd2UgZ290IGFueSAqLwotICBpZiAocF9zY2ItPm51bV9zZXBzID4gMCkgewotICAgIC8qIGluaXRpYWxpemUgaW5kZXggaW50byBkaXNjb3ZlcnkgcmVzdWx0cyAqLwotICAgIHBfc2NiLT5zZXBfaW5mb19pZHggPSAwOwotCi0gICAgLyogZ2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGZpcnN0IGF2YWlsYWJsZSBzdHJlYW0gKi8KLSAgICBidGFfYXZfbmV4dF9nZXRjYXAocF9zY2IsIHBfZGF0YSk7Ci0gIH0KLSAgLyogZWxzZSB3ZSBnb3QgZGlzY292ZXIgcmVzcG9uc2UgYnV0IHdpdGggbm8gc3RyZWFtczsgd2UncmUgZG9uZSAqLwotICBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQlRBX0FWX1NUUl9ESVNDX0ZBSUxfRVZUOiBwZWVyX2FkZHI9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfU1RSX0RJU0NfRkFJTF9FVlQsIHBfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9kaXNjX3Jlc19hc19hY3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSB0aGUgQVZEVFAgZGlzY292ZXIgcmVzdWx0cy4gIFNlYXJjaCB0aHJvdWdoIHRoZQotICogICAgICAgICAgICAgICAgICByZXN1bHRzIGFuZCBmaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgc3RyZWFtLCBhbmQgZ2V0Ci0gKiAgICAgICAgICAgICAgICAgIGl0cyBjYXBhYmlsaXRpZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2Rpc2NfcmVzX2FzX2FjcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QgbnVtX3Nua3MgPSAwLCBpOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsKTsKLQotICAvKiBzdG9yZSBudW1iZXIgb2Ygc3RyZWFtIGVuZHBvaW50cyByZXR1cm5lZCAqLwotICBwX3NjYi0+bnVtX3NlcHMgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmRpc2NvdmVyX2NmbS5udW1fc2VwczsKLQotICBmb3IgKGkgPSAwOyBpIDwgcF9zY2ItPm51bV9zZXBzOyBpKyspIHsKLSAgICAvKiBzdGVhbSBpcyBhIHNpbmssIGFuZCBpcyBhdWRpbyAqLwotICAgIGlmICgocF9zY2ItPnNlcF9pbmZvW2ldLnRzZXAgPT0gQVZEVF9UU0VQX1NOSykgJiYKLSAgICAgICAgKHBfc2NiLT5zZXBfaW5mb1tpXS5tZWRpYV90eXBlID09IHBfc2NiLT5tZWRpYV90eXBlKSkgewotICAgICAgcF9zY2ItPnNlcF9pbmZvW2ldLmluX3VzZSA9IGZhbHNlOwotICAgICAgbnVtX3Nua3MrKzsKLSAgICB9Ci0gIH0KLSAgcF9zY2ItPnBfY29zLT5kaXNjX3JlcyhwX3NjYi0+aG5kbCwgcF9zY2ItPlBlZXJBZGRyZXNzKCksIHBfc2NiLT5udW1fc2VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc25rcywgMCwgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKTsKLSAgcF9zY2ItPm51bV9kaXNjX3Nua3MgPSBudW1fc25rczsKLSAgcF9zY2ItPm51bV9kaXNjX3NyY3MgPSAwOwotCi0gIC8qIGlmIHdlIGdvdCBhbnkgKi8KLSAgaWYgKHBfc2NiLT5udW1fc2VwcyA+IDApIHsKLSAgICAvKiBpbml0aWFsaXplIGluZGV4IGludG8gZGlzY292ZXJ5IHJlc3VsdHMgKi8KLSAgICBwX3NjYi0+c2VwX2luZm9faWR4ID0gMDsKLQotICAgIC8qIGdldCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBmaXJzdCBhdmFpbGFibGUgc3RyZWFtICovCi0gICAgYnRhX2F2X25leHRfZ2V0Y2FwKHBfc2NiLCBwX2RhdGEpOwotICB9Ci0gIC8qIGVsc2Ugd2UgZ290IGRpc2NvdmVyIHJlc3BvbnNlIGJ1dCB3aXRoIG5vIHN0cmVhbXM7IHdlJ3JlIGRvbmUgKi8KLSAgZWxzZSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEJUQV9BVl9TVFJfRElTQ19GQUlMX0VWVDogcGVlcl9hZGRyPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FWX1NUUl9ESVNDX0ZBSUxfRVZULCBwX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2F2ZV9jYXBzCi0gKgotICogRGVzY3JpcHRpb24gICAgICByZXBvcnQgdGhlIFNOSyBTRVAgY2FwYWJpbGl0aWVzIHRvIGFwcGxpY2F0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NhdmVfY2Fwcyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEF2ZHRwU2VwQ29uZmlnIGNmZzsKLSAgdEFWRFRfU0VQX0lORk8qIHBfaW5mbyA9ICZwX3NjYi0+c2VwX2luZm9bcF9zY2ItPnNlcF9pbmZvX2lkeF07Ci0gIHVpbnQ4X3Qgb2xkX3dhaXQgPSBwX3NjYi0+d2FpdDsKLSAgYm9vbCBnZXRjYXBfZG9uZSA9IGZhbHNlOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IHBlZXIgJXMgYnRhX2hhbmRsZToweCV4IG51bV9zZXBzOiVkIHNlcF9pbmZvX2lkeDolZCB3YWl0OjB4JXgiLAotICAgICAgX19mdW5jX18sIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmhuZGwsCi0gICAgICBwX3NjYi0+bnVtX3NlcHMsIHBfc2NiLT5zZXBfaW5mb19pZHgsIHBfc2NiLT53YWl0KTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvZGVjOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfc2NiLT5wZWVyX2NhcC5jb2RlY19pbmZvKS5jX3N0cigpKTsKLQotICBjZmcgPSBwX3NjYi0+cGVlcl9jYXA7Ci0gIC8qIGxldCBhcHBsaWNhdGlvbiBrbm93IHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBTTksgKi8KLSAgaWYgKHBfc2NiLT5wX2Nvcy0+Z2V0Y2ZnKHBfc2NiLT5obmRsLCBwX3NjYi0+UGVlckFkZHJlc3MoKSwgY2ZnLmNvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zY2ItPnNlcF9pbmZvX2lkeCwgcF9pbmZvLT5zZWlkLCAmY2ZnLm51bV9wcm90ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnByb3RlY3RfaW5mbykgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgcF9zY2ItPnNlcF9pbmZvX2lkeCsrOwotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiByZXN1bHQ6IG5leHQgc2VwX2luZm9faWR4OiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c2VwX2luZm9faWR4KTsKLSAgfSBlbHNlIHsKLSAgICAvLyBBbGwgY2FwYWJpbGl0aWVzIGZvdW5kCi0gICAgZ2V0Y2FwX2RvbmUgPSB0cnVlOwotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiByZXN1bHQ6IGRvbmUgc2VwX2luZm9faWR4OiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c2VwX2luZm9faWR4KTsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY0luZm9TdHJpbmcoY2ZnLmNvZGVjX2luZm8pLmNfc3RyKCkpOwotCi0gIGlmIChwX3NjYi0+bnVtX3NlcHMgPiBwX3NjYi0+c2VwX2luZm9faWR4ICYmICFnZXRjYXBfZG9uZSkgewotICAgIC8qIFNvbWUgZGV2aWNlcyBoYXZlIHNlcHMgYXQgdGhlIGVuZCBvZiB0aGUgZGlzY292ZXIgbGlzdCwgd2hpY2ggaXMgbm90ICovCi0gICAgLyogbWF0Y2hpbmcgbWVkaWEgdHlwZSh2aWRlbyBub3QgYXVkaW8pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGFyZSBkb25lIHdpdGggZ2V0Y2FwIHdpdGhvdXQgc2VuZGluZyBhbm90aGVyICAgICAgICAqLwotICAgIC8qIHJlcXVlc3QgdG8gQVZEVC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCFidGFfYXZfbmV4dF9nZXRjYXAocF9zY2IsIHBfZGF0YSkpIGdldGNhcF9kb25lID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBnZXRjYXBfZG9uZSA9IHRydWU7Ci0gIH0KLQotICBpZiAoZ2V0Y2FwX2RvbmUpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogZ2V0Y2FwX2RvbmU6IG51bV9zZXBzOiVkIHNlcF9pbmZvX2lkeDolZCB3YWl0OjB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5udW1fc2VwcywgcF9zY2ItPnNlcF9pbmZvX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT53YWl0KTsKLSAgICBwX3NjYi0+d2FpdCAmPSB+KEJUQV9BVl9XQUlUX0FDUF9DQVBTX09OIHwgQlRBX0FWX1dBSVRfQUNQX0NBUFNfU1RBUlRFRCk7Ci0gICAgaWYgKG9sZF93YWl0ICYgQlRBX0FWX1dBSVRfQUNQX0NBUFNfU1RBUlRFRCkgewotICAgICAgYnRhX2F2X3N0YXJ0X29rKHBfc2NiLCBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zZXRfdXNlX3JjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZXQgdG8gdXNlIEFWUkMgZm9yIHRoaXMgc3RyZWFtIGNvbnRyb2wgYmxvY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NldF91c2VfcmModEJUQV9BVl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBwX3NjYi0+dXNlX3JjID0gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jY29fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNhbGwgY2xvc2UgY2FsbC1vdXQgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2Njb19jbG9zZSh0QlRBX0FWX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmhuZGwpOwotICBwX3NjYi0+cF9jb3MtPmNsb3NlKHBfc2NiLT5obmRsLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfb3Blbl9mYWlsZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZhaWxlZCB0byBvcGVuIGFuIEFWRFQgc3RyZWFtCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X29wZW5fZmFpbGVkKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgYm9vbCBpc19hdl9vcGVuZWQgPSBmYWxzZTsKLSAgdEJUQV9BVl9TQ0IqIHBfb3BlbmVkX3NjYiA9IE5VTEw7Ci0gIHVpbnQ4X3QgaWR4OwotCi0gIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwZWVyX2FkZHI9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBwX3NjYi0+b3Blbl9zdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07Ci0gIGJ0YV9hdl9jY29fY2xvc2UocF9zY2IsIHBfZGF0YSk7Ci0KLSAgLyogY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbHJlYWR5IGFuIG9wZW5lZCBhdWRpbyBvciB2aWRlbyBjb25uZWN0aW9uIHdpdGggdGhlCi0gICAqIHNhbWUgZGV2aWNlICovCi0gIGZvciAoaWR4ID0gMDsgKGlkeCA8IEJUQV9BVl9OVU1fU1RSUykgJiYgKCFpc19hdl9vcGVuZWQpOyBpZHgrKykgewotICAgIHBfb3BlbmVkX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYltpZHhdOwotICAgIGlmIChwX29wZW5lZF9zY2IgJiYgKHBfb3BlbmVkX3NjYi0+c3RhdGUgPT0gQlRBX0FWX09QRU5fU1NUKSAmJgotICAgICAgICAocF9vcGVuZWRfc2NiLT5QZWVyQWRkcmVzcygpID09IHBfc2NiLT5QZWVyQWRkcmVzcygpKSkKLSAgICAgIGlzX2F2X29wZW5lZCA9IHRydWU7Ci0gIH0KLQotICAvKiBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFjdGl2ZSBBViBjb25ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIGJkX2FkZHIsCi0gICAgIGRvbid0IHNlbmQgZGlzY29ubmVjdCByZXEsIGp1c3QgcmVwb3J0IHRoZSBvcGVuIGV2ZW50IHdpdGgKLSAgICAgQlRBX0FWX0ZBSUxfR0VUX0NBUCBzdGF0dXMgKi8KLSAgaWYgKGlzX2F2X29wZW5lZCkgewotICAgIHRCVEFfQVZfT1BFTiBvcGVuOwotICAgIG9wZW4uYmRfYWRkciA9IHBfc2NiLT5QZWVyQWRkcmVzcygpOwotICAgIG9wZW4uY2hubCA9IHBfc2NiLT5jaG5sOwotICAgIG9wZW4uaG5kbCA9IHBfc2NiLT5obmRsOwotICAgIG9wZW4uc3RhdHVzID0gQlRBX0FWX0ZBSUxfR0VUX0NBUDsKLSAgICBvcGVuLnN0YXJ0aW5nID0gYnRhX2F2X2Noa19zdGFydChwX3NjYik7Ci0gICAgb3Blbi5lZHIgPSAwOwotICAgIC8qIHNldCB0aGUgc3RhdGUgYmFjayB0byBpbml0aWFsIHN0YXRlICovCi0gICAgYnRhX2F2X3NldF9zY2Jfc3N0X2luaXQocF9zY2IpOwotCi0gICAgaWYgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwID09IEFWRFRfVFNFUF9TUkMpIHsKLSAgICAgIG9wZW4uc2VwID0gQVZEVF9UU0VQX1NOSzsKLSAgICB9IGVsc2UgaWYgKHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwID09IEFWRFRfVFNFUF9TTkspIHsKLSAgICAgIG9wZW4uc2VwID0gQVZEVF9UU0VQX1NSQzsKLSAgICB9Ci0KLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIGNvbm5lY3Rpb246IHBlZXJfYWRkcj0lcyBjaG5sPSVkICIKLSAgICAgICAgImhuZGw9MHgleCBzdGF0dXM9JWQgc3RhcnRpbmc9JWQgZWRyPSVkIiwKLSAgICAgICAgX19mdW5jX18sIG9wZW4uYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIG9wZW4uY2hubCwgb3Blbi5obmRsLAotICAgICAgICBvcGVuLnN0YXR1cywgb3Blbi5zdGFydGluZywgb3Blbi5lZHIpOwotCi0gICAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgICBidGFfYXZfZGF0YS5vcGVuID0gb3BlbjsKLSAgICAoKmJ0YV9hdl9jYi5wX2NiYWNrKShCVEFfQVZfT1BFTl9FVlQsICZidGFfYXZfZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgQVZEVF9EaXNjb25uZWN0UmVxKHBfc2NiLT5QZWVyQWRkcmVzcygpLCAmYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9nZXRjYXBfcmVzdWx0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIHRoZSBBVkRUUCBnZXQgY2FwYWJpbGl0aWVzIHJlc3VsdHMuICBDaGVjayB0aGUgY29kZWMKLSAqICAgICAgICAgICAgICAgICAgdHlwZSBhbmQgc2VlIGlmIGl0IG1hdGNoZXMgb3Vycy4gIElmIGl0IGRvZXMgbm90LCBnZXQgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBvZiB0aGUgbmV4dCBzdHJlYW0sIGlmIGFueS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZ2V0Y2FwX3Jlc3VsdHModEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBdmR0cFNlcENvbmZpZyBjZmcgPSBwX3NjYi0+Y2ZnOwotICB1aW50OF90IG1lZGlhX3R5cGUgPSBBMkRQX0dldE1lZGlhVHlwZShwX3NjYi0+cGVlcl9jYXAuY29kZWNfaW5mbyk7Ci0gIHRBVkRUX1NFUF9JTkZPKiBwX2luZm8gPSAmcF9zY2ItPnNlcF9pbmZvW3Bfc2NiLT5zZXBfaW5mb19pZHhdOwotCi0gIGNmZy5udW1fY29kZWMgPSAxOwotICBjZmcubnVtX3Byb3RlY3QgPSBwX3NjYi0+cGVlcl9jYXAubnVtX3Byb3RlY3Q7Ci0gIG1lbWNweShjZmcuY29kZWNfaW5mbywgcF9zY2ItPnBlZXJfY2FwLmNvZGVjX2luZm8sIEFWRFRfQ09ERUNfU0laRSk7Ci0gIG1lbWNweShjZmcucHJvdGVjdF9pbmZvLCBwX3NjYi0+cGVlcl9jYXAucHJvdGVjdF9pbmZvLCBBVkRUX1BST1RFQ1RfU0laRSk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYnRhX2hhbmRsZToweCV4IG51bV9jb2RlYzolZCBwc2NfbWFzaz0weCV4IiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5obmRsLCBwX3NjYi0+cGVlcl9jYXAubnVtX2NvZGVjLCBwX3NjYi0+Y2ZnLnBzY19tYXNrKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG1lZGlhIHR5cGUgMHgleCwgMHgleCIsIF9fZnVuY19fLCBtZWRpYV90eXBlLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5tZWRpYV90eXBlKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvZGVjOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfc2NiLT5jZmcuY29kZWNfaW5mbykuY19zdHIoKSk7Ci0KLSAgLyogaWYgY29kZWMgcHJlc2VudCBhbmQgd2UgZ2V0IGEgY29kZWMgY29uZmlndXJhdGlvbiAqLwotICBpZiAoKHBfc2NiLT5wZWVyX2NhcC5udW1fY29kZWMgIT0gMCkgJiYgKG1lZGlhX3R5cGUgPT0gcF9zY2ItPm1lZGlhX3R5cGUpICYmCi0gICAgICAocF9zY2ItPnBfY29zLT5nZXRjZmcocF9zY2ItPmhuZGwsIHBfc2NiLT5QZWVyQWRkcmVzcygpLCBjZmcuY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zY2ItPnNlcF9pbmZvX2lkeCwgcF9pbmZvLT5zZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZmcubnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnByb3RlY3RfaW5mbykgPT0gQTJEUF9TVUNDRVNTKSkgewotICAgIC8qIFVVSUQgZm9yIHdoaWNoIGNvbm5lY3Rpb24gd2FzIGluaXRpYXRpZWQgKi8KLSAgICB1aW50MTZfdCB1dWlkX2ludCA9IHBfc2NiLT51dWlkX2ludDsKLQotICAgIC8qIHNhdmUgY29weSBvZiBjb2RlYyBjb25maWd1cmF0aW9uICovCi0gICAgcF9zY2ItPmNmZyA9IGNmZzsKLQotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiByZXN1bHQ6IHNlcF9pbmZvX2lkeD0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnNlcF9pbmZvX2lkeCk7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvZGVjOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY0luZm9TdHJpbmcocF9zY2ItPmNmZy5jb2RlY19pbmZvKS5jX3N0cigpKTsKLQotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBpbml0aWF0b3IgVVVJRCA9IDB4JXgiLCBfX2Z1bmNfXywgdXVpZF9pbnQpOwotICAgIGlmICh1dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UpCi0gICAgICBidGFfYXZfYWRqdXN0X3NlcHNfaWR4KHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfZ2V0X3NjYl9oYW5kbGUocF9zY2IsIEFWRFRfVFNFUF9TUkMpKTsKLSAgICBlbHNlIGlmICh1dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKQotICAgICAgYnRhX2F2X2FkanVzdF9zZXBzX2lkeChwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2dldF9zY2JfaGFuZGxlKHBfc2NiLCBBVkRUX1RTRVBfU05LKSk7Ci0gICAgTE9HX0lORk8oIiVzOiBzZXBfaWR4PSVkIGF2ZHRfaGFuZGxlPSVkIGJ0YV9oYW5kbGU9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgIHBfc2NiLT5zZXBfaWR4LCBwX3NjYi0+YXZkdF9oYW5kbGUsIHBfc2NiLT5obmRsKTsKLQotICAgIC8qIHVzZSBvbmx5IHRoZSBzZXJ2aWNlcyBwZWVyIHN1cHBvcnRzICovCi0gICAgY2ZnLnBzY19tYXNrICY9IHBfc2NiLT5wZWVyX2NhcC5wc2NfbWFzazsKLSAgICBwX3NjYi0+Y3VyX3BzY19tYXNrID0gY2ZnLnBzY19tYXNrOwotICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICIlczogcGVlciAlcyBidGFfaGFuZGxlOjB4JXggc2VwX2lkeDolZCBzZXBfaW5mb19pZHg6JWQgIgotICAgICAgICAiY3VyX3BzY19tYXNrOjB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+aG5kbCwKLSAgICAgICAgcF9zY2ItPnNlcF9pZHgsIHBfc2NiLT5zZXBfaW5mb19pZHgsIHBfc2NiLT5jdXJfcHNjX21hc2spOwotCi0gICAgaWYgKCh1dWlkX2ludCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKSAmJgotICAgICAgICAocF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLnBfYXBwX3NpbmtfZGF0YV9jYmFjayAhPSBOVUxMKSkgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvbmZpZ3VyZSBkZWNvZGVyIGZvciBTaW5rIGNvbm5lY3Rpb24iLCBfX2Z1bmNfXyk7Ci0gICAgICB0QlRBX0FWX01FRElBIGF2X3NpbmtfY29kZWNfaW5mbzsKLSAgICAgIGF2X3NpbmtfY29kZWNfaW5mby5hdmtfY29uZmlnLmJkX2FkZHIgPSBwX3NjYi0+UGVlckFkZHJlc3MoKTsKLSAgICAgIGF2X3NpbmtfY29kZWNfaW5mby5hdmtfY29uZmlnLmNvZGVjX2luZm8gPSBwX3NjYi0+Y2ZnLmNvZGVjX2luZm87Ci0gICAgICBwX3NjYi0+c2Vwc1twX3NjYi0+c2VwX2lkeF0ucF9hcHBfc2lua19kYXRhX2NiYWNrKAotICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLCBCVEFfQVZfU0lOS19NRURJQV9DRkdfRVZULCAmYXZfc2lua19jb2RlY19pbmZvKTsKLSAgICB9Ci0KLSAgICBpZiAodXVpZF9pbnQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKSB7Ci0gICAgICBBMkRQX0FkanVzdENvZGVjKGNmZy5jb2RlY19pbmZvKTsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIHRoZSBzdHJlYW0gKi8KLSAgICBBVkRUX09wZW5SZXEocF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLmF2X2hhbmRsZSwgcF9zY2ItPlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgIHBfc2NiLT5oZGksIHBfc2NiLT5zZXBfaW5mb1twX3NjYi0+c2VwX2luZm9faWR4XS5zZWlkLCAmY2ZnKTsKLSAgfSBlbHNlIHsKLSAgICAvKiB0cnkgdGhlIG5leHQgc3RyZWFtLCBpZiBhbnkgKi8KLSAgICBwX3NjYi0+c2VwX2luZm9faWR4Kys7Ci0gICAgYnRhX2F2X25leHRfZ2V0Y2FwKHBfc2NiLCBwX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2V0Y29uZmlnX3JlagotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBBVkRUUCBzZXQgY29uZmlnIHJlamVjdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc2V0Y29uZmlnX3Jlaih0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfUkVKRUNUIHJlamVjdDsKLSAgdWludDhfdCBhdmR0X2hhbmRsZSA9IHBfZGF0YS0+Y2lfc2V0Y29uZmlnLmF2ZHRfaGFuZGxlOwotCi0gIGJ0YV9hdl9hZGp1c3Rfc2Vwc19pZHgocF9zY2IsIGF2ZHRfaGFuZGxlKTsKLSAgTE9HX0lORk8oIiVzOiBzZXBfaWR4PSVkIGF2ZHRfaGFuZGxlPSVkIGJ0YV9oYW5kbGU9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICBwX3NjYi0+c2VwX2lkeCwgcF9zY2ItPmF2ZHRfaGFuZGxlLCBwX3NjYi0+aG5kbCk7Ci0gIEFWRFRfQ29uZmlnUnNwKHBfc2NiLT5hdmR0X2hhbmRsZSwgcF9zY2ItPmF2ZHRfbGFiZWwsIEFWRFRfRVJSX1VOU1VQX0NGRywgMCk7Ci0KLSAgcmVqZWN0LmJkX2FkZHIgPSBwX2RhdGEtPnN0cl9tc2cuYmRfYWRkcjsKLSAgcmVqZWN0LmhuZGwgPSBwX3NjYi0+aG5kbDsKLQotICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICBidGFfYXZfZGF0YS5yZWplY3QgPSByZWplY3Q7Ci0gICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9SRUpFQ1RfRVZULCAmYnRhX2F2X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2Rpc2NvdmVyX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBBVkRUUCBkaXNjb3ZlciByZXF1ZXN0IHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9kaXNjb3Zlcl9yZXEodEJUQV9BVl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICAvKiBzZW5kIGF2ZHRwIGRpc2NvdmVyIHJlcXVlc3QgKi8KLQotICBBVkRUX0Rpc2NvdmVyUmVxKHBfc2NiLT5QZWVyQWRkcmVzcygpLCBwX3NjYi0+aGRpLCBwX3NjYi0+c2VwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgQlRBX0FWX05VTV9TRVBTLCAmYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29ubl9mYWlsZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFWRFRQIGNvbm5lY3Rpb24gZmFpbGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb25uX2ZhaWxlZCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwZWVyX2FkZHI9JXMgb3Blbl9zdGF0dXM9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5vcGVuX3N0YXR1cyk7Ci0KLSAgcF9zY2ItPm9wZW5fc3RhdHVzID0gQlRBX0FWX0ZBSUxfU1RSRUFNOwotICBidGFfYXZfc3RyX2Nsb3NlZChwX3NjYiwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9kb19zdGFydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgc3RyZWFtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9kb19zdGFydCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIExPR19JTkZPKAotICAgICAgIkEyZHAgc3RyZWFtIHN0YXJ0IHBlZXI6JXMgc2NvX29jY3VwaWVkOiVzIGF2X3JvbGU6MHgleCBzdGFydGVkOiVzICIKLSAgICAgICJ3YWl0OjB4JXgiLAotICAgICAgUFJJVkFURV9BRERSRVNTKHBfc2NiLT5QZWVyQWRkcmVzcygpKSwKLSAgICAgIGxvZ2Jvb2woYnRhX2F2X2NiLnNjb19vY2N1cGllZCkuY19zdHIoKSwgcF9zY2ItPnJvbGUsCi0gICAgICBsb2dib29sKHBfc2NiLT5zdGFydGVkKS5jX3N0cigpLCBwX3NjYi0+d2FpdCk7Ci0gIGlmIChidGFfYXZfY2Iuc2NvX29jY3VwaWVkKSB7Ci0gICAgTE9HX1dBUk4oIkEyZHAgc3RyZWFtIHN0YXJ0IGZhaWxlZCIpOwotICAgIGJ0YV9hdl9zdGFydF9mYWlsZWQocF9zY2IsIHBfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfc2NiLT5zdGFydGVkKSB7Ci0gICAgcF9zY2ItPnJvbGUgfD0gQlRBX0FWX1JPTEVfU1RBUlRfSU5UOwotICAgIGlmIChwX3NjYi0+d2FpdCAhPSAwKSB7Ci0gICAgICBMT0dfV0FSTigKLSAgICAgICAgICAiJXM6IHBlZXIgJXMgc3RhcnQgc3RyZWFtIHJlcXVlc3QgaWdub3JlZDogIgotICAgICAgICAgICJhbHJlYWR5IHdhaXRpbmc6IHNjb19vY2N1cGllZDolcyByb2xlOjB4JXggc3RhcnRlZDolcyB3YWl0OjB4JXgiLAotICAgICAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgbG9nYm9vbChidGFfYXZfY2Iuc2NvX29jY3VwaWVkKS5jX3N0cigpLCBwX3NjYi0+cm9sZSwKLSAgICAgICAgICBsb2dib29sKHBfc2NiLT5zdGFydGVkKS5jX3N0cigpLCBwX3NjYi0+d2FpdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwX3NjYi0+cm9sZSAmIEJUQV9BVl9ST0xFX1NVU1BFTkQpIHsKLSAgICAgIG5vdGlmeV9zdGFydF9mYWlsZWQocF9zY2IpOwotICAgIH0gZWxzZSB7Ci0gICAgICBidGFfYXZfc3RhcnRfb2socF9zY2IsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfU1RBUlRfSU5UKSAhPSAwKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICIlczogcGVlciAlcyBzdGFydCBzdHJlYW0gcmVxdWVzdCBpZ25vcmVkOiAiCi0gICAgICAgICJhbHJlYWR5IGluaXRpYXRlZDogc2NvX29jY3VwaWVkOiVzIHJvbGU6MHgleCBzdGFydGVkOiVzIHdhaXQ6MHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgIGxvZ2Jvb2woYnRhX2F2X2NiLnNjb19vY2N1cGllZCkuY19zdHIoKSwgcF9zY2ItPnJvbGUsCi0gICAgICAgIGxvZ2Jvb2wocF9zY2ItPnN0YXJ0ZWQpLmNfc3RyKCksIHBfc2NiLT53YWl0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX3NjYi0+cm9sZSB8PSBCVEFfQVZfUk9MRV9TVEFSVF9JTlQ7Ci0gIGJ0YV9zeXNfYnVzeShCVEFfSURfQVYsIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCwgcF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICAvKiBkaXNhbGxvdyByb2xlIHN3aXRjaCBkdXJpbmcgc3RyZWFtaW5nLCBvbmx5IGlmIHdlIGFyZSB0aGUgY2VudHJhbCByb2xlCi0gICAqIGkuZS4gYWxsb3cgcm9sZSBzd2l0Y2gsIGlmIHdlIGFyZSBwZXJpcGhlcmFsLgotICAgKiBJdCB3b3VsZCBub3QgaHVydCB1cywgaWYgdGhlIHBlZXIgZGV2aWNlIHdhbnRzIHVzIHRvIGJlIGNlbnRyYWwKLSAgICogZGlzYWJsZSBzbmlmZiBtb2RlIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgc3RyZWFtaW5nICovCi0gIHRIQ0lfUk9MRSBjdXJfcm9sZTsKLSAgaWYgKChCVE1fR2V0Um9sZShwX3NjYi0+UGVlckFkZHJlc3MoKSwgJmN1cl9yb2xlKSA9PSBCVE1fU1VDQ0VTUykgJiYKLSAgICAgIChjdXJfcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSkgewotICAgIEJUTV9ibG9ja19yb2xlX3N3aXRjaF9hbmRfc25pZmZfbW9kZV9mb3IocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICB9IGVsc2UgewotICAgIEJUTV9ibG9ja19zbmlmZl9tb2RlX2ZvcihwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gIH0KLQotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1N0YXJ0UmVxKCZwX3NjYi0+YXZkdF9oYW5kbGUsIDEpOwotICBpZiAocmVzdWx0ICE9IEFWRFRfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IEFWRFRfU3RhcnRSZXEgZmFpbGVkIGZvciBwZWVyICVzIHJlc3VsdDolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHJlc3VsdCk7Ci0gICAgYnRhX2F2X3N0YXJ0X2ZhaWxlZChwX3NjYiwgcF9kYXRhKTsKLSAgfQotICBMT0dfSU5GTygKLSAgICAgICIlczogcGVlciAlcyBzdGFydCByZXF1ZXN0ZWQ6IHNjb19vY2N1cGllZDolcyByb2xlOjB4JXggIgotICAgICAgInN0YXJ0ZWQ6JXMgd2FpdDoweCV4IiwKLSAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICBsb2dib29sKGJ0YV9hdl9jYi5zY29fb2NjdXBpZWQpLmNfc3RyKCksIHBfc2NiLT5yb2xlLAotICAgICAgbG9nYm9vbChwX3NjYi0+c3RhcnRlZCkuY19zdHIoKSwgcF9zY2ItPndhaXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N0cl9zdG9wcGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdHJlYW0gc3RvcHBlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc3RyX3N0b3BwZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX1NVU1BFTkQgc3VzcGVuZF9yc3A7Ci0gIHVpbnQ4X3Qgc3RhcnQgPSBwX3NjYi0+c3RhcnRlZDsKLSAgYm9vbCBzdXNfZXZ0ID0gdHJ1ZTsKLSAgQlRfSERSKiBwX2J1ZjsKLQotICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6MHgleCBhdWRpb19vcGVuX2NudDolZCwgcF9kYXRhICVwIHN0YXJ0OiVkIiwKLSAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLAotICAgICAgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBwX2RhdGEsIHN0YXJ0KTsKLQotICBidGFfc3lzX2lkbGUoQlRBX0lEX0FWLCBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQsIHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLSAgQlRNX3VuYmxvY2tfcm9sZV9zd2l0Y2hfYW5kX3NuaWZmX21vZGVfZm9yKHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLQotICBpZiAocF9zY2ItPmNvX3N0YXJ0ZWQpIHsKLSAgICB1aW50MTZfdCBoYW5kbGUgPSBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saWZlY3ljbGUuQlRNX0dldEhDSUNvbm5IYW5kbGUoCi0gICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICBpZiAoYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRlZF9hY2xfaGRsID09IGhhbmRsZSkgewotICAgICAgYnRhX2F2X3ZlbmRvcl9vZmZsb2FkX3N0b3AoKTsKLSAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0ZWRfYWNsX2hkbCA9IEhDSV9JTlZBTElEX0hBTkRMRTsKLSAgICB9IGVsc2UgaWYgKGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCA9PSBoYW5kbGUpIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IFN0b3AgcGVuZGluZyBvZmZsb2FkIHN0YXJ0IGNvbW1hbmQiLCBfX2Z1bmNfXyk7Ci0gICAgICBidGFfYXZfdmVuZG9yX29mZmxvYWRfc3RvcCgpOwotICAgICAgYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRfcGVuZGluZ19hY2xfaGRsID0gSENJX0lOVkFMSURfSEFORExFOwotICAgIH0KLQotICAgIGJ0YV9hdl9zdHJlYW1fY2hnKHBfc2NiLCBmYWxzZSk7Ci0gICAgcF9zY2ItPmNvX3N0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHBfc2NiLT5wX2Nvcy0+c3RvcChwX3NjYi0+aG5kbCwgcF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICB9Ci0KLSAgLyogaWYgcV9pbmZvLmEyZHBfbGlzdCBpcyBub3QgZW1wdHksIGRyb3AgaXQgbm93ICovCi0gIGlmIChCVEFfQVZfQ0hOTF9BVURJTyA9PSBwX3NjYi0+Y2hubCkgewotICAgIHdoaWxlICghbGlzdF9pc19lbXB0eShwX3NjYi0+YTJkcF9saXN0KSkgewotICAgICAgcF9idWYgPSAoQlRfSERSKilsaXN0X2Zyb250KHBfc2NiLT5hMmRwX2xpc3QpOwotICAgICAgbGlzdF9yZW1vdmUocF9zY2ItPmEyZHBfbGlzdCwgcF9idWYpOwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgIH0KLQotICAgIC8qIGRyb3AgdGhlIGF1ZGlvIGJ1ZmZlcnMgcXVldWVkIGluIEwyQ0FQICovCi0gICAgaWYgKHBfZGF0YSAmJiBwX2RhdGEtPmFwaV9zdG9wLmZsdXNoKQotICAgICAgTDJDQV9GbHVzaENoYW5uZWwocF9zY2ItPmwyY19jaWQsIEwyQ0FQX0ZMVVNIX0NIQU5TX0FMTCk7Ci0gIH0KLQotICBzdXNwZW5kX3JzcC5jaG5sID0gcF9zY2ItPmNobmw7Ci0gIHN1c3BlbmRfcnNwLmhuZGwgPSBwX3NjYi0+aG5kbDsKLQotICBpZiAocF9kYXRhICYmIHBfZGF0YS0+YXBpX3N0b3Auc3VzcGVuZCkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIHN1c3BlbmRpbmc6ICVkLCBzdXA6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXApOwotICAgIGlmICgoc3RhcnQpICYmIChwX3NjYi0+c3VzcGVuZF9zdXApKSB7Ci0gICAgICBzdXNfZXZ0ID0gZmFsc2U7Ci0gICAgICBwX3NjYi0+bDJjX2J1ZnMgPSAwOwotICAgICAgQVZEVF9TdXNwZW5kUmVxKCZwX3NjYi0+YXZkdF9oYW5kbGUsIDEpOwotICAgIH0KLQotICAgIC8qIHNlbmQgU1VTUEVORF9FVlQgZXZlbnQgb25seSBpZiBub3QgaW4gcmVjb25maWd1cmluZyBzdGF0ZSBhbmQgc3VzX2V2dCBpcwotICAgICAqIHRydWUqLwotICAgIGlmICgoc3VzX2V2dCkgJiYgKHBfc2NiLT5zdGF0ZSAhPSBCVEFfQVZfUkNGR19TU1QpKSB7Ci0gICAgICBzdXNwZW5kX3JzcC5zdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICAgIHN1c3BlbmRfcnNwLmluaXRpYXRvciA9IHRydWU7Ci0gICAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgICAgYnRhX2F2X2RhdGEuc3VzcGVuZCA9IHN1c3BlbmRfcnNwOwotICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1NVU1BFTkRfRVZULCAmYnRhX2F2X2RhdGEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdXNwZW5kX3JzcC5zdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICBzdXNwZW5kX3JzcC5pbml0aWF0b3IgPSB0cnVlOwotICAgIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3VzcGVuZF9yc3Auc3RhdHVzKTsKLQotICAgIC8vIFNlbmQgU1RPUF9FVlQgZXZlbnQgb25seSBpZiBub3QgaW4gcmVjb25maWd1cmluZyBzdGF0ZS4KLSAgICAvLyBIb3dldmVyLCB3ZSBzaG91bGQgc2VuZCBTVE9QX0VWVCBpZiB3ZSBhcmUgcmVjb25maWd1cmluZyB3aGVuIHRha2luZwotICAgIC8vIHRoZSBDbG9zZS0+Q29uZmlndXJlLT5PcGVuLT5TdGFydCBwYXRoLgotICAgIGlmIChwX3NjYi0+c3RhdGUgIT0gQlRBX0FWX1JDRkdfU1NUIHx8Ci0gICAgICAgIChwX2RhdGEgJiYgcF9kYXRhLT5hcGlfc3RvcC5yZWNvbmZpZ19zdG9wKSkgewotICAgICAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgICAgIGJ0YV9hdl9kYXRhLnN1c3BlbmQgPSBzdXNwZW5kX3JzcDsKLSAgICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9TVE9QX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yZWNvbmZpZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcHJvY2VzcyB0aGUgcmVjb25maWd1cmUgcmVxdWVzdC4KLSAqICAgICAgICAgICAgICAgICAgc2F2ZSB0aGUgcGFyYW1ldGVyIGluIGNvbnRyb2wgYmxvY2sgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHN1c3BlbmQsIHJlY29uZmlndXJlIG9yIGNsb3NlIHRoZSBzdHJlYW0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfcmVjb25maWcodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBdmR0cFNlcENvbmZpZyogcF9jZmc7Ci0gIHRCVEFfQVZfQVBJX1NUT1Agc3RvcDsKLSAgdEJUQV9BVl9BUElfUkNGRyogcF9yY2ZnID0gJnBfZGF0YS0+YXBpX3JlY29uZmlnOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiByOiVkLCBzOiVkIGlkeDogJWQgKG86JWQpIiwgX19mdW5jX18sIHBfc2NiLT5yZWNmZ19zdXAsCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPnN1c3BlbmRfc3VwLCBwX3NjYi0+cmNmZ19pZHgsIHBfc2NiLT5zZXBfaW5mb19pZHgpOwotCi0gIHBfc2NiLT5udW1fcmVjZmcgPSAwOwotICAvKiBzdG9yZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gY29udHJvbCBibG9jayAqLwotICBwX2NmZyA9ICZwX3NjYi0+Y2ZnOwotCi0gIGFsYXJtX2NhbmNlbChwX3NjYi0+YXZyY19jdF90aW1lcik7Ci0KLSAgTE9HX0RFQlVHKCJwX3NjYi0+c2VwX2luZm9faWR4PSVkIHBfc2NiLT5yY2ZnX2lkeD0lZCBwX3JjZmctPnNlcF9pbmZvX2lkeD0lZCIsCi0gICAgICAgICAgICBwX3NjYi0+c2VwX2luZm9faWR4LCBwX3NjYi0+cmNmZ19pZHgsIHBfcmNmZy0+c2VwX2luZm9faWR4KTsKLSAgTE9HX0RFQlVHKCJQZWVyIGNhcGFibGUgY29kZWM6ICVzIiwKLSAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfc2NiLT5wZWVyX2NhcC5jb2RlY19pbmZvKS5jX3N0cigpKTsKLSAgTE9HX0RFQlVHKCJDdXJyZW50IGNvZGVjOiAlcyIsCi0gICAgICAgICAgICBBMkRQX0NvZGVjSW5mb1N0cmluZyhwX3NjYi0+Y2ZnLmNvZGVjX2luZm8pLmNfc3RyKCkpOwotICBMT0dfREVCVUcoIlJlY29uZmlnIGNvZGVjOiAlcyIsCi0gICAgICAgICAgICBBMkRQX0NvZGVjSW5mb1N0cmluZyhwX3JjZmctPmNvZGVjX2luZm8pLmNfc3RyKCkpOwotCi0gIEJUTV9Mb2dIaXN0b3J5KAotICAgICAga0J0bUxvZ1RhZywgcF9zY2ItPlBlZXJBZGRyZXNzKCksICJDb2RlYyByZWNvbmZpZyIsCi0gICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVzID0+ICVzIiwgQTJEUF9Db2RlY05hbWUocF9zY2ItPmNmZy5jb2RlY19pbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBMkRQX0NvZGVjTmFtZShwX3JjZmctPmNvZGVjX2luZm8pKSk7Ci0KLSAgcF9jZmctPm51bV9wcm90ZWN0ID0gcF9yY2ZnLT5udW1fcHJvdGVjdDsKLSAgbWVtY3B5KHBfY2ZnLT5jb2RlY19pbmZvLCBwX3JjZmctPmNvZGVjX2luZm8sIEFWRFRfQ09ERUNfU0laRSk7Ci0gIG1lbWNweShwX2NmZy0+cHJvdGVjdF9pbmZvLCBwX3JjZmctPnBfcHJvdGVjdF9pbmZvLCBwX3JjZmctPm51bV9wcm90ZWN0KTsKLSAgcF9zY2ItPnJjZmdfaWR4ID0gcF9yY2ZnLT5zZXBfaW5mb19pZHg7Ci0gIHBfY2ZnLT5wc2NfbWFzayA9IHBfc2NiLT5jdXJfcHNjX21hc2s7Ci0KLSAgLy8gSWYgdGhlIHJlcXVlc3RlZCBTRVAgaW5kZXggaXMgc2FtZSBhcyB0aGUgY3VycmVudCBvbmUsIHRoZW4gd2UKLSAgLy8gY2FuIFN1c3BlbmQtPlJlY29uZmlndXJlLT5TdGFydC4KLSAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIENsb3NlLT5Db25maWd1cmUtPk9wZW4tPlN0YXJ0IG9yCi0gIC8vIENsb3NlLT5Db25maWd1cmUtPk9wZW4gZm9yIHN0cmVhbXMgdGhhdCBhcmUgLyBhcmUgbm90IHN0YXJ0ZWQuCi0gIGlmICgocF9zY2ItPnJjZmdfaWR4ID09IHBfc2NiLT5zZXBfaW5mb19pZHgpICYmIHBfcmNmZy0+c3VzcGVuZCAmJgotICAgICAgcF9zY2ItPnJlY2ZnX3N1cCAmJiBwX3NjYi0+c3VzcGVuZF9zdXApIHsKLSAgICBpZiAocF9zY2ItPnN0YXJ0ZWQpIHsKLSAgICAgIC8vIFN1c3BlbmQtPlJlY29uZmlndXJlLT5TdGFydAotICAgICAgc3RvcC5mbHVzaCA9IGZhbHNlOwotICAgICAgc3RvcC5zdXNwZW5kID0gdHJ1ZTsKLSAgICAgIHN0b3AucmVjb25maWdfc3RvcCA9IGZhbHNlOwotICAgICAgYnRhX2F2X3N0cl9zdG9wcGVkKHBfc2NiLCAodEJUQV9BVl9EQVRBKikmc3RvcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJlY29uZmlndXJlCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmVjb25maWciLCBfX2Z1bmNfXyk7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfc2NiLT5jZmcuY29kZWNfaW5mbykuY19zdHIoKSk7Ci0gICAgICBBVkRUX1JlY29uZmlnUmVxKHBfc2NiLT5hdmR0X2hhbmRsZSwgJnBfc2NiLT5jZmcpOwotICAgICAgcF9zY2ItPmNmZy5wc2NfbWFzayA9IHBfc2NiLT5jdXJfcHNjX21hc2s7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIENsb3NlIHRoZSBzdHJlYW0gZmlyc3QsIGFuZCB0aGVuIENvbmZpZ3VyZSBpdAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBDbG9zZS9PcGVuIHN0YXJ0ZWQ6ICVkIHN0YXRlOiAlZCBudW1fcHJvdGVjdDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5zdGFydGVkLCBwX3NjYi0+c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBwX2NmZy0+bnVtX3Byb3RlY3QpOwotICAgIGlmIChwX3NjYi0+c3RhcnRlZCkgewotICAgICAgLy8gQ2xvc2UtPkNvbmZpZ3VyZS0+T3Blbi0+U3RhcnQKLSAgICAgIGlmICgocF9zY2ItPnJjZmdfaWR4ICE9IHBfc2NiLT5zZXBfaW5mb19pZHgpICYmIHBfc2NiLT5yZWNmZ19zdXApIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHRyaWdnZXIgU1RPUF9FVlQgd2hlbiB0YWtpbmcgdGhlIGxvbmdlciByb2FkIHRvCi0gICAgICAgIC8vIHJlY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIHdlIGRvbid0IGNhbGwgU3RhcnQuCi0gICAgICAgIHN0b3AuZmx1c2ggPSBmYWxzZTsKLSAgICAgICAgc3RvcC5zdXNwZW5kID0gZmFsc2U7Ci0gICAgICAgIHN0b3AucmVjb25maWdfc3RvcCA9IHRydWU7Ci0gICAgICAgIGJ0YV9hdl9zdHJfc3RvcHBlZChwX3NjYiwgKHRCVEFfQVZfREFUQSopJnN0b3ApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2F2X3N0cl9zdG9wcGVkKHBfc2NiLCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIHBfc2NiLT5zdGFydGVkID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIENsb3NlLT5Db25maWd1cmUtPk9wZW4KLSAgICAgIGJ0YV9hdl9zdHJfc3RvcHBlZChwX3NjYiwgTlVMTCk7Ci0gICAgfQotICAgIC8vIERyb3AgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEwyQ0FQCi0gICAgTDJDQV9GbHVzaENoYW5uZWwocF9zY2ItPmwyY19jaWQsIEwyQ0FQX0ZMVVNIX0NIQU5TX0FMTCk7Ci0gICAgQVZEVF9DbG9zZVJlcShwX3NjYi0+YXZkdF9oYW5kbGUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfZGF0YV9wYXRoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgc3RyZWFtIGRhdGEgcGF0aC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZGF0YV9wYXRoKHRCVEFfQVZfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IE5VTEw7Ci0gIHVpbnQzMl90IHRpbWVzdGFtcDsKLSAgYm9vbCBuZXdfYnVmID0gZmFsc2U7Ci0gIHVpbnQ4X3QgbV9wdCA9IDB4NjA7Ci0gIHRBVkRUX0RBVEFfT1BUX01BU0sgb3B0OwotCi0gIGlmICghcF9zY2ItPnN0YXJ0ZWQpIHJldHVybjsKLQotICBpZiAocF9zY2ItPmNvbmcpIHJldHVybjsKLQotICBpZiAocF9zY2ItPnVzZV9ydHBfaGVhZGVyX21hcmtlcl9iaXQpIHsKLSAgICBtX3B0IHw9IEFWRFRfTUFSS0VSX1NFVDsKLSAgfQotCi0gIC8vIEFsd2F5cyBnZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGJ1ZnMgcXVlJ2QgdXAKLSAgcF9zY2ItPmwyY19idWZzID0KLSAgICAgICh1aW50OF90KUwyQ0FfRmx1c2hDaGFubmVsKHBfc2NiLT5sMmNfY2lkLCBMMkNBUF9GTFVTSF9DSEFOU19HRVQpOwotCi0gIGlmICghbGlzdF9pc19lbXB0eShwX3NjYi0+YTJkcF9saXN0KSkgewotICAgIHBfYnVmID0gKEJUX0hEUiopbGlzdF9mcm9udChwX3NjYi0+YTJkcF9saXN0KTsKLSAgICBsaXN0X3JlbW92ZShwX3NjYi0+YTJkcF9saXN0LCBwX2J1Zik7Ci0gICAgLyogdXNlIHFfaW5mby5hMmRwIGRhdGEsIHJlYWQgdGhlIHRpbWVzdGFtcCAqLwotICAgIHRpbWVzdGFtcCA9ICoodWludDMyX3QqKShwX2J1ZiArIDEpOwotICB9IGVsc2UgewotICAgIG5ld19idWYgPSB0cnVlOwotICAgIC8qIEEyRFBfbGlzdCBlbXB0eSwgY2FsbCBjb19kYXRhLCBkdXAgZGF0YSB0byBvdGhlciBjaGFubmVscyAqLwotICAgIHBfYnVmID0gcF9zY2ItPnBfY29zLT5kYXRhKHBfc2NiLT5jZmcuY29kZWNfaW5mbywgJnRpbWVzdGFtcCk7Ci0KLSAgICBpZiAocF9idWYpIHsKLSAgICAgIC8qIHVzZSB0aGUgb2Zmc2V0IGFyZWEgZm9yIHRoZSB0aW1lIHN0YW1wICovCi0gICAgICAqKHVpbnQzMl90KikocF9idWYgKyAxKSA9IHRpbWVzdGFtcDsKLQotICAgICAgLyogZHVwIHRoZSBkYXRhIHRvIG90aGVyIGNoYW5uZWxzICovCi0gICAgICBidGFfYXZfZHVwX2F1ZGlvX2J1ZihwX3NjYiwgcF9idWYpOwotICAgIH0KLSAgfQotCi0gIGlmIChwX2J1ZikgewotICAgIGlmIChwX3NjYi0+bDJjX2J1ZnMgPCAoQlRBX0FWX1FVRVVFX0RBVEFfQ0hLX05VTSkpIHsKLSAgICAgIC8qIFRoZXJlJ3MgYSBidWZmZXIsIGp1c3QgcXVldWUgaXQgdG8gTDJDQVAuCi0gICAgICAgKiBUaGVyZSdzIG5vIG5lZWQgdG8gaW5jcmVtZW50IGl0IGhlcmUsIGl0IGlzIGFsd2F5cyByZWFkIGZyb20KLSAgICAgICAqIEwyQ0FQIChzZWUgYWJvdmUpLgotICAgICAgICovCi0KLSAgICAgIC8qIG9wdCBpcyBhIGJpdCBtYXNrLCBpdCBjb3VsZCBoYXZlIHNldmVyYWwgb3B0aW9ucyBzZXQgKi8KLSAgICAgIG9wdCA9IEFWRFRfREFUQV9PUFRfTk9ORTsKLSAgICAgIGlmIChwX3NjYi0+bm9fcnRwX2hlYWRlcikgewotICAgICAgICBvcHQgfD0gQVZEVF9EQVRBX09QVF9OT19SVFA7Ci0gICAgICB9Ci0KLSAgICAgIC8vCi0gICAgICAvLyBGcmFnbWVudCB0aGUgcGF5bG9hZCBpZiBsYXJnZXIgdGhhbiB0aGUgTVRVLgotICAgICAgLy8gTk9URTogVGhlIGZyYWdtZW50YXRpb24gaXMgUlRQLWNvbXBhdGliaWUuCi0gICAgICAvLwotICAgICAgc2l6ZV90IGV4dHJhX2ZyYWdtZW50c19uID0gMDsKLSAgICAgIGlmIChwX2J1Zi0+bGVuID4gMCkgewotICAgICAgICBleHRyYV9mcmFnbWVudHNfbiA9IChwX2J1Zi0+bGVuIC8gcF9zY2ItPnN0cmVhbV9tdHUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBfYnVmLT5sZW4gJSBwX3NjYi0+c3RyZWFtX210dSkgPyAxIDogMCkgLSAxOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8QlRfSERSKj4gZXh0cmFfZnJhZ21lbnRzOwotICAgICAgZXh0cmFfZnJhZ21lbnRzLnJlc2VydmUoZXh0cmFfZnJhZ21lbnRzX24pOwotCi0gICAgICB1aW50OF90KiBkYXRhX2JlZ2luID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLSAgICAgIHVpbnQ4X3QqIGRhdGFfZW5kID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCArIHBfYnVmLT5sZW47Ci0gICAgICB3aGlsZSAoZXh0cmFfZnJhZ21lbnRzX24tLSA+IDApIHsKLSAgICAgICAgZGF0YV9iZWdpbiArPSBwX3NjYi0+c3RyZWFtX210dTsKLSAgICAgICAgc2l6ZV90IGZyYWdtZW50X2xlbiA9IGRhdGFfZW5kIC0gZGF0YV9iZWdpbjsKLSAgICAgICAgaWYgKGZyYWdtZW50X2xlbiA+IHBfc2NiLT5zdHJlYW1fbXR1KSBmcmFnbWVudF9sZW4gPSBwX3NjYi0+c3RyZWFtX210dTsKLQotICAgICAgICBCVF9IRFIqIHBfYnVmMiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0gICAgICAgIHBfYnVmMi0+b2Zmc2V0ID0gcF9idWYtPm9mZnNldDsKLSAgICAgICAgcF9idWYyLT5sZW4gPSAwOwotICAgICAgICBwX2J1ZjItPmxheWVyX3NwZWNpZmljID0gMDsKLSAgICAgICAgdWludDhfdCogcGFja2V0MiA9Ci0gICAgICAgICAgICAodWludDhfdCopKHBfYnVmMiArIDEpICsgcF9idWYyLT5vZmZzZXQgKyBwX2J1ZjItPmxlbjsKLSAgICAgICAgbWVtY3B5KHBhY2tldDIsIGRhdGFfYmVnaW4sIGZyYWdtZW50X2xlbik7Ci0gICAgICAgIHBfYnVmMi0+bGVuICs9IGZyYWdtZW50X2xlbjsKLSAgICAgICAgZXh0cmFfZnJhZ21lbnRzLnB1c2hfYmFjayhwX2J1ZjIpOwotICAgICAgICBwX2J1Zi0+bGVuIC09IGZyYWdtZW50X2xlbjsKLSAgICAgIH0KLQotICAgICAgaWYgKCFleHRyYV9mcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICAvLyBSZXNldCB0aGUgUlRQIE1hcmtlciBiaXQgZm9yIGFsbCBmcmFnbWVudHMgZXhjZXB0IHRoZSBsYXN0IG9uZQotICAgICAgICBtX3B0ICY9IH5BVkRUX01BUktFUl9TRVQ7Ci0gICAgICB9Ci0gICAgICBBVkRUX1dyaXRlUmVxT3B0KHBfc2NiLT5hdmR0X2hhbmRsZSwgcF9idWYsIHRpbWVzdGFtcCwgbV9wdCwgb3B0KTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFfZnJhZ21lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpICsgMSA9PSBleHRyYV9mcmFnbWVudHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgLy8gU2V0IHRoZSBSVFAgTWFya2VyIGJpdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLSAgICAgICAgICBtX3B0IHw9IEFWRFRfTUFSS0VSX1NFVDsKLSAgICAgICAgfQotICAgICAgICBCVF9IRFIqIHBfYnVmMiA9IGV4dHJhX2ZyYWdtZW50c1tpXTsKLSAgICAgICAgQVZEVF9Xcml0ZVJlcU9wdChwX3NjYi0+YXZkdF9oYW5kbGUsIHBfYnVmMiwgdGltZXN0YW1wLCBtX3B0LCBvcHQpOwotICAgICAgfQotICAgICAgcF9zY2ItPmNvbmcgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiB0aGVyZSdzIGEgYnVmZmVyLCBidXQgTDJDQVAgZG9lcyBub3Qgc2VlbSB0byBiZSBtb3ZpbmcgZGF0YSAqLwotICAgICAgaWYgKG5ld19idWYpIHsKLSAgICAgICAgLyoganVzdCBnb3QgdGhpcyBidWZmZXIgZnJvbSBjb19kYXRhLAotICAgICAgICAgKiBwdXQgaXQgaW4gcXVldWUgKi8KLSAgICAgICAgbGlzdF9hcHBlbmQocF9zY2ItPmEyZHBfbGlzdCwgcF9idWYpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyoganVzdCBkZXF1ZXVlIGl0IGZyb20gdGhlIGEyZHBfbGlzdCAqLwotICAgICAgICBpZiAobGlzdF9sZW5ndGgocF9zY2ItPmEyZHBfbGlzdCkgPCAzKSB7Ci0gICAgICAgICAgLyogcHV0IGl0IGJhY2sgdG8gdGhlIHF1ZXVlICovCi0gICAgICAgICAgbGlzdF9wcmVwZW5kKHBfc2NiLT5hMmRwX2xpc3QsIHBfYnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiB0b28gbWFueSBidWZmZXJzIGluIGEyZHBfbGlzdCwgZHJvcCBpdC4gKi8KLSAgICAgICAgICBidGFfYXZfY29fYXVkaW9fZHJvcChwX3NjYi0+aG5kbCwgcF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N0YXJ0X29rCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdHJlYW0gc3RhcnRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc3RhcnRfb2sodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBib29sIGluaXRpYXRvciA9IGZhbHNlOwotICBib29sIHN1c3BlbmQgPSBmYWxzZTsKLSAgdWludDhfdCBuZXdfcm9sZSA9IHBfc2NiLT5yb2xlOwotICBCVF9IRFJfUklHSUQgaGRyOwotICB0SENJX1JPTEUgY3VyX3JvbGU7Ci0gIHVpbnQ4X3QgbG9jYWxfdHNlcCA9IHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS50c2VwOwotCi0gIExPR19JTkZPKCIlczogcGVlciAlcyBidGFfaGFuZGxlOjB4JXggd2FpdDoweCV4IHJvbGU6MHgleCBsb2NhbF90c2VwOiVkIiwKLSAgICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmhuZGwsCi0gICAgICAgICAgIHBfc2NiLT53YWl0LCBwX3NjYi0+cm9sZSwgbG9jYWxfdHNlcCk7Ci0KLSAgcF9zY2ItPnN0YXJ0ZWQgPSB0cnVlOwotCi0gIGlmIChsb2NhbF90c2VwID09IEFWRFRfVFNFUF9TUkMpIHsKLSAgICAvLyBUaGUgUlRQIEhlYWRlciBtYXJrZXIgYml0IGZvciB0aGUgQTJEUCBTb3VyY2UgZW5jb2RlcgotICAgIEEyZHBDb2RlY0NvbmZpZyogY29kZWNfY29uZmlnID0KLSAgICAgICAgYnRhX2F2X2dldF9hMmRwX3BlZXJfY3VycmVudF9jb2RlYyhwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgQ0hFQ0soY29kZWNfY29uZmlnICE9IG51bGxwdHIpOwotICAgIHBfc2NiLT51c2VfcnRwX2hlYWRlcl9tYXJrZXJfYml0ID0gY29kZWNfY29uZmlnLT51c2VSdHBIZWFkZXJNYXJrZXJCaXQoKTsKLSAgfQotCi0gIGlmIChwX3NjYi0+c2NvX3N1c3BlbmQpIHsKLSAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPSBmYWxzZTsKLSAgfQotCi0gIGlmIChuZXdfcm9sZSAmIEJUQV9BVl9ST0xFX1NUQVJUX0lOVCkgaW5pdGlhdG9yID0gdHJ1ZTsKLQotICAvKiBmb3IgQTJEUCBTSU5LIHdlIGRvIG5vdCBzZW5kIGdldF9jYXBzICovCi0gIGlmICgocF9zY2ItPmF2ZHRfaGFuZGxlID09IHBfc2NiLT5zZXBzW3Bfc2NiLT5zZXBfaWR4XS5hdl9oYW5kbGUpICYmCi0gICAgICAobG9jYWxfdHNlcCA9PSBBVkRUX1RTRVBfU05LKSkgewotICAgIHBfc2NiLT53YWl0ICY9IH4oQlRBX0FWX1dBSVRfQUNQX0NBUFNfT04pOwotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsb2NhbCBTRVAgdHlwZSBpcyBTTksgbmV3IHdhaXQgaXMgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPndhaXQpOwotICB9Ci0gIGlmIChwX3NjYi0+d2FpdCAmIEJUQV9BVl9XQUlUX1JPTEVfU1dfRkFJTEVEKSB7Ci0gICAgLyogcm9sZSBzd2l0Y2ggaGFzIGZhaWxlZCAqLwotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogcGVlciAlcyByb2xlIHN3aXRjaCBmYWlsZWQ6IGJ0YV9oYW5kbGU6MHgleCB3YWl0OjB4JXgsIHJvbGU6MHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLAotICAgICAgICBwX3NjYi0+d2FpdCwgcF9zY2ItPnJvbGUpOwotICAgIHBfc2NiLT53YWl0ICY9IH5CVEFfQVZfV0FJVF9ST0xFX1NXX0ZBSUxFRDsKLSAgICBwX2RhdGEgPSAodEJUQV9BVl9EQVRBKikmaGRyOwotICAgIGhkci5vZmZzZXQgPSBCVEFfQVZfUlNfRkFJTDsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyB3YWl0OjB4JXggdXNlX3J0cF9oZWFkZXJfbWFya2VyX2JpdDolcyIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+d2FpdCwKLSAgICAgICAgICAgICAgICAgICAocF9zY2ItPnVzZV9ydHBfaGVhZGVyX21hcmtlcl9iaXQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLSAgaWYgKHBfZGF0YSAmJiAocF9kYXRhLT5oZHIub2Zmc2V0ICE9IEJUQV9BVl9SU19OT05FKSkgewotICAgIHBfc2NiLT53YWl0ICY9IH5CVEFfQVZfV0FJVF9ST0xFX1NXX0JJVFM7Ci0gICAgaWYgKHBfZGF0YS0+aGRyLm9mZnNldCA9PSBCVEFfQVZfUlNfRkFJTCkgewotICAgICAgYnRhX3N5c19pZGxlKEJUQV9JRF9BViwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgICB0QlRBX0FWX1NUQVJUIHN0YXJ0OwotICAgICAgc3RhcnQuY2hubCA9IHBfc2NiLT5jaG5sOwotICAgICAgc3RhcnQuc3RhdHVzID0gQlRBX0FWX0ZBSUxfUk9MRTsKLSAgICAgIHN0YXJ0LmhuZGwgPSBwX3NjYi0+aG5kbDsKLSAgICAgIHN0YXJ0LmluaXRpYXRvciA9IGluaXRpYXRvcjsKLSAgICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgICBidGFfYXZfZGF0YS5zdGFydCA9IHN0YXJ0OwotICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1NUQVJUX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWJ0YV9hdl9saW5rX3JvbGVfb2socF9zY2IsIEEyRFBfU0VUX09ORV9CSVQpKQotICAgIHBfc2NiLT5xX3RhZyA9IEJUQV9BVl9RX1RBR19TVEFSVDsKLSAgZWxzZSB7Ci0gICAgLyogVGhlIHdhaXQgZmxhZyBtYXkgYmUgc2V0IGhlcmUgd2hpbGUgd2UgYXJlIGFscmVhZHkgY2VudHJhbCBvbiB0aGUgbGluayAqLwotICAgIC8qIHRoaXMgY291bGQgaGFwcGVuIGlmIGEgcm9sZSBzd2l0Y2ggY29tcGxldGUgZXZlbnQgb2NjdXJyZWQgZHVyaW5nCi0gICAgICogcmVjb25maWcgKi8KLSAgICAvKiBpZiB3ZSBhcmUgbm93IGNlbnRyYWwgb24gdGhlIGxpbmssIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvbGUKLSAgICAgKiBzd2l0Y2gsICovCi0gICAgLyogY29tcGxldGUgYW55bW9yZSBzbyB3ZSBjYW4gY2xlYXIgdGhlIHdhaXQgZm9yIHJvbGUgc3dpdGNoIGZsYWcgKi8KLSAgICBwX3NjYi0+d2FpdCAmPSB+QlRBX0FWX1dBSVRfUk9MRV9TV19CSVRTOwotICB9Ci0KLSAgaWYgKHBfc2NiLT53YWl0ICYKLSAgICAgIChCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19PUEVOIHwgQlRBX0FWX1dBSVRfUk9MRV9TV19SRVNfU1RBUlQpKSB7Ci0gICAgcF9zY2ItPndhaXQgfD0gQlRBX0FWX1dBSVRfUk9MRV9TV19TVEFSVEVEOwotICAgIHBfc2NiLT5xX3RhZyA9IEJUQV9BVl9RX1RBR19TVEFSVDsKLSAgfQotCi0gIGlmIChwX3NjYi0+d2FpdCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwZWVyICVzIHdhaXQ6MHgleCBxX3RhZzolZCBub3Qgc3RhcnRlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+d2FpdCwKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5xX3RhZyk7Ci0gICAgLyogQ2xlYXIgZmlyc3QgYml0IG9mIHBfc2NiLT53YWl0IGFuZCBub3QgdG8gcmV0dXJuIGZyb20gdGhpcyBwb2ludCBlbHNlCi0gICAgICogSEFMIGxheWVyIGdldHMgYmxvY2tlZC4gQW5kIGlmIHRoZXJlIGlzIGRlbGF5IGluIEdldCBDYXBhYmlsaXR5IHJlc3BvbnNlCi0gICAgICogYXMKLSAgICAgKiBmaXJzdCBiaXQgb2YgcF9zY2ItPndhaXQgaXMgY2xlYXJlZCBoZW5jZSBpdCBlbnN1cmVzIGJ0X2F2X3N0YXJ0X29rIGlzCi0gICAgICogbm90IGNhbGxlZAotICAgICAqIGFnYWluIGZyb20gYnRhX2F2X3NhdmVfY2Fwcy4KLSAgICAgKi8KLSAgICBwX3NjYi0+d2FpdCAmPSB+QlRBX0FWX1dBSVRfQUNQX0NBUFNfT047Ci0gIH0KLQotICAvKiB0ZWxsIHJvbGUgbWFuYWdlciB0byBjaGVjayBNL1Mgcm9sZSAqLwotICBidGFfc3lzX2Nvbm5fb3BlbihCVEFfSURfQVYsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLQotICBidGFfc3lzX2J1c3koQlRBX0lEX0FWLCBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQsIHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLQotICBpZiAocF9zY2ItPm1lZGlhX3R5cGUgPT0gQVZEVF9NRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgLyogaW4gbm9ybWFsIGxvZ2ljLCBjb25ucyBzaG91bGQgYmUgYnRhX2F2X2NiLmF1ZGlvX2NvdW50IC0gMSwKLSAgICAgKiBIb3dldmVyLCBidGFfYXZfc3RyZWFtX2NoZyBpcyBub3QgY2FsbGVkIHRvIGluY3JlYXNlCi0gICAgICogYnRhX2F2X2NiLmF1ZGlvX2NvdW50IHlldC4KLSAgICAgKiBJZiB0aGUgY29kZSB3ZXJlIHRvIGJlIHJlLWFycmFuZ2VkIGZvciBzb21lIHJlYXNvbnMsIHRoaXMgbnVtYmVyIG1heSBuZWVkCi0gICAgICogdG8gYmUgY2hhbmdlZAotICAgICAqLwotICAgIHBfc2NiLT5jb19zdGFydGVkID0gYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250OwotICB9Ci0KLSAgLyogY2xlYXIgdGhlIGNvbmdlc3Rpb24gZmxhZyAqLwotICBwX3NjYi0+Y29uZyA9IGZhbHNlOwotCi0gIGlmIChuZXdfcm9sZSAmIEJUQV9BVl9ST0xFX1NUQVJUX0lOVCkgewotICAgIG5ld19yb2xlICY9IH5CVEFfQVZfUk9MRV9TVEFSVF9JTlQ7Ci0gIH0gZWxzZSBpZiAoKG5ld19yb2xlICYgQlRBX0FWX1JPTEVfQURfQUNQKSAmJgotICAgICAgICAgICAgIChuZXdfcm9sZSAmIEJUQV9BVl9ST0xFX1NVU1BFTkRfT1BUKSkgewotICAgIHN1c3BlbmQgPSB0cnVlOwotICB9Ci0KLSAgaWYgKCFzdXNwZW5kKSB7Ci0gICAgcF9zY2ItPnFfdGFnID0gQlRBX0FWX1FfVEFHX1NUUkVBTTsKLSAgICBidGFfYXZfc3RyZWFtX2NoZyhwX3NjYiwgdHJ1ZSk7Ci0gIH0KLQotICB7Ci0gICAgLyogSWYgc2luayBzdGFydHMgc3RyZWFtLCBkaXNhYmxlIHNuaWZmIG1vZGUgaGVyZSAqLwotICAgIGlmICghaW5pdGlhdG9yKSB7Ci0gICAgICAvKiBJZiBzb3VjZSBpcyB0aGUgY2VudHJhbCByb2xlLCBkaXNhYmxlIHJvbGUgc3dpdGNoIGR1cmluZyBzdHJlYW1pbmcuCi0gICAgICAgKiBPdGhlcndpc2UgYWxsb3cgcm9sZSBzd2l0Y2gsIGlmIHNvdXJjZSBpcyBwZXJpcGhlcmFsLgotICAgICAgICogQmVjYXVzZSBpdCB3b3VsZCBub3QgaHVydCBzb3VyY2UsIGlmIHRoZSBwZWVyIGRldmljZSB3YW50cyBzb3VyY2UgdG8gYmUKLSAgICAgICAqIGNlbnRyYWwuCi0gICAgICAgKiBkaXNhYmxlIHNuaWZmIG1vZGUgdW5jb25kaXRpb25hbGx5IGR1cmluZyBzdHJlYW1pbmcgKi8KLSAgICAgIGlmICgoQlRNX0dldFJvbGUocF9zY2ItPlBlZXJBZGRyZXNzKCksICZjdXJfcm9sZSkgPT0gQlRNX1NVQ0NFU1MpICYmCi0gICAgICAgICAgKGN1cl9yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpKSB7Ci0gICAgICAgIEJUTV9ibG9ja19yb2xlX3N3aXRjaF9hbmRfc25pZmZfbW9kZV9mb3IocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yKHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwX3NjYi0+cm9sZSA9IG5ld19yb2xlOwotICAgIHBfc2NiLT5yb2xlICY9IH5CVEFfQVZfUk9MRV9BRF9BQ1A7Ci0gICAgcF9zY2ItPnJvbGUgJj0gfkJUQV9BVl9ST0xFX1NVU1BFTkRfT1BUOwotCi0gICAgcF9zY2ItPm5vX3J0cF9oZWFkZXIgPSBmYWxzZTsKLSAgICBwX3NjYi0+cF9jb3MtPnN0YXJ0KHBfc2NiLT5obmRsLCBwX3NjYi0+UGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5jZmcuY29kZWNfaW5mbywgJnBfc2NiLT5ub19ydHBfaGVhZGVyKTsKLSAgICBwX3NjYi0+Y29fc3RhcnRlZCA9IHRydWU7Ci0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyBzdXNwZW5kaW5nOiAlZCwgcm9sZToweCV4LCBpbml0ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHN1c3BlbmQsCi0gICAgICAgICAgICAgICAgICAgICBwX3NjYi0+cm9sZSwgaW5pdGlhdG9yKTsKLQotICAgIHRCVEFfQVZfU1RBUlQgc3RhcnQ7Ci0gICAgc3RhcnQuc3VzcGVuZGluZyA9IHN1c3BlbmQ7Ci0gICAgc3RhcnQuaW5pdGlhdG9yID0gaW5pdGlhdG9yOwotICAgIHN0YXJ0LmNobmwgPSBwX3NjYi0+Y2hubDsKLSAgICBzdGFydC5zdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICBzdGFydC5obmRsID0gcF9zY2ItPmhuZGw7Ci0gICAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgICBidGFfYXZfZGF0YS5zdGFydCA9IHN0YXJ0OwotICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9TVEFSVF9FVlQsICZidGFfYXZfZGF0YSk7Ci0KLSAgICBpZiAoc3VzcGVuZCkgewotICAgICAgdEJUQV9BVl9BUElfU1RPUCBzdG9wOwotICAgICAgcF9zY2ItPnJvbGUgfD0gQlRBX0FWX1JPTEVfU1VTUEVORDsKLSAgICAgIHBfc2NiLT5jb25nID0gdHJ1ZTsgLyogZG8gbm90IGFsbG93IHRoZSBtZWRpYSBkYXRhIHRvIGdvIHRocm91Z2ggKi8KLSAgICAgIC8qIGRvIG5vdCBkdXBsaWNhdGUgdGhlIG1lZGlhIHBhY2tldHMgdG8gdGhpcyBjaGFubmVsICovCi0gICAgICBwX3NjYi0+cF9jb3MtPnN0b3AocF9zY2ItPmhuZGwsIHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLSAgICAgIHBfc2NiLT5jb19zdGFydGVkID0gZmFsc2U7Ci0gICAgICBzdG9wLmZsdXNoID0gZmFsc2U7Ci0gICAgICBzdG9wLnN1c3BlbmQgPSB0cnVlOwotICAgICAgc3RvcC5yZWNvbmZpZ19zdG9wID0gZmFsc2U7Ci0gICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9BUF9TVE9QX0VWVCwgKHRCVEFfQVZfREFUQSopJnN0b3ApOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N0YXJ0X2ZhaWxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RyZWFtIHN0YXJ0IGZhaWxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc3RhcnRfZmFpbGVkKHRCVEFfQVZfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICIlczogcGVlciAlcyBidGFfaGFuZGxlOjB4JXggYXVkaW9fb3Blbl9jbnQ6JWQgc3RhcnRlZDolcyBjb19zdGFydGVkOiVkIiwKLSAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLAotICAgICAgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBsb2dib29sKHBfc2NiLT5zdGFydGVkKS5jX3N0cigpLAotICAgICAgcF9zY2ItPmNvX3N0YXJ0ZWQpOwotCi0gIGlmICghcF9zY2ItPnN0YXJ0ZWQgJiYgIXBfc2NiLT5jb19zdGFydGVkKSB7Ci0gICAgYnRhX3N5c19pZGxlKEJUQV9JRF9BViwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgbm90aWZ5X3N0YXJ0X2ZhaWxlZChwX3NjYik7Ci0gIH0KLQotICBCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9hbmRfc25pZmZfbW9kZV9mb3IocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICBwX3NjYi0+c2NvX3N1c3BlbmQgPSBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zdHJfY2xvc2VkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdHJlYW0gY2xvc2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zdHJfY2xvc2VkKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BViBkYXRhOwotICB0QlRBX0FWX0VWVCBldmVudDsKLQotICBBUFBMX1RSQUNFX1dBUk5JTkcoCi0gICAgICAiJXM6IHBlZXIgJXMgYnRhX2hhbmRsZToweCV4IG9wZW5fc3RhdHVzOiVkIGNobmw6JWQgY29fc3RhcnRlZDolZCIsCi0gICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+aG5kbCwKLSAgICAgIHBfc2NiLT5vcGVuX3N0YXR1cywgcF9zY2ItPmNobmwsIHBfc2NiLT5jb19zdGFydGVkKTsKLQotICBCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9hbmRfc25pZmZfbW9kZV9mb3IocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICBpZiAoYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250IDw9IDEpIHsKLSAgICBCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoKCk7Ci0gIH0KLQotICBpZiAocF9zY2ItPm9wZW5fc3RhdHVzICE9IEJUQV9BVl9TVUNDRVNTKSB7Ci0gICAgLyogbXVzdCBiZSBmYWlsdXJlIHdoZW4gb3BlbmluZyB0aGUgc3RyZWFtICovCi0gICAgZGF0YS5vcGVuLmJkX2FkZHIgPSBwX3NjYi0+UGVlckFkZHJlc3MoKTsKLSAgICBkYXRhLm9wZW4uc3RhdHVzID0gcF9zY2ItPm9wZW5fc3RhdHVzOwotICAgIGRhdGEub3Blbi5jaG5sID0gcF9zY2ItPmNobmw7Ci0gICAgZGF0YS5vcGVuLmhuZGwgPSBwX3NjYi0+aG5kbDsKLQotICAgIGlmIChwX3NjYi0+c2Vwc1twX3NjYi0+c2VwX2lkeF0udHNlcCA9PSBBVkRUX1RTRVBfU1JDKQotICAgICAgZGF0YS5vcGVuLnNlcCA9IEFWRFRfVFNFUF9TTks7Ci0gICAgZWxzZSBpZiAocF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLnRzZXAgPT0gQVZEVF9UU0VQX1NOSykKLSAgICAgIGRhdGEub3Blbi5zZXAgPSBBVkRUX1RTRVBfU1JDOwotCi0gICAgZXZlbnQgPSBCVEFfQVZfT1BFTl9FVlQ7Ci0gICAgcF9zY2ItPm9wZW5fc3RhdHVzID0gQlRBX0FWX1NVQ0NFU1M7Ci0KLSAgICBidGFfc3lzX2Nvbm5fY2xvc2UoQlRBX0lEX0FWLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgYnRhX2F2X2NsZWFudXAocF9zY2IsIHBfZGF0YSk7Ci0gICAgKCpidGFfYXZfY2IucF9jYmFjaykoZXZlbnQsICZkYXRhKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBkbyBzdG9wIGlmIHdlIHdlcmUgc3RhcnRlZCAqLwotICAgIGlmIChwX3NjYi0+Y29fc3RhcnRlZCkgewotICAgICAgYnRhX2F2X3N0cl9zdG9wcGVkKHBfc2NiLCBOVUxMKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBwX3NjYi0+cF9jb3MtPmNsb3NlKHBfc2NiLT5obmRsLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgICBkYXRhLmNsb3NlLmNobmwgPSBwX3NjYi0+Y2hubDsKLSAgICAgIGRhdGEuY2xvc2UuaG5kbCA9IHBfc2NiLT5obmRsOwotICAgICAgZXZlbnQgPSBCVEFfQVZfQ0xPU0VfRVZUOwotCi0gICAgICBidGFfc3lzX2Nvbm5fY2xvc2UoQlRBX0lEX0FWLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgICBidGFfYXZfY2xlYW51cChwX3NjYiwgcF9kYXRhKTsKLSAgICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKGV2ZW50LCAmZGF0YSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY2xyX2NvbmcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsZWFyIHN0cmVhbSBjb25nZXN0aW9uIGZsYWcuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2Nscl9jb25nKHRCVEFfQVZfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX3NjYi0+Y29fc3RhcnRlZCkgewotICAgIHBfc2NiLT5jb25nID0gZmFsc2U7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zdXNwZW5kX2NmbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcHJvY2VzcyB0aGUgc3VzcGVuZCByZXNwb25zZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zdXNwZW5kX2NmbSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfU1VTUEVORCBzdXNwZW5kX3JzcDsKLSAgdWludDhfdCBlcnJfY29kZSA9IHBfZGF0YS0+c3RyX21zZy5tc2cuaGRyLmVycl9jb2RlOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9oYW5kbGU6MHgleCBhdWRpb19vcGVuX2NudDolZCBlcnJfY29kZTolZCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+aG5kbCwgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LCBlcnJfY29kZSk7Ci0KLSAgaWYgKCFwX3NjYi0+c3RhcnRlZCkgewotICAgIC8qIGhhbmRsZSB0aGUgY29uZGl0aW9uIHdoZXJlIHRoZXJlIGlzIGEgY29sbGlzaW9uIG9mIFNVU1BFTkQgcmVxIGZyb20KLSAgICAgKmVpdGhlciBzaWRlCi0gICAgICoqIFNlY29uZCBTVVNQRU5EIHJlcSBjb3VsZCBiZSByZWplY3RlZC4gRG8gbm90IHRyZWF0IHRoaXMgYXMgYSBmYWlsdXJlCi0gICAgICovCi0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogYWxyZWFkeSBzdXNwZW5kZWQsIGlnbm9yZSwgZXJyX2NvZGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN1c3BlbmRfcnNwLnN0YXR1cyA9IEJUQV9BVl9TVUNDRVNTOwotICBpZiAoZXJyX2NvZGUgJiYgKGVycl9jb2RlICE9IEFWRFRfRVJSX0JBRF9TVEFURSkpIHsKLSAgICBzdXNwZW5kX3JzcC5zdGF0dXMgPSBCVEFfQVZfRkFJTDsKLQotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBzdXNwZW5kIGZhaWxlZCwgY2xvc2luZyBjb25uZWN0aW9uIiwgX19mdW5jX18pOwotCi0gICAgLyogU1VTUEVORCBmYWlsZWQuIENsb3NlIGNvbm5lY3Rpb24uICovCi0gICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQVBJX0NMT1NFX0VWVCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogb25seSBzZXQgc3RhcnRlZCB0byBmYWxzZSB3aGVuIHN1c3BlbmQgaXMgc3VjY2Vzc2Z1bCAqLwotICAgIHBfc2NiLT5zdGFydGVkID0gZmFsc2U7Ci0gIH0KLQotICBpZiAocF9zY2ItPnJvbGUgJiBCVEFfQVZfUk9MRV9TVVNQRU5EKSB7Ci0gICAgcF9zY2ItPnJvbGUgJj0gfkJUQV9BVl9ST0xFX1NVU1BFTkQ7Ci0gICAgcF9zY2ItPmNvbmcgPSBmYWxzZTsKLSAgfQotCi0gIGJ0YV9zeXNfaWRsZShCVEFfSURfQVYsIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCwgcF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICBCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9hbmRfc25pZmZfbW9kZV9mb3IocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotCi0gIC8qIGluIGNhc2UgdGhhdCB3ZSByZWNlaXZlZCBzdXNwZW5kX2luZCwgd2UgbWF5IG5lZWQgdG8gY2FsbCBjb19zdG9wIGhlcmUgKi8KLSAgaWYgKHBfc2NiLT5jb19zdGFydGVkKSB7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkubGlmZWN5Y2xlLkJUTV9HZXRIQ0lDb25uSGFuZGxlKAotICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKSwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgaWYgKGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0ZWRfYWNsX2hkbCA9PSBoYW5kbGUpIHsKLSAgICAgIGJ0YV9hdl92ZW5kb3Jfb2ZmbG9hZF9zdG9wKCk7Ci0gICAgICBidGFfYXZfY2Iub2ZmbG9hZF9zdGFydGVkX2FjbF9oZGwgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfSBlbHNlIGlmIChidGFfYXZfY2Iub2ZmbG9hZF9zdGFydF9wZW5kaW5nX2FjbF9oZGwgPT0gaGFuZGxlKSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBTdG9wIHBlbmRpbmcgb2ZmbG9hZCBzdGFydCBjb21tYW5kIiwgX19mdW5jX18pOwotICAgICAgYnRhX2F2X3ZlbmRvcl9vZmZsb2FkX3N0b3AoKTsKLSAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCA9IEhDSV9JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgYnRhX2F2X3N0cmVhbV9jaGcocF9zY2IsIGZhbHNlKTsKLQotICAgIHsKLSAgICAgIHBfc2NiLT5jb19zdGFydGVkID0gZmFsc2U7Ci0gICAgICBwX3NjYi0+cF9jb3MtPnN0b3AocF9zY2ItPmhuZGwsIHBfc2NiLT5QZWVyQWRkcmVzcygpKTsKLSAgICB9Ci0gIH0KLQotICB7Ci0gICAgc3VzcGVuZF9yc3AuY2hubCA9IHBfc2NiLT5jaG5sOwotICAgIHN1c3BlbmRfcnNwLmhuZGwgPSBwX3NjYi0+aG5kbDsKLSAgICBzdXNwZW5kX3JzcC5pbml0aWF0b3IgPSBwX2RhdGEtPnN0cl9tc2cuaW5pdGlhdG9yOwotICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgYnRhX2F2X2RhdGEuc3VzcGVuZCA9IHN1c3BlbmRfcnNwOwotICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9TVVNQRU5EX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjZmdfc3RyX29rCi0gKgotICogRGVzY3JpcHRpb24gICAgICByZXBvcnQgcmVjb25maWd1cmUgc3VjY2Vzc2Z1bAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY2ZnX3N0cl9vayh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHBfc2NiLT5sMmNfY2lkID0gQVZEVF9HZXRMMkNhcENoYW5uZWwocF9zY2ItPmF2ZHRfaGFuZGxlKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYnRhX2hhbmRsZToweCV4IGwyY19jaWQ6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5sMmNfY2lkKTsKLQotICBpZiAocF9kYXRhICE9IE5VTEwpIHsKLSAgICAvLyBwX2RhdGEgY291bGQgYmUgTlVMTCBpZiB0aGUgcmVjb25maWcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbG9jYWwgZGV2aWNlCi0gICAgcF9zY2ItPnN0cmVhbV9tdHUgPQotICAgICAgICBwX2RhdGEtPnN0cl9tc2cubXNnLm9wZW5faW5kLnBlZXJfbXR1IC0gQVZEVF9NRURJQV9IRFJfU0laRTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbDJjX2NpZDogMHgleCBzdHJlYW1fbXR1OiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPmwyY19jaWQsIHBfc2NiLT5zdHJlYW1fbXR1KTsKLSAgICBwX3NjYi0+cF9jb3MtPnVwZGF0ZV9tdHUocF9zY2ItPmhuZGwsIHBfc2NiLT5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c3RyZWFtX210dSk7Ci0gIH0KLQotICAvKiByYyBsaXN0ZW4gKi8KLSAgYnRhX2F2X3N0X3JjX3RpbWVyKHBfc2NiLCBOVUxMKTsKLQotICAvKiBObyBuZWVkIHRvIGtlZXAgdGhlIHJvbGUgYml0cyBvbmNlIHJlY29uZmlnIGlzIGRvbmUuICovCi0gIHBfc2NiLT5yb2xlICY9IH5CVEFfQVZfUk9MRV9BRF9BQ1A7Ci0gIHBfc2NiLT5yb2xlICY9IH5CVEFfQVZfUk9MRV9TVVNQRU5EX09QVDsKLSAgcF9zY2ItPnJvbGUgJj0gfkJUQV9BVl9ST0xFX1NUQVJUX0lOVDsKLQotICB7Ci0gICAgLyogcmVjb25maWd1cmUgc3VjY2VzcyAgKi8KLSAgICB0QlRBX0FWX1JFQ09ORklHIHJlY29uZmlnOwotICAgIHJlY29uZmlnLnN0YXR1cyA9IEJUQV9BVl9TVUNDRVNTOwotICAgIHJlY29uZmlnLmNobmwgPSBwX3NjYi0+Y2hubDsKLSAgICByZWNvbmZpZy5obmRsID0gcF9zY2ItPmhuZGw7Ci0gICAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgICBidGFfYXZfZGF0YS5yZWNvbmZpZyA9IHJlY29uZmlnOwotICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9SRUNPTkZJR19FVlQsICZidGFfYXZfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY2ZnX2ZhaWxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcHJvY2VzcyByZWNvbmZpZ3VyZSBmYWlsZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfcmNmZ19mYWlsZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0VSUk9SKCIlczogbnVtX3JlY2ZnPSVkIGNvbm5fbGNiPTB4JXggcGVlcl9hZGRyPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPm51bV9yZWNmZywgYnRhX2F2X2NiLmNvbm5fbGNiLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKHBfc2NiLT5udW1fcmVjZmcgPiBCVEFfQVZfUkVDT05GSUdfUkVUUlkpIHsKLSAgICBidGFfYXZfY2NvX2Nsb3NlKHBfc2NiLCBwX2RhdGEpOwotICAgIC8qIHJlcG9ydCBmYWlsdXJlICovCi0gICAgdEJUQV9BVl9SRUNPTkZJRyByZWNvbmZpZzsKLSAgICByZWNvbmZpZy5zdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07Ci0gICAgcmVjb25maWcuY2hubCA9IHBfc2NiLT5jaG5sOwotICAgIHJlY29uZmlnLmhuZGwgPSBwX3NjYi0+aG5kbDsKLSAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgIGJ0YV9hdl9kYXRhLnJlY29uZmlnID0gcmVjb25maWc7Ci0gICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1JFQ09ORklHX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICAvKiBnbyB0byBjbG9zaW5nIHN0YXRlICovCi0gICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQVBJX0NMT1NFX0VWVCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogb3BlbiBmYWlsZWQuIHRyeSBhZ2FpbiAqLwotICAgIHBfc2NiLT5udW1fcmVjZmcrKzsKLSAgICAvLyBjb25uX2xjYiBpcyB0aGUgaW5kZXggYml0bWFzayBvZiBhbGwgdXNlZCBMQ0JzLCBhbmQgc2luY2UgTENCIGFuZCBTQ0IgdXNlCi0gICAgLy8gdGhlIHNhbWUgaW5kZXgsIGl0IHNob3VsZCBiZSBzYWZlIHRvIHVzZSBTQ0IgaW5kZXggaGVyZS4KLSAgICBpZiAoKGJ0YV9hdl9jYi5jb25uX2xjYiAmICgxIDw8IHBfc2NiLT5oZGkpKSAhPSAwKSB7Ci0gICAgICBBVkRUX0Rpc2Nvbm5lY3RSZXEocF9zY2ItPlBlZXJBZGRyZXNzKCksICZidGFfYXZfcHJvY19zdHJlYW1fZXZ0KTsKLSAgICB9IGVsc2UgewotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogY29ubl9sY2I9MHgleCBidGFfaGFuZGxlPTB4JXggKGhkaT0ldSkgbm8gbGluayIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ0YV9hdl9jYi5jb25uX2xjYiwgcF9zY2ItPmhuZGwsIHBfc2NiLT5oZGkpOwotICAgICAgYnRhX2F2X2Nvbm5lY3RfcmVxKHBfc2NiLCBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY2ZnX2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHN0cmVhbSBjbG9zZWQuIHJlY29ubmVjdCB0aGUgc3RyZWFtCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjZmdfY29ubmVjdCh0QlRBX0FWX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHBfc2NiLT5jb25nID0gZmFsc2U7Ci0gIHBfc2NiLT5udW1fcmVjZmcrKzsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG51bV9yZWNmZzogJWQiLCBfX2Z1bmNfXywgcF9zY2ItPm51bV9yZWNmZyk7Ci0gIGlmIChwX3NjYi0+bnVtX3JlY2ZnID4gQlRBX0FWX1JFQ09ORklHX1JFVFJZKSB7Ci0gICAgLyogbGV0IGJ0YV9hdl9yY2ZnX2ZhaWxlZCByZXBvcnQgZmFpbCAqLwotICAgIGJ0YV9hdl9yY2ZnX2ZhaWxlZChwX3NjYiwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgQVZEVF9Db25uZWN0UmVxKHBfc2NiLT5QZWVyQWRkcmVzcygpLCBwX3NjYi0+aGRpLCAmYnRhX2F2X3Byb2Nfc3RyZWFtX2V2dCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY2ZnX2Rpc2NudGQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFWRFQgZGlzY29ubmVjdGVkLiByZWNvbm5lY3QgdGhlIHN0cmVhbQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY2ZnX2Rpc2NudGQodEJUQV9BVl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0VSUk9SKCIlczogbnVtX3JlY2ZnPSVkIGNvbm5fbGNiPTB4JXggcGVlcl9hZGRyPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPm51bV9yZWNmZywgYnRhX2F2X2NiLmNvbm5fbGNiLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgcF9zY2ItPm51bV9yZWNmZysrOwotICBpZiAocF9zY2ItPm51bV9yZWNmZyA+IEJUQV9BVl9SRUNPTkZJR19SRVRSWSkgewotICAgIC8qIHJlcG9ydCBmYWlsdXJlICovCi0gICAgdEJUQV9BVl9SRUNPTkZJRyByZWNvbmZpZzsKLSAgICByZWNvbmZpZy5zdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07Ci0gICAgcmVjb25maWcuY2hubCA9IHBfc2NiLT5jaG5sOwotICAgIHJlY29uZmlnLmhuZGwgPSBwX3NjYi0+aG5kbDsKLSAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgIGJ0YV9hdl9kYXRhLnJlY29uZmlnID0gcmVjb25maWc7Ci0gICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1JFQ09ORklHX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICAvKiByZXBvcnQgY2xvc2UgZXZlbnQgJiBnbyB0byBpbml0IHN0YXRlICovCi0gICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfU1RSX0RJU0NfRkFJTF9FVlQsIE5VTEwpOwotICB9IGVsc2UgewotICAgIEFWRFRfQ29ubmVjdFJlcShwX3NjYi0+UGVlckFkZHJlc3MoKSwgcF9zY2ItPmhkaSwgJmJ0YV9hdl9wcm9jX3N0cmVhbV9ldnQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc3VzcGVuZF9jb250Ci0gKgotICogRGVzY3JpcHRpb24gICAgICByZWNlaXZlZCB0aGUgc3VzcGVuZCByZXNwb25zZS4KLSAqICAgICAgICAgICAgICAgICAgY29udGludWUgdG8gcmVjb25maWd1cmUgdGhlIHN0cmVhbQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zdXNwZW5kX2NvbnQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90IGVycl9jb2RlID0gcF9kYXRhLT5zdHJfbXNnLm1zZy5oZHIuZXJyX2NvZGU7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGVycl9jb2RlPSVkIiwgX19mdW5jX18sIGVycl9jb2RlKTsKLQotICBwX3NjYi0+c3RhcnRlZCA9IGZhbHNlOwotICBwX3NjYi0+Y29uZyA9IGZhbHNlOwotICBpZiAoZXJyX2NvZGUpIHsKLSAgICBpZiAoQVZEVF9FUlJfQ09OTkVDVCA9PSBlcnJfY29kZSkgewotICAgICAgLyogcmVwb3J0IGZhaWx1cmUgKi8KLSAgICAgIHRCVEFfQVZfUkVDT05GSUcgcmVjb25maWc7Ci0gICAgICByZWNvbmZpZy5zdGF0dXMgPSBCVEFfQVZfRkFJTDsKLSAgICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgICBidGFfYXZfZGF0YS5yZWNvbmZpZyA9IHJlY29uZmlnOwotICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1JFQ09ORklHX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBCVEFfQVZfU1RSX0RJU0NfRkFJTF9FVlQ6IHBlZXJfYWRkcj0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfU1RSX0RJU0NfRkFJTF9FVlQsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogc3VzcGVuZCByZWplY3RlZCwgdHJ5IGNsb3NlIiwgX19mdW5jX18pOwotICAgICAgLyogZHJvcCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gTDJDQVAgKi8KLSAgICAgIEwyQ0FfRmx1c2hDaGFubmVsKHBfc2NiLT5sMmNfY2lkLCBMMkNBUF9GTFVTSF9DSEFOU19BTEwpOwotCi0gICAgICBBVkRUX0Nsb3NlUmVxKHBfc2NiLT5hdmR0X2hhbmRsZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjYWxsaW5nIEFWRFRfUmVjb25maWdSZXEiLCBfX2Z1bmNfXyk7Ci0gICAgLyogcmVjb25maWcgdGhlIHN0cmVhbSAqLwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvZGVjOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY0luZm9TdHJpbmcocF9zY2ItPmNmZy5jb2RlY19pbmZvKS5jX3N0cigpKTsKLSAgICBBVkRUX1JlY29uZmlnUmVxKHBfc2NiLT5hdmR0X2hhbmRsZSwgJnBfc2NiLT5jZmcpOwotICAgIHBfc2NiLT5jZmcucHNjX21hc2sgPSBwX3NjYi0+Y3VyX3BzY19tYXNrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNmZ19jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGlmIHJlY29uZmlndXJlIGlzIHN1Y2Nlc3NmdWwsIHJlcG9ydCB0aGUgZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBjbG9zZSB0aGUgc3RyZWFtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY2ZnX2NmbSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QgZXJyX2NvZGUgPSBwX2RhdGEtPnN0cl9tc2cubXNnLmhkci5lcnJfY29kZTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogZXJyX2NvZGUgPSAlZCIsIF9fZnVuY19fLCBlcnJfY29kZSk7Ci0KLSAgLy8gRGlzYWJsZSBBVkRUUCBSRUNPTkZJR1VSRSBmb3IgcmVqZWN0bGlzdGVkIGRldmljZXMKLSAgYm9vbCBkaXNhYmxlX2F2ZHRwX3JlY29uZmlndXJlID0gZmFsc2U7Ci0gIHsKLSAgICBjaGFyIHJlbW90ZV9uYW1lW0JUTV9NQVhfUkVNX0JEX05BTUVfTEVOXSA9ICIiOwotICAgIGlmIChidGlmX3N0b3JhZ2VfZ2V0X3N0b3JlZF9yZW1vdGVfbmFtZShwX3NjYi0+UGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX25hbWUpKSB7Ci0gICAgICBpZiAoaW50ZXJvcF9tYXRjaF9uYW1lKElOVEVST1BfRElTQUJMRV9BVkRUUF9SRUNPTkZJR1VSRSwgcmVtb3RlX25hbWUpIHx8Ci0gICAgICAgICAgaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfRElTQUJMRV9BVkRUUF9SRUNPTkZJR1VSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MqKSZwX3NjYi0+UGVlckFkZHJlc3MoKSkpIHsKLSAgICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgICAiJXM6IGRpc2FibGUgQVZEVFAgUkVDT05GSUdVUkU6IGludGVyb3AgbWF0Y2hlZCAiCi0gICAgICAgICAgICAibmFtZSAlcyBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCByZW1vdGVfbmFtZSwgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgZGlzYWJsZV9hdmR0cF9yZWNvbmZpZ3VyZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKChlcnJfY29kZSAhPSAwKSB8fCBkaXNhYmxlX2F2ZHRwX3JlY29uZmlndXJlKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHJlY29uZmlnIHJlamVjdGVkLCB0cnkgY2xvc2UiLCBfX2Z1bmNfXyk7Ci0gICAgLyogRGlzYWJsZSByZWNvbmZpZ3VyYXRpb24gZmVhdHVyZSBvbmx5IHdpdGggZXhwbGljaXQgcmVqZWN0aW9uKG5vdCB3aXRoCi0gICAgICogdGltZW91dCkgKi8KLSAgICBpZiAoKGVycl9jb2RlICE9IEFWRFRfRVJSX1RJTUVPVVQpIHx8IGRpc2FibGVfYXZkdHBfcmVjb25maWd1cmUpIHsKLSAgICAgIHBfc2NiLT5yZWNmZ19zdXAgPSBmYWxzZTsKLSAgICB9Ci0gICAgLyogc3RhcnRlZCBmbGFnIGlzIGZhbHNlIHdoZW4gcmVjb25maWd1cmUgY29tbWFuZCBpcyBzZW50ICovCi0gICAgLyogZHJvcCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gTDJDQVAgKi8KLSAgICBMMkNBX0ZsdXNoQ2hhbm5lbChwX3NjYi0+bDJjX2NpZCwgTDJDQVBfRkxVU0hfQ0hBTlNfQUxMKTsKLSAgICBBVkRUX0Nsb3NlUmVxKHBfc2NiLT5hdmR0X2hhbmRsZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogdXBkYXRlIHRoZSBjb2RlYyBpbmZvIGFmdGVyIHJjZmcgY2ZtICovCi0gICAgQVBQTF9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiB1cGRhdGluZyBmcm9tIGNvZGVjICVzIHRvIGNvZGVjICVzIiwgX19mdW5jX18sCi0gICAgICAgIEEyRFBfQ29kZWNOYW1lKHBfc2NiLT5jZmcuY29kZWNfaW5mbyksCi0gICAgICAgIEEyRFBfQ29kZWNOYW1lKHBfZGF0YS0+c3RyX21zZy5tc2cucmVjb25maWdfY2ZtLnBfY2ZnLT5jb2RlY19pbmZvKSk7Ci0gICAgbWVtY3B5KHBfc2NiLT5jZmcuY29kZWNfaW5mbywKLSAgICAgICAgICAgcF9kYXRhLT5zdHJfbXNnLm1zZy5yZWNvbmZpZ19jZm0ucF9jZmctPmNvZGVjX2luZm8sIEFWRFRfQ09ERUNfU0laRSk7Ci0gICAgLyogdGFrZSB0aGUgU1NNIGJhY2sgdG8gT1BFTiBzdGF0ZSAqLwotICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FWX1NUUl9PUEVOX09LX0VWVCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY2ZnX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFWRFQgaXMgY29ubmVjdGVkLiBvcGVuIHRoZSBzdHJlYW0gd2l0aCB0aGUgbmV3Ci0gKiAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfcmNmZ19vcGVuKHRCVEFfQVZfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYnRhX2hhbmRsZToweCV4IG51bV9kaXNjX3Nua3M6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5udW1fZGlzY19zbmtzKTsKLQotICBpZiAocF9zY2ItPm51bV9kaXNjX3Nua3MgPT0gMCkgewotICAgIC8qIE5lZWQgdG8gdXBkYXRlIGNhbGwtb3V0IG1vZHVsZSBzbyB0aGF0IGl0IHdpbGwgYmUgcmVhZHkgZm9yIGRpc2NvdmVyICovCi0gICAgcF9zY2ItPnBfY29zLT5zdG9wKHBfc2NiLT5obmRsLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0KLSAgICAvKiBzZW5kIGF2ZHRwIGRpc2NvdmVyIHJlcXVlc3QgKi8KLSAgICBBVkRUX0Rpc2NvdmVyUmVxKHBfc2NiLT5QZWVyQWRkcmVzcygpLCBwX3NjYi0+aGRpLCBwX3NjYi0+c2VwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICBCVEFfQVZfTlVNX1NFUFMsICZidGFfYXZfcHJvY19zdHJlYW1fZXZ0KTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY2FsbGluZyBBVkRUX09wZW5SZXEoKSIsIF9fZnVuY19fKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBBMkRQX0NvZGVjSW5mb1N0cmluZyhwX3NjYi0+Y2ZnLmNvZGVjX2luZm8pLmNfc3RyKCkpOwotCi0gICAgLyogd2UgbWF5IGNob29zZSB0byB1c2UgYSBkaWZmZXJlbnQgU0VQIGF0IHJlY29uZmlnLgotICAgICAqIGFkanVzdCB0aGUgc2VwX2lkeCBub3cgKi8KLSAgICBidGFfYXZfYWRqdXN0X3NlcHNfaWR4KHBfc2NiLCBidGFfYXZfZ2V0X3NjYl9oYW5kbGUocF9zY2IsIEFWRFRfVFNFUF9TUkMpKTsKLSAgICBMT0dfSU5GTygiJXM6IHNlcF9pZHg9JWQgYXZkdF9oYW5kbGU9JWQgYnRhX2hhbmRsZT0weCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgcF9zY2ItPnNlcF9pZHgsIHBfc2NiLT5hdmR0X2hhbmRsZSwgcF9zY2ItPmhuZGwpOwotCi0gICAgLyogb3BlbiB0aGUgc3RyZWFtIHdpdGggdGhlIG5ldyBjb25maWcgKi8KLSAgICBwX3NjYi0+c2VwX2luZm9faWR4ID0gcF9zY2ItPnJjZmdfaWR4OwotICAgIEFWRFRfT3BlblJlcShwX3NjYi0+YXZkdF9oYW5kbGUsIHBfc2NiLT5QZWVyQWRkcmVzcygpLCBwX3NjYi0+aGRpLAotICAgICAgICAgICAgICAgICBwX3NjYi0+c2VwX2luZm9bcF9zY2ItPnNlcF9pbmZvX2lkeF0uc2VpZCwgJnBfc2NiLT5jZmcpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2VjdXJpdHlfcmVqCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIEFWRFRQIHNlY3VyaXR5IHJlamVjdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc2VjdXJpdHlfcmVqKHRCVEFfQVZfU0NCKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQVZEVF9TZWN1cml0eVJzcChwX3NjYi0+YXZkdF9oYW5kbGUsIHBfc2NiLT5hdmR0X2xhYmVsLCBBVkRUX0VSUl9CQURfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY2hrXzJuZF9zdGFydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgaWYgdGhpcyBpcyAybmQgc3RyZWFtIGFuZCBpZiBpdCBuZWVkcyB0byBiZSBzdGFydGVkLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGtlcHQgdmVyeSBzaW1pbGFyIHRvCi0gKiAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jaGtfc3RhcnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfY2hrXzJuZF9zdGFydCh0QlRBX0FWX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIExPR19JTkZPKAotICAgICAgIiVzOiBwZWVyICVzIGNoYW5uZWw6JWQgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250OiVkIHJvbGU6MHgleCAiCi0gICAgICAiZmVhdHVyZXM6MHgleCIsCi0gICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+Y2hubCwKLSAgICAgIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCwgcF9zY2ItPnJvbGUsIGJ0YV9hdl9jYi5mZWF0dXJlcyk7Ci0KLSAgaWYgKChwX3NjYi0+Y2hubCA9PSBCVEFfQVZfQ0hOTF9BVURJTykgJiYgKGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCA+PSAyKSAmJgotICAgICAgKCgocF9zY2ItPnJvbGUgJiBCVEFfQVZfUk9MRV9BRF9BQ1ApID09IDApIHx8ICAvLyBPdXRnb2luZyBjb25uZWN0aW9uIG9yCi0gICAgICAgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0FDUF9TVEFSVCkpKSB7ICAvLyBBdXRvLXN0YXJ0aW5nIG9wdGlvbgotICAgIC8vIE1vcmUgdGhhbiBvbmUgYXVkaW8gY2hhbm5lbCBpcyBjb25uZWN0ZWQuCi0gICAgaWYgKCEocF9zY2ItPnJvbGUgJiBCVEFfQVZfUk9MRV9TVVNQRU5EX09QVCkpIHsKLSAgICAgIC8vIFRoaXMgY2hhbm5lbCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlY29uZmlndXJlZC4KLSAgICAgIC8vIElmIHRoZXJlIGlzIG90aGVyIGNoYW5uZWwgc3RyZWFtaW5nLCBzdGFydCB0aGUgc3RyZWFtIG5vdy4KLSAgICAgIGJvb2wgbmV3X3N0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0FWX05VTV9TVFJTOyBpKyspIHsKLSAgICAgICAgdEJUQV9BVl9TQ0IqIHBfc2NiaSA9IGJ0YV9hdl9jYi5wX3NjYltpXTsKLSAgICAgICAgaWYgKHBfc2NiID09IHBfc2NiaSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwX3NjYmkgJiYgcF9zY2JpLT5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPICYmIHBfc2NiaS0+Y29fc3RhcnRlZCkgewotICAgICAgICAgIGlmICghbmV3X3N0YXJ0ZWQpIHsKLSAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICBuZXdfc3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBMT0dfSU5GTygKLSAgICAgICAgICAgICAgICAiJXM6IHN0YXJ0aW5nIG5ldyBzdHJlYW0gZm9yIHBlZXIgJXMgYmVjYXVzZSBwZWVyICVzICIKLSAgICAgICAgICAgICAgICAiYWxyZWFkeSBzdGFydGVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgIHBfc2NiaS0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQVBfU1RBUlRfRVZULCBOVUxMKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gTWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBmbHVzaCB0aW1lb3V0IG9mIHRoaXMgYWxyZWFkeSBzdGFydGVkIHN0cmVhbQotICAgICAgICAgIGlmIChwX3NjYmktPmNvX3N0YXJ0ZWQgIT0gYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250KSB7Ci0gICAgICAgICAgICBwX3NjYmktPmNvX3N0YXJ0ZWQgPSBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfb3Blbl9yYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIG1lc3NhZ2UgdG8gbWFpbiBTTSB0byBvcGVuIFJDIGNoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X29wZW5fcmModEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogdXNlX3JjOiAlZCwgd2FpdDogMHgleCByb2xlOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPnVzZV9yYywgcF9zY2ItPndhaXQsIHBfc2NiLT5yb2xlKTsKLSAgaWYgKChwX3NjYi0+d2FpdCAmIEJUQV9BVl9XQUlUX1JPTEVfU1dfQklUUykgJiYKLSAgICAgIChwX3NjYi0+cV90YWcgPT0gQlRBX0FWX1FfVEFHX1NUQVJUKSkgewotICAgIC8qIHdhaXRpbmcgZm9yIHJvbGUgc3dpdGNoIGZvciBzb21lIHJlYXNvbiAmIHRoZSB0aW1lciBleHBpcmVzICovCi0gICAgaWYgKCFidGFfYXZfbGlua19yb2xlX29rKHBfc2NiLCBBMkRQX1NFVF9PTkVfQklUKSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiJXM6IGZhaWxlZCB0byBzdGFydCBzdHJlYW1pbmcgZm9yIHJvbGUgbWFuYWdlbWVudCByZWFzb25zISEiLAotICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+YXZyY19jdF90aW1lcik7Ci0KLSAgICAgIHRCVEFfQVZfU1RBUlQgc3RhcnQ7Ci0gICAgICBzdGFydC5jaG5sID0gcF9zY2ItPmNobmw7Ci0gICAgICBzdGFydC5zdGF0dXMgPSBCVEFfQVZfRkFJTF9ST0xFOwotICAgICAgc3RhcnQuaW5pdGlhdG9yID0gdHJ1ZTsKLSAgICAgIHN0YXJ0LmhuZGwgPSBwX3NjYi0+aG5kbDsKLSAgICAgIHBfc2NiLT53YWl0ICY9IH5CVEFfQVZfV0FJVF9ST0xFX1NXX0JJVFM7Ci0gICAgICBidGFfYXZfY2IucnNfaWR4ID0gMDsKLSAgICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgICBidGFfYXZfZGF0YS5zdGFydCA9IHN0YXJ0OwotICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX1NUQVJUX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogcm9sZSBzd2l0Y2ggaXMgZG9uZS4gY29udGludWUgdG8gc3RhcnQgc3RyZWFtaW5nICovCi0gICAgICBidGFfYXZfY2IucnNfaWR4ID0gMDsKLSAgICAgIHBfZGF0YS0+aGRyLm9mZnNldCA9IEJUQV9BVl9SU19PSzsKLSAgICAgIGJ0YV9hdl9zdGFydF9vayhwX3NjYiwgcF9kYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfc2NiLT51c2VfcmMgfHwgKHBfc2NiLT5yb2xlICYgQlRBX0FWX1JPTEVfQURfQUNQKSkgewotICAgIGlmIChidGFfYXZfY2IuZGlzYykgewotICAgICAgLyogQVZSQyBkaXNjb3ZlciBkYiBpcyBpbiB1c2UgKi8KLSAgICAgIGlmIChwX3NjYi0+cmNfaGFuZGxlID09IEJUQV9BVl9SQ19IQU5ETEVfTk9ORSkgewotICAgICAgICAvKiBBVlJDIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZC4gZGVsYXkgYSBsaXR0bGUgYml0ICovCi0gICAgICAgIGlmICgocF9zY2ItPndhaXQgJiBCVEFfQVZfV0FJVF9ST0xFX1NXX0JJVFMpID09IDApIHsKLSAgICAgICAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5hdnJjX2N0X3RpbWVyLCBCVEFfQVZfUkNfRElTQ19USU1FX1ZBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BVl9BVlJDX1RJTUVSX0VWVCwgcF9zY2ItPmhuZGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfc2NiLT53YWl0IHw9IEJUQV9BVl9XQUlUX0NIRUNLX1JDOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHVzZSBtYWluIFNNIGZvciBBVlJDIFNEUCBhY3Rpdml0aWVzICovCi0gICAgICBpZiAoaXNfbmV3X2F2cmNwX2VuYWJsZWQoKSkgewotICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBVc2luZyB0aGUgbmV3IEFWUkNQIFByb2ZpbGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJsdWV0b290aDo6YXZyY3A6OkF2cmNwU2VydmljZTo6R2V0KCktPkNvbm5lY3REZXZpY2UoCi0gICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfYXZfcmNfZGlzYygodWludDhfdCkocF9zY2ItPmhkaSArIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKEJUQV9BVl9SQ19IQU5ETEVfTk9ORSAhPSBwX3NjYi0+cmNfaGFuZGxlKSB7Ci0gICAgICAvKiB0aGUgb3BlbiBBUEkgc2FpZCB0aGF0IHRoaXMgaGFuZGxlIGRvZXMgbm90IHdhbnQgYSBSQyBjb25uZWN0aW9uLgotICAgICAgICogZGlzY29ubmVjdCBpdCBub3cgKi8KLSAgICAgIEFWUkNfQ2xvc2UocF9zY2ItPnJjX2hhbmRsZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfb3Blbl9hdF9pbmMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIEFQSSBvcGVuIGlzIGNhbGxlZCBieSBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICB3aGlsZSBzdGF0ZS1tYWNoaW5lIGlzIGF0IGluY29taW5nIHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9vcGVuX2F0X2luYyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIG1lbWNweSgmKHBfc2NiLT5vcGVuX2FwaSksICYocF9kYXRhLT5hcGlfb3BlbiksIHNpemVvZih0QlRBX0FWX0FQSV9PUEVOKSk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgY29sbF9tYXNrPTB4JTAyeCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmNvbGxfbWFzayk7Ci0KLSAgaWYgKHBfc2NiLT5jb2xsX21hc2sgJiBCVEFfQVZfQ09MTF9JTkNfVE1SKSB7Ci0gICAgcF9zY2ItPmNvbGxfbWFzayB8PSBCVEFfQVZfQ09MTF9BUElfQ0FMTEVEOwotCi0gICAgLyogQVBJIG9wZW4gd2lsbCBiZSBoYW5kbGVkIGF0IHRpbWVvdXQgaWYgU05LIGRpZCBub3Qgc3RhcnQgc2lnbmFsbGluZy4gKi8KLSAgICAvKiBBUEkgb3BlbiB3aWxsIGJlIGlnbm9yZWQgaWYgU05LIHN0YXJ0cyBzaWduYWxsaW5nLiAgICAgICAgICAgICAgICAgICAqLwotICB9IGVsc2UgewotICAgIC8qIFNOSyBkaWQgbm90IHN0YXJ0IHNpZ25hbGxpbmcsIEFQSSB3YXMgY2FsbGVkIE4gc2Vjb25kcyB0aW1lb3V0LiAqLwotICAgIC8qIFdlIG5lZWQgdG8gc3dpdGNoIHRvIElOSVQgc3RhdGUgYW5kIHN0YXJ0IG9wZW5pbmcgY29ubmVjdGlvbi4gKi8KLSAgICBwX3NjYi0+Y29sbF9tYXNrID0gMDsKLSAgICBidGFfYXZfc2V0X3NjYl9zc3RfaW5pdChwX3NjYik7Ci0KLSAgICB0QlRBX0FWX0FQSV9PUEVOKiBwX2J1ZiA9Ci0gICAgICAgICh0QlRBX0FWX0FQSV9PUEVOKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0FQSV9PUEVOKSk7Ci0gICAgbWVtY3B5KHBfYnVmLCAmKHBfc2NiLT5vcGVuX2FwaSksIHNpemVvZih0QlRBX0FWX0FQSV9PUEVOKSk7Ci0gICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLSAgfQotfQotCi12b2lkIG9mZmxvYWRfdmVuZG9yX2NhbGxiYWNrKHRCVE1fVlNDX0NNUEwqIHBhcmFtKSB7Ci0gIHRCVEFfQVYgdmFsdWV7MH07Ci0gIHVpbnQ4X3Qgc3ViX29wY29kZSA9IDA7Ci0gIGlmIChwYXJhbS0+cGFyYW1fbGVuKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBhcmFtX2xlbiA9ICVkIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbS0+cGFyYW1fbGVuLCBwYXJhbS0+cF9wYXJhbV9idWZbMF0pOwotICAgIHZhbHVlLnN0YXR1cyA9IHN0YXRpY19jYXN0PHRCVEFfQVZfU1RBVFVTPihwYXJhbS0+cF9wYXJhbV9idWZbMF0pOwotICB9Ci0gIGlmICh2YWx1ZS5zdGF0dXMgPT0gMCkgewotICAgIHN1Yl9vcGNvZGUgPSBwYXJhbS0+cF9wYXJhbV9idWZbMV07Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN1Ym9wY29kZSA9ICVkIiwgX19mdW5jX18sIHN1Yl9vcGNvZGUpOwotICAgIHN3aXRjaCAoc3ViX29wY29kZSkgewotICAgICAgY2FzZSBWU19IQ0lfQTJEUF9PRkZMT0FEX1NUT1A6Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBWU19IQ0lfU1RPUF9BMkRQX01FRElBIHN1Y2Nlc3NmdWwiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBWU19IQ0lfQTJEUF9PRkZMT0FEX1NUQVJUOgotICAgICAgICBpZiAoYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRfcGVuZGluZ19hY2xfaGRsICE9IEhDSV9JTlZBTElEX0hBTkRMRSkgewotICAgICAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0ZWRfYWNsX2hkbCA9Ci0gICAgICAgICAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbDsKLSAgICAgICAgICBidGFfYXZfY2Iub2ZmbG9hZF9zdGFydF9wZW5kaW5nX2FjbF9oZGwgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HX0lORk8oIiVzOiBObyBwZW5kaW5nIHN0YXJ0IGNvbW1hbmQgZHVlIHRvIEFWRFRQIHN1c3BlbmQgaW1tZWRpYXRlbHkiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX09GRkxPQURfU1RBUlRfUlNQX0VWVCwgJnZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IE9mZmxvYWQgZmFpbGVkIGZvciBzdWJvcGNvZGU9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBzdWJfb3Bjb2RlKTsKLSAgICBpZiAocGFyYW0tPm9wY29kZSAhPSBWU19IQ0lfQTJEUF9PRkZMT0FEX1NUT1ApIHsKLSAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCA9IEhDSV9JTlZBTElEX0hBTkRMRTsKLSAgICAgICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9PRkZMT0FEX1NUQVJUX1JTUF9FVlQsICZ2YWx1ZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgYnRhX2F2X3ZlbmRvcl9vZmZsb2FkX3N0YXJ0KHRCVEFfQVZfU0NCKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9BMkRQX09GRkxPQUQqIG9mZmxvYWRfc3RhcnQpIHsKLSAgdWludDhfdCBwYXJhbVtzaXplb2YodEJUX0EyRFBfT0ZGTE9BRCldOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICB1aW50OF90KiBwX3BhcmFtID0gcGFyYW07Ci0gICpwX3BhcmFtKysgPSBWU19IQ0lfQTJEUF9PRkZMT0FEX1NUQVJUOwotCi0gIFVJTlQzMl9UT19TVFJFQU0ocF9wYXJhbSwgb2ZmbG9hZF9zdGFydC0+Y29kZWNfdHlwZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocF9wYXJhbSwgb2ZmbG9hZF9zdGFydC0+bWF4X2xhdGVuY3kpOwotICBBUlJBWV9UT19TVFJFQU0ocF9wYXJhbSwgb2ZmbG9hZF9zdGFydC0+c2Ntc190X2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ob2ZmbG9hZF9zdGFydC0+c2Ntc190X2VuYWJsZS5zaXplKCkpKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwX3BhcmFtLCBvZmZsb2FkX3N0YXJ0LT5zYW1wbGVfcmF0ZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwX3BhcmFtLCBvZmZsb2FkX3N0YXJ0LT5iaXRzX3Blcl9zYW1wbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocF9wYXJhbSwgb2ZmbG9hZF9zdGFydC0+Y2hfbW9kZSk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocF9wYXJhbSwgb2ZmbG9hZF9zdGFydC0+ZW5jb2RlZF9hdWRpb19iaXRyYXRlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwX3BhcmFtLCBvZmZsb2FkX3N0YXJ0LT5hY2xfaGRsKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwX3BhcmFtLCBvZmZsb2FkX3N0YXJ0LT5sMmNfcmNpZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocF9wYXJhbSwgb2ZmbG9hZF9zdGFydC0+bXR1KTsKLSAgQVJSQVlfVE9fU1RSRUFNKHBfcGFyYW0sIG9mZmxvYWRfc3RhcnQtPmNvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAoaW50OF90KXNpemVvZihvZmZsb2FkX3N0YXJ0LT5jb2RlY19pbmZvKSk7Ci0gIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCA9IG9mZmxvYWRfc3RhcnQtPmFjbF9oZGw7Ci0gIExPR19JTkZPKAotICAgICAgImNvZGVjOiAlI3gsIHNhbXBsZSByYXRlOiAlI3gsIGJpdCBkZXB0aDogJSN4LCBjaGFubmVsOiAlI3gsIGJpdHJhdGU6ICIKLSAgICAgICIlI3gsIEFDTDogJSN4LCBMMkNBUDogJSN4LCBNVFU6ICUjeCIsCi0gICAgICBvZmZsb2FkX3N0YXJ0LT5jb2RlY190eXBlLCBvZmZsb2FkX3N0YXJ0LT5zYW1wbGVfcmF0ZSwKLSAgICAgIG9mZmxvYWRfc3RhcnQtPmJpdHNfcGVyX3NhbXBsZSwgb2ZmbG9hZF9zdGFydC0+Y2hfbW9kZSwKLSAgICAgIG9mZmxvYWRfc3RhcnQtPmVuY29kZWRfYXVkaW9fYml0cmF0ZSwgb2ZmbG9hZF9zdGFydC0+YWNsX2hkbCwKLSAgICAgIG9mZmxvYWRfc3RhcnQtPmwyY19yY2lkLCBvZmZsb2FkX3N0YXJ0LT5tdHUpOwotICBCVE1fVmVuZG9yU3BlY2lmaWNDb21tYW5kKEhDSV9DT05UUk9MTEVSX0EyRFAsIHBfcGFyYW0gLSBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwgb2ZmbG9hZF92ZW5kb3JfY2FsbGJhY2spOwotfQotCi12b2lkIGJ0YV9hdl92ZW5kb3Jfb2ZmbG9hZF9zdG9wKCkgewotICB1aW50OF90IHBhcmFtW3NpemVvZih0QlRfQTJEUF9PRkZMT0FEKV07Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBwYXJhbVswXSA9IFZTX0hDSV9BMkRQX09GRkxPQURfU1RPUDsKLSAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZChIQ0lfQ09OVFJPTExFUl9BMkRQLCAxLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkX3ZlbmRvcl9jYWxsYmFjayk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X29mZmxvYWRfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBhcHBsaWNhdGlvbiByZXF1ZXN0cyBvZmZsb2FkIG9mCi0gKiAgICAgICAgICAgICAgICAgIGEyZHAgYXVkaW8uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X29mZmxvYWRfcmVxKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9TVEFUVVMgc3RhdHVzID0gQlRBX0FWX0ZBSUxfUkVTT1VSQ0VTOwotCi0gIHRCVF9BMkRQX09GRkxPQUQgb2ZmbG9hZF9zdGFydDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN0cmVhbSAlcywgYXVkaW8gY2hhbm5lbHMgb3BlbiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zdGFydGVkID8gIlNUQVJURUQiIDogIlNUT1BQRUQiLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCk7Ci0gIC8qIENoZWNrIGlmIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuICovCi0gIC8qIFN1cHBvcnQgb2ZmbG9hZCBpZiBvbmx5IG9uZSBhdWRpbyBzb3VyY2Ugc3RyZWFtIGlzIG9wZW4uICovCi0gIGlmIChwX3NjYi0+c3RhcnRlZCAhPSB0cnVlKSB7Ci0gICAgc3RhdHVzID0gQlRBX0FWX0ZBSUxfU1RSRUFNOwotICB9IGVsc2UgaWYgKGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCAhPSBIQ0lfSU5WQUxJRF9IQU5ETEUgfHwKLSAgICAgICAgICAgICBidGFfYXZfY2Iub2ZmbG9hZF9zdGFydGVkX2FjbF9oZGwgIT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogb2ZmbG9hZCBhbHJlYWR5IHN0YXJ0ZWQsIGlnbm9yZSByZXF1ZXN0IiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfSBlbHNlIHsKLSAgICBidGFfYXZfb2ZmbG9hZF9jb2RlY19idWlsZGVyKHBfc2NiLCAmb2ZmbG9hZF9zdGFydCk7Ci0gICAgYnRhX2F2X3ZlbmRvcl9vZmZsb2FkX3N0YXJ0KHBfc2NiLCAmb2ZmbG9hZF9zdGFydCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChzdGF0dXMgIT0gQlRBX0FWX1NVQ0NFU1MpIHsKLSAgICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICAgIGJ0YV9hdl9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgICAoKmJ0YV9hdl9jYi5wX2NiYWNrKShCVEFfQVZfT0ZGTE9BRF9TVEFSVF9SU1BfRVZULCAmYnRhX2F2X2RhdGEpOwotICB9Ci0gIC8qIFRPRE8oZWlzZW5iYWNoKTogUkUtSU1QTEVNRU5UIFVTSU5HIFZTQyBPUiBIQUwgRVhURU5TSU9OCi0gIGVsc2UgaWYgKGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCA9PSAxICYmCi0gICAgICAgICAgICAgcF9zY2ItPnNlcHNbcF9zY2ItPnNlcF9pZHhdLnRzZXAgPT0gQVZEVF9UU0VQX1NSQyAmJgotICAgICAgICAgICAgIHBfc2NiLT5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPKSB7Ci0gICAgYnRfdmVuZG9yX29wX2EyZHBfb2ZmbG9hZF90IGEyZHBfb2ZmbG9hZF9zdGFydDsKLQotICAgIGlmIChMMkNBX0dldENvbm5lY3Rpb25Db25maWcoCi0gICAgICAgICAgICBwX3NjYi0+bDJjX2NpZCwgJmEyZHBfb2ZmbG9hZF9zdGFydC5hY2xfZGF0YV9zaXplLAotICAgICAgICAgICAgJmEyZHBfb2ZmbG9hZF9zdGFydC5yZW1vdGVfY2lkLCAmYTJkcF9vZmZsb2FkX3N0YXJ0LmxtX2hhbmRsZSkpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsMmNtdHUgJWQgbGNpZCAweCUwMlggcmNpZCAweCUwMlggbG1faGFuZGxlCi0gIDB4JTAyWCIsCi0gICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGEyZHBfb2ZmbG9hZF9zdGFydC5hY2xfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+bDJjX2NpZCwgYTJkcF9vZmZsb2FkX3N0YXJ0LnJlbW90ZV9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGEyZHBfb2ZmbG9hZF9zdGFydC5sbV9oYW5kbGUpOwotCi0gICAgICBhMmRwX29mZmxvYWRfc3RhcnQuYnRhX2F2X2hhbmRsZSA9IHBfc2NiLT5obmRsOwotICAgICAgYTJkcF9vZmZsb2FkX3N0YXJ0LnhtaXRfcXVvdGEgPSBCVEFfQVZfQTJEUF9PRkZMT0FEX1hNSVRfUVVPVEE7Ci0gICAgICBhMmRwX29mZmxvYWRfc3RhcnQuc3RyZWFtX210dSA9IHBfc2NiLT5zdHJlYW1fbXR1OwotICAgICAgYTJkcF9vZmZsb2FkX3N0YXJ0LmxvY2FsX2NpZCA9IHBfc2NiLT5sMmNfY2lkOwotICAgICAgYTJkcF9vZmZsb2FkX3N0YXJ0LmlzX2ZsdXNoYWJsZSA9IHRydWU7Ci0gICAgICBhMmRwX29mZmxvYWRfc3RhcnQuc3RyZWFtX3NvdXJjZSA9Ci0gICAgICAgICAgKCh1aW50MzJfdCkocF9zY2ItPmNmZy5jb2RlY19pbmZvWzFdIHwgcF9zY2ItPmNmZy5jb2RlY19pbmZvWzJdKSk7Ci0KLSAgICAgIG1lbWNweShhMmRwX29mZmxvYWRfc3RhcnQuY29kZWNfaW5mbywgcF9zY2ItPmNmZy5jb2RlY19pbmZvLAotICAgICAgICAgICAgIHNpemVvZihhMmRwX29mZmxvYWRfc3RhcnQuY29kZWNfaW5mbykpOwotCi0gICAgICBpZiAoIXZlbmRvcl9nZXRfaW50ZXJmYWNlKCktPnNlbmRfY29tbWFuZCgKLSAgICAgICAgICAgICAgKHZlbmRvcl9vcGNvZGVfdClCVF9WTkRfT1BfQTJEUF9PRkZMT0FEX1NUQVJULAotICAgICAgICAgICAgICAmYTJkcF9vZmZsb2FkX3N0YXJ0KSkgewotICAgICAgICBzdGF0dXMgPSBCVEFfQVZfU1VDQ0VTUzsKLSAgICAgICAgcF9zY2ItPm9mZmxvYWRfc3RhcnRfcGVuZGluZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9vZmZsb2FkX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmVuZG9yIGxpYiByZXNwb25kcyB0bwotICogICAgICAgICAgICAgICAgICBCVF9WTkRfT1BfQTJEUF9PRkZMT0FEX1NUQVJULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9vZmZsb2FkX3JzcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfU1RBVFVTIHN0YXR1cyA9IHBfZGF0YS0+YXBpX3N0YXR1c19yc3Auc3RhdHVzOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzdHJlYW0gJXMgc3RhdHVzICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPnN0YXJ0ZWQgPyAiU1RBUlRFRCIgOiAiU1RPUFBFRCIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzID8gIkZBSUwiIDogIlNVQ0NFU1MiKTsKLQotICAvKiBDaGVjayBpZiBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLiAqLwotICBpZiAoc3RhdHVzID09IEJUQV9BVl9TVUNDRVNTICYmIHBfc2NiLT5zdGFydGVkICE9IHRydWUpIHsKLSAgICBzdGF0dXMgPSBCVEFfQVZfRkFJTF9TVFJFQU07Ci0gIH0KLQotICBidGFfYXZfY2Iub2ZmbG9hZF9zdGFydF9wZW5kaW5nX2FjbF9oZGwgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gIGJ0YV9hdl9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX09GRkxPQURfU1RBUlRfUlNQX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2F2X29mZmxvYWRfY29kZWNfYnVpbGRlcih0QlRBX0FWX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9BMkRQX09GRkxPQUQqIHBfYTJkcF9vZmZsb2FkKSB7Ci0gIEEyZHBDb2RlY0NvbmZpZyogQ29kZWNDb25maWcgPSBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYygpOwotICBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCA9Ci0gICAgICBBMkRQX1NvdXJjZUNvZGVjSW5kZXgocF9zY2ItPmNmZy5jb2RlY19pbmZvKTsKLSAgdWludDMyX3QgY29kZWNfdHlwZSA9IDA7Ci0gIHVpbnQxNl90IG10dSA9IHBfc2NiLT5zdHJlYW1fbXR1OwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczpjb2RlY19pbmRleCA9ICVkIiwgX19mdW5jX18sIGNvZGVjX2luZGV4KTsKLSAgc3dpdGNoIChjb2RlY19pbmRleCkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkM6Ci0gICAgICBjb2RlY190eXBlID0gQlRBX0FWX0NPREVDX1RZUEVfU0JDOwotICAgICAgaWYgKEEyRFBfR2V0TWF4Qml0cG9vbFNiYyhwX3NjYi0+Y2ZnLmNvZGVjX2luZm8pIDw9Ci0gICAgICAgICAgQTJEUF9TQkNfQklUUE9PTF9NSURETEVfUVVBTElUWSkgewotICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBSZXN0cmljdGluZyBzdHJlYW1pbmcgTVRVIHNpemUgZm9yIE1RIEJpdHBvb2wiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBtdHUgPSBNQVhfMk1CUFNfQVZEVFBfTVRVOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICAgIGNvZGVjX3R5cGUgPSBCVEFfQVZfQ09ERUNfVFlQRV9BQUM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWDoKLSAgICAgIGNvZGVjX3R5cGUgPSBCVEFfQVZfQ09ERUNfVFlQRV9BUFRYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFhfSEQ6Ci0gICAgICBjb2RlY190eXBlID0gQlRBX0FWX0NPREVDX1RZUEVfQVBUWEhEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM6Ci0gICAgICBjb2RlY190eXBlID0gQlRBX0FWX0NPREVDX1RZUEVfTERBQzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogVW5rbm93biBDb2RlYyB0eXBlICIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybjsKLSAgfQotICBpZiAobXR1ID4gTUFYXzNNQlBTX0FWRFRQX01UVSkgbXR1ID0gTUFYXzNNQlBTX0FWRFRQX01UVTsKLSAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOwotICBwX2EyZHBfb2ZmbG9hZC0+bWF4X2xhdGVuY3kgPSAwOwotICBwX2EyZHBfb2ZmbG9hZC0+bXR1ID0gbXR1OwotICBwX2EyZHBfb2ZmbG9hZC0+YWNsX2hkbCA9Ci0gICAgICBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saWZlY3ljbGUuQlRNX0dldEhDSUNvbm5IYW5kbGUoCi0gICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCksIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBidGF2X2EyZHBfc2Ntc3RfaW5mb190IHNjbXN0X2luZm8gPQotICAgICAgcF9zY2ItPnBfY29zLT5nZXRfc2Ntc3RfaW5mbyhwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gIHBfYTJkcF9vZmZsb2FkLT5zY21zX3RfZW5hYmxlWzBdID0gc2Ntc3RfaW5mby5lbmFibGVfc3RhdHVzOwotICBwX2EyZHBfb2ZmbG9hZC0+c2Ntc190X2VuYWJsZVsxXSA9IHNjbXN0X2luZm8uY3BfaGVhZGVyOwotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBTQ01TLVRfZW5hYmxlIHN0YXR1czogJWQsICIKLSAgICAgICJTQ01TLVQgaGVhZGVyIChpZiBpdCdzIGVuYWJsZWQpOiAweCUwMngiLAotICAgICAgX19mdW5jX18sIHNjbXN0X2luZm8uZW5hYmxlX3N0YXR1cywgc2Ntc3RfaW5mby5jcF9oZWFkZXIpOwotCi0gIHN3aXRjaCAoQTJEUF9HZXRUcmFja1NhbXBsZVJhdGUocF9zY2ItPmNmZy5jb2RlY19pbmZvKSkgewotICAgIGNhc2UgNDQxMDA6Ci0gICAgICBwX2EyZHBfb2ZmbG9hZC0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgcF9hMmRwX29mZmxvYWQtPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4ODIwMDoKLSAgICAgIHBfYTJkcF9vZmZsb2FkLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOTYwMDA6Ci0gICAgICBwX2EyZHBfb2ZmbG9hZC0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA7Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoTDJDQV9HZXRSZW1vdGVDaWQocF9zY2ItPmwyY19jaWQsICZwX2EyZHBfb2ZmbG9hZC0+bDJjX3JjaWQpID09IGZhbHNlKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZhaWxlZCB0byBmZXRjaCBsMmMgcmNpZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3dpdGNoIChDb2RlY0NvbmZpZy0+Z2V0QXVkaW9CaXRzUGVyU2FtcGxlKCkpIHsKLSAgICBjYXNlIDE2OgotICAgICAgcF9hMmRwX29mZmxvYWQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgcF9hMmRwX29mZmxvYWQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgcF9hMmRwX29mZmxvYWQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzI7Ci0gICAgICBicmVhazsKLSAgfQotICBwX2EyZHBfb2ZmbG9hZC0+Y2hfbW9kZSA9IEEyRFBfR2V0VHJhY2tDaGFubmVsQ291bnQocF9zY2ItPmNmZy5jb2RlY19pbmZvKTsKLSAgcF9hMmRwX29mZmxvYWQtPmVuY29kZWRfYXVkaW9fYml0cmF0ZSA9IENvZGVjQ29uZmlnLT5nZXRUcmFja0JpdFJhdGUoKTsKLSAgaWYgKCFDb2RlY0NvbmZpZy0+Z2V0Q29kZWNTcGVjaWZpY0NvbmZpZyhwX2EyZHBfb2ZmbG9hZCkpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogbm90IGEgdmFsaWQgY29kZWMgaW5mbyIsIF9fZnVuY19fKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL2F2L2J0YV9hdl9hY3QuY2MgYi9idGEvYXYvYnRhX2F2X2FjdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmM2Y3Yy4uMDAwMDAwMAotLS0gYS9idGEvYXYvYnRhX2F2X2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNC0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgYWN0aW9uIGZ1bmN0aW9ucyBmb3IgYWR2YW5jZWQgYXVkaW8vdmlkZW8gbWFpbiBzdGF0ZQotICogIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfYXYiCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXJfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvdXRsLmgiCi0jaW5jbHVkZSAiYnRpZi9hdnJjcC9hdnJjcF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGUgdGltZW91dCB0byB3YWl0IGZvciBvcGVuIHJlcSBhZnRlciBzZXRjb25maWcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zICovCi0jaWZuZGVmIEJUQV9BVl9TSUdOQUxMSU5HX1RJTUVPVVRfTVMKLSNkZWZpbmUgQlRBX0FWX1NJR05BTExJTkdfVElNRU9VVF9NUyAoOCAqIDEwMDApIC8qIDggc2Vjb25kcyAqLwotI2VuZGlmCi0KLS8qIFRpbWUgdG8gd2FpdCBmb3Igc2lnbmFsbGluZyBmcm9tIFNOSyB3aGVuIGl0IGlzIGluaXRpYXRlZCBmcm9tIFNOSy4gKi8KLS8qIElmIG5vdCwgd2Ugd2lsbCBzdGFydCBzaWduYWxsaW5nIGZyb20gU1JDLiAqLwotI2lmbmRlZiBCVEFfQVZfQUNDRVBUX1NJR05BTExJTkdfVElNRU9VVF9NUwotI2RlZmluZSBCVEFfQVZfQUNDRVBUX1NJR05BTExJTkdfVElNRU9VVF9NUyAoMiAqIDEwMDApIC8qIDIgc2Vjb25kcyAqLwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGJ0YV9hdl9hY2NlcHRfc2lnbmFsbGluZ190aW1lcl9jYmFjayh2b2lkKiBkYXRhKTsKLQotI2lmbmRlZiBBVlJDX01JTl9NRVRBX0NNRF9MRU4KLSNkZWZpbmUgQVZSQ19NSU5fTUVUQV9DTURfTEVOIDIwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9nZXRfcmNiX2J5X3NoZGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgdGhlIFJDQiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFNDQiBoYW5kbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0QlRBX0FWX1JDQgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0FWX1JDQiogYnRhX2F2X2dldF9yY2JfYnlfc2hkbCh1aW50OF90IHNoZGwpIHsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9BVl9OVU1fUkNCOyBpKyspIHsKLSAgICBpZiAoYnRhX2F2X2NiLnJjYltpXS5zaGRsID09IHNoZGwgJiYKLSAgICAgICAgYnRhX2F2X2NiLnJjYltpXS5oYW5kbGUgIT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FKSB7Ci0gICAgICBwX3JjYiA9ICZidGFfYXZfY2IucmNiW2ldOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwX3JjYjsKLX0KLSNkZWZpbmUgQlRBX0FWX1NUU19OT19SU1AgMHhGRiAvKiBhIG51bWJlciBub3QgdXNlZCBieSB0QVZSQ19TVFMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9kZWxfcmMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRlbGV0ZSB0aGUgZ2l2ZW4gQVZSQyBoYW5kbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2RlbF9yYyh0QlRBX0FWX1JDQiogcF9yY2IpIHsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiOwotICB1aW50OF90IHJjX2hhbmRsZTsgLyogY29ubmVjdGVkIEFWUkNQIGhhbmRsZSAqLwotCi0gIHBfc2NiID0gTlVMTDsKLSAgaWYgKHBfcmNiLT5oYW5kbGUgIT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FKSB7Ci0gICAgaWYgKHBfcmNiLT5zaGRsKSB7Ci0gICAgICAvKiBWYWxpZGF0ZSBhcnJheSBpbmRleCovCi0gICAgICBpZiAoKHBfcmNiLT5zaGRsIC0gMSkgPCBCVEFfQVZfTlVNX1NUUlMpIHsKLSAgICAgICAgcF9zY2IgPSBidGFfYXZfY2IucF9zY2JbcF9yY2ItPnNoZGwgLSAxXTsKLSAgICAgIH0KLSAgICAgIGlmIChwX3NjYikgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogc2hkbDolZCwgc3JjaDolZCByY19oYW5kbGU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX3JjYi0+c2hkbCwgcF9zY2ItPnJjX2hhbmRsZSwgcF9yY2ItPmhhbmRsZSk7Ci0gICAgICAgIGlmIChwX3NjYi0+cmNfaGFuZGxlID09IHBfcmNiLT5oYW5kbGUpCi0gICAgICAgICAgcF9zY2ItPnJjX2hhbmRsZSA9IEJUQV9BVl9SQ19IQU5ETEVfTk9ORTsKLSAgICAgICAgLyoganVzdCBpbiBjYXNlIHRoZSBSQyB0aW1lciBpcyBhY3RpdmUKLSAgICAgICAgaWYgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QgJiYgcF9zY2ItPmNobmwgPT0KLSAgICAgICAgQlRBX0FWX0NITkxfQVVESU8pICovCi0gICAgICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+YXZyY19jdF90aW1lcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQVBQTF9UUkFDRV9FVkVOVCgiJXM6IGhhbmRsZTogJWQgc3RhdHVzPTB4JXgsIHJjX2FjcF9oYW5kbGU6JWQsIGlkeDolZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9yY2ItPmhhbmRsZSwgcF9yY2ItPnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jYi5yY19hY3BfaGFuZGxlLCBidGFfYXZfY2IucmNfYWNwX2lkeCk7Ci0gICAgcmNfaGFuZGxlID0gcF9yY2ItPmhhbmRsZTsKLSAgICBpZiAoIShwX3JjYi0+c3RhdHVzICYgQlRBX0FWX1JDX0NPTk5fTUFTSykgfHwKLSAgICAgICAgKChwX3JjYi0+c3RhdHVzICYgQlRBX0FWX1JDX1JPTEVfTUFTSykgPT0gQlRBX0FWX1JDX1JPTEVfSU5UKSkgewotICAgICAgcF9yY2ItPnN0YXR1cyA9IDA7Ci0gICAgICBwX3JjYi0+aGFuZGxlID0gQlRBX0FWX1JDX0hBTkRMRV9OT05FOwotICAgICAgcF9yY2ItPnNoZGwgPSAwOwotICAgICAgcF9yY2ItPmxpZHggPSAwOwotICAgIH0KLSAgICAvKiBlbHNlIEFDUCAmJiBjb25uZWN0ZWQuIGRvIG5vdCBjbGVhciB0aGUgaGFuZGxlIHlldCAqLwotICAgIEFWUkNfQ2xvc2UocmNfaGFuZGxlKTsKLSAgICBpZiAocmNfaGFuZGxlID09IGJ0YV9hdl9jYi5yY19hY3BfaGFuZGxlKQotICAgICAgYnRhX2F2X2NiLnJjX2FjcF9oYW5kbGUgPSBCVEFfQVZfUkNfSEFORExFX05PTkU7Ci0gICAgQVBQTF9UUkFDRV9FVkVOVCgKLSAgICAgICAgIiVzOiBlbmQgZGVsX3JjIGhhbmRsZTogJWQgc3RhdHVzPTB4JXgsIHJjX2FjcF9oYW5kbGU6JWQsIGxpZHg6JWQiLAotICAgICAgICBfX2Z1bmNfXywgcF9yY2ItPmhhbmRsZSwgcF9yY2ItPnN0YXR1cywgYnRhX2F2X2NiLnJjX2FjcF9oYW5kbGUsCi0gICAgICAgIHBfcmNiLT5saWR4KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2Nsb3NlX2FsbF9yYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2xvc2UgdGhlIGFsbCBBVlJDIGhhbmRsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X2Nsb3NlX2FsbF9yYyh0QlRBX0FWX0NCKiBwX2NiKSB7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1JDQjsgaSsrKSB7Ci0gICAgaWYgKChwX2NiLT5kaXNhYmxpbmcpIHx8IChidGFfYXZfY2IucmNiW2ldLnNoZGwgIT0gMCkpCi0gICAgICBidGFfYXZfZGVsX3JjKCZidGFfYXZfY2IucmNiW2ldKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2RlbF9zZHBfcmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBkZWxldGUgdGhlIGdpdmVuIFNEUCByZWNvcmQgaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfZGVsX3NkcF9yZWModWludDMyX3QqIHBfc2RwX2hhbmRsZSkgewotICBpZiAoKnBfc2RwX2hhbmRsZSAhPSAwKSB7Ci0gICAgU0RQX0RlbGV0ZVJlY29yZCgqcF9zZHBfaGFuZGxlKTsKLSAgICAqcF9zZHBfaGFuZGxlID0gMDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2F2cmNfc2RwX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBVlJDUCBzZXJ2aWNlIGRpc2NvdmVyeSBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X2F2cmNfc2RwX2NiYWNrKFVOVVNFRF9BVFRSIHVpbnQxNl90IHN0YXR1cykgewotICBCVF9IRFJfUklHSUQqIHBfbXNnID0gKEJUX0hEUl9SSUdJRCopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSk7Ci0KLSAgcF9tc2ctPmV2ZW50ID0gQlRBX0FWX1NEUF9BVlJDX0RJU0NfRVZUOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfY3RybF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQVZSQ1AgY29udHJvbCBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X3JjX2N0cmxfY2JhY2sodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwZWVyX2FkZHIpIHsKLSAgdWludDE2X3QgbXNnX2V2ZW50ID0gMDsKLQotICBBUFBMX1RSQUNFX0VWRU5UKCIlczogaGFuZGxlOiAlZCBldmVudD0weCV4IiwgX19mdW5jX18sIGhhbmRsZSwgZXZlbnQpOwotICBpZiAoZXZlbnQgPT0gQVZSQ19PUEVOX0lORF9FVlQpIHsKLSAgICAvKiBzYXZlIGhhbmRsZSBvZiBvcGVuZWQgY29ubmVjdGlvbgotICAgIGJ0YV9hdl9jYi5yY19oYW5kbGUgPSBoYW5kbGU7Ki8KLQotICAgIG1zZ19ldmVudCA9IEJUQV9BVl9BVlJDX09QRU5fRVZUOwotICB9IGVsc2UgaWYgKGV2ZW50ID09IEFWUkNfQ0xPU0VfSU5EX0VWVCkgewotICAgIG1zZ19ldmVudCA9IEJUQV9BVl9BVlJDX0NMT1NFX0VWVDsKLSAgfSBlbHNlIGlmIChldmVudCA9PSBBVlJDX0JST1dTRV9PUEVOX0lORF9FVlQpIHsKLSAgICBtc2dfZXZlbnQgPSBCVEFfQVZfQVZSQ19CUk9XU0VfT1BFTl9FVlQ7Ci0gIH0gZWxzZSBpZiAoZXZlbnQgPT0gQVZSQ19CUk9XU0VfQ0xPU0VfSU5EX0VWVCkgewotICAgIG1zZ19ldmVudCA9IEJUQV9BVl9BVlJDX0JST1dTRV9DTE9TRV9FVlQ7Ci0gIH0KLQotICBpZiAobXNnX2V2ZW50KSB7Ci0gICAgdEJUQV9BVl9SQ19DT05OX0NIRyogcF9tc2cgPQotICAgICAgICAodEJUQV9BVl9SQ19DT05OX0NIRyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9SQ19DT05OX0NIRykpOwotICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBtc2dfZXZlbnQ7Ci0gICAgcF9tc2ctPmhhbmRsZSA9IGhhbmRsZTsKLSAgICBpZiAocGVlcl9hZGRyKSBwX21zZy0+cGVlcl9hZGRyID0gKnBlZXJfYWRkcjsKLSAgICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfbXNnX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBVlJDUCBtZXNzYWdlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfcmNfbXNnX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IG9wY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTVNHKiBwX21zZykgewotICB1aW50OF90KiBwX2RhdGFfc3JjID0gTlVMTDsKLSAgdWludDE2X3QgZGF0YV9sZW4gPSAwOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBoYW5kbGU6ICV1IG9wY29kZT0weCV4IiwgX19mdW5jX18sIGhhbmRsZSwgb3Bjb2RlKTsKLQotICAvKiBDb3B5IGF2cmMgcGFja2V0IGludG8gQlRBIG1lc3NhZ2UgYnVmZmVyIChmb3Igc2VuZGluZyB0byBCVEEgc3RhdGUgbWFjaGluZSkKLSAgICovCi0KLSAgLyogR2V0IHNpemUgb2YgcGF5bG9hZCBkYXRhICAoZm9yIHZlbmRvciBhbmQgcGFzc3Rocm91Z2ggbWVzc2FnZXMgb25seTsgZm9yCi0gICAqIGJyb3dzaW5nCi0gICAqIG1lc3NhZ2VzLCB1c2UgemVyby1jb3B5KSAqLwotICBpZiAob3Bjb2RlID09IEFWUkNfT1BfVkVORE9SICYmIHBfbXNnLT52ZW5kb3IucF92ZW5kb3JfZGF0YSAhPSBOVUxMKSB7Ci0gICAgcF9kYXRhX3NyYyA9IHBfbXNnLT52ZW5kb3IucF92ZW5kb3JfZGF0YTsKLSAgICBkYXRhX2xlbiA9ICh1aW50MTZfdClwX21zZy0+dmVuZG9yLnZlbmRvcl9sZW47Ci0gIH0gZWxzZSBpZiAob3Bjb2RlID09IEFWUkNfT1BfUEFTU19USFJVICYmIHBfbXNnLT5wYXNzLnBfcGFzc19kYXRhICE9IE5VTEwpIHsKLSAgICBwX2RhdGFfc3JjID0gcF9tc2ctPnBhc3MucF9wYXNzX2RhdGE7Ci0gICAgZGF0YV9sZW4gPSAodWludDE2X3QpcF9tc2ctPnBhc3MucGFzc19sZW47Ci0gIH0KLQotICAvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBtZXNzYWdlICovCi0gIHRCVEFfQVZfUkNfTVNHKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9BVl9SQ19NU0cqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfUkNfTVNHKSArIGRhdGFfbGVuKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FWUkNfTVNHX0VWVDsKLSAgcF9idWYtPmhhbmRsZSA9IGhhbmRsZTsKLSAgcF9idWYtPmxhYmVsID0gbGFiZWw7Ci0gIHBfYnVmLT5vcGNvZGUgPSBvcGNvZGU7Ci0gIG1lbWNweSgmcF9idWYtPm1zZywgcF9tc2csIHNpemVvZih0QVZSQ19NU0cpKTsKLSAgLyogQ29weSB0aGUgZGF0YSBwYXlsb2FkLCBhbmQgc2V0IHRoZSBwb2ludGVyIHRvIGl0ICovCi0gIGlmIChwX2RhdGFfc3JjICE9IE5VTEwpIHsKLSAgICB1aW50OF90KiBwX2RhdGFfZHN0ID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2RhdGFfZHN0LCBwX2RhdGFfc3JjLCBkYXRhX2xlbik7Ci0KLSAgICAvKiBVcGRhdGUgYnRhIG1lc3NhZ2UgYnVmZmVyIHRvIHBvaW50IHRvIHBheWxvYWQgZGF0YSAqLwotICAgIC8qIChOb3RlIEFWUkNfT1BfQlJPV1NJTkcgdXNlcyB6ZXJvLWNvcHk6IHBfYnVmLT5tc2cuYnJvd3NlLnBfYnJvd3NlX2RhdGEKLSAgICAgKiBhbHJlYWR5IHBvaW50cyB0byBvcmlnaW5hbCBhdnJjIGJ1ZmZlcikgKi8KLSAgICBpZiAob3Bjb2RlID09IEFWUkNfT1BfVkVORE9SKQotICAgICAgcF9idWYtPm1zZy52ZW5kb3IucF92ZW5kb3JfZGF0YSA9IHBfZGF0YV9kc3Q7Ci0gICAgZWxzZSBpZiAob3Bjb2RlID09IEFWUkNfT1BfUEFTU19USFJVKQotICAgICAgcF9idWYtPm1zZy5wYXNzLnBfcGFzc19kYXRhID0gcF9kYXRhX2RzdDsKLSAgfQotCi0gIGlmIChvcGNvZGUgPT0gQVZSQ19PUF9CUk9XU0UpIHsKLSAgICAvKiBzZXQgcF9wa3QgdG8gTlVMTCwgc28gYXZyYyB3b3VsZCBub3QgZnJlZSB0aGUgYnVmZmVyICovCi0gICAgcF9tc2ctPmJyb3dzZS5wX2Jyb3dzZV9wa3QgPSBOVUxMOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY19jcmVhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFsbG9jIFJDQiBhbmQgY2FsbCBBVlJDX09wZW4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBjcmVhdGVkIHJjIGhhbmRsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGJ0YV9hdl9yY19jcmVhdGUodEJUQV9BVl9DQiogcF9jYiwgdWludDhfdCByb2xlLCB1aW50OF90IHNoZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsaWR4KSB7Ci0gIGlmIChpc19uZXdfYXZyY3BfZW5hYmxlZCgpKSB7Ci0gICAgTE9HX0lORk8oIlNraXBwaW5nIFJDIGNyZWF0aW9uIGZvciB0aGUgb2xkIEFWUkNQIHByb2ZpbGUiKTsKLSAgICByZXR1cm4gQlRBX0FWX1JDX0hBTkRMRV9OT05FOwotICB9Ci0KLSAgdEFWUkNfQ09OTl9DQiBjY2I7Ci0gIFJhd0FkZHJlc3MgYmRhID0gUmF3QWRkcmVzczo6a0FueTsKLSAgdWludDhfdCBzdGF0dXMgPSBCVEFfQVZfUkNfUk9MRV9BQ1A7Ci0gIGludCBpOwotICB1aW50OF90IHJjX2hhbmRsZTsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiOwotCi0gIGlmIChyb2xlID09IEFWQ1RfSU5UKSB7Ci0gICAgLy8gQ2FuJ3QgZ3JhYiBhIHN0cmVhbSBjb250cm9sIGJsb2NrIHRoYXQgZG9lc24ndCBoYXZlIGEgdmFsaWQgaGFuZGxlCi0gICAgaWYgKCFzaGRsKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICIlczogQ2FuJ3QgZ3JhYiBzdHJlYW0gY29udHJvbCBibG9jayBmb3Igc2hkbCA9ICVkIC0+IGluZGV4ID0gJWQiLAotICAgICAgICAgIF9fZnVuY19fLCBzaGRsLCBzaGRsIC0gMSk7Ci0gICAgICByZXR1cm4gQlRBX0FWX1JDX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICB0QlRBX0FWX1NDQiogcF9zY2IgPSBwX2NiLT5wX3NjYltzaGRsIC0gMV07Ci0gICAgYmRhID0gcF9zY2ItPlBlZXJBZGRyZXNzKCk7Ci0gICAgc3RhdHVzID0gQlRBX0FWX1JDX1JPTEVfSU5UOwotICB9IGVsc2UgewotICAgIHBfcmNiID0gYnRhX2F2X2dldF9yY2JfYnlfc2hkbChzaGRsKTsKLSAgICBpZiAocF9yY2IgIT0gTlVMTCkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEFDUCBoYW5kbGUgZXhpc3QgZm9yIHNoZGw6JWQiLCBfX2Z1bmNfXywgc2hkbCk7Ci0gICAgICBwX3JjYi0+bGlkeCA9IGxpZHg7Ci0gICAgICByZXR1cm4gcF9yY2ItPmhhbmRsZTsKLSAgICB9Ci0gIH0KLQotICBjY2IuY3RybF9jYmFjayA9IGJhc2U6OkJpbmQoYnRhX2F2X3JjX2N0cmxfY2JhY2spOwotICBjY2IubXNnX2NiYWNrID0gYmFzZTo6QmluZChidGFfYXZfcmNfbXNnX2NiYWNrKTsKLSAgY2NiLmNvbXBhbnlfaWQgPSBwX2J0YV9hdl9jZmctPmNvbXBhbnlfaWQ7Ci0gIGNjYi5jb25uID0gcm9sZTsKLSAgLyogbm90ZTogQlRBX0FWX0ZFQVRfUkNURyA9IEFWUkNfQ1RfVEFSR0VULCBCVEFfQVZfRkVBVF9SQ0NUID0gQVZSQ19DVF9DT05UUk9MCi0gICAqLwotICBjY2IuY29udHJvbCA9IHBfY2ItPmZlYXR1cmVzICYgKEJUQV9BVl9GRUFUX1JDVEcgfCBCVEFfQVZfRkVBVF9SQ0NUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQVZfRkVBVF9NRVRBREFUQSB8IEFWUkNfQ1RfUEFTU0lWRSk7Ci0KLSAgaWYgKEFWUkNfT3BlbigmcmNfaGFuZGxlLCAmY2NiLCBiZGEpICE9IEFWUkNfU1VDQ0VTUykKLSAgICByZXR1cm4gQlRBX0FWX1JDX0hBTkRMRV9OT05FOwotCi0gIGkgPSByY19oYW5kbGU7Ci0gIHBfcmNiID0gJnBfY2ItPnJjYltpXTsKLQotICBpZiAocF9yY2ItPmhhbmRsZSAhPSBCVEFfQVZfUkNfSEFORExFX05PTkUpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogZm91bmQgZHVwbGljYXRlZCBoYW5kbGU6JWQiLCBfX2Z1bmNfXywgcmNfaGFuZGxlKTsKLSAgfQotCi0gIHBfcmNiLT5oYW5kbGUgPSByY19oYW5kbGU7Ci0gIHBfcmNiLT5zdGF0dXMgPSBzdGF0dXM7Ci0gIHBfcmNiLT5zaGRsID0gc2hkbDsKLSAgcF9yY2ItPmxpZHggPSBsaWR4OwotICBwX3JjYi0+cGVlcl9mZWF0dXJlcyA9IDA7Ci0gIHBfcmNiLT5jb3Zlcl9hcnRfcHNtID0gMDsKLSAgaWYgKGxpZHggPT0gKEJUQV9BVl9OVU1fTElOS1MgKyAxKSkgewotICAgIC8qIHRoaXMgTElEWCBpcyByZXNlcnZlZCBmb3IgdGhlIEFWUkNQIEFDUCBjb25uZWN0aW9uICovCi0gICAgcF9jYi0+cmNfYWNwX2hhbmRsZSA9IHBfcmNiLT5oYW5kbGU7Ci0gICAgcF9jYi0+cmNfYWNwX2lkeCA9IChpICsgMSk7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJjX2FjcF9oYW5kbGU6JWQgaWR4OiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2NiLT5yY19hY3BfaGFuZGxlLCBwX2NiLT5yY19hY3BfaWR4KTsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBjcmVhdGUgJWQsIHJvbGU6ICVkLCBzaGRsOiVkLCByY19oYW5kbGU6JWQsIGxpZHg6JWQsIHN0YXR1czoweCV4IiwKLSAgICAgIF9fZnVuY19fLCBpLCByb2xlLCBzaGRsLCBwX3JjYi0+aGFuZGxlLCBsaWR4LCBwX3JjYi0+c3RhdHVzKTsKLQotICByZXR1cm4gcmNfaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3ZhbGlkX2dyb3VwX25hdmlfbXNnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiBpdCBpcyBHcm91cCBOYXZpZ2F0aW9uIE1zZyBmb3IgTWV0YWRhdGEKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfUlNQX0FDQ0VQVCBvciBBVlJDX1JTUF9OT1RfSU1QTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUQV9BVl9DT0RFIGJ0YV9hdl9ncm91cF9uYXZpX3N1cHBvcnRlZCh1aW50OF90IGxlbiwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbnF1aXJ5KSB7Ci0gIHRCVEFfQVZfQ09ERSByZXQgPSBBVlJDX1JTUF9OT1RfSU1QTDsKLSAgdWludDhfdCogcF9wdHIgPSBwX2RhdGE7Ci0gIHVpbnQxNl90IHUxNjsKLSAgdWludDMyX3QgdTMyOwotCi0gIGlmIChwX2J0YV9hdl9jZmctPmF2cmNfZ3JvdXAgJiYgbGVuID09IEJUQV9HUk9VUF9OQVZJX01TR19PUF9EQVRBX0xFTikgewotICAgIEJUQV9BVl9CRV9TVFJFQU1fVE9fQ09fSUQodTMyLCBwX3B0cik7Ci0gICAgQkVfU1RSRUFNX1RPX1VJTlQxNih1MTYsIHBfcHRyKTsKLQotICAgIGlmICh1MzIgPT0gQVZSQ19DT19NRVRBREFUQSkgewotICAgICAgaWYgKGlzX2lucXVpcnkpIHsKLSAgICAgICAgaWYgKHUxNiA8PSBBVlJDX1BEVV9QUkVWX0dST1VQKSByZXQgPSBBVlJDX1JTUF9JTVBMX1NUQkw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAodTE2IDw9IEFWUkNfUERVX1BSRVZfR1JPVVApCi0gICAgICAgICAgcmV0ID0gQVZSQ19SU1BfQUNDRVBUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0ID0gQVZSQ19SU1BfUkVKOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfb3Bfc3VwcG9ydGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiByZW1vdGUgY29udHJvbCBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19SU1BfQUNDRVBUIG9mIHN1cHBvcnRlZCwgQVZSQ19SU1BfTk9UX0lNUEwgaWYgbm90LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUQV9BVl9DT0RFIGJ0YV9hdl9vcF9zdXBwb3J0ZWQodEJUQV9BVl9SQyByY19pZCwgYm9vbCBpc19pbnF1aXJ5KSB7Ci0gIHRCVEFfQVZfQ09ERSByZXRfY29kZSA9IEFWUkNfUlNQX05PVF9JTVBMOwotCi0gIGlmIChwX2J0YV9hdl9yY19pZCkgewotICAgIGlmIChpc19pbnF1aXJ5KSB7Ci0gICAgICBpZiAocF9idGFfYXZfcmNfaWRbcmNfaWQgPj4gNF0gJiAoMSA8PCAocmNfaWQgJiAweDBGKSkpIHsKLSAgICAgICAgcmV0X2NvZGUgPSBBVlJDX1JTUF9JTVBMX1NUQkw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChwX2J0YV9hdl9yY19pZFtyY19pZCA+PiA0XSAmICgxIDw8IChyY19pZCAmIDB4MEYpKSkgewotICAgICAgICByZXRfY29kZSA9IEFWUkNfUlNQX0FDQ0VQVDsKLSAgICAgIH0gZWxzZSBpZiAoKHBfYnRhX2F2X2NmZy0+cmNfcGFzc19yc3AgPT0gQVZSQ19SU1BfSU5URVJJTSkgJiYKLSAgICAgICAgICAgICAgICAgcF9idGFfYXZfcmNfaWRfYWMpIHsKLSAgICAgICAgaWYgKHBfYnRhX2F2X3JjX2lkX2FjW3JjX2lkID4+IDRdICYgKDEgPDwgKHJjX2lkICYgMHgwRikpKSB7Ci0gICAgICAgICAgcmV0X2NvZGUgPSBBVlJDX1JTUF9JTlRFUklNOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXRfY29kZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9maW5kX2xjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gQkRfYWRkciwgZmluZCB0aGUgYXNzb2NpYXRlZCBMQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOVUxMLCBpZiBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQVZfTENCKiBidGFfYXZfZmluZF9sY2IoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCBvcCkgewotICB0QlRBX0FWX0NCKiBwX2NiID0gJmJ0YV9hdl9jYjsKLSAgaW50IHh4OwotICB1aW50OF90IG1hc2s7Ci0gIHRCVEFfQVZfTENCKiBwX2xjYiA9IE5VTEw7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGFkZHJlc3M6ICVzIG9wOiVkIiwgX19mdW5jX18sIGFkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIG9wKTsKLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0FWX05VTV9MSU5LUzsgeHgrKykgewotICAgIG1hc2sgPSAxIDw8IHh4OyAvKiB0aGUgdXNlZCBtYXNrIGZvciB0aGlzIGxjYiAqLwotICAgIGlmICgobWFzayAmIHBfY2ItPmNvbm5fbGNiKSAmJiBwX2NiLT5sY2JbeHhdLmFkZHIgPT0gYWRkcikgewotICAgICAgcF9sY2IgPSAmcF9jYi0+bGNiW3h4XTsKLSAgICAgIGlmIChvcCA9PSBCVEFfQVZfTENCX0ZSRUUpIHsKLSAgICAgICAgcF9jYi0+Y29ubl9sY2IgJj0gfm1hc2s7IC8qIGNsZWFyIHRoZSBjb25uZWN0IG1hc2sgKi8KLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvbm5fbGNiOiAweCV4IiwgX19mdW5jX18sIHBfY2ItPmNvbm5fbGNiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcF9sY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfb3BlbmVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgQVZSQ1Agc3RhdGUgdG8gb3BlbmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY19vcGVuZWQodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9SQ19PUEVOIHJjX29wZW47Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYjsKLSAgaW50IGk7Ci0gIHVpbnQ4X3Qgc2hkbCA9IDA7Ci0gIHRCVEFfQVZfTENCKiBwX2xjYjsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiOwotICB1aW50OF90IHRtcDsKLSAgdWludDhfdCBkaXNjID0gMDsKLQotICAvKiBmaW5kIHRoZSBTQ0IgJiBzdG9wIHRoZSB0aW1lciAqLwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FWX05VTV9TVFJTOyBpKyspIHsKLSAgICBwX3NjYiA9IHBfY2ItPnBfc2NiW2ldOwotICAgIGlmIChwX3NjYiAmJiBwX3NjYi0+UGVlckFkZHJlc3MoKSA9PSBwX2RhdGEtPnJjX2Nvbm5fY2hnLnBlZXJfYWRkcikgewotICAgICAgcF9zY2ItPnJjX2hhbmRsZSA9IHBfZGF0YS0+cmNfY29ubl9jaGcuaGFuZGxlOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNoZGw6JWQsIHNyY2ggJWQiLCBfX2Z1bmNfXywgaSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5yY19oYW5kbGUpOwotICAgICAgc2hkbCA9IGkgKyAxOwotICAgICAgTE9HX0lORk8oIiVzOiBhbGxvdyBpbmNvbWluZyBBVlJDUCBjb25uZWN0aW9uczolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgcF9zY2ItPnVzZV9yYyk7Ci0gICAgICBhbGFybV9jYW5jZWwocF9zY2ItPmF2cmNfY3RfdGltZXIpOwotICAgICAgZGlzYyA9IHBfc2NiLT5obmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaSA9IHBfZGF0YS0+cmNfY29ubl9jaGcuaGFuZGxlOwotICBpZiAocF9jYi0+cmNiW2ldLmhhbmRsZSA9PSBCVEFfQVZfUkNfSEFORExFX05PTkUpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogbm90IGEgdmFsaWQgaGFuZGxlOiVkIGFueSBtb3JlIiwgX19mdW5jX18sIGkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsb2NhbCBmZWF0dXJlcyAlZCBwZWVyIGZlYXR1cmVzICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9jYi0+ZmVhdHVyZXMsIHBfY2ItPnJjYltpXS5wZWVyX2ZlYXR1cmVzKTsKLQotICAvKiBsaXN0ZW4gdG8gYnJvd3NpbmcgY2hhbm5lbCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4sCi0gICAqIGlmIHBlZXIgaW5pdGlhdGVkIEFWUkNQIGNvbm5lY3Rpb24gYW5kIGxvY2FsIGRldmljZSBzdXBwb3J0cyBicm93c2luZwotICAgKiBjaGFubmVsICovCi0gIEFWUkNfT3BlbkJyb3dzZShwX2RhdGEtPnJjX2Nvbm5fY2hnLmhhbmRsZSwgQVZDVF9BQ1ApOwotCi0gIGlmIChwX2NiLT5yY2JbaV0ubGlkeCA9PSAoQlRBX0FWX05VTV9MSU5LUyArIDEpICYmIHNoZGwgIT0gMCkgewotICAgIC8qIHJjIGlzIG9wZW5lZCBvbiB0aGUgUkMgb25seSBBQ1AgY2hhbm5lbCwgYnV0IGlzIGZvciBhIHNwZWNpZmljCi0gICAgICogU0NCIC0+IG5lZWQgdG8gc3dpdGNoIFJDQnMgKi8KLSAgICBwX3JjYiA9IGJ0YV9hdl9nZXRfcmNiX2J5X3NoZGwoc2hkbCk7Ci0gICAgaWYgKHBfcmNiKSB7Ci0gICAgICBwX3JjYi0+c2hkbCA9IHBfY2ItPnJjYltpXS5zaGRsOwotICAgICAgdG1wID0gcF9yY2ItPmxpZHg7Ci0gICAgICBwX3JjYi0+bGlkeCA9IHBfY2ItPnJjYltpXS5saWR4OwotICAgICAgcF9jYi0+cmNiW2ldLmxpZHggPSB0bXA7Ci0gICAgICBwX2NiLT5yY19hY3BfaGFuZGxlID0gcF9yY2ItPmhhbmRsZTsKLSAgICAgIHBfY2ItPnJjX2FjcF9pZHggPSAocF9yY2IgLSBwX2NiLT5yY2IpICsgMTsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzd2l0Y2hpbmcgUkNCIHJjX2FjcF9oYW5kbGU6JWQgaWR4OiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnJjX2FjcF9oYW5kbGUsIHBfY2ItPnJjX2FjcF9pZHgpOwotICAgIH0KLSAgfQotCi0gIHBfY2ItPnJjYltpXS5zaGRsID0gc2hkbDsKLSAgcmNfb3Blbi5yY19oYW5kbGUgPSBpOwotICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcmNiWyVkXSBzaGRsOiVkIGxpZHg6JWQvJWQiLCBfX2Z1bmNfXywgaSwgc2hkbCwKLSAgICAgICAgICAgICAgICAgICBwX2NiLT5yY2JbaV0ubGlkeCwgcF9jYi0+bGNiW0JUQV9BVl9OVU1fTElOS1NdLmxpZHgpOwotICBwX2NiLT5yY2JbaV0uc3RhdHVzIHw9IEJUQV9BVl9SQ19DT05OX01BU0s7Ci0KLSAgaWYgKCFzaGRsICYmIDAgPT0gcF9jYi0+bGNiW0JUQV9BVl9OVU1fTElOS1NdLmxpZHgpIHsKLSAgICAvKiBubyBhc3NvY2lhdGVkIFNDQiAtPiBjb25uZWN0ZWQgdG8gYW4gUkMgb25seSBkZXZpY2UKLSAgICAgKiB1cGRhdGUgdGhlIGluZGV4IHRvIHRoZSBleHRyYSBMQ0IgKi8KLSAgICBwX2xjYiA9ICZwX2NiLT5sY2JbQlRBX0FWX05VTV9MSU5LU107Ci0gICAgcF9sY2ItPmFkZHIgPSBwX2RhdGEtPnJjX2Nvbm5fY2hnLnBlZXJfYWRkcjsKLSAgICBwX2xjYi0+bGlkeCA9IEJUQV9BVl9OVU1fTElOS1MgKyAxOwotICAgIHBfY2ItPnJjYltpXS5saWR4ID0gcF9sY2ItPmxpZHg7Ci0gICAgcF9sY2ItPmNvbm5fbXNrID0gMTsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogYmRfYWRkcjogJXMgcmNiWyVkXS5saWR4PSVkLCBsY2IuY29ubl9tc2s9eCV4IiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2xjYi0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGksCi0gICAgICAgICAgICAgICAgICAgICBwX2NiLT5yY2JbaV0ubGlkeCwgcF9sY2ItPmNvbm5fbXNrKTsKLSAgICBkaXNjID0gcF9kYXRhLT5yY19jb25uX2NoZy5oYW5kbGUgfCBCVEFfQVZfQ0hOTF9NU0s7Ci0gIH0KLQotICByY19vcGVuLnBlZXJfYWRkciA9IHBfZGF0YS0+cmNfY29ubl9jaGcucGVlcl9hZGRyOwotICByY19vcGVuLnBlZXJfZmVhdHVyZXMgPSBwX2NiLT5yY2JbaV0ucGVlcl9mZWF0dXJlczsKLSAgcmNfb3Blbi5jb3Zlcl9hcnRfcHNtID0gcF9jYi0+cmNiW2ldLmNvdmVyX2FydF9wc207Ci0gIHJjX29wZW4uc3RhdHVzID0gQlRBX0FWX1NVQ0NFU1M7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsb2NhbCBmZWF0dXJlczp4JXggcGVlcl9mZWF0dXJlczp4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX2NiLT5mZWF0dXJlcywgcmNfb3Blbi5wZWVyX2ZlYXR1cmVzKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvdmVyIGFydCBwc206eCV4IiwgX19mdW5jX18sIHJjX29wZW4uY292ZXJfYXJ0X3BzbSk7Ci0gIGlmIChyY19vcGVuLnBlZXJfZmVhdHVyZXMgPT0gMCkgewotICAgIC8qIHdlIGhhdmUgbm90IGRvbmUgU0RQIG9uIHBlZXIgUkMgY2FwYWJpbGl0aWVzLgotICAgICAqIHBlZXIgbXVzdCBoYXZlIGluaXRpYXRlZCB0aGUgUkMgY29ubmVjdGlvbiAqLwotICAgIGlmIChwX2NiLT5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpCi0gICAgICByY19vcGVuLnBlZXJfZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfUkNURzsKLSAgICBpZiAocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKQotICAgICAgcmNfb3Blbi5wZWVyX2ZlYXR1cmVzIHw9IEJUQV9BVl9GRUFUX1JDQ1Q7Ci0KLSAgICBidGFfYXZfcmNfZGlzYyhkaXNjKTsKLSAgfQotICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICBidGFfYXZfZGF0YS5yY19vcGVuID0gcmNfb3BlbjsKLSAgKCpwX2NiLT5wX2NiYWNrKShCVEFfQVZfUkNfT1BFTl9FVlQsICZidGFfYXZfZGF0YSk7Ci0KLSAgLyogaWYgbG9jYWwgaW5pdGlhdGVkIEFWUkNQIGNvbm5lY3Rpb24gYW5kIGJvdGggcGVlciBhbmQgbG9jYWxzIGRldmljZSBzdXBwb3J0Ci0gICAqIGJyb3dzaW5nIGNoYW5uZWwsIG9wZW4gdGhlIGJyb3dzaW5nIGNoYW5uZWwgbm93Ci0gICAqIFRPRE8gKHNhbmtldGEpOiBTb21lIFRHIHdvdWxkIG5vdCBicm9hZGNhc3QgYnJvd3NlIGZlYXR1cmUgaGVuY2UgY2hlY2sKLSAgICogaW50ZXItb3AuICovCi0gIGlmICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9CUk9XU0UpICYmCi0gICAgICAocmNfb3Blbi5wZWVyX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQlJPV1NFKSAmJgotICAgICAgKChwX2NiLT5yY2JbaV0uc3RhdHVzICYgQlRBX0FWX1JDX1JPTEVfTUFTSykgPT0gQlRBX0FWX1JDX1JPTEVfSU5UKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBvcGVuaW5nIEFWUkMgQnJvd3NlIGNoYW5uZWwiLCBfX2Z1bmNfXyk7Ci0gICAgQVZSQ19PcGVuQnJvd3NlKHBfZGF0YS0+cmNfY29ubl9jaGcuaGFuZGxlLCBBVkNUX0lOVCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY19yZW1vdGVfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIEFWUkNQIHJlbW90ZSBjb250cm9sIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX3JlbW90ZV9jbWQodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiOwotICBpZiAocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ0NUKSB7Ci0gICAgaWYgKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljIDwgQlRBX0FWX05VTV9SQ0IpIHsKLSAgICAgIHBfcmNiID0gJnBfY2ItPnJjYltwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpY107Ci0gICAgICBpZiAocF9yY2ItPnN0YXR1cyAmIEJUQV9BVl9SQ19DT05OX01BU0spIHsKLSAgICAgICAgQVZSQ19QYXNzQ21kKHBfcmNiLT5oYW5kbGUsIHBfZGF0YS0+YXBpX3JlbW90ZV9jbWQubGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5hcGlfcmVtb3RlX2NtZC5tc2cpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX3ZlbmRvcl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gQVZSQ1AgdmVuZG9yIHNwZWNpZmljIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX3ZlbmRvcl9jbWQodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiOwotICBpZiAoKHBfY2ItPmZlYXR1cmVzICYgKEJUQV9BVl9GRUFUX1JDQ1QgfCBCVEFfQVZfRkVBVF9WRU5ET1IpKSA9PQotICAgICAgKEJUQV9BVl9GRUFUX1JDQ1QgfCBCVEFfQVZfRkVBVF9WRU5ET1IpKSB7Ci0gICAgaWYgKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljIDwgQlRBX0FWX05VTV9SQ0IpIHsKLSAgICAgIHBfcmNiID0gJnBfY2ItPnJjYltwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpY107Ci0gICAgICBBVlJDX1ZlbmRvckNtZChwX3JjYi0+aGFuZGxlLCBwX2RhdGEtPmFwaV92ZW5kb3IubGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5hcGlfdmVuZG9yLm1zZyk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfdmVuZG9yX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBBVlJDUCB2ZW5kb3Igc3BlY2lmaWMgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX3ZlbmRvcl9yc3AodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9SQ0IqIHBfcmNiOwotICBpZiAoKHBfY2ItPmZlYXR1cmVzICYgKEJUQV9BVl9GRUFUX1JDVEcgfCBCVEFfQVZfRkVBVF9WRU5ET1IpKSA9PQotICAgICAgKEJUQV9BVl9GRUFUX1JDVEcgfCBCVEFfQVZfRkVBVF9WRU5ET1IpKSB7Ci0gICAgaWYgKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljIDwgQlRBX0FWX05VTV9SQ0IpIHsKLSAgICAgIHBfcmNiID0gJnBfY2ItPnJjYltwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpY107Ci0gICAgICBBVlJDX1ZlbmRvclJzcChwX3JjYi0+aGFuZGxlLCBwX2RhdGEtPmFwaV92ZW5kb3IubGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5hcGlfdmVuZG9yLm1zZyk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfbWV0YV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gQVZSQ1AgbWV0YWRhdGEvYWR2YW5jZWQgY29udHJvbCBjb21tYW5kL3Jlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY19tZXRhX3JzcCh0QlRBX0FWX0NCKiBwX2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX1JDQiogcF9yY2I7Ci0gIGJvb2wgZG9fZnJlZSA9IHRydWU7Ci0KLSAgaWYgKChwX2NiLT5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX01FVEFEQVRBKSAmJgotICAgICAgKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljIDwgQlRBX0FWX05VTV9SQ0IpKSB7Ci0gICAgaWYgKChwX2RhdGEtPmFwaV9tZXRhX3JzcC5pc19yc3AgJiYgKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNURykpIHx8Ci0gICAgICAgICghcF9kYXRhLT5hcGlfbWV0YV9yc3AuaXNfcnNwICYmIChwX2NiLT5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpKSkgewotICAgICAgcF9yY2IgPSAmcF9jYi0+cmNiW3BfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljXTsKLSAgICAgIGlmIChwX3JjYi0+aGFuZGxlICE9IEJUQV9BVl9SQ19IQU5ETEVfTk9ORSkgewotICAgICAgICBBVlJDX01zZ1JlcShwX3JjYi0+aGFuZGxlLCBwX2RhdGEtPmFwaV9tZXRhX3JzcC5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfbWV0YV9yc3AucnNwX2NvZGUsIHBfZGF0YS0+YXBpX21ldGFfcnNwLnBfcGt0KTsKLSAgICAgICAgZG9fZnJlZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChkb19mcmVlKSBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5hcGlfbWV0YV9yc3AucF9wa3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX2ZyZWVfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmcmVlIGFuIEFWUkNQIG1ldGFkYXRhIGNvbW1hbmQgYnVmZmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY19mcmVlX3JzcChVTlVTRURfQVRUUiB0QlRBX0FWX0NCKiBwX2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5hcGlfbWV0YV9yc3AucF9wa3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX2ZyZWVfYnJvd3NlX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZnJlZSBhbiBBVlJDUCBicm93c2UgbWVzc2FnZSBidWZmZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX2ZyZWVfYnJvd3NlX21zZyhVTlVTRURfQVRUUiB0QlRBX0FWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIGlmIChwX2RhdGEtPnJjX21zZy5vcGNvZGUgPT0gQVZSQ19PUF9CUk9XU0UpIHsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5yY19tc2cubXNnLmJyb3dzZS5wX2Jyb3dzZV9wa3QpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY2hrX25vdGlmX2V2dF9pZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgbWFrZSBzdXJlIHRoZSByZXF1ZXN0ZWQgcGxheWVyIGlkIGlzIHZhbGlkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0FWX1NUU19OT19SU1AsIGlmIG5vIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYnRhX2F2X2Noa19ub3RpZl9ldnRfaWQodEFWUkNfTVNHX1ZFTkRPUiogcF92ZW5kb3IpIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEJUQV9BVl9TVFNfTk9fUlNQOwotICB1aW50OF90IHh4OwotICB1aW50MTZfdCB1MTY7Ci0gIHVpbnQ4X3QqIHAgPSBwX3ZlbmRvci0+cF92ZW5kb3JfZGF0YSArIDI7Ci0KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNih1MTYsIHApOwotICAvKiBkb3VibGUgY2hlY2sgdGhlIGZpeGVkIGxlbmd0aCAqLwotICBpZiAoKHUxNiAhPSA1KSB8fCAocF92ZW5kb3ItPnZlbmRvcl9sZW4gIT0gOSkpIHsKLSAgICBzdGF0dXMgPSBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gIH0gZWxzZSB7Ci0gICAgLyogbWFrZSBzdXJlIHRoZSBwbGF5ZXJfaWQgaXMgdmFsaWQgKi8KLSAgICBmb3IgKHh4ID0gMDsgeHggPCBwX2J0YV9hdl9jZmctPm51bV9ldnRfaWRzOyB4eCsrKSB7Ci0gICAgICBpZiAoKnAgPT0gcF9idGFfYXZfY2ZnLT5wX21ldGFfZXZ0X2lkc1t4eF0pIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh4eCA9PSBwX2J0YV9hdl9jZmctPm51bV9ldnRfaWRzKSB7Ci0gICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9wcm9jX21ldGFfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGFuIEFWUkNQIG1ldGFkYXRhIGNvbW1hbmQgZnJvbSB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgdG8gcmVzcG9uZCBpbW1lZGlhdGVseQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0FWX0VWVCBidGFfYXZfcHJvY19tZXRhX2NtZCh0QVZSQ19SRVNQT05TRSogcF9yY19yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1JDX01TRyogcF9tc2csIHVpbnQ4X3QqIHBfY3R5cGUpIHsKLSAgdEJUQV9BVl9FVlQgZXZ0ID0gQlRBX0FWX01FVEFfTVNHX0VWVDsKLSAgdWludDhfdCB1OCwgcGR1LCAqcDsKLSAgdWludDE2X3QgdTE2OwotICB0QVZSQ19NU0dfVkVORE9SKiBwX3ZlbmRvciA9ICZwX21zZy0+bXNnLnZlbmRvcjsKLQotICBwZHUgPSAqKHBfdmVuZG9yLT5wX3ZlbmRvcl9kYXRhKTsKLSAgcF9yY19yc3AtPnBkdSA9IHBkdTsKLSAgKnBfY3R5cGUgPSBBVlJDX1JTUF9SRUo7Ci0KLSAgLyogQ2hlY2sgdG8gYW5zdXJlIGEgIHZhbGlkIG1pbmltdW0gbWV0YSBkYXRhIGxlbmd0aCAqLwotICBpZiAoKEFWUkNfTUlOX01FVEFfQ01EX0xFTiArIHBfdmVuZG9yLT52ZW5kb3JfbGVuKSA+IEFWUkNfTUVUQV9DTURfQlVGX1NJWkUpIHsKLSAgICAvKiByZWplY3QgaXQgKi8KLSAgICBwX3JjX3JzcC0+cnNwLnN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBtZXRhLWNvbW1hbmQgbGVuZ3RoOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF92ZW5kb3ItPnZlbmRvcl9sZW4pOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogTWV0YWRhdGEgbWVzc2FnZXMgb25seSB1c2UgUEFORUwgc3ViLXVuaXQgdHlwZSAqLwotICBpZiAocF92ZW5kb3ItPmhkci5zdWJ1bml0X3R5cGUgIT0gQVZSQ19TVUJfUEFORUwpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU1VCVU5JVCBtdXN0IGJlIFBBTkVMIiwgX19mdW5jX18pOwotICAgIC8qIHJlamVjdCBpdCAqLwotICAgIGV2dCA9IDA7Ci0gICAgcF92ZW5kb3ItPmhkci5jdHlwZSA9IEFWUkNfUlNQX05PVF9JTVBMOwotICAgIHBfdmVuZG9yLT52ZW5kb3JfbGVuID0gMDsKLSAgICBwX3JjX3JzcC0+cnNwLnN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgfSBlbHNlIGlmICghQVZSQ19Jc1ZhbGlkQXZjVHlwZShwZHUsIHBfdmVuZG9yLT5oZHIuY3R5cGUpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEludmFsaWQgcGR1L2N0eXBlOiAweCV4LCAlZCIsIF9fZnVuY19fLCBwZHUsCi0gICAgICAgICAgICAgICAgICAgICBwX3ZlbmRvci0+aGRyLmN0eXBlKTsKLSAgICAvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlIHdpdGhvdXQgcmVwb3J0aW5nIHRvIGFwcCAqLwotICAgIGV2dCA9IDA7Ci0gICAgcF9yY19yc3AtPnJzcC5zdGF0dXMgPSBBVlJDX1NUU19CQURfQ01EOwotICB9IGVsc2UgewotICAgIHN3aXRjaCAocGR1KSB7Ci0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9DQVBBQklMSVRJRVM6Ci0gICAgICAgIC8qIHByb2Nlc3MgR2V0Q2FwYWJpbGl0aWVzIGNvbW1hbmQgd2l0aG91dCByZXBvcnRpbmcgdGhlIGV2ZW50IHRvIGFwcCAqLwotICAgICAgICBldnQgPSAwOwotICAgICAgICBpZiAocF92ZW5kb3ItPnZlbmRvcl9sZW4gIT0gNSkgewotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExODkzOTUxIik7Ci0gICAgICAgICAgcF9yY19yc3AtPmdldF9jYXBzLnN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1OCA9ICoocF92ZW5kb3ItPnBfdmVuZG9yX2RhdGEgKyA0KTsKLSAgICAgICAgcCA9IHBfdmVuZG9yLT5wX3ZlbmRvcl9kYXRhICsgMjsKLSAgICAgICAgcF9yY19yc3AtPmdldF9jYXBzLmNhcGFiaWxpdHlfaWQgPSB1ODsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNih1MTYsIHApOwotICAgICAgICBpZiAodTE2ICE9IDEpIHsKLSAgICAgICAgICBwX3JjX3JzcC0+Z2V0X2NhcHMuc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfcmNfcnNwLT5nZXRfY2Fwcy5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgICAgICAgICBpZiAodTggPT0gQVZSQ19DQVBfQ09NUEFOWV9JRCkgewotICAgICAgICAgICAgKnBfY3R5cGUgPSBBVlJDX1JTUF9JTVBMX1NUQkw7Ci0gICAgICAgICAgICBwX3JjX3JzcC0+Z2V0X2NhcHMuY291bnQgPSBwX2J0YV9hdl9jZmctPm51bV9jb19pZHM7Ci0gICAgICAgICAgICBtZW1jcHkocF9yY19yc3AtPmdldF9jYXBzLnBhcmFtLmNvbXBhbnlfaWQsCi0gICAgICAgICAgICAgICAgICAgcF9idGFfYXZfY2ZnLT5wX21ldGFfY29faWRzLAotICAgICAgICAgICAgICAgICAgIChwX2J0YV9hdl9jZmctPm51bV9jb19pZHMgPDwgMikpOwotICAgICAgICAgIH0gZWxzZSBpZiAodTggPT0gQVZSQ19DQVBfRVZFTlRTX1NVUFBPUlRFRCkgewotICAgICAgICAgICAgKnBfY3R5cGUgPSBBVlJDX1JTUF9JTVBMX1NUQkw7Ci0gICAgICAgICAgICBwX3JjX3JzcC0+Z2V0X2NhcHMuY291bnQgPSBwX2J0YV9hdl9jZmctPm51bV9ldnRfaWRzOwotICAgICAgICAgICAgbWVtY3B5KHBfcmNfcnNwLT5nZXRfY2Fwcy5wYXJhbS5ldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICBwX2J0YV9hdl9jZmctPnBfbWV0YV9ldnRfaWRzLCBwX2J0YV9hdl9jZmctPm51bV9ldnRfaWRzKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEludmFsaWQgY2FwYWJpbGl0eSBJRDogMHgleCIsIF9fZnVuY19fLCB1OCk7Ci0gICAgICAgICAgICAvKiByZWplY3QgLSB1bmtub3duIGNhcGFiaWxpdHkgSUQgKi8KLSAgICAgICAgICAgIHBfcmNfcnNwLT5nZXRfY2Fwcy5zdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjoKLSAgICAgICAgLyogbWFrZSBzdXJlIHRoZSBldmVudF9pZCBpcyBpbXBsZW1lbnRlZCAqLwotICAgICAgICBwX3JjX3JzcC0+cnNwLnN0YXR1cyA9IGJ0YV9hdl9jaGtfbm90aWZfZXZ0X2lkKHBfdmVuZG9yKTsKLSAgICAgICAgaWYgKHBfcmNfcnNwLT5yc3Auc3RhdHVzICE9IEJUQV9BVl9TVFNfTk9fUlNQKSBldnQgPSAwOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZXZ0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBhbiBBVlJDUCBtZXNzYWdlIGZyb20gdGhlIHBlZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX21zZyh0QlRBX0FWX0NCKiBwX2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX0VWVCBldnQgPSAwOwotICB0QlRBX0FWIGF2OwotICBCVF9IRFIqIHBfcGt0ID0gTlVMTDsKLSAgdEFWUkNfTVNHX1ZFTkRPUiogcF92ZW5kb3IgPSAmcF9kYXRhLT5yY19tc2cubXNnLnZlbmRvcjsKLSAgYm9vbCBpc19pbnF1aXJ5ID0gKChwX2RhdGEtPnJjX21zZy5tc2cuaGRyLmN0eXBlID09IEFWUkNfQ01EX1NQRUNfSU5RKSB8fAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSA9PSBBVlJDX0NNRF9HRU5fSU5RKTsKLSAgdWludDhfdCBjdHlwZSA9IDA7Ci0gIHRBVlJDX1JFU1BPTlNFIHJjX3JzcDsKLQotICByY19yc3AucnNwLnN0YXR1cyA9IEJUQV9BVl9TVFNfTk9fUlNQOwotCi0gIGlmIChOVUxMID09IHBfZGF0YSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBNZXNzYWdlIGZyb20gcGVlciB3aXRoIG5vIGRhdGEiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG9wY29kZT0leCwgY3R5cGU9JXgiLCBfX2Z1bmNfXywgcF9kYXRhLT5yY19tc2cub3Bjb2RlLAotICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUpOwotCi0gIGlmIChwX2RhdGEtPnJjX21zZy5vcGNvZGUgPT0gQVZSQ19PUF9QQVNTX1RIUlUpIHsKLSAgICAvKiBpZiB0aGlzIGlzIGEgcGFzcyB0aHJ1IGNvbW1hbmQgKi8KLSAgICBpZiAoKHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPT0gQVZSQ19DTURfQ1RSTCkgfHwKLSAgICAgICAgKHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPT0gQVZSQ19DTURfU1BFQ19JTlEpIHx8Ci0gICAgICAgIChwX2RhdGEtPnJjX21zZy5tc2cuaGRyLmN0eXBlID09IEFWUkNfQ01EX0dFTl9JTlEpKSB7Ci0gICAgICAvKiBjaGVjayBpZiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkICovCi0gICAgICBjaGFyIGF2cmNwX2N0X3N1cHBvcnRbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgIG9zaV9wcm9wZXJ0eV9nZXQoImJsdWV0b290aC5wdHMuYXZyY3BfY3Quc3VwcG9ydCIsIGF2cmNwX2N0X3N1cHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpOwotICAgICAgaWYgKHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLm9wX2lkID09IEFWUkNfSURfVkVORE9SKSB7Ci0gICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPSBBVlJDX1JTUF9OT1RfSU1QTDsKLSAgICAgICAgaWYgKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfTUVUQURBVEEpCi0gICAgICAgICAgcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSA9IGJ0YV9hdl9ncm91cF9uYXZpX3N1cHBvcnRlZCgKLSAgICAgICAgICAgICAgcF9kYXRhLT5yY19tc2cubXNnLnBhc3MucGFzc19sZW4sCi0gICAgICAgICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLnBfcGFzc19kYXRhLCBpc19pbnF1aXJ5KTsKLSAgICAgIH0gZWxzZSBpZiAoKChwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5vcF9pZCA9PSBBVlJDX0lEX1ZPTF9VUCkgfHwKLSAgICAgICAgICAgICAgICAgIChwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5vcF9pZCA9PSBBVlJDX0lEX1ZPTF9ET1dOKSkgJiYKLSAgICAgICAgICAgICAgICAgIXN0cmNtcChhdnJjcF9jdF9zdXBwb3J0LCAidHJ1ZSIpKSB7Ci0gICAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPSBBVlJDX1JTUF9BQ0NFUFQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cuaGRyLmN0eXBlID0KLSAgICAgICAgICAgIGJ0YV9hdl9vcF9zdXBwb3J0ZWQocF9kYXRhLT5yY19tc2cubXNnLnBhc3Mub3BfaWQsIGlzX2lucXVpcnkpOwotICAgICAgfQotCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY3R5cGUgJWQiLCBfX2Z1bmNfXywgcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSkKLQotICAgICAgLyogc2VuZCByZXNwb25zZSAqLwotICAgICAgaWYgKHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgIT0gQVZSQ19SU1BfSU5URVJJTSkKLSAgICAgICAgQVZSQ19QYXNzUnNwKHBfZGF0YS0+cmNfbXNnLmhhbmRsZSwgcF9kYXRhLT5yY19tc2cubGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5yY19tc2cubXNnLnBhc3MpOwotCi0gICAgICAvKiBzZXQgdXAgZm9yIGNhbGxiYWNrIGlmIHN1cHBvcnRlZCAqLwotICAgICAgaWYgKHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPT0gQVZSQ19SU1BfQUNDRVBUIHx8Ci0gICAgICAgICAgcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSA9PSBBVlJDX1JTUF9JTlRFUklNKSB7Ci0gICAgICAgIGV2dCA9IEJUQV9BVl9SRU1PVEVfQ01EX0VWVDsKLSAgICAgICAgYXYucmVtb3RlX2NtZC5yY19pZCA9IHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLm9wX2lkOwotICAgICAgICBhdi5yZW1vdGVfY21kLmtleV9zdGF0ZSA9IHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLnN0YXRlOwotICAgICAgICBhdi5yZW1vdGVfY21kLnBfZGF0YSA9IHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLnBfcGFzc19kYXRhOwotICAgICAgICBhdi5yZW1vdGVfY21kLmxlbiA9IHBfZGF0YS0+cmNfbXNnLm1zZy5wYXNzLnBhc3NfbGVuOwotICAgICAgICBtZW1jcHkoJmF2LnJlbW90ZV9jbWQuaGRyLCAmcF9kYXRhLT5yY19tc2cubXNnLmhkciwgc2l6ZW9mKHRBVlJDX0hEUikpOwotICAgICAgICBhdi5yZW1vdGVfY21kLmxhYmVsID0gcF9kYXRhLT5yY19tc2cubGFiZWw7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIGVsc2UgaWYgdGhpcyBpcyBhIHBhc3MgdGhydSByZXNwb25zZSAqLwotICAgIC8qIGlkIHJlc3BvbnNlIHR5cGUgaXMgbm90IGltcGwsIHdlIGhhdmUgdG8gcmVsZWFzZSBsYWJlbCAqLwotICAgIGVsc2UgaWYgKHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPj0gQVZSQ19SU1BfTk9UX0lNUEwpIHsKLSAgICAgIC8qIHNldCB1cCBmb3IgY2FsbGJhY2sgKi8KLSAgICAgIGV2dCA9IEJUQV9BVl9SRU1PVEVfUlNQX0VWVDsKLSAgICAgIGF2LnJlbW90ZV9yc3AucmNfaWQgPSBwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5vcF9pZDsKLSAgICAgIGF2LnJlbW90ZV9yc3Aua2V5X3N0YXRlID0gcF9kYXRhLT5yY19tc2cubXNnLnBhc3Muc3RhdGU7Ci0gICAgICBhdi5yZW1vdGVfcnNwLnJzcF9jb2RlID0gcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZTsKLSAgICAgIGF2LnJlbW90ZV9yc3AubGFiZWwgPSBwX2RhdGEtPnJjX21zZy5sYWJlbDsKLQotICAgICAgLyogSWYgdGhpcyByZXNwb25zZSBpcyBmb3IgdmVuZG9yIHVuaXF1ZSBjb21tYW5kICAqLwotICAgICAgaWYgKChwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5vcF9pZCA9PSBBVlJDX0lEX1ZFTkRPUikgJiYKLSAgICAgICAgICAocF9kYXRhLT5yY19tc2cubXNnLnBhc3MucGFzc19sZW4gPiAwKSkgewotICAgICAgICBhdi5yZW1vdGVfcnNwLnBfZGF0YSA9Ci0gICAgICAgICAgICAodWludDhfdCopb3NpX21hbGxvYyhwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5wYXNzX2xlbik7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBWZW5kb3IgVW5pcXVlIGRhdGEgbGVuID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5wYXNzX2xlbik7Ci0gICAgICAgIG1lbWNweShhdi5yZW1vdGVfcnNwLnBfZGF0YSwgcF9kYXRhLT5yY19tc2cubXNnLnBhc3MucF9wYXNzX2RhdGEsCi0gICAgICAgICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cucGFzcy5wYXNzX2xlbik7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIG11c3QgYmUgYSBiYWQgY3R5cGUgLT4gcmVqZWN0Ki8KLSAgICBlbHNlIHsKLSAgICAgIHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGUgPSBBVlJDX1JTUF9SRUo7Ci0gICAgICBBVlJDX1Bhc3NSc3AocF9kYXRhLT5yY19tc2cuaGFuZGxlLCBwX2RhdGEtPnJjX21zZy5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5yY19tc2cubXNnLnBhc3MpOwotICAgIH0KLSAgfQotICAvKiBlbHNlIGlmIHRoaXMgaXMgYSB2ZW5kb3Igc3BlY2lmaWMgY29tbWFuZCBvciByZXNwb25zZSAqLwotICBlbHNlIGlmIChwX2RhdGEtPnJjX21zZy5vcGNvZGUgPT0gQVZSQ19PUF9WRU5ET1IpIHsKLSAgICAvKiBzZXQgdXAgZm9yIGNhbGxiYWNrICovCi0gICAgYXYudmVuZG9yX2NtZC5jb2RlID0gcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZTsKLSAgICBhdi52ZW5kb3JfY21kLmNvbXBhbnlfaWQgPSBwX3ZlbmRvci0+Y29tcGFueV9pZDsKLSAgICBhdi52ZW5kb3JfY21kLmxhYmVsID0gcF9kYXRhLT5yY19tc2cubGFiZWw7Ci0gICAgYXYudmVuZG9yX2NtZC5wX2RhdGEgPSBwX3ZlbmRvci0+cF92ZW5kb3JfZGF0YTsKLSAgICBhdi52ZW5kb3JfY21kLmxlbiA9IHBfdmVuZG9yLT52ZW5kb3JfbGVuOwotCi0gICAgLyogaWYgY29uZmlndXJlZCB0byBzdXBwb3J0IHZlbmRvciBzcGVjaWZpYyBhbmQgaXQncyBhIGNvbW1hbmQgKi8KLSAgICBpZiAoKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfVkVORE9SKSAmJgotICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cuaGRyLmN0eXBlIDw9IEFWUkNfQ01EX0dFTl9JTlEpIHsKLSAgICAgIGlmICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9NRVRBREFUQSkgJiYKLSAgICAgICAgICAocF92ZW5kb3ItPmNvbXBhbnlfaWQgPT0gQVZSQ19DT19NRVRBREFUQSkpIHsKLSAgICAgICAgYXYubWV0YV9tc2cucF9tc2cgPSAmcF9kYXRhLT5yY19tc2cubXNnOwotICAgICAgICByY19yc3AucnNwLnN0YXR1cyA9IEJUQV9BVl9TVFNfTk9fUlNQOwotICAgICAgICBldnQgPSBidGFfYXZfcHJvY19tZXRhX2NtZCgmcmNfcnNwLCAmcF9kYXRhLT5yY19tc2csICZjdHlwZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBldnQgPSBCVEFfQVZfVkVORE9SX0NNRF9FVlQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9WRU5ET1IpICYmCi0gICAgICAgICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cuaGRyLmN0eXBlID49IEFWUkNfUlNQX05PVF9JTVBMKSB7Ci0gICAgICAvKiBlbHNlIGlmIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCB2ZW5kb3Igc3BlY2lmaWMgYW5kIGl0J3MgYSByZXNwb25zZSAqLwotICAgICAgaWYgKChwX2NiLT5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX01FVEFEQVRBKSAmJgotICAgICAgICAgIChwX3ZlbmRvci0+Y29tcGFueV9pZCA9PSBBVlJDX0NPX01FVEFEQVRBKSkgewotICAgICAgICBhdi5tZXRhX21zZy5wX21zZyA9ICZwX2RhdGEtPnJjX21zZy5tc2c7Ci0gICAgICAgIGV2dCA9IEJUQV9BVl9NRVRBX01TR19FVlQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBldnQgPSBCVEFfQVZfVkVORE9SX1JTUF9FVlQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfVkVORE9SKSAmJgotICAgICAgICAgICAgICAgcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSA8PSBBVlJDX0NNRF9HRU5fSU5RKSB7Ci0gICAgICAvKiBlbHNlIGlmIG5vdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgdmVuZG9yIHNwZWNpZmljIGFuZCBpdCdzIGEgY29tbWFuZCAqLwotICAgICAgaWYgKHBfZGF0YS0+cmNfbXNnLm1zZy52ZW5kb3IucF92ZW5kb3JfZGF0YVswXSA9PSBBVlJDX1BEVV9JTlZBTElEKSB7Ci0gICAgICAgIC8qIHJlamVjdCBpdCAqLwotICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cuaGRyLmN0eXBlID0gQVZSQ19SU1BfUkVKOwotICAgICAgICBwX2RhdGEtPnJjX21zZy5tc2cudmVuZG9yLnBfdmVuZG9yX2RhdGFbNF0gPSBBVlJDX1NUU19CQURfQ01EOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9kYXRhLT5yY19tc2cubXNnLmhkci5jdHlwZSA9IEFWUkNfUlNQX05PVF9JTVBMOwotICAgICAgfQotICAgICAgQVZSQ19WZW5kb3JSc3AocF9kYXRhLT5yY19tc2cuaGFuZGxlLCBwX2RhdGEtPnJjX21zZy5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICZwX2RhdGEtPnJjX21zZy5tc2cudmVuZG9yKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocF9kYXRhLT5yY19tc2cub3Bjb2RlID09IEFWUkNfT1BfQlJPV1NFKSB7Ci0gICAgLyogc2V0IHVwIGZvciBjYWxsYmFjayAqLwotICAgIGF2Lm1ldGFfbXNnLnJjX2hhbmRsZSA9IHBfZGF0YS0+cmNfbXNnLmhhbmRsZTsKLSAgICBhdi5tZXRhX21zZy5jb21wYW55X2lkID0gcF92ZW5kb3ItPmNvbXBhbnlfaWQ7Ci0gICAgYXYubWV0YV9tc2cuY29kZSA9IHBfZGF0YS0+cmNfbXNnLm1zZy5oZHIuY3R5cGU7Ci0gICAgYXYubWV0YV9tc2cubGFiZWwgPSBwX2RhdGEtPnJjX21zZy5sYWJlbDsKLSAgICBhdi5tZXRhX21zZy5wX21zZyA9ICZwX2RhdGEtPnJjX21zZy5tc2c7Ci0gICAgYXYubWV0YV9tc2cucF9kYXRhID0gcF9kYXRhLT5yY19tc2cubXNnLmJyb3dzZS5wX2Jyb3dzZV9kYXRhOwotICAgIGF2Lm1ldGFfbXNnLmxlbiA9IHBfZGF0YS0+cmNfbXNnLm1zZy5icm93c2UuYnJvd3NlX2xlbjsKLSAgICBldnQgPSBCVEFfQVZfTUVUQV9NU0dfRVZUOwotICB9Ci0KLSAgaWYgKGV2dCA9PSAwICYmIHJjX3JzcC5yc3Auc3RhdHVzICE9IEJUQV9BVl9TVFNfTk9fUlNQKSB7Ci0gICAgaWYgKCFwX3BrdCkgewotICAgICAgcmNfcnNwLnJzcC5vcGNvZGUgPSBwX2RhdGEtPnJjX21zZy5vcGNvZGU7Ci0gICAgICBBVlJDX0JsZFJlc3BvbnNlKDAsICZyY19yc3AsICZwX3BrdCk7Ci0gICAgfQotICAgIGlmIChwX3BrdCkKLSAgICAgIEFWUkNfTXNnUmVxKHBfZGF0YS0+cmNfbXNnLmhhbmRsZSwgcF9kYXRhLT5yY19tc2cubGFiZWwsIGN0eXBlLCBwX3BrdCk7Ci0gIH0KLQotICAvKiBjYWxsIGNhbGxiYWNrICovCi0gIGlmIChldnQgIT0gMCkgewotICAgIGF2LnJlbW90ZV9jbWQucmNfaGFuZGxlID0gcF9kYXRhLT5yY19tc2cuaGFuZGxlOwotICAgICgqcF9jYi0+cF9jYmFjaykoZXZ0LCAmYXYpOwotICAgIC8qIElmIGJyb3dzaW5nIG1lc3NhZ2UsIHRoZW4gZnJlZSB0aGUgYnJvd3NlIG1lc3NhZ2UgYnVmZmVyICovCi0gICAgYnRhX2F2X3JjX2ZyZWVfYnJvd3NlX21zZyhwX2NiLCBwX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNsb3NlIHRoZSBzcGVjaWZpZWQgQVZSQyBoYW5kbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX2Nsb3NlKHRCVEFfQVZfQ0IqIHBfY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljOwotICB0QlRBX0FWX1NDQiogcF9zY2I7Ci0gIHRCVEFfQVZfUkNCKiBwX3JjYjsKLQotICBpZiAoaGFuZGxlIDwgQlRBX0FWX05VTV9SQ0IpIHsKLSAgICBwX3JjYiA9ICZwX2NiLT5yY2JbaGFuZGxlXTsKLQotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBoYW5kbGU6ICVkLCBzdGF0dXM9MHgleCIsIF9fZnVuY19fLCBwX3JjYi0+aGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgcF9yY2ItPnN0YXR1cyk7Ci0gICAgaWYgKHBfcmNiLT5oYW5kbGUgIT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FKSB7Ci0gICAgICBpZiAocF9yY2ItPnNoZGwpIHsKLSAgICAgICAgcF9zY2IgPSBidGFfYXZfY2IucF9zY2JbcF9yY2ItPnNoZGwgLSAxXTsKLSAgICAgICAgaWYgKHBfc2NiKSB7Ci0gICAgICAgICAgLyoganVzdCBpbiBjYXNlIHRoZSBSQyB0aW1lciBpcyBhY3RpdmUKLSAgICAgICAgICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNDVCAmJgotICAgICAgICAgICAgIHBfc2NiLT5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPKSAqLwotICAgICAgICAgIGFsYXJtX2NhbmNlbChwX3NjYi0+YXZyY19jdF90aW1lcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQVZSQ19DbG9zZShwX3JjYi0+aGFuZGxlKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY19icm93c2VfY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVtcHR5IHBsYWNlaG9sZGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY19icm93c2VfY2xvc2UodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogZW1wdHkgcGxhY2Vob2xkZXIgZG9lcyBub3RoaW5nISIsIF9fZnVuY19fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9nZXRfc2hkbAotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIGluZGV4IHRvIHBfc2NiW10KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRhX2F2X2dldF9zaGRsKHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBpbnQgaTsKLSAgdWludDhfdCBzaGRsID0gMDsKLSAgLyogZmluZCB0aGUgU0NCICYgc3RvcCB0aGUgdGltZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9BVl9OVU1fU1RSUzsgaSsrKSB7Ci0gICAgaWYgKHBfc2NiID09IGJ0YV9hdl9jYi5wX3NjYltpXSkgewotICAgICAgc2hkbCA9IGkgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzaGRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N0cmVhbV9jaGcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGF1ZGlvIHN0cmVhbWluZyBzdGF0dXMgY2hhbmdlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc3RyZWFtX2NoZyh0QlRBX0FWX1NDQiogcF9zY2IsIGJvb2wgc3RhcnRlZCkgewotICB1aW50OF90IHN0YXJ0ZWRfbXNrID0gQlRBX0FWX0hORExfVE9fTVNLKHBfc2NiLT5oZGkpOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIHN0YXJ0ZWQ6JXMgc3RhcnRlZF9tc2s6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHN0YXJ0ZWQpLmNfc3RyKCksIHN0YXJ0ZWRfbXNrKTsKLQotICBpZiAoc3RhcnRlZCkgewotICAgIC8qIExldCBMMkNBUCBrbm93IHRoaXMgY2hhbm5lbCBpcyBwcm9jZXNzZWQgd2l0aCBoaWdoIHByaW9yaXR5ICovCi0gICAgTDJDQV9TZXRBY2xQcmlvcml0eShwX3NjYi0+UGVlckFkZHJlc3MoKSwgTDJDQVBfUFJJT1JJVFlfSElHSCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTGV0IEwyQ0FQIGtub3cgdGhpcyBjaGFubmVsIGlzIHByb2Nlc3NlZCB3aXRoIGxvdyBwcmlvcml0eSAqLwotICAgIEwyQ0FfU2V0QWNsUHJpb3JpdHkocF9zY2ItPlBlZXJBZGRyZXNzKCksIEwyQ0FQX1BSSU9SSVRZX05PUk1BTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jb25uX2NoZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY29ubmV0aW9uIHN0YXR1cyBjaGFuZ2VkLgotICogICAgICAgICAgICAgICAgICBPcGVuIGFuIEFWUkNQIGFjY2VwdG9yIGNoYW5uZWwsIGlmIG5ldyBjb25uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb25uX2NoZyh0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX0NCKiBwX2NiID0gJmJ0YV9hdl9jYjsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gTlVMTDsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiaTsKLSAgdWludDhfdCBtYXNrOwotICB1aW50OF90IGNvbm5fbXNrOwotICB1aW50OF90IG9sZF9tc2s7Ci0gIGludCBpOwotICBpbnQgaW5kZXggPSAocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMgJiBCVEFfQVZfSE5ETF9NU0spIC0gMTsKLSAgdEJUQV9BVl9MQ0IqIHBfbGNiOwotICB0QlRBX0FWX0xDQiogcF9sY2JfcmM7Ci0gIHRCVEFfQVZfUkNCICpwX3JjYiwgKnBfcmNiMjsKLSAgYm9vbCBjaGtfcmVzdG9yZSA9IGZhbHNlOwotCi0gIC8qIFZhbGlkYXRlIGFycmF5IGluZGV4Ki8KLSAgaWYgKGluZGV4IDwgQlRBX0FWX05VTV9TVFJTKSB7Ci0gICAgcF9zY2IgPSBwX2NiLT5wX3NjYltpbmRleF07Ci0gIH0KLSAgbWFzayA9IEJUQV9BVl9ITkRMX1RPX01TSyhpbmRleCk7Ci0gIHBfbGNiID0gYnRhX2F2X2ZpbmRfbGNiKHBfZGF0YS0+Y29ubl9jaGcucGVlcl9hZGRyLCBCVEFfQVZfTENCX0ZJTkQpOwotICBjb25uX21zayA9IDEgPDwgKGluZGV4ICsgMSk7Ci0gIGlmIChwX2RhdGEtPmNvbm5fY2hnLmlzX3VwKSB7Ci0gICAgLyogc2V0IHRoZSBjb25uZWQgbWFzayBmb3IgdGhpcyBjaGFubmVsICovCi0gICAgaWYgKHBfc2NiKSB7Ci0gICAgICBpZiAocF9sY2IpIHsKLSAgICAgICAgcF9sY2ItPmNvbm5fbXNrIHw9IGNvbm5fbXNrOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FWX05VTV9SQ0I7IGkrKykgewotICAgICAgICAgIGlmIChidGFfYXZfY2IucmNiW2ldLmxpZHggPT0gcF9sY2ItPmxpZHgpIHsKLSAgICAgICAgICAgIGJ0YV9hdl9jYi5yY2JbaV0uc2hkbCA9IGluZGV4ICsgMTsKLSAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICAgIiVzOiBjb25uX2NoZyB1cFslZF06ICVkLCBzdGF0dXM9MHgleCwgc2hkbDolZCwgbGlkeDolZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGksIGJ0YV9hdl9jYi5yY2JbaV0uaGFuZGxlLCBidGFfYXZfY2IucmNiW2ldLnN0YXR1cywKLSAgICAgICAgICAgICAgICBidGFfYXZfY2IucmNiW2ldLnNoZGwsIGJ0YV9hdl9jYi5yY2JbaV0ubGlkeCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9sZF9tc2sgPSBwX2NiLT5jb25uX2F1ZGlvOwotICAgICAgcF9jYi0+Y29ubl9hdWRpbyB8PSBtYXNrOwotCi0gICAgICBpZiAoKG9sZF9tc2sgJiBtYXNrKSA9PSAwKSB7Ci0gICAgICAgIC8qIGluY3JlYXNlIHRoZSBhdWRpbyBvcGVuIGNvdW50LCBpZiBub3Qgc2V0IHlldCAqLwotICAgICAgICBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQrKzsKLSAgICAgIH0KLQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJjX2FjcF9oYW5kbGU6JWQgcmNfYWNwX2lkeDolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5yY19hY3BfaGFuZGxlLCBwX2NiLT5yY19hY3BfaWR4KTsKLSAgICAgIC8qIGNoZWNrIGlmIHRoZSBBVlJDUCBBQ1AgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbm5lY3RlZCAqLwotICAgICAgaWYgKHBfbGNiICYmIHBfY2ItPnJjX2FjcF9oYW5kbGUgIT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FICYmCi0gICAgICAgICAgcF9jYi0+cmNfYWNwX2lkeCkgewotICAgICAgICBwX2xjYl9yYyA9ICZwX2NiLT5sY2JbQlRBX0FWX05VTV9MSU5LU107Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiJXM6IHJjX2FjcCBpcyBjb25uZWN0ZWQgJiYgY29ubl9jaGcgb24gc2FtZSBhZGRyICIKLSAgICAgICAgICAgICJwX2xjYl9yYy0+Y29ubl9tc2s6eCV4IiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwX2xjYl9yYy0+Y29ubl9tc2spOwotICAgICAgICAvKiBjaGVjayBpZiB0aGUgUkMgaXMgY29ubmVjdGVkIHRvIHRoZSBzY2IgYWRkciAqLwotICAgICAgICBMT0dfSU5GTygiJXM6IHBfbGNiX3JjLT5hZGRyOiAlcyBjb25uX2NoZy5wZWVyX2FkZHI6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgIHBfbGNiX3JjLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgcF9kYXRhLT5jb25uX2NoZy5wZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgICAgICBpZiAocF9sY2JfcmMtPmNvbm5fbXNrICYmCi0gICAgICAgICAgICBwX2xjYl9yYy0+YWRkciA9PSBwX2RhdGEtPmNvbm5fY2hnLnBlZXJfYWRkcikgewotICAgICAgICAgIC8qIEFWUkNQIGlzIGFscmVhZHkgY29ubmVjdGVkLgotICAgICAgICAgICAqIG5lZWQgdG8gdXBkYXRlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZW4gU0NCIGFuZCBSQ0IgKi8KLSAgICAgICAgICBwX2xjYl9yYy0+Y29ubl9tc2sgPSAwOyAvKiBpbmRpY2F0ZSBSQyBPTkxZIGlzIG5vdCBjb25uZWN0ZWQgKi8KLSAgICAgICAgICBwX2xjYl9yYy0+bGlkeCA9IDA7Ci0gICAgICAgICAgcF9zY2ItPnJjX2hhbmRsZSA9IHBfY2ItPnJjX2FjcF9oYW5kbGU7Ci0gICAgICAgICAgcF9yY2IgPSAmcF9jYi0+cmNiW3BfY2ItPnJjX2FjcF9pZHggLSAxXTsKLSAgICAgICAgICBwX3JjYi0+c2hkbCA9IGJ0YV9hdl9nZXRfc2hkbChwX3NjYik7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHVwZGF0ZSByY19hY3Agc2hkbDolZC8lZCBzcmNoOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArIDEsIHBfcmNiLT5zaGRsLCBwX3NjYi0+cmNfaGFuZGxlKTsKLQotICAgICAgICAgIHBfcmNiMiA9IGJ0YV9hdl9nZXRfcmNiX2J5X3NoZGwocF9yY2ItPnNoZGwpOwotICAgICAgICAgIGlmIChwX3JjYjIpIHsKLSAgICAgICAgICAgIC8qIGZvdW5kIHRoZSBSQ0IgdGhhdCB3YXMgY3JlYXRlZCB0byBhc3NvY2lhdGVkIHdpdGggdGhpcyBTQ0IgKi8KLSAgICAgICAgICAgIHBfY2ItPnJjX2FjcF9oYW5kbGUgPSBwX3JjYjItPmhhbmRsZTsKLSAgICAgICAgICAgIHBfY2ItPnJjX2FjcF9pZHggPSAocF9yY2IyIC0gcF9jYi0+cmNiKSArIDE7Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbmV3IHJjX2FjcF9oYW5kbGU6JWQsIGlkeDolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5yY19hY3BfaGFuZGxlLCBwX2NiLT5yY19hY3BfaWR4KTsKLSAgICAgICAgICAgIHBfcmNiMi0+bGlkeCA9IChCVEFfQVZfTlVNX0xJTktTICsgMSk7Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmMyIGhhbmRsZTolZCBsaWR4OiVkLyVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmNiMi0+aGFuZGxlLCBwX3JjYjItPmxpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmxjYltwX3JjYjItPmxpZHggLSAxXS5saWR4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcF9yY2ItPmxpZHggPSBwX2xjYi0+bGlkeDsKLSAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmMgaGFuZGxlOiVkIGxpZHg6JWQvJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmNiLT5oYW5kbGUsIHBfcmNiLT5saWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+bGNiW3BfcmNiLT5saWR4IC0gMV0ubGlkeCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKChwX2NiLT5jb25uX2F1ZGlvICYgbWFzaykgJiYgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250KSB7Ci0gICAgICAvKiB0aGlzIGNoYW5uZWwgaXMgc3RpbGwgbWFya2VkIGFzIG9wZW4uIGRlY3JlYXNlIHRoZSBjb3VudCAqLwotICAgICAgYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250LS07Ci0gICAgfQotCi0gICAgLyogY2xlYXIgdGhlIGNvbm5lZCBtYXNrIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgICBwX2NiLT5jb25uX2F1ZGlvICY9IH5tYXNrOwotICAgIGlmIChwX3NjYikgewotICAgICAgLy8gVGhlIHN0cmVhbSBpcyBjbG9zZWQuIENsZWFyIHRoZSBzdGF0ZS4KLSAgICAgIHBfc2NiLT5PbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgaWYgKHBfc2NiLT5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPKSB7Ci0gICAgICAgIGlmIChwX2xjYikgewotICAgICAgICAgIHBfbGNiLT5jb25uX21zayAmPSB+Y29ubl9tc2s7Ci0gICAgICAgIH0KLSAgICAgICAgLyogYXVkaW8gY2hhbm5lbCBpcyBkb3duLiBtYWtlIHN1cmUgdGhlIElOVCBjaGFubmVsIGlzIGRvd24gKi8KLSAgICAgICAgLyoganVzdCBpbiBjYXNlIHRoZSBSQyB0aW1lciBpcyBhY3RpdmUKLSAgICAgICAgaWYgKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNDVCkgKi8KLSAgICAgICAgeyBhbGFybV9jYW5jZWwocF9zY2ItPmF2cmNfY3RfdGltZXIpOyB9Ci0gICAgICAgIC8qIG9uZSBhdWRpbyBjaGFubmVsIGdvZXMgZG93bi4gY2hlY2sgaWYgd2UgbmVlZCB0byByZXN0b3JlIGhpZ2gKLSAgICAgICAgICogcHJpb3JpdHkgKi8KLSAgICAgICAgY2hrX3Jlc3RvcmUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzaGRsOiVkIiwgX19mdW5jX18sIGluZGV4ICsgMSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IEJUQV9BVl9OVU1fUkNCOyBpKyspIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb25uX2NoZyBkblslZF06ICVkLCBzdGF0dXM9MHgleCwgc2hkbDolZCwgbGlkeDolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpLCBidGFfYXZfY2IucmNiW2ldLmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLnJjYltpXS5zdGF0dXMsIGJ0YV9hdl9jYi5yY2JbaV0uc2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLnJjYltpXS5saWR4KTsKLSAgICAgIGlmIChidGFfYXZfY2IucmNiW2ldLnNoZGwgPT0gaW5kZXggKyAxKSB7Ci0gICAgICAgIGJ0YV9hdl9kZWxfcmMoJmJ0YV9hdl9jYi5yY2JbaV0pOwotICAgICAgICAvKiBzaW5jZSB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGRvd24gYW5kIGluZm8gd2FzIHJlbW92ZWQsIGNsZWFuCi0gICAgICAgICAqIHJlZmVyZW5jZSAqLwotICAgICAgICBidGFfYXZfY2IucmNiW2ldLnNoZGwgPSAwOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocF9jYi0+Y29ubl9hdWRpbyA9PSAwKSB7Ci0gICAgICAvKiBpZiBib3RoIGNoYW5uZWxzIGFyZSBub3QgY29ubmVjdGVkLAotICAgICAgICogY2xvc2UgYWxsIFJDIGNoYW5uZWxzICovCi0gICAgICBidGFfYXZfY2xvc2VfYWxsX3JjKHBfY2IpOwotICAgIH0KLQotICAgIC8qIGlmIHRoZSBBVlJDUCBpcyBubyBsb25nZXIgbGlzdGVuaW5nLCBjcmVhdGUgdGhlIGxpc3RlbmluZyBjaGFubmVsICovCi0gICAgaWYgKGJ0YV9hdl9jYi5yY19hY3BfaGFuZGxlID09IEJUQV9BVl9SQ19IQU5ETEVfTk9ORSAmJgotICAgICAgICBidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKQotICAgICAgYnRhX2F2X3JjX2NyZWF0ZSgmYnRhX2F2X2NiLCBBVkNUX0FDUCwgMCwgQlRBX0FWX05VTV9MSU5LUyArIDEpOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygKLSAgICAgICIlczogYXVkaW86JXggdXA6JWQgY29ubl9tc2s6MHgleCBjaGtfcmVzdG9yZTolZCAiCi0gICAgICAiYXVkaW9fb3Blbl9jbnQ6JWQiLAotICAgICAgX19mdW5jX18sIHBfY2ItPmNvbm5fYXVkaW8sIHBfZGF0YS0+Y29ubl9jaGcuaXNfdXAsIGNvbm5fbXNrLCBjaGtfcmVzdG9yZSwKLSAgICAgIHBfY2ItPmF1ZGlvX29wZW5fY250KTsKLQotICBpZiAoY2hrX3Jlc3RvcmUpIHsKLSAgICBpZiAocF9jYi0+YXVkaW9fb3Blbl9jbnQgPT0gMSkgewotICAgICAgLyogb25lIGF1ZGlvIGNoYW5uZWwgZ29lcyBkb3duIGFuZCB0aGVyZSdzIG9uZSBhdWRpbyBjaGFubmVsIHJlbWFpbnMgb3Blbi4KLSAgICAgICAqIHJlc3RvcmUgdGhlIHN3aXRjaCByb2xlIGluIGRlZmF1bHQgbGluayBwb2xpY3kgKi8KLSAgICAgIEJUTV9kZWZhdWx0X3VuYmxvY2tfcm9sZV9zd2l0Y2goKTsKLSAgICAgIGJ0YV9hdl9yZXN0b3JlX3N3aXRjaCgpOwotICAgIH0KLSAgICBpZiAocF9jYi0+YXVkaW9fb3Blbl9jbnQpIHsKLSAgICAgIC8qIGFkanVzdCBmbHVzaCB0aW1lb3V0IHNldHRpbmdzIHRvIGxvbmdlciBwZXJpb2QgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgICAgICBwX3NjYmkgPSBidGFfYXZfY2IucF9zY2JbaV07Ci0gICAgICAgIGlmIChwX3NjYmkgJiYgcF9zY2JpLT5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPICYmIHBfc2NiaS0+Y29fc3RhcnRlZCkgewotICAgICAgICAgIC8qIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgZmx1c2ggdGltZW91dCBvZiB0aGlzIGFscmVhZHkgc3RhcnRlZCBzdHJlYW0KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAocF9zY2JpLT5jb19zdGFydGVkICE9IGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCkgewotICAgICAgICAgICAgcF9zY2JpLT5jb19zdGFydGVkID0gYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRpc2FibGUgQVYuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2Rpc2FibGUodEJUQV9BVl9DQiogcF9jYiwgVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgYm9vbCBkaXNhYmxpbmdfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgdWludDE2X3QgeHg7Ci0KLSAgcF9jYi0+ZGlzYWJsaW5nID0gdHJ1ZTsKLQotICBidGFfYXZfY2xvc2VfYWxsX3JjKHBfY2IpOwotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2NiLT5wX2Rpc2NfZGIpOwotCi0gIC8qIGRpc2FibGUgYXVkaW8vdmlkZW8gLSBkZS1yZWdpc3RlciBhbGwgY2hhbm5lbHMsCi0gICAqIGV4cGVjdCBCVEFfQVZfREVSRUdfQ09NUF9FVlQgd2hlbiBkZXJlZ2lzdGVyIGlzIGNvbXBsZXRlICovCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUQV9BVl9OVU1fU1RSUzsgeHgrKykgewotICAgIGlmIChwX2NiLT5wX3NjYlt4eF0gIT0gTlVMTCkgewotICAgICAgLy8gRnJlZSBzaWduYWxsaW5nIHRpbWVycwotICAgICAgYWxhcm1fZnJlZShwX2NiLT5wX3NjYlt4eF0tPmxpbmtfc2lnbmFsbGluZ190aW1lcik7Ci0gICAgICBwX2NiLT5wX3NjYlt4eF0tPmxpbmtfc2lnbmFsbGluZ190aW1lciA9IE5VTEw7Ci0gICAgICBhbGFybV9mcmVlKHBfY2ItPnBfc2NiW3h4XS0+YWNjZXB0X3NpZ25hbGxpbmdfdGltZXIpOwotICAgICAgcF9jYi0+cF9zY2JbeHhdLT5hY2NlcHRfc2lnbmFsbGluZ190aW1lciA9IE5VTEw7Ci0KLSAgICAgIGhkci5sYXllcl9zcGVjaWZpYyA9IHh4ICsgMTsKLSAgICAgIGJ0YV9hdl9hcGlfZGVyZWdpc3RlcigodEJUQV9BVl9EQVRBKikmaGRyKTsKLSAgICAgIGRpc2FibGluZ19pbl9wcm9ncmVzcyA9IHRydWU7Ci0gICAgfQotICB9Ci0gIC8vIFNpbmNlIEFsbCBjaGFubmVscyBhcmUgZGVyZWdpc3RlcmluZyBieSBBUElfREVSRUdJU1RFUiwgdGhlIERFUkVHX0NPTVBfRVZUCi0gIC8vIHdvdWxkIGNvbWUgZmlyc3QgYmVmb3JlIEFQSV9ESVNBQkxFIGlmIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb25zLCBhbmQgaXQgaXMKLSAgLy8gbm8gbmVlZGVkIHRvIHNldHVwIHRoaXMgZGlzYWJsaW5nIGZsYWcuCi0gIHBfY2ItPmRpc2FibGluZyA9IGRpc2FibGluZ19pbl9wcm9ncmVzczsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2FwaV9kaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2FwaV9kaXNjb25uZWN0KHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYiA9Ci0gICAgICBidGFfYXZfaG5kbF90b19zY2IocF9kYXRhLT5hcGlfZGlzY250Lmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIEFWRFRfRGlzY29ubmVjdFJlcShwX3NjYi0+UGVlckFkZHJlc3MoKSwgYnRhX2F2X2Nvbm5fY2JhY2spOwotICBhbGFybV9jYW5jZWwocF9zY2ItPmxpbmtfc2lnbmFsbGluZ190aW1lcik7Ci19Ci0KLS8qKgotICogRmluZCB0aGUgaW5kZXggZm9yIHRoZSBmcmVlIExDQiBlbnRyeSB0byB1c2UuCi0gKgotICogVGhlIHNlbGVjdGlvbiBvcmRlciBpczoKLSAqICgxKSBGaW5kIHRoZSBpbmRleCBpZiB0aGVyZSBpcyBhbHJlYWR5IFNDQiBlbnRyeSBmb3IgdGhlIHBlZXIgYWRkcmVzcwotICogKDIpIElmIHRoZXJlIGlzIG5vIFNDQiBlbnRyeSBmb3IgdGhlIHBlZXIgYWRkcmVzcywgZmluZCB0aGUgZmlyc3QKLSAqIFNDQiBlbnRyeSB0aGF0IGlzIG5vdCBhc3NpZ25lZC4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MgdG8gdXNlCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIGZyZWUgTENCIGVudHJ5IHRvIHVzZSBvciBCVEFfQVZfTlVNX0xJTktTCi0gKiBpZiBubyBlbnRyeSBpcyBmb3VuZAotICovCi1zdGF0aWMgdWludDhfdCBidGFfYXZfZmluZF9sY2JfaW5kZXhfYnlfc2NiX2FuZF9hZGRyZXNzKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlcl9hZGRyZXNzOiAlcyBjb25uX2xjYjogMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGJ0YV9hdl9jYi5jb25uX2xjYik7Ci0KLSAgLy8gRmluZCB0aGUgaW5kZXggaWYgdGhlcmUgaXMgYWxyZWFkeSBTQ0IgZW50cnkgZm9yIHRoZSBwZWVyIGFkZHJlc3MKLSAgZm9yICh1aW50OF90IGluZGV4ID0gMDsgaW5kZXggPCBCVEFfQVZfTlVNX0xJTktTOyBpbmRleCsrKSB7Ci0gICAgdWludDhfdCBtYXNrID0gMSA8PCBpbmRleDsKLSAgICBpZiAobWFzayAmIGJ0YV9hdl9jYi5jb25uX2xjYikgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHRCVEFfQVZfU0NCKiBwX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYltpbmRleF07Ci0gICAgaWYgKHBfc2NiID09IG51bGxwdHIpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAocF9zY2ItPlBlZXJBZGRyZXNzKCkgPT0gcGVlcl9hZGRyZXNzKSB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICB9Ci0KLSAgLy8gRmluZCB0aGUgZmlyc3QgU0NCIGVudHJ5IHRoYXQgaXMgbm90IGFzc2lnbmVkLgotICBmb3IgKHVpbnQ4X3QgaW5kZXggPSAwOyBpbmRleCA8IEJUQV9BVl9OVU1fTElOS1M7IGluZGV4KyspIHsKLSAgICB1aW50OF90IG1hc2sgPSAxIDw8IGluZGV4OwotICAgIGlmIChtYXNrICYgYnRhX2F2X2NiLmNvbm5fbGNiKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gYnRhX2F2X2NiLnBfc2NiW2luZGV4XTsKLSAgICBpZiAocF9zY2IgPT0gbnVsbHB0cikgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghcF9zY2ItPklzQXNzaWduZWQoKSkgewotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgfQotCi0gIHJldHVybiBCVEFfQVZfTlVNX0xJTktTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3NpZ19jaGcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHByb2Nlc3MgQVZEVCBzaWduYWwgY2hhbm5lbCB1cC9kb3duLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zaWdfY2hnKHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IGV2ZW50ID0gcF9kYXRhLT5zdHJfbXNnLmhkci5sYXllcl9zcGVjaWZpYzsKLSAgdEJUQV9BVl9DQiogcF9jYiA9ICZidGFfYXZfY2I7Ci0gIHVpbnQzMl90IHh4OwotICB1aW50OF90IG1hc2s7Ci0gIHRCVEFfQVZfTENCKiBwX2xjYiA9IE5VTEw7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGV2ZW50OiAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gIGlmIChldmVudCA9PSBBVkRUX0NPTk5FQ1RfSU5EX0VWVCkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBBVkRUX0NPTk5FQ1RfSU5EX0VWVDogcGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5zdHJfbXNnLmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIHBfbGNiID0gYnRhX2F2X2ZpbmRfbGNiKHBfZGF0YS0+c3RyX21zZy5iZF9hZGRyLCBCVEFfQVZfTENCX0ZJTkQpOwotICAgIGlmICghcF9sY2IpIHsKLSAgICAgIC8qIGlmIHRoZSBhZGRyZXNzIGRvZXMgbm90IGhhdmUgYW4gTENCIHlldCwgYWxsb2Mgb25lICovCi0gICAgICB4eCA9IGJ0YV9hdl9maW5kX2xjYl9pbmRleF9ieV9zY2JfYW5kX2FkZHJlc3MocF9kYXRhLT5zdHJfbXNnLmJkX2FkZHIpOwotCi0gICAgICAvKiBjaGVjayBpZiB3ZSBmb3VuZCBzb21ldGhpbmcgKi8KLSAgICAgIGlmICh4eCA+PSBCVEFfQVZfTlVNX0xJTktTKSB7Ci0gICAgICAgIC8qIFdlIGRvIG5vdCBoYXZlIHNjYiBmb3IgdGhpcyBhdmR0IGNvbm5lY3Rpb24uICAgICAqLwotICAgICAgICAvKiBTaWxlbnRseSBjbG9zZSB0aGUgY29ubmVjdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGF2IHNjYiBub3QgYXZhaWxhYmxlIGZvciBhdmR0IGNvbm5lY3Rpb24gZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kYXRhLT5zdHJfbXNnLmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgQVZEVF9EaXNjb25uZWN0UmVxKHBfZGF0YS0+c3RyX21zZy5iZF9hZGRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgTE9HX0lORk8oIiVzOiBBVkRUX0NPTk5FQ1RfSU5EX0VWVDogcGVlciAlcyBzZWxlY3RlZCBsY2JfaW5kZXggJWQiLAotICAgICAgICAgICAgICAgX19mdW5jX18sIHBfZGF0YS0+c3RyX21zZy5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgeHgpOwotCi0gICAgICB0QlRBX0FWX1NDQiogcF9zY2IgPSBwX2NiLT5wX3NjYlt4eF07Ci0gICAgICBtYXNrID0gMSA8PCB4eDsKLSAgICAgIHBfbGNiID0gJnBfY2ItPmxjYlt4eF07Ci0gICAgICBwX2xjYi0+bGlkeCA9IHh4ICsgMTsKLSAgICAgIHBfbGNiLT5hZGRyID0gcF9kYXRhLT5zdHJfbXNnLmJkX2FkZHI7Ci0gICAgICBwX2xjYi0+Y29ubl9tc2sgPSAwOyAvKiBjbGVhciB0aGUgY29ubmVjdCBtYXNrICovCi0gICAgICAvKiBzdGFydCBsaXN0ZW5pbmcgd2hlbiB0aGUgc2lnbmFsIGNoYW5uZWwgaXMgb3BlbiAqLwotICAgICAgaWYgKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNURykgewotICAgICAgICBidGFfYXZfcmNfY3JlYXRlKHBfY2IsIEFWQ1RfQUNQLCAwLCBwX2xjYi0+bGlkeCk7Ci0gICAgICB9Ci0gICAgICAvKiB0aGlzIGVudHJ5IGlzIG5vdCB1c2VkIHlldC4gKi8KLSAgICAgIHBfY2ItPmNvbm5fbGNiIHw9IG1hc2s7IC8qIG1hcmsgaXQgYXMgdXNlZCAqLwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN0YXJ0IHNpZyB0aW1lciAlZCIsIF9fZnVuY19fLCBwX2RhdGEtPmhkci5vZmZzZXQpOwotICAgICAgaWYgKHBfZGF0YS0+aGRyLm9mZnNldCA9PSBBVkRUX0FDUCkgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogSW5jb21pbmcgTDJDQVAgYWNxdWlyZWQsIHNldCBzdGF0ZSBhcyBpbmNvbWluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBwX3NjYi0+T25Db25uZWN0ZWQocF9kYXRhLT5zdHJfbXNnLmJkX2FkZHIpOwotICAgICAgICBwX3NjYi0+dXNlX3JjID0gdHJ1ZTsgLyogYWxsb3dpbmcgUkMgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQUNQX0NPTk5FQ1RfRVZULCBwX2RhdGEpOwotCi0gICAgICAgIC8qIFRoZSBQZW5kaW5nIEV2ZW50IHNob3VsZCBiZSBzZW50IGFzIHNvb24gYXMgdGhlIEwyQ0FQIHNpZ25hbGxpbmcKLSAgICAgICAgICogY2hhbm5lbAotICAgICAgICAgKiBpcyBzZXQgdXAsIHdoaWNoIGlzIE5PVy4gRWFybGllciB0aGlzIHdhcyBkb25lIG9ubHkgYWZ0ZXIKLSAgICAgICAgICogQlRBX0FWX1NJR05BTExJTkdfVElNRU9VVF9NUy4KLSAgICAgICAgICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBzaGFsbCBzZW5kIHRoZSBldmVudCBhbmQgc3RhcnQgdGhlCi0gICAgICAgICAqIHJlY3VycmluZyB0aW1lcgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFwX3NjYi0+bGlua19zaWduYWxsaW5nX3RpbWVyKSB7Ci0gICAgICAgICAgcF9zY2ItPmxpbmtfc2lnbmFsbGluZ190aW1lciA9IGFsYXJtX25ldygibGlua19zaWduYWxsaW5nX3RpbWVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgQlRfSERSIGhkcjsKLSAgICAgICAgaGRyLmxheWVyX3NwZWNpZmljID0gcF9zY2ItPmhuZGw7Ci0gICAgICAgIGJ0YV9hdl9zaWduYWxsaW5nX3RpbWVyKCh0QlRBX0FWX0RBVEEqKSZoZHIpOwotCi0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBSZS1zdGFydCB0aW1lciBmb3IgQVZEVFAgc2VydmljZSIsIF9fZnVuY19fKTsKLSAgICAgICAgYnRhX3N5c19jb25uX29wZW4oQlRBX0lEX0FWLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+UGVlckFkZHJlc3MoKSk7Ci0gICAgICAgIC8qIFBvc3NpYmxlIGNvbGxpc2lvbiA6IG5lZWQgdG8gYXZvaWQgb3V0Z29pbmcgcHJvY2Vzc2luZyB3aGlsZSB0aGUKLSAgICAgICAgICogdGltZXIgaXMgcnVubmluZyAqLwotICAgICAgICBwX3NjYi0+Y29sbF9tYXNrID0gQlRBX0FWX0NPTExfSU5DX1RNUjsKLSAgICAgICAgaWYgKCFwX3NjYi0+YWNjZXB0X3NpZ25hbGxpbmdfdGltZXIpIHsKLSAgICAgICAgICBwX3NjYi0+YWNjZXB0X3NpZ25hbGxpbmdfdGltZXIgPSBhbGFybV9uZXcoImFjY2VwdF9zaWduYWxsaW5nX3RpbWVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKAotICAgICAgICAgICAgcF9zY2ItPmFjY2VwdF9zaWduYWxsaW5nX3RpbWVyLCBCVEFfQVZfQUNDRVBUX1NJR05BTExJTkdfVElNRU9VVF9NUywKLSAgICAgICAgICAgIGJ0YV9hdl9hY2NlcHRfc2lnbmFsbGluZ190aW1lcl9jYmFjaywgVUlOVF9UT19QVFIoeHgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZSBpZiAoZXZlbnQgPT0gQlRBX0FSX0FWRFRfQ09OTl9FVlQpIHsKLSAgICB1aW50OF90IHNjYl9pbmRleCA9IHBfZGF0YS0+c3RyX21zZy5zY2JfaW5kZXg7Ci0gICAgYWxhcm1fY2FuY2VsKHBfY2ItPnBfc2NiW3NjYl9pbmRleF0tPmxpbmtfc2lnbmFsbGluZ190aW1lcik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLyogZGlzY29ubmVjdGVkLiAqLwotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBidGFfYXZfY2IuY29ubl9sY2I9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2NiLmNvbm5fbGNiKTsKLQotICAgIHBfbGNiID0gYnRhX2F2X2ZpbmRfbGNiKHBfZGF0YS0+c3RyX21zZy5iZF9hZGRyLCBCVEFfQVZfTENCX0ZSRUUpOwotICAgIGlmIChwX2xjYiAmJiAocF9sY2ItPmNvbm5fbXNrIHx8IGJ0YV9hdl9jYi5jb25uX2xjYikpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb25uX21zazogMHgleCIsIF9fZnVuY19fLCBwX2xjYi0+Y29ubl9tc2spOwotICAgICAgLyogY2xlYW4gdXAgc3NtICAqLwotICAgICAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0FWX05VTV9TVFJTOyB4eCsrKSB7Ci0gICAgICAgIGlmIChwX2NiLT5wX3NjYlt4eF0gJiYKLSAgICAgICAgICAgIHBfY2ItPnBfc2NiW3h4XS0+UGVlckFkZHJlc3MoKSA9PSBwX2RhdGEtPnN0cl9tc2cuYmRfYWRkcikgewotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBDbG9zaW5nIHRpbWVyIGZvciBBVkRUUCBzZXJ2aWNlIiwgX19mdW5jX18pOwotICAgICAgICAgIGJ0YV9zeXNfY29ubl9jbG9zZShCVEFfSURfQVYsIHBfY2ItPnBfc2NiW3h4XS0+YXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5wX3NjYlt4eF0tPlBlZXJBZGRyZXNzKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1hc2sgPSAxIDw8ICh4eCArIDEpOwotICAgICAgICBpZiAoKChtYXNrICYgcF9sY2ItPmNvbm5fbXNrKSB8fCBidGFfYXZfY2IuY29ubl9sY2IpICYmCi0gICAgICAgICAgICBwX2NiLT5wX3NjYlt4eF0gJiYKLSAgICAgICAgICAgIHBfY2ItPnBfc2NiW3h4XS0+UGVlckFkZHJlc3MoKSA9PSBwX2RhdGEtPnN0cl9tc2cuYmRfYWRkcikgewotICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IFNlbmRpbmcgQVZEVF9ESVNDT05ORUNUX0VWVCBwZWVyX2FkZHI9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+cF9zY2JbeHhdLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfY2ItPnBfc2NiW3h4XSwgQlRBX0FWX0FWRFRfRElTQ09OTkVDVF9FVlQsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBidGFfYXZfY2IuY29ubl9sY2I9MHgleCBhZnRlciBzaWdfY2hnIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9jYi0+Y29ubl9sY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3NpZ25hbGxpbmdfdGltZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHByb2Nlc3MgdGhlIHNpZ25hbCBjaGFubmVsIHRpbWVyLiBUaGlzIHRpbWVyIGlzIHN0YXJ0ZWQKLSAqICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgQVZEVFAgc2lnbmFsIGNoYW5uZWwgaXMgY29ubmVjdGVkLiBJZiBubyBwcm9maWxlCi0gKiAgICAgICAgICAgICAgICAgIGlzIGNvbm5lY3RlZCwgdGhlIHRpbWVyIGdvZXMgb2ZmIGV2ZXJ5Ci0gKiAgICAgICAgICAgICAgICAgIEJUQV9BVl9TSUdOQUxMSU5HX1RJTUVPVVRfTVMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NpZ25hbGxpbmdfdGltZXIoVU5VU0VEX0FUVFIgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9ITkRMIGhuZGwgPSBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYzsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gYnRhX2F2X2huZGxfdG9fc2NiKGhuZGwpOwotCi0gIHRCVEFfQVZfQ0IqIHBfY2IgPSAmYnRhX2F2X2NiOwotICBpbnQgeHg7Ci0gIHVpbnQ4X3QgbWFzazsKLSAgdEJUQV9BVl9MQ0IqIHBfbGNiID0gTlVMTDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubl9sY2I9MHgleCIsIF9fZnVuY19fLCBwX2NiLT5jb25uX2xjYik7Ci0gIGZvciAoeHggPSAwOyB4eCA8IEJUQV9BVl9OVU1fTElOS1M7IHh4KyspIHsKLSAgICBwX2xjYiA9ICZwX2NiLT5sY2JbeHhdOwotICAgIG1hc2sgPSAxIDw8IHh4OwotICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICIlczogaW5kZXg9JWQgY29ubl9sY2I9MHgleCBwZWVyPSVzIGNvbm5fbWFzaz0weCV4IGxpZHg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgeHgsIHBfY2ItPmNvbm5fbGNiLCBwX2xjYi0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfbGNiLT5jb25uX21zaywKLSAgICAgICAgcF9sY2ItPmxpZHgpOwotICAgIGlmIChtYXNrICYgcF9jYi0+Y29ubl9sY2IpIHsKLSAgICAgIC8qIHRoaXMgZW50cnkgaXMgdXNlZC4gY2hlY2sgaWYgaXQgaXMgY29ubmVjdGVkICovCi0gICAgICBpZiAoIXBfbGNiLT5jb25uX21zaykgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBobmRsIDB4JXgiLCBfX2Z1bmNfXywgcF9zY2ItPmhuZGwpOwotICAgICAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5saW5rX3NpZ25hbGxpbmdfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FWX1NJR05BTExJTkdfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQVZfU0lHTkFMTElOR19USU1FUl9FVlQsIGhuZGwpOwotICAgICAgICB0QlRBX0FWX1BFTkQgcGVuZDsKLSAgICAgICAgcGVuZC5iZF9hZGRyID0gcF9sY2ItPmFkZHI7Ci0gICAgICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgICAgIGJ0YV9hdl9kYXRhLnBlbmQgPSBwZW5kOwotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIiVzOiBCVEFfQVZfUEVORElOR19FVlQgZm9yICVzIGluZGV4PSVkIGNvbm5fbWFzaz0weCV4IGxpZHg9JWQiLAotICAgICAgICAgICAgX19mdW5jX18sIHBlbmQuYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHh4LCBwX2xjYi0+Y29ubl9tc2ssCi0gICAgICAgICAgICBwX2xjYi0+bGlkeCk7Ci0gICAgICAgICgqcF9jYi0+cF9jYmFjaykoQlRBX0FWX1BFTkRJTkdfRVZULCAmYnRhX2F2X2RhdGEpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2FjY2VwdF9zaWduYWxsaW5nX3RpbWVyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSB0aW1lb3V0IHdoZW4gU1JDIGlzIGFjY2VwdGluZyBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBTTksgZGlkIG5vdCBzdGFydCBzaWduYWxsaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfYWNjZXB0X3NpZ25hbGxpbmdfdGltZXJfY2JhY2sodm9pZCogZGF0YSkgewotICB1aW50MzJfdCBpbnggPSBQVFJfVE9fVUlOVChkYXRhKTsKLSAgdEJUQV9BVl9DQiogcF9jYiA9ICZidGFfYXZfY2I7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYiA9IE5VTEw7Ci0gIGlmIChpbnggPCBCVEFfQVZfTlVNX1NUUlMpIHsKLSAgICBwX3NjYiA9IHBfY2ItPnBfc2NiW2lueF07Ci0gIH0KLSAgaWYgKHBfc2NiKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvbGxfbWFzaz0weCUwMngiLCBfX2Z1bmNfXywgcF9zY2ItPmNvbGxfbWFzayk7Ci0KLSAgICBpZiAocF9zY2ItPmNvbGxfbWFzayAmIEJUQV9BVl9DT0xMX0lOQ19UTVIpIHsKLSAgICAgIHBfc2NiLT5jb2xsX21hc2sgJj0gfkJUQV9BVl9DT0xMX0lOQ19UTVI7Ci0KLSAgICAgIGlmIChidGFfYXZfaXNfc2NiX29wZW5pbmcocF9zY2IpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzdHJlYW0gc3RhdGUgb3BlbmluZzogU0RQIHN0YXJ0ZWQgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zZHBfZGlzY292ZXJ5X3N0YXJ0ZWQpOwotICAgICAgICBpZiAocF9zY2ItPnNkcF9kaXNjb3Zlcnlfc3RhcnRlZCkgewotICAgICAgICAgIC8qIFdlIGFyZSBzdGlsbCBkb2luZyBTRFAuIFJ1biB0aGUgdGltZXIgYWdhaW4uICovCi0gICAgICAgICAgcF9zY2ItPmNvbGxfbWFzayB8PSBCVEFfQVZfQ09MTF9JTkNfVE1SOwotCi0gICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfc2NiLT5hY2NlcHRfc2lnbmFsbGluZ190aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FWX0FDQ0VQVF9TSUdOQUxMSU5HX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9hY2NlcHRfc2lnbmFsbGluZ190aW1lcl9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9UT19QVFIoaW54KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLyogU05LIGRpZCBub3Qgc3RhcnQgc2lnbmFsbGluZywgcmVzdW1lIHNpZ25hbGxpbmcgcHJvY2Vzcy4gKi8KLSAgICAgICAgICBidGFfYXZfZGlzY292ZXJfcmVxKHBfc2NiLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChidGFfYXZfaXNfc2NiX2luY29taW5nKHBfc2NiKSkgewotICAgICAgICAvKiBTdGF5IGluIGluY29taW5nIHN0YXRlIGlmIFNOSyBkb2VzIG5vdCBzdGFydCBzaWduYWxsaW5nICovCi0KLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN0cmVhbSBzdGF0ZSBpbmNvbWluZyIsIF9fZnVuY19fKTsKLSAgICAgICAgLyogQVBJIG9wZW4gd2FzIGNhbGxlZCByaWdodCBhZnRlciBTTksgb3BlbmVkIEwyQyBjb25uZWN0aW9uLiAqLwotICAgICAgICBpZiAocF9zY2ItPmNvbGxfbWFzayAmIEJUQV9BVl9DT0xMX0FQSV9DQUxMRUQpIHsKLSAgICAgICAgICBwX3NjYi0+Y29sbF9tYXNrICY9IH5CVEFfQVZfQ09MTF9BUElfQ0FMTEVEOwotCi0gICAgICAgICAgLyogQlRBX0FWX0FQSV9PUEVOX0VWVCAqLwotICAgICAgICAgIHRCVEFfQVZfQVBJX09QRU4qIHBfYnVmID0KLSAgICAgICAgICAgICAgKHRCVEFfQVZfQVBJX09QRU4qKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX09QRU4pKTsKLSAgICAgICAgICBtZW1jcHkocF9idWYsICYocF9zY2ItPm9wZW5fYXBpKSwgc2l6ZW9mKHRCVEFfQVZfQVBJX09QRU4pKTsKLSAgICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY2hlY2tfcGVlcl9mZWF0dXJlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgc3VwcG9ydGVkIGZlYXR1cmVzIG9uIHRoZSBwZWVyIGRldmljZSBmcm9tIHRoZSBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkIGFuZCByZXR1cm4gdGhlIGZlYXR1cmUgbWFzawotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9BVl9GRUFUIHBlZXIgZGV2aWNlIGZlYXR1cmUgbWFzawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0FWX0ZFQVQgYnRhX2F2X2NoZWNrX3BlZXJfZmVhdHVyZXModWludDE2X3Qgc2VydmljZV91dWlkKSB7Ci0gIHRCVEFfQVZfRkVBVCBwZWVyX2ZlYXR1cmVzID0gMDsKLSAgdEJUQV9BVl9DQiogcF9jYiA9ICZidGFfYXZfY2I7Ci0gIHRTRFBfRElTQ19SRUMqIHBfcmVjID0gTlVMTDsKLSAgdFNEUF9ESVNDX0FUVFIqIHBfYXR0cjsKLSAgdWludDE2X3QgcGVlcl9yY192ZXJzaW9uID0gMDsKLSAgdWludDE2X3QgY2F0ZWdvcmllcyA9IDA7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNlcnZpY2VfdXVpZDp4JXgiLCBfX2Z1bmNfXywgc2VydmljZV91dWlkKTsKLSAgLyogbG9vcCB0aHJvdWdoIGFsbCByZWNvcmRzIHdlIGZvdW5kICovCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLyogZ2V0IG5leHQgcmVjb3JkOyBpZiBub25lIGZvdW5kLCB3ZSdyZSBkb25lICovCi0gICAgcF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKHBfY2ItPnBfZGlzY19kYiwgc2VydmljZV91dWlkLCBwX3JlYyk7Ci0gICAgaWYgKHBfcmVjID09IE5VTEwpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICgoU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QpKSAhPQotICAgICAgICBOVUxMKSB7Ci0gICAgICAvKiBmaW5kIHBlZXIgZmVhdHVyZXMgKi8KLSAgICAgIGlmIChTRFBfRmluZFNlcnZpY2VJbkRiKHBfY2ItPnBfZGlzY19kYiwgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgewotICAgICAgICBwZWVyX2ZlYXR1cmVzIHw9IEJUQV9BVl9GRUFUX1JDQ1Q7Ci0gICAgICB9Ci0gICAgICBpZiAoU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX2NiLT5wX2Rpc2NfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsIE5VTEwpKSB7Ci0gICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfUkNURzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1QpKSAhPSBOVUxMKSB7Ci0gICAgICAvKiBnZXQgcHJvZmlsZSB2ZXJzaW9uIChpZiBmYWlsdXJlLCB2ZXJzaW9uIHBhcmFtZXRlciBpcyBub3QgdXBkYXRlZCkgKi8KLSAgICAgIFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhwX3JlYywgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlZXJfcmNfdmVyc2lvbik7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlcl9yY192ZXJzaW9uIDB4JXgiLCBfX2Z1bmNfXywgcGVlcl9yY192ZXJzaW9uKTsKLQotICAgICAgaWYgKHBlZXJfcmNfdmVyc2lvbiA+PSBBVlJDX1JFVl8xXzMpCi0gICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX1ZFTkRPUiB8IEJUQV9BVl9GRUFUX01FVEFEQVRBKTsKLQotICAgICAgaWYgKHBlZXJfcmNfdmVyc2lvbiA+PSBBVlJDX1JFVl8xXzQpIHsKLSAgICAgICAgLyogZ2V0IHN1cHBvcnRlZCBjYXRlZ29yaWVzICovCi0gICAgICAgIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTKTsKLSAgICAgICAgaWYgKHBfYXR0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgY2F0ZWdvcmllcyA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgICAgICAgICBpZiAoY2F0ZWdvcmllcyAmIEFWUkNfU1VQRl9DVF9DQVQyKQotICAgICAgICAgICAgcGVlcl9mZWF0dXJlcyB8PSAoQlRBX0FWX0ZFQVRfQURWX0NUUkwpOwotICAgICAgICAgIGlmIChjYXRlZ29yaWVzICYgQVZSQ19TVVBGX0NUX0JST1dTRSkKLSAgICAgICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX0JST1dTRSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXJfZmVhdHVyZXM6eCV4IiwgX19mdW5jX18sIHBlZXJfZmVhdHVyZXMpOwotICByZXR1cm4gcGVlcl9mZWF0dXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdmtfY2hlY2tfcGVlcl9mZWF0dXJlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgc3VwcG9ydGVkIGZlYXR1cmVzIG9uIHRoZSBwZWVyIGRldmljZSBmcm9tIHRoZSBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkIGFuZCByZXR1cm4gdGhlIGZlYXR1cmUgbWFzawotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9BVl9GRUFUIHBlZXIgZGV2aWNlIGZlYXR1cmUgbWFzawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0FWX0ZFQVQgYnRhX2F2a19jaGVja19wZWVyX2ZlYXR1cmVzKHVpbnQxNl90IHNlcnZpY2VfdXVpZCkgewotICB0QlRBX0FWX0ZFQVQgcGVlcl9mZWF0dXJlcyA9IDA7Ci0gIHRCVEFfQVZfQ0IqIHBfY2IgPSAmYnRhX2F2X2NiOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzZXJ2aWNlX3V1aWQ6eCV4IiwgX19mdW5jX18sIHNlcnZpY2VfdXVpZCk7Ci0KLSAgLyogbG9vcCB0aHJvdWdoIGFsbCByZWNvcmRzIHdlIGZvdW5kICovCi0gIHRTRFBfRElTQ19SRUMqIHBfcmVjID0KLSAgICAgIFNEUF9GaW5kU2VydmljZUluRGIocF9jYi0+cF9kaXNjX2RiLCBzZXJ2aWNlX3V1aWQsIE5VTEwpOwotICB3aGlsZSAocF9yZWMpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogZm91bmQgU2VydmljZSByZWNvcmQgZm9yIHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgc2VydmljZV91dWlkKTsKLQotICAgIGlmICgoU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QpKSAhPQotICAgICAgICBOVUxMKSB7Ci0gICAgICAvKiBmaW5kIHBlZXIgZmVhdHVyZXMgKi8KLSAgICAgIGlmIChTRFBfRmluZFNlcnZpY2VJbkRiKHBfY2ItPnBfZGlzY19kYiwgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgewotICAgICAgICBwZWVyX2ZlYXR1cmVzIHw9IEJUQV9BVl9GRUFUX1JDQ1Q7Ci0gICAgICB9Ci0gICAgICBpZiAoU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX2NiLT5wX2Rpc2NfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsIE5VTEwpKSB7Ci0gICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfUkNURzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1QpKSAhPSBOVUxMKSB7Ci0gICAgICAvKiBnZXQgcHJvZmlsZSB2ZXJzaW9uIChpZiBmYWlsdXJlLCB2ZXJzaW9uIHBhcmFtZXRlciBpcyBub3QgdXBkYXRlZCkgKi8KLSAgICAgIHVpbnQxNl90IHBlZXJfcmNfdmVyc2lvbiA9IDA7Ci0gICAgICBib29sIHZhbCA9IFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYygKLSAgICAgICAgICBwX3JlYywgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsICZwZWVyX3JjX3ZlcnNpb24pOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXJfcmNfdmVyc2lvbiBmb3IgVEcgMHgleCwgcHJvZmlsZV9mb3VuZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZWVyX3JjX3ZlcnNpb24sIHZhbCk7Ci0KLSAgICAgIGlmIChwZWVyX3JjX3ZlcnNpb24gPj0gQVZSQ19SRVZfMV8zKQotICAgICAgICBwZWVyX2ZlYXR1cmVzIHw9IChCVEFfQVZfRkVBVF9WRU5ET1IgfCBCVEFfQVZfRkVBVF9NRVRBREFUQSk7Ci0KLSAgICAgIC8qIEdldCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLSAgICAgIHRTRFBfRElTQ19BVFRSKiBwX2F0dHIgPQotICAgICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTKTsKLSAgICAgIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgICAgICB1aW50MTZfdCBjYXRlZ29yaWVzID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgICAgICAvKgotICAgICAgICAgKiBUaG91Z2ggQWJzb2x1dGUgVm9sdW1lIGNhbWUgYWZ0ZXIgaW4gMS40IGFuZCBhYm92ZSwgYnV0IHRoZXJlIGFyZQotICAgICAgICAgKiBmZXcgZGV2aWNlcyBpbiBtYXJrZXQgd2hpY2ggc3VwcG9ydHMgYWJzb2x1dGUgVm9sdW1lIGFuZCB0aGV5IGFyZQotICAgICAgICAgKiBzdGlsbCAxLjMuIFRvIGF2b2lkIElPUCBpc3N1c2VzIHdpdGggdGhvc2UgZGV2aWNlcywgd2UgY2hlY2sgZm9yCi0gICAgICAgICAqIDEuMyBhcyBtaW5pbXVtIHZlcnNpb24KLSAgICAgICAgICovCi0gICAgICAgIGlmIChwZWVyX3JjX3ZlcnNpb24gPj0gQVZSQ19SRVZfMV8zKSB7Ci0gICAgICAgICAgaWYgKGNhdGVnb3JpZXMgJiBBVlJDX1NVUEZfVEdfQ0FUMikKLSAgICAgICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX0FEVl9DVFJMKTsKLSAgICAgICAgICBpZiAoY2F0ZWdvcmllcyAmIEFWUkNfU1VQRl9UR19BUFBfU0VUVElOR1MpCi0gICAgICAgICAgICBwZWVyX2ZlYXR1cmVzIHw9IChCVEFfQVZfRkVBVF9BUFBfU0VUVElORyk7Ci0gICAgICAgICAgaWYgKGNhdGVnb3JpZXMgJiBBVlJDX1NVUEZfVEdfQlJPV1NFKQotICAgICAgICAgICAgcGVlcl9mZWF0dXJlcyB8PSAoQlRBX0FWX0ZFQVRfQlJPV1NFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFWUkNQIENvdmVyIEFydHdvcmsgb3ZlciBCSVAgKi8KLSAgICAgICAgaWYgKHBlZXJfcmNfdmVyc2lvbiA+PSBBVlJDX1JFVl8xXzYpIHsKLSAgICAgICAgICBpZiAoc2VydmljZV91dWlkID09IFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCAmJgotICAgICAgICAgICAgICBjYXRlZ29yaWVzICYgQVZSQ19TVVBGX1RHX1BMQVlFUl9DT1ZFUl9BUlQpCi0gICAgICAgICAgICBwZWVyX2ZlYXR1cmVzIHw9IChCVEFfQVZfRkVBVF9DT1ZFUl9BUlRXT1JLKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvKiBnZXQgbmV4dCByZWNvcmQ7IGlmIG5vbmUgZm91bmQsIHdlJ3JlIGRvbmUgKi8KLSAgICBwX3JlYyA9IFNEUF9GaW5kU2VydmljZUluRGIocF9jYi0+cF9kaXNjX2RiLCBzZXJ2aWNlX3V1aWQsIHBfcmVjKTsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlcl9mZWF0dXJlczp4JXgiLCBfX2Z1bmNfXywgcGVlcl9mZWF0dXJlcyk7Ci0gIHJldHVybiBwZWVyX2ZlYXR1cmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZrX2dldF9jb3Zlcl9hcnRfcHNtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIFBTTSBhc3NvY2lhdGVkIHdpdGggdGhlIEFWUkNQIFRhcmdldCBjb3ZlciBhcnQKLSAqICAgICAgICAgICAgICAgICAgZmVhdHVyZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDE2X3QgUFNNIHZhbHVlIHVzZWQgdG8gZ2V0IGNvdmVyIGFydHdvcmssIG9yIDB4MDAwMCBpZgotICogICAgICAgICAgICAgICAgICBvbmUgZG9lcyBub3QgZXhpc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgYnRhX2F2a19nZXRfY292ZXJfYXJ0X3BzbSgpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNlYXJjaGluZyBmb3IgY292ZXIgYXJ0IHBzbSIsIF9fZnVuY19fKTsKLSAgLyogQ292ZXIgQXJ0IEwyQ0FQIFBTTSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBhIHRhcmdldCBkZXZpY2UgKi8KLSAgdEJUQV9BVl9DQiogcF9jYiA9ICZidGFfYXZfY2I7Ci0gIHRTRFBfRElTQ19SRUMqIHBfcmVjID0KLSAgICAgIFNEUF9GaW5kU2VydmljZUluRGIocF9jYi0+cF9kaXNjX2RiLCBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsCi0gICAgICAgICAgTlVMTCk7Ci0gIHdoaWxlIChwX3JlYykgewotICAgIHRTRFBfRElTQ19BVFRSKiBwX2F0dHIgPQotICAgICAgICAoU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9BRERJVElPTl9QUk9UT19ERVNDX0xJU1RTKSk7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSBoYXZlIHRoZSBBZGRpdGlvbmFsIFByb3RvY29sIERlc2NyaXB0aW9uIExpc3RzIGF0dHJpYnV0ZSB0aGVuIHdlCi0gICAgICogc3BlY2lmaWNhbGx5IHdhbnQgdGhlIGxpc3QgdGhhdCBpcyBhbiBMMkNBUCBwcm90b2NvbCBsZWFkaW5nIHRvIE9CRVguCi0gICAgICogQmVjYXVzZSB0aGUgaXMgYSBjYXNlIHdoZXJlIGNvdmVyIGFydCBpcyBzdXBwb3J0ZWQgYW5kIGJyb3dzaW5nIGlzbid0Ci0gICAgICogd2UgbmVlZCB0byBjaGVjayBlYWNoIGxpc3QgZm9yIHRoZSBvbmUgd2Ugd2FudC4KLSAgICAgKgotICAgICAqIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBkbyBkcm9wIGRvd24gaW50byB0aGUgcHJvdG9jb2wgbGlzdCBhbmQgZG8gYQotICAgICAqICJmb3IgZWFjaCBwcm90b2NvbCwgZm9yIGVhY2ggcHJvdG9jb2wgZWxlbWVudCwgZm9yIGVhY2ggcHJvdG9jb2wgZWxlbWVudAotICAgICAqIGxpc3QgcGFyYW1ldGVyLCBpZiB0aGUgcGFyYW1ldGVyIGlzIEwyQ0FQIHRoZW4gZmluZCB0aGUgUFNNIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIGl0LCB0aGVuIG1ha2Ugc3VyZSB3ZSBzZWUgT0JFWCBpbiB0aGF0IHNhbWUgcHJvdG9jb2wiCi0gICAgICovCi0gICAgaWYgKHBfYXR0ciAhPSBOVUxMICYmIFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpCi0gICAgICAgID09IERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpIHsKLSAgICAgIC8vIFBvaW50IHRvIGZpcnN0IGluIExpc3Qgb2YgcHJvdG9jb2xzIChpLmUgWyhMMkNBUCAtPiBBVkNUUCksCi0gICAgICAvLyAoTDJDQVAgLT4gT0JFWCldKQotICAgICAgdFNEUF9ESVNDX0FUVFIqIHBfcHJvdG9jb2xfbGlzdCA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7Ci0gICAgICB3aGlsZSAocF9wcm90b2NvbF9saXN0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfVFlQRShwX3Byb3RvY29sX2xpc3QtPmF0dHJfbGVuX3R5cGUpCi0gICAgICAgICAgICA9PSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgLy8gUG9pbnQgdG8gZmlzdCBpbiBsaXN0IG9mIHByb3RvY29sIGVsZW1lbnRzIChpLmUuIFtMMkNBUCwgQVZDVFBdKQotICAgICAgICAgIHRTRFBfRElTQ19BVFRSKiBwX3Byb3RvY29sID0KLSAgICAgICAgICAgICAgcF9wcm90b2NvbF9saXN0LT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgICAgICBib29sIHByb3RvY29sX2hhc19vYmV4ID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbCBwcm90b2NvbF9oYXNfbDJjYXAgPSBmYWxzZTsKLSAgICAgICAgICB1aW50MTZfdCBwc20gPSAweDAwMDA7Ci0gICAgICAgICAgd2hpbGUgKHBfcHJvdG9jb2wpIHsKLSAgICAgICAgICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUocF9wcm90b2NvbC0+YXR0cl9sZW5fdHlwZSkKLSAgICAgICAgICAgICAgICA9PSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgICAgIC8vIFBvaW50IHRvIGZpcnN0IGl0ZW0gcHJvdG9jb2wgcGFyYW1ldGVycyBsaXN0IChpLmUgW1VVSUQ9TDJDQVAsCi0gICAgICAgICAgICAgIC8vIFBTTT0weDEyMzRdKQotICAgICAgICAgICAgICB0U0RQX0RJU0NfQVRUUiogcF9wcm90b2NvbF9wYXJhbSA9Ci0gICAgICAgICAgICAgICAgICBwX3Byb3RvY29sLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICogQ3VycmVudGx5IHRoZXJlJ3Mgb25seSBldmVyIG9uZSBVVUlEIGFuZCBvbmUgcGFyYW1ldGVyLiBMMmNhcAotICAgICAgICAgICAgICAgKiBoYXMgYSBzaW5nbGUgUFNNLCBBVkNUUCBoYXMgYSB2ZXJzaW9uIGFuZCBPQkVYIGhhcyBub3RoaW5nLgotICAgICAgICAgICAgICAgKiBDaGFuZ2UgdGhpcyBpZiB0aGF0IGV2ZXIgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvY29sX3V1aWQgPSAwOwotICAgICAgICAgICAgICB1aW50MTZfdCBwcm90b2NvbF9wYXJhbSA9IDA7Ci0gICAgICAgICAgICAgIHdoaWxlIChwX3Byb3RvY29sX3BhcmFtKSB7Ci0gICAgICAgICAgICAgICAgdWludDE2X3QgcGFyYW1fdHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIFNEUF9ESVNDX0FUVFJfVFlQRShwX3Byb3RvY29sX3BhcmFtLT5hdHRyX2xlbl90eXBlKTsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBwYXJhbV9sZW4gPQotICAgICAgICAgICAgICAgICAgICBTRFBfRElTQ19BVFRSX0xFTihwX3Byb3RvY29sX3BhcmFtLT5hdHRyX2xlbl90eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSA9PSBVVUlEX0RFU0NfVFlQRSkgewotICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfdXVpZCA9IHBfcHJvdG9jb2xfcGFyYW0tPmF0dHJfdmFsdWUudi51MTY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbV90eXBlID09IFVJTlRfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3RvY29sX3BhcmFtID0gKHBhcmFtX2xlbiA9PSAyKQotICAgICAgICAgICAgICAgICAgICAgID8gcF9wcm90b2NvbF9wYXJhbS0+YXR0cl92YWx1ZS52LnUxNgotICAgICAgICAgICAgICAgICAgICAgIDogcF9wcm90b2NvbF9wYXJhbS0+YXR0cl92YWx1ZS52LnU4OwotICAgICAgICAgICAgICAgIH0gLyogZWxzZSBkb250IGNhcmUgKi8KLSAgICAgICAgICAgICAgICBwX3Byb3RvY29sX3BhcmFtID0gcF9wcm90b2NvbF9wYXJhbS0+cF9uZXh0X2F0dHI7ICAvLyBuZXh0Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLy8gSWYgd2UndmUgZm91bmQgTDJDQVAgdGhlbiB0aGUgcGFyYW1ldGVyIGlzIGEgUFNNCi0gICAgICAgICAgICAgIGlmIChwcm90b2NvbF91dWlkID09IFVVSURfUFJPVE9DT0xfTDJDQVApIHsKLSAgICAgICAgICAgICAgICBwcm90b2NvbF9oYXNfbDJjYXAgPSB0cnVlOwotICAgICAgICAgICAgICAgIHBzbSA9IHByb3RvY29sX3BhcmFtOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3V1aWQgPT0gVVVJRF9QUk9UT0NPTF9PQkVYKSB7Ci0gICAgICAgICAgICAgICAgcHJvdG9jb2xfaGFzX29iZXggPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIHByb3RvY29sIGhhcyBsMmNhcCBhbmQgb2JleCB0aGVuIHdlJ3JlIGZvdW5kIHRoZSBCSVAgUFNNCi0gICAgICAgICAgICBpZiAocHJvdG9jb2xfaGFzX2wyY2FwICYmIHByb3RvY29sX2hhc19vYmV4KSB7Ci0gICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBmb3VuZCBwc20gMHgleCIsIF9fZnVuY19fLCBwc20pOwotICAgICAgICAgICAgICByZXR1cm4gcHNtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9wcm90b2NvbCA9IHBfcHJvdG9jb2wtPnBfbmV4dF9hdHRyOyAgLy8gbmV4dCBwcm90b2NvbCBlbGVtZW50Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBfcHJvdG9jb2xfbGlzdCA9IHBfcHJvdG9jb2xfbGlzdC0+cF9uZXh0X2F0dHI7ICAvLyBuZXh0IHByb3RvY29sCi0gICAgICB9Ci0gICAgfQotICAgIC8qIGdldCBuZXh0IHJlY29yZDsgaWYgbm9uZSBmb3VuZCwgd2UncmUgZG9uZSAqLwotICAgIHBfcmVjID0gU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX2NiLT5wX2Rpc2NfZGIsCi0gICAgICAgIFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCwgcF9yZWMpOwotICB9Ci0gIC8qIEwyQ0FQIFBTTSByYW5nZSBpcyAweDEwMDAtMHhGRkZGIHNvIDB4MDAwMCBpcyBzYWZlIGRlZmF1bHQgaW52YWxpZCAqLwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY291bGQgbm90IGZpbmQgYSBCSVAgcHNtIiwgX19mdW5jX18pOwotICByZXR1cm4gMHgwMDAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX2Rpc2NfZG9uZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIEFWUkNQIHNlcnZpY2UgZGlzY292ZXJ5IHJlc3VsdHMuICBJZiBtYXRjaGluZwotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIGZvdW5kLCBvcGVuIEFWUkNQIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX2Rpc2NfZG9uZShVTlVTRURfQVRUUiB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX0NCKiBwX2NiID0gJmJ0YV9hdl9jYjsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gTlVMTDsKLSAgdEJUQV9BVl9MQ0IqIHBfbGNiOwotICB1aW50OF90IHJjX2hhbmRsZTsKLSAgdEJUQV9BVl9GRUFUIHBlZXJfZmVhdHVyZXMgPSAwOyAvKiBwZWVyIGZlYXR1cmVzIG1hc2sgKi8KLSAgdWludDE2X3QgY292ZXJfYXJ0X3BzbSA9IDB4MDAwMDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogYnRhX2F2X3JjX2Rpc2NfZG9uZSBkaXNjOngleCIsIF9fZnVuY19fLCBwX2NiLT5kaXNjKTsKLSAgaWYgKCFwX2NiLT5kaXNjKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKChwX2NiLT5kaXNjICYgQlRBX0FWX0NITkxfTVNLKSA9PSBCVEFfQVZfQ0hOTF9NU0spIHsKLSAgICAvKiB0aGlzIGlzIHRoZSByYyBoYW5kbGUvaW5kZXggdG8gdEJUQV9BVl9SQ0IgKi8KLSAgICByY19oYW5kbGUgPSBwX2NiLT5kaXNjICYgKH5CVEFfQVZfQ0hOTF9NU0spOwotICB9IGVsc2UgewotICAgIC8qIFZhbGlkYXRlIGFycmF5IGluZGV4Ki8KLSAgICBpZiAoKChwX2NiLT5kaXNjICYgQlRBX0FWX0hORExfTVNLKSAtIDEpIDwgQlRBX0FWX05VTV9TVFJTKSB7Ci0gICAgICBwX3NjYiA9IHBfY2ItPnBfc2NiWyhwX2NiLT5kaXNjICYgQlRBX0FWX0hORExfTVNLKSAtIDFdOwotICAgIH0KLSAgICBpZiAocF9zY2IpIHsKLSAgICAgIHJjX2hhbmRsZSA9IHBfc2NiLT5yY19oYW5kbGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfY2ItPmRpc2MgPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiByY19oYW5kbGUgJWQiLCBfX2Z1bmNfXywgcmNfaGFuZGxlKTsKLSAgaWYgKHBfY2ItPnNkcF9hMmRwX3Nua19oYW5kbGUpIHsKLSAgICAvKiBUaGlzIGlzIFNpbmsgKyBDVCArIFRHKEFicyBWb2wpICovCi0gICAgcGVlcl9mZWF0dXJlcyA9Ci0gICAgICAgIGJ0YV9hdmtfY2hlY2tfcGVlcl9mZWF0dXJlcyhVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQpOwotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwb3B1bGF0aW5nIHJlbSBjdHJsIHRhcmdldCBmZWF0dXJlcyAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcGVlcl9mZWF0dXJlcyk7Ci0gICAgaWYgKEJUQV9BVl9GRUFUX0FEVl9DVFJMICYKLSAgICAgICAgYnRhX2F2a19jaGVja19wZWVyX2ZlYXR1cmVzKFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MKSkKLSAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX0FEVl9DVFJMIHwgQlRBX0FWX0ZFQVRfUkNDVCk7Ci0KLSAgICBpZiAocGVlcl9mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0NPVkVSX0FSVFdPUkspCi0gICAgICBjb3Zlcl9hcnRfcHNtID0gYnRhX2F2a19nZXRfY292ZXJfYXJ0X3BzbSgpOwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBvcHVsYXRpbmcgcmVtIGN0cmwgdGFyZ2V0IGJpcCBwc20gMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgY292ZXJfYXJ0X3BzbSk7Ci0gIH0gZWxzZSBpZiAocF9jYi0+c2RwX2EyZHBfaGFuZGxlKSB7Ci0gICAgLyogY2hlY2sgcGVlciB2ZXJzaW9uIGFuZCB3aGV0aGVyIHN1cHBvcnQgQ1QgYW5kIFRHIHJvbGUgKi8KLSAgICBwZWVyX2ZlYXR1cmVzID0KLSAgICAgICAgYnRhX2F2X2NoZWNrX3BlZXJfZmVhdHVyZXMoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpOwotICAgIGlmICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9BRFZfQ1RSTCkgJiYKLSAgICAgICAgKChwZWVyX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQURWX0NUUkwpID09IDApKSB7Ci0gICAgICAvKiBpZiB3ZSBzdXBwb3J0IGFkdmFuY2UgY29udHJvbCBhbmQgcGVlciBkb2VzIG5vdCwgY2hlY2sgdGhlaXIgc3VwcG9ydCBvbgotICAgICAgICogVEcgcm9sZQotICAgICAgICogc29tZSBpbXBsZW1lbnRhdGlvbiB1c2VzIDEuMyBvbiBDVCBhbnMgMS40IG9uIFRHICovCi0gICAgICBwZWVyX2ZlYXR1cmVzIHw9Ci0gICAgICAgICAgYnRhX2F2X2NoZWNrX3BlZXJfZmVhdHVyZXMoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUKTsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2Ugb3VyIGZlYXR1cmVzIGlmIHRoZSByZW1vdGUgQVZSQ1AgdmVyc2lvbiBpcyAxLjMgb3IgbGVzcyAqLwotICAgIHRTRFBfRElTQ19SRUMqIHBfcmVjID0gbnVsbHB0cjsKLSAgICBwX3JlYyA9IFNEUF9GaW5kU2VydmljZUluRGIocF9jYi0+cF9kaXNjX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCwgcF9yZWMpOwotICAgIGlmIChwX3JlYyAhPSBOVUxMICYmCi0gICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1QpICE9IE5VTEwpIHsKLSAgICAgIC8qIGdldCBwcm9maWxlIHZlcnNpb24gKGlmIGZhaWx1cmUsIHZlcnNpb24gcGFyYW1ldGVyIGlzIG5vdCB1cGRhdGVkKSAqLwotICAgICAgdWludDE2X3QgcGVlcl9yY192ZXJzaW9uID0gMHhGRkZGOyAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBBVlJDUCB2ZXJzaW9uCi0gICAgICBTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMocF9yZWMsIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZWVyX3JjX3ZlcnNpb24pOwotICAgICAgaWYgKHBlZXJfcmNfdmVyc2lvbiA8PSBBVlJDX1JFVl8xXzMpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFVzaW5nIEFWUkNQIDEuMyBDYXBhYmlsaXRpZXMgd2l0aCByZW1vdGUgZGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIHBfYnRhX2F2X2NmZyA9ICZidGFfYXZfY2ZnX2NvbXBhdGliaWxpdHk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcF9jYi0+ZGlzYyA9IDA7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2NiLT5wX2Rpc2NfZGIpOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyX2ZlYXR1cmVzIDB4JXgsIGZlYXR1cmVzIDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2ZlYXR1cmVzLCBwX2NiLT5mZWF0dXJlcyk7Ci0KLSAgLyogaWYgd2UgaGF2ZSBubyByYyBjb25uZWN0aW9uICovCi0gIGlmIChyY19oYW5kbGUgPT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FKSB7Ci0gICAgaWYgKHBfc2NiKSB7Ci0gICAgICAvKiBpZiBwZWVyIHJlbW90ZSBjb250cm9sIHNlcnZpY2UgbWF0Y2hlcyBvdXJzIGFuZCBVU0VfUkMgaXMgdHJ1ZSAqLwotICAgICAgaWYgKCgoKHBfY2ItPmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNDVCkgJiYKLSAgICAgICAgICAgIChwZWVyX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNURykpIHx8Ci0gICAgICAgICAgICgocF9jYi0+ZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSAmJgotICAgICAgICAgICAgKHBlZXJfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ0NUKSkpKSB7Ci0gICAgICAgIHBfbGNiID0gYnRhX2F2X2ZpbmRfbGNiKHBfc2NiLT5QZWVyQWRkcmVzcygpLCBCVEFfQVZfTENCX0ZJTkQpOwotICAgICAgICBpZiAocF9sY2IpIHsKLSAgICAgICAgICByY19oYW5kbGUgPSBidGFfYXZfcmNfY3JlYXRlKHBfY2IsIEFWQ1RfSU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHBfc2NiLT5oZGkgKyAxKSwgcF9sY2ItPmxpZHgpOwotICAgICAgICAgIHBfY2ItPnJjYltyY19oYW5kbGVdLnBlZXJfZmVhdHVyZXMgPSBwZWVyX2ZlYXR1cmVzOwotICAgICAgICAgIHBfY2ItPnJjYltyY19oYW5kbGVdLmNvdmVyX2FydF9wc20gPSBjb3Zlcl9hcnRfcHNtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYW4gbm90IGZpbmQgTENCISEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9zY2ItPnVzZV9yYykgewotICAgICAgICAvKiBjYW4gbm90IGZpbmQgQVZSQyBvbiBwZWVyIGRldmljZS4gcmVwb3J0IGZhaWx1cmUgKi8KLSAgICAgICAgcF9zY2ItPnVzZV9yYyA9IGZhbHNlOwotICAgICAgICB0QlRBX0FWX1JDX09QRU4gcmNfb3BlbjsKLSAgICAgICAgcmNfb3Blbi5wZWVyX2FkZHIgPSBwX3NjYi0+UGVlckFkZHJlc3MoKTsKLSAgICAgICAgcmNfb3Blbi5wZWVyX2ZlYXR1cmVzID0gMDsKLSAgICAgICAgcmNfb3Blbi5jb3Zlcl9hcnRfcHNtID0gMDsKLSAgICAgICAgcmNfb3Blbi5zdGF0dXMgPSBCVEFfQVZfRkFJTF9TRFA7Ci0gICAgICAgIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gICAgICAgIGJ0YV9hdl9kYXRhLnJjX29wZW4gPSByY19vcGVuOwotICAgICAgICAoKnBfY2ItPnBfY2JhY2spKEJUQV9BVl9SQ19PUEVOX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdEJUQV9BVl9SQ19GRUFUIHJjX2ZlYXQ7Ci0gICAgcF9jYi0+cmNiW3JjX2hhbmRsZV0ucGVlcl9mZWF0dXJlcyA9IHBlZXJfZmVhdHVyZXM7Ci0gICAgcmNfZmVhdC5yY19oYW5kbGUgPSByY19oYW5kbGU7Ci0gICAgcmNfZmVhdC5wZWVyX2ZlYXR1cmVzID0gcGVlcl9mZWF0dXJlczsKLSAgICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgICAgLyoKLSAgICAgICAqIEluIGNhc2Ugc2NiIGlzIG5vdCBjcmVhdGVkIGJ5IHRoZSB0aW1lIHdlIGFyZSBkb25lIHdpdGggU0RQCi0gICAgICAgKiB3ZSBzdGlsbCBuZWVkIHRvIHNlbmQgUkMgZmVhdHVyZSBldmVudC4gU28gd2UgbmVlZCB0byBnZXQgQkQKLSAgICAgICAqIGZyb20gTWVzc2FnZS4gIE5vdGUgdGhhdCBsaWR4IGlzIDEgYmFzZWQgbm90IDAgYmFzZWQKLSAgICAgICAqLwotICAgICAgcmNfZmVhdC5wZWVyX2FkZHIgPSBwX2NiLT5sY2JbcF9jYi0+cmNiW3JjX2hhbmRsZV0ubGlkeCAtIDFdLmFkZHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJjX2ZlYXQucGVlcl9hZGRyID0gcF9zY2ItPlBlZXJBZGRyZXNzKCk7Ci0gICAgfQotCi0gICAgdEJUQV9BViBidGFfYXZfZmVhdDsKLSAgICBidGFfYXZfZmVhdC5yY19mZWF0ID0gcmNfZmVhdDsKLSAgICAoKnBfY2ItPnBfY2JhY2spKEJUQV9BVl9SQ19GRUFUX0VWVCwgJmJ0YV9hdl9mZWF0KTsKLQotICAgIC8vIFNlbmQgUFNNIGRhdGEKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU2VuZCBQU00gZGF0YSIsIF9fZnVuY19fKTsKLSAgICB0QlRBX0FWX1JDX1BTTSByY19wc207Ci0gICAgcF9jYi0+cmNiW3JjX2hhbmRsZV0uY292ZXJfYXJ0X3BzbSA9IGNvdmVyX2FydF9wc207Ci0gICAgcmNfcHNtLnJjX2hhbmRsZSA9IHJjX2hhbmRsZTsKLSAgICByY19wc20uY292ZXJfYXJ0X3BzbSA9IGNvdmVyX2FydF9wc207Ci0gICAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICAgIHJjX3BzbS5wZWVyX2FkZHIgPSBwX2NiLT5sY2JbcF9jYi0+cmNiW3JjX2hhbmRsZV0ubGlkeCAtIDFdLmFkZHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJjX3BzbS5wZWVyX2FkZHIgPSBwX3NjYi0+UGVlckFkZHJlc3MoKTsKLSAgICB9Ci0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmNfcHNtID0gMHgleCIsIF9fZnVuY19fLCByY19wc20uY292ZXJfYXJ0X3BzbSk7Ci0KLSAgICB0QlRBX0FWIGJ0YV9hdl9wc207Ci0gICAgYnRhX2F2X3BzbS5yY19jb3Zlcl9hcnRfcHNtID0gcmNfcHNtOwotICAgICgqcF9jYi0+cF9jYmFjaykoQlRBX0FWX1JDX1BTTV9FVlQsICZidGFfYXZfcHNtKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX2Nsb3NlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IEFWUkNQIHN0YXRlIHRvIGNsb3NlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfcmNfY2xvc2VkKHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfQ0IqIHBfY2IgPSAmYnRhX2F2X2NiOwotICB0QlRBX0FWX1JDX0NMT1NFIHJjX2Nsb3NlOwotICB0QlRBX0FWX1JDX0NPTk5fQ0hHKiBwX21zZyA9ICh0QlRBX0FWX1JDX0NPTk5fQ0hHKilwX2RhdGE7Ci0gIHRCVEFfQVZfUkNCKiBwX3JjYjsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiOwotICBpbnQgaTsKLSAgYm9vbCBjb25uID0gZmFsc2U7Ci0gIHRCVEFfQVZfTENCKiBwX2xjYjsKLQotICByY19jbG9zZS5yY19oYW5kbGUgPSBCVEFfQVZfUkNfSEFORExFX05PTkU7Ci0gIHBfc2NiID0gTlVMTDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJjX2hhbmRsZTolZCIsIF9fZnVuY19fLCBwX21zZy0+aGFuZGxlKTsKLSAgZm9yIChpID0gMDsgaSA8IEJUQV9BVl9OVU1fUkNCOyBpKyspIHsKLSAgICBwX3JjYiA9ICZwX2NiLT5yY2JbaV07Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJjYlslZF0gcmNfaGFuZGxlOiVkLCBzdGF0dXM9MHgleCIsIF9fZnVuY19fLCBpLAotICAgICAgICAgICAgICAgICAgICAgcF9yY2ItPmhhbmRsZSwgcF9yY2ItPnN0YXR1cyk7Ci0gICAgaWYgKHBfcmNiLT5oYW5kbGUgPT0gcF9tc2ctPmhhbmRsZSkgewotICAgICAgcmNfY2xvc2UucmNfaGFuZGxlID0gaTsKLSAgICAgIHBfcmNiLT5zdGF0dXMgJj0gfkJUQV9BVl9SQ19DT05OX01BU0s7Ci0gICAgICBwX3JjYi0+cGVlcl9mZWF0dXJlcyA9IDA7Ci0gICAgICBwX3JjYi0+Y292ZXJfYXJ0X3BzbSA9IDA7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogc2hkbDolZCwgbGlkeDolZCIsIF9fZnVuY19fLCBwX3JjYi0+c2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9yY2ItPmxpZHgpOwotICAgICAgaWYgKHBfcmNiLT5zaGRsKSB7Ci0gICAgICAgIGlmICgocF9yY2ItPnNoZGwgLSAxKSA8IEJUQV9BVl9OVU1fU1RSUykgewotICAgICAgICAgIHBfc2NiID0gYnRhX2F2X2NiLnBfc2NiW3BfcmNiLT5zaGRsIC0gMV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBfc2NiKSB7Ci0gICAgICAgICAgcmNfY2xvc2UucGVlcl9hZGRyID0gcF9zY2ItPlBlZXJBZGRyZXNzKCk7Ci0gICAgICAgICAgaWYgKHBfc2NiLT5yY19oYW5kbGUgPT0gcF9yY2ItPmhhbmRsZSkKLSAgICAgICAgICAgIHBfc2NiLT5yY19oYW5kbGUgPSBCVEFfQVZfUkNfSEFORExFX05PTkU7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNoZGw6JWQsIHNyY2g6JWQiLCBfX2Z1bmNfXywgcF9yY2ItPnNoZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+cmNfaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICBwX3JjYi0+c2hkbCA9IDA7Ci0gICAgICB9IGVsc2UgaWYgKHBfcmNiLT5saWR4ID09IChCVEFfQVZfTlVNX0xJTktTICsgMSkpIHsKLSAgICAgICAgLyogaWYgdGhlIFJDQiB1c2VzIHRoZSBleHRyYSBMQ0IsIHVzZSB0aGUgYWRkciBmb3IgZXZlbnQgYW5kIGNsZWFuIGl0ICovCi0gICAgICAgIHBfbGNiID0gJnBfY2ItPmxjYltCVEFfQVZfTlVNX0xJTktTXTsKLSAgICAgICAgcmNfY2xvc2UucGVlcl9hZGRyID0gcF9tc2ctPnBlZXJfYWRkcjsKLSAgICAgICAgTE9HX0lORk8oIiVzOiByY19vbmx5IGNsb3NlZCBiZF9hZGRyOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICBwX21zZy0+cGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHBfbGNiLT5jb25uX21zayA9IDA7Ci0gICAgICAgIHBfbGNiLT5saWR4ID0gMDsKLSAgICAgIH0KLSAgICAgIHBfcmNiLT5saWR4ID0gMDsKLQotICAgICAgaWYgKChwX3JjYi0+c3RhdHVzICYgQlRBX0FWX1JDX1JPTEVfTUFTSykgPT0gQlRBX0FWX1JDX1JPTEVfSU5UKSB7Ci0gICAgICAgIC8qIEFWQ1QgQ0NCIGlzIGRlYWxsb2NhdGVkICovCi0gICAgICAgIHBfcmNiLT5oYW5kbGUgPSBCVEFfQVZfUkNfSEFORExFX05PTkU7Ci0gICAgICAgIHBfcmNiLT5zdGF0dXMgPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogQVZDVCBDQ0IgaXMgc3RpbGwgdGhlcmUuIGRlYWxsb2MgKi8KLSAgICAgICAgYnRhX2F2X2RlbF9yYyhwX3JjYik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICgocF9yY2ItPmhhbmRsZSAhPSBCVEFfQVZfUkNfSEFORExFX05PTkUpICYmCi0gICAgICAgICAgICAgICAocF9yY2ItPnN0YXR1cyAmIEJUQV9BVl9SQ19DT05OX01BU0spKSB7Ci0gICAgICAvKiBhdCBsZWFzdCBvbmUgY2hhbm5lbCBpcyBzdGlsbCBjb25uZWN0ZWQgKi8KLSAgICAgIGNvbm4gPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmICghY29ubikgewotICAgIC8qIG5vIEFWUkMgY2hhbm5lbHMgYXJlIGNvbm5lY3RlZCwgZ28gYmFjayB0byBJTklUIHN0YXRlICovCi0gICAgYnRhX2F2X3NtX2V4ZWN1dGUocF9jYiwgQlRBX0FWX0FWUkNfTk9ORV9FVlQsIE5VTEwpOwotICB9Ci0KLSAgaWYgKHJjX2Nsb3NlLnJjX2hhbmRsZSA9PSBCVEFfQVZfUkNfSEFORExFX05PTkUpIHsKLSAgICByY19jbG9zZS5yY19oYW5kbGUgPSBwX21zZy0+aGFuZGxlOwotICAgIHJjX2Nsb3NlLnBlZXJfYWRkciA9IHBfbXNnLT5wZWVyX2FkZHI7Ci0gIH0KLSAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgYnRhX2F2X2RhdGEucmNfY2xvc2UgPSByY19jbG9zZTsKLSAgKCpwX2NiLT5wX2NiYWNrKShCVEFfQVZfUkNfQ0xPU0VfRVZULCAmYnRhX2F2X2RhdGEpOwotICBpZiAoYnRhX2F2X2NiLnJjX2FjcF9oYW5kbGUgPT0gQlRBX0FWX1JDX0hBTkRMRV9OT05FCi0gICAgICAgICAgICAgICAgICAmJiBidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKQotICAgICAgYnRhX2F2X3JjX2NyZWF0ZSgmYnRhX2F2X2NiLCBBVkNUX0FDUCwgMCwgQlRBX0FWX05VTV9MSU5LUyArIDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3JjX2Jyb3dzZV9vcGVuZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFWUkMgYnJvd3NpbmcgY2hhbm5lbCBpcyBvcGVuZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfcmNfYnJvd3NlX29wZW5lZCh0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX0NCKiBwX2NiID0gJmJ0YV9hdl9jYjsKLSAgdEJUQV9BVl9SQ19DT05OX0NIRyogcF9tc2cgPSAodEJUQV9BVl9SQ19DT05OX0NIRyopcF9kYXRhOwotICB0QlRBX0FWX1JDX0JST1dTRV9PUEVOIHJjX2Jyb3dzZV9vcGVuOwotCi0gIExPR19JTkZPKCIlczogcGVlcl9hZGRyOiAlcyByY19oYW5kbGU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcF9tc2ctPnBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfbXNnLT5oYW5kbGUpOwotCi0gIHJjX2Jyb3dzZV9vcGVuLnN0YXR1cyA9IEJUQV9BVl9TVUNDRVNTOwotICByY19icm93c2Vfb3Blbi5yY19oYW5kbGUgPSBwX21zZy0+aGFuZGxlOwotICByY19icm93c2Vfb3Blbi5wZWVyX2FkZHIgPSBwX21zZy0+cGVlcl9hZGRyOwotCi0gIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gIGJ0YV9hdl9kYXRhLnJjX2Jyb3dzZV9vcGVuID0gcmNfYnJvd3NlX29wZW47Ci0gICgqcF9jYi0+cF9jYmFjaykoQlRBX0FWX1JDX0JST1dTRV9PUEVOX0VWVCwgJmJ0YV9hdl9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9yY19icm93c2VfY2xvc2VkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBVlJDIGJyb3dzaW5nIGNoYW5uZWwgaXMgY2xvc2VkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3JjX2Jyb3dzZV9jbG9zZWQodEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9DQiogcF9jYiA9ICZidGFfYXZfY2I7Ci0gIHRCVEFfQVZfUkNfQ09OTl9DSEcqIHBfbXNnID0gKHRCVEFfQVZfUkNfQ09OTl9DSEcqKXBfZGF0YTsKLSAgdEJUQV9BVl9SQ19CUk9XU0VfQ0xPU0UgcmNfYnJvd3NlX2Nsb3NlOwotCi0gIExPR19JTkZPKCIlczogcGVlcl9hZGRyOiAlcyByY19oYW5kbGU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcF9tc2ctPnBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfbXNnLT5oYW5kbGUpOwotCi0gIHJjX2Jyb3dzZV9jbG9zZS5yY19oYW5kbGUgPSBwX21zZy0+aGFuZGxlOwotICByY19icm93c2VfY2xvc2UucGVlcl9hZGRyID0gcF9tc2ctPnBlZXJfYWRkcjsKLQotICB0QlRBX0FWIGJ0YV9hdl9kYXRhOwotICBidGFfYXZfZGF0YS5yY19icm93c2VfY2xvc2UgPSByY19icm93c2VfY2xvc2U7Ci0gICgqcF9jYi0+cF9jYmFjaykoQlRBX0FWX1JDX0JST1dTRV9DTE9TRV9FVlQsICZidGFfYXZfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfcmNfZGlzYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc3RhcnQgQVZSQyBTRFAgZGlzY292ZXJ5LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9yY19kaXNjKHVpbnQ4X3QgZGlzYykgewotICB0QlRBX0FWX0NCKiBwX2NiID0gJmJ0YV9hdl9jYjsKLSAgdEFWUkNfU0RQX0RCX1BBUkFNUyBkYl9wYXJhbXM7Ci0gIHVpbnQxNl90IGF0dHJfbGlzdFtdID0ge0FUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9JRF9BRERJVElPTl9QUk9UT19ERVNDX0xJU1RTfTsKLSAgdWludDhfdCBoZGk7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYjsKLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBkaXNjOiAweCV4LCBidGFfYXZfY2IuZGlzYzogMHgleCIsIF9fZnVuY19fLCBkaXNjLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jYi5kaXNjKTsKLSAgaWYgKChidGFfYXZfY2IuZGlzYyAhPSAwKSB8fCAoZGlzYyA9PSAwKSkgcmV0dXJuOwotCi0gIGlmICgoZGlzYyAmIEJUQV9BVl9DSE5MX01TSykgPT0gQlRBX0FWX0NITkxfTVNLKSB7Ci0gICAgLyogdGhpcyBpcyB0aGUgcmMgaGFuZGxlL2luZGV4IHRvIHRCVEFfQVZfUkNCICovCi0gICAgcmNfaGFuZGxlID0gZGlzYyAmICh+QlRBX0FWX0NITkxfTVNLKTsKLSAgICBpZiAocF9jYi0+cmNiW3JjX2hhbmRsZV0ubGlkeCkgewotICAgICAgcGVlcl9hZGRyID0gcF9jYi0+bGNiW3BfY2ItPnJjYltyY19oYW5kbGVdLmxpZHggLSAxXS5hZGRyOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBoZGkgPSAoZGlzYyAmIEJUQV9BVl9ITkRMX01TSykgLSAxOwotICAgIHBfc2NiID0gcF9jYi0+cF9zY2JbaGRpXTsKLQotICAgIGlmIChwX3NjYikgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJjX2hhbmRsZSAlZCIsIF9fZnVuY19fLCBwX3NjYi0+cmNfaGFuZGxlKTsKLSAgICAgIHBlZXJfYWRkciA9IHBfc2NiLT5QZWVyQWRkcmVzcygpOwotICAgIH0KLSAgfQotCi0gIGlmICghcGVlcl9hZGRyLklzRW1wdHkoKSkgewotICAgIC8qIGFsbG9jYXRlIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotICAgIGlmIChwX2NiLT5wX2Rpc2NfZGIgPT0gTlVMTCkKLSAgICAgIHBfY2ItPnBfZGlzY19kYiA9ICh0U0RQX0RJU0NPVkVSWV9EQiopb3NpX21hbGxvYyhCVEFfQVZfRElTQ19CVUZfU0laRSk7Ci0KLSAgICAvKiBzZXQgdXAgcGFyYW1ldGVycyAqLwotICAgIGRiX3BhcmFtcy5kYl9sZW4gPSBCVEFfQVZfRElTQ19CVUZfU0laRTsKLSAgICBkYl9wYXJhbXMubnVtX2F0dHIgPSBzaXplb2YoYXR0cl9saXN0KSAvIHNpemVvZih1aW50MTZfdCk7Ci0gICAgZGJfcGFyYW1zLnBfZGIgPSBwX2NiLT5wX2Rpc2NfZGI7Ci0gICAgZGJfcGFyYW1zLnBfYXR0cnMgPSBhdHRyX2xpc3Q7Ci0KLSAgICAvKiBzZWFyY2hpbmcgZm9yIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MIGdldHMgYm90aCBURyBhbmQgQ1QgKi8KLSAgICBpZiAoQVZSQ19GaW5kU2VydmljZShVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCwgcGVlcl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICZkYl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidGFfYXZfYXZyY19zZHBfY2JhY2spKSA9PSBBVlJDX1NVQ0NFU1MpIHsKLSAgICAgIHBfY2ItPmRpc2MgPSBkaXNjOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGRpc2MgMHgleCIsIF9fZnVuY19fLCBwX2NiLT5kaXNjKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9kZXJlZ19jb21wCi0gKgotICogRGVzY3JpcHRpb24gICAgICBkZXJlZ2lzdGVyIGNvbXBsZXRlLiBmcmVlIHRoZSBzdHJlYW0gY29udHJvbCBibG9jay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZGVyZWdfY29tcCh0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0FWX0NCKiBwX2NiID0gJmJ0YV9hdl9jYjsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiOwotICB0QlRBX1VUTF9DT0QgY29kOwotICB1aW50OF90IG1hc2s7Ci0gIEJUX0hEUiogcF9idWY7Ci0KLSAgLyogZmluZCB0aGUgc3RyZWFtIGNvbnRyb2wgYmxvY2sgKi8KLSAgcF9zY2IgPSBidGFfYXZfaG5kbF90b19zY2IocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotCi0gIGlmIChwX3NjYikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBkZXJlZ2lzdGVyZWQgJWQoaCVkKSIsIF9fZnVuY19fLCBwX3NjYi0+Y2hubCwKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5obmRsKTsKLSAgICBtYXNrID0gQlRBX0FWX0hORExfVE9fTVNLKHBfc2NiLT5oZGkpOwotICAgIHBfY2ItPnJlZ19hdWRpbyAmPSB+bWFzazsKLSAgICBpZiAoKHBfY2ItPmNvbm5fYXVkaW8gJiBtYXNrKSAmJiBwX2NiLT5hdWRpb19vcGVuX2NudCkgewotICAgICAgLyogdGhpcyBjaGFubmVsIGlzIHN0aWxsIG1hcmtlZCBhcyBvcGVuLiBkZWNyZWFzZSB0aGUgY291bnQgKi8KLSAgICAgIHBfY2ItPmF1ZGlvX29wZW5fY250LS07Ci0gICAgfQotICAgIHBfY2ItPmNvbm5fYXVkaW8gJj0gfm1hc2s7Ci0KLSAgICBpZiAocF9zY2ItPnFfdGFnID09IEJUQV9BVl9RX1RBR19TVFJFQU0gJiYgcF9zY2ItPmEyZHBfbGlzdCkgewotICAgICAgLyogbWFrZSBzdXJlIG5vIGJ1ZmZlcnMgYXJlIGluIGEyZHBfbGlzdCAqLwotICAgICAgd2hpbGUgKCFsaXN0X2lzX2VtcHR5KHBfc2NiLT5hMmRwX2xpc3QpKSB7Ci0gICAgICAgIHBfYnVmID0gKEJUX0hEUiopbGlzdF9mcm9udChwX3NjYi0+YTJkcF9saXN0KTsKLSAgICAgICAgbGlzdF9yZW1vdmUocF9zY2ItPmEyZHBfbGlzdCwgcF9idWYpOwotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIHRoZSBBMkRQIFNEUCByZWNvcmQsIGlmIG5vIG1vcmUgYXVkaW8gc3RyZWFtIGlzIGxlZnQgKi8KLSAgICBpZiAoIXBfY2ItPnJlZ19hdWRpbykgewotCi0gICAgICAvKiBPbmx5IHJlbW92ZSB0aGUgU0RQIHJlY29yZCBpZiB3ZSdyZSB0aGUgb25lcyB0aGF0IGNyZWF0ZWQgaXQgKi8KLSAgICAgIGlmIChpc19uZXdfYXZyY3BfZW5hYmxlZCgpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBuZXdhdnJjcCBpcyB0aGUgb3duZXIgb2YgdGhlIEFWUkNQIFRhcmdldCBTRFAgIgotICAgICAgICAgICAgInJlY29yZC4gRG9uJ3QgZGVyZWcgdGhlIFNEUCByZWNvcmQiLCBfX2Z1bmNfXyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbmV3YXZyY3AgaXMgbm90IGVuYWJsZWQuIFJlbW92ZSBTRFAgcmVjb3JkIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgYnRhX2FyX2RlcmVnX2F2cmMoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpOwotICAgICAgfQotCi0gICAgICBpZiAocF9jYi0+c2RwX2EyZHBfaGFuZGxlKSB7Ci0gICAgICAgIGJ0YV9hdl9kZWxfc2RwX3JlYygmcF9jYi0+c2RwX2EyZHBfaGFuZGxlKTsKLSAgICAgICAgcF9jYi0+c2RwX2EyZHBfaGFuZGxlID0gMDsKLSAgICAgICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UpOwotICAgICAgfQotCi0gICAgICBpZiAocF9jYi0+c2RwX2EyZHBfc25rX2hhbmRsZSkgewotICAgICAgICBidGFfYXZfZGVsX3NkcF9yZWMoJnBfY2ItPnNkcF9hMmRwX3Nua19oYW5kbGUpOwotICAgICAgICBwX2NiLT5zZHBfYTJkcF9zbmtfaGFuZGxlID0gMDsKLSAgICAgICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBidGFfYXZfZnJlZV9zY2IocF9zY2IpOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGF1ZGlvIDB4JXgsIGRpc2FibGU6JWQiLCBfX2Z1bmNfXywgcF9jYi0+cmVnX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgIHBfY2ItPmRpc2FibGluZyk7Ci0gIC8qIGlmIG5vIHN0cmVhbSBjb250cm9sIGJsb2NrIGlzIGFjdGl2ZSAqLwotICBpZiAocF9jYi0+cmVnX2F1ZGlvID09IDApIHsKLSAgICAvKiBkZXJlZ2lzdGVyIGZyb20gQVZEVCAqLwotICAgIGJ0YV9hcl9kZXJlZ19hdmR0KCk7Ci0KLSAgICAvKiBkZXJlZ2lzdGVyIGZyb20gQVZDVCAqLwotICAgIGJ0YV9hcl9kZXJlZ19hdnJjKFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCk7Ci0gICAgYnRhX2FyX2RlcmVnX2F2Y3QoKTsKLQotICAgIGlmIChwX2NiLT5kaXNhYmxpbmcpIHsKLSAgICAgIHBfY2ItPmRpc2FibGluZyA9IGZhbHNlOwotICAgICAgLy8gcmVzZXQgZW5hYmxpbmcgcGFyYW1ldGVycwotICAgICAgcF9jYi0+ZmVhdHVyZXMgPSAwOwotICAgICAgcF9jYi0+c2VjX21hc2sgPSAwOwotICAgIH0KLQotICAgIC8qIENsZWFyIHRoZSBDYXB0dXJpbmcgc2VydmljZSBjbGFzcyBiaXQgKi8KLSAgICBjb2Quc2VydmljZSA9IEJUTV9DT0RfU0VSVklDRV9DQVBUVVJJTkc7Ci0gICAgdXRsX3NldF9kZXZpY2VfY2xhc3MoJmNvZCwgQlRBX1VUTF9DTFJfQ09EX1NFUlZJQ0VfQ0xBU1MpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2FwaS5jYyBiL2J0YS9hdi9idGFfYXZfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThjY2ZkLi4wMDAwMDAwCi0tLSBhL2J0YS9hdi9idGFfYXZfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTEtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSSBmb3IgdGhlIGFkdmFuY2VkIGF1ZGlvL3ZpZGVvIChBVikKLSAqICBzdWJzeXN0ZW0gb2YgQlRBLCBCcm9hZGNvbSdzIEJsdWV0b290aCBhcHBsaWNhdGlvbiBsYXllciBmb3IgbW9iaWxlCi0gKiAgcGhvbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRhX2F2IgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjb25zdCB0QlRBX1NZU19SRUcgYnRhX2F2X3JlZyA9IHtidGFfYXZfaGRsX2V2ZW50LCBCVEFfQXZEaXNhYmxlfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdkVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIHRoZSBhZHZhbmNlZCBhdWRpby92aWRlbyBzZXJ2aWNlLiBXaGVuIHRoZSBlbmFibGUKLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0FWX0VOQUJMRV9FVlQuIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGZ1bmN0aW9uIGluIHRoZSBBViBBUEkgYXJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZFbmFibGUodEJUQV9BVl9GRUFUIGZlYXR1cmVzLCB0QlRBX0FWX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIHRCVEFfQVZfQVBJX0VOQUJMRSogcF9idWYgPQotICAgICAgKHRCVEFfQVZfQVBJX0VOQUJMRSopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfRU5BQkxFKSk7Ci0KLSAgLyogcmVnaXN0ZXIgd2l0aCBCVEEgc3lzdGVtIG1hbmFnZXIgKi8KLSAgYnRhX3N5c19yZWdpc3RlcihCVEFfSURfQVYsICZidGFfYXZfcmVnKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9FTkFCTEVfRVZUOwotICBwX2J1Zi0+cF9jYmFjayA9IHBfY2JhY2s7Ci0gIHBfYnVmLT5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZEaXNhYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNhYmxlIHRoZSBhZHZhbmNlZCBhdWRpby92aWRlbyBzZXJ2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdkRpc2FibGUodm9pZCkgewotICBCVF9IRFJfUklHSUQqIHBfYnVmID0gKEJUX0hEUl9SSUdJRCopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSk7Ci0KLSAgYnRhX3N5c19kZXJlZ2lzdGVyKEJUQV9JRF9BVik7Ci0gIHBfYnVmLT5ldmVudCA9IEJUQV9BVl9BUElfRElTQUJMRV9FVlQ7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlciB0aGUgYXVkaW8gb3IgdmlkZW8gc2VydmljZSB0byBzdGFjay4gV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0FWX1JFR0lTVEVSX0VWVC4gVGhpcyBmdW5jdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBiZWZvcmUgQVZEVCBzdHJlYW0gaXMgb3Blbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UmVnaXN0ZXIodEJUQV9BVl9DSE5MIGNobmwsIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgdEJUQV9BVl9TSU5LX0RBVEFfQ0JBQ0sqIHBfc2lua19kYXRhX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQpIHsKLSAgdEJUQV9BVl9BUElfUkVHKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9BVl9BUElfUkVHKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0FQSV9SRUcpKTsKLQotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY2hubDsKLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9BVl9BUElfUkVHSVNURVJfRVZUOwotICBpZiAocF9zZXJ2aWNlX25hbWUpCi0gICAgc3RybGNweShwX2J1Zi0+cF9zZXJ2aWNlX25hbWUsIHBfc2VydmljZV9uYW1lLCBCVEFfU0VSVklDRV9OQU1FX0xFTik7Ci0gIGVsc2UKLSAgICBwX2J1Zi0+cF9zZXJ2aWNlX25hbWVbMF0gPSAwOwotICBwX2J1Zi0+YXBwX2lkID0gYXBwX2lkOwotICBwX2J1Zi0+cF9hcHBfc2lua19kYXRhX2NiYWNrID0gcF9zaW5rX2RhdGFfY2JhY2s7Ci0gIHBfYnVmLT5zZXJ2aWNlX3V1aWQgPSBzZXJ2aWNlX3V1aWQ7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdkRlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlcmVnaXN0ZXIgdGhlIGF1ZGlvIG9yIHZpZGVvIHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZEZXJlZ2lzdGVyKHRCVEFfQVZfSE5ETCBobmRsKSB7Ci0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBobmRsOwotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfQVZfQVBJX0RFUkVHSVNURVJfRVZUOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVucyBhbiBhZHZhbmNlZCBhdWRpby92aWRlbyBjb25uZWN0aW9uIHRvIGEgcGVlciBkZXZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gY29ubmVjdGlvbiBpcyBvcGVuIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZAotICogICAgICAgICAgICAgICAgICB3aXRoIGEgQlRBX0FWX09QRU5fRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Bdk9wZW4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9BVl9ITkRMIGhhbmRsZSwgYm9vbCB1c2VfcmMsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgdXVpZCkgewotICBMT0dfSU5GTygiJXM6IHBlZXIgJXMgYnRhX2hhbmRsZToweCV4IHVzZV9yYz0lcyB1dWlkPTB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGhhbmRsZSwgKHVzZV9yYykgPyAidHJ1ZSIgOiAiZmFsc2UiLAotICAgICAgICAgICB1dWlkKTsKLQotICB0QlRBX0FWX0FQSV9PUEVOKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9BVl9BUElfT1BFTiopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfT1BFTikpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX09QRU5fRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotICBwX2J1Zi0+YmRfYWRkciA9IGJkX2FkZHI7Ci0gIHBfYnVmLT51c2VfcmMgPSB1c2VfcmM7Ci0gIHBfYnVmLT5zd2l0Y2hfcmVzID0gQlRBX0FWX1JTX05PTkU7Ci0gIHBfYnVmLT51dWlkID0gdXVpZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2Q2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIHRoZSBjdXJyZW50IHN0cmVhbXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2Q2xvc2UodEJUQV9BVl9ITkRMIGhhbmRsZSkgewotICBMT0dfSU5GTygiJXM6IGJ0YV9oYW5kbGU6MHgleCIsIF9fZnVuY19fLCBoYW5kbGUpOwotCi0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfQVZfQVBJX0NMT1NFX0VWVDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZEaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZEaXNjb25uZWN0KHRCVEFfQVZfSE5ETCBoYW5kbGUpIHsKLSAgTE9HX0lORk8oIiVzOiBidGFfaGFuZGxlPTB4JXgiLCBfX2Z1bmNfXywgaGFuZGxlKTsKLQotICB0QlRBX0FWX0FQSV9ESVNDTlQqIHBfYnVmID0KLSAgICAgICh0QlRBX0FWX0FQSV9ESVNDTlQqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX0RJU0NOVCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX0RJU0NPTk5FQ1RfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZTdGFydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgYXVkaW8vdmlkZW8gc3RyZWFtIGRhdGEgdHJhbnNmZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2U3RhcnQodEJUQV9BVl9ITkRMIGhhbmRsZSkgewotICBMT0dfSU5GTygiU3RhcnRpbmcgYXVkaW8vdmlkZW8gc3RyZWFtIGRhdGEgdHJhbnNmZXIgYnRhX2hhbmRsZTolaGh1IiwgaGFuZGxlKTsKLQotICBCVF9IRFJfUklHSUQqIHBfYnVmID0gKEJUX0hEUl9SSUdJRCopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSk7Ci0KLSAgcF9idWYtPmV2ZW50ID0gQlRBX0FWX0FQSV9TVEFSVF9FVlQ7Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2T2ZmbG9hZFN0YXJ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBhMmRwIGF1ZGlvIG9mZmxvYWRpbmcuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T2ZmbG9hZFN0YXJ0KHRCVEFfQVZfSE5ETCBobmRsKSB7Ci0gIExPR19JTkZPKCIlczogYnRhX2hhbmRsZT0weCV4IiwgX19mdW5jX18sIGhuZGwpOwotCi0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfQVZfQVBJX09GRkxPQURfU1RBUlRfRVZUOwotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBobmRsOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZPZmZsb2FkU3RhcnRSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIGZyb20gdmVuZG9yIGxpYiBmb3IgQTJEUCBPZmZsb2FkIFN0YXJ0IHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T2ZmbG9hZFN0YXJ0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCB0QlRBX0FWX1NUQVRVUyBzdGF0dXMpIHsKLSAgdEJUQV9BVl9BUElfU1RBVFVTX1JTUCogcF9idWYgPQotICAgICAgKHRCVEFfQVZfQVBJX1NUQVRVU19SU1AqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1NUQVRVU19SU1ApKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBobmRsOwotICBwX2J1Zi0+c3RhdHVzID0gc3RhdHVzOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZTdG9wCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdG9wIGF1ZGlvL3ZpZGVvIHN0cmVhbSBkYXRhIHRyYW5zZmVyLgotICogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gc2VuZHMgQVZEVCBzdXNwZW5kIHNpZ25hbAotICogICAgICAgICAgICAgICAgICB0byB0aGUgY29ubmVjdGVkIHBlZXIocykuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2U3RvcCh0QlRBX0FWX0hOREwgaGFuZGxlLCBib29sIHN1c3BlbmQpIHsKLSAgTE9HX0lORk8oIiVzOiBidGFfaGFuZGxlPTB4JXggc3VzcGVuZD0lcyIsIF9fZnVuY19fLCBoYW5kbGUsCi0gICAgICAgICAgIGxvZ2Jvb2woc3VzcGVuZCkuY19zdHIoKSk7Ci0KLSAgdEJUQV9BVl9BUElfU1RPUCogcF9idWYgPQotICAgICAgKHRCVEFfQVZfQVBJX1NUT1AqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1NUT1ApKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9TVE9QX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLSAgcF9idWYtPmZsdXNoID0gdHJ1ZTsKLSAgcF9idWYtPnN1c3BlbmQgPSBzdXNwZW5kOwotICBwX2J1Zi0+cmVjb25maWdfc3RvcCA9IGZhbHNlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZSZWNvbmZpZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVjb25maWd1cmUgdGhlIGF1ZGlvL3ZpZGVvIHN0cmVhbS4KLSAqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHRyaWVzIHRoZQotICogICAgICAgICAgICAgICAgICBzdXNwZW5kL3JlY29uZmlndXJlIHByb2NlZHVyZSBmaXJzdC4KLSAqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyBmYWxzZSBvciB3aGVuIHN1c3BlbmQvcmVjb25maWd1cmUgZmFpbHMsCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuZCByZS1vcGVucyB0aGUgQVZEVCBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlJlY29uZmlnKHRCVEFfQVZfSE5ETCBobmRsLCBib29sIHN1c3BlbmQsIHVpbnQ4X3Qgc2VwX2luZm9faWR4LAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NvZGVjX2luZm8sIHVpbnQ4X3QgbnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvKSB7Ci0gIExPR19JTkZPKCIlczogYnRhX2hhbmRsZT0weCV4IHN1c3BlbmQ9JXMgc2VwX2luZm9faWR4PSVkIiwgX19mdW5jX18sIGhuZGwsCi0gICAgICAgICAgIGxvZ2Jvb2woc3VzcGVuZCkuY19zdHIoKSwgc2VwX2luZm9faWR4KTsKLQotICB0QlRBX0FWX0FQSV9SQ0ZHKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9BVl9BUElfUkNGRyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfUkNGRykgKyBudW1fcHJvdGVjdCk7Ci0KLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGhuZGw7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX1JFQ09ORklHX0VWVDsKLSAgcF9idWYtPm51bV9wcm90ZWN0ID0gbnVtX3Byb3RlY3Q7Ci0gIHBfYnVmLT5zdXNwZW5kID0gc3VzcGVuZDsKLSAgcF9idWYtPnNlcF9pbmZvX2lkeCA9IHNlcF9pbmZvX2lkeDsKLSAgcF9idWYtPnBfcHJvdGVjdF9pbmZvID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICBtZW1jcHkocF9idWYtPmNvZGVjX2luZm8sIHBfY29kZWNfaW5mbywgQVZEVF9DT0RFQ19TSVpFKTsKLSAgbWVtY3B5KHBfYnVmLT5wX3Byb3RlY3RfaW5mbywgcF9wcm90ZWN0X2luZm8sIG51bV9wcm90ZWN0KTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2UHJvdGVjdFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIGNvbnRlbnQgcHJvdGVjdGlvbiByZXF1ZXN0LiAgVGhpcyBmdW5jdGlvbiBjYW4gb25seQotICogICAgICAgICAgICAgICAgICBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aCBmZWF0dXJlIEJUQV9BVl9GRUFUX1BST1RFQ1QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UHJvdGVjdFJlcSh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4pIHsKLSAgdEJUQV9BVl9BUElfUFJPVEVDVF9SRVEqIHBfYnVmID0gKHRCVEFfQVZfQVBJX1BST1RFQ1RfUkVRKilvc2lfbWFsbG9jKAotICAgICAgc2l6ZW9mKHRCVEFfQVZfQVBJX1BST1RFQ1RfUkVRKSArIGxlbik7Ci0KLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGhuZGw7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX1BST1RFQ1RfUkVRX0VWVDsKLSAgcF9idWYtPmxlbiA9IGxlbjsKLSAgaWYgKHBfZGF0YSA9PSBOVUxMKSB7Ci0gICAgcF9idWYtPnBfZGF0YSA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcF9idWYtPnBfZGF0YSA9ICh1aW50OF90KikocF9idWYgKyAxKTsKLSAgICBtZW1jcHkocF9idWYtPnBfZGF0YSwgcF9kYXRhLCBsZW4pOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlByb3RlY3RSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBjb250ZW50IHByb3RlY3Rpb24gcmVzcG9uc2UuICBUaGlzIGZ1bmN0aW9uIG11c3QKLSAqICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGlmIGEgQlRBX0FWX1BST1RFQ1RfUkVRX0VWVCBpcyByZWNlaXZlZC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICBmZWF0dXJlIEJUQV9BVl9GRUFUX1BST1RFQ1QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UHJvdGVjdFJzcCh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCBlcnJvcl9jb2RlLCB1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIHRCVEFfQVZfQVBJX1BST1RFQ1RfUlNQKiBwX2J1ZiA9ICh0QlRBX0FWX0FQSV9QUk9URUNUX1JTUCopb3NpX21hbGxvYygKLSAgICAgIHNpemVvZih0QlRBX0FWX0FQSV9QUk9URUNUX1JTUCkgKyBsZW4pOwotCi0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBobmRsOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9QUk9URUNUX1JTUF9FVlQ7Ci0gIHBfYnVmLT5sZW4gPSBsZW47Ci0gIHBfYnVmLT5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKLSAgaWYgKHBfZGF0YSA9PSBOVUxMKSB7Ci0gICAgcF9idWYtPnBfZGF0YSA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcF9idWYtPnBfZGF0YSA9ICh1aW50OF90KikocF9idWYgKyAxKTsKLSAgICBtZW1jcHkocF9idWYtPnBfZGF0YSwgcF9kYXRhLCBsZW4pOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlJlbW90ZUNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHJlbW90ZSBjb250cm9sIGNvbW1hbmQuICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5Ci0gKiAgICAgICAgICAgICAgICAgIGJlIHVzZWQgaWYgQVYgaXMgZW5hYmxlZCB3aXRoIGZlYXR1cmUgQlRBX0FWX0ZFQVRfUkNDVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZSZW1vdGVDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfUkMgcmNfaWQsCi0gICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSkgewotICB0QlRBX0FWX0FQSV9SRU1PVEVfQ01EKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9BVl9BUElfUkVNT1RFX0NNRCopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfUkVNT1RFX0NNRCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX1JFTU9URV9DTURfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gcmNfaGFuZGxlOwotICBwX2J1Zi0+bXNnLm9wX2lkID0gcmNfaWQ7Ci0gIHBfYnVmLT5tc2cuc3RhdGUgPSBrZXlfc3RhdGU7Ci0gIHBfYnVmLT5tc2cucF9wYXNzX2RhdGEgPSBOVUxMOwotICBwX2J1Zi0+bXNnLnBhc3NfbGVuID0gMDsKLSAgcF9idWYtPmxhYmVsID0gbGFiZWw7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlJlbW90ZVZlbmRvclVuaXF1ZUNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgd2l0aCBWZW5kb3IgVW5pcXVlIHJjX2lkLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaWYgQVYgaXMgZW5hYmxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGZlYXR1cmUgQlRBX0FWX0ZFQVRfUkNDVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZSZW1vdGVWZW5kb3JVbmlxdWVDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSwgdWludDhfdCogcF9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zl9sZW4pIHsKLSAgdEJUQV9BVl9BUElfUkVNT1RFX0NNRCogcF9idWYgPSAodEJUQV9BVl9BUElfUkVNT1RFX0NNRCopb3NpX21hbGxvYygKLSAgICAgIHNpemVvZih0QlRBX0FWX0FQSV9SRU1PVEVfQ01EKSArIGJ1Zl9sZW4pOwotCi0gIHBfYnVmLT5sYWJlbCA9IGxhYmVsOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9SRU1PVEVfQ01EX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IHJjX2hhbmRsZTsKLSAgcF9idWYtPm1zZy5vcF9pZCA9IEFWUkNfSURfVkVORE9SOwotICBwX2J1Zi0+bXNnLnN0YXRlID0ga2V5X3N0YXRlOwotICBwX2J1Zi0+bXNnLnBhc3NfbGVuID0gYnVmX2xlbjsKLSAgaWYgKHBfbXNnID09IE5VTEwpIHsKLSAgICBwX2J1Zi0+bXNnLnBfcGFzc19kYXRhID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBwX2J1Zi0+bXNnLnBfcGFzc19kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+bXNnLnBfcGFzc19kYXRhLCBwX21zZywgYnVmX2xlbik7Ci0gIH0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlZlbmRvckNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHZlbmRvciBkZXBlbmRlbnQgcmVtb3RlIGNvbnRyb2wgY29tbWFuZC4gIFRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpZiBBViBpcyBlbmFibGVkIHdpdGggZmVhdHVyZQotICogICAgICAgICAgICAgICAgICBCVEFfQVZfRkVBVF9WRU5ET1IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2VmVuZG9yQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbikgewotICB0QlRBX0FWX0FQSV9WRU5ET1IqIHBfYnVmID0KLSAgICAgICh0QlRBX0FWX0FQSV9WRU5ET1IqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1ZFTkRPUikgKyBsZW4pOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX1ZFTkRPUl9DTURfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gcmNfaGFuZGxlOwotICBwX2J1Zi0+bXNnLmhkci5jdHlwZSA9IGNtZF9jb2RlOwotICBwX2J1Zi0+bXNnLmhkci5zdWJ1bml0X3R5cGUgPSBBVlJDX1NVQl9QQU5FTDsKLSAgcF9idWYtPm1zZy5oZHIuc3VidW5pdF9pZCA9IDA7Ci0gIHBfYnVmLT5tc2cuY29tcGFueV9pZCA9IHBfYnRhX2F2X2NmZy0+Y29tcGFueV9pZDsKLSAgcF9idWYtPmxhYmVsID0gbGFiZWw7Ci0gIHBfYnVmLT5tc2cudmVuZG9yX2xlbiA9IGxlbjsKLSAgaWYgKHBfZGF0YSA9PSBOVUxMKSB7Ci0gICAgcF9idWYtPm1zZy5wX3ZlbmRvcl9kYXRhID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBwX2J1Zi0+bXNnLnBfdmVuZG9yX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSk7Ci0gICAgbWVtY3B5KHBfYnVmLT5tc2cucF92ZW5kb3JfZGF0YSwgcF9kYXRhLCBsZW4pOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlZlbmRvclJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHZlbmRvciBkZXBlbmRlbnQgcmVtb3RlIGNvbnRyb2wgcmVzcG9uc2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaWYgYSBCVEFfQVZfVkVORE9SX0NNRF9FVlQKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVjZWl2ZWQuIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpZiBBViBpcwotICogICAgICAgICAgICAgICAgICBlbmFibGVkIHdpdGggZmVhdHVyZSBCVEFfQVZfRkVBVF9WRU5ET1IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2VmVuZG9yUnNwKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgdWludDMyX3QgY29tcGFueV9pZCkgewotICB0QlRBX0FWX0FQSV9WRU5ET1IqIHBfYnVmID0KLSAgICAgICh0QlRBX0FWX0FQSV9WRU5ET1IqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX1ZFTkRPUikgKyBsZW4pOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX1ZFTkRPUl9SU1BfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gcmNfaGFuZGxlOwotICBwX2J1Zi0+bXNnLmhkci5jdHlwZSA9IHJzcF9jb2RlOwotICBwX2J1Zi0+bXNnLmhkci5zdWJ1bml0X3R5cGUgPSBBVlJDX1NVQl9QQU5FTDsKLSAgcF9idWYtPm1zZy5oZHIuc3VidW5pdF9pZCA9IDA7Ci0gIGlmIChjb21wYW55X2lkKQotICAgIHBfYnVmLT5tc2cuY29tcGFueV9pZCA9IGNvbXBhbnlfaWQ7Ci0gIGVsc2UKLSAgICBwX2J1Zi0+bXNnLmNvbXBhbnlfaWQgPSBwX2J0YV9hdl9jZmctPmNvbXBhbnlfaWQ7Ci0gIHBfYnVmLT5sYWJlbCA9IGxhYmVsOwotICBwX2J1Zi0+bXNnLnZlbmRvcl9sZW4gPSBsZW47Ci0gIGlmIChwX2RhdGEgPT0gTlVMTCkgewotICAgIHBfYnVmLT5tc2cucF92ZW5kb3JfZGF0YSA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcF9idWYtPm1zZy5wX3ZlbmRvcl9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+bXNnLnBfdmVuZG9yX2RhdGEsIHBfZGF0YSwgbGVuKTsKLSAgfQotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZPcGVuUmMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE9wZW4gYW4gQVZSQ1AgY29ubmVjdGlvbiB0b3dhcmQgdGhlIGRldmljZSB3aXRoIHRoZQotICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaGFuZGxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T3BlblJjKHRCVEFfQVZfSE5ETCBoYW5kbGUpIHsKLSAgdEJUQV9BVl9BUElfT1BFTl9SQyogcF9idWYgPQotICAgICAgKHRCVEFfQVZfQVBJX09QRU5fUkMqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX09QRU5fUkMpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9SQ19PUEVOX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2Q2xvc2VSYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgYW4gQVZSQ1AgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdkNsb3NlUmModWludDhfdCByY19oYW5kbGUpIHsKLSAgdEJUQV9BVl9BUElfQ0xPU0VfUkMqIHBfYnVmID0KLSAgICAgICh0QlRBX0FWX0FQSV9DTE9TRV9SQyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfQ0xPU0VfUkMpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX0FQSV9SQ19DTE9TRV9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSByY19oYW5kbGU7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9Bdk1ldGFSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBNZXRhZGF0YS9BZHZhbmNlZCBDb250cm9sIHJlc3BvbnNlLiBUaGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBjb250YWluZWQgaW4gcF9wa3QgY2FuIGJlIGNvbXBvc2VkIHdpdGggQVZSQyB1dGlsaXR5Ci0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aCBmZWF0dXJlCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9BVl9GRUFUX01FVEFEQVRBLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Bdk1ldGFSc3AodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSByc3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIHRCVEFfQVZfQVBJX01FVEFfUlNQKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9BVl9BUElfTUVUQV9SU1AqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfQVZfQVBJX01FVEFfUlNQKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9BVl9BUElfTUVUQV9SU1BfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gcmNfaGFuZGxlOwotICBwX2J1Zi0+cnNwX2NvZGUgPSByc3BfY29kZTsKLSAgcF9idWYtPnBfcGt0ID0gcF9wa3Q7Ci0gIHBfYnVmLT5pc19yc3AgPSB0cnVlOwotICBwX2J1Zi0+bGFiZWwgPSBsYWJlbDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2TWV0YUNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIE1ldGFkYXRhL0FkdmFuY2VkIENvbnRyb2wgY29tbWFuZC4gVGhlIG1lc3NhZ2UKLSpjb250YWluZWQKLSAqICAgICAgICAgICAgICAgICAgaW4gcF9wa3QgY2FuIGJlIGNvbXBvc2VkIHdpdGggQVZSQyB1dGlsaXR5IGZ1bmN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aCBmZWF0dXJlCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9BVl9GRUFUX01FVEFEQVRBLgotICogICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgaXMgc2VudCBvbmx5IHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgdGhlIFRHCi0qcm9sZS4KLSo4ICAgICAgICAgICAgICAgICAgVGhlIG9ubHkgY29tbWFuZCBtYWtlcyBzZW5zZSByaWdodCBub3cgaXMgdGhlIGFic29sdXRlCi0qdm9sdW1lIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2TWV0YUNtZCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9DTUQgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgewotICB0QlRBX0FWX0FQSV9NRVRBX1JTUCogcF9idWYgPQotICAgICAgKHRCVEFfQVZfQVBJX01FVEFfUlNQKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0FQSV9NRVRBX1JTUCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQVZfQVBJX01FVEFfUlNQX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IHJjX2hhbmRsZTsKLSAgcF9idWYtPnBfcGt0ID0gcF9wa3Q7Ci0gIHBfYnVmLT5yc3BfY29kZSA9IGNtZF9jb2RlOwotICBwX2J1Zi0+aXNfcnNwID0gZmFsc2U7Ci0gIHBfYnVmLT5sYWJlbCA9IGxhYmVsOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2NmZy5jYyBiL2J0YS9hdi9idGFfYXZfY2ZnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmE3ZDhhLi4wMDAwMDAwCi0tLSBhL2J0YS9hdi9idGFfYXZfY2ZnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDUtMjAxNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvbXBpbGUtdGltZSBjb25maWd1cmFibGUgY29uc3RhbnRzIGZvciBhZHZhbmNlZAotICogIGF1ZGlvL3ZpZGVvCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hdl9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2cmNfYXBpLmgiCi0KLSNpZm5kZWYgQlRBX0FWX1JDX0NPTVBfSUQKLSNkZWZpbmUgQlRBX0FWX1JDX0NPTVBfSUQgQVZSQ19DT19HT09HTEUKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9BVl9SQ19QQVNTX1JTUF9DT0RFCi0jZGVmaW5lIEJUQV9BVl9SQ19QQVNTX1JTUF9DT0RFIEFWUkNfUlNQX05PVF9JTVBMCi0jZW5kaWYKLQotY29uc3QgdWludDMyX3QgYnRhX2F2X21ldGFfY2Fwc19jb19pZHNbXSA9IHtBVlJDX0NPX01FVEFEQVRBLCBBVlJDX0NPX0JST0FEQ09NfTsKLQotLyogQVZSQ1Agc3VwcG9ydGVkIGNhdGVnb3JpZXMgKi8KLSNkZWZpbmUgQlRBX0FWX1JDX1NVUEZfQ1QgKEFWUkNfU1VQRl9DVF9DQVQyKQotI2RlZmluZSBCVEFfQVZLX1JDX1NVUEZfQ1QgKEFWUkNfU1VQRl9DVF9DQVQxIHwgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSQ19TVVBGX0NUX0JST1dTRSB8ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX1NVUEZfQ1RfQ09WRVJfQVJUX0dFVF9JTUFHRV9QUk9QIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfU1VQRl9DVF9DT1ZFUl9BUlRfR0VUX0lNQUdFKQotI2RlZmluZSBCVEFfQVZLX1JDX1NVUEZfVEcgKEFWUkNfU1VQRl9UR19DQVQyKQotCi0vKiBBVlJDUCBDb250cm9sbGVyIGFuZCBUYXJnZXIgZGVmYXVsdCBuYW1lICovCi0jaWZuZGVmIEJUQV9BVl9SQ19DVF9OQU1FCi0jZGVmaW5lIEJUQV9BVl9SQ19DVF9OQU1FICJBVlJDIENvbnRyb2xsZXIiCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfQVZfUkNfVEdfTkFNRQotI2RlZmluZSBCVEFfQVZfUkNfVEdfTkFNRSAiQVZSQyBUYXJnZXQiCi0jZW5kaWYKLQotLyogQWRkZWQgdG8gbW9kaWZ5Ci0gKgkxLiBmbHVzaCB0aW1lb3V0Ci0gKgkyLiBSZW1vdmUgR3JvdXAgbmF2aWdhdGlvbiBzdXBwb3J0IGluIFN1cHBvcnRlZEZlYXR1cmVzCi0gKgkzLiBHZXRDYXBhYmlsaXRpZXMgc3VwcG9ydGVkIGV2ZW50X2lkcyBsaXN0Ci0gKgk0LiBHZXRDYXBhYmlsaXRpZXMgc3VwcG9ydGVkIGV2ZW50X2lkcyBjb3VudAotKi8KLQotLyogTm90ZTogQW5kcm9pZCBkb2VzbnQgc3VwcG9ydCBBVlJDX1NVUEZfVEdfR1JPVVBfTkFWSSAgKi8KLS8qIE5vdGU6IGlmIEFWUkNfU1VQRl9UR19HUk9VUF9OQVZJIGlzIHNldCwgYnRhX2F2X2NmZy5hdnJjX2dyb3VwIHNob3VsZCBiZSB0cnVlCi0gKi8KLSNpZm5kZWYgQlRBX0FWX1JDX1NVUEZfVEcKLSNkZWZpbmUgQlRBX0FWX1JDX1NVUEZfVEcgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEFWUkNfU1VQRl9UR19DQVQxIHwgQVZSQ19TVVBGX1RHX01VTFRJX1BMQVlFUiB8IFwKLSAgIEFWUkNfU1VQRl9UR19CUk9XU0UpIC8qIFRPRE86IHwgQVZSQ19TVVBGX1RHX0FQUF9TRVRUSU5HUykgKi8KLSNlbmRpZgotCi0vKgotICogSWYgdGhlIG51bWJlciBvZiBldmVudCBJRHMgaXMgY2hhbmdlZCBpbiB0aGlzIGFycmF5LCBCVEFfQVZfTlVNX1JDX0VWVF9JRFMKLSAqIGFsc28gbmVlZHMgdG8gYmUgY2hhbmdlZC4KLSAqLwotY29uc3QgdWludDhfdCBidGFfYXZfbWV0YV9jYXBzX2V2dF9pZHNbXSA9IHsKLSAgICBBVlJDX0VWVF9QTEFZX1NUQVRVU19DSEFOR0UsIEFWUkNfRVZUX1RSQUNLX0NIQU5HRSwKLSAgICBBVlJDX0VWVF9QTEFZX1BPU19DSEFOR0VELCAgIEFWUkNfRVZUX0FWQUxfUExBWUVSU19DSEFOR0UsCi0gICAgQVZSQ19FVlRfQUREUl9QTEFZRVJfQ0hBTkdFLCBBVlJDX0VWVF9VSURTX0NIQU5HRSwKLSAgICBBVlJDX0VWVF9OT1dfUExBWUlOR19DSEFOR0UsCi0gICAgLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIHRoZXNlIGV2ZW50cwotICAgIEFWUkNfRVZUX0FQUF9TRVRUSU5HX0NIQU5HRSwKLSAgICAqLwotfTsKLQotI2lmbmRlZiBCVEFfQVZfTlVNX1JDX0VWVF9JRFMKLSNkZWZpbmUgQlRBX0FWX05VTV9SQ19FVlRfSURTIFwKLSAgKHNpemVvZihidGFfYXZfbWV0YV9jYXBzX2V2dF9pZHMpIC8gc2l6ZW9mKGJ0YV9hdl9tZXRhX2NhcHNfZXZ0X2lkc1swXSkpCi0jZW5kaWYgLyogQlRBX0FWX05VTV9SQ19FVlRfSURTICovCi0KLWNvbnN0IHVpbnQ4X3QgYnRhX2F2a19tZXRhX2NhcHNfZXZ0X2lkc1tdID0gewotI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCi0gICAgQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSwKLSNlbmRpZgotfTsKLQotI2lmbmRlZiBCVEFfQVZLX05VTV9SQ19FVlRfSURTCi0jZGVmaW5lIEJUQV9BVktfTlVNX1JDX0VWVF9JRFMgXAotICAoc2l6ZW9mKGJ0YV9hdmtfbWV0YV9jYXBzX2V2dF9pZHMpIC8gc2l6ZW9mKGJ0YV9hdmtfbWV0YV9jYXBzX2V2dF9pZHNbMF0pKQotI2VuZGlmIC8qIEJUQV9BVktfTlVNX1JDX0VWVF9JRFMgKi8KLQotLy8gVGhlc2UgYXJlIHRoZSBvbmx5IGV2ZW50cyB1c2VkIHdpdGggQVZSQ1AxLjMKLWNvbnN0IHVpbnQ4X3QgYnRhX2F2X21ldGFfY2Fwc19ldnRfaWRzX2F2cmNwMTNbXSA9IHsKLSAgICBBVlJDX0VWVF9QTEFZX1NUQVRVU19DSEFOR0UsIEFWUkNfRVZUX1RSQUNLX0NIQU5HRSwKLSAgICBBVlJDX0VWVF9QTEFZX1BPU19DSEFOR0VELAotfTsKLQotI2lmbmRlZiBCVEFfQVZfTlVNX1JDX0VWVF9JRFNfQVZSQ1AxMwotI2RlZmluZSBCVEFfQVZfTlVNX1JDX0VWVF9JRFNfQVZSQ1AxMyAgICAgICAgIFwKLSAgKHNpemVvZihidGFfYXZfbWV0YV9jYXBzX2V2dF9pZHNfYXZyY3AxMykgLyBcCi0gICBzaXplb2YoYnRhX2F2X21ldGFfY2Fwc19ldnRfaWRzX2F2cmNwMTNbMF0pKQotI2VuZGlmIC8qIEJUQV9BVktfTlVNX1JDX0VWVF9JRFNfQVZSQ1AxMyAqLwotCi0vKiBUaGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCB3aGVuIHdlIGFyZSBTcmMgKyBURyArIENUKCBvbmx5IGZvciBhYnMgdm9sKSAqLwotZXh0ZXJuIGNvbnN0IHRCVEFfQVZfQ0ZHIGJ0YV9hdl9jZmcgPSB7Ci0gICAgQlRBX0FWX1JDX0NPTVBfSUQsIC8qIEFWUkNQIENvbXBhbnkgSUQgKi8KLSAgICBCVEFfQVZfUkNfU1VQRl9DVCwgLyogQVZSQ1AgY29udHJvbGxlciBjYXRlZ29yaWVzICovCi0gICAgQlRBX0FWX1JDX1NVUEZfVEcsIC8qIEFWUkNQIHRhcmdldCBjYXRlZ29yaWVzICovCi0gICAgNiwgICAgICAgICAgICAgICAgIC8qIEFWRFRQIGF1ZGlvIGNoYW5uZWwgbWF4IGRhdGEgcXVldWUgc2l6ZSAqLwotICAgIGZhbHNlLCAgICAgICAgICAgICAvKiB0cnVlLCB0byBhY2NlcHQgQVZSQyAxLjMgZ3JvdXAgbmV2aWdhdGlvbiBjb21tYW5kICovCi0gICAgMiwgICAgICAgICAgICAgICAgIC8qIGNvbXBhbnkgaWQgY291bnQgaW4gcF9tZXRhX2NvX2lkcyAqLwotICAgIEJUQV9BVl9OVU1fUkNfRVZUX0lEUywgICAgLyogZXZlbnQgaWQgY291bnQgaW4gcF9tZXRhX2V2dF9pZHMgKi8KLSAgICBCVEFfQVZfUkNfUEFTU19SU1BfQ09ERSwgIC8qIHRoZSBkZWZhdWx0IHJlc3BvbnNlIGNvZGUgZm9yIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggY29tbWFuZHMgKi8KLSAgICBidGFfYXZfbWV0YV9jYXBzX2NvX2lkcywgIC8qIHRoZSBtZXRhZGF0YSBHZXQgQ2FwYWJpbGl0aWVzIHJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29tcGFueSBpZCAqLwotICAgIGJ0YV9hdl9tZXRhX2NhcHNfZXZ0X2lkcywgLyogdGhlIHRoZSBtZXRhZGF0YSBHZXQgQ2FwYWJpbGl0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSBmb3IgZXZlbnQgaWQgKi8KLSAgICBCVEFfQVZfUkNfQ1RfTkFNRSwgICAgICAgIC8qIERlZmF1bHQgQVZSQ1AgY29udHJvbGxlciBuYW1lICovCi0gICAgQlRBX0FWX1JDX1RHX05BTUUgICAgICAgICAvKiBEZWZhdWx0IEFWUkNQIHRhcmdldCBuYW1lICovCi19OwotCi0vKiBUaGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCB3aGVuIHdlIGFyZSBTaW5rICsgQ1QgKyBURyggb25seSBmb3IgYWJzIHZvbCkKLSAqLwotZXh0ZXJuIGNvbnN0IHRCVEFfQVZfQ0ZHIGJ0YV9hdmtfY2ZnID0gewotICAgIEFWUkNfQ09fTUVUQURBVEEsICAgLyogQVZSQ1AgQ29tcGFueSBJRCAqLwotICAgIEJUQV9BVktfUkNfU1VQRl9DVCwgLyogQVZSQ1AgY29udHJvbGxlciBjYXRlZ29yaWVzICovCi0gICAgQlRBX0FWS19SQ19TVVBGX1RHLCAvKiBBVlJDUCB0YXJnZXQgY2F0ZWdvcmllcyAqLwotICAgIDYsICAgICAgICAgICAgICAgICAgLyogQVZEVFAgYXVkaW8gY2hhbm5lbCBtYXggZGF0YSBxdWV1ZSBzaXplICovCi0gICAgZmFsc2UsICAgICAgICAgICAgICAvKiB0cnVlLCB0byBhY2NlcHQgQVZSQyAxLjMgZ3JvdXAgbmV2aWdhdGlvbiBjb21tYW5kICovCi0gICAgMiwgICAgICAgICAgICAgICAgICAvKiBjb21wYW55IGlkIGNvdW50IGluIHBfbWV0YV9jb19pZHMgKi8KLSAgICBCVEFfQVZLX05VTV9SQ19FVlRfSURTLCAgICAvKiBldmVudCBpZCBjb3VudCBpbiBwX21ldGFfZXZ0X2lkcyAqLwotICAgIEJUQV9BVl9SQ19QQVNTX1JTUF9DT0RFLCAgIC8qIHRoZSBkZWZhdWx0IHJlc3BvbnNlIGNvZGUgZm9yIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGNvbW1hbmRzICovCi0gICAgYnRhX2F2X21ldGFfY2Fwc19jb19pZHMsICAgLyogdGhlIG1ldGFkYXRhIEdldCBDYXBhYmlsaXRpZXMgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29tcGFueSBpZCAqLwotICAgIGJ0YV9hdmtfbWV0YV9jYXBzX2V2dF9pZHMsIC8qIHRoZSB0aGUgbWV0YWRhdGEgR2V0IENhcGFiaWxpdGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIGZvciBldmVudCBpZCAqLwotICAgIHswfSwgICAgICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgQVZSQ1AgY29udHJvbGxlciBuYW1lICovCi0gICAgezB9LCAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBBVlJDUCB0YXJnZXQgbmFtZSAqLwotfTsKLQotLyogVGhpcyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2hlbiB3ZSBhcmUgdXNpbmcgQVZSQ1AxLjMgKi8KLWV4dGVybiBjb25zdCB0QlRBX0FWX0NGRyBidGFfYXZfY2ZnX2NvbXBhdGliaWxpdHkgPSB7Ci0gICAgQlRBX0FWX1JDX0NPTVBfSUQsIC8qIEFWUkNQIENvbXBhbnkgSUQgKi8KLSAgICBCVEFfQVZfUkNfU1VQRl9DVCwgLyogQVZSQ1AgY29udHJvbGxlciBjYXRlZ29yaWVzICovCi0gICAgQVZSQ19TVVBGX1RHX0NBVDEsIC8qIE9ubHkgc3VwcG9ydCBDQVQxIGZvciBBVlJDUDEuMyAqLwotICAgIDYsICAgICAgICAgICAgICAgICAvKiBBVkRUUCBhdWRpbyBjaGFubmVsIG1heCBkYXRhIHF1ZXVlIHNpemUgKi8KLSAgICBmYWxzZSwgICAgICAgICAgICAgLyogdHJ1ZSwgdG8gYWNjZXB0IEFWUkMgMS4zIGdyb3VwIG5ldmlnYXRpb24gY29tbWFuZCAqLwotICAgIDIsICAgICAgICAgICAgICAgICAvKiBjb21wYW55IGlkIGNvdW50IGluIHBfbWV0YV9jb19pZHMgKi8KLSAgICBCVEFfQVZfTlVNX1JDX0VWVF9JRFNfQVZSQ1AxMywgICAgLyogZXZlbnQgaWQgY291bnQgZm9yIEFWUkNQMS4zICovCi0gICAgQlRBX0FWX1JDX1BBU1NfUlNQX0NPREUsICAgICAgICAgIC8qIHRoZSBkZWZhdWx0IHJlc3BvbnNlIGNvZGUgZm9yIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCBjb21tYW5kcyAqLwotICAgIGJ0YV9hdl9tZXRhX2NhcHNfY29faWRzLCAgICAgICAgICAvKiB0aGUgbWV0YWRhdGEgR2V0IENhcGFiaWxpdGllcyByZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29tcGFueSBpZCAqLwotICAgIGJ0YV9hdl9tZXRhX2NhcHNfZXZ0X2lkc19hdnJjcDEzLCAvKiB0aGUgdGhlIG1ldGFkYXRhIEdldCBDYXBhYmlsaXRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgZm9yIGV2ZW50IGlkLCBjb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQVZSQ1AxLjMgKi8KLSAgICBCVEFfQVZfUkNfQ1RfTkFNRSwgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBBVlJDUCBjb250cm9sbGVyIG5hbWUgKi8KLSAgICBCVEFfQVZfUkNfVEdfTkFNRSAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBBVlJDUCB0YXJnZXQgbmFtZSAqLwotfTsKLQotY29uc3QgdEJUQV9BVl9DRkcqIHBfYnRhX2F2X2NmZyA9IE5VTEw7Ci0KLWNvbnN0IHVpbnQxNl90IGJ0YV9hdl9yY19pZFtdID0gewotICAgIDB4MDAwMCwgLyogYml0IG1hc2s6IDA9U0VMRUNULCAxPVVQLCAyPURPV04sIDM9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA0PVJJR0hULCA1PVJJR0hUX1VQLCA2PVJJR0hUX0RPV04sIDc9TEVGVF9VUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA4PUxFRlRfRE9XTiwgOT1ST09UX01FTlUsIDEwPVNFVFVQX01FTlUsIDExPUNPTlRfTUVOVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMj1GQVZfTUVOVSwgMTM9RVhJVCAqLwotCi0gICAgMCwgLyogbm90IHVzZWQgKi8KLQotICAgIDB4MDAwMCwgLyogYml0IG1hc2s6IDA9MCwgMT0xLCAyPTIsIDM9MywKLSAgICAgICAgICAgICAgICAgICAgICAgICA0PTQsIDU9NSwgNj02LCA3PTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOD04LCA5PTksIDEwPURPVCwgMTE9RU5URVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTI9Q0xFQVIgKi8KLQotICAgIDB4MDAwMCwgLyogYml0IG1hc2s6IDA9Q0hBTl9VUCwgMT1DSEFOX0RPV04sIDI9UFJFVl9DSEFOLCAzPVNPVU5EX1NFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA0PUlOUFVUX1NFTCwgNT1ESVNQX0lORk8sIDY9SEVMUCwgNz1QQUdFX1VQLAotICAgICAgICAgICAgICAgICAgICAgICAgIDg9UEFHRV9ET1dOICovCi0KLS8qIGJ0dWlfYXBwIHByb3ZpZGVzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGxlYXZlIHRoZSBkZWNpc2lvbiBvZiByZWplY3RpbmcgYQotIGNvbW1hbmQgb3Igbm90Ci0gKiBiYXNlZCBvbiB3aGljaCBtZWRpYSBwbGF5ZXIgaXMgY3VycmVudGx5IGFkZHJlc3NlZCAodGhpcyBpcyBvbmx5IGFwcGxpY2FibGUKLSBmb3IgQVZSQ1AgMS40IG9yIGxhdGVyKQotICogSWYgdGhlIGRlY2lzaW9uIGlzIHBlciBwbGF5ZXIgZm9yIGEgcGFydGljdWxhciByY19pZCwgdGhlIHJlbGF0ZWQgYml0IGlzCi0gY2xlYXIgKG5vdCBzZXQpCi0gKiBiaXQgbWFzazogMD1QT1dFUiwgMT1WT0xfVVAsIDI9Vk9MX0RPV04sIDM9TVVURSwgND1QTEFZLCA1PVNUT1AsCi0gICAgICAgICAgICAgNj1QQVVTRSwgNz1SRUNPUkQsIDg9UkVXSU5ELCA5PUZBU1RfRk9SLCAxMD1FSkVDVCwgMTE9Rk9SV0FSRCwKLSAgICAgICAgICAgICAxMj1CQUNLV0FSRCAqLwotI2lmIChCVEFfQVZfUkNfUEFTU19SU1BfQ09ERSA9PSBBVlJDX1JTUF9JTlRFUklNKQotICAgIDB4MDA3MCwgLyogUExBWSB8IFNUT1AgfCBQQVVTRSAqLwotI2Vsc2UgICAgICAgLyogQlRBX0FWX1JDX1BBU1NfUlNQX0NPREUgIT0gQVZSQ19SU1BfSU5URVJJTSAqLwotICAgIDB4MWI3RSwgLyogUExBWSB8IFNUT1AgfCBQQVVTRSB8IEZGIHwgUlcgfCBWT0xfVVAgfCBWT0xfRE9XTiB8IE1VVEUgfCBGVyB8Ci0gICAgICAgICAgICAgICBCQUNLICovCi0jZW5kaWYgLyogQlRBX0FWX1JDX1BBU1NfUlNQX0NPREUgKi8KLQotICAgIDB4MDAwMCwgLyogYml0IG1hc2s6IDA9QU5HTEUsIDE9U1VCUElDVCAqLwotCi0gICAgMCwgLyogbm90IHVzZWQgKi8KLQotICAgIDB4MDAwMCAvKiBiaXQgbWFzazogMD1ub3QgdXNlZCwgMT1GMSwgMj1GMiwgMz1GMywKLSAgICAgICAgICAgICAgICAgICAgICAgIDQ9RjQsIDU9RjUgKi8KLX07Ci0KLSNpZiAoQlRBX0FWX1JDX1BBU1NfUlNQX0NPREUgPT0gQVZSQ19SU1BfSU5URVJJTSkKLWNvbnN0IHVpbnQxNl90IGJ0YV9hdl9yY19pZF9hY1tdID0gewotICAgIDB4MDAwMCwgLyogYml0IG1hc2s6IDA9U0VMRUNULCAxPVVQLCAyPURPV04sIDM9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA0PVJJR0hULCA1PVJJR0hUX1VQLCA2PVJJR0hUX0RPV04sCi0gICAgICAgICAgICAgICA3PUxFRlRfVVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOD1MRUZUX0RPV04sIDk9Uk9PVF9NRU5VLCAxMD1TRVRVUF9NRU5VLAotICAgICAgICAgICAgICAgMTE9Q09OVF9NRU5VLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEyPUZBVl9NRU5VLCAxMz1FWElUICovCi0KLSAgICAwLCAvKiBub3QgdXNlZCAqLwotCi0gICAgMHgwMDAwLCAvKiBiaXQgbWFzazogMD0wLCAxPTEsIDI9MiwgMz0zLAotICAgICAgICAgICAgICAgICAgICAgICAgIDQ9NCwgNT01LCA2PTYsIDc9NywKLSAgICAgICAgICAgICAgICAgICAgICAgICA4PTgsIDk9OSwgMTA9RE9ULCAxMT1FTlRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMj1DTEVBUiAqLwotCi0gICAgMHgwMDAwLCAvKiBiaXQgbWFzazogMD1DSEFOX1VQLCAxPUNIQU5fRE9XTiwgMj1QUkVWX0NIQU4sCi0gICAgICAgICAgICAgICAzPVNPVU5EX1NFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA0PUlOUFVUX1NFTCwgNT1ESVNQX0lORk8sIDY9SEVMUCwKLSAgICAgICAgICAgICAgIDc9UEFHRV9VUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA4PVBBR0VfRE9XTiAqLwotCi0gICAgLyogYnR1aV9hcHAgcHJvdmlkZXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gbGVhdmUgdGhlIGRlY2lzaW9uIG9mCi0gICAgICogcmVqZWN0aW5nIGEgY29tbWFuZCBvciBub3QKLSAgICAgKiBiYXNlZCBvbiB3aGljaCBtZWRpYSBwbGF5ZXIgaXMgY3VycmVudGx5IGFkZHJlc3NlZCAodGhpcyBpcwotICAgICAqIG9ubHkgYXBwbGljYWJsZSBmb3IgQVZSQ1AgMS40IG9yIGxhdGVyKQotICAgICAqIElmIHRoZSBkZWNpc2lvbiBpcyBwZXIgcGxheWVyIGZvciBhIHBhcnRpY3VsYXIgcmNfaWQsIHRoZQotICAgICAqIHJlbGF0ZWQgYml0IGlzIHNldCAqLwotICAgIDB4MTgwMCwgLyogYml0IG1hc2s6IDA9UE9XRVIsIDE9Vk9MX1VQLCAyPVZPTF9ET1dOLCAzPU1VVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgND1QTEFZLCA1PVNUT1AsIDY9UEFVU0UsIDc9UkVDT1JELAotICAgICAgICAgICAgICAgICAgICAgICAgIDg9UkVXSU5ELCA5PUZBU1RfRk9SLCAxMD1FSkVDVCwgMTE9Rk9SV0FSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMj1CQUNLV0FSRCAqLwotCi0gICAgMHgwMDAwLCAvKiBiaXQgbWFzazogMD1BTkdMRSwgMT1TVUJQSUNUICovCi0KLSAgICAwLCAvKiBub3QgdXNlZCAqLwotCi0gICAgMHgwMDAwIC8qIGJpdCBtYXNrOiAwPW5vdCB1c2VkLCAxPUYxLCAyPUYyLCAzPUYzLAotICAgICAgICAgICAgICAgICAgICAgICAgND1GNCwgNT1GNSAqLwotfTsKLXVpbnQxNl90KiBwX2J0YV9hdl9yY19pZF9hYyA9ICh1aW50MTZfdCopYnRhX2F2X3JjX2lkX2FjOwotI2Vsc2UKLXVpbnQxNl90KiBwX2J0YV9hdl9yY19pZF9hYyA9IE5VTEw7Ci0jZW5kaWYKLQotdWludDE2X3QqIHBfYnRhX2F2X3JjX2lkID0gKHVpbnQxNl90KilidGFfYXZfcmNfaWQ7CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X2NpLmNjIGIvYnRhL2F2L2J0YV9hdl9jaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhNDU3NC4uMDAwMDAwMAotLS0gYS9idGEvYXYvYnRhX2F2X2NpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhZHZhbmNlZCBhdWRpby92aWRlbyBjYWxsLWluCi0gKiAgZnVuY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRhX2F2IgotCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NpX3NyY19kYXRhX3JlYWR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIGV2ZW50IHRvIHRoZSBBViBpbmRpY2F0aW5nIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgdGhlIHBob25lIGhhcyBhdWRpbyBzdHJlYW0gZGF0YSByZWFkeSB0byBzZW5kIGFuZCBBVgotICogICAgICAgICAgICAgICAgICBzaG91bGQgY2FsbCBidGFfYXZfY29fYXVkaW9fc291cmNlX2RhdGFfcGF0aCgpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jaV9zcmNfZGF0YV9yZWFkeSh0QlRBX0FWX0NITkwgY2hubCkgewotICBCVF9IRFJfUklHSUQqIHBfYnVmID0gKEJUX0hEUl9SSUdJRCopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSk7Ci0KLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gY2hubDsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX0FWX0NJX1NSQ19EQVRBX1JFQURZX0VWVDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NpX3NldGNvbmZpZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiByZXNwb25zZSB0byBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBidGFfYXZfY29fYXVkaW9fc2V0Y29uZmlnKCkuCi0gKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBlcnJfY29kZSBpcyBzZXQgdG8gYW4gQVZEVFAgc3RhdHVzIHZhbHVlOwotICogICAgICAgICAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gaXMgb2ssCi0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfY2lfc2V0Y29uZmlnKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLCB1aW50OF90IGVycl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2F0ZWdvcnksIHVpbnQ4X3QgbnVtX3NlaWQsIHVpbnQ4X3QqIHBfc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY2ZnX25lZWRlZCwgdWludDhfdCBhdmR0X2hhbmRsZSkgewotICBMT0dfSU5GTygKLSAgICAgICIlczogYnRhX2F2X2hhbmRsZT0weCV4IGVycl9jb2RlPSVkIGNhdGVnb3J5PSVkICIKLSAgICAgICJudW1fc2VpZD0lZCByZWNmZ19uZWVkZWQ9JXMgYXZkdF9oYW5kbGU9JWQiLAotICAgICAgX19mdW5jX18sIGJ0YV9hdl9oYW5kbGUsIGVycl9jb2RlLCBjYXRlZ29yeSwgbnVtX3NlaWQsCi0gICAgICByZWNmZ19uZWVkZWQgPyAidHJ1ZSIgOiAiZmFsc2UiLCBhdmR0X2hhbmRsZSk7Ci0KLSAgdEJUQV9BVl9DSV9TRVRDT05GSUcqIHBfYnVmID0KLSAgICAgICh0QlRBX0FWX0NJX1NFVENPTkZJRyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9DSV9TRVRDT05GSUcpKTsKLQotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gYnRhX2F2X2hhbmRsZTsKLSAgcF9idWYtPmhkci5ldmVudCA9IChlcnJfY29kZSA9PSBBMkRQX1NVQ0NFU1MpID8gQlRBX0FWX0NJX1NFVENPTkZJR19PS19FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlRBX0FWX0NJX1NFVENPTkZJR19GQUlMX0VWVDsKLSAgcF9idWYtPmVycl9jb2RlID0gZXJyX2NvZGU7Ci0gIHBfYnVmLT5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICBwX2J1Zi0+cmVjZmdfbmVlZGVkID0gcmVjZmdfbmVlZGVkOwotICBwX2J1Zi0+bnVtX3NlaWQgPSBudW1fc2VpZDsKLSAgcF9idWYtPmF2ZHRfaGFuZGxlID0gYXZkdF9oYW5kbGU7Ci0gIGlmIChwX3NlaWQgJiYgbnVtX3NlaWQpIHsKLSAgICBwX2J1Zi0+cF9zZWlkID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+cF9zZWlkLCBwX3NlaWQsIG51bV9zZWlkKTsKLSAgfSBlbHNlIHsKLSAgICBwX2J1Zi0+cF9zZWlkID0gTlVMTDsKLSAgICBwX2J1Zi0+bnVtX3NlaWQgPSAwOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9hdi9idGFfYXZfaW50LmggYi9idGEvYXYvYnRhX2F2X2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTY1ZWM1Li4wMDAwMDAwCi0tLSBhL2J0YS9hdi9idGFfYXZfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwcml2YXRlIGludGVyZmFjZSBmaWxlIGZvciB0aGUgQlRBIGFkdmFuY2VkIGF1ZGlvL3ZpZGVvLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9BVl9JTlRfSAotI2RlZmluZSBCVEFfQVZfSU5UX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXZfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2NvLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbGlzdC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZW51bSB7Ci0gIC8qIHRoZXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSB0aGUgQVYgbWFpbiBzdGF0ZSBtYWNoaW5lICovCi0gIEJUQV9BVl9BUElfRElTQUJMRV9FVlQgPSBCVEFfU1lTX0VWVF9TVEFSVChCVEFfSURfQVYpLAotICBCVEFfQVZfQVBJX1JFTU9URV9DTURfRVZULAotICBCVEFfQVZfQVBJX1ZFTkRPUl9DTURfRVZULAotICBCVEFfQVZfQVBJX1ZFTkRPUl9SU1BfRVZULAotICBCVEFfQVZfQVBJX01FVEFfUlNQX0VWVCwKLSAgQlRBX0FWX0FQSV9SQ19DTE9TRV9FVlQsCi0gIEJUQV9BVl9BVlJDX09QRU5fRVZULAotICBCVEFfQVZfQVZSQ19NU0dfRVZULAotICBCVEFfQVZfQVZSQ19OT05FX0VWVCwKLQotICAvKiB0aGVzZSBldmVudHMgYXJlIGhhbmRsZWQgYnkgdGhlIEFWIHN0cmVhbSBzdGF0ZSBtYWNoaW5lICovCi0gIEJUQV9BVl9BUElfT1BFTl9FVlQsCi0gIEJUQV9BVl9BUElfQ0xPU0VfRVZULAotICBCVEFfQVZfQVBfU1RBUlRfRVZULCAvKiB0aGUgZm9sbG93aW5nIDIgZXZlbnRzIG11c3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlICpBUElfKkVWVCAqLwotICBCVEFfQVZfQVBfU1RPUF9FVlQsCi0gIEJUQV9BVl9BUElfUkVDT05GSUdfRVZULAotICBCVEFfQVZfQVBJX1BST1RFQ1RfUkVRX0VWVCwKLSAgQlRBX0FWX0FQSV9QUk9URUNUX1JTUF9FVlQsCi0gIEJUQV9BVl9BUElfUkNfT1BFTl9FVlQsCi0gIEJUQV9BVl9TUkNfREFUQV9SRUFEWV9FVlQsCi0gIEJUQV9BVl9DSV9TRVRDT05GSUdfT0tfRVZULAotICBCVEFfQVZfQ0lfU0VUQ09ORklHX0ZBSUxfRVZULAotICBCVEFfQVZfU0RQX0RJU0NfT0tfRVZULAotICBCVEFfQVZfU0RQX0RJU0NfRkFJTF9FVlQsCi0gIEJUQV9BVl9TVFJfRElTQ19PS19FVlQsCi0gIEJUQV9BVl9TVFJfRElTQ19GQUlMX0VWVCwKLSAgQlRBX0FWX1NUUl9HRVRDQVBfT0tfRVZULAotICBCVEFfQVZfU1RSX0dFVENBUF9GQUlMX0VWVCwKLSAgQlRBX0FWX1NUUl9PUEVOX09LX0VWVCwKLSAgQlRBX0FWX1NUUl9PUEVOX0ZBSUxfRVZULAotICBCVEFfQVZfU1RSX1NUQVJUX09LX0VWVCwKLSAgQlRBX0FWX1NUUl9TVEFSVF9GQUlMX0VWVCwKLSAgQlRBX0FWX1NUUl9DTE9TRV9FVlQsCi0gIEJUQV9BVl9TVFJfQ09ORklHX0lORF9FVlQsCi0gIEJUQV9BVl9TVFJfU0VDVVJJVFlfSU5EX0VWVCwKLSAgQlRBX0FWX1NUUl9TRUNVUklUWV9DRk1fRVZULAotICBCVEFfQVZfU1RSX1dSSVRFX0NGTV9FVlQsCi0gIEJUQV9BVl9TVFJfU1VTUEVORF9DRk1fRVZULAotICBCVEFfQVZfU1RSX1JFQ09ORklHX0NGTV9FVlQsCi0gIEJUQV9BVl9BVlJDX1RJTUVSX0VWVCwKLSAgQlRBX0FWX0FWRFRfQ09OTkVDVF9FVlQsCi0gIEJUQV9BVl9BVkRUX0RJU0NPTk5FQ1RfRVZULAotICBCVEFfQVZfUk9MRV9DSEFOR0VfRVZULAotICBCVEFfQVZfQVZEVF9ERUxBWV9SUFRfRVZULAotICBCVEFfQVZfQVZEVF9ERUxBWV9SUFRfQ0ZNX0VWVCwKLSAgQlRBX0FWX0FDUF9DT05ORUNUX0VWVCwKLSAgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX0VWVCwKLSAgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQsCi0KLSAgLyogdGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUgKi8KLSAgQlRBX0FWX0FQSV9FTkFCTEVfRVZULAotICBCVEFfQVZfQVBJX1JFR0lTVEVSX0VWVCwKLSAgQlRBX0FWX0FQSV9ERVJFR0lTVEVSX0VWVCwKLSAgQlRBX0FWX0FQSV9ESVNDT05ORUNUX0VWVCwKLSAgQlRBX0FWX0NJX1NSQ19EQVRBX1JFQURZX0VWVCwKLSAgQlRBX0FWX1NJR19DSEdfRVZULAotICBCVEFfQVZfU0lHTkFMTElOR19USU1FUl9FVlQsCi0gIEJUQV9BVl9TRFBfQVZSQ19ESVNDX0VWVCwKLSAgQlRBX0FWX0FWUkNfQ0xPU0VfRVZULAotICBCVEFfQVZfQVZSQ19CUk9XU0VfT1BFTl9FVlQsCi0gIEJUQV9BVl9BVlJDX0JST1dTRV9DTE9TRV9FVlQsCi0gIEJUQV9BVl9DT05OX0NIR19FVlQsCi0gIEJUQV9BVl9ERVJFR19DT01QX0VWVCwKLSAgQlRBX0FWX0FWRFRfUlBUX0NPTk5fRVZULAotICBCVEFfQVZfQVBJX1NUQVJUX0VWVCwgLyogdGhlIGZvbGxvd2luZyAyIGV2ZW50cyBtdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgKkFQXypFVlQgKi8KLSAgQlRBX0FWX0FQSV9TVE9QX0VWVAotfTsKLQotLyogZXZlbnRzIGZvciBBViBjb250cm9sIGJsb2NrIHN0YXRlIG1hY2hpbmUgKi8KLSNkZWZpbmUgQlRBX0FWX0ZJUlNUX1NNX0VWVCBCVEFfQVZfQVBJX0RJU0FCTEVfRVZUCi0jZGVmaW5lIEJUQV9BVl9MQVNUX1NNX0VWVCBCVEFfQVZfQVZSQ19OT05FX0VWVAotCi0vKiBldmVudHMgZm9yIEFWIHN0cmVhbSBjb250cm9sIGJsb2NrIHN0YXRlIG1hY2hpbmUgKi8KLSNkZWZpbmUgQlRBX0FWX0ZJUlNUX1NTTV9FVlQgQlRBX0FWX0FQSV9PUEVOX0VWVAotCi0vKiBldmVudHMgdGhhdCBkbyBub3QgZ28gdGhyb3VnaCBzdGF0ZSBtYWNoaW5lICovCi0jZGVmaW5lIEJUQV9BVl9GSVJTVF9OU01fRVZUIEJUQV9BVl9BUElfRU5BQkxFX0VWVAotI2RlZmluZSBCVEFfQVZfTEFTVF9OU01fRVZUIEJUQV9BVl9BUElfU1RPUF9FVlQKLQotLyogQVBJIGV2ZW50cyBwYXNzZWQgdG8gYm90aCBTU01zIChieSBidGFfYXZfYXBpX3RvX3NzbSkgKi8KLSNkZWZpbmUgQlRBX0FWX0ZJUlNUX0EyU19BUElfRVZUIEJUQV9BVl9BUElfU1RBUlRfRVZUCi0jZGVmaW5lIEJUQV9BVl9GSVJTVF9BMlNfU1NNX0VWVCBCVEFfQVZfQVBfU1RBUlRfRVZUCi0KLSNkZWZpbmUgQlRBX0FWX0xBU1RfRVZUIEJUQV9BVl9BUElfU1RPUF9FVlQKLQotLyogbWF4aW11bSBudW1iZXIgb2YgU0VQUyBpbiBzdHJlYW0gZGlzY292ZXJ5IHJlc3VsdHMgKi8KLSNkZWZpbmUgQlRBX0FWX05VTV9TRVBTIDMyCi0KLS8qIGluaXRpYWxpemF0aW9uIHZhbHVlIGZvciBBVlJDIGhhbmRsZSAqLwotI2RlZmluZSBCVEFfQVZfUkNfSEFORExFX05PTkUgMHhGRgotCi0vKiBzaXplIG9mIGRhdGFiYXNlIGZvciBzZXJ2aWNlIGRpc2NvdmVyeSAqLwotI2RlZmluZSBCVEFfQVZfRElTQ19CVUZfU0laRSAyMDAwCi0KLS8qIG1heGltdW0gbGVuZ3RoIG9mIEFWRFRQIHNlY3VyaXR5IGRhdGEgKi8KLSNkZWZpbmUgQlRBX0FWX1NFQ1VSSVRZX01BWF9MRU4gNDAwCi0KLS8qIGNoZWNrIG51bWJlciBvZiBidWZmZXJzIHF1ZXVlZCBhdCBMMkNBUCB3aGVuIHRoaXMgYW1vdW50IG9mIGJ1ZmZlcnMgYXJlCi0gKiBxdWV1ZWQgdG8gTDJDQVAgKi8KLSNkZWZpbmUgQlRBX0FWX1FVRVVFX0RBVEFfQ0hLX05VTSBMMkNBUF9ISUdIX1BSSV9NSU5fWE1JVF9RVU9UQQotCi0vKiB0aGUgbnVtYmVyIG9mIEFDTCBsaW5rcyB3aXRoIEFWRFQgKi8KLSNkZWZpbmUgQlRBX0FWX05VTV9MSU5LUyBBVkRUX05VTV9MSU5LUwotCi0jZGVmaW5lIEJUQV9BVl9CRV9TVFJFQU1fVE9fQ09fSUQodTMyLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1MzIpID0gKCgodWludDMyX3QpKCooKHApICsgMikpKSArICgoKHVpbnQzMl90KSgqKChwKSArIDEpKSkgPDwgOCkgKyBcCi0gICAgICAgICAgICAgKCgodWludDMyX3QpKCoocCkpKSA8PCAxNikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocCkgKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBmdW5jdGlvbiB0eXBlcyBmb3IgY2FsbC1vdXQgZnVuY3Rpb25zICovCi10eXBlZGVmIGJvb2wgKCp0QlRBX0FWX0NPX0lOSVQpKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jZmcpOwotdHlwZWRlZiB2b2lkICgqdEJUQV9BVl9DT19ESVNDX1JFUykodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zZXBzLCB1aW50OF90IG51bV9zbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zcmMsIHVpbnQxNl90IHV1aWRfbG9jYWwpOwotdHlwZWRlZiB0QTJEUF9TVEFUVVMgKCp0QlRBX0FWX0NPX0dFVENGRykodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3NlcF9pbmZvX2lkeCwgdWludDhfdCBzZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvKTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fU0VUQ0ZHKSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCB1aW50OF90IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3Byb3RlY3RfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRfbG9jYWxfc2VwLCB1aW50OF90IGF2ZHRfaGFuZGxlKTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fT1BFTikodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwgdWludDE2X3QgbXR1KTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fQ0xPU0UpKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fU1RBUlQpKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9ub19ydHBfaGVhZGVyKTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fU1RPUCkodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci10eXBlZGVmIEJUX0hEUiogKCp0QlRBX0FWX0NPX0RBVEFQQVRIKShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF90aW1lc3RhbXApOwotdHlwZWRlZiB2b2lkICgqdEJUQV9BVl9DT19ERUxBWSkodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsIHVpbnQxNl90IGRlbGF5KTsKLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfQ09fVVBEQVRFX01UVSkodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1KTsKLQotdHlwZWRlZiBidGF2X2EyZHBfc2Ntc3RfaW5mb190ICgqdEJUQV9BVl9DT19HRVRfU0NNU1RfSU5GTykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotLyogdGhlIGNhbGwtb3V0IGZ1bmN0aW9ucyBmb3Igb25lIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0FWX0NPX0lOSVQgaW5pdDsKLSAgdEJUQV9BVl9DT19ESVNDX1JFUyBkaXNjX3JlczsKLSAgdEJUQV9BVl9DT19HRVRDRkcgZ2V0Y2ZnOwotICB0QlRBX0FWX0NPX1NFVENGRyBzZXRjZmc7Ci0gIHRCVEFfQVZfQ09fT1BFTiBvcGVuOwotICB0QlRBX0FWX0NPX0NMT1NFIGNsb3NlOwotICB0QlRBX0FWX0NPX1NUQVJUIHN0YXJ0OwotICB0QlRBX0FWX0NPX1NUT1Agc3RvcDsKLSAgdEJUQV9BVl9DT19EQVRBUEFUSCBkYXRhOwotICB0QlRBX0FWX0NPX0RFTEFZIGRlbGF5OwotICB0QlRBX0FWX0NPX1VQREFURV9NVFUgdXBkYXRlX210dTsKLSAgdEJUQV9BVl9DT19HRVRfU0NNU1RfSU5GTyBnZXRfc2Ntc3RfaW5mbzsKLX0gdEJUQV9BVl9DT19GVU5DVFM7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9FTkFCTEVfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVEFfQVZfQ0JBQ0sqIHBfY2JhY2s7Ci0gIHRCVEFfQVZfRkVBVCBmZWF0dXJlczsKLX0gdEJUQV9BVl9BUElfRU5BQkxFOwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9BUElfUkVHSVNURVJfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIGNoYXIgcF9zZXJ2aWNlX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU4gKyAxXTsKLSAgdWludDhfdCBhcHBfaWQ7Ci0gIHRCVEFfQVZfU0lOS19EQVRBX0NCQUNLKiBwX2FwcF9zaW5rX2RhdGFfY2JhY2s7Ci0gIHVpbnQxNl90IHNlcnZpY2VfdXVpZDsKLX0gdEJUQV9BVl9BUElfUkVHOwotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRBX0FWX1JTX05PTkUsIC8qIHN0cmFpZ2h0IEFQSSBjYWxsICovCi0gIEJUQV9BVl9SU19PSywgICAvKiB0aGUgcm9sZSBzd2l0Y2ggcmVzdWx0IC0gc3VjY2Vzc2Z1bCAqLwotICBCVEFfQVZfUlNfRkFJTCwgLyogdGhlIHJvbGUgc3dpdGNoIHJlc3VsdCAtIGZhaWxlZCAqLwotICBCVEFfQVZfUlNfRE9ORSAgLyogdGhlIHJvbGUgc3dpdGNoIGlzIGRvbmUgLSBjb250aW51ZSAqLwotfSB0QlRBX0FWX1JTX1JFUzsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGJ0YV9hdl9yb2xlX3N3aXRjaF9yZXN1bHRfdGV4dCgKLSAgICBjb25zdCB0QlRBX0FWX1JTX1JFUyYgcmVzdWx0KSB7Ci0gIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQVZfUlNfTk9ORSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQVZfUlNfT0spOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FWX1JTX0ZBSUwpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FWX1JTX0RPTkUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV04iKTsKLSAgfQotfQotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9BUElfT1BFTl9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBib29sIHVzZV9yYzsKLSAgdEJUQV9BVl9SU19SRVMgc3dpdGNoX3JlczsKLSAgdWludDE2X3QgdXVpZDsgLyogdXVpZCBvZiBpbml0aWF0b3IgKi8KLX0gdEJUQV9BVl9BUElfT1BFTjsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1NUT1BfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIGJvb2wgc3VzcGVuZDsKLSAgYm9vbCBmbHVzaDsKLSAgYm9vbCByZWNvbmZpZ19zdG9wOyAgLy8gVHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIHN0b3BwZWQgZm9yIHJlY29uZmlndXJhdGlvbgotfSB0QlRBX0FWX0FQSV9TVE9QOwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9BUElfRElTQ09OTkVDVF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLX0gdEJUQV9BVl9BUElfRElTQ05UOwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9BVl9BUElfUFJPVEVDVF9SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgdWludDE2X3QgbGVuOwotfSB0QlRBX0FWX0FQSV9QUk9URUNUX1JFUTsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1BST1RFQ1RfUlNQX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCBlcnJvcl9jb2RlOwotfSB0QlRBX0FWX0FQSV9QUk9URUNUX1JTUDsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1JFTU9URV9DTURfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRBVlJDX01TR19QQVNTIG1zZzsKLSAgdWludDhfdCBsYWJlbDsKLX0gdEJUQV9BVl9BUElfUkVNT1RFX0NNRDsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1ZFTkRPUl9DTURfRVZUIGFuZCBSU1AgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEFWUkNfTVNHX1ZFTkRPUiBtc2c7Ci0gIHVpbnQ4X3QgbGFiZWw7Ci19IHRCVEFfQVZfQVBJX1ZFTkRPUjsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX1JDX09QRU5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci19IHRCVEFfQVZfQVBJX09QRU5fUkM7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9SQ19DTE9TRV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLX0gdEJUQV9BVl9BUElfQ0xPU0VfUkM7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9NRVRBX1JTUF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgYm9vbCBpc19yc3A7Ci0gIHVpbnQ4X3QgbGFiZWw7Ci0gIHRCVEFfQVZfQ09ERSByc3BfY29kZTsKLSAgQlRfSERSKiBwX3BrdDsKLX0gdEJUQV9BVl9BUElfTUVUQV9SU1A7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FQSV9SRUNPTkZJR19FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdWludDhfdCBjb2RlY19pbmZvW0FWRFRfQ09ERUNfU0laRV07IC8qIGNvZGVjIGNvbmZpZ3VyYXRpb24gKi8KLSAgdWludDhfdCogcF9wcm90ZWN0X2luZm87Ci0gIHVpbnQ4X3QgbnVtX3Byb3RlY3Q7Ci0gIGJvb2wgc3VzcGVuZDsKLSAgdWludDhfdCBzZXBfaW5mb19pZHg7Ci19IHRCVEFfQVZfQVBJX1JDRkc7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0NJX1NFVENPTkZJR19PS19FVlQgYW5kIEJUQV9BVl9DSV9TRVRDT05GSUdfRkFJTF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUQV9BVl9ITkRMIGhuZGw7Ci0gIHVpbnQ4X3QgZXJyX2NvZGU7Ci0gIHVpbnQ4X3QgY2F0ZWdvcnk7Ci0gIHVpbnQ4X3QgbnVtX3NlaWQ7Ci0gIHVpbnQ4X3QqIHBfc2VpZDsKLSAgYm9vbCByZWNmZ19uZWVkZWQ7Ci0gIHVpbnQ4X3QgYXZkdF9oYW5kbGU7IC8qIGxvY2FsIHNlcCB0eXBlIGZvciB3aGljaCB0aGlzIHN0cmVhbSB3aWxsIGJlIHNldCB1cCAqLwotfSB0QlRBX0FWX0NJX1NFVENPTkZJRzsKLQotLyogZGF0YSB0eXBlIGZvciBhbGwgc3RyZWFtIGV2ZW50cyBmcm9tIEFWRFRQICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIEF2ZHRwU2VwQ29uZmlnIGNmZzsgLyogY29uZmlndXJhdGlvbi9jYXBhYmlsaXRpZXMgcGFyYW1ldGVycyAqLwotICB0QVZEVF9DVFJMIG1zZzsgIC8qIEFWRFRQIGNhbGxiYWNrIG1lc3NhZ2UgcGFyYW1ldGVycyAqLwotICBSYXdBZGRyZXNzIGJkX2FkZHI7IC8qIGJkIGFkZHJlc3MgKi8KLSAgdWludDhfdCBzY2JfaW5kZXg7Ci0gIHVpbnQ4X3QgaGFuZGxlOwotICB1aW50OF90IGF2ZHRfZXZlbnQ7Ci0gIGJvb2wgaW5pdGlhdG9yOyAvKiB0cnVlLCBpZiBsb2NhbCBkZXZpY2UgaW5pdGlhdGVzIHRoZSBTVVNQRU5EICovCi19IHRCVEFfQVZfU1RSX01TRzsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVZSQ19NU0dfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRBVlJDX01TRyBtc2c7Ci0gIHVpbnQ4X3QgaGFuZGxlOwotICB1aW50OF90IGxhYmVsOwotICB1aW50OF90IG9wY29kZTsKLX0gdEJUQV9BVl9SQ19NU0c7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0FWUkNfT1BFTl9FVlQsIEJUQV9BVl9BVlJDX0NMT1NFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICBSYXdBZGRyZXNzIHBlZXJfYWRkcjsKLSAgdWludDhfdCBoYW5kbGU7Ci19IHRCVEFfQVZfUkNfQ09OTl9DSEc7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0FWX0NPTk5fQ0hHX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICBSYXdBZGRyZXNzIHBlZXJfYWRkcjsKLSAgYm9vbCBpc191cDsKLX0gdEJUQV9BVl9DT05OX0NIRzsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfUk9MRV9DSEFOR0VfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHVpbnQ4X3QgbmV3X3JvbGU7Ci0gIHVpbnQ4X3QgaGNpX3N0YXR1czsKLX0gdEJUQV9BVl9ST0xFX1JFUzsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfU0RQX0RJU0NfT0tfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci19IHRCVEFfQVZfU0RQX1JFUzsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQVZfQVBJX09GRkxPQURfUlNQX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB0QlRBX0FWX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfQVZfQVBJX1NUQVRVU19SU1A7Ci0KLS8qIHR5cGUgZm9yIFNFUCBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYXZfaGFuZGxlOyAgICAgICAgICAgICAgICAgICAvKiBBVkRUUCBoYW5kbGUgKi8KLSAgdWludDhfdCB0c2VwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFUCB0eXBlIG9mIGxvY2FsIFNFUCAqLwotICB1aW50OF90IGNvZGVjX2luZm9bQVZEVF9DT0RFQ19TSVpFXTsgLyogQ29kZWMgaW5mbyAqLwotICB0QlRBX0FWX1NJTktfREFUQV9DQkFDSyoKLSAgICAgIHBfYXBwX3NpbmtfZGF0YV9jYmFjazsgLyogU2luayBhcHBsaWNhdGlvbiBjYWxsYmFjayBmb3IgbWVkaWEgcGFja2V0cyAqLwotfSB0QlRBX0FWX1NFUDsKLQotZW51bSA6IHVpbnQ4X3QgewotICAvKiBpbml0aWF0b3IvYWNjZXB0b3Igcm9sZSBmb3IgYWRhcHRpb24gKi8KLSAgQlRBX0FWX1JPTEVfQURfSU5UID0gMHgwMCwgLyogaW5pdGlhdG9yICovCi0gIEJUQV9BVl9ST0xFX0FEX0FDUCA9IDB4MDEsIC8qIGFjY2VwdG9yICovCi0KLSAgLyogaW5pdGlhdG9yL2FjY2VwdG9yIHNpZ25hbGluZyByb2xlcyAqLwotICBCVEFfQVZfUk9MRV9TVEFSVF9BQ1AgPSAweDAwLAotICBCVEFfQVZfUk9MRV9TVEFSVF9JTlQgPSAweDEwLCAvKiBkbyBub3QgY2hhbmdlIHRoaXMgdmFsdWUgKi8KLQotICBCVEFfQVZfUk9MRV9TVVNQRU5EID0gMHgyMCwgICAgIC8qIHN1c3BlbmRpbmcgb24gc3RhcnQgKi8KLSAgQlRBX0FWX1JPTEVfU1VTUEVORF9PUFQgPSAweDQwLCAvKiBTdXNwZW5kIG9uIFN0YXJ0IG9wdGlvbiBpcyBzZXQgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUQV9BVl9ST0xFOwotCi0vKiB1bmlvbiBvZiBhbGwgZXZlbnQgZGF0YXR5cGVzICovCi11bmlvbiB0QlRBX0FWX0RBVEEgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB0QlRBX0FWX0FQSV9FTkFCTEUgYXBpX2VuYWJsZTsKLSAgdEJUQV9BVl9BUElfUkVHIGFwaV9yZWc7Ci0gIHRCVEFfQVZfQVBJX09QRU4gYXBpX29wZW47Ci0gIHRCVEFfQVZfQVBJX1NUT1AgYXBpX3N0b3A7Ci0gIHRCVEFfQVZfQVBJX0RJU0NOVCBhcGlfZGlzY250OwotICB0QlRBX0FWX0FQSV9QUk9URUNUX1JFUSBhcGlfcHJvdGVjdF9yZXE7Ci0gIHRCVEFfQVZfQVBJX1BST1RFQ1RfUlNQIGFwaV9wcm90ZWN0X3JzcDsKLSAgdEJUQV9BVl9BUElfUkVNT1RFX0NNRCBhcGlfcmVtb3RlX2NtZDsKLSAgdEJUQV9BVl9BUElfVkVORE9SIGFwaV92ZW5kb3I7Ci0gIHRCVEFfQVZfQVBJX1JDRkcgYXBpX3JlY29uZmlnOwotICB0QlRBX0FWX0NJX1NFVENPTkZJRyBjaV9zZXRjb25maWc7Ci0gIHRCVEFfQVZfU1RSX01TRyBzdHJfbXNnOwotICB0QlRBX0FWX1JDX01TRyByY19tc2c7Ci0gIHRCVEFfQVZfUkNfQ09OTl9DSEcgcmNfY29ubl9jaGc7Ci0gIHRCVEFfQVZfQ09OTl9DSEcgY29ubl9jaGc7Ci0gIHRCVEFfQVZfUk9MRV9SRVMgcm9sZV9yZXM7Ci0gIHRCVEFfQVZfU0RQX1JFUyBzZHBfcmVzOwotICB0QlRBX0FWX0FQSV9NRVRBX1JTUCBhcGlfbWV0YV9yc3A7Ci0gIHRCVEFfQVZfQVBJX1NUQVRVU19SU1AgYXBpX3N0YXR1c19yc3A7Ci19OwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUQV9BVl9BUElfT1BFTiBvcGVuOyAvKiB1c2VkIG9ubHkgYmVmb3JlIG9wZW4gYW5kIHJvbGUgc3dpdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVlZGVkIG9uIGFub3RoZXIgQVYgY2hhbm5lbCAqLwotfSB0QlRBX0FWX1FfSU5GTzsKLQotI2RlZmluZSBCVEFfQVZfUV9UQUdfT1BFTiAweDAxICAgLyogYWZ0ZXIgQVBJX09QRU4sIGJlZm9yZSBTVFJfT1BFTkVEICovCi0jZGVmaW5lIEJUQV9BVl9RX1RBR19TVEFSVCAweDAyICAvKiBiZWZvcmUgc3RhcnQgc2VuZGluZyBtZWRpYSBwYWNrZXRzICovCi0jZGVmaW5lIEJUQV9BVl9RX1RBR19TVFJFQU0gMHgwMyAvKiBkdXJpbmcgc3RyZWFtaW5nICovCi0KLSNkZWZpbmUgQlRBX0FWX1dBSVRfQUNQX0NBUFNfT04gMHgwMSAvKiByZXRyaXZpbmcgdGhlIHBlZXIgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEJUQV9BVl9XQUlUX0FDUF9DQVBTX1NUQVJURUQgXAotICAweDAyIC8qIHN0YXJ0ZWQgd2hpbGUgcmV0cml2aW5nIHBlZXIgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEJUQV9BVl9XQUlUX1JPTEVfU1dfUkVTX09QRU4gXAotICAweDA0IC8qIHdhaXRpbmcgZm9yIHJvbGUgc3dpdGNoIHJlc3VsdCBhZnRlciBBUElfT1BFTiwgYmVmb3JlIFNUUl9PUEVORUQgKi8KLSNkZWZpbmUgQlRBX0FWX1dBSVRfUk9MRV9TV19SRVNfU1RBUlQgXAotICAweDA4IC8qIHdhaXRpbmcgZm9yIHJvbGUgc3dpdGNoIHJlc3VsdCBiZWZvcmUgc3RyZWFtaW5nICovCi0jZGVmaW5lIEJUQV9BVl9XQUlUX1JPTEVfU1dfU1RBUlRFRCBcCi0gIDB4MTAgLyogc3RhcnRlZCB3aGlsZSB3YWl0aW5nIGZvciByb2xlIHN3aXRjaCByZXN1bHQgKi8KLSNkZWZpbmUgQlRBX0FWX1dBSVRfUk9MRV9TV19SRVRSWSAweDIwIC8qIHNldCB3aGVuIHJldHJ5IG9uIHRpbWVvdXQgKi8KLSNkZWZpbmUgQlRBX0FWX1dBSVRfQ0hFQ0tfUkMgXAotICAweDQwIC8qIHNldCB3aGVuIHRoZSB0aW1lciBpcyB1c2VkIGJ5IHJvbGUgc3dpdGNoICovCi0jZGVmaW5lIEJUQV9BVl9XQUlUX1JPTEVfU1dfRkFJTEVEIDB4ODAgLyogcm9sZSBzd2l0Y2ggZmFpbGVkICovCi0KLSNkZWZpbmUgQlRBX0FWX1dBSVRfUk9MRV9TV19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEJUQV9BVl9XQUlUX1JPTEVfU1dfUkVTX09QRU4gfCBCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19TVEFSVCB8IFwKLSAgIEJUQV9BVl9XQUlUX1JPTEVfU1dfU1RBUlRFRCB8IEJUQV9BVl9XQUlUX1JPTEVfU1dfUkVUUlkpCi0KLS8qIEJpdG1hcCBmb3IgY29sbGlzaW9uLCBjb2xsX21hc2sgKi8KLSNkZWZpbmUgQlRBX0FWX0NPTExfSU5DX1RNUiBcCi0gIDB4MDEgLyogVGltZXIgaXMgcnVubmluZyBmb3IgaW5jb21pbmcgTDJDIGNvbm5lY3Rpb24gKi8KLSNkZWZpbmUgQlRBX0FWX0NPTExfQVBJX0NBTExFRCBcCi0gIDB4MDIgLyogQVBJIG9wZW4gd2FzIGNhbGxlZCB3aGlsZSBpbmNvbWluZyB0aW1lciBpcyBydW5uaW5nICovCi0KLS8qIHR5cGUgZm9yIEFWIHN0cmVhbSBjb250cm9sIGJsb2NrICovCi0vLyBUT0RPOiBUaGlzIHNob3VsZCBiZSByZW5hbWVkIGFuZCBjaGFuZ2VkIHRvIGEgcHJvcGVyIGNsYXNzCi1zdHJ1Y3QgdEJUQV9BVl9TQ0IgZmluYWwgewotIHB1YmxpYzoKLSAgY29uc3QgdEJUQV9BVl9DT19GVU5DVFMqIHBfY29zOyAvKiB0aGUgYXNzb2NpYXRlZCBjYWxsb3V0IGZ1bmN0aW9ucyAqLwotICBib29sIHNkcF9kaXNjb3Zlcnlfc3RhcnRlZDsgLyogdmFyaWFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgU0RQIGlzIHN0YXJ0ZWQgKi8KLSAgdEJUQV9BVl9TRVAgc2Vwc1tCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYXTsKLSAgQXZkdHBTZXBDb25maWcgcGVlcl9jYXA7IC8qIGJ1ZmZlciB1c2VkIGZvciBnZXQgY2FwYWJpbGl0aWVzICovCi0gIGxpc3RfdCogYTJkcF9saXN0OyAvKiB1c2VkIGZvciBhdWRpbyBjaGFubmVscyBvbmx5ICovCi0gIHRCVEFfQVZfUV9JTkZPIHFfaW5mbzsKLSAgdEFWRFRfU0VQX0lORk8gc2VwX2luZm9bQlRBX0FWX05VTV9TRVBTXTsgLyogc3RyZWFtIGRpc2NvdmVyeSByZXN1bHRzICovCi0gIEF2ZHRwU2VwQ29uZmlnIGNmZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIFNFUCBjb25maWd1cmF0aW9uICovCi0gIGFsYXJtX3QqIGF2cmNfY3RfdGltZXI7ICAgICAgICAgICAgICAgICAgIC8qIGRlbGF5IHRpbWVyIGZvciBBVlJDIENUICovCi0gIGFsYXJtX3QqIGxpbmtfc2lnbmFsbGluZ190aW1lcjsKLSAgYWxhcm1fdCoKLSAgICAgIGFjY2VwdF9zaWduYWxsaW5nX3RpbWVyOyAvKiB0aW1lciB0byBtb25pdG9yIHNpZ25hbGxpbmcgd2hlbiBhY2NlcHRpbmcgKi8KLSAgdWludDE2X3QgbDJjX2NpZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTDJDQVAgY2hhbm5lbCBJRCAqLwotICB1aW50MTZfdCBzdHJlYW1fbXR1OyAgICAgICAgICAgICAgICAgICAgICAvKiBNVFUgb2Ygc3RyZWFtICovCi0gIHVpbnQ4X3QgbWVkaWFfdHlwZTsgICAgICAgICAvKiBNZWRpYSB0eXBlOiBBVkRUX01FRElBX1RZUEVfKiAqLwotICBib29sIGNvbmc7ICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBBVkRUUCBjb25nZXN0ZWQgKi8KLSAgdEJUQV9BVl9TVEFUVVMgb3Blbl9zdGF0dXM7IC8qIG9wZW4gZmFpbHVyZSBzdGF0dXMgKi8KLSAgdEJUQV9BVl9DSE5MIGNobmw7ICAgICAgICAgIC8qIHRoZSBjaGFubmVsOiBhdWRpby92aWRlbyAqLwotICB0QlRBX0FWX0hOREwgaG5kbDsgICAgICAgICAgLyogdGhlIGhhbmRsZTogKChoZGkgKyAxKXxjaG5sKSAqLwotICB1aW50MTZfdCBjdXJfcHNjX21hc2s7ICAgICAgLyogUHJvdG9jb2wgc2VydmljZSBjYXBhYmlsaXRpZXMgbWFzayBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiAqLwotICB1aW50OF90IGF2ZHRfaGFuZGxlOyAgICAgICAgLyogQVZEVFAgaGFuZGxlICovCi0gIHVpbnQ4X3QgaGRpOyAgICAgICAgICAgICAgICAvKiB0aGUgaW5kZXggdG8gU0NCW10gKi8KLSAgdWludDhfdCBudW1fc2VwczsgICAgICAgICAgIC8qIG51bWJlciBvZiBzZXBzIHJldHVybmVkIGJ5IHN0cmVhbSBkaXNjb3ZlcnkgKi8KLSAgdWludDhfdCBudW1fZGlzY19zbmtzOyAgICAgIC8qIG51bWJlciBvZiBkaXNjb3ZlcmVkIHNua3MgKi8KLSAgdWludDhfdCBudW1fZGlzY19zcmNzOyAgICAgIC8qIG51bWJlciBvZiBkaXNjb3ZlcmVkIHNyY3MgKi8KLSAgdWludDhfdCBzZXBfaW5mb19pZHg7ICAgICAgIC8qIGN1cnJlbnQgaW5kZXggaW50byBzZXBfaW5mbyAqLwotICB1aW50OF90IHNlcF9pZHg7ICAgICAgICAgICAgLyogY3VycmVudCBpbmRleCBpbnRvIGxvY2FsIHNlcHNbXSAqLwotICB1aW50OF90IHJjZmdfaWR4OyAgICAgICAgICAgLyogcmVjb25maWcgcmVxdWVzdGVkIGluZGV4IGludG8gc2VwX2luZm8gKi8KLSAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KLSAgdWludDhfdCBhdmR0X2xhYmVsOyAgICAgICAgIC8qIEFWRFRQIGxhYmVsICovCi0gIHVpbnQ4X3QgYXBwX2lkOyAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBpZCAqLwotICB1aW50OF90IG51bV9yZWNmZzsgICAgICAgICAgLyogbnVtYmVyIG9mIHJlY29uZmlndXJlIHNlbnQgKi8KLSAgdWludDhfdCByb2xlOwotICB1aW50OF90IGwyY19idWZzOyAgLyogdGhlIG51bWJlciBvZiBidWZmZXJzIHF1ZXVlZCB0byBMMkNBUCAqLwotICB1aW50OF90IHJjX2hhbmRsZTsgLyogY29ubmVjdGVkIEFWUkNQIGhhbmRsZSAqLwotICBib29sIHVzZV9yYzsgICAgICAgLyogdHJ1ZSBpZiBBVlJDUCBpcyBhbGxvd2VkICovCi0gIGJvb2wgc3RhcnRlZDsgICAgICAvKiB0cnVlIGlmIHN0cmVhbSBzdGFydGVkICovCi0gIGJvb2wgdXNlX3J0cF9oZWFkZXJfbWFya2VyX2JpdDsgLyogdHJ1ZSBpZiB0aGUgZW5jb2RlZCBkYXRhIHBhY2tldHMgaGF2ZSBSVFAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoZWFkZXJzLCBhbmQgdGhlIE1hcmtlciBiaXQgaW4gdGhlIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIHNldCBhY2NvcmRpbmcgdG8gUkZDIDY0MTYgKi8KLSAgdWludDhfdAotICAgICAgY29fc3RhcnRlZDsgICAgLyogbm9uLXplcm8sIGlmIHN0cmVhbSBzdGFydGVkIGZyb20gY2FsbC1vdXQgcGVyc3BlY3RpdmUgKi8KLSAgYm9vbCByZWNmZ19zdXA7ICAgIC8qIHRydWUgaWYgdGhlIGZpcnN0IGF0dGVtcHQgdG8gcmVjb25maWd1cmUgdGhlIHN0cmVhbSB3YXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxsLCBlbHNlIEZhbHNlIGlmIGNvbW1hbmQgZmFpbHMgKi8KLSAgYm9vbCBzdXNwZW5kX3N1cDsgIC8qIHRydWUgaWYgU3VzcGVuZCBzdHJlYW0gaXMgc3VwcG9ydGVkLCBlbHNlIGZhbHNlIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kIGNvbW1hbmQgZmFpbHMgKi8KLSAgYm9vbCBkZXJlZ2lzdGVyaW5nOyAvKiB0cnVlIGlmIGRlcmVnaXN0ZXJpbmcgKi8KLSAgYm9vbCBzY29fc3VzcGVuZDsgIC8qIHRydWUgaWYgU1VTUEVORCBpcyBpc3N1ZWQgYXV0b21hdGljYWxseSBmb3IgU0NPICovCi0gIHVpbnQ4X3QgY29sbF9tYXNrOyAvKiBNYXNrIHRvIGNoZWNrIGluY29taW5nIGFuZCBvdXRnb2luZyBjb2xsaXNpb24gKi8KLSAgdEJUQV9BVl9BUElfT1BFTiBvcGVuX2FwaTsgLyogU2F2ZWQgT1BFTiBhcGkgbWVzc2FnZSAqLwotICB1aW50OF90IHdhaXQ7ICAvKiBzZXQgMHgxLCB3aGVuIGdldHRpbmcgQ2FwcyBhcyBBQ1AsIHNldCAweDIsIHdoZW4gc3RhcnRlZCAqLwotICB1aW50OF90IHFfdGFnOyAvKiBpZGVudGlmeSB0aGUgYXNzb2NpYXRlZCBxX2luZm8gdW5pb24gbWVtYmVyICovCi0gIGJvb2wgbm9fcnRwX2hlYWRlcjsgLyogdHJ1ZSBpZiBhZGQgbm8gUlRQIGhlYWRlciAqLwotICB1aW50MTZfdCB1dWlkX2ludDsgLyppbnRlbmRlZCBVVUlEIG9mIEluaXRpYXRvciB0byBjb25uZWN0IHRvICovCi0KLSAgLyoqCi0gICAqIENhbGxlZCB0byBzZXR1cCB0aGUgc3RhdGUgd2hlbiBjb25uZWN0ZWQgdG8gYSBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICovCi0gIHZvaWQgT25Db25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotICAvKioKLSAgICogQ2FsbGVkIHRvIGNsZWFyIHRoZSBzdGF0ZSB3aGVuIGRpc2Nvbm5lY3RlZCBmcm9tIGEgcGVlci4KLSAgICoKLSAgICovCi0gIHZvaWQgT25EaXNjb25uZWN0ZWQoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBwZWVyIGFkZHJlc3MuCi0gICAqLwotICBjb25zdCBSYXdBZGRyZXNzJiBQZWVyQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIHBlZXJfYWRkcmVzc187IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBBVkRUUCB2ZXJzaW9uIG9mIHRoZSBwZWVyIGRldmljZS4KLSAgICovCi0gIHVpbnQxNl90IEF2ZHRwVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIGF2ZHRwX3ZlcnNpb25fOyB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgQVZEVFAgdmVyc2lvbiBvZiB0aGUgcGVlciBkZXZpY2UuCi0gICAqCi0gICAqIEBwYXJhbSBhdmR0cF92ZXJzaW9uIHRoZSBBVkRUUCB2ZXJzaW9uIHRvIHVzZQotICAgKi8KLSAgdm9pZCBTZXRBdmR0cFZlcnNpb24odWludDE2X3QgYXZkdHBfdmVyc2lvbik7Ci0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGFzc2lnbmVkIGFuZCBjdXJyZW50eSB1c2VkLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVudHJ5IGlzIGFzc2lnbmVkIGFuZCBjdXJyZW50bHkgdXNlZAotICAgKi8KLSAgYm9vbCBJc0Fzc2lnbmVkKCkgY29uc3QgeyByZXR1cm4gIXBlZXJfYWRkcmVzc18uSXNFbXB0eSgpOyB9Ci0KLSBwcml2YXRlOgotICBSYXdBZGRyZXNzIHBlZXJfYWRkcmVzc187ICAvLyBQZWVyIGFkZHJlc3MKLSAgdWludDE2X3QgYXZkdHBfdmVyc2lvbl87ICAgLy8gVGhlIEFWRFRQIHZlcnNpb24gb2YgdGhlIHBlZXIgZGV2aWNlCi19OwotCi0jZGVmaW5lIEJUQV9BVl9SQ19ST0xFX01BU0sgMHgxMAotI2RlZmluZSBCVEFfQVZfUkNfUk9MRV9JTlQgMHgwMAotI2RlZmluZSBCVEFfQVZfUkNfUk9MRV9BQ1AgMHgxMAotCi0jZGVmaW5lIEJUQV9BVl9SQ19DT05OX01BU0sgMHgyMAotCi0vKiB0eXBlIGZvciBBViBSQ1AgY29udHJvbCBibG9jayAqLwotLyogaW5kZXggdG8gdGhpcyBjb250cm9sIGJsb2NrIGlzIHRoZSByYyBoYW5kbGUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQ4X3QgaGFuZGxlOwotICB1aW50OF90IHNoZGw7ICAgICAgICAgICAgICAgLyogc3RyZWFtIGhhbmRsZSAoaGRpICsgMSkgKi8KLSAgdWludDhfdCBsaWR4OyAgICAgICAgICAgICAgIC8qIChpbmRleCsxKSB0byBMQ0IgKi8KLSAgdEJUQV9BVl9GRUFUIHBlZXJfZmVhdHVyZXM7IC8qIHBlZXIgZmVhdHVyZXMgbWFzayAqLwotICB1aW50MTZfdCBjb3Zlcl9hcnRfcHNtOyAgICAgLyogQklQIFBTTSBmb3IgY292ZXIgYXJ0IGZlYXR1cmUgKi8KLX0gdEJUQV9BVl9SQ0I7Ci0jZGVmaW5lIEJUQV9BVl9OVU1fUkNCIChCVEFfQVZfTlVNX1NUUlMgKyAyKQotCi1lbnVtIHsgQlRBX0FWX0xDQl9GUkVFLCBCVEFfQVZfTENCX0ZJTkQgfTsKLQotLyogdHlwZSBmb3IgQVYgQUNMIExpbmsgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGFkZHI7ICAvKiBwZWVyIEJEIGFkZHJlc3MgKi8KLSAgdWludDhfdCBjb25uX21zazsgLyogaGFuZGxlIG1hc2sgb2YgY29ubmVjdGVkIHN0cmVhbSBoYW5kbGUgKi8KLSAgdWludDhfdCBsaWR4OyAgICAgLyogaW5kZXggKyAxICovCi19IHRCVEFfQVZfTENCOwotCi0vKiB0eXBlIGZvciBzdHJlYW0gc3RhdGUgbWFjaGluZSBhY3Rpb24gZnVuY3Rpb25zICovCi10eXBlZGVmIHZvaWQgKCp0QlRBX0FWX1NBQ1QpKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotCi0vKiB0eXBlIGZvciBBViBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYltCVEFfQVZfTlVNX1NUUlNdOyAgIC8qIHN0cmVhbSBjb250cm9sIGJsb2NrICovCi0gIHRTRFBfRElTQ09WRVJZX0RCKiBwX2Rpc2NfZGI7ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGlzY292ZXJ5IGRhdGFiYXNlICovCi0gIHRCVEFfQVZfQ0JBQ0sqIHBfY2JhY2s7ICAgICAgICAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIHRCVEFfQVZfUkNCIHJjYltCVEFfQVZfTlVNX1JDQl07ICAgICAgIC8qIFJDQiBjb250cm9sIGJsb2NrICovCi0gIHRCVEFfQVZfTENCIGxjYltCVEFfQVZfTlVNX0xJTktTICsgMV07IC8qIGxpbmsgY29udHJvbCBibG9jayAqLwotICB1aW50MzJfdCBzZHBfYTJkcF9oYW5kbGU7ICAgICAvKiBTRFAgcmVjb3JkIGhhbmRsZSBmb3IgYXVkaW8gc3JjICovCi0gIHVpbnQzMl90IHNkcF9hMmRwX3Nua19oYW5kbGU7IC8qIFNEUCByZWNvcmQgaGFuZGxlIGZvciBhdWRpbyBzbmsgKi8KLSAgdEJUQV9BVl9GRUFUIGZlYXR1cmVzOyAgICAgICAgLyogZmVhdHVyZXMgbWFzayAqLwotICB0QlRBX1NFQyBzZWNfbWFzazsgICAgICAgICAgICAvKiBzZWN1cml0eSBtYXNrICovCi0gIHRCVEFfQVZfSE5ETCBoYW5kbGU7ICAgICAgICAgIC8qIHRoZSBoYW5kbGUgZm9yIFNEUCBhY3Rpdml0eSAqLwotICBib29sIGRpc2FibGluZzsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGFwaSBkaXNhYmxlZCBjYWxsZWQgKi8KLSAgdWludDhfdCBlbmFibGluZ19hdHRlbXB0czsgICAgLy8gY291bnRlciB0byB3YWl0IGZvciBwcmV2aW91cyBkaXNhYmxpbmcKLSAgdWludDhfdAotICAgICAgZGlzYzsgLyogKGhkaSsxKSBvciAocmNfaGFuZGxlfEJUQV9BVl9DSE5MX01TSykgaWYgcF9kaXNjX2RiIGlzIGluIHVzZSAqLwotICB1aW50OF90IHN0YXRlOyAgICAgICAgICAvKiBzdGF0ZSBtYWNoaW5lIHN0YXRlICovCi0gIHVpbnQ4X3QgY29ubl9hdWRpbzsgICAgIC8qIGhhbmRsZSBtYXNrIG9mIGNvbm5lY3RlZCBhdWRpbyBjaGFubmVscyAqLwotICB1aW50OF90IGNvbm5fbGNiOyAgICAgICAvKiBpbmRleCBtYXNrIG9mIHVzZWQgTENCcyAqLwotICB1aW50OF90IGF1ZGlvX29wZW5fY250OyAvKiBudW1iZXIgb2YgY29ubmVjdGVkIGF1ZGlvIGNoYW5uZWxzICovCi0gIHVpbnQ4X3QgcmVnX2F1ZGlvOyAgICAgIC8qIGhhbmRsZSBtYXNrIG9mIHJlZ2lzdGVyZWQgYXVkaW8gY2hhbm5lbHMgKi8KLSAgdWludDhfdCByY19hY3BfaGFuZGxlOwotICB1aW50OF90IHJjX2FjcF9pZHg7IC8qIChpbmRleCArIDEpIHRvIFJDQiAqLwotICB1aW50OF90IHJzX2lkeDsgICAgLyogKGluZGV4ICsgMSkgdG8gU0NCIGZvciB0aGUgb25lIHdhaXRpbmcgZm9yIFJTIG9uIG9wZW4gKi8KLSAgYm9vbCBzY29fb2NjdXBpZWQ7IC8qIHRydWUgaWYgU0NPIGlzIGJlaW5nIHVzZWQgb3IgY2FsbCBpcyBpbiBwcm9ncmVzcyAqLwotICB1aW50MTZfdCBvZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbDsKLSAgdWludDE2X3Qgb2ZmbG9hZF9zdGFydGVkX2FjbF9oZGw7Ci19IHRCVEFfQVZfQ0I7Ci0KLS8vIHRvdGFsIGF0dGVtcHRzIGFyZSBoYWxmIHNlY29uZHMKLWNvbnN0ZXhwciB1aW50MzJfdCBrRW5hYmxpbmdBdHRlbXB0c0ludGVydmFsTXMgPSAxMDA7Ci1jb25zdGV4cHIgdWludDhfdCBrRW5hYmxpbmdBdHRlbXB0c0NvdW50TWF4aW11bSA9IDU7Ci0KLS8vIEEyRFAgb2ZmbG9hZCBWU0MgcGFyYW1ldGVycwotY2xhc3MgdEJUX0EyRFBfT0ZGTE9BRCB7Ci0gcHVibGljOgotICB1aW50MzJfdCBjb2RlY190eXBlOyAgICAgICAgICAgIC8qIGNvZGVjIHR5cGVzIGV4OiBTQkMvQUFDL0xEQUMvQVBUeCAqLwotICB1aW50MTZfdCBtYXhfbGF0ZW5jeTsgICAgICAgICAgIC8qIG1heGltdW0gbGF0ZW5jeSAqLwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI+IHNjbXNfdF9lbmFibGU7IC8qIFNDTVMtVCBlbmFibGUgKi8KLSAgdWludDMyX3Qgc2FtcGxlX3JhdGU7ICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZXMgZXg6IDQ0LjEvNDgvODguMi85NiBLaHogKi8KLSAgdWludDhfdCBiaXRzX3Blcl9zYW1wbGU7ICAgICAgICAvKiBiaXRzIHBlciBzYW1wbGUgZXg6IDE2LzI0LzMyICovCi0gIHVpbnQ4X3QgY2hfbW9kZTsgICAgICAgICAgICAgICAgLyogTm9uZTowIExlZnQ6MSBSaWdodDoyICovCi0gIHVpbnQzMl90IGVuY29kZWRfYXVkaW9fYml0cmF0ZTsgLyogZW5jb2RlciBhdWRpbyBiaXRyYXRlcyAqLwotICB1aW50MTZfdCBhY2xfaGRsOyAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIHVpbnQxNl90IGwyY19yY2lkOyAgICAgICAgICAgICAgLyogbDJjYXAgY2hhbm5lbCBpZCAqLwotICB1aW50MTZfdCBtdHU7ICAgICAgICAgICAgICAgICAgIC8qIE1UVSBzaXplICovCi0gIHVpbnQ4X3QgY29kZWNfaW5mb1szMl07ICAgICAgICAgLyogQ29kZWMgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLX07Ci0KLS8qIFZlbmRvciBPRkZMT0FEIFZTQyAqLwotI2RlZmluZSBIQ0lfVlNRQ19DT05UUk9MTEVSX0EyRFBfT1BDT0RFIDB4MDAwQQotCi0jZGVmaW5lIFZTX0hDSV9BMkRQX09GRkxPQURfU1RBUlQgMHgwMQotI2RlZmluZSBWU19IQ0lfQTJEUF9PRkZMT0FEX1NUT1AgMHgwMgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBjb250cm9sIGJsb2NrIGRlY2xhcmF0aW9uICovCi1leHRlcm4gdEJUQV9BVl9DQiBidGFfYXZfY2I7Ci0KLS8qIGNvbmZpZyBzdHJ1Y3QgKi8KLWV4dGVybiBjb25zdCB0QlRBX0FWX0NGRyogcF9idGFfYXZfY2ZnOwotZXh0ZXJuIGNvbnN0IHRCVEFfQVZfQ0ZHIGJ0YV9hdmtfY2ZnOwotZXh0ZXJuIGNvbnN0IHRCVEFfQVZfQ0ZHIGJ0YV9hdl9jZmc7Ci1leHRlcm4gY29uc3QgdEJUQV9BVl9DRkcgYnRhX2F2X2NmZ19jb21wYXRpYmlsaXR5OwotCi0vKiByYyBpZCBjb25maWcgc3RydWN0ICovCi1leHRlcm4gdWludDE2X3QqIHBfYnRhX2F2X3JjX2lkOwotZXh0ZXJuIHVpbnQxNl90KiBwX2J0YV9hdl9yY19pZF9hYzsKLQotZXh0ZXJuIGNvbnN0IHRCVEFfQVZfQ09fRlVOQ1RTIGJ0YV9hdl9hMmRwX2NvczsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zaW5rX2RhdGFfY2JhY2sodWludDhfdCBoYW5kbGUsIEJUX0hEUiogcF9wa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRpbWVfc3RhbXAsIHVpbnQ4X3QgbV9wdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KLWV4dGVybiB0QlRBX0FWX1NDQiogYnRhX2F2X2huZGxfdG9fc2NiKHVpbnQxNl90IGhhbmRsZSk7Ci10QlRBX0FWX1NDQiogYnRhX2F2X2FkZHJfdG9fc2NiKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRhX2F2X2Noa19zdGFydCh0QlRBX0FWX1NDQiogcF9zY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3Jlc3RvcmVfc3dpdGNoKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X2Nvbm5fY2JhY2sodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYl9pbmRleCk7Ci1leHRlcm4gdWludDhfdCBidGFfYXZfcmNfY3JlYXRlKHRCVEFfQVZfQ0IqIHBfY2IsIHVpbnQ4X3Qgcm9sZSwgdWludDhfdCBzaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxpZHgpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3N0cmVhbV9jaGcodEJUQV9BVl9TQ0IqIHBfc2NiLCBib29sIHN0YXJ0ZWQpOwotZXh0ZXJuIGJvb2wgYnRhX2F2X2lzX3NjYl9vcGVuaW5nKHRCVEFfQVZfU0NCKiBwX3NjYik7Ci1leHRlcm4gYm9vbCBidGFfYXZfaXNfc2NiX2luY29taW5nKHRCVEFfQVZfU0NCKiBwX3NjYik7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2V0X3NjYl9zc3RfaW5pdCh0QlRBX0FWX1NDQiogcF9zY2IpOwotZXh0ZXJuIGJvb2wgYnRhX2F2X2lzX3NjYl9pbml0KHRCVEFfQVZfU0NCKiBwX3NjYik7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2V0X3NjYl9zc3RfaW5jb21pbmcodEJUQV9BVl9TQ0IqIHBfc2NiKTsKLWV4dGVybiB0QlRBX0FWX0xDQiogYnRhX2F2X2ZpbmRfbGNiKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHVpbnQ4X3Qgb3ApOwotZXh0ZXJuIGNvbnN0IGNoYXIqIGJ0YV9hdl9zc3RfY29kZSh1aW50OF90IHN0YXRlKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9mcmVlX3NjYih0QlRBX0FWX1NDQiogcF9zY2IpOwotCi0vKiBtYWluIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2F2X2FwaV9kZXJlZ2lzdGVyKHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9kdXBfYXVkaW9fYnVmKHRCVEFfQVZfU0NCKiBwX3NjYiwgQlRfSERSKiBwX2J1Zik7Ci1leHRlcm4gdm9pZCBidGFfYXZfc21fZXhlY3V0ZSh0QlRBX0FWX0NCKiBwX2NiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zc21fZXhlY3V0ZSh0QlRBX0FWX1NDQiogcF9zY2IsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiBib29sIGJ0YV9hdl9oZGxfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZyk7Ci1leHRlcm4gY29uc3QgY2hhciogYnRhX2F2X2V2dF9jb2RlKHVpbnQxNl90IGV2dF9jb2RlKTsKLWV4dGVybiBib29sIGJ0YV9hdl9zd2l0Y2hfaWZfbmVlZGVkKHRCVEFfQVZfU0NCKiBwX3NjYik7Ci1leHRlcm4gYm9vbCBidGFfYXZfbGlua19yb2xlX29rKHRCVEFfQVZfU0NCKiBwX3NjYiwgdWludDhfdCBiaXRzKTsKLQotLyogbnNtIGFjdGlvbiBmdW5jdGlvbnMgKi8KLWV4dGVybiB2b2lkIGJ0YV9hdl9hcGlfZGlzY29ubmVjdCh0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2lnX2NoZyh0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2lnbmFsbGluZ190aW1lcih0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfcmNfZGlzY19kb25lKHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yY19jbG9zZWQodEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX2Jyb3dzZV9vcGVuZWQodEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX2Jyb3dzZV9jbG9zZWQodEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX2Rpc2ModWludDhfdCBkaXNjKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9jb25uX2NoZyh0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfZGVyZWdfY29tcCh0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIHNtIGFjdGlvbiBmdW5jdGlvbnMgKi8KLWV4dGVybiB2b2lkIGJ0YV9hdl9kaXNhYmxlKHRCVEFfQVZfQ0IqIHBfY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yY19vcGVuZWQodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX3JlbW90ZV9jbWQodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX3ZlbmRvcl9jbWQodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX3ZlbmRvcl9yc3AodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX21zZyh0QlRBX0FWX0NCKiBwX2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfcmNfY2xvc2UodEJUQV9BVl9DQiogcF9jYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjX21ldGFfcnNwKHRCVEFfQVZfQ0IqIHBfY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yY19mcmVlX3JzcCh0QlRBX0FWX0NCKiBwX2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfcmNfZnJlZV9icm93c2VfbXNnKHRCVEFfQVZfQ0IqIHBfY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLQotZXh0ZXJuIHRCVEFfQVZfUkNCKiBidGFfYXZfZ2V0X3JjYl9ieV9zaGRsKHVpbnQ4X3Qgc2hkbCk7Ci1leHRlcm4gdm9pZCBidGFfYXZfZGVsX3JjKHRCVEFfQVZfUkNCKiBwX3JjYik7Ci0KLWV4dGVybiB2b2lkIGJ0YV9hdl9wcm9jX3N0cmVhbV9ldnQodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2JfaW5kZXgpOwotCi0vKiBzc20gYWN0aW9uIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2F2X2RvX2Rpc2NfYTJkcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9jbGVhbnVwKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X2ZyZWVfc2RiKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X2NvbmZpZ19pbmQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfZGlzY29ubmVjdF9yZXEodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2VjdXJpdHlfcmVxKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3NlY3VyaXR5X3JzcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zZXRjb25maWdfcnNwKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3N0cl9vcGVuZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2VjdXJpdHlfaW5kKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3NlY3VyaXR5X2NmbSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9kb19jbG9zZSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9jb25uZWN0X3JlcSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zZHBfZmFpbGVkKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X2Rpc2NfcmVzdWx0cyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9kaXNjX3Jlc19hc19hY3AodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfb3Blbl9mYWlsZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfZ2V0Y2FwX3Jlc3VsdHModEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc2V0Y29uZmlnX3Jlaih0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9kaXNjb3Zlcl9yZXEodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfY29ubl9mYWlsZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfZG9fc3RhcnQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc3RyX3N0b3BwZWQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfcmVjb25maWcodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfZGF0YV9wYXRoKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3N0YXJ0X29rKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3N0YXJ0X2ZhaWxlZCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zdHJfY2xvc2VkKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X2Nscl9jb25nKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3N1c3BlbmRfY2ZtKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjZmdfc3RyX29rKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjZmdfZmFpbGVkKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjZmdfY29ubmVjdCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yY2ZnX2Rpc2NudGQodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfc3VzcGVuZF9jb250KHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjZmdfY2ZtKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3JjZmdfb3Blbih0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zZWN1cml0eV9yZWoodEJUQV9BVl9TQ0IqIHBfc2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfYXZfb3Blbl9yYyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9jaGtfMm5kX3N0YXJ0KHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3NhdmVfY2Fwcyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yZWpfY29ubih0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yZWpfY29ubih0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zZXRfdXNlX3JjKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X2Njb19jbG9zZSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9zd2l0Y2hfcm9sZSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9yb2xlX3Jlcyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9kZWxheV9jbyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9vcGVuX2F0X2luYyh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9vZmZsb2FkX3JlcSh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl9vZmZsb2FkX3JzcCh0QlRBX0FWX1NDQiogcF9zY2IsIHRCVEFfQVZfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9hdl92ZW5kb3Jfb2ZmbG9hZF9zdG9wKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2F2X3N0X3JjX3RpbWVyKHRCVEFfQVZfU0NCKiBwX3NjYiwgdEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotCi0jZW5kaWYgLyogQlRBX0FWX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X21haW4uY2MgYi9idGEvYXYvYnRhX2F2X21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Nzc3MGMuLjAwMDAwMDAKLS0tIGEvYnRhL2F2L2J0YV9hdl9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIG1haW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgdGhlIEJUQSBhZHZhbmNlZCBhdWRpby92aWRlby4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0YV9hdiIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvYXYvYnRhX2F2X2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcl9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS91dGwuaCIKLSNpbmNsdWRlICJidGlmL2F2cmNwL2F2cmNwX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hdl9jby5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbmZpZy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbnN0YW50cyBhbmQgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUQV9BVl9SRVRfVE9VVAotI2RlZmluZSBCVEFfQVZfUkVUX1RPVVQgNAotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0FWX1NJR19UT1VUCi0jZGVmaW5lIEJUQV9BVl9TSUdfVE9VVCA0Ci0jZW5kaWYKLQotI2lmbmRlZiBCVEFfQVZfSURMRV9UT1VUCi0jZGVmaW5lIEJUQV9BVl9JRExFX1RPVVQgMTAKLSNlbmRpZgotCi0vKiB0aGUgZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gcmV0cnkgcm9sZSBzd2l0Y2ggKi8KLSNpZm5kZWYgQlRBX0FWX1JTX1RJTUVfVkFMCi0jZGVmaW5lIEJUQV9BVl9SU19USU1FX1ZBTCAxMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBBVlJDUF9WRVJTSU9OX1BST1BFUlRZCi0jZGVmaW5lIEFWUkNQX1ZFUlNJT05fUFJPUEVSVFkgInBlcnNpc3QuYmx1ZXRvb3RoLmF2cmNwdmVyc2lvbiIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNQXzFfNl9TVFJJTkcKLSNkZWZpbmUgQVZSQ1BfMV82X1NUUklORyAiYXZyY3AxNiIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNQXzFfNV9TVFJJTkcKLSNkZWZpbmUgQVZSQ1BfMV81X1NUUklORyAiYXZyY3AxNSIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNQXzFfNF9TVFJJTkcKLSNkZWZpbmUgQVZSQ1BfMV80X1NUUklORyAiYXZyY3AxNCIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNQXzFfM19TVFJJTkcKLSNkZWZpbmUgQVZSQ1BfMV8zX1NUUklORyAiYXZyY3AxMyIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNQX0RFRkFVTFRfVkVSU0lPTgotI2RlZmluZSBBVlJDUF9ERUZBVUxUX1ZFUlNJT04gQVZSQ1BfMV81X1NUUklORwotI2VuZGlmCi0KLS8qIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCi1lbnVtIHsgQlRBX0FWX0lOSVRfU1QsIEJUQV9BVl9PUEVOX1NUIH07Ci0KLXR5cGVkZWYgdm9pZCAoKnRCVEFfQVZfTlNNX0FDVCkodEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgYnRhX2F2X2FwaV9lbmFibGUodEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgYnRhX2F2X2FwaV9yZWdpc3Rlcih0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfYXZfY2lfZGF0YSh0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfYXZfcnBjX2Nvbm4odEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgYnRhX2F2X2FwaV90b19zc20odEJUQV9BVl9EQVRBKiBwX2RhdGEpOwotCi1zdGF0aWMgdm9pZCBidGFfYXZfc2NvX2NoZ19jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXN0YXRpYyB2b2lkIGJ0YV9hdl9zeXNfcnNfY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFWIGNvbnRyb2wgYmxvY2sgKi8KLXRCVEFfQVZfQ0IgYnRhX2F2X2NiID0ge307Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfYXZfc3RfY29kZSh1aW50OF90IHN0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9hcGlfZW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gQVBJIGVuYWJsZSBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9hcGlfZW5hYmxlKHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIGlmIChidGFfYXZfY2IuZGlzYWJsaW5nKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiJXM6IHByZXZpb3VzIChyZWdfYXVkaW89JSN4KSBpcyBzdGlsbCBkaXNhYmxpbmcgKGF0dGVtcHRzPSVkKSIsCi0gICAgICAgIF9fZnVuY19fLCBidGFfYXZfY2IucmVnX2F1ZGlvLCBidGFfYXZfY2IuZW5hYmxpbmdfYXR0ZW1wdHMpOwotICAgIGlmICgrK2J0YV9hdl9jYi5lbmFibGluZ19hdHRlbXB0cyA8PSBrRW5hYmxpbmdBdHRlbXB0c0NvdW50TWF4aW11bSkgewotICAgICAgdEJUQV9BVl9BUElfRU5BQkxFKiBwX2J1ZiA9Ci0gICAgICAgICAgKHRCVEFfQVZfQVBJX0VOQUJMRSopb3NpX21hbGxvYyhzaXplb2YodEJUQV9BVl9BUElfRU5BQkxFKSk7Ci0gICAgICBtZW1jcHkocF9idWYsICZwX2RhdGEtPmFwaV9lbmFibGUsIHNpemVvZih0QlRBX0FWX0FQSV9FTkFCTEUpKTsKLSAgICAgIGJ0YV9zeXNfc2VuZG1zZ19kZWxheWVkKHBfYnVmLCBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFbmFibGluZ0F0dGVtcHRzSW50ZXJ2YWxNcykpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYnRhX2F2X2NiLnNkcF9hMmRwX2hhbmRsZSkgewotICAgICAgU0RQX0RlbGV0ZVJlY29yZChidGFfYXZfY2Iuc2RwX2EyZHBfaGFuZGxlKTsKLSAgICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKTsKLSAgICB9Ci0gICAgaWYgKGJ0YV9hdl9jYi5zZHBfYTJkcF9zbmtfaGFuZGxlKSB7Ci0gICAgICBTRFBfRGVsZXRlUmVjb3JkKGJ0YV9hdl9jYi5zZHBfYTJkcF9zbmtfaGFuZGxlKTsKLSAgICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSyk7Ci0gICAgfQotICAgIC8vIGRlcmVnaXN0ZXIgZnJvbSBBVkRUCi0gICAgYnRhX2FyX2RlcmVnX2F2ZHQoKTsKLQotICAgIC8vIGRlcmVnaXN0ZXIgZnJvbSBBVkNUCi0gICAgYnRhX2FyX2RlcmVnX2F2cmMoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpOwotICAgIGJ0YV9hcl9kZXJlZ19hdnJjKFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCk7Ci0gICAgYnRhX2FyX2RlcmVnX2F2Y3QoKTsKLSAgfQotCi0gIC8qIGluaXRpYWxpemUgY29udHJvbCBibG9jayAqLwotICBtZW1zZXQoJmJ0YV9hdl9jYiwgMCwgc2l6ZW9mKHRCVEFfQVZfQ0IpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IEJUQV9BVl9OVU1fUkNCOyBpKyspCi0gICAgYnRhX2F2X2NiLnJjYltpXS5oYW5kbGUgPSBCVEFfQVZfUkNfSEFORExFX05PTkU7Ci0KLSAgYnRhX2F2X2NiLnJjX2FjcF9oYW5kbGUgPSBCVEFfQVZfUkNfSEFORExFX05PTkU7Ci0KLSAgLyogc3RvcmUgcGFyYW1ldGVycyAqLwotICBidGFfYXZfY2IucF9jYmFjayA9IHBfZGF0YS0+YXBpX2VuYWJsZS5wX2NiYWNrOwotICBidGFfYXZfY2IuZmVhdHVyZXMgPSBwX2RhdGEtPmFwaV9lbmFibGUuZmVhdHVyZXM7Ci0gIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCA9IEhDSV9JTlZBTElEX0hBTkRMRTsKLSAgYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRlZF9hY2xfaGRsID0gSENJX0lOVkFMSURfSEFORExFOwotCi0gIHRCVEFfQVZfRU5BQkxFIGVuYWJsZTsKLSAgZW5hYmxlLmZlYXR1cmVzID0gYnRhX2F2X2NiLmZlYXR1cmVzOwotCi0gIC8qIFJlZ2lzdGVyIGZvciBTQ08gY2hhbmdlIGV2ZW50ICovCi0gIGJ0YV9zeXNfc2NvX3JlZ2lzdGVyKGJ0YV9hdl9zY29fY2hnX2NiYWNrKTsKLQotICAvKiBjYWxsIGNhbGxiYWNrIHdpdGggZW5hYmxlIGV2ZW50ICovCi0gIHRCVEFfQVYgYnRhX2F2X2RhdGE7Ci0gIGJ0YV9hdl9kYXRhLmVuYWJsZSA9IGVuYWJsZTsKLSAgKCpidGFfYXZfY2IucF9jYmFjaykoQlRBX0FWX0VOQUJMRV9FVlQsICZidGFfYXZfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfYWRkcl90b19zY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgdGhlIHN0cmVhbSBjb250cm9sIGJsb2NrIGJ5IHRoZSBwZWVyIGFkZHIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9BVl9TQ0IqIGJ0YV9hdl9hZGRyX3RvX3NjYihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYiA9IE5VTEw7Ci0gIGludCB4eDsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBCVEFfQVZfTlVNX1NUUlM7IHh4KyspIHsKLSAgICBpZiAoYnRhX2F2X2NiLnBfc2NiW3h4XSkgewotICAgICAgaWYgKGJkX2FkZHIgPT0gYnRhX2F2X2NiLnBfc2NiW3h4XS0+UGVlckFkZHJlc3MoKSkgewotICAgICAgICBwX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYlt4eF07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcF9zY2I7Ci19Ci0KLWludCBCVEFfQXZPYnRhaW5QZWVyQ2hhbm5lbEluZGV4KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICAvLyBGaW5kIHRoZSBlbnRyeSBmb3IgdGhlIHBlZXIgKGlmIGV4aXN0cykKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gYnRhX2F2X2FkZHJfdG9fc2NiKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwX3NjYiAhPSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIHBfc2NiLT5oZGk7Ci0gIH0KLQotICAvLyBGaW5kIHRoZSBpbmRleCBmb3IgYW4gZW50cnkgdGhhdCBpcyBub3QgdXNlZAotICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgQlRBX0FWX05VTV9TVFJTOyBpbmRleCsrKSB7Ci0gICAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gYnRhX2F2X2NiLnBfc2NiW2luZGV4XTsKLSAgICBpZiAocF9zY2IgPT0gbnVsbHB0cikgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChwX3NjYi0+UGVlckFkZHJlc3MoKS5Jc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwX3NjYi0+aGRpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9obmRsX3RvX3NjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZmluZCB0aGUgc3RyZWFtIGNvbnRyb2wgYmxvY2sgYnkgdGhlIGhhbmRsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0FWX1NDQiogYnRhX2F2X2huZGxfdG9fc2NiKHVpbnQxNl90IGhhbmRsZSkgewotICB0QlRBX0FWX0hOREwgaG5kbCA9ICh0QlRBX0FWX0hOREwpaGFuZGxlOwotICB0QlRBX0FWX1NDQiogcF9zY2IgPSBOVUxMOwotICB1aW50OF90IGlkeCA9IChobmRsICYgQlRBX0FWX0hORExfTVNLKTsKLQotICBpZiAoaWR4ICYmIChpZHggPD0gQlRBX0FWX05VTV9TVFJTKSkgewotICAgIHBfc2NiID0gYnRhX2F2X2NiLnBfc2NiW2lkeCAtIDFdOwotICB9Ci0gIHJldHVybiBwX3NjYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9hbGxvY19zY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFsbG9jYXRlIHN0cmVhbSBjb250cm9sIGJsb2NrLAotICogICAgICAgICAgICAgICAgICByZWdpc3RlciB0aGUgc2VydmljZSB0byBzdGFjawotICogICAgICAgICAgICAgICAgICBjcmVhdGUgU0RQIHJlY29yZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUQV9BVl9TQ0IqIGJ0YV9hdl9hbGxvY19zY2IodEJUQV9BVl9DSE5MIGNobmwpIHsKLSAgaWYgKGNobmwgIT0gQlRBX0FWX0NITkxfQVVESU8pIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogYmFkIGNoYW5uZWw6ICVkIiwgX19mdW5jX18sIGNobmwpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgZm9yIChpbnQgeHggPSAwOyB4eCA8IEJUQV9BVl9OVU1fU1RSUzsgeHgrKykgewotICAgIGlmIChidGFfYXZfY2IucF9zY2JbeHhdICE9IG51bGxwdHIpIGNvbnRpbnVlOwotICAgIC8vIEZvdW5kIGFuIGVtcHR5IHNwb3QKLSAgICAvLyBUT0RPOiBBZnRlciB0QlRBX0FWX1NDQiBpcyBjaGFuZ2VkIHRvIGEgcHJvcGVyIGNsYXNzLCB0aGUgZW50cnkKLSAgICAvLyBoZXJlIHNob3VsZCBiZSBhbGxvY2F0ZWQgYnkgQysrICduZXcnIHN0YXRlbWVudC4KLSAgICB0QlRBX0FWX1NDQiogcF9yZXQgPSAodEJUQV9BVl9TQ0IqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfQVZfU0NCKSk7Ci0gICAgcF9yZXQtPnJjX2hhbmRsZSA9IEJUQV9BVl9SQ19IQU5ETEVfTk9ORTsKLSAgICBwX3JldC0+Y2hubCA9IGNobmw7Ci0gICAgcF9yZXQtPmhuZGwgPSAodEJUQV9BVl9ITkRMKSgoeHggKyAxKSB8IGNobmwpOwotICAgIHBfcmV0LT5oZGkgPSB4eDsKLSAgICBwX3JldC0+YTJkcF9saXN0ID0gbGlzdF9uZXcobnVsbHB0cik7Ci0gICAgcF9yZXQtPmF2cmNfY3RfdGltZXIgPSBhbGFybV9uZXcoImJ0YV9hdi5hdnJjX2N0X3RpbWVyIik7Ci0gICAgYnRhX2F2X2NiLnBfc2NiW3h4XSA9IHBfcmV0OwotICAgIHJldHVybiBwX3JldDsKLSAgfQotCi0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIGJ0YV9hdl9mcmVlX3NjYih0QlRBX0FWX1NDQiogcF9zY2IpIHsKLSAgaWYgKHBfc2NiID09IG51bGxwdHIpIHJldHVybjsKLSAgdWludDhfdCBzY2JfaW5kZXggPSBwX3NjYi0+aGRpOwotICBDSEVDSyhzY2JfaW5kZXggPCBCVEFfQVZfTlVNX1NUUlMpOwotCi0gIENIRUNLKHBfc2NiID09IGJ0YV9hdl9jYi5wX3NjYltzY2JfaW5kZXhdKTsKLSAgYnRhX2F2X2NiLnBfc2NiW3NjYl9pbmRleF0gPSBudWxscHRyOwotICBhbGFybV9mcmVlKHBfc2NiLT5hdnJjX2N0X3RpbWVyKTsKLSAgLy8gVE9ETzogQWZ0ZXIgdEJUQV9BVl9TQ0IgaXMgY2hhbmdlZCB0byBhIHByb3BlciBjbGFzcywgdGhlIGVudHJ5Ci0gIC8vIGhlcmUgc2hvdWxkIGJlIGRlLWFsbG9jYXRlZCBieSBDKysgJ2RlbGV0ZScgc3RhdGVtZW50LgotICBvc2lfZnJlZShwX3NjYik7Ci19Ci0KLXZvaWQgdEJUQV9BVl9TQ0I6Ok9uQ29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBwZWVyX2FkZHJlc3NfID0gcGVlcl9hZGRyZXNzOwotCi0gIGlmIChwZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogSW52YWxpZCBwZWVyIGFkZHJlc3M6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFJlYWQgYW5kIHJlc3RvcmUgdGhlIEFWRFRQIHZlcnNpb24gZnJvbSBsb2NhbCBzdG9yYWdlCi0gIHVpbnQxNl90IGF2ZHRwX3ZlcnNpb24gPSAwOwotICBzaXplX3QgdmVyc2lvbl92YWx1ZV9zaXplID0gc2l6ZW9mKGF2ZHRwX3ZlcnNpb24pOwotICBpZiAoIWJ0aWZfY29uZmlnX2dldF9iaW4ocGVlcl9hZGRyZXNzXy5Ub1N0cmluZygpLCBBVkRUUF9WRVJTSU9OX0NPTkZJR19LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopJmF2ZHRwX3ZlcnNpb24sICZ2ZXJzaW9uX3ZhbHVlX3NpemUpKSB7Ci0gICAgTE9HX1dBUk4oIiVzOiBGYWlsZWQgdG8gcmVhZCBjYWNoZWQgcGVlciBBVkRUUCB2ZXJzaW9uIGZvciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgIHBlZXJfYWRkcmVzc18uVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRBdmR0cFZlcnNpb24oYXZkdHBfdmVyc2lvbik7Ci0gIH0KLX0KLQotdm9pZCB0QlRBX0FWX1NDQjo6T25EaXNjb25uZWN0ZWQoKSB7Ci0gIHBlZXJfYWRkcmVzc18gPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIFNldEF2ZHRwVmVyc2lvbigwKTsKLX0KLQotdm9pZCB0QlRBX0FWX1NDQjo6U2V0QXZkdHBWZXJzaW9uKHVpbnQxNl90IGF2ZHRwX3ZlcnNpb24pIHsKLSAgYXZkdHBfdmVyc2lvbl8gPSBhdmR0cF92ZXJzaW9uOwotICBMT0dfSU5GTygiJXM6IEFWRFRQIHZlcnNpb24gZm9yICVzIHNldCB0byAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgIHBlZXJfYWRkcmVzc18uVG9TdHJpbmcoKS5jX3N0cigpLCBhdmR0cF92ZXJzaW9uXyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfY29ubl9jYmFjayhVTlVTRURfQVRUUiB1aW50OF90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBldmVudCwgdEFWRFRfQ1RSTCogcF9kYXRhLCB1aW50OF90IHNjYl9pbmRleCkgewotICB1aW50MTZfdCBldnQgPSAwOwotICB0QlRBX0FWX1NDQiogcF9zY2IgPSBOVUxMOwotCi0gIGlmIChldmVudCA9PSBCVEFfQVJfQVZEVF9DT05OX0VWVCB8fCBldmVudCA9PSBBVkRUX0NPTk5FQ1RfSU5EX0VWVCB8fAotICAgICAgZXZlbnQgPT0gQVZEVF9ESVNDT05ORUNUX0lORF9FVlQpCi0gIHsKLSAgICBldnQgPSBCVEFfQVZfU0lHX0NIR19FVlQ7Ci0gICAgaWYgKGV2ZW50ID09IEFWRFRfRElTQ09OTkVDVF9JTkRfRVZUKSB7Ci0gICAgICBwX3NjYiA9IGJ0YV9hdl9hZGRyX3RvX3NjYihiZF9hZGRyKTsKLSAgICAgIGlmIChwX3NjYikgewotICAgICAgICB1aW50MTZfdCBoYW5kbGUgPQotICAgICAgICAgICAgQlRNX0dldEhDSUNvbm5IYW5kbGUocF9zY2ItPlBlZXJBZGRyZXNzKCksIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgICAgICBpZiAoYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRlZF9hY2xfaGRsID09IGhhbmRsZSB8fAotICAgICAgICAgICAgYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRfcGVuZGluZ19hY2xfaGRsID09IGhhbmRsZSkgewotICAgICAgICAgIExPR19JTkZPKCIlczogQ2xlYW51cCBvZmZsb2FkIHJlbGF0ZWQgZmxhZyIsIF9fZnVuY19fKTsKLSAgICAgICAgICBidGFfYXZfY2Iub2ZmbG9hZF9zdGFydGVkX2FjbF9oZGwgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgICAgYnRhX2F2X2NiLm9mZmxvYWRfc3RhcnRfcGVuZGluZ19hY2xfaGRsID0gSENJX0lOVkFMSURfSEFORExFOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChldmVudCA9PSBBVkRUX0NPTk5FQ1RfSU5EX0VWVCkgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IENPTk5fSU5EIGlzIEFDUDolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5lcnJfcGFyYW0pOwotICAgIH0KLQotICAgIHRCVEFfQVZfU1RSX01TRyogcF9tc2cgPQotICAgICAgICAodEJUQV9BVl9TVFJfTVNHKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX1NUUl9NU0cpKTsKLSAgICBwX21zZy0+aGRyLmV2ZW50ID0gZXZ0OwotICAgIHBfbXNnLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBldmVudDsKLSAgICBwX21zZy0+aGRyLm9mZnNldCA9IHBfZGF0YS0+aGRyLmVycl9wYXJhbTsKLSAgICBwX21zZy0+YmRfYWRkciA9IGJkX2FkZHI7Ci0gICAgcF9tc2ctPnNjYl9pbmRleCA9IHNjYl9pbmRleDsKLSAgICBpZiAocF9zY2IpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBidGFfaGFuZGxlIHgleCwgcm9sZSB4JXgiLCBfX2Z1bmNfXywgcF9zY2ItPmhuZGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5yb2xlKTsKLSAgICB9Ci0gICAgTE9HX0lORk8oIiVzOiBjb25uX2NiYWNrIGJkX2FkZHI6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9hMmRwX3JlcG9ydF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQTJEUCByZXBvcnQgY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9hMmRwX3JlcG9ydF9jYmFjayhVTlVTRURfQVRUUiB1aW50OF90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBBVkRUX1JFUE9SVF9UWVBFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEFWRFRfUkVQT1JUX0RBVEEqIHBfZGF0YSkgewotICAvKiBEbyBub3QgbmVlZCB0byBoYW5kbGUgcmVwb3J0IGRhdGEgZm9yIG5vdy4KLSAgICogVGhpcyBlbXB0eSBmdW5jdGlvbiBpcyBoZXJlIGZvciBjb25mb3JtYW5jZSByZWFzb25zLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2FwaV9yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgYWxsb2NhdGUgc3RyZWFtIGNvbnRyb2wgYmxvY2ssCi0gKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHRoZSBzZXJ2aWNlIHRvIHN0YWNrCi0gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZSBTRFAgcmVjb3JkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9hcGlfcmVnaXN0ZXIodEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9SRUdJU1RFUiByZWdpc3RyOwotICB0QlRBX0FWX1NDQiogcF9zY2I7IC8qIHN0cmVhbSBjb250cm9sIGJsb2NrICovCi0gIEF2ZHRwUmNiIHJlZzsKLSAgQXZkdHBTdHJlYW1Db25maWcgYXZkdHBfc3RyZWFtX2NvbmZpZzsKLSAgY2hhciogcF9zZXJ2aWNlX25hbWU7Ci0gIHRCVEFfVVRMX0NPRCBjb2Q7Ci0KLSAgaWYgKGJ0YV9hdl9jYi5kaXNhYmxpbmcgfHwgKGJ0YV9hdl9jYi5mZWF0dXJlcyA9PSAwKSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIiVzOiBBViBpbnN0YW5jZSAoZmVhdHVyZXM9JSN4LCByZWdfYXVkaW89JSN4KSBpcyBub3QgIgotICAgICAgICAicmVhZHkgZm9yIGFwcF9pZCAlZCIsCi0gICAgICAgIF9fZnVuY19fLCBidGFfYXZfY2IuZmVhdHVyZXMsIGJ0YV9hdl9jYi5yZWdfYXVkaW8sCi0gICAgICAgIHBfZGF0YS0+YXBpX3JlZy5hcHBfaWQpOwotICAgIHRCVEFfQVZfQVBJX1JFRyogcF9idWYgPQotICAgICAgICAodEJUQV9BVl9BUElfUkVHKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX0FQSV9SRUcpKTsKLSAgICBtZW1jcHkocF9idWYsICZwX2RhdGEtPmFwaV9yZWcsIHNpemVvZih0QlRBX0FWX0FQSV9SRUcpKTsKLSAgICBidGFfc3lzX3NlbmRtc2dfZGVsYXllZCgKLSAgICAgICAgcF9idWYsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhrRW5hYmxpbmdBdHRlbXB0c0ludGVydmFsTXMpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdmR0cF9zdHJlYW1fY29uZmlnLlJlc2V0KCk7Ci0KLSAgcmVnaXN0ci5zdGF0dXMgPSBCVEFfQVZfRkFJTF9SRVNPVVJDRVM7Ci0gIHJlZ2lzdHIuYXBwX2lkID0gcF9kYXRhLT5hcGlfcmVnLmFwcF9pZDsKLSAgcmVnaXN0ci5jaG5sID0gKHRCVEFfQVZfQ0hOTClwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYzsKLQotICBjaGFyIGF2cmNwX3ZlcnNpb25bUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgb3NpX3Byb3BlcnR5X2dldChBVlJDUF9WRVJTSU9OX1BST1BFUlRZLCBhdnJjcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgIEFWUkNQX0RFRkFVTFRfVkVSU0lPTik7Ci0gIExPR19JTkZPKCIlczogQVZSQ1AgdmVyc2lvbiB1c2VkIGZvciBzZHA6IFwiJXNcIiIsIF9fZnVuY19fLCBhdnJjcF92ZXJzaW9uKTsKLQotICB1aW50MTZfdCBwcm9maWxlX2luaXRpYWxpemVkID0gcF9kYXRhLT5hcGlfcmVnLnNlcnZpY2VfdXVpZDsKLSAgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSykgewotICAgIHBfYnRhX2F2X2NmZyA9ICZidGFfYXZrX2NmZzsKLSAgfSBlbHNlIGlmIChwcm9maWxlX2luaXRpYWxpemVkID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSkgewotICAgIHBfYnRhX2F2X2NmZyA9ICZidGFfYXZfY2ZnOwotCi0gICAgaWYgKCFzdHJuY21wKEFWUkNQXzFfM19TVFJJTkcsIGF2cmNwX3ZlcnNpb24sIHNpemVvZihBVlJDUF8xXzNfU1RSSU5HKSkpIHsKLSAgICAgIExPR19JTkZPKCIlczogQVZSQ1AgMS4zIGNhcGFiaWxpdGVzIHVzZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICBwX2J0YV9hdl9jZmcgPSAmYnRhX2F2X2NmZ19jb21wYXRpYmlsaXR5OwotICAgIH0KLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwcm9maWxlOiAweCV4IiwgX19mdW5jX18sIHByb2ZpbGVfaW5pdGlhbGl6ZWQpOwotICBpZiAocF9idGFfYXZfY2ZnID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQVYgY29uZmlndXJhdGlvbiBpcyBudWxsISIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkbyB7Ci0gICAgcF9zY2IgPSBidGFfYXZfYWxsb2Nfc2NiKHJlZ2lzdHIuY2hubCk7Ci0gICAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBmYWlsZWQgdG8gYWxsb2MgU0NCIiwgX19mdW5jX18pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmVnaXN0ci5obmRsID0gcF9zY2ItPmhuZGw7Ci0gICAgcF9zY2ItPmFwcF9pZCA9IHJlZ2lzdHIuYXBwX2lkOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgc3RyZWFtIGNvbnRyb2wgYmxvY2sgKi8KLSAgICByZWdpc3RyLnN0YXR1cyA9IEJUQV9BVl9TVUNDRVNTOwotCi0gICAgaWYgKGJ0YV9hdl9jYi5yZWdfYXVkaW8gPT0gMCkgewotICAgICAgLyogdGhlIGZpcnN0IGNoYW5uZWwgcmVnaXN0ZXJlZC4gcmVnaXN0ZXIgdG8gQVZEVFAgKi8KLSAgICAgIHJlZy5jdHJsX210dSA9IDY3MjsKLSAgICAgIHJlZy5yZXRfdG91dCA9IEJUQV9BVl9SRVRfVE9VVDsKLSAgICAgIHJlZy5zaWdfdG91dCA9IEJUQV9BVl9TSUdfVE9VVDsKLSAgICAgIHJlZy5pZGxlX3RvdXQgPSBCVEFfQVZfSURMRV9UT1VUOwotICAgICAgcmVnLnNjYl9pbmRleCA9IHBfc2NiLT5oZGk7Ci0gICAgICBidGFfYXJfcmVnX2F2ZHQoJnJlZywgYnRhX2F2X2Nvbm5fY2JhY2spOwotICAgICAgYnRhX3N5c19yb2xlX2NoZ19yZWdpc3RlcigmYnRhX2F2X3N5c19yc19jYmFjayk7Ci0KLSAgICAgIC8qIGNyZWF0ZSByZW1vdGUgY29udHJvbCBURyBzZXJ2aWNlIGlmIHJlcXVpcmVkICovCi0gICAgICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgKEJUQV9BVl9GRUFUX1JDVEcpKSB7Ci0gICAgICAgIC8qIHJlZ2lzdGVyIHdpdGggbm8gYXV0aG9yaXphdGlvbjsgbGV0IEFWRFRQIHVzZSBhdXRob3JpemF0aW9uIGluc3RlYWQKLSAgICAgICAgICovCi0gICAgICAgIGJ0YV9hcl9yZWdfYXZjdCgpOwotCi0gICAgICAgIC8qIEZvciB0aGUgQXVkaW8gU2luayByb2xlIHdlIHN1cHBvcnQgYWRkaXRpb25hbCBURyB0byBzdXBwb3J0Ci0gICAgICAgICAqIGFic29sdXRlIHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChpc19uZXdfYXZyY3BfZW5hYmxlZCgpKSB7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG5ld2F2cmNwIGlzIHRoZSBvd25lciBvZiB0aGUgQVZSQ1AgVGFyZ2V0IFNEUCAiCi0gICAgICAgICAgICAgICJyZWNvcmQuIERvbid0IGNyZWF0ZSB0aGUgU0RQIHJlY29yZCIsIF9fZnVuY19fKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbmV3YXZyY3AgaXMgbm90IGVuYWJsZWQuIENyZWF0ZSBTRFAgcmVjb3JkIiwKLSAgICAgICAgICAgICAgX19mdW5jX18pOwotCi0gICAgICAgICAgdWludDE2X3QgcHJvZmlsZV92ZXJzaW9uID0gQVZSQ19SRVZfMV8wOwotICAgICAgICAgIGlmICghc3RybmNtcChBVlJDUF8xXzZfU1RSSU5HLCBhdnJjcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBVlJDUF8xXzZfU1RSSU5HKSkpIHsKLSAgICAgICAgICAgIHByb2ZpbGVfdmVyc2lvbiA9IEFWUkNfUkVWXzFfNjsKLSAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKEFWUkNQXzFfNV9TVFJJTkcsIGF2cmNwX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVZSQ1BfMV81X1NUUklORykpKSB7Ci0gICAgICAgICAgICBwcm9maWxlX3ZlcnNpb24gPSBBVlJDX1JFVl8xXzU7Ci0gICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChBVlJDUF8xXzNfU1RSSU5HLCBhdnJjcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFWUkNQXzFfM19TVFJJTkcpKSkgewotICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uID0gQVZSQ19SRVZfMV8zOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9maWxlX3ZlcnNpb24gPSBBVlJDX1JFVl8xXzQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnRhX2FyX3JlZ19hdnJjKAotICAgICAgICAgICAgICBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsICJBViBSZW1vdGUgQ29udHJvbCBUYXJnZXQiLCBOVUxMLAotICAgICAgICAgICAgICBwX2J0YV9hdl9jZmctPmF2cmNfdGdfY2F0LAotICAgICAgICAgICAgICAoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQlJPV1NFKSwgcHJvZmlsZV92ZXJzaW9uKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBTZXQgdGhlIENhcHR1cmluZyBzZXJ2aWNlIGNsYXNzIGJpdCAqLwotICAgICAgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKQotICAgICAgICBjb2Quc2VydmljZSA9IEJUTV9DT0RfU0VSVklDRV9DQVBUVVJJTkc7Ci0gICAgICBlbHNlIGlmIChwcm9maWxlX2luaXRpYWxpemVkID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspCi0gICAgICAgIGNvZC5zZXJ2aWNlID0gQlRNX0NPRF9TRVJWSUNFX1JFTkRFUklORzsKLSAgICAgIHV0bF9zZXRfZGV2aWNlX2NsYXNzKCZjb2QsIEJUQV9VVExfU0VUX0NPRF9TRVJWSUNFX0NMQVNTKTsKLSAgICB9IC8qIGlmIDFzdCBjaGFubmVsICovCi0KLSAgICAvKiBnZXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gYW5kIGNyZWF0ZSBzdHJlYW0gKi8KLSAgICBhdmR0cF9zdHJlYW1fY29uZmlnLmNmZy5udW1fY29kZWMgPSAxOwotICAgIGF2ZHRwX3N0cmVhbV9jb25maWcubnNjX21hc2sgPSBBdmR0cFN0cmVhbUNvbmZpZzo6QVZEVF9OU0NfUkVDT05GSUc7Ci0gICAgaWYgKCEoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUFJPVEVDVCkpIHsKLSAgICAgIGF2ZHRwX3N0cmVhbV9jb25maWcubnNjX21hc2sgfD0gQXZkdHBTdHJlYW1Db25maWc6OkFWRFRfTlNDX1NFQ1VSSVRZOwotICAgIH0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbnNjX21hc2s6IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGF2ZHRwX3N0cmVhbV9jb25maWcubnNjX21hc2spOwotCi0gICAgaWYgKHBfZGF0YS0+YXBpX3JlZy5wX3NlcnZpY2VfbmFtZVswXSA9PSAwKSB7Ci0gICAgICBwX3NlcnZpY2VfbmFtZSA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfc2VydmljZV9uYW1lID0gcF9kYXRhLT5hcGlfcmVnLnBfc2VydmljZV9uYW1lOwotICAgIH0KLQotICAgIHBfc2NiLT5zdXNwZW5kX3N1cCA9IHRydWU7Ci0gICAgcF9zY2ItPnJlY2ZnX3N1cCA9IHRydWU7Ci0KLSAgICBhdmR0cF9zdHJlYW1fY29uZmlnLnNjYl9pbmRleCA9IHBfc2NiLT5oZGk7Ci0gICAgYXZkdHBfc3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjayA9ICZidGFfYXZfcHJvY19zdHJlYW1fZXZ0OwotCi0gICAgLyogc2V0IHVwIHRoZSBhdWRpbyBzdHJlYW0gY29udHJvbCBibG9jayAqLwotICAgIHBfc2NiLT5wX2NvcyA9ICZidGFfYXZfYTJkcF9jb3M7Ci0gICAgcF9zY2ItPm1lZGlhX3R5cGUgPSBBVkRUX01FRElBX1RZUEVfQVVESU87Ci0gICAgYXZkdHBfc3RyZWFtX2NvbmZpZy5jZmcucHNjX21hc2sgPSBBVkRUX1BTQ19UUkFOUzsKLSAgICBhdmR0cF9zdHJlYW1fY29uZmlnLm1lZGlhX3R5cGUgPSBBVkRUX01FRElBX1RZUEVfQVVESU87Ci0gICAgYXZkdHBfc3RyZWFtX2NvbmZpZy5tdHUgPSBNQVhfM01CUFNfQVZEVFBfTVRVOwotICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4X21pbiA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUlOOwotICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4X21heCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUFYOwotCi0gICAgaWYgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JFUE9SVCkgewotICAgICAgYXZkdHBfc3RyZWFtX2NvbmZpZy5jZmcucHNjX21hc2sgfD0gQVZEVF9QU0NfUkVQT1JUOwotICAgICAgYXZkdHBfc3RyZWFtX2NvbmZpZy5wX3JlcG9ydF9jYmFjayA9IGJ0YV9hdl9hMmRwX3JlcG9ydF9jYmFjazsKLSAgICB9Ci0gICAgaWYgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0RFTEFZX1JQVCkKLSAgICAgIGF2ZHRwX3N0cmVhbV9jb25maWcuY2ZnLnBzY19tYXNrIHw9IEFWRFRfUFNDX0RFTEFZX1JQVDsKLQotICAgIGlmIChwcm9maWxlX2luaXRpYWxpemVkID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSkgewotICAgICAgYXZkdHBfc3RyZWFtX2NvbmZpZy50c2VwID0gQVZEVF9UU0VQX1NSQzsKLSAgICAgIGNvZGVjX2luZGV4X21pbiA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUlOOwotICAgICAgY29kZWNfaW5kZXhfbWF4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9NQVg7Ci0gICAgfSBlbHNlIGlmIChwcm9maWxlX2luaXRpYWxpemVkID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspIHsKLSAgICAgIGF2ZHRwX3N0cmVhbV9jb25maWcudHNlcCA9IEFWRFRfVFNFUF9TTks7Ci0gICAgICBhdmR0cF9zdHJlYW1fY29uZmlnLnBfc2lua19kYXRhX2NiYWNrID0gYnRhX2F2X3NpbmtfZGF0YV9jYmFjazsKLSAgICAgIGNvZGVjX2luZGV4X21pbiA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX01JTjsKLSAgICAgIGNvZGVjX2luZGV4X21heCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX01BWDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGhhbmRsZXMgdG8gemVybyAqLwotICAgIGZvciAoaW50IHh4ID0gMDsgeHggPCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOyB4eCsrKSB7Ci0gICAgICBwX3NjYi0+c2Vwc1t4eF0uYXZfaGFuZGxlID0gMDsKLSAgICB9Ci0KLSAgICAvKiBrZWVwIHRoZSBjb25maWd1cmF0aW9uIGluIHRoZSBzdHJlYW0gY29udHJvbCBibG9jayAqLwotICAgIHBfc2NiLT5jZmcgPSBhdmR0cF9zdHJlYW1fY29uZmlnLmNmZzsKLSAgICBmb3IgKGludCBpID0gY29kZWNfaW5kZXhfbWluOyBpIDwgY29kZWNfaW5kZXhfbWF4OyBpKyspIHsKLSAgICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4ID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfaW5kZXhfdD4oaSk7Ci0gICAgICBpZiAoIWJ0YV9hdl9jb19pc19zdXBwb3J0ZWRfY29kZWMoY29kZWNfaW5kZXgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKCEoKmJ0YV9hdl9hMmRwX2Nvcy5pbml0KShjb2RlY19pbmRleCwgJmF2ZHRwX3N0cmVhbV9jb25maWcuY2ZnKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChBVkRUX0NyZWF0ZVN0cmVhbShwX3NjYi0+YXBwX2lkLCAmcF9zY2ItPnNlcHNbY29kZWNfaW5kZXhdLmF2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0cF9zdHJlYW1fY29uZmlnKSAhPSBBVkRUX1NVQ0NFU1MpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgIiVzOiBidGFfaGFuZGxlPTB4JXggKGFwcF9pZCAlZCkgZmFpbGVkIHRvIGFsbG9jIGFuIFNFUCBpbmRleDolZCIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgcF9zY2ItPmhuZGwsIHBfc2NiLT5hcHBfaWQsIGNvZGVjX2luZGV4KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvKiBTYXZlIGEgY29weSBvZiB0aGUgY29kZWMgKi8KLSAgICAgIG1lbWNweShwX3NjYi0+c2Vwc1tjb2RlY19pbmRleF0uY29kZWNfaW5mbywKLSAgICAgICAgICAgICBhdmR0cF9zdHJlYW1fY29uZmlnLmNmZy5jb2RlY19pbmZvLCBBVkRUX0NPREVDX1NJWkUpOwotICAgICAgcF9zY2ItPnNlcHNbY29kZWNfaW5kZXhdLnRzZXAgPSBhdmR0cF9zdHJlYW1fY29uZmlnLnRzZXA7Ci0gICAgICBpZiAoYXZkdHBfc3RyZWFtX2NvbmZpZy50c2VwID09IEFWRFRfVFNFUF9TTkspIHsKLSAgICAgICAgcF9zY2ItPnNlcHNbY29kZWNfaW5kZXhdLnBfYXBwX3NpbmtfZGF0YV9jYmFjayA9Ci0gICAgICAgICAgICBwX2RhdGEtPmFwaV9yZWcucF9hcHBfc2lua19kYXRhX2NiYWNrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogSW4gY2FzZSBvZiBBMkRQIFNPVVJDRSB3ZSBkb24ndCBuZWVkIGEgY2FsbGJhY2sgdG8KLSAgICAgICAgICogaGFuZGxlIG1lZGlhIHBhY2tldHMuCi0gICAgICAgICAqLwotICAgICAgICBwX3NjYi0+c2Vwc1tjb2RlY19pbmRleF0ucF9hcHBfc2lua19kYXRhX2NiYWNrID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWJ0YV9hdl9jYi5yZWdfYXVkaW8pIHsKLSAgICAgIGJ0YV9hdl9jYi5zZHBfYTJkcF9oYW5kbGUgPSAwOwotICAgICAgYnRhX2F2X2NiLnNkcF9hMmRwX3Nua19oYW5kbGUgPSAwOwotICAgICAgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKSB7Ci0gICAgICAgIC8qIGNyZWF0ZSB0aGUgU0RQIHJlY29yZHMgb24gdGhlIDFzdCBhdWRpbyBjaGFubmVsICovCi0gICAgICAgIGJ0YV9hdl9jYi5zZHBfYTJkcF9oYW5kbGUgPSBTRFBfQ3JlYXRlUmVjb3JkKCk7Ci0gICAgICAgIEEyRFBfQWRkUmVjb3JkKFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSwgcF9zZXJ2aWNlX25hbWUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgIEEyRFBfU1VQRl9QTEFZRVIsIGJ0YV9hdl9jYi5zZHBfYTJkcF9oYW5kbGUpOwotICAgICAgICBidGFfc3lzX2FkZF91dWlkKFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSk7Ci0gICAgICB9IGVsc2UgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSykgewotICAgICAgICBidGFfYXZfY2Iuc2RwX2EyZHBfc25rX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgICAgICAgQTJEUF9BZGRSZWNvcmQoVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSywgcF9zZXJ2aWNlX25hbWUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgIEEyRFBfU1VQRl9QTEFZRVIsIGJ0YV9hdl9jYi5zZHBfYTJkcF9zbmtfaGFuZGxlKTsKLSAgICAgICAgYnRhX3N5c19hZGRfdXVpZChVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKTsKLSAgICAgIH0KLSAgICAgIC8qIHN0YXJ0IGxpc3RlbmluZyB3aGVuIEEyRFAgaXMgcmVnaXN0ZXJlZCAqLwotICAgICAgaWYgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDVEcpCi0gICAgICAgIGJ0YV9hdl9yY19jcmVhdGUoJmJ0YV9hdl9jYiwgQVZDVF9BQ1AsIDAsIEJUQV9BVl9OVU1fTElOS1MgKyAxKTsKLQotICAgICAgLyogaWYgdGhlIEFWIGFuZCBBVksgYXJlIGJvdGggc3VwcG9ydGVkLCBpdCBjYW5ub3Qgc3VwcG9ydCB0aGUgQ1Qgcm9sZQotICAgICAgICovCi0gICAgICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgKEJUQV9BVl9GRUFUX1JDQ1QpKSB7Ci0gICAgICAgIC8qIGlmIFRHIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG5lZWQgdG8gcmVnaXN0ZXIgdG8gQVZDVCBub3cgKi8KLSAgICAgICAgaWYgKChidGFfYXZfY2IuZmVhdHVyZXMgJiAoQlRBX0FWX0ZFQVRfUkNURykpID09IDApIHsKLSAgICAgICAgICBidGFfYXJfcmVnX2F2Y3QoKTsKLSAgICAgICAgICBidGFfYXZfcmNfY3JlYXRlKCZidGFfYXZfY2IsIEFWQ1RfQUNQLCAwLCBCVEFfQVZfTlVNX0xJTktTICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogY3JlYXRlIGFuIFNEUCByZWNvcmQgYXMgQVZSQyBDVC4gV2UgY3JlYXRlIDEuMyBmb3IgU09VUkNFCi0gICAgICAgICAqIGJlY2F1c2Ugd2UgcmVseSBvbiBmZWF0dXJlIGJpdHMgYmVpbmcgc2Nhbm5lZCBieSBleHRlcm5hbAotICAgICAgICAgKiBkZXZpY2VzIG1vcmUgdGhhbiB0aGUgcHJvZmlsZSB2ZXJzaW9uIGl0c2VsZi4KLSAgICAgICAgICoKLSAgICAgICAgICogV2UgY3JlYXRlIDEuNCBmb3IgU0lOSyBzaW5jZSB3ZSBzdXBwb3J0IGJyb3dzaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHByb2ZpbGVfaW5pdGlhbGl6ZWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFICYmCi0gICAgICAgICAgICAhaXNfbmV3X2F2cmNwX2VuYWJsZWQoKSkgewotICAgICAgICAgIGJ0YV9hcl9yZWdfYXZyYyhVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idGFfYXZfY2ZnLT5hdnJjX2N0X2NhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0JST1dTRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfUkVWXzFfMyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZV9pbml0aWFsaXplZCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKSB7Ci0gICAgICAgICAgYnRhX2FyX3JlZ19hdnJjKFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J0YV9hdl9jZmctPmF2cmNfY3RfY2F0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQlJPV1NFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSQ19SRVZfMV82KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBidGFfYXZfY2IucmVnX2F1ZGlvIHw9IEJUQV9BVl9ITkRMX1RPX01TSyhwX3NjYi0+aGRpKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcmVnX2F1ZGlvOiAweCV4IiwgX19mdW5jX18sIGJ0YV9hdl9jYi5yZWdfYXVkaW8pOwotICB9IHdoaWxlICgwKTsKLQotICAvKiBjYWxsIGNhbGxiYWNrIHdpdGggcmVnaXN0ZXIgZXZlbnQgKi8KLSAgdEJUQV9BViBidGFfYXZfZGF0YTsKLSAgYnRhX2F2X2RhdGEucmVnaXN0ciA9IHJlZ2lzdHI7Ci0gICgqYnRhX2F2X2NiLnBfY2JhY2spKEJUQV9BVl9SRUdJU1RFUl9FVlQsICZidGFfYXZfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfYXBpX2RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRlLXJlZ2lzdGVyIGEgY2hhbm5lbAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfYXBpX2RlcmVnaXN0ZXIodEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9BVl9TQ0IqIHBfc2NiID0gYnRhX2F2X2huZGxfdG9fc2NiKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLQotICBpZiAocF9zY2IpIHsKLSAgICBwX3NjYi0+ZGVyZWdpc3RlcmluZyA9IHRydWU7Ci0gICAgYnRhX2F2X3NzbV9leGVjdXRlKHBfc2NiLCBCVEFfQVZfQVBJX0NMT1NFX0VWVCwgcF9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBidGFfYXZfZGVyZWdfY29tcChwX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY2lfZGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRm9yd2FyZCB0aGUgQlRBX0FWX0NJX1NSQ19EQVRBX1JFQURZX0VWVCB0byBzdHJlYW0gc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgbWFjaGluZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9jaV9kYXRhKHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYjsKLSAgaW50IGk7Ci0gIHVpbnQ4X3QgY2hubCA9ICh1aW50OF90KXBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgIHBfc2NiID0gYnRhX2F2X2NiLnBfc2NiW2ldOwotCi0gICAgaWYgKHBfc2NiICYmIHBfc2NiLT5jaG5sID09IGNobmwpIHsKLSAgICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FWX1NSQ19EQVRBX1JFQURZX0VWVCwgcF9kYXRhKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9ycGNfY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmVwb3J0IHJlcG9ydCBjaGFubmVsIG9wZW4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2F2X3JwY19jb25uKFVOVVNFRF9BVFRSIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7fQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2FwaV90b19zc20KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZvcndhcmQgdGhlIEFQSSByZXF1ZXN0IHRvIHN0cmVhbSBzdGF0ZSBtYWNoaW5lCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYXZfYXBpX3RvX3NzbSh0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB1aW50MTZfdCBldmVudCA9Ci0gICAgICBwX2RhdGEtPmhkci5ldmVudCAtIEJUQV9BVl9GSVJTVF9BMlNfQVBJX0VWVCArIEJUQV9BVl9GSVJTVF9BMlNfU1NNX0VWVDsKLSAgdEJUQV9BVl9ITkRMIGhhbmRsZSA9IHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljOwotICB0QlRBX0FWX1NDQiogcF9zY2IgPSBidGFfYXZfaG5kbF90b19zY2IoaGFuZGxlKTsKLQotICBpZiAocF9zY2IgIT0gbnVsbHB0cikgewotICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShwX3NjYiwgZXZlbnQsIHBfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jaGtfc3RhcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGlmIHRoaXMgaXMgYXVkaW8gY2hhbm5lbCwgY2hlY2sgaWYgbW9yZSB0aGFuIG9uZSBhdWRpbwotICogICAgICAgICAgICAgICAgICBjaGFubmVsIGlzIGNvbm5lY3RlZCAmIGFscmVhZHkgc3RhcnRlZC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBrZXB0IHZlcnkgc2ltaWxhciB0bwotICogICAgICAgICAgICAgICAgICBidGFfYXZfY2hrXzJuZF9zdGFydAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgbmVlZCBhcGlfc3RhcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYXZfY2hrX3N0YXJ0KHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBib29sIHN0YXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKChwX3NjYi0+Y2hubCA9PSBCVEFfQVZfQ0hOTF9BVURJTykgJiYgKGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCA+PSAyKSAmJgotICAgICAgKCgocF9zY2ItPnJvbGUgJiBCVEFfQVZfUk9MRV9BRF9BQ1ApID09IDApIHx8ICAvLyBPdXRnb2luZyBjb25uZWN0aW9uIG9yCi0gICAgICAgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0FDUF9TVEFSVCkpKSB7ICAvLyBBdXRvLXN0YXJ0aW5nIG9wdGlvbgotICAgIC8vIE1vcmUgdGhhbiBvbmUgYXVkaW8gY2hhbm5lbCBpcyBjb25uZWN0ZWQuCi0gICAgLy8gSWYgdGhpcyBpcyB0aGUgMm5kIHN0cmVhbSBhcyBBQ1AsIGdpdmUgSU5UIGEgY2hhbmNlIHRvIGlzc3VlIHRoZSBTVEFSVAotICAgIC8vIGNvbW1hbmQuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgICAgdEJUQV9BVl9TQ0IqIHBfc2NiaSA9IGJ0YV9hdl9jYi5wX3NjYltpXTsKLSAgICAgIGlmIChwX3NjYmkgJiYgcF9zY2JpLT5jaG5sID09IEJUQV9BVl9DSE5MX0FVRElPICYmIHBfc2NiaS0+Y29fc3RhcnRlZCkgewotICAgICAgICBzdGFydCA9IHRydWU7Ci0gICAgICAgIC8vIE1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgZmx1c2ggdGltZW91dCBvZiB0aGlzIGFscmVhZHkgc3RhcnRlZCBzdHJlYW0KLSAgICAgICAgaWYgKHBfc2NiaS0+Y29fc3RhcnRlZCAhPSBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQpIHsKLSAgICAgICAgICBwX3NjYmktPmNvX3N0YXJ0ZWQgPSBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBMT0dfSU5GTygKLSAgICAgICIlczogcGVlciAlcyBjaGFubmVsOiVkIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudDolZCByb2xlOjB4JXggIgotICAgICAgImZlYXR1cmVzOjB4JXggc3RhcnQ6JXMiLAotICAgICAgX19mdW5jX18sIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmNobmwsCi0gICAgICBidGFfYXZfY2IuYXVkaW9fb3Blbl9jbnQsIHBfc2NiLT5yb2xlLCBidGFfYXZfY2IuZmVhdHVyZXMsCi0gICAgICBsb2dib29sKHN0YXJ0KS5jX3N0cigpKTsKLSAgcmV0dXJuIHN0YXJ0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3Jlc3RvcmVfc3dpdGNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gYWxyZWFkeSBtYWtlcwotICogICAgICAgICAgICAgICAgICBzdXJlIHRoYXQgdGhlcmUncyBvbmx5IG9uZSBBQ0wgY29ubmVjdGlvbiBsZWZ0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3Jlc3RvcmVfc3dpdGNoKHZvaWQpIHsKLSAgdEJUQV9BVl9DQiogcF9jYiA9ICZidGFfYXZfY2I7Ci0gIGludCBpOwotICB1aW50OF90IG1hc2s7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJlZ19hdWRpbzogMHgleCIsIF9fZnVuY19fLCBidGFfYXZfY2IucmVnX2F1ZGlvKTsKLSAgZm9yIChpID0gMDsgaSA8IEJUQV9BVl9OVU1fU1RSUzsgaSsrKSB7Ci0gICAgbWFzayA9IEJUQV9BVl9ITkRMX1RPX01TSyhpKTsKLSAgICBpZiAocF9jYi0+Y29ubl9hdWRpbyA9PSBtYXNrKSB7Ci0gICAgICBpZiAocF9jYi0+cF9zY2JbaV0pIHsKLSAgICAgICAgQlRNX3VuYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKHBfY2ItPnBfc2NiW2ldLT5QZWVyQWRkcmVzcygpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N5c19yc19jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVjZWl2ZXMgdGhlIHJvbGUgY2hhbmdlIGV2ZW50IGZyb20gZG0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIChCVEFfU1lTX1JPTEVfQ0hBTkdFLCBuZXdfcm9sZSwgaGNpX3N0YXR1cywgcF9iZGEpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9zeXNfcnNfY2JhY2soVU5VU0VEX0FUVFIgdEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGludCBpOwotICB0QlRBX0FWX1NDQiogcF9zY2IgPSBOVUxMOwotICB0SENJX1JPTEUgY3VyX3JvbGU7Ci0gIHVpbnQ4X3QgcGVlcl9pZHggPSAwOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IHBlZXIgJXMgbmV3X3JvbGU6JWQgaGNpX3N0YXR1czoweCV4IGJ0YV9hdl9jYi5yc19pZHg6JWQiLCBfX2Z1bmNfXywKLSAgICAgIHBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGlkLCBhcHBfaWQsIGJ0YV9hdl9jYi5yc19pZHgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIFNDQnMgdG8gZmluZCBtYXRjaGluZyBwZWVyIGFkZHJlc3NlcyBhbmQgcmVwb3J0IHRoZQotICAgICAqIHJvbGUgY2hhbmdlIGV2ZW50ICovCi0gICAgLyogbm90ZSB0aGF0IG1vcmUgdGhhbiBvbmUgU0NCIChhMmRwICYgdmRwKSBtYXliZSB3YWl0aW5nIGZvciB0aGlzIGV2ZW50ICovCi0gICAgcF9zY2IgPSBidGFfYXZfY2IucF9zY2JbaV07Ci0gICAgaWYgKHBfc2NiICYmIHBfc2NiLT5QZWVyQWRkcmVzcygpID09IHBlZXJfYWRkcikgewotICAgICAgdEJUQV9BVl9ST0xFX1JFUyogcF9idWYgPQotICAgICAgICAgICh0QlRBX0FWX1JPTEVfUkVTKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0FWX1JPTEVfUkVTKSk7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgICAgICIlczogcGVlciAlcyBmb3VuZDogbmV3X3JvbGU6JWQsIGhjaV9zdGF0dXM6MHgleCBidGFfaGFuZGxlOjB4JXgiLAotICAgICAgICAgIF9fZnVuY19fLCBwZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBpZCwgYXBwX2lkLCBwX3NjYi0+aG5kbCk7Ci0gICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FWX1JPTEVfQ0hBTkdFX0VWVDsKLSAgICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBwX3NjYi0+aG5kbDsKLSAgICAgIHBfYnVmLT5uZXdfcm9sZSA9IGlkOwotICAgICAgcF9idWYtPmhjaV9zdGF0dXMgPSBhcHBfaWQ7Ci0gICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotCi0gICAgICBwZWVyX2lkeCA9IHBfc2NiLT5oZGkgKyAxOyAvKiBIYW5kbGUgaW5kZXggZm9yIHRoZSBwZWVyX2FkZHIgKi8KLSAgICB9Ci0gIH0KLQotICAvKiByZXN0b3JlIHJvbGUgc3dpdGNoIHBvbGljeSwgaWYgcm9sZSBzd2l0Y2ggZmFpbGVkICovCi0gIGlmICgoSENJX1NVQ0NFU1MgIT0gYXBwX2lkKSAmJgotICAgICAgKEJUTV9HZXRSb2xlKHBlZXJfYWRkciwgJmN1cl9yb2xlKSA9PSBCVE1fU1VDQ0VTUykgJiYKLSAgICAgIChjdXJfcm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKSkgewotICAgIEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2ZvcihwZWVyX2FkZHIpOwotICB9Ci0KLSAgLyogaWYgQlRBX0F2T3BlbigpIHdhcyBjYWxsZWQgZm9yIG90aGVyIGRldmljZSwgd2hpY2ggY2F1c2VkIHRoZSByb2xlIHN3aXRjaAotICAgKiBvZiB0aGUgcGVlcl9hZGRyLCAgKi8KLSAgLyogd2UgbmVlZCB0byBjb250aW51ZSBvcGVuaW5nIHByb2Nlc3MgZm9yIHRoZSBCVEFfQXZPcGVuKCkuICovCi0gIGlmICgoYnRhX2F2X2NiLnJzX2lkeCAhPSAwKSAmJiAoYnRhX2F2X2NiLnJzX2lkeCAhPSBwZWVyX2lkeCkpIHsKLSAgICBpZiAoKGJ0YV9hdl9jYi5yc19pZHggLSAxKSA8IEJUQV9BVl9OVU1fU1RSUykgewotICAgICAgcF9zY2IgPSBidGFfYXZfY2IucF9zY2JbYnRhX2F2X2NiLnJzX2lkeCAtIDFdOwotICAgIH0KLSAgICBpZiAocF9zY2IgJiYgcF9zY2ItPnFfdGFnID09IEJUQV9BVl9RX1RBR19PUEVOKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyByc19pZHg6JWQsIGJ0YV9oYW5kbGU6MHgleCBxX3RhZzolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9jYi5yc19pZHgsIHBfc2NiLT5obmRsLCBwX3NjYi0+cV90YWcpOwotCi0gICAgICBpZiAoSENJX1NVQ0NFU1MgPT0gYXBwX2lkIHx8IEhDSV9FUlJfTk9fQ09OTkVDVElPTiA9PSBhcHBfaWQpIHsKLSAgICAgICAgcF9zY2ItPnFfaW5mby5vcGVuLnN3aXRjaF9yZXMgPSBCVEFfQVZfUlNfT0s7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBwZWVyICVzIChwX3NjYiBwZWVyICVzKSByb2xlIHN3aXRjaCBmYWlsZWQ6IG5ld19yb2xlOiVkICIKLSAgICAgICAgICAgICJoY2lfc3RhdHVzOjB4JXgiLAotICAgICAgICAgICAgX19mdW5jX18sIHBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIGlkLCBhcHBfaWQpOwotICAgICAgICBwX3NjYi0+cV9pbmZvLm9wZW4uc3dpdGNoX3JlcyA9IEJUQV9BVl9SU19GQUlMOwotICAgICAgfQotCi0gICAgICAvKiBDb250aW51ZSBhdiBvcGVuIHByb2Nlc3MgKi8KLSAgICAgIGJ0YV9hdl9kb19kaXNjX2EyZHAocF9zY2IsICh0QlRBX0FWX0RBVEEqKSYocF9zY2ItPnFfaW5mby5vcGVuKSk7Ci0gICAgfQotCi0gICAgYnRhX2F2X2NiLnJzX2lkeCA9IDA7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zY29fY2hnX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICByZWNlaXZlICYgcHJvY2VzcyB0aGUgU0NPIGNvbm5lY3Rpb24gdXAvZG93biBldmVudCBmcm9tIHN5cy4KLSAqICAgICAgICAgICAgICAgICAgY2FsbCBzZXR1cCBhbHNvIHRyaWdnZXJzIHRoaXMgY2FsbGJhY2ssIHRvIHN1c3BlbmQgYXYgYmVmb3JlCi0gKiAgICAgICAgICAgICAgICAgIFNDTyBhY3Rpdml0eSBoYXBwZW5zLCBvciB0byByZXN1bWUgYXYgb25jZSBjYWxsIGVuZHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9hdl9zY29fY2hnX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIHRCVEFfQVZfU0NCKiBwX3NjYjsKLSAgaW50IGk7Ci0gIHRCVEFfQVZfQVBJX1NUT1Agc3RvcDsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3RhdHVzPSIgPDwgYnRhX3N5c19jb25uX3N0YXR1c190ZXh0KHN0YXR1cykKLSAgICAgICAgICAgIDw8ICIsIG51bV9saW5rcz0iIDw8ICtpZDsKLSAgaWYgKGlkKSB7Ci0gICAgYnRhX2F2X2NiLnNjb19vY2N1cGllZCA9IHRydWU7Ci0gICAgTE9HX0RFQlVHKCJTQ08gb2NjdXBpZWQgcGVlcjolcyBzdGF0dXM6JXMiLCBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyKSwKLSAgICAgICAgICAgICAgYnRhX3N5c19jb25uX3N0YXR1c190ZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0KLSAgICBpZiAoYnRhX2F2X2NiLmZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfTk9fU0NPX1NTUEQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBlaXRoZXIgQlRBX1NZU19TQ09fT1BFTiBvciBCVEFfU1lTX1NDT19DTE9TRSB3aXRoIHJlbWFpbmluZyBhY3RpdmUgU0NPICovCi0gICAgZm9yIChpID0gMDsgaSA8IEJUQV9BVl9OVU1fU1RSUzsgaSsrKSB7Ci0gICAgICBwX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYltpXTsKLQotICAgICAgaWYgKHBfc2NiICYmIHBfc2NiLT5jb19zdGFydGVkICYmICghcF9zY2ItPnNjb19zdXNwZW5kKSkgewotICAgICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHN1c3BlbmRpbmcgc2NiOiIgPDwgaTsKLSAgICAgICAgLyogc2NiIGlzIHVzZWQgYW5kIHN0YXJ0ZWQsIG5vdCBzdXNwZW5kZWQgYXV0b21hdGljYWxseSAqLwotICAgICAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPSB0cnVlOwotICAgICAgICBzdG9wLmZsdXNoID0gZmFsc2U7Ci0gICAgICAgIHN0b3Auc3VzcGVuZCA9IHRydWU7Ci0gICAgICAgIHN0b3AucmVjb25maWdfc3RvcCA9IGZhbHNlOwotICAgICAgICBidGFfYXZfc3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BVl9BUF9TVE9QX0VWVCwgKHRCVEFfQVZfREFUQSopJnN0b3ApOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBidGFfYXZfY2Iuc2NvX29jY3VwaWVkID0gZmFsc2U7Ci0gICAgTE9HX0RFQlVHKCJTQ08gdW5vY2N1cGllZCBwZWVyOiVzIHN0YXR1czolcyIsIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpLAotICAgICAgICAgICAgICBidGFfc3lzX2Nvbm5fc3RhdHVzX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLQotICAgIGlmIChidGFfYXZfY2IuZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9OT19TQ09fU1NQRCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgICAgcF9zY2IgPSBidGFfYXZfY2IucF9zY2JbaV07Ci0KLSAgICAgIGlmIChwX3NjYiAmJiBwX3NjYi0+c2NvX3N1c3BlbmQpIC8qIHNjYiBpcyB1c2VkIGFuZCBzdXNwZW5kZWQgZm9yIFNDTyAqLwotICAgICAgewotICAgICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXJ0aW5nIHNjYjoiIDw8IGk7Ci0gICAgICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FWX0FQX1NUQVJUX0VWVCwgTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc3dpdGNoX2lmX25lZWRlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlcmUgaXMgYW5vdGhlciBleGlzdGluZyBBVgotICogICAgICAgICAgICAgICAgICBjaGFubmVsIHRoYXQgaXMgbG9jYWwgYXMgcGVyaXBoZXJhbCByb2xlLgotICogICAgICAgICAgICAgICAgICBJZiBzbywgcm9sZSBzd2l0Y2ggYW5kIHJlbW92ZSBpdCBmcm9tIGxpbmsgcG9saWN5LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgcm9sZSBzd2l0Y2ggaXMgZG9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9hdl9zd2l0Y2hfaWZfbmVlZGVkKHRCVEFfQVZfU0NCKiBwX3NjYikgewotICAvLyBUT0RPOiBBIHdvcmthcm91bmQgZm9yIGRldmljZXMgdGhhdCBhcmUgY29ubmVjdGVkIGZpcnN0LCBiZWNvbWUKLSAgLy8gQ2VudHJhbCwgYW5kIGJsb2NrIGZvbGxvdy11cCByb2xlIGNoYW5nZXMgLSBiLzcyMTIyNzkyIC4KLSAgcmV0dXJuIGZhbHNlOwotI2lmIDAKLSAgdWludDhfdCByb2xlOwotICBib29sIG5lZWRlZCA9IGZhbHNlOwotICB0QlRBX0FWX1NDQiogcF9zY2JpOwotICBpbnQgaTsKLSAgdWludDhfdCBtYXNrOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgIG1hc2sgPSBCVEFfQVZfSE5ETF9UT19NU0soaSk7Ci0gICAgcF9zY2JpID0gYnRhX2F2X2NiLnBfc2NiW2ldOwotICAgIGlmIChwX3NjYmkgJiYgKHBfc2NiLT5oZGkgIT0gaSkgJiYgICAvKiBub3QgdGhlIG9yaWdpbmFsIGNoYW5uZWwgKi8KLSAgICAgICAgKChidGFfYXZfY2IuY29ubl9hdWRpbyAmIG1hc2spKSkgLyogY29ubmVjdGVkIGF1ZGlvICovCi0gICAgewotICAgICAgQlRNX0dldFJvbGUocF9zY2JpLT5QZWVyQWRkcmVzcygpLCAmcm9sZSk7Ci0gICAgICAvKiB0aGlzIGNoYW5uZWwgaXMgb3BlbiAtIGNsZWFyIHRoZSByb2xlIHN3aXRjaCBsaW5rIHBvbGljeSBmb3IgdGhpcyBsaW5rCi0gICAgICAgKi8KLSAgICAgIGlmIChIQ0lfUk9MRV9DRU5UUkFMICE9IHJvbGUpIHsKLSAgICAgICAgaWYgKGJ0YV9hdl9jYi5mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0NFTlRSQUwpCi0gICAgICAgICAgQlRNX2Jsb2NrX3JvbGVfc3dpdGNoX2ZvcihwX3NjYmktPlBlZXJBZGRyZXNzKCkpOwotICAgICAgICBpZiAoQlRNX0NNRF9TVEFSVEVEICE9Ci0gICAgICAgICAgICBCVE1fU3dpdGNoUm9sZShwX3NjYmktPlBlZXJBZGRyZXNzKCksIEhDSV9ST0xFX0NFTlRSQUwpKSB7Ci0gICAgICAgICAgLyogY2FuIG5vdCBzd2l0Y2ggcm9sZSBvbiBTQ0JJCi0gICAgICAgICAgICogc3RhcnQgdGhlIHRpbWVyIG9uIFNDQiAtIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBPTkxZIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICogU0NCIGdldHMgQVBJX09QRU4gKi8KLSAgICAgICAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKHBfc2NiLT5hdnJjX2N0X3RpbWVyLCBCVEFfQVZfUlNfVElNRV9WQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQVZfQVZSQ19USU1FUl9FVlQsIHBfc2NiLT5obmRsKTsKLSAgICAgICAgfQotICAgICAgICBuZWVkZWQgPSB0cnVlOwotICAgICAgICAvKiBtYXJrIHRoZSBvcmlnaW5hbCBjaGFubmVsIGFzIHdhaXRpbmcgZm9yIFJTIHJlc3VsdCAqLwotICAgICAgICBidGFfYXZfY2IucnNfaWR4ID0gcF9zY2ItPmhkaSArIDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbmVlZGVkOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfbGlua19yb2xlX29rCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgU0NCIGhhcyBleGlzdGluZyBBQ0wgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBJZiBzbywgY2hlY2sgaWYgdGhlIGxpbmsgcm9sZSBmaXRzIHRoZSByZXF1aXJlbWVudHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlLCBpZiByb2xlIGlzIG9rCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2F2X2xpbmtfcm9sZV9vayh0QlRBX0FWX1NDQiogcF9zY2IsIHVpbnQ4X3QgYml0cykgewotICB0SENJX1JPTEUgcm9sZTsKLSAgaWYgKEJUTV9HZXRSb2xlKHBfc2NiLT5QZWVyQWRkcmVzcygpLCAmcm9sZSkgIT0gQlRNX1NVQ0NFU1MpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgbGluayByb2xlIGZvciBkZXZpY2U6JXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX3NjYi0+UGVlckFkZHJlc3MoKSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKHJvbGUgIT0gSENJX1JPTEVfQ0VOVFJBTCAmJiAoQTJEUF9CaXRzU2V0KGJ0YV9hdl9jYi5jb25uX2F1ZGlvKSA+IGJpdHMpKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJTd2l0Y2ggbGluayByb2xlIHRvIGNlbnRyYWwgcGVlcjolcyBidGFfaGFuZGxlOjB4JXggY3VycmVudF9yb2xlOiVzIgotICAgICAgICAiIGNvbm5fYXVkaW86MHgleCBiaXRzOiVkIGZlYXR1cmVzOjB4JXgiLAotICAgICAgICBQUklWQVRFX0FERFJFU1MocF9zY2ItPlBlZXJBZGRyZXNzKCkpLCBwX3NjYi0+aG5kbCwKLSAgICAgICAgUm9sZVRleHQocm9sZSkuY19zdHIoKSwgYnRhX2F2X2NiLmNvbm5fYXVkaW8sIGJpdHMsIGJ0YV9hdl9jYi5mZWF0dXJlcyk7Ci0gICAgY29uc3QgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwocF9zY2ItPlBlZXJBZGRyZXNzKCkpOwotICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgICBjYXNlIEJUTV9DTURfU1RBUlRFRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUTV9NT0RFX1VOU1VQUE9SVEVEOgotICAgICAgY2FzZSBCVE1fREVWX1JFU1RSSUNUX0xJU1RFRDoKLSAgICAgICAgLy8gUm9sZSBzd2l0Y2ggY2FuIG5ldmVyIGhhcHBlbiwgYnV0IGluZGljYXRlIHRvIGNhbGxlcgotICAgICAgICAvLyBhIHJlc3VsdCBzdWNoIHRoYXQgYSB0aW1lciB3aWxsIG5vdCBzdGFydCB0byByZXBlYXRlZGx5Ci0gICAgICAgIC8vIHRyeSBzb21ldGhpbmcgbm90IHBvc3NpYmxlLgotICAgICAgICBMT0dfRVJST1IoIkxpbmsgY2FuIG5ldmVyIHJvbGUgc3dpdGNoIHRvIGNlbnRyYWwgZGV2aWNlOiVzIiwKLSAgICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX3NjYi0+UGVlckFkZHJlc3MoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIGNhbiBub3Qgc3dpdGNoIHJvbGUgb24gU0NCIC0gc3RhcnQgdGhlIHRpbWVyIG9uIFNDQiAqLwotICAgICAgICBwX3NjYi0+d2FpdCB8PSBCVEFfQVZfV0FJVF9ST0xFX1NXX1JFU19TVEFSVDsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gc3dpdGNoIHJvbGUgdG8gY2VudHJhbCBkZXZpY2U6JXMgZXJyb3I6JXMiLAotICAgICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBfc2NiLT5QZWVyQWRkcmVzcygpKSwKLSAgICAgICAgICAgICAgICAgIGJ0bV9zdGF0dXNfdGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2R1cF9hdWRpb19idWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGR1cCB0aGUgYXVkaW8gZGF0YSB0byB0aGUgcV9pbmZvLmEyZHAgb2Ygb3RoZXIgYXVkaW8KLSAqICAgICAgICAgICAgICAgICAgY2hhbm5lbHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfZHVwX2F1ZGlvX2J1Zih0QlRBX0FWX1NDQiogcF9zY2IsIEJUX0hEUiogcF9idWYpIHsKLSAgLyogVGVzdCB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYXVkaW8gY2hhbm5lbCBjb25uZWN0ZWQgKi8KLSAgaWYgKChwX2J1ZiA9PSBOVUxMKSB8fCAoYnRhX2F2X2NiLmF1ZGlvX29wZW5fY250IDwgMikpIHJldHVybjsKLQotICB1aW50MTZfdCBjb3B5X3NpemUgPSBCVF9IRFJfU0laRSArIHBfYnVmLT5sZW4gKyBwX2J1Zi0+b2Zmc2V0OwotICBmb3IgKGludCBpID0gMDsgaSA8IEJUQV9BVl9OVU1fU1RSUzsgaSsrKSB7Ci0gICAgdEJUQV9BVl9TQ0IqIHBfc2NiaSA9IGJ0YV9hdl9jYi5wX3NjYltpXTsKLQotICAgIGlmIChpID09IHBfc2NiLT5oZGkpIGNvbnRpbnVlOyAvKiBJZ25vcmUgdGhlIG9yaWdpbmFsIGNoYW5uZWwgKi8KLSAgICBpZiAoKHBfc2NiaSA9PSBOVUxMKSB8fCAhcF9zY2JpLT5jb19zdGFydGVkKQotICAgICAgY29udGludWU7IC8qIElnbm9yZSBpZiBTQ0IgaXMgbm90IHVzZWQgb3Igc3RhcnRlZCAqLwotICAgIGlmICghKGJ0YV9hdl9jYi5jb25uX2F1ZGlvICYgQlRBX0FWX0hORExfVE9fTVNLKGkpKSkKLSAgICAgIGNvbnRpbnVlOyAvKiBBdWRpbyBpcyBub3QgY29ubmVjdGVkICovCi0KLSAgICAvKiBFbnF1ZXVlIHRoZSBkYXRhICovCi0gICAgQlRfSERSKiBwX25ldyA9IChCVF9IRFIqKW9zaV9tYWxsb2MoY29weV9zaXplKTsKLSAgICBtZW1jcHkocF9uZXcsIHBfYnVmLCBjb3B5X3NpemUpOwotICAgIGxpc3RfYXBwZW5kKHBfc2NiaS0+YTJkcF9saXN0LCBwX25ldyk7Ci0KLSAgICBpZiAobGlzdF9sZW5ndGgocF9zY2JpLT5hMmRwX2xpc3QpID4gcF9idGFfYXZfY2ZnLT5hdWRpb19tcXMpIHsKLSAgICAgIC8vIERyb3AgdGhlIG9sZGVzdCBwYWNrZXQKLSAgICAgIGJ0YV9hdl9jb19hdWRpb19kcm9wKHBfc2NiaS0+aG5kbCwgcF9zY2JpLT5QZWVyQWRkcmVzcygpKTsKLSAgICAgIEJUX0hEUiogcF9idWZfZHJvcCA9IHN0YXRpY19jYXN0PEJUX0hEUio+KGxpc3RfZnJvbnQocF9zY2JpLT5hMmRwX2xpc3QpKTsKLSAgICAgIGxpc3RfcmVtb3ZlKHBfc2NiaS0+YTJkcF9saXN0LCBwX2J1Zl9kcm9wKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmX2Ryb3ApOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFfYXZfbm9uX3N0YXRlX21hY2hpbmVfZXZlbnQodWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0FWX0FQSV9FTkFCTEVfRVZUOgotICAgICAgYnRhX2F2X2FwaV9lbmFibGUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX0FQSV9SRUdJU1RFUl9FVlQ6Ci0gICAgICBidGFfYXZfYXBpX3JlZ2lzdGVyKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9BUElfREVSRUdJU1RFUl9FVlQ6Ci0gICAgICBidGFfYXZfYXBpX2RlcmVnaXN0ZXIocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX0FQSV9ESVNDT05ORUNUX0VWVDoKLSAgICAgIGJ0YV9hdl9hcGlfZGlzY29ubmVjdChwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfQ0lfU1JDX0RBVEFfUkVBRFlfRVZUOgotICAgICAgYnRhX2F2X2NpX2RhdGEocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX1NJR19DSEdfRVZUOgotICAgICAgYnRhX2F2X3NpZ19jaGcocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX1NJR05BTExJTkdfVElNRVJfRVZUOgotICAgICAgYnRhX2F2X3NpZ25hbGxpbmdfdGltZXIocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX1NEUF9BVlJDX0RJU0NfRVZUOgotICAgICAgYnRhX2F2X3JjX2Rpc2NfZG9uZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfQVZSQ19DTE9TRV9FVlQ6Ci0gICAgICBidGFfYXZfcmNfY2xvc2VkKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9BVlJDX0JST1dTRV9PUEVOX0VWVDoKLSAgICAgIGJ0YV9hdl9yY19icm93c2Vfb3BlbmVkKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9BVlJDX0JST1dTRV9DTE9TRV9FVlQ6Ci0gICAgICBidGFfYXZfcmNfYnJvd3NlX2Nsb3NlZChwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfQ09OTl9DSEdfRVZUOgotICAgICAgYnRhX2F2X2Nvbm5fY2hnKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9ERVJFR19DT01QX0VWVDoKLSAgICAgIGJ0YV9hdl9kZXJlZ19jb21wKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9BVkRUX1JQVF9DT05OX0VWVDoKLSAgICAgIGJ0YV9hdl9ycGNfY29ubihwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfQVBJX1NUQVJUX0VWVDoKLSAgICAgIGJ0YV9hdl9hcGlfdG9fc3NtKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9BUElfU1RPUF9FVlQ6Ci0gICAgICBidGFfYXZfYXBpX3RvX3NzbShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2F2X2JldHRlcl9zdGF0ZV9tYWNoaW5lKHRCVEFfQVZfQ0IqIHBfY2IsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIHN3aXRjaCAocF9jYi0+c3RhdGUpIHsKLSAgICBjYXNlIEJUQV9BVl9JTklUX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9BVl9BUElfRElTQUJMRV9FVlQ6Ci0gICAgICAgICAgYnRhX2F2X2Rpc2FibGUocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX01FVEFfUlNQX0VWVDoKLSAgICAgICAgICBidGFfYXZfcmNfZnJlZV9yc3AocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZSQ19PUEVOX0VWVDoKLSAgICAgICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9BVl9PUEVOX1NUOwotICAgICAgICAgIGJ0YV9hdl9yY19vcGVuZWQocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZSQ19NU0dfRVZUOgotICAgICAgICAgIGJ0YV9hdl9yY19mcmVlX2Jyb3dzZV9tc2cocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX09QRU5fU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9ESVNBQkxFX0VWVDoKLSAgICAgICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9BVl9JTklUX1NUOwotICAgICAgICAgIGJ0YV9hdl9kaXNhYmxlKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9SRU1PVEVfQ01EX0VWVDoKLSAgICAgICAgICBidGFfYXZfcmNfcmVtb3RlX2NtZChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BUElfVkVORE9SX0NNRF9FVlQ6Ci0gICAgICAgICAgYnRhX2F2X3JjX3ZlbmRvcl9jbWQocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX1ZFTkRPUl9SU1BfRVZUOgotICAgICAgICAgIGJ0YV9hdl9yY192ZW5kb3JfcnNwKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9NRVRBX1JTUF9FVlQ6Ci0gICAgICAgICAgYnRhX2F2X3JjX21ldGFfcnNwKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9SQ19DTE9TRV9FVlQ6Ci0gICAgICAgICAgYnRhX2F2X3JjX2Nsb3NlKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FWUkNfT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2F2X3JjX29wZW5lZChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BVlJDX01TR19FVlQ6Ci0gICAgICAgICAgYnRhX2F2X3JjX21zZyhwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BVlJDX05PTkVfRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0FWX0lOSVRfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIGJ0YV9hdl9zbV9leGVjdXRlKHRCVEFfQVZfQ0IqIHBfY2IsIHVpbnQxNl90IGV2ZW50LCB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0VWRU5UKCIlczogQVYgZXZlbnQ9MHgleCglcykgc3RhdGU9JWQoJXMpIiwgX19mdW5jX18sIGV2ZW50LAotICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9ldnRfY29kZShldmVudCksIHBfY2ItPnN0YXRlLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9zdF9jb2RlKHBfY2ItPnN0YXRlKSk7Ci0gIGJ0YV9hdl9iZXR0ZXJfc3RhdGVfbWFjaGluZShwX2NiLCBldmVudCwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9oZGxfZXZlbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFkdmFuY2VkIGF1ZGlvL3ZpZGVvIG1haW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9hdl9oZGxfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZykgewotICBpZiAocF9tc2ctPmV2ZW50ID4gQlRBX0FWX0xBU1RfRVZUKSB7Ci0gICAgcmV0dXJuIHRydWU7IC8qIHRvIGZyZWUgcF9tc2cgKi8KLSAgfQotICBpZiAocF9tc2ctPmV2ZW50ID49IEJUQV9BVl9GSVJTVF9OU01fRVZUKSB7Ci0gICAgQVBQTF9UUkFDRV9WRVJCT1NFKCIlczogQVYgbnNtIGV2ZW50PTB4JXgoJXMpIiwgX19mdW5jX18sIHBfbXNnLT5ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRhX2F2X2V2dF9jb2RlKHBfbXNnLT5ldmVudCkpOwotICAgIGJ0YV9hdl9ub25fc3RhdGVfbWFjaGluZV9ldmVudChwX21zZy0+ZXZlbnQsICh0QlRBX0FWX0RBVEEqKXBfbXNnKTsKLSAgfSBlbHNlIGlmIChwX21zZy0+ZXZlbnQgPj0gQlRBX0FWX0ZJUlNUX1NNX0VWVCAmJgotICAgICAgICAgICAgIHBfbXNnLT5ldmVudCA8PSBCVEFfQVZfTEFTVF9TTV9FVlQpIHsKLSAgICBBUFBMX1RSQUNFX1ZFUkJPU0UoIiVzOiBBViBzbSBldmVudD0weCV4KCVzKSIsIF9fZnVuY19fLCBwX21zZy0+ZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9ldnRfY29kZShwX21zZy0+ZXZlbnQpKTsKLSAgICAvKiBzdGF0ZSBtYWNoaW5lIGV2ZW50cyAqLwotICAgIGJ0YV9hdl9zbV9leGVjdXRlKCZidGFfYXZfY2IsIHBfbXNnLT5ldmVudCwgKHRCVEFfQVZfREFUQSopcF9tc2cpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfVkVSQk9TRSgiJXM6IGJ0YV9oYW5kbGU9MHgleCIsIF9fZnVuY19fLCBwX21zZy0+bGF5ZXJfc3BlY2lmaWMpOwotICAgIC8qIHN0cmVhbSBzdGF0ZSBtYWNoaW5lIGV2ZW50cyAqLwotICAgIGJ0YV9hdl9zc21fZXhlY3V0ZShidGFfYXZfaG5kbF90b19zY2IocF9tc2ctPmxheWVyX3NwZWNpZmljKSwgcF9tc2ctPmV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAodEJUQV9BVl9EQVRBKilwX21zZyk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERlYnVnIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3N0X2NvZGUKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgY2hhciAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfYXZfc3RfY29kZSh1aW50OF90IHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBjYXNlIEJUQV9BVl9JTklUX1NUOgotICAgICAgcmV0dXJuICJJTklUIjsKLSAgICBjYXNlIEJUQV9BVl9PUEVOX1NUOgotICAgICAgcmV0dXJuICJPUEVOIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9ldnRfY29kZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBjaGFyICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciogYnRhX2F2X2V2dF9jb2RlKHVpbnQxNl90IGV2dF9jb2RlKSB7Ci0gIHN3aXRjaCAoZXZ0X2NvZGUpIHsKLSAgICBjYXNlIEJUQV9BVl9BUElfRElTQUJMRV9FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9ESVNBQkxFIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfUkVNT1RFX0NNRF9FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9SRU1PVEVfQ01EIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfVkVORE9SX0NNRF9FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9WRU5ET1JfQ01EIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfVkVORE9SX1JTUF9FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9WRU5ET1JfUlNQIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfTUVUQV9SU1BfRVZUOgotICAgICAgcmV0dXJuICJBUElfTUVUQV9SU1BfRVZUIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfUkNfQ0xPU0VfRVZUOgotICAgICAgcmV0dXJuICJBUElfUkNfQ0xPU0UiOwotICAgIGNhc2UgQlRBX0FWX0FWUkNfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkFWUkNfT1BFTiI7Ci0gICAgY2FzZSBCVEFfQVZfQVZSQ19NU0dfRVZUOgotICAgICAgcmV0dXJuICJBVlJDX01TRyI7Ci0gICAgY2FzZSBCVEFfQVZfQVZSQ19OT05FX0VWVDoKLSAgICAgIHJldHVybiAiQVZSQ19OT05FIjsKLQotICAgIGNhc2UgQlRBX0FWX0FQSV9PUEVOX0VWVDoKLSAgICAgIHJldHVybiAiQVBJX09QRU4iOwotICAgIGNhc2UgQlRBX0FWX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9DTE9TRSI7Ci0gICAgY2FzZSBCVEFfQVZfQVBfU1RBUlRfRVZUOgotICAgICAgcmV0dXJuICJBUF9TVEFSVCI7Ci0gICAgY2FzZSBCVEFfQVZfQVBfU1RPUF9FVlQ6Ci0gICAgICByZXR1cm4gIkFQX1NUT1AiOwotICAgIGNhc2UgQlRBX0FWX0FQSV9SRUNPTkZJR19FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9SRUNPTkZJRyI7Ci0gICAgY2FzZSBCVEFfQVZfQVBJX1BST1RFQ1RfUkVRX0VWVDoKLSAgICAgIHJldHVybiAiQVBJX1BST1RFQ1RfUkVRIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfUFJPVEVDVF9SU1BfRVZUOgotICAgICAgcmV0dXJuICJBUElfUFJPVEVDVF9SU1AiOwotICAgIGNhc2UgQlRBX0FWX0FQSV9SQ19PUEVOX0VWVDoKLSAgICAgIHJldHVybiAiQVBJX1JDX09QRU4iOwotICAgIGNhc2UgQlRBX0FWX1NSQ19EQVRBX1JFQURZX0VWVDoKLSAgICAgIHJldHVybiAiU1JDX0RBVEFfUkVBRFkiOwotICAgIGNhc2UgQlRBX0FWX0NJX1NFVENPTkZJR19PS19FVlQ6Ci0gICAgICByZXR1cm4gIkNJX1NFVENPTkZJR19PSyI7Ci0gICAgY2FzZSBCVEFfQVZfQ0lfU0VUQ09ORklHX0ZBSUxfRVZUOgotICAgICAgcmV0dXJuICJDSV9TRVRDT05GSUdfRkFJTCI7Ci0gICAgY2FzZSBCVEFfQVZfU0RQX0RJU0NfT0tfRVZUOgotICAgICAgcmV0dXJuICJTRFBfRElTQ19PSyI7Ci0gICAgY2FzZSBCVEFfQVZfU0RQX0RJU0NfRkFJTF9FVlQ6Ci0gICAgICByZXR1cm4gIlNEUF9ESVNDX0ZBSUwiOwotICAgIGNhc2UgQlRBX0FWX1NUUl9ESVNDX09LX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX0RJU0NfT0siOwotICAgIGNhc2UgQlRBX0FWX1NUUl9ESVNDX0ZBSUxfRVZUOgotICAgICAgcmV0dXJuICJTVFJfRElTQ19GQUlMIjsKLSAgICBjYXNlIEJUQV9BVl9TVFJfR0VUQ0FQX09LX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX0dFVENBUF9PSyI7Ci0gICAgY2FzZSBCVEFfQVZfU1RSX0dFVENBUF9GQUlMX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX0dFVENBUF9GQUlMIjsKLSAgICBjYXNlIEJUQV9BVl9TVFJfT1BFTl9PS19FVlQ6Ci0gICAgICByZXR1cm4gIlNUUl9PUEVOX09LIjsKLSAgICBjYXNlIEJUQV9BVl9TVFJfT1BFTl9GQUlMX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX09QRU5fRkFJTCI7Ci0gICAgY2FzZSBCVEFfQVZfU1RSX1NUQVJUX09LX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX1NUQVJUX09LIjsKLSAgICBjYXNlIEJUQV9BVl9TVFJfU1RBUlRfRkFJTF9FVlQ6Ci0gICAgICByZXR1cm4gIlNUUl9TVEFSVF9GQUlMIjsKLSAgICBjYXNlIEJUQV9BVl9TVFJfQ0xPU0VfRVZUOgotICAgICAgcmV0dXJuICJTVFJfQ0xPU0UiOwotICAgIGNhc2UgQlRBX0FWX1NUUl9DT05GSUdfSU5EX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX0NPTkZJR19JTkQiOwotICAgIGNhc2UgQlRBX0FWX1NUUl9TRUNVUklUWV9JTkRfRVZUOgotICAgICAgcmV0dXJuICJTVFJfU0VDVVJJVFlfSU5EIjsKLSAgICBjYXNlIEJUQV9BVl9TVFJfU0VDVVJJVFlfQ0ZNX0VWVDoKLSAgICAgIHJldHVybiAiU1RSX1NFQ1VSSVRZX0NGTSI7Ci0gICAgY2FzZSBCVEFfQVZfU1RSX1dSSVRFX0NGTV9FVlQ6Ci0gICAgICByZXR1cm4gIlNUUl9XUklURV9DRk0iOwotICAgIGNhc2UgQlRBX0FWX1NUUl9TVVNQRU5EX0NGTV9FVlQ6Ci0gICAgICByZXR1cm4gIlNUUl9TVVNQRU5EX0NGTSI7Ci0gICAgY2FzZSBCVEFfQVZfU1RSX1JFQ09ORklHX0NGTV9FVlQ6Ci0gICAgICByZXR1cm4gIlNUUl9SRUNPTkZJR19DRk0iOwotICAgIGNhc2UgQlRBX0FWX0FWUkNfVElNRVJfRVZUOgotICAgICAgcmV0dXJuICJBVlJDX1RJTUVSIjsKLSAgICBjYXNlIEJUQV9BVl9BVkRUX0NPTk5FQ1RfRVZUOgotICAgICAgcmV0dXJuICJBVkRUX0NPTk5FQ1QiOwotICAgIGNhc2UgQlRBX0FWX0FWRFRfRElTQ09OTkVDVF9FVlQ6Ci0gICAgICByZXR1cm4gIkFWRFRfRElTQ09OTkVDVCI7Ci0gICAgY2FzZSBCVEFfQVZfUk9MRV9DSEFOR0VfRVZUOgotICAgICAgcmV0dXJuICJST0xFX0NIQU5HRSI7Ci0gICAgY2FzZSBCVEFfQVZfQVZEVF9ERUxBWV9SUFRfRVZUOgotICAgICAgcmV0dXJuICJBVkRUX0RFTEFZX1JQVCI7Ci0gICAgY2FzZSBCVEFfQVZfQUNQX0NPTk5FQ1RfRVZUOgotICAgICAgcmV0dXJuICJBQ1BfQ09OTkVDVCI7Ci0gICAgY2FzZSBCVEFfQVZfQVBJX09GRkxPQURfU1RBUlRfRVZUOgotICAgICAgcmV0dXJuICJPRkZMT0FEX1NUQVJUIjsKLSAgICBjYXNlIEJUQV9BVl9BUElfT0ZGTE9BRF9TVEFSVF9SU1BfRVZUOgotICAgICAgcmV0dXJuICJPRkZMT0FEX1NUQVJUX1JTUCI7Ci0KLSAgICBjYXNlIEJUQV9BVl9BUElfRU5BQkxFX0VWVDoKLSAgICAgIHJldHVybiAiQVBJX0VOQUJMRSI7Ci0gICAgY2FzZSBCVEFfQVZfQVBJX1JFR0lTVEVSX0VWVDoKLSAgICAgIHJldHVybiAiQVBJX1JFRyI7Ci0gICAgY2FzZSBCVEFfQVZfQVBJX0RFUkVHSVNURVJfRVZUOgotICAgICAgcmV0dXJuICJBUElfREVSRUciOwotICAgIGNhc2UgQlRBX0FWX0FQSV9ESVNDT05ORUNUX0VWVDoKLSAgICAgIHJldHVybiAiQVBJX0RJU0NOVCI7Ci0gICAgY2FzZSBCVEFfQVZfQ0lfU1JDX0RBVEFfUkVBRFlfRVZUOgotICAgICAgcmV0dXJuICJDSV9EQVRBX1JFQURZIjsKLSAgICBjYXNlIEJUQV9BVl9TSUdfQ0hHX0VWVDoKLSAgICAgIHJldHVybiAiU0lHX0NIRyI7Ci0gICAgY2FzZSBCVEFfQVZfU0lHTkFMTElOR19USU1FUl9FVlQ6Ci0gICAgICByZXR1cm4gIlNJR05BTExJTkdfVElNRVIiOwotICAgIGNhc2UgQlRBX0FWX1NEUF9BVlJDX0RJU0NfRVZUOgotICAgICAgcmV0dXJuICJTRFBfQVZSQ19ESVNDIjsKLSAgICBjYXNlIEJUQV9BVl9BVlJDX0NMT1NFX0VWVDoKLSAgICAgIHJldHVybiAiQVZSQ19DTE9TRSI7Ci0gICAgY2FzZSBCVEFfQVZfQVZSQ19CUk9XU0VfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkFWUkNfQlJPV1NFX09QRU4iOwotICAgIGNhc2UgQlRBX0FWX0FWUkNfQlJPV1NFX0NMT1NFX0VWVDoKLSAgICAgIHJldHVybiAiQVZSQ19CUk9XU0VfQ0xPU0UiOwotICAgIGNhc2UgQlRBX0FWX0NPTk5fQ0hHX0VWVDoKLSAgICAgIHJldHVybiAiQ09OTl9DSEciOwotICAgIGNhc2UgQlRBX0FWX0RFUkVHX0NPTVBfRVZUOgotICAgICAgcmV0dXJuICJERVJFR19DT01QIjsKLSAgICBjYXNlIEJUQV9BVl9BVkRUX1JQVF9DT05OX0VWVDoKLSAgICAgIHJldHVybiAiUlBUX0NPTk4iOwotICAgIGNhc2UgQlRBX0FWX0FQSV9TVEFSVF9FVlQ6Ci0gICAgICByZXR1cm4gIkFQSV9TVEFSVCI7Ci0gICAgY2FzZSBCVEFfQVZfQVBJX1NUT1BfRVZUOgotICAgICAgcmV0dXJuICJBUElfU1RPUCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KLQotdm9pZCBidGFfZGVidWdfYXZfZHVtcChpbnQgZmQpIHsKLSAgaWYgKGFwcGxfdHJhY2VfbGV2ZWwgPCBCVF9UUkFDRV9MRVZFTF9ERUJVRykgcmV0dXJuOwotCi0gIGRwcmludGYoZmQsICJcbkJUQSBBViBTdGF0ZTpcbiIpOwotICBkcHJpbnRmKGZkLCAiICBTdGF0ZSBNYWNoaW5lIFN0YXRlOiAlc1xuIiwgYnRhX2F2X3N0X2NvZGUoYnRhX2F2X2NiLnN0YXRlKSk7Ci0gIGRwcmludGYoZmQsICIgIFNEUCBBMkRQIHNvdXJjZSBoYW5kbGU6ICVkXG4iLCBidGFfYXZfY2Iuc2RwX2EyZHBfaGFuZGxlKTsKLSAgZHByaW50ZihmZCwgIiAgU0RQIEEyRFAgc2luayBoYW5kbGU6ICVkXG4iLCBidGFfYXZfY2Iuc2RwX2EyZHBfc25rX2hhbmRsZSk7Ci0gIGRwcmludGYoZmQsICIgIEZlYXR1cmVzOiAweCV4XG4iLCBidGFfYXZfY2IuZmVhdHVyZXMpOwotICBkcHJpbnRmKGZkLCAiICBTRFAgaGFuZGxlOiAlZFxuIiwgYnRhX2F2X2NiLmhhbmRsZSk7Ci0gIGRwcmludGYoZmQsICIgIERpc2FibGluZzogJXNcbiIsIGJ0YV9hdl9jYi5kaXNhYmxpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgZHByaW50ZihmZCwgIiAgU0NPIG9jY3VwaWVkOiAlc1xuIiwKLSAgICAgICAgICBidGFfYXZfY2Iuc2NvX29jY3VwaWVkID8gInRydWUiIDogImZhbHNlIik7Ci0gIGRwcmludGYoZmQsICIgIENvbm5lY3RlZCBhdWRpbyBjaGFubmVsczogJWRcbiIsIGJ0YV9hdl9jYi5hdWRpb19vcGVuX2NudCk7Ci0gIGRwcmludGYoZmQsICIgIENvbm5lY3RlZCBhdWRpbyBjaGFubmVscyBtYXNrOiAweCV4XG4iLCBidGFfYXZfY2IuY29ubl9hdWRpbyk7Ci0gIGRwcmludGYoZmQsICIgIFJlZ2lzdGVyZWQgYXVkaW8gY2hhbm5lbHMgbWFzazogMHgleFxuIiwgYnRhX2F2X2NiLnJlZ19hdWRpbyk7Ci0gIGRwcmludGYoZmQsICIgIENvbm5lY3RlZCBMQ0JzIG1hc2s6IDB4JXhcbiIsIGJ0YV9hdl9jYi5jb25uX2xjYik7Ci0gIGRwcmludGYoZmQsICIgIE9mZmxvYWQgc3RhcnQgcGVuZGluZyBoYW5kbGU6ICVkXG4iLAotICAgICAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0X3BlbmRpbmdfYWNsX2hkbCk7Ci0gIGRwcmludGYoZmQsICIgIE9mZmxvYWQgc3RhcnRlZCBoYW5kbGU6ICVkXG4iLAotICAgICAgICAgIGJ0YV9hdl9jYi5vZmZsb2FkX3N0YXJ0ZWRfYWNsX2hkbCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoYnRhX2F2X2NiLmxjYikgLyBzaXplb2YoYnRhX2F2X2NiLmxjYlswXSk7Ci0gICAgICAgaSsrKSB7Ci0gICAgY29uc3QgdEJUQV9BVl9MQ0ImIGxjYiA9IGJ0YV9hdl9jYi5sY2JbaV07Ci0gICAgaWYgKGxjYi5hZGRyLklzRW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGRwcmludGYoZmQsICJcbiAgTGluayBjb250cm9sIGJsb2NrOiAlenUgcGVlcjogJXNcbiIsIGksCi0gICAgICAgICAgICBsY2IuYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGRwcmludGYoZmQsICIgICAgQ29ubmVjdGVkIHN0cmVhbSBoYW5kbGUgbWFzazogMHgleFxuIiwgbGNiLmNvbm5fbXNrKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEluZGV4KCsxKSB0byBMQ0I6ICVkXG4iLCBsY2IubGlkeCk7Ci0gIH0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBCVEFfQVZfTlVNX1NUUlM7IGkrKykgewotICAgIGNvbnN0IHRCVEFfQVZfU0NCKiBwX3NjYiA9IGJ0YV9hdl9jYi5wX3NjYltpXTsKLSAgICBpZiAocF9zY2IgPT0gbnVsbHB0cikgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChwX3NjYi0+UGVlckFkZHJlc3MoKS5Jc0VtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBkcHJpbnRmKGZkLCAiXG4gIEJUQSBJRDogJXp1IHBlZXI6ICVzXG4iLCBpLAotICAgICAgICAgICAgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFNEUCBkaXNjb3Zlcnkgc3RhcnRlZDogJXNcbiIsCi0gICAgICAgICAgICBwX3NjYi0+c2RwX2Rpc2NvdmVyeV9zdGFydGVkID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOyBqKyspIHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfU0VQJiBzZXAgPSBwX3NjYi0+c2Vwc1tqXTsKLSAgICAgIGlmIChzZXAuYXZfaGFuZGxlID09IDApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgIFNFUCBJRDogJXp1XG4iLCBqKTsKLSAgICAgIGRwcmludGYoZmQsICIgICAgICBTRVAgQVZEVFAgaGFuZGxlOiAlZFxuIiwgc2VwLmF2X2hhbmRsZSk7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgTG9jYWwgU0VQIHR5cGU6ICVkXG4iLCBzZXAudHNlcCk7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgQ29kZWM6ICVzXG4iLCBBMkRQX0NvZGVjTmFtZShzZXAuY29kZWNfaW5mbykpOwotICAgIH0KLSAgICBkcHJpbnRmKGZkLCAiICAgIEJUQSBpbmZvIHRhZzogJWRcbiIsIHBfc2NiLT5xX3RhZyk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBBUEkgT3BlbiBwZWVyOiAlc1xuIiwKLSAgICAgICAgICAgIHBfc2NiLT5xX2luZm8ub3Blbi5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZHByaW50ZihmZCwgIiAgICAgIFVzZSBBVlJDUDogJXNcbiIsCi0gICAgICAgICAgICBwX3NjYi0+cV9pbmZvLm9wZW4udXNlX3JjID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICAgIFN3aXRjaCByZXN1bHQ6ICVkXG4iLCBwX3NjYi0+cV9pbmZvLm9wZW4uc3dpdGNoX3Jlcyk7Ci0gICAgZHByaW50ZihmZCwgIiAgICAgIEluaXRpYXRvciBVVUlEOiAweCV4XG4iLCBwX3NjYi0+cV9pbmZvLm9wZW4udXVpZCk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBTYXZlZCBBUEkgT3BlbiBwZWVyOiAlc1xuIiwKLSAgICAgICAgICAgIHBfc2NiLT5vcGVuX2FwaS5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZHByaW50ZihmZCwgIiAgICAgIFVzZSBBVlJDUDogJXNcbiIsCi0gICAgICAgICAgICBwX3NjYi0+b3Blbl9hcGkudXNlX3JjID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICAgIFN3aXRjaCByZXN1bHQ6ICVkXG4iLCBwX3NjYi0+b3Blbl9hcGkuc3dpdGNoX3Jlcyk7Ci0gICAgZHByaW50ZihmZCwgIiAgICAgIEluaXRpYXRvciBVVUlEOiAweCV4XG4iLCBwX3NjYi0+b3Blbl9hcGkudXVpZCk7Ci0gICAgZHByaW50ZihmZCwgIiAgTGluayBzaWduYWxsaW5nIHRpbWVyOiAlc1xuIiwKLSAgICAgICAgICAgIGFsYXJtX2lzX3NjaGVkdWxlZChwX3NjYi0+bGlua19zaWduYWxsaW5nX3RpbWVyKSA/ICJTY2hlZHVsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTm90IHNjaGVkdWxlZCIpOwotICAgIGRwcmludGYoZmQsICIgIEFjY2VwdCBzaWduYWxsaW5nIHRpbWVyOiAlc1xuIiwKLSAgICAgICAgICAgIGFsYXJtX2lzX3NjaGVkdWxlZChwX3NjYi0+YWNjZXB0X3NpZ25hbGxpbmdfdGltZXIpCi0gICAgICAgICAgICAgICAgPyAiU2NoZWR1bGVkIgotICAgICAgICAgICAgICAgIDogIk5vdCBzY2hlZHVsZWQiKTsKLSAgICAvLyBUT0RPOiBQcmludCBwX3NjYi0+c2VwX2luZm9bXSwgY2ZnLCBhdnJjX2N0X3RpbWVyLCBjdXJyZW50X2NvZGVjID8KLSAgICBkcHJpbnRmKGZkLCAiICAgIEwyQ0FQIENoYW5uZWwgSUQ6ICVkXG4iLCBwX3NjYi0+bDJjX2NpZCk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBTdHJlYW0gTVRVOiAlZFxuIiwgcF9zY2ItPnN0cmVhbV9tdHUpOwotICAgIGRwcmludGYoZmQsICIgICAgQVZEVFAgdmVyc2lvbjogMHgleFxuIiwgcF9zY2ItPkF2ZHRwVmVyc2lvbigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIE1lZGlhIHR5cGU6ICVkXG4iLCBwX3NjYi0+bWVkaWFfdHlwZSk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBDb25nZXN0ZWQ6ICVzXG4iLCBwX3NjYi0+Y29uZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGRwcmludGYoZmQsICIgICAgT3BlbiBzdGF0dXM6ICVkXG4iLCBwX3NjYi0+b3Blbl9zdGF0dXMpOwotICAgIGRwcmludGYoZmQsICIgICAgQ2hhbm5lbDogJWRcbiIsIHBfc2NiLT5jaG5sKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEJUQSBoYW5kbGU6IDB4JXhcbiIsIHBfc2NiLT5obmRsKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFByb3RvY29sIHNlcnZpY2UgY2FwYWJpbGl0aWVzIG1hc2s6IDB4JXhcbiIsCi0gICAgICAgICAgICBwX3NjYi0+Y3VyX3BzY19tYXNrKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEFWRFRQIGhhbmRsZTogJWRcbiIsIHBfc2NiLT5hdmR0X2hhbmRsZSk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBTdHJlYW0gY29udHJvbCBibG9jayBpbmRleDogJWRcbiIsIHBfc2NiLT5oZGkpOwotICAgIGRwcmludGYoZmQsICIgICAgU3RhdGUgbWFjaGluZSBzdGF0ZTogJXMoJWQpXG4iLAotICAgICAgICAgICAgYnRhX2F2X3NzdF9jb2RlKHBfc2NiLT5zdGF0ZSksIHBfc2NiLT5zdGF0ZSk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBBVkRUUCBsYWJlbDogMHgleFxuIiwgcF9zY2ItPmF2ZHRfbGFiZWwpOwotICAgIGRwcmludGYoZmQsICIgICAgQXBwbGljYXRpb24gSUQ6ICVkXG4iLCBwX3NjYi0+YXBwX2lkKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFJvbGU6IDB4JXhcbiIsIHBfc2NiLT5yb2xlKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFF1ZXVlZCBMMkNBUCBidWZmZXJzOiAlZFxuIiwgcF9zY2ItPmwyY19idWZzKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEFWUkNQIGFsbG93ZWQ6ICVzXG4iLCBwX3NjYi0+dXNlX3JjID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICBTdHJlYW0gc3RhcnRlZDogJXNcbiIsIHBfc2NiLT5zdGFydGVkID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICBTdHJlYW0gY2FsbC1vdXQgc3RhcnRlZDogJWRcbiIsIHBfc2NiLT5jb19zdGFydGVkKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEFWRFRQIFJlY29uZmlnIHN1cHBvcnRlZDogJXNcbiIsCi0gICAgICAgICAgICBwX3NjYi0+cmVjZmdfc3VwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICBBVkRUUCBTdXNwZW5kIHN1cHBvcnRlZDogJXNcbiIsCi0gICAgICAgICAgICBwX3NjYi0+c3VzcGVuZF9zdXAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIERlcmVnaXN0ZXJpbmc6ICVzXG4iLAotICAgICAgICAgICAgcF9zY2ItPmRlcmVnaXN0ZXJpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFNDTyBhdXRvbWF0aWMgU3VzcGVuZDogJXNcbiIsCi0gICAgICAgICAgICBwX3NjYi0+c2NvX3N1c3BlbmQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEluY29taW5nL291dGdvaW5nIGNvbm5lY3Rpb24gY29sbHVzaW9uIG1hc2s6IDB4JXhcbiIsCi0gICAgICAgICAgICBwX3NjYi0+Y29sbF9tYXNrKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFdhaXQgbWFzazogMHgleFxuIiwgcF9zY2ItPndhaXQpOwotICAgIGRwcmludGYoZmQsICIgICAgRG9uJ3QgdXNlIFJUUCBoZWFkZXI6ICVzXG4iLAotICAgICAgICAgICAgcF9zY2ItPm5vX3J0cF9oZWFkZXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEludGVuZGVkIFVVSUQgb2YgSW5pdGlhdG9yIHRvIGNvbm5lY3QgdG86IDB4JXhcbiIsCi0gICAgICAgICAgICBwX3NjYi0+dXVpZF9pbnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvYXYvYnRhX2F2X3NzbS5jYyBiL2J0YS9hdi9idGFfYXZfc3NtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTY5MjJjLi4wMDAwMDAwCi0tLSBhL2J0YS9hdi9idGFfYXZfc3NtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgc3RyZWFtIHN0YXRlIG1hY2hpbmUgZm9yIHRoZSBCVEEgYWR2YW5jZWQgYXVkaW8vdmlkZW8uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25zdGFudHMgYW5kIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogc3RhdGUgbWFjaGluZSBzdGF0ZXMgKi8KLWVudW0gewotICBCVEFfQVZfSU5JVF9TU1QsCi0gIEJUQV9BVl9JTkNPTUlOR19TU1QsCi0gIEJUQV9BVl9PUEVOSU5HX1NTVCwKLSAgQlRBX0FWX09QRU5fU1NULAotICBCVEFfQVZfUkNGR19TU1QsCi0gIEJUQV9BVl9DTE9TSU5HX1NTVAotfTsKLQotc3RhdGljIHZvaWQgYnRhX2F2X2JldHRlcl9zdHJlYW1fc3RhdGVfbWFjaGluZSh0QlRBX0FWX1NDQiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90IHByZXZpb3VzX3N0YXRlID0gcF9zY2ItPnN0YXRlOwotICB0QlRBX0FWX0FDVCBldmVudF9oYW5kbGVyMSA9IG51bGxwdHI7Ci0gIHRCVEFfQVZfQUNUIGV2ZW50X2hhbmRsZXIyID0gbnVsbHB0cjsKLSAgc3dpdGNoIChwX3NjYi0+c3RhdGUpIHsKLSAgICBjYXNlIEJUQV9BVl9JTklUX1NTVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX09QRU5fRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9PUEVOSU5HX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZG9fZGlzY19hMmRwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BUElfQ0xPU0VfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9jbGVhbnVwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TRFBfRElTQ19PS19FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2ZyZWVfc2RiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TRFBfRElTQ19GQUlMX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZnJlZV9zZGI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9DT05GSUdfSU5EX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5DT01JTkdfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9jb25maWdfaW5kOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BQ1BfQ09OTkVDVF9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0lOQ09NSU5HX1NTVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX09GRkxPQURfU1RBUlRfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9vZmZsb2FkX3JlcTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX09GRkxPQURfU1RBUlRfUlNQX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb2ZmbG9hZF9yc3A7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9JTkNPTUlOR19TU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PUEVOX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb3Blbl9hdF9pbmM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0NMT1NJTkdfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9jY29fY2xvc2U7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjIgPSAmYnRhX2F2X2Rpc2Nvbm5lY3RfcmVxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BUElfUFJPVEVDVF9SRVFfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zZWN1cml0eV9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9QUk9URUNUX1JTUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X3JzcDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQ0lfU0VUQ09ORklHX09LX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc2V0Y29uZmlnX3JzcDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMiA9ICZidGFfYXZfc3RfcmNfdGltZXI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0NJX1NFVENPTkZJR19GQUlMX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5JVF9TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NldGNvbmZpZ19yZWo7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjIgPSAmYnRhX2F2X2NsZWFudXA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NEUF9ESVNDX09LX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZnJlZV9zZGI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NEUF9ESVNDX0ZBSUxfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9mcmVlX3NkYjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0RJU0NfT0tfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kaXNjX3Jlc19hc19hY3A7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9HRVRDQVBfT0tfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zYXZlX2NhcHM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9PUEVOX09LX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfT1BFTl9TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0cl9vcGVuZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0lOSVRfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9jY29fY2xvc2U7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjIgPSAmYnRhX2F2X2NsZWFudXA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9DT05GSUdfSU5EX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfY29uZmlnX2luZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX1NFQ1VSSVRZX0lORF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X2luZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX1NFQ1VSSVRZX0NGTV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X2NmbTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZEVF9ESVNDT05ORUNUX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfQ0xPU0lOR19TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2Njb19jbG9zZTsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMiA9ICZidGFfYXZfZGlzY29ubmVjdF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FWRFRfREVMQVlfUlBUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGVsYXlfY287Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb2ZmbG9hZF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X29mZmxvYWRfcnNwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfT1BFTklOR19TU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0NMT1NJTkdfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kb19jbG9zZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX1BST1RFQ1RfUkVRX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc2VjdXJpdHlfcmVxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BUElfUFJPVEVDVF9SU1BfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zZWN1cml0eV9yc3A7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NEUF9ESVNDX09LX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfY29ubmVjdF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NEUF9ESVNDX0ZBSUxfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9jb25uZWN0X3JlcTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0RJU0NfT0tfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kaXNjX3Jlc3VsdHM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9ESVNDX0ZBSUxfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9DTE9TSU5HX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb3Blbl9mYWlsZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9HRVRDQVBfT0tfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9nZXRjYXBfcmVzdWx0czsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0dFVENBUF9GQUlMX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfQ0xPU0lOR19TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X29wZW5fZmFpbGVkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TVFJfT1BFTl9PS19FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX09QRU5fU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zdF9yY190aW1lcjsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMiA9ICZidGFfYXZfc3RyX29wZW5lZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX09QRU5fRkFJTF9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0NMT1NJTkdfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9vcGVuX2ZhaWxlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0NPTkZJR19JTkRfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9JTkNPTUlOR19TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2NvbmZpZ19pbmQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9TRUNVUklUWV9JTkRfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zZWN1cml0eV9pbmQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9TRUNVUklUWV9DRk1fRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zZWN1cml0eV9jZm07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FWUkNfVElNRVJfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zd2l0Y2hfcm9sZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZEVF9DT05ORUNUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGlzY292ZXJfcmVxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BVkRUX0RJU0NPTk5FQ1RfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9JTklUX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfY29ubl9mYWlsZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1JPTEVfQ0hBTkdFX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcm9sZV9yZXM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FWRFRfREVMQVlfUlBUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGVsYXlfY287Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb2ZmbG9hZF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X29mZmxvYWRfcnNwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfT1BFTl9TU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0NMT1NJTkdfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kb19jbG9zZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBfU1RBUlRfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kb19zdGFydDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBfU1RPUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0cl9zdG9wcGVkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BUElfUkVDT05GSUdfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9SQ0ZHX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcmVjb25maWc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9QUk9URUNUX1JFUV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X3JlcTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX1BST1RFQ1RfUlNQX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc2VjdXJpdHlfcnNwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BUElfUkNfT1BFTl9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NldF91c2VfcmM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NSQ19EQVRBX1JFQURZX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGF0YV9wYXRoOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TRFBfRElTQ19PS19FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2ZyZWVfc2RiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TRFBfRElTQ19GQUlMX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZnJlZV9zZGI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9HRVRDQVBfT0tfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zYXZlX2NhcHM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9TVEFSVF9PS19FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0YXJ0X29rOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TVFJfU1RBUlRfRkFJTF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0YXJ0X2ZhaWxlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0NMT1NFX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5JVF9TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0cl9jbG9zZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9DT05GSUdfSU5EX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc2V0Y29uZmlnX3JlajsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX1NFQ1VSSVRZX0lORF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X2luZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX1NFQ1VSSVRZX0NGTV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X2NmbTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX1dSSVRFX0NGTV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2Nscl9jb25nOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIyID0gJmJ0YV9hdl9kYXRhX3BhdGg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9TVVNQRU5EX0NGTV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N1c3BlbmRfY2ZtOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BVlJDX1RJTUVSX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb3Blbl9yYzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZEVF9ESVNDT05ORUNUX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5JVF9TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0cl9jbG9zZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1JPTEVfQ0hBTkdFX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcm9sZV9yZXM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FWRFRfREVMQVlfUlBUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGVsYXlfY287Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb2ZmbG9hZF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X29mZmxvYWRfcnNwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfUkNGR19TU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0NMT1NJTkdfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kaXNjb25uZWN0X3JlcTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVBJX1JFQ09ORklHX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcmVjb25maWc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NEUF9ESVNDX09LX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZnJlZV9zZGI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NEUF9ESVNDX0ZBSUxfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9mcmVlX3NkYjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0RJU0NfT0tfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kaXNjX3Jlc3VsdHM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9ESVNDX0ZBSUxfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9JTklUX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc3RyX2Nsb3NlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0dFVENBUF9PS19FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2dldGNhcF9yZXN1bHRzOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TVFJfR0VUQ0FQX0ZBSUxfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9JTklUX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc3RyX2Nsb3NlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX09QRU5fT0tfRVZUOgotICAgICAgICAgIHBfc2NiLT5zdGF0ZSA9IEJUQV9BVl9PUEVOX1NTVDsKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcmNmZ19zdHJfb2s7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9PUEVOX0ZBSUxfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9yY2ZnX2ZhaWxlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0NMT1NFX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcmNmZ19jb25uZWN0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TVFJfQ09ORklHX0lORF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NldGNvbmZpZ19yZWo7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9TVVNQRU5EX0NGTV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N1c3BlbmRfY2ZtOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIyID0gJmJ0YV9hdl9zdXNwZW5kX2NvbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9SRUNPTkZJR19DRk1fRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9yY2ZnX2NmbTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZEVF9DT05ORUNUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfcmNmZ19vcGVuOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9BVkRUX0RJU0NPTk5FQ1RfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9yY2ZnX2Rpc2NudGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FWRFRfREVMQVlfUlBUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGVsYXlfY287Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb2ZmbG9hZF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X29mZmxvYWRfcnNwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQVZfQ0xPU0lOR19TU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X2Rpc2Nvbm5lY3RfcmVxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TRFBfRElTQ19PS19FVlQ6Ci0gICAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FWX0lOSVRfU1NUOwotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9zZHBfZmFpbGVkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9BVl9TRFBfRElTQ19GQUlMX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5JVF9TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NkcF9mYWlsZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9PUEVOX09LX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZG9fY2xvc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9PUEVOX0ZBSUxfRVZUOgotICAgICAgICAgIGV2ZW50X2hhbmRsZXIxID0gJmJ0YV9hdl9kaXNjb25uZWN0X3JlcTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX0NMT1NFX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfZGlzY29ubmVjdF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX1NUUl9DT05GSUdfSU5EX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfc2V0Y29uZmlnX3JlajsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfU1RSX1NFQ1VSSVRZX0lORF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3NlY3VyaXR5X3JlajsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfQVZfQVZEVF9ESVNDT05ORUNUX0VWVDoKLSAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5JVF9TU1Q7Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X3N0cl9jbG9zZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX0VWVDoKLSAgICAgICAgICBldmVudF9oYW5kbGVyMSA9ICZidGFfYXZfb2ZmbG9hZF9yZXE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0FWX0FQSV9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ6Ci0gICAgICAgICAgZXZlbnRfaGFuZGxlcjEgPSAmYnRhX2F2X29mZmxvYWRfcnNwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAocHJldmlvdXNfc3RhdGUgIT0gcF9zY2ItPnN0YXRlKSB7Ci0gICAgTE9HX0lORk8oInBlZXIgJXMgcF9zY2I9JSN4KCVwKSBBViBldmVudD0weCV4KCVzKSBzdGF0ZT0lZCglcykgLT4gJWQoJXMpIiwKLSAgICAgICAgICAgICBwX3NjYi0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBfc2NiLT5obmRsLCBwX3NjYiwgZXZlbnQsCi0gICAgICAgICAgICAgYnRhX2F2X2V2dF9jb2RlKGV2ZW50KSwgcHJldmlvdXNfc3RhdGUsCi0gICAgICAgICAgICAgYnRhX2F2X3NzdF9jb2RlKHByZXZpb3VzX3N0YXRlKSwgcF9zY2ItPnN0YXRlLAotICAgICAgICAgICAgIGJ0YV9hdl9zc3RfY29kZShwX3NjYi0+c3RhdGUpKTsKLQotICB9IGVsc2UgewotICAgIExPR19ERUJVRygicGVlciAlcyBwX3NjYj0lI3goJXApIEFWIGV2ZW50PTB4JXgoJXMpIHN0YXRlPSVkKCVzKSIsCi0gICAgICAgICAgICAgIHBfc2NiLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9zY2ItPmhuZGwsIHBfc2NiLAotICAgICAgICAgICAgICBldmVudCwgYnRhX2F2X2V2dF9jb2RlKGV2ZW50KSwgcF9zY2ItPnN0YXRlLAotICAgICAgICAgICAgICBidGFfYXZfc3N0X2NvZGUocF9zY2ItPnN0YXRlKSk7Ci0gIH0KLQotICBpZiAoZXZlbnRfaGFuZGxlcjEgIT0gbnVsbHB0cikgewotICAgIGV2ZW50X2hhbmRsZXIxKHBfc2NiLCBwX2RhdGEpOwotICB9Ci0gIGlmIChldmVudF9oYW5kbGVyMiAhPSBudWxscHRyKSB7Ci0gICAgZXZlbnRfaGFuZGxlcjIocF9zY2IsIHBfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zc21fZXhlY3V0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RyZWFtIHN0YXRlIG1hY2hpbmUgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24gZm9yIEFWCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9zc21fZXhlY3V0ZSh0QlRBX0FWX1NDQiogcF9zY2IsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9EQVRBKiBwX2RhdGEpIHsKLSAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICAvKiB0aGlzIHN0cmVhbSBpcyBub3QgcmVnaXN0ZXJlZCAqLwotICAgIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBBViBjaGFubmVsIG5vdCByZWdpc3RlcmVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9hdl9iZXR0ZXJfc3RyZWFtX3N0YXRlX21hY2hpbmUocF9zY2IsIGV2ZW50LCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2lzX3NjYl9vcGVuaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIHRydWUgaXMgc2NiIGlzIGluIG9wZW5pbmcgc3RhdGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY2IgaXMgaW4gb3BlbmluZyBzdGF0ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYXZfaXNfc2NiX29wZW5pbmcodEJUQV9BVl9TQ0IqIHBfc2NiKSB7Ci0gIGJvb2wgaXNfb3BlbmluZyA9IGZhbHNlOwotCi0gIGlmIChwX3NjYikgewotICAgIGlmIChwX3NjYi0+c3RhdGUgPT0gQlRBX0FWX09QRU5JTkdfU1NUKSBpc19vcGVuaW5nID0gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBpc19vcGVuaW5nOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2lzX3NjYl9pbmNvbWluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyB0cnVlIGlzIHNjYiBpcyBpbiBpbmNvbWluZyBzdGF0ZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHNjYiBpcyBpbiBpbmNvbWluZyBzdGF0ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfYXZfaXNfc2NiX2luY29taW5nKHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBib29sIGlzX2luY29taW5nID0gZmFsc2U7Ci0KLSAgaWYgKHBfc2NiKSB7Ci0gICAgaWYgKHBfc2NiLT5zdGF0ZSA9PSBCVEFfQVZfSU5DT01JTkdfU1NUKSBpc19pbmNvbWluZyA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gaXNfaW5jb21pbmc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfc2V0X3NjYl9zc3RfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IFNTVCBzdGF0ZSB0byBJTklULgotICogICAgICAgICAgICAgICAgICBVc2UgdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2UgU1NUIG91dHNpZGUgb2Ygc3RhdGUgbWFjaGluZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfc2V0X3NjYl9zc3RfaW5pdCh0QlRBX0FWX1NDQiogcF9zY2IpIHsKLSAgaWYgKHBfc2NiID09IG51bGxwdHIpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IG5leHRfc3RhdGUgPSBCVEFfQVZfSU5JVF9TU1Q7Ci0KLSAgQVBQTF9UUkFDRV9WRVJCT1NFKAotICAgICAgIiVzOiBwZWVyICVzIEFWIChobmRsPTB4JXgpIHN0YXRlPSVkKCVzKSBuZXh0IHN0YXRlPSVkKCVzKSBwX3NjYj0lcCIsCi0gICAgICBfX2Z1bmNfXywgcF9zY2ItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3NjYi0+aG5kbCwKLSAgICAgIHBfc2NiLT5zdGF0ZSwgYnRhX2F2X3NzdF9jb2RlKHBfc2NiLT5zdGF0ZSksIG5leHRfc3RhdGUsCi0gICAgICBidGFfYXZfc3N0X2NvZGUobmV4dF9zdGF0ZSksIHBfc2NiKTsKLQotICBwX3NjYi0+c3RhdGUgPSBuZXh0X3N0YXRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2lzX3NjYl9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIHRydWUgaXMgc2NiIGlzIGluIGluaXQgc3RhdGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzY2IgaXMgaW4gaW5jb21pbmcgc3RhdGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2F2X2lzX3NjYl9pbml0KHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBib29sIGlzX2luaXQgPSBmYWxzZTsKLQotICBpZiAocF9zY2IpIHsKLSAgICBpZiAocF9zY2ItPnN0YXRlID09IEJUQV9BVl9JTklUX1NTVCkgaXNfaW5pdCA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gaXNfaW5pdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9zZXRfc2NiX3NzdF9pbmNvbWluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IFNTVCBzdGF0ZSB0byBpbmNvbWluZy4KLSAqICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgZnVuY3Rpb24gdG8gY2hhbmdlIFNTVCBvdXRzaWRlIG9mIHN0YXRlIG1hY2hpbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X3NldF9zY2Jfc3N0X2luY29taW5nKHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBpZiAocF9zY2IpIHsKLSAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQVZfSU5DT01JTkdfU1NUOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERlYnVnIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X3NzdF9jb2RlCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGNoYXIgKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyKiBidGFfYXZfc3N0X2NvZGUodWludDhfdCBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBCVEFfQVZfSU5JVF9TU1Q6Ci0gICAgICByZXR1cm4gIklOSVQiOwotICAgIGNhc2UgQlRBX0FWX0lOQ09NSU5HX1NTVDoKLSAgICAgIHJldHVybiAiSU5DT01JTkciOwotICAgIGNhc2UgQlRBX0FWX09QRU5JTkdfU1NUOgotICAgICAgcmV0dXJuICJPUEVOSU5HIjsKLSAgICBjYXNlIEJUQV9BVl9PUEVOX1NTVDoKLSAgICAgIHJldHVybiAiT1BFTiI7Ci0gICAgY2FzZSBCVEFfQVZfUkNGR19TU1Q6Ci0gICAgICByZXR1cm4gIlJDRkciOwotICAgIGNhc2UgQlRBX0FWX0NMT1NJTkdfU1NUOgotICAgICAgcmV0dXJuICJDTE9TSU5HIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL2NzaXMvY3Npc19jbGllbnQuY2MgYi9idGEvY3Npcy9jc2lzX2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYjk3My4uMDAwMDAwMAotLS0gYS9idGEvY3Npcy9jc2lzX2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5MjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2NzaXMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9nYXR0X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJhZHZlcnRpc2VfZGF0YV9wYXJzZXIuaCIKLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2NzaXNfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWUuaCIKLSNpbmNsdWRlICJidGFfZ3JvdXBzLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiY3Npc190eXBlcy5oIgotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNpbmNsdWRlICJnYXR0X2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi11c2luZyBiYXNlOjpDbG9zdXJlOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnQ7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OkNzaXNEZXZpY2U7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OkNzaXNEaXNjb3ZlcnlTdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0dyb3VwOwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzR3JvdXBMb2NrU3RhdHVzOwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzSW5zdGFuY2U7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OkNzaXNMb2NrQ2I7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OkNzaXNMb2NrU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OmtDc2lzTG9ja1V1aWQ7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OmtDc2lzUmFua1V1aWQ7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2VydmljZVV1aWQ7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2lya1V1aWQ7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2l6ZVV1aWQ7Ci0KLXVzaW5nIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHM7Ci11c2luZyBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzQ2FsbGJhY2tzOwotCi1uYW1lc3BhY2UgewotY2xhc3MgQ3Npc0NsaWVudEltcGw7Ci1Dc2lzQ2xpZW50SW1wbCogaW5zdGFuY2U7Ci1EZXZpY2VHcm91cHNDYWxsYmFja3MqIGRldmljZV9ncm91cF9jYWxsYmFja3M7Ci0KLS8qKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvb3JkaW5hdGVkIFNldCBTZXJ2aWNlIC0gQ2xpZW50IHJvbGUKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogQ1NJUCBhbGxvd3MgdG8gb3JnYW5pemUgYXVkaW8gc2VydmVycyBpbnRvIHNldHMgZS5nLiBTdGVyZW8gU2V0LCA1LjEgU2V0Ci0gKiBhbmQgc3BlZWQgdXAgY29ubmVjdGluZyBpdC4KLSAqCi0gKiBTaW5jZSBsZWF1ZGlvIGhhcyBhbHJlYWR5IGdyb3VwaW5nIEFQSSBpdCB3YXMgZGVjaWRlZCB0byBpbnRlZ3JhdGUgaGVyZSBDU0lTCi0gKiBhbmQgYWxsb3cgaXQgdG8gZ3JvdXAgZGV2aWNlcyBzZW1pLWF1dG9tYXRpY2FsbHkuCi0gKgotICogRmxvdzoKLSAqIElmIGNvbm5lY3RlZCBkZXZpY2UgY29udGFpbnMgQ1NJUyBzZXJ2aWNlcywgYW5kIGl0IGlzIGluY2x1ZGVkIGludG8gQ0FQCi0gKiBzZXJ2aWNlIG9yIGlzIG5vdCBpbmNsdWRlZCBhdCBhbGwsIGltcGxlbWVudGF0aW9uIHJlYWRzIGFsbCBpdHMKLSAqIGNoYXJhY3RlcmlzdGlzYy4gVGhlIG9ubHkgbWFuZGF0b3J5IGNoYXJhY3RlcmlzdGljIGlzIFNldCBJZGVudGl0eSBSZXNvbHZpbmcKLSAqIEtleSAoU0lSSykgYW5kIG9uY2UgdGhpcyBpcyByZWFkIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhlcmUgaXMgYXQgbGVhc3QgMgotICogZGV2aWNlcyBpbiB0aGUgc2V0IGFuZCBzdGFydCB0byBzZWFyY2ggZm9yIG90aGVyIG1lbWJlcnMgYnkgbG9va2luZyBmb3IgbmV3Ci0gKiBBZHZlcnRpc2luZyBUeXBlIChSU0kgVHlwZSkgYW5kIFJlc29sdmFibGUgU2V0IElkZW50aWZpZXIgKFJTSSkgaW4gaXQuCi0gKiBJbiB0aGUgbWVhbnRpbWUgb3RoZXIgQ1NJUyBjaGFyYWN0ZXJpc3RpY3MgYXJlIHJlYWQgYW5kIFNldCBTaXplIG1pZ2h0IGJlCi0gKiB1cGRhdGVkLiBXaGVuIG5ldyBzZXQgbWVtYmVyIGlzIGZvdW5kLCB0aGVyZSBpcyBjYWxsYmFjayBjYWxsZWQgdG8gdXBwZXIKLSAqIGxheWVyIHdpdGggdGhlIGFkZHJlc3MgYW5kIGdyb3VwIGlkIGZvciB3aGljaCBtZW1iZXIgaGFzIGJlZW4gZm91bmQuIER1cmluZwotICogdGhpcyB0aW1lIFNlYXJjaCBpcyBzdG9wcGVkLiBVcHBlciBsYXllcnMgYm9uZHMgbmV3IGRldmljZXMgYW5kIGNvbm5lY3QgTGUKLSAqIEF1ZGlvIHByb2ZpbGUuIElmIHRoZXJlIGFyZSBvdGhlciBtZW1iZXJzIHRvIGZpbmQsIGltcGxlbWVudGF0aW9ucyByZXBlYXRzCi0gKiB0aGUgcHJvY2VkdXJlLgotICoKLSAqLwotCi1jbGFzcyBDc2lzQ2xpZW50SW1wbCA6IHB1YmxpYyBDc2lzQ2xpZW50IHsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IENTSVNfU1RPUkFHRV9DVVJSRU5UX0xBWU9VVF9NQUdJQyA9IDB4MTA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IENTSVNfU1RPUkFHRV9IRUFERVJfU1ogPQotICAgICAgc2l6ZW9mKENTSVNfU1RPUkFHRV9DVVJSRU5UX0xBWU9VVF9NQUdJQykgKwotICAgICAgc2l6ZW9mKHVpbnQ4X3QpOyAvKiBudW1fb2Zfc2V0cyAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBDU0lTX1NUT1JBR0VfRU5UUllfU1ogPQotICAgICAgc2l6ZW9mKHVpbnQ4X3QpIC8qIHNldF9pZCAqLyArIHNpemVvZih1aW50OF90KSAvKiBkZXNpcmVkX3NpemUgKi8gKwotICAgICAgT2N0ZXQxNigpLnNpemUoKTsKLQotIHB1YmxpYzoKLSAgQ3Npc0NsaWVudEltcGwoYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgIENsb3N1cmUgaW5pdENiKQotICAgICAgOiBnYXR0X2lmXygwKSwgY2FsbGJhY2tzXyhjYWxsYmFja3MpIHsKLSAgICBCVEFfR0FUVENfQXBwUmVnaXN0ZXIoCi0gICAgICAgIFtdKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgICAgICAgICBpZiAoaW5zdGFuY2UgJiYgcF9kYXRhKSBpbnN0YW5jZS0+R2F0dGNDYWxsYmFjayhldmVudCwgcF9kYXRhKTsKLSAgICAgICAgfSwKLSAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgIFtdKENsb3N1cmUgaW5pdENiLCB1aW50OF90IGNsaWVudF9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW4ndCBzdGFydCBDb29yZGluYXRlZCBTZXQgU2VydmljZSBjbGllbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2ZpbGUgLSBubyBnYXR0IGNsaWVudHMgbGVmdCEiOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpbnN0YW5jZS0+Z2F0dF9pZl8gPSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgIGluaXRDYi5SdW4oKTsKLQotICAgICAgICAgICAgICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoZGV2aWNlX2dyb3VwX2NhbGxiYWNrcyk7Ci0gICAgICAgICAgICAgIGluc3RhbmNlLT5kZXZfZ3JvdXBzXyA9IERldmljZUdyb3Vwczo6R2V0KCk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgaW5pdENiKSwKLSAgICAgICAgdHJ1ZSk7Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQmFja2dyb3VuZCBzY2FuIGVuYWJsZWQiOwotICAgIENzaXNPYnNlcnZlclNldEJhY2tncm91bmQodHJ1ZSk7Ci0gIH0KLQotICB+Q3Npc0NsaWVudEltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6Y3Npczo6Q3Npc0dyb3VwPiBBc3NpZ25Dc2lzR3JvdXAoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQsCi0gICAgICBib29sIGNyZWF0ZV9ncm91cF9pZl9ub25fZXhpc3RpbmcsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCkgewotICAgIGF1dG8gY3Npc19ncm91cCA9IEZpbmRDc2lzR3JvdXAoZ3JvdXBfaWQpOwotICAgIGlmICghY3Npc19ncm91cCkgewotICAgICAgaWYgKGNyZWF0ZV9ncm91cF9pZl9ub25fZXhpc3RpbmcpIHsKLSAgICAgICAgLyogTGV0J3MgY3JlYXRlIGEgZ3JvdXAgKi8KLSAgICAgICAgYXV0byBnID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KGdyb3VwX2lkLCB1dWlkKTsKLSAgICAgICAgY3Npc19ncm91cHNfLnB1c2hfYmFjayhnKTsKLSAgICAgICAgY3Npc19ncm91cCA9IEZpbmRDc2lzR3JvdXAoZ3JvdXBfaWQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBNaXNzaW5nIGdyb3VwIC0gdGhhdCBzaGFsbCBub3QgaGFwcGVuIjsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBkZXZpY2UgPSBGaW5kRGV2aWNlQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgYXV0byBkZXYgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNEZXZpY2U+KGFkZHJlc3MsIGZhbHNlKTsKLSAgICAgIGRldmljZXNfLnB1c2hfYmFjayhkZXYpOwotICAgICAgZGV2aWNlID0gRmluZERldmljZUJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBpZiAoIWNzaXNfZ3JvdXAtPklzRGV2aWNlSW5UaGVHcm91cChkZXZpY2UpKSBjc2lzX2dyb3VwLT5BZGREZXZpY2UoZGV2aWNlKTsKLQotICAgIHJldHVybiBjc2lzX2dyb3VwOwotICB9Ci0KLSAgdm9pZCBPbkdyb3VwQWRkZWRDYihjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX2lkKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzcyA8PCAiIHV1aWQ6ICIgPDwgdXVpZAotICAgICAgICAgICAgICAgPDwgIiBncm91cF9pZDogIiA8PCBncm91cF9pZDsKLQotICAgIEFzc2lnbkNzaXNHcm91cChhZGRyZXNzLCBncm91cF9pZCwgdHJ1ZSwgdXVpZCk7Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBNZW1iZXJBZGRlZENiKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBncm91cF9pZCkgewotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgIDw8ICIgZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0KLSAgICBBc3NpZ25Dc2lzR3JvdXAoYWRkcmVzcywgZ3JvdXBfaWQsIGZhbHNlLCBVdWlkOjprRW1wdHkpOwotICB9Ci0KLSAgdm9pZCBPbkdyb3VwUmVtb3ZlZENiKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwgaW50IGdyb3VwX2lkKSB7Ci0gICAgUmVtb3ZlQ3Npc0dyb3VwKGdyb3VwX2lkKTsKLSAgfQotCi0gIHZvaWQgT25Hcm91cE1lbWJlclJlbW92ZWRDYihjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgYWRkcmVzcyA8PCAiIGdyb3VwX2lkOiAiIDw8IGdyb3VwX2lkOwotCi0gICAgYXV0byBkZXZpY2UgPSBGaW5kRGV2aWNlQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmIChkZXZpY2UpIFJlbW92ZUNzaXNEZXZpY2UoZGV2aWNlLCBncm91cF9pZCk7Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBBZGRGcm9tU3RvcmFnZUNiKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLCBpbnQgZ3JvdXBfaWQpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKGRldmljZSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICBhdXRvIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGdyb3VwX2lkKTsKLSAgICBpZiAoY3Npc19ncm91cCA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJ0aGUgY3NpcyBncm91cCAoaWQ6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICAgICAgICAgPDwgIikgZG9lcyBub3QgZXhpc3QiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghY3Npc19ncm91cC0+SXNEZXZpY2VJblRoZUdyb3VwKGRldmljZSkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgInRoZSBjc2lzIGdyb3VwIChpZDogIiA8PCBncm91cF9pZAotICAgICAgICAgICAgICAgICA8PCAiKSBkb2VzIGNvbnRhaW4gdGhlIGRldmljZTogIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjc2lzX2dyb3VwLT5HZXRVdWlkKCkgPT0gVXVpZDo6a0VtcHR5KSB7Ci0gICAgICBjc2lzX2dyb3VwLT5TZXRVdWlkKHV1aWQpOwotICAgIH0KLQotICAgIGNhbGxiYWNrc18tPk9uRGV2aWNlQXZhaWxhYmxlKGRldmljZS0+YWRkciwgY3Npc19ncm91cC0+R2V0R3JvdXBJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaXNfZ3JvdXAtPkdldERlc2lyZWRTaXplKCksIHV1aWQpOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgYWRkcmVzczsKLQotICAgIGF1dG8gZGV2aWNlID0gRmluZERldmljZUJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIGRldmljZXNfLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPENzaXNEZXZpY2U+KGFkZHJlc3MsIHRydWUpKTsKLSAgICB9IGVsc2UgewotICAgICAgZGV2aWNlLT5jb25uZWN0aW5nX2FjdGl2ZWx5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBCVEFfR0FUVENfT3BlbihnYXR0X2lmXywgYWRkcmVzcywgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIG92ZXJyaWRlIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgYWRkcjsKLQotICAgIGJ0aWZfc3RvcmFnZV9zZXRfY3Npc19hdXRvY29ubmVjdChhZGRyLCBmYWxzZSk7Ci0KLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MoYWRkcik7Ci0gICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogUmVtb3ZlcyBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zIG9yIHJlZ2lzdHJhdGlvbnMgZm9yIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAoZGV2aWNlLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZ2F0dF9pZl8sIGFkZHIsIGZhbHNlKTsKLSAgICAgIERvRGlzY29ubmVjdENsZWFuVXAoZGV2aWNlKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSBvdmVycmlkZSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IGFkZHI7Ci0KLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MoYWRkcik7Ci0gICAgaWYgKCFkZXZpY2UpIHJldHVybjsKLQotICAgIERpc2Nvbm5lY3QoYWRkcik7Ci0KLSAgICBkZXZfZ3JvdXBzXy0+UmVtb3ZlRGV2aWNlKGFkZHIpOwotICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfY3Npc19kZXZpY2UoYWRkcik7Ci0gIH0KLQotICBpbnQgR2V0R3JvdXBJZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBVdWlkIHV1aWQpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MoYWRkcik7Ci0gICAgaWYgKGRldmljZSA9PSBudWxscHRyKSByZXR1cm4gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd247Ci0KLSAgICBpbnQgZ3JvdXBfaWQgPSBkZXZfZ3JvdXBzXy0+R2V0R3JvdXBJZChhZGRyLCB1dWlkKTsKLSAgICBhdXRvIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGdyb3VwX2lkKTsKLSAgICBpZiAoY3Npc19ncm91cCA9PSBudWxscHRyKSByZXR1cm4gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd247Ci0KLSAgICByZXR1cm4gY3Npc19ncm91cC0+R2V0R3JvdXBJZCgpOwotICB9Ci0KLSAgdm9pZCBIYW5kbGVDc2lzTG9ja1Byb2NlZHVyZUVycm9yKAotICAgICAgc3RkOjpzaGFyZWRfcHRyPENzaXNHcm91cD4mIGNzaXNfZ3JvdXAsCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8Q3Npc0RldmljZT4mIGNzaXNfZGV2aWNlLAotICAgICAgQ3Npc0dyb3VwTG9ja1N0YXR1cyBzdGF0dXMgPQotICAgICAgICAgIENzaXNHcm91cExvY2tTdGF0dXM6OkZBSUxFRF9MT0NLRURfQllfT1RIRVIpIHsKLSAgICAvKiBDbGVhciBpbmZvcm1hdGlvbiBhYm91dCBvbmdvaW5nIGxvY2sgcHJvY2VkdXJlICovCi0gICAgQ3Npc0xvY2tDYiBjYiA9IGNzaXNfZ3JvdXAtPkdldExvY2tDYigpOwotICAgIGNzaXNfZ3JvdXAtPlNldFRhcmdldExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUKTsKLQotICAgIGludCBncm91cF9pZCA9IGNzaXNfZ3JvdXAtPkdldEdyb3VwSWQoKTsKLSAgICBDc2lzTG9ja1N0YXRlIGN1cnJlbnRfbG9ja19zdGF0ZSA9IGNzaXNfZ3JvdXAtPkdldEN1cnJlbnRMb2NrU3RhdGUoKTsKLSAgICAvKiBTZW5kIHVubG9jayB0byBwcmV2aW91cyBkZXZpY2VzLiBJdCBzaGFsbCBiZSBkb25lIGluIHJldmVyc2Ugb3JkZXIuICovCi0gICAgYXV0byBwcmV2X2RldiA9IGNzaXNfZ3JvdXAtPkdldFByZXZEZXZpY2UoY3Npc19kZXZpY2UpOwotICAgIHdoaWxlIChwcmV2X2RldikgewotICAgICAgaWYgKHByZXZfZGV2LT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgIGF1dG8gcHJldl9jc2lzX2luc3RhbmNlID0gcHJldl9kZXYtPkdldENzaXNJbnN0YW5jZUJ5R3JvdXBJZChncm91cF9pZCk7Ci0gICAgICAgIExPR19BU1NFUlQocHJldl9jc2lzX2luc3RhbmNlKSA8PCAiIHByZXZfY3Npc19pbnN0YW5jZSBkb2VzIG5vdCBleGlzdCEiOwotICAgICAgICBTZXRMb2NrKHByZXZfZGV2LCBwcmV2X2NzaXNfaW5zdGFuY2UsIGN1cnJlbnRfbG9ja19zdGF0ZSk7Ci0gICAgICB9Ci0gICAgICBwcmV2X2RldiA9IGNzaXNfZ3JvdXAtPkdldFByZXZEZXZpY2UocHJldl9kZXYpOwotICAgIH0KLSAgICAvKiBDYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrICovCi0gICAgTm90aWZ5R3JvdXBTdGF0dXMoZ3JvdXBfaWQsIGZhbHNlLCBzdGF0dXMsIHN0ZDo6bW92ZShjYikpOwotICB9Ci0KLSAgdm9pZCBPbkdhdHRDc2lzV3JpdGVMb2NrUnNwKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHZvaWQqIGRhdGEpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBEZXZpY2Ugbm90IHRoZXJlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgZ3JvdXBfaWQgPSBQVFJfVE9fVUlOVChkYXRhKTsKLSAgICBhdXRvIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGdyb3VwX2lkKTsKLSAgICBpZiAoY3Npc19ncm91cCA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgVGhlcmUgaXMgbm8gZ3JvdXA/ICIgPDwgZ3JvdXBfaWQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ3Npc0xvY2tTdGF0ZSB0YXJnZXRfbG9ja19zdGF0ZSA9IGNzaXNfZ3JvdXAtPkdldFRhcmdldExvY2tTdGF0ZSgpOwotICAgIGlmICh0YXJnZXRfbG9ja19zdGF0ZSA9PSBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUKSByZXR1cm47Ci0KLSAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUyAmJgotICAgICAgICBzdGF0dXMgIT0gYmx1ZXRvb3RoOjpjc2lzOjprQ3Npc0Vycm9yQ29kZUxvY2tBbHJlYWR5R3JhbnRlZCkgewotICAgICAgaWYgKHRhcmdldF9sb2NrX3N0YXRlID09IENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5MT0NLRUQpIHsKLSAgICAgICAgLyogV2hlbiB1bmxvY2tpbmcganVzdCBkcm9wIHRoZSBjb3VudGVyIG9uIGVycm9yIGFuZCB0aGF0IGlzIGl0ICovCi0gICAgICAgIGNzaXNfZ3JvdXAtPlVwZGF0ZUxvY2tUcmFuc2l0aW9uQ250KC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBJbiBjYXNlIG9mIEdBVFQgRVJST1IgKi8KLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBJbmNvcnJlY3Qgd3JpdGUgc3RhdHVzICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KChpbnQpKHN0YXR1cykpOwotCi0gICAgICAvKiBVbmxvY2sgcHJldmlvdXMgZGV2aWNlcyAqLwotICAgICAgSGFuZGxlQ3Npc0xvY2tQcm9jZWR1cmVFcnJvcihjc2lzX2dyb3VwLCBkZXZpY2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEFsbCBpcyBnb29kLCBjb250aW51ZS4gVHJ5IHRvIHNlbmQgbG9jayB0byBvdGhlciBkZXZpY2VzLiovCi0gICAgYXV0byBjc2lzX2luc3RhbmNlID0gZGV2aWNlLT5HZXRDc2lzSW5zdGFuY2VCeUdyb3VwSWQoZ3JvdXBfaWQpOwotICAgIExPR19BU1NFUlQoY3Npc19pbnN0YW5jZSkgPDwgIiBjc2lzX2luc3RhbmNlIGRvZXMgbm90IGV4aXN0ISI7Ci0gICAgY3Npc19pbnN0YW5jZS0+U2V0TG9ja1N0YXRlKHRhcmdldF9sb2NrX3N0YXRlKTsKLQotICAgIGlmIChjc2lzX2dyb3VwLT5HZXRMb2NrVHJhbnNpdGlvbkNudCgpID09IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBOb3QgZXhwZWN0ZWQgbG9jayBzdGF0ZSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNzaXNfZ3JvdXAtPlVwZGF0ZUxvY2tUcmFuc2l0aW9uQ250KC0xKSA9PSAwKSB7Ci0gICAgICBjc2lzX2dyb3VwLT5TZXRDdXJyZW50TG9ja1N0YXRlKGNzaXNfZ3JvdXAtPkdldFRhcmdldExvY2tTdGF0ZSgpKTsKLSAgICAgIENzaXNMb2NrQ29tcGxldGVkKAotICAgICAgICAgIGNzaXNfZ3JvdXAsCi0gICAgICAgICAgY3Npc19ncm91cC0+R2V0Q3VycmVudExvY2tTdGF0ZSgpID09IENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VELAotICAgICAgICAgIENzaXNHcm91cExvY2tTdGF0dXM6OlNVQ0NFU1MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh0YXJnZXRfbG9ja19zdGF0ZSA9PSBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX0xPQ0tFRCkgewotICAgICAgc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+IG5leHRfZGV2OwotCi0gICAgICBkbyB7Ci0gICAgICAgIG5leHRfZGV2ID0gY3Npc19ncm91cC0+R2V0TmV4dERldmljZShkZXZpY2UpOwotICAgICAgICBpZiAoIW5leHRfZGV2KSBicmVhazsKLSAgICAgIH0gd2hpbGUgKCFuZXh0X2Rldi0+SXNDb25uZWN0ZWQoKSk7Ci0KLSAgICAgIGlmIChuZXh0X2RldikgewotICAgICAgICBhdXRvIG5leHRfY3Npc19pbnN0ID0gbmV4dF9kZXYtPkdldENzaXNJbnN0YW5jZUJ5R3JvdXBJZChncm91cF9pZCk7Ci0gICAgICAgIExPR19BU1NFUlQoY3Npc19pbnN0YW5jZSkgPDwgIiBjc2lzX2luc3RhbmNlIGRvZXMgbm90IGV4aXN0ISI7Ci0gICAgICAgIGlmIChuZXh0X2NzaXNfaW5zdC0+R2V0TG9ja1N0YXRlKCkgPT0KLSAgICAgICAgICAgIENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VEKSB7Ci0gICAgICAgICAgLyogU29tZWJvZHkgZWxzZSBtYW5hZ2VkIHRvIGxvY2sgaXQuCi0gICAgICAgICAgICogVW5sb2NrIHByZXZpb3VzIGRldmljZXMKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIYW5kbGVDc2lzTG9ja1Byb2NlZHVyZUVycm9yKGNzaXNfZ3JvdXAsIGRldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNldExvY2sobmV4dF9kZXYsIG5leHRfY3Npc19pbnN0LCBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX0xPQ0tFRCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTZXRMb2NrKHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiYgZGV2aWNlLAotICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENzaXNJbnN0YW5jZT4mIGNzaXNfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICBDc2lzTG9ja1N0YXRlIGxvY2spIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSA9IHsKLSAgICAgICAgKHN0ZDo6dW5kZXJseWluZ190eXBlPENzaXNMb2NrU3RhdGU+Ojp0eXBlKWxvY2t9OwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBkZXZpY2UtPmFkZHIKLSAgICAgICAgICAgICAgPDwgIiByYW5rOiAiIDw8IGludChjc2lzX2luc3RhbmNlLT5HZXRSYW5rKCkpIDw8ICIgY29ubl9pZCAiCi0gICAgICAgICAgICAgIDw8IGRldmljZS0+Y29ubl9pZCA8PCAiIGhhbmRsZSAiCi0gICAgICAgICAgICAgIDw8IGxvZ2hleCgrKGNzaXNfaW5zdGFuY2UtPnN2Y19kYXRhLmxvY2tfaGFuZGxlLnZhbF9oZGwpKTsKLQotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgZGV2aWNlLT5jb25uX2lkLCBjc2lzX2luc3RhbmNlLT5zdmNfZGF0YS5sb2NrX2hhbmRsZS52YWxfaGRsLCB2YWx1ZSwKLSAgICAgICAgR0FUVF9XUklURSwKLSAgICAgICAgW10odWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgICAgaWYgKGluc3RhbmNlKQotICAgICAgICAgICAgaW5zdGFuY2UtPk9uR2F0dENzaXNXcml0ZUxvY2tSc3AoY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGRhdGEpOwotICAgICAgICB9LAotICAgICAgICBVSU5UX1RPX1BUUihjc2lzX2luc3RhbmNlLT5HZXRHcm91cElkKCkpKTsKLSAgfQotCi0gIHZvaWQgTm90aWZ5R3JvdXBTdGF0dXMoaW50IGdyb3VwX2lkLCBib29sIGxvY2ssIENzaXNHcm91cExvY2tTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENzaXNMb2NrQ2IgY2IpIHsKLSAgICBjYWxsYmFja3NfLT5Pbkdyb3VwTG9ja0NoYW5nZWQoZ3JvdXBfaWQsIGxvY2ssIHN0YXR1cyk7Ci0gICAgaWYgKGNiKSBzdGQ6Om1vdmUoY2IpLlJ1bihncm91cF9pZCwgbG9jaywgc3RhdHVzKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IEdldERldmljZUxpc3QoaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gcmVzdWx0OwotICAgIGF1dG8gY3Npc19ncm91cCA9IEZpbmRDc2lzR3JvdXAoZ3JvdXBfaWQpOwotCi0gICAgaWYgKCFjc2lzX2dyb3VwIHx8IGNzaXNfZ3JvdXAtPklzRW1wdHkoKSkgcmV0dXJuIHJlc3VsdDsKLQotICAgIGF1dG8gY3Npc19kZXZpY2UgPSBjc2lzX2dyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICAgIHdoaWxlIChjc2lzX2RldmljZSkgewotICAgICAgcmVzdWx0LnB1c2hfYmFjayhjc2lzX2RldmljZS0+YWRkcik7Ci0gICAgICBjc2lzX2RldmljZSA9IGNzaXNfZ3JvdXAtPkdldE5leHREZXZpY2UoY3Npc19kZXZpY2UpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICB2b2lkIExvY2tHcm91cChpbnQgZ3JvdXBfaWQsIGJvb2wgbG9jaywgQ3Npc0xvY2tDYiBjYikgb3ZlcnJpZGUgewotICAgIGlmIChsb2NrKQotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIExvY2tpbmcgZ3JvdXA6ICIgPDwgaW50KGdyb3VwX2lkKTsKLSAgICBlbHNlCi0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgVW5sb2NraW5nIGdyb3VwOiAiIDw8IGludChncm91cF9pZCk7Ci0KLSAgICAvKiBGb3Igbm93IHdlIHRyeSB0byBsb2NrIG9ubHkgY29ubmVjdGVkIGRldmljZXMgaW4gdGhlIGdyb3VwCi0gICAgICogVE9ETzogV2UgY2FuIGNvbnNpZGVyIHJlY29ubmVjdGVkIHRvIG5vdCBjb25uZWN0ZWQgZGV2aWNlcyBhbmQgdGhlbgotICAgICAqIGxvY2tlZCB0aGVtCi0gICAgICovCi0gICAgYXV0byBjc2lzX2dyb3VwID0gRmluZENzaXNHcm91cChncm91cF9pZCk7Ci0gICAgaWYgKGNzaXNfZ3JvdXAgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEdyb3VwIG5vdCBmb3VuZDogIiA8PCBncm91cF9pZDsKLSAgICAgIE5vdGlmeUdyb3VwU3RhdHVzKGdyb3VwX2lkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENzaXNHcm91cExvY2tTdGF0dXM6OkZBSUxFRF9JTlZBTElEX0dST1VQLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNzaXNfZ3JvdXAtPklzRW1wdHkoKSkgewotICAgICAgTm90aWZ5R3JvdXBTdGF0dXMoZ3JvdXBfaWQsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja1N0YXR1czo6RkFJTEVEX0dST1VQX0VNUFRZLCBzdGQ6Om1vdmUoY2IpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY3Npc19ncm91cC0+R2V0VGFyZ2V0TG9ja1N0YXRlKCkgIT0gQ3Npc0xvY2tTdGF0ZTo6Q1NJU19TVEFURV9VTlNFVCkgewotICAgICAgLyogQ1NJUyBvcGVyYXRpb24gb25nb2luZyAqLwotCi0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTG9jayBvcGVyYXRpb24gb25nb2luZzoiCi0gICAgICAgICAgICAgICAgIDw8ICJncm91cCBpZDogIiA8PCBncm91cF9pZCA8PCAidGFyZ2V0IHN0YXRlICIKLSAgICAgICAgICAgICAgICAgPDwgKGNzaXNfZ3JvdXAtPkdldFRhcmdldExvY2tTdGF0ZSgpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VECi0gICAgICAgICAgICAgICAgICAgICAgICAgPyAibG9jayIKLSAgICAgICAgICAgICAgICAgICAgICAgICA6ICJ1bmxvY2siKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDc2lzTG9ja1N0YXRlIG5ld19sb2NrX3N0YXRlID0gbG9jayA/IENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOTE9DS0VEOwotCi0gICAgaWYgKGNzaXNfZ3JvdXAtPkdldEN1cnJlbnRMb2NrU3RhdGUoKSA9PSBuZXdfbG9ja19zdGF0ZSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdGhpbmcgdG8gZG8gYXMgcmVxdWVzdGVkIGxvY2sgaXMgdGhlcmUiOwotICAgICAgTm90aWZ5R3JvdXBTdGF0dXMoZ3JvdXBfaWQsIGxvY2ssIENzaXNHcm91cExvY2tTdGF0dXM6OlNVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2IpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobG9jayAmJiAhY3Npc19ncm91cC0+SXNBdmFpbGFibGVGb3JDc2lzTG9ja09wZXJhdGlvbigpKSB7Ci0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgR3JvdXAgIiA8PCBncm91cF9pZCA8PCAiIGxvY2tlZCBieSBvdGhlciI7Ci0gICAgICBOb3RpZnlHcm91cFN0YXR1cyhncm91cF9pZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBDc2lzR3JvdXBMb2NrU3RhdHVzOjpGQUlMRURfTE9DS0VEX0JZX09USEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY3Npc19ncm91cC0+U2V0VGFyZ2V0TG9ja1N0YXRlKG5ld19sb2NrX3N0YXRlLCBzdGQ6Om1vdmUoY2IpKTsKLQotICAgIGlmIChsb2NrKSB7Ci0gICAgICAvKiBJbiBsb2NraW5nIGNhc2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgbG9jayBhbGwgdGhlIGRldmljZQotICAgICAgICogYW5kIHRoYXQgaW4gY2FzZSBvZiBlcnJvciBvbiB0aGUgd2F5IHRvIGxvY2sgdGhlIGdyb3VwLCB3ZQotICAgICAgICogY2FuIHJldmVydCBsb2NrIHByZXZpb3VzbHkgbG9ja2VkIGRldmljZXMgYXMgcGVyIHNwZWNpZmljYXRpb24uCi0gICAgICAgKi8KLSAgICAgIGF1dG8gY3Npc19kZXZpY2UgPSBjc2lzX2dyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICAgICAgYXV0byBjc2lzX2luc3RhbmNlID0gY3Npc19kZXZpY2UtPkdldENzaXNJbnN0YW5jZUJ5R3JvdXBJZChncm91cF9pZCk7Ci0gICAgICBMT0dfQVNTRVJUKGNzaXNfaW5zdGFuY2UpIDw8ICIgY3Npc19pbnN0YW5jZSBkb2VzIG5vdCBleGlzdCEiOwotICAgICAgU2V0TG9jayhjc2lzX2RldmljZSwgY3Npc19pbnN0YW5jZSwgbmV3X2xvY2tfc3RhdGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBGb3IgdW5sb2NraW5nLCB3ZSBkb24ndCBoYXZlIHRvIG1vbml0b3Igc3RhdHVzIG9mIHVubG9ja2luZyBkZXZpY2UsCi0gICAgICAgKiB0aGVyZWZvcmUsIHdlIGNhbiBqdXN0IHNlbmQgdW5sb2NrIHRvIGFsbCBvZiB0aGVtLCBpbiBvcG9zaXRlIHJhbmsKLSAgICAgICAqIG9yZGVyIGFuZCBjaGVjayBpZiB3ZSBnZXQgbmV3IHN0YXRlIG5vdGlmaWNhdGlvbi4KLSAgICAgICAqLwotICAgICAgYXV0byBjc2lzX2RldmljZSA9IGNzaXNfZ3JvdXAtPkdldExhc3REZXZpY2UoKTsKLSAgICAgIGF1dG8gY3Npc19pbnN0YW5jZSA9IGNzaXNfZGV2aWNlLT5HZXRDc2lzSW5zdGFuY2VCeUdyb3VwSWQoZ3JvdXBfaWQpOwotICAgICAgTE9HX0FTU0VSVChjc2lzX2luc3RhbmNlKSA8PCAiIGNzaXNfaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QhIjsKLSAgICAgIHdoaWxlIChjc2lzX2RldmljZSkgewotICAgICAgICBpZiAoKGNzaXNfZGV2aWNlLT5Jc0Nvbm5lY3RlZCgpKSAmJgotICAgICAgICAgICAgKChjc2lzX2luc3RhbmNlLT5HZXRMb2NrU3RhdGUoKSAhPSBuZXdfbG9ja19zdGF0ZSkpKSB7Ci0gICAgICAgICAgY3Npc19ncm91cC0+VXBkYXRlTG9ja1RyYW5zaXRpb25DbnQoMSk7Ci0gICAgICAgICAgU2V0TG9jayhjc2lzX2RldmljZSwgY3Npc19pbnN0YW5jZSwgbmV3X2xvY2tfc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGNzaXNfZGV2aWNlID0gY3Npc19ncm91cC0+R2V0UHJldkRldmljZShjc2lzX2RldmljZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBTZXJpYWxpemVTZXRzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBvdXQpIGNvbnN0IHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MoYWRkcik7Ci0gICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBTa2lwcGluZyB1bmtub3duIGRldmljZSBhZGRyPSAiIDw8IGFkZHI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGRldmljZS0+R2V0TnVtYmVyT2ZDc2lzSW5zdGFuY2VzKCkgPT0gMCkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgTm8gQ1NJUyBpbnN0YW5jZXMgZm9yIGFkZHI9ICIgPDwgYWRkcjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGRldmljZS0+YWRkcjsKLQotICAgIGF1dG8gbnVtX3NldHMgPSBkZXZpY2UtPkdldE51bWJlck9mQ3Npc0luc3RhbmNlcygpOwotICAgIGlmICgobnVtX3NldHMgPT0gMCkgfHwgKG51bV9zZXRzID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgb3V0LnJlc2l6ZShDU0lTX1NUT1JBR0VfSEVBREVSX1NaICsgKG51bV9zZXRzICogQ1NJU19TVE9SQUdFX0VOVFJZX1NaKSk7Ci0gICAgYXV0byogcHRyID0gb3V0LmRhdGEoKTsKLQotICAgIC8qIGhlYWRlciAqLwotICAgIFVJTlQ4X1RPX1NUUkVBTShwdHIsIENTSVNfU1RPUkFHRV9DVVJSRU5UX0xBWU9VVF9NQUdJQyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHB0ciwgbnVtX3NldHMpOwotCi0gICAgLyogc2V0IGVudHJpZXMgKi8KLSAgICBkZXZpY2UtPkZvckVhY2hDc2lzSW5zdGFuY2UoCi0gICAgICAgIFsmXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q3Npc0luc3RhbmNlPiYgY3Npc19pbnN0KSB7Ci0gICAgICAgICAgYXV0byBnaWQgPSBjc2lzX2luc3QtPkdldEdyb3VwSWQoKTsKLSAgICAgICAgICBhdXRvIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGdpZCk7Ci0gICAgICAgICAgaWYgKGNzaXNfZ3JvdXAgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2VyaWFsaXplU2V0czogTm8gbWF0Y2hpbmcgZ3JvdXAgZm91bmQhIjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocHRyLCBnaWQpOwotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwdHIsIGNzaXNfZ3JvdXAtPkdldERlc2lyZWRTaXplKCkpOwotICAgICAgICAgIE9jdGV0MTYgc2lyayA9IGNzaXNfZ3JvdXAtPkdldFNpcmsoKTsKLSAgICAgICAgICBtZW1jcHkocHRyLCBzaXJrLmRhdGEoKSwgc2lyay5zaXplKCkpOwotICAgICAgICAgIHB0ciArPSBzaXJrLnNpemUoKTsKLSAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgRGVzZXJpYWxpemVTZXRzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbikgewotICAgIGlmIChpbi5zaXplKCkgPCBDU0lTX1NUT1JBR0VfSEVBREVSX1NaICsgQ1NJU19TVE9SQUdFX0VOVFJZX1NaKSByZXR1cm47Ci0gICAgYXV0byogcHRyID0gaW4uZGF0YSgpOwotCi0gICAgdWludDhfdCBtYWdpYzsKLSAgICBTVFJFQU1fVE9fVUlOVDgobWFnaWMsIHB0cik7Ci0KLSAgICBpZiAobWFnaWMgPT0gQ1NJU19TVE9SQUdFX0NVUlJFTlRfTEFZT1VUX01BR0lDKSB7Ci0gICAgICB1aW50OF90IG51bV9zZXRzOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KG51bV9zZXRzLCBwdHIpOwotCi0gICAgICBpZiAoaW4uc2l6ZSgpIDwKLSAgICAgICAgICBDU0lTX1NUT1JBR0VfSEVBREVSX1NaICsgKG51bV9zZXRzICogQ1NJU19TVE9SQUdFX0VOVFJZX1NaKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBlcnNpc3RlbnQgc3RvcmFnZSBkYXRhIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBzZXRzIGVudHJpZXMgKi8KLSAgICAgIHdoaWxlIChudW1fc2V0cy0tKSB7Ci0gICAgICAgIHVpbnQ4X3QgZ2lkOwotICAgICAgICBPY3RldDE2IHNpcms7Ci0gICAgICAgIHVpbnQ4X3Qgc2l6ZTsKLQotICAgICAgICBTVFJFQU1fVE9fVUlOVDgoZ2lkLCBwdHIpOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDgoc2l6ZSwgcHRyKTsKLSAgICAgICAgU1RSRUFNX1RPX0FSUkFZKHNpcmsuZGF0YSgpLCBwdHIsIChpbnQpc2lyay5zaXplKCkpOwotCi0gICAgICAgIC8vIFNldCBncm91cGluZyBhbmQgU0lSSwotICAgICAgICBhdXRvIGNzaXNfZ3JvdXAgPSBBc3NpZ25Dc2lzR3JvdXAoYWRkciwgZ2lkLCB0cnVlLCBVdWlkOjprRW1wdHkpOwotICAgICAgICBjc2lzX2dyb3VwLT5TZXREZXNpcmVkU2l6ZShzaXplKTsKLSAgICAgICAgY3Npc19ncm91cC0+U2V0U2lyayhzaXJrKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIEFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9jb25uZWN0KSB7Ci0gICAgRGVzZXJpYWxpemVTZXRzKGFkZHIsIGluKTsKLQotICAgIGF1dG8gZGV2aWNlID0gRmluZERldmljZUJ5QWRkcmVzcyhhZGRyKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIGRldmljZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0RldmljZT4oYWRkciwgZmFsc2UpOwotICAgICAgZGV2aWNlc18ucHVzaF9iYWNrKGRldmljZSk7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBjc2lzX2dyb3VwIDogY3Npc19ncm91cHNfKSB7Ci0gICAgICBpZiAoIWNzaXNfZ3JvdXAtPklzRGV2aWNlSW5UaGVHcm91cChkZXZpY2UpKSBjb250aW51ZTsKLQotICAgICAgaWYgKGNzaXNfZ3JvdXAtPkdldFV1aWQoKSAhPSBVdWlkOjprRW1wdHkpIHsKLSAgICAgICAgY2FsbGJhY2tzXy0+T25EZXZpY2VBdmFpbGFibGUoZGV2aWNlLT5hZGRyLCBjc2lzX2dyb3VwLT5HZXRHcm91cElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaXNfZ3JvdXAtPkdldERlc2lyZWRTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaXNfZ3JvdXAtPkdldFV1aWQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGF1dG9jb25uZWN0KSB7Ci0gICAgICBCVEFfR0FUVENfT3BlbihnYXR0X2lmXywgYWRkciwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENsZWFuVXAoKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyKGdhdHRfaWZfKTsKLSAgICBmb3IgKGF1dG8mIGRldmljZSA6IGRldmljZXNfKSB7Ci0gICAgICBpZiAoZGV2aWNlLT5Jc0Nvbm5lY3RlZCgpKSBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIERvRGlzY29ubmVjdENsZWFuVXAoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBkZXZpY2VzXy5jbGVhcigpOwotCi0gICAgQ3Npc09ic2VydmVyU2V0QmFja2dyb3VuZChmYWxzZSk7Ci0gICAgZGV2X2dyb3Vwc18tPkNsZWFuVXAoZGV2aWNlX2dyb3VwX2NhbGxiYWNrcyk7Ci0gIH0KLQotICB2b2lkIER1bXAoaW50IGZkKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotCi0gICAgc3RyZWFtIDw8ICIgIEdyb3Vwc1xuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGcgOiBjc2lzX2dyb3Vwc18pIHsKLSAgICAgIHN0cmVhbSA8PCAiICAgID09IGlkOiAiIDw8IGctPkdldEdyb3VwSWQoKSA8PCAiID09XG4iCi0gICAgICAgICAgICAgPDwgIiAgICB1dWlkOiAiIDw8IGctPkdldFV1aWQoKSA8PCAiXG4iCi0gICAgICAgICAgICAgPDwgIiAgICBkZXNpcmVkIHNpemU6ICIgPDwgZy0+R2V0RGVzaXJlZFNpemUoKSA8PCAiXG4iCi0gICAgICAgICAgICAgPDwgIiAgICBkaXNjb3ZlcmFibGUgc3RhdGU6ICIKLSAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGctPkdldERpc2NvdmVyeVN0YXRlKCkpIDw8ICJcbiIKLSAgICAgICAgICAgICA8PCAiICAgIGN1cnJlbnQgbG9jayBzdGF0ZTogIgotICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oZy0+R2V0Q3VycmVudExvY2tTdGF0ZSgpKSA8PCAiXG4iCi0gICAgICAgICAgICAgPDwgIiAgICB0YXJnZXQgbG9jayBzdGF0ZTogIgotICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oZy0+R2V0VGFyZ2V0TG9ja1N0YXRlKCkpIDw8ICJcbiIKLSAgICAgICAgICAgICA8PCAiICAgIGRldmljZXM6IFxuIjsKLSAgICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlc18pIHsKLSAgICAgICAgaWYgKCFnLT5Jc0RldmljZUluVGhlR3JvdXAoZGV2aWNlKSkgY29udGludWU7Ci0KLSAgICAgICAgc3RyZWFtIDw8ICIgICAgICAgID09IGFkZHI6ICIgPDwgZGV2aWNlLT5hZGRyIDw8ICIgPT1cbiIKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgIGNzaXMgaW5zdGFuY2U6IGRhdGE6IgotICAgICAgICAgICAgICAgPDwgIlxuIjsKLQotICAgICAgICBhdXRvIGluc3RhbmNlID0gZGV2aWNlLT5HZXRDc2lzSW5zdGFuY2VCeUdyb3VwSWQoZy0+R2V0R3JvdXBJZCgpKTsKLSAgICAgICAgaWYgKCFpbnN0YW5jZSkgewotICAgICAgICAgIHN0cmVhbSA8PCAiICAgICAgICAgIE5vIGNzaXMgaW5zdGFuY2UgYXZhaWxhYmxlXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN0cmVhbSA8PCAiICAgICAgICAgIHJhbms6ICIgPDwgaW5zdGFuY2UtPkdldFJhbmsoKSA8PCAiXG4iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFkZXZpY2UtPklzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICBzdHJlYW0gPDwgIiAgICAgICAgTm90IGNvbm5lY3RlZFxuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdHJlYW0gPDwgIiAgICAgICAgQ29ubmVjdGVkIGNvbm5faWQgPSAiCi0gICAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGRldmljZS0+Y29ubl9pZCkgPDwgIlxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGRwcmludGYoZmQsICIlcyIsIHN0cmVhbS5zdHIoKS5jX3N0cigpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+IEZpbmREZXZpY2VCeUNvbm5JZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgYXV0byBpdCA9IGZpbmRfaWYoZGV2aWNlc18uYmVnaW4oKSwgZGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgQ3Npc0RldmljZTo6TWF0Y2hDb25uSWQoY29ubl9pZCkpOwotICAgIGlmIChpdCAhPSBkZXZpY2VzXy5lbmQoKSkgcmV0dXJuICgqaXQpOwotCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIFJlbW92ZUNzaXNEZXZpY2Uoc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+JiBkZXZpY2UsIGludCBncm91cF9pZCkgewotICAgIGF1dG8gaXQgPSBmaW5kX2lmKGRldmljZXNfLmJlZ2luKCksIGRldmljZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgIENzaXNEZXZpY2U6Ok1hdGNoQWRkcmVzcyhkZXZpY2UtPmFkZHIpKTsKLSAgICBpZiAoaXQgPT0gZGV2aWNlc18uZW5kKCkpIHJldHVybjsKLQotICAgIGlmIChncm91cF9pZCAhPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgewotICAgICAgYXV0byBjc2lzX2dyb3VwID0gRmluZENzaXNHcm91cChncm91cF9pZCk7Ci0gICAgICBpZiAoIWNzaXNfZ3JvdXApIHsKLSAgICAgICAgLyogVGhpcyBjb3VsZCBoYXBwZW4gd2hlbiByZW1vdmUgZGV2aWNlIGlzIGNhbGxlZCB3aGVuIGJvbmRpbmcgaXMKLSAgICAgICAgICogcmVtb3ZlZCAqLwotICAgICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXAgbm90IGZvdW5kICIgPDwgZ3JvdXBfaWQ7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY3Npc19ncm91cC0+UmVtb3ZlRGV2aWNlKGRldmljZS0+YWRkcik7Ci0gICAgICBpZiAoY3Npc19ncm91cC0+SXNFbXB0eSgpKSB7Ci0gICAgICAgIFJlbW92ZUNzaXNHcm91cChncm91cF9pZCk7Ci0gICAgICB9Ci0gICAgICBkZXZpY2UtPlJlbW92ZUNzaXNJbnN0YW5jZShncm91cF9pZCk7Ci0gICAgfQotCi0gICAgaWYgKGRldmljZS0+R2V0TnVtYmVyT2ZDc2lzSW5zdGFuY2VzKCkgPT0gMCkgewotICAgICAgZGV2aWNlc18uZXJhc2UoaXQpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiBGaW5kRGV2aWNlQnlBZGRyZXNzKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgY29uc3QgewotICAgIGF1dG8gaXQgPSBmaW5kX2lmKGRldmljZXNfLmNiZWdpbigpLCBkZXZpY2VzXy5jZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgQ3Npc0RldmljZTo6TWF0Y2hBZGRyZXNzKGFkZHIpKTsKLSAgICBpZiAoaXQgIT0gZGV2aWNlc18uZW5kKCkpIHJldHVybiAoKml0KTsKLQotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPENzaXNHcm91cD4gRmluZENzaXNHcm91cChpbnQgZ3JvdXBfaWQpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0KLSAgICAgICAgZmluZF9pZihjc2lzX2dyb3Vwc18uY2JlZ2luKCksIGNzaXNfZ3JvdXBzXy5jZW5kKCksCi0gICAgICAgICAgICAgICAgW2dyb3VwX2lkXShhdXRvJiBnKSB7IHJldHVybiAoZ3JvdXBfaWQgPT0gZy0+R2V0R3JvdXBJZCgpKTsgfSk7Ci0KLSAgICBpZiAoaXQgPT0gY3Npc19ncm91cHNfLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLSAgICByZXR1cm4gKCppdCk7Ci0gIH0KLQotICB2b2lkIFJlbW92ZUNzaXNHcm91cChpbnQgZ3JvdXBfaWQpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBjc2lzX2dyb3Vwc18uYmVnaW4oKTsgaXQgIT0gY3Npc19ncm91cHNfLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoKCppdCktPkdldEdyb3VwSWQoKSA9PSBncm91cF9pZCkgewotICAgICAgICBjc2lzX2dyb3Vwc18uZXJhc2UoaXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogSGFuZGxlIGVuY3J5cHRpb24gKi8KLSAgdm9pZCBPbkVuY3J5cHRlZChzdGQ6OnNoYXJlZF9wdHI8Q3Npc0RldmljZT4mIGRldmljZSkgewotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGRldmljZS0+YWRkcjsKLQotICAgIGlmIChkZXZpY2UtPmlzX2dhdHRfc2VydmljZV92YWxpZCkgewotICAgICAgTm90aWZ5Q3Npc0RldmljZVZhbGlkQW5kU3RvcmVJZk5lZWRlZChkZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoZGV2aWNlLT5jb25uX2lkLCAma0NzaXNTZXJ2aWNlVXVpZCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBOb3RpZnlDc2lzRGV2aWNlVmFsaWRBbmRTdG9yZUlmTmVlZGVkKAotICAgICAgc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+JiBkZXZpY2UpIHsKLSAgICAvKiBOb3RpZnkgdGhhdCB3ZSBhcmUgcmVhZHkgdG8gZ28uIE5vdGljZSB0aGF0IG11bHRpcGxlIGNhbGxiYWNrIGNhbGxzCi0gICAgICogZm9yIGEgc2luZ2xlIGRldmljZSBhZGRyZXNzIGNhbiBiZSBjYWxsZWQgaWYgZGV2aWNlIGlzIGluIG1vcmUgdGhhbiBvbmUKLSAgICAgKiBDU0lTIGdyb3VwLgotICAgICAqLwotICAgIGJvb2wgbm90aWZ5X2Nvbm5lY3RlZCA9IGZhbHNlOwotICAgIGZvciAoY29uc3QgYXV0byYgY3Npc19ncm91cCA6IGNzaXNfZ3JvdXBzXykgewotICAgICAgaWYgKCFjc2lzX2dyb3VwLT5Jc0RldmljZUluVGhlR3JvdXAoZGV2aWNlKSkgY29udGludWU7Ci0KLSAgICAgIGludCBncm91cF9pZCA9IGNzaXNfZ3JvdXAtPkdldEdyb3VwSWQoKTsKLSAgICAgIGF1dG8gY3Npc19pbnN0YW5jZSA9IGRldmljZS0+R2V0Q3Npc0luc3RhbmNlQnlHcm91cElkKGdyb3VwX2lkKTsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBncm91cCBpZCAiIDw8IGdyb3VwX2lkOwotCi0gICAgICBpZiAoIWNzaXNfaW5zdGFuY2UpIHsKLSAgICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIHdoZW4gc29tZSBvdGhlciB1c2VyIGFkZGVkIGRldmljZSB0byBncm91cCBpbiB0aGUKLSAgICAgICAgICogY29udGV4dCB3aGljaCBpcyBub3QgZXhpc3Rpbmcgb24gdGhlIHBlZXIgc2lkZS4gZS5nLiBMZUF1ZGlvIGFkZGVkIGl0Ci0gICAgICAgICAqIGluIHRoZSBDQVAgY29udGV4dCwgYnV0IENTSVMgZXhpc3Qgb24gdGhlIHBlZXIgZGV2aWNlIHdpdGhvdXQgYQotICAgICAgICAgKiBjb250ZXh0LiBXZSB3aWxsIGVuZHVwIGluIGhhdmluZyBkZXZpY2UgaW4gMiBncm91cHMuIE9uZSBpbiBnZW5lcmljCi0gICAgICAgICAqIGNvbnRleHQgd2l0aCB2YWxpZCBjc2lzX2luc3RhbmNlLCBhbmQgb25lIGluIENBUCBjb250ZXh0IHdpdGhvdXQgY3NpcwotICAgICAgICAgKiBpbnN0YW5jZSAqLwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjc2lzX2luc3RhbmNlIGRvZXMgbm90IGV4aXN0IGZvciBncm91cCAiCi0gICAgICAgICAgICAgICAgICA8PCBncm91cF9pZDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhbGxiYWNrc18tPk9uRGV2aWNlQXZhaWxhYmxlKGRldmljZS0+YWRkciwgZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2lzX2dyb3VwLT5HZXREZXNpcmVkU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Npc19pbnN0YW5jZS0+R2V0VXVpZCgpKTsKLSAgICAgIG5vdGlmeV9jb25uZWN0ZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAobm90aWZ5X2Nvbm5lY3RlZCkKLSAgICAgIGNhbGxiYWNrc18tPk9uQ29ubmVjdGlvblN0YXRlKGRldmljZS0+YWRkciwgQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQpOwotCi0gICAgaWYgKGRldmljZS0+Zmlyc3RfY29ubmVjdGlvbikgewotICAgICAgZGV2aWNlLT5maXJzdF9jb25uZWN0aW9uID0gZmFsc2U7Ci0gICAgICBidGlmX3N0b3JhZ2Vfc2V0X2NzaXNfYXV0b2Nvbm5lY3QoZGV2aWNlLT5hZGRyLCB0cnVlKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uR2F0dFdyaXRlQ2NjKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBoYW5kbGU9IiA8PCBsb2doZXgoaGFuZGxlKTsKLQotICAgIGF1dG8gZGV2aWNlID0gRmluZERldmljZUJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdW5rbm93biBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgQnRhR2F0dFF1ZXVlOjpDbGVhbihjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uQ3Npc05vdGlmaWNhdGlvbih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBjc2lzX2luc3RhbmNlID0gZGV2aWNlLT5HZXRDc2lzSW5zdGFuY2VCeU93bmluZ0hhbmRsZShoYW5kbGUpOwotICAgIGlmIChjc2lzX2luc3RhbmNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiB1bmtub3duIG5vdGlmaWNhdGlvbiBoYW5kbGU6ICIgPDwgbG9naGV4KGhhbmRsZSkKLSAgICAgICAgICAgICAgICAgPDwgIiBmb3IgY29ubl9pZDogIiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGhhbmRsZSA9PSBjc2lzX2luc3RhbmNlLT5zdmNfZGF0YS5zaXJrX2hhbmRsZS52YWxfaGRsKSB7Ci0gICAgICBPbkNzaXNTaXJrVmFsdWVVcGRhdGUoY29ubl9pZCwgR0FUVF9TVUNDRVNTLCBoYW5kbGUsIGxlbiwgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAoaGFuZGxlID09IGNzaXNfaW5zdGFuY2UtPnN2Y19kYXRhLmxvY2tfaGFuZGxlLnZhbF9oZGwpIHsKLSAgICAgIE9uQ3Npc0xvY2tOb3RpZmljYXRpb25zKGRldmljZSwgY3Npc19pbnN0YW5jZSwgbGVuLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChoYW5kbGUgPT0gY3Npc19pbnN0YW5jZS0+c3ZjX2RhdGEuc2l6ZV9oYW5kbGUudmFsX2hkbCkgewotICAgICAgT25Dc2lzU2l6ZVZhbHVlVXBkYXRlKGNvbm5faWQsIEdBVFRfU1VDQ0VTUywgaGFuZGxlLCBsZW4sIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgdW5rbm93biBub3RpZmljYXRpb24gaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoaGFuZGxlKSA8PCAiIGZvciBjb25uX2lkICIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBDc2lzR3JvdXBMb2NrU3RhdHVzIExvY2tFcnJvcjJHcm91cExvY2tTdGF0dXModEdBVFRfU1RBVFVTIHN0YXR1cykgewotICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgICBjYXNlIGJsdWV0b290aDo6Y3Npczo6a0NzaXNFcnJvckNvZGVMb2NrRGVuaWVkOgotICAgICAgICByZXR1cm4gQ3Npc0dyb3VwTG9ja1N0YXR1czo6RkFJTEVEX0xPQ0tFRF9CWV9PVEhFUjsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpjc2lzOjprQ3Npc0Vycm9yQ29kZVJlbGVhc2VOb3RBbGxvd2VkOgotICAgICAgICByZXR1cm4gQ3Npc0dyb3VwTG9ja1N0YXR1czo6RkFJTEVEX0xPQ0tFRF9CWV9PVEhFUjsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpjc2lzOjprQ3Npc0Vycm9yQ29kZUludmFsaWRWYWx1ZToKLSAgICAgICAgcmV0dXJuIENzaXNHcm91cExvY2tTdGF0dXM6OkZBSUxFRF9PVEhFUl9SRUFTT047Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQ3Npc0dyb3VwTG9ja1N0YXR1czo6RkFJTEVEX09USEVSX1JFQVNPTjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENzaXNMb2NrQ29tcGxldGVkKHN0ZDo6c2hhcmVkX3B0cjxDc2lzR3JvdXA+JiBjc2lzX2dyb3VwLCBib29sIGxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja1N0YXR1cyBzdGF0dXMpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXAgaWQ6ICIgPDwgaW50KGNzaXNfZ3JvdXAtPkdldEdyb3VwSWQoKSkKLSAgICAgICAgICAgICAgIDw8ICJ0YXJnZXQgc3RhdGUgIiA8PCAobG9jayA/ICJsb2NrIiA6ICJ1bmxvY2siKTsKLQotICAgIE5vdGlmeUdyb3VwU3RhdHVzKGNzaXNfZ3JvdXAtPkdldEdyb3VwSWQoKSwgbG9jaywgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjc2lzX2dyb3VwLT5HZXRMb2NrQ2IoKSkpOwotICAgIGNzaXNfZ3JvdXAtPlNldFRhcmdldExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUKTsKLSAgfQotCi0gIHZvaWQgT25Dc2lzTG9ja05vdGlmaWNhdGlvbnMoc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+JiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENzaXNJbnN0YW5jZT4mIGNzaXNfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgewotICAgIGlmIChsZW4gIT0gMSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGludmFsaWQgbm90aWZpY2F0aW9uIGxlbjogIiA8PCBsb2doZXgobGVuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDc2lzTG9ja1N0YXRlIG5ld19sb2NrID0gKENzaXNMb2NrU3RhdGUpKHZhbHVlWzBdKTsKLQotICAgIERMT0coSU5GTykgPDwgIiBOZXcgbG9jayBzdGF0ZTogIiA8PCBpbnQobmV3X2xvY2spCi0gICAgICAgICAgICAgICA8PCAiIGRldmljZSByYW5rOiAgIiA8PCBpbnQoY3Npc19pbnN0YW5jZS0+R2V0UmFuaygpKSA8PCAiXG4iOwotCi0gICAgY3Npc19pbnN0YW5jZS0+U2V0TG9ja1N0YXRlKG5ld19sb2NrKTsKLQotICAgIGF1dG8gY3Npc19ncm91cCA9IEZpbmRDc2lzR3JvdXAoY3Npc19pbnN0YW5jZS0+R2V0R3JvdXBJZCgpKTsKLSAgICBpZiAoIWNzaXNfZ3JvdXApIHJldHVybjsKLQotICAgIENzaXNMb2NrQ2IgY2IgPSBjc2lzX2dyb3VwLT5HZXRMb2NrQ2IoKTsKLSAgICBpZiAoY3Npc19ncm91cC0+R2V0VGFyZ2V0TG9ja1N0YXRlKCkgPT0gQ3Npc0xvY2tTdGF0ZTo6Q1NJU19TVEFURV9VTlNFVCkgewotICAgICAgaWYgKGNzaXNfZ3JvdXAtPkdldEN1cnJlbnRMb2NrU3RhdGUoKSA9PQotICAgICAgICAgICAgICBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX0xPQ0tFRCAmJgotICAgICAgICAgIG5ld19sb2NrID09IENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5MT0NLRUQpIHsKLSAgICAgICAgLyogV2UgYXJlIGhlcmUgd2hlbiBtZW1iZXJzIGZpcmVzIHRoZWlycyBsb2NrIHRpbWVvdXQuCi0gICAgICAgICAqIE5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCBvdXIgY3VycmVudCBsb2NrIHN0YXRlLiBGb3Igbm93IHdlIHdpbGwKLSAgICAgICAgICogY2hhbmdlIGxvY2FsIGxvY2sgc3RhdGUgYWZ0ZXIgZmlyc3Qgc2V0IG1lbWJlciByZW1vdmVzIGl0cyBsb2NrLiBUaGVuCi0gICAgICAgICAqIHdlIGNvdW50IHRoYXQgb3RoZXJzIHdpbGwgZG8gdGhlIHNhbWUKLSAgICAgICAgICovCi0gICAgICAgIGNzaXNfZ3JvdXAtPlNldEN1cnJlbnRMb2NrU3RhdGUoQ3Npc0xvY2tTdGF0ZTo6Q1NJU19TVEFURV9VTkxPQ0tFRCk7Ci0gICAgICAgIE5vdGlmeUdyb3VwU3RhdHVzKGNzaXNfZ3JvdXAtPkdldEdyb3VwSWQoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENzaXNHcm91cExvY2tTdGF0dXM6OlNVQ0NFU1MsIHN0ZDo6bW92ZShjYikpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjc2lzX2dyb3VwLT5HZXRDdXJyZW50TG9ja1N0YXRlKCkgIT0gY3Npc19ncm91cC0+R2V0VGFyZ2V0TG9ja1N0YXRlKCkpIHsKLSAgICAgIC8qIFdlIGFyZSBpbiBwcm9jZXNzIG9mIGNoYW5naW5nIGxvY2sgc3RhdGUuIElmIG5ldyBkZXZpY2UgbG9jawotICAgICAgICogc3RhdGUgaXMgd2hhdCBpcyB0YXJnZXRlZCB0aGF0IG1lYW5zIGFsbCBpcyBnb29kLCB3ZSBkb24ndCBuZWVkCi0gICAgICAgKiB0byBkbyBoZXJlIG5vdGhpbmcsIGFzIHN0YXRlIHdpbGwgYmUgY2hhbmdlZCBvbmNlIGFsbCB0aGUKLSAgICAgICAqIGNoYXJhY3RlcmlzdGljcyBhcmUgd3JpdHRlbi4gSWYgbmV3IGRldmljZSBzdGF0ZSBpcyBub3Qgd2hhdCBpcwotICAgICAgICogdGFyZ2V0ZWQsIHRoYXQgbWVhbnMsIGRldmljZSBjaGFuZ2VkIHN0YXRlZCB1bmV4cGVjdGVkbHkgYW5kIGxvY2tpbmcKLSAgICAgICAqIHByb2NlZHVyZSBpcyBicm9rZW4KLSAgICAgICAqLwotICAgICAgaWYgKG5ld19sb2NrICE9IGNzaXNfZ3JvdXAtPkdldFRhcmdldExvY2tTdGF0ZSgpKSB7Ci0gICAgICAgIC8qIERldmljZSBjaGFuZ2VkIGJhY2sgdGhlIGxvY2sgc3RhdGUgZnJvbSB3aGF0IHdlIGV4cGVjdGVkLCBza2lwCi0gICAgICAgICAqIGxvY2tpbmcgYW5kIG5vdGlmeSB1c2VyIGFib3V0IHRoYXQKLSAgICAgICAgICovCi0gICAgICAgIENzaXNMb2NrQ29tcGxldGVkKGNzaXNfZ3JvdXAsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDc2lzR3JvdXBMb2NrU3RhdHVzOjpGQUlMRURfT1RIRVJfUkVBU09OKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uQ3Npc1NpemVWYWx1ZVVwZGF0ZSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUNvbm5JZChjb25uX2lkKTsKLQotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBkZXZpY2UtPmFkZHIKLSAgICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IGxvZ2hleCgrc3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgQ291bGQgbm90IHJlYWQgY2hhcmFjdGVyaXN0aWMgYXQgaGFuZGxlPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGVuICE9IDEpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgc2l6ZSB2YWx1ZSBsZW5ndGg9IiA8PCArbGVuCi0gICAgICAgICAgICAgICAgIDw8ICIgYXQgaGFuZGxlPSIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGNzaXNfaW5zdGFuY2UgPSBkZXZpY2UtPkdldENzaXNJbnN0YW5jZUJ5T3duaW5nSGFuZGxlKGhhbmRsZSk7Ci0gICAgaWYgKGNzaXNfaW5zdGFuY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIFVua25vd24gY3NpcyBpbnN0YW5jZSI7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXV0byBjc2lzX2dyb3VwID0gRmluZENzaXNHcm91cChjc2lzX2luc3RhbmNlLT5HZXRHcm91cElkKCkpOwotICAgIGlmICghY3Npc19ncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIFVua25vd24gZ3JvdXAgaWQgeWV0IjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjc2lzX2dyb3VwLT5TZXREZXNpcmVkU2l6ZSh2YWx1ZVswXSk7Ci0gIH0KLQotICB2b2lkIE9uQ3Npc0xvY2tSZWFkUnNwKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKSB7Ci0gICAgYXV0byBkZXZpY2UgPSBGaW5kRGV2aWNlQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgZGV2aWNlLT5hZGRyCi0gICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IGxvZ2hleCgrc3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgQ291bGQgbm90IHJlYWQgY2hhcmFjdGVyaXN0aWMgYXQgaGFuZGxlPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGVuICE9IDEpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIiBJbnZhbGlkIGxvY2sgdmFsdWUgbGVuZ3RoPSIgPDwgK2xlbgotICAgICAgICAgICAgICAgICA8PCAiIGF0IGhhbmRsZT0iIDw8IGxvZ2hleChoYW5kbGUpOwotICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBjc2lzX2luc3RhbmNlID0gZGV2aWNlLT5HZXRDc2lzSW5zdGFuY2VCeU93bmluZ0hhbmRsZShoYW5kbGUpOwotICAgIGlmIChjc2lzX2luc3RhbmNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBVbmtub3duIGNzaXMgaW5zdGFuY2UiOwotICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNzaXNfaW5zdGFuY2UtPlNldExvY2tTdGF0ZSgoQ3Npc0xvY2tTdGF0ZSkodmFsdWVbMF0pKTsKLSAgfQotCi0gIHZvaWQgT25Dc2lzUmFua1JlYWRSc3AodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgY29uc3QgdWludDhfdCogdmFsdWUpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIgU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgZGV2aWNlLT5hZGRyCi0gICAgICAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBsb2doZXgoK3N0YXR1cykgPDwgIiByYW5rOiIgPDwgaW50KHZhbHVlWzBdKTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgQ291bGQgbm90IHJlYWQgY2hhcmFjdGVyaXN0aWMgYXQgaGFuZGxlPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGVuICE9IDEpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkludmFsaWQgcmFuayB2YWx1ZSBsZW5ndGg9IiA8PCArbGVuCi0gICAgICAgICAgICAgICAgIDw8ICIgYXQgaGFuZGxlPSIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGNzaXNfaW5zdGFuY2UgPSBkZXZpY2UtPkdldENzaXNJbnN0YW5jZUJ5T3duaW5nSGFuZGxlKGhhbmRsZSk7Ci0gICAgaWYgKGNzaXNfaW5zdGFuY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIFVua25vd24gY3NpcyBpbnN0YW5jZSBoYW5kbGUgIiA8PCBpbnQoaGFuZGxlKTsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShkZXZpY2UtPmNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNzaXNfaW5zdGFuY2UtPlNldFJhbmsoKHZhbHVlWzBdKSk7Ci0gICAgYXV0byBjc2lzX2dyb3VwID0gRmluZENzaXNHcm91cChjc2lzX2luc3RhbmNlLT5HZXRHcm91cElkKCkpOwotICAgIGNzaXNfZ3JvdXAtPlNvcnRCeUNzaXNSYW5rKCk7Ci0gIH0KLQotICB2b2lkIE9uQ3Npc09ic2VydmVDb21wbGV0ZWQodm9pZCkgewotICAgIGlmIChkaXNjb3ZlcmluZ19ncm91cF8gPT0gLTEpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBObyBvbmdvaW5nIENTSVMgZGlzY292ZXJ5IC0gZGlzYWJsZSBzY2FuIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGRpc2NvdmVyaW5nX2dyb3VwXyk7Ci0gICAgZGlzY292ZXJpbmdfZ3JvdXBfID0gLTE7Ci0gICAgaWYgKGNzaXNfZ3JvdXAtPklzR3JvdXBDb21wbGV0ZSgpKQotICAgICAgY3Npc19ncm91cC0+U2V0RGlzY292ZXJ5U3RhdGUoCi0gICAgICAgICAgQ3Npc0Rpc2NvdmVyeVN0YXRlOjpDU0lTX0RJU0NPVkVSWV9DT01QTEVURUQpOwotICAgIGVsc2UKLSAgICAgIGNzaXNfZ3JvdXAtPlNldERpc2NvdmVyeVN0YXRlKENzaXNEaXNjb3ZlcnlTdGF0ZTo6Q1NJU19ESVNDT1ZFUllfSURMRSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIH0KLQotICAvKgotICAgKiBTaXJrIHNoYWxsIGJlIGluIExFIG9yZGVyCi0gICAqIGVuY3J5cHRlZF9zaXJrOiBMRSBvcmRlcgotICAgKi8KLSAgYm9vbCBzZGYoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgY29uc3QgT2N0ZXQxNiYgZW5jcnlwdGVkX3NpcmssCi0gICAgICAgICAgIE9jdGV0MTYmIHNpcmspIHsKLSAgICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYWRkcmVzcyk7Ci0gICAgaWYgKCFwX2Rldl9yZWMpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBObyBzZWN1cml0eSBmb3IgIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBMVEsgIgotICAgICAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKHBfZGV2X3JlYy0+YmxlLmtleXMucGx0ay5kYXRhKCksIDE2KTsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgSVJLICIKLSAgICAgICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZShwX2Rldl9yZWMtPmJsZS5rZXlzLmlyay5kYXRhKCksIDE2KTsKLQotICAgIC8qIENhbGN1bGF0ZSBzYWx0IENTSVMgZDEuMHIwNSA0LjMgKi8KLSAgICBPY3RldDE2IHplcm9fa2V5OwotICAgIG1lbXNldCh6ZXJvX2tleS5kYXRhKCksIDAsIDE2KTsKLQotICAgIHN0ZDo6c3RyaW5nIG1zZzEgPSAiU0lSS2VuYyI7Ci0gICAgc3RkOjpyZXZlcnNlKG1zZzEuYmVnaW4oKSwgbXNnMS5lbmQoKSk7Ci0KLSAgICBPY3RldDE2IHMxID0gY3J5cHRvX3Rvb2xib3g6OmFlc19jbWFjKHplcm9fa2V5LCAodWludDhfdCopKG1zZzEuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cxLnNpemUoKSk7Ci0gICAgRExPRyhJTkZPKSA8PCAiczEgKGxlKSAiIDw8IGJhc2U6OkhleEVuY29kZShzMS5kYXRhKCksIDE2KTsKLQotICAgIC8qIENyZWF0ZSBLID0gTFRLICovCi0gICAgRExPRyhJTkZPKSA8PCAiSyAobGUpICIKLSAgICAgICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZShwX2Rldl9yZWMtPmJsZS5rZXlzLnBsdGsuZGF0YSgpLCAxNikgPDwgIlxuIjsKLQotICAgIE9jdGV0MTYgVCA9IGNyeXB0b190b29sYm94OjphZXNfY21hYyhzMSwgcF9kZXZfcmVjLT5ibGUua2V5cy5wbHRrKTsKLSAgICBETE9HKElORk8pIDw8ICJUIChsZSkiIDw8IGJhc2U6OkhleEVuY29kZShULmRhdGEoKSwgMTYpIDw8ICJcbiI7Ci0KLSAgICBzdGQ6OnN0cmluZyBtc2cyID0gImNzaXMiOwotICAgIHN0ZDo6cmV2ZXJzZShtc2cyLmJlZ2luKCksIG1zZzIuZW5kKCkpOwotCi0gICAgT2N0ZXQxNiBrMSA9Ci0gICAgICAgIGNyeXB0b190b29sYm94OjphZXNfY21hYyhULCAodWludDhfdCopKG1zZzIuY19zdHIoKSksIG1zZzIuc2l6ZSgpKTsKLSAgICBETE9HKElORk8pIDw8ICJLMSAobGUpICIgPDwgYmFzZTo6SGV4RW5jb2RlKGsxLmRhdGEoKSwgMTYpIDw8ICJcbiI7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHNpcmtbaV0gPSBlbmNyeXB0ZWRfc2lya1tpXSBeIGsxW2ldOwotCi0gICAgRExPRyhJTkZPKSA8PCAiU0lSSyAobGUpIiA8PCBiYXNlOjpIZXhFbmNvZGUoc2lyay5kYXRhKCksIDE2KSA8PCAiXG4iOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gR2V0QWxsUnNpRnJvbUFkdmVydGlzaW5nKAotICAgICAgY29uc3QgdEJUQV9ETV9JTlFfUkVTKiByZXN1bHQpIHsKLSAgICBjb25zdCB1aW50OF90KiBwX3NlcnZpY2VfZGF0YSA9IHJlc3VsdC0+cF9laXI7Ci0gICAgdWludDE2X3QgcmVtYWluaW5nX2RhdGFfbGVuID0gcmVzdWx0LT5laXJfbGVuOwotICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGRldmljZXM7Ci0gICAgdWludDhfdCBzZXJ2aWNlX2RhdGFfbGVuID0gMDsKLQotICAgIHdoaWxlICgocF9zZXJ2aWNlX2RhdGEgPSBBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICBwX3NlcnZpY2VfZGF0YSArIHNlcnZpY2VfZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgKHJlbWFpbmluZ19kYXRhX2xlbiAtPSBzZXJ2aWNlX2RhdGFfbGVuKSwgQlRNX0JMRV9BRF9UWVBFX1JTSSwKLSAgICAgICAgICAgICAgICAmc2VydmljZV9kYXRhX2xlbikpKSB7Ci0gICAgICBSYXdBZGRyZXNzIGJkYTsKLSAgICAgIFNUUkVBTV9UT19CREFERFIoYmRhLCBwX3NlcnZpY2VfZGF0YSk7Ci0gICAgICBkZXZpY2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUoYmRhKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0ZDo6bW92ZShkZXZpY2VzKTsKLSAgfQotCi0gIHZvaWQgT25BY3RpdmVTY2FuUmVzdWx0KGNvbnN0IHRCVEFfRE1fSU5RX1JFUyogcmVzdWx0KSB7Ci0gICAgYXV0byBjc2lzX2RldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MocmVzdWx0LT5iZF9hZGRyKTsKLSAgICBpZiAoY3Npc19kZXZpY2UpIHsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBEcm9wIHNhbWUgZGV2aWNlIC4uIiA8PCByZXN1bHQtPmJkX2FkZHI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBhbGxfcnNpID0gR2V0QWxsUnNpRnJvbUFkdmVydGlzaW5nKHJlc3VsdCk7Ci0gICAgaWYgKGFsbF9yc2kuZW1wdHkoKSkgcmV0dXJuOwotCi0gICAgLyogTm90aWZ5IG9ubHkgdGhlIGFjdGl2ZWx5IHNlYXJjaGVkIGdyb3VwICovCi0gICAgYXV0byBjc2lzX2dyb3VwID0gRmluZENzaXNHcm91cChkaXNjb3ZlcmluZ19ncm91cF8pOwotICAgIGlmIChjc2lzX2dyb3VwID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIiBObyBvbmdvaW5nIENTSVMgZGlzY292ZXJ5IC0gZGlzYWJsZSBzY2FuIjsKLSAgICAgIENzaXNBY3RpdmVPYnNlcnZlclNldChmYWxzZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBkaXNjb3ZlcmVkX2dyb3VwX3JzaSA9IHN0ZDo6ZmluZF9pZigKLSAgICAgICAgYWxsX3JzaS5jYmVnaW4oKSwgYWxsX3JzaS5jZW5kKCksIFsmY3Npc19ncm91cF0oY29uc3QgYXV0byYgcnNpKSB7Ci0gICAgICAgICAgcmV0dXJuIGNzaXNfZ3JvdXAtPklzUnNpTWF0Y2hpbmcocnNpKTsKLSAgICAgICAgfSk7Ci0gICAgaWYgKGRpc2NvdmVyZWRfZ3JvdXBfcnNpICE9IGFsbF9yc2kuY2VuZCgpKSB7Ci0gICAgICBETE9HKElORk8pIDw8ICJGb3VuZCBzZXQgbWVtYmVyICIgPDwgcmVzdWx0LT5iZF9hZGRyOwotICAgICAgY2FsbGJhY2tzXy0+T25TZXRNZW1iZXJBdmFpbGFibGUocmVzdWx0LT5iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Npc19ncm91cC0+R2V0R3JvdXBJZCgpKTsKLQotICAgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9wcG9ydHVuaXN0aWMgb2JzZXJ2ZXIgbW9kZS4KLSAgICAgICAqIFdoZW4gc2Vjb25kIGRldmljZSB3aWxsIHBhaXIsIGNzaXMgd2lsbCByZXN0YXJ0IGFjdGl2ZSBzY2FuCi0gICAgICAgKiB0byBzZWFyY2ggbW9yZSBtZW1iZXJzIGlmIG5lZWRlZCAqLwotICAgICAgQ3Npc0FjdGl2ZU9ic2VydmVyU2V0KGZhbHNlKTsKLSAgICAgIGNzaXNfZ3JvdXAtPlNldERpc2NvdmVyeVN0YXRlKENzaXNEaXNjb3ZlcnlTdGF0ZTo6Q1NJU19ESVNDT1ZFUllfSURMRSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDc2lzQWN0aXZlT2JzZXJ2ZXJTZXQoYm9vbCBlbmFibGUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDU0lTIERpc2NvdmVyeSBTRVQ6ICIgPDwgZW5hYmxlOwotCi0gICAgQlRBX0RtQmxlQ3Npc09ic2VydmUoCi0gICAgICAgIGVuYWJsZSwgW10odEJUQV9ETV9TRUFSQ0hfRVZUIGV2ZW50LCB0QlRBX0RNX1NFQVJDSCogcF9kYXRhKSB7Ci0gICAgICAgICAgLyogSWYgdGhlcmUncyBubyBpbnN0YW5jZSB3ZSBhcmUgbW9zdCBsaWtlbHkgc2h1dHRpbmcKLSAgICAgICAgICAgKiBkb3duIHRoZSB3aG9sZSBzdGFjayBhbmQgd2UgY2FuIGlnbm9yZSB0aGlzIGV2ZW50LgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICAgICAgICBpZiAoZXZlbnQgPT0gQlRBX0RNX0lOUV9DTVBMX0VWVCkgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJCTEUgb2JzZXJ2ZSBjb21wbGV0ZS4gTnVtIFJlc3A6ICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KHBfZGF0YS0+aW5xX2NtcGwubnVtX3Jlc3BzKTsKLSAgICAgICAgICAgIGluc3RhbmNlLT5PbkNzaXNPYnNlcnZlQ29tcGxldGVkKCk7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+Q3Npc09ic2VydmVyU2V0QmFja2dyb3VuZCh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZXZlbnQgIT0gQlRBX0RNX0lOUV9SRVNfRVZUKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlVua25vd24gZXZlbnQ6ICIgPDwgZXZlbnQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaW5zdGFuY2UtPk9uQWN0aXZlU2NhblJlc3VsdCgmcF9kYXRhLT5pbnFfcmVzKTsKLSAgICAgICAgfSk7Ci0gICAgQlRBX0RtQmxlU2NhbihlbmFibGUsIGJsdWV0b290aDo6Y3Npczo6a0RlZmF1bHRTY2FuRHVyYXRpb25TKTsKLQotICAgIC8qIE5lZWQgdG8gY2FsbCBpdCBieSBvdXJzZWxmcyAqLwotICAgIGlmICghZW5hYmxlKSB7Ci0gICAgICBPbkNzaXNPYnNlcnZlQ29tcGxldGVkKCk7Ci0gICAgICBDc2lzT2JzZXJ2ZXJTZXRCYWNrZ3JvdW5kKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgQ3Npc0FjdGl2ZURpc2NvdmVyeShzdGQ6OnNoYXJlZF9wdHI8Q3Npc0dyb3VwPiBjc2lzX2dyb3VwKSB7Ci0gICAgaWYgKChjc2lzX2dyb3VwLT5HZXREaXNjb3ZlcnlTdGF0ZSgpICE9Ci0gICAgICAgICBDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX0lETEUpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgSW5jb3JyZWN0IGFzZSBncm91cDogIiA8PCBjc2lzX2dyb3VwLT5HZXRHcm91cElkKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBzdGF0ZSAiCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChzdGF0aWNfY2FzdDxpbnQ+KGNzaXNfZ3JvdXAtPkdldERpc2NvdmVyeVN0YXRlKCkpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjc2lzX2dyb3VwLT5TZXREaXNjb3ZlcnlTdGF0ZShDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX09OR09JTkcpOwotICAgIC8qIFRPRE8gTWF5YmUgd2UgZG9uJ3QgbmVlZCBpdCAqLwotICAgIGRpc2NvdmVyaW5nX2dyb3VwXyA9IGNzaXNfZ3JvdXAtPkdldEdyb3VwSWQoKTsKLSAgICBDc2lzQWN0aXZlT2JzZXJ2ZXJTZXQodHJ1ZSk7Ci0gIH0KLQotICB2b2lkIE9uU2NhbkJhY2tncm91bmRSZXN1bHQoY29uc3QgdEJUQV9ETV9JTlFfUkVTKiByZXN1bHQpIHsKLSAgICBpZiAoY3Npc19ncm91cHNfLmVtcHR5KCkpIHJldHVybjsKLQotICAgIGF1dG8gY3Npc19kZXZpY2UgPSBGaW5kRGV2aWNlQnlBZGRyZXNzKHJlc3VsdC0+YmRfYWRkcik7Ci0gICAgaWYgKGNzaXNfZGV2aWNlKSB7Ci0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgRHJvcCBzYW1lIGRldmljZSAuLiIgPDwgcmVzdWx0LT5iZF9hZGRyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gYWxsX3JzaSA9IEdldEFsbFJzaUZyb21BZHZlcnRpc2luZyhyZXN1bHQpOwotICAgIGlmIChhbGxfcnNpLmVtcHR5KCkpIHJldHVybjsKLQotICAgIC8qIE5vdGlmeSBhbGwgdGhlIGdyb3VwcyB0aGlzIGRldmljZSBiZWxvbmdzIHRvLiAqLwotICAgIGZvciAoYXV0byYgZ3JvdXAgOiBjc2lzX2dyb3Vwc18pIHsKLSAgICAgIGZvciAoYXV0byYgcnNpIDogYWxsX3JzaSkgewotICAgICAgICBpZiAoZ3JvdXAtPklzUnNpTWF0Y2hpbmcocnNpKSkgewotICAgICAgICAgIERMT0coSU5GTykgPDwgIiBGb3VuZCBzZXQgbWVtYmVyIGluIGJhY2tncm91bmQgc2NhbiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQtPmJkX2FkZHI7Ci0gICAgICAgICAgY2FsbGJhY2tzXy0+T25TZXRNZW1iZXJBdmFpbGFibGUocmVzdWx0LT5iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLT5HZXRHcm91cElkKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDc2lzT2JzZXJ2ZXJTZXRCYWNrZ3JvdW5kKGJvb2wgZW5hYmxlKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENTSVMgRGlzY292ZXJ5IGJhY2tncm91bmQ6ICIgPDwgZW5hYmxlOwotCi0gICAgQlRBX0RtQmxlQ3Npc09ic2VydmUoCi0gICAgICAgIGVuYWJsZSwgW10odEJUQV9ETV9TRUFSQ0hfRVZUIGV2ZW50LCB0QlRBX0RNX1NFQVJDSCogcF9kYXRhKSB7Ci0gICAgICAgICAgLyogSWYgdGhlcmUncyBubyBpbnN0YW5jZSB3ZSBhcmUgbW9zdCBsaWtlbHkgc2h1dHRpbmcKLSAgICAgICAgICAgKiBkb3duIHRoZSB3aG9sZSBzdGFjayBhbmQgd2UgY2FuIGlnbm9yZSB0aGlzIGV2ZW50LgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICAgICAgICBpZiAoZXZlbnQgPT0gQlRBX0RNX0lOUV9DTVBMX0VWVCkgewotICAgICAgICAgICAgRExPRyhJTkZPKSA8PCAiQkxFIG9ic2VydmUgY29tcGxldGUuIE51bSBSZXNwOiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4ocF9kYXRhLT5pbnFfY21wbC5udW1fcmVzcHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChldmVudCAhPSBCVEFfRE1fSU5RX1JFU19FVlQpIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5rbm93biBldmVudDogIiA8PCBldmVudDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpbnN0YW5jZS0+T25TY2FuQmFja2dyb3VuZFJlc3VsdCgmcF9kYXRhLT5pbnFfcmVzKTsKLSAgICAgICAgfSk7Ci0gIH0KLQotICB2b2lkIE9uQ3Npc1NpcmtWYWx1ZVVwZGF0ZSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5X3ZhbGlkX3NlcnZpY2VzID0gdHJ1ZSkgewotICAgIGF1dG8gZGV2aWNlID0gRmluZERldmljZUJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBkZXZpY2UtPmFkZHIKLSAgICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IGxvZ2hleCgrc3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAvKiBUT0RPIGhhbmRsZSBlcnJvciBjb2RlczoKLSAgICAgICAqIGtDc2lzRXJyb3JDb2RlTG9ja0FjY2Vzc1NpcmtSZWplY3RlZAotICAgICAgICoga0NzaXNFcnJvckNvZGVMb2NrT29iU2lya09ubHkKLSAgICAgICAqLwotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIENvdWxkIG5vdCByZWFkIGNoYXJhY3RlcmlzdGljIGF0IGhhbmRsZT0iCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChoYW5kbGUpOwotICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGxlbiAhPSBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2lya0NoYXJMZW4pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgc2lyayB2YWx1ZSBsZW5ndGg9IiA8PCArbGVuCi0gICAgICAgICAgICAgICAgIDw8ICIgYXQgaGFuZGxlPSIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGNzaXNfaW5zdGFuY2UgPSBkZXZpY2UtPkdldENzaXNJbnN0YW5jZUJ5T3duaW5nSGFuZGxlKGhhbmRsZSk7Ci0gICAgaWYgKGNzaXNfaW5zdGFuY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIFVua25vd24gY3NpcyBpbnN0YW5jZTogaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1aW50OF90IHNpcmtfdHlwZSA9IHZhbHVlWzBdOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFNJUksgVHlwZTogIiA8PCArc2lya190eXBlOwotCi0gICAgLyogVmVyaWZ5IGlmIHNpcmsgaXMgbm90IGFsbCB6ZXJvcyAqLwotICAgIE9jdGV0MTYgemVyb3t9OwotICAgIGlmIChtZW1jbXAoemVyby5kYXRhKCksIHZhbHVlICsgMSwgMTYpID09IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIlJlY2VpdmVkIGludmFsaWQgemVybyBTSVJLIGFkZHJlc3M6ICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGRldmljZS0+Y29ubl9pZCkgPDwgIi4gRGlzY29ubmVjdGluZyAiOwotICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgT2N0ZXQxNiByZWNlaXZlZF9zaXJrOwotICAgIG1lbWNweShyZWNlaXZlZF9zaXJrLmRhdGEoKSwgdmFsdWUgKyAxLCAxNik7Ci0KLSAgICBpZiAoc2lya190eXBlID09IGJsdWV0b290aDo6Y3Npczo6a0NzaXNTaXJrVHlwZUVuY3J5cHRlZCkgewotICAgICAgLyogRGVjcnlwdCBlbmNyeXB0ZWQgU0lSSyAqLwotICAgICAgT2N0ZXQxNiBzaXJrOwotICAgICAgc2RmKGRldmljZS0+YWRkciwgcmVjZWl2ZWRfc2lyaywgc2lyayk7Ci0gICAgICByZWNlaXZlZF9zaXJrID0gc2lyazsKLSAgICB9Ci0KLSAgICAvKiBTSVJLIGlzIHJlYWR5LiBBZGQgZGV2aWNlIHRvIHRoZSBncm91cCAqLwotCi0gICAgc3RkOjpzaGFyZWRfcHRyPENzaXNHcm91cD4gY3Npc19ncm91cDsKLSAgICBpbnQgZ3JvdXBfaWQgPSBjc2lzX2luc3RhbmNlLT5HZXRHcm91cElkKCk7Ci0gICAgaWYgKGdyb3VwX2lkICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICAvKiBHcm91cCBhbHJlYWR5IGV4aXN0LiAqLwotICAgICAgY3Npc19ncm91cCA9IEZpbmRDc2lzR3JvdXAoZ3JvdXBfaWQpOwotICAgICAgTE9HX0FTU0VSVChjc2lzX2dyb3VwKSA8PCAiIGdyb3VwIGRvZXMgbm90IGV4aXN0PyAiIDw8IGdyb3VwX2lkOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBOb3cgaGF2aW5nIFNJUksgd2UgY2FuIGRlY2lkZSBpZiB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gc29tZSBncm91cCB3ZQotICAgICAgICoga25vdyBvciB0aGlzIGlzIGEgbmV3IGdyb3VwCi0gICAgICAgKi8KLSAgICAgIGZvciAoYXV0byYgZyA6IGNzaXNfZ3JvdXBzXykgewotICAgICAgICBpZiAoZy0+SXNTaXJrQmVsb25nc1RvR3JvdXAocmVjZWl2ZWRfc2lyaykpIHsKLSAgICAgICAgICBncm91cF9pZCA9IGctPkdldEdyb3VwSWQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZ3JvdXBfaWQgPT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgICAgLyogSGVyZSBpdCBtZWFucywgd2UgaGF2ZSBuZXcgZ3JvdXAuIExldCdzIHVzIGNyZWF0ZSBpdCAqLwotICAgICAgICBncm91cF9pZCA9Ci0gICAgICAgICAgICBkZXZfZ3JvdXBzXy0+QWRkRGV2aWNlKGRldmljZS0+YWRkciwgY3Npc19pbnN0YW5jZS0+R2V0VXVpZCgpKTsKLSAgICAgICAgTE9HX0FTU0VSVChncm91cF9pZCAhPSAtMSk7Ci0KLSAgICAgICAgLyogQ3JlYXRlIG5ldyBncm91cCAqLwotICAgICAgICBhdXRvIGcgPQotICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KGdyb3VwX2lkLCBjc2lzX2luc3RhbmNlLT5HZXRVdWlkKCkpOwotICAgICAgICBjc2lzX2dyb3Vwc18ucHVzaF9iYWNrKGcpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGV2X2dyb3Vwc18tPkFkZERldmljZShkZXZpY2UtPmFkZHIsIGNzaXNfaW5zdGFuY2UtPkdldFV1aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9pZCk7Ci0gICAgICB9Ci0KLSAgICAgIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGdyb3VwX2lkKTsKLSAgICAgIGNzaXNfZ3JvdXAtPkFkZERldmljZShkZXZpY2UpOwotICAgICAgLyogTGV0J3MgdXBkYXRlIGNzaXMgaW5zdGFuY2UgZ3JvdXAgaWQgKi8KLSAgICAgIGNzaXNfaW5zdGFuY2UtPlNldEdyb3VwSWQoZ3JvdXBfaWQpOwotICAgIH0KLQotICAgIGNzaXNfZ3JvdXAtPlNldFNpcmsocmVjZWl2ZWRfc2lyayk7Ci0gICAgZGV2aWNlLT5pc19nYXR0X3NlcnZpY2VfdmFsaWQgPSB0cnVlOwotICAgIGJ0aWZfc3RvcmFnZV91cGRhdGVfY3Npc19pbmZvKGRldmljZS0+YWRkcik7Ci0KLSAgICBpZiAobm90aWZ5X3ZhbGlkX3NlcnZpY2VzKSBOb3RpZnlDc2lzRGV2aWNlVmFsaWRBbmRTdG9yZUlmTmVlZGVkKGRldmljZSk7Ci0KLSAgICBETE9HKElORk8pIDw8ICIgU0lSSyAiIDw8IGJhc2U6OkhleEVuY29kZShyZWNlaXZlZF9zaXJrLmRhdGEoKSwgMTYpCi0gICAgICAgICAgICAgICA8PCAiIGFkZHJlc3MiIDw8IGRldmljZS0+YWRkcjsKLQotICAgIERMT0coSU5GTykgPDwgIiBFeHBlY3RlZCBncm91cCBzaXplICIKLSAgICAgICAgICAgICAgIDw8IGxvZ2hleChjc2lzX2dyb3VwLT5HZXREZXNpcmVkU2l6ZSgpKQotICAgICAgICAgICAgICAgPDwgIiwgYWN0dWFsIGdyb3VwIFNpemU6ICIKLSAgICAgICAgICAgICAgIDw8IGxvZ2hleChjc2lzX2dyb3VwLT5HZXRDdXJyZW50U2l6ZSgpKTsKLQotICAgIC8qIFN0YXJ0IGFjdGl2ZSBzZWFyY2ggZm9yIHRoZSBvdGhlciBkZXZpY2UgKi8KLSAgICBpZiAoY3Npc19ncm91cC0+R2V0RGVzaXJlZFNpemUoKSA+IGNzaXNfZ3JvdXAtPkdldEN1cnJlbnRTaXplKCkpCi0gICAgICBDc2lzQWN0aXZlRGlzY292ZXJ5KGNzaXNfZ3JvdXApOwotICB9Ci0KLSAgdm9pZCBEb0Rpc2Nvbm5lY3RDbGVhblVwKHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiBkZXZpY2UpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGRldmljZS0+YWRkcjsKLQotICAgIGRldmljZS0+Rm9yRWFjaENzaXNJbnN0YW5jZSgKLSAgICAgICAgWyZdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDc2lzSW5zdGFuY2U+JiBjc2lzX2luc3QpIHsKLSAgICAgICAgICBEaXNhYmxlR2F0dE5vdGlmaWNhdGlvbihkZXZpY2UtPmNvbm5faWQsIGRldmljZS0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLmxvY2tfaGFuZGxlLnZhbF9oZGwpOwotICAgICAgICAgIERpc2FibGVHYXR0Tm90aWZpY2F0aW9uKGRldmljZS0+Y29ubl9pZCwgZGV2aWNlLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaXNfaW5zdC0+c3ZjX2RhdGEuc2lya19oYW5kbGUudmFsX2hkbCk7Ci0gICAgICAgICAgRGlzYWJsZUdhdHROb3RpZmljYXRpb24oZGV2aWNlLT5jb25uX2lkLCBkZXZpY2UtPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Npc19pbnN0LT5zdmNfZGF0YS5zaXplX2hhbmRsZS52YWxfaGRsKTsKLSAgICAgICAgfSk7Ci0KLSAgICBpZiAoZGV2aWNlLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICBCdGFHYXR0UXVldWU6OkNsZWFuKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICBkZXZpY2UtPmNvbm5faWQgPSBHQVRUX0lOVkFMSURfQ09OTl9JRDsKLSAgICB9Ci0gIH0KLQotICBib29sIE9uQ3Npc1NlcnZpY2VGb3VuZChzdGQ6OnNoYXJlZF9wdHI8Q3Npc0RldmljZT4gZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGNvbnRleHRfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sYXN0X2luc3RhbmNlKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHNlcnZpY2UgaGFuZGxlOiAiIDw8IGxvZ2hleChzZXJ2aWNlLT5oYW5kbGUpCi0gICAgICAgICAgICAgICA8PCAiIGVuZCBoYW5kbGU6ICIgPDwgbG9naGV4KHNlcnZpY2UtPmVuZF9oYW5kbGUpCi0gICAgICAgICAgICAgICA8PCAiIHV1aWQ6ICIgPDwgY29udGV4dF91dWlkOwotCi0gICAgYXV0byBjc2lzX2luc3QgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNJbnN0YW5jZT4oCi0gICAgICAgICh1aW50MTZfdClzZXJ2aWNlLT5oYW5kbGUsICh1aW50MTZfdClzZXJ2aWNlLT5lbmRfaGFuZGxlLCBjb250ZXh0X3V1aWQpOwotCi0gICAgLyogTGV0J3MgY2hlY2sgaWYgd2Uga25vdyBncm91cCBvZiB0aGlzIGRldmljZSAqLwotICAgIGludCBncm91cF9pZCA9IGRldl9ncm91cHNfLT5HZXRHcm91cElkKGRldmljZS0+YWRkciwgY29udGV4dF91dWlkKTsKLSAgICBpZiAoZ3JvdXBfaWQgIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pCi0gICAgICBjc2lzX2luc3QtPlNldEdyb3VwSWQoZ3JvdXBfaWQpOwotCi0gICAgLyogSW5pdGlhbGx5IHZhbGlkYXRlIGFuZCBzdG9yZSBHQVRUIHNlcnZpY2UgZGlzY292ZXJ5IGRhdGEgKi8KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIGlmIChjaGFyYWMudXVpZCA9PSBrQ3Npc0xvY2tVdWlkKSB7Ci0gICAgICAgIC8qIEZpbmQgdGhlIG1hbmRhdG9yeSBDQ0MgZGVzY3JpcHRvciAqLwotICAgICAgICB1aW50MTZfdCBjY2NfaGFuZGxlID0KLSAgICAgICAgICAgIEZpbmRDY2NIYW5kbGUoZGV2aWNlLT5jb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgaWYgKGNjY19oYW5kbGUgPT0gR0FQX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICAgICAgRExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBubyBIQVMgQWN0aXZlIFByZXNldCBDQ0MgZGVzY3JpcHRvciBmb3VuZCEiOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLmxvY2tfaGFuZGxlLnZhbF9oZGwgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLmxvY2tfaGFuZGxlLmNjY19oZGwgPSBjY2NfaGFuZGxlOwotCi0gICAgICAgIFN1YnNjcmliZUZvck5vdGlmaWNhdGlvbnMoZGV2aWNlLT5jb25uX2lkLCBkZXZpY2UtPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjLnZhbHVlX2hhbmRsZSwgY2NjX2hhbmRsZSk7Ci0KLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIExvY2sgVVVJRCBmb3VuZCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY3Npc19pbnN0LT5zdmNfZGF0YS5sb2NrX2hhbmRsZS52YWxfaGRsKQotICAgICAgICAgICAgICAgICAgIDw8ICIgY2NjIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjc2lzX2luc3QtPnN2Y19kYXRhLmxvY2tfaGFuZGxlLmNjY19oZGwpOwotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PSBrQ3Npc1JhbmtVdWlkKSB7Ci0gICAgICAgIGNzaXNfaW5zdC0+c3ZjX2RhdGEucmFua19oYW5kbGUgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotCi0gICAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBSYW5rIFVVSUQgZm91bmQgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGNzaXNfaW5zdC0+c3ZjX2RhdGEucmFua19oYW5kbGUpOwotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PSBrQ3Npc1NpcmtVdWlkKSB7Ci0gICAgICAgIC8qIEZpbmQgdGhlIG9wdGlvbmFsIENDQyBkZXNjcmlwdG9yICovCi0gICAgICAgIHVpbnQxNl90IGNjY19oYW5kbGUgPQotICAgICAgICAgICAgRmluZENjY0hhbmRsZShkZXZpY2UtPmNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLnNpcmtfaGFuZGxlLmNjY19oZGwgPSBjY2NfaGFuZGxlOwotICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLnNpcmtfaGFuZGxlLnZhbF9oZGwgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotCi0gICAgICAgIGlmIChjY2NfaGFuZGxlICE9IEdBUF9JTlZBTElEX0hBTkRMRSkKLSAgICAgICAgICBTdWJzY3JpYmVGb3JOb3RpZmljYXRpb25zKGRldmljZS0+Y29ubl9pZCwgZGV2aWNlLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjLnZhbHVlX2hhbmRsZSwgY2NjX2hhbmRsZSk7Ci0KLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFNJUksgVVVJRCBmb3VuZCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY3Npc19pbnN0LT5zdmNfZGF0YS5zaXJrX2hhbmRsZS52YWxfaGRsKQotICAgICAgICAgICAgICAgICAgIDw8ICIgY2NjIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjc2lzX2luc3QtPnN2Y19kYXRhLnNpcmtfaGFuZGxlLmNjY19oZGwpOwotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PSBrQ3Npc1NpemVVdWlkKSB7Ci0gICAgICAgIC8qIEZpbmQgdGhlIG9wdGlvbmFsIENDQyBkZXNjcmlwdG9yICovCi0gICAgICAgIHVpbnQxNl90IGNjY19oYW5kbGUgPQotICAgICAgICAgICAgRmluZENjY0hhbmRsZShkZXZpY2UtPmNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLnNpemVfaGFuZGxlLmNjY19oZGwgPSBjY2NfaGFuZGxlOwotICAgICAgICBjc2lzX2luc3QtPnN2Y19kYXRhLnNpemVfaGFuZGxlLnZhbF9oZGwgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotCi0gICAgICAgIGlmIChjY2NfaGFuZGxlICE9IEdBUF9JTlZBTElEX0hBTkRMRSkKLSAgICAgICAgICBTdWJzY3JpYmVGb3JOb3RpZmljYXRpb25zKGRldmljZS0+Y29ubl9pZCwgZGV2aWNlLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjLnZhbHVlX2hhbmRsZSwgY2NjX2hhbmRsZSk7Ci0KLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFNpemUgVVVJRCBmb3VuZCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY3Npc19pbnN0LT5zdmNfZGF0YS5zaXplX2hhbmRsZS52YWxfaGRsKQotICAgICAgICAgICAgICAgICAgIDw8ICIgY2NjIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjc2lzX2luc3QtPnN2Y19kYXRhLnNpemVfaGFuZGxlLmNjY19oZGwpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIFNpcmsgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IGNoYXJhY3RlcmlzdGljLiBJZiBpdCBpcyBpbgotICAgICAqIHBsYWNlLCBzZXJ2aWNlIGlzIE9LCi0gICAgICovCi0gICAgaWYgKGNzaXNfaW5zdC0+c3ZjX2RhdGEuc2lya19oYW5kbGUudmFsX2hkbCA9PSBHQVBfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgIC8qIFdlIGhhdmUgc29tZSBjaGFyYWN0ZXJpc3RpY3MgYnV0IGFsbCBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzYXRpc2ZpZWQgKi8KLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBTZXJ2aWNlIGhhcyBhIGJyb2tlbiBzdHJ1Y3R1cmUuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZGV2aWNlLT5TZXRDc2lzSW5zdGFuY2UoY3Npc19pbnN0LT5zdmNfZGF0YS5zdGFydF9oYW5kbGUsIGNzaXNfaW5zdCk7Ci0KLSAgICAvKiBSZWFkIFNJUksgKi8KLSAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgZGV2aWNlLT5jb25uX2lkLCBjc2lzX2luc3QtPnN2Y19kYXRhLnNpcmtfaGFuZGxlLnZhbF9oZGwsCi0gICAgICAgIFtdKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogdXNlcl9kYXRhKSB7Ci0gICAgICAgICAgaWYgKGluc3RhbmNlKQotICAgICAgICAgICAgaW5zdGFuY2UtPk9uQ3Npc1NpcmtWYWx1ZVVwZGF0ZShjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgbGVuLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wpdXNlcl9kYXRhKTsKLSAgICAgICAgfSwKLSAgICAgICAgKHZvaWQqKWlzX2xhc3RfaW5zdGFuY2UpOwotCi0gICAgLyogUmVhZCBMb2NrICovCi0gICAgaWYgKGNzaXNfaW5zdC0+c3ZjX2RhdGEubG9ja19oYW5kbGUudmFsX2hkbCAhPSBHQVBfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgIGRldmljZS0+Y29ubl9pZCwgY3Npc19pbnN0LT5zdmNfZGF0YS5sb2NrX2hhbmRsZS52YWxfaGRsLAotICAgICAgICAgIFtdKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgICAgICAgICAgIGlmIChpbnN0YW5jZSkKLSAgICAgICAgICAgICAgaW5zdGFuY2UtPk9uQ3Npc0xvY2tSZWFkUnNwKGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBsZW4sIHZhbHVlKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIG51bGxwdHIpOwotICAgIH0KLQotICAgIC8qIFJlYWQgU2l6ZSAqLwotICAgIGlmIChjc2lzX2luc3QtPnN2Y19kYXRhLnNpemVfaGFuZGxlLnZhbF9oZGwgIT0gR0FQX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICBkZXZpY2UtPmNvbm5faWQsIGNzaXNfaW5zdC0+c3ZjX2RhdGEuc2l6ZV9oYW5kbGUudmFsX2hkbCwKLSAgICAgICAgICBbXSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogdXNlcl9kYXRhKSB7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2UpCi0gICAgICAgICAgICAgIGluc3RhbmNlLT5PbkNzaXNTaXplVmFsdWVVcGRhdGUoY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBudWxscHRyKTsKLSAgICB9Ci0KLSAgICAvKiBSZWFkIFJhbmsgKi8KLSAgICBpZiAoY3Npc19pbnN0LT5zdmNfZGF0YS5yYW5rX2hhbmRsZSAhPSBHQVBfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgIGRldmljZS0+Y29ubl9pZCwgY3Npc19pbnN0LT5zdmNfZGF0YS5yYW5rX2hhbmRsZSwKLSAgICAgICAgICBbXSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogdXNlcl9kYXRhKSB7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2UpCi0gICAgICAgICAgICAgIGluc3RhbmNlLT5PbkNzaXNSYW5rUmVhZFJzcChjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgbGVuLCB2YWx1ZSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBudWxscHRyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiBUaGVzZSBhcmUgYWxsIGdlbmVyaWMgR0FUVCBldmVudCBoYW5kbGVycyBjYWxsaW5nIEhBUyBzcGVjaWZpYyBjb2RlLiAqLwotICB2b2lkIEdhdHRjQ2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGV2ZW50ID0gIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50KTsKLQotICAgIC8qIFRoaXMgaXMgaW4gY2FzZSBDc2lzIENsZWFuVXAgaXMgYWxyZWFkeSBkb25lCi0gICAgICogd2hpbGUgR0FUVCBpcyBzdGlsbCB1cCBhbmQgY291bGQgc2VuZCBldmVudHMKLSAgICAgKi8KLSAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBjYXNlIEJUQV9HQVRUQ19ERVJFR19FVlQ6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUQV9HQVRUQ19PUEVOX0VWVDoKLSAgICAgICAgT25HYXR0Q29ubmVjdGVkKHBfZGF0YS0+b3Blbik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUQV9HQVRUQ19DTE9TRV9FVlQ6Ci0gICAgICAgIE9uR2F0dERpc2Nvbm5lY3RlZChwX2RhdGEtPmNsb3NlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgICAgT25HYXR0U2VydmljZVNlYXJjaENvbXBsZXRlKHBfZGF0YS0+c2VhcmNoX2NtcGwpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVEFfR0FUVENfTk9USUZfRVZUOgotICAgICAgICBPbkdhdHROb3RpZmljYXRpb24ocF9kYXRhLT5ub3RpZnkpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVEFfR0FUVENfRU5DX0NNUExfQ0JfRVZUOgotICAgICAgICBPbkxlRW5jcnlwdGlvbkNvbXBsZXRlKHBfZGF0YS0+ZW5jX2NtcGwucmVtb3RlX2JkYSwgQlRNX1NVQ0NFU1MpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVEFfR0FUVENfU1JWQ19DSEdfRVZUOgotICAgICAgICBPbkdhdHRTZXJ2aWNlQ2hhbmdlRXZlbnQocF9kYXRhLT5yZW1vdGVfYmRhKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfRElTQ19ET05FX0VWVDoKLSAgICAgICAgT25HYXR0U2VydmljZURpc2NvdmVyeURvbmVFdmVudChwX2RhdGEtPnJlbW90ZV9iZGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkdhdHRDb25uZWN0ZWQoY29uc3QgdEJUQV9HQVRUQ19PUEVOJiBldnQpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBldnQucmVtb3RlX2JkYQotICAgICAgICAgICAgICAgPDwgIiwgY29ubl9pZD0iIDw8IGV2dC5jb25uX2lkOwotCi0gICAgYXV0byBkZXZpY2UgPSBGaW5kRGV2aWNlQnlBZGRyZXNzKGV2dC5yZW1vdGVfYmRhKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBhZGRyZXNzPSIgPDwgZXZ0LnJlbW90ZV9iZGE7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZXZ0LmNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChldnQuc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgRExPRyhJTkZPKSA8PCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyIGRldmljZSI7Ci0gICAgICBpZiAoZGV2aWNlLT5jb25uZWN0aW5nX2FjdGl2ZWx5KQotICAgICAgICBjYWxsYmFja3NfLT5PbkNvbm5lY3Rpb25TdGF0ZShldnQucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQpOwotICAgICAgRG9EaXNjb25uZWN0Q2xlYW5VcChkZXZpY2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSA9IGZhbHNlOwotICAgIGRldmljZS0+Y29ubl9pZCA9IGV2dC5jb25uX2lkOwotCi0gICAgLyogVmVyaWZ5IGJvbmQgKi8KLSAgICB1aW50OF90IHNlY19mbGFnID0gMDsKLSAgICBCVE1fR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0KGV2dC5yZW1vdGVfYmRhLCAmc2VjX2ZsYWcsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgICAvKiBJZiBsaW5rIGhhcyBiZWVuIGVuY3J5cHRlZCBsb29rIGZvciB0aGUgc2VydmljZSBvciByZXBvcnQgKi8KLSAgICBpZiAoc2VjX2ZsYWcgJiBCVE1fU0VDX0ZMQUdfRU5DUllQVEVEKSB7Ci0gICAgICBpZiAoZGV2aWNlLT5pc19nYXR0X3NlcnZpY2VfdmFsaWQpIHsKLSAgICAgICAgaW5zdGFuY2UtPk9uRW5jcnlwdGVkKGRldmljZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoZGV2aWNlLT5jb25uX2lkLCAma0NzaXNTZXJ2aWNlVXVpZCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgcmVzdWx0ID0gQlRNX1NldEVuY3J5cHRpb24oCi0gICAgICAgIGV2dC5yZW1vdGVfYmRhLCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB2b2lkKiBwX3JlZl9kYXRhLAotICAgICAgICAgICB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgICAgICAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkxlRW5jcnlwdGlvbkNvbXBsZXRlKCpiZF9hZGRyLCBzdGF0dXMpOwotICAgICAgICB9LAotICAgICAgICBudWxscHRyLCBCVE1fQkxFX1NFQ19FTkNSWVBUKTsKLQotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICIgRW5jcnlwdGlvbiByZXF1aXJlZC4gUmVxdWVzdCByZXN1bHQ6ICIgPDwgcmVzdWx0OwotICB9Ci0KLSAgdm9pZCBPbkdhdHREaXNjb25uZWN0ZWQoY29uc3QgdEJUQV9HQVRUQ19DTE9TRSYgZXZ0KSB7Ci0gICAgYXV0byBkZXZpY2UgPSBGaW5kRGV2aWNlQnlBZGRyZXNzKGV2dC5yZW1vdGVfYmRhKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UgZGlzY29ubmVjdCwgY29ubl9pZD0iCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGV2dC5jb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGRldmljZS0+YWRkcjsKLQotICAgIGNhbGxiYWNrc18tPk9uQ29ubmVjdGlvblN0YXRlKGV2dC5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKTsKLQotICAgIC8vIFVubG9jayBvdGhlcnMgb25seSBpZiBkZXZpY2Ugd2FzIGxvY2tlZCBieSB1cyBidXQgaGFzIGRpc2Nvbm5lY3RlZAotICAgIC8vIHVuZXhwZWN0ZWRseS4KLSAgICBpZiAoKGV2dC5yZWFzb24gPT0gR0FUVF9DT05OX1RJTUVPVVQpIHx8Ci0gICAgICAgIChldnQucmVhc29uID09IEdBVFRfQ09OTl9URVJNSU5BVEVfUEVFUl9VU0VSKSkgewotICAgICAgZGV2aWNlLT5Gb3JFYWNoQ3Npc0luc3RhbmNlKAotICAgICAgICAgIFsmXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q3Npc0luc3RhbmNlPiYgY3Npc19pbnN0KSB7Ci0gICAgICAgICAgICBhdXRvIGNzaXNfZ3JvdXAgPSBGaW5kQ3Npc0dyb3VwKGNzaXNfaW5zdC0+R2V0R3JvdXBJZCgpKTsKLSAgICAgICAgICAgIGlmIChjc2lzX2dyb3VwID09IG51bGxwdHIpIHJldHVybjsKLSAgICAgICAgICAgIGlmICgoY3Npc19ncm91cC0+R2V0Q3VycmVudExvY2tTdGF0ZSgpID09Ci0gICAgICAgICAgICAgICAgIENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VEKSkgewotICAgICAgICAgICAgICBIYW5kbGVDc2lzTG9ja1Byb2NlZHVyZUVycm9yKAotICAgICAgICAgICAgICAgICAgY3Npc19ncm91cCwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja1N0YXR1czo6TE9DS0VEX0dST1VQX01FTUJFUl9MT1NUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBEb0Rpc2Nvbm5lY3RDbGVhblVwKGRldmljZSk7Ci0gIH0KLQotICB2b2lkIE9uR2F0dFNlcnZpY2VTZWFyY2hDb21wbGV0ZShjb25zdCB0QlRBX0dBVFRDX1NFQVJDSF9DTVBMJiBldnQpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUNvbm5JZChldnQuY29ubl9pZCk7Ci0KLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIFNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoZXZ0LmNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIElnbm9yZSBpZiBvdXIgc2VydmljZSBkYXRhIGlzIHZhbGlkIChkaXNjb3ZlcnkgaW5pdGlhdGVkIGJ5IHNvbWVvbmUKLSAgICAgKiBlbHNlPykgKi8KLSAgICBpZiAoIWRldmljZS0+aXNfZ2F0dF9zZXJ2aWNlX3ZhbGlkKSB7Ci0gICAgICBpZiAoZXZ0LnN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIFNlcnZpY2UgZGlzY292ZXJ5IGZhaWxlZCI7Ci0gICAgICAgIEJUQV9HQVRUQ19DbG9zZShkZXZpY2UtPmNvbm5faWQpOwotICAgICAgICBEb0Rpc2Nvbm5lY3RDbGVhblVwKGRldmljZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgICAgY29uc3Qgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+KiBhbGxfc2VydmljZXMgPQotICAgICAgICAgIEJUQV9HQVRUQ19HZXRTZXJ2aWNlcyhkZXZpY2UtPmNvbm5faWQpOwotCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gYWxsX2NzaXNfc3RhcnRfaGFuZGxlczsKLQotICAgICAgLyogTGUncyBqdXN0IGZpbmQgYWxsIHRoZSBDU0lTIHByaW1hcnkgc2VydmljZXMgYW5kIHN0b3JlIHRoZSBzdGFydAotICAgICAgICogaGFuZGxlcyAqLwotICAgICAgZm9yIChhdXRvJiBzdnJjIDogKmFsbF9zZXJ2aWNlcykgewotICAgICAgICBpZiAoc3ZyYy51dWlkID09IGtDc2lzU2VydmljZVV1aWQpIHsKLSAgICAgICAgICBhbGxfY3Npc19zdGFydF9oYW5kbGVzLnB1c2hfYmFjayhzdnJjLmhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGFsbF9jc2lzX3N0YXJ0X2hhbmRsZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vIENzaXMgaW5zdGFuY2VzIGZvdW5kIjsKLSAgICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICAgIFJlbW92ZUNzaXNEZXZpY2UoZGV2aWNlLCBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgZm9yIChhdXRvJiBzdnJjIDogKmFsbF9zZXJ2aWNlcykgewotICAgICAgICBpZiAoc3ZyYy51dWlkID09IGtDc2lzU2VydmljZVV1aWQpIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIFRyeSB0byBmaW5kIGNvbnRleHQgZm9yIENTSVMgaW5zdGFuY2VzICovCi0gICAgICAgIGZvciAoYXV0byYgaW5jbHVkZWRfc3J2YyA6IHN2cmMuaW5jbHVkZWRfc2VydmljZXMpIHsKLSAgICAgICAgICBpZiAoaW5jbHVkZWRfc3J2Yy51dWlkID09IGtDc2lzU2VydmljZVV1aWQpIHsKLSAgICAgICAgICAgIGF1dG8gY3Npc19zdnJjID0gQlRBX0dBVFRDX0dldE93bmluZ1NlcnZpY2UoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT5jb25uX2lkLCBpbmNsdWRlZF9zcnZjLnN0YXJ0X2hhbmRsZSk7Ci0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmQoYWxsX2NzaXNfc3RhcnRfaGFuZGxlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jc2lzX3N0YXJ0X2hhbmRsZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRfc3J2Yy5zdGFydF9oYW5kbGUpOwotICAgICAgICAgICAgaWYgKGl0ZXIgIT0gYWxsX2NzaXNfc3RhcnRfaGFuZGxlcy5lbmQoKSkKLSAgICAgICAgICAgICAgYWxsX2NzaXNfc3RhcnRfaGFuZGxlcy5lcmFzZShpdGVyKTsKLSAgICAgICAgICAgIGluc3RhbmNlLT5PbkNzaXNTZXJ2aWNlRm91bmQoZGV2aWNlLCBjc2lzX3N2cmMsIHN2cmMudXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2NzaXNfc3RhcnRfaGFuZGxlcy5lbXB0eSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogSGVyZSBpZiBDU0lTIGlzIGluY2x1ZGVkLCBhbGxfY3Npc19zdGFydF9oYW5kbGVzIHNob3VsZCBiZSBlbXB0eQotICAgICAgICogT3RoZXJ3aXNlIGl0IG1lYW5zLCB3ZSBoYXZlIHNvbWUgcHJpbWFyeSBDU0lTIHdpdGhvdXQgYSBjb250ZXh0LAotICAgICAgICogd2hpY2ggbWVhbnMgaXQgaXMgZm9yIHRoZSBjb21wbGV0ZSBkZXZpY2UuCi0gICAgICAgKiBBcyBwZXIgc3BlYywgdGhlcmUgY2FuIGJlIG9ubHkgb25lIHNlcnZpY2UgbGlrZSB0aGlzLgotICAgICAgICovCi0gICAgICBpZiAoYWxsX2NzaXNfc3RhcnRfaGFuZGxlcy5zaXplKCkpIHsKLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHRoZXJlIGlzICIgPDwgYWxsX2NzaXNfc3RhcnRfaGFuZGxlcy5zaXplKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiIHByaW1hcnkgc2VydmljZXMgd2l0aG91dCBhIGNvbnRleHQiOwotICAgICAgICBhdXRvIGNzaXNfc3ZyYyA9IEJUQV9HQVRUQ19HZXRPd25pbmdTZXJ2aWNlKGRldmljZS0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfY3Npc19zdGFydF9oYW5kbGVzWzBdKTsKLSAgICAgICAgaW5zdGFuY2UtPk9uQ3Npc1NlcnZpY2VGb3VuZCgKLSAgICAgICAgICAgIGRldmljZSwgY3Npc19zdnJjLCBibHVldG9vdGg6Omdyb3Vwczo6a0dlbmVyaWNDb250ZXh0VXVpZCwgdHJ1ZSk7Ci0gICAgICAgIGFsbF9jc2lzX3N0YXJ0X2hhbmRsZXMuY2xlYXIoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogVGhpcyBtaWdodCBiZSBzZXQgYWxyZWFkeSBpZiB0aGVyZSBpcyBubyBvcHRpb25hbCBhdHRyaWJ1dGVzIHRvIHJlYWQKLSAgICAgICAqIG9yIHdyaXRlLgotICAgICAgICovCi0gICAgICBpZiAoZXZ0LnN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgTm90aWZ5Q3Npc0RldmljZVZhbGlkQW5kU3RvcmVJZk5lZWRlZChkZXZpY2UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgT25HYXR0Tm90aWZpY2F0aW9uKGNvbnN0IHRCVEFfR0FUVENfTk9USUZZJiBldnQpIHsKLSAgICAvKiBSZWplY3QgaW52YWxpZCBsZW5ndGhzIGFuZCBpbmRpY2F0aW9ucyBhcyB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkICovCi0gICAgaWYgKCFldnQuaXNfbm90aWZ5IHx8IGV2dC5sZW4gPiBHQVRUX01BWF9BVFRSX0xFTikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiByZWplY3RlZCBCVEFfR0FUVENfTk9USUZfRVZULiBpc19ub3RpZnkgPSAiCi0gICAgICAgICAgICAgICAgIDw8IGV2dC5pc19ub3RpZnkgPDwgIiwgbGVuPSIgPDwgc3RhdGljX2Nhc3Q8aW50PihldnQubGVuKTsKLSAgICB9Ci0KLSAgICBPbkNzaXNOb3RpZmljYXRpb24oZXZ0LmNvbm5faWQsIGV2dC5oYW5kbGUsIGV2dC5sZW4sIGV2dC52YWx1ZSk7Ci0gIH0KLQotICB2b2lkIE9uTGVFbmNyeXB0aW9uQ29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzdGF0dXMpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzOwotICAgIGF1dG8gZGV2aWNlID0gRmluZERldmljZUJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBCVE1fU1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiZW5jcnlwdGlvbiBmYWlsZWQiCi0gICAgICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLQotICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGRldmljZS0+aXNfZ2F0dF9zZXJ2aWNlX3ZhbGlkKSB7Ci0gICAgICBpbnN0YW5jZS0+T25FbmNyeXB0ZWQoZGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgZGV2aWNlLT5maXJzdF9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICAgIEJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdChkZXZpY2UtPmNvbm5faWQsICZrQ3Npc1NlcnZpY2VVdWlkKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uR2F0dFNlcnZpY2VDaGFuZ2VFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgYXV0byBkZXZpY2UgPSBGaW5kRGV2aWNlQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYWRkcmVzcz0iIDw8IGFkZHJlc3M7Ci0KLSAgICAvKiBJbnZhbGlkYXRlIHNlcnZpY2UgZGlzY292ZXJ5IHJlc3VsdHMgKi8KLSAgICBCdGFHYXR0UXVldWU6OkNsZWFuKGRldmljZS0+Y29ubl9pZCk7Ci0gICAgZGV2aWNlLT5maXJzdF9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICBkZXZpY2UtPkNsZWFyU3ZjRGF0YSgpOwotICB9Ci0KLSAgdm9pZCBPbkdhdHRTZXJ2aWNlRGlzY292ZXJ5RG9uZUV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBhdXRvIGRldmljZSA9IEZpbmREZXZpY2VCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXZpY2UpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzPSIgPDwgYWRkcmVzczsKLQotICAgIGlmICghZGV2aWNlLT5pc19nYXR0X3NlcnZpY2VfdmFsaWQpCi0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoZGV2aWNlLT5jb25uX2lkLCAma0NzaXNTZXJ2aWNlVXVpZCk7Ci0gIH0KLQotICBzdGF0aWMgdWludDE2X3QgRmluZENjY0hhbmRsZSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBjaGFyX2hhbmRsZSkgewotICAgIGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBwX2NoYXIgPQotICAgICAgICBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWMoY29ubl9pZCwgY2hhcl9oYW5kbGUpOwotICAgIGlmICghcF9jaGFyKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogTm8gc3VjaCBjaGFyYWN0ZXJpc3RpYzogIiA8PCBjaGFyX2hhbmRsZTsKLSAgICAgIHJldHVybiBHQVBfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBnYXR0OjpEZXNjcmlwdG9yJiBkZXNjIDogcF9jaGFyLT5kZXNjcmlwdG9ycykgewotICAgICAgaWYgKGRlc2MudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpCi0gICAgICAgIHJldHVybiBkZXNjLmhhbmRsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gR0FQX0lOVkFMSURfSEFORExFOwotICB9Ci0KLSAgdm9pZCBTdWJzY3JpYmVGb3JOb3RpZmljYXRpb25zKHVpbnQxNl90IGNvbm5faWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZV9oYW5kbGUsIHVpbnQxNl90IGNjY19oYW5kbGUpIHsKLSAgICBpZiAodmFsdWVfaGFuZGxlICE9IEdBUF9JTlZBTElEX0hBTkRMRSkgewotICAgICAgdEdBVFRfU1RBVFVTIHJlZ2lzdGVyX3N0YXR1cyA9Ci0gICAgICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhnYXR0X2lmXywgYWRkcmVzcywgdmFsdWVfaGFuZGxlKTsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucywgc3RhdHVzPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KCtyZWdpc3Rlcl9zdGF0dXMpCi0gICAgICAgICAgICAgICAgIDw8ICIgdmFsdWU9IiA8PCBsb2doZXgodmFsdWVfaGFuZGxlKQotICAgICAgICAgICAgICAgICA8PCAiIGNjYz0iIDw8IGxvZ2hleChjY2NfaGFuZGxlKTsKLQotICAgICAgaWYgKHJlZ2lzdGVyX3N0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSgyKTsKLSAgICB1aW50OF90KiB2YWx1ZV9wdHIgPSB2YWx1ZS5kYXRhKCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTSh2YWx1ZV9wdHIsIEdBVFRfQ0hBUl9DTElFTlRfQ09ORklHX05PVElGSUNBVElPTik7Ci0gICAgQnRhR2F0dFF1ZXVlOjpXcml0ZURlc2NyaXB0b3IoCi0gICAgICAgIGNvbm5faWQsIGNjY19oYW5kbGUsIHN0ZDo6bW92ZSh2YWx1ZSksIEdBVFRfV1JJVEUsCi0gICAgICAgIFtdKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IHZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwgdm9pZCogdXNlcl9kYXRhKSB7Ci0gICAgICAgICAgaWYgKGluc3RhbmNlKQotICAgICAgICAgICAgaW5zdGFuY2UtPk9uR2F0dFdyaXRlQ2NjKGNvbm5faWQsIHN0YXR1cywgdmFsdWVfaGFuZGxlLCB1c2VyX2RhdGEpOwotICAgICAgICB9LAotICAgICAgICBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgRGlzYWJsZUdhdHROb3RpZmljYXRpb24odWludDE2X3QgY29ubl9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZV9oYW5kbGUpIHsKLSAgICBpZiAodmFsdWVfaGFuZGxlICE9IEdBUF9JTlZBTElEX0hBTkRMRSkgewotICAgICAgdEdBVFRfU1RBVFVTIHJlZ2lzdGVyX3N0YXR1cyA9Ci0gICAgICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWZfLCBhZGRyZXNzLCB2YWx1ZV9oYW5kbGUpOwotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBEaXNhYmxlR2F0dE5vdGlmaWNhdGlvbiwgc3RhdHVzPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KCtyZWdpc3Rlcl9zdGF0dXMpCi0gICAgICAgICAgICAgICAgIDw8ICIgdmFsdWU9IiA8PCBsb2doZXgodmFsdWVfaGFuZGxlKTsKLQotICAgICAgaWYgKHJlZ2lzdGVyX3N0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICB1aW50OF90IGdhdHRfaWZfOwotICBibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrc187Ci0gIHN0ZDo6bGlzdDxzdGQ6OnNoYXJlZF9wdHI8Q3Npc0RldmljZT4+IGRldmljZXNfOwotICBzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPENzaXNHcm91cD4+IGNzaXNfZ3JvdXBzXzsKLSAgRGV2aWNlR3JvdXBzKiBkZXZfZ3JvdXBzXzsKLSAgaW50IGRpc2NvdmVyaW5nX2dyb3VwXyA9IC0xOwotfTsKLQotY2xhc3MgRGV2aWNlR3JvdXBzQ2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBEZXZpY2VHcm91cHNDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgdm9pZCBPbkdyb3VwQWRkZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5Pbkdyb3VwQWRkZWRDYihhZGRyZXNzLCB1dWlkLCBncm91cF9pZCk7Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBNZW1iZXJBZGRlZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5Pbkdyb3VwTWVtYmVyQWRkZWRDYihhZGRyZXNzLCBncm91cF9pZCk7Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBSZW1vdmVkKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25Hcm91cFJlbW92ZWRDYih1dWlkLCBncm91cF9pZCk7Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBNZW1iZXJSZW1vdmVkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBncm91cF9pZCkgb3ZlcnJpZGUgewotICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPk9uR3JvdXBNZW1iZXJSZW1vdmVkQ2IoYWRkcmVzcywgZ3JvdXBfaWQpOwotICB9Ci0KLSAgdm9pZCBPbkdyb3VwQWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5Pbkdyb3VwQWRkRnJvbVN0b3JhZ2VDYihhZGRyZXNzLCB1dWlkLCBncm91cF9pZCk7Ci0gIH0KLX07Ci0KLWNsYXNzIERldmljZUdyb3Vwc0NhbGxiYWNrc0ltcGw7Ci1EZXZpY2VHcm91cHNDYWxsYmFja3NJbXBsIGRldmljZUdyb3Vwc0NhbGxiYWNrc0ltcGw7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIENzaXNDbGllbnQ6OkluaXRpYWxpemUoYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSBpbml0Q2IpIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBBbHJlYWR5IGluaXRpYWxpemVkISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGV2aWNlX2dyb3VwX2NhbGxiYWNrcyA9ICZkZXZpY2VHcm91cHNDYWxsYmFja3NJbXBsOwotICBpbnN0YW5jZSA9IG5ldyBDc2lzQ2xpZW50SW1wbChjYWxsYmFja3MsIGluaXRDYik7Ci19Ci0KLWJvb2wgQ3Npc0NsaWVudDo6SXNDc2lzQ2xpZW50UnVubmluZygpIHsgcmV0dXJuIGluc3RhbmNlOyB9Ci0KLUNzaXNDbGllbnQqIENzaXNDbGllbnQ6OkdldCh2b2lkKSB7Ci0gIENIRUNLKGluc3RhbmNlKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi12b2lkIENzaXNDbGllbnQ6OkFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCkgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBOb3QgaW5pdGlhbGl6ZWQgeWV0ISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5zdGFuY2UtPkFkZEZyb21TdG9yYWdlKGFkZHIsIGluLCBhdXRvY29ubmVjdCk7Ci19Ci0KLWJvb2wgQ3Npc0NsaWVudDo6R2V0Rm9yU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBvdXQpIHsKLSAgaWYgKCFpbnN0YW5jZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm90IGluaXRpYWxpemVkIHlldCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIGluc3RhbmNlLT5TZXJpYWxpemVTZXRzKGFkZHIsIG91dCk7Ci19Ci0KLXZvaWQgQ3Npc0NsaWVudDo6Q2xlYW5VcCgpIHsKLSAgQ3Npc0NsaWVudEltcGwqIHB0ciA9IGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0KLSAgaWYgKHB0cikgewotICAgIHB0ci0+Q2xlYW5VcCgpOwotICAgIGRlbGV0ZSBwdHI7Ci0gIH0KLX0KLQotdm9pZCBDc2lzQ2xpZW50OjpEZWJ1Z0R1bXAoaW50IGZkKSB7Ci0gIGRwcmludGYoZmQsICJDb29yZGluYXRlZCBTZXQgU2VydmljZSBDbGllbnQ6XG4iKTsKLSAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+RHVtcChmZCk7Ci0gIGRwcmludGYoZmQsICJcbiIpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2NzaXMvY3Npc19jbGllbnRfdGVzdC5jYyBiL2J0YS9jc2lzL2NzaXNfY2xpZW50X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWFlZmUuLjAwMDAwMDAKLS0tIGEvYnRhL2NzaXMvY3Npc19jbGllbnRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJ0YV9jc2lzX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9kbV9hcGlfbW9jay5oIgotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaV9tb2NrLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWVfbW9jay5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImJ0bV9hcGlfbW9jay5oIgotI2luY2x1ZGUgImNzaXNfdHlwZXMuaCIKLSNpbmNsdWRlICJnYXR0L2RhdGFiYXNlX2J1aWxkZXIuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9nYXR0X3R5cGVzLmgiCi0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjc2lzIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgewotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6Q2xvc3VyZTsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci0KLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q29ubmVjdGlvblN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50OwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50Q2FsbGJhY2tzOwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzR3JvdXBMb2NrU3RhdHVzOwotdXNpbmcgYmx1ZXRvb3RoOjpncm91cHM6OkRldmljZUdyb3VwczsKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6RG9EZWZhdWx0OwotdXNpbmcgdGVzdGluZzo6SW52b2tlOwotdXNpbmcgdGVzdGluZzo6TW9jazsKLXVzaW5nIHRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgdGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OldpdGhBcmc7Ci0KLS8vIERpc2FibGVzIG1vc3QgbGlrZWx5IGZhbHNlLXBvc2l0aXZlcyBmcm9tIGJhc2U6OlNwbGl0U3RyaW5nKCkKLWV4dGVybiAiQyIgY29uc3QgY2hhciogX19hc2FuX2RlZmF1bHRfb3B0aW9ucygpIHsKLSAgcmV0dXJuICJkZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAiOwotfQotCi1SYXdBZGRyZXNzIEdldFRlc3RBZGRyZXNzKGludCBpbmRleCkgewotICBDSEVDS19MVChpbmRleCwgVUlOVDhfTUFYKTsKLSAgUmF3QWRkcmVzcyByZXN1bHQgPSB7Ci0gICAgICB7MHhDMCwgMHhERSwgMHhDMCwgMHhERSwgMHgwMCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oaW5kZXgpfX07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIENzaXMgbG9jayBjYWxsYmFjayAqLwotY2xhc3MgTW9ja0NzaXNMb2NrQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTW9ja0NzaXNMb2NrQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0gIH5Nb2NrQ3Npc0xvY2tDYWxsYmFjaygpID0gZGVmYXVsdDsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDc2lzR3JvdXBMb2NrQ2IsCi0gICAgICAgICAgICAgIChpbnQgZ3JvdXBfaWQsIGJvb2wgbG9ja2VkLCBDc2lzR3JvdXBMb2NrU3RhdHVzIHN0YXR1cykpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tDc2lzTG9ja0NhbGxiYWNrKTsKLX07Ci0KLXN0YXRpYyBNb2NrQ3Npc0xvY2tDYWxsYmFjayogY3Npc19sb2NrX2NhbGxiYWNrX21vY2s7Ci0KLXZvaWQgU2V0TW9ja0NzaXNMb2NrQ2FsbGJhY2soTW9ja0NzaXNMb2NrQ2FsbGJhY2sqIG1vY2spIHsKLSAgY3Npc19sb2NrX2NhbGxiYWNrX21vY2sgPSBtb2NrOwotfQotCi0vKiBDc2lzIGNhbGxiYWNrcyB0byBKTkkgKi8KLWNsYXNzIE1vY2tDc2lzQ2FsbGJhY2tzIDogcHVibGljIENzaXNDbGllbnRDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgTW9ja0NzaXNDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIH5Nb2NrQ3Npc0NhbGxiYWNrcygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBNT0NLX01FVEhPRCgodm9pZCksIE9uQ29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgQ29ubmVjdGlvblN0YXRlIHN0YXRlKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25EZXZpY2VBdmFpbGFibGUsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQsIGludCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25TZXRNZW1iZXJBdmFpbGFibGUsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkdyb3VwTG9ja0NoYW5nZWQsCi0gICAgICAgICAgICAgIChpbnQgZ3JvdXBfaWQsIGJvb2wgbG9ja2VkLAotICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzR3JvdXBMb2NrU3RhdHVzIHN0YXR1cyksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uR2F0dENzaXNXcml0ZUxvY2tSc3AsCi0gICAgICAgICAgICAgICh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICB2b2lkKiBkYXRhKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0NzaXNDYWxsYmFja3MpOwotfTsKLQotY2xhc3MgQ3Npc0NsaWVudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcml2YXRlOgotICB2b2lkIHNldF9zYW1wbGVfZGF0YWJhc2UodWludDE2X3QgY29ubl9pZCwgYm9vbCBjc2lzLCBib29sIGNzaXNfYnJva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByYW5rLCB1aW50OF90IHNpcmtfbXNiID0gMSkgewotICAgIGdhdHQ6OkRhdGFiYXNlQnVpbGRlciBidWlsZGVyOwotICAgIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwMDEsIDB4MDAwMywgVXVpZDo6RnJvbTE2Qml0KDB4MTgwMCksIHRydWUpOwotICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDAyLCAweDAwMDMsIFV1aWQ6OkZyb20xNkJpdCgweDJhMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgIGlmIChjc2lzKSB7Ci0gICAgICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDEwLCAweDAwMzAsIGtDc2lzU2VydmljZVV1aWQsIHRydWUpOwotICAgICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAweDAwMjAsIDB4MDAyMSwga0NzaXNTaXJrVXVpZCwKLSAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotCi0gICAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgIDB4MDAyMywgMHgwMDI0LCBrQ3Npc1NpemVVdWlkLAotICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEIHwgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSk7Ci0gICAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyNiwgMHgwMDI3LCBrQ3Npc0xvY2tVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURSk7Ci0gICAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyOSwgMHgwMDMwLCBrQ3Npc1JhbmtVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgfQotICAgIGlmIChjc2lzX2Jyb2tlbikgewotICAgICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAweDAwMjAsIDB4MDAyMSwga0NzaXNTaXJrVXVpZCwKLSAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotCi0gICAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgfQotICAgIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwOTAsIDB4MDA5MywKLSAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSKSwgdHJ1ZSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwOTEsIDB4MDA5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfR0FUVF9TUlZfQ0hHRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZKTsKLSAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDkzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgIHNlcnZpY2VzX21hcFtjb25uX2lkXSA9IGJ1aWxkZXIuQnVpbGQoKS5TZXJ2aWNlcygpOwotCi0gICAgT05fQ0FMTChnYXR0X3F1ZXVlLCBSZWFkQ2hhcmFjdGVyaXN0aWMoY29ubl9pZCwgXywgXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgICAgSW52b2tlKFtyYW5rLCBzaXJrX21zYl0odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRUFEX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgICAgICAgICAgICAgc3dpdGNoIChoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMzoKLSAgICAgICAgICAgICAgICAgIC8qIGRldmljZSBuYW1lICovCi0gICAgICAgICAgICAgICAgICB2YWx1ZS5yZXNpemUoMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDAwMjE6Ci0gICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24oMTcsIDEpOwotICAgICAgICAgICAgICAgICAgdmFsdWVbMTZdID0gc2lya19tc2I7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MDAyNDoKLSAgICAgICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHgwMDI3OgotICAgICAgICAgICAgICAgICAgdmFsdWUucmVzaXplKDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDAwMzA6Ci0gICAgICAgICAgICAgICAgICB2YWx1ZS5yZXNpemUoMSk7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NpZ24oMSwgcmFuayk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgY2IoY29ubl9pZCwgR0FUVF9TVUNDRVNTLCBoYW5kbGUsIHZhbHVlLnNpemUoKSwgdmFsdWUuZGF0YSgpLAotICAgICAgICAgICAgICAgICBjYl9kYXRhKTsKLSAgICAgICAgICAgIH0pKTsKLSAgfQotCi0gIHZvaWQgc2V0X3NhbXBsZV9kYXRhYmFzZV9kb3VibGVfY3Npcyh1aW50MTZfdCBjb25uX2lkLCB1aW50OF90IHJhbmtfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmFua18yLCBib29sIGJyb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2lyazFfaW5maWxsID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2lyazJfaW5maWxsID0gMikgewotICAgIGdhdHQ6OkRhdGFiYXNlQnVpbGRlciBidWlsZGVyOwotCi0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwMSwgMHgwMDAzLCBVdWlkOjpGcm9tMTZCaXQoMHgxODAwKSwgdHJ1ZSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMDIsIDB4MDAwMywgVXVpZDo6RnJvbTE2Qml0KDB4MmEwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAxMCwgMHgwMDI2LCBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDE4NTApLAotICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICBidWlsZGVyLkFkZEluY2x1ZGVkU2VydmljZSgweDAwMTEsIGtDc2lzU2VydmljZVV1aWQsIDB4MDAzMSwgMHgwMDQxKTsKLSAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKAotICAgICAgICAweDAwMzEsIDB4MDAzMiwga0NzaXNTaXJrVXVpZCwKLSAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQgfCBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZKTsKLQotICAgIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgMHgwMDM0LCAweDAwMzUsIGtDc2lzU2l6ZVV1aWQsCi0gICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEIHwgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSk7Ci0gICAgYnVpbGRlci5BZGREZXNjcmlwdG9yKDB4MDAzNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAzNywgMHgwMDM4LCBrQ3Npc0xvY2tVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURSk7Ci0gICAgYnVpbGRlci5BZGREZXNjcmlwdG9yKDB4MDAzOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDA0MCwgMHgwMDQxLCBrQ3Npc1JhbmtVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotCi0gICAgaWYgKGJyb2tlbikgewotICAgICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAweDAwMjAsIDB4MDAyMSwga0NzaXNTaXJrVXVpZCwKLSAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotCi0gICAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgfQotCi0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDA0MiwgMHgwMDQ0LCBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDE4NjApLAotICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICBidWlsZGVyLkFkZEluY2x1ZGVkU2VydmljZSgweDAwNDMsIGtDc2lzU2VydmljZVV1aWQsIDB4MDA0NSwgMHgwMDU1KTsKLQotICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgIDB4MDA0NSwgMHgwMDQ2LCBrQ3Npc1NpcmtVdWlkLAotICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotCi0gICAgYnVpbGRlci5BZGREZXNjcmlwdG9yKDB4MDA0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKAotICAgICAgICAweDAwNDgsIDB4MDA0OSwga0NzaXNTaXplVXVpZCwKLSAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQgfCBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZKTsKLSAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDUxLCAweDAwNTIsIGtDc2lzTG9ja1V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1dSSVRFKTsKLSAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDU0LCAweDAwNTUsIGtDc2lzUmFua1V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0KLSAgICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDkwLCAweDAwOTMsCi0gICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVRUX1NFUlZFUiksIHRydWUpOwotICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDkxLCAweDAwOTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0dBVFRfU1JWX0NIR0QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSk7Ci0gICAgYnVpbGRlci5BZGREZXNjcmlwdG9yKDB4MDA5MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICBzZXJ2aWNlc19tYXBbY29ubl9pZF0gPSBidWlsZGVyLkJ1aWxkKCkuU2VydmljZXMoKTsKLQotICAgIE9OX0NBTEwoZ2F0dF9xdWV1ZSwgUmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIF8sIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoW3NpcmsxX2luZmlsbCwgc2lyazJfaW5maWxsLCByYW5rXzEsIHJhbmtfMl0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgICAgICAgICBzd2l0Y2ggKGhhbmRsZSkgewotICAgICAgICAgICAgY2FzZSAweDAwMDM6Ci0gICAgICAgICAgICAgIC8qIGRldmljZSBuYW1lICovCi0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgyMCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAwMzI6Ci0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxNyk7Ci0gICAgICAgICAgICAgIHZhbHVlLmFzc2lnbigxNywgc2lyazFfaW5maWxsKTsKLSAgICAgICAgICAgICAgdmFsdWVbMF0gPSAxOyAgLy8gUGxhaW4gdGV4dCBTSVJLCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAwMzU6Ci0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxKTsKLSAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKDEsIDIpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwMDM4OgotICAgICAgICAgICAgICB2YWx1ZS5yZXNpemUoMSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAwNDE6Ci0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxKTsKLSAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKDEsIHJhbmtfMSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAwNDY6Ci0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxNyk7Ci0gICAgICAgICAgICAgIHZhbHVlLmFzc2lnbigxNywgc2lyazJfaW5maWxsKTsKLSAgICAgICAgICAgICAgdmFsdWVbMF0gPSAxOyAgLy8gUGxhaW4gdGV4dCBTSVJLCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAwNDk6Ci0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxKTsKLSAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKDEsIDIpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwMDUyOgotICAgICAgICAgICAgICB2YWx1ZS5yZXNpemUoMSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAwNTU6Ci0gICAgICAgICAgICAgIHZhbHVlLnJlc2l6ZSgxKTsKLSAgICAgICAgICAgICAgdmFsdWUuYXNzaWduKDEsIHJhbmtfMik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiIFVua25vd24gaGFuZGxlPyAiIDw8ICtoYW5kbGU7Ci0gICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNiKGNvbm5faWQsIEdBVFRfU1VDQ0VTUywgaGFuZGxlLCB2YWx1ZS5zaXplKCksIHZhbHVlLmRhdGEoKSwKLSAgICAgICAgICAgICBjYl9kYXRhKTsKLSAgICAgICAgfSkpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAodm9pZCkgb3ZlcnJpZGUgewotICAgIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLmNsZWFyKCk7Ci0gICAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpTZXRNb2NrQnRtSW50ZXJmYWNlKCZidG1faW50ZXJmYWNlKTsKLSAgICBkbTo6U2V0TW9ja0J0YURtSW50ZXJmYWNlKCZkbV9pbnRlcmZhY2UpOwotICAgIGdhdHQ6OlNldE1vY2tCdGFHYXR0SW50ZXJmYWNlKCZnYXR0X2ludGVyZmFjZSk7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRRdWV1ZSgmZ2F0dF9xdWV1ZSk7Ci0gICAgU2V0TW9ja0NzaXNMb2NrQ2FsbGJhY2soJmNzaXNfbG9ja19jYik7Ci0gICAgY2FsbGJhY2tzLnJlc2V0KG5ldyBNb2NrQ3Npc0NhbGxiYWNrcygpKTsKLQotICAgIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIEdldENoYXJhY3RlcmlzdGljKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIEludm9rZShbJl0odWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSAtPiBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogewotICAgICAgICAgICAgICBzdGQ6Omxpc3Q8Z2F0dDo6U2VydmljZT4mIHNlcnZpY2VzID0gc2VydmljZXNfbWFwW2Nvbm5faWRdOwotICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIHNlcnZpY2UgOiBzZXJ2aWNlcykgewotICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgY2hhcmFjdGVyaXN0aWMgOiBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcykgewotICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcmlzdGljLnZhbHVlX2hhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZjaGFyYWN0ZXJpc3RpYzsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICAgIH0pKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBHZXRPd25pbmdTZXJ2aWNlIGZ1bmN0aW9uIGNhbGwKLSAgICBPTl9DQUxMKGdhdHRfaW50ZXJmYWNlLCBHZXRPd25pbmdTZXJ2aWNlKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoCi0gICAgICAgICAgICBbJl0odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKSAtPiBjb25zdCBnYXR0OjpTZXJ2aWNlKiB7Ci0gICAgICAgICAgICAgIHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiYgc2VydmljZXMgPSBzZXJ2aWNlc19tYXBbY29ubl9pZF07Ci0gICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgc2VydmljZSA6IHNlcnZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaGFuZGxlIDw9IGhhbmRsZSAmJiBzZXJ2aWNlLmVuZF9oYW5kbGUgPj0gaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gJnNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgICAgICB9KSk7Ci0KLSAgICAvLyBkZWZhdWx0IGFjdGlvbiBmb3IgR2V0U2VydmljZXMgZnVuY3Rpb24gY2FsbAotICAgIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIEdldFNlcnZpY2VzKF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChXaXRoQXJnPDA+KAotICAgICAgICAgICAgSW52b2tlKFsmXSh1aW50MTZfdCBjb25uX2lkKSAtPiBzdGQ6Omxpc3Q8Z2F0dDo6U2VydmljZT4qIHsKLSAgICAgICAgICAgICAgcmV0dXJuICZzZXJ2aWNlc19tYXBbY29ubl9pZF07Ci0gICAgICAgICAgICB9KSkpOwotCi0gICAgLy8gZGVmYXVsdCBhY3Rpb24gZm9yIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChnYXR0X2ludGVyZmFjZSwgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oR0FUVF9TVUNDRVNTKSk7Ci0KLSAgICAvLyBkZWZhdWx0IGFjdGlvbiBmb3IgRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnMgZnVuY3Rpb24gY2FsbAotICAgIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIERlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oR0FUVF9TVUNDRVNTKSk7Ci0KLSAgICAvLyBkZWZhdWx0IGFjdGlvbiBmb3IgV3JpdGVEZXNjcmlwdG9yIGZ1bmN0aW9uIGNhbGwKLSAgICBPTl9DQUxMKGdhdHRfcXVldWUsIFdyaXRlRGVzY3JpcHRvcihfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBJbnZva2UoW10odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLCB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgLT4gdm9pZCB7Ci0gICAgICAgICAgICAgIGlmIChjYikKLSAgICAgICAgICAgICAgICBjYihjb25uX2lkLCBHQVRUX1NVQ0NFU1MsIGhhbmRsZSwgdmFsdWUuc2l6ZSgpLCB2YWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgY2JfZGF0YSk7Ci0gICAgICAgICAgICB9KSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBzZXJ2aWNlc19tYXAuY2xlYXIoKTsKLSAgICBjYWxsYmFja3MucmVzZXQoKTsKLSAgICBDc2lzQ2xpZW50OjpDbGVhblVwKCk7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRJbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpTZXRNb2NrQnRtSW50ZXJmYWNlKG51bGxwdHIpOwotICB9Ci0KLSAgdm9pZCBUZXN0QXBwUmVnaXN0ZXIodm9pZCkgewotICAgIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgYXBwX3JlZ2lzdGVyX2NhbGxiYWNrOwotICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLCBBcHBSZWdpc3RlcihfLCBfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmdhdHRfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZUFyZzwxPigmYXBwX3JlZ2lzdGVyX2NhbGxiYWNrKSkpOwotICAgIENzaXNDbGllbnQ6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZCgmYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2NzaXNfZGV2aWNlcykpOwotICAgIEFTU0VSVF9UUlVFKGdhdHRfY2FsbGJhY2spOwotICAgIEFTU0VSVF9UUlVFKGFwcF9yZWdpc3Rlcl9jYWxsYmFjayk7Ci0gICAgYXBwX3JlZ2lzdGVyX2NhbGxiYWNrLlJ1bihnYXR0X2lmLCBHQVRUX1NVQ0NFU1MpOwotICAgIEFTU0VSVF9UUlVFKENzaXNDbGllbnQ6OklzQ3Npc0NsaWVudFJ1bm5pbmcoKSk7Ci0gIH0KLQotICB2b2lkIFRlc3RBcHBVbnJlZ2lzdGVyKHZvaWQpIHsKLSAgICBFWFBFQ1RfQ0FMTChnYXR0X2ludGVyZmFjZSwgQXBwRGVyZWdpc3RlcihnYXR0X2lmKSk7Ci0gICAgQ3Npc0NsaWVudDo6Q2xlYW5VcCgpOwotICAgIEFTU0VSVF9GQUxTRShDc2lzQ2xpZW50OjpJc0NzaXNDbGllbnRSdW5uaW5nKCkpOwotICAgIGdhdHRfY2FsbGJhY2sgPSBudWxscHRyOwotICB9Ci0KLSAgdm9pZCBUZXN0Q29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgLy8gYnkgZGVmYXVsdCBpbmRpY2F0ZSBsaW5rIGFzIGVuY3J5cHRlZAotICAgIE9OX0NBTEwoYnRtX2ludGVyZmFjZSwgR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0KGFkZHJlc3MsIE5vdE51bGwoKSwgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwxPihCVE1fU0VDX0ZMQUdfRU5DUllQVEVEKSwgUmV0dXJuKHRydWUpKSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChnYXR0X2ludGVyZmFjZSwgT3BlbihnYXR0X2lmLCBhZGRyZXNzLCB0cnVlLCBfKSk7Ci0gICAgQ3Npc0NsaWVudDo6R2V0KCktPkNvbm5lY3QoYWRkcmVzcyk7Ci0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmdhdHRfaW50ZXJmYWNlKTsKLSAgICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYnRtX2ludGVyZmFjZSk7Ci0gIH0KLQotICB2b2lkIFRlc3REaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICBpZiAoY29ubl9pZCAhPSBHQVRUX0lOVkFMSURfQ09OTl9JRCkgewotICAgICAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIENsb3NlKGNvbm5faWQpKTsKLSAgICAgIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uQ29ubmVjdGlvblN0YXRlKHRlc3RfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLCBDYW5jZWxPcGVuKF8sIGFkZHJlc3MsIF8pKTsKLSAgICB9Ci0gICAgQ3Npc0NsaWVudDo6R2V0KCktPkRpc2Nvbm5lY3QoYWRkcmVzcyk7Ci0gIH0KLQotICB2b2lkIFRlc3RBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc3RvcmFnZV9idWYpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKGFkZHJlc3MsIENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSkKLSAgICAgICAgLlRpbWVzKDEpOwotICAgIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uRGV2aWNlQXZhaWxhYmxlKGFkZHJlc3MsIF8sIF8sIF8pKS5UaW1lcygxKTsKLSAgICBFWFBFQ1RfQ0FMTChnYXR0X2ludGVyZmFjZSwgT3BlbihnYXR0X2lmLCBhZGRyZXNzLCBmYWxzZSwgXykpCi0gICAgICAgIC5XaWxsT25jZShJbnZva2UoW3RoaXMsIGNvbm5faWRdKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGJvb2wgb3Bwb3J0dW5pc3RpYykgewotICAgICAgICAgIEluamVjdENvbm5lY3RlZEV2ZW50KHJlbW90ZV9iZGEsIGNvbm5faWQpOwotICAgICAgICAgIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoY29ubl9pZCk7Ci0gICAgICAgIH0pKTsKLSAgICBDc2lzQ2xpZW50OjpBZGRGcm9tU3RvcmFnZShhZGRyZXNzLCBzdG9yYWdlX2J1ZiwgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIEluamVjdENvbm5lY3RlZEV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICB0QlRBX0dBVFRDX09QRU4gZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgICAgICAuY2xpZW50X2lmID0gZ2F0dF9pZiwKLSAgICAgICAgLnJlbW90ZV9iZGEgPSBhZGRyZXNzLAotICAgICAgICAudHJhbnNwb3J0ID0gR0FUVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgIC5tdHUgPSAyNDAsCi0gICAgfTsKLQotICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX09QRU5fRVZULCAodEJUQV9HQVRUQyopJmV2ZW50X2RhdGEpOwotICB9Ci0KLSAgdm9pZCBJbmplY3REaXNjb25uZWN0ZWRFdmVudCgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb24gPSBHQVRUX0NPTk5fVEVSTUlOQVRFX1BFRVJfVVNFUikgewotICAgIHRCVEFfR0FUVENfQ0xPU0UgZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgICAgICAuY2xpZW50X2lmID0gZ2F0dF9pZiwKLSAgICAgICAgLnJlbW90ZV9iZGEgPSBhZGRyZXNzLAotICAgICAgICAucmVhc29uID0gcmVhc29uLAotICAgIH07Ci0KLSAgICBnYXR0X2NhbGxiYWNrKEJUQV9HQVRUQ19DTE9TRV9FVlQsICh0QlRBX0dBVFRDKikmZXZlbnRfZGF0YSk7Ci0gIH0KLQotICB2b2lkIEdldFNlYXJjaENvbXBsZXRlRXZlbnQodWludDE2X3QgY29ubl9pZCkgewotICAgIHRCVEFfR0FUVENfU0VBUkNIX0NNUEwgZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgIH07Ci0KLSAgICBnYXR0X2NhbGxiYWNrKEJUQV9HQVRUQ19TRUFSQ0hfQ01QTF9FVlQsICh0QlRBX0dBVFRDKikmZXZlbnRfZGF0YSk7Ci0gIH0KLQotICB2b2lkIFRlc3RSZWFkQ2hhcmFjdGVyaXN0aWMoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBoYW5kbGVzKSB7Ci0gICAgU2V0U2FtcGxlRGF0YWJhc2VDc2lzKGNvbm5faWQsIDEpOwotICAgIFRlc3RBcHBSZWdpc3RlcigpOwotICAgIFRlc3RDb25uZWN0KGFkZHJlc3MpOwotICAgIEluamVjdENvbm5lY3RlZEV2ZW50KGFkZHJlc3MsIGNvbm5faWQpOwotCi0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgUmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIF8sIF8sIF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoRG9EZWZhdWx0KCkpOwotICAgIGZvciAoYXV0byBjb25zdCYgaGFuZGxlIDogaGFuZGxlcykgewotICAgICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgUmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSwgXywgXykpCi0gICAgICAgICAgLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KGNvbm5faWQpOwotICAgIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci0gIH0KLQotICB2b2lkIEdldERpc2Nvbm5lY3RlZEV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICB0QlRBX0dBVFRDX0NMT1NFIGV2ZW50X2RhdGEgPSB7Ci0gICAgICAgIC5zdGF0dXMgPSBHQVRUX1NVQ0NFU1MsCi0gICAgICAgIC5jb25uX2lkID0gY29ubl9pZCwKLSAgICAgICAgLmNsaWVudF9pZiA9IGdhdHRfaWYsCi0gICAgICAgIC5yZW1vdGVfYmRhID0gYWRkcmVzcywKLSAgICAgICAgLnJlYXNvbiA9IEdBVFRfQ09OTl9URVJNSU5BVEVfUEVFUl9VU0VSLAotICAgIH07Ci0KLSAgICBnYXR0X2NhbGxiYWNrKEJUQV9HQVRUQ19DTE9TRV9FVlQsICh0QlRBX0dBVFRDKikmZXZlbnRfZGF0YSk7Ci0gIH0KLQotICB2b2lkIFNldEVuY3J5cHRpb25SZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBzdWNjZXNzKSB7Ci0gICAgT05fQ0FMTChidG1faW50ZXJmYWNlLCBHZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoYWRkcmVzcywgTm90TnVsbCgpLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoU2V0QXJnUG9pbnRlZTwxPigwKSwgUmV0dXJuKHRydWUpKSk7Ci0gICAgRVhQRUNUX0NBTEwoYnRtX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBTZXRFbmNyeXB0aW9uKGFkZHJlc3MsIF8sIE5vdE51bGwoKSwgXywgQlRNX0JMRV9TRUNfRU5DUllQVCkpCi0gICAgICAgIC5XaWxsT25jZShJbnZva2UoCi0gICAgICAgICAgICBbJnN1Y2Nlc3NdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSAtPiB0QlRNX1NUQVRVUyB7Ci0gICAgICAgICAgICAgIHBfY2FsbGJhY2soJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID8gQlRNX1NVQ0NFU1MgOiBCVE1fRkFJTEVEX09OX1NFQ1VSSVRZKTsKLSAgICAgICAgICAgICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICAgICAgICAgICAgfSkpOwotICB9Ci0KLSAgdm9pZCBTZXRTYW1wbGVEYXRhYmFzZUNzaXModWludDE2X3QgY29ubl9pZCwgdWludDhfdCByYW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNpcmtfbXNiID0gMSkgewotICAgIHNldF9zYW1wbGVfZGF0YWJhc2UoY29ubl9pZCwgdHJ1ZSwgZmFsc2UsIHJhbmssIHNpcmtfbXNiKTsKLSAgfQotICB2b2lkIFNldFNhbXBsZURhdGFiYXNlTm9Dc2lzKHVpbnQxNl90IGNvbm5faWQsIHVpbnQ4X3QgcmFuaykgewotICAgIHNldF9zYW1wbGVfZGF0YWJhc2UoY29ubl9pZCwgZmFsc2UsIGZhbHNlLCByYW5rKTsKLSAgfQotICB2b2lkIFNldFNhbXBsZURhdGFiYXNlQ3Npc0Jyb2tlbih1aW50MTZfdCBjb25uX2lkLCB1aW50IHJhbmspIHsKLSAgICBzZXRfc2FtcGxlX2RhdGFiYXNlKGNvbm5faWQsIGZhbHNlLCB0cnVlLCByYW5rKTsKLSAgfQotICB2b2lkIFNldFNhbXBsZURhdGFiYXNlRG91YmxlQ3Npcyh1aW50MTZfdCBjb25uX2lkLCB1aW50OF90IHJhbmtfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByYW5rXzIpIHsKLSAgICBzZXRfc2FtcGxlX2RhdGFiYXNlX2RvdWJsZV9jc2lzKGNvbm5faWQsIHJhbmtfMSwgcmFua18yLCBmYWxzZSk7Ci0gIH0KLSAgdm9pZCBTZXRTYW1wbGVEYXRhYmFzZURvdWJsZUNzaXNCcm9rZW4odWludDE2X3QgY29ubl9pZCwgdWludDhfdCByYW5rXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmFua18yKSB7Ci0gICAgc2V0X3NhbXBsZV9kYXRhYmFzZV9kb3VibGVfY3Npcyhjb25uX2lkLCByYW5rXzEsIHJhbmtfMiwgdHJ1ZSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0NzaXNDYWxsYmFja3M+IGNhbGxiYWNrczsKLSAgc3RkOjp1bmlxdWVfcHRyPE1vY2tDc2lzQ2FsbGJhY2tzPiBsb2NrX2NhbGxiYWNrOwotICBibHVldG9vdGg6Om1hbmFnZXI6Ok1vY2tCdG1JbnRlcmZhY2UgYnRtX2ludGVyZmFjZTsKLSAgZG06Ok1vY2tCdGFEbUludGVyZmFjZSBkbV9pbnRlcmZhY2U7Ci0gIGdhdHQ6Ok1vY2tCdGFHYXR0SW50ZXJmYWNlIGdhdHRfaW50ZXJmYWNlOwotICBnYXR0OjpNb2NrQnRhR2F0dFF1ZXVlIGdhdHRfcXVldWU7Ci0gIE1vY2tDc2lzTG9ja0NhbGxiYWNrIGNzaXNfbG9ja19jYjsKLSAgdEJUQV9HQVRUQ19DQkFDSyogZ2F0dF9jYWxsYmFjazsKLSAgY29uc3QgdWludDhfdCBnYXR0X2lmID0gMHhmZjsKLSAgc3RkOjptYXA8dWludDE2X3QsIHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPj4gc2VydmljZXNfbWFwOwotCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMiA9IEdldFRlc3RBZGRyZXNzKDEpOwotfTsKLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2dldF91bmluaXRpYWxpemVkKSB7Ci0gIEFTU0VSVF9ERUFUSChDc2lzQ2xpZW50OjpHZXQoKSwgIiIpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3RfaW5pdGlhbGl6ZSkgewotICBDc2lzQ2xpZW50OjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICBBU1NFUlRfVFJVRShDc2lzQ2xpZW50OjpJc0NzaXNDbGllbnRSdW5uaW5nKCkpOwotICBDc2lzQ2xpZW50OjpDbGVhblVwKCk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9pbml0aWFsaXplX3R3aWNlKSB7Ci0gIENzaXNDbGllbnQ6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gIENzaXNDbGllbnQqIGNzaXNfcCA9IENzaXNDbGllbnQ6OkdldCgpOwotICBDc2lzQ2xpZW50OjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICBBU1NFUlRfRVEoY3Npc19wLCBDc2lzQ2xpZW50OjpHZXQoKSk7Ci0gIENzaXNDbGllbnQ6OkNsZWFuVXAoKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2NsZWFudXBfaW5pdGlhbGl6ZWQpIHsKLSAgQ3Npc0NsaWVudDo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCksIGJhc2U6OkRvTm90aGluZygpKTsKLSAgQ3Npc0NsaWVudDo6Q2xlYW5VcCgpOwotICBBU1NFUlRfRkFMU0UoQ3Npc0NsaWVudDo6SXNDc2lzQ2xpZW50UnVubmluZygpKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2NsZWFudXBfdW5pbml0aWFsaXplZCkgewotICBDc2lzQ2xpZW50OjpDbGVhblVwKCk7Ci0gIEFTU0VSVF9GQUxTRShDc2lzQ2xpZW50OjpJc0NzaXNDbGllbnRSdW5uaW5nKCkpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3RfYXBwX3JlZ2lzdHJhdGlvbikgewotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2Nvbm5lY3QpIHsKLSAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gIFRlc3RDb25uZWN0KEdldFRlc3RBZGRyZXNzKDApKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2Rpc2Nvbm5lY3Rfbm9uX2Nvbm5lY3RlZCkgewotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgVGVzdERpc2Nvbm5lY3QodGVzdF9hZGRyZXNzLCBHQVRUX0lOVkFMSURfQ09OTl9JRCk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9kaXNjb25uZWN0X2Nvbm5lY3RlZCkgewotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgSW5qZWN0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgVGVzdERpc2Nvbm5lY3QodGVzdF9hZGRyZXNzLCAxKTsKLSAgSW5qZWN0RGlzY29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2Rpc2Nvbm5lY3RlZCkgewotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgSW5qZWN0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUodGVzdF9hZGRyZXNzLCBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCkpOwotICBJbmplY3REaXNjb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotCi0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9kaXNjb3ZlcnlfY3Npc19mb3VuZCkgewotICBTZXRTYW1wbGVEYXRhYmFzZUNzaXMoMSwgMSk7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0Q29ubmVjdCh0ZXN0X2FkZHJlc3MpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZSh0ZXN0X2FkZHJlc3MsIENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uRGV2aWNlQXZhaWxhYmxlKHRlc3RfYWRkcmVzcywgXywgXywgXykpOwotICBJbmplY3RDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KDEpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhjYWxsYmFja3MuZ2V0KCkpOwotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3RfZGlzY292ZXJ5X2NzaXNfbm90X2ZvdW5kKSB7Ci0gIFNldFNhbXBsZURhdGFiYXNlTm9Dc2lzKDEsIDEpOwotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIENsb3NlKDEpKTsKLSAgSW5qZWN0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgR2V0U2VhcmNoQ29tcGxldGVFdmVudCgxKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoY2FsbGJhY2tzLmdldCgpKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2Rpc2NvdmVyeV9jc2lzX2Jyb2tlbikgewotICBTZXRTYW1wbGVEYXRhYmFzZUNzaXNCcm9rZW4oMSwgMSk7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0Q29ubmVjdCh0ZXN0X2FkZHJlc3MpOwotICBFWFBFQ1RfQ0FMTChnYXR0X2ludGVyZmFjZSwgQ2xvc2UoMSkpOwotICBJbmplY3RDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KDEpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhjYWxsYmFja3MuZ2V0KCkpOwotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi1jbGFzcyBDc2lzQ2xpZW50Q2FsbGJhY2tUZXN0IDogcHVibGljIENzaXNDbGllbnRUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIHVpbnQxNl90IGNvbm5faWQgPSAyMjsKLQotICB2b2lkIFNldFVwKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBDc2lzQ2xpZW50VGVzdDo6U2V0VXAoKTsKLSAgICBTZXRTYW1wbGVEYXRhYmFzZUNzaXMoY29ubl9pZCwgMSk7Ci0gICAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gICAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgICBJbmplY3RDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIGNvbm5faWQpOwotICAgIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoY29ubl9pZCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBUZXN0QXBwVW5yZWdpc3RlcigpOwotICAgIENzaXNDbGllbnRUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgdm9pZCBHZXROb3RpZmljYXRpb25FdmVudCh1aW50MTZfdCBoYW5kbGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgewotICAgIHRCVEFfR0FUVENfTk9USUZZIGV2ZW50X2RhdGEgPSB7Ci0gICAgICAgIC5jb25uX2lkID0gY29ubl9pZCwKLSAgICAgICAgLmJkYSA9IHRlc3RfYWRkcmVzcywKLSAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgLmxlbiA9ICh1aW50OF90KXZhbHVlLnNpemUoKSwKLSAgICAgICAgLmlzX25vdGlmeSA9IHRydWUsCi0gICAgfTsKLQotICAgIHN0ZDo6Y29weSh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSwgZXZlbnRfZGF0YS52YWx1ZSk7Ci0gICAgZ2F0dF9jYWxsYmFjayhCVEFfR0FUVENfTk9USUZfRVZULCAodEJUQV9HQVRUQyopJmV2ZW50X2RhdGEpOwotICB9Ci19OwotCi1URVNUX0YoQ3Npc0NsaWVudENhbGxiYWNrVGVzdCwgdGVzdF9vbl9ncm91cF9sb2NrX2NoYW5nZWRfZ3JvdXBfbm90X2ZvdW5kKSB7Ci0gIGJvb2wgY2FsbGJhY2tfY2FsbGVkID0gZmFsc2U7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgKmNhbGxiYWNrcywKLSAgICAgIE9uR3JvdXBMb2NrQ2hhbmdlZCgyLCBmYWxzZSwgQ3Npc0dyb3VwTG9ja1N0YXR1czo6RkFJTEVEX0lOVkFMSURfR1JPVVApKTsKLSAgQ3Npc0NsaWVudDo6R2V0KCktPkxvY2tHcm91cCgKLSAgICAgIDIsIHRydWUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICBbXShib29sKiBjYWxsYmFja19jYWxsZWQsIGludCBncm91cF9pZCwgYm9vbCBsb2NrZWQsCi0gICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja1N0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmICgoZ3JvdXBfaWQgPT0gMikgJiYKLSAgICAgICAgICAgICAgICAoc3RhdHVzID09IENzaXNHcm91cExvY2tTdGF0dXM6OkZBSUxFRF9JTlZBTElEX0dST1VQKSkKLSAgICAgICAgICAgICAgKmNhbGxiYWNrX2NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAmY2FsbGJhY2tfY2FsbGVkKSk7Ci0gIEFTU0VSVF9UUlVFKGNhbGxiYWNrX2NhbGxlZCk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9nZXRfZ3JvdXBfaWQpIHsKLSAgU2V0U2FtcGxlRGF0YWJhc2VDc2lzKDEsIDEpOwotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUodGVzdF9hZGRyZXNzLCBDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCkpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkRldmljZUF2YWlsYWJsZSh0ZXN0X2FkZHJlc3MsIF8sIF8sIF8pKTsKLSAgSW5qZWN0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgR2V0U2VhcmNoQ29tcGxldGVFdmVudCgxKTsKLSAgaW50IGdyb3VwX2lkID0gQ3Npc0NsaWVudDo6R2V0KCktPkdldEdyb3VwSWQodGVzdF9hZGRyZXNzKTsKLSAgQVNTRVJUX1RSVUUoZ3JvdXBfaWQgPT0gMSk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9pc19ncm91cF9lbXB0eSkgewotICBzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPENzaXNHcm91cD4+IGNzaXNfZ3JvdXBzXzsKLSAgYXV0byBnXzEgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNHcm91cD4oNjY2LCBibHVldG9vdGg6OlV1aWQ6OmtFbXB0eSk7Ci0gIGNzaXNfZ3JvdXBzXy5wdXNoX2JhY2soZ18xKTsKLQotICBBU1NFUlRfVFJVRShnXzEtPklzRW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9hZGRfZGV2aWNlX3RvX2dyb3VwKSB7Ci0gIGF1dG8gZ18xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KDY2NiwgYmx1ZXRvb3RoOjpVdWlkOjprRW1wdHkpOwotICBhdXRvIGRfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0RldmljZT4oKTsKLQotICBBU1NFUlRfVFJVRShnXzEtPklzRW1wdHkoKSk7Ci0gIGdfMS0+QWRkRGV2aWNlKGRfMSk7Ci0gIEFTU0VSVF9GQUxTRShnXzEtPklzRW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9zZXRfZGVzaXJlZF9zaXplKSB7Ci0gIGF1dG8gZ18xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KDY2NiwgYmx1ZXRvb3RoOjpVdWlkOjprRW1wdHkpOwotICBnXzEtPlNldERlc2lyZWRTaXplKDEwKTsKLSAgQVNTRVJUX0VRKChpbnQpc2l6ZW9mKGdfMSksIDE2KTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2dldF9kZXNpcmVkX3NpemUpIHsKLSAgYXV0byBnXzEgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNHcm91cD4oNjY2LCBibHVldG9vdGg6OlV1aWQ6OmtFbXB0eSk7Ci0gIGdfMS0+U2V0RGVzaXJlZFNpemUoMTApOwotICBBU1NFUlRfRVEoZ18xLT5HZXREZXNpcmVkU2l6ZSgpLCAxMCk7Ci19Ci0KLVRFU1RfRihDc2lzQ2xpZW50VGVzdCwgdGVzdF9pc19kZXZpY2VfaW5fdGhlX2dyb3VwKSB7Ci0gIGF1dG8gZ18xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KDY2NiwgYmx1ZXRvb3RoOjpVdWlkOjprRW1wdHkpOwotICBhdXRvIGRfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0RldmljZT4oKTsKLSAgZ18xLT5BZGREZXZpY2UoZF8xKTsKLSAgZ18xLT5Jc0RldmljZUluVGhlR3JvdXAoZF8xKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2dldF9jdXJyZW50X3NpemUpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMSA9IEdldFRlc3RBZGRyZXNzKDApOwotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18yID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzMgPSBHZXRUZXN0QWRkcmVzcygyKTsKLSAgYXV0byBnXzEgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNHcm91cD4oNjY2LCBibHVldG9vdGg6OlV1aWQ6OmtFbXB0eSk7Ci0gIGF1dG8gZF8xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzRGV2aWNlPih0ZXN0X2FkZHJlc3NfMSwgdHJ1ZSk7Ci0gIGF1dG8gZF8yID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzRGV2aWNlPih0ZXN0X2FkZHJlc3NfMiwgdHJ1ZSk7Ci0gIGF1dG8gZF8zID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzRGV2aWNlPih0ZXN0X2FkZHJlc3NfMywgdHJ1ZSk7Ci0gIGdfMS0+QWRkRGV2aWNlKGRfMSk7Ci0gIGdfMS0+QWRkRGV2aWNlKGRfMik7Ci0gIGdfMS0+QWRkRGV2aWNlKGRfMyk7Ci0gIEFTU0VSVF9FUSgzLCBnXzEtPkdldEN1cnJlbnRTaXplKCkpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc2V0X2N1cnJlbnRfbG9ja19zdGF0ZV91bnNldCkgewotICBhdXRvIGdfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0dyb3VwPig2NjYsIGJsdWV0b290aDo6VXVpZDo6a0VtcHR5KTsKLSAgZ18xLT5TZXRDdXJyZW50TG9ja1N0YXRlKENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5TRVQpOwotICBBU1NFUlRfRVEoZ18xLT5HZXRDdXJyZW50TG9ja1N0YXRlKCksIENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5TRVQpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc2V0X2N1cnJlbnRfbG9ja19zdGF0ZV9sb2NrZWQpIHsKLSAgYXV0byBnXzEgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNHcm91cD4oNjY2LCBibHVldG9vdGg6OlV1aWQ6OmtFbXB0eSk7Ci0gIGdfMS0+U2V0Q3VycmVudExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX0xPQ0tFRCk7Ci0gIEFTU0VSVF9FUShnXzEtPkdldEN1cnJlbnRMb2NrU3RhdGUoKSwgQ3Npc0xvY2tTdGF0ZTo6Q1NJU19TVEFURV9MT0NLRUQpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc2V0X2N1cnJlbnRfbG9ja19zdGF0ZV91bmxvY2tlZCkgewotICBhdXRvIGdfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0dyb3VwPig2NjYsIGJsdWV0b290aDo6VXVpZDo6a0VtcHR5KTsKLSAgZ18xLT5TZXRDdXJyZW50TG9ja1N0YXRlKENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5MT0NLRUQpOwotICBBU1NFUlRfRVEoZ18xLT5HZXRDdXJyZW50TG9ja1N0YXRlKCksIENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5MT0NLRUQpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc2V0X3ZhcmlvdXNfbG9ja19zdGF0ZXMpIHsKLSAgYXV0byBnXzEgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNHcm91cD4oNjY2LCBibHVldG9vdGg6OlV1aWQ6OmtFbXB0eSk7Ci0gIGdfMS0+U2V0Q3VycmVudExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOTE9DS0VEKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0Q3VycmVudExvY2tTdGF0ZSgpLCBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOTE9DS0VEKTsKLSAgZ18xLT5TZXRDdXJyZW50TG9ja1N0YXRlKENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VEKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0Q3VycmVudExvY2tTdGF0ZSgpLCBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX0xPQ0tFRCk7Ci0gIGdfMS0+U2V0Q3VycmVudExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0Q3VycmVudExvY2tTdGF0ZSgpLCBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X3NldF9kaXNjb3Zlcnlfc3RhdGVfY29tcGxldGVkKSB7Ci0gIGF1dG8gZ18xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KDY2NiwgYmx1ZXRvb3RoOjpVdWlkOjprRW1wdHkpOwotICBnXzEtPlNldERpc2NvdmVyeVN0YXRlKENzaXNEaXNjb3ZlcnlTdGF0ZTo6Q1NJU19ESVNDT1ZFUllfQ09NUExFVEVEKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0RGlzY292ZXJ5U3RhdGUoKSwKLSAgICAgICAgICAgIENzaXNEaXNjb3ZlcnlTdGF0ZTo6Q1NJU19ESVNDT1ZFUllfQ09NUExFVEVEKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X3NldF9kaXNjb3Zlcnlfc3RhdGVfaWRsZSkgewotICBhdXRvIGdfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0dyb3VwPig2NjYsIGJsdWV0b290aDo6VXVpZDo6a0VtcHR5KTsKLSAgZ18xLT5TZXREaXNjb3ZlcnlTdGF0ZShDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX0lETEUpOwotICBBU1NFUlRfRVEoZ18xLT5HZXREaXNjb3ZlcnlTdGF0ZSgpLCBDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX0lETEUpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc2V0X2Rpc2NvdmVyeV9zdGF0ZV9vbmdvaW5nKSB7Ci0gIGF1dG8gZ18xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KDY2NiwgYmx1ZXRvb3RoOjpVdWlkOjprRW1wdHkpOwotICBnXzEtPlNldERpc2NvdmVyeVN0YXRlKENzaXNEaXNjb3ZlcnlTdGF0ZTo6Q1NJU19ESVNDT1ZFUllfT05HT0lORyk7Ci0gIEFTU0VSVF9FUShnXzEtPkdldERpc2NvdmVyeVN0YXRlKCksCi0gICAgICAgICAgICBDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX09OR09JTkcpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc2V0X3ZhcmlvdXNfZGlzY292ZXJ5X3N0YXRlcykgewotICBhdXRvIGdfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0dyb3VwPig2NjYsIGJsdWV0b290aDo6VXVpZDo6a0VtcHR5KTsKLSAgZ18xLT5TZXREaXNjb3ZlcnlTdGF0ZShDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX0NPTVBMRVRFRCk7Ci0gIEFTU0VSVF9FUShnXzEtPkdldERpc2NvdmVyeVN0YXRlKCksCi0gICAgICAgICAgICBDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX0NPTVBMRVRFRCk7Ci0gIGdfMS0+U2V0RGlzY292ZXJ5U3RhdGUoQ3Npc0Rpc2NvdmVyeVN0YXRlOjpDU0lTX0RJU0NPVkVSWV9JRExFKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0RGlzY292ZXJ5U3RhdGUoKSwgQ3Npc0Rpc2NvdmVyeVN0YXRlOjpDU0lTX0RJU0NPVkVSWV9JRExFKTsKLSAgZ18xLT5TZXREaXNjb3ZlcnlTdGF0ZShDc2lzRGlzY292ZXJ5U3RhdGU6OkNTSVNfRElTQ09WRVJZX09OR09JTkcpOwotICBBU1NFUlRfRVEoZ18xLT5HZXREaXNjb3ZlcnlTdGF0ZSgpLAotICAgICAgICAgICAgQ3Npc0Rpc2NvdmVyeVN0YXRlOjpDU0lTX0RJU0NPVkVSWV9PTkdPSU5HKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X2dldF9maXJzdF9sYXN0X2RldmljZSkgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18zID0gR2V0VGVzdEFkZHJlc3MoMyk7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzQgPSBHZXRUZXN0QWRkcmVzcyg0KTsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfNSA9IEdldFRlc3RBZGRyZXNzKDUpOwotICBhdXRvIGdfMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q3Npc0dyb3VwPig2NjYsIGJsdWV0b290aDo6VXVpZDo6a0VtcHR5KTsKLSAgYXV0byBkXzEgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNEZXZpY2U+KHRlc3RfYWRkcmVzc18zLCB0cnVlKTsKLSAgYXV0byBkXzIgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNEZXZpY2U+KHRlc3RfYWRkcmVzc180LCB0cnVlKTsKLSAgYXV0byBkXzMgPSBzdGQ6Om1ha2Vfc2hhcmVkPENzaXNEZXZpY2U+KHRlc3RfYWRkcmVzc181LCB0cnVlKTsKLSAgZ18xLT5BZGREZXZpY2UoZF8xKTsKLSAgZ18xLT5BZGREZXZpY2UoZF8yKTsKLSAgZ18xLT5BZGREZXZpY2UoZF8zKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0TGFzdERldmljZSgpLCBkXzMpOwotICBBU1NFUlRfRVEoZ18xLT5HZXRGaXJzdERldmljZSgpLCBkXzEpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3RfZ2V0X3NldF9zaXJrKSB7Ci0gIGF1dG8gZ18xID0gc3RkOjptYWtlX3NoYXJlZDxDc2lzR3JvdXA+KDY2NiwgYmx1ZXRvb3RoOjpVdWlkOjprRW1wdHkpOwotICBPY3RldDE2IHNpcmsgPSB7MX07Ci0gIGdfMS0+U2V0U2lyayhzaXJrKTsKLSAgQVNTRVJUX0VRKGdfMS0+R2V0U2lyaygpLCBzaXJrKTsKLX0KLQotY2xhc3MgQ3Npc011bHRpQ2xpZW50VGVzdCA6IHB1YmxpYyBDc2lzQ2xpZW50VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18xID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzIgPSBHZXRUZXN0QWRkcmVzcygyKTsKLQotICB2b2lkIFNldFVwKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBDc2lzQ2xpZW50VGVzdDo6U2V0VXAoKTsKLSAgICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgICBTZXRTYW1wbGVEYXRhYmFzZURvdWJsZUNzaXMoMHgwMDEsIDEsIDIpOwotICB9Ci19OwotCi1jbGFzcyBDc2lzTXVsdGlDbGllbnRUZXN0QnJva2VuIDogcHVibGljIENzaXNDbGllbnRUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzEgPSBHZXRUZXN0QWRkcmVzcygxKTsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMiA9IEdldFRlc3RBZGRyZXNzKDIpOwotCi0gIHZvaWQgU2V0VXAodm9pZCkgb3ZlcnJpZGUgewotICAgIENzaXNDbGllbnRUZXN0OjpTZXRVcCgpOwotICAgIFRlc3RBcHBSZWdpc3RlcigpOwotICAgIFNldFNhbXBsZURhdGFiYXNlRG91YmxlQ3Npc0Jyb2tlbigweDAwMSwgMSwgMik7Ci0gIH0KLX07Ci0KLVRFU1RfRihDc2lzTXVsdGlDbGllbnRUZXN0LCB0ZXN0X2FkZF9tdWx0aXBsZV9pbnN0YW5jZXMpIHsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLSAgQ3Npc0NsaWVudFRlc3Q6OlRlYXJEb3duKCk7Ci19Ci0KLVRFU1RfRihDc2lzTXVsdGlDbGllbnRUZXN0LCB0ZXN0X2NsZWFudXBfbXVsdGlwbGVfaW5zdGFuY2VzKSB7Ci0gIENzaXNDbGllbnQ6OkNsZWFuVXAoKTsKLSAgQ3Npc0NsaWVudDo6SXNDc2lzQ2xpZW50UnVubmluZygpOwotfQotCi1URVNUX0YoQ3Npc011bHRpQ2xpZW50VGVzdCwgdGVzdF9jb25uZWN0X211bHRpcGxlX2luc3RhbmNlcykgewotICBUZXN0Q29ubmVjdChHZXRUZXN0QWRkcmVzcygwKSk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihDc2lzTXVsdGlDbGllbnRUZXN0LCB0ZXN0X2Rpc2Nvbm5lY3RfbXVsdGlwbGVfaW5zdGFuY2VzKSB7Ci0gIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIEluamVjdENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgMSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKHRlc3RfYWRkcmVzcywgQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQpKTsKLSAgSW5qZWN0RGlzY29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLQotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotICBDc2lzQ2xpZW50VGVzdDo6VGVhckRvd24oKTsKLX0KLQotVEVTVF9GKENzaXNNdWx0aUNsaWVudFRlc3QsIHRlc3RfbG9ja19tdWx0aXBsZV9pbnN0YW5jZXMpIHsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgSW5qZWN0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgR2V0U2VhcmNoQ29tcGxldGVFdmVudCgxKTsKLQotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLAotICAgICAgICAgICAgICBPbkdyb3VwTG9ja0NoYW5nZWQoMSwgdHJ1ZSwgQ3Npc0dyb3VwTG9ja1N0YXR1czo6U1VDQ0VTUykpOwotICBFWFBFQ1RfQ0FMTCgqY3Npc19sb2NrX2NhbGxiYWNrX21vY2ssCi0gICAgICAgICAgICAgIENzaXNHcm91cExvY2tDYigxLCB0cnVlLCBDc2lzR3JvdXBMb2NrU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIE9OX0NBTEwoZ2F0dF9xdWV1ZSwgV3JpdGVDaGFyYWN0ZXJpc3RpYyhfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIEludm9rZShbXSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLCB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIC0+IHZvaWQgewotICAgICAgICAgICAgaWYgKGNiKQotICAgICAgICAgICAgICBjYihjb25uX2lkLCBHQVRUX1NVQ0NFU1MsIGhhbmRsZSwgdmFsdWUuc2l6ZSgpLCB2YWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgIGNiX2RhdGEpOwotICAgICAgICAgIH0pKTsKLSAgQ3Npc0NsaWVudDo6R2V0KCktPkxvY2tHcm91cCgKLSAgICAgIDEsIHRydWUsCi0gICAgICBiYXNlOjpCaW5kT25jZShbXShpbnQgZ3JvdXBfaWQsIGJvb2wgbG9ja2VkLCBDc2lzR3JvdXBMb2NrU3RhdHVzIHN0YXR1cykgewotICAgICAgICBjc2lzX2xvY2tfY2FsbGJhY2tfbW9jay0+Q3Npc0dyb3VwTG9ja0NiKGdyb3VwX2lkLCBsb2NrZWQsIHN0YXR1cyk7Ci0gICAgICB9KSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Hcm91cExvY2tDaGFuZ2VkKDIsIHRydWUsIENzaXNHcm91cExvY2tTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgRVhQRUNUX0NBTEwoKmNzaXNfbG9ja19jYWxsYmFja19tb2NrLAotICAgICAgICAgICAgICBDc2lzR3JvdXBMb2NrQ2IoMiwgdHJ1ZSwgQ3Npc0dyb3VwTG9ja1N0YXR1czo6U1VDQ0VTUykpOwotICBDc2lzQ2xpZW50OjpHZXQoKS0+TG9ja0dyb3VwKAotICAgICAgMiwgdHJ1ZSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKFtdKGludCBncm91cF9pZCwgYm9vbCBsb2NrZWQsIENzaXNHcm91cExvY2tTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIGNzaXNfbG9ja19jYWxsYmFja19tb2NrLT5Dc2lzR3JvdXBMb2NrQ2IoZ3JvdXBfaWQsIGxvY2tlZCwgc3RhdHVzKTsKLSAgICAgIH0pKTsKLX0KLQotVEVTVF9GKENzaXNNdWx0aUNsaWVudFRlc3QsIHRlc3RfdW5sb2NrX211bHRpcGxlX2luc3RhbmNlcykgewotICBUZXN0Q29ubmVjdCh0ZXN0X2FkZHJlc3MpOwotICBJbmplY3RDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KDEpOwotCi0gIE9OX0NBTEwoZ2F0dF9xdWV1ZSwgV3JpdGVDaGFyYWN0ZXJpc3RpYyhfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIEludm9rZShbXSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLCB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIC0+IHZvaWQgewotICAgICAgICAgICAgaWYgKGNiKQotICAgICAgICAgICAgICBjYihjb25uX2lkLCBHQVRUX1NVQ0NFU1MsIGhhbmRsZSwgdmFsdWUuc2l6ZSgpLCB2YWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgIGNiX2RhdGEpOwotICAgICAgICAgIH0pKTsKLSAgQ3Npc0NsaWVudDo6R2V0KCktPkxvY2tHcm91cCgKLSAgICAgIDEsIHRydWUsCi0gICAgICBiYXNlOjpCaW5kT25jZShbXShpbnQgZ3JvdXBfaWQsIGJvb2wgbG9ja2VkLCBDc2lzR3JvdXBMb2NrU3RhdHVzIHN0YXR1cykgewotICAgICAgICBjc2lzX2xvY2tfY2FsbGJhY2tfbW9jay0+Q3Npc0dyb3VwTG9ja0NiKGdyb3VwX2lkLCBsb2NrZWQsIHN0YXR1cyk7Ci0gICAgICB9KSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Hcm91cExvY2tDaGFuZ2VkKDEsIGZhbHNlLCBDc2lzR3JvdXBMb2NrU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIEVYUEVDVF9DQUxMKCpjc2lzX2xvY2tfY2FsbGJhY2tfbW9jaywKLSAgICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja0NiKDEsIGZhbHNlLCBDc2lzR3JvdXBMb2NrU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIENzaXNDbGllbnQ6OkdldCgpLT5Mb2NrR3JvdXAoCi0gICAgICAxLCBmYWxzZSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKFtdKGludCBncm91cF9pZCwgYm9vbCBsb2NrZWQsIENzaXNHcm91cExvY2tTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIGNzaXNfbG9ja19jYWxsYmFja19tb2NrLT5Dc2lzR3JvdXBMb2NrQ2IoZ3JvdXBfaWQsIGxvY2tlZCwgc3RhdHVzKTsKLSAgICAgIH0pKTsKLX0KLQotVEVTVF9GKENzaXNNdWx0aUNsaWVudFRlc3QsIHRlc3RfZGlzY29ubmVjdF9sb2NrZWRfbXVsdGlwbGVfaW5zdGFuY2VzKSB7Ci0gIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIEluamVjdENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgMSk7Ci0gIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoMSk7Ci0KLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzMik7Ci0gIEluamVjdENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzczIsIDIpOwotICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KDIpOwotCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsCi0gICAgICAgICAgICAgIE9uR3JvdXBMb2NrQ2hhbmdlZCgxLCB0cnVlLCBDc2lzR3JvdXBMb2NrU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIEVYUEVDVF9DQUxMKCpjc2lzX2xvY2tfY2FsbGJhY2tfbW9jaywKLSAgICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja0NiKDEsIHRydWUsIENzaXNHcm91cExvY2tTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgT05fQ0FMTChnYXR0X3F1ZXVlLCBXcml0ZUNoYXJhY3RlcmlzdGljKF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgSW52b2tlKFtdKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgLT4gdm9pZCB7Ci0gICAgICAgICAgICBpZiAoY2IpCi0gICAgICAgICAgICAgIGNiKGNvbm5faWQsIEdBVFRfU1VDQ0VTUywgaGFuZGxlLCB2YWx1ZS5zaXplKCksIHZhbHVlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgY2JfZGF0YSk7Ci0gICAgICAgICAgfSkpOwotICBDc2lzQ2xpZW50OjpHZXQoKS0+TG9ja0dyb3VwKAotICAgICAgMSwgdHJ1ZSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKFtdKGludCBncm91cF9pZCwgYm9vbCBsb2NrZWQsIENzaXNHcm91cExvY2tTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIGNzaXNfbG9ja19jYWxsYmFja19tb2NrLT5Dc2lzR3JvdXBMb2NrQ2IoZ3JvdXBfaWQsIGxvY2tlZCwgc3RhdHVzKTsKLSAgICAgIH0pKTsKLQotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLAotICAgICAgICAgICAgICBPbkdyb3VwTG9ja0NoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAxLCBmYWxzZSwgQ3Npc0dyb3VwTG9ja1N0YXR1czo6TE9DS0VEX0dST1VQX01FTUJFUl9MT1NUKSk7Ci0gIEluamVjdERpc2Nvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgMiwgR0FUVF9DT05OX1RJTUVPVVQpOwotfQotCi1URVNUX0YoQ3Npc011bHRpQ2xpZW50VGVzdCwgdGVzdF9kaXNjb3Zlcl9tdWx0aXBsZV9pbnN0YW5jZXMpIHsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUodGVzdF9hZGRyZXNzLCBDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uRGV2aWNlQXZhaWxhYmxlKHRlc3RfYWRkcmVzcywgXywgXywgXykpLlRpbWVzKDIpOwotICBJbmplY3RDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KDEpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhjYWxsYmFja3MuZ2V0KCkpOwotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi1URVNUX0YoQ3Npc0NsaWVudFRlc3QsIHRlc3Rfc3RvcmFnZV9jYWxscykgewotICBTZXRTYW1wbGVEYXRhYmFzZUNzaXMoMSwgMSk7Ci0KLSAgQVNTRVJUX0VRKDAsCi0gICAgICAgICAgICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2NzaXNfZGV2aWNlcyJdKTsKLSAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gIEFTU0VSVF9FUSgxLAotICAgICAgICAgICAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9jc2lzX2RldmljZXMiXSk7Ci0KLSAgQVNTRVJUX0VRKDAsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJidGlmX3N0b3JhZ2VfdXBkYXRlX2NzaXNfaW5mbyJdKTsKLSAgQVNTRVJUX0VRKDAsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJidGlmX3N0b3JhZ2Vfc2V0X2NzaXNfYXV0b2Nvbm5lY3QiXSk7Ci0gIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIEluamVjdENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgMSk7Ci0gIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoMSk7Ci0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRpZl9zdG9yYWdlX3NldF9jc2lzX2F1dG9jb25uZWN0Il0pOwotICBBU1NFUlRfRVEoMSwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0aWZfc3RvcmFnZV91cGRhdGVfY3Npc19pbmZvIl0pOwotCi0gIEFTU0VSVF9FUSgwLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRpZl9zdG9yYWdlX3JlbW92ZV9jc2lzX2RldmljZSJdKTsKLSAgQ3Npc0NsaWVudDo6R2V0KCktPlJlbW92ZURldmljZSh0ZXN0X2FkZHJlc3MpOwotICBBU1NFUlRfRVEoMSwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0aWZfc3RvcmFnZV9yZW1vdmVfY3Npc19kZXZpY2UiXSk7Ci0KLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKENzaXNDbGllbnRUZXN0LCB0ZXN0X3N0b3JhZ2VfY29udGVudCkgewotICAvLyBUd28gZGV2aWNlcyBpbiBvbmUgc2V0Ci0gIFNldFNhbXBsZURhdGFiYXNlQ3NpcygxLCAxKTsKLSAgU2V0U2FtcGxlRGF0YWJhc2VDc2lzKDIsIDIpOwotICAvLyBEZXZpY2VzIGluIHRoZSBvdGhlciBzZXQKLSAgU2V0U2FtcGxlRGF0YWJhc2VDc2lzKDMsIDEsIDIpOwotICBTZXRTYW1wbGVEYXRhYmFzZUNzaXMoNCwgMSwgMik7Ci0KLSAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gIFRlc3RDb25uZWN0KEdldFRlc3RBZGRyZXNzKDEpKTsKLSAgSW5qZWN0Q29ubmVjdGVkRXZlbnQoR2V0VGVzdEFkZHJlc3MoMSksIDEpOwotICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KDEpOwotICBBU1NFUlRfRVEoMSwgQ3Npc0NsaWVudDo6R2V0KCktPkdldEdyb3VwSWQoCi0gICAgICAgICAgICAgICAgICAgR2V0VGVzdEFkZHJlc3MoMSksIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MDAwMCkpKTsKLQotICBUZXN0Q29ubmVjdChHZXRUZXN0QWRkcmVzcygyKSk7Ci0gIEluamVjdENvbm5lY3RlZEV2ZW50KEdldFRlc3RBZGRyZXNzKDIpLCAyKTsKLSAgR2V0U2VhcmNoQ29tcGxldGVFdmVudCgyKTsKLSAgQVNTRVJUX0VRKDEsIENzaXNDbGllbnQ6OkdldCgpLT5HZXRHcm91cElkKAotICAgICAgICAgICAgICAgICAgIEdldFRlc3RBZGRyZXNzKDIpLCBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDAwMDApKSk7Ci0KLSAgVGVzdENvbm5lY3QoR2V0VGVzdEFkZHJlc3MoMykpOwotICBJbmplY3RDb25uZWN0ZWRFdmVudChHZXRUZXN0QWRkcmVzcygzKSwgMyk7Ci0gIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoMyk7Ci0gIEFTU0VSVF9FUSgyLCBDc2lzQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBJZCgKLSAgICAgICAgICAgICAgICAgICBHZXRUZXN0QWRkcmVzcygzKSwgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgwMDAwKSkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRldjFfc3RvcmFnZTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGV2Ml9zdG9yYWdlOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXYzX3N0b3JhZ2U7Ci0KLSAgLy8gU3RvcmUgdG8gYnl0ZSBidWZmZXIKLSAgQ3Npc0NsaWVudDo6R2V0Rm9yU3RvcmFnZShHZXRUZXN0QWRkcmVzcygxKSwgZGV2MV9zdG9yYWdlKTsKLSAgQ3Npc0NsaWVudDo6R2V0Rm9yU3RvcmFnZShHZXRUZXN0QWRkcmVzcygyKSwgZGV2Ml9zdG9yYWdlKTsKLSAgQ3Npc0NsaWVudDo6R2V0Rm9yU3RvcmFnZShHZXRUZXN0QWRkcmVzcygzKSwgZGV2M19zdG9yYWdlKTsKLSAgQVNTRVJUX05FKDB1LCBkZXYxX3N0b3JhZ2Uuc2l6ZSgpKTsKLSAgQVNTRVJUX05FKDB1LCBkZXYyX3N0b3JhZ2Uuc2l6ZSgpKTsKLSAgQVNTRVJUX05FKDB1LCBkZXYzX3N0b3JhZ2Uuc2l6ZSgpKTsKLQotICAvLyBDbGVhbiBpdCB1cAotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotCi0gIC8vIFJlaW5pdGlhbGl6ZSBzZXJ2aWNlCi0gIFRlc3RBcHBSZWdpc3RlcigpOwotCi0gIC8vIFJlc3RvcmUgZGV2MSBmcm9tIHRoZSBieXRlIGJ1ZmZlcgotICBUZXN0QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMSksIDEsIGRldjFfc3RvcmFnZSk7Ci0gIEFTU0VSVF9FUSgxLCBDc2lzQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBJZCgKLSAgICAgICAgICAgICAgICAgICBHZXRUZXN0QWRkcmVzcygxKSwgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgwMDAwKSkpOwotCi0gIC8vIFJlc3RvcmUgZGV2MiBmcm9tIHRoZSBieXRlIGJ1ZmZlcgotICBUZXN0QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMiksIDIsIGRldjJfc3RvcmFnZSk7Ci0gIEFTU0VSVF9FUSgxLCBDc2lzQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBJZCgKLSAgICAgICAgICAgICAgICAgICBHZXRUZXN0QWRkcmVzcygyKSwgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgwMDAwKSkpOwotCi0gIC8vIFJlc3RvcmUgZGV2MyBmcm9tIHRoZSBieXRlIGJ1ZmZlcgotICBUZXN0QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMyksIDMsIGRldjNfc3RvcmFnZSk7Ci0gIEFTU0VSVF9FUSgyLCBDc2lzQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBJZCgKLSAgICAgICAgICAgICAgICAgICBHZXRUZXN0QWRkcmVzcygzKSwgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgwMDAwKSkpOwotCi0gIC8vIFJlc3RvcmUgbm90IGluZXJyb2dhdGVkIGRldjQgLSBlbXB0eSBidWZmZXIgYnV0IHZhbGlkIHNpcmsgZm9yIGdyb3VwIDIKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbm9fc2V0X2luZm87Ci0gIFRlc3RBZGRGcm9tU3RvcmFnZShHZXRUZXN0QWRkcmVzcyg0KSwgNCwgbm9fc2V0X2luZm8pOwotICBBU1NFUlRfRVEoMiwgQ3Npc0NsaWVudDo6R2V0KCktPkdldEdyb3VwSWQoCi0gICAgICAgICAgICAgICAgICAgR2V0VGVzdEFkZHJlc3MoNCksIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MDAwMCkpKTsKLQotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNzaXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS9jc2lzL2NzaXNfdHlwZXMuaCBiL2J0YS9jc2lzL2NzaXNfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlMDJmZC4uMDAwMDAwMAotLS0gYS9idGEvY3Npcy9jc2lzX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRhX2NzaXNfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dyb3Vwcy5oIgotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjc2lzIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzTG9ja0NiOwotCi0vLyBDU0lQIGFkZGl0aW9ucwotLyogR2VuZXJpYyBVVUlEIGlzIHVzZWQgd2hlbiBDU0lTIGlzIG5vdCBpbmNsdWRlZCBpbiBhbnkgY29udGV4dCAqLwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrQ3Npc1NlcnZpY2VVdWlkID0gYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgxODQ2KTsKLXN0YXRpYyBjb25zdCBibHVldG9vdGg6OlV1aWQga0NzaXNTaXJrVXVpZCA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MkI4NCk7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtDc2lzU2l6ZVV1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCODUpOwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrQ3Npc0xvY2tVdWlkID0gYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgyQjg2KTsKLXN0YXRpYyBjb25zdCBibHVldG9vdGg6OlV1aWQga0NzaXNSYW5rVXVpZCA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MkI4Nyk7Ci0KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3Npc0Vycm9yQ29kZUxvY2tEZW5pZWQgPSAweDgwOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDc2lzRXJyb3JDb2RlUmVsZWFzZU5vdEFsbG93ZWQgPSAweDgxOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDc2lzRXJyb3JDb2RlSW52YWxpZFZhbHVlID0gMHg4MjsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3Npc0Vycm9yQ29kZUxvY2tBY2Nlc3NTaXJrUmVqZWN0ZWQgPSAweDgzOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDc2lzRXJyb3JDb2RlTG9ja09vYlNpcmtPbmx5ID0gMHg4NDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3Npc0Vycm9yQ29kZUxvY2tBbHJlYWR5R3JhbnRlZCA9IDB4ODU7Ci0KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3Npc1NpcmtUeXBlRW5jcnlwdGVkID0gMHgwMDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3Npc1NpcmtDaGFyTGVuID0gMTc7Ci0KLXN0cnVjdCBoZGxfcGFpciB7Ci0gIGhkbF9wYWlyKCkge30KLSAgaGRsX3BhaXIodWludDE2X3QgdmFsX2hkbCwgdWludDE2X3QgY2NjX2hkbCkgOiB2YWxfaGRsKHZhbF9oZGwpLCBjY2NfaGRsKGNjY19oZGwpIHt9Ci0KLSAgdWludDE2X3QgdmFsX2hkbDsKLSAgdWludDE2X3QgY2NjX2hkbDsKLX07Ci0KLS8qIENTSVMgVHlwZXMgKi8KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrRGVmYXVsdFNjYW5EdXJhdGlvblMgPSA1Owotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtEZWZhdWx0Q3Npc1NldFNpemUgPSAyOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtVbmtub3duUmFuayA9IDB4ZmY7Ci0KLS8qIEVudW1zICovCi1lbnVtIGNsYXNzIENzaXNMb2NrU3RhdGUgOiB1aW50OF90IHsKLSAgQ1NJU19TVEFURV9VTlNFVCA9IDB4MDAsCi0gIENTSVNfU1RBVEVfVU5MT0NLRUQsCi0gIENTSVNfU1RBVEVfTE9DS0VECi19OwotCi1lbnVtIGNsYXNzIENzaXNEaXNjb3ZlcnlTdGF0ZSA6IHVpbnQ4X3QgewotICBDU0lTX0RJU0NPVkVSWV9JRExFID0gMHgwMCwKLSAgQ1NJU19ESVNDT1ZFUllfT05HT0lORywKLSAgQ1NJU19ESVNDT1ZFUllfQ09NUExFVEVELAotfTsKLQotY2xhc3MgR2F0dFNlcnZpY2VEZXZpY2UgewotIHB1YmxpYzoKLSAgUmF3QWRkcmVzcyBhZGRyOwotICAvKgotICAgKiBUaGlzIGlzIHRydWUgb25seSBkdXJpbmcgZmlyc3QgY29ubmVjdGlvbiB0byBwcm9maWxlLCB1bnRpbCB3ZSBzdG9yZSB0aGUKLSAgICogZGV2aWNlLgotICAgKi8KLSAgYm9vbCBmaXJzdF9jb25uZWN0aW9uOwotCi0gIC8qCi0gICAqIFdlIGFyZSBtYWtpbmcgYWN0aXZlIGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGlzIGRldmljZSwgJ2RpcmVjdCBjb25uZWN0Jy4KLSAgICovCi0gIGJvb2wgY29ubmVjdGluZ19hY3RpdmVseSA9IGZhbHNlOwotCi0gIHVpbnQxNl90IGNvbm5faWQgPSBHQVRUX0lOVkFMSURfQ09OTl9JRDsKLSAgdWludDE2X3Qgc2VydmljZV9oYW5kbGUgPSBHQVBfSU5WQUxJRF9IQU5ETEU7Ci0gIGJvb2wgaXNfZ2F0dF9zZXJ2aWNlX3ZhbGlkID0gZmFsc2U7Ci0KLSAgR2F0dFNlcnZpY2VEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgYm9vbCBmaXJzdF9jb25uZWN0aW9uKQotICAgICAgOiBhZGRyKGFkZHIpLCBmaXJzdF9jb25uZWN0aW9uKGZpcnN0X2Nvbm5lY3Rpb24pIHt9Ci0KLSAgR2F0dFNlcnZpY2VEZXZpY2UoKSA6IEdhdHRTZXJ2aWNlRGV2aWNlKFJhd0FkZHJlc3M6OmtFbXB0eSwgZmFsc2UpIHt9Ci0KLSAgYm9vbCBJc0Nvbm5lY3RlZCgpIGNvbnN0IHsgcmV0dXJuIChjb25uX2lkICE9IEdBVFRfSU5WQUxJRF9DT05OX0lEKTsgfQotCi0gIGNsYXNzIE1hdGNoQWRkcmVzcyB7Ci0gICBwcml2YXRlOgotICAgIFJhd0FkZHJlc3MgYWRkcjsKLQotICAgcHVibGljOgotICAgIE1hdGNoQWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSA6IGFkZHIoYWRkcikge30KLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEdhdHRTZXJ2aWNlRGV2aWNlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoYWRkciA9PSBvdGhlci0+YWRkcik7Ci0gICAgfQotICB9OwotCi0gIGNsYXNzIE1hdGNoQ29ubklkIHsKLSAgIHByaXZhdGU6Ci0gICAgdWludDE2X3QgY29ubl9pZDsKLQotICAgcHVibGljOgotICAgIE1hdGNoQ29ubklkKHVpbnQxNl90IGNvbm5faWQpIDogY29ubl9pZChjb25uX2lkKSB7fQotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8R2F0dFNlcnZpY2VEZXZpY2U+JiBvdGhlcikgY29uc3QgewotICAgICAgcmV0dXJuIChjb25uX2lkID09IG90aGVyLT5jb25uX2lkKTsKLSAgICB9Ci0gIH07Ci19OwotCi0vKgotICogQ1NJUyBpbnN0YW5jZSByZXByZXNlbnRzIHNpbmdsZSBDU0lTIHNlcnZpY2Ugb24gdGhlIHJlbW90ZSBkZXZpY2UKLSAqIGFsb25nIHdpdGggdGhlIGhhbmRsZSBpbiBkYXRhYmFzZSBhbmQgc3BlY2lmaWMgZGF0YSB0byBjb250cm9sIENTSVMgbGlrZToKLSAqIHJhbmssIGxvY2sgc3RhdGUuCi0gKgotICogSXQgYWxzbyBpbmNsdWVzIFVVSUQgb2YgdGhlIHByaW1hcnkgc2VydmljZSB3aGljaCBpbmNsdWRlcyB0aGF0IENTSVMKLSAqIGluc3RhbmNlLiBJZiB0aGlzIGlzIDB4MDAwMCBpdCBtZWFucyBDU0lTIGlzIHBlciBkZXZpY2UgYW5kIG5vdCBmb3Igc3BlY2lmaWMKLSAqIHNlcnZpY2UuCi0gKi8KLWNsYXNzIENzaXNJbnN0YW5jZSB7Ci0gcHVibGljOgotICBibHVldG9vdGg6OlV1aWQgY29vcmRpbmF0ZWRfc2VydmljZSA9IGJsdWV0b290aDo6Z3JvdXBzOjprR2VuZXJpY0NvbnRleHRVdWlkOwotCi0gIHN0cnVjdCBTdmNEYXRhIHsKLSAgICB1aW50MTZfdCBzdGFydF9oYW5kbGU7Ci0gICAgdWludDE2X3QgZW5kX2hhbmRsZTsKLSAgICBzdHJ1Y3QgaGRsX3BhaXIgc2lya19oYW5kbGU7Ci0gICAgc3RydWN0IGhkbF9wYWlyIGxvY2tfaGFuZGxlOwotICAgIHVpbnQxNl90IHJhbmtfaGFuZGxlOwotICAgIHN0cnVjdCBoZGxfcGFpciBzaXplX2hhbmRsZTsKLSAgfSBzdmNfZGF0YSA9IHsKLSAgICAgIEdBUF9JTlZBTElEX0hBTkRMRSwKLSAgICAgIEdBUF9JTlZBTElEX0hBTkRMRSwKLSAgICAgIHtHQVBfSU5WQUxJRF9IQU5ETEUsIEdBUF9JTlZBTElEX0hBTkRMRX0sCi0gICAgICB7R0FQX0lOVkFMSURfSEFORExFLCBHQVBfSU5WQUxJRF9IQU5ETEV9LAotICAgICAgR0FQX0lOVkFMSURfSEFORExFLAotICAgICAge0dBUF9JTlZBTElEX0hBTkRMRSwgR0FQX0lOVkFMSURfSEFORExFfSwKLSAgfTsKLQotICBDc2lzSW5zdGFuY2UodWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQpCi0gICAgICA6IGNvb3JkaW5hdGVkX3NlcnZpY2UodXVpZCksCi0gICAgICAgIGdyb3VwX2lkXyhibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93biksCi0gICAgICAgIHJhbmtfKGtVbmtub3duUmFuayksCi0gICAgICAgIGxvY2tfc3RhdGVfKENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfVU5TRVQpIHsKLSAgICBzdmNfZGF0YS5zdGFydF9oYW5kbGUgPSBzdGFydF9oYW5kbGU7Ci0gICAgc3ZjX2RhdGEuZW5kX2hhbmRsZSA9IGVuZF9oYW5kbGU7Ci0gIH0KLQotICB2b2lkIFNldExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlIHN0YXRlKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGN1cnJlbnQgbG9jayBzdGF0ZTogIiA8PCAoaW50KShsb2NrX3N0YXRlXykKLSAgICAgICAgICAgICAgIDw8ICIgbmV3IGxvY2sgc3RhdGU6ICIgPDwgKGludCkoc3RhdGUpOwotICAgIGxvY2tfc3RhdGVfID0gc3RhdGU7Ci0gIH0KLSAgQ3Npc0xvY2tTdGF0ZSBHZXRMb2NrU3RhdGUodm9pZCkgY29uc3QgeyByZXR1cm4gbG9ja19zdGF0ZV87IH0KLSAgdWludDhfdCBHZXRSYW5rKHZvaWQpIGNvbnN0IHsgcmV0dXJuIHJhbmtfOyB9Ci0gIHZvaWQgU2V0UmFuayh1aW50OF90IHJhbmspIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY3VycmVudCByYW5rIHN0YXRlOiAiIDw8IGxvZ2hleChyYW5rXykKLSAgICAgICAgICAgICAgIDw8ICIgbmV3IGxvY2sgc3RhdGU6ICIgPDwgbG9naGV4KHJhbmspOwotICAgIHJhbmtfID0gcmFuazsKLSAgfQotCi0gIHZvaWQgU2V0R3JvdXBJZChpbnQgZ3JvdXBfaWQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzZXQgZ3JvdXAgaWQ6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICAgICAgPDwgIiBpbnN0YW5jZSBoYW5kbGU6ICIgPDwgbG9naGV4KHN2Y19kYXRhLnN0YXJ0X2hhbmRsZSk7Ci0gICAgZ3JvdXBfaWRfID0gZ3JvdXBfaWQ7Ci0gIH0KLQotICBpbnQgR2V0R3JvdXBJZCh2b2lkKSBjb25zdCB7IHJldHVybiBncm91cF9pZF87IH0KLQotICBib29sIEhhc1NhbWVVdWlkKGNvbnN0IENzaXNJbnN0YW5jZSYgY3Npc19pbnN0YW5jZSkgY29uc3QgewotICAgIHJldHVybiAoY3Npc19pbnN0YW5jZS5jb29yZGluYXRlZF9zZXJ2aWNlID09IGNvb3JkaW5hdGVkX3NlcnZpY2UpOwotICB9Ci0KLSAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBHZXRVdWlkKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGNvb3JkaW5hdGVkX3NlcnZpY2U7IH0KLSAgYm9vbCBJc0ZvclV1aWQoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKSBjb25zdCB7IHJldHVybiBjb29yZGluYXRlZF9zZXJ2aWNlID09IHV1aWQ7IH0KLQotIHByaXZhdGU6Ci0gIGludCBncm91cF9pZF87Ci0gIHVpbnQ4X3QgcmFua187Ci0gIENzaXNMb2NrU3RhdGUgbG9ja19zdGF0ZV87Ci19OwotCi0vKgotICogQ3NpcyBEZXZpY2UgcmVwcmVzZW50cyByZW1vdGUgZGV2aWNlIGFuZCBpdHMgYWxsIENTSVMgaW5zdGFuY2VzLgotICogSXQgY2FuIGhhcHBlbiB0aGF0IGRldmljZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIENTSVMgc2VydmljZSBpbnN0YW5jZQotICogaWYgdGhvc2UgaW5zdGFuY2VzIGFyZSBpbmNsdWRlZCBpbiBvdGhlciBzZXJ2aWNlcy4gSW4gdGhpcyB3YXksIGNvb3JkaW5hdGVkCi0gKiBzZXQgaXMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcmltYXJ5IHNlcnZpY2Ugd2hpY2ggaW5jbHVkZXMgdGhlIGluc3RhbmNlLgotICoKLSAqIENzaXNEZXZpY2UgY29udGFpbnMgdmVjdG9yIG9mIHRoZSBpbnN0YW5jZXMuCi0gKi8KLWNsYXNzIENzaXNEZXZpY2UgOiBwdWJsaWMgR2F0dFNlcnZpY2VEZXZpY2UgewotIHB1YmxpYzoKLSAgdXNpbmcgR2F0dFNlcnZpY2VEZXZpY2U6OkdhdHRTZXJ2aWNlRGV2aWNlOwotCi0gIHZvaWQgQ2xlYXJTdmNEYXRhKCkgewotICAgIEdhdHRTZXJ2aWNlRGV2aWNlOjpzZXJ2aWNlX2hhbmRsZSA9IEdBUF9JTlZBTElEX0hBTkRMRTsKLSAgICBHYXR0U2VydmljZURldmljZTo6aXNfZ2F0dF9zZXJ2aWNlX3ZhbGlkID0gZmFsc2U7Ci0KLSAgICBjc2lzX2luc3RhbmNlc18uY2xlYXIoKTsKLSAgfQotCi0gIHN0ZDo6c2hhcmVkX3B0cjxDc2lzSW5zdGFuY2U+IEdldENzaXNJbnN0YW5jZUJ5T3duaW5nSGFuZGxlKHVpbnQxNl90IGhhbmRsZSkgewotICAgIHVpbnQxNl90IGhkbCA9IDA7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBbaCwgaW5zdF0gOiBjc2lzX2luc3RhbmNlc18pIHsKLSAgICAgIGlmIChoYW5kbGUgPj0gaW5zdC0+c3ZjX2RhdGEuc3RhcnRfaGFuZGxlICYmIGhhbmRsZSA8PSBpbnN0LT5zdmNfZGF0YS5lbmRfaGFuZGxlKSB7Ci0gICAgICAgIGhkbCA9IGg7Ci0gICAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBmb3VuZCAiIDw8IGxvZ2hleChoZGwpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChoZGwgPiAwKSA/IGNzaXNfaW5zdGFuY2VzXy5hdChoZGwpIDogbnVsbHB0cjsKLSAgfQotCi0gIHN0ZDo6c2hhcmVkX3B0cjxDc2lzSW5zdGFuY2U+IEdldENzaXNJbnN0YW5jZUJ5R3JvdXBJZChpbnQgZ3JvdXBfaWQpIHsKLSAgICB1aW50MTZfdCBoZGwgPSAwOwotICAgIGZvciAoY29uc3QgYXV0byYgW2hhbmRsZSwgaW5zdF0gOiBjc2lzX2luc3RhbmNlc18pIHsKLSAgICAgIGlmIChpbnN0LT5HZXRHcm91cElkKCkgPT0gZ3JvdXBfaWQpIHsKLSAgICAgICAgaGRsID0gaGFuZGxlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChoZGwgPiAwKSA/IGNzaXNfaW5zdGFuY2VzXy5hdChoZGwpIDogbnVsbHB0cjsKLSAgfQotCi0gIHZvaWQgU2V0Q3Npc0luc3RhbmNlKHVpbnQxNl90IGhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPENzaXNJbnN0YW5jZT4gY3Npc19pbnN0YW5jZSkgewotICAgIGlmIChjc2lzX2luc3RhbmNlc18uY291bnQoaGFuZGxlKSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluc3RhbmNlIGlzIGFscmVhZHkgaGVyZTogIiA8PCBjc2lzX2luc3RhbmNlLT5HZXRVdWlkKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY3Npc19pbnN0YW5jZXNfLmluc2VydCh7aGFuZGxlLCBjc2lzX2luc3RhbmNlfSk7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluc3RhbmNlIGFkZGVkOiAiIDw8IGxvZ2hleChoYW5kbGUpIDw8ICJkZXZpY2U6ICIgPDwgYWRkcjsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlQ3Npc0luc3RhbmNlKGludCBncm91cF9pZCkgewotICAgIGZvciAoYXV0byBpdCA9IGNzaXNfaW5zdGFuY2VzXy5iZWdpbigpOyBpdCAhPSBjc2lzX2luc3RhbmNlc18uZW5kKCk7IGl0KyspIHsKLSAgICAgIGlmIChpdC0+c2Vjb25kLT5HZXRHcm91cElkKCkgPT0gZ3JvdXBfaWQpIHsKLSAgICAgICAgY3Npc19pbnN0YW5jZXNfLmVyYXNlKGl0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGludCBHZXROdW1iZXJPZkNzaXNJbnN0YW5jZXModm9pZCkgeyByZXR1cm4gY3Npc19pbnN0YW5jZXNfLnNpemUoKTsgfQotCi0gIHZvaWQgRm9yRWFjaENzaXNJbnN0YW5jZShzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENzaXNJbnN0YW5jZT4mKT4gY2IpIHsKLSAgICBmb3IgKGF1dG8gY29uc3QmIGt2X3BhaXIgOiBjc2lzX2luc3RhbmNlc18pIHsKLSAgICAgIGNiKGt2X3BhaXIuc2Vjb25kKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8qIEluc3RhbmNlcyBwZXIgc3RhcnQgaGFuZGxlICAqLwotICBzdGQ6Om1hcDx1aW50MTZfdCwgc3RkOjpzaGFyZWRfcHRyPENzaXNJbnN0YW5jZT4+IGNzaXNfaW5zdGFuY2VzXzsKLX07Ci0KLS8qCi0gKiBDU0lTIGdyb3VwIGdhdGhlcnMgZGV2aWNlcyB3aGljaCBiZWxvbmdzIHRvIHNwZWNpZmljIGdyb3VwLgotICogSXQgYWxzbyBjb250YWlucyBtZXRob25kIHRvIGRlY29kZSBlbmNyeXB0ZWQgU0lSSyBhbmQgYWxzbyB0bwotICogcmVzb2x2ZSBQUlNJIGluIG9yZGVyIHRvIGZpbmQgb3V0IGlmIGRldmljZSBiZWxvbmdzIHRvIGdpdmVuIGdyb3VwCi0gKi8KLWNsYXNzIENzaXNHcm91cCB7Ci0gcHVibGljOgotICBDc2lzR3JvdXAoaW50IGdyb3VwX2lkLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQpCi0gICAgICA6IGdyb3VwX2lkXyhncm91cF9pZCksCi0gICAgICAgIHNpemVfKGtEZWZhdWx0Q3Npc1NldFNpemUpLAotICAgICAgICB1dWlkXyh1dWlkKSwKLSAgICAgICAgbWVtYmVyX2Rpc2NvdmVyeV9zdGF0ZV8oQ3Npc0Rpc2NvdmVyeVN0YXRlOjpDU0lTX0RJU0NPVkVSWV9JRExFKSwKLSAgICAgICAgbG9ja19zdGF0ZV8oQ3Npc0xvY2tTdGF0ZTo6Q1NJU19TVEFURV9VTlNFVCksCi0gICAgICAgIHRhcmdldF9sb2NrX3N0YXRlXyhDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUKSwKLSAgICAgICAgbG9ja190cmFuc2l0aW9uX2NudF8oMCkgewotICAgIGRldmljZXNfLmNsZWFyKCk7Ci0gIH0KLQotICB2b2lkIEFkZERldmljZShzdGQ6OnNoYXJlZF9wdHI8Q3Npc0RldmljZT4gY3Npc19kZXZpY2UpIHsKLSAgICBhdXRvIGl0ID0KLSAgICAgICAgZmluZF9pZihkZXZpY2VzXy5iZWdpbigpLCBkZXZpY2VzXy5lbmQoKSwgQ3Npc0RldmljZTo6TWF0Y2hBZGRyZXNzKGNzaXNfZGV2aWNlLT5hZGRyKSk7Ci0gICAgaWYgKGl0ICE9IGRldmljZXNfLmVuZCgpKSByZXR1cm47Ci0KLSAgICBkZXZpY2VzXy5wdXNoX2JhY2soc3RkOjptb3ZlKGNzaXNfZGV2aWNlKSk7Ci0gIH0KLQotICB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgYXV0byBpdCA9IGZpbmRfaWYoZGV2aWNlc18uYmVnaW4oKSwgZGV2aWNlc18uZW5kKCksIENzaXNEZXZpY2U6Ok1hdGNoQWRkcmVzcyhiZF9hZGRyKSk7Ci0gICAgaWYgKGl0ICE9IGRldmljZXNfLmVuZCgpKSBkZXZpY2VzXy5lcmFzZShpdCk7Ci0gIH0KLQotICBpbnQgR2V0Q3VycmVudFNpemUodm9pZCkgY29uc3QgeyByZXR1cm4gZGV2aWNlc18uc2l6ZSgpOyB9Ci0gIGJsdWV0b290aDo6VXVpZCBHZXRVdWlkKCkgY29uc3QgeyByZXR1cm4gdXVpZF87IH0KLSAgdm9pZCBTZXRVdWlkKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCkgeyB1dWlkXyA9IHV1aWQ7IH0KLSAgaW50IEdldEdyb3VwSWQodm9pZCkgY29uc3QgeyByZXR1cm4gZ3JvdXBfaWRfOyB9Ci0gIGludCBHZXREZXNpcmVkU2l6ZSh2b2lkKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotICB2b2lkIFNldERlc2lyZWRTaXplKGludCBzaXplKSB7IHNpemVfID0gc2l6ZTsgfQotICBib29sIElzR3JvdXBDb21wbGV0ZSh2b2lkKSBjb25zdCB7IHJldHVybiBzaXplXyA9PSAoaW50KWRldmljZXNfLnNpemUoKTsgfQotICBib29sIElzRW1wdHkodm9pZCkgY29uc3QgeyByZXR1cm4gZGV2aWNlc18uZW1wdHkoKTsgfQotCi0gIGJvb2wgSXNEZXZpY2VJblRoZUdyb3VwKHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiYgY3Npc19kZXZpY2UpIHsKLSAgICBhdXRvIGl0ID0KLSAgICAgICAgZmluZF9pZihkZXZpY2VzXy5iZWdpbigpLCBkZXZpY2VzXy5lbmQoKSwgQ3Npc0RldmljZTo6TWF0Y2hBZGRyZXNzKGNzaXNfZGV2aWNlLT5hZGRyKSk7Ci0gICAgcmV0dXJuIChpdCAhPSBkZXZpY2VzXy5lbmQoKSk7Ci0gIH0KLSAgYm9vbCBJc1JzaU1hdGNoaW5nKGNvbnN0IFJhd0FkZHJlc3MmIHJzaSkgY29uc3QgeyByZXR1cm4gaXNfcnNpX21hdGNoX3NpcmsocnNpLCBHZXRTaXJrKCkpOyB9Ci0gIGJvb2wgSXNTaXJrQmVsb25nc1RvR3JvdXAoT2N0ZXQxNiBzaXJrKSBjb25zdCB7IHJldHVybiAoc2lya19hdmFpbGFibGVfICYmIHNpcmtfID09IHNpcmspOyB9Ci0gIE9jdGV0MTYgR2V0U2lyayh2b2lkKSBjb25zdCB7IHJldHVybiBzaXJrXzsgfQotICB2b2lkIFNldFNpcmsoT2N0ZXQxNiYgc2lyaykgewotICAgIGlmIChzaXJrX2F2YWlsYWJsZV8pIHsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBVcGRhdGluZyBTSVJLIjsKLSAgICB9Ci0gICAgc2lya19hdmFpbGFibGVfID0gdHJ1ZTsKLSAgICBzaXJrXyA9IHNpcms7Ci0gIH0KLQotICBpbnQgR2V0TnVtT2ZDb25uZWN0ZWREZXZpY2VzKHZvaWQpIHsKLSAgICByZXR1cm4gc3RkOjpjb3VudF9pZihkZXZpY2VzXy5iZWdpbigpLCBkZXZpY2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbXShhdXRvJiBkKSB7IHJldHVybiBkLT5Jc0Nvbm5lY3RlZCgpOyB9KTsKLSAgfQotCi0gIENzaXNEaXNjb3ZlcnlTdGF0ZSBHZXREaXNjb3ZlcnlTdGF0ZSh2b2lkKSBjb25zdCB7IHJldHVybiBtZW1iZXJfZGlzY292ZXJ5X3N0YXRlXzsgfQotICB2b2lkIFNldERpc2NvdmVyeVN0YXRlKENzaXNEaXNjb3ZlcnlTdGF0ZSBzdGF0ZSkgewotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjdXJyZW50IGRpc2NvdmVyeSBzdGF0ZTogIiA8PCAoaW50KShtZW1iZXJfZGlzY292ZXJ5X3N0YXRlXykKLSAgICAgICAgICAgICAgIDw8ICIgbmV3IGRpc2NvdmVyeSBzdGF0ZTogIiA8PCAoaW50KShzdGF0ZSk7Ci0gICAgbWVtYmVyX2Rpc2NvdmVyeV9zdGF0ZV8gPSBzdGF0ZTsKLSAgfQotCi0gIHZvaWQgU2V0Q3VycmVudExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlIHN0YXRlKSB7IGxvY2tfc3RhdGVfID0gc3RhdGU7IH0KLQotICB2b2lkIFNldFRhcmdldExvY2tTdGF0ZShDc2lzTG9ja1N0YXRlIHN0YXRlLCBDc2lzTG9ja0NiIGNiID0gYmFzZTo6RG9Ob3RoaW5nKCkpIHsKLSAgICB0YXJnZXRfbG9ja19zdGF0ZV8gPSBzdGF0ZTsKLSAgICBjYl8gPSBzdGQ6Om1vdmUoY2IpOwotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgIGNhc2UgQ3Npc0xvY2tTdGF0ZTo6Q1NJU19TVEFURV9MT0NLRUQ6Ci0gICAgICAgIGxvY2tfdHJhbnNpdGlvbl9jbnRfID0gR2V0TnVtT2ZDb25uZWN0ZWREZXZpY2VzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOTE9DS0VEOgotICAgICAgY2FzZSBDc2lzTG9ja1N0YXRlOjpDU0lTX1NUQVRFX1VOU0VUOgotICAgICAgICBsb2NrX3RyYW5zaXRpb25fY250XyA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIENzaXNMb2NrQ2IgR2V0TG9ja0NiKHZvaWQpIHsgcmV0dXJuIHN0ZDo6bW92ZShjYl8pOyB9Ci0KLSAgQ3Npc0xvY2tTdGF0ZSBHZXRDdXJyZW50TG9ja1N0YXRlKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGxvY2tfc3RhdGVfOyB9Ci0gIENzaXNMb2NrU3RhdGUgR2V0VGFyZ2V0TG9ja1N0YXRlKHZvaWQpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF9sb2NrX3N0YXRlXzsgfQotCi0gIGJvb2wgSXNBdmFpbGFibGVGb3JDc2lzTG9ja09wZXJhdGlvbih2b2lkKSB7Ci0gICAgaW50IGlkID0gZ3JvdXBfaWRfOwotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXZpY2VzXy5iZWdpbigpLCBkZXZpY2VzXy5lbmQoKSwgW2lkXShhdXRvJiBkKSB7Ci0gICAgICBpZiAoIWQtPklzQ29ubmVjdGVkKCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGF1dG8gaW5zdCA9IGQtPkdldENzaXNJbnN0YW5jZUJ5R3JvdXBJZChpZCk7Ci0gICAgICBMT0dfQVNTRVJUKGluc3QpOwotICAgICAgcmV0dXJuIGluc3QtPkdldExvY2tTdGF0ZSgpID09IENzaXNMb2NrU3RhdGU6OkNTSVNfU1RBVEVfTE9DS0VEOwotICAgIH0pOwotCi0gICAgLyogSWYgdGhlcmUgaXMgbm8gbG9ja2VkIGRldmljZSwgd2UgYXJlIGdvb2QgdG8gZ28gKi8KLSAgICByZXR1cm4gaXRlciA9PSBkZXZpY2VzXy5lbmQoKTsKLSAgfQotCi0gIHZvaWQgU29ydEJ5Q3Npc1Jhbmsodm9pZCkgewotICAgIGludCBpZCA9IGdyb3VwX2lkXzsKLSAgICBzdGQ6OnNvcnQoZGV2aWNlc18uYmVnaW4oKSwgZGV2aWNlc18uZW5kKCksIFtpZF0oYXV0byYgZGV2MSwgYXV0byYgZGV2MikgewotICAgICAgYXV0byBpbnN0MSA9IGRldjEtPkdldENzaXNJbnN0YW5jZUJ5R3JvdXBJZChpZCk7Ci0gICAgICBhdXRvIGluc3QyID0gZGV2Mi0+R2V0Q3Npc0luc3RhbmNlQnlHcm91cElkKGlkKTsKLSAgICAgIGlmICghaW5zdDEgfHwgIWluc3QyKSB7Ci0gICAgICAgIC8qIE9uZSBvZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQgKi8KLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG9uZSBvZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQ6IGluc3QxOiAiIDw8IGluc3QxCi0gICAgICAgICAgICAgICAgICAgPDwgIiBpbnN0MjogIiA8PCBpbnN0MjsKLSAgICAgICAgcmV0dXJuIGRldjEtPklzQ29ubmVjdGVkKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKGluc3QxLT5HZXRSYW5rKCkgPCBpbnN0Mi0+R2V0UmFuaygpKTsKLSAgICB9KTsKLSAgfQotCi0gIHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiBHZXRGaXJzdERldmljZSh2b2lkKSB7IHJldHVybiAoZGV2aWNlc18uZnJvbnQoKSk7IH0KLSAgc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+IEdldExhc3REZXZpY2Uodm9pZCkgeyByZXR1cm4gKGRldmljZXNfLmJhY2soKSk7IH0KLSAgc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+IEdldE5leHREZXZpY2Uoc3RkOjpzaGFyZWRfcHRyPENzaXNEZXZpY2U+JiBkZXZpY2UpIHsKLSAgICBhdXRvIGl0ZXIgPQotICAgICAgICBzdGQ6OmZpbmRfaWYoZGV2aWNlc18uYmVnaW4oKSwgZGV2aWNlc18uZW5kKCksIENzaXNEZXZpY2U6Ok1hdGNoQWRkcmVzcyhkZXZpY2UtPmFkZHIpKTsKLQotICAgIC8qIElmIHJlZmVyZW5jZSBkZXZpY2Ugbm90IGZvdW5kICovCi0gICAgaWYgKGl0ZXIgPT0gZGV2aWNlc18uZW5kKCkpIHJldHVybiBudWxscHRyOwotCi0gICAgaXRlcisrOwotICAgIC8qIElmIHJlZmVyZW5jZSBkZXZpY2UgaXMgbGFzdCBpbiBncm91cCAqLwotICAgIGlmIChpdGVyID09IGRldmljZXNfLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJldHVybiAoKml0ZXIpOwotICB9Ci0gIHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiBHZXRQcmV2RGV2aWNlKHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPiYgZGV2aWNlKSB7Ci0gICAgYXV0byBpdGVyID0KLSAgICAgICAgc3RkOjpmaW5kX2lmKGRldmljZXNfLnJiZWdpbigpLCBkZXZpY2VzXy5yZW5kKCksIENzaXNEZXZpY2U6Ok1hdGNoQWRkcmVzcyhkZXZpY2UtPmFkZHIpKTsKLQotICAgIC8qIElmIHJlZmVyZW5jZSBkZXZpY2Ugbm90IGZvdW5kICovCi0gICAgaWYgKGl0ZXIgPT0gZGV2aWNlc18ucmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLQotICAgIGl0ZXIrKzsKLQotICAgIGlmIChpdGVyID09IGRldmljZXNfLnJlbmQoKSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuICgqaXRlcik7Ci0gIH0KLQotICBpbnQgR2V0TG9ja1RyYW5zaXRpb25DbnQodm9pZCkgY29uc3QgeyByZXR1cm4gbG9ja190cmFuc2l0aW9uX2NudF87IH0KLSAgaW50IFVwZGF0ZUxvY2tUcmFuc2l0aW9uQ250KGludCBpKSB7Ci0gICAgbG9ja190cmFuc2l0aW9uX2NudF8gKz0gaTsKLSAgICByZXR1cm4gbG9ja190cmFuc2l0aW9uX2NudF87Ci0gIH0KLQotICAvKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBBdXRvc2V0IFByaXZhdGUgQWRkcmVzcyB8c3JwYXwgbWF0Y2hlcyBTZXQgSWRlbnRpdHkKLSAgICogUmVzb2x2aW5nIEtleSB8c2lya3wgKi8KLSAgc3RhdGljIGJvb2wgaXNfcnNpX21hdGNoX3NpcmsoY29uc3QgUmF3QWRkcmVzcyYgcnNpLCBjb25zdCBPY3RldDE2JiBzaXJrKSB7Ci0gICAgLyogdXNlIHRoZSAzIE1TQiBvZiBiZCBhZGRyZXNzIGFzIHByYW5kICovCi0gICAgdWludDhfdCByYW5kWzNdOwotICAgIHJhbmRbMF0gPSByc2kuYWRkcmVzc1syXTsKLSAgICByYW5kWzFdID0gcnNpLmFkZHJlc3NbMV07Ci0gICAgcmFuZFsyXSA9IHJzaS5hZGRyZXNzWzBdOwotICAgIERMT0coSU5GTykgPDwgIlByYW5kICIgPDwgYmFzZTo6SGV4RW5jb2RlKHJhbmQsIDMpOwotCi0gICAgRExPRyhJTkZPKSA8PCAiU0lSSyAiIDw8IGJhc2U6OkhleEVuY29kZShzaXJrLmRhdGEoKSwgMTYpOwotICAgIC8qIGdlbmVyYXRlIFggPSBFIGlyayhSMCwgUjEsIFIyKSBhbmQgUiBpcyByYW5kb20gYWRkcmVzcyAzIExTTyAqLwotICAgIE9jdGV0MTYgeCA9IGNyeXB0b190b29sYm94OjphZXNfMTI4KHNpcmssICZyYW5kWzBdLCAzKTsKLQotICAgIERMT0coSU5GTykgPDwgIlgiIDw8IGJhc2U6OkhleEVuY29kZSh4LmRhdGEoKSwgMTYpOwotCi0gICAgcmFuZFswXSA9IHJzaS5hZGRyZXNzWzVdOwotICAgIHJhbmRbMV0gPSByc2kuYWRkcmVzc1s0XTsKLSAgICByYW5kWzJdID0gcnNpLmFkZHJlc3NbM107Ci0KLSAgICBETE9HKElORk8pIDw8ICJIYXNoICIgPDwgYmFzZTo6SGV4RW5jb2RlKHJhbmQsIDMpOwotCi0gICAgaWYgKG1lbWNtcCh4LmRhdGEoKSwgJnJhbmRbMF0sIDMpID09IDApIHsKLSAgICAgIC8vIG1hdGNoCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gbm90IGEgbWF0Y2gKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCBncm91cF9pZF87Ci0gIE9jdGV0MTYgc2lya18gPSB7MH07Ci0gIGJvb2wgc2lya19hdmFpbGFibGVfID0gZmFsc2U7Ci0gIGludCBzaXplXzsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWRfOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDc2lzRGV2aWNlPj4gZGV2aWNlc187Ci0gIENzaXNEaXNjb3ZlcnlTdGF0ZSBtZW1iZXJfZGlzY292ZXJ5X3N0YXRlXzsKLQotICBDc2lzTG9ja1N0YXRlIGxvY2tfc3RhdGVfOwotICBDc2lzTG9ja1N0YXRlIHRhcmdldF9sb2NrX3N0YXRlXzsKLSAgaW50IGxvY2tfdHJhbnNpdGlvbl9jbnRfOwotCi0gIENzaXNMb2NrQ2IgY2JfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNzaXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS9kbS9idGFfZG1fYWN0LmNjIGIvYnRhL2RtL2J0YV9kbV9hY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmNkYzcuLjAwMDAwMDAKLS0tIGEvYnRhL2RtL2J0YV9kbV9hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhY3Rpb24gZnVuY3Rpb25zIGZvciBkZXZpY2UgbWFuYWdlciBzdGF0ZQotICogIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfZG0iCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2RtL2J0YV9kbV9pbnQuaCIKLSNpbmNsdWRlICJidGEvZ2F0dC9idGFfZ2F0dGNfaW50LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2RtX2NpLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZG0uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL3N0YWNrX21hbmFnZXIuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9uZWlnaGJvcl9pbnF1aXJ5LmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgLy8gZG9faW5fbWFpbl90aHJlYWQKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2lmIChHQVBfSU5DTFVERUQgPT0gVFJVRSkKLSNpbmNsdWRlICJnYXBfYXBpLmgiCi0jZW5kaWYKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi12b2lkIEJUSUZfZG1fZGlzYWJsZSgpOwotdm9pZCBCVElGX2RtX2VuYWJsZSgpOwotdm9pZCBidG1fYmxlX2Fkdl9pbml0KHZvaWQpOwotCi1zdGF0aWMgdm9pZCBidGFfZG1faW5xX3Jlc3VsdHNfY2IodEJUTV9JTlFfUkVTVUxUUyogcF9pbnEsIGNvbnN0IHVpbnQ4X3QqIHBfZWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVpcl9sZW4pOwotc3RhdGljIHZvaWQgYnRhX2RtX2lucV9jbXBsX2NiKHZvaWQqIHBfcmVzdWx0KTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9zZXJ2aWNlX3NlYXJjaF9yZW1uYW1lX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfQ0xBU1MgZGMsIEJEX05BTUUgYmRfbmFtZSk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fcmVtbmFtZV9jYmFjayh2b2lkKiBwKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9maW5kX3NlcnZpY2VzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotc3RhdGljIHZvaWQgYnRhX2RtX2Rpc2NvdmVyX25leHRfZGV2aWNlKHZvaWQpOwotc3RhdGljIHZvaWQgYnRhX2RtX3NkcF9jYWxsYmFjayh0U0RQX1NUQVRVUyBzZHBfc3RhdHVzKTsKLXN0YXRpYyB1aW50OF90IGJ0YV9kbV9waW5fY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkRfTkFNRSBiZF9uYW1lLCBib29sIG1pbl8xNl9kaWdpdCk7Ci1zdGF0aWMgdWludDhfdCBidGFfZG1fbmV3X2xpbmtfa2V5X2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZfY2xhc3MsIEJEX05BTUUgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGlua0tleSYga2V5LCB1aW50OF90IGtleV90eXBlKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZV9jYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfTkFNRSBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUkVBU09OIHJlc3VsdCk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fbG9jYWxfbmFtZV9jYmFjayh2b2lkKiBwX25hbWUpOwotc3RhdGljIHZvaWQgYnRhX2RtX2NoZWNrX2F2KCk7Ci0KLXZvaWQgQlRBX2RtX3VwZGF0ZV9wb2xpY3kodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotLyogRXh0ZW5kZWQgSW5xdWlyeSBSZXNwb25zZSAqLwotc3RhdGljIHRCVE1fU1RBVFVTIGJ0YV9kbV9zcF9jYmFjayh0QlRNX1NQX0VWVCBldmVudCwgdEJUTV9TUF9FVlRfREFUQSogcF9kYXRhKTsKLQotc3RhdGljIHZvaWQgYnRhX2RtX3NldF9laXIoY2hhciogbG9jYWxfbmFtZSk7Ci0KLXN0YXRpYyB2b2lkIGJ0YV9kbV9zZWFyY2hfdGltZXJfY2JhY2sodm9pZCogZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV9jb25uX2Rvd25fdGltZXJfY2JhY2sodm9pZCogZGF0YSk7Ci12b2lkIGJ0YV9kbV9ybV9jYmFjayh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9hZGp1c3Rfcm9sZXMoYm9vbCBkZWxheV9yb2xlX3N3aXRjaCk7Ci1zdGF0aWMgY2hhciogYnRhX2RtX2dldF9yZW1uYW1lKHZvaWQpOwotc3RhdGljIHZvaWQgYnRhX2RtX2JvbmRfY2FuY2VsX2NvbXBsZXRlX2NiYWNrKHRCVE1fU1RBVFVTIHJlc3VsdCk7Ci0KLXN0YXRpYyBib29sIGJ0YV9kbV9yZWFkX3JlbW90ZV9kZXZpY2VfbmFtZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9kaXNjb3Zlcl9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpOwotCi1zdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV9zZWFyY2hfYW5kX2Rpc2Modm9pZCk7Ci0KLXN0YXRpYyB1aW50OF90IGJ0YV9kbV9ibGVfc21wX2NiYWNrKHRCVE1fTEVfRVZUIGV2ZW50LCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0VWVF9EQVRBKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgYnRhX2RtX2JsZV9pZF9rZXlfY2JhY2sodWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0xPQ0FMX0tFWVMqIHBfa2V5KTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9nYXR0Y19yZWdpc3Rlcih2b2lkKTsKLXN0YXRpYyB2b2lkIGJ0bV9kbV9zdGFydF9nYXR0X2Rpc2NvdmVyeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9jYW5jZWxfZ2F0dF9kaXNjb3ZlcnkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1zdGF0aWMgdm9pZCBidGFfZG1fZ2F0dGNfY2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSk7Ci1leHRlcm4gdEJUTV9DT05UUkxfU1RBVEUgYnRhX2RtX3BtX29idGFpbl9jb250cm9sbGVyX3N0YXRlKHZvaWQpOwotI2lmIChCTEVfVk5EX0lOQ0xVREVEID09IFRSVUUpCi1zdGF0aWMgdm9pZCBidGFfZG1fY3RybF9mZWF0dXJlc19yZF9jbXBsX2NiYWNrKHRIQ0lfU1RBVFVTIHJlc3VsdCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fQkxFX0FEVl9DSE5MX01BUAotI2RlZmluZSBCVEFfRE1fQkxFX0FEVl9DSE5MX01BUCBcCi0gIChCVE1fQkxFX0FEVl9DSE5MXzM3IHwgQlRNX0JMRV9BRFZfQ0hOTF8zOCB8IEJUTV9CTEVfQURWX0NITkxfMzkpCi0jZW5kaWYKLQotLyogRGlzYWJsZSB0aW1lciBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSAqLwotI2lmbmRlZiBCVEFfRE1fRElTQUJMRV9USU1FUl9NUwotI2RlZmluZSBCVEFfRE1fRElTQUJMRV9USU1FUl9NUyAoMjAwMCkKLSNlbmRpZgotCi0vKiBEaXNhYmxlIHRpbWVyIHJldHJpYWwgaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgKi8KLSNpZm5kZWYgQlRBX0RNX0RJU0FCTEVfVElNRVJfUkVUUklBTF9NUwotI2RlZmluZSBCVEFfRE1fRElTQUJMRV9USU1FUl9SRVRSSUFMX01TIDE1MDAKLSNlbmRpZgotCi0vKiBEaXNhYmxlIGNvbm5lY3Rpb24gZG93biB0aW1lciAoaW4gbWlsbGlzZWNvbmRzKSAqLwotI2lmbmRlZiBCVEFfRE1fRElTQUJMRV9DT05OX0RPV05fVElNRVJfTVMKLSNkZWZpbmUgQlRBX0RNX0RJU0FCTEVfQ09OTl9ET1dOX1RJTUVSX01TIDEwMDAKLSNlbmRpZgotCi0vKiBTd2l0Y2ggZGVsYXkgdGltZXIgKGluIG1pbGxpc2Vjb25kcykgKi8KLSNpZm5kZWYgQlRBX0RNX1NXSVRDSF9ERUxBWV9USU1FUl9NUwotI2RlZmluZSBCVEFfRE1fU1dJVENIX0RFTEFZX1RJTUVSX01TIDUwMAotI2VuZGlmCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIFRpbWUgdG8gd2FpdCBhZnRlciByZWNlaXZpbmcgc2h1dGRvd24gcmVxdWVzdCB0byBkZWxheSB0aGUgYWN0dWFsIHNodXRkb3duCi0vLyBwcm9jZXNzLiBUaGlzIHRpbWUgbWF5IGJlIHplcm8gd2hpY2ggaW52b2tlcyBpbW1lZGlhdGUgc2h1dGRvd24uCi0jaWZuZGVmIEJUQV9ESVNBQkxFX0RFTEFZCi1jb25zdGV4cHIgdWludDY0X3Qga0Rpc2FibGVEZWxheVRpbWVySW5NcyA9IDA7Ci0jZWxzZQotY29uc3RleHByIHVpbnQ2NF90IGtEaXNhYmxlRGVsYXlUaW1lckluTXMgPQotICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihCVEFfRElTQUJMRV9ERUxBWSk7Ci0jZW5kaWYKLQotc3RydWN0IFdhaXRGb3JBbGxBY2xDb25uZWN0aW9uc1RvRHJhaW4gewotICB1aW50NjRfdCB0aW1lX3RvX3dhaXRfaW5fbXM7Ci0gIHVuc2lnbmVkIGxvbmcgVGltZVRvV2FpdEluTXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHRpbWVfdG9fd2FpdF9pbl9tcyk7Ci0gIH0KLSAgdm9pZCogQWxhcm1DYWxsYmFja0RhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0aGlzKSk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgV2FpdEZvckFsbEFjbENvbm5lY3Rpb25zVG9EcmFpbiogRnJvbUFsYXJtQ2FsbGJhY2tEYXRhKAotICAgICAgdm9pZCogZGF0YSk7Ci0gIHN0YXRpYyBib29sIElzRmlyc3RQYXNzKGNvbnN0IFdhaXRGb3JBbGxBY2xDb25uZWN0aW9uc1RvRHJhaW4qKTsKLX0gZmlyc3RfcGFzcyA9Ci0gICAgewotICAgICAgICAudGltZV90b193YWl0X2luX21zID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KEJUQV9ETV9ESVNBQkxFX1RJTUVSX01TKSwKLX0sCi0gIHNlY29uZF9wYXNzID0gewotICAgICAgLnRpbWVfdG9fd2FpdF9pbl9tcyA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KEJUQV9ETV9ESVNBQkxFX1RJTUVSX1JFVFJJQUxfTVMpLAotfTsKLQotYm9vbCBXYWl0Rm9yQWxsQWNsQ29ubmVjdGlvbnNUb0RyYWluOjpJc0ZpcnN0UGFzcygKLSAgICBjb25zdCBXYWl0Rm9yQWxsQWNsQ29ubmVjdGlvbnNUb0RyYWluKiBwYXNzKSB7Ci0gIHJldHVybiBwYXNzID09ICZmaXJzdF9wYXNzOwotfQotCi1jb25zdCBXYWl0Rm9yQWxsQWNsQ29ubmVjdGlvbnNUb0RyYWluKgotV2FpdEZvckFsbEFjbENvbm5lY3Rpb25zVG9EcmFpbjo6RnJvbUFsYXJtQ2FsbGJhY2tEYXRhKHZvaWQqIGRhdGEpIHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgV2FpdEZvckFsbEFjbENvbm5lY3Rpb25zVG9EcmFpbio+KAotICAgICAgc3RhdGljX2Nhc3Q8V2FpdEZvckFsbEFjbENvbm5lY3Rpb25zVG9EcmFpbio+KGRhdGEpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyB2b2lkIGJ0YV9kbV9yZXNldF9zZWNfZGV2X3BlbmRpbmcoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpOwotc3RhdGljIHZvaWQgYnRhX2RtX3JlbW92ZV9zZWNfZGV2X2VudHJ5KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9vYnNlcnZlX3Jlc3VsdHNfY2IodEJUTV9JTlFfUkVTVUxUUyogcF9pbnEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfZWlyLCB1aW50MTZfdCBlaXJfbGVuKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9vYnNlcnZlX2NtcGxfY2Iodm9pZCogcF9yZXN1bHQpOwotc3RhdGljIHZvaWQgYnRhX2RtX2RlbGF5X3JvbGVfc3dpdGNoX2NiYWNrKHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRhX2RtX3dhaXRfZm9yX2FjbF90b19kcmFpbl9jYmFjayh2b2lkKiBkYXRhKTsKLQotY29uc3QgdWludDE2X3QgYnRhX3NlcnZpY2VfaWRfdG9fdXVpZF9sa3VwX3RibFtCVEFfTUFYX1NFUlZJQ0VfSURdID0gewotICAgIFVVSURfU0VSVkNMQVNTX1BOUF9JTkZPUk1BVElPTiwgICAgICAgLyogUmVzZXJ2ZWQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19TRVJJQUxfUE9SVCwgICAgICAgICAgIC8qIEJUQV9TUFBfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX0RJQUxVUF9ORVRXT1JLSU5HLCAgICAgLyogQlRBX0RVTl9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFLCAgICAgICAgICAvKiBCVEFfQTJEUF9TT1VSQ0VfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX0xBTl9BQ0NFU1NfVVNJTkdfUFBQLCAgLyogQlRBX0xBUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVCwgICAgICAgICAgICAgICAvKiBCVEFfSFNQX0hTX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUsICAgICAgICAgIC8qIEJUQV9IRlBfSFNfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX09CRVhfT0JKRUNUX1BVU0gsICAgICAgLyogQlRBX09QUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfT0JFWF9GSUxFX1RSQU5TRkVSLCAgICAvKiBCVEFfRlRQX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19DT1JETEVTU19URUxFUEhPTlksICAgIC8qIEJUQV9DVFBfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX0lOVEVSQ09NLCAgICAgICAgICAgICAgLyogQlRBX0lDUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfSVJNQ19TWU5DLCAgICAgICAgICAgICAvKiBCVEFfU1lOQ19TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfRElSRUNUX1BSSU5USU5HLCAgICAgICAvKiBCVEFfQlBQX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19JTUFHSU5HX1JFU1BPTkRFUiwgICAgIC8qIEJUQV9CSVBfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX1BBTlUsICAgICAgICAgICAgICAgICAgLyogQlRBX1BBTlVfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX05BUCwgICAgICAgICAgICAgICAgICAgLyogQlRBX05BUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfR04sICAgICAgICAgICAgICAgICAgICAvKiBCVEFfR05fU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX1NBUCwgICAgICAgICAgICAgICAgICAgLyogQlRBX1NBUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSywgICAgICAgICAgICAvKiBCVEFfQTJEUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wsICAgICAvKiBCVEFfQVZSQ1BfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX0hVTUFOX0lOVEVSRkFDRSwgICAgICAgLyogQlRBX0hJRF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfVklERU9fU0lOSywgICAgICAgICAgICAvKiBCVEFfVkRQX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19QQkFQX1BTRSwgICAgICAgICAgICAgIC8qIEJUQV9QQkFQX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVksIC8qIEJUQV9IU1BfU0VSVklDRV9JRCAqLwotICAgIFVVSURfU0VSVkNMQVNTX0FHX0hBTkRTRlJFRSwgICAgICAgICAgLyogQlRBX0hGUF9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfTUVTU0FHRV9BQ0NFU1MsICAgICAgICAvKiBCVEFfTUFQX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19NRVNTQUdFX05PVElGSUNBVElPTiwgIC8qIEJUQV9NTl9TRVJWSUNFX0lEICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfSERQX1BST0ZJTEUsICAgICAgICAgICAvKiBCVEFfSERQX1NFUlZJQ0VfSUQgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19QQkFQX1BDRSwgICAgICAgICAgICAgIC8qIEJUQV9QQ0VfU0VSVklDRV9JRCAqLwotICAgIFVVSURfUFJPVE9DT0xfQVRUICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRfU0VSVklDRV9JRCAqLwotfTsKLQotLyogYnRhIHNlY3VyaXR5IGNhbGxiYWNrICovCi1jb25zdCB0QlRNX0FQUExfSU5GTyBidGFfc2VjdXJpdHkgPSB7Ci0gICAgLnBfcGluX2NhbGxiYWNrID0gJmJ0YV9kbV9waW5fY2JhY2ssCi0gICAgLnBfbGlua19rZXlfY2FsbGJhY2sgPSAmYnRhX2RtX25ld19saW5rX2tleV9jYmFjaywKLSAgICAucF9hdXRoX2NvbXBsZXRlX2NhbGxiYWNrID0gJmJ0YV9kbV9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZV9jYmFjaywKLSAgICAucF9ib25kX2NhbmNlbF9jbXBsX2NhbGxiYWNrID0gJmJ0YV9kbV9ib25kX2NhbmNlbF9jb21wbGV0ZV9jYmFjaywKLSAgICAucF9zcF9jYWxsYmFjayA9ICZidGFfZG1fc3BfY2JhY2ssCi0gICAgLnBfbGVfY2FsbGJhY2sgPSAmYnRhX2RtX2JsZV9zbXBfY2JhY2ssCi0gICAgLnBfbGVfa2V5X2NhbGxiYWNrID0gJmJ0YV9kbV9ibGVfaWRfa2V5X2NiYWNrfTsKLQotI2RlZmluZSBNQVhfRElTQ19SQVdfREFUQV9CVUYgKDQwOTYpCi11aW50OF90IGdfZGlzY19yYXdfZGF0YV9idWZbTUFYX0RJU0NfUkFXX0RBVEFfQlVGXTsKLQotZXh0ZXJuIERFVl9DTEFTUyBsb2NhbF9kZXZpY2VfZGVmYXVsdF9jbGFzczsKLQotLy8gU3RvcmVzIHRoZSBsb2NhbCBJbnB1dC9PdXRwdXQgQ2FwYWJpbGl0aWVzIG9mIHRoZSBCbHVldG9vdGggZGV2aWNlLgotc3RhdGljIHVpbnQ4X3QgYnRtX2xvY2FsX2lvX2NhcHM7Ci0KLS8qKiBJbml0aWFsaXNlcyB0aGUgQlQgZGV2aWNlIG1hbmFnZXIgKi8KLXZvaWQgYnRhX2RtX2VuYWJsZSh0QlRBX0RNX1NFQ19DQkFDSyogcF9zZWNfY2JhY2spIHsKLSAgLyogbWFrZSBzdXJlIHNlY3VyaXR5IGNhbGxiYWNrIGlzIHNhdmVkIC0gaWYgbm8gY2FsbGJhY2ssIGRvIG5vdCBlcmFzZSB0aGUKLSAgcHJldmlvdXMgb25lLAotICBpdCBjb3VsZCBiZSBhbiBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gKi8KLSAgaWYgKHBfc2VjX2NiYWNrICE9IE5VTEwpIGJ0YV9kbV9jYi5wX3NlY19jYmFjayA9IHBfc2VjX2NiYWNrOwotICAvKiBub3RpZnkgQlRBIERNIGlzIG5vdyBhY3RpdmUgKi8KLSAgYnRhX2RtX2NiLmlzX2J0YV9kbV9hY3RpdmUgPSB0cnVlOwotCi0gIGJ0bV9sb2NhbF9pb19jYXBzID0gYnRpZl9zdG9yYWdlX2dldF9sb2NhbF9pb19jYXBzKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1faW5pdF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZXMgdGhlIGJ0YV9kbV9jYiBjb250cm9sIGJsb2NrCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9pbml0X2NiKHZvaWQpIHsKLSAgYnRhX2RtX2NiID0ge307Ci0gIGJ0YV9kbV9jYi5kaXNhYmxlX3RpbWVyID0gYWxhcm1fbmV3KCJidGFfZG0uZGlzYWJsZV90aW1lciIpOwotICBidGFfZG1fY2Iuc3dpdGNoX2RlbGF5X3RpbWVyID0gYWxhcm1fbmV3KCJidGFfZG0uc3dpdGNoX2RlbGF5X3RpbWVyIik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKSB7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7IGorKykgewotICAgICAgYnRhX2RtX2NiLnBtX3RpbWVyW2ldLnRpbWVyW2pdID0gYWxhcm1fbmV3KCJidGFfZG0ucG1fdGltZXIiKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9kZWluaXRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlLWluaXRpYWxpemVzIHRoZSBidGFfZG1fY2IgY29udHJvbCBibG9jawotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fZGVpbml0X2NiKHZvaWQpIHsKLSAgLyoKLSAgICogVE9ETzogU2hvdWxkIGFsYXJtX2ZyZWUoKSB0aGUgYnRhX2RtX2NiIHRpbWVycyBkdXJpbmcgZ3JhY2VmdWwKLSAgICogc2h1dGRvd24uCi0gICAqLwotICBhbGFybV9mcmVlKGJ0YV9kbV9jYi5kaXNhYmxlX3RpbWVyKTsKLSAgYWxhcm1fZnJlZShidGFfZG1fY2Iuc3dpdGNoX2RlbGF5X3RpbWVyKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBCVEFfRE1fTlVNX1BNX1RJTUVSOyBpKyspIHsKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWDsgaisrKSB7Ci0gICAgICBhbGFybV9mcmVlKGJ0YV9kbV9jYi5wbV90aW1lcltpXS50aW1lcltqXSk7Ci0gICAgfQotICB9Ci0gIGJ0YV9kbV9jYiA9IHt9OwotfQotCi12b2lkIEJUQV9kbV9vbl9od19vZmYoKSB7Ci0gIEJUSUZfZG1fZGlzYWJsZSgpOwotCi0gIC8qIHJlaW5pdGlhbGl6ZSB0aGUgY29udHJvbCBibG9jayAqLwotICBidGFfZG1fZGVpbml0X2NiKCk7Ci0KLSAgLyogaHcgaXMgcmVhZHksIGdvIG9uIHdpdGggQlRBIERNIGluaXRpYWxpemF0aW9uICovCi0gIGFsYXJtX2ZyZWUoYnRhX2RtX3NlYXJjaF9jYi5zZWFyY2hfdGltZXIpOwotICBhbGFybV9mcmVlKGJ0YV9kbV9zZWFyY2hfY2IuZ2F0dF9jbG9zZV90aW1lcik7Ci0gIG9zaV9mcmVlKGJ0YV9kbV9zZWFyY2hfY2IucF9wZW5kaW5nX3NlYXJjaCk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUoYnRhX2RtX3NlYXJjaF9jYi5wZW5kaW5nX2Rpc2NvdmVyeV9xdWV1ZSwgb3NpX2ZyZWUpOwotICBtZW1zZXQoJmJ0YV9kbV9zZWFyY2hfY2IsIDAsIHNpemVvZihidGFfZG1fc2VhcmNoX2NiKSk7Ci0KLSAgLyogbm90aWZ5IEJUQSBETSBpcyBub3cgdW5hY3RpdmUgKi8KLSAgYnRhX2RtX2NiLmlzX2J0YV9kbV9hY3RpdmUgPSBmYWxzZTsKLX0KLQotdm9pZCBCVEFfZG1fb25faHdfb24oKSB7Ci0gIERFVl9DTEFTUyBkZXZfY2xhc3M7Ci0gIHRCVEFfRE1fU0VDX0NCQUNLKiB0ZW1wX2NiYWNrOwotICB1aW50OF90IGtleV9tYXNrID0gMDsKLSAgdEJUQV9CTEVfTE9DQUxfSURfS0VZUyBpZF9rZXk7Ci0KLSAgLyogc2F2ZSBzZWN1cml0eSBjYWxsYmFjayAqLwotICB0ZW1wX2NiYWNrID0gYnRhX2RtX2NiLnBfc2VjX2NiYWNrOwotICAvKiBtYWtlIHN1cmUgdGhlIGNvbnRyb2wgYmxvY2sgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgKi8KLSAgYnRhX2RtX2luaXRfY2IoKTsKLSAgLyogYW5kIHJldHJpZXZlIHRoZSBjYWxsYmFjayAqLwotICBidGFfZG1fY2IucF9zZWNfY2JhY2sgPSB0ZW1wX2NiYWNrOwotICBidGFfZG1fY2IuaXNfYnRhX2RtX2FjdGl2ZSA9IHRydWU7Ci0KLSAgLyogaHcgaXMgcmVhZHksIGdvIG9uIHdpdGggQlRBIERNIGluaXRpYWxpemF0aW9uICovCi0gIGFsYXJtX2ZyZWUoYnRhX2RtX3NlYXJjaF9jYi5zZWFyY2hfdGltZXIpOwotICBhbGFybV9mcmVlKGJ0YV9kbV9zZWFyY2hfY2IuZ2F0dF9jbG9zZV90aW1lcik7Ci0gIG9zaV9mcmVlKGJ0YV9kbV9zZWFyY2hfY2IucF9wZW5kaW5nX3NlYXJjaCk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUoYnRhX2RtX3NlYXJjaF9jYi5wZW5kaW5nX2Rpc2NvdmVyeV9xdWV1ZSwgb3NpX2ZyZWUpOwotICBtZW1zZXQoJmJ0YV9kbV9zZWFyY2hfY2IsIDAsIHNpemVvZihidGFfZG1fc2VhcmNoX2NiKSk7Ci0gIC8qCi0gICAqIFRPRE86IFNob3VsZCBhbGFybV9mcmVlKCkgdGhlIGJ0YV9kbV9zZWFyY2hfY2IgdGltZXJzIGR1cmluZwotICAgKiBncmFjZWZ1bCBzaHV0ZG93bi4KLSAgICovCi0gIGJ0YV9kbV9zZWFyY2hfY2Iuc2VhcmNoX3RpbWVyID0gYWxhcm1fbmV3KCJidGFfZG1fc2VhcmNoLnNlYXJjaF90aW1lciIpOwotICBidGFfZG1fc2VhcmNoX2NiLmdhdHRfY2xvc2VfdGltZXIgPQotICAgICAgYWxhcm1fbmV3KCJidGFfZG1fc2VhcmNoLmdhdHRfY2xvc2VfdGltZXIiKTsKLSAgYnRhX2RtX3NlYXJjaF9jYi5wZW5kaW5nX2Rpc2NvdmVyeV9xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0KLSAgbWVtc2V0KCZidGFfZG1fY29ubl9zcnZjcywgMCwgc2l6ZW9mKGJ0YV9kbV9jb25uX3NydmNzKSk7Ci0gIG1lbXNldCgmYnRhX2RtX2RpX2NiLCAwLCBzaXplb2YodEJUQV9ETV9ESV9DQikpOwotCi0gIG1lbWNweShkZXZfY2xhc3MsIHBfYnRhX2RtX2NmZy0+ZGV2X2NsYXNzLCBzaXplb2YoZGV2X2NsYXNzKSk7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QlRNX1NldERldmljZUNsYXNzKGRldl9jbGFzcyk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRNX1NldERldmljZUNsYXNzKGRldl9jbGFzcyk7Ci0gIH0KLQotICAvKiBsb2FkIEJMRSBsb2NhbCBpbmZvcm1hdGlvbjogSUQga2V5cywgRVIgaWYgYXZhaWxhYmxlICovCi0gIE9jdGV0MTYgZXI7Ci0gIGJ0aWZfZG1fZ2V0X2JsZV9sb2NhbF9rZXlzKCZrZXlfbWFzaywgJmVyLCAmaWRfa2V5KTsKLQotICBpZiAoa2V5X21hc2sgJiBCVEFfQkxFX0xPQ0FMX0tFWV9UWVBFX0VSKSB7Ci0gICAgZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkuYmxlLkJUTV9CbGVMb2FkTG9jYWxLZXlzKAotICAgICAgICBCVEFfQkxFX0xPQ0FMX0tFWV9UWVBFX0VSLCAodEJUTV9CTEVfTE9DQUxfS0VZUyopJmVyKTsKLSAgfQotICBpZiAoa2V5X21hc2sgJiBCVEFfQkxFX0xPQ0FMX0tFWV9UWVBFX0lEKSB7Ci0gICAgZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkuYmxlLkJUTV9CbGVMb2FkTG9jYWxLZXlzKAotICAgICAgICBCVEFfQkxFX0xPQ0FMX0tFWV9UWVBFX0lELCAodEJUTV9CTEVfTE9DQUxfS0VZUyopJmlkX2tleSk7Ci0gIH0KLSAgYnRhX2RtX3NlYXJjaF9jYi5jb25uX2lkID0gR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci0KLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVnaXN0ZXIoJmJ0YV9zZWN1cml0eSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkuc2VjdXJpdHkuQlRNX1NlY1JlZ2lzdGVyKCZidGFfc2VjdXJpdHkpOwotICB9Ci0KLSAgQlRNX1dyaXRlUGFnZVRpbWVvdXQocF9idGFfZG1fY2ZnLT5wYWdlX3RpbWVvdXQpOwotCi0jaWYgKEJMRV9WTkRfSU5DTFVERUQgPT0gVFJVRSkKLSAgQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXMoYnRhX2RtX2N0cmxfZmVhdHVyZXNfcmRfY21wbF9jYmFjayk7Ci0jZWxzZQotICAvKiBJZiBWU0MgbXVsdGkgYWR2IGNvbW1hbmRzIGFyZSBhdmFpbGFibGUsIGFkdmVydGlzaW5nIHdpbGwgYmUgaW5pdGlhbGl6ZWQKLSAgICogd2hlbiBjYXBhYmlsaXRpZXMgYXJlIHJlYWQuIElmIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUsIGluaXRpYWxpemUKLSAgICogYWR2ZXJ0aXNpbmcgaGVyZSAqLwotICBidG1fYmxlX2Fkdl9pbml0KCk7Ci0gIC8qIFNldCBjb250cm9sbGVyIGZlYXR1cmVzIGV2ZW4gaWYgdmVuZG9yIHN1cHBvcnQgaXMgbm90IGluY2x1ZGVkICovCi0gIGlmIChidGFfZG1fY2IucF9zZWNfY2JhY2spCi0gICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9MRV9GRUFUVVJFU19SRUFELCBOVUxMKTsKLSNlbmRpZgotCi0gIC8qIEVhcmxpZXIsIHdlIHVzZWQgdG8gaW52b2tlIEJUTV9SZWFkTG9jYWxBZGRyIHdoaWNoIHdhcyBqdXN0IGNvcHlpbmcgdGhlCi0gICAgIGJkX2FkZHIKLSAgICAgZnJvbSB0aGUgY29udHJvbCBibG9jayBhbmQgaW52b2tpbmcgdGhlIGNhbGxiYWNrIHdoaWNoIHdhcyBzZW5kaW5nIHRoZQotICAgICBETV9FTkFCTEVfRVZULgotICAgICBCdXQgdGhlbiB3ZSBoYXZlIGEgZmV3IEhDSSBjb21tYW5kcyBiZWluZyBpbnZva2VkIGFib3ZlIHdoaWNoIHdlcmUgc3RpbGwKLSAgICAgaW4gcHJvZ3Jlc3MKLSAgICAgd2hlbiB0aGUgRU5BQkxFX0VWVCB3YXMgc2VudC4gU28gbW9kaWZpZWQgdGhpcyB0byBmZXRjaCB0aGUgbG9jYWwgbmFtZQotICAgICB3aGljaCBmb3JjZXMKLSAgICAgdGhlIERNX0VOQUJMRV9FVlQgdG8gYmUgc2VudCBvbmx5IGFmdGVyIGFsbCB0aGUgaW5pdCBzdGVwcyBhcmUgY29tcGxldGUKLSAgICAgKi8KLSAgZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkubG9jYWwuQlRNX1JlYWRMb2NhbERldmljZU5hbWVGcm9tQ29udHJvbGxlcigKLSAgICAgIGJ0YV9kbV9sb2NhbF9uYW1lX2NiYWNrKTsKLQotICBidGFfc3lzX3JtX3JlZ2lzdGVyKGJ0YV9kbV9ybV9jYmFjayk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBibHVldG9vdGggbG93IHBvd2VyIG1hbmFnZXIgKi8KLSAgYnRhX2RtX2luaXRfcG0oKTsKLQotICBidGFfZG1fZ2F0dGNfcmVnaXN0ZXIoKTsKLX0KLQotLyoqIERpc2FibGVzIHRoZSBCVCBkZXZpY2UgbWFuYWdlciAqLwotdm9pZCBidGFfZG1fZGlzYWJsZSgpIHsKLSAgLyogU2V0IGwyY2FwIGlkbGUgdGltZW91dCB0byAwIChzbyBCVEUgaW1tZWRpYXRlbHkgZGlzY29ubmVjdHMgQUNMIGxpbmsgYWZ0ZXIKLSAgICogbGFzdCBjaGFubmVsIGlzIGNsb3NlZCkgKi8KLSAgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyKFJhd0FkZHJlc3M6OmtBbnksIDAsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoUmF3QWRkcmVzczo6a0FueSwgMCwgQlRfVFJBTlNQT1JUX0xFKTsKLQotICAvKiBkaXNhYmxlIGFsbCBhY3RpdmUgc3Vic3lzdGVtcyAqLwotICBidGFfc3lzX2Rpc2FibGUoKTsKLQotICBCVE1fU2V0RGlzY292ZXJhYmlsaXR5KEJUTV9OT05fRElTQ09WRVJBQkxFKTsKLSAgQlRNX1NldENvbm5lY3RhYmlsaXR5KEJUTV9OT05fQ09OTkVDVEFCTEUpOwotCi0gIGJ0YV9kbV9kaXNhYmxlX3BtKCk7Ci0gIGJ0YV9kbV9kaXNhYmxlX3NlYXJjaF9hbmRfZGlzYygpOwotICBidGFfZG1fY2IuZGlzYWJsaW5nID0gdHJ1ZTsKLQotICBjb25uZWN0aW9uX21hbmFnZXI6OnJlc2V0KGZhbHNlKTsKLQotICBpZiAoQlRNX0dldE51bUFjbExpbmtzKCkgPT0gMCkgewotICAgIC8vIFdlIGNhbiBzaHV0IGRvd24gZmFzdGVyIGlmIHRoZXJlIGFyZSBubyBBQ0wgbGlua3MKLSAgICBzd2l0Y2ggKGtEaXNhYmxlRGVsYXlUaW1lckluTXMpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgTE9HX0RFQlVHKCJJbW1lZGlhdGVseSBkaXNhYmxpbmcgZGV2aWNlIG1hbmFnZXIiKTsKLSAgICAgICAgYnRhX2RtX2Rpc2FibGVfY29ubl9kb3duX3RpbWVyX2NiYWNrKG51bGxwdHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19ERUJVRygiU2V0IHRpbWVyIHRvIGRlbGF5IGRpc2FibGUgaW5pdGlhdGlvbjolbHUgbXMiLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oa0Rpc2FibGVEZWxheVRpbWVySW5NcykpOwotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AoYnRhX2RtX2NiLmRpc2FibGVfdGltZXIsIGtEaXNhYmxlRGVsYXlUaW1lckluTXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fZGlzYWJsZV9jb25uX2Rvd25fdGltZXJfY2JhY2ssIG51bGxwdHIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfREVCVUcoIlNldCB0aW1lciB0byB3YWl0IGZvciBhbGwgQUNMIGNvbm5lY3Rpb25zIHRvIGNsb3NlOiVsdSBtcyIsCi0gICAgICAgICAgICAgIGZpcnN0X3Bhc3MuVGltZVRvV2FpdEluTXMoKSk7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKGJ0YV9kbV9jYi5kaXNhYmxlX3RpbWVyLCBmaXJzdF9wYXNzLnRpbWVfdG9fd2FpdF9pbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3dhaXRfZm9yX2FjbF90b19kcmFpbl9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcGFzcy5BbGFybUNhbGxiYWNrRGF0YSgpKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3dhaXRfZm9yX2FsbF9hY2xfdG9fZHJhaW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBpZiB0aGUgZGlzYWJsZSB0aW1lciBleHBpcmVzCi0gKiAgICAgICAgICAgICAgICAgIFVzZWQgdG8gY2xvc2UgQUNMIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBzdGlsbCBhY3RpdmUKLSAqCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBmb3JjZV9kaXNjb25uZWN0X2FsbF9hY2xfY29ubmVjdGlvbnMoKSB7Ci0gIGNvbnN0IGJvb2wgaXNfZm9yY2VfZGlzY29ubmVjdF9uZWVkZWQgPSAoYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50ID4gMCk7Ci0KLSAgZm9yIChhdXRvIGkgPSAwOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspIHsKLSAgICBidG1fcmVtb3ZlX2FjbChidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucGVlcl9iZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnRyYW5zcG9ydCk7Ci0gIH0KLSAgcmV0dXJuIGlzX2ZvcmNlX2Rpc2Nvbm5lY3RfbmVlZGVkOwotfQotCi1zdGF0aWMgdm9pZCBidGFfZG1fd2FpdF9mb3JfYWNsX3RvX2RyYWluX2NiYWNrKHZvaWQqIGRhdGEpIHsKLSAgQVNTRVJUKGRhdGEgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IFdhaXRGb3JBbGxBY2xDb25uZWN0aW9uc1RvRHJhaW4qIHBhc3MgPQotICAgICAgV2FpdEZvckFsbEFjbENvbm5lY3Rpb25zVG9EcmFpbjo6RnJvbUFsYXJtQ2FsbGJhY2tEYXRhKGRhdGEpOwotCi0gIGlmIChCVE1fR2V0TnVtQWNsTGlua3MoKSAmJgotICAgICAgV2FpdEZvckFsbEFjbENvbm5lY3Rpb25zVG9EcmFpbjo6SXNGaXJzdFBhc3MocGFzcykpIHsKLSAgICAvKiBESVNBQkxFX0VWVCBzdGlsbCBuZWVkIHRvIGJlIHNlbnQgb3V0IHRvIGF2b2lkIGphdmEgbGF5ZXIgZGlzYWJsZSB0aW1lb3V0Ci0gICAgICovCi0gICAgaWYgKGZvcmNlX2Rpc2Nvbm5lY3RfYWxsX2FjbF9jb25uZWN0aW9ucygpKSB7Ci0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIlNldCB0aW1lciBmb3Igc2Vjb25kIHBhc3MgdG8gd2FpdCBmb3IgYWxsIEFDTCBjb25uZWN0aW9ucyB0byAiCi0gICAgICAgICAgImNsb3NlOiVsdSBtcyAiLAotICAgICAgICAgIHNlY29uZF9wYXNzLlRpbWVUb1dhaXRJbk1zKCkpOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKAotICAgICAgICAgIGJ0YV9kbV9jYi5kaXNhYmxlX3RpbWVyLCBzZWNvbmRfcGFzcy50aW1lX3RvX3dhaXRfaW5fbXMsCi0gICAgICAgICAgYnRhX2RtX3dhaXRfZm9yX2FjbF90b19kcmFpbl9jYmFjaywgc2Vjb25kX3Bhc3MuQWxhcm1DYWxsYmFja0RhdGEoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIE5vIEFDTCBsaW5rcyB3ZXJlIHVwIG9yIGlzIHNlY29uZCBwYXNzIGF0IEFDTCBjbG9zdXJlCi0gICAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgICAgTE9HX0lORk8oIkVuc3VyaW5nIGFsbCBBQ0wgY29ubmVjdGlvbnMgaGF2ZSBiZWVuIHByb3Blcmx5IGZsdXNoZWQiKTsKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6QUNMX1NodXRkb3duKCk7Ci0gICAgfQotCi0gICAgYnRhX2RtX2NiLmRpc2FibGluZyA9IGZhbHNlOwotCi0gICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19QTlBfSU5GT1JNQVRJT04pOwotICAgIEJUSUZfZG1fZGlzYWJsZSgpOwotICB9Ci19Ci0KLS8qKiBTZXRzIGxvY2FsIGRldmljZSBuYW1lICovCi12b2lkIGJ0YV9kbV9zZXRfZGV2X25hbWUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG5hbWUpIHsKLSAgQlRNX1NldExvY2FsRGV2aWNlTmFtZSgoY29uc3QgY2hhciopbmFtZS5kYXRhKCkpOwotICBidGFfZG1fc2V0X2VpcigoY2hhciopbmFtZS5kYXRhKCkpOwotfQotCi0vKiogU2V0cyBkaXNjb3ZlcmFiaWxpdHksIGNvbm5lY3RhYmlsaXR5IGFuZCBwYWlyYWJpbGl0eSAqLwotYm9vbCBCVEFfRG1TZXRWaXNpYmlsaXR5KGJ0X3NjYW5fbW9kZV90IG1vZGUpIHsKLSAgdEJUQV9ETV9ESVNDIGRpc2NfbW9kZV9wYXJhbTsKLSAgdEJUQV9ETV9DT05OIGNvbm5fbW9kZV9wYXJhbTsKLQotICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEJUX1NDQU5fTU9ERV9OT05FOgotICAgICAgZGlzY19tb2RlX3BhcmFtID0gQlRBX0RNX05PTl9ESVNDOwotICAgICAgY29ubl9tb2RlX3BhcmFtID0gQlRBX0RNX05PTl9DT05OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRToKLSAgICAgIGRpc2NfbW9kZV9wYXJhbSA9IEJUQV9ETV9OT05fRElTQzsKLSAgICAgIGNvbm5fbW9kZV9wYXJhbSA9IEJUQV9ETV9DT05OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEU6Ci0gICAgICBkaXNjX21vZGVfcGFyYW0gPSBCVEFfRE1fR0VORVJBTF9ESVNDOwotICAgICAgY29ubl9tb2RlX3BhcmFtID0gQlRBX0RNX0NPTk47Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBCVE1fU2V0RGlzY292ZXJhYmlsaXR5KGRpc2NfbW9kZV9wYXJhbSk7Ci0gIEJUTV9TZXRDb25uZWN0YWJpbGl0eShjb25uX21vZGVfcGFyYW0pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZV9ub19jYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8qIG5lZWQgdG8gcmVtb3ZlIGFsbCBwZW5kaW5nIGJhY2tncm91bmQgY29ubmVjdGlvbiBiZWZvcmUgdW5wYWlyICovCi0gIEJUQV9HQVRUQ19DYW5jZWxPcGVuKDAsIGJkX2FkZHIsIGZhbHNlKTsKLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNEZWxldGVEZXZpY2UoYmRfYWRkcik7Ci0gIH0gZWxzZSB7Ci0gICAgQlRNX1NlY0RlbGV0ZURldmljZShiZF9hZGRyKTsKLSAgfQotCi0gIC8qIHJlbW92ZSBhbGwgY2FjaGVkIEdBVFQgaW5mb3JtYXRpb24gKi8KLSAgQlRBX0dBVFRDX1JlZnJlc2goYmRfYWRkcik7Ci19Ci0KLXZvaWQgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGJ0YV9kbV9wcm9jZXNzX3JlbW92ZV9kZXZpY2Vfbm9fY2FsbGJhY2soYmRfYWRkcik7Ci0KLSAgaWYgKGJ0YV9kbV9jYi5wX3NlY19jYmFjaykgewotICAgIHRCVEFfRE1fU0VDIHNlY19ldmVudDsKLSAgICBzZWNfZXZlbnQubGlua19kb3duLmJkX2FkZHIgPSBiZF9hZGRyOwotICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fREVWX1VOUEFJUkVEX0VWVCwgJnNlY19ldmVudCk7Ci0gIH0KLX0KLQotLyoqIFJlbW92ZXMgZGV2aWNlLCBkaXNjb25uZWN0cyBBQ0wgbGluayBpZiByZXF1aXJlZCAqLwotdm9pZCBidGFfZG1fcmVtb3ZlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8qIElmIEFDTCBleGlzdHMgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIHJlbW92ZV9ib25kIG1lc3NhZ2UqLwotICBib29sIGlzX2JkX2FkZHJfY29ubmVjdGVkID0KLSAgICAgIEJUTV9Jc0FjbENvbm5lY3Rpb25VcChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpIHx8Ci0gICAgICBCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0KLSAgdEJUX1RSQU5TUE9SVCBvdGhlcl90cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfQVVUTzsKLSAgaWYgKGlzX2JkX2FkZHJfY29ubmVjdGVkKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEFDTCBVcCBjb3VudDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCk7Ci0KLSAgICAvKiBUYWtlIHRoZSBsaW5rIGRvd24gZmlyc3QsIGFuZCBtYXJrIHRoZSBkZXZpY2UgZm9yIHJlbW92YWwgd2hlbgotICAgICAqIGRpc2Nvbm5lY3RlZCAqLwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspIHsKLSAgICAgIGF1dG8mIHBlZXJfZGV2aWNlID0gYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldOwotICAgICAgaWYgKHBlZXJfZGV2aWNlLnBlZXJfYmRhZGRyID09IGJkX2FkZHIpIHsKLSAgICAgICAgcGVlcl9kZXZpY2UuY29ubl9zdGF0ZSA9IEJUQV9ETV9VTlBBSVJJTkc7Ci0KLSAgICAgICAgLyogTWFrZSBzdXJlIGRldmljZSBpcyBub3QgaW4gYWNjZXB0bGlzdCBiZWZvcmUgd2UgZGlzY29ubmVjdCAqLwotICAgICAgICBHQVRUX0NhbmNlbENvbm5lY3QoMCwgYmRfYWRkciwgZmFsc2UpOwotCi0gICAgICAgIGJ0bV9yZW1vdmVfYWNsKGJkX2FkZHIsIHBlZXJfZGV2aWNlLnRyYW5zcG9ydCk7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiB0cmFuc3BvcnQ6ICVkIiwgX19mdW5jX18sIHBlZXJfZGV2aWNlLnRyYW5zcG9ydCk7Ci0KLSAgICAgICAgLyogc2F2ZSB0aGUgb3RoZXIgdHJhbnNwb3J0IHRvIGNoZWNrIGlmIGRldmljZSBpcyBjb25uZWN0ZWQgb24KLSAgICAgICAgICogb3RoZXJfdHJhbnNwb3J0ICovCi0gICAgICAgIGlmIChwZWVyX2RldmljZS50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKQotICAgICAgICAgIG90aGVyX3RyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvdGhlcl90cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfTEU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgUmF3QWRkcmVzcyBvdGhlcl9hZGRyZXNzID0gYmRfYWRkcjsKLSAgUmF3QWRkcmVzcyBvdGhlcl9hZGRyZXNzMiA9IGJkX2FkZHI7Ci0KLSAgLy8gSWYgaXQgaXMgRFVNTyBkZXZpY2UgYW5kIGRldmljZSBpcyBwYWlyZWQgYXMgZGlmZmVyZW50IGFkZHJlc3MsIHVucGFpciB0aGF0Ci0gIC8vIGRldmljZQotICBib29sIG90aGVyX2FkZHJlc3NfY29ubmVjdGVkID0KLSAgICAgIChvdGhlcl90cmFuc3BvcnQpCi0gICAgICAgICAgPyBCVE1fUmVhZENvbm5lY3RlZFRyYW5zcG9ydEFkZHJlc3MoJm90aGVyX2FkZHJlc3MsIG90aGVyX3RyYW5zcG9ydCkKLSAgICAgICAgICA6IChCVE1fUmVhZENvbm5lY3RlZFRyYW5zcG9ydEFkZHJlc3MoJm90aGVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9CUl9FRFIpIHx8Ci0gICAgICAgICAgICAgQlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzKCZvdGhlcl9hZGRyZXNzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0xFKSk7Ci0gIGlmIChvdGhlcl9hZGRyZXNzID09IGJkX2FkZHIpIG90aGVyX2FkZHJlc3MgPSBvdGhlcl9hZGRyZXNzMjsKLQotICBpZiAob3RoZXJfYWRkcmVzc19jb25uZWN0ZWQpIHsKLSAgICAvKiBUYWtlIHRoZSBsaW5rIGRvd24gZmlyc3QsIGFuZCBtYXJrIHRoZSBkZXZpY2UgZm9yIHJlbW92YWwgd2hlbgotICAgICAqIGRpc2Nvbm5lY3RlZCAqLwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspIHsKLSAgICAgIGF1dG8mIHBlZXJfZGV2aWNlID0gYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldOwotICAgICAgaWYgKHBlZXJfZGV2aWNlLnBlZXJfYmRhZGRyID09IG90aGVyX2FkZHJlc3MgJiYKLSAgICAgICAgICBwZWVyX2RldmljZS50cmFuc3BvcnQgPT0gb3RoZXJfdHJhbnNwb3J0KSB7Ci0gICAgICAgIHBlZXJfZGV2aWNlLmNvbm5fc3RhdGUgPSBCVEFfRE1fVU5QQUlSSU5HOwotCi0gICAgICAgIC8qIE1ha2Ugc3VyZSBkZXZpY2UgaXMgbm90IGluIGFjY2VwdGxpc3QgYmVmb3JlIHdlIGRpc2Nvbm5lY3QgKi8KLSAgICAgICAgR0FUVF9DYW5jZWxDb25uZWN0KDAsIGJkX2FkZHIsIGZhbHNlKTsKLQotICAgICAgICBidG1fcmVtb3ZlX2FjbChvdGhlcl9hZGRyZXNzLCBwZWVyX2RldmljZS50cmFuc3BvcnQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBEZWxldGUgdGhlIGRldmljZSBtZW50aW9uZWQgaW4gdGhlIG1zZyAqLwotICBpZiAoIWlzX2JkX2FkZHJfY29ubmVjdGVkKSB7Ci0gICAgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZShiZF9hZGRyKTsKLSAgfQotCi0gIC8qIERlbGV0ZSB0aGUgb3RoZXIgcGFpcmVkIGRldmljZSB0b28gKi8KLSAgaWYgKCFvdGhlcl9hZGRyZXNzX2Nvbm5lY3RlZCAmJiAhb3RoZXJfYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBidGFfZG1fcHJvY2Vzc19yZW1vdmVfZGV2aWNlKG90aGVyX2FkZHJlc3MpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fYWRkX2RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIGEgTGluayBLZXkgdG8gYW4gc2VjdXJpdHkgZGF0YWJhc2UgZW50cnkuCi0gKiAgICAgICAgICAgICAgICAgIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBkdXJpbmcgaG9zdCBzdGFydHVwIHRvIHJlc3RvcmUgYWxsCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgTlZSQU0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fYWRkX2RldmljZShzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9BUElfQUREX0RFVklDRT4gbXNnKSB7Ci0gIHVpbnQ4X3QqIHBfZGMgPSBOVUxMOwotICBMaW5rS2V5KiBwX2xjID0gTlVMTDsKLQotICAvKiBJZiBub3QgYWxsIHplcm9zLCB0aGUgZGV2aWNlIGNsYXNzIGhhcyBiZWVuIHNwZWNpZmllZCAqLwotICBpZiAobXNnLT5kY19rbm93bikgcF9kYyA9ICh1aW50OF90Kiltc2ctPmRjOwotCi0gIGlmIChtc2ctPmxpbmtfa2V5X2tub3duKSBwX2xjID0gJm1zZy0+bGlua19rZXk7Ci0KLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkRGV2aWNlKG1zZy0+YmRfYWRkciwgcF9kYywgbXNnLT5iZF9uYW1lLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xjLCBtc2ctPmtleV90eXBlLCBtc2ctPnBpbl9sZW5ndGgpOwotICB9IGVsc2UgewotICAgIGF1dG8gYWRkX3Jlc3VsdCA9Ci0gICAgICAgIEJUTV9TZWNBZGREZXZpY2UobXNnLT5iZF9hZGRyLCBwX2RjLCBtc2ctPmJkX25hbWUsIG51bGxwdHIsIHBfbGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5rZXlfdHlwZSwgbXNnLT5waW5fbGVuZ3RoKTsKLSAgICBpZiAoIWFkZF9yZXN1bHQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkJUQV9ETTogRXJyb3IgYWRkaW5nIGRldmljZSAiIDw8IG1zZy0+YmRfYWRkcjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRldmljZSBhbmQKLSAqIG9wdGlvbmFseSByZW1vdmUgdGhlIGRldmljZSBmcm9tIHNlY3VyaXR5IGRhdGFiYXNlIGlmIHJlcXVpcmVkLiAqLwotdm9pZCBidGFfZG1fY2xvc2VfYWNsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB1aW50OF90IGluZGV4OwotCi0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9jbG9zZV9hY2wiKTsKLQotICBpZiAoQlRNX0lzQWNsQ29ubmVjdGlvblVwKGJkX2FkZHIsIHRyYW5zcG9ydCkpIHsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGluZGV4KyspIHsKLSAgICAgIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaW5kZXhdLnBlZXJfYmRhZGRyID09IGJkX2FkZHIpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaW5kZXggIT0gYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50KSB7Ci0gICAgICBpZiAocmVtb3ZlX2RldikKLSAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2luZGV4XS5yZW1vdmVfZGV2X3BlbmRpbmcgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCJ1bmtub3duIGRldmljZSwgcmVtb3ZlIEFDTCBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgZGV2aWNlIGlzIG5vdCBpbiBhY2NlcHRsaXN0IGJlZm9yZSB3ZSBkaXNjb25uZWN0ICovCi0gICAgR0FUVF9DYW5jZWxDb25uZWN0KDAsIGJkX2FkZHIsIGZhbHNlKTsKLQotICAgIC8qIERpc2Nvbm5lY3QgdGhlIEFDTCBsaW5rICovCi0gICAgYnRtX3JlbW92ZV9hY2woYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgfQotICAvKiBpZiB0byByZW1vdmUgdGhlIGRldmljZSBmcm9tIHNlY3VyaXR5IGRhdGFiYXNlID8gZG8gaXQgbm93ICovCi0gIGVsc2UgaWYgKHJlbW92ZV9kZXYpIHsKLSAgICBidGFfZG1fcHJvY2Vzc19yZW1vdmVfZGV2aWNlX25vX2NhbGxiYWNrKGJkX2FkZHIpOwotICB9Ci0gIC8qIG90aGVyd2lzZSwgbm8gYWN0aW9uIG5lZWRlZCAqLwotfQotCi0vKiogQm9uZHMgd2l0aCBwZWVyIGRldmljZSAqLwotdm9pZCBidGFfZG1fYm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGUpIHsKLSAgTE9HX0RFQlVHKCJCb25kaW5nIHdpdGggcGVlciBkZXZpY2U6JXMgdHlwZTolcyB0cmFuc3BvcnQ6JXMgdHlwZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIEFkZHJlc3NUeXBlVGV4dChhZGRyX3R5cGUpLmNfc3RyKCksCi0gICAgICAgICAgICBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCksCi0gICAgICAgICAgICBEZXZpY2VUeXBlVGV4dChkZXZpY2VfdHlwZSkuY19zdHIoKSk7Ci0KLSAgdEJUQV9ETV9TRUMgc2VjX2V2ZW50OwotICBjaGFyKiBwX25hbWU7Ci0KLSAgdEJUTV9TVEFUVVMgc3RhdHVzID0KLSAgICAgIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkKLSAgICAgICAgICA/IGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0JvbmQoYmRfYWRkciwgYWRkcl90eXBlLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlKQotICAgICAgICAgIDogQlRNX1NlY0JvbmQoYmRfYWRkciwgYWRkcl90eXBlLCB0cmFuc3BvcnQsIGRldmljZV90eXBlLCAwLCBOVUxMKTsKLQotICBpZiAoYnRhX2RtX2NiLnBfc2VjX2NiYWNrICYmIChzdGF0dXMgIT0gQlRNX0NNRF9TVEFSVEVEKSkgewotICAgIG1lbXNldCgmc2VjX2V2ZW50LCAwLCBzaXplb2YodEJUQV9ETV9TRUMpKTsKLSAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLmJkX2FkZHIgPSBiZF9hZGRyOwotICAgIHBfbmFtZSA9IChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgPyBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNSZWFkRGV2TmFtZShiZF9hZGRyKQotICAgICAgICAgICAgICAgICA6IEJUTV9TZWNSZWFkRGV2TmFtZShiZF9hZGRyKTsKLSAgICBpZiAocF9uYW1lICE9IE5VTEwpIHsKLSAgICAgIG1lbWNweShzZWNfZXZlbnQuYXV0aF9jbXBsLmJkX25hbWUsIHBfbmFtZSwgQkRfTkFNRV9MRU4pOwotICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5iZF9uYW1lW0JEX05BTUVfTEVOXSA9IDA7Ci0gICAgfQotCi0gICAgLyogICAgICB0YWtlbiBjYXJlIG9mIGJ5IG1lbXNldCBbYWJvdmVdCi0gICAgICAgICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLmtleV9wcmVzZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAqLwotICAgIHNlY19ldmVudC5hdXRoX2NtcGwuZmFpbF9yZWFzb24gPSBIQ0lfRVJSX0lMTEVHQUxfQ09NTUFORDsKLSAgICBpZiAoc3RhdHVzID09IEJUTV9TVUNDRVNTKSB7Ci0gICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLnN1Y2Nlc3MgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBkZWxldGUgdGhpcyBkZXZpY2UgZW50cnkgZnJvbSBTZWMgRGV2IERCICovCi0gICAgICBidGFfZG1fcmVtb3ZlX3NlY19kZXZfZW50cnkoYmRfYWRkcik7Ci0gICAgfQotICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fQVVUSF9DTVBMX0VWVCwgJnNlY19ldmVudCk7Ci0gIH0KLX0KLQotLyoqIENhbmNlbHMgYm9uZGluZyB3aXRoIGEgcGVlciBkZXZpY2UgKi8KLXZvaWQgYnRhX2RtX2JvbmRfY2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotICB0QlRBX0RNX1NFQyBzZWNfZXZlbnQ7Ci0KLSAgQVBQTF9UUkFDRV9FVkVOVCgiIGJ0YV9kbV9ib25kX2NhbmNlbCAiKTsKLQotICBzdGF0dXMgPSAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpCi0gICAgICAgICAgICAgICA/IGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0JvbmRDYW5jZWwoYmRfYWRkcikKLSAgICAgICAgICAgICAgIDogQlRNX1NlY0JvbmRDYW5jZWwoYmRfYWRkcik7Ci0KLSAgaWYgKGJ0YV9kbV9jYi5wX3NlY19jYmFjayAmJgotICAgICAgKHN0YXR1cyAhPSBCVE1fQ01EX1NUQVJURUQgJiYgc3RhdHVzICE9IEJUTV9TVUNDRVNTKSkgewotICAgIHNlY19ldmVudC5ib25kX2NhbmNlbF9jbXBsLnJlc3VsdCA9IEJUQV9GQUlMVVJFOwotCi0gICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9CT05EX0NBTkNFTF9DTVBMX0VWVCwgJnNlY19ldmVudCk7Ci0gIH0KLX0KLQotLyoqIFNlbmQgdGhlIHBpbl9yZXBseSB0byBhIHJlcXVlc3QgZnJvbSBCVE0gKi8KLXZvaWQgYnRhX2RtX3Bpbl9yZXBseShzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9BUElfUElOX1JFUExZPiBtc2cpIHsKLSAgaWYgKG1zZy0+YWNjZXB0KSB7Ci0gICAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKSB7Ci0gICAgICBibHVldG9vdGg6OnNoaW06OkJUTV9QSU5Db2RlUmVwbHkobXNnLT5iZF9hZGRyLCBCVE1fU1VDQ0VTUywgbXNnLT5waW5fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+cF9waW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVE1fUElOQ29kZVJlcGx5KG1zZy0+YmRfYWRkciwgQlRNX1NVQ0NFU1MsIG1zZy0+cGluX2xlbiwgbXNnLT5wX3Bpbik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkgewotICAgICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUElOQ29kZVJlcGx5KG1zZy0+YmRfYWRkciwgQlRNX05PVF9BVVRIT1JJWkVELCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVE1fUElOQ29kZVJlcGx5KG1zZy0+YmRfYWRkciwgQlRNX05PVF9BVVRIT1JJWkVELCAwLCBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIFNlbmQgdGhlIHVzZXIgY29uZmlybSByZXF1ZXN0IHJlcGx5IGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBmcm9tIEJUTSAqLwotdm9pZCBidGFfZG1fY29uZmlybShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkJUTV9Db25maXJtUmVxUmVwbHkoCi0gICAgICAgIGFjY2VwdCA/IEJUTV9TVUNDRVNTIDogQlRNX05PVF9BVVRIT1JJWkVELCBiZF9hZGRyKTsKLSAgfSBlbHNlIHsKLSAgICBCVE1fQ29uZmlybVJlcVJlcGx5KGFjY2VwdCA/IEJUTV9TVUNDRVNTIDogQlRNX05PVF9BVVRIT1JJWkVELCBiZF9hZGRyKTsKLSAgfQotfQotCi0vKiogcmVzcG9uZCB0byB0aGUgT09CIGRhdGEgcmVxdWVzdCBmb3IgdGhlIHJlbW90ZSBkZXZpY2UgZnJvbSBCVE0gKi8KLXZvaWQgYnRhX2RtX2NpX3JtdF9vb2JfYWN0KHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0NJX1JNVF9PT0I+IG1zZykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkJUTV9SZW1vdGVPb2JEYXRhUmVwbHkoCi0gICAgICAgIG1zZy0+YWNjZXB0ID8gQlRNX1NVQ0NFU1MgOiBCVE1fTk9UX0FVVEhPUklaRUQsIG1zZy0+YmRfYWRkciwgbXNnLT5jLAotICAgICAgICBtc2ctPnIpOwotICB9IGVsc2UgewotICAgIEJUTV9SZW1vdGVPb2JEYXRhUmVwbHkobXNnLT5hY2NlcHQgPyBCVE1fU1VDQ0VTUyA6IEJUTV9OT1RfQVVUSE9SSVpFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+YmRfYWRkciwgbXNnLT5jLCBtc2ctPnIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2VhcmNoX3N0YXJ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydHMgYW4gaW5xdWlyeQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fc2VhcmNoX3N0YXJ0KHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgdEJUTV9JTlFVSVJZX0NNUEwgcmVzdWx0ID0ge307Ci0KLSAgYnRhX2RtX2dhdHRjX3JlZ2lzdGVyKCk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgYXZvaWRfc2NhdHRlcj0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfYnRhX2RtX2NmZy0+YXZvaWRfc2NhdHRlcik7Ci0KLSAgQlRNX0NsZWFySW5xRGIobnVsbHB0cik7Ci0gIC8qIHNhdmUgc2VhcmNoIHBhcmFtcyAqLwotICBidGFfZG1fc2VhcmNoX2NiLnBfc2VhcmNoX2NiYWNrID0gcF9kYXRhLT5zZWFyY2gucF9jYmFjazsKLSAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlcyA9IHBfZGF0YS0+c2VhcmNoLnNlcnZpY2VzOwotCi0gIHJlc3VsdC5zdGF0dXMgPSBCVE1fU3RhcnRJbnF1aXJ5KGJ0YV9kbV9pbnFfcmVzdWx0c19jYiwgYnRhX2RtX2lucV9jbXBsX2NiKTsKLQotICBBUFBMX1RSQUNFX0VWRU5UKCIlcyBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgcmVzdWx0LnN0YXR1cyk7Ci0gIGlmIChyZXN1bHQuc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQlRNX1N0YXJ0SW5xdWlyeSByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhyZXN1bHQuc3RhdHVzKTsKLSAgICByZXN1bHQubnVtX3Jlc3AgPSAwOwotICAgIGJ0YV9kbV9pbnFfY21wbF9jYigodm9pZCopJnJlc3VsdCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2FuY2VsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYW5jZWxzIGFuIG9uZ29pbmcgc2VhcmNoIGZvciBkZXZpY2VzCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9zZWFyY2hfY2FuY2VsKCkgewotICBpZiAoQlRNX0lzSW5xdWlyeUFjdGl2ZSgpKSB7Ci0gICAgQlRNX0NhbmNlbElucXVpcnkoKTsKLSAgICBidGFfZG1fc2VhcmNoX2NhbmNlbF9ub3RpZnkoKTsKLSAgICBidGFfZG1fc2VhcmNoX2NtcGwoKTsKLSAgfQotICAvKiBJZiBubyBTZXJ2aWNlIFNlYXJjaCBnb2luZyBvbiB0aGVuIGlzc3VlIGNhbmNlbCByZW1vdGUgbmFtZSBpbiBjYXNlIGl0IGlzCi0gICAgIGFjdGl2ZSAqLwotICBlbHNlIGlmICghYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUpIHsKLSAgICBCVE1fQ2FuY2VsUmVtb3RlRGV2aWNlTmFtZSgpOwotICAgIGJ0YV9kbV9zZWFyY2hfY21wbCgpOwotICB9IGVsc2UgewotICAgIGJ0YV9kbV9pbnFfY21wbCgwKTsKLSAgfQotCi0gIGlmIChidGFfZG1fc2VhcmNoX2NiLmdhdHRfZGlzY19hY3RpdmUpIHsKLSAgICBidGFfZG1fY2FuY2VsX2dhdHRfZGlzY292ZXJ5KGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fZGlzY292ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2NvdmVycyBzZXJ2aWNlcyBvbiBhIHJlbW90ZSBkZXZpY2UKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2Rpc2NvdmVyKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgLyogc2F2ZSB0aGUgc2VhcmNoIGNvbmRpdGlvbiAqLwotICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID0gQlRBX0FMTF9TRVJWSUNFX01BU0s7Ci0KLSAgYnRhX2RtX2dhdHRjX3JlZ2lzdGVyKCk7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjayA9IHBfZGF0YS0+ZGlzY292ZXIucF9jYmFjazsKLSAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc190b19zZWFyY2ggPSBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzOwotICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPSAwOwotICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kID0gMDsKLSAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWVbMF0gPSAwOwotICBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChwX2RhdGEtPmRpc2NvdmVyLmJkX2FkZHIpOwotICBidGFfZG1fc2VhcmNoX2NiLnRyYW5zcG9ydCA9IHBfZGF0YS0+ZGlzY292ZXIudHJhbnNwb3J0OwotCi0gIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lID0gZmFsc2U7Ci0gIGJ0YV9kbV9kaXNjb3Zlcl9kZXZpY2UocF9kYXRhLT5kaXNjb3Zlci5iZF9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9kaXNhYmxlX3NlYXJjaF9hbmRfZGlzYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FuY2VscyBhbiBvbmdvaW5nIHNlYXJjaCBvciBkaXNjb3ZlcnkgZm9yIGRldmljZXMgaW4gY2FzZQotICogICAgICAgICAgICAgICAgICBvZiBhIEJsdWV0b290aCBkaXNhYmxlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV9zZWFyY2hfYW5kX2Rpc2Modm9pZCkgewotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZSAhPSBCVEFfRE1fU0VBUkNIX0lETEUpIGJ0YV9kbV9zZWFyY2hfY2FuY2VsKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcmVhZF9yZW1vdGVfZGV2aWNlX25hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYXRlIHRvIGdldCByZW1vdGUgZGV2aWNlIG5hbWUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3RhcnRlZCB0byBnZXQgcmVtb3RlIG5hbWUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRhX2RtX3JlYWRfcmVtb3RlX2RldmljZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1czsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyID0gYmRfYWRkcjsKLSAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWVbMF0gPSAwOwotCi0gIGJ0bV9zdGF0dXMgPQotICAgICAgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKQotICAgICAgICAgID8gYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVhZFJlbW90ZURldmljZU5hbWUoCi0gICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwgYnRhX2RtX3JlbW5hbWVfY2JhY2ssIHRyYW5zcG9ydCkKLSAgICAgICAgICA6IEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9yZW1uYW1lX2NiYWNrLCB0cmFuc3BvcnQpOwotCi0gIGlmIChidG1fc3RhdHVzID09IEJUTV9DTURfU1RBUlRFRCkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBCVE1fUmVhZFJlbW90ZURldmljZU5hbWUgaXMgc3RhcnRlZCIsIF9fZnVuY19fKTsKLQotICAgIHJldHVybiAodHJ1ZSk7Ci0gIH0gZWxzZSBpZiAoYnRtX3N0YXR1cyA9PSBCVE1fQlVTWSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBCVE1fUmVhZFJlbW90ZURldmljZU5hbWUgaXMgYnVzeSIsIF9fZnVuY19fKTsKLQotICAgIC8qIFJlbW90ZSBuYW1lIGRpc2NvdmVyeSBpcyBvbiBnb2luZyBub3cgc28gQlRNIGNhbm5vdCBub3RpZnkgdGhyb3VnaAotICAgICAqICJidGFfZG1fcmVtbmFtZV9jYmFjayIgKi8KLSAgICAvKiBhZGRpbmcgY2FsbGJhY2sgdG8gZ2V0IG5vdGlmaWVkIHRoYXQgY3VycmVudCByZWFkaW5nIHJlbW9yZSBuYW1lIGRvbmUgKi8KLQotICAgIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkgewotICAgICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkUm10TmFtZU5vdGlmeUNhbGxiYWNrKAotICAgICAgICAgICZidGFfZG1fc2VydmljZV9zZWFyY2hfcmVtbmFtZV9jYmFjayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUTV9TZWNBZGRSbXROYW1lTm90aWZ5Q2FsbGJhY2soJmJ0YV9kbV9zZXJ2aWNlX3NlYXJjaF9yZW1uYW1lX2NiYWNrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHRydWUpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZSByZXR1cm5zIDB4JTAyWCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBidG1fc3RhdHVzKTsKLQotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1faW5xX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgdGhlIGlucXVpcnkgY29tcGxldGUgZXZlbnQgZnJvbSBCVE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1faW5xX2NtcGwodWludDhfdCBudW0pIHsKLSAgaWYgKGJ0YV9kbV9zZWFyY2hfZ2V0X3N0YXRlKCkgPT0gQlRBX0RNX1NFQVJDSF9DQU5DRUxMSU5HKSB7Ci0gICAgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUoQlRBX0RNX1NFQVJDSF9JRExFKTsKLSAgICBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChidGFfZG1fc2VhcmNoX2dldF9zdGF0ZSgpICE9IEJUQV9ETV9TRUFSQ0hfQUNUSVZFKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9ETV9TRUFSQ0ggZGF0YTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1faW5xX2NtcGwiKTsKLQotICBkYXRhLmlucV9jbXBsLm51bV9yZXNwcyA9IG51bTsKLSAgYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjayhCVEFfRE1fSU5RX0NNUExfRVZULCAmZGF0YSk7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyA9IEJUTV9JbnFEYkZpcnN0KCk7Ci0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvICE9IE5VTEwpIHsKLSAgICAvKiBzdGFydCBuYW1lIGFuZCBzZXJ2aWNlIGRpc2NvdmVyeSBmcm9tIHRoZSBmaXJzdCBkZXZpY2Ugb24gaW5xdWlyeSByZXN1bHQKLSAgICAgKi8KLSAgICBidGFfZG1fc2VhcmNoX2NiLm5hbWVfZGlzY292ZXJfZG9uZSA9IGZhbHNlOwotICAgIGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9uYW1lWzBdID0gMDsKLSAgICBidGFfZG1fZGlzY292ZXJfZGV2aWNlKAotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvLT5yZXN1bHRzLnJlbW90ZV9iZF9hZGRyKTsKLSAgfSBlbHNlIHsKLSAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID0gMDsKLSAgICBidGFfZG1fc2VhcmNoX2NtcGwoKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3JtdF9uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSByZW1vdGUgbmFtZSByZXN1bHQgZnJvbSBCVE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fcm10X25hbWUodEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fcm10X25hbWUiKTsKLQotICBpZiAocF9kYXRhLT5yZW1fbmFtZS5yZXN1bHQuZGlzY19yZXMuYmRfbmFtZVswXSAmJgotICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbykgewotICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSB0cnVlOwotICB9Ci0KLSAgYnRhX2RtX2Rpc2NvdmVyX2RldmljZShidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9kaXNjX3JtdF9uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSByZW1vdGUgbmFtZSByZXN1bHQgZnJvbSBCVE0gd2hlbiBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICB3YW50cyB0byBmaW5kIHRoZSBuYW1lIGZvciBhIGJkYWRkcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9kaXNjX3JtdF9uYW1lKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgdEJUTV9JTlFfSU5GTyogcF9idG1faW5xX2luZm87Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2RtX2Rpc2Nfcm10X25hbWUiKTsKLQotICBwX2J0bV9pbnFfaW5mbyA9IEJUTV9JbnFEYlJlYWQocF9kYXRhLT5yZW1fbmFtZS5yZXN1bHQuZGlzY19yZXMuYmRfYWRkcik7Ci0gIGlmIChwX2J0bV9pbnFfaW5mbykgewotICAgIGlmIChwX2RhdGEtPnJlbV9uYW1lLnJlc3VsdC5kaXNjX3Jlcy5iZF9uYW1lWzBdKSB7Ci0gICAgICBwX2J0bV9pbnFfaW5mby0+YXBwbF9rbm93c19yZW1fbmFtZSA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgYnRhX2RtX2Rpc2NvdmVyX2RldmljZShwX2RhdGEtPnJlbV9uYW1lLnJlc3VsdC5kaXNjX3Jlcy5iZF9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9zZHBfcmVzdWx0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSBkaXNjb3ZlcnkgcmVzdWx0IGZyb20gc2RwCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX3NkcF9yZXN1bHQodEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICB0U0RQX0RJU0NfUkVDKiBwX3NkcF9yZWMgPSBOVUxMOwotICB0QlRBX0RNX01TRyogcF9tc2c7Ci0gIGJvb2wgc2NuX2ZvdW5kID0gZmFsc2U7Ci0gIHVpbnQxNl90IHNlcnZpY2UgPSAweEZGRkY7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLQotICBzdGQ6OnZlY3RvcjxVdWlkPiB1dWlkX2xpc3Q7Ci0KLSAgaWYgKChwX2RhdGEtPnNkcF9ldmVudC5zZHBfcmVzdWx0ID09IFNEUF9TVUNDRVNTKSB8fAotICAgICAgKHBfZGF0YS0+c2RwX2V2ZW50LnNkcF9yZXN1bHQgPT0gU0RQX05PX1JFQ1NfTUFUQ0gpIHx8Ci0gICAgICAocF9kYXRhLT5zZHBfZXZlbnQuc2RwX3Jlc3VsdCA9PSBTRFBfREJfRlVMTCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJzZHBfcmVzdWx0OjoweCV4IiwgcF9kYXRhLT5zZHBfZXZlbnQuc2RwX3Jlc3VsdCk7Ci0gICAgZG8gewotICAgICAgcF9zZHBfcmVjID0gTlVMTDsKLSAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPT0gKEJUQV9VU0VSX1NFUlZJQ0VfSUQgKyAxKSkgewotICAgICAgICBpZiAocF9zZHBfcmVjICYmIFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NkcF9yZWMsIFVVSURfUFJPVE9DT0xfUkZDT01NLCAmcGUpKSB7Ci0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX3NjbiA9ICh1aW50OF90KXBlLnBhcmFtc1swXTsKLSAgICAgICAgICBzY25fZm91bmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZXJ2aWNlID0KLSAgICAgICAgICAgIGJ0YV9zZXJ2aWNlX2lkX3RvX3V1aWRfbGt1cF90YmxbYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4IC0gMV07Ci0gICAgICAgIHBfc2RwX3JlYyA9Ci0gICAgICAgICAgICBTRFBfRmluZFNlcnZpY2VJbkRiKGJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGIsIHNlcnZpY2UsIHBfc2RwX3JlYyk7Ci0gICAgICB9Ci0gICAgICAvKiBmaW5pc2hlZCB3aXRoIEJSL0VEUiBzZXJ2aWNlcywgbm93IHdlIGNoZWNrIHRoZSByZXN1bHQgZm9yIEdBVFQgYmFzZWQKLSAgICAgICAqIHNlcnZpY2UgVVVJRCAqLwotICAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCA9PSBCVEFfTUFYX1NFUlZJQ0VfSUQpIHsKLSAgICAgICAgLyogYWxsIEdBVFQgYmFzZWQgc2VydmljZXMgKi8KLQotICAgICAgICBzdGQ6OnZlY3RvcjxVdWlkPiBnYXR0X3V1aWRzOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAvKiBmaW5kIGEgc2VydmljZSByZWNvcmQsIHJlcG9ydCBpdCAqLwotICAgICAgICAgIHBfc2RwX3JlYyA9Ci0gICAgICAgICAgICAgIFNEUF9GaW5kU2VydmljZUluRGIoYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYiwgMCwgcF9zZHBfcmVjKTsKLSAgICAgICAgICBpZiAocF9zZHBfcmVjKSB7Ci0gICAgICAgICAgICBVdWlkIHNlcnZpY2VfdXVpZDsKLSAgICAgICAgICAgIGlmIChTRFBfRmluZFNlcnZpY2VVVUlESW5SZWMocF9zZHBfcmVjLCAmc2VydmljZV91dWlkKSkgewotICAgICAgICAgICAgICBnYXR0X3V1aWRzLnB1c2hfYmFjayhzZXJ2aWNlX3V1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocF9zZHBfcmVjKTsKLQotICAgICAgICBpZiAoIWdhdHRfdXVpZHMuZW1wdHkoKSkgewotICAgICAgICAgIExPR19JTkZPKCJHQVRUIHNlcnZpY2VzIGRpc2NvdmVyZWQgdXNpbmcgU0RQIik7Ci0KLSAgICAgICAgICAvLyBzZW5kIGFsbCByZXN1bHQgYmFjayB0byBhcHAKLSAgICAgICAgICB0QlRBX0RNX1NFQVJDSCByZXN1bHQ7Ci0gICAgICAgICAgcmVzdWx0LmRpc2NfYmxlX3Jlcy5iZF9hZGRyID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKLSAgICAgICAgICBzdHJsY3B5KChjaGFyKilyZXN1bHQuZGlzY19ibGVfcmVzLmJkX25hbWUsIGJ0YV9kbV9nZXRfcmVtbmFtZSgpLAotICAgICAgICAgICAgICAgICAgQkRfTkFNRV9MRU4gKyAxKTsKLQotICAgICAgICAgIHJlc3VsdC5kaXNjX2JsZV9yZXMuc2VydmljZXMgPSAmZ2F0dF91dWlkczsKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2VhcmNoX2NiYWNrKEJUQV9ETV9ESVNDX0JMRV9SRVNfRVZULCAmcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogU0RQX0RCX0ZVTEwgbWVhbnMgc29tZSByZWNvcmRzIHdpdGggdGhlCi0gICAgICAgICAgIHJlcXVpcmVkIGF0dHJpYnV0ZXMgd2VyZSByZWNlaXZlZCAqLwotICAgICAgICBpZiAoKChwX2RhdGEtPnNkcF9ldmVudC5zZHBfcmVzdWx0ID09IFNEUF9EQl9GVUxMKSAmJgotICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXMgIT0gQlRBX0FMTF9TRVJWSUNFX01BU0spIHx8Ci0gICAgICAgICAgICAocF9zZHBfcmVjICE9IE5VTEwpKSB7Ci0gICAgICAgICAgaWYgKHNlcnZpY2UgIT0gVVVJRF9TRVJWQ0xBU1NfUE5QX0lORk9STUFUSU9OKSB7Ci0gICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kIHw9Ci0gICAgICAgICAgICAgICAgKHRCVEFfU0VSVklDRV9NQVNLKShCVEFfU0VSVklDRV9JRF9UT19TRVJWSUNFX01BU0soCi0gICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCAtIDEpKTsKLSAgICAgICAgICAgIHVpbnQxNl90IHRtcF9zdmMgPQotICAgICAgICAgICAgICAgIGJ0YV9zZXJ2aWNlX2lkX3RvX3V1aWRfbGt1cF90YmxbYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdOwotICAgICAgICAgICAgLyogQWRkIHRvIHRoZSBsaXN0IG9mIFVVSURzICovCi0gICAgICAgICAgICB1dWlkX2xpc3QucHVzaF9iYWNrKFV1aWQ6OkZyb20xNkJpdCh0bXBfc3ZjKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID09IEJUQV9BTExfU0VSVklDRV9NQVNLICYmCi0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc190b19zZWFyY2ggPT0gMCkgewotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXgrKzsKLSAgICAgIH0gZWxzZSAvKiByZWd1bGFyIG9uZSBzZXJ2aWNlIHBlciBzZWFyY2ggb3IgUE5QIHNlYXJjaCAqLwotICAgICAgICBicmVhazsKLQotICAgIH0gd2hpbGUgKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCA8PSBCVEFfTUFYX1NFUlZJQ0VfSUQpOwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgc2VydmljZXNfZm91bmQgPSAlMDR4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kKTsKLQotICAgIC8qIENvbGxlY3QgdGhlIDEyOC1iaXQgc2VydmljZXMgaGVyZSBhbmQgcHV0IHRoZW0gaW50byB0aGUgbGlzdCAqLwotICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID09IEJUQV9BTExfU0VSVklDRV9NQVNLKSB7Ci0gICAgICBwX3NkcF9yZWMgPSBOVUxMOwotICAgICAgZG8gewotICAgICAgICAvKiBmaW5kIGEgc2VydmljZSByZWNvcmQsIHJlcG9ydCBpdCAqLwotICAgICAgICBwX3NkcF9yZWMgPQotICAgICAgICAgICAgU0RQX0ZpbmRTZXJ2aWNlSW5EYl8xMjhiaXQoYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYiwgcF9zZHBfcmVjKTsKLSAgICAgICAgaWYgKHBfc2RwX3JlYykgewotICAgICAgICAgIC8vIFNEUF9GaW5kU2VydmljZVVVSURJblJlY18xMjhiaXQgaXMgdXNlZCBvbmx5IG9uY2UsIHJlZmFjdG9yPwotICAgICAgICAgIFV1aWQgdGVtcF91dWlkOwotICAgICAgICAgIGlmIChTRFBfRmluZFNlcnZpY2VVVUlESW5SZWNfMTI4Yml0KHBfc2RwX3JlYywgJnRlbXBfdXVpZCkpIHsKLSAgICAgICAgICAgIHV1aWRfbGlzdC5wdXNoX2JhY2sodGVtcF91dWlkKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gd2hpbGUgKHBfc2RwX3JlYyk7Ci0gICAgfQotICAgIC8qIGlmIHRoZXJlIGFyZSBtb3JlIHNlcnZpY2VzIHRvIHNlYXJjaCBmb3IgKi8KLSAgICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc190b19zZWFyY2gpIHsKLSAgICAgIC8qIEZyZWUgdXAgdGhlIHBfc2RwX2RiIGJlZm9yZSBjaGVja2luZyB0aGUgbmV4dCBvbmUgKi8KLSAgICAgIGJ0YV9kbV9mcmVlX3NkcF9kYigpOwotICAgICAgYnRhX2RtX2ZpbmRfc2VydmljZXMoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGNhbGxiYWNrcyAqLwotICAgICAgLyogc3RhcnQgbmV4dCBiZF9hZGRyIGlmIG5lY2Vzc2FyeSAqLwotCi0gICAgICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrKAotICAgICAgICAgICAgJmJ0YV9kbV9zZXJ2aWNlX3NlYXJjaF9yZW1uYW1lX2NiYWNrKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUTV9TZWNEZWxldGVSbXROYW1lTm90aWZ5Q2FsbGJhY2soCi0gICAgICAgICAgICAmYnRhX2RtX3NlcnZpY2Vfc2VhcmNoX3JlbW5hbWVfY2JhY2spOwotICAgICAgfQotCi0gICAgICBwX21zZyA9ICh0QlRBX0RNX01TRyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ETV9NU0cpKTsKLSAgICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBCVEFfRE1fRElTQ09WRVJZX1JFU1VMVF9FVlQ7Ci0gICAgICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnJlc3VsdCA9IEJUQV9TVUNDRVNTOwotICAgICAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5udW1fdXVpZHMgPSB1dWlkX2xpc3Quc2l6ZSgpOwotICAgICAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5wX3V1aWRfbGlzdCA9IE5VTEw7Ci0gICAgICBpZiAodXVpZF9saXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgLy8gVE9ETyhqcGF3bG93c2tpKTogbWFrZSBwX3V1aWRfbGlzdCBpbnRvIHZlY3RvciwgYW5kIGp1c3QgY29weQotICAgICAgICAvLyB2ZWN0b3JzLCBidXQgZmlyc3QgZ2V0IHJpZCBvZiBidGFfc3lzX3NlbmRtc2cgYmVsb3cuCi0gICAgICAgIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMucF91dWlkX2xpc3QgPQotICAgICAgICAgICAgKFV1aWQqKW9zaV9tYWxsb2ModXVpZF9saXN0LnNpemUoKSAqIHNpemVvZihVdWlkKSk7Ci0gICAgICAgIG1lbWNweShwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnBfdXVpZF9saXN0LCB1dWlkX2xpc3QuZGF0YSgpLAotICAgICAgICAgICAgICAgdXVpZF9saXN0LnNpemUoKSAqIHNpemVvZihVdWlkKSk7Ci0gICAgICB9Ci0gICAgICAvLyBDb3B5IHRoZSByYXdfZGF0YSB0byB0aGUgZGlzY292ZXJ5IHJlc3VsdCBzdHJ1Y3R1cmUKLSAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfc2RwX2RiICE9IE5VTEwgJiYKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2RwX2RiLT5yYXdfdXNlZCAhPSAwICYmCi0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYi0+cmF3X2RhdGEgIT0gTlVMTCkgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyByYXdfZGF0YSB1c2VkID0gMHgleCByYXdfZGF0YV9wdHIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYi0+cmF3X3VzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYi0+cmF3X2RhdGEpOwotCi0gICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGItPnJhd19kYXRhID0KLSAgICAgICAgICAgIE5VTEw7ICAvLyBubyBuZWVkIHRvIGZyZWUgdGhpcyAtIGl0IGlzIGEgZ2xvYmFsIGFzc2lnbmVkLgotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2RwX2RiLT5yYXdfdXNlZCA9IDA7Ci0gICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGItPnJhd19zaXplID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIHJhdyBkYXRhIHNpemUgaXMgMCBvciByYXdfZGF0YSBpcyBudWxsISEiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIH0KLSAgICAgIC8qIERvbmUgd2l0aCBwX3NkcF9kYi4gRnJlZSBpdCAqLwotICAgICAgYnRhX2RtX2ZyZWVfc2RwX2RiKCk7Ci0gICAgICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnNlcnZpY2VzID0KLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kOwotCi0gICAgICAvLyBQaWdneSBiYWNrIHRoZSBTQ04gb3ZlciByZXN1bHQgZmllbGQKLSAgICAgIGlmIChzY25fZm91bmQpIHsKLSAgICAgICAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5yZXN1bHQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEJUQV9TVEFUVVM+KCgzICsgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX3NjbikpOwotICAgICAgICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnNlcnZpY2VzIHw9IEJUQV9VU0VSX1NFUlZJQ0VfTUFTSzsKLQotICAgICAgICBBUFBMX1RSQUNFX0VWRU5UKCIgUGlnZ3kgYmFjayB0aGUgU0NOIG92ZXIgcmVzdWx0IGZpZWxkICBTQ049JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9zY24pOwotICAgICAgfQotICAgICAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9hZGRyID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKLSAgICAgIHN0cmxjcHkoKGNoYXIqKXBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuYmRfbmFtZSwKLSAgICAgICAgICAgICAgYnRhX2RtX2dldF9yZW1uYW1lKCksIEJEX05BTUVfTEVOICsgMSk7Ci0KLSAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGNvbm4gZmFpbGVkLiBObyBuZWVkIGZvciB0aW1lciAqLwotICAgIGlmIChwX2RhdGEtPnNkcF9ldmVudC5zZHBfcmVzdWx0ID09IFNEUF9DT05OX0ZBSUxFRCkKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iud2FpdF9kaXNjID0gZmFsc2U7Ci0KLSAgICAvKiBub3QgYWJsZSB0byBjb25uZWN0IGdvIHRvIG5leHQgZGV2aWNlICovCi0gICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGIpCi0gICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYik7Ci0KLSAgICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0RlbGV0ZVJtdE5hbWVOb3RpZnlDYWxsYmFjaygKLSAgICAgICAgICAmYnRhX2RtX3NlcnZpY2Vfc2VhcmNoX3JlbW5hbWVfY2JhY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrKCZidGFfZG1fc2VydmljZV9zZWFyY2hfcmVtbmFtZV9jYmFjayk7Ci0gICAgfQotCi0gICAgcF9tc2cgPSAodEJUQV9ETV9NU0cqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fTVNHKSk7Ci0gICAgcF9tc2ctPmhkci5ldmVudCA9IEJUQV9ETV9ESVNDT1ZFUllfUkVTVUxUX0VWVDsKLSAgICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnJlc3VsdCA9IEJUQV9GQUlMVVJFOwotICAgIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuc2VydmljZXMgPQotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kOwotICAgIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuYmRfYWRkciA9IGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHI7Ci0gICAgc3RybGNweSgoY2hhciopcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9uYW1lLAotICAgICAgICAgICAgYnRhX2RtX2dldF9yZW1uYW1lKCksIEJEX05BTUVfTEVOICsgMSk7Ci0KLSAgICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2VhcmNoX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmRzIGV2ZW50IHRvIGFwcGxpY2F0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX3NlYXJjaF9jbXBsKCkgewotICBidGFfZG1fc2VhcmNoX3NldF9zdGF0ZShCVEFfRE1fU0VBUkNIX0lETEUpOwotCi0gIHVpbnQxNl90IGNvbm5faWQgPSBidGFfZG1fc2VhcmNoX2NiLmNvbm5faWQ7Ci0KLSAgLyogbm8gQkxFIGNvbm5lY3Rpb24sIGkuZS4gQ2xhc3NpYyBzZXJ2aWNlIGRpc2NvdmVyeSBlbmQgKi8KLSAgaWYgKGNvbm5faWQgPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHsKLSAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2VhcmNoX2NiYWNrKEJUQV9ETV9ESVNDX0NNUExfRVZULCBudWxscHRyKTsKLSAgICBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGRiID0gTlVMTDsKLSAgaW50IGNvdW50ID0gMDsKLSAgQlRBX0dBVFRDX0dldEdhdHREYihjb25uX2lkLCAweDAwMDAsIDB4RkZGRiwgJmRiLCAmY291bnQpOwotCi0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgTE9HX0lORk8oIkVtcHR5IEdBVFQgZGF0YWJhc2UgLSBubyBCTEUgc2VydmljZXMgZGlzY292ZXJlZCIpOwotICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZWFyY2hfY2JhY2soQlRBX0RNX0RJU0NfQ01QTF9FVlQsIG51bGxwdHIpOwotICAgIGJ0YV9kbV9leGVjdXRlX3F1ZXVlZF9yZXF1ZXN0KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8VXVpZD4gZ2F0dF9zZXJ2aWNlczsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAvLyB3ZSBwcm9jZXNzIHNlcnZpY2UgZW50cmllcyBvbmx5Ci0gICAgaWYgKGRiW2ldLnR5cGUgPT0gQlRHQVRUX0RCX1BSSU1BUllfU0VSVklDRSkgewotICAgICAgZ2F0dF9zZXJ2aWNlcy5wdXNoX2JhY2soZGJbaV0udXVpZCk7Ci0gICAgfQotICB9Ci0gIG9zaV9mcmVlKGRiKTsKLQotICB0QlRBX0RNX1NFQVJDSCByZXN1bHQ7Ci0gIHJlc3VsdC5kaXNjX2JsZV9yZXMuc2VydmljZXMgPSAmZ2F0dF9zZXJ2aWNlczsKLSAgcmVzdWx0LmRpc2NfYmxlX3Jlcy5iZF9hZGRyID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKLSAgc3RybGNweSgoY2hhciopcmVzdWx0LmRpc2NfYmxlX3Jlcy5iZF9uYW1lLCAoY2hhciopYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWUsCi0gICAgICAgICAgQkRfTkFNRV9MRU4gKyAxKTsKLQotICBMT0dfSU5GTygiR0FUVCBzZXJ2aWNlcyBkaXNjb3ZlcmVkIHVzaW5nIExFIFRyYW5zcG9ydCIpOwotICAvLyBzZW5kIGFsbCByZXN1bHQgYmFjayB0byBhcHAKLSAgYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjayhCVEFfRE1fRElTQ19CTEVfUkVTX0VWVCwgJnJlc3VsdCk7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjayhCVEFfRE1fRElTQ19DTVBMX0VWVCwgbnVsbHB0cik7Ci0KLSAgYnRhX2RtX2V4ZWN1dGVfcXVldWVkX3JlcXVlc3QoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9kaXNjX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VydmljZSBkaXNjb3ZlcnkgcmVzdWx0IHdoZW4gZGlzY292ZXJpbmcgc2VydmljZXMgb24gYQotICogICAgICAgICAgICAgICAgICBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fZGlzY19yZXN1bHQodEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICAvKiBpZiBhbnkgQlIvRURSIHNlcnZpY2UgZGlzY292ZXJ5IGhhcyBiZWVuIGRvbmUsIHJlcG9ydCB0aGUgZXZlbnQgKi8KLSAgaWYgKChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzICYKLSAgICAgICAoKEJUQV9BTExfU0VSVklDRV9NQVNLIHwgQlRBX1VTRVJfU0VSVklDRV9NQVNLKSAmCi0gICAgICAgIH5CVEFfQkxFX1NFUlZJQ0VfTUFTSykpKQotICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZWFyY2hfY2JhY2soQlRBX0RNX0RJU0NfUkVTX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2RhdGEtPmRpc2NfcmVzdWx0LnJlc3VsdCk7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jbXBsKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2VhcmNoX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VydmljZSBkaXNjb3ZlcnkgcmVzdWx0IHdoaWxlIHNlYXJjaGluZyBmb3IgZGV2aWNlcwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9zZWFyY2hfcmVzdWx0KHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgc2VhcmNoaW5nOjB4JTA0eCwgcmVzdWx0OjB4JTA0eCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuc2VydmljZXMpOwotCi0gIC8qIGNhbGwgYmFjayBpZiBhcHBsaWNhdGlvbiB3YW50cyBuYW1lIGRpc2NvdmVyeSBvciBmb3VuZCBzZXJ2aWNlcyB0aGF0Ci0gICAqIGFwcGxpY2F0aW9uIGlzIHNlYXJjaGluZyAqLwotICBpZiAoKCFidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzKSB8fAotICAgICAgKChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzKSAmJgotICAgICAgIChwX2RhdGEtPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5zZXJ2aWNlcykpKSB7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjayhCVEFfRE1fRElTQ19SRVNfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZGF0YS0+ZGlzY19yZXN1bHQucmVzdWx0KTsKLSAgfQotCi0gIC8qIGlmIHNlYXJjaGluZyBkaWQgbm90IGluaXRpYXRlIHRvIGNyZWF0ZSBsaW5rICovCi0gIGlmICghYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MpIHsKLSAgICAvKiBpZiBzZXJ2aWNlIHNlYXJjaGluZyBpcyBkb25lIHdpdGggRUlSLCBkb24ndCBzZWFyY2ggbmV4dCBkZXZpY2UgKi8KLSAgICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbykgYnRhX2RtX2Rpc2NvdmVyX25leHRfZGV2aWNlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogd2FpdCB1bnRpbCBsaW5rIGlzIGRpc2Nvbm5lY3RlZCBvciB0aW1lb3V0ICovCi0gICAgYnRhX2RtX3NlYXJjaF9jYi5zZHBfcmVzdWx0cyA9IHRydWU7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKGJ0YV9kbV9zZWFyY2hfY2Iuc2VhcmNoX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogKEwyQ0FQX0xJTktfSU5BQ1RJVklUWV9UT1VUICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfdGltZXJfY2JhY2ssIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2VhcmNoX3RpbWVyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgd2hlbiBBQ0wgZGlzY29ubmVjdCB0aW1lIGlzIG92ZXIKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9zZWFyY2hfdGltZXJfY2JhY2soVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBBUFBMX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLSAgYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MgPSBmYWxzZTsKLQotICAvKiBwcm9jZWVkIHdpdGggbmV4dCBkZXZpY2UgKi8KLSAgYnRhX2RtX2Rpc2NvdmVyX25leHRfZGV2aWNlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fZnJlZV9zZHBfZGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZyZWVzIFNEUCBkYXRhIGJhc2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fZnJlZV9zZHBfZGIoKSB7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZidGFfZG1fc2VhcmNoX2NiLnBfc2RwX2RiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9xdWV1ZV9zZWFyY2gKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFF1ZXVlcyBzZWFyY2ggY29tbWFuZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9xdWV1ZV9zZWFyY2godEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmYnRhX2RtX3NlYXJjaF9jYi5wX3BlbmRpbmdfc2VhcmNoKTsKLSAgYnRhX2RtX3NlYXJjaF9jYi5wX3BlbmRpbmdfc2VhcmNoID0KLSAgICAgICh0QlRBX0RNX01TRyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ETV9BUElfU0VBUkNIKSk7Ci0gIG1lbWNweShidGFfZG1fc2VhcmNoX2NiLnBfcGVuZGluZ19zZWFyY2gsIHBfZGF0YSwgc2l6ZW9mKHRCVEFfRE1fQVBJX1NFQVJDSCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3F1ZXVlX2Rpc2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFF1ZXVlcyBkaXNjb3ZlcnkgY29tbWFuZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9xdWV1ZV9kaXNjKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgdEJUQV9ETV9NU0cqIHBfcGVuZGluZ19kaXNjb3ZlcnkgPQotICAgICAgKHRCVEFfRE1fTVNHKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0RNX0FQSV9ESVNDT1ZFUikpOwotICBtZW1jcHkocF9wZW5kaW5nX2Rpc2NvdmVyeSwgcF9kYXRhLCBzaXplb2YodEJUQV9ETV9BUElfRElTQ09WRVIpKTsKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShidGFfZG1fc2VhcmNoX2NiLnBlbmRpbmdfZGlzY292ZXJ5X3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgIHBfcGVuZGluZ19kaXNjb3ZlcnkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2V4ZWN1dGVfcXVldWVkX3JlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIHF1ZXVlZCByZXF1ZXN0IGlmIG9uZSBleGlzdHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdCgpIHsKLSAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IucF9wZW5kaW5nX3NlYXJjaCkgewotICAgIC8vIFVwZGF0ZWQgcXVldWVkIGV2ZW50IHRvIHNlYXJjaCBldmVudCB0byB0cmlnZ2VyIHN0YXJ0IHNlYXJjaAotICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfcGVuZGluZ19zZWFyY2gtPmhkci5ldmVudCA9PQotICAgICAgICBCVEFfRE1fQVBJX1FVRVVFX1NFQVJDSF9FVlQpIHsKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9wZW5kaW5nX3NlYXJjaC0+aGRyLmV2ZW50ID0gQlRBX0RNX0FQSV9TRUFSQ0hfRVZUOwotICAgIH0KLSAgICBMT0dfSU5GTygiJXMgU3RhcnQgcGVuZGluZyBzZWFyY2giLCBfX2Z1bmNfXyk7Ci0gICAgYnRhX3N5c19zZW5kbXNnKGJ0YV9kbV9zZWFyY2hfY2IucF9wZW5kaW5nX3NlYXJjaCk7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi5wX3BlbmRpbmdfc2VhcmNoID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICB0QlRBX0RNX01TRyogcF9wZW5kaW5nX2Rpc2NvdmVyeSA9ICh0QlRBX0RNX01TRyopZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoCi0gICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucGVuZGluZ19kaXNjb3ZlcnlfcXVldWUpOwotICAgIGlmIChwX3BlbmRpbmdfZGlzY292ZXJ5KSB7Ci0gICAgICBpZiAocF9wZW5kaW5nX2Rpc2NvdmVyeS0+aGRyLmV2ZW50ID09IEJUQV9ETV9BUElfUVVFVUVfRElTQ09WRVJfRVZUKSB7Ci0gICAgICAgIHBfcGVuZGluZ19kaXNjb3ZlcnktPmhkci5ldmVudCA9IEJUQV9ETV9BUElfRElTQ09WRVJfRVZUOwotICAgICAgfQotICAgICAgTE9HX0lORk8oIiVzIFN0YXJ0IHBlbmRpbmcgZGlzY292ZXJ5IiwgX19mdW5jX18pOwotICAgICAgYnRhX3N5c19zZW5kbXNnKHBfcGVuZGluZ19kaXNjb3ZlcnkpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2lzX3NlYXJjaF9yZXF1ZXN0X3F1ZXVlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2tzIGlmIHRoZXJlIGlzIGEgcXVldWVkIHNlYXJjaCByZXF1ZXN0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBib29sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2RtX2lzX3NlYXJjaF9yZXF1ZXN0X3F1ZXVlZCgpIHsKLSAgcmV0dXJuIGJ0YV9kbV9zZWFyY2hfY2IucF9wZW5kaW5nX3NlYXJjaCAhPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3NlYXJjaF9jbGVhcl9xdWV1ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xlYXJzIHRoZSBxdWV1ZSBpZiBBUEkgc2VhcmNoIGNhbmNlbCBpcyBjYWxsZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fc2VhcmNoX2NsZWFyX3F1ZXVlKCkgewotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmYnRhX2RtX3NlYXJjaF9jYi5wX3BlbmRpbmdfc2VhcmNoKTsKLSAgZml4ZWRfcXVldWVfZmx1c2goYnRhX2RtX3NlYXJjaF9jYi5wZW5kaW5nX2Rpc2NvdmVyeV9xdWV1ZSwgb3NpX2ZyZWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYW5jZWxfbm90aWZ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBOb3RpZnkgYXBwbGljYXRpb24gdGhhdCBzZWFyY2ggaGFzIGJlZW4gY2FuY2VsbGVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX3NlYXJjaF9jYW5jZWxfbm90aWZ5KCkgewotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjaykgewotICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZWFyY2hfY2JhY2soQlRBX0RNX1NFQVJDSF9DQU5DRUxfQ01QTF9FVlQsIE5VTEwpOwotICB9Ci0gIGlmICghYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgJiYKLSAgICAgIChidGFfZG1fc2VhcmNoX2NiLnN0YXRlID09IEJUQV9ETV9TRUFSQ0hfQUNUSVZFIHx8Ci0gICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZSA9PSBCVEFfRE1fU0VBUkNIX0NBTkNFTExJTkcpKSB7Ci0gICAgQlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUoKTsKLSAgfQotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5nYXR0X2Rpc2NfYWN0aXZlKSB7Ci0gICAgYnRhX2RtX2NhbmNlbF9nYXR0X2Rpc2NvdmVyeShidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2ZpbmRfc2VydmljZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0cyBkaXNjb3Zlcnkgb24gYSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2ZpbmRfc2VydmljZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB3aGlsZSAoYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4IDwgQlRBX01BWF9TRVJWSUNFX0lEKSB7Ci0gICAgVXVpZCB1dWlkID0gVXVpZDo6a0VtcHR5OwotICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCAmCi0gICAgICAgICh0QlRBX1NFUlZJQ0VfTUFTSykoCi0gICAgICAgICAgICBCVEFfU0VSVklDRV9JRF9UT19TRVJWSUNFX01BU0soYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4KSkpIHsKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGIgPQotICAgICAgICAgICh0U0RQX0RJU0NPVkVSWV9EQiopb3NpX21hbGxvYyhCVEFfRE1fU0RQX0RCX1NJWkUpOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlcyA9ICUwNHgqKioqKioqKioqKiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXMpOwotICAgICAgLyogdHJ5IHRvIHNlYXJjaCBhbGwgc2VydmljZXMgYnkgc2VhcmNoIGJhc2VkIG9uIEwyQ0FQIFVVSUQgKi8KLSAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID09IEJUQV9BTExfU0VSVklDRV9NQVNLKSB7Ci0gICAgICAgIExPR19JTkZPKCIlcyBzZXJ2aWNlc190b19zZWFyY2g9JTA4eCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCk7Ci0gICAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCAmIEJUQV9SRVNfU0VSVklDRV9NQVNLKSB7Ci0gICAgICAgICAgdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsWzBdKTsKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCAmPSB+QlRBX1JFU19TRVJWSUNFX01BU0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChVVUlEX1BST1RPQ09MX0wyQ0FQKTsKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX3RvX3NlYXJjaCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGZvciBMRSBvbmx5IHByb2ZpbGUgKi8KLSAgICAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCA9PSBCVEFfQkxFX1NFUlZJQ0VfSUQpIHsKLSAgICAgICAgICB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KAotICAgICAgICAgICAgICBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsW2J0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleF0pOwotCi0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc190b19zZWFyY2ggJj0gKHRCVEFfU0VSVklDRV9NQVNLKSh+KAotICAgICAgICAgICAgICBCVEFfU0VSVklDRV9JRF9UT19TRVJWSUNFX01BU0soYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4KSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIHJlbW92ZSB0aGUgc2VydmljZSBmcm9tIHNlcnZpY2VzIHRvIGJlIHNlYXJjaGVkICAqLwotICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfdG9fc2VhcmNoICY9ICh0QlRBX1NFUlZJQ0VfTUFTSykofigKLSAgICAgICAgICAgICAgQlRBX1NFUlZJQ0VfSURfVE9fU0VSVklDRV9NQVNLKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCkpKTsKLSAgICAgICAgICB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KAotICAgICAgICAgICAgICBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsW2J0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleF0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIExPR19JTkZPKCIlcyBzZWFyY2ggVVVJRCA9ICVzIiwgX19mdW5jX18sIHV1aWQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIFNEUF9Jbml0RGlzY292ZXJ5RGIoYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYiwgQlRBX0RNX1NEUF9EQl9TSVpFLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwgMCwgTlVMTCk7Ci0KLSAgICAgIG1lbXNldChnX2Rpc2NfcmF3X2RhdGFfYnVmLCAwLCBzaXplb2YoZ19kaXNjX3Jhd19kYXRhX2J1ZikpOwotICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYi0+cmF3X2RhdGEgPSBnX2Rpc2NfcmF3X2RhdGFfYnVmOwotCi0gICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2RwX2RiLT5yYXdfc2l6ZSA9IE1BWF9ESVNDX1JBV19EQVRBX0JVRjsKLQotICAgICAgaWYgKCFTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QoYmRfYWRkciwgYnRhX2RtX3NlYXJjaF9jYi5wX3NkcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGFfZG1fc2RwX2NhbGxiYWNrKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBJZiBkaXNjb3ZlcnkgaXMgbm90IHN1Y2Nlc3NmdWwgd2l0aCB0aGlzIGRldmljZSwgdGhlbgotICAgICAgICAgKiBwcm9jZWVkIHdpdGggdGhlIG5leHQgb25lLgotICAgICAgICAgKi8KLSAgICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmJ0YV9kbV9zZWFyY2hfY2IucF9zZHBfZGIpOwotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPSBCVEFfTUFYX1NFUlZJQ0VfSUQ7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCsrOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlX2luZGV4Kys7Ci0gIH0KLQotICAvKiBubyBtb3JlIHNlcnZpY2VzIHRvIGJlIGRpc2NvdmVyZWQgKi8KLSAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZV9pbmRleCA+PSBCVEFfTUFYX1NFUlZJQ0VfSUQpIHsKLSAgICB0QlRBX0RNX01TRyogcF9tc2cgPSAodEJUQV9ETV9NU0cqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fTVNHKSk7Ci0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1zZXQoJihwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0KSwgMCwgc2l6ZW9mKHRCVEFfRE1fRElTQ19SRVMpKTsKLSAgICBwX21zZy0+aGRyLmV2ZW50ID0gQlRBX0RNX0RJU0NPVkVSWV9SRVNVTFRfRVZUOwotICAgIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuc2VydmljZXMgPQotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzX2ZvdW5kOwotICAgIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuYmRfYWRkciA9IGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHI7Ci0gICAgc3RybGNweSgoY2hhciopcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9uYW1lLAotICAgICAgICAgICAgYnRhX2RtX2dldF9yZW1uYW1lKCksIEJEX05BTUVfTEVOICsgMSk7Ci0KLSAgICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fZGlzY292ZXJfbmV4dF9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0cyBkaXNjb3Zlcnkgb24gdGhlIG5leHQgZGV2aWNlIGluIElucXVpcnkgZGF0YSBiYXNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9kaXNjb3Zlcl9uZXh0X2RldmljZSh2b2lkKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9kaXNjb3Zlcl9uZXh0X2RldmljZSIpOwotCi0gIC8qIHNlYXJjaGluZyBuZXh0IGRldmljZSBvbiBpbnF1aXJ5IHJlc3VsdCAqLwotICBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvID0KLSAgICAgIEJUTV9JbnFEYk5leHQoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyk7Ci0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvICE9IE5VTEwpIHsKLSAgICBidGFfZG1fc2VhcmNoX2NiLm5hbWVfZGlzY292ZXJfZG9uZSA9IGZhbHNlOwotICAgIGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9uYW1lWzBdID0gMDsKLSAgICBidGFfZG1fZGlzY292ZXJfZGV2aWNlKAotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvLT5yZXN1bHRzLnJlbW90ZV9iZF9hZGRyKTsKLSAgfSBlbHNlIHsKLSAgICB0QlRBX0RNX01TRyogcF9tc2cgPSAodEJUQV9ETV9NU0cqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fTVNHKSk7Ci0KLSAgICAvKiBubyBkZXZpY2VzLCBzZWFyY2ggY29tcGxldGUgKi8KLSAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzID0gMDsKLQotICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBCVEFfRE1fU0VBUkNIX0NNUExfRVZUOwotICAgIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9kaXNjb3Zlcl9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0cyBuYW1lIGFuZCBzZXJ2aWNlIGRpc2NvdmVyeSBvbiB0aGUgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9kaXNjb3Zlcl9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpIHsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfQlJfRURSOwotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0FVVE8pIHsKLSAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGU7Ci0gICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlOwotCi0gICAgQlRNX1JlYWREZXZJbmZvKHJlbW90ZV9iZF9hZGRyLCAmZGV2X3R5cGUsICZhZGRyX3R5cGUpOwotICAgIGlmIChkZXZfdHlwZSA9PSBCVF9ERVZJQ0VfVFlQRV9CTEUgfHwgYWRkcl90eXBlID09IEJMRV9BRERSX1JBTkRPTSkKLSAgICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLSAgfSBlbHNlIHsKLSAgICB0cmFuc3BvcnQgPSBidGFfZG1fc2VhcmNoX2NiLnRyYW5zcG9ydDsKLSAgfQotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBCREE6ICIgPDwgcmVtb3RlX2JkX2FkZHI7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciA9IHJlbW90ZV9iZF9hZGRyOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXMgbmFtZV9kaXNjb3Zlcl9kb25lID0gJWQgcF9idG1faW5xX2luZm8gMHgleCBzdGF0ZSA9ICVkLCB0cmFuc3BvcnQ9JWQiLAotICAgICAgX19mdW5jX18sIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lLAotICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbywgYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZSwgdHJhbnNwb3J0KTsKLQotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbykgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGFwcGxfa25vd3NfcmVtX25hbWUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUpOwotICB9Ci0gIGlmICgoKGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8pICYmCi0gICAgICAgKGJ0YV9kbV9zZWFyY2hfY2IucF9idG1faW5xX2luZm8tPnJlc3VsdHMuZGV2aWNlX3R5cGUgPT0KLSAgICAgICAgQlRfREVWSUNFX1RZUEVfQkxFKSAmJgotICAgICAgIChidGFfZG1fc2VhcmNoX2NiLnN0YXRlID09IEJUQV9ETV9TRUFSQ0hfQUNUSVZFKSkgfHwKLSAgICAgICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFICYmCi0gICAgICAgaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfRElTQUJMRV9OQU1FX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyKSkpIHsKLSAgICAvKiBEbyBub3QgcGVyZm9ybSBSTlIgZm9yIExFIGRldmljZXMgYXQgaW5xdWlyeSBjb21wbGV0ZSovCi0gICAgYnRhX2RtX3NlYXJjaF9jYi5uYW1lX2Rpc2NvdmVyX2RvbmUgPSB0cnVlOwotICB9Ci0gIC8qIGlmIG5hbWUgZGlzY292ZXJ5IGlzIG5vdCBkb25lIGFuZCBhcHBsaWNhdGlvbiBuZWVkcyByZW1vdGUgbmFtZSAqLwotICBpZiAoKCFidGFfZG1fc2VhcmNoX2NiLm5hbWVfZGlzY292ZXJfZG9uZSkgJiYKLSAgICAgICgoYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mbyA9PSBOVUxMKSB8fAotICAgICAgIChidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvICYmCi0gICAgICAgICghYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mby0+YXBwbF9rbm93c19yZW1fbmFtZSkpKSkgewotICAgIGlmIChidGFfZG1fcmVhZF9yZW1vdGVfZGV2aWNlX25hbWUoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCkpIHsKLSAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnN0YXRlICE9IEJUQV9ETV9ESVNDT1ZFUl9BQ1RJVkUpIHsKLSAgICAgICAgLyogUmVzZXQgdHJhbnNwb3J0IHN0YXRlIGZvciBuZXh0IGRpc2NvdmVyeSAqLwotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9BVVRPOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIHN0YXJ0aW5nIG5hbWUgZGlzY292ZXJ5IGZhaWxlZCAqLwotICAgIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lID0gdHJ1ZTsKLSAgfQotCi0gIC8qIFJlc2V0IHRyYW5zcG9ydCBzdGF0ZSBmb3IgbmV4dCBkaXNjb3ZlcnkgKi8KLSAgYnRhX2RtX3NlYXJjaF9jYi50cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfQVVUTzsKLQotICAvKiBpZiBhcHBsaWNhdGlvbiB3YW50cyB0byBkaXNjb3ZlciBzZXJ2aWNlICovCi0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VzKSB7Ci0gICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KLSAgICBidGFfZG1fc2VhcmNoX2NiLnNlcnZpY2VfaW5kZXggPSAwOwotICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfZm91bmQgPSAwOwotICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfdG9fc2VhcmNoID0gYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlczsKLQotICAgIC8qIGlmIHNlYWNoaW5nIHdpdGggRUlSIGlzIG5vdCBjb21wbGV0ZWQgKi8KLSAgICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc190b19zZWFyY2gpIHsKLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgY29ubmVjdGlvbiBhbHJlYWR5IGV4aXN0cyB0byB0aGUgZGV2aWNlCi0gICAgICAgICBpZiBjb25uZWN0aW9uIGV4aXN0cywgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBBQ0wKLSAgICAgICAgIGxpbmsgdG8gZ28gZG93biB0byBzdGFydCBzZWFyY2ggb24gbmV4dCBkZXZpY2UgKi8KLSAgICAgIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgICAgICBpZiAoQlRNX0lzQWNsQ29ubmVjdGlvblVwKGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0JSX0VEUikpCi0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi53YWl0X2Rpc2MgPSBmYWxzZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iud2FpdF9kaXNjID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiJXMgcF9idG1faW5xX2luZm8gMHgleCByZXN1bHRzLmRldmljZV90eXBlIDB4JXggIgotICAgICAgICAgICAgInNlcnZpY2VzX3RvX3NlYXJjaCAweCV4IiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBidGFfZG1fc2VhcmNoX2NiLnBfYnRtX2lucV9pbmZvLAotICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5wX2J0bV9pbnFfaW5mby0+cmVzdWx0cy5kZXZpY2VfdHlwZSwKLSAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfdG9fc2VhcmNoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfdG9fc2VhcmNoICYgQlRBX0JMRV9TRVJWSUNFX01BU0spIHsKLSAgICAgICAgICAvLyBzZXQgdGhlIHJhdyBkYXRhIGJ1ZmZlciBoZXJlCi0gICAgICAgICAgbWVtc2V0KGdfZGlzY19yYXdfZGF0YV9idWYsIDAsIHNpemVvZihnX2Rpc2NfcmF3X2RhdGFfYnVmKSk7Ci0gICAgICAgICAgLyogc3RhcnQgR0FUVCBmb3Igc2VydmljZSBkaXNjb3ZlcnkgKi8KLSAgICAgICAgICBidG1fZG1fc3RhcnRfZ2F0dF9kaXNjb3ZlcnkoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfZG1fc2VhcmNoX2NiLnNkcF9yZXN1bHRzID0gZmFsc2U7Ci0gICAgICAgIGJ0YV9kbV9maW5kX3NlcnZpY2VzKGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogbmFtZSBkaXNjb3ZlcnkgYW5kIHNlcnZpY2UgZGlzY292ZXJ5IGFyZSBkb25lIGZvciB0aGlzIGRldmljZSAqLwotICB0QlRBX0RNX01TRyogcF9tc2cgPSAodEJUQV9ETV9NU0cqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fTVNHKSk7Ci0gIHBfbXNnLT5oZHIuZXZlbnQgPSBCVEFfRE1fRElTQ09WRVJZX1JFU1VMVF9FVlQ7Ci0gIC8qIGluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlICovCi0gIG1lbXNldCgmKHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQpLCAwLCBzaXplb2YodEJUQV9ETV9ESVNDX1JFUykpOwotICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnJlc3VsdCA9IEJUQV9TVUNDRVNTOwotICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnNlcnZpY2VzID0gYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc19mb3VuZDsKLSAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9hZGRyID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKLSAgc3RybGNweSgoY2hhciopcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9uYW1lLAotICAgICAgICAgIChjaGFyKilidGFfZG1fc2VhcmNoX2NiLnBlZXJfbmFtZSwgQkRfTkFNRV9MRU4gKyAxKTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3NkcF9jYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgZnJvbSBzZHAgd2l0aCBkaXNjb3Zlcnkgc3RhdHVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9zZHBfY2FsbGJhY2sodFNEUF9TVEFUVVMgc2RwX3N0YXR1cykgewotICB0QlRBX0RNX1NEUF9SRVNVTFQqIHBfbXNnID0KLSAgICAgICh0QlRBX0RNX1NEUF9SRVNVTFQqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fU0RQX1JFU1VMVCkpOwotCi0gIHBfbXNnLT5oZHIuZXZlbnQgPSBCVEFfRE1fU0RQX1JFU1VMVF9FVlQ7Ci0gIHBfbXNnLT5zZHBfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHNkcF9zdGF0dXMpOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1faW5xX3Jlc3VsdHNfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIElucXVpcnkgcmVzdWx0cyBjYWxsYmFjayBmcm9tIEJUTQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1faW5xX3Jlc3VsdHNfY2IodEJUTV9JTlFfUkVTVUxUUyogcF9pbnEsIGNvbnN0IHVpbnQ4X3QqIHBfZWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVpcl9sZW4pIHsKLSAgdEJUQV9ETV9TRUFSQ0ggcmVzdWx0OwotICB0QlRNX0lOUV9JTkZPKiBwX2lucV9pbmZvOwotICB1aW50MTZfdCBzZXJ2aWNlX2NsYXNzOwotCi0gIHJlc3VsdC5pbnFfcmVzLmJkX2FkZHIgPSBwX2lucS0+cmVtb3RlX2JkX2FkZHI7Ci0gIG1lbWNweShyZXN1bHQuaW5xX3Jlcy5kZXZfY2xhc3MsIHBfaW5xLT5kZXZfY2xhc3MsIERFVl9DTEFTU19MRU4pOwotICBCVE1fQ09EX1NFUlZJQ0VfQ0xBU1Moc2VydmljZV9jbGFzcywgcF9pbnEtPmRldl9jbGFzcyk7Ci0gIHJlc3VsdC5pbnFfcmVzLmlzX2xpbWl0ZWQgPQotICAgICAgKHNlcnZpY2VfY2xhc3MgJiBCVE1fQ09EX1NFUlZJQ0VfTE1URF9ESVNDT1ZFUikgPyB0cnVlIDogZmFsc2U7Ci0gIHJlc3VsdC5pbnFfcmVzLnJzc2kgPSBwX2lucS0+cnNzaTsKLQotICByZXN1bHQuaW5xX3Jlcy5ibGVfYWRkcl90eXBlID0gcF9pbnEtPmJsZV9hZGRyX3R5cGU7Ci0gIHJlc3VsdC5pbnFfcmVzLmlucV9yZXN1bHRfdHlwZSA9IHBfaW5xLT5pbnFfcmVzdWx0X3R5cGU7Ci0gIHJlc3VsdC5pbnFfcmVzLmRldmljZV90eXBlID0gcF9pbnEtPmRldmljZV90eXBlOwotICByZXN1bHQuaW5xX3Jlcy5mbGFnID0gcF9pbnEtPmZsYWc7Ci0gIHJlc3VsdC5pbnFfcmVzLmluY2x1ZGVfcnNpID0gcF9pbnEtPmluY2x1ZGVfcnNpOwotCi0gIC8qIGFwcGxpY2F0aW9uIHdpbGwgcGFyc2UgRUlSIHRvIGZpbmQgb3V0IHJlbW90ZSBkZXZpY2UgbmFtZSAqLwotICByZXN1bHQuaW5xX3Jlcy5wX2VpciA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHBfZWlyKTsKLSAgcmVzdWx0LmlucV9yZXMuZWlyX2xlbiA9IGVpcl9sZW47Ci0KLSAgcF9pbnFfaW5mbyA9IEJUTV9JbnFEYlJlYWQocF9pbnEtPnJlbW90ZV9iZF9hZGRyKTsKLSAgaWYgKHBfaW5xX2luZm8gIT0gTlVMTCkgewotICAgIC8qIGluaXRpYWxpemUgcmVtdF9uYW1lX25vdF9yZXF1aXJlZCB0byBmYWxzZSBzbyB0aGF0IHdlIGdldCB0aGUgbmFtZSBieQotICAgICAqIGRlZmF1bHQgKi8KLSAgICByZXN1bHQuaW5xX3Jlcy5yZW10X25hbWVfbm90X3JlcXVpcmVkID0gZmFsc2U7Ci0gIH0KLQotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5wX3NlYXJjaF9jYmFjaykKLSAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2VhcmNoX2NiYWNrKEJUQV9ETV9JTlFfUkVTX0VWVCwgJnJlc3VsdCk7Ci0KLSAgaWYgKHBfaW5xX2luZm8pIHsKLSAgICAvKiBhcHBsaWNhdGlvbiBpbmRpY2F0ZXMgaWYgaXQga25vd3MgdGhlIHJlbW90ZSBuYW1lLCBpbnNpZGUgdGhlIGNhbGxiYWNrCi0gICAgIGNvcHkgdGhhdCB0byB0aGUgaW5xdWlyeSBkYXRhIGJhc2UqLwotICAgIGlmIChyZXN1bHQuaW5xX3Jlcy5yZW10X25hbWVfbm90X3JlcXVpcmVkKQotICAgICAgcF9pbnFfaW5mby0+YXBwbF9rbm93c19yZW1fbmFtZSA9IHRydWU7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9pbnFfY21wbF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5xdWlyeSBjb21wbGV0ZSBjYWxsYmFjayBmcm9tIEJUTQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1faW5xX2NtcGxfY2Iodm9pZCogcF9yZXN1bHQpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRhX2RtX2lucV9jbXBsKCgodEJUTV9JTlFVSVJZX0NNUEwqKXBfcmVzdWx0KS0+bnVtX3Jlc3ApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3NlcnZpY2Vfc2VhcmNoX3JlbW5hbWVfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbW90ZSBuYW1lIGNhbGwgYmFjayBmcm9tIEJUTSBkdXJpbmcgc2VydmljZSBkaXNjb3ZlcnkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3NlcnZpY2Vfc2VhcmNoX3JlbW5hbWVfY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIERFVl9DTEFTUyBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSkgewotICB0QlRNX1JFTU9URV9ERVZfTkFNRSByZW1fbmFtZTsKLSAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1czsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBuYW1lPTwlcz4iLCBfX2Z1bmNfXywgYmRfbmFtZSk7Ci0KLSAgLyogaWYgdGhpcyBpcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvciAqLwotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkciA9PSBiZF9hZGRyKSB7Ci0gICAgcmVtX25hbWUubGVuZ3RoID0gc3RybGNweSgoY2hhciopcmVtX25hbWUucmVtb3RlX2JkX25hbWUsIChjaGFyKiliZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfTkFNRV9MRU4gKyAxKTsKLSAgICBpZiAocmVtX25hbWUubGVuZ3RoID4gQkRfTkFNRV9MRU4pIHsKLSAgICAgIHJlbV9uYW1lLmxlbmd0aCA9IEJEX05BTUVfTEVOOwotICAgIH0KLSAgICByZW1fbmFtZS5zdGF0dXMgPSBCVE1fU1VDQ0VTUzsKLQotICAgIGJ0YV9kbV9yZW1uYW1lX2NiYWNrKCZyZW1fbmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZ2V0IG5hbWUgb2YgZGV2aWNlICovCi0gICAgYnRtX3N0YXR1cyA9Ci0gICAgICAgIEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3JlbW5hbWVfY2JhY2ssIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgIGlmIChidG1fc3RhdHVzID09IEJUTV9CVVNZKSB7Ci0gICAgICAvKiB3YWl0IGZvciBuZXh0IGNoYW5jZShub3RpZmljYXRpb24gb2YgcmVtb3RlIG5hbWUgZGlzY292ZXJ5IGRvbmUpICovCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lIGlzIGJ1c3kiLCBfX2Z1bmNfXyk7Ci0gICAgfSBlbHNlIGlmIChidG1fc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgLyogaWYgZmFpbGVkIHRvIHN0YXJ0IGdldHRpbmcgcmVtb3RlIG5hbWUgdGhlbiBjb250aW51ZSAqLwotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lIHJldHVybnMgMHglMDJYIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnRtX3N0YXR1cyk7Ci0KLSAgICAgIHJlbV9uYW1lLmxlbmd0aCA9IDA7Ci0gICAgICByZW1fbmFtZS5yZW1vdGVfYmRfbmFtZVswXSA9IDA7Ci0gICAgICByZW1fbmFtZS5zdGF0dXMgPSBidG1fc3RhdHVzOwotICAgICAgYnRhX2RtX3JlbW5hbWVfY2JhY2soJnJlbV9uYW1lKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9yZW1uYW1lX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdGUgbmFtZSBjb21wbGV0ZSBjYWxsIGJhY2sgZnJvbSBCVE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3JlbW5hbWVfY2JhY2sodm9pZCogcCkgewotICB0QlRNX1JFTU9URV9ERVZfTkFNRSogcF9yZW1vdGVfbmFtZSA9ICh0QlRNX1JFTU9URV9ERVZfTkFNRSopcDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2RtX3JlbW5hbWVfY2JhY2sgbGVuID0gJWQgbmFtZT08JXM+IiwKLSAgICAgICAgICAgICAgICAgICBwX3JlbW90ZV9uYW1lLT5sZW5ndGgsIHBfcmVtb3RlX25hbWUtPnJlbW90ZV9iZF9uYW1lKTsKLQotICAvKiByZW1vdGUgbmFtZSBkaXNjb3ZlcnkgaXMgZG9uZSBidXQgaXQgY291bGQgYmUgZmFpbGVkICovCi0gIGJ0YV9kbV9zZWFyY2hfY2IubmFtZV9kaXNjb3Zlcl9kb25lID0gdHJ1ZTsKLSAgc3RybGNweSgoY2hhciopYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWUsCi0gICAgICAgICAgKGNoYXIqKXBfcmVtb3RlX25hbWUtPnJlbW90ZV9iZF9uYW1lLCBCRF9OQU1FX0xFTiArIDEpOwotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0RlbGV0ZVJtdE5hbWVOb3RpZnlDYWxsYmFjaygKLSAgICAgICAgJmJ0YV9kbV9zZXJ2aWNlX3NlYXJjaF9yZW1uYW1lX2NiYWNrKTsKLSAgfSBlbHNlIHsKLSAgICBCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrKCZidGFfZG1fc2VydmljZV9zZWFyY2hfcmVtbmFtZV9jYmFjayk7Ci0gIH0KLQotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgR0FQX0JsZVJlYWRQZWVyUHJlZkNvbm5QYXJhbXMoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcik7Ci0gIH0KLQotICB0QlRBX0RNX1JFTV9OQU1FKiBwX21zZyA9Ci0gICAgICAodEJUQV9ETV9SRU1fTkFNRSopb3NpX21hbGxvYyhzaXplb2YodEJUQV9ETV9SRU1fTkFNRSkpOwotICBwX21zZy0+cmVzdWx0LmRpc2NfcmVzLmJkX2FkZHIgPSBidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyOwotICBzdHJsY3B5KChjaGFyKilwX21zZy0+cmVzdWx0LmRpc2NfcmVzLmJkX25hbWUsCi0gICAgICAgICAgKGNoYXIqKXBfcmVtb3RlX25hbWUtPnJlbW90ZV9iZF9uYW1lLCBCRF9OQU1FX0xFTiArIDEpOwotICBwX21zZy0+aGRyLmV2ZW50ID0gQlRBX0RNX1JFTVRfTkFNRV9FVlQ7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfbXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9waW5uYW1lX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsYmFjayByZXF1ZXN0aW5nIHBpbl9rZXkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3Bpbm5hbWVfY2JhY2sodm9pZCogcF9kYXRhKSB7Ci0gIHRCVE1fUkVNT1RFX0RFVl9OQU1FKiBwX3Jlc3VsdCA9ICh0QlRNX1JFTU9URV9ERVZfTkFNRSopcF9kYXRhOwotICB0QlRBX0RNX1NFQyBzZWNfZXZlbnQ7Ci0gIHVpbnQzMl90IGJ5dGVzX3RvX2NvcHk7Ci0gIHRCVEFfRE1fU0VDX0VWVCBldmVudCA9IGJ0YV9kbV9jYi5waW5fZXZ0OwotCi0gIGlmIChCVEFfRE1fU1BfQ0ZNX1JFUV9FVlQgPT0gZXZlbnQpIHsKLSAgICAvKiBSZXRyaWV2ZWQgc2F2ZWQgZGV2aWNlIGNsYXNzIGFuZCBiZF9hZGRyICovCi0gICAgc2VjX2V2ZW50LmNmbV9yZXEuYmRfYWRkciA9IGJ0YV9kbV9jYi5waW5fYmRfYWRkcjsKLSAgICBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1Moc2VjX2V2ZW50LmNmbV9yZXEuZGV2X2NsYXNzLCBidGFfZG1fY2IucGluX2Rldl9jbGFzcyk7Ci0KLSAgICBpZiAocF9yZXN1bHQgJiYgcF9yZXN1bHQtPnN0YXR1cyA9PSBCVE1fU1VDQ0VTUykgewotICAgICAgYnl0ZXNfdG9fY29weSA9Ci0gICAgICAgICAgKHBfcmVzdWx0LT5sZW5ndGggPCBCRF9OQU1FX0xFTikgPyBwX3Jlc3VsdC0+bGVuZ3RoIDogQkRfTkFNRV9MRU47Ci0gICAgICBtZW1jcHkoc2VjX2V2ZW50LmNmbV9yZXEuYmRfbmFtZSwgcF9yZXN1bHQtPnJlbW90ZV9iZF9uYW1lLAotICAgICAgICAgICAgIGJ5dGVzX3RvX2NvcHkpOwotICAgICAgc2VjX2V2ZW50LnBpbl9yZXEuYmRfbmFtZVtCRF9OQU1FX0xFTl0gPSAwOwotICAgIH0gZWxzZSAvKiBObyBuYW1lIGZvdW5kICovCi0gICAgICBzZWNfZXZlbnQuY2ZtX3JlcS5iZF9uYW1lWzBdID0gMDsKLQotICAgIHNlY19ldmVudC5rZXlfbm90aWYucGFzc2tleSA9Ci0gICAgICAgIGJ0YV9kbV9jYi5udW1fdmFsOyAvKiBnZXQgUElOIGNvZGUgbnVtZXJpYyBudW1iZXIgKi8KLQotICAgIC8qIDEgYWRkaXRpb25hbCBldmVudCBkYXRhIGZpZWxkcyBmb3IgdGhpcyBldmVudCAqLwotICAgIHNlY19ldmVudC5jZm1fcmVxLmp1c3Rfd29ya3MgPSBidGFfZG1fY2IuanVzdF93b3JrczsKLSAgICAvKiByZXRyaWV2ZSB0aGUgbG9jIGFuZCBybXQgY2FwcyAqLwotICAgIHNlY19ldmVudC5jZm1fcmVxLmxvY19pb19jYXBzID0gYnRhX2RtX2NiLmxvY19pb19jYXBzOwotICAgIHNlY19ldmVudC5jZm1fcmVxLnJtdF9pb19jYXBzID0gYnRhX2RtX2NiLnJtdF9pb19jYXBzOwotICAgIHNlY19ldmVudC5jZm1fcmVxLmxvY19hdXRoX3JlcSA9IGJ0YV9kbV9jYi5sb2NfYXV0aF9yZXE7Ci0gICAgc2VjX2V2ZW50LmNmbV9yZXEucm10X2F1dGhfcmVxID0gYnRhX2RtX2NiLnJtdF9hdXRoX3JlcTsKLQotICB9IGVsc2UgewotICAgIC8qIFJldHJpZXZlZCBzYXZlZCBkZXZpY2UgY2xhc3MgYW5kIGJkX2FkZHIgKi8KLSAgICBzZWNfZXZlbnQucGluX3JlcS5iZF9hZGRyID0gYnRhX2RtX2NiLnBpbl9iZF9hZGRyOwotICAgIEJUQV9DT1BZX0RFVklDRV9DTEFTUyhzZWNfZXZlbnQucGluX3JlcS5kZXZfY2xhc3MsIGJ0YV9kbV9jYi5waW5fZGV2X2NsYXNzKTsKLQotICAgIGlmIChwX3Jlc3VsdCAmJiBwX3Jlc3VsdC0+c3RhdHVzID09IEJUTV9TVUNDRVNTKSB7Ci0gICAgICBieXRlc190b19jb3B5ID0gKHBfcmVzdWx0LT5sZW5ndGggPCBCRF9OQU1FX0xFTikgPyBwX3Jlc3VsdC0+bGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoQkRfTkFNRV9MRU4gLSAxKTsKLSAgICAgIG1lbWNweShzZWNfZXZlbnQucGluX3JlcS5iZF9uYW1lLCBwX3Jlc3VsdC0+cmVtb3RlX2JkX25hbWUsCi0gICAgICAgICAgICAgYnl0ZXNfdG9fY29weSk7Ci0gICAgICBzZWNfZXZlbnQucGluX3JlcS5iZF9uYW1lW0JEX05BTUVfTEVOXSA9IDA7Ci0gICAgfSBlbHNlIC8qIE5vIG5hbWUgZm91bmQgKi8KLSAgICAgIHNlY19ldmVudC5waW5fcmVxLmJkX25hbWVbMF0gPSAwOwotCi0gICAgZXZlbnQgPSBidGFfZG1fY2IucGluX2V2dDsKLSAgICBzZWNfZXZlbnQua2V5X25vdGlmLnBhc3NrZXkgPQotICAgICAgICBidGFfZG1fY2IubnVtX3ZhbDsgLyogZ2V0IFBJTiBjb2RlIG51bWVyaWMgbnVtYmVyICovCi0gIH0KLQotICBpZiAoYnRhX2RtX2NiLnBfc2VjX2NiYWNrKSBidGFfZG1fY2IucF9zZWNfY2JhY2soZXZlbnQsICZzZWNfZXZlbnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3Bpbl9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgcmVxdWVzdGluZyBwaW5fa2V5Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGJ0YV9kbV9waW5fY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkRfTkFNRSBiZF9uYW1lLCBib29sIG1pbl8xNl9kaWdpdCkgewotICBpZiAoIWJ0YV9kbV9jYi5wX3NlY19jYmFjaykgcmV0dXJuIEJUTV9OT1RfQVVUSE9SSVpFRDsKLQotICAvKiBJZiB0aGUgZGV2aWNlIG5hbWUgaXMgbm90IGtub3duLCBzYXZlIGJkYWRkciBhbmQgZGV2Y2xhc3MgYW5kIGluaXRpYXRlIGEKLSAgICogbmFtZSByZXF1ZXN0ICovCi0gIGlmIChiZF9uYW1lWzBdID09IDApIHsKLSAgICBidGFfZG1fY2IucGluX2V2dCA9IEJUQV9ETV9QSU5fUkVRX0VWVDsKLSAgICBidGFfZG1fY2IucGluX2JkX2FkZHIgPSBiZF9hZGRyOwotICAgIEJUQV9DT1BZX0RFVklDRV9DTEFTUyhidGFfZG1fY2IucGluX2Rldl9jbGFzcywgZGV2X2NsYXNzKTsKLSAgICBpZiAoKEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShiZF9hZGRyLCBidGFfZG1fcGlubmFtZV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9UUkFOU1BPUlRfQlJfRURSKSkgPT0gQlRNX0NNRF9TVEFSVEVEKQotICAgICAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLQotICAgIEFQUExfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIiBidGFfZG1fcGluX2NiYWNrKCkgLT4gRmFpbGVkIHRvIHN0YXJ0IFJlbW90ZSBOYW1lIFJlcXVlc3QgICIpOwotICB9Ci0KLSAgdEJUQV9ETV9TRUMgc2VjX2V2ZW50ID0gey5waW5fcmVxID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iZF9hZGRyID0gYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH19OwotICBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1Moc2VjX2V2ZW50LnBpbl9yZXEuZGV2X2NsYXNzLCBkZXZfY2xhc3MpOwotICBzdHJsY3B5KChjaGFyKilzZWNfZXZlbnQucGluX3JlcS5iZF9uYW1lLCAoY2hhciopYmRfbmFtZSwgQkRfTkFNRV9MRU4gKyAxKTsKLSAgc2VjX2V2ZW50LnBpbl9yZXEubWluXzE2X2RpZ2l0ID0gbWluXzE2X2RpZ2l0OwotCi0gIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fUElOX1JFUV9FVlQsICZzZWNfZXZlbnQpOwotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX25ld19saW5rX2tleV9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgZnJvbSBCVE0gdG8gbm90aWZ5IG5ldyBsaW5rIGtleQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidGFfZG1fbmV3X2xpbmtfa2V5X2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSwgY29uc3QgTGlua0tleSYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV90eXBlKSB7Ci0gIHRCVEFfRE1fU0VDIHNlY19ldmVudDsKLSAgdEJUQV9ETV9BVVRIX0NNUEwqIHBfYXV0aF9jbXBsOwotICB1aW50OF90IGV2ZW50OwotCi0gIG1lbXNldCgmc2VjX2V2ZW50LCAwLCBzaXplb2YodEJUQV9ETV9TRUMpKTsKLQotICBldmVudCA9IEJUQV9ETV9BVVRIX0NNUExfRVZUOwotICBwX2F1dGhfY21wbCA9ICZzZWNfZXZlbnQuYXV0aF9jbXBsOwotCi0gIHBfYXV0aF9jbXBsLT5iZF9hZGRyID0gYmRfYWRkcjsKLQotICBtZW1jcHkocF9hdXRoX2NtcGwtPmJkX25hbWUsIGJkX25hbWUsIEJEX05BTUVfTEVOKTsKLSAgcF9hdXRoX2NtcGwtPmJkX25hbWVbQkRfTkFNRV9MRU5dID0gMDsKLSAgcF9hdXRoX2NtcGwtPmtleV9wcmVzZW50ID0gdHJ1ZTsKLSAgcF9hdXRoX2NtcGwtPmtleV90eXBlID0ga2V5X3R5cGU7Ci0gIHBfYXV0aF9jbXBsLT5zdWNjZXNzID0gdHJ1ZTsKLSAgcF9hdXRoX2NtcGwtPmtleSA9IGtleTsKLSAgc2VjX2V2ZW50LmF1dGhfY21wbC5mYWlsX3JlYXNvbiA9IEhDSV9TVUNDRVNTOwotCi0gIC8vIFJlcG9ydCB0aGUgQlIgbGluayBrZXkgYmFzZWQgb24gdGhlIEJSL0VEUiBhZGRyZXNzIGFuZCB0eXBlCi0gIEJUTV9SZWFkRGV2SW5mbyhiZF9hZGRyLCAmc2VjX2V2ZW50LmF1dGhfY21wbC5kZXZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICZzZWNfZXZlbnQuYXV0aF9jbXBsLmFkZHJfdHlwZSk7Ci0gIGlmIChidGFfZG1fY2IucF9zZWNfY2JhY2spIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhldmVudCwgJnNlY19ldmVudCk7Ci0KLSAgLy8gU2V0dGluZyByZW1vdmVfZGV2X3BlbmRpbmcgZmxhZyB0byBmYWxzZSwgd2hlcmUgaXQgd2lsbCBhdm9pZCBkZWxldGluZwotICAvLyB0aGUKLSAgLy8gc2VjdXJpdHkgZGV2aWNlIHJlY29yZCB3aGVuIHRoZSBBQ0wgY29ubmVjdGlvbiBsaW5rIGdvZXMgZG93biBpbiBjYXNlIG9mCi0gIC8vIHJlY29ubmVjdGlvbi4KLSAgaWYgKGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCkKLSAgICBidGFfZG1fcmVzZXRfc2VjX2Rldl9wZW5kaW5nKHBfYXV0aF9jbXBsLT5iZF9hZGRyKTsKLQotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBdXRoZW50aWNhdGlvbiBjb21wbGV0ZSBjYWxsYmFjayBmcm9tIEJUTQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fYXV0aGVudGljYXRpb25fY29tcGxldGVfY2JhY2soCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgVU5VU0VEX0FUVFIgREVWX0NMQVNTIGRldl9jbGFzcywgQkRfTkFNRSBiZF9uYW1lLAotICAgIHRIQ0lfUkVBU09OIHJlYXNvbikgewotICBpZiAocmVhc29uICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgaWYgKGJ0YV9kbV9jYi5wX3NlY19jYmFjaykgewotICAgICAgLy8gQnVpbGQgb3V0IHRoZSBzZWN1cml0eSBldmVudCBkYXRhIHN0cnVjdHVyZQotICAgICAgdEJUQV9ETV9TRUMgc2VjX2V2ZW50ID0gewotICAgICAgICAgIC5hdXRoX2NtcGwgPQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAuYmRfYWRkciA9IGJkX2FkZHIsCi0gICAgICAgICAgICAgIH0sCi0gICAgICB9OwotICAgICAgbWVtY3B5KHNlY19ldmVudC5hdXRoX2NtcGwuYmRfbmFtZSwgYmRfbmFtZSwgQkRfTkFNRV9MRU4pOwotICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5iZF9uYW1lW0JEX05BTUVfTEVOXSA9IDA7Ci0KLSAgICAgIC8vIFJlcG9ydCB0aGUgQlIgbGluayBrZXkgYmFzZWQgb24gdGhlIEJSL0VEUiBhZGRyZXNzIGFuZCB0eXBlCi0gICAgICBCVE1fUmVhZERldkluZm8oYmRfYWRkciwgJnNlY19ldmVudC5hdXRoX2NtcGwuZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgJnNlY19ldmVudC5hdXRoX2NtcGwuYWRkcl90eXBlKTsKLSAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuZmFpbF9yZWFzb24gPSByZWFzb247Ci0KLSAgICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fQVVUSF9DTVBMX0VWVCwgJnNlY19ldmVudCk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChyZWFzb24pIHsKLSAgICAgIGNhc2UgSENJX0VSUl9BVVRIX0ZBSUxVUkU6Ci0gICAgICBjYXNlIEhDSV9FUlJfS0VZX01JU1NJTkc6Ci0gICAgICBjYXNlIEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFk6Ci0gICAgICBjYXNlIEhDSV9FUlJfRU5DUllfTU9ERV9OT1RfQUNDRVBUQUJMRToKLSAgICAgICAgTE9HX1dBUk4oCi0gICAgICAgICAgICAiRGVsZXRpbmcgZGV2aWNlIHJlY29yZCBhcyBhdXRoZW50aWNhdGlvbiBmYWlsZWQgZW50cnk6JXMgIgotICAgICAgICAgICAgInJlYXNvbjolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIGhjaV9yZWFzb25fY29kZV90ZXh0KHJlYXNvbikuY19zdHIoKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9zcF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc2ltcGxlIHBhaXJpbmcgY2FsbGJhY2sgZnJvbSBCVE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVE1fU1RBVFVTIGJ0YV9kbV9zcF9jYmFjayh0QlRNX1NQX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TUF9FVlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9DTURfU1RBUlRFRDsKLSAgdEJUQV9ETV9TRUMgc2VjX2V2ZW50OwotICB0QlRBX0RNX1NFQ19FVlQgcGluX2V2dCA9IEJUQV9ETV9TUF9LRVlfTk9USUZfRVZUOwotCi0gIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9kbV9zcF9jYmFjazogJWQiLCBldmVudCk7Ci0gIGlmICghYnRhX2RtX2NiLnBfc2VjX2NiYWNrKSByZXR1cm4gQlRNX05PVF9BVVRIT1JJWkVEOwotCi0gIGJvb2wgc3Bfcm10X3Jlc3VsdCA9IGZhbHNlOwotICAvKiBUT0RPX1NQICovCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUTV9TUF9JT19SRVFfRVZUOgotICAgICAgaWYgKGJ0bV9sb2NhbF9pb19jYXBzICE9IEJUTV9JT19DQVBfTk9ORSkgewotICAgICAgICAvKiB0cmFuc2xhdGUgYXV0aF9yZXEgKi8KLSAgICAgICAgYnRpZl9kbV9zZXRfb29iX2Zvcl9pb19yZXEoJnBfZGF0YS0+aW9fcmVxLm9vYl9kYXRhKTsKLSAgICAgICAgYnRpZl9kbV9wcm9jX2lvX3JlcSgmcF9kYXRhLT5pb19yZXEuYXV0aF9yZXEsIHBfZGF0YS0+aW9fcmVxLmlzX29yaWcpOwotICAgICAgfQotICAgICAgQVBQTF9UUkFDRV9FVkVOVCgiaW8gbWl0bTogJWQgb29iX2RhdGE6JWQiLCBwX2RhdGEtPmlvX3JlcS5hdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5pb19yZXEub29iX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fU1BfSU9fUlNQX0VWVDoKLSAgICAgIGlmIChidG1fbG9jYWxfaW9fY2FwcyAhPSBCVE1fSU9fQ0FQX05PTkUpIHsKLSAgICAgICAgYnRpZl9kbV9wcm9jX2lvX3JzcChwX2RhdGEtPmlvX3JzcC5iZF9hZGRyLCBwX2RhdGEtPmlvX3JzcC5pb19jYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5pb19yc3Aub29iX2RhdGEsIHBfZGF0YS0+aW9fcnNwLmF1dGhfcmVxKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fU1BfQ0ZNX1JFUV9FVlQ6Ci0gICAgICBwaW5fZXZ0ID0gQlRBX0RNX1NQX0NGTV9SRVFfRVZUOwotICAgICAgYnRhX2RtX2NiLmp1c3Rfd29ya3MgPSBzZWNfZXZlbnQuY2ZtX3JlcS5qdXN0X3dvcmtzID0KLSAgICAgICAgICBwX2RhdGEtPmNmbV9yZXEuanVzdF93b3JrczsKLSAgICAgIHNlY19ldmVudC5jZm1fcmVxLmxvY19hdXRoX3JlcSA9IHBfZGF0YS0+Y2ZtX3JlcS5sb2NfYXV0aF9yZXE7Ci0gICAgICBzZWNfZXZlbnQuY2ZtX3JlcS5ybXRfYXV0aF9yZXEgPSBwX2RhdGEtPmNmbV9yZXEucm10X2F1dGhfcmVxOwotICAgICAgc2VjX2V2ZW50LmNmbV9yZXEubG9jX2lvX2NhcHMgPSBwX2RhdGEtPmNmbV9yZXEubG9jX2lvX2NhcHM7Ci0gICAgICBzZWNfZXZlbnQuY2ZtX3JlcS5ybXRfaW9fY2FwcyA9IHBfZGF0YS0+Y2ZtX3JlcS5ybXRfaW9fY2FwczsKLQotICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgIC8qIFBhc3NrZXkgZW50cnkgbW9kZSwgbW9iaWxlIGRldmljZSB3aXRoIG91dHB1dCBjYXBhYmlsaXR5IGlzIHZlcnkKLSAgICAgICAgdW5saWtlbHkgdG8gcmVjZWl2ZSBrZXkgcmVxdWVzdCwgc28gc2tpcCB0aGlzIGV2ZW50ICovCi0gICAgLypjYXNlIEJUTV9TUF9LRVlfUkVRX0VWVDogKi8KLSAgICBjYXNlIEJUTV9TUF9LRVlfTk9USUZfRVZUOgotICAgICAgaWYgKGJ0bV9sb2NhbF9pb19jYXBzID09IEJUTV9JT19DQVBfTk9ORSAmJgotICAgICAgICAgIEJUTV9TUF9LRVlfTk9USUZfRVZUID09IGV2ZW50KSB7Ci0gICAgICAgIHN0YXR1cyA9IEJUTV9OT1RfQVVUSE9SSVpFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGJ0YV9kbV9jYi5udW1fdmFsID0gc2VjX2V2ZW50LmtleV9ub3RpZi5wYXNza2V5ID0KLSAgICAgICAgICBwX2RhdGEtPmtleV9ub3RpZi5wYXNza2V5OwotCi0gICAgICBpZiAoQlRNX1NQX0NGTV9SRVFfRVZUID09IGV2ZW50KSB7Ci0gICAgICAgIC8qIER1ZSB0byB0aGUgc3dpdGNoIGNhc2UgZmFsbGluZyB0aHJvdWdoIGJlbG93IHRvIEJUTV9TUF9LRVlfTk9USUZfRVZULAotICAgICAgICAgICBjYWxsIHJlbW90ZSBuYW1lIHJlcXVlc3QgdXNpbmcgdmFsdWVzIGZyb20gY2ZtX3JlcSAqLwotICAgICAgICBpZiAocF9kYXRhLT5jZm1fcmVxLmJkX25hbWVbMF0gPT0gMCkgewotICAgICAgICAgIGJ0YV9kbV9jYi5waW5fZXZ0ID0gcGluX2V2dDsKLSAgICAgICAgICBidGFfZG1fY2IucGluX2JkX2FkZHIgPSBwX2RhdGEtPmNmbV9yZXEuYmRfYWRkcjsKLSAgICAgICAgICBidGFfZG1fY2Iucm10X2lvX2NhcHMgPSBzZWNfZXZlbnQuY2ZtX3JlcS5ybXRfaW9fY2FwczsKLSAgICAgICAgICBidGFfZG1fY2IubG9jX2lvX2NhcHMgPSBzZWNfZXZlbnQuY2ZtX3JlcS5sb2NfaW9fY2FwczsKLSAgICAgICAgICBidGFfZG1fY2Iucm10X2F1dGhfcmVxID0gc2VjX2V2ZW50LmNmbV9yZXEucm10X2F1dGhfcmVxOwotICAgICAgICAgIGJ0YV9kbV9jYi5sb2NfYXV0aF9yZXEgPSBzZWNfZXZlbnQuY2ZtX3JlcS5sb2NfYXV0aF9yZXE7Ci0KLSAgICAgICAgICBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1MoYnRhX2RtX2NiLnBpbl9kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+Y2ZtX3JlcS5kZXZfY2xhc3MpOwotICAgICAgICAgIGlmICgoQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lKAotICAgICAgICAgICAgICAgICAgcF9kYXRhLT5jZm1fcmVxLmJkX2FkZHIsIGJ0YV9kbV9waW5uYW1lX2NiYWNrLAotICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0JSX0VEUikpID09IEJUTV9DTURfU1RBUlRFRCkKLSAgICAgICAgICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiIGJ0YV9kbV9zcF9jYmFjaygpIC0+IEZhaWxlZCB0byBzdGFydCBSZW1vdGUgTmFtZSBSZXF1ZXN0ICAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBEdWUgdG8gdGhlIHN3aXRjaCBjYXNlIGZhbGxpbmcgdGhyb3VnaCBiZWxvdyB0bwotICAgICAgICAgICAgIEJUTV9TUF9LRVlfTk9USUZfRVZULAotICAgICAgICAgICAgIGNvcHkgdGhlc2UgdmFsdWVzIGludG8ga2V5X25vdGlmIGZyb20gY2ZtX3JlcSAqLwotICAgICAgICAgIHNlY19ldmVudC5rZXlfbm90aWYuYmRfYWRkciA9IHBfZGF0YS0+Y2ZtX3JlcS5iZF9hZGRyOwotICAgICAgICAgIEJUQV9DT1BZX0RFVklDRV9DTEFTUyhzZWNfZXZlbnQua2V5X25vdGlmLmRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5jZm1fcmVxLmRldl9jbGFzcyk7Ci0gICAgICAgICAgc3RybGNweSgoY2hhciopc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgKGNoYXIqKXBfZGF0YS0+Y2ZtX3JlcS5iZF9uYW1lLCBCRF9OQU1FX0xFTiArIDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChCVE1fU1BfS0VZX05PVElGX0VWVCA9PSBldmVudCkgewotICAgICAgICAvKiBJZiB0aGUgZGV2aWNlIG5hbWUgaXMgbm90IGtub3duLCBzYXZlIGJkYWRkciBhbmQgZGV2Y2xhc3MKLSAgICAgICAgICAgYW5kIGluaXRpYXRlIGEgbmFtZSByZXF1ZXN0IHdpdGggdmFsdWVzIGZyb20ga2V5X25vdGlmICovCi0gICAgICAgIGlmIChwX2RhdGEtPmtleV9ub3RpZi5iZF9uYW1lWzBdID09IDApIHsKLSAgICAgICAgICBidGFfZG1fY2IucGluX2V2dCA9IHBpbl9ldnQ7Ci0gICAgICAgICAgYnRhX2RtX2NiLnBpbl9iZF9hZGRyID0gcF9kYXRhLT5rZXlfbm90aWYuYmRfYWRkcjsKLSAgICAgICAgICBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1MoYnRhX2RtX2NiLnBpbl9kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+a2V5X25vdGlmLmRldl9jbGFzcyk7Ci0gICAgICAgICAgaWYgKChCVE1fUmVhZFJlbW90ZURldmljZU5hbWUoCi0gICAgICAgICAgICAgICAgICBwX2RhdGEtPmtleV9ub3RpZi5iZF9hZGRyLCBidGFfZG1fcGlubmFtZV9jYmFjaywKLSAgICAgICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9CUl9FRFIpKSA9PSBCVE1fQ01EX1NUQVJURUQpCi0gICAgICAgICAgICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIiBidGFfZG1fc3BfY2JhY2soKSAtPiBGYWlsZWQgdG8gc3RhcnQgUmVtb3RlIE5hbWUgUmVxdWVzdCAgIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9hZGRyID0gcF9kYXRhLT5rZXlfbm90aWYuYmRfYWRkcjsKLSAgICAgICAgICBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1Moc2VjX2V2ZW50LmtleV9ub3RpZi5kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+a2V5X25vdGlmLmRldl9jbGFzcyk7Ci0gICAgICAgICAgc3RybGNweSgoY2hhciopc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgKGNoYXIqKXBfZGF0YS0+a2V5X25vdGlmLmJkX25hbWUsIEJEX05BTUVfTEVOICsgMSk7Ci0gICAgICAgICAgc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9uYW1lW0JEX05BTUVfTEVOXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKHBpbl9ldnQsICZzZWNfZXZlbnQpOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1NQX0xPQ19PT0JfRVZUOgotI2lmZGVmIEJUSUZfRE1fT09CX1RFU1QKLSAgICAgIGJ0aWZfZG1fcHJvY19sb2Nfb29iKEJUX1RSQU5TUE9SVF9CUl9FRFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbCkocF9kYXRhLT5sb2Nfb29iLnN0YXR1cyA9PSBCVE1fU1VDQ0VTUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmxvY19vb2IuYywgcF9kYXRhLT5sb2Nfb29iLnIpOwotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1NQX1JNVF9PT0JfRVZUOiB7Ci0gICAgICBPY3RldDE2IGM7Ci0gICAgICBPY3RldDE2IHI7Ci0gICAgICBzcF9ybXRfcmVzdWx0ID0gZmFsc2U7Ci0jaWZkZWYgQlRJRl9ETV9PT0JfVEVTVAotICAgICAgc3Bfcm10X3Jlc3VsdCA9IGJ0aWZfZG1fcHJvY19ybXRfb29iKHBfZGF0YS0+cm10X29vYi5iZF9hZGRyLCAmYywgJnIpOwotI2VuZGlmCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJidGFfZG1fY2lfcm10X29vYjogcmVzdWx0PSVkIiwgc3Bfcm10X3Jlc3VsdCk7Ci0gICAgICBidGFfZG1fY2lfcm10X29vYihzcF9ybXRfcmVzdWx0LCBwX2RhdGEtPnJtdF9vb2IuYmRfYWRkciwgYywgcik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3RhdHVzID0gQlRNX05PVF9BVVRIT1JJWkVEOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgQVBQTF9UUkFDRV9FVkVOVCgiZG0gc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fbG9jYWxfbmFtZV9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgZnJvbSBidG0gYWZ0ZXIgbG9jYWwgbmFtZSBpcyByZWFkCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fbG9jYWxfbmFtZV9jYmFjayhVTlVTRURfQVRUUiB2b2lkKiBwX25hbWUpIHsKLSAgQlRJRl9kbV9lbmFibGUoKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX3JvbGVfY2hhbmdlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRIQ0lfUk9MRSBuZXdfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKSB7Ci0gIHRCVEFfRE1fUEVFUl9ERVZJQ0UqIHBfZGV2ID0gYnRhX2RtX2ZpbmRfcGVlcl9kZXZpY2UoYmRfYWRkcik7Ci0gIGlmICghcF9kZXYpIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIlVuYWJsZSB0byBmaW5kIGRldmljZSBmb3Igcm9sZSBjaGFuZ2UgcGVlcjolcyBuZXdfcm9sZTolcyAiCi0gICAgICAgICJoY2lfc3RhdHVzOiVzIiwKLSAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpLCBSb2xlVGV4dChuZXdfcm9sZSkuY19zdHIoKSwKLSAgICAgICAgaGNpX2Vycm9yX2NvZGVfdGV4dChoY2lfc3RhdHVzKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBMT0dfSU5GTygKLSAgICAgICJSb2xlIGNoYW5nZSBjYWxsYmFjayBwZWVyOiVzIGluZm86MHgleCBuZXdfcm9sZTolcyBkZXYgY291bnQ6JWQgIgotICAgICAgImhjaV9zdGF0dXM6JXMiLAotICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpLCBwX2Rldi0+SW5mbygpLCBSb2xlVGV4dChuZXdfcm9sZSkuY19zdHIoKSwKLSAgICAgIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCwgaGNpX2Vycm9yX2NvZGVfdGV4dChoY2lfc3RhdHVzKS5jX3N0cigpKTsKLQotICBpZiAocF9kZXYtPkluZm8oKSAmIEJUQV9ETV9ESV9BVl9BQ1RJVkUpIHsKLSAgICBib29sIG5lZWRfcG9saWN5X2NoYW5nZSA9IGZhbHNlOwotCi0gICAgLyogdGhlcmUncyBBViBhY3Rpdml0eSBvbiB0aGlzIGxpbmsgKi8KLSAgICBpZiAobmV3X3JvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCAmJiBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQgPiAxICYmCi0gICAgICAgIGhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIC8qIG1vcmUgdGhhbiBvbmUgY29ubmVjdGlvbnMgYW5kIHRoZSBBViBjb25uZWN0aW9uIGlzIHJvbGUgc3dpdGNoZWQKLSAgICAgICAqIHRvIHBlcmlwaGVyYWwKLSAgICAgICAqIHN3aXRjaCBpdCBiYWNrIHRvIGNlbnRyYWwgYW5kIHJlbW92ZSB0aGUgc3dpdGNoIHBvbGljeSAqLwotICAgICAgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwoYmRfYWRkcik7Ci0gICAgICBuZWVkX3BvbGljeV9jaGFuZ2UgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAocF9idGFfZG1fY2ZnLT5hdm9pZF9zY2F0dGVyICYmIChuZXdfcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSkgewotICAgICAgLyogaWYgdGhlIGxpbmsgdXBkYXRlZCB0byBiZSBjZW50cmFsIGluY2x1ZGUgQVYgYWN0aXZpdGllcywgcmVtb3ZlCi0gICAgICAgKiB0aGUgc3dpdGNoIHBvbGljeSAqLwotICAgICAgbmVlZF9wb2xpY3lfY2hhbmdlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobmVlZF9wb2xpY3lfY2hhbmdlKSB7Ci0gICAgICBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKHBfZGV2LT5wZWVyX2JkYWRkcik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIHRoZXJlJ3MgQVYgbm8gYWN0aXZpdHkgb24gdGhpcyBsaW5rIGFuZCByb2xlIHN3aXRjaCBoYXBwZW5lZAotICAgICAqIGNoZWNrIGlmIEFWIGlzIGFjdGl2ZQotICAgICAqIGlmIHNvLCBtYWtlIHN1cmUgdGhlIEFWIGxpbmsgaXMgY2VudHJhbCAqLwotICAgIGJ0YV9kbV9jaGVja19hdigpOwotICB9Ci0gIGJ0YV9zeXNfbm90aWZ5X3JvbGVfY2hnKGJkX2FkZHIsIG5ld19yb2xlLCBoY2lfc3RhdHVzKTsKLX0KLQotdm9pZCBCVEFfZG1fcmVwb3J0X3JvbGVfY2hhbmdlKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgdEhDSV9ST0xFIG5ld19yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoaGFuZGxlX3JvbGVfY2hhbmdlLCBiZF9hZGRyLCBuZXdfcm9sZSwgaGNpX3N0YXR1cykpOwotfQotCi12b2lkIGhhbmRsZV9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRBX0RNX1BFRVJfREVWSUNFKiBwX2RldiA9IGJ0YV9kbV9maW5kX3BlZXJfZGV2aWNlKGJkX2FkZHIpOwotICBpZiAoIXBfZGV2KSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGRldmljZSBwZWVyOiVzIiwgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NuaWZmX3N1YnJhdGluZygpICYmCi0gICAgICBhY2xfcGVlcl9zdXBwb3J0c19zbmlmZl9zdWJyYXRpbmcoYmRfYWRkcikpIHsKLSAgICBMT0dfREVCVUcoIkRldmljZSBzdXBwb3J0cyBzbmlmZiBzdWJyYXRpbmcgcGVlcjolcyIsCi0gICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSk7Ci0gICAgcF9kZXYtPmluZm8gPSBCVEFfRE1fRElfVVNFX1NTUjsKLSAgfSBlbHNlIHsKLSAgICBMT0dfREVCVUcoIkRldmljZSBkb2VzIE5PVCBzdXBwb3J0IHNuaWZmIHN1YnJhdGluZyBwZWVyOiVzIiwKLSAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgfQotfQotCi12b2lkIEJUQV9kbV9ub3RpZnlfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkcikgewotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoaGFuZGxlX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZSwgYmRfYWRkcikpOwotfQotCi1zdGF0aWMgdEJUQV9ETV9QRUVSX0RFVklDRSogYWxsb2NhdGVfZGV2aWNlX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspIHsKLSAgICBhdXRvIGRldmljZSA9ICZidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV07Ci0gICAgaWYgKGRldmljZS0+cGVlcl9iZGFkZHIgPT0gYmRfYWRkciAmJiBkZXZpY2UtPnRyYW5zcG9ydCA9PSB0cmFuc3BvcnQpIHsKLSAgICAgIHJldHVybiBkZXZpY2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCA8IEJUQV9ETV9OVU1fUEVFUl9ERVZJQ0UpIHsKLSAgICBhdXRvIGRldmljZSA9Ci0gICAgICAgICZidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50XTsKLSAgICBkZXZpY2UtPnBlZXJfYmRhZGRyID0gYmRfYWRkcjsKLSAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQrKzsKLSAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LmxlX2NvdW50Kys7Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2U7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgYnRhX2RtX2FjbF91cChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBhdXRvIGRldmljZSA9IGFsbG9jYXRlX2RldmljZV9mb3IoYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgcmVzb3VyY2VzIGZvciBuZXcgY29ubmVjdGlvbiIpOwotICAgIHJldHVybjsKLSAgfQotICBkZXZpY2UtPmNvbm5fc3RhdGUgPSBCVEFfRE1fQ09OTkVDVEVEOwotICBkZXZpY2UtPnByZWZfcm9sZSA9IEJUQV9BTllfUk9MRTsKLSAgZGV2aWNlLT5pbmZvID0gQlRBX0RNX0RJX05PTkU7Ci0gIGRldmljZS0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotCi0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfc25pZmZfc3VicmF0aW5nKCkgJiYKLSAgICAgIGFjbF9wZWVyX3N1cHBvcnRzX3NuaWZmX3N1YnJhdGluZyhiZF9hZGRyKSkgewotICAgIC8vIE5PVEU6IFRoaXMgY2FsbGJhY2sgYXNzdW1lcyB1cG9uIEFDTCBjb25uZWN0aW9uIHRoYXQKLSAgICAvLyB0aGUgcmVhZCByZW1vdGUgZmVhdHVyZXMgaGFzIGNvbXBsZXRlZCBhbmQgaXMgdmFsaWQuCi0gICAgLy8gVGhlIG9ubHkgZ3VhcmFudGVlZCBjb250cmFjdCBmb3IgdmFsaWQgcmVhZCByZW1vdGUgZmVhdHVyZXMKLSAgICAvLyBkYXRhIGlzIHdoZW4gdGhlIEJUQV9kbV9ub3RpZnlfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKCkKLSAgICAvLyBjYWxsYmFjayBoYXMgY29tcGxldGVkLiAgVGhlIGJlbG93IGFzc2lnbm1lbnQgaXMga2VwdCBmb3IKLSAgICAvLyB0cmFuc2l0aW9uYWwgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LgotICAgIGRldmljZS0+aW5mbyA9IEJUQV9ETV9ESV9VU0VfU1NSOwotICB9Ci0KLSAgaWYgKGJ0YV9kbV9jYi5wX3NlY19jYmFjaykgewotICAgIHRCVEFfRE1fU0VDIGNvbm47Ci0gICAgbWVtc2V0KCZjb25uLCAwLCBzaXplb2YodEJUQV9ETV9TRUMpKTsKLSAgICBjb25uLmxpbmtfdXAuYmRfYWRkciA9IGJkX2FkZHI7Ci0gICAgY29ubi5saW5rX3VwLnRyYW5zcG9ydF9saW5rX3R5cGUgPSB0cmFuc3BvcnQ7Ci0KLSAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soQlRBX0RNX0xJTktfVVBfRVZULCAmY29ubik7Ci0gICAgTE9HX0RFQlVHKCJFeGVjdXRlZCBzZWN1cml0eSBjYWxsYmFjayBmb3IgbmV3IGNvbm5lY3Rpb24gYXZhaWxhYmxlIik7Ci0gIH0KLSAgYnRhX2RtX2FkanVzdF9yb2xlcyh0cnVlKTsKLX0KLQotdm9pZCBCVEFfZG1fYWNsX3VwKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9hY2xfdXAsIGJkX2FkZHIsIHRyYW5zcG9ydCkpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfZG1fYWNsX2Rvd24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBib29sIGlzc3VlX3VucGFpcl9jYiA9IGZhbHNlOwotICBib29sIHJlbW92ZV9kZXZpY2UgPSBmYWxzZTsKLQotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGkrKykgewotICAgIGF1dG8gZGV2aWNlID0gJmJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXTsKLSAgICBpZiAoZGV2aWNlLT5wZWVyX2JkYWRkciAhPSBiZF9hZGRyIHx8IGRldmljZS0+dHJhbnNwb3J0ICE9IHRyYW5zcG9ydCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKGRldmljZS0+Y29ubl9zdGF0ZSA9PSBCVEFfRE1fVU5QQUlSSU5HKSB7Ci0gICAgICBpc3N1ZV91bnBhaXJfY2IgPQotICAgICAgICAgIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgPyBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNEZWxldGVEZXZpY2UoZGV2aWNlLT5wZWVyX2JkYWRkcikKLSAgICAgICAgICAgICAgOiBCVE1fU2VjRGVsZXRlRGV2aWNlKGRldmljZS0+cGVlcl9iZGFkZHIpOwotCi0gICAgICAvKiByZW1vdmUgYWxsIGNhY2hlZCBHQVRUIGluZm9ybWF0aW9uICovCi0gICAgICBCVEFfR0FUVENfUmVmcmVzaChiZF9hZGRyKTsKLQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFVucGFpcmluZzogaXNzdWUgdW5wYWlyIENCID0gJWQgIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGlzc3VlX3VucGFpcl9jYik7Ci0gICAgfQotCi0gICAgcmVtb3ZlX2RldmljZSA9IGRldmljZS0+cmVtb3ZlX2Rldl9wZW5kaW5nOwotCi0gICAgLy8gSXRlcmF0ZSB0byB0aGUgb25lIGJlZm9yZSB0aGUgbGFzdCB3aGVuIHNocmlua2luZyB0aGUgbGlzdCwKLSAgICAvLyBvdGhlcndpc2Ugd2UgbWVtY3B5IGdhcmJhZ2UgZGF0YSBpbnRvIHRoZSByZWNvcmQuCi0gICAgLy8gVGhlbiBjbGVhciBvdXQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGlzdCBzaW5jZSB3ZSBhcmUgc2hyaW5raW5nLgotICAgIGZvciAoOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50IC0gMTsgaSsrKSB7Ci0gICAgICBtZW1jcHkoJmJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXSwKLSAgICAgICAgICAgICAmYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2kgKyAxXSwKLSAgICAgICAgICAgICBzaXplb2YoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldKSk7Ci0gICAgfQotICAgIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQgPiAwKSB7Ci0gICAgICBpbnQgY2xlYXJfaW5kZXggPSBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQgLSAxOwotICAgICAgbWVtc2V0KCZidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbY2xlYXJfaW5kZXhdLCAwLAotICAgICAgICAgICAgIHNpemVvZihidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbY2xlYXJfaW5kZXhdKSk7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0gIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudC0tOwotICBpZiAoKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpICYmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QubGVfY291bnQpKSB7Ci0gICAgYnRhX2RtX2NiLmRldmljZV9saXN0LmxlX2NvdW50LS07Ci0gIH0KLQotICBpZiAoKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSAmJgotICAgICAgKGJ0YV9kbV9zZWFyY2hfY2Iud2FpdF9kaXNjICYmIGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHIgPT0gYmRfYWRkcikpIHsKLSAgICBidGFfZG1fc2VhcmNoX2NiLndhaXRfZGlzYyA9IGZhbHNlOwotCi0gICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc2RwX3Jlc3VsdHMpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVZFTlQoIiB0aW1lciBzdG9wcGVkICAiKTsKLSAgICAgIGFsYXJtX2NhbmNlbChidGFfZG1fc2VhcmNoX2NiLnNlYXJjaF90aW1lcik7Ci0gICAgICBidGFfZG1fZGlzY292ZXJfbmV4dF9kZXZpY2UoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoYnRhX2RtX2NiLmRpc2FibGluZykgewotICAgIGlmICghQlRNX0dldE51bUFjbExpbmtzKCkpIHsKLSAgICAgIC8qCi0gICAgICAgKiBTdGFydCBhIHRpbWVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwcm9maWxlcwotICAgICAgICogZ2V0IHRoZSBkaXNjb25uZWN0IGV2ZW50LgotICAgICAgICovCi0gICAgICBhbGFybV9zZXRfb25fbWxvb3AoYnRhX2RtX2NiLmRpc2FibGVfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0RNX0RJU0FCTEVfQ09OTl9ET1dOX1RJTUVSX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9kaXNhYmxlX2Nvbm5fZG93bl90aW1lcl9jYmFjaywgTlVMTCk7Ci0gICAgfQotICB9Ci0gIGlmIChyZW1vdmVfZGV2aWNlKSB7Ci0gICAgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZV9ub19jYWxsYmFjayhiZF9hZGRyKTsKLSAgfQotCi0gIGlmIChidGFfZG1fY2IucF9zZWNfY2JhY2spIHsKLSAgICB0QlRBX0RNX1NFQyBjb25uOwotICAgIG1lbXNldCgmY29ubiwgMCwgc2l6ZW9mKHRCVEFfRE1fU0VDKSk7Ci0gICAgY29ubi5saW5rX2Rvd24uYmRfYWRkciA9IGJkX2FkZHI7Ci0gICAgY29ubi5saW5rX2Rvd24udHJhbnNwb3J0X2xpbmtfdHlwZSA9IHRyYW5zcG9ydDsKLQotICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fTElOS19ET1dOX0VWVCwgJmNvbm4pOwotICAgIGlmIChpc3N1ZV91bnBhaXJfY2IpIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fREVWX1VOUEFJUkVEX0VWVCwgJmNvbm4pOwotICB9Ci0KLSAgYnRhX2RtX2FkanVzdF9yb2xlcyh0cnVlKTsKLX0KLQotdm9pZCBCVEFfZG1fYWNsX2Rvd24oY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRhX2RtX2FjbF9kb3duLCBiZF9hZGRyLCB0cmFuc3BvcnQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jaGVja19hdgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgQVYgaXMgYWN0aXZlCi0gKiAgICAgICAgICAgICAgICAgIGlmIHllcywgbWFrZSBzdXJlIHRoZSBBViBsaW5rIGlzIGNlbnRyYWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2NoZWNrX2F2KCkgewotICB1aW50OF90IGk7Ci0gIHRCVEFfRE1fUEVFUl9ERVZJQ0UqIHBfZGV2OwotCi0gIGlmIChidGFfZG1fY2IuY3VyX2F2X2NvdW50KSB7Ci0gICAgTE9HX0lORk8oImF2X2NvdW50OiVkIiwgYnRhX2RtX2NiLmN1cl9hdl9jb3VudCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudDsgaSsrKSB7Ci0gICAgICBwX2RldiA9ICZidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV07Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIlslZF06IHN0YXRlOiVkLCBpbmZvOngleCIsIGksIHBfZGV2LT5jb25uX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5JbmZvKCkpOwotICAgICAgaWYgKChwX2Rldi0+Y29ubl9zdGF0ZSA9PSBCVEFfRE1fQ09OTkVDVEVEKSAmJgotICAgICAgICAgIChwX2Rldi0+SW5mbygpICYgQlRBX0RNX0RJX0FWX0FDVElWRSkpIHsKLSAgICAgICAgLyogbWFrZSBjZW50cmFsIGFuZCB0YWtlIGF3YXkgdGhlIHJvbGUgc3dpdGNoIHBvbGljeSAqLwotICAgICAgICBCVE1fU3dpdGNoUm9sZVRvQ2VudHJhbChwX2Rldi0+cGVlcl9iZGFkZHIpOwotICAgICAgICAvKiBlbHNlIGVpdGhlciBhbHJlYWR5IGNlbnRyYWwgb3IgY2FuIG5vdCBzd2l0Y2ggZm9yIHNvbWUgcmVhc29ucyAqLwotICAgICAgICBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKHBfZGV2LT5wZWVyX2JkYWRkcik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2Rpc2FibGVfY29ubl9kb3duX3RpbWVyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyBkaXNhYmxlIGV2ZW50IHRvIGFwcGxpY2F0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fZGlzYWJsZV9jb25uX2Rvd25fdGltZXJfY2JhY2soVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICAvKiBkaXNhYmxlIHRoZSBwb3dlciBtYW5hZ21lbnQgbW9kdWxlICovCi0gIGJ0YV9kbV9kaXNhYmxlX3BtKCk7Ci0KLSAgYnRhX2RtX2NiLmRpc2FibGluZyA9IGZhbHNlOwotICBMT0dfSU5GTygiU3RhY2sgZGV2aWNlIG1hbmFnZXIgc2h1dGRvd24gY29tcGxldGVkIik7Ci0gIGZ1dHVyZV9yZWFkeShzdGFja19tYW5hZ2VyX2dldF9oYWNrX2Z1dHVyZSgpLCBGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcm1fY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJvbGUgbWFuYWdlbWVudCBjYWxsYmFjayBmcm9tIHN5cwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fcm1fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICB1aW50OF90IGo7Ci0gIHRCVEFfUFJFRl9ST0xFUyByb2xlOwotICB0QlRBX0RNX1BFRVJfREVWSUNFKiBwX2RldjsKLQotICBMT0dfREVCVUcoIkJUQSBSb2xlIG1hbmFnZW1lbnQgY2FsbGJhY2sgY291bnQ6JWQgc3RhdHVzOiVzIHBlZXI6JXMiLAotICAgICAgICAgICAgYnRhX2RtX2NiLmN1cl9hdl9jb3VudCwgYnRhX3N5c19jb25uX3N0YXR1c190ZXh0KHN0YXR1cykuY19zdHIoKSwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpKTsKLQotICBwX2RldiA9IGJ0YV9kbV9maW5kX3BlZXJfZGV2aWNlKHBlZXJfYWRkcik7Ci0gIGlmIChzdGF0dXMgPT0gQlRBX1NZU19DT05OX09QRU4pIHsKLSAgICBpZiAocF9kZXYpIHsKLSAgICAgIC8qIERvIG5vdCBzZXQgdG8gY29ubmVjdGVkIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHVucGFpcmluZy4gV2hlbiBBVgotICAgICAgICogc3RyZWFtIGlzCi0gICAgICAgKiBzdGFydGVkIGl0IGZha2VzIG91dCBhIFNZU19DT05OX09QRU4gdG8gcG90ZW50aWFsbHkgdHJpZ2dlciBhIHJvbGUKLSAgICAgICAqIHN3aXRjaCBjb21tYW5kLgotICAgICAgICogQnV0IHRoaXMgc2hvdWxkIG5vdCBiZSBkb25lIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHVucGFpcmluZy4KLSAgICAgICAqLwotICAgICAgaWYgKHBfZGV2LT5jb25uX3N0YXRlICE9IEJUQV9ETV9VTlBBSVJJTkcpCi0gICAgICAgIHBfZGV2LT5jb25uX3N0YXRlID0gQlRBX0RNX0NPTk5FQ1RFRDsKLQotICAgICAgZm9yIChqID0gMTsgaiA8PSBwX2J0YV9kbV9ybV9jZmdbMF0uYXBwX2lkOyBqKyspIHsKLSAgICAgICAgaWYgKCgocF9idGFfZG1fcm1fY2ZnW2pdLmFwcF9pZCA9PSBhcHBfaWQpIHx8Ci0gICAgICAgICAgICAgKHBfYnRhX2RtX3JtX2NmZ1tqXS5hcHBfaWQgPT0gQlRBX0FMTF9BUFBfSUQpKSAmJgotICAgICAgICAgICAgKHBfYnRhX2RtX3JtX2NmZ1tqXS5pZCA9PSBpZCkpIHsKLSAgICAgICAgICBBU1NFUlRfTE9HKHBfYnRhX2RtX3JtX2NmZ1tqXS5jZmcgPD0gQlRBX1BFUklQSEVSQUxfUk9MRV9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgIlBhc3NpbmcgaWxsZWdhbCBwcmVmZXJyZWQgcm9sZToweCUwMnggWzB4JTAyeDw9PjB4JTAyeF0iLAotICAgICAgICAgICAgICAgICAgICAgcF9idGFfZG1fcm1fY2ZnW2pdLmNmZywgQlRBX0FOWV9ST0xFLAotICAgICAgICAgICAgICAgICAgICAgQlRBX1BFUklQSEVSQUxfUk9MRV9PTkxZKTsKLSAgICAgICAgICByb2xlID0gc3RhdGljX2Nhc3Q8dEJUQV9QUkVGX1JPTEVTPihwX2J0YV9kbV9ybV9jZmdbal0uY2ZnKTsKLSAgICAgICAgICBpZiAocm9sZSA+IHBfZGV2LT5wcmVmX3JvbGUpIHBfZGV2LT5wcmVmX3JvbGUgPSByb2xlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKEJUQV9JRF9BViA9PSBpZCkgewotICAgIGlmIChzdGF0dXMgPT0gQlRBX1NZU19DT05OX0JVU1kpIHsKLSAgICAgIGlmIChwX2RldikgcF9kZXYtPmluZm8gfD0gQlRBX0RNX0RJX0FWX0FDVElWRTsKLSAgICAgIC8qIEFWIGNhbGxzIGJ0YV9zeXNfY29ubl9vcGVuIHdpdGggdGhlIEEyRFAgc3RyZWFtIGNvdW50IGFzIGFwcF9pZCAqLwotICAgICAgaWYgKEJUQV9JRF9BViA9PSBpZCkgYnRhX2RtX2NiLmN1cl9hdl9jb3VudCA9IGJ0YV9kbV9nZXRfYXZfY291bnQoKTsKLSAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBCVEFfU1lTX0NPTk5fSURMRSkgewotICAgICAgaWYgKHBfZGV2KSBwX2Rldi0+aW5mbyAmPSB+QlRBX0RNX0RJX0FWX0FDVElWRTsKLQotICAgICAgLyogZ2V0IGN1cl9hdl9jb3VudCBmcm9tIGNvbm5lY3RlZCBzZXJ2aWNlcyAqLwotICAgICAgaWYgKEJUQV9JRF9BViA9PSBpZCkgYnRhX2RtX2NiLmN1cl9hdl9jb3VudCA9IGJ0YV9kbV9nZXRfYXZfY291bnQoKTsKLSAgICB9Ci0gIH0KLQotICAvKiBEb24ndCBhZGp1c3Qgcm9sZXMgZm9yIGVhY2ggYnVzeS9pZGxlIHN0YXRlIHRyYW5zaXRpb24gdG8gYXZvaWQKLSAgICAgZXhjZXNzaXZlIHN3aXRjaCByZXF1ZXN0cyB3aGVuIGluZGl2aWR1YWwgcHJvZmlsZSBidXN5L2lkbGUgc3RhdHVzCi0gICAgIGNoYW5nZXMgKi8KLSAgaWYgKChzdGF0dXMgIT0gQlRBX1NZU19DT05OX0JVU1kpICYmIChzdGF0dXMgIT0gQlRBX1NZU19DT05OX0lETEUpKQotICAgIGJ0YV9kbV9hZGp1c3Rfcm9sZXMoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2RlbGF5X3JvbGVfc3dpdGNoX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsYmFjayBmcm9tIGJ0bSB0byBkZWxheSBhIHJvbGUgc3dpdGNoCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9kZWxheV9yb2xlX3N3aXRjaF9jYmFjayhVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBpbml0aWF0aW5nIERlbGF5ZWQgUlMiLCBfX2Z1bmNfXyk7Ci0gIGJ0YV9kbV9hZGp1c3Rfcm9sZXMoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3Jlc2V0X3NlY19kZXZfcGVuZGluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0dGluZyB0aGUgcmVtb3ZlIGRldmljZSBwZW5kaW5nIHN0YXR1cyB0byBmYWxzZSBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IGRldmljZSBEQiwgd2hlbiB0aGUgbGluayBrZXkgbm90aWZpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50IGNvbWVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fcmVzZXRfc2VjX2Rldl9wZW5kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspIHsKLSAgICBpZiAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyID09IHJlbW90ZV9iZF9hZGRyKSB7Ci0gICAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucmVtb3ZlX2Rldl9wZW5kaW5nID0gZmFsc2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcmVtb3ZlX3NlY19kZXZfZW50cnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZXMgZGV2aWNlIGVudHJ5IGZyb20gU2VjdXJpdHkgZGV2aWNlIERCIGlmIEFDTAotIGNvbm5lY3Rpb24gd2l0aAotICogICAgICAgICAgICAgICAgICByZW10b2UgZGV2aWNlIGRvZXMgbm90IGV4aXN0LCBlbHNlIHNjaGVkdWxlIGZvciBkZXYgZW50cnkKLSByZW1vdmFsIHVwb24KLSAgICAgICAgICAgICAgICAgICAgIEFDTCBjbG9zZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fcmVtb3ZlX3NlY19kZXZfZW50cnkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpIHsKLSAgaWYgKEJUTV9Jc0FjbENvbm5lY3Rpb25VcChyZW1vdGVfYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSB8fAotICAgICAgQlRNX0lzQWNsQ29ubmVjdGlvblVwKHJlbW90ZV9iZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICIlcyBBQ0wgaXMgbm90IGRvd24uIFNjaGVkdWxlIGZvciAgRGV2IFJlbW92YWwgd2hlbiBBQ0wgY2xvc2VzIiwKLSAgICAgICAgX19mdW5jX18pOwotICAgIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkgewotICAgICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQ2xlYXJTZWN1cml0eUZsYWdzKHJlbW90ZV9iZF9hZGRyKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRNX1NlY0NsZWFyU2VjdXJpdHlGbGFncyhyZW1vdGVfYmRfYWRkcik7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OyBpKyspIHsKLSAgICAgIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucGVlcl9iZGFkZHIgPT0gcmVtb3RlX2JkX2FkZHIpIHsKLSAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnJlbW92ZV9kZXZfcGVuZGluZyA9IFRSVUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyByZW1vdGVfYmRfYWRkciBjb21lcyBmcm9tIHNlY3VyaXR5IHJlY29yZCwgd2hpY2ggaXMgcmVtb3ZlZCBpbgotICAgIC8vIEJUTV9TZWNEZWxldGVEZXZpY2UuCi0gICAgUmF3QWRkcmVzcyBhZGRyX2NvcHkgPSByZW1vdGVfYmRfYWRkcjsKLSAgICBidGFfZG1fcHJvY2Vzc19yZW1vdmVfZGV2aWNlX25vX2NhbGxiYWNrKGFkZHJfY29weSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9hZGp1c3Rfcm9sZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFkanVzdCByb2xlcwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2FkanVzdF9yb2xlcyhib29sIGRlbGF5X3JvbGVfc3dpdGNoKSB7Ci0gIHVpbnQ4X3QgaTsKLSAgdWludDhfdCBsaW5rX2NvdW50ID0gYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50OwotICBpZiAobGlua19jb3VudCkgewotICAgIGZvciAoaSA9IDA7IGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGkrKykgewotICAgICAgaWYgKGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5jb25uX3N0YXRlID09IEJUQV9ETV9DT05ORUNURUQgJiYKLSAgICAgICAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0udHJhbnNwb3J0ID09Ci0gICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICAgICAgaWYgKChidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucHJlZl9yb2xlID09Ci0gICAgICAgICAgICAgQlRBX0NFTlRSQUxfUk9MRV9PTkxZKSB8fAotICAgICAgICAgICAgKGxpbmtfY291bnQgPiAxKSkgewotICAgICAgICAgIC8qIEluaXRpYXRpbmcgaW1tZWRpYXRlIHJvbGUgc3dpdGNoIHdpdGggY2VydGFpbiByZW1vdGUgZGV2aWNlcwotICAgICAgICAgICAgaGFzIGNhdXNlZCBpc3N1ZXMgZHVlIHRvIHJvbGUgIHN3aXRjaCBjb2xsaWRpbmcgd2l0aCBsaW5rIGVuY3J5cHRpb24KLSAgICAgICAgICAgIHNldHVwIGFuZAotICAgICAgICAgICAgY2F1c2luZyBlbmNyeXB0aW9uIChhbmQgaW4gdHVybiB0aGUgbGluaykgdG8gZmFpbCAuICBUaGVzZSBkZXZpY2UgLgotICAgICAgICAgICAgRmlybXdhcmUKLSAgICAgICAgICAgIHZlcnNpb25zIGFyZSBzdG9yZWQgaW4gYSByZWplY3RsaXN0IGFuZCByb2xlIHN3aXRjaCB3aXRoIHRoZXNlCi0gICAgICAgICAgICBkZXZpY2VzIGFyZQotICAgICAgICAgICAgZGVsYXllZCB0byBhdm9pZCB0aGUgY29sbGlzaW9uIHdpdGggbGluayBlbmNyeXB0aW9uIHNldHVwICovCi0KLSAgICAgICAgICBpZiAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnByZWZfcm9sZSAhPQotICAgICAgICAgICAgICAgICAgQlRBX1BFUklQSEVSQUxfUk9MRV9PTkxZICYmCi0gICAgICAgICAgICAgICFkZWxheV9yb2xlX3N3aXRjaCkgewotICAgICAgICAgICAgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwoCi0gICAgICAgICAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBlZXJfYmRhZGRyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKGJ0YV9kbV9jYi5zd2l0Y2hfZGVsYXlfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0RNX1NXSVRDSF9ERUxBWV9USU1FUl9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fZGVsYXlfcm9sZV9zd2l0Y2hfY2JhY2ssIE5VTEwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2dldF9yZW1uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVtb3RlIG5hbWUgc3RvcmVkIGluIHRoZSBETQotICogICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGlmIGl0IGV4aXN0cywgb3IgZnJvbSB0aGUgQlRNIG1lbW9yeS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGNoYXIgKiAtIFBvaW50ZXIgdG8gdGhlIHJlbW90ZSBkZXZpY2UgbmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjaGFyKiBidGFfZG1fZ2V0X3JlbW5hbWUodm9pZCkgewotICBjaGFyKiBwX25hbWUgPSAoY2hhciopYnRhX2RtX3NlYXJjaF9jYi5wZWVyX25hbWU7Ci0gIGNoYXIqIHBfdGVtcDsKLQotICAvKiBJZiB0aGUgbmFtZSBpc24ndCBhbHJlYWR5IHN0b3JlZCwgdHJ5IHJldHJpZXZpbmcgZnJvbSBCVE0gKi8KLSAgaWYgKCpwX25hbWUgPT0gJ1wwJykgewotICAgIHBfdGVtcCA9Ci0gICAgICAgIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkKLSAgICAgICAgICAgID8gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVhZERldk5hbWUoYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcikKLSAgICAgICAgICAgIDogQlRNX1NlY1JlYWREZXZOYW1lKGJ0YV9kbV9zZWFyY2hfY2IucGVlcl9iZGFkZHIpOwotICAgIGlmIChwX3RlbXAgIT0gTlVMTCkgcF9uYW1lID0gcF90ZW1wOwotICB9Ci0KLSAgcmV0dXJuIHBfbmFtZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9ib25kX2NhbmNlbF9jb21wbGV0ZV9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQXV0aGVudGljYXRpb24gY29tcGxldGUgY2FsbGJhY2sgZnJvbSBCVE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2JvbmRfY2FuY2VsX2NvbXBsZXRlX2NiYWNrKHRCVE1fU1RBVFVTIHJlc3VsdCkgewotICB0QlRBX0RNX1NFQyBzZWNfZXZlbnQ7Ci0KLSAgaWYgKHJlc3VsdCA9PSBCVE1fU1VDQ0VTUykKLSAgICBzZWNfZXZlbnQuYm9uZF9jYW5jZWxfY21wbC5yZXN1bHQgPSBCVEFfU1VDQ0VTUzsKLSAgZWxzZQotICAgIHNlY19ldmVudC5ib25kX2NhbmNlbF9jbXBsLnJlc3VsdCA9IEJUQV9GQUlMVVJFOwotCi0gIGlmIChidGFfZG1fY2IucF9zZWNfY2JhY2spIHsKLSAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soQlRBX0RNX0JPTkRfQ0FOQ0VMX0NNUExfRVZULCAmc2VjX2V2ZW50KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZmluZF91dGY4X2NoYXJfYm91bmRhcnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGEgVVRGOCBzdHJpbmcgfHV0ZjhzdHJ8IHN0YXJ0aW5nIGF0Ci0gKiAgICAgICAgICAgICAgICAgIHxvZmZzZXR8LCBtb3ZpbmcgYmFja3dhcmRzIGFuZCByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgIG5leHQgdmFsaWQgVVRGOCBjaGFyYWN0ZXIgYm91bmRhcnkgZm91bmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBPZmZzZXQgb2YgVVRGOCBjaGFyYWN0ZXIgYm91bmRhcnkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHNpemVfdCBmaW5kX3V0ZjhfY2hhcl9ib3VuZGFyeShjb25zdCBjaGFyKiB1dGY4c3RyLCBzaXplX3Qgb2Zmc2V0KSB7Ci0gIENIRUNLKHV0ZjhzdHIpOwotICBDSEVDSyhvZmZzZXQgPiAwKTsKLQotICB3aGlsZSAoLS1vZmZzZXQpIHsKLSAgICB1aW50OF90IGNoID0gKHVpbnQ4X3QpdXRmOHN0cltvZmZzZXRdOwotICAgIGlmICgoY2ggJiAweDgwKSA9PSAweDAwKSAgLy8gQVNDSUkKLSAgICAgIHJldHVybiBvZmZzZXQgKyAxOwotICAgIGlmICgoY2ggJiAweEMwKSA9PSAweEMwKSAgLy8gTXVsdGktYnl0ZSBzZXF1ZW5jZSBzdGFydAotICAgICAgcmV0dXJuIG9mZnNldDsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3NldF9laXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBFSVIgdGFnZ2VkIGRhdGEgYW5kIHdyaXRlcyBpdCB0bwotICogICAgICAgICAgICAgICAgICBjb250cm9sbGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fc2V0X2VpcihjaGFyKiBsb2NhbF9uYW1lKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQ4X3QqIHBfbGVuZ3RoOwotI2lmIChCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgIT0gVFJVRSkKLSAgdWludDhfdCogcF90eXBlOwotICB1aW50OF90IG1heF9udW1fdXVpZDsKLSNpZiAoQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlEID4gMCkKLSAgdWludDhfdCBjdXN0b21fdXVpZF9pZHg7Ci0jZW5kaWYgIC8vIEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRAotI2VuZGlmICAvLyBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QKLSNpZiAoQlRNX0VJUl9ERUZBVUxUX0ZFQ19SRVFVSVJFRCA9PSBGQUxTRSkKLSAgdWludDhfdCBmcmVlX2Vpcl9sZW5ndGggPSBIQ0lfRVhUX0lOUV9SRVNQT05TRV9MRU47Ci0jZWxzZSAgLy8gQlRNX0VJUl9ERUZBVUxUX0ZFQ19SRVFVSVJFRAotICB1aW50OF90IGZyZWVfZWlyX2xlbmd0aCA9IEhDSV9ETTVfUEFDS0VUX1NJWkU7Ci0jZW5kaWYgIC8vIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQKLSAgdWludDhfdCBudW1fdXVpZDsKLSAgdWludDhfdCBkYXRhX3R5cGU7Ci0gIHVpbnQ4X3QgbG9jYWxfbmFtZV9sZW47Ci0KLSAgLyogd2FpdCB1bnRpbCBjb21wbGV0ZSB0byBkaXNhYmxlICovCi0gIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRhX2RtX2NiLmRpc2FibGVfdGltZXIpKSByZXR1cm47Ci0KLSNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUpCi0gIC8qIGlmIGxvY2FsIG5hbWUgaXMgbm90IHByb3ZpZGVkLCBnZXQgaXQgZnJvbSBjb250cm9sbGVyICovCi0gIGlmIChsb2NhbF9uYW1lID09IE5VTEwpIHsKLSAgICBpZiAoQlRNX1JlYWRMb2NhbERldmljZU5hbWUoJmxvY2FsX25hbWUpICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCJGYWlsIHRvIHJlYWQgbG9jYWwgZGV2aWNlIG5hbWUgZm9yIEVJUiIpOwotICAgIH0KLSAgfQotI2VuZGlmICAvLyBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QKLQotICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIEhDSSBjb21tYW5kICovCi0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJUTV9DTURfQlVGX1NJWkUpOwotICBBU1NFUlQocF9idWYgIT0gbnVsbHB0cik7Ci0gIHAgPSAodWludDhfdCopcF9idWYgKyBCVE1fSENJX0VJUl9PRkZTRVQ7Ci0KLSAgbWVtc2V0KHAsIDB4MDAsIEhDSV9FWFRfSU5RX1JFU1BPTlNFX0xFTik7Ci0KLSAgTE9HX0lORk8oIkdlbmVyYXRpbmcgZXh0ZW5kZWQgaW5xdWlyeSByZXNwb25zZSBwYWNrZXQgRUlSIik7Ci0KLSAgaWYgKGxvY2FsX25hbWUpCi0gICAgbG9jYWxfbmFtZV9sZW4gPSBzdHJsZW4obG9jYWxfbmFtZSk7Ci0gIGVsc2UKLSAgICBsb2NhbF9uYW1lX2xlbiA9IDA7Ci0KLSAgZGF0YV90eXBlID0gSENJX0VJUl9DT01QTEVURV9MT0NBTF9OQU1FX1RZUEU7Ci0gIC8qIGlmIGxvY2FsIG5hbWUgaXMgbG9uZ2VyIHRoYW4gbWluaW11bSBsZW5ndGggb2Ygc2hvcnRlbmVkIG5hbWUgKi8KLSAgLyogY2hlY2sgd2hldGhlciBpdCBuZWVkcyB0byBiZSBzaG9ydGVuZWQgb3Igbm90ICovCi0gIGlmIChsb2NhbF9uYW1lX2xlbiA+IHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfbWluX25hbWVfbGVuKSB7Ci0vKiBnZXQgbnVtYmVyIG9mIFVVSUQgMTYtYml0IGxpc3QgKi8KLSNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IFRSVUUpCi0gICAgbnVtX3V1aWQgPSBwX2J0YV9kbV9laXJfY2ZnLT5idGFfZG1fZWlyX3V1aWQxNl9sZW4gLyBVdWlkOjprTnVtQnl0ZXMxNjsKLSNlbHNlICAgLy8gQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUCi0gICAgbWF4X251bV91dWlkID0gKGZyZWVfZWlyX2xlbmd0aCAtIDIpIC8gVXVpZDo6a051bUJ5dGVzMTY7Ci0gICAgZGF0YV90eXBlID0gZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkuZWlyLkJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcygKLSAgICAgICAgYnRhX2RtX2NiLmVpcl91dWlkLCAmcCwgbWF4X251bV91dWlkLCAmbnVtX3V1aWQpOwotICAgIHAgPSAodWludDhfdCopcF9idWYgKyBCVE1fSENJX0VJUl9PRkZTRVQ7IC8qIHJlc2V0IHAgKi8KLSNlbmRpZiAgLy8gQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUCi0KLSAgICAvKiBpZiBVVUlEIGRvZXNuJ3QgZml0IHJlbWFpbmcgc3BhY2UsIHNob3J0ZW4gbG9jYWwgbmFtZSAqLwotICAgIGlmIChsb2NhbF9uYW1lX2xlbiA+IChmcmVlX2Vpcl9sZW5ndGggLSA0IC0gbnVtX3V1aWQgKiBVdWlkOjprTnVtQnl0ZXMxNikpIHsKLSAgICAgIGxvY2FsX25hbWVfbGVuID0gZmluZF91dGY4X2NoYXJfYm91bmRhcnkoCi0gICAgICAgICAgbG9jYWxfbmFtZSwgcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9taW5fbmFtZV9sZW4pOwotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlcyBsb2NhbCBuYW1lIGlzIHNob3J0ZW5lZCAoJWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfbmFtZV9sZW4pOwotICAgICAgZGF0YV90eXBlID0gSENJX0VJUl9TSE9SVEVORURfTE9DQUxfTkFNRV9UWVBFOwotICAgIH0gZWxzZSB7Ci0gICAgICBkYXRhX3R5cGUgPSBIQ0lfRUlSX0NPTVBMRVRFX0xPQ0FMX05BTUVfVFlQRTsKLSAgICB9Ci0gIH0KLQotICBVSU5UOF9UT19TVFJFQU0ocCwgbG9jYWxfbmFtZV9sZW4gKyAxKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGRhdGFfdHlwZSk7Ci0KLSAgaWYgKGxvY2FsX25hbWUgIT0gTlVMTCkgewotICAgIG1lbWNweShwLCBsb2NhbF9uYW1lLCBsb2NhbF9uYW1lX2xlbik7Ci0gICAgcCArPSBsb2NhbF9uYW1lX2xlbjsKLSAgfQotICBmcmVlX2Vpcl9sZW5ndGggLT0gbG9jYWxfbmFtZV9sZW4gKyAyOwotCi0jaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCA9PSBUUlVFKQotICAvKiBpZiBVVUlEIGxpc3QgaXMgcHJvdmlkZWQgYXMgc3RhdGljIGRhdGEgaW4gY29uZmlndXJhdGlvbiAqLwotICBpZiAoKHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfdXVpZDE2X2xlbiA+IDApICYmCi0gICAgICAocF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl91dWlkMTYpKSB7Ci0gICAgaWYgKGZyZWVfZWlyX2xlbmd0aCA+IFV1aWQ6OmtOdW1CeXRlczE2ICsgMikgewotICAgICAgZnJlZV9laXJfbGVuZ3RoIC09IDI7Ci0KLSAgICAgIGlmIChmcmVlX2Vpcl9sZW5ndGggPj0gcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl91dWlkMTZfbGVuKSB7Ci0gICAgICAgIG51bV91dWlkID0gcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl91dWlkMTZfbGVuIC8gVXVpZDo6a051bUJ5dGVzMTY7Ci0gICAgICAgIGRhdGFfdHlwZSA9IEhDSV9FSVJfQ09NUExFVEVfMTZCSVRTX1VVSURfVFlQRTsKLSAgICAgIH0gZWxzZSAvKiBub3QgZW5vdWdoIHJvb20gZm9yIGFsbCBVVUlEcyAqLwotICAgICAgewotICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQSBFSVI6IFVVSUQgMTYtYml0IGxpc3QgaXMgdHJ1bmNhdGVkIik7Ci0gICAgICAgIG51bV91dWlkID0gZnJlZV9laXJfbGVuZ3RoIC8gVXVpZDo6a051bUJ5dGVzMTY7Ci0gICAgICAgIGRhdGFfdHlwZSA9IEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFOwotICAgICAgfQotICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIG51bV91dWlkICogVXVpZDo6a051bUJ5dGVzMTYgKyAxKTsKLSAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBkYXRhX3R5cGUpOwotICAgICAgbWVtY3B5KHAsIHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfdXVpZDE2LAotICAgICAgICAgICAgIG51bV91dWlkICogVXVpZDo6a051bUJ5dGVzMTYpOwotICAgICAgcCArPSBudW1fdXVpZCAqIFV1aWQ6OmtOdW1CeXRlczE2OwotICAgICAgZnJlZV9laXJfbGVuZ3RoIC09IG51bV91dWlkICogVXVpZDo6a051bUJ5dGVzMTY7Ci0gICAgfQotICB9Ci0jZWxzZSAvKiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IFRSVUUpICovCi0gIC8qIGlmIFVVSUQgbGlzdCBpcyBkeW5hbWljICovCi0gIGlmIChmcmVlX2Vpcl9sZW5ndGggPj0gMikgewotICAgIHBfbGVuZ3RoID0gcCsrOwotICAgIHBfdHlwZSA9IHArKzsKLSAgICBudW1fdXVpZCA9IDA7Ci0KLSAgICBtYXhfbnVtX3V1aWQgPSAoZnJlZV9laXJfbGVuZ3RoIC0gMikgLyBVdWlkOjprTnVtQnl0ZXMxNjsKLSAgICBkYXRhX3R5cGUgPSBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5laXIuQlRNX0dldEVpclN1cHBvcnRlZFNlcnZpY2VzKAotICAgICAgICBidGFfZG1fY2IuZWlyX3V1aWQsICZwLCBtYXhfbnVtX3V1aWQsICZudW1fdXVpZCk7Ci0KLSAgICBpZiAoZGF0YV90eXBlID09IEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFKSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQSBFSVI6IFVVSUQgMTYtYml0IGxpc3QgaXMgdHJ1bmNhdGVkIik7Ci0gICAgfQotI2lmIChCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKQotICAgIGVsc2UgewotICAgICAgZm9yIChjdXN0b21fdXVpZF9pZHggPSAwOwotICAgICAgICAgICBjdXN0b21fdXVpZF9pZHggPCBCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQ7Ci0gICAgICAgICAgIGN1c3RvbV91dWlkX2lkeCsrKSB7Ci0gICAgICAgIGNvbnN0IFV1aWQmIGN1cnIgPSBidGFfZG1fY2IuYnRhX2N1c3RvbV91dWlkW2N1c3RvbV91dWlkX2lkeF0uY3VzdG9tX3V1aWQ7Ci0gICAgICAgIGlmIChjdXJyLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgICAgICBpZiAobnVtX3V1aWQgPCBtYXhfbnVtX3V1aWQpIHsKLSAgICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgY3Vyci5BczE2Qml0KCkpOwotICAgICAgICAgICAgbnVtX3V1aWQrKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YV90eXBlID0gSENJX0VJUl9NT1JFXzE2QklUU19VVUlEX1RZUEU7Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQSBFSVI6IFVVSUQgMTYtYml0IGxpc3QgaXMgdHJ1bmNhdGVkIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLyogKEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRCA+IDApICovCi0KLSAgICBVSU5UOF9UT19TVFJFQU0ocF9sZW5ndGgsIG51bV91dWlkICogVXVpZDo6a051bUJ5dGVzMTYgKyAxKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocF90eXBlLCBkYXRhX3R5cGUpOwotICAgIGZyZWVfZWlyX2xlbmd0aCAtPSBudW1fdXVpZCAqIFV1aWQ6OmtOdW1CeXRlczE2ICsgMjsKLSAgfQotI2VuZGlmIC8qIChCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgPT0gVFJVRSkgKi8KLQotI2lmIChCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgIT0gVFJVRSAmJiBCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKQotICAvKiBBZGRpbmcgMzItYml0IFVVSUQgbGlzdCAqLwotICBpZiAoZnJlZV9laXJfbGVuZ3RoID49IDIpIHsKLSAgICBwX2xlbmd0aCA9IHArKzsKLSAgICBwX3R5cGUgPSBwKys7Ci0gICAgbnVtX3V1aWQgPSAwOwotICAgIGRhdGFfdHlwZSA9IEhDSV9FSVJfQ09NUExFVEVfMzJCSVRTX1VVSURfVFlQRTsKLQotICAgIG1heF9udW1fdXVpZCA9IChmcmVlX2Vpcl9sZW5ndGggLSAyKSAvIFV1aWQ6OmtOdW1CeXRlczMyOwotCi0gICAgZm9yIChjdXN0b21fdXVpZF9pZHggPSAwOyBjdXN0b21fdXVpZF9pZHggPCBCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQ7Ci0gICAgICAgICBjdXN0b21fdXVpZF9pZHgrKykgewotICAgICAgY29uc3QgVXVpZCYgY3VyciA9IGJ0YV9kbV9jYi5idGFfY3VzdG9tX3V1aWRbY3VzdG9tX3V1aWRfaWR4XS5jdXN0b21fdXVpZDsKLSAgICAgIGlmIChjdXJyLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgPT0gVXVpZDo6a051bUJ5dGVzMzIpIHsKLSAgICAgICAgaWYgKG51bV91dWlkIDwgbWF4X251bV91dWlkKSB7Ci0gICAgICAgICAgVUlOVDMyX1RPX1NUUkVBTShwLCBjdXJyLkFzMzJCaXQoKSk7Ci0gICAgICAgICAgbnVtX3V1aWQrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBkYXRhX3R5cGUgPSBIQ0lfRUlSX01PUkVfMzJCSVRTX1VVSURfVFlQRTsKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQSBFSVI6IFVVSUQgMzItYml0IGxpc3QgaXMgdHJ1bmNhdGVkIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBVSU5UOF9UT19TVFJFQU0ocF9sZW5ndGgsIG51bV91dWlkICogVXVpZDo6a051bUJ5dGVzMzIgKyAxKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocF90eXBlLCBkYXRhX3R5cGUpOwotICAgIGZyZWVfZWlyX2xlbmd0aCAtPSBudW1fdXVpZCAqIFV1aWQ6OmtOdW1CeXRlczMyICsgMjsKLSAgfQotCi0gIC8qIEFkZGluZyAxMjgtYml0IFVVSUQgbGlzdCAqLwotICBpZiAoZnJlZV9laXJfbGVuZ3RoID49IDIpIHsKLSAgICBwX2xlbmd0aCA9IHArKzsKLSAgICBwX3R5cGUgPSBwKys7Ci0gICAgbnVtX3V1aWQgPSAwOwotICAgIGRhdGFfdHlwZSA9IEhDSV9FSVJfQ09NUExFVEVfMTI4QklUU19VVUlEX1RZUEU7Ci0KLSAgICBtYXhfbnVtX3V1aWQgPSAoZnJlZV9laXJfbGVuZ3RoIC0gMikgLyBVdWlkOjprTnVtQnl0ZXMxMjg7Ci0KLSAgICBmb3IgKGN1c3RvbV91dWlkX2lkeCA9IDA7IGN1c3RvbV91dWlkX2lkeCA8IEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRDsKLSAgICAgICAgIGN1c3RvbV91dWlkX2lkeCsrKSB7Ci0gICAgICBjb25zdCBVdWlkJiBjdXJyID0gYnRhX2RtX2NiLmJ0YV9jdXN0b21fdXVpZFtjdXN0b21fdXVpZF9pZHhdLmN1c3RvbV91dWlkOwotICAgICAgaWYgKGN1cnIuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSA9PSBVdWlkOjprTnVtQnl0ZXMxMjgpIHsKLSAgICAgICAgaWYgKG51bV91dWlkIDwgbWF4X251bV91dWlkKSB7Ci0gICAgICAgICAgQVJSQVkxNl9UT19TVFJFQU0ocCwgY3Vyci5UbzEyOEJpdEJFKCkuZGF0YSgpKTsKLSAgICAgICAgICBudW1fdXVpZCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRhdGFfdHlwZSA9IEhDSV9FSVJfTU9SRV8xMjhCSVRTX1VVSURfVFlQRTsKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQSBFSVI6IFVVSUQgMTI4LWJpdCBsaXN0IGlzIHRydW5jYXRlZCIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgVUlOVDhfVE9fU1RSRUFNKHBfbGVuZ3RoLCBudW1fdXVpZCAqIFV1aWQ6OmtOdW1CeXRlczEyOCArIDEpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwX3R5cGUsIGRhdGFfdHlwZSk7Ci0gICAgZnJlZV9laXJfbGVuZ3RoIC09IG51bV91dWlkICogVXVpZDo6a051bUJ5dGVzMTI4ICsgMjsKLSAgfQotI2VuZGlmIC8qICggQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUgXAotICAgICAgICAgICkmJihCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKSAqLwotCi0gIC8qIGlmIEZsYWdzIGFyZSBwcm92aWRlZCBpbiBjb25maWd1cmF0aW9uICovCi0gIGlmICgocF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9mbGFnX2xlbiA+IDApICYmCi0gICAgICAocF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9mbGFncykgJiYKLSAgICAgIChmcmVlX2Vpcl9sZW5ndGggPj0gcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9mbGFnX2xlbiArIDIpKSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfZmxhZ19sZW4gKyAxKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgSENJX0VJUl9GTEFHU19UWVBFKTsKLSAgICBtZW1jcHkocCwgcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9mbGFncywKLSAgICAgICAgICAgcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9mbGFnX2xlbik7Ci0gICAgcCArPSBwX2J0YV9kbV9laXJfY2ZnLT5idGFfZG1fZWlyX2ZsYWdfbGVuOwotICAgIGZyZWVfZWlyX2xlbmd0aCAtPSBwX2J0YV9kbV9laXJfY2ZnLT5idGFfZG1fZWlyX2ZsYWdfbGVuICsgMjsKLSAgfQotCi0gIC8qIGlmIE1hbnVmYWN0dXJlciBTcGVjaWZpYyBhcmUgcHJvdmlkZWQgaW4gY29uZmlndXJhdGlvbiAqLwotICBpZiAoKHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbiA+IDApICYmCi0gICAgICAocF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9tYW51ZmFjX3NwZWMpICYmCi0gICAgICAoZnJlZV9laXJfbGVuZ3RoID49IHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbiArIDIpKSB7Ci0gICAgcF9sZW5ndGggPSBwOwotCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbiArIDEpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBIQ0lfRUlSX01BTlVGQUNUVVJFUl9TUEVDSUZJQ19UWVBFKTsKLSAgICBtZW1jcHkocCwgcF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9tYW51ZmFjX3NwZWMsCi0gICAgICAgICAgIHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbik7Ci0gICAgcCArPSBwX2J0YV9kbV9laXJfY2ZnLT5idGFfZG1fZWlyX21hbnVmYWNfc3BlY19sZW47Ci0gICAgZnJlZV9laXJfbGVuZ3RoIC09IHBfYnRhX2RtX2Vpcl9jZmctPmJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbiArIDI7Ci0KLSAgfSBlbHNlIHsKLSAgICBwX2xlbmd0aCA9IE5VTEw7Ci0gIH0KLQotICAvKiBpZiBJbnF1aXJ5IFR4IFJlc3AgUG93ZXIgY29tcGlsZWQgKi8KLSAgaWYgKChwX2J0YV9kbV9laXJfY2ZnLT5idGFfZG1fZWlyX2lucV90eF9wb3dlcikgJiYgKGZyZWVfZWlyX2xlbmd0aCA+PSAzKSkgewotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAyKTsgLyogTGVuZ3RoIGZpZWxkICovCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEhDSV9FSVJfVFhfUE9XRVJfTEVWRUxfVFlQRSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsICoocF9idGFfZG1fZWlyX2NmZy0+YnRhX2RtX2Vpcl9pbnFfdHhfcG93ZXIpKTsKLSAgICBmcmVlX2Vpcl9sZW5ndGggLT0gMzsKLSAgfQotCi0gIGlmIChmcmVlX2Vpcl9sZW5ndGgpCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIDApOyAvKiB0ZXJtaW5hdG9yIG9mIHNpZ25pZmljYW50IHBhcnQgKi8KLQotICBCVE1fV3JpdGVFSVIocF9idWYpOwotfQotCi0jaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9nZXRfY3VzdF91dWlkX2luZGV4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgaW5kZXggb2YgY3VzdG9tIHV1aWQgZnJvbSBsaXN0Ci0gKiAgICAgICAgICAgICAgICAgIE5vdGUsIGhhbmRsZSBlcXVhbHMgdG8gMCBtZWFucyB0byBmaW5kIGEgdmFjYW50Ci0gKiAgICAgICAgICAgICAgICAgIGZyb20gbGlzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEluZGV4IG9mIGFycmF5Ci0gKiAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5idGFfY3VzdG9tX3V1aWRbQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlEXQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidGFfZG1fZ2V0X2N1c3RfdXVpZF9pbmRleCh1aW50MzJfdCBoYW5kbGUpIHsKLSNpZiAoQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlEID4gMCkKLSAgdWludDhfdCBjX3V1X2lkeCA9IDA7Ci0KLSAgd2hpbGUoY191dV9pZHggPCBCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgJiYKLSAgICAgIGJ0YV9kbV9jYi5idGFfY3VzdG9tX3V1aWRbY191dV9pZHhdLmhhbmRsZSAhPSBoYW5kbGUpIHsKLSAgICBjX3V1X2lkeCsrOwotICB9Ci0KLSAgcmV0dXJuIGNfdXVfaWR4OwotI2Vsc2UKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV91cGRhdGVfY3VzdF91dWlkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVcGRhdGUgY3VzdG9tIHV1aWQgd2l0aCBnaXZlbiB2YWx1ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fdXBkYXRlX2N1c3RfdXVpZCh1aW50OF90IGNfdXVfaWR4LCBjb25zdCBVdWlkJiB1dWlkLCB1aW50MzJfdCBoYW5kbGUpIHsKLSNpZiAoQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlEID4gMCkKLSAgaWYgKGNfdXVfaWR4IDwgQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlEKSB7Ci0gICAgdEJUQV9DVVNUT01fVVVJRCYgY3VyciA9IGJ0YV9kbV9jYi5idGFfY3VzdG9tX3V1aWRbY191dV9pZHhdOwotICAgIGN1cnIuY3VzdG9tX3V1aWQuVXBkYXRlVXVpZCh1dWlkKTsKLSAgICBjdXJyLmhhbmRsZSA9IGhhbmRsZTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcyBpbnZhbGlkIHV1aWQgaW5kZXggJWQiLCBfX2Z1bmNfXywgY191dV9pZHgpOwotICB9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9laXJfdXBkYXRlX2N1c3RfdXVpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIG9yIHJlbW92ZXMgY3VzdG9tIHNlcnZpY2UgVVVJRCBpbiBFSVIgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2Vpcl91cGRhdGVfY3VzdF91dWlkKGNvbnN0IHRCVEFfQ1VTVE9NX1VVSUQmIGN1cnIsIGJvb2wgYWRkaW5nKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotI2lmIChCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQgPiAwKQotICB1aW50OF90IGNfdXVfaWR4ID0gMDsKLSAgaWYgKGFkZGluZykgewotICAgIGNfdXVfaWR4ID0gYnRhX2RtX2dldF9jdXN0X3V1aWRfaW5kZXgoMCk7IC8qIGZpbmQgYSB2YWNhbnQgZnJvbSB1dWlkIGxpc3QgKi8KLSAgICBidGFfZG1fdXBkYXRlX2N1c3RfdXVpZChjX3V1X2lkeCwgY3Vyci5jdXN0b21fdXVpZCwgY3Vyci5oYW5kbGUpOwotICB9IGVsc2UgewotICAgIGNfdXVfaWR4ID0gYnRhX2RtX2dldF9jdXN0X3V1aWRfaW5kZXgoY3Vyci5oYW5kbGUpOyAvKiBmaW5kIHRoZSB1dWlkIGZyb20gdXVpZCBsaXN0ICovCi0gICAgYnRhX2RtX3VwZGF0ZV9jdXN0X3V1aWQoY191dV9pZHgsIGN1cnIuY3VzdG9tX3V1aWQsIDApOwotICB9Ci0KLSAgLyogVXBkYXRlIEVJUiB3aGVuIFVVSURzIGFyZSBjaGFuZ2VkICovCi0gIGlmIChjX3V1X2lkeCA8PSBCVEFfRUlSX1NFUlZFUl9OVU1fQ1VTVE9NX1VVSUQpIHsKLSAgICBidGFfZG1fc2V0X2VpcihOVUxMKTsKLSAgfQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fZWlyX3VwZGF0ZV91dWlkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgb3IgcmVtb3ZlcyBzZXJ2aWNlIFVVSUQgaW4gRUlSIGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9laXJfdXBkYXRlX3V1aWQodWludDE2X3QgdXVpZDE2LCBib29sIGFkZGluZykgewotICAvKiBpZiB0aGlzIFVVSUQgaXMgbm90IGFkdmVydGlzZWQgaW4gRUlSICovCi0gIGlmICghQlRNX0hhc0VpclNlcnZpY2UocF9idGFfZG1fZWlyX2NmZy0+dXVpZF9tYXNrLCB1dWlkMTYpKSByZXR1cm47Ci0KLSAgaWYgKGFkZGluZykgewotICAgIExPR19JTkZPKCJFSVIgQWRkaW5nIFVVSUQ9MHglMDRYIGludG8gZXh0ZW5kZWQgaW5xdWlyeSByZXNwb25zZSIsIHV1aWQxNik7Ci0KLSAgICBCVE1fQWRkRWlyU2VydmljZShidGFfZG1fY2IuZWlyX3V1aWQsIHV1aWQxNik7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oIkVJUiBSZW1vdmluZyBVVUlEPTB4JTA0WCBmcm9tIGV4dGVuZGVkIGlucXVpcnkgcmVzcG9uc2UiLCB1dWlkMTYpOwotCi0gICAgQlRNX1JlbW92ZUVpclNlcnZpY2UoYnRhX2RtX2NiLmVpcl91dWlkLCB1dWlkMTYpOwotICB9Ci0KLSAgYnRhX2RtX3NldF9laXIoTlVMTCk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9lbmNyeXB0X2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBsaW5rIGVuY3J5cHRpb24gY29tcGxldGUgY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fZW5jcnlwdF9jYmFjayhjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgcmVzdWx0KSB7Ci0gIHRCVEFfU1RBVFVTIGJ0YV9zdGF0dXMgPSBCVEFfU1VDQ0VTUzsKLSAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2NhbGxiYWNrID0gTlVMTDsKLSAgdWludDhfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGkrKykgewotICAgIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucGVlcl9iZGFkZHIgPT0gKmJkX2FkZHIgJiYKLSAgICAgICAgYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLmNvbm5fc3RhdGUgPT0gQlRBX0RNX0NPTk5FQ1RFRCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpIHsKLSAgICBwX2NhbGxiYWNrID0gYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBfZW5jcnlwdF9jYmFjazsKLSAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucF9lbmNyeXB0X2NiYWNrID0gTlVMTDsKLSAgfQotCi0gIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgY2FzZSBCVE1fU1VDQ0VTUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX1dST05HX01PREU6Ci0gICAgICBidGFfc3RhdHVzID0gQlRBX1dST05HX01PREU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9OT19SRVNPVVJDRVM6Ci0gICAgICBidGFfc3RhdHVzID0gQlRBX05PX1JFU09VUkNFUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JVU1k6Ci0gICAgICBidGFfc3RhdHVzID0gQlRBX0JVU1k7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnRhX3N0YXR1cyA9IEJUQV9GQUlMVVJFOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fZW5jcnlwdF9jYmFjayBzdGF0dXMgPSVkIHBfY2FsbGJhY2s9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgYnRhX3N0YXR1cywgcF9jYWxsYmFjayk7Ci0KLSAgaWYgKHBfY2FsbGJhY2spIHsKLSAgICAoKnBfY2FsbGJhY2spKCpiZF9hZGRyLCB0cmFuc3BvcnQsIGJ0YV9zdGF0dXMpOwotICB9Ci19Ci0KLS8qKlRoaXMgZnVuY3Rpb24gdG8gZW5jcnlwdCB0aGUgbGluayAqLwotdm9pZCBidGFfZG1fc2V0X2VuY3J5cHRpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHsKLSAgdWludDhfdCBpOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9zZXRfZW5jcnlwdGlvbiIpOyAgLy8gdG9kbwotICBpZiAoIXBfY2FsbGJhY2spIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJidGFfZG1fc2V0X2VuY3J5cHRpb24gY2FsbGJhY2sgaXMgbm90IHByb3ZpZGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQ7IGkrKykgewotICAgIGlmIChidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucGVlcl9iZGFkZHIgPT0gYmRfYWRkciAmJgotICAgICAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0uY29ubl9zdGF0ZSA9PSBCVEFfRE1fQ09OTkVDVEVEKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGkgPCBidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpIHsKLSAgICBpZiAoYnRhX2RtX2NiLmRldmljZV9saXN0LnBlZXJfZGV2aWNlW2ldLnBfZW5jcnlwdF9jYmFjaykgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiZWFybGllciBlbmMgd2FzIG5vdCBkb25lIGZvciBzYW1lIGRldmljZSIpOwotICAgICAgKCpwX2NhbGxiYWNrKShiZF9hZGRyLCB0cmFuc3BvcnQsIEJUQV9CVVNZKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoQlRNX1NldEVuY3J5cHRpb24oYmRfYWRkciwgdHJhbnNwb3J0LCBidGFfZG1fZW5jcnlwdF9jYmFjaywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjX2FjdCkgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICBidGFfZG1fY2IuZGV2aWNlX2xpc3QucGVlcl9kZXZpY2VbaV0ucF9lbmNyeXB0X2NiYWNrID0gcF9jYWxsYmFjazsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBidGFfZG1fY2hlY2tfaWZfb25seV9oZF9jb25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb3VudCglZCkiLCBfX2Z1bmNfXywgYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQpOwotCi0gIGZvciAodWludDhfdCBqID0gMDsgaiA8IGJ0YV9kbV9jb25uX3NydmNzLmNvdW50OyBqKyspIHsKLSAgICAvLyBDaGVjayBpZiBwcm9maWxlcyBvdGhlciB0aGFuIGhpZCBhcmUgY29ubmVjdGVkCi0gICAgaWYgKChidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uaWQgIT0gQlRBX0lEX0hEKSAmJgotICAgICAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0ucGVlcl9iZGFkZHIgPT0gcGVlcl9hZGRyKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogQW5vdGhlciBwcm9maWxlIChpZD0lZCkgaXMgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5pZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fb2JzZXJ2ZV9yZXN1bHRzX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsYmFjayBmb3IgQkxFIE9ic2VydmUgcmVzdWx0Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fb2JzZXJ2ZV9yZXN1bHRzX2NiKHRCVE1fSU5RX1JFU1VMVFMqIHBfaW5xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2VpciwgdWludDE2X3QgZWlyX2xlbikgewotICB0QlRBX0RNX1NFQVJDSCByZXN1bHQ7Ci0gIHRCVE1fSU5RX0lORk8qIHBfaW5xX2luZm87Ci0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9vYnNlcnZlX3Jlc3VsdHNfY2IiKTsKLQotICByZXN1bHQuaW5xX3Jlcy5iZF9hZGRyID0gcF9pbnEtPnJlbW90ZV9iZF9hZGRyOwotICByZXN1bHQuaW5xX3Jlcy5yc3NpID0gcF9pbnEtPnJzc2k7Ci0gIHJlc3VsdC5pbnFfcmVzLmJsZV9hZGRyX3R5cGUgPSBwX2lucS0+YmxlX2FkZHJfdHlwZTsKLSAgcmVzdWx0LmlucV9yZXMuaW5xX3Jlc3VsdF90eXBlID0gcF9pbnEtPmlucV9yZXN1bHRfdHlwZTsKLSAgcmVzdWx0LmlucV9yZXMuZGV2aWNlX3R5cGUgPSBwX2lucS0+ZGV2aWNlX3R5cGU7Ci0gIHJlc3VsdC5pbnFfcmVzLmZsYWcgPSBwX2lucS0+ZmxhZzsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX2V2dF90eXBlID0gcF9pbnEtPmJsZV9ldnRfdHlwZTsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3ByaW1hcnlfcGh5ID0gcF9pbnEtPmJsZV9wcmltYXJ5X3BoeTsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3NlY29uZGFyeV9waHkgPSBwX2lucS0+YmxlX3NlY29uZGFyeV9waHk7Ci0gIHJlc3VsdC5pbnFfcmVzLmJsZV9hZHZlcnRpc2luZ19zaWQgPSBwX2lucS0+YmxlX2FkdmVydGlzaW5nX3NpZDsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3R4X3Bvd2VyID0gcF9pbnEtPmJsZV90eF9wb3dlcjsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3BlcmlvZGljX2Fkdl9pbnQgPSBwX2lucS0+YmxlX3BlcmlvZGljX2Fkdl9pbnQ7Ci0KLSAgLyogYXBwbGljYXRpb24gd2lsbCBwYXJzZSBFSVIgdG8gZmluZCBvdXQgcmVtb3RlIGRldmljZSBuYW1lICovCi0gIHJlc3VsdC5pbnFfcmVzLnBfZWlyID0gY29uc3RfY2FzdDx1aW50OF90Kj4ocF9laXIpOwotICByZXN1bHQuaW5xX3Jlcy5laXJfbGVuID0gZWlyX2xlbjsKLQotICBwX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChwX2lucS0+cmVtb3RlX2JkX2FkZHIpOwotICBpZiAocF9pbnFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgLyogaW5pdGlhbGl6ZSByZW10X25hbWVfbm90X3JlcXVpcmVkIHRvIGZhbHNlIHNvIHRoYXQgd2UgZ2V0IHRoZSBuYW1lIGJ5Ci0gICAgICogZGVmYXVsdCAqLwotICAgIHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQgPSBmYWxzZTsKLSAgfQotCi0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfc2Nhbl9jYmFjaykKLSAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2Nhbl9jYmFjayhCVEFfRE1fSU5RX1JFU19FVlQsICZyZXN1bHQpOwotCi0gIGlmIChwX2lucV9pbmZvKSB7Ci0gICAgLyogYXBwbGljYXRpb24gaW5kaWNhdGVzIGlmIGl0IGtub3dzIHRoZSByZW1vdGUgbmFtZSwgaW5zaWRlIHRoZSBjYWxsYmFjawotICAgICBjb3B5IHRoYXQgdG8gdGhlIGlucXVpcnkgZGF0YSBiYXNlKi8KLSAgICBpZiAocmVzdWx0LmlucV9yZXMucmVtdF9uYW1lX25vdF9yZXF1aXJlZCkKLSAgICAgIHBfaW5xX2luZm8tPmFwcGxfa25vd3NfcmVtX25hbWUgPSB0cnVlOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fb3Bwb3J0dW5pc3RpY19vYnNlcnZlX3Jlc3VsdHNfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxiYWNrIGZvciBCTEUgT2JzZXJ2ZSByZXN1bHQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9vcHBvcnR1bmlzdGljX29ic2VydmVfcmVzdWx0c19jYih0QlRNX0lOUV9SRVNVTFRTKiBwX2lucSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2VpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlaXJfbGVuKSB7Ci0gIHRCVEFfRE1fU0VBUkNIIHJlc3VsdDsKLSAgdEJUTV9JTlFfSU5GTyogcF9pbnFfaW5mbzsKLQotICByZXN1bHQuaW5xX3Jlcy5iZF9hZGRyID0gcF9pbnEtPnJlbW90ZV9iZF9hZGRyOwotICByZXN1bHQuaW5xX3Jlcy5yc3NpID0gcF9pbnEtPnJzc2k7Ci0gIHJlc3VsdC5pbnFfcmVzLmJsZV9hZGRyX3R5cGUgPSBwX2lucS0+YmxlX2FkZHJfdHlwZTsKLSAgcmVzdWx0LmlucV9yZXMuaW5xX3Jlc3VsdF90eXBlID0gcF9pbnEtPmlucV9yZXN1bHRfdHlwZTsKLSAgcmVzdWx0LmlucV9yZXMuZGV2aWNlX3R5cGUgPSBwX2lucS0+ZGV2aWNlX3R5cGU7Ci0gIHJlc3VsdC5pbnFfcmVzLmZsYWcgPSBwX2lucS0+ZmxhZzsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX2V2dF90eXBlID0gcF9pbnEtPmJsZV9ldnRfdHlwZTsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3ByaW1hcnlfcGh5ID0gcF9pbnEtPmJsZV9wcmltYXJ5X3BoeTsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3NlY29uZGFyeV9waHkgPSBwX2lucS0+YmxlX3NlY29uZGFyeV9waHk7Ci0gIHJlc3VsdC5pbnFfcmVzLmJsZV9hZHZlcnRpc2luZ19zaWQgPSBwX2lucS0+YmxlX2FkdmVydGlzaW5nX3NpZDsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3R4X3Bvd2VyID0gcF9pbnEtPmJsZV90eF9wb3dlcjsKLSAgcmVzdWx0LmlucV9yZXMuYmxlX3BlcmlvZGljX2Fkdl9pbnQgPSBwX2lucS0+YmxlX3BlcmlvZGljX2Fkdl9pbnQ7Ci0KLSAgLyogYXBwbGljYXRpb24gd2lsbCBwYXJzZSBFSVIgdG8gZmluZCBvdXQgcmVtb3RlIGRldmljZSBuYW1lICovCi0gIHJlc3VsdC5pbnFfcmVzLnBfZWlyID0gY29uc3RfY2FzdDx1aW50OF90Kj4ocF9laXIpOwotICByZXN1bHQuaW5xX3Jlcy5laXJfbGVuID0gZWlyX2xlbjsKLQotICBwX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChwX2lucS0+cmVtb3RlX2JkX2FkZHIpOwotICBpZiAocF9pbnFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgLyogaW5pdGlhbGl6ZSByZW10X25hbWVfbm90X3JlcXVpcmVkIHRvIGZhbHNlIHNvIHRoYXQgd2UgZ2V0IHRoZSBuYW1lIGJ5Ci0gICAgICogZGVmYXVsdCAqLwotICAgIHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQgPSBmYWxzZTsKLSAgfQotCi0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfY3Npc19zY2FuX2NiYWNrKQotICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9jc2lzX3NjYW5fY2JhY2soQlRBX0RNX0lOUV9SRVNfRVZULCAmcmVzdWx0KTsKLQotICBpZiAocF9pbnFfaW5mbykgewotICAgIC8qIGFwcGxpY2F0aW9uIGluZGljYXRlcyBpZiBpdCBrbm93cyB0aGUgcmVtb3RlIG5hbWUsIGluc2lkZSB0aGUgY2FsbGJhY2sKLSAgICAgY29weSB0aGF0IHRvIHRoZSBpbnF1aXJ5IGRhdGEgYmFzZSovCi0gICAgaWYgKHJlc3VsdC5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQpCi0gICAgICBwX2lucV9pbmZvLT5hcHBsX2tub3dzX3JlbV9uYW1lID0gdHJ1ZTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX29ic2VydmVfY21wbF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgZm9yIEJMRSBPYnNlcnZlIGNvbXBsZXRlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fb2JzZXJ2ZV9jbXBsX2NiKHZvaWQqIHBfcmVzdWx0KSB7Ci0gIHRCVEFfRE1fU0VBUkNIIGRhdGE7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2RtX29ic2VydmVfY21wbF9jYiIpOwotCi0gIGRhdGEuaW5xX2NtcGwubnVtX3Jlc3BzID0gKCh0QlRNX0lOUVVJUllfQ01QTCopcF9yZXN1bHQpLT5udW1fcmVzcDsKLSAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IucF9zY2FuX2NiYWNrKSB7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi5wX3NjYW5fY2JhY2soQlRBX0RNX0lOUV9DTVBMX0VWVCwgJmRhdGEpOwotICB9Ci0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfY3Npc19zY2FuX2NiYWNrKSB7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi5wX2NzaXNfc2Nhbl9jYmFjayhCVEFfRE1fSU5RX0NNUExfRVZULCAmZGF0YSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYmxlX2lvX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRNX0lPX0NBUCogcF9pb19jYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIHRCVE1fT09CX0RBVEEqIHBfb29iX2RhdGEsIHRCVE1fTEVfQVVUSF9SRVEqIHBfYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbWF4X2tleV9zaXplLCB0QlRNX0xFX0tFWV9UWVBFKiBwX2luaXRfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFKiBwX3Jlc3Bfa2V5KSB7Ci0gIGJ0ZV9hcHBsX2NmZy5ibGVfaW9fY2FwID0gYnRpZl9zdG9yYWdlX2dldF9sb2NhbF9pb19jYXBzX2JsZSgpOwotCi0gIC8qIFJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIGZyb20gZmlsZSBzeXN0ZW0gaWYgcG9zc2libGUgKi8KLSAgdEJURV9BUFBMX0NGRyBudl9jb25maWc7Ci0gIGlmIChidGlmX2RtX2dldF9zbXBfY29uZmlnKCZudl9jb25maWcpKSBidGVfYXBwbF9jZmcgPSBudl9jb25maWc7Ci0KLSAgLyogKnBfYXV0aF9yZXEgYnkgZGVmYXVsdCBpcyBmYWxzZSBmb3IgZGV2aWNlcyB3aXRoIE5vSW5wdXROb091dHB1dDsgdHJ1ZSBmb3IKLSAgICogb3RoZXIgZGV2aWNlcy4gKi8KLQotICBpZiAoYnRlX2FwcGxfY2ZnLmJsZV9hdXRoX3JlcSkKLSAgICAqcF9hdXRoX3JlcSA9IGJ0ZV9hcHBsX2NmZy5ibGVfYXV0aF9yZXEgfAotICAgICAgICAgICAgICAgICAgKGJ0ZV9hcHBsX2NmZy5ibGVfYXV0aF9yZXEgJiAweDA0KSB8ICgoKnBfYXV0aF9yZXEpICYgMHgwNCk7Ci0KLSAgLyogaWYgT09CIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgY2FsbC1vdXQgZnVuY3Rpb24gZG9lcyBub3QgbmVlZCB0byBkbwotICAgKiBhbnl0aGluZwotICAgKiBvdGhlcndpc2UsIGxvb2sgZm9yIHRoZSBPT0IgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MgYW5kIHNldAotICAgKiAqcF9vb2JfZGF0YSBhY2NvcmRpbmdseS4KLSAgICogSWYgdGhlIGFuc3dlciBjYW4gbm90IGJlIG9idGFpbmVkIHJpZ2h0IGF3YXksCi0gICAqIHNldCAqcF9vb2JfZGF0YSB0byBCVEFfT09CX1VOS05PV04gYW5kIGNhbGwgYnRhX2RtX2NpX2lvX3JlcSgpIHdoZW4gdGhlCi0gICAqIGFuc3dlciBpcyBhdmFpbGFibGUuCi0gICAqLwotCi0gIGJ0aWZfZG1fc2V0X29vYl9mb3JfbGVfaW9fcmVxKGJkX2FkZHIsIHBfb29iX2RhdGEsIHBfYXV0aF9yZXEpOwotCi0gIGlmIChidGVfYXBwbF9jZmcuYmxlX2lvX2NhcCA8PSA0KSAqcF9pb19jYXAgPSBidGVfYXBwbF9jZmcuYmxlX2lvX2NhcDsKLQotICBpZiAoYnRlX2FwcGxfY2ZnLmJsZV9pbml0X2tleSA8PSBCVE1fQkxFX0lOSVRJQVRPUl9LRVlfU0laRSkKLSAgICAqcF9pbml0X2tleSA9IGJ0ZV9hcHBsX2NmZy5ibGVfaW5pdF9rZXk7Ci0KLSAgaWYgKGJ0ZV9hcHBsX2NmZy5ibGVfcmVzcF9rZXkgPD0gQlRNX0JMRV9SRVNQT05ERVJfS0VZX1NJWkUpCi0gICAgKnBfcmVzcF9rZXkgPSBidGVfYXBwbF9jZmcuYmxlX3Jlc3Bfa2V5OwotCi0gIGlmIChidGVfYXBwbF9jZmcuYmxlX21heF9rZXlfc2l6ZSA+IDcgJiYgYnRlX2FwcGxfY2ZnLmJsZV9tYXhfa2V5X3NpemUgPD0gMTYpCi0gICAgKnBfbWF4X2tleV9zaXplID0gYnRlX2FwcGxfY2ZnLmJsZV9tYXhfa2V5X3NpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fYmxlX3NtcF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgZm9yIEJMRSBTTVAKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGJ0YV9kbV9ibGVfc21wX2NiYWNrKHRCVE1fTEVfRVZUIGV2ZW50LCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0VWVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX1NVQ0NFU1M7Ci0gIHRCVEFfRE1fU0VDIHNlY19ldmVudDsKLSAgY2hhciogcF9uYW1lID0gTlVMTDsKLQotICBpZiAoIWJ0YV9kbV9jYi5wX3NlY19jYmFjaykgcmV0dXJuIEJUTV9OT1RfQVVUSE9SSVpFRDsKLQotICBtZW1zZXQoJnNlY19ldmVudCwgMCwgc2l6ZW9mKHRCVEFfRE1fU0VDKSk7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUTV9MRV9JT19SRVFfRVZUOgotICAgICAgYmxlX2lvX3JlcShiZGEsICZwX2RhdGEtPmlvX3JlcS5pb19jYXAsICZwX2RhdGEtPmlvX3JlcS5vb2JfZGF0YSwKLSAgICAgICAgICAgICAgICAgJnBfZGF0YS0+aW9fcmVxLmF1dGhfcmVxLCAmcF9kYXRhLT5pb19yZXEubWF4X2tleV9zaXplLAotICAgICAgICAgICAgICAgICAmcF9kYXRhLT5pb19yZXEuaW5pdF9rZXlzLCAmcF9kYXRhLT5pb19yZXEucmVzcF9rZXlzKTsKLSAgICAgIEFQUExfVFJBQ0VfRVZFTlQoImlvIG1pdG06ICVkIG9vYl9kYXRhOiVkIiwgcF9kYXRhLT5pb19yZXEuYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aW9fcmVxLm9vYl9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fTEVfQ09OU0VOVF9SRVFfRVZUOgotICAgICAgc2VjX2V2ZW50LmJsZV9yZXEuYmRfYWRkciA9IGJkYTsKLSAgICAgIHBfbmFtZSA9IEJUTV9TZWNSZWFkRGV2TmFtZShiZGEpOwotICAgICAgaWYgKHBfbmFtZSAhPSBOVUxMKQotICAgICAgICBzdHJsY3B5KChjaGFyKilzZWNfZXZlbnQuYmxlX3JlcS5iZF9uYW1lLCBwX25hbWUsIEJEX05BTUVfTEVOKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VjX2V2ZW50LmJsZV9yZXEuYmRfbmFtZVswXSA9IDA7Ci0gICAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soQlRBX0RNX0JMRV9DT05TRU5UX1JFUV9FVlQsICZzZWNfZXZlbnQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9MRV9TRUNfUkVRVUVTVF9FVlQ6Ci0gICAgICBzZWNfZXZlbnQuYmxlX3JlcS5iZF9hZGRyID0gYmRhOwotICAgICAgcF9uYW1lID0gKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgID8gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVhZERldk5hbWUoYmRhKQotICAgICAgICAgICAgICAgICAgIDogQlRNX1NlY1JlYWREZXZOYW1lKGJkYSk7Ci0gICAgICBpZiAocF9uYW1lICE9IE5VTEwpCi0gICAgICAgIHN0cmxjcHkoKGNoYXIqKXNlY19ldmVudC5ibGVfcmVxLmJkX25hbWUsIHBfbmFtZSwgQkRfTkFNRV9MRU4gKyAxKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VjX2V2ZW50LmJsZV9yZXEuYmRfbmFtZVswXSA9IDA7Ci0gICAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soQlRBX0RNX0JMRV9TRUNfUkVRX0VWVCwgJnNlY19ldmVudCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX0xFX0tFWV9OT1RJRl9FVlQ6Ci0gICAgICBzZWNfZXZlbnQua2V5X25vdGlmLmJkX2FkZHIgPSBiZGE7Ci0gICAgICBwX25hbWUgPSAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgPyBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNSZWFkRGV2TmFtZShiZGEpCi0gICAgICAgICAgICAgICAgICAgOiBCVE1fU2VjUmVhZERldk5hbWUoYmRhKTsKLSAgICAgIGlmIChwX25hbWUgIT0gTlVMTCkKLSAgICAgICAgc3RybGNweSgoY2hhciopc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9uYW1lLCBwX25hbWUsIEJEX05BTUVfTEVOICsgMSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNlY19ldmVudC5rZXlfbm90aWYuYmRfbmFtZVswXSA9IDA7Ci0gICAgICBzZWNfZXZlbnQua2V5X25vdGlmLnBhc3NrZXkgPSBwX2RhdGEtPmtleV9ub3RpZjsKLSAgICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fQkxFX1BBU1NLRVlfTk9USUZfRVZULCAmc2VjX2V2ZW50KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fTEVfS0VZX1JFUV9FVlQ6Ci0gICAgICBzZWNfZXZlbnQuYmxlX3JlcS5iZF9hZGRyID0gYmRhOwotICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9CTEVfUEFTU0tFWV9SRVFfRVZULCAmc2VjX2V2ZW50KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fTEVfT09CX1JFUV9FVlQ6Ci0gICAgICBzZWNfZXZlbnQuYmxlX3JlcS5iZF9hZGRyID0gYmRhOwotICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9CTEVfT09CX1JFUV9FVlQsICZzZWNfZXZlbnQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9MRV9OQ19SRVFfRVZUOgotICAgICAgc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9hZGRyID0gYmRhOwotICAgICAgc3RybGNweSgoY2hhciopc2VjX2V2ZW50LmtleV9ub3RpZi5iZF9uYW1lLCBidGFfZG1fZ2V0X3JlbW5hbWUoKSwKLSAgICAgICAgICAgICAgKEJEX05BTUVfTEVOICsgMSkpOwotICAgICAgc2VjX2V2ZW50LmtleV9ub3RpZi5wYXNza2V5ID0gcF9kYXRhLT5rZXlfbm90aWY7Ci0gICAgICBidGFfZG1fY2IucF9zZWNfY2JhY2soQlRBX0RNX0JMRV9OQ19SRVFfRVZULCAmc2VjX2V2ZW50KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fTEVfU0NfT09CX1JFUV9FVlQ6Ci0gICAgICBzZWNfZXZlbnQuYmxlX3JlcS5iZF9hZGRyID0gYmRhOwotICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9CTEVfU0NfT09CX1JFUV9FVlQsICZzZWNfZXZlbnQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9MRV9TQ19MT0NfT09CX0VWVDoKLSAgICAgIHRCVEFfRE1fTE9DX09PQl9EQVRBIGxvY2FsX29vYl9kYXRhOwotICAgICAgbG9jYWxfb29iX2RhdGEubG9jYWxfb29iX2MgPSBwX2RhdGEtPmxvY2FsX29vYl9kYXRhLmNvbW1pdG1lbnQ7Ci0gICAgICBsb2NhbF9vb2JfZGF0YS5sb2NhbF9vb2JfciA9IHBfZGF0YS0+bG9jYWxfb29iX2RhdGEucmFuZG9taXplcjsKLSAgICAgIHNlY19ldmVudC5sb2NhbF9vb2JfZGF0YSA9IGxvY2FsX29vYl9kYXRhOwotICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9CTEVfU0NfQ1JfTE9DX09PQl9FVlQsICZzZWNfZXZlbnQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9MRV9LRVlfRVZUOgotICAgICAgc2VjX2V2ZW50LmJsZV9rZXkuYmRfYWRkciA9IGJkYTsKLSAgICAgIHNlY19ldmVudC5ibGVfa2V5LmtleV90eXBlID0gcF9kYXRhLT5rZXkua2V5X3R5cGU7Ci0gICAgICBzZWNfZXZlbnQuYmxlX2tleS5wX2tleV92YWx1ZSA9IHBfZGF0YS0+a2V5LnBfa2V5X3ZhbHVlOwotICAgICAgYnRhX2RtX2NiLnBfc2VjX2NiYWNrKEJUQV9ETV9CTEVfS0VZX0VWVCwgJnNlY19ldmVudCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX0xFX0NPTVBMVF9FVlQ6Ci0gICAgICBzZWNfZXZlbnQuYXV0aF9jbXBsLmJkX2FkZHIgPSBiZGE7Ci0gICAgICBCVE1fUmVhZERldkluZm8oYmRhLCAmc2VjX2V2ZW50LmF1dGhfY21wbC5kZXZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAmc2VjX2V2ZW50LmF1dGhfY21wbC5hZGRyX3R5cGUpOwotICAgICAgcF9uYW1lID0gKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgID8gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVhZERldk5hbWUoYmRhKQotICAgICAgICAgICAgICAgICAgIDogQlRNX1NlY1JlYWREZXZOYW1lKGJkYSk7Ci0gICAgICBpZiAocF9uYW1lICE9IE5VTEwpCi0gICAgICAgIHN0cmxjcHkoKGNoYXIqKXNlY19ldmVudC5hdXRoX2NtcGwuYmRfbmFtZSwgcF9uYW1lLCAoQkRfTkFNRV9MRU4gKyAxKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuYmRfbmFtZVswXSA9IDA7Ci0KLSAgICAgIGlmIChwX2RhdGEtPmNvbXBsdC5yZWFzb24gIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgLy8gVE9ETyBUaGlzIGlzIG5vdCBhIHByb3BlciB1c2Ugb2YgdGhpcyB0eXBlCi0gICAgICAgIHNlY19ldmVudC5hdXRoX2NtcGwuZmFpbF9yZWFzb24gPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KEJUQV9ETV9BVVRIX0NPTlZFUlRfU01QX0NPREUoCi0gICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBfZGF0YS0+Y29tcGx0LnJlYXNvbikpKSk7Ci0KLSAgICAgICAgaWYgKGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KGJkYSkgJiYKLSAgICAgICAgICAgIHBfZGF0YS0+Y29tcGx0LnJlYXNvbiA9PSBTTVBfQ09OTl9UT1VUKSB7Ci0gICAgICAgICAgLy8gQm9uZGVkIGRldmljZSBmYWlsZWQgdG8gZW5jcnlwdCAtIHRvIHRlc3QgdGhpcyByZW1vdmUgYmF0dGVyeSBmcm9tCi0gICAgICAgICAgLy8gSElEIGRldmljZSByaWdodCBhZnRlciBjb25uZWN0aW9uLCBidXQgYmVmb3JlIGVuY3J5cHRpb24gaXMKLSAgICAgICAgICAvLyBlc3RhYmxpc2hlZAotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICA8PCAiOiBib25kZWQgZGV2aWNlIGRpc2Nvbm5lY3RlZCB3aGVuIGVuY3J5cHRpbmcgLSBubyAiCi0gICAgICAgICAgICAgICAgICAgICAgICJyZWFzb24gdG8gdW5ib25kIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBkZWxldGUgdGhpcyBkZXZpY2UgZW50cnkgZnJvbSBTZWMgRGV2IERCICovCi0gICAgICAgICAgYnRhX2RtX3JlbW92ZV9zZWNfZGV2X2VudHJ5KGJkYSk7Ci0gICAgICAgIH0KLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VjX2V2ZW50LmF1dGhfY21wbC5zdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFwX2RhdGEtPmNvbXBsdC5zbXBfb3Zlcl9icikKLSAgICAgICAgICBHQVRUX0NvbmZpZ1NlcnZpY2VDaGFuZ2VDQ0MoYmRhLCB0cnVlLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgICAgfQotCi0gICAgICBpZiAoYnRhX2RtX2NiLnBfc2VjX2NiYWNrKSB7Ci0gICAgICAgIC8vIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fQVVUSF9DTVBMX0VWVCwgJnNlY19ldmVudCk7Ci0gICAgICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fQkxFX0FVVEhfQ01QTF9FVlQsICZzZWNfZXZlbnQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3RhdHVzID0gQlRNX05PVF9BVVRIT1JJWkVEOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9ibGVfaWRfa2V5X2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsYmFjayBmb3IgQkxFIGxvY2FsIElEIGtleXMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9ibGVfaWRfa2V5X2NiYWNrKHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9MT0NBTF9LRVlTKiBwX2tleSkgewotICBzd2l0Y2ggKGtleV90eXBlKSB7Ci0gICAgY2FzZSBCVE1fQkxFX0tFWV9UWVBFX0lEOgotICAgIGNhc2UgQlRNX0JMRV9LRVlfVFlQRV9FUjoKLSAgICAgIGlmIChidGFfZG1fY2IucF9zZWNfY2JhY2spIHsKLSAgICAgICAgdEJUQV9ETV9TRUMgZG1fa2V5ID0gewotICAgICAgICAgICAgLmJsZV9pZF9rZXlzID0ge30sCi0gICAgICAgIH07Ci0gICAgICAgIG1lbWNweSgmZG1fa2V5LmJsZV9pZF9rZXlzLCBwX2tleSwgc2l6ZW9mKHRCVE1fQkxFX0xPQ0FMX0tFWVMpKTsKLQotICAgICAgICB1aW50OF90IGV2dCA9IChrZXlfdHlwZSA9PSBCVE1fQkxFX0tFWV9UWVBFX0lEKQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJUQV9ETV9CTEVfTE9DQUxfSVJfRVZUCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogQlRBX0RNX0JMRV9MT0NBTF9FUl9FVlQ7Ci0gICAgICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhldnQsICZkbV9rZXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiVW5rbm93biBrZXkgdHlwZSAlZCIsIGtleV90eXBlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9hZGRfYmxla2V5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gQkxFIEtleSB0byBhbiBzZWN1cml0eSBkYXRhYmFzZSBlbnRyeS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzaGFsbCBvbmx5IGJlIGNhbGxlZCBBRlRFUiBCVEFfRG1BZGRCbGVEZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gY2FsbGVkLgotICogICAgICAgICAgICAgICAgICBJdCBpcyBub3JtYWxseSBjYWxsZWQgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbAotICogICAgICAgICAgICAgICAgICByZXF1aXJlZCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2FkZF9ibGVrZXkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9MRV9LRVlfVkFMVUUgYmxla2V5LAotICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFIGtleV90eXBlKSB7Ci0gIEJUTV9TZWNBZGRCbGVLZXkoYmRfYWRkciwgKHRCVE1fTEVfS0VZX1ZBTFVFKikmYmxla2V5LCBrZXlfdHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fYWRkX2JsZV9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBCTEUgZGV2aWNlIHRvIGFuIHNlY3VyaXR5IGRhdGFiYXNlCi0gKiAgICAgICAgICAgICAgICAgIGVudHJ5LgotICogICAgICAgICAgICAgICAgICBJdCBpcyBub3JtYWxseSBjYWxsZWQgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbAotICogICAgICAgICAgICAgICAgICByZXF1aXJlZCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2FkZF9ibGVfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9ERVZJQ0VfVFlQRSBkZXZfdHlwZSkgewotICBCVE1fU2VjQWRkQmxlRGV2aWNlKGJkX2FkZHIsIGRldl90eXBlLCBhZGRyX3R5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2FkZF9ibGVfZGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gQkxFIGRldmljZSB0byBhbiBzZWN1cml0eSBkYXRhYmFzZQotICogICAgICAgICAgICAgICAgICBlbnRyeS4KLSAqICAgICAgICAgICAgICAgICAgSXQgaXMgbm9ybWFsbHkgY2FsbGVkIGR1cmluZyBob3N0IHN0YXJ0dXAgdG8gcmVzdG9yZSBhbGwKLSAqICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9ibGVfcGFzc2tleV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgQlRNX0JsZVBhc3NrZXlSZXBseShiZF9hZGRyLCBhY2NlcHQgPyBCVE1fU1VDQ0VTUyA6IEJUTV9OT1RfQVVUSE9SSVpFRCwKLSAgICAgICAgICAgICAgICAgICAgICBwYXNza2V5KTsKLX0KLQotLyoqIFRoaXMgaXMgcmVzcG9uc2UgdG8gU00gbnVtZXJpYyBjb21wYXJpc29uIHJlcXVlc3Qgc3VibWl0dGVkIHRvIGFwcGxpY2F0aW9uLgotICovCi12b2lkIGJ0YV9kbV9ibGVfY29uZmlybV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCkgewotICBCVE1fQmxlQ29uZmlybVJlcGx5KGJkX2FkZHIsIGFjY2VwdCA/IEJUTV9TVUNDRVNTIDogQlRNX05PVF9BVVRIT1JJWkVEKTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBwcmVmZXJyZWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzICovCi12b2lkIGJ0YV9kbV9ibGVfc2V0X2Nvbm5fcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50X21pbiwgdWludDE2X3QgY29ubl9pbnRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQpIHsKLSAgTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzKCZjb25uX2ludF9taW4sICZjb25uX2ludF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX0NPTk5fSU5UX01JTik7Ci0KLSAgQlRNX0JsZVNldFByZWZDb25uUGFyYW1zKGJkX2FkZHIsIGNvbm5faW50X21pbiwgY29ubl9pbnRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbF9sYXRlbmN5LCBzdXBlcnZpc2lvbl90b3V0KTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gdXBkYXRlIExFIGNvbm5lY3Rpb24gcGFyYW1ldGVycyAqLwotdm9pZCBidGFfZG1fYmxlX3VwZGF0ZV9jb25uX3BhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfaW50LCB1aW50MTZfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIEwyQ0FfQWRqdXN0Q29ubmVjdGlvbkludGVydmFscygmbWluX2ludCwgJm1heF9pbnQsIEJUTV9CTEVfQ09OTl9JTlRfTUlOKTsKLQotICBpZiAoIUwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcyhiZF9hZGRyLCBtaW5faW50LCBtYXhfaW50LCBsYXRlbmN5LCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fY2VfbGVuLCBtYXhfY2VfbGVuKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIlVwZGF0ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZmFpbGVkISIpOwotICB9Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgbG9jYWwgZGV2aWNlIExFIHByaXZhY3kgc2V0dGluZ3MuICovCi12b2lkIGJ0YV9kbV9ibGVfY29uZmlnX2xvY2FsX3ByaXZhY3koYm9vbCBwcml2YWN5X2VuYWJsZSkgewotICBCVE1fQmxlQ29uZmlnUHJpdmFjeShwcml2YWN5X2VuYWJsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9kbV9zdGFydF9zY2FuKHVpbnQ4X3QgZHVyYXRpb25fc2VjKSB7Ci0gIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9CbGVPYnNlcnZlKAotICAgICAgdHJ1ZSwgZHVyYXRpb25fc2VjLCBidGFfZG1fb2JzZXJ2ZV9yZXN1bHRzX2NiLCBidGFfZG1fb2JzZXJ2ZV9jbXBsX2NiKTsKLQotICBpZiAoc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkgewotICAgIHRCVEFfRE1fU0VBUkNIIGRhdGEgPSB7Ci0gICAgICAgIC5pbnFfY21wbCA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm51bV9yZXNwcyA9IDAsCi0gICAgICAgICAgICB9LAotICAgIH07Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIgJXMgQlRNX0JsZU9ic2VydmUgIGZhaWxlZC4gc3RhdHVzICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2IucF9zY2FuX2NiYWNrKSB7Ci0gICAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2Nhbl9jYmFjayhCVEFfRE1fSU5RX0NNUExfRVZULCAmZGF0YSk7Ci0gICAgfQotICAgIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfY3Npc19zY2FuX2NiYWNrKSB7Ci0gICAgICBidGFfZG1fc2VhcmNoX2NiLnBfY3Npc19zY2FuX2NiYWNrKEJUQV9ETV9JTlFfQ01QTF9FVlQsICZkYXRhKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBidGFfZG1fYmxlX29ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGlmICghc3RhcnQpIHsKLSAgICBidGFfZG1fc2VhcmNoX2NiLnBfc2Nhbl9jYmFjayA9IE5VTEw7Ci0gICAgQlRNX0JsZU9ic2VydmUoZmFsc2UsIDAsIE5VTEwsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qU2F2ZSB0aGUgIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgc2NhbiByZXN1bHRzIGFyZSBhdmFpbGFibGUgKi8KLSAgYnRhX2RtX3NlYXJjaF9jYi5wX3NjYW5fY2JhY2sgPSBwX2NiYWNrOwotICBidGFfZG1fc3RhcnRfc2NhbihkdXJhdGlvbik7Ci19Ci0KLXZvaWQgYnRhX2RtX2JsZV9zY2FuKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb25fc2VjKSB7Ci0gIC8qIFN0YXJ0IG9yIHN0b3Agb25seSBpZiB0aGVyZSBpcyBubyBhY3RpdmUgbWFpbiBzY2FubmVyICovCi0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBfc2Nhbl9jYmFjayAhPSBOVUxMKSByZXR1cm47Ci0KLSAgaWYgKCFzdGFydCkgewotICAgIEJUTV9CbGVPYnNlcnZlKGZhbHNlLCAwLCBOVUxMLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfZG1fc3RhcnRfc2NhbihkdXJhdGlvbl9zZWMpOwotfQotCi12b2lkIGJ0YV9kbV9ibGVfY3Npc19vYnNlcnZlKGJvb2wgb2JzZXJ2ZSwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgaWYgKCFvYnNlcnZlKSB7Ci0gICAgYnRhX2RtX3NlYXJjaF9jYi5wX2NzaXNfc2Nhbl9jYmFjayA9IE5VTEw7Ci0gICAgQlRNX0JsZU9wcG9ydHVuaXN0aWNPYnNlcnZlKGZhbHNlLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBTYXZlIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIHNjYW4gcmVzdWx0cyBhcmUgYXZhaWxhYmxlICovCi0gIGJ0YV9kbV9zZWFyY2hfY2IucF9jc2lzX3NjYW5fY2JhY2sgPSBwX2NiYWNrOwotICBCVE1fQmxlT3Bwb3J0dW5pc3RpY09ic2VydmUodHJ1ZSwgYnRhX2RtX29wcG9ydHVuaXN0aWNfb2JzZXJ2ZV9yZXN1bHRzX2NiKTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBtYXhpbXVtIHRyYW5zbWlzc2lvbiBwYWNrZXQgc2l6ZSAqLwotdm9pZCBidGFfZG1fYmxlX3NldF9kYXRhX2xlbmd0aChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlciA9IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpOwotICB1aW50MTZfdCBtYXhfbGVuID0gY29udHJvbGxlci0+Z2V0X2JsZV9tYXhpbXVtX3R4X2RhdGFfbGVuZ3RoKCk7Ci0KLSAgaWYgKEJUTV9TZXRCbGVEYXRhTGVuZ3RoKGJkX2FkZHIsIG1heF9sZW4pICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgTE9HX0lORk8oIlVuYWJsZSB0byBzZXQgYmxlIGRhdGEgbGVuZ3RoOiVodSIsIG1heF9sZW4pOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYmxlX2VuYWJsZV9zY2FuX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFEViBwYXlsb2FkIGZpbHRlcmluZyBlbmFibGUgLyBkaXNhYmxlIGNvbXBsZXRlIGNhbGxiYWNrCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfYmxlX2VuZXJneV9pbmZvX2NtcGwodEJUTV9CTEVfVFhfVElNRV9NUyB0eF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1JYX1RJTUVfTVMgcnhfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9JRExFX1RJTUVfTVMgaWRsZV90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0VORVJHWV9VU0VEIGVuZXJneV91c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICB0QlRBX1NUQVRVUyBzdCA9IChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpID8gQlRBX1NVQ0NFU1MgOiBCVEFfRkFJTFVSRTsKLSAgdEJUTV9DT05UUkxfU1RBVEUgY3RybF9zdGF0ZSA9IEJUTV9DT05UUkxfVU5LTk9XTjsKLQotICBpZiAoQlRBX1NVQ0NFU1MgPT0gc3QpIGN0cmxfc3RhdGUgPSBidGFfZG1fcG1fb2J0YWluX2NvbnRyb2xsZXJfc3RhdGUoKTsKLQotICBpZiAoYnRhX2RtX2NiLnBfZW5lcmd5X2luZm9fY2JhY2spCi0gICAgYnRhX2RtX2NiLnBfZW5lcmd5X2luZm9fY2JhY2sodHhfdGltZSwgcnhfdGltZSwgaWRsZV90aW1lLCBlbmVyZ3lfdXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsX3N0YXRlLCBzdCk7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIG9idGFpbnMgdGhlIGVuZXJneSBpbmZvICovCi12b2lkIGJ0YV9kbV9ibGVfZ2V0X2VuZXJneV9pbmZvKAotICAgIHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBwX2VuZXJneV9pbmZvX2NiYWNrKSB7Ci0gIGJ0YV9kbV9jYi5wX2VuZXJneV9pbmZvX2NiYWNrID0gcF9lbmVyZ3lfaW5mb19jYmFjazsKLSAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1cyA9IEJUTV9CbGVHZXRFbmVyZ3lJbmZvKGJ0YV9ibGVfZW5lcmd5X2luZm9fY21wbCk7Ci0gIGlmIChidG1fc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkKLSAgICBidGFfYmxlX2VuZXJneV9pbmZvX2NtcGwoMCwgMCwgMCwgMCwgSENJX0VSUl9VTlNQRUNJRklFRCk7Ci19Ci0KLSNpZm5kZWYgQlRBX0RNX0dBVFRfQ0xPU0VfREVMQVlfVE9VVAotI2RlZmluZSBCVEFfRE1fR0FUVF9DTE9TRV9ERUxBWV9UT1VUIDEwMDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2dhdHRjX3JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlciB3aXRoIEdBVFRDIGluIERNIGlmIEJMRSBpcyBuZWVkZWQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fZ2F0dGNfcmVnaXN0ZXIodm9pZCkgewotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5jbGllbnRfaWYgPT0gQlRBX0dBVFRTX0lOVkFMSURfSUYpIHsKLSAgICBCVEFfR0FUVENfQXBwUmVnaXN0ZXIoYnRhX2RtX2dhdHRjX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKFtdKHVpbnQ4X3QgY2xpZW50X2lkLCB1aW50OF90IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5jbGllbnRfaWYgPSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5jbGllbnRfaWYgPSBCVEFfR0FUVFNfSU5WQUxJRF9JRjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fZ2F0dF9kaXNjX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIEdBVFQgc2VydmljZSBzZWFyY2ggY29tcGxldGUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2dhdHRfZGlzY19jb21wbGV0ZSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIGNvbm5faWQgPSAlZCIsIF9fZnVuY19fLCBjb25uX2lkKTsKLQotICB0QlRBX0RNX01TRyogcF9tc2cgPSAodEJUQV9ETV9NU0cqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfRE1fTVNHKSk7Ci0KLSAgLyogbm8gbW9yZSBzZXJ2aWNlcyB0byBiZSBkaXNjb3ZlcmVkICovCi0gIHBfbXNnLT5oZHIuZXZlbnQgPSBCVEFfRE1fRElTQ09WRVJZX1JFU1VMVF9FVlQ7Ci0gIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMucmVzdWx0ID0KLSAgICAgIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSA/IEJUQV9TVUNDRVNTIDogQlRBX0ZBSUxVUkU7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIHNlcnZpY2UgZm91bmQ6IDB4JTA4eCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY2Iuc2VydmljZXNfZm91bmQpOwotICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnNlcnZpY2VzID0gYnRhX2RtX3NlYXJjaF9jYi5zZXJ2aWNlc19mb3VuZDsKLSAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5udW1fdXVpZHMgPSAwOwotICBwX21zZy0+ZGlzY19yZXN1bHQucmVzdWx0LmRpc2NfcmVzLnBfdXVpZF9saXN0ID0gTlVMTDsKLSAgcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9hZGRyID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKLSAgc3RybGNweSgoY2hhciopcF9tc2ctPmRpc2NfcmVzdWx0LnJlc3VsdC5kaXNjX3Jlcy5iZF9uYW1lLAotICAgICAgICAgIGJ0YV9kbV9nZXRfcmVtbmFtZSgpLCBCRF9OQU1FX0xFTiArIDEpOwotCi0gIHBfbXNnLT5kaXNjX3Jlc3VsdC5yZXN1bHQuZGlzY19yZXMuZGV2aWNlX3R5cGUgfD0gQlRfREVWSUNFX1RZUEVfQkxFOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci0KLSAgaWYgKGNvbm5faWQgIT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHsKLSAgICAvKiBzdGFydCBhIEdBVFQgY2hhbm5lbCBjbG9zZSBkZWxheSB0aW1lciAqLwotICAgIGJ0YV9zeXNfc3RhcnRfdGltZXIoYnRhX2RtX3NlYXJjaF9jYi5nYXR0X2Nsb3NlX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0RNX0dBVFRfQ0xPU0VfREVMQVlfVE9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9ETV9ESVNDX0NMT1NFX1RPVVRfRVZULCAwKTsKLSAgICBidGFfZG1fc2VhcmNoX2NiLnBlbmRpbmdfY2xvc2VfYmRhID0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcjsKLSAgfQotICBidGFfZG1fc2VhcmNoX2NiLmdhdHRfZGlzY19hY3RpdmUgPSBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jbG9zZV9nYXR0X2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2UgdGhlIEdBVFQgY29ubmVjdGlvbiBhZnRlciBkZWxheQotICp0aW1lb3V0LgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2Nsb3NlX2dhdHRfY29ubihVTlVTRURfQVRUUiB0QlRBX0RNX01TRyogcF9kYXRhKSB7Ci0gIGlmIChidGFfZG1fc2VhcmNoX2NiLmNvbm5faWQgIT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpCi0gICAgQlRBX0dBVFRDX0Nsb3NlKGJ0YV9kbV9zZWFyY2hfY2IuY29ubl9pZCk7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jYi5wZW5kaW5nX2Nsb3NlX2JkYSA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgYnRhX2RtX3NlYXJjaF9jYi5jb25uX2lkID0gR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2RtX3N0YXJ0X2dhdHRfZGlzY292ZXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIEdBVFQgaW5pdGlhdGUgdGhlIHNlcnZpY2Ugc2VhcmNoIGJ5IG9wZW4gYSBHQVRUCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gZmlyc3QuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fZG1fc3RhcnRfZ2F0dF9kaXNjb3ZlcnkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBidGFfZG1fc2VhcmNoX2NiLmdhdHRfZGlzY19hY3RpdmUgPSB0cnVlOwotCi0gIC8qIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBvcGVuICovCi0gIGlmIChidGFfZG1fc2VhcmNoX2NiLnBlbmRpbmdfY2xvc2VfYmRhID09IGJkX2FkZHIgJiYKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2IuY29ubl9pZCAhPSBHQVRUX0lOVkFMSURfQ09OTl9JRCkgewotICAgIGJ0YV9kbV9zZWFyY2hfY2IucGVuZGluZ19jbG9zZV9iZGEgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgYWxhcm1fY2FuY2VsKGJ0YV9kbV9zZWFyY2hfY2IuZ2F0dF9jbG9zZV90aW1lcik7Ci0gICAgQlRBX0dBVFRDX1NlcnZpY2VTZWFyY2hSZXF1ZXN0KGJ0YV9kbV9zZWFyY2hfY2IuY29ubl9pZCwgbnVsbHB0cik7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKEJUTV9Jc0FjbENvbm5lY3Rpb25VcChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgICBCVEFfR0FUVENfT3BlbihidGFfZG1fc2VhcmNoX2NiLmNsaWVudF9pZiwgYmRfYWRkciwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUQV9HQVRUQ19PcGVuKGJ0YV9kbV9zZWFyY2hfY2IuY2xpZW50X2lmLCBiZF9hZGRyLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fY2FuY2VsX2dhdHRfZGlzY292ZXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIEdBVFQgY2FuY2VsIHRoZSBHQVRUIHNlcnZpY2Ugc2VhcmNoLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9jYW5jZWxfZ2F0dF9kaXNjb3ZlcnkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBpZiAoYnRhX2RtX3NlYXJjaF9jYi5jb25uX2lkID09IEdBVFRfSU5WQUxJRF9DT05OX0lEKSB7Ci0gICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oYnRhX2RtX3NlYXJjaF9jYi5jbGllbnRfaWYsIGJkX2FkZHIsIHRydWUpOwotICB9Ci0KLSAgYnRhX2RtX2dhdHRfZGlzY19jb21wbGV0ZShidGFfZG1fc2VhcmNoX2NiLmNvbm5faWQsICh0R0FUVF9TVEFUVVMpR0FUVF9FUlJPUik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcHJvY19vcGVuX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcHJvY2VzcyBCVEFfR0FUVENfT1BFTl9FVlQgaW4gRE0uCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fcHJvY19vcGVuX2V2dCh0QlRBX0dBVFRDX09QRU4qIHBfZGF0YSkgewotICBWTE9HKDEpIDw8ICJETSBTZWFyY2ggc3RhdGU9ICIgPDwgYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZQotICAgICAgICAgIDw8ICIgc2VhcmNoX2NiLnBlZXJfZGJhZGRyOiIgPDwgYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcgotICAgICAgICAgIDw8ICIgY29ubmVjdGVkX2JkYT0iIDw8IHBfZGF0YS0+cmVtb3RlX2JkYS5hZGRyZXNzOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIkJUQV9HQVRUQ19PUEVOX0VWVCBjb25uX2lkID0gJWQgY2xpZW50X2lmPSVkIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm5faWQsIHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnN0YXR1cyk7Ci0KLSAgYnRhX2RtX3NlYXJjaF9jYi5jb25uX2lkID0gcF9kYXRhLT5jb25uX2lkOwotCi0gIGlmIChwX2RhdGEtPnN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QocF9kYXRhLT5jb25uX2lkLCBudWxscHRyKTsKLSAgfSBlbHNlIHsKLSAgICBidGFfZG1fZ2F0dF9kaXNjX2NvbXBsZXRlKEdBVFRfSU5WQUxJRF9DT05OX0lELCBwX2RhdGEtPnN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9nYXR0Y19jYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBHQVRUIGNsaWVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGluIERNLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9nYXR0Y19jYWxsYmFjayBldmVudCA9ICVkIiwgZXZlbnQpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9HQVRUQ19PUEVOX0VWVDoKLSAgICAgIGJ0YV9kbV9wcm9jX29wZW5fZXZ0KCZwX2RhdGEtPm9wZW4pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TRUFSQ0hfUkVTX0VWVDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUOgotICAgICAgaWYgKGJ0YV9kbV9zZWFyY2hfY2Iuc3RhdGUgIT0gQlRBX0RNX1NFQVJDSF9JRExFKQotICAgICAgICBidGFfZG1fZ2F0dF9kaXNjX2NvbXBsZXRlKHBfZGF0YS0+c2VhcmNoX2NtcGwuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0NMT1NFX0VWVDoKLSAgICAgIExPR19ERUJVRygiQlRBX0dBVFRDX0NMT1NFX0VWVCByZWFzb24gPSAlZCIsIHBfZGF0YS0+Y2xvc2UucmVhc29uKTsKLSAgICAgIC8qIGluIGNhc2Ugb2YgZGlzY29ubmVjdCBiZWZvcmUgc2VhcmNoIGlzIGNvbXBsZXRlZCAqLwotICAgICAgaWYgKChidGFfZG1fc2VhcmNoX2NiLnN0YXRlICE9IEJUQV9ETV9TRUFSQ0hfSURMRSkgJiYKLSAgICAgICAgICAoYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZSAhPSBCVEFfRE1fU0VBUkNIX0FDVElWRSkgJiYKLSAgICAgICAgICBwX2RhdGEtPmNsb3NlLnJlbW90ZV9iZGEgPT0gYnRhX2RtX3NlYXJjaF9jYi5wZWVyX2JkYWRkcikgewotICAgICAgICBidGFfZG1fZ2F0dF9kaXNjX2NvbXBsZXRlKCh1aW50MTZfdClHQVRUX0lOVkFMSURfQ09OTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEdBVFRfU1RBVFVTKUdBVFRfRVJST1IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotI2lmIChCTEVfVk5EX0lOQ0xVREVEID09IFRSVUUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2N0cmxfZmVhdHVyZXNfcmRfY21wbF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2FsbGJhY2sgdG8gaGFuZGxlIGNvbnRyb2xsZXIgZmVhdHVyZSByZWFkIGNvbXBsZXRlCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX2N0cmxfZmVhdHVyZXNfcmRfY21wbF9jYmFjayh0SENJX1NUQVRVUyByZXN1bHQpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgIHN0YXR1cyA9ICVkICIsIF9fZnVuY19fLCByZXN1bHQpOwotICBpZiAocmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgaWYgKGJ0YV9kbV9jYi5wX3NlY19jYmFjaykKLSAgICAgIGJ0YV9kbV9jYi5wX3NlY19jYmFjayhCVEFfRE1fTEVfRkVBVFVSRVNfUkVBRCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgQ3RybCBCTEUgZmVhdHVyZSByZWFkIGZhaWxlZDogc3RhdHVzIDolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgfQotfQotI2VuZGlmIC8qIEJMRV9WTkRfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2J0YS9kbS9idGFfZG1fYXBpLmNjIGIvYnRhL2RtL2J0YV9kbV9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYmRmMGUuLjAwMDAwMDAKLS0tIGEvYnRhL2RtL2J0YV9kbV9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBBUEkgaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgdGhlIEJUQSBkZXZpY2UgbWFuYWdlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvZG0vYnRhX2RtX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9jbGllbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjb25zdCB0QlRBX1NZU19SRUcgYnRhX2RtX3NlYXJjaF9yZWcgPSB7YnRhX2RtX3NlYXJjaF9zbV9leGVjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fc2VhcmNoX3NtX2Rpc2FibGV9OwotCi12b2lkIEJUQV9kbV9pbml0KCkgewotICBidGFfc3lzX3JlZ2lzdGVyKEJUQV9JRF9ETV9TRUFSQ0gsICZidGFfZG1fc2VhcmNoX3JlZyk7Ci0gIC8qIGlmIFVVSUQgbGlzdCBpcyBub3QgcHJvdmlkZWQgYXMgc3RhdGljIGRhdGEgKi8KLSAgYnRhX3N5c19laXJfcmVnaXN0ZXIoYnRhX2RtX2Vpcl91cGRhdGVfdXVpZCk7Ci0gIGJ0YV9zeXNfY3VzdF9laXJfcmVnaXN0ZXIoYnRhX2RtX2Vpcl91cGRhdGVfY3VzdF91dWlkKTsKLX0KLQotLyoqIEVuYWJsZXMgYmx1ZXRvb3RoIGRldmljZSB1bmRlciB0ZXN0IG1vZGUgKi8KLXZvaWQgQlRBX0VuYWJsZVRlc3RNb2RlKHZvaWQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJhc2U6Oklnbm9yZVJlc3VsdChCVE1fRW5hYmxlVGVzdE1vZGUpKSk7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIEJsdWV0b290aCBuYW1lIG9mIGxvY2FsIGRldmljZSAqLwotdm9pZCBCVEFfRG1TZXREZXZpY2VOYW1lKGNoYXIqIHBfbmFtZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBuYW1lKEJEX05BTUVfTEVOICsgMSk7Ci0gIHN0cmxjcHkoKGNoYXIqKW5hbWUuZGF0YSgpLCBwX25hbWUsIEJEX05BTUVfTEVOICsgMSk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9zZXRfZGV2X25hbWUsIG5hbWUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbVNlYXJjaAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgcGVlciBCbHVldG9vdGggZGV2aWNlcy4gSXQKLSAqICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYW4gaW5xdWlyeSBhbmQgZ2V0cyB0aGUgcmVtb3RlIG5hbWUgZm9yIGRldmljZXMuCi0gKiAgICAgICAgICAgICAgICAgIFNlcnZpY2UgZGlzY292ZXJ5IGlzIGRvbmUgaWYgc2VydmljZXMgaXMgbm9uIHplcm8KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtU2VhcmNoKHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrLCBib29sIGlzX2JvbmRpbmdfb3Jfc2RwKSB7Ci0gIHRCVEFfRE1fQVBJX1NFQVJDSCogcF9tc2cgPQotICAgICAgKHRCVEFfRE1fQVBJX1NFQVJDSCopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ETV9BUElfU0VBUkNIKSk7Ci0KLSAgLyogUXVldWUgcmVxdWVzdCBpZiBhIGRldmljZSBpcyBib25kaW5nIG9yIHBlcmZvcm1pbmcgc2VydmljZSBkaXNjb3ZlcnkgKi8KLSAgaWYgKGlzX2JvbmRpbmdfb3Jfc2RwKSB7Ci0gICAgcF9tc2ctPmhkci5ldmVudCA9IEJUQV9ETV9BUElfUVVFVUVfU0VBUkNIX0VWVDsKLSAgfSBlbHNlIHsKLSAgICBwX21zZy0+aGRyLmV2ZW50ID0gQlRBX0RNX0FQSV9TRUFSQ0hfRVZUOwotICB9Ci0gIHBfbXNnLT5wX2NiYWNrID0gcF9jYmFjazsKLQotICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtU2VhcmNoQ2FuY2VsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uICBjYW5jZWxzIGEgc2VhcmNoIGluaXRpYXRlZCBieSBCVEFfRG1TZWFyY2gKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtU2VhcmNoQ2FuY2VsKHZvaWQpIHsKLSAgYnRhX2RtX3NlYXJjaF9jbGVhcl9xdWV1ZSgpOwotCi0gIHN3aXRjaCAoYnRhX2RtX3NlYXJjaF9nZXRfc3RhdGUoKSkgewotICAgIGNhc2UgQlRBX0RNX1NFQVJDSF9JRExFOgotICAgICAgYnRhX2RtX3NlYXJjaF9jYW5jZWxfbm90aWZ5KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9TRUFSQ0hfQUNUSVZFOgotICAgICAgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUoQlRBX0RNX1NFQVJDSF9DQU5DRUxMSU5HKTsKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2FuY2VsKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9TRUFSQ0hfQ0FOQ0VMTElORzoKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fRElTQ09WRVJfQUNUSVZFOgotICAgICAgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUoQlRBX0RNX1NFQVJDSF9DQU5DRUxMSU5HKTsKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSgpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbURpc2NvdmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgc2VydmljZSBkaXNjb3ZlcnkgZm9yIHNlcnZpY2VzIG9mIGEKLSAqICAgICAgICAgICAgICAgICAgcGVlciBkZXZpY2UKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtRGlzY292ZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIGlzX2JvbmRpbmdfb3Jfc2RwKSB7Ci0gIHRCVEFfRE1fQVBJX0RJU0NPVkVSKiBwX21zZyA9Ci0gICAgICAodEJUQV9ETV9BUElfRElTQ09WRVIqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfRE1fQVBJX0RJU0NPVkVSKSk7Ci0KLSAgaWYgKGlzX2JvbmRpbmdfb3Jfc2RwKSB7Ci0gICAgcF9tc2ctPmhkci5ldmVudCA9IEJUQV9ETV9BUElfUVVFVUVfRElTQ09WRVJfRVZUOwotICB9IGVsc2UgewotICAgIHBfbXNnLT5oZHIuZXZlbnQgPSBCVEFfRE1fQVBJX0RJU0NPVkVSX0VWVDsKLSAgfQotICBwX21zZy0+YmRfYWRkciA9IGJkX2FkZHI7Ci0gIHBfbXNnLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0gIHBfbXNnLT5wX2NiYWNrID0gcF9jYmFjazsKLQotICBidGFfc3lzX3NlbmRtc2cocF9tc2cpOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgYSBib25kaW5nIHByb2NlZHVyZSB3aXRoIGEgcGVlciBkZXZpY2UgKi8KLXZvaWQgQlRBX0RtQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRhX2RtX2JvbmQsIGJkX2FkZHIsIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgZGV2aWNlX3R5cGUpKTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gY2FuY2VscyB0aGUgYm9uZGluZyBwcm9jZWR1cmUgd2l0aCBhIHBlZXIgZGV2aWNlCi0gKi8KLXZvaWQgQlRBX0RtQm9uZENhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfZG1fYm9uZF9jYW5jZWwsIGJkX2FkZHIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbVBpblJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgcGluY29kZSBmb3IgYSByZW1vdGUgZGV2aWNlIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgb25lIGlzIHJlcXVlc3RlZCBieSBETSB0aHJvdWdoIEJUQV9ETV9QSU5fUkVRX0VWVAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1QaW5SZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDhfdCBwaW5fbGVuLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3BpbikgewotICBzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9BUElfUElOX1JFUExZPiBtc2cgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTx0QlRBX0RNX0FQSV9QSU5fUkVQTFk+KCk7Ci0KLSAgbXNnLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgbXNnLT5hY2NlcHQgPSBhY2NlcHQ7Ci0gIGlmIChhY2NlcHQpIHsKLSAgICBtc2ctPnBpbl9sZW4gPSBwaW5fbGVuOwotICAgIG1lbWNweShtc2ctPnBfcGluLCBwX3BpbiwgcGluX2xlbik7Ci0gIH0KLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRhX2RtX3Bpbl9yZXBseSwgYmFzZTo6UGFzc2VkKCZtc2cpKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1Mb2NhbE9vYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIE9PQiBkYXRhIGZyb20gbG9jYWwgY29udHJvbGxlci4KLSAqICAgICAgICAgICAgICAgICAgVGhlIHJlc3VsdCBpcyByZXBvcnRlZCBieToKLSAqICAgICAgICAgICAgICAgICAgLSBidGFfZG1fY29fbG9jX29vYl9leHQoKSBpZiBkZXZpY2Ugc3VwcG9ydHMgc2VjdXJlCi0gKiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgKFNDKQotICogICAgICAgICAgICAgICAgICAtIGJ0YV9kbV9jb19sb2Nfb29iKCkgaWYgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBTQwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUxvY2FsT29iKHZvaWQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKEJUTV9SZWFkTG9jYWxPb2JEYXRhKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1Db25maXJtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgb3IgcmVqZWN0cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIHRoZQotICogICAgICAgICAgICAgICAgICBTaW1wbGUgUGFpcmluZyBwcm9jZXNzIG9uIEJUQV9ETV9TUF9DRk1fUkVRX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUNvbmZpcm0oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9jb25maXJtLCBiZF9hZGRyLCBhY2NlcHQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUFkZERldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIGEgZGV2aWNlIHRvIHRoZSBzZWN1cml0eSBkYXRhYmFzZSBsaXN0IG9mCi0gKiAgICAgICAgICAgICAgICAgIHBlZXIgZGV2aWNlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUFkZERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGlua0tleSYgbGlua19rZXksIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW5ndGgpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX0FERF9ERVZJQ0U+IG1zZyA9Ci0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPHRCVEFfRE1fQVBJX0FERF9ERVZJQ0U+KCk7Ci0KLSAgbXNnLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgbXNnLT5saW5rX2tleV9rbm93biA9IHRydWU7Ci0gIG1zZy0+a2V5X3R5cGUgPSBrZXlfdHlwZTsKLSAgbXNnLT5saW5rX2tleSA9IGxpbmtfa2V5OwotCi0gIC8qIExvYWQgZGV2aWNlIGNsYXNzIGlmIHNwZWNpZmllZCAqLwotICBpZiAoZGV2X2NsYXNzKSB7Ci0gICAgbXNnLT5kY19rbm93biA9IHRydWU7Ci0gICAgbWVtY3B5KG1zZy0+ZGMsIGRldl9jbGFzcywgREVWX0NMQVNTX0xFTik7Ci0gIH0KLQotICBtZW1zZXQobXNnLT5iZF9uYW1lLCAwLCBCRF9OQU1FX0xFTiArIDEpOwotICBtc2ctPnBpbl9sZW5ndGggPSBwaW5fbGVuZ3RoOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidGFfZG1fYWRkX2RldmljZSwgYmFzZTo6UGFzc2VkKCZtc2cpKSk7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBkZXZpY2UgZnJvbXRoZSBzZWN1cml0eSBkYXRhYmFzZSBsaXN0IG9mIHBlZXIKLSAqIGRldmljZS4gSXQgbWFuYWdlcyB1bnBhaXJpbmcgZXZlbiB3aGlsZSBjb25uZWN0ZWQgKi8KLXRCVEFfU1RBVFVTIEJUQV9EbVJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfZG1fcmVtb3ZlX2RldmljZSwgYmRfYWRkcikpOwotICByZXR1cm4gQlRBX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR2V0RWlyU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IEJUQSBzZXJ2aWNlIG1hc2sgZnJvbSBFSVIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2VpciAtIHBvaW50ZXIgb2YgRUlSIHNpZ25pZmljYW50IHBhcnQKLSAqICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlcyAtIHJldHVybiB0aGUgQlRBIHNlcnZpY2UgbWFzawotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gY29uc3QgdWludDE2X3QgYnRhX3NlcnZpY2VfaWRfdG9fdXVpZF9sa3VwX3RibFtdOwotdm9pZCBCVEFfR2V0RWlyU2VydmljZShjb25zdCB1aW50OF90KiBwX2Vpciwgc2l6ZV90IGVpcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIHRCVEFfU0VSVklDRV9NQVNLKiBwX3NlcnZpY2VzKSB7Ci0gIHVpbnQ4X3QgeHgsIHl5OwotICB1aW50OF90IG51bV91dWlkLCBtYXhfbnVtX3V1aWQgPSAzMjsKLSAgdWludDhfdCB1dWlkX2xpc3RbMzIgKiBVdWlkOjprTnVtQnl0ZXMxNl07Ci0gIHVpbnQxNl90KiBwX3V1aWQxNiA9ICh1aW50MTZfdCopdXVpZF9saXN0OwotICB0QlRBX1NFUlZJQ0VfTUFTSyBtYXNrOwotCi0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmVpci5CVE1fR2V0RWlyVXVpZExpc3QoCi0gICAgICBwX2VpciwgZWlyX2xlbiwgVXVpZDo6a051bUJ5dGVzMTYsICZudW1fdXVpZCwgdXVpZF9saXN0LCBtYXhfbnVtX3V1aWQpOwotICBmb3IgKHh4ID0gMDsgeHggPCBudW1fdXVpZDsgeHgrKykgewotICAgIG1hc2sgPSAxOwotICAgIGZvciAoeXkgPSAwOyB5eSA8IEJUQV9NQVhfU0VSVklDRV9JRDsgeXkrKykgewotICAgICAgaWYgKCoocF91dWlkMTYgKyB4eCkgPT0gYnRhX3NlcnZpY2VfaWRfdG9fdXVpZF9sa3VwX3RibFt5eV0pIHsKLSAgICAgICAgKnBfc2VydmljZXMgfD0gbWFzazsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtYXNrIDw8PSAxOwotICAgIH0KLQotICAgIC8qIGZvciBIU1AgdjEuMiBvbmx5IGRldmljZSAqLwotICAgIGlmICgqKHBfdXVpZDE2ICsgeHgpID09IFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFMpCi0gICAgICAqcF9zZXJ2aWNlcyB8PSBCVEFfSFNQX1NFUlZJQ0VfTUFTSzsKLQotICAgIGlmICgqKHBfdXVpZDE2ICsgeHgpID09IFVVSURfU0VSVkNMQVNTX0hEUF9TT1VSQ0UpCi0gICAgICAqcF9zZXJ2aWNlcyB8PSBCVEFfSExfU0VSVklDRV9NQVNLOwotCi0gICAgaWYgKCoocF91dWlkMTYgKyB4eCkgPT0gVVVJRF9TRVJWQ0xBU1NfSERQX1NJTkspCi0gICAgICAqcF9zZXJ2aWNlcyB8PSBCVEFfSExfU0VSVklDRV9NQVNLOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1HZXRDb25uZWN0aW9uU3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3RlIGRldmljZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgMCBpZiB0aGUgZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUQV9ETV9QRUVSX0RFVklDRSogcF9kZXYgPSBidGFfZG1fZmluZF9wZWVyX2RldmljZShiZF9hZGRyKTsKLSAgcmV0dXJuIChwX2RldiAmJiBwX2Rldi0+Y29ubl9zdGF0ZSA9PSBCVEFfRE1fQ09OTkVDVEVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgIERldmljZSBJZGVudGlmaWNhdGlvbiAoREkpIFNlcnZlciBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtU2V0TG9jYWxEaVJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIGEgREkgcmVjb3JkIHRvIHRoZSBsb2NhbCBTRFAgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiByZWNvcmQgc2V0IHN1Y2Vzc2Z1bGx5LCBvdGhlcndpc2UgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9TVEFUVVMgQlRBX0RtU2V0TG9jYWxEaVJlY29yZCh0U0RQX0RJX1JFQ09SRCogcF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfaGFuZGxlKSB7Ci0gIHRCVEFfU1RBVFVTIHN0YXR1cyA9IEJUQV9GQUlMVVJFOwotCi0gIGlmIChidGFfZG1fZGlfY2IuZGlfbnVtIDwgQlRBX0RJX05VTV9NQVgpIHsKLSAgICBpZiAoU0RQX1NldExvY2FsRGlSZWNvcmQoKHRTRFBfRElfUkVDT1JEKilwX2RldmljZV9pbmZvLCBwX2hhbmRsZSkgPT0KLSAgICAgICAgU0RQX1NVQ0NFU1MpIHsKLSAgICAgIGlmICghcF9kZXZpY2VfaW5mby0+cHJpbWFyeV9yZWNvcmQpIHsKLSAgICAgICAgYnRhX2RtX2RpX2NiLmRpX2hhbmRsZVtidGFfZG1fZGlfY2IuZGlfbnVtXSA9ICpwX2hhbmRsZTsKLSAgICAgICAgYnRhX2RtX2RpX2NiLmRpX251bSsrOwotICAgICAgfQotCi0gICAgICBidGFfc3lzX2FkZF91dWlkKFVVSURfU0VSVkNMQVNTX1BOUF9JTkZPUk1BVElPTik7Ci0gICAgICBzdGF0dXMgPSBCVEFfU1VDQ0VTUzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQWRkQmxlS2V5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IExFIGRldmljZSBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZQotICogICAgICAgICAgICAgICAgICBub3JtYWxseSBjYWxsZWQgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgcF9sZV9rZXkgICAgICAgICAtIExFIGtleSB2YWx1ZXMuCi0gKiAgICAgICAgICAgICAgICAgIGtleV90eXBlICAgICAgICAgLSBMRSBTTVAga2V5IHR5cGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9GQUlMIGlmIG9wZXJhdGlvbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQWRkQmxlS2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFKiBwX2xlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRhX2RtX2FkZF9ibGVrZXksIGJkX2FkZHIsICpwX2xlX2tleSwga2V5X3R5cGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUFkZEJsZURldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkIGEgQkxFIGRldmljZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBub3JtYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBmb3IgYSBMRSBkZXZpY2Ugc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldl90eXBlICAgICAgICAgLSBSZW1vdGUgZGV2aWNlJ3MgZGV2aWNlIHR5cGUuCi0gKiAgICAgICAgICAgICAgICAgIGFkZHJfdHlwZSAgICAgICAgLSBMRSBkZXZpY2UgYWRkcmVzcyB0eXBlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUFkZEJsZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9hZGRfYmxlX2RldmljZSwgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfdHlwZSwgZGV2X3R5cGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZVBhc3NrZXlSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBCTEUgU01QIHBhc3NrZXkgcmVwbHkuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgICAgIC0gQkQgYWRkcmVzcyBvZiB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBhY2NlcHQgICAgICAgICAgIC0gcGFzc2tleSBlbnRyeSBzdWNlc3NmdWwgb3IgZGVjbGluZWQuCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NrZXkgICAgICAgICAgLSBwYXNza2V5IHZhbHVlLCBtdXN0IGJlIGEgNiBkaWdpdCBudW1iZXIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgbGVhZCBieSAwLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUJsZVBhc3NrZXlSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9ibGVfcGFzc2tleV9yZXBseSwgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdCwgYWNjZXB0ID8gcGFzc2tleSA6IDApKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZUNvbmZpcm1SZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBCTEUgU01QIFNDIHVzZXIgY29uZmlybWF0aW9uIHJlcGx5LgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgYWNjZXB0ICAgICAgICAgICAtIG51bWJlcnMgdG8gY29tcGFyZSBhcmUgdGhlIHNhbWUgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1CbGVDb25maXJtUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0YV9kbV9ibGVfY29uZmlybV9yZXBseSwgYmRfYWRkciwgYWNjZXB0KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVTZWN1cml0eUdyYW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHcmFudCBzZWN1cml0eSByZXF1ZXN0IGFjY2Vzcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIHJlcyAgICAgICAgICAgICAgLSBzZWN1cml0eSBncmFudCBzdGF0dXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQmxlU2VjdXJpdHlHcmFudChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fQkxFX1NFQ19HUkFOVCByZXMpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKEJUTV9TZWN1cml0eUdyYW50LCBiZF9hZGRyLCByZXMpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbVNldEJsZVByZWZDb25uUGFyYW1zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIHByZWZlcnJlZCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2hlbiBkZWZhdWx0IGNvbm5lY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBkZXNpcmVkLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwKLSAqICAgICAgICAgICAgICAgICAgc2Nhbl9pbnRlcnZhbCAgICAtIHNjYW4gaW50ZXJ2YWwKLSAqICAgICAgICAgICAgICAgICAgc2Nhbl93aW5kb3cgICAgICAtIHNjYW4gd2luZG93Ci0gKiAgICAgICAgICAgICAgICAgIG1pbl9jb25uX2ludCAgICAgLSBtaW5pbXVtIHByZWZlcnJlZCBjb25uZWN0aW9uIGludGVydmFsCi0gKiAgICAgICAgICAgICAgICAgIG1heF9jb25uX2ludCAgICAgLSBtYXhpbXVtIHByZWZlcnJlZCBjb25uZWN0aW9uIGludGVydmFsCi0gKiAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWxfbGF0ZW5jeSAgICAtIHByZWZlcnJlZCBwZXJpcGhlcmFsIGxhdGVuY3kKLSAqICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNpb25fdG91dCAtIHByZWZlcnJlZCBzdXBlcnZpc2lvbiB0aW1lb3V0Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbVNldEJsZVByZWZDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jb25uX2ludCwgdWludDE2X3QgbWF4X2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKGJ0YV9kbV9ibGVfc2V0X2Nvbm5fcGFyYW1zLCBiZF9hZGRyLCBtaW5fY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgIG1heF9jb25uX2ludCwgcGVyaXBoZXJhbF9sYXRlbmN5LCBzdXBlcnZpc2lvbl90b3V0KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVVcGRhdGVDb25uZWN0aW9uUGFyYW0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFVwZGF0ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMsIGNhbiBvbmx5IGJlIHVzZWQgd2hlbgotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIHVwLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgbWluX2ludCAgIC0gICAgIG1pbmltdW0gY29ubmVjdGlvbiBpbnRlcnZhbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwMDQgfiAweDQwMDBdCi0gKiAgICAgICAgICAgICAgICAgIG1heF9pbnQgICAtICAgICBtYXhpbXVtIGNvbm5lY3Rpb24gaW50ZXJ2YWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMDA0IH4gMHg0MDAwXQotICogICAgICAgICAgICAgICAgICBsYXRlbmN5ICAgLSAgICAgcGVyaXBoZXJhbCBsYXRlbmN5IFswIH4gNTAwXQotICogICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgLSAgICAgc3VwZXJ2aXNpb24gdGltZW91dCBbMHgwMDBhIH4gMHhjODBdCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9ibGVfdXBkYXRlX2Nvbm5fcGFyYW1zLCBiZF9hZGRyLCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZUNvbmZpZ0xvY2FsUHJpdmFjeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlL2Rpc2FibGUgcHJpdmFjeSBvbiB0aGUgbG9jYWwgZGV2aWNlCi0gKgotICogUGFyYW1ldGVyczogICAgICBwcml2YWN5X2VuYWJsZSAgIC0gZW5hYmxlL2Rpc2FiZSBwcml2YWN5IG9uIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5KGJvb2wgcHJpdmFjeV9lbmFibGUpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRhX2RtX2JsZV9jb25maWdfbG9jYWxfcHJpdmFjeSwgcHJpdmFjeV9lbmFibGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZUdldEVuZXJneUluZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG9idGFpbiB0aGUgZW5lcmd5IGluZm8KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfY21wbF9jYmFjayAtIENvbW1hbmQgY29tcGxldGUgY2FsbGJhY2sKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfRG1CbGVHZXRFbmVyZ3lJbmZvKHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBwX2NtcGxfY2JhY2spIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0YV9kbV9ibGVfZ2V0X2VuZXJneV9pbmZvLCBwX2NtcGxfY2JhY2spKTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgdG8gc2V0IG1heGltdW0gTEUgZGF0YSBwYWNrZXQgc2l6ZSAqLwotdm9pZCBCVEFfRG1CbGVSZXF1ZXN0TWF4VHhEYXRhTGVuZ3RoKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9kZXZpY2UpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0YV9kbV9ibGVfc2V0X2RhdGFfbGVuZ3RoLCByZW1vdGVfZGV2aWNlKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1TZXRFbmNyeXB0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlbnN1cmUgdGhhdCBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZC4gIFNob3VsZCBiZSBjYWxsZWQgb25seSBvbiBhbiBvcGVuIGNvbm5lY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFR5cGljYWxseSBvbmx5IG5lZWRlZCBmb3IgY29ubmVjdGlvbnMgdGhhdCBmaXJzdCB3YW50IHRvCi0gKiAgICAgICAgICAgICAgICAgIGJyaW5nIHVwIHVuZW5jcnlwdGVkIGxpbmtzLCB0aGVuIGxhdGVyIGVuY3J5cHQgdGhlbS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgICAgIC0gdHJhbnNwb3J0IG9mIHRoZSBsaW5rIHRvIGJlIGVuY3J1eXB0ZWQKLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayAgICAtIFBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5kaWNhdCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgZW5jcnlwdGlvbiBzdGF0dXMKLSAqICAgICAgICAgICAgICAgICAgc2VjX2FjdCAgICAgICAtIFRoaXMgaXMgdGhlIHNlY3VyaXR5IGFjdGlvbiB0byBpbmRpY2F0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCBraW5kIG9mIEJMRSBzZWN1cml0eSBsZXZlbCBpcyByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBCTEUgbGluayBpZiBCTEUgaXMgc3VwcG9ydGVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUi9FRFIgb3IgaWYgQkxFIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtU2V0RW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSB7Ci0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9zZXRfZW5jcnlwdGlvbiwgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgcF9jYWxsYmFjaywgc2VjX2FjdCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQ2xvc2VBQ0wKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZm9yY2UgdG8gY2xvc2UgYW4gQUNMIGNvbm5lY3Rpb24gYW5kIHJlbW92ZQotICogICAgICAgICAgICAgICAgICB0aGUgZGV2aWNlIGZyb20gdGhlIHNlY3VyaXR5IGRhdGFiYXNlIGxpc3Qgb2Yga25vd24gZGV2aWNlcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICByZW1vdmVfZGV2ICAgIC0gcmVtb3ZlIGRldmljZSBvciBub3QgYWZ0ZXIgbGluayBkb3duCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0RtQ2xvc2VBQ0woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCByZW1vdmVfZGV2LAotICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfZG1fY2xvc2VfYWNsLCBiZF9hZGRyLCByZW1vdmVfZGV2LCB0cmFuc3BvcnQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZU9ic2VydmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgcHJvY2VkdXJlIGtlZXAgdGhlIGRldmljZSBsaXN0ZW5pbmcgZm9yIGFkdmVydGlzaW5nCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50cyBmcm9tIGEgYnJvYWRjYXN0IGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHN0YXJ0OiBzdGFydCBvciBzdG9wIG9ic2VydmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZU9ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYikgewotICBBUFBMX1RSQUNFX0FQSSgiJXM6c3RhcnQgPSAlZCAiLCBfX2Z1bmNfXywgc3RhcnQpOwotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfZG1fYmxlX29ic2VydmUsIHN0YXJ0LCBkdXJhdGlvbiwgcF9yZXN1bHRzX2NiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVTY2FuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBvciBzdG9wIHRoZSBzY2FuIHByb2NlZHVyZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHN0YXJ0ZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBCVEFfRG1CbGVPYnNlcnZlKCkuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzdGFydDogc3RhcnQgb3Igc3RvcCB0aGUgc2NhbiBwcm9jZWR1cmUsCi0gKiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX3NlYzogRHVyYXRpb24gb2YgdGhlIHNjYW4uIENvbnRpbnVvdXMgc2NhbiBpZiAwIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkLAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVTY2FuKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb25fc2VjKSB7Ci0gIEFQUExfVFJBQ0VfQVBJKCIlczpzdGFydCA9ICVkICIsIF9fZnVuY19fLCBzdGFydCk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidGFfZG1fYmxlX3NjYW4sIHN0YXJ0LCBkdXJhdGlvbl9zZWMpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZUNzaXNPYnNlcnZlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHByb2NlZHVyZSBrZWVwcyB0aGUgZXh0ZXJuYWwgb2JzZXJ2ZXIgbGlzdGVuaW5nIGZvcgotICogICAgICAgICAgICAgICAgICBhZHZlcnRpc2luZyBldmVudHMgZnJvbSBhIENTSVMgZ3JvdXBlZCBkZXZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBvYnNlcnZlOiBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIG9ic2VydmUsCi0gKiAgICAgICAgICAgICAgICAgIHBfcmVzdWx0c19jYjogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdpdGggc2NhbiByZXN1bHRzLAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9EbUJsZUNzaXNPYnNlcnZlKGJvb2wgb2JzZXJ2ZSwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYikgewotICBBUFBMX1RSQUNFX0FQSSgiJXM6ZW5hYmxlID0gJWQgIiwgX19mdW5jX18sIG9ic2VydmUpOwotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRhX2RtX2JsZV9jc2lzX29ic2VydmUsIG9ic2VydmUsIHBfcmVzdWx0c19jYikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1ZlbmRvckluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdmVuZG9yIHNwZWNpZmljCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX1ZlbmRvckluaXQodm9pZCkgeyBBUFBMX1RSQUNFX0FQSSgiQlRBX1ZlbmRvckluaXQiKTsgfQpkaWZmIC0tZ2l0IGEvYnRhL2RtL2J0YV9kbV9jZmcuY2MgYi9idGEvZG0vYnRhX2RtX2NmZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjNzU3NS4uMDAwMDAwMAotLS0gYS9idGEvZG0vYnRhX2RtX2NmZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBjb21waWxlLXRpbWUgY29uZmlndXJhYmxlIGNvbnN0YW50cyBmb3IgdGhlIGRldmljZQotICogIG1hbmFnZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9kbS9idGFfZG1faW50LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oaF9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfanZfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyogcGFnZSB0aW1lb3V0IGluIDYyNXVTICovCi0jaWZuZGVmIEJUQV9ETV9QQUdFX1RJTUVPVVQKLSNkZWZpbmUgQlRBX0RNX1BBR0VfVElNRU9VVCA4MTkyCi0jZW5kaWYKLQotLyogVFJVRSB0byBhdm9pZCBzY2F0dGVybmV0IHdoZW4gYXYgaXMgc3RyZWFtaW5nIChiZSB0aGUgY2VudHJhbCkgKi8KLSNpZm5kZWYgQlRBX0RNX0FWT0lEX1NDQVRURVJfQTJEUAotI2RlZmluZSBCVEFfRE1fQVZPSURfU0NBVFRFUl9BMkRQIFRSVUUKLSNlbmRpZgotCi0vKiBGb3IgSW5zaWdodCwgUE0gY2ZnIGxvb2t1cCB0YWJsZXMgYXJlIHJ1bnRpbWUgY29uZmlndXJhYmxlICh0byBhbGxvdyB0d2Vha2luZwotICogb2YgcGFyYW1zIGZvciBwb3dlciBjb25zdW1wdGlvbiBtZWFzdXJlbWVudHMpICovCi0jaWZuZGVmIEJURV9TSU1fQVBQCi0jZGVmaW5lIHRCVEFfRE1fUE1fVFlQRV9RVUFMSUZJRVIgY29uc3QKLSNlbHNlCi0jZGVmaW5lIHRCVEFfRE1fUE1fVFlQRV9RVUFMSUZJRVIKLSNlbmRpZgotCi1jb25zdCB0QlRBX0RNX0NGRyBidGFfZG1fY2ZnID0gewotICAgIC8qIG1vYmlsZSBwaG9uZSBDT0QgKi8KLSAgICBCVEFfRE1fQ09ELAotICAgIC8qIHBhZ2UgdGltZW91dCBpbiA2MjV1UyAqLwotICAgIEJUQV9ETV9QQUdFX1RJTUVPVVQsCi0gICAgLyogdHJ1ZSB0byBhdm9pZCBzY2F0dGVybmV0IHdoZW4gYXYgaXMgc3RyZWFtaW5nIChiZSB0aGUgY2VudHJhbCkgKi8KLSAgICBCVEFfRE1fQVZPSURfU0NBVFRFUl9BMkRQfTsKLQotI2lmbmRlZiBCVEFfRE1fU0NBVFRFUk5FVAotLyogQnkgZGVmYXVsdCwgYWxsb3cgcGFydGlhbCBzY2F0dGVybmV0ICovCi0jZGVmaW5lIEJUQV9ETV9TQ0FUVEVSTkVUIEJUQV9ETV9QQVJUSUFMX1NDQVRURVJORVQKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9ISF9ST0xFCi0vKiBCeSBkZWZhdWx0LCBkbyBub3Qgc3BlY2lmeSBISCByb2xlIChiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLwotI2RlZmluZSBCVEFfSEhfUk9MRSBCVEFfQU5ZX1JPTEUKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9QQU5VX1JPTEUKLS8qIEJ5IGRlZmF1bHQsIEFWIHJvbGUgKGJhY2t3YXJkIEJUQV9DRU5UUkFMX1JPTEVfUFJFRikgKi8KLSNkZWZpbmUgQlRBX1BBTlVfUk9MRSBCVEFfUEVSSVBIRVJBTF9ST0xFX09OTFkKLSNlbmRpZgotI2RlZmluZSBCVEFfRE1fTlVNX1JNX0VOVFJZIDYKLQotLyogYXBwaWRzIGZvciBQQU4gdXNlZCBieSBpbnNpZ2h0IHNhbXBsZSBhcHBsaWNhdGlvbgotICAgdGhlc2UgaGF2ZSB0byBiZSBzYW1lIGFzIGRlZmluZWQgaW4gYnR1aV9pbnQuaCAqLwotI2RlZmluZSBCVFVJX1BBTl9JRF9QQU5VIDAKLSNkZWZpbmUgQlRVSV9QQU5fSURfTkFQIDEKLSNkZWZpbmUgQlRVSV9QQU5fSURfR04gMgotCi0vKiBGaXJzdCBlbGVtZW50IGlzIGFsd2F5cyBmb3IgU1lTOgotICAgYXBwX2lkID0gIyBvZiBlbnRyaWVzIHRhYmxlLCBjZmcgaXMKLSAgIGRldmljZSBzY2F0dGVybmV0IHN1cHBvcnQgKi8KLWNvbnN0IHRCVEFfRE1fUk0gYnRhX2RtX3JtX2NmZ1tdID0gewotICAgIHtCVEFfSURfU1lTLCBCVEFfRE1fTlVNX1JNX0VOVFJZLCBCVEFfRE1fU0NBVFRFUk5FVH0sCi0gICAge0JUQV9JRF9QQU4sIEJUVUlfUEFOX0lEX05BUCwgQlRBX0FOWV9ST0xFfSwKLSAgICB7QlRBX0lEX1BBTiwgQlRVSV9QQU5fSURfR04sIEJUQV9BTllfUk9MRX0sCi0gICAge0JUQV9JRF9QQU4sIEJUQV9BUFBfSURfUEFOX01VTFRJLCBCVEFfQ0VOVFJBTF9ST0xFX09OTFl9LAotICAgIHtCVEFfSURfUEFOLCBCVFVJX1BBTl9JRF9QQU5VLCBCVEFfUEFOVV9ST0xFfSwKLSAgICB7QlRBX0lEX0hILCBCVEFfQUxMX0FQUF9JRCwgQlRBX0hIX1JPTEV9LAotICAgIHtCVEFfSURfQVYsIEJUQV9BTExfQVBQX0lELCBCVEFfQ0VOVFJBTF9ST0xFX1BSRUZ9fTsKLQotY29uc3QgdEJUQV9ETV9DRkcqIHBfYnRhX2RtX2NmZyA9ICZidGFfZG1fY2ZnOwotCi1jb25zdCB0QlRBX0RNX1JNKiBwX2J0YV9kbV9ybV9jZmcgPSAmYnRhX2RtX3JtX2NmZ1swXTsKLQotI2RlZmluZSBCVEFfRE1fTlVNX1BNX0VOVFJZIFwKLSAgMjUgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gYnRhX2RtX3BtX2NmZyBleGNlcHQgdGhlIGZpcnN0ICovCi0jZGVmaW5lIEJUQV9ETV9OVU1fUE1fU1BFQyAxNiAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBidGFfZG1fcG1fc3BlYyAqLwotCi10QlRBX0RNX1BNX1RZUEVfUVVBTElGSUVSIHRCVEFfRE1fUE1fQ0ZHCi0gICAgYnRhX2RtX3BtX2NmZ1tCVEFfRE1fTlVNX1BNX0VOVFJZICsgMV0gPSB7Ci0gICAgICAgIHtCVEFfSURfU1lTLCBCVEFfRE1fTlVNX1BNX0VOVFJZLAotICAgICAgICAgMH0sIC8qIHJlc2VydmVkOiBzcGVjaWZpZXMgbGVuZ3RoIG9mIHRoaXMgdGFibGUuICovCi0gICAgICAgIHtCVEFfSURfQUcsIEJUQV9BTExfQVBQX0lELAotICAgICAgICAgMH0sICAgICAgICAgICAgICAgLyogYWcgdXNlcyBmaXJzdCBzcGVjIHRhYmxlIGZvciBhcHAgaWQgMCAqLwotICAgICAgICB7QlRBX0lEX0NULCAxLCAxfSwgLyogY3QgKEJUQV9JRF9DVCxBUFAgSUQ9MSkgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0NHLCBCVEFfQUxMX0FQUF9JRCwgMX0sICAgICAvKiBjZyByZXN1ZSBjdCBzcGVjIHRhYmxlICovCi0gICAgICAgIHtCVEFfSURfREcsIEJUQV9BTExfQVBQX0lELCAyfSwgICAgIC8qIGRnIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9BViwgQlRBX0FMTF9BUFBfSUQsIDR9LCAgICAgLyogYXYgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0ZUQywgQlRBX0FMTF9BUFBfSUQsIDd9LCAgICAvKiBmdGMgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0ZUUywgQlRBX0FMTF9BUFBfSUQsIDh9LCAgICAvKiBmdHMgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0hELCBCVEFfQUxMX0FQUF9JRCwgM30sICAgICAvKiBoZCBzcGVjIHRhYmxlICovCi0gICAgICAgIHtCVEFfSURfSEgsIEJUQV9ISF9BUFBfSURfSk9ZLCA1fSwgIC8qIGFwcCBCVEFfSEhfQVBQX0lEX0pPWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltaWxhciB0byBoaCBzcGVjIHRhYmxlICovCi0gICAgICAgIHtCVEFfSURfSEgsIEJUQV9ISF9BUFBfSURfR1BBRCwgNX0sIC8qIGFwcCBCVEFfSEhfQVBQX0lEX0dQQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbWlsYXIgdG8gaGggc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0hILCBCVEFfQUxMX0FQUF9JRCwgNn0sICAgICAvKiBoaCBzcGVjIHRhYmxlICovCi0gICAgICAgIHtCVEFfSURfUEJDLCBCVEFfQUxMX0FQUF9JRCwgMn0sICAgIC8qIHJldXNlIGRnIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9QQlMsIEJUQV9BTExfQVBQX0lELCA4fSwgICAgLyogcmV1c2UgZnRzIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9PUEMsIEJUQV9BTExfQVBQX0lELCA3fSwgICAgLyogcmV1c2UgZnRjIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9PUFMsIEJUQV9BTExfQVBQX0lELCA4fSwgICAgLyogcmV1c2UgZnRzIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9NU0UsIEJUQV9BTExfQVBQX0lELCA4fSwgICAgLyogcmV1c2UgZnRzIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9KViwgQlRBX0pWX1BNX0lEXzEsCi0gICAgICAgICA3fSwgLyogYXBwIEJUQV9KVl9QTV9JRF8xLCByZXVzZSBmdGMgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0pWLCBCVEFfQUxMX0FQUF9JRCwgOH0sICAgICAvKiByZXVzZSBmdHMgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0hMLCBCVEFfQUxMX0FQUF9JRCwgOX0sICAgICAvKiByZXVzZSBmdHMgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX1BBTiwgQlRVSV9QQU5fSURfUEFOVSwgMTB9LCAvKiBQQU5VIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9QQU4sIEJUVUlfUEFOX0lEX05BUCwgMTF9LCAgLyogTkFQIHNwZWMgdGFibGUgKi8KLSAgICAgICAge0JUQV9JRF9IUywgQlRBX0FMTF9BUFBfSUQsIDEyfSwgICAgLyogSFMgc3BlYyB0YWJsZSAqLwotICAgICAgICB7QlRBX0lEX0dBVFRDLCBCVEFfQUxMX0FQUF9JRCwgMTR9LCAvKiBnYXR0YyBzcGVjIHRhYmxlICovCi0gICAgICAgIHtCVEFfSURfR0FUVFMsIEJUQV9BTExfQVBQX0lELCAxNX0gIC8qIGdhdHRzIHNwZWMgdGFibGUgKi8KLX07Ci0KLXRCVEFfRE1fUE1fVFlQRV9RVUFMSUZJRVIgdEJUQV9ETV9QTV9TUEVDIGJ0YV9kbV9wbV9zcGVjW0JUQV9ETV9OVU1fUE1fU1BFQ10gPSB7Ci0gICAgLyogQUcgOiAwICovCi0gICAgeyhCVEFfRE1fUE1fU05JRkYgfCBCVEFfRE1fUE1fUEFSSyksIC8qIGFsbG93IHBhcmsgJiBzbmlmZiAqLwotICAgICAoQlRBX0RNX1BNX1NTUjIpLCAvKiB0aGUgU1NSIGVudHJ5ICovCi0gICAgIHsKLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0EyRFBfSURYLCA3MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIG9wZW4gc25pZmYgICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfU0NPX09QRU5fSURYLCA3MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gb3BlbiwgYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRl9BMkRQX0lEWCwgNzAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIGNsb3NlIHNuaWZmICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgsIDcwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYnVzeSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fUkVUUlksIDcwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0gLyogbW9kZSBjaGFuZ2UgcmV0cnkgKi8KLSAgICAgfX0sCi0KLSAgICAvKiBDVCwgQ0cgOiAxICovCi0gICAgeyhCVEFfRE1fUE1fU05JRkYgfCBCVEFfRE1fUE1fUEFSSyksIC8qIGFsbG93IHBhcmsgJiBzbmlmZiAqLwotICAgICAoQlRBX0RNX1BNX1NTUjIpLCAvKiB0aGUgU1NSIGVudHJ5ICovCi0gICAgIHsKLSAgICAgICAgIHt7QlRBX0RNX1BNX1BBUkssIDUwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgcGFyayAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgLyogY29ubiBjbG9zZSAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBvcGVuICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBhcHAgY2xvc2UgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0EyRFBfSURYLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gb3BlbiBzbmlmZiAqLwotICAgICAgICAge3tCVEFfRE1fUE1fUEFSSywgNTAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIGNsb3NlICBwYXJrICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBpZGxlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBidXN5ICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9SRVRSWSwgNTAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSAvKiBtb2RlIGNoYW5nZSByZXRyeSAqLwotICAgICB9fSwKLQotICAgIC8qIERHLCBQQkMgOiAyICovCi0gICAgeyhCVEFfRE1fUE1fQUNUSVZFKSwgLyogbm8gcG93ZXIgc2F2aW5nIG1vZGUgYWxsb3dlZCAqLwotICAgICAoQlRBX0RNX1BNX1NTUjIpLCAvKiB0aGUgU1NSIGVudHJ5ICovCi0gICAgIHsKLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIG9wZW4gYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkYsIDEwMDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYnVzeSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19LAotCi0gICAgLyogSEQgOiAzICovCi0gICAgeyhCVEFfRE1fUE1fU05JRkYgfCBCVEFfRE1fUE1fUEFSSyksIC8qIGFsbG93IHBhcmsgJiBzbmlmZiAqLwotICAgICAoQlRBX0RNX1BNX1NTUjMpLCAvKiB0aGUgU1NSIGVudHJ5ICovCi0gICAgIHsKLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0hEX0FDVElWRV9JRFgsIDUwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiBzbmlmZiAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgLyogY29ubiBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0hEX0lETEVfSURYLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBpZGxlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRl9IRF9BQ1RJVkVfSURYLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBidXN5ICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0gLyogbW9kZSBjaGFuZ2UgcmV0cnkgKi8KLSAgICAgfX0sCi0KLSAgICAvKiBBViA6IDQgKi8KLSAgICB7KEJUQV9ETV9QTV9TTklGRiksIC8qIGFsbG93IHNuaWZmICovCi0gICAgIChCVEFfRE1fUE1fU1NSMiksIC8qIHRoZSBTU1IgZW50cnkgKi8KLSAgICAgewotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgsIDcwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgc25pZmYgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX1BSRUYsIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAgIC8qIGNvbm4gY2xvc2UgICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBhcHAgb3BlbiAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIGNsb3NlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gb3BlbiAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIHNjbyBjbG9zZSAgICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRl9BMkRQX0lEWCwgNzAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZGxlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9BQ1RJVkUsIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBidXN5ICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0gLyogbW9kZSBjaGFuZ2UgcmV0cnkgKi8KLSAgICAgfX0sCi0KLSAgICAvKiBISCBmb3Igam95c3RpY2tzIGFuZCBnYW1lcGFkIDogNSAqLwotICAgIHsoQlRBX0RNX1BNX1NOSUZGIHwgQlRBX0RNX1BNX1BBUkspLCAvKiBhbGxvdyBwYXJrICYgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IxKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRjYsIEJUQV9ETV9QTV9ISF9PUEVOX0RFTEFZfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIG9wZW4gIHNuaWZmICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIHNjbyBjbG9zZSwgdXNlZCBmb3IgSEggc3VzcGVuZCAgICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRjYsIEJUQV9ETV9QTV9ISF9JRExFX0RFTEFZfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBpZGxlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRjYsIEJUQV9ETV9QTV9ISF9BQ1RJVkVfREVMQVl9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGJ1c3kgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSAvKiBtb2RlIGNoYW5nZSByZXRyeSAqLwotICAgICB9fSwKLQotICAgIC8qIEhIIDogNiAqLwotICAgIHsoQlRBX0RNX1BNX1NOSUZGIHwgQlRBX0RNX1BNX1BBUkspLCAvKiBhbGxvdyBwYXJrICYgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IxKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRl9ISF9PUEVOX0lEWCwgQlRBX0RNX1BNX0hIX09QRU5fREVMQVl9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgc25pZmYgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX1BSRUYsIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAgIC8qIGNvbm4gY2xvc2UgICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBhcHAgb3BlbiAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIGNsb3NlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gb3BlbiAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIGNsb3NlLCB1c2VkIGZvciBISCBzdXNwZW5kICAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0hIX0lETEVfSURYLCBCVEFfRE1fUE1fSEhfSURMRV9ERUxBWX0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfSEhfQUNUSVZFX0lEWCwgQlRBX0RNX1BNX0hIX0FDVElWRV9ERUxBWX0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYnVzeSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19LAotCi0gICAgLyogRlRDLCBPUEMsIEpWIDogNyAqLwotICAgIHsoQlRBX0RNX1BNX1NOSUZGKSwgLyogYWxsb3cgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IyKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9BQ1RJVkUsIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgsIEJUQV9GVENfSURMRV9UT19TTklGRl9ERUxBWV9NU30sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZGxlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9BQ1RJVkUsIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBidXN5ICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0gLyogbW9kZSBjaGFuZ2UgcmV0cnkgKi8KLSAgICAgfX0sCi0KLSAgICAvKiBGVFMsIFBCUywgT1BTLCBNU0UsIEJUQV9KVl9QTV9JRF8xIDogOCAqLwotICAgIHsoQlRBX0RNX1BNX1NOSUZGKSwgLyogYWxsb3cgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IyKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9BQ1RJVkUsIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgsIEJUQV9GVFNfT1BTX0lETEVfVE9fU05JRkZfREVMQVlfTVN9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYnVzeSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19LAotCi0gICAgLyogSEwgOiA5ICovCi0gICAgeyhCVEFfRE1fUE1fU05JRkYpLCAvKiBhbGxvdyBzbmlmZiAqLwotICAgICAoQlRBX0RNX1BNX1NTUjIpLCAvKiB0aGUgU1NSIGVudHJ5ICovCi0gICAgIHsKLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0EyRFBfSURYLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIG9wZW4gc25pZmYgICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gb3BlbiwgYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIHNjbyBjbG9zZSBzbmlmZiAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGlkbGUgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX0FDVElWRSwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgIC8qIGJ1c3kgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSAvKiBtb2RlIGNoYW5nZSByZXRyeSAqLwotICAgICB9fSwKLQotICAgIC8qIFBBTlUgOiAxMCAqLwotICAgIHsoQlRBX0RNX1BNX1NOSUZGKSwgLyogYWxsb3cgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IyKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9BQ1RJVkUsIDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgsIDUwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYnVzeSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19LAotCi0gICAgLyogTkFQIDogMTEgKi8KLSAgICB7KEJUQV9ETV9QTV9TTklGRiksIC8qIGFsbG93IHNuaWZmICovCi0gICAgIChCVEFfRE1fUE1fU1NSMiksIC8qIHRoZSBTU1IgZW50cnkgKi8KLSAgICAgewotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIG9wZW4gIGFjdGl2ZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgLyogY29ubiBjbG9zZSAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX0FDVElWRSwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgIC8qIGFwcCBvcGVuICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBhcHAgY2xvc2UgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIHNjbyBvcGVuICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIGNsb3NlICAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGX0EyRFBfSURYLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkbGUgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX0FDVElWRSwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGJ1c3kgKi8KLQotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19LAotCi0gICAgLyogSFMgOiAxMiAqLwotICAgIHsoQlRBX0RNX1BNX1NOSUZGIHwgQlRBX0RNX1BNX1BBUkspLCAvKiBhbGxvdyBwYXJrICYgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IyKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRiwgNzAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogY29ubiBvcGVuIHNuaWZmICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sICAgLyogY29ubiBjbG9zZSAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBvcGVuICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBhcHAgY2xvc2UgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGMywgNzAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4sIGFjdGl2ZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkYsIDcwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIHNjbyBjbG9zZSBzbmlmZiAgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGLCA3MDAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBidXN5ICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9SRVRSWSwgNzAwMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSAvKiBtb2RlIGNoYW5nZSByZXRyeSAqLwotICAgICB9fSwKLQotICAgIC8qIEFWSyA6IDEzICovCi0gICAgeyhCVEFfRE1fUE1fU05JRkYpLCAvKiBhbGxvdyBzbmlmZiAqLwotICAgICAoQlRBX0RNX1BNX1NTUjIpLCAvKiB0aGUgU1NSIGVudHJ5ICovCi0gICAgIHsKLSAgICAgICAgIHt7QlRBX0RNX1BNX1NOSUZGLCAzMDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIG9wZW4gIHNuaWZmICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkY0LCAzMDAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYnVzeSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19Ci0KLSAgICAvKiBHQVRUQyA6IDE0ICovCi0gICAgLAotICAgIHsoQlRBX0RNX1BNX1NOSUZGIHwgQlRBX0RNX1BNX1BBUkspLCAvKiBhbGxvdyBwYXJrICYgc25pZmYgKi8KLSAgICAgKEJUQV9ETV9QTV9TU1IyKSwgLyogdGhlIFNTUiBlbnRyeSAqLwotICAgICB7Ci0gICAgICAgICB7e0JUQV9ETV9QTV9TTklGRl9BMkRQX0lEWCwgMTAwMDB9LAotICAgICAgICAgIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGNvbm4gb3BlbiAgYWN0aXZlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fQUNUSVZFLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgICAgLyogYXBwIG9wZW4gKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX0FDVElPTiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBjbG9zZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBzY28gY2xvc2UgICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgsIDEwMDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkbGUgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX0FDVElWRSwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGJ1c3kgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1JFVFJZLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19Ci0gICAgLyogR0FUVFMgOiAxNSAqLwotICAgICwKLSAgICB7KEJUQV9ETV9QTV9TTklGRiB8IEJUQV9ETV9QTV9QQVJLKSwgLyogYWxsb3cgcGFyayAmIHNuaWZmICovCi0gICAgIChCVEFfRE1fUE1fU1NSMiksIC8qIHRoZSBTU1IgZW50cnkgKi8KLSAgICAgewotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sCi0gICAgICAgICAge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogY29ubiBvcGVuICBhY3RpdmUgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX05PX1BSRUYsIDB9LCB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19LCAvKiBjb25uIGNsb3NlICAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGFwcCBvcGVuICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogYXBwIGNsb3NlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIG9wZW4gICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogc2NvIGNsb3NlICovCi0gICAgICAgICB7e0JUQV9ETV9QTV9OT19QUkVGLCAwfSwge0JUQV9ETV9QTV9OT19BQ1RJT04sIDB9fSwgLyogaWRsZSAqLwotICAgICAgICAge3tCVEFfRE1fUE1fTk9fUFJFRiwgMH0sIHtCVEFfRE1fUE1fTk9fQUNUSU9OLCAwfX0sIC8qIGJ1c3kgKi8KLSAgICAgICAgIHt7QlRBX0RNX1BNX1JFVFJZLCA1MDAwfSwKLSAgICAgICAgICB7QlRBX0RNX1BNX05PX0FDVElPTiwgMH19IC8qIG1vZGUgY2hhbmdlIHJldHJ5ICovCi0gICAgIH19Ci0KLSNpZmRlZiBCVEVfU0lNX0FQUCAvKiBGb3IgSW5zaWdodCBidWlsZHMgb25seSAqLwotICAgIC8qIEVudHJpZXMgYXQgdGhlIGVuZCBvZiB0aGUgcG1fc3BlYyB0YWJsZSBhcmUgdXNlci1kZWZpbmVkIChydW50aW1lCi0gICAgICAgY29uZmlndXJhYmxlKSwKLSAgICAgICBmb3IgcG93ZXIgY29uc3VtcHRpb24gZXhwZXJpbWVudHMuCi0gICAgICAgSW5zaWdodCBmaW5kcyB0aGUgZmlyc3QgdXNlci1kZWZpbmVkIGVudHJ5IGJ5IGxvb2tpbmcgZm9yIHRoZSBmaXJzdAotICAgICAgIEJUQV9ETV9QTV9OT19QUkVGLgotICAgICAgIFRoZSBudW1iZXIgb2YgdXNlcl9kZWZpbmVkIHNwZWNzIGlzIGRlZmluZWQgYnkKLSAgICAgICBCVEFfU1dSQVBfVURfUE1fU1BFQ19DT1VOVCAqLwotICAgICwKLSAgICB7QlRBX0RNX1BNX05PX1BSRUZ9LCAvKiBwbV9zcGVjIFVTRVJfREVGSU5FRF8wICovCi0gICAge0JUQV9ETV9QTV9OT19QUkVGfSAgLyogcG1fc3BlYyBVU0VSX0RFRklORURfMSAqLwotI2VuZGlmICAgICAgICAgICAgICAgICAgIC8qIEJURV9TSU1fQVBQICovCi19OwotCi0vKiBQbGVhc2UgcmVmZXIgdG8gdGhlIFNOSUZGIHRhYmxlIGRlZmluaXRpb25zIGluIGJ0YV9hcGkuaC4KLSAqCi0gKiBBZGRpbmcgdG8gb3IgTW9kaWZ5aW5nIHRoZSBUYWJsZQotICogQWRkaXRpb25hbCBzbmlmZiBwYXJhbWV0ZXIgZW50cmllcyBjYW4gYmUgYWRkZWQgZm9yIEJUQV9ETV9QTV9TTklGRjYgLQotICogQlRBX0RNX1BNX1NOSUZGNy4KLSAqIE92ZXJyaWRlcyBvZiBhZGRpdGlvbmFsIHRhYmxlIGVudHJpZXMgY2FuIGJlIHNwZWNpZmllZCBpbiBiZHJvaWRfYnVpbGRjZmcuaC4KLSAqIElmIGFkZGl0aW9uYWwKLSAqIHNuaWZmIHBhcmFtZXRlciBlbnRyaWVzIGFyZSBhZGRlZCBvciBhbiBvdmVycmlkZSBvZiBhbiBleGlzdGluZyBlbnRyeSBpcwotICogc3BlY2lmaWVkIGluCi0gKiBiZHJvaWRfYnVpbGRjZmcuaCB0aGVuIHRoZSBCVEFfRE1fUE1fKl9JRFggZGVmaW5lcyBpbiBidGFfYXBpLmggd2lsbCBuZWVkIHRvCi0gKiBiZSBtYXRjaCB0aGUgbmV3Ci0gKiBvcmRlcmluZy4KLSAqCi0gKiBUYWJsZSBPcmRlcmluZwotICogU25pZmYgVGFibGUgZW50cmllcyBtdXN0IGJlIG9yZGVyZWQgZnJvbSBoaWdoZXN0IGxhdGVuY3kgKGJpZ2dlc3QgaW50ZXJ2YWwpCi0gKiB0byBsb3dlc3QgbGF0ZW5jeS4KLSAqIElmIHRoZXJlIGlzIGEgY29uZmxpY3QgYW1vbmcgdGhlIGNvbm5lY3RlZCBzZXJ2aWNlcyB0aGUgc2V0dGluZyB3aXRoIHRoZQotICogbG93ZXN0IGxhdGVuY3kgd2lsbAotICogYmUgc2VsZWN0ZWQuCi0gKi8KLXRCVEFfRE1fUE1fVFlQRV9RVUFMSUZJRVIgdEJUTV9QTV9QV1JfTUQgYnRhX2RtX3BtX21kW10gPSB7Ci0gICAgLyoKLSAgICAgKiBNb3JlIHNuaWZmIHBhcmFtZXRlciBlbnRyaWVzIGNhbiBiZSBhZGRlZCBmb3IKLSAgICAgKiBCVEFfRE1fUE1fU05JRkYzIC0gQlRBX0RNX1BNX1NOSUZGNywgaWYgbmVlZGVkLiBXaGVuIGVudHJpZXMgYXJlIGFkZGVkIG9yCi0gICAgICogcmVtb3ZlZCwgQlRBX0RNX1BNX1BBUktfSURYIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgYWN0dWFsCi0gICAgICogaW5kZXgKLSAgICAgKiBCVEFfRE1fUE1fUEFSS19JRFggaXMgZGVmaW5lZCBpbiBidGFfYXBpLmggYW5kIGNhbiBiZSBvdmVycmlkZSBieSB0aGUKLSAgICAgKiBiZHJvaWRfYnVpbGRjZmcuaCBzZXR0aW5ncy4KLSAgICAgKiBUaGUgU05JRkYgdGFibGUgZW50cmllcyBtdXN0IGJlIGluIHRoZSBvcmRlciBmcm9tIGhpZ2hlc3QgbGF0ZW5jeQotICAgICAqIChiaWdnZXN0Ci0gICAgICogaW50ZXJ2YWwpIHRvIGxvd2VzdCBsYXRlbmN5LiBJZiB0aGVyZSdzIGEgY29uZmxpY3QgYW1vbmcgdGhlIGNvbm5lY3RlZAotICAgICAqIHNlcnZpY2VzLCB0aGUgc2V0dGluZyB3aXRoIGxvd2VzdCBsYXRlbmN5IHdpbnMuCi0gICAgICovCi0gICAgLyogc25pZmYgbW9kZXM6IG1heCBpbnRlcnZhbCwgbWluIGludGVydmFsLCBhdHRlbXB0LCB0aW1lb3V0ICovCi0gICAge0JUQV9ETV9QTV9TTklGRl9NQVgsIEJUQV9ETV9QTV9TTklGRl9NSU4sIEJUQV9ETV9QTV9TTklGRl9BVFRFTVBULAotICAgICBCVEFfRE1fUE1fU05JRkZfVElNRU9VVCwgQlRNX1BNX01EX1NOSUZGfSwgLyogZm9yIEJUQV9ETV9QTV9TTklGRiAtIEEyRFAgKi8KLSAgICB7QlRBX0RNX1BNX1NOSUZGMV9NQVgsIEJUQV9ETV9QTV9TTklGRjFfTUlOLCBCVEFfRE1fUE1fU05JRkYxX0FUVEVNUFQsCi0gICAgIEJUQV9ETV9QTV9TTklGRjFfVElNRU9VVCwgQlRNX1BNX01EX1NOSUZGfSwgLyogZm9yIEJUQV9ETV9QTV9TTklGRjEgKi8KLSAgICB7QlRBX0RNX1BNX1NOSUZGMl9NQVgsIEJUQV9ETV9QTV9TTklGRjJfTUlOLCBCVEFfRE1fUE1fU05JRkYyX0FUVEVNUFQsCi0gICAgIEJUQV9ETV9QTV9TTklGRjJfVElNRU9VVCwKLSAgICAgQlRNX1BNX01EX1NOSUZGfSwgLyogZm9yIEJUQV9ETV9QTV9TTklGRjItIEhEIGlkbGUgKi8KLSAgICB7QlRBX0RNX1BNX1NOSUZGM19NQVgsIEJUQV9ETV9QTV9TTklGRjNfTUlOLCBCVEFfRE1fUE1fU05JRkYzX0FUVEVNUFQsCi0gICAgIEJUQV9ETV9QTV9TTklGRjNfVElNRU9VVCwKLSAgICAgQlRNX1BNX01EX1NOSUZGfSwgLyogZm9yIEJUQV9ETV9QTV9TTklGRjMtIFNDTyBvcGVuICovCi0gICAge0JUQV9ETV9QTV9TTklGRjRfTUFYLCBCVEFfRE1fUE1fU05JRkY0X01JTiwgQlRBX0RNX1BNX1NOSUZGNF9BVFRFTVBULAotICAgICBCVEFfRE1fUE1fU05JRkY0X1RJTUVPVVQsCi0gICAgIEJUTV9QTV9NRF9TTklGRn0sIC8qIGZvciBCVEFfRE1fUE1fU05JRkY0LSBIRCBhY3RpdmUgKi8KLSAgICB7QlRBX0RNX1BNX1NOSUZGNV9NQVgsIEJUQV9ETV9QTV9TTklGRjVfTUlOLCBCVEFfRE1fUE1fU05JRkY1X0FUVEVNUFQsCi0gICAgIEJUQV9ETV9QTV9TTklGRjVfVElNRU9VVCwKLSAgICAgQlRNX1BNX01EX1NOSUZGfSwgLyogZm9yIEJUQV9ETV9QTV9TTklGRjUtIEhEIGFjdGl2ZSAqLwotICAgIHtCVEFfRE1fUE1fU05JRkY2X01BWCwgQlRBX0RNX1BNX1NOSUZGNl9NSU4sIEJUQV9ETV9QTV9TTklGRjZfQVRURU1QVCwKLSAgICAgQlRBX0RNX1BNX1NOSUZGNl9USU1FT1VULAotICAgICBCVE1fUE1fTURfU05JRkZ9LCAvKiBmb3IgQlRBX0RNX1BNX1NOSUZGNi0gSEQgYWN0aXZlICovCi0gICAge0JUQV9ETV9QTV9QQVJLX01BWCwgQlRBX0RNX1BNX1BBUktfTUlOLCBCVEFfRE1fUE1fUEFSS19BVFRFTVBULAotICAgICBCVEFfRE1fUE1fUEFSS19USU1FT1VULCBCVE1fUE1fTURfUEFSS30KLQotI2lmZGVmIEJURV9TSU1fQVBQIC8qIEZvciBJbnNpZ2h0IGJ1aWxkcyBvbmx5ICovCi0gICAgLyogRW50cmllcyBhdCB0aGUgZW5kIG9mIHRoZSBidGFfZG1fcG1fbWQgdGFibGUgYXJlIHVzZXItZGVmaW5lZCAocnVudGltZQotICAgICAgIGNvbmZpZ3VyYWJsZSksCi0gICAgICAgZm9yIHBvd2VyIGNvbnN1bXB0aW9uIGV4cGVyaW1lbnRzLgotICAgICAgIEluc2lnaHQgZmluZHMgdGhlIGZpcnN0IHVzZXItZGVmaW5lZCBlbnRyeSBieSBsb29raW5nIGZvciB0aGUgZmlyc3QKLSAgICAgICAnbWF4PTAnLgotICAgICAgIFRoZSBudW1iZXIgb2YgdXNlcl9kZWZpbmVkIHNwZWNzIGlzIGRlZmluZWQgYnkgQlRBX1NXUkFQX1VEX1BNX0RNX0NPVU5UCi0gICAgICAgKi8KLSAgICAsCi0gICAgezB9LCAvKiBDT05OX09QRU4vU0NPX0NMT1NFIHBvd2VyIG1vZGUgc2V0dGluZ3MgZm9yIHBtX3NwZWMgVVNFUl9ERUZJTkVEXzAKLSAgICAgICAgICAgICovCi0gICAgezB9LCAvKiBTQ09fT1BFTiBwb3dlciBtb2RlIHNldHRpbmdzIGZvciBwbV9zcGVjIFVTRVJfREVGSU5FRF8wICovCi0KLSAgICB7MH0sIC8qIENPTk5fT1BFTi9TQ09fQ0xPU0UgcG93ZXIgbW9kZSBzZXR0aW5ncyBmb3IgcG1fc3BlYyBVU0VSX0RFRklORURfMQotICAgICAgICAgICAgKi8KLSAgICB7MH0gIC8qIFNDT19PUEVOIHBvd2VyIG1vZGUgc2V0dGluZ3MgZm9yIHBtX3NwZWMgVVNFUl9ERUZJTkVEXzEgKi8KLSNlbmRpZiAgIC8qIEJURV9TSU1fQVBQICovCi19OwotCi0vKiAwPW1heF9sYXQgLT4gbm8gU1NSICovCi0vKiB0aGUgc21hbGxlciBvZiB0aGUgU1NSIG1heCBsYXRlbmN5IHdpbnMuCi0gKiB0aGUgZW50cmllcyBpbiB0aGlzIHRhYmxlIG11c3QgYmUgZnJvbSBoaWdoZXN0IGxhdGVuY3kgKGJpZ2dlc3QgaW50ZXJ2YWwpIHRvCi0gKiBsb3dlc3QgbGF0ZW5jeSAqLwotdEJUQV9ETV9TU1JfU1BFQyBidGFfZG1fc3NyX3NwZWNbXSA9IHsKLSAgICAvKm1heF9sYXQsIG1pbl9ybXRfdG8sIG1pbl9sb2NfdG8qLwotICAgIHswLCAwLCAwLCAibm9fc3NyIn0sIC8qIEJUQV9ETV9QTV9TU1IwIC0gZG8gbm90IHVzZSBTU1IgKi8KLSAgICAvKiBCVEFfRE1fUE1fU1NSMSAtIEhILCBjYW4gTk9UIHNoYXJlIGVudHJ5IHdpdGggYW55IG90aGVyIHByb2ZpbGUsIHNldGluZwotICAgICAgIGRlZmF1bHQgbWF4IGxhdGVuY3kgYW5kIG1pbiByZW1vdGUgdGltZW91dCBhcyAwLCBhbmQgYWx3YXlzIHJlYWQKLSAgICAgICBpbmRpdmlkdWFsIGRldmljZSBwcmVmZXJlbmNlIGZyb20gSEggbW9kdWxlICovCi0gICAgezAsIDAsIDIsICJoaWRfaG9zdCJ9LAotICAgIHsxMjAwLCAyLCAyLCAic25pZmZfY2FwYWJsZSJ9LCAgLyogQlRBX0RNX1BNX1NTUjIgLSBvdGhlcnMgKGFzIGxvbmcgYXMgc25pZmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsbG93ZWQpKi8KLSAgICB7MzYwLCAxNjAsIDE2MDAsICJoaWRfZGV2aWNlIn0sIC8qIEJUQV9ETV9QTV9TU1IzIC0gSEQgKi8KLSAgICB7MTIwMCwgNjU1MzQsIDY1NTM0LCAiYTJkcCJ9ICAgIC8qIEJUQV9ETV9QTV9TU1I0IC0gQTJEUCBzdHJlYW1pbmcgKi8KLX07Ci0KLXRCVEFfRE1fU1NSX1NQRUMqIHBfYnRhX2RtX3Nzcl9zcGVjID0gJmJ0YV9kbV9zc3Jfc3BlY1swXTsKLQotY29uc3QgdEJUQV9ETV9QTV9DRkcqIHBfYnRhX2RtX3BtX2NmZyA9ICZidGFfZG1fcG1fY2ZnWzBdOwotY29uc3QgdEJUQV9ETV9QTV9TUEVDKiBwX2J0YV9kbV9wbV9zcGVjID0gJmJ0YV9kbV9wbV9zcGVjWzBdOwotY29uc3QgdEJUTV9QTV9QV1JfTUQqIHBfYnRhX2RtX3BtX21kID0gJmJ0YV9kbV9wbV9tZFswXTsKLQotLyogVGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiBFSVIgcGFja2V0IHNpemUKLSAqCi0gKiBXaGVuIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQgaXMgdHJ1ZSwKLSAqIDEgdG8gMTcgYnl0ZXMsICAgIERNMSBpcyB1c2VkIGFuZCBtb3N0IHJvYnVzdC4KLSAqIDE4IHRvIDEyMSBieXRlcywgIERNMyBpcyB1c2VkIGJ1dCBpbXBhY3RzIGlucXVpcnkgc2NhbiB0aW1lIHdpdGggbGFyZ2UgbnVtYmVyCi0gKiAgICAgICAgICAgICAgICAgICAgb2YgZGV2aWNlcy4oYWxtb3N0IGRvdWJsZSB3aXRoIDE1MCB1c2VycykKLSAqIDEyMiB0byAyMjQgYnl0ZXMsIERNNSBpcyB1c2VkIGJ1dCBjYXVzZSBxdWl0ZSBiaWcgcGVyZm9ybWFuY2UgbG9zcyBldmVuIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICBzbWFsbCBudW1iZXIgb2YgdXNlcnMuIHNvIGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KLSAqIDIyNSB0byAyNDAgYnl0ZXMsIERINSBpcyB1c2VkIHdpdGhvdXQgRkVDIGJ1dCBpdCBub3QgcmVjb21tZW5kZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgKHNhbWUgcmVhc29uIG9mIERNNSkKLSAqCi0gKiBXaGVuIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQgaXMgZmFsc2UsCi0gKiAxIHRvIDI3IGJ5dGVzLCAgICBESDEgaXMgdXNlZCBidXQgb25seSByb2J1c3QgYXQgc2hvcnQgcmFuZ2UuCi0gKiAyOCB0byAxODMgYnl0ZXMsICBESDMgaXMgdXNlZCBidXQgb25seSByb2J1c3QgYXQgc2hvcnQgcmFuZ2UgYW5kIGltcGFjdHMKLSAqIGlucXVpcnkKLSAqICAgICAgICAgICAgICAgICAgICBzY2FuIHRpbWUgd2l0aCBsYXJnZSBudW1iZXIgb2YgZGV2aWNlcy4KLSAqIDE4NCB0byAyNDAgYnl0ZXMsIERINSBpcyB1c2VkIGJ1dCBpdCBub3QgcmVjb21tZW5kZWQuCi0qLwotCi0jaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCA9PSBUUlVFKQotLyogZm9yIGV4YW1wbGUgKi8KLWNvbnN0IHVpbnQ4X3QgYnRhX2RtX2Vpcl91dWlkMTZfbGlzdFtdID0gewotICAgIDB4MDgsIDB4MTEsIC8qIEhlYWRzZXQgKi8KLSAgICAweDFFLCAweDExLCAvKiBIYW5kc2ZyZWUgKi8KLSAgICAweDBFLCAweDExLCAvKiBBViBSZW1vdGUgQ29udHJvbCAqLwotICAgIDB4MEIsIDB4MTEsIC8qIEF1ZGlvIFNpbmsgKi8KLX07Ci0jZW5kaWYgIC8vIEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVAotCi0vKiBFeHRlbmRlZCBJbnF1aXJ5IFJlc3BvbnNlICovCi1jb25zdCB0QlRBX0RNX0VJUl9DT05GIGJ0YV9kbV9laXJfY2ZnID0gewotICAgIDUwLCAvKiBtaW5pbXVtIGxlbmd0aCBvZiBsb2NhbCBuYW1lIHdoZW4gaXQgaXMgc2hvcnRlbmVkICovCi0gICAgICAgIC8qIGlmIGxlbmd0aCBvZiBsb2NhbCBuYW1lIGlzIGxvbmdlciB0aGFuIHRoaXMgYW5kIEVJUiBoYXMgbm90IGVub3VnaCAqLwotICAgICAgICAvKiByb29tIGZvciBhbGwgVVVJRCBsaXN0IHRoZW4gbG9jYWwgbmFtZSBpcyBzaG9ydGVuZWQgdG8gdGhpcyBsZW5ndGggKi8KLSNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IFRSVUUpCi0gICAgOCwgICAgKHVpbnQ4X3QqKWJ0YV9kbV9laXJfdXVpZDE2X2xpc3QsCi0jZWxzZSAgICAgLy8gQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUCi0gICAgewotICAgICAgICAvKiBtYXNrIG9mIFVVSUQgbGlzdCBpbiBFSVIgKi8KLSAgICAgICAgMHhGRkZGRkZGRiwgLyogTFNCIGlzIHRoZSBmaXJzdCBVVUlEIG9mIHRoZSBmaXJzdCAzMiBVVUlEcyBpbgotICAgICAgICAgICAgICAgICAgICAgICBCVE1fRUlSX1VVSURfTEtVUF9UQkwgKi8KLSAgICAgICAgMHhGRkZGRkZGRiAgLyogTFNCIGlzIHRoZSBmaXJzdCBVVUlEIG9mIHRoZSBuZXh0IDMyIFVVSURzIGluCi0gICAgICAgICAgICAgICAgICAgICAgIEJUTV9FSVJfVVVJRF9MS1VQX1RCTCAqLwotICAgICAgICAvKiBCVE1fRUlSX1VVSURfTEtVUF9UQkwgY2FuIGJlIG92ZXJyaWRlZCAqLwotICAgIH0sCi0jZW5kaWYgICAgLy8gQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUCi0gICAgTlVMTCwgLyogSW5xdWlyeSBUWCBwb3dlciAgICAgICAgICovCi0gICAgMCwgICAgLyogbGVuZ3RoIG9mIGZsYWdzIGluIGJ5dGVzICovCi0gICAgTlVMTCwgLyogZmxhZ3MgZm9yIEVJUiAqLwotICAgIDAsICAgIC8qIGxlbmd0aCBvZiBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgaW4gYnl0ZXMgKi8KLSAgICBOVUxMLCAvKiBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgKi8KLSAgICAwLCAgICAvKiBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhIGluIGJ5dGVzICovCi0gICAgTlVMTCAgLyogYWRkaXRpb25hbCBkYXRhICovCi19OwotY29uc3QgdEJUQV9ETV9FSVJfQ09ORiogcF9idGFfZG1fZWlyX2NmZyA9ICZidGFfZG1fZWlyX2NmZzsKZGlmZiAtLWdpdCBhL2J0YS9kbS9idGFfZG1fY2kuY2MgYi9idGEvZG0vYnRhX2RtX2NpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTgxNTI0Li4wMDAwMDAwCi0tLSBhL2J0YS9kbS9idGFfZG1fY2kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIEFQSSBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciB0aGUgQlRBIGRldmljZSBtYW5hZ2VyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYnRhL2RtL2J0YV9kbV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jaV9ybXRfb29iCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jb19ybXRfb29iKCkgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgYXNzb2NpYXRlZAotICogICAgICAgICAgICAgICAgICB3aXRoIHRoZSByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9jaV9ybXRfb29iKGJvb2wgYWNjZXB0LCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCBPY3RldDE2JiBjLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiByKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0NJX1JNVF9PT0I+IG1zZyA9Ci0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPHRCVEFfRE1fQ0lfUk1UX09PQj4oKTsKLQotICBtc2ctPmJkX2FkZHIgPSBiZF9hZGRyOwotICBtc2ctPmFjY2VwdCA9IGFjY2VwdDsKLSAgbXNnLT5jID0gYzsKLSAgbXNnLT5yID0gcjsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRhX2RtX2NpX3JtdF9vb2JfYWN0LCBiYXNlOjpQYXNzZWQoJm1zZykpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnRhL2RtL2J0YV9kbV9pbnQuaCBiL2J0YS9kbS9idGFfZG1faW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZDI1ZWIuLjAwMDAwMDAKLS0tIGEvYnRhL2RtL2J0YV9kbV9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHByaXZhdGUgaW50ZXJmYWNlIGZpbGUgZm9yIHRoZSBCVEEgZGV2aWNlIG1hbmFnZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX0RNX0lOVF9ICi0jZGVmaW5lIEJUQV9ETV9JTlRfSAotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBCVEFfQ09QWV9ERVZJQ0VfQ0xBU1MoY29kZHN0LCBjb2RzcmMpICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCh1aW50OF90KikoY29kZHN0KSlbMF0gPSAoKHVpbnQ4X3QqKShjb2RzcmMpKVswXTsgXAotICAgICgodWludDhfdCopKGNvZGRzdCkpWzFdID0gKCh1aW50OF90KikoY29kc3JjKSlbMV07IFwKLSAgICAoKHVpbnQ4X3QqKShjb2Rkc3QpKVsyXSA9ICgodWludDhfdCopKGNvZHNyYykpWzJdOyBcCi0gIH0KLQotI2RlZmluZSBCVEFfRE1fTVNHX0xFTiA1MAotCi0jZGVmaW5lIEJUQV9TRVJWSUNFX0lEX1RPX1NFUlZJQ0VfTUFTSyhpZCkgKDEgPDwgKGlkKSkKLQotLyogRE0gc2VhcmNoIGV2ZW50cyAqLwotZW51bSB7Ci0gIC8qIERNIHNlYXJjaCBBUEkgZXZlbnRzICovCi0gIEJUQV9ETV9BUElfU0VBUkNIX0VWVCA9IEJUQV9TWVNfRVZUX1NUQVJUKEJUQV9JRF9ETV9TRUFSQ0gpLAotICBCVEFfRE1fQVBJX0RJU0NPVkVSX0VWVCwKLSAgQlRBX0RNX0lOUVVJUllfQ01QTF9FVlQsCi0gIEJUQV9ETV9SRU1UX05BTUVfRVZULAotICBCVEFfRE1fU0RQX1JFU1VMVF9FVlQsCi0gIEJUQV9ETV9TRUFSQ0hfQ01QTF9FVlQsCi0gIEJUQV9ETV9ESVNDT1ZFUllfUkVTVUxUX0VWVCwKLSAgQlRBX0RNX0RJU0NfQ0xPU0VfVE9VVF9FVlQsCi0gIEJUQV9ETV9BUElfUVVFVUVfU0VBUkNIX0VWVCwKLSAgQlRBX0RNX0FQSV9RVUVVRV9ESVNDT1ZFUl9FVlQKLX07Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX0FQSV9TRUFSQ0hfRVZUIGFuZCBCVEFfRE1fQVBJX1FVRVVFX1NFQVJDSF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXM7Ci0gIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrOwotfSB0QlRBX0RNX0FQSV9TRUFSQ0g7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX0FQSV9ESVNDT1ZFUl9FVlQgYW5kIEJUQV9ETV9BUElfUVVFVUVfRElTQ09WRVJfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2s7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotfSB0QlRBX0RNX0FQSV9ESVNDT1ZFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGJvb2wgYWNjZXB0OwotICB1aW50OF90IHBpbl9sZW47Ci0gIHVpbnQ4X3QgcF9waW5bUElOX0NPREVfTEVOXTsKLX0gdEJUQV9ETV9BUElfUElOX1JFUExZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdEJUTV9JT19DQVAgaW9fY2FwOwotICB0QlRNX09PQl9EQVRBIG9vYl9kYXRhOwotICB0QlRNX0FVVEhfUkVRIGF1dGhfcmVxOwotfSB0QlRBX0RNX0NJX0lPX1JFUTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIE9jdGV0MTYgYzsKLSAgT2N0ZXQxNiByOwotICBib29sIGFjY2VwdDsKLX0gdEJUQV9ETV9DSV9STVRfT09COwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9ETV9SRU1UX05BTUVfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVEFfRE1fU0VBUkNIIHJlc3VsdDsKLX0gdEJUQV9ETV9SRU1fTkFNRTsKLQotLyogZGF0YSB0eXBlIGZvciB0QlRBX0RNX0RJU0NfUkVTVUxUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVEFfRE1fU0VBUkNIIHJlc3VsdDsKLX0gdEJUQV9ETV9ESVNDX1JFU1VMVDsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfRE1fSU5RVUlSWV9DTVBMX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50OF90IG51bTsKLX0gdEJUQV9ETV9JTlFVSVJZX0NNUEw7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX0RNX1NEUF9SRVNVTFRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHVpbnQxNl90IHNkcF9yZXN1bHQ7Ci19IHRCVEFfRE1fU0RQX1JFU1VMVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIERFVl9DTEFTUyBkYzsKLSAgTGlua0tleSBsaW5rX2tleTsKLSAgdWludDhfdCBrZXlfdHlwZTsKLSAgYm9vbCBsaW5rX2tleV9rbm93bjsKLSAgYm9vbCBkY19rbm93bjsKLSAgQkRfTkFNRSBiZF9uYW1lOwotICB1aW50OF90IHBpbl9sZW5ndGg7Ci19IHRCVEFfRE1fQVBJX0FERF9ERVZJQ0U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgYm9vbCBlbmFibGU7Ci19IHRCVEFfRE1fQVBJX0JMRV9GRUFUVVJFOwotCi0vKiB1bmlvbiBvZiBhbGwgZGF0YSB0eXBlcyAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIC8qIEdLSSBldmVudCBidWZmZXIgaGVhZGVyICovCi0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0KLSAgdEJUQV9ETV9BUElfU0VBUkNIIHNlYXJjaDsKLQotICB0QlRBX0RNX0FQSV9ESVNDT1ZFUiBkaXNjb3ZlcjsKLQotICB0QlRBX0RNX1JFTV9OQU1FIHJlbV9uYW1lOwotCi0gIHRCVEFfRE1fRElTQ19SRVNVTFQgZGlzY19yZXN1bHQ7Ci0KLSAgdEJUQV9ETV9JTlFVSVJZX0NNUEwgaW5xX2NtcGw7Ci0KLSAgdEJUQV9ETV9TRFBfUkVTVUxUIHNkcF9ldmVudDsKLQotfSB0QlRBX0RNX01TRzsKLQotI2RlZmluZSBCVEFfRE1fTlVNX1BFRVJfREVWSUNFIDcKLQotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEJUQV9ETV9OT1RfQ09OTkVDVEVEID0gMCwKLSAgQlRBX0RNX0NPTk5FQ1RFRCA9IDEsCi0gIEJUQV9ETV9VTlBBSVJJTkcgPSAyLAotfSB0QlRBX0RNX0NPTk5fU1RBVEU7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBidGFfY29ubl9zdGF0ZV90ZXh0KHRCVEFfRE1fQ09OTl9TVEFURSBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfRE1fTk9UX0NPTk5FQ1RFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfRE1fQ09OTkVDVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9ETV9VTlBBSVJJTkcpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV04iKTsKLSAgfQotfQotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRBX0RNX0RJX05PTkUgPSAweDAwLCAgICAgIC8qIG5vdGhpbmcgc3BlY2lhbCAqLwotICBCVEFfRE1fRElfU0VUX1NOSUZGID0gMHgwMSwgLyogc2V0IHRoaXMgYml0IGlmIGNhbGwgQlRNX1NldFBvd2VyTW9kZShzbmlmZikgKi8KLSAgQlRBX0RNX0RJX0lOVF9TTklGRiA9IDB4MDIsIC8qIHNldCB0aGlzIGJpdCBpZiBjYWxsIEJUTV9TZXRQb3dlck1vZGUoc25pZmYpICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyIHNuaWZmIG1vZGUgKi8KLSAgQlRBX0RNX0RJX0FDUF9TTklGRiA9IDB4MDQsIC8qIHNldCB0aGlzIGJpdCBpZiBwZWVyIGluaXQgc25pZmYgKi8KLSAgQlRBX0RNX0RJX1VOVVNFRCA9IDB4MDgsCi0gIEJUQV9ETV9ESV9VU0VfU1NSID0gMHgxMCwgLyogc2V0IHRoaXMgYml0IGlmIHNzciBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgbGluayAqLwotICBCVEFfRE1fRElfQVZfQUNUSVZFID0gMHgyMCwgLyogc2V0IHRoaXMgYml0IGlmIEFWIGlzIGFjdGl2ZSBmb3IgdGhpcyBsaW5rICovCi19IHRCVEFfRE1fREVWX0lORk9fQklUTUFTSzsKLXR5cGVkZWYgdWludDhfdCB0QlRBX0RNX0RFVl9JTkZPOwotCi1pbmxpbmUgc3RkOjpzdHJpbmcgZGV2aWNlX2luZm9fdGV4dCh0QlRBX0RNX0RFVl9JTkZPIGluZm8pIHsKLSAgY29uc3QgY2hhciogY29uc3QgZGV2aWNlX2luZm9fdGV4dFtdID0gewotICAgICAgIjpzZXRfc25pZmYiLCAiOmludF9zbmlmZiIsICI6YWNwX3NuaWZmIiwKLSAgICAgICI6dW51c2VkIiwgICAgIjp1c2Vfc3NyIiwgICAiOmF2X2FjdGl2ZSIsCi0gIH07Ci0KLSAgc3RkOjpzdHJpbmcgcyA9IGJhc2U6OlN0cmluZ1ByaW50ZigiMHglMDJ4IiwgaW5mbyk7Ci0gIGlmIChpbmZvID09IEJUQV9ETV9ESV9OT05FKSByZXR1cm4gcyArIHN0ZDo6c3RyaW5nKCI6bm9uZSIpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihkZXZpY2VfaW5mb190ZXh0KSAvIHNpemVvZihkZXZpY2VfaW5mb190ZXh0WzBdKTsKLSAgICAgICBpKyspIHsKLSAgICBpZiAoaW5mbyAmICgxdSA8PCBpKSkgcyArPSBzdGQ6OnN0cmluZyhkZXZpY2VfaW5mb190ZXh0W2ldKTsKLSAgfQotICByZXR1cm4gczsKLX0KLQotLyogc2V0IHBvd2VyIG1vZGUgcmVxdWVzdCB0eXBlICovCi0jZGVmaW5lIEJUQV9ETV9QTV9SRVNUQVJUIDEKLSNkZWZpbmUgQlRBX0RNX1BNX05FV19SRVEgMgotI2RlZmluZSBCVEFfRE1fUE1fRVhFQ1VURSAzCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9QTV9SRVE7Ci0KLXN0cnVjdCB0QlRBX0RNX1BFRVJfREVWSUNFIHsKLSAgUmF3QWRkcmVzcyBwZWVyX2JkYWRkcjsKLSAgdEJUQV9ETV9DT05OX1NUQVRFIGNvbm5fc3RhdGU7Ci0gIHRCVEFfUFJFRl9ST0xFUyBwcmVmX3JvbGU7Ci0gIGJvb2wgaW5fdXNlOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIHZvaWQgYnRhX2RtX2FjbF91cChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0gIGZyaWVuZCB2b2lkIGJ0YV9kbV9wbV9idG1fc3RhdHVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fUE1fU1RBVFVTIHN0YXR1cywgdWludDE2X3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpOwotICBmcmllbmQgdm9pZCBidGFfZG1fcG1fc25pZmYoc3RydWN0IHRCVEFfRE1fUEVFUl9ERVZJQ0UqIHBfcGVlcl9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluZGV4KTsKLSAgZnJpZW5kIHZvaWQgYnRhX2RtX3JtX2NiYWNrKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotICBmcmllbmQgdm9pZCBoYW5kbGVfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICB0QlRBX0RNX0RFVl9JTkZPIGluZm87Ci0KLSBwdWJsaWM6Ci0gIHRCVEFfRE1fREVWX0lORk8gSW5mbygpIGNvbnN0IHsgcmV0dXJuIGluZm87IH0KLQotICB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqIHBfZW5jcnlwdF9jYmFjazsKLSAgdEJUTV9QTV9TVEFUVVMgcHJldl9sb3c7IC8qIHByZXZpb3VzIGxvdyBwb3dlciBtb2RlIHVzZWQgKi8KLSAgdEJUQV9ETV9QTV9BQ1RJT04gcG1fbW9kZV9hdHRlbXB0ZWQ7Ci0gIHRCVEFfRE1fUE1fQUNUSU9OIHBtX21vZGVfZmFpbGVkOwotICBib29sIHJlbW92ZV9kZXZfcGVuZGluZzsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci19OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgbGlzdCBvZgotICBhY3RpdmUgY29ubmVjdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9ETV9QRUVSX0RFVklDRSBwZWVyX2RldmljZVtCVEFfRE1fTlVNX1BFRVJfREVWSUNFXTsKLSAgdWludDhfdCBjb3VudDsKLSAgdWludDhfdCBsZV9jb3VudDsKLX0gdEJUQV9ETV9BQ1RJVkVfTElOSzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIHBlZXJfYmRhZGRyOwotICB0QlRBX1NZU19JRCBpZDsKLSAgdWludDhfdCBhcHBfaWQ7Ci0gIHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXRlOwotICBib29sIG5ld19yZXF1ZXN0OwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICJwZWVyOiVzIHN5c19uYW1lOiVzIGFwcF9pZDolaGh1IHN0YXRlOiVzIG5ldzpyZXF1ZXN0OiVzIiwKLSAgICAgICAgUFJJVkFURV9BRERSRVNTKHBlZXJfYmRhZGRyKSwgQnRhSWRTeXNUZXh0KGlkKS5jX3N0cigpLCBhcHBfaWQsCi0gICAgICAgIGJ0YV9zeXNfY29ubl9zdGF0dXNfdGV4dChzdGF0ZSkuY19zdHIoKSwgbG9nYm9vbChuZXdfcmVxdWVzdCkuY19zdHIoKSk7Ci0gIH0KLQotfSB0QlRBX0RNX1NSVkNTOwotCi0jaWZuZGVmIEJUQV9ETV9OVU1fQ09OTl9TUlZTCi0jZGVmaW5lIEJUQV9ETV9OVU1fQ09OTl9TUlZTIDMwCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGNvdW50OwotICB0QlRBX0RNX1NSVkNTIGNvbm5fc3J2Y1tCVEFfRE1fTlVNX0NPTk5fU1JWU107Ci0KLX0gdEJUQV9ETV9DT05ORUNURURfU1JWQ1M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX1RJTUVSX0lEWCAwCi0jZGVmaW5lIEJUQV9ETV9QTV9QQVJLX1RJTUVSX0lEWCAxCi0jZGVmaW5lIEJUQV9ETV9QTV9TVVNQRU5EX1RJTUVSX0lEWCAyCi0jZGVmaW5lIEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWCAzCi0gIC8qCi0gICAqIEtlZXAgdGhyZWUgZGlmZmVyZW50IHRpbWVycyBmb3IgUEFSSywgU05JRkYgYW5kIFNVU1BFTkQgaWYgVEJGQyBpcwotICAgKiBzdXBwb3J0ZWQuCi0gICAqLwotICBhbGFybV90KiB0aW1lcltCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVhdOwotCi0gIHVpbnQ4X3Qgc3J2Y19pZFtCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVhdOwotICB1aW50OF90IHBtX2FjdGlvbltCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVhdOwotICB1aW50OF90IGFjdGl2ZTsgLyogbnVtYmVyIG9mIGFjdGl2ZSB0aW1lciAqLwotCi0gIFJhd0FkZHJlc3MgcGVlcl9iZGFkZHI7Ci0gIGJvb2wgaW5fdXNlOwotfSB0QlRBX1BNX1RJTUVSOwotCi1leHRlcm4gdEJUQV9ETV9DT05ORUNURURfU1JWQ1MgYnRhX2RtX2Nvbm5fc3J2Y3M7Ci0KLSNkZWZpbmUgQlRBX0RNX05VTV9QTV9USU1FUiA3Ci0KLS8qIERNIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpc19idGFfZG1fYWN0aXZlOwotICB0QlRBX0RNX0FDVElWRV9MSU5LIGRldmljZV9saXN0OwotICB0QlRBX0RNX1NFQ19DQkFDSyogcF9zZWNfY2JhY2s7Ci0gIHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBwX2VuZXJneV9pbmZvX2NiYWNrOwotICB1aW50MTZfdCBzdGF0ZTsKLSAgYm9vbCBkaXNhYmxpbmc7Ci0gIGFsYXJtX3QqIGRpc2FibGVfdGltZXI7Ci0gIHVpbnQzMl90IHdidF9zZHBfaGFuZGxlOyAvKiBXSURDT01NIEV4dGVuc2lvbnMgU0RQIHJlY29yZCBoYW5kbGUgKi8KLSAgdWludDhfdCB3YnRfc2NuOyAgICAgICAgIC8qIFdJRENPTU0gRXh0ZW5zaW9ucyBTQ04gKi8KLSAgdWludDhfdCBudW1fY2VudHJhbF9vbmx5OwotICB1aW50OF90IHBtX2lkOwotICB0QlRBX1BNX1RJTUVSIHBtX3RpbWVyW0JUQV9ETV9OVU1fUE1fVElNRVJdOwotICB1aW50OF90IGN1cl9hdl9jb3VudDsgICAvKiBjdXJyZW50IEFWIGNvbm5lY2lvbnMgKi8KLSAgYm9vbCBkaXNhYmxlX3BhaXJfbW9kZTsgLyogZGlzYWJsZSBwYWlyIG1vZGUgb3Igbm90ICovCi0gIGJvb2wgY29ubl9wYWlyZWRfb25seTsgIC8qIGFsbG93IGNvbm5lY3RhYmxlIHRvIHBhaXJlZCBkZXZpY2Ugb25seSBvciBub3QgKi8KLSAgdEJUQV9ETV9BUElfU0VBUkNIIHNlYXJjaF9tc2c7Ci0KLSAgLyogU3RvcmFnZSBmb3IgcGluIGNvZGUgcmVxdWVzdCBwYXJhbWV0ZXJzICovCi0gIFJhd0FkZHJlc3MgcGluX2JkX2FkZHI7Ci0gIERFVl9DTEFTUyBwaW5fZGV2X2NsYXNzOwotICB0QlRBX0RNX1NFQ19FVlQgcGluX2V2dDsKLSAgdEJUTV9JT19DQVAgbG9jX2lvX2NhcHM7ICAgIC8qIElPIENhcGFiaWxpdGllcyBvZiBsb2NhbCBkZXZpY2UgKi8KLSAgdEJUTV9JT19DQVAgcm10X2lvX2NhcHM7ICAgIC8qIElPIENhcGFiaWxpdGllcyBvZiByZW1vdGUgZGV2aWNlICovCi0gIHRCVE1fQVVUSF9SRVEgbG9jX2F1dGhfcmVxOyAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgbG9jYWwgZGV2aWNlICovCi0gIHRCVE1fQVVUSF9SRVEgcm10X2F1dGhfcmVxOwotICB1aW50MzJfdCBudW1fdmFsOyAvKiB0aGUgbnVtZXJpYyB2YWx1ZSBmb3IgY29tcGFyaXNvbi4gSWYganVzdF93b3JrcywgZG8gbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNob3cgdGhpcyBudW1iZXIgdG8gVUkgKi8KLSAgYm9vbCBqdXN0X3dvcmtzOyAgLyogdHJ1ZSwgaWYgIkp1c3QgV29ya3MiIGFzc29jaWF0aW9uIG1vZGVsICovCi0jaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFKQotICAvKiBzdG9yZSBVVUlEIGxpc3QgZm9yIEVJUiAqLwotICB1aW50MzJfdCBlaXJfdXVpZFtCVE1fRUlSX1NFUlZJQ0VfQVJSQVlfU0laRV07Ci0jaWYgKEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRCA+IDApCi0gIHRCVEFfQ1VTVE9NX1VVSUQgYnRhX2N1c3RvbV91dWlkW0JUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRF07Ci0jZW5kaWYKLQotI2VuZGlmCi0KLSAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2VuY3J5cHRfY2JhY2s7Ci0gIGFsYXJtX3QqIHN3aXRjaF9kZWxheV90aW1lcjsKLQotfSB0QlRBX0RNX0NCOwotCi0vKiBETSBzZWFyY2ggY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9zZWFyY2hfY2JhY2s7Ci0gIHRCVE1fSU5RX0lORk8qIHBfYnRtX2lucV9pbmZvOwotICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlczsKLSAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXNfdG9fc2VhcmNoOwotICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlc19mb3VuZDsKLSAgdFNEUF9ESVNDT1ZFUllfREIqIHBfc2RwX2RiOwotICB1aW50MTZfdCBzdGF0ZTsKLSAgUmF3QWRkcmVzcyBwZWVyX2JkYWRkcjsKLSAgYm9vbCBuYW1lX2Rpc2NvdmVyX2RvbmU7Ci0gIEJEX05BTUUgcGVlcl9uYW1lOwotICBhbGFybV90KiBzZWFyY2hfdGltZXI7Ci0gIHVpbnQ4X3Qgc2VydmljZV9pbmRleDsKLSAgdEJUQV9ETV9NU0cqIHBfcGVuZGluZ19zZWFyY2g7Ci0gIGZpeGVkX3F1ZXVlX3QqIHBlbmRpbmdfZGlzY292ZXJ5X3F1ZXVlOwotICBib29sIHdhaXRfZGlzYzsKLSAgYm9vbCBzZHBfcmVzdWx0czsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIHVpbnQ4X3QgcGVlcl9zY247Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9zY2FuX2NiYWNrOwotICB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jc2lzX3NjYW5fY2JhY2s7Ci0gIHRHQVRUX0lGIGNsaWVudF9pZjsKLSAgdWludDhfdCB1dWlkX3RvX3NlYXJjaDsKLSAgYm9vbCBnYXR0X2Rpc2NfYWN0aXZlOwotICB1aW50MTZfdCBjb25uX2lkOwotICBhbGFybV90KiBnYXR0X2Nsb3NlX3RpbWVyOyAvKiBHQVRUIGNoYW5uZWwgY2xvc2UgZGVsYXkgdGltZXIgKi8KLSAgUmF3QWRkcmVzcyBwZW5kaW5nX2Nsb3NlX2JkYTsgLyogcGVuZGluZyBHQVRUIGNoYW5uZWwgcmVtb3RlIGRldmljZSBhZGRyZXNzICovCi0KLX0gdEJUQV9ETV9TRUFSQ0hfQ0I7Ci0KLS8qIERJIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBkaV9udW07ICAgICAgICAgICAgICAgICAgICAgLyogdG90YWwgbG9jYWwgREkgcmVjb3JkIG51bWJlciAqLwotICB1aW50MzJfdCBkaV9oYW5kbGVbQlRBX0RJX05VTV9NQVhdOyAvKiBsb2NhbCBESSByZWNvcmQgaGFuZGxlLCB0aGUgZmlyc3Qgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByaW1hcnkgcmVjb3JkICovCi19IHRCVEFfRE1fRElfQ0I7Ci0KLS8qIERNIHNlYXJjaCBzdGF0ZSAqLwotZW51bSB7Ci0KLSAgQlRBX0RNX1NFQVJDSF9JRExFLAotICBCVEFfRE1fU0VBUkNIX0FDVElWRSwKLSAgQlRBX0RNX1NFQVJDSF9DQU5DRUxMSU5HLAotICBCVEFfRE1fRElTQ09WRVJfQUNUSVZFCi0KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgREVWX0NMQVNTIGRldl9jbGFzczsgLyogbG9jYWwgZGV2aWNlIGNsYXNzICovCi0gIHVpbnQxNl90IHBhZ2VfdGltZW91dDsgLyogdGltZW91dCBmb3IgcGFnZSBpbiBzbG90cyAqLwotICBib29sIGF2b2lkX3NjYXR0ZXI7IC8qIHRydWUgdG8gYXZvaWQgc2NhdHRlcm5ldCB3aGVuIGF2IGlzIHN0cmVhbWluZyAoYmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbCkgKi8KLQotfSB0QlRBX0RNX0NGRzsKLQotZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGJ0YV9zZXJ2aWNlX2lkX3RvX2J0bV9zcnZfaWRfbGt1cF90YmxbXTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGlkOwotICB1aW50OF90IGFwcF9pZDsKLSAgdWludDhfdCBjZmc7Ci0KLX0gdEJUQV9ETV9STTsKLQotZXh0ZXJuIGNvbnN0IHRCVEFfRE1fQ0ZHKiBwX2J0YV9kbV9jZmc7Ci1leHRlcm4gY29uc3QgdEJUQV9ETV9STSogcF9idGFfZG1fcm1fY2ZnOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgaWQ7Ci0gIHVpbnQ4X3QgYXBwX2lkOwotICB1aW50OF90IHNwZWNfaWR4OyAvKiBpbmRleCBvZiBzcGVjIHRhYmxlIHRvIHVzZSAqLwotCi19IHRCVEFfRE1fUE1fQ0ZHOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfRE1fUE1fQUNUSU9OIHBvd2VyX21vZGU7Ci0gIHVpbnQxNl90IHRpbWVvdXQ7Ci0KLX0gdEJUQV9ETV9QTV9BQ1ROOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYWxsb3dfbWFzazsgLyogbWFzayBvZiBzbmlmZi9ob2xkL3BhcmsgbW9kZXMgdG8gYWxsb3cgKi8KLSAgdWludDhfdCBzc3I7IC8qIHNldCBTU1Igb24gY29ubiBvcGVuL3VucGFyayAqLwotICB0QlRBX0RNX1BNX0FDVE4gYWN0bl90YmxbQlRBX0RNX1BNX05VTV9FVlRTXVsyXTsKLQotfSB0QlRBX0RNX1BNX1NQRUM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgbWF4X2xhdDsKLSAgdWludDE2X3QgbWluX3JtdF90bzsKLSAgdWludDE2X3QgbWluX2xvY190bzsKLSAgY29uc3QgY2hhciogbmFtZXtudWxscHRyfTsKLX0gdEJUQV9ETV9TU1JfU1BFQzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBtYW51ZmFjdHVyZXI7Ci0gIHVpbnQxNl90IGxtcF9zdWJfdmVyc2lvbjsKLSAgdWludDhfdCBsbXBfdmVyc2lvbjsKLX0gdEJUQV9ETV9MTVBfVkVSX0lORk87Ci0KLWV4dGVybiBjb25zdCB1aW50MTZfdCBidGFfc2VydmljZV9pZF90b191dWlkX2xrdXBfdGJsW107Ci0KLWV4dGVybiBjb25zdCB0QlRBX0RNX1BNX0NGRyogcF9idGFfZG1fcG1fY2ZnOwotZXh0ZXJuIGNvbnN0IHRCVEFfRE1fUE1fU1BFQyogcF9idGFfZG1fcG1fc3BlYzsKLWV4dGVybiBjb25zdCB0QlRNX1BNX1BXUl9NRCogcF9idGFfZG1fcG1fbWQ7Ci1leHRlcm4gdEJUQV9ETV9TU1JfU1BFQyogcF9idGFfZG1fc3NyX3NwZWM7Ci0KLS8qIHVwZGF0ZSBkeW5hbWljIEJSQ00gQXdhcmUgRUlSIGRhdGEgKi8KLWV4dGVybiBjb25zdCB0QlRBX0RNX0VJUl9DT05GIGJ0YV9kbV9laXJfY2ZnOwotZXh0ZXJuIGNvbnN0IHRCVEFfRE1fRUlSX0NPTkYqIHBfYnRhX2RtX2Vpcl9jZmc7Ci0KLS8qIERNIGNvbnRyb2wgYmxvY2sgKi8KLWV4dGVybiB0QlRBX0RNX0NCIGJ0YV9kbV9jYjsKLQotLyogRE0gc2VhcmNoIGNvbnRyb2wgYmxvY2sgKi8KLWV4dGVybiB0QlRBX0RNX1NFQVJDSF9DQiBidGFfZG1fc2VhcmNoX2NiOwotCi0vKiBESSBjb250cm9sIGJsb2NrICovCi1leHRlcm4gdEJUQV9ETV9ESV9DQiBidGFfZG1fZGlfY2I7Ci0KLWV4dGVybiBib29sIGJ0YV9kbV9zZWFyY2hfc21fZXhlY3V0ZShCVF9IRFJfUklHSUQqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9zZWFyY2hfc21fZGlzYWJsZSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2RtX2VuYWJsZSh0QlRBX0RNX1NFQ19DQkFDSyopOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2Rpc2FibGUoKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9pbml0X2NiKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2RlaW5pdF9jYih2b2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9zZXRfZGV2X25hbWUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9zZXRfdmlzaWJpbGl0eSh0QlRBX0RNX0RJU0MsIHRCVEFfRE1fQ09OTik7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2V0X3NjYW5fY29uZmlnKHRCVEFfRE1fTVNHKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3ZlbmRvcl9zcGVjX2NvbW1hbmQodEJUQV9ETV9NU0cqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZG1fYm9uZChjb25zdCBSYXdBZGRyZXNzJiwgdEJMRV9BRERSX1RZUEUsIHRCVF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JvbmRfY2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9waW5fcmVwbHkoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX1BJTl9SRVBMWT4gbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9hZGRfZGV2aWNlKHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0FQSV9BRERfREVWSUNFPiBtc2cpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3JlbW92ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfZG1fY2xvc2VfYWNsKGNvbnN0IFJhd0FkZHJlc3MmLCBib29sLCB0QlRfVFJBTlNQT1JUKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2RtX3BtX2J0bV9zdGF0dXMoY29uc3QgUmF3QWRkcmVzcyYsIHRCVE1fUE1fU1RBVFVTLCB1aW50MTZfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9wbV90aW1lcihjb25zdCBSYXdBZGRyZXNzJiwgdEJUQV9ETV9QTV9BQ1RJT04pOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2FkZF9hbXBrZXkodEJUQV9ETV9NU0cqIHBfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9kbV9hZGRfYmxla2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0xFX0tFWV9WQUxVRSBibGVrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFIGtleV90eXBlKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9hZGRfYmxlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9wYXNza2V5X3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9jb25maXJtX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmLCBib29sKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9ibGVfc2V0X2Nvbm5fcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmLCB1aW50MTZfdCwgdWludDE2X3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgdWludDE2X3QpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2Nsb3NlX2dhdHRfY29ubih0QlRBX0RNX01TRyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9ibGVfb2JzZXJ2ZShib29sLCB1aW50OF90LCB0QlRBX0RNX1NFQVJDSF9DQkFDSyopOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9zY2FuKGJvb2wsIHVpbnQ4X3QpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9jc2lzX29ic2VydmUoYm9vbCwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9ibGVfdXBkYXRlX2Nvbm5fcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmLCB1aW50MTZfdCwgdWludDE2X3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQxNl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9jb25maWdfbG9jYWxfcHJpdmFjeShib29sKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9zZXRfZGF0YV9sZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLWV4dGVybiB2b2lkIGJ0YV9kbV9ibGVfZ2V0X2VuZXJneV9pbmZvKHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKik7Ci0KLWV4dGVybiB2b2lkIGJ0YV9kbV9zZXRfZW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiwgdEJUX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqLCB0QlRNX0JMRV9TRUNfQUNUKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9jb25maXJtKGNvbnN0IFJhd0FkZHJlc3MmLCBib29sKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2RtX2NpX3JtdF9vb2JfYWN0KHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0NJX1JNVF9PT0I+IG1zZyk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9kbV9pbml0X3BtKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2Rpc2FibGVfcG0odm9pZCk7Ci0KLWV4dGVybiB1aW50OF90IGJ0YV9kbV9nZXRfYXZfY291bnQodm9pZCk7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2VhcmNoX3N0YXJ0KHRCVEFfRE1fTVNHKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3NlYXJjaF9jYW5jZWwoKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9kaXNjb3Zlcih0QlRBX0RNX01TRyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9pbnFfY21wbCh1aW50OF90IG51bSk7Ci1leHRlcm4gdm9pZCBidGFfZG1fcm10X25hbWUodEJUQV9ETV9NU0cqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2RwX3Jlc3VsdCh0QlRBX0RNX01TRyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9zZWFyY2hfY21wbCgpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2ZyZWVfc2RwX2RiKCk7Ci1leHRlcm4gdm9pZCBidGFfZG1fZGlzY19yZXN1bHQodEJUQV9ETV9NU0cqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2VhcmNoX3Jlc3VsdCh0QlRBX0RNX01TRyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9kaXNjb3ZlcnlfY21wbCh0QlRBX0RNX01TRyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9xdWV1ZV9zZWFyY2godEJUQV9ETV9NU0cqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZG1fcXVldWVfZGlzYyh0QlRBX0RNX01TRyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9leGVjdXRlX3F1ZXVlZF9yZXF1ZXN0KCk7Ci1leHRlcm4gYm9vbCBidGFfZG1faXNfc2VhcmNoX3JlcXVlc3RfcXVldWVkKCk7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2VhcmNoX2NsZWFyX3F1ZXVlKCk7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2VhcmNoX2NhbmNlbF9ub3RpZnkoKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9kaXNjX3JtdF9uYW1lKHRCVEFfRE1fTVNHKiBwX2RhdGEpOwotZXh0ZXJuIHRCVEFfRE1fUEVFUl9ERVZJQ0UqIGJ0YV9kbV9maW5kX3BlZXJfZGV2aWNlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci0KLXVpbnQ4X3QgYnRhX2RtX3NlYXJjaF9nZXRfc3RhdGUoKTsKLXZvaWQgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUodWludDhfdCBzdGF0ZSk7Ci0KLXZvaWQgYnRhX2RtX2Vpcl91cGRhdGVfdXVpZCh1aW50MTZfdCB1dWlkMTYsIGJvb2wgYWRkaW5nKTsKLXZvaWQgYnRhX2RtX2Vpcl91cGRhdGVfY3VzdF91dWlkKGNvbnN0IHRCVEFfQ1VTVE9NX1VVSUQgJmN1cnIsIGJvb2wgYWRkaW5nKTsKLQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLSNlbmRpZiAvKiBCVEFfRE1fSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9kbS9idGFfZG1fbWFpbi5jYyBiL2J0YS9kbS9idGFfZG1fbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzODMxYi4uMDAwMDAwMAotLS0gYS9idGEvZG0vYnRhX2RtX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBtYWluIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIHRoZSBCVEEgZGV2aWNlIG1hbmFnZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jaW5jbHVkZSAiYnRhL2RtL2J0YV9kbV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25zdGFudHMgYW5kIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdEJUQV9ETV9DQiBidGFfZG1fY2I7Ci10QlRBX0RNX1NFQVJDSF9DQiBidGFfZG1fc2VhcmNoX2NiOwotdEJUQV9ETV9ESV9DQiBidGFfZG1fZGlfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc21fc2VhcmNoX2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgdW5yZWdpc3RlciBCVEEgU0VBUkNIIERNCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9zZWFyY2hfc21fZGlzYWJsZSgpIHsgYnRhX3N5c19kZXJlZ2lzdGVyKEJUQV9JRF9ETV9TRUFSQ0gpOyB9Ci0KLXZvaWQgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUodWludDhfdCBzdGF0ZSkgeyBidGFfZG1fc2VhcmNoX2NiLnN0YXRlID0gc3RhdGU7IH0KLXVpbnQ4X3QgYnRhX2RtX3NlYXJjaF9nZXRfc3RhdGUoKSB7IHJldHVybiBidGFfZG1fc2VhcmNoX2NiLnN0YXRlOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2VhcmNoX3NtX2V4ZWN1dGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXRlIG1hY2hpbmUgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24gZm9yIERNCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9kbV9zZWFyY2hfc21fZXhlY3V0ZShCVF9IRFJfUklHSUQqIHBfbXNnKSB7Ci0gIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9kbV9zZWFyY2hfc21fZXhlY3V0ZSBzdGF0ZTolZCwgZXZlbnQ6MHgleCIsCi0gICAgICAgICAgICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZSwgcF9tc2ctPmV2ZW50KTsKLQotICB0QlRBX0RNX01TRyogbWVzc2FnZSA9ICh0QlRBX0RNX01TRyopcF9tc2c7Ci0gIHN3aXRjaCAoYnRhX2RtX3NlYXJjaF9jYi5zdGF0ZSkgewotICAgIGNhc2UgQlRBX0RNX1NFQVJDSF9JRExFOgotICAgICAgc3dpdGNoIChwX21zZy0+ZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX1NFQVJDSF9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUoQlRBX0RNX1NFQVJDSF9BQ1RJVkUpOwotICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfc3RhcnQobWVzc2FnZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0RNX0FQSV9ESVNDT1ZFUl9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUoQlRBX0RNX0RJU0NPVkVSX0FDVElWRSk7Ci0gICAgICAgICAgYnRhX2RtX2Rpc2NvdmVyKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9TRFBfUkVTVUxUX0VWVDoKLSAgICAgICAgICBidGFfZG1fZnJlZV9zZHBfZGIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fRElTQ19DTE9TRV9UT1VUX0VWVDoKLSAgICAgICAgICBidGFfZG1fY2xvc2VfZ2F0dF9jb25uKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9BUElfUVVFVUVfU0VBUkNIX0VWVDoKLSAgICAgICAgICBidGFfZG1fcXVldWVfc2VhcmNoKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9BUElfUVVFVUVfRElTQ09WRVJfRVZUOgotICAgICAgICAgIGJ0YV9kbV9xdWV1ZV9kaXNjKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fU0VBUkNIX0FDVElWRToKLSAgICAgIHN3aXRjaCAocF9tc2ctPmV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0RNX1JFTVRfTkFNRV9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3JtdF9uYW1lKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9TRFBfUkVTVUxUX0VWVDoKLSAgICAgICAgICBidGFfZG1fc2RwX3Jlc3VsdChtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fU0VBUkNIX0NNUExfRVZUOgotICAgICAgICAgIGJ0YV9kbV9zZWFyY2hfY21wbCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9ESVNDT1ZFUllfUkVTVUxUX0VWVDoKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX3Jlc3VsdChtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fRElTQ19DTE9TRV9UT1VUX0VWVDoKLSAgICAgICAgICBidGFfZG1fY2xvc2VfZ2F0dF9jb25uKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9BUElfRElTQ09WRVJfRVZUOgotICAgICAgICBjYXNlIEJUQV9ETV9BUElfUVVFVUVfRElTQ09WRVJfRVZUOgotICAgICAgICAgIGJ0YV9kbV9xdWV1ZV9kaXNjKG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fU0VBUkNIX0NBTkNFTExJTkc6Ci0gICAgICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkgewotICAgICAgICBjYXNlIEJUQV9ETV9BUElfU0VBUkNIX0VWVDoKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX1FVRVVFX1NFQVJDSF9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3F1ZXVlX3NlYXJjaChtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX0RJU0NPVkVSX0VWVDoKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX1FVRVVFX0RJU0NPVkVSX0VWVDoKLSAgICAgICAgICBidGFfZG1fcXVldWVfZGlzYyhtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fU0RQX1JFU1VMVF9FVlQ6Ci0gICAgICAgIGNhc2UgQlRBX0RNX1JFTVRfTkFNRV9FVlQ6Ci0gICAgICAgIGNhc2UgQlRBX0RNX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgICAgY2FzZSBCVEFfRE1fRElTQ09WRVJZX1JFU1VMVF9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9zZXRfc3RhdGUoQlRBX0RNX1NFQVJDSF9JRExFKTsKLSAgICAgICAgICBidGFfZG1fZnJlZV9zZHBfZGIoKTsKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NhbmNlbF9ub3RpZnkoKTsKLSAgICAgICAgICBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fRElTQ09WRVJfQUNUSVZFOgotICAgICAgc3dpdGNoIChwX21zZy0+ZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfRE1fUkVNVF9OQU1FX0VWVDoKLSAgICAgICAgICBidGFfZG1fZGlzY19ybXRfbmFtZShtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fU0RQX1JFU1VMVF9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3NkcF9yZXN1bHQobWVzc2FnZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0RNX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgICAgICBidGFfZG1fc2VhcmNoX2NtcGwoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fRElTQ09WRVJZX1JFU1VMVF9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX2Rpc2NfcmVzdWx0KG1lc3NhZ2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ETV9BUElfU0VBUkNIX0VWVDoKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX1FVRVVFX1NFQVJDSF9FVlQ6Ci0gICAgICAgICAgYnRhX2RtX3F1ZXVlX3NlYXJjaChtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX0RJU0NPVkVSX0VWVDoKLSAgICAgICAgY2FzZSBCVEFfRE1fQVBJX1FVRVVFX0RJU0NPVkVSX0VWVDoKLSAgICAgICAgICBidGFfZG1fcXVldWVfZGlzYyhtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2RtL2J0YV9kbV9wbS5jYyBiL2J0YS9kbS9idGFfZG1fcG0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGI0Y2MuLjAwMDAwMDAKLS0tIGEvYnRhL2RtL2J0YV9kbV9wbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFjdGlvbiBmdW5jdGlvbnMgZm9yIGRldmljZSBtYW5hZ2VyIHN0YXRlCi0gKiAgbWFjaGluZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImJ0YS9kbS9idGFfZG1faW50LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9kbV9hcGkuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgLy8gZG9faW5fbWFpbl90aHJlYWQKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgdm9pZCBidGFfZG1fcG1fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3NldF9tb2RlKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1BNX0FDVElPTiBwbV9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fUE1fUkVRIHBtX3JlcSk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fcG1fdGltZXJfY2JhY2sodm9pZCogZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfZG1fcG1fYnRtX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fUE1fU1RBVFVTIHN0YXR1cywgdWludDE2X3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpOwotc3RhdGljIGJvb2wgYnRhX2RtX3BtX3BhcmsoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXZvaWQgYnRhX2RtX3BtX3NuaWZmKHRCVEFfRE1fUEVFUl9ERVZJQ0UqIHBfcGVlcl9kZXYsIHVpbnQ4X3QgaW5kZXgpOwotc3RhdGljIGJvb2wgYnRhX2RtX3BtX2lzX3Njb19hY3RpdmUoKTsKLXN0YXRpYyBpbnQgYnRhX2RtX2dldF9zY29faW5kZXgoKTsKLXN0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X2luZGV4KHRCVEFfUE1fVElNRVIqIHBfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRpbWVyX2lkeCk7Ci0KLSNpZiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCi0jaW5jbHVkZSAiLi4vaGgvYnRhX2hoX2ludC5oIgotLyogQlRBX0RNX1BNX1NTUjEgd2lsbCBiZSBkZWRpY2F0ZWQgZm9yIEhIIFNTUiBzZXR0aW5nIGVudHJ5LCBubyBvdGhlciBwcm9maWxlCi0gKiBjYW4gdXNlIGl0ICovCi0jZGVmaW5lIEJUQV9ETV9QTV9TU1JfSEggQlRBX0RNX1BNX1NTUjEKLSNlbmRpZgotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3Nzcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsIGludCBzc3IpOwotCi10QlRBX0RNX0NPTk5FQ1RFRF9TUlZDUyBidGFfZG1fY29ubl9zcnZjczsKLXN0YXRpYyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBwbV90aW1lcl9zY2hlZHVsZV9tdXRleDsKLXN0YXRpYyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBwbV90aW1lcl9zdGF0ZV9tdXRleDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9pbml0X3BtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplcyB0aGUgQlQgbG93IHBvd2VyIG1hbmFnZXIKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2luaXRfcG0odm9pZCkgewotICBtZW1zZXQoJmJ0YV9kbV9jb25uX3NydmNzLCAweDAwLCBzaXplb2YoYnRhX2RtX2Nvbm5fc3J2Y3MpKTsKLQotICAvKiBpZiB0aGVyZSBhcmUgbm8gcG93ZXIgbWFuZ2VyIGVudHJpZXMsIHNvIG5vdCByZWdpc3RlciAqLwotICBpZiAocF9idGFfZG1fcG1fY2ZnWzBdLmFwcF9pZCAhPSAwKSB7Ci0gICAgYnRhX3N5c19wbV9yZWdpc3RlcihidGFfZG1fcG1fY2JhY2spOwotCi0gICAgQlRNX1BtUmVnaXN0ZXIoKEJUTV9QTV9SRUdfU0VUKSwgJmJ0YV9kbV9jYi5wbV9pZCwgYnRhX2RtX3BtX2J0bV9jYmFjayk7Ci0gIH0KLQotICAvKiBOZWVkIHRvIGluaXRpYWxpemUgYWxsIFBNIHRpbWVyIHNlcnZpY2UgSURzICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7IGorKykKLSAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5zcnZjX2lkW2pdID0gQlRBX0lEX01BWDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2Rpc2FibGVfcG0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGUgUE0KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX2Rpc2FibGVfcG0odm9pZCkgewotICBCVE1fUG1SZWdpc3RlcihCVE1fUE1fREVSRUcsICZidGFfZG1fY2IucG1faWQsIGJ0YV9kbV9wbV9idG1fY2JhY2spOwotCi0gIC8qCi0gICAqIERlcmVnaXN0ZXIgdGhlIFBNIGNhbGxiYWNrIGZyb20gdGhlIHN5c3RlbSBoYW5kbGluZyB0byBwcmV2ZW50Ci0gICAqIHJlLWVuYWJsaW5nIHRoZSBQTSB0aW1lcnMgYWZ0ZXIgdGhpcyBjYWxsIGlmIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgotICAgKi8KLSAgYnRhX3N5c19wbV9yZWdpc3RlcihOVUxMKTsKLQotICAvKiBOZWVkIHRvIHN0b3AgYWxsIGFjdGl2ZSB0aW1lcnMuICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7IGorKykgewotICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfaW5kZXgoJmJ0YV9kbV9jYi5wbV90aW1lcltpXSwgaik7Ci0gICAgICBidGFfZG1fY2IucG1fdGltZXJbaV0ucG1fYWN0aW9uW2pdID0gQlRBX0RNX1BNX05PX0FDVElPTjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9nZXRfYXZfY291bnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBBVgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG51bWJlciBvZiBhdiBjb25uZWN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGJ0YV9kbV9nZXRfYXZfY291bnQodm9pZCkgewotICB1aW50OF90IGNvdW50ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidGFfZG1fY29ubl9zcnZjcy5jb3VudDsgaSsrKSB7Ci0gICAgaWYgKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tpXS5pZCA9PSBCVEFfSURfQVYpICsrY291bnQ7Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHN0b3AgYSBQTSB0aW1lcgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3N0b3BfdGltZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAiLCBfX2Z1bmNfXyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfRE1fTlVNX1BNX1RJTUVSOyBpKyspIHsKLSAgICBpZiAoYnRhX2RtX2NiLnBtX3RpbWVyW2ldLmluX3VzZSAmJgotICAgICAgICBidGFfZG1fY2IucG1fdGltZXJbaV0ucGVlcl9iZGFkZHIgPT0gcGVlcl9hZGRyKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWDsgaisrKSB7Ci0gICAgICAgIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X2luZGV4KCZidGFfZG1fY2IucG1fdGltZXJbaV0sIGopOwotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiBGb3Igbm93LCBzdG9wcGluZyB0aGUgdGltZXIgZG9lcyBub3QgcmVzZXQKLSAgICAgICAgICogcG1fYWN0aW9uW2pdLgotICAgICAgICAgKiBUaGUgcmVhc29uIGlzIGJlY2F1c2Ugc29tZSBvZiB0aGUgaW50ZXJuYWwgbG9naWMgdGhhdAotICAgICAgICAgKiAocmUpYXNzaWducyB0aGUgcG1fYWN0aW9uW10gdmFsdWVzIGlzIHRha2luZyBpbnRvIGFjY291bnQKLSAgICAgICAgICogdGhlIG9sZGVyIHZhbHVlOyBlLmcuLCBzZWUgdGhlIHBtX2FjdGlvbltdIGFzc2lnbm1lbnQgaW4KLSAgICAgICAgICogZnVuY3Rpb24gYnRhX2RtX3BtX3N0YXJ0X3RpbWVyKCkuCi0gICAgICAgICAqIFN1Y2ggc3VidGxldHkgaW4gdGhlIGV4ZWN1dGlvbiBsb2dpYyBpcyBlcnJvciBwcm9uZSwgYW5kCi0gICAgICAgICAqIHNob3VsZCBiZSBlbGltaW5pYXRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3BtX2FjdGlvbl90b190aW1lcl9pZHgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNvbnZlcnQgcG93ZXIgbW9kZSBpbnRvIHRpbWVyIGluZGV4IGZvciBlYWNoIGNvbm5lY3RlZAotICogICAgICAgICAgICAgICAgICBkZXZpY2UKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBpbmRleCBvZiB0aGUgcG93ZXIgbW9kZSBkZWxheSB0aW1lcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidGFfcG1fYWN0aW9uX3RvX3RpbWVyX2lkeCh1aW50OF90IHBtX2FjdGlvbikgewotICBpZiAocG1fYWN0aW9uID09IEJUQV9ETV9QTV9TVVNQRU5EKQotICAgIHJldHVybiBCVEFfRE1fUE1fU1VTUEVORF9USU1FUl9JRFg7Ci0gIGVsc2UgaWYgKHBtX2FjdGlvbiA9PSBCVEFfRE1fUE1fUEFSSykKLSAgICByZXR1cm4gQlRBX0RNX1BNX1BBUktfVElNRVJfSURYOwotICBlbHNlIGlmICgocG1fYWN0aW9uICYgQlRBX0RNX1BNX1NOSUZGKSA9PSBCVEFfRE1fUE1fU05JRkYpCi0gICAgcmV0dXJuIEJUQV9ETV9QTV9TTklGRl9USU1FUl9JRFg7Ci0KLSAgLyogQWN0aXZlLCBubyBwcmVmZXJlbmNlLCBubyBhY3Rpb24gYW5kIHJldHJ5ICovCi0gIHJldHVybiBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcG1fc3RvcF90aW1lcl9ieV9tb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzdG9wIGEgUE0gdGltZXIKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X21vZGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBvd2VyX21vZGUpIHsKLSAgY29uc3QgdWludDhfdCB0aW1lcl9pZHggPSBidGFfcG1fYWN0aW9uX3RvX3RpbWVyX2lkeChwb3dlcl9tb2RlKTsKLSAgaWYgKHRpbWVyX2lkeCA9PSBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVgpIHJldHVybjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IEJUQV9ETV9OVU1fUE1fVElNRVI7IGkrKykgewotICAgIGlmIChidGFfZG1fY2IucG1fdGltZXJbaV0uaW5fdXNlICYmCi0gICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5wZWVyX2JkYWRkciA9PSBwZWVyX2FkZHIpIHsKLSAgICAgIGlmIChidGFfZG1fY2IucG1fdGltZXJbaV0uc3J2Y19pZFt0aW1lcl9pZHhdICE9IEJUQV9JRF9NQVgpIHsKLSAgICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfaW5kZXgoJmJ0YV9kbV9jYi5wbV90aW1lcltpXSwgdGltZXJfaWR4KTsKLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogSW50ZW50aW9uYWxseSBzZXR0aW5nIHBtX2FjdGlvblt0aW1lcl9pZHhdLgotICAgICAgICAgKiBUaGlzIGFzc2lnbm1lbnQgc2hvdWxkIGJlIGVsaW1pbmF0ZWQgaW4gdGhlIGZ1dHVyZSAtIHNlZSB0aGUKLSAgICAgICAgICogcG1fYWN0aW9uW10gcmVsYXRlZCBjb21tZW50IGluc2lkZSBmdW5jdGlvbgotICAgICAgICAgKiBidGFfZG1fcG1fc3RvcF90aW1lcigpLgotICAgICAgICAgKi8KLSAgICAgICAgYnRhX2RtX2NiLnBtX3RpbWVyW2ldLnBtX2FjdGlvblt0aW1lcl9pZHhdID0gcG93ZXJfbW9kZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfc3J2Y19pZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc3RvcCBhbGwgdGltZXIgc3RhcnRlZCBieSB0aGUgc2VydmljZSBJRC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBpbmRleCBvZiB0aGUgcG93ZXIgbW9kZSBkZWxheSB0aW1lcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fcG1fc3RvcF90aW1lcl9ieV9zcnZjX2lkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzcnZjX2lkKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKSB7Ci0gICAgaWYgKGJ0YV9kbV9jYi5wbV90aW1lcltpXS5pbl91c2UgJiYKLSAgICAgICAgYnRhX2RtX2NiLnBtX3RpbWVyW2ldLnBlZXJfYmRhZGRyID09IHBlZXJfYWRkcikgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7IGorKykgewotICAgICAgICBpZiAoYnRhX2RtX2NiLnBtX3RpbWVyW2ldLnNydmNfaWRbal0gPT0gc3J2Y19pZCkgewotICAgICAgICAgIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X2luZGV4KCZidGFfZG1fY2IucG1fdGltZXJbaV0sIGopOwotICAgICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5wbV9hY3Rpb25bal0gPSBCVEFfRE1fUE1fTk9fQUNUSU9OOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcG1fc3RhcnRfdGltZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHN0YXJ0IGEgUE0gdGltZXIKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zdGFydF90aW1lcih0QlRBX1BNX1RJTUVSKiBwX3RpbWVyLCB1aW50OF90IHRpbWVyX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lb3V0X21zLCB1aW50OF90IHNydmNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwbV9hY3Rpb24pIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gc2NoZWR1bGVfbG9jayhwbV90aW1lcl9zY2hlZHVsZV9tdXRleCk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IHN0YXRlX2xvY2socG1fdGltZXJfc3RhdGVfbXV0ZXgpOwotICBwX3RpbWVyLT5pbl91c2UgPSB0cnVlOwotCi0gIGlmIChwX3RpbWVyLT5zcnZjX2lkW3RpbWVyX2lkeF0gPT0gQlRBX0lEX01BWCkgcF90aW1lci0+YWN0aXZlKys7Ci0KLSAgaWYgKHBfdGltZXItPnBtX2FjdGlvblt0aW1lcl9pZHhdIDwgcG1fYWN0aW9uKQotICAgIHBfdGltZXItPnBtX2FjdGlvblt0aW1lcl9pZHhdID0gcG1fYWN0aW9uOwotCi0gIHBfdGltZXItPnNydmNfaWRbdGltZXJfaWR4XSA9IHNydmNfaWQ7Ci0gIHN0YXRlX2xvY2sudW5sb2NrKCk7Ci0KLSAgYWxhcm1fc2V0X29uX21sb29wKHBfdGltZXItPnRpbWVyW3RpbWVyX2lkeF0sIHRpbWVvdXRfbXMsCi0gICAgICAgICAgICAgICAgICAgICBidGFfZG1fcG1fdGltZXJfY2JhY2ssIHBfdGltZXItPnRpbWVyW3RpbWVyX2lkeF0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfaW5kZXgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHN0b3AgYSBQTSB0aW1lcgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfaW5kZXgodEJUQV9QTV9USU1FUiogcF90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdGltZXJfaWR4KSB7Ci0gIGlmICgocF90aW1lciA9PSBOVUxMKSB8fCAodGltZXJfaWR4ID49IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWCkpIHJldHVybjsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBzY2hlZHVsZV9sb2NrKHBtX3RpbWVyX3NjaGVkdWxlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gc3RhdGVfbG9jayhwbV90aW1lcl9zdGF0ZV9tdXRleCk7Ci0gIGlmIChwX3RpbWVyLT5zcnZjX2lkW3RpbWVyX2lkeF0gPT0gQlRBX0lEX01BWCkgewotICAgIHJldHVybjsKLSAgfSAvKiBUaGUgdGltZXIgd2FzIG5vdCBzY2hlZHVsZWQgKi8KLQotICBBU1NFUlRfTE9HKHBfdGltZXItPmluX3VzZSwKLSAgICAgICAgICAgICAiVGltZXIgd2FzIG5vdCBzY2hlZHVsZWQgcF90aW1lci0+c3J2Y19pZFt0aW1lcl9pZHhdOiVoaHUiLAotICAgICAgICAgICAgIHBfdGltZXItPnNydmNfaWRbdGltZXJfaWR4XSk7Ci0gIEFTU0VSVF9MT0cocF90aW1lci0+YWN0aXZlID4gMCwgIk5vIHRhc2tzIG9uIHRpbWVyIGFyZSBhY3RpdmUiKTsKLQotICBwX3RpbWVyLT5zcnZjX2lkW3RpbWVyX2lkeF0gPSBCVEFfSURfTUFYOwotICAvKiBOT1RFOiBwbV9hY3Rpb25bdGltZXJfaWR4XSBpbnRlbnRpb25hbGx5IG5vdCByZXNldCAqLwotCi0gIHBfdGltZXItPmFjdGl2ZS0tOwotICBpZiAocF90aW1lci0+YWN0aXZlID09IDApIHBfdGltZXItPmluX3VzZSA9IGZhbHNlOwotICBzdGF0ZV9sb2NrLnVubG9jaygpOwotCi0gIGFsYXJtX2NhbmNlbChwX3RpbWVyLT50aW1lclt0aW1lcl9pZHhdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9wbV9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29ubiBjaGFuZ2UgY2FsbGJhY2sgZnJvbSBzeXMgZm9yIGxvdyBwb3dlciBtYW5hZ2VtZW50Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZG1fcG1fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgdWludDhfdCBpLCBqOwotICB0QlRBX0RNX1BFRVJfREVWSUNFKiBwX2RldjsKLSAgdEJUQV9ETV9QTV9SRVEgcG1fcmVxID0gQlRBX0RNX1BNX05FV19SRVE7Ci0KLSAgTE9HX0RFQlVHKCJQb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrIHN0YXR1czolc1slaGh1XSBpZDolc1slZF0sIGFwcDolaGh1IiwKLSAgICAgICAgICAgIGJ0YV9zeXNfY29ubl9zdGF0dXNfdGV4dChzdGF0dXMpLmNfc3RyKCksIHN0YXR1cywKLSAgICAgICAgICAgIEJ0YUlkU3lzVGV4dChpZCkuY19zdHIoKSwgaWQsIGFwcF9pZCk7Ci0KLSAgLyogZmluZCBpZiB0aGVyZSBpcyBhbiBwb3dlciBtb2RlIGVudHJ5IGZvciB0aGUgc2VydmljZSAqLwotICBmb3IgKGkgPSAxOyBpIDw9IHBfYnRhX2RtX3BtX2NmZ1swXS5hcHBfaWQ7IGkrKykgewotICAgIGlmICgocF9idGFfZG1fcG1fY2ZnW2ldLmlkID09IGlkKSAmJgotICAgICAgICAoKHBfYnRhX2RtX3BtX2NmZ1tpXS5hcHBfaWQgPT0gQlRBX0FMTF9BUFBfSUQpIHx8Ci0gICAgICAgICAocF9idGFfZG1fcG1fY2ZnW2ldLmFwcF9pZCA9PSBhcHBfaWQpKSkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogaWYgbm8gZW50cmllcyBhcmUgdGhlcmUgZm9yIHRoZSBhcHBfaWQgYW5kIHN1YnN5c3RlbSBpbiBwX2J0YV9kbV9wbV9zcGVjKi8KLSAgaWYgKGkgPiBwX2J0YV9kbV9wbV9jZmdbMF0uYXBwX2lkKSB7Ci0gICAgTE9HX0RFQlVHKCJJZ25vcmluZyBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrIGFzIG5vIHNlcnZpY2UgZW50cmllcyBleGlzdCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19ERUJVRygiU3RvcHBlZCBhbGwgdGltZXJzIGZvciBzZXJ2aWNlIHRvIGRldmljZTolcyBpZDolaGh1IiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpLCBpZCk7Ci0gIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X3NydmNfaWQocGVlcl9hZGRyLCBpZCk7Ci0KLSAgcF9kZXYgPSBidGFfZG1fZmluZF9wZWVyX2RldmljZShwZWVyX2FkZHIpOwotICBpZiAocF9kZXYpIHsKLSAgICBMT0dfREVCVUcoIkRldmljZSBpbmZvOiVzIiwgZGV2aWNlX2luZm9fdGV4dChwX2Rldi0+SW5mbygpKS5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIHBlZXIgZGV2aWNlLi4ueWV0IHNvbGRpZXJpbmcgb24uLi4iKTsKLSAgfQotCi0gIC8qIHNldCBTU1IgcGFyYW1ldGVycyBvbiBTWVMgQ09OTiBPUEVOICovCi0gIGludCBpbmRleCA9IEJUQV9ETV9QTV9TU1IwOwotICBpZiAoKEJUQV9TWVNfQ09OTl9PUEVOID09IHN0YXR1cykgJiYgcF9kZXYgJiYKLSAgICAgIChwX2Rldi0+SW5mbygpICYgQlRBX0RNX0RJX1VTRV9TU1IpKSB7Ci0gICAgaW5kZXggPSBwX2J0YV9kbV9wbV9zcGVjW3BfYnRhX2RtX3BtX2NmZ1tpXS5zcGVjX2lkeF0uc3NyOwotICB9IGVsc2UgaWYgKEJUQV9JRF9BViA9PSBpZCkgewotICAgIGlmIChCVEFfU1lTX0NPTk5fQlVTWSA9PSBzdGF0dXMpIHsKLSAgICAgIC8qIHNldCBTU1I0IGZvciBBMkRQIG9uIFNZUyBDT05OIEJVU1kgKi8KLSAgICAgIGluZGV4ID0gQlRBX0RNX1BNX1NTUjQ7Ci0gICAgfSBlbHNlIGlmIChCVEFfU1lTX0NPTk5fSURMRSA9PSBzdGF0dXMpIHsKLSAgICAgIGluZGV4ID0gcF9idGFfZG1fcG1fc3BlY1twX2J0YV9kbV9wbV9jZmdbaV0uc3BlY19pZHhdLnNzcjsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiBubyBhY3Rpb24gZm9yIHRoZSBldmVudCAqLwotICBpZiAocF9idGFfZG1fcG1fc3BlY1twX2J0YV9kbV9wbV9jZmdbaV0uc3BlY19pZHhdCi0gICAgICAgICAgLmFjdG5fdGJsW3N0YXR1c11bMF0KLSAgICAgICAgICAucG93ZXJfbW9kZSA9PSBCVEFfRE1fUE1fTk9fQUNUSU9OKSB7Ci0gICAgaWYgKEJUQV9ETV9QTV9TU1IwID09IGluZGV4KSAvKiBhbmQgZG8gbm90IG5lZWQgdG8gc2V0IFNTUiwgcmV0dXJuLiAqLwotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChqID0gMDsgaiA8IGJ0YV9kbV9jb25uX3NydmNzLmNvdW50OyBqKyspIHsKLSAgICAvKiBjaGVjayBpZiBhbiBlbnRyeSBhbHJlYWR5IHByZXNlbnQgKi8KLSAgICBpZiAoKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5pZCA9PSBpZCkgJiYKLSAgICAgICAgKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5hcHBfaWQgPT0gYXBwX2lkKSAmJgotICAgICAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0ucGVlcl9iZGFkZHIgPT0gcGVlcl9hZGRyKSB7Ci0gICAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0ubmV3X3JlcXVlc3QgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyogaWYgc3Vic3lzdGVtIGhhcyBubyBtb3JlIHByZWZlcmVuY2Ugb24gdGhlIHBvd2VyIG1vZGUgcmVtb3ZlCi0gdGhlIGNiICovCi0gIGlmIChwX2J0YV9kbV9wbV9zcGVjW3BfYnRhX2RtX3BtX2NmZ1tpXS5zcGVjX2lkeF0KLSAgICAgICAgICAuYWN0bl90Ymxbc3RhdHVzXVswXQotICAgICAgICAgIC5wb3dlcl9tb2RlID09IEJUQV9ETV9QTV9OT19QUkVGKSB7Ci0gICAgaWYgKGogIT0gYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQpIHsKLSAgICAgIGJ0YV9kbV9jb25uX3NydmNzLmNvdW50LS07Ci0KLSAgICAgIGZvciAoOyBqIDwgYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQ7IGorKykgewotICAgICAgICBtZW1jcHkoJmJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXSwKLSAgICAgICAgICAgICAgICZidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbaiArIDFdLAotICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXSkpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoImJ0YV9kbV9hY3Qgbm8gZW50cnkgZm9yIGNvbm5lY3RlZCBzZXJ2aWNlIGNicyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIGlmIChqID09IGJ0YV9kbV9jb25uX3NydmNzLmNvdW50KSB7Ci0gICAgLyogY2hlY2sgaWYgd2UgaGF2ZSBtb3JlIGNvbm5lY3RlZCBzZXJ2aWNlIHRoYXQgY2JzICovCi0gICAgaWYgKGJ0YV9kbV9jb25uX3NydmNzLmNvdW50ID09IEJUQV9ETV9OVU1fQ09OTl9TUlZTKSB7Ci0gICAgICBMT0dfV0FSTigiYnRhX2RtX2FjdCBubyBtb3JlIGNvbm5lY3RlZCBzZXJ2aWNlIGNicyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGZpbGwgaW4gYSBuZXcgY2IgKi8KLSAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uaWQgPSBpZDsKLSAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uYXBwX2lkID0gYXBwX2lkOwotICAgIGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5uZXdfcmVxdWVzdCA9IHRydWU7Ci0gICAgYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLnBlZXJfYmRhZGRyID0gcGVlcl9hZGRyOwotCi0gICAgTE9HX0lORk8oIk5ldyBjb25uZWN0aW9uIHNlcnZpY2U6JXNbJWhodV0gYXBwX2lkOiVkIiwKLSAgICAgICAgICAgICBCdGFJZFN5c1RleHQoaWQpLmNfc3RyKCksIGlkLCBhcHBfaWQpOwotCi0gICAgYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQrKzsKLSAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uc3RhdGUgPSBzdGF0dXM7Ci0gIH0gZWxzZSB7Ci0gICAgLyogbm8gc2VydmljZSBpcyBhZGRlZCBvciByZW1vdmVkLiBvbmx5IHVwZGF0aW5nIHN0YXR1cy4gKi8KLSAgICBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uc3RhdGUgPSBzdGF0dXM7Ci0gIH0KLQotICAvKiBzdG9wIHRpbWVyICovCi0gIGJ0YV9kbV9wbV9zdG9wX3RpbWVyKHBlZXJfYWRkcik7Ci0gIGlmIChidGFfZG1fY29ubl9zcnZjcy5jb3VudCA+IDApIHsKLSAgICBwbV9yZXEgPSBCVEFfRE1fUE1fUkVTVEFSVDsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgICAiJXMgYnRhX2RtX3BtX3N0b3BfdGltZXIgZm9yIGN1cnJlbnQgc2VydmljZSwgcmVzdGFydCBvdGhlciAiCi0gICAgICAgICJzZXJ2aWNlIHRpbWVyczogY291bnQgPSAlZCIsCi0gICAgICAgIF9fZnVuY19fLCBidGFfZG1fY29ubl9zcnZjcy5jb3VudCk7Ci0gIH0KLQotICBpZiAocF9kZXYpIHsKLSAgICBwX2Rldi0+cG1fbW9kZV9hdHRlbXB0ZWQgPSAwOwotICAgIHBfZGV2LT5wbV9tb2RlX2ZhaWxlZCA9IDA7Ci0gIH0KLQotICBpZiAocF9idGFfZG1fc3NyX3NwZWNbaW5kZXhdLm1heF9sYXQgfHwgaW5kZXggPT0gQlRBX0RNX1BNX1NTUl9ISCkgewotICAgIGJ0YV9kbV9wbV9zc3IocGVlcl9hZGRyLCBpbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7Ci0gICAgdWludDhfdCogcCA9IE5VTEw7Ci0gICAgaWYgKGNvbnRyb2xsZXItPnN1cHBvcnRzX3NuaWZmX3N1YnJhdGluZygpICYmCi0gICAgICAgICgoTlVMTCAhPSAocCA9IEJUTV9SZWFkUmVtb3RlRmVhdHVyZXMocGVlcl9hZGRyKSkpICYmCi0gICAgICAgICBIQ0lfU05JRkZfU1VCX1JBVEVfU1VQUE9SVEVEKHApKSAmJgotICAgICAgICAoaW5kZXggPT0gQlRBX0RNX1BNX1NTUjApKSB7Ci0gICAgICBpZiAoc3RhdHVzID09IEJUQV9TWVNfU0NPX09QRU4pIHsKLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFNDTyBpbmFjdGl2ZSwgcmVzZXQgU1NSIHRvIHplcm8iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIEJUTV9TZXRTc3JQYXJhbXMocGVlcl9hZGRyLCAwLCAwLCAwKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEJUQV9TWVNfU0NPX0NMT1NFKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBTQ08gYWN0aXZlLCBiYWNrIHRvIG9sZCBTU1IiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0YV9kbV9wbV9zc3IocGVlcl9hZGRyLCBCVEFfRE1fUE1fU1NSMCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYnRhX2RtX3BtX3NldF9tb2RlKHBlZXJfYWRkciwgQlRBX0RNX1BNX05PX0FDVElPTiwgcG1fcmVxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9wbV9zZXRfbW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IHRoZSBwb3dlciBtb2RlIGZvciB0aGUgZGV2aWNlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGJ0YV9kbV9wbV9zZXRfbW9kZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9QTV9BQ1RJT04gcG1fcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1BNX1JFUSBwbV9yZXEpIHsKLSAgdEJUQV9ETV9QTV9BQ1RJT04gcG1fYWN0aW9uID0gQlRBX0RNX1BNX05PX0FDVElPTjsKLSAgdWludDY0X3QgdGltZW91dF9tcyA9IDA7Ci0gIHVpbnQ4X3QgaSwgajsKLSAgdEJUQV9ETV9QTV9BQ1RJT04gZmFpbGVkX3BtID0gMDsKLSAgdEJUQV9ETV9QRUVSX0RFVklDRSogcF9wZWVyX2RldmljZSA9IE5VTEw7Ci0gIHRCVEFfRE1fUE1fQUNUSU9OIGFsbG93ZWRfbW9kZXMgPSAwOwotICB0QlRBX0RNX1BNX0FDVElPTiBwcmVmX21vZGVzID0gMDsKLSAgY29uc3QgdEJUQV9ETV9QTV9DRkcqIHBfcG1fY2ZnOwotICBjb25zdCB0QlRBX0RNX1BNX1NQRUMqIHBfcG1fc3BlYzsKLSAgY29uc3QgdEJUQV9ETV9QTV9BQ1ROKiBwX2FjdDA7Ci0gIGNvbnN0IHRCVEFfRE1fUE1fQUNUTiogcF9hY3QxOwotICB0QlRBX0RNX1NSVkNTKiBwX3NydmNzID0gTlVMTDsKLSAgYm9vbCB0aW1lcl9zdGFydGVkID0gZmFsc2U7Ci0gIHVpbnQ4X3QgdGltZXJfaWR4LCBhdmFpbGFibGVfdGltZXIgPSBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVg7Ci0gIHVpbnQ2NF90IHJlbWFpbmluZ19tcyA9IDA7Ci0KLSAgaWYgKCFidGFfZG1fY2IuZGV2aWNlX2xpc3QuY291bnQpIHsKLSAgICBMT0dfSU5GTygiRGV2aWNlIGxpc3QgY291bnQgaXMgemVybyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHNlZSBpZiBhbnkgYXR0ZW1wdCB0byBwdXQgZGV2aWNlIGluIGxvdyBwb3dlciBtb2RlIGZhaWxlZCAqLwotICBwX3BlZXJfZGV2aWNlID0gYnRhX2RtX2ZpbmRfcGVlcl9kZXZpY2UocGVlcl9hZGRyKTsKLSAgLyogaWYgbm8gcGVlciBkZXZpY2UgZm91bmQgcmV0dXJuICovCi0gIGlmIChwX3BlZXJfZGV2aWNlID09IE5VTEwpIHsKLSAgICBMT0dfSU5GTygiTm8gcGVlciBkZXZpY2UgZm91bmQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmYWlsZWRfcG0gPSBwX3BlZXJfZGV2aWNlLT5wbV9tb2RlX2ZhaWxlZDsKLQotICBmb3IgKGkgPSAwOyBpIDwgYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQ7IGkrKykgewotICAgIHBfc3J2Y3MgPSAmYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2ldOwotICAgIGlmIChwX3NydmNzLT5wZWVyX2JkYWRkciA9PSBwZWVyX2FkZHIpIHsKLSAgICAgIC8qIHBfYnRhX2RtX3BtX2NmZ1swXS5hcHBfaWQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzICovCi0gICAgICBmb3IgKGogPSAxOyBqIDw9IHBfYnRhX2RtX3BtX2NmZ1swXS5hcHBfaWQ7IGorKykgewotICAgICAgICBpZiAoKHBfYnRhX2RtX3BtX2NmZ1tqXS5pZCA9PSBwX3NydmNzLT5pZCkgJiYKLSAgICAgICAgICAgICgocF9idGFfZG1fcG1fY2ZnW2pdLmFwcF9pZCA9PSBCVEFfQUxMX0FQUF9JRCkgfHwKLSAgICAgICAgICAgICAocF9idGFfZG1fcG1fY2ZnW2pdLmFwcF9pZCA9PSBwX3NydmNzLT5hcHBfaWQpKSkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgcF9wbV9jZmcgPSAmcF9idGFfZG1fcG1fY2ZnW2pdOwotICAgICAgcF9wbV9zcGVjID0gJnBfYnRhX2RtX3BtX3NwZWNbcF9wbV9jZmctPnNwZWNfaWR4XTsKLSAgICAgIHBfYWN0MCA9ICZwX3BtX3NwZWMtPmFjdG5fdGJsW3Bfc3J2Y3MtPnN0YXRlXVswXTsKLSAgICAgIHBfYWN0MSA9ICZwX3BtX3NwZWMtPmFjdG5fdGJsW3Bfc3J2Y3MtPnN0YXRlXVsxXTsKLQotICAgICAgYWxsb3dlZF9tb2RlcyB8PSBwX3BtX3NwZWMtPmFsbG93X21hc2s7Ci0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIlNlcnZpY2U6JXNbJWhodV0gc3RhdGU6JXNbJWhodV0gYWxsb3dlZF9tb2RlczoweCUwMnggIgotICAgICAgICAgICJzZXJ2aWNlX2luZGV4OiVoaHUgIiwKLSAgICAgICAgICBCdGFJZFN5c1RleHQocF9zcnZjcy0+aWQpLmNfc3RyKCksIHBfc3J2Y3MtPmlkLAotICAgICAgICAgIGJ0YV9zeXNfY29ubl9zdGF0dXNfdGV4dChwX3NydmNzLT5zdGF0ZSkuY19zdHIoKSwgcF9zcnZjcy0+c3RhdGUsCi0gICAgICAgICAgYWxsb3dlZF9tb2Rlcywgaik7Ci0KLSAgICAgIC8qIFBNIGFjdGlvbnMgYXJlIGluIHRoZSBvcmRlciBvZiBzdHJpY3RuZXNzICovCi0KLSAgICAgIC8qIGZpcnN0IGNoZWNrIGlmIHRoZSBmaXJzdCBwcmVmZXJlbmNlIGlzIG9rICovCi0gICAgICBpZiAoIShmYWlsZWRfcG0gJiBwX2FjdDAtPnBvd2VyX21vZGUpKSB7Ci0gICAgICAgIHByZWZfbW9kZXMgfD0gcF9hY3QwLT5wb3dlcl9tb2RlOwotCi0gICAgICAgIGlmIChwX2FjdDAtPnBvd2VyX21vZGUgPj0gcG1fYWN0aW9uKSB7Ci0gICAgICAgICAgcG1fYWN0aW9uID0gcF9hY3QwLT5wb3dlcl9tb2RlOwotCi0gICAgICAgICAgaWYgKHBtX3JlcSAhPSBCVEFfRE1fUE1fTkVXX1JFUSB8fCBwX3NydmNzLT5uZXdfcmVxdWVzdCkgewotICAgICAgICAgICAgcF9zcnZjcy0+bmV3X3JlcXVlc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIHRpbWVvdXRfbXMgPSBwX2FjdDAtPnRpbWVvdXQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBpZiBmaXJzdCBwcmVmZXJlbmNlIGhhcyBhbHJlYWR5IGZhaWxlZCwgdHJ5IHNlY29uZCBwcmVmZXJlbmNlICovCi0gICAgICBlbHNlIGlmICghKGZhaWxlZF9wbSAmIHBfYWN0MS0+cG93ZXJfbW9kZSkpIHsKLSAgICAgICAgcHJlZl9tb2RlcyB8PSBwX2FjdDEtPnBvd2VyX21vZGU7Ci0KLSAgICAgICAgaWYgKHBfYWN0MS0+cG93ZXJfbW9kZSA+IHBtX2FjdGlvbikgewotICAgICAgICAgIHBtX2FjdGlvbiA9IHBfYWN0MS0+cG93ZXJfbW9kZTsKLSAgICAgICAgICB0aW1lb3V0X21zID0gcF9hY3QxLT50aW1lb3V0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBtX2FjdGlvbiAmIChCVEFfRE1fUE1fUEFSSyB8IEJUQV9ETV9QTV9TTklGRikpIHsKLSAgICAvKiBzb21lIHNlcnZpY2UgZG9uJ3QgbGlrZSB0aGUgbW9kZSAqLwotICAgIGlmICghKGFsbG93ZWRfbW9kZXMgJiBwbV9hY3Rpb24pKSB7Ci0gICAgICAvKiBzZWxlY3QgdGhlIG90aGVyIG1vZGUgaWYgaXRzIGFsbG93ZWQgYW5kIHByZWZlcnJlZCwgb3RoZXJ3aXNlIDAgd2hpY2gKLSAgICAgICAqIGlzIEJUQV9ETV9QTV9OT19BQ1RJT04gKi8KLSAgICAgIHBtX2FjdGlvbiA9Ci0gICAgICAgICAgKGFsbG93ZWRfbW9kZXMgJiAoQlRBX0RNX1BNX1BBUksgfCBCVEFfRE1fUE1fU05JRkYpICYgcHJlZl9tb2Rlcyk7Ci0KLSAgICAgIC8qIG5vIHRpbWVvdXQgbmVlZGVkIGlmIG5vIGFjdGlvbiBpcyByZXF1aXJlZCAqLwotICAgICAgaWYgKHBtX2FjdGlvbiA9PSBCVEFfRE1fUE1fTk9fQUNUSU9OKSB7Ci0gICAgICAgIHRpbWVvdXRfbXMgPSAwOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBpZiBuZWVkIHRvIHN0YXJ0IGEgdGltZXIgKi8KLSAgaWYgKChwbV9yZXEgIT0gQlRBX0RNX1BNX0VYRUNVVEUpICYmICh0aW1lb3V0X21zID4gMCkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKSB7Ci0gICAgICBpZiAoYnRhX2RtX2NiLnBtX3RpbWVyW2ldLmluX3VzZSAmJgotICAgICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5wZWVyX2JkYWRkciA9PSBwZWVyX2FkZHIpIHsKLSAgICAgICAgdGltZXJfaWR4ID0gYnRhX3BtX2FjdGlvbl90b190aW1lcl9pZHgocG1fYWN0aW9uKTsKLSAgICAgICAgaWYgKHRpbWVyX2lkeCAhPSBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVgpIHsKLSAgICAgICAgICByZW1haW5pbmdfbXMgPQotICAgICAgICAgICAgICBhbGFybV9nZXRfcmVtYWluaW5nX21zKGJ0YV9kbV9jYi5wbV90aW1lcltpXS50aW1lclt0aW1lcl9pZHhdKTsKLSAgICAgICAgICBpZiAocmVtYWluaW5nX21zIDwgdGltZW91dF9tcykgewotICAgICAgICAgICAgLyogQ2FuY2VsIGFuZCByZXN0YXJ0IHRoZSB0aW1lciAqLwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRPRE86IFRoZSB2YWx1ZSBvZiBwbV9hY3Rpb25bdGltZXJfaWR4XSBpcwotICAgICAgICAgICAgICogY29uZGl0aW9uYWxseSB1cGRhdGVkIGJldHdlZW4gdGhlIHR3byBmdW5jdGlvbgotICAgICAgICAgICAgICogY2FsbHMgYmVsb3cgd2hlbiB0aGUgdGltZXIgaXMgcmVzdGFydGVkLgotICAgICAgICAgICAgICogVGhpcyBsb2dpYyBpcyBlcnJvci1wcm9uZSBhbmQgc2hvdWxkIGJlIGVsaW1pbmF0ZWQKLSAgICAgICAgICAgICAqIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJ0YV9kbV9wbV9zdG9wX3RpbWVyX2J5X2luZGV4KCZidGFfZG1fY2IucG1fdGltZXJbaV0sIHRpbWVyX2lkeCk7Ci0gICAgICAgICAgICBidGFfZG1fcG1fc3RhcnRfdGltZXIoJmJ0YV9kbV9jYi5wbV90aW1lcltpXSwgdGltZXJfaWR4LCB0aW1lb3V0X21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3J2Y3MtPmlkLCBwbV9hY3Rpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aW1lcl9zdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAoIWJ0YV9kbV9jYi5wbV90aW1lcltpXS5pbl91c2UpIHsKLSAgICAgICAgaWYgKGF2YWlsYWJsZV90aW1lciA9PSBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVgpIGF2YWlsYWJsZV90aW1lciA9IGk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIG5ldyBwb3dlciBtb2RlIGZvciBhIG5ldyBhY3RpdmUgY29ubmVjdGlvbiAqLwotICAgIGlmICghdGltZXJfc3RhcnRlZCkgewotICAgICAgaWYgKGF2YWlsYWJsZV90aW1lciAhPSBCVEFfRE1fUE1fTU9ERV9USU1FUl9NQVgpIHsKLSAgICAgICAgYnRhX2RtX2NiLnBtX3RpbWVyW2F2YWlsYWJsZV90aW1lcl0ucGVlcl9iZGFkZHIgPSBwZWVyX2FkZHI7Ci0gICAgICAgIHRpbWVyX2lkeCA9IGJ0YV9wbV9hY3Rpb25fdG9fdGltZXJfaWR4KHBtX2FjdGlvbik7Ci0gICAgICAgIGlmICh0aW1lcl9pZHggIT0gQlRBX0RNX1BNX01PREVfVElNRVJfTUFYKSB7Ci0gICAgICAgICAgYnRhX2RtX3BtX3N0YXJ0X3RpbWVyKCZidGFfZG1fY2IucG1fdGltZXJbYXZhaWxhYmxlX3RpbWVyXSwgdGltZXJfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zLCBwX3NydmNzLT5pZCwgcG1fYWN0aW9uKTsKLSAgICAgICAgICB0aW1lcl9zdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX1dBUk4oIm5vIG1vcmUgdGltZXJzIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICAvKiBpZiBwZW5kaW5nIHBvd2VyIG1vZGUgdGltZXIgZXhwaXJlcywgYW5kIGN1cnJlY250IGxpbmsgaXMgaW4gYQotICAgICBsb3dlciBwb3dlciBtb2RlIHRoYW4gY3VycmVudCBwcm9maWxlIHJlcXVpcmVtZW50LCBpZ29ucmUgaXQgKi8KLSAgaWYgKHBtX3JlcSA9PSBCVEFfRE1fUE1fRVhFQ1VURSAmJiBwbV9yZXF1ZXN0IDwgcG1fYWN0aW9uKSB7Ci0gICAgTE9HX0VSUk9SKCJJZ25vcmUgdGhlIHBvd2VyIG1vZGUgcmVxdWVzdDogJWQiLCBwbV9yZXF1ZXN0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBtX2FjdGlvbiA9PSBCVEFfRE1fUE1fUEFSSykgewotICAgIHBfcGVlcl9kZXZpY2UtPnBtX21vZGVfYXR0ZW1wdGVkID0gQlRBX0RNX1BNX1BBUks7Ci0gICAgYnRhX2RtX3BtX3BhcmsocGVlcl9hZGRyKTsKLSAgICBMT0dfV0FSTigiREVQUkVDQVRFRCBTZXR0aW5nIGxpbmsgdG8gcGFyayBtb2RlIHBlZXI6JXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpKTsKLSAgfSBlbHNlIGlmIChwbV9hY3Rpb24gJiBCVEFfRE1fUE1fU05JRkYpIHsKLSAgICAvKiBkb250IGluaXRpYXRlIFNOSUZGLCBpZiBsaW5rX3BvbGljeSBoYXMgaXQgZGlzYWJsZWQgKi8KLSAgICBpZiAoQlRNX2lzX3NuaWZmX2FsbG93ZWRfZm9yKHBlZXJfYWRkcikpIHsKLSAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAiTGluayBwb2xpY3kgYWxsb3dzIHNuaWZmIG1vZGUgc28gc2V0dGluZyBtb2RlICIKLSAgICAgICAgICAicGVlcjolcyIsCi0gICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBlZXJfYWRkcikpOwotICAgICAgcF9wZWVyX2RldmljZS0+cG1fbW9kZV9hdHRlbXB0ZWQgPSBCVEFfRE1fUE1fU05JRkY7Ci0gICAgICBidGFfZG1fcG1fc25pZmYocF9wZWVyX2RldmljZSwgKHVpbnQ4X3QpKHBtX2FjdGlvbiAmIDB4MEYpKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX0RFQlVHKCJMaW5rIHBvbGljeSBkaXNhbGxvd3Mgc25pZmYgbW9kZSwgaWdub3JlIHJlcXVlc3QgcGVlcjolcyIsCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBlZXJfYWRkcikpOwotICAgIH0KLSAgfSBlbHNlIGlmIChwbV9hY3Rpb24gPT0gQlRBX0RNX1BNX0FDVElWRSkgewotICAgIExPR19ERUJVRygiU2V0dGluZyBsaW5rIHRvIGFjdGl2ZSBtb2RlIHBlZXI6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyKSk7Ci0gICAgYnRhX2RtX3BtX2FjdGl2ZShwZWVyX2FkZHIpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3BtX3BhcmsKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN3aXRjaCB0byBwYXJrIG1vZGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBwYXJrIGF0dGVtcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidGFfZG1fcG1fcGFyayhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgdEJUTV9QTV9NT0RFIG1vZGUgPSBCVE1fUE1fU1RTX0FDVElWRTsKLQotICAvKiBpZiBub3QgaW4gcGFyayBtb2RlLCBzd2l0Y2ggdG8gcGFyayAqLwotICBpZiAoIUJUTV9SZWFkUG93ZXJNb2RlKHBlZXJfYWRkciwgJm1vZGUpKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byByZWFkIHBvd2VyIG1vZGUgZm9yIHBlZXI6JXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpKTsKLSAgfQotCi0gIGlmIChtb2RlICE9IEJUTV9QTV9NRF9QQVJLKSB7Ci0gICAgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX1NldFBvd2VyTW9kZShidGFfZG1fY2IucG1faWQsIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2J0YV9kbV9wbV9tZFtCVEFfRE1fUE1fUEFSS19JRFhdKTsKLSAgICBpZiAoc3RhdHVzID09IEJUTV9DTURfU1RPUkVEIHx8IHN0YXR1cyA9PSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHNldCBwYXJrIHBvd2VyIG1vZGUiKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19wbV9zbmlmZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3dpdGNoIHRvIHNuaWZmIG1vZGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzbmlmZiBhdHRlbXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fcG1fc25pZmYodEJUQV9ETV9QRUVSX0RFVklDRSogcF9wZWVyX2RldiwgdWludDhfdCBpbmRleCkgewotICB0QlRNX1BNX01PREUgbW9kZSA9IEJUTV9QTV9NRF9BQ1RJVkU7Ci0gIHRCVE1fUE1fUFdSX01EIHB3cl9tZDsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotCi0gIGlmICghQlRNX1JlYWRQb3dlck1vZGUocF9wZWVyX2Rldi0+cGVlcl9iZGFkZHIsICZtb2RlKSkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gcmVhZCBwb3dlciBtb2RlIGZvciBwZWVyOiVzIiwKLSAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9wZWVyX2Rldi0+cGVlcl9iZGFkZHIpKTsKLSAgfQotICB0QlRNX1BNX1NUQVRVUyBtb2RlX3N0YXR1cyA9IHN0YXRpY19jYXN0PHRCVE1fUE1fU1RBVFVTPihtb2RlKTsKLSAgTE9HX0RFQlVHKCJDdXJyZW50IHBvd2VyIG1vZGU6JXNbMHgleF0gcGVlcl9pbmZvOiVzWzB4JTAyeF0iLAotICAgICAgICAgICAgcG93ZXJfbW9kZV9zdGF0dXNfdGV4dChtb2RlX3N0YXR1cykuY19zdHIoKSwgbW9kZV9zdGF0dXMsCi0gICAgICAgICAgICBkZXZpY2VfaW5mb190ZXh0KHBfcGVlcl9kZXYtPkluZm8oKSkuY19zdHIoKSwgcF9wZWVyX2Rldi0+SW5mbygpKTsKLQotICB1aW50OF90KiBwX3JlbV9mZWF0ID0gQlRNX1JlYWRSZW1vdGVGZWF0dXJlcyhwX3BlZXJfZGV2LT5wZWVyX2JkYWRkcik7Ci0KLSAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7Ci0gIGlmIChtb2RlICE9IEJUTV9QTV9NRF9TTklGRiB8fAotICAgICAgKGNvbnRyb2xsZXItPnN1cHBvcnRzX3NuaWZmX3N1YnJhdGluZygpICYmIHBfcmVtX2ZlYXQgJiYKLSAgICAgICBIQ0lfU05JRkZfU1VCX1JBVEVfU1VQUE9SVEVEKHBfcmVtX2ZlYXQpICYmCi0gICAgICAgIShwX3BlZXJfZGV2LT5JbmZvKCkgJiBCVEFfRE1fRElfVVNFX1NTUikpKSB7Ci0gICAgLyogRG9udCBpbml0aWF0ZSBTbmlmZiBpZiBjb250cm9sbGVyIGhhcyBhbHJlYXkgYWNjZXB0ZWQKLSAgICAgKiByZW1vdGUgc25pZmYgcGFyYW1zLiBUaGlzIGF2b2lkIHNuaWZmIGxvb3AgaXNzdWUgd2l0aAotICAgICAqIHNvbWUgYWdycmVzaXZlIGhlYWRzZXRzIHdobyB1c2Ugc25pZmYgbGF0ZW5jaWVzIG1vcmUgdGhhbgotICAgICAqIERVVCBzdXBwb3J0ZWQgcmFuZ2Ugb2YgU25pZmYgaW50ZXJ2YWxzLiovCi0gICAgaWYgKChtb2RlID09IEJUTV9QTV9NRF9TTklGRikgJiYKLSAgICAgICAgKHBfcGVlcl9kZXYtPkluZm8oKSAmIEJUQV9ETV9ESV9BQ1BfU05JRkYpKSB7Ci0gICAgICBMT0dfREVCVUcoIkxpbmsgYWxyZWFkeSBpbiBzbmlmZiBtb2RlIHBlZXI6JXMiLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX3BlZXJfZGV2LT5wZWVyX2JkYWRkcikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvKiBpZiB0aGUgY3VycmVudCBtb2RlIGlzIG5vdCBzbmlmZiwgaXNzdWUgdGhlIHNuaWZmIGNvbW1hbmQuCi0gICAqIElmIHNuaWZmLCBidXQgU1NSIGlzIG5vdCB1c2VkIGluIHRoaXMgbGluaywgc3RpbGwgaXNzdWUgdGhlIGNvbW1hbmQgKi8KLSAgbWVtY3B5KCZwd3JfbWQsICZwX2J0YV9kbV9wbV9tZFtpbmRleF0sIHNpemVvZih0QlRNX1BNX1BXUl9NRCkpOwotICBpZiAocF9wZWVyX2Rldi0+SW5mbygpICYgQlRBX0RNX0RJX0lOVF9TTklGRikgewotICAgIExPR19ERUJVRygiVHJ5aW5nIHRvIGZvcmNlIHBvd2VyIG1vZGUiKTsKLSAgICBwd3JfbWQubW9kZSB8PSBCVE1fUE1fTURfRk9SQ0U7Ci0gIH0KLSAgc3RhdHVzID0gQlRNX1NldFBvd2VyTW9kZShidGFfZG1fY2IucG1faWQsIHBfcGVlcl9kZXYtPnBlZXJfYmRhZGRyLCAmcHdyX21kKTsKLSAgaWYgKHN0YXR1cyA9PSBCVE1fQ01EX1NUT1JFRCB8fCBzdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgcF9wZWVyX2Rldi0+aW5mbyAmPSB+KEJUQV9ETV9ESV9JTlRfU05JRkYgfCBCVEFfRE1fRElfQUNQX1NOSUZGKTsKLSAgICBwX3BlZXJfZGV2LT5pbmZvIHw9IEJUQV9ETV9ESV9TRVRfU05JRkY7Ci0gIH0gZWxzZSBpZiAoc3RhdHVzID09IEJUTV9TVUNDRVNTKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2RtX3BtX3NuaWZmIEJUTV9TZXRQb3dlck1vZGUoKSByZXR1cm5zIEJUTV9TVUNDRVNTIik7Ci0gICAgcF9wZWVyX2Rldi0+aW5mbyAmPQotICAgICAgICB+KEJUQV9ETV9ESV9JTlRfU05JRkYgfCBCVEFfRE1fRElfQUNQX1NOSUZGIHwgQlRBX0RNX0RJX1NFVF9TTklGRik7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gc2V0IHBvd2VyIG1vZGUgcGVlcjolcyBzdGF0dXM6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9wZWVyX2Rldi0+cGVlcl9iZGFkZHIpLAotICAgICAgICAgICAgICBidG1fc3RhdHVzX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgICBwX3BlZXJfZGV2LT5pbmZvICY9Ci0gICAgICAgIH4oQlRBX0RNX0RJX0lOVF9TTklGRiB8IEJUQV9ETV9ESV9BQ1BfU05JRkYgfCBCVEFfRE1fRElfU0VUX1NOSUZGKTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9wbV9zc3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrcyBhbmQgc2VuZHMgU1NSIHBhcmFtZXRlcnMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX3Nzcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsIGludCBzc3IpIHsKLSAgaW50IGN1cnJlbnRfc3NyX2luZGV4OwotICBpbnQgc3NyX2luZGV4ID0gc3NyOwotICB0QlRBX0RNX1NTUl9TUEVDKiBwX3NwZWMgPSAmcF9idGFfZG1fc3NyX3NwZWNbc3NyX2luZGV4XTsKLQotICBMT0dfREVCVUcoIlJlcXVlc3QgdG8gcHV0IGxpbmsgdG8gZGV2aWNlOiVzIGludG8gcG93ZXJfbW9kZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyKSwgcF9zcGVjLT5uYW1lKTsKLSAgLyogZ28gdGhyb3VnaCB0aGUgY29ubmVjdGVkIHNlcnZpY2VzICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYnRhX2RtX2Nvbm5fc3J2Y3MuY291bnQ7IGkrKykgewotICAgIGNvbnN0IHRCVEFfRE1fU1JWQ1MmIHNlcnZpY2UgPSBidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbaV07Ci0gICAgaWYgKHNlcnZpY2UucGVlcl9iZGFkZHIgIT0gcGVlcl9hZGRyKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLyogcF9idGFfZG1fcG1fY2ZnWzBdLmFwcF9pZCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgKi8KLSAgICBmb3IgKGludCBqID0gMTsgaiA8PSBwX2J0YV9kbV9wbV9jZmdbMF0uYXBwX2lkOyBqKyspIHsKLSAgICAgIC8qIGZpbmQgdGhlIGFzc29jaWF0ZWQgcF9idGFfZG1fcG1fY2ZnICovCi0gICAgICBjb25zdCB0QlRBX0RNX1BNX0NGRyYgY29uZmlnID0gcF9idGFfZG1fcG1fY2ZnW2pdOwotICAgICAgY3VycmVudF9zc3JfaW5kZXggPSBwX2J0YV9kbV9wbV9zcGVjW2NvbmZpZy5zcGVjX2lkeF0uc3NyOwotICAgICAgaWYgKChjb25maWcuaWQgPT0gc2VydmljZS5pZCkgJiYgKChjb25maWcuYXBwX2lkID09IEJUQV9BTExfQVBQX0lEKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWcuYXBwX2lkID09IHNlcnZpY2UuYXBwX2lkKSkpIHsKLSAgICAgICAgTE9HX0lORk8oIkZvdW5kIGNvbm5lY3RlZCBzZXJ2aWNlOiVzIGFwcF9pZDolZCBwZWVyOiVzIHNwZWNfbmFtZTolcyIsCi0gICAgICAgICAgICAgICAgIEJ0YUlkU3lzVGV4dChzZXJ2aWNlLmlkKS5jX3N0cigpLCBzZXJ2aWNlLmFwcF9pZCwKLSAgICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBlZXJfYWRkciksCi0gICAgICAgICAgICAgICAgIHBfYnRhX2RtX3Nzcl9zcGVjW2N1cnJlbnRfc3NyX2luZGV4XS5uYW1lKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIGZpbmQgdGhlIHNzciBpbmRleCB3aXRoIHRoZSBzbWFsbGVzdCBtYXggbGF0ZW5jeS4gKi8KLSAgICB0QlRBX0RNX1NTUl9TUEVDKiBwX3NwZWNfY3VyID0gJnBfYnRhX2RtX3Nzcl9zcGVjW2N1cnJlbnRfc3NyX2luZGV4XTsKLSNpZiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCi0gICAgLyogSEggaGFzIHRoZSBwZXIgY29ubmVjdGlvbiBTU1IgcHJlZmVyZW5jZSwgYWxyZWFkeSByZWFkIHRoZSBTU1IgcGFyYW1zCi0gICAgICogZnJvbSBCVEEgSEggKi8KLSAgICBpZiAoY3VycmVudF9zc3JfaW5kZXggPT0gQlRBX0RNX1BNX1NTUl9ISCkgewotICAgICAgaWYgKGJ0YV9oaF9yZWFkX3Nzcl9wYXJhbShwZWVyX2FkZHIsICZwX3NwZWNfY3VyLT5tYXhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zcGVjX2N1ci0+bWluX3JtdF90bykgPT0gQlRBX0hIX0VSUikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAocF9zcGVjX2N1ci0+bWF4X2xhdCA8IHBfc3BlYy0+bWF4X2xhdCB8fAotICAgICAgICAoc3NyX2luZGV4ID09IEJUQV9ETV9QTV9TU1IwICYmIGN1cnJlbnRfc3NyX2luZGV4ICE9IEJUQV9ETV9QTV9TU1IwKSkgewotICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICJDaGFuZ2luZyBzbmlmZiBzdWJyYXRpbmcgc3BlY2lmaWNhdGlvbiBmb3IgJXMgZnJvbSAlc1slZF0gPT0+ICIKLSAgICAgICAgICAiJXNbJWRdIiwKLSAgICAgICAgICBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyKSwgcF9zcGVjLT5uYW1lLCBzc3JfaW5kZXgsIHBfc3BlY19jdXItPm5hbWUsCi0gICAgICAgICAgY3VycmVudF9zc3JfaW5kZXgpOwotICAgICAgc3NyX2luZGV4ID0gY3VycmVudF9zc3JfaW5kZXg7Ci0gICAgICBwX3NwZWMgPSAmcF9idGFfZG1fc3NyX3NwZWNbc3NyX2luZGV4XTsKLSAgICB9Ci0gIH0KLQotICBpZiAocF9zcGVjLT5tYXhfbGF0KSB7Ci0gICAgLyogQXZvaWQgU1NSIHJlc2V0IG9uIGRldmljZSB3aGljaCBoYXMgU0NPIGNvbm5lY3RlZCAqLwotICAgIGlmIChidGFfZG1fcG1faXNfc2NvX2FjdGl2ZSgpKSB7Ci0gICAgICBpbnQgaWR4ID0gYnRhX2RtX2dldF9zY29faW5kZXgoKTsKLSAgICAgIGlmIChpZHggIT0gLTEpIHsKLSAgICAgICAgaWYgKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tpZHhdLnBlZXJfYmRhZGRyID09IHBlZXJfYWRkcikgewotICAgICAgICAgIExPR19XQVJOKCJTQ08gaXMgYWN0aXZlIG9uIGRldmljZSwgaWdub3JlIFNTUiIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIExPR19ERUJVRygKLSAgICAgICAgIlNldHRpbmcgc25pZmYgc3VicmF0aW5nIGZvciBkZXZpY2U6JXMgc3BlY19uYW1lOiVzIG1heF9sYXRlbmN5KHMpOiUuMmYiCi0gICAgICAgICIgbWluX2xvY2FsX3RpbWVvdXQocyk6JS4yZiBtaW5fcmVtb3RlX3RpbWVvdXQocyk6JS4yZiIsCi0gICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpLCBwX3NwZWMtPm5hbWUsCi0gICAgICAgIHRpY2tzX3RvX3NlY29uZHMocF9zcGVjLT5tYXhfbGF0KSwgdGlja3NfdG9fc2Vjb25kcyhwX3NwZWMtPm1pbl9sb2NfdG8pLAotICAgICAgICB0aWNrc190b19zZWNvbmRzKHBfc3BlYy0+bWluX3JtdF90bykpOwotICAgIC8qIHNldCB0aGUgU1NSIHBhcmFtZXRlcnMuICovCi0gICAgQlRNX1NldFNzclBhcmFtcyhwZWVyX2FkZHIsIHBfc3BlYy0+bWF4X2xhdCwgcF9zcGVjLT5taW5fcm10X3RvLAotICAgICAgICAgICAgICAgICAgICAgcF9zcGVjLT5taW5fbG9jX3RvKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3BtX2FjdGl2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnJpbmdzIGNvbm5lY3Rpb24gdG8gYWN0aXZlIG1vZGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fcG1fYWN0aXZlKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICB0QlRNX1BNX1BXUl9NRCBwbXsKLSAgICAgIC5tb2RlID0gQlRNX1BNX01EX0FDVElWRSwKLSAgfTsKLQotICAvKiBzd2l0Y2ggdG8gYWN0aXZlIG1vZGUgKi8KLSAgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX1NldFBvd2VyTW9kZShidGFfZG1fY2IucG1faWQsIHBlZXJfYWRkciwgJnBtKTsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIEJUTV9DTURfU1RPUkVEOgotICAgICAgTE9HX0RFQlVHKCJBY3RpdmUgcG93ZXIgbW9kZSBzdG9yZWQgZm9yIGV4ZWN1dGlvbiBsYXRlciBmb3IgcmVtb3RlOiVzIiwKLSAgICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9DTURfU1RBUlRFRDoKLSAgICAgIExPR19ERUJVRygiQWN0aXZlIHBvd2VyIG1vZGUgc3RhcnRlZCBmb3IgcmVtb3RlOiVzIiwKLSAgICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9TVUNDRVNTOgotICAgICAgTE9HX0lORk8oIkFjdGl2ZSBwb3dlciBtb2RlIGFscmVhZHkgc2V0IGZvciBkZXZpY2U6JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBlZXJfYWRkcikpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gc2V0IGFjdGl2ZSBwb3dlciBtb2RlIGZvciBkZXZpY2U6JXMgc3RhdHVzOiVzIiwKLSAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpLCBidG1fc3RhdHVzX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKiBCVE0gcG93ZXIgbWFuYWdlciBjYWxsYmFjayAqLwotc3RhdGljIHZvaWQgYnRhX2RtX3BtX2J0bV9jYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1BNX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfZG1fcG1fYnRtX3N0YXR1cywgYmRfYWRkciwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGhjaV9zdGF0dXMpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9wbV90aW1lcl9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUG93ZXIgbWFuYWdlbWVudCB0aW1lciBjYWxsYmFjay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9kbV9wbV90aW1lcl9jYmFjayh2b2lkKiBkYXRhKSB7Ci0gIHVpbnQ4X3QgaSwgajsKLSAgYWxhcm1fdCogYWxhcm0gPSAoYWxhcm1fdCopZGF0YTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBzdGF0ZV9sb2NrKHBtX3RpbWVyX3N0YXRlX211dGV4KTsKLSAgZm9yIChpID0gMDsgaSA8IEJUQV9ETV9OVU1fUE1fVElNRVI7IGkrKykgewotICAgIEFQUExfVFJBQ0VfREVCVUcoImRtX3BtX3RpbWVyWyVkXSBpbiB1c2U/ICVkIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5pbl91c2UpOwotICAgIGlmIChidGFfZG1fY2IucG1fdGltZXJbaV0uaW5fdXNlKSB7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgQlRBX0RNX1BNX01PREVfVElNRVJfTUFYOyBqKyspIHsKLSAgICAgICAgaWYgKGJ0YV9kbV9jYi5wbV90aW1lcltpXS50aW1lcltqXSA9PSBhbGFybSkgewotICAgICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5hY3RpdmUtLTsKLSAgICAgICAgICBidGFfZG1fY2IucG1fdGltZXJbaV0uc3J2Y19pZFtqXSA9IEJUQV9JRF9NQVg7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiZG1fcG1fdGltZXJbJWRdIGV4cGlyZXMsIHRpbWVyX2lkeD0lZCIsIGksIGopOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoYnRhX2RtX2NiLnBtX3RpbWVyW2ldLmFjdGl2ZSA9PSAwKQotICAgICAgICBidGFfZG1fY2IucG1fdGltZXJbaV0uaW5fdXNlID0gZmFsc2U7Ci0gICAgICBpZiAoaiA8IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWCkgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHN0YXRlX2xvY2sudW5sb2NrKCk7Ci0KLSAgLyogbm8gbW9yZSB0aW1lcnMgKi8KLSAgaWYgKGkgPT0gQlRBX0RNX05VTV9QTV9USU1FUikgcmV0dXJuOwotCi0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9wbV90aW1lciwgYnRhX2RtX2NiLnBtX3RpbWVyW2ldLnBlZXJfYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5wbV9hY3Rpb25bal0pKTsKLX0KLQotLyoqIFByb2Nlc3MgcG0gc3RhdHVzIGV2ZW50IGZyb20gYnRtICovCi12b2lkIGJ0YV9kbV9wbV9idG1fc3RhdHVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVE1fUE1fU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwsIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpIHsKLSAgTE9HX0RFQlVHKAotICAgICAgIlBvd2VyIG1vZGUgbm90aWZpY2F0aW9uIGV2ZW50IHN0YXR1czolcyBwZWVyOiVzIGludGVydmFsOiVodSAiCi0gICAgICAiaGNpX3N0YXR1czolcyIsCi0gICAgICBwb3dlcl9tb2RlX3N0YXR1c190ZXh0KHN0YXR1cykuY19zdHIoKSwgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpLAotICAgICAgaW50ZXJ2YWwsIGhjaV9lcnJvcl9jb2RlX3RleHQoaGNpX3N0YXR1cykuY19zdHIoKSk7Ci0KLSAgdEJUQV9ETV9QRUVSX0RFVklDRSogcF9kZXYgPSBidGFfZG1fZmluZF9wZWVyX2RldmljZShiZF9hZGRyKTsKLSAgaWYgKHBfZGV2ID09IG51bGxwdHIpIHsKLSAgICBMT0dfSU5GTygiVW5hYmxlIHRvIHByb2Nlc3MgcG93ZXIgZXZlbnQgZm9yIHBlZXI6JXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9ETV9ERVZfSU5GTyBpbmZvID0gcF9kZXYtPkluZm8oKTsKLSAgLyogY2hlY2sgbmV3IG1vZGUgKi8KLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIEJUTV9QTV9TVFNfQUNUSVZFOgotICAgICAgLyogaWYgb3VyIHNuaWZmIG9yIHBhcmsgYXR0ZW1wdCBmYWlsZWQKLSAgICAgIHdlIHNob3VsZCBub3QgdHJ5IGl0IGFnYWluKi8KLSAgICAgIGlmIChoY2lfc3RhdHVzICE9IDApIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgaGNpX3N0YXR1cz0lZCIsIF9fZnVuY19fLCBoY2lfc3RhdHVzKTsKLSAgICAgICAgcF9kZXYtPmluZm8gJj0KLSAgICAgICAgICAgIH4oQlRBX0RNX0RJX0lOVF9TTklGRiB8IEJUQV9ETV9ESV9BQ1BfU05JRkYgfCBCVEFfRE1fRElfU0VUX1NOSUZGKTsKLQotICAgICAgICBpZiAocF9kZXYtPnBtX21vZGVfYXR0ZW1wdGVkICYgKEJUQV9ETV9QTV9QQVJLIHwgQlRBX0RNX1BNX1NOSUZGKSkgewotICAgICAgICAgIHBfZGV2LT5wbV9tb2RlX2ZhaWxlZCB8PQotICAgICAgICAgICAgICAoKEJUQV9ETV9QTV9QQVJLIHwgQlRBX0RNX1BNX1NOSUZGKSAmIHBfZGV2LT5wbV9tb2RlX2F0dGVtcHRlZCk7Ci0gICAgICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXJfYnlfbW9kZShiZF9hZGRyLCBwX2Rldi0+cG1fbW9kZV9hdHRlbXB0ZWQpOwotICAgICAgICAgIGJ0YV9kbV9wbV9zZXRfbW9kZShiZF9hZGRyLCBCVEFfRE1fUE1fTk9fQUNUSU9OLCBCVEFfRE1fUE1fUkVTVEFSVCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwX2Rldi0+cHJldl9sb3cpIHsKLSAgICAgICAgICAvKiBuZWVkIHRvIHNlbmQgdGhlIFNTUiBwYXJhbWF0ZXJzIHRvIGNvbnRyb2xsZXIgYWdhaW4gKi8KLSAgICAgICAgICBidGFfZG1fcG1fc3NyKHBfZGV2LT5wZWVyX2JkYWRkciwgQlRBX0RNX1BNX1NTUjApOwotICAgICAgICB9Ci0gICAgICAgIHBfZGV2LT5wcmV2X2xvdyA9IEJUTV9QTV9TVFNfQUNUSVZFOwotICAgICAgICAvKiBsaW5rIHRvIGFjdGl2ZSBtb2RlLCBuZWVkIHRvIHJlc3RhcnQgdGhlIHRpbWVyIGZvciBuZXh0IGxvdyBwb3dlcgotICAgICAgICAgKiBtb2RlIGlmIG5lZWRlZCAqLwotICAgICAgICBidGFfZG1fcG1fc3RvcF90aW1lcihiZF9hZGRyKTsKLSAgICAgICAgYnRhX2RtX3BtX3NldF9tb2RlKGJkX2FkZHIsIEJUQV9ETV9QTV9OT19BQ1RJT04sIEJUQV9ETV9QTV9SRVNUQVJUKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fUE1fU1RTX1BBUks6Ci0gICAgY2FzZSBCVE1fUE1fU1RTX0hPTEQ6Ci0gICAgICAvKiBzYXZlIHRoZSBwcmV2aW91cyBsb3cgcG93ZXIgbW9kZSAtIGZvciBTU1IuCi0gICAgICAgKiBTU1IgcGFyYW1ldGVycyBhcmUgc2VudCB0byBjb250cm9sbGVyIG9uICJjb25uIG9wZW4iLgotICAgICAgICogdGhlIG51bWJlcnMgc3RheSBnb29kIHVudGlsIHBhcmsvaG9sZC9kZXRhY2ggKi8KLSAgICAgIGlmIChwX2Rldi0+aW5mbyAmIEJUQV9ETV9ESV9VU0VfU1NSKSBwX2Rldi0+cHJldl9sb3cgPSBzdGF0dXM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BNX1NUU19TU1I6Ci0gICAgICBpZiAoaGNpX3N0YXR1cyAhPSAwKSB7Ci0gICAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBlcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gc2V0IHNuaWZmIHN1YnJhdGluZyBtb2RlIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaW50ZXJ2YWwpIHsKLSAgICAgICAgcF9kZXYtPmluZm8gfD0gQlRBX0RNX0RJX1VTRV9TU1I7Ci0gICAgICAgIExPR19ERUJVRygiRW5hYmxpbmcgc25pZmYgc3VicmF0aW5nIG1vZGUgZm9yIHBlZXI6JXMiLAotICAgICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfZGV2LT5pbmZvICY9IH5CVEFfRE1fRElfVVNFX1NTUjsKLSAgICAgICAgTE9HX0RFQlVHKCJEaXNhYmxpbmcgc25pZmYgc3VicmF0aW5nIG1vZGUgZm9yIHBlZXI6JXMiLAotICAgICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX1BNX1NUU19TTklGRjoKLSAgICAgIGlmIChoY2lfc3RhdHVzID09IDApIHsKLSAgICAgICAgLyogU3RvcCBQTSB0aW1lciBub3cgaWYgYWxyZWFkeSBhY3RpdmUgZm9yCi0gICAgICAgICAqIHBhcnRpY3VsYXIgZGV2aWNlIHNpbmNlIGxpbmsgaXMgYWxyZWFkeQotICAgICAgICAgKiBwdXQgaW4gc25pZmYgbW9kZSBieSByZW1vdGUgZGV2aWNlLCBhbmQKLSAgICAgICAgICogUE0gdGltZXIgc29sZSBwdXJwb3NlIGlzIHRvIHB1dCB0aGUgbGluawotICAgICAgICAgKiBpbiBzbmlmZiBtb2RlIGZyb20gaG9zdCBzaWRlLgotICAgICAgICAgKi8KLSAgICAgICAgYnRhX2RtX3BtX3N0b3BfdGltZXIoYmRfYWRkcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX2Rldi0+aW5mbyAmPQotICAgICAgICAgICAgfihCVEFfRE1fRElfU0VUX1NOSUZGIHwgQlRBX0RNX0RJX0lOVF9TTklGRiB8IEJUQV9ETV9ESV9BQ1BfU05JRkYpOwotICAgICAgICBpZiAoaW5mbyAmIEJUQV9ETV9ESV9TRVRfU05JRkYpCi0gICAgICAgICAgcF9kZXYtPmluZm8gfD0gQlRBX0RNX0RJX0lOVF9TTklGRjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBfZGV2LT5pbmZvIHw9IEJUQV9ETV9ESV9BQ1BfU05JRkY7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BNX1NUU19FUlJPUjoKLSAgICAgIHBfZGV2LT5pbmZvICY9IH5CVEFfRE1fRElfU0VUX1NOSUZGOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCB1bmtub3duIHBvd2VyIG1vZGUgc3RhdHVzIGV2ZW50OiVoaHUiLCBzdGF0dXMpOwotICAgICAgYnJlYWs7Ci0gICAgICB9Ci19Ci0KLS8qKiBQcm9jZXNzIHBtIHRpbWVyIGV2ZW50IGZyb20gYnRtICovCi12b2lkIGJ0YV9kbV9wbV90aW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRBX0RNX1BNX0FDVElPTiBwbV9yZXF1ZXN0KSB7Ci0gIEFQUExfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotICBidGFfZG1fcG1fc2V0X21vZGUoYmRfYWRkciwgcG1fcmVxdWVzdCwgQlRBX0RNX1BNX0VYRUNVVEUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2ZpbmRfcGVlcl9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIGFuIGFkZHJlc3MsIGZpbmQgdGhlIGFzc29jaWF0ZWQgY29udHJvbCBibG9jay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRCVEFfRE1fUEVFUl9ERVZJQ0UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9ETV9QRUVSX0RFVklDRSogYnRhX2RtX2ZpbmRfcGVlcl9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIHRCVEFfRE1fUEVFUl9ERVZJQ0UqIHBfZGV2ID0gTlVMTDsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudDsgaSsrKSB7Ci0gICAgaWYgKGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXS5wZWVyX2JkYWRkciA9PSBwZWVyX2FkZHIpIHsKLSAgICAgIHBfZGV2ID0gJmJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5wZWVyX2RldmljZVtpXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcF9kZXY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1faXNfc2NvX2FjdGl2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vcCB0aHJvdWdoIGNvbm5lY3RlZCBzZXJ2aWNlcyBmb3IgSEZQK1N0YXRlPVNDTwotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbC4gdHJ1ZSBpZiBTQ08gYWN0aXZlLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0YV9kbV9wbV9pc19zY29fYWN0aXZlKCkgewotICBpbnQgajsKLSAgYm9vbCBiU2NvQWN0aXZlID0gZmFsc2U7Ci0KLSAgZm9yIChqID0gMDsgaiA8IGJ0YV9kbV9jb25uX3NydmNzLmNvdW50OyBqKyspIHsKLSAgICAvKiBjaGVjayBpZiBhbiBlbnRyeSBhbHJlYWR5IHByZXNlbnQgKi8KLSAgICBpZiAoKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5pZCA9PSBCVEFfSURfQUcpICYmCi0gICAgICAgIChidGFfZG1fY29ubl9zcnZjcy5jb25uX3NydmNbal0uc3RhdGUgPT0gQlRBX1NZU19TQ09fT1BFTikpIHsKLSAgICAgIGJTY29BY3RpdmUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBiU2NvQWN0aXZlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBidGFfZG1fZ2V0X3Njb19pbmRleAotICoKLSAqIERlc2NyaXB0aW9uICAgICBMb29wIHRocm91Z2ggY29ubmVjdGVkIHNlcnZpY2VzIGZvciBIRlArU3RhdGU9U0NPCi0gKgotICogUmV0dXJucyAgICAgICAgIGluZGV4IGF0IHdoaWNoIFNDTyBpcyBjb25uZWN0ZWQsIGluIGFic2VuY2Ugb2YgU0NPIHJldHVybiAtMQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGJ0YV9kbV9nZXRfc2NvX2luZGV4KCkgewotICBmb3IgKGludCBqID0gMDsgaiA8IGJ0YV9kbV9jb25uX3NydmNzLmNvdW50OyBqKyspIHsKLSAgICAvKiBjaGVjayBmb3IgU0NPIGNvbm5lY3RlZCBpbmRleCAqLwotICAgIGlmICgoYnRhX2RtX2Nvbm5fc3J2Y3MuY29ubl9zcnZjW2pdLmlkID09IEJUQV9JRF9BRykgJiYKLSAgICAgICAgKGJ0YV9kbV9jb25uX3NydmNzLmNvbm5fc3J2Y1tqXS5zdGF0ZSA9PSBCVEFfU1lTX1NDT19PUEVOKSkgewotICAgICAgcmV0dXJuIGo7Ci0gICAgfQotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9wbV9vYnRhaW5fY29udHJvbGxlcl9zdGF0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBvYnRhaW5zIHRoZSBjb25zb2xpZGF0ZWQgY29udHJvbGxlciBwb3dlcgotICogICAgICAgICAgICAgICAgICBzdGF0ZQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fQ09OVFJMX1NUQVRFIGJ0YV9kbV9wbV9vYnRhaW5fY29udHJvbGxlcl9zdGF0ZSh2b2lkKSB7Ci0gIC8qICAgRGlkIG5vdCB1c2UgY291bnRzIGFzIGl0IGlzIG5vdCBzdXJlLCBob3cgYWNjdXJhdGUgdGhlIGNvdW50IHZhbHVlcyBhcmUKLSAgICppbgotICAgKiogIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCA+IDAgfHwgYnRhX2RtX2NiLmRldmljZV9saXN0LmxlX2NvdW50ID4gMCAqLwotCi0gIHRCVE1fQ09OVFJMX1NUQVRFIGN1cl9zdGF0ZSA9IEJUTV9DT05UUkxfVU5LTk9XTjsKLSAgY3VyX3N0YXRlID0gQlRNX1BNX1JlYWRDb250cm9sbGVyU3RhdGUoKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fcG1fb2J0YWluX2NvbnRyb2xsZXJfc3RhdGU6ICVkIiwgY3VyX3N0YXRlKTsKLSAgcmV0dXJuIGN1cl9zdGF0ZTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0Y19hY3QuY2MgYi9idGEvZ2F0dC9idGFfZ2F0dGNfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQ2ODA5Li4wMDAwMDAwCi0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0Y19hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBHQVRUIGNsaWVudCBhY3Rpb24gZnVuY3Rpb25zIGZvciB0aGUgc3RhdGUKLSAqICBtYWNoaW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRhX2dhdHRjIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIgotI2luY2x1ZGUgImJ0YS9oaC9idGFfaGhfaW50LmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfY29ubi5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgLy8gZG9faW5fbWFpbl90aHJlYWQKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jb25uX2NiYWNrKHRHQVRUX0lGIGdhdHRjX2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NtcGxfY2JhY2sodWludDE2X3QgY29ubl9pZCwgdEdBVFRDX09QVFlQRSBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jbXBsX3NlbmRtc2codWludDE2X3QgY29ubl9pZCwgdEdBVFRDX09QVFlQRSBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUqIHBfZGF0YSk7Ci0KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19kZXJlZ2lzdGVyX2NtcGwodEJUQV9HQVRUQ19SQ0IqIHBfY2xyZWcpOwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2VuY19jbXBsX2NiYWNrKHRHQVRUX0lGIGdhdHRjX2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NvbmdfY2JhY2sodWludDE2X3QgY29ubl9pZCwgYm9vbCBjb25nZXN0ZWQpOwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX3BoeV91cGRhdGVfY2JhY2sodEdBVFRfSUYgZ2F0dF9pZiwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpOwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2Nvbm5fdXBkYXRlX2NiYWNrKHRHQVRUX0lGIGdhdHRfaWYsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgdEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfaW5pdF9ia19jb25uKGNvbnN0IHRCVEFfR0FUVENfQVBJX09QRU4qIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19SQ0IqIHBfY2xyZWcpOwotCi1zdGF0aWMgdEdBVFRfQ0JBQ0sgYnRhX2dhdHRjX2NsX2NiYWNrID0gewotICAgIC5wX2Nvbm5fY2IgPSBidGFfZ2F0dGNfY29ubl9jYmFjaywKLSAgICAucF9jbXBsX2NiID0gYnRhX2dhdHRjX2NtcGxfY2JhY2ssCi0gICAgLnBfZGlzY19yZXNfY2IgPSBidGFfZ2F0dGNfZGlzY19yZXNfY2JhY2ssCi0gICAgLnBfZGlzY19jbXBsX2NiID0gYnRhX2dhdHRjX2Rpc2NfY21wbF9jYmFjaywKLSAgICAucF9yZXFfY2IgPSBudWxscHRyLAotICAgIC5wX2VuY19jbXBsX2NiID0gYnRhX2dhdHRjX2VuY19jbXBsX2NiYWNrLAotICAgIC5wX2Nvbmdlc3Rpb25fY2IgPSBidGFfZ2F0dGNfY29uZ19jYmFjaywKLSAgICAucF9waHlfdXBkYXRlX2NiID0gYnRhX2dhdHRjX3BoeV91cGRhdGVfY2JhY2ssCi0gICAgLnBfY29ubl91cGRhdGVfY2IgPSBidGFfZ2F0dGNfY29ubl91cGRhdGVfY2JhY2t9OwotCi0vKiBvcGNvZGUodEdBVFRDX09QVFlQRSkgb3JkZXIgaGFzIHRvIGJlIGNvbXBseSB3aXRoIGludGVybmFsIGV2ZW50IG9yZGVyICovCi1zdGF0aWMgdWludDE2X3QgYnRhX2dhdHRjX29wY29kZV90b19pbnRfZXZ0W10gPSB7Ci0gICAgLyogU2tpcDogR0FUVENfT1BUWVBFX05PTkUgKi8KLSAgICAvKiBTa2lwOiBHQVRUQ19PUFRZUEVfRElTQ09WRVJZICovCi0gICAgQlRBX0dBVFRDX0FQSV9SRUFEX0VWVCwgICAvKiBHQVRUQ19PUFRZUEVfUkVBRCAqLwotICAgIEJUQV9HQVRUQ19BUElfV1JJVEVfRVZULCAgLyogR0FUVENfT1BUWVBFX1dSSVRFICovCi0gICAgQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCwgICAvKiBHQVRUQ19PUFRZUEVfRVhFX1dSSVRFICovCi0gICAgQlRBX0dBVFRDX0FQSV9DRkdfTVRVX0VWVCAvKiBHQVRUQ19PUFRZUEVfQ09ORklHICovCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2dhdHRjX29wX2NvZGVfbmFtZVtdID0gewotICAgICJVbmtub3duIiwgICAgICAvKiBHQVRUQ19PUFRZUEVfTk9ORSAqLwotICAgICJEaXNjb3ZlcnkiLCAgICAvKiBHQVRUQ19PUFRZUEVfRElTQ09WRVJZICovCi0gICAgIlJlYWQiLCAgICAgICAgIC8qIEdBVFRDX09QVFlQRV9SRUFEICovCi0gICAgIldyaXRlIiwgICAgICAgIC8qIEdBVFRDX09QVFlQRV9XUklURSAqLwotICAgICJFeGVjIiwgICAgICAgICAvKiBHQVRUQ19PUFRZUEVfRVhFX1dSSVRFICovCi0gICAgIkNvbmZpZyIsICAgICAgIC8qIEdBVFRDX09QVFlQRV9DT05GSUcgKi8KLSAgICAiTm90aWZpY2F0aW9uIiwgLyogR0FUVENfT1BUWVBFX05PVElGSUNBVElPTiAqLwotICAgICJJbmRpY2F0aW9uIiAgICAvKiBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTiAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQWN0aW9uIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYnRhX2dhdHRjX3Jlc2V0X2Rpc2NvdmVyX3N0KHRCVEFfR0FUVENfU0VSViogcF9zcmNiLCB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLQotLyoqIEVuYWJsZXMgR0FUVEMgbW9kdWxlICovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfZW5hYmxlKCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIGlmIChidGFfZ2F0dGNfY2Iuc3RhdGUgPT0gQlRBX0dBVFRDX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgLyogaW5pdGlhbGl6ZSBjb250cm9sIGJsb2NrICovCi0gICAgYnRhX2dhdHRjX2NiID0gdEJUQV9HQVRUQ19DQigpOwotICAgIGJ0YV9nYXR0Y19jYi5zdGF0ZSA9IEJUQV9HQVRUQ19TVEFURV9FTkFCTEVEOwotICB9IGVsc2UgewotICAgIFZMT0coMSkgPDwgIkdBVFRDIGlzIGFscmVhZHkgZW5hYmxlZCI7Ci0gIH0KLX0KLQotLyoqIERpc2FibGUgR0FUVEMgbW9kdWxlIGJ5IGNsZWFuaW5nIHVwIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgYW5kIGRlcmVnaXN0ZXIKLSAqIGFsbCBhcHBsaWNhdGlvbiAqLwotdm9pZCBidGFfZ2F0dGNfZGlzYWJsZSgpIHsKLSAgdWludDhfdCBpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKGJ0YV9nYXR0Y19jYi5zdGF0ZSAhPSBCVEFfR0FUVENfU1RBVEVfRU5BQkxFRCkgewotICAgIExPRyhFUlJPUikgPDwgIm5vdCBlbmFibGVkLCBvciBkaXNhYmxlZCBpbiBwcm9ncmVzcyI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19DTF9NQVg7IGkrKykgewotICAgIGlmICghYnRhX2dhdHRjX2NiLmNsX3JjYltpXS5pbl91c2UpIGNvbnRpbnVlOwotCi0gICAgYnRhX2dhdHRjX2NiLnN0YXRlID0gQlRBX0dBVFRDX1NUQVRFX0RJU0FCTElORzsKLS8qIGRvbid0IGRlcmVnaXN0ZXIgSEggR0FUVCBJRiAqLwotLyogSEggR0FUVCBJRiB3aWxsIGJlIGRlcmVnaXN0ZXJlZCBieSBidGFfaGhfbGVfZGVyZWdpc3RlciB3aGVuIGRpc2FibGUgSEggKi8KLSAgICBpZiAoIWJ0YV9oaF9sZV9pc19oaF9nYXR0X2lmKGJ0YV9nYXR0Y19jYi5jbF9yY2JbaV0uY2xpZW50X2lmKSkgewotICAgICAgYnRhX2dhdHRjX2RlcmVnaXN0ZXIoJmJ0YV9nYXR0Y19jYi5jbF9yY2JbaV0pOwotICAgIH0KLSAgfQotCi0gIC8qIG5vIHJlZ2lzdGVyZWQgYXBwcywgaW5kaWNhdGUgZGlzYWJsZSBjb21wbGV0ZWQgKi8KLSAgaWYgKGJ0YV9nYXR0Y19jYi5zdGF0ZSAhPSBCVEFfR0FUVENfU1RBVEVfRElTQUJMSU5HKSB7Ci0gICAgYnRhX2dhdHRjX2NiID0gdEJUQV9HQVRUQ19DQigpOwotICAgIGJ0YV9nYXR0Y19jYi5zdGF0ZSA9IEJUQV9HQVRUQ19TVEFURV9ESVNBQkxFRDsKLSAgfQotfQotCi0vKiogc3RhcnQgYW4gYXBwbGljYXRpb24gaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfc3RhcnRfaWYodWludDhfdCBjbGllbnRfaWYpIHsKLSAgaWYgKCFidGFfZ2F0dGNfY2xfZ2V0X3JlZ2NiKGNsaWVudF9pZikpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQgYXBwLjogVW5rbm93biBjbGllbnRfaWY9IiA8PCArY2xpZW50X2lmOwotICAgIHJldHVybjsKLSAgfQotCi0gIEdBVFRfU3RhcnRJZihjbGllbnRfaWYpOwotfQotCi0vKiogUmVnaXN0ZXIgYSBHQVRUIGNsaWVudCBhcHBsaWNhdGlvbiB3aXRoIEJUQSAqLwotdm9pZCBidGFfZ2F0dGNfcmVnaXN0ZXIoY29uc3QgVXVpZCYgYXBwX3V1aWQsIHRCVEFfR0FUVENfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBCdGFBcHBSZWdpc3RlckNhbGxiYWNrIGNiLCBib29sIGVhdHRfc3VwcHBvcnQpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfTk9fUkVTT1VSQ0VTOwotICB1aW50OF90IGNsaWVudF9pZiA9IDA7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogc3RhdGU6IiA8PCArYnRhX2dhdHRjX2NiLnN0YXRlOwotCi0gIC8qIGNoZWNrIGlmICBHQVRUQyBtb2R1bGUgaXMgYWxyZWFkeSBlbmFibGVkIC4gRWxzZSBlbmFibGUgKi8KLSAgaWYgKGJ0YV9nYXR0Y19jYi5zdGF0ZSA9PSBCVEFfR0FUVENfU1RBVEVfRElTQUJMRUQpIHsKLSAgICBidGFfZ2F0dGNfZW5hYmxlKCk7Ci0gIH0KLSAgLyogdG9kbyBuZWVkIHRvIGNoZWNrIGR1cGxpY2F0ZSB1dWlkICovCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEJUQV9HQVRUQ19DTF9NQVg7IGkrKykgewotICAgIGlmICghYnRhX2dhdHRjX2NiLmNsX3JjYltpXS5pbl91c2UpIHsKLSAgICAgIGlmICgoYnRhX2dhdHRjX2NiLmNsX3JjYltpXS5jbGllbnRfaWYgPSBHQVRUX1JlZ2lzdGVyKAotICAgICAgICAgICAgICAgYXBwX3V1aWQsICJHYXR0Q2xpZW50IiwgJmJ0YV9nYXR0Y19jbF9jYmFjaywgZWF0dF9zdXBwcG9ydCkpID09Ci0gICAgICAgICAgMCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJSZWdpc3RlciB3aXRoIEdBVFQgc3RhY2sgZmFpbGVkLiI7Ci0gICAgICAgIHN0YXR1cyA9IEdBVFRfRVJST1I7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfZ2F0dGNfY2IuY2xfcmNiW2ldLmluX3VzZSA9IHRydWU7Ci0gICAgICAgIGJ0YV9nYXR0Y19jYi5jbF9yY2JbaV0ucF9jYmFjayA9IHBfY2JhY2s7Ci0gICAgICAgIGJ0YV9nYXR0Y19jYi5jbF9yY2JbaV0uYXBwX3V1aWQgPSBhcHBfdXVpZDsKLQotICAgICAgICAvKiBCVEEgdXNlIHRoZSBzYW1lIGNsaWVudCBpbnRlcmZhY2UgYXMgQlRFIEdBVFQgc3RhdGNrICovCi0gICAgICAgIGNsaWVudF9pZiA9IGJ0YV9nYXR0Y19jYi5jbF9yY2JbaV0uY2xpZW50X2lmOwotCi0gICAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRhX2dhdHRjX3N0YXJ0X2lmLCBjbGllbnRfaWYpKTsKLQotICAgICAgICBzdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghY2IuaXNfbnVsbCgpKSBjYi5SdW4oY2xpZW50X2lmLCBzdGF0dXMpOwotfQotCi0vKiogRGUtUmVnaXN0ZXIgYSBHQVRUIGNsaWVudCBhcHBsaWNhdGlvbiB3aXRoIEJUQSAqLwotdm9pZCBidGFfZ2F0dGNfZGVyZWdpc3Rlcih0QlRBX0dBVFRDX1JDQiogcF9jbHJlZykgewotICBpZiAoIXBfY2xyZWcpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IERlcmVnaXN0ZXIgRmFpbGVkIHVua25vd24gY2xpZW50IGNpZiI7Ci0gICAgYnRhX2hoX2NsZWFudXBfZGlzYWJsZShCVEFfSEhfT0spOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgYWNjZXB0X2xpc3Rfc2l6ZSA9IDA7Ci0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlKCkpIHsKLSAgICBhY2NlcHRfbGlzdF9zaXplID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfYWNjZXB0bGlzdF9zaXplKCk7Ci0gIH0KLQotICAvKiByZW1vdmUgYmcgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyByY2IgKi8KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgYWNjZXB0X2xpc3Rfc2l6ZTsgaSsrKSB7Ci0gICAgaWYgKCFidGFfZ2F0dGNfY2IuYmdfdHJhY2tbaV0uaW5fdXNlKSBjb250aW51ZTsKLQotICAgIGlmIChidGFfZ2F0dGNfY2IuYmdfdHJhY2tbaV0uY2lmX21hc2sgJiAoMSA8PCAocF9jbHJlZy0+Y2xpZW50X2lmIC0gMSkpKSB7Ci0gICAgICBidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfY2xyZWctPmNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2dhdHRjX2NiLmJnX3RyYWNrW2ldLnJlbW90ZV9iZGEsIGZhbHNlKTsKLSAgICAgIEdBVFRfQ2FuY2VsQ29ubmVjdChwX2NscmVnLT5jbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2dhdHRjX2NiLmJnX3RyYWNrW2ldLnJlbW90ZV9iZGEsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocF9jbHJlZy0+bnVtX2NsY2IgPT0gMCkgewotICAgIGJ0YV9nYXR0Y19kZXJlZ2lzdGVyX2NtcGwocF9jbHJlZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogY2xvc2UgYWxsIENMQ0IgcmVsYXRlZCB0byB0aGlzIGFwcCAqLwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBCVEFfR0FUVENfQ0xDQl9NQVg7IGkrKykgewotICAgIGlmICghYnRhX2dhdHRjX2NiLmNsY2JbaV0uaW5fdXNlIHx8IChidGFfZ2F0dGNfY2IuY2xjYltpXS5wX3JjYiAhPSBwX2NscmVnKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgcF9jbHJlZy0+ZGVyZWdfcGVuZGluZyA9IHRydWU7Ci0KLSAgICBCVF9IRFJfUklHSUQgYnVmOwotICAgIGJ1Zi5ldmVudCA9IEJUQV9HQVRUQ19BUElfQ0xPU0VfRVZUOwotICAgIGJ1Zi5sYXllcl9zcGVjaWZpYyA9IGJ0YV9nYXR0Y19jYi5jbGNiW2ldLmJ0YV9jb25uX2lkOwotICAgIGJ0YV9nYXR0Y19jbG9zZSgmYnRhX2dhdHRjX2NiLmNsY2JbaV0sICh0QlRBX0dBVFRDX0RBVEEqKSZidWYpOwotICB9Ci19Ci0KLS8qKiBwcm9jZXNzIGNvbm5lY3QgQVBJIHJlcXVlc3QgKi8KLXZvaWQgYnRhX2dhdHRjX3Byb2Nlc3NfYXBpX29wZW4oY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX21zZykgewotICB1aW50MTZfdCBldmVudCA9ICgoQlRfSERSX1JJR0lEKilwX21zZyktPmV2ZW50OwotCi0gIHRCVEFfR0FUVENfUkNCKiBwX2NscmVnID0gYnRhX2dhdHRjX2NsX2dldF9yZWdjYihwX21zZy0+YXBpX2Nvbm4uY2xpZW50X2lmKTsKLSAgaWYgKCFwX2NscmVnKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogRmFpbGVkLCB1bmtub3duIGNsaWVudF9pZj0iIDw8ICtwX21zZy0+YXBpX2Nvbm4uY2xpZW50X2lmOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghcF9tc2ctPmFwaV9jb25uLmlzX2RpcmVjdCkgewotICAgIGJ0YV9nYXR0Y19pbml0X2JrX2Nvbm4oJnBfbXNnLT5hcGlfY29ubiwgcF9jbHJlZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9hbGxvY19jbGNiKAotICAgICAgcF9tc2ctPmFwaV9jb25uLmNsaWVudF9pZiwgcF9tc2ctPmFwaV9jb25uLnJlbW90ZV9iZGEsCi0gICAgICBwX21zZy0+YXBpX2Nvbm4udHJhbnNwb3J0KTsKLSAgaWYgKHBfY2xjYiAhPSBOVUxMKSB7Ci0gICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBldmVudCwgcF9tc2cpOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgIk5vIHJlc291cmNlcyB0byBvcGVuIGEgbmV3IGNvbm5lY3Rpb24uIjsKLQotICAgIGJ0YV9nYXR0Y19zZW5kX29wZW5fY2JhY2socF9jbHJlZywgR0FUVF9OT19SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+YXBpX2Nvbm4ucmVtb3RlX2JkYSwgR0FUVF9JTlZBTElEX0NPTk5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+YXBpX2Nvbm4udHJhbnNwb3J0LCAwKTsKLSAgfQotfQotCi0vKiogcHJvY2VzcyBjb25uZWN0IEFQSSByZXF1ZXN0ICovCi12b2lkIGJ0YV9nYXR0Y19wcm9jZXNzX2FwaV9vcGVuX2NhbmNlbChjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfbXNnKSB7Ci0gIENIRUNLKHBfbXNnICE9IG51bGxwdHIpOwotCi0gIHVpbnQxNl90IGV2ZW50ID0gKChCVF9IRFJfUklHSUQqKXBfbXNnKS0+ZXZlbnQ7Ci0KLSAgaWYgKCFwX21zZy0+YXBpX2NhbmNlbF9jb25uLmlzX2RpcmVjdCkgewotICAgIExPR19ERUJVRygiQ2FuY2VsIEdBVFQgY2xpZW50IGJhY2tncm91bmQgY29ubmVjdGlvbiIpOwotICAgIGJ0YV9nYXR0Y19jYW5jZWxfYmtfY29ubigmcF9tc2ctPmFwaV9jYW5jZWxfY29ubik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPR19ERUJVRygiQ2FuY2VsIEdBVFQgY2xpZW50IGRpcmVjdCBjb25uZWN0aW9uIik7Ci0KLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2NpZigKLSAgICAgIHBfbXNnLT5hcGlfY2FuY2VsX2Nvbm4uY2xpZW50X2lmLCBwX21zZy0+YXBpX2NhbmNlbF9jb25uLnJlbW90ZV9iZGEsCi0gICAgICBCVF9UUkFOU1BPUlRfTEUpOwotICBpZiAocF9jbGNiICE9IE5VTEwpIHsKLSAgICBidGFfZ2F0dGNfc21fZXhlY3V0ZShwX2NsY2IsIGV2ZW50LCBwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HKEVSUk9SKSA8PCAiTm8gc3VjaCBjb25uZWN0aW9uIG5lZWQgdG8gYmUgY2FuY2VsbGVkIjsKLQotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJlZyA9Ci0gICAgICBidGFfZ2F0dGNfY2xfZ2V0X3JlZ2NiKHBfbXNnLT5hcGlfY2FuY2VsX2Nvbm4uY2xpZW50X2lmKTsKLQotICBpZiAocF9jbHJlZyAmJiBwX2NscmVnLT5wX2NiYWNrKSB7Ci0gICAgdEJUQV9HQVRUQyBjYl9kYXRhOwotICAgIGNiX2RhdGEuc3RhdHVzID0gR0FUVF9FUlJPUjsKLSAgICAoKnBfY2xyZWctPnBfY2JhY2spKEJUQV9HQVRUQ19DQU5DRUxfT1BFTl9FVlQsICZjYl9kYXRhKTsKLSAgfQotfQotCi0vKiogcHJvY2VzcyBlbmNyeXB0aW9uIGNvbXBsZXRlIG1lc3NhZ2UgKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19wcm9jZXNzX2VuY19jbXBsKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJlZyA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IoY2xpZW50X2lmKTsKLQotICBpZiAoIXBfY2xyZWcgfHwgIXBfY2xyZWctPnBfY2JhY2spIHJldHVybjsKLQotICB0QlRBX0dBVFRDIGNiX2RhdGE7Ci0gIG1lbXNldCgmY2JfZGF0YSwgMCwgc2l6ZW9mKHRCVEFfR0FUVEMpKTsKLQotICBjYl9kYXRhLmVuY19jbXBsLmNsaWVudF9pZiA9IGNsaWVudF9pZjsKLSAgY2JfZGF0YS5lbmNfY21wbC5yZW1vdGVfYmRhID0gYmRhOwotCi0gICgqcF9jbHJlZy0+cF9jYmFjaykoQlRBX0dBVFRDX0VOQ19DTVBMX0NCX0VWVCwgJmNiX2RhdGEpOwotfQotCi12b2lkIGJ0YV9nYXR0Y19jYW5jZWxfb3Blbl9lcnJvcih0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfR0FUVEMgY2JfZGF0YTsKLQotICBjYl9kYXRhLnN0YXR1cyA9IEdBVFRfRVJST1I7Ci0KLSAgaWYgKHBfY2xjYiAmJiBwX2NsY2ItPnBfcmNiICYmIHBfY2xjYi0+cF9yY2ItPnBfY2JhY2spCi0gICAgKCpwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVENfQ0FOQ0VMX09QRU5fRVZULCAmY2JfZGF0YSk7Ci19Ci0KLXZvaWQgYnRhX2dhdHRjX29wZW5fZXJyb3IodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIExPRyhFUlJPUikgPDwgIkNvbm5lY3Rpb24gYWxyZWFkeSBvcGVuZWQuIHdyb25nIHN0YXRlIjsKLQotICBidGFfZ2F0dGNfc2VuZF9vcGVuX2NiYWNrKHBfY2xjYi0+cF9yY2IsIEdBVFRfU1VDQ0VTUywgcF9jbGNiLT5iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbGNiLT5idGFfY29ubl9pZCwgcF9jbGNiLT50cmFuc3BvcnQsIDApOwotfQotCi12b2lkIGJ0YV9nYXR0Y19vcGVuX2ZhaWwodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IENhbm5vdCBlc3RhYmxpc2ggQ29ubmVjdGlvbi4gY29ubl9pZD0iCi0gICAgICAgICAgICAgICA8PCBsb2doZXgocF9jbGNiLT5idGFfY29ubl9pZCkgPDwgIi4gUmV0dXJuIEdBVFRfRVJST1IoIgotICAgICAgICAgICAgICAgPDwgK0dBVFRfRVJST1IgPDwgIikiOwotCi0gIGJ0YV9nYXR0Y19zZW5kX29wZW5fY2JhY2socF9jbGNiLT5wX3JjYiwgR0FUVF9FUlJPUiwgcF9jbGNiLT5iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbGNiLT5idGFfY29ubl9pZCwgcF9jbGNiLT50cmFuc3BvcnQsIDApOwotICAvKiBvcGVuIGZhaWx1cmUsIHJlbW92ZSBjbGNiICovCi0gIGJ0YV9nYXR0Y19jbGNiX2RlYWxsb2MocF9jbGNiKTsKLX0KLQotLyoqIFByb2Nlc3MgQVBJIGNvbm5lY3Rpb24gZnVuY3Rpb24gKi8KLXZvaWQgYnRhX2dhdHRjX29wZW4odEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfR0FUVENfREFUQSBnYXR0Y19kYXRhOwotCi0gIC8qIG9wZW4vaG9sZCBhIGNvbm5lY3Rpb24gKi8KLSAgaWYgKCFHQVRUX0Nvbm5lY3QocF9jbGNiLT5wX3JjYi0+Y2xpZW50X2lmLCBwX2RhdGEtPmFwaV9jb25uLnJlbW90ZV9iZGEsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX2Nvbm4udHJhbnNwb3J0LCBwX2RhdGEtPmFwaV9jb25uLm9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX2Nvbm4uaW5pdGlhdGluZ19waHlzKSkgewotICAgIExPRyhFUlJPUikgPDwgIkNvbm5lY3Rpb24gb3BlbiBmYWlsdXJlIjsKLQotICAgIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHBfY2xjYiwgQlRBX0dBVFRDX0lOVF9PUEVOX0ZBSUxfRVZULCBwX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIGEgY29ubmVjdGVkIHJlbW90ZSBkZXZpY2UgKi8KLSAgaWYgKEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQoCi0gICAgICAgICAgcF9jbGNiLT5wX3JjYi0+Y2xpZW50X2lmLCBwX2RhdGEtPmFwaV9jb25uLnJlbW90ZV9iZGEsCi0gICAgICAgICAgJnBfY2xjYi0+YnRhX2Nvbm5faWQsIHBfZGF0YS0+YXBpX2Nvbm4udHJhbnNwb3J0KSkgewotICAgIGdhdHRjX2RhdGEuaW50X2Nvbm4uaGRyLmxheWVyX3NwZWNpZmljID0gcF9jbGNiLT5idGFfY29ubl9pZDsKLQotICAgIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHBfY2xjYiwgQlRBX0dBVFRDX0lOVF9DT05OX0VWVCwgJmdhdHRjX2RhdGEpOwotICB9Ci0gIC8qIGVsc2Ugd2FpdCBmb3IgdGhlIGNhbGxiYWNrIGV2ZW50ICovCi19Ci0KLS8qKiBQcm9jZXNzIEFQSSBPcGVuIGZvciBhIGJhY2tncm91bmQgY29ubmVjdGlvbiAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2luaXRfYmtfY29ubihjb25zdCB0QlRBX0dBVFRDX0FQSV9PUEVOKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfUkNCKiBwX2NscmVnKSB7Ci0gIGlmICghYnRhX2dhdHRjX21hcmtfYmdfY29ubihwX2RhdGEtPmNsaWVudF9pZiwgcF9kYXRhLT5yZW1vdGVfYmRhLCB0cnVlKSkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBzcGFjZSBmb3IgYWNjZXB0bGlzdCBjb25uZWN0aW9uIG1hc2siKTsKLSAgICBidGFfZ2F0dGNfc2VuZF9vcGVuX2NiYWNrKHBfY2xyZWcsIEdBVFRfTk9fUkVTT1VSQ0VTLCBwX2RhdGEtPnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0lOVkFMSURfQ09OTl9JRCwgQlRfVFJBTlNQT1JUX0xFLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBhbHdheXMgY2FsbCBvcGVuIHRvIGhvbGQgYSBjb25uZWN0aW9uICovCi0gIGlmICghR0FUVF9Db25uZWN0KHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnJlbW90ZV9iZGEsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnRyYW5zcG9ydCwgZmFsc2UpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIiB1bmFibGUgdG8gY29ubmVjdCB0byByZW1vdGUgYmRfYWRkcj0iIDw8IHBfZGF0YS0+cmVtb3RlX2JkYTsKLSAgICBidGFfZ2F0dGNfc2VuZF9vcGVuX2NiYWNrKHBfY2xyZWcsIEdBVFRfRVJST1IsIHBfZGF0YS0+cmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfSU5WQUxJRF9DT05OX0lELCBCVF9UUkFOU1BPUlRfTEUsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIGlmICghR0FUVF9HZXRDb25uSWRJZkNvbm5lY3RlZChwX2RhdGEtPmNsaWVudF9pZiwgcF9kYXRhLT5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5faWQsIHBfZGF0YS0+dHJhbnNwb3J0KSkgewotICAgIExPR19XQVJOKCJOb3QgYSBjb25uZWN0ZWQgcmVtb3RlIGRldmljZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiID0gYnRhX2dhdHRjX2ZpbmRfYWxsb2NfY2xjYigKLSAgICAgIHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnJlbW90ZV9iZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmICghcF9jbGNiKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGNvbm5lY3Rpb24gbGluayBmb3IgZGV2aWNlOiVzIiwKLSAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9kYXRhLT5yZW1vdGVfYmRhKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9jbGNiLT5idGFfY29ubl9pZCA9IGNvbm5faWQ7Ci0gIHRCVEFfR0FUVENfREFUQSBnYXR0Y19kYXRhID0gewotICAgICAgLmhkciA9Ci0gICAgICAgICAgewotICAgICAgICAgICAgICAubGF5ZXJfc3BlY2lmaWMgPSBjb25uX2lkLAotICAgICAgICAgIH0sCi0gIH07Ci0KLSAgLyogb3BlbiBjb25uZWN0aW9uICovCi0gIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHBfY2xjYiwgQlRBX0dBVFRDX0lOVF9DT05OX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdEJUQV9HQVRUQ19EQVRBKj4oJmdhdHRjX2RhdGEpKTsKLX0KLQotLyoqIFByb2Nlc3MgQVBJIENhbmNlbCBPcGVuIGZvciBhIGJhY2tncm91bmQgY29ubmVjdGlvbiAqLwotdm9pZCBidGFfZ2F0dGNfY2FuY2VsX2JrX2Nvbm4oY29uc3QgdEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4qIHBfZGF0YSkgewotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJlZzsKLSAgdEJUQV9HQVRUQyBjYl9kYXRhOwotICBjYl9kYXRhLnN0YXR1cyA9IEdBVFRfRVJST1I7Ci0KLSAgLyogcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSB0aGUgYmcgY29ubmVjdGlvbiBtYXNrICovCi0gIGlmIChidGFfZ2F0dGNfbWFya19iZ19jb25uKHBfZGF0YS0+Y2xpZW50X2lmLCBwX2RhdGEtPnJlbW90ZV9iZGEsIGZhbHNlKSkgewotICAgIGlmIChHQVRUX0NhbmNlbENvbm5lY3QocF9kYXRhLT5jbGllbnRfaWYsIHBfZGF0YS0+cmVtb3RlX2JkYSwgZmFsc2UpKSB7Ci0gICAgICBjYl9kYXRhLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQiOwotICAgIH0KLSAgfQotICBwX2NscmVnID0gYnRhX2dhdHRjX2NsX2dldF9yZWdjYihwX2RhdGEtPmNsaWVudF9pZik7Ci0KLSAgaWYgKHBfY2xyZWcgJiYgcF9jbHJlZy0+cF9jYmFjaykgewotICAgICgqcF9jbHJlZy0+cF9jYmFjaykoQlRBX0dBVFRDX0NBTkNFTF9PUEVOX0VWVCwgJmNiX2RhdGEpOwotICB9Ci19Ci0KLXZvaWQgYnRhX2dhdHRjX2NhbmNlbF9vcGVuX29rKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUQyBjYl9kYXRhOwotCi0gIGlmIChwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKSB7Ci0gICAgY2JfZGF0YS5zdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0gICAgKCpwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVENfQ0FOQ0VMX09QRU5fRVZULCAmY2JfZGF0YSk7Ci0gIH0KLQotICBidGFfZ2F0dGNfY2xjYl9kZWFsbG9jKHBfY2xjYik7Ci19Ci0KLXZvaWQgYnRhX2dhdHRjX2NhbmNlbF9vcGVuKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUQyBjYl9kYXRhOwotCi0gIGlmIChHQVRUX0NhbmNlbENvbm5lY3QocF9jbGNiLT5wX3JjYi0+Y2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX2NhbmNlbF9jb25uLnJlbW90ZV9iZGEsIHRydWUpKSB7Ci0gICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBCVEFfR0FUVENfSU5UX0NBTkNFTF9PUEVOX09LX0VWVCwgcF9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAocF9jbGNiLT5wX3JjYi0+cF9jYmFjaykgewotICAgICAgY2JfZGF0YS5zdGF0dXMgPSBHQVRUX0VSUk9SOwotICAgICAgKCpwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVENfQ0FOQ0VMX09QRU5fRVZULCAmY2JfZGF0YSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKiByZWNlaXZlIGNvbm5lY3Rpb24gY2FsbGJhY2sgZnJvbSBzdGFjayAqLwotdm9pZCBidGFfZ2F0dGNfY29ubih0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2ZXIgY2FjaGUgc3RhdGU9IiA8PCArcF9jbGNiLT5wX3NyY2ItPnN0YXRlOwotCi0gIGlmIChwX2RhdGEgIT0gTlVMTCkgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZD0iIDw8IGxvZ2hleChwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcF9jbGNiLT5idGFfY29ubl9pZCA9IHBfZGF0YS0+aW50X2Nvbm4uaGRyLmxheWVyX3NwZWNpZmljOwotCi0gICAgR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMsICZnYXR0X2lmLCBwX2NsY2ItPmJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9jbGNiLT50cmFuc3BvcnQpOwotICB9Ci0KLSAgcF9jbGNiLT5wX3NyY2ItPmNvbm5lY3RlZCA9IHRydWU7Ci0KLSAgaWYgKHBfY2xjYi0+cF9zcmNiLT5tdHUgPT0gMCkgcF9jbGNiLT5wX3NyY2ItPm10dSA9IEdBVFRfREVGX0JMRV9NVFVfU0laRTsKLQotICAvKiBzdGFydCBkYXRhYmFzZSBjYWNoZSBpZiBuZWVkZWQgKi8KLSAgaWYgKHBfY2xjYi0+cF9zcmNiLT5nYXR0X2RhdGFiYXNlLklzRW1wdHkoKSB8fAotICAgICAgcF9jbGNiLT5wX3NyY2ItPnN0YXRlICE9IEJUQV9HQVRUQ19TRVJWX0lETEUpIHsKLSAgICBpZiAocF9jbGNiLT5wX3NyY2ItPnN0YXRlID09IEJUQV9HQVRUQ19TRVJWX0lETEUpIHsKLSAgICAgIHBfY2xjYi0+cF9zcmNiLT5zdGF0ZSA9IEJUQV9HQVRUQ19TRVJWX0xPQUQ7Ci0gICAgICBpZiAoYnRhX2dhdHRjX2NhY2hlX2xvYWQocF9jbGNiLT5wX3NyY2IpKSB7Ci0gICAgICAgIHBfY2xjYi0+cF9zcmNiLT5zdGF0ZSA9IEJUQV9HQVRUQ19TRVJWX0lETEU7Ci0gICAgICAgIGJ0YV9nYXR0Y19yZXNldF9kaXNjb3Zlcl9zdChwX2NsY2ItPnBfc3JjYiwgR0FUVF9TVUNDRVNTKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfY2xjYi0+cF9zcmNiLT5zdGF0ZSA9IEJUQV9HQVRUQ19TRVJWX0RJU0M7Ci0gICAgICAgIC8qIGNhY2hlIGxvYWQgZmFpbHVyZSwgc3RhcnQgZGlzY292ZXJ5ICovCi0gICAgICAgIGJ0YV9nYXR0Y19zdGFydF9kaXNjb3ZlcihwX2NsY2IsIE5VTEwpOwotICAgICAgfQotICAgIH0gZWxzZSAvKiBjYWNoZSBpcyBidWlsZGluZyAqLwotICAgICAgcF9jbGNiLT5zdGF0ZSA9IEJUQV9HQVRUQ19ESVNDT1ZFUl9TVDsKLSAgfQotCi0gIGVsc2UgewotICAgIC8qIGEgcGVuZGluZyBzZXJ2aWNlIGhhbmRsZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLwotICAgIGlmIChwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfY2hnKSB7Ci0gICAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfY2hnID0gZmFsc2U7Ci0KLSAgICAgIC8qIHNldCB0cnVlIHRvIHJlYWQgZGF0YWJhc2UgaGFzaCBiZWZvcmUgc2VydmljZSBkaXNjb3ZlcnkgKi8KLSAgICAgIGlmIChidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpKSB7Ci0gICAgICAgIHBfY2xjYi0+cF9zcmNiLT5zcnZjX2hkbF9kYl9oYXNoID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLyogc3RhcnQgZGlzY292ZXJ5ICovCi0gICAgICBidGFfZ2F0dGNfc21fZXhlY3V0ZShwX2NsY2IsIEJUQV9HQVRUQ19JTlRfRElTQ09WRVJfRVZULCBOVUxMKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocF9jbGNiLT5wX3JjYikgewotICAgIC8qIHRoZXJlIGlzIG5vIFJNIGZvciBHQVRUICovCi0gICAgaWYgKHBfY2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpCi0gICAgICBidGFfc3lzX2Nvbm5fb3BlbihCVEFfSURfR0FUVEMsIEJUQV9BTExfQVBQX0lELCBwX2NsY2ItPmJkYSk7Ci0KLSAgICBidGFfZ2F0dGNfc2VuZF9vcGVuX2NiYWNrKHBfY2xjYi0+cF9yY2IsIEdBVFRfU1VDQ0VTUywgcF9jbGNiLT5iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NsY2ItPmJ0YV9jb25uX2lkLCBwX2NsY2ItPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2xjYi0+cF9zcmNiLT5tdHUpOwotICB9Ci19Ci0KLS8qKiBjbG9zZSBhICBjb25uZWN0aW9uICovCi12b2lkIGJ0YV9nYXR0Y19jbG9zZV9mYWlsKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0dBVFRDIGNiX2RhdGE7Ci0KLSAgaWYgKHBfY2xjYi0+cF9yY2ItPnBfY2JhY2spIHsKLSAgICBtZW1zZXQoJmNiX2RhdGEsIDAsIHNpemVvZih0QlRBX0dBVFRDKSk7Ci0gICAgY2JfZGF0YS5jbG9zZS5jbGllbnRfaWYgPSBwX2NsY2ItPnBfcmNiLT5jbGllbnRfaWY7Ci0gICAgY2JfZGF0YS5jbG9zZS5jb25uX2lkID0gcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7Ci0gICAgY2JfZGF0YS5jbG9zZS5yZW1vdGVfYmRhID0gcF9jbGNiLT5iZGE7Ci0gICAgY2JfZGF0YS5jbG9zZS5yZWFzb24gPSBCVEFfR0FUVF9DT05OX05PTkU7Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZD0iIDw8IGxvZ2hleChjYl9kYXRhLmNsb3NlLmNvbm5faWQpCi0gICAgICAgICAgICAgICAgIDw8ICIuIFJldHVybnMgR0FUVF9FUlJPUigiIDw8ICtHQVRUX0VSUk9SIDw8ICIpLiI7Ci0KLSAgICAoKnBfY2xjYi0+cF9yY2ItPnBfY2JhY2spKEJUQV9HQVRUQ19DTE9TRV9FVlQsICZjYl9kYXRhKTsKLSAgfQotfQotCi0vKiogY2xvc2UgYSBHQVRUQyBjb25uZWN0aW9uICovCi12b2lkIGJ0YV9nYXR0Y19jbG9zZSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19DQkFDSyogcF9jYmFjayA9IHBfY2xjYi0+cF9yY2ItPnBfY2JhY2s7Ci0gIHRCVEFfR0FUVENfUkNCKiBwX2NscmVnID0gcF9jbGNiLT5wX3JjYjsKLSAgdEJUQV9HQVRUQyBjYl9kYXRhID0gewotICAgICAgLmNsb3NlID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5jbGllbnRfaWYgPSBwX2NsY2ItPnBfcmNiLT5jbGllbnRfaWYsCi0gICAgICAgICAgICAgIC5jb25uX2lkID0gcF9jbGNiLT5idGFfY29ubl9pZCwKLSAgICAgICAgICAgICAgLnJlYXNvbiA9IEdBVFRfQ09OTl9PSywKLSAgICAgICAgICAgICAgLnJlbW90ZV9iZGEgPSBwX2NsY2ItPmJkYSwKLSAgICAgICAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgICB9LAotICB9OwotCi0gIGlmIChwX2NsY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKQotICAgIGJ0YV9zeXNfY29ubl9jbG9zZShCVEFfSURfR0FUVEMsIEJUQV9BTExfQVBQX0lELCBwX2NsY2ItPmJkYSk7Ci0KLSAgYnRhX2dhdHRjX2NsY2JfZGVhbGxvYyhwX2NsY2IpOwotCi0gIGlmIChwX2RhdGEtPmhkci5ldmVudCA9PSBCVEFfR0FUVENfQVBJX0NMT1NFX0VWVCkgewotICAgIEdBVFRfRGlzY29ubmVjdChwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgTE9HX0RFQlVHKCJMb2NhbCBjbG9zZSBldmVudCBjbGllbnRfaWY6JWh1IGNvbm5faWQ6JWh1IHJlYXNvbjolcyIsCi0gICAgICAgICAgICAgIGNiX2RhdGEuY2xvc2UuY2xpZW50X2lmLCBjYl9kYXRhLmNsb3NlLmNvbm5faWQsCi0gICAgICAgICAgICAgIGdhdHRfZGlzY29ubmVjdGlvbl9yZWFzb25fdGV4dCgKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRHQVRUX0RJU0NPTk5fUkVBU09OPihjYl9kYXRhLmNsb3NlLnJlYXNvbikpCi0gICAgICAgICAgICAgICAgICAuY19zdHIoKSk7Ci0gIH0gZWxzZSBpZiAocF9kYXRhLT5oZHIuZXZlbnQgPT0gQlRBX0dBVFRDX0lOVF9ESVNDT05OX0VWVCkgewotICAgIGNiX2RhdGEuY2xvc2UucmVhc29uID0gcF9kYXRhLT5pbnRfY29ubi5yZWFzb247Ci0gICAgTE9HX0RFQlVHKCJQZWVyIGNsb3NlIGRpc2Nvbm5lY3QgZXZlbnQgY2xpZW50X2lmOiVodSBjb25uX2lkOiVodSByZWFzb246JXMiLAotICAgICAgICAgICAgICBjYl9kYXRhLmNsb3NlLmNsaWVudF9pZiwgY2JfZGF0YS5jbG9zZS5jb25uX2lkLAotICAgICAgICAgICAgICBnYXR0X2Rpc2Nvbm5lY3Rpb25fcmVhc29uX3RleHQoCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0R0FUVF9ESVNDT05OX1JFQVNPTj4oY2JfZGF0YS5jbG9zZS5yZWFzb24pKQotICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwotICB9Ci0KLSAgaWYgKHBfY2JhY2spICgqcF9jYmFjaykoQlRBX0dBVFRDX0NMT1NFX0VWVCwgJmNiX2RhdGEpOwotCi0gIGlmIChwX2NscmVnLT5udW1fY2xjYiA9PSAwICYmIHBfY2xyZWctPmRlcmVnX3BlbmRpbmcpIHsKLSAgICBidGFfZ2F0dGNfZGVyZWdpc3Rlcl9jbXBsKHBfY2xyZWcpOwotICB9Ci19Ci0KLS8qKiB3aGVuIGEgU1JDQiBmaW5pc2hlZCBkaXNjb3ZlcnksIHRlbGwgYWxsIHJlbGF0ZWQgY2xjYiAqLwotdm9pZCBidGFfZ2F0dGNfcmVzZXRfZGlzY292ZXJfc3QodEJUQV9HQVRUQ19TRVJWKiBwX3NyY2IsIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgQlRBX0dBVFRDX0NMQ0JfTUFYOyBpKyspIHsKLSAgICBpZiAoYnRhX2dhdHRjX2NiLmNsY2JbaV0ucF9zcmNiID09IHBfc3JjYikgewotICAgICAgYnRhX2dhdHRjX2NiLmNsY2JbaV0uc3RhdHVzID0gc3RhdHVzOwotICAgICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUoJmJ0YV9nYXR0Y19jYi5jbGNiW2ldLCBCVEFfR0FUVENfRElTQ09WRVJfQ01QTF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIGNsb3NlIGEgR0FUVEMgY29ubmVjdGlvbiB3aGlsZSBpbiBkaXNjb3Zlcnkgc3RhdGUgKi8KLXZvaWQgYnRhX2dhdHRjX2Rpc2NfY2xvc2UodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18KLSAgICAgICAgICA8PCAiOiBEaXNjb3ZlcnkgY2FuY2VsIGNvbm5faWQ9IiA8PCBsb2doZXgocF9jbGNiLT5idGFfY29ubl9pZCk7Ci0KLSAgaWYgKHBfY2xjYi0+ZGlzY19hY3RpdmUpCi0gICAgYnRhX2dhdHRjX3Jlc2V0X2Rpc2NvdmVyX3N0KHBfY2xjYi0+cF9zcmNiLCBHQVRUX0VSUk9SKTsKLSAgZWxzZQotICAgIHBfY2xjYi0+c3RhdGUgPSBCVEFfR0FUVENfQ09OTl9TVDsKLQotICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZ2V0cyBjYWxsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIEJUQV9HQVRUQ19BUElfQ0xPU0VfRVZUCi0gIC8vIHdoaWxlIGluIHRoZSBCVEFfR0FUVENfRElTQ09WRVJfU1Qgc3RhdGUuIE9uY2UgdGhlIHN0YXRlIGNoYW5nZXMsIHRoZQotICAvLyBjb25uZWN0aW9uIGl0c2VsZiBzdGlsbCBuZWVkcyB0byBiZSBjbG9zZWQgdG8gcmVzb2x2ZSB0aGUgb3JpZ2luYWwgZXZlbnQuCi0gIGlmIChwX2NsY2ItPnN0YXRlID09IEJUQV9HQVRUQ19DT05OX1NUKSB7Ci0gICAgVkxPRygxKSA8PCAiU3RhdGUgaXMgYmFjayB0byBCVEFfR0FUVENfQ09OTl9TVC4gVHJpZ2dlciBjb25uZWN0aW9uIGNsb3NlIjsKLSAgICBidGFfZ2F0dGNfY2xvc2UocF9jbGNiLCBwX2RhdGEpOwotICB9Ci19Ci0KLS8qKiB3aGVuIGEgU1JDQiBzdGFydCBkaXNjb3ZlcnksIHRlbGwgYWxsIHJlbGF0ZWQgY2xjYiBhbmQgc2V0IHRoZSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX3NldF9kaXNjb3Zlcl9zdCh0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYikgewotICB1aW50OF90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19DTENCX01BWDsgaSsrKSB7Ci0gICAgaWYgKGJ0YV9nYXR0Y19jYi5jbGNiW2ldLnBfc3JjYiA9PSBwX3NyY2IpIHsKLSAgICAgIGJ0YV9nYXR0Y19jYi5jbGNiW2ldLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICAgIGJ0YV9nYXR0Y19jYi5jbGNiW2ldLnN0YXRlID0gQlRBX0dBVFRDX0RJU0NPVkVSX1NUOwotICAgICAgYnRhX2dhdHRjX2NiLmNsY2JbaV0ucmVxdWVzdF9kdXJpbmdfZGlzY292ZXJ5ID0KLSAgICAgICAgICBCVEFfR0FUVENfRElTQ09WRVJfUkVRX05PTkU7Ci0gICAgfQotICB9Ci19Ci0KLS8qKiBwcm9jZXNzIHNlcnZpY2UgY2hhbmdlIGluIGRpc2NvdmVyeSBzdGF0ZSwgbWFyayB1cCB0aGUgYXV0byB1cGRhdGUgZmxhZyBhbmQKLSAqIHNldCBzdGF0dXMgdG8gYmUgZGlzY292ZXJ5IGNhbmNlbCBmb3IgY3VycmVudCBkaXNjb3ZlcnkuCi0gKi8KLXZvaWQgYnRhX2dhdHRjX3Jlc3RhcnRfZGlzY292ZXIodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIHBfY2xjYi0+c3RhdHVzID0gR0FUVF9DQU5DRUw7Ci0gIHBfY2xjYi0+YXV0b191cGRhdGUgPSBCVEFfR0FUVENfRElTQ19XQUlUSU5HOwotfQotCi0vKiogQ29uZmlndXJlIE1UVSBzaXplIG9uIHRoZSBHQVRUIGNvbm5lY3Rpb24gKi8KLXZvaWQgYnRhX2dhdHRjX2NmZ19tdHUodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIGlmICghYnRhX2dhdHRjX2VucXVldWUocF9jbGNiLCBwX2RhdGEpKSByZXR1cm47Ci0KLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9Ci0gICAgICBHQVRUQ19Db25maWd1cmVNVFUocF9jbGNiLT5idGFfY29ubl9pZCwgcF9kYXRhLT5hcGlfbXR1Lm10dSk7Ci0KLSAgLyogaWYgZmFpbGVkLCByZXR1cm4gY2FsbGJhY2sgaGVyZSAqLwotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gR0FUVF9DTURfU1RBUlRFRCkgewotICAgIC8qIERlcXVldWUgdGhlIGRhdGEsIGlmIGl0IHdhcyBlbnF1ZXVlZCAqLwotICAgIGlmIChwX2NsY2ItPnBfcV9jbWQgPT0gcF9kYXRhKSBwX2NsY2ItPnBfcV9jbWQgPSBOVUxMOwotCi0gICAgYnRhX2dhdHRjX2NtcGxfc2VuZG1zZyhwX2NsY2ItPmJ0YV9jb25uX2lkLCBHQVRUQ19PUFRZUEVfQ09ORklHLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfQotfQotCi12b2lkIGJ0YV9nYXR0Y19zdGFydF9kaXNjb3Zlcl9pbnRlcm5hbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYikgewotICBpZiAocF9jbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKQotICAgIEwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyhwX2NsY2ItPnBfc3JjYi0+c2VydmVyX2JkYSwgZmFsc2UpOwotCi0gIGJ0YV9nYXR0Y19pbml0X2NhY2hlKHBfY2xjYi0+cF9zcmNiKTsKLSAgcF9jbGNiLT5zdGF0dXMgPSBidGFfZ2F0dGNfZGlzY292ZXJfcHJpX3NlcnZpY2UoCi0gICAgICBwX2NsY2ItPmJ0YV9jb25uX2lkLCBwX2NsY2ItPnBfc3JjYiwgR0FUVF9ESVNDX1NSVkNfQUxMKTsKLSAgaWYgKHBfY2xjYi0+c3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgImRpc2NvdmVyeSBvbiBzZXJ2ZXIgZmFpbGVkIjsKLSAgICBidGFfZ2F0dGNfcmVzZXRfZGlzY292ZXJfc3QocF9jbGNiLT5wX3NyY2IsIHBfY2xjYi0+c3RhdHVzKTsKLSAgfSBlbHNlCi0gICAgcF9jbGNiLT5kaXNjX2FjdGl2ZSA9IHRydWU7Ci19Ci0KLS8qKiBTdGFydCBhIGRpc2NvdmVyeSBvbiBzZXJ2ZXIgKi8KLXZvaWQgYnRhX2dhdHRjX3N0YXJ0X2Rpc2NvdmVyKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkOiIgPDwgbG9naGV4KHBfY2xjYi0+YnRhX2Nvbm5faWQpCi0gICAgICAgICAgPDwgIiBwX2NsY2ItPnBfc3JjYi0+c3RhdGU6IiA8PCArcF9jbGNiLT5wX3NyY2ItPnN0YXRlOwotCi0gIGlmICgoKHBfY2xjYi0+cF9xX2NtZCA9PSBOVUxMIHx8Ci0gICAgICAgIHBfY2xjYi0+YXV0b191cGRhdGUgPT0gQlRBX0dBVFRDX1JFUV9XQUlUSU5HKSAmJgotICAgICAgIHBfY2xjYi0+cF9zcmNiLT5zdGF0ZSA9PSBCVEFfR0FUVENfU0VSVl9JRExFKSB8fAotICAgICAgcF9jbGNiLT5wX3NyY2ItPnN0YXRlID09IEJUQV9HQVRUQ19TRVJWX0RJU0MpCi0gIC8qIG5vIHBlbmRpbmcgb3BlcmF0aW9uLCBzdGFydCBkaXNjb3ZlcnkgcmlnaHQgYXdheSAqLwotICB7Ci0gICAgcF9jbGNiLT5hdXRvX3VwZGF0ZSA9IEJUQV9HQVRUQ19OT19TQ0hFRFVMRTsKLQotICAgIGlmIChwX2NsY2ItPnBfc3JjYiAhPSBOVUxMKSB7Ci0gICAgICAvKiBzZXQgYWxsIHNyY2IgcmVsYXRlZCBjbGNiIGludG8gZGlzY292ZXJ5IFNUICovCi0gICAgICBidGFfZ2F0dGNfc2V0X2Rpc2NvdmVyX3N0KHBfY2xjYi0+cF9zcmNiKTsKLQotICAgICAgLyogY2xlYXIgdGhlIHNlcnZpY2UgY2hhbmdlIG1hc2sgKi8KLSAgICAgIHBfY2xjYi0+cF9zcmNiLT5zcnZjX2hkbF9jaGcgPSBmYWxzZTsKLSAgICAgIHBfY2xjYi0+cF9zcmNiLT51cGRhdGVfY291bnQgPSAwOwotICAgICAgcF9jbGNiLT5wX3NyY2ItPnN0YXRlID0gQlRBX0dBVFRDX1NFUlZfRElTQ19BQ1Q7Ci0KLSAgICAgIC8qIHJlYWQgZGIgaGFzaCBpZiBkYiBoYXNoIGNoYXJhY3RlcmlzdGljIGV4aXN0cyAqLwotICAgICAgaWYgKGJ0YV9nYXR0Y19pc19yb2J1c3RfY2FjaGluZ19lbmFibGVkKCkgJiYKLSAgICAgICAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfZGJfaGFzaCAmJiBidGFfZ2F0dGNfcmVhZF9kYl9oYXNoKHBfY2xjYikpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICA8PCAiOiBwZW5kaW5nIHNlcnZpY2UgZGlzY292ZXJ5LCByZWFkIGRiIGhhc2ggZmlyc3QiOwotICAgICAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfZGJfaGFzaCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGJ0YV9nYXR0Y19zdGFydF9kaXNjb3Zlcl9pbnRlcm5hbChwX2NsY2IpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJ1bmtub3duIGRldmljZSwgY2FuIG5vdCBzdGFydCBkaXNjb3ZlcnkiOwotICAgIH0KLSAgfQotICAvKiBwZW5kaW5nIG9wZXJhdGlvbiwgd2FpdCB1bnRpbCBpdCBmaW5pc2hlcyAqLwotICBlbHNlIHsKLSAgICBwX2NsY2ItPmF1dG9fdXBkYXRlID0gQlRBX0dBVFRDX0RJU0NfV0FJVElORzsKLQotICAgIGlmIChwX2NsY2ItPnBfc3JjYi0+c3RhdGUgPT0gQlRBX0dBVFRDX1NFUlZfSURMRSkKLSAgICAgIHBfY2xjYi0+c3RhdGUgPSBCVEFfR0FUVENfQ09OTl9TVDsgLyogc2V0IGNsY2Igc3RhdGUgKi8KLSAgfQotfQotCi0vKiogZGlzY292ZXJ5IG9uIHNlcnZlciBpcyBmaW5pc2hlZCAqLwotdm9pZCBidGFfZ2F0dGNfZGlzY19jbXBsKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9xX2NtZCA9IHBfY2xjYi0+cF9xX2NtZDsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGNvbm5faWQ9IiA8PCBsb2doZXgocF9jbGNiLT5idGFfY29ubl9pZCk7Ci0KLSAgaWYgKHBfY2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkKLSAgICBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMocF9jbGNiLT5wX3NyY2ItPnNlcnZlcl9iZGEsIHRydWUpOwotICBwX2NsY2ItPnBfc3JjYi0+c3RhdGUgPSBCVEFfR0FUVENfU0VSVl9JRExFOwotICBwX2NsY2ItPmRpc2NfYWN0aXZlID0gZmFsc2U7Ci0KLSAgaWYgKHBfY2xjYi0+c3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIC8qIGNsZWFuIHVwIGNhY2hlICovCi0gICAgaWYgKHBfY2xjYi0+cF9zcmNiKSB7Ci0gICAgICBwX2NsY2ItPnBfc3JjYi0+Z2F0dF9kYXRhYmFzZS5DbGVhcigpOwotICAgIH0KLQotICAgIC8qIHVzZWQgdG8gcmVzZXQgY2FjaGUgaW4gYXBwbGljYXRpb24gKi8KLSAgICBidGFfZ2F0dGNfY2FjaGVfcmVzZXQocF9jbGNiLT5wX3NyY2ItPnNlcnZlcl9iZGEpOwotICB9Ci0KLSAgaWYgKHBfY2xjYi0+cF9zcmNiKSB7Ci0gICAgcF9jbGNiLT5wX3NyY2ItPnBlbmRpbmdfZGlzY292ZXJ5LkNsZWFyKCk7Ci0gIH0KLQotICBpZiAocF9jbGNiLT5hdXRvX3VwZGF0ZSA9PSBCVEFfR0FUVENfRElTQ19XQUlUSU5HKSB7Ci0gICAgLyogc3RhcnQgZGlzY292ZXJ5IGFnYWluICovCi0gICAgcF9jbGNiLT5hdXRvX3VwZGF0ZSA9IEJUQV9HQVRUQ19SRVFfV0FJVElORzsKLSAgICBidGFfZ2F0dGNfc21fZXhlY3V0ZShwX2NsY2IsIEJUQV9HQVRUQ19JTlRfRElTQ09WRVJfRVZULCBOVUxMKTsKLSAgfQotICAvKiBnZXQgYW55IHF1ZXVlZCBjb21tYW5kIHRvIHByb2NlZWQgKi8KLSAgZWxzZSBpZiAocF9xX2NtZCAhPSBOVUxMKSB7Ci0gICAgcF9jbGNiLT5wX3FfY21kID0gTlVMTDsKLSAgICAvKiBleGVjdXRlIHBlbmRpbmcgb3BlcmF0aW9uIG9mIGxpbmsgYmxvY2sgc3RpbGwgcHJlc2VudCAqLwotICAgIGlmIChMMkNBX0lzTGlua0VzdGFibGlzaGVkKHBfY2xjYi0+cF9zcmNiLT5zZXJ2ZXJfYmRhLCBwX2NsY2ItPnRyYW5zcG9ydCkpIHsKLSAgICAgIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHBfY2xjYiwgcF9xX2NtZC0+aGRyLmV2ZW50LCBwX3FfY21kKTsKLSAgICB9Ci0gICAgLyogaWYgdGhlIGNvbW1hbmQgZXhlY3V0ZWQgcmVxdWV1ZWQgdGhlIGNtZCwgd2UgZG9uJ3QKLSAgICAgKiB3YW50IHRvIGZyZWUgdGhlIHVuZGVybHlpbmcgYnVmZmVyIHRoYXQncyBiZWluZwotICAgICAqIHJlZmVyZW5jZWQgYnkgcF9jbGNiLT5wX3FfY21kCi0gICAgICovCi0gICAgaWYgKHBfcV9jbWQgIT0gcF9jbGNiLT5wX3FfY21kKSBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9xX2NtZCk7Ci0gIH0KLQotICBpZiAocF9jbGNiLT5wX3JjYi0+cF9jYmFjaykgewotICAgIHRCVEFfR0FUVEMgYnRhX2dhdHRjOwotICAgIGJ0YV9nYXR0Yy5yZW1vdGVfYmRhID0gcF9jbGNiLT5wX3NyY2ItPnNlcnZlcl9iZGE7Ci0gICAgKCpwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVENfU1JWQ19ESVNDX0RPTkVfRVZULCAmYnRhX2dhdHRjKTsKLSAgfQotfQotCi0vKiogUmVhZCBhbiBhdHRyaWJ1dGUgKi8KLXZvaWQgYnRhX2dhdHRjX3JlYWQodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIGlmICghYnRhX2dhdHRjX2VucXVldWUocF9jbGNiLCBwX2RhdGEpKSByZXR1cm47Ci0KLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgaWYgKHBfZGF0YS0+YXBpX3JlYWQuaGFuZGxlICE9IDApIHsKLSAgICB0R0FUVF9SRUFEX1BBUkFNIHJlYWRfcGFyYW07Ci0gICAgbWVtc2V0KCZyZWFkX3BhcmFtLCAwLCBzaXplb2YodEdBVFRfUkVBRF9QQVJBTSkpOwotICAgIHJlYWRfcGFyYW0uYnlfaGFuZGxlLmhhbmRsZSA9IHBfZGF0YS0+YXBpX3JlYWQuaGFuZGxlOwotICAgIHJlYWRfcGFyYW0uYnlfaGFuZGxlLmF1dGhfcmVxID0gcF9kYXRhLT5hcGlfcmVhZC5hdXRoX3JlcTsKLSAgICBzdGF0dXMgPSBHQVRUQ19SZWFkKHBfY2xjYi0+YnRhX2Nvbm5faWQsIEdBVFRfUkVBRF9CWV9IQU5ETEUsICZyZWFkX3BhcmFtKTsKLSAgfSBlbHNlIHsKLSAgICB0R0FUVF9SRUFEX1BBUkFNIHJlYWRfcGFyYW07Ci0gICAgbWVtc2V0KCZyZWFkX3BhcmFtLCAwLCBzaXplb2YodEdBVFRfUkVBRF9CWV9UWVBFKSk7Ci0KLSAgICByZWFkX3BhcmFtLmNoYXJfdHlwZS5zX2hhbmRsZSA9IHBfZGF0YS0+YXBpX3JlYWQuc19oYW5kbGU7Ci0gICAgcmVhZF9wYXJhbS5jaGFyX3R5cGUuZV9oYW5kbGUgPSBwX2RhdGEtPmFwaV9yZWFkLmVfaGFuZGxlOwotICAgIHJlYWRfcGFyYW0uY2hhcl90eXBlLnV1aWQgPSBwX2RhdGEtPmFwaV9yZWFkLnV1aWQ7Ci0gICAgcmVhZF9wYXJhbS5jaGFyX3R5cGUuYXV0aF9yZXEgPSBwX2RhdGEtPmFwaV9yZWFkLmF1dGhfcmVxOwotICAgIHN0YXR1cyA9IEdBVFRDX1JlYWQocF9jbGNiLT5idGFfY29ubl9pZCwgR0FUVF9SRUFEX0JZX1RZUEUsICZyZWFkX3BhcmFtKTsKLSAgfQotCi0gIC8qIHJlYWQgZmFpbCAqLwotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIC8qIERlcXVldWUgdGhlIGRhdGEsIGlmIGl0IHdhcyBlbnF1ZXVlZCAqLwotICAgIGlmIChwX2NsY2ItPnBfcV9jbWQgPT0gcF9kYXRhKSBwX2NsY2ItPnBfcV9jbWQgPSBOVUxMOwotCi0gICAgYnRhX2dhdHRjX2NtcGxfc2VuZG1zZyhwX2NsY2ItPmJ0YV9jb25uX2lkLCBHQVRUQ19PUFRZUEVfUkVBRCwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIH0KLX0KLQotLyoqIHJlYWQgbXVsdGlwbGUgKi8KLXZvaWQgYnRhX2dhdHRjX3JlYWRfbXVsdGkodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIGlmICghYnRhX2dhdHRjX2VucXVldWUocF9jbGNiLCBwX2RhdGEpKSByZXR1cm47Ci0KLSAgdEdBVFRfUkVBRF9QQVJBTSByZWFkX3BhcmFtOwotICBtZW1zZXQoJnJlYWRfcGFyYW0sIDAsIHNpemVvZih0R0FUVF9SRUFEX1BBUkFNKSk7Ci0KLSAgcmVhZF9wYXJhbS5yZWFkX211bHRpcGxlLm51bV9oYW5kbGVzID0gcF9kYXRhLT5hcGlfcmVhZF9tdWx0aS5udW1fYXR0cjsKLSAgcmVhZF9wYXJhbS5yZWFkX211bHRpcGxlLmF1dGhfcmVxID0gcF9kYXRhLT5hcGlfcmVhZF9tdWx0aS5hdXRoX3JlcTsKLSAgbWVtY3B5KCZyZWFkX3BhcmFtLnJlYWRfbXVsdGlwbGUuaGFuZGxlcywgcF9kYXRhLT5hcGlfcmVhZF9tdWx0aS5oYW5kbGVzLAotICAgICAgICAgc2l6ZW9mKHVpbnQxNl90KSAqIHBfZGF0YS0+YXBpX3JlYWRfbXVsdGkubnVtX2F0dHIpOwotCi0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPQotICAgICAgR0FUVENfUmVhZChwX2NsY2ItPmJ0YV9jb25uX2lkLCBHQVRUX1JFQURfTVVMVElQTEUsICZyZWFkX3BhcmFtKTsKLSAgLyogcmVhZCBmYWlsICovCi0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgLyogRGVxdWV1ZSB0aGUgZGF0YSwgaWYgaXQgd2FzIGVucXVldWVkICovCi0gICAgaWYgKHBfY2xjYi0+cF9xX2NtZCA9PSBwX2RhdGEpIHBfY2xjYi0+cF9xX2NtZCA9IE5VTEw7Ci0KLSAgICBidGFfZ2F0dGNfY21wbF9zZW5kbXNnKHBfY2xjYi0+YnRhX2Nvbm5faWQsIEdBVFRDX09QVFlQRV9SRUFELCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfQotfQotCi0vKiogV3JpdGUgYW4gYXR0cmlidXRlICovCi12b2lkIGJ0YV9nYXR0Y193cml0ZSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgaWYgKCFidGFfZ2F0dGNfZW5xdWV1ZShwX2NsY2IsIHBfZGF0YSkpIHJldHVybjsKLQotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotICB0R0FUVF9WQUxVRSBhdHRyOwotCi0gIGF0dHIuY29ubl9pZCA9IHBfY2xjYi0+YnRhX2Nvbm5faWQ7Ci0gIGF0dHIuaGFuZGxlID0gcF9kYXRhLT5hcGlfd3JpdGUuaGFuZGxlOwotICBhdHRyLm9mZnNldCA9IHBfZGF0YS0+YXBpX3dyaXRlLm9mZnNldDsKLSAgYXR0ci5sZW4gPSBwX2RhdGEtPmFwaV93cml0ZS5sZW47Ci0gIGF0dHIuYXV0aF9yZXEgPSBwX2RhdGEtPmFwaV93cml0ZS5hdXRoX3JlcTsKLQotICBpZiAocF9kYXRhLT5hcGlfd3JpdGUucF92YWx1ZSkKLSAgICBtZW1jcHkoYXR0ci52YWx1ZSwgcF9kYXRhLT5hcGlfd3JpdGUucF92YWx1ZSwgcF9kYXRhLT5hcGlfd3JpdGUubGVuKTsKLQotICBzdGF0dXMgPQotICAgICAgR0FUVENfV3JpdGUocF9jbGNiLT5idGFfY29ubl9pZCwgcF9kYXRhLT5hcGlfd3JpdGUud3JpdGVfdHlwZSwgJmF0dHIpOwotCi0gIC8qIHdyaXRlIGZhaWwgKi8KLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAvKiBEZXF1ZXVlIHRoZSBkYXRhLCBpZiBpdCB3YXMgZW5xdWV1ZWQgKi8KLSAgICBpZiAocF9jbGNiLT5wX3FfY21kID09IHBfZGF0YSkgcF9jbGNiLT5wX3FfY21kID0gTlVMTDsKLQotICAgIGJ0YV9nYXR0Y19jbXBsX3NlbmRtc2cocF9jbGNiLT5idGFfY29ubl9pZCwgR0FUVENfT1BUWVBFX1dSSVRFLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfQotfQotCi0vKiogc2VuZCBleGVjdXRlIHdyaXRlICovCi12b2lkIGJ0YV9nYXR0Y19leGVjdXRlKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLCBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSkgewotICBpZiAoIWJ0YV9nYXR0Y19lbnF1ZXVlKHBfY2xjYiwgcF9kYXRhKSkgcmV0dXJuOwotCi0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPQotICAgICAgR0FUVENfRXhlY3V0ZVdyaXRlKHBfY2xjYi0+YnRhX2Nvbm5faWQsIHBfZGF0YS0+YXBpX2V4ZWMuaXNfZXhlY3V0ZSk7Ci0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgLyogRGVxdWV1ZSB0aGUgZGF0YSwgaWYgaXQgd2FzIGVucXVldWVkICovCi0gICAgaWYgKHBfY2xjYi0+cF9xX2NtZCA9PSBwX2RhdGEpIHBfY2xjYi0+cF9xX2NtZCA9IE5VTEw7Ci0KLSAgICBidGFfZ2F0dGNfY21wbF9zZW5kbXNnKHBfY2xjYi0+YnRhX2Nvbm5faWQsIEdBVFRDX09QVFlQRV9FWEVfV1JJVEUsIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICB9Ci19Ci0KLS8qKiBzZW5kIGhhbmRsZSB2YWx1ZSBjb25maXJtYXRpb24gKi8KLXZvaWQgYnRhX2dhdHRjX2NvbmZpcm0odEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IGNpZCA9IHBfZGF0YS0+YXBpX2NvbmZpcm0uY2lkOwotCi0gIGlmIChHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtKHBfZGF0YS0+YXBpX2NvbmZpcm0uaGRyLmxheWVyX3NwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQpICE9IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdG8gY2lkPSIgPDwgbG9naGV4KGNpZCkgPDwgIiBmYWlsZWQiOwotICB9IGVsc2UgewotICAgIC8qIGlmIG92ZXIgQlJfRURSLCBpbmZvcm0gUE0gZm9yIG1vZGUgY2hhbmdlICovCi0gICAgaWYgKHBfY2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICAgIGJ0YV9zeXNfYnVzeShCVEFfSURfR0FUVEMsIEJUQV9BTExfQVBQX0lELCBwX2NsY2ItPmJkYSk7Ci0gICAgICBidGFfc3lzX2lkbGUoQlRBX0lEX0dBVFRDLCBCVEFfQUxMX0FQUF9JRCwgcF9jbGNiLT5iZGEpOwotICAgIH0KLSAgfQotfQotCi0vKiogcmVhZCBjb21wbGV0ZSAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX3JlYWRfY21wbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19PUF9DTVBMKiBwX2RhdGEpIHsKLSAgR0FUVF9SRUFEX09QX0NCIGNiID0gcF9jbGNiLT5wX3FfY21kLT5hcGlfcmVhZC5yZWFkX2NiOwotICB2b2lkKiBteV9jYl9kYXRhID0gcF9jbGNiLT5wX3FfY21kLT5hcGlfcmVhZC5yZWFkX2NiX2RhdGE7Ci0KLSAgLyogaWYgaXQgd2FzIHJlYWQgYnkgaGFuZGxlLCByZXR1cm4gdGhlIGhhbmRsZSByZXF1ZXN0ZWQsIGlmIHJlYWQgYnkgVVVJRCwgdXNlCi0gICAqIGhhbmRsZSByZXR1cm5lZCBmcm9tIHJlbW90ZQotICAgKi8KLSAgdWludDE2X3QgaGFuZGxlID0gcF9jbGNiLT5wX3FfY21kLT5hcGlfcmVhZC5oYW5kbGU7Ci0gIGlmIChoYW5kbGUgPT0gMCkgaGFuZGxlID0gcF9kYXRhLT5wX2NtcGwtPmF0dF92YWx1ZS5oYW5kbGU7Ci0KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfY2xjYi0+cF9xX2NtZCk7Ci0KLSAgaWYgKGNiKSB7Ci0gICAgY2IocF9jbGNiLT5idGFfY29ubl9pZCwgcF9kYXRhLT5zdGF0dXMsIGhhbmRsZSwKLSAgICAgICBwX2RhdGEtPnBfY21wbC0+YXR0X3ZhbHVlLmxlbiwgcF9kYXRhLT5wX2NtcGwtPmF0dF92YWx1ZS52YWx1ZSwKLSAgICAgICBteV9jYl9kYXRhKTsKLSAgfQotfQotCi0vKiogd3JpdGUgY29tcGxldGUgKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y193cml0ZV9jbXBsKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19PUF9DTVBMKiBwX2RhdGEpIHsKLSAgR0FUVF9XUklURV9PUF9DQiBjYiA9IHBfY2xjYi0+cF9xX2NtZC0+YXBpX3dyaXRlLndyaXRlX2NiOwotICB2b2lkKiBteV9jYl9kYXRhID0gcF9jbGNiLT5wX3FfY21kLT5hcGlfd3JpdGUud3JpdGVfY2JfZGF0YTsKLQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jbGNiLT5wX3FfY21kKTsKLQotICBpZiAoY2IpIHsKLSAgICBjYihwX2NsY2ItPmJ0YV9jb25uX2lkLCBwX2RhdGEtPnN0YXR1cywgcF9kYXRhLT5wX2NtcGwtPmF0dF92YWx1ZS5oYW5kbGUsCi0gICAgICAgcF9kYXRhLT5wX2NtcGwtPmF0dF92YWx1ZS5sZW4sIHBfZGF0YS0+cF9jbXBsLT5hdHRfdmFsdWUudmFsdWUsCi0gICAgICAgbXlfY2JfZGF0YSk7Ci0gIH0KLX0KLQotLyoqIGV4ZWN1dGUgd3JpdGUgY29tcGxldGUgKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19leGVjX2NtcGwodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfT1BfQ01QTCogcF9kYXRhKSB7Ci0gIHRCVEFfR0FUVEMgY2JfZGF0YTsKLQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jbGNiLT5wX3FfY21kKTsKLSAgcF9jbGNiLT5zdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0KLSAgLyogZXhlY3V0ZSBjb21wbGV0ZSwgY2FsbGJhY2sgKi8KLSAgY2JfZGF0YS5leGVjX2NtcGwuY29ubl9pZCA9IHBfY2xjYi0+YnRhX2Nvbm5faWQ7Ci0gIGNiX2RhdGEuZXhlY19jbXBsLnN0YXR1cyA9IHBfZGF0YS0+c3RhdHVzOwotCi0gICgqcF9jbGNiLT5wX3JjYi0+cF9jYmFjaykoQlRBX0dBVFRDX0VYRUNfRVZULCAmY2JfZGF0YSk7Ci19Ci0KLS8qKiBjb25maWd1cmUgTVRVIG9wZXJhdGlvbiBjb21wbGV0ZSAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NmZ19tdHVfY21wbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19PUF9DTVBMKiBwX2RhdGEpIHsKLSAgR0FUVF9DT05GSUdVUkVfTVRVX09QX0NCIGNiID0gcF9jbGNiLT5wX3FfY21kLT5hcGlfbXR1Lm10dV9jYjsKLSAgdm9pZCogbXlfY2JfZGF0YSA9IHBfY2xjYi0+cF9xX2NtZC0+YXBpX210dS5tdHVfY2JfZGF0YTsKLSAgdEJUQV9HQVRUQyBjYl9kYXRhOwotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2NsY2ItPnBfcV9jbWQpOwotCi0gIGlmIChwX2RhdGEtPnBfY21wbCAmJiBwX2RhdGEtPnN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpCi0gICAgcF9jbGNiLT5wX3NyY2ItPm10dSA9IHBfZGF0YS0+cF9jbXBsLT5tdHU7Ci0KLSAgLyogY29uZmlndXJlIE1UVSBjb21wbGV0ZSwgY2FsbGJhY2sgKi8KLSAgcF9jbGNiLT5zdGF0dXMgPSBwX2RhdGEtPnN0YXR1czsKLSAgY2JfZGF0YS5jZmdfbXR1LmNvbm5faWQgPSBwX2NsY2ItPmJ0YV9jb25uX2lkOwotICBjYl9kYXRhLmNmZ19tdHUuc3RhdHVzID0gcF9kYXRhLT5zdGF0dXM7Ci0gIGNiX2RhdGEuY2ZnX210dS5tdHUgPSBwX2NsY2ItPnBfc3JjYi0+bXR1OwotCi0gIGlmIChjYikgewotICAgIGNiKHBfY2xjYi0+YnRhX2Nvbm5faWQsIHBfZGF0YS0+c3RhdHVzLCBteV9jYl9kYXRhKTsKLSAgfQotCi0gICgqcF9jbGNiLT5wX3JjYi0+cF9jYmFjaykoQlRBX0dBVFRDX0NGR19NVFVfRVZULCAmY2JfZGF0YSk7Ci19Ci0KLS8qKiBvcGVyYXRpb24gY29tcGxldGVkICovCi12b2lkIGJ0YV9nYXR0Y19vcF9jbXBsKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLCBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSkgewotICBpZiAocF9jbGNiLT5wX3FfY21kID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIk5vIHBlbmRpbmcgY29tbWFuZCBnYXR0IGNsaWVudCBjb21tYW5kIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgdEdBVFRDX09QVFlQRSBvcCA9IHBfZGF0YS0+b3BfY21wbC5vcF9jb2RlOwotICBzd2l0Y2ggKG9wKSB7Ci0gICAgY2FzZSBHQVRUQ19PUFRZUEVfUkVBRDoKLSAgICBjYXNlIEdBVFRDX09QVFlQRV9XUklURToKLSAgICBjYXNlIEdBVFRDX09QVFlQRV9FWEVfV1JJVEU6Ci0gICAgY2FzZSBHQVRUQ19PUFRZUEVfQ09ORklHOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRDX09QVFlQRV9OT05FOgotICAgIGNhc2UgR0FUVENfT1BUWVBFX0RJU0NPVkVSWToKLSAgICBjYXNlIEdBVFRDX09QVFlQRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTjoKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCAidW5leHBlY3RlZCBvcGVyYXRpb24sIGlnbm9yZWQiOwotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfY2xjYi0+cF9xX2NtZC0+aGRyLmV2ZW50ICE9Ci0gICAgICBidGFfZ2F0dGNfb3Bjb2RlX3RvX2ludF9ldnRbb3AgLSBHQVRUQ19PUFRZUEVfUkVBRF0pIHsKLSAgICB1aW50OF90IG1hcHBlZF9vcCA9Ci0gICAgICAgIHBfY2xjYi0+cF9xX2NtZC0+aGRyLmV2ZW50IC0gQlRBX0dBVFRDX0FQSV9SRUFEX0VWVCArIEdBVFRDX09QVFlQRV9SRUFEOwotICAgIGlmIChtYXBwZWRfb3AgPiBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTikgbWFwcGVkX29wID0gMDsKLQotICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAiZXhwZWN0IG9wOiglcyA6MHglMDR4KSwgcmVjZWl2ZSB1bmV4cGVjdGVkIG9wZXJhdGlvbiAoJXMpLiIsCi0gICAgICAgIGJ0YV9nYXR0Y19vcF9jb2RlX25hbWVbbWFwcGVkX29wXSwgcF9jbGNiLT5wX3FfY21kLT5oZHIuZXZlbnQsCi0gICAgICAgIGJ0YV9nYXR0Y19vcF9jb2RlX25hbWVbb3BdKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBFeGNlcHQgZm9yIE1UVSBjb25maWd1cmF0aW9uLCBkaXNjYXJkIHJlc3BvbnNlcyBpZiBzZXJ2aWNlIGNoYW5nZQotICAgKiBpbmRpY2F0aW9uIGlzIHJlY2VpdmVkIGJlZm9yZSBvcGVyYXRpb24gY29tcGxldGVkCi0gICAqLwotICBpZiAocF9jbGNiLT5hdXRvX3VwZGF0ZSA9PSBCVEFfR0FUVENfRElTQ19XQUlUSU5HICYmCi0gICAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfY2hnICYmIG9wICE9IEdBVFRDX09QVFlQRV9DT05GSUcpIHsKLSAgICBWTE9HKDEpIDw8ICJEaXNjYXJkIGFsbCByZXNwb25zZXMgd2hlbiBzZXJ2aWNlIGNoYW5nZSBpbmRpY2F0aW9uIGlzICIKLSAgICAgICAgICAgICAgICJyZWNlaXZlZC4iOwotICAgIC8vIFRPRE8gRml4IGNvbnN0bmVzcwotICAgIGNvbnN0X2Nhc3Q8dEJUQV9HQVRUQ19EQVRBKj4ocF9kYXRhKS0+b3BfY21wbC5zdGF0dXMgPSBHQVRUX0VSUk9SOwotICB9Ci0KLSAgLyogc2VydmljZSBoYW5kbGUgY2hhbmdlIHZvaWQgdGhlIHJlc3BvbnNlLCBkaXNjYXJkIGl0ICovCi0gIGlmIChvcCA9PSBHQVRUQ19PUFRZUEVfUkVBRCkKLSAgICBidGFfZ2F0dGNfcmVhZF9jbXBsKHBfY2xjYiwgJnBfZGF0YS0+b3BfY21wbCk7Ci0KLSAgZWxzZSBpZiAob3AgPT0gR0FUVENfT1BUWVBFX1dSSVRFKQotICAgIGJ0YV9nYXR0Y193cml0ZV9jbXBsKHBfY2xjYiwgJnBfZGF0YS0+b3BfY21wbCk7Ci0KLSAgZWxzZSBpZiAob3AgPT0gR0FUVENfT1BUWVBFX0VYRV9XUklURSkKLSAgICBidGFfZ2F0dGNfZXhlY19jbXBsKHBfY2xjYiwgJnBfZGF0YS0+b3BfY21wbCk7Ci0KLSAgZWxzZSBpZiAob3AgPT0gR0FUVENfT1BUWVBFX0NPTkZJRykKLSAgICBidGFfZ2F0dGNfY2ZnX210dV9jbXBsKHBfY2xjYiwgJnBfZGF0YS0+b3BfY21wbCk7Ci0KLSAgLy8gSWYgcmVjZWl2ZSBEQVRBQkFTRV9PVVRfT0ZfU1lOQyBlcnJvciBjb2RlLCBidGFfZ2F0dGMgc2hvdWxkIHN0YXJ0IHNlcnZpY2UKLSAgLy8gZGlzY292ZXJ5IGltbWVkaWF0ZWx5Ci0gIGlmIChidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpICYmCi0gICAgICBwX2RhdGEtPm9wX2NtcGwuc3RhdHVzID09IEdBVFRfREFUQUJBU0VfT1VUX09GX1NZTkMpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogREFUQUJBU0VfT1VUX09GX1NZTkMsIHJlLWRpc2NvdmVyIHNlcnZpY2UiOwotICAgIHBfY2xjYi0+YXV0b191cGRhdGUgPSBCVEFfR0FUVENfUkVRX1dBSVRJTkc7Ci0gICAgLyogcmVxdWVzdCByZWFkIGRiIGhhc2ggZmlyc3QgKi8KLSAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfZGJfaGFzaCA9IHRydWU7Ci0gICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBCVEFfR0FUVENfSU5UX0RJU0NPVkVSX0VWVCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfY2xjYi0+YXV0b191cGRhdGUgPT0gQlRBX0dBVFRDX0RJU0NfV0FJVElORykgewotICAgIHBfY2xjYi0+YXV0b191cGRhdGUgPSBCVEFfR0FUVENfUkVRX1dBSVRJTkc7Ci0KLSAgICAvKiByZXF1ZXN0IHJlYWQgZGIgaGFzaCBmaXJzdCAqLwotICAgIGlmIChidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpKSB7Ci0gICAgICBwX2NsY2ItPnBfc3JjYi0+c3J2Y19oZGxfZGJfaGFzaCA9IHRydWU7Ci0gICAgfQotCi0gICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBCVEFfR0FUVENfSU5UX0RJU0NPVkVSX0VWVCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqIHN0YXJ0IGEgc2VhcmNoIGluIHRoZSBsb2NhbCBzZXJ2ZXIgY2FjaGUgKi8KLXZvaWQgYnRhX2dhdHRjX3NlYXJjaCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfSU5URVJOQUxfRVJST1I7Ci0gIHRCVEFfR0FUVEMgY2JfZGF0YTsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkPSIgPDwgbG9naGV4KHBfY2xjYi0+YnRhX2Nvbm5faWQpOwotICBpZiAocF9jbGNiLT5wX3NyY2IgJiYgIXBfY2xjYi0+cF9zcmNiLT5nYXR0X2RhdGFiYXNlLklzRW1wdHkoKSkgewotICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICAvKiBzZWFyY2ggdGhlIGxvY2FsIGNhY2hlIG9mIGEgc2VydmVyIGRldmljZSAqLwotICAgIGJ0YV9nYXR0Y19zZWFyY2hfc2VydmljZShwX2NsY2IsIHBfZGF0YS0+YXBpX3NlYXJjaC5wX3NydmNfdXVpZCk7Ci0gIH0KLSAgY2JfZGF0YS5zZWFyY2hfY21wbC5zdGF0dXMgPSBzdGF0dXM7Ci0gIGNiX2RhdGEuc2VhcmNoX2NtcGwuY29ubl9pZCA9IHBfY2xjYi0+YnRhX2Nvbm5faWQ7Ci0KLSAgLyogZW5kIG9mIHNlYXJjaCBvciBubyBzZXJ2ZXIgY2FjaGUgYXZhaWxhYmxlICovCi0gICgqcF9jbGNiLT5wX3JjYi0+cF9jYmFjaykoQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVCwgJmNiX2RhdGEpOwotfQotCi0vKiogZW5xdWV1ZSBhIGNvbW1hbmQgaW50byBjb250cm9sIGJsb2NrLCB1c3VhbGx5IGJlY2F1c2UgZGlzY292ZXJ5IG9wZXJhdGlvbiBpcwotICogYnVzeSAqLwotdm9pZCBidGFfZ2F0dGNfcV9jbWQodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIGJ0YV9nYXR0Y19lbnF1ZXVlKHBfY2xjYiwgcF9kYXRhKTsKLX0KLQotLyoqIHJlcG9ydCBBUEkgY2FsbCBmYWlsdXJlIGJhY2sgdG8gYXBwcyAqLwotdm9pZCBidGFfZ2F0dGNfZmFpbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgaWYgKHBfY2xjYi0+c3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgIm9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGF0IGN1cnJlbnQgc3RhdGUgIiA8PCArcF9jbGNiLT5zdGF0ZTsKLSAgfQotfQotCi0vKiBEZS1SZWdpc3RlciBhIEdBVFQgY2xpZW50IGFwcGxpY2F0aW9uIHdpdGggQlRBIGNvbXBsZXRlZCAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2RlcmVnaXN0ZXJfY21wbCh0QlRBX0dBVFRDX1JDQiogcF9jbHJlZykgewotICB0R0FUVF9JRiBjbGllbnRfaWYgPSBwX2NscmVnLT5jbGllbnRfaWY7Ci0gIHRCVEFfR0FUVEMgY2JfZGF0YTsKLSAgdEJUQV9HQVRUQ19DQkFDSyogcF9jYmFjayA9IHBfY2xyZWctPnBfY2JhY2s7Ci0KLSAgbWVtc2V0KCZjYl9kYXRhLCAwLCBzaXplb2YodEJUQV9HQVRUQykpOwotCi0gIEdBVFRfRGVyZWdpc3RlcihwX2NscmVnLT5jbGllbnRfaWYpOwotICBtZW1zZXQocF9jbHJlZywgMCwgc2l6ZW9mKHRCVEFfR0FUVENfUkNCKSk7Ci0KLSAgY2JfZGF0YS5yZWdfb3Blci5jbGllbnRfaWYgPSBjbGllbnRfaWY7Ci0gIGNiX2RhdGEucmVnX29wZXIuc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotCi0gIGlmIChwX2NiYWNrKSAvKiBjYWxsYmFjayB3aXRoIGRlLXJlZ2lzdGVyIGV2ZW50ICovCi0gICAgKCpwX2NiYWNrKShCVEFfR0FUVENfREVSRUdfRVZULCAmY2JfZGF0YSk7Ci0KLSAgaWYgKGJ0YV9nYXR0Y19udW1fcmVnX2FwcCgpID09IDAgJiYKLSAgICAgIGJ0YV9nYXR0Y19jYi5zdGF0ZSA9PSBCVEFfR0FUVENfU1RBVEVfRElTQUJMSU5HKSB7Ci0gICAgYnRhX2dhdHRjX2NiLnN0YXRlID0gQlRBX0dBVFRDX1NUQVRFX0RJU0FCTEVEOwotICB9Ci19Ci0KLS8qKiBjYWxsYmFjayBmdW5jdGlvbnMgdG8gR0FUVCBjbGllbnQgc3RhY2sgKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jb25uX2NiYWNrKHRHQVRUX0lGIGdhdHRjX2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIGlmIChjb25uZWN0ZWQpIHsKLSAgICBMT0dfSU5GTygiQ29ubmVjdGVkIGF0dF9pZDolaGh1IHRyYW5zcG9ydDolcyByZWFzb246JXMiLCBnYXR0Y19pZiwKLSAgICAgICAgICAgICBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgZ2F0dF9kaXNjb25uZWN0aW9uX3JlYXNvbl90ZXh0KHJlYXNvbikuY19zdHIoKSk7Ci0gICAgYnRpZl9kZWJ1Z19jb25uX3N0YXRlKGJkYWRkciwgQlRJRl9ERUJVR19DT05ORUNURUQsIEdBVFRfQ09OTl9PSyk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oIkRpc2Nvbm5lY3RlZCBhdHRfaWQ6JWhodSB0cmFuc3BvcnQ6JXMgcmVhc29uOiVzIiwgZ2F0dGNfaWYsCi0gICAgICAgICAgICAgYnRfdHJhbnNwb3J0X3RleHQodHJhbnNwb3J0KS5jX3N0cigpLAotICAgICAgICAgICAgIGdhdHRfZGlzY29ubmVjdGlvbl9yZWFzb25fdGV4dChyZWFzb24pLmNfc3RyKCkpOwotICAgIGJ0aWZfZGVidWdfY29ubl9zdGF0ZShiZGFkZHIsIEJUSUZfREVCVUdfRElTQ09OTkVDVEVELCBHQVRUX0NPTk5fT0spOwotICB9Ci0KLSAgdEJUQV9HQVRUQ19EQVRBKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9HQVRUQ19EQVRBKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0dBVFRDX0RBVEEpKTsKLSAgcF9idWYtPmludF9jb25uLmhkci5ldmVudCA9Ci0gICAgICBjb25uZWN0ZWQgPyBCVEFfR0FUVENfSU5UX0NPTk5fRVZUIDogQlRBX0dBVFRDX0lOVF9ESVNDT05OX0VWVDsKLSAgcF9idWYtPmludF9jb25uLmhkci5sYXllcl9zcGVjaWZpYyA9IGNvbm5faWQ7Ci0gIHBfYnVmLT5pbnRfY29ubi5jbGllbnRfaWYgPSBnYXR0Y19pZjsKLSAgcF9idWYtPmludF9jb25uLnJvbGUgPSBMMkNBX0dldEJsZUNvbm5Sb2xlKGJkYWRkcik7Ci0gIHBfYnVmLT5pbnRfY29ubi5yZWFzb24gPSByZWFzb247Ci0gIHBfYnVmLT5pbnRfY29ubi50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0gIHBfYnVmLT5pbnRfY29ubi5yZW1vdGVfYmRhID0gYmRhZGRyOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKiBlbmNyeXB0aW9uIGNvbXBsZXRlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIEdBVFQgY2xpZW50IHN0YWNrICovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfZW5jX2NtcGxfY2JhY2sodEdBVFRfSUYgZ2F0dGNfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9Ci0gICAgICBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2NpZihnYXR0Y19pZiwgYmRhLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogY2lmOiIgPDwgK2dhdHRjX2lmOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRhX2dhdHRjX3Byb2Nlc3NfZW5jX2NtcGwsIGdhdHRjX2lmLCBiZGEpKTsKLX0KLQotLyoqIHByb2Nlc3MgcmVmcmVzaCBBUEkgdG8gZGVsZXRlIGNhY2hlIGFuZCBzdGFydCBhIG5ldyBkaXNjb3ZlcnkgaWYgY3VycmVudGx5Ci0gKiBjb25uZWN0ZWQgKi8KLXZvaWQgYnRhX2dhdHRjX3Byb2Nlc3NfYXBpX3JlZnJlc2goY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB0QlRBX0dBVFRDX1NFUlYqIHBfc3J2Y19jYiA9IGJ0YV9nYXR0Y19maW5kX3NydnJfY2FjaGUocmVtb3RlX2JkYSk7Ci0gIGlmIChwX3NydmNfY2IpIHsKLSAgICAvKiB0cnkgdG8gZmluZCBhIENMQ0IgKi8KLSAgICBpZiAocF9zcnZjX2NiLT5jb25uZWN0ZWQgJiYgcF9zcnZjX2NiLT5udW1fY2xjYiAhPSAwKSB7Ci0gICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9ICZidGFfZ2F0dGNfY2IuY2xjYlswXTsKLSAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IEJUQV9HQVRUQ19DTENCX01BWDsgaSsrLCBwX2NsY2IrKykgewotICAgICAgICBpZiAocF9jbGNiLT5pbl91c2UgJiYgcF9jbGNiLT5wX3NyY2IgPT0gcF9zcnZjX2NiKSB7Ci0gICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBCVEFfR0FUVENfSU5UX0RJU0NPVkVSX0VWVCwgTlVMTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogaW4gYWxsIG90aGVyIGNhc2VzLCBtYXJrIGl0IGFuZCBkZWxldGUgdGhlIGNhY2hlICovCi0KLSAgICBwX3NydmNfY2ItPmdhdHRfZGF0YWJhc2UuQ2xlYXIoKTsKLSAgfQotCi0gIC8qIHVzZWQgdG8gcmVzZXQgY2FjaGUgaW4gYXBwbGljYXRpb24gKi8KLSAgYnRhX2dhdHRjX2NhY2hlX3Jlc2V0KHJlbW90ZV9iZGEpOwotfQotCi0vKiogcHJvY2VzcyBzZXJ2aWNlIGNoYW5nZSBpbmRpY2F0aW9uICovCi1zdGF0aWMgYm9vbCBidGFfZ2F0dGNfcHJvY2Vzc19zcnZjX2NoZ19pbmQodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1JDQiogcF9jbHJjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX05PVElGWSogcF9ub3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfVkFMVUUqIGF0dF92YWx1ZSkgewotICBVdWlkIGdhdHRwX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpOwotICBVdWlkIHNydmNfY2hnX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0dBVFRfU1JWX0NIR0QpOwotCi0gIGlmIChwX3NyY2ItPmdhdHRfZGF0YWJhc2UuSXNFbXB0eSgpICYmIHBfc3JjYi0+c3RhdGUgPT0gQlRBX0dBVFRDX1NFUlZfSURMRSkgewotICAgIGJ0YV9nYXR0Y19jYWNoZV9sb2FkKHBfc3JjYik7Ci0gIH0KLQotICBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogcF9jaGFyID0KLSAgICAgIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYihwX3NyY2IsIHBfbm90aWZ5LT5oYW5kbGUpOwotICBpZiAoIXBfY2hhcikgcmV0dXJuIGZhbHNlOwotICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBwX3N2YyA9Ci0gICAgICBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZV9zcmNiKHBfc3JjYiwgcF9jaGFyLT52YWx1ZV9oYW5kbGUpOwotICBpZiAoIXBfc3ZjIHx8IHBfc3ZjLT51dWlkICE9IGdhdHRwX3V1aWQgfHwgcF9jaGFyLT51dWlkICE9IHNydmNfY2hnX3V1aWQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYXR0X3ZhbHVlLT5sZW4gIT0gQlRBX0dBVFRDX1NFUlZJQ0VfQ0hBTkdFRF9MRU4pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiByZWNlaXZlZCBtYWxmb3JtZWQgc2VydmljZSBjaGFuZ2VkIGluZGljYXRpb24sIHNraXBwaW5nIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1aW50OF90KiBwID0gYXR0X3ZhbHVlLT52YWx1ZTsKLSAgdWludDE2X3Qgc19oYW5kbGUgPSAoKHVpbnQxNl90KSgqKHApKSArICgoKHVpbnQxNl90KSgqKHAgKyAxKSkpIDw8IDgpKTsKLSAgdWludDE2X3QgZV9oYW5kbGUgPSAoKHVpbnQxNl90KSgqKHAgKyAyKSkgKyAoKCh1aW50MTZfdCkoKihwICsgMykpKSA8PCA4KSk7Ci0KLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2aWNlIGNoYW5nZWQgc19oYW5kbGU9IiA8PCBsb2doZXgoc19oYW5kbGUpCi0gICAgICAgICAgICAgPDwgIiwgZV9oYW5kbGU9IiA8PCBsb2doZXgoZV9oYW5kbGUpOwotCi0gIC8qIG1hcmsgc2VydmljZSBoYW5kbGUgY2hhbmdlIHBlbmRpbmcgKi8KLSAgcF9zcmNiLT5zcnZjX2hkbF9jaGcgPSB0cnVlOwotICAvKiBjbGVhciB1cCBhbGwgbm90aWZpY2F0aW9uL2luZGljYXRpb24gcmVnaXN0cmF0aW9uICovCi0gIGJ0YV9nYXR0Y19jbGVhcl9ub3RpZl9yZWdpc3RyYXRpb24ocF9zcmNiLCBjb25uX2lkLCBzX2hhbmRsZSwgZV9oYW5kbGUpOwotICAvKiBzZXJ2aWNlIGNoYW5nZSBpbmRpY2F0aW9uIGFsbCByZWNlaXZlZCwgZG8gZGlzY292ZXJ5IHVwZGF0ZSAqLwotICBpZiAoKytwX3NyY2ItPnVwZGF0ZV9jb3VudCA9PSBidGFfZ2F0dGNfbnVtX3JlZ19hcHAoKSkgewotICAgIC8qIG5vdCBhbiBvcGVuZWQgY29ubmVjdGlvbjsgb3IgY29ubmVjdGlvbiBidXN5ICovCi0gICAgLyogc2VhcmNoIGZvciBmaXJzdCBhdmFpbGFibGUgY2xjYiBhbmQgc3RhcnQgZGlzY292ZXJ5ICovCi0gICAgaWYgKHBfY2xjYiA9PSBOVUxMIHx8IChwX2NsY2IgJiYgcF9jbGNiLT5wX3FfY21kICE9IE5VTEwpKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEJUQV9HQVRUQ19DTENCX01BWDsgaSsrKSB7Ci0gICAgICAgIGlmIChidGFfZ2F0dGNfY2IuY2xjYltpXS5pbl91c2UgJiYKLSAgICAgICAgICAgIGJ0YV9nYXR0Y19jYi5jbGNiW2ldLnBfc3JjYiA9PSBwX3NyY2IgJiYKLSAgICAgICAgICAgIGJ0YV9nYXR0Y19jYi5jbGNiW2ldLnBfcV9jbWQgPT0gTlVMTCkgewotICAgICAgICAgIHBfY2xjYiA9ICZidGFfZ2F0dGNfY2IuY2xjYltpXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvKiBzZW5kIGNvbmZpcm1hdGlvbiBoZXJlIGlmIHRoaXMgaXMgYW4gaW5kaWNhdGlvbiwgaXQgc2hvdWxkIGFsd2F5cyBiZSAqLwotICAgIEdBVFRDX1NlbmRIYW5kbGVWYWx1ZUNvbmZpcm0oY29ubl9pZCwgcF9ub3RpZnktPmNpZCk7Ci0KLSAgICAvKiBpZiBjb25uZWN0aW9uIGF2YWlsYWJsZSwgcmVmcmVzaCBjYWNoZSBieSBkb2luZyBkaXNjb3Zlcnkgbm93ICovCi0gICAgaWYgKHBfY2xjYikgewotICAgICAgLyogcmVxdWVzdCByZWFkIGRiIGhhc2ggZmlyc3QgKi8KLSAgICAgIGlmIChidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpKSB7Ci0gICAgICAgIHBfc3JjYi0+c3J2Y19oZGxfZGJfaGFzaCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBidGFfZ2F0dGNfc21fZXhlY3V0ZShwX2NsY2IsIEJUQV9HQVRUQ19JTlRfRElTQ09WRVJfRVZULCBOVUxMKTsKLSAgICB9Ci0gIH0KLQotICAvKiBub3RpZnkgYXBwbGljYXRpb25mIG9yIHNlcnZpY2UgY2hhbmdlICovCi0gIGlmIChwX2NscmNiLT5wX2NiYWNrKSB7Ci0gICAgdEJUQV9HQVRUQyBidGFfZ2F0dGM7Ci0gICAgYnRhX2dhdHRjLnNlcnZpY2VfY2hhbmdlZC5yZW1vdGVfYmRhID0gcF9zcmNiLT5zZXJ2ZXJfYmRhOwotICAgIGJ0YV9nYXR0Yy5zZXJ2aWNlX2NoYW5nZWQuY29ubl9pZCA9IGNvbm5faWQ7Ci0gICAgKCpwX2NscmNiLT5wX2NiYWNrKShCVEFfR0FUVENfU1JWQ19DSEdfRVZULCAmYnRhX2dhdHRjKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiogcHJvY2VzcyBhbGwgbm9uLXNlcnZpY2UgY2hhbmdlIGluZGljYXRpb24vbm90aWZpY2F0aW9uICovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfcHJvY19vdGhlcl9pbmRpY2F0aW9uKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLCB1aW50OF90IG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX05PVElGWSogcF9ub3RpZnkpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgIjogY2hlY2sgcF9kYXRhLT5hdHRfdmFsdWUuaGFuZGxlPSVkIHBfZGF0YS0+aGFuZGxlPSVkIiwKLSAgICAgICAgICAgICAgICAgcF9kYXRhLT5hdHRfdmFsdWUuaGFuZGxlLCBwX2RhdGEtPmhhbmRsZSk7Ci0gIFZMT0coMSkgPDwgImlzX25vdGlmeSAiIDw8IHBfbm90aWZ5LT5pc19ub3RpZnk7Ci0KLSAgcF9ub3RpZnktPmlzX25vdGlmeSA9IChvcCA9PSBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTikgPyBmYWxzZSA6IHRydWU7Ci0gIHBfbm90aWZ5LT5sZW4gPSBwX2RhdGEtPmF0dF92YWx1ZS5sZW47Ci0gIHBfbm90aWZ5LT5iZGEgPSBwX2NsY2ItPmJkYTsKLSAgbWVtY3B5KHBfbm90aWZ5LT52YWx1ZSwgcF9kYXRhLT5hdHRfdmFsdWUudmFsdWUsIHBfZGF0YS0+YXR0X3ZhbHVlLmxlbik7Ci0gIHBfbm90aWZ5LT5jb25uX2lkID0gcF9jbGNiLT5idGFfY29ubl9pZDsKLQotICBpZiAocF9jbGNiLT5wX3JjYi0+cF9jYmFjaykgewotICAgIHRCVEFfR0FUVEMgYnRhX2dhdHRjOwotICAgIGJ0YV9nYXR0Yy5ub3RpZnkgPSAqcF9ub3RpZnk7Ci0gICAgKCpwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVENfTk9USUZfRVZULCAmYnRhX2dhdHRjKTsKLSAgfQotfQotCi0vKiogcHJvY2VzcyBpbmRpY2F0aW9uL25vdGlmaWNhdGlvbiAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX3Byb2Nlc3NfaW5kaWNhdGUodWludDE2X3QgY29ubl9pZCwgdEdBVFRDX09QVFlQRSBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NMX0NPTVBMRVRFKiBwX2RhdGEpIHsKLSAgdWludDE2X3QgaGFuZGxlID0gcF9kYXRhLT5hdHRfdmFsdWUuaGFuZGxlOwotICB0QlRBX0dBVFRDX05PVElGWSBub3RpZnk7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci0KLSAgaWYgKCFHQVRUX0dldENvbm5lY3Rpb25JbmZvcihjb25uX2lkLCAmZ2F0dF9pZiwgcmVtb3RlX2JkYSwgJnRyYW5zcG9ydCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGluZGljYXRpb24vbm90aWYgZm9yIHVua25vd24gYXBwIjsKLSAgICBpZiAob3AgPT0gR0FUVENfT1BUWVBFX0lORElDQVRJT04pCi0gICAgICBHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtKGNvbm5faWQsIHBfZGF0YS0+Y2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJjYiA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0gIGlmIChwX2NscmNiID09IE5VTEwpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGluZGljYXRpb24vbm90aWYgZm9yIHVucmVnaXN0ZXJlZCBhcHAiOwotICAgIGlmIChvcCA9PSBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTikKLSAgICAgIEdBVFRDX1NlbmRIYW5kbGVWYWx1ZUNvbmZpcm0oY29ubl9pZCwgcF9kYXRhLT5jaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVEFfR0FUVENfU0VSViogcF9zcmNiID0gYnRhX2dhdHRjX2ZpbmRfc3JjYihyZW1vdGVfYmRhKTsKLSAgaWYgKHBfc3JjYiA9PSBOVUxMKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBpbmRpY2F0aW9uL25vdGlmIGZvciB1bmtub3duIGRldmljZSwgaWdub3JlIjsKLSAgICBpZiAob3AgPT0gR0FUVENfT1BUWVBFX0lORElDQVRJT04pCi0gICAgICBHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtKGNvbm5faWQsIHBfZGF0YS0+Y2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLQotICBub3RpZnkuaGFuZGxlID0gaGFuZGxlOwotICBub3RpZnkuY2lkID0gcF9kYXRhLT5jaWQ7Ci0KLSAgLyogaWYgc2VydmljZSBjaGFuZ2UgaW5kaWNhdGlvbi9ub3RpZmljYXRpb24sIGRvbid0IGZvcndhcmQgdG8gYXBwbGljYXRpb24gKi8KLSAgaWYgKGJ0YV9nYXR0Y19wcm9jZXNzX3NydmNfY2hnX2luZChjb25uX2lkLCBwX2NscmNiLCBwX3NyY2IsIHBfY2xjYiwgJm5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5hdHRfdmFsdWUpKQotICAgIHJldHVybjsKLQotICAvKiBpZiBhcHAgcmVnaXN0ZXJlZCBmb3IgdGhlIG5vdGlmaWNhdGlvbiAqLwotICBpZiAoYnRhX2dhdHRjX2NoZWNrX25vdGlmX3JlZ2lzdHJ5KHBfY2xyY2IsIHBfc3JjYiwgJm5vdGlmeSkpIHsKLSAgICAvKiBjb25uZWN0aW9uIG5vdCBvcGVuIHlldCAqLwotICAgIGlmIChwX2NsY2IgPT0gTlVMTCkgewotICAgICAgcF9jbGNiID0gYnRhX2dhdHRjX2NsY2JfYWxsb2MoZ2F0dF9pZiwgcmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLQotICAgICAgaWYgKHBfY2xjYiA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk5vIHJlc291cmNlcyI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcF9jbGNiLT5idGFfY29ubl9pZCA9IGNvbm5faWQ7Ci0gICAgICBwX2NsY2ItPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLQotICAgICAgYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBCVEFfR0FUVENfSU5UX0NPTk5fRVZULCBOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAocF9jbGNiICE9IE5VTEwpCi0gICAgICBidGFfZ2F0dGNfcHJvY19vdGhlcl9pbmRpY2F0aW9uKHBfY2xjYiwgb3AsIHBfZGF0YSwgJm5vdGlmeSk7Ci0gIH0KLSAgLyogbm8gb25lIGludGVyc3RlZCBhbmQgbmVlZCBhY2s/ICovCi0gIGVsc2UgaWYgKG9wID09IEdBVFRDX09QVFlQRV9JTkRJQ0FUSU9OKSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIG5vIG9uZSBpbnRlcmVzdGVkLCBhY2sgbm93IjsKLSAgICBHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtKGNvbm5faWQsIHBfZGF0YS0+Y2lkKTsKLSAgfQotfQotCi0vKiogY2xpZW50IG9wZXJhdGlvbiBjb21wbGV0ZSBjYWxsYmFjayByZWdpc3RlciB3aXRoIEJURSBHQVRUICovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY21wbF9jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NMX0NPTVBMRVRFKiBwX2RhdGEpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkOiIgPDwgK2Nvbm5faWQgPDwgIiBvcDoiIDw8ICtvcAotICAgICAgICAgIDw8ICIgc3RhdHVzOiIgPDwgK3N0YXR1czsKLQotICAvKiBub3RpZmljYXRpb24gYW5kIGluZGljYXRpb24gcHJvY2Vzc2VkIHJpZ2h0IGF3YXkgKi8KLSAgaWYgKG9wID09IEdBVFRDX09QVFlQRV9OT1RJRklDQVRJT04gfHwgb3AgPT0gR0FUVENfT1BUWVBFX0lORElDQVRJT04pIHsKLSAgICBidGFfZ2F0dGNfcHJvY2Vzc19pbmRpY2F0ZShjb25uX2lkLCBvcCwgcF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogZm9yIGFsbCBvdGhlciBvcGVyYXRpb24sIG5vdCBleHBlY3RlZCBpZiB3L28gY29ubmVjdGlvbiAqLwotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgaWYgKCFwX2NsY2IpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVua25vd24gY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgICAgPDwgIiBpZ25vcmUgZGF0YSI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogaWYgb3ZlciBCUl9FRFIsIGluZm9ybSBQTSBmb3IgbW9kZSBjaGFuZ2UgKi8KLSAgaWYgKHBfY2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICBidGFfc3lzX2J1c3koQlRBX0lEX0dBVFRDLCBCVEFfQUxMX0FQUF9JRCwgcF9jbGNiLT5iZGEpOwotICAgIGJ0YV9zeXNfaWRsZShCVEFfSURfR0FUVEMsIEJUQV9BTExfQVBQX0lELCBwX2NsY2ItPmJkYSk7Ci0gIH0KLQotICBidGFfZ2F0dGNfY21wbF9zZW5kbXNnKGNvbm5faWQsIG9wLCBzdGF0dXMsIHBfZGF0YSk7Ci19Ci0KLS8qKiBjbGllbnQgb3BlcmF0aW9uIGNvbXBsZXRlIHNlbmQgbWVzc2FnZSAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NtcGxfc2VuZG1zZyh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhKSB7Ci0gIGNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2YodEJUQV9HQVRUQ19PUF9DTVBMKSArIHNpemVvZih0R0FUVF9DTF9DT01QTEVURSk7Ci0gIHRCVEFfR0FUVENfT1BfQ01QTCogcF9idWYgPSAodEJUQV9HQVRUQ19PUF9DTVBMKilvc2lfY2FsbG9jKGxlbik7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUQ19PUF9DTVBMX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGNvbm5faWQ7Ci0gIHBfYnVmLT5zdGF0dXMgPSBzdGF0dXM7Ci0gIHBfYnVmLT5vcF9jb2RlID0gb3A7Ci0KLSAgaWYgKHBfZGF0YSkgewotICAgIHBfYnVmLT5wX2NtcGwgPSAodEdBVFRfQ0xfQ09NUExFVEUqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+cF9jbXBsLCBwX2RhdGEsIHNpemVvZih0R0FUVF9DTF9DT01QTEVURSkpOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqIGNvbmdlc3Rpb24gY2FsbGJhY2sgZm9yIEJUQSBHQVRUIGNsaWVudCAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NvbmdfY2JhY2sodWludDE2X3QgY29ubl9pZCwgYm9vbCBjb25nZXN0ZWQpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gIGlmICghcF9jbGNiIHx8ICFwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKSByZXR1cm47Ci0KLSAgdEJUQV9HQVRUQyBjYl9kYXRhOwotICBjYl9kYXRhLmNvbmdlc3QuY29ubl9pZCA9IGNvbm5faWQ7Ci0gIGNiX2RhdGEuY29uZ2VzdC5jb25nZXN0ZWQgPSBjb25nZXN0ZWQ7Ci0KLSAgKCpwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVENfQ09OR0VTVF9FVlQsICZjYl9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2dhdHRjX3BoeV91cGRhdGVfY2JhY2sodEdBVFRfSUYgZ2F0dF9pZiwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgdEJUQV9HQVRUQ19SQ0IqIHBfY2xyZWcgPSBidGFfZ2F0dGNfY2xfZ2V0X3JlZ2NiKGdhdHRfaWYpOwotCi0gIGlmICghcF9jbHJlZyB8fCAhcF9jbHJlZy0+cF9jYmFjaykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2xpZW50X2lmPSIgPDwgK2dhdHRfaWYgPDwgIiBub3QgZm91bmQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVEFfR0FUVEMgY2JfZGF0YTsKLSAgY2JfZGF0YS5waHlfdXBkYXRlLmNvbm5faWQgPSBjb25uX2lkOwotICBjYl9kYXRhLnBoeV91cGRhdGUuc2VydmVyX2lmID0gZ2F0dF9pZjsKLSAgY2JfZGF0YS5waHlfdXBkYXRlLnR4X3BoeSA9IHR4X3BoeTsKLSAgY2JfZGF0YS5waHlfdXBkYXRlLnJ4X3BoeSA9IHJ4X3BoeTsKLSAgY2JfZGF0YS5waHlfdXBkYXRlLnN0YXR1cyA9IHN0YXR1czsKLSAgKCpwX2NscmVnLT5wX2NiYWNrKShCVEFfR0FUVENfUEhZX1VQREFURV9FVlQsICZjYl9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2Nvbm5fdXBkYXRlX2NiYWNrKHRHQVRUX0lGIGdhdHRfaWYsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJlZyA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0KLSAgaWYgKCFwX2NscmVnIHx8ICFwX2NscmVnLT5wX2NiYWNrKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjbGllbnRfaWY9IiA8PCBnYXR0X2lmIDw8ICIgbm90IGZvdW5kIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0dBVFRDIGNiX2RhdGE7Ci0gIGNiX2RhdGEuY29ubl91cGRhdGUuY29ubl9pZCA9IGNvbm5faWQ7Ci0gIGNiX2RhdGEuY29ubl91cGRhdGUuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKLSAgY2JfZGF0YS5jb25uX3VwZGF0ZS5sYXRlbmN5ID0gbGF0ZW5jeTsKLSAgY2JfZGF0YS5jb25uX3VwZGF0ZS50aW1lb3V0ID0gdGltZW91dDsKLSAgY2JfZGF0YS5jb25uX3VwZGF0ZS5zdGF0dXMgPSBzdGF0dXM7Ci0gICgqcF9jbHJlZy0+cF9jYmFjaykoQlRBX0dBVFRDX0NPTk5fVVBEQVRFX0VWVCwgJmNiX2RhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRjX2FwaS5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0Y19hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzM1ZGUuLjAwMDAwMDAKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRjX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDc1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDEwLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZm9yIEdBVFQgbW9kdWxlIG9mIEJUQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxpb3M+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiICAvLyBkb19pbl9tYWluX3RocmVhZAotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY29uc3QgdEJUQV9TWVNfUkVHIGJ0YV9nYXR0Y19yZWcgPSB7YnRhX2dhdHRjX2hkbF9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfRGlzYWJsZX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGlzYWJsZSBHQVRUQyBtb2R1bGUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX0Rpc2FibGUodm9pZCkgewotICBpZiAoIWJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRDKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiR0FUVEMgTW9kdWxlIG5vdCBlbmFibGVkL2FscmVhZHkgZGlzYWJsZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2dhdHRjX2Rpc2FibGUpKTsKLSAgYnRhX3N5c19kZXJlZ2lzdGVyKEJUQV9JRF9HQVRUQyk7Ci19Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYXBwbGljYXRpb24gY2FsbGJhY2tzIHdpdGggQlRBIEdBVFRDCi0gKiBtb2R1bGUuIHxjbGllbnRfY2J8IHBvaW50ZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLgotICogfGNifCBvbmUgdGltZSBjYWxsYmFjayB3aGVuIHJlZ2lzdHJhdGlvbiBpcyBmaW5pc2hlZAotICovCi12b2lkIEJUQV9HQVRUQ19BcHBSZWdpc3Rlcih0QlRBX0dBVFRDX0NCQUNLKiBwX2NsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgY2IsIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIGlmICghYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfR0FUVEMpKQotICAgIGJ0YV9zeXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRDLCAmYnRhX2dhdHRjX3JlZyk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0YV9nYXR0Y19yZWdpc3RlciwgVXVpZDo6R2V0UmFuZG9tKCksIHBfY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYiksIGVhdHRfc3VwcG9ydCkpOwotfQotCi1zdGF0aWMgdm9pZCBhcHBfZGVyZWdpc3Rlcl9pbXBsKHRHQVRUX0lGIGNsaWVudF9pZikgewotICBidGFfZ2F0dGNfZGVyZWdpc3RlcihidGFfZ2F0dGNfY2xfZ2V0X3JlZ2NiKGNsaWVudF9pZikpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZXJlZ2lzdGVyIGFuIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gQlRBIEdBVFRDIG1vZHVsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNsaWVudF9pZiAtIGNsaWVudCBpbnRlcmZhY2UgaWRlbnRpZmllci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVENfQXBwRGVyZWdpc3Rlcih0R0FUVF9JRiBjbGllbnRfaWYpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZhcHBfZGVyZWdpc3Rlcl9pbXBsLCBjbGllbnRfaWYpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVuIGEgZGlyZWN0IGNvbm5lY3Rpb24gb3IgYWRkIGEgYmFja2dyb3VuZCBhdXRvIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgYmQgYWRkcmVzcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY2xpZW50X2lmOiBzZXJ2ZXIgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIEJEIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDogZGlyZWN0IGNvbm5lY3Rpb24gb3IgYmFja2dyb3VuZCBhdXRvIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0OiBUcmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgR0FUVCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJSRURSL0xFKQotICogICAgICAgICAgICAgICAgICBpbml0aWF0aW5nX3BoeXM6IExFIFBIWSB0byB1c2UsIG9wdGlvbmFsCi0gKiAgICAgICAgICAgICAgICAgIG9wcG9ydHVuaXN0aWM6IHdldGhlciB0aGUgY29ubmVjdGlvbiBzaGFsbCBiZSBvcHBvcnR1bmlzdGljLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZG9uJ3QgaW1wYWN0IHRoZSBkaXNjb25uZWN0aW9uIHRpbWVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX09wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgYm9vbCBvcHBvcnR1bmlzdGljKSB7Ci0gIHVpbnQ4X3QgcGh5ID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9sZV9hbGxfaW5pdGlhdGluZ19waHlzKCk7Ci0gIEJUQV9HQVRUQ19PcGVuKGNsaWVudF9pZiwgcmVtb3RlX2JkYSwgaXNfZGlyZWN0LCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgICAgICAgICAgIG9wcG9ydHVuaXN0aWMsIHBoeSk7Ci19Ci0KLXZvaWQgQlRBX0dBVFRDX09wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgb3Bwb3J0dW5pc3RpYywKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbml0aWF0aW5nX3BoeXMpIHsKLSAgdEJUQV9HQVRUQ19EQVRBIGRhdGEgPSB7Ci0gICAgICAuYXBpX2Nvbm4gPQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLmhkciA9Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgLmV2ZW50ID0gQlRBX0dBVFRDX0FQSV9PUEVOX0VWVCwKLSAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgIC5yZW1vdGVfYmRhID0gcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgLmNsaWVudF9pZiA9IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgLmlzX2RpcmVjdCA9IGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgLnRyYW5zcG9ydCA9IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgLmluaXRpYXRpbmdfcGh5cyA9IGluaXRpYXRpbmdfcGh5cywKLSAgICAgICAgICAgICAgLm9wcG9ydHVuaXN0aWMgPSBvcHBvcnR1bmlzdGljLAotICAgICAgICAgIH0sCi0gIH07Ci0KLSAgcG9zdF9vbl9idF9tYWluKFtkYXRhXSgpIHsgYnRhX2dhdHRjX3Byb2Nlc3NfYXBpX29wZW4oJmRhdGEpOyB9KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYW5jZWwgYSBkaXJlY3Qgb3BlbiBjb25uZWN0aW9uIG9yIHJlbW92ZSBhIGJhY2tncm91bmQgYXV0bwotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGJkIGFkZHJlc3MKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNsaWVudF9pZjogc2VydmVyIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlX2JkYTogcmVtb3RlIGRldmljZSBCRCBhZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBpc19kaXJlY3Q6IGRpcmVjdCBjb25uZWN0aW9uIG9yIGJhY2tncm91bmQgYXV0byBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX0NhbmNlbE9wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCkgewotICB0QlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTiogcF9idWYgPSAodEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4qKW9zaV9tYWxsb2MoCi0gICAgICBzaXplb2YodEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4pKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTl9FVlQ7Ci0gIHBfYnVmLT5jbGllbnRfaWYgPSBjbGllbnRfaWY7Ci0gIHBfYnVmLT5pc19kaXJlY3QgPSBpc19kaXJlY3Q7Ci0gIHBfYnVmLT5yZW1vdGVfYmRhID0gcmVtb3RlX2JkYTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIGNvbm5lY3Rpb24gdG8gYSBHQVRUIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpbm8gSUQgdG8gYmUgY2xvc2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19DbG9zZSh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfR0FUVENfQVBJX0NMT1NFX0VWVDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29uZmlndXJlIHRoZSBNVFUgc2l6ZSBpbiB0aGUgR0FUVCBjaGFubmVsLiBUaGlzIGNhbiBiZSBkb25lCi0gKiAgICAgICAgICAgICAgICAgIG9ubHkgb25jZSBwZXIgY29ubmVjdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgIG10dTogZGVzaXJlZCBNVFUgc2l6ZSB0byB1c2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBCVEFfR0FUVENfQ29uZmlndXJlTVRVKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IG10dSkgewotICBCVEFfR0FUVENfQ29uZmlndXJlTVRVKGNvbm5faWQsIG10dSwgTlVMTCwgTlVMTCk7Ci19Ci0KLXZvaWQgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DT05GSUdVUkVfTVRVX09QX0NCIGNhbGxiYWNrLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIHRCVEFfR0FUVENfQVBJX0NGR19NVFUqIHBfYnVmID0KLSAgICAgICh0QlRBX0dBVFRDX0FQSV9DRkdfTVRVKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0dBVFRDX0FQSV9DRkdfTVRVKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUQ19BUElfQ0ZHX01UVV9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBjb25uX2lkOwotICBwX2J1Zi0+bXR1ID0gbXR1OwotICBwX2J1Zi0+bXR1X2NiID0gY2FsbGJhY2s7Ci0gIHBfYnVmLT5tdHVfY2JfZGF0YSA9IGNiX2RhdGE7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVxdWVzdCBhIEdBVFQgc2VydmljZSBkaXNjb3ZlcnkKLSAqICAgICAgICAgICAgICAgICAgb24gYSBHQVRUIHNlcnZlci4gVGhpcyBmdW5jdGlvbiByZXBvcnQgc2VydmljZSBzZWFyY2gKLSAqICAgICAgICAgICAgICAgICAgcmVzdWx0IGJ5IGEgY2FsbGJhY2sgZXZlbnQsIGFuZCBmb2xsb3dlZCBieSBhIHNlcnZpY2Ugc2VhcmNoCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIGV2ZW50LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRC4KLSAqICAgICAgICAgICAgICAgICAgcF9zcnZjX3V1aWQ6IGEgVVVJRCBvZiB0aGUgc2VydmljZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgTnVsbCwgZGlzY292ZXIgZm9yIGFsbCBzZXJ2aWNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QodWludDE2X3QgY29ubl9pZCwgY29uc3QgVXVpZCogcF9zcnZjX3V1aWQpIHsKLSAgY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZih0QlRBX0dBVFRDX0FQSV9TRUFSQ0gpICsgc2l6ZW9mKFV1aWQpOwotICB0QlRBX0dBVFRDX0FQSV9TRUFSQ0gqIHBfYnVmID0gKHRCVEFfR0FUVENfQVBJX1NFQVJDSCopb3NpX2NhbGxvYyhsZW4pOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX1NFQVJDSF9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBjb25uX2lkOwotICBpZiAocF9zcnZjX3V1aWQpIHsKLSAgICBwX2J1Zi0+cF9zcnZjX3V1aWQgPSAoVXVpZCopKHBfYnVmICsgMSk7Ci0gICAgKnBfYnVmLT5wX3NydmNfdXVpZCA9ICpwX3NydmNfdXVpZDsKLSAgfSBlbHNlIHsKLSAgICBwX2J1Zi0+cF9zcnZjX3V1aWQgPSBOVUxMOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotdm9pZCBCVEFfR0FUVENfRGlzY292ZXJTZXJ2aWNlQnlVdWlkKHVpbnQxNl90IGNvbm5faWQsIGNvbnN0IFV1aWQmIHNydmNfdXVpZCkgewotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgYmFzZTo6SWdub3JlUmVzdWx0PHRHQVRUX1NUQVRVUyAoKikodWludDE2X3QsIHRHQVRUX0RJU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgdWludDE2X3QsIGNvbnN0IFV1aWQmKT4oCi0gICAgICAgICAgICAgICZHQVRUQ19EaXNjb3ZlciksCi0gICAgICAgICAgY29ubl9pZCwgR0FUVF9ESVNDX1NSVkNfQllfVVVJRCwgMHgwMDAxLCAweEZGRkYsIHNydmNfdXVpZCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0dldFNlcnZpY2VzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBzZXJ2aWNlcyBvbiB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgc2VydmVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRCB3aGljaCBpZGVudGlmeSB0aGUgc2VydmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyBsaXN0IG9mIGdhdHQ6OlNlcnZpY2Ugb3IgTlVMTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3Qgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+KiBCVEFfR0FUVENfR2V0U2VydmljZXModWludDE2X3QgY29ubl9pZCkgewotICByZXR1cm4gYnRhX2dhdHRjX2dldF9zZXJ2aWNlcyhjb25uX2lkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmluZCB0aGUgY2hhcmFjdGVyaXN0aWMgb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGdpdmVuIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElEIHdoaWNoIGlkZW50aWZ5IHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIGNoYXJhY3RlcmlzdGljIGhhbmRsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyBwb2ludGVyIHRvIGdhdHQ6OkNoYXJhY3RlcmlzdGljIG9yIE5VTEwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHJldHVybiBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfR2V0RGVzY3JpcHRvcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmluZCB0aGUgY2hhcmFjdGVyaXN0aWMgb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGdpdmVuIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElEIHdoaWNoIGlkZW50aWZ5IHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIGRlc2NyaXB0b3IgaGFuZGxlCi0gKgotICogUmV0dXJucyAgICAgICAgICByZXR1cm5zIHBvaW50ZXIgdG8gZ2F0dDo6RGVzY3JpcHRvciBvciBOVUxMLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBnYXR0OjpEZXNjcmlwdG9yKiBCVEFfR0FUVENfR2V0RGVzY3JpcHRvcih1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHJldHVybiBidGFfZ2F0dGNfZ2V0X2Rlc2NyaXB0b3IoY29ubl9pZCwgaGFuZGxlKTsKLX0KLQotLyogUmV0dXJuIGNoYXJhY3RlcmlzdGljIHRoYXQgb3ducyBkZXNjcmlwdG9yIHdpdGggaGFuZGxlIGVxdWFsIHRvIHxoYW5kbGV8LCBvcgotICogTlVMTCAqLwotY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIEJUQV9HQVRUQ19HZXRPd25pbmdDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIHsKLSAgcmV0dXJuIGJ0YV9nYXR0Y19nZXRfb3duaW5nX2NoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSk7Ci19Ci0KLS8qIFJldHVybiBzZXJ2aWNlIHRoYXQgb3ducyBkZXNjcmlwdG9yIG9yIGNoYXJhY3RlcmlzdGljIHdpdGggaGFuZGxlIGVxdWFsIHRvCi0gKiB8aGFuZGxlfCwgb3IgTlVMTCAqLwotY29uc3QgZ2F0dDo6U2VydmljZSogQlRBX0dBVFRDX0dldE93bmluZ1NlcnZpY2UodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICByZXR1cm4gYnRhX2dhdHRjX2dldF9zZXJ2aWNlX2Zvcl9oYW5kbGUoY29ubl9pZCwgaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19HZXRHYXR0RGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgR0FUVCBkYXRhYmFzZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gSUQgd2hpY2ggaWRlbnRpZnkgdGhlIHNlcnZlci4KLSAqICAgICAgICAgICAgICAgICAgZGI6IG91dHB1dCBwYXJhbWV0ZXIgd2hpY2ggd2lsbCBjb250YWluIHRoZSBHQVRUIGRhdGFiYXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBjb3B5LiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCi0gKiAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gZGF0YWJhc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX0dldEdhdHREYih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBzdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZW5kX2hhbmRsZSwgYnRnYXR0X2RiX2VsZW1lbnRfdCoqIGRiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY291bnQpIHsKLSAgYnRhX2dhdHRjX2dldF9nYXR0X2RiKGNvbm5faWQsIHN0YXJ0X2hhbmRsZSwgZW5kX2hhbmRsZSwgZGIsIGNvdW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYSBjaGFyYWN0ZXJpc3RpY3MgdmFsdWUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElELgotICogICAgICAgICAgICAgICAgICBoYW5kbGUgLSBjaGFyYWN0ZXJpdGljIGhhbmRsZSB0byByZWFkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVBRF9PUF9DQiBjYWxsYmFjaywgdm9pZCogY2JfZGF0YSkgewotICB0QlRBX0dBVFRDX0FQSV9SRUFEKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9HQVRUQ19BUElfUkVBRCopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9HQVRUQ19BUElfUkVBRCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX1JFQURfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPmF1dGhfcmVxID0gYXV0aF9yZXE7Ci0gIHBfYnVmLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIHBfYnVmLT5yZWFkX2NiID0gY2FsbGJhY2s7Ci0gIHBfYnVmLT5yZWFkX2NiX2RhdGEgPSBjYl9kYXRhOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIHZhbHVlIG9mIGNoYXJhY3RlcmlzdGljIHdpdGggdXVpZCBlcXVhbCB0bwotICogfHV1aWR8Ci0gKi8KLXZvaWQgQlRBX0dBVFRDX1JlYWRVc2luZ0NoYXJVdWlkKHVpbnQxNl90IGNvbm5faWQsIGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzX2hhbmRsZSwgdWludDE2X3QgZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVBRF9PUF9DQiBjYWxsYmFjaywgdm9pZCogY2JfZGF0YSkgewotICB0QlRBX0dBVFRDX0FQSV9SRUFEKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9HQVRUQ19BUElfUkVBRCopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9HQVRUQ19BUElfUkVBRCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX1JFQURfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPmF1dGhfcmVxID0gYXV0aF9yZXE7Ci0gIHBfYnVmLT5oYW5kbGUgPSAwOwotICBwX2J1Zi0+dXVpZCA9IHV1aWQ7Ci0gIHBfYnVmLT5zX2hhbmRsZSA9IHNfaGFuZGxlOwotICBwX2J1Zi0+ZV9oYW5kbGUgPSBlX2hhbmRsZTsKLSAgcF9idWYtPnJlYWRfY2IgPSBjYWxsYmFjazsKLSAgcF9idWYtPnJlYWRfY2JfZGF0YSA9IGNiX2RhdGE7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19SZWFkQ2hhckRlc2NyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIGEgZGVzY3JpcHRvciB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElELgotICogICAgICAgICAgICAgICAgICBoYW5kbGUgLSBkZXNjcmlwdG9yIGhhbmRsZSB0byByZWFkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19SZWFkQ2hhckRlc2NyKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsIEdBVFRfUkVBRF9PUF9DQiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2JfZGF0YSkgewotICB0QlRBX0dBVFRDX0FQSV9SRUFEKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9HQVRUQ19BUElfUkVBRCopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9HQVRUQ19BUElfUkVBRCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX1JFQURfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPmF1dGhfcmVxID0gYXV0aF9yZXE7Ci0gIHBfYnVmLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIHBfYnVmLT5yZWFkX2NiID0gY2FsbGJhY2s7Ci0gIHBfYnVmLT5yZWFkX2NiX2RhdGEgPSBjYl9kYXRhOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfUmVhZE11bHRpcGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIG11bHRpcGxlIGNoYXJhY3RlcmlzdGljIG9yCi0gKiAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3JzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpbm8gSUQuCi0gKiAgICAgICAgICAgICAgICAgICAgcF9yZWFkX211bHRpIC0gcG9pbnRlciB0byB0aGUgcmVhZCBtdWx0aXBsZSBwYXJhbWV0ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1JlYWRNdWx0aXBsZSh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDX01VTFRJKiBwX3JlYWRfbXVsdGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEpIHsKLSAgdEJUQV9HQVRUQ19BUElfUkVBRF9NVUxUSSogcF9idWYgPQotICAgICAgKHRCVEFfR0FUVENfQVBJX1JFQURfTVVMVEkqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVENfQVBJX1JFQURfTVVMVEkpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0dBVFRDX0FQSV9SRUFEX01VTFRJX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGNvbm5faWQ7Ci0gIHBfYnVmLT5hdXRoX3JlcSA9IGF1dGhfcmVxOwotICBwX2J1Zi0+bnVtX2F0dHIgPSBwX3JlYWRfbXVsdGktPm51bV9hdHRyOwotCi0gIGlmIChwX2J1Zi0+bnVtX2F0dHIgPiAwKQotICAgIG1lbWNweShwX2J1Zi0+aGFuZGxlcywgcF9yZWFkX211bHRpLT5oYW5kbGVzLAotICAgICAgICAgICBzaXplb2YodWludDE2X3QpICogcF9yZWFkX211bHRpLT5udW1fYXR0cik7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19Xcml0ZUNoYXJWYWx1ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gd3JpdGUgY2hhcmFjdGVyaXN0aWMgdmFsdWUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkIC0gY29ubmVjdGlvbiBJRC4KLSAqICAgICAgICAgICAgICAgICAgaGFuZGxlIC0gY2hhcmFjdGVyaXN0aWMgaGFuZGxlIHRvIHdyaXRlLgotICogICAgICAgICAgICAgICAgICB3cml0ZV90eXBlIC0gdHlwZSBvZiB3cml0ZS4KLSAqICAgICAgICAgICAgICAgICAgdmFsdWUgLSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2FsbGJhY2ssIHZvaWQqIGNiX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19BUElfV1JJVEUqIHBfYnVmID0gKHRCVEFfR0FUVENfQVBJX1dSSVRFKilvc2lfY2FsbG9jKAotICAgICAgc2l6ZW9mKHRCVEFfR0FUVENfQVBJX1dSSVRFKSArIHZhbHVlLnNpemUoKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUQ19BUElfV1JJVEVfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPmF1dGhfcmVxID0gYXV0aF9yZXE7Ci0gIHBfYnVmLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIHBfYnVmLT53cml0ZV90eXBlID0gd3JpdGVfdHlwZTsKLSAgcF9idWYtPmxlbiA9IHZhbHVlLnNpemUoKTsKLSAgcF9idWYtPndyaXRlX2NiID0gY2FsbGJhY2s7Ci0gIHBfYnVmLT53cml0ZV9jYl9kYXRhID0gY2JfZGF0YTsKLQotICBpZiAodmFsdWUuc2l6ZSgpID4gMCkgewotICAgIHBfYnVmLT5wX3ZhbHVlID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+cF92YWx1ZSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gd3JpdGUgZGVzY3JpcHRvciB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElECi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIGRlc2NyaXB0b3IgaGFkbGUgdG8gd3JpdGUuCi0gKiAgICAgICAgICAgICAgICAgIHZhbHVlIC0gdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1dyaXRlQ2hhckRlc2NyKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNhbGxiYWNrLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIHRCVEFfR0FUVENfQVBJX1dSSVRFKiBwX2J1ZiA9ICh0QlRBX0dBVFRDX0FQSV9XUklURSopb3NpX2NhbGxvYygKLSAgICAgIHNpemVvZih0QlRBX0dBVFRDX0FQSV9XUklURSkgKyB2YWx1ZS5zaXplKCkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX1dSSVRFX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGNvbm5faWQ7Ci0gIHBfYnVmLT5hdXRoX3JlcSA9IGF1dGhfcmVxOwotICBwX2J1Zi0+aGFuZGxlID0gaGFuZGxlOwotICBwX2J1Zi0+d3JpdGVfdHlwZSA9IEdBVFRfV1JJVEU7Ci0gIHBfYnVmLT53cml0ZV9jYiA9IGNhbGxiYWNrOwotICBwX2J1Zi0+d3JpdGVfY2JfZGF0YSA9IGNiX2RhdGE7Ci0KLSAgaWYgKHZhbHVlLnNpemUoKSAhPSAwKSB7Ci0gICAgcF9idWYtPnBfdmFsdWUgPSAodWludDhfdCopKHBfYnVmICsgMSk7Ci0gICAgcF9idWYtPmxlbiA9IHZhbHVlLnNpemUoKTsKLSAgICBtZW1jcHkocF9idWYtPnBfdmFsdWUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKLSAgfQotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfUHJlcGFyZVdyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcmVwYXJlIHdyaXRlIGEgY2hhcmFjdGVyaXN0aWMKLSAqICAgICAgICAgICAgICAgICAgdmFsdWUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkIC0gY29ubmVjdGlvbiBJRC4KLSAqICAgICAgICAgICAgICAgICAgcF9jaGFyX2lkIC0gR0FUVCBjaGFyYWN0ZXJpdGljIElEIG9mIHRoZSBzZXJ2aWNlLgotICogICAgICAgICAgICAgICAgICBvZmZzZXQgLSBvZmZzZXQgb2YgdGhlIHdyaXRlIHZhbHVlLgotICogICAgICAgICAgICAgICAgICB2YWx1ZSAtIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19QcmVwYXJlV3JpdGUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2FsbGJhY2ssIHZvaWQqIGNiX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19BUElfV1JJVEUqIHBfYnVmID0gKHRCVEFfR0FUVENfQVBJX1dSSVRFKilvc2lfY2FsbG9jKAotICAgICAgc2l6ZW9mKHRCVEFfR0FUVENfQVBJX1dSSVRFKSArIHZhbHVlLnNpemUoKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUQ19BUElfV1JJVEVfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPmF1dGhfcmVxID0gYXV0aF9yZXE7Ci0gIHBfYnVmLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIHBfYnVmLT53cml0ZV9jYiA9IGNhbGxiYWNrOwotICBwX2J1Zi0+d3JpdGVfY2JfZGF0YSA9IGNiX2RhdGE7Ci0KLSAgcF9idWYtPndyaXRlX3R5cGUgPSBCVEFfR0FUVENfV1JJVEVfUFJFUEFSRTsKLSAgcF9idWYtPm9mZnNldCA9IG9mZnNldDsKLSAgcF9idWYtPmxlbiA9IHZhbHVlLnNpemUoKTsKLQotICBpZiAodmFsdWUuc2l6ZSgpID4gMCkgewotICAgIHBfYnVmLT5wX3ZhbHVlID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+cF92YWx1ZSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5zaXplKCkpOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19FeGVjdXRlV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGV4ZWN1dGUgd3JpdGUgYSBwcmVwYXJlIHdyaXRlCi0gKiAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgICAgaXNfZXhlY3V0ZSAtIGV4ZWN1dGUgb3IgY2FuY2VsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19FeGVjdXRlV3JpdGUodWludDE2X3QgY29ubl9pZCwgYm9vbCBpc19leGVjdXRlKSB7Ci0gIHRCVEFfR0FUVENfQVBJX0VYRUMqIHBfYnVmID0KLSAgICAgICh0QlRBX0dBVFRDX0FQSV9FWEVDKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0dBVFRDX0FQSV9FWEVDKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUQ19BUElfRVhFQ19FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBjb25uX2lkOwotICBwX2J1Zi0+aXNfZXhlY3V0ZSA9IGlzX2V4ZWN1dGU7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBoYW5kbGUgdmFsdWUgY29uZmlybWF0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgIGNpZAotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBjaWQpIHsKLSAgdEJUQV9HQVRUQ19BUElfQ09ORklSTSogcF9idWYgPQotICAgICAgKHRCVEFfR0FUVENfQVBJX0NPTkZJUk0qKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVENfQVBJX0NPTkZJUk0pKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGNvbm5faWQ9IiA8PCArY29ubl9pZCA8PCAiIGNpZD0weCIgPDwgc3RkOjpoZXgKLSAgICAgICAgICA8PCArY2lkOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVENfQVBJX0NPTkZJUk1fRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPmNpZCA9IGNpZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBhCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjbGllbnRfaWYgLSBjbGllbnQgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICBiZGEgLSB0YXJnZXQgR0FUVCBzZXJ2ZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIEdBVFQgY2hhcmFjdGVyaXN0aWMgaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgT0sgaWYgcmVnaXN0cmF0aW9uIHN1Y2NlZWQsIG90aGVyd2lzZSBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJlZzsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfSUxMRUdBTF9QQVJBTUVURVI7Ci0gIHVpbnQ4X3QgaTsKLQotICBpZiAoIWhhbmRsZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcmVnaXN0cmF0aW9uIGZhaWxlZCwgaGFuZGxlIGlzIDAiOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwX2NscmVnID0gYnRhX2dhdHRjX2NsX2dldF9yZWdjYihjbGllbnRfaWYpOwotICBpZiAocF9jbHJlZyAhPSBOVUxMKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19OT1RJRl9SRUdfTUFYOyBpKyspIHsKLSAgICAgIGlmIChwX2NscmVnLT5ub3RpZl9yZWdbaV0uaW5fdXNlICYmCi0gICAgICAgICAgcF9jbHJlZy0+bm90aWZfcmVnW2ldLnJlbW90ZV9iZGEgPT0gYmRhICYmCi0gICAgICAgICAgcF9jbHJlZy0+bm90aWZfcmVnW2ldLmhhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJub3RpZmljYXRpb24gYWxyZWFkeSByZWdpc3RlcmVkIjsKLSAgICAgICAgc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVENfTk9USUZfUkVHX01BWDsgaSsrKSB7Ci0gICAgICAgIGlmICghcF9jbHJlZy0+bm90aWZfcmVnW2ldLmluX3VzZSkgewotICAgICAgICAgIG1lbXNldCgodm9pZCopJnBfY2xyZWctPm5vdGlmX3JlZ1tpXSwgMCwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKHRCVEFfR0FUVENfTk9USUZfUkVHKSk7Ci0KLSAgICAgICAgICBwX2NscmVnLT5ub3RpZl9yZWdbaV0uaW5fdXNlID0gdHJ1ZTsKLSAgICAgICAgICBwX2NscmVnLT5ub3RpZl9yZWdbaV0ucmVtb3RlX2JkYSA9IGJkYTsKLQotICAgICAgICAgIHBfY2xyZWctPm5vdGlmX3JlZ1tpXS5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgICAgc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaSA9PSBCVEFfR0FUVENfTk9USUZfUkVHX01BWCkgewotICAgICAgICBzdGF0dXMgPSBHQVRUX05PX1JFU09VUkNFUzsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWF4IE5vdGlmaWNhdGlvbiBSZWFjaGVkLCByZWdpc3RyYXRpb24gZmFpbGVkLiI7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgImNsaWVudF9pZj0iIDw8ICtjbGllbnRfaWYgPDwgIiBOb3QgUmVnaXN0ZXJlZCI7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZS1yZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIG9mIGEKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNsaWVudF9pZiAtIGNsaWVudCBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGEgLSB0YXJnZXQgR0FUVCBzZXJ2ZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIEdBVFQgY2hhcmFjdGVyaXN0aWMgaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgT0sgaWYgZGVyZWdpc3RyYXRpb24gc3VjY2VlZCwgb3RoZXJ3aXNlIGZhaWxlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyh0R0FUVF9JRiBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIGlmICghaGFuZGxlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGhhbmRsZSBpcyAwIjsKLSAgICByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgfQotCi0gIHRCVEFfR0FUVENfUkNCKiBwX2NscmVnID0gYnRhX2dhdHRjX2NsX2dldF9yZWdjYihjbGllbnRfaWYpOwotICBpZiAocF9jbHJlZyA9PSBOVUxMKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGNsaWVudF9pZj0iIDw8ICtjbGllbnRfaWYKLSAgICAgICAgICAgICAgIDw8ICIgbm90IHJlZ2lzdGVyZWQgYmRfYWRkcj0iIDw8IGJkYTsKLSAgICByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0dBVFRDX05PVElGX1JFR19NQVg7IGkrKykgewotICAgIGlmIChwX2NscmVnLT5ub3RpZl9yZWdbaV0uaW5fdXNlICYmCi0gICAgICAgIHBfY2xyZWctPm5vdGlmX3JlZ1tpXS5yZW1vdGVfYmRhID09IGJkYSAmJgotICAgICAgICBwX2NscmVnLT5ub3RpZl9yZWdbaV0uaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGRlcmVnaXN0ZXJlZCBiZF9hZGRyPSIgPDwgYmRhOwotICAgICAgbWVtc2V0KCZwX2NscmVnLT5ub3RpZl9yZWdbaV0sIDAsIHNpemVvZih0QlRBX0dBVFRDX05PVElGX1JFRykpOwotICAgICAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLSAgICB9Ci0gIH0KLQotICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgcmVnaXN0cmF0aW9uIG5vdCBmb3VuZCBiZF9hZGRyPSIgPDwgYmRhOwotICByZXR1cm4gR0FUVF9FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19SZWZyZXNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWZyZXNoIHRoZSBzZXJ2ZXIgY2FjaGUgb2YgdGhlIHJlbW90ZSBkZXZpY2UKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHJlbW90ZV9iZGE6IHJlbW90ZSBkZXZpY2UgQkQgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVENfUmVmcmVzaChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRhX2dhdHRjX3Byb2Nlc3NfYXBpX3JlZnJlc2gsIHJlbW90ZV9iZGEpKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0Y19jYWNoZS5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0Y19jYWNoZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkN2QzNy4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dGNfY2FjaGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBHQVRUIGNsaWVudCBkaXNjb3ZlcnkgcHJvY2VkdXJlcyBhbmQgY2FjaGUKLSAqICByZWxhdGVkIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0YV9nYXR0YyIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvZ2F0dC9idGFfZ2F0dGNfaW50LmgiCi0jaW5jbHVkZSAiYnRhL2dhdHQvZGF0YWJhc2UuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIGdhdHQ6OkNoYXJhY3RlcmlzdGljOwotdXNpbmcgZ2F0dDo6RGF0YWJhc2U7Ci11c2luZyBnYXR0OjpEYXRhYmFzZUJ1aWxkZXI7Ci11c2luZyBnYXR0OjpEZXNjcmlwdG9yOwotdXNpbmcgZ2F0dDo6SW5jbHVkZWRTZXJ2aWNlOwotdXNpbmcgZ2F0dDo6U2VydmljZTsKLXVzaW5nIGdhdHQ6OlN0b3JlZEF0dHJpYnV0ZTsKLQotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2NhY2hlX3dyaXRlKGNvbnN0IFJhd0FkZHJlc3MmIHNlcnZlcl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3RvcmVkQXR0cmlidXRlPiYgYXR0cik7Ci1zdGF0aWMgdEdBVFRfU1RBVFVTIGJ0YV9nYXR0Y19zZHBfc2VydmljZV9kaXNjKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfU0VSViogcF9zZXJ2ZXJfY2IpOwotY29uc3QgRGVzY3JpcHRvciogYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yX3NyY2IodEJUQV9HQVRUQ19TRVJWKiBwX3NyY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpOwotY29uc3QgQ2hhcmFjdGVyaXN0aWMqIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYih0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKTsKLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19leHBsb3JlX3NydmNfZmluaXNoZWQodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19TRVJWKiBwX3NydmNfY2IpOwotCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfcmVhZF9kYl9oYXNoX2NtcGwodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19PUF9DTVBMKiBwX2RhdGEpOwotCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfcmVhZF9leHRfcHJvcF9kZXNjX2NtcGwodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19PUF9DTVBMKiBwX2RhdGEpOwotCi0vLyBkZWZpbmUgdGhlIG1heCByZXRyeSBjb3VudCBmb3IgREFUQUJBU0VfT1VUX09GX1NZTkMKLSNkZWZpbmUgQlRBX0dBVFRDX0RJU0NPVkVSX1JFVFJZX0NPVU5UIDIKLQotI2RlZmluZSBCVEFfR0FUVF9TRFBfREJfU0laRSA0MDk2Ci0KLSNkZWZpbmUgR0FUVF9DQUNIRV9QUkVGSVggIi9kYXRhL21pc2MvYmx1ZXRvb3RoL2dhdHRfY2FjaGVfIgotI2RlZmluZSBHQVRUX0NBQ0hFX1ZFUlNJT04gNgotCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfZ2VuZXJhdGVfY2FjaGVfZmlsZV9uYW1lKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9sZW4sICIlcyUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsIEdBVFRfQ0FDSEVfUFJFRklYLAotICAgICAgICAgICBiZGEuYWRkcmVzc1swXSwgYmRhLmFkZHJlc3NbMV0sIGJkYS5hZGRyZXNzWzJdLCBiZGEuYWRkcmVzc1szXSwKLSAgICAgICAgICAgYmRhLmFkZHJlc3NbNF0sIGJkYS5hZGRyZXNzWzVdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9zZHBfZGI7Ci0gIHVpbnQxNl90IHNkcF9jb25uX2lkOwotfSB0QlRBX0dBVFRDX0NCX0RBVEE7Ci0KLSNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKLS8qIHV0aWxpdHkgZnVuY3Rpb25zICovCi0KLS8qIGRlYnVnIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHNlcnZlciBjYWNoZSAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2Rpc3BsYXlfY2FjaGVfc2VydmVyKGNvbnN0IERhdGFiYXNlJiBkYXRhYmFzZSkgewotICBMT0coSU5GTykgPDwgIjw9LS0tLS0tLS0tLS0tLS09U3RhcnQgU2VydmVyIENhY2hlID0tLS0tLS0tLS0tLT0+IjsKLSAgc3RkOjppc3RyaW5nc3RyZWFtIGlzcyhkYXRhYmFzZS5Ub1N0cmluZygpKTsKLSAgZm9yIChzdGQ6OnN0cmluZyBsaW5lOyBzdGQ6OmdldGxpbmUoaXNzLCBsaW5lKTspIHsKLSAgICBMT0coSU5GTykgPDwgbGluZTsKLSAgfQotICBMT0coSU5GTykgPDwgIjw9LS0tLS0tLS0tLS0tLS09RW5kIFNlcnZlciBDYWNoZSA9LS0tLS0tLS0tLS09PiI7Ci19Ci0KLS8qKiBkZWJ1ZyBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBleHBsb3JhdGlvbiBsaXN0ICovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfZGlzcGxheV9leHBsb3JlX3JlY29yZChjb25zdCBEYXRhYmFzZUJ1aWxkZXImIGRhdGFiYXNlKSB7Ci0gIExPRyhJTkZPKSA8PCAiPD0tLS0tLS0tLS0tLS0tLT1TdGFydCBFeHBsb3JlIFF1ZXVlID0tLS0tLS0tLS0tLT0+IjsKLSAgc3RkOjppc3RyaW5nc3RyZWFtIGlzcyhkYXRhYmFzZS5Ub1N0cmluZygpKTsKLSAgZm9yIChzdGQ6OnN0cmluZyBsaW5lOyBzdGQ6OmdldGxpbmUoaXNzLCBsaW5lKTspIHsKLSAgICBMT0coSU5GTykgPDwgbGluZTsKLSAgfQotICBMT0coSU5GTykgPDwgIjw9LS0tLS0tLS0tLS0tLS09IEVuZCBFeHBsb3JlIFF1ZXVlID0tLS0tLS0tLS0tLT0+IjsKLX0KLSNlbmRpZiAvKiBCVEFfR0FUVF9ERUJVRyA9PSBUUlVFICovCi0KLS8qKiBJbml0aWFsaXplIHRoZSBkYXRhYmFzZSBjYWNoZSBhbmQgZGlzY292ZXJ5IHJlbGF0ZWQgcmVzb3VyY2VzICovCi12b2lkIGJ0YV9nYXR0Y19pbml0X2NhY2hlKHRCVEFfR0FUVENfU0VSViogcF9zcnZjX2NiKSB7Ci0gIHBfc3J2Y19jYi0+Z2F0dF9kYXRhYmFzZSA9IGdhdHQ6OkRhdGFiYXNlKCk7Ci0gIHBfc3J2Y19jYi0+cGVuZGluZ19kaXNjb3ZlcnkuQ2xlYXIoKTsKLX0KLQotY29uc3QgU2VydmljZSogYnRhX2dhdHRjX2ZpbmRfbWF0Y2hpbmdfc2VydmljZSgKLSAgICBjb25zdCBzdGQ6Omxpc3Q8U2VydmljZT4mIHNlcnZpY2VzLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgZm9yIChjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICBpZiAoaGFuZGxlID49IHNlcnZpY2UuaGFuZGxlICYmIGhhbmRsZSA8PSBzZXJ2aWNlLmVuZF9oYW5kbGUpCi0gICAgICByZXR1cm4gJnNlcnZpY2U7Ci0gIH0KLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLyoqIFN0YXJ0IHByaW1hcnkgc2VydmljZSBkaXNjb3ZlcnkgKi8KLXRHQVRUX1NUQVRVUyBidGFfZ2F0dGNfZGlzY292ZXJfcHJpX3NlcnZpY2UodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19TRVJWKiBwX3NlcnZlcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgaWYgKCFwX2NsY2IpIHJldHVybiBHQVRUX0VSUk9SOwotCi0gIGlmIChwX2NsY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICByZXR1cm4gR0FUVENfRGlzY292ZXIoY29ubl9pZCwgZGlzY190eXBlLCAweDAwMDEsIDB4RkZGRik7Ci0gIH0KLQotICAvLyBvbmx5IGZvciBDbGFzc2ljIHRyYW5zcG9ydAotICByZXR1cm4gYnRhX2dhdHRjX3NkcF9zZXJ2aWNlX2Rpc2MoY29ubl9pZCwgcF9zZXJ2ZXJfY2IpOwotfQotCi0vKiogc3RhcnQgZXhwbG9yaW5nIG5leHQgc2VydmljZSwgb3IgZmluaXNoIGRpc2NvdmVyeSBpZiBubyBtb3JlIHNlcnZpY2VzIGxlZnQKLSAqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2V4cGxvcmVfbmV4dF9zZXJ2aWNlKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19TRVJWKiBwX3NydmNfY2IpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gIGlmICghcF9jbGNiKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAidW5rbm93biBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3NydmNfY2ItPnBlbmRpbmdfZGlzY292ZXJ5LlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKSB7Ci0gICAgY29uc3QgYXV0byYgc2VydmljZSA9Ci0gICAgICAgIHBfc3J2Y19jYi0+cGVuZGluZ19kaXNjb3ZlcnkuQ3VycmVudGx5RXhwbG9yZWRTZXJ2aWNlKCk7Ci0gICAgVkxPRygxKSA8PCAiU3RhcnQgc2VydmljZSBkaXNjb3ZlcnkiOwotCi0gICAgLyogc3RhcnQgZGlzY292ZXJpbmcgaW5jbHVkZWQgc2VydmljZXMgKi8KLSAgICBHQVRUQ19EaXNjb3Zlcihjb25uX2lkLCBHQVRUX0RJU0NfSU5DX1NSVkMsIHNlcnZpY2UuZmlyc3QsIHNlcnZpY2Uuc2Vjb25kKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gTm8gbW9yZSBzZXJ2aWNlcyB0byBkaXNjb3ZlcgotCi0gIC8vIEFzIHBhcnQgb2Ygc2VydmljZSBkaXNjb3ZlcnksIHJlYWQgdGhlIHZhbHVlcyBvZiAiQ2hhcmFjdGVyaXN0aWMgRXh0ZW5kZWQKLSAgLy8gUHJvcGVydGllcyIgZGVzY3JpcHRvcgotICBjb25zdCBhdXRvJiBkZXNjcmlwdG9ycyA9Ci0gICAgICBwX3NydmNfY2ItPnBlbmRpbmdfZGlzY292ZXJ5LkRlc2NyaXB0b3JIYW5kbGVzVG9SZWFkKCk7Ci0gIGlmICghZGVzY3JpcHRvcnMuZW1wdHkoKSkgewotICAgIC8vIHNldCByZXF1ZXN0IGZpZWxkIHRvIFJFQURfRVhUX1BST1BfREVTQwotICAgIHBfY2xjYi0+cmVxdWVzdF9kdXJpbmdfZGlzY292ZXJ5ID0KLSAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1JFUV9SRUFEX0VYVF9QUk9QX0RFU0M7Ci0KLSAgICBpZiAocF9zcnZjX2NiLT5yZWFkX211bHRpcGxlX25vdF9zdXBwb3J0ZWQgfHwgZGVzY3JpcHRvcnMuc2l6ZSgpID09IDEpIHsKLSAgICAgIHRHQVRUX1JFQURfUEFSQU0gcmVhZF9wYXJhbXsKLSAgICAgICAgICAuYnlfaGFuZGxlID0gey5oYW5kbGUgPSBkZXNjcmlwdG9ycy5mcm9udCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgLmF1dGhfcmVxID0gR0FUVF9BVVRIX1JFUV9OT05FfX07Ci0gICAgICBHQVRUQ19SZWFkKGNvbm5faWQsIEdBVFRfUkVBRF9CWV9IQU5ETEUsICZyZWFkX3BhcmFtKTsKLSAgICAgIC8vIGFzeW5jaHJvbm91cyBjb250aW51YXRpb24gaW4gYnRhX2dhdHRjX29wX2NtcGxfZHVyaW5nX2Rpc2NvdmVyeQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRPRE8oanBhd2xvd3NraSk6IGFzIGEgbGltaXQgd2Ugc2hvdWxkIHVzZSBNVFUvMiByYXRoZXIgdGhhbgotICAgIC8vIEdBVFRfTUFYX1JFQURfTVVMVElfSEFORExFUwotICAgIC8qIGVhY2ggZGVzY3JpcHRvciBjb250YWlucyBqdXN0IDIgYnl0ZXMsIHNvIHJlc3BvbnNlIHNpemUgaXMgc2FtZSBhcwotICAgICAqIHJlcXVlc3Qgc2l6ZSAqLwotICAgIHNpemVfdCBudW1faGFuZGxlcyA9Ci0gICAgICAgIHN0ZDo6bWluKGRlc2NyaXB0b3JzLnNpemUoKSwgKHNpemVfdClHQVRUX01BWF9SRUFEX01VTFRJX0hBTkRMRVMpOwotCi0gICAgdEdBVFRfUkVBRF9QQVJBTSByZWFkX3BhcmFtOwotICAgIG1lbXNldCgmcmVhZF9wYXJhbSwgMCwgc2l6ZW9mKHRHQVRUX1JFQURfUEFSQU0pKTsKLQotICAgIHJlYWRfcGFyYW0ucmVhZF9tdWx0aXBsZS5udW1faGFuZGxlcyA9IG51bV9oYW5kbGVzOwotICAgIHJlYWRfcGFyYW0ucmVhZF9tdWx0aXBsZS5hdXRoX3JlcSA9IEdBVFRfQVVUSF9SRVFfTk9ORTsKLSAgICBtZW1jcHkoJnJlYWRfcGFyYW0ucmVhZF9tdWx0aXBsZS5oYW5kbGVzLCBkZXNjcmlwdG9ycy5kYXRhKCksCi0gICAgICAgICAgIHNpemVvZih1aW50MTZfdCkgKiBudW1faGFuZGxlcyk7Ci0gICAgR0FUVENfUmVhZChjb25uX2lkLCBHQVRUX1JFQURfTVVMVElQTEUsICZyZWFkX3BhcmFtKTsKLQotICAgIC8vIGFzeW5jaHJvbm91cyBjb250aW51YXRpb24gaW4gYnRhX2dhdHRjX29wX2NtcGxfZHVyaW5nX2Rpc2NvdmVyeQotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9nYXR0Y19leHBsb3JlX3NydmNfZmluaXNoZWQoY29ubl9pZCwgcF9zcnZjX2NiKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2V4cGxvcmVfc3J2Y19maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1NFUlYqIHBfc3J2Y19jYikgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgaWYgKCFwX2NsY2IpIHsKLSAgICBMT0coRVJST1IpIDw8ICJ1bmtub3duIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogbm8gc2VydmljZSBmb3VuZCBhdCBhbGwsIHRoZSBlbmQgb2Ygc2VydmVyIGRpc2NvdmVyeSovCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2aWNlIGRpc2NvdmVyeSBmaW5pc2hlZCI7Ci0KLSAgcF9zcnZjX2NiLT5nYXR0X2RhdGFiYXNlID0gcF9zcnZjX2NiLT5wZW5kaW5nX2Rpc2NvdmVyeS5CdWlsZCgpOwotCi0jaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCi0gIGJ0YV9nYXR0Y19kaXNwbGF5X2NhY2hlX3NlcnZlcihwX3NydmNfY2ItPmdhdHRfZGF0YWJhc2UpOwotI2VuZGlmCi0gIC8qIHNhdmUgY2FjaGUgdG8gTlYgKi8KLSAgcF9jbGNiLT5wX3NyY2ItPnN0YXRlID0gQlRBX0dBVFRDX1NFUlZfU0FWRTsKLQotICBpZiAoYnRtX3NlY19pc19hX2JvbmRlZF9kZXYocF9zcnZjX2NiLT5zZXJ2ZXJfYmRhKSkgewotICAgIGJ0YV9nYXR0Y19jYWNoZV93cml0ZShwX2NsY2ItPnBfc3JjYi0+c2VydmVyX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbGNiLT5wX3NyY2ItPmdhdHRfZGF0YWJhc2UuU2VyaWFsaXplKCkpOwotICB9Ci0KLSAgLy8gQWZ0ZXIgc3VjY2VzcywgcmVzZXQgdGhlIGNvdW50LgotICBpZiAoYnRhX2dhdHRjX2lzX3JvYnVzdF9jYWNoaW5nX2VuYWJsZWQoKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICA8PCAiOiBzZXJ2aWNlIGRpc2NvdmVyeSBzdWNjZWVkLCByZXNldCBjb3VudCB0byB6ZXJvLCBjb25uX2lkPSIKLSAgICAgICAgICAgICAgPDwgbG9naGV4KGNvbm5faWQpOwotICAgIHBfc3J2Y19jYi0+c3J2Y19kaXNjX2NvdW50ID0gMDsKLSAgfQotCi0gIGJ0YV9nYXR0Y19yZXNldF9kaXNjb3Zlcl9zdChwX2NsY2ItPnBfc3JjYiwgR0FUVF9TVUNDRVNTKTsKLX0KLQotLyoqIFN0YXJ0IGRpc2NvdmVyeSBmb3IgY2hhcmFjdGVyaXN0aWMgZGVzY3JpcHRvciAqLwotdm9pZCBidGFfZ2F0dGNfc3RhcnRfZGlzY19jaGFyX2RzY3AodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfU0VSViogcF9zcnZjX2NiKSB7Ci0gIFZMT0coMSkgPDwgInN0YXJ0aW5nIGRpc2NvdmVyIGNoYXJhY3RlcmlzdGljcyBkZXNjcmlwdG9yIjsKLQotICBzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PiByYW5nZSA9Ci0gICAgICBwX3NydmNfY2ItPnBlbmRpbmdfZGlzY292ZXJ5Lk5leHREZXNjcmlwdG9yUmFuZ2VUb0V4cGxvcmUoKTsKLSAgaWYgKHJhbmdlID09IERhdGFiYXNlQnVpbGRlcjo6RVhQTE9SRV9FTkQpIHsKLSAgICBnb3RvIGRlc2NyaXB0b3JfZGlzY292ZXJ5X2RvbmU7Ci0gIH0KLQotICBpZiAoR0FUVENfRGlzY292ZXIoY29ubl9pZCwgR0FUVF9ESVNDX0NIQVJfRFNDUFQsIHJhbmdlLmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2Vjb25kKSAhPSAwKSB7Ci0gICAgZ290byBkZXNjcmlwdG9yX2Rpc2NvdmVyeV9kb25lOwotICB9Ci0gIHJldHVybjsKLQotZGVzY3JpcHRvcl9kaXNjb3ZlcnlfZG9uZToKLSAgLyogYWxsIGNoYXJhY3RlcmlzdGljIGhhcyBiZWVuIGV4cGxvcmVkLCBzdGFydCB3aXRoIG5leHQgc2VydmljZSBpZiBhbnkgKi8KLSAgRFZMT0coMykgPDwgImFsbCBjaGFyYWN0ZXJpc3RpY3MgZXhwbG9yZWQiOwotCi0gIGJ0YV9nYXR0Y19leHBsb3JlX25leHRfc2VydmljZShjb25uX2lkLCBwX3NydmNfY2IpOwotICByZXR1cm47Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIGRpc2NvdmVyeSByZXN1bHQgZnJvbSBzZHAgKi8KLXZvaWQgYnRhX2dhdHRjX3NkcF9jYWxsYmFjayh0U0RQX1NUQVRVUyBzZHBfc3RhdHVzLCBjb25zdCB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19DQl9EQVRBKiBjYl9kYXRhID0gKHRCVEFfR0FUVENfQ0JfREFUQSopdXNlcl9kYXRhOwotICB0QlRBX0dBVFRDX1NFUlYqIHBfc3J2Y19jYiA9IGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQoY2JfZGF0YS0+c2RwX2Nvbm5faWQpOwotCi0gIGlmIChwX3NydmNfY2IgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgIkdBVFQgc2VydmljZSBkaXNjb3ZlcnkgaXMgZG9uZSBvbiB1bmtub3duIGNvbm5lY3Rpb24iOwotICAgIC8qIGFsbG9jYXRlZCBpbiBidGFfZ2F0dGNfc2RwX3NlcnZpY2VfZGlzYyAqLwotICAgIG9zaV9mcmVlKGNiX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICgoc2RwX3N0YXR1cyAhPSBTRFBfU1VDQ0VTUykgJiYgKHNkcF9zdGF0dXMgIT0gU0RQX0RCX0ZVTEwpKSB7Ci0gICAgYnRhX2dhdHRjX2V4cGxvcmVfc3J2Y19maW5pc2hlZChjYl9kYXRhLT5zZHBfY29ubl9pZCwgcF9zcnZjX2NiKTsKLQotICAgIC8qIGFsbG9jYXRlZCBpbiBidGFfZ2F0dGNfc2RwX3NlcnZpY2VfZGlzYyAqLwotICAgIG9zaV9mcmVlKGNiX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgbm9fcGVuZGluZ19kaXNjID0gIXBfc3J2Y19jYi0+cGVuZGluZ19kaXNjb3ZlcnkuSW5Qcm9ncmVzcygpOwotCi0gIHRTRFBfRElTQ19SRUMqIHBfc2RwX3JlYyA9IFNEUF9GaW5kU2VydmljZUluRGIoY2JfZGF0YS0+cF9zZHBfZGIsIDAsIG51bGxwdHIpOwotICB3aGlsZSAocF9zZHBfcmVjICE9IG51bGxwdHIpIHsKLSAgICAvKiBmaW5kIGEgc2VydmljZSByZWNvcmQsIHJlcG9ydCBpdCAqLwotICAgIFV1aWQgc2VydmljZV91dWlkOwotICAgIGlmICghU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjKHBfc2RwX3JlYywgJnNlcnZpY2VfdXVpZCkpIGNvbnRpbnVlOwotCi0gICAgdFNEUF9QUk9UT0NPTF9FTEVNIHBlOwotICAgIGlmICghU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9zZHBfcmVjLCBVVUlEX1BST1RPQ09MX0FUVCwgJnBlKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgdWludDE2X3Qgc3RhcnRfaGFuZGxlID0gKHVpbnQxNl90KXBlLnBhcmFtc1swXTsKLSAgICB1aW50MTZfdCBlbmRfaGFuZGxlID0gKHVpbnQxNl90KXBlLnBhcmFtc1sxXTsKLQotI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQotICAgIFZMT0coMSkgPDwgIkZvdW5kIEFUVCBzZXJ2aWNlIHV1aWQ9IiA8PCBzZXJ2aWNlX3V1aWQKLSAgICAgICAgICAgIDw8ICIsIHNfaGFuZGxlPSIgPDwgbG9naGV4KHN0YXJ0X2hhbmRsZSkKLSAgICAgICAgICAgIDw8ICIsIGVfaGFuZGxlPSIgPDwgbG9naGV4KGVuZF9oYW5kbGUpOwotI2VuZGlmCi0KLSAgICBpZiAoIUdBVFRfSEFORExFX0lTX1ZBTElEKHN0YXJ0X2hhbmRsZSkgfHwKLSAgICAgICAgIUdBVFRfSEFORExFX0lTX1ZBTElEKGVuZF9oYW5kbGUpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIHN0YXJ0X2hhbmRsZT0iIDw8IGxvZ2hleChzdGFydF9oYW5kbGUpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGVuZF9oYW5kbGU9IiA8PCBsb2doZXgoZW5kX2hhbmRsZSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBkaXNjb3ZlciBzZXJ2aWNlcyByZXN1bHQsIGFkZCBzZXJ2aWNlcyBpbnRvIGEgc2VydmljZSBsaXN0ICovCi0gICAgcF9zcnZjX2NiLT5wZW5kaW5nX2Rpc2NvdmVyeS5BZGRTZXJ2aWNlKHN0YXJ0X2hhbmRsZSwgZW5kX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV91dWlkLCB0cnVlKTsKLQotICAgIHBfc2RwX3JlYyA9IFNEUF9GaW5kU2VydmljZUluRGIoY2JfZGF0YS0+cF9zZHBfZGIsIDAsIHBfc2RwX3JlYyk7Ci0gIH0KLQotICAvLyBJZiBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBwZW5kaW5nLCBubyBuZWVkIHRvIGNhbGwKLSAgLy8gYnRhX2dhdHRjX2V4cGxvcmVfbmV4dF9zZXJ2aWNlLiBOZXh0IHNlcnZpY2Ugd2lsbCBiZSBwaWNrZWQgdXAgdG8gZGlzY292ZXJ5Ci0gIC8vIG9uY2UgY3VycmVudCBvbmUgaXMgZGlzY292ZXJlZC4gSWYgZGlzY292ZXJ5IGlzIG5vdCBwZW5kaW5nLCBzdGFydCBvbmUKLSAgaWYgKG5vX3BlbmRpbmdfZGlzYykgewotICAgIGJ0YV9nYXR0Y19leHBsb3JlX25leHRfc2VydmljZShjYl9kYXRhLT5zZHBfY29ubl9pZCwgcF9zcnZjX2NiKTsKLSAgfQotCi0gIC8qIGFsbG9jYXRlZCBpbiBidGFfZ2F0dGNfc2RwX3NlcnZpY2VfZGlzYyAqLwotICBvc2lfZnJlZShjYl9kYXRhKTsKLX0KLQotLyogU3RhcnQgRFNQIFNlcnZpY2UgRGlzY292ZXJ5ICovCi1zdGF0aWMgdEdBVFRfU1RBVFVTIGJ0YV9nYXR0Y19zZHBfc2VydmljZV9kaXNjKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfU0VSViogcF9zZXJ2ZXJfY2IpIHsKLSAgdWludDE2X3QgbnVtX2F0dHJzID0gMjsKLSAgdWludDE2X3QgYXR0cl9saXN0WzJdOwotCi0gIC8qCi0gICAqIE9uIHN1Y2Nlc3MsIGNiX2RhdGEgd2lsbCBiZSBmcmVlZCBpbnNpZGUgYnRhX2dhdHRjX3NkcF9jYWxsYmFjaywKLSAgICogb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZnJlZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24uCi0gICAqLwotICB0QlRBX0dBVFRDX0NCX0RBVEEqIGNiX2RhdGEgPSAodEJUQV9HQVRUQ19DQl9EQVRBKilvc2lfbWFsbG9jKAotICAgICAgc2l6ZW9mKHRCVEFfR0FUVENfQ0JfREFUQSkgKyBCVEFfR0FUVF9TRFBfREJfU0laRSk7Ci0KLSAgY2JfZGF0YS0+cF9zZHBfZGIgPSAodFNEUF9ESVNDT1ZFUllfREIqKShjYl9kYXRhICsgMSk7Ci0gIGF0dHJfbGlzdFswXSA9IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUOwotICBhdHRyX2xpc3RbMV0gPSBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVDsKLQotICBVdWlkIHV1aWQgPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9QUk9UT0NPTF9BVFQpOwotICBTRFBfSW5pdERpc2NvdmVyeURiKGNiX2RhdGEtPnBfc2RwX2RiLCBCVEFfR0FUVF9TRFBfREJfU0laRSwgMSwgJnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgbnVtX2F0dHJzLCBhdHRyX2xpc3QpOwotCi0gIGlmICghU0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0MigKLSAgICAgICAgICBwX3NlcnZlcl9jYi0+c2VydmVyX2JkYSwgY2JfZGF0YS0+cF9zZHBfZGIsICZidGFfZ2F0dGNfc2RwX2NhbGxiYWNrLAotICAgICAgICAgIGNvbnN0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHN0YXRpY19jYXN0PHZvaWQqPihjYl9kYXRhKSkpKSB7Ci0gICAgb3NpX2ZyZWUoY2JfZGF0YSk7Ci0gICAgcmV0dXJuIEdBVFRfRVJST1I7Ci0gIH0KLQotICBjYl9kYXRhLT5zZHBfY29ubl9pZCA9IGNvbm5faWQ7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci0KLS8qKiBvcGVyYXRpb24gY29tcGxldGVkICovCi12b2lkIGJ0YV9nYXR0Y19vcF9jbXBsX2R1cmluZ19kaXNjb3ZlcnkodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgLy8gQ3VycmVudGx5LCB0aGVyZSBhcmUgdHdvIGNhc2VzIG5lZWRlZCB0byBiZSBoYW5kbGVkLgotICAvLyAxLiBSZWFkIGV4dCBwcm9wIGRlc2NyaXB0b3IgdmFsdWUgYWZ0ZXIgc2VydmljZSBkaXNjb3ZlcnkKLSAgLy8gMi4gUmVhZCBkYiBoYXNoIGJlZm9yZSBzdGFydGluZyBzZXJ2aWNlIGRpc2NvdmVyeQotICBzd2l0Y2ggKHBfY2xjYi0+cmVxdWVzdF9kdXJpbmdfZGlzY292ZXJ5KSB7Ci0gICAgY2FzZSBCVEFfR0FUVENfRElTQ09WRVJfUkVRX1JFQURfRVhUX1BST1BfREVTQzoKLSAgICAgIGJ0YV9nYXR0Y19yZWFkX2V4dF9wcm9wX2Rlc2NfY21wbChwX2NsY2IsICZwX2RhdGEtPm9wX2NtcGwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfR0FUVENfRElTQ09WRVJfUkVRX1JFQURfREJfSEFTSDoKLSAgICAgIGlmIChidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpKSB7Ci0gICAgICAgIGJ0YV9nYXR0Y19yZWFkX2RiX2hhc2hfY21wbChwX2NsY2IsICZwX2RhdGEtPm9wX2NtcGwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gaXQgaXMgbm90IHBvc3NpYmxlIGhlcmUgaWYgZmxhZyBpcyBvZmYsIGJ1dCBqdXN0IGluIGNhc2UKLSAgICAgICAgcF9jbGNiLT5yZXF1ZXN0X2R1cmluZ19kaXNjb3ZlcnkgPSBCVEFfR0FUVENfRElTQ09WRVJfUkVRX05PTkU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9HQVRUQ19ESVNDT1ZFUl9SRVFfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIEdBVFQgY2xpZW50IHN0YWNrICovCi12b2lkIGJ0YV9nYXR0Y19kaXNjX3Jlc19jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRElTQ19SRVMqIHBfZGF0YSkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgdEJUQV9HQVRUQ19TRVJWKiBwX3NydmNfY2IgPSBidGFfZ2F0dGNfZmluZF9zY2JfYnlfY2lkKGNvbm5faWQpOwotCi0gIGlmICghcF9zcnZjX2NiIHx8ICFwX2NsY2IgfHwgcF9jbGNiLT5zdGF0ZSAhPSBCVEFfR0FUVENfRElTQ09WRVJfU1QpIHJldHVybjsKLQotICBzd2l0Y2ggKGRpc2NfdHlwZSkgewotICAgIGNhc2UgR0FUVF9ESVNDX1NSVkNfQUxMOgotICAgIGNhc2UgR0FUVF9ESVNDX1NSVkNfQllfVVVJRDoKLSAgICAgIHBfc3J2Y19jYi0+cGVuZGluZ19kaXNjb3ZlcnkuQWRkU2VydmljZSgKLSAgICAgICAgICBwX2RhdGEtPmhhbmRsZSwgcF9kYXRhLT52YWx1ZS5ncm91cF92YWx1ZS5lX2hhbmRsZSwKLSAgICAgICAgICBwX2RhdGEtPnZhbHVlLmdyb3VwX3ZhbHVlLnNlcnZpY2VfdHlwZSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9ESVNDX0lOQ19TUlZDOgotICAgICAgcF9zcnZjX2NiLT5wZW5kaW5nX2Rpc2NvdmVyeS5BZGRJbmNsdWRlZFNlcnZpY2UoCi0gICAgICAgICAgcF9kYXRhLT5oYW5kbGUsIHBfZGF0YS0+dmFsdWUuaW5jbF9zZXJ2aWNlLnNlcnZpY2VfdHlwZSwKLSAgICAgICAgICBwX2RhdGEtPnZhbHVlLmluY2xfc2VydmljZS5zX2hhbmRsZSwKLSAgICAgICAgICBwX2RhdGEtPnZhbHVlLmluY2xfc2VydmljZS5lX2hhbmRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9ESVNDX0NIQVI6Ci0gICAgICBwX3NydmNfY2ItPnBlbmRpbmdfZGlzY292ZXJ5LkFkZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgIHBfZGF0YS0+aGFuZGxlLCBwX2RhdGEtPnZhbHVlLmRjbHJfdmFsdWUudmFsX2hhbmRsZSwKLSAgICAgICAgICBwX2RhdGEtPnZhbHVlLmRjbHJfdmFsdWUuY2hhcl91dWlkLAotICAgICAgICAgIHBfZGF0YS0+dmFsdWUuZGNscl92YWx1ZS5jaGFyX3Byb3ApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19DSEFSX0RTQ1BUOgotICAgICAgcF9zcnZjX2NiLT5wZW5kaW5nX2Rpc2NvdmVyeS5BZGREZXNjcmlwdG9yKHBfZGF0YS0+aGFuZGxlLCBwX2RhdGEtPnR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19NQVg6Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgaWxsZWdhbCBkaXNjb3ZlcnkgaXRlbSIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBidGFfZ2F0dGNfZGlzY19jbXBsX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgdEJUQV9HQVRUQ19TRVJWKiBwX3NydmNfY2IgPSBidGFfZ2F0dGNfZmluZF9zY2JfYnlfY2lkKGNvbm5faWQpOwotCi0gIGlmIChwX2NsY2IgJiYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MgfHwgcF9jbGNiLT5zdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSkgewotICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSBwX2NsY2ItPnN0YXR1cyA9IHN0YXR1czsKLQotICAgIC8vIGlmIGRiIG91dCBvZiBzeW5jIGlzIHJlY2VpdmVkLCB0cnkgdG8gc3RhcnQgc2VydmljZSBkaXNjb3ZlcnkgaWYgcG9zc2libGUKLSAgICBpZiAoYnRhX2dhdHRjX2lzX3JvYnVzdF9jYWNoaW5nX2VuYWJsZWQoKSAmJgotICAgICAgICBzdGF0dXMgPT0gR0FUVF9EQVRBQkFTRV9PVVRfT0ZfU1lOQykgewotICAgICAgaWYgKHBfc3J2Y19jYiAmJgotICAgICAgICAgIHBfc3J2Y19jYi0+c3J2Y19kaXNjX2NvdW50IDwgQlRBX0dBVFRDX0RJU0NPVkVSX1JFVFJZX0NPVU5UKSB7Ci0gICAgICAgIHBfc3J2Y19jYi0+c3J2Y19kaXNjX2NvdW50Kys7Ci0gICAgICAgIHBfY2xjYi0+YXV0b191cGRhdGUgPSBCVEFfR0FUVENfRElTQ19XQUlUSU5HOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IHJldHJ5IGxpbWl0IGV4Y2VlZHMgZm9yIGRiIG91dCBvZiBzeW5jLCBjb25uX2lkPSIKLSAgICAgICAgICAgICAgICAgICA8PCBjb25uX2lkOwotICAgICAgfQotICAgIH0KLQotICAgIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHBfY2xjYiwgQlRBX0dBVFRDX0RJU0NPVkVSX0NNUExfRVZULCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXBfc3J2Y19jYikgcmV0dXJuOwotCi0gIHN3aXRjaCAoZGlzY190eXBlKSB7Ci0gICAgY2FzZSBHQVRUX0RJU0NfU1JWQ19BTEw6Ci0gICAgY2FzZSBHQVRUX0RJU0NfU1JWQ19CWV9VVUlEOgotLy8gZGVmaW5pdGlvbiBvZiBhbGwgc2VydmljZXMgYXJlIGRpc2NvdmVyZWQsIG5vdyBpdCdzIHRpbWUgdG8gZGlzY292ZXIKLS8vIHRoZWlyIGNvbnRlbnQKLSNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKLSAgICAgIGJ0YV9nYXR0Y19kaXNwbGF5X2V4cGxvcmVfcmVjb3JkKHBfc3J2Y19jYi0+cGVuZGluZ19kaXNjb3ZlcnkpOwotI2VuZGlmCi0gICAgICBidGFfZ2F0dGNfZXhwbG9yZV9uZXh0X3NlcnZpY2UoY29ubl9pZCwgcF9zcnZjX2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX0RJU0NfSU5DX1NSVkM6IHsKLSAgICAgIGF1dG8mIHNlcnZpY2UgPSBwX3NydmNfY2ItPnBlbmRpbmdfZGlzY292ZXJ5LkN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpOwotICAgICAgLyogc3RhcnQgZGlzY292ZXJpbmcgY2hhcmFjdGVyaXN0aWMgKi8KLSAgICAgIEdBVFRDX0Rpc2NvdmVyKGNvbm5faWQsIEdBVFRfRElTQ19DSEFSLCBzZXJ2aWNlLmZpcnN0LCBzZXJ2aWNlLnNlY29uZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19DSEFSOiB7Ci0jaWYgKEJUQV9HQVRUX0RFQlVHID09IFRSVUUpCi0gICAgICBidGFfZ2F0dGNfZGlzcGxheV9leHBsb3JlX3JlY29yZChwX3NydmNfY2ItPnBlbmRpbmdfZGlzY292ZXJ5KTsKLSNlbmRpZgotICAgICAgYnRhX2dhdHRjX3N0YXJ0X2Rpc2NfY2hhcl9kc2NwKGNvbm5faWQsIHBfc3J2Y19jYik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19DSEFSX0RTQ1BUOgotICAgICAgLyogc3RhcnQgZGlzY292ZXJpbmcgbmV4dCBjaGFyYWN0ZXJpc3RpYyBmb3IgY2hhciBkZXNjcmlwdG9yICovCi0gICAgICBidGFfZ2F0dGNfc3RhcnRfZGlzY19jaGFyX2RzY3AoY29ubl9pZCwgcF9zcnZjX2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX0RJU0NfTUFYOgotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIGlsbGVnYWwgZGlzY292ZXJ5IGl0ZW0iKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKiBzZWFyY2ggbG9jYWwgY2FjaGUgZm9yIG1hdGNoaW5nIHNlcnZpY2UgcmVjb3JkICovCi12b2lkIGJ0YV9nYXR0Y19zZWFyY2hfc2VydmljZSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwgVXVpZCogcF91dWlkKSB7Ci0gIGZvciAoY29uc3QgU2VydmljZSYgc2VydmljZSA6IHBfY2xjYi0+cF9zcmNiLT5nYXR0X2RhdGFiYXNlLlNlcnZpY2VzKCkpIHsKLSAgICBpZiAocF91dWlkICYmICpwX3V1aWQgIT0gc2VydmljZS51dWlkKSBjb250aW51ZTsKLQotI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgImZvdW5kIHNlcnZpY2UgIiA8PCBzZXJ2aWNlLnV1aWQKLSAgICAgICAgICAgIDw8ICIgaGFuZGxlOiIgPDwgK3NlcnZpY2UuaGFuZGxlOwotI2VuZGlmCi0gICAgaWYgKCFwX2NsY2ItPnBfcmNiLT5wX2NiYWNrKSBjb250aW51ZTsKLQotICAgIHRCVEFfR0FUVEMgY2JfZGF0YTsKLSAgICBtZW1zZXQoJmNiX2RhdGEsIDAsIHNpemVvZih0QlRBX0dBVFRDKSk7Ci0gICAgY2JfZGF0YS5zcnZjX3Jlcy5jb25uX2lkID0gcF9jbGNiLT5idGFfY29ubl9pZDsKLSAgICBjYl9kYXRhLnNydmNfcmVzLnNlcnZpY2VfdXVpZC5pbnN0X2lkID0gc2VydmljZS5oYW5kbGU7Ci0gICAgY2JfZGF0YS5zcnZjX3Jlcy5zZXJ2aWNlX3V1aWQudXVpZCA9IHNlcnZpY2UudXVpZDsKLQotICAgICgqcF9jbGNiLT5wX3JjYi0+cF9jYmFjaykoQlRBX0dBVFRDX1NFQVJDSF9SRVNfRVZULCAmY2JfZGF0YSk7Ci0gIH0KLX0KLQotY29uc3Qgc3RkOjpsaXN0PFNlcnZpY2U+KiBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VzX3NyY2IodEJUQV9HQVRUQ19TRVJWKiBwX3NyY2IpIHsKLSAgaWYgKCFwX3NyY2IgfHwgcF9zcmNiLT5nYXR0X2RhdGFiYXNlLklzRW1wdHkoKSkgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuICZwX3NyY2ItPmdhdHRfZGF0YWJhc2UuU2VydmljZXMoKTsKLX0KLQotY29uc3Qgc3RkOjpsaXN0PFNlcnZpY2U+KiBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VzKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0KLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiA9IHBfY2xjYi0+cF9zcmNiOwotCi0gIHJldHVybiBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VzX3NyY2IocF9zcmNiKTsKLX0KLQotY29uc3QgU2VydmljZSogYnRhX2dhdHRjX2dldF9zZXJ2aWNlX2Zvcl9oYW5kbGVfc3JjYih0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIGNvbnN0IHN0ZDo6bGlzdDxTZXJ2aWNlPiogc2VydmljZXMgPSBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VzX3NyY2IocF9zcmNiKTsKLSAgaWYgKHNlcnZpY2VzID09IE5VTEwpIHJldHVybiBOVUxMOwotICByZXR1cm4gYnRhX2dhdHRjX2ZpbmRfbWF0Y2hpbmdfc2VydmljZSgqc2VydmljZXMsIGhhbmRsZSk7Ci19Ci0KLWNvbnN0IFNlcnZpY2UqIGJ0YV9nYXR0Y19nZXRfc2VydmljZV9mb3JfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIHsKLSAgY29uc3Qgc3RkOjpsaXN0PFNlcnZpY2U+KiBzZXJ2aWNlcyA9IGJ0YV9nYXR0Y19nZXRfc2VydmljZXMoY29ubl9pZCk7Ci0gIGlmIChzZXJ2aWNlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYnRhX2dhdHRjX2ZpbmRfbWF0Y2hpbmdfc2VydmljZSgqc2VydmljZXMsIGhhbmRsZSk7Ci19Ci0KLWNvbnN0IENoYXJhY3RlcmlzdGljKiBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljX3NyY2IodEJUQV9HQVRUQ19TRVJWKiBwX3NyY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICBjb25zdCBTZXJ2aWNlKiBzZXJ2aWNlID0KLSAgICAgIGJ0YV9nYXR0Y19nZXRfc2VydmljZV9mb3JfaGFuZGxlX3NyY2IocF9zcmNiLCBoYW5kbGUpOwotCi0gIGlmICghc2VydmljZSkgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChjb25zdCBDaGFyYWN0ZXJpc3RpYyYgY2hhcmFjIDogc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgaWYgKGhhbmRsZSA9PSBjaGFyYWMudmFsdWVfaGFuZGxlKSByZXR1cm4gJmNoYXJhYzsKLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBDaGFyYWN0ZXJpc3RpYyogYnRhX2dhdHRjX2dldF9jaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiID0gYnRhX2dhdHRjX2ZpbmRfY2xjYl9ieV9jb25uX2lkKGNvbm5faWQpOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgdEJUQV9HQVRUQ19TRVJWKiBwX3NyY2IgPSBwX2NsY2ItPnBfc3JjYjsKLSAgcmV0dXJuIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYihwX3NyY2IsIGhhbmRsZSk7Ci19Ci0KLWNvbnN0IERlc2NyaXB0b3IqIGJ0YV9nYXR0Y19nZXRfZGVzY3JpcHRvcl9zcmNiKHRCVEFfR0FUVENfU0VSViogcF9zcmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIGNvbnN0IFNlcnZpY2UqIHNlcnZpY2UgPQotICAgICAgYnRhX2dhdHRjX2dldF9zZXJ2aWNlX2Zvcl9oYW5kbGVfc3JjYihwX3NyY2IsIGhhbmRsZSk7Ci0KLSAgaWYgKCFzZXJ2aWNlKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmb3IgKGNvbnN0IENoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICBmb3IgKGNvbnN0IERlc2NyaXB0b3ImIGRlc2MgOiBjaGFyYWMuZGVzY3JpcHRvcnMpIHsKLSAgICAgIGlmIChoYW5kbGUgPT0gZGVzYy5oYW5kbGUpIHJldHVybiAmZGVzYzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgRGVzY3JpcHRvciogYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLQotICBpZiAocF9jbGNiID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gIHRCVEFfR0FUVENfU0VSViogcF9zcmNiID0gcF9jbGNiLT5wX3NyY2I7Ci0gIHJldHVybiBidGFfZ2F0dGNfZ2V0X2Rlc2NyaXB0b3Jfc3JjYihwX3NyY2IsIGhhbmRsZSk7Ci19Ci0KLWNvbnN0IENoYXJhY3RlcmlzdGljKiBidGFfZ2F0dGNfZ2V0X293bmluZ19jaGFyYWN0ZXJpc3RpY19zcmNiKAotICAgIHRCVEFfR0FUVENfU0VSViogcF9zcmNiLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgY29uc3QgU2VydmljZSogc2VydmljZSA9Ci0gICAgICBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZV9zcmNiKHBfc3JjYiwgaGFuZGxlKTsKLQotICBpZiAoIXNlcnZpY2UpIHJldHVybiBOVUxMOwotCi0gIGZvciAoY29uc3QgQ2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcykgewotICAgIGZvciAoY29uc3QgRGVzY3JpcHRvciYgZGVzYyA6IGNoYXJhYy5kZXNjcmlwdG9ycykgewotICAgICAgaWYgKGhhbmRsZSA9PSBkZXNjLmhhbmRsZSkgcmV0dXJuICZjaGFyYWM7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IENoYXJhY3RlcmlzdGljKiBidGFfZ2F0dGNfZ2V0X293bmluZ19jaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgaWYgKCFwX2NsY2IpIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBidGFfZ2F0dGNfZ2V0X293bmluZ19jaGFyYWN0ZXJpc3RpY19zcmNiKHBfY2xjYi0+cF9zcmNiLCBoYW5kbGUpOwotfQotCi0vKiByZXF1ZXN0IHJlYWRpbmcgZGF0YWJhc2UgaGFzaCAqLwotYm9vbCBidGFfZ2F0dGNfcmVhZF9kYl9oYXNoKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiKSB7Ci0gIHRHQVRUX1JFQURfUEFSQU0gcmVhZF9wYXJhbTsKLSAgbWVtc2V0KCZyZWFkX3BhcmFtLCAwLCBzaXplb2YodEdBVFRfUkVBRF9CWV9UWVBFKSk7Ci0KLSAgcmVhZF9wYXJhbS5jaGFyX3R5cGUuc19oYW5kbGUgPSAweDAwMDE7Ci0gIHJlYWRfcGFyYW0uY2hhcl90eXBlLmVfaGFuZGxlID0gMHhGRkZGOwotICByZWFkX3BhcmFtLmNoYXJfdHlwZS51dWlkID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9EQVRBQkFTRV9IQVNIKTsKLSAgcmVhZF9wYXJhbS5jaGFyX3R5cGUuYXV0aF9yZXEgPSBHQVRUX0FVVEhfUkVRX05PTkU7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPQotICAgICAgR0FUVENfUmVhZChwX2NsY2ItPmJ0YV9jb25uX2lkLCBHQVRUX1JFQURfQllfVFlQRSwgJnJlYWRfcGFyYW0pOwotCi0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSByZXR1cm4gZmFsc2U7Ci0gIHBfY2xjYi0+cmVxdWVzdF9kdXJpbmdfZGlzY292ZXJ5ID0gQlRBX0dBVFRDX0RJU0NPVkVSX1JFUV9SRUFEX0RCX0hBU0g7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIGhhbmRsZSByZXNwb25zZSBvZiByZWFkaW5nIGRhdGFiYXNlIGhhc2ggKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19yZWFkX2RiX2hhc2hfY21wbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX09QX0NNUEwqIHBfZGF0YSkgewotICB1aW50OF90IG9wID0gKHVpbnQ4X3QpcF9kYXRhLT5vcF9jb2RlOwotICBpZiAob3AgIT0gR0FUVENfT1BUWVBFX1JFQUQpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IG9wID0gIiA8PCArcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfY2xjYi0+cmVxdWVzdF9kdXJpbmdfZGlzY292ZXJ5ID0gQlRBX0dBVFRDX0RJU0NPVkVSX1JFUV9OT05FOwotCi0gIC8vIHJ1biBtYXRjaCBmbG93IG9ubHkgaWYgdGhlIHN0YXR1cyBpcyBzdWNjZXNzCi0gIGJvb2wgbWF0Y2hlZCA9IGZhbHNlOwotICBpZiAocF9kYXRhLT5zdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgLy8gc3RhcnQgdG8gY29tcGFyZSBsb2NhbCBoYXNoIGFuZCByZW1vdGUgaGFzaAotICAgIHVpbnQxNl90IGxlbiA9IHBfZGF0YS0+cF9jbXBsLT5hdHRfdmFsdWUubGVuOwotICAgIHVpbnQ4X3QqIGRhdGEgPSBwX2RhdGEtPnBfY21wbC0+YXR0X3ZhbHVlLnZhbHVlOwotCi0gICAgT2N0ZXQxNiByZW1vdGVfaGFzaDsKLSAgICBpZiAobGVuID09IHJlbW90ZV9oYXNoLnNpemUoKSkgewotICAgICAgdWludDhfdCBpZHggPSAwOwotICAgICAgYXV0byBpdCA9IHJlbW90ZV9oYXNoLmJlZ2luKCk7Ci0gICAgICBmb3IgKDsgaWR4IDwgbGVuOyBpZHgrKywgZGF0YSsrLCBpdCsrKSAqaXQgPSAqZGF0YTsKLQotICAgICAgT2N0ZXQxNiBsb2NhbF9oYXNoID0gcF9jbGNiLT5wX3NyY2ItPmdhdHRfZGF0YWJhc2UuSGFzaCgpOwotICAgICAgbWF0Y2hlZCA9IChsb2NhbF9oYXNoID09IHJlbW90ZV9oYXNoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWF0Y2hlZCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYXNoIGlzIHRoZSBzYW1lLCBza2lwIHNlcnZpY2UgZGlzY292ZXJ5IjsKLSAgICBwX2NsY2ItPnBfc3JjYi0+c3RhdGUgPSBCVEFfR0FUVENfU0VSVl9JRExFOwotICAgIGJ0YV9nYXR0Y19yZXNldF9kaXNjb3Zlcl9zdChwX2NsY2ItPnBfc3JjYiwgR0FUVF9TVUNDRVNTKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogaGFzaCBpcyBub3QgdGhlIHNhbWUsIHN0YXJ0IHNlcnZpY2UgZGlzY292ZXJ5IjsKLSAgICBidGFfZ2F0dGNfc3RhcnRfZGlzY292ZXJfaW50ZXJuYWwocF9jbGNiKTsKLSAgfQotfQotCi0vKiBoYW5kbGUgcmVzcG9uc2Ugb2YgcmVhZGluZyBleHRlbmRlZCBwcm9wZXJ0aWVzIGRlc2NyaXB0b3IgKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19yZWFkX2V4dF9wcm9wX2Rlc2NfY21wbCgKLSAgICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwgY29uc3QgdEJUQV9HQVRUQ19PUF9DTVBMKiBwX2RhdGEpIHsKLSAgdWludDhfdCBvcCA9ICh1aW50OF90KXBfZGF0YS0+b3BfY29kZTsKLSAgaWYgKG9wICE9IEdBVFRDX09QVFlQRV9SRUFEKSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBvcCA9ICIgPDwgK3BfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghcF9jbGNiLT5kaXNjX2FjdGl2ZSkgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogbm90IGFjdGl2ZSBpbiBkaXNjb3ZlciBzdGF0ZSI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfY2xjYi0+cmVxdWVzdF9kdXJpbmdfZGlzY292ZXJ5ID0gQlRBX0dBVFRDX0RJU0NPVkVSX1JFUV9OT05FOwotCi0gIHRCVEFfR0FUVENfU0VSViogcF9zcnZjX2NiID0gcF9jbGNiLT5wX3NyY2I7Ci0gIGNvbnN0IHVpbnQ4X3Qgc3RhdHVzID0gcF9kYXRhLT5zdGF0dXM7Ci0KLSAgaWYgKHN0YXR1cyA9PSBHQVRUX1JFUV9OT1RfU1VQUE9SVEVEICYmCi0gICAgICAhcF9zcnZjX2NiLT5yZWFkX211bHRpcGxlX25vdF9zdXBwb3J0ZWQpIHsKLSAgICAvLyBjYW4ndCBkbyAicmVhZCBtdWx0aXBsZSByZXF1ZXN0IiwgZmFsbCBiYWNrIHRvICJyZWFkIHJlcXVlc3QiCi0gICAgcF9zcnZjX2NiLT5yZWFkX211bHRpcGxlX25vdF9zdXBwb3J0ZWQgPSB0cnVlOwotICAgIGJ0YV9nYXR0Y19leHBsb3JlX25leHRfc2VydmljZShwX2NsY2ItPmJ0YV9jb25uX2lkLCBwX3NydmNfY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJEaXNjb3Zlcnkgb24gc2VydmVyIGZhaWxlZDogIiA8PCBsb2doZXgoc3RhdHVzKTsKLSAgICBidGFfZ2F0dGNfcmVzZXRfZGlzY292ZXJfc3QocF9jbGNiLT5wX3NyY2IsIEdBVFRfRVJST1IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IHRHQVRUX1ZBTFVFJiBhdHRfdmFsdWUgPSBwX2RhdGEtPnBfY21wbC0+YXR0X3ZhbHVlOwotICBpZiAocF9zcnZjX2NiLT5yZWFkX211bHRpcGxlX25vdF9zdXBwb3J0ZWQgJiYgYXR0X3ZhbHVlLmxlbiAhPSAyKSB7Ci0gICAgLy8gSnVzdCBvbmUgQ2hhcmFjdGVyaXN0aWMgRXh0ZW5kZWQgUHJvcGVydGllcyB2YWx1ZSBhdCBhIHRpbWUgaW4gUmVhZAotICAgIC8vIFJlc3BvbnNlCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgUmVhZCBSZXNwb25zZSBzaG91bGQgYmUganVzdCAyIGJ5dGVzISI7Ci0gICAgYnRhX2dhdHRjX3Jlc2V0X2Rpc2NvdmVyX3N0KHBfY2xjYi0+cF9zcmNiLCBHQVRUX0VSUk9SKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBQYXJzaW5nIGlzIHNhbWUgZm9yICJSZWFkIE11bHRpcGxlIFJlc3BvbnNlIiwgYW5kIGZvciAiUmVhZCBSZXNwb25zZSIKLSAgY29uc3QgdWludDhfdCogcCA9IGF0dF92YWx1ZS52YWx1ZTsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHZhbHVlX29mX2Rlc2NyaXB0b3JzOwotICB3aGlsZSAocCA8IGF0dF92YWx1ZS52YWx1ZSArIGF0dF92YWx1ZS5sZW4pIHsKLSAgICB1aW50MTZfdCBleHRlbmRlZF9wcm9wZXJ0aWVzOwotICAgIFNUUkVBTV9UT19VSU5UMTYoZXh0ZW5kZWRfcHJvcGVydGllcywgcCk7Ci0gICAgdmFsdWVfb2ZfZGVzY3JpcHRvcnMucHVzaF9iYWNrKGV4dGVuZGVkX3Byb3BlcnRpZXMpOwotICB9Ci0KLSAgYm9vbCByZXQgPQotICAgICAgcF9zcnZjX2NiLT5wZW5kaW5nX2Rpc2NvdmVyeS5TZXRWYWx1ZU9mRGVzY3JpcHRvcnModmFsdWVfb2ZfZGVzY3JpcHRvcnMpOwotICBpZiAoIXJldCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiIFByb2JsZW0gc2V0dGluZyBFeHRlbmRlZCBQcm9wZXJ0aWVzIGRlc2NyaXB0b3JzIHZhbHVlcyI7Ci0gICAgYnRhX2dhdHRjX3Jlc2V0X2Rpc2NvdmVyX3N0KHBfY2xjYi0+cF9zcmNiLCBHQVRUX0VSUk9SKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDb250aW51ZSBzZXJ2aWNlIGRpc2NvdmVyeQotICBidGFfZ2F0dGNfZXhwbG9yZV9uZXh0X3NlcnZpY2UocF9jbGNiLT5idGFfY29ubl9pZCwgcF9zcnZjX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19maWxsX2dhdHRfZGJfZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbGwgYSBidGdhdHRfZGJfZWxlbWVudF90IHZhbHVlCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0Y19maWxsX2dhdHRfZGJfZWwoYnRnYXR0X2RiX2VsZW1lbnRfdCogcF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2dhdHRfZGJfYXR0cmlidXRlX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dF9oYW5kbGUsIHVpbnQxNl90IHNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVfaGFuZGxlLCB1aW50MTZfdCBpZCwgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByb3ApIHsKLSAgcF9hdHRyLT50eXBlID0gdHlwZTsKLSAgcF9hdHRyLT5hdHRyaWJ1dGVfaGFuZGxlID0gYXR0X2hhbmRsZTsKLSAgcF9hdHRyLT5zdGFydF9oYW5kbGUgPSBzX2hhbmRsZTsKLSAgcF9hdHRyLT5lbmRfaGFuZGxlID0gZV9oYW5kbGU7Ci0gIHBfYXR0ci0+aWQgPSBpZDsKLSAgcF9hdHRyLT5wcm9wZXJ0aWVzID0gcHJvcDsKLQotICAvLyBQZXJtaXNzaW9ucyBhcmUgbm90IGRpc2NvdmVyYWJsZSB1c2luZyB0aGUgYXR0cmlidXRlIHByb3RvY29sLgotICAvLyBDb3JlIDUuMCwgUGFydCBGLCAzLjIuNSBBdHRyaWJ1dGUgUGVybWlzc2lvbnMKLSAgcF9hdHRyLT5wZXJtaXNzaW9ucyA9IDA7Ci0gIHBfYXR0ci0+dXVpZCA9IHV1aWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZXR1cm5zICAgICAgICAgIG51bWJlciBvZiBlbGVtZW50cyBpbnNpZGUgZGIgZnJvbSBzdGFydF9oYW5kbGUgdG8gZW5kX2hhbmRsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzaXplX3QgYnRhX2dhdHRjX2dldF9kYl9zaXplKGNvbnN0IHN0ZDo6bGlzdDxTZXJ2aWNlPiYgc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfaGFuZGxlKSB7Ci0gIGlmIChzZXJ2aWNlcy5lbXB0eSgpKSByZXR1cm4gMDsKLQotICBzaXplX3QgZGJfc2l6ZSA9IDA7Ci0KLSAgZm9yIChjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICBpZiAoc2VydmljZS5oYW5kbGUgPCBzdGFydF9oYW5kbGUpIGNvbnRpbnVlOwotCi0gICAgaWYgKHNlcnZpY2UuZW5kX2hhbmRsZSA+IGVuZF9oYW5kbGUpIGJyZWFrOwotCi0gICAgZGJfc2l6ZSsrOwotCi0gICAgZm9yIChjb25zdCBDaGFyYWN0ZXJpc3RpYyYgY2hhcmFjIDogc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIGRiX3NpemUrKzsKLQotICAgICAgZGJfc2l6ZSArPSBjaGFyYWMuZGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIH0KLQotICAgIGRiX3NpemUgKz0gc2VydmljZS5pbmNsdWRlZF9zZXJ2aWNlcy5zaXplKCk7Ci0gIH0KLQotICByZXR1cm4gZGJfc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19nZXRfZ2F0dF9kYl9pbXBsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBjb3B5IHRoZSBzZXJ2ZXIgR0FUVCBkYXRhYmFzZSBpbnRvIGRiIHBhcmFtZXRlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfc3J2Y19jYjogc2VydmVyLgotICogICAgICAgICAgICAgICAgICBkYjogb3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGNvbnRhaW4gR0FUVCBkYXRhYmFzZSBjb3B5LgotICogICAgICAgICAgICAgICAgICAgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgotICogICAgICAgICAgICAgICAgICBjb3VudDogb3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGNvbnRhaW4gbnVtYmVyIG9mCi0gKiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRjX2dldF9nYXR0X2RiX2ltcGwodEJUQV9HQVRUQ19TRVJWKiBwX3NydmNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRnYXR0X2RiX2VsZW1lbnRfdCoqIGRiLCBpbnQqIGNvdW50KSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18KLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjogc3RhcnRfaGFuZGxlIDB4JTA0eCwgZW5kX2hhbmRsZSAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUsIGVuZF9oYW5kbGUpOwotCi0gIGlmIChwX3NydmNfY2ItPmdhdHRfZGF0YWJhc2UuSXNFbXB0eSgpKSB7Ci0gICAgKmNvdW50ID0gMDsKLSAgICAqZGIgPSBOVUxMOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNpemVfdCBkYl9zaXplID0gYnRhX2dhdHRjX2dldF9kYl9zaXplKHBfc3J2Y19jYi0+Z2F0dF9kYXRhYmFzZS5TZXJ2aWNlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUsIGVuZF9oYW5kbGUpOwotCi0gIHZvaWQqIGJ1ZmZlciA9IG9zaV9tYWxsb2MoZGJfc2l6ZSAqIHNpemVvZihidGdhdHRfZGJfZWxlbWVudF90KSk7Ci0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGN1cnJfZGJfYXR0ciA9IChidGdhdHRfZGJfZWxlbWVudF90KilidWZmZXI7Ci0KLSAgZm9yIChjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlIDogcF9zcnZjX2NiLT5nYXR0X2RhdGFiYXNlLlNlcnZpY2VzKCkpIHsKLSAgICBpZiAoc2VydmljZS5oYW5kbGUgPCBzdGFydF9oYW5kbGUpIGNvbnRpbnVlOwotCi0gICAgaWYgKHNlcnZpY2UuZW5kX2hhbmRsZSA+IGVuZF9oYW5kbGUpIGJyZWFrOwotCi0gICAgYnRhX2dhdHRjX2ZpbGxfZ2F0dF9kYl9lbChjdXJyX2RiX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzX3ByaW1hcnkgPyBCVEdBVFRfREJfUFJJTUFSWV9TRVJWSUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVEdBVFRfREJfU0VDT05EQVJZX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGF0dF9oYW5kbGUgKi8sIHNlcnZpY2UuaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5lbmRfaGFuZGxlLCBzZXJ2aWNlLmhhbmRsZSwgc2VydmljZS51dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBwcm9wICovKTsKLSAgICBjdXJyX2RiX2F0dHIrKzsKLQotICAgIGZvciAoY29uc3QgQ2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgICBidGFfZ2F0dGNfZmlsbF9nYXR0X2RiX2VsKGN1cnJfZGJfYXR0ciwgQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWMudmFsdWVfaGFuZGxlLCAwIC8qIHNfaGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGVfaGFuZGxlICovLCBjaGFyYWMudmFsdWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWMudXVpZCwgY2hhcmFjLnByb3BlcnRpZXMpOwotICAgICAgYnRnYXR0X2RiX2VsZW1lbnRfdCogY2hhcmFjdGVyaXN0aWMgPSBjdXJyX2RiX2F0dHI7Ci0gICAgICBjdXJyX2RiX2F0dHIrKzsKLQotICAgICAgZm9yIChjb25zdCBEZXNjcmlwdG9yJiBkZXNjIDogY2hhcmFjLmRlc2NyaXB0b3JzKSB7Ci0gICAgICAgIGJ0YV9nYXR0Y19maWxsX2dhdHRfZGJfZWwoCi0gICAgICAgICAgICBjdXJyX2RiX2F0dHIsIEJUR0FUVF9EQl9ERVNDUklQVE9SLCBkZXNjLmhhbmRsZSwgMCAvKiBzX2hhbmRsZSAqLywKLSAgICAgICAgICAgIDAgLyogZV9oYW5kbGUgKi8sIGRlc2MuaGFuZGxlLCBkZXNjLnV1aWQsIDAgLyogcHJvcGVydHkgKi8pOwotCi0gICAgICAgIGlmIChkZXNjLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0VYVF9QUk9QKSkgewotICAgICAgICAgIGNoYXJhY3RlcmlzdGljLT5leHRlbmRlZF9wcm9wZXJ0aWVzID0KLSAgICAgICAgICAgICAgZGVzYy5jaGFyYWN0ZXJpc3RpY19leHRlbmRlZF9wcm9wZXJ0aWVzOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJfZGJfYXR0cisrOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY29uc3QgSW5jbHVkZWRTZXJ2aWNlJiBwX2lzdmMgOiBzZXJ2aWNlLmluY2x1ZGVkX3NlcnZpY2VzKSB7Ci0gICAgICBidGFfZ2F0dGNfZmlsbF9nYXR0X2RiX2VsKGN1cnJfZGJfYXR0ciwgQlRHQVRUX0RCX0lOQ0xVREVEX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaXN2Yy5oYW5kbGUsIHBfaXN2Yy5zdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZV9oYW5kbGUgKi8sIHBfaXN2Yy5oYW5kbGUsIHBfaXN2Yy51dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHByb3BlcnR5ICovKTsKLSAgICAgIGN1cnJfZGJfYXR0cisrOwotICAgIH0KLSAgfQotCi0gICpkYiA9IChidGdhdHRfZGJfZWxlbWVudF90KilidWZmZXI7Ci0gICpjb3VudCA9IGRiX3NpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfZ2V0X2dhdHRfZGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNvcHkgdGhlIHNlcnZlciBHQVRUIGRhdGFiYXNlIGludG8gZGIgcGFyYW1ldGVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRCB3aGljaCBpZGVudGlmeSB0aGUgc2VydmVyLgotICogICAgICAgICAgICAgICAgICBkYjogb3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGNvbnRhaW4gR0FUVCBkYXRhYmFzZSBjb3B5LgotICogICAgICAgICAgICAgICAgICAgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgotICogICAgICAgICAgICAgICAgICBjb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfZ2V0X2dhdHRfZGIodWludDE2X3QgY29ubl9pZCwgdWludDE2X3Qgc3RhcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZW5kX2hhbmRsZSwgYnRnYXR0X2RiX2VsZW1lbnRfdCoqIGRiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb3VudCkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLQotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX2NsY2IgPT0gTlVMTCkgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9jbGNiLT5zdGF0ZSAhPSBCVEFfR0FUVENfQ09OTl9TVCkgewotICAgIExPRyhFUlJPUikgPDwgInNlcnZlciBjYWNoZSBub3QgYXZhaWxhYmxlLCBDTENCIHN0YXRlPSIgPDwgK3BfY2xjYi0+c3RhdGU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFwX2NsY2ItPnBfc3JjYiB8fCBwX2NsY2ItPnBfc3JjYi0+cGVuZGluZ19kaXNjb3ZlcnkuSW5Qcm9ncmVzcygpIHx8Ci0gICAgICBwX2NsY2ItPnBfc3JjYi0+Z2F0dF9kYXRhYmFzZS5Jc0VtcHR5KCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJObyBzZXJ2ZXIgY2FjaGUgYXZhaWxhYmxlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfZ2F0dGNfZ2V0X2dhdHRfZGJfaW1wbChwX2NsY2ItPnBfc3JjYiwgc3RhcnRfaGFuZGxlLCBlbmRfaGFuZGxlLCBkYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX2NhY2hlX2xvYWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvYWQgR0FUVCBjYWNoZSBmcm9tIHN0b3JhZ2UgZm9yIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfc3JjYjogcG9pbnRlciB0byBzZXJ2ZXIgY2FjaGUsIHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCBmcm9tIHN0b3JhZ2UKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfZ2F0dGNfY2FjaGVfbG9hZCh0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYikgewotICBjaGFyIGZuYW1lWzI1NV0gPSB7MH07Ci0gIGJ0YV9nYXR0Y19nZW5lcmF0ZV9jYWNoZV9maWxlX25hbWUoZm5hbWUsIHNpemVvZihmbmFtZSksIHBfc3JjYi0+c2VydmVyX2JkYSk7Ci0KLSAgRklMRSogZmQgPSBmb3BlbihmbmFtZSwgInJiIik7Ci0gIGlmICghZmQpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNhbid0IG9wZW4gR0FUVCBjYWNoZSBmaWxlICIgPDwgZm5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgZm9yIHJlYWRpbmcsIGVycm9yOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1aW50MTZfdCBjYWNoZV92ZXIgPSAwOwotICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgdWludDE2X3QgbnVtX2F0dHIgPSAwOwotCi0gIGlmIChmcmVhZCgmY2FjaGVfdmVyLCBzaXplb2YodWludDE2X3QpLCAxLCBmZCkgIT0gMSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2FuJ3QgcmVhZCBHQVRUIGNhY2hlIHZlcnNpb24gZnJvbTogIiA8PCBmbmFtZTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLQotICBpZiAoY2FjaGVfdmVyICE9IEdBVFRfQ0FDSEVfVkVSU0lPTikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogd3JvbmcgR0FUVCBjYWNoZSB2ZXJzaW9uOiAiIDw8IGZuYW1lOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIGlmIChmcmVhZCgmbnVtX2F0dHIsIHNpemVvZih1aW50MTZfdCksIDEsIGZkKSAhPSAxKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogY2FuJ3QgcmVhZCBudW1iZXIgb2YgR0FUVCBhdHRyaWJ1dGVzOiAiIDw8IGZuYW1lOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIHsKLSAgICBzdGQ6OnZlY3RvcjxTdG9yZWRBdHRyaWJ1dGU+IGF0dHIobnVtX2F0dHIpOwotCi0gICAgaWYgKGZyZWFkKGF0dHIuZGF0YSgpLCBzaXplb2YoU3RvcmVkQXR0cmlidXRlKSwgbnVtX2F0dHIsIGZkKSAhPSBudW1fYXR0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiczogY2FuJ3QgcmVhZCBHQVRUIGF0dHJpYnV0ZXM6ICIgPDwgZm5hbWU7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gICAgcF9zcmNiLT5nYXR0X2RhdGFiYXNlID0gZ2F0dDo6RGF0YWJhc2U6OkRlc2VyaWFsaXplKGF0dHIsICZzdWNjZXNzKTsKLSAgfQotCi1kb25lOgotICBmY2xvc2UoZmQpOwotICByZXR1cm4gc3VjY2VzczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19jYWNoZV93cml0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IEdBVFQgd2hlbiBhIHNlcnZlcgotICogICAgICAgICAgICAgICAgICBjYWNoZSBpcyBhdmFpbGFibGUgdG8gc2F2ZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHNlcnZlcl9iZGE6IHNlcnZlciBiZCBhZGRyZXNzIG9mIHRoaXMgY2FjaGUgYmVsb25ncyB0bwotICogICAgICAgICAgICAgICAgICBhdHRyOiBhdHRyaWJ1dGVzIHRvIHNhdmUuCi0gKiBSZXR1cm5zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9nYXR0Y19jYWNoZV93cml0ZShjb25zdCBSYXdBZGRyZXNzJiBzZXJ2ZXJfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFN0b3JlZEF0dHJpYnV0ZT4mIGF0dHIpIHsKLSAgY2hhciBmbmFtZVsyNTVdID0gezB9OwotICBidGFfZ2F0dGNfZ2VuZXJhdGVfY2FjaGVfZmlsZV9uYW1lKGZuYW1lLCBzaXplb2YoZm5hbWUpLCBzZXJ2ZXJfYmRhKTsKLQotICBGSUxFKiBmZCA9IGZvcGVuKGZuYW1lLCAid2IiKTsKLSAgaWYgKCFmZCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IGNhbid0IG9wZW4gR0FUVCBjYWNoZSBmaWxlIGZvciB3cml0aW5nOiAiIDw8IGZuYW1lOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQxNl90IGNhY2hlX3ZlciA9IEdBVFRfQ0FDSEVfVkVSU0lPTjsKLSAgaWYgKGZ3cml0ZSgmY2FjaGVfdmVyLCBzaXplb2YodWludDE2X3QpLCAxLCBmZCkgIT0gMSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2FuJ3Qgd3JpdGUgR0FUVCBjYWNoZSB2ZXJzaW9uOiAiIDw8IGZuYW1lOwotICAgIGZjbG9zZShmZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgbnVtX2F0dHIgPSBhdHRyLnNpemUoKTsKLSAgaWYgKGZ3cml0ZSgmbnVtX2F0dHIsIHNpemVvZih1aW50MTZfdCksIDEsIGZkKSAhPSAxKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogY2FuJ3Qgd3JpdGUgR0FUVCBjYWNoZSBhdHRyaWJ1dGUgY291bnQ6ICIgPDwgZm5hbWU7Ci0gICAgZmNsb3NlKGZkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZndyaXRlKGF0dHIuZGF0YSgpLCBzaXplb2YoU3RvcmVkQXR0cmlidXRlKSwgbnVtX2F0dHIsIGZkKSAhPSBudW1fYXR0cikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2FuJ3Qgd3JpdGUgR0FUVCBjYWNoZSBhdHRyaWJ1dGVzOiAiIDw8IGZuYW1lOwotICAgIGZjbG9zZShmZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZmNsb3NlKGZkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19jYWNoZV9yZXNldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IEdBVFRDIHRvIHJlc2V0IGNhY2hlIGluCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCi0gKgotICogUGFyYW1ldGVyICAgICAgICBzZXJ2ZXJfYmRhOiBzZXJ2ZXIgYmQgYWRkcmVzcyBvZiB0aGlzIGNhY2hlIGJlbG9uZ3MgdG8KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRjX2NhY2hlX3Jlc2V0KGNvbnN0IFJhd0FkZHJlc3MmIHNlcnZlcl9iZGEpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgY2hhciBmbmFtZVsyNTVdID0gezB9OwotICBidGFfZ2F0dGNfZ2VuZXJhdGVfY2FjaGVfZmlsZV9uYW1lKGZuYW1lLCBzaXplb2YoZm5hbWUpLCBzZXJ2ZXJfYmRhKTsKLSAgdW5saW5rKGZuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0Y19pbnQuaCBiL2J0YS9nYXR0L2J0YV9nYXR0Y19pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NDNlZC4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dGNfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwcml2YXRlIGZpbGUgZm9yIHRoZSBmaWxlIHRyYW5zZmVyIGNsaWVudCAoRlRDKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfR0FUVENfSU5UX0gKLSNkZWZpbmUgQlRBX0dBVFRDX0lOVF9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2dhdHQvZGF0YWJhc2UuaCIKLSNpbmNsdWRlICJidGEvZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgYW5kIGRhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZW51bSB7Ci0gIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgPSBCVEFfU1lTX0VWVF9TVEFSVChCVEFfSURfR0FUVEMpLAotICBCVEFfR0FUVENfSU5UX09QRU5fRkFJTF9FVlQsCi0gIEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU5fRVZULAotICBCVEFfR0FUVENfSU5UX0NBTkNFTF9PUEVOX09LX0VWVCwKLQotICBCVEFfR0FUVENfQVBJX1JFQURfRVZULAotICBCVEFfR0FUVENfQVBJX1dSSVRFX0VWVCwKLSAgQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCwKLSAgQlRBX0dBVFRDX0FQSV9DRkdfTVRVX0VWVCwKLQotICBCVEFfR0FUVENfQVBJX0NMT1NFX0VWVCwKLQotICBCVEFfR0FUVENfQVBJX1NFQVJDSF9FVlQsCi0gIEJUQV9HQVRUQ19BUElfQ09ORklSTV9FVlQsCi0gIEJUQV9HQVRUQ19BUElfUkVBRF9NVUxUSV9FVlQsCi0KLSAgQlRBX0dBVFRDX0lOVF9DT05OX0VWVCwKLSAgQlRBX0dBVFRDX0lOVF9ESVNDT1ZFUl9FVlQsCi0gIEJUQV9HQVRUQ19ESVNDT1ZFUl9DTVBMX0VWVCwKLSAgQlRBX0dBVFRDX09QX0NNUExfRVZULAotICBCVEFfR0FUVENfSU5UX0RJU0NPTk5fRVZUCi19OwotdHlwZWRlZiB1aW50MTZfdCB0QlRBX0dBVFRDX0lOVF9FVlQ7Ci0KLSNkZWZpbmUgQlRBX0dBVFRDX1NFUlZJQ0VfQ0hBTkdFRF9MRU4gNAotCi0vKiBtYXggY2xpZW50IGFwcGxpY2F0aW9uIEdBVFRDIGNhbiBzdXBwb3J0ICovCi0jaWZuZGVmIEJUQV9HQVRUQ19DTF9NQVgKLSNkZWZpbmUgQlRBX0dBVFRDX0NMX01BWCAzMgotI2VuZGlmCi0KLS8qIG1heCBrbm93biBkZXZpY2VzIEdBVFRDIGNhbiBzdXBwb3J0IGluIEJsdWV0b290aCBzcGVjICovCi0jaWZuZGVmIEJUQV9HQVRUQ19LTk9XTl9TUl9NQVgKLSNkZWZpbmUgQlRBX0dBVFRDX0tOT1dOX1NSX01BWCAyNTUKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9HQVRUQ19DTENCX01BWAotI2RlZmluZSBCVEFfR0FUVENfQ0xDQl9NQVggR0FUVF9DTF9NQVhfTENCCi0jZW5kaWYKLQotI2RlZmluZSBCVEFfR0FUVENfV1JJVEVfUFJFUEFSRSBHQVRUX1dSSVRFX1BSRVBBUkUKLQotLyogaW50ZXJuYWwgc3RydWN1dHJlIGZvciBHQVRUQyByZWdpc3RlciBBUEkgICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdEdBVFRfSUYgY2xpZW50X2lmOwotICBib29sIGlzX2RpcmVjdDsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci0gIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzOwotICBib29sIG9wcG9ydHVuaXN0aWM7Ci19IHRCVEFfR0FUVENfQVBJX09QRU47Ci0KLXR5cGVkZWYgdEJUQV9HQVRUQ19BUElfT1BFTiB0QlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcTsKLQotICAvLyByZWFkIGJ5IGhhbmRsZSBkYXRhCi0gIHVpbnQxNl90IGhhbmRsZTsKLQotICAvLyByZWFkIGJ5IFVVSUQgZGF0YQotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgdWludDE2X3Qgc19oYW5kbGU7Ci0gIHVpbnQxNl90IGVfaGFuZGxlOwotCi0gIHRCVEFfR0FUVENfRVZUIGNtcGxfZXZ0OwotICBHQVRUX1JFQURfT1BfQ0IgcmVhZF9jYjsKLSAgdm9pZCogcmVhZF9jYl9kYXRhOwotfSB0QlRBX0dBVFRDX0FQSV9SRUFEOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZTsKLSAgdWludDE2X3Qgb2Zmc2V0OwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QqIHBfdmFsdWU7Ci0gIEdBVFRfV1JJVEVfT1BfQ0Igd3JpdGVfY2I7Ci0gIHZvaWQqIHdyaXRlX2NiX2RhdGE7Ci19IHRCVEFfR0FUVENfQVBJX1dSSVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIGJvb2wgaXNfZXhlY3V0ZTsKLX0gdEJUQV9HQVRUQ19BUElfRVhFQzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50MTZfdCBjaWQ7Ci19IHRCVEFfR0FUVENfQVBJX0NPTkZJUk07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEdBVFRDX09QVFlQRSBvcF9jb2RlOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotICB0R0FUVF9DTF9DT01QTEVURSogcF9jbXBsOwotfSB0QlRBX0dBVFRDX09QX0NNUEw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgYmx1ZXRvb3RoOjpVdWlkKiBwX3NydmNfdXVpZDsKLX0gdEJUQV9HQVRUQ19BUElfU0VBUkNIOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxOwotICB1aW50OF90IG51bV9hdHRyOwotICB1aW50MTZfdCBoYW5kbGVzW0dBVFRfTUFYX1JFQURfTVVMVElfSEFORExFU107Ci19IHRCVEFfR0FUVENfQVBJX1JFQURfTVVMVEk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdWludDE2X3QgbXR1OwotICBHQVRUX0NPTkZJR1VSRV9NVFVfT1BfQ0IgbXR1X2NiOwotICB2b2lkKiBtdHVfY2JfZGF0YTsKLX0gdEJUQV9HQVRUQ19BUElfQ0ZHX01UVTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHRHQVRUX0lGIGNsaWVudF9pZjsKLSAgdWludDhfdCByb2xlOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsKLSAgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uOwotfSB0QlRBX0dBVFRDX0lOVF9DT05OOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUQV9HQVRUQ19BUElfT1BFTiBhcGlfY29ubjsKLSAgdEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4gYXBpX2NhbmNlbF9jb25uOwotICB0QlRBX0dBVFRDX0FQSV9SRUFEIGFwaV9yZWFkOwotICB0QlRBX0dBVFRDX0FQSV9TRUFSQ0ggYXBpX3NlYXJjaDsKLSAgdEJUQV9HQVRUQ19BUElfV1JJVEUgYXBpX3dyaXRlOwotICB0QlRBX0dBVFRDX0FQSV9DT05GSVJNIGFwaV9jb25maXJtOwotICB0QlRBX0dBVFRDX0FQSV9FWEVDIGFwaV9leGVjOwotICB0QlRBX0dBVFRDX0FQSV9SRUFEX01VTFRJIGFwaV9yZWFkX211bHRpOwotICB0QlRBX0dBVFRDX0FQSV9DRkdfTVRVIGFwaV9tdHU7Ci0gIHRCVEFfR0FUVENfT1BfQ01QTCBvcF9jbXBsOwotICB0QlRBX0dBVFRDX0lOVF9DT05OIGludF9jb25uOwotfSB0QlRBX0dBVFRDX0RBVEE7Ci0KLWVudW0gewotICBCVEFfR0FUVENfSURMRV9TVCA9IDAsIC8qIElkbGUgICovCi0gIEJUQV9HQVRUQ19XNF9DT05OX1NULCAgLyogV2FpdCBmb3IgY29ubmVjdGlvbiAtICAob3B0aW9uYWwpICovCi0gIEJUQV9HQVRUQ19DT05OX1NULCAgICAgLyogY29ubmVjdGVkIHN0YXRlICovCi0gIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVCAgLyogZGlzY292ZXIgaXMgaW4gcHJvZ3Jlc3MgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUQV9HQVRUQ19TVEFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIGluX3VzZTsKLSAgUmF3QWRkcmVzcyBzZXJ2ZXJfYmRhOwotICBib29sIGNvbm5lY3RlZDsKLQotI2RlZmluZSBCVEFfR0FUVENfU0VSVl9JRExFIDAKLSNkZWZpbmUgQlRBX0dBVFRDX1NFUlZfTE9BRCAxCi0jZGVmaW5lIEJUQV9HQVRUQ19TRVJWX1NBVkUgMgotI2RlZmluZSBCVEFfR0FUVENfU0VSVl9ESVNDIDMKLSNkZWZpbmUgQlRBX0dBVFRDX1NFUlZfRElTQ19BQ1QgNAotCi0gIHVpbnQ4X3Qgc3RhdGU7Ci0KLSAgZ2F0dDo6RGF0YWJhc2UgZ2F0dF9kYXRhYmFzZTsKLSAgdWludDhfdCB1cGRhdGVfY291bnQ7IC8qIGluZGljYXRpb24gcmVjZWl2ZWQgKi8KLSAgdWludDhfdCBudW1fY2xjYjsgICAgIC8qIG51bWJlciBvZiBhc3NvY2lhdGVkIENMQ0IgKi8KLQotICBnYXR0OjpEYXRhYmFzZUJ1aWxkZXIgcGVuZGluZ19kaXNjb3Zlcnk7Ci0KLSAgLyogdXNlZCBvbmx5IGR1cmluZyBzZXJ2aWNlIGRpc2NvdmVyeSwgd2hlbiByZWFkaW5nIEV4dGVuZGVkIENoYXJhY3RlcmlzdGljCi0gICAqIFByb3BlcnRpZXMgKi8KLSAgYm9vbCByZWFkX211bHRpcGxlX25vdF9zdXBwb3J0ZWQ7Ci0KLSAgdWludDhfdCBzcnZjX2hkbF9jaGc7IC8qIHNlcnZpY2UgaGFuZGxlIGNoYW5nZSBpbmRpY2F0aW9uIHBlbmRpbmcgKi8KLSAgYm9vbCBzcnZjX2hkbF9kYl9oYXNoOyAgIC8qIHJlYWQgZGIgaGFzaCBwZW5kaW5nICovCi0gIHVpbnQ4X3Qgc3J2Y19kaXNjX2NvdW50OyAvKiBjdXJyZW50IGRpc2NvdmVyeSByZXRyeSBjb3VudCAqLwotICB1aW50MTZfdCBhdHRyX2luZGV4OyAgLyogY2FoY2UgTlYgc2F2aW5nL2xvYWRpbmcgYXR0cmlidXRlIGluZGV4ICovCi0KLSAgdWludDE2X3QgbXR1OwotfSB0QlRBX0dBVFRDX1NFUlY7Ci0KLSNpZm5kZWYgQlRBX0dBVFRDX05PVElGX1JFR19NQVgKLSNkZWZpbmUgQlRBX0dBVFRDX05PVElGX1JFR19NQVggNjQKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaW5fdXNlOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLX0gdEJUQV9HQVRUQ19OT1RJRl9SRUc7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9HQVRUQ19DQkFDSyogcF9jYmFjazsKLSAgYm9vbCBpbl91c2U7Ci0gIHRHQVRUX0lGIGNsaWVudF9pZjsgLyogY2xpZW50IGludGVyZmFjZSB3aXRoIEJURSBzdGFjayBmb3IgdGhpcyBhcHBsaWNhdGlvbiAqLwotICB1aW50OF90IG51bV9jbGNiOyAvKiBudW1iZXIgb2YgYXNzb2NpYXRlZCBDTENCICovCi0gIGJvb2wgZGVyZWdfcGVuZGluZzsKLSAgYmx1ZXRvb3RoOjpVdWlkIGFwcF91dWlkOwotICB0QlRBX0dBVFRDX05PVElGX1JFRyBub3RpZl9yZWdbQlRBX0dBVFRDX05PVElGX1JFR19NQVhdOwotfSB0QlRBX0dBVFRDX1JDQjsKLQotLyogY2xpZW50IGNoYW5uZWwgaXMgYSBtYXBwaW5nIGJldHdlZW4gYSBCVEEgY2xpZW50KGNsX2lkKSBhbmQgYSByZW1vdGUgQkQKLSAqIGFkZHJlc3MgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgYnRhX2Nvbm5faWQ7IC8qIGNsaWVudCBjaGFubmVsIElELCB1bmlxdWUgZm9yIGNsY2IgKi8KLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OyAgLyogY2hhbm5lbCB0cmFuc3BvcnQgKi8KLSAgdEJUQV9HQVRUQ19SQ0IqIHBfcmNiOyAgICAvKiBwb2ludGVyIHRvIHRoZSByZWdpc3RyYXRpb24gQ0IgKi8KLSAgdEJUQV9HQVRUQ19TRVJWKiBwX3NyY2I7ICAvKiBzZXJ2ZXIgY2FjaGUgQ0IgKi8KLSAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX3FfY21kOyAvKiBjb21tYW5kIGluIHF1ZXVlIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbiAqLwotCi0vLyByZXF1ZXN0IGR1cmluZyBkaXNjb3ZlciBzdGF0ZQotI2RlZmluZSBCVEFfR0FUVENfRElTQ09WRVJfUkVRX05PTkUgMAotI2RlZmluZSBCVEFfR0FUVENfRElTQ09WRVJfUkVRX1JFQURfRVhUX1BST1BfREVTQyAxCi0jZGVmaW5lIEJUQV9HQVRUQ19ESVNDT1ZFUl9SRVFfUkVBRF9EQl9IQVNIIDIKLQotICB1aW50OF90IHJlcXVlc3RfZHVyaW5nX2Rpc2NvdmVyeTsgLyogcmVxdWVzdCBkdXJpbmcgZGlzY292ZXIgc3RhdGUgKi8KLQotI2RlZmluZSBCVEFfR0FUVENfTk9fU0NIRURVTEUgMAotI2RlZmluZSBCVEFfR0FUVENfRElTQ19XQUlUSU5HIDB4MDEKLSNkZWZpbmUgQlRBX0dBVFRDX1JFUV9XQUlUSU5HIDB4MTAKLQotICB1aW50OF90IGF1dG9fdXBkYXRlOyAvKiBhdXRvIHVwZGF0ZSBpcyB3YWl0aW5nICovCi0gIGJvb2wgZGlzY19hY3RpdmU7Ci0gIGJvb2wgaW5fdXNlOwotICB0QlRBX0dBVFRDX1NUQVRFIHN0YXRlOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0dBVFRDX0NMQ0I7Ci0KLS8qIGJhY2sgZ3JvdW5kIGNvbm5lY3Rpb24gdHJhY2tpbmcgaW5mb3JtYXRpb24gKi8KLSNpZiBHQVRUX01BWF9BUFBTIDw9IDgKLXR5cGVkZWYgdWludDhfdCB0QlRBX0dBVFRDX0NJRl9NQVNLOwotI2VsaWYgR0FUVF9NQVhfQVBQUyA8PSAxNgotdHlwZWRlZiB1aW50MTZfdCB0QlRBX0dBVFRDX0NJRl9NQVNLOwotI2VsaWYgR0FUVF9NQVhfQVBQUyA8PSAzMgotdHlwZWRlZiB1aW50MzJfdCB0QlRBX0dBVFRDX0NJRl9NQVNLOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpbl91c2U7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdEJUQV9HQVRUQ19DSUZfTUFTSyBjaWZfbWFzazsKLQotfSB0QlRBX0dBVFRDX0JHX1RDSzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIGluX3VzZTsKLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRhOwotfSB0QlRBX0dBVFRDX0NPTk47Ci0KLWVudW0gewotICBCVEFfR0FUVENfU1RBVEVfRElTQUJMRUQsCi0gIEJUQV9HQVRUQ19TVEFURV9FTkFCTElORywKLSAgQlRBX0dBVFRDX1NUQVRFX0VOQUJMRUQsCi0gIEJUQV9HQVRUQ19TVEFURV9ESVNBQkxJTkcKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0ZTsKLQotICB0QlRBX0dBVFRDX0NPTk4gY29ubl90cmFja1tHQVRUX01BWF9QSFlfQ0hBTk5FTF07Ci0gIHRCVEFfR0FUVENfQkdfVENLIGJnX3RyYWNrW0JUQV9HQVRUQ19LTk9XTl9TUl9NQVhdOwotICB0QlRBX0dBVFRDX1JDQiBjbF9yY2JbQlRBX0dBVFRDX0NMX01BWF07Ci0KLSAgdEJUQV9HQVRUQ19DTENCIGNsY2JbQlRBX0dBVFRDX0NMQ0JfTUFYXTsKLSAgdEJUQV9HQVRUQ19TRVJWIGtub3duX3NlcnZlcltCVEFfR0FUVENfS05PV05fU1JfTUFYXTsKLX0gdEJUQV9HQVRUQ19DQjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBHQVRUQyBjb250cm9sIGJsb2NrICovCi1leHRlcm4gdEJUQV9HQVRUQ19DQiBidGFfZ2F0dGNfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKTsKLWV4dGVybiBib29sIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLQotLyogZnVuY3Rpb24gcHJvY2Vzc2VkIG91dHNpZGUgU00gKi8KLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19kaXNhYmxlKCk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfcmVnaXN0ZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX0NCQUNLKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRhQXBwUmVnaXN0ZXJDYWxsYmFjayBjYiwgYm9vbCBlYXR0X3N1cHBvcnQpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX3Byb2Nlc3NfYXBpX29wZW4oY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX21zZyk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfcHJvY2Vzc19hcGlfb3Blbl9jYW5jZWwoY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX21zZyk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfZGVyZWdpc3Rlcih0QlRBX0dBVFRDX1JDQiogcF9jbHJlZyk7Ci0KLS8qIGZ1bmN0aW9uIHdpdGhpbiBzdGF0ZSBtYWNoaW5lICovCi1leHRlcm4gdm9pZCBidGFfZ2F0dGNfb3Blbih0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19vcGVuX2ZhaWwodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19vcGVuX2Vycm9yKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpOwotCi1leHRlcm4gdm9pZCBidGFfZ2F0dGNfY2FuY2VsX29wZW4odEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NhbmNlbF9vcGVuX29rKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19jYW5jZWxfb3Blbl9lcnJvcih0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19jb25uKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpOwotCi1leHRlcm4gdm9pZCBidGFfZ2F0dGNfY2xvc2UodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2Nsb3NlX2ZhaWwodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfZGlzY19jbG9zZSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX3N0YXJ0X2Rpc2NvdmVyKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19zdGFydF9kaXNjb3Zlcl9pbnRlcm5hbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYik7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfZGlzY19jbXBsKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfcmVhZCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y193cml0ZSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfb3BfY21wbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19xX2NtZCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfc2VhcmNoKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfZmFpbCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19jb25maXJtKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2V4ZWN1dGUodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfcmVhZF9tdWx0aSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19jaV9vcGVuKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NpX2Nsb3NlKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19vcF9jbXBsX2R1cmluZ19kaXNjb3ZlcnkodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19yZXN0YXJ0X2Rpc2NvdmVyKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX21zZyk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfY2FuY2VsX2JrX2Nvbm4oY29uc3QgdEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU4qIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfc2VuZF9vcGVuX2NiYWNrKHRCVEFfR0FUVENfUkNCKiBwX2NscmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1KTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19wcm9jZXNzX2FwaV9yZWZyZXNoKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2NmZ19tdHUodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfbGlzdGVuKHRCVEFfR0FUVENfREFUQSogcF9tc2cpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2Jyb2FkY2FzdCh0QlRBX0dBVFRDX0RBVEEqIHBfbXNnKTsKLQotLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KLWV4dGVybiB0QlRBX0dBVFRDX0NMQ0IqIGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY2lmKHVpbnQ4X3QgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLWV4dGVybiB0QlRBX0dBVFRDX0NMQ0IqIGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZCh1aW50MTZfdCBjb25uX2lkKTsKLWV4dGVybiB0QlRBX0dBVFRDX0NMQ0IqIGJ0YV9nYXR0Y19jbGNiX2FsbG9jKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfY2xjYl9kZWFsbG9jKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiKTsKLWV4dGVybiB0QlRBX0dBVFRDX0NMQ0IqIGJ0YV9nYXR0Y19maW5kX2FsbG9jX2NsY2IodEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdEJUQV9HQVRUQ19SQ0IqIGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IodWludDhfdCBjbGllbnRfaWYpOwotZXh0ZXJuIHRCVEFfR0FUVENfU0VSViogYnRhX2dhdHRjX2ZpbmRfc3JjYihjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotZXh0ZXJuIHRCVEFfR0FUVENfU0VSViogYnRhX2dhdHRjX3NyY2JfYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLWV4dGVybiB0QlRBX0dBVFRDX1NFUlYqIGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQodWludDE2X3QgY29ubl9pZCk7Ci1leHRlcm4gdEJUQV9HQVRUQ19DTENCKiBidGFfZ2F0dGNfZmluZF9pbnRfY29ubl9jbGNiKHRCVEFfR0FUVENfREFUQSogcF9tc2cpOwotZXh0ZXJuIHRCVEFfR0FUVENfQ0xDQiogYnRhX2dhdHRjX2ZpbmRfaW50X2Rpc2Nvbm5fY2xjYih0QlRBX0dBVFRDX0RBVEEqIHBfbXNnKTsKLQotZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX2VucXVldWUodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci0KLWV4dGVybiBib29sIGJ0YV9nYXR0Y19jaGVja19ub3RpZl9yZWdpc3RyeSh0QlRBX0dBVFRDX1JDQiogcF9jbHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX05PVElGWSogcF9ub3RpZnkpOwotZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX21hcmtfYmdfY29ubih0R0FUVF9JRiBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIGJvb2wgYWRkKTsKLWV4dGVybiBib29sIGJ0YV9nYXR0Y19jaGVja19iZ19jb25uKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQ4X3Qgcm9sZSk7Ci1leHRlcm4gdWludDhfdCBidGFfZ2F0dGNfbnVtX3JlZ19hcHAodm9pZCk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfY2xlYXJfbm90aWZfcmVnaXN0cmF0aW9uKHRCVEFfR0FUVENfU0VSViogcF9zcmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVuZF9oYW5kbGUpOwotZXh0ZXJuIHRCVEFfR0FUVENfU0VSViogYnRhX2dhdHRjX2ZpbmRfc3J2cl9jYWNoZShjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX2lzX3JvYnVzdF9jYWNoaW5nX2VuYWJsZWQoKTsKLQotLyogZGlzY292ZXJ5IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX2Rpc2NfcmVzX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDX1JFUyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19kaXNjX2NtcGxfY2JhY2sodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIGJ0YV9nYXR0Y19kaXNjb3Zlcl9wcmlfc2VydmljZSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQ19TRVJWKiBwX3NlcnZlcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRjX3NlYXJjaF9zZXJ2aWNlKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6VXVpZCogcF91dWlkKTsKLWV4dGVybiBjb25zdCBzdGQ6Omxpc3Q8Z2F0dDo6U2VydmljZT4qIGJ0YV9nYXR0Y19nZXRfc2VydmljZXModWludDE2X3QgY29ubl9pZCk7Ci1leHRlcm4gY29uc3QgZ2F0dDo6U2VydmljZSogYnRhX2dhdHRjX2dldF9zZXJ2aWNlX2Zvcl9oYW5kbGUodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpOwotY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIGJ0YV9nYXR0Y19nZXRfY2hhcmFjdGVyaXN0aWNfc3JjYigKLSAgICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwgdWludDE2X3QgaGFuZGxlKTsKLWV4dGVybiBjb25zdCBnYXR0OjpTZXJ2aWNlKiBidGFfZ2F0dGNfZ2V0X3NlcnZpY2VfZm9yX2hhbmRsZV9zcmNiKAotICAgIHRCVEFfR0FUVENfU0VSViogcF9zcmNiLCB1aW50MTZfdCBoYW5kbGUpOwotZXh0ZXJuIGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBidGFfZ2F0dGNfZ2V0X2NoYXJhY3RlcmlzdGljKAotICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gY29uc3QgZ2F0dDo6RGVzY3JpcHRvciogYnRhX2dhdHRjX2dldF9kZXNjcmlwdG9yKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIGJ0YV9nYXR0Y19nZXRfb3duaW5nX2NoYXJhY3RlcmlzdGljKAotICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGFfZ2F0dGNfZ2V0X2dhdHRfZGIodWludDE2X3QgY29ubl9pZCwgdWludDE2X3Qgc3RhcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVuZF9oYW5kbGUsIGJ0Z2F0dF9kYl9lbGVtZW50X3QqKiBkYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvdW50KTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19pbml0X2NhY2hlKHRCVEFfR0FUVENfU0VSViogcF9zcnZjX2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19yZXNldF9kaXNjb3Zlcl9zdCh0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLQotZXh0ZXJuIHRCVEFfR0FUVENfQ09OTiogYnRhX2dhdHRjX2Nvbm5fYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci1leHRlcm4gdEJUQV9HQVRUQ19DT05OKiBidGFfZ2F0dGNfY29ubl9maW5kKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpOwotZXh0ZXJuIHRCVEFfR0FUVENfQ09OTiogYnRhX2dhdHRjX2Nvbm5fZmluZF9hbGxvYyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLWV4dGVybiBib29sIGJ0YV9nYXR0Y19jb25uX2RlYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci0KLWV4dGVybiBib29sIGJ0YV9nYXR0Y19jYWNoZV9sb2FkKHRCVEFfR0FUVENfU0VSViogcF9zcmNiKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0Y19jYWNoZV9yZXNldChjb25zdCBSYXdBZGRyZXNzJiBzZXJ2ZXJfYmRhKTsKLQotZXh0ZXJuIGJvb2wgYnRhX2dhdHRjX3JlYWRfZGJfaGFzaCh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYik7Ci0KLSNlbmRpZiAvKiBCVEFfR0FUVENfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0Y19tYWluLmNjIGIvYnRhL2dhdHQvYnRhX2dhdHRjX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGRmYmIuLjAwMDAwMDAKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRjX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEdBVFQgY2xpZW50IG1haW4gZnVuY3Rpb25zIGFuZCBzdGF0ZSBtYWNoaW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24iCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25zdGFudHMgYW5kIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogc3RhdGUgbWFjaGluZSBhY3Rpb24gZW51bWVyYXRpb24gbGlzdCAqLwotZW51bSB7Ci0gIEJUQV9HQVRUQ19PUEVOLAotICBCVEFfR0FUVENfT1BFTl9GQUlMLAotICBCVEFfR0FUVENfT1BFTl9FUlJPUiwKLSAgQlRBX0dBVFRDX0NBTkNFTF9PUEVOLAotICBCVEFfR0FUVENfQ0FOQ0VMX09QRU5fT0ssCi0gIEJUQV9HQVRUQ19DQU5DRUxfT1BFTl9FUlJPUiwKLSAgQlRBX0dBVFRDX0NPTk4sCi0gIEJUQV9HQVRUQ19TVEFSVF9ESVNDT1ZFUiwKLSAgQlRBX0dBVFRDX0RJU0NfQ01QTCwKLSAgQlRBX0dBVFRDX1FfQ01ELAotICBCVEFfR0FUVENfQ0xPU0UsCi0gIEJUQV9HQVRUQ19DTE9TRV9GQUlMLAotICBCVEFfR0FUVENfUkVBRCwKLSAgQlRBX0dBVFRDX1dSSVRFLAotICBCVEFfR0FUVENfT1BfQ01QTCwKLSAgQlRBX0dBVFRDX1NFQVJDSCwKLSAgQlRBX0dBVFRDX0ZBSUwsCi0gIEJUQV9HQVRUQ19DT05GSVJNLAotICBCVEFfR0FUVENfRVhFQywKLSAgQlRBX0dBVFRDX1JFQURfTVVMVEksCi0gIEJUQV9HQVRUQ19PUF9DTVBMX0RVUklOR19ESVNDT1ZFUlksCi0gIEJUQV9HQVRUQ19ESVNDX0NMT1NFLAotICBCVEFfR0FUVENfUkVTVEFSVF9ESVNDT1ZFUiwKLSAgQlRBX0dBVFRDX0NGR19NVFUsCi0KLSAgQlRBX0dBVFRDX0lHTk9SRQotfTsKLS8qIHR5cGUgZm9yIGFjdGlvbiBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgdm9pZCAoKnRCVEFfR0FUVENfQUNUSU9OKSh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0dBVFRDX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIGFjdGlvbiBmdW5jdGlvbiBsaXN0ICovCi1jb25zdCB0QlRBX0dBVFRDX0FDVElPTiBidGFfZ2F0dGNfYWN0aW9uW10gPSB7Ci0gICAgYnRhX2dhdHRjX29wZW4sICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX09QRU4gKi8KLSAgICBidGFfZ2F0dGNfb3Blbl9mYWlsLCAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfT1BFTl9GQUlMICovCi0gICAgYnRhX2dhdHRjX29wZW5fZXJyb3IsICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX09QRU5fRVJST1IgKi8KLSAgICBidGFfZ2F0dGNfY2FuY2VsX29wZW4sICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfQ0FOQ0VMX09QRU4gKi8KLSAgICBidGFfZ2F0dGNfY2FuY2VsX29wZW5fb2ssICAgICAgICAgICAvKiBCVEFfR0FUVENfQ0FOQ0VMX09QRU5fT0sgKi8KLSAgICBidGFfZ2F0dGNfY2FuY2VsX29wZW5fZXJyb3IsICAgICAgICAvKiBCVEFfR0FUVENfQ0FOQ0VMX09QRU5fRVJST1IgKi8KLSAgICBidGFfZ2F0dGNfY29ubiwgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfQ09OTiAqLwotICAgIGJ0YV9nYXR0Y19zdGFydF9kaXNjb3ZlciwgICAgICAgICAgIC8qIEJUQV9HQVRUQ19TVEFSVF9ESVNDT1ZFUiAqLwotICAgIGJ0YV9nYXR0Y19kaXNjX2NtcGwsICAgICAgICAgICAgICAgIC8qIEJUQV9HQVRUQ19ESVNDX0NNUEwgKi8KLSAgICBidGFfZ2F0dGNfcV9jbWQsICAgICAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfUV9DTUQgKi8KLSAgICBidGFfZ2F0dGNfY2xvc2UsICAgICAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfQ0xPU0UgKi8KLSAgICBidGFfZ2F0dGNfY2xvc2VfZmFpbCwgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfQ0xPU0VfRkFJTCAqLwotICAgIGJ0YV9nYXR0Y19yZWFkLCAgICAgICAgICAgICAgICAgICAgIC8qIEJUQV9HQVRUQ19SRUFEICovCi0gICAgYnRhX2dhdHRjX3dyaXRlLCAgICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX1dSSVRFICovCi0gICAgYnRhX2dhdHRjX29wX2NtcGwsICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX09QX0NNUEwgKi8KLSAgICBidGFfZ2F0dGNfc2VhcmNoLCAgICAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfU0VBUkNIICovCi0gICAgYnRhX2dhdHRjX2ZhaWwsICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX0ZBSUwgKi8KLSAgICBidGFfZ2F0dGNfY29uZmlybSwgICAgICAgICAgICAgICAgICAvKiBCVEFfR0FUVENfQ09ORklSTSAqLwotICAgIGJ0YV9nYXR0Y19leGVjdXRlLCAgICAgICAgICAgICAgICAgIC8qIEJUQV9HQVRUQ19FWEVDICovCi0gICAgYnRhX2dhdHRjX3JlYWRfbXVsdGksICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX1JFQURfTVVMVEkgKi8KLSAgICBidGFfZ2F0dGNfb3BfY21wbF9kdXJpbmdfZGlzY292ZXJ5LCAvKiBCVEFfR0FUVENfT1BfQ01QTF9EVVJJTkdfRElTQ09WRVJZICovCi0gICAgYnRhX2dhdHRjX2Rpc2NfY2xvc2UsICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX0RJU0NfQ0xPU0UgKi8KLSAgICBidGFfZ2F0dGNfcmVzdGFydF9kaXNjb3ZlciwgICAgICAgICAvKiBCVEFfR0FUVENfUkVTVEFSVF9ESVNDT1ZFUiAqLwotICAgIGJ0YV9nYXR0Y19jZmdfbXR1ICAgICAgICAgICAgICAgICAgIC8qIEJUQV9HQVRUQ19DRkdfTVRVICovCi19OwotCi0vKiBzdGF0ZSB0YWJsZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBCVEFfR0FUVENfQUNUSU9OUyAxICAgIC8qIG51bWJlciBvZiBhY3Rpb25zICovCi0jZGVmaW5lIEJUQV9HQVRUQ19ORVhUX1NUQVRFIDEgLyogcG9zaXRpb24gb2YgbmV4dCBzdGF0ZSAqLwotI2RlZmluZSBCVEFfR0FUVENfTlVNX0NPTFMgMiAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwotCi0vKiBzdGF0ZSB0YWJsZSBmb3IgaWRsZSBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2dhdHRjX3N0X2lkbGVbXVtCVEFfR0FUVENfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19JTlRfT1BFTl9GQUlMX0VWVCAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTl9FVlQgICAgKi8ge0JUQV9HQVRUQ19JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19JRExFX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0NBTkNFTF9PUEVOX09LX0VWVCAqLyB7QlRBX0dBVFRDX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0lETEVfU1R9LAotCi0gICAgLyogQlRBX0dBVFRDX0FQSV9SRUFEX0VWVCAgICAgICAgICAgKi8ge0JUQV9HQVRUQ19GQUlMLCBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9XUklURV9FVlQgICAgICAgICAgKi8ge0JUQV9HQVRUQ19GQUlMLCBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCAgICAgICAgICAgKi8ge0JUQV9HQVRUQ19GQUlMLCBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DRkdfTVRVX0VWVCAgICAgICAgKi8ge0JUQV9HQVRUQ19JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19JRExFX1NUfSwKLQotICAgIC8qIEJUQV9HQVRUQ19BUElfQ0xPU0VfRVZUICAgICAgICAgICovIHtCVEFfR0FUVENfQ0xPU0VfRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0lETEVfU1R9LAotCi0gICAgLyogQlRBX0dBVFRDX0FQSV9TRUFSQ0hfRVZUICAgICAgICAgKi8ge0JUQV9HQVRUQ19GQUlMLCBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DT05GSVJNX0VWVCAgICAgICAgKi8ge0JUQV9HQVRUQ19GQUlMLCBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9SRUFEX01VTFRJX0VWVCAgICAgKi8ge0JUQV9HQVRUQ19GQUlMLCBCVEFfR0FUVENfSURMRV9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfSU5UX0NPTk5fRVZUICAgICAgICAgICAqLyB7QlRBX0dBVFRDX0NPTk4sIEJUQV9HQVRUQ19DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0RJU0NPVkVSX0VWVCAgICAgICAqLyB7QlRBX0dBVFRDX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0lETEVfU1R9LAotICAgIC8qIEJUQV9HQVRUQ19ESVNDT1ZFUl9DTVBMX0VWVCAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX09QX0NNUExfRVZUICAgICAgICAgICAgKi8ge0JUQV9HQVRUQ19JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19JRExFX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0RJU0NPTk5fRVZUICAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLCBCVEFfR0FUVENfSURMRV9TVH0sCi0KLX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciB3YWl0IGZvciBvcGVuIHN0YXRlICovCi1zdGF0aWMgY29uc3QgdWludDhfdCBidGFfZ2F0dGNfc3RfdzRfY29ubltdW0JUQV9HQVRUQ19OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19JTlRfT1BFTl9GQUlMX0VWVCAgICAgICovIHtCVEFfR0FUVENfT1BFTl9GQUlMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfSURMRV9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTl9FVlQgICAgKi8ge0JUQV9HQVRUQ19DQU5DRUxfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19JTlRfQ0FOQ0VMX09QRU5fT0tfRVZUICovIHtCVEFfR0FUVENfQ0FOQ0VMX09QRU5fT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19JRExFX1NUfSwKLQotICAgIC8qIEJUQV9HQVRUQ19BUElfUkVBRF9FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19BUElfV1JJVEVfRVZUICAgICAgICAgICovIHtCVEFfR0FUVENfRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19BUElfRVhFQ19FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19BUElfQ0ZHX01UVV9FVlQgICAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfVzRfQ09OTl9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfQVBJX0NMT1NFX0VWVCAgICAgICAgICAqLyB7QlRBX0dBVFRDX0NBTkNFTF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfVzRfQ09OTl9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfQVBJX1NFQVJDSF9FVlQgICAgICAgICAqLyB7QlRBX0dBVFRDX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19XNF9DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfQVBJX0NPTkZJUk1fRVZUICAgICAgICAqLyB7QlRBX0dBVFRDX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19XNF9DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfQVBJX1JFQURfTVVMVElfRVZUICAgICAqLyB7QlRBX0dBVFRDX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19XNF9DT05OX1NUfSwKLQotICAgIC8qIEJUQV9HQVRUQ19JTlRfQ09OTl9FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfQ09OTiwgQlRBX0dBVFRDX0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19JTlRfRElTQ09WRVJfRVZUICAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfVzRfQ09OTl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0RJU0NPVkVSX0NNUExfRVZUICAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19PUF9DTVBMX0VWVCAgICAgICAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfVzRfQ09OTl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0lOVF9ESVNDT05OX0VWVCAgICAgICovIHtCVEFfR0FUVENfT1BFTl9GQUlMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0lETEVfU1R9LAotCi19OwotCi0vKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnRhX2dhdHRjX3N0X2Nvbm5lY3RlZFtdW0JUQV9HQVRUQ19OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEJUQV9HQVRUQ19BUElfT1BFTl9FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfT1BFTiwgQlRBX0dBVFRDX0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19JTlRfT1BFTl9GQUlMX0VWVCAgICAgICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfQ09OTl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTl9FVlQgICAgKi8ge0JUQV9HQVRUQ19DQU5DRUxfT1BFTl9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19JTlRfQ0FOQ0VMX09QRU5fT0tfRVZUICovIHtCVEFfR0FUVENfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfQ09OTl9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfQVBJX1JFQURfRVZUICAgICAgICAgICAqLyB7QlRBX0dBVFRDX1JFQUQsIEJUQV9HQVRUQ19DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfQVBJX1dSSVRFX0VWVCAgICAgICAgICAqLyB7QlRBX0dBVFRDX1dSSVRFLCBCVEFfR0FUVENfQ09OTl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCAgICAgICAgICAgKi8ge0JUQV9HQVRUQ19FWEVDLCBCVEFfR0FUVENfQ09OTl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DRkdfTVRVX0VWVCAgICAgICAgKi8ge0JUQV9HQVRUQ19DRkdfTVRVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfQ09OTl9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfQVBJX0NMT1NFX0VWVCAgICAgICAgICAqLyB7QlRBX0dBVFRDX0NMT1NFLCBCVEFfR0FUVENfSURMRV9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfQVBJX1NFQVJDSF9FVlQgICAgICAgICAqLyB7QlRBX0dBVFRDX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19BUElfQ09ORklSTV9FVlQgICAgICAgICovIHtCVEFfR0FUVENfQ09ORklSTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0NPTk5fU1R9LAotICAgIC8qIEJUQV9HQVRUQ19BUElfUkVBRF9NVUxUSV9FVlQgICAgICovIHtCVEFfR0FUVENfUkVBRF9NVUxUSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0NPTk5fU1R9LAotCi0gICAgLyogQlRBX0dBVFRDX0lOVF9DT05OX0VWVCAgICAgICAgICAgKi8ge0JUQV9HQVRUQ19JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0RJU0NPVkVSX0VWVCAgICAgICAqLyB7QlRBX0dBVFRDX1NUQVJUX0RJU0NPVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfRElTQ09WRVJfU1R9LAotICAgIC8qIEJUQV9HQVRUQ19ESVNDT1ZFUl9DTVBMX0VWVCAgICAgICAqLyB7QlRBX0dBVFRDX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfT1BfQ01QTF9FVlQgICAgICAgICAgICAqLyB7QlRBX0dBVFRDX09QX0NNUEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19DT05OX1NUfSwKLQotICAgIC8qIEJUQV9HQVRUQ19JTlRfRElTQ09OTl9FVlQgICAgICAgICovIHtCVEFfR0FUVENfQ0xPU0UsIEJUQV9HQVRUQ19JRExFX1NUfSwKLQotfTsKLQotLyogc3RhdGUgdGFibGUgZm9yIGRpc2NvdmVyIHN0YXRlICovCi1zdGF0aWMgY29uc3QgdWludDhfdCBidGFfZ2F0dGNfc3RfZGlzY292ZXJbXVtCVEFfR0FUVENfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxIE5leHQgc3RhdGUgKi8KLSAgICAvKiBCVEFfR0FUVENfQVBJX09QRU5fRVZUICAgICAgICAgICAqLyB7QlRBX0dBVFRDX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0lOVF9PUEVOX0ZBSUxfRVZUICAgICAgKi8ge0JUQV9HQVRUQ19JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DQU5DRUxfT1BFTl9FVlQgICAgKi8ge0JUQV9HQVRUQ19DQU5DRUxfT1BFTl9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0NBTkNFTF9PUEVOX09LX0VWVCAqLyB7QlRBX0dBVFRDX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCi0KLSAgICAvKiBCVEFfR0FUVENfQVBJX1JFQURfRVZUICAgICAgICAgICAqLyB7QlRBX0dBVFRDX1FfQ01ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfRElTQ09WRVJfU1R9LAotICAgIC8qIEJUQV9HQVRUQ19BUElfV1JJVEVfRVZUICAgICAgICAgICovIHtCVEFfR0FUVENfUV9DTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCAgICAgICAgICAgKi8ge0JUQV9HQVRUQ19RX0NNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfQVBJX0NGR19NVFVfRVZUICAgICAgICAqLyB7QlRBX0dBVFRDX1FfQ01ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfRElTQ09WRVJfU1R9LAotCi0gICAgLyogQlRBX0dBVFRDX0FQSV9DTE9TRV9FVlQgICAgICAgICAgKi8ge0JUQV9HQVRUQ19ESVNDX0NMT1NFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfRElTQ09WRVJfU1R9LAotCi0gICAgLyogQlRBX0dBVFRDX0FQSV9TRUFSQ0hfRVZUICAgICAgICAgKi8ge0JUQV9HQVRUQ19RX0NNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfQVBJX0NPTkZJUk1fRVZUICAgICAgICAqLyB7QlRBX0dBVFRDX0NPTkZJUk0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0FQSV9SRUFEX01VTFRJX0VWVCAgICAgKi8ge0JUQV9HQVRUQ19RX0NNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUfSwKLQotICAgIC8qIEJUQV9HQVRUQ19JTlRfQ09OTl9FVlQgICAgICAgICAgICovIHtCVEFfR0FUVENfQ09OTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0RJU0NPVkVSX0VWVCAgICAgICAqLyB7QlRBX0dBVFRDX1JFU1RBUlRfRElTQ09WRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVH0sCi0gICAgLyogQlRBX0dBVFRDX0RJU0NPVkVSX0NNUExfRVZUICAgICAgKi8ge0JUQV9HQVRUQ19ESVNDX0NNUEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUQ19DT05OX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfT1BfQ01QTF9FVlQgICAgICAgICAgICAqLyB7QlRBX0dBVFRDX09QX0NNUExfRFVSSU5HX0RJU0NPVkVSWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0dBVFRDX0RJU0NPVkVSX1NUfSwKLSAgICAvKiBCVEFfR0FUVENfSU5UX0RJU0NPTk5fRVZUICAgICAgICAqLyB7QlRBX0dBVFRDX0NMT1NFLCBCVEFfR0FUVENfSURMRV9TVH0sCi0KLX07Ci0KLS8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0dBVFRDX1NUX1RCTClbQlRBX0dBVFRDX05VTV9DT0xTXTsKLQotLyogc3RhdGUgdGFibGUgKi8KLWNvbnN0IHRCVEFfR0FUVENfU1RfVEJMIGJ0YV9nYXR0Y19zdF90YmxbXSA9IHsKLSAgICBidGFfZ2F0dGNfc3RfaWRsZSwgICAgICAvKiBCVEFfR0FUVENfSURMRV9TVCAqLwotICAgIGJ0YV9nYXR0Y19zdF93NF9jb25uLCAgIC8qIEJUQV9HQVRUQ19XNF9DT05OX1NUICovCi0gICAgYnRhX2dhdHRjX3N0X2Nvbm5lY3RlZCwgLyogQlRBX0dBVFRDX0NPTk5fU1QgKi8KLSAgICBidGFfZ2F0dGNfc3RfZGlzY292ZXIgICAvKiBCVEFfR0FUVENfRElTQ09WRVJfU1QgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBHQVRUQyBjb250cm9sIGJsb2NrICovCi10QlRBX0dBVFRDX0NCIGJ0YV9nYXR0Y19jYjsKLQotI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQotc3RhdGljIGNvbnN0IGNoYXIqIGdhdHRjX2V2dF9jb2RlKHRCVEFfR0FUVENfSU5UX0VWVCBldnRfY29kZSk7Ci1zdGF0aWMgY29uc3QgY2hhciogZ2F0dGNfc3RhdGVfY29kZSh0QlRBX0dBVFRDX1NUQVRFIHN0YXRlX2NvZGUpOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfc21fZXhlY3V0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhdGUgbWFjaGluZSBldmVudCBoYW5kbGluZyBmdW5jdGlvbiBmb3IgR0FUVEMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICA6IHRydWUgaWYgcXVldWVkIGNsaWVudCByZXF1ZXN0IGJ1ZmZlciBjYW4gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGVseSByZWxlYXNlZCwgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9nYXR0Y19zbV9leGVjdXRlKHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9HQVRUQ19EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19TVF9UQkwgc3RhdGVfdGFibGU7Ci0gIHVpbnQ4X3QgYWN0aW9uOwotICBpbnQgaTsKLSAgYm9vbCBydCA9IHRydWU7Ci0gIHRCVEFfR0FUVENfU1RBVEUgaW5fc3RhdGUgPSBwX2NsY2ItPnN0YXRlOwotICB1aW50MTZfdCBpbl9ldmVudCA9IGV2ZW50OwotI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiJXM6IFN0YXRlIDB4JTAyeCBbJXNdLCBFdmVudCAweCV4WyVzXSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zdGF0ZSwgZ2F0dGNfc3RhdGVfY29kZShpbl9zdGF0ZSksIGluX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBnYXR0Y19ldnRfY29kZShpbl9ldmVudCkpOwotI2Vsc2UKLSAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIiVzOiBTdGF0ZSAweCUwMngsIEV2ZW50IDB4JXgiLCBfX2Z1bmNfXywgaW5fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluX2V2ZW50KTsKLSNlbmRpZgotCi0gIC8qIGxvb2sgdXAgdGhlIHN0YXRlIHRhYmxlIGZvciB0aGUgY3VycmVudCBzdGF0ZSAqLwotICBzdGF0ZV90YWJsZSA9IGJ0YV9nYXR0Y19zdF90YmxbcF9jbGNiLT5zdGF0ZV07Ci0KLSAgZXZlbnQgJj0gMHgwMEZGOwotCi0gIC8qIHNldCBuZXh0IHN0YXRlICovCi0gIHBfY2xjYi0+c3RhdGUgPSBzdGF0ZV90YWJsZVtldmVudF1bQlRBX0dBVFRDX05FWFRfU1RBVEVdOwotCi0gIC8qIGV4ZWN1dGUgYWN0aW9uIGZ1bmN0aW9ucyAqLwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRDX0FDVElPTlM7IGkrKykgewotICAgIGFjdGlvbiA9IHN0YXRlX3RhYmxlW2V2ZW50XVtpXTsKLSAgICBpZiAoYWN0aW9uICE9IEJUQV9HQVRUQ19JR05PUkUpIHsKLSAgICAgICgqYnRhX2dhdHRjX2FjdGlvblthY3Rpb25dKShwX2NsY2IsIHBfZGF0YSk7Ci0gICAgICBpZiAocF9jbGNiLT5wX3FfY21kID09IHBfZGF0YSkgewotICAgICAgICAvKiBidWZmZXIgaXMgcXVldWVkLCBkb24ndCBmcmVlIGluIHRoZSBidGEgZGlzcGF0Y2hlci4KLSAgICAgICAgICogd2UgZnJlZSBpdCBvdXJzZWx2ZXMgd2hlbiBhIGNvbXBsZXRpb24gZXZlbnQgaXMgcmVjZWl2ZWQuCi0gICAgICAgICAqLwotICAgICAgICBydCA9IGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQotICBpZiAoaW5fc3RhdGUgIT0gcF9jbGNiLT5zdGF0ZSkgewotICAgIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCJHQVRUQyBTdGF0ZSBDaGFuZ2U6IFslc10gLT4gWyVzXSBhZnRlciBFdmVudCBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXR0Y19zdGF0ZV9jb2RlKGluX3N0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXR0Y19zdGF0ZV9jb2RlKHBfY2xjYi0+c3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRjX2V2dF9jb2RlKGluX2V2ZW50KSk7Ci0gIH0KLSNlbHNlCi0gIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgIiVzOiBHQVRUQyBTdGF0ZSBDaGFuZ2U6IDB4JTAyeCAtPiAweCUwMnggYWZ0ZXIgRXZlbnQgMHgleCIsIF9fZnVuY19fLAotICAgICAgaW5fc3RhdGUsIHBfY2xjYi0+c3RhdGUsIGluX2V2ZW50KTsKLSNlbmRpZgotICByZXR1cm4gcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfaGRsX2V2ZW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHQVRUIGNsaWVudCBtYWluIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfZ2F0dGNfaGRsX2V2ZW50KEJUX0hEUl9SSUdJRCogcF9tc2cpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBOVUxMOwotICBib29sIHJ0ID0gdHJ1ZTsKLSNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBFdmVudDoiIDw8IGdhdHRjX2V2dF9jb2RlKHBfbXNnLT5ldmVudCk7Ci0jZW5kaWYKLSAgc3dpdGNoIChwX21zZy0+ZXZlbnQpIHsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0FQSV9PUEVOX0VWVDoKLSAgICAgIGJ0YV9nYXR0Y19wcm9jZXNzX2FwaV9vcGVuKCh0QlRBX0dBVFRDX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfQVBJX0NBTkNFTF9PUEVOX0VWVDoKLSAgICAgIGJ0YV9nYXR0Y19wcm9jZXNzX2FwaV9vcGVuX2NhbmNlbCgodEJUQV9HQVRUQ19EQVRBKilwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocF9tc2ctPmV2ZW50ID09IEJUQV9HQVRUQ19JTlRfQ09OTl9FVlQpCi0gICAgICAgIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2ludF9jb25uX2NsY2IoKHRCVEFfR0FUVENfREFUQSopcF9tc2cpOwotICAgICAgZWxzZSBpZiAocF9tc2ctPmV2ZW50ID09IEJUQV9HQVRUQ19JTlRfRElTQ09OTl9FVlQpCi0gICAgICAgIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2ludF9kaXNjb25uX2NsY2IoKHRCVEFfR0FUVENfREFUQSopcF9tc2cpOwotICAgICAgZWxzZQotICAgICAgICBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQocF9tc2ctPmxheWVyX3NwZWNpZmljKTsKLQotICAgICAgaWYgKHBfY2xjYiAhPSBOVUxMKSB7Ci0gICAgICAgIHJ0ID0gYnRhX2dhdHRjX3NtX2V4ZWN1dGUocF9jbGNiLCBwX21zZy0+ZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHRCVEFfR0FUVENfREFUQSopcF9tc2cpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVkxPRygxKSA8PCAiSWdub3JlIHVua25vd24gY29ubiBJRDogIiA8PCArcF9tc2ctPmxheWVyX3NwZWNpZmljOwotICAgICAgfQotCi0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRGVidWcgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRjX2V2dF9jb2RlCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IGNoYXIqIGdhdHRjX2V2dF9jb2RlKHRCVEFfR0FUVENfSU5UX0VWVCBldnRfY29kZSkgewotICBzd2l0Y2ggKGV2dF9jb2RlKSB7Ci0gICAgY2FzZSBCVEFfR0FUVENfQVBJX09QRU5fRVZUOgotICAgICAgcmV0dXJuICJCVEFfR0FUVENfQVBJX09QRU5fRVZUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19JTlRfT1BFTl9GQUlMX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0lOVF9PUEVOX0ZBSUxfRVZUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19BUElfQ0FOQ0VMX09QRU5fRVZUOgotICAgICAgcmV0dXJuICJCVEFfR0FUVENfQVBJX0NBTkNFTF9PUEVOX0VWVCI7Ci0gICAgY2FzZSBCVEFfR0FUVENfSU5UX0NBTkNFTF9PUEVOX09LX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0lOVF9DQU5DRUxfT1BFTl9PS19FVlQiOwotICAgIGNhc2UgQlRBX0dBVFRDX0FQSV9SRUFEX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0FQSV9SRUFEX0VWVCI7Ci0gICAgY2FzZSBCVEFfR0FUVENfQVBJX1dSSVRFX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0FQSV9XUklURV9FVlQiOwotICAgIGNhc2UgQlRBX0dBVFRDX0FQSV9FWEVDX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCI7Ci0gICAgY2FzZSBCVEFfR0FUVENfQVBJX0NMT1NFX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0FQSV9DTE9TRV9FVlQiOwotICAgIGNhc2UgQlRBX0dBVFRDX0FQSV9TRUFSQ0hfRVZUOgotICAgICAgcmV0dXJuICJCVEFfR0FUVENfQVBJX1NFQVJDSF9FVlQiOwotICAgIGNhc2UgQlRBX0dBVFRDX0FQSV9DT05GSVJNX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0FQSV9DT05GSVJNX0VWVCI7Ci0gICAgY2FzZSBCVEFfR0FUVENfQVBJX1JFQURfTVVMVElfRVZUOgotICAgICAgcmV0dXJuICJCVEFfR0FUVENfQVBJX1JFQURfTVVMVElfRVZUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19JTlRfQ09OTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9HQVRUQ19JTlRfQ09OTl9FVlQiOwotICAgIGNhc2UgQlRBX0dBVFRDX0lOVF9ESVNDT1ZFUl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9HQVRUQ19JTlRfRElTQ09WRVJfRVZUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19ESVNDT1ZFUl9DTVBMX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0RJU0NPVkVSX0NNUExfRVZUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19PUF9DTVBMX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX09QX0NNUExfRVZUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19JTlRfRElTQ09OTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9HQVRUQ19JTlRfRElTQ09OTl9FVlQiOwotICAgIGNhc2UgQlRBX0dBVFRDX0FQSV9DRkdfTVRVX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0dBVFRDX0FQSV9DRkdfTVRVX0VWVCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93biBHQVRUQyBldmVudCBjb2RlIjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dGNfc3RhdGVfY29kZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBjaGFyKiBnYXR0Y19zdGF0ZV9jb2RlKHRCVEFfR0FUVENfU1RBVEUgc3RhdGVfY29kZSkgewotICBzd2l0Y2ggKHN0YXRlX2NvZGUpIHsKLSAgICBjYXNlIEJUQV9HQVRUQ19JRExFX1NUOgotICAgICAgcmV0dXJuICJHQVRUQ19JRExFX1NUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19XNF9DT05OX1NUOgotICAgICAgcmV0dXJuICJHQVRUQ19XNF9DT05OX1NUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19DT05OX1NUOgotICAgICAgcmV0dXJuICJHQVRUQ19DT05OX1NUIjsKLSAgICBjYXNlIEJUQV9HQVRUQ19ESVNDT1ZFUl9TVDoKLSAgICAgIHJldHVybiAiR0FUVENfRElTQ09WRVJfU1QiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gR0FUVEMgc3RhdGUgY29kZSI7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIERlYnVnIEZ1bmN0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRjX3F1ZXVlLmNjIGIvYnRhL2dhdHQvYnRhX2dhdHRjX3F1ZXVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGM0ZjUxLi4wMDAwMDAwCi0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0Y19xdWV1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWUuaCIKLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgZ2F0dF9vcGVyYXRpb24gPSBCdGFHYXR0UXVldWU6OmdhdHRfb3BlcmF0aW9uOwotCi1jb25zdGV4cHIgdWludDhfdCBHQVRUX1JFQURfQ0hBUiA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBHQVRUX1JFQURfREVTQyA9IDI7Ci1jb25zdGV4cHIgdWludDhfdCBHQVRUX1dSSVRFX0NIQVIgPSAzOwotY29uc3RleHByIHVpbnQ4X3QgR0FUVF9XUklURV9ERVNDID0gNDsKLWNvbnN0ZXhwciB1aW50OF90IEdBVFRfQ09ORklHX01UVSA9IDU7Ci0KLXN0cnVjdCBnYXR0X3JlYWRfb3BfZGF0YSB7Ci0gIEdBVFRfUkVBRF9PUF9DQiBjYjsKLSAgdm9pZCogY2JfZGF0YTsKLX07Ci0KLXN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgc3RkOjpsaXN0PGdhdHRfb3BlcmF0aW9uPj4KLSAgICBCdGFHYXR0UXVldWU6OmdhdHRfb3BfcXVldWU7Ci1zdGQ6OnVub3JkZXJlZF9zZXQ8dWludDE2X3Q+IEJ0YUdhdHRRdWV1ZTo6Z2F0dF9vcF9xdWV1ZV9leGVjdXRpbmc7Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjptYXJrX2FzX25vdF9leGVjdXRpbmcodWludDE2X3QgY29ubl9pZCkgewotICBnYXR0X29wX3F1ZXVlX2V4ZWN1dGluZy5lcmFzZShjb25uX2lkKTsKLX0KLQotdm9pZCBCdGFHYXR0UXVldWU6OmdhdHRfcmVhZF9vcF9maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgZ2F0dF9yZWFkX29wX2RhdGEqIHRtcCA9IChnYXR0X3JlYWRfb3BfZGF0YSopZGF0YTsKLSAgR0FUVF9SRUFEX09QX0NCIHRtcF9jYiA9IHRtcC0+Y2I7Ci0gIHZvaWQqIHRtcF9jYl9kYXRhID0gdG1wLT5jYl9kYXRhOwotCi0gIG9zaV9mcmVlKGRhdGEpOwotCi0gIG1hcmtfYXNfbm90X2V4ZWN1dGluZyhjb25uX2lkKTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci0KLSAgaWYgKHRtcF9jYikgewotICAgIHRtcF9jYihjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgbGVuLCB2YWx1ZSwgdG1wX2NiX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotfQotCi1zdHJ1Y3QgZ2F0dF93cml0ZV9vcF9kYXRhIHsKLSAgR0FUVF9XUklURV9PUF9DQiBjYjsKLSAgdm9pZCogY2JfZGF0YTsKLX07Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpnYXR0X3dyaXRlX29wX2ZpbmlzaGVkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gIGdhdHRfd3JpdGVfb3BfZGF0YSogdG1wID0gKGdhdHRfd3JpdGVfb3BfZGF0YSopZGF0YTsKLSAgR0FUVF9XUklURV9PUF9DQiB0bXBfY2IgPSB0bXAtPmNiOwotICB2b2lkKiB0bXBfY2JfZGF0YSA9IHRtcC0+Y2JfZGF0YTsKLQotICBvc2lfZnJlZShkYXRhKTsKLQotICBtYXJrX2FzX25vdF9leGVjdXRpbmcoY29ubl9pZCk7Ci0gIGdhdHRfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotCi0gIGlmICh0bXBfY2IpIHsKLSAgICB0bXBfY2IoY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGxlbiwgdmFsdWUsIHRtcF9jYl9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotc3RydWN0IGdhdHRfY29uZmlndXJlX210dV9vcF9kYXRhIHsKLSAgR0FUVF9DT05GSUdVUkVfTVRVX09QX0NCIGNiOwotICB2b2lkKiBjYl9kYXRhOwotfTsKLQotdm9pZCBCdGFHYXR0UXVldWU6OmdhdHRfY29uZmlndXJlX210dV9vcF9maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIGdhdHRfY29uZmlndXJlX210dV9vcF9kYXRhKiB0bXAgPSAoZ2F0dF9jb25maWd1cmVfbXR1X29wX2RhdGEqKWRhdGE7Ci0gIEdBVFRfQ09ORklHVVJFX01UVV9PUF9DQiB0bXBfY2IgPSB0bXAtPmNiOwotICB2b2lkKiB0bXBfY2JfZGF0YSA9IHRtcC0+Y2JfZGF0YTsKLQotICBvc2lfZnJlZShkYXRhKTsKLQotICBtYXJrX2FzX25vdF9leGVjdXRpbmcoY29ubl9pZCk7Ci0gIGdhdHRfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotCi0gIGlmICh0bXBfY2IpIHsKLSAgICB0bXBfY2IoY29ubl9pZCwgc3RhdHVzLCB0bXBfY2JfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpnYXR0X2V4ZWN1dGVfbmV4dF9vcCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb25uX2lkPTB4JXgiLCBfX2Z1bmNfXywgY29ubl9pZCk7Ci0gIGlmIChnYXR0X29wX3F1ZXVlLmVtcHR5KCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogb3AgcXVldWUgaXMgZW1wdHkiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBtYXBfcHRyID0gZ2F0dF9vcF9xdWV1ZS5maW5kKGNvbm5faWQpOwotICBpZiAobWFwX3B0ciA9PSBnYXR0X29wX3F1ZXVlLmVuZCgpIHx8IG1hcF9wdHItPnNlY29uZC5lbXB0eSgpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG5vIG1vcmUgb3BlcmF0aW9ucyBxdWV1ZWQgZm9yIGNvbm5faWQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnYXR0X29wX3F1ZXVlX2V4ZWN1dGluZy5jb3VudChjb25uX2lkKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjYW4ndCBlbnF1ZXVlIG5leHQgb3AsIGFscmVhZHkgZXhlY3V0aW5nIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGdhdHRfb3BfcXVldWVfZXhlY3V0aW5nLmluc2VydChjb25uX2lkKTsKLQotICBzdGQ6Omxpc3Q8Z2F0dF9vcGVyYXRpb24+JiBnYXR0X29wcyA9IG1hcF9wdHItPnNlY29uZDsKLQotICBnYXR0X29wZXJhdGlvbiYgb3AgPSBnYXR0X29wcy5mcm9udCgpOwotCi0gIGlmIChvcC50eXBlID09IEdBVFRfUkVBRF9DSEFSKSB7Ci0gICAgZ2F0dF9yZWFkX29wX2RhdGEqIGRhdGEgPQotICAgICAgICAoZ2F0dF9yZWFkX29wX2RhdGEqKW9zaV9tYWxsb2Moc2l6ZW9mKGdhdHRfcmVhZF9vcF9kYXRhKSk7Ci0gICAgZGF0YS0+Y2IgPSBvcC5yZWFkX2NiOwotICAgIGRhdGEtPmNiX2RhdGEgPSBvcC5yZWFkX2NiX2RhdGE7Ci0gICAgQlRBX0dBVFRDX1JlYWRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBvcC5oYW5kbGUsIEdBVFRfQVVUSF9SRVFfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfcmVhZF9vcF9maW5pc2hlZCwgZGF0YSk7Ci0KLSAgfSBlbHNlIGlmIChvcC50eXBlID09IEdBVFRfUkVBRF9ERVNDKSB7Ci0gICAgZ2F0dF9yZWFkX29wX2RhdGEqIGRhdGEgPQotICAgICAgICAoZ2F0dF9yZWFkX29wX2RhdGEqKW9zaV9tYWxsb2Moc2l6ZW9mKGdhdHRfcmVhZF9vcF9kYXRhKSk7Ci0gICAgZGF0YS0+Y2IgPSBvcC5yZWFkX2NiOwotICAgIGRhdGEtPmNiX2RhdGEgPSBvcC5yZWFkX2NiX2RhdGE7Ci0gICAgQlRBX0dBVFRDX1JlYWRDaGFyRGVzY3IoY29ubl9pZCwgb3AuaGFuZGxlLCBHQVRUX0FVVEhfUkVRX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9yZWFkX29wX2ZpbmlzaGVkLCBkYXRhKTsKLQotICB9IGVsc2UgaWYgKG9wLnR5cGUgPT0gR0FUVF9XUklURV9DSEFSKSB7Ci0gICAgZ2F0dF93cml0ZV9vcF9kYXRhKiBkYXRhID0KLSAgICAgICAgKGdhdHRfd3JpdGVfb3BfZGF0YSopb3NpX21hbGxvYyhzaXplb2YoZ2F0dF93cml0ZV9vcF9kYXRhKSk7Ci0gICAgZGF0YS0+Y2IgPSBvcC53cml0ZV9jYjsKLSAgICBkYXRhLT5jYl9kYXRhID0gb3Aud3JpdGVfY2JfZGF0YTsKLSAgICBCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUoY29ubl9pZCwgb3AuaGFuZGxlLCBvcC53cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3AudmFsdWUpLCBHQVRUX0FVVEhfUkVRX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfd3JpdGVfb3BfZmluaXNoZWQsIGRhdGEpOwotCi0gIH0gZWxzZSBpZiAob3AudHlwZSA9PSBHQVRUX1dSSVRFX0RFU0MpIHsKLSAgICBnYXR0X3dyaXRlX29wX2RhdGEqIGRhdGEgPQotICAgICAgICAoZ2F0dF93cml0ZV9vcF9kYXRhKilvc2lfbWFsbG9jKHNpemVvZihnYXR0X3dyaXRlX29wX2RhdGEpKTsKLSAgICBkYXRhLT5jYiA9IG9wLndyaXRlX2NiOwotICAgIGRhdGEtPmNiX2RhdGEgPSBvcC53cml0ZV9jYl9kYXRhOwotICAgIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjcihjb25uX2lkLCBvcC5oYW5kbGUsIHN0ZDo6bW92ZShvcC52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQVVUSF9SRVFfTk9ORSwgZ2F0dF93cml0ZV9vcF9maW5pc2hlZCwgZGF0YSk7Ci0gIH0gZWxzZSBpZiAob3AudHlwZSA9PSBHQVRUX0NPTkZJR19NVFUpIHsKLSAgICBnYXR0X2NvbmZpZ3VyZV9tdHVfb3BfZGF0YSogZGF0YSA9Ci0gICAgICAoZ2F0dF9jb25maWd1cmVfbXR1X29wX2RhdGEqKW9zaV9tYWxsb2Moc2l6ZW9mKGdhdHRfY29uZmlndXJlX210dV9vcF9kYXRhKSk7Ci0gICAgZGF0YS0+Y2IgPSBvcC5tdHVfY2I7Ci0gICAgZGF0YS0+Y2JfZGF0YSA9IG9wLm10dV9jYl9kYXRhOwotICAgIEJUQV9HQVRUQ19Db25maWd1cmVNVFUoY29ubl9pZCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG9wLnZhbHVlWzBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3AudmFsdWVbMV0gPDwgOCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9jb25maWd1cmVfbXR1X29wX2ZpbmlzaGVkLCBkYXRhKTsKLSAgfQotCi0gIGdhdHRfb3BzLnBvcF9mcm9udCgpOwotfQotCi12b2lkIEJ0YUdhdHRRdWV1ZTo6Q2xlYW4odWludDE2X3QgY29ubl9pZCkgewotICBnYXR0X29wX3F1ZXVlLmVyYXNlKGNvbm5faWQpOwotICBnYXR0X29wX3F1ZXVlX2V4ZWN1dGluZy5lcmFzZShjb25uX2lkKTsKLX0KLQotdm9pZCBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICBnYXR0X29wX3F1ZXVlW2Nvbm5faWRdLnB1c2hfYmFjayh7LnR5cGUgPSBHQVRUX1JFQURfQ0hBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZF9jYiA9IGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRfY2JfZGF0YSA9IGNiX2RhdGF9KTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci19Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpSZWFkRGVzY3JpcHRvcih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRUFEX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIGdhdHRfb3BfcXVldWVbY29ubl9pZF0ucHVzaF9iYWNrKHsudHlwZSA9IEdBVFRfUkVBRF9ERVNDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkX2NiID0gY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZF9jYl9kYXRhID0gY2JfZGF0YX0pOwotICBnYXR0X2V4ZWN1dGVfbmV4dF9vcChjb25uX2lkKTsKLX0KLQotdm9pZCBCdGFHYXR0UXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIGdhdHRfb3BfcXVldWVbY29ubl9pZF0ucHVzaF9iYWNrKHsudHlwZSA9IEdBVFRfV1JJVEVfQ0hBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVfY2IgPSBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZV9jYl9kYXRhID0gY2JfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZV90eXBlID0gd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZSA9IHN0ZDo6bW92ZSh2YWx1ZSl9KTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci19Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpXcml0ZURlc2NyaXB0b3IodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIGdhdHRfb3BfcXVldWVbY29ubl9pZF0ucHVzaF9iYWNrKHsudHlwZSA9IEdBVFRfV1JJVEVfREVTQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVfY2IgPSBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZV9jYl9kYXRhID0gY2JfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZV90eXBlID0gd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZSA9IHN0ZDo6bW92ZSh2YWx1ZSl9KTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci19Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpDb25maWd1cmVNdHUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgbXR1KSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBtdHU6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihtdHUpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSA9IHtzdGF0aWNfY2FzdDx1aW50OF90PihtdHUgJiAweGZmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4obXR1ID4+IDgpfTsKLSAgZ2F0dF9vcF9xdWV1ZVtjb25uX2lkXS5wdXNoX2JhY2soey50eXBlID0gR0FUVF9DT05GSUdfTVRVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlID0gc3RkOjptb3ZlKHZhbHVlKX0pOwotICBnYXR0X2V4ZWN1dGVfbmV4dF9vcChjb25uX2lkKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0Y191dGlscy5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0Y191dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2NzcyOS4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dGNfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEdBVFQgY2xpZW50IHV0aWxpdHkgZnVuY3Rpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfZ2F0dGMiCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1zdGF0aWMgdWludDhfdCBibGVfYWNjZXB0bGlzdF9zaXplKCkgewotICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLSAgaWYgKCFjb250cm9sbGVyLT5zdXBwb3J0c19ibGUoKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBjb250cm9sbGVyLT5nZXRfYmxlX2FjY2VwdGxpc3Rfc2l6ZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX2NsX2dldF9yZWdjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZ2V0IHJlZ2lzdHJhdGlvbiBjb250cm9sIGJsb2NrIGJ5IGNsaWVudCBpbnRlcmZhY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSByZWdjYgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX1JDQiogYnRhX2dhdHRjX2NsX2dldF9yZWdjYih1aW50OF90IGNsaWVudF9pZikgewotICB1aW50OF90IGkgPSAwOwotICB0QlRBX0dBVFRDX1JDQiogcF9jbHJjYiA9ICZidGFfZ2F0dGNfY2IuY2xfcmNiWzBdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVENfQ0xfTUFYOyBpKyssIHBfY2xyY2IrKykgewotICAgIGlmIChwX2NscmNiLT5pbl91c2UgJiYgcF9jbHJjYi0+Y2xpZW50X2lmID09IGNsaWVudF9pZikgcmV0dXJuIHBfY2xyY2I7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX251bV9yZWdfYXBwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJlZ2NiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRhX2dhdHRjX251bV9yZWdfYXBwKHZvaWQpIHsKLSAgdWludDhfdCBpID0gMCwgaiA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19DTF9NQVg7IGkrKykgewotICAgIGlmIChidGFfZ2F0dGNfY2IuY2xfcmNiW2ldLmluX3VzZSkgaisrOwotICB9Ci0gIHJldHVybiBqOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY2lmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBnZXQgY2xjYiBieSBjbGllbnQgaW50ZXJmYWNlIGFuZCByZW1vdGUgYmQgYWRkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19DTENCKiBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2NpZih1aW50OF90IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSAmYnRhX2dhdHRjX2NiLmNsY2JbMF07Ci0gIHVpbnQ4X3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRDX0NMQ0JfTUFYOyBpKyssIHBfY2xjYisrKSB7Ci0gICAgaWYgKHBfY2xjYi0+aW5fdXNlICYmIHBfY2xjYi0+cF9yY2ItPmNsaWVudF9pZiA9PSBjbGllbnRfaWYgJiYKLSAgICAgICAgcF9jbGNiLT50cmFuc3BvcnQgPT0gdHJhbnNwb3J0ICYmIHBfY2xjYi0+YmRhID09IHJlbW90ZV9iZGEpCi0gICAgICByZXR1cm4gcF9jbGNiOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZ2V0IGNsY2IgYnkgY29ubmVjdGlvbiBJRAotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2xjYgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX0NMQ0IqIGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiID0gJmJ0YV9nYXR0Y19jYi5jbGNiWzBdOwotICB1aW50OF90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19DTENCX01BWDsgaSsrLCBwX2NsY2IrKykgewotICAgIGlmIChwX2NsY2ItPmluX3VzZSAmJiBwX2NsY2ItPmJ0YV9jb25uX2lkID09IGNvbm5faWQpIHJldHVybiBwX2NsY2I7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfY2xjYl9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgYWxsb2NhdGUgQ0xDQgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2xjYgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX0NMQ0IqIGJ0YV9nYXR0Y19jbGNiX2FsbG9jKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdWludDhfdCBpX2NsY2IgPSAwOwotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IE5VTEw7Ci0KLSAgZm9yIChpX2NsY2IgPSAwOyBpX2NsY2IgPCBCVEFfR0FUVENfQ0xDQl9NQVg7IGlfY2xjYisrKSB7Ci0gICAgaWYgKCFidGFfZ2F0dGNfY2IuY2xjYltpX2NsY2JdLmluX3VzZSkgewotI2lmIChCVEFfR0FUVF9ERUJVRyA9PSBUUlVFKQotICAgICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBmb3VuZCBjbGNiOiIgPDwgK2lfY2xjYiA8PCAiIGF2YWlsYWJsZSI7Ci0jZW5kaWYKLSAgICAgIHBfY2xjYiA9ICZidGFfZ2F0dGNfY2IuY2xjYltpX2NsY2JdOwotICAgICAgcF9jbGNiLT5pbl91c2UgPSB0cnVlOwotICAgICAgcF9jbGNiLT5zdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0gICAgICBwX2NsY2ItPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLSAgICAgIHBfY2xjYi0+YmRhID0gcmVtb3RlX2JkYTsKLQotICAgICAgcF9jbGNiLT5wX3JjYiA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IoY2xpZW50X2lmKTsKLQotICAgICAgcF9jbGNiLT5wX3NyY2IgPSBidGFfZ2F0dGNfZmluZF9zcmNiKHJlbW90ZV9iZGEpOwotICAgICAgaWYgKHBfY2xjYi0+cF9zcmNiID09IE5VTEwpCi0gICAgICAgIHBfY2xjYi0+cF9zcmNiID0gYnRhX2dhdHRjX3NyY2JfYWxsb2MocmVtb3RlX2JkYSk7Ci0KLSAgICAgIGlmIChwX2NsY2ItPnBfcmNiICE9IE5VTEwgJiYgcF9jbGNiLT5wX3NyY2IgIT0gTlVMTCkgewotICAgICAgICBwX2NsY2ItPnBfc3JjYi0+bnVtX2NsY2IrKzsKLSAgICAgICAgcF9jbGNiLT5wX3JjYi0+bnVtX2NsY2IrKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHJlbGVhc2UgdGhpcyBjbGNiIGlmIGNsY2Igb3Igc3JjYiBhbGxvY2F0aW9uIGZhaWxlZCAqLwotICAgICAgICBwX2NsY2ItPmluX3VzZSA9IGZhbHNlOwotICAgICAgICBwX2NsY2IgPSBOVUxMOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwX2NsY2I7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX2ZpbmRfYWxsb2NfY2xjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZmluZCBvciBhbGxvY2F0ZSBDTENCIGlmIG5vdCBmb3VuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19DTENCKiBidGFfZ2F0dGNfZmluZF9hbGxvY19jbGNiKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHRCVEFfR0FUVENfQ0xDQiogcF9jbGNiOwotCi0gIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY2lmKGNsaWVudF9pZiwgcmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSB7Ci0gICAgcF9jbGNiID0gYnRhX2dhdHRjX2NsY2JfYWxsb2MoY2xpZW50X2lmLCByZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICB9Ci0gIHJldHVybiBwX2NsY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfY2xjYl9kZWFsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZWFsbG9jdGUgYSBjbGNiCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjbGNiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRjX2NsY2JfZGVhbGxvYyh0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYikgewotICBpZiAoIXBfY2xjYikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBwX2NsY2I9TlVMTCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9HQVRUQ19TRVJWKiBwX3NyY2IgPSBwX2NsY2ItPnBfc3JjYjsKLSAgaWYgKHBfc3JjYi0+bnVtX2NsY2IpIHBfc3JjYi0+bnVtX2NsY2ItLTsKLQotICBpZiAocF9jbGNiLT5wX3JjYi0+bnVtX2NsY2IpIHBfY2xjYi0+cF9yY2ItPm51bV9jbGNiLS07Ci0KLSAgLyogaWYgdGhlIHNyY2IgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgcmVzZXQgdGhlIHN0YXRlICovCi0gIGlmIChwX3NyY2ItPm51bV9jbGNiID09IDApIHsKLSAgICBwX3NyY2ItPmNvbm5lY3RlZCA9IGZhbHNlOwotICAgIHBfc3JjYi0+c3RhdGUgPSBCVEFfR0FUVENfU0VSVl9JRExFOwotICAgIHBfc3JjYi0+bXR1ID0gMDsKLQotICAgIC8vIGNsZWFyIHJlYWxsb2NhdGluZwotICAgIHBfc3JjYi0+Z2F0dF9kYXRhYmFzZS5DbGVhcigpOwotICB9Ci0KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfY2xjYi0+cF9xX2NtZCk7Ci0gIG1lbXNldChwX2NsY2IsIDAsIHNpemVvZih0QlRBX0dBVFRDX0NMQ0IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19maW5kX3NyY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgc2VydmVyIGNhY2hlIGJ5IHJlbW90ZSBiZCBhZGRyZXNzIGN1cnJlbnRseSBpbiB1c2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNlcnZlciBjYWNoZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19TRVJWKiBidGFfZ2F0dGNfZmluZF9zcmNiKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiA9ICZidGFfZ2F0dGNfY2Iua25vd25fc2VydmVyWzBdOwotICB1aW50OF90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGJsZV9hY2NlcHRsaXN0X3NpemUoKTsgaSsrLCBwX3NyY2IrKykgewotICAgIGlmIChwX3NyY2ItPmluX3VzZSAmJiBwX3NyY2ItPnNlcnZlcl9iZGEgPT0gYmRhKSByZXR1cm4gcF9zcmNiOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX2ZpbmRfc3J2cl9jYWNoZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZmluZCBzZXJ2ZXIgY2FjaGUgYnkgcmVtb3RlIGJkIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNlcnZlciBjYWNoZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19TRVJWKiBidGFfZ2F0dGNfZmluZF9zcnZyX2NhY2hlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiA9ICZidGFfZ2F0dGNfY2Iua25vd25fc2VydmVyWzBdOwotICB1aW50OF90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGJsZV9hY2NlcHRsaXN0X3NpemUoKTsgaSsrLCBwX3NyY2IrKykgewotICAgIGlmIChwX3NyY2ItPnNlcnZlcl9iZGEgPT0gYmRhKSByZXR1cm4gcF9zcmNiOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgc2VydmVyIGNvbnRyb2wgYmxvY2sgYnkgY29ubmVjdGlvbiBJRAotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2VydmVyIGNhY2hlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX1NFUlYqIGJ0YV9nYXR0Y19maW5kX3NjYl9ieV9jaWQodWludDE2X3QgY29ubl9pZCkgewotICB0QlRBX0dBVFRDX0NMQ0IqIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLQotICBpZiAocF9jbGNiKQotICAgIHJldHVybiBwX2NsY2ItPnBfc3JjYjsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19zcmNiX2FsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBhbGxvY2F0ZSBzZXJ2ZXIgY2FjaGUgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2VydmVyIGNhY2hlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX1NFUlYqIGJ0YV9nYXR0Y19zcmNiX2FsbG9jKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB0QlRBX0dBVFRDX1NFUlYgKnBfdGNiID0gJmJ0YV9nYXR0Y19jYi5rbm93bl9zZXJ2ZXJbMF0sICpwX3JlY3ljbGUgPSBOVUxMOwotICBib29sIGZvdW5kID0gZmFsc2U7Ci0gIHVpbnQ4X3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgYmxlX2FjY2VwdGxpc3Rfc2l6ZSgpOyBpKyssIHBfdGNiKyspIHsKLSAgICBpZiAoIXBfdGNiLT5pbl91c2UpIHsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoIXBfdGNiLT5jb25uZWN0ZWQpIHsKLSAgICAgIHBfcmVjeWNsZSA9IHBfdGNiOwotICAgIH0KLSAgfQotCi0gIC8qIGlmIG5vdCBmb3VuZCwgdHJ5IHRvIHJlY3ljbGUgb25lIGtub3duIGRldmljZSAqLwotICBpZiAoIWZvdW5kICYmICFwX3JlY3ljbGUpCi0gICAgcF90Y2IgPSBOVUxMOwotICBlbHNlIGlmICghZm91bmQgJiYgcF9yZWN5Y2xlKQotICAgIHBfdGNiID0gcF9yZWN5Y2xlOwotCi0gIGlmIChwX3RjYiAhPSBOVUxMKSB7Ci0gICAgLy8gY2xlYXIgcmVhbGxvY2F0aW5nCi0gICAgcF90Y2ItPmdhdHRfZGF0YWJhc2UuQ2xlYXIoKTsKLSAgICBwX3RjYi0+cGVuZGluZ19kaXNjb3ZlcnkuQ2xlYXIoKTsKLSAgICAqcF90Y2IgPSB0QlRBX0dBVFRDX1NFUlYoKTsKLQotICAgIHBfdGNiLT5pbl91c2UgPSB0cnVlOwotICAgIHBfdGNiLT5zZXJ2ZXJfYmRhID0gYmRhOwotICB9Ci0gIHJldHVybiBwX3RjYjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfZW5xdWV1ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZW5xdWV1ZSBhIGNsaWVudCByZXF1ZXN0IGluIGNsY2IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdWNjZXNzIG9yIGZhaWx1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2dhdHRjX2VucXVldWUodEJUQV9HQVRUQ19DTENCKiBwX2NsY2IsIGNvbnN0IHRCVEFfR0FUVENfREFUQSogcF9kYXRhKSB7Ci0gIGlmIChwX2NsY2ItPnBfcV9jbWQgPT0gTlVMTCkgewotICAgIHBfY2xjYi0+cF9xX2NtZCA9IHBfZGF0YTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogYWxyZWFkeSBoYXMgYSBwZW5kaW5nIGNvbW1hbmQiOwotICAvKiBza2lwIHRoZSBjYWxsYmFjayBub3cuIC0tLS0tIG5lZWQgdG8gc2VuZCBjYWxsYmFjayA/ICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19jaGVja19ub3RpZl9yZWdpc3RyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgaWYgdGhlIHNlcnZpY2Ugbm90aWZpY2FpdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkLgotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfZ2F0dGNfY2hlY2tfbm90aWZfcmVnaXN0cnkodEJUQV9HQVRUQ19SQ0IqIHBfY2xyZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX1NFUlYqIHBfc3JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfTk9USUZZKiBwX25vdGlmeSkgewotICB1aW50OF90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19OT1RJRl9SRUdfTUFYOyBpKyspIHsKLSAgICBpZiAocF9jbHJlZy0+bm90aWZfcmVnW2ldLmluX3VzZSAmJgotICAgICAgICBwX2NscmVnLT5ub3RpZl9yZWdbaV0ucmVtb3RlX2JkYSA9PSBwX3NyY2ItPnNlcnZlcl9iZGEgJiYKLSAgICAgICAgcF9jbHJlZy0+bm90aWZfcmVnW2ldLmhhbmRsZSA9PSBwX25vdGlmeS0+aGFuZGxlKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJOb3RpZmljYXRpb24gcmVnaXN0ZXJlZCEiOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfY2xlYXJfbm90aWZfcmVnaXN0cmF0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbGVhciB1cCB0aGUgbm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBieQotICogICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBXaGVyZSBoYW5kbGUgaXMgYmV0d2VlbiBzdGFydF9oYW5kbGUgYW5kIGVuZF9oYW5kbGUsIGFuZAotICogICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUgYW5kIGVuZF9oYW5kbGUgYXJlIGJvdW5kYXJpZXMgb2Ygc2VydmljZQotICogICAgICAgICAgICAgICAgICBjb250YWluaW5nIGNoYXJhY3RlcmlzdGljLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dGNfY2xlYXJfbm90aWZfcmVnaXN0cmF0aW9uKHRCVEFfR0FUVENfU0VSViogcF9zcmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfaGFuZGxlKSB7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLSAgdEJUQV9HQVRUQ19SQ0IqIHBfY2xyY2I7Ci0gIHVpbnQ4X3QgaTsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLQotICBpZiAoR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IoY29ubl9pZCwgJmdhdHRfaWYsIHJlbW90ZV9iZGEsICZ0cmFuc3BvcnQpKSB7Ci0gICAgcF9jbHJjYiA9IGJ0YV9nYXR0Y19jbF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0gICAgaWYgKHBfY2xyY2IgIT0gTlVMTCkgewotICAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUQ19OT1RJRl9SRUdfTUFYOyBpKyspIHsKLSAgICAgICAgaWYgKHBfY2xyY2ItPm5vdGlmX3JlZ1tpXS5pbl91c2UgJiYKLSAgICAgICAgICAgIHBfY2xyY2ItPm5vdGlmX3JlZ1tpXS5yZW1vdGVfYmRhID09IHJlbW90ZV9iZGEpIHsKLSAgICAgICAgICAvKiBJdCdzIGVub3VnaCB0byBnZXQgc2VydmljZSBvciBjaGFyYWN0ZXJpc3RpYyBoYW5kbGUsIGFzCi0gICAgICAgICAgICogY2xlYXIgYm91bmRhcmllcyBhcmUgYWx3YXlzIGFyb3VuZCBzZXJ2aWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGhhbmRsZSA9IHBfY2xyY2ItPm5vdGlmX3JlZ1tpXS5oYW5kbGU7Ci0gICAgICAgICAgaWYgKGhhbmRsZSA+PSBzdGFydF9oYW5kbGUgJiYgaGFuZGxlIDw9IGVuZF9oYW5kbGUpCi0gICAgICAgICAgICBtZW1zZXQoJnBfY2xyY2ItPm5vdGlmX3JlZ1tpXSwgMCwgc2l6ZW9mKHRCVEFfR0FUVENfTk9USUZfUkVHKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiY2FuIG5vdCBjbGVhciBpbmRpY2F0aW9uL25vdGlmIHJlZ2lzdHJhdGlvbiBmb3IgdW5rbm93biBhcHAiOwotICB9Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIG1hcmsgYmFja2dyb3VuZCBjb25uZWN0aW9uIHN0YXR1cyB3aGVuIGEgYmcgY29ubmVjdGlvbiBpcwotICogICAgICAgICAgICAgICAgICBpbml0aWF0ZWQgb3IgdGVybWluYXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9nYXR0Y19tYXJrX2JnX2Nvbm4odEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGFfcHRyLCBib29sIGFkZCkgewotICB0QlRBX0dBVFRDX0JHX1RDSyogcF9iZ190Y2sgPSAmYnRhX2dhdHRjX2NiLmJnX3RyYWNrWzBdOwotICB1aW50OF90IGkgPSAwOwotICB0QlRBX0dBVFRDX0NJRl9NQVNLKiBwX2NpZl9tYXNrOwotCi0gIGZvciAoaSA9IDA7IGkgPCBibGVfYWNjZXB0bGlzdF9zaXplKCk7IGkrKywgcF9iZ190Y2srKykgewotICAgIGlmIChwX2JnX3Rjay0+aW5fdXNlICYmICgocF9iZ190Y2stPnJlbW90ZV9iZGEgPT0gcmVtb3RlX2JkYV9wdHIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX2JnX3Rjay0+cmVtb3RlX2JkYS5Jc0VtcHR5KCkpKSkgewotICAgICAgcF9jaWZfbWFzayA9ICZwX2JnX3Rjay0+Y2lmX21hc2s7Ci0KLSAgICAgIGlmIChhZGQpIC8qIG1hc2sgb24gdGhlIGNpZiBiaXQgKi8KLSAgICAgICAgKnBfY2lmX21hc2sgfD0gKDEgPDwgKGNsaWVudF9pZiAtIDEpKTsKLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoY2xpZW50X2lmICE9IDApCi0gICAgICAgICAgKnBfY2lmX21hc2sgJj0gKH4oMSA8PCAoY2xpZW50X2lmIC0gMSkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICpwX2NpZl9tYXNrID0gMDsKLSAgICAgIH0KLSAgICAgIC8qIG5vIEJHIGNvbm5lY3Rpb24gZm9yIHRoaXMgZGV2aWNlLCBtYWtlIGl0IGF2YWlsYWJsZSAqLwotICAgICAgaWYgKHBfYmdfdGNrLT5jaWZfbWFzayA9PSAwKSB7Ci0gICAgICAgIG1lbXNldChwX2JnX3RjaywgMCwgc2l6ZW9mKHRCVEFfR0FUVENfQkdfVENLKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFhZGQpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiIHVuYWJsZSB0byBmaW5kIHRoZSBiZyBjb25uZWN0aW9uIG1hc2sgZm9yIGJkX2FkZHI9IgotICAgICAgICAgICAgICAgPDwgcmVtb3RlX2JkYV9wdHI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgLyogYWRkaW5nIGEgbmV3IGRldmljZSBtYXNrICovCi0gIHsKLSAgICBmb3IgKGkgPSAwLCBwX2JnX3RjayA9ICZidGFfZ2F0dGNfY2IuYmdfdHJhY2tbMF07IGkgPCBibGVfYWNjZXB0bGlzdF9zaXplKCk7Ci0gICAgICAgICBpKyssIHBfYmdfdGNrKyspIHsKLSAgICAgIGlmICghcF9iZ190Y2stPmluX3VzZSkgewotICAgICAgICBwX2JnX3Rjay0+aW5fdXNlID0gdHJ1ZTsKLSAgICAgICAgcF9iZ190Y2stPnJlbW90ZV9iZGEgPSByZW1vdGVfYmRhX3B0cjsKLQotICAgICAgICBwX2NpZl9tYXNrID0gJnBfYmdfdGNrLT5jaWZfbWFzazsKLQotICAgICAgICAqcF9jaWZfbWFzayA9ICgxIDw8IChjbGllbnRfaWYgLSAxKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBMT0coRVJST1IpIDw8ICJubyBhdmFpbGFibGUgc3BhY2UgdG8gbWFyayB0aGUgYmcgY29ubmVjdGlvbiBzdGF0dXMiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19jaGVja19iZ19jb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBjaGVjayBpZiB0aGlzIGlzIGEgYmFja2dyb3VuZCBjb25uZWN0aW9uIGJhY2tncm91bmQKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9nYXR0Y19jaGVja19iZ19jb25uKHRHQVRUX0lGIGNsaWVudF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByb2xlKSB7Ci0gIHRCVEFfR0FUVENfQkdfVENLKiBwX2JnX3RjayA9ICZidGFfZ2F0dGNfY2IuYmdfdHJhY2tbMF07Ci0gIHVpbnQ4X3QgaSA9IDA7Ci0gIGJvb2wgaXNfYmdfY29ubiA9IGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBibGVfYWNjZXB0bGlzdF9zaXplKCkgJiYgIWlzX2JnX2Nvbm47IGkrKywgcF9iZ190Y2srKykgewotICAgIGlmIChwX2JnX3Rjay0+aW5fdXNlICYmIChwX2JnX3Rjay0+cmVtb3RlX2JkYSA9PSByZW1vdGVfYmRhIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYmdfdGNrLT5yZW1vdGVfYmRhLklzRW1wdHkoKSkpIHsKLSAgICAgIGlmICgoKHBfYmdfdGNrLT5jaWZfbWFzayAmICgxIDw8IChjbGllbnRfaWYgLSAxKSkpICE9IDApICYmCi0gICAgICAgICAgcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKQotICAgICAgICBpc19iZ19jb25uID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlzX2JnX2Nvbm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX3NlbmRfb3Blbl9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc2VuZCBvcGVuIGNhbGxiYWNrCi0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0Y19zZW5kX29wZW5fY2JhY2sodEJUQV9HQVRUQ19SQ0IqIHBfY2xyZWcsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdWludDE2X3QgbXR1KSB7Ci0gIHRCVEFfR0FUVEMgY2JfZGF0YTsKLQotICBpZiAocF9jbHJlZy0+cF9jYmFjaykgewotICAgIG1lbXNldCgmY2JfZGF0YSwgMCwgc2l6ZW9mKHRCVEFfR0FUVEMpKTsKLQotICAgIGNiX2RhdGEub3Blbi5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgY2JfZGF0YS5vcGVuLmNsaWVudF9pZiA9IHBfY2xyZWctPmNsaWVudF9pZjsKLSAgICBjYl9kYXRhLm9wZW4uY29ubl9pZCA9IGNvbm5faWQ7Ci0gICAgY2JfZGF0YS5vcGVuLm10dSA9IG10dTsKLSAgICBjYl9kYXRhLm9wZW4udHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgIGNiX2RhdGEub3Blbi5yZW1vdGVfYmRhID0gcmVtb3RlX2JkYTsKLQotICAgICgqcF9jbHJlZy0+cF9jYmFjaykoQlRBX0dBVFRDX09QRU5fRVZULCAmY2JfZGF0YSk7Ci0gIH0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfY29ubl9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgYWxsb2NhdGUgY29ubmVjdGlvbiB0cmFja2luZyBzcG90Ci0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjbGNiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfR0FUVENfQ09OTiogYnRhX2dhdHRjX2Nvbm5fYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB1aW50OF90IGlfY29ubiA9IDA7Ci0gIHRCVEFfR0FUVENfQ09OTiogcF9jb25uID0gJmJ0YV9nYXR0Y19jYi5jb25uX3RyYWNrWzBdOwotCi0gIGZvciAoaV9jb25uID0gMDsgaV9jb25uIDwgR0FUVF9NQVhfUEhZX0NIQU5ORUw7IGlfY29ubisrLCBwX2Nvbm4rKykgewotICAgIGlmICghcF9jb25uLT5pbl91c2UpIHsKLSNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKLSAgICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogZm91bmQgY29ubl90cmFjazoiIDw8ICtpX2Nvbm4gPDwgIiBhdmFpbGFibGUiOwotI2VuZGlmCi0gICAgICBwX2Nvbm4tPmluX3VzZSA9IHRydWU7Ci0gICAgICBwX2Nvbm4tPnJlbW90ZV9iZGEgPSByZW1vdGVfYmRhOwotICAgICAgcmV0dXJuIHBfY29ubjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfY29ubl9maW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBhbGxvY2F0ZSBjb25uZWN0aW9uIHRyYWNraW5nIHNwb3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19DT05OKiBidGFfZ2F0dGNfY29ubl9maW5kKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgdWludDhfdCBpX2Nvbm4gPSAwOwotICB0QlRBX0dBVFRDX0NPTk4qIHBfY29ubiA9ICZidGFfZ2F0dGNfY2IuY29ubl90cmFja1swXTsKLQotICBmb3IgKGlfY29ubiA9IDA7IGlfY29ubiA8IEdBVFRfTUFYX1BIWV9DSEFOTkVMOyBpX2Nvbm4rKywgcF9jb25uKyspIHsKLSAgICBpZiAocF9jb25uLT5pbl91c2UgJiYgcmVtb3RlX2JkYSA9PSBwX2Nvbm4tPnJlbW90ZV9iZGEpIHsKLSNpZiAoQlRBX0dBVFRfREVCVUcgPT0gVFJVRSkKLSAgICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogZm91bmQgY29ubl90cmFjazoiIDw8ICtpX2Nvbm4gPDwgIiBtYXRjaGVkIjsKLSNlbmRpZgotICAgICAgcmV0dXJuIHBfY29ubjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfY29ubl9maW5kX2FsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIG9yIGFsbG9jYXRlIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3BvdAotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2xjYgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRDX0NPTk4qIGJ0YV9nYXR0Y19jb25uX2ZpbmRfYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB0QlRBX0dBVFRDX0NPTk4qIHBfY29ubiA9IGJ0YV9nYXR0Y19jb25uX2ZpbmQocmVtb3RlX2JkYSk7Ci0KLSAgaWYgKHBfY29ubiA9PSBOVUxMKSB7Ci0gICAgcF9jb25uID0gYnRhX2dhdHRjX2Nvbm5fYWxsb2MocmVtb3RlX2JkYSk7Ci0gIH0KLSAgcmV0dXJuIHBfY29ubjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0Y19jb25uX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRlLWFsbG9jYXRlIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3BvdAotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2xjYgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9nYXR0Y19jb25uX2RlYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB0QlRBX0dBVFRDX0NPTk4qIHBfY29ubiA9IGJ0YV9nYXR0Y19jb25uX2ZpbmQocmVtb3RlX2JkYSk7Ci0KLSAgaWYgKHBfY29ubiAhPSBOVUxMKSB7Ci0gICAgcF9jb25uLT5pbl91c2UgPSBmYWxzZTsKLSAgICBwX2Nvbm4tPnJlbW90ZV9iZGEgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRjX2ZpbmRfaW50X2Nvbm5fY2xjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgdHJ5IHRvIGxvY2F0ZSBhIGNsY2Igd2hlbiBhbiBpbnRlcm5hbCBjb25uZWNpb24gZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgYXJyaXZlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19DTENCKiBidGFfZ2F0dGNfZmluZF9pbnRfY29ubl9jbGNiKHRCVEFfR0FUVENfREFUQSogcF9tc2cpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBOVUxMOwotCi0gIGlmIChwX21zZy0+aW50X2Nvbm4ucm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKQotICAgIGJ0YV9nYXR0Y19jb25uX2ZpbmRfYWxsb2MocF9tc2ctPmludF9jb25uLnJlbW90ZV9iZGEpOwotCi0gIC8qIHRyeSB0byBsb2NhdGUgYSBsb2dpYyBjaGFubmVsICovCi0gIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY2lmKHBfbXNnLT5pbnRfY29ubi5jbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5pbnRfY29ubi5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+aW50X2Nvbm4udHJhbnNwb3J0KTsKLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSB7Ci0gICAgLyogZm9yIGEgYmFja2dyb3VuZCBjb25uZWN0aW9uIG9yIGxpc3RlbmluZyBjb25uZWN0aW9uICovCi0gICAgaWYgKC8qcF9tc2ctPmludF9jb25uLnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCB8fCAgKi8KLSAgICAgICAgYnRhX2dhdHRjX2NoZWNrX2JnX2Nvbm4ocF9tc2ctPmludF9jb25uLmNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmludF9jb25uLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5pbnRfY29ubi5yb2xlKSkgewotICAgICAgLyogYWxsb2NhdGUgYSBuZXcgY2hhbm5lbCAqLwotICAgICAgcF9jbGNiID0gYnRhX2dhdHRjX2NsY2JfYWxsb2MocF9tc2ctPmludF9jb25uLmNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5pbnRfY29ubi5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmludF9jb25uLnRyYW5zcG9ydCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwX2NsY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfZmluZF9pbnRfZGlzY29ubl9jbGNiCi0gKgotICogRGVzY3JpcHRpb24gICAgICB0cnkgdG8gbG9jYXRlIGEgY2xjYiB3aGVuIGFuIGludGVybmFsIGRpc2Nvbm5lY3QgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgYXJyaXZlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNsY2IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUQ19DTENCKiBidGFfZ2F0dGNfZmluZF9pbnRfZGlzY29ubl9jbGNiKHRCVEFfR0FUVENfREFUQSogcF9tc2cpIHsKLSAgdEJUQV9HQVRUQ19DTENCKiBwX2NsY2IgPSBOVUxMOwotCi0gIGJ0YV9nYXR0Y19jb25uX2RlYWxsb2MocF9tc2ctPmludF9jb25uLnJlbW90ZV9iZGEpOwotICBwX2NsY2IgPSBidGFfZ2F0dGNfZmluZF9jbGNiX2J5X2Nvbm5faWQocF9tc2ctPmludF9jb25uLmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChwX2NsY2IgPT0gTlVMTCkgewotICAgIC8qIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQsIHNlbmQgY29ubmVjdGlvbiBjYWxsYmFjayBldmVudCAqLwotICAgIHBfY2xjYiA9IGJ0YV9nYXR0Y19maW5kX2NsY2JfYnlfY2lmKHBfbXNnLT5pbnRfY29ubi5jbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmludF9jb25uLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmludF9jb25uLnRyYW5zcG9ydCk7Ci0gIH0KLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSB7Ci0gICAgVkxPRygxKSA8PCAiIGRpc2Nvbm5lY3Rpb24gSUQ6IiA8PCArcF9tc2ctPmludF9jb25uLmhkci5sYXllcl9zcGVjaWZpYwotICAgICAgICAgICAgPDwgIiBub3QgdXNlZCBieSBCVEEiOwotICB9Ci0gIHJldHVybiBwX2NsY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgaWYgcm9idXN0IGNhY2hpbmcgaXMgZW5hYmxlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBlbmFibGVkOyBvdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfZ2F0dGNfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpIHsKLSAgcmV0dXJuIGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnYXR0X3JvYnVzdF9jYWNoaW5nX2lzX2VuYWJsZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0c19hY3QuY2MgYi9idGEvZ2F0dC9idGFfZ2F0dHNfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Q3YjM0Li4wMDAwMDAwCi0tLSBhL2J0YS9nYXR0L2J0YV9nYXR0c19hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEdBVFQgU2VydmVyIGFjdGlvbiBmdW5jdGlvbnMgZm9yIHRoZSBzdGF0ZQotICogIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvZ2F0dC9idGFfZ2F0dHNfaW50LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2RlYnVnX2Nvbm4uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfbnZfc2F2ZV9jYmFjayhib29sIGlzX3NhdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX0hORExfUkFOR0UqIHBfaG5kbF9yYW5nZSk7Ci1zdGF0aWMgYm9vbCBidGFfZ2F0dHNfbnZfc3J2X2NoZ19jYmFjayh0R0FUVFNfU1JWX0NIR19DTUQgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1NSVl9DSEdfUkVRKiBwX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19TUlZfQ0hHX1JTUCogcF9yc3ApOwotCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfY29ubl9jYmFjayh0R0FUVF9JRiBnYXR0X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLXN0YXRpYyB2b2lkIGJ0YV9nYXR0c19zZW5kX3JlcXVlc3RfY2JhY2sodWludDE2X3QgY29ubl9pZCwgdWludDMyX3QgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSByZXFfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX0RBVEEqIHBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfY29uZ19jYmFjayh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfcGh5X3VwZGF0ZV9jYmFjayh0R0FUVF9JRiBnYXR0X2lmLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfY29ubl91cGRhdGVfY2JhY2sodEdBVFRfSUYgZ2F0dF9pZiwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0LCB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLQotc3RhdGljIHRHQVRUX0NCQUNLIGJ0YV9nYXR0c19jYmFjayA9IHsKLSAgICAucF9jb25uX2NiID0gYnRhX2dhdHRzX2Nvbm5fY2JhY2ssCi0gICAgLnBfY21wbF9jYiA9IG51bGxwdHIsCi0gICAgLnBfZGlzY19yZXNfY2IgPSBudWxscHRyLAotICAgIC5wX2Rpc2NfY21wbF9jYiA9IG51bGxwdHIsCi0gICAgLnBfcmVxX2NiID0gYnRhX2dhdHRzX3NlbmRfcmVxdWVzdF9jYmFjaywKLSAgICAucF9lbmNfY21wbF9jYiA9IG51bGxwdHIsCi0gICAgLnBfY29uZ2VzdGlvbl9jYiA9IGJ0YV9nYXR0c19jb25nX2NiYWNrLAotICAgIC5wX3BoeV91cGRhdGVfY2IgPSBidGFfZ2F0dHNfcGh5X3VwZGF0ZV9jYmFjaywKLSAgICAucF9jb25uX3VwZGF0ZV9jYiA9IGJ0YV9nYXR0c19jb25uX3VwZGF0ZV9jYmFjaywKLX07Ci0KLXRHQVRUX0FQUExfSU5GTyBidGFfZ2F0dHNfbnZfY2JhY2sgPSB7YnRhX2dhdHRzX252X3NhdmVfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9nYXR0c19udl9zcnZfY2hnX2NiYWNrfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0c19udl9zYXZlX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBOViBzYXZlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgaXNfYWRkOiB0cnVlIGlzIHRvIGFkZCBhIGhhbmRsZSByYW5nZTsgb3RoZXJ3aXNlIGlzIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlLgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfbnZfc2F2ZV9jYmFjayhib29sIGlzX2FkZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19ITkRMX1JBTkdFKiBwX2huZGxfcmFuZ2UpIHt9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfbnZfc3J2X2NoZ19jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTlYgc2F2ZSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGlzX2FkZDogdHJ1ZSBpcyB0byBhZGQgYSBoYW5kbGUgcmFuZ2U7IG90aGVyd2lzZSBpcyB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZS4KLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRhX2dhdHRzX252X3Nydl9jaGdfY2JhY2sodEdBVFRTX1NSVl9DSEdfQ01EIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19TUlZfQ0hHX1JFUSogcF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVFNfU1JWX0NIR19SU1AqIHBfcnNwKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0c19lbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGVuYWJsZSBCVEEgR0FUVFMgbW9kdWxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dHNfZW5hYmxlKHRCVEFfR0FUVFNfQ0IqIHBfY2IpIHsKLSAgaWYgKHBfY2ItPmVuYWJsZWQpIHsKLSAgICBWTE9HKDEpIDw8ICJHQVRUUyBhbHJlYWR5IGVuYWJsZWQuIjsKLSAgfSBlbHNlIHsKLSAgICBtZW1zZXQocF9jYiwgMCwgc2l6ZW9mKHRCVEFfR0FUVFNfQ0IpKTsKLQotICAgIHBfY2ItPmVuYWJsZWQgPSB0cnVlOwotCi0gICAgaWYgKCFHQVRUU19OVlJlZ2lzdGVyKCZidGFfZ2F0dHNfbnZfY2JhY2spKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJCVEEgR0FUVFMgTlYgcmVnaXN0ZXIgZmFpbGVkLiI7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfYXBpX2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRpc2FibGUgQlRBIEdBVFRTIG1vZHVsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRzX2FwaV9kaXNhYmxlKHRCVEFfR0FUVFNfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCBpOwotCi0gIGlmIChwX2NiLT5lbmFibGVkKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUU19NQVhfQVBQX05VTTsgaSsrKSB7Ci0gICAgICBpZiAocF9jYi0+cmNiW2ldLmluX3VzZSkgewotICAgICAgICBHQVRUX0RlcmVnaXN0ZXIocF9jYi0+cmNiW2ldLmdhdHRfaWYpOwotICAgICAgfQotICAgIH0KLSAgICBtZW1zZXQocF9jYiwgMCwgc2l6ZW9mKHRCVEFfR0FUVFNfQ0IpKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8ICJHQVRUUyBub3QgZW5hYmxlZCI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0c19yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmVnaXN0ZXIgYW4gYXBwbGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0c19yZWdpc3Rlcih0QlRBX0dBVFRTX0NCKiBwX2NiLCB0QlRBX0dBVFRTX0RBVEEqIHBfbXNnKSB7Ci0gIHRCVEFfR0FUVFMgY2JfZGF0YTsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgdWludDhfdCBpLCBmaXJzdF91bnVzZSA9IDB4ZmY7Ci0KLSAgaWYgKCFwX2NiLT5lbmFibGVkKSB7Ci0gICAgYnRhX2dhdHRzX2VuYWJsZShwX2NiKTsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVFNfTUFYX0FQUF9OVU07IGkrKykgewotICAgIGlmIChwX2NiLT5yY2JbaV0uaW5fdXNlKSB7Ci0gICAgICBpZiAocF9jYi0+cmNiW2ldLmFwcF91dWlkID09IHBfbXNnLT5hcGlfcmVnLmFwcF91dWlkKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgImFwcGxpY2F0aW9uIGFscmVhZHkgcmVnaXN0ZXJlZC4iOwotICAgICAgICBzdGF0dXMgPSBHQVRUX0RVUF9SRUc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IEJUQV9HQVRUU19NQVhfQVBQX05VTTsgaSsrKSB7Ci0gICAgICBpZiAoZmlyc3RfdW51c2UgPT0gMHhmZiAmJiAhcF9jYi0+cmNiW2ldLmluX3VzZSkgewotICAgICAgICBmaXJzdF91bnVzZSA9IGk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGNiX2RhdGEucmVnX29wZXIuc2VydmVyX2lmID0gQlRBX0dBVFRTX0lOVkFMSURfSUY7Ci0gICAgY2JfZGF0YS5yZWdfb3Blci51dWlkID0gcF9tc2ctPmFwaV9yZWcuYXBwX3V1aWQ7Ci0gICAgaWYgKGZpcnN0X3VudXNlICE9IDB4ZmYpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAicmVnaXN0ZXIgYXBwbGljYXRpb24gZmlyc3RfdW51c2UgcmNiX2lkeD0iIDw8ICtmaXJzdF91bnVzZTsKLQotICAgICAgcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5pbl91c2UgPSB0cnVlOwotICAgICAgcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5wX2NiYWNrID0gcF9tc2ctPmFwaV9yZWcucF9jYmFjazsKLSAgICAgIHBfY2ItPnJjYltmaXJzdF91bnVzZV0uYXBwX3V1aWQgPSBwX21zZy0+YXBpX3JlZy5hcHBfdXVpZDsKLSAgICAgIGNiX2RhdGEucmVnX29wZXIuc2VydmVyX2lmID0gcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5nYXR0X2lmID0KLSAgICAgICAgICBHQVRUX1JlZ2lzdGVyKHBfbXNnLT5hcGlfcmVnLmFwcF91dWlkLCAiR2F0dFNlcnZlciIsICZidGFfZ2F0dHNfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+YXBpX3JlZy5lYXR0X3N1cHBvcnQpOwotICAgICAgaWYgKCFwX2NiLT5yY2JbZmlyc3RfdW51c2VdLmdhdHRfaWYpIHsKLSAgICAgICAgc3RhdHVzID0gR0FUVF9OT19SRVNPVVJDRVM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0QlRBX0dBVFRTX0lOVF9TVEFSVF9JRiogcF9idWYgPSAodEJUQV9HQVRUU19JTlRfU1RBUlRfSUYqKW9zaV9tYWxsb2MoCi0gICAgICAgICAgICBzaXplb2YodEJUQV9HQVRUU19JTlRfU1RBUlRfSUYpKTsKLSAgICAgICAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUU19JTlRfU1RBUlRfSUZfRVZUOwotICAgICAgICBwX2J1Zi0+c2VydmVyX2lmID0gcF9jYi0+cmNiW2ZpcnN0X3VudXNlXS5nYXR0X2lmOwotCi0gICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXR1cyA9IEdBVFRfTk9fUkVTT1VSQ0VTOwotICAgIH0KLSAgfQotICBjYl9kYXRhLnJlZ19vcGVyLnN0YXR1cyA9IHN0YXR1czsKLSAgaWYgKHBfbXNnLT5hcGlfcmVnLnBfY2JhY2spCi0gICAgKCpwX21zZy0+YXBpX3JlZy5wX2NiYWNrKShCVEFfR0FUVFNfUkVHX0VWVCwgJmNiX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX3N0YXJ0X2lmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzdGFydCBhbiBhcHBsaWNhdGlvbiBpbnRlcmZhY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0c19zdGFydF9pZihVTlVTRURfQVRUUiB0QlRBX0dBVFRTX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUU19EQVRBKiBwX21zZykgewotICBpZiAoYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYocF9tc2ctPmludF9zdGFydF9pZi5zZXJ2ZXJfaWYpKSB7Ci0gICAgR0FUVF9TdGFydElmKHBfbXNnLT5pbnRfc3RhcnRfaWYuc2VydmVyX2lmKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQgYXBwLjogVW5rbm93biBpbnRlcmZhY2U9IgotICAgICAgICAgICAgICAgPDwgK3BfbXNnLT5pbnRfc3RhcnRfaWYuc2VydmVyX2lmOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRlcmVnaXN0ZXIgYW4gYXBwbGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0c19kZXJlZ2lzdGVyKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfRVJST1I7Ci0gIHRCVEFfR0FUVFNfQ0JBQ0sqIHBfY2JhY2sgPSBOVUxMOwotICB1aW50OF90IGk7Ci0gIHRCVEFfR0FUVFMgY2JfZGF0YTsKLQotICBjYl9kYXRhLnJlZ19vcGVyLnNlcnZlcl9pZiA9IHBfbXNnLT5hcGlfZGVyZWcuc2VydmVyX2lmOwotICBjYl9kYXRhLnJlZ19vcGVyLnN0YXR1cyA9IHN0YXR1czsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRTX01BWF9BUFBfTlVNOyBpKyspIHsKLSAgICBpZiAocF9jYi0+cmNiW2ldLmluX3VzZSAmJgotICAgICAgICBwX2NiLT5yY2JbaV0uZ2F0dF9pZiA9PSBwX21zZy0+YXBpX2RlcmVnLnNlcnZlcl9pZikgewotICAgICAgcF9jYmFjayA9IHBfY2ItPnJjYltpXS5wX2NiYWNrOwotICAgICAgc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotCi0gICAgICAvKiBkZXJlZ2lzdGVyIHRoZSBhcHAgKi8KLSAgICAgIEdBVFRfRGVyZWdpc3RlcihwX2NiLT5yY2JbaV0uZ2F0dF9pZik7Ci0KLSAgICAgIC8qIHJlc2V0IGNiICovCi0gICAgICBtZW1zZXQoJnBfY2ItPnJjYltpXSwgMCwgc2l6ZW9mKHRCVEFfR0FUVFNfUkNCKSk7Ci0gICAgICBjYl9kYXRhLnJlZ19vcGVyLnN0YXR1cyA9IHN0YXR1czsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChwX2NiYWNrKSB7Ci0gICAgKCpwX2NiYWNrKShCVEFfR0FUVFNfREVSRUdfRVZULCAmY2JfZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiYXBwbGljYXRpb24gbm90IHJlZ2lzdGVyZWQuIjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2RlbGV0ZV9zZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBhY3Rpb24gZnVuY3Rpb24gdG8gZGVsZXRlIGEgc2VydmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRzX2RlbGV0ZV9zZXJ2aWNlKHRCVEFfR0FUVFNfU1JWQ19DQiogcF9zcnZjX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUU19EQVRBKiBwX21zZykgewotICB0QlRBX0dBVFRTX1JDQiogcF9yY2IgPSAmYnRhX2dhdHRzX2NiLnJjYltwX3NydmNfY2ItPnJjYl9pZHhdOwotICB0QlRBX0dBVFRTIGNiX2RhdGE7Ci0KLSAgY2JfZGF0YS5zcnZjX29wZXIuc2VydmVyX2lmID0gcF9yY2ItPmdhdHRfaWY7Ci0gIGNiX2RhdGEuc3J2Y19vcGVyLnNlcnZpY2VfaWQgPSBwX3NydmNfY2ItPnNlcnZpY2VfaWQ7Ci0KLSAgaWYgKEdBVFRTX0RlbGV0ZVNlcnZpY2UocF9yY2ItPmdhdHRfaWYsICZwX3NydmNfY2ItPnNlcnZpY2VfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zcnZjX2NiLT5zZXJ2aWNlX2lkKSkgewotICAgIGNiX2RhdGEuc3J2Y19vcGVyLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICBtZW1zZXQocF9zcnZjX2NiLCAwLCBzaXplb2YodEJUQV9HQVRUU19TUlZDX0NCKSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2JfZGF0YS5zcnZjX29wZXIuc3RhdHVzID0gR0FUVF9FUlJPUjsKLSAgfQotCi0gIGlmIChwX3JjYi0+cF9jYmFjaykgKCpwX3JjYi0+cF9jYmFjaykoQlRBX0dBVFRTX0RFTEVMVEVfRVZULCAmY2JfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfc3RvcF9zZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBhY3Rpb24gZnVuY3Rpb24gdG8gc3RvcCBhIHNlcnZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9nYXR0c19zdG9wX3NlcnZpY2UodEJUQV9HQVRUU19TUlZDX0NCKiBwX3NydmNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUQV9HQVRUU19EQVRBKiBwX21zZykgewotICB0QlRBX0dBVFRTX1JDQiogcF9yY2IgPSAmYnRhX2dhdHRzX2NiLnJjYltwX3NydmNfY2ItPnJjYl9pZHhdOwotICB0QlRBX0dBVFRTIGNiX2RhdGE7Ci0KLSAgR0FUVFNfU3RvcFNlcnZpY2UocF9zcnZjX2NiLT5zZXJ2aWNlX2lkKTsKLSAgY2JfZGF0YS5zcnZjX29wZXIuc2VydmVyX2lmID0gcF9yY2ItPmdhdHRfaWY7Ci0gIGNiX2RhdGEuc3J2Y19vcGVyLnNlcnZpY2VfaWQgPSBwX3NydmNfY2ItPnNlcnZpY2VfaWQ7Ci0gIGNiX2RhdGEuc3J2Y19vcGVyLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIHNlcnZpY2VfaWQ9IiA8PCArcF9zcnZjX2NiLT5zZXJ2aWNlX2lkOwotCi0gIGlmIChwX3JjYi0+cF9jYmFjaykgKCpwX3JjYi0+cF9jYmFjaykoQlRBX0dBVFRTX1NUT1BfRVZULCAmY2JfZGF0YSk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX3NlbmRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHQVRUUyBzZW5kIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dHNfc2VuZF9yc3AoVU5VU0VEX0FUVFIgdEJUQV9HQVRUU19DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpIHsKLSAgaWYgKEdBVFRTX1NlbmRSc3AocF9tc2ctPmFwaV9yc3AuaGRyLmxheWVyX3NwZWNpZmljLCBwX21zZy0+YXBpX3JzcC50cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmFwaV9yc3Auc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAodEdBVFRTX1JTUCopcF9tc2ctPmFwaV9yc3AucF9yc3ApICE9IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgIlNlbmRpbmcgcmVzcG9uc2UgZmFpbGVkIjsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0c19pbmRpY2F0ZV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdBVFRTIHNlbmQgaGFuZGxlIHZhbHVlIGluZGljYXRpb24gb3Igbm90aWZpY2F0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dHNfaW5kaWNhdGVfaGFuZGxlKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpIHsKLSAgdEJUQV9HQVRUU19TUlZDX0NCKiBwX3NydmNfY2I7Ci0gIHRCVEFfR0FUVFNfUkNCKiBwX3JjYiA9IE5VTEw7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICB0R0FUVF9JRiBnYXR0X2lmOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICB0QlRBX0dBVFRTIGNiX2RhdGE7Ci0KLSAgcF9zcnZjX2NiID0KLSAgICAgIGJ0YV9nYXR0c19maW5kX3NydmNfY2JfYnlfYXR0cl9pZChwX2NiLCBwX21zZy0+YXBpX2luZGljYXRlLmF0dHJfaWQpOwotCi0gIGlmIChwX3NydmNfY2IpIHsKLSAgICBpZiAoR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IocF9tc2ctPmFwaV9pbmRpY2F0ZS5oZHIubGF5ZXJfc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYXR0X2lmLCByZW1vdGVfYmRhLCAmdHJhbnNwb3J0KSkgewotICAgICAgcF9yY2IgPSBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2J5X2FwcF9pZihnYXR0X2lmKTsKLQotICAgICAgaWYgKHBfbXNnLT5hcGlfaW5kaWNhdGUubmVlZF9jb25maXJtKQotCi0gICAgICAgIHN0YXR1cyA9IEdBVFRTX0hhbmRsZVZhbHVlSW5kaWNhdGlvbigKLSAgICAgICAgICAgIHBfbXNnLT5hcGlfaW5kaWNhdGUuaGRyLmxheWVyX3NwZWNpZmljLCBwX21zZy0+YXBpX2luZGljYXRlLmF0dHJfaWQsCi0gICAgICAgICAgICBwX21zZy0+YXBpX2luZGljYXRlLmxlbiwgcF9tc2ctPmFwaV9pbmRpY2F0ZS52YWx1ZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHN0YXR1cyA9IEdBVFRTX0hhbmRsZVZhbHVlTm90aWZpY2F0aW9uKAotICAgICAgICAgICAgcF9tc2ctPmFwaV9pbmRpY2F0ZS5oZHIubGF5ZXJfc3BlY2lmaWMsIHBfbXNnLT5hcGlfaW5kaWNhdGUuYXR0cl9pZCwKLSAgICAgICAgICAgIHBfbXNnLT5hcGlfaW5kaWNhdGUubGVuLCBwX21zZy0+YXBpX2luZGljYXRlLnZhbHVlKTsKLQotICAgICAgLyogaWYgb3ZlciBCUl9FRFIsIGluZm9ybSBQTSBmb3IgbW9kZSBjaGFuZ2UgKi8KLSAgICAgIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgICAgICBidGFfc3lzX2J1c3koQlRBX0lEX0dBVFRTLCBCVEFfQUxMX0FQUF9JRCwgcmVtb3RlX2JkYSk7Ci0gICAgICAgIGJ0YV9zeXNfaWRsZShCVEFfSURfR0FUVFMsIEJUQV9BTExfQVBQX0lELCByZW1vdGVfYmRhKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBjb25uZWN0aW9uX2lkPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHBfbXNnLT5hcGlfaW5kaWNhdGUuaGRyLmxheWVyX3NwZWNpZmljKQotICAgICAgICAgICAgICAgICA8PCAiIGZhaWwgc2VuZGluZyBub3RpZmljYXRpb24iOwotICAgIH0KLQotICAgIGlmICgoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUyB8fCAhcF9tc2ctPmFwaV9pbmRpY2F0ZS5uZWVkX2NvbmZpcm0pICYmCi0gICAgICAgIHBfcmNiICYmIHBfY2ItPnJjYltwX3NydmNfY2ItPnJjYl9pZHhdLnBfY2JhY2spIHsKLSAgICAgIGNiX2RhdGEucmVxX2RhdGEuc3RhdHVzID0gc3RhdHVzOwotICAgICAgY2JfZGF0YS5yZXFfZGF0YS5jb25uX2lkID0gcF9tc2ctPmFwaV9pbmRpY2F0ZS5oZHIubGF5ZXJfc3BlY2lmaWM7Ci0KLSAgICAgICgqcF9yY2ItPnBfY2JhY2spKEJUQV9HQVRUU19DT05GX0VWVCwgJmNiX2RhdGEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8ICJOb3QgYW4gcmVnaXN0ZXJlZCBzZXJ2Y2UgYXR0cmlidXRlIElEOiAiCi0gICAgICAgICAgICAgICA8PCBsb2doZXgocF9tc2ctPmFwaV9pbmRpY2F0ZS5hdHRyX2lkKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dHNfb3BlbihVTlVTRURfQVRUUiB0QlRBX0dBVFRTX0NCKiBwX2NiLCB0QlRBX0dBVFRTX0RBVEEqIHBfbXNnKSB7Ci0gIHRCVEFfR0FUVFNfUkNCKiBwX3JjYiA9IE5VTEw7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBHQVRUX0VSUk9SOwotICB1aW50MTZfdCBjb25uX2lkOwotCi0gIHBfcmNiID0gYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYocF9tc2ctPmFwaV9vcGVuLnNlcnZlcl9pZik7Ci0gIGlmIChwX3JjYiAhPSBOVUxMKSB7Ci0gICAgLyogc2hvdWxkIGFsd2F5cyBnZXQgdGhlIGNvbm5lY3Rpb24gSUQgKi8KLSAgICBpZiAoR0FUVF9Db25uZWN0KHBfcmNiLT5nYXR0X2lmLCBwX21zZy0+YXBpX29wZW4ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5hcGlfb3Blbi5pc19kaXJlY3QsIHBfbXNnLT5hcGlfb3Blbi50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKLSAgICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLQotICAgICAgaWYgKEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQocF9yY2ItPmdhdHRfaWYsIHBfbXNnLT5hcGlfb3Blbi5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5faWQsIHBfbXNnLT5hcGlfb3Blbi50cmFuc3BvcnQpKSB7Ci0gICAgICAgIHN0YXR1cyA9IEdBVFRfQUxSRUFEWV9PUEVOOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbmF2bGlkIHNlcnZlcl9pZj0iIDw8IHBfbXNnLT5hcGlfb3Blbi5zZXJ2ZXJfaWY7Ci0gIH0KLQotICBpZiAocF9yY2IgJiYgcF9yY2ItPnBfY2JhY2spIHsKLSAgICB0QlRBX0dBVFRTIGJ0YV9nYXR0czsKLSAgICBidGFfZ2F0dHMuc3RhdHVzID0gc3RhdHVzOwotICAgICgqcF9yY2ItPnBfY2JhY2spKEJUQV9HQVRUU19PUEVOX0VWVCwgJmJ0YV9nYXR0cyk7Ci0gIH0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfY2FuY2VsX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2F0dHNfY2FuY2VsX29wZW4oVU5VU0VEX0FUVFIgdEJUQV9HQVRUU19DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpIHsKLSAgdEJUQV9HQVRUU19SQ0IqIHBfcmNiOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVF9FUlJPUjsKLQotICBwX3JjYiA9IGJ0YV9nYXR0c19maW5kX2FwcF9yY2JfYnlfYXBwX2lmKHBfbXNnLT5hcGlfY2FuY2VsX29wZW4uc2VydmVyX2lmKTsKLSAgaWYgKHBfcmNiICE9IE5VTEwpIHsKLSAgICBpZiAoIUdBVFRfQ2FuY2VsQ29ubmVjdChwX3JjYi0+Z2F0dF9pZiwgcF9tc2ctPmFwaV9jYW5jZWxfb3Blbi5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5hcGlfY2FuY2VsX29wZW4uaXNfZGlyZWN0KSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yIG9wZW4gcmVxdWVzdCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiSW5hdmxpZCBzZXJ2ZXJfaWY9IiA8PCArcF9tc2ctPmFwaV9jYW5jZWxfb3Blbi5zZXJ2ZXJfaWY7Ci0gIH0KLQotICBpZiAocF9yY2IgJiYgcF9yY2ItPnBfY2JhY2spIHsKLSAgICB0QlRBX0dBVFRTIGJ0YV9nYXR0czsKLSAgICBidGFfZ2F0dHMuc3RhdHVzID0gc3RhdHVzOwotICAgICgqcF9yY2ItPnBfY2JhY2spKEJUQV9HQVRUU19DQU5DRUxfT1BFTl9FVlQsICZidGFfZ2F0dHMpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2dhdHRzX2Nsb3NlKFVOVVNFRF9BVFRSIHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpIHsKLSAgdEJUQV9HQVRUU19SQ0IqIHBfcmNiOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVF9FUlJPUjsKLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRhOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsKLQotICBpZiAoR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IocF9tc2ctPmhkci5sYXllcl9zcGVjaWZpYywgJmdhdHRfaWYsIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0KSkgewotICAgIGlmIChHQVRUX0Rpc2Nvbm5lY3QocF9tc2ctPmhkci5sYXllcl9zcGVjaWZpYykgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IGZhaWwgY29ubl9pZD0iIDw8IGxvZ2hleChwX21zZy0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotICAgIH0KLQotICAgIHBfcmNiID0gYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYoZ2F0dF9pZik7Ci0KLSAgICBpZiAocF9yY2IgJiYgcF9yY2ItPnBfY2JhY2spIHsKLSAgICAgIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikKLSAgICAgICAgYnRhX3N5c19jb25uX2Nsb3NlKEJUQV9JRF9HQVRUUywgQlRBX0FMTF9BUFBfSUQsIHJlbW90ZV9iZGEpOwotCi0gICAgICB0QlRBX0dBVFRTIGJ0YV9nYXR0czsKLSAgICAgIGJ0YV9nYXR0cy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAoKnBfcmNiLT5wX2NiYWNrKShCVEFfR0FUVFNfQ0xPU0VfRVZULCAmYnRhX2dhdHRzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBjb25uZWN0aW9uX2lkPSIgPDwgbG9naGV4KHBfbXNnLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfcmVxdWVzdF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR0FUVFMgYXR0cmlidXRlIHJlcXVlc3QgY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfc2VuZF9yZXF1ZXN0X2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVFNfUkVRX1RZUEUgcmVxX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUUyBjYl9kYXRhOwotICB0QlRBX0dBVFRTX1JDQiogcF9yY2I7Ci0gIHRHQVRUX0lGIGdhdHRfaWY7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotCi0gIG1lbXNldCgmY2JfZGF0YSwgMCwgc2l6ZW9mKHRCVEFfR0FUVFMpKTsKLQotICBpZiAoR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IoY29ubl9pZCwgJmdhdHRfaWYsIGNiX2RhdGEucmVxX2RhdGEucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnQpKSB7Ci0gICAgcF9yY2IgPSBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2J5X2FwcF9pZihnYXR0X2lmKTsKLQotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgPDwgIiwgdHJhbnNfaWQ9IiA8PCArdHJhbnNfaWQgPDwgIiwgcmVxX3R5cGU9IiA8PCArcmVxX3R5cGU7Ci0KLSAgICBpZiAocF9yY2IgJiYgcF9yY2ItPnBfY2JhY2spIHsKLSAgICAgIC8qIGlmIG92ZXIgQlJfRURSLCBpbmZvcm0gUE0gZm9yIG1vZGUgY2hhbmdlICovCi0gICAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICAgICAgYnRhX3N5c19idXN5KEJUQV9JRF9HQVRUUywgQlRBX0FMTF9BUFBfSUQsIGNiX2RhdGEucmVxX2RhdGEucmVtb3RlX2JkYSk7Ci0gICAgICAgIGJ0YV9zeXNfaWRsZShCVEFfSURfR0FUVFMsIEJUQV9BTExfQVBQX0lELCBjYl9kYXRhLnJlcV9kYXRhLnJlbW90ZV9iZGEpOwotICAgICAgfQotCi0gICAgICBjYl9kYXRhLnJlcV9kYXRhLmNvbm5faWQgPSBjb25uX2lkOwotICAgICAgY2JfZGF0YS5yZXFfZGF0YS50cmFuc19pZCA9IHRyYW5zX2lkOwotICAgICAgY2JfZGF0YS5yZXFfZGF0YS5wX2RhdGEgPSAodEdBVFRTX0RBVEEqKXBfZGF0YTsKLQotICAgICAgKCpwX3JjYi0+cF9jYmFjaykocmVxX3R5cGUsICZjYl9kYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAiY29ubmVjdGlvbiByZXF1ZXN0IG9uIGdhdHRfaWY9IiA8PCArZ2F0dF9pZgotICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBpbnRlcmVzdGVkIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAicmVxdWVzdCByZWNlaXZlZCBvbiB1bmtub3duIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9nYXR0c19jb25uX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBjb25uZWN0aW9uIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2dhdHRzX2Nvbm5fY2JhY2sodEdBVFRfSUYgZ2F0dF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwgYm9vbCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDT05OX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHRCVEFfR0FUVFMgY2JfZGF0YTsKLSAgdWludDhfdCBldnQgPSBjb25uZWN0ZWQgPyBCVEFfR0FUVFNfQ09OTkVDVF9FVlQgOiBCVEFfR0FUVFNfRElTQ09OTkVDVF9FVlQ7Ci0gIHRCVEFfR0FUVFNfUkNCKiBwX3JlZzsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgIGJkYT0iIDw8IGJkYWRkciA8PCAiIGdhdHRfaWY9ICIgPDwgZ2F0dF9pZgotICAgICAgICAgIDw8ICIsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCkgPDwgIiBjb25uZWN0ZWQ9IiA8PCBjb25uZWN0ZWQ7Ci0KLSAgaWYgKGNvbm5lY3RlZCkKLSAgICBidGlmX2RlYnVnX2Nvbm5fc3RhdGUoYmRhZGRyLCBCVElGX0RFQlVHX0NPTk5FQ1RFRCwgR0FUVF9DT05OX09LKTsKLSAgZWxzZQotICAgIGJ0aWZfZGVidWdfY29ubl9zdGF0ZShiZGFkZHIsIEJUSUZfREVCVUdfRElTQ09OTkVDVEVELCBHQVRUX0NPTk5fT0spOwotCi0gIHBfcmVnID0gYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYoZ2F0dF9pZik7Ci0KLSAgaWYgKHBfcmVnICYmIHBfcmVnLT5wX2NiYWNrKSB7Ci0gICAgLyogdGhlcmUgaXMgbm8gUk0gZm9yIEdBVFQgKi8KLSAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICAgIGlmIChjb25uZWN0ZWQpCi0gICAgICAgIGJ0YV9zeXNfY29ubl9vcGVuKEJUQV9JRF9HQVRUUywgQlRBX0FMTF9BUFBfSUQsIGJkYWRkcik7Ci0gICAgICBlbHNlCi0gICAgICAgIGJ0YV9zeXNfY29ubl9jbG9zZShCVEFfSURfR0FUVFMsIEJUQV9BTExfQVBQX0lELCBiZGFkZHIpOwotICAgIH0KLQotICAgIGNiX2RhdGEuY29ubi5jb25uX2lkID0gY29ubl9pZDsKLSAgICBjYl9kYXRhLmNvbm4uc2VydmVyX2lmID0gZ2F0dF9pZjsKLSAgICBjYl9kYXRhLmNvbm4udHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgIGNiX2RhdGEuY29ubi5yZW1vdGVfYmRhID0gYmRhZGRyOwotICAgICgqcF9yZWctPnBfY2JhY2spKGV2dCwgJmNiX2RhdGEpOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBzZXJ2ZXJfaWY9IiA8PCArZ2F0dF9pZiA8PCAiIG5vdCBmb3VuZCI7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2dhdHRzX3BoeV91cGRhdGVfY2JhY2sodEdBVFRfSUYgZ2F0dF9pZiwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgdEJUQV9HQVRUU19SQ0IqIHBfcmVnID0gYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYoZ2F0dF9pZik7Ci0gIGlmICghcF9yZWcgfHwgIXBfcmVnLT5wX2NiYWNrKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2ZXJfaWY9IiA8PCArZ2F0dF9pZiA8PCAiIG5vdCBmb3VuZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9HQVRUUyBjYl9kYXRhOwotICBjYl9kYXRhLnBoeV91cGRhdGUuY29ubl9pZCA9IGNvbm5faWQ7Ci0gIGNiX2RhdGEucGh5X3VwZGF0ZS5zZXJ2ZXJfaWYgPSBnYXR0X2lmOwotICBjYl9kYXRhLnBoeV91cGRhdGUudHhfcGh5ID0gdHhfcGh5OwotICBjYl9kYXRhLnBoeV91cGRhdGUucnhfcGh5ID0gcnhfcGh5OwotICBjYl9kYXRhLnBoeV91cGRhdGUuc3RhdHVzID0gc3RhdHVzOwotICAoKnBfcmVnLT5wX2NiYWNrKShCVEFfR0FUVFNfUEhZX1VQREFURV9FVlQsICZjYl9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2dhdHRzX2Nvbm5fdXBkYXRlX2NiYWNrKHRHQVRUX0lGIGdhdHRfaWYsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICB0QlRBX0dBVFRTX1JDQiogcF9yZWcgPSBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2J5X2FwcF9pZihnYXR0X2lmKTsKLSAgaWYgKCFwX3JlZyB8fCAhcF9yZWctPnBfY2JhY2spIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlcnZlcl9pZj0iIDw8ICtnYXR0X2lmIDw8ICIgbm90IGZvdW5kIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0dBVFRTIGNiX2RhdGE7Ci0gIGNiX2RhdGEuY29ubl91cGRhdGUuY29ubl9pZCA9IGNvbm5faWQ7Ci0gIGNiX2RhdGEuY29ubl91cGRhdGUuc2VydmVyX2lmID0gZ2F0dF9pZjsKLSAgY2JfZGF0YS5jb25uX3VwZGF0ZS5pbnRlcnZhbCA9IGludGVydmFsOwotICBjYl9kYXRhLmNvbm5fdXBkYXRlLmxhdGVuY3kgPSBsYXRlbmN5OwotICBjYl9kYXRhLmNvbm5fdXBkYXRlLnRpbWVvdXQgPSB0aW1lb3V0OwotICBjYl9kYXRhLmNvbm5fdXBkYXRlLnN0YXR1cyA9IHN0YXR1czsKLSAgKCpwX3JlZy0+cF9jYmFjaykoQlRBX0dBVFRTX0NPTk5fVVBEQVRFX0VWVCwgJmNiX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2NvbmdfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNvbmdlc3Rpb24gY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfZ2F0dHNfY29uZ19jYmFjayh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCkgewotICB0QlRBX0dBVFRTX1JDQiogcF9yY2I7Ci0gIHRHQVRUX0lGIGdhdHRfaWY7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICB0QlRBX0dBVFRTIGNiX2RhdGE7Ci0KLSAgaWYgKEdBVFRfR2V0Q29ubmVjdGlvbkluZm9yKGNvbm5faWQsICZnYXR0X2lmLCBjYl9kYXRhLnJlcV9kYXRhLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0KSkgewotICAgIHBfcmNiID0gYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYoZ2F0dF9pZik7Ci0KLSAgICBpZiAocF9yY2IgJiYgcF9yY2ItPnBfY2JhY2spIHsKLSAgICAgIGNiX2RhdGEuY29uZ2VzdC5jb25uX2lkID0gY29ubl9pZDsKLSAgICAgIGNiX2RhdGEuY29uZ2VzdC5jb25nZXN0ZWQgPSBjb25nZXN0ZWQ7Ci0KLSAgICAgICgqcF9yY2ItPnBfY2JhY2spKEJUQV9HQVRUU19DT05HRVNUX0VWVCwgJmNiX2RhdGEpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRzX2FwaS5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0c19hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWY4MzUuLjAwMDAwMDAKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRzX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDEwLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZm9yIEdBVFQgc2VydmVyIG9mIEJUQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRzX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY29uc3QgdEJUQV9TWVNfUkVHIGJ0YV9nYXR0c19yZWcgPSB7YnRhX2dhdHRzX2hkbF9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVFNfRGlzYWJsZX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGlzYWJsZSBHQVRUUyBtb2R1bGUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0Rpc2FibGUodm9pZCkgewotICBpZiAoIWJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0dBVFRTKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiR0FUVFMgTW9kdWxlIG5vdCBlbmFibGVkL2FscmVhZHkgZGlzYWJsZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX0dBVFRTX0FQSV9ESVNBQkxFX0VWVDsKLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLSAgYnRhX3N5c19kZXJlZ2lzdGVyKEJUQV9JRF9HQVRUUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfQXBwUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGFwcGxpY2F0aW9uIGNhbGxiYWNrcwotICogICAgICAgICAgICAgICAgICAgIHdpdGggQlRBIEdBVFRTIG1vZHVsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfYXBwX3V1aWQgLSBhcHBsaWNhaXRvbiBVVUlECi0gKiAgICAgICAgICAgICAgICAgIHBfY2JhY2sgLSBwb2ludGVyIHRvIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfQXBwUmVnaXN0ZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVFNfQ0JBQ0sqIHBfY2JhY2ssIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIHRCVEFfR0FUVFNfQVBJX1JFRyogcF9idWYgPQotICAgICAgKHRCVEFfR0FUVFNfQVBJX1JFRyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9HQVRUU19BUElfUkVHKSk7Ci0KLSAgLyogcmVnaXN0ZXIgd2l0aCBCVEEgc3lzdGVtIG1hbmFnZXIgKi8KLSAgaWYgKCFidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9HQVRUUykpCi0gICAgYnRhX3N5c19yZWdpc3RlcihCVEFfSURfR0FUVFMsICZidGFfZ2F0dHNfcmVnKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0dBVFRTX0FQSV9SRUdfRVZUOwotICBwX2J1Zi0+YXBwX3V1aWQgPSBhcHBfdXVpZDsKLSAgcF9idWYtPnBfY2JhY2sgPSBwX2NiYWNrOwotICBwX2J1Zi0+ZWF0dF9zdXBwb3J0ID0gZWF0dF9zdXBwb3J0OwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfQXBwRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGUtcmVnaXN0ZXIgd2l0aCBHQVRUIFNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGFwcF9pZDogYXBwbGljYXRpbm8gSUQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0FwcERlcmVnaXN0ZXIodEdBVFRfSUYgc2VydmVyX2lmKSB7Ci0gIHRCVEFfR0FUVFNfQVBJX0RFUkVHKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9HQVRUU19BUElfREVSRUcqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVFNfQVBJX0RFUkVHKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUU19BUElfREVSRUdfRVZUOwotICBwX2J1Zi0+c2VydmVyX2lmID0gc2VydmVyX2lmOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLXZvaWQgYnRhX2dhdHRzX2FkZF9zZXJ2aWNlX2ltcGwodEdBVFRfSUYgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVFNfQWRkU2VydmljZUNiIGNiKSB7Ci0gIHVpbnQ4X3QgcmNiX2lkeCA9Ci0gICAgICBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2lkeF9ieV9hcHBfaWYoJmJ0YV9nYXR0c19jYiwgc2VydmVyX2lmKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcmNiX2lkeD0iIDw8ICtyY2JfaWR4OwotCi0gIGlmIChyY2JfaWR4ID09IEJUQV9HQVRUU19JTlZBTElEX0FQUCkgewotICAgIGNiLlJ1bihHQVRUX0VSUk9SLCBzZXJ2ZXJfaWYsIHN0ZDo6bW92ZShzZXJ2aWNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzcnZjX2lkeCA9IGJ0YV9nYXR0c19hbGxvY19zcnZjX2NiKCZidGFfZ2F0dHNfY2IsIHJjYl9pZHgpOwotICBpZiAoc3J2Y19pZHggPT0gQlRBX0dBVFRTX0lOVkFMSURfQVBQKSB7Ci0gICAgY2IuUnVuKEdBVFRfRVJST1IsIHNlcnZlcl9pZiwgc3RkOjptb3ZlKHNlcnZpY2UpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0KLSAgICAgIEdBVFRTX0FkZFNlcnZpY2Uoc2VydmVyX2lmLCBzZXJ2aWNlLmRhdGEoKSwgc2VydmljZS5zaXplKCkpOwotICBpZiAoc3RhdHVzICE9IEdBVFRfU0VSVklDRV9TVEFSVEVEKSB7Ci0gICAgbWVtc2V0KCZidGFfZ2F0dHNfY2Iuc3J2Y19jYltzcnZjX2lkeF0sIDAsIHNpemVvZih0QlRBX0dBVFRTX1NSVkNfQ0IpKTsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlcnZpY2UgY3JlYXRpb24gZmFpbGVkLiI7Ci0gICAgY2IuUnVuKEdBVFRfRVJST1IsIHNlcnZlcl9pZiwgc3RkOjptb3ZlKHNlcnZpY2UpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfZ2F0dHNfY2Iuc3J2Y19jYltzcnZjX2lkeF0uc2VydmljZV91dWlkID0gc2VydmljZVswXS51dWlkOwotCi0gIC8vIHNlcnZpY2VfaWQgaXMgZXF1YWwgdG8gc2VydmljZSBzdGFydCBoYW5kbGUKLSAgYnRhX2dhdHRzX2NiLnNydmNfY2Jbc3J2Y19pZHhdLnNlcnZpY2VfaWQgPSBzZXJ2aWNlWzBdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gIGJ0YV9nYXR0c19jYi5zcnZjX2NiW3NydmNfaWR4XS5pZHggPSBzcnZjX2lkeDsKLQotICBjYi5SdW4oR0FUVF9TVUNDRVNTLCBzZXJ2ZXJfaWYsIHN0ZDo6bW92ZShzZXJ2aWNlKSk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19BZGRTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQgdGhlIGdpdmVuIHxzZXJ2aWNlfCBhbmQgYWxsIGluY2x1ZGVkIGVsZW1lbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBHQVRUIGRhdGFiYXNlLiBhIHxCVEFfR0FUVFNfQUREX1NSVkNfRVZUfCBpcyB0cmlnZ2VyZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgcmVwb3J0IHRoZSBzdGF0dXMgYW5kIGF0dHJpYnV0ZSBoYW5kbGVzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc2VydmVyX2lmOiBzZXJ2ZXIgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlOiBwb2ludGVyIHZlY3RvciBkZXNjcmliaW5nIHNlcnZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIHxHQVRUX1NVQ0NFU1N8IG9uIHN1Y2Nlc3Mgb3IgfEdBVFRfRVJST1J8IGlmIHRoZQotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIGNhbm5vdCBiZSBhZGRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0FkZFNlcnZpY2UodEdBVFRfSUYgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUU19BZGRTZXJ2aWNlQ2IgY2IpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZidGFfZ2F0dHNfYWRkX3NlcnZpY2VfaW1wbCwgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzZXJ2aWNlKSwgc3RkOjptb3ZlKGNiKSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX0RlbGV0ZVNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhIHNlcnZpY2UuIFdoZW4gdGhpcyBpcwotICogICAgICAgICAgICAgICAgICBkb25lLCBhIGNhbGxiYWNrIGV2ZW50IEJUQV9HQVRUU19ERUxFVEVfRVZUIGlzIHJlcG9ydCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBzdGF0dXMuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzZXJ2aWNlX2lkOiBzZXJ2aWNlX2lkIHRvIGJlIGRlbGV0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICByZXR1cm5zIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0RlbGV0ZVNlcnZpY2UodWludDE2X3Qgc2VydmljZV9pZCkgewotICBCVF9IRFJfUklHSUQqIHBfYnVmID0gKEJUX0hEUl9SSUdJRCopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSk7Ci0KLSAgcF9idWYtPmV2ZW50ID0gQlRBX0dBVFRTX0FQSV9ERUxfU1JWQ19FVlQ7Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IHNlcnZpY2VfaWQ7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19TdG9wU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RvcCBhIHNlcnZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzZXJ2aWNlX2lkIC0gc2VydmljZSB0byBiZSB0b3BwZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX1N0b3BTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaWQpIHsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotCi0gIHBfYnVmLT5ldmVudCA9IEJUQV9HQVRUU19BUElfU1RPUF9TUlZDX0VWVDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gc2VydmljZV9pZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX0hhbmRsZVZhbHVlSW5kaWNhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIGNoYXJhY3RlcmlzdGljcwotICogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRhIC0gcmVtb3RlIGRldmljZSBiZCBhZGRyZXNzIHRvIGluZGljYXRlLgotICogICAgICAgICAgICAgICAgICBhdHRyX2lkIC0gYXR0cmlidXRlIElEIHRvIGluZGljYXRlLgotICogICAgICAgICAgICAgICAgICB2YWx1ZSAtIGRhdGEgdG8gaW5kaWNhdGUuCi0gKiAgICAgICAgICAgICAgICAgIG5lZWRfY29uZmlybSAtIGlmIHRoaXMgaW5kaWNhdGlvbiBleHBlY3RzIGEgY29uZmlybWF0aW9uIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfSGFuZGxlVmFsdWVJbmRpY2F0aW9uKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkX2NvbmZpcm0pIHsKLSAgdEJUQV9HQVRUU19BUElfSU5ESUNBVElPTiogcF9idWYgPQotICAgICAgKHRCVEFfR0FUVFNfQVBJX0lORElDQVRJT04qKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfR0FUVFNfQVBJX0lORElDQVRJT04pKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0dBVFRTX0FQSV9JTkRJQ0FUSU9OX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGNvbm5faWQ7Ci0gIHBfYnVmLT5hdHRyX2lkID0gYXR0cl9pZDsKLSAgcF9idWYtPm5lZWRfY29uZmlybSA9IG5lZWRfY29uZmlybTsKLSAgaWYgKHZhbHVlLnNpemUoKSA+IDApIHsKLSAgICBwX2J1Zi0+bGVuID0gdmFsdWUuc2l6ZSgpOwotICAgIG1lbWNweShwX2J1Zi0+dmFsdWUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKLSAgfQotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfU2VuZFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIGlkZW50aWZpZXIuCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zX2lkIC0gdHJhbnNhY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1cyAtIHJlc3BvbnNlIHN0YXR1cwotICogICAgICAgICAgICAgICAgICBwX21zZyAtIHJlc3BvbnNlIGRhdGEuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX1NlbmRSc3AodWludDE2X3QgY29ubl9pZCwgdWludDMyX3QgdHJhbnNfaWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SU1AqIHBfbXNnKSB7Ci0gIGNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2YodEJUQV9HQVRUU19BUElfUlNQKSArIHNpemVvZih0R0FUVFNfUlNQKTsKLSAgdEJUQV9HQVRUU19BUElfUlNQKiBwX2J1ZiA9ICh0QlRBX0dBVFRTX0FQSV9SU1AqKW9zaV9jYWxsb2MobGVuKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0dBVFRTX0FQSV9SU1BfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY29ubl9pZDsKLSAgcF9idWYtPnRyYW5zX2lkID0gdHJhbnNfaWQ7Ci0gIHBfYnVmLT5zdGF0dXMgPSBzdGF0dXM7Ci0gIGlmIChwX21zZyAhPSBOVUxMKSB7Ci0gICAgcF9idWYtPnBfcnNwID0gKHRHQVRUU19SU1AqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+cF9yc3AsIHBfbXNnLCBzaXplb2YodEdBVFRTX1JTUCkpOwotICB9Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVuIGEgZGlyZWN0IG9wZW4gY29ubmVjdGlvbiBvciBhZGQgYSBiYWNrZ3JvdW5kIGF1dG8KLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBiZCBhZGRyZXNzCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzZXJ2ZXJfaWY6IHNlcnZlciBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGE6IHJlbW90ZSBkZXZpY2UgQkQgYWRkcmVzcy4KLSAqICAgICAgICAgICAgICAgICAgaXNfZGlyZWN0OiBkaXJlY3QgY29ubmVjdGlvbiBvciBiYWNrZ3JvdW5kIGF1dG8gY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgOiBUcmFuc3BvcnQgb24gd2hpY2ggR0FUVCBjb25uZWN0aW9uIHRvIGJlIG9wZW5lZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlIvRURSIG9yIExFKQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUU19PcGVuKHRHQVRUX0lGIHNlcnZlcl9pZiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHRCVEFfR0FUVFNfQVBJX09QRU4qIHBfYnVmID0KLSAgICAgICh0QlRBX0dBVFRTX0FQSV9PUEVOKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0dBVFRTX0FQSV9PUEVOKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9HQVRUU19BUElfT1BFTl9FVlQ7Ci0gIHBfYnVmLT5zZXJ2ZXJfaWYgPSBzZXJ2ZXJfaWY7Ci0gIHBfYnVmLT5pc19kaXJlY3QgPSBpc19kaXJlY3Q7Ci0gIHBfYnVmLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0gIHBfYnVmLT5yZW1vdGVfYmRhID0gcmVtb3RlX2JkYTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX0NhbmNlbE9wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbmNlbCBhIGRpcmVjdCBvcGVuIGNvbm5lY3Rpb24gb3IgcmVtb3ZlIGEgYmFja2dyb3VuZCBhdXRvCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYmQgYWRkcmVzcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc2VydmVyX2lmOiBzZXJ2ZXIgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIEJEIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDogZGlyZWN0IGNvbm5lY3Rpb24gb3IgYmFja2dyb3VuZCBhdXRvIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfR0FUVFNfQ2FuY2VsT3Blbih0R0FUVF9JRiBzZXJ2ZXJfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0KSB7Ci0gIHRCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOKiBwX2J1ZiA9ICh0QlRBX0dBVFRTX0FQSV9DQU5DRUxfT1BFTiopb3NpX21hbGxvYygKLSAgICAgIHNpemVvZih0QlRBX0dBVFRTX0FQSV9DQU5DRUxfT1BFTikpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOX0VWVDsKLSAgcF9idWYtPnNlcnZlcl9pZiA9IHNlcnZlcl9pZjsKLSAgcF9idWYtPmlzX2RpcmVjdCA9IGlzX2RpcmVjdDsKLSAgcF9idWYtPnJlbW90ZV9iZGEgPSByZW1vdGVfYmRhOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIGEgY29ubmVjdGlvbiAgYSByZW1vdGUgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlubyBJRCB0byBiZSBjbG9zZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRTX0Nsb3NlKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotCi0gIHBfYnVmLT5ldmVudCA9IEJUQV9HQVRUU19BUElfQ0xPU0VfRVZUOwotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBjb25uX2lkOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19CmRpZmYgLS1naXQgYS9idGEvZ2F0dC9idGFfZ2F0dHNfaW50LmggYi9idGEvZ2F0dC9idGFfZ2F0dHNfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjVhMmQuLjAwMDAwMDAKLS0tIGEvYnRhL2dhdHQvYnRhX2dhdHRzX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHJpdmF0ZSBmaWxlIGZvciB0aGUgQlRBIEdBVFQgc2VydmVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9HQVRUU19JTlRfSAotI2RlZmluZSBCVEFfR0FUVFNfSU5UX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9ibGVfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXR0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWVudW0gewotICBCVEFfR0FUVFNfQVBJX1JFR19FVlQgPSBCVEFfU1lTX0VWVF9TVEFSVChCVEFfSURfR0FUVFMpLAotICBCVEFfR0FUVFNfSU5UX1NUQVJUX0lGX0VWVCwKLSAgQlRBX0dBVFRTX0FQSV9ERVJFR19FVlQsCi0gIEJUQV9HQVRUU19BUElfSU5ESUNBVElPTl9FVlQsCi0KLSAgQlRBX0dBVFRTX0FQSV9ERUxfU1JWQ19FVlQsCi0gIEJUQV9HQVRUU19BUElfU1RPUF9TUlZDX0VWVCwKLSAgQlRBX0dBVFRTX0FQSV9SU1BfRVZULAotICBCVEFfR0FUVFNfQVBJX09QRU5fRVZULAotICBCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOX0VWVCwKLSAgQlRBX0dBVFRTX0FQSV9DTE9TRV9FVlQsCi0gIEJUQV9HQVRUU19BUElfRElTQUJMRV9FVlQKLX07Ci10eXBlZGVmIHVpbnQxNl90IHRCVEFfR0FUVFNfSU5UX0VWVDsKLQotLyogbWF4IG51bWJlciBvZiBhcHBsaWNhdGlvbiBhbGxvd2VkIG9uIGRldmljZSAqLwotI2RlZmluZSBCVEFfR0FUVFNfTUFYX0FQUF9OVU0gR0FUVF9NQVhfU1JfUFJPRklMRVMKLQotLyogbWF4IG51bWJlciBvZiBzZXJ2aWNlcyBhbGxvd2VkIGluIHRoZSBkZXZpY2UgKi8KLSNkZWZpbmUgQlRBX0dBVFRTX01BWF9TUlZDX05VTSBHQVRUX01BWF9TUl9QUk9GSUxFUwotCi0vKiBpbnRlcm5hbCBzdHJ1Y3V0cmUgZm9yIEdBVFRDIHJlZ2lzdGVyIEFQSSAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgYmx1ZXRvb3RoOjpVdWlkIGFwcF91dWlkOwotICB0QlRBX0dBVFRTX0NCQUNLKiBwX2NiYWNrOwotICBib29sIGVhdHRfc3VwcG9ydDsKLX0gdEJUQV9HQVRUU19BUElfUkVHOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRHQVRUX0lGIHNlcnZlcl9pZjsKLX0gdEJUQV9HQVRUU19JTlRfU1RBUlRfSUY7Ci0KLXR5cGVkZWYgdEJUQV9HQVRUU19JTlRfU1RBUlRfSUYgdEJUQV9HQVRUU19BUElfREVSRUc7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEdBVFRfSUYgc2VydmVyX2lmOwotICBidGdhdHRfZGJfZWxlbWVudF90KiBzZXJ2aWNlOwotICB1aW50MTZfdCBjb3VudDsKLX0gdEJUQV9HQVRUU19BUElfQUREX1NFUlZJQ0U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdWludDE2X3QgYXR0cl9pZDsKLSAgdWludDE2X3QgbGVuOwotICBib29sIG5lZWRfY29uZmlybTsKLSAgdWludDhfdCB2YWx1ZVtHQVRUX01BWF9BVFRSX0xFTl07Ci19IHRCVEFfR0FUVFNfQVBJX0lORElDQVRJT047Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci0gIHRHQVRUU19SU1AqIHBfcnNwOwotfSB0QlRBX0dBVFRTX0FQSV9SU1A7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci19IHRCVEFfR0FUVFNfQVBJX1NUQVJUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdEdBVFRfSUYgc2VydmVyX2lmOwotICBib29sIGlzX2RpcmVjdDsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci0KLX0gdEJUQV9HQVRUU19BUElfT1BFTjsKLQotdHlwZWRlZiB0QlRBX0dBVFRTX0FQSV9PUEVOIHRCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUQV9HQVRUU19BUElfUkVHIGFwaV9yZWc7Ci0gIHRCVEFfR0FUVFNfQVBJX0RFUkVHIGFwaV9kZXJlZzsKLSAgdEJUQV9HQVRUU19BUElfQUREX1NFUlZJQ0UgYXBpX2FkZF9zZXJ2aWNlOwotICB0QlRBX0dBVFRTX0FQSV9JTkRJQ0FUSU9OIGFwaV9pbmRpY2F0ZTsKLSAgdEJUQV9HQVRUU19BUElfUlNQIGFwaV9yc3A7Ci0gIHRCVEFfR0FUVFNfQVBJX09QRU4gYXBpX29wZW47Ci0gIHRCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOIGFwaV9jYW5jZWxfb3BlbjsKLQotICB0QlRBX0dBVFRTX0lOVF9TVEFSVF9JRiBpbnRfc3RhcnRfaWY7Ci19IHRCVEFfR0FUVFNfREFUQTsKLQotLyogYXBwbGljYXRpb24gcmVnaXN0cmF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpbl91c2U7Ci0gIGJsdWV0b290aDo6VXVpZCBhcHBfdXVpZDsKLSAgdEJUQV9HQVRUU19DQkFDSyogcF9jYmFjazsKLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLX0gdEJUQV9HQVRUU19SQ0I7Ci0KLS8qIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYmx1ZXRvb3RoOjpVdWlkIHNlcnZpY2VfdXVpZDsgLyogc2VydmljZSBVVUlEICovCi0gIHVpbnQxNl90IHNlcnZpY2VfaWQ7ICAgLyogc2VydmljZSBzdGFydCBoYW5kbGUgKi8KLSAgdWludDhfdCByY2JfaWR4OwotICB1aW50OF90IGlkeDsgLyogc2VsZiBpbmRleCBvZiBzZXJ2aWVjIENCICovCi0gIGJvb2wgaW5fdXNlOwotfSB0QlRBX0dBVFRTX1NSVkNfQ0I7Ci0KLS8qIEdBVFQgc2VydmVyIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBlbmFibGVkOwotICB0QlRBX0dBVFRTX1JDQiByY2JbQlRBX0dBVFRTX01BWF9BUFBfTlVNXTsKLSAgdEJUQV9HQVRUU19TUlZDX0NCIHNydmNfY2JbQlRBX0dBVFRTX01BWF9TUlZDX05VTV07Ci19IHRCVEFfR0FUVFNfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEdsb2JhbCBkYXRhCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogR0FUVEMgY29udHJvbCBibG9jayAqLwotZXh0ZXJuIHRCVEFfR0FUVFNfQ0IgYnRhX2dhdHRzX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiBwcm90b3R5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIGJ0YV9nYXR0c19oZGxfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZyk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19hcGlfZGlzYWJsZSh0QlRBX0dBVFRTX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19hcGlfZW5hYmxlKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19yZWdpc3Rlcih0QlRBX0dBVFRTX0NCKiBwX2NiLCB0QlRBX0dBVFRTX0RBVEEqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19zdGFydF9pZih0QlRBX0dBVFRTX0NCKiBwX2NiLCB0QlRBX0dBVFRTX0RBVEEqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19kZXJlZ2lzdGVyKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRzX2RlbGV0ZV9zZXJ2aWNlKHRCVEFfR0FUVFNfU1JWQ19DQiogcF9zcnZjX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRzX3N0b3Bfc2VydmljZSh0QlRBX0dBVFRTX1NSVkNfQ0IqIHBfc3J2Y19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUU19EQVRBKiBwX21zZyk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19zZW5kX3JzcCh0QlRBX0dBVFRTX0NCKiBwX2NiLCB0QlRBX0dBVFRTX0RBVEEqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19pbmRpY2F0ZV9oYW5kbGUodEJUQV9HQVRUU19DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUU19EQVRBKiBwX21zZyk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9nYXR0c19vcGVuKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRzX2NhbmNlbF9vcGVuKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpOwotZXh0ZXJuIHZvaWQgYnRhX2dhdHRzX2Nsb3NlKHRCVEFfR0FUVFNfQ0IqIHBfY2IsIHRCVEFfR0FUVFNfREFUQSogcF9tc2cpOwotCi1leHRlcm4gdEJUQV9HQVRUU19SQ0IqIGJ0YV9nYXR0c19maW5kX2FwcF9yY2JfYnlfYXBwX2lmKHRHQVRUX0lGIHNlcnZlcl9pZik7Ci1leHRlcm4gdWludDhfdCBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2lkeF9ieV9hcHBfaWYodEJUQV9HQVRUU19DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBzZXJ2ZXJfaWYpOwotZXh0ZXJuIHVpbnQ4X3QgYnRhX2dhdHRzX2FsbG9jX3NydmNfY2IodEJUQV9HQVRUU19DQiogcF9jYiwgdWludDhfdCByY2JfaWR4KTsKLWV4dGVybiB0QlRBX0dBVFRTX1NSVkNfQ0IqIGJ0YV9nYXR0c19maW5kX3NydmNfY2JfYnlfc3J2Y19pZCgKLSAgICB0QlRBX0dBVFRTX0NCKiBwX2NiLCB1aW50MTZfdCBzZXJ2aWNlX2lkKTsKLWV4dGVybiB0QlRBX0dBVFRTX1NSVkNfQ0IqIGJ0YV9nYXR0c19maW5kX3NydmNfY2JfYnlfYXR0cl9pZCgKLSAgICB0QlRBX0dBVFRTX0NCKiBwX2NiLCB1aW50MTZfdCBhdHRyX2lkKTsKLQotI2VuZGlmIC8qIEJUQV9HQVRUU19JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvYnRhX2dhdHRzX21haW4uY2MgYi9idGEvZ2F0dC9idGFfZ2F0dHNfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlOWEzZC4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dHNfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgR0FUVCBzZXJ2ZXIgbWFpbiBmdW5jdGlvbnMgYW5kIHN0YXRlIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgImJ0YS9nYXR0L2J0YV9nYXR0c19pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qIEdBVFRTIGNvbnRyb2wgYmxvY2sgKi8KLXRCVEFfR0FUVFNfQ0IgYnRhX2dhdHRzX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2hkbF9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRBIEdBVFQgc2VydmVyIG1haW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9nYXR0c19oZGxfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZykgewotICB0QlRBX0dBVFRTX0NCKiBwX2NiID0gJmJ0YV9nYXR0c19jYjsKLQotICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRTX0FQSV9ESVNBQkxFX0VWVDoKLSAgICAgIGJ0YV9nYXR0c19hcGlfZGlzYWJsZShwX2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVFNfQVBJX1JFR19FVlQ6Ci0gICAgICBidGFfZ2F0dHNfcmVnaXN0ZXIocF9jYiwgKHRCVEFfR0FUVFNfREFUQSopcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19JTlRfU1RBUlRfSUZfRVZUOgotICAgICAgYnRhX2dhdHRzX3N0YXJ0X2lmKHBfY2IsICh0QlRBX0dBVFRTX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVFNfQVBJX0RFUkVHX0VWVDoKLSAgICAgIGJ0YV9nYXR0c19kZXJlZ2lzdGVyKHBfY2IsICh0QlRBX0dBVFRTX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVFNfQVBJX0lORElDQVRJT05fRVZUOgotICAgICAgYnRhX2dhdHRzX2luZGljYXRlX2hhbmRsZShwX2NiLCAodEJUQV9HQVRUU19EQVRBKilwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX0FQSV9PUEVOX0VWVDoKLSAgICAgIGJ0YV9nYXR0c19vcGVuKHBfY2IsICh0QlRBX0dBVFRTX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVFNfQVBJX0NBTkNFTF9PUEVOX0VWVDoKLSAgICAgIGJ0YV9nYXR0c19jYW5jZWxfb3BlbihwX2NiLCAodEJUQV9HQVRUU19EQVRBKilwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICBidGFfZ2F0dHNfY2xvc2UocF9jYiwgKHRCVEFfR0FUVFNfREFUQSopcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19BUElfUlNQX0VWVDoKLSAgICAgIGJ0YV9nYXR0c19zZW5kX3JzcChwX2NiLCAodEJUQV9HQVRUU19EQVRBKilwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX0FQSV9ERUxfU1JWQ19FVlQ6IHsKLSAgICAgIHRCVEFfR0FUVFNfU1JWQ19DQiogcF9zcnZjX2NiID0gYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9zcnZjX2lkKAotICAgICAgICAgIHBfY2IsICgodEJUQV9HQVRUU19EQVRBKilwX21zZyktPmFwaV9hZGRfc2VydmljZS5oZHIubGF5ZXJfc3BlY2lmaWMpOwotCi0gICAgICBpZiAocF9zcnZjX2NiICE9IE5VTEwpCi0gICAgICAgIGJ0YV9nYXR0c19kZWxldGVfc2VydmljZShwX3NydmNfY2IsICh0QlRBX0dBVFRTX0RBVEEqKXBfbXNnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW4ndCBkZWxldGUgc2VydmljZSAtIG5vIHNydmNfY2IgZm91bmQiOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19BUElfU1RPUF9TUlZDX0VWVDogewotICAgICAgdEJUQV9HQVRUU19TUlZDX0NCKiBwX3NydmNfY2IgPSBidGFfZ2F0dHNfZmluZF9zcnZjX2NiX2J5X3NydmNfaWQoCi0gICAgICAgICAgcF9jYiwgKCh0QlRBX0dBVFRTX0RBVEEqKXBfbXNnKS0+YXBpX2FkZF9zZXJ2aWNlLmhkci5sYXllcl9zcGVjaWZpYyk7Ci0KLSAgICAgIGlmIChwX3NydmNfY2IgIT0gTlVMTCkKLSAgICAgICAgYnRhX2dhdHRzX3N0b3Bfc2VydmljZShwX3NydmNfY2IsICh0QlRBX0dBVFRTX0RBVEEqKXBfbXNnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW4ndCBzdG9wIHNlcnZpY2UgLSBubyBzcnZjX2NiIGZvdW5kIjsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuICh0cnVlKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2J0YV9nYXR0c191dGlscy5jYyBiL2J0YS9nYXR0L2J0YV9nYXR0c191dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2ZGQyMy4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9idGFfZ2F0dHNfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEdBVFQgY2xpZW50IHV0aWxpdHkgZnVuY3Rpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9nYXR0L2J0YV9nYXR0c19pbnQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2FsbG9jX3NydmNfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFsbG9jYXRlIGEgc2VydmljZSBjb250cm9sIGJsb2NrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29udHJvbCBibG9jaywgb3Igb3RoZXJ3aXNlIE5VTEwgd2hlbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRhX2dhdHRzX2FsbG9jX3NydmNfY2IodEJUQV9HQVRUU19DQiogcF9jYiwgdWludDhfdCByY2JfaWR4KSB7Ci0gIHVpbnQ4X3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRTX01BWF9TUlZDX05VTTsgaSsrKSB7Ci0gICAgaWYgKCFwX2NiLT5zcnZjX2NiW2ldLmluX3VzZSkgewotICAgICAgcF9jYi0+c3J2Y19jYltpXS5pbl91c2UgPSB0cnVlOwotICAgICAgcF9jYi0+c3J2Y19jYltpXS5yY2JfaWR4ID0gcmNiX2lkeDsKLSAgICAgIHJldHVybiBpOwotICAgIH0KLSAgfQotICByZXR1cm4gQlRBX0dBVFRTX0lOVkFMSURfQVBQOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9ieV9hcHBfaWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBhcHBsaWNhdGlvbiBjb250cm9sIGJsb2NrIGJ5IGFwcCBJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgYmxvY2sgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9HQVRUU19SQ0IqIGJ0YV9nYXR0c19maW5kX2FwcF9yY2JfYnlfYXBwX2lmKHRHQVRUX0lGIHNlcnZlcl9pZikgewotICB1aW50OF90IGk7Ci0gIHRCVEFfR0FUVFNfUkNCKiBwX3JlZzsKLQotICBmb3IgKGkgPSAwLCBwX3JlZyA9IGJ0YV9nYXR0c19jYi5yY2I7IGkgPCBCVEFfR0FUVFNfTUFYX0FQUF9OVU07Ci0gICAgICAgaSsrLCBwX3JlZysrKSB7Ci0gICAgaWYgKHBfcmVnLT5pbl91c2UgJiYgcF9yZWctPmdhdHRfaWYgPT0gc2VydmVyX2lmKSByZXR1cm4gcF9yZWc7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfZmluZF9hcHBfcmNiX2lkeF9ieV9hcHBfaWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBhcHBsaWNhdGlvbiBjb250cm9sIGJsb2NrIGJ5IGFwcCBJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGluZGV4IG9mIHRoZSBjb250cm9sIGJsb2NrLCBvciBCVEFfR0FUVFNfSU5WQUxJRF9BUFAgaWYKLSAqICAgICAgICAgICAgICAgICAgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVpbnQ4X3QgYnRhX2dhdHRzX2ZpbmRfYXBwX3JjYl9pZHhfYnlfYXBwX2lmKHRCVEFfR0FUVFNfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBzZXJ2ZXJfaWYpIHsKLSAgdWludDhfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfR0FUVFNfTUFYX0FQUF9OVU07IGkrKykgewotICAgIGlmIChwX2NiLT5yY2JbaV0uaW5fdXNlICYmIHBfY2ItPnJjYltpXS5nYXR0X2lmID09IHNlcnZlcl9pZikgcmV0dXJuIGk7Ci0gIH0KLSAgcmV0dXJuIEJUQV9HQVRUU19JTlZBTElEX0FQUDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZ2F0dHNfZmluZF9zcnZjX2NiX2J5X3NydmNfaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgdGhlIHNlcnZpY2UgY29udHJvbCBibG9jayBieSBzZXJ2aWNlIElELgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgcmNiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRTX1NSVkNfQ0IqIGJ0YV9nYXR0c19maW5kX3NydmNfY2JfYnlfc3J2Y19pZCh0QlRBX0dBVFRTX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV9pZCkgewotICB1aW50OF90IGk7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogc2VydmljZV9pZD0iIDw8ICtzZXJ2aWNlX2lkOwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0dBVFRTX01BWF9TUlZDX05VTTsgaSsrKSB7Ci0gICAgaWYgKHBfY2ItPnNydmNfY2JbaV0uaW5fdXNlICYmIHBfY2ItPnNydmNfY2JbaV0uc2VydmljZV9pZCA9PSBzZXJ2aWNlX2lkKSB7Ci0gICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGZvdW5kIHNlcnZpY2UgY2IgaW5kZXg9IiA8PCAraTsKLSAgICAgIHJldHVybiAmcF9jYi0+c3J2Y19jYltpXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dhdHRzX2ZpbmRfc3J2Y19jYl9ieV9hdHRyX2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIHRoZSBzZXJ2aWNlIGNvbnRyb2wgYmxvY2sgYnkgYXR0cmlidXRlIElELgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgcmNiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0dBVFRTX1NSVkNfQ0IqIGJ0YV9nYXR0c19maW5kX3NydmNfY2JfYnlfYXR0cl9pZCh0QlRBX0dBVFRTX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9pZCkgewotICB1aW50OF90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IChCVEFfR0FUVFNfTUFYX1NSVkNfTlVNKTsgaSsrKSB7Ci0gICAgaWYgKC8qIG1pZGRsZSBzZXJ2aWNlICovCi0gICAgICAgIChpIDwgKEJUQV9HQVRUU19NQVhfU1JWQ19OVU0gLSAxKSAmJiBwX2NiLT5zcnZjX2NiW2ldLmluX3VzZSAmJgotICAgICAgICAgcF9jYi0+c3J2Y19jYltpICsgMV0uaW5fdXNlICYmCi0gICAgICAgICBhdHRyX2lkID49IHBfY2ItPnNydmNfY2JbaV0uc2VydmljZV9pZCAmJgotICAgICAgICAgYXR0cl9pZCA8IHBfY2ItPnNydmNfY2JbaSArIDFdLnNlcnZpY2VfaWQpIHx8Ci0gICAgICAgIC8qIGxhc3QgYWN0aXZlIHNlcnZpY2UgKi8KLSAgICAgICAgKGkgPCAoQlRBX0dBVFRTX01BWF9TUlZDX05VTSAtIDEpICYmIHBfY2ItPnNydmNfY2JbaV0uaW5fdXNlICYmCi0gICAgICAgICAhcF9jYi0+c3J2Y19jYltpICsgMV0uaW5fdXNlICYmCi0gICAgICAgICBhdHRyX2lkID49IHBfY2ItPnNydmNfY2JbaV0uc2VydmljZV9pZCkgfHwKLSAgICAgICAgLyogbGFzdCBzZXJ2aWNlIGluY2IgKi8KLSAgICAgICAgKGkgPT0gKEJUQV9HQVRUU19NQVhfU1JWQ19OVU0gLSAxKSAmJgotICAgICAgICAgYXR0cl9pZCA+PSBwX2NiLT5zcnZjX2NiW2ldLnNlcnZpY2VfaWQpKSB7Ci0gICAgICByZXR1cm4gJnBfY2ItPnNydmNfY2JbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2dhdHQvZGF0YWJhc2UuY2MgYi9idGEvZ2F0dC9kYXRhYmFzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzZmQ1NS4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9kYXRhYmFzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZGF0YWJhc2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1uYW1lc3BhY2UgZ2F0dCB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBVdWlkIFBSSU1BUllfU0VSVklDRSA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfUFJJX1NFUlZJQ0UpOwotY29uc3QgVXVpZCBTRUNPTkRBUllfU0VSVklDRSA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfU0VDX1NFUlZJQ0UpOwotY29uc3QgVXVpZCBJTkNMVURFID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9JTkNMVURFX1NFUlZJQ0UpOwotY29uc3QgVXVpZCBDSEFSQUNURVJJU1RJQyA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9ERUNMQVJFKTsKLWNvbnN0IFV1aWQgQ0hBUkFDVEVSSVNUSUNfRVhURU5ERURfUFJPUEVSVElFUyA9Ci0gICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0VYVF9QUk9QKTsKLQotYm9vbCBIYW5kbGVJblJhbmdlKGNvbnN0IFNlcnZpY2UmIHN2YywgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHJldHVybiBoYW5kbGUgPj0gc3ZjLmhhbmRsZSAmJiBoYW5kbGUgPD0gc3ZjLmVuZF9oYW5kbGU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotc3RhdGljIHNpemVfdCBVdWlkU2l6ZShjb25zdCBVdWlkJiB1dWlkKSB7Ci0gIHNpemVfdCBsZW4gPSB1dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0gIHJldHVybiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczMyKSA/IFV1aWQ6OmtOdW1CeXRlczEyOCA6IGxlbjsKLX0KLQotU2VydmljZSogRmluZFNlcnZpY2Uoc3RkOjpsaXN0PFNlcnZpY2U+JiBzZXJ2aWNlcywgdWludDE2X3QgaGFuZGxlKSB7Ci0gIGZvciAoU2VydmljZSYgc2VydmljZSA6IHNlcnZpY2VzKSB7Ci0gICAgaWYgKGhhbmRsZSA+PSBzZXJ2aWNlLmhhbmRsZSAmJiBoYW5kbGUgPD0gc2VydmljZS5lbmRfaGFuZGxlKQotICAgICAgcmV0dXJuICZzZXJ2aWNlOwotICB9Ci0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXN0ZDo6c3RyaW5nIERhdGFiYXNlOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gdG1wOwotCi0gIGZvciAoY29uc3QgU2VydmljZSYgc2VydmljZSA6IHNlcnZpY2VzKSB7Ci0gICAgdG1wIDw8ICJTZXJ2aWNlOiBoYW5kbGU9IiA8PCBsb2doZXgoc2VydmljZS5oYW5kbGUpCi0gICAgICAgIDw8ICIsIGVuZF9oYW5kbGU9IiA8PCBsb2doZXgoc2VydmljZS5lbmRfaGFuZGxlKQotICAgICAgICA8PCAiLCB1dWlkPSIgPDwgc2VydmljZS51dWlkIDw8ICJcbiI7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGlzIDogc2VydmljZS5pbmNsdWRlZF9zZXJ2aWNlcykgewotICAgICAgdG1wIDw8ICJcdCBJbmNsdWRlZCBzZXJ2aWNlOiBoYW5kbGU9IiA8PCBsb2doZXgoaXMuaGFuZGxlKQotICAgICAgICAgIDw8ICIsIHN0YXJ0X2hhbmRsZT0iIDw8IGxvZ2hleChpcy5zdGFydF9oYW5kbGUpCi0gICAgICAgICAgPDwgIiwgZW5kX2hhbmRsZT0iIDw8IGxvZ2hleChpcy5lbmRfaGFuZGxlKSA8PCAiLCB1dWlkPSIgPDwgaXMudXVpZAotICAgICAgICAgIDw8ICJcbiI7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBDaGFyYWN0ZXJpc3RpYyYgYyA6IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgICB0bXAgPDwgIlx0IENoYXJhY3RlcmlzdGljOiBkZWNsYXJhdGlvbl9oYW5kbGU9IgotICAgICAgICAgIDw8IGxvZ2hleChjLmRlY2xhcmF0aW9uX2hhbmRsZSkKLSAgICAgICAgICA8PCAiLCB2YWx1ZV9oYW5kbGU9IiA8PCBsb2doZXgoYy52YWx1ZV9oYW5kbGUpIDw8ICIsIHV1aWQ9IiA8PCBjLnV1aWQKLSAgICAgICAgICA8PCAiLCBwcm9wPSIgPDwgbG9naGV4KGMucHJvcGVydGllcykgPDwgIlxuIjsKLQotICAgICAgZm9yIChjb25zdCBEZXNjcmlwdG9yJiBkIDogYy5kZXNjcmlwdG9ycykgewotICAgICAgICB0bXAgPDwgIlx0XHQgRGVzY3JpcHRvcjogaGFuZGxlPSIgPDwgbG9naGV4KGQuaGFuZGxlKQotICAgICAgICAgICAgPDwgIiwgdXVpZD0iIDw8IGQudXVpZCA8PCAiXG4iOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdG1wLnN0cigpOwotfQotCi1zdGQ6OnZlY3RvcjxTdG9yZWRBdHRyaWJ1dGU+IERhdGFiYXNlOjpTZXJpYWxpemUoKSBjb25zdCB7Ci0gIHN0ZDo6dmVjdG9yPFN0b3JlZEF0dHJpYnV0ZT4gbnZfYXR0cjsKLQotICBpZiAoc2VydmljZXMuZW1wdHkoKSkgcmV0dXJuIHN0ZDo6dmVjdG9yPFN0b3JlZEF0dHJpYnV0ZT4oKTsKLQotICBmb3IgKGNvbnN0IFNlcnZpY2UmIHNlcnZpY2UgOiBzZXJ2aWNlcykgewotICAgIC8vIFRPRE86IGFkZCBjb25zdHJ1Y3RvciB0byBOVl9BVFRSLCB1c2UgZW1wbGFjZV9iYWNrCi0gICAgbnZfYXR0ci5wdXNoX2JhY2soe3NlcnZpY2UuaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzX3ByaW1hcnkgPyBQUklNQVJZX1NFUlZJQ0UgOiBTRUNPTkRBUllfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgey5zZXJ2aWNlID0gey51dWlkID0gc2VydmljZS51dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuZF9oYW5kbGUgPSBzZXJ2aWNlLmVuZF9oYW5kbGV9fX0pOwotICB9Ci0KLSAgZm9yIChjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICBmb3IgKGNvbnN0IEluY2x1ZGVkU2VydmljZSYgcF9pc3ZjIDogc2VydmljZS5pbmNsdWRlZF9zZXJ2aWNlcykgewotICAgICAgbnZfYXR0ci5wdXNoX2JhY2soe3BfaXN2Yy5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB7LmluY2x1ZGVkX3NlcnZpY2UgPSB7LmhhbmRsZSA9IHBfaXN2Yy5zdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmRfaGFuZGxlID0gcF9pc3ZjLmVuZF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51dWlkID0gcF9pc3ZjLnV1aWR9fX0pOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgQ2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgICBudl9hdHRyLnB1c2hfYmFjaygKLSAgICAgICAgICB7Y2hhcmFjLmRlY2xhcmF0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgIHsuY2hhcmFjdGVyaXN0aWMgPSB7LnByb3BlcnRpZXMgPSBjaGFyYWMucHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXVpZCA9IGNoYXJhYy51dWlkfX19KTsKLQotICAgICAgZm9yIChjb25zdCBEZXNjcmlwdG9yJiBkZXNjIDogY2hhcmFjLmRlc2NyaXB0b3JzKSB7Ci0gICAgICAgIGlmIChkZXNjLnV1aWQgPT0gQ0hBUkFDVEVSSVNUSUNfRVhURU5ERURfUFJPUEVSVElFUykgewotICAgICAgICAgIG52X2F0dHIucHVzaF9iYWNrKHtkZXNjLmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy51dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LmNoYXJhY3RlcmlzdGljX2V4dGVuZGVkX3Byb3BlcnRpZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuY2hhcmFjdGVyaXN0aWNfZXh0ZW5kZWRfcHJvcGVydGllc319KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBudl9hdHRyLnB1c2hfYmFjayh7ZGVzYy5oYW5kbGUsIGRlc2MudXVpZCwge319KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBudl9hdHRyOwotfQotCi1EYXRhYmFzZSBEYXRhYmFzZTo6RGVzZXJpYWxpemUoY29uc3Qgc3RkOjp2ZWN0b3I8U3RvcmVkQXR0cmlidXRlPiYgbnZfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzdWNjZXNzKSB7Ci0gIC8vIGNsZWFyIHJlYWxsb2NhdGluZwotICBEYXRhYmFzZSByZXN1bHQ7Ci0gIGF1dG8gaXQgPSBudl9hdHRyLmNiZWdpbigpOwotCi0gIGZvciAoOyBpdCAhPSBudl9hdHRyLmNlbmQoKTsgKytpdCkgewotICAgIGNvbnN0IGF1dG8mIGF0dHIgPSAqaXQ7Ci0gICAgaWYgKGF0dHIudHlwZSAhPSBQUklNQVJZX1NFUlZJQ0UgJiYgYXR0ci50eXBlICE9IFNFQ09OREFSWV9TRVJWSUNFKSBicmVhazsKLSAgICByZXN1bHQuc2VydmljZXMuZW1wbGFjZV9iYWNrKFNlcnZpY2V7Ci0gICAgICAgIC5oYW5kbGUgPSBhdHRyLmhhbmRsZSwKLSAgICAgICAgLnV1aWQgPSBhdHRyLnZhbHVlLnNlcnZpY2UudXVpZCwKLSAgICAgICAgLmlzX3ByaW1hcnkgPSAoYXR0ci50eXBlID09IFBSSU1BUllfU0VSVklDRSksCi0gICAgICAgIC5lbmRfaGFuZGxlID0gYXR0ci52YWx1ZS5zZXJ2aWNlLmVuZF9oYW5kbGUsCi0gICAgfSk7Ci0gIH0KLQotICBhdXRvIGN1cnJlbnRfc2VydmljZV9pdCA9IHJlc3VsdC5zZXJ2aWNlcy5iZWdpbigpOwotICBmb3IgKDsgaXQgIT0gbnZfYXR0ci5jZW5kKCk7IGl0KyspIHsKLSAgICBjb25zdCBhdXRvJiBhdHRyID0gKml0OwotCi0gICAgLy8gZ28gdG8gdGhlIHNlcnZpY2UgdGhpcyBhdHRyaWJ1dGUgYmVsb25ncyB0bzsgYXR0cmlidXRlcyBhcmUgc3RvcmVkIGluCi0gICAgLy8gb3JkZXIsIHNvIGl0ZXJhdGluZyBqdXN0IGZvcndhcmQgaXMgZW5vdWdoCi0gICAgd2hpbGUgKGN1cnJlbnRfc2VydmljZV9pdCAhPSByZXN1bHQuc2VydmljZXMuZW5kKCkgJiYKLSAgICAgICAgICAgY3VycmVudF9zZXJ2aWNlX2l0LT5lbmRfaGFuZGxlIDwgYXR0ci5oYW5kbGUpIHsKLSAgICAgIGN1cnJlbnRfc2VydmljZV9pdCsrOwotICAgIH0KLQotICAgIGlmIChjdXJyZW50X3NlcnZpY2VfaXQgPT0gcmVzdWx0LnNlcnZpY2VzLmVuZCgpIHx8Ci0gICAgICAgICFIYW5kbGVJblJhbmdlKCpjdXJyZW50X3NlcnZpY2VfaXQsIGF0dHIuaGFuZGxlKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiQ2FuJ3QgZmluZCBzZXJ2aWNlIGZvciBhdHRyaWJ1dGUgd2l0aCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGF0dHIuaGFuZGxlKTsKLSAgICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChhdHRyLnR5cGUgPT0gSU5DTFVERSkgewotICAgICAgU2VydmljZSogaW5jbHVkZWRfc2VydmljZSA9Ci0gICAgICAgICAgRmluZFNlcnZpY2UocmVzdWx0LnNlcnZpY2VzLCBhdHRyLnZhbHVlLmluY2x1ZGVkX3NlcnZpY2UuaGFuZGxlKTsKLSAgICAgIGlmICghaW5jbHVkZWRfc2VydmljZSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vbi1leGlzdGluZyBpbmNsdWRlZCBzZXJ2aWNlISI7Ci0gICAgICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBjdXJyZW50X3NlcnZpY2VfaXQtPmluY2x1ZGVkX3NlcnZpY2VzLnB1c2hfYmFjayhJbmNsdWRlZFNlcnZpY2V7Ci0gICAgICAgICAgLmhhbmRsZSA9IGF0dHIuaGFuZGxlLAotICAgICAgICAgIC51dWlkID0gYXR0ci52YWx1ZS5pbmNsdWRlZF9zZXJ2aWNlLnV1aWQsCi0gICAgICAgICAgLnN0YXJ0X2hhbmRsZSA9IGF0dHIudmFsdWUuaW5jbHVkZWRfc2VydmljZS5oYW5kbGUsCi0gICAgICAgICAgLmVuZF9oYW5kbGUgPSBhdHRyLnZhbHVlLmluY2x1ZGVkX3NlcnZpY2UuZW5kX2hhbmRsZSwKLSAgICAgIH0pOwotICAgIH0gZWxzZSBpZiAoYXR0ci50eXBlID09IENIQVJBQ1RFUklTVElDKSB7Ci0gICAgICBjdXJyZW50X3NlcnZpY2VfaXQtPmNoYXJhY3RlcmlzdGljcy5lbXBsYWNlX2JhY2soQ2hhcmFjdGVyaXN0aWN7Ci0gICAgICAgICAgLmRlY2xhcmF0aW9uX2hhbmRsZSA9IGF0dHIuaGFuZGxlLAotICAgICAgICAgIC51dWlkID0gYXR0ci52YWx1ZS5jaGFyYWN0ZXJpc3RpYy51dWlkLAotICAgICAgICAgIC52YWx1ZV9oYW5kbGUgPSBhdHRyLnZhbHVlLmNoYXJhY3RlcmlzdGljLnZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAucHJvcGVydGllcyA9IGF0dHIudmFsdWUuY2hhcmFjdGVyaXN0aWMucHJvcGVydGllcywKLSAgICAgIH0pOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChhdHRyLnR5cGUgPT0gQ0hBUkFDVEVSSVNUSUNfRVhURU5ERURfUFJPUEVSVElFUykgewotICAgICAgICBjdXJyZW50X3NlcnZpY2VfaXQtPmNoYXJhY3RlcmlzdGljcy5iYWNrKCkuZGVzY3JpcHRvcnMuZW1wbGFjZV9iYWNrKAotICAgICAgICAgICAgRGVzY3JpcHRvcnsuaGFuZGxlID0gYXR0ci5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIC51dWlkID0gYXR0ci50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAuY2hhcmFjdGVyaXN0aWNfZXh0ZW5kZWRfcHJvcGVydGllcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnZhbHVlLmNoYXJhY3RlcmlzdGljX2V4dGVuZGVkX3Byb3BlcnRpZXN9KTsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3VycmVudF9zZXJ2aWNlX2l0LT5jaGFyYWN0ZXJpc3RpY3MuYmFjaygpLmRlc2NyaXB0b3JzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgICAgIERlc2NyaXB0b3J7LmhhbmRsZSA9IGF0dHIuaGFuZGxlLCAudXVpZCA9IGF0dHIudHlwZX0pOwotICAgICAgfQotICAgIH0KLSAgfQotICAqc3VjY2VzcyA9IHRydWU7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLU9jdGV0MTYgRGF0YWJhc2U6Okhhc2goKSBjb25zdCB7Ci0gIGludCBsZW4gPSAwOwotICAvLyBDb21wdXRlIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQgdG8gYWN0dWFsbHkgaG9sZCB0aGUgZGF0YS4KLSAgZm9yIChjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICBsZW4gKz0gNCArIFV1aWRTaXplKHNlcnZpY2UudXVpZCk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGlzIDogc2VydmljZS5pbmNsdWRlZF9zZXJ2aWNlcykgewotICAgICAgbGVuICs9IDggKyBVdWlkU2l6ZShpcy51dWlkKTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IENoYXJhY3RlcmlzdGljJiBjIDogc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIGxlbiArPSA3ICsgVXVpZFNpemUoYy51dWlkKTsKLQotICAgICAgZm9yIChjb25zdCBEZXNjcmlwdG9yJiBkIDogYy5kZXNjcmlwdG9ycykgewotICAgICAgICBpZiAoVXVpZFNpemUoZC51dWlkKSAhPSBVdWlkOjprTnVtQnl0ZXMxNikgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQxNl90IHZhbHVlID0gZC51dWlkLkFzMTZCaXQoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IEdBVFRfVVVJRF9DSEFSX0RFU0NSSVBUSU9OIHx8Ci0gICAgICAgICAgICB2YWx1ZSA9PSBHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHIHx8Ci0gICAgICAgICAgICB2YWx1ZSA9PSBHQVRUX1VVSURfQ0hBUl9TUlZSX0NPTkZJRyB8fAotICAgICAgICAgICAgdmFsdWUgPT0gR0FUVF9VVUlEX0NIQVJfUFJFU0VOVF9GT1JNQVQgfHwKLSAgICAgICAgICAgIHZhbHVlID09IEdBVFRfVVVJRF9DSEFSX0FHR19GT1JNQVQpIHsKLSAgICAgICAgICBsZW4gKz0gMiArIFV1aWRTaXplKGQudXVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gR0FUVF9VVUlEX0NIQVJfRVhUX1BST1ApIHsKLSAgICAgICAgICBsZW4gKz0gNCArIFV1aWRTaXplKGQudXVpZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXJpYWxpemVkKGxlbik7Ci0gIHVpbnQ4X3QqIHAgPSBzZXJpYWxpemVkLmRhdGEoKTsKLSAgZm9yIChjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHNlcnZpY2UuaGFuZGxlKTsKLSAgICBpZiAoc2VydmljZS5pc19wcmltYXJ5KSB7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIEdBVFRfVVVJRF9QUklfU0VSVklDRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgR0FUVF9VVUlEX1NFQ19TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBpZiAoVXVpZFNpemUoc2VydmljZS51dWlkKSA9PSBVdWlkOjprTnVtQnl0ZXMxNikgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBzZXJ2aWNlLnV1aWQuQXMxNkJpdCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIHNlcnZpY2UudXVpZC5UbzEyOEJpdExFKCksIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGlzIDogc2VydmljZS5pbmNsdWRlZF9zZXJ2aWNlcykgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBpcy5oYW5kbGUpOwotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBHQVRUX1VVSURfSU5DTFVERV9TRVJWSUNFKTsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgaXMuc3RhcnRfaGFuZGxlKTsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgaXMuZW5kX2hhbmRsZSk7Ci0KLSAgICAgIGlmIChVdWlkU2l6ZShpcy51dWlkKSA9PSBVdWlkOjprTnVtQnl0ZXMxNikgewotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGlzLnV1aWQuQXMxNkJpdCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFSUkFZX1RPX1NUUkVBTShwLCBpcy51dWlkLlRvMTI4Qml0TEUoKSwgKGludClVdWlkOjprTnVtQnl0ZXMxMjgpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY29uc3QgQ2hhcmFjdGVyaXN0aWMmIGMgOiBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcykgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBjLmRlY2xhcmF0aW9uX2hhbmRsZSk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIEdBVFRfVVVJRF9DSEFSX0RFQ0xBUkUpOwotICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGMucHJvcGVydGllcyk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGMudmFsdWVfaGFuZGxlKTsKLQotICAgICAgaWYgKFV1aWRTaXplKGMudXVpZCkgPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBjLnV1aWQuQXMxNkJpdCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFSUkFZX1RPX1NUUkVBTShwLCBjLnV1aWQuVG8xMjhCaXRMRSgpLCAoaW50KVV1aWQ6OmtOdW1CeXRlczEyOCk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoY29uc3QgRGVzY3JpcHRvciYgZCA6IGMuZGVzY3JpcHRvcnMpIHsKLSAgICAgICAgaWYgKFV1aWRTaXplKGQudXVpZCkgIT0gVXVpZDo6a051bUJ5dGVzMTYpIGNvbnRpbnVlOwotICAgICAgICB1aW50MTZfdCB2YWx1ZSA9IGQudXVpZC5BczE2Qml0KCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBHQVRUX1VVSURfQ0hBUl9ERVNDUklQVElPTiB8fAotICAgICAgICAgICAgdmFsdWUgPT0gR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRyB8fAotICAgICAgICAgICAgdmFsdWUgPT0gR0FUVF9VVUlEX0NIQVJfU1JWUl9DT05GSUcgfHwKLSAgICAgICAgICAgIHZhbHVlID09IEdBVFRfVVVJRF9DSEFSX1BSRVNFTlRfRk9STUFUIHx8Ci0gICAgICAgICAgICB2YWx1ZSA9PSBHQVRUX1VVSURfQ0hBUl9BR0dfRk9STUFUKSB7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBkLmhhbmRsZSk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBkLnV1aWQuQXMxNkJpdCgpKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBHQVRUX1VVSURfQ0hBUl9FWFRfUFJPUCkgewotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgZC5oYW5kbGUpOwotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgZC51dWlkLkFzMTZCaXQoKSk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBkLmNoYXJhY3RlcmlzdGljX2V4dGVuZGVkX3Byb3BlcnRpZXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpyZXZlcnNlKHNlcmlhbGl6ZWQuYmVnaW4oKSwgc2VyaWFsaXplZC5lbmQoKSk7Ci0gIHJldHVybiBjcnlwdG9fdG9vbGJveDo6YWVzX2NtYWMoT2N0ZXQxNnswfSwgc2VyaWFsaXplZC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZC5zaXplKCkpOwotfQotfSAgLy8gbmFtZXNwYWNlIGdhdHQKZGlmZiAtLWdpdCBhL2J0YS9nYXR0L2RhdGFiYXNlLmggYi9idGEvZ2F0dC9kYXRhYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2MwM2U1Li4wMDAwMDAwCi0tLSBhL2J0YS9nYXR0L2RhdGFiYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiIC8qIGZvciBPY3RldDE2ICovCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotbmFtZXNwYWNlIGdhdHQgewotY29uc3RleHByIHVpbnQxNl90IEhBTkRMRV9NSU4gPSAweDAwMDE7Ci1jb25zdGV4cHIgdWludDE2X3QgSEFORExFX01BWCA9IDB4ZmZmZjsKLQotLyogUmVwcmVzZW50YXRpb24gb2YgR0FUVCBhdHRyaWJ1dGUgZm9yIHN0b3JhZ2UgKi8KLXN0cnVjdCBTdG9yZWRBdHRyaWJ1dGUgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIGJsdWV0b290aDo6VXVpZCB0eXBlOwotCi0gIHVuaW9uIHsKLSAgICAvKiBwcmltYXJ5IG9yIHNlY29uZGFyeSBzZXJ2aWNlIGRlZmluaXRpb24gKi8KLSAgICBzdHJ1Y3QgewotICAgICAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gICAgICB1aW50MTZfdCBlbmRfaGFuZGxlOwotICAgIH0gc2VydmljZTsKLQotICAgIC8qIGluY2x1ZGVkIHNlcnZpY2UgZGVmaW5pdGlvbiAqLwotICAgIHN0cnVjdCB7Ci0gICAgICB1aW50MTZfdCBoYW5kbGU7Ci0gICAgICB1aW50MTZfdCBlbmRfaGFuZGxlOwotICAgICAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gICAgfSBpbmNsdWRlZF9zZXJ2aWNlOwotCi0gICAgLyogY2hhcmFjdGVyaXN0aWMgZGVmaW5pdGlvbiAqLwotICAgIHN0cnVjdCB7Ci0gICAgICB1aW50OF90IHByb3BlcnRpZXM7Ci0gICAgICB1aW50MTZfdCB2YWx1ZV9oYW5kbGU7Ci0gICAgICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgICB9IGNoYXJhY3RlcmlzdGljOwotCi0gICAgLyogZm9yIGRlc2NyaXB0b3Igd2Ugc3RvcmUgdmFsdWUgb25seSBmb3IKLSAgICAgKiDCq0NoYXJhY3RlcmlzdGljIEV4dGVuZGVkIFByb3BlcnRpZXPCuyAqLwotICAgIHVpbnQxNl90IGNoYXJhY3RlcmlzdGljX2V4dGVuZGVkX3Byb3BlcnRpZXM7Ci0gIH0gdmFsdWU7Ci19OwotCi1zdHJ1Y3QgSW5jbHVkZWRTZXJ2aWNlOwotc3RydWN0IENoYXJhY3RlcmlzdGljOwotc3RydWN0IERlc2NyaXB0b3I7Ci0KLXN0cnVjdCBTZXJ2aWNlIHsKLSAgdWludDE2X3QgaGFuZGxlOwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgYm9vbCBpc19wcmltYXJ5OwotICB1aW50MTZfdCBlbmRfaGFuZGxlOwotICBzdGQ6OnZlY3RvcjxJbmNsdWRlZFNlcnZpY2U+IGluY2x1ZGVkX3NlcnZpY2VzOwotICBzdGQ6OnZlY3RvcjxDaGFyYWN0ZXJpc3RpYz4gY2hhcmFjdGVyaXN0aWNzOwotfTsKLQotc3RydWN0IEluY2x1ZGVkU2VydmljZSB7Ci0gIHVpbnQxNl90IGhhbmRsZTsgLyogZGVmaW5pdGlvbiBoYW5kbGUgKi8KLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIHVpbnQxNl90IHN0YXJ0X2hhbmRsZTsgLyogc3RhcnQgaGFuZGxlIG9mIGluY2x1ZGVkIHNlcnZpY2UgKi8KLSAgdWludDE2X3QgZW5kX2hhbmRsZTsgICAvKiBlbmQgaGFuZGxlIG9mIGluY2x1ZGVkIHNlcnZpY2UgKi8KLX07Ci0KLXN0cnVjdCBDaGFyYWN0ZXJpc3RpYyB7Ci0gIHVpbnQxNl90IGRlY2xhcmF0aW9uX2hhbmRsZTsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIHVpbnQxNl90IHZhbHVlX2hhbmRsZTsKLSAgdWludDhfdCBwcm9wZXJ0aWVzOwotICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9yczsKLX07Ci0KLXN0cnVjdCBEZXNjcmlwdG9yIHsKLSAgdWludDE2X3QgaGFuZGxlOwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgLyogc2V0IGFuZCB1c2VkIGZvciDCq0NoYXJhY3RlcmlzdGljIEV4dGVuZGVkIFByb3BlcnRpZXPCuyBvbmx5ICovCi0gIHVpbnQxNl90IGNoYXJhY3RlcmlzdGljX2V4dGVuZGVkX3Byb3BlcnRpZXM7Ci19OwotCi1jbGFzcyBEYXRhYmFzZUJ1aWxkZXI7Ci0KLWNsYXNzIERhdGFiYXNlIHsKLSBwdWJsaWM6Ci0gIC8qIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBzZXJ2aWNlcyBpbiB0aGlzIGRhdGFiYXNlLiAqLwotICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBzZXJ2aWNlcy5lbXB0eSgpOyB9Ci0KLSAgLyogQ2xlYXIgdGhlIEdBVFQgZGF0YWJhc2UuIFRoaXMgbWV0aG9kIGZvcmNlcyByZWxvY2F0aW9uIHRvIGVuc3VyZSBubyBleHRyYQotICAgKiBzcGFjZSBpcyB1c2VkIHVubmVjZXNhcmx5ICovCi0gIHZvaWQgQ2xlYXIoKSB7IHN0ZDo6bGlzdDxTZXJ2aWNlPigpLnN3YXAoc2VydmljZXMpOyB9Ci0KLSAgLyogUmV0dXJuIGxpc3Qgb2Ygc2VydmljZXMgYXZhaWxhYmxlIGluIHRoaXMgZGF0YWJhc2UgKi8KLSAgY29uc3Qgc3RkOjpsaXN0PFNlcnZpY2U+JiBTZXJ2aWNlcygpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzOyB9Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKLQotICBzdGQ6OnZlY3RvcjxnYXR0OjpTdG9yZWRBdHRyaWJ1dGU+IFNlcmlhbGl6ZSgpIGNvbnN0OwotCi0gIHN0YXRpYyBEYXRhYmFzZSBEZXNlcmlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxnYXR0OjpTdG9yZWRBdHRyaWJ1dGU+JiBudl9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogc3VjY2Vzcyk7Ci0KLSAgLyogUmV0dXJuIDEyOCBiaXQgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBHQVRUIGRhdGFiYXNlICovCi0gIE9jdGV0MTYgSGFzaCgpIGNvbnN0OwotCi0gIGZyaWVuZCBjbGFzcyBEYXRhYmFzZUJ1aWxkZXI7Ci0KLSBwcml2YXRlOgotICBzdGQ6Omxpc3Q8U2VydmljZT4gc2VydmljZXM7Ci19OwotCi0vKiBGaW5kIGEgc2VydmljZSB0aGF0IHNob3VsZCBjb250YWluIGhhbmRsZS4gSGVscGVyIG1ldGhvZCBmb3IgaW50ZXJuYWwgdXNlCi0gKiBpbnNpZGUgZ2F0dCBuYW1lc3BhY2UuKi8KLVNlcnZpY2UqIEZpbmRTZXJ2aWNlKHN0ZDo6bGlzdDxTZXJ2aWNlPiYgc2VydmljZXMsIHVpbnQxNl90IGhhbmRsZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBnYXR0CmRpZmYgLS1naXQgYS9idGEvZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmNjIGIvYnRhL2dhdHQvZGF0YWJhc2VfYnVpbGRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjOTE5MS4uMDAwMDAwMAotLS0gYS9idGEvZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotCi0jaW5jbHVkZSAiYnRhL2dhdHQvZGF0YWJhc2UuaCIKLSNpbmNsdWRlICJidGEvZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXR0ZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1uYW1lc3BhY2UgZ2F0dCB7Ci0KLXZvaWQgRGF0YWJhc2VCdWlsZGVyOjpBZGRTZXJ2aWNlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgZW5kX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQmIHV1aWQsIGJvb2wgaXNfcHJpbWFyeSkgewotICAvLyBnZW5lcmFsIGNhc2Ugb3B0aW1pemF0aW9uIC0gd2UgYWRkIHNlcnZpY2VzIGluIG9yZGVyCi0gIGlmIChkYXRhYmFzZS5zZXJ2aWNlcy5lbXB0eSgpIHx8Ci0gICAgICBkYXRhYmFzZS5zZXJ2aWNlcy5iYWNrKCkuZW5kX2hhbmRsZSA8IGhhbmRsZSkgewotICAgIGRhdGFiYXNlLnNlcnZpY2VzLmVtcGxhY2VfYmFjayhTZXJ2aWNlewotICAgICAgICAuaGFuZGxlID0gaGFuZGxlLAotICAgICAgICAudXVpZCA9IHV1aWQsCi0gICAgICAgIC5pc19wcmltYXJ5ID0gaXNfcHJpbWFyeSwKLSAgICAgICAgLmVuZF9oYW5kbGUgPSBlbmRfaGFuZGxlLAotICAgIH0pOwotICB9IGVsc2UgewotICAgIGF1dG8mIHZlYyA9IGRhdGFiYXNlLnNlcnZpY2VzOwotCi0gICAgLy8gRmluZCBmaXJzdCBzZXJ2aWNlIHdob3NlIHN0YXJ0IGhhbmRsZSBpcyBiaWdnZXIgdGhhbiBuZXcgc2VydmljZSBoYW5kbGUKLSAgICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKLSAgICAgICAgdmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgaGFuZGxlLAotICAgICAgICBbXShTZXJ2aWNlIHMsIHVpbnQxNl90IGhhbmRsZSkgeyByZXR1cm4gcy5lbmRfaGFuZGxlIDwgaGFuZGxlOyB9KTsKLQotICAgIC8vIEluc2VydCBuZXcgc2VydmljZSBqdXN0IGJlZm9yZSBpdAotICAgIHZlYy5lbXBsYWNlKGl0LCBTZXJ2aWNlewotICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC51dWlkID0gdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5pc19wcmltYXJ5ID0gaXNfcHJpbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lbmRfaGFuZGxlID0gZW5kX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIH0KLQotICBzZXJ2aWNlc190b19kaXNjb3Zlci5pbnNlcnQoe2hhbmRsZSwgZW5kX2hhbmRsZX0pOwotfQotCi12b2lkIERhdGFiYXNlQnVpbGRlcjo6QWRkSW5jbHVkZWRTZXJ2aWNlKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfaGFuZGxlKSB7Ci0gIFNlcnZpY2UqIHNlcnZpY2UgPSBGaW5kU2VydmljZShkYXRhYmFzZS5zZXJ2aWNlcywgaGFuZGxlKTsKLSAgaWYgKCFzZXJ2aWNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiSWxsZWdhbCBhY3Rpb24gdG8gYWRkIHRvIG5vbi1leGlzdGluZyBzZXJ2aWNlISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogV2UgZGlzY292ZXIgYWxsIFByaW1hcnkgU2VydmljZXMgZmlyc3QuIElmIGluY2x1ZGVkIHNlcnZpY2Ugd2FzIG5vdCBzZWVuCi0gICAqIGJlZm9yZSwgaXQgbXVzdCBiZSBhIFNlY29uZGFyeSBTZXJ2aWNlICovCi0gIGlmICghRmluZFNlcnZpY2UoZGF0YWJhc2Uuc2VydmljZXMsIHN0YXJ0X2hhbmRsZSkpIHsKLSAgICBBZGRTZXJ2aWNlKHN0YXJ0X2hhbmRsZSwgZW5kX2hhbmRsZSwgdXVpZCwgZmFsc2UgLyogbm90IHByaW1hcnkgKi8pOwotICB9Ci0KLSAgc2VydmljZS0+aW5jbHVkZWRfc2VydmljZXMucHVzaF9iYWNrKEluY2x1ZGVkU2VydmljZXsKLSAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAudXVpZCA9IHV1aWQsCi0gICAgICAuc3RhcnRfaGFuZGxlID0gc3RhcnRfaGFuZGxlLAotICAgICAgLmVuZF9oYW5kbGUgPSBlbmRfaGFuZGxlLAotICB9KTsKLX0KLQotdm9pZCBEYXRhYmFzZUJ1aWxkZXI6OkFkZENoYXJhY3RlcmlzdGljKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdmFsdWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQmIHV1aWQsIHVpbnQ4X3QgcHJvcGVydGllcykgewotICBTZXJ2aWNlKiBzZXJ2aWNlID0gRmluZFNlcnZpY2UoZGF0YWJhc2Uuc2VydmljZXMsIGhhbmRsZSk7Ci0gIGlmICghc2VydmljZSkgewotICAgIExPRyhFUlJPUikgPDwgIklsbGVnYWwgYWN0aW9uIHRvIGFkZCB0byBub24tZXhpc3Rpbmcgc2VydmljZSEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzZXJ2aWNlLT5lbmRfaGFuZGxlIDwgdmFsdWVfaGFuZGxlKQotICAgIExPRyhXQVJOSU5HKSA8PCAiUmVtb3RlIGRldmljZSB2aW9sYXRlcyBzcGVjOiB2YWx1ZV9oYW5kbGU9IgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgodmFsdWVfaGFuZGxlKSA8PCAiIGlzIGFmdGVyIHNlcnZpY2UgZW5kX2hhbmRsZT0iCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChzZXJ2aWNlLT5lbmRfaGFuZGxlKTsKLQotICBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MuZW1wbGFjZV9iYWNrKENoYXJhY3RlcmlzdGljewotICAgICAgLmRlY2xhcmF0aW9uX2hhbmRsZSA9IGhhbmRsZSwKLSAgICAgIC51dWlkID0gdXVpZCwKLSAgICAgIC52YWx1ZV9oYW5kbGUgPSB2YWx1ZV9oYW5kbGUsCi0gICAgICAucHJvcGVydGllcyA9IHByb3BlcnRpZXMsCi0gIH0pOwotICByZXR1cm47Ci19Ci0KLXZvaWQgRGF0YWJhc2VCdWlsZGVyOjpBZGREZXNjcmlwdG9yKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgVXVpZCYgdXVpZCkgewotICBTZXJ2aWNlKiBzZXJ2aWNlID0gRmluZFNlcnZpY2UoZGF0YWJhc2Uuc2VydmljZXMsIGhhbmRsZSk7Ci0gIGlmICghc2VydmljZSkgewotICAgIExPRyhFUlJPUikgPDwgIklsbGVnYWwgYWN0aW9uIHRvIGFkZCB0byBub24tZXhpc3Rpbmcgc2VydmljZSEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MuZW1wdHkoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IElsbGVnYWwgYWN0aW9uIHRvIGFkZCB0byBub24tZXhpc3RpbmcgY2hhcmFjdGVyaXN0aWMhIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDaGFyYWN0ZXJpc3RpYyogY2hhcl9ub2RlID0gJnNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcy5mcm9udCgpOwotICBmb3IgKGF1dG8gaXQgPSBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MuZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoaXQtPmRlY2xhcmF0aW9uX2hhbmRsZSA+IGhhbmRsZSkgYnJlYWs7Ci0gICAgY2hhcl9ub2RlID0gJigqaXQpOwotICB9Ci0KLSAgY2hhcl9ub2RlLT5kZXNjcmlwdG9ycy5lbXBsYWNlX2JhY2soCi0gICAgICBnYXR0OjpEZXNjcmlwdG9yey5oYW5kbGUgPSBoYW5kbGUsIC51dWlkID0gdXVpZH0pOwotCi0gIC8vIFdlIG11c3QgcmVhZCB2YWx1ZSBmb3IgQ2hhcmFjdGVyaXN0aWMgRXh0ZW5kZWQgUHJvcGVydGllcwotICBpZiAodXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfRVhUX1BST1ApKSB7Ci0gICAgZGVzY3JpcHRvcl9oYW5kbGVzX3RvX3JlYWQuZW1wbGFjZV9iYWNrKGhhbmRsZSk7Ci0gIH0KLX0KLQotYm9vbCBEYXRhYmFzZUJ1aWxkZXI6OlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpIHsKLSAgd2hpbGUgKCFzZXJ2aWNlc190b19kaXNjb3Zlci5lbXB0eSgpKSB7Ci0gICAgYXV0byBoYW5kbGVfcmFuZ2UgPSBzZXJ2aWNlc190b19kaXNjb3Zlci5iZWdpbigpOwotICAgIHBlbmRpbmdfc2VydmljZSA9ICpoYW5kbGVfcmFuZ2U7Ci0gICAgc2VydmljZXNfdG9fZGlzY292ZXIuZXJhc2UoaGFuZGxlX3JhbmdlKTsKLQotICAgIC8vIEVtcHR5IHNlcnZpY2UgZGVjbGFyYXRpb24sIG5vdGhpbmcgdG8gZXhwbG9yZSwgc2tpcCB0byBuZXh0LgotICAgIGlmIChwZW5kaW5nX3NlcnZpY2UuZmlyc3QgPT0gcGVuZGluZ19zZXJ2aWNlLnNlY29uZCkgY29udGludWU7Ci0KLSAgICBwZW5kaW5nX2NoYXJhY3RlcmlzdGljID0gSEFORExFX01JTjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+JgotRGF0YWJhc2VCdWlsZGVyOjpDdXJyZW50bHlFeHBsb3JlZFNlcnZpY2UoKSB7Ci0gIHJldHVybiBwZW5kaW5nX3NlcnZpY2U7Ci19Ci0KLXN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+IERhdGFiYXNlQnVpbGRlcjo6TmV4dERlc2NyaXB0b3JSYW5nZVRvRXhwbG9yZSgpIHsKLSAgU2VydmljZSogc2VydmljZSA9IEZpbmRTZXJ2aWNlKGRhdGFiYXNlLnNlcnZpY2VzLCBwZW5kaW5nX3NlcnZpY2UuZmlyc3QpOwotICBpZiAoIXNlcnZpY2UgfHwgc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzLmVtcHR5KCkpIHsKLSAgICByZXR1cm4ge0hBTkRMRV9NQVgsIEhBTkRMRV9NQVh9OwotICB9Ci0KLSAgZm9yIChhdXRvIGl0ID0gc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzLmNiZWdpbigpOwotICAgICAgIGl0ICE9IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcy5jZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoaXQtPmRlY2xhcmF0aW9uX2hhbmRsZSA+IHBlbmRpbmdfY2hhcmFjdGVyaXN0aWMpIHsKLSAgICAgIGF1dG8gbmV4dCA9IHN0ZDo6bmV4dChpdCk7Ci0KLSAgICAgIC8qIENoYXJhY3RlcmlzdGljIERlY2xhcmF0aW9uIGlzIGZvbGxvd2VkIGJ5IENoYXJhY3RlcmlzdGljIFZhbHVlCi0gICAgICAgKiBEZWNsYXJhdGlvbiwgZmlyc3QgZGVzY3JpcHRvciBpcyBhZnRlciB0aGF0LCBzZWUgQlQgU3BlY3QgNS4wIFZvbCAzLAotICAgICAgICogUGFydCBHIDMuMy4yIGFuZCAzLjMuMyAqLwotICAgICAgdWludDE2X3Qgc3RhcnQgPSBpdC0+ZGVjbGFyYXRpb25faGFuZGxlICsgMjsKLSAgICAgIHVpbnQxNl90IGVuZDsKLSAgICAgIGlmIChuZXh0ICE9IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcy5lbmQoKSkKLSAgICAgICAgZW5kID0gbmV4dC0+ZGVjbGFyYXRpb25faGFuZGxlIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgZW5kID0gc2VydmljZS0+ZW5kX2hhbmRsZTsKLQotICAgICAgLy8gTm8gcGxhY2UgZm9yIGRlc2NyaXB0b3IgLSBza2lwIHRvIG5leHQgY2hhcmFjdGVyaXN0aWMKLSAgICAgIGlmIChzdGFydCA+IGVuZCkgY29udGludWU7Ci0KLSAgICAgIHBlbmRpbmdfY2hhcmFjdGVyaXN0aWMgPSBzdGFydDsKLSAgICAgIHJldHVybiB7c3RhcnQsIGVuZH07Ci0gICAgfQotICB9Ci0KLSAgcGVuZGluZ19jaGFyYWN0ZXJpc3RpYyA9IEhBTkRMRV9NQVg7Ci0gIHJldHVybiB7SEFORExFX01BWCwgSEFORExFX01BWH07Ci19Ci0KLURlc2NyaXB0b3IqIEZpbmREZXNjcmlwdG9yQnlIYW5kbGUoc3RkOjpsaXN0PFNlcnZpY2U+JiBzZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIFNlcnZpY2UqIHNlcnZpY2UgPSBGaW5kU2VydmljZShzZXJ2aWNlcywgaGFuZGxlKTsKLSAgaWYgKCFzZXJ2aWNlKSByZXR1cm4gbnVsbHB0cjsKLQotICBDaGFyYWN0ZXJpc3RpYyogY2hhcl9ub2RlID0gJnNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcy5mcm9udCgpOwotICBmb3IgKGF1dG8gaXQgPSBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MuZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoaXQtPmRlY2xhcmF0aW9uX2hhbmRsZSA+IGhhbmRsZSkgYnJlYWs7Ci0gICAgY2hhcl9ub2RlID0gJigqaXQpOwotICB9Ci0KLSAgZm9yIChhdXRvJiBkZXNjcmlwdG9yIDogY2hhcl9ub2RlLT5kZXNjcmlwdG9ycykgewotICAgIGlmIChkZXNjcmlwdG9yLmhhbmRsZSA9PSBoYW5kbGUpIHJldHVybiAmZGVzY3JpcHRvcjsKLSAgfQotCi0gIHJldHVybiBudWxscHRyOwotfQotCi1ib29sIERhdGFiYXNlQnVpbGRlcjo6U2V0VmFsdWVPZkRlc2NyaXB0b3JzKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgdmFsdWVzKSB7Ci0gIGlmICh2YWx1ZXMuc2l6ZSgpID4gZGVzY3JpcHRvcl9oYW5kbGVzX3RvX3JlYWQuc2l6ZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAidmFsdWVzLnNpemUoKSA8PSBkZXNjcmlwdG9ycy5zaXplKCkgZXhwZWN0ZWQiOwotICAgIGRlc2NyaXB0b3JfaGFuZGxlc190b19yZWFkLmNsZWFyKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBEZXNjcmlwdG9yKiBkID0gRmluZERlc2NyaXB0b3JCeUhhbmRsZShkYXRhYmFzZS5zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2hhbmRsZXNfdG9fcmVhZFtpXSk7Ci0gICAgaWYgKCFkKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJub24tZXhpc3RpbmcgZGVzY3JpcHRvciEiOwotICAgICAgZGVzY3JpcHRvcl9oYW5kbGVzX3RvX3JlYWQuY2xlYXIoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBkLT5jaGFyYWN0ZXJpc3RpY19leHRlbmRlZF9wcm9wZXJ0aWVzID0gdmFsdWVzW2ldOwotICB9Ci0KLSAgZGVzY3JpcHRvcl9oYW5kbGVzX3RvX3JlYWQuZXJhc2UoCi0gICAgICBkZXNjcmlwdG9yX2hhbmRsZXNfdG9fcmVhZC5iZWdpbigpLAotICAgICAgZGVzY3JpcHRvcl9oYW5kbGVzX3RvX3JlYWQuYmVnaW4oKSArIHZhbHVlcy5zaXplKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhYmFzZUJ1aWxkZXI6OkluUHJvZ3Jlc3MoKSBjb25zdCB7IHJldHVybiAhZGF0YWJhc2Uuc2VydmljZXMuZW1wdHkoKTsgfQotCi1EYXRhYmFzZSBEYXRhYmFzZUJ1aWxkZXI6OkJ1aWxkKCkgewotICBEYXRhYmFzZSB0bXAgPSBkYXRhYmFzZTsKLSAgZGF0YWJhc2UuQ2xlYXIoKTsKLSAgcmV0dXJuIHRtcDsKLX0KLQotdm9pZCBEYXRhYmFzZUJ1aWxkZXI6OkNsZWFyKCkgeyBkYXRhYmFzZS5DbGVhcigpOyB9Ci0KLXN0ZDo6c3RyaW5nIERhdGFiYXNlQnVpbGRlcjo6VG9TdHJpbmcoKSBjb25zdCB7IHJldHVybiBkYXRhYmFzZS5Ub1N0cmluZygpOyB9Ci0KLX0gIC8vIG5hbWVzcGFjZSBnYXR0CmRpZmYgLS1naXQgYS9idGEvZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmggYi9idGEvZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzM2IyZTcuLjAwMDAwMDAKLS0tIGEvYnRhL2dhdHQvZGF0YWJhc2VfYnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiYnRhL2dhdHQvZGF0YWJhc2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi1uYW1lc3BhY2UgZ2F0dCB7Ci0KLWNsYXNzIERhdGFiYXNlQnVpbGRlciB7Ci0gcHVibGljOgotICBjb25zdGV4cHIgc3RhdGljIHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+IEVYUExPUkVfRU5EID0KLSAgICAgIHN0ZDo6bWFrZV9wYWlyKDB4RkZGRiwgMHhGRkZGKTsKLQotICB2b2lkIEFkZFNlcnZpY2UodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLCBib29sIGlzX3ByaW1hcnkpOwotICB2b2lkIEFkZEluY2x1ZGVkU2VydmljZSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlKTsKLSAgdm9pZCBBZGRDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsIHVpbnQ4X3QgcHJvcGVydGllcyk7Ci0gIHZvaWQgQWRkRGVzY3JpcHRvcih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCk7Ci0KLSAgLyogUmV0dXJucyB0cnVlIGlmIG5leHQgc2VydmljZSBleHBsb3JhdGlvbiBzdGFydGVkLCBmYWxzZSBpZiB0aGVyZSBhcmUgbm8KLSAgICogbW9yZSBzZXJ2aWNlcyB0byBleHBsb3JlLiAqLwotICBib29sIFN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpOwotCi0gIC8qIFJldHVybiBwYWlyIHdpdGggc3RhcnQgYW5kIGVuZCBoYW5kbGUgb2YgdGhlIGN1cnJlbnRseSBleHBsb3JlZCBzZXJ2aWNlLgotICAgKi8KLSAgY29uc3Qgc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4mIEN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpOwotCi0gIC8qIFJldHVybiBwYWlyIHdpdGggc3RhcnQgYW5kIGVuZCBoYW5kbGUgb2YgdGhlIGRlc2NyaXB0b3IgcmFuZ2UgdG8gZGlzY292ZXIsCi0gICAqIG9yIERhdGFiYXNlQnVpbGRlcjo6RVhQTE9SRV9FTkQgaWYgbm8gbW9yZSBkZXNjcmlwdG9ycyBsZWZ0LgotICAgKi8KLSAgc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4gTmV4dERlc2NyaXB0b3JSYW5nZVRvRXhwbG9yZSgpOwotCi0gIC8qIFJldHVybiB2ZWN0b3Igb2YgIkNoYXJhY3RlcmlzdGljIEV4dGVuZGVkIFByb3BlcnRpZXMiIGRlc2NyaXB0b3JzIHRoYXQgbXVzdAotICAgKiBiZSByZWFkIGFzIHBhcnQgb2Ygc2VydmljZSBkaXNjb3ZlcnkgcHJvY2VzcyAqLwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gRGVzY3JpcHRvckhhbmRsZXNUb1JlYWQoKSB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0b3JfaGFuZGxlc190b19yZWFkOwotICB9Ci0KLSAgLyogQXNzaWduIHZhbHVlIHRvIGRlc2NyaXB0b3JzIGZyb20gfERlc2NyaXB0b3JIYW5kbGVzVG9SZWFkKCl8LiBWYWx1ZXMgbXVzdAotICAgKiBiZSBpbiBzYW1lIG9yZGVyLiBSZXR1cm5zIHx0cnVlfCBpZiBhbGwgZ29lcyB3ZWxsLCB8ZmFsc2V8IGlmIHRoZXJlIGlzCi0gICAqIHByb2JsZW0gbWFwcGluZyB2YWx1ZXMgdG8gZGVzY3JpcHRvcnMuICovCi0gIGJvb2wgU2V0VmFsdWVPZkRlc2NyaXB0b3JzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgdmFsdWVzKTsKLQotICAvKiBSZXR1cm5zIHRydWUsIGlmIEdBVFQgZGlzY292ZXJ5IGlzIGluIHByb2dyZXNzLCBmYWxzZSBpZiBkaXNjb3Zlcnkgd2FzIG5vdAotICAgKiBzdGFydGVkLCBvciBpcyBhbHJlYWR5IGZpbmlzaGVkLgotICAgKi8KLSAgLy8gVE9ETyhqcGF3bG93c2tpKTogaW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgY3JlYXRlIHRoaXMgb2JqZWN0IG9ubHkgZm9yIHRoZQotICAvLyB0aW1lIG9mIGRpc2NvdmVyeSwgaW4gc3VjaCBjYXNlIEluUHJvZ3Jlc3Mgd29uJ3QgYmUgbmVlZGVkLCBiZWNhdXNlIG9iamVjdAotICAvLyBleGlzdGVuY2Ugd2lsbCBtZWFuIGRpc2NvdmVyeSBpcyBwZW5kaW5nCi0gIGJvb2wgSW5Qcm9ncmVzcygpIGNvbnN0OwotCi0gIC8qIENhbGwgdGhpcyBtZXRob2QgYXQgZW5kIG9mIEdBVFQgZGlzY292ZXJ5LCB0byBvYnRhaW4gb2JqZWN0IHJlcHJlc2VudGluZwotICAgKiB0aGUgZGF0YWJhc2Ugb2YgcmVtb3RlIGRldmljZSAqLwotICBEYXRhYmFzZSBCdWlsZCgpOwotCi0gIHZvaWQgQ2xlYXIoKTsKLQotICAvKiBSZXR1cm4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBpbnRlcm5hbCBzdGF0ZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBEYXRhYmFzZSBkYXRhYmFzZTsKLSAgLyogU3RhcnQgYW5kIGVuZCBoYW5kbGUgb2Ygc2VydmljZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBkaXNjb3ZlcmVkIG9uIHRoZQotICAgKiByZW1vdGUgZGV2aWNlICovCi0gIHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+IHBlbmRpbmdfc2VydmljZTsKLSAgLyogQ2hhcmFjdGVyaXN0aWMgaW5zaWRlIHBlbmRpbmdfc2VydmljZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBleHBsb3JlZCAqLwotICB1aW50MTZfdCBwZW5kaW5nX2NoYXJhY3RlcmlzdGljOwotCi0gIC8qIHNvcnRlZCwgdW5pcXVlIHNldCBvZiBzdGFydF9oYW5kbGUsIGVuZF9oYW5kbGUgcGFpciBvZiBhbGwgc2VydmljZXMgdGhhdAotICAgKiBoYXZlIG5vdCB5ZXQgYmVlbiBkaXNjb3ZlcmVkICovCi0gIHN0ZDo6c2V0PHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiBzZXJ2aWNlc190b19kaXNjb3ZlcjsKLQotICAvKiBoYW5kbGVzIG9mICJDaGFyYWN0ZXJpc3RpYyBFeHRlbmRlZCBQcm9wZXJ0aWVzIiBkZXNjcmlwdG9ycyB0aGF0IG11c3QgYmUKLSAgICogcmVhZCBhcyBwYXJ0IG9mIHNlcnZpY2UgZGlzY292ZXJ5IHByb2Nlc3MgKi8KLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGRlc2NyaXB0b3JfaGFuZGxlc190b19yZWFkOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGdhdHQKZGlmZiAtLWdpdCBhL2J0YS9ncm91cHMvZ3JvdXBzLmNjIGIvYnRhL2dyb3Vwcy9ncm91cHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjY4MjEuLjAwMDAwMDAKLS0tIGEvYnRhL2dyb3Vwcy9ncm91cHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJ0YV9ncm91cHMuaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBncm91cHMgewotCi1jbGFzcyBEZXZpY2VHcm91cHNJbXBsOwotRGV2aWNlR3JvdXBzSW1wbCogaW5zdGFuY2U7Ci1zdGF0aWMgY29uc3RleHByIGludCBrTWF4R3JvdXBJZCA9IDB4RUY7Ci0KLWNsYXNzIERldmljZUdyb3VwIHsKLSBwdWJsaWM6Ci0gIERldmljZUdyb3VwKGludCBncm91cF9pZCwgVXVpZCB1dWlkKQotICAgICAgOiBncm91cF9pZF8oZ3JvdXBfaWQpLCBncm91cF91dWlkXyh1dWlkKSB7fQotICB2b2lkIEFkZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7IGRldmljZXNfLmluc2VydChhZGRyKTsgfQotICB2b2lkIFJlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7IGRldmljZXNfLmVyYXNlKGFkZHIpOyB9Ci0gIGJvb2wgQ29udGFpbnMoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgY29uc3QgewotICAgIHJldHVybiAoZGV2aWNlc18uY291bnQoYWRkcikgIT0gMCk7Ci0gIH0KLQotICB2b2lkIEZvckVhY2hEZXZpY2Uoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmKT4gY2IpIGNvbnN0IHsKLSAgICBmb3IgKGF1dG8gY29uc3QmIGFkZHIgOiBkZXZpY2VzXykgewotICAgICAgY2IoYWRkcik7Ci0gICAgfQotICB9Ci0KLSAgaW50IFNpemUodm9pZCkgY29uc3QgeyByZXR1cm4gZGV2aWNlc18uc2l6ZSgpOyB9Ci0gIGludCBHZXRHcm91cElkKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGdyb3VwX2lkXzsgfQotICBjb25zdCBVdWlkJiBHZXRVdWlkKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGdyb3VwX3V1aWRfOyB9Ci0KLSBwcml2YXRlOgotICBpbnQgZ3JvdXBfaWRfOwotICBVdWlkIGdyb3VwX3V1aWRfOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8UmF3QWRkcmVzcz4gZGV2aWNlc187Ci19OwotCi1jbGFzcyBEZXZpY2VHcm91cHNJbXBsIDogcHVibGljIERldmljZUdyb3VwcyB7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBHUk9VUF9TVE9SQUdFX0NVUlJFTlRfTEFZT1VUX01BR0lDID0gMHgxMDsKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgR1JPVVBfU1RPUkFHRV9IRUFERVJfU1ogPQotICAgICAgc2l6ZW9mKEdST1VQX1NUT1JBR0VfQ1VSUkVOVF9MQVlPVVRfTUFHSUMpICsKLSAgICAgIHNpemVvZih1aW50OF90KTsgLyogbnVtX29mX2dyb3VwcyAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBHUk9VUF9TVE9SQUdFX0VOVFJZX1NaID0KLSAgICAgIHNpemVvZih1aW50OF90KSAvKiBncm91cF9pZCAqLyArIFV1aWQ6OmtOdW1CeXRlczEyODsKLQotIHB1YmxpYzoKLSAgRGV2aWNlR3JvdXBzSW1wbChEZXZpY2VHcm91cHNDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIEFkZENhbGxiYWNrcyhjYWxsYmFja3MpOwotICAgIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9ncm91cHMoKTsKLSAgfQotCi0gIGludCBHZXRHcm91cElkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIFV1aWQgdXVpZCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIGZvciAoY29uc3QgYXV0byYgW2lkLCBnXSA6IGdyb3Vwc18pIHsKLSAgICAgIGlmICgoZy5Db250YWlucyhhZGRyKSkgJiYgKHV1aWQgPT0gZy5HZXRVdWlkKCkpKSByZXR1cm4gaWQ7Ci0gICAgfQotICAgIHJldHVybiBrR3JvdXBVbmtub3duOwotICB9Ci0KLSAgdm9pZCBhZGRfdG9fZ3JvdXAoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgZ3JvdXAtPkFkZChhZGRyKTsKLQotICAgIGJvb2wgZmlyc3RfZGV2aWNlX2luX2dyb3VwID0gKGdyb3VwLT5TaXplKCkgPT0gMSk7Ci0KLSAgICBmb3IgKGF1dG8gYyA6IGNhbGxiYWNrc18pIHsKLSAgICAgIGlmIChmaXJzdF9kZXZpY2VfaW5fZ3JvdXApIHsKLSAgICAgICAgYy0+T25Hcm91cEFkZGVkKGFkZHIsIGdyb3VwLT5HZXRVdWlkKCksIGdyb3VwLT5HZXRHcm91cElkKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYy0+T25Hcm91cE1lbWJlckFkZGVkKGFkZHIsIGdyb3VwLT5HZXRHcm91cElkKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGludCBBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgVXVpZCB1dWlkLCBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBEZXZpY2VHcm91cCogZ3JvdXAgPSBudWxscHRyOwotCi0gICAgaWYgKGdyb3VwX2lkID09IGtHcm91cFVua25vd24pIHsKLSAgICAgIGF1dG8gZ2lkID0gR2V0R3JvdXBJZChhZGRyLCB1dWlkKTsKLSAgICAgIGlmIChnaWQgIT0ga0dyb3VwVW5rbm93bikgcmV0dXJuIGdpZDsKLSAgICAgIGdyb3VwID0gY3JlYXRlX2dyb3VwKHV1aWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncm91cCA9IGdldF9vcl9jcmVhdGVfZ3JvdXBfd2l0aF9pZChncm91cF9pZCwgdXVpZCk7Ci0gICAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICAgIHJldHVybiBrR3JvdXBVbmtub3duOwotICAgICAgfQotICAgIH0KLQotICAgIExPR19BU1NFUlQoZ3JvdXApOwotCi0gICAgaWYgKGdyb3VwLT5Db250YWlucyhhZGRyKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZSAiIDw8IGFkZHIKLSAgICAgICAgICAgICAgICAgPDwgIiBhbHJlYWR5IGluIHRoZSBncm91cDogIiA8PCBncm91cF9pZDsKLSAgICAgIHJldHVybiBncm91cC0+R2V0R3JvdXBJZCgpOwotICAgIH0KLQotICAgIGFkZF90b19ncm91cChhZGRyLCBncm91cCk7Ci0KLSAgICBidGlmX3N0b3JhZ2VfYWRkX2dyb3VwcyhhZGRyKTsKLSAgICByZXR1cm4gZ3JvdXAtPkdldEdyb3VwSWQoKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGludCBncm91cF9pZCkgb3ZlcnJpZGUgewotICAgIGludCBudW1fb2ZfZ3JvdXBzX2Rldl9iZWxvbmdzID0gMDsKLQotICAgIC8qIFJlbW92ZSBmcm9tIGFsbCB0aGUgZ3JvdXBzLiBVc3VhbGx5IGhhcHBlbnMgb24gdW5ib25kICovCi0gICAgZm9yIChhdXRvIGl0ID0gZ3JvdXBzXy5iZWdpbigpOyBpdCAhPSBncm91cHNfLmVuZCgpOykgewotICAgICAgYXV0byYgW2lkLCBnXSA9ICppdDsKLSAgICAgIGlmICghZy5Db250YWlucyhhZGRyKSkgewotICAgICAgICArK2l0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgbnVtX29mX2dyb3Vwc19kZXZfYmVsb25ncysrOwotCi0gICAgICBpZiAoKGdyb3VwX2lkICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSAmJiAoZ3JvdXBfaWQgIT0gaWQpKSB7Ci0gICAgICAgICsraXQ7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBudW1fb2ZfZ3JvdXBzX2Rldl9iZWxvbmdzLS07Ci0KLSAgICAgIGcuUmVtb3ZlKGFkZHIpOwotICAgICAgZm9yIChhdXRvIGMgOiBjYWxsYmFja3NfKSB7Ci0gICAgICAgIGMtPk9uR3JvdXBNZW1iZXJSZW1vdmVkKGFkZHIsIGlkKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGcuU2l6ZSgpID09IDApIHsKLSAgICAgICAgZm9yIChhdXRvIGMgOiBjYWxsYmFja3NfKSB7Ci0gICAgICAgICAgYy0+T25Hcm91cFJlbW92ZWQoZy5HZXRVdWlkKCksIGcuR2V0R3JvdXBJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBpdCA9IGdyb3Vwc18uZXJhc2UoaXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKytpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBidGlmX3N0b3JhZ2VfcmVtb3ZlX2dyb3VwcyhhZGRyKTsKLSAgICBpZiAobnVtX29mX2dyb3Vwc19kZXZfYmVsb25ncyA+IDApIHsKLSAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfZ3JvdXBzKGFkZHIpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgU2VyaWFsaXplR3JvdXBzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBvdXQpIGNvbnN0IHsKLSAgICBhdXRvIG51bV9ncm91cHMgPSBzdGQ6OmNvdW50X2lmKAotICAgICAgICBncm91cHNfLmJlZ2luKCksIGdyb3Vwc18uZW5kKCksIFsmYWRkcl0oYXV0byYgaWRfZ3JvdXBfcGFpcikgewotICAgICAgICAgIHJldHVybiBpZF9ncm91cF9wYWlyLnNlY29uZC5Db250YWlucyhhZGRyKTsKLSAgICAgICAgfSk7Ci0gICAgaWYgKChudW1fZ3JvdXBzID09IDApIHx8IChudW1fZ3JvdXBzID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgb3V0LnJlc2l6ZShHUk9VUF9TVE9SQUdFX0hFQURFUl9TWiArIChudW1fZ3JvdXBzICogR1JPVVBfU1RPUkFHRV9FTlRSWV9TWikpOwotICAgIGF1dG8qIHB0ciA9IG91dC5kYXRhKCk7Ci0KLSAgICAvKiBoZWFkZXIgKi8KLSAgICBVSU5UOF9UT19TVFJFQU0ocHRyLCBHUk9VUF9TVE9SQUdFX0NVUlJFTlRfTEFZT1VUX01BR0lDKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHRyLCBudW1fZ3JvdXBzKTsKLQotICAgIC8qIGdyb3VwIGVudHJpZXMgKi8KLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtpZCwgZ10gOiBncm91cHNfKSB7Ci0gICAgICBpZiAoZy5Db250YWlucyhhZGRyKSkgewotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocHRyLCBpZCk7Ci0KLSAgICAgICAgVXVpZDo6VVVJRDEyOEJpdCB1dWlkMTI4ID0gZy5HZXRVdWlkKCkuVG8xMjhCaXRMRSgpOwotICAgICAgICBtZW1jcHkocHRyLCB1dWlkMTI4LmRhdGEoKSwgVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICAgICAgcHRyICs9IFV1aWQ6OmtOdW1CeXRlczEyODsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgRGVzZXJpYWxpemVHcm91cHMoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW4pIHsKLSAgICBpZiAoaW4uc2l6ZSgpIDwgR1JPVVBfU1RPUkFHRV9IRUFERVJfU1ogKyBHUk9VUF9TVE9SQUdFX0VOVFJZX1NaKSByZXR1cm47Ci0KLSAgICBhdXRvKiBwdHIgPSBpbi5kYXRhKCk7Ci0KLSAgICB1aW50OF90IG1hZ2ljOwotICAgIFNUUkVBTV9UT19VSU5UOChtYWdpYywgcHRyKTsKLQotICAgIGlmIChtYWdpYyA9PSBHUk9VUF9TVE9SQUdFX0NVUlJFTlRfTEFZT1VUX01BR0lDKSB7Ci0gICAgICB1aW50OF90IG51bV9ncm91cHM7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgobnVtX2dyb3VwcywgcHRyKTsKLQotICAgICAgaWYgKGluLnNpemUoKSA8Ci0gICAgICAgICAgR1JPVVBfU1RPUkFHRV9IRUFERVJfU1ogKyAobnVtX2dyb3VwcyAqIEdST1VQX1NUT1JBR0VfRU5UUllfU1opKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcGVyc2lzdGVudCBzdG9yYWdlIGRhdGEiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIGdyb3VwIGVudHJpZXMgKi8KLSAgICAgIHdoaWxlIChudW1fZ3JvdXBzLS0pIHsKLSAgICAgICAgdWludDhfdCBpZDsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGlkLCBwdHIpOwotCi0gICAgICAgIFV1aWQ6OlVVSUQxMjhCaXQgdXVpZDEyODsKLSAgICAgICAgU1RSRUFNX1RPX0FSUkFZKHV1aWQxMjguZGF0YSgpLCBwdHIsIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLQotICAgICAgICBhdXRvKiBncm91cCA9Ci0gICAgICAgICAgICBnZXRfb3JfY3JlYXRlX2dyb3VwX3dpdGhfaWQoaWQsIFV1aWQ6OkZyb20xMjhCaXRMRSh1dWlkMTI4KSk7Ci0gICAgICAgIGlmIChncm91cCkgYWRkX3RvX2dyb3VwKGFkZHIsIGdyb3VwKTsKLQotICAgICAgICBmb3IgKGF1dG8gYyA6IGNhbGxiYWNrc18pIHsKLSAgICAgICAgICBjLT5Pbkdyb3VwQWRkRnJvbVN0b3JhZ2UoYWRkciwgVXVpZDo6RnJvbTEyOEJpdExFKHV1aWQxMjgpLCBpZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIEFkZENhbGxiYWNrcyhEZXZpY2VHcm91cHNDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIGNhbGxiYWNrc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShjYWxsYmFja3MpKTsKLQotICAgIC8qIE5vdGlmeSBuZXcgdXNlciBhYm91dCBrbm93biBncm91cHMgKi8KLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtpZCwgZ10gOiBncm91cHNfKSB7Ci0gICAgICBhdXRvIGdyb3VwX3V1aWQgPSBnLkdldFV1aWQoKTsKLSAgICAgIGF1dG8gZ3JvdXBfaWQgPSBnLkdldEdyb3VwSWQoKTsKLSAgICAgIGcuRm9yRWFjaERldmljZShbJl0oYXV0byYgZGV2KSB7Ci0gICAgICAgIGNhbGxiYWNrcy0+T25Hcm91cEFkZGVkKGRldiwgZ3JvdXBfdXVpZCwgZ3JvdXBfaWQpOwotICAgICAgfSk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBDbGVhcihEZXZpY2VHcm91cHNDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIGF1dG8gaXQgPSBmaW5kX2lmKGNhbGxiYWNrc18uYmVnaW4oKSwgY2FsbGJhY2tzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBbY2FsbGJhY2tzXShhdXRvIGMpIHsgcmV0dXJuIGMgPT0gY2FsbGJhY2tzOyB9KTsKLQotICAgIGlmIChpdCAhPSBjYWxsYmFja3NfLmVuZCgpKSBjYWxsYmFja3NfLmVyYXNlKGl0KTsKLQotICAgIGlmIChjYWxsYmFja3NfLnNpemUoKSAhPSAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8qIFdoZW4gYWxsIGNsaWVudHMgd2VyZSB1bnJlZ2lzdGVyZWQgKi8KLSAgICBncm91cHNfLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIERldmljZUdyb3VwKiBmaW5kX2RldmljZV9ncm91cChpbnQgZ3JvdXBfaWQpIHsKLSAgICByZXR1cm4gZ3JvdXBzXy5jb3VudChncm91cF9pZCkgPyAmZ3JvdXBzXy5hdChncm91cF9pZCkgOiBudWxscHRyOwotICB9Ci0KLSAgRGV2aWNlR3JvdXAqIGdldF9vcl9jcmVhdGVfZ3JvdXBfd2l0aF9pZChpbnQgZ3JvdXBfaWQsIFV1aWQgdXVpZCkgewotICAgIGF1dG8gZ3JvdXAgPSBmaW5kX2RldmljZV9ncm91cChncm91cF9pZCk7Ci0gICAgaWYgKGdyb3VwKSB7Ci0gICAgICBpZiAoZ3JvdXAtPkdldFV1aWQoKSAhPSB1dWlkKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBncm91cCAiIDw8IGdyb3VwX2lkCi0gICAgICAgICAgICAgICAgICAgPDwgIiBleGlzdHMgYnV0IGZvciBkaWZmZXJlbnQgdXVpZDogIiA8PCBncm91cC0+R2V0VXVpZCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgdXNlciByZXF1ZXN0IHV1aWQ6ICIgPDwgdXVpZDsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdyb3VwIGFscmVhZHkgZXhpc3RzOiAiIDw8IGdyb3VwX2lkOwotICAgICAgcmV0dXJuIGdyb3VwOwotICAgIH0KLQotICAgIERldmljZUdyb3VwIG5ld19ncm91cChncm91cF9pZCwgdXVpZCk7Ci0gICAgZ3JvdXBzXy5pbnNlcnQoe2dyb3VwX2lkLCBzdGQ6Om1vdmUobmV3X2dyb3VwKX0pOwotCi0gICAgcmV0dXJuICZncm91cHNfLmF0KGdyb3VwX2lkKTsKLSAgfQotCi0gIERldmljZUdyb3VwKiBjcmVhdGVfZ3JvdXAoVXVpZCYgdXVpZCkgewotICAgIC8qIEdlbmVyYXRlIG5ldyBncm91cCBpZCBhbmQgcmV0dXJuIGVtcHR5IGdyb3VwICovCi0gICAgLyogRmluZCBmaXJzdCBmcmVlIGlkICovCi0KLSAgICBpbnQgZ3JvdXBfaWQgPSAtMTsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGtNYXhHcm91cElkOyBpKyspIHsKLSAgICAgIGlmIChncm91cHNfLmNvdW50KGkpID09IDApIHsKLSAgICAgICAgZ3JvdXBfaWQgPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXBfaWQgPCAwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgdG9vIG1hbnkgZ3JvdXBzIjsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIERldmljZUdyb3VwIGdyb3VwKGdyb3VwX2lkLCB1dWlkKTsKLSAgICBncm91cHNfLmluc2VydCh7Z3JvdXBfaWQsIHN0ZDo6bW92ZShncm91cCl9KTsKLQotICAgIHJldHVybiAmZ3JvdXBzXy5hdChncm91cF9pZCk7Ci0gIH0KLQotICBzdGQ6Om1hcDxpbnQsIERldmljZUdyb3VwPiBncm91cHNfOwotICBzdGQ6Omxpc3Q8RGV2aWNlR3JvdXBzQ2FsbGJhY2tzKj4gY2FsbGJhY2tzXzsKLX07Ci0KLXZvaWQgRGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKERldmljZUdyb3Vwc0NhbGxiYWNrcyogY2FsbGJhY2tzKSB7Ci0gIGlmIChpbnN0YW5jZSA9PSBudWxscHRyKSB7Ci0gICAgaW5zdGFuY2UgPSBuZXcgRGV2aWNlR3JvdXBzSW1wbChjYWxsYmFja3MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluc3RhbmNlLT5BZGRDYWxsYmFja3MoY2FsbGJhY2tzKTsKLX0KLQotdm9pZCBEZXZpY2VHcm91cHM6OkFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluKSB7Ci0gIGlmICghaW5zdGFuY2UpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vdCBpbml0aWFsaXplZCB5ZXQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluc3RhbmNlLT5EZXNlcmlhbGl6ZUdyb3VwcyhhZGRyLCBpbik7Ci19Ci0KLWJvb2wgRGV2aWNlR3JvdXBzOjpHZXRGb3JTdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb3V0KSB7Ci0gIGlmICghaW5zdGFuY2UpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vdCBpbml0aWFsaXplZCB5ZXQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBpbnN0YW5jZS0+U2VyaWFsaXplR3JvdXBzKGFkZHIsIG91dCk7Ci19Ci0KLXZvaWQgRGV2aWNlR3JvdXBzOjpDbGVhblVwKERldmljZUdyb3Vwc0NhbGxiYWNrcyogY2FsbGJhY2tzKSB7Ci0gIGlmICghaW5zdGFuY2UpIHJldHVybjsKLQotICBpZiAoaW5zdGFuY2UtPkNsZWFyKGNhbGxiYWNrcykpIHsKLSAgICBkZWxldGUgKGluc3RhbmNlKTsKLSAgICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0gIH0KLX0KLURldmljZUdyb3VwcyogRGV2aWNlR3JvdXBzOjpHZXQoKSB7IHJldHVybiBpbnN0YW5jZTsgfQotCi19ICAvLyBuYW1lc3BhY2UgZ3JvdXBzCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9idGEvZ3JvdXBzL2dyb3Vwc190ZXN0LmNjIGIvYnRhL2dyb3Vwcy9ncm91cHNfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2NjI4NC4uMDAwMDAwMAotLS0gYS9idGEvZ3JvdXBzL2dyb3Vwc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJidGFfZ3JvdXBzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZ3JvdXBzIHsKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Ci0KLXVzaW5nIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHM7Ci11c2luZyBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzQ2FsbGJhY2tzOwotCi1EZXZpY2VHcm91cHNDYWxsYmFja3MqIGRldl9jYWxsYmFja3M7Ci0KLVJhd0FkZHJlc3MgR2V0VGVzdEFkZHJlc3MoaW50IGluZGV4KSB7Ci0gIENIRUNLX0xUKGluZGV4LCBVSU5UOF9NQVgpOwotICBSYXdBZGRyZXNzIHJlc3VsdCA9IHsKLSAgICAgIHsweEMwLCAweERFLCAweEMwLCAweERFLCAweDAwLCBzdGF0aWNfY2FzdDx1aW50OF90PihpbmRleCl9fTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY2xhc3MgTW9ja0dyb3Vwc0NhbGxiYWNrcyA6IHB1YmxpYyBEZXZpY2VHcm91cHNDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgTW9ja0dyb3Vwc0NhbGxiYWNrcygpID0gZGVmYXVsdDsKLSAgfk1vY2tHcm91cHNDYWxsYmFja3MoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkdyb3VwQWRkZWQsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkdyb3VwTWVtYmVyQWRkZWQsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQpLCAob3ZlcnJpZGUpKTsKLQotICBNT0NLX01FVEhPRCgodm9pZCksIE9uR3JvdXBSZW1vdmVkLAotICAgICAgICAgICAgICAoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLCBpbnQgZ3JvdXBfaWQpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkdyb3VwTWVtYmVyUmVtb3ZlZCwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBncm91cF9pZCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uR3JvdXBBZGRGcm9tU3RvcmFnZSwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgIGludCBncm91cF9pZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tHcm91cHNDYWxsYmFja3MpOwotfTsKLQotY2xhc3MgR3JvdXBzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcC5jbGVhcigpOwotICAgIGNhbGxiYWNrcy5yZXNldChuZXcgTW9ja0dyb3Vwc0NhbGxiYWNrcygpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOyB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPE1vY2tHcm91cHNDYWxsYmFja3M+IGNhbGxiYWNrczsKLX07Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X2luaXRpYWxpemUpIHsKLSAgRGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIEFTU0VSVF9UUlVFKERldmljZUdyb3Vwczo6R2V0KCkpOwotICBEZXZpY2VHcm91cHM6OkNsZWFuVXAoY2FsbGJhY2tzLmdldCgpKTsKLX0KLQotVEVTVF9GKEdyb3Vwc1Rlc3QsIHRlc3RfaW5pdGlhbGl6ZV90d2ljZSkgewotICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgRGV2aWNlR3JvdXBzKiBkZXZfZ3JvdXBzX3AgPSBEZXZpY2VHcm91cHM6OkdldCgpOwotICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgQVNTRVJUX0VRKGRldl9ncm91cHNfcCwgRGV2aWNlR3JvdXBzOjpHZXQoKSk7Ci0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotICBkZXZfZ3JvdXBzX3AtPkNsZWFuVXAoY2FsbGJhY2tzLmdldCgpKTsKLX0KLQotVEVTVF9GKEdyb3Vwc1Rlc3QsIHRlc3RfY2xlYW51cF9pbml0aWFsaXplZCkgewotICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIEFTU0VSVF9GQUxTRShEZXZpY2VHcm91cHM6OkdldCgpKTsKLX0KLQotVEVTVF9GKEdyb3Vwc1Rlc3QsIHRlc3RfY2xlYW51cF91bmluaXRpYWxpemVkKSB7Ci0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotICBBU1NFUlRfRkFMU0UoRGV2aWNlR3JvdXBzOjpHZXQoKSk7Ci19Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X2dyb3Vwc19hZGRfc2luZ2xlX2RldmljZSkgewotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwQWRkZWQoR2V0VGVzdEFkZHJlc3MoMSksIFV1aWQ6OmtFbXB0eSwgNykpOwotICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDEpLCBVdWlkOjprRW1wdHksIDcpOwotICBEZXZpY2VHcm91cHM6OkNsZWFuVXAoY2FsbGJhY2tzLmdldCgpKTsKLX0KLQotVEVTVF9GKEdyb3Vwc1Rlc3QsIHRlc3RfZ3JvdXBzX2FkZF90d29fZGV2aWNlcykgewotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwQWRkZWQoR2V0VGVzdEFkZHJlc3MoMSksIF8sIDcpKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Hcm91cE1lbWJlckFkZGVkKEdldFRlc3RBZGRyZXNzKDIpLCA3KSk7Ci0gIERldmljZUdyb3Vwczo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSksIFV1aWQ6OmtFbXB0eSwgNyk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygyKSwgVXVpZDo6a0VtcHR5LCA3KTsKLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X2dyb3Vwc19yZW1vdmVfZGV2aWNlKSB7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBNZW1iZXJSZW1vdmVkKEdldFRlc3RBZGRyZXNzKDIpLCA3KSk7Ci0gIERldmljZUdyb3Vwczo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMiksIFV1aWQ6OmtFbXB0eSwgNyk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShHZXRUZXN0QWRkcmVzcygyKSk7Ci0gIEFTU0VSVF9FUShrR3JvdXBVbmtub3duLAotICAgICAgICAgICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+R2V0R3JvdXBJZChHZXRUZXN0QWRkcmVzcygyKSwgVXVpZDo6a0VtcHR5KSk7Ci0gIEFTU0VSVF9FUShrR3JvdXBVbmtub3duLAotICAgICAgICAgICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+R2V0R3JvdXBJZChHZXRUZXN0QWRkcmVzcygzKSwgVXVpZDo6a0VtcHR5KSk7Ci0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotfQotCi1URVNUX0YoR3JvdXBzVGVzdCwgdGVzdF9hZGRfbXVsdGlwbGVfZGV2aWNlcykgewotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwQWRkZWQoR2V0VGVzdEFkZHJlc3MoMiksIFV1aWQ6OmtFbXB0eSwgNykpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwTWVtYmVyQWRkZWQoXywgNykpLlRpbWVzKDIpOwotICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDIpLCBVdWlkOjprRW1wdHksIDcpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMyksIFV1aWQ6OmtFbXB0eSwgNyk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcyg0KSwgVXVpZDo6a0VtcHR5LCA3KTsKLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X3JlbW92ZV9tdWx0aXBsZV9kZXZpY2VzKSB7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBNZW1iZXJSZW1vdmVkKF8sIF8pKS5UaW1lcygzKTsKLSAgRGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygyKSwgVXVpZDo6a0VtcHR5LCA3KTsKLSAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDMpLCBVdWlkOjprRW1wdHksIDcpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoNCksIFV1aWQ6OmtFbXB0eSwgNyk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShHZXRUZXN0QWRkcmVzcygyKSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShHZXRUZXN0QWRkcmVzcygzKSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShHZXRUZXN0QWRkcmVzcyg0KSk7Ci0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotfQotCi1URVNUX0YoR3JvdXBzVGVzdCwgdGVzdF9hZGRfbXVsdGlwbGVfZ3JvdXBzKSB7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBBZGRlZChfLCBfLCBfKSkuVGltZXMoMik7Ci0gIERldmljZUdyb3Vwczo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSksIFV1aWQ6OmtFbXB0eSwgOCk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygxKSwgVXVpZDo6a0VtcHR5LCA5KTsKLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X3JlbW92ZV9tdWx0aXBsZV9ncm91cHMpIHsKLSAgVXVpZCB1dWlkMSA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICBVdWlkIHV1aWQyID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gIEFTU0VSVF9ORSh1dWlkMSwgdXVpZDIpOwotCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBBZGRlZChfLCBfLCBfKSkuVGltZXMoMik7Ci0gIERldmljZUdyb3Vwczo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSksIHV1aWQxLCA4KTsKLSAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDEpLCB1dWlkMiwgOSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygyKSwgdXVpZDIsIDkpOwotCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBNZW1iZXJSZW1vdmVkKEdldFRlc3RBZGRyZXNzKDEpLCA4KSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBNZW1iZXJSZW1vdmVkKEdldFRlc3RBZGRyZXNzKDEpLCA5KSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBSZW1vdmVkKHV1aWQxLCA4KSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBSZW1vdmVkKHV1aWQyLCA5KSkuVGltZXMoMCk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShHZXRUZXN0QWRkcmVzcygxKSk7Ci0KLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X3JlbW92ZV9kZXZpY2VfZm9fZGV2aWNlcykgewotICBVdWlkIHV1aWQxID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gIFV1aWQgdXVpZDIgPSBVdWlkOjpHZXRSYW5kb20oKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Hcm91cEFkZGVkKF8sIF8sIF8pKS5UaW1lcygyKTsKLSAgRGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygxKSwgdXVpZDEsIDgpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSksIHV1aWQyLCA5KTsKLQotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwUmVtb3ZlZCh1dWlkMSwgOCkpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwUmVtb3ZlZCh1dWlkMiwgOSkpLlRpbWVzKDApOwotCi0gIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShHZXRUZXN0QWRkcmVzcygxKSwgOCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmNhbGxiYWNrcyk7Ci0KLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Hcm91cFJlbW92ZWQodXVpZDEsIDgpKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Hcm91cFJlbW92ZWQodXVpZDIsIDkpKTsKLQotICBEZXZpY2VHcm91cHM6OkdldCgpLT5SZW1vdmVEZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSksIDkpOwotfQotCi1URVNUX0YoR3JvdXBzVGVzdCwgdGVzdF9hZGRfZGV2aWNlc19kaWZmZXJlbnRfZ3JvdXBfaWQpIHsKLSAgRGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygyKSwgVXVpZDo6a0VtcHR5LCAxMCk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygzKSwgVXVpZDo6a0VtcHR5LCAxMSk7Ci0gIGF1dG8gZ3JvdXBfaWRfMSA9Ci0gICAgICBEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKEdldFRlc3RBZGRyZXNzKDIpLCBVdWlkOjprRW1wdHkpOwotICBhdXRvIGdyb3VwX2lkXzIgPQotICAgICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+R2V0R3JvdXBJZChHZXRUZXN0QWRkcmVzcygzKSwgVXVpZDo6a0VtcHR5KTsKLSAgQVNTRVJUX1RSVUUoZ3JvdXBfaWRfMSAhPSBncm91cF9pZF8yKTsKLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihHcm91cHNUZXN0LCB0ZXN0X2dyb3VwX2lkX2Fzc2lnbikgewotICBpbnQgY2FwdHVyZWRfZ2lkMSA9IGtHcm91cFVua25vd247Ci0gIGludCBjYXB0dXJlZF9naWQyID0ga0dyb3VwVW5rbm93bjsKLQotICBEZXZpY2VHcm91cHM6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Hcm91cEFkZGVkKEdldFRlc3RBZGRyZXNzKDEpLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZjYXB0dXJlZF9naWQxKSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBBZGRlZChHZXRUZXN0QWRkcmVzcygyKSwgXywgXykpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmY2FwdHVyZWRfZ2lkMikpOwotCi0gIGludCBnaWQxID0gRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDEpLCBVdWlkOjprRW1wdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKTsKLSAgaW50IGdpZDIgPSBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMiksIFV1aWQ6OmtFbXB0eSk7Ci0gIGludCBnaWQzID0gRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDIpLCBVdWlkOjprRW1wdHkpOwotICBBU1NFUlRfTkUoYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24sIGdpZDEpOwotICBBU1NFUlRfTkUoYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24sIGdpZDIpOwotICBBU1NFUlRfRVEoZ2lkMiwgZ2lkMyk7Ci0gIEFTU0VSVF9FUShnaWQxLCBjYXB0dXJlZF9naWQxKTsKLSAgQVNTRVJUX0VRKGdpZDIsIGNhcHR1cmVkX2dpZDIpOwotCi0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotfQotCi1URVNUX0YoR3JvdXBzVGVzdCwgdGVzdF9zdG9yYWdlX2NhbGxzKSB7Ci0gIEFTU0VSVF9FUSgwLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2dyb3VwcyJdKTsKLSAgRGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2dyb3VwcyJdKTsKLQotICBBU1NFUlRfRVEoMCwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0aWZfc3RvcmFnZV9hZGRfZ3JvdXBzIl0pOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSksIFV1aWQ6OmtFbXB0eSwgNyk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygxKSwgVXVpZDo6a0VtcHR5LCA4KTsKLSAgQVNTRVJUX0VRKDIsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJidGlmX3N0b3JhZ2VfYWRkX2dyb3VwcyJdKTsKLQotICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoR2V0VGVzdEFkZHJlc3MoMiksIFV1aWQ6OmtFbXB0eSwgNyk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygzKSwgVXVpZDo6a0VtcHR5LCA3KTsKLSAgQVNTRVJUX0VRKDQsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJidGlmX3N0b3JhZ2VfYWRkX2dyb3VwcyJdKTsKLQotICBBU1NFUlRfRVEoMCwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0aWZfc3RvcmFnZV9yZW1vdmVfZ3JvdXBzIl0pOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5SZW1vdmVEZXZpY2UoR2V0VGVzdEFkZHJlc3MoMSkpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5SZW1vdmVEZXZpY2UoR2V0VGVzdEFkZHJlc3MoMikpOwotICBEZXZpY2VHcm91cHM6OkdldCgpLT5SZW1vdmVEZXZpY2UoR2V0VGVzdEFkZHJlc3MoMykpOwotICBBU1NFUlRfRVEoMywgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0aWZfc3RvcmFnZV9yZW1vdmVfZ3JvdXBzIl0pOwotCi0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotfQotCi1URVNUX0YoR3JvdXBzVGVzdCwgdGVzdF9zdG9yYWdlX2NvbnRlbnQpIHsKLSAgaW50IGdpZDEgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLSAgaW50IGdpZDIgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLSAgVXVpZCB1dWlkMSA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICBVdWlkIHV1aWQyID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gIEFTU0VSVF9ORSh1dWlkMSwgdXVpZDIpOwotCi0gIERldmljZUdyb3Vwczo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBnaWQxID0gRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDEpLCB1dWlkMSwgZ2lkMSk7Ci0gIERldmljZUdyb3Vwczo6R2V0KCktPkFkZERldmljZShHZXRUZXN0QWRkcmVzcygyKSwgdXVpZDEsIGdpZDEpOwotICBnaWQyID0gRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKEdldFRlc3RBZGRyZXNzKDIpLCB1dWlkMiwgZ2lkMik7Ci0gIEFTU0VSVF9ORShibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93biwgZ2lkMSk7Ci0gIEFTU0VSVF9ORShnaWQxLCBnaWQyKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXYxX3N0b3JhZ2U7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRldjJfc3RvcmFnZTsKLQotICAvLyBTdG9yZSB0byBieXRlIGJ1ZmZlcgotICBEZXZpY2VHcm91cHM6OkdldEZvclN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMSksIGRldjFfc3RvcmFnZSk7Ci0gIERldmljZUdyb3Vwczo6R2V0Rm9yU3RvcmFnZShHZXRUZXN0QWRkcmVzcygyKSwgZGV2Ml9zdG9yYWdlKTsKLSAgQVNTRVJUX05FKDB1LCBkZXYxX3N0b3JhZ2Uuc2l6ZSgpKTsKLSAgQVNTRVJUX1RSVUUoZGV2Ml9zdG9yYWdlLnNpemUoKSA+IGRldjFfc3RvcmFnZS5zaXplKCkpOwotCi0gIC8vIENsZWFuIGl0IHVwCi0gIERldmljZUdyb3Vwczo6Q2xlYW5VcChjYWxsYmFja3MuZ2V0KCkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgRGV2aWNlR3JvdXBzOjpHZXQoKSk7Ci0KLSAgLy8gUmVzdG9yZSBkZXYxIGZyb20gdGhlIGJ5dGUgYnVmZmVyCi0gIERldmljZUdyb3Vwczo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwQWRkZWQoR2V0VGVzdEFkZHJlc3MoMSksIHV1aWQxLCBnaWQxKSk7Ci0gIERldmljZUdyb3Vwczo6QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMSksIGRldjFfc3RvcmFnZSk7Ci0KLSAgLy8gUmVzdG9yZSBkZXYyIGZyb20gdGhlIGJ5dGUgYnVmZmVyCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBBZGRlZChHZXRUZXN0QWRkcmVzcygyKSwgdXVpZDIsIGdpZDIpKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Hcm91cE1lbWJlckFkZGVkKEdldFRlc3RBZGRyZXNzKDIpLCBnaWQxKSkuVGltZXMoMSk7Ci0gIERldmljZUdyb3Vwczo6QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMiksIGRldjJfc3RvcmFnZSk7Ci0KLSAgRGV2aWNlR3JvdXBzOjpDbGVhblVwKGNhbGxiYWNrcy5nZXQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBncm91cHMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS9oZC9idGFfaGRfYWN0LmNjIGIvYnRhL2hkL2J0YV9oZF9hY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDU1ZDYuLjAwMDAwMDAKLS0tIGEvYnRhL2hkL2J0YV9oZF9hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDUtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBISUQgZGV2aWNlIGFjdGlvbiBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vLyBCVEFfSERfSU5DTFVERUQKLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpZiBkZWZpbmVkKEJUQV9IRF9JTkNMVURFRCkgJiYgKEJUQV9IRF9JTkNMVURFRCA9PSBUUlVFKQotCi0jaW5jbHVkZSAiYnRhL2hkL2J0YV9oZF9pbnQuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X2hkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hpZGRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotc3RhdGljIHZvaWQgYnRhX2hkX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YSwgQlRfSERSKiBwZGF0YSk7Ci0KLXN0YXRpYyBib29sIGNoZWNrX2Rlc2NyaXB0b3IodWludDhfdCogZGF0YSwgdWludDE2X3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBoYXNfcmVwb3J0X2lkKSB7Ci0gIHVpbnQ4X3QqIHB0ciA9IGRhdGE7Ci0KLSAgKmhhc19yZXBvcnRfaWQgPSBGQUxTRTsKLQotICB3aGlsZSAocHRyIDwgZGF0YSArIGxlbmd0aCkgewotICAgIHVpbnQ4X3QgaXRlbSA9ICpwdHIrKzsKLQotICAgIHN3aXRjaCAoaXRlbSkgewotICAgICAgY2FzZSAweGZlOiAgLy8gbG9uZyBpdGVtIGluZGljYXRvcgotICAgICAgICBpZiAocHRyIDwgZGF0YSArIGxlbmd0aCkgewotICAgICAgICAgIHB0ciArPSAoKCpwdHIpICsgMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDB4ODU6ICAvLyBSZXBvcnQgSUQKLSAgICAgICAgKmhhc19yZXBvcnRfaWQgPSBUUlVFOwotICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBwdHIgKz0gKGl0ZW0gJiAweDAzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChwdHIgPT0gZGF0YSArIGxlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfYXBpX2VuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlcyBISUQgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hkX2FwaV9lbmFibGUodEJUQV9IRF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRF9TVEFUVVMgc3RhdHVzID0gQlRBX0hEX0VSUk9SOwotICB0SElEX1NUQVRVUyByZXQ7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIEhJRF9EZXZJbml0KCk7Ci0KLSAgbWVtc2V0KCZidGFfaGRfY2IsIDAsIHNpemVvZih0QlRBX0hEX0NCKSk7Ci0KLSAgLyogc3RvcmUgcGFyYW1ldGVycyAqLwotICBidGFfaGRfY2IucF9jYmFjayA9IHBfZGF0YS0+YXBpX2VuYWJsZS5wX2NiYWNrOwotCi0gIHJldCA9IEhJRF9EZXZSZWdpc3RlcihidGFfaGRfY2JhY2spOwotICBpZiAocmV0ID09IEhJRF9TVUNDRVNTKSB7Ci0gICAgc3RhdHVzID0gQlRBX0hEX09LOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSElEIGRldmljZSAoJWQpIiwgX19mdW5jX18sIHJldCk7Ci0gIH0KLQotICAvKiBzaWduYWwgQlRBIGNhbGwgYmFjayBldmVudCAqLwotICB0QlRBX0hEIGJ0YV9oZDsKLSAgYnRhX2hkLnN0YXR1cyA9IHN0YXR1czsKLSAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX0VOQUJMRV9FVlQsICZidGFfaGQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX2FwaV9kaXNhYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNhYmxlcyBISUQgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hkX2FwaV9kaXNhYmxlKHZvaWQpIHsKLSAgdEJUQV9IRF9TVEFUVVMgc3RhdHVzID0gQlRBX0hEX0VSUk9SOwotICB0SElEX1NUQVRVUyByZXQ7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIC8qIHNlcnZpY2UgaXMgbm90IGVuYWJsZWQgKi8KLSAgaWYgKGJ0YV9oZF9jYi5wX2NiYWNrID09IE5VTEwpIHJldHVybjsKLQotICAvKiBSZW1vdmUgc2VydmljZSByZWNvcmQgKi8KLSAgaWYgKGJ0YV9oZF9jYi5zZHBfaGFuZGxlICE9IDApIHsKLSAgICBTRFBfRGVsZXRlUmVjb3JkKGJ0YV9oZF9jYi5zZHBfaGFuZGxlKTsKLSAgICBidGFfc3lzX3JlbW92ZV91dWlkKFVVSURfU0VSVkNMQVNTX0hVTUFOX0lOVEVSRkFDRSk7Ci0gIH0KLQotICAvKiBEZXJlZ2lzdGVyIHdpdGggbG93ZXIgbGF5ZXIgKi8KLSAgcmV0ID0gSElEX0RldkRlcmVnaXN0ZXIoKTsKLSAgaWYgKHJldCA9PSBISURfU1VDQ0VTUykgewotICAgIHN0YXR1cyA9IEJUQV9IRF9PSzsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRmFpbGVkIHRvIGRlcmVnaXN0ZXIgSElEIGRldmljZSAoJXMpIiwgX19mdW5jX18sIHJldCk7Ci0gIH0KLQotICB0QlRBX0hEIGJ0YV9oZDsKLSAgYnRhX2hkLnN0YXR1cyA9IHN0YXR1czsKLSAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX0RJU0FCTEVfRVZULCAmYnRhX2hkKTsKLQotICBtZW1zZXQoJmJ0YV9oZF9jYiwgMCwgc2l6ZW9mKHRCVEFfSERfQ0IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF9yZWdpc3Rlcl9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVycyBTRFAgcmVjb3JkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hkX3JlZ2lzdGVyX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEIHJldDsKLSAgdEJUQV9IRF9SRUdJU1RFUl9BUFAqIHBfYXBwX2RhdGEgPSAodEJUQV9IRF9SRUdJU1RFUl9BUFAqKXBfZGF0YTsKLSAgYm9vbCB1c2VfcmVwb3J0X2lkID0gRkFMU0U7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIHJldC5yZWdfc3RhdHVzLmluX3VzZSA9IEZBTFNFOwotCi0gIC8qIENoZWNrIGlmIGxlbiBkb2Vzbid0IGV4Y2VlZCBCVEFfSERfQVBQX0RFU0NSSVBUT1JfTEVOIGFuZCBkZXNjcmlwdG9yCi0gICAqIGl0c2VsZiBpcyB3ZWxsLWZvcm1lZC4gQWxzbyBjaGVjayBpZiBkZXNjcmlwdG9yIGhhcyBSZXBvcnQgSWQgaXRlbSBzbyB3ZQotICAgKiBrbm93IGlmIHJlcG9ydCB3aWxsIGhhdmUgcHJlZml4IG9yIG5vdC4gKi8KLSAgaWYgKHBfYXBwX2RhdGEtPmRfbGVuID4gQlRBX0hEX0FQUF9ERVNDUklQVE9SX0xFTiB8fAotICAgICAgIWNoZWNrX2Rlc2NyaXB0b3IocF9hcHBfZGF0YS0+ZF9kYXRhLCBwX2FwcF9kYXRhLT5kX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VfcmVwb3J0X2lkKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBEZXNjcmlwdG9yIGlzIHRvbyBsb25nIG9yIG1hbGZvcm1lZCIsIF9fZnVuY19fKTsKLSAgICByZXQucmVnX3N0YXR1cy5zdGF0dXMgPSBCVEFfSERfRVJST1I7Ci0gICAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX1JFR0lTVEVSX0FQUF9FVlQsICZyZXQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHJldC5yZWdfc3RhdHVzLnN0YXR1cyA9IEJUQV9IRF9PSzsKLQotICAvKiBSZW1vdmUgb2xkIHJlY29yZCBpZiBmb3Igc29tZSByZWFzb24gaXQncyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KLSAgaWYgKGJ0YV9oZF9jYi5zZHBfaGFuZGxlICE9IDApIHsKLSAgICBTRFBfRGVsZXRlUmVjb3JkKGJ0YV9oZF9jYi5zZHBfaGFuZGxlKTsKLSAgfQotCi0gIGJ0YV9oZF9jYi51c2VfcmVwb3J0X2lkID0gdXNlX3JlcG9ydF9pZDsKLSAgYnRhX2hkX2NiLnNkcF9oYW5kbGUgPSBTRFBfQ3JlYXRlUmVjb3JkKCk7Ci0gIEhJRF9EZXZBZGRSZWNvcmQoYnRhX2hkX2NiLnNkcF9oYW5kbGUsIHBfYXBwX2RhdGEtPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgcF9hcHBfZGF0YS0+ZGVzY3JpcHRpb24sIHBfYXBwX2RhdGEtPnByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgIHBfYXBwX2RhdGEtPnN1YmNsYXNzLCBwX2FwcF9kYXRhLT5kX2xlbiwgcF9hcHBfZGF0YS0+ZF9kYXRhKTsKLSAgYnRhX3N5c19hZGRfdXVpZChVVUlEX1NFUlZDTEFTU19IVU1BTl9JTlRFUkZBQ0UpOwotCi0gIEhJRF9EZXZTZXRJbmNvbWluZ1FvcygKLSAgICAgIHBfYXBwX2RhdGEtPmluX3Fvcy5zZXJ2aWNlX3R5cGUsIHBfYXBwX2RhdGEtPmluX3Fvcy50b2tlbl9yYXRlLAotICAgICAgcF9hcHBfZGF0YS0+aW5fcW9zLnRva2VuX2J1Y2tldF9zaXplLCBwX2FwcF9kYXRhLT5pbl9xb3MucGVha19iYW5kd2lkdGgsCi0gICAgICBwX2FwcF9kYXRhLT5pbl9xb3MuYWNjZXNzX2xhdGVuY3ksIHBfYXBwX2RhdGEtPmluX3Fvcy5kZWxheV92YXJpYXRpb24pOwotCi0gIEhJRF9EZXZTZXRPdXRnb2luZ1FvcygKLSAgICAgIHBfYXBwX2RhdGEtPm91dF9xb3Muc2VydmljZV90eXBlLCBwX2FwcF9kYXRhLT5vdXRfcW9zLnRva2VuX3JhdGUsCi0gICAgICBwX2FwcF9kYXRhLT5vdXRfcW9zLnRva2VuX2J1Y2tldF9zaXplLCBwX2FwcF9kYXRhLT5vdXRfcW9zLnBlYWtfYmFuZHdpZHRoLAotICAgICAgcF9hcHBfZGF0YS0+b3V0X3Fvcy5hY2Nlc3NfbGF0ZW5jeSwgcF9hcHBfZGF0YS0+b3V0X3Fvcy5kZWxheV92YXJpYXRpb24pOwotCi0gIC8vIGFwcGxpY2F0aW9uIGlzIHJlZ2lzdGVyZWQgc28gd2UgY2FuIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucwotICBISURfRGV2U2V0SW5jb21pbmdQb2xpY3koVFJVRSk7Ci0KLSAgaWYgKEhJRF9EZXZHZXREZXZpY2UoJnJldC5yZWdfc3RhdHVzLmJkYSkgPT0gSElEX1NVQ0NFU1MpIHsKLSAgICByZXQucmVnX3N0YXR1cy5pbl91c2UgPSBUUlVFOwotICB9Ci0KLSAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX1JFR0lTVEVSX0FQUF9FVlQsICZyZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX3VucmVnaXN0ZXJfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBVbnJlZ2lzdGVycyBTRFAgcmVjb3JkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hkX3VucmVnaXN0ZXJfYWN0KCkgewotICB0QlRBX0hEX1NUQVRVUyBzdGF0dXMgPSBCVEFfSERfT0s7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIC8vIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciByZWdpc3RlcmVkIHNvIHdlIGRvIG5vdCB3YW50IGluY29taW5nIGNvbm5lY3Rpb25zCi0gIEhJRF9EZXZTZXRJbmNvbWluZ1BvbGljeShGQUxTRSk7Ci0KLSAgaWYgKGJ0YV9oZF9jYi5zZHBfaGFuZGxlICE9IDApIHsKLSAgICBTRFBfRGVsZXRlUmVjb3JkKGJ0YV9oZF9jYi5zZHBfaGFuZGxlKTsKLSAgfQotCi0gIGJ0YV9oZF9jYi5zZHBfaGFuZGxlID0gMDsKLSAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19IVU1BTl9JTlRFUkZBQ0UpOwotCi0gIHRCVEFfSEQgYnRhX2hkOwotICBidGFfaGQuc3RhdHVzID0gc3RhdHVzOwotICAoKmJ0YV9oZF9jYi5wX2NiYWNrKShCVEFfSERfVU5SRUdJU1RFUl9BUFBfRVZULCAmYnRhX2hkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF91bnJlZ2lzdGVyMl9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZF91bnJlZ2lzdGVyMl9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIC8vIGNsb3NlIGZpcnN0Ci0gIGJ0YV9oZF9jbG9zZV9hY3QocF9kYXRhKTsKLQotICAvLyB0aGVuIHVucmVnaXN0ZXIKLSAgYnRhX2hkX3VucmVnaXN0ZXJfYWN0KCk7Ci0KLSAgaWYgKGJ0YV9oZF9jYi5kaXNhYmxlX3c0X2Nsb3NlKSB7Ci0gICAgYnRhX2hkX2FwaV9kaXNhYmxlKCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF9jb25uZWN0X2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29ubmVjdCB0byBkZXZpY2UgKG11c3QgYmUgdmlydHVhbGx5IHBsdWdnZWQpCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oZF9jb25uZWN0X2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0SElEX1NUQVRVUyByZXQ7Ci0gIHRCVEFfSERfREVWSUNFX0NUUkwqIHBfY3RybCA9ICh0QlRBX0hEX0RFVklDRV9DVFJMKilwX2RhdGE7Ci0gIHRCVEFfSEQgY2JhY2tfZGF0YTsKLQotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcmV0ID0gSElEX0RldlBsdWdEZXZpY2UocF9jdHJsLT5hZGRyKTsKLSAgaWYgKHJldCAhPSBISURfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEhJRF9EZXZQbHVnRGV2aWNlIHJldHVybmVkICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcmV0ID0gSElEX0RldkNvbm5lY3QoKTsKLSAgaWYgKHJldCAhPSBISURfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEhJRF9EZXZDb25uZWN0IHJldHVybmVkICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2JhY2tfZGF0YS5jb25uLmJkYSA9IHBfY3RybC0+YWRkcjsKLSAgY2JhY2tfZGF0YS5jb25uLnN0YXR1cyA9IEJUSERfQ09OTl9TVEFURV9DT05ORUNUSU5HOwotCi0gIGJ0YV9oZF9jYi5wX2NiYWNrKEJUQV9IRF9DT05OX1NUQVRFX0VWVCwgJmNiYWNrX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX2Rpc2Nvbm5lY3RfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjb25uZWN0IGZyb20gZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oZF9kaXNjb25uZWN0X2FjdCgpIHsKLSAgdEhJRF9TVEFUVVMgcmV0OwotICB0QlRBX0hEIGNiYWNrX2RhdGE7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIHJldCA9IEhJRF9EZXZEaXNjb25uZWN0KCk7Ci0KLSAgaWYgKHJldCAhPSBISURfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEhJRF9EZXZEaXNjb25uZWN0IHJldHVybmVkICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKEhJRF9EZXZHZXREZXZpY2UoJmNiYWNrX2RhdGEuY29ubi5iZGEpID09IEhJRF9TVUNDRVNTKSB7Ci0gICAgY2JhY2tfZGF0YS5jb25uLnN0YXR1cyA9IEJUSERfQ09OTl9TVEFURV9ESVNDT05ORUNUSU5HOwotICAgIGJ0YV9oZF9jYi5wX2NiYWNrKEJUQV9IRF9DT05OX1NUQVRFX0VWVCwgJmNiYWNrX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfYWRkX2RldmljZV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfYWRkX2RldmljZV9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRF9ERVZJQ0VfQ1RSTCogcF9jdHJsID0gKHRCVEFfSERfREVWSUNFX0NUUkwqKXBfZGF0YTsKLQotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgSElEX0RldlBsdWdEZXZpY2UocF9jdHJsLT5hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF9yZW1vdmVfZGV2aWNlX2FjdAotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oZF9yZW1vdmVfZGV2aWNlX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEX0RFVklDRV9DVFJMKiBwX2N0cmwgPSAodEJUQV9IRF9ERVZJQ0VfQ1RSTCopcF9kYXRhOwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBISURfRGV2VW5wbHVnRGV2aWNlKHBfY3RybC0+YWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfc2VuZF9yZXBvcnRfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyByZXBvcnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hkX3NlbmRfcmVwb3J0X2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEX1NFTkRfUkVQT1JUKiBwX3JlcG9ydCA9ICh0QlRBX0hEX1NFTkRfUkVQT1JUKilwX2RhdGE7Ci0gIHVpbnQ4X3QgY2hhbm5lbDsKLSAgdWludDhfdCByZXBvcnRfaWQ7Ci0KLSAgQVBQTF9UUkFDRV9WRVJCT1NFKCIlcyIsIF9fZnVuY19fKTsKLQotICBjaGFubmVsID0gcF9yZXBvcnQtPnVzZV9pbnRyID8gSElEX0NIQU5ORUxfSU5UUiA6IEhJRF9DSEFOTkVMX0NUUkw7Ci0gIHJlcG9ydF9pZCA9Ci0gICAgICAoYnRhX2hkX2NiLnVzZV9yZXBvcnRfaWQgfHwgYnRhX2hkX2NiLmJvb3RfbW9kZSkgPyBwX3JlcG9ydC0+aWQgOiAweDAwOwotCi0gIEhJRF9EZXZTZW5kUmVwb3J0KGNoYW5uZWwsIHBfcmVwb3J0LT50eXBlLCByZXBvcnRfaWQsIHBfcmVwb3J0LT5sZW4sCi0gICAgICAgICAgICAgICAgICAgIHBfcmVwb3J0LT5kYXRhKTsKLQotICAvKiB0cmlnZ2VyIFBNICovCi0gIGJ0YV9zeXNfYnVzeShCVEFfSURfSEQsIDEsIGJ0YV9oZF9jYi5iZF9hZGRyKTsKLSAgYnRhX3N5c19pZGxlKEJUQV9JRF9IRCwgMSwgYnRhX2hkX2NiLmJkX2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX3JlcG9ydF9lcnJvcl9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfcmVwb3J0X2Vycm9yX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEX1JFUE9SVF9FUlIqIHBfcmVwb3J0ID0gKHRCVEFfSERfUkVQT1JUX0VSUiopcF9kYXRhOwotICB0SElEX1NUQVRVUyByZXQ7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIHBfcmVwb3J0LT5lcnJvcik7Ci0KLSAgcmV0ID0gSElEX0RldlJlcG9ydEVycm9yKHBfcmVwb3J0LT5lcnJvcik7Ci0KLSAgaWYgKHJldCAhPSBISURfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEhJRF9EZXZSZXBvcnRFcnJvciByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfdmNfdW5wbHVnX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZHMgVmlydHVhbCBDYWJsZSBVbnBsdWcKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hkX3ZjX3VucGx1Z19hY3QoKSB7Ci0gIHRISURfU1RBVFVTIHJldDsKLQotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRhX2hkX2NiLnZjX3VucGx1ZyA9IFRSVUU7Ci0KLSAgcmV0ID0gSElEX0RldlZpcnR1YWxDYWJsZVVucGx1ZygpOwotCi0gIGlmIChyZXQgIT0gSElEX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBISURfRGV2VmlydHVhbENhYmxlVW5wbHVnIHJldHVybmVkICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHJldCk7Ci0gIH0KLQotICAvKiB0cmlnZ2VyIFBNICovCi0gIGJ0YV9zeXNfYnVzeShCVEFfSURfSEQsIDEsIGJ0YV9oZF9jYi5iZF9hZGRyKTsKLSAgYnRhX3N5c19pZGxlKEJUQV9JRF9IRCwgMSwgYnRhX2hkX2NiLmJkX2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX29wZW5fYWN0Ci0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hkX29wZW5fYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSERfQ0JBQ0tfREFUQSogcF9jYmFjayA9ICh0QlRBX0hEX0NCQUNLX0RBVEEqKXBfZGF0YTsKLSAgdEJUQV9IRCBjYmFja19kYXRhOwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBISURfRGV2UGx1Z0RldmljZShwX2NiYWNrLT5hZGRyKTsKLSAgYnRhX3N5c19jb25uX29wZW4oQlRBX0lEX0hELCAxLCBwX2NiYWNrLT5hZGRyKTsKLQotICBjYmFja19kYXRhLmNvbm4uYmRhID0gcF9jYmFjay0+YWRkcjsKLSAgYnRhX2hkX2NiLmJkX2FkZHIgPSBwX2NiYWNrLT5hZGRyOwotCi0gIGJ0YV9oZF9jYi5wX2NiYWNrKEJUQV9IRF9PUEVOX0VWVCwgJmNiYWNrX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX2Nsb3NlX2FjdAotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oZF9jbG9zZV9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRF9DQkFDS19EQVRBKiBwX2NiYWNrID0gKHRCVEFfSERfQ0JBQ0tfREFUQSopcF9kYXRhOwotICB0QlRBX0hEIGNiYWNrX2RhdGE7Ci0gIHRCVEFfSERfRVZUIGNiYWNrX2V2ZW50ID0gQlRBX0hEX0NMT1NFX0VWVDsKLQotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRhX3N5c19jb25uX2Nsb3NlKEJUQV9JRF9IRCwgMSwgcF9jYmFjay0+YWRkcik7Ci0KLSAgaWYgKGJ0YV9oZF9jYi52Y191bnBsdWcpIHsKLSAgICBidGFfaGRfY2IudmNfdW5wbHVnID0gRkFMU0U7Ci0gICAgSElEX0RldlVucGx1Z0RldmljZShwX2NiYWNrLT5hZGRyKTsKLSAgICBjYmFja19ldmVudCA9IEJUQV9IRF9WQ19VTlBMVUdfRVZUOwotICB9Ci0KLSAgY2JhY2tfZGF0YS5jb25uLmJkYSA9IHBfY2JhY2stPmFkZHI7Ci0gIGJ0YV9oZF9jYi5iZF9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotCi0gIGJ0YV9oZF9jYi5wX2NiYWNrKGNiYWNrX2V2ZW50LCAmY2JhY2tfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfaW50cl9kYXRhX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlcyBpbmNvbWluZyBEQVRBIHJlcXVlc3Qgb24gaW50cgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfaW50cl9kYXRhX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEX0NCQUNLX0RBVEEqIHBfY2JhY2sgPSAodEJUQV9IRF9DQkFDS19EQVRBKilwX2RhdGE7Ci0gIEJUX0hEUiogcF9tc2cgPSBwX2NiYWNrLT5wX2RhdGE7Ci0gIHVpbnQxNl90IGxlbiA9IHBfbXNnLT5sZW47Ci0gIHVpbnQ4X3QqIHBfYnVmID0gKHVpbnQ4X3QqKShwX21zZyArIDEpICsgcF9tc2ctPm9mZnNldDsKLSAgdEJUQV9IRF9JTlRSX0RBVEEgcmV0OwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoYnRhX2hkX2NiLnVzZV9yZXBvcnRfaWQgfHwgYnRhX2hkX2NiLmJvb3RfbW9kZSkgewotICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEwOTc1Nzk4NiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXQucmVwb3J0X2lkID0gKnBfYnVmOwotCi0gICAgbGVuLS07Ci0gICAgcF9idWYrKzsKLSAgfSBlbHNlIHsKLSAgICByZXQucmVwb3J0X2lkID0gMDsKLSAgfQotCi0gIHJldC5sZW4gPSBsZW47Ci0gIHJldC5wX2RhdGEgPSBwX2J1ZjsKLQotICB0QlRBX0hEIGJ0YV9oZDsKLSAgYnRhX2hkLmludHJfZGF0YSA9IHJldDsKLSAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX0lOVFJfREFUQV9FVlQsICZidGFfaGQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX2dldF9yZXBvcnRfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGVzIGluY29taW5nIEdFVF9SRVBPUlQgcmVxdWVzdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfZ2V0X3JlcG9ydF9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRF9DQkFDS19EQVRBKiBwX2NiYWNrID0gKHRCVEFfSERfQ0JBQ0tfREFUQSopcF9kYXRhOwotICBib29sIHJlcF9zaXplX2ZvbGxvd3MgPSBwX2NiYWNrLT5kYXRhOwotICBCVF9IRFIqIHBfbXNnID0gcF9jYmFjay0+cF9kYXRhOwotICB1aW50OF90KiBwX2J1ZiA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gIHRCVEFfSERfR0VUX1JFUE9SVCByZXQgPSB7MCwgMCwgMH07Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIHVpbnQxNl90IHJlbWFpbmluZ19sZW4gPSBwX21zZy0+bGVuOwotICBpZiAocmVtYWluaW5nX2xlbiA8IDEpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEwOTc1NzE2OCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHJldC5yZXBvcnRfdHlwZSA9ICpwX2J1ZiAmIEhJRF9QQVJfUkVQX1RZUEVfTUFTSzsKLSAgcF9idWYrKzsKLSAgcmVtYWluaW5nX2xlbi0tOwotCi0gIGlmIChidGFfaGRfY2IudXNlX3JlcG9ydF9pZCkgewotICAgIGlmIChyZW1haW5pbmdfbGVuIDwgMSkgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMDk3NTcxNjgiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmV0LnJlcG9ydF9pZCA9ICpwX2J1ZjsKLSAgICBwX2J1ZisrOwotICAgIHJlbWFpbmluZ19sZW4tLTsKLSAgfQotCi0gIGlmIChyZXBfc2l6ZV9mb2xsb3dzKSB7Ci0gICAgaWYgKHJlbWFpbmluZ19sZW4gPCAyKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEwOTc1NzE2OCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXQuYnVmZmVyX3NpemUgPSAqcF9idWYgfCAoKihwX2J1ZiArIDEpIDw8IDgpOwotICB9Ci0KLSAgdEJUQV9IRCBidGFfaGQ7Ci0gIGJ0YV9oZC5nZXRfcmVwb3J0ID0gcmV0OwotICAoKmJ0YV9oZF9jYi5wX2NiYWNrKShCVEFfSERfR0VUX1JFUE9SVF9FVlQsICZidGFfaGQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX3NldF9yZXBvcnRfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGVzIGluY29taW5nIFNFVF9SRVBPUlQgcmVxdWVzdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfc2V0X3JlcG9ydF9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRF9DQkFDS19EQVRBKiBwX2NiYWNrID0gKHRCVEFfSERfQ0JBQ0tfREFUQSopcF9kYXRhOwotICBCVF9IRFIqIHBfbXNnID0gcF9jYmFjay0+cF9kYXRhOwotICB1aW50MTZfdCBsZW4gPSBwX21zZy0+bGVuOwotICB1aW50OF90KiBwX2J1ZiA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gIHRCVEFfSERfU0VUX1JFUE9SVCByZXQgPSB7MCwgMCwgMCwgTlVMTH07Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChsZW4gPCAxKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTA4NDYxOTQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcmV0LnJlcG9ydF90eXBlID0gKnBfYnVmICYgSElEX1BBUl9SRVBfVFlQRV9NQVNLOwotICBwX2J1ZisrOwotICBsZW4tLTsKLQotICBpZiAoYnRhX2hkX2NiLnVzZV9yZXBvcnRfaWQgfHwgYnRhX2hkX2NiLmJvb3RfbW9kZSkgewotICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEwOTc1NzQzNSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXQucmVwb3J0X2lkID0gKnBfYnVmOwotCi0gICAgbGVuLS07Ci0gICAgcF9idWYrKzsKLSAgfSBlbHNlIHsKLSAgICByZXQucmVwb3J0X2lkID0gMDsKLSAgfQotCi0gIHJldC5sZW4gPSBsZW47Ci0gIHJldC5wX2RhdGEgPSBwX2J1ZjsKLQotICB0QlRBX0hEIGJ0YV9oZDsKLSAgYnRhX2hkLnNldF9yZXBvcnQgPSByZXQ7Ci0gICgqYnRhX2hkX2NiLnBfY2JhY2spKEJUQV9IRF9TRVRfUkVQT1JUX0VWVCwgJmJ0YV9oZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfc2V0X3Byb3RvY29sX2FjdAotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oZF9zZXRfcHJvdG9jb2xfYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSERfQ0JBQ0tfREFUQSogcF9jYmFjayA9ICh0QlRBX0hEX0NCQUNLX0RBVEEqKXBfZGF0YTsKLSAgdEJUQV9IRCBjYmFja19kYXRhOwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGFfaGRfY2IuYm9vdF9tb2RlID0gKHBfY2JhY2stPmRhdGEgPT0gSElEX1BBUl9QUk9UT0NPTF9CT09UX01PREUpOwotICBjYmFja19kYXRhLnNldF9wcm90b2NvbCA9IHBfY2JhY2stPmRhdGE7Ci0KLSAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX1NFVF9QUk9UT0NPTF9FVlQsICZjYmFja19kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF92Y191bnBsdWdfZG9uZV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfdmNfdW5wbHVnX2RvbmVfYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSERfQ0JBQ0tfREFUQSogcF9jYmFjayA9ICh0QlRBX0hEX0NCQUNLX0RBVEEqKXBfZGF0YTsKLSAgdEJUQV9IRCBjYmFja19kYXRhOwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGFfc3lzX2Nvbm5fY2xvc2UoQlRBX0lEX0hELCAxLCBwX2NiYWNrLT5hZGRyKTsKLQotICBISURfRGV2VW5wbHVnRGV2aWNlKHBfY2JhY2stPmFkZHIpOwotCi0gIGNiYWNrX2RhdGEuY29ubi5iZGEgPSBwX2NiYWNrLT5hZGRyOwotICBidGFfaGRfY2IuYmRfYWRkciA9IHBfY2JhY2stPmFkZHI7Ci0KLSAgKCpidGFfaGRfY2IucF9jYmFjaykoQlRBX0hEX1ZDX1VOUExVR19FVlQsICZjYmFja19kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF9zdXNwZW5kX2FjdAotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oZF9zdXNwZW5kX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEX0NCQUNLX0RBVEEqIHBfY2JhY2sgPSAodEJUQV9IRF9DQkFDS19EQVRBKilwX2RhdGE7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGJ0YV9zeXNfaWRsZShCVEFfSURfSEQsIDEsIHBfY2JhY2stPmFkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hkX2V4aXRfc3VzcGVuZF9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGRfZXhpdF9zdXNwZW5kX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hEX0NCQUNLX0RBVEEqIHBfY2JhY2sgPSAodEJUQV9IRF9DQkFDS19EQVRBKilwX2RhdGE7Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGJ0YV9zeXNfYnVzeShCVEFfSURfSEQsIDEsIHBfY2JhY2stPmFkZHIpOwotICBidGFfc3lzX2lkbGUoQlRBX0lEX0hELCAxLCBwX2NiYWNrLT5hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRBIEhEIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZF9jYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGEsIEJUX0hEUiogcGRhdGEpIHsKLSAgdEJUQV9IRF9DQkFDS19EQVRBKiBwX2J1ZiA9IE5VTEw7Ci0gIHVpbnQxNl90IHNtX2V2ZW50ID0gQlRBX0hEX0lOVkFMSURfRVZUOwotCi0gIEFQUExfVFJBQ0VfQVBJKCIlczogZXZlbnQ9JWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEhJRF9ESE9TVF9FVlRfT1BFTjoKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hEX0lOVF9PUEVOX0VWVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfREhPU1RfRVZUX0NMT1NFOgotICAgICAgc21fZXZlbnQgPSBCVEFfSERfSU5UX0NMT1NFX0VWVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfREhPU1RfRVZUX0dFVF9SRVBPUlQ6Ci0gICAgICBzbV9ldmVudCA9IEJUQV9IRF9JTlRfR0VUX1JFUE9SVF9FVlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSElEX0RIT1NUX0VWVF9TRVRfUkVQT1JUOgotICAgICAgc21fZXZlbnQgPSBCVEFfSERfSU5UX1NFVF9SRVBPUlRfRVZUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9ESE9TVF9FVlRfU0VUX1BST1RPQ09MOgotICAgICAgc21fZXZlbnQgPSBCVEFfSERfSU5UX1NFVF9QUk9UT0NPTF9FVlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSElEX0RIT1NUX0VWVF9JTlRSX0RBVEE6Ci0gICAgICBzbV9ldmVudCA9IEJUQV9IRF9JTlRfSU5UUl9EQVRBX0VWVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfREhPU1RfRVZUX1ZDX1VOUExVRzoKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hEX0lOVF9WQ19VTlBMVUdfRVZUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9ESE9TVF9FVlRfU1VTUEVORDoKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hEX0lOVF9TVVNQRU5EX0VWVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfREhPU1RfRVZUX0VYSVRfU1VTUEVORDoKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hEX0lOVF9FWElUX1NVU1BFTkRfRVZUOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoc21fZXZlbnQgIT0gQlRBX0hEX0lOVkFMSURfRVZUICYmCi0gICAgICAocF9idWYgPSAodEJUQV9IRF9DQkFDS19EQVRBKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hEX0NCQUNLX0RBVEEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJUX0hEUikpKSAhPSBOVUxMKSB7Ci0gICAgcF9idWYtPmhkci5ldmVudCA9IHNtX2V2ZW50OwotICAgIHBfYnVmLT5hZGRyID0gYmRfYWRkcjsKLSAgICBwX2J1Zi0+ZGF0YSA9IGRhdGE7Ci0gICAgcF9idWYtPnBfZGF0YSA9IHBkYXRhOwotCi0gICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLSAgfQotfQotCi0jZW5kaWYgLyogQlRBX0hEX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9idGEvaGQvYnRhX2hkX2FwaS5jYyBiL2J0YS9oZC9idGFfaGRfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU5YTIyLi4wMDAwMDAwCi0tLSBhL2J0YS9oZC9idGFfaGRfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA1LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSElEIERFVklDRSBBUEkgaW4gdGhlIHN1YnN5c3RlbSBvZiBCVEEuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGgiCi0KLS8vIEJUQV9IRF9JTkNMVURFRAotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2lmIGRlZmluZWQoQlRBX0hEX0lOQ0xVREVEKSAmJiAoQlRBX0hEX0lOQ0xVREVEID09IFRSVUUpCi0KLSNpbmNsdWRlICJidGEvaGQvYnRhX2hkX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNvbnN0IHRCVEFfU1lTX1JFRyBidGFfaGRfcmVnID0ge2J0YV9oZF9oZGxfZXZlbnQsIEJUQV9IZERpc2FibGV9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkRW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGVzIEhJRCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGRFbmFibGUodEJUQV9IRF9DQkFDSyogcF9jYmFjaykgewotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRhX3N5c19yZWdpc3RlcihCVEFfSURfSEQsICZidGFfaGRfcmVnKTsKLQotICB0QlRBX0hEX0FQSV9FTkFCTEUqIHBfYnVmID0KLSAgICAgICh0QlRBX0hEX0FQSV9FTkFCTEUqKW9zaV9tYWxsb2MoKHVpbnQxNl90KXNpemVvZih0QlRBX0hEX0FQSV9FTkFCTEUpKTsKLQotICBtZW1zZXQocF9idWYsIDAsIHNpemVvZih0QlRBX0hEX0FQSV9FTkFCTEUpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hEX0FQSV9FTkFCTEVfRVZUOwotICBwX2J1Zi0+cF9jYmFjayA9IHBfY2JhY2s7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZERpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGVzIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hkRGlzYWJsZSh2b2lkKSB7Ci0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGFfc3lzX2RlcmVnaXN0ZXIoQlRBX0lEX0hEKTsKLQotICBCVF9IRFJfUklHSUQqIHBfYnVmID0gKEJUX0hEUl9SSUdJRCopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSk7Ci0gIHBfYnVmLT5ldmVudCA9IEJUQV9IRF9BUElfRElTQUJMRV9FVlQ7Ci0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGRSZWdpc3RlckFwcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhcHBsaWNhdGlvbiBzaG91bGQgYmUKLSpyZWdpc3RlcmVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IZFJlZ2lzdGVyQXBwKHRCVEFfSERfQVBQX0lORk8qIHBfYXBwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hEX1FPU19JTkZPKiBwX2luX3FvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSERfUU9TX0lORk8qIHBfb3V0X3FvcykgewotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgdEJUQV9IRF9SRUdJU1RFUl9BUFAqIHBfYnVmID0KLSAgICAgICh0QlRBX0hEX1JFR0lTVEVSX0FQUCopb3NpX21hbGxvYyhzaXplb2YodEJUQV9IRF9SRUdJU1RFUl9BUFApKTsKLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9IRF9BUElfUkVHSVNURVJfQVBQX0VWVDsKLQotICBpZiAocF9hcHBfaW5mby0+cF9uYW1lKSB7Ci0gICAgc3RybGNweShwX2J1Zi0+bmFtZSwgcF9hcHBfaW5mby0+cF9uYW1lLCBCVEFfSERfQVBQX05BTUVfTEVOKTsKLSAgfSBlbHNlIHsKLSAgICBwX2J1Zi0+bmFtZVswXSA9ICdcMCc7Ci0gIH0KLQotICBpZiAocF9hcHBfaW5mby0+cF9kZXNjcmlwdGlvbikgewotICAgIHN0cmxjcHkocF9idWYtPmRlc2NyaXB0aW9uLCBwX2FwcF9pbmZvLT5wX2Rlc2NyaXB0aW9uLAotICAgICAgICAgICAgQlRBX0hEX0FQUF9ERVNDUklQVElPTl9MRU4pOwotICB9IGVsc2UgewotICAgIHBfYnVmLT5kZXNjcmlwdGlvblswXSA9ICdcMCc7Ci0gIH0KLQotICBpZiAocF9hcHBfaW5mby0+cF9wcm92aWRlcikgewotICAgIHN0cmxjcHkocF9idWYtPnByb3ZpZGVyLCBwX2FwcF9pbmZvLT5wX3Byb3ZpZGVyLCBCVEFfSERfQVBQX1BST1ZJREVSX0xFTik7Ci0gIH0gZWxzZSB7Ci0gICAgcF9idWYtPnByb3ZpZGVyWzBdID0gJ1wwJzsKLSAgfQotCi0gIHBfYnVmLT5zdWJjbGFzcyA9IHBfYXBwX2luZm8tPnN1YmNsYXNzOwotCi0gIGlmIChwX2FwcF9pbmZvLT5kZXNjcmlwdG9yLmRsX2xlbiA+IEJUQV9IRF9BUFBfREVTQ1JJUFRPUl9MRU4pIHsKLSAgICBwX2FwcF9pbmZvLT5kZXNjcmlwdG9yLmRsX2xlbiA9IEJUQV9IRF9BUFBfREVTQ1JJUFRPUl9MRU47Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTMxMTE3ODQiKTsKLSAgfQotICBwX2J1Zi0+ZF9sZW4gPSBwX2FwcF9pbmZvLT5kZXNjcmlwdG9yLmRsX2xlbjsKLSAgbWVtY3B5KHBfYnVmLT5kX2RhdGEsIHBfYXBwX2luZm8tPmRlc2NyaXB0b3IuZHNjX2xpc3QsCi0gICAgICAgICBwX2FwcF9pbmZvLT5kZXNjcmlwdG9yLmRsX2xlbik7Ci0KLSAgLy8gY29weSBxb3MgZGF0YSBhcy1pcwotICBtZW1jcHkoJnBfYnVmLT5pbl9xb3MsIHBfaW5fcW9zLCBzaXplb2YodEJUQV9IRF9RT1NfSU5GTykpOwotICBtZW1jcHkoJnBfYnVmLT5vdXRfcW9zLCBwX291dF9xb3MsIHNpemVvZih0QlRBX0hEX1FPU19JTkZPKSk7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZFVucmVnaXN0ZXJBcHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYXBwbGljYXRpb24gc2hvdWxkIGJlCi0qdW5yZWdpc3RlcmVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IZFVucmVnaXN0ZXJBcHAodm9pZCkgewotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfSERfQVBJX1VOUkVHSVNURVJfQVBQX0VWVDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkU2VuZFJlcG9ydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiByZXBvcnQgaXMgdG8gYmUgc2VudAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGRTZW5kUmVwb3J0KHRCVEFfSERfUkVQT1JUKiBwX3JlcG9ydCkgewotICBBUFBMX1RSQUNFX1ZFUkJPU0UoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChwX3JlcG9ydC0+bGVuID4gQlRBX0hEX1JFUE9SVF9MRU4pIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICIlcywgcmVwb3J0IGxlbiAoJWQpID4gTVRVIGxlbiAoJWQpLCBjYW4ndCBzZW5kIHJlcG9ydC4iCi0gICAgICAgICIgSW5jcmVhc2UgdmFsdWUgb2YgSElEX0RFVl9NVFVfU0laRSB0byBzZW5kIGxhcmdlciByZXBvcnRzIiwKLSAgICAgICAgX19mdW5jX18sIHBfcmVwb3J0LT5sZW4sIEJUQV9IRF9SRVBPUlRfTEVOKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0hEX1NFTkRfUkVQT1JUKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9IRF9TRU5EX1JFUE9SVCopb3NpX21hbGxvYyhzaXplb2YodEJUQV9IRF9TRU5EX1JFUE9SVCkpOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hEX0FQSV9TRU5EX1JFUE9SVF9FVlQ7Ci0KLSAgcF9idWYtPnVzZV9pbnRyID0gcF9yZXBvcnQtPnVzZV9pbnRyOwotICBwX2J1Zi0+dHlwZSA9IHBfcmVwb3J0LT50eXBlOwotICBwX2J1Zi0+aWQgPSBwX3JlcG9ydC0+aWQ7Ci0gIHBfYnVmLT5sZW4gPSBwX3JlcG9ydC0+bGVuOwotICBtZW1jcHkocF9idWYtPmRhdGEsIHBfcmVwb3J0LT5wX2RhdGEsIHBfcmVwb3J0LT5sZW4pOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGRWaXJ0dWFsQ2FibGVVbnBsdWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gVkNVIHNoYWxsIGJlIHNlbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkVmlydHVhbENhYmxlVW5wbHVnKHZvaWQpIHsKLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX0hEX0FQSV9WQ19VTlBMVUdfRVZUOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGRDb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNvbm5lY3Rpb24gdG8gaG9zdCBzaGFsbCBiZQotKm1hZGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICB0QlRBX0hEX0RFVklDRV9DVFJMKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9IRF9ERVZJQ0VfQ1RSTCopb3NpX21hbGxvYyhzaXplb2YodEJUQV9IRF9ERVZJQ0VfQ1RSTCkpOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hEX0FQSV9DT05ORUNUX0VWVDsKLQotICBwX2J1Zi0+YWRkciA9IGFkZHI7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZERpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gaG9zdCBzaGFsbCBiZSBkaXNjb25uZWN0ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkRGlzY29ubmVjdCh2b2lkKSB7Ci0gIEFQUExfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfSERfQVBJX0RJU0NPTk5FQ1RfRVZUOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGRBZGREZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgdmlydHVhbGx5IGNhYmxlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGRBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHRCVEFfSERfREVWSUNFX0NUUkwqIHBfYnVmID0KLSAgICAgICh0QlRBX0hEX0RFVklDRV9DVFJMKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hEX0RFVklDRV9DVFJMKSk7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfSERfQVBJX0FERF9ERVZJQ0VfRVZUOwotCi0gIHBfYnVmLT5hZGRyID0gYWRkcjsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkUmVtb3ZlRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzIHZpcnR1YWxseSB1bmNhYmxlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGRSZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICBBUFBMX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHRCVEFfSERfREVWSUNFX0NUUkwqIHBfYnVmID0KLSAgICAgICh0QlRBX0hEX0RFVklDRV9DVFJMKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hEX0RFVklDRV9DVFJMKSk7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfSERfQVBJX1JFTU9WRV9ERVZJQ0VfRVZUOwotCi0gIHBfYnVmLT5hZGRyID0gYWRkcjsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkUmVwb3J0RXJyb3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVwb3J0aW5nIGVycm9yIGZvciBzZXQgcmVwb3J0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IZFJlcG9ydEVycm9yKHVpbnQ4X3QgZXJyb3IpIHsKLSAgQVBQTF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICB0QlRBX0hEX1JFUE9SVF9FUlIqIHBfYnVmID0KLSAgICAgICh0QlRBX0hEX1JFUE9SVF9FUlIqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSERfUkVQT1JUX0VSUikpOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hEX0FQSV9SRVBPUlRfRVJST1JfRVZUOwotICBwX2J1Zi0+ZXJyb3IgPSBlcnJvcjsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0jZW5kaWYgLyogQlRBX0hEX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9idGEvaGQvYnRhX2hkX2ludC5oIGIvYnRhL2hkL2J0YV9oZF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4Y2VhYy4uMDAwMDAwMAotLS0gYS9idGEvaGQvYnRhX2hkX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA1LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBCVEEgSElEIERldmljZSBpbnRlcm5hbCBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRBX0hEX0lOVF9ICi0jZGVmaW5lIEJUQV9IRF9JTlRfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZF9hcGkuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hpZGRlZnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1lbnVtIHsKLSAgQlRBX0hEX0FQSV9SRUdJU1RFUl9BUFBfRVZUID0gQlRBX1NZU19FVlRfU1RBUlQoQlRBX0lEX0hEKSwKLSAgQlRBX0hEX0FQSV9VTlJFR0lTVEVSX0FQUF9FVlQsCi0gIEJUQV9IRF9BUElfQ09OTkVDVF9FVlQsCi0gIEJUQV9IRF9BUElfRElTQ09OTkVDVF9FVlQsCi0gIEJUQV9IRF9BUElfQUREX0RFVklDRV9FVlQsCi0gIEJUQV9IRF9BUElfUkVNT1ZFX0RFVklDRV9FVlQsCi0gIEJUQV9IRF9BUElfU0VORF9SRVBPUlRfRVZULAotICBCVEFfSERfQVBJX1JFUE9SVF9FUlJPUl9FVlQsCi0gIEJUQV9IRF9BUElfVkNfVU5QTFVHX0VWVCwKLSAgQlRBX0hEX0lOVF9PUEVOX0VWVCwKLSAgQlRBX0hEX0lOVF9DTE9TRV9FVlQsCi0gIEJUQV9IRF9JTlRfSU5UUl9EQVRBX0VWVCwKLSAgQlRBX0hEX0lOVF9HRVRfUkVQT1JUX0VWVCwKLSAgQlRBX0hEX0lOVF9TRVRfUkVQT1JUX0VWVCwKLSAgQlRBX0hEX0lOVF9TRVRfUFJPVE9DT0xfRVZULAotICBCVEFfSERfSU5UX1ZDX1VOUExVR19FVlQsCi0gIEJUQV9IRF9JTlRfU1VTUEVORF9FVlQsCi0gIEJUQV9IRF9JTlRfRVhJVF9TVVNQRU5EX0VWVCwKLQotICAvKiBoYW5kbGVkIG91dHNpZGUgc3RhdGUgbWFjaGluZSAqLwotICBCVEFfSERfQVBJX0VOQUJMRV9FVlQsCi0gIEJUQV9IRF9BUElfRElTQUJMRV9FVlQKLX07Ci10eXBlZGVmIHVpbnQxNl90IHRCVEFfSERfSU5UX0VWVDsKLQotI2RlZmluZSBCVEFfSERfSU5WQUxJRF9FVlQgKEJUQV9IRF9BUElfRElTQUJMRV9FVlQgKyAxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVEFfSERfQ0JBQ0sqIHBfY2JhY2s7Ci19IHRCVEFfSERfQVBJX0VOQUJMRTsKLQotI2RlZmluZSBCVEFfSERfQVBQX05BTUVfTEVOIDUwCi0jZGVmaW5lIEJUQV9IRF9BUFBfREVTQ1JJUFRJT05fTEVOIDUwCi0jZGVmaW5lIEJUQV9IRF9BUFBfUFJPVklERVJfTEVOIDUwCi0jZGVmaW5lIEJUQV9IRF9BUFBfREVTQ1JJUFRPUl9MRU4gSElERF9BUFBfREVTQ1JJUFRPUl9MRU4KLQotI2RlZmluZSBCVEFfSERfU1RBVEVfRElTQUJMRUQgMHgwMAotI2RlZmluZSBCVEFfSERfU1RBVEVfRU5BQkxFRCAweDAxCi0jZGVmaW5lIEJUQV9IRF9TVEFURV9JRExFIDB4MDIKLSNkZWZpbmUgQlRBX0hEX1NUQVRFX0NPTk5FQ1RFRCAweDAzCi0jZGVmaW5lIEJUQV9IRF9TVEFURV9ESVNBQkxJTkcgMHgwNAotI2RlZmluZSBCVEFfSERfU1RBVEVfUkVNT1ZJTkcgMHgwNQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIGNoYXIgbmFtZVtCVEFfSERfQVBQX05BTUVfTEVOXTsKLSAgY2hhciBkZXNjcmlwdGlvbltCVEFfSERfQVBQX0RFU0NSSVBUSU9OX0xFTl07Ci0gIGNoYXIgcHJvdmlkZXJbQlRBX0hEX0FQUF9QUk9WSURFUl9MRU5dOwotICB1aW50OF90IHN1YmNsYXNzOwotICB1aW50MTZfdCBkX2xlbjsKLSAgdWludDhfdCBkX2RhdGFbQlRBX0hEX0FQUF9ERVNDUklQVE9SX0xFTl07Ci0KLSAgdEJUQV9IRF9RT1NfSU5GTyBpbl9xb3M7Ci0gIHRCVEFfSERfUU9TX0lORk8gb3V0X3FvczsKLX0gdEJUQV9IRF9SRUdJU1RFUl9BUFA7Ci0KLSNkZWZpbmUgQlRBX0hEX1JFUE9SVF9MRU4gSElEX0RFVl9NVFVfU0laRQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIGJvb2wgdXNlX2ludHI7Ci0gIHVpbnQ4X3QgdHlwZTsKLSAgdWludDhfdCBpZDsKLSAgdWludDE2X3QgbGVuOwotICB1aW50OF90IGRhdGFbQlRBX0hEX1JFUE9SVF9MRU5dOwotfSB0QlRBX0hEX1NFTkRfUkVQT1JUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLX0gdEJUQV9IRF9ERVZJQ0VfQ1RSTDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50OF90IGVycm9yOwotfSB0QlRBX0hEX1JFUE9SVF9FUlI7Ci0KLS8qIHVuaW9uIG9mIGFsbCBldmVudCBkYXRhIHR5cGVzICovCi10eXBlZGVmIHVuaW9uIHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUQV9IRF9BUElfRU5BQkxFIGFwaV9lbmFibGU7Ci0gIHRCVEFfSERfUkVHSVNURVJfQVBQIHJlZ2lzdGVyX2FwcDsKLSAgdEJUQV9IRF9TRU5EX1JFUE9SVCBzZW5kX3JlcG9ydDsKLSAgdEJUQV9IRF9ERVZJQ0VfQ1RSTCBkZXZpY2VfY3RybDsKLSAgdEJUQV9IRF9SRVBPUlRfRVJSIHJlcG9ydF9lcnI7Ci19IHRCVEFfSERfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIHVpbnQzMl90IGRhdGE7Ci0gIEJUX0hEUiogcF9kYXRhOwotfSB0QlRBX0hEX0NCQUNLX0RBVEE7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1haW4gQ29udHJvbCBCbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9IRF9DQkFDSyogcF9jYmFjazsKLSAgdWludDMyX3Qgc2RwX2hhbmRsZTsKLSAgdWludDhfdCB0cmFjZV9sZXZlbDsKLSAgdWludDhfdCBzdGF0ZTsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBib29sIHVzZV9yZXBvcnRfaWQ7Ci0gIGJvb2wgYm9vdF9tb2RlOwotICBib29sIHZjX3VucGx1ZzsKLSAgYm9vbCBkaXNhYmxlX3c0X2Nsb3NlOwotfSB0QlRBX0hEX0NCOwotCi1leHRlcm4gdEJUQV9IRF9DQiBidGFfaGRfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgYnRhX2hkX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2hkX2FwaV9lbmFibGUodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX2FwaV9kaXNhYmxlKHZvaWQpOwotCi1leHRlcm4gdm9pZCBidGFfaGRfcmVnaXN0ZXJfYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZF91bnJlZ2lzdGVyX2FjdCgpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX3VucmVnaXN0ZXIyX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGRfY29ubmVjdF9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX2Rpc2Nvbm5lY3RfYWN0KCk7Ci1leHRlcm4gdm9pZCBidGFfaGRfYWRkX2RldmljZV9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX3JlbW92ZV9kZXZpY2VfYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZF9zZW5kX3JlcG9ydF9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX3JlcG9ydF9lcnJvcl9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX3ZjX3VucGx1Z19hY3QoKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2hkX29wZW5fYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZF9jbG9zZV9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX2ludHJfZGF0YV9hY3QodEJUQV9IRF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hkX2dldF9yZXBvcnRfYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZF9zZXRfcmVwb3J0X2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGRfc2V0X3Byb3RvY29sX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGRfdmNfdW5wbHVnX2RvbmVfYWN0KHRCVEFfSERfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZF9zdXNwZW5kX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGRfZXhpdF9zdXNwZW5kX2FjdCh0QlRBX0hEX0RBVEEqIHBfZGF0YSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRhL2hkL2J0YV9oZF9tYWluLmNjIGIvYnRhL2hkL2J0YV9oZF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZmM2ZjLi4wMDAwMDAwCi0tLSBhL2J0YS9oZC9idGFfaGRfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEhJRCBob3N0IG1haW4gZnVuY3Rpb25zIGFuZCBzdGF0ZSBtYWNoaW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0vLyBCVEFfSERfSU5DTFVERUQKLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpZiBkZWZpbmVkKEJUQV9IRF9JTkNMVURFRCkgJiYgKEJUQV9IRF9JTkNMVURFRCA9PSBUUlVFKQotCi0jaW5jbHVkZSAiYnRhL2hkL2J0YV9oZF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbnN0YW50cyBhbmQgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSB7Ci0gIEJUQV9IRF9JTklUX1NULAotICBCVEFfSERfSURMRV9TVCwgICAgICAgICAgICAgIC8qIG5vdCBjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gKi8KLSAgQlRBX0hEX0NPTk5fU1QsICAgICAgICAgICAgICAvKiBob3N0IGNvbm5lY3RlZCAqLwotICBCVEFfSERfVFJBTlNJRU5UX1RPX0lOSVRfU1QsIC8qIHRyYW5zaWVudCBzdGF0ZTogZ29pbmcgYmFjayBmcm9tIENPTk4gdG8gSU5JVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotdHlwZWRlZiB1aW50OF90IHRCVEFfSERfU1RBVEU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9IRF9DQiBidGFfaGRfY2I7Ci0KLXN0YXRpYyB0QlRBX0hEX1NUQVRFIGdldF9zdGF0ZSgpIHsgcmV0dXJuIGJ0YV9oZF9jYi5zdGF0ZTsgfQotCi1zdGF0aWMgdm9pZCBzZXRfc3RhdGUodEJUQV9IRF9TVEFURSBzdGF0ZSkgeyBidGFfaGRfY2Iuc3RhdGUgPSBzdGF0ZTsgfQotCi1zdGF0aWMgdm9pZCBidGFfaGRfYmV0dGVyX3N0YXRlX21hY2hpbmUodWludDE2X3QgZXZlbnQsIHRCVEFfSERfREFUQSogcF9kYXRhKSB7Ci0gIHN3aXRjaCAoZ2V0X3N0YXRlKCkpIHsKLSAgICBjYXNlIEJUQV9IRF9JTklUX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9IRF9BUElfUkVHSVNURVJfQVBQX0VWVDoKLSAgICAgICAgICBzZXRfc3RhdGUoQlRBX0hEX0lETEVfU1QpOwotICAgICAgICAgIGJ0YV9oZF9yZWdpc3Rlcl9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfQVBJX0FERF9ERVZJQ0VfRVZUOgotICAgICAgICAgIGJ0YV9oZF9hZGRfZGV2aWNlX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9BUElfUkVNT1ZFX0RFVklDRV9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX3JlbW92ZV9kZXZpY2VfYWN0KHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRF9JRExFX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9IRF9BUElfVU5SRUdJU1RFUl9BUFBfRVZUOgotICAgICAgICAgIHNldF9zdGF0ZShCVEFfSERfSU5JVF9TVCk7Ci0gICAgICAgICAgYnRhX2hkX3VucmVnaXN0ZXJfYWN0KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0FQSV9DT05ORUNUX0VWVDoKLSAgICAgICAgICBidGFfaGRfY29ubmVjdF9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfQVBJX0RJU0NPTk5FQ1RfRVZUOgotICAgICAgICAgIGJ0YV9oZF9kaXNjb25uZWN0X2FjdCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9BUElfQUREX0RFVklDRV9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX2FkZF9kZXZpY2VfYWN0KHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0FQSV9SRU1PVkVfREVWSUNFX0VWVDoKLSAgICAgICAgICBidGFfaGRfcmVtb3ZlX2RldmljZV9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfQVBJX1NFTkRfUkVQT1JUX0VWVDoKLSAgICAgICAgICBidGFfaGRfc2VuZF9yZXBvcnRfYWN0KHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0lOVF9PUEVOX0VWVDoKLSAgICAgICAgICBzZXRfc3RhdGUoQlRBX0hEX0NPTk5fU1QpOwotICAgICAgICAgIGJ0YV9oZF9vcGVuX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9JTlRfQ0xPU0VfRVZUOgotICAgICAgICAgIGJ0YV9oZF9jbG9zZV9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hEX0NPTk5fU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0FQSV9VTlJFR0lTVEVSX0FQUF9FVlQ6Ci0gICAgICAgICAgc2V0X3N0YXRlKEJUQV9IRF9UUkFOU0lFTlRfVE9fSU5JVF9TVCk7Ci0gICAgICAgICAgYnRhX2hkX2Rpc2Nvbm5lY3RfYWN0KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0FQSV9ESVNDT05ORUNUX0VWVDoKLSAgICAgICAgICBidGFfaGRfZGlzY29ubmVjdF9hY3QoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfQVBJX0FERF9ERVZJQ0VfRVZUOgotICAgICAgICAgIGJ0YV9oZF9hZGRfZGV2aWNlX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9BUElfUkVNT1ZFX0RFVklDRV9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX3JlbW92ZV9kZXZpY2VfYWN0KHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0FQSV9TRU5EX1JFUE9SVF9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX3NlbmRfcmVwb3J0X2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9BUElfUkVQT1JUX0VSUk9SX0VWVDoKLSAgICAgICAgICBidGFfaGRfcmVwb3J0X2Vycm9yX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9BUElfVkNfVU5QTFVHX0VWVDoKLSAgICAgICAgICBidGFfaGRfdmNfdW5wbHVnX2FjdCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9JTlRfQ0xPU0VfRVZUOgotICAgICAgICAgIHNldF9zdGF0ZShCVEFfSERfSURMRV9TVCk7Ci0gICAgICAgICAgYnRhX2hkX2Nsb3NlX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9JTlRfSU5UUl9EQVRBX0VWVDoKLSAgICAgICAgICBidGFfaGRfaW50cl9kYXRhX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9JTlRfR0VUX1JFUE9SVF9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX2dldF9yZXBvcnRfYWN0KHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0lOVF9TRVRfUkVQT1JUX0VWVDoKLSAgICAgICAgICBidGFfaGRfc2V0X3JlcG9ydF9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfSU5UX1NFVF9QUk9UT0NPTF9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX3NldF9wcm90b2NvbF9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfSU5UX1ZDX1VOUExVR19FVlQ6Ci0gICAgICAgICAgc2V0X3N0YXRlKEJUQV9IRF9JRExFX1NUKTsKLSAgICAgICAgICBidGFfaGRfdmNfdW5wbHVnX2RvbmVfYWN0KHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hEX0lOVF9TVVNQRU5EX0VWVDoKLSAgICAgICAgICBidGFfaGRfc3VzcGVuZF9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSERfSU5UX0VYSVRfU1VTUEVORF9FVlQ6Ci0gICAgICAgICAgYnRhX2hkX2V4aXRfc3VzcGVuZF9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hEX1RSQU5TSUVOVF9UT19JTklUX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9IRF9JTlRfQ0xPU0VfRVZUOgotICAgICAgICAgIHNldF9zdGF0ZShCVEFfSERfSU5JVF9TVCk7Ci0gICAgICAgICAgYnRhX2hkX3VucmVnaXN0ZXIyX2FjdChwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9IRF9JTlRfVkNfVU5QTFVHX0VWVDoKLSAgICAgICAgICBzZXRfc3RhdGUoQlRBX0hEX0lOSVRfU1QpOwotICAgICAgICAgIGJ0YV9oZF91bnJlZ2lzdGVyMl9hY3QocF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGRfaGRsX2V2ZW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBISUQgZGV2aWNlIG1haW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2hkX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKSB7Ci0gIEFQUExfVFJBQ0VfQVBJKCIlczogcF9tc2ctPmV2ZW50PSVkIiwgX19mdW5jX18sIHBfbXNnLT5ldmVudCk7Ci0KLSAgc3dpdGNoIChwX21zZy0+ZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9IRF9BUElfRU5BQkxFX0VWVDoKLSAgICAgIGJ0YV9oZF9hcGlfZW5hYmxlKCh0QlRBX0hEX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSERfQVBJX0RJU0FCTEVfRVZUOgotICAgICAgaWYgKGJ0YV9oZF9jYi5zdGF0ZSA9PSBCVEFfSERfQ09OTl9TVCkgewotICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBob3N0IGNvbm5lY3RlZCwgZGlzY29ubmVjdCBiZWZvcmUgZGlzYWJsaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLQotICAgICAgICAvLyB1bnJlZ2lzdGVyIChhbmQgZGlzY29ubmVjdCkKLSAgICAgICAgYnRhX2hkX2NiLmRpc2FibGVfdzRfY2xvc2UgPSBUUlVFOwotICAgICAgICBidGFfaGRfYmV0dGVyX3N0YXRlX21hY2hpbmUoQlRBX0hEX0FQSV9VTlJFR0lTVEVSX0FQUF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUQV9IRF9EQVRBKilwX21zZyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGFfaGRfYXBpX2Rpc2FibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJ0YV9oZF9iZXR0ZXJfc3RhdGVfbWFjaGluZShwX21zZy0+ZXZlbnQsICh0QlRBX0hEX0RBVEEqKXBfbXNnKTsKLSAgfQotICByZXR1cm4gKFRSVUUpOwotfQotCi0jZW5kaWYgLyogQlRBX0hEX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9idGEvaGVhcmluZ19haWQvaGVhcmluZ19haWQuY2MgYi9idGEvaGVhcmluZ19haWQvaGVhcmluZ19haWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzBhYzMuLjAwMDAwMDAKLS0tIGEvYnRhL2hlYXJpbmdfYWlkL2hlYXJpbmdfYWlkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRhX2hlYXJpbmdfYWlkX2FwaS5oIgotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPiAgLy8gSGV4RW5jb2RlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9nYXR0X2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9nYXR0X3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2hlYXJpbmdfYWlkX2FwaS5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJlbWJkcnYvZzcyMi9nNzIyX2VuY19kZWMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIgICAgICAgIC8vIEJUTV9SZWFkUlNTSQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaV90eXBlcy5oIiAgLy8gdEJUTV9SU1NJX1JFU1VMVAotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIgIC8vIEwyQ0FQX01JTl9PRkZTRVQKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJhc2U6OkNsb3N1cmU7Ci11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci11c2luZyBibHVldG9vdGg6OmhlYXJpbmdfYWlkOjpDb25uZWN0aW9uU3RhdGU7Ci0KLS8vIFRoZSBNSU5fQ0VfTEVOIHBhcmFtZXRlciBmb3IgQ29ubmVjdGlvbiBQYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50Ci0vLyBDb25uZWN0aW9uIEludGVydmFsCi1jb25zdGV4cHIgdWludDE2X3QgTUlOX0NFX0xFTl8xME1TX0NJID0gMHgwMDA2OwotY29uc3RleHByIHVpbnQxNl90IE1JTl9DRV9MRU5fMjBNU19DSSA9IDB4MDAwQzsKLWNvbnN0ZXhwciB1aW50MTZfdCBDT05ORUNUSU9OX0lOVEVSVkFMXzEwTVNfUEFSQU0gPSAweDAwMDg7Ci1jb25zdGV4cHIgdWludDE2X3QgQ09OTkVDVElPTl9JTlRFUlZBTF8yME1TX1BBUkFNID0gMHgwMDEwOwotCi12b2lkIGJ0aWZfc3RvcmFnZV9hZGRfaGVhcmluZ19haWQoY29uc3QgSGVhcmluZ0RldmljZSYgZGV2X2luZm8pOwotYm9vbCBidGlmX3N0b3JhZ2VfZ2V0X2hlYXJpbmdfYWlkX3Byb3AoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCogY2FwYWJpbGl0aWVzLCB1aW50NjRfdCogaGlfc3luY19pZCwKLSAgICB1aW50MTZfdCogcmVuZGVyX2RlbGF5LCB1aW50MTZfdCogcHJlcGFyYXRpb25fZGVsYXksIHVpbnQxNl90KiBjb2RlY3MpOwotCi1jb25zdGV4cHIgdWludDhfdCBDT0RFQ19HNzIyXzE2S0haID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IENPREVDX0c3MjJfMjRLSFogPSAweDAyOwotCi0vLyBhdWRpbyBjb250cm9sIHBvaW50IG9wY29kZXMKLWNvbnN0ZXhwciB1aW50OF90IENPTlRST0xfUE9JTlRfT1BfU1RBUlQgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgQ09OVFJPTF9QT0lOVF9PUF9TVE9QID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IENPTlRST0xfUE9JTlRfT1BfU1RBVEVfQ0hBTkdFID0gMHgwMzsKLQotY29uc3RleHByIHVpbnQ4X3QgU1RBVEVfQ0hBTkdFX09USEVSX1NJREVfRElTQ09OTkVDVEVEID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IFNUQVRFX0NIQU5HRV9PVEhFUl9TSURFX0NPTk5FQ1RFRCA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBTVEFURV9DSEFOR0VfQ09OTl9VUERBVEUgPSAweDAyOwotCi0vLyB1c2VkIHRvIG1hcmsgY3VycmVudF92b2x1bWUgYXMgbm90IHlldCBrbm93biwgb3IgcG9zc2libHkgb2xkCi1jb25zdGV4cHIgaW50OF90IFZPTFVNRV9VTktOT1dOID0gMTI3OwotY29uc3RleHByIGludDhfdCBWT0xVTUVfTUlOID0gLTEyNzsKLQotLy8gYXVkaW8gdHlwZQotY29uc3RleHByIHVpbnQ4X3QgQVVESU9UWVBFX1VOS05PV04gPSAweDAwOwotCi0vLyBTdGF0dXMgb2YgdGhlIG90aGVyIHNpZGUgSGVhcmluZyBBaWRzIGRldmljZQotY29uc3RleHByIHVpbnQ4X3QgT1RIRVJfU0lERV9OT1RfU1RSRUFNSU5HID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IE9USEVSX1NJREVfSVNfU1RSRUFNSU5HID0gMHgwMTsKLQotLy8gVGhpcyBBRERfUkVOREVSX0RFTEFZX0lOVEVSVkFMUyBpcyB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb24gaW50ZXJ2YWxzIHdoZW4KLS8vIHRoZSBhdWRpbyBkYXRhIHBhY2tldCBpcyBzZW5kIGJ5IEF1ZGlvIEVuZ2luZSB0byB3aGVuIHRoZSBIZWFyaW5nIEFpZHMgZGV2aWNlCi0vLyByZWNlaXZlZCBpdCBmcm9tIHRoZSBhaXIuIFdlIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyAyIGRhdGEgYnVmZmVyIHF1ZXVlZCBmcm9tCi0vLyBhdWRpbyBzdWJzeXN0ZW0gdG8gYmx1ZXRvb3RoIGNoaXAuIFRoZW4gdGhlIGVzdGltYXRlZCBPVEEgZGVsYXkgaXMgdHdvCi0vLyBjb25ubmVjdGlvbiBpbnRlcnZhbHMuCi1jb25zdGV4cHIgdWludDE2X3QgQUREX1JFTkRFUl9ERUxBWV9JTlRFUlZBTFMgPSA0OwotCi1uYW1lc3BhY2UgewotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi1VdWlkIEhFQVJJTkdfQUlEX1VVSUQgICAgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCJGREYwIik7Ci1VdWlkIFJFQURfT05MWV9QUk9QRVJUSUVTX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCI2MzMzNjUxZS1jNDgxLTRhM2UtOTE2OS03YzkwMmFhZDM3YmIiKTsKLVV1aWQgQVVESU9fQ09OVFJPTF9QT0lOVF9VVUlEICA9IFV1aWQ6OkZyb21TdHJpbmcoImYwZDRkZTdlLTRhODgtNDc2Yy05ZDlmLTE5MzdiMDk5NmNjMCIpOwotVXVpZCBBVURJT19TVEFUVVNfVVVJRCAgICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMzg2NjNmMWEtZTcxMS00Y2FjLWI2NDEtMzI2YjU2NDA0ODM3Iik7Ci1VdWlkIFZPTFVNRV9VVUlEICAgICAgICAgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMGU0Y2E5ZS1hYjE0LTQxZTQtODgyMy1mOWU3MGM3ZTkxZGYiKTsKLVV1aWQgTEVfUFNNX1VVSUQgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJkNDEwMzM5LTgyYjYtNDJhYS1iMzRlLWUyZTAxZGY4Y2MxYSIpOwotLy8gY2xhbmctZm9ybWF0IG9uCi0KLXZvaWQgaGVhcmluZ2FpZF9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyogcF9kYXRhKTsKLXZvaWQgZW5jcnlwdGlvbl9jYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzKiwgdEJUX1RSQU5TUE9SVCwgdm9pZCosIHRCVE1fU1RBVFVTKTsKLXZvaWQgcmVhZF9yc3NpX2NiKHZvaWQqIHBfdm9pZCk7Ci0KLWlubGluZSBCVF9IRFIqIG1hbGxvY19sMmNhcF9idWYodWludDE2X3QgbGVuKSB7Ci0gIEJUX0hEUiogbXNnID0gKEJUX0hEUiopb3NpX21hbGxvYyhCVF9IRFJfU0laRSArIEwyQ0FQX01JTl9PRkZTRVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC8qIExFLW9ubHksIG5vIG5lZWQgZm9yIEZDUyBoZXJlICovKTsKLSAgbXNnLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBtc2ctPmxlbiA9IGxlbjsKLSAgcmV0dXJuIG1zZzsKLX0KLQotaW5saW5lIHVpbnQ4X3QqIGdldF9sMmNhcF9zZHVfc3RhcnRfcHRyKEJUX0hEUiogbXNnKSB7Ci0gIHJldHVybiAodWludDhfdCopKG1zZykgKyBCVF9IRFJfU0laRSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci19Ci0KLWNsYXNzIEhlYXJpbmdBaWRJbXBsOwotSGVhcmluZ0FpZEltcGwqIGluc3RhbmNlOwotSGVhcmluZ0FpZEF1ZGlvUmVjZWl2ZXIqIGF1ZGlvUmVjZWl2ZXI7Ci0KLWNsYXNzIEhlYXJpbmdEZXZpY2VzIHsKLSBwdWJsaWM6Ci0gIHZvaWQgQWRkKEhlYXJpbmdEZXZpY2UgZGV2aWNlKSB7Ci0gICAgaWYgKEZpbmRCeUFkZHJlc3MoZGV2aWNlLmFkZHJlc3MpICE9IG51bGxwdHIpIHJldHVybjsKLQotICAgIGRldmljZXMucHVzaF9iYWNrKGRldmljZSk7Ci0gIH0KLQotICB2b2lkIFJlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VzLmVuZCgpOykgewotICAgICAgaWYgKGl0LT5hZGRyZXNzICE9IGFkZHJlc3MpIHsKLSAgICAgICAgKytpdDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGl0ID0gZGV2aWNlcy5lcmFzZShpdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgSGVhcmluZ0RldmljZSogRmluZEJ5QWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXMuYmVnaW4oKSwgZGV2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZhZGRyZXNzXShjb25zdCBIZWFyaW5nRGV2aWNlJiBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmFkZHJlc3MgPT0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gKGl0ZXIgPT0gZGV2aWNlcy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBIZWFyaW5nRGV2aWNlKiBGaW5kQnlDb25uSWQodWludDE2X3QgY29ubl9pZCkgewotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXZpY2VzLmJlZ2luKCksIGRldmljZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY29ubl9pZF0oY29uc3QgSGVhcmluZ0RldmljZSYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5jb25uX2lkID09IGNvbm5faWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgcmV0dXJuIChpdGVyID09IGRldmljZXMuZW5kKCkpID8gbnVsbHB0ciA6ICYoKml0ZXIpOwotICB9Ci0KLSAgSGVhcmluZ0RldmljZSogRmluZEJ5R2FwSGFuZGxlKHVpbnQxNl90IGdhcF9oYW5kbGUpIHsKLSAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2aWNlcy5iZWdpbigpLCBkZXZpY2VzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmdhcF9oYW5kbGVdKGNvbnN0IEhlYXJpbmdEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuZ2FwX2hhbmRsZSA9PSBnYXBfaGFuZGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIGJvb2wgSXNBbnlDb25uZWN0aW9uVXBkYXRlU3RhcnRlZCgpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGQgOiBkZXZpY2VzKSB7Ci0gICAgICBpZiAoZC5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMgPT0gU1RBUlRFRCkgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBTdGFydFJzc2lMb2coKSB7Ci0gICAgaW50IHJlYWRfcnNzaV9zdGFydF9pbnRlcnZhbF9jb3VudCA9IDA7Ci0KLSAgICBmb3IgKGF1dG8mIGQgOiBkZXZpY2VzKSB7Ci0gICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGQuYWRkcmVzcyA8PCAiLCByZWFkX3Jzc2lfY291bnQ9IiA8PCBkLnJlYWRfcnNzaV9jb3VudDsKLQotICAgICAgLy8gUmVzZXQgdGhlIGNvdW50Ci0gICAgICBpZiAoZC5yZWFkX3Jzc2lfY291bnQgPD0gMCkgewotICAgICAgICBkLnJlYWRfcnNzaV9jb3VudCA9IFJFQURfUlNTSV9OVU1fVFJJRVM7Ci0gICAgICAgIGQubnVtX2ludGVydmFsc19zaW5jZV9sYXN0X3Jzc2lfcmVhZCA9IHJlYWRfcnNzaV9zdGFydF9pbnRlcnZhbF9jb3VudDsKLQotICAgICAgICAvLyBTcGFjZWQgYXBhcnQgdGhlIFJlYWQgUlNTSSBjb21tYW5kcyB0byB0aGUgQlQgY29udHJvbGxlci4KLSAgICAgICAgcmVhZF9yc3NpX3N0YXJ0X2ludGVydmFsX2NvdW50ICs9IFBFUklPRF9UT19SRUFEX1JTU0lfSU5fSU5URVJWQUxTIC8gMjsKLSAgICAgICAgcmVhZF9yc3NpX3N0YXJ0X2ludGVydmFsX2NvdW50ICU9IFBFUklPRF9UT19SRUFEX1JTU0lfSU5fSU5URVJWQUxTOwotCi0gICAgICAgIHN0ZDo6ZGVxdWU8cnNzaV9sb2c+JiByc3NpX2xvZ3MgPSBkLmF1ZGlvX3N0YXRzLnJzc2lfaGlzdG9yeTsKLSAgICAgICAgaWYgKHJzc2lfbG9ncy5zaXplKCkgPj0gTUFYX1JTU0lfSElTVE9SWSkgewotICAgICAgICAgIHJzc2lfbG9ncy5wb3BfZnJvbnQoKTsKLSAgICAgICAgfQotICAgICAgICByc3NpX2xvZ3MuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc2l6ZV90IHNpemUoKSB7IHJldHVybiAoZGV2aWNlcy5zaXplKCkpOyB9Ci0KLSAgc3RkOjp2ZWN0b3I8SGVhcmluZ0RldmljZT4gZGV2aWNlczsKLX07Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3JwdF9jdGxfY2ZnX2NiKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYW5kbGU9IiA8PCBoYW5kbGUgPDwgIiwgY29ubl9pZD0iIDw8IGNvbm5faWQKLSAgICAgICAgICAgICAgIDw8ICIsIHN0YXR1cz0iIDw8IGxvZ2hleChzdGF0aWNfY2FzdDx1aW50OF90PihzdGF0dXMpKQotICAgICAgICAgICAgICAgPDwgIiwgbGVuZ3RoPSIgPDwgbGVuOwotICB9Ci19Ci0KLWc3MjJfZW5jb2RlX3N0YXRlX3QqIGVuY29kZXJfc3RhdGVfbGVmdCA9IG51bGxwdHI7Ci1nNzIyX2VuY29kZV9zdGF0ZV90KiBlbmNvZGVyX3N0YXRlX3JpZ2h0ID0gbnVsbHB0cjsKLQotaW5saW5lIHZvaWQgZW5jb2Rlcl9zdGF0ZV9pbml0KCkgewotICBpZiAoZW5jb2Rlcl9zdGF0ZV9sZWZ0ICE9IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZW5jb2RlciBhbHJlYWR5IGluaXRpYWxpemVkIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZW5jb2Rlcl9zdGF0ZV9sZWZ0ID0gZzcyMl9lbmNvZGVfaW5pdChudWxscHRyLCA2NDAwMCwgRzcyMl9QQUNLRUQpOwotICBlbmNvZGVyX3N0YXRlX3JpZ2h0ID0gZzcyMl9lbmNvZGVfaW5pdChudWxscHRyLCA2NDAwMCwgRzcyMl9QQUNLRUQpOwotfQotCi1pbmxpbmUgdm9pZCBlbmNvZGVyX3N0YXRlX3JlbGVhc2UoKSB7Ci0gIGlmIChlbmNvZGVyX3N0YXRlX2xlZnQgIT0gbnVsbHB0cikgewotICAgIGc3MjJfZW5jb2RlX3JlbGVhc2UoZW5jb2Rlcl9zdGF0ZV9sZWZ0KTsKLSAgICBlbmNvZGVyX3N0YXRlX2xlZnQgPSBudWxscHRyOwotICAgIGc3MjJfZW5jb2RlX3JlbGVhc2UoZW5jb2Rlcl9zdGF0ZV9yaWdodCk7Ci0gICAgZW5jb2Rlcl9zdGF0ZV9yaWdodCA9IG51bGxwdHI7Ci0gIH0KLX0KLQotY2xhc3MgSGVhcmluZ0FpZEltcGwgOiBwdWJsaWMgSGVhcmluZ0FpZCB7Ci0gcHJpdmF0ZToKLSAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBBdWRpbyBTZXJ2aWNlIGhhcyByZXN1bWVkIGF1ZGlvIHBsYXliYWNrCi0gIGJvb2wgYXVkaW9fcnVubmluZzsKLSAgLy8gRm9yIFRlc3Rpbmc6IG92ZXJ3cml0ZSB0aGUgTUlOX0NFX0xFTiBkdXJpbmcgY29ubmVjdGlvbiBwYXJhbWV0ZXIgdXBkYXRlcwotICB1aW50MTZfdCBvdmVyd3JpdGVfbWluX2NlX2xlbjsKLQotIHB1YmxpYzoKLSAgfkhlYXJpbmdBaWRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIEhlYXJpbmdBaWRJbXBsKGJsdWV0b290aDo6aGVhcmluZ19haWQ6OkhlYXJpbmdBaWRDYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgQ2xvc3VyZSBpbml0Q2IpCi0gICAgICA6IGF1ZGlvX3J1bm5pbmcoZmFsc2UpLAotICAgICAgICBvdmVyd3JpdGVfbWluX2NlX2xlbigwKSwKLSAgICAgICAgZ2F0dF9pZigwKSwKLSAgICAgICAgc2VxX2NvdW50ZXIoMCksCi0gICAgICAgIGN1cnJlbnRfdm9sdW1lKFZPTFVNRV9VTktOT1dOKSwKLSAgICAgICAgY2FsbGJhY2tzKGNhbGxiYWNrcyksCi0gICAgICAgIGNvZGVjX2luX3VzZSgwKSB7Ci0gICAgZGVmYXVsdF9kYXRhX2ludGVydmFsX21zID0gKHVpbnQxNl90KW9zaV9wcm9wZXJ0eV9nZXRfaW50MzIoCi0gICAgICAgICJwZXJzaXN0LmJsdWV0b290aC5oZWFyaW5nYWlkLmludGVydmFsIiwgKGludDMyX3QpSEFfSU5URVJWQUxfMjBfTVMpOwotICAgIGlmICgoZGVmYXVsdF9kYXRhX2ludGVydmFsX21zICE9IEhBX0lOVEVSVkFMXzEwX01TKSAmJgotICAgICAgICAoZGVmYXVsdF9kYXRhX2ludGVydmFsX21zICE9IEhBX0lOVEVSVkFMXzIwX01TKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBpbnZhbGlkIGludGVydmFsPSIgPDwgZGVmYXVsdF9kYXRhX2ludGVydmFsX21zCi0gICAgICAgICAgICAgICAgIDw8ICJtcy4gT3ZlcndyaXRpbmcgYmFjayB0byBkZWZhdWx0IjsKLSAgICAgIGRlZmF1bHRfZGF0YV9pbnRlcnZhbF9tcyA9IEhBX0lOVEVSVkFMXzIwX01TOwotICAgIH0KLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICA8PCAiLCBkZWZhdWx0X2RhdGFfaW50ZXJ2YWxfbXM9IiA8PCBkZWZhdWx0X2RhdGFfaW50ZXJ2YWxfbXM7Ci0KLSAgICBvdmVyd3JpdGVfbWluX2NlX2xlbiA9ICh1aW50MTZfdClvc2lfcHJvcGVydHlfZ2V0X2ludDMyKAotICAgICAgICAicGVyc2lzdC5ibHVldG9vdGguaGVhcmluZ2FpZG1pbmNlbGVuIiwgMCk7Ci0gICAgaWYgKG92ZXJ3cml0ZV9taW5fY2VfbGVuKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiOiBPdmVyd3JpdGVzIE1JTl9DRV9MRU49IiA8PCBvdmVyd3JpdGVfbWluX2NlX2xlbjsKLSAgICB9Ci0KLSAgICBCVEFfR0FUVENfQXBwUmVnaXN0ZXIoCi0gICAgICAgIGhlYXJpbmdhaWRfZ2F0dGNfY2FsbGJhY2ssCi0gICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICBbXShDbG9zdXJlIGluaXRDYiwgdWludDhfdCBjbGllbnRfaWQsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2FuJ3Qgc3RhcnQgSGVhcmluZyBBaWQgcHJvZmlsZSAtIG5vIGdhdHQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudHMgbGVmdCEiOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpbnN0YW5jZS0+Z2F0dF9pZiA9IGNsaWVudF9pZDsKLSAgICAgICAgICAgICAgaW5pdENiLlJ1bigpOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGluaXRDYiksIGZhbHNlKTsKLSAgfQotCi0gIHVpbnQxNl90IFVwZGF0ZUJsZUNvbm5QYXJhbXMoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8qIExpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IGRlcGVuZHMgb24gdGhlIGNob3NlbiBDb25uZWN0aW9uIEludGVydmFsICovCi0gICAgdWludDE2X3QgbWluX2NlX2xlbjsKLSAgICB1aW50MTZfdCBjb25uZWN0aW9uX2ludGVydmFsOwotCi0gICAgc3dpdGNoIChkZWZhdWx0X2RhdGFfaW50ZXJ2YWxfbXMpIHsKLSAgICAgIGNhc2UgSEFfSU5URVJWQUxfMTBfTVM6Ci0gICAgICAgIG1pbl9jZV9sZW4gPSBNSU5fQ0VfTEVOXzEwTVNfQ0k7Ci0gICAgICAgIGNvbm5lY3Rpb25faW50ZXJ2YWwgPSBDT05ORUNUSU9OX0lOVEVSVkFMXzEwTVNfUEFSQU07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBIQV9JTlRFUlZBTF8yMF9NUzoKLSAgICAgICAgbWluX2NlX2xlbiA9IE1JTl9DRV9MRU5fMjBNU19DSTsKLSAgICAgICAgY29ubmVjdGlvbl9pbnRlcnZhbCA9IENPTk5FQ1RJT05fSU5URVJWQUxfMjBNU19QQVJBTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6RXJyb3I6IGludmFsaWQgZGVmYXVsdF9kYXRhX2ludGVydmFsX21zPSIKLSAgICAgICAgICAgICAgICAgICA8PCBkZWZhdWx0X2RhdGFfaW50ZXJ2YWxfbXM7Ci0gICAgICAgIG1pbl9jZV9sZW4gPSBNSU5fQ0VfTEVOXzEwTVNfQ0k7Ci0gICAgICAgIGNvbm5lY3Rpb25faW50ZXJ2YWwgPSBDT05ORUNUSU9OX0lOVEVSVkFMXzEwTVNfUEFSQU07Ci0gICAgfQotCi0gICAgaWYgKG92ZXJ3cml0ZV9taW5fY2VfbGVuICE9IDApIHsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogbWluX2NlX2xlbj0iIDw8IG1pbl9jZV9sZW4KLSAgICAgICAgICAgICAgPDwgIiBpcyBvdmVyd3JpdHRlbiB0byAiIDw8IG92ZXJ3cml0ZV9taW5fY2VfbGVuOwotICAgICAgbWluX2NlX2xlbiA9IG92ZXJ3cml0ZV9taW5fY2VfbGVuOwotICAgIH0KLQotICAgIEwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcyhhZGRyZXNzLCBjb25uZWN0aW9uX2ludGVydmFsLCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEEsIDB4MDA2NCAvKjFzKi8sIG1pbl9jZV9sZW4sIG1pbl9jZV9sZW4pOwotICAgIHJldHVybiBjb25uZWN0aW9uX2ludGVydmFsOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYWRkcmVzczsKLSAgICBoZWFyaW5nRGV2aWNlcy5BZGQoSGVhcmluZ0RldmljZShhZGRyZXNzLCB0cnVlKSk7Ci0gICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9pZiwgYWRkcmVzcywgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCBBZGRUb0FjY2VwdGxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgaGVhcmluZ0RldmljZXMuQWRkKEhlYXJpbmdEZXZpY2UoYWRkcmVzcywgdHJ1ZSkpOwotICAgIEJUQV9HQVRUQ19PcGVuKGdhdHRfaWYsIGFkZHJlc3MsIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLQotICB2b2lkIEFkZEZyb21TdG9yYWdlKGNvbnN0IEhlYXJpbmdEZXZpY2UmIGRldl9pbmZvLCB1aW50MTZfdCBpc19hY2NlcHRsaXN0ZWQpIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgZGV2X2luZm8uYWRkcmVzcwotICAgICAgICAgICAgIDw8ICIsIGhpU3luY0lkPSIgPDwgbG9naGV4KGRldl9pbmZvLmhpX3N5bmNfaWQpCi0gICAgICAgICAgICAgPDwgIiwgaXNBY2NlcHRsaXN0ZWQ9IiA8PCBpc19hY2NlcHRsaXN0ZWQ7Ci0gICAgaWYgKGlzX2FjY2VwdGxpc3RlZCkgewotICAgICAgaGVhcmluZ0RldmljZXMuQWRkKGRldl9pbmZvKTsKLQotICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGluY3JlYXNlIHRoZSBzY2FubmluZyB3aW5kb3cgZm9yIGZldyBzZWNvbmRzLCB0byBnZXQKLSAgICAgIC8vIGZhc3RlciBpbml0aWFsIGNvbm5lY3Rpb24sIHNhbWUgYWZ0ZXIgaGVhcmluZyBhaWQgZGlzY29ubmVjdHMsIGkuZS4KLSAgICAgIC8vIEJUTV9CbGVTZXRDb25uU2NhblBhcmFtcygyMDQ4LCAxMDI0KTsKLQotICAgICAgLyogYWRkIGRldmljZSBpbnRvIEJHIGNvbm5lY3Rpb24gdG8gYWNjZXB0IHJlbW90ZSBpbml0aWF0ZWQgY29ubmVjdGlvbiAqLwotICAgICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9pZiwgZGV2X2luZm8uYWRkcmVzcywgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBjYWxsYmFja3MtPk9uRGV2aWNlQXZhaWxhYmxlKGRldl9pbmZvLmNhcGFiaWxpdGllcywgZGV2X2luZm8uaGlfc3luY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLmFkZHJlc3MpOwotICB9Ci0KLSAgaW50IEdldERldmljZUNvdW50KCkgeyByZXR1cm4gKGhlYXJpbmdEZXZpY2VzLnNpemUoKSk7IH0KLQotICB2b2lkIE9uR2F0dENvbm5lY3RlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBjbGllbnRfaWYsIFJhd0FkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHVpbnQxNl90IG10dSkgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogYWRkcmVzcz0iIDw8IGFkZHJlc3MgPDwgIiwgY29ubl9pZD0iIDw8IGNvbm5faWQ7Ci0KLSAgICBIZWFyaW5nRGV2aWNlKiBoZWFyaW5nRGV2aWNlID0gaGVhcmluZ0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWhlYXJpbmdEZXZpY2UpIHsKLSAgICAgIC8qIFdoZW4gSGVhcmluZyBBaWQgaXMgcXVpY2tseSBkaXNhYmxlZCBhbmQgZW5hYmxlZCBpbiBzZXR0aW5ncywgdGhpcyBjYXNlCi0gICAgICAgKiBtaWdodCBoYXBwZW4gKi8KLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2xvc2luZyBjb25uZWN0aW9uIHRvIG5vbiBoZWFyaW5nLWFpZCBkZXZpY2UsIGFkZHJlc3M9IgotICAgICAgICAgICAgICAgICAgIDw8IGFkZHJlc3M7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIGlmICghaGVhcmluZ0RldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSkgewotICAgICAgICAvLyBhY2NlcHRsaXN0IGNvbm5lY3Rpb24gZmFpbGVkLCB0aGF0J3Mgb2suCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgTE9HKElORk8pIDw8ICJGYWlsZWQgdG8gY29ubmVjdCB0byBIZWFyaW5nIEFpZCBkZXZpY2UiOwotICAgICAgaGVhcmluZ0RldmljZXMuUmVtb3ZlKGFkZHJlc3MpOwotICAgICAgY2FsbGJhY2tzLT5PbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaGVhcmluZ0RldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSA9IGZhbHNlOwotICAgIGhlYXJpbmdEZXZpY2UtPmNvbm5faWQgPSBjb25uX2lkOwotCi0gICAgLyogV2UgbXVzdCB1cGRhdGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIG9uZSBhdCBhIHRpbWUsIG90aGVyd2lzZSBhbmNob3IKLSAgICAgKiBwb2ludCAoc3RhcnQgb2YgY29ubmVjdGlvbiBldmVudCkgZm9yIHR3byBkZXZpY2VzIGNhbiBiZSB0b28gY2xvc2UgdG8KLSAgICAgKiBlYWNoIG90aGVyLiBIZXJlLCBieSBzZXR0aW5nIG1pbl9jZV9sZW49bWF4X2NlX2xlbj1YLCB3ZSBmb3JjZSBjb250cm9sbGVyCi0gICAgICogdG8gbW92ZSBhbmNob3IgcG9pbnQgb2YgYm90aCBjb25uZWN0aW9ucyBhd2F5IGZyb20gZWFjaCBvdGhlciwgdG8gbWFrZQotICAgICAqIHN1cmUgd2UnbGwgYmUgYWJsZSB0byBmaXQgYWxsIHRoZSBkYXRhIHdlIHdhbnQgaW4gb25lIGNvbm5lY3Rpb24gZXZlbnQuCi0gICAgICovCi0gICAgYm9vbCBhbnlfdXBkYXRlX3BlbmRpbmcgPSBoZWFyaW5nRGV2aWNlcy5Jc0FueUNvbm5lY3Rpb25VcGRhdGVTdGFydGVkKCk7Ci0gICAgLy8gbWFyayB0aGUgZGV2aWNlIGFzIHBlbmRpbmcgY29ubmVjdGlvbiB1cGRhdGUuIElmIHdlIGRvbid0IHN0YXJ0IHRoZQotICAgIC8vIHVwZGF0ZSBub3csIGl0J2xsIGJlIHN0YXJ0ZWQgb25jZSBjdXJyZW50IGRldmljZSBmaW5pc2hlcy4KLSAgICBpZiAoIWFueV91cGRhdGVfcGVuZGluZykgewotICAgICAgaGVhcmluZ0RldmljZS0+Y29ubmVjdGlvbl91cGRhdGVfc3RhdHVzID0gU1RBUlRFRDsKLSAgICAgIGhlYXJpbmdEZXZpY2UtPnJlcXVlc3RlZF9jb25uZWN0aW9uX2ludGVydmFsID0KLSAgICAgICAgICBVcGRhdGVCbGVDb25uUGFyYW1zKGFkZHJlc3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMgPSBBV0FJVElORzsKLSAgICB9Ci0KLSAgICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV8ybV9waHkoKSkgewotICAgICAgTE9HKElORk8pIDw8IGFkZHJlc3MgPDwgIiBzZXQgcHJlZmVycmVkIFBIWSB0byAyTSI7Ci0gICAgICBCVE1fQmxlU2V0UGh5KGFkZHJlc3MsIFBIWV9MRV8yTSwgUEhZX0xFXzJNLCAwKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgZGF0YSBsZW5ndGgKLSAgICAvLyBUT0RPKGpwYXdsb3dza2k6IGZvciAxNmtoeiBvbmx5IDg3IGlzIHJlcXVpcmVkLCBvcHRpbWl6ZQotICAgIEJUTV9TZXRCbGVEYXRhTGVuZ3RoKGFkZHJlc3MsIDE2Nyk7Ci0KLSAgICBpZiAoQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nKGFkZHJlc3MpKSB7Ci0gICAgICAvKiBpZiBzZWN1cml0eSBjb2xsaXNpb24gaGFwcGVuZWQsIHdhaXQgZm9yIGVuY3J5cHRpb24gZG9uZQotICAgICAgICogKEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQpICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogdmVyaWZ5IGJvbmQgKi8KLSAgICBpZiAoQlRNX0lzRW5jcnlwdGVkKGFkZHJlc3MsIEJUX1RSQU5TUE9SVF9MRSkpIHsKLSAgICAgIC8qIGlmIGxpbmsgaGFzIGJlZW4gZW5jcnlwdGVkICovCi0gICAgICBPbkVuY3J5cHRpb25Db21wbGV0ZShhZGRyZXNzLCB0cnVlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoQlRNX0lzTGlua0tleUtub3duKGFkZHJlc3MsIEJUX1RSQU5TUE9SVF9MRSkpIHsKLSAgICAgIC8qIGlmIGJvbmRlZCBhbmQgbGluayBub3QgZW5jcnlwdGVkICovCi0gICAgICBCVE1fU2V0RW5jcnlwdGlvbihhZGRyZXNzLCBCVF9UUkFOU1BPUlRfTEUsIGVuY3J5cHRpb25fY2FsbGJhY2ssIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX1NFQ19FTkNSWVBUKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvdGhlcndpc2UgbGV0IGl0IGdvIHRocm91Z2ggKi8KLSAgICBPbkVuY3J5cHRpb25Db21wbGV0ZShhZGRyZXNzLCB0cnVlKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uVXBkYXRlQ29tcGxldGUodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQyogcF9kYXRhKSB7Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWhlYXJpbmdEZXZpY2UpIHsKLSAgICAgIERWTE9HKDIpIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocF9kYXRhKSB7Ci0gICAgICBpZiAocF9kYXRhLT5jb25uX3VwZGF0ZS5zdGF0dXMgPT0gMCkgewotICAgICAgICBib29sIHNhbWVfY29ubl9pbnRlcnZhbCA9Ci0gICAgICAgICAgICAoaGVhcmluZ0RldmljZS0+cmVxdWVzdGVkX2Nvbm5lY3Rpb25faW50ZXJ2YWwgPT0KLSAgICAgICAgICAgICBwX2RhdGEtPmNvbm5fdXBkYXRlLmludGVydmFsKTsKLQotICAgICAgICBzd2l0Y2ggKGhlYXJpbmdEZXZpY2UtPmNvbm5lY3Rpb25fdXBkYXRlX3N0YXR1cykgewotICAgICAgICAgIGNhc2UgQ09NUExFVEVEOgotICAgICAgICAgICAgaWYgKCFzYW1lX2Nvbm5faW50ZXJ2YWwpIHsKLSAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBVbmV4cGVjdGVkIGNoYW5nZS4gUmVkby4gY29ubmVjdGlvbiBpbnRlcnZhbD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwX2RhdGEtPmNvbm5fdXBkYXRlLmludGVydmFsIDw8ICIsIGV4cGVjdGVkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGhlYXJpbmdEZXZpY2UtPnJlcXVlc3RlZF9jb25uZWN0aW9uX2ludGVydmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb25uX2lkPSIgPDwgY29ubl9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGhlYXJpbmdEZXZpY2UtPmNvbm5lY3Rpb25fdXBkYXRlX3N0YXR1czsKLSAgICAgICAgICAgICAgLy8gUmVkbyB0aGlzIGNvbm5lY3Rpb24gaW50ZXJ2YWwgY2hhbmdlLgotICAgICAgICAgICAgICBoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMgPSBBV0FJVElORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgU1RBUlRFRDoKLSAgICAgICAgICAgIGlmIChzYW1lX2Nvbm5faW50ZXJ2YWwpIHsKLSAgICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBDb25uZWN0aW9uIHVwZGF0ZSBjb21wbGV0ZWQuIGNvbm5faWQ9IiA8PCBjb25uX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBkZXZpY2U9IiA8PCBoZWFyaW5nRGV2aWNlLT5hZGRyZXNzOwotICAgICAgICAgICAgICBoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMgPSBDT01QTEVURUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IElnbm9yZWQuIERpZmZlcmVudCBjb25uZWN0aW9uIGludGVydmFsPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBfZGF0YS0+Y29ubl91cGRhdGUuaW50ZXJ2YWwgPDwgIiwgZXhwZWN0ZWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaGVhcmluZ0RldmljZS0+cmVxdWVzdGVkX2Nvbm5lY3Rpb25faW50ZXJ2YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGNvbm5faWQ9IiA8PCBjb25uX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaGVhcmluZ0RldmljZS0+Y29ubmVjdGlvbl91cGRhdGVfc3RhdHVzOwotICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcmlnaHQgQ29ubmVjdGlvbiBVcGRhdGUgQ29tcGxldGlvbi4KLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBBV0FJVElORzoKLSAgICAgICAgICBjYXNlIE5PTkU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluZm9ybSB0aGlzIHNpZGUgYW5kIG90aGVyIHNpZGUgZGV2aWNlIChpZiBhbnkpIG9mIENvbm5lY3Rpb24KLSAgICAgICAgLy8gVXBkYXRlcy4KLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29ubl91cGRhdGUoCi0gICAgICAgICAgICB7Q09OVFJPTF9QT0lOVF9PUF9TVEFURV9DSEFOR0UsIFNUQVRFX0NIQU5HRV9DT05OX1VQREFURSwKLSAgICAgICAgICAgICAodWludDhfdClwX2RhdGEtPmNvbm5fdXBkYXRlLmludGVydmFsfSk7Ci0gICAgICAgIHNlbmRfc3RhdGVfY2hhbmdlX3RvX290aGVyX3NpZGUoaGVhcmluZ0RldmljZSwgY29ubl91cGRhdGUpOwotICAgICAgICBzZW5kX3N0YXRlX2NoYW5nZShoZWFyaW5nRGV2aWNlLCBjb25uX3VwZGF0ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZXJyb3Igc3RhdHVzPSIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChzdGF0aWNfY2FzdDx1aW50OF90PihwX2RhdGEtPmNvbm5fdXBkYXRlLnN0YXR1cykpCi0gICAgICAgICAgICAgICAgICA8PCAiLCBjb25uX2lkPSIgPDwgY29ubl9pZAotICAgICAgICAgICAgICAgICAgPDwgIiwgZGV2aWNlPSIgPDwgaGVhcmluZ0RldmljZS0+YWRkcmVzcwotICAgICAgICAgICAgICAgICAgPDwgIiwgY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzPSIKLSAgICAgICAgICAgICAgICAgIDw8IGhlYXJpbmdEZXZpY2UtPmNvbm5lY3Rpb25fdXBkYXRlX3N0YXR1czsKLQotICAgICAgICBpZiAoaGVhcmluZ0RldmljZS0+Y29ubmVjdGlvbl91cGRhdGVfc3RhdHVzID09IFNUQVJURUQpIHsKLSAgICAgICAgICAvLyBSZWRvIHRoaXMgY29ubmVjdGlvbiBpbnRlcnZhbCBjaGFuZ2UuCi0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZWRvIENvbm5lY3Rpb24gSW50ZXJ2YWwgY2hhbmdlIjsKLSAgICAgICAgICBoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMgPSBBV0FJVElORzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMgPSBOT05FOwotICAgIH0KLQotICAgIGZvciAoYXV0byYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgaWYgKGRldmljZS5jb25uX2lkICYmIChkZXZpY2UuY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzID09IEFXQUlUSU5HKSkgewotICAgICAgICBkZXZpY2UuY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzID0gU1RBUlRFRDsKLSAgICAgICAgZGV2aWNlLnJlcXVlc3RlZF9jb25uZWN0aW9uX2ludGVydmFsID0KLSAgICAgICAgICAgIFVwZGF0ZUJsZUNvbm5QYXJhbXMoZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29tcGxldGlvbiBDYWxsYmFjayBmb3IgdGhlIFJTU0kgcmVhZCBvcGVyYXRpb24uCi0gIHZvaWQgT25SZWFkUnNzaUNvbXBsZXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludDhfdCByc3NpX3ZhbHVlKSB7Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFoZWFyaW5nRGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgYWRkcmVzcyA8PCAiLCByc3NpPSIgPDwgKGludClyc3NpX3ZhbHVlOwotCi0gICAgaWYgKGhlYXJpbmdEZXZpY2UtPnJlYWRfcnNzaV9jb3VudCA8PSAwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgPDwgIiwgaW52YWxpZCByZWFkX3Jzc2lfY291bnQ9IiA8PCBoZWFyaW5nRGV2aWNlLT5yZWFkX3Jzc2lfY291bnQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnNzaV9sb2cmIGxhc3RfbG9nX3NldCA9IGhlYXJpbmdEZXZpY2UtPmF1ZGlvX3N0YXRzLnJzc2lfaGlzdG9yeS5iYWNrKCk7Ci0KLSAgICBpZiAoaGVhcmluZ0RldmljZS0+cmVhZF9yc3NpX2NvdW50ID09IFJFQURfUlNTSV9OVU1fVFJJRVMpIHsKLSAgICAgIC8vIFN0b3JlIHRoZSB0aW1lc3RhbXAgb25seSBmb3IgdGhlIGZpcnN0IG9uZSBhZnRlciBwYWNrZXQgZmx1c2gKLSAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZsYXN0X2xvZ19zZXQudGltZXN0YW1wKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdG9yZSB0aW1lLiBkZXZpY2U9IiA8PCBhZGRyZXNzIDw8ICIsIHJzc2k9IiA8PCAoaW50KXJzc2lfdmFsdWU7Ci0gICAgfQotCi0gICAgbGFzdF9sb2dfc2V0LnJzc2kuZW1wbGFjZV9iYWNrKHJzc2lfdmFsdWUpOwotICAgIGhlYXJpbmdEZXZpY2UtPnJlYWRfcnNzaV9jb3VudC0tOwotICB9Ci0KLSAgdm9pZCBPbkVuY3J5cHRpb25Db21wbGV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBib29sIHN1Y2Nlc3MpIHsKLSAgICBIZWFyaW5nRGV2aWNlKiBoZWFyaW5nRGV2aWNlID0gaGVhcmluZ0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWhlYXJpbmdEZXZpY2UpIHsKLSAgICAgIERWTE9HKDIpIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgImVuY3J5cHRpb24gZmFpbGVkIjsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShoZWFyaW5nRGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIGlmIChoZWFyaW5nRGV2aWNlLT5maXJzdF9jb25uZWN0aW9uKSB7Ci0gICAgICAgIGNhbGxiYWNrcy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIGFkZHJlc3MpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzOwotCi0gICAgaWYgKGhlYXJpbmdEZXZpY2UtPmF1ZGlvX2NvbnRyb2xfcG9pbnRfaGFuZGxlICYmCi0gICAgICAgIGhlYXJpbmdEZXZpY2UtPmF1ZGlvX3N0YXR1c19oYW5kbGUgJiYKLSAgICAgICAgaGVhcmluZ0RldmljZS0+YXVkaW9fc3RhdHVzX2NjY19oYW5kbGUgJiYKLSAgICAgICAgaGVhcmluZ0RldmljZS0+dm9sdW1lX2hhbmRsZSAmJiBoZWFyaW5nRGV2aWNlLT5yZWFkX3BzbV9oYW5kbGUpIHsKLSAgICAgIC8vIFVzZSBjYWNoZWQgZGF0YSwganVtcCB0byByZWFkIFBTTQotICAgICAgUmVhZFBTTShoZWFyaW5nRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgaGVhcmluZ0RldmljZS0+Zmlyc3RfY29ubmVjdGlvbiA9IHRydWU7Ci0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoaGVhcmluZ0RldmljZS0+Y29ubl9pZCwgJkhFQVJJTkdfQUlEX1VVSUQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlQ2hhbmdlRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIEhlYXJpbmdEZXZpY2UqIGhlYXJpbmdEZXZpY2UgPSBoZWFyaW5nRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghaGVhcmluZ0RldmljZSkgewotICAgICAgVkxPRygyKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzPSIgPDwgYWRkcmVzczsKLSAgICBoZWFyaW5nRGV2aWNlLT5maXJzdF9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICBoZWFyaW5nRGV2aWNlLT5zZXJ2aWNlX2NoYW5nZWRfcmN2ZCA9IHRydWU7Ci0gICAgQnRhR2F0dFF1ZXVlOjpDbGVhbihoZWFyaW5nRGV2aWNlLT5jb25uX2lkKTsKLSAgICBpZiAoaGVhcmluZ0RldmljZS0+Z2FwX2hhbmRsZSkgewotICAgICAgR0FQX0Nvbm5DbG9zZShoZWFyaW5nRGV2aWNlLT5nYXBfaGFuZGxlKTsKLSAgICAgIGhlYXJpbmdEZXZpY2UtPmdhcF9oYW5kbGUgPSAwOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlRGlzY0RvbmVFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFoZWFyaW5nRGV2aWNlKSB7Ci0gICAgICBWTE9HKDIpIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGhlYXJpbmdEZXZpY2UtPnNlcnZpY2VfY2hhbmdlZF9yY3ZkKSB7Ci0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoaGVhcmluZ0RldmljZS0+Y29ubl9pZCwgJkhFQVJJTkdfQUlEX1VVSUQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlU2VhcmNoQ29tcGxldGUodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICAgIEhlYXJpbmdEZXZpY2UqIGhlYXJpbmdEZXZpY2UgPSBoZWFyaW5nRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgaWYgKCFoZWFyaW5nRGV2aWNlKSB7Ci0gICAgICBEVkxPRygyKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gS25vd24gZGV2aWNlLCBub3RoaW5nIHRvIGRvLgotICAgIGlmICghaGVhcmluZ0RldmljZS0+Zmlyc3RfY29ubmVjdGlvbikgcmV0dXJuOwotCi0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIC8qIGNsb3NlIGNvbm5lY3Rpb24gYW5kIHJlcG9ydCBzZXJ2aWNlIGRpc2NvdmVyeSBjb21wbGV0ZSB3aXRoIGVycm9yICovCi0gICAgICBMT0coRVJST1IpIDw8ICJTZXJ2aWNlIGRpc2NvdmVyeSBmYWlsZWQiOwotICAgICAgaWYgKGhlYXJpbmdEZXZpY2UtPmZpcnN0X2Nvbm5lY3Rpb24pIHsKLSAgICAgICAgY2FsbGJhY2tzLT5PbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFyaW5nRGV2aWNlLT5hZGRyZXNzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6Omxpc3Q8Z2F0dDo6U2VydmljZT4qIHNlcnZpY2VzID0gQlRBX0dBVFRDX0dldFNlcnZpY2VzKGNvbm5faWQpOwotCi0gICAgY29uc3QgZ2F0dDo6U2VydmljZSogc2VydmljZSA9IG51bGxwdHI7Ci0gICAgZm9yIChjb25zdCBnYXR0OjpTZXJ2aWNlJiB0bXAgOiAqc2VydmljZXMpIHsKLSAgICAgIGlmICh0bXAudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIsIGhhbmRsZT0iCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgodG1wLmhhbmRsZSk7Ci0gICAgICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UqIHNlcnZpY2VfY2hhbmdlZF9zZXJ2aWNlID0gJnRtcDsKLSAgICAgICAgZmluZF9zZXJ2ZXJfY2hhbmdlZF9jY2NfaGFuZGxlKGNvbm5faWQsIHNlcnZpY2VfY2hhbmdlZF9zZXJ2aWNlKTsKLSAgICAgIH0gZWxzZSBpZiAodG1wLnV1aWQgPT0gSEVBUklOR19BSURfVVVJRCkgewotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIEhlYXJpbmcgQWlkIHNlcnZpY2UsIGhhbmRsZT0iIDw8IGxvZ2hleCh0bXAuaGFuZGxlKTsKLSAgICAgICAgc2VydmljZSA9ICZ0bXA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFzZXJ2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJObyBIZWFyaW5nIEFpZCBzZXJ2aWNlIGZvdW5kIjsKLSAgICAgIGNhbGxiYWNrcy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXJpbmdEZXZpY2UtPmFkZHJlc3MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcykgewotICAgICAgaWYgKGNoYXJhYy51dWlkID09IFJFQURfT05MWV9QUk9QRVJUSUVTX1VVSUQpIHsKLSAgICAgICAgaWYgKCFidGlmX3N0b3JhZ2VfZ2V0X2hlYXJpbmdfYWlkX3Byb3AoCi0gICAgICAgICAgICAgICAgaGVhcmluZ0RldmljZS0+YWRkcmVzcywgJmhlYXJpbmdEZXZpY2UtPmNhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAmaGVhcmluZ0RldmljZS0+aGlfc3luY19pZCwgJmhlYXJpbmdEZXZpY2UtPnJlbmRlcl9kZWxheSwKLSAgICAgICAgICAgICAgICAmaGVhcmluZ0RldmljZS0+cHJlcGFyYXRpb25fZGVsYXksICZoZWFyaW5nRGV2aWNlLT5jb2RlY3MpKSB7Ci0gICAgICAgICAgVkxPRygyKSA8PCAiUmVhZGluZyByZWFkIG9ubHkgcHJvcGVydGllcyAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY2hhcmFjLnZhbHVlX2hhbmRsZSk7Ci0gICAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICAgIGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgIEhlYXJpbmdBaWRJbXBsOjpPblJlYWRPbmx5UHJvcGVydGllc1JlYWRTdGF0aWMsIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09IEFVRElPX0NPTlRST0xfUE9JTlRfVVVJRCkgewotICAgICAgICBoZWFyaW5nRGV2aWNlLT5hdWRpb19jb250cm9sX3BvaW50X2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIC8vIHN0b3JlIGF1ZGlvIGNvbnRyb2wgcG9pbnQhCi0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09IEFVRElPX1NUQVRVU19VVUlEKSB7Ci0gICAgICAgIGhlYXJpbmdEZXZpY2UtPmF1ZGlvX3N0YXR1c19oYW5kbGUgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotCi0gICAgICAgIGhlYXJpbmdEZXZpY2UtPmF1ZGlvX3N0YXR1c19jY2NfaGFuZGxlID0KLSAgICAgICAgICAgIGZpbmRfY2NjX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgaWYgKCFoZWFyaW5nRGV2aWNlLT5hdWRpb19zdGF0dXNfY2NjX2hhbmRsZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2Fubm90IGZpbmQgQXVkaW8gU3RhdHVzIENDQyBkZXNjcmlwdG9yIjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgPDwgIjogYXVkaW9fc3RhdHVzX2hhbmRsZT0iIDw8IGxvZ2hleChjaGFyYWMudmFsdWVfaGFuZGxlKQotICAgICAgICAgICAgICAgICAgPDwgIiwgY2NjPSIgPDwgbG9naGV4KGhlYXJpbmdEZXZpY2UtPmF1ZGlvX3N0YXR1c19jY2NfaGFuZGxlKTsKLSAgICAgIH0gZWxzZSBpZiAoY2hhcmFjLnV1aWQgPT0gVk9MVU1FX1VVSUQpIHsKLSAgICAgICAgaGVhcmluZ0RldmljZS0+dm9sdW1lX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09IExFX1BTTV9VVUlEKSB7Ci0gICAgICAgIGhlYXJpbmdEZXZpY2UtPnJlYWRfcHNtX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coV0FSTklORykgPDwgIlVua25vd24gY2hhcmFjdGVyaXN0aWMgZm91bmQ6IiA8PCBjaGFyYWMudXVpZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaGVhcmluZ0RldmljZS0+c2VydmljZV9jaGFuZ2VkX3JjdmQpIHsKLSAgICAgIGhlYXJpbmdEZXZpY2UtPnNlcnZpY2VfY2hhbmdlZF9yY3ZkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgUmVhZFBTTShoZWFyaW5nRGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgUmVhZFBTTShIZWFyaW5nRGV2aWNlKiBoZWFyaW5nRGV2aWNlKSB7Ci0gICAgaWYgKGhlYXJpbmdEZXZpY2UtPnJlYWRfcHNtX2hhbmRsZSkgewotICAgICAgTE9HKElORk8pIDw8ICJSZWFkaW5nIFBTTSAiIDw8IGxvZ2hleChoZWFyaW5nRGV2aWNlLT5yZWFkX3BzbV9oYW5kbGUpCi0gICAgICAgICAgICAgICAgPDwgIiwgZGV2aWNlPSIgPDwgaGVhcmluZ0RldmljZS0+YWRkcmVzczsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgIGhlYXJpbmdEZXZpY2UtPmNvbm5faWQsIGhlYXJpbmdEZXZpY2UtPnJlYWRfcHNtX2hhbmRsZSwKLSAgICAgICAgICBIZWFyaW5nQWlkSW1wbDo6T25Qc21SZWFkU3RhdGljLCBudWxscHRyKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uTm90aWZpY2F0aW9uRXZlbnQodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSkgewotICAgIEhlYXJpbmdEZXZpY2UqIGRldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWRldmljZSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGRldmljZS0+YXVkaW9fc3RhdHVzX2hhbmRsZSAhPSBoYW5kbGUpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBNaXNtYXRjaGVkIGhhbmRsZSwgIgotICAgICAgICAgICAgICAgIDw8IGxvZ2hleChkZXZpY2UtPmF1ZGlvX3N0YXR1c19oYW5kbGUpCi0gICAgICAgICAgICAgICAgPDwgIiE9IiA8PCBsb2doZXgoaGFuZGxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGVuIDwgMSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBEYXRhIExlbmd0aCB0b28gc21hbGwsIGxlbj0iIDw8IGxlbgotICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3RpbmcgYXQgbGVhc3QgMSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlWzBdICE9IDApIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgIDw8ICI6IEludmFsaWQgcmV0dXJuZWQgc3RhdHVzLiBkYXRhPSIgPDwgbG9naGV4KHZhbHVlWzBdKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIjogYXVkaW8gc3RhdHVzIHN1Y2Nlc3Mgbm90aWZpY2F0aW9uLiBjb21tYW5kX2Fja2VkPSIKLSAgICAgICAgICAgICAgPDwgZGV2aWNlLT5jb21tYW5kX2Fja2VkOwotICAgIGRldmljZS0+Y29tbWFuZF9hY2tlZCA9IHRydWU7Ci0gIH0KLQotICB2b2lkIE9uUmVhZE9ubHlQcm9wZXJ0aWVzUmVhZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgICBIZWFyaW5nRGV2aWNlKiBoZWFyaW5nRGV2aWNlID0gaGVhcmluZ0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghaGVhcmluZ0RldmljZSkgewotICAgICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgInVua25vd24gY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBiYXNlOjpIZXhFbmNvZGUodmFsdWUsIGxlbik7Ci0KLSAgICB1aW50OF90KiBwID0gdmFsdWU7Ci0KLSAgICB1aW50OF90IHZlcnNpb247Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHZlcnNpb24sIHApOwotCi0gICAgaWYgKHZlcnNpb24gIT0gMHgwMSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmtub3duIHZlcnNpb246ICIgPDwgbG9naGV4KHZlcnNpb24pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHZlcnNpb24gMHgwMSBvZiByZWFkIG9ubHkgcHJvcGVydGllczoKLSAgICBpZiAobGVuIDwgMTcpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiUmVhZCBvbmx5IHByb3BlcnRpZXMgdG9vIHNob3J0OiAiIDw8IGxvZ2hleChsZW4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90IGNhcGFiaWxpdGllczsKLSAgICBTVFJFQU1fVE9fVUlOVDgoY2FwYWJpbGl0aWVzLCBwKTsKLSAgICBoZWFyaW5nRGV2aWNlLT5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7Ci0gICAgYm9vbCBzaWRlID0gY2FwYWJpbGl0aWVzICYgQ0FQQUJJTElUWV9TSURFOwotICAgIGJvb2wgc3RhbmRhbG9uZSA9IGNhcGFiaWxpdGllcyAmIENBUEFCSUxJVFlfQklOQVVSQUw7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGNhcGFiaWxpdGllczogIiA8PCAoc2lkZSA/ICJyaWdodCIgOiAibGVmdCIpCi0gICAgICAgICAgICA8PCAiLCAiIDw8IChzdGFuZGFsb25lID8gImJpbmF1cmFsIiA6ICJtb25hdXJhbCIpOwotCi0gICAgaWYgKGNhcGFiaWxpdGllcyAmIENBUEFCSUxJVFlfUkVTRVJWRUQpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHJlc2VydmVkIGNhcGFiaWxpdGllcyBhcmUgc2V0IjsKLSAgICB9Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDY0KGhlYXJpbmdEZXZpY2UtPmhpX3N5bmNfaWQsIHApOwotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBoaVN5bmNJZDogIiA8PCBsb2doZXgoaGVhcmluZ0RldmljZS0+aGlfc3luY19pZCk7Ci0gICAgdWludDhfdCBmZWF0dXJlX21hcDsKLSAgICBTVFJFQU1fVE9fVUlOVDgoZmVhdHVyZV9tYXAsIHApOwotCi0gICAgU1RSRUFNX1RPX1VJTlQxNihoZWFyaW5nRGV2aWNlLT5yZW5kZXJfZGVsYXksIHApOwotICAgIFZMT0coMikgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICIgcmVuZGVyIGRlbGF5OiAiIDw8IGxvZ2hleChoZWFyaW5nRGV2aWNlLT5yZW5kZXJfZGVsYXkpOwotCi0gICAgU1RSRUFNX1RPX1VJTlQxNihoZWFyaW5nRGV2aWNlLT5wcmVwYXJhdGlvbl9kZWxheSwgcCk7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIHByZXBhcmF0aW9uIGRlbGF5OiAiCi0gICAgICAgICAgICA8PCBsb2doZXgoaGVhcmluZ0RldmljZS0+cHJlcGFyYXRpb25fZGVsYXkpOwotCi0gICAgdWludDE2X3QgY29kZWNzOwotICAgIFNUUkVBTV9UT19VSU5UMTYoY29kZWNzLCBwKTsKLSAgICBoZWFyaW5nRGV2aWNlLT5jb2RlY3MgPSBjb2RlY3M7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIHN1cHBvcnRlZCBjb2RlY3M6ICIgPDwgbG9naGV4KGNvZGVjcyk7Ci0gICAgaWYgKGNvZGVjcyAmICgxIDw8IENPREVDX0c3MjJfMTZLSFopKSBWTE9HKDIpIDw8ICJcdEc3MjJAMTZrSHoiOwotICAgIGlmIChjb2RlY3MgJiAoMSA8PCBDT0RFQ19HNzIyXzI0S0haKSkgVkxPRygyKSA8PCAiXHRHNzIyQDI0a0h6IjsKLQotICAgIGlmICghKGNvZGVjcyAmICgxIDw8IENPREVDX0c3MjJfMTZLSFopKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgTWFuZGF0b3J5IGNvZGVjLCBHNzIyQDE2a0h6IG5vdCBzdXBwb3J0ZWQiOwotICAgIH0KLSAgfQotCi0gIHVpbnQxNl90IENhbGNDb21wcmVzc2VkQXVkaW9QYWNrZXRTaXplKHVpbnQxNl90IGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uZWN0aW9uX2ludGVydmFsKSB7Ci0gICAgaW50IHNhbXBsZV9yYXRlOwotCi0gICAgY29uc3QgaW50IHNhbXBsZV9iaXRfcmF0ZSA9IDE2OyAgLyogMTYgYml0cyBwZXIgc2FtcGxlICovCi0gICAgY29uc3QgaW50IGNvbXByZXNzaW9uX3JhdGlvID0gNDsgLyogRy43MjIgaGFzIGEgNDoxIGNvbXByZXNzaW9uIHJhdGlvICovCi0gICAgaWYgKGNvZGVjX3R5cGUgPT0gQ09ERUNfRzcyMl8yNEtIWikgewotICAgICAgc2FtcGxlX3JhdGUgPSAyNDAwMDsKLSAgICB9IGVsc2UgewotICAgICAgc2FtcGxlX3JhdGUgPSAxNjAwMDsKLSAgICB9Ci0KLSAgICAvLyBjb21wcmVzc2VkX2RhdGFfcGFja2V0X3NpemUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNvbXByZXNzZWQgYXVkaW8KLSAgICAvLyBkYXRhIGJ1ZmZlciB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uIGludGVydmFsLgotICAgIHVpbnQzMl90IGNvbXByZXNzZWRfZGF0YV9wYWNrZXRfc2l6ZSA9Ci0gICAgICAgIChzYW1wbGVfcmF0ZSAqIGNvbm5lY3Rpb25faW50ZXJ2YWwgKiAoc2FtcGxlX2JpdF9yYXRlIC8gOCkgLwotICAgICAgICAgY29tcHJlc3Npb25fcmF0aW8pIC8KLSAgICAgICAgMTAwMDsKLSAgICByZXR1cm4gKCh1aW50MTZfdCljb21wcmVzc2VkX2RhdGFfcGFja2V0X3NpemUpOwotICB9Ci0KLSAgdm9pZCBDaG9vc2VDb2RlYyhjb25zdCBIZWFyaW5nRGV2aWNlJiBoZWFyaW5nRGV2aWNlKSB7Ci0gICAgaWYgKGNvZGVjX2luX3VzZSkgcmV0dXJuOwotCi0gICAgLy8gdXNlIHRoZSBiZXN0IGNvZGVjIGF2YWlsYWJsZSBmb3IgdGhpcyBwYWlyIG9mIGRldmljZXMuCi0gICAgdWludDE2X3QgY29kZWNzID0gaGVhcmluZ0RldmljZS5jb2RlY3M7Ci0gICAgaWYgKGhlYXJpbmdEZXZpY2UuaGlfc3luY19pZCAhPSAwKSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGhlYXJpbmdEZXZpY2VzLmRldmljZXMpIHsKLSAgICAgICAgaWYgKGRldmljZS5oaV9zeW5jX2lkICE9IGhlYXJpbmdEZXZpY2UuaGlfc3luY19pZCkgY29udGludWU7Ci0KLSAgICAgICAgY29kZWNzICY9IGRldmljZS5jb2RlY3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChjb2RlY3MgJiAoMSA8PCBDT0RFQ19HNzIyXzI0S0haKSkgJiYKLSAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV8ybV9waHkoKSAmJgotICAgICAgICBkZWZhdWx0X2RhdGFfaW50ZXJ2YWxfbXMgPT0gSEFfSU5URVJWQUxfMTBfTVMpIHsKLSAgICAgIGNvZGVjX2luX3VzZSA9IENPREVDX0c3MjJfMjRLSFo7Ci0gICAgfSBlbHNlIGlmIChjb2RlY3MgJiAoMSA8PCBDT0RFQ19HNzIyXzE2S0haKSkgewotICAgICAgY29kZWNfaW5fdXNlID0gQ09ERUNfRzcyMl8xNktIWjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9TdGF0dXModWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYmFzZTo6SGV4RW5jb2RlKHZhbHVlLCBsZW4pOwotICB9Ci0KLSAgdm9pZCBPblBzbVJlYWQodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWhlYXJpbmdEZXZpY2UpIHsKLSAgICAgIERWTE9HKDIpIDw8ICJTa2lwcGluZyB1bmtub3duIHJlYWQgZXZlbnQsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHJlYWRpbmcgUFNNIGZvciBkZXZpY2UiIDw8IGhlYXJpbmdEZXZpY2UtPmFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGxlbiA+IDIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkJhZCBQU00gbGVuZ3RoIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1aW50MTZfdCBwc20gPSAqKCh1aW50MTZfdCopdmFsdWUpOwotICAgIFZMT0coMikgPDwgInJlYWQgcHNtOiIgPDwgbG9naGV4KHBzbSk7Ci0KLSAgICBDb25uZWN0U29ja2V0KGhlYXJpbmdEZXZpY2UsIHBzbSk7Ci0gIH0KLQotICB2b2lkIENvbm5lY3RTb2NrZXQoSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSwgdWludDE2X3QgcHNtKSB7Ci0gICAgdEwyQ0FQX0NGR19JTkZPIGNmZ19pbmZvID0gdEwyQ0FQX0NGR19JTkZPey5tdHUgPSA1MTJ9OwotCi0gICAgU2VuZEVuYWJsZVNlcnZpY2VDaGFuZ2VkSW5kKGhlYXJpbmdEZXZpY2UpOwotCi0gICAgdWludDhfdCBzZXJ2aWNlX2lkID0gaGVhcmluZ0RldmljZS0+aXNMZWZ0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCVE1fU0VDX1NFUlZJQ0VfSEVBUklOR19BSURfTEVGVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJUTV9TRUNfU0VSVklDRV9IRUFSSU5HX0FJRF9SSUdIVDsKLSAgICB1aW50MTZfdCBnYXBfaGFuZGxlID0gR0FQX0Nvbm5PcGVuKAotICAgICAgICAiIiwgc2VydmljZV9pZCwgZmFsc2UsICZoZWFyaW5nRGV2aWNlLT5hZGRyZXNzLCBwc20sIDUxNCAvKiBNUFMgKi8sCi0gICAgICAgICZjZmdfaW5mbywgbnVsbHB0ciwgQlRNX1NFQ19OT05FIC8qIFRPRE86IHJlcXVlc3Qgc2VjdXJpdHkgPyAqLywKLSAgICAgICAgSGVhcmluZ0FpZEltcGw6OkdhcENhbGxiYWNrU3RhdGljLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgIGlmIChnYXBfaGFuZGxlID09IEdBUF9JTlZBTElEX0hBTkRMRSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVU5BQkxFIFRPIEdFVCBnYXBfaGFuZGxlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBoZWFyaW5nRGV2aWNlLT5nYXBfaGFuZGxlID0gZ2FwX2hhbmRsZTsKLSAgICBMT0coSU5GTykgPDwgIlN1Y2Nlc3NmdWxseSBzZW50IEdBUCBjb25uZWN0IHJlcXVlc3QiOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgT25SZWFkT25seVByb3BlcnRpZXNSZWFkU3RhdGljKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PblJlYWRPbmx5UHJvcGVydGllc1JlYWQoY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGxlbiwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotICB9Ci0gIHN0YXRpYyB2b2lkIE9uQXVkaW9TdGF0dXNTdGF0aWModWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PbkF1ZGlvU3RhdHVzKGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBsZW4sIHZhbHVlLCBkYXRhKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uUHNtUmVhZFN0YXRpYyh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PblBzbVJlYWQoY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGxlbiwgdmFsdWUsIGRhdGEpOwotICB9Ci0KLSAgLyogQ29DIFNvY2tldCBpcyByZWFkeSAqLwotICB2b2lkIE9uR2FwQ29ubmVjdGlvbihjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFoZWFyaW5nRGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGhlYXJpbmdEZXZpY2UtPmZpcnN0X2Nvbm5lY3Rpb24pIHsKLSAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfaGVhcmluZ19haWQoKmhlYXJpbmdEZXZpY2UpOwotCi0gICAgICBoZWFyaW5nRGV2aWNlLT5maXJzdF9jb25uZWN0aW9uID0gZmFsc2U7Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGF1ZGlvX3N0YXR1c19oYW5kbGU9IgotICAgICAgICAgICAgICA8PCBsb2doZXgoaGVhcmluZ0RldmljZS0+YXVkaW9fc3RhdHVzX2hhbmRsZSkKLSAgICAgICAgICAgICAgPDwgIiwgYXVkaW9fc3RhdHVzX2NjY19oYW5kbGU9IgotICAgICAgICAgICAgICA8PCBsb2doZXgoaGVhcmluZ0RldmljZS0+YXVkaW9fc3RhdHVzX2NjY19oYW5kbGUpOwotCi0gICAgLyogUmVnaXN0ZXIgYW5kIGVuYWJsZSB0aGUgQXVkaW8gU3RhdHVzIE5vdGlmaWNhdGlvbiAqLwotICAgIHRHQVRUX1NUQVRVUyByZWdpc3Rlcl9zdGF0dXM7Ci0gICAgcmVnaXN0ZXJfc3RhdHVzID0gQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgZ2F0dF9pZiwgYWRkcmVzcywgaGVhcmluZ0RldmljZS0+YXVkaW9fc3RhdHVzX2hhbmRsZSk7Ci0gICAgaWYgKHJlZ2lzdGVyX3N0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyBmYWlsZWQsIHN0YXR1cz0iCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChzdGF0aWNfY2FzdDx1aW50OF90PihyZWdpc3Rlcl9zdGF0dXMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUoMik7Ci0gICAgdWludDhfdCogcHRyID0gdmFsdWUuZGF0YSgpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHRyLCBHQVRUX0NIQVJfQ0xJRU5UX0NPTkZJR19OT1RJRklDQVRJT04pOwotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVEZXNjcmlwdG9yKAotICAgICAgICBoZWFyaW5nRGV2aWNlLT5jb25uX2lkLCBoZWFyaW5nRGV2aWNlLT5hdWRpb19zdGF0dXNfY2NjX2hhbmRsZSwKLSAgICAgICAgc3RkOjptb3ZlKHZhbHVlKSwgR0FUVF9XUklURSwgd3JpdGVfcnB0X2N0bF9jZmdfY2IsIG51bGxwdHIpOwotCi0gICAgQ2hvb3NlQ29kZWMoKmhlYXJpbmdEZXZpY2UpOwotCi0gICAgU2VuZFN0YXJ0KGhlYXJpbmdEZXZpY2UpOwotCi0gICAgaWYgKGF1ZGlvX3J1bm5pbmcpIHsKLSAgICAgIC8vIEluZm9ybSB0aGUgb3RoZXIgc2lkZSAoaWYgYW55KSBvZiB0aGlzIGNvbm5lY3Rpb24KLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluZm9ybV9jb25uX3N0YXRlKAotICAgICAgICAgIHtDT05UUk9MX1BPSU5UX09QX1NUQVRFX0NIQU5HRSwgU1RBVEVfQ0hBTkdFX09USEVSX1NJREVfQ09OTkVDVEVEfSk7Ci0gICAgICBzZW5kX3N0YXRlX2NoYW5nZV90b19vdGhlcl9zaWRlKGhlYXJpbmdEZXZpY2UsIGluZm9ybV9jb25uX3N0YXRlKTsKLSAgICB9Ci0KLSAgICBoZWFyaW5nRGV2aWNlLT5hY2NlcHRpbmdfYXVkaW8gPSB0cnVlOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzPSIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICA8PCAiLCBoaV9zeW5jX2lkPSIgPDwgbG9naGV4KGhlYXJpbmdEZXZpY2UtPmhpX3N5bmNfaWQpCi0gICAgICAgICAgICAgIDw8ICIsIGNvZGVjX2luX3VzZT0iIDw8IGxvZ2hleChjb2RlY19pbl91c2UpCi0gICAgICAgICAgICAgIDw8ICIsIGF1ZGlvX3J1bm5pbmc9IiA8PCBhdWRpb19ydW5uaW5nOwotCi0gICAgU3RhcnRTZW5kaW5nQXVkaW8oKmhlYXJpbmdEZXZpY2UpOwotCi0gICAgY2FsbGJhY2tzLT5PbkRldmljZUF2YWlsYWJsZShoZWFyaW5nRGV2aWNlLT5jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFyaW5nRGV2aWNlLT5oaV9zeW5jX2lkLCBhZGRyZXNzKTsKLSAgICBjYWxsYmFja3MtPk9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVELCBhZGRyZXNzKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRTZW5kaW5nQXVkaW8oY29uc3QgSGVhcmluZ0RldmljZSYgaGVhcmluZ0RldmljZSkgewotICAgIFZMT0coMCkgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgaGVhcmluZ0RldmljZS5hZGRyZXNzOwotCi0gICAgaWYgKGVuY29kZXJfc3RhdGVfbGVmdCA9PSBudWxscHRyKSB7Ci0gICAgICBlbmNvZGVyX3N0YXRlX2luaXQoKTsKLSAgICAgIHNlcV9jb3VudGVyID0gMDsKLQotICAgICAgQ29kZWNDb25maWd1cmF0aW9uIGNvZGVjOwotICAgICAgaWYgKGNvZGVjX2luX3VzZSA9PSBDT0RFQ19HNzIyXzI0S0haKSB7Ci0gICAgICAgIGNvZGVjLnNhbXBsZV9yYXRlID0gMjQwMDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb2RlYy5zYW1wbGVfcmF0ZSA9IDE2MDAwOwotICAgICAgfQotICAgICAgY29kZWMuYml0X3JhdGUgPSAxNjsKLSAgICAgIGNvZGVjLmRhdGFfaW50ZXJ2YWxfbXMgPSBkZWZhdWx0X2RhdGFfaW50ZXJ2YWxfbXM7Ci0KLSAgICAgIHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcyA9IDA7Ci0gICAgICBpZiAoaGVhcmluZ0RldmljZS5yZW5kZXJfZGVsYXkgIT0gMCkgewotICAgICAgICBkZWxheV9yZXBvcnRfbXMgPQotICAgICAgICAgICAgaGVhcmluZ0RldmljZS5yZW5kZXJfZGVsYXkgKwotICAgICAgICAgICAgKEFERF9SRU5ERVJfREVMQVlfSU5URVJWQUxTICogZGVmYXVsdF9kYXRhX2ludGVydmFsX21zKTsKLSAgICAgIH0KLQotICAgICAgSGVhcmluZ0FpZEF1ZGlvU291cmNlOjpTdGFydChjb2RlYywgYXVkaW9SZWNlaXZlciwgZGVsYXlfcmVwb3J0X21zKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9TdXNwZW5kKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYgc3RvcF9hdWRpb190aWNrcykgewotICAgIENIRUNLKHN0b3BfYXVkaW9fdGlja3MpIDw8ICJzdG9wX2F1ZGlvX3RpY2tzIGlzIGVtcHR5IjsKLQotICAgIGlmICghYXVkaW9fcnVubmluZykgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFVuZXhwZWN0ZWQgYXVkaW8gc3VzcGVuZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhdWRpb19ydW5uaW5nPSIgPDwgYXVkaW9fcnVubmluZzsKLSAgICB9Ci0gICAgYXVkaW9fcnVubmluZyA9IGZhbHNlOwotICAgIHN0b3BfYXVkaW9fdGlja3MoKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3Aoe0NPTlRST0xfUE9JTlRfT1BfU1RPUH0pOwotICAgIGZvciAoYXV0byYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgaWYgKCFkZXZpY2UuYWNjZXB0aW5nX2F1ZGlvKSBjb250aW51ZTsKLQotICAgICAgaWYgKCFkZXZpY2UucGxheWJhY2tfc3RhcnRlZCkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IFBsYXliYWNrIG5vdCBzdGFydGVkLCBza2lwIHNlbmQgU3RvcCBjbWQsIGRldmljZT0iCi0gICAgICAgICAgICAgICAgICAgICA8PCBkZXZpY2UuYWRkcmVzczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZW5kIFN0b3AgY21kLCBkZXZpY2U9IiA8PCBkZXZpY2UuYWRkcmVzczsKLSAgICAgICAgZGV2aWNlLnBsYXliYWNrX3N0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgZGV2aWNlLmNvbW1hbmRfYWNrZWQgPSBmYWxzZTsKLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGRldmljZS5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmF1ZGlvX2NvbnRyb2xfcG9pbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCwgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkF1ZGlvUmVzdW1lKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYgc3RhcnRfYXVkaW9fdGlja3MpIHsKLSAgICBDSEVDSyhzdGFydF9hdWRpb190aWNrcykgPDwgInN0YXJ0X2F1ZGlvX3RpY2tzIGlzIGVtcHR5IjsKLQotICAgIGlmIChhdWRpb19ydW5uaW5nKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFVuZXhwZWN0ZWQgQXVkaW8gUmVzdW1lIjsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGF1ZGlvX3J1bm5pbmc9IiA8PCBhdWRpb19ydW5uaW5nOwotICAgIH0KLQotICAgIGZvciAoYXV0byYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgaWYgKCFkZXZpY2UuYWNjZXB0aW5nX2F1ZGlvKSBjb250aW51ZTsKLSAgICAgIGF1ZGlvX3J1bm5pbmcgPSB0cnVlOwotICAgICAgU2VuZFN0YXJ0KCZkZXZpY2UpOwotICAgIH0KLQotICAgIGlmICghYXVkaW9fcnVubmluZykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IE5vIGRldmljZSAoMC8iIDw8IEdldERldmljZUNvdW50KCkKLSAgICAgICAgICAgICAgICA8PCAiKSByZWFkeSB0byBzdGFydCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVE9ETzogc2hhbGwgd2UgYWxzbyByZXNldCB0aGUgZW5jb2RlciA/Ci0gICAgZW5jb2Rlcl9zdGF0ZV9yZWxlYXNlKCk7Ci0gICAgZW5jb2Rlcl9zdGF0ZV9pbml0KCk7Ci0gICAgc2VxX2NvdW50ZXIgPSAwOwotCi0gICAgc3RhcnRfYXVkaW9fdGlja3MoKTsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0T3RoZXJTaWRlU3RyZWFtU3RhdHVzKEhlYXJpbmdEZXZpY2UqIHRoaXNfc2lkZV9kZXZpY2UpIHsKLSAgICBmb3IgKGF1dG8mIGRldmljZSA6IGhlYXJpbmdEZXZpY2VzLmRldmljZXMpIHsKLSAgICAgIGlmICgoZGV2aWNlLmFkZHJlc3MgPT0gdGhpc19zaWRlX2RldmljZS0+YWRkcmVzcykgfHwKLSAgICAgICAgICAoZGV2aWNlLmhpX3N5bmNfaWQgIT0gdGhpc19zaWRlX2RldmljZS0+aGlfc3luY19pZCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoYXVkaW9fcnVubmluZyAmJiAoZGV2aWNlLmNvbm5faWQgIT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIChPVEhFUl9TSURFX0lTX1NUUkVBTUlORyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKE9USEVSX1NJREVfTk9UX1NUUkVBTUlORyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoT1RIRVJfU0lERV9OT1RfU1RSRUFNSU5HKTsKLSAgfQotCi0gIHZvaWQgU2VuZEVuYWJsZVNlcnZpY2VDaGFuZ2VkSW5kKEhlYXJpbmdEZXZpY2UqIGRldmljZSkgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBFbmFibGUgIiA8PCBkZXZpY2UtPmFkZHJlc3MKLSAgICAgICAgICAgIDw8ICJzZXJ2aWNlIGNoYW5nZWQgaW5kLiI7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUoMik7Ci0gICAgdWludDhfdCogcHRyID0gdmFsdWUuZGF0YSgpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHRyLCBHQVRUX0NIQVJfQ0xJRU5UX0NPTkZJR19JTkRJQ1RJT04pOwotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVEZXNjcmlwdG9yKAotICAgICAgICBkZXZpY2UtPmNvbm5faWQsIGRldmljZS0+c2VydmljZV9jaGFuZ2VkX2NjY19oYW5kbGUsIHN0ZDo6bW92ZSh2YWx1ZSksCi0gICAgICAgIEdBVFRfV1JJVEUsIG51bGxwdHIsIG51bGxwdHIpOwotICB9Ci0KLSAgdm9pZCBTZW5kU3RhcnQoSGVhcmluZ0RldmljZSogZGV2aWNlKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RhcnQoe0NPTlRST0xfUE9JTlRfT1BfU1RBUlQsIGNvZGVjX2luX3VzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9UWVBFX1VOS05PV04sICh1aW50OF90KWN1cnJlbnRfdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVEhFUl9TSURFX05PVF9TVFJFQU1JTkd9KTsKLQotICAgIGlmICghYXVkaW9fcnVubmluZykgewotICAgICAgaWYgKCFkZXZpY2UtPnBsYXliYWNrX3N0YXJ0ZWQpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICA8PCAiOiBTa2lwIFNlbmQgU3RhcnQgc2luY2UgYXVkaW8gaXMgbm90IHJ1bm5pbmcsIGRldmljZT0iCi0gICAgICAgICAgICAgICAgICA8PCBkZXZpY2UtPmFkZHJlc3M7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogQXVkaW8gbm90IHJ1bm5pbmcgYnV0IFBsYXliYWNrIGhhcyBzdGFydGVkLCBkZXZpY2U9IgotICAgICAgICAgICAgICAgICAgIDw8IGRldmljZS0+YWRkcmVzczsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY3VycmVudF92b2x1bWUgPT0gVk9MVU1FX1VOS05PV04pIHN0YXJ0WzNdID0gKHVpbnQ4X3QpVk9MVU1FX01JTjsKLQotICAgIGlmIChkZXZpY2UtPnBsYXliYWNrX3N0YXJ0ZWQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogUGxheWJhY2sgYWxyZWFkeSBzdGFydGVkLCBza2lwIHNlbmQgU3RhcnQgY21kLCBkZXZpY2U9IgotICAgICAgICAgICAgICAgICA8PCBkZXZpY2UtPmFkZHJlc3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXJ0WzRdID0gR2V0T3RoZXJTaWRlU3RyZWFtU3RhdHVzKGRldmljZSk7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc2VuZCBTdGFydCBjbWQsIHZvbHVtZT0iIDw8IGxvZ2hleChzdGFydFszXSkKLSAgICAgICAgICAgICAgICA8PCAiLCBhdWRpbyB0eXBlPSIgPDwgbG9naGV4KHN0YXJ0WzJdKQotICAgICAgICAgICAgICAgIDw8ICIsIGRldmljZT0iIDw8IGRldmljZS0+YWRkcmVzcwotICAgICAgICAgICAgICAgIDw8ICIsIG90aGVyIHNpZGUgc3RyZWFtaW5nPSIgPDwgbG9naGV4KHN0YXJ0WzRdKTsKLSAgICAgIGRldmljZS0+cGxheWJhY2tfc3RhcnRlZCA9IHRydWU7Ci0gICAgICBkZXZpY2UtPmNvbW1hbmRfYWNrZWQgPSBmYWxzZTsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhkZXZpY2UtPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdWRpb19jb250cm9sX3BvaW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkF1ZGlvRGF0YVJlYWR5KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgZGF0YSBjb21lcyBpbiBhcyAxNmJpdCBwZXIgc2FtcGxlIDE2a0h6IFBDTSBzdGVyZW8gKi8KLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICAgIGludCBudW1fc2FtcGxlcyA9Ci0gICAgICAgIGRhdGEuc2l6ZSgpIC8gKDIgLypieXRlc19wZXJfc2FtcGxlKi8gKiAyIC8qbnVtYmVyIG9mIGNoYW5uZWxzKi8pOwotCi0gICAgLy8gVGhlIEcuNzIyIGNvZGVjIGFjY2VwdCBvbmx5IGV2ZW4gbnVtYmVyIG9mIHNhbXBsZXMgZm9yIGVuY29kaW5nCi0gICAgaWYgKG51bV9zYW1wbGVzICUgMiAhPSAwKQotICAgICAgTE9HKEZBVEFMKSA8PCAibnVtX3NhbXBsZXMgaXMgbm90IGV2ZW46ICIgPDwgbnVtX3NhbXBsZXM7Ci0KLSAgICAvLyBUT0RPOiB3ZSBzaG91bGQgY2FjaGUgbGVmdC9yaWdodCBhbmQgY3VycmVudCBzdGF0ZSwgaW5zdGFkIG9mIHJlY29tcHV0aW5nCi0gICAgLy8gaXQgZm9yIGVhY2ggcGFja2V0LCAxMDAgdGltZXMgYSBzZWNvbmQuCi0gICAgSGVhcmluZ0RldmljZSogbGVmdCA9IG51bGxwdHI7Ci0gICAgSGVhcmluZ0RldmljZSogcmlnaHQgPSBudWxscHRyOwotICAgIGZvciAoYXV0byYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgaWYgKCFkZXZpY2UuYWNjZXB0aW5nX2F1ZGlvKSBjb250aW51ZTsKLQotICAgICAgaWYgKGRldmljZS5pc0xlZnQoKSkKLSAgICAgICAgbGVmdCA9ICZkZXZpY2U7Ci0gICAgICBlbHNlCi0gICAgICAgIHJpZ2h0ID0gJmRldmljZTsKLSAgICB9Ci0KLSAgICBpZiAobGVmdCA9PSBudWxscHRyICYmIHJpZ2h0ID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBObyBtb3JlICgwLyIgPDwgR2V0RGV2aWNlQ291bnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIpIGRldmljZXMgcmVhZHkiOwotICAgICAgRG9EaXNjb25uZWN0QXVkaW9TdG9wKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNoYW5fbGVmdDsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY2hhbl9yaWdodDsKLSAgICBpZiAobGVmdCA9PSBudWxscHRyIHx8IHJpZ2h0ID09IG51bGxwdHIpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBzYW1wbGUgPSBkYXRhLmRhdGEoKSArIGkgKiA0OwotCi0gICAgICAgIGludDE2X3QgbGVmdCA9IChpbnQxNl90KSgoKihzYW1wbGUgKyAxKSA8PCA4KSArICpzYW1wbGUpID4+IDE7Ci0KLSAgICAgICAgc2FtcGxlICs9IDI7Ci0gICAgICAgIGludDE2X3QgcmlnaHQgPSAoaW50MTZfdCkoKCooc2FtcGxlICsgMSkgPDwgOCkgKyAqc2FtcGxlKSA+PiAxOwotCi0gICAgICAgIHVpbnQxNl90IG1vbm9fZGF0YSA9IChpbnQxNl90KSgoKHVpbnQzMl90KWxlZnQgKyAodWludDMyX3QpcmlnaHQpID4+IDEpOwotICAgICAgICBjaGFuX2xlZnQucHVzaF9iYWNrKG1vbm9fZGF0YSk7Ci0gICAgICAgIGNoYW5fcmlnaHQucHVzaF9iYWNrKG1vbm9fZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykgewotICAgICAgICBjb25zdCB1aW50OF90KiBzYW1wbGUgPSBkYXRhLmRhdGEoKSArIGkgKiA0OwotCi0gICAgICAgIHVpbnQxNl90IGxlZnQgPSAoaW50MTZfdCkoKCooc2FtcGxlICsgMSkgPDwgOCkgKyAqc2FtcGxlKSA+PiAxOwotICAgICAgICBjaGFuX2xlZnQucHVzaF9iYWNrKGxlZnQpOwotCi0gICAgICAgIHNhbXBsZSArPSAyOwotICAgICAgICB1aW50MTZfdCByaWdodCA9IChpbnQxNl90KSgoKihzYW1wbGUgKyAxKSA8PCA4KSArICpzYW1wbGUpID4+IDE7Ci0gICAgICAgIGNoYW5fcmlnaHQucHVzaF9iYWNrKHJpZ2h0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBtb251cmFsLCBiaW5hcnVhbCBjaGVjawotCi0gICAgLy8gZGl2aWRlIGVuY29kZWQgZGF0YSBpbnRvIHBhY2tldHMsIGFkZCBoZWFkZXIsIHNlbmQuCi0KLSAgICAvLyBUT0RPOiBtYWtlIHRob3NlIGJ1ZmZlcnMgc3RhdGljIGFuZCBnbG9iYWwgdG8gcHJldmVudCBjb25zdGFudAotICAgIC8vIHJlYWxsb2NhdGlvbnMKLSAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiYXNpY2FsbHkgZml0IHRoZSBlbmNvZGVkIGRhdGEsIHR1bmUgdGhlIHNpemUgbGF0ZXIKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBlbmNvZGVkX2RhdGFfbGVmdDsKLSAgICBpZiAobGVmdCkgewotICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBhIG1hZ2ljIG51bWJlciwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0Ci0gICAgICAvLyBidWZmZXIgc2l6ZQotICAgICAgZW5jb2RlZF9kYXRhX2xlZnQucmVzaXplKDQwMDApOwotICAgICAgaW50IGVuY29kZWRfc2l6ZSA9Ci0gICAgICAgICAgZzcyMl9lbmNvZGUoZW5jb2Rlcl9zdGF0ZV9sZWZ0LCBlbmNvZGVkX2RhdGFfbGVmdC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QqKWNoYW5fbGVmdC5kYXRhKCksIGNoYW5fbGVmdC5zaXplKCkpOwotICAgICAgZW5jb2RlZF9kYXRhX2xlZnQucmVzaXplKGVuY29kZWRfc2l6ZSk7Ci0KLSAgICAgIHVpbnQxNl90IGNpZCA9IEdBUF9Db25uR2V0TDJDQVBDaWQobGVmdC0+Z2FwX2hhbmRsZSk7Ci0gICAgICB1aW50MTZfdCBwYWNrZXRzX3RvX2ZsdXNoID0gTDJDQV9GbHVzaENoYW5uZWwoY2lkLCBMMkNBUF9GTFVTSF9DSEFOU19HRVQpOwotICAgICAgaWYgKHBhY2tldHNfdG9fZmx1c2gpIHsKLSAgICAgICAgVkxPRygyKSA8PCBsZWZ0LT5hZGRyZXNzIDw8ICIgc2tpcHBpbmcgIiA8PCBwYWNrZXRzX3RvX2ZsdXNoCi0gICAgICAgICAgICAgICAgPDwgIiBwYWNrZXRzIjsKLSAgICAgICAgbGVmdC0+YXVkaW9fc3RhdHMucGFja2V0X2ZsdXNoX2NvdW50ICs9IHBhY2tldHNfdG9fZmx1c2g7Ci0gICAgICAgIGxlZnQtPmF1ZGlvX3N0YXRzLmZyYW1lX2ZsdXNoX2NvdW50Kys7Ci0gICAgICAgIGhlYXJpbmdEZXZpY2VzLlN0YXJ0UnNzaUxvZygpOwotICAgICAgfQotICAgICAgLy8gZmx1c2ggYWxsIHBhY2tldHMgc3R1Y2sgaW4gcXVldWUKLSAgICAgIEwyQ0FfRmx1c2hDaGFubmVsKGNpZCwgMHhmZmZmKTsKLSAgICAgIGNoZWNrX2FuZF9kb19yc3NpX3JlYWQobGVmdCk7Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZW5jb2RlZF9kYXRhX3JpZ2h0OwotICAgIGlmIChyaWdodCkgewotICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBhIG1hZ2ljIG51bWJlciwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0Ci0gICAgICAvLyBidWZmZXIgc2l6ZQotICAgICAgZW5jb2RlZF9kYXRhX3JpZ2h0LnJlc2l6ZSg0MDAwKTsKLSAgICAgIGludCBlbmNvZGVkX3NpemUgPQotICAgICAgICAgIGc3MjJfZW5jb2RlKGVuY29kZXJfc3RhdGVfcmlnaHQsIGVuY29kZWRfZGF0YV9yaWdodC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QqKWNoYW5fcmlnaHQuZGF0YSgpLCBjaGFuX3JpZ2h0LnNpemUoKSk7Ci0gICAgICBlbmNvZGVkX2RhdGFfcmlnaHQucmVzaXplKGVuY29kZWRfc2l6ZSk7Ci0KLSAgICAgIHVpbnQxNl90IGNpZCA9IEdBUF9Db25uR2V0TDJDQVBDaWQocmlnaHQtPmdhcF9oYW5kbGUpOwotICAgICAgdWludDE2X3QgcGFja2V0c190b19mbHVzaCA9IEwyQ0FfRmx1c2hDaGFubmVsKGNpZCwgTDJDQVBfRkxVU0hfQ0hBTlNfR0VUKTsKLSAgICAgIGlmIChwYWNrZXRzX3RvX2ZsdXNoKSB7Ci0gICAgICAgIFZMT0coMikgPDwgcmlnaHQtPmFkZHJlc3MgPDwgIiBza2lwcGluZyAiIDw8IHBhY2tldHNfdG9fZmx1c2gKLSAgICAgICAgICAgICAgICA8PCAiIHBhY2tldHMiOwotICAgICAgICByaWdodC0+YXVkaW9fc3RhdHMucGFja2V0X2ZsdXNoX2NvdW50ICs9IHBhY2tldHNfdG9fZmx1c2g7Ci0gICAgICAgIHJpZ2h0LT5hdWRpb19zdGF0cy5mcmFtZV9mbHVzaF9jb3VudCsrOwotICAgICAgICBoZWFyaW5nRGV2aWNlcy5TdGFydFJzc2lMb2coKTsKLSAgICAgIH0KLSAgICAgIC8vIGZsdXNoIGFsbCBwYWNrZXRzIHN0dWNrIGluIHF1ZXVlCi0gICAgICBMMkNBX0ZsdXNoQ2hhbm5lbChjaWQsIDB4ZmZmZik7Ci0gICAgICBjaGVja19hbmRfZG9fcnNzaV9yZWFkKHJpZ2h0KTsKLSAgICB9Ci0KLSAgICBzaXplX3QgZW5jb2RlZF9kYXRhX3NpemUgPQotICAgICAgICBzdGQ6Om1heChlbmNvZGVkX2RhdGFfbGVmdC5zaXplKCksIGVuY29kZWRfZGF0YV9yaWdodC5zaXplKCkpOwotCi0gICAgdWludDE2X3QgcGFja2V0X3NpemUgPQotICAgICAgICBDYWxjQ29tcHJlc3NlZEF1ZGlvUGFja2V0U2l6ZShjb2RlY19pbl91c2UsIGRlZmF1bHRfZGF0YV9pbnRlcnZhbF9tcyk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuY29kZWRfZGF0YV9zaXplOyBpICs9IHBhY2tldF9zaXplKSB7Ci0gICAgICBpZiAobGVmdCkgewotICAgICAgICBsZWZ0LT5hdWRpb19zdGF0cy5wYWNrZXRfc2VuZF9jb3VudCsrOwotICAgICAgICBTZW5kQXVkaW8oZW5jb2RlZF9kYXRhX2xlZnQuZGF0YSgpICsgaSwgcGFja2V0X3NpemUsIGxlZnQpOwotICAgICAgfQotICAgICAgaWYgKHJpZ2h0KSB7Ci0gICAgICAgIHJpZ2h0LT5hdWRpb19zdGF0cy5wYWNrZXRfc2VuZF9jb3VudCsrOwotICAgICAgICBTZW5kQXVkaW8oZW5jb2RlZF9kYXRhX3JpZ2h0LmRhdGEoKSArIGksIHBhY2tldF9zaXplLCByaWdodCk7Ci0gICAgICB9Ci0gICAgICBzZXFfY291bnRlcisrOwotICAgIH0KLSAgICBpZiAobGVmdCkgbGVmdC0+YXVkaW9fc3RhdHMuZnJhbWVfc2VuZF9jb3VudCsrOwotICAgIGlmIChyaWdodCkgcmlnaHQtPmF1ZGlvX3N0YXRzLmZyYW1lX3NlbmRfY291bnQrKzsKLSAgfQotCi0gIHZvaWQgU2VuZEF1ZGlvKHVpbnQ4X3QqIGVuY29kZWRfZGF0YSwgdWludDE2X3QgcGFja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgIEhlYXJpbmdEZXZpY2UqIGhlYXJpbmdBaWQpIHsKLSAgICBpZiAoIWhlYXJpbmdBaWQtPnBsYXliYWNrX3N0YXJ0ZWQgfHwgIWhlYXJpbmdBaWQtPmNvbW1hbmRfYWNrZWQpIHsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIjogUGxheWJhY2sgc3RhbGxlZCwgZGV2aWNlPSIgPDwgaGVhcmluZ0FpZC0+YWRkcmVzcwotICAgICAgICAgICAgICA8PCAiLCBjbWQgc2VuZD0iIDw8IGhlYXJpbmdBaWQtPnBsYXliYWNrX3N0YXJ0ZWQKLSAgICAgICAgICAgICAgPDwgIiwgY21kIGFja2VkPSIgPDwgaGVhcmluZ0FpZC0+Y29tbWFuZF9hY2tlZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBCVF9IRFIqIGF1ZGlvX3BhY2tldCA9IG1hbGxvY19sMmNhcF9idWYocGFja2V0X3NpemUgKyAxKTsKLSAgICB1aW50OF90KiBwID0gZ2V0X2wyY2FwX3NkdV9zdGFydF9wdHIoYXVkaW9fcGFja2V0KTsKLSAgICAqcCA9IHNlcV9jb3VudGVyOwotICAgIHArKzsKLSAgICBtZW1jcHkocCwgZW5jb2RlZF9kYXRhLCBwYWNrZXRfc2l6ZSk7Ci0KLSAgICBEVkxPRygyKSA8PCBoZWFyaW5nQWlkLT5hZGRyZXNzIDw8ICIgOiAiIDw8IGJhc2U6OkhleEVuY29kZShwLCBwYWNrZXRfc2l6ZSk7Ci0KLSAgICB1aW50MTZfdCByZXN1bHQgPSBHQVBfQ29ubldyaXRlRGF0YShoZWFyaW5nQWlkLT5nYXBfaGFuZGxlLCBhdWRpb19wYWNrZXQpOwotCi0gICAgaWYgKHJlc3VsdCAhPSBCVF9QQVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICIgRXJyb3Igc2VuZGluZyBkYXRhOiAiIDw8IGxvZ2hleChyZXN1bHQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgR2FwQ2FsbGJhY2sodWludDE2X3QgZ2FwX2hhbmRsZSwgdWludDE2X3QgZXZlbnQsIHRHQVBfQ0JfREFUQSogZGF0YSkgewotICAgIEhlYXJpbmdEZXZpY2UqIGhlYXJpbmdEZXZpY2UgPSBoZWFyaW5nRGV2aWNlcy5GaW5kQnlHYXBIYW5kbGUoZ2FwX2hhbmRsZSk7Ci0gICAgaWYgKCFoZWFyaW5nRGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBnYXBfaGFuZGxlPSIgPDwgZ2FwX2hhbmRsZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBjYXNlIEdBUF9FVlRfQ09OTl9PUEVORUQ6IHsKLSAgICAgICAgUmF3QWRkcmVzcyBhZGRyZXNzID0gKkdBUF9Db25uR2V0UmVtb3RlQWRkcihnYXBfaGFuZGxlKTsKLSAgICAgICAgdWludDE2X3QgdHhfbXR1ID0gR0FQX0Nvbm5HZXRSZW1NdHVTaXplKGdhcF9oYW5kbGUpOwotCi0gICAgICAgIExPRyhJTkZPKSA8PCAiR0FQX0VWVF9DT05OX09QRU5FRCAiIDw8IGFkZHJlc3MgPDwgIiwgdHhfbXR1PSIgPDwgdHhfbXR1OwotICAgICAgICBPbkdhcENvbm5lY3Rpb24oYWRkcmVzcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBUT0RPOiBoYW5kbGUgcHJvcGVybHkhCi0gICAgICBjYXNlIEdBUF9FVlRfQ09OTl9DTE9TRUQ6Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgPDwgIjogR0FQX0VWVF9DT05OX0NMT1NFRDogIiA8PCBoZWFyaW5nRGV2aWNlLT5hZGRyZXNzCi0gICAgICAgICAgICAgICAgICA8PCAiLCBwbGF5YmFja19zdGFydGVkPSIgPDwgaGVhcmluZ0RldmljZS0+cGxheWJhY2tfc3RhcnRlZDsKLSAgICAgICAgaGVhcmluZ0RldmljZS0+YWNjZXB0aW5nX2F1ZGlvID0gZmFsc2U7Ci0gICAgICAgIGhlYXJpbmdEZXZpY2UtPmdhcF9oYW5kbGUgPSAwOwotICAgICAgICBoZWFyaW5nRGV2aWNlLT5wbGF5YmFja19zdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIGhlYXJpbmdEZXZpY2UtPmNvbW1hbmRfYWNrZWQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdBUF9FVlRfQ09OTl9EQVRBX0FWQUlMOiB7Ci0gICAgICAgIERWTE9HKDIpIDw8ICJHQVBfRVZUX0NPTk5fREFUQV9BVkFJTCI7Ci0KLSAgICAgICAgLy8gb25seSBkYXRhIHdlIHJlY2VpdmUgYmFjayBmcm9tIGhlYXJpbmcgYWlkcyBhcmUgc29tZSBzdGF0cywgbm90Ci0gICAgICAgIC8vIHJlYWxseSBpbXBvcnRhbnQsIGJ1dCB1c2VmdWwgbm93IGZvciBkZWJ1Z2dpbmcuCi0gICAgICAgIHVpbnQzMl90IGJ5dGVzX3RvX3JlYWQgPSAwOwotICAgICAgICBHQVBfR2V0UnhRdWV1ZUNudChnYXBfaGFuZGxlLCAmYnl0ZXNfdG9fcmVhZCk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihieXRlc190b19yZWFkKTsKLQotICAgICAgICB1aW50MTZfdCBieXRlc19yZWFkID0gMDsKLSAgICAgICAgLy8gVE9ETzpHQVBfQ29ublJlYWREYXRhIHNob3VsZCBhY2NwZXQgdWludDMyX3QgZm9yIGxlbmd0aCEKLSAgICAgICAgR0FQX0Nvbm5SZWFkRGF0YShnYXBfaGFuZGxlLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpLCAmYnl0ZXNfcmVhZCk7Ci0KLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCA0KSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICIgV3JvbmcgZGF0YSBsZW5ndGgiOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QqIHAgPSBidWZmZXIuZGF0YSgpOwotCi0gICAgICAgIERWTE9HKDEpIDw8ICJzdGF0cyBmcm9tIHRoZSBoZWFyaW5nIGFpZDoiOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSArIDQgPD0gYnVmZmVyLnNpemUoKTsgaSArPSA0KSB7Ci0gICAgICAgICAgdWludDE2X3QgZXZlbnRfY291bnRlciwgZnJhbWVfaW5kZXg7Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihldmVudF9jb3VudGVyLCBwKTsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGZyYW1lX2luZGV4LCBwKTsKLSAgICAgICAgICBEVkxPRygxKSA8PCAiZXZlbnRfY291bnRlcj0iIDw8IGV2ZW50X2NvdW50ZXIKLSAgICAgICAgICAgICAgICAgICA8PCAiIGZyYW1lX2luZGV4OiAiIDw8IGZyYW1lX2luZGV4OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEdBUF9FVlRfVFhfRU1QVFk6Ci0gICAgICAgIERWTE9HKDIpIDw8ICJHQVBfRVZUX1RYX0VNUFRZIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdBUF9FVlRfQ09OTl9DT05HRVNURUQ6Ci0gICAgICAgIERWTE9HKDIpIDw8ICJHQVBfRVZUX0NPTk5fQ09OR0VTVEVEIjsKLQotICAgICAgICAvLyBUT0RPOiBtYWtlIGl0IGludG8gZnVuY3Rpb24KLSAgICAgICAgSGVhcmluZ0FpZEF1ZGlvU291cmNlOjpTdG9wKCk7Ci0gICAgICAgIC8vIFRPRE86IGtpbGwgdGhlIGVuY29kZXIgb25seSBpZiBhbGwgaGVhcmluZyBhaWRzIGFyZSBkb3duLgotICAgICAgICAvLyBnNzIyX2VuY29kZV9yZWxlYXNlKGVuY29kZXJfc3RhdGUpOwotICAgICAgICAvLyBlbmNvZGVyX3N0YXRlX2xlZnQgPSBudWxsbHB0cjsKLSAgICAgICAgLy8gZW5jb2Rlcl9zdGF0ZV9yaWdodCA9IG51bGxscHRyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR0FQX0VWVF9DT05OX1VOQ09OR0VTVEVEOgotICAgICAgICBEVkxPRygyKSA8PCAiR0FQX0VWVF9DT05OX1VOQ09OR0VTVEVEIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHZvaWQgR2FwQ2FsbGJhY2tTdGF0aWModWludDE2X3QgZ2FwX2hhbmRsZSwgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVBfQ0JfREFUQSogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPkdhcENhbGxiYWNrKGdhcF9oYW5kbGUsIGV2ZW50LCBkYXRhKTsKLSAgfQotCi0gIHZvaWQgRHVtcFJzc2koaW50IGZkLCBjb25zdCBIZWFyaW5nRGV2aWNlJiBkZXZpY2UpIHsKLSAgICBjb25zdCBzdHJ1Y3QgQXVkaW9TdGF0cyogc3RhdHMgPSAmZGV2aWNlLmF1ZGlvX3N0YXRzOwotCi0gICAgaWYgKHN0YXRzLT5yc3NpX2hpc3Rvcnkuc2l6ZSgpIDw9IDApIHsKLSAgICAgIGRwcmludGYoZmQsICIgIE5vIFJTU0kgaGlzdG9yeSBmb3IgJXM6XG4iLCBkZXZpY2UuYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkcHJpbnRmKGZkLCAiICBSU1NJIGhpc3RvcnkgZm9yICVzOlxuIiwgZGV2aWNlLmFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIGRwcmludGYoZmQsICIgICAgVGltZSBvZiBSU1NJICAgIDAuMCAgMC4xICAwLjIgIDAuMyAgMC40ICAwLjUgIDAuNiAgMC43ICAwLjggIDAuOVxuIik7Ci0gICAgZm9yIChhdXRvJiByc3NpX2xvZ3MgOiBzdGF0cy0+cnNzaV9oaXN0b3J5KSB7Ci0gICAgICBpZiAocnNzaV9sb2dzLnJzc2kuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNoYXIgZXZlbnR0aW1lWzIwXTsKLSAgICAgIGNoYXIgdGVtcHRpbWVbMjBdOwotICAgICAgc3RydWN0IHRtKiB0c3RhbXAgPSBsb2NhbHRpbWUoJnJzc2lfbG9ncy50aW1lc3RhbXAudHZfc2VjKTsKLSAgICAgIGlmICghc3RyZnRpbWUodGVtcHRpbWUsIHNpemVvZih0ZW1wdGltZSksICIlSDolTTolUyIsIHRzdGFtcCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdHJmdGltZSBmYWlscy4gdG1fc2VjPSIgPDwgdHN0YW1wLT50bV9zZWMgPDwgIiwgdG1fbWluPSIgPDwgdHN0YW1wLT50bV9taW4KLSAgICAgICAgICAgICAgICAgICA8PCAiLCB0bV9ob3VyPSIgPDwgdHN0YW1wLT50bV9ob3VyOwotICAgICAgICBzdHJsY3B5KHRlbXB0aW1lLCAiVU5LTk9XTiBUSU1FIiwgc2l6ZW9mKHRlbXB0aW1lKSk7Ci0gICAgICB9Ci0gICAgICBzbnByaW50ZihldmVudHRpbWUsIHNpemVvZihldmVudHRpbWUpLCAiJXMuJTAzbGQiLCB0ZW1wdGltZSwgcnNzaV9sb2dzLnRpbWVzdGFtcC50dl9uc2VjIC8gMTAwMDAwMCk7Ci0KLSAgICAgIGRwcmludGYoZmQsICIgICAgJXM6ICIsIGV2ZW50dGltZSk7Ci0KLSAgICAgIGZvciAoYXV0byByc3NpX3ZhbHVlIDogcnNzaV9sb2dzLnJzc2kpIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAlMDRkIiwgcnNzaV92YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIER1bXAoaW50IGZkKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgYm9vbCBzaWRlID0gZGV2aWNlLmNhcGFiaWxpdGllcyAmIENBUEFCSUxJVFlfU0lERTsKLSAgICAgIGJvb2wgc3RhbmRhbG9uZSA9IGRldmljZS5jYXBhYmlsaXRpZXMgJiBDQVBBQklMSVRZX0JJTkFVUkFMOwotICAgICAgc3RyZWFtIDw8ICIgICIgPDwgZGV2aWNlLmFkZHJlc3MuVG9TdHJpbmcoKSA8PCAiICIKLSAgICAgICAgICAgICA8PCAoZGV2aWNlLmFjY2VwdGluZ19hdWRpbyA/ICIiIDogIm5vdCAiKSA8PCAiY29ubmVjdGVkIgotICAgICAgICAgICAgIDw8ICJcbiAgICAiIDw8IChzdGFuZGFsb25lID8gImJpbmF1cmFsIiA6ICJtb25hdXJhbCIpIDw8ICIgIgotICAgICAgICAgICAgIDw8IChzaWRlID8gInJpZ2h0IiA6ICJsZWZ0IikgPDwgIiAiIDw8IGxvZ2hleChkZXZpY2UuaGlfc3luY19pZCkKLSAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICBzdHJlYW0KLSAgICAgICAgICA8PCAiICAgIFBhY2tldCBjb3VudHMgKGVucXVldWVkL2ZsdXNoZWQpICAgICAgICAgICAgICAgICAgICAgICAgOiAiCi0gICAgICAgICAgPDwgZGV2aWNlLmF1ZGlvX3N0YXRzLnBhY2tldF9zZW5kX2NvdW50IDw8ICIgLyAiCi0gICAgICAgICAgPDwgZGV2aWNlLmF1ZGlvX3N0YXRzLnBhY2tldF9mbHVzaF9jb3VudAotICAgICAgICAgIDw8ICJcbiAgICBGcmFtZSBjb3VudHMgKGVucXVldWVkL2ZsdXNoZWQpICAgICAgICAgICAgICAgICAgICAgICAgIDogIgotICAgICAgICAgIDw8IGRldmljZS5hdWRpb19zdGF0cy5mcmFtZV9zZW5kX2NvdW50IDw8ICIgLyAiCi0gICAgICAgICAgPDwgZGV2aWNlLmF1ZGlvX3N0YXRzLmZyYW1lX2ZsdXNoX2NvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgRHVtcFJzc2koZmQsIGRldmljZSk7Ci0gICAgfQotICAgIGRwcmludGYoZmQsICIlcyIsIHN0cmVhbS5zdHIoKS5jX3N0cigpKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFoZWFyaW5nRGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IGFkZHJlc3M7Ci0KLSAgICBib29sIGNvbm5lY3RlZCA9IGhlYXJpbmdEZXZpY2UtPmFjY2VwdGluZ19hdWRpbzsKLQotICAgIExPRyhJTkZPKSA8PCAiR0FQX0VWVF9DT05OX0NMT1NFRDogIiA8PCBoZWFyaW5nRGV2aWNlLT5hZGRyZXNzCi0gICAgICAgICAgICAgIDw8ICIsIHBsYXliYWNrX3N0YXJ0ZWQ9IiA8PCBoZWFyaW5nRGV2aWNlLT5wbGF5YmFja19zdGFydGVkCi0gICAgICAgICAgICAgIDw8ICIsIGFjY2VwdGluZ19hdWRpbz0iIDw8IGhlYXJpbmdEZXZpY2UtPmFjY2VwdGluZ19hdWRpbzsKLQotICAgIGlmIChoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW5nX2FjdGl2ZWx5KSB7Ci0gICAgICAvLyBjYW5jZWwgcGVuZGluZyBkaXJlY3QgY29ubmVjdAotICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZ2F0dF9pZiwgYWRkcmVzcywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlcyBhbGwgcmVnaXN0cmF0aW9ucyBmb3IgY29ubmVjdGlvbi4KLSAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbigwLCBhZGRyZXNzLCBmYWxzZSk7Ci0KLSAgICAvLyBJbmZvcm0gdGhlIG90aGVyIHNpZGUgKGlmIGFueSkgb2YgdGhpcyBkaXNjb25uZWN0aW9uCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5mb3JtX2Rpc2Nvbm5fc3RhdGUoCi0gICAgICAgIHtDT05UUk9MX1BPSU5UX09QX1NUQVRFX0NIQU5HRSwgU1RBVEVfQ0hBTkdFX09USEVSX1NJREVfRElTQ09OTkVDVEVEfSk7Ci0gICAgc2VuZF9zdGF0ZV9jaGFuZ2VfdG9fb3RoZXJfc2lkZShoZWFyaW5nRGV2aWNlLCBpbmZvcm1fZGlzY29ubl9zdGF0ZSk7Ci0KLSAgICBEb0Rpc2Nvbm5lY3RDbGVhblVwKGhlYXJpbmdEZXZpY2UpOwotCi0gICAgaGVhcmluZ0RldmljZXMuUmVtb3ZlKGFkZHJlc3MpOwotCi0gICAgaWYgKCFjb25uZWN0ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYWxsYmFja3MtPk9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCBhZGRyZXNzKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGhlYXJpbmdEZXZpY2VzLmRldmljZXMpIHsKLSAgICAgIGlmIChkZXZpY2UuYWNjZXB0aW5nX2F1ZGlvKSByZXR1cm47Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBObyBtb3JlICgwLyIgPDwgR2V0RGV2aWNlQ291bnQoKQotICAgICAgICAgICAgICA8PCAiKSBkZXZpY2VzIHJlYWR5IjsKLSAgICBEb0Rpc2Nvbm5lY3RBdWRpb1N0b3AoKTsKLSAgfQotCi0gIHZvaWQgT25HYXR0RGlzY29ubmVjdGVkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyByZW1vdGVfYmRhKSB7Ci0gICAgSGVhcmluZ0RldmljZSogaGVhcmluZ0RldmljZSA9IGhlYXJpbmdEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWhlYXJpbmdEZXZpY2UpIHsKLSAgICAgIFZMT0coMikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIGRpc2Nvbm5lY3QsIGNvbm5faWQ9IgotICAgICAgICAgICAgICA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgPDwgIiwgcmVtb3RlX2JkYT0iIDw8IHJlbW90ZV9iZGE7Ci0KLSAgICAvLyBJbmZvcm0gdGhlIG90aGVyIHNpZGUgKGlmIGFueSkgb2YgdGhpcyBkaXNjb25uZWN0aW9uCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5mb3JtX2Rpc2Nvbm5fc3RhdGUoCi0gICAgICAgIHtDT05UUk9MX1BPSU5UX09QX1NUQVRFX0NIQU5HRSwgU1RBVEVfQ0hBTkdFX09USEVSX1NJREVfRElTQ09OTkVDVEVEfSk7Ci0gICAgc2VuZF9zdGF0ZV9jaGFuZ2VfdG9fb3RoZXJfc2lkZShoZWFyaW5nRGV2aWNlLCBpbmZvcm1fZGlzY29ubl9zdGF0ZSk7Ci0KLSAgICBEb0Rpc2Nvbm5lY3RDbGVhblVwKGhlYXJpbmdEZXZpY2UpOwotCi0gICAgLy8gVGhpcyBpcyBuZWVkZWQganVzdCBmb3IgdGhlIGZpcnN0IGNvbm5lY3Rpb24uIEFmdGVyIHN0YWNrIGlzIHJlc3RhcnRlZCwKLSAgICAvLyBjb2RlIHRoYXQgbG9hZHMgZGV2aWNlIHdpbGwgYWRkIHRoZW0gdG8gYWNjZXB0bGlzdC4KLSAgICBCVEFfR0FUVENfT3BlbihnYXR0X2lmLCBoZWFyaW5nRGV2aWNlLT5hZGRyZXNzLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgY2FsbGJhY2tzLT5PbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCwgcmVtb3RlX2JkYSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGhlYXJpbmdEZXZpY2VzLmRldmljZXMpIHsKLSAgICAgIGlmIChkZXZpY2UuYWNjZXB0aW5nX2F1ZGlvKSByZXR1cm47Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBObyBtb3JlICgwLyIgPDwgR2V0RGV2aWNlQ291bnQoKQotICAgICAgICAgICAgICA8PCAiKSBkZXZpY2VzIHJlYWR5IjsKLSAgICBEb0Rpc2Nvbm5lY3RBdWRpb1N0b3AoKTsKLSAgfQotCi0gIHZvaWQgRG9EaXNjb25uZWN0Q2xlYW5VcChIZWFyaW5nRGV2aWNlKiBoZWFyaW5nRGV2aWNlKSB7Ci0gICAgaWYgKGhlYXJpbmdEZXZpY2UtPmNvbm5lY3Rpb25fdXBkYXRlX3N0YXR1cyAhPSBDT01QTEVURUQpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uZWN0aW9uIHVwZGF0ZSBub3QgY29tcGxldGVkLiBDdXJyZW50PSIKLSAgICAgICAgICAgICAgICA8PCBoZWFyaW5nRGV2aWNlLT5jb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMKLSAgICAgICAgICAgICAgICA8PCAiLCBkZXZpY2U9IiA8PCBoZWFyaW5nRGV2aWNlLT5hZGRyZXNzOwotCi0gICAgICBpZiAoaGVhcmluZ0RldmljZS0+Y29ubmVjdGlvbl91cGRhdGVfc3RhdHVzID09IFNUQVJURUQpIHsKLSAgICAgICAgT25Db25uZWN0aW9uVXBkYXRlQ29tcGxldGUoaGVhcmluZ0RldmljZS0+Y29ubl9pZCwgTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGhlYXJpbmdEZXZpY2UtPmNvbm5lY3Rpb25fdXBkYXRlX3N0YXR1cyA9IE5PTkU7Ci0KLSAgICBpZiAoaGVhcmluZ0RldmljZS0+Y29ubl9pZCkgewotICAgICAgQnRhR2F0dFF1ZXVlOjpDbGVhbihoZWFyaW5nRGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShoZWFyaW5nRGV2aWNlLT5jb25uX2lkKTsKLSAgICAgIGhlYXJpbmdEZXZpY2UtPmNvbm5faWQgPSAwOwotICAgIH0KLQotICAgIGlmIChoZWFyaW5nRGV2aWNlLT5nYXBfaGFuZGxlKSB7Ci0gICAgICBHQVBfQ29ubkNsb3NlKGhlYXJpbmdEZXZpY2UtPmdhcF9oYW5kbGUpOwotICAgICAgaGVhcmluZ0RldmljZS0+Z2FwX2hhbmRsZSA9IDA7Ci0gICAgfQotCi0gICAgaGVhcmluZ0RldmljZS0+YWNjZXB0aW5nX2F1ZGlvID0gZmFsc2U7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGhlYXJpbmdEZXZpY2UtPmFkZHJlc3MKLSAgICAgICAgICAgICAgPDwgIiwgcGxheWJhY2tfc3RhcnRlZD0iIDw8IGhlYXJpbmdEZXZpY2UtPnBsYXliYWNrX3N0YXJ0ZWQ7Ci0gICAgaGVhcmluZ0RldmljZS0+cGxheWJhY2tfc3RhcnRlZCA9IGZhbHNlOwotICAgIGhlYXJpbmdEZXZpY2UtPmNvbW1hbmRfYWNrZWQgPSBmYWxzZTsKLSAgfQotCi0gIHZvaWQgRG9EaXNjb25uZWN0QXVkaW9TdG9wKCkgewotICAgIEhlYXJpbmdBaWRBdWRpb1NvdXJjZTo6U3RvcCgpOwotICAgIGF1ZGlvX3J1bm5pbmcgPSBmYWxzZTsKLSAgICBlbmNvZGVyX3N0YXRlX3JlbGVhc2UoKTsKLSAgICBjdXJyZW50X3ZvbHVtZSA9IFZPTFVNRV9VTktOT1dOOwotICB9Ci0KLSAgdm9pZCBTZXRWb2x1bWUoaW50OF90IHZvbHVtZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogIiA8PCArdm9sdW1lOwotICAgIGN1cnJlbnRfdm9sdW1lID0gdm9sdW1lOwotICAgIGZvciAoSGVhcmluZ0RldmljZSYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgaWYgKCFkZXZpY2UuYWNjZXB0aW5nX2F1ZGlvKSBjb250aW51ZTsKLQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdm9sdW1lX3ZhbHVlKHtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPih2b2x1bWUpfSk7Ci0gICAgICBCdGFHYXR0UXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMoZGV2aWNlLmNvbm5faWQsIGRldmljZS52b2x1bWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV92YWx1ZSwgR0FUVF9XUklURV9OT19SU1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDbGVhblVwKCkgewotICAgIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyKGdhdHRfaWYpOwotICAgIGZvciAoSGVhcmluZ0RldmljZSYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgRG9EaXNjb25uZWN0Q2xlYW5VcCgmZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBoZWFyaW5nRGV2aWNlcy5kZXZpY2VzLmNsZWFyKCk7Ci0KLSAgICBlbmNvZGVyX3N0YXRlX3JlbGVhc2UoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdWludDhfdCBnYXR0X2lmOwotICB1aW50OF90IHNlcV9jb3VudGVyOwotICAvKiBjdXJyZW50IHZvbHVtZSBnYWluIGZvciB0aGUgaGVhcmluZyBhaWRzKi8KLSAgaW50OF90IGN1cnJlbnRfdm9sdW1lOwotICBibHVldG9vdGg6OmhlYXJpbmdfYWlkOjpIZWFyaW5nQWlkQ2FsbGJhY2tzKiBjYWxsYmFja3M7Ci0KLSAgLyogY3VycmVudGx5IHVzZWQgY29kZWMgKi8KLSAgdWludDhfdCBjb2RlY19pbl91c2U7Ci0KLSAgdWludDE2X3QgZGVmYXVsdF9kYXRhX2ludGVydmFsX21zOwotCi0gIEhlYXJpbmdEZXZpY2VzIGhlYXJpbmdEZXZpY2VzOwotCi0gIHZvaWQgZmluZF9zZXJ2ZXJfY2hhbmdlZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UqIHNlcnZpY2UpIHsKLSAgICBIZWFyaW5nRGV2aWNlKiBoZWFyaW5nRGV2aWNlID0gaGVhcmluZ0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghaGVhcmluZ0RldmljZSkgewotICAgICAgRFZMT0coMikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIGlmIChjaGFyYWMudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0dBVFRfU1JWX0NIR0QpKSB7Ci0gICAgICAgIGhlYXJpbmdEZXZpY2UtPnNlcnZpY2VfY2hhbmdlZF9jY2NfaGFuZGxlID0KLSAgICAgICAgICAgIGZpbmRfY2NjX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgaWYgKCFoZWFyaW5nRGV2aWNlLT5zZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IGNhbm5vdCBmaW5kIHNlcnZpY2UgY2hhbmdlZCBDQ0MgZGVzY3JpcHRvciI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2VydmljZV9jaGFuZ2VkX2NjYz0iCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgoaGVhcmluZ0RldmljZS0+c2VydmljZV9jaGFuZ2VkX2NjY19oYW5kbGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBGaW5kIHRoZSBoYW5kbGUgZm9yIHRoZSBjbGllbnQgY2hhcmFjdGVyaXN0aWNzIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbgotICAvLyBjaGFyYWN0ZXJpc3RpY3MKLSAgdWludDE2X3QgZmluZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNoYXJfaGFuZGxlKSB7Ci0gICAgY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHBfY2hhciA9Ci0gICAgICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBjaGFyX2hhbmRsZSk7Ci0KLSAgICBpZiAoIXBfY2hhcikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IE5vIHN1Y2ggY2hhcmFjdGVyaXN0aWM6ICIgPDwgY2hhcl9oYW5kbGU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkRlc2NyaXB0b3ImIGRlc2MgOiBwX2NoYXItPmRlc2NyaXB0b3JzKSB7Ci0gICAgICBpZiAoZGVzYy51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSkKLSAgICAgICAgcmV0dXJuIGRlc2MuaGFuZGxlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBzZW5kX3N0YXRlX2NoYW5nZShIZWFyaW5nRGV2aWNlKiBkZXZpY2UsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWQpIHsKLSAgICBpZiAoZGV2aWNlLT5jb25uX2lkICE9IDApIHsKLSAgICAgIGlmIChkZXZpY2UtPnNlcnZpY2VfY2hhbmdlZF9yY3ZkKSB7Ci0gICAgICAgIExPRyhJTkZPKQotICAgICAgICAgICAgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICI6IHNlcnZpY2UgZGlzY292ZXIgaXMgaW4gcHJvZ3Jlc3MsIHNraXAgc2VuZCBTdGF0ZSBDaGFuZ2UgY21kLiI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8vIFNlbmQgdGhlIGRhdGEgcGFja2V0Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU2VuZCBTdGF0ZSBDaGFuZ2UuIGRldmljZT0iIDw8IGRldmljZS0+YWRkcmVzcwotICAgICAgICAgICAgICAgIDw8ICIsIHN0YXR1cz0iIDw8IGxvZ2hleChwYXlsb2FkWzFdKTsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICBkZXZpY2UtPmNvbm5faWQsIGRldmljZS0+YXVkaW9fY29udHJvbF9wb2ludF9oYW5kbGUsIHBheWxvYWQsCi0gICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2VuZF9zdGF0ZV9jaGFuZ2VfdG9fb3RoZXJfc2lkZShIZWFyaW5nRGV2aWNlKiB0aGlzX3NpZGVfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCkgewotICAgIGZvciAoYXV0byYgZGV2aWNlIDogaGVhcmluZ0RldmljZXMuZGV2aWNlcykgewotICAgICAgaWYgKChkZXZpY2UuYWRkcmVzcyA9PSB0aGlzX3NpZGVfZGV2aWNlLT5hZGRyZXNzKSB8fAotICAgICAgICAgIChkZXZpY2UuaGlfc3luY19pZCAhPSB0aGlzX3NpZGVfZGV2aWNlLT5oaV9zeW5jX2lkKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHNlbmRfc3RhdGVfY2hhbmdlKCZkZXZpY2UsIHBheWxvYWQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgY2hlY2tfYW5kX2RvX3Jzc2lfcmVhZChIZWFyaW5nRGV2aWNlKiBkZXZpY2UpIHsKLSAgICBpZiAoZGV2aWNlLT5yZWFkX3Jzc2lfY291bnQgPiAwKSB7Ci0gICAgICBkZXZpY2UtPm51bV9pbnRlcnZhbHNfc2luY2VfbGFzdF9yc3NpX3JlYWQrKzsKLSAgICAgIGlmIChkZXZpY2UtPm51bV9pbnRlcnZhbHNfc2luY2VfbGFzdF9yc3NpX3JlYWQgPj0gUEVSSU9EX1RPX1JFQURfUlNTSV9JTl9JTlRFUlZBTFMpIHsKLSAgICAgICAgZGV2aWNlLT5udW1faW50ZXJ2YWxzX3NpbmNlX2xhc3RfcnNzaV9yZWFkID0gMDsKLSAgICAgICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9IiA8PCBkZXZpY2UtPmFkZHJlc3M7Ci0gICAgICAgIEJUTV9SZWFkUlNTSShkZXZpY2UtPmFkZHJlc3MsIHJlYWRfcnNzaV9jYik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi12b2lkIHJlYWRfcnNzaV9jYih2b2lkKiBwX3ZvaWQpIHsKLSAgdEJUTV9SU1NJX1JFU1VMVCogcF9yZXN1bHQgPSAodEJUTV9SU1NJX1JFU1VMVCopcF92b2lkOwotCi0gIGlmICghcF9yZXN1bHQpIHJldHVybjsKLQotICBpZiAoKGluc3RhbmNlKSAmJiAocF9yZXN1bHQtPnN0YXR1cyA9PSBCVE1fU1VDQ0VTUykpIHsKLSAgICBpbnN0YW5jZS0+T25SZWFkUnNzaUNvbXBsZXRlKHBfcmVzdWx0LT5yZW1fYmRhLCBwX3Jlc3VsdC0+cnNzaSk7Ci0gIH0KLX0KLQotdm9pZCBoZWFyaW5nYWlkX2dhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGV2ZW50ID0gIiA8PCArZXZlbnQ7Ci0KLSAgaWYgKHBfZGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRDX0RFUkVHX0VWVDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfT1BFTl9FVlQ6IHsKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIHRCVEFfR0FUVENfT1BFTiYgbyA9IHBfZGF0YS0+b3BlbjsKLSAgICAgIGluc3RhbmNlLT5PbkdhdHRDb25uZWN0ZWQoby5zdGF0dXMsIG8uY29ubl9pZCwgby5jbGllbnRfaWYsIG8ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby50cmFuc3BvcnQsIG8ubXR1KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX0NMT1NFX0VWVDogewotICAgICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotICAgICAgdEJUQV9HQVRUQ19DTE9TRSYgYyA9IHBfZGF0YS0+Y2xvc2U7Ci0gICAgICBpbnN0YW5jZS0+T25HYXR0RGlzY29ubmVjdGVkKGMuY29ubl9pZCwgYy5jbGllbnRfaWYsIGMucmVtb3RlX2JkYSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIGluc3RhbmNlLT5PblNlcnZpY2VTZWFyY2hDb21wbGV0ZShwX2RhdGEtPnNlYXJjaF9jbXBsLmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5zZWFyY2hfY21wbC5zdGF0dXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19OT1RJRl9FVlQ6Ci0gICAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47Ci0gICAgICBpZiAoIXBfZGF0YS0+bm90aWZ5LmlzX25vdGlmeSB8fCBwX2RhdGEtPm5vdGlmeS5sZW4gPiBHQVRUX01BWF9BVFRSX0xFTikgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHJlamVjdGVkIEJUQV9HQVRUQ19OT1RJRl9FVlQuIGlzX25vdGlmeT0iCi0gICAgICAgICAgICAgICAgICAgPDwgcF9kYXRhLT5ub3RpZnkuaXNfbm90aWZ5Ci0gICAgICAgICAgICAgICAgICAgPDwgIiwgbGVuPSIgPDwgcF9kYXRhLT5ub3RpZnkubGVuOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGluc3RhbmNlLT5Pbk5vdGlmaWNhdGlvbkV2ZW50KHBfZGF0YS0+bm90aWZ5LmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm5vdGlmeS5oYW5kbGUsIHBfZGF0YS0+bm90aWZ5LmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bm90aWZ5LnZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfRU5DX0NNUExfQ0JfRVZUOgotICAgICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotICAgICAgaW5zdGFuY2UtPk9uRW5jcnlwdGlvbkNvbXBsZXRlKHBfZGF0YS0+ZW5jX2NtcGwucmVtb3RlX2JkYSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0NPTk5fVVBEQVRFX0VWVDoKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIGluc3RhbmNlLT5PbkNvbm5lY3Rpb25VcGRhdGVDb21wbGV0ZShwX2RhdGEtPmNvbm5fdXBkYXRlLmNvbm5faWQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfQ0hHX0VWVDoKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIGluc3RhbmNlLT5PblNlcnZpY2VDaGFuZ2VFdmVudChwX2RhdGEtPnJlbW90ZV9iZGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TUlZDX0RJU0NfRE9ORV9FVlQ6Ci0gICAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47Ci0gICAgICBpbnN0YW5jZS0+T25TZXJ2aWNlRGlzY0RvbmVFdmVudChwX2RhdGEtPnNlcnZpY2VfY2hhbmdlZC5yZW1vdGVfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgZW5jcnlwdGlvbl9jYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzLCB0QlRfVFJBTlNQT1JULCB2b2lkKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UtPk9uRW5jcnlwdGlvbkNvbXBsZXRlKCphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gQlRNX1NVQ0NFU1MgPyB0cnVlIDogZmFsc2UpOwotICB9Ci19Ci0KLWNsYXNzIEhlYXJpbmdBaWRBdWRpb1JlY2VpdmVySW1wbCA6IHB1YmxpYyBIZWFyaW5nQWlkQXVkaW9SZWNlaXZlciB7Ci0gcHVibGljOgotICB2b2lkIE9uQXVkaW9EYXRhUmVhZHkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkF1ZGlvRGF0YVJlYWR5KGRhdGEpOwotICB9Ci0gIHZvaWQgT25BdWRpb1N1c3BlbmQoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKCk+JiBzdG9wX2F1ZGlvX3RpY2tzKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25BdWRpb1N1c3BlbmQoc3RvcF9hdWRpb190aWNrcyk7Ci0gIH0KLSAgdm9pZCBPbkF1ZGlvUmVzdW1lKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYgc3RhcnRfYXVkaW9fdGlja3MpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkF1ZGlvUmVzdW1lKHN0YXJ0X2F1ZGlvX3RpY2tzKTsKLSAgfQotfTsKLQotSGVhcmluZ0FpZEF1ZGlvUmVjZWl2ZXJJbXBsIGF1ZGlvUmVjZWl2ZXJJbXBsOwotCi19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBIZWFyaW5nQWlkOjpJbml0aWFsaXplKAotICAgIGJsdWV0b290aDo6aGVhcmluZ19haWQ6OkhlYXJpbmdBaWRDYWxsYmFja3MqIGNhbGxiYWNrcywgQ2xvc3VyZSBpbml0Q2IpIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZCEiOwotICB9Ci0KLSAgYXVkaW9SZWNlaXZlciA9ICZhdWRpb1JlY2VpdmVySW1wbDsKLSAgaW5zdGFuY2UgPSBuZXcgSGVhcmluZ0FpZEltcGwoY2FsbGJhY2tzLCBpbml0Q2IpOwotICBIZWFyaW5nQWlkQXVkaW9Tb3VyY2U6OkluaXRpYWxpemUoKTsKLX0KLQotYm9vbCBIZWFyaW5nQWlkOjpJc0hlYXJpbmdBaWRSdW5uaW5nKCkgeyByZXR1cm4gaW5zdGFuY2U7IH0KLQotSGVhcmluZ0FpZCogSGVhcmluZ0FpZDo6R2V0KCkgewotICBDSEVDSyhpbnN0YW5jZSk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX07Ci0KLXZvaWQgSGVhcmluZ0FpZDo6QWRkRnJvbVN0b3JhZ2UoY29uc3QgSGVhcmluZ0RldmljZSYgZGV2X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlzX2FjY2VwdGxpc3RlZCkgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTm90IGluaXRpYWxpemVkIHlldCI7Ci0gIH0KLQotICBpbnN0YW5jZS0+QWRkRnJvbVN0b3JhZ2UoZGV2X2luZm8sIGlzX2FjY2VwdGxpc3RlZCk7Ci19OwotCi1pbnQgSGVhcmluZ0FpZDo6R2V0RGV2aWNlQ291bnQoKSB7Ci0gIGlmICghaW5zdGFuY2UpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogTm90IGluaXRpYWxpemVkIHlldCI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gKGluc3RhbmNlLT5HZXREZXZpY2VDb3VudCgpKTsKLX0KLQotdm9pZCBIZWFyaW5nQWlkOjpDbGVhblVwKCkgewotICAvLyBNdXN0IHN0b3AgYXVkaW8gc291cmNlIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGNhbGwgYW55IG9mIGNhbGxiYWNrcyBvbiBvdXIKLSAgLy8gc29vbiB0byBiZSAgbnVsbCBpbnN0YW5jZQotICBIZWFyaW5nQWlkQXVkaW9Tb3VyY2U6OlN0b3AoKTsKLQotICBIZWFyaW5nQWlkSW1wbCogcHRyID0gaW5zdGFuY2U7Ci0gIGluc3RhbmNlID0gbnVsbHB0cjsKLSAgSGVhcmluZ0FpZEF1ZGlvU291cmNlOjpDbGVhblVwKCk7Ci0KLSAgcHRyLT5DbGVhblVwKCk7Ci0KLSAgZGVsZXRlIHB0cjsKLX07Ci0KLXZvaWQgSGVhcmluZ0FpZDo6RGVidWdEdW1wKGludCBmZCkgewotICBkcHJpbnRmKGZkLCAiSGVhcmluZyBBaWQgTWFuYWdlcjpcbiIpOwotICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5EdW1wKGZkKTsKLSAgSGVhcmluZ0FpZEF1ZGlvU291cmNlOjpEZWJ1Z0R1bXAoZmQpOwotICBkcHJpbnRmKGZkLCAiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9oZWFyaW5nX2FpZC9oZWFyaW5nX2FpZF9hdWRpb19zb3VyY2UuY2MgYi9idGEvaGVhcmluZ19haWQvaGVhcmluZ19haWRfYXVkaW9fc291cmNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E2ODRjLi4wMDAwMDAwCi0tLSBhL2J0YS9oZWFyaW5nX2FpZC9oZWFyaW5nX2FpZF9hdWRpb19zb3VyY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJhdWRpb19oYWxfaW50ZXJmYWNlL2hlYXJpbmdfYWlkX3NvZnR3YXJlX2VuY29kaW5nLmgiCi0jaW5jbHVkZSAiYXVkaW9faGVhcmluZ19haWRfaHcvaW5jbHVkZS9hdWRpb19oZWFyaW5nX2FpZF9ody5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZWFyaW5nX2FpZF9hcGkuaCIKLSNpbmNsdWRlICJjb21tb24vcmVwZWF0aW5nX3RpbWVyLmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGdldF9tYWluX3RocmVhZAotI2luY2x1ZGUgInVkcnYvaW5jbHVkZS91aXBjLmgiCi0KLXVzaW5nIGJhc2U6OkZpbGVQYXRoOwotCi1uYW1lc3BhY2UgewotI2RlZmluZSBDQVNFX1JFVFVSTl9TVFIoY29uc3QpIFwKLSAgY2FzZSBjb25zdDogICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb25zdDsKLQotY29uc3QgY2hhciogYXVkaW9faGFfaHdfZHVtcF9jdHJsX2V2ZW50KHRIRUFSSU5HX0FJRF9DVFJMX0NNRCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfQ01EX05PTkUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEhFQVJJTkdfQUlEX0NUUkxfQ01EX0NIRUNLX1JFQURZKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVEFSVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9DTURfU1RPUCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9DTURfU1VTUEVORCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSEVBUklOR19BSURfQ1RSTF9HRVRfSU5QVVRfQVVESU9fQ09ORklHKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0dFVF9PVVRQVVRfQVVESU9fQ09ORklHKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX1NFVF9PVVRQVVRfQVVESU9fQ09ORklHKQotICAgIENBU0VfUkVUVVJOX1NUUihIRUFSSU5HX0FJRF9DVFJMX0NNRF9PRkZMT0FEX1NUQVJUKQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAiVU5LTk9XTiBIRUFSSU5HX0FJRF9DVFJMX0NNRCI7Ci19Ci0KLWludCBiaXRfcmF0ZSA9IC0xOwotaW50IHNhbXBsZV9yYXRlID0gLTE7Ci1pbnQgZGF0YV9pbnRlcnZhbF9tcyA9IC0xOwotaW50IG51bV9jaGFubmVscyA9IDI7Ci1ibHVldG9vdGg6OmNvbW1vbjo6UmVwZWF0aW5nVGltZXIgYXVkaW9fdGltZXI7Ci1IZWFyaW5nQWlkQXVkaW9SZWNlaXZlciogbG9jYWxBdWRpb1JlY2VpdmVyID0gbnVsbHB0cjsKLXN0ZDo6dW5pcXVlX3B0cjx0VUlQQ19TVEFURT4gdWlwY19oZWFyaW5nX2FpZCA9IG51bGxwdHI7Ci0KLXN0cnVjdCBBdWRpb0hhbFN0YXRzIHsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2J5dGVzOwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF91bmRlcmZsb3dfY291bnQ7Ci0gIHVpbnQ2NF90IG1lZGlhX3JlYWRfbGFzdF91bmRlcmZsb3dfdXM7Ci0KLSAgQXVkaW9IYWxTdGF0cygpIHsgUmVzZXQoKTsgfQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgbWVkaWFfcmVhZF90b3RhbF91bmRlcmZsb3dfYnl0ZXMgPSAwOwotICAgIG1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2NvdW50ID0gMDsKLSAgICBtZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzID0gMDsKLSAgfQotfTsKLQotQXVkaW9IYWxTdGF0cyBzdGF0czsKLQotYm9vbCBoZWFyaW5nX2FpZF9vbl9yZXN1bWVfcmVxKGJvb2wgc3RhcnRfbWVkaWFfdGFzayk7Ci1ib29sIGhlYXJpbmdfYWlkX29uX3N1c3BlbmRfcmVxKCk7Ci0KLXZvaWQgc2VuZF9hdWRpb19kYXRhKCkgewotICB1aW50MzJfdCBieXRlc19wZXJfdGljayA9Ci0gICAgICAobnVtX2NoYW5uZWxzICogc2FtcGxlX3JhdGUgKiBkYXRhX2ludGVydmFsX21zICogKGJpdF9yYXRlIC8gOCkpIC8gMTAwMDsKLQotICB1aW50OF90IHBfYnVmW2J5dGVzX3Blcl90aWNrXTsKLQotICB1aW50MzJfdCBieXRlc19yZWFkOwotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6aGVhcmluZ19haWQ6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgYnl0ZXNfcmVhZCA9IGJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjpyZWFkKHBfYnVmLCBieXRlc19wZXJfdGljayk7Ci0gIH0gZWxzZSB7Ci0gICAgYnl0ZXNfcmVhZCA9IFVJUENfUmVhZCgqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9BVURJTywgcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19wZXJfdGljayk7Ci0gIH0KLQotICBWTE9HKDIpIDw8ICJieXRlc19yZWFkOiAiIDw8IGJ5dGVzX3JlYWQ7Ci0gIGlmIChieXRlc19yZWFkIDwgYnl0ZXNfcGVyX3RpY2spIHsKLSAgICBzdGF0cy5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlcyArPSBieXRlc19wZXJfdGljayAtIGJ5dGVzX3JlYWQ7Ci0gICAgc3RhdHMubWVkaWFfcmVhZF90b3RhbF91bmRlcmZsb3dfY291bnQrKzsKLSAgICBzdGF0cy5tZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzID0KLSAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKHBfYnVmLCBwX2J1ZiArIGJ5dGVzX3JlYWQpOwotCi0gIGlmIChsb2NhbEF1ZGlvUmVjZWl2ZXIgIT0gbnVsbHB0cikgewotICAgIGxvY2FsQXVkaW9SZWNlaXZlci0+T25BdWRpb0RhdGFSZWFkeShkYXRhKTsKLSAgfQotfQotCi12b2lkIGhlYXJpbmdfYWlkX3NlbmRfYWNrKHRIRUFSSU5HX0FJRF9DVFJMX0FDSyBzdGF0dXMpIHsKLSAgdWludDhfdCBhY2sgPSBzdGF0dXM7Ci0gIERWTE9HKDIpIDw8ICJIZWFyaW5nIEFpZCBhdWRpbyBjdHJsIGFjazogIiA8PCBzdGF0dXM7Ci0gIFVJUENfU2VuZCgqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLCAmYWNrLCBzaXplb2YoYWNrKSk7Ci19Ci0KLXZvaWQgc3RhcnRfYXVkaW9fdGlja3MoKSB7Ci0gIGlmIChkYXRhX2ludGVydmFsX21zICE9IEhBX0lOVEVSVkFMXzEwX01TICYmCi0gICAgICBkYXRhX2ludGVydmFsX21zICE9IEhBX0lOVEVSVkFMXzIwX01TKSB7Ci0gICAgTE9HKEZBVEFMKSA8PCAiIFVuc3VwcG9ydGVkIGRhdGEgaW50ZXJ2YWw6ICIgPDwgZGF0YV9pbnRlcnZhbF9tczsKLSAgfQotCi0gIHdha2Vsb2NrX2FjcXVpcmUoKTsKLSAgYXVkaW9fdGltZXIuU2NoZWR1bGVQZXJpb2RpYygKLSAgICAgIGdldF9tYWluX3RocmVhZCgpLT5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwgYmFzZTo6QmluZCgmc2VuZF9hdWRpb19kYXRhKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhkYXRhX2ludGVydmFsX21zKSk7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBydW5uaW5nIHdpdGggZGF0YSBpbnRlcnZhbDogIiA8PCBkYXRhX2ludGVydmFsX21zOwotfQotCi12b2lkIHN0b3BfYXVkaW9fdGlja3MoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdG9wcGVkIjsKLSAgYXVkaW9fdGltZXIuQ2FuY2VsQW5kV2FpdCgpOwotICB3YWtlbG9ja19yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgaGVhcmluZ19haWRfZGF0YV9jYih0VUlQQ19DSF9JRCwgdFVJUENfRVZFTlQgZXZlbnQpIHsKLSAgRFZMT0coMikgPDwgIkhlYXJpbmcgQWlkIGF1ZGlvIGRhdGEgZXZlbnQ6ICIgPDwgZXZlbnQ7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFVJUENfT1BFTl9FVlQ6Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogVUlQQ19PUEVOX0VWVCI7Ci0gICAgICAvKgotICAgICAgICogUmVhZCBkaXJlY3RseSBmcm9tIG1lZGlhIHRhc2sgZnJvbSBoZXJlIG9uIChrZWVwIGNhbGxiYWNrIGZvcgotICAgICAgICogY29ubmVjdGlvbiBldmVudHMuCi0gICAgICAgKi8KLSAgICAgIFVJUENfSW9jdGwoKnVpcGNfaGVhcmluZ19haWQsIFVJUENfQ0hfSURfQVZfQVVESU8sCi0gICAgICAgICAgICAgICAgIFVJUENfUkVHX1JFTU9WRV9BQ1RJVkVfUkVBRFNFVCwgTlVMTCk7Ci0gICAgICBVSVBDX0lvY3RsKCp1aXBjX2hlYXJpbmdfYWlkLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBVSVBDX1NFVF9SRUFEX1BPTExfVE1PLAotICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigwKSk7Ci0KLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2Uoc3RhcnRfYXVkaW9fdGlja3MpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVUlQQ19DTE9TRV9FVlQ6Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogVUlQQ19DTE9TRV9FVlQiOwotICAgICAgaGVhcmluZ19haWRfc2VuZF9hY2soSEVBUklOR19BSURfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKHN0b3BfYXVkaW9fdGlja3MpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRVJST1IpIDw8ICJIZWFyaW5nIEFpZCBhdWRpbyBkYXRhIGV2ZW50IG5vdCByZWNvZ25pemVkOiIgPDwgZXZlbnQ7Ci0gIH0KLX0KLQotdm9pZCBoZWFyaW5nX2FpZF9yZWN2X2N0cmxfZGF0YSgpIHsKLSAgdEhFQVJJTkdfQUlEX0NUUkxfQ01EIGNtZCA9IEhFQVJJTkdfQUlEX0NUUkxfQ01EX05PTkU7Ci0gIGludCBuOwotCi0gIHVpbnQ4X3QgcmVhZF9jbWQgPSAwOyAvKiBUaGUgcmVhZCBjb21tYW5kIHNpemUgaXMgb25lIG9jdGV0ICovCi0gIG4gPSBVSVBDX1JlYWQoKnVpcGNfaGVhcmluZ19haWQsIFVJUENfQ0hfSURfQVZfQ1RSTCwgJnJlYWRfY21kLCAxKTsKLSAgY21kID0gc3RhdGljX2Nhc3Q8dEhFQVJJTkdfQUlEX0NUUkxfQ01EPihyZWFkX2NtZCk7Ci0KLSAgLyogZGV0YWNoIG9uIGN0cmwgY2hhbm5lbCBtZWFucyBhdWRpb2ZsaW5nZXIgcHJvY2VzcyB3YXMgdGVybWluYXRlZCAqLwotICBpZiAobiA9PSAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICJDVFJMIENIIERFVEFDSEVEIjsKLSAgICBVSVBDX0Nsb3NlKCp1aXBjX2hlYXJpbmdfYWlkLCBVSVBDX0NIX0lEX0FWX0NUUkwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYXVkaW9faGFfaHdfZHVtcF9jdHJsX2V2ZW50KGNtZCk7Ci0gIC8vICBhMmRwX2NtZF9wZW5kaW5nID0gY21kOwotCi0gIHRIRUFSSU5HX0FJRF9DVFJMX0FDSyBjdHJsX2Fja19zdGF0dXM7Ci0KLSAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIEhFQVJJTkdfQUlEX0NUUkxfQ01EX0NIRUNLX1JFQURZOgotICAgICAgaGVhcmluZ19haWRfc2VuZF9hY2soSEVBUklOR19BSURfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSEVBUklOR19BSURfQ1RSTF9DTURfU1RBUlQ6Ci0gICAgICBjdHJsX2Fja19zdGF0dXMgPSBIRUFSSU5HX0FJRF9DVFJMX0FDS19TVUNDRVNTOwotICAgICAgLy8gdGltZXIgaXMgcmVzdGFydGVkIGluIFVJUENfT3BlbgotICAgICAgaWYgKCFoZWFyaW5nX2FpZF9vbl9yZXN1bWVfcmVxKGZhbHNlKSkgewotICAgICAgICBjdHJsX2Fja19zdGF0dXMgPSBIRUFSSU5HX0FJRF9DVFJMX0FDS19GQUlMVVJFOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVUlQQ19PcGVuKCp1aXBjX2hlYXJpbmdfYWlkLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBoZWFyaW5nX2FpZF9kYXRhX2NiLAotICAgICAgICAgICAgICAgICAgSEVBUklOR19BSURfREFUQV9QQVRIKTsKLSAgICAgIH0KLSAgICAgIGhlYXJpbmdfYWlkX3NlbmRfYWNrKGN0cmxfYWNrX3N0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSEVBUklOR19BSURfQ1RSTF9DTURfU1RPUDoKLSAgICAgIGlmICghaGVhcmluZ19haWRfb25fc3VzcGVuZF9yZXEoKSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjpIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVE9QOiBoZWFyaW5nX2FpZF9vbl9zdXNwZW5kX3JlcSgpIGVycnMsIGJ1dCBpZ25vcmVkLiI7Ci0gICAgICB9Ci0gICAgICBoZWFyaW5nX2FpZF9zZW5kX2FjayhIRUFSSU5HX0FJRF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVVNQRU5EOgotICAgICAgY3RybF9hY2tfc3RhdHVzID0gSEVBUklOR19BSURfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgICAgIGlmICghaGVhcmluZ19haWRfb25fc3VzcGVuZF9yZXEoKSkgewotICAgICAgICBjdHJsX2Fja19zdGF0dXMgPSBIRUFSSU5HX0FJRF9DVFJMX0FDS19GQUlMVVJFOwotICAgICAgfQotICAgICAgaGVhcmluZ19haWRfc2VuZF9hY2soY3RybF9hY2tfc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIRUFSSU5HX0FJRF9DVFJMX0dFVF9PVVRQVVRfQVVESU9fQ09ORklHOiB7Ci0gICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnOwotICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NhcGFiaWxpdHk7Ci0gICAgICBpZiAoc2FtcGxlX3JhdGUgPT0gMTYwMDApIHsKLSAgICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5LnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOwotICAgICAgfSBlbHNlIGlmIChzYW1wbGVfcmF0ZSA9PSAyNDAwMCkgewotICAgICAgICBjb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDA7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coRkFUQUwpIDw8ICJ1bnN1cHBvcnRlZCBzYW1wbGUgcmF0ZTogIiA8PCBzYW1wbGVfcmF0ZTsKLSAgICAgIH0KLQotICAgICAgY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5LmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0KLSAgICAgIGNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHkuY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0KLSAgICAgIGhlYXJpbmdfYWlkX3NlbmRfYWNrKEhFQVJJTkdfQUlEX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgLy8gU2VuZCB0aGUgY3VycmVudCBjb2RlYyBjb25maWcKLSAgICAgIFVJUENfU2VuZCgqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZjb2RlY19jb25maWcuc2FtcGxlX3JhdGUpLAotICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdCkpOwotICAgICAgVUlQQ19TZW5kKCp1aXBjX2hlYXJpbmdfYWlkLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsCi0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJmNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUpLAotICAgICAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QpKTsKLSAgICAgIFVJUENfU2VuZCgqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSk7Ci0gICAgICAvLyBTZW5kIHRoZSBjdXJyZW50IGNvZGVjIGNhcGFiaWxpdHkKLSAgICAgIFVJUENfU2VuZCgqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZjb2RlY19jYXBhYmlsaXR5LnNhbXBsZV9yYXRlKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QpKTsKLSAgICAgIFVJUENfU2VuZCgKLSAgICAgICAgICAqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZjb2RlY19jYXBhYmlsaXR5LmJpdHNfcGVyX3NhbXBsZSksCi0gICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCkpOwotICAgICAgVUlQQ19TZW5kKAotICAgICAgICAgICp1aXBjX2hlYXJpbmdfYWlkLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJmNvZGVjX2NhcGFiaWxpdHkuY2hhbm5lbF9tb2RlKSwKLSAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEhFQVJJTkdfQUlEX0NUUkxfU0VUX09VVFBVVF9BVURJT19DT05GSUc6IHsKLSAgICAgIC8vIFRPRE86IHdlIG9ubHkgc3VwcG9ydCBvbmUgY29uZmlnIGZvciBub3chCi0gICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnOwotICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gICAgICBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICAgICAgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLQotICAgICAgaGVhcmluZ19haWRfc2VuZF9hY2soSEVBUklOR19BSURfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICAvLyBTZW5kIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZwotICAgICAgaWYgKFVJUENfUmVhZCgqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLAotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSkgIT0KLSAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkVycm9yIHJlYWRpbmcgc2FtcGxlIHJhdGUgZnJvbSBhdWRpbyBIQUwiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChVSVBDX1JlYWQoKnVpcGNfaGVhcmluZ19haWQsIFVJUENfQ0hfSURfQVZfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUpLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90KSkgIT0KLSAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90KSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIkVycm9yIHJlYWRpbmcgYml0cyBwZXIgc2FtcGxlIGZyb20gYXVkaW8gSEFMIjsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChVSVBDX1JlYWQoKnVpcGNfaGVhcmluZ19haWQsIFVJUENfQ0hfSURfQVZfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUpLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSkgIT0KLSAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJFcnJvciByZWFkaW5nIGNoYW5uZWwgbW9kZSBmcm9tIGF1ZGlvIEhBTCI7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBIRUFSSU5HX0FJRF9DVFJMX1NFVF9PVVRQVVRfQVVESU9fQ09ORklHOiAiCi0gICAgICAgICAgICAgICAgPDwgInNhbXBsZV9yYXRlPSIgPDwgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlCi0gICAgICAgICAgICAgICAgPDwgImJpdHNfcGVyX3NhbXBsZT0iIDw8IGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUKLSAgICAgICAgICAgICAgICA8PCAiY2hhbm5lbF9tb2RlPSIgPDwgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJVTlNVUFBPUlRFRCBDTUQ6ICIgPDwgY21kOwotICAgICAgaGVhcmluZ19haWRfc2VuZF9hY2soSEVBUklOR19BSURfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICBicmVhazsKLSAgfQotICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICIgYTJkcC1jdHJsLWNtZCA6ICIgPDwgYXVkaW9faGFfaHdfZHVtcF9jdHJsX2V2ZW50KGNtZCkKLSAgICAgICAgICAgIDw8ICIgRE9ORSI7Ci19Ci0KLXZvaWQgaGVhcmluZ19haWRfY3RybF9jYih0VUlQQ19DSF9JRCwgdFVJUENfRVZFTlQgZXZlbnQpIHsKLSAgVkxPRygyKSA8PCAiSGVhcmluZyBBaWQgYXVkaW8gY3RybCBldmVudDogIiA8PCBldmVudDsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgVUlQQ19PUEVOX0VWVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVUlQQ19DTE9TRV9FVlQ6Ci0gICAgICAvKiByZXN0YXJ0IGN0cmwgc2VydmVyIHVubGVzcyB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLwotICAgICAgaWYgKEhlYXJpbmdBaWQ6OklzSGVhcmluZ0FpZFJ1bm5pbmcoKSkgewotICAgICAgICBVSVBDX09wZW4oKnVpcGNfaGVhcmluZ19haWQsIFVJUENfQ0hfSURfQVZfQ1RSTCwgaGVhcmluZ19haWRfY3RybF9jYiwKLSAgICAgICAgICAgICAgICAgIEhFQVJJTkdfQUlEX0NUUkxfUEFUSCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVJUENfUlhfREFUQV9SRUFEWV9FVlQ6Ci0gICAgICBoZWFyaW5nX2FpZF9yZWN2X2N0cmxfZGF0YSgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgIkhlYXJpbmcgQWlkIGF1ZGlvIGN0cmwgdW5yZWNvZ25pemVkIGV2ZW50OiAiIDw8IGV2ZW50OwotICB9Ci19Ci0KLWJvb2wgaGVhcmluZ19haWRfb25fcmVzdW1lX3JlcShib29sIHN0YXJ0X21lZGlhX3Rhc2spIHsKLSAgaWYgKGxvY2FsQXVkaW9SZWNlaXZlciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogSEVBUklOR19BSURfQ1RSTF9DTURfU1RBUlQ6IGF1ZGlvIHJlY2VpdmVyIG5vdCBzdGFydGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotICBpZiAoc3RhcnRfbWVkaWFfdGFzaykgewotICAgIHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZIZWFyaW5nQWlkQXVkaW9SZWNlaXZlcjo6T25BdWRpb1Jlc3VtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGxvY2FsQXVkaW9SZWNlaXZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYXVkaW9fdGlja3MpKTsKLSAgfSBlbHNlIHsKLSAgICBhdXRvIHN0YXJ0X2R1bW15X3RpY2tzID0gW10oKSB7Ci0gICAgICBMT0coSU5GTykgPDwgInN0YXJ0X2F1ZGlvX3RpY2tzOiB3YWl0aW5nIGZvciBkYXRhIHBhdGggb3BlbmVkIjsKLSAgICB9OwotICAgIHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZIZWFyaW5nQWlkQXVkaW9SZWNlaXZlcjo6T25BdWRpb1Jlc3VtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGxvY2FsQXVkaW9SZWNlaXZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZHVtbXlfdGlja3MpKTsKLSAgfQotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogSEVBUklOR19BSURfQ1RSTF9DTURfU1RBUlQ6IGRvX2luX21haW5fdGhyZWFkIGVycj0iCi0gICAgICAgICAgICAgICA8PCBzdGF0dXM7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGhlYXJpbmdfYWlkX29uX3N1c3BlbmRfcmVxKCkgewotICBpZiAobG9jYWxBdWRpb1JlY2VpdmVyID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBIRUFSSU5HX0FJRF9DVFJMX0NNRF9TVVNQRU5EOiBhdWRpbyByZWNlaXZlciBub3Qgc3RhcnRlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJkhlYXJpbmdBaWRBdWRpb1JlY2VpdmVyOjpPbkF1ZGlvU3VzcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQobG9jYWxBdWRpb1JlY2VpdmVyKSwgc3RvcF9hdWRpb190aWNrcykpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogSEVBUklOR19BSURfQ1RSTF9DTURfU1VTUEVORDogZG9faW5fbWFpbl90aHJlYWQgZXJyPSIKLSAgICAgICAgICAgICAgIDw8IHN0YXR1czsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBIZWFyaW5nQWlkQXVkaW9Tb3VyY2U6OlN0YXJ0KGNvbnN0IENvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNDb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYXJpbmdBaWRBdWRpb1JlY2VpdmVyKiBhdWRpb1JlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlbW90ZV9kZWxheV9tcykgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogSGVhcmluZyBBaWQgU291cmNlIE9wZW4iOwotCi0gIGJpdF9yYXRlID0gY29kZWNDb25maWd1cmF0aW9uLmJpdF9yYXRlOwotICBzYW1wbGVfcmF0ZSA9IGNvZGVjQ29uZmlndXJhdGlvbi5zYW1wbGVfcmF0ZTsKLSAgZGF0YV9pbnRlcnZhbF9tcyA9IGNvZGVjQ29uZmlndXJhdGlvbi5kYXRhX2ludGVydmFsX21zOwotCi0gIHN0YXRzLlJlc2V0KCk7Ci0KLSAgaWYgKGJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjppc19oYWxfMl8wX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjpzdGFydF9zZXNzaW9uKCk7Ci0gICAgYmx1ZXRvb3RoOjphdWRpbzo6aGVhcmluZ19haWQ6OnNldF9yZW1vdGVfZGVsYXkocmVtb3RlX2RlbGF5X21zKTsKLSAgfQotICBsb2NhbEF1ZGlvUmVjZWl2ZXIgPSBhdWRpb1JlY2VpdmVyOwotfQotCi12b2lkIEhlYXJpbmdBaWRBdWRpb1NvdXJjZTo6U3RvcCgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEhlYXJpbmcgQWlkIFNvdXJjZSBDbG9zZSI7Ci0KLSAgbG9jYWxBdWRpb1JlY2VpdmVyID0gbnVsbHB0cjsKLSAgaWYgKGJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjppc19oYWxfMl8wX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6YXVkaW86OmhlYXJpbmdfYWlkOjplbmRfc2Vzc2lvbigpOwotICB9Ci0KLSAgc3RvcF9hdWRpb190aWNrcygpOwotfQotCi12b2lkIEhlYXJpbmdBaWRBdWRpb1NvdXJjZTo6SW5pdGlhbGl6ZSgpIHsKLSAgYXV0byBzdHJlYW1fY2IgPSBibHVldG9vdGg6OmF1ZGlvOjpoZWFyaW5nX2FpZDo6U3RyZWFtQ2FsbGJhY2tzewotICAgICAgLm9uX3Jlc3VtZV8gPSBoZWFyaW5nX2FpZF9vbl9yZXN1bWVfcmVxLAotICAgICAgLm9uX3N1c3BlbmRfID0gaGVhcmluZ19haWRfb25fc3VzcGVuZF9yZXEsCi0gIH07Ci0gIGlmICghYmx1ZXRvb3RoOjphdWRpbzo6aGVhcmluZ19haWQ6OmluaXQoc3RyZWFtX2NiLCBnZXRfbWFpbl90aHJlYWQoKSkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogVXNpbmcgbGVnYWN5IEhBTCI7Ci0gICAgdWlwY19oZWFyaW5nX2FpZCA9IFVJUENfSW5pdCgpOwotICAgIFVJUENfT3BlbigqdWlwY19oZWFyaW5nX2FpZCwgVUlQQ19DSF9JRF9BVl9DVFJMLCBoZWFyaW5nX2FpZF9jdHJsX2NiLCBIRUFSSU5HX0FJRF9DVFJMX1BBVEgpOwotICB9Ci19Ci0KLXZvaWQgSGVhcmluZ0FpZEF1ZGlvU291cmNlOjpDbGVhblVwKCkgewotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6aGVhcmluZ19haWQ6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjphdWRpbzo6aGVhcmluZ19haWQ6OmNsZWFudXAoKTsKLSAgfSBlbHNlIHsKLSAgICBVSVBDX0Nsb3NlKCp1aXBjX2hlYXJpbmdfYWlkLCBVSVBDX0NIX0lEX0FMTCk7Ci0gICAgdWlwY19oZWFyaW5nX2FpZCA9IG51bGxwdHI7Ci0gIH0KLX0KLQotdm9pZCBIZWFyaW5nQWlkQXVkaW9Tb3VyY2U6OkRlYnVnRHVtcChpbnQgZmQpIHsKLSAgdWludDY0X3Qgbm93X3VzID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKLSAgc3RyZWFtIDw8ICIgIEhlYXJpbmcgQWlkIEF1ZGlvIEhBTDoiCi0gICAgICAgICA8PCAiXG4gICAgQ291bnRzICh1bmRlcmZsb3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIKLSAgICAgICAgIDw8IHN0YXRzLm1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2NvdW50Ci0gICAgICAgICA8PCAiXG4gICAgQnl0ZXMgKHVuZGVyZmxvdykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIKLSAgICAgICAgIDw8IHN0YXRzLm1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2J5dGVzCi0gICAgICAgICA8PCAiXG4gICAgTGFzdCB1cGRhdGUgdGltZSBhZ28gaW4gbXMgKHVuZGVyZmxvdykgICAgICAgICAgICAgICAgICA6ICIKLSAgICAgICAgIDw8IChzdGF0cy5tZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzID4gMAotICAgICAgICAgICAgICAgICA/ICh1bnNpZ25lZCBsb25nIGxvbmcpKG5vd191cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubWVkaWFfcmVhZF9sYXN0X3VuZGVyZmxvd191cykgLwotICAgICAgICAgICAgICAgICAgICAgICAxMDAwCi0gICAgICAgICAgICAgICAgIDogMCkKLSAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgZHByaW50ZihmZCwgIiVzIiwgc3RyZWFtLnN0cigpLmNfc3RyKCkpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FjdC5jYyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWY3MDMuLjAwMDAwMDAKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFjdGlvbiBmdW5jdGlvbnMgZm9yIHRoZSBoYW5kc2ZyZWUgY2xpZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90cmFjZS5oIiAgLy8gTGVnYWN5IHRyYWNlIGxvZ2dpbmcKLQotI2luY2x1ZGUgImJ0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogbWF4aW11bSBsZW5ndGggb2YgZGF0YSB0byByZWFkIGZyb20gUkZDT01NICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfUkZDX1JFQURfTUFYIDUxMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zdGFydF9jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgdGhlIHByb2Nlc3Mgb2YgY2xvc2luZyBTQ08gYW5kIFJGQ09NTSBjb25uZWN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X3N0YXJ0X2Nsb3NlKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0KLSAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9oYW5kbGUocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICBpZiAoY2xpZW50X2NiID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogd3JvbmcgaGFuZGxlIHRvIGNvbnRyb2wgYmxvY2sgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUYWtlIHRoZSBsaW5rIG91dCBvZiBzbmlmZiBhbmQgc2V0IEwyQyBpZGxlIHRpbWUgdG8gMCAqLwotICBidGFfZG1fcG1fYWN0aXZlKGNsaWVudF9jYi0+cGVlcl9hZGRyKTsKLSAgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyKGNsaWVudF9jYi0+cGVlcl9hZGRyLCAwLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICAvKiBpZiBTQ08gaXMgb3BlbiBjbG9zZSBTQ08gYW5kIHdhaXQgb24gUkZDT01NIGNsb3NlICovCi0gIGlmIChjbGllbnRfY2ItPnNjb19zdGF0ZSA9PSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX1NUKSB7Ci0gICAgY2xpZW50X2NiLT5zY29fY2xvc2VfcmZjID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBidGFfaGZfY2xpZW50X3JmY19kb19jbG9zZShwX2RhdGEpOwotICB9Ci0KLSAgLyogYWx3YXlzIGRvIFNDTyBzaHV0ZG93biB0byBoYW5kbGUgYWxsIFNDTyBjb3JuZXIgY2FzZXMgKi8KLSAgYnRhX2hmX2NsaWVudF9zY29fc2h1dGRvd24oY2xpZW50X2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc3RhcnRfb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBzdGFydHMgYW4gSEYgQ2xpZW50IG9wZW4uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfc3RhcnRfb3Blbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGhhbmRsZSB0byBjb250cm9sIGJsb2NrICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogc3RvcmUgcGFyYW1ldGVycyAqLwotICBpZiAocF9kYXRhKSB7Ci0gICAgY2xpZW50X2NiLT5wZWVyX2FkZHIgPSBwX2RhdGEtPmFwaV9vcGVuLmJkX2FkZHI7Ci0gIH0KLQotICAvKiBDaGVjayBpZiBSRkNPTU0gaGFzIGFueSBpbmNvbWluZyBjb25uZWN0aW9uIHRvIGF2b2lkIGNvbGxpc2lvbi4gKi8KLSAgUmF3QWRkcmVzcyBwZW5kaW5nX2JkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIGlmIChQT1JUX0lzT3BlbmluZygmcGVuZGluZ19iZF9hZGRyKSkgewotICAgIC8qIExldCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBnb2VzIHRocm91Z2guICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJc3N1ZSBjb2xsaXNpb24gZm9yIG5vdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2Ugd2lsbCBkZWNpZGUgd2hhdCB0byBkbyB3aGVuIHdlIGZpbmQgaW5jb21pbmcgY29ubmVjdGlvbiBsYXRlci4qLwotICAgIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX2NiYWNrKEJUQV9TWVNfQ09OTl9PUEVOLCBCVEFfSURfSFMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2NiLT5wZWVyX2FkZHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHNldCByb2xlICovCi0gIGNsaWVudF9jYi0+cm9sZSA9IEJUQV9IRl9DTElFTlRfSU5UOwotCi0gIC8qIGRvIHNlcnZpY2Ugc2VhcmNoICovCi0gIGJ0YV9oZl9jbGllbnRfZG9fZGlzYyhjbGllbnRfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9yZmNfb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIFJGQ09NTSBjaGFubmVsIG9wZW4uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfcmZjX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0KLSAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9oYW5kbGUocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICBpZiAoY2xpZW50X2NiID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogY2Igbm90IGZvdW5kIGZvciBoYW5kbGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfc3lzX2Nvbm5fb3BlbihCVEFfSURfSFMsIDEsIGNsaWVudF9jYi0+cGVlcl9hZGRyKTsKLQotICAvKiBzdGFydCBTTEMgcHJvY2VkdXJlICovCi0gIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShjbGllbnRfY2IsIGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfcmZjX2FjcF9vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgUkZDT01NIGNoYW5uZWwgb3BlbiB3aGVuIGFjY2VwdGluZyBjb25uZWN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X3JmY19hY3Bfb3Blbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBzZXQgcm9sZSAqLwotICBjbGllbnRfY2ItPnJvbGUgPSBCVEFfSEZfQ0xJRU5UX0FDUDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubl9oYW5kbGUgJWQiLCBfX2Z1bmNfXywgY2xpZW50X2NiLT5jb25uX2hhbmRsZSk7Ci0KLSAgLyogZ2V0IGJkIGFkZHIgb2YgcGVlciAqLwotICB1aW50MTZfdCBsY2lkID0gMDsKLSAgUmF3QWRkcmVzcyBkZXZfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgaW50IHN0YXR1cyA9IFBPUlRfQ2hlY2tDb25uZWN0aW9uKGNsaWVudF9jYi0+Y29ubl9oYW5kbGUsICZkZXZfYWRkciwgJmxjaWQpOwotICBpZiAoc3RhdHVzICE9IFBPUlRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogUE9SVF9DaGVja0Nvbm5lY3Rpb24gcmV0dXJuZWQgIiA8PCBzdGF0dXM7Ci0gIH0KLQotICAvKiBDb2xsaXNpb24gSGFuZGxpbmcgKi8KLSAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChjbGllbnRfY2ItPmNvbGxpc2lvbl90aW1lcikpIHsKLSAgICBhbGFybV9jYW5jZWwoY2xpZW50X2NiLT5jb2xsaXNpb25fdGltZXIpOwotCi0gICAgaWYgKGRldl9hZGRyID09IGNsaWVudF9jYi0+cGVlcl9hZGRyKSB7Ci0gICAgICAvKiBJZiBpbmNvbWluZyBhbmQgb3V0Z29pbmcgZGV2aWNlIGFyZSBzYW1lLCBub3RoaW5nIG1vcmUgdG8gZG8uICovCi0gICAgICAvKiBPdXRnb2luZyBjb25uIHdpbGwgYmUgYWJvcnRlZCBiZWNhdXNlIHdlIGhhdmUgc3VjY2Vzc2Z1bCBpbmNvbWluZyBjb25uLgotICAgICAgICovCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFJlc3VtZSBvdXRnb2luZyBjb25uZWN0aW9uLiAqLwotICAgICAgYnRhX2hmX2NsaWVudF9yZXN1bWVfb3BlbihjbGllbnRfY2IpOwotICAgIH0KLSAgfQotCi0gIGNsaWVudF9jYi0+cGVlcl9hZGRyID0gZGV2X2FkZHI7Ci0KLSAgLyogZG8gc2VydmljZSBkaXNjb3ZlcnkgdG8gZ2V0IGZlYXR1cmVzICovCi0gIGJ0YV9oZl9jbGllbnRfZG9fZGlzYyhjbGllbnRfY2IpOwotCi0gIC8qIGNvbnRpbnVlIHdpdGggb3BlbiBwcm9jZXNzaW5nICovCi0gIGJ0YV9oZl9jbGllbnRfcmZjX29wZW4ocF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfcmZjX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJGQ09NTSBjb25uZWN0aW9uIGZhaWxlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9yZmNfZmFpbCh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogcmVpbml0aWFsaXplIHN0dWZmICovCi0gIGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyA9IDA7Ci0gIGNsaWVudF9jYi0+Y2hsZF9mZWF0dXJlcyA9IDA7Ci0gIGNsaWVudF9jYi0+cm9sZSA9IEJUQV9IRl9DTElFTlRfQUNQOwotICBjbGllbnRfY2ItPnN2Y19jb25uID0gZmFsc2U7Ci0gIGNsaWVudF9jYi0+c2VuZF9hdF9yZXBseSA9IGZhbHNlOwotICBjbGllbnRfY2ItPm5lZ290aWF0ZWRfY29kZWMgPSBCVE1fU0NPX0NPREVDX0NWU0Q7Ci0KLSAgYnRhX2hmX2NsaWVudF9hdF9yZXNldChjbGllbnRfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9kaXNjX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2NvdmVyeSBmYWlsdXJlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2Rpc2NfZmFpbCh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X29wZW5fZmFpbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgb3BlbiBjb25uZWN0aW9uIGZhaWxlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9vcGVuX2ZhaWwodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9yZmNfY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJGQ09NTSBjb25uZWN0aW9uIGNsb3NlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9yZmNfY2xvc2UodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9oZl9jbGllbnRfYXRfcmVzZXQoY2xpZW50X2NiKTsKLQotICBidGFfc3lzX2Nvbm5fY2xvc2UoQlRBX0lEX0hTLCAxLCBjbGllbnRfY2ItPnBlZXJfYWRkcik7Ci0KLSAgLyogY2FsbCBjbG9zZSBjYmFjayAqLwotICB0QlRBX0hGX0NMSUVOVCBldnQ7Ci0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0gIGV2dC5jb25uLmJkX2FkZHIgPSBjbGllbnRfY2ItPnBlZXJfYWRkcjsKLQotICAvKiBpZiBub3QgZGVyZWdpc3RlcmluZyByZW9wZW4gc2VydmVyICovCi0gIGlmICghYnRhX2hmX2NsaWVudF9jYl9hcnIuZGVyZWdpc3RlcikgewotICAgIC8qIE1ha2Ugc3VyZSBTQ08gaXMgc2h1dGRvd24gKi8KLSAgICBidGFfaGZfY2xpZW50X3Njb19zaHV0ZG93bihjbGllbnRfY2IpOwotCi0gICAgYnRhX3N5c19zY29fdW51c2UoQlRBX0lEX0hTLCAxLCBjbGllbnRfY2ItPnBlZXJfYWRkcik7Ci0gIH0KLSAgLyogZWxzZSBjbG9zZSBwb3J0IGFuZCBkZWFsbG9jYXRlIHNjYiAqLwotICBlbHNlIHsKLSAgICB0QlRBX0hGX0NMSUVOVCBldnQ7Ci0gICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKLSAgICBldnQucmVnLmJkX2FkZHIgPSBjbGllbnRfY2ItPnBlZXJfYWRkcjsKLSAgICBidGFfaGZfY2xpZW50X2FwcF9jYWxsYmFjayhCVEFfSEZfQ0xJRU5UX0RJU0FCTEVfRVZULCAmZXZ0KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9kaXNjX2ludF9yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2NvdmVyeSByZXN1bHQgd2hlbiBpbml0aWF0b3IuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfZGlzY19pbnRfcmVzKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50MTZfdCBldmVudCA9IEJUQV9IRl9DTElFTlRfRElTQ19GQUlMX0VWVDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU3RhdHVzOiAlZCIsIF9fZnVuY19fLCBwX2RhdGEtPmRpc2NfcmVzdWx0LnN0YXR1cyk7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIGlmIGZvdW5kIHNlcnZpY2UgKi8KLSAgaWYgKHBfZGF0YS0+ZGlzY19yZXN1bHQuc3RhdHVzID09IFNEUF9TVUNDRVNTIHx8Ci0gICAgICBwX2RhdGEtPmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfREJfRlVMTCkgewotICAgIC8qIGdldCBhdHRyaWJ1dGVzICovCi0gICAgaWYgKGJ0YV9oZl9jbGllbnRfc2RwX2ZpbmRfYXR0cihjbGllbnRfY2IpKSB7Ci0gICAgICBldmVudCA9IEJUQV9IRl9DTElFTlRfRElTQ19PS19FVlQ7Ci0gICAgfQotICB9Ci0KLSAgLyogZnJlZSBkaXNjb3ZlcnkgZGIgKi8KLSAgYnRhX2hmX2NsaWVudF9mcmVlX2RiKHBfZGF0YSk7Ci0KLSAgLyogc2VuZCBvdXJzZWx2ZXMgc2RwIG9rL2ZhaWwgZXZlbnQgKi8KLSAgYnRhX2hmX2NsaWVudF9zbV9leGVjdXRlKGV2ZW50LCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9kaXNjX2FjcF9yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2NvdmVyeSByZXN1bHQgd2hlbiBhY2NlcHRvci4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9kaXNjX2FjcF9yZXModEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIGlmIGZvdW5kIHNlcnZpY2UgKi8KLSAgaWYgKHBfZGF0YS0+ZGlzY19yZXN1bHQuc3RhdHVzID09IFNEUF9TVUNDRVNTIHx8Ci0gICAgICBwX2RhdGEtPmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfREJfRlVMTCkgewotICAgIC8qIGdldCBhdHRyaWJ1dGVzICovCi0gICAgYnRhX2hmX2NsaWVudF9zZHBfZmluZF9hdHRyKGNsaWVudF9jYik7Ci0gIH0KLQotICAvKiBmcmVlIGRpc2NvdmVyeSBkYiAqLwotICBidGFfaGZfY2xpZW50X2ZyZWVfZGIocF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfcmZjX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYWQgYW5kIHByb2Nlc3MgZGF0YSBmcm9tIFJGQ09NTS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9yZmNfZGF0YSh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgbGVuOwotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX1JGQ19SRUFEX01BWF07Ci0gIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLSAgLyogcmVhZCBkYXRhIGZyb20gcmZjb21tOyBpZiBiYWQgc3RhdHVzLCB3ZSdyZSBkb25lICovCi0gIHdoaWxlIChQT1JUX1JlYWREYXRhKGNsaWVudF9jYi0+Y29ubl9oYW5kbGUsIGJ1ZiwgQlRBX0hGX0NMSUVOVF9SRkNfUkVBRF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICZsZW4pID09IFBPUlRfU1VDQ0VTUykgewotICAgIC8qIGlmIG5vIGRhdGEsIHdlJ3JlIGRvbmUgKi8KLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGJ0YV9oZl9jbGllbnRfYXRfcGFyc2UoY2xpZW50X2NiLCBidWYsIGxlbik7Ci0KLSAgICAvKiBubyBtb3JlIGRhdGEgdG8gcmVhZCwgd2UncmUgZG9uZSAqLwotICAgIGlmIChsZW4gPCBCVEFfSEZfQ0xJRU5UX1JGQ19SRUFEX01BWCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3N2Y19jb25uX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiBvcGVuZWQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9zdmNfY29ubl9vcGVuKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgaWYgKCFjbGllbnRfY2ItPnN2Y19jb25uKSB7Ci0gICAgLyogc2V0IHN0YXRlIHZhcmlhYmxlICovCi0gICAgY2xpZW50X2NiLT5zdmNfY29ubiA9IHRydWU7Ci0KLSAgICAvKiBjYWxsIGNhbGxiYWNrICovCi0gICAgZXZ0LmNvbm4uYmRfYWRkciA9IGNsaWVudF9jYi0+cGVlcl9hZGRyOwotICAgIGV2dC5jb25uLnBlZXJfZmVhdCA9IGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlczsKLSAgICBldnQuY29ubi5jaGxkX2ZlYXQgPSBjbGllbnRfY2ItPmNobGRfZmVhdHVyZXM7Ci0KLSAgICBidGFfaGZfY2xpZW50X2FwcF9jYWxsYmFjayhCVEFfSEZfQ0xJRU5UX0NPTk5fRVZULCAmZXZ0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FwaS5jYyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDU3ZmUuLjAwMDAwMDAKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSSBmb3IgdGhlIGhhbmRzZnJlZSAoSEYgcm9sZSkKLSAqICBzdWJzeXN0ZW0gb2YgQlRBCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgiCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIgIC8vIExlZ2FjeSB0cmFjZSBsb2dnaW5nCi0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIgotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGllbnRFbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZSB0aGUgSEYgQ0xpZW50IHNlcnZpY2UuIEl0IGRvZXMgdGhlIGZvbGxvd2luZzoKLSAqICAgICAgICAgICAgICAgICAgMS4gU2V0cyB0aGUgc3RhdGUgdG8gaW5pdGlhbGl6ZWQgKGNvbnRyb2wgYmxvY2tzKQotICogICAgICAgICAgICAgICAgICAyLiBTdGFydHMgdGhlIFNEUCBmb3IgdGhlIGNsaWVudCByb2xlIChIRikKLSAqICAgICAgICAgICAgICAgICAgMy4gU3RhcnRzIHRoZSBSRkNPTU0gc2VydmVyIHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucwotICogICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gaXMgc3luY2hyb25vdXMgYW5kIHJldHVybnMgd2l0aCBhbiBlcnJvciBjb2RlCi0gKiAgICAgICAgICAgICAgICAgIGlmIGFueXRoaW5nIHdlbnQgd3JvbmcuIFRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCBjYWxsIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBBUEkgYmVmb3JlIGRvaW5nIGFuIEJUQV9IZkNsaWVudE9wZW4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TVUNDRVNTIGlmIE9LLCBCVEFfRkFJTFVSRSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfU1RBVFVTIEJUQV9IZkNsaWVudEVuYWJsZSh0QlRBX0hGX0NMSUVOVF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lKSB7Ci0gIHJldHVybiBidGFfaGZfY2xpZW50X2FwaV9lbmFibGUocF9jYmFjaywgZmVhdHVyZXMsIHBfc2VydmljZV9uYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZkNsaWVudERpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGUgdGhlIEhGIENsaWVudCBzZXJ2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50RGlzYWJsZSh2b2lkKSB7IGJ0YV9oZl9jbGllbnRfYXBpX2Rpc2FibGUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hmQ2xpZW50T3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbnMgdXAgYSBSRiBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGV2aWNlIGFuZAotICogICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50bHkgc2V0IGl0IHVwIGZvciBhIEhGIFNMQwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudE9wZW4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QqIHBfaGFuZGxlKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICB0QlRBX0hGX0NMSUVOVF9BUElfT1BFTiogcF9idWYgPQotICAgICAgKHRCVEFfSEZfQ0xJRU5UX0FQSV9PUEVOKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hGX0NMSUVOVF9BUElfT1BFTikpOwotCi0gIGlmICghYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUoYmRfYWRkciwgcF9oYW5kbGUpKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBoYW5kbGUiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9IRl9DTElFTlRfQVBJX09QRU5fRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gKnBfaGFuZGxlOwotICBwX2J1Zi0+YmRfYWRkciA9IGJkX2FkZHI7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZkNsaWVudENsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIHRvIGFuIGF1ZGlvIGdhdGV3YXkuCi0gKiAgICAgICAgICAgICAgICAgIEFueSBjdXJyZW50IGF1ZGlvIGNvbm5lY3Rpb24gd2lsbCBhbHNvIGJlIGNsb3NlZAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnRDbG9zZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotCi0gIHBfYnVmLT5ldmVudCA9IEJUQV9IRl9DTElFTlRfQVBJX0NMT1NFX0VWVDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGxpZW50QXVkaW9PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVucyBhbiBhdWRpbyBjb25uZWN0aW9uIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkCi0gKiAgICAgICAgICAgICAgICAgYXVkaW8gZ2F0ZXdheQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnRBdWRpb09wZW4odWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfSEZfQ0xJRU5UX0FQSV9BVURJT19PUEVOX0VWVDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGllbnRBdWRpb0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBhdWRpbyBjb25uZWN0aW9uIHRvIGFuIGF1ZGlvCi0gKiAgICAgICAgICAgICAgICAgIGdhdGV3YXkuIFRoZSBkYXRhIGNvbm5lY3Rpb24gcmVtYWlucyBvcGVuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudEF1ZGlvQ2xvc2UodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfSEZfQ0xJRU5UX0FQSV9BVURJT19DTE9TRV9FVlQ7Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hmQ2xpZW50U2VuZEFUCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIEFUIGNvbW1hbmQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50U2VuZEFUKHVpbnQxNl90IGhhbmRsZSwgdEJUQV9IRl9DTElFTlRfQVRfQ01EX1RZUEUgYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwxLCB1aW50MzJfdCB2YWwyLCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgdEJUQV9IRl9DTElFTlRfREFUQV9WQUwqIHBfYnVmID0KLSAgICAgICh0QlRBX0hGX0NMSUVOVF9EQVRBX1ZBTCopb3NpX21hbGxvYyhzaXplb2YodEJUQV9IRl9DTElFTlRfREFUQV9WQUwpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9TRU5EX0FUX0NNRF9FVlQ7Ci0gIHBfYnVmLT51aW50OF92YWwgPSBhdDsKLSAgcF9idWYtPnVpbnQzMl92YWwxID0gdmFsMTsKLSAgcF9idWYtPnVpbnQzMl92YWwyID0gdmFsMjsKLQotICBpZiAoc3RyKSB7Ci0gICAgc3RybGNweShwX2J1Zi0+c3RyLCBzdHIsIEJUQV9IRl9DTElFTlRfTlVNQkVSX0xFTiArIDEpOwotICAgIHBfYnVmLT5zdHJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOXSA9ICdcMCc7Ci0gIH0gZWxzZSB7Ci0gICAgcF9idWYtPnN0clswXSA9ICdcMCc7Ci0gIH0KLQotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGllbnREdW1wU3RhdGlzdGljcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRHVtcCBzdGF0aXN0aWNzIGFib3V0IHRoZSB2YXJpb3VzIGNvbnRyb2wgYmxvY2tzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBvdGhlciByZWxldmFudCBjb25uZWN0aW9uIHN0YXRpc3RpY3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnREdW1wU3RhdGlzdGljcyhpbnQgZmQpIHsgYnRhX2hmX2NsaWVudF9kdW1wX3N0YXRpc3RpY3MoZmQpOyB9CmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuY2MgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZmNmODIuLjAwMDAwMDAKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfaGZfY2xpZW50IgotCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIgIC8vIExlZ2FjeSB0cmFjZSBsb2dnaW5nCi0KLSNpbmNsdWRlICJidGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotCi0vKiBVbmNvbW1lbnQgdG8gZW5hYmxlIEFUIHRyYWZmaWMgZHVtcGluZyAqLwotLyogI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0RVTVAgMSAqLwotCi0vKiBtaW5pbXVtIGxlbmd0aCBvZiBBVCBldmVudCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0VWRU5UX01JTl9MRU4gMwotCi0vKiB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciBBVCByZXNwb25zZSAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1RJTUVPVVQgMjk5ODkKLQotLyogdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgQVQgaG9sZCB0aW1lciAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0hPTERfVElNRU9VVCA0MQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICBTVVBQT1JURUQgRVZFTlQgTUVTU0FHRVMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENJTkQ6IHN1cHBvcnRlZCBpbmRpY2F0b3IgbmFtZXMgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9JTkRJQ0FUT1JfQkFUVEVSWUNIRyAiYmF0dGNoZyIKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9JTkRJQ0FUT1JfU0lHTkFMICJzaWduYWwiCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX1NFUlZJQ0UgInNlcnZpY2UiCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX0NBTEwgImNhbGwiCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX1JPQU0gInJvYW0iCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX0NBTExTRVRVUCAiY2FsbHNldHVwIgotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9DQUxMSEVMRCAiY2FsbGhlbGQiCi0KLS8qIEJJTkQgcGFyc2UgbW9kZSAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0JJTkRfUEFSU0VfUkVBRF9FTkFCTEVEX0lORCAwCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQklORF9QQVJTRV9SRUFEX1NVUFBPRVRFRF9JTkQgMQotCi0jZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgXAotICAoeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfX3R5cGVvZl9fKGEpIF9hID0gKGEpOyBcCi0gICAgX190eXBlb2ZfXyhiKSBfYiA9IChiKTsgXAotICAgIChfYSA8IF9iKSA/IF9hIDogX2I7ICAgIFwKLSAgfSkKLQotLyogQ0lORDogcmVwcmVzZW50cyBlYWNoIGluZGljYXRvcnMgYm91bmRhcmllcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiBuYW1lOwotICB1aW50OF90IG1pbjsKLSAgdWludDhfdCBtYXg7Ci0gIHVpbnQ4X3QgbmFtZWxlbjsKLX0gdEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SOwotCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfU1VQUE9SVEVEX0lORElDQVRPUl9DT1VOVCA3Ci0KLS8qIENJTkQ6IHN0b3JhZ2Ugcm9vbSBmb3IgaW5kaWNhdG9ycyB2YWx1ZSByYW5nZSBhbmQgdGhlaXIgc3RhdHVzZXMgKi8KLXN0YXRpYyBjb25zdCB0QlRBX0hGX0NMSUVOVF9JTkRJQ0FUT1IKLSAgICBidGFfaGZfY2xpZW50X2luZGljYXRvcnNbQlRBX0hGX0NMSUVOVF9BVF9TVVBQT1JURURfSU5ESUNBVE9SX0NPVU5UXSA9IHsKLSAgICAgICAgLyogbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaW4gfCBtYXggfCBuYW1lIGxlbmd0aCAtCi0gICAgICAgICAgIHVzZWQgYnkgcGFyc2VyICovCi0gICAgICAgIHtCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9CQVRURVJZQ0hHLCAwLCA1LAotICAgICAgICAgc2l6ZW9mKEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX0JBVFRFUllDSEcpfSwKLSAgICAgICAge0JUQV9IRl9DTElFTlRfSU5ESUNBVE9SX1NJR05BTCwgMCwgNSwKLSAgICAgICAgIHNpemVvZihCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9TSUdOQUwpfSwKLSAgICAgICAge0JUQV9IRl9DTElFTlRfSU5ESUNBVE9SX1NFUlZJQ0UsIDAsIDEsCi0gICAgICAgICBzaXplb2YoQlRBX0hGX0NMSUVOVF9JTkRJQ0FUT1JfU0VSVklDRSl9LAotICAgICAgICB7QlRBX0hGX0NMSUVOVF9JTkRJQ0FUT1JfQ0FMTCwgMCwgMSwKLSAgICAgICAgIHNpemVvZihCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9DQUxMKX0sCi0gICAgICAgIHtCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9ST0FNLCAwLCAxLAotICAgICAgICAgc2l6ZW9mKEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX1JPQU0pfSwKLSAgICAgICAge0JUQV9IRl9DTElFTlRfSU5ESUNBVE9SX0NBTExTRVRVUCwgMCwgMywKLSAgICAgICAgIHNpemVvZihCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9DQUxMU0VUVVApfSwKLSAgICAgICAge0JUQV9IRl9DTElFTlRfSU5ESUNBVE9SX0NBTExIRUxELCAwLCAyLAotICAgICAgICAgc2l6ZW9mKEJUQV9IRl9DTElFTlRfSU5ESUNBVE9SX0NBTExIRUxEKX19OwotCi0vKiArVkdNLytWR1MgLSBnYWluIG1pbi9tYXggdmFsdWVzICAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1ZHU19NSU4gMAotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1ZHU19NQVggMTUKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9WR01fTUlOIDAKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9WR01fTUFYIDE1Ci0KLXVpbnQzMl90IHNlcnZpY2VfaW5kZXggPSAwOwotYm9vbCBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IHRydWU7Ci0vKiBoZWxwZXIgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBBVCBjb21tYW5kcyBxdWV1ZWluZyAqLwotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9vayh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9jbGVhcl9xdWV1ZWRfYXQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICB0QlRBX0hGX0NMSUVOVF9BVF9RQ01EKiBjdXIgPSBjbGllbnRfY2ItPmF0X2NiLnF1ZXVlZF9jbWQ7Ci0gIHRCVEFfSEZfQ0xJRU5UX0FUX1FDTUQqIG5leHQ7Ci0KLSAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0gICAgbmV4dCA9IGN1ci0+bmV4dDsKLSAgICBvc2lfZnJlZShjdXIpOwotICAgIGN1ciA9IG5leHQ7Ci0gIH0KLQotICBjbGllbnRfY2ItPmF0X2NiLnF1ZXVlZF9jbWQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3F1ZXVlX2F0KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjbWQsIGNvbnN0IGNoYXIqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnVmX2xlbikgewotICB0QlRBX0hGX0NMSUVOVF9BVF9RQ01EKiBuZXdfY21kID0KLSAgICAgICh0QlRBX0hGX0NMSUVOVF9BVF9RQ01EKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hGX0NMSUVOVF9BVF9RQ01EKSk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgbmV3X2NtZC0+Y21kID0gY21kOwotICBuZXdfY21kLT5idWZfbGVuID0gYnVmX2xlbjsKLSAgbmV3X2NtZC0+bmV4dCA9IE5VTEw7Ci0gIG1lbWNweShuZXdfY21kLT5idWYsIGJ1ZiwgYnVmX2xlbik7Ci0KLSAgaWYgKGNsaWVudF9jYi0+YXRfY2IucXVldWVkX2NtZCAhPSBOVUxMKSB7Ci0gICAgdEJUQV9IRl9DTElFTlRfQVRfUUNNRCogcWNtZCA9IGNsaWVudF9jYi0+YXRfY2IucXVldWVkX2NtZDsKLQotICAgIHdoaWxlIChxY21kLT5uZXh0ICE9IE5VTEwpIHFjbWQgPSBxY21kLT5uZXh0OwotCi0gICAgcWNtZC0+bmV4dCA9IG5ld19jbWQ7Ci0gIH0gZWxzZSB7Ci0gICAgY2xpZW50X2NiLT5hdF9jYi5xdWV1ZWRfY21kID0gbmV3X2NtZDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2F0X3Jlc3BfdGltZXJfY2JhY2sodm9pZCogZGF0YSkgewotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0gKHRCVEFfSEZfQ0xJRU5UX0NCKilkYXRhOwotICBpZiAoY2xpZW50X2NiLT5hdF9jYi5jdXJyZW50X2NtZCA9PSBCVEFfSEZfQ0xJRU5UX0FUX0NOVU0pIHsKLSAgICBMT0dfSU5GTygiJXM6IHRpbWVkIG91dCB3YWl0aW5nIGZvciBBVCtDTlVNIHJlc3BvbnNlOyBzcG9vZmluZyBPSy4iLAotICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9vayhjbGllbnRfY2IpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIkhGUENsaWVudDogQVQgcmVzcG9uc2UgdGltZW91dCwgZGlzY29ubmVjdGluZyIpOwotCi0gICAgdEJUQV9IRl9DTElFTlRfREFUQSBtc2cgPSB7fTsKLSAgICBtc2cuaGRyLmxheWVyX3NwZWNpZmljID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gICAgYnRhX2hmX2NsaWVudF9zbV9leGVjdXRlKEJUQV9IRl9DTElFTlRfQVBJX0NMT1NFX0VWVCwgJm1zZyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zdGFydF9hdF9yZXNwX3RpbWVyKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgYWxhcm1fc2V0X29uX21sb29wKGNsaWVudF9jYi0+YXRfY2IucmVzcF90aW1lciwgQlRBX0hGX0NMSUVOVF9BVF9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9hdF9yZXNwX3RpbWVyX2NiYWNrLCAodm9pZCopY2xpZW50X2NiKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zdG9wX2F0X3Jlc3BfdGltZXIodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBhbGFybV9jYW5jZWwoY2xpZW50X2NiLT5hdF9jYi5yZXNwX3RpbWVyKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfQVRfQ01EIGNtZCwgY29uc3QgY2hhciogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJ1Zl9sZW4pIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmICgoY2xpZW50X2NiLT5hdF9jYi5jdXJyZW50X2NtZCA9PSBCVEFfSEZfQ0xJRU5UX0FUX05PTkUgfHwKLSAgICAgICAhY2xpZW50X2NiLT5zdmNfY29ubikgJiYKLSAgICAgICFhbGFybV9pc19zY2hlZHVsZWQoY2xpZW50X2NiLT5hdF9jYi5ob2xkX3RpbWVyKSkgewotICAgIHVpbnQxNl90IGxlbjsKLQotI2lmZGVmIEJUQV9IRl9DTElFTlRfQVRfRFVNUAotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlLipzIiwgX19mdW5jX18sIGJ1Zl9sZW4gLSAxLCBidWYpOwotI2VuZGlmCi0KLSAgICBjbGllbnRfY2ItPmF0X2NiLmN1cnJlbnRfY21kID0gY21kOwotICAgIC8qIEdlbmVyYXRlIGZha2UgcmVzcG9uc2VzIGZvciB0aGVzZSBiZWNhdXNlIHRoZXkgd29uJ3QgcmVsaWFibHkgd29yayAqLwotICAgIGlmICghc2VydmljZV9hdmFpbGFiaWxpdHkgJiYKLSAgICAgICAgKGNtZCA9PSBCVEFfSEZfQ0xJRU5UX0FUX0NOVU0gfHwgY21kID09IEJUQV9IRl9DTElFTlRfQVRfQ09QUykpIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IE5vIHNlcnZpY2UsIHNraXBwaW5nICVkIGNvbW1hbmQiLCBfX2Z1bmNfXywgY21kKTsKLSAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX29rKGNsaWVudF9jYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHdyaXRpbmcgcG9ydCBkYXRhIHRvICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjbGllbnRfY2ItPmNvbm5faGFuZGxlKTsKLSAgICBQT1JUX1dyaXRlRGF0YShjbGllbnRfY2ItPmNvbm5faGFuZGxlLCBidWYsIGJ1Zl9sZW4sICZsZW4pOwotCi0gICAgYnRhX2hmX2NsaWVudF9zdGFydF9hdF9yZXNwX3RpbWVyKGNsaWVudF9jYik7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfaGZfY2xpZW50X3F1ZXVlX2F0KGNsaWVudF9jYiwgY21kLCBidWYsIGJ1Zl9sZW4pOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfcXVldWVkX2F0KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgdEJUQV9IRl9DTElFTlRfQVRfUUNNRCogY3VyID0gY2xpZW50X2NiLT5hdF9jYi5xdWV1ZWRfY21kOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChjdXIgIT0gTlVMTCkgewotICAgIGNsaWVudF9jYi0+YXRfY2IucXVldWVkX2NtZCA9IGN1ci0+bmV4dDsKLQotICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIGN1ci0+Y21kLCBjdXItPmJ1ZiwgY3VyLT5idWZfbGVuKTsKLQotICAgIG9zaV9mcmVlKGN1cik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9hdF9ob2xkX3RpbWVyX2NiYWNrKHZvaWQqIGRhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9ICh0QlRBX0hGX0NMSUVOVF9DQiopZGF0YTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0YV9oZl9jbGllbnRfc2VuZF9xdWV1ZWRfYXQoY2xpZW50X2NiKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zdG9wX2F0X2hvbGRfdGltZXIodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgYWxhcm1fY2FuY2VsKGNsaWVudF9jYi0+YXRfY2IuaG9sZF90aW1lcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc3RhcnRfYXRfaG9sZF90aW1lcih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBhbGFybV9zZXRfb25fbWxvb3AoY2xpZW50X2NiLT5hdF9jYi5ob2xkX3RpbWVyLCBCVEFfSEZfQ0xJRU5UX0FUX0hPTERfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfYXRfaG9sZF90aW1lcl9jYmFjaywgKHZvaWQqKWNsaWVudF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgICAgICBDT01NT04gQVQgRVZFTlQgSEFORExJTkcgZnVuY1MKLSAqCi0gKiAgIFJlY2VpdmVzIGRhdGEgKHN0cmluZ3MsIGludHMsIGV0Yy4pIGZyb20gdGhlIHBhcnNlciBhbmQgcHJvY2Vzc2VzIHRoaXMKLSAqICAgZGF0YS4gTm8gYnVmZmVyIHBhcnNpbmcgaXMgYmVpbmcgZG9uZSBoZXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfb2sodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGFfaGZfY2xpZW50X3N0b3BfYXRfcmVzcF90aW1lcihjbGllbnRfY2IpOwotCi0gIGlmICghY2xpZW50X2NiLT5zdmNfY29ubikgewotICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShjbGllbnRfY2IsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzd2l0Y2ggKGNsaWVudF9jYi0+YXRfY2IuY3VycmVudF9jbWQpIHsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQklBOgotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9CQ0M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQkNTOgotICAgICAgYnRhX2hmX2NsaWVudF9zdGFydF9hdF9ob2xkX3RpbWVyKGNsaWVudF9jYik7Ci0gICAgICBjbGllbnRfY2ItPmF0X2NiLmN1cnJlbnRfY21kID0gQlRBX0hGX0NMSUVOVF9BVF9OT05FOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTElQOiAgLy8gbGFzdCBjbWQgaXMgcG9zdCBzbGMgc2VxCi0gICAgICBpZiAoIWNsaWVudF9jYi0+c2VuZF9hdF9yZXBseSkgewotICAgICAgICBjbGllbnRfY2ItPnNlbmRfYXRfcmVwbHkgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX05PTkU6Ci0gICAgICBidGFfaGZfY2xpZW50X3N0b3BfYXRfaG9sZF90aW1lcihjbGllbnRfY2IpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChjbGllbnRfY2ItPnNlbmRfYXRfcmVwbHkpIHsKLSAgICAgICAgYnRhX2hmX2NsaWVudF9hdF9yZXN1bHQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9PSywgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGNsaWVudF9jYi0+YXRfY2IuY3VycmVudF9jbWQgPSBCVEFfSEZfQ0xJRU5UX0FUX05PTkU7Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX3F1ZXVlZF9hdChjbGllbnRfY2IpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9lcnJvcih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX1RZUEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNtZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJXUgJXUiLCBfX2Z1bmNfXywgdHlwZSwgY21lKTsKLQotICBidGFfaGZfY2xpZW50X3N0b3BfYXRfcmVzcF90aW1lcihjbGllbnRfY2IpOwotCi0gIGlmICghY2xpZW50X2NiLT5zdmNfY29ubikgewotICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcShjbGllbnRfY2IsIHRydWUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAoY2xpZW50X2NiLT5hdF9jYi5jdXJyZW50X2NtZCkgewotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9CSUE6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQkNDOgotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9CQ1M6Ci0gICAgICBidGFfaGZfY2xpZW50X2NiYWNrX3NjbyhjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVVESU9fQ0xPU0VfRVZUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTElQOiAgLy8gbGFzdCBjbWQgaXMgcG9zdCBzbGMgc2VxCi0gICAgICBpZiAoIWNsaWVudF9jYi0+c2VuZF9hdF9yZXBseSkgewotICAgICAgICBjbGllbnRfY2ItPnNlbmRfYXRfcmVwbHkgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChjbGllbnRfY2ItPnNlbmRfYXRfcmVwbHkpIHsKLSAgICAgICAgYnRhX2hmX2NsaWVudF9hdF9yZXN1bHQoY2xpZW50X2NiLCB0eXBlLCBjbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBjbGllbnRfY2ItPmF0X2NiLmN1cnJlbnRfY21kID0gQlRBX0hGX0NMSUVOVF9BVF9OT05FOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9xdWV1ZWRfYXQoY2xpZW50X2NiKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfcmluZyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBidGFfaGZfY2xpZW50X2V2dF92YWwoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX1JJTkdfSU5ESUNBVElPTiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2Jyc2YodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IDB4JXgiLCBfX2Z1bmNfXywgdmFsdWUpOwotICBjbGllbnRfY2ItPnBlZXJfZmVhdHVyZXMgPSB2YWx1ZTsKLX0KLQotLyogaGFuZGxlcyBhIHNpbmdsZSBpbmRpY2F0b3IgZGVzY3JpcHRvciAtIHJlZ2lzdGVycyBpdCBmb3IgdmFsdWUgY2hhbmdpbmcKLSAqIGV2ZW50cyAqLwotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2luZF9saXN0X2l0ZW0odEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG5hbWUsIHVpbnQzMl90IG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heCwgdWludDMyX3QgaW5kZXgpIHsKLSAgdWludDhfdCBpID0gMDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJWx1LiVzIDwlbHU6JWx1PiIsIF9fZnVuY19fLCBpbmRleCwgbmFtZSwgbWluLCBtYXgpOwotCi0gIC8qIGxvb2sgZm9yIGEgbWF0Y2hpbmcgaW5kaWNhdG9yIG9uIGxpc3Qgb2Ygc3VwcG9ydGVkIG9uZXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9IRl9DTElFTlRfQVRfU1VQUE9SVEVEX0lORElDQVRPUl9DT1VOVDsgaSsrKSB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCBCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9TRVJWSUNFKSA9PSAwKSB7Ci0gICAgICBzZXJ2aWNlX2luZGV4ID0gaW5kZXg7Ci0gICAgfQotICAgIC8qIGxvb2sgZm9yIGEgbWF0Y2ggLSBzZWFyY2ggb25lIHNpZ24gZnVydGhlciB0aGFuIGluZGljYXRvcnMgbmFtZSB0byBjaGVjawotICAgICAqIGZvciBzdHJpbmcgZW5kICovCi0gICAgLyogSXQgd2lsbCBkaXN0aW5ndWlzaCAnY2FsbGhlbGQnIHdoaWNoIGNvdWxkIGJlIG1hdGNoZWQgYnkgc3RybmNtcCBhcwotICAgICAqICdjYWxsJy4gICAgICAgICAgICAgICAqLwotICAgIGlmIChzdHJuY21wKG5hbWUsIGJ0YV9oZl9jbGllbnRfaW5kaWNhdG9yc1tpXS5uYW1lLAotICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfaW5kaWNhdG9yc1tpXS5uYW1lbGVuKSAhPSAwKQotICAgICAgY29udGludWU7Ci0KLSAgICAvKiBpbmRleCAtIGVudW1lcmF0ZXMgdmFsdWUgcG9zaXRpb24gaW4gdGhlIGluY29taW5nIHNlcXVlbmNlICovCi0gICAgLyogaWYgbmFtZSBtYXRjaGVzIG9uZSBvZiB0aGUga25vd24gaW5kaWNhdG9ycywgYWRkIGl0cyBpbmNvbWluZyBwb3NpdGlvbiAqLwotICAgIC8qIHRvIGxvb2t1cCB0YWJsZSBmb3IgZWFzeSB2YWx1ZS0+aW5kaWNhdG9yIG1hdGNoaW5nIGxhdGVyLCB3aGVuIG9ubHkKLSAgICAgKiB2YWx1ZXMgY29tZSAgKi8KLSAgICBjbGllbnRfY2ItPmF0X2NiLmluZGljYXRvcl9sb29rdXBbaW5kZXhdID0gaTsKLQotICAgIHJldHVybjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jaW5kX3ZhbHVlKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCB2YWx1ZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogaW5kZXg6ICV1IHZhbHVlOiAldSIsIF9fZnVuY19fLCBpbmRleCwgdmFsdWUpOwotCi0gIGlmIChpbmRleCA+PSBCVEFfSEZfQ0xJRU5UX0FUX0lORElDQVRPUl9DT1VOVCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzZXJ2aWNlX2luZGV4ID09IGluZGV4KSB7Ci0gICAgaWYgKHZhbHVlID09IDApIHsKLSAgICAgIHNlcnZpY2VfYXZhaWxhYmlsaXR5ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlcnZpY2VfYXZhaWxhYmlsaXR5ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKGNsaWVudF9jYi0+YXRfY2IuaW5kaWNhdG9yX2xvb2t1cFtpbmRleF0gPT0gLTEpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBnZXQgdGhlIHJlYWwgYXJyYXkgaW5kZXggZnJvbSBsb29rdXAgdGFibGUgKi8KLSAgaW5kZXggPSBjbGllbnRfY2ItPmF0X2NiLmluZGljYXRvcl9sb29rdXBbaW5kZXhdOwotCi0gIC8qIElnbm9yZSBvdXQgb2YgcmFuZ2UgdmFsdWVzICovCi0gIGlmICh2YWx1ZSA+IGJ0YV9oZl9jbGllbnRfaW5kaWNhdG9yc1tpbmRleF0ubWF4IHx8Ci0gICAgICB2YWx1ZSA8IGJ0YV9oZl9jbGllbnRfaW5kaWNhdG9yc1tpbmRleF0ubWluKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogdEJUQV9IRl9DTElFTlRfSU5EX1RZUEUgbWF0Y2ggaW5kZXggaW4gYnRhX2hmX2NsaWVudF9pbmRpY2F0b3JzICovCi0gIGJ0YV9oZl9jbGllbnRfaW5kKGNsaWVudF9jYiwgaW5kZXgsIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2hsZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAweCV4IiwgX19mdW5jX18sIG1hc2spOwotCi0gIGNsaWVudF9jYi0+Y2hsZF9mZWF0dXJlcyB8PSBtYXNrOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9iaW5kX3JlYWRfc3VwcG9ydGVkX2luZCgKLSAgICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBpbnQgaW5kaWNhdG9yX2lkKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlZCIsIF9fZnVuY19fLCBpbmRpY2F0b3JfaWQpOwotCi0gIGNsaWVudF9jYi0+cGVlcl9oZl9pbmRpY2F0b3JzLmluc2VydChpbmRpY2F0b3JfaWQpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9iaW5kX3JlYWRfZW5hYmxlZF9pbmQoCi0gICAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgaW50IGluZGljYXRvcl9pZCwgYm9vbCBlbmFibGUpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6ICVkIiwgX19mdW5jX18sIGluZGljYXRvcl9pZCk7Ci0KLSAgaWYgKGVuYWJsZSkgewotICAgIGNsaWVudF9jYi0+ZW5hYmxlZF9oZl9pbmRpY2F0b3JzLmluc2VydChpbmRpY2F0b3JfaWQpOwotICB9IGVsc2UgewotICAgIGNsaWVudF9jYi0+ZW5hYmxlZF9oZl9pbmRpY2F0b3JzLmVyYXNlKGluZGljYXRvcl9pZCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2lldih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCwgdWludDMyX3QgdmFsdWUpIHsKLSAgaW50OF90IHJlYWxpbmQgPSAtMTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogaW5kZXg6ICV1IHZhbHVlOiAldSIsIF9fZnVuY19fLCBpbmRleCwgdmFsdWUpOwotCi0gIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID4gQlRBX0hGX0NMSUVOVF9BVF9JTkRJQ0FUT1JfQ09VTlQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc2VydmljZV9pbmRleCA9PSBpbmRleCAtIDEpIHsKLSAgICBzZXJ2aWNlX2F2YWlsYWJpbGl0eSA9IHZhbHVlID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIH0KLQotICByZWFsaW5kID0gY2xpZW50X2NiLT5hdF9jYi5pbmRpY2F0b3JfbG9va3VwW2luZGV4IC0gMV07Ci0KLSAgaWYgKHJlYWxpbmQgPj0gMCAmJiByZWFsaW5kIDwgQlRBX0hGX0NMSUVOVF9BVF9TVVBQT1JURURfSU5ESUNBVE9SX0NPVU5UKSB7Ci0gICAgLyogZ2V0IHRoZSByZWFsIGluLWFycmF5IGluZGV4IGZyb20gbG9va3VwIHRhYmxlIGJ5IGluZGV4IGl0IGNvbWVzIGF0ICovCi0gICAgLyogaWYgdGhlcmUgaXMgbm8gYnVnIGl0IHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGNvcnJlY3RseSBjYWxjdWxhdGVkICAgICovCi0gICAgaWYgKHZhbHVlID4gYnRhX2hmX2NsaWVudF9pbmRpY2F0b3JzW3JlYWxpbmRdLm1heCB8fAotICAgICAgICB2YWx1ZSA8IGJ0YV9oZl9jbGllbnRfaW5kaWNhdG9yc1tyZWFsaW5kXS5taW4pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiB1cGRhdGUgc2VydmljZSBhdmFpbGFiaWxpdHkgb24gK2NpZXYgZnJvbSBBRy4gKi8KLSAgICBpZiAoc2VydmljZV9pbmRleCA9PSAoaW5kZXggLSAxKSkgewotICAgICAgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgc2VydmljZV9hdmFpbGFiaWxpdHkgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VydmljZV9hdmFpbGFiaWxpdHkgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB0QlRBX0hGX0NMSUVOVF9JTkRfVFlQRSBtYXRjaCBpbmRleCBpbiBidGFfaGZfY2xpZW50X2luZGljYXRvcnMgKi8KLSAgICBidGFfaGZfY2xpZW50X2luZChjbGllbnRfY2IsIHJlYWxpbmQsIHZhbHVlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9iY3ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlYykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICV1IHNjbyBsaXN0ZW4gc3RhdGU6ICVkIiwgX19mdW5jX18sIGNvZGVjLAotICAgICAgICAgICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlKTsKLSAgaWYgKGNvZGVjID09IEJUTV9TQ09fQ09ERUNfQ1ZTRCB8fCBjb2RlYyA9PSBCVE1fU0NPX0NPREVDX01TQkMpIHsKLSAgICBjbGllbnRfY2ItPm5lZ290aWF0ZWRfY29kZWMgPSBjb2RlYzsKLSAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmNzKGNsaWVudF9jYiwgY29kZWMpOwotICB9IGVsc2UgewotICAgIGNsaWVudF9jYi0+bmVnb3RpYXRlZF9jb2RlYyA9IEJUTV9TQ09fQ09ERUNfQ1ZTRDsKLSAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmFjKGNsaWVudF9jYik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfYnNpcih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm92aWRlZCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJXUiLCBfX2Z1bmNfXywgcHJvdmlkZWQpOwotCi0gIGJ0YV9oZl9jbGllbnRfZXZ0X3ZhbChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQlNJUl9FVlQsIHByb3ZpZGVkKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfY21lZXJyb3IodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUpIHsKLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfZXJyb3IoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9DTUUsIGNvZGUpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV92Z20odEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJWx1IiwgX19mdW5jX18sIHZhbHVlKTsKLQotICBpZiAodmFsdWUgPD0gQlRBX0hGX0NMSUVOVF9WR01fTUFYKSB7Ci0gICAgYnRhX2hmX2NsaWVudF9ldnRfdmFsKGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9NSUNfRVZULCB2YWx1ZSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfdmdzKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6ICVsdSIsIF9fZnVuY19fLCB2YWx1ZSk7Ci0KLSAgaWYgKHZhbHVlIDw9IEJUQV9IRl9DTElFTlRfVkdTX01BWCkgewotICAgIGJ0YV9oZl9jbGllbnRfZXZ0X3ZhbChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfU1BLX0VWVCwgdmFsdWUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2J2cmEodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6ICVsdSIsIF9fZnVuY19fLCB2YWx1ZSk7Ci0KLSAgaWYgKHZhbHVlID4gMSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9oZl9jbGllbnRfZXZ0X3ZhbChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfVk9JQ0VfUkVDX0VWVCwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jbGlwKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG51bXN0ciwgdWludDMyX3QgdHlwZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJXUgJXMiLCBfX2Z1bmNfXywgdHlwZSwgbnVtc3RyKTsKLQotICBidGFfaGZfY2xpZW50X2NsaXAoY2xpZW50X2NiLCBudW1zdHIpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jY3dhKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG51bXN0ciwgdWludDMyX3QgdHlwZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJXUgJXMiLCBfX2Z1bmNfXywgdHlwZSwgbnVtc3RyKTsKLQotICBidGFfaGZfY2xpZW50X2Njd2EoY2xpZW50X2NiLCBudW1zdHIpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jb3BzKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGNoYXIqIG9wc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb2RlKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAldSAlcyIsIF9fZnVuY19fLCBtb2RlLCBvcHN0cik7Ci0KLSAgYnRhX2hmX2NsaWVudF9vcGVyYXRvcl9uYW1lKGNsaWVudF9jYiwgb3BzdHIpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9iaW5wKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG51bXN0cikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJXMiLCBfX2Z1bmNfXywgbnVtc3RyKTsKLQotICBidGFfaGZfY2xpZW50X2JpbnAoY2xpZW50X2NiLCBudW1zdHIpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jbGNjKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlkeCwgdWludDE2X3QgZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGF0dXMsIHVpbnQxNl90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1wdHksIGNoYXIqIG51bXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHlwZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogaWR4OiAldSBkaXI6ICV1IHN0YXR1czogJXUgbW9kZTogJXUgbXB0eTogJXUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBpZHgsIGRpciwgc3RhdHVzLCBtb2RlLCBtcHR5KTsKLQotICBpZiAobnVtc3RyKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG51bWJlcjogJXMgIHR5cGU6ICV1IiwgX19mdW5jX18sIG51bXN0ciwgdHlwZSk7Ci0gIH0KLQotICBidGFfaGZfY2xpZW50X2NsY2MoY2xpZW50X2NiLCBpZHgsIGRpciwgc3RhdHVzLCBtcHR5LCBudW1zdHIpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2hhbmRsZV9jbnVtKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG51bXN0ciwgdWludDE2X3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbnVtYmVyOiAlcyB0eXBlOiAldSBzZXJ2aWNlOiAldSIsIF9fZnVuY19fLCBudW1zdHIsCi0gICAgICAgICAgICAgICAgICAgdHlwZSwgc2VydmljZSk7Ci0KLSAgLyogVE9ETzogc2hvdWxkIG51bWJlciBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdHlwZT8gKi8KLSAgYnRhX2hmX2NsaWVudF9jbnVtKGNsaWVudF9jYiwgbnVtc3RyLCBzZXJ2aWNlKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9oYW5kbGVfYnRyaCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb2RlKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlbHUiLCBfX2Z1bmNfXywgY29kZSk7Ci0KLSAgYnRhX2hmX2NsaWVudF9ldnRfdmFsKGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9CVFJIX0VWVCwgY29kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2NiYWNrX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBpbmRpY2F0b3IgY2FsbGJhY2sgZXZlbnQgdG8gYXBwbGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9pbmQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfSU5EX1RZUEUgdHlwZSwgdWludDE2X3QgdmFsdWUpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgZXZ0LmluZC50eXBlID0gdHlwZTsKLSAgZXZ0LmluZC52YWx1ZSA9IHZhbHVlOwotCi0gIGV2dC5pbmQuYmRfYWRkciA9IGNsaWVudF9jYi0+cGVlcl9hZGRyOwotICBidGFfaGZfY2xpZW50X2FwcF9jYWxsYmFjayhCVEFfSEZfQ0xJRU5UX0lORF9FVlQsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9ldnRfdmFsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGV2ZW50IHRvIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgZ2VuZXJpYyBoZWxwZXIgZm9yIGV2ZW50cyB3aXRoIGNvbW1vbiBkYXRhLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2V2dF92YWwodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0VWVCB0eXBlLCB1aW50MTZfdCB2YWx1ZSkgewotICB0QlRBX0hGX0NMSUVOVCBldnQ7Ci0KLSAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKLQotICBldnQudmFsLmJkX2FkZHIgPSBjbGllbnRfY2ItPnBlZXJfYWRkcjsKLSAgZXZ0LnZhbC52YWx1ZSA9IHZhbHVlOwotCi0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKHR5cGUsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9vcGVyYXRvcl9uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIG9wZXJhdG9yIG5hbWUgZXZlbnQgdG8gYXBwbGljYXRpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfb3BlcmF0b3JfbmFtZSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyKiBuYW1lKSB7Ci0gIHRCVEFfSEZfQ0xJRU5UIGV2dDsKLQotICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKGV2dCkpOwotCi0gIHN0cmxjcHkoZXZ0Lm9wZXJhdG9yX25hbWUubmFtZSwgbmFtZSwgQlRBX0hGX0NMSUVOVF9PUEVSQVRPUl9OQU1FX0xFTiArIDEpOwotICBldnQub3BlcmF0b3JfbmFtZS5uYW1lW0JUQV9IRl9DTElFTlRfT1BFUkFUT1JfTkFNRV9MRU5dID0gJ1wwJzsKLQotICBldnQub3BlcmF0b3JfbmFtZS5iZF9hZGRyID0gY2xpZW50X2NiLT5wZWVyX2FkZHI7Ci0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKEJUQV9IRl9DTElFTlRfT1BFUkFUT1JfTkFNRV9FVlQsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9jbGlwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIENMSVAgZXZlbnQgdG8gYXBwbGljYXRpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfY2xpcCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyKiBudW1iZXIpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgc3RybGNweShldnQubnVtYmVyLm51bWJlciwgbnVtYmVyLCBCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU4gKyAxKTsKLSAgZXZ0Lm51bWJlci5udW1iZXJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOXSA9ICdcMCc7Ci0KLSAgZXZ0Lm51bWJlci5iZF9hZGRyID0gY2xpZW50X2NiLT5wZWVyX2FkZHI7Ci0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKEJUQV9IRl9DTElFTlRfQ0xJUF9FVlQsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9jY3dhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIENMSVAgZXZlbnQgdG8gYXBwbGljYXRpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfY2N3YSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyKiBudW1iZXIpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgc3RybGNweShldnQubnVtYmVyLm51bWJlciwgbnVtYmVyLCBCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU4gKyAxKTsKLSAgZXZ0Lm51bWJlci5udW1iZXJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOXSA9ICdcMCc7Ci0KLSAgZXZ0Lm51bWJlci5iZF9hZGRyID0gY2xpZW50X2NiLT5wZWVyX2FkZHI7Ci0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKEJUQV9IRl9DTElFTlRfQ0NXQV9FVlQsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9hdF9yZXN1bHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgQVQgcmVzdWx0IGV2ZW50IHRvIGFwcGxpY2F0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2F0X3Jlc3VsdCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSB0eXBlLCB1aW50MTZfdCBjbWUpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgZXZ0LnJlc3VsdC50eXBlID0gdHlwZTsKLSAgZXZ0LnJlc3VsdC5jbWUgPSBjbWU7Ci0KLSAgZXZ0LnJlc3VsdC5iZF9hZGRyID0gY2xpZW50X2NiLT5wZWVyX2FkZHI7Ci0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0VWVCwgJmV2dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2NsY2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgY2xjYyBldmVudCB0byBhcHBsaWNhdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9jbGNjKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIHVpbnQzMl90IGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jb21pbmcsIHVpbnQ4X3Qgc3RhdHVzLCBib29sIG1wdHksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBudW1iZXIpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgZXZ0LmNsY2MuaWR4ID0gaWR4OwotICBldnQuY2xjYy5pbmMgPSBpbmNvbWluZzsKLSAgZXZ0LmNsY2Muc3RhdHVzID0gc3RhdHVzOwotICBldnQuY2xjYy5tcHR5ID0gbXB0eTsKLQotICBpZiAobnVtYmVyKSB7Ci0gICAgZXZ0LmNsY2MubnVtYmVyX3ByZXNlbnQgPSB0cnVlOwotICAgIHN0cmxjcHkoZXZ0LmNsY2MubnVtYmVyLCBudW1iZXIsIEJUQV9IRl9DTElFTlRfTlVNQkVSX0xFTiArIDEpOwotICAgIGV2dC5jbGNjLm51bWJlcltCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU5dID0gJ1wwJzsKLSAgfQotCi0gIGV2dC5jbGNjLmJkX2FkZHIgPSBjbGllbnRfY2ItPnBlZXJfYWRkcjsKLSAgYnRhX2hmX2NsaWVudF9hcHBfY2FsbGJhY2soQlRBX0hGX0NMSUVOVF9DTENDX0VWVCwgJmV2dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2NudW0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgY251bSBldmVudCB0byBhcHBsaWNhdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9jbnVtKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGNoYXIqIG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2UpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0ID0ge307Ci0KLSAgZXZ0LmNudW0uc2VydmljZSA9IHNlcnZpY2U7Ci0gIHN0cmxjcHkoZXZ0LmNudW0ubnVtYmVyLCBudW1iZXIsIEJUQV9IRl9DTElFTlRfTlVNQkVSX0xFTiArIDEpOwotICBldnQuY251bS5udW1iZXJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOXSA9ICdcMCc7Ci0KLSAgZXZ0LmNudW0uYmRfYWRkciA9IGNsaWVudF9jYi0+cGVlcl9hZGRyOwotICBidGFfaGZfY2xpZW50X2FwcF9jYWxsYmFjayhCVEFfSEZfQ0xJRU5UX0NOVU1fRVZULCAmZXZ0KTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3Vua25vd25fcmVzcG9uc2UodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV2dF9idWZmZXIpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0ID0ge307Ci0KLSAgc3RybGNweShldnQudW5rbm93bi5ldmVudF9zdHJpbmcsIGV2dF9idWZmZXIsCi0gICAgICAgICAgQlRBX0hGX0NMSUVOVF9VTktPV05fRVZFTlRfTEVOICsgMSk7Ci0gIGV2dC51bmtub3duLmV2ZW50X3N0cmluZ1tCVEFfSEZfQ0xJRU5UX1VOS09XTl9FVkVOVF9MRU5dID0gJ1wwJzsKLQotICBldnQudW5rbm93bi5iZF9hZGRyID0gY2xpZW50X2NiLT5wZWVyX2FkZHI7Ci0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKEJUQV9IRl9DTElFTlRfVU5LTk9XTl9FVlQsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9iaW5wCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIEJJTlAgZXZlbnQgdG8gYXBwbGljYXRpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfYmlucCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyKiBudW1iZXIpIHsKLSAgdEJUQV9IRl9DTElFTlQgZXZ0OwotCi0gIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0KLSAgc3RybGNweShldnQubnVtYmVyLm51bWJlciwgbnVtYmVyLCBCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU4gKyAxKTsKLSAgZXZ0Lm51bWJlci5udW1iZXJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOXSA9ICdcMCc7Ci0KLSAgZXZ0Lm51bWJlci5iZF9hZGRyID0gY2xpZW50X2NiLT5wZWVyX2FkZHI7Ci0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKEJUQV9IRl9DTElFTlRfQklOUF9FVlQsICZldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgQ09NTU9OIEFUIEVWRU5UUyBQQVJTSU5HIEZVTkNUSU9OUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENoZWNrIGlmIHByZWZpeCBtYXRjaCBhbmQgc2tpcCBzcGFjZXMgaWYgYW55ICovCi0jZGVmaW5lIEFUX0NIRUNLX0VWRU5UKGJ1ZiwgZXZlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoc3RybmNtcCgiXHJcbiIgZXZlbnQsIGJ1Ziwgc2l6ZW9mKCJcclxuIiBldmVudCkgLSAxKSAhPSAwKSByZXR1cm4gYnVmOyBcCi0gICAgKGJ1ZikgKz0gc2l6ZW9mKCJcclxuIiBldmVudCkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgqKGJ1ZikgPT0gJyAnKSAoYnVmKSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotLyogY2hlY2sgZm9yIDxjcj48bGY+IGFuZCBmb3J3YXJkIGJ1ZmZlciBpZiBtYXRjaCAqLwotI2RlZmluZSBBVF9DSEVDS19STihidWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoc3RybmNtcCgiXHJcbiIsIGJ1Ziwgc2l6ZW9mKCJcclxuIikgLSAxKSAhPSAwKSB7ICAgICAgXAotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG1pc3NpbmcgZW5kIDxjcj48bGY+IiwgX19mdW5jX18pOyBcCi0gICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChidWYpICs9IHNpemVvZigiXHJcbiIpIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8qIHNraXAgcmVzdCBvZiBBVCBzdHJpbmcgdXAgdG8gPGNyPiAqLwotI2RlZmluZSBBVF9TS0lQX1JFU1QoYnVmKSAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgqKGJ1ZikgIT0gJ1xyJykgKGJ1ZikrKzsgXAotICB9IHdoaWxlICgwKQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9vayh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIk9LIik7Ci0gIEFUX0NIRUNLX1JOKGJ1ZmZlcik7Ci0KLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfb2soY2xpZW50X2NiKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9lcnJvcih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIkVSUk9SIik7Ci0gIEFUX0NIRUNLX1JOKGJ1ZmZlcik7Ci0KLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfZXJyb3IoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9FUlJPUiwgMCk7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfcmluZyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiUklORyIpOwotICBBVF9DSEVDS19STihidWZmZXIpOwotCi0gIGJ0YV9oZl9jbGllbnRfaGFuZGxlX3JpbmcoY2xpZW50X2NiKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotCi0vKiBnZW5lcmljIHVpbnQzMiBwYXJzZXIgKi8KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX3VpbnQzMigKLSAgICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyKiBidWZmZXIsCi0gICAgdm9pZCAoKmhhbmRsZXJfY2FsbGJhY2spKHRCVEFfSEZfQ0xJRU5UX0NCKiwgdWludDMyX3QpKSB7Ci0gIHVpbnQzMl90IHZhbHVlOwotICBpbnQgcmVzOwotICBpbnQgb2Zmc2V0OwotCi0gIHJlcyA9IHNzY2FuZihidWZmZXIsICIldSVuIiwgJnZhbHVlLCAmb2Zmc2V0KTsKLSAgaWYgKHJlcyA8IDEpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0KLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBoYW5kbGVyX2NhbGxiYWNrKGNsaWVudF9jYiwgdmFsdWUpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9icnNmKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICIrQlJTRjoiKTsKLQotICByZXR1cm4gYnRhX2hmX2NsaWVudF9wYXJzZV91aW50MzIoY2xpZW50X2NiLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9icnNmKTsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfY2luZF92YWx1ZXModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICAvKiB2YWx1ZSBhbmQgaXRzIHBvc2l0aW9uICovCi0gIHVpbnQxNl90IGluZGV4ID0gMDsKLSAgdWludDMyX3QgdmFsdWUgPSAwOwotCi0gIGludCBvZmZzZXQ7Ci0gIGludCByZXM7Ci0KLSAgd2hpbGUgKChyZXMgPSBzc2NhbmYoYnVmZmVyLCAiJXUlbiIsICZ2YWx1ZSwgJm9mZnNldCkpID4gMCkgewotICAgIC8qIGRlY2lkZXMgaWYgaXRzIHZhbGlkIGluZGV4IGFuZCB2YWx1ZSwgaWYgeWVzIHN0b3JlcyBpdCAqLwotICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NpbmRfdmFsdWUoY2xpZW50X2NiLCBpbmRleCwgdmFsdWUpOwotCi0gICAgYnVmZmVyICs9IG9mZnNldDsKLQotICAgIC8qIGNoZWNrIGlmIG1vcmUgdmFsdWVzIGFyZSBwcmVzZW50ICovCi0gICAgaWYgKCpidWZmZXIgIT0gJywnKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpbmRleCsrOwotICAgIGJ1ZmZlcisrOwotICB9Ci0KLSAgaWYgKHJlcyA+IDApIHsKLSAgICBBVF9DSEVDS19STihidWZmZXIpOwotICAgIHJldHVybiBidWZmZXI7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfY2luZF9saXN0KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIGludCBvZmZzZXQgPSAwOwotICBjaGFyIG5hbWVbMTI5XTsKLSAgdWludDMyX3QgbWluLCBtYXg7Ci0gIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgaW50IHJlczsKLQotICB3aGlsZSAoKHJlcyA9IHNzY2FuZihidWZmZXIsICIoXCIlMTI4W15cIl1cIiwoJXUlKlstLF0ldSkpJW4iLCBuYW1lLCAmbWluLAotICAgICAgICAgICAgICAgICAgICAgICAmbWF4LCAmb2Zmc2V0KSkgPiAyKSB7Ci0gICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2luZF9saXN0X2l0ZW0oY2xpZW50X2NiLCBuYW1lLCBtaW4sIG1heCwgaW5kZXgpOwotICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZvcm1hdCBFcnJvciAlcyIsIF9fZnVuY19fLCBidWZmZXIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYnVmZmVyICs9IG9mZnNldDsKLSAgICBpbmRleCsrOwotCi0gICAgaWYgKCpidWZmZXIgIT0gJywnKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBidWZmZXIrKzsKLSAgfQotCi0gIGlmIChyZXMgPiAyKSB7Ci0gICAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2NpbmQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitDSU5EOiIpOwotCi0gIGlmICgqYnVmZmVyID09ICcoJykgcmV0dXJuIGJ0YV9oZl9jbGllbnRfcGFyc2VfY2luZF9saXN0KGNsaWVudF9jYiwgYnVmZmVyKTsKLQotICByZXR1cm4gYnRhX2hmX2NsaWVudF9wYXJzZV9jaW5kX3ZhbHVlcyhjbGllbnRfY2IsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2NobGQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitDSExEOiIpOwotCi0gIGlmICgqYnVmZmVyICE9ICcoJykgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnVmZmVyKys7Ci0KLSAgd2hpbGUgKCpidWZmZXIgIT0gJ1wwJykgewotICAgIGlmIChzdHJuY21wKCIwIiwgYnVmZmVyLCAxKSA9PSAwKSB7Ci0gICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9jaGxkKGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9DSExEX1JFTCk7Ci0gICAgICBidWZmZXIrKzsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjF4IiwgYnVmZmVyLCAyKSA9PSAwKSB7Ci0gICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9jaGxkKGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9DSExEX1JFTF9YKTsKLSAgICAgIGJ1ZmZlciArPSAyOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiMSIsIGJ1ZmZlciwgMSkgPT0gMCkgewotICAgICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2hsZChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQ0hMRF9SRUxfQUNDKTsKLSAgICAgIGJ1ZmZlcisrOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiMngiLCBidWZmZXIsIDIpID09IDApIHsKLSAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NobGQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0NITERfUFJJVl9YKTsKLSAgICAgIGJ1ZmZlciArPSAyOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcCgiMiIsIGJ1ZmZlciwgMSkgPT0gMCkgewotICAgICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2hsZChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQ0hMRF9IT0xEX0FDQyk7Ci0gICAgICBidWZmZXIrKzsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIjMiLCBidWZmZXIsIDEpID09IDApIHsKLSAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NobGQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0NITERfTUVSR0UpOwotICAgICAgYnVmZmVyKys7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKCI0IiwgYnVmZmVyLCAxKSA9PSAwKSB7Ci0gICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9jaGxkKGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9DSExEX01FUkdFX0RFVEFDSCk7Ci0gICAgICBidWZmZXIrKzsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCpidWZmZXIgPT0gJywnKSB7Ci0gICAgICBidWZmZXIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICgqYnVmZmVyID09ICcpJykgewotICAgICAgYnVmZmVyKys7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEFUX0NIRUNLX1JOKGJ1ZmZlcik7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfYmluZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK0JJTkQ6Iik7Ci0KLSAgdWludDhfdCBtb2RlID0gQlRBX0hGX0NMSUVOVF9CSU5EX1BBUlNFX1JFQURfRU5BQkxFRF9JTkQ7Ci0KLSAgaW50IGlkeCA9IC0xOwotCi0gIHdoaWxlICgqYnVmZmVyICE9IDApIHsKLSAgICBzd2l0Y2ggKCpidWZmZXIpIHsKLSAgICAgIGNhc2UgJygnOgotICAgICAgICBtb2RlID0gQlRBX0hGX0NMSUVOVF9CSU5EX1BBUlNFX1JFQURfU1VQUE9FVEVEX0lORDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcpJzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcwJzoKLSAgICAgIGNhc2UgJzEnOgotICAgICAgY2FzZSAnMic6Ci0gICAgICAgIGlmIChtb2RlID09IEJUQV9IRl9DTElFTlRfQklORF9QQVJTRV9SRUFEX1NVUFBPRVRFRF9JTkQpIHsKLSAgICAgICAgICAvLyArQklORDogKGlkMCwgaWQxLCAuLi4pCi0gICAgICAgICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfYmluZF9yZWFkX3N1cHBvcnRlZF9pbmQoY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyIC0gJzAnKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWR4ID09IC0xKSB7Ci0gICAgICAgICAgLy8gK0JJTkQ6IFtpZF0uLi4KLSAgICAgICAgICBpZHggPSAqYnVmZmVyIC0gJzAnOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vICtCSU5EOiAuLi5bc3RhdHVzXQotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2JpbmRfcmVhZF9lbmFibGVkX2luZChjbGllbnRfY2IsIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciAtICcwJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYnVmZmVyKys7Ci0gIH0KLQotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9jaWV2KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICB1aW50MzJfdCBpbmRleCwgdmFsdWU7Ci0gIGludCByZXM7Ci0gIGludCBvZmZzZXQgPSAwOwotCi0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitDSUVWOiIpOwotCi0gIHJlcyA9IHNzY2FuZihidWZmZXIsICIldSwldSVuIiwgJmluZGV4LCAmdmFsdWUsICZvZmZzZXQpOwotICBpZiAocmVzIDwgMikgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZvcm1hdCBFcnJvciAlcyIsIF9fZnVuY19fLCBidWZmZXIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnVmZmVyICs9IG9mZnNldDsKLQotICBBVF9DSEVDS19STihidWZmZXIpOwotCi0gIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NpZXYoY2xpZW50X2NiLCBpbmRleCwgdmFsdWUpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9iY3ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK0JDUzoiKTsKLQotICByZXR1cm4gYnRhX2hmX2NsaWVudF9wYXJzZV91aW50MzIoY2xpZW50X2NiLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9iY3MpOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9ic2lyKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICIrQlNJUjoiKTsKLQotICByZXR1cm4gYnRhX2hmX2NsaWVudF9wYXJzZV91aW50MzIoY2xpZW50X2NiLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9ic2lyKTsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfY21lZXJyb3IodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICIrQ01FIEVSUk9SOiIpOwotCi0gIHJldHVybiBidGFfaGZfY2xpZW50X3BhcnNlX3VpbnQzMihjbGllbnRfY2IsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NtZWVycm9yKTsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfdmdtKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitWR006Iik7Ci0KLSAgcmV0dXJuIGJ0YV9oZl9jbGllbnRfcGFyc2VfdWludDMyKGNsaWVudF9jYiwgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfdmdtKTsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfdmdtZSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK1ZHTT0iKTsKLQotICByZXR1cm4gYnRhX2hmX2NsaWVudF9wYXJzZV91aW50MzIoY2xpZW50X2NiLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV92Z20pOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV92Z3ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK1ZHUzoiKTsKLQotICByZXR1cm4gYnRhX2hmX2NsaWVudF9wYXJzZV91aW50MzIoY2xpZW50X2NiLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2hhbmRsZV92Z3MpOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV92Z3NlKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICIrVkdTPSIpOwotCi0gIHJldHVybiBidGFfaGZfY2xpZW50X3BhcnNlX3VpbnQzMihjbGllbnRfY2IsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX3Zncyk7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2J2cmEodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitCVlJBOiIpOwotCi0gIHJldHVybiBidGFfaGZfY2xpZW50X3BhcnNlX3VpbnQzMihjbGllbnRfY2IsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2J2cmEpOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9jbGlwKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICAvKiBzcGVjIGZvcmNlcyAzMiBjaGFycywgcGx1cyBcMCBoZXJlICovCi0gIGNoYXIgbnVtYmVyWzMzXTsKLSAgdWludDMyX3QgdHlwZSA9IDA7Ci0gIGludCByZXM7Ci0gIGludCBvZmZzZXQgPSAwOwotCi0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitDTElQOiIpOwotCi0gIC8qIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyBtb3JlIGFmdGVyICVsdSBidXQgSEZQIGRvZXNuJ3QgY2FyZSAqLwotICByZXMgPSBzc2NhbmYoYnVmZmVyLCAiXCIlMzJbXlwiXVwiLCV1JW4iLCBudW1iZXIsICZ0eXBlLCAmb2Zmc2V0KTsKLSAgaWYgKHJlcyA8IDIpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChvZmZzZXQgPT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBGb3JtYXQgRXJyb3IgJXMiLCBfX2Z1bmNfXywgYnVmZmVyKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0KLSAgQVRfU0tJUF9SRVNUKGJ1ZmZlcik7Ci0KLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9jbGlwKGNsaWVudF9jYiwgbnVtYmVyLCB0eXBlKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotLyogaW4gSEZQIGNvbnRleHQgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGNjd2EgYW5kIGNsaXAgKi8KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2Njd2EodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIC8qIGFjIHRvIHNwZWMgMzIgY2hhcnMgbWF4LCBwbHVzIFwwIGhlcmUgKi8KLSAgY2hhciBudW1iZXJbMzNdOwotICB1aW50MzJfdCB0eXBlID0gMDsKLSAgaW50IHJlczsKLSAgaW50IG9mZnNldCA9IDA7Ci0KLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK0NDV0E6Iik7Ci0KLSAgLyogdGhlcmUgbWlnaHQgYmUgc29tZXRoaW5nIG1vcmUgYWZ0ZXIgJWx1IGJ1dCBIRlAgZG9lc24ndCBjYXJlICovCi0gIHJlcyA9IHNzY2FuZihidWZmZXIsICJcIiUzMlteXCJdXCIsJXUlbiIsIG51bWJlciwgJnR5cGUsICZvZmZzZXQpOwotICBpZiAocmVzIDwgMikgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZvcm1hdCBFcnJvciAlcyIsIF9fZnVuY19fLCBidWZmZXIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnVmZmVyICs9IG9mZnNldDsKLQotICBBVF9TS0lQX1JFU1QoYnVmZmVyKTsKLQotICBBVF9DSEVDS19STihidWZmZXIpOwotCi0gIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2Njd2EoY2xpZW50X2NiLCBudW1iZXIsIHR5cGUpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9jb3BzKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICB1aW50OF90IG1vZGU7Ci0gIC8qIHNwZWMgZm9yY2VzIDE2IGNoYXJzIG1heCwgcGx1cyBcMCBoZXJlICovCi0gIGNoYXIgb3BzdHJbMTddOwotICBpbnQgcmVzOwotICBpbnQgb2Zmc2V0ID0gMDsKLQotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICIrQ09QUzoiKTsKLQotICAvKiBUT0RPOiBOb3Qgc3VyZSBpZiBvcGVyYXRvciBzdHJpbmcgYWN0dWFsbHkgY2FuIGNvbnRhaW4gZXNjYXBlZCAiIGNoYXIKLSAgICogaW5zaWRlICovCi0gIHJlcyA9IHNzY2FuZihidWZmZXIsICIlaGhpLDAsXCIlMTZbXlwiXVwiJW4iLCAmbW9kZSwgb3BzdHIsICZvZmZzZXQpOwotICBpZiAocmVzIDwgMikgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIC8qIEFib3J0IGluIGNhc2Ugb2Zmc2V0IG5vdCBzZXQgYmVjYXVzZSBvZiBmb3JtYXQgZXJyb3IgKi8KLSAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZvcm1hdCBFcnJvciAlcyIsIF9fZnVuY19fLCBidWZmZXIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnVmZmVyICs9IG9mZnNldDsKLQotICBBVF9TS0lQX1JFU1QoYnVmZmVyKTsKLQotICBBVF9DSEVDS19STihidWZmZXIpOwotCi0gIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NvcHMoY2xpZW50X2NiLCBvcHN0ciwgbW9kZSk7Ci0gIC8vIGNoZWNrIGZvciBPSyBSZXNwb25zZSBpbiBlbmQKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiT0siKTsKLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9vayhjbGllbnRfY2IpOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2JpbnAodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIC8qIEhGUCBvbmx5IHN1cHBvcnRzIHBob25lIG51bWJlciBhcyBCSU5QIGRhdGEgKi8KLSAgLyogcGhvbmUgbnVtYmVyIGlzIDMyIGNoYXJzIHBsdXMgb25lIGZvciBcMCovCi0gIGNoYXIgbnVtc3RyWzMzXTsKLSAgaW50IHJlczsKLSAgaW50IG9mZnNldCA9IDA7Ci0KLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK0JJTlA6Iik7Ci0KLSAgcmVzID0gc3NjYW5mKGJ1ZmZlciwgIlwiJTMyW15cIl1cIlxyXG4lbiIsIG51bXN0ciwgJm9mZnNldCk7Ci0gIGlmIChyZXMgPCAxKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvKiBBYm9ydCBpbiBjYXNlIG9mZnNldCBub3Qgc2V0IGJlY2F1c2Ugb2YgZm9ybWF0IGVycm9yICovCi0gIGlmIChvZmZzZXQgPT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBGb3JtYXQgRXJyb3IgJXMiLCBfX2Z1bmNfXywgYnVmZmVyKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0KLSAgLyogc29tZSBwaG9uZXMgbWlnaHQgc2VudCB0eXBlIGFzIHdlbGwsIGp1c3Qgc2tpcCBpdCAqLwotICBBVF9TS0lQX1JFU1QoYnVmZmVyKTsKLQotICBBVF9DSEVDS19STihidWZmZXIpOwotCi0gIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2JpbnAoY2xpZW50X2NiLCBudW1zdHIpOwotCi0gIC8vIGNoZWNrIGZvciBPSyByZXNwb25zZSBpbiBlbmQKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiT0siKTsKLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9vayhjbGllbnRfY2IpOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2NsY2ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIHVpbnQxNl90IGlkeCwgZGlyLCBzdGF0dXMsIG1vZGUsIG1wdHk7Ci0gIGNoYXIgbnVtc3RyWzMzXTsgLyogc3BlYyBmb3JjZXMgMzIgY2hhcnMsIHBsdXMgb25lIGZvciBcMCovCi0gIHVpbnQxNl90IHR5cGU7Ci0gIGludCByZXM7Ci0gIGludCBvZmZzZXQgPSAwOwotCi0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitDTENDOiIpOwotCi0gIHJlcyA9IHNzY2FuZihidWZmZXIsICIlaHUsJWh1LCVodSwlaHUsJWh1JW4iLCAmaWR4LCAmZGlyLCAmc3RhdHVzLCAmbW9kZSwKLSAgICAgICAgICAgICAgICZtcHR5LCAmb2Zmc2V0KTsKLSAgaWYgKHJlcyA8IDUpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8qIEFib3J0IGluIGNhc2Ugb2Zmc2V0IG5vdCBzZXQgYmVjYXVzZSBvZiBmb3JtYXQgZXJyb3IgKi8KLSAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZvcm1hdCBFcnJvciAlcyIsIF9fZnVuY19fLCBidWZmZXIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnVmZmVyICs9IG9mZnNldDsKLSAgb2Zmc2V0ID0gMDsKLQotICAvKiBjaGVjayBvcHRpb25hbCBwYXJ0ICovCi0gIGlmICgqYnVmZmVyID09ICcsJykgewotICAgIGludCByZXMyID0gc3NjYW5mKGJ1ZmZlciwgIixcIiUzMlteXCJdXCIsJWh1JW4iLCBudW1zdHIsICZ0eXBlLCAmb2Zmc2V0KTsKLSAgICBpZiAocmVzMiA8IDApIHJldHVybiBOVUxMOwotCi0gICAgaWYgKHJlczIgPT0gMCkgewotICAgICAgcmVzMiA9IHNzY2FuZihidWZmZXIsICIsXCJcIiwlaHUlbiIsICZ0eXBlLCAmb2Zmc2V0KTsKLSAgICAgIGlmIChyZXMyIDwgMCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIC8qIG51bXN0ciBpcyBub3QgbWF0Y2hlZCBpbiBzZWNvbmQgYXR0ZW1wdCwgY29ycmVjdCB0aGlzICovCi0gICAgICByZXMyKys7Ci0gICAgICBudW1zdHJbMF0gPSAnXDAnOwotICAgIH0KLQotICAgIGlmIChyZXMyID49IDIpIHsKLSAgICAgIHJlcyArPSByZXMyOwotICAgICAgLyogQWJvcnQgaW4gY2FzZSBvZmZzZXQgbm90IHNldCBiZWNhdXNlIG9mIGZvcm1hdCBlcnJvciAqLwotICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBGb3JtYXQgRXJyb3IgJXMiLCBfX2Z1bmNfXywgYnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gICAgfQotICB9Ci0KLSAgLyogU2tpcCBhbnkgcmVtYWluZyBwYXJhbSxhcyB0aGV5IGFyZSBub3QgZGVmaW5lZCBieSBCVCBIRlAgc3BlYyAqLwotICBBVF9TS0lQX1JFU1QoYnVmZmVyKTsKLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBpZiAocmVzID4gNikgewotICAgIC8qIHdlIGFsc28gaGF2ZSBsYXN0IHR3byBvcHRpb25hbCBwYXJhbWV0ZXJzICovCi0gICAgYnRhX2hmX2NsaWVudF9oYW5kbGVfY2xjYyhjbGllbnRfY2IsIGlkeCwgZGlyLCBzdGF0dXMsIG1vZGUsIG1wdHksIG51bXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwotICB9IGVsc2UgewotICAgIC8qIHdlIGRpZG4ndCBnZXQgdGhlIGxhc3QgdHdvIHBhcmFtZXRlcnMgKi8KLSAgICBidGFfaGZfY2xpZW50X2hhbmRsZV9jbGNjKGNsaWVudF9jYiwgaWR4LCBkaXIsIHN0YXR1cywgbW9kZSwgbXB0eSwgTlVMTCwgMCk7Ci0gIH0KLQotICAvLyBjaGVjayBmb3IgT0sgcmVzcG9uc2UgaW4gZW5kCi0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIk9LIik7Ci0gIEFUX0NIRUNLX1JOKGJ1ZmZlcik7Ci0KLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfb2soY2xpZW50X2NiKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfcGFyc2VfY251bSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgY2hhciBudW1zdHJbMzNdOyAvKiBzcGVjIGZvcmNlcyAzMiBjaGFycywgcGx1cyBvbmUgZm9yIFwwKi8KLSAgdWludDE2X3QgdHlwZTsKLSAgdWludDE2X3Qgc2VydmljZSA9Ci0gICAgICAwOyAvKiAwIGluIGNhc2UgdGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgbm90IGJlaW5nIHNlbnQgKi8KLSAgaW50IHJlczsKLSAgaW50IG9mZnNldCA9IDA7Ci0KLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiK0NOVU06Iik7Ci0KLSAgcmVzID0gc3NjYW5mKGJ1ZmZlciwgIixcIiUzMlteXCJdXCIsJWh1LCwlaHUlbiIsIG51bXN0ciwgJnR5cGUsICZzZXJ2aWNlLAotICAgICAgICAgICAgICAgJm9mZnNldCk7Ci0gIGlmIChyZXMgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAocmVzID09IDApIHsKLSAgICByZXMgPSBzc2NhbmYoYnVmZmVyLCAiLFwiXCIsJWh1LCwlaHUlbiIsICZ0eXBlLCAmc2VydmljZSwgJm9mZnNldCk7Ci0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIG51bXN0ciBpcyBub3QgbWF0Y2hlZCBpbiBzZWNvbmQgYXR0ZW1wdCwgY29ycmVjdCB0aGlzICovCi0gICAgcmVzKys7Ci0gICAgbnVtc3RyWzBdID0gJ1wwJzsKLSAgfQotCi0gIGlmIChyZXMgPCAzKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvKiBBYm9ydCBpbiBjYXNlIG9mZnNldCBub3Qgc2V0IGJlY2F1c2Ugb2YgZm9ybWF0IGVycm9yICovCi0gIGlmIChvZmZzZXQgPT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBGb3JtYXQgRXJyb3IgJXMiLCBfX2Z1bmNfXywgYnVmZmVyKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0KLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICAvKiBzZXJ2aWNlIGlzIG9wdGlvbmFsICovCi0gIGlmIChyZXMgPT0gMikgewotICAgIGJ0YV9oZl9jbGllbnRfaGFuZGxlX2NudW0oY2xpZW50X2NiLCBudW1zdHIsIHR5cGUsIHNlcnZpY2UpOwotICAgIHJldHVybiBidWZmZXI7Ci0gIH0KLQotICBpZiAoc2VydmljZSAhPSA0ICYmIHNlcnZpY2UgIT0gNSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfY251bShjbGllbnRfY2IsIG51bXN0ciwgdHlwZSwgc2VydmljZSk7Ci0KLSAgLy8gY2hlY2sgZm9yIE9LIHJlc3BvbnNlIGluIGVuZAotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICJPSyIpOwotICBBVF9DSEVDS19STihidWZmZXIpOwotCi0gIGJ0YV9oZl9jbGllbnRfaGFuZGxlX29rKGNsaWVudF9jYik7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2J0cmgodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIHVpbnQxNl90IGNvZGUgPSAwOwotICBpbnQgcmVzOwotICBpbnQgb2Zmc2V0OwotCi0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIitCVFJIOiIpOwotCi0gIHJlcyA9IHNzY2FuZihidWZmZXIsICIlaHUlbiIsICZjb2RlLCAmb2Zmc2V0KTsKLSAgaWYgKHJlcyA8IDEpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0KLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9idHJoKGNsaWVudF9jYiwgY29kZSk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2J1c3kodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIkJVU1kiKTsKLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9lcnJvcihjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0JVU1ksIDApOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX2RlbGF5ZWQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIEFUX0NIRUNLX0VWRU5UKGJ1ZmZlciwgIkRFTEFZRUQiKTsKLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9lcnJvcihjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0RFTEFZLCAwKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9ub19jYXJyaWVyKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICJOTyBDQVJSSUVSIik7Ci0gIEFUX0NIRUNLX1JOKGJ1ZmZlcik7Ci0KLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfZXJyb3IoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9OT19DQVJSSUVSLCAwKTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY2hhciogYnRhX2hmX2NsaWVudF9wYXJzZV9ub19hbnN3ZXIodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIpIHsKLSAgQVRfQ0hFQ0tfRVZFTlQoYnVmZmVyLCAiTk8gQU5TV0VSIik7Ci0gIEFUX0NIRUNLX1JOKGJ1ZmZlcik7Ci0KLSAgYnRhX2hmX2NsaWVudF9oYW5kbGVfZXJyb3IoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9OT19BTlNXRVIsIDApOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3BhcnNlX3JlamVjdGxpc3RlZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBBVF9DSEVDS19FVkVOVChidWZmZXIsICJSRUpFQ1RMSVNURUQiKTsKLSAgQVRfQ0hFQ0tfUk4oYnVmZmVyKTsKLQotICBidGFfaGZfY2xpZW50X2hhbmRsZV9lcnJvcihjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX1JFSkVDVExJU1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNoYXIqIGJ0YV9oZl9jbGllbnRfc2tpcF91bmtub3duKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyKSB7Ci0gIGNoYXIqIHN0YXJ0OwotICBjaGFyKiB0bXA7Ci0KLSAgdG1wID0gc3Ryc3RyKGJ1ZmZlciwgIlxyXG4iKTsKLSAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBidWZmZXIgKz0gMjsKLSAgc3RhcnQgPSBidWZmZXI7Ci0KLSAgdG1wID0gc3Ryc3RyKGJ1ZmZlciwgIlxyXG4iKTsKLSAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBidWZmZXIgPSB0bXAgKyAyOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlLipzIiwgX19mdW5jX18sIGJ1ZmZlciAtIHN0YXJ0IC0gMiwgc3RhcnQpOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjaGFyKiBidGFfaGZfY2xpZW50X3Byb2Nlc3NfdW5rbm93bih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcikgewotICBjaGFyKiBzdGFydCA9IHN0cnN0cihidWZmZXIsICJcclxuIik7Ci0gIGlmIChzdGFydCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgc3RhcnQgKz0gc2l6ZW9mKCJcclxuIikgLSAxOwotCi0gIGNoYXIqIGVuZCA9IHN0cnN0cihzdGFydCwgIlxyXG4iKTsKLSAgaWYgKGVuZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpbnQgZXZ0X3NpemUgPSBlbmQgLSBzdGFydCArIDE7Ci0KLSAgY2hhciB0bXBfYnVmW0JUQV9IRl9DTElFTlRfVU5LT1dOX0VWRU5UX0xFTl07Ci0gIGlmIChldnRfc2l6ZSA8IEJUQV9IRl9DTElFTlRfVU5LT1dOX0VWRU5UX0xFTikgewotICAgIHN0cmxjcHkodG1wX2J1Ziwgc3RhcnQsIGV2dF9zaXplKTsKLSAgICBidGFfaGZfY2xpZW50X3Vua25vd25fcmVzcG9uc2UoY2xpZW50X2NiLCB0bXBfYnVmKTsKLSAgICBBVF9DSEVDS19STihlbmQpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBleGNlZWQgZXZlbnQgYnVmZmVyIHNpemUuICglZCwgJWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBldnRfc2l6ZSwgQlRBX0hGX0NMSUVOVF9VTktPV05fRVZFTlRfTEVOKTsKLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlcyIsIF9fZnVuY19fLCBidWZmZXIpOwotCi0gIHJldHVybiBlbmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgIFNVUFBPUlRFRCBFVkVOVCBNRVNTQUdFUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogcmV0dXJuZWQgdmFsdWVzIGFyZSBhcyBmb2xsb3c6Ci0gKiAhPSBOVUxMICYmICE9IGJ1ZiAgOiBtYXRjaCBhbmQgcGFyc2VkIG9rCi0gKiA9PSBOVUxMICAgICAgICAgICAgOiBtYXRjaCBidXQgcGFyc2UgZmFpbGVkCi0gKiAhPSBOVUxMICYmID09IGJ1ZiAgOiBubyBtYXRjaAotICovCi10eXBlZGVmIGNoYXIqICgqdEJUQV9IRl9DTElFTlRfUEFSU0VSX0NBTExCQUNLKSh0QlRBX0hGX0NMSUVOVF9DQiosIGNoYXIqKTsKLQotc3RhdGljIGNvbnN0IHRCVEFfSEZfQ0xJRU5UX1BBUlNFUl9DQUxMQkFDSyBidGFfaGZfY2xpZW50X3BhcnNlcl9jYltdID0gewotICAgIGJ0YV9oZl9jbGllbnRfcGFyc2Vfb2ssICAgICAgICBidGFfaGZfY2xpZW50X3BhcnNlX2Vycm9yLAotICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfcmluZywgICAgICBidGFfaGZfY2xpZW50X3BhcnNlX2Jyc2YsCi0gICAgYnRhX2hmX2NsaWVudF9wYXJzZV9jaW5kLCAgICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfY2lldiwKLSAgICBidGFfaGZfY2xpZW50X3BhcnNlX2NobGQsICAgICAgYnRhX2hmX2NsaWVudF9wYXJzZV9iY3MsCi0gICAgYnRhX2hmX2NsaWVudF9wYXJzZV9ic2lyLCAgICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfY21lZXJyb3IsCi0gICAgYnRhX2hmX2NsaWVudF9wYXJzZV92Z20sICAgICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfdmdtZSwKLSAgICBidGFfaGZfY2xpZW50X3BhcnNlX3ZncywgICAgICAgYnRhX2hmX2NsaWVudF9wYXJzZV92Z3NlLAotICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfYnZyYSwgICAgICBidGFfaGZfY2xpZW50X3BhcnNlX2NsaXAsCi0gICAgYnRhX2hmX2NsaWVudF9wYXJzZV9jY3dhLCAgICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfY29wcywKLSAgICBidGFfaGZfY2xpZW50X3BhcnNlX2JpbnAsICAgICAgYnRhX2hmX2NsaWVudF9wYXJzZV9jbGNjLAotICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfY251bSwgICAgICBidGFfaGZfY2xpZW50X3BhcnNlX2J0cmgsCi0gICAgYnRhX2hmX2NsaWVudF9wYXJzZV9iaW5kLCAgICAgIGJ0YV9oZl9jbGllbnRfcGFyc2VfYnVzeSwKLSAgICBidGFfaGZfY2xpZW50X3BhcnNlX2RlbGF5ZWQsICAgYnRhX2hmX2NsaWVudF9wYXJzZV9ub19jYXJyaWVyLAotICAgIGJ0YV9oZl9jbGllbnRfcGFyc2Vfbm9fYW5zd2VyLCBidGFfaGZfY2xpZW50X3BhcnNlX3JlamVjdGxpc3RlZCwKLSAgICBidGFfaGZfY2xpZW50X3Byb2Nlc3NfdW5rbm93bn07Ci0KLS8qIGNhbGN1bGF0ZSBzdXBwb3J0ZWQgZXZlbnQgbGlzdCBsZW5ndGggKi8KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBidGFfaGZfY2xpZW50X3BhcnNlcl9jYl9jb3VudCA9Ci0gICAgc2l6ZW9mKGJ0YV9oZl9jbGllbnRfcGFyc2VyX2NiKSAvIHNpemVvZihidGFfaGZfY2xpZW50X3BhcnNlcl9jYlswXSk7Ci0KLSNpZmRlZiBCVEFfSEZfQ0xJRU5UX0FUX0RVTVAKLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfZHVtcF9hdCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIGNoYXIgZHVtcFsoNCAqIEJUQV9IRl9DTElFTlRfQVRfUEFSU0VSX01BWF9MRU4pICsgMV07Ci0gIGNoYXIgKnAxLCAqcDI7Ci0KLSAgcDEgPSBjbGllbnRfY2ItPmF0X2NiLmJ1ZjsKLSAgcDIgPSBkdW1wOwotCi0gIHdoaWxlICgqcDEgIT0gJ1wwJykgewotICAgIGlmICgqcDEgPT0gJ1xyJykgewotICAgICAgc3RybGNweShwMiwgIjxjcj4iLCA0KTsKLSAgICAgIHAyICs9IDQ7Ci0gICAgfSBlbHNlIGlmICgqcDEgPT0gJ1xuJykgewotICAgICAgc3RybGNweShwMiwgIjxsZj4iLCA0KTsKLSAgICAgIHAyICs9IDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpwMiA9ICpwMTsKLSAgICAgIHAyKys7Ci0gICAgfQotICAgIHAxKys7Ci0gIH0KLQotICAqcDIgPSAnXDAnOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlcyIsIF9fZnVuY19fLCBkdW1wKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X2F0X3BhcnNlX3N0YXJ0KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgY2hhciogYnVmID0gY2xpZW50X2NiLT5hdF9jYi5idWY7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSNpZmRlZiBCVEFfSEZfQ0xJRU5UX0FUX0RVTVAKLSAgYnRhX2hmX2NsaWVudF9kdW1wX2F0KGNsaWVudF9jYik7Ci0jZW5kaWYKLQotICB3aGlsZSAoKmJ1ZiAhPSAnXDAnKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhciogdG1wID0gTlVMTDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBidGFfaGZfY2xpZW50X3BhcnNlcl9jYl9jb3VudDsgaSsrKSB7Ci0gICAgICB0bXAgPSBidGFfaGZfY2xpZW50X3BhcnNlcl9jYltpXShjbGllbnRfY2IsIGJ1Zik7Ci0gICAgICBpZiAodG1wID09IE5VTEwpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiSEZQQ2llbnQ6IEFUIGV2ZW50L3JlcGx5IHBhcnNpbmcgZmFpbGVkLCBza2lwcGluZyIpOwotICAgICAgICB0bXAgPSBidGFfaGZfY2xpZW50X3NraXBfdW5rbm93bihjbGllbnRfY2IsIGJ1Zik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiBtYXRjaGVkIG9yIHVua25vd24gc2tpcHBlZCwgaWYgdW5rbm93biBmYWlsZWQgdG1wIGlzIE5VTEwgc28KLSAgICAgICAgIHRoaXMgaXMgYWxzbyBoYW5kbGVkICovCi0gICAgICBpZiAodG1wICE9IGJ1ZikgewotICAgICAgICBidWYgPSB0bXA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvdWxkIG5vdCBza2lwIHVua25vd24gKHJlY2VpdmVkIGdhcmJhZ2U/KS4uLiBkaXNjb25uZWN0ICovCi0gICAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJIRlBDaWVudDogY291bGQgbm90IHNraXAgdW5rbm93biBBVCBldmVudCwgZGlzY29ubmVjdGluZyIpOwotICAgICAgYnRhX2hmX2NsaWVudF9hdF9yZXNldChjbGllbnRfY2IpOwotCi0gICAgICB0QlRBX0hGX0NMSUVOVF9EQVRBIG1zZyA9IHt9OwotICAgICAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYi0+aGFuZGxlOwotICAgICAgYnRhX2hmX2NsaWVudF9zbV9leGVjdXRlKEJUQV9IRl9DTElFTlRfQVBJX0NMT1NFX0VWVCwgJm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnVmID0gdG1wOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGJ0YV9oZl9jbGllbnRfY2hlY2tfYXRfY29tcGxldGUodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBib29sIHJldCA9IGZhbHNlOwotICB0QlRBX0hGX0NMSUVOVF9BVF9DQiogYXRfY2IgPSAmY2xpZW50X2NiLT5hdF9jYjsKLQotICBpZiAoYXRfY2ItPm9mZnNldCA+PSBCVEFfSEZfQ0xJRU5UX0FUX0VWRU5UX01JTl9MRU4pIHsKLSAgICBpZiAoYXRfY2ItPmJ1ZlthdF9jYi0+b2Zmc2V0IC0gMl0gPT0gJ1xyJyAmJgotICAgICAgICBhdF9jYi0+YnVmW2F0X2NiLT5vZmZzZXQgLSAxXSA9PSAnXG4nKSB7Ci0gICAgICByZXQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlZCIsIF9fZnVuY19fLCByZXQpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfYXRfY2xlYXJfYnVmKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgbWVtc2V0KGNsaWVudF9jYi0+YXRfY2IuYnVmLCAwLCBzaXplb2YoY2xpZW50X2NiLT5hdF9jYi5idWYpKTsKLSAgY2xpZW50X2NiLT5hdF9jYi5vZmZzZXQgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgTUFJTiBQQVJTSU5HIEZVTkNUSU9OCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfYXRfcGFyc2UodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgY2hhciogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG9mZnNldDogJXUgbGVuOiAldSIsIF9fZnVuY19fLCBjbGllbnRfY2ItPmF0X2NiLm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBsZW4pOwotCi0gIGlmIChsZW4gKyBjbGllbnRfY2ItPmF0X2NiLm9mZnNldCA+IEJUQV9IRl9DTElFTlRfQVRfUEFSU0VSX01BWF9MRU4pIHsKLSAgICBjaGFyIHRtcF9idWZmW0JUQV9IRl9DTElFTlRfQVRfUEFSU0VSX01BWF9MRU5dOwotICAgIHVuc2lnbmVkIGludCB0bXAgPSBjbGllbnRfY2ItPmF0X2NiLm9mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgc3BhY2VfbGVmdCA9Ci0gICAgICAgIEJUQV9IRl9DTElFTlRfQVRfUEFSU0VSX01BWF9MRU4gLSBjbGllbnRfY2ItPmF0X2NiLm9mZnNldDsKLQotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBvdmVycnVuLCB0cnlpbmcgdG8gcmVjb3ZlciIsIF9fZnVuY19fKTsKLQotICAgIC8qIGZpbGwgdXAgcGFyc2VyIGJ1ZmZlciAqLwotICAgIG1lbWNweShjbGllbnRfY2ItPmF0X2NiLmJ1ZiArIGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0LCBidWYsIHNwYWNlX2xlZnQpOwotICAgIGxlbiAtPSBzcGFjZV9sZWZ0OwotICAgIGJ1ZiArPSBzcGFjZV9sZWZ0OwotICAgIGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0ICs9IHNwYWNlX2xlZnQ7Ci0KLSAgICAvKiBmaW5kIGVuZCBvZiBsYXN0IGNvbXBsZXRlIGNvbW1hbmQgYmVmb3JlIHByb2NlZWRpbmcgKi8KLSAgICB3aGlsZSAoIWJ0YV9oZl9jbGllbnRfY2hlY2tfYXRfY29tcGxldGUoY2xpZW50X2NiKSkgewotICAgICAgaWYgKGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0ID09IDApIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiSEZQQ2xpZW50OiBBVCBwYXJzZXIgYnVmZmVyIG92ZXJydW4sIGRpc2Nvbm5lY3RpbmciKTsKLQotICAgICAgICBidGFfaGZfY2xpZW50X2F0X3Jlc2V0KGNsaWVudF9jYik7Ci0KLSAgICAgICAgdEJUQV9IRl9DTElFTlRfREFUQSBtc2cgPSB7fTsKLSAgICAgICAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYi0+aGFuZGxlOwotICAgICAgICBidGFfaGZfY2xpZW50X3NtX2V4ZWN1dGUoQlRBX0hGX0NMSUVOVF9BUElfQ0xPU0VfRVZULCAmbXNnKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBjbGllbnRfY2ItPmF0X2NiLm9mZnNldC0tOwotICAgIH0KLQotICAgIC8qIGN1dCBidWZmZXIgdG8gY29tcGxldGUgQVQgZXZlbnQgYW5kIGtlZXAgY3V0IGRhdGEgKi8KLSAgICB0bXAgKz0gc3BhY2VfbGVmdCAtIGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0OwotICAgIG1lbWNweSh0bXBfYnVmZiwgY2xpZW50X2NiLT5hdF9jYi5idWYgKyBjbGllbnRfY2ItPmF0X2NiLm9mZnNldCwgdG1wKTsKLSAgICBjbGllbnRfY2ItPmF0X2NiLmJ1ZltjbGllbnRfY2ItPmF0X2NiLm9mZnNldF0gPSAnXDAnOwotCi0gICAgLyogcGFyc2UgKi8KLSAgICBidGFfaGZfY2xpZW50X2F0X3BhcnNlX3N0YXJ0KGNsaWVudF9jYik7Ci0gICAgYnRhX2hmX2NsaWVudF9hdF9jbGVhcl9idWYoY2xpZW50X2NiKTsKLQotICAgIC8qIHJlY292ZXIgY3V0IGRhdGEgKi8KLSAgICBtZW1jcHkoY2xpZW50X2NiLT5hdF9jYi5idWYsIHRtcF9idWZmLCB0bXApOwotICAgIGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0ICs9IHRtcDsKLSAgfQotCi0gIG1lbWNweShjbGllbnRfY2ItPmF0X2NiLmJ1ZiArIGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0LCBidWYsIGxlbik7Ci0gIGNsaWVudF9jYi0+YXRfY2Iub2Zmc2V0ICs9IGxlbjsKLQotICAvKiBJZiBsYXN0IGV2ZW50IGlzIGNvbXBsZXRlLCBwYXJzaW5nIGNhbiBiZSBzdGFydGVkICovCi0gIGlmIChidGFfaGZfY2xpZW50X2NoZWNrX2F0X2NvbXBsZXRlKGNsaWVudF9jYikpIHsKLSAgICBidGFfaGZfY2xpZW50X2F0X3BhcnNlX3N0YXJ0KGNsaWVudF9jYik7Ci0gICAgYnRhX2hmX2NsaWVudF9hdF9jbGVhcl9idWYoY2xpZW50X2NiKTsKLSAgfQotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9icnNmKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0ZFQVQgZmVhdHVyZXMpIHsKLSAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKLSAgaW50IGF0X2xlbjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVQrQlJTRj0ldVxyIiwgZmVhdHVyZXMpOwotICBpZiAoYXRfbGVuIDwgMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBVCBjb21tYW5kIEZyYW1pbmcgZXJyb3IiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9CUlNGLCBidWYsIGF0X2xlbik7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JhYyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIGNvbnN0IGNoYXIqIGJ1ZjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidWYgPSAiQVQrQkFDPTEsMlxyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0JBQywgYnVmLCBzdHJsZW4oYnVmKSk7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Jjcyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCB1aW50MzJfdCBjb2RlYykgewotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICBpbnQgYXRfbGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtCQ1M9JXVcciIsIGNvZGVjKTsKLSAgaWYgKGF0X2xlbiA8IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQVQgY29tbWFuZCBGcmFtaW5nIGVycm9yIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfQkNTLCBidWYsIGF0X2xlbik7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgYm9vbCBzdGF0dXMpIHsKLSAgY29uc3QgY2hhciogYnVmOwotICB0QlRBX0hGX0NMSUVOVF9BVF9DTUQgY21kOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICBidWYgPSAiQVQrQ0lORD9cciI7Ci0gICAgY21kID0gQlRBX0hGX0NMSUVOVF9BVF9DSU5EX1NUQVRVUzsKLSAgfSBlbHNlIHsKLSAgICBidWYgPSAiQVQrQ0lORD0/XHIiOwotICAgIGNtZCA9IEJUQV9IRl9DTElFTlRfQVRfQ0lORDsKLSAgfQotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIGNtZCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NtZXIodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgYm9vbCBhY3RpdmF0ZSkgewotICBjb25zdCBjaGFyKiBidWY7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKGFjdGl2YXRlKQotICAgIGJ1ZiA9ICJBVCtDTUVSPTMsMCwwLDFcciI7Ci0gIGVsc2UKLSAgICBidWYgPSAiQVQrQ01FUj0zLDAsMCwwXHIiOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfQ01FUiwgYnVmLCBzdHJsZW4oYnVmKSk7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NobGQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgY2hhciBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGlkeCkgewotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICBpbnQgYXRfbGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChpZHggPiAwKQotICAgIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtDSExEPSVjJXVcciIsIGNtZCwgaWR4KTsKLSAgZWxzZQotICAgIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtDSExEPSVjXHIiLCBjbWQpOwotCi0gIGlmIChhdF9sZW4gPCAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEFUIGNvbW1hbmQgRnJhbWluZyBlcnJvciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0NITEQsIGJ1ZiwgYXRfbGVuKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmluZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBpbnQgc3RlcCkgewotICBzdGQ6OnN0cmluZyBidWY7Ci0gIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjbWQgPSBCVEFfSEZfQ0xJRU5UX0FUX0JJTkRfU0VUX0lORDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBzd2l0Y2ggKHN0ZXApIHsKLSAgICBjYXNlIDA6ICAvLyBMaXN0IEhGIHN1cHBvcnRlZCBpbmRpY2F0b3JzCi0gICAgICAvLyBUT0RPOiBBZGQgZmxhZ3MgdG8gZGV0ZXJtaW5lIGVuYWJsZWQgSEYgZmVhdHVyZXMKLSAgICAgIGJ1ZiA9ICJBVCtCSU5EPTEsMlxyIjsKLSAgICAgIGNtZCA9IEJUQV9IRl9DTElFTlRfQVRfQklORF9TRVRfSU5EOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOiAgLy8gUmVhZCBBRyBzdXBwb3J0ZWQgaW5kaWNhdG9ycwotICAgICAgYnVmID0gIkFUK0JJTkQ9P1xyIjsKLSAgICAgIGNtZCA9IEJUQV9IRl9DTElFTlRfQVRfQklORF9SRUFEX1NVUFBPUlRFRF9JTkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6ICAvLyBSZWFkIEFHIGVuYWJsZWQvZGlzYWJsZWQgc3RhdHVzIG9mIGluZGljYXRvcnMKLSAgICAgIGJ1ZiA9ICJBVCtCSU5EP1xyIjsKLSAgICAgIGNtZCA9IEJUQV9IRl9DTElFTlRfQVRfQklORF9SRUFEX0VOQUJMRURfSU5EOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIGNtZCwgYnVmLmNfc3RyKCksIGJ1Zi5zaXplKCkpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaWV2KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGludCBpbmRpY2F0b3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRpY2F0b3JfdmFsdWUpIHsKLSAgY2hhciBidWZbMzJdOwotICB0QlRBX0hGX0NMSUVOVF9BVF9DTUQgY21kID0gQlRBX0hGX0NMSUVOVF9BVF9CSUVWOwotCi0gIGlmICgoY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0hGX0NMSUVOVF9GRUFUX0hGX0lORCkgPT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzIHBlZXIgZG9lcyBub3Qgc3VwcG9ydCBIRiBJbmRpY2F0b3JzIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjbGllbnRfY2ItPmVuYWJsZWRfaGZfaW5kaWNhdG9ycy5jb3VudChpbmRpY2F0b3JfaWQpIDw9IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcyBIRiBpbmRpY2F0b3JzICVkIGlzIGRpc2FibGVkIiwgX19mdW5jX18sIGluZGljYXRvcl9pZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaW50IGxlbiA9IHNwcmludGYoYnVmLCAiQVQrQklFVj0lZCwlZFxyIiwgaW5kaWNhdG9yX2lkLCBpbmRpY2F0b3JfdmFsdWUpOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIGNtZCwgYnVmLCBsZW4pOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbGlwKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgYWN0aXZhdGUpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChhY3RpdmF0ZSkKLSAgICBidWYgPSAiQVQrQ0xJUD0xXHIiOwotICBlbHNlCi0gICAgYnVmID0gIkFUK0NMSVA9MFxyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0NMSVAsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jY3dhKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgYWN0aXZhdGUpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChhY3RpdmF0ZSkKLSAgICBidWYgPSAiQVQrQ0NXQT0xXHIiOwotICBlbHNlCi0gICAgYnVmID0gIkFUK0NDV0E9MFxyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0NDV0EsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbWVlKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgYWN0aXZhdGUpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChhY3RpdmF0ZSkKLSAgICBidWYgPSAiQVQrQ01FRT0xXHIiOwotICBlbHNlCi0gICAgYnVmID0gIkFUK0NNRUU9MFxyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRUUsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jb3BzKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgcXVlcnkpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChxdWVyeSkKLSAgICBidWYgPSAiQVQrQ09QUz9cciI7Ci0gIGVsc2UKLSAgICBidWYgPSAiQVQrQ09QUz0zLDBcciI7Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9DT1BTLCBidWYsIHN0cmxlbihidWYpKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2xjYyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIGNvbnN0IGNoYXIqIGJ1ZjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidWYgPSAiQVQrQ0xDQ1xyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0NMQ0MsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idnJhKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgZW5hYmxlKSB7Ci0gIGNvbnN0IGNoYXIqIGJ1ZjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoZW5hYmxlKQotICAgIGJ1ZiA9ICJBVCtCVlJBPTFcciI7Ci0gIGVsc2UKLSAgICBidWYgPSAiQVQrQlZSQT0wXHIiOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfQlZSQSwgYnVmLCBzdHJsZW4oYnVmKSk7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3Zncyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCB1aW50MzJfdCB2b2x1bWUpIHsKLSAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKLSAgaW50IGF0X2xlbjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVQrVkdTPSV1XHIiLCB2b2x1bWUpOwotICBpZiAoYXRfbGVuIDwgMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBVCBjb21tYW5kIEZyYW1pbmcgZXJyb3IiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9WR1MsIGJ1ZiwgYXRfbGVuKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfdmdtKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIHVpbnQzMl90IHZvbHVtZSkgewotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICBpbnQgYXRfbGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtWR009JXVcciIsIHZvbHVtZSk7Ci0gIGlmIChhdF9sZW4gPCAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEFUIGNvbW1hbmQgRnJhbWluZyBlcnJvciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX1ZHTSwgYnVmLCBhdF9sZW4pOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9hdGQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgY2hhciogbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lbW9yeSkgewotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICBpbnQgYXRfbGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChudW1iZXJbMF0gIT0gJ1wwJykgewotICAgIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVEQlcztcciIsIG51bWJlcik7Ci0gIH0gZWxzZSB7Ci0gICAgYXRfbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFURD4ldTtcciIsIG1lbW9yeSk7Ci0gIH0KLQotICBpZiAoYXRfbGVuIDwgMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBlcnJvciBwcmVwYXJpbmcgQVREIGNvbW1hbmQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXRfbGVuID0gTUlOKChzaXplX3QpYXRfbGVuLCBzaXplb2YoYnVmKSk7Ci0KLSAgaWYgKGF0X2xlbiA8IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQVQgY29tbWFuZCBGcmFtaW5nIGVycm9yIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0FURCwgYnVmLCBhdF9sZW4pOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9ibGRuKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGJ1ZiA9ICJBVCtCTEROXHIiOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfQkxETiwgYnVmLCBzdHJsZW4oYnVmKSk7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2F0YSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIGNvbnN0IGNoYXIqIGJ1ZjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidWYgPSAiQVRBXHIiOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfQVRBLCBidWYsIHN0cmxlbihidWYpKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2h1cCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIGNvbnN0IGNoYXIqIGJ1ZjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidWYgPSAiQVQrQ0hVUFxyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0NIVVAsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idHJoKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbCkgewotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICBpbnQgYXRfbGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChxdWVyeSkgewotICAgIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtCVFJIP1xyIik7Ci0gIH0gZWxzZSB7Ci0gICAgYXRfbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFUK0JUUkg9JXVcciIsIHZhbCk7Ci0gIH0KLQotICBpZiAoYXRfbGVuIDwgMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBVCBjb21tYW5kIEZyYW1pbmcgZXJyb3IiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9CVFJILCBidWYsIGF0X2xlbik7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3Z0cyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyIGNvZGUpIHsKLSAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKLSAgaW50IGF0X2xlbjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBhdF9sZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQVQrVlRTPSVjXHIiLCBjb2RlKTsKLQotICBpZiAoYXRfbGVuIDwgMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBVCBjb21tYW5kIEZyYW1pbmcgZXJyb3IiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9WVFMsIGJ1ZiwgYXRfbGVuKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmNjKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGJ1ZiA9ICJBVCtCQ0NcciI7Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9CQ0MsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbnVtKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgY29uc3QgY2hhciogYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGJ1ZiA9ICJBVCtDTlVNXHIiOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfQ05VTSwgYnVmLCBzdHJsZW4oYnVmKSk7Ci19Ci0KLXZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X25yZWModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBjb25zdCBjaGFyKiBidWY7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKCEoY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0hGX0NMSUVOVF9QRUVSX0ZFQVRfRUNOUikpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogUmVtb3RlIGRvZXMgbm90IHN1cHBvcnQgTlJFQy4iLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnVmID0gIkFUK05SRUM9MFxyIjsKLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX05SRUMsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaW5wKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIHVpbnQzMl90IGFjdGlvbikgewotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotICBpbnQgYXRfbGVuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtCSU5QPSV1XHIiLCBhY3Rpb24pOwotCi0gIGlmIChhdF9sZW4gPCAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEFUIGNvbW1hbmQgRnJhbWluZyBlcnJvciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfaGZfY2xpZW50X3NlbmRfYXQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX0FUX0JJTlAsIGJ1ZiwgYXRfbGVuKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmlhKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKLSAgaW50IGF0X2xlbjsKLSAgaW50IGk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChjbGllbnRfY2ItPnBlZXJfdmVyc2lvbiA8IEhGUF9WRVJTSU9OXzFfNikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIlJlbW90ZSBkb2VzIG5vdCBTdXBwb3J0IEFUK0JJQSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF0X2xlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBVCtCSUE9Iik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9IRl9DTElFTlRfQVRfSU5ESUNBVE9SX0NPVU5UOyBpKyspIHsKLSAgICBpbnQgc3VwID0gY2xpZW50X2NiLT5hdF9jYi5pbmRpY2F0b3JfbG9va3VwW2ldID09IC0xID8gMCA6IDE7Ci0KLS8qIElmIHRoaXMgdmFsdWUgbWF0Y2hlcyB0aGUgcG9zaXRpb24gb2YgU0lHTkFMIGluIHRoZSBpbmRpY2F0b3JzIGFycmF5LAotICogdGhlbiBoYXJkY29kZSBkaXNhYmxlIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0b3JzLgotICogaW5kaWNhdG9yX2xvb2t1cFtpXSBwb2ludHMgdG8gdGhlIHBvc2l0aW9uIGluIHRoZSBidGFfaGZfY2xpZW50X2luZGljYXRvcnMKLSAqIGFycmF5IGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUgKi8KLSNpZmRlZiBCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9TSUdOQUxfUE9TCi0gICAgaWYgKGNsaWVudF9jYi0+YXRfY2IuaW5kaWNhdG9yX2xvb2t1cFtpXSA9PQotICAgICAgICBCVEFfSEZfQ0xJRU5UX0lORElDQVRPUl9TSUdOQUxfUE9TKSB7Ci0gICAgICBzdXAgPSAwOwotICAgIH0KLSNlbmRpZgotCi0gICAgYXRfbGVuICs9IHNucHJpbnRmKGJ1ZiArIGF0X2xlbiwgc2l6ZW9mKGJ1ZikgLSBhdF9sZW4sICIldSwiLCBzdXApOwotICB9Ci0KLSAgYnVmW2F0X2xlbiAtIDFdID0gJ1xyJzsKLQotICBpZiAoYXRfbGVuIDwgMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBVCBjb21tYW5kIEZyYW1pbmcgZXJyb3IiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVF9CSUEsIGJ1ZiwgYXRfbGVuKTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfdmVuZG9yX3NwZWNpZmljX2NtZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIpIHsKLSAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpbnQgYXRfbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFUJXMiLCBzdHIpOwotCi0gIGlmIChhdF9sZW4gPCAxKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEFUIGNvbW1hbmQgRnJhbWluZyBlcnJvciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidWZbYXRfbGVuIC0gMV0gPSAnXHInOwotCi0gIGJ0YV9oZl9jbGllbnRfc2VuZF9hdChjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVRfVkVORE9SX1NQRUNJRklDLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdF9sZW4pOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfYXRfaW5pdCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKSB7Ci0gIGFsYXJtX2ZyZWUoY2xpZW50X2NiLT5hdF9jYi5yZXNwX3RpbWVyKTsKLSAgYWxhcm1fZnJlZShjbGllbnRfY2ItPmF0X2NiLmhvbGRfdGltZXIpOwotICBtZW1zZXQoJihjbGllbnRfY2ItPmF0X2NiKSwgMCwgc2l6ZW9mKHRCVEFfSEZfQ0xJRU5UX0FUX0NCKSk7Ci0gIGNsaWVudF9jYi0+YXRfY2IucmVzcF90aW1lciA9IGFsYXJtX25ldygiYnRhX2hmX2NsaWVudC5zY2JfYXRfcmVzcF90aW1lciIpOwotICBjbGllbnRfY2ItPmF0X2NiLmhvbGRfdGltZXIgPSBhbGFybV9uZXcoImJ0YV9oZl9jbGllbnQuc2NiX2F0X2hvbGRfdGltZXIiKTsKLSAgYnRhX2hmX2NsaWVudF9hdF9yZXNldChjbGllbnRfY2IpOwotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfYXRfcmVzZXQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBpbnQgaTsKLQotICBidGFfaGZfY2xpZW50X3N0b3BfYXRfcmVzcF90aW1lcihjbGllbnRfY2IpOwotICBidGFfaGZfY2xpZW50X3N0b3BfYXRfaG9sZF90aW1lcihjbGllbnRfY2IpOwotCi0gIGJ0YV9oZl9jbGllbnRfY2xlYXJfcXVldWVkX2F0KGNsaWVudF9jYik7Ci0KLSAgYnRhX2hmX2NsaWVudF9hdF9jbGVhcl9idWYoY2xpZW50X2NiKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0hGX0NMSUVOVF9BVF9JTkRJQ0FUT1JfQ09VTlQ7IGkrKykgewotICAgIGNsaWVudF9jYi0+YXRfY2IuaW5kaWNhdG9yX2xvb2t1cFtpXSA9IC0xOwotICB9Ci0KLSAgY2xpZW50X2NiLT5hdF9jYi5jdXJyZW50X2NtZCA9IEJUQV9IRl9DTElFTlRfQVRfTk9ORTsKLX0KLQotdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21kKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0KLSAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9oYW5kbGUocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICBpZiAoIWNsaWVudF9jYikgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVEFfSEZfQ0xJRU5UX0RBVEFfVkFMKiBwX3ZhbCA9ICh0QlRBX0hGX0NMSUVOVF9EQVRBX1ZBTCopcF9kYXRhOwotICBjaGFyIGJ1ZltCVEFfSEZfQ0xJRU5UX0FUX01BWF9MRU5dOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBhdCBjbWQ6ICVkIiwgX19mdW5jX18sIHBfdmFsLT51aW50OF92YWwpOwotICBzd2l0Y2ggKHBfdmFsLT51aW50OF92YWwpIHsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX1ZUUzoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92dHMoY2xpZW50X2NiLCAoY2hhcilwX3ZhbC0+dWludDMyX3ZhbDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CVFJIOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2J0cmgoY2xpZW50X2NiLCBmYWxzZSwgcF92YWwtPnVpbnQzMl92YWwxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hVUDoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaHVwKGNsaWVudF9jYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX0NITEQ6Ci0gICAgICAvKiBleHBlY3RzIGFzY2lpIGNvZGUgZm9yIGNvbW1hbmQgKi8KLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaGxkKGNsaWVudF9jYiwgJzAnICsgcF92YWwtPnVpbnQzMl92YWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF92YWwtPnVpbnQzMl92YWwyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTURfQklFVjoKLSAgICAgIC8qIGV4cGVjdHMgYXNjaWkgY29kZSBmb3IgY29tbWFuZCAqLwotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpZXYoY2xpZW50X2NiLCBwX3ZhbC0+dWludDMyX3ZhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbC0+dWludDMyX3ZhbDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CQ0M6Ci0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmNjKGNsaWVudF9jYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX0NOVU06Ci0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY251bShjbGllbnRfY2IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9BVEE6Ci0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYXRhKGNsaWVudF9jYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX0NPUFM6Ci0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY29wcyhjbGllbnRfY2IsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9BVEQ6Ci0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYXRkKGNsaWVudF9jYiwgcF92YWwtPnN0ciwgcF92YWwtPnVpbnQzMl92YWwxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTURfVkdNOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3ZnbShjbGllbnRfY2IsIHBfdmFsLT51aW50MzJfdmFsMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX1ZHUzoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF92Z3MoY2xpZW50X2NiLCBwX3ZhbC0+dWludDMyX3ZhbDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CVlJBOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2J2cmEoY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF92YWwtPnVpbnQzMl92YWwxID09IDAgPyBmYWxzZSA6IHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DTENDOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsY2MoY2xpZW50X2NiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTURfQklOUDoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaW5wKGNsaWVudF9jYiwgcF92YWwtPnVpbnQzMl92YWwxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTURfQkxETjoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9ibGRuKGNsaWVudF9jYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ01EX05SRUM6Ci0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfbnJlYyhjbGllbnRfY2IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9WRU5ET1JfU1BFQ0lGSUNfQ01EOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3ZlbmRvcl9zcGVjaWZpY19jbWQoY2xpZW50X2NiLCBwX3ZhbC0+c3RyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCJEZWZhdWx0IGNhc2UiKTsKLSAgICAgIHNucHJpbnRmKGJ1ZiwgQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOLAotICAgICAgICAgICAgICAgIkNtZCAlZCAxc3QgYXJnICV1IDJuZCBhcmcgJXUgc3RyaW5nIGFyZyAlcyIsIHBfdmFsLT51aW50OF92YWwsCi0gICAgICAgICAgICAgICBwX3ZhbC0+dWludDMyX3ZhbDEsIHBfdmFsLT51aW50MzJfdmFsMiwgcF92YWwtPnN0cik7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQVQgYnVmZmVyOiAlcyAiLCBfX2Z1bmNfXywgYnVmKTsKLSAgICAgIGJyZWFrOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuaCBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWEwZDBiLi4wMDAwMDAwCi0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBEYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLQotLyogQVNDSUkgY2hhcmFjdGVyIHN0cmluZyBvZiBhcmd1bWVudHMgdG8gdGhlIEFUIGNvbW1hbmQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOIDUxMgotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9IRl9DTElFTlRfQVRfQ01EOwotCi0vKiBNYXhpbXVtIGNvbWJpbmVkIGJ1ZmZlciBmb3IgcmVjZWl2ZWQgQVQgZXZlbnRzIHN0cmluZyAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1BBUlNFUl9NQVhfTEVOIDQwOTYKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgcHJlcGFyZWQgQVQgY29tbWFuZCBxdWV1ZWQgZm9yIHNlbmRpbmcgKi8KLXN0cnVjdCBxdWV1ZWRfYXRfY21kIHsKLSAgdEJUQV9IRl9DTElFTlRfQVRfQ01EIGNtZDsKLSAgY2hhciBidWZbQlRBX0hGX0NMSUVOVF9BVF9NQVhfTEVOXTsKLSAgdWludDE2X3QgYnVmX2xlbjsKLSAgc3RydWN0IHF1ZXVlZF9hdF9jbWQqIG5leHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcXVldWVkX2F0X2NtZCB0QlRBX0hGX0NMSUVOVF9BVF9RQ01EOwotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBpbmRpY2F0b3JzICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfSU5ESUNBVE9SX0NPVU5UIDIwCi0KLS8qIEFUIGNvbW1hbmQgcGFyc2luZyBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgYnVmW0JUQV9IRl9DTElFTlRfQVRfUEFSU0VSX01BWF9MRU4gKwotICAgICAgICAgICAxXTsgLyogZXh0cmEgYnl0ZSB0byBhbHdheXMgaGF2ZSBcMCBhdCB0aGUgZW5kICovCi0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRCBjdXJyZW50X2NtZDsKLSAgdEJUQV9IRl9DTElFTlRfQVRfUUNNRCogcXVldWVkX2NtZDsKLSAgYWxhcm1fdCogcmVzcF90aW1lcjsgLyogQVQgcmVzcG9uc2UgdGltZXIgKi8KLSAgYWxhcm1fdCogaG9sZF90aW1lcjsgLyogQVQgaG9sZCB0aW1lciAqLwotCi0gIC8qIENJTkQ6IGxvb2t1cCB0YWJsZSB0byBzdG9yZSB0aGUgc2VxdWVuY2Ugb2YgaW5jb21pbmcgaW5kaWNhdG9ycyBhbmQgdGhlaXIKLSAgICAgdmFsdWVzCi0gICAgIHNvIHdoZW4gdGhlaXIgdmFsdWVzIGNvbWUgbGF0ZXIsIHdlIGtub3cgd2hpY2ggdmFsdWUgaW4gc2VxdWVuY2UgbWF0Y2gKLSAgICAgY2VydGFpbiBpbmRpY2F0b3IgKi8KLSAgaW50IGluZGljYXRvcl9sb29rdXBbQlRBX0hGX0NMSUVOVF9BVF9JTkRJQ0FUT1JfQ09VTlRdOwotCi19IHRCVEFfSEZfQ0xJRU5UX0FUX0NCOwpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzEzZTZjLi4wMDAwMDAwCi0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJidGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUkZDT01NIE1UVSBTSVpFICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfTVRVIDI1NgotCi0vKiBwcm9maWxlIHJvbGUgZm9yIGNvbm5lY3Rpb24gKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BQ1AgMCAvKiBhY2NlcHRlZCBjb25uZWN0aW9uICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5UIDEgLyogaW5pdGlhdGluZyBjb25uZWN0aW9uICovCi0KLS8qIFRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBmb3IgcmV0cnkgaW4gY2FzZSBvZiBjb2xsaXNpb24gKi8KLSNpZm5kZWYgQlRBX0hGX0NMSUVOVF9DT0xMSVNJT05fVElNRVJfTVMKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DT0xMSVNJT05fVElNRVJfTVMgMjQxMQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIEhGIGRldmljZXMgc3VwcG9ydGVkIHNpbXVsdGFuZW91c2x5ICovCi0jZGVmaW5lIEhGX0NMSUVOVF9NQVhfREVWSUNFUyAxMAotCi1lbnVtIHsKLSAgLyogdGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lICovCi0gIEJUQV9IRl9DTElFTlRfQVBJX09QRU5fRVZUID0gQlRBX1NZU19FVlRfU1RBUlQoQlRBX0lEX0hTKSwKLSAgQlRBX0hGX0NMSUVOVF9BUElfQ0xPU0VfRVZULAotICBCVEFfSEZfQ0xJRU5UX0FQSV9BVURJT19PUEVOX0VWVCwKLSAgQlRBX0hGX0NMSUVOVF9BUElfQVVESU9fQ0xPU0VfRVZULAotICBCVEFfSEZfQ0xJRU5UX1JGQ19PUEVOX0VWVCwKLSAgQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0VfRVZULAotICBCVEFfSEZfQ0xJRU5UX1JGQ19TUlZfQ0xPU0VfRVZULAotICBCVEFfSEZfQ0xJRU5UX1JGQ19EQVRBX0VWVCwKLSAgQlRBX0hGX0NMSUVOVF9ESVNDX0FDUF9SRVNfRVZULAotICBCVEFfSEZfQ0xJRU5UX0RJU0NfSU5UX1JFU19FVlQsCi0gIEJUQV9IRl9DTElFTlRfRElTQ19PS19FVlQsCi0gIEJUQV9IRl9DTElFTlRfRElTQ19GQUlMX0VWVCwKLSAgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9FVlQsCi0gIEJUQV9IRl9DTElFTlRfU0NPX0NMT1NFX0VWVCwKLSAgQlRBX0hGX0NMSUVOVF9TRU5EX0FUX0NNRF9FVlQsCi0gIEJUQV9IRl9DTElFTlRfTUFYX0VWVCwKLQotICAvKiB0aGVzZSBldmVudHMgYXJlIGhhbmRsZWQgb3V0c2lkZSBvZiB0aGUgc3RhdGUgbWFjaGluZSAqLwotICBCVEFfSEZfQ0xJRU5UX0FQSV9FTkFCTEVfRVZULAotICBCVEFfSEZfQ0xJRU5UX0FQSV9ESVNBQkxFX0VWVAotfTsKLQotLyogQVQgQ29tbWFuZCBlbnVtICovCi1lbnVtIHsKLSAgQlRBX0hGX0NMSUVOVF9BVF9OT05FLAotICBCVEFfSEZfQ0xJRU5UX0FUX0JSU0YsCi0gIEJUQV9IRl9DTElFTlRfQVRfQkFDLAotICBCVEFfSEZfQ0xJRU5UX0FUX0NJTkQsCi0gIEJUQV9IRl9DTElFTlRfQVRfQ0lORF9TVEFUVVMsCi0gIEJUQV9IRl9DTElFTlRfQVRfQ01FUiwKLSAgQlRBX0hGX0NMSUVOVF9BVF9DSExELAotICBCVEFfSEZfQ0xJRU5UX0FUX0NNRUUsCi0gIEJUQV9IRl9DTElFTlRfQVRfQklBLAotICBCVEFfSEZfQ0xJRU5UX0FUX0NMSVAsCi0gIEJUQV9IRl9DTElFTlRfQVRfQ0NXQSwKLSAgQlRBX0hGX0NMSUVOVF9BVF9DT1BTLAotICBCVEFfSEZfQ0xJRU5UX0FUX0NMQ0MsCi0gIEJUQV9IRl9DTElFTlRfQVRfQlZSQSwKLSAgQlRBX0hGX0NMSUVOVF9BVF9WR1MsCi0gIEJUQV9IRl9DTElFTlRfQVRfVkdNLAotICBCVEFfSEZfQ0xJRU5UX0FUX0FURCwKLSAgQlRBX0hGX0NMSUVOVF9BVF9CTEROLAotICBCVEFfSEZfQ0xJRU5UX0FUX0FUQSwKLSAgQlRBX0hGX0NMSUVOVF9BVF9DSFVQLAotICBCVEFfSEZfQ0xJRU5UX0FUX0JUUkgsCi0gIEJUQV9IRl9DTElFTlRfQVRfVlRTLAotICBCVEFfSEZfQ0xJRU5UX0FUX0JDQywKLSAgQlRBX0hGX0NMSUVOVF9BVF9CQ1MsCi0gIEJUQV9IRl9DTElFTlRfQVRfQ05VTSwKLSAgQlRBX0hGX0NMSUVOVF9BVF9OUkVDLAotICBCVEFfSEZfQ0xJRU5UX0FUX0JJTlAsCi0gIEJUQV9IRl9DTElFTlRfQVRfQklORF9TRVRfSU5ELAotICBCVEFfSEZfQ0xJRU5UX0FUX0JJTkRfUkVBRF9TVVBQT1JURURfSU5ELAotICBCVEFfSEZfQ0xJRU5UX0FUX0JJTkRfUkVBRF9FTkFCTEVEX0lORCwKLSAgQlRBX0hGX0NMSUVOVF9BVF9CSUVWLAotICBCVEFfSEZfQ0xJRU5UX0FUX1ZFTkRPUl9TUEVDSUZJQywKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGF0YSB0eXBlIGZvciBCVEFfSEZfQ0xJRU5UX0FQSV9PUEVOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQxNl90KiBoYW5kbGU7Ci19IHRCVEFfSEZfQ0xJRU5UX0FQSV9PUEVOOwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9IRl9DTElFTlRfRElTQ19SRVNVTFRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHVpbnQxNl90IHN0YXR1czsKLX0gdEJUQV9IRl9DTElFTlRfRElTQ19SRVNVTFQ7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgUkZDT01NIGV2ZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50MTZfdCBwb3J0X2hhbmRsZTsKLX0gdEJUQV9IRl9DTElFTlRfUkZDOwotCi0vKiBnZW5lcmljIHB1cnBvc2UgZGF0YSB0eXBlIGZvciBvdGhlciBldmVudHMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgYm9vbCBib29sX3ZhbDsKLSAgdWludDhfdCB1aW50OF92YWw7Ci0gIHVpbnQzMl90IHVpbnQzMl92YWwxOwotICB1aW50MzJfdCB1aW50MzJfdmFsMjsKLSAgY2hhciBzdHJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOICsgMV07Ci19IHRCVEFfSEZfQ0xJRU5UX0RBVEFfVkFMOwotCi0vKiB1bmlvbiBvZiBhbGwgZXZlbnQgZGF0YXR5cGVzICovCi10eXBlZGVmIHVuaW9uIHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdEJUQV9IRl9DTElFTlRfQVBJX09QRU4gYXBpX29wZW47Ci0gIHRCVEFfSEZfQ0xJRU5UX0RJU0NfUkVTVUxUIGRpc2NfcmVzdWx0OwotICB0QlRBX0hGX0NMSUVOVF9SRkMgcmZjOwotICB0QlRBX0hGX0NMSUVOVF9EQVRBX1ZBTCB2YWw7Ci0KLX0gdEJUQV9IRl9DTElFTlRfREFUQTsKLQotLyogRmlyc3QgaGFuZGxlIGZvciB0aGUgY29udHJvbCBibG9jayAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0NCX0ZJUlNUX0hBTkRMRSAxCi0KLS8qIHNjbyBzdGF0ZXMgKi8KLWVudW0gewotICBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9TVCwgLyogbm8gbGlzdGVuaW5nLCBubyBjb25uZWN0aW9uICovCi0gIEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVCwgICAvKiBsaXN0ZW5pbmcgKi8KLSAgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTklOR19TVCwgIC8qIGNvbm5lY3Rpb24gb3BlbmluZyAqLwotICBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX0NMX1NULCAgLyogb3BlbmluZyBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCAqLwotICBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX1NULCAgICAgLyogb3BlbiAqLwotICBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TSU5HX1NULCAgLyogY2xvc2luZyAqLwotICBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TRV9PUF9TVCwgLyogY2xvc2luZyBzY28gYmVpbmcgb3BlbmVkICovCi0gIEJUQV9IRl9DTElFTlRfU0NPX1NIVVRUSU5HX1NUICAvKiBzY28gc2h1dHRpbmcgZG93biAqLwotfTsKLQotLyogdHlwZSBmb3IgSEYgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBGaWVsZHMgdXNlZnVsIGZvciBwYXJ0aWN1bGFyIGNvbnRyb2wgYmxvY2suCi0gIHVpbnQ4X3QgaGFuZGxlOyAgICAgICAgICAgICAgIC8qIEhhbmRsZSBvZiB0aGUgY29udHJvbCBibG9jayB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHVwcGVyIGxheWVyICovCi0gIFJhd0FkZHJlc3MgcGVlcl9hZGRyOyAgICAgICAgIC8qIHBlZXIgYmQgYWRkcmVzcyAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kaXNjX2RiOyAvKiBwb2ludGVyIHRvIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotICB1aW50MTZfdCBjb25uX2hhbmRsZTsgICAgICAgICAvKiBSRkNPTU0gaGFuZGxlIG9mIGNvbm5lY3RlZCBzZXJ2aWNlICovCi0gIHRCVEFfSEZfQ0xJRU5UX1BFRVJfRkVBVCBwZWVyX2ZlYXR1cmVzOyAvKiBwZWVyIGRldmljZSBmZWF0dXJlcyAqLwotICB0QlRBX0hGX0NMSUVOVF9DSExEX0ZFQVQgY2hsZF9mZWF0dXJlczsgLyogY2FsbCBoYW5kbGluZyBmZWF0dXJlcyAqLwotICB1aW50MTZfdCBwZWVyX3ZlcnNpb247ICAgICAgICAgICAgICAgICAgLyogcHJvZmlsZSB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCi0gIHVpbnQ4X3QgcGVlcl9zY247ICAgICAgICAgICAgICAgICAgICAgICAvKiBwZWVyIHNjbiAqLwotICB1aW50OF90IHJvbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhdG9yL2FjY2VwdG9yIHJvbGUgKi8KLSAgdWludDE2X3Qgc2NvX2lkeDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDTyBoYW5kbGUgKi8KLSAgdWludDhfdCBzY29fc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNDTyBzdGF0ZSB2YXJpYWJsZSAqLwotICBib29sIHNjb19jbG9zZV9yZmM7IC8qIHRydWUgaWYgYWxzbyBjbG9zZSBSRkNPTU0gYWZ0ZXIgU0NPICovCi0gIHRCVE1fU0NPX0NPREVDX1RZUEUgbmVnb3RpYXRlZF9jb2RlYzsgLyogbmVnb3RpYXRlZCBjb2RlYyAqLwotICBib29sIHN2Y19jb25uOyAgICAgIC8qIHNldCB0byB0cnVlIHdoZW4gc2VydmljZSBsZXZlbCBjb25uZWN0aW9uIGlzIHVwICovCi0gIGJvb2wgc2VuZF9hdF9yZXBseTsgLyogc2V0IHRvIHRydWUgdG8gbm90aWZ5IGZyYW1ld29yayBhYm91dCBBVCByZXN1bHRzICovCi0gIHRCVEFfSEZfQ0xJRU5UX0FUX0NCIGF0X2NiOyAvKiBBVCBQYXJzZXIgY29udHJvbCBibG9jayAqLwotICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgICAgLyogc3RhdGUgbWFjaGluZSBzdGF0ZSAqLwotICBib29sIGlzX2FsbG9jYXRlZDsgICAgICAgICAgLyogaWYgdGhlIGNvbnRyb2wgYmxvY2sgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLSAgYWxhcm1fdCogY29sbGlzaW9uX3RpbWVyOyAgIC8qIENvbGxpc2lvbiB0aW1lciAqLwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50PgotICAgICAgcGVlcl9oZl9pbmRpY2F0b3JzOyAvKiBwZWVyIHN1cHBvcnRlZCBoZiBpbmRpY2F0b3IgaW5kaWNlcyAoSEZQMS43KSAqLwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50PgotICAgICAgZW5hYmxlZF9oZl9pbmRpY2F0b3JzOyAvKiBlbmFibGVkIGhmIGluZGljYXRvciBpbmRpY2VzIChIRlAxLjcpICovCi19IHRCVEFfSEZfQ0xJRU5UX0NCOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8vIENvbW1vbiBmaWVsZHMsIHNob3VsZCBiZSB0YWtlbiBvdXQuCi0gIHVpbnQzMl90IHNkcF9oYW5kbGU7Ci0gIHVpbnQ4X3Qgc2NuOwotICB0QlRBX0hGX0NMSUVOVF9DQkFDSyogcF9jYmFjazsgLyogYXBwbGljYXRpb24gY2FsbGJhY2sgKi8KLSAgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlczsgIC8qIGZlYXR1cmVzIHJlZ2lzdGVyZWQgYnkgYXBwbGljYXRpb24gKi8KLSAgdWludDE2X3Qgc2Vydl9oYW5kbGU7ICAgICAgICAgIC8qIFJGQ09NTSBzZXJ2ZXIgaGFuZGxlICovCi0gIGJvb2wgZGVyZWdpc3RlcjsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHNlcnZpY2Ugc2h1dHRpbmcgZG93biAqLwotCi0gIC8vIE1heGltdW0gbnVtYmVyIG9mIGNvbnRyb2wgYmxvY2tzIHN1cHBvcnRlZCBieSB0aGUgQlRBIGxheWVyLgotICB0QlRBX0hGX0NMSUVOVF9DQiBjYltIRl9DTElFTlRfTUFYX0RFVklDRVNdOwotfSB0QlRBX0hGX0NMSUVOVF9DQl9BUlI7Ci0KLWV4dGVybiB0QlRBX0hGX0NMSUVOVF9DQl9BUlIgYnRhX2hmX2NsaWVudF9jYl9hcnI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBtYWluIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHRCVEFfSEZfQ0xJRU5UX0NCKiBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gdEJUQV9IRl9DTElFTlRfQ0IqIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9iZGEoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gdEJUQV9IRl9DTElFTlRfQ0IqIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9yZmNfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gdEJUQV9IRl9DTElFTlRfQ0IqIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9zY29faGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gYm9vbCBidGFfaGZfY2xpZW50X2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZSh1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zbGNfc2VxKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgZXJyb3IpOwotZXh0ZXJuIGJvb2wgYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2hhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2FwcF9jYWxsYmFjayh1aW50MTZfdCBldmVudCwgdEJUQV9IRl9DTElFTlQqIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jb2xsaXNpb25fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9yZXN1bWVfb3Blbih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLWV4dGVybiB0QlRBX1NUQVRVUyBidGFfaGZfY2xpZW50X2FwaV9lbmFibGUodEJUQV9IRl9DTElFTlRfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0ZFQVQgZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9hcGlfZGlzYWJsZSh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfZHVtcF9zdGF0aXN0aWNzKGludCBmZCk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NiX2Fycl9pbml0KHZvaWQpOwotCi0vKiBTRFAgZnVuY3Rpb25zICovCi1leHRlcm4gYm9vbCBidGFfaGZfY2xpZW50X2FkZF9yZWNvcmQoY2hhciogcF9zZXJ2aWNlX25hbWUsIHVpbnQ4X3Qgc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0ZFQVQgZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2RwX2hhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NyZWF0ZV9yZWNvcmQodEJUQV9IRl9DTElFTlRfQ0JfQVJSKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfZGVsX3JlY29yZCh0QlRBX0hGX0NMSUVOVF9DQl9BUlIqIGNsaWVudF9jYik7Ci1leHRlcm4gYm9vbCBidGFfaGZfY2xpZW50X3NkcF9maW5kX2F0dHIodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2RvX2Rpc2ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2ZyZWVfZGIodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLQotLyogUkZDT01NIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZXR1cF9wb3J0KHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3N0YXJ0X3NlcnZlcigpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jbG9zZV9zZXJ2ZXIoKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2RvX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2RvX2Nsb3NlKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIFNDTyBmdW5jdGlvbnMgKi8KLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2xpc3Rlbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fY29ubl9vcGVuKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3Njb19jb25uX2Nsb3NlKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3Njb19vcGVuKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3Njb19jbG9zZSh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fc2h1dGRvd24odEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NiYWNrX3Njbyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBldmVudCk7Ci0KLS8qIEFUIGNvbW1hbmQgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2F0X3BhcnNlKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGNoYXIqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnJzZih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlcyk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmFjKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NpbmQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbWVyKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2YXRlKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaGxkKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGNoYXIgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWR4KTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaW5kKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGludCBzdGVwKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaWV2KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGludCBpbmRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsaXAodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZhdGUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Njd2EodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZhdGUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NtZWUodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZhdGUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NvcHModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcXVlcnkpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsY2ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYnZyYSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3Zncyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2b2x1bWUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3ZnbSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2b2x1bWUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2F0ZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBudW1iZXIsIHVpbnQzMl90IG1lbW9yeSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmxkbih0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9hdGEodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2h1cCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9idHJoKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGJvb2wgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X3Z0cyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyIGNvZGUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JjYyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iY3ModEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZWMpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NudW0odEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfbnJlYyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9iaW5wKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3Rpb24pOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpYSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiKTsKLQotLyogQVQgQVBJIEZ1bmN0aW9ucyAqLwotdm9pZCBidGFfaGZfY2xpZW50X2F0X2luaXQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci12b2lkIGJ0YV9oZl9jbGllbnRfYXRfcmVzZXQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2luZCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfSU5EX1RZUEUgdHlwZSwgdWludDE2X3QgdmFsdWUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9ldnRfdmFsKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfRVZUIHR5cGUsIHVpbnQxNl90IHZhbHVlKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfb3BlcmF0b3JfbmFtZSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NsaXAodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgY2hhciogbnVtYmVyKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfY2N3YSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBjaGFyKiBudW1iZXIpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9hdF9yZXN1bHQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9UWVBFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbWUpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9jbGNjKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIHVpbnQzMl90IGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY29taW5nLCB1aW50OF90IHN0YXR1cywgYm9vbCBtcHR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG51bWJlcik7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2NudW0odEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwgY2hhciogbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2UpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9iaW5wKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIGNoYXIqIG51bWJlcik7Ci0KLS8qIEFjdGlvbiBmdW5jdGlvbnMgKi8KLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc3RhcnRfY2xvc2UodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfc3RhcnRfb3Blbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9yZmNfYWNwX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2ZhaWwodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfZGlzY19mYWlsKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X29wZW5fZmFpbCh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9yZmNfY2xvc2UodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oZl9jbGllbnRfZGlzY19hY3BfcmVzKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3JmY19kYXRhKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X2Rpc2NfaW50X3Jlcyh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9zdmNfY29ubl9vcGVuKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIENvbW1hbmRzIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2hmX2NsaWVudF9kaWFsKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21kKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSk7CmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfbWFpbi5jYyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFlMzI0Li4wMDAwMDAwCi0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotCi0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL3V0bC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9oZl9jbGllbnRfZXZ0X3N0cih1aW50MTZfdCBldmVudCk7Ci1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hmX2NsaWVudF9zdGF0ZV9zdHIodWludDhfdCBzdGF0ZSk7Ci12b2lkIGJ0YV9oZl9jbGllbnRfY2JfaW5pdCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCB1aW50MTZfdCBoYW5kbGUpOwotCi0vKiBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSB7Ci0gIEJUQV9IRl9DTElFTlRfSU5JVF9TVCwKLSAgQlRBX0hGX0NMSUVOVF9PUEVOSU5HX1NULAotICBCVEFfSEZfQ0xJRU5UX09QRU5fU1QsCi0gIEJUQV9IRl9DTElFTlRfQ0xPU0lOR19TVAotfTsKLQotLyogc3RhdGUgbWFjaGluZSBhY3Rpb24gZW51bWVyYXRpb24gbGlzdCAqLwotZW51bSB7Ci0gIEJUQV9IRl9DTElFTlRfUkZDX0RPX0NMT1NFLAotICBCVEFfSEZfQ0xJRU5UX1NUQVJUX0NMT1NFLAotICBCVEFfSEZfQ0xJRU5UX1NUQVJUX09QRU4sCi0gIEJUQV9IRl9DTElFTlRfUkZDX0FDUF9PUEVOLAotICBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU4sCi0gIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fT1BFTiwKLSAgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRSwKLSAgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTiwKLSAgQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0UsCi0gIEJUQV9IRl9DTElFTlRfRlJFRV9EQiwKLSAgQlRBX0hGX0NMSUVOVF9PUEVOX0ZBSUwsCi0gIEJUQV9IRl9DTElFTlRfUkZDX09QRU4sCi0gIEJUQV9IRl9DTElFTlRfUkZDX0ZBSUwsCi0gIEJUQV9IRl9DTElFTlRfRElTQ19JTlRfUkVTLAotICBCVEFfSEZfQ0xJRU5UX1JGQ19ET19PUEVOLAotICBCVEFfSEZfQ0xJRU5UX0RJU0NfRkFJTCwKLSAgQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0UsCi0gIEJUQV9IRl9DTElFTlRfUkZDX0RBVEEsCi0gIEJUQV9IRl9DTElFTlRfRElTQ19BQ1BfUkVTLAotICBCVEFfSEZfQ0xJRU5UX1NWQ19DT05OX09QRU4sCi0gIEJUQV9IRl9DTElFTlRfU0VORF9BVF9DTUQsCi0gIEJUQV9IRl9DTElFTlRfTlVNX0FDVElPTlMsCi19OwotCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSUdOT1JFIEJUQV9IRl9DTElFTlRfTlVNX0FDVElPTlMKLQotLyogdHlwZSBmb3IgYWN0aW9uIGZ1bmN0aW9ucyAqLwotdHlwZWRlZiB2b2lkICgqdEJUQV9IRl9DTElFTlRfQUNUSU9OKSh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpOwotCi0vKiBhY3Rpb24gZnVuY3Rpb25zIHRhYmxlLCBpbmRleGVkIHdpdGggYWN0aW9uIGVudW0gKi8KLWNvbnN0IHRCVEFfSEZfQ0xJRU5UX0FDVElPTiBidGFfaGZfY2xpZW50X2FjdGlvbltdID0gewotICAgIC8qIEJUQV9IRl9DTElFTlRfUkZDX0RPX0NMT1NFICovIGJ0YV9oZl9jbGllbnRfcmZjX2RvX2Nsb3NlLAotICAgIC8qIEJUQV9IRl9DTElFTlRfU1RBUlRfQ0xPU0UgKi8gYnRhX2hmX2NsaWVudF9zdGFydF9jbG9zZSwKLSAgICAvKiBCVEFfSEZfQ0xJRU5UX1NUQVJUX09QRU4gKi8gYnRhX2hmX2NsaWVudF9zdGFydF9vcGVuLAotICAgIC8qIEJUQV9IRl9DTElFTlRfUkZDX0FDUF9PUEVOICovIGJ0YV9oZl9jbGllbnRfcmZjX2FjcF9vcGVuLAotICAgIC8qIEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTiAqLyBOVUxMLAotICAgIC8qIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fT1BFTiAqLyBidGFfaGZfY2xpZW50X3Njb19jb25uX29wZW4sCi0gICAgLyogQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRSovIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5fY2xvc2UsCi0gICAgLyogQlRBX0hGX0NMSUVOVF9TQ09fT1BFTiAqLyBidGFfaGZfY2xpZW50X3Njb19vcGVuLAotICAgIC8qIEJUQV9IRl9DTElFTlRfU0NPX0NMT1NFICovIGJ0YV9oZl9jbGllbnRfc2NvX2Nsb3NlLAotICAgIC8qIEJUQV9IRl9DTElFTlRfRlJFRV9EQiAqLyBidGFfaGZfY2xpZW50X2ZyZWVfZGIsCi0gICAgLyogQlRBX0hGX0NMSUVOVF9PUEVOX0ZBSUwgKi8gYnRhX2hmX2NsaWVudF9vcGVuX2ZhaWwsCi0gICAgLyogQlRBX0hGX0NMSUVOVF9SRkNfT1BFTiAqLyBidGFfaGZfY2xpZW50X3JmY19vcGVuLAotICAgIC8qIEJUQV9IRl9DTElFTlRfUkZDX0ZBSUwgKi8gYnRhX2hmX2NsaWVudF9yZmNfZmFpbCwKLSAgICAvKiBCVEFfSEZfQ0xJRU5UX0RJU0NfSU5UX1JFUyAqLyBidGFfaGZfY2xpZW50X2Rpc2NfaW50X3JlcywKLSAgICAvKiBCVEFfSEZfQ0xJRU5UX1JGQ19ET19PUEVOICovIGJ0YV9oZl9jbGllbnRfcmZjX2RvX29wZW4sCi0gICAgLyogQlRBX0hGX0NMSUVOVF9ESVNDX0ZBSUwgKi8gYnRhX2hmX2NsaWVudF9kaXNjX2ZhaWwsCi0gICAgLyogQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0UgKi8gYnRhX2hmX2NsaWVudF9yZmNfY2xvc2UsCi0gICAgLyogQlRBX0hGX0NMSUVOVF9SRkNfREFUQSAqLyBidGFfaGZfY2xpZW50X3JmY19kYXRhLAotICAgIC8qIEJUQV9IRl9DTElFTlRfRElTQ19BQ1BfUkVTICovIGJ0YV9oZl9jbGllbnRfZGlzY19hY3BfcmVzLAotICAgIC8qIEJUQV9IRl9DTElFTlRfU1ZDX0NPTk5fT1BFTiAqLyBidGFfaGZfY2xpZW50X3N2Y19jb25uX29wZW4sCi0gICAgLyogQlRBX0hGX0NMSUVOVF9TRU5EX0FUX0NNRCAqLyBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21kLAotfTsKLQotLyogc3RhdGUgdGFibGUgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BQ1RJT05TIDIgICAgLyogbnVtYmVyIG9mIGFjdGlvbnMgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9ORVhUX1NUQVRFIDIgLyogcG9zaXRpb24gb2YgbmV4dCBzdGF0ZSAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX05VTV9DT0xTIDMgICAvKiBudW1iZXIgb2YgY29sdW1ucyBpbiBzdGF0ZSB0YWJsZXMgKi8KLQotLyogc3RhdGUgdGFibGUgZm9yIGluaXQgc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYnRhX2hmX2NsaWVudF9zdF9pbml0W11bQlRBX0hGX0NMSUVOVF9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMgotICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBBUElfT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfU1RBUlRfT1BFTiwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LAotICAgIC8qIEFQSV9BVURJT19PUEVOX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9JTklUX1NUfSwKLSAgICAvKiBBUElfQVVESU9fQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9JTklUX1NUfSwKLSAgICAvKiBSRkNfT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfUkZDX0FDUF9PUEVOLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTl9TVH0sCi0gICAgLyogUkZDX0NMT1NFX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfSU5JVF9TVH0sCi0gICAgLyogUkZDX1NSVl9DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9JTklUX1NUfSwKLSAgICAvKiBSRkNfREFUQV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfSU5JVF9TVH0sCi0gICAgLyogRElTQ19BQ1BfUkVTX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9GUkVFX0RCLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LAotICAgIC8qIERJU0NfSU5UX1JFU19FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LAotICAgIC8qIERJU0NfT0tfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfSU5JVF9TVH0sCi0gICAgLyogRElTQ19GQUlMX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfSU5JVF9TVH0sCi0gICAgLyogU0NPX09QRU5fRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LAotICAgIC8qIFNDT19DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LAotICAgIC8qIFNFTkRfQVRfQ01EX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9JTklUX1NUfSwKLX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciBvcGVuaW5nIHN0YXRlICovCi1jb25zdCB1aW50OF90IGJ0YV9oZl9jbGllbnRfc3Rfb3BlbmluZ1tdW0JUQV9IRl9DTElFTlRfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIKLSAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogQVBJX09QRU5fRVZUICovIHtCVEFfSEZfQ0xJRU5UX09QRU5fRkFJTCwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfUkZDX0RPX0NMT1NFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9BVURJT19PUEVOX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfQVVESU9fQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOSU5HX1NUfSwKLSAgICAvKiBSRkNfT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfUkZDX09QRU4sIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBSRkNfQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX1JGQ19GQUlMLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0lOSVRfU1R9LAotICAgIC8qIFJGQ19TUlZfQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTklOR19TVH0sCi0gICAgLyogUkZDX0RBVEFfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LAotICAgIC8qIERJU0NfQUNQX1JFU19FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LAotICAgIC8qIERJU0NfSU5UX1JFU19FVlQgKi8ge0JUQV9IRl9DTElFTlRfRElTQ19JTlRfUkVTLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LAotICAgIC8qIERJU0NfT0tfRVZUICovIHtCVEFfSEZfQ0xJRU5UX1JGQ19ET19PUEVOLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOSU5HX1NUfSwKLSAgICAvKiBESVNDX0ZBSUxfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0RJU0NfRkFJTCwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9JTklUX1NUfSwKLSAgICAvKiBTQ09fT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTklOR19TVH0sCi0gICAgLyogU0NPX0NMT1NFX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTklOR19TVH0sCi0gICAgLyogU0VORF9BVF9DTURfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1R9LAotfTsKLQotLyogc3RhdGUgdGFibGUgZm9yIG9wZW4gc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYnRhX2hmX2NsaWVudF9zdF9vcGVuW11bQlRBX0hGX0NMSUVOVF9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMgotICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBBUElfT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfT1BFTl9GQUlMLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTl9TVH0sCi0gICAgLyogQVBJX0NMT1NFX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9TVEFSVF9DTE9TRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfQVVESU9fT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfU0NPX09QRU4sIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBBUElfQVVESU9fQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX1NDT19DTE9TRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBSRkNfT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTl9TVH0sCi0gICAgLyogUkZDX0NMT1NFX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0UsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfSU5JVF9TVH0sCi0gICAgLyogUkZDX1NSVl9DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBSRkNfREFUQV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfUkZDX0RBVEEsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBESVNDX0FDUF9SRVNfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0RJU0NfQUNQX1JFUywgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBESVNDX0lOVF9SRVNfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBESVNDX09LX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5fU1R9LAotICAgIC8qIERJU0NfRkFJTF9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX09QRU5fU1R9LAotICAgIC8qIFNDT19PUEVOX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9PUEVOLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfT1BFTl9TVH0sCi0gICAgLyogU0NPX0NMT1NFX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLSAgICAvKiBTRU5EX0FUX0NNRF9FVlQgKi8ge0JUQV9IRl9DTElFTlRfU0VORF9BVF9DTUQsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9PUEVOX1NUfSwKLX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciBjbG9zaW5nIHN0YXRlICovCi1jb25zdCB1aW50OF90IGJ0YV9oZl9jbGllbnRfc3RfY2xvc2luZ1tdW0JUQV9IRl9DTElFTlRfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIKLSAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogQVBJX09QRU5fRVZUICovIHtCVEFfSEZfQ0xJRU5UX09QRU5fRkFJTCwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9BVURJT19PUEVOX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfQVVESU9fQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUfSwKLSAgICAvKiBSRkNfT1BFTl9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfQ0xPU0lOR19TVH0sCi0gICAgLyogUkZDX0NMT1NFX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0UsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfSU5JVF9TVH0sCi0gICAgLyogUkZDX1NSVl9DTE9TRV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUfSwKLSAgICAvKiBSRkNfREFUQV9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfQ0xPU0lOR19TVH0sCi0gICAgLyogRElTQ19BQ1BfUkVTX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9GUkVFX0RCLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LAotICAgIC8qIERJU0NfSU5UX1JFU19FVlQgKi8ge0JUQV9IRl9DTElFTlRfRlJFRV9EQiwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9JTklUX1NUfSwKLSAgICAvKiBESVNDX09LX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LAotICAgIC8qIERJU0NfRkFJTF9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEZfQ0xJRU5UX0NMT1NJTkdfU1R9LAotICAgIC8qIFNDT19PUEVOX0VWVCAqLyB7QlRBX0hGX0NMSUVOVF9JR05PUkUsIEJUQV9IRl9DTElFTlRfSUdOT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUfSwKLSAgICAvKiBTQ09fQ0xPU0VfRVZUICovIHtCVEFfSEZfQ0xJRU5UX0lHTk9SRSwgQlRBX0hGX0NMSUVOVF9JR05PUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUfSwKLSAgICAvKiBTRU5EX0FUX0NNRF9FVlQgKi8ge0JUQV9IRl9DTElFTlRfSUdOT1JFLCBCVEFfSEZfQ0xJRU5UX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IRl9DTElFTlRfQ0xPU0lOR19TVH0sCi19OwotCi0vKiB0eXBlIGZvciBzdGF0ZSB0YWJsZSAqLwotdHlwZWRlZiBjb25zdCB1aW50OF90ICgqdEJUQV9IRl9DTElFTlRfU1RfVEJMKVtCVEFfSEZfQ0xJRU5UX05VTV9DT0xTXTsKLQotLyogc3RhdGUgdGFibGUgKi8KLWNvbnN0IHRCVEFfSEZfQ0xJRU5UX1NUX1RCTCBidGFfaGZfY2xpZW50X3N0X3RibFtdID0gewotICAgIGJ0YV9oZl9jbGllbnRfc3RfaW5pdCwgYnRhX2hmX2NsaWVudF9zdF9vcGVuaW5nLCBidGFfaGZfY2xpZW50X3N0X29wZW4sCi0gICAgYnRhX2hmX2NsaWVudF9zdF9jbG9zaW5nfTsKLQotLyogSEYgQ2xpZW50IGNvbnRyb2wgYmxvY2sgKi8KLXRCVEFfSEZfQ0xJRU5UX0NCX0FSUiBidGFfaGZfY2xpZW50X2NiX2FycjsKLQotLyogRXZlbnQgaGFuZGxlciBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgKi8KLXN0YXRpYyBjb25zdCB0QlRBX1NZU19SRUcgYnRhX2hmX2NsaWVudF9yZWcgPSB7YnRhX2hmX2NsaWVudF9oZGxfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9IZkNsaWVudERpc2FibGV9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9jYl9hcnJfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSBlbnRpcmUgY29udHJvbCBibG9jayBhcnJheSBzZXQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9jYl9hcnJfaW5pdCgpIHsKLSAgbWVtc2V0KCZidGFfaGZfY2xpZW50X2NiX2FyciwgMCwgc2l6ZW9mKHRCVEFfSEZfQ0xJRU5UX0NCX0FSUikpOwotCi0gIC8vIHJlc2V0IHRoZSBoYW5kbGVzIGFuZCBtYWtlIHRoZSBDQnMgbm9uLWFsbG9jYXRlZAotICBmb3IgKGludCBpID0gMDsgaSA8IEhGX0NMSUVOVF9NQVhfREVWSUNFUzsgaSsrKSB7Ci0gICAgLy8gQWxsb2NhdGUgdGhlIGhhbmRsZXMgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBpbmRpY2VzCi0gICAgYnRhX2hmX2NsaWVudF9jYl9pbml0KCYoYnRhX2hmX2NsaWVudF9jYl9hcnIuY2JbaV0pLCBpKTsKLSAgICBidGFfaGZfY2xpZW50X2NiX2Fyci5jYltpXS5oYW5kbGUgPSBCVEFfSEZfQ0xJRU5UX0NCX0ZJUlNUX0hBTkRMRSArIGk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2JfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSBhbiBIRl9DbGllbnQgc2VydmljZSBjb250cm9sIGJsb2NrLiBBc3NpZ24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSB0byBjYi0+aGFuZGxlLgotICoKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9jYl9pbml0KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsIHVpbnQxNl90IGhhbmRsZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAvLyBGcmVlIGFueSBtZW1vcnkgd2UgbmVlZCB0byBleHBsaWNpdHkgcmVsZWFzZQotICBhbGFybV9mcmVlKGNsaWVudF9jYi0+Y29sbGlzaW9uX3RpbWVyKTsKLQotICAvLyByZWxlYXNlIHVuaXF1ZSBwb2ludGVycwotICBjbGllbnRfY2ItPmVuYWJsZWRfaGZfaW5kaWNhdG9ycy5jbGVhcigpOwotICBjbGllbnRfY2ItPnBlZXJfaGZfaW5kaWNhdG9ycy5jbGVhcigpOwotCi0gIC8vIE1lbXNldCB0aGUgcmVzdCBvZiB0aGUgYmxvY2sKLSAgLy8gbWVtc2V0KGNsaWVudF9jYiwgMCwgc2l6ZW9mKHRCVEFfSEZfQ0xJRU5UX0NCKSk7Ci0gICpjbGllbnRfY2IgPSB7fTsKLQotICAvLyBSZSBhbGxvY2F0ZSBhbnkgdmFyaWFibGVzIHJlcXVpcmVkCi0gIGNsaWVudF9jYi0+Y29sbGlzaW9uX3RpbWVyID0gYWxhcm1fbmV3KCJidGFfaGZfY2xpZW50LnNjYl9jb2xsaXNpb25fdGltZXIiKTsKLSAgY2xpZW50X2NiLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIGNsaWVudF9jYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfcmVzdW1lX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3VtZSBvcGVuaW5nIHByb2Nlc3MuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfcmVzdW1lX29wZW4odEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAvKiByZXN1bWUgb3BlbmluZyBwcm9jZXNzLiAgKi8KLSAgaWYgKGNsaWVudF9jYi0+c3RhdGUgPT0gQlRBX0hGX0NMSUVOVF9JTklUX1NUKSB7Ci0gICAgY2xpZW50X2NiLT5zdGF0ZSA9IEJUQV9IRl9DTElFTlRfT1BFTklOR19TVDsKLSAgICB0QlRBX0hGX0NMSUVOVF9EQVRBIG1zZzsKLSAgICBtc2cuaGRyLmxheWVyX3NwZWNpZmljID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gICAgbXNnLmFwaV9vcGVuLmJkX2FkZHIgPSBjbGllbnRfY2ItPnBlZXJfYWRkcjsKLSAgICBidGFfaGZfY2xpZW50X3N0YXJ0X29wZW4oJm1zZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX3RpbWVyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIRiBDbGllbnQgY29ubmVjdGlvbiBjb2xsaXNpb24gdGltZXIgY2FsbGJhY2sKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX3RpbWVyX2NiYWNrKHZvaWQqIGRhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPSAodEJUQV9IRl9DTElFTlRfQ0IqKWRhdGE7Ci0KLSAgLyogSWYgdGhlIHBlZXIgaGF2ZW4ndCBvcGVuZWQgY29ubmVjdGlvbiwgcmVzdGFydCBvcGVuaW5nIHByb2Nlc3MgKi8KLSAgYnRhX2hmX2NsaWVudF9yZXN1bWVfb3BlbihjbGllbnRfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9jb2xsaXNpb25fY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCBub3RpZmllZCBhYm91dCBjb2xsaXNpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX2NiYWNrKFVOVVNFRF9BVFRSIHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpZCwgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0gYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2JkYShwZWVyX2FkZHIpOwotICBpZiAoY2xpZW50X2NiICE9IE5VTEwgJiYgY2xpZW50X2NiLT5zdGF0ZSA9PSBCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1QpIHsKLSAgICBpZiAoaWQgPT0gQlRBX0lEX1NZUykgLyogQUNMIGNvbGxpc2lvbiAqLwotICAgIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiSEYgQ2xpZW50IGZvdW5kIGNvbGxpc2lvbiAoQUNMKSAuLi4iKTsKLSAgICB9IGVsc2UgaWYgKGlkID09IEJUQV9JRF9IUykgLyogUkZDT01NIGNvbGxpc2lvbiAqLwotICAgIHsKLSAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiSEYgQ2xpZW50IGZvdW5kIGNvbGxpc2lvbiAoUkZDT01NKSAuLi4iKTsKLSAgICB9IGVsc2UgewotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCJIRiBDbGllbnQgZm91bmQgY29sbGlzaW9uIChcP1w/XD8pIC4uLiIpOwotICAgIH0KLQotICAgIGNsaWVudF9jYi0+c3RhdGUgPSBCVEFfSEZfQ0xJRU5UX0lOSVRfU1Q7Ci0KLSAgICAvKiBDYW5jZWwgU0RQIGlmIGl0IGhhZCBiZWVuIHN0YXJ0ZWQuICovCi0gICAgaWYgKGNsaWVudF9jYi0+cF9kaXNjX2RiKSB7Ci0gICAgICAodm9pZClTRFBfQ2FuY2VsU2VydmljZVNlYXJjaChjbGllbnRfY2ItPnBfZGlzY19kYik7Ci0gICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmY2xpZW50X2NiLT5wX2Rpc2NfZGIpOwotICAgIH0KLQotICAgIC8qIHJlb3BlbiByZWdpc3RlcmVkIHNlcnZlciAqLwotICAgIC8qIENvbGxpc2lvbiBtYXkgYmUgZGV0ZWN0ZWQgYmVmb3JlIG9yIGFmdGVyIHdlIGNsb3NlIHNlcnZlcnMuICovCi0gICAgYnRhX2hmX2NsaWVudF9zdGFydF9zZXJ2ZXIoKTsKLQotICAgIC8qIFN0YXJ0IHRpbWVyIHRvIGhhbmRsZSBjb25uZWN0aW9uIG9wZW5pbmcgcmVzdGFydCAqLwotICAgIGFsYXJtX3NldF9vbl9tbG9vcChjbGllbnRfY2ItPmNvbGxpc2lvbl90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hGX0NMSUVOVF9DT0xMSVNJT05fVElNRVJfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY29sbGlzaW9uX3RpbWVyX2NiYWNrLCAodm9pZCopY2xpZW50X2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9hcGlfZW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gQVBJIGVuYWJsZSBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfU1RBVFVTIGJ0YV9oZl9jbGllbnRfYXBpX2VuYWJsZSh0QlRBX0hGX0NMSUVOVF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lKSB7Ci0gIC8qIElmIGFscmVhZHkgcmVnaXN0ZXJlZCB0aGVuIHJldHVybiBlcnJvciAqLwotICBpZiAoYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfSFMpKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiQlRBIEhGIENsaWVudCBpcyBhbHJlYWR5IGVuYWJsZWQsIGlnbm9yaW5nIC4uLiIpOwotICAgIHJldHVybiBCVEFfRkFJTFVSRTsKLSAgfQotCi0gIC8qIHJlZ2lzdGVyIHdpdGggQlRBIHN5c3RlbSBtYW5hZ2VyICovCi0gIGJ0YV9zeXNfcmVnaXN0ZXIoQlRBX0lEX0hTLCAmYnRhX2hmX2NsaWVudF9yZWcpOwotCi0gIC8qIHJlc2V0IHRoZSBjb250cm9sIGJsb2NrcyAqLwotICBidGFfaGZfY2xpZW50X2NiX2Fycl9pbml0KCk7Ci0KLSAgYnRhX2hmX2NsaWVudF9jYl9hcnIucF9jYmFjayA9IHBfY2JhY2s7Ci0gIGJ0YV9oZl9jbGllbnRfY2JfYXJyLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0KLSAgLyogY3JlYXRlIFNEUCByZWNvcmRzICovCi0gIGJ0YV9oZl9jbGllbnRfY3JlYXRlX3JlY29yZCgmYnRhX2hmX2NsaWVudF9jYl9hcnIsIHBfc2VydmljZV9uYW1lKTsKLQotICAvKiBzZXQgc2FtZSBzZXR0aW5nIGFzIEFHIGRvZXMgKi8KLSAgQlRNX1dyaXRlVm9pY2VTZXR0aW5ncyhBR19WT0lDRV9TRVRUSU5HUyk7Ci0KLSAgYnRhX3N5c19jb2xsaXNpb25fcmVnaXN0ZXIoQlRBX0lEX0hTLCBidGFfaGZfY2xpZW50X2NvbGxpc2lvbl9jYmFjayk7Ci0KLSAgLyogU2V0IHRoZSBBdWRpbyBzZXJ2aWNlIGNsYXNzIGJpdCAqLwotICB0QlRBX1VUTF9DT0QgY29kOwotICBjb2Quc2VydmljZSA9IEJUTV9DT0RfU0VSVklDRV9BVURJTzsKLSAgdXRsX3NldF9kZXZpY2VfY2xhc3MoJmNvZCwgQlRBX1VUTF9TRVRfQ09EX1NFUlZJQ0VfQ0xBU1MpOwotCi0gIC8qIHN0YXJ0IFJGQ09NTSBzZXJ2ZXIgKi8KLSAgYnRhX2hmX2NsaWVudF9zdGFydF9zZXJ2ZXIoKTsKLQotICByZXR1cm4gQlRBX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGaW5kcyB0aGUgY29udHJvbCBibG9jayBieSBoYW5kbGUgcHJvdmlkZWQKLSAqCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZTogSGFuZGxlIGFzIG9idGFpbmVkIGZyb20gQlRBX0hmQ2xpZW50T3BlbiBjYWxsCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQ29udHJvbCBibG9jayBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYW5kbGUgYW5kIE5VTEwgaWYKLSAqICAgICAgICAgICAgICAgICAgbm9uZSBleGlzdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9IRl9DTElFTlRfQ0IqIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIC8vIEhhbmRsZXMgYXJlIGxpbWl0ZWQgZnJvbSAxIHRocm91Z2ggSEZfQ0xJRU5UX01BWF9ERVZJQ0VTCi0gIGlmIChoYW5kbGUgPCAxIHx8IGhhbmRsZSA+IEhGX0NMSUVOVF9NQVhfREVWSUNFUykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBoYW5kbGUgb3V0IG9mIHJhbmdlICglZCwgJWQpICVkIiwgX19mdW5jX18sIDEsCi0gICAgICAgICAgICAgICAgICAgICBIRl9DTElFTlRfTUFYX0RFVklDRVMsIGhhbmRsZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDaGVjayBpZiB0aGUgYXNzb2NpYXRlZCBpbmRleCBpcyBhbGxvY2F0ZWQuIEluZGV4IGlzIChoYW5kbGUgLSAxKS4KLSAgaWYgKGJ0YV9oZl9jbGllbnRfY2JfYXJyLmNiW2hhbmRsZSAtIDFdLmlzX2FsbG9jYXRlZCkKLSAgICByZXR1cm4gJihidGFfaGZfY2xpZW50X2NiX2Fyci5jYltoYW5kbGUgLSAxXSk7Ci0KLSAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGJsb2NrIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sIGhhbmRsZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2JkYQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZHMgdGhlIGNvbnRyb2wgYmxvY2sgYnkgaGFuZGxlIHByb3ZpZGVkCi0gKgotICogICAgICAgICAgICAgICAgICBiZGE6IGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0byBmaW5kIHRoZSBoYW5kbGUgZm9yLgotICogICAgICAgICAgICAgICAgICBTaW5jZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgSEYgY29ubmVjdGlvbiBmb3IgYSBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgd2Ugc2hvdWxkIGFsd2F5cyBmaW5kIGEgdW5pcXVlIGJsb2NrCi0gKgotICogUmV0dXJucyAgICAgICAgICBDb250cm9sIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgYW5kIE5VTEwgaWYKLSAqICAgICAgICAgICAgICAgICAgbm9uZSBleGlzdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9IRl9DTElFTlRfQ0IqIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9iZGEoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgSEZfQ0xJRU5UX01BWF9ERVZJQ0VTOyBpKyspIHsKLSAgICAvLyBDaGVjayBpZiB0aGUgYXNzb2NpYXRlZCBpbmRleCBpcyBhbGxvY2F0ZWQgYW5kIHRoYXQgQkQgQUREUiBtYXRjaGVzCi0gICAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9ICZidGFfaGZfY2xpZW50X2NiX2Fyci5jYltpXTsKLSAgICBpZiAoY2xpZW50X2NiLT5pc19hbGxvY2F0ZWQgJiYgcGVlcl9hZGRyID09IGNsaWVudF9jYi0+cGVlcl9hZGRyKSB7Ci0gICAgICByZXR1cm4gY2xpZW50X2NiOwotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBiZGFkZHIgbWlzbWF0Y2ggZm9yIGhhbmRsZSAlZCBhbGxvYyAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIGksIGNsaWVudF9jYi0+aXNfYWxsb2NhdGVkKTsKLSAgICB9Ci0gIH0KLSAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGJsb2NrIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfcmZjX2hhbmRsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZHMgdGhlIGNvbnRyb2wgYmxvY2sgYnkgUkZDIGhhbmRsZSBwcm92aWRlZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZTogUkZDIGhhbmRsZSBmb3IgdGhlIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBDb250cm9sIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhhbmRsZSBhbmQgTlVMTCBpZiBub25lCi0gKiAgICAgICAgICAgICAgICAgIGV4aXN0cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0hGX0NMSUVOVF9DQiogYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X3JmY19oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgSEZfQ0xJRU5UX01BWF9ERVZJQ0VTOyBpKyspIHsKLSAgICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0gJmJ0YV9oZl9jbGllbnRfY2JfYXJyLmNiW2ldOwotICAgIGJvb2wgaXNfYWxsb2NhdGVkID0gY2xpZW50X2NiLT5pc19hbGxvY2F0ZWQ7Ci0gICAgdWludDE2X3QgY29ubl9oYW5kbGUgPSBjbGllbnRfY2ItPmNvbm5faGFuZGxlOwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNiIHJmY19oYW5kbGUgJWQgYWxsb2MgJWQgY29ubl9oYW5kbGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgaXNfYWxsb2NhdGVkLCBjb25uX2hhbmRsZSk7Ci0KLSAgICBpZiAoaXNfYWxsb2NhdGVkICYmIGNvbm5faGFuZGxlID09IGhhbmRsZSkgewotICAgICAgcmV0dXJuIGNsaWVudF9jYjsKLSAgICB9Ci0KLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBubyBjYiB5ZXQgJWQgYWxsb2MgJWQgY29ubl9oYW5kbGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBpc19hbGxvY2F0ZWQsIGNvbm5faGFuZGxlKTsKLSAgfQotCi0gIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBubyBjYiBmb3VuZCBmb3IgcmZjIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9zY29faGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGaW5kcyB0aGUgY29udHJvbCBibG9jayBieSBzY28gaGFuZGxlIHByb3ZpZGVkCi0gKgotICogICAgICAgICAgICAgICAgICBoYW5kbGU6IHNjbyBoYW5kbGUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBDb250cm9sIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjbyBoYW5kbGUgYW5kCi0gKiAgICAgICAgICAgICAgICAgIG5vbmUgaWYgbm9uZSBleGlzdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9IRl9DTElFTlRfQ0IqIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9zY29faGFuZGxlKHVpbnQxNl90IGhhbmRsZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IEhGX0NMSUVOVF9NQVhfREVWSUNFUzsgaSsrKSB7Ci0gICAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9ICZidGFfaGZfY2xpZW50X2NiX2Fyci5jYltpXTsKLSAgICBpZiAoY2xpZW50X2NiLT5pc19hbGxvY2F0ZWQgJiYgY2xpZW50X2NiLT5zY29faWR4ID09IGhhbmRsZSkgewotICAgICAgcmV0dXJuIGNsaWVudF9jYjsKLSAgICB9Ci0gIH0KLSAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGJsb2NrIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sIGhhbmRsZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFsbG9jYXRlcyBhIGhhbmRsZSBmb3IgdGhlIG5ldyBCRCBBRERSIHRoYXQgbmVlZHMgYSBuZXcgUkYKLSAqICAgICAgICAgICAgICAgICAgY2hhbm5lbCBmb3IgSEYgY29ubmVjdGlvbi4gSWYgdGhlIGNoYW5uZWwgY2Fubm90IGJlIGNyZWF0ZWQKLSAqICAgICAgICAgICAgICAgICAgZm9yIGEgcmVhc29uIHRoZW4gZmFsc2UgaXMgcmV0dXJuZWQKLSAqCi0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHI6IEFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3Igd2hpY2ggdGhpcyBibG9jayBpcwotICogICAgICAgICAgICAgICAgICBiZWluZyBjcmVhdGVkLiBTaW5nbGUgZGV2aWNlIGNhbiBvbmx5IGhhdmUgb25lIGJsb2NrLgotICogICAgICAgICAgICAgICAgICBwX2hhbmRsZTogT1VUIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBvdXRjb21lIG9mIGFsbG9jYXRlLiBJZgotICogICAgICAgICAgICAgICAgICBhbGxvY2F0ZSBmYWlsZWQgdGhlbiB2YWx1ZSBpcyBub3QgdmFsaWQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHRoZSBjcmVhdGlvbiBvZiBwX2hhbmRsZSBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9oZl9jbGllbnRfYWxsb2NhdGVfaGFuZGxlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2hhbmRsZSkgewotICB0QlRBX0hGX0NMSUVOVF9DQiogZXhpc3RpbmdfY2IgPSBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfYmRhKGJkX2FkZHIpOwotICBpZiAoZXhpc3RpbmdfY2IgIT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBjYW5ub3QgYWxsb2NhdGUgaGFuZGxlIHNpbmNlIEJEQUREUiBhbHJlYWR5IGV4aXN0cyIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIENoZWNrIHRoYXQgd2UgZG8gbm90IGhhdmUgYSByZXF1ZXN0IHRvIGZvciBzYW1lIGRldmljZSBpbiB0aGUgY29udHJvbAotICAgKiBibG9ja3MgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBIRl9DTElFTlRfTUFYX0RFVklDRVM7IGkrKykgewotICAgIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPSAmYnRhX2hmX2NsaWVudF9jYl9hcnIuY2JbaV07Ci0gICAgaWYgKGNsaWVudF9jYi0+aXNfYWxsb2NhdGVkKSB7Ci0gICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBjb250cm9sIGJsb2NrIGFscmVhZHkgdXNlZCBpbmRleCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgdGhlIGNsaWVudCBjb250cm9sIGJsb2NrCi0gICAgYnRhX2hmX2NsaWVudF9jYl9pbml0KGNsaWVudF9jYiwgY2xpZW50X2NiLT5oYW5kbGUpOwotCi0gICAgKnBfaGFuZGxlID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG1hcmtpbmcgQ0IgaGFuZGxlICVkIHRvIHRydWUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9jYi0+aGFuZGxlKTsKLQotICAgIGNsaWVudF9jYi0+aXNfYWxsb2NhdGVkID0gdHJ1ZTsKLSAgICBjbGllbnRfY2ItPnBlZXJfYWRkciA9IGJkX2FkZHI7Ci0gICAgYnRhX2hmX2NsaWVudF9hdF9pbml0KGNsaWVudF9jYik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci0gIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBhbGwgY29udHJvbCBibG9ja3MgaW4gdXNlISIsIF9fZnVuY19fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBWb2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9hcHBfY2FsbGJhY2sodWludDE2X3QgZXZlbnQsIHRCVEFfSEZfQ0xJRU5UKiBkYXRhKSB7Ci0gIGlmIChidGFfaGZfY2xpZW50X2NiX2Fyci5wX2NiYWNrICE9IE5VTEwpIHsKLSAgICBidGFfaGZfY2xpZW50X2NiX2Fyci5wX2NiYWNrKGV2ZW50LCBkYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9hcGlfZGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIEFQSSBkaXNhYmxlIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2FwaV9kaXNhYmxlKCkgewotICBpZiAoIWJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0hTKSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiQlRBIEhGIENsaWVudCBpcyBhbHJlYWR5IGRpc2FibGVkLCBpZ25vcmluZyAuLi4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBSZW1vdmUgdGhlIGNvbGxpc2lvbiBoYW5kbGVyICovCi0gIGJ0YV9zeXNfY29sbGlzaW9uX3JlZ2lzdGVyKEJUQV9JRF9IUywgTlVMTCk7Ci0KLSAgYnRhX2hmX2NsaWVudF9jYl9hcnIuZGVyZWdpc3RlciA9IHRydWU7Ci0KLSAgLyogcmVtb3ZlIHNkcCByZWNvcmQgKi8KLSAgYnRhX2hmX2NsaWVudF9kZWxfcmVjb3JkKCZidGFfaGZfY2xpZW50X2NiX2Fycik7Ci0KLSAgLyogcmVtb3ZlIHJmY29tbSBzZXJ2ZXIgKi8KLSAgYnRhX2hmX2NsaWVudF9jbG9zZV9zZXJ2ZXIoKTsKLQotICAvKiByZWluaXQgdGhlIGNvbnRyb2wgYmxvY2sgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBIRl9DTElFTlRfTUFYX0RFVklDRVM7IGkrKykgewotICAgIGlmIChidGFfaGZfY2xpZW50X2NiX2Fyci5jYltpXS5pc19hbGxvY2F0ZWQpIHsKLSAgICAgIGJ0YV9oZl9jbGllbnRfY2JfaW5pdCgmKGJ0YV9oZl9jbGllbnRfY2JfYXJyLmNiW2ldKSwgaSk7Ci0gICAgfQotICB9Ci0KLSAgLyogRGUtcmVnaXN0ZXIgd2l0aCBCVEEgc3lzdGVtIG1hbmFnZXIgKi8KLSAgYnRhX3N5c19kZXJlZ2lzdGVyKEJUQV9JRF9IUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2hkbF9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGF0YSBIRiBDbGllbnQgbWFpbiBldmVudCBoYW5kbGluZyBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2hmX2NsaWVudF9oZGxfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJXMgKDB4JXgpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYnRhX2hmX2NsaWVudF9ldnRfc3RyKHBfbXNnLT5ldmVudCksIHBfbXNnLT5ldmVudCk7Ci0gIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZShwX21zZy0+ZXZlbnQsICh0QlRBX0hGX0NMSUVOVF9EQVRBKilwX21zZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zbV9leGVjdXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGF0ZSBtYWNoaW5lIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciBIRiBDbGllbnQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9zbV9leGVjdXRlKHVpbnQxNl90IGV2ZW50LCB0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9IRl9DTElFTlRfU1RfVEJMIHN0YXRlX3RhYmxlOwotICB1aW50OF90IGFjdGlvbjsKLSAgaW50IGk7Ci0KLSAgdWludDE2X3QgaW5fZXZlbnQgPSBldmVudDsKLSAgdWludDhfdCBpbl9zdGF0ZSA9IGNsaWVudF9jYi0+c3RhdGU7Ci0KLSAgLyogSWdub3JlIGRpc3BsYXlpbmcgb2YgQVQgcmVzdWx0cyB3aGVuIG5vdCBjb25uZWN0ZWQgKElnbm9yZWQgaW4gc3RhdGUKLSAgICogbWFjaGluZSkgKi8KLSAgaWYgKGNsaWVudF9jYi0+c3RhdGUgPT0gQlRBX0hGX0NMSUVOVF9PUEVOX1NUKSB7Ci0gICAgQVBQTF9UUkFDRV9FVkVOVCgiSEYgQ2xpZW50IGV2dCA6IFN0YXRlICVkICglcyksIEV2ZW50IDB4JTA0eCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9jYi0+c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X3N0YXRlX3N0cihjbGllbnRfY2ItPnN0YXRlKSwgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2V2dF9zdHIoZXZlbnQpKTsKLSAgfQotCi0gIGV2ZW50ICY9IDB4MDBGRjsKLSAgaWYgKGV2ZW50ID49IChCVEFfSEZfQ0xJRU5UX01BWF9FVlQgJiAweDAwRkYpKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiSEYgQ2xpZW50IGV2dCBvdXQgb2YgcmFuZ2UsIGlnbm9yaW5nLi4uIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogbG9vayB1cCB0aGUgc3RhdGUgdGFibGUgZm9yIHRoZSBjdXJyZW50IHN0YXRlICovCi0gIHN0YXRlX3RhYmxlID0gYnRhX2hmX2NsaWVudF9zdF90YmxbY2xpZW50X2NiLT5zdGF0ZV07Ci0KLSAgLyogc2V0IG5leHQgc3RhdGUgKi8KLSAgY2xpZW50X2NiLT5zdGF0ZSA9IHN0YXRlX3RhYmxlW2V2ZW50XVtCVEFfSEZfQ0xJRU5UX05FWFRfU1RBVEVdOwotCi0gIC8qIGV4ZWN1dGUgYWN0aW9uIGZ1bmN0aW9ucyAqLwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0hGX0NMSUVOVF9BQ1RJT05TOyBpKyspIHsKLSAgICBhY3Rpb24gPSBzdGF0ZV90YWJsZVtldmVudF1baV07Ci0gICAgaWYgKGFjdGlvbiAhPSBCVEFfSEZfQ0xJRU5UX0lHTk9SRSkgewotICAgICAgKCpidGFfaGZfY2xpZW50X2FjdGlvblthY3Rpb25dKShwX2RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiB0aGUgc3RhdGUgaGFzIGNoYW5nZWQgdGhlbiBub3RpZnkgdGhlIGFwcCBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UgKi8KLSAgaWYgKGluX3N0YXRlICE9IGNsaWVudF9jYi0+c3RhdGUpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IG5vdGlmeWluZyBzdGF0ZSBjaGFuZ2UgdG8gIiA8PCBpbl9zdGF0ZSA8PCAiIC0+ICIKLSAgICAgICAgICAgIDw8IGNsaWVudF9jYi0+c3RhdGUgPDwgIiBkZXZpY2UgIiA8PCBjbGllbnRfY2ItPnBlZXJfYWRkcjsKLSAgICB0QlRBX0hGX0NMSUVOVCBldnQ7Ci0gICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKLSAgICBldnQuYmRfYWRkciA9IGNsaWVudF9jYi0+cGVlcl9hZGRyOwotICAgIGlmIChjbGllbnRfY2ItPnN0YXRlID09IEJUQV9IRl9DTElFTlRfSU5JVF9TVCkgewotICAgICAgYnRhX2hmX2NsaWVudF9hcHBfY2FsbGJhY2soQlRBX0hGX0NMSUVOVF9DTE9TRV9FVlQsICZldnQpOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG1hcmtpbmcgQ0IgaGFuZGxlICVkIHRvIGZhbHNlIiwgX19mdW5jX18sIGNsaWVudF9jYi0+aGFuZGxlKTsKLSAgICAgIGNsaWVudF9jYi0+aXNfYWxsb2NhdGVkID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChjbGllbnRfY2ItPnN0YXRlID09IEJUQV9IRl9DTElFTlRfT1BFTl9TVCkgewotICAgICAgZXZ0Lm9wZW4uaGFuZGxlID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gICAgICBidGFfaGZfY2xpZW50X2FwcF9jYWxsYmFjayhCVEFfSEZfQ0xJRU5UX09QRU5fRVZULCAmZXZ0KTsKLSAgICB9Ci0gIH0KLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZSAiIDw8IGNsaWVudF9jYi0+cGVlcl9hZGRyCi0gICAgICAgICAgPDwgInN0YXRlIGNoYW5nZTogWyIgPDwgYnRhX2hmX2NsaWVudF9zdGF0ZV9zdHIoaW5fc3RhdGUpIDw8ICJdIC0+IFsiCi0gICAgICAgICAgPDwgYnRhX2hmX2NsaWVudF9zdGF0ZV9zdHIoY2xpZW50X2NiLT5zdGF0ZSkgPDwgIl0gYWZ0ZXIgRXZlbnQgWyIKLSAgICAgICAgICA8PCBidGFfaGZfY2xpZW50X2V2dF9zdHIoaW5fZXZlbnQpIDw8ICJdIjsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9wb3N0X3NsY19jbWQodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICBjbGllbnRfY2ItPmF0X2NiLmN1cnJlbnRfY21kID0gQlRBX0hGX0NMSUVOVF9BVF9OT05FOwotCi0gIHRCVEFfSEZfQ0xJRU5UX0RBVEEgcF9kYXRhOwotICBwX2RhdGEuaGRyLmxheWVyX3NwZWNpZmljID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gIGJ0YV9oZl9jbGllbnRfc2NvX2xpc3RlbigmcF9kYXRhKTsKLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpYShjbGllbnRfY2IpOwotICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2N3YShjbGllbnRfY2IsIHRydWUpOwotICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY21lZShjbGllbnRfY2IsIHRydWUpOwotICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY29wcyhjbGllbnRfY2IsIGZhbHNlKTsKLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2J0cmgoY2xpZW50X2NiLCB0cnVlLCAwKTsKLSAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2NsaXAoY2xpZW50X2NiLCB0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2xjX3NlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlcyBBVCBjb21tYW5kcyBzZXF1ZW5jZSByZXF1aXJlZCBmb3IgU0xDIGNyZWF0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfc2xjX3NlcSh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCBib29sIGVycm9yKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oZl9jbGllbnRfc2xjX3NlcSBjbWQ6ICV1IiwKLSAgICAgICAgICAgICAgICAgICBjbGllbnRfY2ItPmF0X2NiLmN1cnJlbnRfY21kKTsKLQotICBpZiAoZXJyb3IpIHsKLSAgICAvKiBTTEMgZXN0YWJsaXNobWVudCBlcnJvciwgc2VudCBjbG9zZSByZmNvbW0gZXZlbnQgKi8KLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiSEZQQ2xpZW50OiBGYWlsZWQgdG8gY3JlYXRlIFNMQyBkdWUgdG8gQVQgZXJyb3IsIGRpc2Nvbm5lY3RpbmcgKCV1KSIsCi0gICAgICAgIGNsaWVudF9jYi0+YXRfY2IuY3VycmVudF9jbWQpOwotCi0gICAgdEJUQV9IRl9DTElFTlRfREFUQSBtc2c7Ci0gICAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYi0+aGFuZGxlOwotICAgIGJ0YV9oZl9jbGllbnRfc21fZXhlY3V0ZShCVEFfSEZfQ0xJRU5UX0FQSV9DTE9TRV9FVlQsICZtc2cpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjbGllbnRfY2ItPnN2Y19jb25uKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogU0xDIGFscmVhZHkgY29ubmVjdGVkIGZvciBDQiBoYW5kbGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2NiLT5oYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAoY2xpZW50X2NiLT5hdF9jYi5jdXJyZW50X2NtZCkgewotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9OT05FOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2Jyc2YoY2xpZW50X2NiLCBidGFfaGZfY2xpZW50X2NiX2Fyci5mZWF0dXJlcyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9CUlNGOgotICAgICAgaWYgKChidGFfaGZfY2xpZW50X2NiX2Fyci5mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF9DT0RFQykgJiYKLSAgICAgICAgICAoY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0hGX0NMSUVOVF9QRUVSX0NPREVDKSkgewotICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmFjKGNsaWVudF9jYik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfY2luZChjbGllbnRfY2IsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0JBQzoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaW5kKGNsaWVudF9jYiwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQ0lORDoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaW5kKGNsaWVudF9jYiwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DSU5EX1NUQVRVUzoKLSAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jbWVyKGNsaWVudF9jYiwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9BVF9DTUVSOgotICAgICAgaWYgKGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUXzNXQVkgJiYKLSAgICAgICAgICBidGFfaGZfY2xpZW50X2NiX2Fyci5mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF8zV0FZKSB7Ci0gICAgICAgIGJ0YV9oZl9jbGllbnRfc2VuZF9hdF9jaGxkKGNsaWVudF9jYiwgJz8nLCAwKTsKLSAgICAgIH0gZWxzZSBpZiAoYnRhX2hmX2NsaWVudF9jYl9hcnIuZmVhdHVyZXMgJiBCVEFfSEZfQ0xJRU5UX0ZFQVRfSEZfSU5EICYmCi0gICAgICAgICAgICAgICAgIGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfUEVFUl9IRl9JTkQpIHsKLSAgICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpbmQoY2xpZW50X2NiLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRCVEFfSEZfQ0xJRU5UX0RBVEEgbXNnOwotICAgICAgICBtc2cuaGRyLmxheWVyX3NwZWNpZmljID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gICAgICAgIGJ0YV9oZl9jbGllbnRfc3ZjX2Nvbm5fb3BlbigmbXNnKTsKLSAgICAgICAgc2VuZF9wb3N0X3NsY19jbWQoY2xpZW50X2NiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0NITEQ6Ci0gICAgICBpZiAoYnRhX2hmX2NsaWVudF9jYl9hcnIuZmVhdHVyZXMgJiBCVEFfSEZfQ0xJRU5UX0ZFQVRfSEZfSU5EICYmCi0gICAgICAgICAgY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0hGX0NMSUVOVF9QRUVSX0hGX0lORCkgewotICAgICAgICBidGFfaGZfY2xpZW50X3NlbmRfYXRfYmluZChjbGllbnRfY2IsIDApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdEJUQV9IRl9DTElFTlRfREFUQSBtc2c7Ci0gICAgICAgIG1zZy5oZHIubGF5ZXJfc3BlY2lmaWMgPSBjbGllbnRfY2ItPmhhbmRsZTsKLSAgICAgICAgYnRhX2hmX2NsaWVudF9zdmNfY29ubl9vcGVuKCZtc2cpOwotICAgICAgICBzZW5kX3Bvc3Rfc2xjX2NtZChjbGllbnRfY2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVRfQklORF9TRVRfSU5EOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpbmQoY2xpZW50X2NiLCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0JJTkRfUkVBRF9TVVBQT1JURURfSU5EOgotICAgICAgYnRhX2hmX2NsaWVudF9zZW5kX2F0X2JpbmQoY2xpZW50X2NiLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX0JJTkRfUkVBRF9FTkFCTEVEX0lORDoKLSAgICAgIHRCVEFfSEZfQ0xJRU5UX0RBVEEgbXNnOwotICAgICAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYi0+aGFuZGxlOwotICAgICAgYnRhX2hmX2NsaWVudF9zdmNfY29ubl9vcGVuKCZtc2cpOwotICAgICAgc2VuZF9wb3N0X3NsY19jbWQoY2xpZW50X2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogewotICAgICAgLyogSWYgaGFwcGVuIHRoZXJlIGlzIGEgYnVnIGluIFNMQyBjcmVhdGlvbiBwcm9jZWR1cmUuLi4gKi8KLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgIkhGUENsaWVudDogRmFpbGVkIHRvIGNyZWF0ZSBTTENkdWUgdG8gdW5leHBlY3RlZCBBVCBjb21tYW5kLCAiCi0gICAgICAgICAgImRpc2Nvbm5lY3RpbmcgKCV1KSIsCi0gICAgICAgICAgY2xpZW50X2NiLT5hdF9jYi5jdXJyZW50X2NtZCk7Ci0KLSAgICAgIHRCVEFfSEZfQ0xJRU5UX0RBVEEgbXNnOwotICAgICAgbXNnLmhkci5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYi0+aGFuZGxlOwotICAgICAgYnRhX2hmX2NsaWVudF9zbV9leGVjdXRlKEJUQV9IRl9DTElFTlRfQVBJX0NMT1NFX0VWVCwgJm1zZyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotI2lmbmRlZiBDQVNFX1JFVFVSTl9TVFIKLSNkZWZpbmUgQ0FTRV9SRVRVUk5fU1RSKGNvbnN0KSBcCi0gIGNhc2UgY29uc3Q6ICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29uc3Q7Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9oZl9jbGllbnRfZXZ0X3N0cih1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQVBJX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0FQSV9DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQVBJX0FVRElPX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0FQSV9BVURJT19DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfUkZDX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX1JGQ19DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfUkZDX1NSVl9DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfUkZDX0RBVEFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0RJU0NfQUNQX1JFU19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfRElTQ19JTlRfUkVTX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9ESVNDX09LX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9ESVNDX0ZBSUxfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0FQSV9FTkFCTEVfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0FQSV9ESVNBQkxFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfU0NPX0NMT1NFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9TRU5EX0FUX0NNRF9FVlQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBIRiBDbGllbnQgRXZlbnQiOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfaGZfY2xpZW50X3N0YXRlX3N0cih1aW50OF90IHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9JTklUX1NUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX09QRU5JTkdfU1QpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfT1BFTl9TVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9DTE9TSU5HX1NUKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gSEYgQ2xpZW50IFN0YXRlIjsKLSAgfQotfQotCi12b2lkIGJ0YV9oZl9jbGllbnRfZHVtcF9zdGF0aXN0aWNzKGludCBmZCkgewotICBkcHJpbnRmKGZkLCAiXG5CbHVldG9vdGggSEYgQ2xpZW50IEJUQSBTdGF0aXN0aWNzXG4iKTsKLQotICAvLyBXZSBkdW1wIHN0YXRpc3RpY3MgZm9yIGFsbCBjb250cm9sIGJsb2NrcwotICBmb3IgKGludCBpID0gMDsgaSA8IEhGX0NMSUVOVF9NQVhfREVWSUNFUzsgaSsrKSB7Ci0gICAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9ICZidGFfaGZfY2xpZW50X2NiX2Fyci5jYltpXTsKLSAgICBpZiAoIWNsaWVudF9jYi0+aXNfYWxsb2NhdGVkKSB7Ci0gICAgICAvLyBTa2lwIHRoZSBibG9ja3Mgd2hpY2ggYXJlIG5vdCBhbGxvY2F0ZWQKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGRwcmludGYoZmQsICIgIENvbnRyb2wgYmxvY2sgIyVkXG4iLCBpICsgMSk7Ci0KLSAgICB1aW50OF90KiBhID0gY2xpZW50X2NiLT5wZWVyX2FkZHIuYWRkcmVzczsKLSAgICAvLyBEZXZpY2UgbmFtZQotICAgIGRwcmludGYoZmQsICIgICAgUGVlciBEZXZpY2U6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBhWzBdLCBhWzFdLAotICAgICAgICAgICAgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSk7Ci0KLSAgICAvLyBTdGF0ZSBtYWNoaW5lIHN0YXRlCi0gICAgZHByaW50ZihmZCwgIiAgICBTdGF0ZSBNYWNoaW5lIFN0YXRlOiAlc1xuIiwKLSAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc3RhdGVfc3RyKGNsaWVudF9jYi0+c3RhdGUpKTsKLQotICAgIC8vIExvY2FsIFJGQyBjaGFubmVsZm9yIGNvbW11bmljYXRpb24KLSAgICBkcHJpbnRmKGZkLCAiICAgIFJGQ09NTSBDaGFubmVsIChsb2NhbCkgJWRcbiIsIGNsaWVudF9jYi0+Y29ubl9oYW5kbGUpOwotCi0gICAgLy8gQlRBIEhhbmRsZSBzaGFyZWQgYmV0d2VlbiBCVEEgYW5kIGNsaWVudCAoZXggQlRJRikKLSAgICBkcHJpbnRmKGZkLCAiICAgIEJUQSBHZW5lcmF0ZWQgaGFuZGxlICVkXG4iLCBjbGllbnRfY2ItPmhhbmRsZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9yZmMuY2MgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfcmZjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY0MDAzLi4wMDAwMDAwCi0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9yZmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYXVkaW8gZ2F0ZXdheSBmdW5jdGlvbnMgY29udHJvbGxpbmcgdGhlIFJGQ09NTQotICogIGNvbm5lY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3BvcnRfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9wb3J0X2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSRkNPTU0gUG9ydCBjYWxsYmFjay4gVGhlIGhhbmRsZSBpbiB0aGlzIGZ1bmN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBCVEEgbGF5ZXIgdmlhIHRoZSBQT1JUX1NldEV2ZW50Q2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgbWV0aG9kCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfcG9ydF9jYmFjayhVTlVTRURfQVRUUiB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBvcnRfaGFuZGxlKSB7Ci0gIC8qIGlnbm9yZSBwb3J0IGV2ZW50cyBmb3IgcG9ydCBoYW5kbGVzIG90aGVyIHRoYW4gY29ubmVjdGVkIGhhbmRsZSAqLwotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0KLSAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9yZmNfaGFuZGxlKHBvcnRfaGFuZGxlKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sIHBvcnRfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0hGX0NMSUVOVF9SRkMqIHBfYnVmID0KLSAgICAgICh0QlRBX0hGX0NMSUVOVF9SRkMqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfSEZfQ0xJRU5UX1JGQykpOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9SRkNfREFUQV9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBjbGllbnRfY2ItPmhhbmRsZTsKLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfbWdtdF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIG1hbmFnZW1lbnQgY2FsbGJhY2sKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfbWdtdF9jYmFjayh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0KLSAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9yZmNfaGFuZGxlKHBvcnRfaGFuZGxlKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZSA9ICVkLCBwb3J0X2hhbmRsZSA9ICVkIHNlcnYgPSAlZCIsIF9fZnVuY19fLCBjb2RlLAotICAgICAgICAgICAgICAgICAgIHBvcnRfaGFuZGxlLCBidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSk7Ci0KLSAgLyogaWdub3JlIGNsb3NlIGV2ZW50IGZvciBwb3J0IGhhbmRsZXMgb3RoZXIgdGhhbiBjb25uZWN0ZWQgaGFuZGxlICovCi0gIGlmIChjb2RlICE9IFBPUlRfU1VDQ0VTUyAmJiBjbGllbnRfY2IgIT0gTlVMTCAmJgotICAgICAgcG9ydF9oYW5kbGUgIT0gY2xpZW50X2NiLT5jb25uX2hhbmRsZSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oZl9jbGllbnRfbWdtdF9jYmFjayBpZ25vcmluZyBoYW5kbGU6JWQiLAotICAgICAgICAgICAgICAgICAgICAgcG9ydF9oYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVEFfSEZfQ0xJRU5UX1JGQyogcF9idWYgPQotICAgICAgKHRCVEFfSEZfQ0xJRU5UX1JGQyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9IRl9DTElFTlRfUkZDKSk7Ci0KLSAgaWYgKGNvZGUgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgaWYgKGNsaWVudF9jYiAmJiBwb3J0X2hhbmRsZSA9PSBjbGllbnRfY2ItPmNvbm5faGFuZGxlKSB7IC8qIG91dCBjb25uICovCi0gICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9SRkNfT1BFTl9FVlQ7Ci0gICAgfSBlbHNlIGlmIChwb3J0X2hhbmRsZSA9PSBidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSkgewotICAgICAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9IRl9DTElFTlRfUkZDX09QRU5fRVZUOwotCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogYWxsb2NhdGluZyBhIG5ldyBDQiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIC8vIEZpbmQgdGhlIEJEQUREUiBvZiB0aGUgcGVlciBkZXZpY2UKLSAgICAgIFJhd0FkZHJlc3MgcGVlcl9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICAgICAgdWludDE2X3QgbGNpZCA9IDA7Ci0gICAgICBpbnQgc3RhdHVzID0gUE9SVF9DaGVja0Nvbm5lY3Rpb24ocG9ydF9oYW5kbGUsICZwZWVyX2FkZHIsICZsY2lkKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogUE9SVF9DaGVja0Nvbm5lY3Rpb24gcmV0dXJuZWQgIiA8PCBzdGF0dXM7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFNpbmNlIHdlIGFjY2VwdGVkIGEgcmVtb3RlIHJlcXVlc3Qgd2Ugc2hvdWxkIGFsbG9jYXRlIGEgaGFuZGxlIGZpcnN0LgotICAgICAgdWludDE2X3QgdG1wX2hhbmRsZSA9IC0xOwotICAgICAgYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUocGVlcl9hZGRyLCAmdG1wX2hhbmRsZSk7Ci0gICAgICBjbGllbnRfY2IgPSBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHRtcF9oYW5kbGUpOwotCi0gICAgICAvLyBJZiBhbGxvY2F0aW9uIGZhaWxzIHRoZW4gd2UgYWJvcnQuCi0gICAgICBpZiAoY2xpZW50X2NiID09IE5VTEwpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGVycm9yIGFsbG9jYXRpbmcgYSBuZXcgaGFuZGxlIiwgX19mdW5jX18pOwotICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0VfRVZUOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU2V0IHRoZSBjb25uZWN0aW9uIGZpZWxkcyBmb3IgdGhpcyBuZXcgQ0IKLSAgICAgICAgY2xpZW50X2NiLT5jb25uX2hhbmRsZSA9IHBvcnRfaGFuZGxlOwotCi0gICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYWNjZXB0ZWQgYW4gaW5jb21pbmcgUkZDT01NIGNvbm5lY3Rpb246Ci0gICAgICAgIC8vIGEpIFJlbGVhc2UgdGhlIGN1cnJlbnQgc2VydmVyIGZyb20gaXQgZHV0aWVzCi0gICAgICAgIC8vIGIpIFN0YXJ0IGEgbmV3IHNlcnZlciBmb3IgbW9yZSBuZXcgaW5jb21pbmcgY29ubmVjdGlvbgotICAgICAgICBidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSA9IDA7Ci0gICAgICAgIGJ0YV9oZl9jbGllbnRfc3RhcnRfc2VydmVyKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBQT1JUX1NVQ0NFU1MsIGlnbm9yaW5nIGhhbmRsZSA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBvcnRfaGFuZGxlKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY2xpZW50X2NiICE9IE5VTEwgJiYKLSAgICAgICAgICAgICBwb3J0X2hhbmRsZSA9PSBjbGllbnRfY2ItPmNvbm5faGFuZGxlKSB7IC8qIGNvZGUgIT0gUE9SVF9TVUMgKi8KLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNsb3NpbmcgcG9ydCBoYW5kbGUgIiA8PCBwb3J0X2hhbmRsZSA8PCAiZGV2ICIKLSAgICAgICAgICAgICAgIDw8IGNsaWVudF9jYi0+cGVlcl9hZGRyOwotCi0gICAgUkZDT01NX1JlbW92ZVNlcnZlcihwb3J0X2hhbmRsZSk7Ci0gICAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9IRl9DTElFTlRfUkZDX0NMT1NFX0VWVDsKLSAgfSBlbHNlIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIC8vIGNsaWVudF9jYiBpcyBhbHJlYWR5IGNsZWFuZWQgZHVlIHRvIGhmcCBjbGllbnQgZGlzYWJsZWQuCi0gICAgLy8gQXNzaWduZWQgYSB2YWxpZCBldmVudCB2YWx1ZSB0byBoZWFkZXIgYW5kIHNlbmQgdGhpcyBtZXNzYWdlIGFueXdheS4KLSAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0VfRVZUOwotICB9Ci0KLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYiAhPSBOVUxMID8gY2xpZW50X2NiLT5oYW5kbGUgOiAwOwotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zZXR1cF9wb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXR1cCBSRkNPTU0gcG9ydCBmb3IgdXNlIGJ5IEhGIENsaWVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9zZXR1cF9wb3J0KHVpbnQxNl90IGhhbmRsZSkgewotICBQT1JUX1NldEV2ZW50TWFzayhoYW5kbGUsIFBPUlRfRVZfUlhDSEFSKTsKLSAgUE9SVF9TZXRFdmVudENhbGxiYWNrKGhhbmRsZSwgYnRhX2hmX2NsaWVudF9wb3J0X2NiYWNrKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc3RhcnRfc2VydmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXR1cCBSRkNPTU0gc2VydmVyIGZvciB1c2UgYnkgSEYgQ2xpZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X3N0YXJ0X3NlcnZlcigpIHsKLSAgaW50IHBvcnRfc3RhdHVzOwotCi0gIGlmIChidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSA+IDApIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogYWxyZWFkeSBzdGFydGVkLCBoYW5kbGU6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcG9ydF9zdGF0dXMgPSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbldpdGhTZWN1cml0eSgKLSAgICAgIFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRSwgYnRhX2hmX2NsaWVudF9jYl9hcnIuc2NuLCB0cnVlLAotICAgICAgQlRBX0hGX0NMSUVOVF9NVFUsIFJhd0FkZHJlc3M6OmtBbnksICYoYnRhX2hmX2NsaWVudF9jYl9hcnIuc2Vydl9oYW5kbGUpLAotICAgICAgYnRhX2hmX2NsaWVudF9tZ210X2NiYWNrLCBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN0YXJ0ZWQgcmZjb21tIHNlcnZlciB3aXRoIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2JfYXJyLnNlcnZfaGFuZGxlKTsKLQotICBpZiAocG9ydF9zdGF0dXMgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgYnRhX2hmX2NsaWVudF9zZXR1cF9wb3J0KGJ0YV9oZl9jbGllbnRfY2JfYXJyLnNlcnZfaGFuZGxlKTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24gcmV0dXJuZWQgZXJyb3I6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBvcnRfc3RhdHVzKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9jbG9zZV9zZXJ2ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIFJGQ09NTSBzZXJ2ZXIgcG9ydCBmb3IgdXNlIGJ5IEhGIENsaWVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9jbG9zZV9zZXJ2ZXIoKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlZCIsIF9fZnVuY19fLCBidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSk7Ci0KLSAgaWYgKGJ0YV9oZl9jbGllbnRfY2JfYXJyLnNlcnZfaGFuZGxlID09IDApIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogYWxyZWFkeSBzdG9wcGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIFJGQ09NTV9SZW1vdmVTZXJ2ZXIoYnRhX2hmX2NsaWVudF9jYl9hcnIuc2Vydl9oYW5kbGUpOwotICBidGFfaGZfY2xpZW50X2NiX2Fyci5zZXJ2X2hhbmRsZSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3JmY19kb19vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVuIGFuIFJGQ09NTSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9yZmNfZG9fb3Blbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGNiIG5vdCBmb3VuZCBmb3IgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uV2l0aFNlY3VyaXR5KAotICAgICAgICAgIFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRSwgY2xpZW50X2NiLT5wZWVyX3NjbiwgZmFsc2UsCi0gICAgICAgICAgQlRBX0hGX0NMSUVOVF9NVFUsIGNsaWVudF9jYi0+cGVlcl9hZGRyLCAmKGNsaWVudF9jYi0+Y29ubl9oYW5kbGUpLAotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfbWdtdF9jYmFjaywKLSAgICAgICAgICBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCkgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgYnRhX2hmX2NsaWVudF9zZXR1cF9wb3J0KGNsaWVudF9jYi0+Y29ubl9oYW5kbGUpOwotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oZl9jbGllbnRfcmZjX2RvX29wZW4gOiBjb25uX2hhbmRsZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9jYi0+Y29ubl9oYW5kbGUpOwotICB9Ci0gIC8qIFJGQ09NTSBjcmVhdGUgY29ubmVjdGlvbiBmYWlsZWQ7IHNlbmQgb3Vyc2VsdmVzIFJGQ09NTSBjbG9zZSBldmVudCAqLwotICBlbHNlIHsKLSAgICBidGFfaGZfY2xpZW50X3NtX2V4ZWN1dGUoQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0VfRVZULCBwX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3JmY19kb19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgUkZDT01NIGNvbm5lY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfcmZjX2RvX2Nsb3NlKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0KLSAgICAgIGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9oYW5kbGUocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICBpZiAoY2xpZW50X2NiID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogY2Igbm90IGZvdW5kIGZvciBoYW5kbGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY2xpZW50X2NiLT5jb25uX2hhbmRsZSkgewotICAgIFJGQ09NTV9SZW1vdmVDb25uZWN0aW9uKGNsaWVudF9jYi0+Y29ubl9oYW5kbGUpOwotICB9IGVsc2UgewotICAgIC8qIENsb3NlIEFQSSB3YXMgY2FsbGVkIHdoaWxlIEhGIENsaWVudCBpcyBpbiBPcGVuaW5nIHN0YXRlLiAgICAgICAgKi8KLSAgICAvKiBOZWVkIHRvIHRyaWdnZXIgdGhlIHN0YXRlIG1hY2hpbmUgdG8gc2VuZCBjYWxsYmFjayB0byB0aGUgYXBwICAgICovCi0gICAgLyogYW5kIG1vdmUgYmFjayB0byBJTklUIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHRCVEFfSEZfQ0xJRU5UX1JGQyogcF9idWYgPQotICAgICAgICAodEJUQV9IRl9DTElFTlRfUkZDKilvc2lfbWFsbG9jKHNpemVvZih0QlRBX0hGX0NMSUVOVF9SRkMpKTsKLSAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9SRkNfQ0xPU0VfRVZUOwotICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci0KLSAgICAvKiBDYW5jZWwgU0RQIGlmIGl0IGhhZCBiZWVuIHN0YXJ0ZWQuICovCi0gICAgaWYgKGNsaWVudF9jYi0+cF9kaXNjX2RiKSB7Ci0gICAgICAodm9pZClTRFBfQ2FuY2VsU2VydmljZVNlYXJjaChjbGllbnRfY2ItPnBfZGlzY19kYik7Ci0gICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmY2xpZW50X2NiLT5wX2Rpc2NfZGIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3Njby5jYyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zY28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODI0MDIuLjAwMDAwMDAKLS0tIGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3Njby5jYworKysgL2Rldi9udWxsCkBAIC0xLDY3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfTk9fRURSX0VTQ08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjMgfCBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVYzIHwgXAotICAgRVNDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWNSB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpCi0KLWVudW0gewotICBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fRSwKLSAgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9FLCAgICAgICAvKiBvcGVuIHJlcXVlc3QgKi8KLSAgQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0VfRSwgICAgICAvKiBjbG9zZSByZXF1ZXN0ICovCi0gIEJUQV9IRl9DTElFTlRfU0NPX1NIVVRET1dOX0UsICAgLyogc2h1dGRvd24gcmVxdWVzdCAqLwotICBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX09QRU5fRSwgIC8qIFNDTyBvcGVuZWQgKi8KLSAgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FLCAvKiBTQ08gY2xvc2VkICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9yZW1vdmVfc2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgU0NPIGZyb20gdGhlIHN5c3RlbS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wgICAtIHRydWUgaWYgU0NPIHJlbW92YWwgd2FzIHN0YXJ0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgYm9vbCByZW1vdmVkX3N0YXJ0ZWQgPSBmYWxzZTsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChjbGllbnRfY2ItPnNjb19pZHggIT0gQlRNX0lOVkFMSURfU0NPX0lOREVYKSB7Ci0gICAgc3RhdHVzID0gQlRNX1JlbW92ZVNjbyhjbGllbnRfY2ItPnNjb19pZHgpOwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGlkeCAweCUwNHgsIHN0YXR1czoweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjbGllbnRfY2ItPnNjb19pZHgsIHN0YXR1cyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgcmVtb3ZlZF9zdGFydGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgLyogSWYgbm8gY29ubmVjdGlvbiByZXNldCB0aGUgU0NPIGhhbmRsZSAqLwotICAgIGVsc2UgaWYgKChzdGF0dXMgPT0gQlRNX1NVQ0NFU1MpIHx8IChzdGF0dXMgPT0gQlRNX1VOS05PV05fQUREUikpIHsKLSAgICAgIGNsaWVudF9jYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlbW92ZWRfc3RhcnRlZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfY2JhY2tfc2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggU0NPIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2NiYWNrX3Njbyh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLCB1aW50OF90IGV2ZW50KSB7Ci0gIHRCVEFfSEZfQ0xJRU5UIGV2dDsKLQotICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKGV2dCkpOwotICBldnQuYmRfYWRkciA9IGNsaWVudF9jYi0+cGVlcl9hZGRyOwotCi0gIC8qIGNhbGwgYXBwIGNiYWNrICovCi0gIGJ0YV9oZl9jbGllbnRfYXBwX2NhbGxiYWNrKGV2ZW50LCAmZXZ0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5fcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSBTQ08gY29ubmVjdGlvbiByZXF1ZXN0Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3Njb19jb25uX3JzcCh0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9FU0NPX0NPTk5fUkVRX0VWVF9EQVRBKiBwX2RhdGEpIHsKLSAgZW5oX2VzY29fcGFyYW1zX3QgcmVzcDsKLSAgdWludDhfdCBoY2lfc3RhdHVzID0gSENJX1NVQ0NFU1M7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKGNsaWVudF9jYi0+c2NvX3N0YXRlID09IEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVCkgewotICAgIGlmIChwX2RhdGEtPmxpbmtfdHlwZSA9PSBCVE1fTElOS19UWVBFX1NDTykgewotICAgICAgLy8gU0NPCi0gICAgICByZXNwID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhTQ09fQ09ERUNfQ1ZTRF9EMSk7Ci0gICAgfSBlbHNlIGlmIChjbGllbnRfY2ItPm5lZ290aWF0ZWRfY29kZWMgPT0gQlRNX1NDT19DT0RFQ19NU0JDKSB7Ci0gICAgICAvLyBlU0NPIG1TQkMKLSAgICAgIHJlc3AgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKEVTQ09fQ09ERUNfTVNCQ19UMik7Ci0gICAgfSBlbHNlIGlmIChidGFfaGZfY2xpZW50X2NiX2Fyci5mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF9FU0NPX1M0KSB7Ci0gICAgICAvLyBlU0NPIENWU0QsIEhGUCAxLjcgcmVxdWlyZXMgUzQKLSAgICAgIHJlc3AgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKEVTQ09fQ09ERUNfQ1ZTRF9TNCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGVTQ08gQ1ZTRCwgUzMgaXMgcHJlZmVycmVkIGJ5IGRlZmF1bHQoYmVmb3JlIEhGUCAxLjcpCi0gICAgICByZXNwID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhFU0NPX0NPREVDX0NWU0RfUzMpOwotICAgIH0KLQotICAgIC8qIHRlbGwgc3lzIHRvIHN0b3AgYXYgaWYgYW55ICovCi0gICAgYnRhX3N5c19zY29fdXNlKEJUQV9JRF9IUywgMSwgY2xpZW50X2NiLT5wZWVyX2FkZHIpOwotICB9IGVsc2UgewotICAgIGhjaV9zdGF0dXMgPSBIQ0lfRVJSX0hPU1RfUkVKRUNUX0RFVklDRTsKLSAgfQotCi0gIEJUTV9FU2NvQ29ublJzcChwX2RhdGEtPnNjb19pbngsIGhjaV9zdGF0dXMsICZyZXNwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5yZXFfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUTSBlU0NPIGNvbm5lY3Rpb24gcmVxdWVzdHMgYW5kIGVTQ08gY2hhbmdlIHJlcXVlc3RzCi0gKiAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdHMgYXJlIHByb2Nlc3NlZCBieSBCVEEuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfZXNjb19jb25ucmVxX2NiYWNrKHRCVE1fRVNDT19FVlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0VTQ09fRVZUX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X3Njb19oYW5kbGUocF9kYXRhLT5jb25uX2V2dC5zY29faW54KTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIFNDTyBoYW5kbGUgdG8gY29udHJvbCBibG9jayAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5jb25uX2V2dC5zY29faW54KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZXZlbnQgIT0gQlRNX0VTQ09fQ09OTl9SRVFfRVZUKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zY29fY29ubl9yc3AoY2xpZW50X2NiLCAmcF9kYXRhLT5jb25uX2V2dCk7Ci0KLSAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOSU5HX1NUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY29ubl9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRNIFNDTyBjb25uZWN0aW9uIGNhbGxiYWNrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fY29ubl9jYmFjayh1aW50MTZfdCBzY29faWR4KSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlZCIsIF9fZnVuY19fLCBzY29faWR4KTsKLQotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0gYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X3Njb19oYW5kbGUoc2NvX2lkeCk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBTQ08gaGFuZGxlIHRvIGNvbnRyb2wgYmxvY2sgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHNjb19pZHgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9FVlQ7Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGNsaWVudF9jYi0+aGFuZGxlOwotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fZGlzY19jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRNIFNDTyBkaXNjb25uZWN0aW9uIGNhbGxiYWNrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hmX2NsaWVudF9zY29fZGlzY19jYmFjayh1aW50MTZfdCBzY29faWR4KSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzY29faWR4ICVkIiwgX19mdW5jX18sIHNjb19pZHgpOwotCi0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPSBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfc2NvX2hhbmRsZShzY29faWR4KTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGhhbmRsZSB0byBjb250cm9sIGJsb2NrICVkIiwgX19mdW5jX18sIHNjb19pZHgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0VfRVZUOwotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBjbGllbnRfY2ItPmhhbmRsZTsKLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfY3JlYXRlX3NjbwotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX29yaWcpIHsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAlZCIsIF9fZnVuY19fLCBpc19vcmlnKTsKLQotICAvKiBNYWtlIHN1cmUgdGhpcyBTQ08gaGFuZGxlIGlzIG5vdCBhbHJlYWR5IGluIHVzZSAqLwotICBpZiAoY2xpZW50X2NiLT5zY29faWR4ICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEluZGV4IDB4JTA0eCBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfY2ItPnNjb19pZHgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNvZGVjIHBhcmFtZXRlcnMKLSAgZW5oX2VzY29fcGFyYW1zX3QgcGFyYW1zOwotICAvLyBTaW5jZSBIRiBkZXZpY2UgaXMgbm90IGV4cGVjdGVkIHRvIHJlY2VpdmUgQVQrQkFDIHNlbmQgK0JDUyBjb21tYW5kLAotICAvLyBjb2RlYyBzdXBwb3J0IG9mIHRoZSBjb25uZWN0ZWQgQUcgZGV2aWNlIHdpbGwgYmUgdW5rbm93biwKLSAgLy8gc28gSEYgZGV2aWNlIHdpbGwgYWx3YXlzIGVzdGFibGlzaCBvbmx5IENWU0QgY29ubmVjdGlvbi4KLSAgaWYgKChidGFfaGZfY2xpZW50X2NiX2Fyci5mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF9FU0NPX1M0KSAmJgotICAgICAgKGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfUEVFUl9FU0NPX1M0KSkgewotICAgIC8vIGVTQ08gQ1ZTRCwgSEZQIDEuNyByZXF1aXJlcyBTNAotICAgIHBhcmFtcyA9IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMoRVNDT19DT0RFQ19DVlNEX1M0KTsKLSAgfSBlbHNlIHsKLSAgICAvLyBlU0NPIENWU0QsIFMzIGlzIHByZWZlcnJlZCBieSBkZWZhdWx0KGJlZm9yZSBIRlAgMS43KQotICAgIHBhcmFtcyA9IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMoRVNDT19DT0RFQ19DVlNEX1MzKTsKLSAgfQotCi0gIC8qIGlmIGluaXRpYXRpbmcgc2V0IGN1cnJlbnQgc2NiIGFuZCBwZWVyIGJkIGFkZHIgKi8KLSAgaWYgKGlzX29yaWcpIHsKLSAgICBCVE1fU2V0RVNjb01vZGUoJnBhcmFtcyk7Ci0gICAgLyogdGVsbCBzeXMgdG8gc3RvcCBhdiBpZiBhbnkgKi8KLSAgICBidGFfc3lzX3Njb191c2UoQlRBX0lEX0hTLCAxLCBjbGllbnRfY2ItPnBlZXJfYWRkcik7Ci0gIH0KLQotICBzdGF0dXMgPSBCVE1fQ3JlYXRlU2NvKCZjbGllbnRfY2ItPnBlZXJfYWRkciwgaXNfb3JpZywgcGFyYW1zLnBhY2tldF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50X2NiLT5zY29faWR4LCBidGFfaGZfY2xpZW50X3Njb19jb25uX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2Rpc2NfY2JhY2spOwotICBpZiAoc3RhdHVzID09IEJUTV9DTURfU1RBUlRFRCAmJiAhaXNfb3JpZykgewotICAgIGlmICghQlRNX1JlZ0ZvckVTY29FdnRzKGNsaWVudF9jYi0+c2NvX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGZfY2xpZW50X2VzY29fY29ubnJlcV9jYmFjaykpCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU0NPIHJlZ2lzdHJhdGlvbiBzdWNjZXNzIiwgX19mdW5jX18pOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9BUEkoIiVzOiBvcmlnICVkLCBpbnggMHglMDR4LCBzdGF0dXMgMHgleCwgcGt0IHR5cGVzIDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpc19vcmlnLCBjbGllbnRfY2ItPnNjb19pZHgsIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgcGFyYW1zLnBhY2tldF90eXBlcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3Njb19ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIFNDTyBldmVudHMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2V2ZW50KHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV2ZW50KSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBiZWZvcmUgc3RhdGU6ICVkIGV2ZW50OiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlLCBldmVudCk7Ci0KLSAgc3dpdGNoIChjbGllbnRfY2ItPnNjb19zdGF0ZSkgewotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIC8vIEZvciBXQlMgd2Ugb25seSBsaXN0ZW4gdG8gU0NPIHJlcXVlc3RzLiBFdmVuIGZvciBvdXRnb2luZyBTQ08KLSAgICAgICAgLy8gcmVxdWVzdHMgd2UgZmlyc3QgZG8gYSBBVCtCQ0MgYW5kIHdhaXQgZm9yIHJlbW90ZSB0byBpbml0aWF0ZSBTQ08KLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fRToKLSAgICAgICAgICAvKiBjcmVhdGUgU0NPIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKGNsaWVudF9jYiwgZmFsc2UpOwotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIEZvciBub24gV0JTIGNhc2VzIGFuZCBlbmFibGluZyBvdXRnb2luZyBTQ08gcmVxdWVzdHMgd2UgbmVlZCB0byBmb3JjZQotICAgICAgICAvLyBvcGVuIGEgU0NPIGNoYW5uZWwKLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX0U6Ci0gICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKGNsaWVudF9jYik7Ci0KLSAgICAgICAgICAvKiBjcmVhdGUgU0NPIGNvbm5lY3Rpb24gdG8gcGVlciAqLwotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShjbGllbnRfY2IsIHRydWUpOwotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fT1BFTklOR19TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fRToKLSAgICAgICAgICAvKiBjcmVhdGUgU0NPIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKGNsaWVudF9jYiwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9FOgotICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZShjbGllbnRfY2IpOwotCi0gICAgICAgICAgLyogY3JlYXRlIFNDTyBjb25uZWN0aW9uIHRvIHBlZXIgKi8KLSAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoY2xpZW50X2NiLCB0cnVlKTsKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX09QRU5JTkdfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9FOgotICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZShjbGllbnRfY2IpOwotCi0gICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fQ0xPU0VfRToKLSAgICAgICAgICAvKiBTQ08gZmFpbGVkOyBjcmVhdGUgU0NPIGxpc3RlbiBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fY3JlYXRlKGNsaWVudF9jYiwgZmFsc2UpOwotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fTElTVEVOX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiJXM6IEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVDogSWdub3JpbmcgZXZlbnQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX09QRU5JTkdfU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0VfRToKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX09QRU5fQ0xfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9FOgotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fU0hVVFRJTkdfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX09QRU5fRToKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX09QRU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX0NMT1NFX0U6Ci0gICAgICAgICAgLyogU0NPIGZhaWxlZDsgY3JlYXRlIFNDTyBsaXN0ZW4gY29ubmVjdGlvbiAqLwotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShjbGllbnRfY2IsIGZhbHNlKTsKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiQlRBX0hGX0NMSUVOVF9TQ09fT1BFTklOR19TVDogSWdub3JpbmcgZXZlbnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9DTF9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX0U6Ci0gICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fRToKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX1NIVVRUSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9PUEVOX0U6Ci0gICAgICAgICAgLyogY2xvc2UgU0NPIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoY2xpZW50X2NiKTsKLQotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0lOR19TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fQ0xPU0VfRToKLSAgICAgICAgICAvKiBTQ08gZmFpbGVkOyBjcmVhdGUgU0NPIGxpc3RlbiBjb25uZWN0aW9uICovCi0KLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9DTF9TVDogSWdub3JpbmcgZXZlbnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TRV9FOgotICAgICAgICAgIGlmIChidGFfaGZfY2xpZW50X3Njb19yZW1vdmUoY2xpZW50X2NiKSkgewotICAgICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TSU5HX1NUOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX1NIVVRET1dOX0U6Ci0gICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCi0gICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fcmVtb3ZlKGNsaWVudF9jYik7Ci0KLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX1NIVVRUSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FOgotICAgICAgICAgIC8qIHBlZXIgY2xvc2VkIFNDTyAqLwotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2NyZWF0ZShjbGllbnRfY2IsIGZhbHNlKTsKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX0xJU1RFTl9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9TVDogSWdub3JpbmcgZXZlbnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0lOR19TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19PUEVOX0U6Ci0gICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TRV9PUF9TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX1NIVVRET1dOX0U6Ci0gICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVUVElOR19TVDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NPTk5fQ0xPU0VfRToKLSAgICAgICAgICAvKiBwZWVyIGNsb3NlZCBzY287IGNyZWF0ZSBTQ08gbGlzdGVuIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoY2xpZW50X2NiLCBmYWxzZSk7Ci0gICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQV9IRl9DTElFTlRfU0NPX0NMT1NJTkdfU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NMT1NFX09QX1NUOgotICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEJUQV9IRl9DTElFTlRfU0NPX0NMT1NFX0U6Ci0gICAgICAgICAgY2xpZW50X2NiLT5zY29fc3RhdGUgPSBCVEFfSEZfQ0xJRU5UX1NDT19DTE9TSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fRToKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX1NIVVRUSU5HX1NUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FOgotICAgICAgICAgIC8qIG9wZW4gU0NPIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jcmVhdGUoY2xpZW50X2NiLCB0cnVlKTsKLSAgICAgICAgICBjbGllbnRfY2ItPnNjb19zdGF0ZSA9IEJUQV9IRl9DTElFTlRfU0NPX09QRU5JTkdfU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQV9IRl9DTElFTlRfU0NPX0NMT1NFX09QX1NUOiBJZ25vcmluZyBldmVudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVUVElOR19TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX09QRU5fRToKLSAgICAgICAgICAvKiBjbG9zZSBTQ08gY29ubmVjdGlvbjsgd2FpdCBmb3IgY29ubiBjbG9zZSBldmVudCAqLwotICAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX3JlbW92ZShjbGllbnRfY2IpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FOgotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9FOgotICAgICAgICAgIGNsaWVudF9jYi0+c2NvX3N0YXRlID0gQlRBX0hGX0NMSUVOVF9TQ09fU0hVVERPV05fU1Q7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIkJUQV9IRl9DTElFTlRfU0NPX1NIVVRUSU5HX1NUOiBJZ25vcmluZyBldmVudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGFmdGVyIHN0YXRlOiAlZCIsIF9fZnVuY19fLCBjbGllbnRfY2ItPnNjb19zdGF0ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3Njb19saXN0ZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemUgU0NPIGxpc3RlbmVyCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2xpc3Rlbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGhhbmRsZSB0byBjb250cm9sIGJsb2NrICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zY29fZXZlbnQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX1NDT19MSVNURU5fRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3Njb19zaHV0ZG93bgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfc2NvX3NodXRkb3duKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRhX2hmX2NsaWVudF9zY29fZXZlbnQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX1NDT19TSFVURE9XTl9FKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5fb3BlbgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfc2NvX2Nvbm5fb3Blbih0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGhhbmRsZSB0byBjb250cm9sIGJsb2NrICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2hmX2NsaWVudF9zY29fZXZlbnQoY2xpZW50X2NiLCBCVEFfSEZfQ0xJRU5UX1NDT19DT05OX09QRU5fRSk7Ci0KLSAgYnRhX3N5c19zY29fb3BlbihCVEFfSURfSFMsIDEsIGNsaWVudF9jYi0+cGVlcl9hZGRyKTsKLQotICBpZiAoY2xpZW50X2NiLT5uZWdvdGlhdGVkX2NvZGVjID09IEJUTV9TQ09fQ09ERUNfTVNCQykgewotICAgIGJ0YV9oZl9jbGllbnRfY2JhY2tfc2NvKGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9BVURJT19NU0JDX09QRU5fRVZUKTsKLSAgfSBlbHNlIHsKLSAgICBidGFfaGZfY2xpZW50X2NiYWNrX3NjbyhjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVVESU9fT1BFTl9FVlQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X3Njb19jb25uX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9zY29fY29ubl9jbG9zZSh0QlRBX0hGX0NMSUVOVF9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgdEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYiA9Ci0gICAgICBidGFfaGZfY2xpZW50X2ZpbmRfY2JfYnlfaGFuZGxlKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGhhbmRsZSB0byBjb250cm9sIGJsb2NrICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogY2xlYXIgY3VycmVudCBzY2IgKi8KLSAgY2xpZW50X2NiLT5zY29faWR4ID0gQlRNX0lOVkFMSURfU0NPX0lOREVYOwotCi0gIGJ0YV9oZl9jbGllbnRfc2NvX2V2ZW50KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9TQ09fQ09OTl9DTE9TRV9FKTsKLQotICBidGFfc3lzX3Njb19jbG9zZShCVEFfSURfSFMsIDEsIGNsaWVudF9jYi0+cGVlcl9hZGRyKTsKLQotICBidGFfc3lzX3Njb191bnVzZShCVEFfSURfSFMsIDEsIGNsaWVudF9jYi0+cGVlcl9hZGRyKTsKLQotICAvKiBjYWxsIGFwcCBjYWxsYmFjayAqLwotICBidGFfaGZfY2xpZW50X2NiYWNrX3NjbyhjbGllbnRfY2IsIEJUQV9IRl9DTElFTlRfQVVESU9fQ0xPU0VfRVZUKTsKLQotICBpZiAoY2xpZW50X2NiLT5zY29fY2xvc2VfcmZjKSB7Ci0gICAgY2xpZW50X2NiLT5zY29fY2xvc2VfcmZjID0gZmFsc2U7Ci0gICAgYnRhX2hmX2NsaWVudF9yZmNfZG9fY2xvc2UocF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zY29fb3BlbgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfc2NvX29wZW4odEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBoYW5kbGUgdG8gY29udHJvbCBibG9jayAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9oZl9jbGllbnRfc2NvX2V2ZW50KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9TQ09fT1BFTl9FKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oZl9jbGllbnRfc2NvX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9zY29fY2xvc2UodEJUQV9IRl9DTElFTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBoYW5kbGUgdG8gY29udHJvbCBibG9jayAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzY29faWR4IDB4JXgiLCBfX2Z1bmNfXywgY2xpZW50X2NiLT5zY29faWR4KTsKLQotICBpZiAoY2xpZW50X2NiLT5zY29faWR4ICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkgewotICAgIGJ0YV9oZl9jbGllbnRfc2NvX2V2ZW50KGNsaWVudF9jYiwgQlRBX0hGX0NMSUVOVF9TQ09fQ0xPU0VfRSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuY2MgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfc2RwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NmI3YTZkLi4wMDAwMDAwCi0tLSBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhdWRpbyBnYXRld2F5IGZ1bmN0aW9ucyBwZXJmb3JtaW5nIFNEUAotICogIG9wZXJhdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfaW50LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FnX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotLyogTnVtYmVyIG9mIHByb3RvY29sIGVsZW1lbnRzIGluIHByb3RvY29sIGVsZW1lbnQgbGlzdC4gKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9OVU1fUFJPVE9fRUxFTVMgMgotCi0vKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc2VydmljZSBjbGFzcyBpZCBsaXN0LiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX05VTV9TVkNfRUxFTVMgMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zZHBfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNEUCBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfc2RwX2NiYWNrKHRTRFBfU1RBVFVTIHN0YXR1cywgY29uc3Qgdm9pZCogZGF0YSkgewotICB1aW50MTZfdCBldmVudDsKLSAgdEJUQV9IRl9DTElFTlRfRElTQ19SRVNVTFQqIHBfYnVmID0gKHRCVEFfSEZfQ0xJRU5UX0RJU0NfUkVTVUxUKilvc2lfbWFsbG9jKAotICAgICAgc2l6ZW9mKHRCVEFfSEZfQ0xJRU5UX0RJU0NfUkVTVUxUKSk7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hmX2NsaWVudF9zZHBfY2JhY2sgc3RhdHVzOjB4JXgiLCBzdGF0dXMpOwotICB0QlRBX0hGX0NMSUVOVF9DQiogY2xpZW50X2NiID0gKHRCVEFfSEZfQ0xJRU5UX0NCKilkYXRhOwotCi0gIC8qIHNldCBldmVudCBhY2NvcmRpbmcgdG8gaW50L2FjcCAqLwotICBpZiAoY2xpZW50X2NiLT5yb2xlID09IEJUQV9IRl9DTElFTlRfQUNQKQotICAgIGV2ZW50ID0gQlRBX0hGX0NMSUVOVF9ESVNDX0FDUF9SRVNfRVZUOwotICBlbHNlCi0gICAgZXZlbnQgPSBCVEFfSEZfQ0xJRU5UX0RJU0NfSU5UX1JFU19FVlQ7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IGV2ZW50OwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gY2xpZW50X2NiLT5oYW5kbGU7Ci0gIHBfYnVmLT5zdGF0dXMgPSBzdGF0dXM7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIHNlcnZlciBhcHBsaWNhdGlvbiB0byBhZGQKLSAqICAgICAgICAgICAgICAgICAgSEZQIENsaWVudCBpbmZvcm1hdGlvbiB0byBhbiBTRFAgcmVjb3JkLiAgUHJpb3IgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgU0RQX0NyZWF0ZVJlY29yZCgpIHRvIGNyZWF0ZSBhbiBTRFAgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBmdW5jdGlvbiBleGVjdXRpb24gc3VjY2VlZGVkLAotICogICAgICAgICAgICAgICAgICBmYWxzZSBpZiBmdW5jdGlvbiBleGVjdXRpb24gZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkKGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lLCB1aW50OF90IHNjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UX0ZFQVQgZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlKSB7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwcm90b19lbGVtX2xpc3RbQlRBX0hGX0NMSUVOVF9OVU1fUFJPVE9fRUxFTVNdOwotICB1aW50MTZfdCBzdmNfY2xhc3NfaWRfbGlzdFtCVEFfSEZfQ0xJRU5UX05VTV9TVkNfRUxFTVNdOwotICB1aW50MTZfdCBicm93c2VfbGlzdFtdID0ge1VVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVB9OwotICB1aW50MTZfdCB2ZXJzaW9uOwotICB1aW50MTZfdCBwcm9maWxlX3V1aWQ7Ci0gIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKLSAgdWludDhfdCBidWZbMl07Ci0gIHVpbnQxNl90IHNkcF9mZWF0dXJlcyA9IDA7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkIik7Ci0KLSAgbWVtc2V0KHByb3RvX2VsZW1fbGlzdCwgMCwKLSAgICAgICAgIEJUQV9IRl9DTElFTlRfTlVNX1BST1RPX0VMRU1TICogc2l6ZW9mKHRTRFBfUFJPVE9DT0xfRUxFTSkpOwotCi0gIC8qIGFkZCB0aGUgcHJvdG9jb2wgZWxlbWVudCBzZXF1ZW5jZSAqLwotICBwcm90b19lbGVtX2xpc3RbMF0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfTDJDQVA7Ci0gIHByb3RvX2VsZW1fbGlzdFswXS5udW1fcGFyYW1zID0gMDsKLSAgcHJvdG9fZWxlbV9saXN0WzFdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX1JGQ09NTTsKLSAgcHJvdG9fZWxlbV9saXN0WzFdLm51bV9wYXJhbXMgPSAxOwotICBwcm90b19lbGVtX2xpc3RbMV0ucGFyYW1zWzBdID0gc2NuOwotICByZXN1bHQgJj0gU0RQX0FkZFByb3RvY29sTGlzdChzZHBfaGFuZGxlLCBCVEFfSEZfQ0xJRU5UX05VTV9QUk9UT19FTEVNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fZWxlbV9saXN0KTsKLQotICAvKiBhZGQgc2VydmljZSBjbGFzcyBpZCBsaXN0ICovCi0gIHN2Y19jbGFzc19pZF9saXN0WzBdID0gVVVJRF9TRVJWQ0xBU1NfSEZfSEFORFNGUkVFOwotICBzdmNfY2xhc3NfaWRfbGlzdFsxXSA9IFVVSURfU0VSVkNMQVNTX0dFTkVSSUNfQVVESU87Ci0gIHJlc3VsdCAmPSBTRFBfQWRkU2VydmljZUNsYXNzSWRMaXN0KHNkcF9oYW5kbGUsIEJUQV9IRl9DTElFTlRfTlVNX1NWQ19FTEVNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjX2NsYXNzX2lkX2xpc3QpOwotCi0gIC8qIGFkZCBwcm9maWxlIGRlc2NyaXB0b3IgbGlzdCAqLwotICBwcm9maWxlX3V1aWQgPSBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUU7Ci0gIHZlcnNpb24gPSBCVEFfSEZQX1ZFUlNJT047Ci0KLSAgcmVzdWx0ICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3Qoc2RwX2hhbmRsZSwgcHJvZmlsZV91dWlkLCB2ZXJzaW9uKTsKLQotICAvKiBhZGQgc2VydmljZSBuYW1lICovCi0gIGlmIChwX3NlcnZpY2VfbmFtZSAhPSBOVUxMICYmIHBfc2VydmljZV9uYW1lWzBdICE9IDApIHsKLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZSgKLSAgICAgICAgc2RwX2hhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX05BTUUsIFRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9zZXJ2aWNlX25hbWUpICsgMSksICh1aW50OF90KilwX3NlcnZpY2VfbmFtZSk7Ci0gIH0KLQotICAvKiBhZGQgZmVhdHVyZXMgKi8KLSAgaWYgKGZlYXR1cmVzICYgQlRBX0hGX0NMSUVOVF9GRUFUX0VDTlIpCi0gICAgc2RwX2ZlYXR1cmVzIHw9IEJUQV9IRl9DTElFTlRfRkVBVF9FQ05SOwotCi0gIGlmIChmZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF8zV0FZKQotICAgIHNkcF9mZWF0dXJlcyB8PSBCVEFfSEZfQ0xJRU5UX0ZFQVRfM1dBWTsKLQotICBpZiAoZmVhdHVyZXMgJiBCVEFfSEZfQ0xJRU5UX0ZFQVRfQ0xJKSBzZHBfZmVhdHVyZXMgfD0gQlRBX0hGX0NMSUVOVF9GRUFUX0NMSTsKLQotICBpZiAoZmVhdHVyZXMgJiBCVEFfSEZfQ0xJRU5UX0ZFQVRfVlJFQykKLSAgICBzZHBfZmVhdHVyZXMgfD0gQlRBX0hGX0NMSUVOVF9GRUFUX1ZSRUM7Ci0KLSAgaWYgKGZlYXR1cmVzICYgQlRBX0hGX0NMSUVOVF9GRUFUX1ZPTCkgc2RwX2ZlYXR1cmVzIHw9IEJUQV9IRl9DTElFTlRfRkVBVF9WT0w7Ci0KLSAgLyogQ29kZWMgYml0IHBvc2l0aW9uIGlzIGRpZmZlcmVudCBpbiBTRFAgKGJpdCA1KSBhbmQgaW4gQlJTRiAoYml0IDcpICovCi0gIGlmIChmZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF9DT0RFQykgc2RwX2ZlYXR1cmVzIHw9IDB4MDAyMDsKLQotICBVSU5UMTZfVE9fQkVfRklFTEQoYnVmLCBzZHBfZmVhdHVyZXMpOwotICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsIDIsIGJ1Zik7Ci0KLSAgLyogYWRkIGJyb3dzZSBncm91cCBsaXN0ICovCi0gIHJlc3VsdCAmPSBTRFBfQWRkVXVpZFNlcXVlbmNlKHNkcF9oYW5kbGUsIEFUVFJfSURfQlJPV1NFX0dST1VQX0xJU1QsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZV9saXN0KTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9jcmVhdGVfcmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGUgU0RQIHJlY29yZCBmb3IgcmVnaXN0ZXJlZCBzZXJ2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGZfY2xpZW50X2NyZWF0ZV9yZWNvcmQodEJUQV9IRl9DTElFTlRfQ0JfQVJSKiBjbGllbnRfY2JfYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcF9zZXJ2aWNlX25hbWUpIHsKLSAgLyogYWRkIHNkcCByZWNvcmQgaWYgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCAqLwotICBpZiAoY2xpZW50X2NiX2Fyci0+c2RwX2hhbmRsZSA9PSAwKSB7Ci0gICAgY2xpZW50X2NiX2Fyci0+c2RwX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgICBjbGllbnRfY2JfYXJyLT5zY24gPSBCVE1fQWxsb2NhdGVTQ04oKTsKLSAgICBidGFfaGZfY2xpZW50X2FkZF9yZWNvcmQocF9zZXJ2aWNlX25hbWUsIGNsaWVudF9jYl9hcnItPnNjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2NiX2Fyci0+ZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9jYl9hcnItPnNkcF9oYW5kbGUpOwotCi0gICAgYnRhX3N5c19hZGRfdXVpZChVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2RlbF9yZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlbGV0ZSBTRFAgcmVjb3JkIGZvciByZWdpc3RlcmVkIHNlcnZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oZl9jbGllbnRfZGVsX3JlY29yZCh0QlRBX0hGX0NMSUVOVF9DQl9BUlIqIGNsaWVudF9jYikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoY2xpZW50X2NiLT5zZHBfaGFuZGxlICE9IDApIHsKLSAgICBTRFBfRGVsZXRlUmVjb3JkKGNsaWVudF9jYi0+c2RwX2hhbmRsZSk7Ci0gICAgY2xpZW50X2NiLT5zZHBfaGFuZGxlID0gMDsKLSAgICBCVE1fRnJlZVNDTihjbGllbnRfY2ItPnNjbik7Ci0gICAgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQoY2xpZW50X2NiLT5zY24pOwotICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfSEZfSEFORFNGUkVFKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9zZHBfZmluZF9hdHRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIFNEUCBkaXNjb3ZlcnkgcmVzdWx0cyB0byBmaW5kIHJlcXVlc3RlZCBhdHRyaWJ1dGUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHJlc3VsdHMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfaGZfY2xpZW50X3NkcF9maW5kX2F0dHIodEJUQV9IRl9DTElFTlRfQ0IqIGNsaWVudF9jYikgewotICB0U0RQX0RJU0NfUkVDKiBwX3JlYyA9IE5VTEw7Ci0gIHRTRFBfRElTQ19BVFRSKiBwX2F0dHI7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLSAgYm9vbCByZXN1bHQgPSBmYWxzZTsKLQotICBjbGllbnRfY2ItPnBlZXJfdmVyc2lvbiA9IEhGUF9WRVJTSU9OXzFfMTsgLyogRGVmYXVsdCB2ZXJzaW9uICovCi0KLSAgLyogbG9vcCB0aHJvdWdoIGFsbCByZWNvcmRzIHdlIGZvdW5kICovCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLyogZ2V0IG5leHQgcmVjb3JkOyBpZiBub25lIGZvdW5kLCB3ZSdyZSBkb25lICovCi0gICAgcF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKGNsaWVudF9jYi0+cF9kaXNjX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUsIHBfcmVjKTsKLSAgICBpZiAocF9yZWMgPT0gTlVMTCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogZ2V0IHNjbiBmcm9tIHByb3RvIGRlc2MgbGlzdCBpZiBpbml0aWF0b3IgKi8KLSAgICBpZiAoY2xpZW50X2NiLT5yb2xlID09IEJUQV9IRl9DTElFTlRfSU5UKSB7Ci0gICAgICBpZiAoU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9yZWMsIFVVSURfUFJPVE9DT0xfUkZDT01NLCAmcGUpKSB7Ci0gICAgICAgIGNsaWVudF9jYi0+cGVlcl9zY24gPSAodWludDhfdClwZS5wYXJhbXNbMF07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBnZXQgcHJvZmlsZSB2ZXJzaW9uIChpZiBmYWlsdXJlLCB2ZXJzaW9uIHBhcmFtZXRlciBpcyBub3QgdXBkYXRlZCkgKi8KLSAgICBTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMocF9yZWMsIFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudF9jYi0+cGVlcl92ZXJzaW9uKTsKLQotICAgIC8qIGdldCBmZWF0dXJlcyAqLwotICAgIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTKTsKLSAgICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICAgIC8qIEZvdW5kIGF0dHJpYnV0ZS4gR2V0IHZhbHVlLiAqLwotICAgICAgLyogVGhlcmUgbWlnaHQgYmUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBTRFAgYW5kIEJSU0YuICAqLwotICAgICAgLyogRG8gbm90IHVwZGF0ZSBpZiB3ZSBhbHJlYWR5IHJlY2VpdmVkIEJSU0YuICAgICAgICAgICAqLwotICAgICAgaWYgKGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyA9PSAwKSB7Ci0gICAgICAgIGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLQotICAgICAgICAvKiBTRFAgYW5kIEJSU0YgV0JTIGJpdCBhcmUgZGlmZmVyZW50LCBjb3JyZWN0IGl0IGlmIHNldCAqLwotICAgICAgICBpZiAoY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzICYgMHgwMDIwKSB7Ci0gICAgICAgICAgY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzICY9IH4weDAwMjA7Ci0gICAgICAgICAgY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzIHw9IEJUQV9IRl9DTElFTlRfUEVFUl9DT0RFQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGdldCBuZXR3b3JrIGZvciBhYmlsaXR5IHRvIHJlamVjdCBjYWxscyAqLwotICAgICAgICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX05FVFdPUkspOwotICAgICAgICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICAgICAgICBpZiAocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2ID09IDB4MDEpIHsKLSAgICAgICAgICAgIGNsaWVudF9jYi0+cGVlcl9mZWF0dXJlcyB8PSBCVEFfSEZfQ0xJRU5UX1BFRVJfUkVKRUNUOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGZvdW5kIHdoYXQgd2UgbmVlZGVkICovCi0gICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICBicmVhazsKLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyX3ZlcnNpb249MHgleCBwZWVyX2ZlYXR1cmVzPTB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBjbGllbnRfY2ItPnBlZXJfdmVyc2lvbiwgY2xpZW50X2NiLT5wZWVyX2ZlYXR1cmVzKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9kb19kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEbyBzZXJ2aWNlIGRpc2NvdmVyeS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9kb19kaXNjKHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IpIHsKLSAgVXVpZCB1dWlkX2xpc3RbMV07Ci0gIHVpbnQxNl90IG51bV91dWlkID0gMTsKLSAgdWludDE2X3QgYXR0cl9saXN0WzRdOwotICB1aW50OF90IG51bV9hdHRyOwotICBib29sIGRiX2luaXRlZCA9IGZhbHNlOwotCi0gIC8qIGluaXRpYXRvcjsgZ2V0IHByb3RvIGxpc3QgYW5kIGZlYXR1cmVzICovCi0gIGlmIChjbGllbnRfY2ItPnJvbGUgPT0gQlRBX0hGX0NMSUVOVF9JTlQpIHsKLSAgICBhdHRyX2xpc3RbMF0gPSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVDsKLSAgICBhdHRyX2xpc3RbMV0gPSBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVDsKLSAgICBhdHRyX2xpc3RbMl0gPSBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNUOwotICAgIGF0dHJfbGlzdFszXSA9IEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTOwotICAgIG51bV9hdHRyID0gNDsKLSAgICB1dWlkX2xpc3RbMF0gPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFKTsKLSAgfQotICAvKiBhY2NlcHRvcjsgZ2V0IGZlYXR1cmVzICovCi0gIGVsc2UgewotICAgIGF0dHJfbGlzdFswXSA9IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUOwotICAgIGF0dHJfbGlzdFsxXSA9IEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1Q7Ci0gICAgYXR0cl9saXN0WzJdID0gQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVM7Ci0gICAgbnVtX2F0dHIgPSAzOwotICAgIHV1aWRfbGlzdFswXSA9IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUpOwotICB9Ci0KLSAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciBzZHAgZGF0YWJhc2UgKi8KLSAgY2xpZW50X2NiLT5wX2Rpc2NfZGIgPSAodFNEUF9ESVNDT1ZFUllfREIqKW9zaV9tYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0KLSAgLyogc2V0IHVwIHNlcnZpY2UgZGlzY292ZXJ5IGRhdGFiYXNlOyBhdHRyIGhhcHBlbnMgdG8gYmUgYXR0cl9saXN0IGxlbiAqLwotICBkYl9pbml0ZWQgPSBTRFBfSW5pdERpc2NvdmVyeURiKGNsaWVudF9jYi0+cF9kaXNjX2RiLCBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV91dWlkLCB1dWlkX2xpc3QsIG51bV9hdHRyLCBhdHRyX2xpc3QpOwotCi0gIGlmIChkYl9pbml0ZWQpIHsKLSAgICAvKlNlcnZpY2UgZGlzY292ZXJ5IG5vdCBpbml0aWF0ZWQgKi8KLSAgICBkYl9pbml0ZWQgPSBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QyKAotICAgICAgICBjbGllbnRfY2ItPnBlZXJfYWRkciwgY2xpZW50X2NiLT5wX2Rpc2NfZGIsIGJ0YV9oZl9jbGllbnRfc2RwX2NiYWNrLAotICAgICAgICAodm9pZCopY2xpZW50X2NiKTsKLSAgfQotCi0gIGlmICghZGJfaW5pdGVkKSB7Ci0gICAgLypmcmVlIGRpc2NvdmVyIGRiICovCi0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmNsaWVudF9jYi0+cF9kaXNjX2RiKTsKLSAgICAvKiBzZW50IGZhaWxlZCBldmVudCAqLwotICAgIHRCVEFfSEZfQ0xJRU5UX0RBVEEgbXNnOwotICAgIG1zZy5oZHIubGF5ZXJfc3BlY2lmaWMgPSBjbGllbnRfY2ItPmhhbmRsZTsKLSAgICBidGFfaGZfY2xpZW50X3NtX2V4ZWN1dGUoQlRBX0hGX0NMSUVOVF9ESVNDX0ZBSUxfRVZULCAmbXNnKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hmX2NsaWVudF9mcmVlX2RiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlIGRpc2NvdmVyeSBkYXRhYmFzZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hmX2NsaWVudF9mcmVlX2RiKHRCVEFfSEZfQ0xJRU5UX0RBVEEqIHBfZGF0YSkgewotICBDSEVDSyhwX2RhdGEgIT0gTlVMTCk7Ci0gIHRCVEFfSEZfQ0xJRU5UX0NCKiBjbGllbnRfY2IgPQotICAgICAgYnRhX2hmX2NsaWVudF9maW5kX2NiX2J5X2hhbmRsZShwX2RhdGEtPmhkci5sYXllcl9zcGVjaWZpYyk7Ci0gIGlmIChjbGllbnRfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYiBub3QgZm91bmQgZm9yIGhhbmRsZSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZjbGllbnRfY2ItPnBfZGlzY19kYik7Ci19CmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX2FjdC5jYyBiL2J0YS9oaC9idGFfaGhfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjEzMWEyLi4wMDAwMDAwCi0tLSBhL2J0YS9oaC9idGFfaGhfYWN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA1LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSElEIGhvc3QgYWN0aW9uIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aCIKLQotLy8gQlRBX0hIX0lOQ0xVREVECi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJidGEvaGgvYnRhX2hoX2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oaF9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGhfY28uaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGlkZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGlkaF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1uYW1lc3BhY2UgewotCi1jb25zdGV4cHIgY2hhciBrQnRtTG9nVGFnW10gPSAiSElESCI7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTG9jYWwgRnVuY3Rpb24gcHJvdG90eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfY2JhY2sodWludDhfdCBkZXZfaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXZlbnQsIHVpbnQzMl90IGRhdGEsIEJUX0hEUiogcGRhdGEpOwotc3RhdGljIHRCVEFfSEhfU1RBVFVTIGJ0YV9oaF9nZXRfdHJhbnNfc3RhdHVzKHVpbnQzMl90IHJlc3VsdCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfaGhfZ2V0X3c0X2V2ZW50KHVpbnQxNl90IGV2ZW50KTsKLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfaGhfaGlkX2V2ZW50X25hbWUodWludDE2X3QgZXZlbnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBBY3Rpb24gRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfYXBpX2VuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUGVyZm9ybSBuZWNlc3Nhcnkgb3BlcmF0aW9ucyB0byBlbmFibGUgSElEIGhvc3QuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9hcGlfZW5hYmxlKGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEhfU1RBVFVTIHN0YXR1cyA9IEJUQV9ISF9FUlI7Ci0gIHVpbnQ4X3QgeHg7Ci0KLSAgLyogaW5pdGlhbGl6ZSBCVEUgSElEICovCi0gIEhJRF9Ib3N0SW5pdCgpOwotCi0gIG1lbXNldCgmYnRhX2hoX2NiLCAwLCBzaXplb2YodEJUQV9ISF9DQikpOwotCi0gIC8qIFJlZ2lzdGVyIHdpdGggTDJDQVAgKi8KLSAgaWYgKEhJRF9Ib3N0UmVnaXN0ZXIoYnRhX2hoX2NiYWNrKSA9PSBISURfU1VDQ0VTUykgewotICAgIC8qIHN0b3JlIHBhcmFtZXRlcnMgKi8KLSAgICBidGFfaGhfY2IucF9jYmFjayA9IHBfZGF0YS0+YXBpX2VuYWJsZS5wX2NiYWNrOwotCi0gICAgc3RhdHVzID0gQlRBX0hIX09LOwotICAgIC8qIGluaXRpYWxpemUgZGV2aWNlIENCICovCi0gICAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0hIX01BWF9ERVZJQ0U7IHh4KyspIHsKLSAgICAgIGJ0YV9oaF9jYi5rZGV2W3h4XS5zdGF0ZSA9IEJUQV9ISF9JRExFX1NUOwotICAgICAgYnRhX2hoX2NiLmtkZXZbeHhdLmhpZF9oYW5kbGUgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICBidGFfaGhfY2Iua2Rldlt4eF0uaW5kZXggPSB4eDsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIGNvbnRyb2wgYmxvY2sgbWFwICovCi0gICAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0hIX01BWF9LTk9XTjsgeHgrKykKLSAgICAgIGJ0YV9oaF9jYi5jYl9pbmRleFt4eF0gPSBCVEFfSEhfSURYX0lOVkFMSUQ7Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IEJUQV9ISF9PSykgewotICAgIGJ0YV9oaF9sZV9lbmFibGUoKTsKLSAgfSBlbHNlCi0gIHsKLSAgICAvKiBzaWduYWwgQlRBIGNhbGwgYmFjayBldmVudCAqLwotICAgIHRCVEFfSEggYnRhX2hoOwotICAgIGJ0YV9oaC5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX0VOQUJMRV9FVlQsICZidGFfaGgpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2FwaV9kaXNhYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQZXJmb3JtIG5lY2Vzc2FyeSBvcGVyYXRpb25zIHRvIGRpc2FibGUgSElEIGhvc3QuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9hcGlfZGlzYWJsZSh2b2lkKSB7Ci0gIHVpbnQ4X3QgeHg7Ci0KLSAgLyogc2VydmljZSBpcyBub3QgZW5hYmxlZCAqLwotICBpZiAoYnRhX2hoX2NiLnBfY2JhY2sgPT0gTlVMTCkgcmV0dXJuOwotCi0gIC8qIG5vIGxpdmUgY29ubmVjdGlvbiwgc2lnbmFsIERJU0NfQ01QTF9FVlQgZGlyZWN0bHkgKi8KLSAgaWYgKCFidGFfaGhfY2IuY250X251bSkgewotICAgIGJ0YV9oaF9kaXNjX2NtcGwoKTsKLSAgfSBlbHNlIC8qIG90aGVyd2lzZSwgZGlzY29ubmVjdCBhbGwgbGl2ZSBjb25uZWN0aW9ucyAqLwotICB7Ci0gICAgYnRhX2hoX2NiLnc0X2Rpc2FibGUgPSB0cnVlOwotCi0gICAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0hIX01BWF9ERVZJQ0U7IHh4KyspIHsKLSAgICAgIC8qIHNlbmQgQVBJX0NMT1NFIGV2ZW50IHRvIGV2ZXJ5IGNvbm5lY3RlZCBkZXZpY2UgKi8KLSAgICAgIGlmIChidGFfaGhfY2Iua2Rldlt4eF0uc3RhdGUgPT0gQlRBX0hIX0NPTk5fU1QpIHsKLSAgICAgICAgLyogZGlzY29ubmVjdCBhbGwgY29ubmVjdGVkIGRldmljZXMgKi8KLSAgICAgICAgYnRhX2hoX3NtX2V4ZWN1dGUoJmJ0YV9oaF9jYi5rZGV2W3h4XSwgQlRBX0hIX0FQSV9DTE9TRV9FVlQsIE5VTEwpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9kaXNjX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFsbCBjb25uZWN0aW9ucyBoYXZlIGJlZW4gY2xvc2VkLCBkaXNhYmxlIHNlcnZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9kaXNjX2NtcGwodm9pZCkgewotICBMT0dfREVCVUcoIkRpc2Nvbm5lY3QgY29tcGxldGUiKTsKLQotICBISURfSG9zdERlcmVnaXN0ZXIoKTsKLSAgYnRhX2hoX2xlX2RlcmVnaXN0ZXIoKTsKLSAgdEJUQV9ISF9TVEFUVVMgc3RhdHVzID0gQlRBX0hIX09LOwotCi0gIC8qIERlcmVnaXN0ZXIgd2l0aCBsb3dlciBsYXllciAqLwotICBpZiAoSElEX0hvc3REZXJlZ2lzdGVyKCkgIT0gSElEX1NVQ0NFU1MpIHN0YXR1cyA9IEJUQV9ISF9FUlI7Ci0KLSAgYnRhX2hoX2NsZWFudXBfZGlzYWJsZShzdGF0dXMpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfc2RwX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTRFAgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oaF9zZHBfY2JhY2sodWludDE2X3QgcmVzdWx0LCB1aW50MTZfdCBhdHRyX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRISURfREVWX1NEUF9JTkZPKiBzZHBfcmVjKSB7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2NiID0gYnRhX2hoX2NiLnBfY3VyOwotICB1aW50OF90IGhkbCA9IDA7Ci0gIHRCVEFfSEhfU1RBVFVTIHN0YXR1cyA9IEJUQV9ISF9FUlJfU0RQOwotCi0gIC8qIG1ha2Ugc3VyZSBzZHAgc3VjY2VlZGVkIGFuZCBoaCBoYXMgbm90IGJlZW4gZGlzYWJsZWQgKi8KLSAgaWYgKChyZXN1bHQgPT0gU0RQX1NVQ0NFU1MpICYmIChwX2NiICE9IE5VTEwpKSB7Ci0gICAgLyogc2VjdXJpdHkgaXMgcmVxdWlyZWQgZm9yIHRoZSBjb25uZWN0aW9uLCBhZGQgYXR0cl9tYXNrIGJpdCovCi0gICAgYXR0cl9tYXNrIHw9IEhJRF9TRUNfUkVRVUlSRUQ7Ci0KLSAgICBBUFBMX1RSQUNFX0VWRU5UKCIlczogcF9jYjogJWQgcmVzdWx0IDB4JTAyeCwgYXR0cl9tYXNrIDB4JTAyeCwgaGFuZGxlICV4IiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2NiLCByZXN1bHQsIGF0dHJfbWFzaywgcF9jYi0+aGlkX2hhbmRsZSk7Ci0KLSAgICAvKiBjaGVjayB0byBzZWUgdHlwZSBvZiBkZXZpY2UgaXMgc3VwcG9ydGVkICwgYW5kIHNob3VsZCBub3QgYmVlbiBhZGRlZAotICAgICAqIGJlZm9yZSAqLwotICAgIGlmIChidGFfaGhfdG9kX3NwdChwX2NiLCBzZHBfcmVjLT5zdWJfY2xhc3MpKSB7Ci0gICAgICAvKiBpZiBub3QgYWRkZWQgYmVmb3JlICovCi0gICAgICBpZiAocF9jYi0+aGlkX2hhbmRsZSA9PSBCVEFfSEhfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgICAgLyogIGFkZCBkZXZpY2UvdXBkYXRlIGF0dHJfbWFzayBpbmZvcm1hdGlvbiAqLwotICAgICAgICBpZiAoSElEX0hvc3RBZGREZXYocF9jYi0+YWRkciwgYXR0cl9tYXNrLCAmaGRsKSA9PSBISURfU1VDQ0VTUykgewotICAgICAgICAgIHN0YXR1cyA9IEJUQV9ISF9PSzsKLSAgICAgICAgICAvKiB1cGRhdGUgY2JfaW5kZXhbXSBtYXAgKi8KLSAgICAgICAgICBidGFfaGhfY2IuY2JfaW5kZXhbaGRsXSA9IHBfY2ItPmluZGV4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfY2ItPmFwcF9pZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhkbCA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gICAgICB9Ci0gICAgICAvKiBlbHNlIDogaW5jb21pbmcgY29ubmVjdGlvbiBhZnRlciBTRFAgc2hvdWxkIHVwZGF0ZSB0aGUgU0RQIGluZm9ybWF0aW9uCi0gICAgICAgKiBhcyB3ZWxsICovCi0KLSAgICAgIGlmIChwX2NiLT5hcHBfaWQgIT0gMCkgewotICAgICAgICAvKiB1cGRhdGUgY2IgaW5mb3JtYXRpb24gd2l0aCBhdHRyX21hc2ssIGRzY3BfaW5mbyBldGMuICovCi0gICAgICAgIGJ0YV9oaF9hZGRfZGV2aWNlX3RvX2xpc3QocF9jYiwgaGRsLCBhdHRyX21hc2ssICZzZHBfcmVjLT5kc2NwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwX3JlYy0+c3ViX2NsYXNzLCBzZHBfcmVjLT5zc3JfbWF4X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwX3JlYy0+c3NyX21pbl90b3V0LCBwX2NiLT5hcHBfaWQpOwotCi0gICAgICAgIHBfY2ItPmRzY3BfaW5mby5jdHJ5X2NvZGUgPSBzZHBfcmVjLT5jdHJ5X2NvZGU7Ci0KLSAgICAgICAgc3RhdHVzID0gQlRBX0hIX09LOwotICAgICAgfQotCi0gICAgfSBlbHNlIC8qIHR5cGUgb2YgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIHN0YXR1cyA9IEJUQV9ISF9FUlJfVE9EX1VOU1BUOwotICB9Ci0KLSAgLyogZnJlZSBkaXNjX2RiIHdoZW4gU0RQIGlzIGNvbXBsZXRlZCAqLwotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmYnRhX2hoX2NiLnBfZGlzY19kYik7Ci0KLSAgLyogc2VuZCBTRFBfQ01QTF9FVlQgaW50byBzdGF0ZSBtYWNoaW5lICovCi0gIHRCVEFfSEhfREFUQSBidGFfaGhfZGF0YTsKLSAgYnRhX2hoX2RhdGEuc3RhdHVzID0gc3RhdHVzOwotICBidGFfaGhfc21fZXhlY3V0ZShwX2NiLCBCVEFfSEhfU0RQX0NNUExfRVZULCAmYnRhX2hoX2RhdGEpOwotCi0gIHJldHVybjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZGlfc2RwX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTRFAgREkgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oaF9kaV9zZHBfY2JhY2sodFNEUF9SRVNVTFQgcmVzdWx0KSB7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2NiID0gYnRhX2hoX2NiLnBfY3VyOwotICB0QlRBX0hIX1NUQVRVUyBzdGF0dXMgPSBCVEFfSEhfRVJSX1NEUDsKLSAgdFNEUF9ESV9HRVRfUkVDT1JEIGRpX3JlYzsKLSAgdEhJRF9TVEFUVVMgcmV0OwotICBBUFBMX1RSQUNFX0VWRU5UKCIlczogcF9jYjogJWQgcmVzdWx0IDB4JTAyeCIsIF9fZnVuY19fLCBwX2NiLCByZXN1bHQpOwotCi0gIC8qIGlmIERJIHJlY29yZCBkb2VzIG5vdCBleGlzdCBvbiByZW1vdGUgZGV2aWNlLCB2ZW5kb3JfaWQgaW4KLSAgICogdEJUQV9ISF9ERVZfRFNDUF9JTkZPIHdpbGwgYmUgc2V0IHRvIDB4ZmZmZiBhbmQgd2Ugd2lsbCBhbGxvdyB0aGUKLSAgICogY29ubmVjdGlvbiB0byBnbyB0aHJvdWdoLiBTcGVjIG1hbmRhdGVzIHRoYXQgREkgcmVjb3JkIGJlIHNldCwgYnV0IG1hbnkKLSAgICogSElEIGRldmljZXMgZG8gbm90IHNldCB0aGlzLiBTbyBmb3IgSU9QIHB1cnBvc2VzLCB3ZSBhbGxvdyB0aGUgY29ubmVjdGlvbgotICAgKiB0byBnbyB0aHJvdWdoIGFuZCB1cGRhdGUgdGhlIERJIHJlY29yZCB0byBpbnZhbGlkIERJIGVudHJ5LgotICAgKi8KLSAgaWYgKCgocmVzdWx0ID09IFNEUF9TVUNDRVNTKSB8fCAocmVzdWx0ID09IFNEUF9OT19SRUNTX01BVENIKSkgJiYKLSAgICAgIChwX2NiICE9IE5VTEwpKSB7Ci0gICAgaWYgKHJlc3VsdCA9PSBTRFBfU1VDQ0VTUyAmJgotICAgICAgICBTRFBfR2V0TnVtRGlSZWNvcmRzKGJ0YV9oaF9jYi5wX2Rpc2NfZGIpICE9IDApIHsKLSAgICAgIC8qIGFsd2F5cyB1cGRhdGUgaW5mb3JtYXRpb24gd2l0aCBwcmltYXJ5IERJIHJlY29yZCAqLwotICAgICAgaWYgKFNEUF9HZXREaVJlY29yZCgxLCAmZGlfcmVjLCBidGFfaGhfY2IucF9kaXNjX2RiKSA9PSBTRFBfU1VDQ0VTUykgewotICAgICAgICBidGFfaGhfdXBkYXRlX2RpX2luZm8ocF9jYiwgZGlfcmVjLnJlYy52ZW5kb3IsIGRpX3JlYy5yZWMucHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpX3JlYy5yZWMudmVyc2lvbiwgMCk7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgLyogbm8gREkgcmVjcm9kIGF2YWlsYWJsZSAqLwotICAgIHsKLSAgICAgIGJ0YV9oaF91cGRhdGVfZGlfaW5mbyhwX2NiLCBCVEFfSEhfVkVORE9SX0lEX0lOVkFMSUQsIDAsIDAsIDApOwotICAgIH0KLQotICAgIHJldCA9IEhJRF9Ib3N0R2V0U0RQUmVjb3JkKHBfY2ItPmFkZHIsIGJ0YV9oaF9jYi5wX2Rpc2NfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idGFfaGhfY2ZnLT5zZHBfZGJfc2l6ZSwgYnRhX2hoX3NkcF9jYmFjayk7Ci0gICAgaWYgKHJldCA9PSBISURfU1VDQ0VTUykgewotICAgICAgc3RhdHVzID0gQlRBX0hIX09LOwotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogIEhJRF9Ib3N0R2V0U0RQUmVjb3JkIGZhaWxlZDogU3RhdHVzIDB4JTJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJldCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBCVEFfSEhfT0spIHsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmYnRhX2hoX2NiLnBfZGlzY19kYik7Ci0gICAgLyogc2VuZCBTRFBfQ01QTF9FVlQgaW50byBzdGF0ZSBtYWNoaW5lICovCi0gICAgdEJUQV9ISF9EQVRBIGJ0YV9oaF9kYXRhOwotICAgIGJ0YV9oaF9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgICBidGFfaGhfc21fZXhlY3V0ZShwX2NiLCBCVEFfSEhfU0RQX0NNUExfRVZULCAmYnRhX2hoX2RhdGEpOwotICB9Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9zdGFydF9zZHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IFNEUCBzZXJ2aWNlIHNlYXJjaCwgYW5kIG9idGFpbiBuZWNlc3NhcnkgU0RQIHJlY29yZHMuCi0gKiAgICAgICAgICAgICAgICAgIE9ubHkgb25lIFNEUCBzZXJ2aWNlIHNlYXJjaCByZXF1ZXN0IGlzIGFsbG93ZWQgYXQgdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgdGltZS4gRm9yIGV2ZXJ5IEJUQV9IaE9wZW4gQVBJIGNhbGwsIGRvIFNEUCBmaXJzdCB1bmxlc3MgU0RQCi0gKiAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGRvbmUgcHJldmlvdXNseS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfc3RhcnRfc2RwKHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hIX1NUQVRVUyBzdGF0dXMgPSBCVEFfSEhfRVJSX1NEUDsKLSAgdWludDhfdCBoZGw7Ci0KLSAgcF9jYi0+bW9kZSA9IHBfZGF0YS0+YXBpX2Nvbm4ubW9kZTsKLSAgYnRhX2hoX2NiLnBfY3VyID0gcF9jYjsKLQotICBpZiAoQlRNX1VzZUxlTGluayhwX2RhdGEtPmFwaV9jb25uLmJkX2FkZHIpKSB7Ci0gICAgcF9jYi0+aXNfbGVfZGV2aWNlID0gdHJ1ZTsKLSAgICBidGFfaGhfbGVfb3Blbl9jb25uKHBfY2IsIHBfZGF0YS0+YXBpX2Nvbm4uYmRfYWRkcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogaWYgcHJldmlvdXNseSB2aXJ0dWFsbHkgY2FibGVkIGRldmljZSwgc2tpcCBTRFAgKi8KLSAgaWYgKHBfY2ItPmFwcF9pZCkgewotICAgIHN0YXR1cyA9IEJUQV9ISF9PSzsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogc2tpcCBTRFAgZm9yIGtub3duIGRldmljZXMiLCBfX2Z1bmNfXyk7Ci0gICAgaWYgKHBfY2ItPmhpZF9oYW5kbGUgPT0gQlRBX0hIX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBpZiAoSElEX0hvc3RBZGREZXYocF9jYi0+YWRkciwgcF9jYi0+YXR0cl9tYXNrLCAmaGRsKSA9PSBISURfU1VDQ0VTUykgewotICAgICAgICAvKiB1cGRhdGUgZGV2aWNlIENCIHdpdGggbmV3bHkgcmVnaXN0ZXIgZGV2aWNlIGhhbmRsZSAqLwotICAgICAgICBidGFfaGhfYWRkX2RldmljZV90b19saXN0KHBfY2IsIGhkbCwgcF9jYi0+YXR0cl9tYXNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnN1Yl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5kc2NwX2luZm8uc3NyX21heF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmRzY3BfaW5mby5zc3JfbWluX3RvdXQsIHBfY2ItPmFwcF9pZCk7Ci0gICAgICAgIC8qIHVwZGF0ZSBjYl9pbmRleFtdIG1hcCAqLwotICAgICAgICBidGFfaGhfY2IuY2JfaW5kZXhbaGRsXSA9IHBfY2ItPmluZGV4OwotICAgICAgfSBlbHNlCi0gICAgICAgIHN0YXR1cyA9IEJUQV9ISF9FUlJfTk9fUkVTOwotICAgIH0KLSAgICB0QlRBX0hIX0RBVEEgYnRhX2hoX2RhdGE7Ci0gICAgYnRhX2hoX2RhdGEuc3RhdHVzID0gc3RhdHVzOwotICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9TRFBfQ01QTF9FVlQsICZidGFfaGhfZGF0YSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLSAgLyogR2V0U0RQUmVjb3JkLiBhdCBvbmUgdGltZSBvbmx5IG9uZSBTRFAgcHJlY2VkdXJlIGNhbiBiZSBhY3RpdmUgKi8KLSAgZWxzZSBpZiAoIWJ0YV9oaF9jYi5wX2Rpc2NfZGIpIHsKLSAgICBidGFfaGhfY2IucF9kaXNjX2RiID0KLSAgICAgICAgKHRTRFBfRElTQ09WRVJZX0RCKilvc2lfbWFsbG9jKHBfYnRhX2hoX2NmZy0+c2RwX2RiX3NpemUpOwotICAgIGJ0YV9oaF9jYi5wX2N1ciA9IHBfY2I7Ci0gICAgLyogZG8gREkgZGlzY292ZXJ5IGZpcnN0ICovCi0gICAgaWYgKFNEUF9EaURpc2NvdmVyKHBfZGF0YS0+YXBpX2Nvbm4uYmRfYWRkciwgYnRhX2hoX2NiLnBfZGlzY19kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9idGFfaGhfY2ZnLT5zZHBfZGJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX2RpX3NkcF9jYmFjaykgIT0gU0RQX1NVQ0NFU1MpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAgU0RQX0RpRGlzY292ZXIgZmFpbGVkOiBTdGF0dXMgMHglMlgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgIHN0YXR1cyA9IEJUQV9ISF9FUlJfU0RQOwotICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmJ0YV9oaF9jYi5wX2Rpc2NfZGIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGF0dXMgPSBCVEFfSEhfT0s7Ci0gICAgfQotICB9IGVsc2UgaWYgKGJ0YV9oaF9jYi5wX2Rpc2NfZGIpIHsKLSAgICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzIGluY29taW5nL291dGdvaW5nIGNvbGxpc2lvbiBjYXNlLiBEVVQKLSAgICAgKiBpbml0aWF0ZWQKLSAgICAgKiBISUQgY29ubmVjdGlvbiBhdCBzYW1lIHRpbWUgcmVtb3RlIGhhcyBjb25uZWN0ZWQgTDJDQVAgZm9yIEhJRCBjb250cm9sLAotICAgICAqIHNvIFNEUCB3b3VsZCBiZSBpbiBwcm9ncmVzcywgd2hlbiB0aGlzIGZsb3cgcmVhY2hlcyBoZXJlLiBKdXN0IGRvIG5vdGhpbmcKLSAgICAgKiB3aGVuIHRoZSBjb2RlIHJlYWNoZXMgaGVyZSwgYW5kIG9uZ29pbmcgU0RQIGNvbXBsZXRpb24gb3IgZmFpbHVyZSB3aWxsCi0gICAgICogaGFuZGxlIHRoaXMgY2FzZS4KLSAgICAgKi8KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogaWdub3JpbmcgYXMgU0RQIGFscmVhZHkgaW4gcHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBCVEFfSEhfT0spIHsKLSAgICB0QlRBX0hIX0RBVEEgYnRhX2hoX2RhdGE7Ci0gICAgYnRhX2hoX2RhdGEuc3RhdHVzID0gc3RhdHVzOwotICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9TRFBfQ01QTF9FVlQsICZidGFfaGhfZGF0YSk7Ci0gIH0KLQotICByZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX3NkcF9jbXBsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBXaGVuIFNEUCBjb21wbGV0ZXMsIGluaXRpYXRlIGEgY29ubmVjdGlvbiBvciByZXBvcnQgYW4gZXJyb3IKLSAqICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBTRFAgcmVzdWx0LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfc2RwX2NtcGwodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIENIRUNLKHBfZGF0YSAhPSBudWxscHRyKTsKLQotICB0QlRBX0hIX0NPTk4gY29ubl9kYXQ7Ci0gIHRCVEFfSEhfU1RBVFVTIHN0YXR1cyA9IHBfZGF0YS0+c3RhdHVzOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiAgc3RhdHVzIDB4JTJYIiwgX19mdW5jX18sIHBfZGF0YS0+c3RhdHVzKTsKLQotICAvKiBpbml0aWFsaXplIGNhbGwgYmFjayBkYXRhICovCi0gIG1lbXNldCgodm9pZCopJmNvbm5fZGF0LCAwLCBzaXplb2YodEJUQV9ISF9DT05OKSk7Ci0gIGNvbm5fZGF0LmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gIGNvbm5fZGF0LmJkYSA9IHBfY2ItPmFkZHI7Ci0KLSAgLyogaWYgU0RQIGNvbXBsIHN1Y2Nlc3MgKi8KLSAgaWYgKHN0YXR1cyA9PSBCVEFfSEhfT0spIHsKLSAgICAvKiBub3QgaW5jb21pbmcgY29ubmVjdGlvbiBkb2luZyBTRFAsIGluaXRpYXRlIGEgSElEIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAoIXBfY2ItPmluY29taW5nX2Nvbm4pIHsKLSAgICAgIHRISURfU1RBVFVTIHJldDsKLQotICAgICAgLyogb3BlbiBISUQgY29ubmVjdGlvbiAqLwotICAgICAgcmV0ID0gSElEX0hvc3RPcGVuRGV2KHBfY2ItPmhpZF9oYW5kbGUpOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEhJRF9Ib3N0T3BlbkRldiByZXR1cm5lZD0lZCIsIF9fZnVuY19fLCByZXQpOwotICAgICAgaWYgKHJldCA9PSBISURfU1VDQ0VTUyB8fCByZXQgPT0gSElEX0VSUl9BTFJFQURZX0NPTk4pIHsKLSAgICAgICAgc3RhdHVzID0gQlRBX0hIX09LOwotICAgICAgfSBlbHNlIGlmIChyZXQgPT0gSElEX0VSUl9DT05OX0lOX1BST0NFU1MpIHsKLSAgICAgICAgLyogQ29ubmVjdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzLCByZXR1cm4gZnJvbSBoZXJlLCBTRFAKLSAgICAgICAgICogd2lsbCBiZSBwZXJmb3JtZWQgYWZ0ZXIgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubmVjdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogSElEX0hvc3RPcGVuRGV2IGZhaWxlZDogU3RhdHVzIDB4JTJYIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0KTsKLSAgICAgICAgLyogb3BlbiBmYWlsLCByZW1vdmUgZGV2aWNlIGZyb20gbWFuYWdlbWVudCBkZXZpY2UgbGlzdCAqLwotICAgICAgICBISURfSG9zdFJlbW92ZURldihwX2NiLT5oaWRfaGFuZGxlKTsKLSAgICAgICAgc3RhdHVzID0gQlRBX0hIX0VSUjsKLSAgICAgIH0KLSAgICB9IGVsc2UgLyogaW5jb21pbmcgY29ubmVjdGlvbiBTRFAgZmluaXNoICovCi0gICAgewotICAgICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0hIX09QRU5fQ01QTF9FVlQsIE5VTEwpOwotICAgIH0KLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gQlRBX0hIX09LKSB7Ci0gICAgLyogQ2hlY2sgaWYgdGhpcyB3YXMgaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0ICBmcm9tIGFuIHVua25vd24gZGV2aWNlCi0gICAgICogYW5kIGNvbm5lY3Rpb24gZmFpbGVkIGR1ZSB0byBtaXNzaW5nIEhJRCBEZXZpY2UgU0RQIFVVSUQKLSAgICAgKiBJbiBhYm92ZSBjb25kaXRpb24sIGRpc2Nvbm5lY3QgdGhlIGxpbmsgYXMgd2VsbCBhcyByZW1vdmUgdGhlCi0gICAgICogZGV2aWNlIGZyb20gbGlzdCBvZiBISUQgZGV2aWNlcwotICAgICAqLwotICAgIGlmICgoc3RhdHVzID09IEJUQV9ISF9FUlJfU0RQKSAmJiAocF9jYi0+aW5jb21pbmdfY29ubikgJiYKLSAgICAgICAgKHBfY2ItPmFwcF9pZCA9PSAwKSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IFNEUCBmYWlsZWQgZm9yICBpbmNvbWluZyBjb25uIGhuZGw6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmluY29taW5nX2hpZF9oYW5kbGUpOwotICAgICAgSElEX0hvc3RSZW1vdmVEZXYocF9jYi0+aW5jb21pbmdfaGlkX2hhbmRsZSk7Ci0gICAgfQotICAgIGNvbm5fZGF0LnN0YXR1cyA9IHN0YXR1czsKLSAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfT1BFTl9FVlQsICh0QlRBX0hIKikmY29ubl9kYXQpOwotCi0gICAgLyogbW92ZSBzdGF0ZSBtYWNoaW5lIFc0X0NPTk4gLT5JRExFICovCi0gICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0hIX0FQSV9DTE9TRV9FVlQsIE5VTEwpOwotCi0gICAgLyogaWYgdGhpcyBpcyBhbiBvdXRnb2luZyBjb25uZWN0aW9uIHRvIGFuIHVua25vd24gZGV2aWNlLCBjbGVhbiB1cCBjYiAqLwotICAgIGlmIChwX2NiLT5hcHBfaWQgPT0gMCAmJiAhcF9jYi0+aW5jb21pbmdfY29ubikgewotICAgICAgLyogY2xlYW4gdXAgZGV2aWNlIGNvbnRyb2wgYmxvY2sgKi8KLSAgICAgIGJ0YV9oaF9jbGVhbl91cF9rZGV2KHBfY2IpOwotICAgIH0KLSAgICBidGFfaGhfdHJhY2VfZGV2X2RiKCk7Ci0gIH0KLSAgcF9jYi0+aW5jb21pbmdfY29ubiA9IGZhbHNlOwotICBwX2NiLT5pbmNvbWluZ19oaWRfaGFuZGxlID0gQlRBX0hIX0lOVkFMSURfSEFORExFOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfYXBpX2Rpc2NfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBISUQgSG9zdCBpbml0aWF0ZSBhIGRpc2Nvbm5lY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGlmX2hoX3JlbW92ZV9kZXZpY2UoUmF3QWRkcmVzcyBiZF9hZGRyKTsKLXZvaWQgYnRhX2hoX2FwaV9kaXNjX2FjdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpIHsKLSAgQ0hFQ0socF9jYiAhPSBudWxscHRyKTsKLQotICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKSB7Ci0gICAgTE9HX0RFQlVHKCJIb3N0IGluaXRpYXRpbmcgY2xvc2UgdG8gbGUgZGV2aWNlOiVzIiwKLSAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBfY2ItPmFkZHIpKTsKLQotICAgIGJ0YV9oaF9sZV9hcGlfZGlzY19hY3QocF9jYik7Ci0KLSAgfSBlbHNlIHsKLSAgICBjb25zdCB1aW50OF90IGhpZF9oYW5kbGUgPQotICAgICAgICAocF9kYXRhICE9IG51bGxwdHIpID8gc3RhdGljX2Nhc3Q8dWludDhfdD4ocF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwX2NiLT5oaWRfaGFuZGxlOwotICAgIHRISURfU1RBVFVTIHN0YXR1cyA9IEhJRF9Ib3N0Q2xvc2VEZXYoaGlkX2hhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBISURfU1VDQ0VTUykgewotICAgICAgTE9HX1dBUk4oIkZhaWxlZCBjbG9zaW5nIGNsYXNzaWMgZGV2aWNlOiVzIHN0YXR1czolcyIsCi0gICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9jYi0+YWRkciksIGhpZF9zdGF0dXNfdGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfREVCVUcoIkhvc3QgaW5pdGlhdGVkIGNsb3NlIHRvIGNsYXNzaWMgZGV2aWNlOiVzIiwKLSAgICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9jYi0+YWRkcikpOwotICAgIH0KLSAgICB0QlRBX0hIIGJ0YV9oaCA9IHsKLSAgICAgICAgLmRldl9zdGF0dXMgPSB7LnN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzID09IEhJRF9TVUNDRVNTKSA/IEJUQV9ISF9PSyA6IEJUQV9ISF9FUlIsCi0gICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBoaWRfaGFuZGxlfSwKLSAgICB9OwotICAgICgqYnRhX2hoX2NiLnBfY2JhY2spKEJUQV9ISF9DTE9TRV9FVlQsICZidGFfaGgpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfb3Blbl9jbXBsX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSElEIGhvc3QgY29ubmVjdGlvbiBjb21wbGV0ZWQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX29wZW5fY21wbF9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEhfQ09OTiBjb25uOwotICB1aW50OF90IGRldl9oYW5kbGUgPQotICAgICAgcF9kYXRhID8gKHVpbnQ4X3QpcF9kYXRhLT5oaWRfY2JhY2suaGRyLmxheWVyX3NwZWNpZmljIDogcF9jYi0+aGlkX2hhbmRsZTsKLQotICBtZW1zZXQoKHZvaWQqKSZjb25uLCAwLCBzaXplb2YodEJUQV9ISF9DT05OKSk7Ci0gIGNvbm4uaGFuZGxlID0gZGV2X2hhbmRsZTsKLSAgY29ubi5iZGEgPSBwX2NiLT5hZGRyOwotCi0gIC8qIGluY3JlYXNlIGNvbm5lY3Rpb24gbnVtYmVyICovCi0gIGJ0YV9oaF9jYi5jbnRfbnVtKys7Ci0KLSAgLyogaW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyICovCi0gIGJ0YV9oaF9jb19vcGVuKHBfY2ItPmhpZF9oYW5kbGUsIHBfY2ItPnN1Yl9jbGFzcywgcF9jYi0+YXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICBwX2NiLT5hcHBfaWQpOwotCi0gIGNvbm4uc3RhdHVzID0gcF9jYi0+c3RhdHVzOwotICBjb25uLmxlX2hpZCA9IHBfY2ItPmlzX2xlX2RldmljZTsKLSAgY29ubi5zY3BzX3N1cHBvcnRlZCA9IHBfY2ItPnNjcHNfc3VwcG9ydGVkOwotCi0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIHBfY2ItPmFkZHIsICJPcGVuZWQiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAiJXMgaW5pdGlhdG9yOiVzIiwgKHBfY2ItPmlzX2xlX2RldmljZSkgPyAibGUiIDogImNsYXNzaWMiLAotICAgICAgICAgICAgICAgICAgICAgKHBfY2ItPmluY29taW5nX2Nvbm4pID8gInJlbW90ZSIgOiAibG9jYWwiKSk7Ci0KLSAgaWYgKCFwX2NiLT5pc19sZV9kZXZpY2UpCi0gIHsKLSAgICAvKiBpbmZvcm0gcm9sZSBtYW5hZ2VyICovCi0gICAgYnRhX3N5c19jb25uX29wZW4oQlRBX0lEX0hILCBwX2NiLT5hcHBfaWQsIHBfY2ItPmFkZHIpOwotICB9Ci0gIC8qIHNldCBwcm90b2NvbCBtb2RlIHdoZW4gbm90IGRlZmF1bHQgcmVwb3J0IG1vZGUgKi8KLSAgaWYgKHBfY2ItPm1vZGUgIT0gQlRBX0hIX1BST1RPX1JQVF9NT0RFCi0gICAgICAmJiAhcF9jYi0+aXNfbGVfZGV2aWNlCi0gICAgICApIHsKLSAgICBpZiAoKEhJRF9Ib3N0V3JpdGVEZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX1NFVF9QUk9UT0NPTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1BBUl9QUk9UT0NPTF9CT09UX01PREUsIDAsIDAsIE5VTEwpKSAhPQotICAgICAgICBISURfU1VDQ0VTUykgewotICAgICAgLyogSElEIGNvbm5lY3Rpb24gaXMgdXAsIHdoaWxlIFNFVF9QUk9UTyBmYWlsICovCi0gICAgICBjb25uLnN0YXR1cyA9IEJUQV9ISF9FUlJfUFJPVE87Ci0gICAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfT1BFTl9FVlQsICh0QlRBX0hIKikmY29ubik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbm4uc3RhdHVzID0gQlRBX0hIX09LOwotICAgICAgcF9jYi0+dzRfZXZ0ID0gQlRBX0hIX09QRU5fRVZUOwotICAgIH0KLSAgfSBlbHNlCi0gICAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX09QRU5fRVZULCAodEJUQV9ISCopJmNvbm4pOwotCi0gIHBfY2ItPmluY29taW5nX2Nvbm4gPSBmYWxzZTsKLSAgcF9jYi0+aW5jb21pbmdfaGlkX2hhbmRsZSA9IEJUQV9ISF9JTlZBTElEX0hBTkRMRTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfb3Blbl9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhJRCBob3N0IHJlY2VpdmUgSElEX09QRU5fRVZUIC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX29wZW5fYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX0hIX0FQSV9DT05OIGNvbm5fZGF0YTsKLQotICB1aW50OF90IGRldl9oYW5kbGUgPQotICAgICAgcF9kYXRhID8gKHVpbnQ4X3QpcF9kYXRhLT5oaWRfY2JhY2suaGRyLmxheWVyX3NwZWNpZmljIDogcF9jYi0+aGlkX2hhbmRsZTsKLQotICBBUFBMX1RSQUNFX0VWRU5UKCIlczogIERldmljZVslZF0gY29ubmVjdGVkIiwgX19mdW5jX18sIGRldl9oYW5kbGUpOwotCi0gIC8qIFNEUCBoYXMgYmVlbiBkb25lICovCi0gIGlmIChwX2NiLT5hcHBfaWQgIT0gMCkgewotICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9PUEVOX0NNUExfRVZULCBwX2RhdGEpOwotICB9IGVsc2UKLSAgLyogIGFwcF9pZCA9PSAwIGluZGljYXRlcyBhbiBpbmNvbWluZyBjb25lbmN0aW9uIHJlcXVlc3QgYXJyaXZlcyB3aXRob3V0IFNEUAotICAgKiAgcGVyZm9ybWVkLCBkbyBpdCBmaXJzdAotICAgKi8KLSAgewotICAgIHBfY2ItPmluY29taW5nX2Nvbm4gPSB0cnVlOwotICAgIC8qIHN0b3JlIHRoZSBoYW5kbGUgaGVyZSBpbiBjYXNlIHNkcCBmYWlscyAtIG5lZWQgdG8gZGlzY29ubmVjdCAqLwotICAgIHBfY2ItPmluY29taW5nX2hpZF9oYW5kbGUgPSBkZXZfaGFuZGxlOwotCi0gICAgbWVtc2V0KCZjb25uX2RhdGEsIDAsIHNpemVvZih0QlRBX0hIX0FQSV9DT05OKSk7Ci0gICAgY29ubl9kYXRhLmJkX2FkZHIgPSBwX2NiLT5hZGRyOwotICAgIGJ0YV9oaF9zdGFydF9zZHAocF9jYiwgKHRCVEFfSEhfREFUQSopJmNvbm5fZGF0YSk7Ci0gIH0KLQotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZGF0YV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhJRCBIb3N0IHByb2Nlc3MgYSBkYXRhIHJlcG9ydAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfZGF0YV9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIEJUX0hEUiogcGRhdGEgPSBwX2RhdGEtPmhpZF9jYmFjay5wX2RhdGE7Ci0gIHVpbnQ4X3QqIHBfcnB0ID0gKHVpbnQ4X3QqKShwZGF0YSArIDEpICsgcGRhdGEtPm9mZnNldDsKLQotICBidGFfaGhfY29fZGF0YSgodWludDhfdClwX2RhdGEtPmhpZF9jYmFjay5oZHIubGF5ZXJfc3BlY2lmaWMsIHBfcnB0LAotICAgICAgICAgICAgICAgICBwZGF0YS0+bGVuLCBwX2NiLT5tb2RlLCBwX2NiLT5zdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgIHBfY2ItPmRzY3BfaW5mby5jdHJ5X2NvZGUsIHBfY2ItPmFkZHIsIHBfY2ItPmFwcF9pZCk7Ci0KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBkYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9oYW5kc2tfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBISUQgSG9zdCBwcm9jZXNzIGEgaGFuZHNoYWtlIGFja25vd2xlZGdlbWVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2hhbmRza19hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIkhBTkRTSEFLRSByZWNlaXZlZCBmb3I6IGV2ZW50ID0gJXMgZGF0YT0gJWQiLAotICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9nZXRfdzRfZXZlbnQocF9jYi0+dzRfZXZ0KSwgcF9kYXRhLT5oaWRfY2JhY2suZGF0YSk7Ci0KLSAgdEJUQV9ISCBidGFfaGg7Ci0gIG1lbXNldCgmYnRhX2hoLCAwLCBzaXplb2YodEJUQV9ISCkpOwotCi0gIHN3aXRjaCAocF9jYi0+dzRfZXZ0KSB7Ci0gICAgLyogR0VUXyB0cmFuc3NhY3Rpb24sIGhhbmRzaGFrZSBpbmRpY2F0ZSB1bnN1cHBvcnRlZCByZXF1ZXN0ICovCi0gICAgY2FzZSBCVEFfSEhfR0VUX1BST1RPX0VWVDoKLSAgICAgIGJ0YV9oaC5oc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPSBCVEFfSEhfUFJPVE9fVU5LTk9XTjsKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgQlRBX0hIX0dFVF9SUFRfRVZUOgotICAgIGNhc2UgQlRBX0hIX0dFVF9JRExFX0VWVDoKLSAgICAgIGJ0YV9oaC5oc19kYXRhLmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gICAgICAvKiBpZiBoYW5kc2hha2UgZ2l2ZXMgYW4gT0sgY29kZSBmb3IgdGhlc2UgdHJhbnNhY3Rpb24sIGZpbGwgaW4gVU5TVVBUICovCi0gICAgICBidGFfaGguaHNfZGF0YS5zdGF0dXMgPSBidGFfaGhfZ2V0X3RyYW5zX3N0YXR1cyhwX2RhdGEtPmhpZF9jYmFjay5kYXRhKTsKLSAgICAgIGlmIChidGFfaGguaHNfZGF0YS5zdGF0dXMgPT0gQlRBX0hIX09LKQotICAgICAgICBidGFfaGguaHNfZGF0YS5zdGF0dXMgPSBCVEFfSEhfSFNfVFJBTlNfTk9UX1NQVDsKLSAgICAgIGlmIChwX2NiLT53NF9ldnQgPT0gQlRBX0hIX0dFVF9SUFRfRVZUKQotICAgICAgICBidGFfaGhfY29fZ2V0X3JwdF9yc3AoYnRhX2hoLmRldl9zdGF0dXMuaGFuZGxlLCBidGFfaGguaHNfZGF0YS5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKLSAgICAgICgqYnRhX2hoX2NiLnBfY2JhY2spKHBfY2ItPnc0X2V2dCwgJmJ0YV9oaCk7Ci0gICAgICBwX2NiLT53NF9ldnQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBhY2tub2xlZGdlbWVudCBmcm9tIEhJRCBkZXZpY2UgZm9yIFNFVF8gdHJhbnNhY3Rpb24gKi8KLSAgICBjYXNlIEJUQV9ISF9TRVRfUlBUX0VWVDoKLSAgICBjYXNlIEJUQV9ISF9TRVRfUFJPVE9fRVZUOgotICAgIGNhc2UgQlRBX0hIX1NFVF9JRExFX0VWVDoKLSAgICAgIGJ0YV9oaC5kZXZfc3RhdHVzLmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gICAgICBidGFfaGguZGV2X3N0YXR1cy5zdGF0dXMgPQotICAgICAgICAgIGJ0YV9oaF9nZXRfdHJhbnNfc3RhdHVzKHBfZGF0YS0+aGlkX2NiYWNrLmRhdGEpOwotICAgICAgaWYgKHBfY2ItPnc0X2V2dCA9PSBCVEFfSEhfU0VUX1JQVF9FVlQpCi0gICAgICAgIGJ0YV9oaF9jb19zZXRfcnB0X3JzcChidGFfaGguZGV2X3N0YXR1cy5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGguZGV2X3N0YXR1cy5zdGF0dXMpOwotICAgICAgKCpidGFfaGhfY2IucF9jYmFjaykocF9jYi0+dzRfZXZ0LCAmYnRhX2hoKTsKLSAgICAgIHBfY2ItPnc0X2V2dCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNFVF9QUk9UT0NPTCB3aGVuIG9wZW4gY29ubmVjdGlvbiAqLwotICAgIGNhc2UgQlRBX0hIX09QRU5fRVZUOgotICAgICAgYnRhX2hoLmNvbm4uc3RhdHVzID0KLSAgICAgICAgICBwX2RhdGEtPmhpZF9jYmFjay5kYXRhID8gQlRBX0hIX0VSUl9QUk9UTyA6IEJUQV9ISF9PSzsKLSAgICAgIGJ0YV9oaC5jb25uLmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gICAgICBidGFfaGguY29ubi5iZGEgPSBwX2NiLT5hZGRyOwotICAgICAgKCpidGFfaGhfY2IucF9jYmFjaykocF9jYi0+dzRfZXZ0LCAmYnRhX2hoKTsKLSAgICAgIGJ0YV9oaF90cmFjZV9kZXZfZGIoKTsKLSAgICAgIHBfY2ItPnc0X2V2dCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB1bmtub3cgdHJhbnNhY3Rpb24gaGFuZHNoYWtlIHJlc3BvbnNlICovCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJ1bmtub3duIHRyYW5zYWN0aW9uIHR5cGUiKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogdHJhbnNhY3Rpb24gYWNoa25vbGVkZ2VtZW50IHJlY2VpdmVkLCBpbmZvcm0gUE0gZm9yIG1vZGUgY2hhbmdlICovCi0gIGJ0YV9zeXNfaWRsZShCVEFfSURfSEgsIHBfY2ItPmFwcF9pZCwgcF9jYi0+YWRkcik7Ci0gIHJldHVybjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfY3RybF9kYXRfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBISUQgSG9zdCBwcm9jZXNzIGEgZGF0YSByZXBvcnQgZnJvbSBjb250cm9sIGNoYW5uZWwuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9jdHJsX2RhdF9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIEJUX0hEUiogcGRhdGEgPSBwX2RhdGEtPmhpZF9jYmFjay5wX2RhdGE7Ci0gIHVpbnQ4X3QqIGRhdGEgPSAodWludDhfdCopKHBkYXRhICsgMSkgKyBwZGF0YS0+b2Zmc2V0OwotICB0QlRBX0hIX0hTREFUQSBoc19kYXRhOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIkN0cmwgREFUQSByZWNlaXZlZCB3NDogZXZlbnRbJXNdIiwKLSAgICAgICAgICAgICAgICAgICBidGFfaGhfZ2V0X3c0X2V2ZW50KHBfY2ItPnc0X2V2dCkpOwotICBpZiAocGRhdGEtPmxlbiA9PSAwKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTYxMDg3MzgiKTsKLSAgICBwX2NiLT53NF9ldnQgPSAwOwotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGhzX2RhdGEuc3RhdHVzID0gQlRBX0hIX09LOwotICBoc19kYXRhLmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0KLSAgc3dpdGNoIChwX2NiLT53NF9ldnQpIHsKLSAgICBjYXNlIEJUQV9ISF9HRVRfSURMRV9FVlQ6Ci0gICAgICBoc19kYXRhLnJzcF9kYXRhLmlkbGVfcmF0ZSA9ICpkYXRhOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEhfR0VUX1JQVF9FVlQ6Ci0gICAgICBoc19kYXRhLnJzcF9kYXRhLnBfcnB0X2RhdGEgPSBwZGF0YTsKLSAgICAgIGJ0YV9oaF9jb19nZXRfcnB0X3JzcChoc19kYXRhLmhhbmRsZSwgaHNfZGF0YS5zdGF0dXMsIHBkYXRhLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkYXRhLT5sZW4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEhfR0VUX1BST1RPX0VWVDoKLSAgICAgIC8qIG1hdGNoIHVwIEJURS9CVEEgcmVwb3J0L2Jvb3QgbW9kZSBkZWYqLwotICAgICAgaHNfZGF0YS5yc3BfZGF0YS5wcm90b19tb2RlID0gKCgqZGF0YSkgPT0gSElEX1BBUl9QUk9UT0NPTF9SRVBPUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCVEFfSEhfUFJPVE9fUlBUX01PREUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJUQV9ISF9QUk9UT19CT09UX01PREU7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJHRVRfUFJPVE9DT0wgTW9kZSA9IFslc10iLAotICAgICAgICAgICAgICAgICAgICAgICAoaHNfZGF0YS5yc3BfZGF0YS5wcm90b19tb2RlID09IEJUQV9ISF9QUk9UT19SUFRfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlJlcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkJvb3QiKTsKLSAgICAgIGJyZWFrOwotICAgIC8qIHNob3VsZCBub3QgZXhwZWN0IGNvbnRyb2wgREFUQSBmb3IgU0VUXyB0cmFuc2FjdGlvbiAqLwotICAgIGNhc2UgQlRBX0hIX1NFVF9QUk9UT19FVlQ6Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEJUQV9ISF9TRVRfUlBUX0VWVDoKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgQlRBX0hIX1NFVF9JRExFX0VWVDoKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJpbnZhbGlkICB0cmFuc2FjdGlvbiB0eXBlIGZvciBEQVRBIHBheWxvYWQ6IDRfZXZ0WyVzXSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9nZXRfdzRfZXZlbnQocF9jYi0+dzRfZXZ0KSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIGluZm9ybSBQTSBmb3IgbW9kZSBjaGFuZ2UgKi8KLSAgYnRhX3N5c19idXN5KEJUQV9JRF9ISCwgcF9jYi0+YXBwX2lkLCBwX2NiLT5hZGRyKTsKLSAgYnRhX3N5c19pZGxlKEJUQV9JRF9ISCwgcF9jYi0+YXBwX2lkLCBwX2NiLT5hZGRyKTsKLQotICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShwX2NiLT53NF9ldnQsICh0QlRBX0hIKikmaHNfZGF0YSk7Ci0KLSAgcF9jYi0+dzRfZXZ0ID0gMDsKLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBkYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9vcGVuX2ZhaWx1cmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHJlcG9ydCBISUQgb3BlbiBmYWlsdXJlIHdoZW4gYXQgd2FpdCBmb3IgY29ubmVjdGlvbiBzdGF0ZQotICogICAgICAgICAgICAgICAgICBhbmQgcmVjZWl2ZSBkZXZpY2UgY2xvc2UgZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9vcGVuX2ZhaWx1cmUodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEhfQ09OTiBjb25uX2RhdDsKLSAgdWludDMyX3QgcmVhc29uID0gcF9kYXRhLT5oaWRfY2JhY2suZGF0YTsgLyogUmVhc29uIGZvciBjbG9zaW5nICgzMi1iaXQpICovCi0KLSAgbWVtc2V0KCZjb25uX2RhdCwgMCwgc2l6ZW9mKHRCVEFfSEhfQ09OTikpOwotICBjb25uX2RhdC5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlOwotICBjb25uX2RhdC5zdGF0dXMgPQotICAgICAgKHJlYXNvbiA9PSBISURfRVJSX0FVVEhfRkFJTEVEKSA/IEJUQV9ISF9FUlJfQVVUSF9GQUlMRUQgOiBCVEFfSEhfRVJSOwotICBjb25uX2RhdC5iZGEgPSBwX2NiLT5hZGRyOwotICBISURfSG9zdENsb3NlRGV2KHBfY2ItPmhpZF9oYW5kbGUpOwotCi0gIC8qIFJlcG9ydCBPUEVOIGZhaWwgZXZlbnQgKi8KLSAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX09QRU5fRVZULCAodEJUQV9ISCopJmNvbm5fZGF0KTsKLQotICBidGFfaGhfdHJhY2VfZGV2X2RiKCk7Ci0gIC8qIGNsZWFuIHVwIGNvbnRyb2wgYmxvY2ssIGJ1dCByZXRhaW4gU0RQIGluZm8gYW5kIGRldmljZSBoYW5kbGUgKi8KLSAgcF9jYi0+dnAgPSBmYWxzZTsKLSAgcF9jYi0+dzRfZXZ0ID0gMDsKLQotICAvKiBpZiBubyBjb25uZWN0aW9uIGlzIGFjdGl2ZSBhbmQgSEggZGlzYWJsZSBpcyBzaWduYWxlZCwgZGlzYWJsZSBzZXJ2aWNlICovCi0gIGlmIChidGFfaGhfY2IuY250X251bSA9PSAwICYmIGJ0YV9oaF9jYi53NF9kaXNhYmxlKSB7Ci0gICAgYnRhX2hoX2Rpc2NfY21wbCgpOwotICB9Ci0KLSAgLyogRXJyb3IgaW4gb3BlbmluZyBoaWQgY29ubmVjdGlvbiwgcmVzZXQgZmxhZ3MgKi8KLSAgcF9jYi0+aW5jb21pbmdfY29ubiA9IGZhbHNlOwotICBwX2NiLT5pbmNvbWluZ19oaWRfaGFuZGxlID0gQlRBX0hIX0lOVkFMSURfSEFORExFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2Nsb3NlX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSElEIEhvc3QgcHJvY2VzcyBhIGNsb3NlIGV2ZW50Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9jbG9zZV9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEhfQ09OTiBjb25uX2RhdDsKLSAgdEJUQV9ISF9DQkRBVEEgZGlzY19kYXQgPSB7QlRBX0hIX09LLCAwfTsKLQotICB1aW50MzJfdCByZWFzb24gPSBwX2RhdGEtPmhpZF9jYmFjay5kYXRhOyAvKiBSZWFzb24gZm9yIGNsb3NpbmcgKDMyLWJpdCkgKi8KLSAgY29uc3QgYm9vbCBsMmNhcF9jb25uX2ZhaWwgPSByZWFzb24gJiBISURfTDJDQVBfQ09OTl9GQUlMOwotICBjb25zdCBib29sIGwyY2FwX3JlcV9mYWlsID0gcmVhc29uICYgSElEX0wyQ0FQX1JFUV9GQUlMOwotICBjb25zdCBib29sIGwyY2FwX2NmZ19mYWlsID0gcmVhc29uICYgSElEX0wyQ0FQX0NGR19GQUlMOwotICBjb25zdCB0SElEX1NUQVRVUyBoaWRfc3RhdHVzID0gc3RhdGljX2Nhc3Q8dEhJRF9TVEFUVVM+KHJlYXNvbiAmIDB4ZmYpOwotCi0gIC8qIGlmIEhJRF9IREVWX0VWVF9WQ19VTlBMVUcgd2FzIHJlY2VpdmVkLCByZXBvcnQgQlRBX0hIX1ZDX1VOUExVR19FVlQgKi8KLSAgdWludDE2X3QgZXZlbnQgPSBwX2NiLT52cCA/IEJUQV9ISF9WQ19VTlBMVUdfRVZUIDogQlRBX0hIX0NMT1NFX0VWVDsKLQotICBkaXNjX2RhdC5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlOwotICBkaXNjX2RhdC5zdGF0dXMgPSB0b19idGFfaGhfc3RhdHVzKHBfZGF0YS0+aGlkX2NiYWNrLmRhdGEpOwotCi0gIHN0ZDo6c3RyaW5nIG92ZXJsYXlfZmFpbCA9Ci0gICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVzICVzICVzIiwgKGwyY2FwX2Nvbm5fZmFpbCkgPyAibDJjYXBfY29ubl9mYWlsIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIChsMmNhcF9yZXFfZmFpbCkgPyAibDJjYXBfcmVxX2ZhaWwiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGwyY2FwX2NmZ19mYWlsKSA/ICJsMmNhcF9jZmdfZmFpbCIgOiAiIik7Ci0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIHBfY2ItPmFkZHIsICJDbG9zZWQiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVzIHJlYXNvbiAlcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9jYi0+aXNfbGVfZGV2aWNlKSA/ICJsZSIgOiAiY2xhc3NpYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRfc3RhdHVzX3RleHQoaGlkX3N0YXR1cykuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfZmFpbC5jX3N0cigpKSk7Ci0KLSAgLyogQ2hlY2sgcmVhc29uIGZvciBjbG9zaW5nICovCi0gIGlmICgocmVhc29uICYgKEhJRF9MMkNBUF9DT05OX0ZBSUwgfAotICAgICAgICAgICAgICAgICBISURfTDJDQVBfUkVRX0ZBSUwpKSB8fCAvKiBGYWlsdXJlIHRvIGluaXRpYWxpemUgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZSB0aW1lb3V0IG9yIGwyY2FwIGVycm9yKSAqLwotICAgICAgKHJlYXNvbiA9PQotICAgICAgIEhJRF9FUlJfQVVUSF9GQUlMRUQpIHx8IC8qIEF1dGhlbmljYXRpb24gZXJyb3IgKHdoaWxlIGluaXRpYXRpbmcpICovCi0gICAgICAocmVhc29uID09IEhJRF9FUlJfTDJDQVBfRkFJTEVEKSkgLyogRmFpbHVyZSBjcmVhdGluZyBsMmNhcCBjb25uZWN0aW9uICovCi0gIHsKLSAgICAvKiBGYWlsdXJlIGluIG9wZW5pbmcgY29ubmVjdGlvbiAqLwotICAgIGNvbm5fZGF0LmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gICAgY29ubl9kYXQuc3RhdHVzID0KLSAgICAgICAgKHJlYXNvbiA9PSBISURfRVJSX0FVVEhfRkFJTEVEKSA/IEJUQV9ISF9FUlJfQVVUSF9GQUlMRUQgOiBCVEFfSEhfRVJSOwotICAgIGNvbm5fZGF0LmJkYSA9IHBfY2ItPmFkZHI7Ci0gICAgSElEX0hvc3RDbG9zZURldihwX2NiLT5oaWRfaGFuZGxlKTsKLQotICAgIC8qIFJlcG9ydCBPUEVOIGZhaWwgZXZlbnQgKi8KLSAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfT1BFTl9FVlQsICh0QlRBX0hIKikmY29ubl9kYXQpOwotCi0gICAgYnRhX2hoX3RyYWNlX2Rldl9kYigpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBvdGhlcndpc2UgcmVwb3J0IENMT1NFL1ZDX1VOUExVRyBldmVudCAqLwotICBlbHNlIHsKLSAgICAvKiBmaW5hbGl6YSBkZXZpY2UgZHJpdmVyICovCi0gICAgYnRhX2hoX2NvX2Nsb3NlKHBfY2ItPmhpZF9oYW5kbGUsIHBfY2ItPmFwcF9pZCk7Ci0gICAgLyogaW5mb3JtIHJvbGUgbWFuYWdlciAqLwotICAgIGJ0YV9zeXNfY29ubl9jbG9zZShCVEFfSURfSEgsIHBfY2ItPmFwcF9pZCwgcF9jYi0+YWRkcik7Ci0gICAgLyogdXBkYXRlIHRvdGFsIGNvbm4gbnVtYmVyICovCi0gICAgYnRhX2hoX2NiLmNudF9udW0tLTsKLQotICAgIGlmIChkaXNjX2RhdC5zdGF0dXMpIGRpc2NfZGF0LnN0YXR1cyA9IEJUQV9ISF9FUlI7Ci0KLSAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShldmVudCwgKHRCVEFfSEgqKSZkaXNjX2RhdCk7Ci0KLSAgICAvKiBpZiB2aXJ0dWFsbHkgdW5wbHVnLCByZW1vdmUgZGV2aWNlICovCi0gICAgaWYgKHBfY2ItPnZwKSB7Ci0gICAgICBISURfSG9zdFJlbW92ZURldihwX2NiLT5oaWRfaGFuZGxlKTsKLSAgICAgIGJ0YV9oaF9jbGVhbl91cF9rZGV2KHBfY2IpOwotICAgIH0KLQotICAgIGJ0YV9oaF90cmFjZV9kZXZfZGIoKTsKLSAgfQotCi0gIC8qIGNsZWFuIHVwIGNvbnRyb2wgYmxvY2ssIGJ1dCByZXRhaW4gU0RQIGluZm8gYW5kIGRldmljZSBoYW5kbGUgKi8KLSAgcF9jYi0+dnAgPSBmYWxzZTsKLSAgcF9jYi0+dzRfZXZ0ID0gMDsKLQotICAvKiBpZiBubyBjb25uZWN0aW9uIGlzIGFjdGl2ZSBhbmQgSEggZGlzYWJsZSBpcyBzaWduYWxlZCwgZGlzYWJsZSBzZXJ2aWNlICovCi0gIGlmIChidGFfaGhfY2IuY250X251bSA9PSAwICYmIGJ0YV9oaF9jYi53NF9kaXNhYmxlKSB7Ci0gICAgYnRhX2hoX2Rpc2NfY21wbCgpOwotICB9Ci0KLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2dldF9kc2NwX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IGRldmljZSByZXBvcnQgZGVzY3JpcHRvcgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfZ2V0X2RzY3BfYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIGlmIChwX2NiLT5pc19sZV9kZXZpY2UpIHsKLSAgICBidGFfaGhfbGVfZ2V0X2RzY3BfYWN0KHBfY2IpOwotICB9IGVsc2UKLSAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfR0VUX0RTQ1BfRVZULCAodEJUQV9ISCopJnBfY2ItPmRzY3BfaW5mbyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbWFpbnRfZGV2X2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSElEIEhvc3QgbWFpbnRhaW4gZGV2aWNlIGxpc3QuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9tYWludF9kZXZfYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSkgewotICBjb25zdCB0QlRBX0hIX01BSU5UX0RFViogcF9kZXZfaW5mbyA9ICZwX2RhdGEtPmFwaV9tYWludGRldjsKLSAgdEJUQV9ISF9ERVZfSU5GTyBkZXZfaW5mbzsKLSAgdWludDhfdCBkZXZfaGFuZGxlOwotCi0gIGRldl9pbmZvLnN0YXR1cyA9IEJUQV9ISF9FUlI7Ci0gIGRldl9pbmZvLmhhbmRsZSA9IEJUQV9ISF9JTlZBTElEX0hBTkRMRTsKLQotICBzd2l0Y2ggKHBfZGV2X2luZm8tPnN1Yl9ldmVudCkgewotICAgIGNhc2UgQlRBX0hIX0FERF9ERVZfRVZUOiAvKiBhZGQgYSBkZXZpY2UgKi8KLSAgICAgIGRldl9pbmZvLmJkYSA9IHBfZGV2X2luZm8tPmJkYTsKLSAgICAgIC8qIGluaXRpYWxpemUgY2FsbGJhY2sgZGF0YSAqLwotICAgICAgaWYgKHBfY2ItPmhpZF9oYW5kbGUgPT0gQlRBX0hIX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICAgIGlmIChCVE1fVXNlTGVMaW5rKHBfZGF0YS0+YXBpX2Nvbm4uYmRfYWRkcikpIHsKLSAgICAgICAgICBwX2NiLT5pc19sZV9kZXZpY2UgPSB0cnVlOwotICAgICAgICAgIGRldl9pbmZvLmhhbmRsZSA9IGJ0YV9oaF9sZV9hZGRfZGV2aWNlKHBfY2IsIHBfZGV2X2luZm8pOwotICAgICAgICAgIGlmIChkZXZfaW5mby5oYW5kbGUgIT0gQlRBX0hIX0lOVkFMSURfSEFORExFKQotICAgICAgICAgICAgZGV2X2luZm8uc3RhdHVzID0gQlRBX0hIX09LOwotICAgICAgICB9IGVsc2UKLQotICAgICAgICAgICAgaWYgKEhJRF9Ib3N0QWRkRGV2KHBfZGV2X2luZm8tPmJkYSwgcF9kZXZfaW5mby0+YXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZfaGFuZGxlKSA9PSBISURfU1VDQ0VTUykgewotICAgICAgICAgIGRldl9pbmZvLmhhbmRsZSA9IGRldl9oYW5kbGU7Ci0gICAgICAgICAgZGV2X2luZm8uc3RhdHVzID0gQlRBX0hIX09LOwotCi0gICAgICAgICAgLyogdXBkYXRlIERJIGluZm9ybWF0aW9uICovCi0gICAgICAgICAgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvKHBfY2IsIHBfZGV2X2luZm8tPmRzY3BfaW5mby52ZW5kb3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X2luZm8tPmRzY3BfaW5mby5wcm9kdWN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9pbmZvLT5kc2NwX2luZm8udmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfaW5mby0+ZHNjcF9pbmZvLmZsYWcpOwotICAgICAgICAgIC8qIGFkZCB0byBCVEEgZGV2aWNlIGxpc3QgKi8KLSAgICAgICAgICBidGFfaGhfYWRkX2RldmljZV90b19saXN0KAotICAgICAgICAgICAgICBwX2NiLCBkZXZfaGFuZGxlLCBwX2Rldl9pbmZvLT5hdHRyX21hc2ssCi0gICAgICAgICAgICAgICZwX2Rldl9pbmZvLT5kc2NwX2luZm8uZGVzY3JpcHRvciwgcF9kZXZfaW5mby0+c3ViX2NsYXNzLAotICAgICAgICAgICAgICBwX2Rldl9pbmZvLT5kc2NwX2luZm8uc3NyX21heF9sYXRlbmN5LAotICAgICAgICAgICAgICBwX2Rldl9pbmZvLT5kc2NwX2luZm8uc3NyX21pbl90b3V0LCBwX2Rldl9pbmZvLT5hcHBfaWQpOwotICAgICAgICAgIC8qIHVwZGF0ZSBjYl9pbmRleFtdIG1hcCAqLwotICAgICAgICAgIGJ0YV9oaF9jYi5jYl9pbmRleFtkZXZfaGFuZGxlXSA9IHBfY2ItPmluZGV4OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgLyogZGV2aWNlIGFscmVhZHkgYmVlbiBhZGRlZCAqLwotICAgICAgewotICAgICAgICBkZXZfaW5mby5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlOwotICAgICAgICBkZXZfaW5mby5zdGF0dXMgPSBCVEFfSEhfT0s7Ci0gICAgICB9Ci0gICAgICBidGFfaGhfdHJhY2VfZGV2X2RiKCk7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hIX1JNVl9ERVZfRVZUOiAvKiByZW1vdmUgZGV2aWNlICovCi0gICAgICBkZXZfaW5mby5oYW5kbGUgPSAodWludDhfdClwX2Rldl9pbmZvLT5oZHIubGF5ZXJfc3BlY2lmaWM7Ci0gICAgICBkZXZfaW5mby5iZGEgPSBwX2NiLT5hZGRyOwotCi0gICAgICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKSB7Ci0gICAgICAgIGJ0YV9oaF9sZV9yZW1vdmVfZGV2X2JnX2Nvbm4ocF9jYik7Ci0gICAgICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9BUElfQ0xPU0VfRVZULCBOVUxMKTsKLSAgICAgICAgYnRhX2hoX2NsZWFuX3VwX2tkZXYocF9jYik7Ci0gICAgICB9IGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKEhJRF9Ib3N0UmVtb3ZlRGV2KGRldl9pbmZvLmhhbmRsZSkgPT0gSElEX1NVQ0NFU1MpIHsKLSAgICAgICAgICBkZXZfaW5mby5zdGF0dXMgPSBCVEFfSEhfT0s7Ci0KLSAgICAgICAgICAvKiByZW1vdmUgZnJvbSBrbm93biBkZXZpY2UgbGlzdCBpbiBCVEEgKi8KLSAgICAgICAgICBidGFfaGhfY2xlYW5fdXBfa2RldihwX2NiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiaW52YWxpZCBjb21tYW5kIik7Ci0gICAgICBicmVhazsKLSAgfQotCi0gICgqYnRhX2hoX2NiLnBfY2JhY2spKHBfZGV2X2luZm8tPnN1Yl9ldmVudCwgKHRCVEFfSEgqKSZkZXZfaW5mbyk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX3dyaXRlX2Rldl9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFdyaXRlIGRldmljZSBhY3Rpb24uIGNhbiBiZSBTRVQvR0VUL0RBVEEgdHJhbnNhY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGNvbnZlcnRfYXBpX3NuZGNtZF9wYXJhbShjb25zdCB0QlRBX0hIX0NNRF9EQVRBJiBhcGlfc25kY21kKSB7Ci0gIHVpbnQ4X3QgYXBpX3NuZGNtZF9wYXJhbSA9IGFwaV9zbmRjbWQucGFyYW07Ci0gIGlmIChhcGlfc25kY21kLnRfdHlwZSA9PSBISURfVFJBTlNfU0VUX1BST1RPQ09MKSB7Ci0gICAgYXBpX3NuZGNtZF9wYXJhbSA9IChhcGlfc25kY21kLnBhcmFtID09IEJUQV9ISF9QUk9UT19SUFRfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSElEX1BBUl9QUk9UT0NPTF9SRVBPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSElEX1BBUl9QUk9UT0NPTF9CT09UX01PREU7Ci0gIH0KLSAgcmV0dXJuIGFwaV9zbmRjbWRfcGFyYW07Ci19Ci0KLXZvaWQgYnRhX2hoX3dyaXRlX2Rldl9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEhfQ0JEQVRBIGNiZGF0YSA9IHtCVEFfSEhfT0ssIDB9OwotICB1aW50MTZfdCBldmVudCA9Ci0gICAgICAocF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSAtIEhJRF9UUkFOU19HRVRfUkVQT1JUKSArIEJUQV9ISF9HRVRfUlBUX0VWVDsKLQotICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKQotICAgIGJ0YV9oaF9sZV93cml0ZV9kZXZfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gIGVsc2UKLSAgewotCi0gICAgY2JkYXRhLmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0KLSAgICAvKiBtYXRjaCB1cCBCVEUvQlRBIHJlcG9ydC9ib290IG1vZGUgZGVmICovCi0gICAgY29uc3QgdWludDhfdCBhcGlfc25kY21kX3BhcmFtID0KLSAgICAgICAgY29udmVydF9hcGlfc25kY21kX3BhcmFtKHBfZGF0YS0+YXBpX3NuZGNtZCk7Ci0KLSAgICBpZiAoSElEX0hvc3RXcml0ZURldihwX2NiLT5oaWRfaGFuZGxlLCBwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFwaV9zbmRjbWRfcGFyYW0sIHBfZGF0YS0+YXBpX3NuZGNtZC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX3NuZGNtZC5ycHRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnBfZGF0YSkgIT0gSElEX1NVQ0NFU1MpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIkhJRF9Ib3N0V3JpdGVEZXYgRXJyb3IgIik7Ci0gICAgICBjYmRhdGEuc3RhdHVzID0gQlRBX0hIX0VSUjsKLQotICAgICAgaWYgKHBfZGF0YS0+YXBpX3NuZGNtZC50X3R5cGUgIT0gSElEX1RSQU5TX0NPTlRST0wgJiYKLSAgICAgICAgICBwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlICE9IEhJRF9UUkFOU19EQVRBKQotICAgICAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShldmVudCwgKHRCVEFfSEgqKSZjYmRhdGEpOwotICAgICAgZWxzZSBpZiAoYXBpX3NuZGNtZF9wYXJhbSA9PSBCVEFfSEhfQ1RSTF9WSVJUVUFMX0NBQkxFX1VOUExVRykKLSAgICAgICAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX1ZDX1VOUExVR19FVlQsICh0QlRBX0hIKikmY2JkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlKSB7Ci0gICAgICAgIGNhc2UgSElEX1RSQU5TX1NFVF9QUk9UT0NPTDoKLSAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgICAgY2FzZSBISURfVFJBTlNfR0VUX1JFUE9SVDoKLSAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgICAgY2FzZSBISURfVFJBTlNfU0VUX1JFUE9SVDoKLSAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgICAgY2FzZSBISURfVFJBTlNfR0VUX1BST1RPQ09MOgotICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgICAgICBjYXNlIEhJRF9UUkFOU19HRVRfSURMRToKLSAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgIC8qIEZBTExUSFJPVUdIICovCi0gICAgICAgIGNhc2UgSElEX1RSQU5TX1NFVF9JRExFOiAvKiBzZXQgdzRfaGFuZHNrIGV2ZW50IG5hbWUgZm9yIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1c2UgKi8KLSAgICAgICAgICBwX2NiLT53NF9ldnQgPSBldmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBISURfVFJBTlNfREFUQTogLyogb3V0cHV0IHJlcG9ydCAqLwotICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgICAgICBjYXNlIEhJRF9UUkFOU19DT05UUk9MOgotICAgICAgICAgIC8qIG5vIGhhbmRzaGFrZSBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCAqLwotICAgICAgICAgIC8qIGlmIFZDX1VOUExVRyBpcyBpc3N1ZWQsIHNldCBmbGFnICovCi0gICAgICAgICAgaWYgKGFwaV9zbmRjbWRfcGFyYW0gPT0gQlRBX0hIX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUcpCi0gICAgICAgICAgICBwX2NiLT52cCA9IHRydWU7Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgLyogY3VycmVudGx5IG5vdCBleHBlY3RlZCAqLwotICAgICAgICBjYXNlIEhJRF9UUkFOU19EQVRBQzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY21kIHR5cGUgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGlmIG5vdCBjb250cm9sIHR5cGUgdHJhbnNhY3Rpb24sIG5vdGlmeSBQTSBmb3IgZW5lcmd5IGNvbnRyb2wgKi8KLSAgICAgIGlmIChwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlICE9IEhJRF9UUkFOU19DT05UUk9MKSB7Ci0gICAgICAgIC8qIGluZm9ybSBQTSBmb3IgbW9kZSBjaGFuZ2UgKi8KLSAgICAgICAgYnRhX3N5c19idXN5KEJUQV9JRF9ISCwgcF9jYi0+YXBwX2lkLCBwX2NiLT5hZGRyKTsKLSAgICAgICAgYnRhX3N5c19pZGxlKEJUQV9JRF9ISCwgcF9jYi0+YXBwX2lkLCBwX2NiLT5hZGRyKTsKLSAgICAgIH0gZWxzZSBpZiAoYXBpX3NuZGNtZF9wYXJhbSA9PSBCVEFfSEhfQ1RSTF9TVVNQRU5EKSB7Ci0gICAgICAgIGJ0YV9zeXNfc2NvX2Nsb3NlKEJUQV9JRF9ISCwgcF9jYi0+YXBwX2lkLCBwX2NiLT5hZGRyKTsKLSAgICAgIH0gZWxzZSBpZiAoYXBpX3NuZGNtZF9wYXJhbSA9PSBCVEFfSEhfQ1RSTF9FWElUX1NVU1BFTkQpIHsKLSAgICAgICAgYnRhX3N5c19idXN5KEJUQV9JRF9ISCwgcF9jYi0+YXBwX2lkLCBwX2NiLT5hZGRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgRnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRBIEhIIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2NiYWNrKHVpbnQ4X3QgZGV2X2hhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV2ZW50LCB1aW50MzJfdCBkYXRhLCBCVF9IRFIqIHBkYXRhKSB7Ci0gIHVpbnQxNl90IHNtX2V2ZW50ID0gQlRBX0hIX0lOVkFMSURfRVZUOwotICB1aW50OF90IHh4ID0gMDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczo6SElEX2V2ZW50IFslc10iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBidGFfaGhfaGlkX2V2ZW50X25hbWUoZXZlbnQpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBISURfSERFVl9FVlRfT1BFTjoKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hIX0lOVF9PUEVOX0VWVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX0hERVZfRVZUX0NMT1NFOgotICAgICAgc21fZXZlbnQgPSBCVEFfSEhfSU5UX0NMT1NFX0VWVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX0hERVZfRVZUX0lOVFJfREFUQToKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hIX0lOVF9EQVRBX0VWVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX0hERVZfRVZUX0hBTkRTSEFLRToKLSAgICAgIHNtX2V2ZW50ID0gQlRBX0hIX0lOVF9IQU5EU0tfRVZUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBISURfSERFVl9FVlRfQ1RSTF9EQVRBOgotICAgICAgc21fZXZlbnQgPSBCVEFfSEhfSU5UX0NUUkxfREFUQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX0hERVZfRVZUX1JFVFJZSU5HOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBISURfSERFVl9FVlRfSU5UUl9EQVRDOgotICAgIGNhc2UgSElEX0hERVZfRVZUX0NUUkxfREFUQzoKLSAgICAgIC8qIFVuaGFuZGxlZCBldmVudHM6IEZyZWUgYnVmZmVyIGZvciBEQVRBQyAqLwotICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBkYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX0hERVZfRVZUX1ZDX1VOUExVRzoKLSAgICAgIGZvciAoeHggPSAwOyB4eCA8IEJUQV9ISF9NQVhfREVWSUNFOyB4eCsrKSB7Ci0gICAgICAgIGlmIChidGFfaGhfY2Iua2Rldlt4eF0uaGlkX2hhbmRsZSA9PSBkZXZfaGFuZGxlKSB7Ci0gICAgICAgICAgYnRhX2hoX2NiLmtkZXZbeHhdLnZwID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoc21fZXZlbnQgIT0gQlRBX0hIX0lOVkFMSURfRVZUKSB7Ci0gICAgdEJUQV9ISF9DQkFDS19EQVRBKiBwX2J1ZiA9ICh0QlRBX0hIX0NCQUNLX0RBVEEqKW9zaV9tYWxsb2MoCi0gICAgICAgIHNpemVvZih0QlRBX0hIX0NCQUNLX0RBVEEpICsgc2l6ZW9mKEJUX0hEUikpOwotICAgIHBfYnVmLT5oZHIuZXZlbnQgPSBzbV9ldmVudDsKLSAgICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gKHVpbnQxNl90KWRldl9oYW5kbGU7Ci0gICAgcF9idWYtPmRhdGEgPSBkYXRhOwotICAgIHBfYnVmLT5hZGRyID0gYWRkcjsKLSAgICBwX2J1Zi0+cF9kYXRhID0gcGRhdGE7Ci0KLSAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZ2V0X3RyYW5zX3N0YXR1cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgdHJhbnNsYXRlIGEgaGFuZHNoYWtlIHJlc3VsdCBjb2RlIGludG8gQlRBIEhICi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1cyBjb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0hIX1NUQVRVUyBidGFfaGhfZ2V0X3RyYW5zX3N0YXR1cyh1aW50MzJfdCByZXN1bHQpIHsKLSAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICBjYXNlIEhJRF9QQVJfSEFORFNIQUtFX1JTUF9TVUNDRVNTOiAvKiAgICgwKSAqLwotICAgICAgcmV0dXJuIEJUQV9ISF9PSzsKLSAgICBjYXNlIEhJRF9QQVJfSEFORFNIQUtFX1JTUF9OT1RfUkVBRFk6ICAgICAgICAgICAvKiAgICgxKSAqLwotICAgIGNhc2UgSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9JTlZBTElEX1JFUF9JRDogIC8qICAgKDIpICovCi0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX1VOU1VQUE9SVEVEX1JFUTogLyogICAoMykgKi8KLSAgICBjYXNlIEhJRF9QQVJfSEFORFNIQUtFX1JTUF9FUlJfSU5WQUxJRF9QQVJBTTogICAvKiAgICg0KSAqLwotICAgICAgcmV0dXJuICh0QlRBX0hIX1NUQVRVUylyZXN1bHQ7Ci0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX1VOS05PV046IC8qICAgKDE0KSAqLwotICAgIGNhc2UgSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9GQVRBTDogICAvKiAgICgxNSkgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUQV9ISF9IU19FUlJPUjsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBEZWJ1ZyBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX2dldF93NF9ldmVudCh1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfSEhfR0VUX1JQVF9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9HRVRfUlBUX0VWVCI7Ci0gICAgY2FzZSBCVEFfSEhfU0VUX1JQVF9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9TRVRfUlBUX0VWVCI7Ci0gICAgY2FzZSBCVEFfSEhfR0VUX1BST1RPX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX0dFVF9QUk9UT19FVlQiOwotICAgIGNhc2UgQlRBX0hIX1NFVF9QUk9UT19FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9TRVRfUFJPVE9fRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9HRVRfSURMRV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9HRVRfSURMRV9FVlQiOwotICAgIGNhc2UgQlRBX0hIX1NFVF9JRExFX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX1NFVF9JRExFX0VWVCI7Ci0gICAgY2FzZSBCVEFfSEhfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9PUEVOX0VWVCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBldmVudCI7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9oaF9oaWRfZXZlbnRfbmFtZSh1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBISURfSERFVl9FVlRfT1BFTjoKLSAgICAgIHJldHVybiAiSElEX0hERVZfRVZUX09QRU4iOwotICAgIGNhc2UgSElEX0hERVZfRVZUX0NMT1NFOgotICAgICAgcmV0dXJuICJISURfSERFVl9FVlRfQ0xPU0UiOwotICAgIGNhc2UgSElEX0hERVZfRVZUX1JFVFJZSU5HOgotICAgICAgcmV0dXJuICJISURfSERFVl9FVlRfUkVUUllJTkciOwotICAgIGNhc2UgSElEX0hERVZfRVZUX0lOVFJfREFUQToKLSAgICAgIHJldHVybiAiSElEX0hERVZfRVZUX0lOVFJfREFUQSI7Ci0gICAgY2FzZSBISURfSERFVl9FVlRfSU5UUl9EQVRDOgotICAgICAgcmV0dXJuICJISURfSERFVl9FVlRfSU5UUl9EQVRDIjsKLSAgICBjYXNlIEhJRF9IREVWX0VWVF9DVFJMX0RBVEE6Ci0gICAgICByZXR1cm4gIkhJRF9IREVWX0VWVF9DVFJMX0RBVEEiOwotICAgIGNhc2UgSElEX0hERVZfRVZUX0NUUkxfREFUQzoKLSAgICAgIHJldHVybiAiSElEX0hERVZfRVZUX0NUUkxfREFUQyI7Ci0gICAgY2FzZSBISURfSERFVl9FVlRfSEFORFNIQUtFOgotICAgICAgcmV0dXJuICJISURfSERFVl9FVlRfSEFORFNIQUtFIjsKLSAgICBjYXNlIEhJRF9IREVWX0VWVF9WQ19VTlBMVUc6Ci0gICAgICByZXR1cm4gIkhJRF9IREVWX0VWVF9WQ19VTlBMVUciOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gSElEIGV2ZW50IjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL2hoL2J0YV9oaF9hcGkuY2MgYi9idGEvaGgvYnRhX2hoX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0MTc5NC4uMDAwMDAwMAotLS0gYS9idGEvaGgvYnRhX2hoX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA1LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSElEIEhPU1QgQVBJIGluIHRoZSBzdWJzeXN0ZW0gb2YgQlRBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRhX2hoIgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotLy8gQlRBX0hIX0lOQ0xVREVECi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaWYgKEJUQV9ISF9JTkNMVURFRCA9PSBUUlVFKQotCi0jaW5jbHVkZSAiYnRhL2hoL2J0YV9oaF9pbnQuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjb25zdCB0QlRBX1NZU19SRUcgYnRhX2hoX3JlZyA9IHtidGFfaGhfaGRsX2V2ZW50LCBCVEFfSGhEaXNhYmxlfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaEVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIHRoZSBISUQgaG9zdC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlCi0gKiAgICAgICAgICAgICAgICAgIGFueSBvdGhlciBmdW5jdGlvbnMgaW4gdGhlIEhJRCBob3N0IEFQSSBhcmUgY2FsbGVkLiBXaGVuIHRoZQotICogICAgICAgICAgICAgICAgICBlbmFibGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIEJUQV9ISF9FTkFCTEVfRVZULgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhFbmFibGUodEJUQV9ISF9DQkFDSyogcF9jYmFjaykgewotICAvKiByZWdpc3RlciB3aXRoIEJUQSBzeXN0ZW0gbWFuYWdlciAqLwotICBidGFfc3lzX3JlZ2lzdGVyKEJUQV9JRF9ISCwgJmJ0YV9oaF9yZWcpOwotCi0gIHBvc3Rfb25fYnRfbWFpbihbcF9jYmFja10oKSB7Ci0gICAgdEJUQV9ISF9EQVRBIGRhdGEgPSB7Ci0gICAgICAgIC5hcGlfZW5hYmxlID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAuaGRyID0KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLmV2ZW50ID0gQlRBX0hIX0FQSV9FTkFCTEVfRVZULAotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIC5wX2NiYWNrID0gcF9jYmFjaywKLSAgICAgICAgICAgIH0sCi0gICAgfTsKLSAgICBidGFfaGhfYXBpX2VuYWJsZSgmZGF0YSk7Ci0gIH0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzYWJsZSB0aGUgSElEIGhvc3QuIElmIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoRGlzYWJsZSh2b2lkKSB7Ci0gIGJ0YV9zeXNfZGVyZWdpc3RlcihCVEFfSURfSEgpOwotCi0gIHBvc3Rfb25fYnRfbWFpbihbXSgpIHsgYnRhX2hoX2FwaV9kaXNhYmxlKCk7IH0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2Nvbm5lY3QgYSBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaENsb3NlKHVpbnQ4X3QgZGV2X2hhbmRsZSkgewotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX2NhbGxvYyhzaXplb2YoQlRfSERSKSk7Ci0KLSAgcF9idWYtPmV2ZW50ID0gQlRBX0hIX0FQSV9DTE9TRV9FVlQ7Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9ICh1aW50MTZfdClkZXZfaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb25uZWN0IHRvIGEgZGV2aWNlIG9mIHNwZWNpZmllZCBCRCBhZGRyZXNzIGluIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBwcm90b2NvbCBtb2RlIGFuZCBzZWN1cml0eSBsZXZlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhPcGVuKGNvbnN0IFJhd0FkZHJlc3MmIGRldl9iZGEpIHsKLSAgdEJUQV9ISF9BUElfQ09OTiogcF9idWYgPQotICAgICAgKHRCVEFfSEhfQVBJX0NPTk4qKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfSEhfQVBJX0NPTk4pKTsKLSAgdEJUQV9ISF9QUk9UT19NT0RFIG1vZGUgPSBCVEFfSEhfUFJPVE9fUlBUX01PREU7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9ISF9BUElfT1BFTl9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0gIHBfYnVmLT5tb2RlID0gbW9kZTsKLSAgcF9idWYtPmJkX2FkZHIgPSBkZXZfYmRhOwotCi0gIGJ0YV9zeXNfc2VuZG1zZygodm9pZCopcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICBidGFfaGhfc25kX3dyaXRlX2RldgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfc25kX3dyaXRlX2Rldih1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3QgdF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXJhbSwgdWludDE2X3QgZGF0YSwgdWludDhfdCBycHRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfZGF0YSkgewotICB0QlRBX0hIX0NNRF9EQVRBKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9ISF9DTURfREFUQSopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ISF9DTURfREFUQSkpOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfSEhfQVBJX1dSSVRFX0RFVl9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSAodWludDE2X3QpZGV2X2hhbmRsZTsKLSAgcF9idWYtPnRfdHlwZSA9IHRfdHlwZTsKLSAgcF9idWYtPmRhdGEgPSBkYXRhOwotICBwX2J1Zi0+cGFyYW0gPSBwYXJhbTsKLSAgcF9idWYtPnBfZGF0YSA9IHBfZGF0YTsKLSAgcF9idWYtPnJwdF9pZCA9IHJwdF9pZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoU2V0UmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIFNFVF9SRVBPUlQgdG8gZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgZGV2X2hhbmRsZTogZGV2aWNlIGhhbmRsZQotICogICAgICAgICAgICAgICAgICByX3R5cGU6ICAgICByZXBvcnQgdHlwZSwgY291bGQgYmUgQlRBX0hIX1JQVFRfT1VUUFVUIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9ISF9SUFRUX0ZFQVRVUkUuCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhTZXRSZXBvcnQodWludDhfdCBkZXZfaGFuZGxlLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9kYXRhKSB7Ci0gIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19TRVRfUkVQT1JULCByX3R5cGUsIDAsIDAsIHBfZGF0YSk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoR2V0UmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgR0VUX1JFUE9SVCB0byBISUQgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaEdldFJlcG9ydCh1aW50OF90IGRldl9oYW5kbGUsIHRCVEFfSEhfUlBUX1RZUEUgcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBycHRfaWQsIHVpbnQxNl90IGJ1Zl9zaXplKSB7Ci0gIHVpbnQ4X3QgcGFyYW0gPSAoYnVmX3NpemUpID8gKHJfdHlwZSB8IDB4MDgpIDogcl90eXBlOwotCi0gIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19HRVRfUkVQT1JULCBwYXJhbSwgYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHJwdF9pZCwgTlVMTCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoU2V0UHJvdG9Nb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgcHJvdG9jb2wgbW9kZSBhdCBzcGVjaWZpZWQgSElEIGhhbmRsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaFNldFByb3RvTW9kZSh1aW50OF90IGRldl9oYW5kbGUsIHRCVEFfSEhfUFJPVE9fTU9ERSBwX3R5cGUpIHsKLSAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX1NFVF9QUk9UT0NPTCwgKHVpbnQ4X3QpcF90eXBlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhHZXRQcm90b01vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0IHByb3RvY29sIG1vZGUgaW5mb3JtYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoR2V0UHJvdG9Nb2RlKHVpbnQ4X3QgZGV2X2hhbmRsZSkgewotICBidGFfaGhfc25kX3dyaXRlX2RldihkZXZfaGFuZGxlLCBISURfVFJBTlNfR0VUX1BST1RPQ09MLCAwLCAwLCAwLCBOVUxMKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhTZXRJZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIFNFVF9JRExFIHRvIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhTZXRJZGxlKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDE2X3QgaWRsZV9yYXRlKSB7Ci0gIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19TRVRfSURMRSwgMCwgaWRsZV9yYXRlLCAwLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaEdldElkbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBHRVRfSURMRSBmcm9tIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hoR2V0SWRsZSh1aW50OF90IGRldl9oYW5kbGUpIHsKLSAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX0dFVF9JRExFLCAwLCAwLCAwLCBOVUxMKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhTZW5kQ3RybAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIGNvbnRyb2wgY29tbWFuZCB0byBISUQgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaFNlbmRDdHJsKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdEJUQV9ISF9UUkFOU19DVFJMX1RZUEUgY190eXBlKSB7Ci0gIGJ0YV9oaF9zbmRfd3JpdGVfZGV2KGRldl9oYW5kbGUsIEhJRF9UUkFOU19DT05UUk9MLCAodWludDhfdCljX3R5cGUsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaFNlbmREYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmQgREFUQSB0cmFuc2FjdGlvbiB0byBISUQgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgZGV2X2hhbmRsZTogZGV2aWNlIGhhbmRsZQotICogICAgICAgICAgICAgICAgICBkZXZfYmRhOiByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgcF9kYXRhOiBkYXRhIHRvIGJlIHNlbnQgaW4gdGhlIERBVEEgdHJhbnNhY3Rpb247IG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgdG8gYmUgd3JpdGUgaW50byB0aGUgT3V0cHV0IFJlcG9ydCBvZiBhIExFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgSElEIGRldmljZS4gVGhlIHJlcG9ydCBpcyBpZGVudGlmaWVkIHRoZSByZXBvcnQgSUQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlIGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKShwX2J1ZiArIDEpICsgKnBfYnVmLT5vZmZzZXQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5sYXllcl9zcGVjaWZpYyBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIHJlcG9ydAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuIEl0IGNhbiBiZSBPVVRQVVQgcmVwb3J0LCBvciBGRUFUVVJFIHJlcG9ydC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhTZW5kRGF0YSh1aW50OF90IGRldl9oYW5kbGUsIFVOVVNFRF9BVFRSIGNvbnN0IFJhd0FkZHJlc3MmIGRldl9iZGEsCi0gICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9kYXRhKSB7Ci0gIGlmIChwX2RhdGEtPmxheWVyX3NwZWNpZmljICE9IEJUQV9ISF9SUFRUX09VVFBVVCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICJFUlJPUiEgV3JvbmcgcmVwb3J0IHR5cGUhIFdyaXRlIENvbW1hbmQgb25seSB2YWxpZCBmb3Igb3V0cHV0ICIKLSAgICAgICAgInJlcG9ydCEiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYnRhX2hoX3NuZF93cml0ZV9kZXYoZGV2X2hhbmRsZSwgSElEX1RSQU5TX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KXBfZGF0YS0+bGF5ZXJfc3BlY2lmaWMsIDAsIDAsIHBfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhHZXREc2NwSW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IEhJRCBkZXZpY2UgcmVwb3J0IGRlc2NyaXB0b3IKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGhHZXREc2NwSW5mbyh1aW50OF90IGRldl9oYW5kbGUpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9jYWxsb2Moc2l6ZW9mKEJUX0hEUikpOwotCi0gIHBfYnVmLT5ldmVudCA9IEJUQV9ISF9BUElfR0VUX0RTQ1BfRVZUOwotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSAodWludDE2X3QpZGV2X2hhbmRsZTsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoQWRkRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQgYSB2aXJ0dWFsbHkgY2FibGVkIGRldmljZSBpbnRvIEhJRC1Ib3N0IGRldmljZSBsaXN0Ci0gKiAgICAgICAgICAgICAgICAgIHRvIG1hbmFnZSBhbmQgYXNzaWduIGEgZGV2aWNlIGhhbmRsZSBmb3IgZnV0dXJlIEFQSSBjYWxsLAotICogICAgICAgICAgICAgICAgICBob3N0IGFwcGxjaWF0aW9uIGNhbGwgdGhpcyBBUEkgYXQgc3RhcnQtdXAgdG8gaW5pdGlhbGl6ZSBpdHMKLSAqICAgICAgICAgICAgICAgICAgdmlydHVhbGx5IGNhYmxlZCBkZXZpY2VzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaEFkZERldihjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRCVEFfSEhfQVRUUl9NQVNLIGF0dHJfbWFzaywKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ViX2NsYXNzLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgIHRCVEFfSEhfREVWX0RTQ1BfSU5GTyBkc2NwX2luZm8pIHsKLSAgc2l6ZV90IGxlbiA9IHNpemVvZih0QlRBX0hIX01BSU5UX0RFVikgKyBkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW47Ci0gIHRCVEFfSEhfTUFJTlRfREVWKiBwX2J1ZiA9ICh0QlRBX0hIX01BSU5UX0RFViopb3NpX2NhbGxvYyhsZW4pOwotCi0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQ7Ci0gIHBfYnVmLT5zdWJfZXZlbnQgPSBCVEFfSEhfQUREX0RFVl9FVlQ7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0KLSAgcF9idWYtPmF0dHJfbWFzayA9ICh1aW50MTZfdClhdHRyX21hc2s7Ci0gIHBfYnVmLT5zdWJfY2xhc3MgPSBzdWJfY2xhc3M7Ci0gIHBfYnVmLT5hcHBfaWQgPSBhcHBfaWQ7Ci0gIHBfYnVmLT5iZGEgPSBiZGE7Ci0KLSAgbWVtY3B5KCZwX2J1Zi0+ZHNjcF9pbmZvLCAmZHNjcF9pbmZvLCBzaXplb2YodEJUQV9ISF9ERVZfRFNDUF9JTkZPKSk7Ci0gIGlmIChkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4gIT0gMCAmJiBkc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCkgewotICAgIHBfYnVmLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4gPSBkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW47Ci0gICAgcF9idWYtPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0ID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICAgIG1lbWNweShwX2J1Zi0+ZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QsIGRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0LAotICAgICAgICAgICBkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4pOwotICB9IGVsc2UgewotICAgIHBfYnVmLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCA9IE5VTEw7Ci0gICAgcF9idWYtPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbiA9IDA7Ci0gIH0KLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoUmVtb3ZlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmUgYSBkZXZpY2UgZnJvbSB0aGUgSElEIGhvc3QgZGV2aWNlcyBsaXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IaFJlbW92ZURldih1aW50OF90IGRldl9oYW5kbGUpIHsKLSAgdEJUQV9ISF9NQUlOVF9ERVYqIHBfYnVmID0KLSAgICAgICh0QlRBX0hIX01BSU5UX0RFViopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9ISF9NQUlOVF9ERVYpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0hIX0FQSV9NQUlOVF9ERVZfRVZUOwotICBwX2J1Zi0+c3ViX2V2ZW50ID0gQlRBX0hIX1JNVl9ERVZfRVZUOwotICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gKHVpbnQxNl90KWRldl9oYW5kbGU7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsaXR5IEZ1bmN0aW9uICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYgLyogQlRBX0hIX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX2NmZy5jYyBiL2J0YS9oaC9idGFfaGhfY2ZnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNjZTFjLi4wMDAwMDAwCi0tLSBhL2J0YS9oaC9idGFfaGhfY2ZnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgY29tcGlsZS10aW1lIGNvbmZpZ3VyYWJsZSBjb25zdGFudHMgZm9yIHRoZSBCVEEgSGlkCi0gKiAgSG9zdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGhfYXBpLmgiCi0KLS8qIG1heCBudW1iZXIgb2YgZGV2aWNlIHR5cGVzIHN1cHBvcnRlZCBieSBCVEEgKi8KLSNkZWZpbmUgQlRBX0hIX01BWF9ERVZUX1NQVCA5Ci0KLS8qIHNpemUgb2YgZGF0YWJhc2UgZm9yIHNlcnZpY2UgZGlzY292ZXJ5ICovCi0jaWZuZGVmIEJUQV9ISF9ESVNDX0JVRl9TSVpFCi0jZGVmaW5lIEJUQV9ISF9ESVNDX0JVRl9TSVpFIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLSNlbmRpZgotCi0vKiBUaGUgdHlwZSBvZiBkZXZpY2VzIHN1cHBvcnRlZCBieSBCVEEgSEggYW5kIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gSUQgKi8KLXRCVEFfSEhfU1BUX1RPRCBwX2RldnRfbGlzdFtCVEFfSEhfTUFYX0RFVlRfU1BUXSA9IHsKLSAgICB7QlRBX0hIX0RFVlRfTUlDLCBCVEFfSEhfQVBQX0lEX01JfSwKLSAgICB7QlRBX0hIX0RFVlRfS0JELCBCVEFfSEhfQVBQX0lEX0tCfSwKLSAgICB7QlRBX0hIX0RFVlRfS0JEIHwgQlRBX0hIX0RFVlRfTUlDLCBCVEFfSEhfQVBQX0lEX0tCfSwKLSAgICB7QlRBX0hIX0RFVlRfUk1DLCBCVEFfSEhfQVBQX0lEX1JNQ30sCi0gICAge0JUQV9ISF9ERVZUX1JNQyB8IEJUQV9ISF9ERVZUX0tCRCwgQlRBX0hIX0FQUF9JRF9STUN9LAotICAgIHtCVEFfSEhfREVWVF9NSUMgfCBCVEFfSEhfREVWVF9ER1QsIEJUQV9ISF9BUFBfSURfTUl9LAotICAgIHtCVEFfSEhfREVWVF9KT1MsIEJUQV9ISF9BUFBfSURfSk9ZfSwKLSAgICB7QlRBX0hIX0RFVlRfR1BELCBCVEFfSEhfQVBQX0lEX0dQQUR9LAotICAgIHtCVEFfSEhfREVWVF9VTktOT1dOLCBCVEFfSEhfQVBQX0lEXzNEU0d9fTsKLQotY29uc3QgdEJUQV9ISF9DRkcgYnRhX2hoX2NmZyA9IHsKLSAgICBCVEFfSEhfTUFYX0RFVlRfU1BULCAvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHR5cGUgb2YgZGV2aWNlcyAqLwotICAgIHBfZGV2dF9saXN0LCAgICAgICAgIC8qIFRvRCAmIEFwcElEIGxpc3QgKi8KLSAgICBCVEFfSEhfRElTQ19CVUZfU0laRSAvKiBISCBTRFAgZGlzY292ZXJ5IGRhdGFiYXNlIHNpemUgKi8KLX07Ci0KLWNvbnN0IHRCVEFfSEhfQ0ZHKiBwX2J0YV9oaF9jZmcgPSAmYnRhX2hoX2NmZzsKZGlmZiAtLWdpdCBhL2J0YS9oaC9idGFfaGhfaW50LmggYi9idGEvaGgvYnRhX2hoX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRkMGVkLi4wMDAwMDAwCi0tLSBhL2J0YS9oaC9idGFfaGhfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgQlRBIEhJRCBIb3N0IGludGVybmFsIGRlZmluaXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVEFfSEhfSU5UX0gKLSNkZWZpbmUgQlRBX0hIX0lOVF9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9nYXR0X2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oaF9hcGkuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKiBzdGF0ZSBtYWNoaW5lIGV2ZW50cywgdGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lICovCi1lbnVtIHRCVEFfSEhfSU5UX0VWVCA6IHVpbnQxNl90IHsKLSAgQlRBX0hIX0FQSV9PUEVOX0VWVCA9IEJUQV9TWVNfRVZUX1NUQVJUKEJUQV9JRF9ISCksCi0gIEJUQV9ISF9BUElfQ0xPU0VfRVZULAotICBCVEFfSEhfSU5UX09QRU5fRVZULAotICBCVEFfSEhfSU5UX0NMT1NFX0VWVCwKLSAgQlRBX0hIX0lOVF9EQVRBX0VWVCwKLSAgQlRBX0hIX0lOVF9DVFJMX0RBVEEsCi0gIEJUQV9ISF9JTlRfSEFORFNLX0VWVCwKLSAgQlRBX0hIX1NEUF9DTVBMX0VWVCwKLSAgQlRBX0hIX0FQSV9XUklURV9ERVZfRVZULAotICBCVEFfSEhfQVBJX0dFVF9EU0NQX0VWVCwKLSAgQlRBX0hIX0FQSV9NQUlOVF9ERVZfRVZULAotICBCVEFfSEhfT1BFTl9DTVBMX0VWVCwKLSAgQlRBX0hIX0dBVFRfQ0xPU0VfRVZULAotICBCVEFfSEhfR0FUVF9PUEVOX0VWVCwKLSAgQlRBX0hIX1NUQVJUX0VOQ19FVlQsCi0gIEJUQV9ISF9FTkNfQ01QTF9FVlQsCi0gIEJUQV9ISF9HQVRUX0VOQ19DTVBMX0VWVCwKLQotICAvKiBub3QgaGFuZGxlZCBieSBleGVjdXRlIHN0YXRlIG1hY2hpbmUgKi8KLSAgQlRBX0hIX0FQSV9FTkFCTEVfRVZULAotICBCVEFfSEhfQVBJX0RJU0FCTEVfRVZULAotICBCVEFfSEhfRElTQ19DTVBMX0VWVAotfTsgLyogSElEIGhvc3QgaW50ZXJuYWwgZXZlbnRzICovCi0KLSNkZWZpbmUgQlRBX0hIX0lOVkFMSURfRVZUIChCVEFfSEhfRElTQ19DTVBMX0VWVCArIDEpCi0KLS8qIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCi1lbnVtIHsKLSAgQlRBX0hIX05VTExfU1QsCi0gIEJUQV9ISF9JRExFX1NULAotICBCVEFfSEhfVzRfQ09OTl9TVCwKLSAgQlRBX0hIX0NPTk5fU1QsCi0gIEJUQV9ISF9XNF9TRUMsCi0gIEJUQV9ISF9JTlZBTElEX1NUIC8qIFVzZWQgdG8gY2hlY2sgaW52YWxpZCBzdGF0ZXMgYmVmb3JlIGV4ZWN1dGluZyBTTSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLQotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRBX0hIX1NUQVRFOwotCi0vKiBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHNlbmQgYSBjb21tYW5kL2RhdGEgdG8gSElEIGRldmljZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50OF90IHRfdHlwZTsKLSAgdWludDhfdCBwYXJhbTsKLSAgdWludDhfdCBycHRfaWQ7Ci0gIHVpbnQxNl90IGRhdGE7Ci0gIEJUX0hEUiogcF9kYXRhOwotfSB0QlRBX0hIX0NNRF9EQVRBOwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUQV9ISF9BUElfRU5BQkxFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50OF90IHNlcnZpY2VfbmFtZVtCVEFfU0VSVklDRV9OQU1FX0xFTiArIDFdOwotICB0QlRBX0hIX0NCQUNLKiBwX2NiYWNrOwotfSB0QlRBX0hIX0FQSV9FTkFCTEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB0QlRBX0hIX1BST1RPX01PREUgbW9kZTsKLX0gdEJUQV9ISF9BUElfQ09OTjsKLQotLyogaW50ZXJuYWwgZXZlbnQgZGF0YSBmcm9tIEJURSBISUQgY2FsbGJhY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgUmF3QWRkcmVzcyBhZGRyOwotICB1aW50MzJfdCBkYXRhOwotICBCVF9IRFIqIHBfZGF0YTsKLX0gdEJUQV9ISF9DQkFDS19EQVRBOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB1aW50MTZfdCBhdHRyX21hc2s7Ci0gIHVpbnQxNl90IHN1Yl9ldmVudDsKLSAgdWludDhfdCBzdWJfY2xhc3M7Ci0gIHVpbnQ4X3QgYXBwX2lkOwotICB0QlRBX0hIX0RFVl9EU0NQX0lORk8gZHNjcF9pbmZvOwotfSB0QlRBX0hIX01BSU5UX0RFVjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICB1aW50MTZfdCBjb25uX2lkOwotICB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb247Ci19IHRCVEFfSEhfTEVfQ0xPU0U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsKLSAgdWludDE2X3Qgc2Nhbl9pbnQ7Ci0gIHVpbnQxNl90IHNjYW5fd2luOwotfSB0QlRBX0hIX1NDUFBfVVBEQVRFOwotCi0vKiB1bmlvbiBvZiBhbGwgZXZlbnQgZGF0YSB0eXBlcyAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVEFfSEhfQVBJX0VOQUJMRSBhcGlfZW5hYmxlOwotICB0QlRBX0hIX0FQSV9DT05OIGFwaV9jb25uOwotICB0QlRBX0hIX0NNRF9EQVRBIGFwaV9zbmRjbWQ7Ci0gIHRCVEFfSEhfQ0JBQ0tfREFUQSBoaWRfY2JhY2s7Ci0gIHRCVEFfSEhfU1RBVFVTIHN0YXR1czsKLSAgdEJUQV9ISF9NQUlOVF9ERVYgYXBpX21haW50ZGV2OwotICB0QlRBX0hIX0xFX0NMT1NFIGxlX2Nsb3NlOwotICB0QlRBX0dBVFRDX09QRU4gbGVfb3BlbjsKLSAgdEJUQV9ISF9TQ1BQX1VQREFURSBsZV9zY3BwX3VwZGF0ZTsKLSAgdEJUQV9HQVRUQ19FTkNfQ01QTF9DQiBsZV9lbmNfY21wbDsKLX0gdEJUQV9ISF9EQVRBOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgaW5kZXg7Ci0gIGJvb2wgaW5fdXNlOwotICB1aW50OF90IHNydmNfaW5zdF9pZDsKLSAgdWludDE2X3QgY2hhcl9pbnN0X2lkOwotICB0QlRBX0hIX1JQVF9UWVBFIHJwdF90eXBlOwotICB1aW50MTZfdCB1dWlkOwotICB1aW50OF90IHJwdF9pZDsKLSAgYm9vbCBjbGllbnRfY2ZnX2V4aXN0OwotICB1aW50MTZfdCBjbGllbnRfY2ZnX3ZhbHVlOwotfSB0QlRBX0hIX0xFX1JQVDsKLQotI2lmbmRlZiBCVEFfSEhfTEVfUlBUX01BWAotI2RlZmluZSBCVEFfSEhfTEVfUlBUX01BWCAyMAotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpbl91c2U7Ci0gIHVpbnQ4X3Qgc3J2Y19pbnN0X2lkOwotICB0QlRBX0hIX0xFX1JQVCByZXBvcnRbQlRBX0hIX0xFX1JQVF9NQVhdOwotCi0gIHVpbnQxNl90IHByb3RvX21vZGVfaGFuZGxlOwotICB1aW50OF90IGNvbnRyb2xfcG9pbnRfaGFuZGxlOwotCi0gIHVpbnQ4X3QKLSAgICAgIGluY2xfc3J2Y19pbnN0OyAvKiBhc3N1bWluZyBvbmx5IG9uZSBpbmNsdWRlZCBzZXJ2aWNlIDogYmF0dGVyeSBzZXJ2aWNlICovCi0gIHVpbnQ4X3QgY3VyX2V4cGxfY2hhcl9pZHg7IC8qIGN1cnJlbnRseSBkaXNjb3ZlcmluZyBzZXJ2aWNlIGluZGV4ICovCi0gIHVpbnQ4X3QqIHJwdF9tYXA7Ci0gIHVpbnQxNl90IGV4dF9ycHRfcmVmOwotICB0QlRBX0hIX0RFVl9ERVNDUiBkZXNjcmlwdG9yOwotCi19IHRCVEFfSEhfTEVfSElEX1NSVkM7Ci0KLS8qIGNvbnZlcnQgYSBISUQgaGFuZGxlIHRvIHRoZSBMRSBDQiBpbmRleCAqLwotI2RlZmluZSBCVEFfSEhfR0VUX0xFX0NCX0lEWCh4KSAoKCh4KSA+PiA0KSAtIDEpCi0vKiBjb252ZXJ0IGEgR0FUVCBjb25uZWN0aW9uIElEIHRvIEhJRCBkZXZpY2UgaGFuZGxlLCBpdCBpcyB0aGUgaGkgNCBiaXRzIG9mIGEKLSAqIHVpbnQ4X3QgKi8KLSNkZWZpbmUgQlRBX0hIX0dFVF9MRV9ERVZfSERMKHgpICh1aW50OF90KSgoKHgpICsgMSkgPDwgNCkKLS8qIGNoZWNrIHRvIHNlZSBpZiB0aCBlZGV2aWNlIGhhbmRsZSBpcyBhIExFIGRldmljZSBoYW5kbGUgKi8KLSNkZWZpbmUgQlRBX0hIX0lTX0xFX0RFVl9IREwoeCkgKCh4KSYweGYwKQotI2RlZmluZSBCVEFfSEhfSVNfTEVfREVWX0hETF9WQUxJRCh4KSAoKCh4KSA+PiA0KSA8PSBCVEFfSEhfTEVfTUFYX0tOT1dOKQotCi0vKiBkZXZpY2UgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0hIX0RFVl9EU0NQX0lORk8gZHNjcF9pbmZvOyAvKiByZXBvcnQgZGVzY3JpcHRvciBhbmQgREkgaW5mb3JtYXRpb24gKi8KLSAgUmF3QWRkcmVzcyBhZGRyOyAgICAgICAgICAgICAgICAgLyogQkQtQWRkciBvZiB0aGUgSElEIGRldmljZSAqLwotICB1aW50MTZfdCBhdHRyX21hc2s7ICAgICAgICAgICAgICAvKiBhdHRyaWJ1dGUgbWFzayAqLwotICB1aW50MTZfdCB3NF9ldnQ7ICAgICAgICAgICAgICAgICAvKiBXNF9oYW5kc2hha2UgZXZlbnQgbmFtZSAqLwotICB1aW50OF90IGluZGV4OyAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBudW1iZXIgcmVmZXJlbmNlZCB0byBoYW5kbGUgaW5kZXggKi8KLSAgdWludDhfdCBzdWJfY2xhc3M7ICAgICAgICAgICAgICAgLyogQ29kIHN1YiBjbGFzcyAqLwotICB1aW50OF90IGFwcF9pZDsgICAgICAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBJRCBmb3IgdGhpcyBjb25uZWN0aW9uICovCi0gIHVpbnQ4X3QgaGlkX2hhbmRsZTsgICAgICAgICAgLyogZGV2aWNlIGhhbmRsZSA6IGxvdyA0IGJpdHMgZm9yIHJlZ3VsYXIgSElEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9IT1NUX01BWF9ERVZJQ0VTIGNhbiBub3QgZXhjZWVkIDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggNCBiaXRzIGZvciBMRSBISUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9NQVhfUEhZX0NIQU5ORUwgY2FuIG5vdCBleGNlZWQgMTUgKi8KLSAgYm9vbCB2cDsgICAgICAgICAgICAgICAgICAgICAvKiB2aXJ0dWFsbHkgdW5wbHVnIGZsYWcgKi8KLSAgYm9vbCBpbl91c2U7ICAgICAgICAgICAgICAgICAvKiBjb250cm9sIGJsb2NrIGN1cnJlbnRseSBpbiB1c2UgKi8KLSAgYm9vbCBpbmNvbWluZ19jb25uOyAgICAgICAgICAvKiBpcyBpbmNvbWluZyBjb25uZWN0aW9uPyAqLwotICB1aW50OF90IGluY29taW5nX2hpZF9oYW5kbGU7IC8qIHRlbXBvcmFyeSBoYW5kbGUgZm9yIGluY29taW5nIGNvbm5lY3Rpb24/ICovCi0gIHRCVEFfSEhfUFJPVE9fTU9ERSBtb2RlOyAvKiBwcm90b2NvbCBtb2RlICovCi0gIHRCVEFfSEhfU1RBVEUgc3RhdGU7ICAgICAvKiBDQiBzdGF0ZSAqLwotCi0jZGVmaW5lIEJUQV9ISF9MRV9ESVNDX05PTkUgMHgwMAotI2RlZmluZSBCVEFfSEhfTEVfRElTQ19ISURTIDB4MDEKLSNkZWZpbmUgQlRBX0hIX0xFX0RJU0NfRElTIDB4MDIKLSNkZWZpbmUgQlRBX0hIX0xFX0RJU0NfU0NQUyAweDA0Ci0KLSAgdWludDhfdCBkaXNjX2FjdGl2ZTsKLSAgdEJUQV9ISF9TVEFUVVMgc3RhdHVzOwotICB0QlRNX1NUQVRVUyBidG1fc3RhdHVzOwotICBib29sIGlzX2xlX2RldmljZTsKLSAgdEJUQV9ISF9MRV9ISURfU1JWQyBoaWRfc3J2YzsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgYm9vbCBpbl9iZ19jb25uOwotICB1aW50OF90IGNsdF9jZmdfaWR4OwotICBib29sIHNjcHNfc3VwcG9ydGVkOwotCi0jZGVmaW5lIEJUQV9ISF9MRV9TQ1BTX05PVElGWV9OT05FIDAKLSNkZWZpbmUgQlRBX0hIX0xFX1NDUFNfTk9USUZZX1NQVCAweDAxCi0jZGVmaW5lIEJUQV9ISF9MRV9TQ1BTX05PVElGWV9FTkIgMHgwMgotICB1aW50OF90IHNjcHNfbm90aWZ5OyAvKiBzY2FuIHJlZnJlc2ggc3VwcG9ydGVkL25vdGlmaWNhdGlvbiBlbmFibGVkICovCi0gIGJvb2wgc2VjdXJpdHlfcGVuZGluZzsKLX0gdEJUQV9ISF9ERVZfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1haW4gQ29udHJvbCBCbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9ISF9ERVZfQ0Iga2RldltCVEFfSEhfTUFYX0RFVklDRV07IC8qIGRldmljZSBjb250cm9sIGJsb2NrICovCi0gIHRCVEFfSEhfREVWX0NCKiBwX2N1cjsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRldmljZSBjb250cm9sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgaWR4LCB1c2VkIGluIHNkcCAqLwotICB1aW50OF90IGNiX2luZGV4W0JUQV9ISF9NQVhfS05PV05dOyAgICAgLyogbWFpbnRhaW4gYSBDQiBpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCB0byBkZXYgaGFuZGxlICovCi0gIHVpbnQ4X3QgbGVfY2JfaW5kZXhbQlRBX0hIX0xFX01BWF9LTk9XTl07IC8qIG1haW50YWluIGEgQ0IgaW5kZXggbWFwIHRvIExFIGRldgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlICovCi0gIHRHQVRUX0lGIGdhdHRfaWY7Ci0gIHRCVEFfSEhfQ0JBQ0sqIHBfY2JhY2s7IC8qIEFwcGxpY2F0aW9uIGNhbGxiYWNrcyAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kaXNjX2RiOwotICB1aW50OF90IGNudF9udW07ICAgICAvKiBjb25uZWN0ZWQgZGV2aWNlIG51bWJlciAqLwotICBib29sIHc0X2Rpc2FibGU7ICAgICAvKiB3NCBkaXNhYmxlIGZsYWcgKi8KLX0gdEJUQV9ISF9DQjsKLQotZXh0ZXJuIHRCVEFfSEhfQ0IgYnRhX2hoX2NiOwotCi0vKiBmcm9tIGJ0YV9oaF9jZmcuYyAqLwotZXh0ZXJuIHRCVEFfSEhfQ0ZHKiBwX2J0YV9oaF9jZmc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgYnRhX2hoX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9zbV9leGVjdXRlKHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLQotLyogYWN0aW9uIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX2hoX2FwaV9kaXNjX2FjdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX29wZW5fYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGhfY2xvc2VfYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGhfZGF0YV9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9jdHJsX2RhdF9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9zdGFydF9zZHAodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9zZHBfY21wbCh0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX3dyaXRlX2Rldl9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGhfZ2V0X2RzY3BfYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGhfaGFuZHNrX2FjdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX21haW50X2Rldl9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfaGhfb3Blbl9jbXBsX2FjdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9vcGVuX2ZhaWx1cmUodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLQotLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KLWV4dGVybiB1aW50OF90IGJ0YV9oaF9maW5kX2NiKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci1leHRlcm4gdEJUQV9ISF9ERVZfQ0IqIGJ0YV9oaF9nZXRfY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLWV4dGVybiBib29sIGJ0YV9oaF90b2Rfc3B0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50OF90IHN1Yl9jbGFzcyk7Ci1leHRlcm4gdm9pZCBidGFfaGhfY2xlYW5fdXBfa2Rldih0QlRBX0hIX0RFVl9DQiogcF9jYik7Ci0KLWV4dGVybiB2b2lkIGJ0YV9oaF9hZGRfZGV2aWNlX3RvX2xpc3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRISURfREVWX0RTQ1BfSU5GTyogcF9kc2NwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ViX2NsYXNzLCB1aW50MTZfdCBtYXhfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3RvdXQsIHVpbnQ4X3QgYXBwX2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF91cGRhdGVfZGlfaW5mbyh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDE2X3QgdmVuZG9yX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb2R1Y3RfaWQsIHVpbnQxNl90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmbGFnKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9jbGVhbnVwX2Rpc2FibGUodEJUQV9ISF9TVEFUVVMgc3RhdHVzKTsKLQotZXh0ZXJuIHVpbnQ4X3QgYnRhX2hoX2Rldl9oYW5kbGVfdG9fY2JfaWR4KHVpbnQ4X3QgZGV2X2hhbmRsZSk7Ci0KLS8qIGFjdGlvbiBmdW5jdGlvbnMgdXNlZCBvdXRzaWRlIHN0YXRlIG1hY2hpbmUgKi8KLWV4dGVybiB2b2lkIGJ0YV9oaF9hcGlfZW5hYmxlKGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9hcGlfZGlzYWJsZSh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9kaXNjX2NtcGwodm9pZCk7Ci0KLWV4dGVybiB0QlRBX0hIX1NUQVRVUyBidGFfaGhfcmVhZF9zc3JfcGFyYW0oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfbWF4X3Nzcl9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX21pbl9zc3JfdG91dCk7Ci0KLS8qIGZ1bmN0aW9ucyBmb3IgTEUgSElEICovCi1leHRlcm4gdm9pZCBidGFfaGhfbGVfZW5hYmxlKHZvaWQpOwotZXh0ZXJuIGJvb2wgYnRhX2hoX2xlX2lzX2hoX2dhdHRfaWYodEdBVFRfSUYgY2xpZW50X2lmKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9sZV9kZXJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX29wZW5fY29ubih0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci1leHRlcm4gdm9pZCBidGFfaGhfbGVfYXBpX2Rpc2NfYWN0KHRCVEFfSEhfREVWX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9sZV9nZXRfZHNjcF9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX3dyaXRlX2Rldl9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdWludDhfdCBidGFfaGhfbGVfYWRkX2RldmljZSh0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfTUFJTlRfREVWKiBwX2Rldl9pbmZvKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9sZV9yZW1vdmVfZGV2X2JnX2Nvbm4odEJUQV9ISF9ERVZfQ0IqIHBfY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2xlX29wZW5fZmFpbCh0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2dhdHRfb3Blbih0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2dhdHRfY2xvc2UodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9zdGFydF9zZWN1cml0eSh0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfYnVmKTsKLQotZXh0ZXJuIHZvaWQgYnRhX2hoX3N0YXJ0X3NlY3VyaXR5KHRCVEFfSEhfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9idWYpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX3NlY3VyaXR5X2NtcGwodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfYnVmKTsKLWV4dGVybiB2b2lkIGJ0YV9oaF9sZV9ub3RpZnlfZW5jX2NtcGwodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKTsKLQotI2lmIChCVEFfSEhfREVCVUcgPT0gVFJVRSkKLWV4dGVybiB2b2lkIGJ0YV9oaF90cmFjZV9kZXZfZGIodm9pZCk7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX2xlLmNjIGIvYnRhL2hoL2J0YV9oaF9sZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMzdlMi4uMDAwMDAwMAotLS0gYS9idGEvaGgvYnRhX2hoX2xlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0YV9oaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRhL2hoL2J0YV9oaF9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oaF9jby5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAgIC8vIEFSUkFZX1NJWkUKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIiAgLy8gQlRNXwotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgICAgICAvLyBwb3N0X29uX2J0X21haW4KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIgICAvLyBMMkNBXwotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc3J2Y19hcGkuaCIgIC8vIHRESVNfVkFMVUUKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgewotCi0jaWZuZGVmIEJUQV9ISF9MRV9SRUNPTk4KLWNvbnN0ZXhwciBib29sIGtCVEFfSEhfTEVfUkVDT05OID0gdHJ1ZTsKLSNlbHNlCi1jb25zdGV4cHIgYm9vbCBrQlRBX0hIX0xFX1JFQ09OTiA9IGZhbHNlOwotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZQotCi0jZGVmaW5lIEJUQV9ISF9BUFBfSURfTEUgMHhmZgotCi0jZGVmaW5lIEJUQV9ISF9MRV9QUk9UT19CT09UX01PREUgMHgwMAotI2RlZmluZSBCVEFfSEhfTEVfUFJPVE9fUkVQT1JUX01PREUgMHgwMQotCi0jZGVmaW5lIEJUQV9MRV9ISURfUlRQX1VVSURfTUFYIDUKLQotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIGNoYXIga0J0bUxvZ1RhZ1tdID0gIkhJREgiOwotCi19Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBidGFfaGhfdXVpZF90b19ydHBfdHlwZVtCVEFfTEVfSElEX1JUUF9VVUlEX01BWF1bMl0gPSB7Ci0gICAge0dBVFRfVVVJRF9ISURfUkVQT1JULCBCVEFfSEhfUlBUVF9JTlBVVH0sCi0gICAge0dBVFRfVVVJRF9ISURfQlRfS0JfSU5QVVQsIEJUQV9ISF9SUFRUX0lOUFVUfSwKLSAgICB7R0FUVF9VVUlEX0hJRF9CVF9LQl9PVVRQVVQsIEJUQV9ISF9SUFRUX09VVFBVVH0sCi0gICAge0dBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQsIEJUQV9ISF9SUFRUX0lOUFVUfSwKLSAgICB7R0FUVF9VVUlEX0JBVFRFUllfTEVWRUwsIEJUQV9ISF9SUFRUX0lOUFVUfX07Ci0KLXN0YXRpYyB2b2lkIGJ0YV9oaF9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4odEJUQV9ISF9ERVZfQ0IqIHBfY2IsIGJvb2wgY2hlY2tfYm9uZCk7Ci1zdGF0aWMgdm9pZCBidGFfaGhfcHJvY2Vzc19jYWNoZV9ycHQodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkqIHBfcnB0X2NhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3JwdCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfaGhfbGVfcnB0X25hbWVbNF0gPSB7IlVOS05PV04iLCAiSU5QVVQiLCAiT1VUUFVUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZFQVRVUkUifTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9oaWRfcmVwb3J0X2RiZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZGVidWcgZnVuY3Rpb24gdG8gcHJpbnQgb3V0IGFsbCBISUQgcmVwb3J0IGF2YWlsYWJsZSBvbgotICogICAgICAgICAgICAgICAgICByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfaGlkX3JlcG9ydF9kYmcodEJUQV9ISF9ERVZfQ0IqIHBfY2IpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEhJRCBSZXBvcnQgREIiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKCFwX2NiLT5oaWRfc3J2Yy5pbl91c2UpIHJldHVybjsKLQotICB0QlRBX0hIX0xFX1JQVCogcF9ycHQgPSAmcF9jYi0+aGlkX3NydmMucmVwb3J0WzBdOwotCi0gIGZvciAoaW50IGogPSAwOyBqIDwgQlRBX0hIX0xFX1JQVF9NQVg7IGorKywgcF9ycHQrKykgewotICAgIGNvbnN0IGNoYXIqIHJwdF9uYW1lID0gIlVua25vd24iOwotCi0gICAgaWYgKCFwX3JwdC0+aW5fdXNlKSBicmVhazsKLQotICAgIGlmIChwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX1JFUE9SVCkgcnB0X25hbWUgPSAiUmVwb3J0IjsKLSAgICBpZiAocF9ycHQtPnV1aWQgPT0gR0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCkgcnB0X25hbWUgPSAiQm9vdCBLQiBJbnB1dCI7Ci0gICAgaWYgKHBfcnB0LT51dWlkID09IEdBVFRfVVVJRF9ISURfQlRfS0JfT1VUUFVUKSBycHRfbmFtZSA9ICJCb290IEtCIE91dHB1dCI7Ci0gICAgaWYgKHBfcnB0LT51dWlkID09IEdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQpIHJwdF9uYW1lID0gIkJvb3QgTUkgSW5wdXQiOwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygKLSAgICAgICAgIlx0XHQgWyVzLSAweCUwNHhdIFtUeXBlOiAlc10sIFtSZXBvcnRJRDogJWRdIFtzcnZjX2luc3RfaWQ6ICVkXSAiCi0gICAgICAgICJbY2hhcl9pbnN0X2lkOiAlZF0gW0NsdF9jZmc6ICVkXSIsCi0gICAgICAgIHJwdF9uYW1lLCBwX3JwdC0+dXVpZCwKLSAgICAgICAgKChwX3JwdC0+cnB0X3R5cGUgPCA0KSA/IGJ0YV9oaF9sZV9ycHRfbmFtZVtwX3JwdC0+cnB0X3R5cGVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVU5LTk9XTiIpLAotICAgICAgICBwX3JwdC0+cnB0X2lkLCBwX3JwdC0+c3J2Y19pbnN0X2lkLCBwX3JwdC0+Y2hhcl9pbnN0X2lkLAotICAgICAgICBwX3JwdC0+Y2xpZW50X2NmZ192YWx1ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF91dWlkX3RvX3N0cgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBjaGFyKiBidGFfaGhfdXVpZF90b19zdHIodWludDE2X3QgdXVpZCkgewotICBzd2l0Y2ggKHV1aWQpIHsKLSAgICBjYXNlIEdBVFRfVVVJRF9ISURfSU5GT1JNQVRJT046Ci0gICAgICByZXR1cm4gIkdBVFRfVVVJRF9ISURfSU5GT1JNQVRJT04iOwotICAgIGNhc2UgR0FUVF9VVUlEX0hJRF9SRVBPUlRfTUFQOgotICAgICAgcmV0dXJuICJHQVRUX1VVSURfSElEX1JFUE9SVF9NQVAiOwotICAgIGNhc2UgR0FUVF9VVUlEX0hJRF9DT05UUk9MX1BPSU5UOgotICAgICAgcmV0dXJuICJHQVRUX1VVSURfSElEX0NPTlRST0xfUE9JTlQiOwotICAgIGNhc2UgR0FUVF9VVUlEX0hJRF9SRVBPUlQ6Ci0gICAgICByZXR1cm4gIkdBVFRfVVVJRF9ISURfUkVQT1JUIjsKLSAgICBjYXNlIEdBVFRfVVVJRF9ISURfUFJPVE9fTU9ERToKLSAgICAgIHJldHVybiAiR0FUVF9VVUlEX0hJRF9QUk9UT19NT0RFIjsKLSAgICBjYXNlIEdBVFRfVVVJRF9ISURfQlRfS0JfSU5QVVQ6Ci0gICAgICByZXR1cm4gIkdBVFRfVVVJRF9ISURfQlRfS0JfSU5QVVQiOwotICAgIGNhc2UgR0FUVF9VVUlEX0hJRF9CVF9LQl9PVVRQVVQ6Ci0gICAgICByZXR1cm4gIkdBVFRfVVVJRF9ISURfQlRfS0JfT1VUUFVUIjsKLSAgICBjYXNlIEdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQ6Ci0gICAgICByZXR1cm4gIkdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQiOwotICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRzoKLSAgICAgIHJldHVybiAiR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRyI7Ci0gICAgY2FzZSBHQVRUX1VVSURfRVhUX1JQVF9SRUZfREVTQ1I6Ci0gICAgICByZXR1cm4gIkdBVFRfVVVJRF9FWFRfUlBUX1JFRl9ERVNDUiI7Ci0gICAgY2FzZSBHQVRUX1VVSURfUlBUX1JFRl9ERVNDUjoKLSAgICAgIHJldHVybiAiR0FUVF9VVUlEX1JQVF9SRUZfREVTQ1IiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gVVVJRCI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9lbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGluaXRpYWxpemUgTEUgSElEIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfZW5hYmxlKHZvaWQpIHsKLSAgdWludDhfdCB4eDsKLQotICBidGFfaGhfY2IuZ2F0dF9pZiA9IEJUQV9HQVRUU19JTlZBTElEX0lGOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IEFSUkFZX1NJWkUoYnRhX2hoX2NiLmxlX2NiX2luZGV4KTsgeHgrKykKLSAgICBidGFfaGhfY2IubGVfY2JfaW5kZXhbeHhdID0gQlRBX0hIX0lEWF9JTlZBTElEOwotCi0gIEJUQV9HQVRUQ19BcHBSZWdpc3RlcihidGFfaGhfZ2F0dGNfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKFtdKHVpbnQ4X3QgY2xpZW50X2lkLCB1aW50OF90IHJfc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEggYnRhX2hoOwotICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGguc3RhdHVzID0gQlRBX0hIX0VSUjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocl9zdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX2NiLmdhdHRfaWYgPSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoLnN0YXR1cyA9IEJUQV9ISF9PSzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGhfY2IuZ2F0dF9pZiA9IEJUQV9HQVRUU19JTlZBTElEX0lGOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVsbCBjaGVjayBpcyBuZWVkZWQgaW4gY2FzZSBISUQgcHJvZmlsZSBpcyBzaHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvd24gYmVmb3JlIEJUQV9HQVRUQ19BcHBSZWdpc3RlciBpcyBkb25lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidGFfaGhfY2IucF9jYmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpZ25hbCBCVEEgY2FsbCBiYWNrIGV2ZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX0VOQUJMRV9FVlQsICZidGFfaGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KSwgZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2lzX2hoX2dhdHRfaWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHRvIHNlZSBpZiBjbGllbnRfaWYgaXMgQlRBIEhIIExFIEdBVFQgaW50ZXJmYWNlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgd2hldGhlciBpdCBpcyBISCBHQVRUIElGCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2hoX2xlX2lzX2hoX2dhdHRfaWYodEdBVFRfSUYgY2xpZW50X2lmKSB7Ci0gIHJldHVybiAoYnRhX2hoX2NiLmdhdHRfaWYgPT0gY2xpZW50X2lmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9kZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZS1yZWdpc3RlciBCVEEgSEggZnJvbSBCVEEgR0FUVEMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2xlX2RlcmVnaXN0ZXIodm9pZCkgeyBCVEFfR0FUVENfQXBwRGVyZWdpc3RlcihidGFfaGhfY2IuZ2F0dF9pZik7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2dldF9sZV9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWxsb2NhdGUgYnRhX2hoX2NiLmxlX2NiX2luZGV4Ci0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRhX2hoX2xlX2dldF9sZV9kZXZfaGRsKHVpbnQ4X3QgY2JfaW5kZXgpIHsKLSAgdWludDhfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidGFfaGhfY2IubGVfY2JfaW5kZXgpOyBpKyspIHsKLSAgICBpZiAoYnRhX2hoX2NiLmxlX2NiX2luZGV4W2ldID09IGNiX2luZGV4KSByZXR1cm4gQlRBX0hIX0dFVF9MRV9ERVZfSERMKGkpOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRhX2hoX2NiLmxlX2NiX2luZGV4KTsgaSsrKSB7Ci0gICAgaWYgKGJ0YV9oaF9jYi5sZV9jYl9pbmRleFtpXSA9PSBCVEFfSEhfSURYX0lOVkFMSUQpCi0gICAgICByZXR1cm4gQlRBX0hIX0dFVF9MRV9ERVZfSERMKGkpOwotICB9Ci0gIHJldHVybiBCVEFfSEhfSURYX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfb3Blbl9jb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBvcGVuIGEgR0FUVCBjb25uZWN0aW9uIGZpcnN0LgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2xlX29wZW5fY29ubih0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB0QlRBX0hIX1NUQVRVUyBzdGF0dXMgPSBCVEFfSEhfRVJSX05PX1JFUzsKLQotICAvKiB1cGRhdGUgY2JfaW5kZXhbXSBtYXAgKi8KLSAgcF9jYi0+aGlkX2hhbmRsZSA9IGJ0YV9oaF9sZV9nZXRfbGVfZGV2X2hkbChwX2NiLT5pbmRleCk7Ci0gIGlmIChwX2NiLT5oaWRfaGFuZGxlID09IEJUQV9ISF9JRFhfSU5WQUxJRCkgewotICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9TRFBfQ01QTF9FVlQsICh0QlRBX0hIX0RBVEEqKSZzdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfY2ItPmFkZHIgPSByZW1vdGVfYmRhOwotICBidGFfaGhfY2IubGVfY2JfaW5kZXhbQlRBX0hIX0dFVF9MRV9DQl9JRFgocF9jYi0+aGlkX2hhbmRsZSldID0gcF9jYi0+aW5kZXg7Ci0gIHBfY2ItPmluX3VzZSA9IHRydWU7Ci0KLSAgQlRBX0dBVFRDX09wZW4oYnRhX2hoX2NiLmdhdHRfaWYsIHJlbW90ZV9iZGEsIHRydWUsIGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9jb25uX2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIGZpbmQgYSBkZXZpY2UgY29udHJvbCBibG9jayBieSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIElELgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUQV9ISF9ERVZfQ0IqIGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9jb25uX2lkKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgdWludDhfdCBpOwotICB0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IgPSAmYnRhX2hoX2NiLmtkZXZbMF07Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9ISF9NQVhfREVWSUNFOyBpKyssIHBfZGV2X2NiKyspIHsKLSAgICBpZiAocF9kZXZfY2ItPmluX3VzZSAmJiBwX2Rldl9jYi0+Y29ubl9pZCA9PSBjb25uX2lkKSByZXR1cm4gcF9kZXZfY2I7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfZmluZF9kZXZfY2JfYnlfYmRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIGZpbmQgYSBkZXZpY2UgY29udHJvbCBibG9jayBieSBCRCBhZGRyZXNzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUQV9ISF9ERVZfQ0IqIGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9iZGEoY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIHVpbnQ4X3QgaTsKLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gJmJ0YV9oaF9jYi5rZGV2WzBdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSEhfTUFYX0RFVklDRTsgaSsrLCBwX2Rldl9jYisrKSB7Ci0gICAgaWYgKHBfZGV2X2NiLT5pbl91c2UgJiYgcF9kZXZfY2ItPmFkZHIgPT0gYmRhKSByZXR1cm4gcF9kZXZfY2I7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfZmluZF9zZXJ2aWNlX2luc3RfYnlfYmF0dGVyeV9pbnN0X2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIEhJRCBzZXJ2aWNlIGluc3RhbmNlIElEIGJ5IGJhdHRlcnkgc2VydmljZSBpbnN0YW5jZSBJRAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidGFfaGhfbGVfZmluZF9zZXJ2aWNlX2luc3RfYnlfYmF0dGVyeV9pbnN0X2lkKAotICAgIHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50OF90IGJhX2luc3RfaWQpIHsKLSAgaWYgKHBfY2ItPmhpZF9zcnZjLmluX3VzZSAmJiBwX2NiLT5oaWRfc3J2Yy5pbmNsX3NydmNfaW5zdCA9PSBiYV9pbnN0X2lkKSB7Ci0gICAgcmV0dXJuIHBfY2ItPmhpZF9zcnZjLnNydmNfaW5zdF9pZDsKLSAgfQotICByZXR1cm4gQlRBX0hIX0lEWF9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2ZpbmRfcmVwb3J0X2VudHJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIHRoZSByZXBvcnQgZW50cnkgYnkgc2VydmljZSBpbnN0YW5jZSBhbmQgcmVwb3J0IFVVSUQKLSAqICAgICAgICAgICAgICAgICAgYW5kIGluc3RhbmNlIElECi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0hIX0xFX1JQVCogYnRhX2hoX2xlX2ZpbmRfcmVwb3J0X2VudHJ5KAotICAgIHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50OF90IHNydmNfaW5zdF9pZCwgLyogc2VydmljZSBpbnN0YW5jZSBJRCAqLwotICAgIHVpbnQxNl90IHJwdF91dWlkLCB1aW50MTZfdCBjaGFyX2luc3RfaWQpIHsKLSAgdWludDhfdCBpOwotICB1aW50OF90IGhpZF9pbnN0X2lkID0gc3J2Y19pbnN0X2lkOwotICB0QlRBX0hIX0xFX1JQVCogcF9ycHQ7Ci0KLSAgaWYgKHJwdF91dWlkID09IEdBVFRfVVVJRF9CQVRURVJZX0xFVkVMKSB7Ci0gICAgaGlkX2luc3RfaWQgPQotICAgICAgICBidGFfaGhfbGVfZmluZF9zZXJ2aWNlX2luc3RfYnlfYmF0dGVyeV9pbnN0X2lkKHBfY2IsIHNydmNfaW5zdF9pZCk7Ci0KLSAgICBpZiAoaGlkX2luc3RfaWQgPT0gQlRBX0hIX0lEWF9JTlZBTElEKSByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHBfcnB0ID0gJnBfY2ItPmhpZF9zcnZjLnJlcG9ydFswXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0hIX0xFX1JQVF9NQVg7IGkrKywgcF9ycHQrKykgewotICAgIGlmIChwX3JwdC0+dXVpZCA9PSBycHRfdXVpZCAmJiBwX3JwdC0+c3J2Y19pbnN0X2lkID09IHNydmNfaW5zdF9pZCAmJgotICAgICAgICBwX3JwdC0+Y2hhcl9pbnN0X2lkID09IGNoYXJfaW5zdF9pZCkgewotICAgICAgcmV0dXJuIHBfcnB0OwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9maW5kX3JwdF9ieV9pZHR5cGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgYSByZXBvcnQgZW50cnkgYnkgcmVwb3J0IElEIGFuZCBwcm90b2NvbCBtb2RlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0hIX0xFX1JQVCogYnRhX2hoX2xlX2ZpbmRfcnB0X2J5X2lkdHlwZSh0QlRBX0hIX0xFX1JQVCogcF9oZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJwdF9pZCkgewotICB0QlRBX0hIX0xFX1JQVCogcF9ycHQgPSBwX2hlYWQ7Ci0gIHVpbnQ4X3QgaTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfbGVfZmluZF9ycHRfYnlfaWR0eXBlOiByX3R5cGU6ICVkIHJwdF9pZDogJWQiLAotICAgICAgICAgICAgICAgICAgIHJfdHlwZSwgcnB0X2lkKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0hIX0xFX1JQVF9NQVg7IGkrKywgcF9ycHQrKykgewotICAgIGlmIChwX3JwdC0+aW5fdXNlICYmIHBfcnB0LT5ycHRfaWQgPT0gcnB0X2lkICYmIHJfdHlwZSA9PSBwX3JwdC0+cnB0X3R5cGUpIHsKLSAgICAgIC8qIHJldHVybiBiYXR0ZXJ5IHJlcG9ydCB3L28gY29uZGl0aW9uICovCi0gICAgICBpZiAocF9ycHQtPnV1aWQgPT0gR0FUVF9VVUlEX0JBVFRFUllfTEVWRUwpIHJldHVybiBwX3JwdDsKLQotICAgICAgaWYgKG1vZGUgPT0gQlRBX0hIX1BST1RPX1JQVF9NT0RFICYmIHBfcnB0LT51dWlkID09IEdBVFRfVVVJRF9ISURfUkVQT1JUKQotICAgICAgICByZXR1cm4gcF9ycHQ7Ci0KLSAgICAgIGlmIChtb2RlID09IEJUQV9ISF9QUk9UT19CT09UX01PREUgJiYKLSAgICAgICAgICAocF9ycHQtPnV1aWQgPj0gR0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCAmJgotICAgICAgICAgICBwX3JwdC0+dXVpZCA8PSBHQVRUX1VVSURfSElEX0JUX01PVVNFX0lOUFVUKSkKLSAgICAgICAgcmV0dXJuIHBfcnB0OwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9maW5kX2FsbG9jX3JlcG9ydF9lbnRyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZmluZCBvciBhbGxvY2F0ZSBhIHJlcG9ydCBlbnRyeSBpbiB0aGUgSElEIHNlcnZpY2UgcmVwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIGxpc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0hIX0xFX1JQVCogYnRhX2hoX2xlX2ZpbmRfYWxsb2NfcmVwb3J0X2VudHJ5KHRCVEFfSEhfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzcnZjX2luc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBycHRfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluc3RfaWQpIHsKLSAgdWludDhfdCBpLCBoaWRfaW5zdF9pZCA9IHNydmNfaW5zdF9pZDsKLSAgdEJUQV9ISF9MRV9SUFQqIHBfcnB0OwotCi0gIGlmIChycHRfdXVpZCA9PSBHQVRUX1VVSURfQkFUVEVSWV9MRVZFTCkgewotICAgIGhpZF9pbnN0X2lkID0KLSAgICAgICAgYnRhX2hoX2xlX2ZpbmRfc2VydmljZV9pbnN0X2J5X2JhdHRlcnlfaW5zdF9pZChwX2NiLCBzcnZjX2luc3RfaWQpOwotCi0gICAgaWYgKGhpZF9pbnN0X2lkID09IEJUQV9ISF9JRFhfSU5WQUxJRCkgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcF9ycHQgPSAmcF9jYi0+aGlkX3NydmMucmVwb3J0WzBdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSEhfTEVfUlBUX01BWDsgaSsrLCBwX3JwdCsrKSB7Ci0gICAgaWYgKCFwX3JwdC0+aW5fdXNlIHx8Ci0gICAgICAgIChwX3JwdC0+dXVpZCA9PSBycHRfdXVpZCAmJiBwX3JwdC0+c3J2Y19pbnN0X2lkID09IHNydmNfaW5zdF9pZCAmJgotICAgICAgICAgcF9ycHQtPmNoYXJfaW5zdF9pZCA9PSBpbnN0X2lkKSkgewotICAgICAgaWYgKCFwX3JwdC0+aW5fdXNlKSB7Ci0gICAgICAgIHBfcnB0LT5pbl91c2UgPSB0cnVlOwotICAgICAgICBwX3JwdC0+aW5kZXggPSBpOwotICAgICAgICBwX3JwdC0+c3J2Y19pbnN0X2lkID0gc3J2Y19pbnN0X2lkOwotICAgICAgICBwX3JwdC0+Y2hhcl9pbnN0X2lkID0gaW5zdF9pZDsKLSAgICAgICAgcF9ycHQtPnV1aWQgPSBycHRfdXVpZDsKLQotICAgICAgICAvKiBhc3NpZ24gcmVwb3J0IHR5cGUgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEJUQV9MRV9ISURfUlRQX1VVSURfTUFYOyBpKyspIHsKLSAgICAgICAgICBpZiAoYnRhX2hoX3V1aWRfdG9fcnRwX3R5cGVbaV1bMF0gPT0gcnB0X3V1aWQpIHsKLSAgICAgICAgICAgIHBfcnB0LT5ycHRfdHlwZSA9ICh0QlRBX0hIX1JQVF9UWVBFKWJ0YV9oaF91dWlkX3RvX3J0cF90eXBlW2ldWzFdOwotCi0gICAgICAgICAgICBpZiAocnB0X3V1aWQgPT0gR0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCB8fAotICAgICAgICAgICAgICAgIHJwdF91dWlkID09IEdBVFRfVVVJRF9ISURfQlRfS0JfT1VUUFVUKQotICAgICAgICAgICAgICBwX3JwdC0+cnB0X2lkID0gQlRBX0hIX0tFWUJEX1JQVF9JRDsKLQotICAgICAgICAgICAgaWYgKHJwdF91dWlkID09IEdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQpCi0gICAgICAgICAgICAgIHBfcnB0LT5ycHRfaWQgPSBCVEFfSEhfTU9VU0VfUlBUX0lEOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBwX3JwdDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBnYXR0OjpEZXNjcmlwdG9yKiBmaW5kX2Rlc2NyaXB0b3JfYnlfc2hvcnRfdXVpZCgKLSAgICB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBjaGFyX2hhbmRsZSwgdWludDE2X3Qgc2hvcnRfdXVpZCkgewotICBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogcF9jaGFyID0KLSAgICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBjaGFyX2hhbmRsZSk7Ci0KLSAgaWYgKCFwX2NoYXIpIHsKLSAgICBMT0dfV0FSTigiJXMgTm8gc3VjaCBjaGFyYWN0ZXJpc3RpYzogJWQiLCBfX2Z1bmNfXywgY2hhcl9oYW5kbGUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZm9yIChjb25zdCBnYXR0OjpEZXNjcmlwdG9yJiBkZXNjIDogcF9jaGFyLT5kZXNjcmlwdG9ycykgewotICAgIGlmIChkZXNjLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KHNob3J0X3V1aWQpKSByZXR1cm4gJmRlc2M7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9yZWFkX2NoYXJfZGVzY3JpcHRvcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmVhZCBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0hIX1NUQVRVUyBidGFfaGhfbGVfcmVhZF9jaGFyX2Rlc2NyaXB0b3IodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNoYXJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzaG9ydF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFQURfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpIHsKLSAgY29uc3QgZ2F0dDo6RGVzY3JpcHRvciogcF9kZXNjID0KLSAgICAgIGZpbmRfZGVzY3JpcHRvcl9ieV9zaG9ydF91dWlkKHBfY2ItPmNvbm5faWQsIGNoYXJfaGFuZGxlLCBzaG9ydF91dWlkKTsKLSAgaWYgKCFwX2Rlc2MpIHJldHVybiBCVEFfSEhfRVJSOwotCi0gIEJ0YUdhdHRRdWV1ZTo6UmVhZERlc2NyaXB0b3IocF9jYi0+Y29ubl9pZCwgcF9kZXNjLT5oYW5kbGUsIGNiLCBjYl9kYXRhKTsKLSAgcmV0dXJuIEJUQV9ISF9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9zYXZlX3JlcG9ydF9yZWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNhdmUgcmVwb3J0IHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhbmQgbW92ZSB0byBuZXh0IG9uZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfc2F2ZV9yZXBvcnRfcmVmKHRCVEFfSEhfREVWX0NCKiBwX2Rldl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9MRV9SUFQqIHBfcnB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50OF90KiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIGlmIChzdGF0dXMgPT0gR0FUVF9JTlNVRl9BVVRIRU5USUNBVElPTikgewotICAgIC8qIGNsb3NlIGNvbm5lY3Rpb24gcmlnaHQgYXdheSAqLwotICAgIHBfZGV2X2NiLT5zdGF0dXMgPSBCVEFfSEhfRVJSX0FVVEhfRkFJTEVEOwotICAgIC8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCByZXBvcnQgc2VydmljZSBkaXNjb3ZlcnkgY29tcGxldGUgd2l0aCBlcnJvciAqLwotICAgIGJ0YV9oaF9sZV9hcGlfZGlzY19hY3QocF9kZXZfY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIGlmIHRoZSBsZW5ndGggb2YgdGhlIGRlc2NyaXB0b3IgdmFsdWUgaXMgcmlnaHQsIHBhcnNlIGl0ICovCi0gIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTICYmIGxlbiA9PSAyKSB7Ci0gICAgdWludDhfdCogcHAgPSB2YWx1ZTsKLQotICAgIFNUUkVBTV9UT19VSU5UOChwX3JwdC0+cnB0X2lkLCBwcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHBfcnB0LT5ycHRfdHlwZSwgcHApOwotCi0gICAgaWYgKHBfcnB0LT5ycHRfdHlwZSA+IEJUQV9ISF9SUFRUX0ZFQVRVUkUpIC8qIGludmFsaWQgcmVwb3J0IHR5cGUgKi8KLSAgICAgIHBfcnB0LT5ycHRfdHlwZSA9IEJUQV9ISF9SUFRUX1JFU1JWOwotCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHJlcG9ydCBJRDogJWQiLCBfX2Z1bmNfXywgcF9ycHQtPnJwdF9pZCk7Ci0gICAgdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkgcnB0X2VudHJ5OwotICAgIHJwdF9lbnRyeS5ycHRfaWQgPSBwX3JwdC0+cnB0X2lkOwotICAgIHJwdF9lbnRyeS5ycHRfdHlwZSA9IHBfcnB0LT5ycHRfdHlwZTsKLSAgICBycHRfZW50cnkucnB0X3V1aWQgPSBwX3JwdC0+dXVpZDsKLSAgICBycHRfZW50cnkuc3J2Y19pbnN0X2lkID0gcF9ycHQtPnNydmNfaW5zdF9pZDsKLSAgICBycHRfZW50cnkuY2hhcl9pbnN0X2lkID0gcF9ycHQtPmNoYXJfaW5zdF9pZDsKLQotICAgIGJ0YV9oaF9sZV9jb19ycHRfaW5mbyhwX2Rldl9jYi0+YWRkciwgJnJwdF9lbnRyeSwgcF9kZXZfY2ItPmFwcF9pZCk7Ci0gIH0KLQotICBpZiAocF9ycHQtPmluZGV4IDwgQlRBX0hIX0xFX1JQVF9NQVggLSAxKQotICAgIHBfcnB0Kys7Ci0gIGVsc2UKLSAgICBwX3JwdCA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVyIGZvciBhbGwgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHJlcG9ydCBhcHBsaWNhYmxlCi0gKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgcHJvdG9jb2wgbW9kZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYodEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJvdG9fbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZ2lzdGVyX2JhKSB7Ci0gIHRCVEFfSEhfTEVfUlBUKiBwX3JwdCA9ICZwX2Rldl9jYi0+aGlkX3NydmMucmVwb3J0WzBdOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYgbW9kZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwcm90b19tb2RlKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IEJUQV9ISF9MRV9SUFRfTUFYOyBpKyssIHBfcnB0KyspIHsKLSAgICBpZiAocF9ycHQtPnJwdF90eXBlID09IEJUQV9ISF9SUFRUX0lOUFVUKSB7Ci0gICAgICBpZiAocmVnaXN0ZXJfYmEgJiYgcF9ycHQtPnV1aWQgPT0gR0FUVF9VVUlEX0JBVFRFUllfTEVWRUwpIHsKLSAgICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhidGFfaGhfY2IuZ2F0dF9pZiwgcF9kZXZfY2ItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ycHQtPmNoYXJfaW5zdF9pZCk7Ci0gICAgICB9Ci0gICAgICAvKiBib290IG1vZGUsIGRlcmVnaXN0ZXIgcmVwb3J0IGlucHV0IG5vdGlmaWNhdGlvbiAqLwotICAgICAgZWxzZSBpZiAocHJvdG9fbW9kZSA9PSBCVEFfSEhfUFJPVE9fQk9PVF9NT0RFKSB7Ci0gICAgICAgIGlmIChwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX1JFUE9SVCAmJgotICAgICAgICAgICAgcF9ycHQtPmNsaWVudF9jZmdfdmFsdWUgPT0gR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTikgewotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIC0tLT4gRGVyZWdpc3RlciBSZXBvcnQgSUQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JwdC0+cnB0X2lkKTsKLSAgICAgICAgICBCVEFfR0FUVENfRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCi0gICAgICAgICAgICAgIGJ0YV9oaF9jYi5nYXR0X2lmLCBwX2Rldl9jYi0+YWRkciwgcF9ycHQtPmNoYXJfaW5zdF9pZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogcmVnaXN0ZXIgYm9vdCByZXBvcnRzIG5vdGlmaWNhdGlvbiAqLwotICAgICAgICBlbHNlIGlmIChwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX0JUX0tCX0lOUFVUIHx8Ci0gICAgICAgICAgICAgICAgIHBfcnB0LT51dWlkID09IEdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQpIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyA8LS0tIFJlZ2lzdGVyIEJvb3QgUmVwb3J0IElEOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ycHQtPnJwdF9pZCk7Ci0gICAgICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhidGFfaGhfY2IuZ2F0dF9pZiwgcF9kZXZfY2ItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JwdC0+Y2hhcl9pbnN0X2lkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwcm90b19tb2RlID09IEJUQV9ISF9QUk9UT19SUFRfTU9ERSkgewotICAgICAgICBpZiAoKHBfcnB0LT51dWlkID09IEdBVFRfVVVJRF9ISURfQlRfS0JfSU5QVVQgfHwKLSAgICAgICAgICAgICBwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX0JUX01PVVNFX0lOUFVUKSAmJgotICAgICAgICAgICAgcF9ycHQtPmNsaWVudF9jZmdfdmFsdWUgPT0gR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTikgewotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIC0tLT4gRGVyZWdpc3RlciBCb290IFJlcG9ydCBJRDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcnB0LT5ycHRfaWQpOwotICAgICAgICAgIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgICAgICAgYnRhX2hoX2NiLmdhdHRfaWYsIHBfZGV2X2NiLT5hZGRyLCBwX3JwdC0+Y2hhcl9pbnN0X2lkKTsKLSAgICAgICAgfSBlbHNlIGlmIChwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX1JFUE9SVCAmJgotICAgICAgICAgICAgICAgICAgIHBfcnB0LT5jbGllbnRfY2ZnX3ZhbHVlID09IEdBVFRfQ0xUX0NPTkZJR19OT1RJRklDQVRJT04pIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyA8LS0tIFJlZ2lzdGVyIFJlcG9ydCBJRDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcnB0LT5ycHRfaWQpOwotICAgICAgICAgIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoYnRhX2hoX2NiLmdhdHRfaWYsIHBfZGV2X2NiLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ycHQtPmNoYXJfaW5zdF9pZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICBlbHNlIHVua25vdyBwcm90b2NvbCBtb2RlICovCi0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfZGVyZWdpc3Rlcl9pbnB1dF9ub3RpZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVyZWdpc3RlciBhbGwgbm90aWZpY2F0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfZGVyZWdpc3Rlcl9pbnB1dF9ub3RpZih0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IpIHsKLSAgdEJUQV9ISF9MRV9SUFQqIHBfcnB0ID0gJnBfZGV2X2NiLT5oaWRfc3J2Yy5yZXBvcnRbMF07Ci0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgQlRBX0hIX0xFX1JQVF9NQVg7IGkrKywgcF9ycHQrKykgewotICAgIGlmIChwX3JwdC0+cnB0X3R5cGUgPT0gQlRBX0hIX1JQVFRfSU5QVVQpIHsKLSAgICAgIGlmIChwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX1JFUE9SVCAmJgotICAgICAgICAgIHBfcnB0LT5jbGllbnRfY2ZnX3ZhbHVlID09IEdBVFRfQ0xUX0NPTkZJR19OT1RJRklDQVRJT04pIHsKLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgLS0tPiBEZXJlZ2lzdGVyIFJlcG9ydCBJRDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX3JwdC0+cnB0X2lkKTsKLSAgICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGJ0YV9oaF9jYi5nYXR0X2lmLCBwX2Rldl9jYi0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcnB0LT5jaGFyX2luc3RfaWQpOwotICAgICAgfSBlbHNlIGlmICgocF9ycHQtPnV1aWQgPT0gR0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCB8fAotICAgICAgICAgICAgICAgICAgcF9ycHQtPnV1aWQgPT0gR0FUVF9VVUlEX0hJRF9CVF9NT1VTRV9JTlBVVCkgJiYKLSAgICAgICAgICAgICAgICAgcF9ycHQtPmNsaWVudF9jZmdfdmFsdWUgPT0gR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTikgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAtLS0+IERlcmVnaXN0ZXIgQm9vdCBSZXBvcnQgSUQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9ycHQtPnJwdF9pZCk7Ci0gICAgICAgIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhidGFfaGhfY2IuZ2F0dF9pZiwgcF9kZXZfY2ItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JwdC0+Y2hhcl9pbnN0X2lkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9vcGVuX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhJRCBvdmVyIEdBVFQgY29ubmVjdGlvbiBzdWNlc3NmdWxseSBvcGVuZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2xlX29wZW5fY21wbCh0QlRBX0hIX0RFVl9DQiogcF9jYikgewotICBpZiAocF9jYi0+ZGlzY19hY3RpdmUgPT0gQlRBX0hIX0xFX0RJU0NfTk9ORSkgewotICAgIGJ0YV9oaF9sZV9oaWRfcmVwb3J0X2RiZyhwX2NiKTsKLSAgICBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYocF9jYiwgcF9jYi0+bW9kZSwgdHJ1ZSk7Ci0gICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0hIX09QRU5fQ01QTF9FVlQsIE5VTEwpOwotCi0gICAgaWYgKGtCVEFfSEhfTEVfUkVDT05OICYmIHBfY2ItPnN0YXR1cyA9PSBCVEFfSEhfT0spIHsKLSAgICAgIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4ocF9jYiwgdHJ1ZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfd3JpdGVfY2NjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgYW5kIHdyaXRlIGNsaWVudCBjb25maWd1cmF0aW9uIG9mCi0gKiAgICAgICAgICAgICAgICAgIGEgY2hhcmFjdGVyaXN0aWMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRhX2hoX2xlX3dyaXRlX2NjYyh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDE2X3QgY2hhcl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsdF9jZmdfdmFsdWUsIEdBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpIHsKLSAgY29uc3QgZ2F0dDo6RGVzY3JpcHRvciogcF9kZXNjID0gZmluZF9kZXNjcmlwdG9yX2J5X3Nob3J0X3V1aWQoCi0gICAgICBwX2NiLT5jb25uX2lkLCBjaGFyX2hhbmRsZSwgR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRyk7Ci0gIGlmICghcF9kZXNjKSByZXR1cm4gZmFsc2U7Ci0KLSAgdmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKDIpOwotICB1aW50OF90KiBwdHIgPSB2YWx1ZS5kYXRhKCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHRyLCBjbHRfY2ZnX3ZhbHVlKTsKLQotICBCdGFHYXR0UXVldWU6OldyaXRlRGVzY3JpcHRvcihwX2NiLT5jb25uX2lkLCBwX2Rlc2MtPmhhbmRsZSwgc3RkOjptb3ZlKHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgY2IsIGNiX2RhdGEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgYnRhX2hoX2xlX3dyaXRlX3JwdF9jbHRfY2ZnKHRCVEFfSEhfREVWX0NCKiBwX2NiKTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcnB0X2N0bF9jZmdfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgdWludDhfdCBzcnZjX2luc3RfaWQ7Ci0KLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gKHRCVEFfSEhfREVWX0NCKilkYXRhOwotICBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogY2hhcmFjdGVyaXN0aWMgPQotICAgICAgQlRBX0dBVFRDX0dldE93bmluZ0NoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSk7Ci0gIHVpbnQxNl90IGNoYXJfdXVpZCA9IGNoYXJhY3RlcmlzdGljLT51dWlkLkFzMTZCaXQoKTsKLQotICBzcnZjX2luc3RfaWQgPSBCVEFfR0FUVENfR2V0T3duaW5nU2VydmljZShjb25uX2lkLCBoYW5kbGUpLT5oYW5kbGU7Ci0gIHN3aXRjaCAoY2hhcl91dWlkKSB7Ci0gICAgY2FzZSBHQVRUX1VVSURfQkFUVEVSWV9MRVZFTDogLyogYmF0dGVyeSBsZXZlbCBjbHQgY2ZnIHJlZ2lzdGVyZWQgKi8KLSAgICAgIGJ0YV9oaF9sZV9maW5kX3NlcnZpY2VfaW5zdF9ieV9iYXR0ZXJ5X2luc3RfaWQocF9kZXZfY2IsIHNydmNfaW5zdF9pZCk7Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdBVFRfVVVJRF9ISURfQlRfS0JfSU5QVVQ6Ci0gICAgY2FzZSBHQVRUX1VVSURfSElEX0JUX01PVVNFX0lOUFVUOgotICAgIGNhc2UgR0FUVF9VVUlEX0hJRF9SRVBPUlQ6Ci0gICAgICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUykKLSAgICAgICAgcF9kZXZfY2ItPmhpZF9zcnZjLnJlcG9ydFtwX2Rldl9jYi0+Y2x0X2NmZ19pZHhdLmNsaWVudF9jZmdfdmFsdWUgPQotICAgICAgICAgICAgR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTjsKLSAgICAgIHBfZGV2X2NiLT5jbHRfY2ZnX2lkeCsrOwotICAgICAgYnRhX2hoX2xlX3dyaXRlX3JwdF9jbHRfY2ZnKHBfZGV2X2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIlVua25vd24gY2hhciBJRCBjbHQgY2ZnOiAweCUwNHgiLCBjaGFyX3V1aWQpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX3dyaXRlX3JwdF9jbHRfY2ZnCi0gKgotICogRGVzY3JpcHRpb24gICAgICB3cml0ZSBjbGllbnQgY29uZmlndXJhdGlvbi4gVGhpcyBpcyBvbmx5IGZvciBpbnB1dCByZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgZW5hYmxlIGFsbCBpbnB1dCBub3RpZmljYXRpb24gdXBvbiBjb25uZWN0aW9uIG9wZW4uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0YV9oaF9sZV93cml0ZV9ycHRfY2x0X2NmZyh0QlRBX0hIX0RFVl9DQiogcF9jYikgewotICB1aW50OF90IGk7Ci0gIHRCVEFfSEhfTEVfUlBUKiBwX3JwdCA9ICZwX2NiLT5oaWRfc3J2Yy5yZXBvcnRbcF9jYi0+Y2x0X2NmZ19pZHhdOwotCi0gIGZvciAoaSA9IHBfY2ItPmNsdF9jZmdfaWR4OyBpIDwgQlRBX0hIX0xFX1JQVF9NQVggJiYgcF9ycHQtPmluX3VzZTsKLSAgICAgICBpKyssIHBfcnB0KyspIHsKLSAgICAvKiBlbmFibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgaW5wdXQgcmVwb3J0LCByZWdhcmRsZXNzIG1vZGUgKi8KLSAgICBpZiAocF9ycHQtPnJwdF90eXBlID09IEJUQV9ISF9SUFRUX0lOUFVUKSB7Ci0gICAgICBpZiAoYnRhX2hoX2xlX3dyaXRlX2NjYyhwX2NiLCBwX3JwdC0+Y2hhcl9pbnN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3JwdF9jdGxfY2ZnX2NiLCBwX2NiKSkgewotICAgICAgICBwX2NiLT5jbHRfY2ZnX2lkeCA9IGk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotICBwX2NiLT5jbHRfY2ZnX2lkeCA9IDA7Ci0KLSAgLyogY2xpZW50IGNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkLCBzZW5kIG9wZW4gY2FsbGJhY2sgKi8KLSAgaWYgKHBfY2ItPnN0YXRlID09IEJUQV9ISF9XNF9DT05OX1NUKSB7Ci0gICAgcF9jYi0+ZGlzY19hY3RpdmUgJj0gfkJUQV9ISF9MRV9ESVNDX0hJRFM7Ci0KLSAgICBidGFfaGhfbGVfb3Blbl9jbXBsKHBfY2IpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfcHJvdG9fbW9kZV9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gKHRCVEFfSEhfREVWX0NCKilkYXRhOwotCi0gIGlmIChwX2Rldl9jYi0+c3RhdGUgPT0gQlRBX0hIX0NPTk5fU1QpIHsKLSAgICAvKiBTZXQgcHJvdG9jb2wgZmluaXNoZWQgaW4gQ09OTiBzdGF0ZSovCi0KLSAgICB1aW50MTZfdCBjYl9ldnQgPSBwX2Rldl9jYi0+dzRfZXZ0OwotICAgIGlmIChjYl9ldnQgPT0gMCkgcmV0dXJuOwotCi0gICAgdEJUQV9ISF9DQkRBVEEgY2JhY2tfZGF0YTsKLQotICAgIGNiYWNrX2RhdGEuaGFuZGxlID0gcF9kZXZfY2ItPmhpZF9oYW5kbGU7Ci0gICAgY2JhY2tfZGF0YS5zdGF0dXMgPSAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUykgPyBCVEFfSEhfT0sgOiBCVEFfSEhfRVJSOwotCi0gICAgaWYgKHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpCi0gICAgICBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYocF9kZXZfY2IsIHBfZGV2X2NiLT5tb2RlLCBmYWxzZSk7Ci0KLSAgICBwX2Rldl9jYi0+dzRfZXZ0ID0gMDsKLSAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShjYl9ldnQsICh0QlRBX0hIKikmY2JhY2tfZGF0YSk7Ci0gIH0gZWxzZSBpZiAocF9kZXZfY2ItPnN0YXRlID09IEJUQV9ISF9XNF9DT05OX1NUKSB7Ci0gICAgcF9kZXZfY2ItPnN0YXR1cyA9IChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSA/IEJUQV9ISF9PSyA6IEJUQV9ISF9FUlJfUFJPVE87Ci0KLSAgICBpZiAoKHBfZGV2X2NiLT5kaXNjX2FjdGl2ZSAmIEJUQV9ISF9MRV9ESVNDX0hJRFMpID09IDApCi0gICAgICBidGFfaGhfbGVfb3Blbl9jbXBsKHBfZGV2X2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX3NldF9wcm90b2NvbF9tb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgcmVtb3RlIGRldmljZSBwcm90b2NvbCBtb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidGFfaGhfbGVfc2V0X3Byb3RvY29sX21vZGUodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9QUk9UT19NT0RFIG1vZGUpIHsKLSAgdEJUQV9ISF9DQkRBVEEgY2JhY2tfZGF0YTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBhdHRlbXB0IG1vZGU6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gQlRBX0hIX1BST1RPX1JQVF9NT0RFKSA/ICJSZXBvcnQiIDogIkJvb3QiKTsKLQotICBjYmFja19kYXRhLmhhbmRsZSA9IHBfY2ItPmhpZF9oYW5kbGU7Ci0gIC8qIGJvb3QgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSByZW1vdGUgZGV2aWNlICovCi0gIGlmIChwX2NiLT5oaWRfc3J2Yy5wcm90b19tb2RlX2hhbmRsZSA9PSAwKSB7Ci0gICAgcF9jYi0+bW9kZSA9IEJUQV9ISF9QUk9UT19SUFRfTU9ERTsKLQotICAgIGlmIChtb2RlID09IEJUQV9ISF9QUk9UT19CT09UX01PREUpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIlNldCBCb290IE1vZGUgZmFpbGVkISEgTm8gUFJPVE9fTU9ERSBDaGFyISIpOwotICAgICAgY2JhY2tfZGF0YS5zdGF0dXMgPSBCVEFfSEhfRVJSOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBpZiBzZXQgdG8gcmVwb3J0IG1vZGUsIG5lZWQgdG8gZGUtcmVnaXN0ZXIgYWxsIGlucHV0IHJlcG9ydAotICAgICAgICogbm90aWZpY2F0aW9uICovCi0gICAgICBidGFfaGhfbGVfcmVnaXN0ZXJfaW5wdXRfbm90aWYocF9jYiwgcF9jYi0+bW9kZSwgZmFsc2UpOwotICAgICAgY2JhY2tfZGF0YS5zdGF0dXMgPSBCVEFfSEhfT0s7Ci0gICAgfQotICAgIGlmIChwX2NiLT5zdGF0ZSA9PSBCVEFfSEhfVzRfQ09OTl9TVCkgewotICAgICAgcF9jYi0+c3RhdHVzID0KLSAgICAgICAgICAoY2JhY2tfZGF0YS5zdGF0dXMgPT0gQlRBX0hIX09LKSA/IEJUQV9ISF9PSyA6IEJUQV9ISF9FUlJfUFJPVE87Ci0gICAgfSBlbHNlCi0gICAgICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfU0VUX1BST1RPX0VWVCwgKHRCVEFfSEgqKSZjYmFja19kYXRhKTsKLSAgfSBlbHNlIGlmIChwX2NiLT5tb2RlICE9IG1vZGUpIHsKLSAgICBwX2NiLT5tb2RlID0gbW9kZTsKLSAgICBtb2RlID0gKG1vZGUgPT0gQlRBX0hIX1BST1RPX0JPT1RfTU9ERSkgPyBCVEFfSEhfTEVfUFJPVE9fQk9PVF9NT0RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlRBX0hIX0xFX1BST1RPX1JFUE9SVF9NT0RFOwotCi0gICAgQnRhR2F0dFF1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKAotICAgICAgICBwX2NiLT5jb25uX2lkLCBwX2NiLT5oaWRfc3J2Yy5wcm90b19tb2RlX2hhbmRsZSwge21vZGV9LAotICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgd3JpdGVfcHJvdG9fbW9kZV9jYiwgcF9jYik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9wcm90b2NvbF9tb2RlX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSBSZWFkIHByb3RvY29sIG1vZGUsIHNlbmQgR0VUX1BST1RPX0VWVCB0bwotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB3aXRoIHRoZSBwcm90b2NvbCBtb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnZXRfcHJvdG9jb2xfbW9kZV9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICB0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IgPSAodEJUQV9ISF9ERVZfQ0IqKWRhdGE7Ci0gIHRCVEFfSEhfSFNEQVRBIGhzX2RhdGE7Ci0KLSAgaHNfZGF0YS5zdGF0dXMgPSBCVEFfSEhfRVJSOwotICBoc19kYXRhLmhhbmRsZSA9IHBfZGV2X2NiLT5oaWRfaGFuZGxlOwotICBoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPSBwX2Rldl9jYi0+bW9kZTsKLQotICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUyAmJiBsZW4pIHsKLSAgICBoc19kYXRhLnN0YXR1cyA9IEJUQV9ISF9PSzsKLSAgICAvKiBtYXRjaCB1cCBCVEUvQlRBIHJlcG9ydC9ib290IG1vZGUgZGVmKi8KLSAgICBoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPSAqKHZhbHVlKTsKLSAgICAvKiBMRSByZXBvdCBtb2RlIGlzIHRoZSBvcHBvc2l0ZSB2YWx1ZSBvZiBCUi9FRFIgcmVwb3J0IG1vZGUsIGZsaXAgaXQgaGVyZQotICAgICAqLwotICAgIGlmIChoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPT0gMCkKLSAgICAgIGhzX2RhdGEucnNwX2RhdGEucHJvdG9fbW9kZSA9IEJUQV9ISF9QUk9UT19CT09UX01PREU7Ci0gICAgZWxzZQotICAgICAgaHNfZGF0YS5yc3BfZGF0YS5wcm90b19tb2RlID0gQlRBX0hIX1BST1RPX1JQVF9NT0RFOwotCi0gICAgcF9kZXZfY2ItPm1vZGUgPSBoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGU7Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCJMRSBHRVRfUFJPVE9DT0wgTW9kZSA9IFslc10iLAotICAgICAgICAgICAgICAgICAgIChoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPT0gQlRBX0hIX1BST1RPX1JQVF9NT0RFKQotICAgICAgICAgICAgICAgICAgICAgICA/ICJSZXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgIDogIkJvb3QiKTsKLQotICBwX2Rldl9jYi0+dzRfZXZ0ID0gMDsKLSAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX0dFVF9QUk9UT19FVlQsICh0QlRBX0hIKikmaHNfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfZ2V0X3Byb3RvY29sX21vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCByZW1vdGUgZGV2aWNlIHByb3RvY29sIG1vZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oaF9sZV9nZXRfcHJvdG9jb2xfbW9kZSh0QlRBX0hIX0RFVl9DQiogcF9jYikgewotICB0QlRBX0hIX0hTREFUQSBoc19kYXRhOwotICBwX2NiLT53NF9ldnQgPSBCVEFfSEhfR0VUX1BST1RPX0VWVDsKLQotICBpZiAocF9jYi0+aGlkX3NydmMuaW5fdXNlICYmIHBfY2ItPmhpZF9zcnZjLnByb3RvX21vZGVfaGFuZGxlICE9IDApIHsKLSAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyhwX2NiLT5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmhpZF9zcnZjLnByb3RvX21vZGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm90b2NvbF9tb2RlX2NiLCBwX2NiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBubyBzZXJ2aWNlIHN1cHBvcnQgcHJvdG9jb2xfbW9kZSwgYnkgZGVmYXVsdCByZXBvcnQgbW9kZSAqLwotICBoc19kYXRhLnN0YXR1cyA9IEJUQV9ISF9PSzsKLSAgaHNfZGF0YS5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlOwotICBoc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgPSBCVEFfSEhfUFJPVE9fUlBUX01PREU7Ci0gIHBfY2ItPnc0X2V2dCA9IDA7Ci0gICgqYnRhX2hoX2NiLnBfY2JhY2spKEJUQV9ISF9HRVRfUFJPVE9fRVZULCAodEJUQV9ISCopJmhzX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2Rpc19jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRElTIHJlYWQgY29tcGxldGUgY2FsbGJhY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfZGlzX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRESVNfVkFMVUUqIHBfZGlzX3ZhbHVlKSB7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2NiID0gYnRhX2hoX2xlX2ZpbmRfZGV2X2NiX2J5X2JkYShhZGRyKTsKLQotICBpZiAocF9jYiA9PSBOVUxMIHx8IHBfZGlzX3ZhbHVlID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJyZWNlaXZlZCB1bmV4cGVjdGVkL2Vycm9yIERJUyBjYWxsYmFjayIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfY2ItPmRpc2NfYWN0aXZlICY9IH5CVEFfSEhfTEVfRElTQ19ESVM7Ci0gIC8qIHBsdWcgaW4gdGhlIFBuUCBpbmZvIGZvciB0aGlzIGRldmljZSAqLwotICBpZiAocF9kaXNfdmFsdWUtPmF0dHJfbWFzayAmIERJU19BVFRSX1BOUF9JRF9CSVQpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgICAiUGx1ZyBpbiBQblAgaW5mbzogcHJvZHVjdF9pZCA9ICUwMngsIHZlbmRvcl9pZCA9ICUwNHgsIHZlcnNpb24gPSAlMDR4IiwKLSAgICAgICAgcF9kaXNfdmFsdWUtPnBucF9pZC5wcm9kdWN0X2lkLCBwX2Rpc192YWx1ZS0+cG5wX2lkLnZlbmRvcl9pZCwKLSAgICAgICAgcF9kaXNfdmFsdWUtPnBucF9pZC5wcm9kdWN0X3ZlcnNpb24pOwotICAgIHBfY2ItPmRzY3BfaW5mby5wcm9kdWN0X2lkID0gcF9kaXNfdmFsdWUtPnBucF9pZC5wcm9kdWN0X2lkOwotICAgIHBfY2ItPmRzY3BfaW5mby52ZW5kb3JfaWQgPSBwX2Rpc192YWx1ZS0+cG5wX2lkLnZlbmRvcl9pZDsKLSAgICBwX2NiLT5kc2NwX2luZm8udmVyc2lvbiA9IHBfZGlzX3ZhbHVlLT5wbnBfaWQucHJvZHVjdF92ZXJzaW9uOwotICB9Ci0gIGJ0YV9oaF9sZV9vcGVuX2NtcGwocF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfcHJpX3NlcnZpY2VfZGlzY292ZXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplIEdBVFQgZGlzY292ZXJ5IG9uIHRoZSByZW1vdGUgTEUgSElEIGRldmljZSBieQotICogICAgICAgICAgICAgICAgICBvcGVuaW5nIGEgR0FUVCBjb25uZWN0aW9uIGZpcnN0LgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oaF9sZV9wcmlfc2VydmljZV9kaXNjb3ZlcnkodEJUQV9ISF9ERVZfQ0IqIHBfY2IpIHsKLSAgYnRhX2hoX2xlX2NvX3Jlc2V0X3JwdF9jYWNoZShwX2NiLT5hZGRyLCBwX2NiLT5hcHBfaWQpOwotCi0gIHBfY2ItPmRpc2NfYWN0aXZlIHw9IChCVEFfSEhfTEVfRElTQ19ISURTIHwgQlRBX0hIX0xFX0RJU0NfRElTKTsKLQotICAvKiByZWFkIERJUyBpbmZvICovCi0gIGlmICghRElTX1JlYWRESVNJbmZvKHBfY2ItPmFkZHIsIGJ0YV9oaF9sZV9kaXNfY2JhY2ssIERJU19BVFRSX1BOUF9JRF9CSVQpKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigicmVhZCBESVMgZmFpbGVkIik7Ci0gICAgcF9jYi0+ZGlzY19hY3RpdmUgJj0gfkJUQV9ISF9MRV9ESVNDX0RJUzsKLSAgfQotCi0gIC8qIGluIHBhcmFsbGVsICovCi0gIC8qIHN0YXJ0IHByaW1hcnkgc2VydmljZSBkaXNjb3ZlcnkgZm9yIEhJRCBzZXJ2aWNlICovCi0gIFV1aWQgcHJpX3NydmMgPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfTEVfSElEKTsKLSAgQlRBX0dBVFRDX1NlcnZpY2VTZWFyY2hSZXF1ZXN0KHBfY2ItPmNvbm5faWQsICZwcmlfc3J2Yyk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9lbmNyeXB0X2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBsaW5rIGVuY3J5cHRpb24gY29tcGxldGUgY2FsbGJhY2sgZm9yIGJvbmQgdmVyaWZpY2F0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfZW5jcnlwdF9jYmFjayhjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB2b2lkKiBwX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgcmVzdWx0KSB7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2Rldl9jYiA9IGJ0YV9oaF9nZXRfY2IoKmJkX2FkZHIpOwotICBpZiAocF9kZXZfY2IgPT0gbnVsbHB0cikgewotICAgIExPR19FUlJPUigidW5leHBlY3RlZCBlbmNyeXB0aW9uIGNhbGxiYWNrLCBpZ25vcmUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUT0RPIENvbGxhcHNlIHRoZSBkdXBsaWNhdGVkIHN0YXR1cyB2YWx1ZXMKLSAgcF9kZXZfY2ItPnN0YXR1cyA9IChyZXN1bHQgPT0gQlRNX1NVQ0NFU1MpID8gQlRBX0hIX09LIDogQlRBX0hIX0VSUl9TRUM7Ci0gIHBfZGV2X2NiLT5idG1fc3RhdHVzID0gcmVzdWx0OwotCi0gIGJ0YV9oaF9zbV9leGVjdXRlKHBfZGV2X2NiLCBCVEFfSEhfRU5DX0NNUExfRVZULCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9zZWN1cml0eV9jbXBsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZWN1cml0eSBjaGVjayBjb21wbGV0ZWQsIHN0YXJ0IHRoZSBzZXJ2aWNlIGRpc2NvdmVyeQotICogICAgICAgICAgICAgICAgICBpZiBubyBjYWNoZSBhdmFpbGFibGUsIG90aGVyd2lzZSByZXBvcnQgY29ubmVjdGlvbiBvcGVuCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZAotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX3NlY3VyaXR5X2NtcGwodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfSEhfREFUQSogcF9idWYpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX2NiLT5zdGF0dXMgPT0gQlRBX0hIX09LKSB7Ci0gICAgaWYgKCFwX2NiLT5oaWRfc3J2Yy5pbl91c2UpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9zZWN1cml0eV9jbXBsIG5vIHJlcG9ydHMgbG9hZGVkLCB0cnkgdG8gbG9hZCIpOwotCi0gICAgICAvKiBzdGFydCBsb2FkaW5nIHRoZSBjYWNoZSBpZiBub3QgaW4gc3RhY2sgKi8KLSAgICAgIHRCVEFfSEhfUlBUX0NBQ0hFX0VOVFJZKiBwX3JwdF9jYWNoZTsKLSAgICAgIHVpbnQ4X3QgbnVtX3JwdCA9IDA7Ci0gICAgICBpZiAoKHBfcnB0X2NhY2hlID0gYnRhX2hoX2xlX2NvX2NhY2hlX2xvYWQocF9jYi0+YWRkciwgJm51bV9ycHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+YXBwX2lkKSkgIT0gTlVMTCkgewotICAgICAgICBidGFfaGhfcHJvY2Vzc19jYWNoZV9ycHQocF9jYiwgcF9ycHRfY2FjaGUsIG51bV9ycHQpOwotICAgICAgfQotICAgIH0KLSAgICAvKiAgZGlzY292ZXJ5IGhhcyBiZWVuIGRvbmUgZm9yIEhJRCBzZXJ2aWNlICovCi0gICAgaWYgKHBfY2ItPmFwcF9pZCAhPSAwICYmIHBfY2ItPmhpZF9zcnZjLmluX3VzZSkgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGRpc2NvdmVyeSBoYXMgYmVlbiBkb25lIGZvciBISUQgc2VydmljZSIsIF9fZnVuY19fKTsKLSAgICAgIC8qIGNvbmZpZ3VyZSBwcm90b2NvbCBtb2RlICovCi0gICAgICBpZiAoIWJ0YV9oaF9sZV9zZXRfcHJvdG9jb2xfbW9kZShwX2NiLCBwX2NiLT5tb2RlKSkgewotICAgICAgICBidGFfaGhfbGVfb3Blbl9jbXBsKHBfY2IpOwotICAgICAgfQotICAgIH0KLSAgICAvKiBzdGFydCBwcmltYXJ5IHNlcnZpY2UgZGlzY292ZXJ5IGZvciBISUQgc2VydmljZSAqLwotICAgIGVsc2UgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFN0YXJ0aW5nIHNlcnZpY2UgZGlzY292ZXJ5IiwgX19mdW5jX18pOwotICAgICAgYnRhX2hoX2xlX3ByaV9zZXJ2aWNlX2Rpc2NvdmVyeShwX2NiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCJFbmNyeXB0aW9uIGZhaWxlZCBzdGF0dXM6JXMgYnRtX3N0YXR1czolcyIsCi0gICAgICAgICAgICAgIGJ0YV9oaF9zdGF0dXNfdGV4dChwX2NiLT5zdGF0dXMpLmNfc3RyKCksCi0gICAgICAgICAgICAgIGJ0bV9zdGF0dXNfdGV4dChwX2NiLT5idG1fc3RhdHVzKS5jX3N0cigpKTsKLSAgICBpZiAoIShwX2NiLT5zdGF0dXMgPT0gQlRBX0hIX0VSUl9TRUMgJiYKLSAgICAgICAgICBwX2NiLT5idG1fc3RhdHVzID09IEJUTV9FUlJfUFJPQ0VTU0lORykpCi0gICAgICBidGFfaGhfbGVfYXBpX2Rpc2NfYWN0KHBfY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfbm90aWZ5X2VuY19jbXBsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBwcm9jZXNzIEdBVFQgZW5jcnlwdGlvbiBjb21wbGV0ZSBldmVudAotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfbm90aWZ5X2VuY19jbXBsKHRCVEFfSEhfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9idWYpIHsKLSAgaWYgKHBfY2IgPT0gTlVMTCB8fCAhcF9jYi0+c2VjdXJpdHlfcGVuZGluZyB8fCBwX2J1ZiA9PSBOVUxMIHx8Ci0gICAgICBwX2J1Zi0+bGVfZW5jX2NtcGwuY2xpZW50X2lmICE9IGJ0YV9oaF9jYi5nYXR0X2lmKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9jYi0+c2VjdXJpdHlfcGVuZGluZyA9IGZhbHNlOwotICBidGFfaGhfc3RhcnRfc2VjdXJpdHkocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfY2xlYXJfc2VydmljZV9jYWNoZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2xlYXIgdGhlIHNlcnZpY2UgY2FjaGUKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfY2xlYXJfc2VydmljZV9jYWNoZSh0QlRBX0hIX0RFVl9DQiogcF9jYikgewotICB0QlRBX0hIX0xFX0hJRF9TUlZDKiBwX2hpZF9zcnZjID0gJnBfY2ItPmhpZF9zcnZjOwotCi0gIHBfY2ItPmFwcF9pZCA9IDA7Ci0gIHBfY2ItPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0ID0gTlVMTDsKLQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9oaWRfc3J2Yy0+cnB0X21hcCk7Ci0gIG1lbXNldChwX2hpZF9zcnZjLCAwLCBzaXplb2YodEJUQV9ISF9MRV9ISURfU1JWQykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX3N0YXJ0X3NlY3VyaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBzdGFydCB0aGUgc2VjdXJpdHkgY2hlY2sgb2YgdGhlIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9zdGFydF9zZWN1cml0eSh0QlRBX0hIX0RFVl9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IHRCVEFfSEhfREFUQSogcF9idWYpIHsKLSAgaWYgKEJUTV9TZWNJc1NlY3VyaXR5UGVuZGluZyhwX2NiLT5hZGRyKSkgewotICAgIC8qIGlmIHNlY3VyaXR5IGNvbGxpc2lvbiBoYXBwZW5lZCwgd2FpdCBmb3IgZW5jcnlwdGlvbiBkb25lICovCi0gICAgcF9jYi0+c2VjdXJpdHlfcGVuZGluZyA9IHRydWU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogaWYgbGluayBoYXMgYmVlbiBlbmNyeXB0ZWQgKi8KLSAgaWYgKEJUTV9Jc0VuY3J5cHRlZChwX2NiLT5hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgcF9jYi0+c3RhdHVzID0gQlRBX0hIX09LOwotICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfY2IsIEJUQV9ISF9FTkNfQ01QTF9FVlQsIE5VTEwpOwotICB9Ci0gIC8qIGlmIGJvbmRlZCBhbmQgbGluayBub3QgZW5jcnlwdGVkICovCi0gIGVsc2UgaWYgKEJUTV9Jc0xpbmtLZXlLbm93bihwX2NiLT5hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgcF9jYi0+c3RhdHVzID0gQlRBX0hIX0VSUl9BVVRIX0ZBSUxFRDsKLSAgICBCVE1fU2V0RW5jcnlwdGlvbihwX2NiLT5hZGRyLCBCVF9UUkFOU1BPUlRfTEUsIGJ0YV9oaF9sZV9lbmNyeXB0X2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEJUTV9CTEVfU0VDX0VOQ1JZUFQpOwotICB9Ci0gIC8qIHVuYm9uZGVkIGRldmljZSwgcmVwb3J0IHNlY3VyaXR5IGVycm9yIGhlcmUgKi8KLSAgZWxzZSB7Ci0gICAgcF9jYi0+c3RhdHVzID0gQlRBX0hIX0VSUl9BVVRIX0ZBSUxFRDsKLSAgICBidGFfaGhfY2xlYXJfc2VydmljZV9jYWNoZShwX2NiKTsKLSAgICBCVE1fU2V0RW5jcnlwdGlvbihwX2NiLT5hZGRyLCBCVF9UUkFOU1BPUlRfTEUsIGJ0YV9oaF9sZV9lbmNyeXB0X2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEJUTV9CTEVfU0VDX0VOQ1JZUFRfTk9fTUlUTSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9nYXR0X29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHByb2Nlc3MgR0FUVCBvcGVuIGV2ZW50LgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2dhdHRfb3Blbih0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2J1ZikgewotICBjb25zdCB0QlRBX0dBVFRDX09QRU4qIHBfZGF0YSA9ICZwX2J1Zi0+bGVfb3BlbjsKLSAgY29uc3QgdWludDhfdCogcDI7Ci0KLSAgLyogaWYgcmVjZWl2ZWQgaW52YWxpZCBjYWxsYmFjayBkYXRhICwgaWdub3JlIGl0ICovCi0gIGlmIChwX2NiID09IE5VTEwgfHwgcF9kYXRhID09IE5VTEwpIHJldHVybjsKLQotICBwMiA9IHBfZGF0YS0+cmVtb3RlX2JkYS5hZGRyZXNzOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiYnRhX2hoX2dhdHRfb3BlbiBCVEFfR0FUVENfT1BFTl9FVlQgYmRhPSBbJTA4eCUwNHhdIHN0YXR1cyA9JWQiLAotICAgICAgKChwMlswXSkgPDwgMjQpICsgKChwMlsxXSkgPDwgMTYpICsgKChwMlsyXSkgPDwgOCkgKyAocDJbM10pLAotICAgICAgKChwMls0XSkgPDwgOCkgKyBwMls1XSwgcF9kYXRhLT5zdGF0dXMpOwotCi0gIGlmIChwX2RhdGEtPnN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBwX2NiLT5oaWRfaGFuZGxlID0gYnRhX2hoX2xlX2dldF9sZV9kZXZfaGRsKHBfY2ItPmluZGV4KTsKLSAgICBpZiAocF9jYi0+aGlkX2hhbmRsZSA9PSBCVEFfSEhfSURYX0lOVkFMSUQpIHsKLSAgICAgIHBfY2ItPmNvbm5faWQgPSBwX2RhdGEtPmNvbm5faWQ7Ci0gICAgICBidGFfaGhfbGVfYXBpX2Rpc2NfYWN0KHBfY2IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwX2NiLT5pc19sZV9kZXZpY2UgPSB0cnVlOwotICAgIHBfY2ItPmluX3VzZSA9IHRydWU7Ci0gICAgcF9jYi0+Y29ubl9pZCA9IHBfZGF0YS0+Y29ubl9pZDsKLQotICAgIGJ0YV9oaF9jYi5sZV9jYl9pbmRleFtCVEFfSEhfR0VUX0xFX0NCX0lEWChwX2NiLT5oaWRfaGFuZGxlKV0gPSBwX2NiLT5pbmRleDsKLQotICAgIEJ0YUdhdHRRdWV1ZTo6Q2xlYW4ocF9jYi0+Y29ubl9pZCk7Ci0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJoaWRfaGFuZGxlID0gJTJ4IGNvbm5faWQgPSAlMDR4IGNiX2luZGV4ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgcF9jYi0+aGlkX2hhbmRsZSwgcF9jYi0+Y29ubl9pZCwgcF9jYi0+aW5kZXgpOwotCi0gICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0hIX1NUQVJUX0VOQ19FVlQsIE5VTEwpOwotCi0gIH0gZWxzZSB7Ci0gICAgLyogb3BlbiBmYWlsdXJlICovCi0gICAgdEJUQV9ISF9EQVRBIGJ0YV9oaF9kYXRhOwotICAgIGJ0YV9oaF9kYXRhLnN0YXR1cyA9IEJUQV9ISF9FUlI7Ci0gICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0hIX1NEUF9DTVBMX0VWVCwgJmJ0YV9oaF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBHQVRUIGNsb3NlIGV2ZW50IGFuZCBwb3N0IGl0IGFzIGEKLSAqICAgICAgICAgICAgICAgICAgQlRBIEhIIGludGVybmFsIGV2ZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfY2xvc2UoY29uc3QgdEJUQV9HQVRUQ19DTE9TRSYgZ2F0dGNfZGF0YSkgewotICB0QlRBX0hIX0RFVl9DQiogcF9jYiA9IGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9iZGEoZ2F0dGNfZGF0YS5yZW1vdGVfYmRhKTsKLSAgaWYgKHBfY2IgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBjbG9zZSBldmVudCB3aXRoIHVua25vd24gZGV2aWNlOiVzIiwKLSAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoZ2F0dGNfZGF0YS5yZW1vdGVfYmRhKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfY2ItPmNvbm5faWQgPSBHQVRUX0lOVkFMSURfQ09OTl9JRDsKLSAgcF9jYi0+c2VjdXJpdHlfcGVuZGluZyA9IGZhbHNlOwotCi0gIHBvc3Rfb25fYnRfbWFpbihbPV0oKSB7Ci0gICAgY29uc3QgdEJUQV9ISF9EQVRBIGRhdGEgPSB7Ci0gICAgICAgIC5sZV9jbG9zZSA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLmNvbm5faWQgPSBnYXR0Y19kYXRhLmNvbm5faWQsCi0gICAgICAgICAgICAgICAgLnJlYXNvbiA9IGdhdHRjX2RhdGEucmVhc29uLAotICAgICAgICAgICAgICAgIC5oZHIgPQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZXZlbnQgPSBCVEFfSEhfR0FUVF9DTE9TRV9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAubGF5ZXJfc3BlY2lmaWMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihwX2NiLT5oaWRfaGFuZGxlKSwKLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgfTsKLSAgICBidGFfaGhfc21fZXhlY3V0ZShwX2NiLCBCVEFfSEhfR0FUVF9DTE9TRV9FVlQsICZkYXRhKTsKLSAgfSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfZ2F0dF9kaXNjX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVtb3RlIGRldmljZSBpcyBhIExFIG9ubHkgZGV2aWNlCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2xlX2dhdHRfZGlzY19jbXBsKHRCVEFfSEhfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEhfU1RBVFVTIHN0YXR1cykgewotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfbGVfZ2F0dF9kaXNjX2NtcGwgIik7Ci0KLSAgLyogaWYgb3BlbiBzdWNlc3NmdWwgb3IgcHJvdG9jb2wgbW9kZSBub3QgZGVzaXJlZCwga2VlcCB0aGUgY29ubmVjdGlvbiBvcGVuCi0gICAqIGJ1dCBpbmZvcm0gYXBwICovCi0gIGlmIChzdGF0dXMgPT0gQlRBX0hIX09LIHx8IHN0YXR1cyA9PSBCVEFfSEhfRVJSX1BST1RPKSB7Ci0gICAgLyogYXNzaWduIGEgc3BlY2lhbCBBUFAgSUQgdGVtcCwgc2luY2UgZGV2aWNlIHR5cGUgdW5rbm93biAqLwotICAgIHBfY2ItPmFwcF9pZCA9IEJUQV9ISF9BUFBfSURfTEU7Ci0KLSAgICAvKiBzZXQgcmVwb3J0IG5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uICovCi0gICAgcF9jYi0+Y2x0X2NmZ19pZHggPSAwOwotICAgIGJ0YV9oaF9sZV93cml0ZV9ycHRfY2x0X2NmZyhwX2NiKTsKLSAgfSBlbHNlIC8qIGVycm9yLCBjbG9zZSB0aGUgR0FUVCBjb25uZWN0aW9uICovCi0gIHsKLSAgICAvKiBjbG9zZSBHQVRUIGNvbm5lY3Rpb24gaWYgaXQncyBvbiAqLwotICAgIGJ0YV9oaF9sZV9hcGlfZGlzY19hY3QocF9jYik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcmVhZF9oaWRfaW5mb19jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogZXJyb3I6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxlbiAhPSA0KSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGxlbmd0aDogJWQiLCBfX2Z1bmNfXywgbGVuKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IgPSAodEJUQV9ISF9ERVZfQ0IqKWRhdGE7Ci0gIHVpbnQ4X3QqIHBwID0gdmFsdWU7Ci0gIC8qIHNhdmUgZGV2aWNlIGluZm9ybWF0aW9uICovCi0gIFNUUkVBTV9UT19VSU5UMTYocF9kZXZfY2ItPmRzY3BfaW5mby52ZXJzaW9uLCBwcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChwX2Rldl9jYi0+ZHNjcF9pbmZvLmN0cnlfY29kZSwgcHApOwotICBTVFJFQU1fVE9fVUlOVDgocF9kZXZfY2ItPmRzY3BfaW5mby5mbGFnLCBwcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfaGlkX3JlcG9ydF9tYXBfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGVycm9yIHJlYWRpbmcgY2hhcmFjdGVyaXN0aWM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gKHRCVEFfSEhfREVWX0NCKilkYXRhOwotICB0QlRBX0hIX0xFX0hJRF9TUlZDKiBwX3NydmMgPSAmcF9kZXZfY2ItPmhpZF9zcnZjOwotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3NydmMtPnJwdF9tYXApOwotCi0gIGlmIChsZW4gPiAwKSB7Ci0gICAgcF9zcnZjLT5ycHRfbWFwID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MobGVuKTsKLQotICAgIHVpbnQ4X3QqIHBwID0gdmFsdWU7Ci0gICAgU1RSRUFNX1RPX0FSUkFZKHBfc3J2Yy0+cnB0X21hcCwgcHAsIGxlbik7Ci0gICAgcF9zcnZjLT5kZXNjcmlwdG9yLmRsX2xlbiA9IGxlbjsKLSAgICBwX3NydmMtPmRlc2NyaXB0b3IuZHNjX2xpc3QgPSBwX2Rldl9jYi0+aGlkX3NydmMucnB0X21hcDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCByZWFkX2V4dF9ycHRfcmVmX2Rlc2NfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBlcnJvcjogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBkZXNjcmlwdG9yIHZhbHVlIGlzIHJpZ2h0LCBwYXJzZSBpdCBhc3N1bWUgaXQncyBhIDE2Ci0gICAqIGJpdHMgVVVJRCAqLwotICBpZiAobGVuICE9IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdlIHN1cHBvcnQgb25seSAxNmJpdCBVVUlEOiAlZCIsIF9fZnVuY19fLCBsZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVEFfSEhfREVWX0NCKiBwX2Rldl9jYiA9ICh0QlRBX0hIX0RFVl9DQiopZGF0YTsKLSAgdWludDhfdCogcHAgPSB2YWx1ZTsKLQotICBTVFJFQU1fVE9fVUlOVDE2KHBfZGV2X2NiLT5oaWRfc3J2Yy5leHRfcnB0X3JlZiwgcHApOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBFeHRlcm5hbCBSZXBvcnQgUmVmZXJlbmNlIFVVSUQgMHglMDR4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9kZXZfY2ItPmhpZF9zcnZjLmV4dF9ycHRfcmVmKTsKLX0KLQotc3RhdGljIHZvaWQgcmVhZF9yZXBvcnRfcmVmX2Rlc2NfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogZXJyb3I6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gKHRCVEFfSEhfREVWX0NCKilkYXRhOwotICBjb25zdCBnYXR0OjpEZXNjcmlwdG9yKiBwX2Rlc2MgPSBCVEFfR0FUVENfR2V0RGVzY3JpcHRvcihjb25uX2lkLCBoYW5kbGUpOwotCi0gIGlmICghcF9kZXNjKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGVycm9yOiBkZXNjcmlwdG9yIGlzIG51bGwhIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBjaGFyYWN0ZXJpc3RpYyA9Ci0gICAgICBCVEFfR0FUVENfR2V0T3duaW5nQ2hhcmFjdGVyaXN0aWMoY29ubl9pZCwgaGFuZGxlKTsKLSAgY29uc3QgZ2F0dDo6U2VydmljZSogc2VydmljZSA9Ci0gICAgICBCVEFfR0FUVENfR2V0T3duaW5nU2VydmljZShjb25uX2lkLCBjaGFyYWN0ZXJpc3RpYy0+dmFsdWVfaGFuZGxlKTsKLQotICB0QlRBX0hIX0xFX1JQVCogcF9ycHQ7Ci0gIHBfcnB0ID0gYnRhX2hoX2xlX2ZpbmRfcmVwb3J0X2VudHJ5KHBfZGV2X2NiLCBzZXJ2aWNlLT5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfVVVJRF9ISURfUkVQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYy0+dmFsdWVfaGFuZGxlKTsKLSAgaWYgKHBfcnB0KSBidGFfaGhfbGVfc2F2ZV9yZXBvcnRfcmVmKHBfZGV2X2NiLCBwX3JwdCwgc3RhdHVzLCB2YWx1ZSwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgcmVhZF9wcmVmX2Nvbm5fcGFyYW1zX2NiKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogZXJyb3I6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxlbiAhPSA4KSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdlIHN1cHBvcnQgb25seSAxNmJpdCBVVUlEOiAlZCIsIF9fZnVuY19fLCBsZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRPRE8oanBhd2xvd3NraSk6IHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgR0FQIHByb2ZpbGUsIHJlbW92ZSB3aGVuIEdBUCBpcwotICAvLyBmaXhlZC4KLSAgdWludDhfdCogcHAgPSB2YWx1ZTsKLSAgdWludDE2X3QgbWluX2ludGVydmFsLCBtYXhfaW50ZXJ2YWwsIGxhdGVuY3ksIHRpbWVvdXQ7Ci0gIFNUUkVBTV9UT19VSU5UMTYobWluX2ludGVydmFsLCBwcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYobWF4X2ludGVydmFsLCBwcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYobGF0ZW5jeSwgcHApOwotICBTVFJFQU1fVE9fVUlOVDE2KHRpbWVvdXQsIHBwKTsKLQotICAvLyBNYWtlIHN1cmUgYm90aCBtaW4sIGFuZCBtYXggYXJlIGJpZ2dlciB0aGFuIDExLjI1bXMsIGxvd2VyIHZhbHVlcyBjYW4KLSAgLy8gaW50cm9kdWNlIGF1ZGlvIGlzc3VlcyBpZiBBMkRQIGlzIGFsc28gYWN0aXZlLgotICBMMkNBX0FkanVzdENvbm5lY3Rpb25JbnRlcnZhbHMoJm1pbl9pbnRlcnZhbCwgJm1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfQ09OTl9JTlRfTUlOX0xJTUlUKTsKLQotICAvLyBJZiB0aGUgZGV2aWNlIGhhcyBubyBwcmVmZXJyZWQgY29ubmVjdGlvbiB0aW1lb3V0LCB1c2UgdGhlIGRlZmF1bHQuCi0gIGlmICh0aW1lb3V0ID09IEJUTV9CTEVfQ09OTl9QQVJBTV9VTkRFRikgdGltZW91dCA9IEJUTV9CTEVfQ09OTl9USU1FT1VUX0RFRjsKLQotICBpZiAobWluX2ludGVydmFsIDwgQlRNX0JMRV9DT05OX0lOVF9NSU4gfHwKLSAgICAgIG1pbl9pbnRlcnZhbCA+IEJUTV9CTEVfQ09OTl9JTlRfTUFYIHx8Ci0gICAgICBtYXhfaW50ZXJ2YWwgPCBCVE1fQkxFX0NPTk5fSU5UX01JTiB8fAotICAgICAgbWF4X2ludGVydmFsID4gQlRNX0JMRV9DT05OX0lOVF9NQVggfHwKLSAgICAgIGxhdGVuY3kgPiBCVE1fQkxFX0NPTk5fTEFURU5DWV9NQVggfHwKLSAgICAgIHRpbWVvdXQgPCBCVE1fQkxFX0NPTk5fU1VQX1RPVVRfTUlOIHx8Ci0gICAgICB0aW1lb3V0ID4gQlRNX0JMRV9DT05OX1NVUF9UT1VUX01BWCB8fCBtYXhfaW50ZXJ2YWwgPCBtaW5faW50ZXJ2YWwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IEludmFsaWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLiBtaW49JWQsIG1heD0lZCwgbGF0ZW5jeT0lZCwgIgotICAgICAgICAidGltZW91dD0lZCIsCi0gICAgICAgIF9fZnVuY19fLCBtaW5faW50ZXJ2YWwsIG1heF9pbnRlcnZhbCwgbGF0ZW5jeSwgdGltZW91dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gKHRCVEFfSEhfREVWX0NCKilkYXRhOwotCi0gIGlmIChpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9ISURfUFJFRl9DT05OX1NVUF9USU1FT1VUXzNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIChSYXdBZGRyZXNzKikmcF9kZXZfY2ItPmFkZHIpKSB7Ci0gICAgaWYgKHRpbWVvdXQgPCAzMDApIHRpbWVvdXQgPSAzMDA7Ci0gIH0KLQotICBCVE1fQmxlU2V0UHJlZkNvbm5QYXJhbXMocF9kZXZfY2ItPmFkZHIsIG1pbl9pbnRlcnZhbCwgbWF4X2ludGVydmFsLCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCk7Ci0gIEwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcyhwX2Rldl9jYi0+YWRkciwgbWluX2ludGVydmFsLCBtYXhfaW50ZXJ2YWwsIGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCAwLCAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9zZWFyY2hfaGlkX2NoYXJzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGRpc2NvdmVyIGFsbCBjaGFyYWN0ZXJpc3RpY3MgYSBzZXJ2aWNlIGFuZAotICogICAgICAgICAgICAgICAgICBhbGwgZGVzY3JpcHRvcnMgYXZhaWxhYmxlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oaF9sZV9zZWFyY2hfaGlkX2NoYXJzKHRCVEFfSEhfREVWX0NCKiBwX2Rldl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UqIHNlcnZpY2UpIHsKLSAgdEJUQV9ISF9MRV9SUFQqIHBfcnB0OwotCi0gIGZvciAoY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcykgewotICAgIGlmICghY2hhcmFjLnV1aWQuSXMxNkJpdCgpKSBjb250aW51ZTsKLQotICAgIHVpbnQxNl90IHV1aWQxNiA9IGNoYXJhYy51dWlkLkFzMTZCaXQoKTsKLSAgICBMT0dfSU5GTygiJXM6ICVzICVzIiwgX19mdW5jX18sIGJ0YV9oaF91dWlkX3RvX3N0cih1dWlkMTYpLAotICAgICAgICAgICAgIGNoYXJhYy51dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICBzd2l0Y2ggKHV1aWQxNikgewotICAgICAgY2FzZSBHQVRUX1VVSURfSElEX0NPTlRST0xfUE9JTlQ6Ci0gICAgICAgIHBfZGV2X2NiLT5oaWRfc3J2Yy5jb250cm9sX3BvaW50X2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHQVRUX1VVSURfSElEX0lORk9STUFUSU9OOgotICAgICAgICAvKiBvbmx5IG9uZSBpbnN0YW5jZSBwZXIgSElEIHNlcnZpY2UgKi8KLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMocF9kZXZfY2ItPmNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfaGlkX2luZm9fY2IsIHBfZGV2X2NiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdBVFRfVVVJRF9ISURfUkVQT1JUX01BUDoKLSAgICAgICAgLyogb25seSBvbmUgaW5zdGFuY2UgcGVyIEhJRCBzZXJ2aWNlICovCi0gICAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKHBfZGV2X2NiLT5jb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2hpZF9yZXBvcnRfbWFwX2NiLCBwX2Rldl9jYik7Ci0gICAgICAgIC8qIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgKi8KLSAgICAgICAgYnRhX2hoX2xlX3JlYWRfY2hhcl9kZXNjcmlwdG9yKHBfZGV2X2NiLCBjaGFyYWMudmFsdWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9VVUlEX0VYVF9SUFRfUkVGX0RFU0NSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9leHRfcnB0X3JlZl9kZXNjX2NiLCBwX2Rldl9jYik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdBVFRfVVVJRF9ISURfUkVQT1JUOgotICAgICAgICBwX3JwdCA9IGJ0YV9oaF9sZV9maW5kX2FsbG9jX3JlcG9ydF9lbnRyeSgKLSAgICAgICAgICAgIHBfZGV2X2NiLCBwX2Rldl9jYi0+aGlkX3NydmMuc3J2Y19pbnN0X2lkLCBHQVRUX1VVSURfSElEX1JFUE9SVCwKLSAgICAgICAgICAgIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotICAgICAgICBpZiAocF9ycHQgPT0gTlVMTCkgewotICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBZGQgcmVwb3J0IGVudHJ5IGZhaWxlZCAhISEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9ycHQtPnJwdF90eXBlICE9IEJUQV9ISF9SUFRUX0lOUFVUKSBicmVhazsKLQotICAgICAgICBidGFfaGhfbGVfcmVhZF9jaGFyX2Rlc2NyaXB0b3IocF9kZXZfY2IsIGNoYXJhYy52YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1VVSURfUlBUX1JFRl9ERVNDUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVwb3J0X3JlZl9kZXNjX2NiLCBwX2Rldl9jYik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBmb3VuZCBib290IG1vZGUgcmVwb3J0IHR5cGVzICovCi0gICAgICBjYXNlIEdBVFRfVVVJRF9ISURfQlRfS0JfT1VUUFVUOgotICAgICAgY2FzZSBHQVRUX1VVSURfSElEX0JUX01PVVNFX0lOUFVUOgotICAgICAgY2FzZSBHQVRUX1VVSURfSElEX0JUX0tCX0lOUFVUOgotICAgICAgICBpZiAoYnRhX2hoX2xlX2ZpbmRfYWxsb2NfcmVwb3J0X2VudHJ5KHBfZGV2X2NiLCBzZXJ2aWNlLT5oYW5kbGUsIHV1aWQxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWMudmFsdWVfaGFuZGxlKSA9PSBOVUxMKQotICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBBZGQgcmVwb3J0IGVudHJ5IGZhaWxlZCAhISEiLCBfX2Z1bmNfXyk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBub3QgcHJvY2Vzc2luZyAlcyAweCUwNGQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBidGFfaGhfdXVpZF90b19zdHIodXVpZDE2KSwgdXVpZDE2KTsKLSAgICB9Ci0gIH0KLQotICAvKiBNYWtlIHN1cmUgUFJPVE9fTU9ERSBpcyBwcm9jZXNzZWQgYXMgbGFzdCAqLwotICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICBpZiAoY2hhcmFjLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9ISURfUFJPVE9fTU9ERSkpIHsKLSAgICAgIHBfZGV2X2NiLT5oaWRfc3J2Yy5wcm90b19tb2RlX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICBidGFfaGhfbGVfc2V0X3Byb3RvY29sX21vZGUocF9kZXZfY2IsIHBfZGV2X2NiLT5tb2RlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX3NydmNfc2VhcmNoX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgR0FUVCBzZXJ2aWNlIHNlYXJjaCBjb21wbGV0ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfc3J2Y19zZWFyY2hfY21wbCh0QlRBX0dBVFRDX1NFQVJDSF9DTVBMKiBwX2RhdGEpIHsKLSAgdEJUQV9ISF9ERVZfQ0IqIHBfZGV2X2NiID0gYnRhX2hoX2xlX2ZpbmRfZGV2X2NiX2J5X2Nvbm5faWQocF9kYXRhLT5jb25uX2lkKTsKLQotICAvKiBzZXJ2aWNlIHNlYXJjaCBleGNlcHRpb24gb3Igbm8gSElEIHNlcnZpY2UgaXMgc3VwcG9ydGVkIG9uIHJlbW90ZSAqLwotICBpZiAocF9kZXZfY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIGlmIChwX2RhdGEtPnN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBwX2Rldl9jYi0+c3RhdHVzID0gQlRBX0hIX0VSUl9TRFA7Ci0gICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHJlcG9ydCBzZXJ2aWNlIGRpc2NvdmVyeSBjb21wbGV0ZSB3aXRoIGVycm9yICovCi0gICAgYnRhX2hoX2xlX2FwaV9kaXNjX2FjdChwX2Rldl9jYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+KiBzZXJ2aWNlcyA9Ci0gICAgICBCVEFfR0FUVENfR2V0U2VydmljZXMocF9kYXRhLT5jb25uX2lkKTsKLQotICBib29sIGhhdmVfaGlkID0gZmFsc2U7Ci0gIGZvciAoY29uc3QgZ2F0dDo6U2VydmljZSYgc2VydmljZSA6ICpzZXJ2aWNlcykgewotICAgIGlmIChzZXJ2aWNlLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0xFX0hJRCkgJiYKLSAgICAgICAgc2VydmljZS5pc19wcmltYXJ5ICYmICFoYXZlX2hpZCkgewotICAgICAgaGF2ZV9oaWQgPSB0cnVlOwotCi0gICAgICAvKiBmb3VuZCBISUQgcHJpbWFtcnkgc2VydmljZSAqLwotICAgICAgcF9kZXZfY2ItPmhpZF9zcnZjLmluX3VzZSA9IHRydWU7Ci0gICAgICBwX2Rldl9jYi0+aGlkX3NydmMuc3J2Y19pbnN0X2lkID0gc2VydmljZS5oYW5kbGU7Ci0gICAgICBwX2Rldl9jYi0+aGlkX3NydmMucHJvdG9fbW9kZV9oYW5kbGUgPSAwOwotICAgICAgcF9kZXZfY2ItPmhpZF9zcnZjLmNvbnRyb2xfcG9pbnRfaGFuZGxlID0gMDsKLQotICAgICAgYnRhX2hoX2xlX3NlYXJjaF9oaWRfY2hhcnMocF9kZXZfY2IsICZzZXJ2aWNlKTsKLQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGhhdmUgSElEIHNlcnZpY2UgaW5zdF9pZD0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfY2ItPmhpZF9zcnZjLnNydmNfaW5zdF9pZCk7Ci0gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX1NDQU5fUEFSQU0pKSB7Ci0KLSAgICAgIGZvciAoY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgICAgIGlmIChjaGFyYWMudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX1NDQU5fUkVGUkVTSCkpIHsKLQotICAgICAgICAgIGlmIChjaGFyYWMucHJvcGVydGllcyAmIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpCi0gICAgICAgICAgICBwX2Rldl9jYi0+c2Nwc19ub3RpZnkgfD0gQlRBX0hIX0xFX1NDUFNfTk9USUZZX1NQVDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwX2Rldl9jYi0+c2Nwc19ub3RpZnkgPSBCVEFfSEhfTEVfU0NQU19OT1RJRllfTk9ORTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBUF9TRVJWRVIpKSB7Ci0gICAgICAvLyBUT0RPKGpwYXdsb3dza2kpOiB0aGlzIHNob3VsZCBiZSBkb25lIGJ5IEdBUCBwcm9maWxlLCByZW1vdmUgd2hlbiBHQVAKLSAgICAgIC8vIGlzIGZpeGVkLgotICAgICAgZm9yIChjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyYgY2hhcmFjIDogc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgICAgaWYgKGNoYXJhYy51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfR0FQX1BSRUZfQ09OTl9QQVJBTSkpIHsKLSAgICAgICAgICAvKiByZWFkIHRoZSBjaGFyIHZhbHVlICovCi0gICAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMocF9kZXZfY2ItPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjLnZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3ByZWZfY29ubl9wYXJhbXNfY2IsIHBfZGV2X2NiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGJ0YV9oaF9sZV9nYXR0X2Rpc2NfY21wbChwX2Rldl9jYiwgcF9kZXZfY2ItPnN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfaW5wdXRfcnB0X25vdGlmeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcHJvY2VzcyB0aGUgbm90aWZpY2F0b24gZXZlbnQsIG1vc3QgbGlrZWx5IGZvciBpbnB1dCByZXBvcnQuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2xlX2lucHV0X3JwdF9ub3RpZnkodEJUQV9HQVRUQ19OT1RJRlkqIHBfZGF0YSkgewotICB0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IgPSBidGFfaGhfbGVfZmluZF9kZXZfY2JfYnlfY29ubl9pZChwX2RhdGEtPmNvbm5faWQpOwotICB1aW50OF90IGFwcF9pZDsKLSAgdWludDhfdCogcF9idWY7Ci0gIHRCVEFfSEhfTEVfUlBUKiBwX3JwdDsKLQotICBpZiAocF9kZXZfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gVW5rbm93biBkZXZpY2UsIGNvbm5faWQ6IDB4JTA0eCIsCi0gICAgICAgIF9fZnVuY19fLCBwX2RhdGEtPmNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBwX2NoYXIgPQotICAgICAgQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljKHBfZGV2X2NiLT5jb25uX2lkLCBwX2RhdGEtPmhhbmRsZSk7Ci0gIGlmIChwX2NoYXIgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZvciBVbmtub3duIENoYXJhY3RlcmlzdGljLCBjb25uX2lkOiAiCi0gICAgICAgICIweCUwNHgsIGhhbmRsZTogMHglMDR4IiwKLSAgICAgICAgX19mdW5jX18sIHBfZGV2X2NiLT5jb25uX2lkLCBwX2RhdGEtPmhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXBwX2lkID0gcF9kZXZfY2ItPmFwcF9pZDsKLQotICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBwX3N2YyA9Ci0gICAgICBCVEFfR0FUVENfR2V0T3duaW5nU2VydmljZShwX2Rldl9jYi0+Y29ubl9pZCwgcF9jaGFyLT52YWx1ZV9oYW5kbGUpOwotCi0gIHBfcnB0ID0gYnRhX2hoX2xlX2ZpbmRfcmVwb3J0X2VudHJ5KAotICAgICAgcF9kZXZfY2IsIHBfc3ZjLT5oYW5kbGUsIHBfY2hhci0+dXVpZC5BczE2Qml0KCksIHBfY2hhci0+dmFsdWVfaGFuZGxlKTsKLSAgaWYgKHBfcnB0ID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmb3IgVW5rbm93biBSZXBvcnQsIHV1aWQ6ICVzLCBoYW5kbGU6ICIKLSAgICAgICAgIjB4JTA0eCIsCi0gICAgICAgIF9fZnVuY19fLCBwX2NoYXItPnV1aWQuVG9TdHJpbmcoKS5jX3N0cigpLCBwX2NoYXItPnZhbHVlX2hhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfY2hhci0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0hJRF9CVF9NT1VTRV9JTlBVVCkpCi0gICAgYXBwX2lkID0gQlRBX0hIX0FQUF9JRF9NSTsKLSAgZWxzZSBpZiAocF9jaGFyLT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfSElEX0JUX0tCX0lOUFVUKSkKLSAgICBhcHBfaWQgPSBCVEFfSEhfQVBQX0lEX0tCOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIk5vdGlmaWNhdGlvbiByZWNlaXZlZCBvbiByZXBvcnQgSUQ6ICVkIiwgcF9ycHQtPnJwdF9pZCk7Ci0KLSAgLyogbmVlZCB0byBhcHBlbmQgcmVwb3J0IElEIHRvIHRoZSBoZWFkIG9mIGRhdGEgKi8KLSAgaWYgKHBfcnB0LT5ycHRfaWQgIT0gMCkgewotICAgIHBfYnVmID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MocF9kYXRhLT5sZW4gKyAxKTsKLQotICAgIHBfYnVmWzBdID0gcF9ycHQtPnJwdF9pZDsKLSAgICBtZW1jcHkoJnBfYnVmWzFdLCBwX2RhdGEtPnZhbHVlLCBwX2RhdGEtPmxlbik7Ci0gICAgKytwX2RhdGEtPmxlbjsKLSAgfSBlbHNlIHsKLSAgICBwX2J1ZiA9IHBfZGF0YS0+dmFsdWU7Ci0gIH0KLQotICBidGFfaGhfY29fZGF0YSgodWludDhfdClwX2Rldl9jYi0+aGlkX2hhbmRsZSwgcF9idWYsIHBfZGF0YS0+bGVuLAotICAgICAgICAgICAgICAgICBwX2Rldl9jYi0+bW9kZSwgMCwgLyogbm8gc3ViIGNsYXNzKi8KLSAgICAgICAgICAgICAgICAgcF9kZXZfY2ItPmRzY3BfaW5mby5jdHJ5X2NvZGUsIHBfZGV2X2NiLT5hZGRyLCBhcHBfaWQpOwotCi0gIGlmIChwX2J1ZiAhPSBwX2RhdGEtPnZhbHVlKSBvc2lfZnJlZShwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZ2F0dF9vcGVuX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFjdGlvbiBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBvcGVuIGZhaWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfb3Blbl9mYWlsKHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSkgewotICBjb25zdCB0QlRBX0hIX0xFX0NMT1NFKiBsZV9jbG9zZSA9ICZwX2RhdGEtPmxlX2Nsb3NlOwotCi0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIHBfY2ItPmFkZHIsICJPcGVuIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICIlcyByZWFzb24gJXMiLCAocF9jYi0+aXNfbGVfZGV2aWNlKSA/ICJsZSIgOiAiY2xhc3NpYyIsCi0gICAgICAgICAgICAgICAgICAgICBnYXR0X2Rpc2Nvbm5lY3Rpb25fcmVhc29uX3RleHQobGVfY2xvc2UtPnJlYXNvbikuY19zdHIoKSkpOwotICBMT0dfV0FSTigiT3BlbiBmYWlsZWQgZm9yIGRldmljZTolcyIsIFBSSVZBVEVfQUREUkVTUyhwX2NiLT5hZGRyKSk7Ci0KLSAgLyogb3BlbiBmYWlsdXJlIGluIHRoZSBtaWRkbGUgb2Ygc2VydmljZSBkaXNjb3ZlcnksIGNsZWFyIGFsbCBzZXJ2aWNlcyAqLwotICBpZiAocF9jYi0+ZGlzY19hY3RpdmUgJiBCVEFfSEhfTEVfRElTQ19ISURTKSB7Ci0gICAgYnRhX2hoX2NsZWFyX3NlcnZpY2VfY2FjaGUocF9jYik7Ci0gIH0KLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpICYmIHBfY2ItPmlzX2xlX2RldmljZSkgewotICAgIExPR19ERUJVRygiZ2RfYWNsOiBSZS1hZGRpbmcgSElEIGRldmljZSB0byBhY2NlcHRsaXN0Iik7Ci0gICAgLy8gZ2QgcmVtb3ZlcyBmcm9tIGJnIGxpc3QgYWZ0ZXIgZmFpbGVkIGNvbm5lY3Rpb24KLSAgICAvLyBDb3JyZWN0IHRoZSBjYWNoZWQgc3RhdGUgdG8gYWxsb3cgcmUtYWRkIHRvIGFjY2VwdGxpc3QuCi0gICAgcF9jYi0+aW5fYmdfY29ubiA9IGZhbHNlOwotICAgIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4ocF9jYiwgZmFsc2UpOwotICB9Ci0KLSAgcF9jYi0+ZGlzY19hY3RpdmUgPSBCVEFfSEhfTEVfRElTQ19OT05FOwotICAvKiBGYWlsdXJlIGluIG9wZW5pbmcgY29ubmVjdGlvbiBvciBHQVRUIGRpc2NvdmVyeSBmYWlsdXJlICovCi0gIHRCVEFfSEggZGF0YSA9IHsKLSAgICAgIC5jb25uID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlLAotICAgICAgICAgICAgICAuYmRhID0gcF9jYi0+YWRkciwKLSAgICAgICAgICAgICAgLmxlX2hpZCA9IHRydWUsCi0gICAgICAgICAgICAgIC5zY3BzX3N1cHBvcnRlZCA9IHBfY2ItPnNjcHNfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAuc3RhdHVzID0gKGxlX2Nsb3NlLT5yZWFzb24gIT0gR0FUVF9DT05OX09LKSA/IEJUQV9ISF9FUlIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwX2NiLT5zdGF0dXMsCi0gICAgICAgICAgfSwKLSAgfTsKLQotICAvKiBSZXBvcnQgT1BFTiBmYWlsIGV2ZW50ICovCi0gICgqYnRhX2hoX2NiLnBfY2JhY2spKEJUQV9ISF9PUEVOX0VWVCwgJmRhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2dhdHRfY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFjdGlvbiBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBHQVRUIGNsb3NlIGluIHRoZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICBtYWNoaW5lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9nYXR0X2Nsb3NlKHRCVEFfSEhfREVWX0NCKiBwX2NiLCBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSkgewotICBjb25zdCB0QlRBX0hIX0xFX0NMT1NFKiBsZV9jbG9zZSA9ICZwX2RhdGEtPmxlX2Nsb3NlOwotCi0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIHBfY2ItPmFkZHIsICJDbG9zZWQiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAiJXMgcmVhc29uICVzIiwgKHBfY2ItPmlzX2xlX2RldmljZSkgPyAibGUiIDogImNsYXNzaWMiLAotICAgICAgICAgICAgICAgICAgICAgZ2F0dF9kaXNjb25uZWN0aW9uX3JlYXNvbl90ZXh0KGxlX2Nsb3NlLT5yZWFzb24pLmNfc3RyKCkpKTsKLQotICAvKiBkZXJlZ2lzdGVyIGFsbCBub3RpZmljYXRpb24gKi8KLSAgYnRhX2hoX2xlX2RlcmVnaXN0ZXJfaW5wdXRfbm90aWYocF9jYik7Ci0gIC8qIGZpbmFsaXphIGRldmljZSBkcml2ZXIgKi8KLSAgYnRhX2hoX2NvX2Nsb3NlKHBfY2ItPmhpZF9oYW5kbGUsIHBfY2ItPmFwcF9pZCk7Ci0gIC8qIHVwZGF0ZSB0b3RhbCBjb25uIG51bWJlciAqLwotICBidGFfaGhfY2IuY250X251bS0tOwotCi0gIHRCVEFfSEhfQ0JEQVRBIGRpc2NfZGF0ID0gewotICAgICAgLnN0YXR1cyA9IHBfY2ItPnN0YXR1cywKLSAgICAgIC5oYW5kbGUgPSBwX2NiLT5oaWRfaGFuZGxlLAotICB9OwotICAoKmJ0YV9oaF9jYi5wX2NiYWNrKShCVEFfSEhfQ0xPU0VfRVZULCAodEJUQV9ISCopJmRpc2NfZGF0KTsKLQotICAvKiBpZiBubyBjb25uZWN0aW9uIGlzIGFjdGl2ZSBhbmQgSEggZGlzYWJsZSBpcyBzaWduYWxlZCwgZGlzYWJsZSBzZXJ2aWNlICovCi0gIGlmIChidGFfaGhfY2IuY250X251bSA9PSAwICYmIGJ0YV9oaF9jYi53NF9kaXNhYmxlKSB7Ci0gICAgYnRhX2hoX2Rpc2NfY21wbCgpOwotICB9IGVsc2UgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgIHN3aXRjaCAobGVfY2xvc2UtPnJlYXNvbikgewotICAgICAgY2FzZSBHQVRUX0NPTk5fRkFJTEVEX0VTVEFCTElTSE1FTlQ6Ci0gICAgICBjYXNlIEdBVFRfQ09OTl9URVJNSU5BVEVfUEVFUl9VU0VSOgotICAgICAgY2FzZSBHQVRUX0NPTk5fVElNRU9VVDoKLSAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgImdkX2FjbDogYWRkIGludG8gYWNjZXB0bGlzdCBmb3IgcmVjb25uZWN0aW9uIGRldmljZTolcyByZWFzb246JXMiLAotICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBfY2ItPmFkZHIpLAotICAgICAgICAgICAgZ2F0dF9kaXNjb25uZWN0aW9uX3JlYXNvbl90ZXh0KGxlX2Nsb3NlLT5yZWFzb24pLmNfc3RyKCkpOwotICAgICAgICAvLyBnZCByZW1vdmVzIGZyb20gYmcgbGlzdCBhZnRlciBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KLSAgICAgICAgLy8gQ29ycmVjdCB0aGUgY2FjaGVkIHN0YXRlIHRvIGFsbG93IHJlLWFkZCB0byBhY2NlcHRsaXN0LgotICAgICAgICBwX2NiLT5pbl9iZ19jb25uID0gZmFsc2U7Ci0gICAgICAgIGJ0YV9oaF9sZV9hZGRfZGV2X2JnX2Nvbm4ocF9jYiwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVEFfR0FUVF9DT05OX05PTkU6Ci0gICAgICBjYXNlIEdBVFRfQ09OTl9MMkNfRkFJTFVSRToKLSAgICAgIGNhc2UgR0FUVF9DT05OX0xNUF9USU1FT1VUOgotICAgICAgY2FzZSBHQVRUX0NPTk5fT0s6Ci0gICAgICBjYXNlIEdBVFRfQ09OTl9URVJNSU5BVEVfTE9DQUxfSE9TVDoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAgICJnZF9hY2w6IFNLSVAgYWRkIGludG8gYWNjZXB0bGlzdCBmb3IgcmVjb25uZWN0aW9uIGRldmljZTolcyAiCi0gICAgICAgICAgICAicmVhc29uOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX2NiLT5hZGRyKSwKLSAgICAgICAgICAgIGdhdHRfZGlzY29ubmVjdGlvbl9yZWFzb25fdGV4dChsZV9jbG9zZS0+cmVhc29uKS5jX3N0cigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgaWYgKGtCVEFfSEhfTEVfUkVDT05OICYmIGxlX2Nsb3NlLT5yZWFzb24gPT0gR0FUVF9DT05OX1RJTUVPVVQpIHsKLSAgICBidGFfaGhfbGVfYWRkX2Rldl9iZ19jb25uKHBfY2IsIGZhbHNlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2FwaV9kaXNjX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaW5pdGFpdGUgYSBDbG9zZSBBUEkgdG8gYSByZW1vdGUgSElEIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9sZV9hcGlfZGlzY19hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IpIHsKLSAgaWYgKHBfY2ItPmNvbm5faWQgPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHsKLSAgICBMT0dfRVJST1IoIlRyaWVkIHRvIGRpc2Nvbm5lY3QgSElEIGRldmljZSB3aXRoIGludmFsaWQgaWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCdGFHYXR0UXVldWU6OkNsZWFuKHBfY2ItPmNvbm5faWQpOwotICBCVEFfR0FUVENfQ2xvc2UocF9jYi0+Y29ubl9pZCk7Ci0gIC8qIHJlbW92ZSBkZXZpY2UgZnJvbSBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gaWYgaW50ZW5kZWQgdG8gZGlzY29ubmVjdCwKLSAgICAgZG8gbm90IGFsbG93IHJlY29ubmVjdGlvbiAqLwotICBidGFfaGhfbGVfcmVtb3ZlX2Rldl9iZ19jb25uKHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmVhZF9yZXBvcnRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgdGhlIFJlYWQgcmVwb3J0IGNvbXBsZXRlLCBzZW5kIEdFVF9SRVBPUlRfRVZUIHRvCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHdpdGggdGhlIHJlcG9ydCBkYXRhLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJlYWRfcmVwb3J0X2NiKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBwX2NoYXIgPQotICAgICAgQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSk7Ci0KLSAgaWYgKHBfY2hhciA9PSBOVUxMKSByZXR1cm47Ci0KLSAgdWludDE2X3QgY2hhcl91dWlkID0gcF9jaGFyLT51dWlkLkFzMTZCaXQoKTsKLQotICBpZiAoY2hhcl91dWlkICE9IEdBVFRfVVVJRF9ISURfUkVQT1JUICYmCi0gICAgICBjaGFyX3V1aWQgIT0gR0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCAmJgotICAgICAgY2hhcl91dWlkICE9IEdBVFRfVVVJRF9ISURfQlRfS0JfT1VUUFVUICYmCi0gICAgICBjaGFyX3V1aWQgIT0gR0FUVF9VVUlEX0hJRF9CVF9NT1VTRV9JTlBVVCAmJgotICAgICAgY2hhcl91dWlkICE9IEdBVFRfVVVJRF9CQVRURVJZX0xFVkVMKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IFVuZXhwZWN0ZWQgUmVhZCBVVUlEOiAweCUwNHgiLCBfX2Z1bmNfXywgY2hhcl91dWlkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IgPSAodEJUQV9ISF9ERVZfQ0IqKWRhdGE7Ci0gIGlmIChwX2Rldl9jYi0+dzRfZXZ0ICE9IEJUQV9ISF9HRVRfUlBUX0VWVCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIlVuZXhwZWN0ZWQgUkVBRCBjbXBsLCB3NF9ldnQgPSAlZCIsIHBfZGV2X2NiLT53NF9ldnQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEdFVF9SRVBPUlQgKi8KLSAgQlRfSERSKiBwX2J1ZiA9IE5VTEw7Ci0gIHRCVEFfSEhfTEVfUlBUKiBwX3JwdDsKLSAgdEJUQV9ISF9IU0RBVEEgaHNfZGF0YTsKLSAgdWludDhfdCogcHA7Ci0KLSAgbWVtc2V0KCZoc19kYXRhLCAwLCBzaXplb2YoaHNfZGF0YSkpOwotICBoc19kYXRhLnN0YXR1cyA9IEJUQV9ISF9FUlI7Ci0gIGhzX2RhdGEuaGFuZGxlID0gcF9kZXZfY2ItPmhpZF9oYW5kbGU7Ci0KLSAgaWYgKHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBwX3N2YyA9Ci0gICAgICAgIEJUQV9HQVRUQ19HZXRPd25pbmdTZXJ2aWNlKGNvbm5faWQsIHBfY2hhci0+dmFsdWVfaGFuZGxlKTsKLQotICAgIHBfcnB0ID0gYnRhX2hoX2xlX2ZpbmRfcmVwb3J0X2VudHJ5KHBfZGV2X2NiLCBwX3N2Yy0+aGFuZGxlLCBjaGFyX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jaGFyLT52YWx1ZV9oYW5kbGUpOwotCi0gICAgaWYgKHBfcnB0ICE9IE5VTEwgJiYgbGVuKSB7Ci0gICAgICBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBsZW4gKyAxKTsKLSAgICAgIC8qIHBhY2sgZGF0YSBzZW5kIHRvIGFwcCAqLwotICAgICAgaHNfZGF0YS5zdGF0dXMgPSBCVEFfSEhfT0s7Ci0gICAgICBwX2J1Zi0+bGVuID0gbGVuICsgMTsKLSAgICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0gICAgICBwX2J1Zi0+b2Zmc2V0ID0gMDsKLQotICAgICAgLyogYXR0YWNoIHJlcG9ydCBJRCBhcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVwb3J0IGJlZm9yZSBzZW5kaW5nIGl0IHRvCi0gICAgICAgKiBVU0IgSElEIGRyaXZlciAqLwotICAgICAgcHAgPSAodWludDhfdCopKHBfYnVmICsgMSk7Ci0gICAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcnB0LT5ycHRfaWQpOwotICAgICAgbWVtY3B5KHBwLCB2YWx1ZSwgbGVuKTsKLQotICAgICAgaHNfZGF0YS5yc3BfZGF0YS5wX3JwdF9kYXRhID0gcF9idWY7Ci0gICAgfQotICB9Ci0KLSAgcF9kZXZfY2ItPnc0X2V2dCA9IDA7Ci0gICgqYnRhX2hoX2NiLnBfY2JhY2spKEJUQV9ISF9HRVRfUlBUX0VWVCwgKHRCVEFfSEgqKSZoc19kYXRhKTsKLQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2dldF9ycHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdFVF9SRVBPUlQgb24gYSBMRSBISUQgUmVwb3J0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9oaF9sZV9nZXRfcnB0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnB0X2lkKSB7Ci0gIHRCVEFfSEhfTEVfUlBUKiBwX3JwdCA9IGJ0YV9oaF9sZV9maW5kX3JwdF9ieV9pZHR5cGUoCi0gICAgICBwX2NiLT5oaWRfc3J2Yy5yZXBvcnQsIHBfY2ItPm1vZGUsIHJfdHlwZSwgcnB0X2lkKTsKLQotICBpZiAocF9ycHQgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBubyBtYXRjaGluZyByZXBvcnQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9jYi0+dzRfZXZ0ID0gQlRBX0hIX0dFVF9SUFRfRVZUOwotICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyhwX2NiLT5jb25uX2lkLCBwX3JwdC0+Y2hhcl9pbnN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3JlcG9ydF9jYiwgcF9jYik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3JlcG9ydF9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIHRCVEFfSEhfQ0JEQVRBIGNiYWNrX2RhdGE7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2Rldl9jYiA9ICh0QlRBX0hIX0RFVl9DQiopZGF0YTsKLSAgdWludDE2X3QgY2JfZXZ0ID0gcF9kZXZfY2ItPnc0X2V2dDsKLQotICBpZiAoY2JfZXZ0ID09IDApIHJldHVybjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfbGVfd3JpdGVfY21wbCB3NF9ldnQ6ICVkIiwgcF9kZXZfY2ItPnc0X2V2dCk7Ci0KLSAgY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHBfY2hhciA9Ci0gICAgICBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWMoY29ubl9pZCwgaGFuZGxlKTsKLQotICBpZiAocF9jaGFyID09IG51bGxwdHIpIHJldHVybjsKLQotICB1aW50MTZfdCB1dWlkID0gcF9jaGFyLT51dWlkLkFzMTZCaXQoKTsKLSAgaWYgKHV1aWQgIT0gR0FUVF9VVUlEX0hJRF9SRVBPUlQgJiYgdXVpZCAhPSBHQVRUX1VVSURfSElEX0JUX0tCX0lOUFVUICYmCi0gICAgICB1dWlkICE9IEdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQgJiYKLSAgICAgIHV1aWQgIT0gR0FUVF9VVUlEX0hJRF9CVF9LQl9PVVRQVVQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBTZXQgUmVwb3J0IGZpbmlzaGVkICovCi0gIGNiYWNrX2RhdGEuaGFuZGxlID0gcF9kZXZfY2ItPmhpZF9oYW5kbGU7Ci0gIGNiYWNrX2RhdGEuc3RhdHVzID0gKHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpID8gQlRBX0hIX09LIDogQlRBX0hIX0VSUjsKLSAgcF9kZXZfY2ItPnc0X2V2dCA9IDA7Ci0gICgqYnRhX2hoX2NiLnBfY2JhY2spKGNiX2V2dCwgKHRCVEFfSEgqKSZjYmFja19kYXRhKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfd3JpdGVfcnB0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTRVRfUkVQT1JUL29yIERBVEEgb3V0cHV0IG9uIGEgTEUgSElEIFJlcG9ydAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfd3JpdGVfcnB0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZiwgdWludDE2X3QgdzRfZXZ0KSB7Ci0gIHRCVEFfSEhfTEVfUlBUKiBwX3JwdDsKLSAgdWludDhfdCBycHRfaWQ7Ci0KLSAgaWYgKHBfYnVmID09IE5VTEwgfHwgcF9idWYtPmxlbiA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IElsbGVnYWwgZGF0YSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBzdHJpcCByZXBvcnQgSUQgZnJvbSB0aGUgZGF0YSAqLwotICB1aW50OF90KiB2ZWNfc3RhcnQgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBTVFJFQU1fVE9fVUlOVDgocnB0X2lkLCB2ZWNfc3RhcnQpOwotICB2ZWN0b3I8dWludDhfdD4gdmFsdWUodmVjX3N0YXJ0LCB2ZWNfc3RhcnQgKyBwX2J1Zi0+bGVuIC0gMSk7Ci0KLSAgcF9ycHQgPSBidGFfaGhfbGVfZmluZF9ycHRfYnlfaWR0eXBlKHBfY2ItPmhpZF9zcnZjLnJlcG9ydCwgcF9jYi0+bW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZSwgcnB0X2lkKTsKLSAgaWYgKHBfcnB0ID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogbm8gbWF0Y2hpbmcgcmVwb3J0IiwgX19mdW5jX18pOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2NiLT53NF9ldnQgPSB3NF9ldnQ7Ci0KLSAgY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHBfY2hhciA9Ci0gICAgICBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWMocF9jYi0+Y29ubl9pZCwgcF9ycHQtPmNoYXJfaW5zdF9pZCk7Ci0KLSAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlID0gR0FUVF9XUklURTsKLSAgaWYgKHBfY2hhciAmJiAocF9jaGFyLT5wcm9wZXJ0aWVzICYgR0FUVF9DSEFSX1BST1BfQklUX1dSSVRFX05SKSkKLSAgICB3cml0ZV90eXBlID0gR0FUVF9XUklURV9OT19SU1A7Ci0KLSAgQnRhR2F0dFF1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKHBfY2ItPmNvbm5faWQsIHBfcnB0LT5jaGFyX2luc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfcmVwb3J0X2NiLCBwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9zdXNwZW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIExFIHN1c3BlbmQgb3IgZXhpdCBzdXNwZW5kIG1vZGUgdG8gcmVtb3RlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2hoX2xlX3N1c3BlbmQodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1RSQU5TX0NUUkxfVFlQRSBjdHJsX3R5cGUpIHsKLSAgY3RybF90eXBlIC09IEJUQV9ISF9DVFJMX1NVU1BFTkQ7Ci0KLSAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCByZXNwb25zZQotICBCdGFHYXR0UXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMoCi0gICAgICBwX2NiLT5jb25uX2lkLCBwX2NiLT5oaWRfc3J2Yy5jb250cm9sX3BvaW50X2hhbmRsZSwgeyh1aW50OF90KWN0cmxfdHlwZX0sCi0gICAgICBHQVRUX1dSSVRFX05PX1JTUCwgTlVMTCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfd3JpdGVfZGV2X2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgV3JpdGUgTEUgZGV2aWNlIGFjdGlvbi4gY2FuIGJlIFNFVC9HRVQvREFUQSB0cmFuc2FjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfbGVfd3JpdGVfZGV2X2FjdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwgY29uc3QgdEJUQV9ISF9EQVRBKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlKSB7Ci0gICAgY2FzZSBISURfVFJBTlNfU0VUX1BST1RPQ09MOgotICAgICAgcF9jYi0+dzRfZXZ0ID0gQlRBX0hIX1NFVF9QUk9UT19FVlQ7Ci0gICAgICBidGFfaGhfbGVfc2V0X3Byb3RvY29sX21vZGUocF9jYiwgcF9kYXRhLT5hcGlfc25kY21kLnBhcmFtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfVFJBTlNfR0VUX1BST1RPQ09MOgotICAgICAgYnRhX2hoX2xlX2dldF9wcm90b2NvbF9tb2RlKHBfY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19HRVRfUkVQT1JUOgotICAgICAgYnRhX2hoX2xlX2dldF9ycHQocF9jYiwgcF9kYXRhLT5hcGlfc25kY21kLnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnJwdF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSElEX1RSQU5TX1NFVF9SRVBPUlQ6Ci0gICAgICBidGFfaGhfbGVfd3JpdGVfcnB0KHBfY2IsIHBfZGF0YS0+YXBpX3NuZGNtZC5wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnBfZGF0YSwgQlRBX0hIX1NFVF9SUFRfRVZUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfVFJBTlNfREFUQTogLyogb3V0cHV0IHJlcG9ydCAqLwotCi0gICAgICBidGFfaGhfbGVfd3JpdGVfcnB0KHBfY2IsIHBfZGF0YS0+YXBpX3NuZGNtZC5wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnBfZGF0YSwgQlRBX0hIX0RBVEFfRVZUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfVFJBTlNfQ09OVFJPTDoKLSAgICAgIC8qIG5vIGhhbmRzaGFrZSBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCAqLwotICAgICAgLyogaWYgVkNfVU5QTFVHIGlzIGlzc3VlZCwgc2V0IGZsYWcgKi8KLSAgICAgIGlmIChwX2RhdGEtPmFwaV9zbmRjbWQucGFyYW0gPT0gQlRBX0hIX0NUUkxfU1VTUEVORCB8fAotICAgICAgICAgIHBfZGF0YS0+YXBpX3NuZGNtZC5wYXJhbSA9PSBCVEFfSEhfQ1RSTF9FWElUX1NVU1BFTkQpIHsKLSAgICAgICAgYnRhX2hoX2xlX3N1c3BlbmQocF9jYiwgcF9kYXRhLT5hcGlfc25kY21kLnBhcmFtKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIGZvciBCTEUgSElEIGRldmljZTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2dldF9kc2NwX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBSZXBvcnREZXNjcmlwdG9yIHRvIGFwcGxpY2F0aW9uIGZvciBhbGwgSElEIHNlcnZpY2VzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9sZV9nZXRfZHNjcF9hY3QodEJUQV9ISF9ERVZfQ0IqIHBfY2IpIHsKLSAgaWYgKHBfY2ItPmhpZF9zcnZjLmluX3VzZSkgewotICAgIHBfY2ItPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbiA9IHBfY2ItPmhpZF9zcnZjLmRlc2NyaXB0b3IuZGxfbGVuOwotICAgIHBfY2ItPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0ID0gcF9jYi0+aGlkX3NydmMuZGVzY3JpcHRvci5kc2NfbGlzdDsKLQotICAgICgqYnRhX2hoX2NiLnBfY2JhY2spKEJUQV9ISF9HRVRfRFNDUF9FVlQsICh0QlRBX0hIKikmcF9jYi0+ZHNjcF9pbmZvKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2FkZF9kZXZfYmdfY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlIGEgTEUgSElEIGRldmljZSBmcm9tIGJhY2sgZ3JvdW5kIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfbGVfYWRkX2Rldl9iZ19jb25uKHRCVEFfSEhfREVWX0NCKiBwX2NiLCBib29sIGNoZWNrX2JvbmQpIHsKLSAgYm9vbCB0b19hZGQgPSB0cnVlOwotCi0gIGlmIChjaGVja19ib25kKSB7Ci0gICAgLyogc3RhcnQgcmVjb25uZWN0aW9uIGlmIHJlbW90ZSBpcyBhIGJvbmRlZCBkZXZpY2UgKi8KLSAgICBpZiAoIUJUTV9Jc0xpbmtLZXlLbm93bihwX2NiLT5hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB0b19hZGQgPSBmYWxzZTsKLSAgfQotCi0gIGlmICghcF9jYi0+aW5fYmdfY29ubiAmJiB0b19hZGQpIHsKLSAgICAvKiBhZGQgZGV2aWNlIGludG8gQkcgY29ubmVjdGlvbiB0byBhY2NlcHQgcmVtb3RlIGluaXRpYXRlZCBjb25uZWN0aW9uICovCi0gICAgQlRBX0dBVFRDX09wZW4oYnRhX2hoX2NiLmdhdHRfaWYsIHBfY2ItPmFkZHIsIGZhbHNlLCBmYWxzZSk7Ci0gICAgcF9jYi0+aW5fYmdfY29ubiA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgLy8gTGV0IHRoZSBsb3dlciBsYXllcnMgbWFuYWdlIGFjY2VwdGxpc3QgYW5kIGRvIG5vdCBjYWNoZQotICAgIC8vIGF0IHRoZSBoaWdoZXIgbGF5ZXIKLSAgICBwX2NiLT5pbl9iZ19jb25uID0gdHJ1ZTsKLSAgICBCVEFfR0FUVENfT3BlbihidGFfaGhfY2IuZ2F0dF9pZiwgcF9jYi0+YWRkciwgZmFsc2UsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGFkZCBkZXZpY2UgaW50byBiZyBpbl9iZ19jb25uOiV1IHRvX2FkZDoldSIsCi0gICAgICAgICAgICAgcF9jYi0+aW5fYmdfY29ubiwgdG9fYWRkKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2FkZF9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFkZCBhIExFIEhJRCBkZXZpY2UgYXMgYSBrbm93biBkZXZpY2UsIGFuZCBhbHNvIGFkZCB0aGUKLSAqICAgICAgICAgICAgICAgICAgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICBpbnRvIGJhY2sgZ3JvdW5kIGNvbm5lY3Rpb24gV0wgZm9yIGluY29taW5nIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRhX2hoX2xlX2FkZF9kZXZpY2UodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfTUFJTlRfREVWKiBwX2Rldl9pbmZvKSB7Ci0gIHBfY2ItPmhpZF9oYW5kbGUgPSBidGFfaGhfbGVfZ2V0X2xlX2Rldl9oZGwocF9jYi0+aW5kZXgpOwotICBpZiAocF9jYi0+aGlkX2hhbmRsZSA9PSBCVEFfSEhfSU5WQUxJRF9IQU5ETEUpIHJldHVybiBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0gIGJ0YV9oaF9jYi5sZV9jYl9pbmRleFtCVEFfSEhfR0VUX0xFX0NCX0lEWChwX2NiLT5oaWRfaGFuZGxlKV0gPSBwX2NiLT5pbmRleDsKLQotICAvKiB1cGRhdGUgREkgaW5mb3JtYXRpb24gKi8KLSAgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvKAotICAgICAgcF9jYiwgcF9kZXZfaW5mby0+ZHNjcF9pbmZvLnZlbmRvcl9pZCwgcF9kZXZfaW5mby0+ZHNjcF9pbmZvLnByb2R1Y3RfaWQsCi0gICAgICBwX2Rldl9pbmZvLT5kc2NwX2luZm8udmVyc2lvbiwgcF9kZXZfaW5mby0+ZHNjcF9pbmZvLmZsYWcpOwotCi0gIC8qIGFkZCB0byBCVEEgZGV2aWNlIGxpc3QgKi8KLSAgYnRhX2hoX2FkZF9kZXZpY2VfdG9fbGlzdCgKLSAgICAgIHBfY2IsIHBfY2ItPmhpZF9oYW5kbGUsIHBfZGV2X2luZm8tPmF0dHJfbWFzaywKLSAgICAgICZwX2Rldl9pbmZvLT5kc2NwX2luZm8uZGVzY3JpcHRvciwgcF9kZXZfaW5mby0+c3ViX2NsYXNzLAotICAgICAgcF9kZXZfaW5mby0+ZHNjcF9pbmZvLnNzcl9tYXhfbGF0ZW5jeSwgcF9kZXZfaW5mby0+ZHNjcF9pbmZvLnNzcl9taW5fdG91dCwKLSAgICAgIHBfZGV2X2luZm8tPmFwcF9pZCk7Ci0KLSAgYnRhX2hoX2xlX2FkZF9kZXZfYmdfY29ubihwX2NiLCBmYWxzZSk7Ci0KLSAgcmV0dXJuIHBfY2ItPmhpZF9oYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfcmVtb3ZlX2Rldl9iZ19jb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmUgYSBMRSBISUQgZGV2aWNlIGZyb20gYmFjayBncm91bmQgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwcm9jZWR1cmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2xlX3JlbW92ZV9kZXZfYmdfY29ubih0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2IpIHsKLSAgaWYgKHBfZGV2X2NiLT5pbl9iZ19jb25uKSB7Ci0gICAgTE9HX0RFQlVHKCJSZW1vdmluZyBmcm9tIGJhY2tncm91bmQgY29ubmVjdGlvbiBkZXZpY2U6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9kZXZfY2ItPmFkZHIpKTsKLSAgICBwX2Rldl9jYi0+aW5fYmdfY29ubiA9IGZhbHNlOwotCi0gICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oYnRhX2hoX2NiLmdhdHRfaWYsIHBfZGV2X2NiLT5hZGRyLCBmYWxzZSk7Ci0gIH0KLQotICAvKiBkZXJlZ2lzdGVyIGFsbCBub3RpZmljYXRpb25zICovCi0gIGJ0YV9oaF9sZV9kZXJlZ2lzdGVyX2lucHV0X25vdGlmKHBfZGV2X2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9nYXR0Y19jYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBHQVRUIGNsaWVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGluIEJUQSBISC4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfZ2F0dGNfY2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICB0QlRBX0hIX0RFVl9DQiogcF9kZXZfY2I7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9nYXR0Y19jYWxsYmFjayBldmVudDolcyIsCi0gICAgICAgICAgICAgICAgICAgZ2F0dF9jbGllbnRfZXZlbnRfdGV4dChldmVudCkuY19zdHIoKSk7Ci0gIGlmIChwX2RhdGEgPT0gTlVMTCkgcmV0dXJuOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9HQVRUQ19ERVJFR19FVlQ6IC8qIDEgKi8KLSAgICAgIGJ0YV9oaF9jbGVhbnVwX2Rpc2FibGUoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8dEJUQV9ISF9TVEFUVVM+KHBfZGF0YS0+cmVnX29wZXIuc3RhdHVzKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOiAvKiAyICovCi0gICAgICBwX2Rldl9jYiA9IGJ0YV9oaF9sZV9maW5kX2Rldl9jYl9ieV9iZGEocF9kYXRhLT5vcGVuLnJlbW90ZV9iZGEpOwotICAgICAgaWYgKHBfZGV2X2NiKSB7Ci0gICAgICAgIGJ0YV9oaF9zbV9leGVjdXRlKHBfZGV2X2NiLCBCVEFfSEhfR0FUVF9PUEVOX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVEFfSEhfREFUQSopJnBfZGF0YS0+b3Blbik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0NMT1NFX0VWVDogLyogNSAqLwotICAgICAgYnRhX2hoX2xlX2Nsb3NlKHBfZGF0YS0+Y2xvc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TRUFSQ0hfQ01QTF9FVlQ6IC8qIDYgKi8KLSAgICAgIGJ0YV9oaF9sZV9zcnZjX3NlYXJjaF9jbXBsKCZwX2RhdGEtPnNlYXJjaF9jbXBsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfTk9USUZfRVZUOiAvKiAxMCAqLwotICAgICAgYnRhX2hoX2xlX2lucHV0X3JwdF9ub3RpZnkoJnBfZGF0YS0+bm90aWZ5KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfRU5DX0NNUExfQ0JfRVZUOiAvKiAxNyAqLwotICAgICAgcF9kZXZfY2IgPSBidGFfaGhfbGVfZmluZF9kZXZfY2JfYnlfYmRhKHBfZGF0YS0+ZW5jX2NtcGwucmVtb3RlX2JkYSk7Ci0gICAgICBpZiAocF9kZXZfY2IpIHsKLSAgICAgICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9kZXZfY2IsIEJUQV9ISF9HQVRUX0VOQ19DTVBMX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVEFfSEhfREFUQSopJnBfZGF0YS0+ZW5jX2NtcGwpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9wcm9jZXNzX2NhY2hlX3JwdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyB0aGUgY2FjaGVkIHJlcG9ydHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfaGhfcHJvY2Vzc19jYWNoZV9ycHQodEJUQV9ISF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkqIHBfcnB0X2NhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3JwdCkgewotICB1aW50OF90IGkgPSAwOwotICB0QlRBX0hIX0xFX1JQVCogcF9ycHQ7Ci0KLSAgaWYgKG51bV9ycHQgIT0gMCkgLyogbm8gY2FjaGUgaXMgZm91bmQgKi8KLSAgewotICAgIHBfY2ItPmhpZF9zcnZjLmluX3VzZSA9IHRydWU7Ci0KLSAgICAvKiBzZXQgdGhlIGRlc2NyaXB0b3IgaW5mbyAqLwotICAgIHBfY2ItPmhpZF9zcnZjLmRlc2NyaXB0b3IuZGxfbGVuID0gcF9jYi0+ZHNjcF9pbmZvLmRlc2NyaXB0b3IuZGxfbGVuOwotICAgIHBfY2ItPmhpZF9zcnZjLmRlc2NyaXB0b3IuZHNjX2xpc3QgPSBwX2NiLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdDsKLQotICAgIGZvciAoOyBpIDwgbnVtX3JwdDsgaSsrLCBwX3JwdF9jYWNoZSsrKSB7Ci0gICAgICBpZiAoKHBfcnB0ID0gYnRhX2hoX2xlX2ZpbmRfYWxsb2NfcmVwb3J0X2VudHJ5KAotICAgICAgICAgICAgICAgcF9jYiwgcF9ycHRfY2FjaGUtPnNydmNfaW5zdF9pZCwgcF9ycHRfY2FjaGUtPnJwdF91dWlkLAotICAgICAgICAgICAgICAgcF9ycHRfY2FjaGUtPmNoYXJfaW5zdF9pZCkpID09IE5VTEwpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICJidGFfaGhfcHJvY2Vzc19jYWNoZV9ycHQ6IGFsbG9jYXRpb24gcmVwb3J0IGVudHJ5IGZhaWx1cmUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX3JwdC0+cnB0X3R5cGUgPSBwX3JwdF9jYWNoZS0+cnB0X3R5cGU7Ci0gICAgICAgIHBfcnB0LT5ycHRfaWQgPSBwX3JwdF9jYWNoZS0+cnB0X2lkOwotCi0gICAgICAgIGlmIChwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX0JUX0tCX0lOUFVUIHx8Ci0gICAgICAgICAgICBwX3JwdC0+dXVpZCA9PSBHQVRUX1VVSURfSElEX0JUX01PVVNFX0lOUFVUIHx8Ci0gICAgICAgICAgICAocF9ycHQtPnV1aWQgPT0gR0FUVF9VVUlEX0hJRF9SRVBPUlQgJiYKLSAgICAgICAgICAgICBwX3JwdC0+cnB0X3R5cGUgPT0gQlRBX0hIX1JQVFRfSU5QVVQpKSB7Ci0gICAgICAgICAgcF9ycHQtPmNsaWVudF9jZmdfdmFsdWUgPSBHQVRUX0NMVF9DT05GSUdfTk9USUZJQ0FUSU9OOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idGEvaGgvYnRhX2hoX21haW4uY2MgYi9idGEvaGgvYnRhX2hoX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGIzNTIuLjAwMDAwMDAKLS0tIGEvYnRhL2hoL2J0YV9oaF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDUtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBISUQgaG9zdCBtYWluIGZ1bmN0aW9ucyBhbmQgc3RhdGUgbWFjaGluZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBtZW1zZXQKLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpZiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCi0KLSNpbmNsdWRlICJidGEvaGgvYnRhX2hoX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9ISF9DQiBidGFfaGhfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RhdGljIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX2V2dF9jb2RlKHRCVEFfSEhfSU5UX0VWVCBldnRfY29kZSk7Ci1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX3N0YXRlX2NvZGUodEJUQV9ISF9TVEFURSBzdGF0ZV9jb2RlKTsKLQotc3RhdGljIHZvaWQgYnRhX2hoX2JldHRlcl9zdGF0ZV9tYWNoaW5lKHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0hIX0RBVEEqIHBfZGF0YSkgewotICBzd2l0Y2ggKHBfY2ItPnN0YXRlKSB7Ci0gICAgY2FzZSBCVEFfSEhfSURMRV9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEhfQVBJX09QRU5fRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0hIX1c0X0NPTk5fU1Q7Ci0gICAgICAgICAgYnRhX2hoX3N0YXJ0X3NkcChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9JTlRfT1BFTl9FVlQ6Ci0gICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSEhfVzRfQ09OTl9TVDsKLSAgICAgICAgICBidGFfaGhfb3Blbl9hY3QocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfSU5UX0NMT1NFX0VWVDoKLSAgICAgICAgICBidGFfaGhfY2xvc2VfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0FQSV9NQUlOVF9ERVZfRVZUOgotICAgICAgICAgIGJ0YV9oaF9tYWludF9kZXZfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX09QRU5fQ01QTF9FVlQ6Ci0gICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSEhfQ09OTl9TVDsKLSAgICAgICAgICBidGFfaGhfb3Blbl9jbXBsX2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9HQVRUX09QRU5fRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0hIX1c0X0NPTk5fU1Q7Ci0gICAgICAgICAgYnRhX2hoX2dhdHRfb3BlbihwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEhfVzRfQ09OTl9TVDoKLSAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBCVEFfSEhfQVBJX0NMT1NFX0VWVDoKLSAgICAgICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9ISF9JRExFX1NUOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9JTlRfT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX29wZW5fYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0lOVF9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSEhfSURMRV9TVDsKLSAgICAgICAgICBidGFfaGhfb3Blbl9mYWlsdXJlKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX1NEUF9DTVBMX0VWVDoKLSAgICAgICAgICBidGFfaGhfc2RwX2NtcGwocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfQVBJX1dSSVRFX0RFVl9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX3dyaXRlX2Rldl9hY3QocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQ6Ci0gICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSEhfSURMRV9TVDsKLSAgICAgICAgICBidGFfaGhfbWFpbnRfZGV2X2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9PUEVOX0NNUExfRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0hIX0NPTk5fU1Q7Ci0gICAgICAgICAgYnRhX2hoX29wZW5fY21wbF9hY3QocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfR0FUVF9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSEhfSURMRV9TVDsKLSAgICAgICAgICBidGFfaGhfbGVfb3Blbl9mYWlsKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0dBVFRfT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX2dhdHRfb3BlbihwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9TVEFSVF9FTkNfRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0hIX1c0X1NFQzsKLSAgICAgICAgICBidGFfaGhfc3RhcnRfc2VjdXJpdHkocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hIX0NPTk5fU1Q6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX2FwaV9kaXNjX2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9JTlRfT1BFTl9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX29wZW5fYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0lOVF9DTE9TRV9FVlQ6Ci0gICAgICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSEhfSURMRV9TVDsKLSAgICAgICAgICBidGFfaGhfY2xvc2VfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0lOVF9EQVRBX0VWVDoKLSAgICAgICAgICBidGFfaGhfZGF0YV9hY3QocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfSU5UX0NUUkxfREFUQToKLSAgICAgICAgICBidGFfaGhfY3RybF9kYXRfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0lOVF9IQU5EU0tfRVZUOgotICAgICAgICAgIGJ0YV9oaF9oYW5kc2tfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0FQSV9XUklURV9ERVZfRVZUOgotICAgICAgICAgIGJ0YV9oaF93cml0ZV9kZXZfYWN0KHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0FQSV9HRVRfRFNDUF9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX2dldF9kc2NwX2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9BUElfTUFJTlRfREVWX0VWVDoKLSAgICAgICAgICBidGFfaGhfbWFpbnRfZGV2X2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9HQVRUX0NMT1NFX0VWVDoKLSAgICAgICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9ISF9JRExFX1NUOwotICAgICAgICAgIGJ0YV9oaF9nYXR0X2Nsb3NlKHBfY2IsIHBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ISF9XNF9TRUM6Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX2FwaV9kaXNjX2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9JTlRfQ0xPU0VfRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0hIX0lETEVfU1Q7Ci0gICAgICAgICAgYnRhX2hoX29wZW5fZmFpbHVyZShwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9BUElfTUFJTlRfREVWX0VWVDoKLSAgICAgICAgICBidGFfaGhfbWFpbnRfZGV2X2FjdChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUQV9ISF9HQVRUX0NMT1NFX0VWVDoKLSAgICAgICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9ISF9JRExFX1NUOwotICAgICAgICAgIGJ0YV9oaF9sZV9vcGVuX2ZhaWwocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfRU5DX0NNUExfRVZUOgotICAgICAgICAgIHBfY2ItPnN0YXRlID0gQlRBX0hIX1c0X0NPTk5fU1Q7Ci0gICAgICAgICAgYnRhX2hoX3NlY3VyaXR5X2NtcGwocF9jYiwgcF9kYXRhKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFfSEhfR0FUVF9FTkNfQ01QTF9FVlQ6Ci0gICAgICAgICAgYnRhX2hoX2xlX25vdGlmeV9lbmNfY21wbChwX2NiLCBwX2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9zbV9leGVjdXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGF0ZSBtYWNoaW5lIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciBISUQgSG9zdAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfc21fZXhlY3V0ZSh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSEhfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfSEggY2JhY2tfZGF0YTsKLSAgdEJUQV9ISF9FVlQgY2JhY2tfZXZlbnQgPSAwOwotICB0QlRBX0hIX1NUQVRFIGluX3N0YXRlOwotICB0QlRBX0hIX0lOVF9FVlQgZGVidWdfZXZlbnQgPSBzdGF0aWNfY2FzdDx0QlRBX0hIX0lOVF9FVlQ+KGV2ZW50KTsKLQotICBtZW1zZXQoJmNiYWNrX2RhdGEsIDAsIHNpemVvZih0QlRBX0hIKSk7Ci0KLSAgLyogaGFuZGxlIGV4Y2VwdGlvbiwgbm8gdmFsaWQgY29udHJvbCBibG9jayB3YXMgZm91bmQgKi8KLSAgaWYgKCFwX2NiKSB7Ci0gICAgLyogQlRBIEhIIGVuYWJsZWQgYWxyZWFkeT8gb3RoZXJ3aXNlIGlnbm9yZSB0aGUgZXZlbnQgYWx0aG91Z2ggaXQncyBiYWQqLwotICAgIGlmIChidGFfaGhfY2IucF9jYmFjayAhPSBOVUxMKSB7Ci0gICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIC8qIG5vIGNvbnRyb2wgYmxvY2sgYXZhaWxhYmxlIGZvciBuZXcgY29ubmVjdGlvbiAqLwotICAgICAgICBjYXNlIEJUQV9ISF9BUElfT1BFTl9FVlQ6Ci0gICAgICAgICAgY2JhY2tfZXZlbnQgPSBCVEFfSEhfT1BFTl9FVlQ7Ci0gICAgICAgICAgLyogYnVpbGQgY2JhY2sgZGF0YSAqLwotICAgICAgICAgIGNiYWNrX2RhdGEuY29ubi5iZGEgPSAoKHRCVEFfSEhfQVBJX0NPTk4qKXBfZGF0YSktPmJkX2FkZHI7Ci0gICAgICAgICAgY2JhY2tfZGF0YS5jb25uLnN0YXR1cyA9IEJUQV9ISF9FUlJfREJfRlVMTDsKLSAgICAgICAgICBjYmFja19kYXRhLmNvbm4uaGFuZGxlID0gQlRBX0hIX0lOVkFMSURfSEFORExFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKiBEQiBmdWxsLCBCVEFfSGhBZGREZXYgKi8KLSAgICAgICAgY2FzZSBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQ6Ci0gICAgICAgICAgY2JhY2tfZXZlbnQgPSBwX2RhdGEtPmFwaV9tYWludGRldi5zdWJfZXZlbnQ7Ci0KLSAgICAgICAgICBpZiAocF9kYXRhLT5hcGlfbWFpbnRkZXYuc3ViX2V2ZW50ID09IEJUQV9ISF9BRERfREVWX0VWVCkgewotICAgICAgICAgICAgY2JhY2tfZGF0YS5kZXZfaW5mby5iZGEgPSBwX2RhdGEtPmFwaV9tYWludGRldi5iZGE7Ci0gICAgICAgICAgICBjYmFja19kYXRhLmRldl9pbmZvLnN0YXR1cyA9IEJUQV9ISF9FUlJfREJfRlVMTDsKLSAgICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X2luZm8uaGFuZGxlID0gQlRBX0hIX0lOVkFMSURfSEFORExFOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYmFja19kYXRhLmRldl9pbmZvLnN0YXR1cyA9IEJUQV9ISF9FUlJfSERMOwotICAgICAgICAgICAgY2JhY2tfZGF0YS5kZXZfaW5mby5oYW5kbGUgPQotICAgICAgICAgICAgICAgICh1aW50OF90KXBfZGF0YS0+YXBpX21haW50ZGV2Lmhkci5sYXllcl9zcGVjaWZpYzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBX0hIX0FQSV9XUklURV9ERVZfRVZUOgotICAgICAgICAgIGNiYWNrX2V2ZW50ID0gKHBfZGF0YS0+YXBpX3NuZGNtZC50X3R5cGUgLSBISURfVFJBTlNfR0VUX1JFUE9SVCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hIX0dFVF9SUFRfRVZUOwotICAgICAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPmFwaV9zbmRjbWQucF9kYXRhKTsKLSAgICAgICAgICBpZiAocF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSA9PSBISURfVFJBTlNfU0VUX1BST1RPQ09MIHx8Ci0gICAgICAgICAgICAgIHBfZGF0YS0+YXBpX3NuZGNtZC50X3R5cGUgPT0gSElEX1RSQU5TX1NFVF9SRVBPUlQgfHwKLSAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc25kY21kLnRfdHlwZSA9PSBISURfVFJBTlNfU0VUX0lETEUpIHsKLSAgICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X3N0YXR1cy5zdGF0dXMgPSBCVEFfSEhfRVJSX0hETDsKLSAgICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X3N0YXR1cy5oYW5kbGUgPQotICAgICAgICAgICAgICAgICh1aW50OF90KXBfZGF0YS0+YXBpX3NuZGNtZC5oZHIubGF5ZXJfc3BlY2lmaWM7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlICE9IEhJRF9UUkFOU19EQVRBICYmCi0gICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmFwaV9zbmRjbWQudF90eXBlICE9IEhJRF9UUkFOU19DT05UUk9MKSB7Ci0gICAgICAgICAgICBjYmFja19kYXRhLmhzX2RhdGEuaGFuZGxlID0KLSAgICAgICAgICAgICAgICAodWludDhfdClwX2RhdGEtPmFwaV9zbmRjbWQuaGRyLmxheWVyX3NwZWNpZmljOwotICAgICAgICAgICAgY2JhY2tfZGF0YS5oc19kYXRhLnN0YXR1cyA9IEJUQV9ISF9FUlJfSERMOwotICAgICAgICAgICAgLyogaHNfZGF0YS5yc3BfZGF0YSB3aWxsIGJlIGFsbCB6ZXJvLCB3aGljaCBpcyBub3QgdmFsaWQgdmFsdWUgKi8KLSAgICAgICAgICB9IGVsc2UgaWYgKHBfZGF0YS0+YXBpX3NuZGNtZC50X3R5cGUgPT0gSElEX1RSQU5TX0NPTlRST0wgJiYKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YXBpX3NuZGNtZC5wYXJhbSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9ISF9DVFJMX1ZJUlRVQUxfQ0FCTEVfVU5QTFVHKSB7Ci0gICAgICAgICAgICBjYmFja19kYXRhLnN0YXR1cyA9IEJUQV9ISF9FUlJfSERMOwotICAgICAgICAgICAgY2JhY2tfZXZlbnQgPSBCVEFfSEhfVkNfVU5QTFVHX0VWVDsKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNiYWNrX2V2ZW50ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUQV9ISF9BUElfQ0xPU0VfRVZUOgotICAgICAgICAgIGNiYWNrX2V2ZW50ID0gQlRBX0hIX0NMT1NFX0VWVDsKLQotICAgICAgICAgIGNiYWNrX2RhdGEuZGV2X3N0YXR1cy5zdGF0dXMgPSBCVEFfSEhfRVJSX0hETDsKLSAgICAgICAgICBjYmFja19kYXRhLmRldl9zdGF0dXMuaGFuZGxlID0KLSAgICAgICAgICAgICAgKHVpbnQ4X3QpcF9kYXRhLT5hcGlfc25kY21kLmhkci5sYXllcl9zcGVjaWZpYzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIC8qIGludmFsaWQgaGFuZGxlLCBjYWxsIGJhZCBBUEkgZXZlbnQgKi8KLSAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCJ3cm9uZyBkZXZpY2UgaGFuZGxlOiBbJWRdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKTsKLSAgICAgICAgICAvKiBGcmVlIHRoZSBjYWxsYmFjayBidWZmZXIgbm93ICovCi0gICAgICAgICAgaWYgKHBfZGF0YSAhPSBOVUxMKQotICAgICAgICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZGF0YS0+aGlkX2NiYWNrLnBfZGF0YSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY2JhY2tfZXZlbnQpICgqYnRhX2hoX2NiLnBfY2JhY2spKGNiYWNrX2V2ZW50LCAmY2JhY2tfZGF0YSk7Ci0gICAgfQotICB9Ci0gIC8qIGNvcnJlc3BvbmRpbmcgQ0IgaXMgZm91bmQsIGdvIHRvIHN0YXRlIG1hY2hpbmUgKi8KLSAgZWxzZSB7Ci0gICAgaW5fc3RhdGUgPSBwX2NiLT5zdGF0ZTsKLSAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfaGhfc21fZXhlY3V0ZTogU3RhdGUgMHglMDJ4IFslc10sIEV2ZW50IFslc10iLAotICAgICAgICAgICAgICAgICAgICAgaW5fc3RhdGUsIGJ0YV9oaF9zdGF0ZV9jb2RlKGluX3N0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9ldnRfY29kZShkZWJ1Z19ldmVudCkpOwotCi0gICAgaWYgKChwX2NiLT5zdGF0ZSA9PSBCVEFfSEhfTlVMTF9TVCkgfHwgKHBfY2ItPnN0YXRlID49IEJUQV9ISF9JTlZBTElEX1NUKSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiYnRhX2hoX3NtX2V4ZWN1dGU6IEludmFsaWQgc3RhdGUgU3RhdGUgPSAweCV4LCBFdmVudCA9ICVkIiwKLSAgICAgICAgICBwX2NiLT5zdGF0ZSwgZXZlbnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJ0YV9oaF9iZXR0ZXJfc3RhdGVfbWFjaGluZShwX2NiLCBldmVudCwgcF9kYXRhKTsKLQotICAgIGlmIChpbl9zdGF0ZSAhPSBwX2NiLT5zdGF0ZSkgewotICAgICAgTE9HX0RFQlVHKCJISElEIFN0YXRlIENoYW5nZTogWyVzXSAtPiBbJXNdIGFmdGVyIEV2ZW50IFslc10iLAotICAgICAgICAgICAgICAgIGJ0YV9oaF9zdGF0ZV9jb2RlKGluX3N0YXRlKSwgYnRhX2hoX3N0YXRlX2NvZGUocF9jYi0+c3RhdGUpLAotICAgICAgICAgICAgICAgIGJ0YV9oaF9ldnRfY29kZShkZWJ1Z19ldmVudCkpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2hkbF9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSElEIGhvc3QgbWFpbiBldmVudCBoYW5kbGluZyBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2hoX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKSB7Ci0gIHVpbnQ4X3QgaW5kZXggPSBCVEFfSEhfSURYX0lOVkFMSUQ7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2NiID0gTlVMTDsKLQotICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkgewotICAgIGNhc2UgQlRBX0hIX0FQSV9FTkFCTEVfRVZUOgotICAgICAgYnRhX2hoX2FwaV9lbmFibGUoKHRCVEFfSEhfREFUQSopcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ISF9BUElfRElTQUJMRV9FVlQ6Ci0gICAgICBidGFfaGhfYXBpX2Rpc2FibGUoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEhfRElTQ19DTVBMX0VWVDogLyogZGlzYWJsZSBjb21wbGV0ZSAqLwotICAgICAgYnRhX2hoX2Rpc2NfY21wbCgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogYWxsIGV2ZW50cyBwcm9jZXNzZWQgaW4gc3RhdGUgbWFjaGluZSBuZWVkIHRvIGZpbmQgY29ycmVzcG9uZGluZwotICAgICAgICAgIENCIGJlZm9yZSBwcm9jZWVkICovCi0gICAgICBpZiAocF9tc2ctPmV2ZW50ID09IEJUQV9ISF9BUElfT1BFTl9FVlQpIHsKLSAgICAgICAgaW5kZXggPSBidGFfaGhfZmluZF9jYigoKHRCVEFfSEhfQVBJX0NPTk4qKXBfbXNnKS0+YmRfYWRkcik7Ci0gICAgICB9IGVsc2UgaWYgKHBfbXNnLT5ldmVudCA9PSBCVEFfSEhfQVBJX01BSU5UX0RFVl9FVlQpIHsKLSAgICAgICAgLyogaWYgYWRkIGRldmljZSAqLwotICAgICAgICBpZiAoKCh0QlRBX0hIX01BSU5UX0RFViopcF9tc2cpLT5zdWJfZXZlbnQgPT0gQlRBX0hIX0FERF9ERVZfRVZUKSB7Ci0gICAgICAgICAgaW5kZXggPSBidGFfaGhfZmluZF9jYigoKHRCVEFfSEhfTUFJTlRfREVWKilwX21zZyktPmJkYSk7Ci0gICAgICAgIH0gZWxzZSAvKiBlbHNlIHJlbW92ZSBkZXZpY2UgYnkgaGFuZGxlICovCi0gICAgICAgIHsKLSAgICAgICAgICBpbmRleCA9IGJ0YV9oaF9kZXZfaGFuZGxlX3RvX2NiX2lkeCgodWludDhfdClwX21zZy0+bGF5ZXJfc3BlY2lmaWMpOwotICAgICAgICAgIC8qIElmIEJUIGRpc2FibGUgaXMgZG9uZSB3aGlsZSB0aGUgSElEIGRldmljZSBpcyBjb25uZWN0ZWQgYW5kCi0gICAgICAgICAgICogTGlua19LZXkgdXNlcyB1bmF1dGhlbnRpY2F0ZWQgY29tYmluYXRpb24KLSAgICAgICAgICAgICogdGhlbiB3ZSBjYW4gZ2V0IGludG8gYSBzaXR1YXRpb24gd2hlcmUgcmVtb3ZlX2JvbmRpbmcgaXMgY2FsbGVkCi0gICAgICAgICAgICogd2l0aCB0aGUgaW5kZXggc2V0IHRvIDAgKHdpdGhvdXQgZ2V0dGluZwotICAgICAgICAgICAgKiBjbGVhbmVkIHVwKS4gT25seSB3aGVuIFZJUlRVQUxfVU5QTFVHIGlzIGNhbGxlZCBkbyB3ZSBjbGVhbnVwIHRoZQotICAgICAgICAgICAqIGluZGV4IGFuZCBtYWtlIGl0IE1BWF9LTk9XTi4KLSAgICAgICAgICAgICogU28gaWYgUkVNT1ZFX0RFVklDRSBpcyBjYWxsZWQgYW5kIGluX3VzZSBpcyBmYWxzZSB0aGVuIHdlIHNob3VsZAotICAgICAgICAgICAqIHRyZWF0IHRoaXMgYXMgYSBOVUxMIHBfY2IuIEhlbmNlIHdlCi0gICAgICAgICAgICAqIGZvcmNlIHRoZSBpbmRleCB0byBiZSBJRFhfSU5WQUxJRAotICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoKGluZGV4ICE9IEJUQV9ISF9JRFhfSU5WQUxJRCkgJiYKLSAgICAgICAgICAgICAgKCFidGFfaGhfY2Iua2RldltpbmRleF0uaW5fdXNlKSkgewotICAgICAgICAgICAgaW5kZXggPSBCVEFfSEhfSURYX0lOVkFMSUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfbXNnLT5ldmVudCA9PSBCVEFfSEhfSU5UX09QRU5fRVZUKSB7Ci0gICAgICAgIGluZGV4ID0gYnRhX2hoX2ZpbmRfY2IoKCh0QlRBX0hIX0NCQUNLX0RBVEEqKXBfbXNnKS0+YWRkcik7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaW5kZXggPSBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgoKHVpbnQ4X3QpcF9tc2ctPmxheWVyX3NwZWNpZmljKTsKLQotICAgICAgaWYgKGluZGV4ICE9IEJUQV9ISF9JRFhfSU5WQUxJRCkgcF9jYiA9ICZidGFfaGhfY2Iua2RldltpbmRleF07Ci0KLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9oZGxfZXZlbnQ6OiBoYW5kbGUgPSAlZCBkZXZfY2JbJWRdICIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5sYXllcl9zcGVjaWZpYywgaW5kZXgpOwotICAgICAgYnRhX2hoX3NtX2V4ZWN1dGUocF9jYiwgcF9tc2ctPmV2ZW50LCAodEJUQV9ISF9EQVRBKilwX21zZyk7Ci0gIH0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRGVidWcgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZXZ0X2NvZGUKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX2V2dF9jb2RlKHRCVEFfSEhfSU5UX0VWVCBldnRfY29kZSkgewotICBzd2l0Y2ggKGV2dF9jb2RlKSB7Ci0gICAgY2FzZSBCVEFfSEhfQVBJX0RJU0FCTEVfRVZUOgotICAgICAgcmV0dXJuICJCVEFfSEhfQVBJX0RJU0FCTEVfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9BUElfRU5BQkxFX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX0FQSV9FTkFCTEVfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9BUElfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9BUElfT1BFTl9FVlQiOwotICAgIGNhc2UgQlRBX0hIX0FQSV9DTE9TRV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9BUElfQ0xPU0VfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9JTlRfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9JTlRfT1BFTl9FVlQiOwotICAgIGNhc2UgQlRBX0hIX0lOVF9DTE9TRV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9JTlRfQ0xPU0VfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9JTlRfSEFORFNLX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX0lOVF9IQU5EU0tfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9JTlRfREFUQV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9JTlRfREFUQV9FVlQiOwotICAgIGNhc2UgQlRBX0hIX0lOVF9DVFJMX0RBVEE6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9JTlRfQ1RSTF9EQVRBIjsKLSAgICBjYXNlIEJUQV9ISF9BUElfV1JJVEVfREVWX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX0FQSV9XUklURV9ERVZfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9TRFBfQ01QTF9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9TRFBfQ01QTF9FVlQiOwotICAgIGNhc2UgQlRBX0hIX0RJU0NfQ01QTF9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9ESVNDX0NNUExfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9BUElfTUFJTlRfREVWX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX0FQSV9NQUlOVF9ERVZfRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9BUElfR0VUX0RTQ1BfRVZUOgotICAgICAgcmV0dXJuICJCVEFfSEhfQVBJX0dFVF9EU0NQX0VWVCI7Ci0gICAgY2FzZSBCVEFfSEhfT1BFTl9DTVBMX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX09QRU5fQ01QTF9FVlQiOwotICAgIGNhc2UgQlRBX0hIX0dBVFRfQ0xPU0VfRVZUOgotICAgICAgcmV0dXJuICJCVEFfSEhfR0FUVF9DTE9TRV9FVlQiOwotICAgIGNhc2UgQlRBX0hIX0dBVFRfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9HQVRUX09QRU5fRVZUIjsKLSAgICBjYXNlIEJUQV9ISF9TVEFSVF9FTkNfRVZUOgotICAgICAgcmV0dXJuICJCVEFfSEhfU1RBUlRfRU5DX0VWVCI7Ci0gICAgY2FzZSBCVEFfSEhfRU5DX0NNUExfRVZUOgotICAgICAgcmV0dXJuICJCVEFfSEhfRU5DX0NNUExfRVZUIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIEhJRCBIb3N0IGV2ZW50IGNvZGUiOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfc3RhdGVfY29kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZ2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBISUQgaG9zdCBzdGF0ZSBjb2RlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2hoX3N0YXRlX2NvZGUodEJUQV9ISF9TVEFURSBzdGF0ZV9jb2RlKSB7Ci0gIHN3aXRjaCAoc3RhdGVfY29kZSkgewotICAgIGNhc2UgQlRBX0hIX05VTExfU1Q6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9OVUxMX1NUIjsKLSAgICBjYXNlIEJUQV9ISF9JRExFX1NUOgotICAgICAgcmV0dXJuICJCVEFfSEhfSURMRV9TVCI7Ci0gICAgY2FzZSBCVEFfSEhfVzRfQ09OTl9TVDoKLSAgICAgIHJldHVybiAiQlRBX0hIX1c0X0NPTk5fU1QiOwotICAgIGNhc2UgQlRBX0hIX0NPTk5fU1Q6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9DT05OX1NUIjsKLSAgICBjYXNlIEJUQV9ISF9XNF9TRUM6Ci0gICAgICByZXR1cm4gIkJUQV9ISF9XNF9TRUMiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gSElEIEhvc3Qgc3RhdGUiOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBCVEFfSEhfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2J0YS9oaC9idGFfaGhfdXRpbHMuY2MgYi9idGEvaGgvYnRhX2hoX3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQxODc0Li4wMDAwMDAwCi0tLSBhL2J0YS9oaC9idGFfaGhfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldAotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpZiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCi0KLSNpbmNsdWRlICJidF90cmFjZS5oIiAgLy8gTGVnYWN5IHRyYWNlIGxvZ2dpbmcKLSNpbmNsdWRlICJidGEvaGgvYnRhX2hoX2ludC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIGlmIFNTUiBtYXggbGF0ZW5jeSBpcyBub3QgZGVmaW5lZCBieSByZW1vdGUgZGV2aWNlLCBzZXQgdGhlIGRlZmF1bHQgdmFsdWUKLSAgIGFzIGhhbGYgb2YgdGhlIGxpbmsgc3VwZXJ2aXNpb24gdGltZW91dCAqLwotI2RlZmluZSBCVEFfSEhfR0VUX0RFRl9TU1JfTUFYX0xBVCh4KSAoKHgpID4+IDEpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrU3NyTWF4TGF0ZW5jeSA9IDE4OyAvKiBzbG90cyAqIDAuNjI1bXMgKi8KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZmluZF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZCBiZXN0IGF2YWlsYWJsZSBjb250cm9sIGJsb2NrIGFjY29yZGluZyB0byBCRCBhZGRyZXNzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBidGFfaGhfZmluZF9jYihjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdWludDhfdCB4eDsKLQotICAvKiBTZWUgaG93IG1hbnkgYWN0aXZlIGRldmljZXMgdGhlcmUgYXJlLiAqLwotICBmb3IgKHh4ID0gMDsgeHggPCBCVEFfSEhfTUFYX0RFVklDRTsgeHgrKykgewotICAgIC8qIGNoZWNrIGlmIGFueSBhY3RpdmUva25vd24gZGV2aWNlcyBpcyBhIG1hdGNoICovCi0gICAgaWYgKChiZGEgPT0gYnRhX2hoX2NiLmtkZXZbeHhdLmFkZHIgJiYgIWJkYS5Jc0VtcHR5KCkpKSB7Ci0jaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiZm91bmQga2Rldl9jYlslZF0gaGlkX2hhbmRsZSA9ICVkICIsIHh4LAotICAgICAgICAgICAgICAgICAgICAgICBidGFfaGhfY2Iua2Rldlt4eF0uaGlkX2hhbmRsZSkKLSNlbmRpZgotICAgICAgcmV0dXJuIHh4OwotICAgIH0KLSNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCi0gICAgZWxzZQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiaW5fdXNlID8gWyVkXSBrZGV2WyVkXS5oaWRfaGFuZGxlID0gJWQgc3RhdGUgPSBbJWRdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRhX2hoX2NiLmtkZXZbeHhdLmluX3VzZSwgeHgsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9jYi5rZGV2W3h4XS5oaWRfaGFuZGxlLCBidGFfaGhfY2Iua2Rldlt4eF0uc3RhdGUpOwotI2VuZGlmCi0gIH0KLQotICAvKiBpZiBubyBhY3RpdmUgZGV2aWNlIG1hdGNoLCBmaW5kIGEgc3BvdCBmb3IgaXQgKi8KLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0hIX01BWF9ERVZJQ0U7IHh4KyspIHsKLSAgICBpZiAoIWJ0YV9oaF9jYi5rZGV2W3h4XS5pbl91c2UpIHsKLSAgICAgIGJ0YV9oaF9jYi5rZGV2W3h4XS5hZGRyID0gYmRhOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0vKiBJZiBkZXZpY2UgbGlzdCBmdWxsLCByZXBvcnQgQlRBX0hIX0lEWF9JTlZBTElEICovCi0jaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfZmluZF9jYjo6IGluZGV4ID0gJWQgd2hpbGUgbWF4ID0gJWQiLCB4eCwKLSAgICAgICAgICAgICAgICAgICBCVEFfSEhfTUFYX0RFVklDRSk7Ci0jZW5kaWYKLQotICBpZiAoeHggPT0gQlRBX0hIX01BWF9ERVZJQ0UpIHh4ID0gQlRBX0hIX0lEWF9JTlZBTElEOwotCi0gIHJldHVybiB4eDsKLX0KLQotdEJUQV9ISF9ERVZfQ0IqIGJ0YV9oaF9nZXRfY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIHVpbnQ4X3QgaWR4ID0gYnRhX2hoX2ZpbmRfY2IoYmRhKTsKLSAgaWYgKGlkeCA9PSBCVEFfSEhfSURYX0lOVkFMSUQpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gJmJ0YV9oaF9jYi5rZGV2W2lkeF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfY2xlYW5fdXBfa2RldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xlYW4gdXAgZGV2aWNlIGNvbnRyb2wgYmxvY2sgd2hlbiBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIG1hbml0YWluYWNlIGxpc3QsIGFuZCB1cGRhdGUgY29udHJvbCBibG9jayBpbmRleCBtYXAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2NsZWFuX3VwX2tkZXYodEJUQV9ISF9ERVZfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCBpbmRleDsKLQotICBpZiAocF9jYi0+aGlkX2hhbmRsZSAhPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICBpZiAocF9jYi0+aXNfbGVfZGV2aWNlKQotICAgICAgYnRhX2hoX2NiLmxlX2NiX2luZGV4W0JUQV9ISF9HRVRfTEVfQ0JfSURYKHBfY2ItPmhpZF9oYW5kbGUpXSA9Ci0gICAgICAgICAgQlRBX0hIX0lEWF9JTlZBTElEOwotICAgIGVsc2UKLSAgICAgIGJ0YV9oaF9jYi5jYl9pbmRleFtwX2NiLT5oaWRfaGFuZGxlXSA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKLSAgfQotCi0gIC8qIHJlc2V0IGRldmljZSBjb250cm9sIGJsb2NrICovCi0gIGluZGV4ID0gcF9jYi0+aW5kZXg7IC8qIFByZXNlcnZlIGluZGV4IGZvciB0aGlzIGNvbnRyb2wgYmxvY2sgKi8KLQotICAvKiBGcmVlIGJ1ZmZlciBmb3IgcmVwb3J0IGRlc2NyaXB0b3IgaW5mbyAqLwotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jYi0+ZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QpOwotCi0gIG1lbXNldChwX2NiLCAwLCBzaXplb2YodEJUQV9ISF9ERVZfQ0IpKTsgLyogUmVzZXQgY29udHJvbCBibG9jayAqLwotCi0gIHBfY2ItPmluZGV4ID0gaW5kZXg7IC8qIFJlc3RvcmUgaW5kZXggZm9yIHRoaXMgY29udHJvbCBibG9jayAqLwotICBwX2NiLT5zdGF0ZSA9IEJUQV9ISF9JRExFX1NUOwotICBwX2NiLT5oaWRfaGFuZGxlID0gQlRBX0hIX0lOVkFMSURfSEFORExFOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF91cGRhdGVfZGlfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTWFpbnRhaW4gYSBrbm93biBkZXZpY2UgbGlzdCBmb3IgQlRBIEhILgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF91cGRhdGVfZGlfaW5mbyh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDE2X3QgdmVuZG9yX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZHVjdF9pZCwgdWludDE2X3QgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmxhZykKLXsKLSNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCi0gIEFQUExfVFJBQ0VfREVCVUcoInZlbmRvcl9pZCA9IDB4JTJ4IHByb2R1Y3RfaWQgPSAweCUyeCB2ZXJzaW9uID0gMHglMngiLAotICAgICAgICAgICAgICAgICAgIHZlbmRvcl9pZCwgcHJvZHVjdF9pZCwgdmVyc2lvbik7Ci0jZW5kaWYKLSAgcF9jYi0+ZHNjcF9pbmZvLnZlbmRvcl9pZCA9IHZlbmRvcl9pZDsKLSAgcF9jYi0+ZHNjcF9pbmZvLnByb2R1Y3RfaWQgPSBwcm9kdWN0X2lkOwotICBwX2NiLT5kc2NwX2luZm8udmVyc2lvbiA9IHZlcnNpb247Ci0gIHBfY2ItPmRzY3BfaW5mby5mbGFnID0gZmxhZzsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfYWRkX2RldmljZV90b19saXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBNYWludGFpbiBhIGtub3duIGRldmljZSBsaXN0IGZvciBCVEEgSEguCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2FkZF9kZXZpY2VfdG9fbGlzdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDhfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRISURfREVWX0RTQ1BfSU5GTyogcF9kc2NwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdWJfY2xhc3MsIHVpbnQxNl90IHNzcl9tYXhfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzc3JfbWluX3RvdXQsIHVpbnQ4X3QgYXBwX2lkKSB7Ci0jaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQotICBBUFBMX1RSQUNFX0RFQlVHKCJzdWJjbGFzcyA9IDB4JTJ4Iiwgc3ViX2NsYXNzKTsKLSNlbmRpZgotCi0gIHBfY2ItPmhpZF9oYW5kbGUgPSBoYW5kbGU7Ci0gIHBfY2ItPmluX3VzZSA9IHRydWU7Ci0gIHBfY2ItPmF0dHJfbWFzayA9IGF0dHJfbWFzazsKLQotICBwX2NiLT5zdWJfY2xhc3MgPSBzdWJfY2xhc3M7Ci0gIHBfY2ItPmFwcF9pZCA9IGFwcF9pZDsKLQotICBwX2NiLT5kc2NwX2luZm8uc3NyX21heF9sYXRlbmN5ID0gc3NyX21heF9sYXRlbmN5OwotICBwX2NiLT5kc2NwX2luZm8uc3NyX21pbl90b3V0ID0gc3NyX21pbl90b3V0OwotCi0gIC8qIHN0b3JlIHJlcG9ydCBkZXNjcmlwdG9yIGluZm8gKi8KLSAgaWYgKHBfZHNjcF9pbmZvKSB7Ci0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfY2ItPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KTsKLQotICAgIGlmIChwX2RzY3BfaW5mby0+ZGxfbGVuKSB7Ci0gICAgICBwX2NiLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCA9Ci0gICAgICAgICAgKHVpbnQ4X3QqKW9zaV9tYWxsb2MocF9kc2NwX2luZm8tPmRsX2xlbik7Ci0gICAgICBwX2NiLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4gPSBwX2RzY3BfaW5mby0+ZGxfbGVuOwotICAgICAgbWVtY3B5KHBfY2ItPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0LCBwX2RzY3BfaW5mby0+ZHNjX2xpc3QsCi0gICAgICAgICAgICAgcF9kc2NwX2luZm8tPmRsX2xlbik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfdG9kX3NwdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgdHlwZSBvZiBkZXZpY2UgaXMgc3VwcG9ydGVkCi0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9oaF90b2Rfc3B0KHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50OF90IHN1Yl9jbGFzcykgewotICB1aW50OF90IHh4OwotICB1aW50OF90IGNvZCA9IChzdWJfY2xhc3MgPj4gMik7IC8qIGxvd2VyIHR3byBiaXRzIGFyZSByZXNlcnZlZCAqLwotCi0gIGZvciAoeHggPSAwOyB4eCA8IHBfYnRhX2hoX2NmZy0+bWF4X2RldnRfc3B0OyB4eCsrKSB7Ci0gICAgaWYgKGNvZCA9PSAodWludDhfdClwX2J0YV9oaF9jZmctPnBfZGV2dF9saXN0W3h4XS50b2QpIHsKLSAgICAgIHBfY2ItPmFwcF9pZCA9IHBfYnRhX2hoX2NmZy0+cF9kZXZ0X2xpc3RbeHhdLmFwcF9pZDsKLSNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCi0gICAgICBBUFBMX1RSQUNFX0VWRU5UKCJidGFfaGhfdG9kX3NwdCBzdWJfY2xhc3M6MHgleCBzdXBwb3J0ZWQiLCBzdWJfY2xhc3MpOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSNpZiAoQlRBX0hIX0RFQlVHID09IFRSVUUpCi0gIEFQUExfVFJBQ0VfRVZFTlQoImJ0YV9oaF90b2Rfc3B0IHN1Yl9jbGFzczoweCV4IE5PVCBzdXBwb3J0ZWQiLCBzdWJfY2xhc3MpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX3JlYWRfc3NyX3BhcmFtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWFkIHRoZSBTU1IgUGFyYW1ldGVyIGZvciB0aGUgcmVtb3RlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9ISF9TVEFUVVMgIG9wZXJhdGlvbiBzdGF0dXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9ISF9TVEFUVVMgYnRhX2hoX3JlYWRfc3NyX3BhcmFtKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfbWF4X3Nzcl9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfbWluX3Nzcl90b3V0KSB7Ci0gIHRCVEFfSEhfREVWX0NCKiBwX2NiID0gYnRhX2hoX2dldF9jYihiZF9hZGRyKTsKLSAgaWYgKHBfY2IgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBkZXZpY2U6JXMiLCBQUklWQVRFX0FERFJFU1MoYmRfYWRkcikpOwotICAgIHJldHVybiBCVEFfSEhfRVJSOwotICB9Ci0KLSAgLyogaWYgcmVtb3RlIGRldmljZSBkb2VzIG5vdCBoYXZlIEhJRFNTUkhvc3RNYXhMYXRlbmN5IGF0dHJpYnV0ZSBpbiBTRFAsCi0gICAgIHNldCBTU1IgbWF4IGxhdGVuY3kgZGVmYXVsdCB2YWx1ZSBoZXJlLiAgKi8KLSAgaWYgKHBfY2ItPmRzY3BfaW5mby5zc3JfbWF4X2xhdGVuY3kgPT0gSElEX1NTUl9QQVJBTV9JTlZBTElEKSB7Ci0gICAgLyogVGhlIGRlZmF1bHQgaXMgY2FsY3VsYXRlZCBhcyBoYWxmIG9mIGxpbmsgc3VwZXJ2aXNpb24gdGltZW91dC4qLwotCi0gICAgdWludDE2X3Qgc3NyX21heF9sYXRlbmN5OwotICAgIGlmIChnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saW5rX2NvbnRyb2xsZXIuQlRNX0dldExpbmtTdXBlclRvdXQoCi0gICAgICAgICAgICBwX2NiLT5hZGRyLCAmc3NyX21heF9sYXRlbmN5KSAhPSBCVE1fU1VDQ0VTUykgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBnZXQgc3VwZXJ2aXNpb24gdGltZW91dCBmb3IgcGVlcjolcyIsCi0gICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9jYi0+YWRkcikpOwotICAgICAgcmV0dXJuIEJUQV9ISF9FUlI7Ci0gICAgfQotICAgIHNzcl9tYXhfbGF0ZW5jeSA9IEJUQV9ISF9HRVRfREVGX1NTUl9NQVhfTEFUKHNzcl9tYXhfbGF0ZW5jeSk7Ci0KLSAgICAvKiBwZXIgMS4xIHNwZWMsIGlmIHRoZSBuZXdseSBjYWxjdWxhdGVkIG1heCBsYXRlbmN5IGlzIGdyZWF0ZXIgdGhhbgotICAgICAgIEJUQV9ISF9TU1JfTUFYX0xBVEVOQ1lfREVGIHdoaWNoIGlzIDUwMG1zLCB1c2UKLSAgICAgICBCVEFfSEhfU1NSX01BWF9MQVRFTkNZX0RFRiAqLwotICAgIGlmIChzc3JfbWF4X2xhdGVuY3kgPiBCVEFfSEhfU1NSX01BWF9MQVRFTkNZX0RFRikKLSAgICAgIHNzcl9tYXhfbGF0ZW5jeSA9IEJUQV9ISF9TU1JfTUFYX0xBVEVOQ1lfREVGOwotCi0gICAgY2hhciByZW1vdGVfbmFtZVtCVE1fTUFYX1JFTV9CRF9OQU1FX0xFTl0gPSAiIjsKLSAgICBpZiAoYnRpZl9zdG9yYWdlX2dldF9zdG9yZWRfcmVtb3RlX25hbWUoYmRfYWRkciwgcmVtb3RlX25hbWUpKSB7Ci0gICAgICBpZiAoaW50ZXJvcF9tYXRjaF9uYW1lKElOVEVST1BfSElEX0hPU1RfTElNSVRfU05JRkZfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9uYW1lKSkgewotICAgICAgICBpZiAoc3NyX21heF9sYXRlbmN5ID4ga1Nzck1heExhdGVuY3kgLyogc2xvdHMgKiAwLjYyNW1zICovKSB7Ci0gICAgICAgICAgc3NyX21heF9sYXRlbmN5ID0ga1Nzck1heExhdGVuY3k7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAqcF9tYXhfc3NyX2xhdCA9IHNzcl9tYXhfbGF0ZW5jeTsKLSAgfSBlbHNlCi0gICAgKnBfbWF4X3Nzcl9sYXQgPSBwX2NiLT5kc2NwX2luZm8uc3NyX21heF9sYXRlbmN5OwotCi0gIGlmIChwX2NiLT5kc2NwX2luZm8uc3NyX21pbl90b3V0ID09IEhJRF9TU1JfUEFSQU1fSU5WQUxJRCkKLSAgICAqcF9taW5fc3NyX3RvdXQgPSBCVEFfSEhfU1NSX01JTl9UT1VUX0RFRjsKLSAgZWxzZQotICAgICpwX21pbl9zc3JfdG91dCA9IHBfY2ItPmRzY3BfaW5mby5zc3JfbWluX3RvdXQ7Ci0KLSAgcmV0dXJuIEJUQV9ISF9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9jbGVhbnVwX2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHdoZW4gZGlzYWJsZSBmaW5pc2hlZCwgY2xlYW51cCBjb250cm9sIGJsb2NrIGFuZCBzZW5kCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9jbGVhbnVwX2Rpc2FibGUodEJUQV9ISF9TVEFUVVMgc3RhdHVzKSB7Ci0gIHVpbnQ4X3QgeHg7Ci0gIC8qIGZyZWUgYnVmZmVyIGluIENCIGhvbGRpbmcgcmVwb3J0IGRlc2NyaXB0b3JzICovCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUQV9ISF9NQVhfREVWSUNFOyB4eCsrKSB7Ci0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KAotICAgICAgICAodm9pZCoqKSZidGFfaGhfY2Iua2Rldlt4eF0uZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QpOwotICB9Ci0KLSAgaWYgKGJ0YV9oaF9jYi5wX2Rpc2NfZGIpIHsKLSAgICAvKiBDYW5jZWwgU0RQIGlmIGl0IGhhZCBiZWVuIHN0YXJ0ZWQuICovCi0gICAgKHZvaWQpU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2ggKGJ0YV9oaF9jYi5wX2Rpc2NfZGIpOwotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZidGFfaGhfY2IucF9kaXNjX2RiKTsKLSAgfQotCi0gIGlmIChidGFfaGhfY2IucF9jYmFjaykgewotICAgIHRCVEFfSEggYnRhX2hoOwotICAgIGJ0YV9oaC5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgKCpidGFfaGhfY2IucF9jYmFjaykoQlRBX0hIX0RJU0FCTEVfRVZULCAmYnRhX2hoKTsKLSAgICAvKiBhbGwgY29ubmVjdGlvbnMgYXJlIGRvd24sIG5vIHdhaXRpbmcgZm9yIGRpY29ubmVjdCAqLwotICAgIG1lbXNldCgmYnRhX2hoX2NiLCAwLCBzaXplb2YodEJUQV9ISF9DQikpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNvbnZlcnQgYSBISUQgZGV2aWNlIGhhbmRsZSB0byB0aGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sKLSAqICAgICAgICAgICAgICAgICAgaW5kZXguCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDhfdDogaW5kZXggb2YgdGhlIGRldmljZSBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGJ0YV9oaF9kZXZfaGFuZGxlX3RvX2NiX2lkeCh1aW50OF90IGRldl9oYW5kbGUpIHsKLSAgdWludDhfdCBpbmRleCA9IEJUQV9ISF9JRFhfSU5WQUxJRDsKLQotICBpZiAoQlRBX0hIX0lTX0xFX0RFVl9IREwoZGV2X2hhbmRsZSkpIHsKLSAgICBpZiAoQlRBX0hIX0lTX0xFX0RFVl9IRExfVkFMSUQoZGV2X2hhbmRsZSkpCi0gICAgICBpbmRleCA9IGJ0YV9oaF9jYi5sZV9jYl9pbmRleFtCVEFfSEhfR0VUX0xFX0NCX0lEWChkZXZfaGFuZGxlKV07Ci0jaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9oaF9kZXZfaGFuZGxlX3RvX2NiX2lkeCBkZXZfaGFuZGxlID0gJWQgaW5kZXggPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBkZXZfaGFuZGxlLCBpbmRleCk7Ci0jZW5kaWYKLSAgfSBlbHNlCi0gICAgICAvKiByZWd1bGFyIEhJRCBkZXZpY2UgY2hlY2tpbmcgKi8KLSAgICAgIGlmIChkZXZfaGFuZGxlIDwgQlRBX0hIX01BWF9LTk9XTikKLSAgICBpbmRleCA9IGJ0YV9oaF9jYi5jYl9pbmRleFtkZXZfaGFuZGxlXTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0jaWYgKEJUQV9ISF9ERUJVRyA9PSBUUlVFKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF90cmFjZV9kZXZfZGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGlzIHR5cGUgb2YgZGV2aWNlIGlzIHN1cHBvcnRlZAotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfdHJhY2VfZGV2X2RiKHZvaWQpIHsKLSAgdWludDhfdCB4eDsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfaGhfdHJhY2VfZGV2X2RiOjogRGV2aWNlIERCIGxpc3QqKioqKioqKioqKioqKioqKioqKiIpOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUQV9ISF9NQVhfREVWSUNFOyB4eCsrKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygia2RldlslZF0gaW5fdXNlWyVkXSAgaGFuZGxlWyVkXSAiLCB4eCwKLSAgICAgICAgICAgICAgICAgICAgIGJ0YV9oaF9jYi5rZGV2W3h4XS5pbl91c2UsIGJ0YV9oaF9jYi5rZGV2W3h4XS5oaWRfaGFuZGxlKTsKLQotICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICJcdFx0XHQgYXR0cl9tYXNrWyUwNHhdIHN0YXRlIFslZF0gc3ViX2NsYXNzWyUwMnhdIGluZGV4ID0gJWQiLAotICAgICAgICBidGFfaGhfY2Iua2Rldlt4eF0uYXR0cl9tYXNrLCBidGFfaGhfY2Iua2Rldlt4eF0uc3RhdGUsCi0gICAgICAgIGJ0YV9oaF9jYi5rZGV2W3h4XS5zdWJfY2xhc3MsIGJ0YV9oaF9jYi5rZGV2W3h4XS5pbmRleCk7Ci0gIH0KLSAgQVBQTF9UUkFDRV9ERUJVRygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7Ci19Ci0jZW5kaWYKLSNlbmRpZiAvKiBITF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2FnX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2FnX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWUwNmU3Li4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIGF1ZGlvIGdhdGV3YXkgKEFHKSBzdWJzeXN0ZW0KLSAqICBvZiBCVEEsIEJyb2FkY29tJ3MgQmx1ZXRvb3RoIGFwcGxpY2F0aW9uIGxheWVyIGZvciBtb2JpbGUgcGhvbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9BR19BUElfSAotI2RlZmluZSBCVEFfQUdfQVBJX0gKLQotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGFfaGZwX2FwaS5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE51bWJlciBvZiBTQ0JzIChBRyBzZXJ2aWNlIGluc3RhbmNlcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkKSAqLwotI2RlZmluZSBCVEFfQUdfTUFYX05VTV9DTElFTlRTIDYKLQotLyogQUcgZmVhdHVyZSBtYXNrcyAqLwotI2RlZmluZSBCVEFfQUdfRkVBVF8zV0FZIDB4MDAwMDAwMDEgICAvKiBUaHJlZS13YXkgY2FsbGluZyAqLwotI2RlZmluZSBCVEFfQUdfRkVBVF9FQ05SIDB4MDAwMDAwMDIgICAvKiBFY2hvIGNhbmNlbGxhdGlvbi9ub2lzZSByZWR1Y3Rpb24gKi8KLSNkZWZpbmUgQlRBX0FHX0ZFQVRfVlJFQyAweDAwMDAwMDA0ICAgLyogVm9pY2UgcmVjb2duaXRpb24gKi8KLSNkZWZpbmUgQlRBX0FHX0ZFQVRfSU5CQU5EIDB4MDAwMDAwMDggLyogSW4tYmFuZCByaW5nIHRvbmUgKi8KLSNkZWZpbmUgQlRBX0FHX0ZFQVRfVlRBRyAweDAwMDAwMDEwICAgLyogQXR0YWNoIGEgcGhvbmUgbnVtYmVyIHRvIGEgdm9pY2UgdGFnICovCi0jZGVmaW5lIEJUQV9BR19GRUFUX1JFSkVDVCAweDAwMDAwMDIwIC8qIEFiaWxpdHkgdG8gcmVqZWN0IGluY29taW5nIGNhbGwgKi8KLSNkZWZpbmUgQlRBX0FHX0ZFQVRfRUNTIDB4MDAwMDAwNDAgICAgLyogRW5oYW5jZWQgQ2FsbCBTdGF0dXMgKi8KLSNkZWZpbmUgQlRBX0FHX0ZFQVRfRUNDIDB4MDAwMDAwODAgICAgLyogRW5oYW5jZWQgQ2FsbCBDb250cm9sICovCi0jZGVmaW5lIEJUQV9BR19GRUFUX0VYVEVSUiAweDAwMDAwMTAwIC8qIEV4dGVuZGVkIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIEJUQV9BR19GRUFUX0NPREVDIDB4MDAwMDAyMDAgIC8qIENvZGVjIE5lZ290aWF0aW9uICovCi0KLS8qIEFHIFNEUCBmZWF0dXJlIG1hc2tzICovCi0jZGVmaW5lIEJUQV9BR19GRUFUX1dCU19TVVBQT1JUIDB4MDAyMCAvKiBTdXBwb3J0cyBXQlMgKi8KLQotLyogT25seSBTRFAgZmVhdHVyZSBiaXRzIDAgdG8gNCBtYXRjaGVzIEJSU0YgZmVhdHVyZSBiaXRzICovCi0jZGVmaW5lIEhGUF9TRFBfQlJTRl9GRUFUVVJFU19NQVNLIDB4MDAxRgotCi0vKiBWYWxpZCBmZWF0dXJlIGJpdCBtYXNrIGZvciBIRlAgMS42IChhbmQgYmVsb3cpICovCi0jZGVmaW5lIEhGUF8xXzZfRkVBVF9NQVNLIDB4MDAwMDAzRkYKLQotLyogSEZQIDEuNysgKi8KLSNkZWZpbmUgQlRBX0FHX0ZFQVRfSEZfSU5EIDB4MDAwMDA0MDAgLyogSEYgSW5kaWNhdG9ycyAqLwotI2RlZmluZSBCVEFfQUdfRkVBVF9FU0NPX1M0IDB4MDAwMDA4MDAgLyogZVNDTyBTNCBzZXR0aW5nIHN1cHBvcnRlZCAqLwotCi0vKiBQcm9wcmlldGFyeSBmZWF0dXJlczogdXNpbmcgMzEgfiAxNiBiaXRzICovCi0jZGVmaW5lIEJUQV9BR19GRUFUX0JUUkggMHgwMDAxMDAwMCAgICAvKiBDQ0FQIGluY29taW5nIGNhbGwgaG9sZCAqLwotI2RlZmluZSBCVEFfQUdfRkVBVF9VTkFUIDB4MDAwMjAwMDAgICAgLyogUGFzcyB1bmtub3duIEFUIGNvbW1hbmRzIHRvIGFwcCAqLwotI2RlZmluZSBCVEFfQUdfRkVBVF9OT1NDTyAweDAwMDQwMDAwICAgLyogTm8gU0NPIGNvbnRyb2wgcGVyZm9ybWVkIGJ5IEJUQSBBRyAqLwotI2RlZmluZSBCVEFfQUdfRkVBVF9OT19FU0NPIDB4MDAwODAwMDAgLyogRG8gbm90IGFsbG93IG9yIHVzZSBlU0NPICovCi0jZGVmaW5lIEJUQV9BR19GRUFUX1ZPSVAgMHgwMDEwMDAwMCAgICAvKiBWb0lQIGNhbGwgKi8KLQotdHlwZWRlZiB1aW50MzJfdCB0QlRBX0FHX0ZFQVQ7Ci0KLS8qIEFHIG9wZW4gc3RhdHVzICovCi0jZGVmaW5lIEJUQV9BR19TVUNDRVNTIDAgICAgICAgIC8qIENvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqLwotI2RlZmluZSBCVEFfQUdfRkFJTF9TRFAgMSAgICAgICAvKiBPcGVuIGZhaWxlZCBkdWUgdG8gU0RQICovCi0jZGVmaW5lIEJUQV9BR19GQUlMX1JGQ09NTSAyICAgIC8qIE9wZW4gZmFpbGVkIGR1ZSB0byBSRkNPTU0gKi8KLSNkZWZpbmUgQlRBX0FHX0ZBSUxfUkVTT1VSQ0VTIDMgLyogb3V0IG9mIHJlc291cmNlcyBmYWlsdXJlICovCi0KLS8qIFN0YXR1cyB0byBkaXNhbGxvdyBwYXNzaW5nIEFUIEV2ZW50cyBhZnRlciBCVElGICovCi0jZGVmaW5lIEJUQV9BR19ESVNBTExPV19BVCA1Ci0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FHX1NUQVRVUzsKLQotLyogaGFuZGxlIHZhbHVlcyB1c2VkIHdpdGggQlRBX0FnUmVzdWx0ICovCi0jZGVmaW5lIEJUQV9BR19IQU5ETEVfTk9ORSAwCi0jZGVmaW5lIEJUQV9BR19IQU5ETEVfQUxMIDB4RkZGRgotLyogSXQgaXMgc2FmZSB0byB1c2UgdGhlIHNhbWUgdmFsdWUgYXMgQlRBX0FHX0hBTkRMRV9BTEwKLSAqIEhBTkRMRV9BTEwgaXMgdXNlZCBmb3IgZGVsaXZlcmluZyBpbmRpY2F0aW9uCi0gKiBTQ09fTk9fQ0hBTkdFIGlzIHVzZWQgZm9yIGNoYW5naW5nIHNjbyBiZWhhdmlvcgotICogVGhleSBkb25vdCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyCi0gKi8KLQotLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBIRiBpbmRpY2F0b3JzLCB0aGVyZSBpcyBvbmUgSEYgaW5kaWNhdG9yIHNvIGZhciBpLmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlZCBkcml2ZXIgc3RhdHVzLiAqLwotLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBIRiBpbmRpY2F0b3JzLAotICAgMSBmb3IgRW5oYW5jZWQgU2FmZXR5IFN0YXR1cwotICAgMiBmb3IgQmF0dGVyeSBMZXZlbCBTdGF0dXMgKi8KLSNpZm5kZWYgQlRBX0FHX05VTV9MT0NBTF9IRl9JTkQKLSNkZWZpbmUgQlRBX0FHX05VTV9MT0NBTF9IRl9JTkQgMgotI2VuZGlmCi0KLSNkZWZpbmUgQlRBX0FHX0hBTkRMRV9TQ09fTk9fQ0hBTkdFIDB4RkZGRgotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIC8qIEFHIHJlc3VsdCBjb2RlcyB1c2VkIHdpdGggQlRBX0FnUmVzdWx0ICovCi0gIEJUQV9BR19TUEtfUkVTID0gMCwgICAgICAgICAvKiBVcGRhdGUgc3BlYWtlciB2b2x1bWUgKi8KLSAgQlRBX0FHX01JQ19SRVMgPSAxLCAgICAgICAgIC8qIFVwZGF0ZSBtaWNyb3Bob25lIHZvbHVtZSAqLwotICBCVEFfQUdfSU5CQU5EX1JJTkdfUkVTID0gMiwgLyogVXBkYXRlIGluYmFuZCByaW5nIHN0YXRlICovCi0gIEJUQV9BR19DSU5EX1JFUyA9IDMsICAgICAgICAvKiBTZW5kIGluZGljYXRvciByZXNwb25zZSBmb3IgQVQrQ0lORCAqLwotICBCVEFfQUdfQklOUF9SRVMgPSA0LCAgICAgICAgLyogU2VuZCBwaG9uZSBudW1iZXIgZm9yIHZvaWNlIHRhZyBmb3IgQVQrQklOUCAqLwotICBCVEFfQUdfSU5EX1JFUyA9IDUsICAgICAgICAgLyogVXBkYXRlIGFuIGluZGljYXRvciB2YWx1ZSAqLwotICBCVEFfQUdfQlZSQV9SRVMgPSA2LCAgICAgICAgLyogVXBkYXRlIHZvaWNlIHJlY29nbml0aW9uIHN0YXRlICovCi0gIEJUQV9BR19DTlVNX1JFUyA9IDcsICAgICAgICAvKiBTZW5kIHN1YnNjcmliZXIgbnVtYmVyIHJlc3BvbnNlIGZvciBBVCtDTlVNICovCi0gIEJUQV9BR19CVFJIX1JFUyA9IDgsICAgICAgICAvKiBTZW5kIENDQVAgaW5jb21pbmcgY2FsbCBob2xkICovCi0gIEJUQV9BR19DTENDX1JFUyA9IDksICAgICAgICAvKiBRdWVyeSBsaXN0IG9mIGNhbGxzICovCi0gIEJUQV9BR19DT1BTX1JFUyA9IDEwLCAgICAgICAvKiBSZWFkIG5ldHdvcmsgb3BlcmF0b3IgKi8KLSAgQlRBX0FHX0lOX0NBTExfUkVTID0gMTEsICAgIC8qIEluZGljYXRlIGluY29taW5nIHBob25lIGNhbGwgKi8KLSAgQlRBX0FHX0lOX0NBTExfQ09OTl9SRVMgPSAxMiwgIC8qIEluY29taW5nIHBob25lIGNhbGwgY29ubmVjdGVkICovCi0gIEJUQV9BR19DQUxMX1dBSVRfUkVTID0gMTMsICAgICAvKiBDYWxsIHdhaXRpbmcgbm90aWZpY2F0aW9uICovCi0gIEJUQV9BR19PVVRfQ0FMTF9PUklHX1JFUyA9IDE0LCAvKiBPdXRnb2luZyBwaG9uZSBjYWxsIG9yaWdpbmF0aW9uICovCi0KLSAgLyogT3V0Z29pbmcgcGhvbmUgY2FsbCBhbGVydGluZyByZW1vdGUgcGFydHkgKi8KLSAgQlRBX0FHX09VVF9DQUxMX0FMRVJUX1JFUyA9IDE1LAotICBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVMgPSAxNiwgLyogT3V0Z29pbmcgcGhvbmUgY2FsbCBjb25uZWN0ZWQgKi8KLQotICAvKiBJbmNvbWluZy9vdXRnb2luZyA9ICAzLC13YXkgY2FuY2VsZWQgYmVmb3JlIGNvbm5lY3RlZCAqLwotICBCVEFfQUdfQ0FMTF9DQU5DRUxfUkVTID0gMTcsCi0gIEJUQV9BR19FTkRfQ0FMTF9SRVMgPSAxOCwgICAgICAvKiBFbmQgY2FsbCAqLwotICBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUyA9IDE5LCAgLyogSW5jb21pbmcgY2FsbCBoZWxkICovCi0gIEJUQV9BR19VTkFUX1JFUyA9IDIwLCAgICAgICAgICAvKiBSZXNwb25zZSB0byB1bmtub3duIEFUIGNvbW1hbmQgZXZlbnQgKi8KLSAgQlRBX0FHX01VTFRJX0NBTExfUkVTID0gMjEsICAgIC8qIFNMQyBhdCB0aHJlZSB3YXkgY2FsbCAqLwotICBCVEFfQUdfQklORF9SRVMgPSAyMiwgICAgICAgICAgLyogQWN0aXZhdGUvRGVhY3RpdmF0ZSBIRiBpbmRpY2F0b3IgKi8KLSAgQlRBX0FHX0lORF9SRVNfT05fREVNQU5EID0gMzMsIC8qIFVwZGF0ZSBhbiBpbmRpY2F0b3IgdmFsdWUgZm9yY2libGUgKi8KLSAgQlRBX0FHX1VOS05PV04gPSAweGZmLCAgICAgICAgIC8vIFNob3VsZCBiZSB1bnNldAotfSB0QlRBX0FHX1JFUzsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGJ0YV9hZ19yZXN1bHRfdGV4dChjb25zdCB0QlRBX0FHX1JFUyYgcmVzdWx0KSB7Ci0gIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfU1BLX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfTUlDX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfSU5CQU5EX1JJTkdfUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9BR19DSU5EX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfQklOUF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX0lORF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX0JWUkFfUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9BR19DTlVNX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfQlRSSF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX0NMQ0NfUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9BR19DT1BTX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfSU5fQ0FMTF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX0lOX0NBTExfQ09OTl9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX0NBTExfV0FJVF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9BR19PVVRfQ0FMTF9BTEVSVF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX09VVF9DQUxMX0NPTk5fUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9BR19DQUxMX0NBTkNFTF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX0VORF9DQUxMX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfVU5BVF9SRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX01VTFRJX0NBTExfUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9BR19CSU5EX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQUdfSU5EX1JFU19PTl9ERU1BTkQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0FHX1VOS05PV04pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV04iKTsKLSAgfQotfQotCi0vKiBIRlAgcGVlciBmZWF0dXJlcyAqLwotI2RlZmluZSBCVEFfQUdfUEVFUl9GRUFUX0VDTlIgMHgwMDAxICAgLyogRWNobyBjYW5jZWxsYXRpb24vbm9pc2UgcmVkdWN0aW9uICovCi0jZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfM1dBWSAweDAwMDIgICAvKiBDYWxsIHdhaXRpbmcgYW5kIHRocmVlLXdheSBjYWxsaW5nICovCi0jZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfQ0xJIDB4MDAwNCAgICAvKiBDYWxsZXIgSUQgcHJlc2VudGF0aW9uIGNhcGFiaWxpdHkgKi8KLSNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9WUkVDIDB4MDAwOCAgIC8qIFZvaWNlIHJlY29nbml0aW9uIGFjdGl2YXRpb24gKi8KLSNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9WT0wgMHgwMDEwICAgIC8qIFJlbW90ZSB2b2x1bWUgY29udHJvbCAqLwotI2RlZmluZSBCVEFfQUdfUEVFUl9GRUFUX0VDUyAweDAwMjAgICAgLyogRW5oYW5jZWQgQ2FsbCBTdGF0dXMgKi8KLSNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9FQ0MgMHgwMDQwICAgIC8qIEVuaGFuY2VkIENhbGwgQ29udHJvbCAqLwotI2RlZmluZSBCVEFfQUdfUEVFUl9GRUFUX0NPREVDIDB4MDA4MCAgLyogQ29kZWMgTmVnb3RpYXRpb24gKi8KLSNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9IRl9JTkQgMHgwMTAwIC8qIEhGIEluZGljYXRvcnMgKi8KLSNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9FU0NPX1M0IDB4MDIwMCAvKiBlU0NPIFM0IHNldHRpbmcgc3VwcG9ydGVkICovCi0KLS8qIFByb3ByaWV0YXJ5IGZlYXR1cmVzOiB1c2luZyBiaXRzIGFmdGVyIDEyICovCi0KLS8qIFBhc3MgdW5rbm93biBBVCBjb21tYW5kIHJlc3BvbnNlcyB0byBhcHBsaWNhdGlvbiAqLwotI2RlZmluZSBCVEFfQUdfUEVFUl9GRUFUX1VOQVQgMHgxMDAwCi0jZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfVk9JUCAweDIwMDAgLyogVm9JUCBjYWxsICovCi0KLXR5cGVkZWYgdWludDE2X3QgdEJUQV9BR19QRUVSX0ZFQVQ7Ci0KLS8qIEhGUCBwZWVyIHN1cHBvcnRlZCBjb2RlYyBtYXNrcyAqLwotdHlwZWRlZiB1aW50MTZfdCB0QlRBX0FHX1BFRVJfQ09ERUM7Ci0KLS8qIEhGUCBlcnJjb2RlIC0gU2V0IHdoZW4gQlRBX0FHX09LX0VSUk9SIGlzIHJldHVybmVkIGluICdva19mbGFnJyAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1BIT05FX0ZBSUxVUkUgMCAgICAgLyogUGhvbmUgRmFpbHVyZSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX05PX0NPTk5fUEhPTkUgMSAgICAgLyogTm8gY29ubmVjdGlvbiB0byBwaG9uZSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX09QX05PVF9BTExPV0VEIDMgICAgLyogT3BlcmF0aW9uIG5vdCBhbGxvd2VkICovCi0jZGVmaW5lIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCA0ICAvKiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1BIU0lNX1BJTl9SRVEgNSAgICAgLyogUEgtU0lNIFBJTiByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9OT1RfSU5TRVJURUQgMTAgLyogU0lNIG5vdCBpbnNlcnRlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9QSU5fUkVRIDExICAgICAgLyogU0lNIFBJTiByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9QVUtfUkVRIDEyICAgICAgLyogU0lNIFBVSyByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9GQUlMVVJFIDEzICAgICAgLyogU0lNIGZhaWx1cmUgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9TSU1fQlVTWSAxNCAgICAgICAgIC8qIFNJTSBidXN5ICovCi0jZGVmaW5lIEJUQV9BR19FUlJfSU5DT1JSRUNUX1BXRCAxNiAgICAvKiBJbmNvcnJlY3QgcGFzc3dvcmQgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9TSU1fUElOMl9SRVEgMTcgICAgIC8qIFNJTSBQSU4yIHJlcXVpcmVkICovCi0jZGVmaW5lIEJUQV9BR19FUlJfU0lNX1BVSzJfUkVRIDE4ICAgICAvKiBTSU0gUFVLMiByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX01FTU9SWV9GVUxMIDIwICAgICAgLyogTWVtb3J5IGZ1bGwgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9JTlZBTElEX0lOREVYIDIxICAgIC8qIEludmFsaWQgaW5kZXggKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9NRU1PUllfRkFJTFVSRSAyMyAgIC8qIE1lbW9yeSBmYWlsdXJlICovCi0jZGVmaW5lIEJUQV9BR19FUlJfVEVYVF9UT09fTE9ORyAyNCAgICAvKiBUZXh0IHN0cmluZyB0b28gbG9uZyAqLwotI2RlZmluZSBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX1RTVFIgMjUgLyogSW52YWxpZCBjaGFyYWN0ZXJzIGluIHRleHQgc3RyaW5nICovCi0jZGVmaW5lIEJUQV9BR19FUlJfRFNUUl9UT09fTE9ORyAyNiAgICAvKiBEaWFsIHN0cmluZyB0b28gbG9uZyAqLwotI2RlZmluZSBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX0RTVFIgMjcgLyogSW52YWxpZCBjaGFyYWN0ZXJzIGluIGRpYWwgc3RyaW5nICovCi0jZGVmaW5lIEJUQV9BR19FUlJfTk9fTkVUV09SS19TRVJWIDMwICAvKiBObyBuZXR3b3JrIHNlcnZpY2UgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9ORVRXT1JLX1RJTUVfT1VUIDMxIC8qIE5ldHdvcmsgdGltZW91dCAqLwotLyogTmV0d29yayBub3QgYWxsb3dlZCAtIGVtZXJnZW5jeSBzZXJ2aWNlIG9ubHkgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9OT19ORVRfRU1HX09OTFkgMzIKLS8qIEFHIGNhbm5vdCBjcmVhdGUgc2ltdWx0YW5lb3VzIFZvSVAgYW5kIENTIGNhbGxzICovCi0jZGVmaW5lIEJUQV9BR19FUlJfVk9JUF9DU19DQUxMUyAzMwotI2RlZmluZSBCVEFfQUdfRVJSX05PVF9GT1JfVk9JUCAzNCAgLyogTm90IHN1cHBvcnRlZCBvbiB0aGlzIGNhbGwgdHlwZShWb0lQKSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1NJUF9SRVNQX0NPREUgMzUgLyogU0lQIDMgZGlnaXQgcmVzcG9uc2UgY29kZSAqLwotCi0jaWYgMCAvKiBOb3QgVXNlZCBpbiBCbHVldG9vdGggSEZQIDEuNSBTcGVjaWZpY2F0aW9uICovCi0jZGVmaW5lIEJUQV9BR19FUlJfUEhBREFQX0xOS19SRVMgMiAgIC8qIFBob25lLWFkYXB0ZXIgbGluayByZXNlcnZlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1BIRlNJTV9QSU5fUkVRIDYgICAvKiBQSC1GU0lNIFBJTiByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1BIRlNJTV9QVUtfUkVRIDcgICAvKiBQSC1GU0lNIFBVSyByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9XUk9ORyAxNSAgICAgICAvKiBTSU0gd3JvbmcgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9OT1RfRk9VTkQgMjIgICAgICAgLyogTm90IGZvdW5kICovCi0jZGVmaW5lIEJUQV9BR19FUlJfTkVUV09SS19USU1FT1VUIDMxIC8qIE5ldHdvcmsgdGltZW91dCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX05FVF9QSU5fUkVRIDQwICAgICAvKiBOZXR3b3JrIHBlcnNvbmFsaXphdGlvbiBQSU4gcmVxdWlyZWQgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9ORVRfUFVLX1JFUSA0MSAgICAgLyogTmV0d29yayBwZXJzb25hbGl6YXRpb24gUFVLIHJlcXVpcmVkICovCi0vKiBOZXR3b3JrIHN1YnNldCBwZXJzb25hbGl6YXRpb24gUElOIHJlcXVpcmVkICovCi0jZGVmaW5lIEJUQV9BR19FUlJfU1VCU0VUX1BJTl9SRVEgNDIKLS8qIE5ldHdvcmsgc3Vic2V0IHBlcnNvbmFsaXphdGlvbiBQVUsgcmVxdWlyZWQgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9TVUJTRVRfUFVLX1JFUSA0MwotLyogU2VydmljZSBwcm92aWRlciBwZXJzb25hbGl6YXRpb24gUElOIHJlcXVpcmVkICovCi0jZGVmaW5lIEJUQV9BR19FUlJfU0VSVlBST19QSU5fUkVRIDQ0Ci0vKiBTZXJ2aWNlIHByb3ZpZGVyIHBlcnNvbmFsaXphdGlvbiBQVUsgcmVxdWlyZWQgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9TRVJWUFJPX1BVS19SRVEgNDUKLS8qIENvcnBvcmF0ZSBwZXJzb25hbGl6YXRpb24gUElOIHJlcXVpcmVkICovCi0jZGVmaW5lIEJUQV9BR19FUlJfQ09SUF9QSU5fUkVRIDQ2Ci0vKiBDb3Jwb3JhdGUgcGVyc29uYWxpemF0aW9uIFBVSyByZXF1aXJlZCAqLwotI2RlZmluZSBCVEFfQUdfRVJSX0NPUlBfUFVLX1JFUSA0NwotI2RlZmluZSBCVEFfQUdfRVJSX1VOS05PV04gMTAwIC8qIFVua25vd24gZXJyb3IgKi8KLQotLyogR1BSUy1yZWxhdGVkIGVycm9ycyAqLwotI2RlZmluZSBCVEFfQUdfRVJSX0lMTF9NUyAxMDMgIC8qIElsbGVnYWwgTVMgKCMzKSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX0lMTF9NRSAxMDYgIC8qIElsbGVnYWwgTUUgKCM2KSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX0dQUlNfTk9UX0FMTE9XRUQgMTA3IC8qIEdQUlMgc2VydmljZXMgbm90IGFsbG93ZWQgKCM3KSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1BMTU5fTk9UX0FMTE9XRUQgMTExIC8qIFBMTU4gc2VydmljZXMgbm90IGFsbG93ZWQgKCMxMSkgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9MT0NfTk9UX0FMTE9XRUQgMTEyICAvKiBMb2NhdGlvbiBhcmVhIG5vdCBhbGxvd2VkICgjMTIpICovCi0vKiBSb2FtaW5nIG5vdCBhbGxvd2VkIGluIHRoaXMgbG9jYXRpb24gYXJlYSAoIzEzKSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX1JPQU1fTk9UX0FMTE9XRUQgMTEzCi0vKiBFcnJvcnMgcmVsYXRlZCB0byBhIGZhaWx1cmUgdG8gQWN0aXZhdGUgYSBDb250ZXh0ICovCi0jZGVmaW5lIEJUQV9BR19FUlJfT1BUX05PVF9TVVBQIDEzMiAvKiBTZXJ2aWNlIG9wdGlvbiBub3Qgc3VwcG9ydGVkICgjMzIpICovCi0vKiBSZXF1ZXN0ZWQgc2VydmljZSBvcHRpb24gbm90IHN1YnNjcmliZWQgKCMzMykgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9PUFRfTk9UX1NVQlNDUiAxMzMKLS8qIFNlcnZpY2Ugb3B0aW9uIHRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAoIzM0KSAqLwotI2RlZmluZSBCVEFfQUdfRVJSX09QVF9PVVRfT0ZfT1JERVIgMTM0Ci0jZGVmaW5lIEJUQV9BR19FUlJfUERQX0FVVEhfRkFJTFVSRSAxNDkgLyogUERQIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgKi8KLS8qIE90aGVyIEdQUlMgZXJyb3JzICovCi0jZGVmaW5lIEJUQV9BR19FUlJfSU5WX01PQklMRV9DTEFTUyAxNTAgLyogSW52YWxpZCBtb2JpbGUgY2xhc3MgKi8KLSNkZWZpbmUgQlRBX0FHX0VSUl9VTlNQRUNfR1BSU19FUlIgMTQ4ICAvKiBVbnNwZWNpZmllZCBHUFJTIGVycm9yICovCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW51c2VkIGVycm9yIGNvZGVzICovCi0KLS8qIEhGUCByZXN1bHQgZGF0YSAnb2tfZmxhZycgKi8KLSNkZWZpbmUgQlRBX0FHX09LX0NPTlRJTlVFIDAgLyogU2VuZCBvdXQgcmVzcG9uc2UgKG1vcmUgcmVzcG9uc2VzIGNvbWluZykgKi8KLSNkZWZpbmUgQlRBX0FHX09LX0RPTkUgMSAgICAgLyogU2VuZCBvdXQgcmVzcG9uc2UgZm9sbG93ZWQgYnkgT0sgKGZpbmlzaGVkKSAqLwotI2RlZmluZSBCVEFfQUdfT0tfRVJST1IgMiAgICAvKiBFcnJvciByZXNwb25zZSAqLwotCi0vKiBCVFJIIHZhbHVlcyAqLwotI2RlZmluZSBCVEFfQUdfQlRSSF9TRVRfSE9MRCAwIC8qIFB1dCBpbmNvbWluZyBjYWxsIG9uIGhvbGQgKi8KLSNkZWZpbmUgQlRBX0FHX0JUUkhfU0VUX0FDQyAxICAvKiBBY2NlcHQgaW5jb21pbmcgY2FsbCBvbiBob2xkICovCi0jZGVmaW5lIEJUQV9BR19CVFJIX1NFVF9SRUogMiAgLyogUmVqZWN0IGluY29taW5nIGNhbGwgb24gaG9sZCAqLwotI2RlZmluZSBCVEFfQUdfQlRSSF9SRUFEIDMgICAgIC8qIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgKi8KLSNkZWZpbmUgQlRBX0FHX0JUUkhfTk9fUkVTUCA0ICAvKiBOb3QgaW4gUkggU3RhdGVzIChyZXBseSB0byByZWFkKSAqLwotCi0vKiBjbGlwIHR5cGUgY29uc3RhbnRzICovCi0jZGVmaW5lIEJUQV9BR19DTElQX1RZUEVfTUlOIDEyOAotI2RlZmluZSBCVEFfQUdfQ0xJUF9UWVBFX01BWCAxNzUKLSNkZWZpbmUgQlRBX0FHX0NMSVBfVFlQRV9ERUZBVUxUIDEyOQotI2RlZmluZSBCVEFfQUdfQ0xJUF9UWVBFX1ZPSVAgMjU1Ci0KLS8qIEFTQ0lJIGNoYXJhY3RlciBzdHJpbmcgb2YgYXJndW1lbnRzIHRvIHRoZSBBVCBjb21tYW5kIG9yIHJlc3VsdCAqLwotI2lmbmRlZiBCVEFfQUdfQVRfTUFYX0xFTgotI2RlZmluZSBCVEFfQUdfQVRfTUFYX0xFTiAyNTYKLSNlbmRpZgotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQUdfSU5EX1JFUyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBpZDsKLSAgdWludDE2X3QgdmFsdWU7Ci0gIGJvb2wgb25fZGVtYW5kOwotfSB0QlRBX0FHX0lORDsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfQWdSZXN1bHQoKSAqLwotc3RydWN0IHRCVEFfQUdfUkVTX0RBVEEgewotICBjaGFyIHN0cltCVEFfQUdfQVRfTUFYX0xFTiArIDFdOwotICB0QlRBX0FHX0lORCBpbmQ7Ci0gIHVpbnQxNl90IG51bTsKLSAgdWludDE2X3QgYXVkaW9faGFuZGxlOwotICB1aW50MTZfdCBlcnJjb2RlOyAvKiBWYWxpZCBvbmx5IGlmICdva19mbGFnJyBpcyBzZXQgdG8gQlRBX0FHX09LX0VSUk9SICovCi0gIHVpbnQ4X3QKLSAgICAgIG9rX2ZsYWc7IC8qIEluZGljYXRlcyBpZiByZXNwb25zZSBpcyBmaW5pc2hlZCwgYW5kIGlmIGVycm9yIG9jY3VycmVkICovCi0gIGJvb2wgc3RhdGU7Ci0gIHN0YXRpYyBjb25zdCB0QlRBX0FHX1JFU19EQVRBIGtFbXB0eTsKLX07Ci0KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICAvKiBBRyBjYWxsYmFjayBldmVudHMgKi8KLSAgQlRBX0FHX0VOQUJMRV9FVlQgPSAwLCAgICAgIC8qIEFHIGVuYWJsZWQgKi8KLSAgQlRBX0FHX1JFR0lTVEVSX0VWVCA9IDEsICAgIC8qIEFHIHJlZ2lzdGVyZWQgKi8KLSAgQlRBX0FHX09QRU5fRVZUID0gMiwgICAgICAgIC8qIEFHIGNvbm5lY3Rpb24gb3BlbiAqLwotICBCVEFfQUdfQ0xPU0VfRVZUID0gMywgICAgICAgLyogQUcgY29ubmVjdGlvbiBjbG9zZWQgKi8KLSAgQlRBX0FHX0NPTk5fRVZUID0gNCwgICAgICAgIC8qIFNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiBvcGVuZWQgKi8KLSAgQlRBX0FHX0FVRElPX09QRU5fRVZUID0gNSwgIC8qIEF1ZGlvIGNvbm5lY3Rpb24gb3BlbiAqLwotICBCVEFfQUdfQVVESU9fQ0xPU0VfRVZUID0gNiwgLyogQXVkaW8gY29ubmVjdGlvbiBjbG9zZWQgKi8KLSAgQlRBX0FHX1NQS19FVlQgPSA3LCAgICAgICAgIC8qIFNwZWFrZXIgdm9sdW1lIGNoYW5nZWQgKi8KLSAgQlRBX0FHX01JQ19FVlQgPSA4LCAgICAgICAgIC8qIE1pY3JvcGhvbmUgdm9sdW1lIGNoYW5nZWQgKi8KLSAgQlRBX0FHX0FUX0NLUERfRVZUID0gOSwgICAgIC8qIENLUEQgZnJvbSB0aGUgSFMgKi8KLSAgQlRBX0FHX0RJU0FCTEVfRVZUID0gMzAsICAgIC8qIEFHIGRpc2FibGVkICovCi0gIEJUQV9BR19XQlNfRVZUID0gMzEsICAgICAgICAvKiBTQ08gY29kZWMgaW5mbyAqLwotICAvKiBWYWx1ZXMgYmVsb3cgYXJlIGZvciBIRlAgb25seSAqLwotICBCVEFfQUdfQVRfQV9FVlQgPSAxMCwgICAgLyogQW5zd2VyIGEgY2FsbCAqLwotICBCVEFfQUdfQVRfRF9FVlQgPSAxMSwgICAgLyogUGxhY2UgYSBjYWxsIHVzaW5nIG51bWJlciBvciBtZW1vcnkgZGlhbCAqLwotICBCVEFfQUdfQVRfQ0hMRF9FVlQgPSAxMiwgLyogQ2FsbCBob2xkICovCi0gIEJUQV9BR19BVF9DSFVQX0VWVCA9IDEzLCAvKiBIYW5nIHVwIGEgY2FsbCAqLwotICBCVEFfQUdfQVRfQ0lORF9FVlQgPSAxNCwgLyogUmVhZCBpbmRpY2F0b3Igc2V0dGluZ3MgKi8KLSAgQlRBX0FHX0FUX1ZUU19FVlQgPSAxNSwgIC8qIFRyYW5zbWl0IERUTUYgdG9uZSAqLwotICBCVEFfQUdfQVRfQklOUF9FVlQgPSAxNiwgLyogUmV0cmlldmUgbnVtYmVyIGZyb20gdm9pY2UgdGFnICovCi0gIEJUQV9BR19BVF9CTEROX0VWVCA9IDE3LCAvKiBQbGFjZSBjYWxsIHRvIGxhc3QgZGlhbGVkIG51bWJlciAqLwotICBCVEFfQUdfQVRfQlZSQV9FVlQgPSAxOCwgLyogRW5hYmxlL2Rpc2FibGUgdm9pY2UgcmVjb2duaXRpb24gKi8KLSAgQlRBX0FHX0FUX05SRUNfRVZUID0gMTksIC8qIERpc2FibGUgZWNobyBjYW5jZWxpbmcgKi8KLSAgQlRBX0FHX0FUX0NOVU1fRVZUID0gMjAsIC8qIFJldHJpZXZlIHN1YnNjcmliZXIgbnVtYmVyICovCi0gIEJUQV9BR19BVF9CVFJIX0VWVCA9IDIxLCAvKiBDQ0FQLXN0eWxlIGluY29taW5nIGNhbGwgaG9sZCAqLwotICBCVEFfQUdfQVRfQ0xDQ19FVlQgPSAyMiwgLyogUXVlcnkgbGlzdCBvZiBjdXJyZW50IGNhbGxzICovCi0gIEJUQV9BR19BVF9DT1BTX0VWVCA9IDIzLCAvKiBRdWVyeSBsaXN0IG9mIGN1cnJlbnQgY2FsbHMgKi8KLSAgQlRBX0FHX0FUX1VOQVRfRVZUID0gMjQsIC8qIFVua25vd24gQVQgY29tbWFuZCAqLwotICBCVEFfQUdfQVRfQ0JDX0VWVCA9IDI1LCAgLyogQmF0dGVyeSBMZXZlbCByZXBvcnQgZnJvbSBIRiAqLwotICBCVEFfQUdfQVRfQkFDX0VWVCA9IDI2LCAgLyogYXZhYmxhYmxlIGNvZGVjICovCi0gIEJUQV9BR19BVF9CQ1NfRVZUID0gMjcsICAvKiBDb2RlYyBzZWxlY3QgKi8KLSAgQlRBX0FHX0FUX0JJTkRfRVZUID0gMjgsIC8qIEhGIGluZGljYXRvciAqLwotICBCVEFfQUdfQVRfQklFVl9FVlQgPSAyOSwgLyogSEYgaW5kaWNhdG9yIHVwZGF0ZXMgZnJvbSBwZWVyICovCi0gIEJUQV9BR19BVF9CSUFfRVZUID0gMzIsICAvKiBBRyBpbmRpY2F0b3IgYWN0aXZhdGlvbiBldmVudCBmcm9tIHBlZXIgKi8KLX0gdEJUQV9BR19FVlQ7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG1vc3Qgbm9uLUFUIGV2ZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQ4X3QgYXBwX2lkOwotICB0QlRBX0FHX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfQUdfSERSOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQUdfUkVHSVNURVJfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfQUdfSERSIGhkcjsKLSAgdEJUQV9BR19TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0FHX1JFR0lTVEVSOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQUdfT1BFTl9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BR19IRFIgaGRyOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVEFfU0VSVklDRV9JRCBzZXJ2aWNlX2lkOwotICB0QlRBX0FHX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfQUdfT1BFTjsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FHX0NMT1NFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0FHX0hEUiBoZHI7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLX0gdEJUQV9BR19DTE9TRTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FHX0NPTk5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfQUdfSERSIGhkcjsKLSAgdEJUQV9BR19QRUVSX0ZFQVQgcGVlcl9mZWF0OwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVEFfQUdfUEVFUl9DT0RFQyBwZWVyX2NvZGVjOwotfSB0QlRBX0FHX0NPTk47Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFUIGNvbW1hbmQgZXZlbnQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BR19IRFIgaGRyOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGNoYXIgc3RyW0JUQV9BR19BVF9NQVhfTEVOICsgMV07Ci0gIHVpbnQzMl90IG51bTsKLSAgdWludDhfdCBpZHg7ICAgLyogY2FsbCBudW1iZXIgdXNlZCBieSBDTENDIGFuZCBDSExEICovCi0gIHVpbnQxNl90IGxpZHg7IC8qIGxvbmcgaW5kZXgsIGV4LCBIRiBpbmRpY2F0b3IgKi8KLX0gdEJUQV9BR19WQUw7Ci0KLS8qIHVuaW9uIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFHIGNhbGxiYWNrICovCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUQV9BR19IRFIgaGRyOwotICB0QlRBX0FHX1JFR0lTVEVSIHJlZzsKLSAgdEJUQV9BR19PUEVOIG9wZW47Ci0gIHRCVEFfQUdfQ0xPU0UgY2xvc2U7Ci0gIHRCVEFfQUdfQ09OTiBjb25uOwotICB0QlRBX0FHX1ZBTCB2YWw7Ci19IHRCVEFfQUc7Ci0KLS8qIEFHIGNhbGxiYWNrICovCi10eXBlZGVmIHZvaWQodEJUQV9BR19DQkFDSykodEJUQV9BR19FVlQgZXZlbnQsIHRCVEFfQUcqIHBfZGF0YSk7Ci0KLS8qIGluZGljYXRvciBjb25zdGFudHMgSEZQIDEuMSBhbmQgbGF0ZXIgKi8KLSNkZWZpbmUgQlRBX0FHX0lORF9DQUxMIDEgICAgICAvKiBwb3NpdGlvbiBvZiBjYWxsIGluZGljYXRvciAqLwotI2RlZmluZSBCVEFfQUdfSU5EX0NBTExTRVRVUCAyIC8qIHBvc2l0aW9uIG9mIGNhbGxzZXR1cCBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgQlRBX0FHX0lORF9TRVJWSUNFIDMgICAvKiBwb3NpdGlvbiBvZiBzZXJ2aWNlIGluZGljYXRvciAqLwotCi0vKiBpbmRpY2F0b3IgY29uc3RhbnRzIEhGUCAxLjUgYW5kIGxhdGVyICovCi0jZGVmaW5lIEJUQV9BR19JTkRfU0lHTkFMIDQgICAvKiBwb3NpdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9yICovCi0jZGVmaW5lIEJUQV9BR19JTkRfUk9BTSA1ICAgICAvKiBwb3NpdGlvbiBvZiByb2FtaW5nIGluZGljYXRvciAqLwotI2RlZmluZSBCVEFfQUdfSU5EX0JBVFRDSEcgNiAgLyogcG9zaXRpb24gb2YgYmF0dGVyeSBjaGFyZ2UgaW5kaWNhdG9yICovCi0jZGVmaW5lIEJUQV9BR19JTkRfQ0FMTEhFTEQgNyAvKiBwb3NpdGlvbiBvZiBjYWxsaGVsZCBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgQlRBX0FHX0lORF9CRUFSRVIgOCAgIC8qIHBvc2l0aW9uIG9mIGJlYXJlciBpbmRpY2F0b3IgKi8KLQotLyogY2FsbCBpbmRpY2F0b3IgdmFsdWVzICovCi0jZGVmaW5lIEJUQV9BR19DQUxMX0lOQUNUSVZFIDAgLyogUGhvbmUgY2FsbCBpbmFjdGl2ZSAqLwotI2RlZmluZSBCVEFfQUdfQ0FMTF9BQ1RJVkUgMSAgIC8qIFBob25lIGNhbGwgYWN0aXZlICovCi0KLS8qIGNhbGxzZXR1cCBpbmRpY2F0b3IgdmFsdWVzICovCi0jZGVmaW5lIEJUQV9BR19DQUxMU0VUVVBfTk9ORSAwICAgICAvKiBOb3QgY3VycmVudGx5IGluIGNhbGwgc2V0IHVwICovCi0jZGVmaW5lIEJUQV9BR19DQUxMU0VUVVBfSU5DT01JTkcgMSAvKiBJbmNvbWluZyBjYWxsIHByb2Nlc3Mgb25nb2luZyAqLwotI2RlZmluZSBCVEFfQUdfQ0FMTFNFVFVQX09VVEdPSU5HIDIgLyogT3V0Z29pbmcgY2FsbCBzZXQgdXAgaXMgb25nb2luZyAqLwotLyogUmVtb3RlIHBhcnR5IGJlaW5nIGFsZXJ0ZWQgaW4gYW4gb3V0Z29pbmcgY2FsbCAqLwotI2RlZmluZSBCVEFfQUdfQ0FMTFNFVFVQX0FMRVJUSU5HIDMKLQotLyogc2VydmljZSBpbmRpY2F0b3IgdmFsdWVzICovCi0jZGVmaW5lIEJUQV9BR19TRVJWSUNFX05PTkUgMCAgICAvKiBOZWl0aGVyIENTIG5vciBWb0lQIHNlcnZpY2UgaXMgYXZhaWxhYmxlICovCi0jZGVmaW5lIEJUQV9BR19TRVJWSUNFX0NTIDEgICAgICAvKiBPbmx5IENTIHNlcnZpY2UgaXMgYXZhaWxhYmxlICovCi0jZGVmaW5lIEJUQV9BR19TRVJWSUNFX1ZPSVAgMiAgICAvKiBPbmx5IFZvSVAgc2VydmljZSBpcyBhdmFpbGFibGUgKi8KLSNkZWZpbmUgQlRBX0FHX1NFUlZJQ0VfQ1NfVk9JUCAzIC8qIEJvdGggQ1MgYW5kIFZvSVAgc2VydmljZXMgYXZhaWxhYmxlICovCi0KLS8qIGNhbGxoZWxkIGluZGljYXRvciB2YWx1ZXMgKi8KLSNkZWZpbmUgQlRBX0FHX0NBTExIRUxEX0lOQUNUSVZFIDAgLyogTm8gaGVsZCBjYWxscyAqLwotI2RlZmluZSBCVEFfQUdfQ0FMTEhFTERfQUNUSVZFIDEgICAvKiBDYWxsIGhlbGQgYW5kIGNhbGwgYWN0aXZlICovCi0jZGVmaW5lIEJUQV9BR19DQUxMSEVMRF9OT0FDVElWRSAyIC8qIENhbGwgaGVsZCBhbmQgbm8gY2FsbCBhY3RpdmUgKi8KLQotLyogc2lnbmFsIHN0cmVuZ3RoIGluZGljYXRvciB2YWx1ZXMgKi8KLSNkZWZpbmUgQlRBX0FHX1JPQU1JTkdfSU5BQ1RJVkUgMCAvKiBQaG9uZSBjYWxsIGluYWN0aXZlICovCi0jZGVmaW5lIEJUQV9BR19ST0FNSU5HX0FDVElWRSAxICAgLyogUGhvbmUgY2FsbCBhY3RpdmUgKi8KLQotLyogYmVhcmVyIGluZGljYXRvciB2YWx1ZXMgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9XTEFOIDAgICAgICAvKiBXTEFOICAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9CTFVFVE9PVEggMSAvKiBCbHVldG9vdGggICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9XSVJFRCAyICAgICAvKiBXaXJlZCAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl8yRzNHIDMgICAgICAvKiAyRyAzRyAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9XSU1BWCA0ICAgICAvKiBXSU1BWCAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9SRVMxIDUgICAgICAvKiBSZXNlcnZlZCAgICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9SRVMyIDYgICAgICAvKiBSZXNlcnZlZCAgICAgKi8KLSNkZWZpbmUgQlRBX0FHX0JFQVJFUl9SRVMzIDcgICAgICAvKiBSZXNlcnZlZCAgICAgKi8KLQotLyogdHlwZSBmb3IgSEYgaW5kaWNhdG9yICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGluZF9pZDsKLSAgYm9vbCBpc19zdXBwb3J0ZWQ7Ci0gIGJvb2wgaXNfZW5hYmxlOwotICB1aW50MzJfdCBpbmRfbWluX3ZhbDsKLSAgdWludDMyX3QgaW5kX21heF92YWw7Ci19IHRCVEFfQUdfSEZfSU5EOwotCi0vKiBBRyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiBjaW5kX2luZm87Ci0gIGNvbnN0IGNoYXIqIGJpbmRfaW5mbzsKLSAgdWludDhfdCBudW1fbG9jYWxfaGZfaW5kOwotICBpbnQzMl90IGNvbm5fdG91dDsKLSAgdWludDE2X3Qgc2NvX3BrdF90eXBlczsKLSAgY29uc3QgY2hhciogY2hsZF92YWxfZWNjOwotICBjb25zdCBjaGFyKiBjaGxkX3ZhbDsKLX0gdEJUQV9BR19DRkc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdFbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZSB0aGUgYXVkaW8gZ2F0ZXdheSBzZXJ2aWNlLiBXaGVuIHRoZSBlbmFibGUKLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0FHX0VOQUJMRV9FVlQuIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGZ1bmN0aW9uIGluIHRoZSBBRyBBUEkgYXJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TVUNDRVNTIGlmIE9LLCBCVEFfRkFJTFVSRSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfU1RBVFVTIEJUQV9BZ0VuYWJsZSh0QlRBX0FHX0NCQUNLKiBwX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGUgdGhlIGF1ZGlvIGdhdGV3YXkgc2VydmljZQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdEaXNhYmxlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXIgYW4gQXVkaW8gR2F0ZXdheSBzZXJ2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdSZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywgdEJUQV9BR19GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHNlcnZpY2VfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlcmVnaXN0ZXIgYW4gYXVkaW8gZ2F0ZXdheSBzZXJ2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdEZXJlZ2lzdGVyKHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVucyBhIGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0IG9yIGhhbmRzLWZyZWUgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBXaGVuIGNvbm5lY3Rpb24gaXMgb3BlbiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIEJUQV9BR19PUEVOX0VWVC4gT25seSB0aGUgZGF0YSBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5lZC4gVGhlIGF1ZGlvIGNvbm5lY3Rpb24gaXMgbm90IG9wZW5lZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0FnT3Blbih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0IG9yIGEgaGFuZHNmcmVlCi0gKiAgICAgICAgICAgICAgICAgIEFueSBjdXJyZW50IGF1ZGlvIGNvbm5lY3Rpb24gd2lsbCBhbHNvIGJlIGNsb3NlZAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdDbG9zZSh1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQXVkaW9PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVucyBhbiBhdWRpbyBjb25uZWN0aW9uIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIGhlYWRzZXQgb3IgaG5hZHNmcmVlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BZ0F1ZGlvT3Blbih1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQXVkaW9DbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgYXVkaW8gY29ubmVjdGlvbiB0byBhIGhlYWRzZXQKLSAqICAgICAgICAgICAgICAgICAgb3IgaG5hZHNmcmVlLiBUaGUgZGF0YSBjb25uZWN0aW9uIHJlbWFpbnMgb3BlbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdBdWRpb0Nsb3NlKHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQWdSZXN1bHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gQVQgcmVzdWx0IGNvZGUgdG8gYSBoZWFkc2V0IG9yIGhhbmRzLWZyZWUgZGV2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdSZXN1bHQodWludDE2X3QgaGFuZGxlLCB0QlRBX0FHX1JFUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICBjb25zdCB0QlRBX0FHX1JFU19EQVRBJiBkYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ1NldENvZGVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTcGVjaWZ5IHRoZSBjb2RlYyB0eXBlIHRvIGJlIHVzZWQgZm9yIHRoZSBzdWJzZXF1ZW50Ci0gKiAgICAgICAgICAgICAgICAgIGF1ZGlvIGNvbm5lY3Rpb24uCi0gKgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQWdTZXRDb2RlYyh1aW50MTZfdCBoYW5kbGUsIHRCVEFfQUdfUEVFUl9DT0RFQyBjb2RlYyk7Ci0KLXZvaWQgQlRBX0FnU2V0U2NvQWxsb3dlZChib29sIHZhbHVlKTsKLQotdm9pZCBCVEFfQWdTZXRBY3RpdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWN0aXZlX2RldmljZV9hZGRyKTsKLQotI2VuZGlmIC8qIEJUQV9BR19BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWMyNjM1Li4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZpbGUgZm9yIEJUQSwgQnJvYWRjb20ncyBCbHVldG9vdGgKLSAqICBhcHBsaWNhdGlvbiBsYXllciBmb3IgbW9iaWxlIHBob25lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfQVBJX0gKLSNkZWZpbmUgQlRBX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgYW5kIGRhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdGF0dXMgUmV0dXJuIFZhbHVlICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRBX1NVQ0NFU1MgPSAwLCAvKiBTdWNjZXNzZnVsIG9wZXJhdGlvbi4gKi8KLSAgQlRBX0ZBSUxVUkUgPSAxLCAvKiBHZW5lcmljIGZhaWx1cmUuICovCi0gIEJUQV9QRU5ESU5HID0gMiwgLyogQVBJIGNhbm5vdCBiZSBjb21wbGV0ZWQgcmlnaHQgbm93ICovCi0gIEJUQV9CVVNZID0gMywKLSAgQlRBX05PX1JFU09VUkNFUyA9IDQsCi0gIEJUQV9XUk9OR19NT0RFID0gNSwKLX0gdEJUQV9TVEFUVVM7Ci0KLS8qCi0gKiBTZXJ2aWNlIElECi0gKi8KLQotI2RlZmluZSBCVEFfQTJEUF9TT1VSQ0VfU0VSVklDRV9JRCAzIC8qIEEyRFAgU291cmNlIHByb2ZpbGUuICovCi0jZGVmaW5lIEJUQV9IU1BfU0VSVklDRV9JRCA1ICAgICAgICAgLyogSGVhZHNldCBwcm9maWxlLiAqLwotI2RlZmluZSBCVEFfSEZQX1NFUlZJQ0VfSUQgNiAgICAgICAgIC8qIEhhbmRzLWZyZWUgcHJvZmlsZS4gKi8KLSNkZWZpbmUgQlRBX0JJUF9TRVJWSUNFX0lEIDEzICAgICAgICAvKiBCYXNpYyBJbWFnaW5nIHByb2ZpbGUgKi8KLSNkZWZpbmUgQlRBX0EyRFBfU0lOS19TRVJWSUNFX0lEIDE4ICAvKiBBMkRQIFNpbmsgKi8KLSNkZWZpbmUgQlRBX0hJRF9TRVJWSUNFX0lEIDIwICAgICAgICAvKiBISUQgKi8KLSNkZWZpbmUgQlRBX1BCQVBfU0VSVklDRV9JRCAyMiAgICAgICAvKiBQaG9uZUJvb2sgQWNjZXNzIFNlcnZlciovCi0jZGVmaW5lIEJUQV9IRlBfSFNfU0VSVklDRV9JRCAyNCAgICAgLyogSFNQIEhTIHJvbGUgKi8KLSNkZWZpbmUgQlRBX01BUF9TRVJWSUNFX0lEIDI1ICAgICAgICAvKiBNZXNzYWdlIEFjY2VzcyBQcm9maWxlICovCi0jZGVmaW5lIEJUQV9NTl9TRVJWSUNFX0lEIDI2ICAgICAgICAgLyogTWVzc2FnZSBOb3RpZmljYXRpb24gU2VydmljZSAqLwotI2RlZmluZSBCVEFfUENFX1NFUlZJQ0VfSUQgMjggICAgICAgIC8qIFBob25lQm9vayBBY2Nlc3MgQ2xpZW50ICovCi0jZGVmaW5lIEJUQV9TRFBfU0VSVklDRV9JRCAyOSAgICAgICAgLyogU0RQIFNlYXJjaCAqLwotI2RlZmluZSBCVEFfSElERF9TRVJWSUNFX0lEIDMwICAgICAgIC8qIEhJRCBEZXZpY2UgKi8KLQotLyogQkxFIHByb2ZpbGUgc2VydmljZSBJRCAqLwotI2RlZmluZSBCVEFfQkxFX1NFUlZJQ0VfSUQgMzEgIC8qIEdBVFQgcHJvZmlsZSAqLwotI2RlZmluZSBCVEFfVVNFUl9TRVJWSUNFX0lEIDMyIC8qIFVzZXIgcmVxdWVzdGVkIFVVSUQgKi8KLSNkZWZpbmUgQlRBX01BWF9TRVJWSUNFX0lEIDMzCi0KLS8qIHNlcnZpY2UgSURzIChCVE1fU0VDX1NFUlZJQ0VfRklSU1RfRU1QVFkgKyAxKSB0byAoQlRNX1NFQ19NQVhfU0VSVklDRVMgLSAxKQotICogYXJlIHVzZWQgYnkgQlRBIEpWICovCi0jZGVmaW5lIEJUQV9GSVJTVF9KVl9TRVJWSUNFX0lEIChCVE1fU0VDX1NFUlZJQ0VfRklSU1RfRU1QVFkgKyAxKQotI2RlZmluZSBCVEFfTEFTVF9KVl9TRVJWSUNFX0lEIChCVE1fU0VDX01BWF9TRVJWSUNFUyAtIDEpCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX1NFUlZJQ0VfSUQ7Ci0KLS8qIFNlcnZpY2UgSUQgTWFzayAqLwotI2RlZmluZSBCVEFfUkVTX1NFUlZJQ0VfTUFTSyAweDAwMDAwMDAxICAgIC8qIFJlc2VydmVkICovCi0jZGVmaW5lIEJUQV9IU1BfU0VSVklDRV9NQVNLIDB4MDAwMDAwMjAgICAgLyogSFNQIEFHIHJvbGUuICovCi0jZGVmaW5lIEJUQV9IRlBfU0VSVklDRV9NQVNLIDB4MDAwMDAwNDAgICAgLyogSEZQIEFHIHJvbGUgKi8KLSNkZWZpbmUgQlRBX0hMX1NFUlZJQ0VfTUFTSyAweDA4MDAwMDAwICAgICAvKiBIZWFsdGggRGV2aWNlIFByb2ZpbGUgKi8KLQotI2RlZmluZSBCVEFfQkxFX1NFUlZJQ0VfTUFTSyAweDQwMDAwMDAwICAvKiBHQVRUIGJhc2VkIHNlcnZpY2UgKi8KLSNkZWZpbmUgQlRBX0FMTF9TRVJWSUNFX01BU0sgMHg3RkZGRkZGRiAgLyogQWxsIHNlcnZpY2VzIHN1cHBvcnRlZCBieSBCVEEuICovCi0jZGVmaW5lIEJUQV9VU0VSX1NFUlZJQ0VfTUFTSyAweDgwMDAwMDAwIC8qIE1lc3NhZ2UgTm90aWZpY2F0aW9uIFByb2ZpbGUgKi8KLQotdHlwZWRlZiB1aW50MzJfdCB0QlRBX1NFUlZJQ0VfTUFTSzsKLQotLyogU2VjdXJpdHkgU2V0dGluZyBNYXNrICovCi0jZGVmaW5lIEJUQV9TRUNfQVVUSEVOVElDQVRFIFwKLSAgKEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFIHwgXAotICAgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFKSAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZC4gKi8KLSNkZWZpbmUgQlRBX1NFQ19FTkNSWVBUIFwKLSAgKEJUTV9TRUNfSU5fRU5DUllQVCB8IEJUTV9TRUNfT1VUX0VOQ1JZUFQpIC8qIEVuY3J5cHRpb24gcmVxdWlyZWQuICovCi0KLXR5cGVkZWYgdWludDE2X3QgdEJUQV9TRUM7Ci0KLSNkZWZpbmUgQlRBX0FQUF9JRF9QQU5fTVVMVEkgMHhGRSAvKiBhcHAgaWQgZm9yIHBhbiBtdWx0aXBsZSBjb25uZWN0aW9uICovCi0jZGVmaW5lIEJUQV9BTExfQVBQX0lEIDB4RkYKLQotLyogRGlzY292ZXJhYmxlIE1vZGVzICovCi0jZGVmaW5lIEJUQV9ETV9OT05fRElTQyBCVE1fTk9OX0RJU0NPVkVSQUJMRSAvKiBEZXZpY2UgaXMgbm90IGRpc2NvdmVyYWJsZS4gKi8KLSNkZWZpbmUgQlRBX0RNX0dFTkVSQUxfRElTQyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEJUTV9HRU5FUkFMX0RJU0NPVkVSQUJMRSAvKiBHZW5lcmFsIGRpc2NvdmVyYWJsZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgdWludDE2X3QKLSAgICB0QlRBX0RNX0RJU0M7IC8qIHRoaXMgZGlzY292ZXJhYmlsaXR5IG1vZGUgaXMgYSBiaXQgbWFzayBhbW9uZyBCUiBtb2RlIGFuZAotICAgICAgICAgICAgICAgICAgICAgTEUgbW9kZSAqLwotCi0vKiBDb25uZWN0YWJsZSBNb2RlcyAqLwotI2RlZmluZSBCVEFfRE1fTk9OX0NPTk4gQlRNX05PTl9DT05ORUNUQUJMRSAvKiBEZXZpY2UgaXMgbm90IGNvbm5lY3RhYmxlLiAqLwotI2RlZmluZSBCVEFfRE1fQ09OTiBCVE1fQ09OTkVDVEFCTEUgICAgICAgICAvKiBEZXZpY2UgaXMgY29ubmVjdGFibGUuICovCi0KLXR5cGVkZWYgdWludDE2X3QgdEJUQV9ETV9DT05OOwotCi0vKiBDZW50cmFsL3BlcmlwaGVyYWwgcHJlZmVycmVkIHJvbGVzICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRBX0FOWV9ST0xFID0gMHgwMCwKLSAgQlRBX0NFTlRSQUxfUk9MRV9QUkVGID0gMHgwMSwKLSAgQlRBX0NFTlRSQUxfUk9MRV9PTkxZID0gMHgwMiwKLSAgLyogVXNlZCBmb3IgUEFOVSBvbmx5LCBza2lwIHJvbGUgc3dpdGNoIHRvIGNlbnRyYWwgKi8KLSAgQlRBX1BFUklQSEVSQUxfUk9MRV9PTkxZID0gMHgwMywKLX0gdEJUQV9QUkVGX1JPTEVTOwotCi1pbmxpbmUgdEJUQV9QUkVGX1JPTEVTIHRvQlRBX1BSRUZfUk9MRVModWludDhfdCByb2xlKSB7Ci0gIEFTU0VSVF9MT0cocm9sZSA8PSBCVEFfUEVSSVBIRVJBTF9ST0xFX09OTFksCi0gICAgICAgICAgICAgIlBhc3NpbmcgaWxsZWdhbCBwcmVmZXJyZWQgcm9sZToweCUwMnggWzB4JTAyeDw9PjB4JTAyeF0iLCByb2xlLAotICAgICAgICAgICAgIEJUQV9BTllfUk9MRSwgQlRBX1BFUklQSEVSQUxfUk9MRV9PTkxZKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHRCVEFfUFJFRl9ST0xFUz4ocm9sZSk7Ci19Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgcHJlZmVycmVkX3JvbGVfdGV4dChjb25zdCB0QlRBX1BSRUZfUk9MRVMmIHJvbGUpIHsKLSAgc3dpdGNoIChyb2xlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfQU5ZX1JPTEUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0NFTlRSQUxfUk9MRV9QUkVGKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9DRU5UUkFMX1JPTEVfT05MWSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfUEVSSVBIRVJBTF9ST0xFX09OTFkpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV046JWhodSIsIHJvbGUpOwotICB9Ci19Ci0jdW5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotCi1lbnVtIHsKLQotICBCVEFfRE1fTk9fU0NBVFRFUk5FVCwgICAgICAvKiBEZXZpY2UgZG9lc24ndCBzdXBwb3J0IHNjYXR0ZXJuZXQsIGl0IG1pZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgInJvbGUgc3dpdGNoIGR1cmluZyBjb25uZWN0aW9uIiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgd2hlbiBpdCBhbHJlYWR5IGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIGNvbm5lY3Rpb24gaW4gY2VudHJhbCByb2xlICovCi0gIEJUQV9ETV9QQVJUSUFMX1NDQVRURVJORVQsIC8qIERldmljZSBzdXBwb3J0cyBwYXJ0aWFsIHNjYXR0ZXJuZXQuIEl0IGNhbiBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91cyBjb25uZWN0aW9uIGluIENlbnRyYWwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlwaGVyYWwgcm9sZXMgZm9yIHNob3J0IHBlcmlvZCBvZiB0aW1lICovCi0gIEJUQV9ETV9GVUxMX1NDQVRURVJORVQgLyogRGV2aWNlIGNhbiBoYXZlIHNpbXVsdGFuZW91cyBjb25uZWN0aW9uIGluIGNlbnRyYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcGVyaXBoZXJhbCByb2xlcyAqLwotCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYnRhX2RtX2Vpcl9taW5fbmFtZV9sZW47IC8qIG1pbmltdW0gbGVuZ3RoIG9mIGxvY2FsIG5hbWUgd2hlbiBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGVuZWQgKi8KLSNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUID09IFRSVUUpCi0gIHVpbnQ4X3QgYnRhX2RtX2Vpcl91dWlkMTZfbGVuOyAvKiBsZW5ndGggb2YgMTYtYml0IFVVSURzICovCi0gIHVpbnQ4X3QqIGJ0YV9kbV9laXJfdXVpZDE2OyAgICAvKiAxNi1iaXQgVVVJRHMgKi8KLSNlbHNlCi0gIHVpbnQzMl90IHV1aWRfbWFza1tCVE1fRUlSX1NFUlZJQ0VfQVJSQVlfU0laRV07IC8qIG1hc2sgb2YgVVVJRCBsaXN0IGluIEVJUiAqLwotI2VuZGlmCi0gIGludDhfdCogYnRhX2RtX2Vpcl9pbnFfdHhfcG93ZXI7ICAgICAvKiBJbnF1aXJ5IFRYIHBvd2VyICAgICAgICAgKi8KLSAgdWludDhfdCBidGFfZG1fZWlyX2ZsYWdfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBvZiBmbGFncyBpbiBieXRlcyAqLwotICB1aW50OF90KiBidGFfZG1fZWlyX2ZsYWdzOyAgICAgICAgICAgLyogZmxhZ3MgZm9yIEVJUiAqLwotICB1aW50OF90IGJ0YV9kbV9laXJfbWFudWZhY19zcGVjX2xlbjsgLyogbGVuZ3RoIG9mIG1hbnVmYWN0dXJlciBzcGVjaWZpYyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKi8KLSAgdWludDhfdCogYnRhX2RtX2Vpcl9tYW51ZmFjX3NwZWM7ICAgIC8qIG1hbnVmYWN0dXJlciBzcGVjaWZpYyAqLwotICB1aW50OF90IGJ0YV9kbV9laXJfYWRkaXRpb25hbF9sZW47ICAgLyogbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSBpbiBieXRlcyAqLwotICB1aW50OF90KiBidGFfZG1fZWlyX2FkZGl0aW9uYWw7ICAgICAgLyogYWRkaXRpb25hbCBkYXRhICovCi19IHRCVEFfRE1fRUlSX0NPTkY7Ci0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0RNX0JMRV9SU1NJX0FMRVJUX1RZUEU7Ci0KLS8qIFNlY3VyaXR5IENhbGxiYWNrIEV2ZW50cyAqLwotI2RlZmluZSBCVEFfRE1fUElOX1JFUV9FVlQgMiAgIC8qIFBJTiByZXF1ZXN0LiAqLwotI2RlZmluZSBCVEFfRE1fQVVUSF9DTVBMX0VWVCAzIC8qIEF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlIGluZGljYXRpb24uICovCi0jZGVmaW5lIEJUQV9ETV9BVVRIT1JJWkVfRVZUIDQgLyogQXV0aG9yaXphdGlvbiByZXF1ZXN0LiAqLwotI2RlZmluZSBCVEFfRE1fTElOS19VUF9FVlQgNSAgIC8qIENvbm5lY3Rpb24gVVAgZXZlbnQgKi8KLSNkZWZpbmUgQlRBX0RNX0xJTktfRE9XTl9FVlQgNiAvKiBDb25uZWN0aW9uIERPV04gZXZlbnQgKi8KLSNkZWZpbmUgQlRBX0RNX0JPTkRfQ0FOQ0VMX0NNUExfRVZUIDkgLyogQm9uZCBjYW5jZWwgY29tcGxldGUgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBCVEFfRE1fU1BfQ0ZNX1JFUV9FVlQgICAgICAgICAgICAgICAgICAgICBcCi0gIDEwIC8qIFNpbXBsZSBQYWlyaW5nIFVzZXIgQ29uZmlybWF0aW9uIHJlcXVlc3QuIFwKLSAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0RNX1NQX0tFWV9OT1RJRl9FVlQgMTEgLyogU2ltcGxlIFBhaXJpbmcgUGFzc2tleSBOb3RpZmljYXRpb24gKi8KLSNkZWZpbmUgQlRBX0RNX0JMRV9LRVlfRVZUIDE1ICAgICAgLyogQkxFIFNNUCBrZXkgZXZlbnQgZm9yIHBlZXIgZGV2aWNlIGtleXMgKi8KLSNkZWZpbmUgQlRBX0RNX0JMRV9TRUNfUkVRX0VWVCAxNiAgLyogQkxFIFNNUCBzZWN1cml0eSByZXF1ZXN0ICovCi0jZGVmaW5lIEJUQV9ETV9CTEVfUEFTU0tFWV9OT1RJRl9FVlQgMTcgLyogU01QIHBhc3NrZXkgbm90aWZpY2F0aW9uIGV2ZW50ICovCi0jZGVmaW5lIEJUQV9ETV9CTEVfUEFTU0tFWV9SRVFfRVZUIDE4ICAgLyogU01QIHBhc3NrZXkgcmVxdWVzdCBldmVudCAqLwotI2RlZmluZSBCVEFfRE1fQkxFX09PQl9SRVFfRVZUIDE5ICAgICAgIC8qIFNNUCBPT0IgcmVxdWVzdCBldmVudCAqLwotI2RlZmluZSBCVEFfRE1fQkxFX0xPQ0FMX0lSX0VWVCAyMCAgICAgIC8qIEJMRSBsb2NhbCBJUiBldmVudCAqLwotI2RlZmluZSBCVEFfRE1fQkxFX0xPQ0FMX0VSX0VWVCAyMSAgICAgIC8qIEJMRSBsb2NhbCBFUiBldmVudCAqLwotI2RlZmluZSBCVEFfRE1fQkxFX05DX1JFUV9FVlQgMjIgLyogU01QIE51bWVyaWMgQ29tcGFyaXNvbiByZXF1ZXN0IGV2ZW50ICovCi0jZGVmaW5lIEJUQV9ETV9TUF9STVRfT09CX0VYVF9FVlQgXAotICAyMyAvKiBTaW1wbGUgUGFpcmluZyBSZW1vdGUgT09CIEV4dGVuZGVkIERhdGEgcmVxdWVzdC4gKi8KLSNkZWZpbmUgQlRBX0RNX0JMRV9BVVRIX0NNUExfRVZUIDI0IC8qIEJMRSBBdXRoIGNvbXBsZXRlICovCi0jZGVmaW5lIEJUQV9ETV9ERVZfVU5QQUlSRURfRVZUIDI1Ci0jZGVmaW5lIEJUQV9ETV9MRV9GRUFUVVJFU19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ290cm9sbGVyIHNwZWNpZmljIExFIGZlYXR1cmVzIGFyZSByZWFkIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUQV9ETV9FTkVSX0lORk9fUkVBRCAyOCAvKiBFbmVyZ3kgaW5mbyByZWFkICovCi0jZGVmaW5lIEJUQV9ETV9CTEVfU0NfT09CX1JFUV9FVlQgMjkgLyogU01QIFNDIE9PQiByZXF1ZXN0IGV2ZW50ICovCi0jZGVmaW5lIEJUQV9ETV9CTEVfQ09OU0VOVF9SRVFfRVZUIDMwIC8qIFNNUCBjb25zZW50IHJlcXVlc3QgZXZlbnQgKi8KLSNkZWZpbmUgQlRBX0RNX0JMRV9TQ19DUl9MT0NfT09CX0VWVCBcCi0gIDMxIC8qIFNNUCBTQyBDcmVhdGUgTG9jYWwgT09CIHJlcXVlc3QgZXZlbnQgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0RNX1NFQ19FVlQ7Ci0KLS8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX1BJTl9SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIE5vdGU6IEZpcnN0IDMgZGF0YSBtZW1iZXJzIG11c3QgYmUsIGJkX2FkZHIsIGRldl9jbGFzcywgYW5kIGJkX25hbWUgaW4KLSAgICogb3JkZXIgKi8KLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAgLyogQkQgYWRkcmVzcyBwZWVyIGRldmljZS4gKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgLyogQ2xhc3Mgb2YgRGV2aWNlICovCi0gIEJEX05BTUUgYmRfbmFtZTsgICAgIC8qIE5hbWUgb2YgcGVlciBkZXZpY2UuICovCi0gIGJvb2wgbWluXzE2X2RpZ2l0OyAgIC8qIHRydWUgaWYgdGhlIHBpbiByZXR1cm5lZCBtdXN0IGJlIGF0IGxlYXN0IDE2IGRpZ2l0cyAqLwotfSB0QlRBX0RNX1BJTl9SRVE7Ci0KLS8qIEJMRSByZWxhdGVkIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBCVEFfRE1fQVVUSF9GQUlMX0JBU0UgKEhDSV9FUlJfTUFYX0VSUiArIDEwKQotCi0vKiBDb252ZXJ0cyBTTVAgZXJyb3IgY29kZXMgZGVmaW5lZCBpbiBzbXBfYXBpLmggdG8gU01QIGF1dGggZmFpbCByZWFzb25zIGJlbG93LgotICovCi0jZGVmaW5lIEJUQV9ETV9BVVRIX0NPTlZFUlRfU01QX0NPREUoeCkgKEJUQV9ETV9BVVRIX0ZBSUxfQkFTRSArICh4KSkKLQotI2RlZmluZSBCVEFfRE1fQVVUSF9TTVBfUEFJUl9BVVRIX0ZBSUwgXAotICAoQlRBX0RNX0FVVEhfRkFJTF9CQVNFICsgU01QX1BBSVJfQVVUSF9GQUlMKQotI2RlZmluZSBCVEFfRE1fQVVUSF9TTVBfQ09ORklSTV9WQUxVRV9GQUlMIFwKLSAgKEJUQV9ETV9BVVRIX0ZBSUxfQkFTRSArIFNNUF9DT05GSVJNX1ZBTFVFX0VSUikKLSNkZWZpbmUgQlRBX0RNX0FVVEhfU01QX1BBSVJfTk9UX1NVUFBPUlQgXAotICAoQlRBX0RNX0FVVEhfRkFJTF9CQVNFICsgU01QX1BBSVJfTk9UX1NVUFBPUlQpCi0jZGVmaW5lIEJUQV9ETV9BVVRIX1NNUF9VTktOT1dOX0VSUiBcCi0gIChCVEFfRE1fQVVUSF9GQUlMX0JBU0UgKyBTTVBfUEFJUl9GQUlMX1VOS05PV04pCi0jZGVmaW5lIEJUQV9ETV9BVVRIX1NNUF9DT05OX1RPVVQgKEJUQV9ETV9BVVRIX0ZBSUxfQkFTRSArIFNNUF9DT05OX1RPVVQpCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0xFX0tFWV9UWVBFOyAvKiBjYW4gYmUgdXNlZCBhcyBhIGJpdCBtYXNrICovCi0KLXR5cGVkZWYgdW5pb24gewotICB0QlRNX0xFX1BFTkNfS0VZUyBwZW5jX2tleTsgIC8qIHJlY2VpdmVkIHBlZXIgZW5jcnlwdGlvbiBrZXkgKi8KLSAgdEJUTV9MRV9QQ1NSS19LRVlTIHBzcmtfa2V5OyAvKiByZWNlaXZlZCBwZWVyIGRldmljZSBTUksgKi8KLSAgdEJUTV9MRV9QSURfS0VZUyBwaWRfa2V5OyAgICAvKiBwZWVyIGRldmljZSBJRCBrZXkgKi8KLSAgdEJUTV9MRV9MRU5DX0tFWVMKLSAgICAgIGxlbmNfa2V5OyAvKiBsb2NhbCBlbmNyeXB0aW9uIHJlcHJvZHVjdGlvbiBrZXlzIExUSyA9ID0gZDEoRVIsRElWLDApKi8KLSAgdEJUTV9MRV9MQ1NSS19LRVlTIGxjc3JrX2tleTsgLyogbG9jYWwgZGV2aWNlIENTUksgPSBkMShFUixESVYsMSkqLwotICB0QlRNX0xFX1BJRF9LRVlTIGxpZF9rZXk7IC8qIGxvY2FsIGRldmljZSBJRCBrZXkgZm9yIHRoZSBwYXJ0aWN1bGFyIHJlbW90ZSAqLwotfSB0QlRBX0xFX0tFWV9WQUxVRTsKLQotI2RlZmluZSBCVEFfQkxFX0xPQ0FMX0tFWV9UWVBFX0lEIDEKLSNkZWZpbmUgQlRBX0JMRV9MT0NBTF9LRVlfVFlQRV9FUiAyCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9CTEVfTE9DQUxfS0VZX01BU0s7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgT2N0ZXQxNiBpcjsKLSAgT2N0ZXQxNiBpcms7Ci0gIE9jdGV0MTYgZGhrOwotfSB0QlRBX0JMRV9MT0NBTF9JRF9LRVlTOwotCi0jZGVmaW5lIEJUQV9ETV9TRUNfR1JBTlRFRCBCVEFfU1VDQ0VTUwotI2RlZmluZSBCVEFfRE1fU0VDX1BBSVJfTk9UX1NQVCBCVEFfRE1fQVVUSF9TTVBfUEFJUl9OT1RfU1VQUE9SVAotdHlwZWRlZiB1aW50OF90IHRCVEFfRE1fQkxFX1NFQ19HUkFOVDsKLQotLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fQkxFX1NFQ19SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgLyogcGVlciBhZGRyZXNzICovCi0gIEJEX05BTUUgYmRfbmFtZTsgLyogcGVlciBkZXZpY2UgbmFtZSAqLwotfSB0QlRBX0RNX0JMRV9TRUNfUkVROwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgLyogcGVlciBhZGRyZXNzICovCi0gIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGU7Ci0gIHRCVE1fTEVfS0VZX1ZBTFVFKiBwX2tleV92YWx1ZTsKLX0gdEJUQV9ETV9CTEVfS0VZOwotCi0vKiBTdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIEJUQV9ETV9BVVRIX0NNUExfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgIC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCi0gIEJEX05BTUUgYmRfbmFtZTsgICAgIC8qIE5hbWUgb2YgcGVlciBkZXZpY2UuICovCi0gIGJvb2wga2V5X3ByZXNlbnQ7ICAgIC8qIFZhbGlkIGxpbmsga2V5IHZhbHVlIGluIGtleSBlbGVtZW50ICovCi0gIExpbmtLZXkga2V5OyAgICAgICAgIC8qIExpbmsga2V5IGFzc29jaWF0ZWQgd2l0aCBwZWVyIGRldmljZS4gKi8KLSAgdWludDhfdCBrZXlfdHlwZTsgICAgLyogVGhlIHR5cGUgb2YgTGluayBLZXkgKi8KLSAgYm9vbCBzdWNjZXNzOyAgICAgICAgLyogdHJ1ZSBvZiBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQsIGZhbHNlIGlmIGZhaWxlZC4gKi8KLSAgdEhDSV9SRUFTT04KLSAgICAgIGZhaWxfcmVhc29uOyAvKiBUaGUgSENJIHJlYXNvbi9lcnJvciBjb2RlIGZvciB3aGVuIHN1Y2Nlc3M9ZmFsc2UgKi8KLSAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlOyAvKiBQZWVyIGRldmljZSBhZGRyZXNzIHR5cGUgKi8KLSAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlOwotfSB0QlRBX0RNX0FVVEhfQ01QTDsKLQotLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fTElOS19VUF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAvKiBCRCBhZGRyZXNzIHBlZXIgZGV2aWNlLiAqLwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydF9saW5rX3R5cGU7Ci19IHRCVEFfRE1fTElOS19VUDsKLQotLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fTElOS19ET1dOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7IC8qIEJEIGFkZHJlc3MgcGVlciBkZXZpY2UuICovCi0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0X2xpbmtfdHlwZTsKLX0gdEJUQV9ETV9MSU5LX0RPV047Ci0KLSNkZWZpbmUgQlRBX0FVVEhfU1BfWUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgQlRNX0FVVEhfU1BfWUVTIC8qIDEgTUlUTSBQcm90ZWN0aW9uIFJlcXVpcmVkIC0gU2luZ2xlIFByb2ZpbGUvbm9uLWJvbmRpbmcgIFwKLSAgICAgICAgICAgICAgICAgICAgVXNlIElPIENhcGFiaWxpdGllcyB0byBkZXRlcm1pbmUgYXV0aGVudGljYXRpb24gcHJvY2VkdXJlIFwKLSAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBCVEFfQVVUSF9ERF9CT05EIFwKLSAgQlRNX0FVVEhfRERfQk9ORCAvKiAyIHRoaXMgYml0IGlzIHNldCBmb3IgZGVkaWNhdGVkIGJvbmRpbmcgKi8KLSNkZWZpbmUgQlRBX0FVVEhfR0VOX0JPTkQgXAotICBCVE1fQVVUSF9TUEdCX05PIC8qIDQgdGhpcyBiaXQgaXMgc2V0IGZvciBnZW5lcmFsIGJvbmRpbmcgKi8KLSNkZWZpbmUgQlRBX0FVVEhfQk9ORFMgXAotICBCVE1fQVVUSF9CT05EUyAvKiA2IHRoZSBnZW5lcmFsL2RlZGljYXRlZCBib25kaW5nIGJpdHMgICovCi0KLSNkZWZpbmUgQlRBX0xFX0FVVEhfUkVRX1NDX01JVE1fQk9ORCBCVE1fTEVfQVVUSF9SRVFfU0NfTUlUTV9CT05EIC8qIDExMDEgKi8KLQotLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fU1BfQ0ZNX1JFUV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogTm90ZTogRmlyc3QgMyBkYXRhIG1lbWJlcnMgbXVzdCBiZSwgYmRfYWRkciwgZGV2X2NsYXNzLCBhbmQgYmRfbmFtZSBpbgotICAgKiBvcmRlciAqLwotICBSYXdBZGRyZXNzIGJkX2FkZHI7ICAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgLyogcGVlciBDb0QgKi8KLSAgQkRfTkFNRSBiZF9uYW1lOyAgICAgLyogcGVlciBkZXZpY2UgbmFtZSAqLwotICB1aW50MzJfdCBudW1fdmFsOyAvKiB0aGUgbnVtZXJpYyB2YWx1ZSBmb3IgY29tcGFyaXNvbi4gSWYganVzdF93b3JrcywgZG8gbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNob3cgdGhpcyBudW1iZXIgdG8gVUkgKi8KLSAgYm9vbCBqdXN0X3dvcmtzOyAgLyogdHJ1ZSwgaWYgIkp1c3QgV29ya3MiIGFzc29jaWF0aW9uIG1vZGVsICovCi0gIHRCVE1fQVVUSF9SRVEgbG9jX2F1dGhfcmVxOyAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgbG9jYWwgZGV2aWNlICovCi0gIHRCVE1fQVVUSF9SRVEgcm10X2F1dGhfcmVxOyAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgcGVlciBkZXZpY2UgKi8KLSAgdEJUTV9JT19DQVAgbG9jX2lvX2NhcHM7ICAgIC8qIElPIENhcGFiaWxpdGllcyBvZiBsb2NhbCBkZXZpY2UgKi8KLSAgdEJUTV9BVVRIX1JFUSBybXRfaW9fY2FwczsgIC8qIElPIENhcGFiaWxpdGllcyBvZiByZW1vdGUgZGV2aWNlICovCi19IHRCVEFfRE1fU1BfQ0ZNX1JFUTsKLQotLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fU1BfS0VZX05PVElGX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBOb3RlOiBGaXJzdCAzIGRhdGEgbWVtYmVycyBtdXN0IGJlLCBiZF9hZGRyLCBkZXZfY2xhc3MsIGFuZCBiZF9uYW1lIGluCi0gICAqIG9yZGVyICovCi0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgIC8qIHBlZXIgYWRkcmVzcyAqLwotICBERVZfQ0xBU1MgZGV2X2NsYXNzOyAvKiBwZWVyIENvRCAqLwotICBCRF9OQU1FIGJkX25hbWU7ICAgICAvKiBwZWVyIGRldmljZSBuYW1lICovCi0gIHVpbnQzMl90IHBhc3NrZXk7IC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLwotfSB0QlRBX0RNX1NQX0tFWV9OT1RJRjsKLQotLyogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBCVEFfRE1fU1BfUk1UX09PQl9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogTm90ZTogRmlyc3QgMyBkYXRhIG1lbWJlcnMgbXVzdCBiZSwgYmRfYWRkciwgZGV2X2NsYXNzLCBhbmQgYmRfbmFtZSBpbgotICAgKiBvcmRlciAqLwotICBSYXdBZGRyZXNzIGJkX2FkZHI7ICAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgLyogcGVlciBDb0QgKi8KLSAgQkRfTkFNRSBiZF9uYW1lOyAgICAgLyogcGVlciBkZXZpY2UgbmFtZSAqLwotfSB0QlRBX0RNX1NQX1JNVF9PT0I7Ci0KLS8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX0JPTkRfQ0FOQ0VMX0NNUExfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfU1RBVFVTIHJlc3VsdDsgLyogdHJ1ZSBvZiBib25kIGNhbmNlbCBzdWNjZWVkZWQsIGZhbHNlIGlmIGZhaWxlZC4gKi8KLX0gdEJUQV9ETV9CT05EX0NBTkNFTF9DTVBMOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE9jdGV0MTYgbG9jYWxfb29iX2M7IC8qIExvY2FsIE9PQiBEYXRhIENvbmZpcm1hdGlvbi9Db21taXRtZW50ICovCi0gIE9jdGV0MTYgbG9jYWxfb29iX3I7IC8qIExvY2FsIE9PQiBEYXRhIFJhbmRvbWl6ZXIgKi8KLX0gdEJUQV9ETV9MT0NfT09CX0RBVEE7Ci0KLS8qIFVuaW9uIG9mIGFsbCBzZWN1cml0eSBjYWxsYmFjayBzdHJ1Y3R1cmVzICovCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUQV9ETV9QSU5fUkVRIHBpbl9yZXE7ICAgICAgICAvKiBQSU4gcmVxdWVzdC4gKi8KLSAgdEJUQV9ETV9BVVRIX0NNUEwgYXV0aF9jbXBsOyAgICAvKiBBdXRoZW50aWNhdGlvbiBjb21wbGV0ZSBpbmRpY2F0aW9uLiAqLwotICB0QlRBX0RNX0xJTktfVVAgbGlua191cDsgICAgICAgIC8qIEFDTCBjb25uZWN0aW9uIGRvd24gZXZlbnQgKi8KLSAgdEJUQV9ETV9MSU5LX0RPV04gbGlua19kb3duOyAgICAvKiBBQ0wgY29ubmVjdGlvbiBkb3duIGV2ZW50ICovCi0gIHRCVEFfRE1fU1BfQ0ZNX1JFUSBjZm1fcmVxOyAgICAgLyogdXNlciBjb25maXJtIHJlcXVlc3QgKi8KLSAgdEJUQV9ETV9TUF9LRVlfTk9USUYga2V5X25vdGlmOyAvKiBwYXNza2V5IG5vdGlmaWNhdGlvbiAqLwotICB0QlRBX0RNX1NQX1JNVF9PT0Igcm10X29vYjsgICAgIC8qIHJlbW90ZSBvb2IgKi8KLSAgdEJUQV9ETV9CT05EX0NBTkNFTF9DTVBMCi0gICAgICBib25kX2NhbmNlbF9jbXBsOyAgICAgICAgICAgICAgIC8qIEJvbmQgQ2FuY2VsIENvbXBsZXRlIGluZGljYXRpb24gKi8KLSAgdEJUQV9ETV9CTEVfU0VDX1JFUSBibGVfcmVxOyAgICAgICAgLyogQkxFIFNNUCByZWxhdGVkIHJlcXVlc3QgKi8KLSAgdEJUQV9ETV9CTEVfS0VZIGJsZV9rZXk7ICAgICAgICAgICAgLyogQkxFIFNNUCBrZXlzIHVzZWQgd2hlbiBwYWlyaW5nICovCi0gIHRCVEFfQkxFX0xPQ0FMX0lEX0tFWVMgYmxlX2lkX2tleXM7IC8qIElSIGV2ZW50ICovCi0gIE9jdGV0MTYgYmxlX2VyOyAgICAgICAgICAgICAgICAgICAgIC8qIEVSIGV2ZW50IGRhdGEgKi8KLSAgdEJUQV9ETV9MT0NfT09CX0RBVEEgbG9jYWxfb29iX2RhdGE7IC8qIExvY2FsIE9PQiBkYXRhIGdlbmVyYXRlZCBieSB1cyAqLwotfSB0QlRBX0RNX1NFQzsKLQotLyogU2VjdXJpdHkgY2FsbGJhY2sgKi8KLXR5cGVkZWYgdm9pZCh0QlRBX0RNX1NFQ19DQkFDSykodEJUQV9ETV9TRUNfRVZUIGV2ZW50LCB0QlRBX0RNX1NFQyogcF9kYXRhKTsKLQotI2RlZmluZSBCVEFfRE1fQkxFX1BGX0xJU1RfTE9HSUNfT1IgMQotI2RlZmluZSBCVEFfRE1fQkxFX1BGX0ZJTFRfTE9HSUNfT1IgMAotCi0vKiBTZWFyY2ggY2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIEJUQV9ETV9JTlFfUkVTX0VWVCAwICAvKiBJbnF1aXJ5IHJlc3VsdCBmb3IgYSBwZWVyIGRldmljZS4gKi8KLSNkZWZpbmUgQlRBX0RNX0lOUV9DTVBMX0VWVCAxIC8qIElucXVpcnkgY29tcGxldGUuICovCi0jZGVmaW5lIEJUQV9ETV9ESVNDX1JFU19FVlQgMiAvKiBEaXNjb3ZlcnkgcmVzdWx0IGZvciBhIHBlZXIgZGV2aWNlLiAqLwotI2RlZmluZSBCVEFfRE1fRElTQ19CTEVfUkVTX0VWVCBcCi0gIDMgLyogRGlzY292ZXJ5IHJlc3VsdCBmb3IgQkxFIEdBVFQgYmFzZWQgc2Vydm9jZSBvbiBhIHBlZXIgZGV2aWNlLiAqLwotI2RlZmluZSBCVEFfRE1fRElTQ19DTVBMX0VWVCA0ICAgICAgICAgIC8qIERpc2NvdmVyeSBjb21wbGV0ZS4gKi8KLSNkZWZpbmUgQlRBX0RNX1NFQVJDSF9DQU5DRUxfQ01QTF9FVlQgNiAvKiBTZWFyY2ggY2FuY2VsbGVkICovCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0RNX1NFQVJDSF9FVlQ7Ci0KLS8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX0lOUV9SRVNfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgICAgICAgICAgLyogQkQgYWRkcmVzcyBwZWVyIGRldmljZS4gKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgICAgICAgICAvKiBEZXZpY2UgY2xhc3Mgb2YgcGVlciBkZXZpY2UuICovCi0gIGJvb2wgcmVtdF9uYW1lX25vdF9yZXF1aXJlZDsgLyogQXBwbGljYXRpb24gc2V0cyB0aGlzIGZsYWcgaWYgaXQgYWxyZWFkeSBrbm93cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgKi8KLSAgLyogSWYgdGhlIGRldmljZSBuYW1lIGlzIGtub3duIHRvIGFwcGxpY2F0aW9uIEJUQSBza2lwcyB0aGUgcmVtb3RlIG5hbWUKLSAgICogcmVxdWVzdCAqLwotICBib29sIGlzX2xpbWl0ZWQ7IC8qIHRydWUsIGlmIHRoZSBsaW1pdGVkIGlucXVpcnkgYml0IGlzIHNldCBpbiB0aGUgQ29EICovCi0gIGludDhfdCByc3NpOyAgICAgLyogVGhlIHJzc2kgdmFsdWUgKi8KLSAgdWludDhfdCogcF9laXI7ICAvKiByZWNlaXZlZCBFSVIgKi8KLSAgdWludDE2X3QgZWlyX2xlbjsgLyogcmVjZWl2ZWQgRUlSIGxlbmd0aCAqLwotICB1aW50OF90IGlucV9yZXN1bHRfdHlwZTsKLSAgdEJMRV9BRERSX1RZUEUgYmxlX2FkZHJfdHlwZTsKLSAgdWludDE2X3QgYmxlX2V2dF90eXBlOwotICB1aW50OF90IGJsZV9wcmltYXJ5X3BoeTsKLSAgdWludDhfdCBibGVfc2Vjb25kYXJ5X3BoeTsKLSAgdWludDhfdCBibGVfYWR2ZXJ0aXNpbmdfc2lkOwotICBpbnQ4X3QgYmxlX3R4X3Bvd2VyOwotICB1aW50MTZfdCBibGVfcGVyaW9kaWNfYWR2X2ludDsKLSAgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlOwotICB1aW50OF90IGZsYWc7Ci0gIGJvb2wgaW5jbHVkZV9yc2k7IC8qIHRydWUsIGlmIEFEViBjb250YWlucyBSU0kgZGF0YSAqLwotfSB0QlRBX0RNX0lOUV9SRVM7Ci0KLS8qIFN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggQlRBX0RNX0lOUV9DTVBMX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG51bV9yZXNwczsgLyogTnVtYmVyIG9mIGlucXVpcnkgcmVzcG9uc2VzLiAqLwotfSB0QlRBX0RNX0lOUV9DTVBMOwotCi0vKiBTdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIEJUQV9ETV9ESVNDX1JFU19FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAgICAgICAgICAvKiBCRCBhZGRyZXNzIHBlZXIgZGV2aWNlLiAqLwotICBCRF9OQU1FIGJkX25hbWU7ICAgICAgICAgICAgIC8qIE5hbWUgb2YgcGVlciBkZXZpY2UuICovCi0gIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzOyAgLyogU2VydmljZXMgZm91bmQgb24gcGVlciBkZXZpY2UuICovCi0gIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZTsgLyogZGV2aWNlIHR5cGUgaW4gY2FzZSBpdCBpcyBCTEUgZGV2aWNlICovCi0gIHVpbnQzMl90IG51bV91dWlkczsKLSAgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWRfbGlzdDsKLSAgdEJUQV9TVEFUVVMgcmVzdWx0OwotfSB0QlRBX0RNX0RJU0NfUkVTOwotCi0vKiBTdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRCVEFfRE1fRElTQ19CTEVfUkVTICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgLyogQkQgYWRkcmVzcyBwZWVyIGRldmljZS4gKi8KLSAgQkRfTkFNRSBiZF9uYW1lOyAgLyogTmFtZSBvZiBwZWVyIGRldmljZS4gKi8KLSAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpVdWlkPioKLSAgICAgIHNlcnZpY2VzOyAvKiBHQVRUIGJhc2VkIFNlcnZpY2VzIFVVSUQgZm91bmQgb24gcGVlciBkZXZpY2UuICovCi19IHRCVEFfRE1fRElTQ19CTEVfUkVTOwotCi0vKiBVbmlvbiBvZiBhbGwgc2VhcmNoIGNhbGxiYWNrIHN0cnVjdHVyZXMgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QlRBX0RNX0lOUV9SRVMgaW5xX3JlczsgICAvKiBJbnF1aXJ5IHJlc3VsdCBmb3IgYSBwZWVyIGRldmljZS4gKi8KLSAgdEJUQV9ETV9JTlFfQ01QTCBpbnFfY21wbDsgLyogSW5xdWlyeSBjb21wbGV0ZS4gKi8KLSAgdEJUQV9ETV9ESVNDX1JFUyBkaXNjX3JlczsgLyogRGlzY292ZXJ5IHJlc3VsdCBmb3IgYSBwZWVyIGRldmljZS4gKi8KLSAgdEJUQV9ETV9ESVNDX0JMRV9SRVMKLSAgICAgIGRpc2NfYmxlX3JlczsgICAgICAgICAgICAgLyogZGlzY292ZXJ5IHJlc3VsdCBmb3IgR0FUVCBiYXNlZCBzZXJ2aWNlICovCi19IHRCVEFfRE1fU0VBUkNIOwotCi0vKiBTZWFyY2ggY2FsbGJhY2sgKi8KLXR5cGVkZWYgdm9pZCh0QlRBX0RNX1NFQVJDSF9DQkFDSykodEJUQV9ETV9TRUFSQ0hfRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSCogcF9kYXRhKTsKLQotLyogRXhlY3V0ZSBjYWxsIGJhY2sgKi8KLXR5cGVkZWYgdm9pZCh0QlRBX0RNX0VYRUNfQ0JBQ0spKHZvaWQqIHBfcGFyYW0pOwotCi0vKiBFbmNyeXB0aW9uIGNhbGxiYWNrKi8KLXR5cGVkZWYgdm9pZCh0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfU1RBVFVTIHJlc3VsdCk7Ci0KLXR5cGVkZWYgdm9pZCh0QlRBX0JMRV9FTkVSR1lfSU5GT19DQkFDSykodEJUTV9CTEVfVFhfVElNRV9NUyB0eF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9SWF9USU1FX01TIHJ4X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0lETEVfVElNRV9NUyBpZGxlX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0VORVJHWV9VU0VEIGVuZXJneV91c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NPTlRSTF9TVEFURSBjdHJsX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1NUQVRVUyBzdGF0dXMpOwotCi0vKiBNYXhpbXVtIHNlcnZpY2UgbmFtZSBsZW5ndGggKi8KLSNkZWZpbmUgQlRBX1NFUlZJQ0VfTkFNRV9MRU4gMzUKLQotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIC8qIHBvd2VyIG1vZGUgYWN0aW9ucyAgKi8KLSAgQlRBX0RNX1BNX05PX0FDVElPTiA9IDB4MDAsIC8qIG5vIGNoYW5nZSB0byB0aGUgY3VycmVudCBwbSBzZXR0aW5nICovCi0gIEJUQV9ETV9QTV9QQVJLID0gMHgxMCwgICAgICAvKiBwcmVmZXJzIHBhcmsgbW9kZSAqLwotICBCVEFfRE1fUE1fU05JRkYgPSAweDIwLCAgICAgLyogcHJlZmVycyBzbmlmZiBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjEgPSAweDIxLCAgICAvKiBwcmVmZXJzIHNuaWZmMSBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjIgPSAweDIyLCAgICAvKiBwcmVmZXJzIHNuaWZmMiBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjMgPSAweDIzLCAgICAvKiBwcmVmZXJzIHNuaWZmMyBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjQgPSAweDI0LCAgICAvKiBwcmVmZXJzIHNuaWZmNCBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjUgPSAweDI1LCAgICAvKiBwcmVmZXJzIHNuaWZmNSBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjYgPSAweDI2LCAgICAvKiBwcmVmZXJzIHNuaWZmNiBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRjcgPSAweDI3LCAgICAvKiBwcmVmZXJzIHNuaWZmNyBtb2RlICovCi0gIEJUQV9ETV9QTV9TTklGRl9VU0VSMCA9Ci0gICAgICAweDI4LCAvKiBwcmVmZXJzIHVzZXItZGVmaW5lZCBzbmlmZjAgbW9kZSAodGVzdHRvb2wgb25seSkgKi8KLSAgQlRBX0RNX1BNX1NOSUZGX1VTRVIxID0KLSAgICAgIDB4MjksIC8qIHByZWZlcnMgdXNlci1kZWZpbmVkIHNuaWZmMSBtb2RlICh0ZXN0dG9vbCBvbmx5KSAqLwotICBCVEFfRE1fUE1fQUNUSVZFID0gMHg0MCwgIC8qIHByZWZlcnMgYWN0aXZlIG1vZGUgKi8KLSAgQlRBX0RNX1BNX1JFVFJZID0gMHg4MCwgICAvKiByZXRyeSBwb3dlciBtb2RlIGJhc2VkIG9uIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgQlRBX0RNX1BNX1NVU1BFTkQgPSAweDA0LCAvKiBwcmVmZXJzIHN1c3BlbmQgbW9kZSAqLwotICBCVEFfRE1fUE1fTk9fUFJFRiA9IDB4MDEsIC8qIHNlcnZpY2UgaGFzIG5vIHByZWZlcmVuY2Ugb24gcG93ZXIgbW9kZSBzZXR0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVnLiBjb25uZWN0aW9uIHRvIFwgc2VydmljZSBnb3QgY2xvc2VkICovCi0gIEJUQV9ETV9QTV9TTklGRl9NQVNLID0gMHgwZiwgIC8vIE1hc2tzIHRoZSBzbmlmZiBzdWJtb2RlCi19IHRCVEFfRE1fUE1fQUNUSU9OX0JJVE1BU0s7Ci10eXBlZGVmIHVpbnQ4X3QgdEJUQV9ETV9QTV9BQ1RJT047Ci0KLS8qIGluZGV4IHRvIGJ0YV9kbV9zc3Jfc3BlYyAqLwotZW51bSB7Ci0gIEJUQV9ETV9QTV9TU1IwID0gMCwKLSAgLyogQlRBX0RNX1BNX1NTUjEgd2lsbCBiZSBkZWRpY2F0ZWQgZm9yIFwKLSAgICAgSEggU1NSIHNldHRpbmcgZW50cnksIG5vIG90aGVyIHByb2ZpbGUgY2FuIHVzZSBpdCAqLwotICBCVEFfRE1fUE1fU1NSMSA9IDEsCi0gIEJUQV9ETV9QTV9TU1IyID0gMiwKLSAgQlRBX0RNX1BNX1NTUjMgPSAzLAotICBCVEFfRE1fUE1fU1NSNCA9IDQsCi19OwotCi0jZGVmaW5lIEJUQV9ETV9QTV9OVU1fRVZUUyA5Ci0KLSNpZm5kZWYgQlRBX0RNX1BNX1BBUktfSURYCi0jZGVmaW5lIEJUQV9ETV9QTV9QQVJLX0lEWCBcCi0gIDYgLyogdGhlIGFjdHVhbCBpbmRleCB0byBidGFfZG1fcG1fbWRbXSBmb3IgUEFSSyBtb2RlICovCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkZfQTJEUF9JRFgKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX0EyRFBfSURYIEJUQV9ETV9QTV9TTklGRgotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0RNX1BNX1NOSUZGX0hEX0lETEVfSURYCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRl9IRF9JRExFX0lEWCBCVEFfRE1fUE1fU05JRkYyCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkZfU0NPX09QRU5fSURYCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRl9TQ09fT1BFTl9JRFggQlRBX0RNX1BNX1NOSUZGMwotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0RNX1BNX1NOSUZGX0hEX0FDVElWRV9JRFgKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX0hEX0FDVElWRV9JRFggQlRBX0RNX1BNX1NOSUZGNAotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0RNX1BNX1NOSUZGX0hIX09QRU5fSURYCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRl9ISF9PUEVOX0lEWCBCVEFfRE1fUE1fU05JRkYyCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkZfSEhfQUNUSVZFX0lEWAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkZfSEhfQUNUSVZFX0lEWCBCVEFfRE1fUE1fU05JRkYyCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkZfSEhfSURMRV9JRFgKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX0hIX0lETEVfSURYIEJUQV9ETV9QTV9TTklGRjIKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9ETV9QTV9ISF9PUEVOX0RFTEFZCi0jZGVmaW5lIEJUQV9ETV9QTV9ISF9PUEVOX0RFTEFZIDMwMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fSEhfQUNUSVZFX0RFTEFZCi0jZGVmaW5lIEJUQV9ETV9QTV9ISF9BQ1RJVkVfREVMQVkgMzAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9ETV9QTV9ISF9JRExFX0RFTEFZCi0jZGVmaW5lIEJUQV9ETV9QTV9ISF9JRExFX0RFTEFZIDMwMDAwCi0jZW5kaWYKLQotLyogVGhlIFNuaWZmIFBhcmFtZXRlcnMgZGVmaW5lZCBiZWxvdyBtdXN0IGJlIG9yZGVyZWQgZnJvbSBoaWdoZXN0Ci0gKiBsYXRlbmN5IChiaWdnZXN0IGludGVydmFsKSB0byBsb3dlc3QgbGF0ZW5jeS4gIElmIHRoZXJlIGlzIGEgY29uZmxpY3QKLSAqIGFtb25nIHRoZSBjb25uZWN0ZWQgc2VydmljZXMgdGhlIHNldHRpbmcgd2l0aCB0aGUgbG93ZXN0IGxhdGVuY3kgd2lsbAotICogYmUgc2VsZWN0ZWQuICBJZiBhIGRldmljZSBzaG91bGQgb3ZlcnJpZGUgYSBzbmlmZiBwYXJhbWV0ZXIgdGhlbiBpdAotICogbXVzdCBpbnN1cmUgdGhhdCBvcmRlciBpcyBtYWludGFpbmVkLgotICovCi0jaWZuZGVmIEJUQV9ETV9QTV9TTklGRl9NQVgKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX01BWCA4MDAKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX01JTiA0MDAKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGX0FUVEVNUFQgNAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkZfVElNRU9VVCAxCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkYxX01BWAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkYxX01BWCA0MDAKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGMV9NSU4gMjAwCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjFfQVRURU1QVCA0Ci0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjFfVElNRU9VVCAxCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkYyX01BWAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkYyX01BWCA1NAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkYyX01JTiAzMAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkYyX0FUVEVNUFQgNAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkYyX1RJTUVPVVQgMQotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0RNX1BNX1NOSUZGM19NQVgKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGM19NQVggMTUwCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjNfTUlOIDUwCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjNfQVRURU1QVCA0Ci0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjNfVElNRU9VVCAxCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fU05JRkY0X01BWAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkY0X01BWCAxOAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkY0X01JTiAxMAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkY0X0FUVEVNUFQgNAotI2RlZmluZSBCVEFfRE1fUE1fU05JRkY0X1RJTUVPVVQgMQotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0RNX1BNX1NOSUZGNV9NQVgKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGNV9NQVggMzYKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGNV9NSU4gMzAKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGNV9BVFRFTVBUIDIKLSNkZWZpbmUgQlRBX0RNX1BNX1NOSUZGNV9USU1FT1VUIDAKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9ETV9QTV9TTklGRjZfTUFYCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjZfTUFYIDE4Ci0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjZfTUlOIDE0Ci0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjZfQVRURU1QVCAxCi0jZGVmaW5lIEJUQV9ETV9QTV9TTklGRjZfVElNRU9VVCAwCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfRE1fUE1fUEFSS19NQVgKLSNkZWZpbmUgQlRBX0RNX1BNX1BBUktfTUFYIDgwMAotI2RlZmluZSBCVEFfRE1fUE1fUEFSS19NSU4gNDAwCi0jZGVmaW5lIEJUQV9ETV9QTV9QQVJLX0FUVEVNUFQgMAotI2RlZmluZSBCVEFfRE1fUE1fUEFSS19USU1FT1VUIDAKLSNlbmRpZgotCi0vKiBEZXZpY2UgSWRlbnRpZmljYXRpb24gKERJKSBkYXRhIHN0cnVjdHVyZQotKi8KLQotI2lmbmRlZiBCVEFfRElfTlVNX01BWAotI2RlZmluZSBCVEFfRElfTlVNX01BWCAzCi0jZW5kaWYKLQotI2RlZmluZSBJTU1FRElBVEVfREVMWV9NT0RFIDB4MDAKLSNkZWZpbmUgQUxMT1dfQUxMX0ZJTFRFUiAweDAwCi0jZGVmaW5lIExPV0VTVF9SU1NJX1ZBTFVFIDEyOQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEJUQV9kbV9pbml0KCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRW5hYmxlVGVzdE1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZXMgYmx1ZXRvb3RoIGRldmljZSB1bmRlciB0ZXN0IG1vZGUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0QlRBX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRW5hYmxlVGVzdE1vZGUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1TZXREZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIEJsdWV0b290aCBuYW1lIG9mIHRoZSBsb2NhbCBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1TZXREZXZpY2VOYW1lKGNoYXIqIHBfbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1TZXRWaXNpYmlsaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIEJsdWV0b290aCBjb25uZWN0YWJsZSxkaXNjb3ZlcmFibGUsCi0gKiAgICAgICAgICAgICAgICAgIHBhaXJhYmxlIGFuZCBjb25uIHBhaXJlZCBvbmx5IG1vZGVzbW9kZXMgb2YgdGhlIGxvY2FsCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBjb250cm9scyB3aGV0aGVyIG90aGVyIEJsdWV0b290aCBkZXZpY2VzIGNhbiBmaW5kIGFuZAotICogICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBsb2NhbCBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBCVEFfRG1TZXRWaXNpYmlsaXR5KGJ0X3NjYW5fbW9kZV90IG1vZGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtU2VhcmNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBwZWVyIEJsdWV0b290aCBkZXZpY2VzLiAgSXQKLSAqICAgICAgICAgICAgICAgICAgZmlyc3QgcGVyZm9ybXMgYW4gaW5xdWlyeTsgZm9yIGVhY2ggZGV2aWNlIGZvdW5kIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGlucXVpcnkgaXQgZ2V0cyB0aGUgcmVtb3RlIG5hbWUgb2YgdGhlIGRldmljZS4gIElmCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBzZXJ2aWNlcyBpcyBub256ZXJvLCBzZXJ2aWNlIGRpc2NvdmVyeSB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBvbiBlYWNoIGRldmljZSBmb3IgdGhlIHNlcnZpY2VzIHNwZWNpZmllZC4gSWYgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpc19ib25kaW5nX29yX3NkcCBpcyB0cnVlLCB0aGUgcmVxdWVzdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIHF1ZXVlZCB1bnRpbCBib25kaW5nIG9yIHNkcCBjb21wbGV0ZXMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbVNlYXJjaCh0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jYmFjaywgYm9vbCBpc19ib25kaW5nX29yX3NkcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1TZWFyY2hDYW5jZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FuY2VscyBhIHNlYXJjaCB0aGF0IGhhcyBiZWVuIGluaXRpYXRlZAotICogICAgICAgICAgICAgICAgICBieSBjYWxsaW5nIEJUQV9EbVNlYXJjaCgpLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtU2VhcmNoQ2FuY2VsKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtRGlzY292ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgc2VydmljZSBkaXNjb3ZlcnkgZm9yIHRoZSBzZXJ2aWNlcwotICogICAgICAgICAgICAgICAgICBvZiBhIHBhcnRpY3VsYXIgcGVlciBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1EaXNjb3Zlcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBpc19ib25kaW5nX29yX3NkcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1HZXRDYWNoZWRSZW1vdGVOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXRpZXZlIGNhY2hlZCByZW1vdGUgbmFtZSBpZiBhdmFpbGFibGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TVUNDRVNTIGlmIGNhY2hlZCBuYW1lIHdhcyByZXRyaWV2ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRBX0ZBSUxVUkUgaWYgY2FjaGVkIG5hbWUgaXMgbm90IGF2YWlsYWJsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX1NUQVRVUyBCVEFfRG1HZXRDYWNoZWRSZW1vdGVOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBwcF9jYWNoZWRfbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1Cb25kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhIGJvbmRpbmcgcHJvY2VkdXJlIHdpdGggYSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZSBieSBkZXNpZ25hdGVkIHRyYW5zcG9ydC4gIFRoZSBib25kaW5nIHByb2NlZHVyZQotICogICAgICAgICAgICAgICAgICBlbmFibGVzIGF1dGhlbnRpY2F0aW9uIGFuZCBvcHRpb25hbGx5IGVuY3J5cHRpb24gb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIEJsdWV0b290aCBsaW5rLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB0QkxFX0FERFJfVFlQRSBkZXZpY2VfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1Cb25kQ2FuY2VsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbmNlbHMgYSBib25kaW5nIHByb2NlZHVyZSB3aXRoIGEgcGVlcgotICogICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1Cb25kQ2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtUGluUmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQSU4gd2hlbiBvbmUgaXMgcmVxdWVzdGVkIGJ5IERNCi0gKiAgICAgICAgICAgICAgICAgIGR1cmluZyBhIGJvbmRpbmcgcHJvY2VkdXJlLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgdGhlIHNlY3VyaXR5IGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgQlRBX0RNX1BJTl9SRVFfRVZULgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtUGluUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIHVpbnQ4X3QqIHBfcGluKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUxvY2FsT29iCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgT09CIGRhdGEgZnJvbSBsb2NhbCBjb250cm9sbGVyLgotICogICAgICAgICAgICAgICAgICBUaGUgcmVzdWx0IGlzIHJlcG9ydGVkIGJ5IGJ0YV9kbV9jb19sb2Nfb29iKCkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUxvY2FsT29iKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQ29uZmlybQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhY2NlcHRzIG9yIHJlamVjdHMgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgU2ltcGxlIFBhaXJpbmcgcHJvY2VzcyBvbiBCVEFfRE1fU1BfQ0ZNX1JFUV9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQ29uZmlybShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1BZGREZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkcyBhIGRldmljZSB0byB0aGUgc2VjdXJpdHkgZGF0YWJhc2UgbGlzdAotICogICAgICAgICAgICAgICAgICBvZiBwZWVyIGRldmljZXMuIFRoaXMgZnVuY3Rpb24gd291bGQgdHlwaWNhbGx5IGJlIGNhbGxlZAotICogICAgICAgICAgICAgICAgICBhdCBzeXN0ZW0gc3RhcnR1cCB0byBpbml0aWFsaXplIHRoZSBzZWN1cml0eSBkYXRhYmFzZSB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGtub3duIHBlZXIgZGV2aWNlcy4gIFRoaXMgaXMgYSBkaXJlY3QgZXhlY3V0aW9uIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRoYXQgbWF5IGxvY2sgdGFzayBzY2hlZHVsaW5nIG9uIHNvbWUgcGxhdGZvcm1zLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1BZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaW5rS2V5JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW5ndGgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtUmVtb3ZlRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBkZXZpY2UgZnJvbSB0aGUgc2VjdXJpdHkgZGF0YWJhc2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBkaXJlY3QgZXhlY3V0aW9uIGZ1bmN0aW9uIHRoYXQgbWF5IGxvY2sgdGFzawotICogICAgICAgICAgICAgICAgICBzY2hlZHVsaW5nIG9uIHNvbWUgcGxhdGZvcm1zLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9GQUlMIGlmIG9wZXJhdGlvbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QlRBX1NUQVRVUyBCVEFfRG1SZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR2V0RWlyU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IEJUQSBzZXJ2aWNlIG1hc2sgZnJvbSBFSVIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2VpciAtIHBvaW50ZXIgb2YgRUlSIHNpZ25pZmljYW50IHBhcnQKLSAqICAgICAgICAgICAgICAgICAgZWlyX2xlbiAtIEVJUiBsZW5ndGgKLSAqICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlcyAtIHJldHVybiB0aGUgQlRBIHNlcnZpY2UgbWFzawotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR2V0RWlyU2VydmljZShjb25zdCB1aW50OF90KiBwX2Vpciwgc2l6ZV90IGVpcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1NFUlZJQ0VfTUFTSyogcF9zZXJ2aWNlcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1HZXRDb25uZWN0aW9uU3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3RlIGRldmljZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtU2V0TG9jYWxEaVJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGRzIGEgREkgcmVjb3JkIHRvIHRoZSBsb2NhbCBTRFAgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiByZWNvcmQgc2V0IHN1Y2Vzc2Z1bGx5LCBvdGhlcndpc2UgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRCVEFfU1RBVFVTIEJUQV9EbVNldExvY2FsRGlSZWNvcmQodFNEUF9ESV9SRUNPUkQqIHBfZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUNsb3NlQUNMCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGZvcmNlIHRvIGNsb3NlIGFuIEFDTCBjb25uZWN0aW9uIGFuZCByZW1vdmUKLSB0aGUKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlIGZyb20gdGhlIHNlY3VyaXR5IGRhdGFiYXNlIGxpc3Qgb2Yga25vd24gZGV2aWNlcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICByZW1vdmVfZGV2ICAgIC0gcmVtb3ZlIGRldmljZSBvciBub3QgYWZ0ZXIgbGluayBkb3duCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCAgICAgLSB3aGljaCB0cmFuc3BvcnQgdG8gY2xvc2UKLQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQ2xvc2VBQ0woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCByZW1vdmVfZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi0vKiBCTEUgcmVsYXRlZCBBUEkgZnVuY3Rpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQmxlU2VjdXJpdHlHcmFudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR3JhbnQgc2VjdXJpdHkgcmVxdWVzdCBhY2Nlc3MuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgICAgIC0gQkQgYWRkcmVzcyBvZiB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICByZXMgICAgICAgICAgICAgIC0gc2VjdXJpdHkgZ3JhbnQgc3RhdHVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVTZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fQkxFX1NFQ19HUkFOVCByZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQmxlUGFzc2tleVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIEJMRSBTTVAgcGFzc2tleSByZXBseS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGFjY2VwdCAgICAgICAgICAgLSBwYXNza2V5IGVudHJ5IHN1Y2Vzc2Z1bCBvciBkZWNsaW5lZC4KLSAqICAgICAgICAgICAgICAgICAgcGFzc2tleSAgICAgICAgICAtIHBhc3NrZXkgdmFsdWUsIG11c3QgYmUgYSA2IGRpZ2l0IG51bWJlciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZWFkIGJ5IDAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZVBhc3NrZXlSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNza2V5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZUNvbmZpcm1SZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBCTEUgU01QIFNDIHVzZXIgY29uZmlybWF0aW9uIHJlcGx5LgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgYWNjZXB0ICAgICAgICAgICAtIG51bWJlcnMgdG8gY29tcGFyZSBhcmUgdGhlIHNhbWUgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlQ29uZmlybVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUFkZEJsZURldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkIGEgQkxFIGRldmljZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBub3JtYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBmb3IgYSBMRSBkZXZpY2Ugc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldl90eXBlICAgICAgICAgLSBSZW1vdGUgZGV2aWNlJ3MgZGV2aWNlIHR5cGUuCi0gKiAgICAgICAgICAgICAgICAgIGFkZHJfdHlwZSAgICAgICAgLSBMRSBkZXZpY2UgYWRkcmVzcyB0eXBlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1BZGRCbGVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUFkZEJsZUtleQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkL21vZGlmeSBMRSBkZXZpY2UgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgbm9ybWFsbHkgY2FsbGVkIGR1cmluZyBob3N0IHN0YXJ0dXAgdG8gcmVzdG9yZSBhbGwgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVfa2V5ICAgICAgICAgLSBMRSBrZXkgdmFsdWVzLgotICogICAgICAgICAgICAgICAgICBrZXlfdHlwZSAgICAgICAgIC0gTEUgU01QIGtleSB0eXBlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1BZGRCbGVLZXkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHRoZSBwcmVmZXJyZWQgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdoZW4gZGVmYXVsdCBjb25uZWN0aW9uIHBhcmFtZXRlciBpcyBub3QgZGVzaXJlZC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZXJpcGhlcmFsCi0gKiAgICAgICAgICAgICAgICAgIG1pbl9jb25uX2ludCAgICAgLSBtaW5pbXVtIHByZWZlcnJlZCBjb25uZWN0aW9uIGludGVydmFsCi0gKiAgICAgICAgICAgICAgICAgIG1heF9jb25uX2ludCAgICAgLSBtYXhpbXVtIHByZWZlcnJlZCBjb25uZWN0aW9uIGludGVydmFsCi0gKiAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWxfbGF0ZW5jeSAgICAtIHByZWZlcnJlZCBwZXJpcGhlcmFsIGxhdGVuY3kKLSAqICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNpb25fdG91dCAtIHByZWZlcnJlZCBzdXBlcnZpc2lvbiB0aW1lb3V0Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1TZXRFbmNyeXB0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlbnN1cmUgdGhhdCBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZC4gIFNob3VsZCBiZSBjYWxsZWQgb25seSBvbiBhbiBvcGVuIGNvbm5lY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFR5cGljYWxseSBvbmx5IG5lZWRlZCBmb3IgY29ubmVjdGlvbnMgdGhhdCBmaXJzdCB3YW50IHRvCi0gKiAgICAgICAgICAgICAgICAgIGJyaW5nIHVwIHVuZW5jcnlwdGVkIGxpbmtzLCB0aGVuIGxhdGVyIGVuY3J5cHQgdGhlbS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgICAgIC0gdHJhbnNwb3J0IG9mIHRoZSBsaW5rIHRvIGJlIGVuY3J1eXB0ZWQKLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayAgICAtIFBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5kaWNhdCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgZW5jcnlwdGlvbiBzdGF0dXMKLSAqICAgICAgICAgICAgICAgICAgc2VjX2FjdCAgICAgICAtIFRoaXMgaXMgdGhlIHNlY3VyaXR5IGFjdGlvbiB0byBpbmRpY2F0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCBraW5kIG9mIEJMRSBzZWN1cml0eSBsZXZlbCBpcyByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBCTEUgbGluayBpZiBCTEUgaXMgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlIvRURSIG9yIGlmIEJMRSBpcyBub3Qgc3VwcG9ydGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtU2V0RW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQmxlT2JzZXJ2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBwcm9jZWR1cmUga2VlcCB0aGUgZGV2aWNlIGxpc3RlbmluZyBmb3IgYWR2ZXJ0aXNpbmcKLSAqICAgICAgICAgICAgICAgICAgZXZlbnRzIGZyb20gYSBicm9hZGNhc3QgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc3RhcnQ6IHN0YXJ0IG9yIHN0b3Agb2JzZXJ2ZS4KLSAqICAgICAgICAgICAgICAgICAgZHVyYXRpb24gOiBEdXJhdGlvbiBvZiB0aGUgc2Nhbi4gQ29udGludW91cyBzY2FuIGlmIDAgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQKLSAqICAgICAgICAgICAgICAgICAgcF9yZXN1bHRzX2NiOiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2l0aCBzY2FuIHJlc3VsdHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlT2JzZXJ2ZShib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9yZXN1bHRzX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9EbUJsZVNjYW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IG9yIHN0b3AgdGhlIHNjYW4gcHJvY2VkdXJlIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZAotICogICAgICAgICAgICAgICAgICB3aXRoIEJUQV9EbUJsZU9ic2VydmUoKS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHN0YXJ0OiBzdGFydCBvciBzdG9wIHRoZSBzY2FuIHByb2NlZHVyZSwKLSAqICAgICAgICAgICAgICAgICAgZHVyYXRpb25fc2VjOiBEdXJhdGlvbiBvZiB0aGUgc2Nhbi4gQ29udGludW91cyBzY2FuIGlmIDAgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQsCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZVNjYW4oYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVDc2lzT2JzZXJ2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBwcm9jZWR1cmUga2VlcHMgdGhlIGV4dGVybmFsIG9ic2VydmVyIGxpc3RlbmluZyBmb3IKLSAqICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmcgZXZlbnRzIGZyb20gYSBDU0lTIGdyb3VwZWQgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgb2JzZXJ2ZTogZW5hYmxlIG9yIGRpc2FibGUgcGFzc2l2ZSBvYnNlcnZlLAotICogICAgICAgICAgICAgICAgICBwX3Jlc3VsdHNfY2I6IENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aXRoIHNjYW4gcmVzdWx0cywKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0RtQmxlQ3Npc09ic2VydmUoYm9vbCBvYnNlcnZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVDb25maWdMb2NhbFByaXZhY3kKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZS9kaXNhYmxlIHByaXZhY3kgb24gdGhlIGxvY2FsIGRldmljZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcHJpdmFjeV9lbmFibGUgICAtIGVuYWJsZS9kaXNhYmUgcHJpdmFjeSBvbiByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVDb25maWdMb2NhbFByaXZhY3koYm9vbCBwcml2YWN5X2VuYWJsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVFbmFibGVSZW1vdGVQcml2YWN5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGUvZGlzYWJsZSBwcml2YWN5IG9uIGEgcmVtb3RlIGRldmljZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgcHJpdmFjeV9lbmFibGUgICAtIGVuYWJsZS9kaXNhYmUgcHJpdmFjeSBvbiByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVFbmFibGVSZW1vdGVQcml2YWN5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJpdmFjeV9lbmFibGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlIGNvbm5lY3Rpb24gcGFyYW1ldGVycywgY2FuIG9ubHkgYmUgdXNlZCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gaXMgdXAuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIG1pbl9pbnQgICAtIG1pbmltdW0gY29ubmVjdGlvbiBpbnRlcnZhbCwgWzB4MDAwNCB+IDB4NDAwMF0KLSAqICAgICAgICAgICAgICAgICAgbWF4X2ludCAgIC0gbWF4aW11bSBjb25uZWN0aW9uIGludGVydmFsLCBbMHgwMDA0IH4gMHg0MDAwXQotICogICAgICAgICAgICAgICAgICBsYXRlbmN5ICAgLSBwZXJpcGhlcmFsIGxhdGVuY3kgWzAgfiA1MDBdCi0gKiAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAtIHN1cGVydmlzaW9uIHRpbWVvdXQgWzB4MDAwYSB+IDB4YzgwXQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfRG1CbGVVcGRhdGVDb25uZWN0aW9uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0RtQmxlU2V0RGF0YUxlbmd0aAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0byBzZXQgbWF4aW11bSBMRSBkYXRhIHBhY2tldCBzaXplCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZVJlcXVlc3RNYXhUeERhdGFMZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2RldmljZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfRG1CbGVHZXRFbmVyZ3lJbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIGVuZXJneSBpbmZvCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2NtcGxfY2JhY2sgLSBDb21tYW5kIGNvbXBsZXRlIGNhbGxiYWNrCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9EbUJsZUdldEVuZXJneUluZm8odEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfY21wbF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQnJjbUluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgQnJvYWRjb20gc3BlY2lmaWMgVlMgaGFuZGxlciBpbgotICogICAgICAgICAgICAgICAgICBCVEEKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX1ZlbmRvckluaXQodm9pZCk7Ci0KLSNlbmRpZiAvKiBCVEFfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9hcl9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9hcl9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0NDgzYS4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfYXJfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZpbGUgZm9yIHRoZSBzaW11bGF0ZW5vdXMgYWR2YW5jZWQKLSAqICBhdWRpby92aWRlbyBzdHJlYW1pbmcgKEFWKSBzb3VyY2UgYW5kIHNpbmsgb2YgQlRBLCBCcm9hZGNvbSdzIEJsdWV0b290aAotICogIGFwcGxpY2F0aW9uIGxheWVyIGZvciBtb2JpbGUgcGhvbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9BUl9BUElfSAotI2RlZmluZSBCVEFfQVJfQVBJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2ZHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoaXMgZXZlbnQgc2lnbmFsIHRvIEFSIHVzZXIgdGhhdCBvdGhlciBwcm9maWxlIGlzIGNvbm5lY3RlZCAqLwotI2RlZmluZSBCVEFfQVJfQVZEVF9DT05OX0VWVCAoQVZEVF9NQVhfRVZUICsgMSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hcl9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGJ0YV9zeXNfaW5pdCgpLgotICogICAgICAgICAgICAgICAgICB0byBpbml0aWFsaXplIHRoZSBjb250cm9sIGJsb2NrCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hcl9pbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX3JlZ19hdmR0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3RlciB0byBBVkRUUC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2FyX3JlZ19hdmR0KEF2ZHRwUmNiKiBwX3JlZywgdEFWRFRfQ1RSTF9DQkFDSyogcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXJfZGVyZWdfYXZkdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGUtcmVnaXN0ZXIgZnJvbSBBVkRUUC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2FyX2RlcmVnX2F2ZHQoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hcl9hdmR0X2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGxldCBhciBrbm93IHRoYXQgc29tZSBBVkRUUAotICogICAgICAgICAgICAgICAgICBwcm9maWxlIGlzIGNvbm5lY3RlZCBmb3IgdGhpcyBzeXNfaWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBvdGhlciBzeXMgbW9kdWxlcyBzdGFydGVkIGEgdGltZXIgZm9yIFBFTkRJTkdfRVZULAotICogICAgICAgICAgICAgICAgICB0aGUgdGltZXIgY2FuIGJlIHN0b3BwZWQgbm93LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXJfYXZkdF9jb25uKHRCVEFfU1lTX0lEIHN5c19pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2JfaW5kZXgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FyX3JlZ19hdmN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3RlciB0byBBVkNUUC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2FyX3JlZ19hdmN0KCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXJfZGVyZWdfYXZjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVyZWdpc3RlciBmcm9tIEFWQ1RQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXJfZGVyZWdfYXZjdCgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXJfcmVnX2F2cmMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGFuIFNEUCByZWNvcmQgZm9yIEFWUkNQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9hcl9yZWdfYXZyYyh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfcHJvdmlkZXJfbmFtZSwgdWludDE2X3QgY2F0ZWdvcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJyb3dzZV9zdXBwb3J0ZWQsIHVpbnQxNl90IHByb2ZpbGVfdmVyc2lvbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hcl9kZXJlZ19hdnJjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZS1yZWdpc3Rlci9kZWxldGUgYW4gU0RQIHJlY29yZAotICogICAgICAgICAgICAgICAgICBmb3IgQVZSQ1AuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2FyX2RlcmVnX2F2cmModWludDE2X3Qgc2VydmljZV91dWlkKTsKLQotI2VuZGlmIC8qIEJUQV9BUl9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWY4Y2JkLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hdl9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIGFkdmFuY2VkIGF1ZGlvL3ZpZGVvIHN0cmVhbWluZwotICogIChBVikgc3Vic3lzdGVtIG9mIEJUQSwgQnJvYWRjb20ncyBCbHVldG9vdGggYXBwbGljYXRpb24gbGF5ZXIgZm9yIG1vYmlsZQotICogIHBob25lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfQVZfQVBJX0gKLSNkZWZpbmUgQlRBX0FWX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZyY19kZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQVYgc3RhdHVzIHZhbHVlcyAqLwotI2RlZmluZSBCVEFfQVZfU1VDQ0VTUyAwICAgICAgICAvKiBzdWNjZXNzZnVsIG9wZXJhdGlvbiAqLwotI2RlZmluZSBCVEFfQVZfRkFJTCAxICAgICAgICAgICAvKiBnZW5lcmljIGZhaWx1cmUgKi8KLSNkZWZpbmUgQlRBX0FWX0ZBSUxfU0RQIDIgICAgICAgLyogc2VydmljZSBub3QgZm91bmQgKi8KLSNkZWZpbmUgQlRBX0FWX0ZBSUxfU1RSRUFNIDMgICAgLyogc3RyZWFtIGNvbm5lY3Rpb24gZmFpbGVkICovCi0jZGVmaW5lIEJUQV9BVl9GQUlMX1JFU09VUkNFUyA0IC8qIG5vIHJlc291cmNlcyAqLwotI2RlZmluZSBCVEFfQVZfRkFJTF9ST0xFIDUgLyogZmFpbGVkIGR1ZSB0byByb2xlIG1hbmFnZW1lbnQgcmVsYXRlZCBpc3N1ZXMgKi8KLSNkZWZpbmUgQlRBX0FWX0ZBSUxfR0VUX0NBUCBcCi0gIDYgLyogZ2V0IGNhcGFiaWxpdHkgZmFpbGVkIGR1ZSB0byBubyBTRVAgYXZhaWxhbGUgb24gdGhlIHBlZXIgICovCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX1NUQVRVUzsKLQotLyogQVYgZmVhdHVyZXMgbWFza3MgKi8KLSNkZWZpbmUgQlRBX0FWX0ZFQVRfUkNURyAweDAwMDEgICAgLyogcmVtb3RlIGNvbnRyb2wgdGFyZ2V0ICovCi0jZGVmaW5lIEJUQV9BVl9GRUFUX1JDQ1QgMHgwMDAyICAgIC8qIHJlbW90ZSBjb250cm9sIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgQlRBX0FWX0ZFQVRfUFJPVEVDVCAweDAwMDQgLyogc3RyZWFtaW5nIG1lZGlhIGNvbnRlY3QgcHJvdGVjdGlvbiAqLwotI2RlZmluZSBCVEFfQVZfRkVBVF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDggICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW90ZSBjb250cm9sIHZlbmRvciBkZXBlbmRlbnQgY29tbWFuZHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUQV9BVl9GRUFUX1JFUE9SVCAweDAwMjAgLyogdXNlIHJlcG9ydGluZyBzZXJ2aWNlIGZvciBWRFAgKi8KLSNkZWZpbmUgQlRBX0FWX0ZFQVRfTUVUQURBVEEgXAotICAweDAwNDAgLyogcmVtb3RlIGNvbnRyb2wgTWV0YWRhdGEgVHJhbnNmZXIgY29tbWFuZC9yZXNwb25zZSAqLwotI2RlZmluZSBCVEFfQVZfRkVBVF9NVUxUSV9BViBcCi0gIDB4MDA4MCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIG11bHRpLWF2LCBpZiBjb250cm9sbGVyIHN1cHBvcnRzIGl0ICovCi0jZGVmaW5lIEJUQV9BVl9GRUFUX0JST1dTRSAweDAwMTAgLyogdXNlIGJyb3dzaW5nIGNoYW5uZWwgKi8KLSNkZWZpbmUgQlRBX0FWX0ZFQVRfQURWX0NUUkwgXAotICAweDAyMDAgLyogcmVtb3RlIGNvbnRyb2wgQWR2YW5jZWQgQ29udHJvbCBjb21tYW5kL3Jlc3BvbnNlICovCi0jZGVmaW5lIEJUQV9BVl9GRUFUX0RFTEFZX1JQVCAweDA0MDAgLyogYWxsb3cgZGVsYXkgcmVwb3J0aW5nICovCi0jZGVmaW5lIEJUQV9BVl9GRUFUX0FDUF9TVEFSVCBcCi0gIDB4MDgwMCAvKiBzdGFydCBzdHJlYW0gd2hlbiAybmQgU05LIHdhcyBhY2NlcHRlZCAgICovCi0jZGVmaW5lIEJUQV9BVl9GRUFUX0NPVkVSX0FSVFdPUksgMHgxMDAwIC8qIHVzZSBjb3ZlciBhcnQgZmVhdHVyZSAqLwotI2RlZmluZSBCVEFfQVZfRkVBVF9BUFBfU0VUVElORyAweDIwMDAgLyogUGxheWVyIGFwcCBzZXR0aW5nIHN1cHBvcnQgKi8KLQotLyogSW50ZXJuYWwgZmVhdHVyZXMgKi8KLSNkZWZpbmUgQlRBX0FWX0ZFQVRfTk9fU0NPX1NTUEQgXAotICAweDgwMDAgLyogRG8gbm90IHN1c3BlbmQgYXYgc3RyZWFtaW5nIGFzIHRvIEFHIGV2ZW50cyhTQ08gb3IgQ2FsbCkgKi8KLQotdHlwZWRlZiB1aW50MTZfdCB0QlRBX0FWX0ZFQVQ7Ci0KLS8qIEFWIGNoYW5uZWwgdmFsdWVzICovCi0jZGVmaW5lIEJUQV9BVl9DSE5MX01TSyAweEMwCi0jZGVmaW5lIEJUQV9BVl9DSE5MX0FVRElPIDB4NDAgLyogYXVkaW8gY2hhbm5lbCAqLwotI2RlZmluZSBCVEFfQVZfQ0hOTF9WSURFTyAweDgwIC8qIHZpZGVvIGNoYW5uZWwgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX0NITkw7Ci0KLSNkZWZpbmUgQlRBX0FWX0hORExfTVNLIDB4M0YKLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX0hOREw7Ci0vKiBoYW5kbGUgaW5kZXggdG8gbWFzayAqLwotI2RlZmluZSBCVEFfQVZfSE5ETF9UT19NU0soaCkgKCh1aW50OF90KSgxIDw8IChoKSkpCi0KLS8qIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMgY3JlYXRlZCAqLwotI2lmbmRlZiBCVEFfQVZfTlVNX1NUUlMKLSNkZWZpbmUgQlRBX0FWX05VTV9TVFJTIDYKLSNlbmRpZgotCi0vKiBvcGVyYXRpb24gaWQgbGlzdCBmb3IgQlRBX0F2UmVtb3RlQ21kICovCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9BVl9SQzsKLQotLyogc3RhdGUgZmxhZyBmb3IgcGFzcyB0aHJvdWdoIGNvbW1hbmQgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX1NUQVRFOwotCi0vKiBjb21tYW5kIGNvZGVzIGZvciBCVEFfQXZWZW5kb3JDbWQgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX0NNRDsKLQotLyogcmVzcG9uc2UgY29kZXMgZm9yIEJUQV9BdlZlbmRvclJzcCAqLwotdHlwZWRlZiB1aW50OF90IHRCVEFfQVZfQ09ERTsKLQotLyogZXJyb3IgY29kZXMgZm9yIEJUQV9BdlByb3RlY3RSc3AgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX0VSUjsKLQotLyogQVYgY2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIEJUQV9BVl9FTkFCTEVfRVZUIDAgICAgICAvKiBBViBlbmFibGVkICovCi0jZGVmaW5lIEJUQV9BVl9SRUdJU1RFUl9FVlQgMSAgICAvKiByZWdpc3RlcmVkIHRvIEFWRFQgKi8KLSNkZWZpbmUgQlRBX0FWX09QRU5fRVZUIDIgICAgICAgIC8qIGNvbm5lY3Rpb24gb3BlbmVkICovCi0jZGVmaW5lIEJUQV9BVl9DTE9TRV9FVlQgMyAgICAgICAvKiBjb25uZWN0aW9uIGNsb3NlZCAqLwotI2RlZmluZSBCVEFfQVZfU1RBUlRfRVZUIDQgICAgICAgLyogc3RyZWFtIGRhdGEgdHJhbnNmZXIgc3RhcnRlZCAqLwotI2RlZmluZSBCVEFfQVZfU1RPUF9FVlQgNSAgICAgICAgLyogc3RyZWFtIGRhdGEgdHJhbnNmZXIgc3RvcHBlZCAqLwotI2RlZmluZSBCVEFfQVZfUFJPVEVDVF9SRVFfRVZUIDYgLyogY29udGVudCBwcm90ZWN0aW9uIHJlcXVlc3QgKi8KLSNkZWZpbmUgQlRBX0FWX1BST1RFQ1RfUlNQX0VWVCA3IC8qIGNvbnRlbnQgcHJvdGVjdGlvbiByZXNwb25zZSAqLwotI2RlZmluZSBCVEFfQVZfUkNfT1BFTl9FVlQgOCAgICAgLyogcmVtb3RlIGNvbnRyb2wgY2hhbm5lbCBvcGVuICovCi0jZGVmaW5lIEJUQV9BVl9SQ19DTE9TRV9FVlQgOSAgICAvKiByZW1vdGUgY29udHJvbCBjaGFubmVsIGNsb3NlZCAqLwotI2RlZmluZSBCVEFfQVZfUkVNT1RFX0NNRF9FVlQgMTAgLyogcmVtb3RlIGNvbnRyb2wgY29tbWFuZCAqLwotI2RlZmluZSBCVEFfQVZfUkVNT1RFX1JTUF9FVlQgMTEgLyogcmVtb3RlIGNvbnRyb2wgcmVzcG9uc2UgKi8KLSNkZWZpbmUgQlRBX0FWX1ZFTkRPUl9DTURfRVZUIDEyIC8qIHZlbmRvciBkZXBlbmRlbnQgcmVtb3RlIGNvbnRyb2wgY29tbWFuZCAqLwotI2RlZmluZSBCVEFfQVZfVkVORE9SX1JTUF9FVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlbmRvciBkZXBlbmRlbnQgcmVtb3RlIGNvbnRyb2wgcmVzcG9uc2UgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUQV9BVl9SRUNPTkZJR19FVlQgMTQgLyogcmVjb25maWd1cmUgcmVzcG9uc2UgKi8KLSNkZWZpbmUgQlRBX0FWX1NVU1BFTkRfRVZUIDE1ICAvKiBzdXNwZW5kIHJlc3BvbnNlICovCi0jZGVmaW5lIEJUQV9BVl9QRU5ESU5HX0VWVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbWluZyBjb25uZWN0aW9uIHBlbmRpbmc6ICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ25hbCBjaGFubmVsIGlzIG9wZW4gYW5kIHN0cmVhbSBpcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbm90IG9wZW4gYWZ0ZXIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCVEFfQVZfU0lHTkFMTElOR19USU1FT1VUX01TICovCi0jZGVmaW5lIEJUQV9BVl9NRVRBX01TR19FVlQgMTcgLyogbWV0YWRhdGEgbWVzc2FnZXMgKi8KLSNkZWZpbmUgQlRBX0FWX1JFSkVDVF9FVlQgMTggICAvKiBpbmNvbWluZyBjb25uZWN0aW9uIHJlamVjdGVkICovCi0jZGVmaW5lIEJUQV9BVl9SQ19GRUFUX0VWVCBcCi0gIDE5IC8qIHJlbW90ZSBjb250cm9sIGNoYW5uZWwgcGVlciBzdXBwb3J0ZWQgZmVhdHVyZXMgdXBkYXRlICovCi0jZGVmaW5lIEJUQV9BVl9TSU5LX01FRElBX0NGR19FVlQgMjAgICAgLyogY29tbWFuZCB0byBjb25maWd1cmUgY29kZWMgKi8KLSNkZWZpbmUgQlRBX0FWX1NJTktfTUVESUFfREFUQV9FVlQgMjEgICAvKiBzZW5kaW5nIGRhdGEgdG8gTWVkaWEgVGFzayAqLwotI2RlZmluZSBCVEFfQVZfT0ZGTE9BRF9TVEFSVF9SU1BfRVZUIDIyIC8qIGEyZHAgb2ZmbG9hZCBzdGFydCByZXNwb25zZSAqLwotI2RlZmluZSBCVEFfQVZfUkNfQlJPV1NFX09QRU5fRVZUIDIzICAgIC8qIHJlbW90ZSBjb250cm9sIGNoYW5uZWwgb3BlbiAqLwotI2RlZmluZSBCVEFfQVZfUkNfQlJPV1NFX0NMT1NFX0VWVCAyNCAgIC8qIHJlbW90ZSBjb250cm9sIGNoYW5uZWwgY2xvc2VkICovCi0jZGVmaW5lIEJUQV9BVl9SQ19QU01fRVZUIDI1ICAgICAgICAgICAgLyogY292ZXIgYXJ0IHBzbSB1cGRhdGUgKi8KLS8qIE1heCBCVEEgZXZlbnQgKi8KLSNkZWZpbmUgQlRBX0FWX01BWF9FVlQgMjYKLQotdHlwZWRlZiB1aW50OF90IHRCVEFfQVZfRVZUOwotCi10eXBlZGVmIGVudW0gewotICBCVEFfQVZfQ09ERUNfVFlQRV9VTktOT1dOID0gMHgwMCwKLSAgQlRBX0FWX0NPREVDX1RZUEVfU0JDID0gMHgwMSwKLSAgQlRBX0FWX0NPREVDX1RZUEVfQUFDID0gMHgwMiwKLSAgQlRBX0FWX0NPREVDX1RZUEVfQVBUWCA9IDB4MDQsCi0gIEJUQV9BVl9DT0RFQ19UWVBFX0FQVFhIRCA9IDB4MDgsCi0gIEJUQV9BVl9DT0RFQ19UWVBFX0xEQUMgPSAweDEwCi19IHRCVEFfQVZfQ09ERUNfVFlQRTsKLQotLyogRXZlbnQgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9FTkFCTEVfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7IHRCVEFfQVZfRkVBVCBmZWF0dXJlczsgfSB0QlRBX0FWX0VOQUJMRTsKLQotLyogRXZlbnQgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9SRUdJU1RFUl9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BVl9DSE5MIGNobmw7IC8qIGF1ZGlvL3ZpZGVvICovCi0gIHRCVEFfQVZfSE5ETCBobmRsOyAvKiBIYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uICovCi0gIHVpbnQ4X3QgYXBwX2lkOyAgICAvKiBJRCBhc3NvY2lhdGVkIHdpdGggY2FsbCB0byBCVEFfQXZSZWdpc3RlcigpICovCi0gIHRCVEFfQVZfU1RBVFVTIHN0YXR1czsKLX0gdEJUQV9BVl9SRUdJU1RFUjsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX09QRU5fRVZUICovCi0jZGVmaW5lIEJUQV9BVl9FRFJfMk1CUFMgMHgwMQotI2RlZmluZSBCVEFfQVZfRURSXzNNQlBTIDB4MDIKLXR5cGVkZWYgdWludDhfdCB0QlRBX0FWX0VEUjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0FWX0NITkwgY2hubDsKLSAgdEJUQV9BVl9ITkRMIGhuZGw7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdEJUQV9BVl9TVEFUVVMgc3RhdHVzOwotICBib29sIHN0YXJ0aW5nOwotICB0QlRBX0FWX0VEUiBlZHI7IC8qIDAsIGlmIHBlZXIgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRURSICovCi0gIHVpbnQ4X3Qgc2VwOyAgICAgLyogIHNlcCB0eXBlIG9mIHBlZXIgZGV2aWNlICovCi19IHRCVEFfQVZfT1BFTjsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX0NMT1NFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0FWX0NITkwgY2hubDsKLSAgdEJUQV9BVl9ITkRMIGhuZGw7Ci19IHRCVEFfQVZfQ0xPU0U7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9TVEFSVF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BVl9DSE5MIGNobmw7Ci0gIHRCVEFfQVZfSE5ETCBobmRsOwotICB0QlRBX0FWX1NUQVRVUyBzdGF0dXM7Ci0gIGJvb2wgaW5pdGlhdG9yOyAvKiB0cnVlLCBpZiBsb2NhbCBkZXZpY2UgaW5pdGlhdGVzIHRoZSBTVEFSVCAqLwotICBib29sIHN1c3BlbmRpbmc7Ci19IHRCVEFfQVZfU1RBUlQ7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9TVVNQRU5EX0VWVCwgQlRBX0FWX1NUT1BfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfQVZfQ0hOTCBjaG5sOwotICB0QlRBX0FWX0hOREwgaG5kbDsKLSAgYm9vbCBpbml0aWF0b3I7IC8qIHRydWUsIGlmIGxvY2FsIGRldmljZSBpbml0aWF0ZXMgdGhlIFNVU1BFTkQgKi8KLSAgdEJUQV9BVl9TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0FWX1NVU1BFTkQ7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9SRUNPTkZJR19FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BVl9DSE5MIGNobmw7Ci0gIHRCVEFfQVZfSE5ETCBobmRsOwotICB0QlRBX0FWX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfQVZfUkVDT05GSUc7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9QUk9URUNUX1JFUV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9BVl9DSE5MIGNobmw7Ci0gIHRCVEFfQVZfSE5ETCBobmRsOwotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQxNl90IGxlbjsKLX0gdEJUQV9BVl9QUk9URUNUX1JFUTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1BST1RFQ1RfUlNQX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0FWX0NITkwgY2hubDsKLSAgdEJUQV9BVl9ITkRMIGhuZGw7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgdWludDE2X3QgbGVuOwotICB0QlRBX0FWX0VSUiBlcnJfY29kZTsKLX0gdEJUQV9BVl9QUk9URUNUX1JTUDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JDX09QRU5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB1aW50MTZfdCBjb3Zlcl9hcnRfcHNtOwotICB0QlRBX0FWX0ZFQVQgcGVlcl9mZWF0dXJlczsKLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7Ci0gIHRCVEFfQVZfU1RBVFVTIHN0YXR1czsKLX0gdEJUQV9BVl9SQ19PUEVOOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfUkNfQ0xPU0VfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICBSYXdBZGRyZXNzIHBlZXJfYWRkcjsKLX0gdEJUQV9BVl9SQ19DTE9TRTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JDX0JST1dTRV9PUEVOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHJjX2hhbmRsZTsKLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7Ci0gIHRCVEFfQVZfU1RBVFVTIHN0YXR1czsKLX0gdEJUQV9BVl9SQ19CUk9XU0VfT1BFTjsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JDX0JST1dTRV9DTE9TRV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCByY19oYW5kbGU7Ci0gIFJhd0FkZHJlc3MgcGVlcl9hZGRyOwotfSB0QlRBX0FWX1JDX0JST1dTRV9DTE9TRTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JDX0ZFQVRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB0QlRBX0FWX0ZFQVQgcGVlcl9mZWF0dXJlczsKLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7Ci19IHRCVEFfQVZfUkNfRkVBVDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JDX1BTTV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCByY19oYW5kbGU7Ci0gIHVpbnQxNl90IGNvdmVyX2FydF9wc207Ci0gIFJhd0FkZHJlc3MgcGVlcl9hZGRyOwotfSB0QlRBX0FWX1JDX1BTTTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JFTU9URV9DTURfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB0QlRBX0FWX1JDIHJjX2lkOwotICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZTsKLSAgdWludDhfdCBsZW47Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgdEFWUkNfSERSIGhkcjsgLyogTWVzc2FnZSBoZWFkZXIuICovCi0gIHVpbnQ4X3QgbGFiZWw7Ci19IHRCVEFfQVZfUkVNT1RFX0NNRDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0FWX1JFTU9URV9SU1BfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB0QlRBX0FWX1JDIHJjX2lkOwotICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZTsKLSAgdWludDhfdCBsZW47Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgdEJUQV9BVl9DT0RFIHJzcF9jb2RlOwotICB1aW50OF90IGxhYmVsOwotfSB0QlRBX0FWX1JFTU9URV9SU1A7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9WRU5ET1JfQ01EX0VWVCwgQlRBX0FWX1ZFTkRPUl9SU1BfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB1aW50MTZfdCBsZW47IC8qIE1heCB2ZW5kb3IgZGVwZW5kZW50IG1lc3NhZ2UgaXMgNTEyICovCi0gIHVpbnQ4X3QgbGFiZWw7Ci0gIHRCVEFfQVZfQ09ERSBjb2RlOwotICB1aW50MzJfdCBjb21wYW55X2lkOwotICB1aW50OF90KiBwX2RhdGE7Ci19IHRCVEFfQVZfVkVORE9SOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfTUVUQV9NU0dfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QgbGFiZWw7Ci0gIHRCVEFfQVZfQ09ERSBjb2RlOwotICB1aW50MzJfdCBjb21wYW55X2lkOwotICB1aW50OF90KiBwX2RhdGE7Ci0gIHRBVlJDX01TRyogcF9tc2c7Ci19IHRCVEFfQVZfTUVUQV9NU0c7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BVl9QRU5ESU5HX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgeyBSYXdBZGRyZXNzIGJkX2FkZHI7IH0gdEJUQV9BVl9QRU5EOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfQVZfUkVKRUNUX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVEFfQVZfSE5ETCBobmRsOyAvKiBIYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0gdGhhdCByZWplY3RlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICovCi19IHRCVEFfQVZfUkVKRUNUOwotCi0vKiB1bmlvbiBvZiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBBViBjYWxsYmFjayAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHRCVEFfQVZfQ0hOTCBjaG5sOwotICB0QlRBX0FWX0VOQUJMRSBlbmFibGU7Ci0gIHRCVEFfQVZfUkVHSVNURVIgcmVnaXN0cjsKLSAgdEJUQV9BVl9PUEVOIG9wZW47Ci0gIHRCVEFfQVZfQ0xPU0UgY2xvc2U7Ci0gIHRCVEFfQVZfU1RBUlQgc3RhcnQ7Ci0gIHRCVEFfQVZfUFJPVEVDVF9SRVEgcHJvdGVjdF9yZXE7Ci0gIHRCVEFfQVZfUFJPVEVDVF9SU1AgcHJvdGVjdF9yc3A7Ci0gIHRCVEFfQVZfUkNfT1BFTiByY19vcGVuOwotICB0QlRBX0FWX1JDX0NMT1NFIHJjX2Nsb3NlOwotICB0QlRBX0FWX1JDX0JST1dTRV9PUEVOIHJjX2Jyb3dzZV9vcGVuOwotICB0QlRBX0FWX1JDX0JST1dTRV9DTE9TRSByY19icm93c2VfY2xvc2U7Ci0gIHRCVEFfQVZfUkVNT1RFX0NNRCByZW1vdGVfY21kOwotICB0QlRBX0FWX1JFTU9URV9SU1AgcmVtb3RlX3JzcDsKLSAgdEJUQV9BVl9WRU5ET1IgdmVuZG9yX2NtZDsKLSAgdEJUQV9BVl9WRU5ET1IgdmVuZG9yX3JzcDsKLSAgdEJUQV9BVl9SRUNPTkZJRyByZWNvbmZpZzsKLSAgdEJUQV9BVl9TVVNQRU5EIHN1c3BlbmQ7Ci0gIHRCVEFfQVZfUEVORCBwZW5kOwotICB0QlRBX0FWX01FVEFfTVNHIG1ldGFfbXNnOwotICB0QlRBX0FWX1JFSkVDVCByZWplY3Q7Ci0gIHRCVEFfQVZfUkNfRkVBVCByY19mZWF0OwotICB0QlRBX0FWX1JDX1BTTSByY19jb3Zlcl9hcnRfcHNtOwotICB0QlRBX0FWX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfQVY7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCogY29kZWNfaW5mbzsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotfSB0QlRBX0FWS19DT05GSUc7Ci0KLS8qIHVuaW9uIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFWIE1lZGlhIGNhbGxiYWNrICovCi10eXBlZGVmIHVuaW9uIHsKLSAgQlRfSERSKiBwX2RhdGE7Ci0gIHRCVEFfQVZLX0NPTkZJRyBhdmtfY29uZmlnOwotfSB0QlRBX0FWX01FRElBOwotCi0jZGVmaW5lIEJUQV9HUk9VUF9OQVZJX01TR19PUF9EQVRBX0xFTiA1Ci0KLS8qIEFWIGNhbGxiYWNrICovCi10eXBlZGVmIHZvaWQodEJUQV9BVl9DQkFDSykodEJUQV9BVl9FVlQgZXZlbnQsIHRCVEFfQVYqIHBfZGF0YSk7Ci10eXBlZGVmIHZvaWQodEJUQV9BVl9TSU5LX0RBVEFfQ0JBQ0spKGNvbnN0IFJhd0FkZHJlc3MmLCB0QlRBX0FWX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9NRURJQSogcF9kYXRhKTsKLQotLyogdHlwZSBmb3Igc3RyZWFtIHN0YXRlIG1hY2hpbmUgYWN0aW9uIGZ1bmN0aW9ucyAqLwotc3RydWN0IHRCVEFfQVZfU0NCOwotdW5pb24gdEJUQV9BVl9EQVRBOwotdHlwZWRlZiB2b2lkICgqdEJUQV9BVl9BQ1QpKHRCVEFfQVZfU0NCKiBwX2NiLCB0QlRBX0FWX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIEFWIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IGNvbXBhbnlfaWQ7ICAvKiBBVlJDUCBDb21wYW55IElEICovCi0gIHVpbnQxNl90IGF2cmNfY3RfY2F0OyAvKiBBVlJDUCBjb250cm9sbGVyIGNhdGVnb3JpZXMgKi8KLSAgdWludDE2X3QgYXZyY190Z19jYXQ7IC8qIEFWUkNQIHRhcmdldCBjYXRlZ29yaWVzICovCi0gIHVpbnQxNl90IGF1ZGlvX21xczsgICAgICAvKiBBVkRUUCBhdWRpbyBjaGFubmVsIG1heCBkYXRhIHF1ZXVlIHNpemUgKi8KLSAgYm9vbCBhdnJjX2dyb3VwOyAgICAgLyogdHJ1ZSwgdG8gYWNjZXB0IEFWUkMgMS4zIGdyb3VwIG5ldmlnYXRpb24gY29tbWFuZCAqLwotICB1aW50OF90IG51bV9jb19pZHM7ICAvKiBjb21wYW55IGlkIGNvdW50IGluIHBfbWV0YV9jb19pZHMgKi8KLSAgdWludDhfdCBudW1fZXZ0X2lkczsgLyogZXZlbnQgaWQgY291bnQgaW4gcF9tZXRhX2V2dF9pZHMgKi8KLSAgdEJUQV9BVl9DT0RFCi0gICAgICByY19wYXNzX3JzcDsgLyogdGhlIGRlZmF1bHQgcmVzcG9uc2UgY29kZSBmb3IgcGFzcyB0aHJvdWdoIGNvbW1hbmRzICovCi0gIGNvbnN0IHVpbnQzMl90KgotICAgICAgcF9tZXRhX2NvX2lkczsgLyogdGhlIG1ldGFkYXRhIEdldCBDYXBhYmlsaXRpZXMgcmVzcG9uc2UgZm9yIGNvbXBhbnkgaWQgKi8KLSAgY29uc3QgdWludDhfdCogcF9tZXRhX2V2dF9pZHM7IC8qIHRoZSB0aGUgbWV0YWRhdGEgR2V0IENhcGFiaWxpdGllcyByZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV2ZW50IGlkICovCi0gIGNoYXIgYXZyY19jb250cm9sbGVyX25hbWVbQlRBX1NFUlZJQ0VfTkFNRV9MRU5dOyAvKiBEZWZhdWx0IEFWUkNQIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKi8KLSAgY2hhciBhdnJjX3RhcmdldF9uYW1lW0JUQV9TRVJWSUNFX05BTUVfTEVOXTsgLyogRGVmYXVsdCBBVlJDUCB0YXJnZXQgbmFtZSovCi19IHRCVEFfQVZfQ0ZHOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2RW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGUgdGhlIGFkdmFuY2VkIGF1ZGlvL3ZpZGVvIHNlcnZpY2UuIFdoZW4gdGhlIGVuYWJsZQotICogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gaXMgY29tcGxldGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggYSBCVEFfQVZfRU5BQkxFX0VWVC4gVGhpcyBmdW5jdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZnVuY3Rpb24gaW4gdGhlIEFWIEFQSSBhcmUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdkVuYWJsZSh0QlRBX0FWX0ZFQVQgZmVhdHVyZXMsIHRCVEFfQVZfQ0JBQ0sqIHBfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2RGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzYWJsZSB0aGUgYWR2YW5jZWQgYXVkaW8vdmlkZW8gc2VydmljZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2RGlzYWJsZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlciB0aGUgYXVkaW8gb3IgdmlkZW8gc2VydmljZSB0byBzdGFjay4gV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0FWX1JFR0lTVEVSX0VWVC4gVGhpcyBmdW5jdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBiZWZvcmUgQVZEVCBzdHJlYW0gaXMgb3Blbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UmVnaXN0ZXIodEJUQV9BVl9DSE5MIGNobmwsIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCwgdEJUQV9BVl9TSU5LX0RBVEFfQ0JBQ0sqIHBfc2lua19kYXRhX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2RGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVyZWdpc3RlciB0aGUgYXVkaW8gb3IgdmlkZW8gc2VydmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdkRlcmVnaXN0ZXIodEJUQV9BVl9ITkRMIGhuZGwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2T3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbnMgYW4gYWR2YW5jZWQgYXVkaW8vdmlkZW8gY29ubmVjdGlvbiB0byBhIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBXaGVuIGNvbm5lY3Rpb24gaXMgb3BlbiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIEJUQV9BVl9PUEVOX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZPcGVuKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfQVZfSE5ETCBoYW5kbGUsIGJvb2wgdXNlX3JjLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2Q2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIHRoZSBjdXJyZW50IHN0cmVhbXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2Q2xvc2UodEJUQV9BVl9ITkRMIGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZEaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZEaXNjb25uZWN0KHRCVEFfQVZfSE5ETCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2U3RhcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IGF1ZGlvL3ZpZGVvIHN0cmVhbSBkYXRhIHRyYW5zZmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlN0YXJ0KHRCVEFfQVZfSE5ETCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2U3RvcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RvcCBhdWRpby92aWRlbyBzdHJlYW0gZGF0YSB0cmFuc2Zlci4KLSAqICAgICAgICAgICAgICAgICAgSWYgc3VzcGVuZCBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNlbmRzIEFWRFQgc3VzcGVuZCBzaWduYWwKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIGNvbm5lY3RlZCBwZWVyKHMpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlN0b3AodEJUQV9BVl9ITkRMIGhhbmRsZSwgYm9vbCBzdXNwZW5kKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlJlY29uZmlnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWNvbmZpZ3VyZSB0aGUgYXVkaW8vdmlkZW8gc3RyZWFtLgotICogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gdHJpZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHN1c3BlbmQvcmVjb25maWd1cmUgcHJvY2VkdXJlIGZpcnN0LgotICogICAgICAgICAgICAgICAgICBJZiBzdXNwZW5kIGlzIGZhbHNlIG9yIHdoZW4gc3VzcGVuZC9yZWNvbmZpZ3VyZSBmYWlscywKLSAqICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBjbG9zZXMgYW5kIHJlLW9wZW5zIHRoZSBBVkRUIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UmVjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIGJvb2wgc3VzcGVuZCwgdWludDhfdCBzZXBfaW5mb19pZHgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfY29kZWNfaW5mbywgdWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2UHJvdGVjdFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIGNvbnRlbnQgcHJvdGVjdGlvbiByZXF1ZXN0LiAgVGhpcyBmdW5jdGlvbiBjYW4gb25seQotICogICAgICAgICAgICAgICAgICBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aCBmZWF0dXJlIEJUQV9BVl9GRUFUX1BST1RFQ1QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2UHJvdGVjdFJlcSh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2UHJvdGVjdFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIGNvbnRlbnQgcHJvdGVjdGlvbiByZXNwb25zZS4gIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgaWYgYSBCVEFfQVZfUFJPVEVDVF9SRVFfRVZUIGlzIHJlY2VpdmVkLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaWYgQVYgaXMgZW5hYmxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGZlYXR1cmUgQlRBX0FWX0ZFQVRfUFJPVEVDVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZQcm90ZWN0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCB1aW50OF90IGVycm9yX2NvZGUsIHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2UmVtb3RlQ21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgcmVtb3RlIGNvbnRyb2wgY29tbWFuZC4gIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgYmUgdXNlZCBpZiBBViBpcyBlbmFibGVkIHdpdGggZmVhdHVyZSBCVEFfQVZfRkVBVF9SQ0NULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdlJlbW90ZUNtZCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9SQyByY19pZCwKLSAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfU1RBVEUga2V5X3N0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlJlbW90ZVZlbmRvclVuaXF1ZUNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgd2l0aCBWZW5kb3IgVW5pcXVlIHJjX2lkLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaWYgQVYgaXMgZW5hYmxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGZlYXR1cmUgQlRBX0FWX0ZFQVRfUkNDVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZSZW1vdGVWZW5kb3JVbmlxdWVDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSwgdWludDhfdCogcF9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zl9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2VmVuZG9yQ21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgdmVuZG9yIGRlcGVuZGVudCByZW1vdGUgY29udHJvbCBjb21tYW5kLiAgVGhpcwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aCBmZWF0dXJlCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9BVl9GRUFUX1ZFTkRPUi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQXZWZW5kb3JDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BdlZlbmRvclJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHZlbmRvciBkZXBlbmRlbnQgcmVtb3RlIGNvbnRyb2wgcmVzcG9uc2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaWYgYSBCVEFfQVZfVkVORE9SX0NNRF9FVlQKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVjZWl2ZWQuIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpZiBBViBpcwotICogICAgICAgICAgICAgICAgICBlbmFibGVkIHdpdGggZmVhdHVyZSBCVEFfQVZfRkVBVF9WRU5ET1IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2VmVuZG9yUnNwKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgdWludDMyX3QgY29tcGFueV9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZPcGVuUmMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE9wZW4gYW4gQVZSQ1AgY29ubmVjdGlvbiB0b3dhcmQgdGhlIGRldmljZSB3aXRoIHRoZQotICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaGFuZGxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T3BlblJjKHRCVEFfQVZfSE5ETCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2Q2xvc2VSYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgYW4gQVZSQ1AgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9BdkNsb3NlUmModWludDhfdCByY19oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2TWV0YVJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIE1ldGFkYXRhIGNvbW1hbmQvcmVzcG9uc2UuIFRoZSBtZXNzYWdlIGNvbnRhaW5lZAotICogICAgICAgICAgICAgICAgICBpbiBwX3BrdCBjYW4gYmUgY29tcG9zZWQgd2l0aCBBVlJDIHV0aWxpdHkgZnVuY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaWYgQVYgaXMgZW5hYmxlZCB3aXRoIGZlYXR1cmUKLSAqICAgICAgICAgICAgICAgICAgQlRBX0FWX0ZFQVRfTUVUQURBVEEuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2TWV0YVJzcCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9DT0RFIHJzcF9jb2RlLAotICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0F2TWV0YUNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIE1ldGFkYXRhL0FkdmFuY2VkIENvbnRyb2wgY29tbWFuZC4gVGhlIG1lc3NhZ2UKLSpjb250YWluZWQKLSAqICAgICAgICAgICAgICAgICAgaW4gcF9wa3QgY2FuIGJlIGNvbXBvc2VkIHdpdGggQVZSQyB1dGlsaXR5IGZ1bmN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGlmIEFWIGlzIGVuYWJsZWQgd2l0aCBmZWF0dXJlCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9BVl9GRUFUX01FVEFEQVRBLgotICogICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgaXMgc2VudCBvbmx5IHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgdGhlIFRHCi0qcm9sZS4KLSo4ICAgICAgICAgICAgICAgICAgVGhlIG9ubHkgY29tbWFuZCBtYWtlcyBzZW5zZSByaWdodCBub3cgaXMgdGhlIGFic29sdXRlCi0qdm9sdW1lIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2TWV0YUNtZCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9DTUQgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQXZPZmZsb2FkU3RhcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlcXVlc3QgU3RhcnRpbmcgb2YgQTJEUCBPZmZsb2FkLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgQTJEUCBvZmZsb2FkIGlmIHZlbmRvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgaGFzIHRoZSBmZWF0dXJlIGVuYWJsZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T2ZmbG9hZFN0YXJ0KHRCVEFfQVZfSE5ETCBobmRsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9Bdk9mZmxvYWRTdGFydFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzcG9uc2UgZnJvbSB2ZW5kb3IgbGlicmFyeSBpbmRpY2F0aW5nIHJlc3BvbnNlIGZvcgotICogICAgICAgICAgICAgICAgICBPZmZsb2FkU3RhcnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0F2T2ZmbG9hZFN0YXJ0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCB0QlRBX0FWX1NUQVRVUyBzdGF0dXMpOwotCi0vKioKLSAqIE9idGFpbiB0aGUgQ2hhbm5lbCBJbmRleCBmb3IgYSBwZWVyLgotICogSWYgdGhlIHBlZXIgYWxyZWFkeSBoYXMgYXNzb2NpYXRlZCBpbnRlcm5hbCBzdGF0ZSwgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIENoYW5uZWwgSW5kZXggZm9yIHRoYXQgc3RhdGUgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIENoYW5uZWwgSW5kZXgKLSAqIGZvciB1bnVzZWQgaW50ZXJuYWwgc3RhdGUgaXMgcmV0dXJuZWQgaW5zdGVhZC4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAqIEByZXR1cm4gdGhlIHBlZXIgQ2hhbm5lbCBJbmRleCBpbmRleCBpZiBvYnRhaW5lZCwgb3RoZXJ3aXNlIC0xCi0gKi8KLWludCBCVEFfQXZPYnRhaW5QZWVyQ2hhbm5lbEluZGV4KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogRHVtcCBkZWJ1Zy1yZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgQlRBIEFWIG1vZHVsZS4KLSAqCi0gKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgZm9yIHdyaXRpbmcgdGhlIEFTQ0lJIGZvcm1hdHRlZAotICogaW5mb3JtYXRpb24KLSAqLwotdm9pZCBidGFfZGVidWdfYXZfZHVtcChpbnQgZmQpOwotCi0jZW5kaWYgLyogQlRBX0FWX0FQSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfYXZfY2kuaCBiL2J0YS9pbmNsdWRlL2J0YV9hdl9jaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWRiYTQ2Li4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9hdl9jaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZmlsZSBmb3IgYWR2YW5jZWQgYXVkaW8vdmlkZW8gY2FsbC1pbiBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX0FWX0NJX0gKLSNkZWZpbmUgQlRBX0FWX0NJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXZfYXBpLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NpX3NyY19kYXRhX3JlYWR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIGV2ZW50IHRvIHRoZSBBViBpbmRpY2F0aW5nIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgdGhlIHBob25lIGhhcyBhdWRpbyBzdHJlYW0gZGF0YSByZWFkeSB0byBzZW5kIGFuZCBBVgotICogICAgICAgICAgICAgICAgICBzaG91bGQgY2FsbCBidGFfYXZfY29fYXVkaW9fc291cmNlX2RhdGFfcGF0aCgpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfYXZfY2lfc3JjX2RhdGFfcmVhZHkodEJUQV9BVl9DSE5MIGNobmwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NpX3NldGNvbmZpZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiByZXNwb25zZSB0byBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBidGFfYXZfY29fYXVkaW9fc2V0Y29uZmlnKCkuCi0gKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBlcnJfY29kZSBpcyBzZXQgdG8gYW4gQVZEVFAgc3RhdHVzIHZhbHVlOwotICogICAgICAgICAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gaXMgb2ssCi0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2F2X2NpX3NldGNvbmZpZyh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwgdWludDhfdCBlcnJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjYXRlZ29yeSwgdWludDhfdCBudW1fc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zZWlkLCBib29sIHJlY2ZnX25lZWRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhdmR0X2hhbmRsZSk7Ci0KLSNlbmRpZiAvKiBCVEFfQVZfQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2F2X2NvLmggYi9idGEvaW5jbHVkZS9idGFfYXZfY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhNzE1Ny4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfYXZfY28uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmaWxlIGZvciBhZHZhbmNlZCBhdWRpbyBjYWxsLW91dCBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX0FWX0NPX0gKLSNkZWZpbmUgQlRBX0FWX0NPX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXZfYXBpLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9hdi5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYTJkcF9lcnJvcl9jb2Rlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyBhbmQgZGF0YSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29fYXVkaW9faW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IEFWIHdoZW4gaXQgaXMKLSAqICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSBjYWxsaW5nIEJUQV9BdkVuYWJsZSgpLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUKLSAqICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgcGhvbmUgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwYXRocyBvciBmb3Igb3RoZXIKLSAqICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gcHVycG9zZXMuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgU3RyZWFtIGNvZGVjIGFuZCBjb250ZW50IHByb3RlY3Rpb24gY2FwYWJpbGl0aWVzIGluZm8uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2F2X2NvX2F1ZGlvX2luaXQoYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29fYXVkaW9fZGlzY19yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBBViB0byByZXBvcnQgdGhlCi0gKiAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzdHJlYW0gZW5kIHBvaW50cyAoU0VQKSB3ZXJlIGZvdW5kIGR1cmluZyB0aGUKLSAqICAgICAgICAgICAgICAgICAgQVZEVCBzdHJlYW0gZGlzY292ZXJ5IHByb2Nlc3MuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfY29fYXVkaW9fZGlzY19yZXModEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQ4X3QgbnVtX3NlcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zaW5rcywgdWludDhfdCBudW1fc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWRfbG9jYWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NvX2F1ZGlvX2dldGNvbmZpZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IEFWIHRvIHJldHJpZXZlIHRoZQotICogICAgICAgICAgICAgICAgICBkZXNpcmVkIGNvZGVjIGFuZCBjb250ZW50IHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBTdHJlYW0gY29kZWMgYW5kIGNvbnRlbnQgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uIGluZm8uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBMkRQX1NUQVRVUyBidGFfYXZfY29fYXVkaW9fZ2V0Y29uZmlnKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zZXBfaW5mb19pZHgsIHVpbnQ4X3Qgc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Byb3RlY3RfaW5mbyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29fYXVkaW9fc2V0Y29uZmlnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgQVYgdG8gc2V0IHRoZQotICogICAgICAgICAgICAgICAgICBjb2RlYyBhbmQgY29udGVudCBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvCi0gKiAgICAgICAgICAgICAgICAgIHN0cmVhbS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2NvX2F1ZGlvX3NldGNvbmZpZyh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCB1aW50OF90IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3Byb3RlY3RfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRfbG9jYWxfc2VwLCB1aW50OF90IGF2ZHRfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBViB3aGVuIHRoZSBhdWRpbyBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBpcyBvcGVuZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQS1BViBtYWludGFpbnMgdGhlIE1UVSBvZiBBMkRQIHN0cmVhbXMuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgdGhlIDJuZCBhdWRpbyBzdHJlYW0sIG10dSBpcyB0aGUgc21hbGxlciBvZiB0aGUgMgotICogICAgICAgICAgICAgICAgICBzdHJlYW1zLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb19hdWRpb19vcGVuKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IG10dSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29fYXVkaW9fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEFWIHdoZW4gdGhlIGF1ZGlvIHN0cmVhbQotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBLUFWIG1haW50YWlucyB0aGUgTVRVIG9mIEEyRFAgc3RyZWFtcy4KLSAqICAgICAgICAgICAgICAgICAgV2hlbiBvbmUgc3RyZWFtIGlzIGNsb3NlZCBhbmQgbm8gb3RoZXIgYXVkaW8gc3RyZWFtIGlzIG9wZW4sCi0gKiAgICAgICAgICAgICAgICAgIG10dSBpcyByZXBvcnRlZCBhcyAwLgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBNVFUgcmVtYWlucyBvcGVuIGlzIHJlcG9ydGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb19hdWRpb19jbG9zZSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29fYXVkaW9fc3RhcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEFWIHdoZW4gdGhlIGF1ZGlvIHN0cmVhbWluZyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIGlzIHN0YXJ0ZWQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb19hdWRpb19zdGFydCh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywgYm9vbCogcF9ub19ydHBfaGVhZGVyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19zdG9wCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBViB3aGVuIHRoZSBhdWRpbyBzdHJlYW1pbmcgZGF0YQotICogICAgICAgICAgICAgICAgICB0cmFuc2ZlciBpcyBzdG9wcGVkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfYXZfY29fYXVkaW9fc3RvcCh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hdl9jb19hdWRpb19zb3VyY2VfZGF0YV9wYXRoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIG5leHQgZGF0YSBidWZmZXIgZnJvbQotICogICAgICAgICAgICAgICAgICB0aGUgYXVkaW8gY29kZWMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5VTEwgaWYgZGF0YSBpcyBub3QgcmVhZHkuCi0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgYSBidWZmZXIgKEJUX0hEUiopIGNvbnRhaW5pbmcgdGhlIGF1ZGlvIGRhdGEuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJUX0hEUiogYnRhX2F2X2NvX2F1ZGlvX3NvdXJjZV9kYXRhX3BhdGgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF90aW1lc3RhbXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NvX2F1ZGlvX2Ryb3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFuIEF1ZGlvIHBhY2tldCBpcyBkcm9wcGVkLgotICogICAgICAgICAgICAgICAgICBJdCdzIHZlcnkgbGlrZWx5IHRoYXQgdGhlIGNvbm5lY3RlZCBoZWFkc2V0IHdpdGggdGhpcyBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgaXMgbW92ZWQgZmFyIGF3YXkuIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgd2FudCB0byByZWR1Y2UKLSAqICAgICAgICAgICAgICAgICAgdGhlIGVuY29kZXIgYml0IHJhdGUgc2V0dGluZyB0byByZWR1Y2UgdGhlIHBhY2tldCBzaXplLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb19hdWRpb19kcm9wKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2F2X2NvX2F1ZGlvX2RlbGF5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBViB3aGVuIHRoZSBhdWRpbyBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBuZWVkcyB0byBzZW5kIHRoZSBpbml0aWFsIGRlbGF5IHJlcG9ydCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIFNSQy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2F2X2NvX2F1ZGlvX2RlbGF5KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50MTZfdCBkZWxheSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfYXZfY29fYXVkaW9fdXBkYXRlX210dQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQVYgd2hlbiB0aGUgYXVkaW8gc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gTVRVIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQS1BViBtYWludGFpbnMgdGhlIE1UVSBvZiBBMkRQIHN0cmVhbXMuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgdGhlIDJuZCBhdWRpbyBzdHJlYW0sIG10dSBpcyB0aGUgc21hbGxlciBvZiB0aGUgMgotICogICAgICAgICAgICAgICAgICBzdHJlYW1zLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hdl9jb19hdWRpb191cGRhdGVfbXR1KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IG10dSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioKLSAqKiBGdW5jdGlvbiAgICAgICAgYnRhX2F2X2NvX2dldF9zY21zdF9pbmZvCi0gKioKLSAqKiBEZXNjcmlwdGlvbiAgICAgR2V0IHRoZSBTQ01TLVQgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpYyBwZWVyCi0gKioKLSAqKiBSZXR1cm5zICAgICAgICAgYnRhdl9hMmRwX3NjbXN0X2luZm9fdC4KLSAqKiAgICAgICAgICAgICAgICAgSXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIG9mIFNDTVMtVCB3aGljaCBhcmUgdGhlIFNDTVMtVAotICoqICAgICAgICAgICAgICAgICBlbmFibGUgc3RhdHVzIGZvciB0aGUgc3BlY2lmaWMgcGVlciBhbmQgdGhlIFNDTVMtVCBoZWFkZXIKLSAqKiAgICAgICAgICAgICAgICAgaWYgU0NNUy1UIGlzIGVuYWJsZWQuCi0gKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idGF2X2EyZHBfc2Ntc3RfaW5mb190IGJ0YV9hdl9jb19nZXRfc2Ntc3RfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0jZW5kaWYgLyogQlRBX0FWX0NPX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9jc2lzX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2NzaXNfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODY0ZjUuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2NzaXNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2dyb3Vwcy5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2NzaXMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY3NpcyB7Ci0KLXVzaW5nIENzaXNMb2NrQ2IgPSBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChpbnQgZ3JvdXBfaWQsIGJvb2wgbG9ja2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzaXNHcm91cExvY2tTdGF0dXMgc3RhdHVzKT47Ci0KLWNsYXNzIENzaXNDbGllbnQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q3Npc0NsaWVudCgpID0gZGVmYXVsdDsKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpDbG9zdXJlIGluaXRDYik7Ci0gIHN0YXRpYyB2b2lkIEFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbiwgYm9vbCBhdXRvY29ubmVjdCk7Ci0gIHN0YXRpYyBib29sIEdldEZvclN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG91dCk7Ci0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLSAgc3RhdGljIENzaXNDbGllbnQqIEdldCgpOwotICBzdGF0aWMgdm9pZCBEZWJ1Z0R1bXAoaW50IGZkKTsKLSAgc3RhdGljIGJvb2wgSXNDc2lzQ2xpZW50UnVubmluZygpOwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0gIHZpcnR1YWwgaW50IEdldEdyb3VwSWQoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dlbmVyaWNDb250ZXh0VXVpZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgTG9ja0dyb3VwKGludCBncm91cF9pZCwgYm9vbCBsb2NrLCBDc2lzTG9ja0NiIGNiKSA9IDA7Ci0gIHZpcnR1YWwgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gR2V0RGV2aWNlTGlzdChpbnQgZ3JvdXBfaWQpID0gMDsKLX07Ci19ICAvLyBuYW1lc3BhY2UgY3NpcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2RtX2FjbC5oIGIvYnRhL2luY2x1ZGUvYnRhX2RtX2FjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFhOTRlLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9kbV9hY2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIEJUQV9kbV9hY2xfdXAoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci12b2lkIEJUQV9kbV9hY2xfZG93bihjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLXZvaWQgQlRBX2RtX3JlcG9ydF9yb2xlX2NoYW5nZShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRIQ0lfUk9MRSBuZXdfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKTsKLXZvaWQgQlRBX2RtX25vdGlmeV9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyKTsKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9kbV9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9kbV9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNGZkNi4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfZG1fYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA2LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmaWxlIGZvciBkZXZpY2UgbWFuYW5nZXIgZnVuY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9ETV9BUElfSAotI2RlZmluZSBCVEFfRE1fQVBJX0gKLQotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIEJyaW5ncyBjb25uZWN0aW9uIHRvIGFjdGl2ZSBtb2RlCi12b2lkIGJ0YV9kbV9wbV9hY3RpdmUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotI2VuZGlmIC8qIEJUQV9ETV9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2RtX2NpLmggYi9idGEvaW5jbHVkZS9idGFfZG1fY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNjIxMC4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfZG1fY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZpbGUgZm9yIGRldmljZSBtYW5hbmdlciBjYWxsLWluIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfRE1fQ0lfSAotI2RlZmluZSBCVEFfRE1fQ0lfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2NpX3JtdF9vb2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgYnRhX2RtX2NvX3JtdF9vb2IoKSB0byBwcm92aWRlIHRoZSBPT0IgZGF0YSBhc3NvY2lhdGVkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9kbV9jaV9ybXRfb29iKGJvb2wgYWNjZXB0LCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgYywgY29uc3QgT2N0ZXQxNiYgcik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3Njb19jaV9kYXRhX3JlYWR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIGV2ZW50IHRvIGluZGljYXRpbmcgdGhhdCB0aGUgcGhvbmUKLSAqICAgICAgICAgICAgICAgICAgaGFzIFNDTyBkYXRhIHJlYWR5Li4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Njb19jaV9kYXRhX3JlYWR5KHVpbnQxNl90IGV2ZW50LCB1aW50MTZfdCBzY29faGFuZGxlKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfZG1fY28uaCBiL2J0YS9pbmNsdWRlL2J0YV9kbV9jby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBiZmU4Li4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9kbV9jby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZpbGUgZm9yIGRldmljZSBtYW5hbmdlciBjYWxsb3V0IGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfRE1fQ09fSAotI2RlZmluZSBCVEFfRE1fQ09fSAotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgQlRBX1NDT19PVVRfUEtUX1NJWkUKLSNkZWZpbmUgQlRBX1NDT19PVVRfUEtUX1NJWkUgQlRNX1NDT19EQVRBX1NJWkVfTUFYCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jb19pb19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBETSB0byBnZXQgSU8KLSAqICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIG9mIHRoZSBsb2NhbCBkZXZpY2UgZm9yIHRoZSBTaW1wbGUgUGFpcmluZwotICogICAgICAgICAgICAgICAgICBwcm9jZXNzCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyICAtIFRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICAqcF9pb19jYXAgLSBUaGUgbG9jYWwgSW5wdXQvT3V0cHV0IGNhcGFiaWxpdGllcwotICogICAgICAgICAgICAgICAgICAqcF9vb2JfZGF0YSAtIHRydWUsIGlmIE9PQiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKiAgICAgICAgICAgICAgICAgICpwX2F1dGhfcmVxIC0gdHJ1ZSwgaWYgTUlUTSBwcm90ZWN0aW9uIGlzIHJlcXVpcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2RtX2NvX2lvX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRNX0lPX0NBUCogcF9pb19jYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fT09CX0RBVEEqIHBfb29iX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQVVUSF9SRVEqIHBfYXV0aF9yZXEsIGJvb2wgaXNfb3JpZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fY29faW9fcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgRE0gdG8gcmVwb3J0IElPCi0gKiAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBvZiB0aGUgcGVlciBkZXZpY2UgZm9yIHRoZSBTaW1wbGUgUGFpcmluZwotICogICAgICAgICAgICAgICAgICBwcm9jZXNzCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyICAtIFRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBpb19jYXAgLSBUaGUgcmVtb3RlIElucHV0L091dHB1dCBjYXBhYmlsaXRpZXMKLSAqICAgICAgICAgICAgICAgICAgb29iX2RhdGEgLSB0cnVlLCBpZiBPT0IgZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBhdXRoX3JlcSAtIHRydWUsIGlmIE1JVE0gcHJvdGVjdGlvbiBpcyByZXF1aXJlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9kbV9jb19pb19yc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9JT19DQVAgaW9fY2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX09PQl9EQVRBIG9vYl9kYXRhLCB0QlRNX0FVVEhfUkVRIGF1dGhfcmVxKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jb19sb2Nfb29iCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgRE0gdG8gcmVwb3J0IHRoZSBPT0IKLSAqICAgICAgICAgICAgICAgICAgZGF0YSBvZiB0aGUgbG9jYWwgZGV2aWNlIGZvciB0aGUgU2ltcGxlIFBhaXJpbmcgcHJvY2VzcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgdmFsaWQgLSB0cnVlLCBpZiB0aGUgbG9jYWwgT09CIGRhdGEgaXMgcmV0cmlldmVkIGZyb20gTE0KLSAqICAgICAgICAgICAgICAgICAgYyAgICAgLSBTaW1wbGUgUGFpcmluZyBIYXNoIEMKLSAqICAgICAgICAgICAgICAgICAgciAgICAgLSBTaW1wbGUgUGFpcmluZyBSYW5kb21uaXplciBSCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfZG1fY29fbG9jX29vYihib29sIHZhbGlkLCBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jb19ybXRfb29iCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgRE0gdG8gcmVxdWVzdCB0aGUgT09CCi0gKiAgICAgICAgICAgICAgICAgIGRhdGEgZm9yIHRoZSByZW1vdGUgZGV2aWNlIGZvciB0aGUgU2ltcGxlIFBhaXJpbmcgcHJvY2VzcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAgLSBUaGUgcGVlciBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9kbV9jb19ybXRfb29iKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3Njb19jb19vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHdoZW4gYSBTQ08gY29ubmVjdGlvbiBpcyBvcGVuLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Njb19jb19vcGVuKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwa3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldmVudCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2NvX2NvX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU0NPIGNvbm5lY3Rpb24gaXMgY2xvc2VkCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfZG1fc2NvX2NvX2Nsb3NlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX3Njb19jb19vdXRfZGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBTQ08gZGF0YSBvdmVyIEhDSS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Njb19jb19vdXRfZGF0YShCVF9IRFIqKiBwX2J1Zik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fc2NvX2NvX2luX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgaW5jb21pbmcgU0NPIGRhdGEgdG8KLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9kbV9zY29fY29faW5fZGF0YShCVF9IRFIqIHBfYnVmLCB0QlRNX1NDT19EQVRBX0ZMQUcgc3RhdHVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jb19ibGVfaW9fcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgRE0gdG8gZ2V0IEJMRSBJTwotICogICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgYmVmb3JlIFNNUCBwYWlyaW5nIGdldHMgZ29pbmcuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyICAtIFRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICAqcF9pb19jYXAgLSBUaGUgbG9jYWwgSW5wdXQvT3V0cHV0IGNhcGFiaWxpdGllcwotICogICAgICAgICAgICAgICAgICAqcF9vb2JfZGF0YSAtIHRydWUsIGlmIE9PQiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKiAgICAgICAgICAgICAgICAgICpwX2F1dGhfcmVxIC0gIEF1dGggcmVxdWVzdCBzZXR0aW5nIChCb25kaW5nIGFuZCBNSVRNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBvciBub3QpCi0gKiAgICAgICAgICAgICAgICAgICpwX21heF9rZXlfc2l6ZSAtIG1heCBrZXkgc2l6ZSBsb2NhbCBkZXZpY2Ugc3VwcG9ydGVkLgotICogICAgICAgICAgICAgICAgICAqcF9pbml0X2tleSAtIGluaXRpYXRvciBrZXlzLgotICogICAgICAgICAgICAgICAgICAqcF9yZXNwX2tleSAtIHJlc3BvbmRlciBrZXlzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2RtX2NvX2JsZV9pb19yZXEoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9JT19DQVAqIHBfaW9fY2FwLCB0QlRNX09PQl9EQVRBKiBwX29vYl9kYXRhLAotICAgIHRCVE1fTEVfQVVUSF9SRVEqIHBfYXV0aF9yZXEsIHVpbnQ4X3QqIHBfbWF4X2tleV9zaXplLAotICAgIHRCVE1fTEVfS0VZX1RZUEUqIHBfaW5pdF9rZXksIHRCVE1fTEVfS0VZX1RZUEUqIHBfcmVzcF9rZXkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2NvX2JsZV9sb2NhbF9rZXlfcmVsb2FkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgdG8gbG9hZCB0aGUgbG9jYWwgQkxFIGtleXMgaWYKLSAqICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBub25lCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfZG1fY29fYmxlX2xvYWRfbG9jYWxfa2V5cygKLSAgICB0QlRBX0RNX0JMRV9MT0NBTF9LRVlfTUFTSyogcF9rZXlfbWFzaywgT2N0ZXQxNiogcF9lciwKLSAgICB0QlRBX0JMRV9MT0NBTF9JRF9LRVlTKiBwX2lkX2tleXMpOwotCi0jZW5kaWYgLyogQlRBX0RNX0NPX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9nYXR0X2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2dhdHRfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTdjNzUuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2dhdHRfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZpbGUgZm9yIEJUQSBHQVRULgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRBX0dBVFRfQVBJX0gKLSNkZWZpbmUgQlRBX0dBVFRfQVBJX0gKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRhL2dhdHQvZGF0YWJhc2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIEJUQV9HQVRUX0RFQlVHCi0jZGVmaW5lIEJUQV9HQVRUX0RFQlVHIGZhbHNlCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbW1vbiBEZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR0FUVCBJRCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBibHVldG9vdGg6OlV1aWQgdXVpZDsgLyogdXVpZCBvZiB0aGUgYXR0cmlidXRlICovCi0gIHVpbnQ4X3QgaW5zdF9pZDsgICAgICAvKiBpbnN0YW5jZSBJRCAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB0QlRBX0dBVFRfSUQ7Ci0KLS8qIENsaWVudCBjYWxsYmFjayBmdW5jdGlvbiBldmVudHMgKi8KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBCVEFfR0FUVENfREVSRUdfRVZUID0gMSwgICAgICAgICAgLyogR0FUVCBjbGllbnQgZGVyZWdpc3RlcmVkIGV2ZW50ICovCi0gIEJUQV9HQVRUQ19PUEVOX0VWVCA9IDIsICAgICAgICAgICAvKiBHQVRUQyBvcGVuIHJlcXVlc3Qgc3RhdHVzICBldmVudCAqLwotICBCVEFfR0FUVENfQ0xPU0VfRVZUID0gNSwgICAgICAgICAgLyogR0FUVEMgIGNsb3NlIHJlcXVlc3Qgc3RhdHVzIGV2ZW50ICovCi0gIEJUQV9HQVRUQ19TRUFSQ0hfQ01QTF9FVlQgPSA2LCAgICAvKiBHQVRUIGRpc2NvdmVyeSBjb21wbGV0ZSBldmVudCAqLwotICBCVEFfR0FUVENfU0VBUkNIX1JFU19FVlQgPSA3LCAgICAgLyogR0FUVCBkaXNjb3ZlcnkgcmVzdWx0IGV2ZW50ICovCi0gIEJUQV9HQVRUQ19TUlZDX0RJU0NfRE9ORV9FVlQgPSA4LCAvKiBHQVRUIHNlcnZpY2UgZGlzY292ZXJ5IGRvbmUgZXZlbnQgKi8KLSAgQlRBX0dBVFRDX05PVElGX0VWVCA9IDEwLCAgICAgICAgIC8qIEdBVFQgYXR0cmlidXRlIG5vdGlmaWNhdGlvbiBldmVudCAqLwotICBCVEFfR0FUVENfRVhFQ19FVlQgPSAxMiwgICAgICAgICAgLyogZXhlY3V0ZSB3cml0ZSBjb21wbGV0ZSBldmVudCAqLwotICBCVEFfR0FUVENfQUNMX0VWVCA9IDEzLCAgICAgICAgICAgLyogQUNMIHVwIGV2ZW50ICovCi0gIEJUQV9HQVRUQ19DQU5DRUxfT1BFTl9FVlQgPSAxNCwgICAvKiBjYW5jZWwgb3BlbiBldmVudCAqLwotICBCVEFfR0FUVENfU1JWQ19DSEdfRVZUID0gMTUsICAgICAgLyogc2VydmljZSBjaGFuZ2UgZXZlbnQgKi8KLSAgQlRBX0dBVFRDX0VOQ19DTVBMX0NCX0VWVCA9IDE3LCAgIC8qIGVuY3J5cHRpb24gY29tcGxldGUgY2FsbGJhY2sgZXZlbnQgKi8KLSAgQlRBX0dBVFRDX0NGR19NVFVfRVZUID0gMTgsICAgICAgIC8qIGNvbmZpZ3VyZSBNVFUgY29tcGxldGUgZXZlbnQgKi8KLSAgQlRBX0dBVFRDX0NPTkdFU1RfRVZUID0gMjQsICAgICAgIC8qIENvbmdlc3Rpb24gZXZlbnQgKi8KLSAgQlRBX0dBVFRDX1BIWV9VUERBVEVfRVZUID0gMjUsICAgIC8qIFBIWSBjaGFuZ2UgZXZlbnQgKi8KLSAgQlRBX0dBVFRDX0NPTk5fVVBEQVRFX0VWVCA9IDI2LCAgIC8qIENvbm5lY3Rpb24gcGFyYW1ldGVycyB1cGRhdGUgZXZlbnQgKi8KLX0gdEJUQV9HQVRUQ19FVlQ7Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgZ2F0dF9jbGllbnRfZXZlbnRfdGV4dChjb25zdCB0QlRBX0dBVFRDX0VWVCYgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0dBVFRDX0RFUkVHX0VWVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfR0FUVENfT1BFTl9FVlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0dBVFRDX0NMT1NFX0VWVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9HQVRUQ19TRUFSQ0hfUkVTX0VWVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfR0FUVENfU1JWQ19ESVNDX0RPTkVfRVZUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9HQVRUQ19OT1RJRl9FVlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0dBVFRDX0VYRUNfRVZUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9HQVRUQ19BQ0xfRVZUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9HQVRUQ19DQU5DRUxfT1BFTl9FVlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0dBVFRDX1NSVkNfQ0hHX0VWVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfR0FUVENfRU5DX0NNUExfQ0JfRVZUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9HQVRUQ19DRkdfTVRVX0VWVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfR0FUVENfQ09OR0VTVF9FVlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0dBVFRDX1BIWV9VUERBVEVfRVZUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9HQVRUQ19DT05OX1VQREFURV9FVlQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV05bJWhodV0iLCBldmVudCk7Ci0gIH0KLX0KLSN1bmRlZiBDQVNFX1JFVFVSTl9URVhUCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgdW5pdDsgIC8qIGFzIFVVSVVEIGRlZmluZWQgYnkgU0lHICovCi0gIHVpbnQxNl90IGRlc2NyOyAvKiBhcyBVVUlEIGFzIGRlZmluZWQgYnkgU0lHICovCi0gIHRHQVRUX0ZPUk1BVCBmb3JtYXQ7Ci0gIGludDhfdCBleHA7Ci0gIHVpbnQ4X3QgbmFtZV9zcGM7IC8qIFRoZSBuYW1lIHNwYWNlIG9mIHRoZSBkZXNjcmlwdGlvbiAqLwotfSB0QlRBX0dBVFRfQ0hBUl9QUkVTOwotCi0vKiBDaGFyYWN0ZXJpc3RpYyBBZ2dyZWdhdGUgRm9ybWF0IGF0dHJpYnV0ZSB2YWx1ZQotICovCi0jZGVmaW5lIEJUQV9HQVRUX0FHR1JfSEFORExFX05VTV9NQVggMTAKLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBudW1faGFuZGxlOwotICB1aW50MTZfdCBoYW5kbGVfbGlzdFtCVEFfR0FUVF9BR0dSX0hBTkRMRV9OVU1fTUFYXTsKLX0gdEJUQV9HQVRUX0NIQVJfQUdHUkU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgbGVuOwotICB1aW50OF90KiBwX3ZhbHVlOwotfSB0QlRBX0dBVFRfVU5GTVQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBudW1fYXR0cjsKLSAgdWludDE2X3QgaGFuZGxlc1tHQVRUX01BWF9SRUFEX01VTFRJX0hBTkRMRVNdOwotfSB0QlRBX0dBVFRDX01VTFRJOwotCi0vKiBjYWxsYmFjayBkYXRhIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotICB0R0FUVF9JRiBjbGllbnRfaWY7Ci19IHRCVEFfR0FUVENfUkVHOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgbGVuOwotICB1aW50OF90IHZhbHVlW0dBVFRfTUFYX0FUVFJfTEVOXTsKLX0gdEJUQV9HQVRUQ19SRUFEOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLX0gdEJUQV9HQVRUQ19XUklURTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0dBVFRDX0VYRUNfQ01QTDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0dBVFRDX1NFQVJDSF9DTVBMOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRCVEFfR0FUVF9JRCBzZXJ2aWNlX3V1aWQ7Ci19IHRCVEFfR0FUVENfU1JWQ19SRVM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgdWludDE2X3QgbXR1OwotfSB0QlRBX0dBVFRDX0NGR19NVFU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdEdBVFRfSUYgY2xpZW50X2lmOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICB1aW50MTZfdCBtdHU7Ci19IHRCVEFfR0FUVENfT1BFTjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotICB0R0FUVF9JRiBjbGllbnRfaWY7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uOwotfSB0QlRBX0dBVFRDX0NMT1NFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCB2YWx1ZVtHQVRUX01BWF9BVFRSX0xFTl07Ci0gIGJvb2wgaXNfbm90aWZ5OwotICB1aW50MTZfdCBjaWQ7Ci19IHRCVEFfR0FUVENfTk9USUZZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIGJvb2wgY29uZ2VzdGVkOyAvKiBjb25nZXN0aW9uIGluZGljYXRvciAqLwotfSB0QlRBX0dBVFRDX0NPTkdFU1Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgdEdBVFRfSUYgY2xpZW50X2lmOwotICB1aW50MTZfdCBjb25uX2lkOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci19IHRCVEFfR0FUVENfT1BFTl9DTE9TRTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9JRiBjbGllbnRfaWY7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLX0gdEJUQV9HQVRUQ19FTkNfQ01QTF9DQjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9JRiBzZXJ2ZXJfaWY7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHVpbnQ4X3QgdHhfcGh5OwotICB1aW50OF90IHJ4X3BoeTsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLX0gdEJUQV9HQVRUQ19QSFlfVVBEQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX0lGIHNlcnZlcl9pZjsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdWludDE2X3QgaW50ZXJ2YWw7Ci0gIHVpbnQxNl90IGxhdGVuY3k7Ci0gIHVpbnQxNl90IHRpbWVvdXQ7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfR0FUVENfQ09OTl9VUERBVEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRhOwotICB1aW50MTZfdCBjb25uX2lkOwotfSB0QlRBX0dBVFRDX1NFUlZJQ0VfQ0hBTkdFRDsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci0KLSAgdEJUQV9HQVRUQ19TRUFSQ0hfQ01QTCBzZWFyY2hfY21wbDsgLyogZGlzY292ZXJ5IGNvbXBsZXRlICovCi0gIHRCVEFfR0FUVENfU1JWQ19SRVMgc3J2Y19yZXM7ICAgICAgIC8qIGRpc2NvdmVyeSByZXN1bHQgKi8KLSAgdEJUQV9HQVRUQ19SRUcgcmVnX29wZXI7ICAgICAgICAgICAgLyogcmVnaXN0cmF0aW9uIGRhdGEgKi8KLSAgdEJUQV9HQVRUQ19PUEVOIG9wZW47Ci0gIHRCVEFfR0FUVENfQ0xPU0UgY2xvc2U7Ci0gIHRCVEFfR0FUVENfUkVBRCByZWFkOyAgICAgICAgICAgLyogcmVhZCBhdHRyaWJ1dGUvZGVzY3JpcHRvciBkYXRhICovCi0gIHRCVEFfR0FUVENfV1JJVEUgd3JpdGU7ICAgICAgICAgLyogd3JpdGUgY29tcGxldGUgZGF0YSAqLwotICB0QlRBX0dBVFRDX0VYRUNfQ01QTCBleGVjX2NtcGw7IC8qICBleGVjdXRlIGNvbXBsZXRlICovCi0gIHRCVEFfR0FUVENfTk9USUZZIG5vdGlmeTsgICAgICAgLyogbm90aWZpY2F0aW9uL2luZGljYXRpb24gZXZlbnQgZGF0YSAqLwotICB0QlRBX0dBVFRDX0VOQ19DTVBMX0NCIGVuY19jbXBsOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7ICAgICAgLyogc2VydmljZSBjaGFuZ2UgZXZlbnQgKi8KLSAgdEJUQV9HQVRUQ19DRkdfTVRVIGNmZ19tdHU7IC8qIGNvbmZpZ3VyZSBNVFUgb3BlcmF0aW9uICovCi0gIHRCVEFfR0FUVENfQ09OR0VTVCBjb25nZXN0OwotICB0QlRBX0dBVFRDX1BIWV9VUERBVEUgcGh5X3VwZGF0ZTsKLSAgdEJUQV9HQVRUQ19DT05OX1VQREFURSBjb25uX3VwZGF0ZTsKLSAgdEJUQV9HQVRUQ19TRVJWSUNFX0NIQU5HRUQgc2VydmljZV9jaGFuZ2VkOwotfSB0QlRBX0dBVFRDOwotCi0vKiBHQVRUQyBlbmFibGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLXR5cGVkZWYgdm9pZCh0QlRBX0dBVFRDX0VOQl9DQkFDSykodEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci0KLS8qIENsaWVudCBjYWxsYmFjayBmdW5jdGlvbiAqLwotdHlwZWRlZiB2b2lkKHRCVEFfR0FUVENfQ0JBQ0spKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpOwotCi0vKiBHQVRUIFNlcnZlciBEYXRhIFN0cnVjdHVyZSAqLwotLyogU2VydmVyIGNhbGxiYWNrIGZ1bmN0aW9uIGV2ZW50cyAqLwotI2RlZmluZSBCVEFfR0FUVFNfUkVHX0VWVCAwCi0jZGVmaW5lIEJUQV9HQVRUU19SRUFEX0NIQVJBQ1RFUklTVElDX0VWVCBcCi0gIEdBVFRTX1JFUV9UWVBFX1JFQURfQ0hBUkFDVEVSSVNUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCi0jZGVmaW5lIEJUQV9HQVRUU19SRUFEX0RFU0NSSVBUT1JfRVZUIEdBVFRTX1JFUV9UWVBFX1JFQURfREVTQ1JJUFRPUiAvKiAyICovCi0jZGVmaW5lIEJUQV9HQVRUU19XUklURV9DSEFSQUNURVJJU1RJQ19FVlQgXAotICBHQVRUU19SRVFfVFlQRV9XUklURV9DSEFSQUNURVJJU1RJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzICovCi0jZGVmaW5lIEJUQV9HQVRUU19XUklURV9ERVNDUklQVE9SX0VWVCBHQVRUU19SRVFfVFlQRV9XUklURV9ERVNDUklQVE9SIC8qIDQgKi8KLSNkZWZpbmUgQlRBX0dBVFRTX0VYRUNfV1JJVEVfRVZUIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0VYRUMgICAgICAgICAgICAgLyogNSAqLwotI2RlZmluZSBCVEFfR0FUVFNfTVRVX0VWVCBHQVRUU19SRVFfVFlQRV9NVFUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ICovCi0jZGVmaW5lIEJUQV9HQVRUU19DT05GX0VWVCBHQVRUU19SRVFfVFlQRV9DT05GICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcgKi8KLSNkZWZpbmUgQlRBX0dBVFRTX0RFUkVHX0VWVCA4Ci0jZGVmaW5lIEJUQV9HQVRUU19ERUxFTFRFX0VWVCAxMQotI2RlZmluZSBCVEFfR0FUVFNfU1RPUF9FVlQgMTMKLSNkZWZpbmUgQlRBX0dBVFRTX0NPTk5FQ1RfRVZUIDE0Ci0jZGVmaW5lIEJUQV9HQVRUU19ESVNDT05ORUNUX0VWVCAxNQotI2RlZmluZSBCVEFfR0FUVFNfT1BFTl9FVlQgMTYKLSNkZWZpbmUgQlRBX0dBVFRTX0NBTkNFTF9PUEVOX0VWVCAxNwotI2RlZmluZSBCVEFfR0FUVFNfQ0xPU0VfRVZUIDE4Ci0jZGVmaW5lIEJUQV9HQVRUU19DT05HRVNUX0VWVCAyMAotI2RlZmluZSBCVEFfR0FUVFNfUEhZX1VQREFURV9FVlQgMjEKLSNkZWZpbmUgQlRBX0dBVFRTX0NPTk5fVVBEQVRFX0VWVCAyMgotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9HQVRUU19FVlQ7Ci0KLSNkZWZpbmUgQlRBX0dBVFRTX0lOVkFMSURfQVBQIDB4ZmYKLQotI2RlZmluZSBCVEFfR0FUVFNfSU5WQUxJRF9JRiAwCi0KLSNpZm5kZWYgQlRBX0dBVFRDX0NIQVJfREVTQ1JfTUFYCi0jZGVmaW5lIEJUQV9HQVRUQ19DSEFSX0RFU0NSX01BWCA3Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqICBOViBjYWxsYmFjayBEYXRhIERlZmluaXRpb25zICAgKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJsdWV0b290aDo6VXVpZCBhcHBfdXVpZDEyODsKLSAgYmx1ZXRvb3RoOjpVdWlkIHN2Y191dWlkOwotICB1aW50MTZfdCBzdmNfaW5zdDsKLSAgdWludDE2X3Qgc19oYW5kbGU7Ci0gIHVpbnQxNl90IGVfaGFuZGxlOwotICBib29sIGlzX3ByaW1hcnk7IC8qIHByaW1hcnkgc2VydmljZSBvciBzZWNvbmRhcnkgKi8KLX0gdEJUQV9HQVRUU19ITkRMX1JBTkdFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkYTsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRHQVRUU19EQVRBKiBwX2RhdGE7Ci19IHRCVEFfR0FUVFNfUkVROwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX0lGIHNlcnZlcl9pZjsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci19IHRCVEFfR0FUVFNfUkVHX09QRVI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfSUYgc2VydmVyX2lmOwotICB1aW50MTZfdCBzZXJ2aWNlX2lkOwotICB1aW50MTZfdCBzdmNfaW5zdGFuY2U7Ci0gIGJvb2wgaXNfcHJpbWFyeTsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci19IHRCVEFfR0FUVFNfQ1JFQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX0lGIHNlcnZlcl9pZjsKLSAgdWludDE2X3Qgc2VydmljZV9pZDsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLX0gdEJUQV9HQVRUU19TUlZDX09QRVI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfSUYgc2VydmVyX2lmOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotfSB0QlRBX0dBVFRTX0NPTk47Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgYm9vbCBjb25nZXN0ZWQ7IC8qIHJlcG9ydCBjaGFubmVsIGNvbmdlc3Rpb24gaW5kaWNhdG9yICovCi19IHRCVEFfR0FUVFNfQ09OR0VTVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOyAgICAgICAgLyogY29ubmVjdGlvbiBJRCAqLwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOyAgICAgLyogbm90aWZpY2F0aW9uL2luZGljYXRpb24gc3RhdHVzICovCi19IHRCVEFfR0FUVFNfQ09ORjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9JRiBzZXJ2ZXJfaWY7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHVpbnQ4X3QgdHhfcGh5OwotICB1aW50OF90IHJ4X3BoeTsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLX0gdEJUQV9HQVRUU19QSFlfVVBEQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX0lGIHNlcnZlcl9pZjsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdWludDE2X3QgaW50ZXJ2YWw7Ci0gIHVpbnQxNl90IGxhdGVuY3k7Ci0gIHVpbnQxNl90IHRpbWVvdXQ7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfR0FUVFNfQ09OTl9VUERBVEU7Ci0KLS8qIEdBVFRTIGNhbGxiYWNrIGRhdGEgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QlRBX0dBVFRTX1JFR19PUEVSIHJlZ19vcGVyOwotICB0QlRBX0dBVFRTX0NSRUFURSBjcmVhdGU7Ci0gIHRCVEFfR0FUVFNfU1JWQ19PUEVSIHNydmNfb3BlcjsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsgLyogQlRBX0dBVFRTX0xJU1RFTl9FVlQgKi8KLSAgdEJUQV9HQVRUU19SRVEgcmVxX2RhdGE7Ci0gIHRCVEFfR0FUVFNfQ09OTiBjb25uOyAgICAgICAgICAgICAvKiBCVEFfR0FUVFNfQ09OTl9FVlQgKi8KLSAgdEJUQV9HQVRUU19DT05HRVNUIGNvbmdlc3Q7ICAgICAgIC8qIEJUQV9HQVRUU19DT05HRVNUX0VWVCBjYWxsYmFjayBkYXRhICovCi0gIHRCVEFfR0FUVFNfQ09ORiBjb25maXJtOyAgICAgICAgICAvKiBCVEFfR0FUVFNfQ09ORl9FVlQgY2FsbGJhY2sgZGF0YSAqLwotICB0QlRBX0dBVFRTX1BIWV9VUERBVEUgcGh5X3VwZGF0ZTsgLyogQlRBX0dBVFRTX1BIWV9VUERBVEVfRVZUIGNhbGxiYWNrIGRhdGEgKi8KLSAgdEJUQV9HQVRUU19DT05OX1VQREFURQotICAgICAgY29ubl91cGRhdGU7IC8qIEJUQV9HQVRUU19DT05OX1VQREFURV9FVlQgY2FsbGJhY2sgZGF0YSAqLwotfSB0QlRBX0dBVFRTOwotCi0vKiBHQVRUUyBlbmFibGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLXR5cGVkZWYgdm9pZCh0QlRBX0dBVFRTX0VOQl9DQkFDSykodEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci0KLS8qIFNlcnZlciBjYWxsYmFjayBmdW5jdGlvbiAqLwotdHlwZWRlZiB2b2lkKHRCVEFfR0FUVFNfQ0JBQ0spKHRCVEFfR0FUVFNfRVZUIGV2ZW50LCB0QlRBX0dBVFRTKiBwX2RhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDbGllbnQgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGlzYWJsZSB0aGUgR0FUVEMgbW9kdWxlCi0gKgotICogUGFyYW1ldGVycyAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVENfRGlzYWJsZSh2b2lkKTsKLQotdXNpbmcgQnRhQXBwUmVnaXN0ZXJDYWxsYmFjayA9Ci0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGFwcF9pZCAqLywgdWludDhfdCAvKiBzdGF0dXMgKi8pPjsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3RlciBhcHBsaWNhdGlvbiBjYWxsYmFja3Mgd2l0aCBCVEEgR0FUVEMKLSAqbW9kdWxlLgotICogcF9jbGllbnRfY2IgLSBwb2ludGVyIHRvIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19BcHBSZWdpc3Rlcih0QlRBX0dBVFRDX0NCQUNLKiBwX2NsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdGFBcHBSZWdpc3RlckNhbGxiYWNrIGNiLCBib29sIGVhdHRfc3VwcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfQXBwRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVyZWdpc3RlciBhbiBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBmcm9tIEJUQSBHQVRUQyBtb2R1bGUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjbGllbnRfaWYgLSBjbGllbnQgaW50ZXJmYWNlIGlkZW50aWZpZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyKHRHQVRUX0lGIGNsaWVudF9pZik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfT3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbiBhIGRpcmVjdCBjb25uZWN0aW9uIG9yIGFkZCBhIGJhY2tncm91bmQgYXV0byBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGJkIGFkZHJlc3MKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNsaWVudF9pZjogc2VydmVyIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlX2JkYTogcmVtb3RlIGRldmljZSBCRCBhZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBpc19kaXJlY3Q6IGRpcmVjdCBjb25uZWN0aW9uIG9yIGJhY2tncm91bmQgYXV0byBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGluaXRpYXRpbmdfcGh5czogTEUgUEhZIHRvIHVzZSwgb3B0aW9uYWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX09wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGJvb2wgb3Bwb3J0dW5pc3RpYyk7Ci1leHRlcm4gdm9pZCBCVEFfR0FUVENfT3Blbih0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wcG9ydHVuaXN0aWMsIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVuIGEgZGlyZWN0IGNvbm5lY3Rpb24gb3IgYWRkIGEgYmFja2dyb3VuZCBhdXRvIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgYmQgYWRkcmVzcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY2xpZW50X2lmOiBzZXJ2ZXIgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIEJEIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDogZGlyZWN0IGNvbm5lY3Rpb24gb3IgYmFja2dyb3VuZCBhdXRvIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0NhbmNlbE9wZW4odEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgYm9vbCBpc19kaXJlY3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIGNvbm5lY3Rpb24gdG8gYSBHQVRUIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpbm8gSUQgdG8gYmUgY2xvc2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVENfQ2xvc2UodWludDE2X3QgY29ubl9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlcXVlc3QgYSBHQVRUIHNlcnZpY2UgZGlzY292ZXJ5Ci0gKiAgICAgICAgICAgICAgICAgIG9uIGEgR0FUVCBzZXJ2ZXIuIFRoaXMgZnVuY3Rpb24gcmVwb3J0IHNlcnZpY2Ugc2VhcmNoIHJlc3VsdAotICogICAgICAgICAgICAgICAgICBieSBhIGNhbGxiYWNrIGV2ZW50LCBhbmQgZm9sbG93ZWQgYnkgYSBzZXJ2aWNlIHNlYXJjaAotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZSBldmVudC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgIHBfc3J2Y191dWlkOiBhIFVVSUQgb2YgdGhlIHNlcnZpY2UgYXBwbGljYXRpb24gaXMgaW50ZXJlc3RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uIElmIE51bGwsIGRpc2NvdmVyIGZvciBhbGwgc2VydmljZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF9zcnZjX3V1aWQpOwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgIkZpbmQgc2VydmljZSBieSBVVUlEIiByZXF1ZXN0LiBVc2VkIG9ubHkgZm9yCi0gKiBQVFMgdGVzdHMuCi0gKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19EaXNjb3ZlclNlcnZpY2VCeVV1aWQodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBzcnZjX3V1aWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0dldFNlcnZpY2VzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBzZXJ2aWNlcyBvbiB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgc2VydmVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRCB3aGljaCBpZGVudGlmeSB0aGUgc2VydmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyBsaXN0IG9mIGdhdHQ6OlNlcnZpY2Ugb3IgTlVMTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGNvbnN0IHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiogQlRBX0dBVFRDX0dldFNlcnZpY2VzKHVpbnQxNl90IGNvbm5faWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBjaGFyYWN0ZXJpc3RpYyBvbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgZ2l2ZW4gc2VydmVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRCB3aGljaCBpZGVudGlmeSB0aGUgc2VydmVyLgotICogICAgICAgICAgICAgICAgICBoYW5kbGU6IGNoYXJhY3RlcmlzdGljIGhhbmRsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyBwb2ludGVyIHRvIGdhdHQ6OkNoYXJhY3RlcmlzdGljIG9yIE5VTEwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0dldERlc2NyaXB0b3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZpbmQgdGhlIGNoYXJhY3RlcmlzdGljIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBnaXZlbiBzZXJ2ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIElEIHdoaWNoIGlkZW50aWZ5IHRoZSBzZXJ2ZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZTogZGVzY3JpcHRvciBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgcG9pbnRlciB0byBnYXR0OjpEZXNjcmlwdG9yIG9yIE5VTEwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBjb25zdCBnYXR0OjpEZXNjcmlwdG9yKiBCVEFfR0FUVENfR2V0RGVzY3JpcHRvcih1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qIFJldHVybiBjaGFyYWN0ZXJpc3RpYyB0aGF0IG93bnMgZGVzY3JpcHRvciB3aXRoIGhhbmRsZSBlcXVhbCB0byB8aGFuZGxlfCwgb3IKLSAqIE5VTEwgKi8KLWV4dGVybiBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogQlRBX0dBVFRDX0dldE93bmluZ0NoYXJhY3RlcmlzdGljKAotICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qIFJldHVybiBzZXJ2aWNlIHRoYXQgb3ducyBkZXNjcmlwdG9yIG9yIGNoYXJhY3RlcmlzdGljIHdpdGggaGFuZGxlIGVxdWFsIHRvCi0gKiB8aGFuZGxlfCwgb3IgTlVMTCAqLwotZXh0ZXJuIGNvbnN0IGdhdHQ6OlNlcnZpY2UqIEJUQV9HQVRUQ19HZXRPd25pbmdTZXJ2aWNlKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19HZXRHYXR0RGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBnYXR0IGRiLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRCB3aGljaCBpZGVudGlmeSB0aGUgc2VydmVyLgotICogICAgICAgICAgICAgICAgICBkYjogb3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGNvbnRhaW4gZ2F0dCBkYiBjb3B5LgotICogICAgICAgICAgICAgICAgICAgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgotICogICAgICAgICAgICAgICAgICBjb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGRiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVENfR2V0R2F0dERiKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZW5kX2hhbmRsZSwgYnRnYXR0X2RiX2VsZW1lbnRfdCoqIGRiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvdW50KTsKLQotdHlwZWRlZiB2b2lkICgqR0FUVF9SRUFEX09QX0NCKSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpOwotdHlwZWRlZiB2b2lkICgqR0FUVF9XUklURV9PUF9DQikodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpOwotdHlwZWRlZiB2b2lkICgqR0FUVF9DT05GSUdVUkVfTVRVX09QX0NCKSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYSBjaGFyYWN0ZXJpc3RpY3MgdmFsdWUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW5vIElELgotICogICAgICAgICAgICAgICAgICBoYW5kbGUgLSBjaGFyYWN0ZXJpdGljIGhhbmRsZSB0byByZWFkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVBRF9PUF9DQiBjYWxsYmFjaywgdm9pZCogY2JfZGF0YSk7Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIHZhbHVlIG9mIGNoYXJhY3RlcmlzdGljIHdpdGggdXVpZCBlcXVhbCB0bwotICogfHV1aWR8Ci0gKi8KLXZvaWQgQlRBX0dBVFRDX1JlYWRVc2luZ0NoYXJVdWlkKHVpbnQxNl90IGNvbm5faWQsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNfaGFuZGxlLCB1aW50MTZfdCBlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRUFEX09QX0NCIGNhbGxiYWNrLCB2b2lkKiBjYl9kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19SZWFkQ2hhckRlc2NyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIGEgZGVzY3JpcHRvciB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElELgotICogICAgICAgICAgICAgICAgICBoYW5kbGUgLSBkZXNjcmlwdG9yIGhhbmRsZSB0byByZWFkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19SZWFkQ2hhckRlc2NyKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsIEdBVFRfUkVBRF9PUF9DQiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2JfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHdyaXRlIGNoYXJhY3RlcmlzdGljIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIGNoYXJhY3RlcmlzdGljIGhhbmRsZSB0byB3cml0ZS4KLSAqICAgICAgICAgICAgICAgICAgd3JpdGVfdHlwZSAtIHR5cGUgb2Ygd3JpdGUuCi0gKiAgICAgICAgICAgICAgICAgIHZhbHVlIC0gdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0dBVFRDX1dyaXRlQ2hhclZhbHVlKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNhbGxiYWNrLCB2b2lkKiBjYl9kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gd3JpdGUgZGVzY3JpcHRvciB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElECi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIGRlc2NyaXB0b3IgaGFuZGxlIHRvIHdyaXRlLgotICogICAgICAgICAgICAgICAgICB2YWx1ZSAtIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjcih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYWxsYmFjaywgdm9pZCogY2JfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfU2VuZEluZENvbmZpcm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgaGFuZGxlIHZhbHVlIGNvbmZpcm1hdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElELgotICogICAgICAgICAgICAgICAgICBjaWQgLSBjaGFubmVsIGlkCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBjaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBhCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjbGllbnRfaWYgLSBjbGllbnQgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICByZW1vdGVfYmRhIC0gdGFyZ2V0IEdBVFQgc2VydmVyLgotICogICAgICAgICAgICAgICAgICBoYW5kbGUgLSBHQVRUIGNoYXJhY3RlcmlzdGljIGhhbmRsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE9LIGlmIHJlZ2lzdHJhdGlvbiBzdWNjZWVkLCBvdGhlcndpc2UgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEdBVFRfU1RBVFVTIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCi0gICAgdEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZS1yZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIG9mIGEKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNsaWVudF9pZiAtIGNsaWVudCBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGEgLSB0YXJnZXQgR0FUVCBzZXJ2ZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIEdBVFQgY2hhcmFjdGVyaXN0aWMgaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgT0sgaWYgZGVyZWdpc3RyYXRpb24gc3VjY2VlZCwgb3RoZXJ3aXNlIGZhaWxlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBCVEFfR0FUVENfRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCi0gICAgdEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX1ByZXBhcmVXcml0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJlcGFyZSB3cml0ZSBhIGNoYXJhY3RlcmlzdGljCi0gKiAgICAgICAgICAgICAgICAgIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpb24gSUQuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZSAtIEdBVFQgY2hhcmFjdGVyaXRpYyBoYW5kbGUuCi0gKiAgICAgICAgICAgICAgICAgIG9mZnNldCAtIG9mZnNldCBvZiB0aGUgd3JpdGUgdmFsdWUuCi0gKiAgICAgICAgICAgICAgICAgIHZhbHVlIC0gdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUQ19QcmVwYXJlV3JpdGUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYWxsYmFjaywgdm9pZCogY2JfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfRXhlY3V0ZVdyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBleGVjdXRlIHdyaXRlIGEgcHJlcGFyZSB3cml0ZQotICogICAgICAgICAgICAgICAgICBzZXF1ZW5jZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW9uIElELgotICogICAgICAgICAgICAgICAgICAgIGlzX2V4ZWN1dGUgLSBleGVjdXRlIG9yIGNhbmNlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0V4ZWN1dGVXcml0ZSh1aW50MTZfdCBjb25uX2lkLCBib29sIGlzX2V4ZWN1dGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRDX1JlYWRNdWx0aXBsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBtdWx0aXBsZSBjaGFyYWN0ZXJpc3RpYyBvcgotICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9ycy4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQgLSBjb25uZWN0aW5vIElELgotICogICAgICAgICAgICAgICAgICAgIHBfcmVhZF9tdWx0aSAtIHJlYWQgbXVsdGlwbGUgcGFyYW1ldGVycy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX1JlYWRNdWx0aXBsZSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRDX01VTFRJKiBwX3JlYWRfbXVsdGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUQ19SZWZyZXNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWZyZXNoIHRoZSBzZXJ2ZXIgY2FjaGUgb2YgdGhlIHJlbW90ZSBkZXZpY2UKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHJlbW90ZV9iZGE6IHJlbW90ZSBkZXZpY2UgQkQgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX1JlZnJlc2goY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVENfQ29uZmlndXJlTVRVCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb25maWd1cmUgdGhlIE1UVSBzaXplIGluIHRoZSBHQVRUIGNoYW5uZWwuIFRoaXMgY2FuIGJlIGRvbmUKLSAqICAgICAgICAgICAgICAgICAgb25seSBvbmNlIHBlciBjb25uZWN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBJRC4KLSAqICAgICAgICAgICAgICAgICAgbXR1OiBkZXNpcmVkIE1UVSBzaXplIHRvIHVzZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUpOwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ09ORklHVVJFX01UVV9PUF9DQiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2JfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQlRBIEdBVFQgU2VydmVyIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19Jbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpbml0YWxpemUgR0FUVFMgbW9kdWxlCi0gKgotICogUGFyYW1ldGVycyAgICAgICBOb25lCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19Jbml0KCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGlzYWJsZSBHQVRUUyBtb2R1bGUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19EaXNhYmxlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX0FwcFJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3RlciBhcHBsaWNhdGlvbiBjYWxsYmFja3MKLSAqICAgICAgICAgICAgICAgICAgICB3aXRoIEJUQSBHQVRUUyBtb2R1bGUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2FwcF91dWlkIC0gYXBwbGljYWl0b24gVVVJRAotICogICAgICAgICAgICAgICAgICBwX2NiYWNrIC0gcG9pbnRlciB0byB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIGVhdHRfc3VwcG9ydDogaW5kaWNhdGUgZWF0dCBzdXBwb3J0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfR0FUVFNfQXBwUmVnaXN0ZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRTX0NCQUNLKiBwX2NiYWNrLCBib29sIGVhdHRfc3VwcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfQXBwRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGUtcmVnaXN0ZXIgd2l0aCBCVEEgR0FUVCBTZXJ2ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzZXJ2ZXJfaWY6IHNlcnZlciBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0FwcERlcmVnaXN0ZXIodEdBVFRfSUYgc2VydmVyX2lmKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19BZGRTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQgdGhlIGdpdmVuIHxzZXJ2aWNlfCBhbmQgYWxsIGluY2x1ZGVkIGVsZW1lbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBHQVRUIGRhdGFiYXNlLiBhIHxCVEFfR0FUVFNfQUREX1NSVkNfRVZUfCBpcyB0cmlnZ2VyZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgcmVwb3J0IHRoZSBzdGF0dXMgYW5kIGF0dHJpYnV0ZSBoYW5kbGVzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc2VydmVyX2lmOiBzZXJ2ZXIgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlOiBwb2ludGVyIHRvIHZlY3RvciBkZXNjcmliaW5nIHNlcnZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIHxHQVRUX1NVQ0NFU1N8IG9uIHN1Y2Nlc3Mgb3IgfEdBVFRfRVJST1J8IGlmIHRoZQotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIGNhbm5vdCBiZSBhZGRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHRHQVRUX1NUQVRVUyBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSk+Ci0gICAgQlRBX0dBVFRTX0FkZFNlcnZpY2VDYjsKLQotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0FkZFNlcnZpY2UodEdBVFRfSUYgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUU19BZGRTZXJ2aWNlQ2IgY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX0RlbGV0ZVNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhIHNlcnZpY2UuIFdoZW4gdGhpcyBpcwotICogICAgICAgICAgICAgICAgICBkb25lLCBhIGNhbGxiYWNrIGV2ZW50IEJUQV9HQVRUU19ERUxFVEVfRVZUIGlzIHJlcG9ydCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBzdGF0dXMuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzZXJ2aWNlX2lkOiBzZXJ2aWNlX2lkIHRvIGJlIGRlbGV0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICByZXR1cm5zIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19EZWxldGVTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX1N0b3BTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdG9wIGEgc2VydmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHNlcnZpY2VfaWQgLSBzZXJ2aWNlIHRvIGJlIHRvcHBlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX1N0b3BTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0dBVFRTX0hhbmRsZVZhbHVlSW5kaWNhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIGNoYXJhY3RlcmlzdGljcwotICogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgYXR0cl9pZCAtIGF0dHJpYnV0ZSBJRCB0byBpbmRpY2F0ZS4KLSAqICAgICAgICAgICAgICAgICAgdmFsdWUgLSBkYXRhIHRvIGluZGljYXRlLgotICogICAgICAgICAgICAgICAgICBuZWVkX2NvbmZpcm0gLSBpZiB0aGlzIGluZGljYXRpb24gZXhwZWN0cyBhIGNvbmZpcm1hdGlvbiBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgYXR0cl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZF9jb25maXJtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19TZW5kUnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgcmVzcG9uc2UgdG8gYSByZXF1ZXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZCAtIGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgdHJhbnNfaWQgLSB0cmFuc2FjdGlvbiBJRC4KLSAqICAgICAgICAgICAgICAgICAgc3RhdHVzIC0gcmVzcG9uc2Ugc3RhdHVzCi0gKiAgICAgICAgICAgICAgICAgIHBfbXNnIC0gcmVzcG9uc2UgZGF0YS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX1NlbmRSc3AodWludDE2X3QgY29ubl9pZCwgdWludDMyX3QgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB0R0FUVFNfUlNQKiBwX21zZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfR0FUVFNfT3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbiBhIGRpcmVjdCBvcGVuIGNvbm5lY3Rpb24gb3IgYWRkIGEgYmFja2dyb3VuZCBhdXRvCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYmQgYWRkcmVzcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc2VydmVyX2lmOiBzZXJ2ZXIgaW50ZXJmYWNlLgotICogICAgICAgICAgICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIEJEIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDogZGlyZWN0IGNvbm5lY3Rpb24gb3IgYmFja2dyb3VuZCBhdXRvIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX09wZW4odEdBVFRfSUYgc2VydmVyX2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19DYW5jZWxPcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYW5jZWwgYSBkaXJlY3Qgb3BlbiBjb25uZWN0aW9uIG9yIHJlbW92ZSBhIGJhY2tncm91bmQgYXV0bwotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGJkIGFkZHJlc3MKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHNlcnZlcl9pZjogc2VydmVyIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlX2JkYTogcmVtb3RlIGRldmljZSBCRCBhZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBpc19kaXJlY3Q6IGRpcmVjdCBjb25uZWN0aW9uIG9yIGJhY2tncm91bmQgYXV0byBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9HQVRUU19DYW5jZWxPcGVuKHRHQVRUX0lGIHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIGJvb2wgaXNfZGlyZWN0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19DbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgYSBjb25uZWN0aW9uICBhIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkOiBjb25uZWN0aW5vIElEIHRvIGJlIGNsb3NlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0dBVFRTX0Nsb3NlKHVpbnQxNl90IGNvbm5faWQpOwotCi0jZW5kaWYgLyogQlRBX0dBVFRfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9nYXR0X3F1ZXVlLmggYi9idGEvaW5jbHVkZS9idGFfZ2F0dF9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzU1YjJjLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9nYXR0X3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLQotLyogQlRBIEdBVFRDIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IGZvciBtdWx0aXBsZSBjb21tYW5kcyBxdWV1aW5nLiBTbyBvbmUKLSAqIGNsaWVudCBtYWtpbmcgY2FsbHMgdG8gQlRBX0dBVFRDX1JlYWRDaGFyYWN0ZXJpc3RpYywgQlRBX0dBVFRDX1JlYWRDaGFyRGVzY3IsCi0gKiBCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUsIEJUQV9HQVRUQ19Xcml0ZUNoYXJEZXNjciBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYWNrcwotICogYmVmb3JlIHNjaGVkdWxpbmcgbmV4dCBvcGVyYXRpb24uCi0gKgotICogTWV0aG9kcyBiZWxvdyBjYW4gYmUgdXNlZCBhcyByZXBsYWNlbWVudCB0byBCVEFfR0FUVENfKiBpbiBCVEEgYXBwLiBUaGV5IGRvCi0gKiBxdWV1ZSB0aGUgY29tbWFuZHMgaWYgYW5vdGhlciBjb21tYW5kIGlzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZC4KLSAqCi0gKiBJZiB5b3UgZGVjaWRlIHRvIHVzZSB0aG9zZSBtZXRob2RzIGluIHlvdXIgYXBwLCBtYWtlIHN1cmUgdG8gbm90IG1peCBpdCB3aXRoCi0gKiBleGlzdGluZyBCVEFfR0FUVENfKiBBUEkuCi0gKi8KLWNsYXNzIEJ0YUdhdHRRdWV1ZSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBDbGVhbih1aW50MTZfdCBjb25uX2lkKTsKLSAgc3RhdGljIHZvaWQgUmVhZENoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSk7Ci0gIHN0YXRpYyB2b2lkIFJlYWREZXNjcmlwdG9yKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRUFEX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKTsKLSAgc3RhdGljIHZvaWQgV3JpdGVDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpOwotICBzdGF0aWMgdm9pZCBXcml0ZURlc2NyaXB0b3IodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsIEdBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKTsKLSAgc3RhdGljIHZvaWQgQ29uZmlndXJlTXR1KHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IG10dSk7Ci0KLSAgLyogSG9sZHMgcGVuZGluZyBHQVRUIG9wZXJhdGlvbnMgKi8KLSAgc3RydWN0IGdhdHRfb3BlcmF0aW9uIHsKLSAgICB1aW50OF90IHR5cGU7Ci0gICAgdWludDE2X3QgaGFuZGxlOwotICAgIEdBVFRfUkVBRF9PUF9DQiByZWFkX2NiOwotICAgIHZvaWQqIHJlYWRfY2JfZGF0YTsKLSAgICBHQVRUX1dSSVRFX09QX0NCIHdyaXRlX2NiOwotICAgIHZvaWQqIHdyaXRlX2NiX2RhdGE7Ci0gICAgR0FUVF9DT05GSUdVUkVfTVRVX09QX0NCIG10dV9jYjsKLSAgICB2b2lkKiBtdHVfY2JfZGF0YTsKLQotICAgIC8qIHdyaXRlLXNwZWNpZmljIGZpZWxkcyAqLwotICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgfTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIG1hcmtfYXNfbm90X2V4ZWN1dGluZyh1aW50MTZfdCBjb25uX2lkKTsKLSAgc3RhdGljIHZvaWQgZ2F0dF9leGVjdXRlX25leHRfb3AodWludDE2X3QgY29ubl9pZCk7Ci0gIHN0YXRpYyB2b2lkIGdhdHRfcmVhZF9vcF9maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSk7Ci0gIHN0YXRpYyB2b2lkIGdhdHRfd3JpdGVfb3BfZmluaXNoZWQodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSk7Ci0gIHN0YXRpYyB2b2lkIGdhdHRfY29uZmlndXJlX210dV9vcF9maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywgdm9pZCogZGF0YSk7Ci0KLSAgLy8gbWFwcyBjb25uZWN0aW9uIGlkIHRvIG9wZXJhdGlvbnMgd2FpdGluZyBmb3IgZXhlY3V0aW9uCi0gIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QsIHN0ZDo6bGlzdDxnYXR0X29wZXJhdGlvbj4+IGdhdHRfb3BfcXVldWU7Ci0gIC8vIGNvbnRhaW4gY29ubmVjdGlvbiBpZHMgdGhhdCBjdXJyZW50bHkgZXhlY3V0ZSBvcGVyYXRpb25zCi0gIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDE2X3Q+IGdhdHRfb3BfcXVldWVfZXhlY3V0aW5nOwotfTsKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9ncm91cHMuaCBiL2J0YS9pbmNsdWRlL2J0YV9ncm91cHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzYWQ2NS4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfZ3JvdXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBncm91cHMgewotCi1zdGF0aWMgY29uc3RleHByIGludCBrR3JvdXBVbmtub3duID0gLTE7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtHZW5lcmljQ29udGV4dFV1aWQgPQotICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MDAwMCk7Ci0KLWNsYXNzIERldmljZUdyb3Vwc0NhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5EZXZpY2VHcm91cHNDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLyogTm90aWZpZXMgZmlyc3QgZ3JvdXAgYXBwZWFyYW5jZS4KLSAgICogVGhpcyBjYWxsYmFjayBhbHNvIGNvbnRhaW5zIGZpcnN0IGdyb3VwIG1lbWJlciBhbmQgdXVpZCBvZiB0aGUgZ3JvdXAuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25Hcm91cEFkZGVkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBncm91cF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9pZCkgPSAwOwotCi0gIC8qIEZvbGxvd2VkIGdyb3VwIG1lbWJlcnMgYXJlIG5vdGlmaWVkIHdpdGggdGhpcyBjYWxsYmFjayAqLwotICB2aXJ0dWFsIHZvaWQgT25Hcm91cE1lbWJlckFkZGVkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBncm91cF9pZCkgPSAwOwotCi0gIC8qIEdyb3VwIHJlbW92YWwgY2FsbGJhY2sgKi8KLSAgdmlydHVhbCB2b2lkIE9uR3JvdXBSZW1vdmVkKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgZ3JvdXBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9pZCkgPSAwOwotCi0gIC8qIENhbGxiYWNrIHdpdGggZ3JvdXAgc3RhdHVzIHVwZGF0ZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Hcm91cE1lbWJlclJlbW92ZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9pZCkgPSAwOwotCi0gIC8qIENhbGxiYWNrIHdpdGggZ3JvdXAgaW5mb3JtYXRpb24gYWRkZWQgZnJvbSBzdG9yYWdlICovCi0gIHZpcnR1YWwgdm9pZCBPbkdyb3VwQWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGdyb3VwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX2lkKSA9IDA7Ci19OwotCi1jbGFzcyBEZXZpY2VHcm91cHMgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+RGV2aWNlR3JvdXBzKCkgPSBkZWZhdWx0OwotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKERldmljZUdyb3Vwc0NhbGxiYWNrcyogY2FsbGJhY2tzKTsKLSAgc3RhdGljIHZvaWQgQWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluKTsKLSAgc3RhdGljIGJvb2wgR2V0Rm9yU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb3V0KTsKLSAgc3RhdGljIHZvaWQgQ2xlYW5VcChEZXZpY2VHcm91cHNDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0gIHN0YXRpYyBEZXZpY2VHcm91cHMqIEdldCgpOwotICAvKiogVG8gYWRkIHRvIHRoZSBleGlzdGluZyBncm91cCwgZ3JvdXBfaWQgbmVlZHMgdG8gYmUgcHJvdmlkZWQuCi0gICAqICBPdGhlcndpc2UgYSBuZXcgZ3JvdXAgZm9yIHRoZSBnaXZlbiBjb250ZXh0IHV1aWQgd2lsbCBiZSBjcmVhdGVkLgotICAgKi8KLSAgdmlydHVhbCBpbnQgQWRkRGV2aWNlKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgIGJsdWV0b290aDo6VXVpZCB1dWlkID0gYmx1ZXRvb3RoOjpncm91cHM6OmtHZW5lcmljQ29udGV4dFV1aWQsCi0gICAgICBpbnQgZ3JvdXBfaWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgPSAwOwotICB2aXJ0dWFsIGludCBHZXRHcm91cElkKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgIGJsdWV0b290aDo6VXVpZCB1dWlkID0gYmx1ZXRvb3RoOjpncm91cHM6OmtHZW5lcmljQ29udGV4dFV1aWQpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlbW92ZURldmljZSgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICBpbnQgZ3JvdXBfaWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGdyb3VwcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2hkX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2hkX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg5YTBlLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9oZF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX0hEX0FQSV9ICi0jZGVmaW5lIEJUQV9IRF9BUElfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hpZGRlZnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgYW5kIFR5cGUgRGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfSERfREVCVUcKLSNkZWZpbmUgQlRBX0hEX0RFQlVHIEZBTFNFCi0jZW5kaWYKLQotLyogQlRBIEhJRCBEZXZpY2UgY2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIEJUQV9IRF9FTkFCTEVfRVZUIDAgICAgICAgICAvKiBCVC1IRCBlbmFibGVkICovCi0jZGVmaW5lIEJUQV9IRF9ESVNBQkxFX0VWVCAxICAgICAgICAvKiBCVC1IRCBkaXNhYmxlZCAqLwotI2RlZmluZSBCVEFfSERfUkVHSVNURVJfQVBQX0VWVCAyICAgLyogYXBwbGljYXRpb24gcmVnaXN0ZXJlZCAqLwotI2RlZmluZSBCVEFfSERfVU5SRUdJU1RFUl9BUFBfRVZUIDMgLyogYXBwbGljYXRpb24gdW5yZWdpc3RlcmVkICovCi0jZGVmaW5lIEJUQV9IRF9PUEVOX0VWVCA0ICAgICAgICAgICAvKiBjb25uZWN0aW9uIHRvIGhvc3Qgb3BlbmVkICovCi0jZGVmaW5lIEJUQV9IRF9DTE9TRV9FVlQgNSAgICAgICAgICAvKiBjb25uZWN0aW9uIHRvIGhvc3QgY2xvc2VkICovCi0jZGVmaW5lIEJUQV9IRF9HRVRfUkVQT1JUX0VWVCA2ICAgICAvKiBHRVRfUkVQT1JUIHJlcXVlc3QgZnJvbSBob3N0ICovCi0jZGVmaW5lIEJUQV9IRF9TRVRfUkVQT1JUX0VWVCA3ICAgICAvKiBTRVRfUkVQT1JUIHJlcXVlc3QgZnJvbSBob3N0ICovCi0jZGVmaW5lIEJUQV9IRF9TRVRfUFJPVE9DT0xfRVZUIDggICAvKiBTRVRfUFJPVE9DT0wgcmVxdWVzdCBmcm9tIGhvc3QgKi8KLSNkZWZpbmUgQlRBX0hEX0lOVFJfREFUQV9FVlQgOSAgICAgIC8qIERBVEEgcmVjZWl2ZWQgZnJvbSBob3N0IG9uIGludHIgKi8KLSNkZWZpbmUgQlRBX0hEX1ZDX1VOUExVR19FVlQgMTAgICAgIC8qIFZpcnR1YWwgQ2FibGUgVW5wbHVnICovCi0jZGVmaW5lIEJUQV9IRF9DT05OX1NUQVRFX0VWVCAxMSAgICAvKiBSZXBvcnQgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UgKi8KLSNkZWZpbmUgQlRBX0hEX0FQSV9FUlJfRVZUIDk5ICAgICAgIC8qIEJULUhEIEFQSSBlcnJvciAqLwotCi10eXBlZGVmIHVpbnQxNl90IHRCVEFfSERfRVZUOwotCi1lbnVtIHsgQlRBX0hEX09LLCBCVEFfSERfRVJST1IgfTsKLXR5cGVkZWYgdWludDhfdCB0QlRBX0hEX1NUQVRVUzsKLQotdHlwZWRlZiB0SElEX0RFVl9EU0NQX0lORk8gdEJUQV9IRF9ERVZfREVTQ1I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciogcF9uYW1lOwotICBjaGFyKiBwX2Rlc2NyaXB0aW9uOwotICBjaGFyKiBwX3Byb3ZpZGVyOwotICB1aW50OF90IHN1YmNsYXNzOwotICB0QlRBX0hEX0RFVl9ERVNDUiBkZXNjcmlwdG9yOwotfSB0QlRBX0hEX0FQUF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc2VydmljZV90eXBlOwotICB1aW50MzJfdCB0b2tlbl9yYXRlOwotICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZTsKLSAgdWludDMyX3QgcGVha19iYW5kd2lkdGg7Ci0gIHVpbnQzMl90IGFjY2Vzc19sYXRlbmN5OwotICB1aW50MzJfdCBkZWxheV92YXJpYXRpb247Ci19IHRCVEFfSERfUU9TX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCB1c2VfaW50cjsKLSAgdWludDhfdCB0eXBlOwotICB1aW50OF90IGlkOwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLX0gdEJUQV9IRF9SRVBPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9IRF9TVEFUVVMgc3RhdHVzOwotICBib29sIGluX3VzZTsKLSAgUmF3QWRkcmVzcyBiZGE7Ci19IHRCVEFfSERfUkVHX1NUQVRVUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkYTsKLSAgdEJUQV9IRF9TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0hEX0NPTk47Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCByZXBvcnRfdHlwZTsKLSAgdWludDhfdCByZXBvcnRfaWQ7Ci0gIHVpbnQxNl90IGJ1ZmZlcl9zaXplOwotfSB0QlRBX0hEX0dFVF9SRVBPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCByZXBvcnRfdHlwZTsKLSAgdWludDhfdCByZXBvcnRfaWQ7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCogcF9kYXRhOwotfSB0QlRBX0hEX1NFVF9SRVBPUlQ7Ci0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0hEX1NFVF9QUk9UT0NPTDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHJlcG9ydF9pZDsKLSAgdWludDE2X3QgbGVuOwotICB1aW50OF90KiBwX2RhdGE7Ci19IHRCVEFfSERfSU5UUl9EQVRBOwotCi0vKiB1bmlvbiBvZiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBIRCBjYWxsYmFjayAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHRCVEFfSERfU1RBVFVTIHN0YXR1czsgICAgICAgICAgICAgLyogQlRBX0hEX0VOQUJMRV9FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSERfRElTQUJMRV9FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSERfVU5SRUdJU1RFUl9BUFBfRVZUICovCi0gIHRCVEFfSERfUkVHX1NUQVRVUyByZWdfc3RhdHVzOyAgICAgLyogQlRBX0hEX1JFR0lTVEVSX0FQUF9FVlQgKi8KLSAgdEJUQV9IRF9DT05OIGNvbm47ICAgICAgICAgICAgICAgICAvKiBCVEFfSERfT1BFTl9FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSERfQ0xPU0VfRVZUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hEX1ZDX1VOUExVR19FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSERfT1dOX1ZDX1VOUExVR19FVlQgKi8KLSAgdEJUQV9IRF9HRVRfUkVQT1JUIGdldF9yZXBvcnQ7ICAgICAvKiBCVEFfSERfR0VUX1JFUE9SVCAqLwotICB0QlRBX0hEX1NFVF9SRVBPUlQgc2V0X3JlcG9ydDsgICAgIC8qIEJUQV9IRF9TRVRfUkVQT1JUICovCi0gIHRCVEFfSERfU0VUX1BST1RPQ09MIHNldF9wcm90b2NvbDsgLyogQlRBX0hEX1NFVFBST1RPQ09MICovCi0gIHRCVEFfSERfSU5UUl9EQVRBIGludHJfZGF0YTsgICAgICAgLyogQlRBX0hEX0lOVFJfREFUQV9FVlQgKi8KLX0gdEJUQV9IRDsKLQotLyogQlRBIEhEIGNhbGxiYWNrIGZ1bmN0aW9uICovCi10eXBlZGVmIHZvaWQodEJUQV9IRF9DQkFDSykodEJUQV9IRF9FVlQgZXZlbnQsIHRCVEFfSEQqIHBfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBlbmFibGUgSElEIGhvc3QgYW5kIHJlZ2lzdGVycyBISUQtSG9zdCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGxvd2VyIGxheWVycy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkRW5hYmxlKHRCVEFfSERfQ0JBQ0sqIHBfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaG9zdCBpcyBhYm91dCBwb3dlciBkb3duLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGREaXNhYmxlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkUmVnaXN0ZXJBcHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYXBwbGljYXRpb24gc2hvdWxkIGJlCi0qcmVnaXN0ZXJlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGRSZWdpc3RlckFwcCh0QlRBX0hEX0FQUF9JTkZPKiBwX2FwcF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRF9RT1NfSU5GTyogcF9pbl9xb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hEX1FPU19JTkZPKiBwX291dF9xb3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkVW5yZWdpc3RlckFwcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhcHBsaWNhdGlvbiBzaG91bGQgYmUKLSp1bnJlZ2lzdGVyZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkVW5yZWdpc3RlckFwcCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZFNlbmRSZXBvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVwb3J0IGlzIHRvIGJlIHNlbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkU2VuZFJlcG9ydCh0QlRBX0hEX1JFUE9SVCogcF9yZXBvcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkVmlydHVhbENhYmxlVW5wbHVnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIFZDVSBzaGFsbCBiZSBzZW50Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IZFZpcnR1YWxDYWJsZVVucGx1Zyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZENvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gY29ubmVjdGlvbiB0byBob3N0IHNoYWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIG1hZGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZERpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gaG9zdCBzaGFsbCBiZSBkaXNjb25uZWN0ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkRGlzY29ubmVjdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZEFkZERldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyB2aXJ0dWFsbHkgY2FibGVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IZEFkZERldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZFJlbW92ZURldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyB2aXJ0dWFsbHkgdW5jYWJsZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hkUmVtb3ZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hkUmVwb3J0RXJyb3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVwb3J0aW5nIGVycm9yIGZvciBzZXQgcmVwb3J0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IZFJlcG9ydEVycm9yKHVpbnQ4X3QgZXJyb3IpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogQlRBX0hEX0FQSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfaGVhcmluZ19haWRfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfaGVhcmluZ19haWRfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YWMzNjUuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2hlYXJpbmdfYWlkX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFja19mb3J3YXJkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGVhcmluZ19haWQuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1jb25zdGV4cHIgdWludDE2X3QgSEVBUklOR0FJRF9NQVhfTlVNX1VVSURTID0gMTsKLQotY29uc3RleHByIHVpbnQxNl90IEhBX0lOVEVSVkFMXzEwX01TID0gMTA7Ci1jb25zdGV4cHIgdWludDE2X3QgSEFfSU5URVJWQUxfMjBfTVMgPSAyMDsKLQotLy8gTWFza3MgZm9yIGNoZWNraW5nIGNhcGFiaWxpdHkgc3VwcG9ydAotY29uc3RleHByIHVpbnQ4X3QgQ0FQQUJJTElUWV9TSURFID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IENBUEFCSUxJVFlfQklOQVVSQUwgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3QgQ0FQQUJJTElUWV9SRVNFUlZFRCA9IDB4RkM7Ci0KLS8qKiBJbXBsZW1lbnRhdGlvbnMgb2YgSGVhcmluZ0FpZCB3aWxsIGFsc28gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlICovCi1jbGFzcyBIZWFyaW5nQWlkQXVkaW9SZWNlaXZlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5IZWFyaW5nQWlkQXVkaW9SZWNlaXZlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE9uQXVkaW9EYXRhUmVhZHkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpID0gMDsKLQotICAvLyBBUEkgdG8gc3RvcCBvdXIgZmVlZGluZyB0aW1lciwgYW5kIG5vdGlmeSBoZWFyaW5nIGFpZCBkZXZpY2VzIHRoYXQgdGhlCi0gIC8vIHN0cmVhbWluZyB3b3VsZCBzdG9wLCB0b28uCi0gIC8vCi0gIC8vIEBwYXJhbSBzdG9wX2F1ZGlvX3RpY2tzIGEgY2FsbGFibGUgZnVuY3Rpb24gY2FsbHMgb3V0IHRvIHN0b3AgdGhlIG1lZGlhCi0gIC8vIHRpbWVyIGZvciByZWFkaW5nIGRhdGEuCi0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvU3VzcGVuZCgKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYgc3RvcF9hdWRpb190aWNrcykgPSAwOwotCi0gIC8vIFRvIG5vdGlmeSBoZWFyaW5nIGFpZCBkZXZpY2VzIHRvIGJlIHJlYWR5IGZvciBzdHJlYW1pbmcsIGFuZCBzdGFydCB0aGUKLSAgLy8gbWVkaWEgdGltZXIgdG8gZmVlZCB0aGUgYXVkaW8gZGF0YS4KLSAgLy8KLSAgLy8gQHBhcmFtIHN0YXJ0X2F1ZGlvX3RpY2tzIGEgY2FsbGFibGUgZnVuY3Rpb24gY2FsbHMgb3V0IHRvIHN0YXJ0IGEgcGVyaW9kaWMKLSAgLy8gdGltZXIgZm9yIGZlZWRpbmcgZGF0YSBmcm9tIHRoZSBhdWRpbyBIQUwuCi0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvUmVzdW1lKAotICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKCk+JiBzdGFydF9hdWRpb190aWNrcykgPSAwOwotfTsKLQotLy8gTnVtYmVyIG9mIHJzc2kgcmVhZHMgdG8gYXR0ZW1wdCB3aGVuIHJlcXVlc3RlZAotY29uc3RleHByIGludCBSRUFEX1JTU0lfTlVNX1RSSUVTID0gMTA7Ci1jb25zdGV4cHIgaW50IFBFUklPRF9UT19SRUFEX1JTU0lfSU5fSU5URVJWQUxTID0gNTsKLS8vIERlcHRoIG9mIFJTU0kgSGlzdG9yeSBpbiBEdW1wU3lzCi1jb25zdGV4cHIgaW50IE1BWF9SU1NJX0hJU1RPUlkgPSAxNTsKLQotc3RydWN0IHJzc2lfbG9nIHsKLSAgc3RydWN0IHRpbWVzcGVjIHRpbWVzdGFtcDsKLSAgc3RkOjp2ZWN0b3I8aW50OF90PiByc3NpOwotfTsKLQotc3RydWN0IEF1ZGlvU3RhdHMgewotICBzaXplX3QgcGFja2V0X2ZsdXNoX2NvdW50OwotICBzaXplX3QgcGFja2V0X3NlbmRfY291bnQ7Ci0gIHNpemVfdCBmcmFtZV9mbHVzaF9jb3VudDsKLSAgc2l6ZV90IGZyYW1lX3NlbmRfY291bnQ7Ci0gIHN0ZDo6ZGVxdWU8cnNzaV9sb2c+IHJzc2lfaGlzdG9yeTsKLQotICBBdWRpb1N0YXRzKCkgeyBSZXNldCgpOyB9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBwYWNrZXRfZmx1c2hfY291bnQgPSAwOwotICAgIHBhY2tldF9zZW5kX2NvdW50ID0gMDsKLSAgICBmcmFtZV9mbHVzaF9jb3VudCA9IDA7Ci0gICAgZnJhbWVfc2VuZF9jb3VudCA9IDA7Ci0gIH0KLX07Ci0KLS8qKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIHRoZSBDb25uZWN0aW9uIFVwZGF0ZSBzdGF0dXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIE5PTkUsICAgICAgLy8gTm90IENvbm5lY3RlZAotICBBV0FJVElORywgIC8vIFdhaXRpbmcgZm9yIHN0YXJ0IHRoZSBDb25uZWN0aW9uIFVwZGF0ZSBvcGVyYXRpb24KLSAgU1RBUlRFRCwgICAvLyBDb25uZWN0aW9uIFVwZGF0ZSBoYXMgc3RhcnRlZAotICBDT01QTEVURUQgIC8vIENvbm5lY3Rpb24gVXBkYXRlIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLX0gY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzX3Q7Ci0KLXN0cnVjdCBIZWFyaW5nRGV2aWNlIHsKLSAgUmF3QWRkcmVzcyBhZGRyZXNzOwotICAvKiBUaGlzIGlzIHRydWUgb25seSBkdXJpbmcgZmlyc3QgY29ubmVjdGlvbiB0byBwcm9maWxlLCB1bnRpbCB3ZSBzdG9yZSB0aGUKLSAgICogZGV2aWNlICovCi0gIGJvb2wgZmlyc3RfY29ubmVjdGlvbjsKLSAgYm9vbCBzZXJ2aWNlX2NoYW5nZWRfcmN2ZDsKLQotICAvKiB3ZSBhcmUgbWFraW5nIGFjdGl2ZSBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhpcyBkZXZpY2UsICdkaXJlY3QgY29ubmVjdCcuCi0gICAqIFRoaXMgaXMgdHJ1ZSBvbmx5IGR1cmluZyBpbml0aWFsIHBoYXNlIG9mIGZpcnN0IGNvbm5lY3Rpb24uICovCi0gIGJvb2wgY29ubmVjdGluZ19hY3RpdmVseTsKLQotICAvKiBGb3IgdHdvIGhlYXJpbmcgYWlkcywgeW91IG11c3QgdXBkYXRlIHRoZWlyIHBhcmFtZXRlcnMgb25lIGFmdGVyIGFub3RoZXIsCi0gICAqIG5vdCBzaW11bHRlYW5vdXNseSwgdG8gZW5zdXJlIHN0YXJ0IG9mIGNvbm5lY3Rpb24gZXZlbnRzIGZvciBib3RoIGRldmljZXMKLSAgICogYXJlIGZhciBmcm9tIGVhY2ggb3RoZXIuIFRoaXMgc3RhdHVzIHRyYWNrcyB3aGV0aGVyIHRoaXMgZGV2aWNlIGlzIHdhaXRpbmcKLSAgICogZm9yIHVwZGF0ZSBvZiBwYXJhbWV0ZXJzLCB0aGF0IHNob3VsZCBoYXBwZW4gYWZ0ZXIgIkxFIENvbm5lY3Rpb24gVXBkYXRlCi0gICAqIENvbXBsZXRlIiBldmVudAotICAgKi8KLSAgY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzX3QgY29ubmVjdGlvbl91cGRhdGVfc3RhdHVzOwotICB1aW50MTZfdCByZXF1ZXN0ZWRfY29ubmVjdGlvbl9pbnRlcnZhbDsKLQotICAvKiBpZiB0cnVlLCB3ZSBhcmUgY29ubmVjdGVkLCBMMkNBUCBzb2NrZXQgaXMgb3Blbiwgd2UgY2FuIHN0cmVhbSBhdWRpby4KLSAgICAgSG93ZXZlciwgdGhlIGFjdHVhbCBhdWRpbyBzdHJlYW0gYWxzbyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlCi0gICAgIEF1ZGlvIFNlcnZpY2UgaGFzIHJlc3VtZWQuCi0gICAqLwotICBib29sIGFjY2VwdGluZ19hdWRpbzsKLQotICB1aW50MTZfdCBjb25uX2lkOwotICB1aW50MTZfdCBnYXBfaGFuZGxlOwotICB1aW50MTZfdCBhdWRpb19jb250cm9sX3BvaW50X2hhbmRsZTsKLSAgdWludDE2X3QgYXVkaW9fc3RhdHVzX2hhbmRsZTsKLSAgdWludDE2X3QgYXVkaW9fc3RhdHVzX2NjY19oYW5kbGU7Ci0gIHVpbnQxNl90IHNlcnZpY2VfY2hhbmdlZF9jY2NfaGFuZGxlOwotICB1aW50MTZfdCB2b2x1bWVfaGFuZGxlOwotICB1aW50MTZfdCByZWFkX3BzbV9oYW5kbGU7Ci0KLSAgdWludDhfdCBjYXBhYmlsaXRpZXM7Ci0gIHVpbnQ2NF90IGhpX3N5bmNfaWQ7Ci0gIHVpbnQxNl90IHJlbmRlcl9kZWxheTsKLSAgdWludDE2X3QgcHJlcGFyYXRpb25fZGVsYXk7Ci0gIHVpbnQxNl90IGNvZGVjczsKLQotICBBdWRpb1N0YXRzIGF1ZGlvX3N0YXRzOwotICAvKiBLZWVwIHRyYWNrcyBvZiB3aGV0aGVyIHRoZSAiU3RhcnQgQ21kIiBoYXMgYmVlbiBzZW5kIHRvIHRoaXMgZGV2aWNlLiBXaGVuCi0gICAgIHRoZSAiU3RvcCBDbWQiIGlzIHNlbmQgb3Igd2hlbiB0aGlzIGRldmljZSBkaXNjb25uZWN0cywgdGhlbiB0aGlzIGZsYWcgaXMKLSAgICAgY2xlYXJlZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgIlN0YXJ0IENtZCIgaXMgbm90IHNlbmQgZHVyaW5nIGRldmljZQotICAgICBjb25uZWN0aW9uIGluIHRoZSBjYXNlIHdoZW4gdGhlIGF1ZGlvIGlzIHN1c3BlbmRlZC4gKi8KLSAgYm9vbCBwbGF5YmFja19zdGFydGVkOwotICAvKiBUaGlzIHRyYWNrcyB3aGV0aGVyIHRoZSBsYXN0IGNvbW1hbmQgdG8gSGVhcmluZyBBaWRzIGRldmljZSBpcwotICAgKiBBQ0tub3dsZWRnZWQuICovCi0gIGJvb2wgY29tbWFuZF9hY2tlZDsKLQotICAvKiBXaGVuIHJlYWRfcnNzaV9jb3VudCBpcyA+IDAsIHRoZW4gcmVhZCB0aGUgcnNzaS4gVGhlIGludGVydmFsIGJldHdlZW4gcnNzaQotICAgICByZWFkcyBpcyB0cmFja2VkIGJ5IG51bV9pbnRlcnZhbHNfc2luY2VfbGFzdF9yc3NpX3JlYWQuICovCi0gIGludCByZWFkX3Jzc2lfY291bnQ7Ci0gIGludCBudW1faW50ZXJ2YWxzX3NpbmNlX2xhc3RfcnNzaV9yZWFkOwotCi0gIEhlYXJpbmdEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBjYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgY29kZWNzLCB1aW50MTZfdCBhdWRpb19jb250cm9sX3BvaW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBhdWRpb19zdGF0dXNfaGFuZGxlLCB1aW50MTZfdCBhdWRpb19zdGF0dXNfY2NjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZSwgdWludDE2X3Qgdm9sdW1lX2hhbmRsZSwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCByZWFkX3BzbV9oYW5kbGUsIHVpbnQ2NF90IGhpU3luY0lkLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlbmRlcl9kZWxheSwgdWludDE2X3QgcHJlcGFyYXRpb25fZGVsYXkpCi0gICAgICA6IGFkZHJlc3MoYWRkcmVzcyksCi0gICAgICAgIGZpcnN0X2Nvbm5lY3Rpb24oZmFsc2UpLAotICAgICAgICBzZXJ2aWNlX2NoYW5nZWRfcmN2ZChmYWxzZSksCi0gICAgICAgIGNvbm5lY3RpbmdfYWN0aXZlbHkoZmFsc2UpLAotICAgICAgICBjb25uZWN0aW9uX3VwZGF0ZV9zdGF0dXMoTk9ORSksCi0gICAgICAgIGFjY2VwdGluZ19hdWRpbyhmYWxzZSksCi0gICAgICAgIGNvbm5faWQoMCksCi0gICAgICAgIGdhcF9oYW5kbGUoMCksCi0gICAgICAgIGF1ZGlvX2NvbnRyb2xfcG9pbnRfaGFuZGxlKGF1ZGlvX2NvbnRyb2xfcG9pbnRfaGFuZGxlKSwKLSAgICAgICAgYXVkaW9fc3RhdHVzX2hhbmRsZShhdWRpb19zdGF0dXNfaGFuZGxlKSwKLSAgICAgICAgYXVkaW9fc3RhdHVzX2NjY19oYW5kbGUoYXVkaW9fc3RhdHVzX2NjY19oYW5kbGUpLAotICAgICAgICBzZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZShzZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZSksCi0gICAgICAgIHZvbHVtZV9oYW5kbGUodm9sdW1lX2hhbmRsZSksCi0gICAgICAgIHJlYWRfcHNtX2hhbmRsZShyZWFkX3BzbV9oYW5kbGUpLAotICAgICAgICBjYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKSwKLSAgICAgICAgaGlfc3luY19pZChoaVN5bmNJZCksCi0gICAgICAgIHJlbmRlcl9kZWxheShyZW5kZXJfZGVsYXkpLAotICAgICAgICBwcmVwYXJhdGlvbl9kZWxheShwcmVwYXJhdGlvbl9kZWxheSksCi0gICAgICAgIGNvZGVjcyhjb2RlY3MpLAotICAgICAgICBwbGF5YmFja19zdGFydGVkKGZhbHNlKSwKLSAgICAgICAgY29tbWFuZF9hY2tlZChmYWxzZSksCi0gICAgICAgIHJlYWRfcnNzaV9jb3VudCgwKSB7fQotCi0gIEhlYXJpbmdEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBmaXJzdF9jb25uZWN0aW9uKQotICAgICAgOiBhZGRyZXNzKGFkZHJlc3MpLAotICAgICAgICBmaXJzdF9jb25uZWN0aW9uKGZpcnN0X2Nvbm5lY3Rpb24pLAotICAgICAgICBzZXJ2aWNlX2NoYW5nZWRfcmN2ZChmYWxzZSksCi0gICAgICAgIGNvbm5lY3RpbmdfYWN0aXZlbHkoZmlyc3RfY29ubmVjdGlvbiksCi0gICAgICAgIGNvbm5lY3Rpb25fdXBkYXRlX3N0YXR1cyhOT05FKSwKLSAgICAgICAgYWNjZXB0aW5nX2F1ZGlvKGZhbHNlKSwKLSAgICAgICAgY29ubl9pZCgwKSwKLSAgICAgICAgZ2FwX2hhbmRsZSgwKSwKLSAgICAgICAgYXVkaW9fc3RhdHVzX2hhbmRsZSgwKSwKLSAgICAgICAgYXVkaW9fc3RhdHVzX2NjY19oYW5kbGUoMCksCi0gICAgICAgIHNlcnZpY2VfY2hhbmdlZF9jY2NfaGFuZGxlKDApLAotICAgICAgICByZWFkX3BzbV9oYW5kbGUoMCksCi0gICAgICAgIGNhcGFiaWxpdGllcygwKSwKLSAgICAgICAgaGlfc3luY19pZCgwKSwKLSAgICAgICAgcmVuZGVyX2RlbGF5KDApLAotICAgICAgICBwcmVwYXJhdGlvbl9kZWxheSgwKSwKLSAgICAgICAgY29kZWNzKDApLAotICAgICAgICBwbGF5YmFja19zdGFydGVkKGZhbHNlKSwKLSAgICAgICAgY29tbWFuZF9hY2tlZChmYWxzZSksCi0gICAgICAgIHJlYWRfcnNzaV9jb3VudCgwKSB7fQotCi0gIEhlYXJpbmdEZXZpY2UoKSA6IEhlYXJpbmdEZXZpY2UoUmF3QWRkcmVzczo6a0VtcHR5LCBmYWxzZSkge30KLQotICAvKiByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRldmljZSByZXByZXNlbnRzIGxlZnQgSGVhcmluZyBBaWQuIFJldHVybmVkIHZhbHVlIGlzCi0gICAqIHZhbGlkIG9ubHkgYWZ0ZXIgY2FwYWJpbGl0aWVzIGFyZSBkaXNjb3ZlcmVkICovCi0gIGJvb2wgaXNMZWZ0KCkgY29uc3QgeyByZXR1cm4gIShjYXBhYmlsaXRpZXMgJiBDQVBBQklMSVRZX1NJREUpOyB9Ci19OwotCi1jbGFzcyBIZWFyaW5nQWlkIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkhlYXJpbmdBaWQoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShibHVldG9vdGg6OmhlYXJpbmdfYWlkOjpIZWFyaW5nQWlkQ2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSBpbml0Q2IpOwotICBzdGF0aWMgdm9pZCBDbGVhblVwKCk7Ci0gIHN0YXRpYyBib29sIElzSGVhcmluZ0FpZFJ1bm5pbmcoKTsKLSAgc3RhdGljIEhlYXJpbmdBaWQqIEdldCgpOwotICBzdGF0aWMgdm9pZCBEZWJ1Z0R1bXAoaW50IGZkKTsKLQotICBzdGF0aWMgdm9pZCBBZGRGcm9tU3RvcmFnZShjb25zdCBIZWFyaW5nRGV2aWNlJiBkZXZfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaXNfYWNjZXB0bGlzdGVkKTsKLQotICBzdGF0aWMgaW50IEdldERldmljZUNvdW50KCk7Ci0KLSAgdmlydHVhbCB2b2lkIENvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBZGRUb0FjY2VwdGxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGludDhfdCB2b2x1bWUpID0gMDsKLX07Ci0KLS8qIFJlcHJlc2VudHMgY29uZmlndXJhdGlvbiBvZiBhdWRpbyBjb2RlYywgYXMgZXhjaGFuZ2VkIGJldHdlZW4gaGVhcmluZyBhaWQgYW5kCi0gKiBwaG9uZS4KLSAqIEl0IGNhbiBhbHNvIGJlIHBhc3NlZCB0byB0aGUgYXVkaW8gc291cmNlIHRvIGNvbmZpZ3VyZSBpdHMgcGFyYW1ldGVycy4KLSAqLwotc3RydWN0IENvZGVjQ29uZmlndXJhdGlvbiB7Ci0gIC8qKiBzYW1wbGluZyByYXRlIHRoYXQgdGhlIGNvZGVjIGV4cGVjdHMgdG8gcmVjZWl2ZSBmcm9tIGF1ZGlvIGZyYW1ld29yayAqLwotICB1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQotICAvKiogYml0cmF0ZSB0aGF0IGNvZGVjIGV4cGVjdHMgdG8gcmVjZWl2ZSBmcm9tIGF1ZGlvIGZyYW1ld29yayBpbiBiaXRzIHBlcgotICAgKiBjaGFubmVsICovCi0gIHVpbnQzMl90IGJpdF9yYXRlOwotCi0gIC8qKiBEYXRhIGludGVydmFsIGRldGVybWluZXMgaG93IG9mdGVuIHdlIHNlbmQgc2FtcGxlcyB0byB0aGUgcmVtb3RlLiBUaGlzCi0gICAqIHNob3VsZCBtYXRjaCBob3cgb2Z0ZW4gd2UgZ3JhYiBkYXRhIGZyb20gYXVkaW8gc291cmNlLCBvcHRpb25hbGx5IHdlIGNhbgotICAgKiBncmFiIGRhdGEgZXZlcnkgMiBvciAzIGludGVydmFscywgYnV0IHRoaXMgd291bGQgaW5jcmVhc2UgbGF0ZW5jeS4KLSAgICoKLSAgICogVmFsdWUgaXMgcHJvdmlkZWQgaW4gbXMsIG11c3QgYmUgZGl2aXNhYmxlIGJ5IDEuMjUgdG8gbWFrZSBzdXJlIHRoZQotICAgKiBjb25uZWN0aW9uIGludGVydmFsIGlzIGludGVnZXIuCi0gICAqLwotICB1aW50MTZfdCBkYXRhX2ludGVydmFsX21zOwotfTsKLQotLyoqIFJlcHJlc2VudHMgc291cmNlIG9mIGF1ZGlvIGZvciBoZWFyaW5nIGFpZHMgKi8KLWNsYXNzIEhlYXJpbmdBaWRBdWRpb1NvdXJjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTdGFydChjb25zdCBDb2RlY0NvbmZpZ3VyYXRpb24mIGNvZGVjQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgSGVhcmluZ0FpZEF1ZGlvUmVjZWl2ZXIqIGF1ZGlvUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlbW90ZV9kZWxheV9tcyk7Ci0gIHN0YXRpYyB2b2lkIFN0b3AoKTsKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOwotICBzdGF0aWMgdm9pZCBDbGVhblVwKCk7Ci0gIHN0YXRpYyB2b2lkIERlYnVnRHVtcChpbnQgZmQpOwotfTsKZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjgyMmMyLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIGhhbmRzZnJlZSAoSEYgcm9sZSkgc3Vic3lzdGVtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX0hGX0NMSUVOVF9BUElfSAotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9oZnBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSEZQIHBlZXIgKEFHKSBmZWF0dXJlcyovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUXzNXQVkgMHgwMDAwMDAwMSAvKiBUaHJlZS13YXkgY2FsbGluZyAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1BFRVJfRkVBVF9FQ05SIFwKLSAgMHgwMDAwMDAwMiAvKiBFY2hvIGNhbmNlbGxhdGlvbiBhbmQvb3Igbm9pc2UgcmVkdWN0aW9uICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUX1ZSRUMgMHgwMDAwMDAwNCAvKiBWb2ljZSByZWNvZ25pdGlvbiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1BFRVJfSU5CQU5EIDB4MDAwMDAwMDggICAgLyogSW4tYmFuZCByaW5nIHRvbmUgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9QRUVSX1ZUQUcgXAotICAweDAwMDAwMDEwIC8qIEF0dGFjaCBhIHBob25lIG51bWJlciB0byBhIHZvaWNlIHRhZyAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1BFRVJfUkVKRUNUIFwKLSAgMHgwMDAwMDAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFiaWxpdHkgdG8gcmVqZWN0IGluY29taW5nIGNhbGwgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9QRUVSX0VDUyAweDAwMDAwMDQwIC8qIEVuaGFuY2VkIENhbGwgU3RhdHVzICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfUEVFUl9FQ0MgMHgwMDAwMDA4MCAvKiBFbmhhbmNlZCBDYWxsIENvbnRyb2wgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9QRUVSX0VYVEVSUiAweDAwMDAwMTAwIC8qIEV4dGVuZGVkIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfUEVFUl9DT0RFQyAweDAwMDAwMjAwICAvKiBDb2RlYyBOZWdvdGlhdGlvbiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1BFRVJfSEZfSU5EIDB4MDAwMDA0MDAgLyogSEYgSW5kaWNhdG9ycyAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1BFRVJfRVNDT19TNCAweDAwMDAwODAwIC8qIEVTQ08gUzQgbGluayBzZXR0aW5nICovCi0KLXR5cGVkZWYgdWludDE2X3QgdEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUOwotCi0vKiBIRlAgSEYgZmVhdHVyZXMgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9GRUFUX0VDTlIgXAotICAweDAwMDAwMDAxIC8qIEVjaG8gY2FuY2VsbGF0aW9uIGFuZC9vciBub2lzZSByZWR1Y3Rpb24gKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9GRUFUXzNXQVkgXAotICAweDAwMDAwMDAyIC8qIENhbGwgd2FpdGluZyBhbmQgdGhyZWUtd2F5IGNhbGxpbmcgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9GRUFUX0NMSSBcCi0gIDB4MDAwMDAwMDQgLyogQ2FsbGVyIElEIHByZXNlbnRhdGlvbiBjYXBhYmlsaXR5ICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfRkVBVF9WUkVDIDB4MDAwMDAwMDggIC8qIFZvaWNlIHJlY29nbml0aW9uIGFjdGl2YXRpb24gKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9GRUFUX1ZPTCAweDAwMDAwMDEwICAgLyogUmVtb3RlIHZvbHVtZSBjb250cm9sICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfRkVBVF9FQ1MgMHgwMDAwMDAyMCAgIC8qIEVuaGFuY2VkIENhbGwgU3RhdHVzICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfRkVBVF9FQ0MgMHgwMDAwMDA0MCAgIC8qIEVuaGFuY2VkIENhbGwgQ29udHJvbCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0ZFQVRfQ09ERUMgMHgwMDAwMDA4MCAvKiBDb2RlYyBOZWdvdGlhdGlvbiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0ZFQVRfSEZfSU5EIDB4MDAwMDAxMDAgIC8qIEhGIEluZGljYXRvcnMgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9GRUFUX0VTQ09fUzQgMHgwMDAwMDIwMCAvKiBFU0NPIFM0IGxpbmsgc2V0dGluZyAqLwotCi0vKiBIRlAgSEYgZXh0ZW5kZWQgY2FsbCBoYW5kbGluZyAtIG1hc2tzIG5vdCByZWxhdGVkIHRvIGFueSBzcGVjICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQ0hMRF9SRUwgXAotICAweDAwMDAwMDAxIC8qIDAgIFJlbGVhc2Ugd2FpdGluZyBjYWxsIG9yIGhlbGQgY2FsbHMgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX1JFTF9BQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDAwMDIgLyogMSAgUmVsZWFzZSBhY3RpdmUgY2FsbHMgYW5kIGFjY2VwdCBvdGhlciAod2FpdGluZyBvciBoZWxkKSBjYWwgXAotICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQ0hMRF9SRUxfWCAweDAwMDAwMDA0IC8qIDF4IFJlbGVhc2UgeCBjYWxsKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX0hPTERfQUNDIFwKLSAgMHgwMDAwMDAwOCAvKiAyICBBY3RpdmUgY2FsbHMgb24gaG9sZCBhbmQgYWNjZXB0IG90aGVyIGNhbGwgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX1BSSVZfWCBcCi0gIDB4MDAwMDAwMTAgLyogMnggQWN0aXZlIG11bHRpcGFydHkgY2FsbCBvbiBob2xkIGV4Y2VwdCBjYWxsIHggKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX01FUkdFICAgICAgICAgICAgICAgXAotICAweDAwMDAwMDIwIC8qIDMgIEFkZCBoZWxkIGNhbGwgdG8gbXVsdGlwYXJ0eSBcCi0gICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DSExEX01FUkdFX0RFVEFDSCBcCi0gIDB4MDAwMDAwNDAgLyogNCAgQWRkIGhlbGQgY2FsbCB0byBtdWx0aXBhcnR5ICovCi0KLXR5cGVkZWYgdWludDE2X3QgdEJUQV9IRl9DTElFTlRfQ0hMRF9GRUFUOwotCi0vKiBIRlAgQUcgZXJyb3JzIG90IE9LIHNlbnQgdG8gSEYgVW5pdCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9PSyAwCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0VSUk9SIDEKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfTk9fQ0FSUklFUiAyCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0JVU1kgMwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9OT19BTlNXRVIgNAotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9ERUxBWSA1Ci0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX1JFSkVDVExJU1RFRCA2Ci0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0NNRSA3Ci0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRTsKLQotLyogSEYgQ2xpZW50IGNhbGxiYWNrIGV2ZW50cyAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0VOQUJMRV9FVlQgMCAgICAgLyogSEYgQ2xpZW50IGVuYWJsZWQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9SRUdJU1RFUl9FVlQgMSAgIC8qIEhGIENsaWVudCByZWdpc3RlcmVkICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfT1BFTl9FVlQgMiAgICAgICAvKiBIRiBDbGllbnQgY29ubmVjdGlvbiBvcGVuICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQ0xPU0VfRVZUIDMgICAgICAvKiBIRiBDbGllbnQgY29ubmVjdGlvbiBjbG9zZWQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DT05OX0VWVCA0ICAgICAgIC8qIFNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiBvcGVuZWQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVURJT19PUEVOX0VWVCA1IC8qIEF1ZGlvIGNvbm5lY3Rpb24gb3BlbiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FVRElPX01TQkNfT1BFTl9FVlQgXAotICA2IC8qIEF1ZGlvIGNvbm5lY3Rpb24gd2l0aCBtU0JDIGNvZGVjIG9wZW4gKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVURJT19DTE9TRV9FVlQgNyAvKiBBdWRpbyBjb25uZWN0aW9uIGNsb3NlZCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1NQS19FVlQgOCAgICAgICAgIC8qIFNwZWFrZXIgdm9sdW1lIGNoYW5nZWQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9NSUNfRVZUIDkgICAgICAgICAvKiBNaWNyb3Bob25lIHZvbHVtZSBjaGFuZ2VkICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5EX0VWVCAxMCAgICAgICAgLyogSW5kaWNhdG9yICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfVk9JQ0VfUkVDX0VWVCBcCi0gIDExIC8qIEFHIGNoYW5nZWQgdm9pY2UgcmVjb2duaXRpb24gc2V0dGluZyAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX09QRVJBVE9SX05BTUVfRVZUIDEyIC8qIE9wZXJhdG9yIG5hbWUgYWNxdWlyZWQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9DTElQX0VWVCAxMyAgICAgIC8qIENhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiBldmVudCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0NDV0FfRVZUIDE0ICAgICAgLyogQ2FsbCB3YWl0aW5nIG5vdGlmaWNhdGlvbiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9FVlQgMTUgLyogQ2FsbCB3YWl0aW5nIG5vdGlmaWNhdGlvbiAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0NMQ0NfRVZUIDE2ICAgICAgLyogY3VycmVudCBjYWxsIGV2ZW50ICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQ05VTV9FVlQgMTcgICAgICAvKiBzdWJzY3JpYmVyIGluZm9ybWF0aW9uIGV2ZW50ICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQlRSSF9FVlQgMTggICAgICAvKiBibHVldG9vdGggcmVzcG9uc2UgYW5kIGhvbGQgZXZlbnQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9CU0lSX0VWVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluLWJhbmQgcmluZyB0b25lIHNldHRpbmcgY2hhbmdlZCBldmVudCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9CSU5QX0VWVCAyMCAvKiBiaW5wIG51bWJlciBldmVudCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX1JJTkdfSU5ESUNBVElPTiAyMSAvKiBIRiBDbGllbnQgcmluZyBpbmRpY2F0aW9uICovCi0KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9VTktOT1dOX0VWVCAyMiAvKiBVbmtub3duIG9yIHZlbmRvciBzcGVjaWZpYyBFdmVudCAqLwotCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfRElTQUJMRV9FVlQgMzAgICAgIC8qIEhGIENsaWVudCBkaXNhYmxlZCAqLwotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9IRl9DTElFTlRfRVZUOwotCi0vKiBIRiBDbGllbnQgb3BlbiBzdGF0dXMgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9TVUNDRVNTIDAgICAgICAgIC8qIENvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0ZBSUxfU0RQIDEgICAgICAgLyogT3BlbiBmYWlsZWQgZHVlIHRvIFNEUCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0ZBSUxfUkZDT01NIDIgICAgLyogT3BlbiBmYWlsZWQgZHVlIHRvIFJGQ09NTSAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0ZBSUxfUkVTT1VSQ0VTIDMgLyogb3V0IG9mIHJlc291cmNlcyBmYWlsdXJlICAqLwotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9IRl9DTElFTlRfU1RBVFVTOwotCi0vKiBpbmRpY2F0b3IgdHlwZSAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0lORF9CQVRUQ0ggMCAgICAvKiBCYXR0ZXJ5IGNoYXJnZSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9JTkRfU0lHTkFMIDEgICAgLyogU2lnbmFsIFN0cmVuZ3RoIGluZGljYXRvciAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0lORF9TRVJWSUNFIDIgICAvKiBTZXJ2aWNlIGF2YWlsYWJpbGl0eSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9JTkRfQ0FMTCAzICAgICAgLyogU3RhbmRhcmQgY2FsbCBzdGF0dXMgaW5kaWNhdG9yKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9JTkRfUk9BTSA0ICAgICAgLyogUm9hbWluZyBzdGF0dXMgaW5kaWNhdG9yICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfSU5EX0NBTExTRVRVUCA1IC8qIENhbGwgc2V0dXAgc3RhdHVzIGluZGljYXRvciAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0lORF9DQUxMSEVMRCA2ICAvKiBDYWxsIGhvbGQgc3RhdHVzIGluZGljYXRvciAqLwotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9IRl9DTElFTlRfSU5EX1RZUEU7Ci0KLS8qIEFUIGNvbW1hbmRzICovCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX1ZUUyAwCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JUUkggMQotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DSFVQIDIKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hMRCAzCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JDQyA0Ci0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0NOVU0gNQotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9BVEEgNgotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DT1BTIDcKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfQVREIDgKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfVkdNIDkKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfVkdTIDEwCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JWUkEgMTEKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0xDQyAxMgotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CSU5QIDEzCi0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JMRE4gMTQKLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9BVF9DTURfTlJFQyAxNQotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9WRU5ET1JfU1BFQ0lGSUNfQ01EIDE2Ci0jZGVmaW5lIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JJRVYgMTcKLQotdHlwZWRlZiB1aW50OF90IHRCVEFfSEZfQ0xJRU5UX0FUX0NNRF9UWVBFOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX1JFR0lTVEVSX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVEFfSEZfQ0xJRU5UX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfSEZfQ0xJRU5UX1JFR0lTVEVSOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX09QRU5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdWludDE2X3QgaGFuZGxlOyAgLy8gSGFuZGxlIGZvciBjbGllbnQgY29udHJvbCBibG9jawotICB0QlRBX0hGX0NMSUVOVF9TVEFUVVMgc3RhdHVzOwotfSB0QlRBX0hGX0NMSUVOVF9PUEVOOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX0NPTk5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUIHBlZXJfZmVhdDsKLSAgdEJUQV9IRl9DTElFTlRfQ0hMRF9GRUFUIGNobGRfZmVhdDsKLX0gdEJUQV9IRl9DTElFTlRfQ09OTjsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0hGX0NMSUVOVF9JTkRfRVZUIGV2ZW50ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdEJUQV9IRl9DTElFTlRfSU5EX1RZUEUgdHlwZTsKLSAgdWludDE2X3QgdmFsdWU7Ci19IHRCVEFfSEZfQ0xJRU5UX0lORDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0hGX0NMSUVOVF9PUEVSQVRPUl9OQU1FX0VWVCAqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX09QRVJBVE9SX05BTUVfTEVOIDE2Ci10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgY2hhciBuYW1lW0JUQV9IRl9DTElFTlRfT1BFUkFUT1JfTkFNRV9MRU4gKyAxXTsKLX0gdEJUQV9IRl9DTElFTlRfT1BFUkFUT1JfTkFNRTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0hGX0NMSUVOVF9DTElQX0VWVCAgYW5kIEJUQV9IRl9DTElFTlRfQ0NXQV9FVlQqLwotI2RlZmluZSBCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU4gMzIKLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBjaGFyIG51bWJlcltCVEFfSEZfQ0xJRU5UX05VTUJFUl9MRU4gKyAxXTsKLX0gdEJUQV9IRl9DTElFTlRfTlVNQkVSOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9FVlQgZXZlbnQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB0QlRBX0hGX0NMSUVOVF9BVF9SRVNVTFRfVFlQRSB0eXBlOwotICB1aW50MTZfdCBjbWU7Ci19IHRCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0hGX0NMSUVOVF9DTENDX0VWVCBldmVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQzMl90IGlkeDsKLSAgYm9vbCBpbmM7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICBib29sIG1wdHk7Ci0gIGJvb2wgbnVtYmVyX3ByZXNlbnQ7Ci0gIGNoYXIgbnVtYmVyW0JUQV9IRl9DTElFTlRfTlVNQkVSX0xFTiArIDFdOwotfSB0QlRBX0hGX0NMSUVOVF9DTENDOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSEZfQ0xJRU5UX0NOVU1fRVZUIGV2ZW50ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdWludDE2X3Qgc2VydmljZTsKLSAgY2hhciBudW1iZXJbQlRBX0hGX0NMSUVOVF9OVU1CRVJfTEVOICsgMV07Ci19IHRCVEFfSEZfQ0xJRU5UX0NOVU07Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG90aGVyIGV2ZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQxNl90IHZhbHVlOwotfSB0QlRBX0hGX0NMSUVOVF9WQUw7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9IRl9DTElFTlRfVU5LTk9XTl9FVlQgZXZlbnQgKi8KLSNkZWZpbmUgQlRBX0hGX0NMSUVOVF9VTktPV05fRVZFTlRfTEVOIDMyCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgY2hhciBldmVudF9zdHJpbmdbQlRBX0hGX0NMSUVOVF9VTktPV05fRVZFTlRfTEVOICsgMV07Ci19IHRCVEFfSEZfQ0xJRU5UX1VOS05PV047Ci0KLS8qIHVuaW9uIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFHIGNhbGxiYWNrICovCi10eXBlZGVmIHVuaW9uIHsKLSAgLy8gQ29tbW9uIEJEIEFERFIgZmllbGQgZm9yIGFsbCB0eWVwZGVmcwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVEFfSEZfQ0xJRU5UX1JFR0lTVEVSIHJlZzsKLSAgdEJUQV9IRl9DTElFTlRfT1BFTiBvcGVuOwotICB0QlRBX0hGX0NMSUVOVF9DT05OIGNvbm47Ci0gIHRCVEFfSEZfQ0xJRU5UX0lORCBpbmQ7Ci0gIHRCVEFfSEZfQ0xJRU5UX1ZBTCB2YWw7Ci0gIHRCVEFfSEZfQ0xJRU5UX09QRVJBVE9SX05BTUUgb3BlcmF0b3JfbmFtZTsKLSAgdEJUQV9IRl9DTElFTlRfTlVNQkVSIG51bWJlcjsKLSAgdEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUIHJlc3VsdDsKLSAgdEJUQV9IRl9DTElFTlRfQ0xDQyBjbGNjOwotICB0QlRBX0hGX0NMSUVOVF9DTlVNIGNudW07Ci0gIHRCVEFfSEZfQ0xJRU5UX1VOS05PV04gdW5rbm93bjsKLX0gdEJUQV9IRl9DTElFTlQ7Ci0KLXR5cGVkZWYgdWludDMyX3QgdEJUQV9IRl9DTElFTlRfRkVBVDsKLQotLyogSEYgQ2xpZW50IGNhbGxiYWNrICovCi10eXBlZGVmIHZvaWQodEJUQV9IRl9DTElFTlRfQ0JBQ0spKHRCVEFfSEZfQ0xJRU5UX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlQqIHBfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGllbnRFbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZSB0aGUgSEYgQ0xpZW50IHNlcnZpY2UuIFdoZW4gdGhlIGVuYWJsZQotICogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gaXMgY29tcGxldGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggYSBCVEFfSEZfQ0xJRU5UX0VOQUJMRV9FVlQuIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGZ1bmN0aW9uIGluIHRoZSBIRiBDTGllbnQgQVBJIGFyZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiBPSywgQlRBX0ZBSUxVUkUgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX1NUQVRVUyBCVEFfSGZDbGllbnRFbmFibGUodEJUQV9IRl9DTElFTlRfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX3NlcnZpY2VfbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGllbnREaXNhYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNhYmxlIHRoZSBIRiBDbGllbnQgc2VydmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnREaXNhYmxlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hmQ2xpZW50T3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbnMgYSBjb25uZWN0aW9uIHRvIGFuIGF1ZGlvIGdhdGV3YXkuCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gY29ubmVjdGlvbiBpcyBvcGVuIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZAotICogICAgICAgICAgICAgICAgICB3aXRoIGEgQlRBX0hGX0NMSUVOVF9PUEVOX0VWVC4gT25seSB0aGUgZGF0YSBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5lZC4gVGhlIGF1ZGlvIGNvbm5lY3Rpb24gaXMgbm90IG9wZW5lZC4gVGhlIGhhbmRsZQotICogICAgICAgICAgICAgICAgICBpcyBzdG9yZWQgaW4gcF9oYW5kbGUgYW5kIHNob3VsZCBiZSB1c2VkIGZvciBzdWJzZXF1ZW50Ci0gKiAgICAgICAgICAgICAgICAgIGNhbGxzIHRvIGRvIGFueSBBVCBvcGVyYXRpb25zCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudE9wZW4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QqIHBfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZkNsaWVudENsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIHRvIGFuIGF1ZGlvIGdhdGV3YXkuCi0gKiAgICAgICAgICAgICAgICAgIEFueSBjdXJyZW50IGF1ZGlvIGNvbm5lY3Rpb24gd2lsbCBhbHNvIGJlIGNsb3NlZAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSGZDbGllbnRDbG9zZSh1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hmQ2xsaWVudEF1ZGlvT3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbnMgYW4gYXVkaW8gY29ubmVjdGlvbiB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZAotICogICAgICAgICAgICAgICAgIGF1ZGlvIGdhdGV3YXkKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0hmQ2xpZW50QXVkaW9PcGVuKHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGZDbGllbnRBdWRpb0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBhdWRpbyBjb25uZWN0aW9uIHRvIGFuIGF1ZGlvCi0gKiAgICAgICAgICAgICAgICAgIGdhdGV3YXkuIFRoZSBkYXRhIGNvbm5lY3Rpb24gcmVtYWlucyBvcGVuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudEF1ZGlvQ2xvc2UodWludDE2X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZkNsaWVudFNlbmRBVAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc2VuZCBBVCBjb21tYW5kCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudFNlbmRBVCh1aW50MTZfdCBoYW5kbGUsIHRCVEFfSEZfQ0xJRU5UX0FUX0NNRF9UWVBFIGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsMSwgdWludDMyX3QgdmFsMiwgY29uc3QgY2hhciogc3RyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IZkNsaWVudER1bXBTdGF0aXN0aWNzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEdW1wIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHZhcmlvdXMgY29udHJvbCBibG9ja3MKLSAqICAgICAgICAgICAgICAgICAgYW5kIG90aGVyIHJlbGV2YW50IGNvbm5lY3Rpb24gc3RhdGlzdGljcwotICoKLSAqIFJldHVybnMgICAgICAgICAgVm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9IZkNsaWVudER1bXBTdGF0aXN0aWNzKGludCBmZCk7Ci0KLSNlbmRpZiAvKiBCVEFfSEZfQ0xJRU5UX0FQSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfaGZwX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2hmcF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkZDNhOS4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfaGZwX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBCVEFfSEZQX0FQSV9ICi0jZGVmaW5lIEJUQV9IRlBfQVBJX0gKLQotLyogSEZQIFZlcnNpb25zICovCi0jZGVmaW5lIEhGUF9IU1BfVkVSU0lPTl9VTktOT1dOIDB4MDAwMAotI2RlZmluZSBIRlBfSFNQX1ZFUlNJT05fRE9OVF9DQVJFIDB4RkZGRgotI2RlZmluZSBIRlBfVkVSU0lPTl8xXzEgMHgwMTAxCi0jZGVmaW5lIEhGUF9WRVJTSU9OXzFfNSAweDAxMDUKLSNkZWZpbmUgSEZQX1ZFUlNJT05fMV82IDB4MDEwNgotI2RlZmluZSBIRlBfVkVSU0lPTl8xXzcgMHgwMTA3Ci0KLSNkZWZpbmUgSFNQX1ZFUlNJT05fMV8wIDB4MDEwMAotI2RlZmluZSBIU1BfVkVSU0lPTl8xXzIgMHgwMTAyCi0KLSNkZWZpbmUgSEZQX1ZFUlNJT05fQ09ORklHX0tFWSAiSGZwVmVyc2lvbiIKLSNkZWZpbmUgSEZQX1NEUF9GRUFUVVJFU19DT05GSUdfS0VZICJIZnBTZHBGZWF0dXJlcyIKLQotLyogRGVmYXVsdCBIRlAgVmVyc2lvbiAqLwotI2lmbmRlZiBCVEFfSEZQX1ZFUlNJT04KLSNkZWZpbmUgQlRBX0hGUF9WRVJTSU9OIEhGUF9WRVJTSU9OXzFfNwotI2VuZGlmCi0KLSNlbmRpZiAvKiBCVEFfSEZQX0FQSV9IICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2hoX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2hoX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmM5ZGRjLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9oaF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfSEhfQVBJX0gKLSNkZWZpbmUgQlRBX0hIX0FQSV9ICi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGlkZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyBhbmQgVHlwZSBEZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9ISF9ERUJVRwotI2RlZmluZSBCVEFfSEhfREVCVUcgVFJVRQotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0hIX1NTUl9NQVhfTEFURU5DWV9ERUYKLSNkZWZpbmUgQlRBX0hIX1NTUl9NQVhfTEFURU5DWV9ERUYgODAwIC8qIDUwMCBtcyovCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfSEhfU1NSX01JTl9UT1VUX0RFRgotI2RlZmluZSBCVEFfSEhfU1NSX01JTl9UT1VUX0RFRiAyCi0jZW5kaWYKLQotI2lmbmRlZiBDQVNFX1JFVFVSTl9URVhUCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLSNlbmRpZgotCi0vKiBCVEEgSElEIEhvc3QgY2FsbGJhY2sgZXZlbnRzICovCi0jZGVmaW5lIEJUQV9ISF9FTkFCTEVfRVZUIDAgICAgIC8qIEhIIGVuYWJsZWQgKi8KLSNkZWZpbmUgQlRBX0hIX0RJU0FCTEVfRVZUIDEgICAgLyogSEggZGlzYWJsZWQgKi8KLSNkZWZpbmUgQlRBX0hIX09QRU5fRVZUIDIgICAgICAgLyogY29ubmVjdGlvbiBvcGVuZWQgKi8KLSNkZWZpbmUgQlRBX0hIX0NMT1NFX0VWVCAzICAgICAgLyogY29ubmVjdGlvbiBjbG9zZWQgKi8KLSNkZWZpbmUgQlRBX0hIX0dFVF9SUFRfRVZUIDQgICAgLyogQlRBX0hoR2V0UmVwb3J0IGNhbGxiYWNrICovCi0jZGVmaW5lIEJUQV9ISF9TRVRfUlBUX0VWVCA1ICAgIC8qIEJUQV9IaFNldFJlcG9ydCBjYWxsYmFjayAqLwotI2RlZmluZSBCVEFfSEhfR0VUX1BST1RPX0VWVCA2ICAvKiBCVEFfR2V0UHJvdG9Nb2RlIGNhbGxiYWNrICovCi0jZGVmaW5lIEJUQV9ISF9TRVRfUFJPVE9fRVZUIDcgIC8qIEJUQV9IaFNldFByb3RvTW9kZSBjYWxsYmFjayAqLwotI2RlZmluZSBCVEFfSEhfR0VUX0lETEVfRVZUIDggICAvKiBCVEFfSGhHZXRJZGxlIGNvbWVzIGNhbGxiYWNrICovCi0jZGVmaW5lIEJUQV9ISF9TRVRfSURMRV9FVlQgOSAgIC8qIEJUQV9IaFNldElkbGUgZmluaXNoIGNhbGxiYWNrICovCi0jZGVmaW5lIEJUQV9ISF9HRVRfRFNDUF9FVlQgMTAgIC8qIEdldCByZXBvcnQgZGVzY3JpcHRvciAqLwotI2RlZmluZSBCVEFfSEhfQUREX0RFVl9FVlQgMTEgICAvKiBBZGQgRGV2aWNlIGNhbGxiYWNrICovCi0jZGVmaW5lIEJUQV9ISF9STVZfREVWX0VWVCAxMiAgIC8qIHJlbW92ZSBkZXZpY2UgZmluaXNoZWQgKi8KLSNkZWZpbmUgQlRBX0hIX1ZDX1VOUExVR19FVlQgMTMgLyogdmlydHVhbGx5IHVucGx1Z2dlZCAqLwotI2RlZmluZSBCVEFfSEhfREFUQV9FVlQgMTUKLSNkZWZpbmUgQlRBX0hIX0FQSV9FUlJfRVZUIDE2ICAgICAvKiBBUEkgZXJyb3IgaXMgY2F1Z2h0ICovCi0jZGVmaW5lIEJUQV9ISF9VUERBVEVfU0NQUF9FVlQgMTcgLyogdXBkYXRlIHNjYW4gcGFyYW10ZXIgY29tcGxldGUgKi8KLQotdHlwZWRlZiB1aW50MTZfdCB0QlRBX0hIX0VWVDsKLQotLyogYXBwbGljYXRpb24gSUQobm9uZS16ZXJvKSBmb3IgZWFjaCB0eXBlIG9mIGRldmljZSAqLwotI2RlZmluZSBCVEFfSEhfQVBQX0lEX01JIDEKLSNkZWZpbmUgQlRBX0hIX0FQUF9JRF9LQiAyCi0jZGVmaW5lIEJUQV9ISF9BUFBfSURfUk1DIDMKLSNkZWZpbmUgQlRBX0hIX0FQUF9JRF8zRFNHIDQKLSNkZWZpbmUgQlRBX0hIX0FQUF9JRF9KT1kgNQotI2RlZmluZSBCVEFfSEhfQVBQX0lEX0dQQUQgNgotI2RlZmluZSBCVEFfSEhfQVBQX0lEX0xFIDB4ZmYKLQotLyogZGVmaW5lZCB0aGUgbWluaW11bSBvZmZzZXQgKi8KLSNkZWZpbmUgQlRBX0hIX01JTl9PRkZTRVQgKEwyQ0FQX01JTl9PRkZTRVQgKyAxKQotCi0vKiBISURfSE9TVF9NQVhfREVWSUNFUyBjYW4gbm90IGV4Y2VlZCAxNSBmb3IgdGggZGVzaWduIG9mIEJUQSBISCAqLwotI2RlZmluZSBCVEFfSEhfSURYX0lOVkFMSUQgMHhmZgotI2RlZmluZSBCVEFfSEhfTUFYX0tOT1dOIEhJRF9IT1NUX01BWF9ERVZJQ0VTCi0KLS8qIEdBVFRfTUFYX1BIWV9DSEFOTkVMIGNhbiBub3QgZXhjZWVkIDE0IGZvciB0aGUgZGVzaWduIG9mIEJUQSBISCAqLwotI2lmIEdBVFRfTUFYX1BIWV9DSEFOTkVMID4gMTQKLSNkZWZpbmUgQlRBX0hIX0xFX01BWF9LTk9XTiAxNAotI2Vsc2UKLSNkZWZpbmUgQlRBX0hIX0xFX01BWF9LTk9XTiBHQVRUX01BWF9QSFlfQ0hBTk5FTAotI2VuZGlmCi0KLSNkZWZpbmUgQlRBX0hIX01BWF9ERVZJQ0UgKEhJRF9IT1NUX01BWF9ERVZJQ0VTICsgQlRBX0hIX0xFX01BWF9LTk9XTikKLS8qIGludmFsaWQgZGV2aWNlIGhhbmRsZSAqLwotI2RlZmluZSBCVEFfSEhfSU5WQUxJRF9IQU5ETEUgMHhmZgotCi0vKiB0eXBlIG9mIHByb3RvY29sIG1vZGUgKi8KLSNkZWZpbmUgQlRBX0hIX1BST1RPX1JQVF9NT0RFICgweDAwKQotI2RlZmluZSBCVEFfSEhfUFJPVE9fQk9PVF9NT0RFICgweDAxKQotI2RlZmluZSBCVEFfSEhfUFJPVE9fVU5LTk9XTiAoMHhmZikKLXR5cGVkZWYgdWludDhfdCB0QlRBX0hIX1BST1RPX01PREU7Ci0KLWVudW0geyBCVEFfSEhfS0VZQkRfUlBUX0lEID0gMSwgQlRBX0hIX01PVVNFX1JQVF9JRCB9OwotdHlwZWRlZiB1aW50OF90IHRCVEFfSEhfQk9PVF9SUFRfSUQ7Ci0KLS8qIHR5cGUgb2YgZGV2aWNlcywgYml0IG1hc2sgKi8KLSNkZWZpbmUgQlRBX0hIX0RFVlRfVU5LTk9XTiAweDAwCi0jZGVmaW5lIEJUQV9ISF9ERVZUX0pPUyAweDAxIC8qIGpveSBzdGljayAqLwotI2RlZmluZSBCVEFfSEhfREVWVF9HUEQgMHgwMiAvKiBnYW1lIHBhZCAqLwotI2RlZmluZSBCVEFfSEhfREVWVF9STUMgMHgwMyAvKiByZW1vdGUgY29udHJvbCAqLwotI2RlZmluZSBCVEFfSEhfREVWVF9TRUQgMHgwNCAvKiBzZW5zaW5nIGRldmljZSAqLwotI2RlZmluZSBCVEFfSEhfREVWVF9ER1QgMHgwNSAvKiBEaWdpdGl6ZXIgdGFibGV0ICovCi0jZGVmaW5lIEJUQV9ISF9ERVZUX0NEUiAweDA2IC8qIGNhcmQgcmVhZGVyICovCi0jZGVmaW5lIEJUQV9ISF9ERVZUX0tCRCAweDEwIC8qIGtleWJvYXJkICovCi0jZGVmaW5lIEJUQV9ISF9ERVZUX01JQyAweDIwIC8qIHBvaW50aW5nIGRldmljZSAqLwotI2RlZmluZSBCVEFfSEhfREVWVF9DT00gMHgzMCAvKiBDb21ibyBrZXlib2FyZC9wb2ludGluZyAqLwotI2RlZmluZSBCVEFfSEhfREVWVF9PVEhFUiAweDgwCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9ISF9ERVZUOwotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRBX0hIX09LID0gMCwKLSAgQlRBX0hIX0hTX0hJRF9OT1RfUkVBRFksICAvKiBoYW5kc2hha2UgZXJyb3IgOiBkZXZpY2Ugbm90IHJlYWR5ICovCi0gIEJUQV9ISF9IU19JTlZBTElEX1JQVF9JRCwgLyogaGFuZHNoYWtlIGVycm9yIDogaW52YWxpZCByZXBvcnQgSUQgKi8KLSAgQlRBX0hIX0hTX1RSQU5TX05PVF9TUFQsICAvKiBoYW5kc2hha2UgZXJyb3IgOiB0cmFuc2FjdGlvbiBub3Qgc3B0ICovCi0gIEJUQV9ISF9IU19JTlZBTElEX1BBUkFNLCAgLyogaGFuZHNoYWtlIGVycm9yIDogaW52YWxpZCBwYXJlbXRlciAqLwotICBCVEFfSEhfSFNfRVJST1IsICAgICAgICAgIC8qIGhhbmRzaGFrZSBlcnJvciA6IHVuc3BlY2lmaWVkIEhTIGVycm9yICovCi0gIEJUQV9ISF9FUlIsICAgICAgICAgICAgICAgLyogZ2VuZXJhbCBCVEEgSEggZXJyb3IgKi8KLSAgQlRBX0hIX0VSUl9TRFAsICAgICAgICAgICAvKiBTRFAgZXJyb3IgKi8KLSAgQlRBX0hIX0VSUl9QUk9UTywgICAgICAgICAvKiBTRVRfUHJvdG9jb2wgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgdXNlZCBpbiBCVEFfSEhfT1BFTl9FVlQgY2FsbGJhY2sgKi8KLQotICBCVEFfSEhfRVJSX0RCX0ZVTEwsICAgICAvKiBkZXZpY2UgZGF0YWJhc2UgZnVsbCBlcnJvciwgdXNlZCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEhfT1BFTl9FVlQvQlRBX0hIX0FERF9ERVZfRVZUICovCi0gIEJUQV9ISF9FUlJfVE9EX1VOU1BULCAgIC8qIHR5cGUgb2YgZGV2aWNlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgQlRBX0hIX0VSUl9OT19SRVMsICAgICAgLyogb3V0IG9mIHN5c3RlbSByZXNvdXJjZXMgKi8KLSAgQlRBX0hIX0VSUl9BVVRIX0ZBSUxFRCwgLyogYXV0aGVudGljYXRpb24gZmFpbCAqLwotICBCVEFfSEhfRVJSX0hETCwKLSAgQlRBX0hIX0VSUl9TRUMKLX0gdEJUQV9ISF9TVEFUVVM7Ci0KLWlubGluZSB0QlRBX0hIX1NUQVRVUyB0b19idGFfaGhfc3RhdHVzKHVpbnQzMl90IHN0YXR1cykgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8dEJUQV9ISF9TVEFUVVM+KHN0YXR1cyk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBidGFfaGhfc3RhdHVzX3RleHQoY29uc3QgdEJUQV9ISF9TVEFUVVMmIHN0YXR1cykgewotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0hIX09LKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9ISF9IU19ISURfTk9UX1JFQURZKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9ISF9IU19JTlZBTElEX1JQVF9JRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfSFNfVFJBTlNfTk9UX1NQVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfSFNfSU5WQUxJRF9QQVJBTSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfSFNfRVJST1IpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0hIX0VSUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfRVJSX1NEUCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfRVJSX1BST1RPKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9ISF9FUlJfREJfRlVMTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfRVJSX1RPRF9VTlNQVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfRVJSX05PX1JFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFfSEhfRVJSX0FVVEhfRkFJTEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9ISF9FUlJfSERMKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQV9ISF9FUlJfU0VDKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOWyVoaHVdIiwgc3RhdHVzKTsKLSAgfQotfQotCi10eXBlZGVmIHVpbnQxNl90IHRCVEFfSEhfQVRUUl9NQVNLOwotCi0vKiBzdXBwb3J0ZWQgdHlwZSBvZiBkZXZpY2UgYW5kIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gSUQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9ISF9ERVZUIHRvZDsgLyogdHlwZSBvZiBkZXZpY2UgICAgICAgICAgICAgICAqLwotICB1aW50OF90IGFwcF9pZDsgICAvKiBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIElEICovCi19IHRCVEFfSEhfU1BUX1RPRDsKLQotLyogY29uZmlndXJhdGlvbiBzdHJ1Y3QgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBtYXhfZGV2dF9zcHQ7ICAgICAgICAgLyogbWF4IG51bWJlciBvZiB0eXBlcyBvZiBkZXZpY2VzIHNwdCAqLwotICB0QlRBX0hIX1NQVF9UT0QqIHBfZGV2dF9saXN0OyAvKiBzdXBwb3J0ZWQgdHlwZXMgb2YgZGV2aWNlIGxpc3QgICAgICovCi0gIHVpbnQxNl90IHNkcF9kYl9zaXplOwotfSB0QlRBX0hIX0NGRzsKLQotZW51bSB7Ci0gIEJUQV9ISF9SUFRUX1JFU1JWLCAgLyogcmVzZXJ2ZWQgICAgICAgICAqLwotICBCVEFfSEhfUlBUVF9JTlBVVCwgIC8qIGlucHV0IHJlcG9ydCAgICAgKi8KLSAgQlRBX0hIX1JQVFRfT1VUUFVULCAvKiBvdXRwdXQgcmVwb3J0ICAgICovCi0gIEJUQV9ISF9SUFRUX0ZFQVRVUkUgLyogZmVhdHVyZSByZXBvcnQgICAqLwotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRBX0hIX1JQVF9UWVBFOwotCi0vKiBISURfQ09OVFJPTCBvcGVyYXRpb24gY29kZSB1c2VkIGluIEJUQV9IaFNlbmRDdHJsKCkKLSovCi1lbnVtIHsKLSAgQlRBX0hIX0NUUkxfTk9QID0gMCArIEhJRF9QQVJfQ09OVFJPTF9OT1AsIC8qIG1hcHBpbmcgZnJvbSBCVEUgKi8KLSAgQlRBX0hIX0NUUkxfSEFSRF9SRVNFVCwgICAgICAgICAgICAgICAgICAgIC8qIGhhcmQgcmVzZXQgICAgICAgKi8KLSAgQlRBX0hIX0NUUkxfU09GVF9SRVNFVCwgICAgICAgICAgICAgICAgICAgIC8qIHNvZnQgcmVzZXQgICAgICAgKi8KLSAgQlRBX0hIX0NUUkxfU1VTUEVORCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGVudGVyIHN1c3BlbmQgICAgKi8KLSAgQlRBX0hIX0NUUkxfRVhJVF9TVVNQRU5ELCAgICAgICAgICAgICAgICAgIC8qIGV4aXQgc3VzcGVuZCAgICAgKi8KLSAgQlRBX0hIX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUcgICAgICAgICAgIC8qIHZpcnR1YWwgdW5wbHVnICAgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUQV9ISF9UUkFOU19DVFJMX1RZUEU7Ci0KLXR5cGVkZWYgdEhJRF9ERVZfRFNDUF9JTkZPIHRCVEFfSEhfREVWX0RFU0NSOwotCi0jZGVmaW5lIEJUQV9ISF9TU1JfUEFSQU1fSU5WQUxJRCBISURfU1NSX1BBUkFNX0lOVkFMSUQKLQotLyogaWQgREkgaXMgbm90IGV4aXN0aW5nIGluIHJlbW90ZSBkZXZpY2UsIHZlbmRvcl9pZCBpbiB0QlRBX0hIX0RFVl9EU0NQX0lORk8KLSAqIHdpbGwgYmUgc2V0IHRvIDB4ZmZmZiAqLwotI2RlZmluZSBCVEFfSEhfVkVORE9SX0lEX0lOVkFMSUQgMHhmZmZmCi0KLS8qIHJlcG9ydCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHZlbmRvcl9pZDsgICAgICAgLyogdmVuZG9yIElEICovCi0gIHVpbnQxNl90IHByb2R1Y3RfaWQ7ICAgICAgLyogcHJvZHVjdCBJRCAqLwotICB1aW50MTZfdCB2ZXJzaW9uOyAgICAgICAgIC8qIHZlcnNpb24gKi8KLSAgdWludDE2X3Qgc3NyX21heF9sYXRlbmN5OyAvKiBTU1IgbWF4IGxhdGVuY3ksIEJUQV9ISF9TU1JfUEFSQU1fSU5WQUxJRCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gKi8KLSAgdWludDE2X3QKLSAgICAgIHNzcl9taW5fdG91dDsgIC8qIFNTUiBtaW4gdGltZW91dCwgQlRBX0hIX1NTUl9QQVJBTV9JTlZBTElEIGlmIHVua25vd24gKi8KLSAgdWludDhfdCBjdHJ5X2NvZGU7IC8qQ291bnRyeSBDb2RlLiovCi0jZGVmaW5lIEJUQV9ISF9MRV9SRU1PVEVfV0FLRSAweDAxCi0jZGVmaW5lIEJUQV9ISF9MRV9OT1JNQUxfQ09OTiAweDAyCi0KLSAgdWludDhfdCBmbGFnOwotICB0QlRBX0hIX0RFVl9ERVNDUiBkZXNjcmlwdG9yOwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoIiUwNHg6OiUwNHg6OiUwNHgiLCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKLSAgfQotfSB0QlRBX0hIX0RFVl9EU0NQX0lORk87Ci0KLS8qIGNhbGxiYWNrIGV2ZW50IGRhdGEgZm9yIEJUQV9ISF9PUEVOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkYTsgICAgICAgIC8qIEhJRCBkZXZpY2UgYmQgYWRkcmVzcyAgICAqLwotICB0QlRBX0hIX1NUQVRVUyBzdGF0dXM7IC8qIG9wZXJhdGlvbiBzdGF0dXMgICAgICAgICAqLwotICB1aW50OF90IGhhbmRsZTsgICAgICAgIC8qIGRldmljZSBoYW5kbGUgICAgICAgICAgICAqLwotICBib29sIGxlX2hpZDsgICAgICAgICAvKiBpcyBMRSBkZXZpY2VzPyAqLwotICBib29sIHNjcHNfc3VwcG9ydGVkOyAvKiBzY2FuIHBhcmFtZXRlciBzZXJ2aWNlIHN1cHBvcnRlZCAqLwotCi19IHRCVEFfSEhfQ09OTjsKLQotdHlwZWRlZiB0QlRBX0hIX0NPTk4gdEJUQV9ISF9ERVZfSU5GTzsKLQotLyogY2FsbGJhY2sgZXZlbnQgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0hIX1NUQVRVUyBzdGF0dXM7IC8qIG9wZXJhdGlvbiBzdGF0dXMgICAgICAgICAqLwotICB1aW50OF90IGhhbmRsZTsgICAgICAgIC8qIGRldmljZSBoYW5kbGUgICAgICAgICAgICAqLwotfSB0QlRBX0hIX0NCREFUQTsKLQotZW51bSB7Ci0gIEJUQV9ISF9NT0RfQ1RSTF9LRVksCi0gIEJUQV9ISF9NT0RfU0hGVF9LRVksCi0gIEJUQV9ISF9NT0RfQUxUX0tFWSwKLSAgQlRBX0hIX01PRF9HVUlfS0VZLAotICBCVEFfSEhfTU9EX01BWF9LRVkKLX07Ci0KLS8qIHBhcnNlZCBib290IG1vZGUga2V5Ym9hcmQgcmVwb3J0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgdGhpc19jaGFyWzZdOyAvKiB2aXJ0dWFsIGtleSBjb2RlICAgICAqLwotICBib29sIG1vZF9rZXlbQlRBX0hIX01PRF9NQVhfS0VZXTsKLSAgLyogY3RybCwgc2hpZnQsIEFsdCwgR1VJICovCi0gIC8qIG1vZGlmaWVyIGtleTogaXMgU2hpZnQga2V5IHByZXNzZWQgKi8KLSAgLyogbW9kaWZpZXIga2V5OiBpcyBDdHJsIGtleSBwcmVzc2VkICAqLwotICAvKiBtb2RpZmllciBrZXk6IGlzIEFsdCBrZXkgcHJlc3NlZCAgICovCi0gIC8qIG1vZGlmaWVyIGtleTogR1VJIHVwL2Rvd24gKi8KLSAgYm9vbCBjYXBzX2xvY2s7IC8qIGlzIGNhcHMgbG9ja2VkICAgICAgICovCi0gIGJvb2wgbnVtX2xvY2s7ICAvKiBpcyBOdW0ga2V5IHByZXNzZWQgICAqLwotfSB0QlRBX0hIX0tFWUJEX1JQVDsKLQotLyogcGFyc2VkIGJvb3QgbW9kZSBtb3VzZSByZXBvcnQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBtb3VzZV9idXR0b247IC8qIG1vdXNlIGJ1dHRvbiBpcyBjbGlja2VkICAgKi8KLSAgaW50OF90IGRlbHRhX3g7ICAgICAgIC8qIGRpc3BsYWNlbWVudCB4ICAgICAgICAgICAgKi8KLSAgaW50OF90IGRlbHRhX3k7ICAgICAgIC8qIGRpc3BsYWNlbWVudCB5ICAgICAgICAgICAgKi8KLX0gdEJUQV9ISF9NSUNFX1JQVDsKLQotLyogcGFyc2VkIEJvb3QgcmVwb3J0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSEhfQk9PVF9SUFRfSUQgZGV2X3R5cGU7IC8qIHR5cGUgb2YgZGV2aWNlIHJlcG9ydCAqLwotICB1bmlvbiB7Ci0gICAgdEJUQV9ISF9LRVlCRF9SUFQga2V5YmRfcnB0OyAvKiBrZXlib2FyZCByZXBvcnQgICAgICAqLwotICAgIHRCVEFfSEhfTUlDRV9SUFQgbWljZV9ycHQ7ICAgLyogbW91c2UgcmVwb3J0ICAgICAgICAgKi8KLSAgfSBkYXRhX3JwdDsKLX0gdEJUQV9ISF9CT09UX1JQVDsKLQotLyogaGFuZHNoYWtlIGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9ISF9TVEFUVVMgc3RhdHVzOyAvKiBoYW5kc2hha2Ugc3RhdHVzICovCi0gIHVpbnQ4X3QgaGFuZGxlOyAgICAgICAgLyogZGV2aWNlIGhhbmRsZSAgICAqLwotICB1bmlvbiB7Ci0gICAgdEJUQV9ISF9QUk9UT19NT0RFIHByb3RvX21vZGU7IC8qIEdFVF9QUk9UT19FVlQgOnByb3RvY29sIG1vZGUgKi8KLSAgICBCVF9IRFIqIHBfcnB0X2RhdGE7ICAgICAgICAgICAgLyogR0VUX1JQVF9FVlQgICA6IHJlcG9ydCBkYXRhICAqLwotICAgIHVpbnQ4X3QgaWRsZV9yYXRlOyAgICAgICAgICAgICAvKiBHRVRfSURMRV9FVlQgIDogaWRsZSByYXRlICAgICovCi0gIH0gcnNwX2RhdGE7Ci0KLX0gdEJUQV9ISF9IU0RBVEE7Ci0KLS8qIHVuaW9uIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEhEIGNhbGxiYWNrICovCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUQV9ISF9ERVZfSU5GTyBkZXZfaW5mbzsgLyogQlRBX0hIX0FERF9ERVZfRVZULCBCVEFfSEhfUk1WX0RFVl9FVlQgICAqLwotICB0QlRBX0hIX0NPTk4gY29ubjsgICAgICAgICAvKiBCVEFfSEhfT1BFTl9FVlQgICAgICAqLwotICB0QlRBX0hIX0NCREFUQSBkZXZfc3RhdHVzOyAvKiBCVEFfSEhfQ0xPU0VfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEhfU0VUX1BST1RPX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEhfU0VUX1JQVF9FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0hIX1NFVF9JRExFX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEhfVVBEQVRFX1NDUFBfRVZUICovCi0KLSAgdEJUQV9ISF9TVEFUVVMgc3RhdHVzOyAgICAgICAgICAgLyogQlRBX0hIX0VOQUJMRV9FVlQgKi8KLSAgdEJUQV9ISF9ERVZfRFNDUF9JTkZPIGRzY3BfaW5mbzsgLyogQlRBX0hIX0dFVF9EU0NQX0VWVCAqLwotICB0QlRBX0hIX0hTREFUQSBoc19kYXRhOyAgICAgICAgICAvKiBHRVRfIHRyYW5zYWN0aW9uIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9ISF9HRVRfUlBUX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEhfR0VUX1BST1RPX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSEhfR0VUX0lETEVfRVZUICovCi19IHRCVEFfSEg7Ci0KLS8qIEJUQSBISCBjYWxsYmFjayBmdW5jdGlvbiAqLwotdHlwZWRlZiB2b2lkKHRCVEFfSEhfQ0JBQ0spKHRCVEFfSEhfRVZUIGV2ZW50LCB0QlRBX0hIKiBwX2RhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlIEhJRCBob3N0IGFuZCByZWdpc3RlcnMgSElELUhvc3Qgd2l0aAotICogICAgICAgICAgICAgICAgICBsb3dlciBsYXllcnMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaEVuYWJsZSh0QlRBX0hIX0NCQUNLKiBwX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaERlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhvc3QgaXMgYWJvdXQgcG93ZXIgZG93bi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoRGlzYWJsZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaE9wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IGFuIGlucXVpcnkgYW5kIHJlYWQgU0RQCi0gKiAgICAgICAgICAgICAgICAgIHJlY29yZCBvZiByZXNwb25kaW5nIGRldmljZXM7IGNvbm5lY3QgdG8gYSBkZXZpY2UgaWYgb25seQotICogICAgICAgICAgICAgICAgICBvbmUgYWN0aXZlIEhJRCBkZXZpY2UgaXMgZm91bmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaE9wZW4oY29uc3QgUmF3QWRkcmVzcyYgZGV2X2JkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhDbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBkaXNjb25uZWN0cyB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhDbG9zZSh1aW50OF90IGRldl9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoU2V0UHJvdG9Nb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgcHJvdG9jb2wgbW9kZSBhdCBzcGVjaWZpZWQgSElEIGhhbmRsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhTZXRQcm90b01vZGUodWludDhfdCBoYW5kbGUsIHRCVEFfSEhfUFJPVE9fTU9ERSB0X3R5cGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoR2V0UHJvdG9Nb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGdldCB0aGUgcHJvdG9jb2wgbW9kZSBvZiBhIHNwZWNpZmllZCBISUQKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhHZXRQcm90b01vZGUodWludDhfdCBkZXZfaGFuZGxlKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhTZXRSZXBvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmQgU0VUX1JFUE9SVCB0byBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNldFJlcG9ydCh1aW50OF90IGRldl9oYW5kbGUsIHRCVEFfSEhfUlBUX1RZUEUgcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaEdldFJlcG9ydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIEdFVF9SRVBPUlQgdG8gSElEIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoR2V0UmVwb3J0KHVpbnQ4X3QgZGV2X2hhbmRsZSwgdEJUQV9ISF9SUFRfVFlQRSByX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBycHRfaWQsIHVpbnQxNl90IGJ1Zl9zaXplKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhTZXRJZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIFNFVF9JRExFIHRvIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoU2V0SWRsZSh1aW50OF90IGRldl9oYW5kbGUsIHVpbnQxNl90IGlkbGVfcmF0ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhHZXRJZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgR0VUX0lETEUgdG8gSElEIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0hoR2V0SWRsZSh1aW50OF90IGRldl9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoU2VuZEN0cmwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgSElEX0NPTlRST0wgcmVxdWVzdCB0byBhIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaFNlbmRDdHJsKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdEJUQV9ISF9UUkFOU19DVFJMX1RZUEUgY190eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaFNldElkbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmQgU0VUX0lETEUgdG8gZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhTZXRJZGxlKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDE2X3QgaWRsZV9yYXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaEdldElkbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBHRVRfSURMRSBmcm9tIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaEdldElkbGUodWludDhfdCBkZXZfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaFNlbmREYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIERBVEEgdHJhbnNhY3Rpb24gdG8gYSBISUQgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhTZW5kRGF0YSh1aW50OF90IGRldl9oYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGRldl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9IaEdldERzY3BJbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgcmVwb3J0IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhHZXREc2NwSW5mbyh1aW50OF90IGRldl9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSGhBZGREZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFkZCBhIHZpcnR1YWxseSBjYWJsZWQgZGV2aWNlIGludG8gSElELUhvc3QgZGV2aWNlIGxpc3QKLSAqICAgICAgICAgICAgICAgICAgdG8gbWFuYWdlIGFuZCBhc3NpZ24gYSBkZXZpY2UgaGFuZGxlIGZvciBmdXR1cmUgQVBJIGNhbGwsCi0gKiAgICAgICAgICAgICAgICAgIGhvc3QgYXBwbGNpYXRpb24gY2FsbCB0aGlzIEFQSSBhdCBzdGFydC11cCB0byBpbml0aWFsaXplIGl0cwotICogICAgICAgICAgICAgICAgICB2aXJ0dWFsbHkgY2FibGVkIGRldmljZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9IaEFkZERldihjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRCVEFfSEhfQVRUUl9NQVNLIGF0dHJfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN1Yl9jbGFzcywgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9ERVZfRFNDUF9JTkZPIGRzY3BfaW5mbyk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0hoUmVtb3ZlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmUgYSBkZXZpY2UgZnJvbSB0aGUgSElEIGhvc3QgZGV2aWNlcyBsaXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfSGhSZW1vdmVEZXYodWludDhfdCBkZXZfaGFuZGxlKTsKLQotI2VuZGlmIC8qIEJUQV9ISF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2hoX2NvLmggYi9idGEvaW5jbHVkZS9idGFfaGhfY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5Yzg4Yy4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfaGhfY28uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA1LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmaWxlIGZvciBoaWQgaG9zdCBjYWxsLW91dCBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX0hIX0NPX0gKLSNkZWZpbmUgQlRBX0hIX0NPX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGhfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBycHRfdXVpZDsKLSAgdWludDhfdCBycHRfaWQ7Ci0gIHRCVEFfSEhfUlBUX1RZUEUgcnB0X3R5cGU7Ci0gIHVpbnQ4X3Qgc3J2Y19pbnN0X2lkOwotICB1aW50MTZfdCBjaGFyX2luc3RfaWQ7Ci19IHRCVEFfSEhfUlBUX0NBQ0hFX0VOVFJZOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2NvX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBISCB3aGVuIGRhdGEgaXMKLSAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQKLSAqICAgICAgICAgICAgICAgICAgaW4gaW50ZXJ1cHQgY2hhbm5lbC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGhfY29fZGF0YSh1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3QqIHBfcnB0LCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1BST1RPX01PREUgbW9kZSwgdWludDhfdCBzdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGN0cnlfY29kZSwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2NvX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBISCB3aGVuIGNvbm5lY3Rpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgb3BlbmVkLCBhbmQgYXBwbGljYXRpb24gbWF5IGRvIHNvbWUgZGV2aWNlIHNwZWNpZmljCi0gKiAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hoX2NvX29wZW4odWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IHN1Yl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJfbWFzaywgdWludDhfdCBhcHBfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2NvX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgSEggd2hlbiBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNsb3NlZCwgYW5kIGRldmljZSBzcGVjaWZpYyBmaW5hbGl6YXRpbyBubWF5IGJlIG5lZWRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oaF9jb19jbG9zZSh1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3QgYXBwX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9jb19zZXRfcnB0X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IEhIIHdoZW4gU2V0IFJlcG9ydAotICogICAgICAgICAgICAgICAgICBSZXNwb25zZSBpcyByZWNlaXZlZCBvbiBDb250cm9sIENoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfaGhfY29fc2V0X3JwdF9yc3AodWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IHN0YXR1cyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfY29fZ2V0X3JwdF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBISCB3aGVuIEdldCBSZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgaXMgcmVjZWl2ZWQgb24gQ29udHJvbCBDaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX2hoX2NvX2dldF9ycHRfcnNwKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9ycHQsIHVpbnQxNl90IGxlbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfY29fcnB0X2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyB0byBjb252ZXkgdGhlIHJlcG9ydCBpbmZvcm1hdGlvbiBvbgotICogICAgICAgICAgICAgICAgICBhIEhPR1AgZGV2aWNlIHRvIHRoZSBhcHBsaWNhdGlvbi4gQXBwbGljYXRpb24gY2FuIHNhdmUgdGhpcwotICogICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBpbiBOViBpZiBkZXZpY2UgaXMgYm9uZGVkIGFuZCBsb2FkIGl0IGJhY2sgd2hlbgotICogICAgICAgICAgICAgICAgICBzdGFjayByZWJvb3QuCi0gKgotICogUGFyYW1ldGVycyAgICAgICByZW1vdGVfYmRhICAtIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICBwX2VudHJ5ICAgICAtIHJlcG9ydCBlbnRyeSBwb2ludGVyCi0gKiAgICAgICAgICAgICAgICAgIGFwcF9pZCAgICAgIC0gYXBwbGljYXRpb24gaWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oaF9sZV9jb19ycHRfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEhfUlBUX0NBQ0hFX0VOVFJZKiBwX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9jb19jYWNoZV9sb2FkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgdG8gcmVxdWVzdCB0aGUgYXBwbGljYXRpb24gdG8gbG9hZAotICogICAgICAgICAgICAgICAgICB0aGUgY2FjaGVkIEhPR1AgcmVwb3J0IGlmIHRoZXJlIGlzIGFueS4gV2hlbiBjYWNoZSByZWFkaW5nCi0gKiAgICAgICAgICAgICAgICAgIGlzIGNvbXBsZXRlZCwgYnRhX2hoX2xlX2NpX2NhY2hlX2xvYWQoKSBpcyBjYWxsZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcmVtb3RlX2JkYSAgLSByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgcF9udW1fcnB0OiBudW1iZXIgb2YgY2FjaGVkIHJlcG9ydAotICogICAgICAgICAgICAgICAgICBhcHBfaWQgICAgICAtIGFwcGxpY2F0aW9uIGlkCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgYWNjaGVkIHJlcG9ydCBhcnJheQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkqIGJ0YV9oaF9sZV9jb19jYWNoZV9sb2FkKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQ4X3QqIHBfbnVtX3JwdCwgdWludDhfdCBhcHBfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2NvX3Jlc2V0X3JwdF9jYWNoZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIHRvIHJlc2V0IHRoZSBIT0dQIGRldmljZSBjYWNoZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHJlbW90ZV9iZGEgIC0gcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9oaF9sZV9jb19yZXNldF9ycHRfY2FjaGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQpOwotCi0jZW5kaWYgLyogQlRBX0hIX0NPX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9pbmNsdWRlL2J0YV9qdl9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9qdl9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwNzNlZS4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfanZfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZpbGUgdGhlIEJUQSBKYXZhIEkvRgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9KVl9BUElfSAotI2RlZmluZSBCVEFfSlZfQVBJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgYW5kIGRhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogc3RhdHVzIHZhbHVlcyAqLwotI2RlZmluZSBCVEFfSlZfU1VDQ0VTUyAwICAgICAvKiBTdWNjZXNzZnVsIG9wZXJhdGlvbi4gKi8KLSNkZWZpbmUgQlRBX0pWX0ZBSUxVUkUgMSAgICAgLyogR2VuZXJpYyBmYWlsdXJlLiAqLwotI2RlZmluZSBCVEFfSlZfQlVTWSAyICAgICAgICAvKiBUZW1wb3JhcmlseSBjYW4gbm90IGhhbmRsZSB0aGlzIHJlcXVlc3QuICovCi0jZGVmaW5lIEJUQV9KVl9OT19EQVRBIDMgICAgIC8qIG5vIGRhdGEuICovCi0jZGVmaW5lIEJUQV9KVl9OT19SRVNPVVJDRSA0IC8qIE5vIG1vcmUgc2V0IHBtIGNvbnRyb2wgYmxvY2sgKi8KLQotdHlwZWRlZiB1aW50OF90IHRCVEFfSlZfU1RBVFVTOwotI2RlZmluZSBCVEFfSlZfSU5URVJOQUxfRVJSICgtMSkgLyogaW50ZXJuYWwgZXJyb3IuICovCi0KLSNkZWZpbmUgQlRBX0pWX01BWF9VVUlEUyBTRFBfTUFYX1VVSURfRklMVEVSUwotI2RlZmluZSBCVEFfSlZfTUFYX0FUVFJTIFNEUF9NQVhfQVRUUl9GSUxURVJTCi0jZGVmaW5lIEJUQV9KVl9NQVhfU0RQX1JFQyBTRFBfTUFYX1JFQ09SRFMKLSNkZWZpbmUgQlRBX0pWX01BWF9MMkNfQ09OTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEdBUF9NQVhfQ09OTkVDVElPTlMgLyogR0FQIGhhbmRsZSBpcyB1c2VkIGFzIGluZGV4LCBoZW5jZSBkbyBub3QgY2hhbmdlIHRoaXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICovCi0jZGVmaW5lIEJUQV9KVl9NQVhfU0NOIFwKLSAgUE9SVF9NQVhfUkZDX1BPUlRTIC8qIHNhbWUgYXMgQlRNX01BWF9TQ04gKGluIGJ0bV9pbnQuaCkgKi8KLSNkZWZpbmUgQlRBX0pWX01BWF9SRkNfQ09OTiBNQVhfUkZDX1BPUlRTCi0KLSNpZm5kZWYgQlRBX0pWX0RFRl9SRkNfTVRVCi0jZGVmaW5lIEJUQV9KVl9ERUZfUkZDX01UVSAoMyAqIDMzMCkKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT04KLSNkZWZpbmUgQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTiBNQVhfQkRfQ09OTkVDVElPTlMKLSNlbmRpZgotCi0vKiBCVEFfSlZfTUFYX1JGQ19TUl9TRVNTSU9OIGNhbiBub3QgYmUgYmlnZ2VyIHRoYW4gTUFYX0JEX0NPTk5FQ1RJT05TICovCi0jaWYgKEJUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT04gPiBNQVhfQkRfQ09OTkVDVElPTlMpCi0jdW5kZWYgQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTgotI2RlZmluZSBCVEFfSlZfTUFYX1JGQ19TUl9TRVNTSU9OIE1BWF9CRF9DT05ORUNUSU9OUwotI2VuZGlmCi0KLSNkZWZpbmUgQlRBX0pWX0ZJUlNUX1NFUlZJQ0VfSUQgQlRBX0ZJUlNUX0pWX1NFUlZJQ0VfSUQKLSNkZWZpbmUgQlRBX0pWX0xBU1RfU0VSVklDRV9JRCBCVEFfTEFTVF9KVl9TRVJWSUNFX0lECi0jZGVmaW5lIEJUQV9KVl9OVU1fU0VSVklDRV9JRCBcCi0gIChCVEFfTEFTVF9KVl9TRVJWSUNFX0lEIC0gQlRBX0ZJUlNUX0pWX1NFUlZJQ0VfSUQgKyAxKQotCi0vKiBEaXNjb3ZlcmFibGUgbW9kZXMgKi8KLWVudW0geyBCVEFfSlZfRElTQ19OT05FLCBCVEFfSlZfRElTQ19MSU1JVEVELCBCVEFfSlZfRElTQ19HRU5FUkFMIH07Ci10eXBlZGVmIHVpbnQxNl90IHRCVEFfSlZfRElTQzsKLQotdHlwZWRlZiB1aW50MzJfdCB0QlRBX0pWX1JPTEU7Ci0KLSNkZWZpbmUgQlRBX0pWX1NFUlZJQ0VfTE1URF9ESVNDT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgQlRNX0NPRF9TRVJWSUNFX0xNVERfRElTQ09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDIwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0pWX1NFUlZJQ0VfUE9TSVRJT05JTkcgQlRNX0NPRF9TRVJWSUNFX1BPU0lUSU9OSU5HICAgLyogMHgwMTAwICovCi0jZGVmaW5lIEJUQV9KVl9TRVJWSUNFX05FVFdPUktJTkcgQlRNX0NPRF9TRVJWSUNFX05FVFdPUktJTkcgICAgIC8qIDB4MDIwMCAqLwotI2RlZmluZSBCVEFfSlZfU0VSVklDRV9SRU5ERVJJTkcgQlRNX0NPRF9TRVJWSUNFX1JFTkRFUklORyAgICAgICAvKiAweDA0MDAgKi8KLSNkZWZpbmUgQlRBX0pWX1NFUlZJQ0VfQ0FQVFVSSU5HIEJUTV9DT0RfU0VSVklDRV9DQVBUVVJJTkcgICAgICAgLyogMHgwODAwICovCi0jZGVmaW5lIEJUQV9KVl9TRVJWSUNFX09CSl9UUkFOU0ZFUiBCVE1fQ09EX1NFUlZJQ0VfT0JKX1RSQU5TRkVSIC8qIDB4MTAwMCAqLwotI2RlZmluZSBCVEFfSlZfU0VSVklDRV9BVURJTyBCVE1fQ09EX1NFUlZJQ0VfQVVESU8gICAgICAgICAgICAgICAvKiAweDIwMDAgKi8KLSNkZWZpbmUgQlRBX0pWX1NFUlZJQ0VfVEVMRVBIT05ZIEJUTV9DT0RfU0VSVklDRV9URUxFUEhPTlkgICAgICAgLyogMHg0MDAwICovCi0jZGVmaW5lIEJUQV9KVl9TRVJWSUNFX0lORk9STUFUSU9OIEJUTV9DT0RfU0VSVklDRV9JTkZPUk1BVElPTiAgIC8qIDB4ODAwMCAqLwotCi0vKiBKViBJRCB0eXBlICovCi0jZGVmaW5lIEJUQV9KVl9QTV9JRF8xIDEgICAgIC8qIFBNIGV4YW1wbGUgcHJvZmlsZSAxICovCi0jZGVmaW5lIEJUQV9KVl9QTV9JRF8yIDIgICAgIC8qIFBNIGV4YW1wbGUgcHJvZmlsZSAyICovCi0jZGVmaW5lIEJUQV9KVl9QTV9JRF9DTEVBUiAwIC8qIFNwZWNpYWwgSlYgSUQgdXNlZCB0byBjbGVhciBQTSBwcm9maWxlICovCi0jZGVmaW5lIEJUQV9KVl9QTV9BTEwgMHhGRiAgIC8qIEdlbmVyaWMgbWF0Y2ggYWxsIGlkLCBzZWUgYnRhX2RtX2NmZy5jICovCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9KVl9QTV9JRDsKLQotI2RlZmluZSBCVEFfSlZfUE1fSEFORExFX0NMRUFSIFwKLSAgMHhGRiAvKiBTcGVjaWFsIEpWIElEIHVzZWQgdG8gY2xlYXIgUE0gcHJvZmlsZSAgKi8KLQotLyogZGVmaW5lIG1heGltdW0gbnVtYmVyIG9mIHJlZ2lzdGVyZWQgUE0gZW50aXRpZXMuIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggYnRhCi0gKiBwbSEgKi8KLSNpZm5kZWYgQlRBX0pWX1BNX01BWF9OVU0KLSNkZWZpbmUgQlRBX0pWX1BNX01BWF9OVU0gNQotI2VuZGlmCi0KLS8qIEpWIHBtIGNvbm5lY3Rpb24gc3RhdGVzICovCi1lbnVtIHsKLSAgQlRBX0pWX0NPTk5fT1BFTiA9IDAsIC8qIENvbm5lY3Rpb24gb3BlbmVkIHN0YXRlICovCi0gIEJUQV9KVl9DT05OX0NMT1NFLCAgICAvKiBDb25uZWN0aW9uIGNsb3NlZCBzdGF0ZSAqLwotICBCVEFfSlZfQVBQX09QRU4sICAgICAgLyogSlYgQXBwbGljYXRpb24gb3BlbmVkIHN0YXRlICovCi0gIEJUQV9KVl9BUFBfQ0xPU0UsICAgICAvKiBKViBBcHBsaWNhdGlvbiBjbG9zZWQgc3RhdGUgKi8KLSAgQlRBX0pWX1NDT19PUEVOLCAgICAgIC8qIFNDTyBjb25uZWN0aW9uIG9wZW5lZCBzdGF0ZSAqLwotICBCVEFfSlZfU0NPX0NMT1NFLCAgICAgLyogU0NPIGNvbm5lY3Rpb24gb3BlbmVkIHN0YXRlICovCi0gIEJUQV9KVl9DT05OX0lETEUsICAgICAvKiBDb25uZWN0aW9uIGlkbGUgc3RhdGUgKi8KLSAgQlRBX0pWX0NPTk5fQlVTWSwgICAgIC8qIENvbm5lY3Rpb24gYnVzeSBzdGF0ZSAqLwotICBCVEFfSlZfTUFYX0NPTk5fU1RBVEUgLyogTWF4IG51bWJlciBvZiBjb25uZWN0aW9uIHN0YXRlICovCi19OwotdHlwZWRlZiB1aW50OF90IHRCVEFfSlZfQ09OTl9TVEFURTsKLQotLyogSlYgQ29ubmVjdGlvbiB0eXBlcyAqLwotI2RlZmluZSBCVEFfSlZfQ09OTl9UWVBFX1JGQ09NTSAwCi0jZGVmaW5lIEJUQV9KVl9DT05OX1RZUEVfTDJDQVAgMQotI2RlZmluZSBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQX0xFIDIKLXR5cGVkZWYgaW50IHRCVEFfSlZfQ09OTl9UWVBFOwotCi0vKiBKYXZhIEkvRiBjYWxsYmFjayBldmVudHMgKi8KLS8qIGV2ZW50cyByZWNlaXZlZCBieSB0QlRBX0pWX0RNX0NCQUNLICovCi0jZGVmaW5lIEJUQV9KVl9FTkFCTEVfRVZUIDAgICAgICAgICAvKiBKViBlbmFibGVkICovCi0jZGVmaW5lIEJUQV9KVl9HRVRfU0NOX0VWVCA2ICAgICAgICAvKiBSZXNlcnZlZCBhbiBTQ04gKi8KLSNkZWZpbmUgQlRBX0pWX0dFVF9QU01fRVZUIDcgICAgICAgIC8qIFJlc2VydmVkIGEgUFNNICovCi0jZGVmaW5lIEJUQV9KVl9ESVNDT1ZFUllfQ09NUF9FVlQgOCAvKiBTRFAgZGlzY292ZXJ5IGNvbXBsZXRlICovCi0jZGVmaW5lIEJUQV9KVl9DUkVBVEVfUkVDT1JEX0VWVCAxMSAvKiB0aGUgcmVzdWx0IGZvciBCVEFfSnZDcmVhdGVSZWNvcmQgKi8KLS8qIGV2ZW50cyByZWNlaXZlZCBieSB0QlRBX0pWX0wyQ0FQX0NCQUNLICovCi0jZGVmaW5lIEJUQV9KVl9MMkNBUF9PUEVOX0VWVCAxNiAgICAgLyogb3BlbiBzdGF0dXMgb2YgTDJDQVAgY29ubmVjdGlvbiAqLwotI2RlZmluZSBCVEFfSlZfTDJDQVBfQ0xPU0VfRVZUIDE3ICAgIC8qIEwyQ0FQIGNvbm5lY3Rpb24gY2xvc2VkICovCi0jZGVmaW5lIEJUQV9KVl9MMkNBUF9TVEFSVF9FVlQgMTggICAgLyogTDJDQVAgc2VydmVyIHN0YXJ0ZWQgKi8KLSNkZWZpbmUgQlRBX0pWX0wyQ0FQX0NMX0lOSVRfRVZUIDE5ICAvKiBMMkNBUCBjbGllbnQgaW5pdGlhdGVkIGEgY29ubmVjdGlvbiAqLwotI2RlZmluZSBCVEFfSlZfTDJDQVBfREFUQV9JTkRfRVZUIDIwIC8qIEwyQ0FQIGNvbm5lY3Rpb24gcmVjZWl2ZWQgZGF0YSAqLwotI2RlZmluZSBCVEFfSlZfTDJDQVBfQ09OR19FVlQgXAotICAyMSAvKiBMMkNBUCBjb25uZWN0aW9uIGNvbmdlc3Rpb24gc3RhdHVzIGNoYW5nZWQgKi8KLSNkZWZpbmUgQlRBX0pWX0wyQ0FQX1JFQURfRVZUIDIyICAvKiB0aGUgcmVzdWx0IGZvciBCVEFfSnZMMmNhcFJlYWQgKi8KLSNkZWZpbmUgQlRBX0pWX0wyQ0FQX1dSSVRFX0VWVCAyNCAvKiB0aGUgcmVzdWx0IGZvciBCVEFfSnZMMmNhcFdyaXRlKi8KLQotLyogZXZlbnRzIHJlY2VpdmVkIGJ5IHRCVEFfSlZfUkZDT01NX0NCQUNLICovCi0jZGVmaW5lIEJUQV9KVl9SRkNPTU1fT1BFTl9FVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZW4gc3RhdHVzIG9mIFJGQ09NTSBDbGllbnQgY29ubmVjdGlvbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUQV9KVl9SRkNPTU1fQ0xPU0VfRVZUIDI3IC8qIFJGQ09NTSBjb25uZWN0aW9uIGNsb3NlZCAqLwotI2RlZmluZSBCVEFfSlZfUkZDT01NX1NUQVJUX0VWVCAyOCAvKiBSRkNPTU0gc2VydmVyIHN0YXJ0ZWQgKi8KLSNkZWZpbmUgQlRBX0pWX1JGQ09NTV9DTF9JTklUX0VWVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkZDT01NIGNsaWVudCBpbml0aWF0ZWQgYSBjb25uZWN0aW9uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRBX0pWX1JGQ09NTV9EQVRBX0lORF9FVlQgMzAgLyogUkZDT01NIGNvbm5lY3Rpb24gcmVjZWl2ZWQgZGF0YSAqLwotI2RlZmluZSBCVEFfSlZfUkZDT01NX0NPTkdfRVZUIFwKLSAgMzEgLyogUkZDT01NIGNvbm5lY3Rpb24gY29uZ2VzdGlvbiBzdGF0dXMgY2hhbmdlZCAqLwotI2RlZmluZSBCVEFfSlZfUkZDT01NX1dSSVRFX0VWVCAzMyAvKiB0aGUgcmVzdWx0IGZvciBCVEFfSnZSZmNvbW1Xcml0ZSovCi0jZGVmaW5lIEJUQV9KVl9SRkNPTU1fU1JWX09QRU5fRVZUIFwKLSAgMzQgICAgICAgICAgICAgICAgICAgICAgLyogb3BlbiBzdGF0dXMgb2YgU2VydmVyIFJGQ09NTSBjb25uZWN0aW9uICovCi0jZGVmaW5lIEJUQV9KVl9NQVhfRVZUIDM1IC8qIG1heCBudW1iZXIgb2YgSlYgZXZlbnRzICovCi0KLXR5cGVkZWYgdWludDE2X3QgdEJUQV9KVl9FVlQ7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9TRVRfRElTQ09WRVJfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgIC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB0QlRBX0pWX0RJU0MgZGlzY19tb2RlOyAvKiBUaGUgY3VycmVudCBkaXNjb3ZlcmFibGUgbW9kZSAqLwotfSB0QlRBX0pWX1NFVF9ESVNDT1ZFUjsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0RJU0NPVkVSWV9DT01QX0VWVF8gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzOyAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgaW50IHNjbjsgICAgICAgICAgICAgICAvKiBjaGFubmVsICMgKi8KLX0gdEJUQV9KVl9ESVNDT1ZFUllfQ09NUDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0NSRUFURV9SRUNPUkRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi19IHRCVEFfSlZfQ1JFQVRFX1JFQ09SRDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX09QRU5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIFJhd0FkZHJlc3MgcmVtX2JkYTsgICAgLyogVGhlIHBlZXIgYWRkcmVzcyAqLwotICBpbnQzMl90IHR4X210dTsgICAgICAgIC8qIFRoZSB0cmFuc21pdCBNVFUgKi8KLX0gdEJUQV9KVl9MMkNBUF9PUEVOOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfTDJDQVBfT1BFTl9FVlQgZm9yIExFIHNvY2tldHMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzOyAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgdWludDMyX3QgaGFuZGxlOyAgICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgUmF3QWRkcmVzcyByZW1fYmRhOyAgICAvKiBUaGUgcGVlciBhZGRyZXNzICovCi0gIGludDMyX3QgdHhfbXR1OyAgICAgICAgLyogVGhlIHRyYW5zbWl0IE1UVSAqLwotICB2b2lkKiogcF9wX2NiYWNrOyAgICAgIC8qIHNldCB0aGVtIGZvciBuZXcgc29ja2V0ICovCi0gIHZvaWQqKiBwX3VzZXJfZGF0YTsgICAgLyogc2V0IHRoZW0gZm9yIG5ldyBzb2NrZXQgKi8KLQotfSB0QlRBX0pWX0wyQ0FQX0xFX09QRU47Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzOyAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgdWludDMyX3QgaGFuZGxlOyAgICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgYm9vbCBhc3luYzsgICAgICAgICAgICAvKiBmYWxzZSwgaWYgbG9jYWwgaW5pdGlhdGVzIGRpc2Nvbm5lY3QgKi8KLX0gdEJUQV9KVl9MMkNBUF9DTE9TRTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX1NUQVJUX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICB1aW50OF90IHNlY19pZDsgICAgICAgIC8qIHNlY3VyaXR5IElEIHVzZWQgYnkgdGhpcyBzZXJ2ZXIgKi8KLX0gdEJUQV9KVl9MMkNBUF9TVEFSVDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX0NMX0lOSVRfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIHVpbnQ4X3Qgc2VjX2lkOyAgICAgICAgLyogc2VjdXJpdHkgSUQgdXNlZCBieSB0aGlzIGNsaWVudCAqLwotfSB0QlRBX0pWX0wyQ0FQX0NMX0lOSVQ7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9MMkNBUF9DT05HX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICBib29sIGNvbmc7ICAgICAgICAgICAgIC8qIHRydWUsIGNvbmdlc3RlZC4gZmFsc2UsIHVuY29uZ2VzdGVkICovCi19IHRCVEFfSlZfTDJDQVBfQ09ORzsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0wyQ0FQX1JFQURfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIHVpbnQzMl90IHJlcV9pZDsgICAgICAgLyogVGhlIHJlcV9pZCBpbiB0aGUgYXNzb2NpYXRlZCBCVEFfSnZMMmNhcFJlYWQoKSAqLwotICB1aW50OF90KiBwX2RhdGE7ICAgICAgIC8qIFRoaXMgcG9pbnRzIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHRoZSBwX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICogcGFyYW1ldGVyIGluIEJUQV9KdkwyY2FwUmVhZCAoKSAqLwotICB1aW50MTZfdCBsZW47ICAgICAgICAgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgcmVhZC4gKi8KLX0gdEJUQV9KVl9MMkNBUF9SRUFEOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfTDJDQVBfV1JJVEVfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIHVpbnQzMl90IHJlcV9pZDsgICAgICAgLyogVGhlIHJlcV9pZCBpbiB0aGUgYXNzb2NpYXRlZCBCVEFfSnZMMmNhcFdyaXRlKCkgKi8KLSAgdWludDE2X3QgbGVuOyAgICAgICAgICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHdyaXR0ZW4uICovCi0gIGJvb2wgY29uZzsgICAgICAgICAgICAgLyogY29uZ2VzdGlvbiBzdGF0dXMgKi8KLX0gdEJUQV9KVl9MMkNBUF9XUklURTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1JGQ09NTV9PUEVOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICBSYXdBZGRyZXNzIHJlbV9iZGE7ICAgIC8qIFRoZSBwZWVyIGFkZHJlc3MgKi8KLX0gdEJUQV9KVl9SRkNPTU1fT1BFTjsKLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9SRkNPTU1fU1JWX09QRU5fRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgICAgICAvKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KLSAgdWludDMyX3QgaGFuZGxlOyAgICAgICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICB1aW50MzJfdCBuZXdfbGlzdGVuX2hhbmRsZTsgLyogVGhlIG5ldyBsaXN0ZW4gaGFuZGxlICovCi0gIFJhd0FkZHJlc3MgcmVtX2JkYTsgICAgICAgICAvKiBUaGUgcGVlciBhZGRyZXNzICovCi19IHRCVEFfSlZfUkZDT01NX1NSVl9PUEVOOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfUkZDT01NX0NMT1NFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBwb3J0X3N0YXR1czsgIC8qIFBPUlQgc3RhdHVzICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIGJvb2wgYXN5bmM7ICAgICAgICAgICAgLyogZmFsc2UsIGlmIGxvY2FsIGluaXRpYXRlcyBkaXNjb25uZWN0ICovCi19IHRCVEFfSlZfUkZDT01NX0NMT1NFOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfUkZDT01NX1NUQVJUX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICB1aW50OF90IHNlY19pZDsgICAgICAgIC8qIHNlY3VyaXR5IElEIHVzZWQgYnkgdGhpcyBzZXJ2ZXIgKi8KLSAgYm9vbCB1c2VfY287ICAgICAgICAgICAvKiB0cnVlIHRvIHVzZSBjb19yZmNfZGF0YSAqLwotfSB0QlRBX0pWX1JGQ09NTV9TVEFSVDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1JGQ09NTV9DTF9JTklUX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICB1aW50OF90IHNlY19pZDsgICAgICAgIC8qIHNlY3VyaXR5IElEIHVzZWQgYnkgdGhpcyBjbGllbnQgKi8KLSAgYm9vbCB1c2VfY287ICAgICAgICAgICAvKiB0cnVlIHRvIHVzZSBjb19yZmNfZGF0YSAqLwotfSB0QlRBX0pWX1JGQ09NTV9DTF9JTklUOwotLypkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfTDJDQVBfREFUQV9JTkRfRVZUICYgQlRBX0pWX1JGQ09NTV9EQVRBX0lORF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgaGFuZGxlOyAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLX0gdEJUQV9KVl9EQVRBX0lORDsKLQotLypkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfTDJDQVBfREFUQV9JTkRfRVZUIGlmIHVzZWQgZm9yIExFICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IGhhbmRsZTsgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIEJUX0hEUiogcF9idWY7ICAgLyogVGhlIGluY29taW5nIGRhdGEgKi8KLX0gdEJUQV9KVl9MRV9EQVRBX0lORDsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX1JGQ09NTV9DT05HX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkLiAqLwotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgIC8qIFRoZSBjb25uZWN0aW9uIGhhbmRsZSAqLwotICBib29sIGNvbmc7ICAgICAgICAgICAgIC8qIHRydWUsIGNvbmdlc3RlZC4gZmFsc2UsIHVuY29uZ2VzdGVkICovCi19IHRCVEFfSlZfUkZDT01NX0NPTkc7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9KVl9SRkNPTU1fV1JJVEVfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1czsgLyogV2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogVGhlIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIHVpbnQzMl90IHJlcV9pZDsgICAgICAgLyogVGhlIHJlcV9pZCBpbiB0aGUgYXNzb2NpYXRlZCBCVEFfSnZSZmNvbW1Xcml0ZSgpICovCi0gIGludCBsZW47ICAgICAgICAgICAgICAgLyogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB3cml0dGVuLiAqLwotICBib29sIGNvbmc7ICAgICAgICAgICAgIC8qIGNvbmdlc3Rpb24gc3RhdHVzICovCi19IHRCVEFfSlZfUkZDT01NX1dSSVRFOwotCi0vKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBCVEFfSlZfQVBJX1NFVF9QTV9QUk9GSUxFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXM7IC8qIFN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uICovCi0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAgLyogQ29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgdEJUQV9KVl9QTV9JRCBhcHBfaWQ7ICAvKiBKViBhcHAgSUQgKi8KLX0gdEJUQV9KVl9TRVRfUE1fUFJPRklMRTsKLQotLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQlRBX0pWX0FQSV9OT1RJRllfUE1fU1RBVEVfQ0hBTkdFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBoYW5kbGU7ICAgICAgICAgIC8qIENvbm5lY3Rpb24gaGFuZGxlICovCi0gIHRCVEFfSlZfQ09OTl9TVEFURSBzdGF0ZTsgLyogSlYgY29ubmVjdGlvbiBzdGF0YSAqLwotfSB0QlRBX0pWX05PVElGWV9QTV9TVEFURV9DSEFOR0U7Ci0KLS8qIHVuaW9uIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEpWIGNhbGxiYWNrICovCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgIC8qIEJUQV9KVl9FTkFCTEVfRVZUICovCi0gIHRCVEFfSlZfRElTQ09WRVJZX0NPTVAgZGlzY19jb21wOyAgICAgICAgICAvKiBCVEFfSlZfRElTQ09WRVJZX0NPTVBfRVZUICovCi0gIHRCVEFfSlZfU0VUX0RJU0NPVkVSIHNldF9kaXNjb3ZlcjsgICAgICAgICAvKiBCVEFfSlZfU0VUX0RJU0NPVkVSX0VWVCAqLwotICB1aW50OF90IHNjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0pWX0dFVF9TQ05fRVZUICovCi0gIHVpbnQxNl90IHBzbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfSlZfR0VUX1BTTV9FVlQgKi8KLSAgdEJUQV9KVl9DUkVBVEVfUkVDT1JEIGNyZWF0ZV9yZWM7ICAgICAgICAgIC8qIEJUQV9KVl9DUkVBVEVfUkVDT1JEX0VWVCAqLwotICB0QlRBX0pWX0wyQ0FQX09QRU4gbDJjX29wZW47ICAgICAgICAgICAgICAgLyogQlRBX0pWX0wyQ0FQX09QRU5fRVZUICovCi0gIHRCVEFfSlZfTDJDQVBfQ0xPU0UgbDJjX2Nsb3NlOyAgICAgICAgICAgICAvKiBCVEFfSlZfTDJDQVBfQ0xPU0VfRVZUICovCi0gIHRCVEFfSlZfTDJDQVBfU1RBUlQgbDJjX3N0YXJ0OyAgICAgICAgICAgICAvKiBCVEFfSlZfTDJDQVBfU1RBUlRfRVZUICovCi0gIHRCVEFfSlZfTDJDQVBfQ0xfSU5JVCBsMmNfY2xfaW5pdDsgICAgICAgICAvKiBCVEFfSlZfTDJDQVBfQ0xfSU5JVF9FVlQgKi8KLSAgdEJUQV9KVl9MMkNBUF9DT05HIGwyY19jb25nOyAgICAgICAgICAgICAgIC8qIEJUQV9KVl9MMkNBUF9DT05HX0VWVCAqLwotICB0QlRBX0pWX0wyQ0FQX1JFQUQgbDJjX3JlYWQ7ICAgICAgICAgICAgICAgLyogQlRBX0pWX0wyQ0FQX1JFQURfRVZUICovCi0gIHRCVEFfSlZfTDJDQVBfV1JJVEUgbDJjX3dyaXRlOyAgICAgICAgICAgICAvKiBCVEFfSlZfTDJDQVBfV1JJVEVfRVZUICovCi0gIHRCVEFfSlZfUkZDT01NX09QRU4gcmZjX29wZW47ICAgICAgICAgICAgICAvKiBCVEFfSlZfUkZDT01NX09QRU5fRVZUICovCi0gIHRCVEFfSlZfUkZDT01NX1NSVl9PUEVOIHJmY19zcnZfb3BlbjsgICAgICAvKiBCVEFfSlZfUkZDT01NX1NSVl9PUEVOX0VWVCAqLwotICB0QlRBX0pWX1JGQ09NTV9DTE9TRSByZmNfY2xvc2U7ICAgICAgICAgICAgLyogQlRBX0pWX1JGQ09NTV9DTE9TRV9FVlQgKi8KLSAgdEJUQV9KVl9SRkNPTU1fU1RBUlQgcmZjX3N0YXJ0OyAgICAgICAgICAgIC8qIEJUQV9KVl9SRkNPTU1fU1RBUlRfRVZUICovCi0gIHRCVEFfSlZfUkZDT01NX0NMX0lOSVQgcmZjX2NsX2luaXQ7ICAgICAgICAvKiBCVEFfSlZfUkZDT01NX0NMX0lOSVRfRVZUICovCi0gIHRCVEFfSlZfUkZDT01NX0NPTkcgcmZjX2Nvbmc7ICAgICAgICAgICAgICAvKiBCVEFfSlZfUkZDT01NX0NPTkdfRVZUICovCi0gIHRCVEFfSlZfUkZDT01NX1dSSVRFIHJmY193cml0ZTsgICAgICAgICAgICAvKiBCVEFfSlZfUkZDT01NX1dSSVRFX0VWVCAqLwotICB0QlRBX0pWX0RBVEFfSU5EIGRhdGFfaW5kOyAgICAgICAgICAgICAgICAgLyogQlRBX0pWX0wyQ0FQX0RBVEFfSU5EX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0pWX1JGQ09NTV9EQVRBX0lORF9FVlQgKi8KLSAgdEJUQV9KVl9MRV9EQVRBX0lORCBsZV9kYXRhX2luZDsgICAgICAgICAgIC8qIEJUQV9KVl9MMkNBUF9MRV9EQVRBX0lORF9FVlQgKi8KLSAgdEJUQV9KVl9MMkNBUF9MRV9PUEVOIGwyY19sZV9vcGVuOyAgICAgICAgIC8qIEJUQV9KVl9MMkNBUF9PUEVOX0VWVCAqLwotfSB0QlRBX0pWOwotCi0vKiBKQVZBIERNIEludGVyZmFjZSBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkKHRCVEFfSlZfRE1fQ0JBQ0spKHRCVEFfSlZfRVZUIGV2ZW50LCB0QlRBX0pWKiBwX2RhdGEsIHVpbnQzMl90IGlkKTsKLQotLyogSkFWQSBSRkNPTU0gaW50ZXJmYWNlIGNhbGxiYWNrICovCi10eXBlZGVmIHVpbnQzMl90KHRCVEFfSlZfUkZDT01NX0NCQUNLKSh0QlRBX0pWX0VWVCBldmVudCwgdEJUQV9KViogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpOwotCi0vKiBKQVZBIEwyQ0FQIGludGVyZmFjZSBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkKHRCVEFfSlZfTDJDQVBfQ0JBQ0spKHRCVEFfSlZfRVZUIGV2ZW50LCB0QlRBX0pWKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIHRoZSBKYXZhIEkvRiBzZXJ2aWNlLiBXaGVuIHRoZSBlbmFibGUKLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0pWX0VOQUJMRV9FVlQuIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgSlYgQVBJIGFyZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTCBpZiBpbnRlcm5hbCBmYWlsdXJlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZFbmFibGUodEJUQV9KVl9ETV9DQkFDSyogcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZEaXNhYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNhYmxlIHRoZSBKYXZhIEkvRgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9KdkRpc2FibGUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZHZXRDaGFubmVsSWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXJ2ZXMgYSBTQ04vUFNNIGZvciBhcHBsaWNhdGlvbnMgcnVubmluZwotICogICAgICAgICAgICAgICAgICBvdmVyIFJGQ09NTSBvciBMMkNBUC4gSXQgaXMgcHJpbWFyaWx5IGNhbGxlZCBieQotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIgcHJvZmlsZXMvYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyIHRoZWlyIFNDTi9QU00gaW50bwotICogICAgICAgICAgICAgICAgICB0aGUgU0RQIGRhdGFiYXNlLiBUaGUgU0NOIGlzIHJlcG9ydGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICB0QlRBX0pWX0RNX0NCQUNLIGNhbGxiYWNrIHdpdGggYSBCVEFfSlZfR0VUX1NDTl9FVlQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBTQ04vUFNNIHJlcG9ydGVkIGlzIDAsIHRoYXQgbWVhbnMgYWxsIFNDTiByZXNvdXJjZXMKLSAqICAgICAgICAgICAgICAgICAgYXJlIGV4aGF1c3RlZC4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgYSBzcGVjaWZpYwotICogICAgICAgICAgICAgICAgICBjaGFubmVsLiBJZiB0aGUgcmVxdWVzdCBvbiB0aGUgc3BlY2lmaWMgY2hhbm5lbCBmYWlscywgdGhlCi0gKiAgICAgICAgICAgICAgICAgIFNDTi9QU00gcmV0dXJuZWQgaW4gdGhlIEVWVCB3aWxsIGJlIDAgLSBubyBhdHRlbXB0IHRvCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgYSBuZXcgY2hhbm5lbCB3aWxsIGJlIG1hZGUuIHNldCBjaGFubmVsIHRvIDw9IDAgdG8KLSAqICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhc3NpZ24gYW4gY2hhbm5lbCBJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSnZHZXRDaGFubmVsSWQoaW50IGNvbm5fdHlwZSwgdWludDMyX3QgaWQsIGludDMyX3QgY2hhbm5lbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZGcmVlQ2hhbm5lbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyBhIFNDTi9QU00gdGhhdCB3YXMgdXNlZAotICogICAgICAgICAgICAgICAgICBieSBhbiBhcHBsaWNhdGlvbiBydW5uaW5nIG92ZXIgUkZDT01NIG9yIEwyQ0FQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2RnJlZUNoYW5uZWwodWludDE2X3QgY2hhbm5lbCwgaW50IGNvbm5fdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZTdGFydERpc2NvdmVyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBzZXJ2aWNlIGRpc2NvdmVyeSBmb3IgdGhlIHNlcnZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBnaXZlbiBwZWVyIGRldmljZS4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIHRoZSB0QlRBX0pWX0RNX0NCQUNLIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggYSBCVEFfSlZfRElTQ09WRVJZX0NPTVBfRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2U3RhcnREaXNjb3ZlcnkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWRfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkNyZWF0ZVJlY29yZEJ5VXNlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGEgc2VydmljZSByZWNvcmQgaW4gdGhlIGxvY2FsIFNEUCBkYXRhYmFzZSBieSB1c2VyIGluCi0gKiAgICAgICAgICAgICAgICAgIHRCVEFfSlZfRE1fQ0JBQ0sgY2FsbGJhY2sgd2l0aCBhIEJUQV9KVl9DUkVBVEVfUkVDT1JEX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkNyZWF0ZVJlY29yZEJ5VXNlcih1aW50MzJfdCByZmNvbW1fc2xvdF9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZEZWxldGVSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlbGV0ZSBhIHNlcnZpY2UgcmVjb3JkIGluIHRoZSBsb2NhbCBTRFAgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZEZWxldGVSZWNvcmQodWludDMyX3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhdGUgYSBjb25uZWN0aW9uIGFzIGEgTDJDQVAgY2xpZW50IHRvIHRoZSBnaXZlbiBCRAotICogICAgICAgICAgICAgICAgICBBZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzIGluaXRpYXRlZCBvciBmYWlsZWQgdG8gaW5pdGlhdGUsCi0gKiAgICAgICAgICAgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgaXMgY2FsbGVkIHdpdGggQlRBX0pWX0wyQ0FQX0NMX0lOSVRfRVZUCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgb3IgZmFpbGVkLAotICogICAgICAgICAgICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLIGlzIGNhbGxlZCB3aXRoIEJUQV9KVl9MMkNBUF9PUEVOX0VWVAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9KdkwyY2FwQ29ubmVjdChpbnQgY29ubl90eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0VSVE1fSU5GTz4gZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVtb3RlX3BzbSwgdWludDE2X3QgcnhfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9DRkdfSU5GTz4gY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyogcF9jYmFjaywgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuIEwyQ0FQIGNsaWVudCBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcENsb3NlKHVpbnQzMl90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZMMmNhcFN0YXJ0U2VydmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBhbiBMMkNBUCBzZXJ2ZXIgYW5kIGxpc3RlbnMgZm9yIGFuCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQIGNvbm5lY3Rpb24gZnJvbSBhIHJlbW90ZSBCbHVldG9vdGggZGV2aWNlLiAgV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgc2VydmVyIGlzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0QlRBX0pWX0wyQ0FQX0NCQUNLIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIEJUQV9KVl9MMkNBUF9TVEFSVF9FVlQuICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkLCB0QlRBX0pWX0wyQ0FQX0NCQUNLIGlzIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9MMkNBUF9PUEVOX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfSnZMMmNhcFN0YXJ0U2VydmVyKGludCBjb25uX3R5cGUsIHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0VSVE1fSU5GTz4gZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxvY2FsX3BzbSwgdWludDE2X3QgcnhfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0TDJDQVBfQ0ZHX0lORk8+IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZMMmNhcFN0b3BTZXJ2ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc3RvcHMgdGhlIEwyQ0FQIHNlcnZlci4gSWYgdGhlIHNlcnZlciBoYXMKLSAqICAgICAgICAgICAgICAgICAgYW4gYWN0aXZlIGNvbm5lY3Rpb24sIGl0IHdvdWxkIGJlIGNsb3NlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwU3RvcFNlcnZlcih1aW50MTZfdCBsb2NhbF9wc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwUmVhZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBkYXRhIGZyb20gYW4gTDJDQVAgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgaXMKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggQlRBX0pWX0wyQ0FQX1JFQURfRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBSZWFkKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwUmVhZHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lZCBpZiB0aGVyZSBpcyBkYXRhIHRvIHJlYWQgZnJvbQotICogICAgICAgICAgICAgICAgICBhbiBMMkNBUCBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgZGF0YSBxdWV1ZSBzaXplIGlzIGluICpwX2RhdGFfc2l6ZS4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIGlmIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFJlYWR5KHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QqIHBfZGF0YV9zaXplKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gTDJDQVAgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgaXMKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggQlRBX0pWX0wyQ0FQX1dSSVRFX0VWVC4gV29ya3MgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFBTTS1iYXNlZCBjb25uZWN0aW9ucwotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBXcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCwgQlRfSERSKiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2UmZjb21tQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBhbiBSRkNPTU0gY29uZWN0aW9uIHRvIGEgcmVtb3RlIEJECi0gKiAgICAgICAgICAgICAgICAgIEFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIG9yIGZhaWxlZCB0byBpbml0aWF0ZSwKLSAqICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgaXMgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX1JGQ09NTV9DTF9JTklUX0VWVAotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIG9yIGZhaWxlZCwKLSAqICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgaXMgY2FsbGVkIHdpdGggQlRBX0pWX1JGQ09NTV9PUEVOX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tQ29ubmVjdCh0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVtb3RlX3NjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2UmZjb21tQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuIFJGQ09NTSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1DbG9zZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdlJmY29tbVN0YXJ0U2VydmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIGFuIFJGQ09NTSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgZnJvbSBhIHJlbW90ZSBCbHVldG9vdGggZGV2aWNlLiAgV2hlbiB0aGUgc2VydmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0QlRBX0pWX1JGQ09NTV9DQkFDSyBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBCVEFfSlZfUkZDT01NX1NUQVJUX0VWVC4KLSAqICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sKLSAqICAgICAgICAgICAgICAgICAgaXMgY2FsbGVkIHdpdGggQlRBX0pWX1JGQ09NTV9PUEVOX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbVN0YXJ0U2VydmVyKHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbG9jYWxfc2NuLCB1aW50OF90IG1heF9zZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZSZmNvbW1TdG9wU2VydmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0b3BzIHRoZSBSRkNPTU0gc2VydmVyLiBJZiB0aGUgc2VydmVyIGhhcyBhbgotICogICAgICAgICAgICAgICAgICBhY3RpdmUgY29ubmVjdGlvbiwgaXQgd291bGQgYmUgY2xvc2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tU3RvcFNlcnZlcih1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdlJmY29tbVdyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIFJGQ09NTSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgaXMKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggQlRBX0pWX1JGQ09NTV9XUklURV9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1Xcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgQlRBX0pWU2V0UG1Qcm9maWxlCi0gKgotICogRGVzY3JpcHRpb24gVGhpcyBmdW5jdGlvbiBzZXQgb3IgZnJlZSBwb3dlciBtb2RlIHByb2ZpbGUgZm9yIGRpZmZlcmVudCBKVgotICogICAgICAgICAgICAgYXBwbGljYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgaGFuZGxlLCAgSlYgaGFuZGxlIGZyb20gUkZDT01NIG9yIEwyQ0FQCi0gKiAgICAgICAgICAgICAgYXBwX2lkOiAgYXBwIHNwZWNpZmljIHBtIElELCBjYW4gYmUgQlRBX0pWX1BNX0FMTCwgc2VlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgYnRhX2RtX2NmZy5jIGZvciBkZXRhaWxzCi0gKiAgICAgICAgICAgICAgQlRBX0pWX1BNX0lEX0NMRUFSOiByZW1vdmVzIHBtIG1hbmFnZW1lbnQgb24gdGhlIGhhbmRsZS4gaW5pdF9zdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaWdub3JlZCBhbmQgQlRBX0pWX0NPTk5fQ0xPU0UgaXMgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdGx5Ci0gKiAgICAgICAgICAgICAgaW5pdF9zdDogc3RhdGUgYWZ0ZXIgY2FsbGluZyB0aGlzIEFQSS4gdHlwaWNhbGx5IGl0IHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgIEJUQV9KVl9DT05OX09QRU4KLSAqCi0gKiBSZXR1cm5zICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqIE5PVEU6ICAgICAgICBCVEFfSlZfUE1fSURfQ0xFQVI6IEluIGdlbmVyYWwgbm8gbmVlZCB0byBiZSBjYWxsZWQgYXMganYgcG0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIGF1dG9tYXRpY2FsbHkKLSAqICAgICAgICAgICAgICBCVEFfSlZfQ09OTl9DTE9TRSB0byByZW1vdmUgaW4gY2FzZSBvZiBjb25uZWN0aW9uIGNsb3NlIQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZTZXRQbVByb2ZpbGUodWludDMyX3QgaGFuZGxlLCB0QlRBX0pWX1BNX0lEIGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX0NPTk5fU1RBVEUgaW5pdF9zdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZSZmNvbW1HZXRQb3J0SGRsCi0gKgotICogRGVzY3JpcHRpb24gICAgVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSByZmNvbW0gcG9ydCBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUQV9KdlJmY29tbUdldFBvcnRIZGwodWludDMyX3QgaGFuZGxlKTsKLQotI2VuZGlmIC8qIEJUQV9KVl9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX2p2X2NvLmggYi9idGEvaW5jbHVkZS9idGFfanZfY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2NjM5Ni4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfanZfY28uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDctMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZpbGUgZm9yIGphdmEgaW50ZXJmYWNlIGNhbGwtb3V0IGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfSlZfQ09fSAotI2RlZmluZSBCVEFfSlZfQ09fSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2p2X2NvX3JmY19kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBKViB0byBzZW5kIGRhdGEgdG8gdGhlIGphdmEgZ2x1ZQotICogICAgICAgICAgICAgICAgICBjb2RlIHdoZW4gdGhlIFJYIGRhdGEgcGF0aCBpcyBjb25maWd1cmVkIHRvIHVzZSBhIGNhbGwtb3V0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIGludCBidGFfY29fcmZjX2RhdGFfaW5jb21pbmcodWludDMyX3QgcmZjb21tX3Nsb3RfaWQsIEJUX0hEUiogcF9idWYpOwotZXh0ZXJuIGludCBidGFfY29fcmZjX2RhdGFfb3V0Z29pbmdfc2l6ZSh1aW50MzJfdCByZmNvbW1fc2xvdF9pZCwgaW50KiBzaXplKTsKLWV4dGVybiBpbnQgYnRhX2NvX3JmY19kYXRhX291dGdvaW5nKHVpbnQzMl90IHJmY29tbV9zbG90X2lkLCB1aW50OF90KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXplKTsKLQotI2VuZGlmIC8qIEJUQV9ER19DT19IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfbGVfYXVkaW9fYXBpLmggYi9idGEvaW5jbHVkZS9idGFfbGVfYXVkaW9fYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDhlNWEuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX2xlX2F1ZGlvX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFja19mb3J3YXJkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfbGVfYXVkaW8uaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotY2xhc3MgTGVBdWRpb0hhbFZlcmlmaWVyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIFN1cHBvcnRzTGVBdWRpbygpOwotfTsKLQotLyogSW50ZXJmYWNlIGNsYXNzICovCi1jbGFzcyBMZUF1ZGlvQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkxlQXVkaW9DbGllbnQodm9pZCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoYmx1ZXRvb3RoOjpsZV9hdWRpbzo6TGVBdWRpb0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUgaW5pdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPGJvb2woKT4gaGFsXzJfMV92ZXJpZmllcik7Ci0gIHN0YXRpYyB2b2lkIENsZWFudXAodm9pZCk7Ci0gIHN0YXRpYyBMZUF1ZGlvQ2xpZW50KiBHZXQodm9pZCk7Ci0gIHN0YXRpYyB2b2lkIERlYnVnRHVtcChpbnQgZmQpOwotCi0gIHZpcnR1YWwgdm9pZCBSZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgdmlydHVhbCB2b2lkIEdyb3VwQWRkTm9kZShjb25zdCBpbnQgZ3JvdXBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpID0gMDsKLSAgdmlydHVhbCB2b2lkIEdyb3VwUmVtb3ZlTm9kZShjb25zdCBpbnQgZ3JvdXBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpID0gMDsKLSAgdmlydHVhbCB2b2lkIEdyb3VwU3RyZWFtKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgdWludDE2X3QgY29udGVudF90eXBlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHcm91cFN1c3BlbmQoY29uc3QgaW50IGdyb3VwX2lkKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHcm91cFN0b3AoY29uc3QgaW50IGdyb3VwX2lkKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHcm91cERlc3Ryb3koY29uc3QgaW50IGdyb3VwX2lkKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHcm91cFNldEFjdGl2ZShjb25zdCBpbnQgZ3JvdXBfaWQpID0gMDsKLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBHZXRHcm91cERldmljZXMoY29uc3QgaW50IGdyb3VwX2lkKSA9IDA7Ci0gIHN0YXRpYyB2b2lkIEFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGJvb2wgYXV0b2Nvbm5lY3QpOwotICBzdGF0aWMgYm9vbCBJc0xlQXVkaW9DbGllbnRSdW5uaW5nKCk7Ci19OwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX29wX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX29wX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTlmZDc0Li4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL2J0YV9vcF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSBmaWxlIGZvciB0aGUgb2JqZWN0IHB1c2ggKE9QKSBjbGllbnQgYW5kCi0gKiAgc2VydmVyIHN1YnN5c3RlbSBvZiBCVEEsIEJyb2FkY29tJ3MgQmx1ZXRvb3RoIGFwcGxpY2F0aW9uIGxheWVyIGZvcgotICogIG1vYmlsZSBwaG9uZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX09QX0FQSV9ICi0jZGVmaW5lIEJUQV9PUF9BUElfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEV4dHJhIERlYnVnIENvZGUgKi8KLSNpZm5kZWYgQlRBX09QU19ERUJVRwotI2RlZmluZSBCVEFfT1BTX0RFQlVHIGZhbHNlCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfT1BDX0RFQlVHCi0jZGVmaW5lIEJUQV9PUENfREVCVUcgZmFsc2UKLSNlbmRpZgotCi0vKiBPYmplY3QgZm9ybWF0ICovCi0jZGVmaW5lIEJUQV9PUF9WQ0FSRDIxX0ZNVCAxICAvKiB2Q2FyZCAyLjEgKi8KLSNkZWZpbmUgQlRBX09QX1ZDQVJEMzBfRk1UIDIgIC8qIHZDYXJkIDMuMCAqLwotI2RlZmluZSBCVEFfT1BfVkNBTF9GTVQgMyAgICAgLyogdkNhbCAxLjAgKi8KLSNkZWZpbmUgQlRBX09QX0lDQUxfRk1UIDQgICAgIC8qIGlDYWwgMi4wICovCi0jZGVmaW5lIEJUQV9PUF9WTk9URV9GTVQgNSAgICAvKiB2Tm90ZSAqLwotI2RlZmluZSBCVEFfT1BfVk1TR19GTVQgNiAgICAgLyogdk1lc3NhZ2UgKi8KLSNkZWZpbmUgQlRBX09QX09USEVSX0ZNVCAweEZGIC8qIG90aGVyIGZvcm1hdCAqLwotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9PUF9GTVQ7Ci0KLS8qIE9iamVjdCBmb3JtYXQgbWFzayAqLwotI2RlZmluZSBCVEFfT1BfVkNBUkQyMV9NQVNLIDB4MDEgLyogdkNhcmQgMi4xICovCi0jZGVmaW5lIEJUQV9PUF9WQ0FSRDMwX01BU0sgMHgwMiAvKiB2Q2FyZCAzLjAgKi8KLSNkZWZpbmUgQlRBX09QX1ZDQUxfTUFTSyAweDA0ICAgIC8qIHZDYWwgMS4wICovCi0jZGVmaW5lIEJUQV9PUF9JQ0FMX01BU0sgMHgwOCAgICAvKiBpQ2FsIDIuMCAqLwotI2RlZmluZSBCVEFfT1BfVk5PVEVfTUFTSyAweDEwICAgLyogdk5vdGUgKi8KLSNkZWZpbmUgQlRBX09QX1ZNU0dfTUFTSyAweDIwICAgIC8qIHZNZXNzYWdlICovCi0jZGVmaW5lIEJUQV9PUF9BTllfTUFTSyAweDQwICAgICAvKiBBbnkgdHlwZSBvZiBvYmplY3QuICovCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX09QX0ZNVF9NQVNLOwotCi0jZW5kaWYgLyogQlRBX09QX0FQSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfcGFuX2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX3Bhbl9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiOTA2NS4uMDAwMDAwMAotLS0gYS9idGEvaW5jbHVkZS9idGFfcGFuX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSBmaWxlIGZvciB0aGUgUGVyc29uYWwgQXJlYSBOZXR3b3JraW5nIChQQU4pCi0gKiAgc3Vic3lzdGVtIG9mIEJUQSwgQnJvYWRjb20ncyBCbHVldG9vdGggYXBwbGljYXRpb24gbGF5ZXIgZm9yIG1vYmlsZQotICogIHBob25lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfUEFOX0FQSV9ICi0jZGVmaW5lIEJUQV9QQU5fQVBJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgYW5kIGRhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3RleHByIGJvb2wgQlRBX1BBTl9TVUNDRVNTID0gdHJ1ZTsKLWNvbnN0ZXhwciBib29sIEJUQV9QQU5fRkFJTCA9IGZhbHNlOwotdHlwZWRlZiBib29sIHRCVEFfUEFOX1NUQVRVUzsKLQotLyogUEFOIENhbGxiYWNrIGV2ZW50cyAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEJUQV9QQU5fRU5BQkxFX0VWVCA9IDAsICAgLyogUEFOIHNlcnZpY2UgaXMgZW5hYmxlZC4gKi8KLSAgQlRBX1BBTl9TRVRfUk9MRV9FVlQgPSAxLCAvKiBQQU4gcm9sZXMgcmVnaXN0ZXJlZCAqLwotICBCVEFfUEFOX09QRU5JTkdfRVZUID0gMiwgIC8qIENvbm5lY3Rpb24gaXMgYmVpbmcgb3BlbmVkLiAqLwotICBCVEFfUEFOX09QRU5fRVZUID0gMywgICAgIC8qIENvbm5lY3Rpb24gaGFzIGJlZW4gb3BlbmVkLiAqLwotICBCVEFfUEFOX0NMT1NFX0VWVCA9IDQsICAgIC8qIENvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiAqLwotfSB0QlRBX1BBTl9FVlQ7Ci0KLS8qIHBhbiByb2xlcyAqLwotI2RlZmluZSBCVEFfUEFOX1JPTEVfUEFOVSBQQU5fUk9MRV9DTElFTlQKLSNkZWZpbmUgQlRBX1BBTl9ST0xFX05BUCBQQU5fUk9MRV9OQVBfU0VSVkVSCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX1BBTl9ST0xFOwotCi0vKiAgaW5mb3JtYXRpb24gcmVnYXJkaW5nIFBBTiByb2xlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiBwX3Nydl9uYW1lOyAvKiBzZXJ2aWNlIG5hbWUgZm9yIHRoZSBQQU4gcm9sZSAqLwotICB1aW50OF90IGFwcF9pZDsgICAgICAgICAvKiBhcHBsaWNhdGlvbiBpZCAqLwotfSB0QlRBX1BBTl9ST0xFX0lORk87Ci0KLS8qIEV2ZW50IGFzc29jaWF0ZWQgd2l0aCBCVEFfUEFOX1NFVF9ST0xFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX1BBTl9TVEFUVVMgc3RhdHVzOyAvKiBzdGF0dXMgb2Ygc2V0IHJvbGUgZXZlbnQgKi8KLSAgdEJUQV9QQU5fUk9MRSByb2xlOyAgICAgLyogUEFOIHJvbGVzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkICovCi19IHRCVEFfUEFOX1NFVF9ST0xFOwotCi0vKiBFdmVudCBhc3NvY2lhdGVkIHdpdGggQlRBX1BBTl9PUEVOSU5HX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7IC8qIEJEIGFkZHJlc3Mgb2YgcGVlciBkZXZpY2UuICovCi0gIHVpbnQxNl90IGhhbmRsZTsgLyogSGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24uICovCi0KLX0gdEJUQV9QQU5fT1BFTklORzsKLQotLyogRXZlbnQgYXNzb2NpYXRlZCB3aXRoIEJUQV9QQU5fT1BFTl9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAgICAgICAvKiBCRCBhZGRyZXNzIG9mIHBlZXIgZGV2aWNlLiAqLwotICB1aW50MTZfdCBoYW5kbGU7ICAgICAgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLiAqLwotICB0QlRBX1BBTl9TVEFUVVMgc3RhdHVzOyAgIC8qIHN0YXR1cyBvZiBvcGVuIGV2ZW50ICovCi0gIHRCVEFfUEFOX1JPTEUgbG9jYWxfcm9sZTsgLyogTG9jYWwgZGV2aWNlIFBBTiByb2xlIGZvciB0aGUgY29ubmVjdGlvbiAqLwotICB0QlRBX1BBTl9ST0xFIHBlZXJfcm9sZTsgIC8qIFBlZXIgZGV2aWNlIFBBTiByb2xlIGZvciB0aGUgY29ubmVjdGlvbiAqLwotCi19IHRCVEFfUEFOX09QRU47Ci0KLS8qIEV2ZW50IGFzc29jaWF0ZWQgd2l0aCBCVEFfUEFOX0NMT1NFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBoYW5kbGU7IC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24uICovCi19IHRCVEFfUEFOX0NMT1NFOwotCi0vKiBVbmlvbiBvZiBhbGwgUEFOIGNhbGxiYWNrIHN0cnVjdHVyZXMgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QlRBX1BBTl9TRVRfUk9MRSBzZXRfcm9sZTsgLyogc2V0X3JvbGUgZXZlbnQgKi8KLSAgdEJUQV9QQU5fT1BFTiBvcGVuOyAgICAgICAgIC8qIENvbm5lY3Rpb24gaGFzIGJlZW4gb3BlbmVkLiAqLwotICB0QlRBX1BBTl9PUEVOSU5HIG9wZW5pbmc7ICAgLyogQ29ubmVjdGlvbiBiZWluZyBvcGVuZWQgKi8KLSAgdEJUQV9QQU5fQ0xPU0UgY2xvc2U7ICAgICAgIC8qIENvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiAqLwotfSB0QlRBX1BBTjsKLQotLyogTnVtYmVyIG9mIFBBTiBjb25uZWN0aW9ucyAqLwotI2lmbmRlZiBCVEFfUEFOX05VTV9DT05OCi0jZGVmaW5lIEJUQV9QQU5fTlVNX0NPTk4gNAotI2VuZGlmCi0KLS8qIFBBTiBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkKHRCVEFfUEFOX0NCQUNLKSh0QlRBX1BBTl9FVlQgZXZlbnQsIHRCVEFfUEFOKiBwX2RhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1BhbkVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIFBBTiBzZXJ2aWNlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgUEFOIEFQSSBhcmUgY2FsbGVkLgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBlbmFibGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgQlRBX1BBTl9FTkFCTEVfRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfUGFuRW5hYmxlKHRCVEFfUEFOX0NCQUNLIHBfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1BhbkRpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGUgUEFOIHNlcnZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9QYW5EaXNhYmxlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1BhblNldFJvbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgUEFOIHJvbGVzLiBXaGVuIHRoZSBlbmFibGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKLSAqICAgICAgICAgICAgICAgICAgQlRBX1BBTl9TRVRfUk9MRV9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX1BhblNldFJvbGUodEJUQV9QQU5fUk9MRSByb2xlLCB0QlRBX1BBTl9ST0xFX0lORk8qIHBfdXNlcl9pbmZvLAotICAgICAgICAgICAgICAgICAgICB0QlRBX1BBTl9ST0xFX0lORk8qIHBfbmFwX2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1Bhbk9wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE9wZW5zIGEgY29ubmVjdGlvbiB0byBhIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBXaGVuIGNvbm5lY3Rpb24gaXMgb3BlbiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIEJUQV9QQU5fT1BFTl9FVlQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9QYW5PcGVuKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfUEFOX1JPTEUgbG9jYWxfcm9sZSwKLSAgICAgICAgICAgICAgICAgdEJUQV9QQU5fUk9MRSBwZWVyX3JvbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1BhbkNsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIFBBTiAgY29ubmVjdGlvbiB0byBhIHBlZXIgZGV2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX1BhbkNsb3NlKHVpbnQxNl90IGhhbmRsZSk7Ci0KLSNlbmRpZiAvKiBCVEFfUEFOX0FQSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfcGFuX2NpLmggYi9idGEvaW5jbHVkZS9idGFfcGFuX2NpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZGE4ZDYuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3Bhbl9jaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZpbGUgZm9yIHBhbiBjYWxsLWluIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfUEFOX0NJX0gKLSNkZWZpbmUgQlRBX1BBTl9DSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX3Bhbl9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jaV90eF9yZWFkeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBldmVudCB0byBQQU4gaW5kaWNhdGluZyB0aGUgcGhvbmUgaXMKLSAqICAgICAgICAgICAgICAgICAgcmVhZHkgZm9yIG1vcmUgZGF0YSBhbmQgUEFOIHNob3VsZCBjYWxsCi0gKiAgICAgICAgICAgICAgICAgIGJ0YV9wYW5fY29fdHhfcGF0aCgpLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgVFggZGF0YSBwYXRoIGlzIGNvbmZpZ3VyZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gdXNlIGEgcHVsbCBpbnRlcmZhY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBidGFfcGFuX2NpX3R4X3JlYWR5KHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NpX3J4X3JlYWR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIGV2ZW50IHRvIFBBTiBpbmRpY2F0aW5nIHRoZSBwaG9uZQotICogICAgICAgICAgICAgICAgICBoYXMgZGF0YSBhdmFpbGFibGUgdG8gc2VuZCB0byBQQU4gYW5kIFBBTiBzaG91bGQgY2FsbAotICogICAgICAgICAgICAgICAgICBidGFfcGFuX2NvX3J4X3BhdGgoKS4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHRoZSBSWAotICogICAgICAgICAgICAgICAgICBkYXRhIHBhdGggaXMgY29uZmlndXJlZCB0byB1c2UgYSBwdWxsIGludGVyZmFjZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY2lfcnhfcmVhZHkodWludDE2X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY2lfdHhfZmxvdwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGF0YSBmbG93IG9uCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBUWCBwYXRoLiAgVGhlIHBob25lIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgZGlzYWJsZSBkYXRhIGZsb3cgd2hlbiBpdCBpcyBjb25nZXN0ZWQgYW5kIGNhbm5vdCBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgYW55IG1vcmUgZGF0YSBzZW50IGJ5IGJ0YV9wYW5fY29fdHhfd3JpdGUoKS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIFRYIGRhdGEgcGF0aCBpcyBjb25maWd1cmVkIHRvIHVzZSBhIHB1c2ggaW50ZXJmYWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jaV90eF9mbG93KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBlbmFibGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jaV9yeF93cml0ZWJ1ZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBkYXRhIHRvIHRoZSBwaG9uZSB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBSWCBwYXRoIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGEgcHVzaCBpbnRlcmZhY2Ugd2l0aAotICogICAgICAgICAgICAgICAgICB6ZXJvIGNvcHkuICBUaGUgZnVuY3Rpb24gc2VuZHMgYW4gZXZlbnQgdG8gUEFOIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyLiBUaGUgYnVmZmVyIHdpbGwgYmUgZnJlZWQgYnkgQlRBOyB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGhvbmUgbXVzdCBub3QgZnJlZSB0aGUgYnVmZmVyLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZmxvdyBlbmFibGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGVidWYodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGRzdCwgdWludDE2X3QgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYsIGJvb2wgZXh0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY2lfcmVhZGJ1ZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHBob25lIHRvIHJlYWQgZGF0YSBmcm9tIFBBTgotICogICAgICAgICAgICAgICAgICB3aGVuIHRoZSBUWCBwYXRoIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGEgcHVsbCBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBjYWxsZXIgbXVzdCBmcmVlIHRoZSBidWZmZXIgd2hlbiBpdCBpcyB0aHJvdWdoCi0gKiAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlci4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBCVF9IRFIqIGJ0YV9wYW5fY2lfcmVhZGJ1Zih1aW50MTZfdCBoYW5kbGUsIFJhd0FkZHJlc3MmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBkc3QsIHVpbnQxNl90KiBwX3Byb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfZXh0LCBib29sKiBwX2ZvcndhcmQpOwotCi0jZW5kaWYgLyogQlRBX1BBTl9DSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfcGFuX2NvLmggYi9idGEvaW5jbHVkZS9idGFfcGFuX2NvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YmFmZjAuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3Bhbl9jby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZpbGUgZm9yIGRhdGEgZ2F0ZXdheSBjYWxsLW91dCBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX1BBTl9DT19ICi0jZGVmaW5lIEJUQV9QQU5fQ09fSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9wYW5fYXBpLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEJUX0hEUiBidWZmZXIgb2Zmc2V0ICovCi0jZGVmaW5lIEJUQV9QQU5fTUlOX09GRlNFVCBQQU5fTUlOSU1VTV9PRkZTRVQKLQotLyogRGF0YSBGbG93IE1hc2sgKi8KLSNkZWZpbmUgQlRBX1BBTl9SWF9QVVNIIDB4MDAgICAgIC8qIFJYIHB1c2guICovCi0jZGVmaW5lIEJUQV9QQU5fUlhfUFVTSF9CVUYgMHgwMSAvKiBSWCBwdXNoIHdpdGggemVybyBjb3B5LiAqLwotI2RlZmluZSBCVEFfUEFOX1JYX1BVTEwgMHgwMiAgICAgLyogUlggcHVsbC4gKi8KLSNkZWZpbmUgQlRBX1BBTl9UWF9QVVNIIDB4MDAgICAgIC8qIFRYIHB1c2guICovCi0jZGVmaW5lIEJUQV9QQU5fVFhfUFVMTCAweDIwICAgICAvKiBUWCBwdWxsLiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jb19pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgUEFOIHdoZW4gYSBzZXJ2ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSBjYWxsaW5nIEJUQV9QYW5FbmFibGUoKS4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlCi0gKiAgICAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIHBob25lIHRvIGluaXRpYWxpemUgZGF0YSBwYXRocyBvciBmb3Igb3RoZXIKLSAqICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gcHVycG9zZXMuICBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGRhdGEgZmxvdyBtYXNrIGFzIGRlc2NyaWJlZCBiZWxvdy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBEYXRhIGZsb3cgbWFzay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQ4X3QgYnRhX3Bhbl9jb19pbml0KHVpbnQ4X3QqIHFfbGV2ZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jb19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgUEFOIHdoZW4gYSBjb25uZWN0aW9uIHRvIGEKLSAqICAgICAgICAgICAgICAgICAgc2VydmVyIGlzIGNsb3NlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29fY2xvc2UodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NvX3R4X3BhdGgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFBBTiB0byB0cmFuc2ZlciBkYXRhIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBUWCBwYXRoOyB0aGF0IGlzLCBkYXRhIGJlaW5nIHNlbnQgZnJvbSBCVEEgdG8gdGhlIHBob25lLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgVFggZGF0YSBwYXRoIGlzIGNvbmZpZ3VyZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gdXNlIHRoZSBwdWxsIGludGVyZmFjZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29fdHhfcGF0aCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgYXBwX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY29fcnhfcGF0aAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgUEFOIHRvIHRyYW5zZmVyIGRhdGEgb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIFJYIHBhdGg7IHRoYXQgaXMsIGRhdGEgYmVpbmcgc2VudCBmcm9tIHRoZSBwaG9uZSB0byBCVEEuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHRoZSBSWCBkYXRhIHBhdGggaXMgY29uZmlndXJlZAotICogICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIHB1bGwgaW50ZXJmYWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19yeF9wYXRoKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jb19yeF9mbG93Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBQQU4gdG8gZW5hYmxlIG9yIGRpc2FibGUKLSAqICAgICAgICAgICAgICAgICAgZGF0YSBmbG93IG9uIHRoZSBSWCBwYXRoIHdoZW4gaXQgaXMgY29uZmlndXJlZCB0byB1c2UKLSAqICAgICAgICAgICAgICAgICAgYSBwdXNoIGludGVyZmFjZS4gIElmIGRhdGEgZmxvdyBpcyBkaXNhYmxlZCB0aGUgcGhvbmUgbXVzdAotICogICAgICAgICAgICAgICAgICBub3QgY2FsbCBidGFfcGFuX2NpX3J4X3dyaXRlKCkgb3IgYnRhX3Bhbl9jaV9yeF93cml0ZWJ1ZigpCi0gKiAgICAgICAgICAgICAgICAgIHVudGlsIGRhdGEgZmxvdyBpcyBlbmFibGVkIGFnYWluLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19yeF9mbG93KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQsIGJvb2wgZW5hYmxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY29fZmlsdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHByb3RvY29sIGZpbHRlciBpbmRpY2F0aW9uIGZyb20gcGVlciBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9jb19wZmlsdF9pbmQodWludDE2X3QgaGFuZGxlLCBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1BBTl9TVEFUVVMgcmVzdWx0LCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jb19tZmlsdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIG11bHRpY2FzdCBmaWx0ZXIgaW5kaWNhdGlvbiBmcm9tIHBlZXIgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29fbWZpbHRfaW5kKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9QQU5fU1RBVFVTIHJlc3VsdCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9maWx0ZXJzKTsKLQotI2VuZGlmIC8qIEJUQV9QQU5fQ09fSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL2luY2x1ZGUvYnRhX3NkcF9hcGkuaCBiL2J0YS9pbmNsdWRlL2J0YV9zZHBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDczN2YuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3NkcF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIEJUQSBTRFAgSS9GCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX1NEUF9BUElfSAotI2RlZmluZSBCVEFfU0RQX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX3NkcF9hcGkuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X3NkcC5oIiAgLy8gYmx1ZXRvb3RoX3NkcF9yZWNvcmQKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotLyogc3RhdHVzIHZhbHVlcyAqLwotI2RlZmluZSBCVEFfU0RQX1NVQ0NFU1MgMCAvKiBTdWNjZXNzZnVsIG9wZXJhdGlvbi4gKi8KLSNkZWZpbmUgQlRBX1NEUF9GQUlMVVJFIDEgLyogR2VuZXJpYyBmYWlsdXJlLiAqLwotI2RlZmluZSBCVEFfU0RQX0JVU1kgMiAgICAvKiBUZW1wb3JhcmlseSBjYW4gbm90IGhhbmRsZSB0aGlzIHJlcXVlc3QuICovCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX1NEUF9TVEFUVVM7Ci0KLS8qIFNEUCBJL0YgY2FsbGJhY2sgZXZlbnRzICovCi0vKiBldmVudHMgcmVjZWl2ZWQgYnkgdEJUQV9TRFBfRE1fQ0JBQ0sgKi8KLSNkZWZpbmUgQlRBX1NEUF9FTkFCTEVfRVZUIDAgICAgICAgICAgICAgLyogU0RQIHNlcnZpY2UgaS9mIGVuYWJsZWQqLwotI2RlZmluZSBCVEFfU0RQX1NFQVJDSF9FVlQgMSAgICAgICAgICAgICAvKiBTRFAgU2VydmljZSBzdGFydGVkICovCi0jZGVmaW5lIEJUQV9TRFBfU0VBUkNIX0NPTVBfRVZUIDIgICAgICAgIC8qIFNEUCBzZWFyY2ggY29tcGxldGUgKi8KLSNkZWZpbmUgQlRBX1NEUF9DUkVBVEVfUkVDT1JEX1VTRVJfRVZUIDMgLyogU0RQIHNlYXJjaCBjb21wbGV0ZSAqLwotI2RlZmluZSBCVEFfU0RQX1JFTU9WRV9SRUNPUkRfVVNFUl9FVlQgNCAvKiBTRFAgc2VhcmNoIGNvbXBsZXRlICovCi0jZGVmaW5lIEJUQV9TRFBfTUFYX0VWVCA1ICAgICAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgU0RQIGV2ZW50cyAqLwotCi0jZGVmaW5lIEJUQV9TRFBfTUFYX1JFQ09SRFMgMTUKLQotdHlwZWRlZiB1aW50MTZfdCB0QlRBX1NEUF9FVlQ7Ci0KLS8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9TRFBfRElTQ09WRVJZX0NPTVBfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfU0RQX1NUQVRVUyBzdGF0dXM7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2FkZHI7Ci0gIGJsdWV0b290aDo6VXVpZCB1dWlkOwotICBpbnQgcmVjb3JkX2NvdW50OwotICBibHVldG9vdGhfc2RwX3JlY29yZCByZWNvcmRzW0JUQV9TRFBfTUFYX1JFQ09SRFNdOwotfSB0QlRBX1NEUF9TRUFSQ0hfQ09NUDsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHRCVEFfU0RQX1NUQVRVUyBzdGF0dXM7ICAgICAgICAgICAgICAgLyogQlRBX1NEUF9TRUFSQ0hfRVZUICovCi0gIHRCVEFfU0RQX1NFQVJDSF9DT01QIHNkcF9zZWFyY2hfY29tcDsgLyogQlRBX1NEUF9TRUFSQ0hfQ09NUF9FVlQgKi8KLX0gdEJUQV9TRFA7Ci0KLS8qIFNEUCBETSBJbnRlcmZhY2UgY2FsbGJhY2sgKi8KLXR5cGVkZWYgdm9pZCh0QlRBX1NEUF9ETV9DQkFDSykodEJUQV9TRFBfRVZUIGV2ZW50LCB0QlRBX1NEUCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpOwotCi0vKiBNQ0UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3Qgc2RwX2RiX3NpemU7ICAgICAgICAvKiBUaGUgc2l6ZSBvZiBwX3NkcF9kYiAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9zZHBfZGI7IC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIFNEUCBkYXRhYmFzZSAqLwotfSB0QlRBX1NEUF9DRkc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfU2RwRW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGUgdGhlIFNEUCBJL0Ygc2VydmljZS4gV2hlbiB0aGUgZW5hYmxlCi0gKiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQgd2l0aCBhIEJUQV9TRFBfRU5BQkxFX0VWVC4gVGhpcyBmdW5jdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZnVuY3Rpb25zIGluIHRoZSBNQ0UgQVBJIGFyZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU0RQX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX1NEUF9GQUlMIGlmIGludGVybmFsIGZhaWx1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QlRBX1NEUF9TVEFUVVMgQlRBX1NkcEVuYWJsZSh0QlRBX1NEUF9ETV9DQkFDSyogcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfU2RwU2VhcmNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBhIHNlYXJjaCBmb3Igc2RwIHJlY29yZHMgZm9yIGEgc3BlY2lmaWMgQkRfQUREUiB3aXRoIGEKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgcHJvZmlsZSB1dWlkLgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBzZWFyY2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBCVEFfU0RQX1NFQVJDSF9FVlQuCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TRFBfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBCVEFfU0RQX0ZBSUwgaWYgaW50ZXJuYWwgZmFpbHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRCVEFfU0RQX1NUQVRVUyBCVEFfU2RwU2VhcmNoKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9TZHBDcmVhdGVSZWNvcmRCeVVzZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXF1ZXN0IGEgY2FsbGJhY2sgdG8gY3JlYXRlIGEgU0RQCi0gKiAgICAgICAgICAgICAgICAgIHJlY29yZC4gVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBldmVudAotICogICAgICAgICAgICAgICAgICBCVEFfU0RQX0NSRUFURV9SRUNPUkRfVVNFUl9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfU0RQX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX1NEUF9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QlRBX1NEUF9TVEFUVVMgQlRBX1NkcENyZWF0ZVJlY29yZEJ5VXNlcih2b2lkKiB1c2VyX2RhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1NkcFJlbW92ZVJlY29yZEJ5VXNlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgYSBjYWxsYmFjayB0byByZW1vdmUgYSBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkLiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGV2ZW50Ci0gKiAgICAgICAgICAgICAgICAgIEJUQV9TRFBfUkVNT1ZFX1JFQ09SRF9VU0VSX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TRFBfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfU0RQX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRCVEFfU0RQX1NUQVRVUyBCVEFfU2RwUmVtb3ZlUmVjb3JkQnlVc2VyKHZvaWQqIHVzZXJfZGF0YSk7Ci0KLSNlbmRpZiAvKiBCVEFfU0RQX0FQSV9IICovCmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfdmNfYXBpLmggYi9idGEvaW5jbHVkZS9idGFfdmNfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTM3MGUuLjAwMDAwMDAKLS0tIGEvYnRhL2luY2x1ZGUvYnRhX3ZjX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF92Yy5oPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotY2xhc3MgVm9sdW1lQ29udHJvbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Wb2x1bWVDb250cm9sKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoYmx1ZXRvb3RoOjp2Yzo6Vm9sdW1lQ29udHJvbENhbGxiYWNrcyogY2FsbGJhY2tzKTsKLSAgc3RhdGljIHZvaWQgQ2xlYW5VcCgpOwotICBzdGF0aWMgVm9sdW1lQ29udHJvbCogR2V0KCk7Ci0gIHN0YXRpYyB2b2lkIERlYnVnRHVtcChpbnQgZmQpOwotCi0gIHN0YXRpYyB2b2lkIEFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGJvb2wgYXV0b19jb25uZWN0KTsKLQotICBzdGF0aWMgYm9vbCBJc1ZvbHVtZUNvbnRyb2xSdW5uaW5nKCk7Ci0KLSAgLyogVm9sdW1lIENvbnRyb2wgU2VydmVyIChWQ1MpICovCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKHN0ZDo6dmFyaWFudDxSYXdBZGRyZXNzLCBpbnQ+IGFkZHJfb3JfZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2b2x1bWUpID0gMDsKLX07CmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS91dGwuaCBiL2J0YS9pbmNsdWRlL3V0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJhMzVlLi4wMDAwMDAwCi0tLSBhL2J0YS9pbmNsdWRlL3V0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQmFzaWMgdXRpbGl0eSBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgVVRMX0gKLSNkZWZpbmUgVVRMX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqIGNsYXNzIG9mIGRldmljZSBzZXR0aW5ncyAqKiovCi0jZGVmaW5lIEJUQV9VVExfU0VUX0NPRF9NQUpPUl9NSU5PUiAweDAxCi0jZGVmaW5lIEJUQV9VVExfU0VUX0NPRF9TRVJWSUNFX0NMQVNTICAgIFwKLSAgMHgwMiAvKiBvbmx5IHNldCB0aGUgYml0cyBpbiB0aGUgaW5wdXQgXAotICAgICAgICAgICovCi0jZGVmaW5lIEJUQV9VVExfQ0xSX0NPRF9TRVJWSUNFX0NMQVNTIDB4MDQKLSNkZWZpbmUgQlRBX1VUTF9TRVRfQ09EX0FMTCBcCi0gIDB4MDggLyogdGFrZSBzZXJ2aWNlIGNsYXNzIGFzIHRoZSBpbnB1dCAobWF5IGNsZWFyIHNvbWUgc2V0IGJpdHMhISkgKi8KLSNkZWZpbmUgQlRBX1VUTF9JTklUX0NPRCAweDBhCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgRGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiogZm9yIHV0bF9zZXRfZGV2aWNlX2NsYXNzKCkgKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgbWlub3I7Ci0gIHVpbnQ4X3QgbWFqb3I7Ci0gIHVpbnQxNl90IHNlcnZpY2U7Ci19IHRCVEFfVVRMX0NPRDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHV0bF9zdHIyaW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY29udmVydHMgYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGFuCi0gKiAgICAgICAgICAgICAgICAgIGludGVnZXIuICBBY2NlcHRhYmxlIHZhbHVlcyBpbiBzdHJpbmcgYXJlIDAtOS4gIElmIGludmFsaWQKLSAqICAgICAgICAgICAgICAgICAgc3RyaW5nIG9yIHN0cmluZyB2YWx1ZSB0b28gbGFyZ2UsIC0xIGlzIHJldHVybmVkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEludGVnZXIgdmFsdWUgb3IgLTEgb24gZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQxNl90IHV0bF9zdHIyaW50KGNvbnN0IGNoYXIqIHBfcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1dGxfc3RydWNtcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNvbXBhcmVzIHR3byBzdHJpbmdzIGluIHVwcGVyY2FzZS4KLSAqICAgICAgICAgICAgICAgICAgU3RyaW5nIHBfcyBtdXN0IGJlIHVwcGVyY2FzZS4gIFN0cmluZyBwX3QgaXMgY29udmVydGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSBpZiBsb3dlcmNhc2UuICBJZiBwX3MgZW5kcyBmaXJzdCwgdGhlIHN1YnN0cmluZwotICogICAgICAgICAgICAgICAgICBtYXRjaCBpcyBjb3VudGVkIGFzIGEgbWF0Y2guCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgMCBpZiBzdHJpbmdzIG1hdGNoLCBub256ZXJvIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGludCB1dGxfc3RydWNtcChjb25zdCBjaGFyKiBwX3MsIGNvbnN0IGNoYXIqIHBfdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1dGxfaXRvYQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNvbnZlcnRzIGEgdWludDE2X3QgdG8gYSBzdHJpbmcuICBUaGUKLSAqICAgICAgICAgICAgICAgICAgc3RyaW5nIGlzIE5VTEwtdGVybWluYXRlZC4gIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcwotICogICAgICAgICAgICAgICAgICByZXR1cm5lZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBMZW5ndGggb2Ygc3RyaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDhfdCB1dGxfaXRvYSh1aW50MTZfdCBpLCBjaGFyKiBwX3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgdXRsX3NldF9kZXZpY2VfY2xhc3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbG9jYWwgRGV2aWNlIENsYXNzLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgIHBfY29kICAgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2UgY2xhc3MgdG8gc2V0IHRvCi0gKgotICogICAgICAgICAgICAgICAgICBjbWQgICAgIC0gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIGNsYXNzIHRvIHVwZGF0ZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9VVExfU0VUX0NPRF9NQUpPUl9NSU5PUiwgLSBvdmVyd3JpdGUgbWFqb3IsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3IgY2xhc3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9VVExfU0VUX0NPRF9TRVJWSUNFX0NMQVNTIC0gc2V0IHRoZSBiaXRzIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX1VUTF9DTFJfQ09EX1NFUlZJQ0VfQ0xBU1MgLSBjbGVhciB0aGUgYml0cyBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9VVExfU0VUX0NPRF9BTEwgLSBvdmVyd3JpdGUgbWFqb3IsIG1pbm9yLCBzZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0cyBpbiBzZXJ2aWNlIGNsYXNzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfVVRMX0lOSVRfQ09EIC0gb3ZlcndyaXRlIG1ham9yLCBtaW5vciwgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSBjbGFzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgdXRsX3NldF9kZXZpY2VfY2xhc3ModEJUQV9VVExfQ09EKiBwX2NvZCwgdWludDhfdCBjbWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgdXRsX2lzaW50c3RyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYW4KLSAqICAgICAgICAgICAgICAgICAgaW50ZWdlciBzdHJpbmcgb3Igbm90Ci0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgdXRsX2lzaW50c3RyKGNvbnN0IGNoYXIqIHBfcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1dGxfaXNkaWFsY2hhcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgIGlzIGFuIGFjY2VwdGFibGUgZGlhbCBkaWdpdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgdXRsX2lzZGlhbGNoYXIoY29uc3QgY2hhciBkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHV0bF9pc2RpYWxzdHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucwotICogICAgICAgICAgICAgICAgICBvbmx5IGRpYWwgZGlnaXRzIG9yIG5vdAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIHV0bF9pc2RpYWxzdHIoY29uc3QgY2hhciogcF9zKTsKLQotI2VuZGlmIC8qIFVUTF9IICovCmRpZmYgLS1naXQgYS9idGEvanYvYnRhX2p2X2FjdC5jYyBiL2J0YS9qdi9idGFfanZfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwMDc3Li4wMDAwMDAwCi0tLSBhL2J0YS9qdi9idGFfanZfYWN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA2LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBhY3Rpb24gZnVuY3Rpb25zIGZvciBCVEEgSlYgQVBJcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2p2X2NvLmgiCi0jaW5jbHVkZSAiYnRhL2p2L2J0YV9qdl9pbnQuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZjdF9hcGkuaCIgIC8vIEFWQ1RfUFNNCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdmR0X2FwaS5oIiAgLy8gQVZEVF9QU00KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2FwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotdEJUQV9KVl9DQiBidGFfanZfY2I7Ci1zdGQ6OnVub3JkZXJlZF9zZXQ8dWludDE2X3Q+IHVzZWRfbDJjYXBfY2xhc3NpY19keW5hbWljX3BzbTsKLQotc3RhdGljIHRCVEFfSlZfUENCKiBidGFfanZfYWRkX3JmY19wb3J0KHRCVEFfSlZfUkZDX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUENCKiBwX3BjYl9vcGVuKTsKLXN0YXRpYyB0QlRBX0pWX1NUQVRVUyBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYih1aW50MzJfdCBqdl9oYW5kbGUpOwotc3RhdGljIHZvaWQgYnRhX2p2X3BtX2Nvbm5fYnVzeSh0QlRBX0pWX1BNX0NCKiBwX2NiKTsKLXN0YXRpYyB2b2lkIGJ0YV9qdl9wbV9jb25uX2lkbGUodEJUQV9KVl9QTV9DQiogcF9jYik7Ci1zdGF0aWMgdm9pZCBidGFfanZfcG1fc3RhdGVfY2hhbmdlKHRCVEFfSlZfUE1fQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSlZfQ09OTl9TVEFURSBzdGF0ZSk7Ci0KLSNpZm5kZWYgQlRBX0pWX1NEUF9EQl9TSVpFCi0jZGVmaW5lIEJUQV9KVl9TRFBfREJfU0laRSA0NTAwCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfSlZfU0RQX1JBV19EQVRBX1NJWkUKLSNkZWZpbmUgQlRBX0pWX1NEUF9SQVdfREFUQV9TSVpFIDE4MDAKLSNlbmRpZgotCi1zdGF0aWMgdWludDhfdCBidGFfanZfc2RwX3Jhd19kYXRhW0JUQV9KVl9TRFBfUkFXX0RBVEFfU0laRV07Ci1zdGF0aWMgdFNEUF9ESVNDT1ZFUllfREIKLSAgICBidGFfanZfc2RwX2RiX2RhdGFbQlRBX0pWX1NEUF9EQl9TSVpFIC8gc2l6ZW9mKHRTRFBfRElTQ09WRVJZX0RCKV07Ci0KLS8qIEpWIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCi1zdHJ1Y3QgdEJUQV9KVl9DRkcgewotICB1aW50MTZfdCBzZHBfcmF3X3NpemU7ICAgICAgIC8qIFRoZSBzaXplIG9mIHBfc2RwX3Jhd19kYXRhICovCi0gIHVpbnQxNl90IHNkcF9kYl9zaXplOyAgICAgICAgLyogVGhlIHNpemUgb2YgcF9zZHBfZGIgKi8KLSAgdWludDhfdCogcF9zZHBfcmF3X2RhdGE7ICAgICAvKiBUaGUgZGF0YSBidWZmZXIgdG8ga2VlcCByYXcgZGF0YSAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9zZHBfZGI7IC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIFNEUCBkYXRhYmFzZSAqLwotfSBidGFfanZfY2ZnID0gewotICAgIEJUQV9KVl9TRFBfUkFXX0RBVEFfU0laRSwgLyogVGhlIHNpemUgb2YgcF9zZHBfcmF3X2RhdGEgKi8KLSAgICAoQlRBX0pWX1NEUF9EQl9TSVpFIC8gc2l6ZW9mKHRTRFBfRElTQ09WRVJZX0RCKSkgKgotICAgICAgICBzaXplb2YodFNEUF9ESVNDT1ZFUllfREIpLCAvKiBUaGUgc2l6ZSBvZiBwX3NkcF9kYl9kYXRhICovCi0gICAgYnRhX2p2X3NkcF9yYXdfZGF0YSwgICAgICAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIHJhdyBkYXRhICovCi0gICAgYnRhX2p2X3NkcF9kYl9kYXRhICAgICAgICAgICAgIC8qIFRoZSBkYXRhIGJ1ZmZlciB0byBrZWVwIFNEUCBkYXRhYmFzZSAqLwotfTsKLQotdEJUQV9KVl9DRkcqIHBfYnRhX2p2X2NmZyA9ICZidGFfanZfY2ZnOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBidGFfanZfYWxsb2Nfc2VjX2lkCi0gKgotICogRGVzY3JpcHRpb24gIGFsbG9jYXRlIGEgc2VjdXJpdHkgaWQKLSAqCi0gKiBSZXR1cm5zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRhX2p2X2FsbG9jX3NlY19pZCh2b2lkKSB7Ci0gIHVpbnQ4X3QgcmV0ID0gMDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSlZfTlVNX1NFUlZJQ0VfSUQ7IGkrKykgewotICAgIGlmICgwID09IGJ0YV9qdl9jYi5zZWNfaWRbaV0pIHsKLSAgICAgIGJ0YV9qdl9jYi5zZWNfaWRbaV0gPSBCVEFfSlZfRklSU1RfU0VSVklDRV9JRCArIGk7Ci0gICAgICByZXQgPSBidGFfanZfY2Iuc2VjX2lkW2ldOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci1zdGF0aWMgaW50IGdldF9zZWNfaWRfdXNlZCh2b2lkKSB7Ci0gIGludCBpOwotICBpbnQgdXNlZCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSlZfTlVNX1NFUlZJQ0VfSUQ7IGkrKykgewotICAgIGlmIChidGFfanZfY2Iuc2VjX2lkW2ldKSB1c2VkKys7Ci0gIH0KLSAgaWYgKHVzZWQgPT0gQlRBX0pWX05VTV9TRVJWSUNFX0lEKQotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IHNlYyBpZCBleGNlZWRzIHRoZSBsaW1pdD0iIDw8IEJUQV9KVl9OVU1fU0VSVklDRV9JRDsKLSAgcmV0dXJuIHVzZWQ7Ci19Ci1zdGF0aWMgaW50IGdldF9yZmNfY2JfdXNlZCh2b2lkKSB7Ci0gIGludCBpOwotICBpbnQgdXNlZCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSlZfTUFYX1JGQ19DT05OOyBpKyspIHsKLSAgICBpZiAoYnRhX2p2X2NiLnJmY19jYltpXS5oYW5kbGUpIHVzZWQrKzsKLSAgfQotICBpZiAodXNlZCA9PSBCVEFfSlZfTUFYX1JGQ19DT05OKQotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IHJmYyBjdHJsIGJsb2NrIGV4Y2VlZHMgdGhlIGxpbWl0PSIgPDwgQlRBX0pWX01BWF9SRkNfQ09OTjsKLSAgcmV0dXJuIHVzZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9mcmVlX3NlY19pZAotICoKLSAqIERlc2NyaXB0aW9uICBmcmVlIHRoZSBnaXZlbiBzZWN1cml0eSBpZAotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2p2X2ZyZWVfc2VjX2lkKHVpbnQ4X3QqIHBfc2VjX2lkKSB7Ci0gIHVpbnQ4X3Qgc2VjX2lkID0gKnBfc2VjX2lkOwotICAqcF9zZWNfaWQgPSAwOwotICBpZiAoc2VjX2lkID49IEJUQV9KVl9GSVJTVF9TRVJWSUNFX0lEICYmIHNlY19pZCA8PSBCVEFfSlZfTEFTVF9TRVJWSUNFX0lEKSB7Ci0gICAgQlRNX1NlY0NsclNlcnZpY2Uoc2VjX2lkKTsKLSAgICBidGFfanZfY2Iuc2VjX2lkW3NlY19pZCAtIEJUQV9KVl9GSVJTVF9TRVJWSUNFX0lEXSA9IDA7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX2p2X2FsbG9jX3JmY19jYgotICoKLSAqIERlc2NyaXB0aW9uICBhbGxvY2F0ZSBhIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBnaXZlbiBwb3J0IGhhbmRsZQotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9SRkNfQ0IqIGJ0YV9qdl9hbGxvY19yZmNfY2IodWludDE2X3QgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1BDQioqIHBwX3BjYikgewotICB0QlRBX0pWX1JGQ19DQiogcF9jYiA9IE5VTEw7Ci0gIHRCVEFfSlZfUENCKiBwX3BjYjsKLSAgaW50IGksIGo7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSlZfTUFYX1JGQ19DT05OOyBpKyspIHsKLSAgICBpZiAoMCA9PSBidGFfanZfY2IucmZjX2NiW2ldLmhhbmRsZSkgewotICAgICAgcF9jYiA9ICZidGFfanZfY2IucmZjX2NiW2ldOwotICAgICAgLyogbWFzayBoYW5kbGUgdG8gZGlzdGluZ3Vpc2ggaXQgd2l0aCBMMkNBUCBoYW5kbGUgKi8KLSAgICAgIHBfY2ItPmhhbmRsZSA9IChpICsgMSkgfCBCVEFfSlZfUkZDT01NX01BU0s7Ci0KLSAgICAgIHBfY2ItPm1heF9zZXNzID0gMTsKLSAgICAgIHBfY2ItPmN1cnJfc2VzcyA9IDE7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTjsgaisrKSBwX2NiLT5yZmNfaGRsW2pdID0gMDsKLSAgICAgIHBfY2ItPnJmY19oZGxbMF0gPSBwb3J0X2hhbmRsZTsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgInBvcnRfaGFuZGxlPSIgPDwgK3BvcnRfaGFuZGxlCi0gICAgICAgICAgICAgIDw8ICIsIGhhbmRsZT0iIDw8IGxvZ2hleChwX2NiLT5oYW5kbGUpOwotCi0gICAgICBwX3BjYiA9ICZidGFfanZfY2IucG9ydF9jYltwb3J0X2hhbmRsZSAtIDFdOwotICAgICAgcF9wY2ItPmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKLSAgICAgIHBfcGNiLT5wb3J0X2hhbmRsZSA9IHBvcnRfaGFuZGxlOwotICAgICAgcF9wY2ItPnBfcG1fY2IgPSBOVUxMOwotICAgICAgKnBwX3BjYiA9IHBfcGNiOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChwX2NiID09IE5VTEwpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJwb3J0X2hhbmRsZT0iIDw8IHBvcnRfaGFuZGxlIDw8ICIgY3RybCBibG9jayBleGNlZWRzIGxpbWl0OiIgPDwgQlRBX0pWX01BWF9SRkNfQ09OTjsKLSAgfQotICByZXR1cm4gcF9jYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX2p2X3JmY19wb3J0X3RvX3BjYgotICoKLSAqIERlc2NyaXB0aW9uICBmaW5kIHRoZSBwb3J0IGNvbnRyb2wgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwb3J0Ci0gKiAgICAgICAgICAgICAgaGFuZGxlCi0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1BDQiogYnRhX2p2X3JmY19wb3J0X3RvX3BjYih1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICB0QlRBX0pWX1BDQiogcF9wY2IgPSBOVUxMOwotCi0gIGlmICgocG9ydF9oYW5kbGUgPiAwKSAmJiAocG9ydF9oYW5kbGUgPD0gTUFYX1JGQ19QT1JUUykgJiYKLSAgICAgIGJ0YV9qdl9jYi5wb3J0X2NiW3BvcnRfaGFuZGxlIC0gMV0uaGFuZGxlKSB7Ci0gICAgcF9wY2IgPSAmYnRhX2p2X2NiLnBvcnRfY2JbcG9ydF9oYW5kbGUgLSAxXTsKLSAgfQotCi0gIHJldHVybiBwX3BjYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX2p2X3JmY19wb3J0X3RvX2NiCi0gKgotICogRGVzY3JpcHRpb24gIGZpbmQgdGhlIFJGQ09NTSBjb250cm9sIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcG9ydAotICogICAgICAgICAgICAgIGhhbmRsZQotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9SRkNfQ0IqIGJ0YV9qdl9yZmNfcG9ydF90b19jYih1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICB0QlRBX0pWX1JGQ19DQiogcF9jYiA9IE5VTEw7Ci0gIHVpbnQzMl90IGhhbmRsZTsKLQotICBpZiAoKHBvcnRfaGFuZGxlID4gMCkgJiYgKHBvcnRfaGFuZGxlIDw9IE1BWF9SRkNfUE9SVFMpICYmCi0gICAgICBidGFfanZfY2IucG9ydF9jYltwb3J0X2hhbmRsZSAtIDFdLmhhbmRsZSkgewotICAgIGhhbmRsZSA9IGJ0YV9qdl9jYi5wb3J0X2NiW3BvcnRfaGFuZGxlIC0gMV0uaGFuZGxlOwotICAgIGhhbmRsZSAmPSBCVEFfSlZfUkZDX0hETF9NQVNLOwotICAgIGhhbmRsZSAmPSB+QlRBX0pWX1JGQ09NTV9NQVNLOwotICAgIGlmIChoYW5kbGUpIHBfY2IgPSAmYnRhX2p2X2NiLnJmY19jYltoYW5kbGUgLSAxXTsKLSAgfSBlbHNlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjoganYgaGFuZGxlIG5vdCBmb3VuZCBwb3J0X2hhbmRsZToiIDw8IHBvcnRfaGFuZGxlOwotICB9Ci0gIHJldHVybiBwX2NiOwotfQotCi1zdGF0aWMgdEJUQV9KVl9TVEFUVVMgYnRhX2p2X2ZyZWVfcmZjX2NiKHRCVEFfSlZfUkZDX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1BDQiogcF9wY2IpIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gIGJvb2wgcmVtb3ZlX3NlcnZlciA9IGZhbHNlOwotICBpbnQgY2xvc2VfcGVuZGluZyA9IDA7Ci0KLSAgaWYgKCFwX2NiIHx8ICFwX3BjYikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBwX2NiIG9yIHBfcGNiIGNhbm5vdCBiZSBudWxsIjsKLSAgICByZXR1cm4gQlRBX0pWX0ZBSUxVUkU7Ci0gIH0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBtYXhfc2Vzcz0iIDw8IHBfY2ItPm1heF9zZXNzCi0gICAgICAgICAgPDwgIiwgY3Vycl9zZXNzPSIgPDwgcF9jYi0+Y3Vycl9zZXNzIDw8ICIsIHBfcGNiPSIgPDwgcF9wY2IKLSAgICAgICAgICA8PCAiLCB1c2VyPSIgPDwgcF9wY2ItPnJmY29tbV9zbG90X2lkIDw8ICIsIHN0YXRlPSIgPDwgcF9wY2ItPnN0YXRlCi0gICAgICAgICAgPDwgIiwganYgaGFuZGxlPSIgPDwgbG9naGV4KHBfcGNiLT5oYW5kbGUpOwotCi0gIGlmIChwX2NiLT5jdXJyX3Nlc3MgPD0gMCkgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotCi0gIHN3aXRjaCAocF9wY2ItPnN0YXRlKSB7Ci0gICAgY2FzZSBCVEFfSlZfU1RfQ0xfQ0xPU0lORzoKLSAgICBjYXNlIEJUQV9KVl9TVF9TUl9DTE9TSU5HOgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogcmV0dXJuIG9uIGNsb3NpbmcsIHBvcnQgc3RhdGU9IiA8PCBwX3BjYi0+c3RhdGUKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBzY249IiA8PCBwX2NiLT5zY24gPDwgIiwgcF9wY2I9IiA8PCBwX3BjYgotICAgICAgICAgICAgICAgICAgIDw8ICIsIHVzZXJfZGF0YT0iIDw8IHBfcGNiLT5yZmNvbW1fc2xvdF9pZDsKLSAgICAgIHN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICBjYXNlIEJUQV9KVl9TVF9DTF9PUEVOOgotICAgIGNhc2UgQlRBX0pWX1NUX0NMX09QRU5JTkc6Ci0gICAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgcF9wY2ItPnN0YXRlIDw8ICIsIHNjbj0iIDw8IHBfY2ItPnNjbgotICAgICAgICAgICAgICA8PCAiLCB1c2VyX2RhdGE9IiA8PCBwX3BjYi0+cmZjb21tX3Nsb3RfaWQ7Ci0gICAgICBwX3BjYi0+c3RhdGUgPSBCVEFfSlZfU1RfQ0xfQ0xPU0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0pWX1NUX1NSX0xJU1RFTjoKLSAgICAgIHBfcGNiLT5zdGF0ZSA9IEJUQV9KVl9TVF9TUl9DTE9TSU5HOwotICAgICAgcmVtb3ZlX3NlcnZlciA9IHRydWU7Ci0gICAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlOiBCVEFfSlZfU1RfU1JfTElTVEVOLCBzY249IiA8PCBwX2NiLT5zY24KLSAgICAgICAgICAgICAgPDwgIiwgdXNlcl9kYXRhPSIgPDwgcF9wY2ItPnJmY29tbV9zbG90X2lkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSlZfU1RfU1JfT1BFTjoKLSAgICAgIHBfcGNiLT5zdGF0ZSA9IEJUQV9KVl9TVF9TUl9DTE9TSU5HOwotICAgICAgVkxPRygyKSA8PCAiOiBzdGF0ZTogQlRBX0pWX1NUX1NSX09QRU4sIHNjbj0iIDw8IHBfY2ItPnNjbgotICAgICAgICAgICAgICA8PCAiIHVzZXJfZGF0YT0iIDw8IHBfcGNiLT5yZmNvbW1fc2xvdF9pZDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjpmYWlsZWQsIGlnbm9yZSBwb3J0IHN0YXRlPSAiIDw8IHBfcGNiLT5zdGF0ZQotICAgICAgICAgICAgICAgICAgIDw8ICIsIHNjbj0iIDw8IHBfY2ItPnNjbiA8PCAiLCBwX3BjYj0gIiA8PCBwX3BjYgotICAgICAgICAgICAgICAgICAgIDw8ICIsIGp2IGhhbmRsZT0iIDw8IGxvZ2hleChwX3BjYi0+aGFuZGxlKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIHBvcnRfaGFuZGxlPSIgPDwgcF9wY2ItPnBvcnRfaGFuZGxlCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgdXNlcl9kYXRhPSIgPDwgcF9wY2ItPnJmY29tbV9zbG90X2lkOwotICAgICAgc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoQlRBX0pWX1NVQ0NFU1MgPT0gc3RhdHVzKSB7Ci0gICAgaW50IHBvcnRfc3RhdHVzOwotCi0gICAgaWYgKCFyZW1vdmVfc2VydmVyKQotICAgICAgcG9ydF9zdGF0dXMgPSBSRkNPTU1fUmVtb3ZlQ29ubmVjdGlvbihwX3BjYi0+cG9ydF9oYW5kbGUpOwotICAgIGVsc2UKLSAgICAgIHBvcnRfc3RhdHVzID0gUkZDT01NX1JlbW92ZVNlcnZlcihwX3BjYi0+cG9ydF9oYW5kbGUpOwotICAgIGlmIChwb3J0X3N0YXR1cyAhPSBQT1JUX1NVQ0NFU1MpIHsKLSAgICAgIHN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFJlbW92ZSBqdiBoYW5kbGU9IiA8PCBsb2doZXgocF9wY2ItPmhhbmRsZSkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0ZT0iIDw8IHBfcGNiLT5zdGF0ZQotICAgICAgICAgICAgICAgICAgIDw8ICIsIHBvcnRfc3RhdHVzPSIgPDwgcG9ydF9zdGF0dXMKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBwb3J0X2hhbmRsZT0iIDw8IHBfcGNiLT5wb3J0X2hhbmRsZQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGNsb3NlX3BlbmRpbmc9IiA8PCBjbG9zZV9wZW5kaW5nOwotICAgIH0KLSAgfQotICBpZiAoIWNsb3NlX3BlbmRpbmcpIHsKLSAgICBwX3BjYi0+cG9ydF9oYW5kbGUgPSAwOwotICAgIHBfcGNiLT5zdGF0ZSA9IEJUQV9KVl9TVF9OT05FOwotICAgIGJ0YV9qdl9mcmVlX3NldF9wbV9wcm9maWxlX2NiKHBfcGNiLT5oYW5kbGUpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBjb25nZXN0aW9uIGZsYWdzCi0gICAgcF9wY2ItPmNvbmcgPSBmYWxzZTsKLSAgICBwX3BjYi0+cmZjb21tX3Nsb3RfaWQgPSAwOwotICAgIGludCBzaSA9IEJUQV9KVl9SRkNfSERMX1RPX1NJRFgocF9wY2ItPmhhbmRsZSk7Ci0gICAgaWYgKDAgPD0gc2kgJiYgc2kgPCBCVEFfSlZfTUFYX1JGQ19TUl9TRVNTSU9OKSBwX2NiLT5yZmNfaGRsW3NpXSA9IDA7Ci0gICAgcF9wY2ItPmhhbmRsZSA9IDA7Ci0gICAgcF9jYi0+Y3Vycl9zZXNzLS07Ci0gICAgaWYgKHBfY2ItPmN1cnJfc2VzcyA9PSAwKSB7Ci0gICAgICBSRkNPTU1fQ2xlYXJTZWN1cml0eVJlY29yZChwX2NiLT5zY24pOwotICAgICAgcF9jYi0+c2NuID0gMDsKLSAgICAgIHBfY2ItPnBfY2JhY2sgPSBOVUxMOwotICAgICAgcF9jYi0+aGFuZGxlID0gMDsKLSAgICAgIHBfY2ItPmN1cnJfc2VzcyA9IC0xOwotICAgIH0KLSAgICBpZiAocmVtb3ZlX3NlcnZlcikgewotICAgICAgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQocF9jYi0+c2NuKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX2p2X2ZyZWVfbDJjX2NiCi0gKgotICogRGVzY3JpcHRpb24gIGZyZWUgdGhlIGdpdmVuIEwyQ0FQIGNvbnRyb2wgYmxvY2sKLSAqCi0gKiBSZXR1cm5zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIGJ0YV9qdl9mcmVlX2wyY19jYih0QlRBX0pWX0wyQ19DQiogcF9jYikgewotICB0QlRBX0pWX1NUQVRVUyBzdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLQotICBpZiAoQlRBX0pWX1NUX05PTkUgIT0gcF9jYi0+c3RhdGUpIHsKLSAgICBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYigodWludDMyX3QpcF9jYi0+aGFuZGxlKTsKLSAgICBpZiAoR0FQX0Nvbm5DbG9zZShwX2NiLT5oYW5kbGUpICE9IEJUX1BBU1MpIHN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwotICB9Ci0gIHBfY2ItPnBzbSA9IDA7Ci0gIHBfY2ItPnN0YXRlID0gQlRBX0pWX1NUX05PTkU7Ci0gIHBfY2ItPmNvbmcgPSBmYWxzZTsKLSAgYnRhX2p2X2ZyZWVfc2VjX2lkKCZwX2NiLT5zZWNfaWQpOwotICBwX2NiLT5wX2NiYWNrID0gTlVMTDsKLSAgcF9jYi0+aGFuZGxlID0gMDsKLSAgcF9jYi0+bDJjYXBfc29ja2V0X2lkID0gMDsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgotICogRnVuY3Rpb24gICAgYnRhX2p2X2NsZWFyX3BtX2NiCi0gKgotICogRGVzY3JpcHRpb24gY2xlYXJzIGp2IHBtIGNvbnRyb2wgYmxvY2sgYW5kIG9wdGlvbmFsbHkgY2FsbHMKLSAqICAgICAgICAgICAgIGJ0YV9zeXNfY29ubl9jbG9zZSgpCi0gKiAgICAgICAgICAgICBJbiBnZW5lcmFsIGNsb3NlX2Nvbm4gc2hvdWxkIGJlIHNldCB0byB0cnVlIHRvIHJlbW92ZSByZWdpc3RlcmluZwotICogICAgICAgICAgICAgd2l0aCBkbSBwbSEKLSAqCi0gKiBXQVJOSU5HOiAgICBNYWtlIHN1cmUgdG8gY2xlYXIgcG9pbnRlciBmb3JtIHBvcnQgb3IgbDJjIHRvIHRoaXMgY29udHJvbCBibG9jawotICogICAgICAgICAgICAgdG9vIQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfanZfY2xlYXJfcG1fY2IodEJUQV9KVl9QTV9DQiogcF9wbV9jYiwgYm9vbCBjbG9zZV9jb25uKSB7Ci0gIC8qIG5lZWRzIHRvIGJlIGNhbGxlZCBpZiByZWdpc3RlcmVkIHdpdGggYnRhIHBtLCBvdGhlcndpc2Ugd2UgbWF5IHJ1biBvdXQgb2YKLSAgICogZG0gcG0gc2xvdHMhICovCi0gIGlmIChjbG9zZV9jb25uKQotICAgIGJ0YV9zeXNfY29ubl9jbG9zZShCVEFfSURfSlYsIHBfcG1fY2ItPmFwcF9pZCwgcF9wbV9jYi0+cGVlcl9iZF9hZGRyKTsKLSAgcF9wbV9jYi0+c3RhdGUgPSBCVEFfSlZfUE1fRlJFRV9TVDsKLSAgcF9wbV9jYi0+YXBwX2lkID0gQlRBX0pWX1BNX0FMTDsKLSAgcF9wbV9jYi0+aGFuZGxlID0gQlRBX0pWX1BNX0hBTkRMRV9DTEVBUjsKLSAgcF9wbV9jYi0+cGVlcl9iZF9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYgotICoKLSAqIERlc2NyaXB0aW9uICBmcmVlIHBtIHByb2ZpbGUgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgIEJUQV9KVl9TVUNDRVNTIGlmIGNiIGhhcyBiZWVuIGZyZWVkIGNvcnJlY3RseSwKLSAqICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFIGluIGNhc2Ugb2Ygbm8gcHJvZmlsZSBoYXMgYmVlbiByZWdpc3RlcmVkIG9yCi0gKiAgICAgICAgICAgICBhbHJlYWR5IGZyZWVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0pWX1NUQVRVUyBidGFfanZfZnJlZV9zZXRfcG1fcHJvZmlsZV9jYih1aW50MzJfdCBqdl9oYW5kbGUpIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gIHRCVEFfSlZfUE1fQ0IqKiBwX2NiOwotICBpbnQgaSwgaiwgYmRfY291bnRlciA9IDAsIGFwcGlkX2NvdW50ZXIgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfSlZfUE1fTUFYX05VTTsgaSsrKSB7Ci0gICAgcF9jYiA9IE5VTEw7Ci0gICAgaWYgKChidGFfanZfY2IucG1fY2JbaV0uc3RhdGUgIT0gQlRBX0pWX1BNX0ZSRUVfU1QpICYmCi0gICAgICAgIChqdl9oYW5kbGUgPT0gYnRhX2p2X2NiLnBtX2NiW2ldLmhhbmRsZSkpIHsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBCVEFfSlZfUE1fTUFYX05VTTsgaisrKSB7Ci0gICAgICAgIGlmIChidGFfanZfY2IucG1fY2Jbal0ucGVlcl9iZF9hZGRyID09IGJ0YV9qdl9jYi5wbV9jYltpXS5wZWVyX2JkX2FkZHIpCi0gICAgICAgICAgYmRfY291bnRlcisrOwotICAgICAgICBpZiAoYnRhX2p2X2NiLnBtX2NiW2pdLmFwcF9pZCA9PSBidGFfanZfY2IucG1fY2JbaV0uYXBwX2lkKQotICAgICAgICAgIGFwcGlkX2NvdW50ZXIrKzsKLSAgICAgIH0KLQotICAgICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBqdl9oYW5kbGU9IiA8PCBsb2doZXgoanZfaGFuZGxlKQotICAgICAgICAgICAgICA8PCAiLCBpZHg9IiA8PCBpIDw8ICJhcHBfaWQ9IiA8PCBidGFfanZfY2IucG1fY2JbaV0uYXBwX2lkCi0gICAgICAgICAgICAgIDw8ICIsIGJkX2NvdW50ZXI9IiA8PCBiZF9jb3VudGVyCi0gICAgICAgICAgICAgIDw8ICIsIGFwcGlkX2NvdW50ZXI9IiA8PCBhcHBpZF9jb3VudGVyOwotICAgICAgaWYgKGJkX2NvdW50ZXIgPiAxKSB7Ci0gICAgICAgIGJ0YV9qdl9wbV9jb25uX2lkbGUoJmJ0YV9qdl9jYi5wbV9jYltpXSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChiZF9jb3VudGVyIDw9IDEgfHwgKGFwcGlkX2NvdW50ZXIgPD0gMSkpIHsKLSAgICAgICAgYnRhX2p2X2NsZWFyX3BtX2NiKCZidGFfanZfY2IucG1fY2JbaV0sIHRydWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRhX2p2X2NsZWFyX3BtX2NiKCZidGFfanZfY2IucG1fY2JbaV0sIGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKEJUQV9KVl9SRkNPTU1fTUFTSyAmIGp2X2hhbmRsZSkgewotICAgICAgICB1aW50MzJfdCBoaSA9Ci0gICAgICAgICAgICAoKGp2X2hhbmRsZSAmIEJUQV9KVl9SRkNfSERMX01BU0spICYgfkJUQV9KVl9SRkNPTU1fTUFTSykgLSAxOwotICAgICAgICB1aW50MzJfdCBzaSA9IEJUQV9KVl9SRkNfSERMX1RPX1NJRFgoanZfaGFuZGxlKTsKLSAgICAgICAgaWYgKGhpIDwgQlRBX0pWX01BWF9SRkNfQ09OTiAmJiBidGFfanZfY2IucmZjX2NiW2hpXS5wX2NiYWNrICYmCi0gICAgICAgICAgICBzaSA8IEJUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT04gJiYKLSAgICAgICAgICAgIGJ0YV9qdl9jYi5yZmNfY2JbaGldLnJmY19oZGxbc2ldKSB7Ci0gICAgICAgICAgdEJUQV9KVl9QQ0IqIHBfcGNiID0KLSAgICAgICAgICAgICAgYnRhX2p2X3JmY19wb3J0X3RvX3BjYihidGFfanZfY2IucmZjX2NiW2hpXS5yZmNfaGRsW3NpXSk7Ci0gICAgICAgICAgaWYgKHBfcGNiKSB7Ci0gICAgICAgICAgICBpZiAoTlVMTCA9PSBwX3BjYi0+cF9wbV9jYikKLSAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGp2X2hhbmRsZT0iIDw8IGxvZ2hleChqdl9oYW5kbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBwb3J0X2hhbmRsZT0iIDw8IHBfcGNiLT5wb3J0X2hhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgaT0iIDw8IGkgPDwgIiwgbm8gbGluayB0byBwbV9jYj8iOwotICAgICAgICAgICAgcF9jYiA9ICZwX3BjYi0+cF9wbV9jYjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChqdl9oYW5kbGUgPCBCVEFfSlZfTUFYX0wyQ19DT05OKSB7Ci0gICAgICAgICAgdEJUQV9KVl9MMkNfQ0IqIHBfbDJjX2NiID0gJmJ0YV9qdl9jYi5sMmNfY2JbanZfaGFuZGxlXTsKLSAgICAgICAgICBpZiAoTlVMTCA9PSBwX2wyY19jYi0+cF9wbV9jYikKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBqdl9oYW5kbGU9IiA8PCBsb2doZXgoanZfaGFuZGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGk9IiA8PCBpIDw8ICIgbm8gbGluayB0byBwbV9jYj8iOwotICAgICAgICAgIHBfY2IgPSAmcF9sMmNfY2ItPnBfcG1fY2I7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwX2NiKSB7Ci0gICAgICAgICpwX2NiID0gTlVMTDsKLSAgICAgICAgc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgYnRhX2p2X2FsbG9jX3NldF9wbV9wcm9maWxlX2NiCi0gKgotICogRGVzY3JpcHRpb24gc2V0IFBNIHByb2ZpbGUgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgIHBvaW50ZXIgdG8gYWxsb2NhdGVkIGNiIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0pWX1BNX0NCKiBidGFfanZfYWxsb2Nfc2V0X3BtX3Byb2ZpbGVfY2IodWludDMyX3QganZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1BNX0lEIGFwcF9pZCkgewotICBib29sIGJSZmNIYW5kbGUgPSAoanZfaGFuZGxlICYgQlRBX0pWX1JGQ09NTV9NQVNLKSAhPSAwOwotICBSYXdBZGRyZXNzIHBlZXJfYmRfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgaW50IGksIGo7Ci0gIHRCVEFfSlZfUE1fQ0IqKiBwcF9jYjsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX0pWX1BNX01BWF9OVU07IGkrKykgewotICAgIHBwX2NiID0gTlVMTDsKLSAgICBpZiAoYnRhX2p2X2NiLnBtX2NiW2ldLnN0YXRlID09IEJUQV9KVl9QTV9GUkVFX1NUKSB7Ci0gICAgICAvKiByZmMgaGFuZGxlIGJkIGFkZHIgcmV0cmlldmFsIHJlcXVpcmVzIGNvcmUgc3RhY2sgaGFuZGxlICovCi0gICAgICBpZiAoYlJmY0hhbmRsZSkgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgQlRBX0pWX01BWF9SRkNfQ09OTjsgaisrKSB7Ci0gICAgICAgICAgaWYgKGp2X2hhbmRsZSA9PSBidGFfanZfY2IucG9ydF9jYltqXS5oYW5kbGUpIHsKLSAgICAgICAgICAgIHBwX2NiID0gJmJ0YV9qdl9jYi5wb3J0X2NiW2pdLnBfcG1fY2I7Ci0gICAgICAgICAgICBpZiAoUE9SVF9TVUNDRVNTICE9Ci0gICAgICAgICAgICAgICAgUE9SVF9DaGVja0Nvbm5lY3Rpb24oYnRhX2p2X2NiLnBvcnRfY2Jbal0ucG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlZXJfYmRfYWRkciwgTlVMTCkpIHsKLSAgICAgICAgICAgICAgaSA9IEJUQV9KVl9QTV9NQVhfTlVNOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiB1c2UganYgaGFuZGxlIGZvciBsMmNhcCBiZCBhZGRyZXNzIHJldHJpZXZhbCAqLwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgQlRBX0pWX01BWF9MMkNfQ09OTjsgaisrKSB7Ci0gICAgICAgICAgaWYgKGp2X2hhbmRsZSA9PSBidGFfanZfY2IubDJjX2NiW2pdLmhhbmRsZSkgewotICAgICAgICAgICAgcHBfY2IgPSAmYnRhX2p2X2NiLmwyY19jYltqXS5wX3BtX2NiOwotICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogcF9iZF9hZGRyID0KLSAgICAgICAgICAgICAgICBHQVBfQ29ubkdldFJlbW90ZUFkZHIoKHVpbnQxNl90KWp2X2hhbmRsZSk7Ci0gICAgICAgICAgICBpZiAocF9iZF9hZGRyKQotICAgICAgICAgICAgICBwZWVyX2JkX2FkZHIgPSAqcF9iZF9hZGRyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBpID0gQlRBX0pWX1BNX01BWF9OVU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogaGFuZGxlPSIgPDwgbG9naGV4KGp2X2hhbmRsZSkKLSAgICAgICAgICAgICAgPDwgIiwgYXBwX2lkPSIgPDwgYXBwX2lkIDw8ICIsIGlkeD0iIDw8IGkKLSAgICAgICAgICAgICAgPDwgIiwgQlRBX0pWX1BNX01BWF9OVU09IiA8PCBCVEFfSlZfUE1fTUFYX05VTQotICAgICAgICAgICAgICA8PCAiLCBwcF9jYj0iIDw8IHBwX2NiOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKChpICE9IEJUQV9KVl9QTV9NQVhfTlVNKSAmJiAoTlVMTCAhPSBwcF9jYikpIHsKLSAgICAqcHBfY2IgPSAmYnRhX2p2X2NiLnBtX2NiW2ldOwotICAgIGJ0YV9qdl9jYi5wbV9jYltpXS5oYW5kbGUgPSBqdl9oYW5kbGU7Ci0gICAgYnRhX2p2X2NiLnBtX2NiW2ldLmFwcF9pZCA9IGFwcF9pZDsKLSAgICBidGFfanZfY2IucG1fY2JbaV0ucGVlcl9iZF9hZGRyID0gcGVlcl9iZF9hZGRyOwotICAgIGJ0YV9qdl9jYi5wbV9jYltpXS5zdGF0ZSA9IEJUQV9KVl9QTV9JRExFX1NUOwotICAgIHJldHVybiAmYnRhX2p2X2NiLnBtX2NiW2ldOwotICB9Ci0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYW5kbGU9IiA8PCBsb2doZXgoanZfaGFuZGxlKQotICAgICAgICAgICAgICAgPDwgIiwgYXBwX2lkPSIgPDwgYXBwX2lkIDw8ICIsIHJldHVybiBOVUxMIjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9jaGVja19wc20KLSAqCi0gKiBEZXNjcmlwdGlvbiAgZm9yIG5vdyB1c2Ugb25seSB0aGUgbGVnYWwgUFNNIHBlciBKU1I4MiBzcGVjCi0gKgotICogUmV0dXJucyAgICAgIHRydWUsIGlmIGFsbG93ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfanZfY2hlY2tfcHNtKHVpbnQxNl90IHBzbSkgewotICBib29sIHJldCA9IGZhbHNlOwotCi0gIGlmIChMMkNfSVNfVkFMSURfUFNNKHBzbSkpIHsKLSAgICBpZiAocHNtIDwgMHgxMDAxKSB7Ci0gICAgICAvKiBzZWUgaWYgdGhpcyBpcyBkZWZpbmVkIGJ5IHNwZWMgKi8KLSAgICAgIHN3aXRjaCAocHNtKSB7Ci0gICAgICAgIGNhc2UgQlRfUFNNX1NEUDoKLSAgICAgICAgY2FzZSBCVF9QU01fUkZDT01NOiAvKiAzICovCi0gICAgICAgICAgLyogZG8gbm90IGFsbG93IGphdmEgYXBwIHRvIHVzZSB0aGVzZSAyIFBTTXMgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUX1BTTV9UQ1M6Ci0gICAgICAgIGNhc2UgQlRfUFNNX0NUUDoKLSAgICAgICAgICBpZiAoIWJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0NUKSAmJgotICAgICAgICAgICAgICAhYnRhX3N5c19pc19yZWdpc3RlcihCVEFfSURfQ0cpKQotICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUX1BTTV9CTkVQOiAvKiBGICovCi0gICAgICAgICAgaWYgKCFidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9QQU4pKSByZXQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRfUFNNX0hJREM6Ci0gICAgICAgIGNhc2UgQlRfUFNNX0hJREk6Ci0gICAgICAgICAgLy8gRklYOiBhbGxvdyBISUQgRGV2aWNlIGFuZCBISUQgSG9zdCB0byBjb2V4aXN0Ci0gICAgICAgICAgaWYgKCFidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9IRCkgfHwKLSAgICAgICAgICAgICAgIWJ0YV9zeXNfaXNfcmVnaXN0ZXIoQlRBX0lEX0hIKSkKLSAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVkNUX1BTTTogLyogMHgxNyAqLwotICAgICAgICBjYXNlIEFWRFRfUFNNOiAvKiAweDE5ICovCi0gICAgICAgICAgaWYgKCFidGFfc3lzX2lzX3JlZ2lzdGVyKEJUQV9JRF9BVikpIHJldCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vKiBJbml0aWFsaXNlcyB0aGUgSkFWQSBJL0YgKi8KLXZvaWQgYnRhX2p2X2VuYWJsZSh0QlRBX0pWX0RNX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIHRCVEFfSlZfU1RBVFVTIHN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwotICBidGFfanZfY2IucF9kbV9jYmFjayA9IHBfY2JhY2s7Ci0gIHRCVEFfSlYgYnRhX2p2OwotICBidGFfanYuc3RhdHVzID0gc3RhdHVzOwotICBidGFfanZfY2IucF9kbV9jYmFjayhCVEFfSlZfRU5BQkxFX0VWVCwgJmJ0YV9qdiwgMCk7Ci0gIG1lbXNldChidGFfanZfY2IuZnJlZV9wc21fbGlzdCwgMCwgc2l6ZW9mKGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0KSk7Ci19Ci0KLS8qKiBEaXNhYmxlcyB0aGUgQlQgZGV2aWNlIG1hbmFnZXIgZnJlZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgamF2YSAqLwotdm9pZCBidGFfanZfZGlzYWJsZSgpIHsgTE9HKElORk8pIDw8IF9fZnVuY19fOyB9Ci0KLS8qKgotICogV2Uga2VlcCBhIGxpc3Qgb2YgUFNNJ3MgdGhhdCBoYXZlIGJlZW4gZnJlZWQgZnJvbSBKQVZBLCBmb3IgcmV1c2UuCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgZnJlZSBQU00sIGFuZCBkZWxldGUgaXQgZnJvbSB0aGUgZnJlZQotICogbGlzdC4KLSAqIElmIG5vIGZyZWUgUFNNcyBleGlzdCwgMCB3aWxsIGJlIHJldHVybmVkLgotICovCi1zdGF0aWMgdWludDE2X3QgYnRhX2p2X2dldF9mcmVlX3BzbSgpIHsKLSAgY29uc3QgaW50IGNudCA9Ci0gICAgICBzaXplb2YoYnRhX2p2X2NiLmZyZWVfcHNtX2xpc3QpIC8gc2l6ZW9mKGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0WzBdKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotICAgIHVpbnQxNl90IHBzbSA9IGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0W2ldOwotICAgIGlmIChwc20gIT0gMCkgewotICAgICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZXVzaW5nIFBTTT0iIDw8IGxvZ2hleChwc20pOwotICAgICAgYnRhX2p2X2NiLmZyZWVfcHNtX2xpc3RbaV0gPSAwOwotICAgICAgcmV0dXJuIHBzbTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9qdl9zZXRfZnJlZV9wc20odWludDE2X3QgcHNtKSB7Ci0gIGludCBmcmVlX2luZGV4ID0gLTE7Ci0gIGNvbnN0IGludCBjbnQgPQotICAgICAgc2l6ZW9mKGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0KSAvIHNpemVvZihidGFfanZfY2IuZnJlZV9wc21fbGlzdFswXSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLSAgICBpZiAoYnRhX2p2X2NiLmZyZWVfcHNtX2xpc3RbaV0gPT0gMCkgewotICAgICAgZnJlZV9pbmRleCA9IGk7Ci0gICAgfSBlbHNlIGlmIChwc20gPT0gYnRhX2p2X2NiLmZyZWVfcHNtX2xpc3RbaV0pIHsKLSAgICAgIHJldHVybjsgIC8vIFBTTSBhbHJlYWR5IGZyZWVkPwotICAgIH0KLSAgfQotICBpZiAoZnJlZV9pbmRleCAhPSAtMSkgewotICAgIGJ0YV9qdl9jYi5mcmVlX3BzbV9saXN0W2ZyZWVfaW5kZXhdID0gcHNtOwotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogUmVjeWNsaW5nIFBTTT0iIDw8IGxvZ2hleChwc20pOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIGZyZWUgcHNtPSIgPDwgbG9naGV4KHBzbSkKLSAgICAgICAgICAgICAgIDw8ICIgbm8gbW9yZSBmcmVlIHNsb3RzIjsKLSAgfQotfQotCi1zdGF0aWMgdWludDE2X3QgYnRhX2p2X2FsbG9jYXRlX2wyY2FwX2NsYXNzaWNfcHNtKCkgewotICBib29sIGRvbmUgPSBmYWxzZTsKLSAgdWludDE2X3QgcHNtID0gYnRhX2p2X2NiLmR5bl9wc207Ci0KLSAgd2hpbGUgKCFkb25lKSB7Ci0gICAgcHNtICs9IDI7Ci0gICAgaWYgKHBzbSA+IDB4ZmVmZikgewotICAgICAgcHNtID0gMHgxMDAxOwotICAgIH0gZWxzZSBpZiAocHNtICYgMHgwMTAwKSB7Ci0gICAgICAvKiB0aGUgdXBwZXIgYnl0ZSBtdXN0IGJlIGV2ZW4gKi8KLSAgICAgIHBzbSArPSAweDAxMDA7Ci0gICAgfQotCi0gICAgLyogaWYgcHNtIGlzIGluIHJhbmdlIG9mIHJlc2VydmVkIEJSQ00gQXdhcmUgZmVhdHVyZXMgKi8KLSAgICBpZiAoKEJSQ01fUkVTRVJWRURfUFNNX1NUQVJUIDw9IHBzbSkgJiYgKHBzbSA8PSBCUkNNX1JFU0VSVkVEX1BTTV9FTkQpKQotICAgICAgY29udGludWU7Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhlIG5ld2xseSBhbGxvY2F0ZWQgcHNtIGlzIG5vdCB1c2VkIHJpZ2h0IG5vdyAqLwotICAgIGlmICh1c2VkX2wyY2FwX2NsYXNzaWNfZHluYW1pY19wc20uY291bnQocHNtKSA9PSAwKSBkb25lID0gdHJ1ZTsKLSAgfQotICBidGFfanZfY2IuZHluX3BzbSA9IHBzbTsKLQotICByZXR1cm4gKHBzbSk7Ci19Ci0KLS8qKiBPYnRhaW4gYSBmcmVlIFNDTiAoU2VydmVyIENoYW5uZWwgTnVtYmVyKSAoUkZDT01NIGNoYW5uZWwgb3IgTDJDQVAgUFNNKSAqLwotdm9pZCBidGFfanZfZ2V0X2NoYW5uZWxfaWQoCi0gICAgaW50MzJfdCB0eXBlIC8qIE9uZSBvZiBCVEFfSlZfQ09OTl9UWVBFXyAqLywKLSAgICBpbnQzMl90IGNoYW5uZWwgLyogb3B0aW9uYWxseSByZXF1ZXN0IGEgc3BlY2lmaWMgY2hhbm5lbCAqLywKLSAgICB1aW50MzJfdCBsMmNhcF9zb2NrZXRfaWQsIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKSB7Ci0gIHVpbnQxNl90IHBzbSA9IDA7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCVEFfSlZfQ09OTl9UWVBFX1JGQ09NTTogewotICAgICAgdWludDhfdCBzY24gPSAwOwotICAgICAgaWYgKGNoYW5uZWwgPiAwKSB7Ci0gICAgICAgIGlmICghQlRNX1RyeUFsbG9jYXRlU0NOKGNoYW5uZWwpKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCAicmZjIGNoYW5uZWw9IiA8PCBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGFscmVhZHkgaW4gdXNlIG9yIGludmFsaWQiOwotICAgICAgICAgIGNoYW5uZWwgPSAwOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjaGFubmVsID0gQlRNX0FsbG9jYXRlU0NOKCk7Ci0gICAgICAgIGlmIChjaGFubmVsID09IDApIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8ICJydW4gb3V0IG9mIHJmYyBjaGFubmVscyI7Ci0gICAgICAgICAgY2hhbm5lbCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjaGFubmVsICE9IDApIHsKLSAgICAgICAgYnRhX2p2X2NiLnNjbltjaGFubmVsIC0gMV0gPSB0cnVlOwotICAgICAgICBzY24gPSAodWludDhfdCljaGFubmVsOwotICAgICAgfQotICAgICAgaWYgKGJ0YV9qdl9jYi5wX2RtX2NiYWNrKSB7Ci0gICAgICAgIHRCVEFfSlYgYnRhX2p2OwotICAgICAgICBidGFfanYuc2NuID0gc2NuOwotICAgICAgICBidGFfanZfY2IucF9kbV9jYmFjayhCVEFfSlZfR0VUX1NDTl9FVlQsICZidGFfanYsIHJmY29tbV9zbG90X2lkKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQOgotICAgICAgcHNtID0gYnRhX2p2X2dldF9mcmVlX3BzbSgpOwotICAgICAgaWYgKHBzbSA9PSAwKSB7Ci0gICAgICAgIHBzbSA9IGJ0YV9qdl9hbGxvY2F0ZV9sMmNhcF9jbGFzc2ljX3BzbSgpOwotICAgICAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHJldHVybmVkIFBTTT0iIDw8IGxvZ2hleChwc20pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQX0xFOgotICAgICAgcHNtID0gTDJDQV9BbGxvY2F0ZUxlUFNNKCk7Ci0gICAgICBpZiAocHNtID09IDApIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBFcnJvcjogTm8gZnJlZSBMRSBQU00gYXZhaWxhYmxlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChidGFfanZfY2IucF9kbV9jYmFjaykgewotICAgIHRCVEFfSlYgYnRhX2p2OwotICAgIGJ0YV9qdi5wc20gPSBwc207Ci0gICAgYnRhX2p2X2NiLnBfZG1fY2JhY2soQlRBX0pWX0dFVF9QU01fRVZULCAmYnRhX2p2LCBsMmNhcF9zb2NrZXRfaWQpOwotICB9Ci19Ci0KLS8qKiBmcmVlIGEgU0NOICovCi12b2lkIGJ0YV9qdl9mcmVlX3NjbihpbnQzMl90IHR5cGUgLyogT25lIG9mIEJUQV9KVl9DT05OX1RZUEVfICovLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2NuKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgQlRBX0pWX0NPTk5fVFlQRV9SRkNPTU06IHsKLSAgICAgIGlmIChzY24gPiAwICYmIHNjbiA8PSBCVEFfSlZfTUFYX1NDTiAmJiBidGFfanZfY2Iuc2NuW3NjbiAtIDFdKSB7Ci0gICAgICAgIC8qIHRoaXMgc2NuIGlzIHVzZWQgYnkgSlYgKi8KLSAgICAgICAgYnRhX2p2X2NiLnNjbltzY24gLSAxXSA9IGZhbHNlOwotICAgICAgICBCVE1fRnJlZVNDTihzY24pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0pWX0NPTk5fVFlQRV9MMkNBUDoKLSAgICAgIGJ0YV9qdl9zZXRfZnJlZV9wc20oc2NuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0pWX0NPTk5fVFlQRV9MMkNBUF9MRToKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogdHlwZT1CVEFfSlZfQ09OTl9UWVBFX0wyQ0FQX0xFLiBwc209IiA8PCBzY247Ci0gICAgICBMMkNBX0ZyZWVMZVBTTShzY24pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9zdGFydF9kaXNjb3ZlcnlfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgQ2FsbGJhY2sgZm9yIFN0YXJ0IERpc2NvdmVyeQotICoKLSAqIFJldHVybnMgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9zdGFydF9kaXNjb3ZlcnlfY2JhY2sodFNEUF9SRVNVTFQgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzOwotICB1aW50MzJfdCogcF9yZmNvbW1fc2xvdF9pZCA9Ci0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdCo+KGNvbnN0X2Nhc3Q8dm9pZCo+KHVzZXJfZGF0YSkpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogcmVzPSIgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQxNl90PihyZXN1bHQpKTsKLQotICBidGFfanZfY2Iuc2RwX2FjdGl2ZSA9IEJUQV9KVl9TRFBfQUNUX05PTkU7Ci0gIGlmIChidGFfanZfY2IucF9kbV9jYmFjaykgewotICAgIHRCVEFfSlZfRElTQ09WRVJZX0NPTVAgZGNvbXA7Ci0gICAgZGNvbXAuc2NuID0gMDsKLSAgICBzdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKLSAgICBpZiAocmVzdWx0ID09IFNEUF9TVUNDRVNTIHx8IHJlc3VsdCA9PSBTRFBfREJfRlVMTCkgewotICAgICAgdFNEUF9ESVNDX1JFQyogcF9zZHBfcmVjID0gTlVMTDsKLSAgICAgIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogYnRhX2p2X2NiLnV1aWQ9IiA8PCBidGFfanZfY2IudXVpZDsKLSAgICAgIHBfc2RwX3JlYyA9IFNEUF9GaW5kU2VydmljZVVVSURJbkRiKHBfYnRhX2p2X2NmZy0+cF9zZHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfanZfY2IudXVpZCwgcF9zZHBfcmVjKTsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogcF9zZHBfcmVjPSIgPDwgcF9zZHBfcmVjOwotICAgICAgaWYgKHBfc2RwX3JlYyAmJgotICAgICAgICAgIFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjKHBfc2RwX3JlYywgVVVJRF9QUk9UT0NPTF9SRkNPTU0sICZwZSkpIHsKLSAgICAgICAgZGNvbXAuc2NuID0gKHVpbnQ4X3QpcGUucGFyYW1zWzBdOwotICAgICAgICBzdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkY29tcC5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgdEJUQV9KViBidGFfanY7Ci0gICAgYnRhX2p2LmRpc2NfY29tcCA9IGRjb21wOwotICAgIGJ0YV9qdl9jYi5wX2RtX2NiYWNrKEJUQV9KVl9ESVNDT1ZFUllfQ09NUF9FVlQsICZidGFfanYsICpwX3JmY29tbV9zbG90X2lkKTsKLSAgICBvc2lfZnJlZShwX3JmY29tbV9zbG90X2lkKTsKLSAgfQotfQotCi0vKiBEaXNjb3ZlcnMgc2VydmljZXMgb24gYSByZW1vdGUgZGV2aWNlICovCi12b2lkIGJ0YV9qdl9zdGFydF9kaXNjb3ZlcnkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbnVtX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpVdWlkKiB1dWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogaW4sIHNkcF9hY3RpdmU9IiA8PCBidGFfanZfY2Iuc2RwX2FjdGl2ZTsKLSAgaWYgKGJ0YV9qdl9jYi5zZHBfYWN0aXZlICE9IEJUQV9KVl9TRFBfQUNUX05PTkUpIHsKLSAgICAvKiBTRFAgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgKi8KLSAgICBzdGF0dXMgPSBCVEFfSlZfQlVTWTsKLSAgICBpZiAoYnRhX2p2X2NiLnBfZG1fY2JhY2spIHsKLSAgICAgIHRCVEFfSlYgYnRhX2p2OwotICAgICAgYnRhX2p2LnN0YXR1cyA9IHN0YXR1czsKLSAgICAgIGJ0YV9qdl9jYi5wX2RtX2NiYWNrKEJUQV9KVl9ESVNDT1ZFUllfQ09NUF9FVlQsICZidGFfanYsIHJmY29tbV9zbG90X2lkKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogaW5pdCB0aGUgZGF0YWJhc2Uvc2V0IHVwIHRoZSBmaWx0ZXIgKi8KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYWxsIFNEUF9Jbml0RGlzY292ZXJ5RGIsIG51bV91dWlkPSIgPDwgbnVtX3V1aWQ7Ci0gIFNEUF9Jbml0RGlzY292ZXJ5RGIocF9idGFfanZfY2ZnLT5wX3NkcF9kYiwgcF9idGFfanZfY2ZnLT5zZHBfZGJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBudW1fdXVpZCwgdXVpZF9saXN0LCAwLCBOVUxMKTsKLQotICAvKiB0ZWxsIFNEUCB0byBrZWVwIHRoZSByYXcgZGF0YSAqLwotICBwX2J0YV9qdl9jZmctPnBfc2RwX2RiLT5yYXdfZGF0YSA9IHBfYnRhX2p2X2NmZy0+cF9zZHBfcmF3X2RhdGE7Ci0gIHBfYnRhX2p2X2NmZy0+cF9zZHBfZGItPnJhd19zaXplID0gcF9idGFfanZfY2ZnLT5zZHBfcmF3X3NpemU7Ci0KLSAgYnRhX2p2X2NiLnBfc2VsX3Jhd19kYXRhID0gMDsKLSAgYnRhX2p2X2NiLnV1aWQgPSB1dWlkX2xpc3RbMF07Ci0KLSAgYnRhX2p2X2NiLnNkcF9hY3RpdmUgPSBCVEFfSlZfU0RQX0FDVF9ZRVM7Ci0KLSAgdWludDMyX3QqIHJmY29tbV9zbG90X2lkX2NvcHkgPSAodWludDMyX3QqKW9zaV9tYWxsb2Moc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICpyZmNvbW1fc2xvdF9pZF9jb3B5ID0gcmZjb21tX3Nsb3RfaWQ7Ci0KLSAgaWYgKCFTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QyKGJkX2FkZHIsIHBfYnRhX2p2X2NmZy0+cF9zZHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfanZfc3RhcnRfZGlzY292ZXJ5X2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKXJmY29tbV9zbG90X2lkX2NvcHkpKSB7Ci0gICAgYnRhX2p2X2NiLnNkcF9hY3RpdmUgPSBCVEFfSlZfU0RQX0FDVF9OT05FOwotICAgIC8qIGZhaWxlZCB0byBzdGFydCBTRFAuIHJlcG9ydCB0aGUgZmFpbHVyZSByaWdodCBhd2F5ICovCi0gICAgaWYgKGJ0YV9qdl9jYi5wX2RtX2NiYWNrKSB7Ci0gICAgICB0QlRBX0pWIGJ0YV9qdjsKLSAgICAgIGJ0YV9qdi5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICBidGFfanZfY2IucF9kbV9jYmFjayhCVEFfSlZfRElTQ09WRVJZX0NPTVBfRVZULCAmYnRhX2p2LCByZmNvbW1fc2xvdF9pZCk7Ci0gICAgfQotICB9Ci0gIC8qCi0gIGVsc2UgcmVwb3J0IHRoZSByZXN1bHQgd2hlbiB0aGUgY2JhY2sgaXMgY2FsbGVkCi0gICovCi19Ci0KLS8qIENyZWF0ZSBhbiBTRFAgcmVjb3JkIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMgKi8KLXZvaWQgYnRhX2p2X2NyZWF0ZV9yZWNvcmQodWludDMyX3QgcmZjb21tX3Nsb3RfaWQpIHsKLSAgdEJUQV9KVl9DUkVBVEVfUkVDT1JEIGV2dF9kYXRhOwotICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgaWYgKGJ0YV9qdl9jYi5wX2RtX2NiYWNrKSB7Ci0gICAgLy8gY2FsbGJhY2sgaW1tZWRpYXRlbHkgdG8gY3JlYXRlIHRoZSBzZHAgcmVjb3JkIGluIHN0YWNrIHRocmVhZCBjb250ZXh0Ci0gICAgdEJUQV9KViBidGFfanY7Ci0gICAgYnRhX2p2LmNyZWF0ZV9yZWMgPSBldnRfZGF0YTsKLSAgICBidGFfanZfY2IucF9kbV9jYmFjayhCVEFfSlZfQ1JFQVRFX1JFQ09SRF9FVlQsICZidGFfanYsIHJmY29tbV9zbG90X2lkKTsKLSAgfQotfQotCi0vKiBEZWxldGUgYW4gU0RQIHJlY29yZCAqLwotdm9pZCBidGFfanZfZGVsZXRlX3JlY29yZCh1aW50MzJfdCBoYW5kbGUpIHsKLSAgaWYgKGhhbmRsZSkgewotICAgIC8qIHRoaXMgaXMgYSByZWNvcmQgY3JlYXRlZCBieSBidGlmIGxheWVyKi8KLSAgICBTRFBfRGVsZXRlUmVjb3JkKGhhbmRsZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX2p2X2wyY2FwX2NsaWVudF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICBoYW5kbGVzIHRoZSBsMmNhcCBjbGllbnQgZXZlbnRzCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2p2X2wyY2FwX2NsaWVudF9jYmFjayh1aW50MTZfdCBnYXBfaGFuZGxlLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBUF9DQl9EQVRBKiBkYXRhKSB7Ci0gIHRCVEFfSlZfTDJDX0NCKiBwX2NiID0gJmJ0YV9qdl9jYi5sMmNfY2JbZ2FwX2hhbmRsZV07Ci0gIHRCVEFfSlYgZXZ0X2RhdGE7Ci0KLSAgaWYgKGdhcF9oYW5kbGUgPj0gQlRBX0pWX01BWF9MMkNfQ09OTiAmJiAhcF9jYi0+cF9jYmFjaykgcmV0dXJuOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogZ2FwX2hhbmRsZT0iIDw8IGdhcF9oYW5kbGUKLSAgICAgICAgICA8PCAiLCBldnQ9IiA8PCBsb2doZXgoZXZlbnQpOwotICBldnRfZGF0YS5sMmNfb3Blbi5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgZXZ0X2RhdGEubDJjX29wZW4uaGFuZGxlID0gZ2FwX2hhbmRsZTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBHQVBfRVZUX0NPTk5fT1BFTkVEOgotICAgICAgZXZ0X2RhdGEubDJjX29wZW4ucmVtX2JkYSA9ICpHQVBfQ29ubkdldFJlbW90ZUFkZHIoZ2FwX2hhbmRsZSk7Ci0gICAgICBldnRfZGF0YS5sMmNfb3Blbi50eF9tdHUgPSBHQVBfQ29ubkdldFJlbU10dVNpemUoZ2FwX2hhbmRsZSk7Ci0gICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9KVl9TVF9DTF9PUEVOOwotICAgICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfTDJDQVBfT1BFTl9FVlQsICZldnRfZGF0YSwgcF9jYi0+bDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVBfRVZUX0NPTk5fQ0xPU0VEOgotICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfSlZfU1RfTk9ORTsKLSAgICAgIGJ0YV9qdl9mcmVlX3NlY19pZCgmcF9jYi0+c2VjX2lkKTsKLSAgICAgIGV2dF9kYXRhLmwyY19jbG9zZS5hc3luYyA9IHRydWU7Ci0gICAgICBwX2NiLT5wX2NiYWNrKEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQsICZldnRfZGF0YSwgcF9jYi0+bDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIHBfY2ItPnBfY2JhY2sgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBUF9FVlRfQ09OTl9EQVRBX0FWQUlMOgotICAgICAgZXZ0X2RhdGEuZGF0YV9pbmQuaGFuZGxlID0gZ2FwX2hhbmRsZTsKLSAgICAgIC8qIFJlc2V0IGlkbGUgdGltZXIgdG8gYXZvaWQgcmVxdWVzdGluZyBzbmlmZiBtb2RlIHdoaWxlIHJlY2VpdmluZyBkYXRhICovCi0gICAgICBidGFfanZfcG1fY29ubl9idXN5KHBfY2ItPnBfcG1fY2IpOwotICAgICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfTDJDQVBfREFUQV9JTkRfRVZULCAmZXZ0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBfY2ItPmwyY2FwX3NvY2tldF9pZCk7Ci0gICAgICBidGFfanZfcG1fY29ubl9pZGxlKHBfY2ItPnBfcG1fY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBUF9FVlRfVFhfRU1QVFk6Ci0gICAgICBidGFfanZfcG1fY29ubl9pZGxlKHBfY2ItPnBfcG1fY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBUF9FVlRfQ09OTl9DT05HRVNURUQ6Ci0gICAgY2FzZSBHQVBfRVZUX0NPTk5fVU5DT05HRVNURUQ6Ci0gICAgICBwX2NiLT5jb25nID0gKGV2ZW50ID09IEdBUF9FVlRfQ09OTl9DT05HRVNURUQpID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgZXZ0X2RhdGEubDJjX2NvbmcuY29uZyA9IHBfY2ItPmNvbmc7Ci0gICAgICBwX2NiLT5wX2NiYWNrKEJUQV9KVl9MMkNBUF9DT05HX0VWVCwgJmV2dF9kYXRhLCBwX2NiLT5sMmNhcF9zb2NrZXRfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogbWFrZXMgYW4gbDJjYXAgY2xpZW50IGNvbm5lY3Rpb24gKi8KLXZvaWQgYnRhX2p2X2wyY2FwX2Nvbm5lY3QoaW50MzJfdCB0eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlbW90ZV9wc20sIHVpbnQxNl90IHJ4X210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0NGR19JTkZPPiBjZmdfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0TDJDQVBfRVJUTV9JTkZPPiBlcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCkgewotICB1aW50MTZfdCBoYW5kbGUgPSBHQVBfSU5WQUxJRF9IQU5ETEU7Ci0KLSAgdEwyQ0FQX0NGR19JTkZPIGNmZzsKLSAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZih0TDJDQVBfQ0ZHX0lORk8pKTsKLSAgaWYgKGNmZ19wYXJhbSkgewotICAgIGNmZyA9ICpjZmdfcGFyYW07Ci0gIH0KLQotICAvKiBXZSBuZWVkIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBNVFUgdG8gYmUgYWJsZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgY2ZnIGlzCi0gICAqIG5vdCBzZXQgaW4gcmVxLiAqLwotICBjZmcubXR1X3ByZXNlbnQgPSB0cnVlOwotICBjZmcubXR1ID0gcnhfbXR1OwotCi0gIHVpbnQ4X3Qgc2VjX2lkID0gYnRhX2p2X2FsbG9jX3NlY19pZCgpOwotICB0QlRBX0pWX0wyQ0FQX0NMX0lOSVQgZXZ0X2RhdGE7Ci0gIGV2dF9kYXRhLnNlY19pZCA9IHNlY19pZDsKLSAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0KLSAgaWYgKHNlY19pZCkgewotICAgIC8qIFBTTSBjaGVja2luZyBpcyBub3QgcmVxdWlyZWQgZm9yIExFIENPQyAqLwotICAgIGlmICgodHlwZSAhPSBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQKSB8fAotICAgICAgICAoYnRhX2p2X2NoZWNrX3BzbShyZW1vdGVfcHNtKSkpIC8qIGFsbG93ZWQgKi8KLSAgICB7Ci0gICAgICB1aW50MTZfdCBtYXhfbXBzID0gMHhmZmZmOyAgLy8gTGV0IEdBUF9Db25uT3BlbiBzZXQgdGhlIG1heF9tcHMuCi0gICAgICBoYW5kbGUgPSBHQVBfQ29ubk9wZW4oIiIsIHNlY19pZCwgMCwgJnBlZXJfYmRfYWRkciwgcmVtb3RlX3BzbSwgbWF4X21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2ZnLCBlcnRtX2luZm8uZ2V0KCksIHNlY19tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9qdl9sMmNhcF9jbGllbnRfY2JhY2ssIHR5cGUpOwotICAgICAgaWYgKGhhbmRsZSAhPSBHQVBfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgICAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGV2dF9kYXRhLnN0YXR1cyA9PSBCVEFfSlZfU1VDQ0VTUykgewotICAgIHRCVEFfSlZfTDJDX0NCKiBwX2NiOwotICAgIHBfY2IgPSAmYnRhX2p2X2NiLmwyY19jYltoYW5kbGVdOwotICAgIHBfY2ItPmhhbmRsZSA9IGhhbmRsZTsKLSAgICBwX2NiLT5wX2NiYWNrID0gcF9jYmFjazsKLSAgICBwX2NiLT5sMmNhcF9zb2NrZXRfaWQgPSBsMmNhcF9zb2NrZXRfaWQ7Ci0gICAgcF9jYi0+cHNtID0gMDsgLyogbm90IGEgc2VydmVyICovCi0gICAgcF9jYi0+c2VjX2lkID0gc2VjX2lkOwotICAgIHBfY2ItPnN0YXRlID0gQlRBX0pWX1NUX0NMX09QRU5JTkc7Ci0gIH0gZWxzZSB7Ci0gICAgYnRhX2p2X2ZyZWVfc2VjX2lkKCZzZWNfaWQpOwotICB9Ci0KLSAgZXZ0X2RhdGEuaGFuZGxlID0gaGFuZGxlOwotICBpZiAocF9jYmFjaykgewotICAgIHRCVEFfSlYgYnRhX2p2OwotICAgIGJ0YV9qdi5sMmNfY2xfaW5pdCA9IGV2dF9kYXRhOwotICAgIHBfY2JhY2soQlRBX0pWX0wyQ0FQX0NMX0lOSVRfRVZULCAmYnRhX2p2LCBsMmNhcF9zb2NrZXRfaWQpOwotICB9Ci19Ci0KLS8qKiBDbG9zZSBhbiBMMkNBUCBjbGllbnQgY29ubmVjdGlvbiAqLwotdm9pZCBidGFfanZfbDJjYXBfY2xvc2UodWludDMyX3QgaGFuZGxlLCB0QlRBX0pWX0wyQ19DQiogcF9jYikgewotICB0QlRBX0pWX0wyQ0FQX0NMT1NFIGV2dF9kYXRhOwotICB0QlRBX0pWX0wyQ0FQX0NCQUNLKiBwX2NiYWNrID0gcF9jYi0+cF9jYmFjazsKLSAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkID0gcF9jYi0+bDJjYXBfc29ja2V0X2lkOwotCi0gIGV2dF9kYXRhLmhhbmRsZSA9IGhhbmRsZTsKLSAgZXZ0X2RhdGEuc3RhdHVzID0gYnRhX2p2X2ZyZWVfbDJjX2NiKHBfY2IpOwotICBldnRfZGF0YS5hc3luYyA9IGZhbHNlOwotCi0gIGlmIChwX2NiYWNrKSB7Ci0gICAgdEJUQV9KViBidGFfanY7Ci0gICAgYnRhX2p2LmwyY19jbG9zZSA9IGV2dF9kYXRhOwotICAgIHBfY2JhY2soQlRBX0pWX0wyQ0FQX0NMT1NFX0VWVCwgJmJ0YV9qdiwgbDJjYXBfc29ja2V0X2lkKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2p2X2wyY2FwX3NlcnZlcl9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaGFuZGxlcyB0aGUgbDJjYXAgc2VydmVyIGNhbGxiYWNrCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9sMmNhcF9zZXJ2ZXJfY2JhY2sodWludDE2X3QgZ2FwX2hhbmRsZSwgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVBfQ0JfREFUQSogZGF0YSkgewotICB0QlRBX0pWX0wyQ19DQiogcF9jYiA9ICZidGFfanZfY2IubDJjX2NiW2dhcF9oYW5kbGVdOwotICB0QlRBX0pWIGV2dF9kYXRhOwotICB0QlRBX0pWX0wyQ0FQX0NCQUNLKiBwX2NiYWNrOwotICB1aW50MzJfdCBzb2NrZXRfaWQ7Ci0KLSAgaWYgKGdhcF9oYW5kbGUgPj0gQlRBX0pWX01BWF9MMkNfQ09OTiAmJiAhcF9jYi0+cF9jYmFjaykgcmV0dXJuOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogZ2FwX2hhbmRsZT0iIDw8IGdhcF9oYW5kbGUKLSAgICAgICAgICA8PCAiLCBldnQ9IiA8PCBsb2doZXgoZXZlbnQpOwotICBldnRfZGF0YS5sMmNfb3Blbi5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgZXZ0X2RhdGEubDJjX29wZW4uaGFuZGxlID0gZ2FwX2hhbmRsZTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBHQVBfRVZUX0NPTk5fT1BFTkVEOgotICAgICAgZXZ0X2RhdGEubDJjX29wZW4ucmVtX2JkYSA9ICpHQVBfQ29ubkdldFJlbW90ZUFkZHIoZ2FwX2hhbmRsZSk7Ci0gICAgICBldnRfZGF0YS5sMmNfb3Blbi50eF9tdHUgPSBHQVBfQ29ubkdldFJlbU10dVNpemUoZ2FwX2hhbmRsZSk7Ci0gICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9KVl9TVF9TUl9PUEVOOwotICAgICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfTDJDQVBfT1BFTl9FVlQsICZldnRfZGF0YSwgcF9jYi0+bDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVBfRVZUX0NPTk5fQ0xPU0VEOgotICAgICAgZXZ0X2RhdGEubDJjX2Nsb3NlLmFzeW5jID0gdHJ1ZTsKLSAgICAgIGV2dF9kYXRhLmwyY19jbG9zZS5oYW5kbGUgPSBwX2NiLT5oYW5kbGU7Ci0gICAgICBwX2NiYWNrID0gcF9jYi0+cF9jYmFjazsKLSAgICAgIHNvY2tldF9pZCA9IHBfY2ItPmwyY2FwX3NvY2tldF9pZDsKLSAgICAgIGV2dF9kYXRhLmwyY19jbG9zZS5zdGF0dXMgPSBidGFfanZfZnJlZV9sMmNfY2IocF9jYik7Ci0gICAgICBwX2NiYWNrKEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQsICZldnRfZGF0YSwgc29ja2V0X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVBfRVZUX0NPTk5fREFUQV9BVkFJTDoKLSAgICAgIGV2dF9kYXRhLmRhdGFfaW5kLmhhbmRsZSA9IGdhcF9oYW5kbGU7Ci0gICAgICAvKiBSZXNldCBpZGxlIHRpbWVyIHRvIGF2b2lkIHJlcXVlc3Rpbmcgc25pZmYgbW9kZSB3aGlsZSByZWNlaXZpbmcgZGF0YSAqLwotICAgICAgYnRhX2p2X3BtX2Nvbm5fYnVzeShwX2NiLT5wX3BtX2NiKTsKLSAgICAgIHBfY2ItPnBfY2JhY2soQlRBX0pWX0wyQ0FQX0RBVEFfSU5EX0VWVCwgJmV2dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICBwX2NiLT5sMmNhcF9zb2NrZXRfaWQpOwotICAgICAgYnRhX2p2X3BtX2Nvbm5faWRsZShwX2NiLT5wX3BtX2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVBfRVZUX1RYX0VNUFRZOgotICAgICAgYnRhX2p2X3BtX2Nvbm5faWRsZShwX2NiLT5wX3BtX2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVBfRVZUX0NPTk5fQ09OR0VTVEVEOgotICAgIGNhc2UgR0FQX0VWVF9DT05OX1VOQ09OR0VTVEVEOgotICAgICAgcF9jYi0+Y29uZyA9IChldmVudCA9PSBHQVBfRVZUX0NPTk5fQ09OR0VTVEVEKSA/IHRydWUgOiBmYWxzZTsKLSAgICAgIGV2dF9kYXRhLmwyY19jb25nLmNvbmcgPSBwX2NiLT5jb25nOwotICAgICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfTDJDQVBfQ09OR19FVlQsICZldnRfZGF0YSwgcF9jYi0+bDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKiBzdGFydHMgYW4gTDJDQVAgc2VydmVyICovCi12b2lkIGJ0YV9qdl9sMmNhcF9zdGFydF9zZXJ2ZXIoaW50MzJfdCB0eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JPTEUgcm9sZSwgdWludDE2X3QgbG9jYWxfcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJ4X210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0NGR19JTkZPPiBjZmdfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9FUlRNX0lORk8+IGVydG1faW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCkgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHRCVEFfSlZfTDJDQVBfU1RBUlQgZXZ0X2RhdGE7Ci0KLSAgdEwyQ0FQX0NGR19JTkZPIGNmZzsKLSAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZih0TDJDQVBfQ0ZHX0lORk8pKTsKLSAgaWYgKGNmZ19wYXJhbSkgewotICAgIGNmZyA9ICpjZmdfcGFyYW07Ci0gIH0KLQotICAvLyBGSVg6IE1UVT0wIG1lYW5zIG5vdCBwcmVzZW50Ci0gIGlmIChyeF9tdHUgPiAwKSB7Ci0gICAgY2ZnLm10dV9wcmVzZW50ID0gdHJ1ZTsKLSAgICBjZmcubXR1ID0gcnhfbXR1OwotICB9IGVsc2UgewotICAgIGNmZy5tdHVfcHJlc2VudCA9IGZhbHNlOwotICAgIGNmZy5tdHUgPSAwOwotICB9Ci0KLSAgdWludDhfdCBzZWNfaWQgPSBidGFfanZfYWxsb2Nfc2VjX2lkKCk7Ci0gIHVpbnQxNl90IG1heF9tcHMgPSAweGZmZmY7ICAvLyBMZXQgR0FQX0Nvbm5PcGVuIHNldCB0aGUgbWF4X21wcy4KLSAgLyogUFNNIGNoZWNraW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgTEUgQ09DICovCi0gIGlmICgwID09IHNlY19pZCB8fAotICAgICAgKCh0eXBlID09IEJUQV9KVl9DT05OX1RZUEVfTDJDQVApICYmICghYnRhX2p2X2NoZWNrX3BzbShsb2NhbF9wc20pKSkgfHwKLSAgICAgIChoYW5kbGUgPSBHQVBfQ29ubk9wZW4oIkpWIEwyQ0FQIiwgc2VjX2lkLCAxLCBudWxscHRyLCBsb2NhbF9wc20sIG1heF9tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZmcsIGVydG1faW5mby5nZXQoKSwgc2VjX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9qdl9sMmNhcF9zZXJ2ZXJfY2JhY2ssIHR5cGUpKSA9PQotICAgICAgICAgIEdBUF9JTlZBTElEX0hBTkRMRSkgewotICAgIGJ0YV9qdl9mcmVlX3NlY19pZCgmc2VjX2lkKTsKLSAgICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKLSAgfSBlbHNlIHsKLSAgICB0QlRBX0pWX0wyQ19DQiogcF9jYiA9ICZidGFfanZfY2IubDJjX2NiW2hhbmRsZV07Ci0gICAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgZXZ0X2RhdGEuaGFuZGxlID0gaGFuZGxlOwotICAgIGV2dF9kYXRhLnNlY19pZCA9IHNlY19pZDsKLSAgICBwX2NiLT5wX2NiYWNrID0gcF9jYmFjazsKLSAgICBwX2NiLT5sMmNhcF9zb2NrZXRfaWQgPSBsMmNhcF9zb2NrZXRfaWQ7Ci0gICAgcF9jYi0+aGFuZGxlID0gaGFuZGxlOwotICAgIHBfY2ItPnNlY19pZCA9IHNlY19pZDsKLSAgICBwX2NiLT5zdGF0ZSA9IEJUQV9KVl9TVF9TUl9MSVNURU47Ci0gICAgcF9jYi0+cHNtID0gbG9jYWxfcHNtOwotICB9Ci0KLSAgaWYgKHBfY2JhY2spIHsKLSAgICB0QlRBX0pWIGJ0YV9qdjsKLSAgICBidGFfanYubDJjX3N0YXJ0ID0gZXZ0X2RhdGE7Ci0gICAgcF9jYmFjayhCVEFfSlZfTDJDQVBfU1RBUlRfRVZULCAmYnRhX2p2LCBsMmNhcF9zb2NrZXRfaWQpOwotICB9Ci19Ci0KLS8qIHN0b3BzIGFuIEwyQ0FQIHNlcnZlciAqLwotdm9pZCBidGFfanZfbDJjYXBfc3RvcF9zZXJ2ZXIodWludDE2X3QgbG9jYWxfcHNtLCB1aW50MzJfdCBsMmNhcF9zb2NrZXRfaWQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfSlZfTUFYX0wyQ19DT05OOyBpKyspIHsKLSAgICBpZiAoYnRhX2p2X2NiLmwyY19jYltpXS5sMmNhcF9zb2NrZXRfaWQgPT0gbDJjYXBfc29ja2V0X2lkKSB7Ci0gICAgICB0QlRBX0pWX0wyQ19DQiogcF9jYiA9ICZidGFfanZfY2IubDJjX2NiW2ldOwotICAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyogcF9jYmFjayA9IHBfY2ItPnBfY2JhY2s7Ci0gICAgICB0QlRBX0pWX0wyQ0FQX0NMT1NFIGV2dF9kYXRhOwotICAgICAgZXZ0X2RhdGEuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwotICAgICAgZXZ0X2RhdGEuc3RhdHVzID0gYnRhX2p2X2ZyZWVfbDJjX2NiKHBfY2IpOwotICAgICAgZXZ0X2RhdGEuYXN5bmMgPSBmYWxzZTsKLSAgICAgIGlmIChwX2NiYWNrKSB7Ci0gICAgICAgIHRCVEFfSlYgYnRhX2p2OwotICAgICAgICBidGFfanYubDJjX2Nsb3NlID0gZXZ0X2RhdGE7Ci0gICAgICAgIHBfY2JhY2soQlRBX0pWX0wyQ0FQX0NMT1NFX0VWVCwgJmJ0YV9qdiwgbDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKiBXcml0ZSBkYXRhIHRvIGFuIEwyQ0FQIGNvbm5lY3Rpb24gKi8KLXZvaWQgYnRhX2p2X2wyY2FwX3dyaXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLCBCVF9IRFIqIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQsIHRCVEFfSlZfTDJDX0NCKiBwX2NiKSB7Ci0gIC8qIEFzIHdlIGNoZWNrIHRoaXMgY2FsbGJhY2sgZXhpc3RzIGJlZm9yZSB0aGUgdEJUQV9KVl9BUElfTDJDQVBfV1JJVEUgY2FuIGJlCi0gICAqIHNlbmQgdGhyb3VnaCB0aGUgQVBJIHRoaXMgY2hlY2sgc2hvdWxkIG5vdCBiZSBuZWVkZWQuIEJ1dCB0aGUgQVBJIGlzIG5vdAotICAgKiBkZXNpZ25lZCB0byBiZSB1c2VkIChzYWZlbHkgYXQgbGVhc3QpIGluIGEgbXVsdGktdGhyZWFkZWQgc2NoZWR1bGVyLCBoZW5jZQotICAgKiBpZiB0aGUgcGVlciBkZXZpY2UgZGlzY29ubmVjdHMgdGhlIGwyY2FwIGxpbmsgYWZ0ZXIgdGhlIEFQSSBpcyBjYWxsZWQsIGJ1dAotICAgKiBiZWZvcmUgdGhpcyBtZXNzYWdlIGlzIGhhbmRsZWQsIHRoZSAtPnBfY2JhY2sgd2lsbCBiZSBjbGVhcmVkIGF0IHRoaXMKLSAgICogcG9pbnQuIEF0IGZpcnN0IGdsYW5jaCB0aGlzIHNlZW1zIGhpZ2hseSB1bmxpa2VseSwgYnV0IGZvciBhbGwKLSAgICogb2JleC1wcm9maWxlcyB3aXRoIHR3byBjaGFubmVscyBjb25uZWN0ZWQgLSBlLmcuIE1BUCwgdGhpcyBoYXBwZW5zIGFyb3VuZCAxCi0gICAqIG9mIDQgZGlzY29ubmVjdHMsIGFzIGEgZGlzY29ubmVjdCBvbiB0aGUgc2VydmVyIGNoYW5uZWwgY2F1c2VzIGEgZGlzY29ubmVjdAotICAgKiB0byBiZSBzZW5kIG9uIHRoZSBjbGllbnQgKG5vdGlmaWNhdGlvbikgY2hhbm5lbCwgYnV0IGF0IHRoZSBwZWVyIHR5cGljYWxseQotICAgKiBkaXNjb25uZWN0cyBib3RoIHRoZSBPQkVYIGRpc2Nvbm5lY3QgcmVxdWVzdCBjcm9zc2VzIHRoZSBpbmNvbWluZyBsMmNhcAotICAgKiBkaXNjb25uZWN0LiBJZiBwX2NiYWNrIGlzIGNsZWFyZWQsIHdlIHNpbXBseSBkaXNjYXJkIHRoZSBkYXRhLiBSSVNLOiBUaGUKLSAgICogY2FsbGVyIG11c3QgaGFuZGxlIGFueSBjbGVhbnVwIGJhc2VkIG9uIGFub3RoZXIgc2lnbmFsIHRoYW4KLSAgICogQlRBX0pWX0wyQ0FQX1dSSVRFX0VWVCwgd2hpY2ggaXMgdHlwaWNhbGx5IG5vdCBwb3NzaWJsZSwgYXMgdGhlIHBvaW50ZXIgdG8KLSAgICogdGhlIGFsbG9jYXRlZCBidWZmZXIgaXMgc3RvcmVkIGluIHRoaXMgbWVzc2FnZSwgYW5kIGNhbiB0aGVyZWZvcmUgbm90IGJlCi0gICAqIGZyZWVkLCBoZW5jZSB3ZSBoYXZlIGEgbWVtLWxlYWstYnktZGVzaWduLiovCi0gIGlmICghcF9jYi0+cF9jYmFjaykgewotICAgIC8qIEFzIHRoaXMgcG9pbnRlciBpcyBjaGVja2VkIGluIHRoZSBBUEkgZnVuY3Rpb24sIHRoaXMgb2NjdXJzIG9ubHkgd2hlbiB0aGUKLSAgICAgKiBjaGFubmVsIGlzIGRpc2Nvbm5lY3RlZCBhZnRlciB0aGUgQVBJIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYnV0IGJlZm9yZSB0aGUKLSAgICAgKiBtZXNzYWdlIGlzIGhhbmRsZWQuICovCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwX2NiLT5wX2NiYWNrID09IE5VTEwiOwotICAgIG9zaV9mcmVlKG1zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9KVl9MMkNBUF9XUklURSBldnRfZGF0YTsKLSAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gIGV2dF9kYXRhLmhhbmRsZSA9IGhhbmRsZTsKLSAgZXZ0X2RhdGEucmVxX2lkID0gcmVxX2lkOwotICBldnRfZGF0YS5jb25nID0gcF9jYi0+Y29uZzsKLSAgZXZ0X2RhdGEubGVuID0gbXNnLT5sZW47Ci0KLSAgYnRhX2p2X3BtX2Nvbm5fYnVzeShwX2NiLT5wX3BtX2NiKTsKLQotICAvLyBUT0RPOiB0aGlzIHdhcyBzZXQgb25seSBmb3Igbm9uLWZpeGVkIGNoYW5uZWwgcGFja2V0cy4gSXMgdGhhdCBuZWVkZWQgPwotICBtc2ctPmV2ZW50ID0gQlRfRVZUX1RPX0JUVV9TUF9EQVRBOwotCi0gIGlmIChldnRfZGF0YS5jb25nKSB7Ci0gICAgb3NpX2ZyZWUobXNnKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoR0FQX0Nvbm5Xcml0ZURhdGEoaGFuZGxlLCBtc2cpID09IEJUX1BBU1MpCi0gICAgICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgfQotCi0gIHRCVEFfSlYgYnRhX2p2OwotICBidGFfanYubDJjX3dyaXRlID0gZXZ0X2RhdGE7Ci0gIHBfY2ItPnBfY2JhY2soQlRBX0pWX0wyQ0FQX1dSSVRFX0VWVCwgJmJ0YV9qdiwgdXNlcl9pZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9wb3J0X2RhdGFfY29fY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgcG9ydCBkYXRhIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHJmY29tbQotICogICAgICAgICAgICAgIGNvbm5lY3Rpb25zCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBidGFfanZfcG9ydF9kYXRhX2NvX2NiYWNrKHVpbnQxNl90IHBvcnRfaGFuZGxlLCB1aW50OF90KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBpbnQgdHlwZSkgewotICB0QlRBX0pWX1JGQ19DQiogcF9jYiA9IGJ0YV9qdl9yZmNfcG9ydF90b19jYihwb3J0X2hhbmRsZSk7Ci0gIHRCVEFfSlZfUENCKiBwX3BjYiA9IGJ0YV9qdl9yZmNfcG9ydF90b19wY2IocG9ydF9oYW5kbGUpOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHBfY2I9IiA8PCBwX2NiIDw8ICIsIHBfcGNiPSIgPDwgcF9wY2IKLSAgICAgICAgICA8PCAiLCBsZW49IiA8PCBsZW4gPDwgIiwgdHlwZT0iIDw8IHR5cGU7Ci0gIGlmIChwX3BjYiAhPSBOVUxMKSB7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICBjYXNlIERBVEFfQ09fQ0FMTEJBQ0tfVFlQRV9JTkNPTUlORzoKLSAgICAgICAgcmV0dXJuIGJ0YV9jb19yZmNfZGF0YV9pbmNvbWluZyhwX3BjYi0+cmZjb21tX3Nsb3RfaWQsIChCVF9IRFIqKWJ1Zik7Ci0gICAgICBjYXNlIERBVEFfQ09fQ0FMTEJBQ0tfVFlQRV9PVVRHT0lOR19TSVpFOgotICAgICAgICByZXR1cm4gYnRhX2NvX3JmY19kYXRhX291dGdvaW5nX3NpemUocF9wY2ItPnJmY29tbV9zbG90X2lkLCAoaW50KilidWYpOwotICAgICAgY2FzZSBEQVRBX0NPX0NBTExCQUNLX1RZUEVfT1VUR09JTkc6Ci0gICAgICAgIHJldHVybiBidGFfY29fcmZjX2RhdGFfb3V0Z29pbmcocF9wY2ItPnJmY29tbV9zbG90X2lkLCBidWYsIGxlbik7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVua25vd24gY2FsbG91dCB0eXBlPSIgPDwgdHlwZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBidGFfanZfcG9ydF9tZ210X2NsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gIGNhbGxiYWNrIGZvciBwb3J0IG1hbWFuZ2VtZW50IGZ1bmN0aW9uIG9mIHJmY29tbQotICogICAgICAgICAgICAgIGNsaWVudCBjb25uZWN0aW9ucwotICoKLSAqIFJldHVybnMgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X21nbXRfY2xfY2JhY2sodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgdEJUQV9KVl9SRkNfQ0IqIHBfY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fY2IocG9ydF9oYW5kbGUpOwotICB0QlRBX0pWX1BDQiogcF9wY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHBvcnRfaGFuZGxlKTsKLSAgdEJUQV9KViBldnRfZGF0YTsKLSAgUmF3QWRkcmVzcyByZW1fYmRhID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICB1aW50MTZfdCBsY2lkOwotICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjazsgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb2RlPSIgPDwgY29kZSA8PCAiLCBwb3J0X2hhbmRsZT0iIDw8IHBvcnRfaGFuZGxlOwotICBpZiAoTlVMTCA9PSBwX2NiIHx8IE5VTEwgPT0gcF9jYi0+cF9jYmFjaykgcmV0dXJuOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogY29kZT0iIDw8IGNvZGUgPDwgIiwgcG9ydF9oYW5kbGU9IiA8PCBwb3J0X2hhbmRsZQotICAgICAgICAgIDw8ICIsIGhhbmRsZT0iIDw8IHBfY2ItPmhhbmRsZTsKLQotICBQT1JUX0NoZWNrQ29ubmVjdGlvbihwb3J0X2hhbmRsZSwgJnJlbV9iZGEsICZsY2lkKTsKLQotICBpZiAoY29kZSA9PSBQT1JUX1NVQ0NFU1MpIHsKLSAgICBldnRfZGF0YS5yZmNfb3Blbi5oYW5kbGUgPSBwX2NiLT5oYW5kbGU7Ci0gICAgZXZ0X2RhdGEucmZjX29wZW4uc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgZXZ0X2RhdGEucmZjX29wZW4ucmVtX2JkYSA9IHJlbV9iZGE7Ci0gICAgcF9wY2ItPnN0YXRlID0gQlRBX0pWX1NUX0NMX09QRU47Ci0gICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfUkZDT01NX09QRU5fRVZULCAmZXZ0X2RhdGEsIHBfcGNiLT5yZmNvbW1fc2xvdF9pZCk7Ci0gIH0gZWxzZSB7Ci0gICAgZXZ0X2RhdGEucmZjX2Nsb3NlLmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKLSAgICBldnRfZGF0YS5yZmNfY2xvc2Uuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gICAgZXZ0X2RhdGEucmZjX2Nsb3NlLnBvcnRfc3RhdHVzID0gY29kZTsKLSAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSB0cnVlOwotICAgIGlmIChwX3BjYi0+c3RhdGUgPT0gQlRBX0pWX1NUX0NMX0NMT1NJTkcpIHsKLSAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5hc3luYyA9IGZhbHNlOwotICAgIH0KLSAgICAvLyBwX3BjYi0+c3RhdGUgPSBCVEFfSlZfU1RfTk9ORTsKLSAgICAvLyBwX3BjYi0+Y29uZyA9IGZhbHNlOwotICAgIHBfY2JhY2sgPSBwX2NiLT5wX2NiYWNrOwotICAgIHBfY2JhY2soQlRBX0pWX1JGQ09NTV9DTE9TRV9FVlQsICZldnRfZGF0YSwgcF9wY2ItPnJmY29tbV9zbG90X2lkKTsKLSAgICAvLyBidGFfanZfZnJlZV9yZmNfY2IocF9jYiwgcF9wY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9wb3J0X2V2ZW50X2NsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gIENhbGxiYWNrIGZvciBSRkNPTU0gY2xpZW50IHBvcnQgZXZlbnRzCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2p2X3BvcnRfZXZlbnRfY2xfY2JhY2sodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgdEJUQV9KVl9SRkNfQ0IqIHBfY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fY2IocG9ydF9oYW5kbGUpOwotICB0QlRBX0pWX1BDQiogcF9wY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHBvcnRfaGFuZGxlKTsKLSAgdEJUQV9KViBldnRfZGF0YTsKLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHBvcnRfaGFuZGxlPSIgPDwgcG9ydF9oYW5kbGU7Ci0gIGlmIChOVUxMID09IHBfY2IgfHwgTlVMTCA9PSBwX2NiLT5wX2NiYWNrKSByZXR1cm47Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb2RlPSIgPDwgbG9naGV4KGNvZGUpCi0gICAgICAgICAgPDwgIiwgcG9ydF9oYW5kbGU9IiA8PCBwb3J0X2hhbmRsZSA8PCAiLCBoYW5kbGU9IiA8PCBwX2NiLT5oYW5kbGU7Ci0gIGlmIChjb2RlICYgUE9SVF9FVl9SWENIQVIpIHsKLSAgICBldnRfZGF0YS5kYXRhX2luZC5oYW5kbGUgPSBwX2NiLT5oYW5kbGU7Ci0gICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfUkZDT01NX0RBVEFfSU5EX0VWVCwgJmV2dF9kYXRhLCBwX3BjYi0+cmZjb21tX3Nsb3RfaWQpOwotICB9Ci0KLSAgaWYgKGNvZGUgJiBQT1JUX0VWX0ZDKSB7Ci0gICAgcF9wY2ItPmNvbmcgPSAoY29kZSAmIFBPUlRfRVZfRkNTKSA/IGZhbHNlIDogdHJ1ZTsKLSAgICBldnRfZGF0YS5yZmNfY29uZy5jb25nID0gcF9wY2ItPmNvbmc7Ci0gICAgZXZ0X2RhdGEucmZjX2NvbmcuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwotICAgIGV2dF9kYXRhLnJmY19jb25nLnN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwotICAgIHBfY2ItPnBfY2JhY2soQlRBX0pWX1JGQ09NTV9DT05HX0VWVCwgJmV2dF9kYXRhLCBwX3BjYi0+cmZjb21tX3Nsb3RfaWQpOwotICB9Ci0KLSAgaWYgKGNvZGUgJiBQT1JUX0VWX1RYRU1QVFkpIHsKLSAgICBidGFfanZfcG1fY29ubl9pZGxlKHBfcGNiLT5wX3BtX2NiKTsKLSAgfQotfQotCi0vKiBDbGllbnQgaW5pdGlhdGVzIGFuIFJGQ09NTSBjb25uZWN0aW9uICovCi12b2lkIGJ0YV9qdl9yZmNvbW1fY29ubmVjdCh0QlRBX1NFQyBzZWNfbWFzaywgdWludDhfdCByZW1vdGVfc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICB1aW50MTZfdCBoYW5kbGUgPSAwOwotICB1aW50MzJfdCBldmVudF9tYXNrID0gQlRBX0pWX1JGQ19FVl9NQVNLOwotICB0UE9SVF9TVEFURSBwb3J0X3N0YXRlOwotCi0gIHRCVEFfSlZfUkZDT01NX0NMX0lOSVQgZXZ0X2RhdGE7Ci0gIG1lbXNldCgmZXZ0X2RhdGEsIDAsIHNpemVvZihldnRfZGF0YSkpOwotICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgaWYgKGV2dF9kYXRhLnN0YXR1cyA9PSBCVEFfSlZfU1VDQ0VTUyAmJgotICAgICAgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb25XaXRoU2VjdXJpdHkoCi0gICAgICAgICAgVVVJRF9TRVJWQ0xBU1NfU0VSSUFMX1BPUlQsIHJlbW90ZV9zY24sIGZhbHNlLCBCVEFfSlZfREVGX1JGQ19NVFUsCi0gICAgICAgICAgcGVlcl9iZF9hZGRyLCAmaGFuZGxlLCBidGFfanZfcG9ydF9tZ210X2NsX2NiYWNrLAotICAgICAgICAgIHNlY19tYXNrKSAhPSBQT1JUX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uIGZhaWxlZCI7Ci0gICAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gIH0KLSAgaWYgKGV2dF9kYXRhLnN0YXR1cyA9PSBCVEFfSlZfU1VDQ0VTUykgewotICAgIHRCVEFfSlZfUENCKiBwX3BjYjsKLSAgICB0QlRBX0pWX1JGQ19DQiogcF9jYiA9IGJ0YV9qdl9hbGxvY19yZmNfY2IoaGFuZGxlLCAmcF9wY2IpOwotICAgIGlmIChwX2NiKSB7Ci0gICAgICBwX2NiLT5wX2NiYWNrID0gcF9jYmFjazsKLSAgICAgIHBfY2ItPnNjbiA9IDA7Ci0gICAgICBwX3BjYi0+c3RhdGUgPSBCVEFfSlZfU1RfQ0xfT1BFTklORzsKLSAgICAgIHBfcGNiLT5yZmNvbW1fc2xvdF9pZCA9IHJmY29tbV9zbG90X2lkOwotICAgICAgZXZ0X2RhdGEudXNlX2NvID0gdHJ1ZTsKLQotICAgICAgUE9SVF9TZXRFdmVudENhbGxiYWNrKGhhbmRsZSwgYnRhX2p2X3BvcnRfZXZlbnRfY2xfY2JhY2spOwotICAgICAgUE9SVF9TZXRFdmVudE1hc2soaGFuZGxlLCBldmVudF9tYXNrKTsKLSAgICAgIFBPUlRfU2V0RGF0YUNPQ2FsbGJhY2soaGFuZGxlLCBidGFfanZfcG9ydF9kYXRhX2NvX2NiYWNrKTsKLQotICAgICAgUE9SVF9HZXRTdGF0ZShoYW5kbGUsICZwb3J0X3N0YXRlKTsKLQotICAgICAgcG9ydF9zdGF0ZS5mY190eXBlID0gKFBPUlRfRkNfQ1RTX09OX0lOUFVUIHwgUE9SVF9GQ19DVFNfT05fT1VUUFVUKTsKLQotICAgICAgUE9SVF9TZXRTdGF0ZShoYW5kbGUsICZwb3J0X3N0YXRlKTsKLQotICAgICAgZXZ0X2RhdGEuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwotICAgIH0gZWxzZSB7Ci0gICAgICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcnVuIG91dCBvZiByZmMgY29udHJvbCBibG9jayI7Ci0gICAgfQotICB9Ci0gIHRCVEFfSlYgYnRhX2p2OwotICBidGFfanYucmZjX2NsX2luaXQgPSBldnRfZGF0YTsKLSAgcF9jYmFjayhCVEFfSlZfUkZDT01NX0NMX0lOSVRfRVZULCAmYnRhX2p2LCByZmNvbW1fc2xvdF9pZCk7Ci0gIGlmIChidGFfanYucmZjX2NsX2luaXQuc3RhdHVzID09IEJUQV9KVl9GQUlMVVJFKSB7Ci0gICAgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQocmVtb3RlX3Njbik7Ci0gICAgaWYgKGhhbmRsZSkgUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24oaGFuZGxlKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IGZpbmRfcmZjX3BjYih1aW50MzJfdCByZmNvbW1fc2xvdF9pZCwgdEJUQV9KVl9SRkNfQ0IqKiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUENCKiogcGNiKSB7Ci0gICpjYiA9IE5VTEw7Ci0gICpwY2IgPSBOVUxMOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9SRkNfUE9SVFM7IGkrKykgewotICAgIHVpbnQzMl90IHJmY19oYW5kbGUgPSBidGFfanZfY2IucG9ydF9jYltpXS5oYW5kbGUgJiBCVEFfSlZfUkZDX0hETF9NQVNLOwotICAgIHJmY19oYW5kbGUgJj0gfkJUQV9KVl9SRkNPTU1fTUFTSzsKLSAgICBpZiAocmZjX2hhbmRsZSAmJiBidGFfanZfY2IucG9ydF9jYltpXS5yZmNvbW1fc2xvdF9pZCA9PSByZmNvbW1fc2xvdF9pZCkgewotICAgICAgKnBjYiA9ICZidGFfanZfY2IucG9ydF9jYltpXTsKLSAgICAgICpjYiA9ICZidGFfanZfY2IucmZjX2NiW3JmY19oYW5kbGUgLSAxXTsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogRk9VTkQgcmZjX2NiX2hhbmRsZT0iIDw8IGxvZ2hleChyZmNfaGFuZGxlKQotICAgICAgICAgICAgICA8PCAiLCBwb3J0Lmp2X2hhbmRsZT0iIDw8IGxvZ2hleCgoKnBjYiktPmhhbmRsZSkKLSAgICAgICAgICAgICAgPDwgIiwgc3RhdGU9IiA8PCAoKnBjYiktPnN0YXRlCi0gICAgICAgICAgICAgIDw8ICIsIHJmY19jYi0+aGFuZGxlPSIgPDwgbG9naGV4KCgqY2IpLT5oYW5kbGUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0gIFZMT0coMikgPDwgX19mdW5jX18KLSAgICAgICAgICA8PCAiOiBjYW5ub3QgZmluZCByZmNfY2IgZnJvbSB1c2VyIGRhdGE6IiA8PCByZmNvbW1fc2xvdF9pZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENsb3NlIGFuIFJGQ09NTSBjb25uZWN0aW9uICovCi12b2lkIGJ0YV9qdl9yZmNvbW1fY2xvc2UodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBpZiAoIWhhbmRsZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcmZjIGhhbmRsZSBpcyBudWxsIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHJmYyBoYW5kbGU9IiA8PCBoYW5kbGU7Ci0KLSAgdEJUQV9KVl9SRkNfQ0IqIHBfY2IgPSBOVUxMOwotICB0QlRBX0pWX1BDQiogcF9wY2IgPSBOVUxMOwotCi0gIGlmICghZmluZF9yZmNfcGNiKHJmY29tbV9zbG90X2lkLCAmcF9jYiwgJnBfcGNiKSkgcmV0dXJuOwotICBidGFfanZfZnJlZV9yZmNfY2IocF9jYiwgcF9wY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBidGFfanZfcG9ydF9tZ210X3NyX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gIGNhbGxiYWNrIGZvciBwb3J0IG1hbWFuZ2VtZW50IGZ1bmN0aW9uIG9mIHJmY29tbQotICogICAgICAgICAgICAgIHNlcnZlciBjb25uZWN0aW9ucwotICoKLSAqIFJldHVybnMgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9wb3J0X21nbXRfc3JfY2JhY2sodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgdEJUQV9KVl9QQ0IqIHBfcGNiID0gYnRhX2p2X3JmY19wb3J0X3RvX3BjYihwb3J0X2hhbmRsZSk7Ci0gIHRCVEFfSlZfUkZDX0NCKiBwX2NiID0gYnRhX2p2X3JmY19wb3J0X3RvX2NiKHBvcnRfaGFuZGxlKTsKLSAgdEJUQV9KViBldnRfZGF0YTsKLSAgUmF3QWRkcmVzcyByZW1fYmRhID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICB1aW50MTZfdCBsY2lkOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IGNvZGU9IiA8PCBjb2RlIDw8ICIsIHBvcnRfaGFuZGxlPSIgPDwgcG9ydF9oYW5kbGU7Ci0gIGlmIChOVUxMID09IHBfY2IgfHwgTlVMTCA9PSBwX2NiLT5wX2NiYWNrKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwX2NiPSIgPDwgcF9jYgotICAgICAgICAgICAgICAgPDwgIiwgcF9jYi0+cF9jYmFjaz0iIDw8IChwX2NiID8gcF9jYi0+cF9jYmFjayA6IDApOwotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCA9IHBfcGNiLT5yZmNvbW1fc2xvdF9pZDsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb2RlPSIgPDwgY29kZQotICAgICAgICAgIDw8ICIsIHBvcnRfaGFuZGxlPSIgPDwgbG9naGV4KHBvcnRfaGFuZGxlKQotICAgICAgICAgIDw8ICIsIGhhbmRsZT0iIDw8IGxvZ2hleChwX2NiLT5oYW5kbGUpIDw8ICIsIHBfcGNiIiA8PCBwX3BjYgotICAgICAgICAgIDw8ICIsIHVzZXI9IiA8PCBwX3BjYi0+cmZjb21tX3Nsb3RfaWQ7Ci0KLSAgaW50IHN0YXR1cyA9IFBPUlRfQ2hlY2tDb25uZWN0aW9uKHBvcnRfaGFuZGxlLCAmcmVtX2JkYSwgJmxjaWQpOwotICBpbnQgZmFpbGVkID0gdHJ1ZTsKLSAgaWYgKGNvZGUgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgaWYgKHN0YXR1cyAhPSBQT1JUX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogUE9SVF9DaGVja0Nvbm5lY3Rpb24gcmV0dXJuZWQgIiA8PCBzdGF0dXMKLSAgICAgICAgICAgICAgICAgPDwgIiwgYWx0aG91Z2ggcG9ydCBpcyBzdXBwb3NlZCB0byBiZSBjb25uZWN0ZWQiOwotICAgIH0KLSAgICBldnRfZGF0YS5yZmNfc3J2X29wZW4uaGFuZGxlID0gcF9wY2ItPmhhbmRsZTsKLSAgICBldnRfZGF0YS5yZmNfc3J2X29wZW4uc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgZXZ0X2RhdGEucmZjX3Nydl9vcGVuLnJlbV9iZGEgPSByZW1fYmRhOwotICAgIHRCVEFfSlZfUENCKiBwX3BjYl9uZXdfbGlzdGVuID0gYnRhX2p2X2FkZF9yZmNfcG9ydChwX2NiLCBwX3BjYik7Ci0gICAgaWYgKHBfcGNiX25ld19saXN0ZW4pIHsKLSAgICAgIGV2dF9kYXRhLnJmY19zcnZfb3Blbi5uZXdfbGlzdGVuX2hhbmRsZSA9IHBfcGNiX25ld19saXN0ZW4tPmhhbmRsZTsKLSAgICAgIHBfcGNiX25ld19saXN0ZW4tPnJmY29tbV9zbG90X2lkID0KLSAgICAgICAgICBwX2NiLT5wX2NiYWNrKEJUQV9KVl9SRkNPTU1fU1JWX09QRU5fRVZULCAmZXZ0X2RhdGEsIHJmY29tbV9zbG90X2lkKTsKLSAgICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogY3Vycl9zZXNzPSIgPDwgcF9jYi0+Y3Vycl9zZXNzCi0gICAgICAgICAgICAgIDw8ICIsIG1heF9zZXNzPSIgPDwgcF9jYi0+bWF4X3Nlc3M7Ci0gICAgICBmYWlsZWQgPSBmYWxzZTsKLSAgICB9IGVsc2UKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIHRvIGNyZWF0ZSBuZXcgbGlzdGVuIHBvcnQiOwotICB9Ci0gIGlmIChmYWlsZWQpIHsKLSAgICBldnRfZGF0YS5yZmNfY2xvc2UuaGFuZGxlID0gcF9jYi0+aGFuZGxlOwotICAgIGV2dF9kYXRhLnJmY19jbG9zZS5zdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKLSAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSB0cnVlOwotICAgIGV2dF9kYXRhLnJmY19jbG9zZS5wb3J0X3N0YXR1cyA9IGNvZGU7Ci0gICAgcF9wY2ItPmNvbmcgPSBmYWxzZTsKLQotICAgIHRCVEFfSlZfUkZDT01NX0NCQUNLKiBwX2NiYWNrID0gcF9jYi0+cF9jYmFjazsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICA8PCAiOiBQT1JUX0NMT1NFRCBiZWZvcmUgQlRBX0pWX1JGQ09NTV9DTE9TRV9FVlQ6IGN1cnJfc2Vzcz0iCi0gICAgICAgICAgICA8PCBwX2NiLT5jdXJyX3Nlc3MgPDwgIiwgbWF4X3Nlc3M9IiA8PCBwX2NiLT5tYXhfc2VzczsKLSAgICBpZiAoQlRBX0pWX1NUX1NSX0NMT1NJTkcgPT0gcF9wY2ItPnN0YXRlKSB7Ci0gICAgICBldnRfZGF0YS5yZmNfY2xvc2UuYXN5bmMgPSBmYWxzZTsKLSAgICAgIGV2dF9kYXRhLnJmY19jbG9zZS5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgICB9Ci0gICAgLy8gcF9wY2ItPnN0YXRlID0gQlRBX0pWX1NUX05PTkU7Ci0gICAgcF9jYmFjayhCVEFfSlZfUkZDT01NX0NMT1NFX0VWVCwgJmV2dF9kYXRhLCByZmNvbW1fc2xvdF9pZCk7Ci0gICAgLy8gYnRhX2p2X2ZyZWVfcmZjX2NiKHBfY2IsIHBfcGNiKTsKLQotICAgIFZMT0coMikgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICI6IFBPUlRfQ0xPU0VEIGFmdGVyIEJUQV9KVl9SRkNPTU1fQ0xPU0VfRVZUOiBjdXJyX3Nlc3M9IgotICAgICAgICAgICAgPDwgcF9jYi0+Y3Vycl9zZXNzIDw8ICIsIG1heF9zZXNzPSIgPDwgcF9jYi0+bWF4X3Nlc3M7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX2p2X3BvcnRfZXZlbnRfc3JfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgQ2FsbGJhY2sgZm9yIFJGQ09NTSBzZXJ2ZXIgcG9ydCBldmVudHMKLSAqCi0gKiBSZXR1cm5zICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfanZfcG9ydF9ldmVudF9zcl9jYmFjayh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICB0QlRBX0pWX1BDQiogcF9wY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fcGNiKHBvcnRfaGFuZGxlKTsKLSAgdEJUQV9KVl9SRkNfQ0IqIHBfY2IgPSBidGFfanZfcmZjX3BvcnRfdG9fY2IocG9ydF9oYW5kbGUpOwotICB0QlRBX0pWIGV2dF9kYXRhOwotCi0gIGlmIChOVUxMID09IHBfY2IgfHwgTlVMTCA9PSBwX2NiLT5wX2NiYWNrKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwX2NiPSIgPDwgcF9jYgotICAgICAgICAgICAgICAgPDwgIiwgcF9jYi0+cF9jYmFjaz0iIDw8IChwX2NiID8gcF9jYi0+cF9jYmFjayA6IDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogY29kZT0iIDw8IGxvZ2hleChjb2RlKQotICAgICAgICAgIDw8ICIsIHBvcnRfaGFuZGxlPSIgPDwgcG9ydF9oYW5kbGUgPDwgIiwgaGFuZGxlPSIgPDwgcF9jYi0+aGFuZGxlOwotCi0gIHVpbnQzMl90IHVzZXJfZGF0YSA9IHBfcGNiLT5yZmNvbW1fc2xvdF9pZDsKLSAgaWYgKGNvZGUgJiBQT1JUX0VWX1JYQ0hBUikgewotICAgIGV2dF9kYXRhLmRhdGFfaW5kLmhhbmRsZSA9IHBfY2ItPmhhbmRsZTsKLSAgICBwX2NiLT5wX2NiYWNrKEJUQV9KVl9SRkNPTU1fREFUQV9JTkRfRVZULCAmZXZ0X2RhdGEsIHVzZXJfZGF0YSk7Ci0gIH0KLQotICBpZiAoY29kZSAmIFBPUlRfRVZfRkMpIHsKLSAgICBwX3BjYi0+Y29uZyA9IChjb2RlICYgUE9SVF9FVl9GQ1MpID8gZmFsc2UgOiB0cnVlOwotICAgIGV2dF9kYXRhLnJmY19jb25nLmNvbmcgPSBwX3BjYi0+Y29uZzsKLSAgICBldnRfZGF0YS5yZmNfY29uZy5oYW5kbGUgPSBwX2NiLT5oYW5kbGU7Ci0gICAgZXZ0X2RhdGEucmZjX2Nvbmcuc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gICAgcF9jYi0+cF9jYmFjayhCVEFfSlZfUkZDT01NX0NPTkdfRVZULCAmZXZ0X2RhdGEsIHVzZXJfZGF0YSk7Ci0gIH0KLQotICBpZiAoY29kZSAmIFBPUlRfRVZfVFhFTVBUWSkgewotICAgIGJ0YV9qdl9wbV9jb25uX2lkbGUocF9wY2ItPnBfcG1fY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9hZGRfcmZjX3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgYWRkIGEgcG9ydCBmb3Igc2VydmVyIHdoZW4gdGhlIGV4aXN0aW5nIHBvc3RzIGlzIG9wZW4KLSAqCi0gKiBSZXR1cm5zICAgcmV0dXJuIGEgcG9pbnRlciB0byB0QlRBX0pWX1BDQiBqdXN0IGFkZGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0pWX1BDQiogYnRhX2p2X2FkZF9yZmNfcG9ydCh0QlRBX0pWX1JGQ19DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1BDQiogcF9wY2Jfb3BlbikgewotICB1aW50OF90IHVzZWQgPSAwLCBpLCBsaXN0ZW4gPSAwOwotICB1aW50MzJfdCBzaSA9IDA7Ci0gIHRQT1JUX1NUQVRFIHBvcnRfc3RhdGU7Ci0gIHVpbnQzMl90IGV2ZW50X21hc2sgPSBCVEFfSlZfUkZDX0VWX01BU0s7Ci0gIHRCVEFfSlZfUENCKiBwX3BjYiA9IE5VTEw7Ci0gIGlmIChwX2NiLT5tYXhfc2VzcyA+IDEpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcF9jYi0+bWF4X3Nlc3M7IGkrKykgewotICAgICAgaWYgKHBfY2ItPnJmY19oZGxbaV0gIT0gMCkgewotICAgICAgICBwX3BjYiA9ICZidGFfanZfY2IucG9ydF9jYltwX2NiLT5yZmNfaGRsW2ldIC0gMV07Ci0gICAgICAgIGlmIChwX3BjYi0+c3RhdGUgPT0gQlRBX0pWX1NUX1NSX0xJU1RFTikgewotICAgICAgICAgIGxpc3RlbisrOwotICAgICAgICAgIGlmIChwX3BjYl9vcGVuID09IHBfcGNiKSB7Ci0gICAgICAgICAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHBvcnRfaGFuZGxlPSIgPDwgcF9wY2ItPnBvcnRfaGFuZGxlCi0gICAgICAgICAgICAgICAgICAgIDw8ICIsIGNoYW5nZSB0aGUgbGlzdGVuIHBvcnQgdG8gb3BlbiBzdGF0ZSI7Ci0gICAgICAgICAgICBwX3BjYi0+c3RhdGUgPSBCVEFfSlZfU1RfU1JfT1BFTjsKLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IG9wZW4gcGNiIG5vdCBtYXRjaGluZyBsaXN0ZW4gb25lLCBjb3VudD0iIDw8IGxpc3RlbgotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBsaXN0ZW4gcGNiIGhhbmRsZT0iIDw8IHBfcGNiLT5wb3J0X2hhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBvcGVuIHBjYj0iIDw8IHBfcGNiX29wZW4tPmhhbmRsZTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB1c2VkKys7Ci0gICAgICB9IGVsc2UgaWYgKHNpID09IDApIHsKLSAgICAgICAgc2kgPSBpICsgMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IG1heF9zZXNzPSIgPDwgcF9jYi0+bWF4X3Nlc3MgPDwgIiwgdXNlZD0iIDw8IHVzZWQKLSAgICAgICAgICAgIDw8ICIsIGN1cnJfc2Vzcz0iIDw8IHBfY2ItPmN1cnJfc2VzcyA8PCAiLCBsaXN0ZW49IiA8PCBsaXN0ZW4KLSAgICAgICAgICAgIDw8ICIsIHNpPSIgPDwgc2k7Ci0gICAgaWYgKHVzZWQgPCBwX2NiLT5tYXhfc2VzcyAmJiBsaXN0ZW4gPT0gMSAmJiBzaSkgewotICAgICAgc2ktLTsKLSAgICAgIGlmIChSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbihwX2NiLT5zZWNfaWQsIHBfY2ItPnNjbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfSlZfREVGX1JGQ19NVFUsIFJhd0FkZHJlc3M6OmtBbnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwX2NiLT5yZmNfaGRsW3NpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2p2X3BvcnRfbWdtdF9zcl9jYmFjaykgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgICAgIHBfY2ItPmN1cnJfc2VzcysrOwotICAgICAgICBwX3BjYiA9ICZidGFfanZfY2IucG9ydF9jYltwX2NiLT5yZmNfaGRsW3NpXSAtIDFdOwotICAgICAgICBwX3BjYi0+c3RhdGUgPSBCVEFfSlZfU1RfU1JfTElTVEVOOwotICAgICAgICBwX3BjYi0+cG9ydF9oYW5kbGUgPSBwX2NiLT5yZmNfaGRsW3NpXTsKLSAgICAgICAgcF9wY2ItPnJmY29tbV9zbG90X2lkID0gcF9wY2Jfb3Blbi0+cmZjb21tX3Nsb3RfaWQ7Ci0KLSAgICAgICAgUE9SVF9DbGVhcktlZXBIYW5kbGVGbGFnKHBfcGNiLT5wb3J0X2hhbmRsZSk7Ci0gICAgICAgIFBPUlRfU2V0RXZlbnRDYWxsYmFjayhwX3BjYi0+cG9ydF9oYW5kbGUsIGJ0YV9qdl9wb3J0X2V2ZW50X3NyX2NiYWNrKTsKLSAgICAgICAgUE9SVF9TZXREYXRhQ09DYWxsYmFjayhwX3BjYi0+cG9ydF9oYW5kbGUsIGJ0YV9qdl9wb3J0X2RhdGFfY29fY2JhY2spOwotICAgICAgICBQT1JUX1NldEV2ZW50TWFzayhwX3BjYi0+cG9ydF9oYW5kbGUsIGV2ZW50X21hc2spOwotICAgICAgICBQT1JUX0dldFN0YXRlKHBfcGNiLT5wb3J0X2hhbmRsZSwgJnBvcnRfc3RhdGUpOwotCi0gICAgICAgIHBvcnRfc3RhdGUuZmNfdHlwZSA9IChQT1JUX0ZDX0NUU19PTl9JTlBVVCB8IFBPUlRfRkNfQ1RTX09OX09VVFBVVCk7Ci0KLSAgICAgICAgUE9SVF9TZXRTdGF0ZShwX3BjYi0+cG9ydF9oYW5kbGUsICZwb3J0X3N0YXRlKTsKLSAgICAgICAgcF9wY2ItPmhhbmRsZSA9IEJUQV9KVl9SRkNfSF9TX1RPX0hETChwX2NiLT5oYW5kbGUsIHNpKTsKLSAgICAgICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBwX3BjYi0+aGFuZGxlPSIgPDwgbG9naGV4KHBfcGNiLT5oYW5kbGUpCi0gICAgICAgICAgICAgICAgPDwgIiwgY3Vycl9zZXNzPSIgPDwgcF9jYi0+Y3Vycl9zZXNzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbiBmYWlsZWQiOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW5ub3QgY3JlYXRlIG5ldyByZmMgbGlzdGVuIHBvcnQiOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogc2VjIGlkIGluIHVzZT0iIDw8IGdldF9zZWNfaWRfdXNlZCgpCi0gICAgICAgICAgPDwgIiwgcmZjX2NiIGluIHVzZT0iIDw8IGdldF9yZmNfY2JfdXNlZCgpOwotICByZXR1cm4gcF9wY2I7Ci19Ci0KLS8qIHdhaXRzIGZvciBhbiBSRkNPTU0gY2xpZW50IHRvIGNvbm5lY3QgKi8KLXZvaWQgYnRhX2p2X3JmY29tbV9zdGFydF9zZXJ2ZXIodEJUQV9TRUMgc2VjX21hc2ssIHVpbnQ4X3QgbG9jYWxfc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9zZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpIHsKLSAgdWludDE2X3QgaGFuZGxlID0gMDsKLSAgdWludDMyX3QgZXZlbnRfbWFzayA9IEJUQV9KVl9SRkNfRVZfTUFTSzsKLSAgdFBPUlRfU1RBVEUgcG9ydF9zdGF0ZTsKLSAgdEJUQV9KVl9SRkNfQ0IqIHBfY2IgPSBOVUxMOwotICB0QlRBX0pWX1BDQiogcF9wY2I7Ci0gIHRCVEFfSlZfUkZDT01NX1NUQVJUIGV2dF9kYXRhOwotCi0gIG1lbXNldCgmZXZ0X2RhdGEsIDAsIHNpemVvZihldnRfZGF0YSkpOwotICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfRkFJTFVSRTsKLQotICBkbyB7Ci0gICAgaWYgKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uV2l0aFNlY3VyaXR5KAotICAgICAgICAgICAgMCwgbG9jYWxfc2NuLCB0cnVlLCBCVEFfSlZfREVGX1JGQ19NVFUsIFJhd0FkZHJlc3M6OmtBbnksICZoYW5kbGUsCi0gICAgICAgICAgICBidGFfanZfcG9ydF9tZ210X3NyX2NiYWNrLCBzZWNfbWFzaykgIT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uIGZhaWxlZCI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwX2NiID0gYnRhX2p2X2FsbG9jX3JmY19jYihoYW5kbGUsICZwX3BjYik7Ci0gICAgaWYgKCFwX2NiKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHJ1biBvdXQgb2YgcmZjIGNvbnRyb2wgYmxvY2siOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcF9jYi0+bWF4X3Nlc3MgPSBtYXhfc2Vzc2lvbjsKLSAgICBwX2NiLT5wX2NiYWNrID0gcF9jYmFjazsKLSAgICBwX2NiLT5zY24gPSBsb2NhbF9zY247Ci0gICAgcF9wY2ItPnN0YXRlID0gQlRBX0pWX1NUX1NSX0xJU1RFTjsKLSAgICBwX3BjYi0+cmZjb21tX3Nsb3RfaWQgPSByZmNvbW1fc2xvdF9pZDsKLSAgICBldnRfZGF0YS5zdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgICBldnRfZGF0YS5oYW5kbGUgPSBwX2NiLT5oYW5kbGU7Ci0gICAgZXZ0X2RhdGEudXNlX2NvID0gdHJ1ZTsKLQotICAgIFBPUlRfQ2xlYXJLZWVwSGFuZGxlRmxhZyhoYW5kbGUpOwotICAgIFBPUlRfU2V0RXZlbnRDYWxsYmFjayhoYW5kbGUsIGJ0YV9qdl9wb3J0X2V2ZW50X3NyX2NiYWNrKTsKLSAgICBQT1JUX1NldEV2ZW50TWFzayhoYW5kbGUsIGV2ZW50X21hc2spOwotICAgIFBPUlRfR2V0U3RhdGUoaGFuZGxlLCAmcG9ydF9zdGF0ZSk7Ci0KLSAgICBwb3J0X3N0YXRlLmZjX3R5cGUgPSAoUE9SVF9GQ19DVFNfT05fSU5QVVQgfCBQT1JUX0ZDX0NUU19PTl9PVVRQVVQpOwotCi0gICAgUE9SVF9TZXRTdGF0ZShoYW5kbGUsICZwb3J0X3N0YXRlKTsKLSAgfSB3aGlsZSAoMCk7Ci0KLSAgdEJUQV9KViBidGFfanY7Ci0gIGJ0YV9qdi5yZmNfc3RhcnQgPSBldnRfZGF0YTsKLSAgcF9jYmFjayhCVEFfSlZfUkZDT01NX1NUQVJUX0VWVCwgJmJ0YV9qdiwgcmZjb21tX3Nsb3RfaWQpOwotICBpZiAoYnRhX2p2LnJmY19zdGFydC5zdGF0dXMgPT0gQlRBX0pWX1NVQ0NFU1MpIHsKLSAgICBQT1JUX1NldERhdGFDT0NhbGxiYWNrKGhhbmRsZSwgYnRhX2p2X3BvcnRfZGF0YV9jb19jYmFjayk7Ci0gIH0gZWxzZSB7Ci0gICAgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQobG9jYWxfc2NuKTsKLSAgICBpZiAoaGFuZGxlKSBSRkNPTU1fUmVtb3ZlQ29ubmVjdGlvbihoYW5kbGUpOwotICB9Ci19Ci0KLS8qIHN0b3BzIGFuIFJGQ09NTSBzZXJ2ZXIgKi8KLXZvaWQgYnRhX2p2X3JmY29tbV9zdG9wX3NlcnZlcih1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKSB7Ci0gIGlmICghaGFuZGxlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBqdiBoYW5kbGUgaXMgbnVsbCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgdEJUQV9KVl9SRkNfQ0IqIHBfY2IgPSBOVUxMOwotICB0QlRBX0pWX1BDQiogcF9wY2IgPSBOVUxMOwotCi0gIGlmICghZmluZF9yZmNfcGNiKHJmY29tbV9zbG90X2lkLCAmcF9jYiwgJnBfcGNiKSkgcmV0dXJuOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHBfcGNiPSIgPDwgcF9wY2IKLSAgICAgICAgICA8PCAiLCBwX3BjYi0+cG9ydF9oYW5kbGU9IiA8PCBwX3BjYi0+cG9ydF9oYW5kbGU7Ci0gIGJ0YV9qdl9mcmVlX3JmY19jYihwX2NiLCBwX3BjYik7Ci19Ci0KLS8qIHdyaXRlIGRhdGEgdG8gYW4gUkZDT01NIGNvbm5lY3Rpb24gKi8KLXZvaWQgYnRhX2p2X3JmY29tbV93cml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCwgdEJUQV9KVl9SRkNfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9QQ0IqIHBfcGNiKSB7Ci0gIGlmIChwX3BjYi0+c3RhdGUgPT0gQlRBX0pWX1NUX05PTkUpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGluIHN0YXRlIEJUQV9KVl9TVF9OT05FIC0gY2Fubm90IHdyaXRlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0pWX1JGQ09NTV9XUklURSBldnRfZGF0YTsKLSAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0gIGV2dF9kYXRhLmhhbmRsZSA9IGhhbmRsZTsKLSAgZXZ0X2RhdGEucmVxX2lkID0gcmVxX2lkOwotICBldnRfZGF0YS5jb25nID0gcF9wY2ItPmNvbmc7Ci0gIGV2dF9kYXRhLmxlbiA9IDA7Ci0KLSAgYnRhX2p2X3BtX2Nvbm5fYnVzeShwX3BjYi0+cF9wbV9jYik7Ci0KLSAgaWYgKCFldnRfZGF0YS5jb25nICYmCi0gICAgICBQT1JUX1dyaXRlRGF0YUNPKHBfcGNiLT5wb3J0X2hhbmRsZSwgJmV2dF9kYXRhLmxlbikgPT0gUE9SVF9TVUNDRVNTKSB7Ci0gICAgZXZ0X2RhdGEuc3RhdHVzID0gQlRBX0pWX1NVQ0NFU1M7Ci0gIH0KLQotICAvLyBVcGRhdGUgY29uZ2VzdGlvbiBmbGFnCi0gIGV2dF9kYXRhLmNvbmcgPSBwX3BjYi0+Y29uZzsKLQotICBpZiAoIXBfY2ItPnBfY2JhY2spIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vIEpWIGNhbGxiYWNrIHNldCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9KViBidGFfanY7Ci0gIGJ0YV9qdi5yZmNfd3JpdGUgPSBldnRfZGF0YTsKLSAgcF9jYi0+cF9jYmFjayhCVEFfSlZfUkZDT01NX1dSSVRFX0VWVCwgJmJ0YV9qdiwgcF9wY2ItPnJmY29tbV9zbG90X2lkKTsKLX0KLQotLyogU2V0IG9yIGZyZWUgcG93ZXIgbW9kZSBwcm9maWxlIGZvciBhIEpWIGFwcGxpY2F0aW9uICovCi12b2lkIGJ0YV9qdl9zZXRfcG1fcHJvZmlsZSh1aW50MzJfdCBoYW5kbGUsIHRCVEFfSlZfUE1fSUQgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9DT05OX1NUQVRFIGluaXRfc3QpIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzOwotICB0QlRBX0pWX1BNX0NCKiBwX2NiOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBoYW5kbGU9IiA8PCBsb2doZXgoaGFuZGxlKSA8PCAiLCBhcHBfaWQ9IiA8PCBhcHBfaWQKLSAgICAgICAgICA8PCAiLCBpbml0X3N0PSIgPDwgK2luaXRfc3Q7Ci0KLSAgLyogY2xlYXIgUE0gY29udHJvbCBibG9jayAqLwotICBpZiAoYXBwX2lkID09IEJUQV9KVl9QTV9JRF9DTEVBUikgewotICAgIHN0YXR1cyA9IGJ0YV9qdl9mcmVlX3NldF9wbV9wcm9maWxlX2NiKGhhbmRsZSk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEJUQV9KVl9TVUNDRVNTKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZnJlZSBwbSBjYiBmYWlsZWQ6IHJlYXNvbj0iIDw8ICtzdGF0dXM7Ci0gICAgfQotICB9IGVsc2UgLyogc2V0IFBNIGNvbnRyb2wgYmxvY2sgKi8KLSAgewotICAgIHBfY2IgPSBidGFfanZfYWxsb2Nfc2V0X3BtX3Byb2ZpbGVfY2IoaGFuZGxlLCBhcHBfaWQpOwotCi0gICAgaWYgKE5VTEwgIT0gcF9jYikKLSAgICAgIGJ0YV9qdl9wbV9zdGF0ZV9jaGFuZ2UocF9jYiwgaW5pdF9zdCk7Ci0gICAgZWxzZQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICBidGFfanZfcG1fY29ubl9idXN5Ci0gKgotICogRGVzY3JpcHRpb24gc2V0IHBtIGNvbm5lY3Rpb24gYnVzeSBzdGF0ZSAoaW5wdXQgcGFyYW0gc2FmZSkKLSAqCi0gKiBQYXJhbXMgICAgICBwX2NiOiBwbSBjb250cm9sIGJsb2NrIG9mIGp2IGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9qdl9wbV9jb25uX2J1c3kodEJUQV9KVl9QTV9DQiogcF9jYikgewotICBpZiAoKE5VTEwgIT0gcF9jYikgJiYgKEJUQV9KVl9QTV9JRExFX1NUID09IHBfY2ItPnN0YXRlKSkKLSAgICBidGFfanZfcG1fc3RhdGVfY2hhbmdlKHBfY2IsIEJUQV9KVl9DT05OX0JVU1kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgIGJ0YV9qdl9wbV9jb25uX2J1c3kKLSAqCi0gKiBEZXNjcmlwdGlvbiBzZXQgcG0gY29ubmVjdGlvbiBidXN5IHN0YXRlIChpbnB1dCBwYXJhbSBzYWZlKQotICoKLSAqIFBhcmFtcyAgICAgIHBfY2I6IHBtIGNvbnRyb2wgYmxvY2sgb2YganYgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX2p2X3BtX2Nvbm5faWRsZSh0QlRBX0pWX1BNX0NCKiBwX2NiKSB7Ci0gIGlmICgoTlVMTCAhPSBwX2NiKSAmJiAoQlRBX0pWX1BNX0lETEVfU1QgIT0gcF9jYi0+c3RhdGUpKQotICAgIGJ0YV9qdl9wbV9zdGF0ZV9jaGFuZ2UocF9jYiwgQlRBX0pWX0NPTk5fSURMRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0YV9qdl9wbV9zdGF0ZV9jaGFuZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgTm90aWZ5IHBvd2VyIG1hbmFnZXIgdGhlcmUgaXMgc3RhdGUgY2hhbmdlCi0gKgotICogUGFyYW1zICAgICAgcF9jYjogbXVzdCBiZSBOT05FIE5VTEwKLSAqCi0gKiBSZXR1cm5zICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfanZfcG1fc3RhdGVfY2hhbmdlKHRCVEFfSlZfUE1fQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfSlZfQ09OTl9TVEFURSBzdGF0ZSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHBfY2I9IiA8PCBwX2NiCi0gICAgICAgICAgPDwgIiwgaGFuZGxlPSIgPDwgbG9naGV4KHBfY2ItPmhhbmRsZSkKLSAgICAgICAgICA8PCAiLCBidXN5L2lkbGVfc3RhdGU9IiA8PCBwX2NiLT5zdGF0ZSA8PCAiLCBhcHBfaWQ9IiA8PCBwX2NiLT5hcHBfaWQKLSAgICAgICAgICA8PCAiLCBjb25uX3N0YXRlPSIgPDwgc3RhdGU7Ci0KLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgQlRBX0pWX0NPTk5fT1BFTjoKLSAgICAgIGJ0YV9zeXNfY29ubl9vcGVuKEJUQV9JRF9KViwgcF9jYi0+YXBwX2lkLCBwX2NiLT5wZWVyX2JkX2FkZHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9DT05OX0NMT1NFOgotICAgICAgYnRhX3N5c19jb25uX2Nsb3NlKEJUQV9JRF9KViwgcF9jYi0+YXBwX2lkLCBwX2NiLT5wZWVyX2JkX2FkZHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9BUFBfT1BFTjoKLSAgICAgIGJ0YV9zeXNfYXBwX29wZW4oQlRBX0lEX0pWLCBwX2NiLT5hcHBfaWQsIHBfY2ItPnBlZXJfYmRfYWRkcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX0FQUF9DTE9TRToKLSAgICAgIGJ0YV9zeXNfYXBwX2Nsb3NlKEJUQV9JRF9KViwgcF9jYi0+YXBwX2lkLCBwX2NiLT5wZWVyX2JkX2FkZHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9TQ09fT1BFTjoKLSAgICAgIGJ0YV9zeXNfc2NvX29wZW4oQlRBX0lEX0pWLCBwX2NiLT5hcHBfaWQsIHBfY2ItPnBlZXJfYmRfYWRkcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX1NDT19DTE9TRToKLSAgICAgIGJ0YV9zeXNfc2NvX2Nsb3NlKEJUQV9JRF9KViwgcF9jYi0+YXBwX2lkLCBwX2NiLT5wZWVyX2JkX2FkZHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9DT05OX0lETEU6Ci0gICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9KVl9QTV9JRExFX1NUOwotICAgICAgYnRhX3N5c19pZGxlKEJUQV9JRF9KViwgcF9jYi0+YXBwX2lkLCBwX2NiLT5wZWVyX2JkX2FkZHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9DT05OX0JVU1k6Ci0gICAgICBwX2NiLT5zdGF0ZSA9IEJUQV9KVl9QTV9CVVNZX1NUOwotICAgICAgYnRhX3N5c19idXN5KEJUQV9JRF9KViwgcF9jYi0+YXBwX2lkLCBwX2NiLT5wZWVyX2JkX2FkZHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEludmFsaWQgc3RhdGU9IiA8PCArc3RhdGU7Ci0gICAgICBicmVhazsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2J0YS9qdi9idGFfanZfYXBpLmNjIGIvYnRhL2p2L2J0YV9qdl9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTQ1OTEuLjAwMDAwMDAKLS0tIGEvYnRhL2p2L2J0YV9qdl9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFWQSBBUEkgZm9yIEJsdWV0b290aCBXaXJlbGVzcwotICogIFRlY2hub2xvZ3kgKEpBQldUKSBhcyBzcGVjaWZpZWQgYnkgdGhlIEpTUjgyIHNwZWNpZmljaWF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2p2L2J0YV9qdl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiICAvLyBkb19pbl9tYWluX3RocmVhZAotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2FwX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotbmFtZXNwYWNlIHsKLWJvb2wgYnRhX2p2X2VuYWJsZWQgPSBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIHRoZSBKYXZhIEkvRiBzZXJ2aWNlLiBXaGVuIHRoZSBlbmFibGUKLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0pWX0VOQUJMRV9FVlQuIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGZ1bmN0aW9uIGluIHRoZSBKViBBUEkgYXJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMIGlmIGludGVybmFsIGZhaWx1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkVuYWJsZSh0QlRBX0pWX0RNX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGlmICghcF9jYmFjayB8fCBidGFfanZfZW5hYmxlZCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZmFpbHVyZSI7Ci0gICAgcmV0dXJuIEJUQV9KVl9GQUlMVVJFOwotICB9Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBtZW1zZXQoJmJ0YV9qdl9jYiwgMCwgc2l6ZW9mKHRCVEFfSlZfQ0IpKTsKLSAgLyogc2V0IGhhbmRsZSB0byBpbnZhbGlkIHZhbHVlIGJ5IGRlZmF1bHQgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVEFfSlZfUE1fTUFYX05VTTsgaSsrKSB7Ci0gICAgYnRhX2p2X2NiLnBtX2NiW2ldLmhhbmRsZSA9IEJUQV9KVl9QTV9IQU5ETEVfQ0xFQVI7Ci0gIH0KLSAgYnRhX2p2X2NiLmR5bl9wc20gPSAweGZmZjsKLSAgdXNlZF9sMmNhcF9jbGFzc2ljX2R5bmFtaWNfcHNtID0ge307Ci0KLSAgYnRhX2p2X2VuYWJsZWQgPSB0cnVlOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmYnRhX2p2X2VuYWJsZSwgcF9jYmFjaykpOwotICByZXR1cm4gQlRBX0pWX1NVQ0NFU1M7Ci19Ci0KLS8qKiBEaXNhYmxlIHRoZSBKYXZhIEkvRiAqLwotdm9pZCBCVEFfSnZEaXNhYmxlKHZvaWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBidGFfanZfZW5hYmxlZCA9IGZhbHNlOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmYnRhX2p2X2Rpc2FibGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkdldENoYW5uZWxJZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBhIFNDTiAoc2VydmVyIGNoYW5uZWwgbnVtYmVyKSBmb3IKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIHJ1bm5pbmcgb3ZlciBSRkNPTU0sIEwyQ0FQIG9mIEwyQ0FQX0xFLgotICogICAgICAgICAgICAgICAgICBJdCBpcyBwcmltYXJpbHkgY2FsbGVkIGJ5IHNlcnZlciBwcm9maWxlcy9hcHBsaWNhdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdGhlaXIgU0NOIGludG8gdGhlIFNEUCBkYXRhYmFzZS4gVGhlIFNDTiBpcwotICogICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSB0aGUgdEJUQV9KVl9ETV9DQkFDSyBjYWxsYmFjayB3aXRoIGEKLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0dFVF9TQ05fRVZUIGZvciBSRkNPTU0gY2hhbm5lbHMgYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9HRVRfUFNNX0VWVCBmb3IgTDJDQVAgYW5kIExFLgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgU0NOL1BTTSByZXBvcnRlZCBpcyAwLCB0aGF0IG1lYW5zIGFsbCByZXNvdXJjZXMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIGV4aGF1c3RlZC4KLSAqIFBhcmFtZXRlcnMKLSAqICAgY29ubl90eXBlICAgICAgb25lIG9mIEJUQV9KVl9DT05OX1RZUEVfCi0gKiAgIHVzZXJfZGF0YSAgICAgIEFueSB1c2VydmFsdWUgLSB3aWxsIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcgZXZlbnQuCi0gKiAgIGNoYW5uZWwgICAgICAgIE9ubHkgdXNlZCBmb3IgUkZDT01NIC0gdG8gdHJ5IHRvIGFsbG9jYXRlIGEgc3BlY2lmaWMgUkZDT01NCi0gKiAgICAgICAgICAgICAgICAgIGNoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0p2R2V0Q2hhbm5lbElkKGludCBjb25uX3R5cGUsIHVpbnQzMl90IGlkLCBpbnQzMl90IGNoYW5uZWwpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX3R5cGU9IiA8PCBjb25uX3R5cGU7Ci0KLSAgaWYgKGNvbm5fdHlwZSAhPSBCVEFfSlZfQ09OTl9UWVBFX1JGQ09NTSAmJgotICAgICAgY29ubl90eXBlICE9IEJUQV9KVl9DT05OX1RZUEVfTDJDQVAgJiYKLSAgICAgIGNvbm5fdHlwZSAhPSBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQX0xFKSB7Ci0gICAgQ0hFQ0soZmFsc2UpIDw8ICJJbnZhbGlkIGNvbm5fdHlwZT0iIDw8IGNvbm5fdHlwZTsKLSAgfQotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgQmluZCgmYnRhX2p2X2dldF9jaGFubmVsX2lkLCBjb25uX3R5cGUsIGNoYW5uZWwsIGlkLCBpZCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2RnJlZUNoYW5uZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgYSBzZXJ2ZXIgY2hhbm5lbCBudW1iZXIgdGhhdCB3YXMgdXNlZAotICogICAgICAgICAgICAgICAgICBieSBhbiBhcHBsaWNhdGlvbiBydW5uaW5nIG92ZXIgUkZDT01NLgotICogUGFyYW1ldGVycwotICogICBjaGFubmVsICAgICAgICBUaGUgY2hhbm5lbCB0byBmcmVlCi0gKiAgIGNvbm5fdHlwZSAgICAgIG9uZSBvZiBCVEFfSlZfQ09OTl9UWVBFXwotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2RnJlZUNoYW5uZWwodWludDE2X3QgY2hhbm5lbCwgaW50IGNvbm5fdHlwZSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmYnRhX2p2X2ZyZWVfc2NuLCBjb25uX3R5cGUsIGNoYW5uZWwpKTsKLSAgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2U3RhcnREaXNjb3ZlcnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgc2VydmljZSBkaXNjb3ZlcnkgZm9yIHRoZSBzZXJ2aWNlcwotICogICAgICAgICAgICAgICAgICBwcm92aWRlZCBieSB0aGUgZ2l2ZW4gcGVlciBkZXZpY2UuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZSB0aGUgdEJUQV9KVl9ETV9DQkFDSyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX0pWX0RJU0NPVkVSWV9DT01QX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlN0YXJ0RGlzY292ZXJ5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fdXVpZCwgY29uc3QgVXVpZCogcF91dWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIFV1aWQqIHV1aWRfbGlzdF9jb3B5ID0gbmV3IFV1aWRbbnVtX3V1aWRdOwotICBtZW1jcHkodXVpZF9saXN0X2NvcHksIHBfdXVpZF9saXN0LCBudW1fdXVpZCAqIHNpemVvZihVdWlkKSk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBCaW5kKCZidGFfanZfc3RhcnRfZGlzY292ZXJ5LCBiZF9hZGRyLCBudW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPd25lZCh1dWlkX2xpc3RfY29weSksIHJmY29tbV9zbG90X2lkKSk7Ci0gIHJldHVybiBCVEFfSlZfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkNyZWF0ZVJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGEgc2VydmljZSByZWNvcmQgaW4gdGhlIGxvY2FsIFNEUCBkYXRhYmFzZS4KLSAqICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSB0QlRBX0pWX0RNX0NCQUNLIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBCVEFfSlZfQ1JFQVRFX1JFQ09SRF9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZDcmVhdGVSZWNvcmRCeVVzZXIodWludDMyX3QgcmZjb21tX3Nsb3RfaWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJmJ0YV9qdl9jcmVhdGVfcmVjb3JkLCByZmNvbW1fc2xvdF9pZCkpOwotICByZXR1cm4gQlRBX0pWX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZEZWxldGVSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlbGV0ZSBhIHNlcnZpY2UgcmVjb3JkIGluIHRoZSBsb2NhbCBTRFAgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZEZWxldGVSZWNvcmQodWludDMyX3QgaGFuZGxlKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZidGFfanZfZGVsZXRlX3JlY29yZCwgaGFuZGxlKSk7Ci0gIHJldHVybiBCVEFfSlZfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhdGUgYSBjb25uZWN0aW9uIGFzIGEgTDJDQVAgY2xpZW50IHRvIHRoZSBnaXZlbiBCRAotICogICAgICAgICAgICAgICAgICBBZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzIGluaXRpYXRlZCBvciBmYWlsZWQgdG8gaW5pdGlhdGUsCi0gKiAgICAgICAgICAgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgaXMgY2FsbGVkIHdpdGggQlRBX0pWX0wyQ0FQX0NMX0lOSVRfRVZUCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgb3IgZmFpbGVkLAotICogICAgICAgICAgICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLIGlzIGNhbGxlZCB3aXRoIEJUQV9KVl9MMkNBUF9PUEVOX0VWVAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9KdkwyY2FwQ29ubmVjdChpbnQgY29ubl90eXBlLCB0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0VSVE1fSU5GTz4gZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVtb3RlX3BzbSwgdWludDE2X3QgcnhfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9DRkdfSU5GTz4gY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBDSEVDSyhwX2NiYWNrKTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIEJpbmQoJmJ0YV9qdl9sMmNhcF9jb25uZWN0LCBjb25uX3R5cGUsIHNlY19tYXNrLCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9wc20sIHJ4X210dSwgcGVlcl9iZF9hZGRyLCBiYXNlOjpQYXNzZWQoJmNmZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZlcnRtX2luZm8pLCBwX2NiYWNrLCBsMmNhcF9zb2NrZXRfaWQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuIEwyQ0FQIGNsaWVudCBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcENsb3NlKHVpbnQzMl90IGhhbmRsZSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGlmIChoYW5kbGUgPj0gQlRBX0pWX01BWF9MMkNfQ09OTiB8fCAhYnRhX2p2X2NiLmwyY19jYltoYW5kbGVdLnBfY2JhY2spCi0gICAgcmV0dXJuIEJUQV9KVl9GQUlMVVJFOwotCi0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBCaW5kKCZidGFfanZfbDJjYXBfY2xvc2UsIGhhbmRsZSwgJmJ0YV9qdl9jYi5sMmNfY2JbaGFuZGxlXSkpOwotICByZXR1cm4gQlRBX0pWX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZMMmNhcFN0YXJ0U2VydmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBhbiBMMkNBUCBzZXJ2ZXIgYW5kIGxpc3RlbnMgZm9yIGFuCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQIGNvbm5lY3Rpb24gZnJvbSBhIHJlbW90ZSBCbHVldG9vdGggZGV2aWNlLiAgV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgc2VydmVyIGlzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0QlRBX0pWX0wyQ0FQX0NCQUNLIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIEJUQV9KVl9MMkNBUF9TVEFSVF9FVlQuICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkIHRCVEFfSlZfTDJDQVBfQ0JBQ0sgaXMgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0wyQ0FQX09QRU5fRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9KdkwyY2FwU3RhcnRTZXJ2ZXIoaW50IGNvbm5fdHlwZSwgdEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfSlZfUk9MRSByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0TDJDQVBfRVJUTV9JTkZPPiBlcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbG9jYWxfcHNtLCB1aW50MTZfdCByeF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9DRkdfSU5GTz4gY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfTDJDQVBfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIENIRUNLKHBfY2JhY2spOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgQmluZCgmYnRhX2p2X2wyY2FwX3N0YXJ0X3NlcnZlciwgY29ubl90eXBlLCBzZWNfbWFzaywgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wc20sIHJ4X210dSwgYmFzZTo6UGFzc2VkKCZjZmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlBhc3NlZCgmZXJ0bV9pbmZvKSwgcF9jYmFjaywgbDJjYXBfc29ja2V0X2lkKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZMMmNhcFN0b3BTZXJ2ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc3RvcHMgdGhlIEwyQ0FQIHNlcnZlci4gSWYgdGhlIHNlcnZlciBoYXMgYW4KLSAqICAgICAgICAgICAgICAgICAgYWN0aXZlIGNvbm5lY3Rpb24sIGl0IHdvdWxkIGJlIGNsb3NlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwU3RvcFNlcnZlcih1aW50MTZfdCBsb2NhbF9wc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIEJpbmQoJmJ0YV9qdl9sMmNhcF9zdG9wX3NlcnZlciwgbG9jYWxfcHNtLCBsMmNhcF9zb2NrZXRfaWQpKTsKLSAgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2TDJjYXBSZWFkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGRhdGEgZnJvbSBhbiBMMkNBUCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdEJUQV9KVl9MMkNBUF9DQkFDSyBpcwotICogICAgICAgICAgICAgICAgICBjYWxsZWQgd2l0aCBCVEFfSlZfTDJDQVBfUkVBRF9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZMMmNhcFJlYWQodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZXFfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoaGFuZGxlID49IEJUQV9KVl9NQVhfTDJDX0NPTk4gfHwgIWJ0YV9qdl9jYi5sMmNfY2JbaGFuZGxlXS5wX2NiYWNrKQotICAgIHJldHVybiBCVEFfSlZfRkFJTFVSRTsKLQotICB0QlRBX0pWX0wyQ0FQX1JFQUQgZXZ0X2RhdGE7Ci0gIGV2dF9kYXRhLnN0YXR1cyA9IEJUQV9KVl9GQUlMVVJFOwotICBldnRfZGF0YS5oYW5kbGUgPSBoYW5kbGU7Ci0gIGV2dF9kYXRhLnJlcV9pZCA9IHJlcV9pZDsKLSAgZXZ0X2RhdGEucF9kYXRhID0gcF9kYXRhOwotICBldnRfZGF0YS5sZW4gPSAwOwotCi0gIGlmIChCVF9QQVNTID09Ci0gICAgICBHQVBfQ29ublJlYWREYXRhKCh1aW50MTZfdCloYW5kbGUsIHBfZGF0YSwgbGVuLCAmZXZ0X2RhdGEubGVuKSkgewotICAgIGV2dF9kYXRhLnN0YXR1cyA9IEJUQV9KVl9TVUNDRVNTOwotICB9Ci0gIGJ0YV9qdl9jYi5sMmNfY2JbaGFuZGxlXS5wX2NiYWNrKEJUQV9KVl9MMkNBUF9SRUFEX0VWVCwgKHRCVEFfSlYqKSZldnRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2p2X2NiLmwyY19jYltoYW5kbGVdLmwyY2FwX3NvY2tldF9pZCk7Ci0gIHJldHVybiBCVEFfSlZfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdkwyY2FwUmVhZHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lZCBpZiB0aGVyZSBpcyBkYXRhIHRvIHJlYWQgZnJvbQotICogICAgICAgICAgICAgICAgICAgIGFuIEwyQ0FQIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiBkYXRhIHF1ZXVlIHNpemUgaXMgaW4gKnBfZGF0YV9zaXplLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgaWYgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwUmVhZHkodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCogcF9kYXRhX3NpemUpIHsKLSAgdEJUQV9KVl9TVEFUVVMgc3RhdHVzID0gQlRBX0pWX0ZBSUxVUkU7Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYW5kbGU9IiA8PCBoYW5kbGU7Ci0gIGlmIChwX2RhdGFfc2l6ZSAmJiBoYW5kbGUgPCBCVEFfSlZfTUFYX0wyQ19DT05OICYmCi0gICAgICBidGFfanZfY2IubDJjX2NiW2hhbmRsZV0ucF9jYmFjaykgewotICAgICpwX2RhdGFfc2l6ZSA9IDA7Ci0gICAgaWYgKEJUX1BBU1MgPT0gR0FQX0dldFJ4UXVldWVDbnQoKHVpbnQxNl90KWhhbmRsZSwgcF9kYXRhX3NpemUpKSB7Ci0gICAgICBzdGF0dXMgPSBCVEFfSlZfU1VDQ0VTUzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZMMmNhcFdyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIEwyQ0FQIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCB0QlRBX0pWX0wyQ0FQX0NCQUNLIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIEJUQV9KVl9MMkNBUF9XUklURV9FVlQuIFdvcmtzIGZvcgotICogICAgICAgICAgICAgICAgICBQU00tYmFzZWQgY29ubmVjdGlvbnMuIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSwgYW5kIHdpbGwgb3NpX2ZyZWUgaXQuIERhdGEgbGVuZ3RoIG11c3QgYmUgc21hbGxlcgotICogICAgICAgICAgICAgICAgICB0aGFuIHJlbW90ZSBtYXhpbXVtIFNEVSBzaXplLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBXcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCwgQlRfSERSKiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoaGFuZGxlID49IEJUQV9KVl9NQVhfTDJDX0NPTk4gfHwgIWJ0YV9qdl9jYi5sMmNfY2JbaGFuZGxlXS5wX2NiYWNrKSB7Ci0gICAgb3NpX2ZyZWUobXNnKTsKLSAgICByZXR1cm4gQlRBX0pWX0ZBSUxVUkU7Ci0gIH0KLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJmJ0YV9qdl9sMmNhcF93cml0ZSwgaGFuZGxlLCByZXFfaWQsIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfaWQsICZidGFfanZfY2IubDJjX2NiW2hhbmRsZV0pKTsKLSAgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2UmZjb21tQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBhbiBSRkNPTU0gY29uZWN0aW9uIHRvIGEgcmVtb3RlIEJECi0gKiAgICAgICAgICAgICAgICAgIEFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIG9yIGZhaWxlZCB0byBpbml0aWF0ZSwKLSAqICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgaXMgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX1JGQ09NTV9DTF9JTklUX0VWVAotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIG9yIGZhaWxlZCwKLSAqICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sgaXMgY2FsbGVkIHdpdGggQlRBX0pWX1JGQ09NTV9PUEVOX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tQ29ubmVjdCh0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVtb3RlX3NjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoIXBfY2JhY2spIHJldHVybiBCVEFfSlZfRkFJTFVSRTsgLyogTm90aGluZyB0byBkbyAqLwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgQmluZCgmYnRhX2p2X3JmY29tbV9jb25uZWN0LCBzZWNfbWFzaywgcmVtb3RlX3NjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2JkX2FkZHIsIHBfY2JhY2ssIHJmY29tbV9zbG90X2lkKSk7Ci0gIHJldHVybiBCVEFfSlZfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdlJmY29tbUNsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBhbiBSRkNPTU0gY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tQ2xvc2UodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICB1aW50MzJfdCBoaSA9ICgoaGFuZGxlICYgQlRBX0pWX1JGQ19IRExfTUFTSykgJiB+QlRBX0pWX1JGQ09NTV9NQVNLKSAtIDE7Ci0gIHVpbnQzMl90IHNpID0gQlRBX0pWX1JGQ19IRExfVE9fU0lEWChoYW5kbGUpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKGhpID49IEJUQV9KVl9NQVhfUkZDX0NPTk4gfHwgIWJ0YV9qdl9jYi5yZmNfY2JbaGldLnBfY2JhY2sgfHwKLSAgICAgIHNpID49IEJUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT04gfHwgIWJ0YV9qdl9jYi5yZmNfY2JbaGldLnJmY19oZGxbc2ldKQotICAgIHJldHVybiBCVEFfSlZfRkFJTFVSRTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIEJpbmQoJmJ0YV9qdl9yZmNvbW1fY2xvc2UsIGhhbmRsZSwgcmZjb21tX3Nsb3RfaWQpKTsKLSAgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2UmZjb21tU3RhcnRTZXJ2ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc3RhcnRzIGxpc3RlbmluZyBmb3IgYW4gUkZDT01NIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdCBmcm9tIGEgcmVtb3RlIEJsdWV0b290aCBkZXZpY2UuICBXaGVuIHRoZSBzZXJ2ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHRCVEFfSlZfUkZDT01NX0NCQUNLIGlzIGNhbGxlZAotICogICAgICAgICAgICAgICAgICB3aXRoIEJUQV9KVl9SRkNPTU1fU1RBUlRfRVZULgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCB0QlRBX0pWX1JGQ09NTV9DQkFDSwotICogICAgICAgICAgICAgICAgICBpcyBjYWxsZWQgd2l0aCBCVEFfSlZfUkZDT01NX09QRU5fRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX0pWX1NVQ0NFU1MsIGlmIHRoZSByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tU3RhcnRTZXJ2ZXIodEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfSlZfUk9MRSByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsb2NhbF9zY24sIHVpbnQ4X3QgbWF4X3Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKHBfY2JhY2sgPT0gTlVMTCkgcmV0dXJuIEJUQV9KVl9GQUlMVVJFOyAvKiBOb3RoaW5nIHRvIGRvICovCi0KLSAgaWYgKG1heF9zZXNzaW9uID09IDApIG1heF9zZXNzaW9uID0gMTsKLSAgaWYgKG1heF9zZXNzaW9uID4gQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAibWF4X3Nlc3Npb24gaXMgdG9vIGJpZy4gdXNlIG1heCAiCi0gICAgICAgICAgICAgIDw8IEJUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT047Ci0gICAgbWF4X3Nlc3Npb24gPSBCVEFfSlZfTUFYX1JGQ19TUl9TRVNTSU9OOwotICB9Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBCaW5kKCZidGFfanZfcmZjb21tX3N0YXJ0X3NlcnZlciwgc2VjX21hc2ssIGxvY2FsX3NjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2Vzc2lvbiwgcF9jYmFjaywgcmZjb21tX3Nsb3RfaWQpKTsKLSAgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0p2UmZjb21tU3RvcFNlcnZlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzdG9wcyB0aGUgUkZDT01NIHNlcnZlci4gSWYgdGhlIHNlcnZlciBoYXMgYW4KLSAqICAgICAgICAgICAgICAgICAgYWN0aXZlIGNvbm5lY3Rpb24sIGl0IHdvdWxkIGJlIGNsb3NlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbVN0b3BTZXJ2ZXIodWludDMyX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgQmluZCgmYnRhX2p2X3JmY29tbV9zdG9wX3NlcnZlciwgaGFuZGxlLCByZmNvbW1fc2xvdF9pZCkpOwotICByZXR1cm4gQlRBX0pWX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfSnZSZmNvbW1HZXRQb3J0SGRsCi0gKgotICogRGVzY3JpcHRpb24gICAgVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSByZmNvbW0gcG9ydCBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9KVl9GQUlMVVJFLCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUQV9KdlJmY29tbUdldFBvcnRIZGwodWludDMyX3QgaGFuZGxlKSB7Ci0gIHVpbnQzMl90IGhpID0gKChoYW5kbGUgJiBCVEFfSlZfUkZDX0hETF9NQVNLKSAmIH5CVEFfSlZfUkZDT01NX01BU0spIC0gMTsKLSAgdWludDMyX3Qgc2kgPSBCVEFfSlZfUkZDX0hETF9UT19TSURYKGhhbmRsZSk7Ci0KLSAgaWYgKGhpIDwgQlRBX0pWX01BWF9SRkNfQ09OTiAmJiBzaSA8IEJUQV9KVl9NQVhfUkZDX1NSX1NFU1NJT04gJiYKLSAgICAgIGJ0YV9qdl9jYi5yZmNfY2JbaGldLnJmY19oZGxbc2ldKQotICAgIHJldHVybiBidGFfanZfY2IucG9ydF9jYltidGFfanZfY2IucmZjX2NiW2hpXS5yZmNfaGRsW3NpXSAtIDFdLnBvcnRfaGFuZGxlOwotICBlbHNlCi0gICAgcmV0dXJuIDB4ZmZmZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9KdlJmY29tbVdyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIFJGQ09NTSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVEFfSlZfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfSlZfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1Xcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCkgewotICB1aW50MzJfdCBoaSA9ICgoaGFuZGxlICYgQlRBX0pWX1JGQ19IRExfTUFTSykgJiB+QlRBX0pWX1JGQ09NTV9NQVNLKSAtIDE7Ci0gIHVpbnQzMl90IHNpID0gQlRBX0pWX1JGQ19IRExfVE9fU0lEWChoYW5kbGUpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiaGFuZGxlPSIgPDwgbG9naGV4KGhhbmRsZSkgPDwgIiwgaGk9IiA8PCBoaQotICAgICAgICAgIDw8ICIsIHNpPSIgPDwgc2k7Ci0gIGlmIChoaSA+PSBCVEFfSlZfTUFYX1JGQ19DT05OIHx8ICFidGFfanZfY2IucmZjX2NiW2hpXS5wX2NiYWNrIHx8Ci0gICAgICBzaSA+PSBCVEFfSlZfTUFYX1JGQ19TUl9TRVNTSU9OIHx8ICFidGFfanZfY2IucmZjX2NiW2hpXS5yZmNfaGRsW3NpXSkgewotICAgIHJldHVybiBCVEFfSlZfRkFJTFVSRTsKLSAgfQotCi0gIFZMT0coMikgPDwgIndyaXRlIG9rIjsKLQotICB0QlRBX0pWX1JGQ19DQiogcF9jYiA9ICZidGFfanZfY2IucmZjX2NiW2hpXTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZidGFfanZfcmZjb21tX3dyaXRlLCBoYW5kbGUsIHJlcV9pZCwgcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGFfanZfY2IucG9ydF9jYltwX2NiLT5yZmNfaGRsW3NpXSAtIDFdKSk7Ci0gIHJldHVybiBCVEFfSlZfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICBCVEFfSlZTZXRQbVByb2ZpbGUKLSAqCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBzZXQgb3IgZnJlZSBwb3dlciBtb2RlIHByb2ZpbGUgZm9yIGRpZmZlcmVudCBKVgotICogICAgICAgICAgICAgIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICBoYW5kbGUsICBKViBoYW5kbGUgZnJvbSBSRkNPTU0gb3IgTDJDQVAKLSAqICAgICAgICAgICAgICBhcHBfaWQ6ICBhcHAgc3BlY2lmaWMgcG0gSUQsIGNhbiBiZSBCVEFfSlZfUE1fQUxMLCBzZWUKLSAqICAgICAgICAgICAgICAgICAgICAgICBidGFfZG1fY2ZnLmMgZm9yIGRldGFpbHMKLSAqICAgICAgICAgICAgICBCVEFfSlZfUE1fSURfQ0xFQVI6IHJlbW92ZXMgcG0gbWFuYWdlbWVudCBvbiB0aGUgaGFuZGxlLiBpbml0X3N0Ci0gKiAgICAgICAgICAgICAgaXMgaWdub3JlZCBhbmQgQlRBX0pWX0NPTk5fQ0xPU0UgaXMgY2FsbGVkIGltcGxpY2l0bHkKLSAqICAgICAgICAgICAgICBpbml0X3N0OiAgc3RhdGUgYWZ0ZXIgY2FsbGluZyB0aGlzIEFQSS4gdHlwaWNhbGx5IGl0IHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICBCVEFfSlZfQ09OTl9PUEVOCi0gKgotICogUmV0dXJucyAgICAgIEJUQV9KVl9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgQlRBX0pWX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKiBOT1RFOiAgICAgICAgQlRBX0pWX1BNX0lEX0NMRUFSOiBJbiBnZW5lcmFsIG5vIG5lZWQgdG8gYmUgY2FsbGVkIGFzIGp2IHBtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxscyBhdXRvbWF0aWNhbGx5Ci0gKiAgICAgICAgICAgICAgQlRBX0pWX0NPTk5fQ0xPU0UgdG8gcmVtb3ZlIGluIGNhc2Ugb2YgY29ubmVjdGlvbiBjbG9zZSEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9KVl9TVEFUVVMgQlRBX0p2U2V0UG1Qcm9maWxlKHVpbnQzMl90IGhhbmRsZSwgdEJUQV9KVl9QTV9JRCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9DT05OX1NUQVRFIGluaXRfc3QpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGhhbmRsZT0iIDw8IGxvZ2hleChoYW5kbGUpIDw8ICIsIGFwcF9pZDoiIDw8IGFwcF9pZDsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIEJpbmQoJmJ0YV9qdl9zZXRfcG1fcHJvZmlsZSwgaGFuZGxlLCBhcHBfaWQsIGluaXRfc3QpKTsKLSAgcmV0dXJuIEJUQV9KVl9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2p2L2J0YV9qdl9jZmcuY2MgYi9idGEvanYvYnRhX2p2X2NmZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxNjk5Yy4uMDAwMDAwMAotLS0gYS9idGEvanYvYnRhX2p2X2NmZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBjb21waWxlLXRpbWUgY29uZmlndXJhYmxlIGNvbnN0YW50cyBmb3IgYWR2YW5jZWQKLSAqICBhdWRpbwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfanZfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCmRpZmYgLS1naXQgYS9idGEvanYvYnRhX2p2X2ludC5oIGIvYnRhL2p2L2J0YV9qdl9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhMjYwZS4uMDAwMDAwMAotLS0gYS9idGEvanYvYnRhX2p2X2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHJpdmF0ZSBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIEJUQSBKYXZhIEkvRgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9KVl9JTlRfSAotI2RlZmluZSBCVEFfSlZfSU5UX0gKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2p2X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9yZmNkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUQV9KVl9SRkNfRVZfTUFTSwotI2RlZmluZSBCVEFfSlZfUkZDX0VWX01BU0sgXAotICAoUE9SVF9FVl9SWENIQVIgfCBQT1JUX0VWX1RYRU1QVFkgfCBQT1JUX0VWX0ZDIHwgUE9SVF9FVl9GQ1MpCi0jZW5kaWYKLQotZW51bSB7Ci0gIEJUQV9KVl9QTV9GUkVFX1NUID0gMCwgLyogZW1wdHkgUE0gc2xvdCAqLwotICBCVEFfSlZfUE1fSURMRV9TVCwKLSAgQlRBX0pWX1BNX0JVU1lfU1QKLX07Ci0KLS8qIEJUQSBKViBQTSBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IGhhbmRsZTsgICAgICAvKiBUaGUgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgdWludDhfdCBzdGF0ZTsgICAgICAgIC8qIHN0YXRlOiBzZWUgYWJvdmUgZW51bSAqLwotICB0QlRBX0pWX1BNX0lEIGFwcF9pZDsgLyogSlYgYXBwIHNwZWNpZmljIGlkIGluZGljYXRpbmcgcG93ZXIgdGFibGUgdG8gdXNlICovCi0gIFJhd0FkZHJlc3MgcGVlcl9iZF9hZGRyOyAvKiBQZWVyIEJEIGFkZHJlc3MgKi8KLX0gdEJUQV9KVl9QTV9DQjsKLQotZW51bSB7Ci0gIEJUQV9KVl9TVF9OT05FID0gMCwKLSAgQlRBX0pWX1NUX0NMX09QRU5JTkcsCi0gIEJUQV9KVl9TVF9DTF9PUEVOLAotICBCVEFfSlZfU1RfQ0xfQ0xPU0lORywKLSAgQlRBX0pWX1NUX1NSX0xJU1RFTiwKLSAgQlRBX0pWX1NUX1NSX09QRU4sCi0gIEJUQV9KVl9TVF9TUl9DTE9TSU5HCi19OwotdHlwZWRlZiB1aW50OF90IHRCVEFfSlZfU1RBVEU7Ci0jZGVmaW5lIEJUQV9KVl9TVF9DTF9NQVggQlRBX0pWX1NUX0NMX0NMT1NJTkcKLS8qIEpWIEwyQ0FQIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUQV9KVl9MMkNBUF9DQkFDSyogcF9jYmFjazsgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIHVpbnQxNl90IHBzbTsgICAgICAgICAgICAgICAgIC8qIHRoZSBwc20gdXNlZCBmb3IgdGhpcyBzZXJ2ZXIgY29ubmVjdGlvbiAqLwotICB0QlRBX0pWX1NUQVRFIHN0YXRlOyAgICAgICAgICAvKiB0aGUgc3RhdGUgb2YgdGhpcyBjb250cm9sIGJsb2NrICovCi0gIHRCVEFfU0VSVklDRV9JRCBzZWNfaWQ7ICAgICAgIC8qIHNlcnZpY2UgaWQgKi8KLSAgdWludDMyX3QgaGFuZGxlOyAvKiB0aGUgaGFuZGxlIHJlcG9ydGVkIHRvIGphdmEgYXBwIChzYW1lIGFzIGdhcCBoYW5kbGUpICovCi0gIGJvb2wgY29uZzsgICAgICAgLyogdHJ1ZSwgaWYgY29uZ2VzdGVkICovCi0gIHRCVEFfSlZfUE1fQ0IqIHBfcG1fY2I7IC8qIHB0ciB0byBwbSBjb250cm9sIGJsb2NrLCBOVUxMOiB1bnVzZWQgKi8KLSAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkOwotfSB0QlRBX0pWX0wyQ19DQjsKLQotI2RlZmluZSBCVEFfSlZfUkZDX0hETF9NQVNLIDB4RkYKLSNkZWZpbmUgQlRBX0pWX1JGQ09NTV9NQVNLIDB4ODAKLSNkZWZpbmUgQlRBX0pWX0FMTF9BUFBfSUQgMHhGRgotI2RlZmluZSBCVEFfSlZfUkZDX0hETF9UT19TSURYKHIpICgoKHIpJjB4RkYwMCkgPj4gOCkKLSNkZWZpbmUgQlRBX0pWX1JGQ19IX1NfVE9fSERMKGgsIHMpICgoaCkgfCAoKHMpIDw8IDgpKQotCi0vKiBwb3J0IGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgaGFuZGxlOyAgICAgIC8qIHRoZSByZmNvbW0gc2Vzc2lvbiBoYW5kbGUgYXQganYgKi8KLSAgdWludDE2X3QgcG9ydF9oYW5kbGU7IC8qIHBvcnQgaGFuZGxlICovCi0gIHRCVEFfSlZfU1RBVEUgc3RhdGU7ICAvKiB0aGUgc3RhdGUgb2YgdGhpcyBjb250cm9sIGJsb2NrICovCi0gIHVpbnQ4X3QgbWF4X3Nlc3M7ICAgICAvKiBtYXggc2Vzc2lvbnMgKi8KLSAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQ7Ci0gIGJvb2wgY29uZzsgICAgICAgICAgICAgIC8qIHRydWUsIGlmIGNvbmdlc3RlZCAqLwotICB0QlRBX0pWX1BNX0NCKiBwX3BtX2NiOyAvKiBwdHIgdG8gcG0gY29udHJvbCBibG9jaywgTlVMTDogdW51c2VkICovCi19IHRCVEFfSlZfUENCOwotCi0vKiBKViBSRkNPTU0gY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjazsgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIHVpbnQxNl90IHJmY19oZGxbQlRBX0pWX01BWF9SRkNfU1JfU0VTU0lPTl07Ci0gIHRCVEFfU0VSVklDRV9JRCBzZWNfaWQ7IC8qIHNlcnZpY2UgaWQgKi8KLSAgdWludDhfdCBoYW5kbGU7ICAgICAgICAgLyogaW5kZXg6IHRoZSBoYW5kbGUgcmVwb3J0ZWQgdG8gamF2YSBhcHAgKi8KLSAgdWludDhfdCBzY247ICAgICAgICAgICAgLyogdGhlIHNjbiBvZiB0aGUgc2VydmVyICovCi0gIHVpbnQ4X3QgbWF4X3Nlc3M7ICAgICAgIC8qIG1heCBzZXNzaW9ucyAqLwotICBpbnQgY3Vycl9zZXNzOyAgICAgICAgICAvKiBjdXJyZW50IHNlc3Npb25zIGNvdW50Ki8KLX0gdEJUQV9KVl9SRkNfQ0I7Ci0KLS8qIEpWIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogdGhlIFNEUCBoYW5kbGUgcmVwb3J0ZWQgdG8gSlYgdXNlciBpcyB0aGUgKGluZGV4ICsgMSkgdG8gc2RwX2hhbmRsZVtdLgotICAgKiBpZiBzZHBfaGFuZGxlW2ldPT0wLCBpdCdzIG5vdCB1c2VkLgotICAgKiBvdGhlcndpc2Ugc2RwX2hhbmRsZVtpXSBpcyB0aGUgc3RhY2sgU0RQIGhhbmRsZS4gKi8KLSAgdWludDMyX3Qgc2RwX2hhbmRsZVtCVEFfSlZfTUFYX1NEUF9SRUNdOyAvKiBTRFAgcmVjb3JkcyBjcmVhdGVkICovCi0gIHVpbnQ4X3QqIHBfc2VsX3Jhd19kYXRhOyAvKiB0aGUgcmF3IGRhdGEgb2YgbGFzdCBzZXJ2aWNlIHNlbGVjdCAqLwotICB0QlRBX0pWX0RNX0NCQUNLKiBwX2RtX2NiYWNrOwotICB0QlRBX0pWX0wyQ19DQiBsMmNfY2JbQlRBX0pWX01BWF9MMkNfQ09OTl07IC8qIGluZGV4IGlzIEdBUCBoYW5kbGUgKGluZGV4KSAqLwotICB0QlRBX0pWX1JGQ19DQiByZmNfY2JbQlRBX0pWX01BWF9SRkNfQ09OTl07Ci0gIHRCVEFfSlZfUENCIHBvcnRfY2JbTUFYX1JGQ19QT1JUU107ICAgICAgICAgIC8qIGluZGV4IG9mIHRoaXMgYXJyYXkgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBvcnRfaGFuZGxlLCAqLwotICB1aW50OF90IHNlY19pZFtCVEFfSlZfTlVNX1NFUlZJQ0VfSURdOyAgICAgICAvKiBzZXJ2aWNlIElEICovCi0gIGJvb2wgc2NuW0JUQV9KVl9NQVhfU0NOXTsgICAgICAgICAgICAgICAgICAgIC8qIFNDTiBhbGxvY2F0ZWQgYnkgamF2YSAqLwotICB1aW50MTZfdCBmcmVlX3BzbV9saXN0W0JUQV9KVl9NQVhfTDJDX0NPTk5dOyAvKiBQU01zIGZyZWVkIGJ5IGphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW4gYmUgcmV1c2VkKSAqLwotICB1aW50OF90IHNkcF9hY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWUgQlRBX0pWX1NEUF9BQ1RfKiAqLwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCB1dWlkIG9mIHNkcCBkaXNjb3ZlcnkqLwotICB0QlRBX0pWX1BNX0NCIHBtX2NiW0JUQV9KVl9QTV9NQVhfTlVNXTsgLyogUE0gb24gYSBwZXIgSlYgaGFuZGxlIGJhc2VzICovCi0KLSAgdWludDE2X3QgZHluX3BzbTsgLyogTmV4dCBkeW5hbWljIFBTTSB2YWx1ZSB0byB0cnkgdG8gYXNzaWduICovCi19IHRCVEFfSlZfQ0I7Ci0KLWVudW0gewotICBCVEFfSlZfU0RQX0FDVF9OT05FID0gMCwKLSAgQlRBX0pWX1NEUF9BQ1RfWUVTLCAgIC8qIHdhaXRpbmcgZm9yIFNEUCByZXN1bHQgKi8KLSAgQlRBX0pWX1NEUF9BQ1RfQ0FOQ0VMIC8qIHdhaXRpbmcgZm9yIGNhbmNlbCBjb21wbGV0ZSAqLwotfTsKLQotLyogSlYgY29udHJvbCBibG9jayAqLwotZXh0ZXJuIHRCVEFfSlZfQ0IgYnRhX2p2X2NiOwotCi1leHRlcm4gc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQxNl90PiB1c2VkX2wyY2FwX2NsYXNzaWNfZHluYW1pY19wc207Ci0KLWV4dGVybiB2b2lkIGJ0YV9qdl9lbmFibGUodEJUQV9KVl9ETV9DQkFDSyogcF9jYmFjayk7Ci1leHRlcm4gdm9pZCBidGFfanZfZGlzYWJsZSgpOwotZXh0ZXJuIHZvaWQgYnRhX2p2X2dldF9jaGFubmVsX2lkKGludDMyX3QgdHlwZSwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCk7Ci1leHRlcm4gdm9pZCBidGFfanZfZnJlZV9zY24oaW50MzJfdCB0eXBlLCB1aW50MTZfdCBzY24pOwotZXh0ZXJuIHZvaWQgYnRhX2p2X3N0YXJ0X2Rpc2NvdmVyeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBudW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpVdWlkKiB1dWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9qdl9jcmVhdGVfcmVjb3JkKHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9qdl9kZWxldGVfcmVjb3JkKHVpbnQzMl90IGhhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGFfanZfbDJjYXBfY29ubmVjdChpbnQzMl90IHR5cGUsIHRCVEFfU0VDIHNlY19tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9ST0xFIHJvbGUsIHVpbnQxNl90IHJlbW90ZV9wc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByeF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0NGR19JTkZPPiBjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0VSVE1fSU5GTz4gZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9MMkNBUF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCk7Ci1leHRlcm4gdm9pZCBidGFfanZfbDJjYXBfY2xvc2UodWludDMyX3QgaGFuZGxlLCB0QlRBX0pWX0wyQ19DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBidGFfanZfbDJjYXBfc3RhcnRfc2VydmVyKAotICAgIGludDMyX3QgdHlwZSwgdEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfSlZfUk9MRSByb2xlLCB1aW50MTZfdCBsb2NhbF9wc20sCi0gICAgdWludDE2X3QgcnhfbXR1LCBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0NGR19JTkZPPiBjZmdfcGFyYW0sCi0gICAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9FUlRNX0lORk8+IGVydG1faW5mbywgdEJUQV9KVl9MMkNBUF9DQkFDSyogcF9jYmFjaywKLSAgICB1aW50MzJfdCBsMmNhcF9zb2NrZXRfaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2p2X2wyY2FwX3N0b3Bfc2VydmVyKHVpbnQxNl90IGxvY2FsX3BzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsMmNhcF9zb2NrZXRfaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2p2X2wyY2FwX3dyaXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLCBCVF9IRFIqIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2VyX2lkLCB0QlRBX0pWX0wyQ19DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBidGFfanZfcmZjb21tX2Nvbm5lY3QodEJUQV9TRUMgc2VjX21hc2ssIHVpbnQ4X3QgcmVtb3RlX3NjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9KVl9SRkNPTU1fQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpOwotZXh0ZXJuIHZvaWQgYnRhX2p2X3JmY29tbV9jbG9zZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9qdl9yZmNvbW1fc3RhcnRfc2VydmVyKHRCVEFfU0VDIHNlY19tYXNrLCB1aW50OF90IGxvY2FsX3NjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ09NTV9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9qdl9yZmNvbW1fc3RvcF9zZXJ2ZXIodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCk7Ci1leHRlcm4gdm9pZCBidGFfanZfcmZjb21tX3dyaXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX1JGQ19DQiogcF9jYiwgdEJUQV9KVl9QQ0IqIHBfcGNiKTsKLWV4dGVybiB2b2lkIGJ0YV9qdl9zZXRfcG1fcHJvZmlsZSh1aW50MzJfdCBoYW5kbGUsIHRCVEFfSlZfUE1fSUQgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfQ09OTl9TVEFURSBpbml0X3N0KTsKLQotZXh0ZXJuIHZvaWQgYnRhX2p2X2wyY2FwX3N0b3Bfc2VydmVyX2xlKHVpbnQxNl90IGxvY2FsX2NoYW4pOwotCi0jZW5kaWYgLyogQlRBX0pWX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vY2xpZW50LmNjIGIvYnRhL2xlX2F1ZGlvL2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjNmUzZi4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vY2xpZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaD4KLQotI2luY2x1ZGUgImFkdmVydGlzZV9kYXRhX3BhcnNlci5oIgotI2luY2x1ZGUgImJ0YS9jc2lzL2NzaXNfdHlwZXMuaCIKLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWUuaCIKLSNpbmNsdWRlICJidGFfZ3JvdXBzLmgiCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImJ0bV9pc29fYXBpLmgiCi0jaW5jbHVkZSAiY2xpZW50X2F1ZGlvLmgiCi0jaW5jbHVkZSAiY2xpZW50X3BhcnNlci5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0jaW5jbHVkZSAiZW1iZHJ2L2xjMy9BcGkvTGMzRGVjb2Rlci5ocHAiCi0jaW5jbHVkZSAiZW1iZHJ2L2xjMy9BcGkvTGMzRW5jb2Rlci5ocHAiCi0jaW5jbHVkZSAiZ2F0dC9idGFfZ2F0dGNfaW50LmgiCi0jaW5jbHVkZSAibGVfYXVkaW9fdHlwZXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAic3RhdGVfbWFjaGluZS5oIgotCi11c2luZyBiYXNlOjpDbG9zdXJlOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgYmx1ZXRvb3RoOjpncm91cHM6OkRldmljZUdyb3VwczsKLXVzaW5nIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHNDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlcjsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9jbXBsX2V2dDsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX3JlbW92ZV9jbXBsX2V2dDsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Q2lnQ2FsbGJhY2tzOwotdXNpbmcgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6Q29ubmVjdGlvblN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBOb2RlU3RhdHVzOwotdXNpbmcgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdGF0dXM7Ci11c2luZyBibHVldG9vdGg6OmxlX2F1ZGlvOjpHcm91cFN0cmVhbVN0YXR1czsKLXVzaW5nIGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlOwotdXNpbmcgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cDsKLXVzaW5nIGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlR3JvdXBzOwotdXNpbmcgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2VzOwotdXNpbmcgbGVfYXVkaW86OkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6YXNlOwotdXNpbmcgbGVfYXVkaW86OnR5cGVzOjpBc2VTdGF0ZTsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6QXVkaW9Db250ZXh0czsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6QXVkaW9Mb2NhdGlvbnM7Ci11c2luZyBsZV9hdWRpbzo6dHlwZXM6OkF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6aGRsX3BhaXI7Ci11c2luZyBsZV9hdWRpbzo6dHlwZXM6OmtEZWZhdWx0U2NhbkR1cmF0aW9uUzsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlOwotCi11c2luZyBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6Ci0gICAga0N0cFJlc3BvbnNlQ29kZUludmFsaWRDb25maWd1cmF0aW9uUGFyYW1ldGVyVmFsdWU7Ci11c2luZyBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6a0N0cFJlc3BvbnNlQ29kZVN1Y2Nlc3M7Ci11c2luZyBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6a0N0cFJlc3BvbnNlSW52YWxpZEFzZUNpc01hcHBpbmc7Ci11c2luZyBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6a0N0cFJlc3BvbnNlTm9SZWFzb247Ci0KLW5hbWVzcGFjZSB7Ci12b2lkIGxlX2F1ZGlvX2dhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpOwotCi1jbGFzcyBMZUF1ZGlvQ2xpZW50SW1wbDsKLUxlQXVkaW9DbGllbnRJbXBsKiBpbnN0YW5jZTsKLUxlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlciogYXVkaW9TaW5rUmVjZWl2ZXI7Ci1MZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlciogYXVkaW9Tb3VyY2VSZWNlaXZlcjsKLUNpZ0NhbGxiYWNrcyogc3RhdGVNYWNoaW5lSGNpQ2FsbGJhY2tzOwotTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpDYWxsYmFja3MqIHN0YXRlTWFjaGluZUNhbGxiYWNrczsKLURldmljZUdyb3Vwc0NhbGxiYWNrcyogZGV2aWNlX2dyb3VwX2NhbGxiYWNrczsKLQotLyoKLSAqIENvb3JkaW5hdGV0IFNldCBJZGVudGlmaWNhdGlvbiBQcm9maWxlIChDU0lQKSBiYXNlZCBvbiBDU0lQIDEuMAotICogYW5kIENvb3JkaW5hdGV0IFNldCBJZGVudGlmaWNhdGlvbiBTZXJ2aWNlIChDU0lTKSAxLjAKLSAqCi0gKiBDU0lQIGFsbG93cyB0byBvcmdhbml6ZSBhdWRpbyBzZXJ2ZXJzIGludG8gc2V0cyBlLmcuIFN0ZXJlbyBTZXQsIDUuMSBTZXQKLSAqIGFuZCBzcGVlZCB1cCBjb25uZWN0aW5nIGl0LgotICoKLSAqIFNpbmNlIGxlYXVkaW8gaGFzIGFscmVhZHkgZ3JvdXBpbmcgQVBJIGl0IHdhcyBkZWNpZGVkIHRvIGludGVncmF0ZSBoZXJlIENTSVMKLSAqIGFuZCBhbGxvdyBpdCB0byBncm91cCBkZXZpY2VzIHNlbWktYXV0b21hdGljYWxseS4KLSAqCi0gKiBGbG93OgotICogSWYgY29ubmVjdGVkIGRldmljZSBjb250YWlucyBDU0lTIHNlcnZpY2VzLCBhbmQgaXQgaXMgaW5jbHVkZWQgaW50byBDQVAKLSAqIHNlcnZpY2UsIGltcGxlbWVudGF0aW9uIG1hcmtzIGRldmljZSBhcyBhIHNldCBtZW1iZXIgYW5kIHdhaXRzIGZvciB0aGUKLSAqIGJ0YS9jc2lzIHRvIGxlYXJuIGFib3V0IGdyb3VwcyBhbmQgbm90aWZ5IGltcGxlbWVudGF0aW9uIGFib3V0IGFzc2lnbmVkCi0gKiBncm91cCBpZC4KLSAqCi0gKi8KLS8qIExlQXVkaW9DbGllbnRJbXBsIGNsYXNzIHJlcHJlc2VudHMgbWFpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGUgYXVkaW8KLSAqIGZlYXR1cmUgaW4gc3RhY2suIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBHQVRULCBsZSBhdWRpbyBhbmQgSVNPIHJlbGF0ZWQgcGFydHMuCi0gKgotICogVGhpcyBjbGFzcyBpcyByZXByZXNlbnRlZCBpbiBzaW5nbGUgaW5zdGFuY2UgYW5kIG1hbmFnZXMgYSBncm91cCBvZiBkZXZpY2VzLAotICogYW5kIGRldmljZXMuIEFsbCBkZXZpY2VzIGNhbGxzIGJhY2sgc3RhdGljIG1ldGhvZCBmcm9tIGl0IGFuZCBhcmUgZGlzcGF0Y2hlZAotICogdG8gdGFyZ2V0IHJlY2VpdmVycyAoZS5nLiBBU0VzLCBkZXZpY2VzKS4KLSAqCi0gKiBUaGlzIGluc3RhbmNlIGFsc28gaW1wbGVtZW50cyBhIExlQXVkaW9DbGllbnQgd2hpY2ggaXMgYSB1cHBlciBsYXllciBBUEkuCi0gKiBBbHNvIExlQXVkaW9DbGllbnRDYWxsYmFja3MgYXJlIGNhbGxiYWNrcyBmb3IgdXBwZXIgbGF5ZXIuCi0gKgotICogVGhpcyBjbGFzcyBtYXkgYmUgYm9uZGVkIHdpdGggVGVzdCBzb2NrZXQgd2hpY2ggYWxsb3dzIHRvIGRyaXZlIGFuIGluc3RhbmNlCi0gKiBmb3IgdGVzdCBwdXJwb3Nlcy4KLSAqLwotY2xhc3MgTGVBdWRpb0NsaWVudEltcGwgOiBwdWJsaWMgTGVBdWRpb0NsaWVudCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5MZUF1ZGlvQ2xpZW50SW1wbCgpID0gZGVmYXVsdDsKLQotICBMZUF1ZGlvQ2xpZW50SW1wbCgKLSAgICAgIGJsdWV0b290aDo6bGVfYXVkaW86OkxlQXVkaW9DbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrc18sCi0gICAgICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkNhbGxiYWNrcyogc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfLAotICAgICAgYmFzZTo6Q2xvc3VyZSBpbml0Q2IpCi0gICAgICA6IGdhdHRfaWZfKDApLAotICAgICAgICBjYWxsYmFja3NfKGNhbGxiYWNrc18pLAotICAgICAgICBhY3RpdmVfZ3JvdXBfaWRfKGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSwKLSAgICAgICAgc3RyZWFtX3JlcXVlc3Rfc3RhcnRlZF8oZmFsc2UpLAotICAgICAgICBjdXJyZW50X2NvbnRleHRfdHlwZV8oTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQSksCi0gICAgICAgIGF1ZGlvX3NpbmtfcmVhZHlfdG9fcmVjZWl2ZShmYWxzZSksCi0gICAgICAgIGF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kKGZhbHNlKSwKLSAgICAgICAgY3VycmVudF9zb3VyY2VfY29kZWNfY29uZmlnKHswLCAwLCAwLCAwfSksCi0gICAgICAgIGN1cnJlbnRfc2lua19jb2RlY19jb25maWcoezAsIDAsIDAsIDB9KSwKLSAgICAgICAgbGMzX2VuY29kZXIobnVsbHB0ciksCi0gICAgICAgIGxjM19kZWNvZGVyKG51bGxwdHIpLAotICAgICAgICBhdWRpb19zb3VyY2VfaW5zdGFuY2VfKG51bGxwdHIpLAotICAgICAgICBhdWRpb19zaW5rX2luc3RhbmNlXyhudWxscHRyKSB7Ci0gICAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpJbml0aWFsaXplKHN0YXRlX21hY2hpbmVfY2FsbGJhY2tzXyk7Ci0gICAgZ3JvdXBTdGF0ZU1hY2hpbmVfID0gTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKTsKLQotICAgIEJUQV9HQVRUQ19BcHBSZWdpc3RlcigKLSAgICAgICAgbGVfYXVkaW9fZ2F0dGNfY2FsbGJhY2ssCi0gICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICBbXShiYXNlOjpDbG9zdXJlIGluaXRDYiwgdWludDhfdCBjbGllbnRfaWQsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2FuJ3Qgc3RhcnQgTGVBdWRpbyBwcm9maWxlIC0gbm8gZ2F0dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50cyBsZWZ0ISI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGluc3RhbmNlLT5nYXR0X2lmXyA9IGNsaWVudF9pZDsKLSAgICAgICAgICAgICAgaW5pdENiLlJ1bigpOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGluaXRDYiksCi0gICAgICAgIHRydWUpOwotCi0gICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+SW5pdGlhbGl6ZShkZXZpY2VfZ3JvdXBfY2FsbGJhY2tzKTsKLSAgfQotCi0gIHZvaWQgQXNlSW5pdGlhbFN0YXRlUmVhZFJlcXVlc3QoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIGludCBhc2VzX251bSA9IGxlQXVkaW9EZXZpY2UtPmFzZXNfLnNpemUoKTsKLSAgICB2b2lkKiBub3RpZnlfZmxhZ19wdHIgPSBOVUxMOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc2VzX251bTsgaSsrKSB7Ci0gICAgICAvKiBMYXN0IHJlYWQgYXNlIGNoYXJhY3RlcmlzdGljIHNob3VsZCBpc3N1ZSBjb25uZWN0ZWQgc3RhdGUgY2FsbGJhY2sKLSAgICAgICAqIHRvIHVwcGVyIGxheWVyCi0gICAgICAgKi8KLQotICAgICAgaWYgKGxlQXVkaW9EZXZpY2UtPm5vdGlmeV9jb25uZWN0ZWRfYWZ0ZXJfcmVhZF8gJiYKLSAgICAgICAgICAoaSA9PSAoYXNlc19udW0gLSAxKSkpIHsKLSAgICAgICAgbm90aWZ5X2ZsYWdfcHRyID0KLSAgICAgICAgICAgIElOVF9UT19QVFIobGVBdWRpb0RldmljZS0+bm90aWZ5X2Nvbm5lY3RlZF9hZnRlcl9yZWFkXyk7Ci0gICAgICB9Ci0KLSAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+YXNlc19baV0uaGRscy52YWxfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25HYXR0UmVhZFJzcFN0YXRpYywgbm90aWZ5X2ZsYWdfcHRyKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBBZGRlZENiKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3MgPDwgIiBncm91cCB1dWlkICIgPDwgdXVpZAotICAgICAgICAgICAgICA8PCAiIGdyb3VwX2lkOiAiIDw8IGdyb3VwX2lkOwotCi0gICAgLyogV2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGdyb3VwcyB3aGljaCBhcmUgaW4gdGhlIGNvbnRleHQgb2YgQ0FQICovCi0gICAgaWYgKHV1aWQgIT0gbGVfYXVkaW86OnV1aWQ6OmtDYXBTZXJ2aWNlVXVpZCkgcmV0dXJuOwotCi0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghbGVBdWRpb0RldmljZSkgcmV0dXJuOwotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8gIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgIDw8ICIgZ3JvdXAgYWxyZWFkeSBzZXQ6ICIgPDwgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdyb3VwX2FkZF9ub2RlKGdyb3VwX2lkLCBhZGRyZXNzKTsKLSAgfQotCi0gIHZvaWQgT25Hcm91cE1lbWJlckFkZGVkQ2IoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IGdyb3VwX2lkKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgIDw8ICIgZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0KLSAgICBhdXRvIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChncm91cF9pZCk7Ci0gICAgaWYgKCFncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdCBpbnRlcmVzdGVkIGluIGdyb3VwIGlkOiAiIDw8IGdyb3VwX2lkOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWxlQXVkaW9EZXZpY2UpIHJldHVybjsKLSAgICBpZiAobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiIGdyb3VwIGFscmVhZHkgc2V0OiAiIDw8IGxlQXVkaW9EZXZpY2UtPmdyb3VwX2lkXzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBncm91cF9hZGRfbm9kZShncm91cF9pZCwgYWRkcmVzcyk7Ci0gIH0KLQotICB2b2lkIE9uR3JvdXBNZW1iZXJSZW1vdmVkQ2IoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IGdyb3VwX2lkKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgIDw8ICIgZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0KLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gbGVBdWRpb0RldmljZXNfLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSByZXR1cm47Ci0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmdyb3VwX2lkXyA9PSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIGFscmVhZHkgbm90IGFzc2lnbmVkIHRvIHRoZSBncm91cC4iOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGdyb3VwX2lkKTsKLSAgICBpZiAoZ3JvdXAgPT0gTlVMTCkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIiBkZXZpY2Ugbm90IGluIHRoZSBncm91cDogIiA8PCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXwotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgZ3JvdXBfaWQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZ3JvdXBfcmVtb3ZlX25vZGUoZ3JvdXAsIGFkZHJlc3MpOwotICB9Ci0KLSAgLyogVGhpcyBjYWxsYmFjayBoYXBwZW5zIGlmIGtMZUF1ZGlvRGV2aWNlU2V0U3RhdGVUaW1lb3V0TXMgdGltZW91dCBoYXBwZW5zCi0gICAqIGR1cmluZyB0cmFuc2l0aW9uIGZyb20gb3JpZ2luIHRvIHRhcmdldCBzdGF0ZQotICAgKi8KLSAgdm9pZCBPbkxlQXVkaW9EZXZpY2VTZXRTdGF0ZVRpbWVvdXQoaW50IGdyb3VwX2lkKSB7Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZ3JvdXBfaWQpOwotCi0gICAgaWYgKCFncm91cCkgewotICAgICAgLyogR3JvdXAgcmVtb3ZlZCAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFJlbGVhc2VtZW50IGRpZG4ndCBmaW5pc2hlZCBpbiB0aW1lICovCi0gICAgaWYgKGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpIHsKLSAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICAgIExPR19BU1NFUlQobGVBdWRpb0RldmljZSkKLSAgICAgICAgICA8PCBfX2Z1bmNfXyA8PCAiIFNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgZGV2aWNlLiI7Ci0KLSAgICAgIGRvIHsKLSAgICAgICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+RGlzY29ubmVjdERldmljZShsZUF1ZGlvRGV2aWNlLCB0cnVlKTsKLSAgICAgICAgbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXROZXh0QWN0aXZlRGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgfSB3aGlsZSAobGVBdWRpb0RldmljZSk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIFN0YXRlIG5vdCBhY2hpZXZlZCBvbiB0aW1lLCByZWxlYXNpbmcgYXNlcyI7Ci0KLSAgICBncm91cFN0YXRlTWFjaGluZV8tPlN0b3BTdHJlYW0oZ3JvdXApOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVDb250ZXh0QW5kTG9jYXRpb25zKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgc3RkOjpvcHRpb25hbDxBdWRpb0NvbnRleHRzPiBuZXdfZ3JvdXBfdXBkYXRlZF9jb250ZXh0cyA9Ci0gICAgICAgIGdyb3VwLT5VcGRhdGVBY3RpdmVDb250ZXh0c01hcChsZUF1ZGlvRGV2aWNlLT5HZXRBdmFpbGFibGVDb250ZXh0cygpKTsKLQotICAgIGlmIChuZXdfZ3JvdXBfdXBkYXRlZF9jb250ZXh0cyB8fCBncm91cC0+UmVsb2FkQXVkaW9Mb2NhdGlvbnMoKSkgewotICAgICAgY2FsbGJhY2tzXy0+T25BdWRpb0NvbmYoZ3JvdXAtPmF1ZGlvX2RpcmVjdGlvbnNfLCBncm91cC0+Z3JvdXBfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPnNua19hdWRpb19sb2NhdGlvbnNfLnRvX3Vsb25nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+c3JjX2F1ZGlvX2xvY2F0aW9uc18udG9fdWxvbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19ncm91cF91cGRhdGVkX2NvbnRleHRzLT50b191bG9uZygpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gICAgaWYgKGF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kKSB7Ci0gICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgICAgIGF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvX3NpbmtfcmVhZHlfdG9fcmVjZWl2ZSkgewotICAgICAgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6Q2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpOwotICAgICAgYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb250cm9sUG9pbnROb3RpZmljYXRpb25IYW5kbGVyKAotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpjdHBfbnRmJiBudGYpIHsKLSAgICBmb3IgKGF1dG8mIGVudHJ5IDogbnRmLmVudHJpZXMpIHsKLSAgICAgIHN3aXRjaCAoZW50cnkucmVzcG9uc2VfY29kZSkgewotICAgICAgICBjYXNlIGtDdHBSZXNwb25zZUNvZGVJbnZhbGlkQ29uZmlndXJhdGlvblBhcmFtZXRlclZhbHVlOgotICAgICAgICAgIHN3aXRjaCAoZW50cnkucmVhc29uKSB7Ci0gICAgICAgICAgICBjYXNlIGtDdHBSZXNwb25zZUludmFsaWRBc2VDaXNNYXBwaW5nOgotICAgICAgICAgICAgICBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBrQ3RwUmVzcG9uc2VOb1JlYXNvbjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrQ3RwUmVzcG9uc2VDb2RlU3VjY2VzczoKLSAgICAgICAgICBGQUxMVEhST1VHSDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIGdyb3VwX2FkZF9ub2RlKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICBib29sIHVwZGF0ZV9ncm91cF9tb2R1bGUgPSBmYWxzZSkgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIG5ld19ncm91cDsKLSAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIG9sZF9ncm91cCA9IG51bGxwdHI7Ci0gICAgaW50IG9sZF9ncm91cF9pZCA9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duOwotCi0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICAvKiBUT0RPIFRoaXMgcGFydCBwb3NzaWJsZSB0byByZW1vdmUgYXMgdGhpcyBpcyB0byBoYW5kbGUgYWRkaW5nIGRldmljZSB0bwotICAgICAgICogdGhlIGdyb3VwIHdoaWNoIGlzIHVua25vd24gYW5kIG5vdCBjb25uZWN0ZWQuCi0gICAgICAgKi8KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBsZUF1ZGlvRGV2aWNlIHVua25vd24gLCBhZGRyZXNzOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICA8PCAiIGdyb3VwOiAiIDw8IGxvZ2hleChncm91cF9pZCk7Ci0KLSAgICAgIGlmIChncm91cF9pZCA9PSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgcmV0dXJuOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIlNldCBtZW1iZXIgYWRkaW5nIC4uLiI7Ci0gICAgICBsZUF1ZGlvRGV2aWNlc18uQWRkKGFkZHJlc3MsIHRydWUpOwotICAgICAgbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICAgIG9sZF9ncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLSAgICAgICAgb2xkX2dyb3VwX2lkID0gb2xkX2dyb3VwLT5ncm91cF9pZF87Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBpZCA9IERldmljZUdyb3Vwczo6R2V0KCktPkdldEdyb3VwSWQoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6a0NhcFNlcnZpY2VVdWlkKTsKLSAgICBpZiAoZ3JvdXBfaWQgPT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIGlmIChpZCA9PSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgewotICAgICAgICBEZXZpY2VHcm91cHM6OkdldCgpLT5BZGREZXZpY2UoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprQ2FwU2VydmljZVV1aWQpOwotICAgICAgICAvKiBXZSB3aWxsIGdldCBiYWNrIGhlcmUgd2hlbiBncm91cCB3aWxsIGJlIGNyZWF0ZWQgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBuZXdfZ3JvdXAgPSBhc2VHcm91cHNfLkFkZChpZCk7Ci0gICAgICBpZiAoIW5ld19ncm91cCkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgY2FuJ3QgY3JlYXRlIGdyb3VwIC0gZ3JvdXAgaXMgYWxyZWFkeSB0aGVyZT8iOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19BU1NFUlQoaWQgPT0gZ3JvdXBfaWQpCi0gICAgICAgICAgPDwgIiBncm91cCBpZCBtaXNzbWF0Y2g/IGxlYXVkaW8gaWQ6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICA8PCAiIGdyb3VwcyBtb2R1bGUgIiA8PCBpZDsKLSAgICAgIG5ld19ncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZ3JvdXBfaWQpOwotICAgICAgaWYgKCFuZXdfZ3JvdXApIHsKLSAgICAgICAgbmV3X2dyb3VwID0gYXNlR3JvdXBzXy5BZGQoZ3JvdXBfaWQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG5ld19ncm91cC0+SXNEZXZpY2VJblRoZUdyb3VwKGxlQXVkaW9EZXZpY2UpKSByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgZGV2aWNlIHdhcyBpbiB0aGUgZ3JvdXAgYW5kIGl0IHdhcyBub3QgcmVtb3ZlZCBieSB0aGUgYXBwbGljYXRpb24sCi0gICAgICogbGV0cyBkbyBpdCBub3cKLSAgICAgKi8KLSAgICBpZiAob2xkX2dyb3VwKSBncm91cF9yZW1vdmVfbm9kZShvbGRfZ3JvdXAsIGFkZHJlc3MsIHVwZGF0ZV9ncm91cF9tb2R1bGUpOwotCi0gICAgbmV3X2dyb3VwLT5BZGROb2RlKGxlQXVkaW9EZXZpY2VzXy5HZXRCeUFkZHJlc3MoYWRkcmVzcykpOwotCi0gICAgY2FsbGJhY2tzXy0+T25Hcm91cE5vZGVTdGF0dXMoYWRkcmVzcywgbmV3X2dyb3VwLT5ncm91cF9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBOb2RlU3RhdHVzOjpBRERFRCk7Ci0KLSAgICAvKiBJZiBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBhZGRlZCB0byB0aGUgZ3JvdXAsIGxldHMgcmVhZCBBU0Ugc3RhdGVzICovCi0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfICE9IEdBVFRfSU5WQUxJRF9DT05OX0lEKQotICAgICAgQXNlSW5pdGlhbFN0YXRlUmVhZFJlcXVlc3QobGVBdWRpb0RldmljZSk7Ci0KLSAgICAvKiBHcm91cCBtYXkgYmUgZGVzdHJveWVkIG9uY2UgbW92ZWQgaXRzIGxhc3Qgbm9kZSB0byBuZXcgZ3JvdXAgKi8KLSAgICBpZiAoYXNlR3JvdXBzXy5GaW5kQnlJZChvbGRfZ3JvdXBfaWQpICE9IG51bGxwdHIpIHsKLSAgICAgIC8qIFJlbW92aW5nIG5vZGUgZnJvbSBncm91cCBtYXkgdG91Y2ggaXRzIGNvbnRleHQgaW50ZWdyaXR5ICovCi0gICAgICBzdGQ6Om9wdGlvbmFsPEF1ZGlvQ29udGV4dHM+IG9sZF9ncm91cF91cGRhdGVkX2NvbnRleHRzID0KLSAgICAgICAgICBvbGRfZ3JvdXAtPlVwZGF0ZUFjdGl2ZUNvbnRleHRzTWFwKG9sZF9ncm91cC0+R2V0QWN0aXZlQ29udGV4dHMoKSk7Ci0KLSAgICAgIGlmIChvbGRfZ3JvdXBfdXBkYXRlZF9jb250ZXh0cyB8fCBvbGRfZ3JvdXAtPlJlbG9hZEF1ZGlvTG9jYXRpb25zKCkpIHsKLSAgICAgICAgY2FsbGJhY2tzXy0+T25BdWRpb0NvbmYob2xkX2dyb3VwLT5hdWRpb19kaXJlY3Rpb25zXywgb2xkX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZ3JvdXAtPnNua19hdWRpb19sb2NhdGlvbnNfLnRvX3Vsb25nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9ncm91cC0+c3JjX2F1ZGlvX2xvY2F0aW9uc18udG9fdWxvbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2dyb3VwX3VwZGF0ZWRfY29udGV4dHMtPnRvX3Vsb25nKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIFVwZGF0ZUNvbnRleHRBbmRMb2NhdGlvbnMobmV3X2dyb3VwLCBsZUF1ZGlvRGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgR3JvdXBBZGROb2RlKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIGF1dG8gaWQgPSBEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtDYXBTZXJ2aWNlVXVpZCk7Ci0gICAgaWYgKGlkID09IGdyb3VwX2lkKSByZXR1cm47Ci0KLSAgICBpZiAoaWQgIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIERldmljZUdyb3Vwczo6R2V0KCktPlJlbW92ZURldmljZShhZGRyZXNzLCBpZCk7Ci0gICAgfQotCi0gICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKGFkZHJlc3MsIGxlX2F1ZGlvOjp1dWlkOjprQ2FwU2VydmljZVV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkKTsKLSAgfQotCi0gIHZvaWQgcmVtb3ZlX2dyb3VwX2lmX3Bvc3NpYmxlKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXApIHsKLSAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAtPklzRW1wdHkoKSAmJiAhZ3JvdXAtPmNpZ19jcmVhdGVkXykgewotICAgICAgYXNlR3JvdXBzXy5SZW1vdmUoZ3JvdXAtPmdyb3VwX2lkXyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBncm91cF9yZW1vdmVfbm9kZShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXBkYXRlX2dyb3VwX21vZHVsZSA9IGZhbHNlKSB7Ci0gICAgaW50IGdyb3VwX2lkID0gZ3JvdXAtPmdyb3VwX2lkXzsKLSAgICBncm91cC0+UmVtb3ZlTm9kZShsZUF1ZGlvRGV2aWNlc18uR2V0QnlBZGRyZXNzKGFkZHJlc3MpKTsKLQotICAgIGlmICh1cGRhdGVfZ3JvdXBfbW9kdWxlKSB7Ci0gICAgICBpbnQgZ3JvdXBzX2dyb3VwX2lkID0gRGV2aWNlR3JvdXBzOjpHZXQoKS0+R2V0R3JvdXBJZCgKLSAgICAgICAgICBhZGRyZXNzLCBsZV9hdWRpbzo6dXVpZDo6a0NhcFNlcnZpY2VVdWlkKTsKLSAgICAgIGlmIChncm91cHNfZ3JvdXBfaWQgPT0gZ3JvdXBfaWQpIHsKLSAgICAgICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+UmVtb3ZlRGV2aWNlKGFkZHJlc3MsIGdyb3VwX2lkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYWxsYmFja3NfLT5Pbkdyb3VwTm9kZVN0YXR1cyhhZGRyZXNzLCBncm91cF9pZCwgR3JvdXBOb2RlU3RhdHVzOjpSRU1PVkVEKTsKLQotICAgIC8qIFJlbW92ZSBncm91cCBpZiB0aGlzIHdhcyB0aGUgbGFzdCBsZUF1ZGlvRGV2aWNlIGluIHRoaXMgZ3JvdXAgKi8KLSAgICBpZiAoZ3JvdXAtPklzRW1wdHkoKSkgewotICAgICAgcmVtb3ZlX2dyb3VwX2lmX3Bvc3NpYmxlKGdyb3VwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBSZW1vdmluZyBub2RlIGZyb20gZ3JvdXAgdG91Y2ggaXRzIGNvbnRleHQgaW50ZWdyaXR5ICovCi0gICAgc3RkOjpvcHRpb25hbDxBdWRpb0NvbnRleHRzPiB1cGRhdGVkX2NvbnRleHRzID0KLSAgICAgICAgZ3JvdXAtPlVwZGF0ZUFjdGl2ZUNvbnRleHRzTWFwKGdyb3VwLT5HZXRBY3RpdmVDb250ZXh0cygpKTsKLQotICAgIGlmICh1cGRhdGVkX2NvbnRleHRzIHx8IGdyb3VwLT5SZWxvYWRBdWRpb0xvY2F0aW9ucygpKQotICAgICAgY2FsbGJhY2tzXy0+T25BdWRpb0NvbmYoZ3JvdXAtPmF1ZGlvX2RpcmVjdGlvbnNfLCBncm91cC0+Z3JvdXBfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPnNua19hdWRpb19sb2NhdGlvbnNfLnRvX3Vsb25nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+c3JjX2F1ZGlvX2xvY2F0aW9uc18udG9fdWxvbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfY29udGV4dHMtPnRvX3Vsb25nKCkpOwotICB9Ci0KLSAgdm9pZCBHcm91cFJlbW92ZU5vZGUoY29uc3QgaW50IGdyb3VwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGdyb3VwX2lkKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdyb3VwX2lkOiAiIDw8IGdyb3VwX2lkCi0gICAgICAgICAgICAgIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzOwotCi0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIFNraXBwaW5nIHVua25vd24gbGVBdWRpb0RldmljZSwgYWRkcmVzczogIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8gIT0gZ3JvdXBfaWQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkRldmljZSBpcyBub3QgaW4gZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICAgICAgICAgPDwgIiwgYnV0IGluIGdyb3VwX2lkOiAiIDw8IGxlQXVkaW9EZXZpY2UtPmdyb3VwX2lkXzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXAgPT0gTlVMTCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZSBub3QgaW4gdGhlIGdyb3VwID8hIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBncm91cF9yZW1vdmVfbm9kZShncm91cCwgYWRkcmVzcywgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIEdyb3VwU3RyZWFtKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgdWludDE2X3QgY29udGV4dF90eXBlKSBvdmVycmlkZSB7Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZ3JvdXBfaWQpOwotICAgIGF1dG8gZmluYWxfY29udGV4dF90eXBlID0gY29udGV4dF90eXBlOwotCi0gICAgaWYgKGNvbnRleHRfdHlwZSA+PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oTGVBdWRpb0NvbnRleHRUeXBlOjpSRlUpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHN0cmVhbSBjb250ZXh0IHR5cGUgaXMgbm90IHN1cHBvcnRlZDogIgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY29udGV4dF90eXBlKTsKLSAgICAgIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHVua25vd24gZ3JvdXAgaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0gICAgICBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBzdXBwb3J0ZWRfY29udGV4dF90eXBlID0gZ3JvdXAtPkdldEFjdGl2ZUNvbnRleHRzKCk7Ci0gICAgaWYgKCEoY29udGV4dF90eXBlICYgc3VwcG9ydGVkX2NvbnRleHRfdHlwZS50b191bG9uZygpKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiIFVuc3VwcG9ydGVkIGNvbnRleHQgdHlwZSBieSByZW1vdGUgZGV2aWNlOiAiCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjb250ZXh0X3R5cGUpIDw8ICIuIFN3aXRjaGluZyB0byB1bnNwZWNpZmllZCI7Ci0gICAgICBmaW5hbF9jb250ZXh0X3R5cGUgPQotICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihMZUF1ZGlvQ29udGV4dFR5cGU6OlVOU1BFQ0lGSUVEKTsKLSAgICB9Ci0KLSAgICBpZiAoIWdyb3VwLT5Jc0FueURldmljZUNvbm5lY3RlZCgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGdyb3VwICIgPDwgZ3JvdXBfaWQgPDwgIiBpcyBub3QgY29ubmVjdGVkICI7Ci0gICAgICBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgYW55IGdyb3VwIGlzIGluIHRoZSB0cmFuc2l0aW9uIHN0YXRlLiBJZiBzbywgd2UgZG9uJ3QgYWxsb3cgdG8KLSAgICAgKiBzdGFydCBuZXcgZ3JvdXAgdG8gc3RyZWFtICovCi0gICAgaWYgKGFzZUdyb3Vwc18uSXNBbnlJblRyYW5zaXRpb24oKSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc29tZSBncm91cCBpcyBhbHJlYWR5IGluIHRoZSB0cmFuc2l0aW9uIHN0YXRlIjsKLSAgICAgIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXBTdGF0ZU1hY2hpbmVfLT5TdGFydFN0cmVhbSgKLSAgICAgICAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDxMZUF1ZGlvQ29udGV4dFR5cGU+KGZpbmFsX2NvbnRleHRfdHlwZSkpKQotICAgICAgc3RyZWFtX3JlcXVlc3Rfc3RhcnRlZF8gPSB0cnVlOwotICAgIGVsc2UKLSAgICAgIENsaWVudEF1ZGlvSW50ZWZyYWNlUmVsZWFzZSgpOwotICB9Ci0KLSAgdm9pZCBHcm91cFN1c3BlbmQoY29uc3QgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZ3JvdXBfaWQpOwotCi0gICAgaWYgKCFncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCB1bmtub3duIGdyb3VwIGlkOiAiIDw8IGdyb3VwX2lkOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZ3JvdXAtPklzQW55RGV2aWNlQ29ubmVjdGVkKCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgZ3JvdXAgaXMgbm90IGNvbm5lY3RlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGdyb3VwLT5Jc0luVHJhbnNpdGlvbigpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiLCBncm91cCBpcyBpbiB0cmFuc2l0aW9uIGZyb206ICIgPDwgZ3JvdXAtPkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICA8PCAiLCB0bzogIiA8PCBncm91cC0+R2V0VGFyZ2V0U3RhdGUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgIT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIGludmFsaWQgY3VycmVudCBzdGF0ZSBvZiBncm91cDogIiA8PCBncm91cC0+R2V0U3RhdGUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCA9IGZhbHNlOwotICAgIGF1ZGlvX3NpbmtfcmVhZHlfdG9fcmVjZWl2ZSA9IGZhbHNlOwotCi0gICAgZ3JvdXBTdGF0ZU1hY2hpbmVfLT5TdXNwZW5kU3RyZWFtKGdyb3VwKTsKLSAgfQotCi0gIHZvaWQgR3JvdXBTdG9wKGNvbnN0IGludCBncm91cF9pZCkgb3ZlcnJpZGUgewotICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGdyb3VwX2lkKTsKLQotICAgIGlmICghZ3JvdXApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgdW5rbm93biBncm91cCBpZDogIiA8PCBncm91cF9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXAtPklzRW1wdHkoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBncm91cCBpcyBlbXB0eSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGdyb3VwLT5HZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiwgZ3JvdXAgYWxyZWFkeSBzdG9wcGVkOiAiIDw8IGdyb3VwLT5HZXRTdGF0ZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdyb3VwU3RhdGVNYWNoaW5lXy0+U3RvcFN0cmVhbShncm91cCk7Ci0gIH0KLQotICB2b2lkIEdyb3VwRGVzdHJveShjb25zdCBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChncm91cF9pZCk7Ci0KLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHVua25vd24gZ3JvdXAgaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRGlzY29ubmVjdCBhbmQgcmVtb3ZlIGVhY2ggZGV2aWNlIHdpdGhpbiB0aGUgZ3JvdXAKLSAgICBhdXRvKiBkZXYgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgICB3aGlsZSAoZGV2KSB7Ci0gICAgICBhdXRvKiBuZXh0X2RldiA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGRldik7Ci0gICAgICBSZW1vdmVEZXZpY2UoZGV2LT5hZGRyZXNzXyk7Ci0gICAgICBkZXYgPSBuZXh0X2RldjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEdyb3VwU2V0QWN0aXZlKGNvbnN0IGludCBncm91cF9pZCkgb3ZlcnJpZGUgewotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBncm91cF9pZDogIiA8PCBncm91cF9pZDsKLQotICAgIGlmIChncm91cF9pZCA9PSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgewotICAgICAgaWYgKGFjdGl2ZV9ncm91cF9pZF8gPT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIFN0b3BBdWRpbygpOwotICAgICAgR3JvdXBTdG9wKGFjdGl2ZV9ncm91cF9pZF8pOwotICAgICAgY2FsbGJhY2tzXy0+T25Hcm91cFN0YXR1cyhhY3RpdmVfZ3JvdXBfaWRfLCBHcm91cFN0YXR1czo6SU5BQ1RJVkUpOwotICAgICAgYWN0aXZlX2dyb3VwX2lkXyA9IGdyb3VwX2lkOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZ3JvdXBfaWQpOwotICAgIGlmICghZ3JvdXApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiwgSW52YWxpZCBncm91cDogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGdyb3VwX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYWN0aXZlX2dyb3VwX2lkXyAhPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIEFub3RoZXIgZ3JvdXAgYWxyZWFkeSBhY3RpdmU6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFjdGl2ZV9ncm91cF9pZF8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghYXVkaW9fc291cmNlX2luc3RhbmNlXykgewotICAgICAgYXVkaW9fc291cmNlX2luc3RhbmNlXyA9IExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6QWNxdWlyZSgpOwotICAgICAgaWYgKCFhdWRpb19zb3VyY2VfaW5zdGFuY2VfKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgY291bGQgbm90IGFjcXVpcmUgYXVkaW8gc291cmNlIGludGVyZmFjZSI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWF1ZGlvX3NpbmtfaW5zdGFuY2VfKSB7Ci0gICAgICBhdWRpb19zaW5rX2luc3RhbmNlXyA9IExlQXVkaW9DbGllbnRBdWRpb1Npbms6OkFjcXVpcmUoKTsKLSAgICAgIGlmICghYXVkaW9fc2lua19pbnN0YW5jZV8pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBjb3VsZCBub3QgYWNxdWlyZSBhdWRpbyBzaW5rIGludGVyZmFjZSI7Ci0gICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6UmVsZWFzZShhdWRpb19zb3VyY2VfaW5zdGFuY2VfKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIENvbmZpZ3VyZSBhdWRpbyBIQUwgc2Vzc2lvbnMgd2l0aCBtb3N0IGZyZXF1ZW50IGNvbnRleHQgKi8KLSAgICBVcGRhdGVDdXJyZW50SGFsU2Vzc2lvbnMoZ3JvdXBfaWQsIExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUEpOwotICAgIGlmIChjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcuSXNJbnZhbGlkKCkgJiYKLSAgICAgICAgY3VycmVudF9zaW5rX2NvZGVjX2NvbmZpZy5Jc0ludmFsaWQoKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIHVuc3VwcG9ydGVkIGRldmljZSBjb25maWd1cmF0aW9ucyI7Ci0gICAgICBjYWxsYmFja3NfLT5Pbkdyb3VwU3RhdHVzKGFjdGl2ZV9ncm91cF9pZF8sIEdyb3VwU3RhdHVzOjpJTkFDVElWRSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYWN0aXZlX2dyb3VwX2lkXyA9IGdyb3VwX2lkOwotICAgIGNhbGxiYWNrc18tPk9uR3JvdXBTdGF0dXMoYWN0aXZlX2dyb3VwX2lkXywgR3JvdXBTdGF0dXM6OkFDVElWRSk7Ci0gIH0KLQotICB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXyAhPSBHQVRUX0lOVkFMSURfQ09OTl9JRCkgewotICAgICAgRGlzY29ubmVjdChhZGRyZXNzKTsKLSAgICAgIGxlQXVkaW9EZXZpY2UtPnJlbW92aW5nX2RldmljZV8gPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFJlbW92ZSB0aGUgZ3JvdXAgYXNzaWdubWVudCBpZiBub3QgeWV0IHJlbW92ZWQuIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZQotICAgICAqIGdyb3VwIG1vZHVsZSBoYXMgYWxyZWFkeSBjYWxsZWQgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGFuZCB3ZSBoYXZlCi0gICAgICogYWxyZWFkeSByZW1vdmVkIHRoZSBncm91cCBhc3NpZ25tZW50LgotICAgICAqLwotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8gIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIGF1dG8gZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGxlQXVkaW9EZXZpY2UtPmdyb3VwX2lkXyk7Ci0gICAgICBncm91cF9yZW1vdmVfbm9kZShncm91cCwgYWRkcmVzcywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgbGVBdWRpb0RldmljZXNfLlJlbW92ZShhZGRyZXNzKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgbGVBdWRpb0RldmljZXNfLkFkZChhZGRyZXNzLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgbGVBdWRpb0RldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseV8gPSB0cnVlOwotICAgIH0KLQotICAgIEJUQV9HQVRUQ19PcGVuKGdhdHRfaWZfLCBhZGRyZXNzLCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBHZXRHcm91cERldmljZXMoY29uc3QgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZ3JvdXBfaWQpOwotICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGFsbF9ncm91cF9kZXZpY2VfYWRkcnM7Ci0KLSAgICBpZiAoZ3JvdXAgIT0gbnVsbHB0cikgewotICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICAgICAgd2hpbGUgKGxlQXVkaW9EZXZpY2UpIHsKLSAgICAgICAgYWxsX2dyb3VwX2RldmljZV9hZGRycy5wdXNoX2JhY2sobGVBdWRpb0RldmljZS0+YWRkcmVzc18pOwotICAgICAgICBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHREZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICB9OwotICAgIH0KLQotICAgIHJldHVybiBhbGxfZ3JvdXBfZGV2aWNlX2FkZHJzOwotICB9Ci0KLSAgLyogUmVzdG9yZSBwYWlyZWQgZGV2aWNlIGZyb20gc3RvcmFnZSB0byByZWNyZWF0ZSBncm91cHMgKi8KLSAgdm9pZCBBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBib29sIGF1dG9jb25uZWN0KSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIHJlc3RvcmluZzogIiA8PCBhZGRyZXNzOwotCi0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICBsZUF1ZGlvRGV2aWNlc18uQWRkKGFkZHJlc3MsIGZhbHNlKTsKLSAgICAgIGxlQXVkaW9EZXZpY2UgPSBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBpbnQgZ3JvdXBfaWQgPSBEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKAotICAgICAgICBhZGRyZXNzLCBsZV9hdWRpbzo6dXVpZDo6a0NhcFNlcnZpY2VVdWlkKTsKLSAgICBpZiAoZ3JvdXBfaWQgIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIGdyb3VwX2FkZF9ub2RlKGdyb3VwX2lkLCBhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBpZiAoYXV0b2Nvbm5lY3QpIHsKLSAgICAgIEJUQV9HQVRUQ19PcGVuKGdhdHRfaWZfLCBhZGRyZXNzLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgQmFja2dyb3VuZENvbm5lY3RJZkdyb3VwQ29ubmVjdGVkKExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8IGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfIDsKLSAgICBhdXRvIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8pOwotICAgIGlmICghZ3JvdXApIHsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBEZXZpY2UgaXMgbm90IHlldCBwYXJ0IG9mIHRoZSBncm91cC4gIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWdyb3VwLT5Jc0FueURldmljZUNvbm5lY3RlZCgpKSB7Ci0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXA6ICIgPDwgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfCi0gICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IGNvbm5lY3RlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiQWRkICIgPDwgbGVBdWRpb0RldmljZS0+YWRkcmVzc18KLSAgICAgICAgICAgICAgIDw8ICIgdG8gYmFja2dyb3VuZCBjb25uZWN0IHRvIGNvbm5lY3RlZCBncm91cDogIgotICAgICAgICAgICAgICAgPDwgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfOwotCi0gICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9pZl8sIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gbGVBdWRpb0RldmljZXNfLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0KLSAgICBpZiAoIWxlQXVkaW9EZXZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgbGVBdWRpb0RldmljZSBub3QgY29ubmVjdGVkICgiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgPDwgIikiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGNhbmNlbCBwZW5kaW5nIGRpcmVjdCBjb25uZWN0ICovCi0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmNvbm5lY3RpbmdfYWN0aXZlbHlfKSB7Ci0gICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbihnYXR0X2lmXywgYWRkcmVzcywgdHJ1ZSk7Ci0gICAgICBsZUF1ZGlvRGV2aWNlLT5jb25uZWN0aW5nX2FjdGl2ZWx5XyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qIFJlbW92ZXMgYWxsIHJlZ2lzdHJhdGlvbnMgZm9yIGNvbm5lY3Rpb24gKi8KLSAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbigwLCBhZGRyZXNzLCBmYWxzZSk7Ci0KLSAgICBpZiAobGVBdWRpb0RldmljZS0+Y29ubl9pZF8gIT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHsKLSAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogSWYgdGhpcyBpcyBhIGRldmljZSB3aGljaCBpcyBhIHBhcnQgb2YgdGhlIGdyb3VwIHdoaWNoIGlzIGNvbm5lY3RlZCwKLSAgICAgKiBsZXRzIHN0YXJ0IGJhY2tncm91cCBjb25uZWN0Ci0gICAgICovCi0gICAgQmFja2dyb3VuZENvbm5lY3RJZkdyb3VwQ29ubmVjdGVkKGxlQXVkaW9EZXZpY2UpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0RGV2aWNlKExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjbF9mb3JjZV9kaXNjb25uZWN0ID0gZmFsc2UpIHsKLSAgICBpZiAobGVBdWRpb0RldmljZS0+Y29ubl9pZF8gPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYWNsX2ZvcmNlX2Rpc2Nvbm5lY3QpIHsKLSAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUgPQotICAgICAgICAgIEJUTV9HZXRIQ0lDb25uSGFuZGxlKGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgICAgaWYgKGFjbF9oYW5kbGUgIT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICAgIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKGFjbF9oYW5kbGUsIEhDSV9FUlJfUEVFUl9VU0VSKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIEJ0YUdhdHRRdWV1ZTo6Q2xlYW4obGVBdWRpb0RldmljZS0+Y29ubl9pZF8pOwotICAgIEJUQV9HQVRUQ19DbG9zZShsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXyk7Ci0gICAgbGVBdWRpb0RldmljZS0+Y29ubl9pZF8gPSBHQVRUX0lOVkFMSURfQ09OTl9JRDsKLSAgfQotCi0gIHZvaWQgRGVyZWdpc3Rlck5vdGlmaWNhdGlvbnMoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIC8qIEdBVFRDIHdpbGwgb21taXQgbm90IHJlZ2lzdGVyZWQgcHJldmlvdXNseSBoYW5kbGVzICovCi0gICAgZm9yIChhdXRvIHBhY190dXBsZSA6IGxlQXVkaW9EZXZpY2UtPnNua19wYWNzXykgewotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDwwPihwYWNfdHVwbGUpLnZhbF9oZGwpOwotICAgIH0KLSAgICBmb3IgKGF1dG8gcGFjX3R1cGxlIDogbGVBdWRpb0RldmljZS0+c3JjX3BhY3NfKSB7Ci0gICAgICBCVEFfR0FUVENfRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoZ2F0dF9pZl8sIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHBhY190dXBsZSkudmFsX2hkbCk7Ci0gICAgfQotCi0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPnNua19hdWRpb19sb2NhdGlvbnNfaGRsc18udmFsX2hkbCAhPSAwKQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgIGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwpOwotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwgIT0gMCkKLSAgICAgIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgICBnYXR0X2lmXywgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgbGVBdWRpb0RldmljZS0+c3JjX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy52YWxfaGRsKTsKLSAgICBpZiAobGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18udmFsX2hkbCAhPSAwKQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgIGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5hdWRpb19hdmFpbF9oZGxzXy52YWxfaGRsKTsKLSAgICBpZiAobGVBdWRpb0RldmljZS0+YXVkaW9fc3VwcF9jb250X2hkbHNfLnZhbF9oZGwgIT0gMCkKLSAgICAgIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgICBnYXR0X2lmXywgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgbGVBdWRpb0RldmljZS0+YXVkaW9fc3VwcF9jb250X2hkbHNfLnZhbF9oZGwpOwotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCAhPSAwKQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCk7Ci0KLSAgICBmb3IgKHN0cnVjdCBhc2UmIGFzZSA6IGxlQXVkaW9EZXZpY2UtPmFzZXNfKQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2UuaGRscy52YWxfaGRsKTsKLSAgfQotCi0gIC8qIFRoaXMgaXMgYSBnZW5lcmljIHJlYWQvbm90aWZ5L2luZGljYXRlIGhhbmRsZXIgZm9yIGdhdHQuIEhlcmUgbWVzc2FnZXMKLSAgICogYXJlIGRpc3BhdGNoZWQgdG8gY29ycmVjdCBlbGVtZW50cyBlLmcuIEFTRXMsIFBBQ3MsIGF1ZGlvIGxvY2F0aW9ucyBldGMuCi0gICAqLwotICB2b2lkIExlQXVkaW9DaGFyVmFsdWVIYW5kbGUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGRsLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSkgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIHN0cnVjdCBhc2UqIGFzZTsKLQotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBubyBsZUF1ZGlvRGV2aWNlIGFzc2lnbmVkIHRvIGNvbm5lY3Rpb24gaWQ6ICIKLSAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pihjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VCeVZhbEhhbmRsZShoZGwpOwotCi0gICAgaWYgKGFzZSkgewotICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLSAgICAgIGdyb3VwU3RhdGVNYWNoaW5lXy0+UHJvY2Vzc0dhdHROb3RpZkV2ZW50KHZhbHVlLCBsZW4sIGFzZSwgbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gc25rX3BhY19lbnQgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICAgIGxlQXVkaW9EZXZpY2UtPnNua19wYWNzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlLT5zbmtfcGFjc18uZW5kKCksCi0gICAgICAgIFsmaGRsXShhdXRvJiBwYWNfZW50KSB7IHJldHVybiBzdGQ6OmdldDwwPihwYWNfZW50KS52YWxfaGRsID09IGhkbDsgfSk7Ci0gICAgaWYgKHNua19wYWNfZW50ICE9IGxlQXVkaW9EZXZpY2UtPnNua19wYWNzXy5lbmQoKSkgewotICAgICAgc3RkOjp2ZWN0b3I8c3RydWN0IGxlX2F1ZGlvOjp0eXBlczo6YWNzX2FjX3JlY29yZD4gcGFjX3JlY3M7Ci0KLSAgICAgIC8qIEd1YXJkIGNvbnNpc3RlbmN5IG9mIFBBQyByZWNvcmRzIHN0cnVjdHVyZSAqLwotICAgICAgaWYgKCFsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6cGFjczo6UGFyc2VQYWMocGFjX3JlY3MsIGxlbiwgdmFsdWUpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBSZWdpc3RlcmluZyBzaW5rIFBBQ3MiOwotICAgICAgbGVBdWRpb0RldmljZS0+UmVnaXN0ZXJQQUNzKCZzdGQ6OmdldDwxPigqc25rX3BhY19lbnQpLCAmcGFjX3JlY3MpOwotCi0gICAgICAvKiBVcGRhdGUgc3VwcG9ydGVkIGNvbnRleHQgdHlwZXMgaW5jbHVkaW5nIGludGVybmFsIGNhcGFiaWxpdGllcyAqLwotICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLQotICAgICAgLyogQWN0aXZlIGNvbnRleHQgbWFwIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIHVwZGF0ZWQgaW4gcmVzcG9uc2UgdG8KLSAgICAgICAqIFBBQ3MgdXBkYXRlLgotICAgICAgICogUmVhZCBvZiBhdmFpbGFibGUgY29udGV4dCBkdXJpbmcgaW5pdGlhbCBhdHRyaWJ1dGUgZGlzY292ZXJ5LgotICAgICAgICogR3JvdXAgd291bGQgYmUgYXNzaWduZWQgb25jZSBzZXJ2aWNlIHNlYXJjaCBpcyBjb21wbGV0ZWQuCi0gICAgICAgKi8KLSAgICAgIGlmIChncm91cCkKLSAgICAgICAgZ3JvdXAtPlVwZGF0ZUFjdGl2ZUNvbnRleHRzTWFwKGxlQXVkaW9EZXZpY2UtPkdldEF2YWlsYWJsZUNvbnRleHRzKCkpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBzcmNfcGFjX2VudCA9IHN0ZDo6ZmluZF9pZigKLSAgICAgICAgbGVBdWRpb0RldmljZS0+c3JjX3BhY3NfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2UtPnNyY19wYWNzXy5lbmQoKSwKLSAgICAgICAgWyZoZGxdKGF1dG8mIHBhY19lbnQpIHsgcmV0dXJuIHN0ZDo6Z2V0PDA+KHBhY19lbnQpLnZhbF9oZGwgPT0gaGRsOyB9KTsKLSAgICBpZiAoc3JjX3BhY19lbnQgIT0gbGVBdWRpb0RldmljZS0+c3JjX3BhY3NfLmVuZCgpKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgbGVfYXVkaW86OnR5cGVzOjphY3NfYWNfcmVjb3JkPiBwYWNfcmVjczsKLQotICAgICAgLyogR3VhcmQgY29uc2lzdGVuY3kgb2YgUEFDIHJlY29yZHMgc3RydWN0dXJlICovCi0gICAgICBpZiAoIWxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjpwYWNzOjpQYXJzZVBhYyhwYWNfcmVjcywgbGVuLCB2YWx1ZSkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIFJlZ2lzdGVyaW5nIHNvdXJjZSBQQUNzIjsKLSAgICAgIGxlQXVkaW9EZXZpY2UtPlJlZ2lzdGVyUEFDcygmc3RkOjpnZXQ8MT4oKnNyY19wYWNfZW50KSwgJnBhY19yZWNzKTsKLQotICAgICAgLyogVXBkYXRlIHN1cHBvcnRlZCBjb250ZXh0IHR5cGVzIGluY2x1ZGluZyBpbnRlcm5hbCBjYXBhYmlsaXRpZXMgKi8KLSAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGxlQXVkaW9EZXZpY2UtPmdyb3VwX2lkXyk7Ci0KLSAgICAgIC8qIEFjdGl2ZSBjb250ZXh0IG1hcCBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSB1cGRhdGVkIGluIHJlc3BvbnNlIHRvCi0gICAgICAgKiBQQUNzIHVwZGF0ZS4KLSAgICAgICAqIFJlYWQgb2YgYXZhaWxhYmxlIGNvbnRleHQgZHVyaW5nIGluaXRpYWwgYXR0cmlidXRlIGRpc2NvdmVyeS4KLSAgICAgICAqIEdyb3VwIHdvdWxkIGJlIGFzc2lnbmVkIG9uY2Ugc2VydmljZSBzZWFyY2ggaXMgY29tcGxldGVkLgotICAgICAgICovCi0gICAgICBpZiAoZ3JvdXApCi0gICAgICAgIGdyb3VwLT5VcGRhdGVBY3RpdmVDb250ZXh0c01hcChsZUF1ZGlvRGV2aWNlLT5HZXRBdmFpbGFibGVDb250ZXh0cygpKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChoZGwgPT0gbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy52YWxfaGRsKSB7Ci0gICAgICBBdWRpb0xvY2F0aW9ucyBzbmtfYXVkaW9fbG9jYXRpb25zOwotCi0gICAgICBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6cGFjczo6UGFyc2VBdWRpb0xvY2F0aW9ucyhzbmtfYXVkaW9fbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCB2YWx1ZSk7Ci0KLSAgICAgIC8qIFZhbHVlIG1heSBub3QgY2hhbmdlICovCi0gICAgICBpZiAoKGxlQXVkaW9EZXZpY2UtPmF1ZGlvX2RpcmVjdGlvbnNfICYKLSAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspICYmCi0gICAgICAgICAgKGxlQXVkaW9EZXZpY2UtPnNua19hdWRpb19sb2NhdGlvbnNfIF4gc25rX2F1ZGlvX2xvY2F0aW9ucykubm9uZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8qIFByZXNlbmNlIG9mIFBBQyBjaGFyYWN0ZXJpc3RpYyBmb3Igc291cmNlIG1lYW5zIHN1cHBvcnQgZm9yIHNvdXJjZQotICAgICAgICogYXVkaW8gbG9jYXRpb24uIFZhbHVlIG9mIDB4MDAwMDAwMDAgbWVhbnMgbW9uby91bnNwZWNpZmllZAotICAgICAgICovCi0gICAgICBsZUF1ZGlvRGV2aWNlLT5hdWRpb19kaXJlY3Rpb25zXyB8PQotICAgICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rOwotICAgICAgbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc18gPSBzbmtfYXVkaW9fbG9jYXRpb25zOwotCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8pOwotICAgICAgLyogUmVhZCBvZiBzb3VyY2UgYXVkaW8gbG9jYXRpb25zIGR1cmluZyBpbml0aWFsIGF0dHJpYnV0ZSBkaXNjb3ZlcnkuCi0gICAgICAgKiBHcm91cCB3b3VsZCBiZSBhc3NpZ25lZCBvbmNlIHNlcnZpY2Ugc2VhcmNoIGlzIGNvbXBsZXRlZC4KLSAgICAgICAqLwotICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLT5SZWxvYWRBdWRpb0xvY2F0aW9ucygpKSB7Ci0gICAgICAgIGNhbGxiYWNrc18tPk9uQXVkaW9Db25mKGdyb3VwLT5hdWRpb19kaXJlY3Rpb25zXywgZ3JvdXAtPmdyb3VwX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPnNua19hdWRpb19sb2NhdGlvbnNfLnRvX3Vsb25nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLT5zcmNfYXVkaW9fbG9jYXRpb25zXy50b191bG9uZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+R2V0QWN0aXZlQ29udGV4dHMoKS50b191bG9uZygpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGhkbCA9PSBsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwpIHsKLSAgICAgIEF1ZGlvTG9jYXRpb25zIHNyY19hdWRpb19sb2NhdGlvbnM7Ci0KLSAgICAgIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjpwYWNzOjpQYXJzZUF1ZGlvTG9jYXRpb25zKHNyY19hdWRpb19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIHZhbHVlKTsKLQotICAgICAgLyogVmFsdWUgbWF5IG5vdCBjaGFuZ2UgKi8KLSAgICAgIGlmICgobGVBdWRpb0RldmljZS0+YXVkaW9fZGlyZWN0aW9uc18gJgotICAgICAgICAgICBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKSAmJgotICAgICAgICAgIChsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zXyBeIHNyY19hdWRpb19sb2NhdGlvbnMpLm5vbmUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvKiBQcmVzZW5jZSBvZiBQQUMgY2hhcmFjdGVyaXN0aWMgZm9yIHNvdXJjZSBtZWFucyBzdXBwb3J0IGZvciBzb3VyY2UKLSAgICAgICAqIGF1ZGlvIGxvY2F0aW9uLiBWYWx1ZSBvZiAweDAwMDAwMDAwIG1lYW5zIG1vbm8vdW5zcGVjaWZpZWQKLSAgICAgICAqLwotICAgICAgbGVBdWRpb0RldmljZS0+YXVkaW9fZGlyZWN0aW9uc18gfD0KLSAgICAgICAgICBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlOwotICAgICAgbGVBdWRpb0RldmljZS0+c3JjX2F1ZGlvX2xvY2F0aW9uc18gPSBzcmNfYXVkaW9fbG9jYXRpb25zOwotCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8pOwotICAgICAgLyogUmVhZCBvZiBzb3VyY2UgYXVkaW8gbG9jYXRpb25zIGR1cmluZyBpbml0aWFsIGF0dHJpYnV0ZSBkaXNjb3ZlcnkuCi0gICAgICAgKiBHcm91cCB3b3VsZCBiZSBhc3NpZ25lZCBvbmNlIHNlcnZpY2Ugc2VhcmNoIGlzIGNvbXBsZXRlZC4KLSAgICAgICAqLwotICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLT5SZWxvYWRBdWRpb0xvY2F0aW9ucygpKSB7Ci0gICAgICAgIGNhbGxiYWNrc18tPk9uQXVkaW9Db25mKGdyb3VwLT5hdWRpb19kaXJlY3Rpb25zXywgZ3JvdXAtPmdyb3VwX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPnNua19hdWRpb19sb2NhdGlvbnNfLnRvX3Vsb25nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLT5zcmNfYXVkaW9fbG9jYXRpb25zXy50b191bG9uZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+R2V0QWN0aXZlQ29udGV4dHMoKS50b191bG9uZygpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGhkbCA9PSBsZUF1ZGlvRGV2aWNlLT5hdWRpb19hdmFpbF9oZGxzXy52YWxfaGRsKSB7Ci0gICAgICBhdXRvIGF2YWlsX2F1ZGlvX2NvbnRleHRzID0gc3RkOjptYWtlX3VuaXF1ZTwKLSAgICAgICAgICBzdHJ1Y3QgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OnBhY3M6OmFjc19hdmFpbGFibGVfYXVkaW9fY29udGV4dHM+KCk7Ci0KLSAgICAgIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjpwYWNzOjpQYXJzZUF2YWlsYWJsZUF1ZGlvQ29udGV4dHMoCi0gICAgICAgICAgKmF2YWlsX2F1ZGlvX2NvbnRleHRzLCBsZW4sIHZhbHVlKTsKLQotICAgICAgYXV0byB1cGRhdGVkX2F2YWlsX2NvbnRleHRzID0gbGVBdWRpb0RldmljZS0+U2V0QXZhaWxhYmxlQ29udGV4dHMoCi0gICAgICAgICAgYXZhaWxfYXVkaW9fY29udGV4dHMtPnNua19hdmFpbF9jb250LAotICAgICAgICAgIGF2YWlsX2F1ZGlvX2NvbnRleHRzLT5zcmNfYXZhaWxfY29udCk7Ci0KLSAgICAgIGlmICh1cGRhdGVkX2F2YWlsX2NvbnRleHRzLmFueSgpKSB7Ci0gICAgICAgIC8qIFVwZGF0ZSBzY2VuYXJpbyBtYXAgY29uc2lkZXJpbmcgY2hhbmdlZCBhY3RpdmUgY29udGV4dCB0eXBlcyAqLwotICAgICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0KLSAgICAgICAgICAgIGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLSAgICAgICAgLyogUmVhZCBvZiBhdmFpbGFibGUgY29udGV4dCBkdXJpbmcgaW5pdGlhbCBhdHRyaWJ1dGUgZGlzY292ZXJ5LgotICAgICAgICAgKiBHcm91cCB3b3VsZCBiZSBhc3NpZ25lZCBvbmNlIHNlcnZpY2Ugc2VhcmNoIGlzIGNvbXBsZXRlZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChncm91cCkgewotICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8QXVkaW9Db250ZXh0cz4gdXBkYXRlZF9jb250ZXh0cyA9Ci0gICAgICAgICAgICAgIGdyb3VwLT5VcGRhdGVBY3RpdmVDb250ZXh0c01hcCh1cGRhdGVkX2F2YWlsX2NvbnRleHRzKTsKLSAgICAgICAgICBpZiAodXBkYXRlZF9jb250ZXh0cykgewotICAgICAgICAgICAgY2FsbGJhY2tzXy0+T25BdWRpb0NvbmYoZ3JvdXAtPmF1ZGlvX2RpcmVjdGlvbnNfLCBncm91cC0+Z3JvdXBfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPnNua19hdWRpb19sb2NhdGlvbnNfLnRvX3Vsb25nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+c3JjX2F1ZGlvX2xvY2F0aW9uc18udG9fdWxvbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfY29udGV4dHMtPnRvX3Vsb25nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaGRsID09IGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy52YWxfaGRsKSB7Ci0gICAgICBhdXRvIHN1cHBfYXVkaW9fY29udGV4dHMgPSBzdGQ6Om1ha2VfdW5pcXVlPAotICAgICAgICAgIHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6cGFjczo6YWNzX3N1cHBvcnRlZF9hdWRpb19jb250ZXh0cz4oKTsKLQotICAgICAgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OnBhY3M6OlBhcnNlU3VwcG9ydGVkQXVkaW9Db250ZXh0cygKLSAgICAgICAgICAqc3VwcF9hdWRpb19jb250ZXh0cywgbGVuLCB2YWx1ZSk7Ci0gICAgICAvKiBKdXN0IHN0b3JlIGlmIGZvciBub3cgKi8KLSAgICAgIGxlQXVkaW9EZXZpY2UtPlNldFN1cHBvcnRlZENvbnRleHRzKHN1cHBfYXVkaW9fY29udGV4dHMtPnNua19zdXBwX2NvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwX2F1ZGlvX2NvbnRleHRzLT5zcmNfc3VwcF9jb250KTsKLSAgICB9IGVsc2UgaWYgKGhkbCA9PSBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCkgewotICAgICAgYXV0byBudGYgPQotICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8c3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpjdHBfbnRmPigpOwotCi0gICAgICBpZiAoUGFyc2VBc2VDdHBOb3RpZmljYXRpb24oKm50ZiwgbGVuLCB2YWx1ZSkpCi0gICAgICAgIENvbnRyb2xQb2ludE5vdGlmaWNhdGlvbkhhbmRsZXIoKm50Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgVW5rbm93biBhdHRyaWJ1dGUgcmVhZDogIiA8PCBsb2doZXgoaGRsKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uR2F0dFJlYWRSc3AodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGRsLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgIExlQXVkaW9DaGFyVmFsdWVIYW5kbGUoY29ubl9pZCwgaGRsLCBsZW4sIHZhbHVlKTsKLSAgfQotCi0gIHZvaWQgT25HYXR0Q29ubmVjdGVkKHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0lGIGNsaWVudF9pZiwgUmF3QWRkcmVzcyBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdWludDE2X3QgbXR1KSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSByZXR1cm47Ci0KLSAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgLyogYXV0b2Nvbm5lY3QgY29ubmVjdGlvbiBmYWlsZWQsIHRoYXQncyBvayAqLwotICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlLT5jb25uZWN0aW5nX2FjdGl2ZWx5XykgcmV0dXJuOwotCi0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY29ubmVjdCB0byBMZUF1ZGlvIGxlQXVkaW9EZXZpY2UsIHN0YXR1czogIgotICAgICAgICAgICAgICAgICA8PCArc3RhdHVzOwotICAgICAgY2FsbGJhY2tzXy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIGFkZHJlc3MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlXzJtX3BoeSgpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgYWRkcmVzcyA8PCAiIHNldCBwcmVmZXJyZWQgUEhZIHRvIDJNIjsKLSAgICAgIEJUTV9CbGVTZXRQaHkoYWRkcmVzcywgUEhZX0xFXzJNLCBQSFlfTEVfMk0sIDApOwotICAgIH0KLQotICAgIEJUTV9SZXF1ZXN0UGVlclNDQShsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywgdHJhbnNwb3J0KTsKLQotICAgIGxlQXVkaW9EZXZpY2UtPmNvbm5lY3RpbmdfYWN0aXZlbHlfID0gZmFsc2U7Ci0gICAgbGVBdWRpb0RldmljZS0+Y29ubl9pZF8gPSBjb25uX2lkOwotCi0gICAgaWYgKG10dSA9PSBHQVRUX0RFRl9CTEVfTVRVX1NJWkUpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBDb25maWd1cmUgTVRVIjsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6Q29uZmlndXJlTXR1KGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLCAyNDApOwotICAgIH0KLQotICAgIC8qIElmIHdlIGtub3cgc2VydmljZXMsIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zICovCi0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmtub3duX3NlcnZpY2VfaGFuZGxlc18pCi0gICAgICBSZWdpc3Rlcktub3duTm90aWZpY2F0aW9ucyhsZUF1ZGlvRGV2aWNlKTsKLQotICAgIGlmIChCVE1fU2VjSXNTZWN1cml0eVBlbmRpbmcoYWRkcmVzcykpIHsKLSAgICAgIC8qIGlmIHNlY3VyaXR5IGNvbGxpc2lvbiBoYXBwZW5lZCwgd2FpdCBmb3IgZW5jcnlwdGlvbiBkb25lCi0gICAgICAgKiAoQlRBX0dBVFRDX0VOQ19DTVBMX0NCX0VWVCkgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiB2ZXJpZnkgYm9uZCAqLwotICAgIGlmIChCVE1fSXNFbmNyeXB0ZWQoYWRkcmVzcywgQlRfVFJBTlNQT1JUX0xFKSkgewotICAgICAgLyogaWYgbGluayBoYXMgYmVlbiBlbmNyeXB0ZWQgKi8KLSAgICAgIE9uRW5jcnlwdGlvbkNvbXBsZXRlKGFkZHJlc3MsIEJUTV9TVUNDRVNTKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoQlRNX0lzTGlua0tleUtub3duKGFkZHJlc3MsIEJUX1RSQU5TUE9SVF9MRSkpIHsKLSAgICAgIGludCByZXN1bHQgPSBCVE1fU2V0RW5jcnlwdGlvbigKLSAgICAgICAgICBhZGRyZXNzLCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkVuY3J5cHRpb25Db21wbGV0ZSgqYmRfYWRkciwgc3RhdHVzKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIG51bGxwdHIsIEJUTV9CTEVfU0VDX0VOQ1JZUFQpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiRW5jcnlwdGlvbiByZXF1aXJlZC4gUmVxdWVzdCByZXN1bHQ6ICIgPDwgcmVzdWx0OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBFbmNyeXB0aW9uIGVycm9yIjsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJLbm93bk5vdGlmaWNhdGlvbnMoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZTogIiA8PCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXzsKLQotICAgIC8qIEdBVFRDIHdpbGwgb21taXQgbm90IHJlZ2lzdGVyZWQgcHJldmlvdXNseSBoYW5kbGVzICovCi0gICAgZm9yIChhdXRvIHBhY190dXBsZSA6IGxlQXVkaW9EZXZpY2UtPnNua19wYWNzXykgewotICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhnYXR0X2lmXywgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHBhY190dXBsZSkudmFsX2hkbCk7Ci0gICAgfQotICAgIGZvciAoYXV0byBwYWNfdHVwbGUgOiBsZUF1ZGlvRGV2aWNlLT5zcmNfcGFjc18pIHsKLSAgICAgIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoZ2F0dF9pZl8sIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDwwPihwYWNfdHVwbGUpLnZhbF9oZGwpOwotICAgIH0KLQotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwgIT0gMCkKLSAgICAgIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCi0gICAgICAgICAgZ2F0dF9pZl8sIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPnNua19hdWRpb19sb2NhdGlvbnNfaGRsc18udmFsX2hkbCk7Ci0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPnNyY19hdWRpb19sb2NhdGlvbnNfaGRsc18udmFsX2hkbCAhPSAwKQotICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgICBnYXR0X2lmXywgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgbGVBdWRpb0RldmljZS0+c3JjX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy52YWxfaGRsKTsKLSAgICBpZiAobGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18udmFsX2hkbCAhPSAwKQotICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgICBnYXR0X2lmXywgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgbGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18udmFsX2hkbCk7Ci0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy52YWxfaGRsICE9IDApCi0gICAgICBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgIGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5hdWRpb19zdXBwX2NvbnRfaGRsc18udmFsX2hkbCk7Ci0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsICE9IDApCi0gICAgICBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwpOwotCi0gICAgZm9yIChzdHJ1Y3QgYXNlJiBhc2UgOiBsZUF1ZGlvRGV2aWNlLT5hc2VzXykKLSAgICAgIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoZ2F0dF9pZl8sIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2UuaGRscy52YWxfaGRsKTsKLSAgfQotCi0gIHZvaWQgT25FbmNyeXB0aW9uQ29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzdGF0dXMpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3MgPDwgInN0YXR1czogIiA8PCBpbnR7c3RhdHVzfTsKLQotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAobGVBdWRpb0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gQlRNX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkVuY3J5cHRpb24gZmFpbGVkIgotICAgICAgICAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBpbnR7c3RhdHVzfTsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXyk7Ci0gICAgICBpZiAobGVBdWRpb0RldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseV8pIHsKLSAgICAgICAgY2FsbGJhY2tzXy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIGFkZHJlc3MpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5lbmNyeXB0ZWRfKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBsaW5rIGFscmVhZHkgZW5jcnlwdGVkLCBub3RoaW5nIHRvIGRvIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBsZUF1ZGlvRGV2aWNlLT5lbmNyeXB0ZWRfID0gdHJ1ZTsKLQotICAgIC8qIElmIHdlIGtub3cgc2VydmljZXMgYW5kIHJlYWQgaXMgbm90IG9uZ29pbmcsIHRoaXMgaXMgcmVjb25uZWN0aW9uIGFuZAotICAgICAqIGp1c3Qgbm90aWZ5IGNvbm5lY3RlZCAgKi8KLSAgICBpZiAobGVBdWRpb0RldmljZS0+a25vd25fc2VydmljZV9oYW5kbGVzXyAmJgotICAgICAgICAhbGVBdWRpb0RldmljZS0+bm90aWZ5X2Nvbm5lY3RlZF9hZnRlcl9yZWFkXykgewotICAgICAgY29ubmVjdGlvblJlYWR5KGxlQXVkaW9EZXZpY2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdCgKLSAgICAgICAgbGVBdWRpb0RldmljZS0+Y29ubl9pZF8sCi0gICAgICAgICZsZV9hdWRpbzo6dXVpZDo6a1B1Ymxpc2hlZEF1ZGlvQ2FwYWJpbGl0eVNlcnZpY2VVdWlkKTsKLSAgfQotCi0gIHZvaWQgT25HYXR0RGlzY29ubmVjdGVkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyBhZGRyZXNzLCB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb24pIHsKLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gbGVBdWRpb0RldmljZXNfLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0KLSAgICBpZiAoIWxlQXVkaW9EZXZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIiwgc2tpcHBpbmcgdW5rbm93biBsZUF1ZGlvRGV2aWNlLCBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLQotICAgIGdyb3VwU3RhdGVNYWNoaW5lXy0+UHJvY2Vzc0hjaU5vdGlmQWNsRGlzY29ubmVjdGVkKGdyb3VwLCBsZUF1ZGlvRGV2aWNlKTsKLQotICAgIERlcmVnaXN0ZXJOb3RpZmljYXRpb25zKGxlQXVkaW9EZXZpY2UpOwotCi0gICAgY2FsbGJhY2tzXy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIGFkZHJlc3MpOwotICAgIGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfID0gR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci0gICAgbGVBdWRpb0RldmljZS0+ZW5jcnlwdGVkXyA9IGZhbHNlOwotCi0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPnJlbW92aW5nX2RldmljZV8pIHsKLSAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8gIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgICAgYXV0byBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLSAgICAgICAgZ3JvdXBfcmVtb3ZlX25vZGUoZ3JvdXAsIGFkZHJlc3MsIHRydWUpOwotICAgICAgfQotICAgICAgbGVBdWRpb0RldmljZXNfLlJlbW92ZShhZGRyZXNzKTsKLSAgICB9Ci0gIH0KLQotICBib29sIHN1YnNjcmliZV9mb3JfaW5kaWNhdGlvbnModWludDE2X3QgY29ubl9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY2NjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbnRmKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUoMik7Ci0gICAgdWludDhfdCogcHRyID0gdmFsdWUuZGF0YSgpOwotCi0gICAgaWYgKEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoZ2F0dF9pZl8sIGFkZHJlc3MsIGhhbmRsZSkgIT0KLSAgICAgICAgR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGNhbm5vdCByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uOiAiCi0gICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oaGFuZGxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBVSU5UMTZfVE9fU1RSRUFNKHB0ciwgbnRmID8gR0FUVF9DSEFSX0NMSUVOVF9DT05GSUdfTk9USUZJQ0FUSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdBVFRfQ0hBUl9DTElFTlRfQ09ORklHX0lORElDVElPTik7Ci0KLSAgICBCdGFHYXR0UXVldWU6OldyaXRlRGVzY3JpcHRvcigKLSAgICAgICAgY29ubl9pZCwgY2NjX2hhbmRsZSwgc3RkOjptb3ZlKHZhbHVlKSwgR0FUVF9XUklURSwKLSAgICAgICAgW10odWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25HYXR0V3JpdGVDY2MoY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGRhdGEpOwotICAgICAgICB9LAotICAgICAgICBudWxscHRyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIEZpbmQgdGhlIGhhbmRsZSBmb3IgdGhlIGNsaWVudCBjaGFyYWN0ZXJpc3RpY3MgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuCi0gICAqIGNoYXJhY3RlcmlzdGljcy4KLSAgICovCi0gIHVpbnQxNl90IGZpbmRfY2NjX2hhbmRsZShjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyYgY2hhcmFjKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKAotICAgICAgICBjaGFyYWMuZGVzY3JpcHRvcnMuYmVnaW4oKSwgY2hhcmFjLmRlc2NyaXB0b3JzLmVuZCgpLAotICAgICAgICBbXShjb25zdCBhdXRvJiBkZXNjKSB7Ci0gICAgICAgICAgcmV0dXJuIGRlc2MudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRyk7Ci0gICAgICAgIH0pOwotCi0gICAgcmV0dXJuIGl0ZXIgPT0gY2hhcmFjLmRlc2NyaXB0b3JzLmVuZCgpID8gMCA6ICgqaXRlcikuaGFuZGxlOwotICB9Ci0KLSAgdm9pZCBPblNlcnZpY2VDaGFuZ2VFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGxlQXVkaW9EZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgRExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgIDw8ICIsIHNraXBwaW5nIHVua25vd24gbGVBdWRpb0RldmljZSwgYWRkcmVzczogIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzPSIgPDwgYWRkcmVzczsKLSAgICBsZUF1ZGlvRGV2aWNlLT5rbm93bl9zZXJ2aWNlX2hhbmRsZXNfID0gZmFsc2U7Ci0gICAgbGVBdWRpb0RldmljZS0+Y3Npc19tZW1iZXJfID0gZmFsc2U7Ci0gICAgQnRhR2F0dFF1ZXVlOjpDbGVhbihsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXyk7Ci0gICAgRGVyZWdpc3Rlck5vdGlmaWNhdGlvbnMobGVBdWRpb0RldmljZSk7Ci0gIH0KLQotICB2b2lkIE9uR2F0dFNlcnZpY2VEaXNjb3ZlcnlEb25lKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gbGVBdWRpb0RldmljZXNfLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICBETE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgPDwgIiwgc2tpcHBpbmcgdW5rbm93biBsZUF1ZGlvRGV2aWNlLCBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlLT5rbm93bl9zZXJ2aWNlX2hhbmRsZXNfKQotICAgICAgQlRBX0dBVFRDX1NlcnZpY2VTZWFyY2hSZXF1ZXN0KAotICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICZsZV9hdWRpbzo6dXVpZDo6a1B1Ymxpc2hlZEF1ZGlvQ2FwYWJpbGl0eVNlcnZpY2VVdWlkKTsKLSAgfQotICAvKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgY29ubmVjdGlvbiBiZWdpbm5pbmcgdG8gaWRlbnRpZnkgYW5kIGluaXRpYWxpemUKLSAgICogYSBsZSBhdWRpbyBkZXZpY2UuIEFueSBtaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gcmV2ZXJ0aW5nCi0gICAqIGFuZCBjbGVhbmluZyB1cCBkZXZpY2UuCi0gICAqLwotICB2b2lkIE9uU2VydmljZVNlYXJjaENvbXBsZXRlKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gbGVBdWRpb0RldmljZXNfLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLQotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgRExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgc2tpcHBpbmcgdW5rbm93biBsZUF1ZGlvRGV2aWNlLCBjb25uX2lkOiAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdGVzdCBjc2lzX21lbWJlciAiCi0gICAgICAgICAgICAgIDw8IGxlQXVkaW9EZXZpY2UtPmNzaXNfbWVtYmVyXzsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAvKiBjbG9zZSBjb25uZWN0aW9uIGFuZCByZXBvcnQgc2VydmljZSBkaXNjb3ZlcnkgY29tcGxldGUgd2l0aCBlcnJvciAqLwotICAgICAgTE9HKEVSUk9SKSA8PCAiU2VydmljZSBkaXNjb3ZlcnkgZmFpbGVkIjsKLQotICAgICAgRGlzY29ubmVjdERldmljZShsZUF1ZGlvRGV2aWNlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6Omxpc3Q8Z2F0dDo6U2VydmljZT4qIHNlcnZpY2VzID0gQlRBX0dBVFRDX0dldFNlcnZpY2VzKGNvbm5faWQpOwotCi0gICAgY29uc3QgZ2F0dDo6U2VydmljZSogcGFjX3N2YyA9IG51bGxwdHI7Ci0gICAgY29uc3QgZ2F0dDo6U2VydmljZSogYXNlX3N2YyA9IG51bGxwdHI7Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY3Npc19wcmltYXJ5X2hhbmRsZXM7Ci0gICAgdWludDE2X3QgY2FzX2NzaXNfaW5jbHVkZWRfaGFuZGxlID0gMDsKLQotICAgIGZvciAoY29uc3QgZ2F0dDo6U2VydmljZSYgdG1wIDogKnNlcnZpY2VzKSB7Ci0gICAgICBpZiAodG1wLnV1aWQgPT0gbGVfYXVkaW86OnV1aWQ6OmtQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdHlTZXJ2aWNlVXVpZCkgewotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIEF1ZGlvIENhcGFiaWxpdHkgc2VydmljZSwgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgodG1wLmhhbmRsZSk7Ci0gICAgICAgIHBhY19zdmMgPSAmdG1wOwotICAgICAgfSBlbHNlIGlmICh0bXAudXVpZCA9PSBsZV9hdWRpbzo6dXVpZDo6a0F1ZGlvU3RyZWFtQ29udHJvbFNlcnZpY2VVdWlkKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgQXVkaW8gU3RyZWFtIEVuZHBvaW50IHNlcnZpY2UsIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHRtcC5oYW5kbGUpOwotICAgICAgICBhc2Vfc3ZjID0gJnRtcDsKLSAgICAgIH0gZWxzZSBpZiAodG1wLnV1aWQgPT0gYmx1ZXRvb3RoOjpjc2lzOjprQ3Npc1NlcnZpY2VVdWlkKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgQ1NJUyBzZXJ2aWNlLCBoYW5kbGU6ICIgPDwgbG9naGV4KHRtcC5oYW5kbGUpCi0gICAgICAgICAgICAgICAgICA8PCAiIGlzIHByaW1hcnk/ICIgPDwgdG1wLmlzX3ByaW1hcnk7Ci0gICAgICAgIGlmICh0bXAuaXNfcHJpbWFyeSkgY3Npc19wcmltYXJ5X2hhbmRsZXMucHVzaF9iYWNrKHRtcC5oYW5kbGUpOwotICAgICAgfSBlbHNlIGlmICh0bXAudXVpZCA9PSBsZV9hdWRpbzo6dXVpZDo6a0NhcFNlcnZpY2VVdWlkKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgQ0FQIFNlcnZpY2UsIGhhbmRsZTogIiA8PCBsb2doZXgodG1wLmhhbmRsZSk7Ci0KLSAgICAgICAgLyogVHJ5IHRvIGZpbmQgY29udGV4dCBmb3IgQ1NJUyBpbnN0YW5jZXMgKi8KLSAgICAgICAgZm9yIChhdXRvJiBpbmNsdWRlZF9zcnZjIDogdG1wLmluY2x1ZGVkX3NlcnZpY2VzKSB7Ci0gICAgICAgICAgaWYgKGluY2x1ZGVkX3NydmMudXVpZCA9PSBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2VydmljZVV1aWQpIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENTSVMgaW5jbHVkZWQgaW50byBDQVMiOwotICAgICAgICAgICAgaWYgKGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDo6SXNDc2lzQ2xpZW50UnVubmluZygpKQotICAgICAgICAgICAgICBjYXNfY3Npc19pbmNsdWRlZF9oYW5kbGUgPSBpbmNsdWRlZF9zcnZjLnN0YXJ0X2hhbmRsZTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgQ0FTIGluY2x1ZGVzIHByaW1hcnkgQ1NJUyBzZXJ2aWNlICovCi0gICAgaWYgKCFjc2lzX3ByaW1hcnlfaGFuZGxlcy5lbXB0eSgpICYmIGNhc19jc2lzX2luY2x1ZGVkX2hhbmRsZSkgewotICAgICAgYXV0byBpdGVyID0KLSAgICAgICAgICBzdGQ6OmZpbmQoY3Npc19wcmltYXJ5X2hhbmRsZXMuYmVnaW4oKSwgY3Npc19wcmltYXJ5X2hhbmRsZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgIGNhc19jc2lzX2luY2x1ZGVkX2hhbmRsZSk7Ci0gICAgICBpZiAoaXRlciAhPSBjc2lzX3ByaW1hcnlfaGFuZGxlcy5lbmQoKSkKLSAgICAgICAgbGVBdWRpb0RldmljZS0+Y3Npc19tZW1iZXJfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIXBhY19zdmMgfHwgIWFzZV9zdmMpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1hbmRhdG9yeSBsZSBhdWRpbyBzZXJ2aWNlcyBmb3VuZCI7Ci0KLSAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogUmVmcmVzaCBQQUNzIGhhbmRsZXMgKi8KLSAgICBsZUF1ZGlvRGV2aWNlLT5DbGVhclBBQ3MoKTsKLQotICAgIGZvciAoY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHBhY19zdmMtPmNoYXJhY3RlcmlzdGljcykgewotICAgICAgaWYgKGNoYXJhYy51dWlkID09Ci0gICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtTaW5rUHVibGlzaGVkQXVkaW9DYXBhYmlsaXR5Q2hhcmFjdGVyaXN0aWNVdWlkKSB7Ci0gICAgICAgIHN0cnVjdCBoZGxfcGFpciBoZGxfcGFpcjsKLSAgICAgICAgaGRsX3BhaXIudmFsX2hkbCA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIGhkbF9wYWlyLmNjY19oZGwgPSBmaW5kX2NjY19oYW5kbGUoY2hhcmFjKTsKLQotICAgICAgICBpZiAoaGRsX3BhaXIuY2NjX2hkbCA9PSAwKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBzbmsgcGFjIGNoYXIgZG9lc24ndCBoYXZlIGNjYyI7Ci0KLSAgICAgICAgICBEaXNjb25uZWN0RGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3Vic2NyaWJlX2Zvcl9pbmRpY2F0aW9ucyhjb25uX2lkLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkbF9wYWlyLnZhbF9oZGwsIGhkbF9wYWlyLmNjY19oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSkgewotICAgICAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogT2J0YWluIGluaXRpYWwgc3RhdGUgb2Ygc2luayBQQUNzICovCi0gICAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhkbF9wYWlyLnZhbF9oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uR2F0dFJlYWRSc3BTdGF0aWMsIE5VTEwpOwotCi0gICAgICAgIGxlQXVkaW9EZXZpY2UtPnNua19wYWNzXy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKAotICAgICAgICAgICAgaGRsX3BhaXIsIHN0ZDo6dmVjdG9yPHN0cnVjdCBsZV9hdWRpbzo6dHlwZXM6OmFjc19hY19yZWNvcmQ+KCkpKTsKLQotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIFNpbmsgUEFDIGNoYXJhY3RlcmlzdGljLCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjaGFyYWMudmFsdWVfaGFuZGxlKQotICAgICAgICAgICAgICAgICAgPDwgIiwgY2NjIGhhbmRsZTogIiA8PCBsb2doZXgoaGRsX3BhaXIuY2NjX2hkbCk7Ci0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09Ci0gICAgICAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjoKLSAgICAgICAgICAgICAgICAgICAgIGtTb3VyY2VQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdHlDaGFyYWN0ZXJpc3RpY1V1aWQpIHsKLSAgICAgICAgc3RydWN0IGhkbF9wYWlyIGhkbF9wYWlyOwotICAgICAgICBoZGxfcGFpci52YWxfaGRsID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgaGRsX3BhaXIuY2NjX2hkbCA9IGZpbmRfY2NjX2hhbmRsZShjaGFyYWMpOwotCi0gICAgICAgIGlmIChoZGxfcGFpci5jY2NfaGRsID09IDApIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHNyYyBwYWMgY2hhciBkb2Vzbid0IGhhdmUgY2NjIjsKLQotICAgICAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWJzY3JpYmVfZm9yX2luZGljYXRpb25zKGNvbm5faWQsIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRsX3BhaXIudmFsX2hkbCwgaGRsX3BhaXIuY2NjX2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSB7Ci0gICAgICAgICAgRGlzY29ubmVjdERldmljZShsZUF1ZGlvRGV2aWNlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBPYnRhaW4gaW5pdGlhbCBzdGF0ZSBvZiBzb3VyY2UgUEFDcyAqLwotICAgICAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBoZGxfcGFpci52YWxfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkdhdHRSZWFkUnNwU3RhdGljLCBOVUxMKTsKLQotICAgICAgICBsZUF1ZGlvRGV2aWNlLT5zcmNfcGFjc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZSgKLSAgICAgICAgICAgIGhkbF9wYWlyLCBzdGQ6OnZlY3RvcjxzdHJ1Y3QgbGVfYXVkaW86OnR5cGVzOjphY3NfYWNfcmVjb3JkPigpKSk7Ci0KLSAgICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBTb3VyY2UgUEFDIGNoYXJhY3RlcmlzdGljLCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjaGFyYWMudmFsdWVfaGFuZGxlKQotICAgICAgICAgICAgICAgICAgPDwgIiwgY2NjIGhhbmRsZTogIiA8PCBsb2doZXgoaGRsX3BhaXIuY2NjX2hkbCk7Ci0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09Ci0gICAgICAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprU2lua0F1ZGlvTG9jYXRpb25DaGFyYWN0ZXJpc3RpY1V1aWQpIHsKLSAgICAgICAgbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy52YWxfaGRsID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy5jY2NfaGRsID0KLSAgICAgICAgICAgIGZpbmRfY2NjX2hhbmRsZShjaGFyYWMpOwotCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zX2hkbHNfLmNjY19oZGwgPT0gMCkKLSAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgPDwgIiwgc25rIGF1ZGlvIGxvY2F0aW9ucyBjaGFyIGRvZXNuJ3QgaGF2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgImNjYyI7Ci0KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2UtPnNua19hdWRpb19sb2NhdGlvbnNfaGRsc18uY2NjX2hkbCAhPSAwICYmCi0gICAgICAgICAgICAhc3Vic2NyaWJlX2Zvcl9pbmRpY2F0aW9ucygKLSAgICAgICAgICAgICAgICBjb25uX2lkLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwsCi0gICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy5jY2NfaGRsLCB0cnVlKSkgewotICAgICAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogT2J0YWluIGluaXRpYWwgc3RhdGUgb2Ygc2luayBhdWRpbyBsb2NhdGlvbnMgKi8KLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjb25uX2lkLCBsZUF1ZGlvRGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwsCi0gICAgICAgICAgICBPbkdhdHRSZWFkUnNwU3RhdGljLCBOVUxMKTsKLQotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIFNpbmsgYXVkaW8gbG9jYXRpb25zIGNoYXJhY3RlcmlzdGljLCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjaGFyYWMudmFsdWVfaGFuZGxlKSA8PCAiLCBjY2MgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgobGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy5jY2NfaGRsKTsKLSAgICAgIH0gZWxzZSBpZiAoY2hhcmFjLnV1aWQgPT0KLSAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtTb3VyY2VBdWRpb0xvY2F0aW9uQ2hhcmFjdGVyaXN0aWNVdWlkKSB7Ci0gICAgICAgIGxlQXVkaW9EZXZpY2UtPnNyY19hdWRpb19sb2NhdGlvbnNfaGRsc18udmFsX2hkbCA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIGxlQXVkaW9EZXZpY2UtPnNyY19hdWRpb19sb2NhdGlvbnNfaGRsc18uY2NjX2hkbCA9Ci0gICAgICAgICAgICBmaW5kX2NjY19oYW5kbGUoY2hhcmFjKTsKLQotICAgICAgICBpZiAobGVBdWRpb0RldmljZS0+c3JjX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy5jY2NfaGRsID09IDApCi0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgIDw8ICIsIHNuayBhdWRpbyBsb2NhdGlvbnMgY2hhciBkb2Vzbid0IGhhdmUiCi0gICAgICAgICAgICAgICAgICAgICAgICJjY2MiOwotCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zX2hkbHNfLmNjY19oZGwgIT0gMCAmJgotICAgICAgICAgICAgIXN1YnNjcmliZV9mb3JfaW5kaWNhdGlvbnMoCi0gICAgICAgICAgICAgICAgY29ubl9pZCwgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+c3JjX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy52YWxfaGRsLAotICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPnNyY19hdWRpb19sb2NhdGlvbnNfaGRsc18uY2NjX2hkbCwgdHJ1ZSkpIHsKLSAgICAgICAgICBEaXNjb25uZWN0RGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE9idGFpbiBpbml0aWFsIHN0YXRlIG9mIHNvdXJjZSBhdWRpbyBsb2NhdGlvbnMgKi8KLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjb25uX2lkLCBsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwsCi0gICAgICAgICAgICBPbkdhdHRSZWFkUnNwU3RhdGljLCBOVUxMKTsKLQotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIFNvdXJjZSBhdWRpbyBsb2NhdGlvbnMgY2hhcmFjdGVyaXN0aWMsIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGNoYXJhYy52YWx1ZV9oYW5kbGUpIDw8ICIsIGNjYyBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zX2hkbHNfLmNjY19oZGwpOwotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PQotICAgICAgICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6a0F1ZGlvQ29udGV4dEF2YWlsYWJpbGl0eUNoYXJhY3RlcmlzdGljVXVpZCkgewotICAgICAgICBsZUF1ZGlvRGV2aWNlLT5hdWRpb19hdmFpbF9oZGxzXy52YWxfaGRsID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgbGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18uY2NjX2hkbCA9IGZpbmRfY2NjX2hhbmRsZShjaGFyYWMpOwotCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5hdWRpb19hdmFpbF9oZGxzXy5jY2NfaGRsID09IDApIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGF1ZGlvIGF2YWlscyBjaGFyIGRvZXNuJ3QgaGF2ZSBjY2MiOwotCi0gICAgICAgICAgRGlzY29ubmVjdERldmljZShsZUF1ZGlvRGV2aWNlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN1YnNjcmliZV9mb3JfaW5kaWNhdGlvbnMoY29ubl9pZCwgbGVBdWRpb0RldmljZS0+YWRkcmVzc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5hdWRpb19hdmFpbF9oZGxzXy52YWxfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18uY2NjX2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSB7Ci0gICAgICAgICAgRGlzY29ubmVjdERldmljZShsZUF1ZGlvRGV2aWNlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBPYnRhaW4gaW5pdGlhbCBzdGF0ZSAqLwotICAgICAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgIGNvbm5faWQsIGxlQXVkaW9EZXZpY2UtPmF1ZGlvX2F2YWlsX2hkbHNfLnZhbF9oZGwsCi0gICAgICAgICAgICBPbkdhdHRSZWFkUnNwU3RhdGljLCBOVUxMKTsKLQotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIEF1ZGlvIEF2YWlsYWJpbGl0eSBDb250ZXh0IGNoYXJhY3RlcmlzdGljLCBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjaGFyYWMudmFsdWVfaGFuZGxlKSA8PCAiLCBjY2MgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgobGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18uY2NjX2hkbCk7Ci0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09Ci0gICAgICAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprQXVkaW9TdXBwb3J0ZWRDb250ZXh0Q2hhcmFjdGVyaXN0aWNVdWlkKSB7Ci0gICAgICAgIGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy52YWxfaGRsID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgbGVBdWRpb0RldmljZS0+YXVkaW9fc3VwcF9jb250X2hkbHNfLmNjY19oZGwgPSBmaW5kX2NjY19oYW5kbGUoY2hhcmFjKTsKLQotICAgICAgICBpZiAobGVBdWRpb0RldmljZS0+YXVkaW9fc3VwcF9jb250X2hkbHNfLmNjY19oZGwgPT0gMCkKLSAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgYXVkaW8gYXZhaWxzIGNoYXIgZG9lc24ndCBoYXZlIGNjYyI7Ci0KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy5jY2NfaGRsICE9IDAgJiYKLSAgICAgICAgICAgICFzdWJzY3JpYmVfZm9yX2luZGljYXRpb25zKAotICAgICAgICAgICAgICAgIGNvbm5faWQsIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy52YWxfaGRsLAotICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy5jY2NfaGRsLCB0cnVlKSkgewotICAgICAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogT2J0YWluIGluaXRpYWwgc3RhdGUgKi8KLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjb25uX2lkLCBsZUF1ZGlvRGV2aWNlLT5hdWRpb19zdXBwX2NvbnRfaGRsc18udmFsX2hkbCwKLSAgICAgICAgICAgIE9uR2F0dFJlYWRSc3BTdGF0aWMsIE5VTEwpOwotCi0gICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgQXVkaW8gU3VwcG9ydGVkIENvbnRleHQgY2hhcmFjdGVyaXN0aWMsIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGNoYXJhYy52YWx1ZV9oYW5kbGUpIDw8ICIsIGNjYyBoYW5kbGU6ICIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChsZUF1ZGlvRGV2aWNlLT5hdWRpb19zdXBwX2NvbnRfaGRsc18uY2NjX2hkbCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVmcmVzaCBBU0UgaGFuZGxlcyAqLwotICAgIGxlQXVkaW9EZXZpY2UtPmFzZXNfLmNsZWFyKCk7Ci0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBhc2Vfc3ZjLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgY2hhcmFjdGVyaXN0aWMsIHV1aWQ6ICIgPDwgY2hhcmFjLnV1aWQuVG9TdHJpbmcoKTsKLSAgICAgIGlmIChjaGFyYWMudXVpZCA9PSBsZV9hdWRpbzo6dXVpZDo6a1NpbmtBdWRpb1N0cmVhbUVuZHBvaW50VXVpZCB8fAotICAgICAgICAgIGNoYXJhYy51dWlkID09IGxlX2F1ZGlvOjp1dWlkOjprU291cmNlQXVkaW9TdHJlYW1FbmRwb2ludFV1aWQpIHsKLSAgICAgICAgdWludDE2X3QgY2NjX2hhbmRsZSA9IGZpbmRfY2NjX2hhbmRsZShjaGFyYWMpOwotICAgICAgICBpZiAoY2NjX2hhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBhdWRpbyBhdmFpbHMgY2hhciBkb2Vzbid0IGhhdmUgY2NjIjsKLQotICAgICAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWJzY3JpYmVfZm9yX2luZGljYXRpb25zKGNvbm5faWQsIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjLnZhbHVlX2hhbmRsZSwgY2NjX2hhbmRsZSwgdHJ1ZSkpIHsKLSAgICAgICAgICBEaXNjb25uZWN0RGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkaXJlY3Rpb24gPQotICAgICAgICAgICAgY2hhcmFjLnV1aWQgPT0gbGVfYXVkaW86OnV1aWQ6OmtTaW5rQXVkaW9TdHJlYW1FbmRwb2ludFV1aWQKLSAgICAgICAgICAgICAgICA/IGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rCi0gICAgICAgICAgICAgICAgOiBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlOwotCi0gICAgICAgIGxlQXVkaW9EZXZpY2UtPmFzZXNfLmVtcGxhY2VfYmFjayhjaGFyYWMudmFsdWVfaGFuZGxlLCBjY2NfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uKTsKLQotICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIEFTRSBjaGFyYWN0ZXJpc3RpYywgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY2hhcmFjLnZhbHVlX2hhbmRsZSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsIGNjYyBoYW5kbGU6ICIgPDwgbG9naGV4KGNjY19oYW5kbGUpCi0gICAgICAgICAgICAgICAgICA8PCAiLCBkaXJlY3Rpb246ICIgPDwgZGlyZWN0aW9uOwotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PQotICAgICAgICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6Ci0gICAgICAgICAgICAgICAgICAgICBrQXVkaW9TdHJlYW1FbmRwb2ludENvbnRyb2xQb2ludENoYXJhY3RlcmlzdGljVXVpZCkgewotICAgICAgICBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy5jY2NfaGRsID0gZmluZF9jY2NfaGFuZGxlKGNoYXJhYyk7Ci0KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy5jY2NfaGRsID09IDApIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGFzZSBjdHAgZG9lc24ndCBoYXZlIGNjYyI7Ci0KLSAgICAgICAgICBEaXNjb25uZWN0RGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3Vic2NyaWJlX2Zvcl9pbmRpY2F0aW9ucyhjb25uX2lkLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLmNjY19oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSkgewotICAgICAgICAgIERpc2Nvbm5lY3REZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBBU0UgQ29udHJvbCBQb2ludCBjaGFyYWN0ZXJpc3RpYywgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY2hhcmFjLnZhbHVlX2hhbmRsZSkgPDwgIiwgY2NjIGhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy5jY2NfaGRsKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBsZUF1ZGlvRGV2aWNlLT5rbm93bl9zZXJ2aWNlX2hhbmRsZXNfID0gdHJ1ZTsKLSAgICBsZUF1ZGlvRGV2aWNlLT5ub3RpZnlfY29ubmVjdGVkX2FmdGVyX3JlYWRfID0gdHJ1ZTsKLQotICAgIC8qIElmIGFscmVhZHkga25vd24gZ3JvdXAgaWQgKi8KLSAgICBpZiAobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICBBc2VJbml0aWFsU3RhdGVSZWFkUmVxdWVzdChsZUF1ZGlvRGV2aWNlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBJZiBkZXZpY2UgZG9lcyBub3QgYmVsb25nIHRvIGFueSBncm91cCB5ZXQgd2UgZWl0aGVyIGFkZCBpdCB0byB0aGUKLSAgICAgKiBncm91cCBieSBvdXIgc2VsZnMgbm93IG9yIHdhaXQgZm9yIENzaXMgdG8gZG8gaXQuIEluIGJvdGggY2FzZXMsIGxldCdzCi0gICAgICogY2hlY2sgaWYgZ3JvdXAgaXMgYWxyZWFkeSBhc3NpZ25lZC4KLSAgICAgKi8KLSAgICBpbnQgZ3JvdXBfaWQgPSBEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKAotICAgICAgICBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywgbGVfYXVkaW86OnV1aWQ6OmtDYXBTZXJ2aWNlVXVpZCk7Ci0gICAgaWYgKGdyb3VwX2lkICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICBpbnN0YW5jZS0+Z3JvdXBfYWRkX25vZGUoZ3JvdXBfaWQsIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBDU0lTIHdpbGwgdHJpZ2dlciBhZGRpbmcgdG8gZ3JvdXAgKi8KLSAgICBpZiAobGVBdWRpb0RldmljZS0+Y3Npc19tZW1iZXJfKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB3YWl0aW5nIGZvciBDU0lTIHRvIGNyZWF0ZSBncm91cCBmb3IgZGV2aWNlICIKLSAgICAgICAgICAgICAgICA8PCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGVyZSBpcyBubyBDc2lzIGp1c3QgYWRkIGRldmljZSBieSBvdXIgb3duICovCi0gICAgRGV2aWNlR3JvdXBzOjpHZXQoKS0+QWRkRGV2aWNlKGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6a0NhcFNlcnZpY2VVdWlkKTsKLSAgfQotCi0gIHZvaWQgT25HYXR0V3JpdGVDY2ModWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGRsLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gbGVBdWRpb0RldmljZXNfLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgYXNlPjo6aXRlcmF0b3IgYXNlX2l0OwotCi0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHVua25vd24gY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIiwgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgb24gY2NjOiAiIDw8IGxvZ2hleChoZGwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICIsIEZhaWxlZCB0byByZWdpc3RlciBmb3IgaW5kaWNhdGlvbnM6ICIgPDwgbG9naGV4KGhkbCkKLSAgICAgICAgICAgICAgIDw8ICIsIHN0YXR1czogIiA8PCBsb2doZXgoKGludCkoc3RhdHVzKSk7Ci0KLSAgICBhc2VfaXQgPQotICAgICAgICBzdGQ6OmZpbmRfaWYobGVBdWRpb0RldmljZS0+YXNlc18uYmVnaW4oKSwgbGVBdWRpb0RldmljZS0+YXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICBbJmhkbF0oY29uc3Qgc3RydWN0IGFzZSYgYXNlKSAtPiBib29sIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzZS5oZGxzLmNjY19oZGwgPT0gaGRsOwotICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoYXNlX2l0ID09IGxlQXVkaW9EZXZpY2UtPmFzZXNfLmVuZCgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIHVua25vd24gY2NjIGhhbmRsZTogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGhkbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWZfLCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlX2l0LT5oZGxzLnZhbF9oZGwpOwotICB9Ci0KLSAgdm9pZCBBdHRhY2hUb1N0cmVhbWluZ0dyb3VwSWZOZWVkZWQoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8gIT0gYWN0aXZlX2dyb3VwX2lkXykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXAgICIgPDwgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfCi0gICAgICAgICAgICAgICAgPDwgIiBpcyBub3Qgc3RyZWFtaW5nLiBOb3RoaW5nIHRvIGRvIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhdHRhY2hpbmcgdG8gZ3JvdXAgICIKLSAgICAgICAgICAgICAgPDwgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfOwotCi0gICAgLyogUmVzdG9yZSBjb25maWd1cmF0aW9uICovCi0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoYWN0aXZlX2dyb3VwX2lkXyk7Ci0gICAgYXV0byogc3RyZWFtX2NvbmYgPSAmZ3JvdXAtPnN0cmVhbV9jb25mOwotCi0gICAgaWYgKCFzdHJlYW1fY29uZi0+dmFsaWQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiBDb25maWd1cmF0aW9uIG5vdCB2YWxpZC4gKGJ0dyBub3Qgc3VyZSB3ZSBuZWVkIHRoaXMgIgotICAgICAgICAgICAgICAgICAgICAiZmxhZykiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxlX2F1ZGlvOjp0eXBlczo6QXVkaW9Mb2NhdGlvbnMgc2lua19ncm91cF9hdWRpb19sb2NhdGlvbnMgPSAwOwotICAgIHVpbnQ4X3Qgc2lua19udW1fb2ZfYWN0aXZlX2FzZXMgPSAwOwotCi0gICAgZm9yIChhdXRvIFtjaXNfaGFuZGxlLCBhdWRpb19sb2NhdGlvbl0gOiBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zKSB7Ci0gICAgICBzaW5rX2dyb3VwX2F1ZGlvX2xvY2F0aW9ucyB8PSBhdWRpb19sb2NhdGlvbjsKLSAgICAgIHNpbmtfbnVtX29mX2FjdGl2ZV9hc2VzKys7Ci0gICAgfQotCi0gICAgbGVfYXVkaW86OnR5cGVzOjpBdWRpb0xvY2F0aW9ucyBzb3VyY2VfZ3JvdXBfYXVkaW9fbG9jYXRpb25zID0gMDsKLSAgICB1aW50OF90IHNvdXJjZV9udW1fb2ZfYWN0aXZlX2FzZXMgPSAwOwotCi0gICAgZm9yIChhdXRvIFtjaXNfaGFuZGxlLCBhdWRpb19sb2NhdGlvbl0gOiBzdHJlYW1fY29uZi0+c291cmNlX3N0cmVhbXMpIHsKLSAgICAgIHNvdXJjZV9ncm91cF9hdWRpb19sb2NhdGlvbnMgfD0gYXVkaW9fbG9jYXRpb247Ci0gICAgICBzb3VyY2VfbnVtX29mX2FjdGl2ZV9hc2VzKys7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBlbnQgOiBzdHJlYW1fY29uZi0+Y29uZi0+Y29uZnMpIHsKLSAgICAgIGlmIChlbnQuZGlyZWN0aW9uID09IGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rKSB7Ci0gICAgICAgIC8qIFNpbmsqLwotICAgICAgICBpZiAoIWxlQXVkaW9EZXZpY2UtPkNvbmZpZ3VyZUFzZXMoZW50LCBncm91cC0+R2V0Q3VycmVudENvbnRleHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lua19udW1fb2ZfYWN0aXZlX2FzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rX2dyb3VwX2F1ZGlvX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9ncm91cF9hdWRpb19sb2NhdGlvbnMsIHRydWUpKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ291bGQgbm90IHNldCBzaW5rIGNvbmZpZ3VyYXRpb24gb2YgIgotICAgICAgICAgICAgICAgICAgICA8PCBzdHJlYW1fY29uZi0+Y29uZi0+bmFtZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFNvdXJjZSovCi0gICAgICAgIGlmICghbGVBdWRpb0RldmljZS0+Q29uZmlndXJlQXNlcyhlbnQsIGdyb3VwLT5HZXRDdXJyZW50Q29udGV4dFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VfbnVtX29mX2FjdGl2ZV9hc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua19ncm91cF9hdWRpb19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZ3JvdXBfYXVkaW9fbG9jYXRpb25zLCB0cnVlKSkgewotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENvdWxkIG5vdCBzZXQgc291cmNlIGNvbmZpZ3VyYXRpb24gb2YgIgotICAgICAgICAgICAgICAgICAgICA8PCBzdHJlYW1fY29uZi0+Y29uZi0+bmFtZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBncm91cFN0YXRlTWFjaGluZV8tPkF0dGFjaFRvU3RyZWFtKGdyb3VwLCBsZUF1ZGlvRGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgY29ubmVjdGlvblJlYWR5KExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBjYWxsYmFja3NfLT5PbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXyk7Ci0KLSAgICBpZiAobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfICE9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChsZUF1ZGlvRGV2aWNlLT5ncm91cF9pZF8pOwotICAgICAgVXBkYXRlQ29udGV4dEFuZExvY2F0aW9ucyhncm91cCwgbGVBdWRpb0RldmljZSk7Ci0gICAgICBBdHRhY2hUb1N0cmVhbWluZ0dyb3VwSWZOZWVkZWQobGVBdWRpb0RldmljZSk7Ci0gICAgfQotCi0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPmZpcnN0X2Nvbm5lY3Rpb25fKSB7Ci0gICAgICBidGlmX3N0b3JhZ2Vfc2V0X2xlYXVkaW9fYXV0b2Nvbm5lY3QobGVBdWRpb0RldmljZS0+YWRkcmVzc18sIHRydWUpOwotICAgICAgbGVBdWRpb0RldmljZS0+Zmlyc3RfY29ubmVjdGlvbl8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBib29sIElzQXNlQWNjZXB0aW5nQXVkaW9EYXRhKHN0cnVjdCBhc2UqIGFzZSkgewotICAgIGlmIChhc2UgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAgIGlmIChhc2UtPnN0YXRlICE9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykgcmV0dXJuIGZhbHNlOwotICAgIGlmIChhc2UtPmRhdGFfcGF0aF9zdGF0ZSAhPSBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkRBVEFfUEFUSF9FU1RBQkxJU0hFRCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBnZXRfbGVmdF9hbmRfcmlnaHRfc3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4mIGNoYW5fbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+JiBjaGFuX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVwYXJlX21vbm8gPSBmYWxzZSkgewotICAgIHVpbnQxNl90IG51bV9vZl9mcmFtZXNfcGVyX2NoID0gbGMzX2VuY29kZXItPmxjM0NvbmZpZy5ORjsKLQotICAgIGNoYW5fbGVmdC5yZXNlcnZlKG51bV9vZl9mcmFtZXNfcGVyX2NoKTsKLSAgICBjaGFuX3JpZ2h0LnJlc2VydmUobnVtX29mX2ZyYW1lc19wZXJfY2gpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX29mX2ZyYW1lc19wZXJfY2g7IGkrKykgewotICAgICAgY29uc3QgdWludDhfdCogc2FtcGxlID0gZGF0YS5kYXRhKCkgKyBpICogNDsKLQotICAgICAgaW50MTZfdCBsZWZ0ID0gKGludDE2X3QpKCgqKHNhbXBsZSArIDEpIDw8IDgpICsgKnNhbXBsZSkgPj4gMTsKLQotICAgICAgc2FtcGxlICs9IDI7Ci0gICAgICBpbnQxNl90IHJpZ2h0ID0gKGludDE2X3QpKCgqKHNhbXBsZSArIDEpIDw8IDgpICsgKnNhbXBsZSkgPj4gMTsKLQotICAgICAgaWYgKHByZXBhcmVfbW9ubykgewotICAgICAgICB1aW50MTZfdCBtb25vX2RhdGEgPSAoaW50MTZfdCkoKCh1aW50MzJfdClsZWZ0ICsgKHVpbnQzMl90KXJpZ2h0KSA+PiAxKTsKLSAgICAgICAgbGVmdCA9IG1vbm9fZGF0YTsKLSAgICAgICAgcmlnaHQgPSBtb25vX2RhdGE7Ci0gICAgICB9Ci0KLSAgICAgIGNoYW5fbGVmdC5wdXNoX2JhY2sobGVmdCk7Ci0gICAgICBjaGFuX3JpZ2h0LnB1c2hfYmFjayhyaWdodCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBQcmVwYXJlQW5kU2VuZFRvVHdvRGV2aWNlcygKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhLAotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpzdHJlYW1fY29uZmlndXJhdGlvbiogc3RyZWFtX2NvbmYpIHsKLSAgICB1aW50MTZfdCBieXRlX2NvdW50ID0gc3RyZWFtX2NvbmYtPnNpbmtfb2N0ZXRzX3Blcl9jb2RlY19mcmFtZTsKLSAgICB1aW50MTZfdCBsZWZ0X2Npc19oYW5kbGUgPSAwOwotICAgIHVpbnQxNl90IHJpZ2h0X2Npc19oYW5kbGUgPSAwOwotICAgIHVpbnQxNl90IG51bWJlcl9vZl9yZXF1aXJlZF9zYW1wbGVzX3Blcl9jaGFubmVsID0gbGMzX2VuY29kZXItPmxjM0NvbmZpZy5ORjsKLQotICAgIGZvciAoYXV0byBbY2lzX2hhbmRsZSwgYXVkaW9fbG9jYXRpb25dIDogc3RyZWFtX2NvbmYtPnNpbmtfc3RyZWFtcykgewotICAgICAgaWYgKGF1ZGlvX2xvY2F0aW9uICYgbGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkFueUxlZnQpCi0gICAgICAgIGxlZnRfY2lzX2hhbmRsZSA9IGNpc19oYW5kbGU7Ci0gICAgICBpZiAoYXVkaW9fbG9jYXRpb24gJiBsZV9hdWRpbzo6Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQW55UmlnaHQpCi0gICAgICAgIHJpZ2h0X2Npc19oYW5kbGUgPSBjaXNfaGFuZGxlOwotICAgIH0KLQotICAgIGlmIChkYXRhLnNpemUoKSA8IDIgLyogYnl0ZXMgcGVyIHNhbXBsZSAqLyAqIDIgLyogY2hhbm5lbHMgKi8gKgotICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVxdWlyZWRfc2FtcGxlc19wZXJfY2hhbm5lbCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTWlzc2luZyBzYW1wbGVzIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIG1vbm8gPSAobGVmdF9jaXNfaGFuZGxlID09IDApIHx8IChyaWdodF9jaXNfaGFuZGxlID09IDApOwotICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IGNoYW5fbGVmdDsKLSAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBjaGFuX3JpZ2h0OwotICAgIGdldF9sZWZ0X2FuZF9yaWdodF9zdHJlYW0oZGF0YSwgY2hhbl9sZWZ0LCBjaGFuX3JpZ2h0LCBtb25vKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoYW5fbGVmdF9lbmMoYnl0ZV9jb3VudCwgMCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY2hhbl9yaWdodF9lbmMoYnl0ZV9jb3VudCwgMCk7Ci0KLSAgICB1aW50OF90IGVyciA9IDA7Ci0gICAgaWYgKGxlZnRfY2lzX2hhbmRsZSkKLSAgICAgIGVyciB8PSBsYzNfZW5jb2Rlci0+cnVuKChjb25zdCBpbnQxNl90KiljaGFuX2xlZnQuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbl9sZWZ0X2VuYy5zaXplKCksIGNoYW5fbGVmdF9lbmMuZGF0YSgpLCAwKTsKLSAgICBpZiAocmlnaHRfY2lzX2hhbmRsZSkKLSAgICAgIGVyciB8PSBsYzNfZW5jb2Rlci0+cnVuKChjb25zdCBpbnQxNl90KiljaGFuX3JpZ2h0LmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5fcmlnaHRfZW5jLnNpemUoKSwgY2hhbl9yaWdodF9lbmMuZGF0YSgpLCAxKTsKLQotICAgIGlmIChlcnIgIT0gTGMzRW5jb2Rlcjo6RVJST1JfRlJFRSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiIGVycm9yIHdoaWxlIGVuY29kaW5nOyBlcnJvciBjb2RlOiAiCi0gICAgICAgICAgICAgICAgIDw8ICJcdCBlbmNvZGVkIHNhbXBsZXM6ICIgPDwgY2hhbl9sZWZ0X2VuYy5zaXplKCkKLSAgICAgICAgICAgICAgICAgPDwgIlx0IGVycjogIiA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihlcnIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFNlbmQgZGF0YSB0byB0aGUgY29udHJvbGxlciAqLwotICAgIGlmIChsZWZ0X2Npc19oYW5kbGUpCi0gICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZW5kSXNvRGF0YSgKLSAgICAgICAgICBsZWZ0X2Npc19oYW5kbGUsIGNoYW5fbGVmdF9lbmMuZGF0YSgpLCBjaGFuX2xlZnRfZW5jLnNpemUoKSk7Ci0KLSAgICBpZiAocmlnaHRfY2lzX2hhbmRsZSkKLSAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKAotICAgICAgICAgIHJpZ2h0X2Npc19oYW5kbGUsIGNoYW5fcmlnaHRfZW5jLmRhdGEoKSwgY2hhbl9yaWdodF9lbmMuc2l6ZSgpKTsKLSAgfQotCi0gIHZvaWQgUHJlcGFyZUFuZFNlbmRUb1NpbmdsZURldmljZSgKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhLAotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpzdHJlYW1fY29uZmlndXJhdGlvbiogc3RyZWFtX2NvbmYpIHsKLSAgICBpbnQgbnVtX2NoYW5uZWxzID0gbGMzX2VuY29kZXItPmxjM0NvbmZpZy5OYzsKLSAgICB1aW50MTZfdCBieXRlX2NvdW50ID0gc3RyZWFtX2NvbmYtPnNpbmtfb2N0ZXRzX3Blcl9jb2RlY19mcmFtZTsKLSAgICBhdXRvIGNpc19oYW5kbGUgPSBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zLmZyb250KCkuZmlyc3Q7Ci0gICAgdWludDE2X3QgbnVtYmVyX29mX3JlcXVpcmVkX3NhbXBsZXNfcGVyX2NoYW5uZWwgPSBsYzNfZW5jb2Rlci0+bGMzQ29uZmlnLk5GOwotCi0gICAgaWYgKChpbnQpZGF0YS5zaXplKCkgPCAoMiAvKiBieXRlcyBwZXIgc2FtcGxlICovICogbnVtX2NoYW5uZWxzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVxdWlyZWRfc2FtcGxlc19wZXJfY2hhbm5lbCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIk1pc3Npbmcgc2FtcGxlcyI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY2hhbl9lbmNvZGVkKG51bV9jaGFubmVscyAqIGJ5dGVfY291bnQsIDApOwotICAgIHVpbnQ4X3QgZXJyID0gMDsKLSAgICBpZiAobnVtX2NoYW5uZWxzID09IDEpIHsKLSAgICAgIGVyciA9IGxjM19lbmNvZGVyLT5ydW4oKGNvbnN0IGludDE2X3QqKWRhdGEuZGF0YSgpLCBieXRlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuX2VuY29kZWQuZGF0YSgpLCAwKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBjaGFuX2xlZnQ7Ci0gICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBjaGFuX3JpZ2h0OwotICAgICAgZ2V0X2xlZnRfYW5kX3JpZ2h0X3N0cmVhbShkYXRhLCBjaGFuX2xlZnQsIGNoYW5fcmlnaHQsIGZhbHNlKTsKLQotICAgICAgZXJyIHw9IGxjM19lbmNvZGVyLT5ydW4oKGNvbnN0IGludDE2X3QqKWNoYW5fbGVmdC5kYXRhKCksIGJ5dGVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuX2VuY29kZWQuZGF0YSgpLCAwKTsKLQotICAgICAgZXJyIHw9IGxjM19lbmNvZGVyLT5ydW4oKGNvbnN0IGludDE2X3QqKWNoYW5fcmlnaHQuZGF0YSgpLCBieXRlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbl9lbmNvZGVkLmRhdGEoKSArIGJ5dGVfY291bnQsIDEpOwotICAgIH0KLQotICAgIGlmIChlcnIgIT0gTGMzRW5jb2Rlcjo6RVJST1JfRlJFRSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiIGVycm9yIHdoaWxlIGVuY29kaW5nOyBlcnJvciBjb2RlOiAiCi0gICAgICAgICAgICAgICAgIDw8ICJcdCBlcnI6ICIgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oZXJyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBTZW5kIGRhdGEgdG8gdGhlIGNvbnRyb2xsZXIgKi8KLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZW5kSXNvRGF0YShjaXNfaGFuZGxlLCBjaGFuX2VuY29kZWQuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5fZW5jb2RlZC5zaXplKCkpOwotICB9Ci0KLSAgc3RydWN0IGxlX2F1ZGlvOjpzdHJlYW1fY29uZmlndXJhdGlvbiogR2V0U3RyZWFtU2lua0NvbmZpZ3VyYXRpb24oCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgc3RydWN0IGxlX2F1ZGlvOjpzdHJlYW1fY29uZmlndXJhdGlvbiogc3RyZWFtX2NvbmYgPSAmZ3JvdXAtPnN0cmVhbV9jb25mOwotICAgIGludCBudW1fb2ZfZGV2aWNlcyA9IDA7Ci0gICAgaW50IG51bV9vZl9jaGFubmVscyA9IDA7Ci0gICAgdWludDMyX3Qgc2FtcGxlX2ZyZXFfaHogPSAwOwotICAgIHVpbnQzMl90IGZyYW1lX2R1cmF0aW9uX3VzID0gMDsKLSAgICB1aW50MTZfdCBvY3RldHNfcGVyX2ZyYW1lID0gMDsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdyb3VwX2lkOiAiIDw8IGdyb3VwLT5ncm91cF9pZF87Ci0KLSAgICAvKiBUaGlzIGNvbnRhaW5zIHBhaXIgb2YgY2lzIGhhbmRsZSBhbmQgYXVkaW8gbG9jYXRpb24gKi8KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQzMl90Pj4gc3RyZWFtczsKLQotICAgIGZvciAoYXV0byogZGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0QWN0aXZlRGV2aWNlKCk7IGRldmljZSAhPSBudWxscHRyOwotICAgICAgICAgZGV2aWNlID0gZ3JvdXAtPkdldE5leHRBY3RpdmVEZXZpY2UoZGV2aWNlKSkgewotICAgICAgYXV0byogYXNlID0gZGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGlyZWN0aW9uKAotICAgICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rKTsKLQotICAgICAgaWYgKGFzZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImRldmljZTogIiA8PCBkZXZpY2UtPmFkZHJlc3NfOwotICAgICAgICBudW1fb2ZfZGV2aWNlcysrOwotICAgICAgfQotCi0gICAgICBmb3IgKDsgYXNlICE9IG51bGxwdHI7Ci0gICAgICAgICAgIGFzZSA9IGRldmljZS0+R2V0TmV4dEFjdGl2ZUFzZVdpdGhTYW1lRGlyZWN0aW9uKGFzZSkpIHsKLSAgICAgICAgc3RyZWFtcy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICBhc2UtPmNpc19jb25uX2hkbCwgYXNlLT5jb2RlY19jb25maWcuYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uKSk7Ci0gICAgICAgIG51bV9vZl9jaGFubmVscyArPSBhc2UtPmNvZGVjX2NvbmZpZy5jaGFubmVsX2NvdW50OwotICAgICAgICBpZiAoc2FtcGxlX2ZyZXFfaHogPT0gMCkgewotICAgICAgICAgIHNhbXBsZV9mcmVxX2h6ID0gYXNlLT5jb2RlY19jb25maWcuR2V0U2FtcGxpbmdGcmVxdWVuY3lIeigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPR19BU1NFUlQoc2FtcGxlX2ZyZXFfaHogPT0KLSAgICAgICAgICAgICAgICAgICAgIGFzZS0+Y29kZWNfY29uZmlnLkdldFNhbXBsaW5nRnJlcXVlbmN5SHooKSkKLSAgICAgICAgICAgICAgPDwgX19mdW5jX18gPDwgIiBzYW1wbGUgZnJlcSBtaXNtYXRjaDogIiA8PCArc2FtcGxlX2ZyZXFfaHoKLSAgICAgICAgICAgICAgPDwgIiAhPSAiIDw8IGFzZS0+Y29kZWNfY29uZmlnLkdldFNhbXBsaW5nRnJlcXVlbmN5SHooKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmcmFtZV9kdXJhdGlvbl91cyA9PSAwKSB7Ci0gICAgICAgICAgZnJhbWVfZHVyYXRpb25fdXMgPSBhc2UtPmNvZGVjX2NvbmZpZy5HZXRGcmFtZUR1cmF0aW9uVXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBMT0dfQVNTRVJUKGZyYW1lX2R1cmF0aW9uX3VzID09Ci0gICAgICAgICAgICAgICAgICAgICBhc2UtPmNvZGVjX2NvbmZpZy5HZXRGcmFtZUR1cmF0aW9uVXMoKSkKLSAgICAgICAgICAgICAgPDwgX19mdW5jX18gPDwgIiBmcmFtZSBkdXJhdGlvbiBtaXNtYXRjaDogIiA8PCArZnJhbWVfZHVyYXRpb25fdXMKLSAgICAgICAgICAgICAgPDwgIiAhPSAiIDw8IGFzZS0+Y29kZWNfY29uZmlnLkdldEZyYW1lRHVyYXRpb25VcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9jdGV0c19wZXJfZnJhbWUgPT0gMCkgewotICAgICAgICAgIG9jdGV0c19wZXJfZnJhbWUgPSBhc2UtPmNvZGVjX2NvbmZpZy5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPR19BU1NFUlQob2N0ZXRzX3Blcl9mcmFtZSA9PQotICAgICAgICAgICAgICAgICAgICAgYXNlLT5jb2RlY19jb25maWcub2N0ZXRzX3Blcl9jb2RlY19mcmFtZSkKLSAgICAgICAgICAgICAgPDwgX19mdW5jX18gPDwgIiBvY3RldHMgcGVyIGZyYW1lIG1pc21hdGNoOiAiIDw8ICtvY3RldHNfcGVyX2ZyYW1lCi0gICAgICAgICAgICAgIDw8ICIgIT0gIiA8PCBhc2UtPmNvZGVjX2NvbmZpZy5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQWRkZWQgQ0lTOiAiIDw8ICthc2UtPmNpc19jb25uX2hkbAotICAgICAgICAgICAgICAgICAgPDwgIiB0byBzdHJlYW0uIEFsbG9jYXRpb246ICIKLSAgICAgICAgICAgICAgICAgIDw8ICthc2UtPmNvZGVjX2NvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgIDw8ICIgc2FtcGxlX2ZyZXE6ICIgPDwgK3NhbXBsZV9mcmVxX2h6Ci0gICAgICAgICAgICAgICAgICA8PCAiIGZyYW1lX2R1cmF0aW9uOiAiIDw8ICtmcmFtZV9kdXJhdGlvbl91cwotICAgICAgICAgICAgICAgICAgPDwgIiBvY3RlY3RzIHBlciBmcmFtZTogIiA8PCArb2N0ZXRzX3Blcl9mcmFtZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RyZWFtcy5lbXB0eSgpKSByZXR1cm4gbnVsbHB0cjsKLQotICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMgPSBzdGQ6Om1vdmUoc3RyZWFtcyk7Ci0gICAgc3RyZWFtX2NvbmYtPnNpbmtfbnVtX29mX2RldmljZXMgPSBudW1fb2ZfZGV2aWNlczsKLSAgICBzdHJlYW1fY29uZi0+c2lua19udW1fb2ZfY2hhbm5lbHMgPSBudW1fb2ZfY2hhbm5lbHM7Ci0gICAgc3RyZWFtX2NvbmYtPnNpbmtfc2FtcGxlX2ZyZXF1ZW5jeV9oeiA9IHNhbXBsZV9mcmVxX2h6OwotICAgIHN0cmVhbV9jb25mLT5zaW5rX2ZyYW1lX2R1cmF0aW9uX3VzID0gZnJhbWVfZHVyYXRpb25fdXM7Ci0gICAgc3RyZWFtX2NvbmYtPnNpbmtfb2N0ZXRzX3Blcl9jb2RlY19mcmFtZSA9IG9jdGV0c19wZXJfZnJhbWU7Ci0gICAgc3RyZWFtX2NvbmYtPnZhbGlkID0gdHJ1ZTsKLSAgICBzdHJlYW1fY29uZi0+Y29uZiA9IGdyb3VwLT5HZXRBY3RpdmVDb25maWd1cmF0aW9uKCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjb25maWd1cmF0aW9uOiAiIDw8IHN0cmVhbV9jb25mLT5jb25mLT5uYW1lOwotCi0gICAgcmV0dXJuIHN0cmVhbV9jb25mOwotICB9Ci0KLSAgdm9pZCBPbkF1ZGlvRGF0YVJlYWR5KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgaWYgKGFjdGl2ZV9ncm91cF9pZF8gPT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24gfHwKLSAgICAgICAgIWF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kKQotICAgICAgcmV0dXJuOwotCi0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoYWN0aXZlX2dyb3VwX2lkXyk7Ci0gICAgaWYgKCFncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiVGhlcmUgaXMgbm8gc3RyZWFtaW5nIGdyb3VwIGF2YWlsYWJsZSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBzdHJlYW1fY29uZiA9IGdyb3VwLT5zdHJlYW1fY29uZjsKLSAgICBpZiAoIXN0cmVhbV9jb25mLnZhbGlkIHx8IChzdHJlYW1fY29uZi5zaW5rX251bV9vZl9kZXZpY2VzID4gMikpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBTdHJlYW0gY29uZmlndWZhdGlvbiBpcyBub3QgdmFsaWQuIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RyZWFtX2NvbmYuc2lua19udW1fb2ZfZGV2aWNlcyA9PSAyKSB7Ci0gICAgICBQcmVwYXJlQW5kU2VuZFRvVHdvRGV2aWNlcyhkYXRhLCAmc3RyZWFtX2NvbmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBQcmVwYXJlQW5kU2VuZFRvU2luZ2xlRGV2aWNlKGRhdGEsICZzdHJlYW1fY29uZik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTZW5kQXVkaW9EYXRhKHVpbnQ4X3QqIGRhdGEsIHVpbnQxNl90IHNpemUpIHsKLSAgICAvKiBHZXQgb25seSBvbmUgY2hhbm5lbCBmb3IgTU9OTyBtaWNyb3Bob25lICovCi0gICAgLyogR2F0aGVyIGRhdGEgZm9yIGNoYW5uZWwgKi8KLSAgICB1aW50MTZfdCByZXF1aXJlZF9mb3JfY2hhbm5lbF9ieXRlX2NvdW50ID0KLSAgICAgICAgbGMzX2RlY29kZXItPmxjM0NvbmZpZy5nZXRCeXRlQ291bnRGcm9tQml0cmF0ZSgzMjAwMCk7Ci0gICAgc2l6ZV90IHJlcXVpcmVkX2J5dGVfY291bnQgPSBjdXJyZW50X3NpbmtfY29kZWNfY29uZmlnLm51bV9jaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9mb3JfY2hhbm5lbF9ieXRlX2NvdW50OwotCi0gICAgaWYgKHJlcXVpcmVkX2J5dGVfY291bnQgIT0gc2l6ZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiSW5zdWZmaWNpZW50IGRhdGEgZm9yIGRlY29kaW5nIGFuZCBzZW5kLCByZXF1aXJlZDogIgotICAgICAgICAgICAgICAgICA8PCBpbnQocmVxdWlyZWRfYnl0ZV9jb3VudCkgPDwgIiwgcmVjZWl2ZWQ6ICIgPDwgaW50KHNpemUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQ4X3QgQkVDX2RldGVjdCA9IDA7Ci0gICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gcGNtX2RhdGFfZGVjb2RlZChsYzNfZGVjb2Rlci0+bGMzQ29uZmlnLk5GLCAwKTsKLSAgICBhdXRvIGVyciA9IGxjM19kZWNvZGVyLT5ydW4oZGF0YSwgcmVxdWlyZWRfZm9yX2NoYW5uZWxfYnl0ZV9jb3VudCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtX2RhdGFfZGVjb2RlZC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbV9kYXRhX2RlY29kZWQuc2l6ZSgpLCBCRUNfZGV0ZWN0KTsKLQotICAgIC8qIFRPRE86IEhvdyBoYW5kbGUgZmFpbGluZyBkZWNvZGluZyA/ICovCi0gICAgaWYgKGVyciAhPSBMYzNEZWNvZGVyOjpFUlJPUl9GUkVFKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICIgZXJyb3Igd2hpbGUgZGVjb2RpbmcgZXJyb3IgY29kZTogIgotICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGVycik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdWludDE2X3QgdG9fd3JpdGUgPSBzaXplb2YoaW50MTZfdCkgKiBwY21fZGF0YV9kZWNvZGVkLnNpemUoKTsKLSAgICB1aW50MTZfdCB3cml0dGVuID0gTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U2VuZERhdGEoCi0gICAgICAgICh1aW50OF90KilwY21fZGF0YV9kZWNvZGVkLmRhdGEoKSwgdG9fd3JpdGUpOwotCi0gICAgLyogVE9ETzogV2hhdCB0byBkbyBpZiBub3QgYWxsIGRhdGEgc2lua2VkID8gKi8KLSAgICBpZiAod3JpdHRlbiAhPSB0b193cml0ZSkgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBub3QgYWxsIGRhdGEgc2lua2VkIjsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uIExjM0NvbmZpZ0ZyYW1lRHVyYXRpb24oCi0gICAgICB1aW50MzJfdCBmcmFtZV9kdXJhdGlvbl91cykgewotICAgIGlmIChmcmFtZV9kdXJhdGlvbl91cyA9PSBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uOjprSW50ZXJ2YWw3NTAwVXMpCi0gICAgICByZXR1cm4gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkN3A1bXM7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXM7Ci0gIH0KLQotICBib29sIFN0YXJ0U2VuZGluZ0F1ZGlvKGludCBncm91cF9pZCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGdyb3VwX2lkKTsKLSAgICBMZUF1ZGlvRGV2aWNlKiBkZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICBMT0dfQVNTRVJUKGRldmljZSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIGRldmljZS4iOwotCi0gICAgLyogQXNzdW1lIDIgYXNlcyBtYXgganVzdCBmb3Igbm93LiAqLwotICAgIGF1dG8qIHN0cmVhbV9jb25mID0gR2V0U3RyZWFtU2lua0NvbmZpZ3VyYXRpb24oZ3JvdXApOwotICAgIGlmIChzdHJlYW1fY29uZiA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgY291bGQgbm90IGdldCBzaW5rIGNvbmZpZ3VyYXRpb24iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChsYzNfZW5jb2RlcikgewotICAgICAgTE9HKFdBUk5JTkcpCi0gICAgICAgICAgPDwgIiBUaGUgZW5jb2RlciBpbnN0YW5jZSBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgcmVsZWFzZWQuIjsKLSAgICAgIGRlbGV0ZSBsYzNfZW5jb2RlcjsKLSAgICAgIGxjM19lbmNvZGVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiBPbmUgb3IgbXVsdGlwbGUgYXVkaW8gY2hhbm5lbHMgZW5jb2RlciAqLwotICAgIGxjM19lbmNvZGVyID0gbmV3IExjM0VuY29kZXIoTGMzQ29uZmlnKAotICAgICAgICBjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgIExjM0NvbmZpZ0ZyYW1lRHVyYXRpb24oY3VycmVudF9zb3VyY2VfY29kZWNfY29uZmlnLmRhdGFfaW50ZXJ2YWxfdXMpLAotICAgICAgICBjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcubnVtX2NoYW5uZWxzKSk7Ci0KLSAgICB1aW50MTZfdCByZW1vdGVfZGVsYXlfbXMgPQotICAgICAgICBncm91cC0+R2V0UmVtb3RlRGVsYXkobGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspOwotCi0gICAgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpVcGRhdGVSZW1vdGVEZWxheShyZW1vdGVfZGVsYXlfbXMpOwotICAgIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RydWN0IGxlX2F1ZGlvOjpzdHJlYW1fY29uZmlndXJhdGlvbiogR2V0U3RyZWFtU291cmNlQ29uZmlndXJhdGlvbigKLSAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXApIHsKLSAgICBMZUF1ZGlvRGV2aWNlKiBkZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICBMT0dfQVNTRVJUKGRldmljZSkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIGRldmljZS4iOwotCi0gICAgYXNlKiBhc2UgPSBkZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlQnlEaXJlY3Rpb24oCi0gICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25Tb3VyY2UpOwotCi0gICAgaWYgKCFhc2UpIHJldHVybiBudWxscHRyOwotCi0gICAgLyogRm9yIG5vdyB3ZSBzdXBwb3J0IG9uZSBtaWNyb3Bob25lIG9ubHkqLwotCi0gICAgYXV0byogc3RyZWFtX2NvbmYgPSAmZ3JvdXAtPnN0cmVhbV9jb25mOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDMyX3Q+PiBzdHJlYW1zOwotCi0gICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgYXNlLT5jaXNfY29ubl9oZGwsIGFzZS0+Y29kZWNfY29uZmlnLmF1ZGlvX2NoYW5uZWxfYWxsb2NhdGlvbikpOwotCi0gICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9udW1fb2ZfZGV2aWNlcyA9IDE7Ci0gICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9udW1fb2ZfY2hhbm5lbHMgPSAxOwotICAgIHN0cmVhbV9jb25mLT5zb3VyY2Vfc2FtcGxlX2ZyZXF1ZW5jeV9oeiA9Ci0gICAgICAgIGFzZS0+Y29kZWNfY29uZmlnLkdldFNhbXBsaW5nRnJlcXVlbmN5SHooKTsKLSAgICBzdHJlYW1fY29uZi0+c291cmNlX2ZyYW1lX2R1cmF0aW9uX3VzID0KLSAgICAgICAgYXNlLT5jb2RlY19jb25maWcuR2V0RnJhbWVEdXJhdGlvblVzKCk7Ci0gICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9vY3RldHNfcGVyX2NvZGVjX2ZyYW1lID0KLSAgICAgICAgYXNlLT5jb2RlY19jb25maWcub2N0ZXRzX3Blcl9jb2RlY19mcmFtZTsKLSAgICBzdHJlYW1fY29uZi0+dmFsaWQgPSB0cnVlOwotCi0gICAgc3RyZWFtX2NvbmYtPmNvbmYgPSBncm91cC0+R2V0QWN0aXZlQ29uZmlndXJhdGlvbigpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQWRkZWQgQ0lTOiAiIDw8ICthc2UtPmNpc19jb25uX2hkbAotICAgICAgICAgICAgICA8PCAiIHRvIHN0cmVhbS4gQWxsb2NhdGlvbjogIgotICAgICAgICAgICAgICA8PCArYXNlLT5jb2RlY19jb25maWcuYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uCi0gICAgICAgICAgICAgIDw8ICIgc2FtcGxlX2ZyZXE6ICIgPDwgK3N0cmVhbV9jb25mLT5zb3VyY2Vfc2FtcGxlX2ZyZXF1ZW5jeV9oegotICAgICAgICAgICAgICA8PCAiIGZyYW1lX2R1cmF0aW9uOiAiIDw8ICtzdHJlYW1fY29uZi0+c291cmNlX2ZyYW1lX2R1cmF0aW9uX3VzCi0gICAgICAgICAgICAgIDw8ICIgb2N0ZWN0cyBwZXIgZnJhbWU6ICIKLSAgICAgICAgICAgICAgPDwgK3N0cmVhbV9jb25mLT5zb3VyY2Vfb2N0ZXRzX3Blcl9jb2RlY19mcmFtZTsKLQotICAgIHJldHVybiBzdHJlYW1fY29uZjsKLSAgfQotCi0gIHZvaWQgU3RhcnRSZWNlaXZpbmdBdWRpbyhpbnQgZ3JvdXBfaWQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChncm91cF9pZCk7Ci0KLSAgICBhdXRvKiBzdHJlYW1fY29uZiA9IEdldFN0cmVhbVNvdXJjZUNvbmZpZ3VyYXRpb24oZ3JvdXApOwotICAgIGlmICghc3RyZWFtX2NvbmYpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiIENvdWxkIG5vdCBnZXQgc291cmNlIGNvbmZpZ3VyYXRpb24gZm9yIGdyb3VwICIKLSAgICAgICAgICAgICAgICAgICA8PCBhY3RpdmVfZ3JvdXBfaWRfIDw8ICIgcHJvYmFibHkgbWljcm9waG9uZSBub3QgY29uZmlndXJlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGMzQ29uZmlnIGxjM0NvbmZpZygKLSAgICAgICAgY3VycmVudF9zaW5rX2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgTGMzQ29uZmlnRnJhbWVEdXJhdGlvbihjdXJyZW50X3NpbmtfY29kZWNfY29uZmlnLmRhdGFfaW50ZXJ2YWxfdXMpLCAxKTsKLQotICAgIGxjM19kZWNvZGVyID0gbmV3IExjM0RlY29kZXIobGMzQ29uZmlnKTsKLQotICAgIHVpbnQxNl90IHJlbW90ZV9kZWxheV9tcyA9Ci0gICAgICAgIGdyb3VwLT5HZXRSZW1vdGVEZWxheShsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKTsKLQotICAgIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlVwZGF0ZVJlbW90ZURlbGF5KHJlbW90ZV9kZWxheV9tcyk7Ci0gICAgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgfQotCi0gIHZvaWQgU3VzcGVuZEF1ZGlvKHZvaWQpIHsKLSAgICBhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmUgPSBmYWxzZTsKLSAgICBhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCA9IGZhbHNlOwotCi0gICAgaWYgKGxjM19lbmNvZGVyKSB7Ci0gICAgICBkZWxldGUgbGMzX2VuY29kZXI7Ci0gICAgICBsYzNfZW5jb2RlciA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgaWYgKGxjM19kZWNvZGVyKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzdG9wcGluZyBzaW5rIjsKLQotICAgICAgZGVsZXRlIGxjM19kZWNvZGVyOwotICAgICAgbGMzX2RlY29kZXIgPSBudWxscHRyOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU3RvcEF1ZGlvKHZvaWQpIHsKLSAgICBTdXNwZW5kQXVkaW8oKTsKLSAgICBDbGllbnRBdWRpb0ludGVmcmFjZVJlbGVhc2UoKTsKLSAgfQotCi0gIHZvaWQgRHVtcChpbnQgZmQpIHsKLSAgICBkcHJpbnRmKGZkLCAiICBBY3RpdmUgZ3JvdXA6ICVkXG4iLCBhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICBkcHJpbnRmKGZkLCAiICBMRSBBdWRpbyBHcm91cHM6XG4iKTsKLSAgICBhc2VHcm91cHNfLkR1bXAoZmQpOwotICAgIGRwcmludGYoZmQsICIgIE5vdCBncm91cGVkIGRldmljZXM6XG4iKTsKLSAgICBsZUF1ZGlvRGV2aWNlc18uRHVtcChmZCwgYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pOwotICB9Ci0KLSAgdm9pZCBDbGVhbnVwKHZvaWQpIHsKLSAgICBsZUF1ZGlvRGV2aWNlc18uQ2xlYW51cCgpOwotICAgIGFzZUdyb3Vwc18uQ2xlYW51cCgpOwotICAgIFN0b3BBdWRpbygpOwotICAgIGlmIChnYXR0X2lmXykgQlRBX0dBVFRDX0FwcERlcmVnaXN0ZXIoZ2F0dF9pZl8pOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVDdXJyZW50SGFsU2Vzc2lvbnMoaW50IGdyb3VwX2lkLCBMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gICAgaWYgKGdyb3VwX2lkID09IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIiwgY2Fubm90IHN0YXJ0IHN0cmFtaW5nIGlmIG5vIGFjdGl2ZSBncm91cCBzZXQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGdyb3VwX2lkKTsKLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIEludmFsaWQgZ3JvdXA6ICIgPDwgc3RhdGljX2Nhc3Q8aW50Pihncm91cF9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjpvcHRpb25hbDxMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uPiBzb3VyY2VfY29uZmlndXJhdGlvbiA9Ci0gICAgICAgIGdyb3VwLT5HZXRDb2RlY0NvbmZpZ3VyYXRpb25CeURpcmVjdGlvbigKLSAgICAgICAgICAgIGNvbnRleHRfdHlwZSwgbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspOwotICAgIHN0ZDo6b3B0aW9uYWw8TGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbj4gc2lua19jb25maWd1cmF0aW9uID0KLSAgICAgICAgZ3JvdXAtPkdldENvZGVjQ29uZmlndXJhdGlvbkJ5RGlyZWN0aW9uKAotICAgICAgICAgICAgY29udGV4dF90eXBlLCBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKTsKLQotICAgIGlmIChzb3VyY2VfY29uZmlndXJhdGlvbikgewotICAgICAgYm9vbCBzZW5kX2FjdGl2ZSA9IGZhbHNlOwotICAgICAgLyogU3RyZWFtIGNvbmZpZ3VyYXRpb24gZGlmZmVycyBmcm9tIHByZXZpb3VzIG9uZSAqLwotICAgICAgaWYgKCFjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcuSXNJbnZhbGlkKCkgJiYKLSAgICAgICAgICAoKnNvdXJjZV9jb25maWd1cmF0aW9uICE9IGN1cnJlbnRfc291cmNlX2NvZGVjX2NvbmZpZykpIHsKLSAgICAgICAgY2FsbGJhY2tzXy0+T25Hcm91cFN0YXR1cyhncm91cF9pZCwgR3JvdXBTdGF0dXM6OklOQUNUSVZFKTsKLSAgICAgICAgc2VuZF9hY3RpdmUgPSB0cnVlOwotICAgICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0b3AoKTsKLSAgICAgIH0KLQotICAgICAgY3VycmVudF9zb3VyY2VfY29kZWNfY29uZmlnID0gKnNvdXJjZV9jb25maWd1cmF0aW9uOwotCi0gICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0YXJ0KGN1cnJlbnRfc291cmNlX2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TaW5rUmVjZWl2ZXIpOwotICAgICAgaWYgKHNlbmRfYWN0aXZlKSB7Ci0gICAgICAgIGNhbGxiYWNrc18tPk9uR3JvdXBTdGF0dXMoZ3JvdXBfaWQsIEdyb3VwU3RhdHVzOjpBQ1RJVkUpOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghY3VycmVudF9zb3VyY2VfY29kZWNfY29uZmlnLklzSW52YWxpZCgpKSB7Ci0gICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6U3RvcCgpOwotICAgICAgICBjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcgPSB7MCwgMCwgMCwgMH07Ci0gICAgICB9Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgIDw8ICIsIGdyb3VwIGRvZXMgbm90IHN1cHBvcnRzIHNvdXJjZSBkaXJlY3Rpb24gZm9yIgotICAgICAgICAgICAgICAgICAgICIgY29udGV4dDogIgotICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oY29udGV4dF90eXBlKTsKLSAgICB9Ci0KLSAgICBpZiAoc2lua19jb25maWd1cmF0aW9uKSB7Ci0gICAgICBib29sIHNlbmRfYWN0aXZlID0gZmFsc2U7Ci0gICAgICAvKiBTdHJlYW0gY29uZmlndXJhdGlvbiBkaWZmZXJzIGZyb20gcHJldmlvdXMgb25lICovCi0gICAgICBpZiAoIWN1cnJlbnRfc2lua19jb2RlY19jb25maWcuSXNJbnZhbGlkKCkgJiYKLSAgICAgICAgICAoKnNpbmtfY29uZmlndXJhdGlvbiAhPSBjdXJyZW50X3NpbmtfY29kZWNfY29uZmlnKSkgewotICAgICAgICBjYWxsYmFja3NfLT5Pbkdyb3VwU3RhdHVzKGdyb3VwX2lkLCBHcm91cFN0YXR1czo6SU5BQ1RJVkUpOwotICAgICAgICBzZW5kX2FjdGl2ZSA9IHRydWU7Ci0gICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0b3AoKTsKLSAgICAgIH0KLQotICAgICAgY3VycmVudF9zaW5rX2NvZGVjX2NvbmZpZyA9ICpzaW5rX2NvbmZpZ3VyYXRpb247Ci0KLSAgICAgIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0YXJ0KGN1cnJlbnRfc2lua19jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVJlY2VpdmVyKTsKLSAgICAgIGlmIChzZW5kX2FjdGl2ZSkgewotICAgICAgICBjYWxsYmFja3NfLT5Pbkdyb3VwU3RhdHVzKGdyb3VwX2lkLCBHcm91cFN0YXR1czo6QUNUSVZFKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFjdXJyZW50X3NpbmtfY29kZWNfY29uZmlnLklzSW52YWxpZCgpKSB7Ci0gICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0b3AoKTsKLSAgICAgICAgY3VycmVudF9zaW5rX2NvZGVjX2NvbmZpZyA9IHswLCAwLCAwLCAwfTsKLSAgICAgIH0KLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIiwgZ3JvdXAgZG9lcyBub3Qgc3VwcG9ydHMgc2luayBkaXJlY3Rpb24gZm9yIgotICAgICAgICAgICAgICAgICAgICIgY29udGV4dDogIgotICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oY29udGV4dF90eXBlKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9SZXN1bWUoKSB7Ci0gICAgaWYgKGFjdGl2ZV9ncm91cF9pZF8gPT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiLCBjYW5ub3Qgc3RhcnQgc3RyYW1pbmcgaWYgbm8gYWN0aXZlIGdyb3VwIHNldCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoYWN0aXZlX2dyb3VwX2lkXyk7Ci0gICAgaWYgKCFncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiLCBJbnZhbGlkIGdyb3VwOiAiIDw8IHN0YXRpY19jYXN0PGludD4oYWN0aXZlX2dyb3VwX2lkXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjpvcHRpb25hbDxMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uPiBzb3VyY2VfY29uZmlndXJhdGlvbiA9Ci0gICAgICAgIGdyb3VwLT5HZXRDb2RlY0NvbmZpZ3VyYXRpb25CeURpcmVjdGlvbigKLSAgICAgICAgICAgIGN1cnJlbnRfY29udGV4dF90eXBlXywgbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspOwotICAgIHN0ZDo6b3B0aW9uYWw8TGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbj4gc2lua19jb25maWd1cmF0aW9uID0KLSAgICAgICAgZ3JvdXAtPkdldENvZGVjQ29uZmlndXJhdGlvbkJ5RGlyZWN0aW9uKAotICAgICAgICAgICAgY3VycmVudF9jb250ZXh0X3R5cGVfLCBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKTsKLQotICAgIC8qIENoZWNrIGlmIEJsdWV0b290aCBhdWRpbyBIQUwgc2Vzc2lvbiByZXF1aXJlcyByZWNvbmZpZ3VyYXRpb24gKi8KLSAgICBib29sIHNlc3Npb25zX3JlcXVpcmVzX3VwZGF0ZSA9Ci0gICAgICAgICgoKHNvdXJjZV9jb25maWd1cmF0aW9uICYmCi0gICAgICAgICAgICgqc291cmNlX2NvbmZpZ3VyYXRpb24gIT0gY3VycmVudF9zb3VyY2VfY29kZWNfY29uZmlnKSkgfHwKLSAgICAgICAgICAoIXNvdXJjZV9jb25maWd1cmF0aW9uICYmCi0gICAgICAgICAgICFjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcuSXNJbnZhbGlkKCkpKSkgfHwKLSAgICAgICAgKChzaW5rX2NvbmZpZ3VyYXRpb24gJiYKLSAgICAgICAgICAoKnNpbmtfY29uZmlndXJhdGlvbiAhPSBjdXJyZW50X3NpbmtfY29kZWNfY29uZmlnKSkgfHwKLSAgICAgICAgICghc2lua19jb25maWd1cmF0aW9uICYmICFjdXJyZW50X3NpbmtfY29kZWNfY29uZmlnLklzSW52YWxpZCgpKSk7Ci0gICAgaWYgKHNlc3Npb25zX3JlcXVpcmVzX3VwZGF0ZSkgewotICAgICAgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpOwotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmTGVBdWRpb0NsaWVudEltcGw6OlVwZGF0ZUN1cnJlbnRIYWxTZXNzaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChpbnN0YW5jZSksIGFjdGl2ZV9ncm91cF9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY29udGV4dF90eXBlXykpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRPRE8gY2hlY2sgaWYgZ3JvdXAgYWxyZWFkeSBzdGFydGVkIHN0cmVhbWluZyAqLwotCi0gICAgR3JvdXBTdHJlYW0oYWN0aXZlX2dyb3VwX2lkXywgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGN1cnJlbnRfY29udGV4dF90eXBlXykpOwotICB9Ci0KLSAgdm9pZCBPbkF1ZGlvU3VzcGVuZCgpIHsKLSAgICBpZiAoYWN0aXZlX2dyb3VwX2lkXyA9PSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICIsIHRoZXJlIGlzIG5vIGxvbmdlciBhY3RpdmUgZ3JvdXAiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdyb3VwU3RvcChhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgfQotCi0gIHZvaWQgT25BdWRpb1NpbmtTdXNwZW5kKCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIGlmICghYXVkaW9fc291cmNlX3JlYWR5X3RvX3NlbmQpIHJldHVybjsKLQotICAgIGF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kID0gZmFsc2U7Ci0KLSAgICAvKiBMYXN0IHN1c3BlbmRzIGdyb3VwIC0gdHJpZ2dlcnMgZ3JvdXAgc3RvcCAqLwotICAgIGlmICghYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlICYmICFhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCkKLSAgICAgIE9uQXVkaW9TdXNwZW5kKCk7Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9TaW5rUmVzdW1lKCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIGF1dG8gZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGFjdGl2ZV9ncm91cF9pZF8pOwotICAgIGlmICghZ3JvdXApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiwgSW52YWxpZCBncm91cDogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFjdGl2ZV9ncm91cF9pZF8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBkZXZpY2UgcmVzdW1lIGlzIGV4cGVjdGVkICovCi0gICAgaWYgKCFncm91cC0+R2V0Q29kZWNDb25maWd1cmF0aW9uQnlEaXJlY3Rpb24oCi0gICAgICAgICAgICBjdXJyZW50X2NvbnRleHRfdHlwZV8sIGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIHJlc3VtZSByZXF1ZXN0IGZvciBjb250ZXh0IHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0PGludD4oY3VycmVudF9jb250ZXh0X3R5cGVfKSk7Ci0gICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBGaXJzdCByZXN1bWUgcmVxdWVzdCBmcm9tIHNpbmsvc291cmNlIHRyaWdnZXJzIGdyb3VwIHN0YXJ0ICovCi0gICAgaWYgKCFhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmUgJiYgIWF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kKSB7Ci0gICAgICBhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCA9IHRydWU7Ci0gICAgICBPbkF1ZGlvUmVzdW1lKCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmUiOwotICAgICAgYXVkaW9fc291cmNlX3JlYWR5X3RvX3NlbmQgPSB0cnVlOwotICAgICAgLyogSWYgc2lnbmFsbGluZyBwYXJ0IGlzIGNvbXBsZXRlZCB0cmlnZ2VyIHN0YXJ0IHJldmVpdmluIGF1ZGlvIGhlcmUsCi0gICAgICAgKiBvdGhlcndpc2UgaXQnbGwgYmUgY2FsbGVkIG9uIGdyb3VwIHN0cmVhbWluZyBzdGF0ZSBjYWxsYmFjawotICAgICAgICovCi0gICAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKQotICAgICAgICBTdGFydFNlbmRpbmdBdWRpbyhhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogQXNrIGZyYW1ld29yayB0byBjb21lIGJhY2sgbGF0ZXIgKi8KLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhY3RpdmVfZ3JvdXBfaWQ6ICIgPDwgYWN0aXZlX2dyb3VwX2lkXyA8PCAiXG4iCi0gICAgICAgICAgICAgICAgIDw8ICIgYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlOiAiCi0gICAgICAgICAgICAgICAgIDw8IGF1ZGlvX3NpbmtfcmVhZHlfdG9fcmVjZWl2ZSA8PCAiXG4iCi0gICAgICAgICAgICAgICAgIDw8ICIgYXVkaW9fc291cmNlX3JlYWR5X3RvX3NlbmQ6IiA8PCBhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZAotICAgICAgICAgICAgICAgICA8PCAiXG4iCi0gICAgICAgICAgICAgICAgIDw8ICIgY3VycmVudF9jb250ZXh0X3R5cGVfOiAiCi0gICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oY3VycmVudF9jb250ZXh0X3R5cGVfKSA8PCAiXG4iCi0gICAgICAgICAgICAgICAgIDw8ICIgZ3JvdXAgZXhpc3Q/ICIgPDwgKGdyb3VwID8gIiB5ZXMgIiA6ICIgbm8gIikgPDwgIlxuIjsKLSAgICAgIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9Tb3VyY2VTdXNwZW5kKCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIGlmICghYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlKSByZXR1cm47Ci0KLSAgICBhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmUgPSBmYWxzZTsKLQotICAgIC8qIExhc3Qgc3VzcGVuZHMgZ3JvdXAgLSB0cmlnZ2VycyBncm91cCBzdG9wICovCi0gICAgaWYgKCFhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmUgJiYgIWF1ZGlvX3NvdXJjZV9yZWFkeV90b19zZW5kKQotICAgICAgT25BdWRpb1N1c3BlbmQoKTsKLSAgfQotCi0gIHZvaWQgT25BdWRpb1NvdXJjZVJlc3VtZSgpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgICBhdXRvIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIEludmFsaWQgZ3JvdXA6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgZGV2aWNlIHJlc3VtZSBpcyBleHBlY3RlZCAqLwotICAgIGlmICghZ3JvdXAtPkdldENvZGVjQ29uZmlndXJhdGlvbkJ5RGlyZWN0aW9uKAotICAgICAgICAgICAgY3VycmVudF9jb250ZXh0X3R5cGVfLCBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIHJlc3VtZSByZXF1ZXN0IGZvciBjb250ZXh0IHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0PGludD4oY3VycmVudF9jb250ZXh0X3R5cGVfKSk7Ci0gICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rOjpDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogRmlyc3QgcmVzdW1lIHJlcXVlc3QgZnJvbSBzaW5rL3NvdXJjZSB0cmlnZ2VycyBncm91cCBzdGFydCAqLwotICAgIGlmICghYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlICYmICFhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCkgewotICAgICAgT25BdWRpb1Jlc3VtZSgpOwotICAgICAgYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlID0gdHJ1ZTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCkgewotICAgICAgYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlID0gdHJ1ZTsKLSAgICAgIC8qIElmIHNpZ25hbGxpbmcgcGFydCBpcyBjb21wbGV0ZWQgdHJpZ2dlciBzdGFydCByZXZlaXZpbiBhdWRpbyBoZXJlLAotICAgICAgICogb3RoZXJ3aXNlIGl0J2xsIGJlIGNhbGxlZCBvbiBncm91cCBzdHJlYW1pbmcgc3RhdGUgY2FsbGJhY2sKLSAgICAgICAqLwotICAgICAgaWYgKGdyb3VwLT5HZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykKLSAgICAgICAgU3RhcnRSZWNlaXZpbmdBdWRpbyhhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICB9Ci0gIH0KLQotICBMZUF1ZGlvQ29udGV4dFR5cGUgQXVkaW9Db250ZW50VG9MZUF1ZGlvQ29udGV4dCgKLSAgICAgIGF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRfdHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSkgewotICAgIHN3aXRjaCAoY29udGVudF90eXBlKSB7Ci0gICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g6Ci0gICAgICAgIHJldHVybiBMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMOwotICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM6Ci0gICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRToKLSAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUE7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBDb250ZXh0IGlzIG5vdCBjbGVhciwgY29uc2lkZXIgYWxzbyB1c2FnZSBvZiBzdHJlYW0gKi8KLSAgICBzd2l0Y2ggKHVzYWdlKSB7Ci0gICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMOwotICAgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgICAgICByZXR1cm4gTGVBdWRpb0NvbnRleHRUeXBlOjpHQU1FOwotICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgICAgIHJldHVybiBMZUF1ZGlvQ29udGV4dFR5cGU6Ok5PVElGSUNBVElPTlM7Ci0gICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBMZUF1ZGlvQ29udGV4dFR5cGU6OlJJTkdUT05FOwotICAgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIExlQXVkaW9Db250ZXh0VHlwZTo6QUxFUlRTOwotICAgICAgY2FzZSBBVURJT19VU0FHRV9FTUVSR0VOQ1k6Ci0gICAgICAgIHJldHVybiBMZUF1ZGlvQ29udGV4dFR5cGU6OkVNRVJHRU5DWUFMQVJNOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUE7Ci0gIH0KLQotICBMZUF1ZGlvQ29udGV4dFR5cGUgQ2hvb3NlQ29udGV4dFR5cGUoCi0gICAgICBzdGQ6OnZlY3RvcjxMZUF1ZGlvQ29udGV4dFR5cGU+JiBhdmFpbGFibGVfY29udGVudHMpIHsKLSAgICAvKiBNaW5pIHBvbGljeS4gVm9pY2UgaXMgcHJpbyAxLCBtZWRpYSBpcyBwcmlvIDIgKi8KLSAgICBhdXRvIGl0ZXIgPSBmaW5kKGF2YWlsYWJsZV9jb250ZW50cy5iZWdpbigpLCBhdmFpbGFibGVfY29udGVudHMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMKTsKLSAgICBpZiAoaXRlciAhPSBhdmFpbGFibGVfY29udGVudHMuZW5kKCkpCi0gICAgICByZXR1cm4gTGVBdWRpb0NvbnRleHRUeXBlOjpDT05WRVJTQVRJT05BTDsKLQotICAgIGl0ZXIgPSBmaW5kKGF2YWlsYWJsZV9jb250ZW50cy5iZWdpbigpLCBhdmFpbGFibGVfY29udGVudHMuZW5kKCksCi0gICAgICAgICAgICAgICAgTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQSk7Ci0gICAgaWYgKGl0ZXIgIT0gYXZhaWxhYmxlX2NvbnRlbnRzLmVuZCgpKSByZXR1cm4gTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQTsKLQotICAgIC8qVE9ETyBkbyBzb21ldGhpbmcgc21hcnRlciBoZXJlICovCi0gICAgcmV0dXJuIGF2YWlsYWJsZV9jb250ZW50c1swXTsKLSAgfQotCi0gIHZvaWQgT25BdWRpb01ldGFkYXRhVXBkYXRlKGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90JiBzb3VyY2VfbWV0YWRhdGEpIHsKLSAgICBhdXRvIHRyYWNrcyA9IHNvdXJjZV9tZXRhZGF0YS50cmFja3M7Ci0gICAgYXV0byB0cmFja19jb3VudCA9IHNvdXJjZV9tZXRhZGF0YS50cmFja19jb3VudDsKLQotICAgIHN0ZDo6dmVjdG9yPExlQXVkaW9Db250ZXh0VHlwZT4gY29udGV4dHM7Ci0KLSAgICB3aGlsZSAodHJhY2tfY291bnQpIHsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogdXNhZ2U9IiA8PCB0cmFja3MtPnVzYWdlCi0gICAgICAgICAgICAgICAgIDw8ICIsIGNvbnRlbnRfdHlwZT0iIDw8IHRyYWNrcy0+Y29udGVudF90eXBlCi0gICAgICAgICAgICAgICAgIDw8ICIsIGdhaW49IiA8PCB0cmFja3MtPmdhaW47Ci0KLSAgICAgIGF1dG8gbmV3X2NvbnRleHQgPQotICAgICAgICAgIEF1ZGlvQ29udGVudFRvTGVBdWRpb0NvbnRleHQodHJhY2tzLT5jb250ZW50X3R5cGUsIHRyYWNrcy0+dXNhZ2UpOwotICAgICAgY29udGV4dHMucHVzaF9iYWNrKG5ld19jb250ZXh0KTsKLQotICAgICAgLS10cmFja19jb3VudDsKLSAgICAgICsrdHJhY2tzOwotICAgIH0KLQotICAgIGF1dG8gbmV3X2NvbnRleHQgPSBDaG9vc2VDb250ZXh0VHlwZShjb250ZXh0cyk7Ci0KLSAgICBhdXRvIGdyb3VwID0gYXNlR3JvdXBzXy5GaW5kQnlJZChhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIEludmFsaWQgZ3JvdXA6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihhY3RpdmVfZ3JvdXBfaWRfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoKG5ld19jb250ZXh0ICE9IGN1cnJlbnRfY29udGV4dF90eXBlXykgJiYKLSAgICAgICAgKGdyb3VwLT5HZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykpIHsKLSAgICAgIGlmIChhY3RpdmVfZ3JvdXBfaWRfID09IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiLCBjYW5ub3Qgc3RhcnQgc3RyYW1pbmcgaWYgbm8gYWN0aXZlIGdyb3VwIHNldCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgc3RkOjpvcHRpb25hbDxMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uPiBzb3VyY2VfY29uZmlndXJhdGlvbiA9Ci0gICAgICAgICAgZ3JvdXAtPkdldENvZGVjQ29uZmlndXJhdGlvbkJ5RGlyZWN0aW9uKAotICAgICAgICAgICAgICBuZXdfY29udGV4dCwgbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspOwotCi0gICAgICBzdGQ6Om9wdGlvbmFsPExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24+IHNpbmtfY29uZmlndXJhdGlvbiA9Ci0gICAgICAgICAgZ3JvdXAtPkdldENvZGVjQ29uZmlndXJhdGlvbkJ5RGlyZWN0aW9uKAotICAgICAgICAgICAgICBuZXdfY29udGV4dCwgbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSk7Ci0KLSAgICAgIGlmICgoc291cmNlX2NvbmZpZ3VyYXRpb24gJiYKLSAgICAgICAgICAgKCpzb3VyY2VfY29uZmlndXJhdGlvbiAhPSBjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWcpKSB8fAotICAgICAgICAgIChzaW5rX2NvbmZpZ3VyYXRpb24gJiYKLSAgICAgICAgICAgKCpzaW5rX2NvbmZpZ3VyYXRpb24gIT0gY3VycmVudF9zaW5rX2NvZGVjX2NvbmZpZykpKSB7Ci0gICAgICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZMZUF1ZGlvQ2xpZW50SW1wbDo6VXBkYXRlQ3VycmVudEhhbFNlc3Npb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaW5zdGFuY2UpLCBncm91cC0+Z3JvdXBfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jb250ZXh0KSk7Ci0gICAgICAgIGN1cnJlbnRfY29udGV4dF90eXBlXyA9IG5ld19jb250ZXh0OwotICAgICAgICBHcm91cFN0b3AoZ3JvdXAtPmdyb3VwX2lkXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogQ29uZmlndXJhdGlvbiBpcyB0aGUgc2FtZSBmb3IgbmV3IGNvbnRleHQsIGp1c3Qgd2lsbCBkbyB1cGRhdGUKLSAgICAgICAqIG1ldGFkYXRhIG9mIHN0cmVhbQotICAgICAgICovCi0gICAgICBHcm91cFN0cmVhbShhY3RpdmVfZ3JvdXBfaWRfLCBzdGF0aWNfY2FzdDx1aW50MTZfdD4obmV3X2NvbnRleHQpKTsKLSAgICB9Ci0KLSAgICBjdXJyZW50X2NvbnRleHRfdHlwZV8gPSBuZXdfY29udGV4dDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uR2F0dFJlYWRSc3BTdGF0aWModWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoZGwsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLQotICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBpbnN0YW5jZS0+TGVBdWRpb0NoYXJWYWx1ZUhhbmRsZShjb25uX2lkLCBoZGwsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qIFdlIHVzZSBkYXRhIHRvIGtlZXAgbm90aWZ5IGNvbm5lY3RlZCBmbGFnLiAqLwotICAgIGlmIChkYXRhICYmICEhUFRSX1RPX0lOVChkYXRhKSkgewotICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9Ci0gICAgICAgICAgaW5zdGFuY2UtPmxlQXVkaW9EZXZpY2VzXy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgICBsZUF1ZGlvRGV2aWNlLT5ub3RpZnlfY29ubmVjdGVkX2FmdGVyX3JlYWRfID0gZmFsc2U7Ci0gICAgICBpbnN0YW5jZS0+Y29ubmVjdGlvblJlYWR5KGxlQXVkaW9EZXZpY2UpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgSXNvQ2lnRXZlbnRzQ2IodWludDE2X3QgZXZlbnRfdHlwZSwgdm9pZCogZGF0YSkgewotICAgIHN3aXRjaCAoZXZlbnRfdHlwZSkgewotICAgICAgY2FzZSBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpZ09uQ3JlYXRlQ21wbDogewotICAgICAgICBhdXRvKiBldnQgPSBzdGF0aWNfY2FzdDxjaWdfY3JlYXRlX2NtcGxfZXZ0Kj4oZGF0YSk7Ci0gICAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBhc2VHcm91cHNfLkZpbmRCeUlkKGV2dC0+Y2lnX2lkKTsKLSAgICAgICAgZ3JvdXBTdGF0ZU1hY2hpbmVfLT5Qcm9jZXNzSGNpTm90aWZPbkNpZ0NyZWF0ZSgKLSAgICAgICAgICAgIGdyb3VwLCBldnQtPnN0YXR1cywgZXZ0LT5jaWdfaWQsIGV2dC0+Y29ubl9oYW5kbGVzKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lnT25SZW1vdmVDbXBsOiB7Ci0gICAgICAgIGF1dG8qIGV2dCA9IHN0YXRpY19jYXN0PGNpZ19yZW1vdmVfY21wbF9ldnQqPihkYXRhKTsKLSAgICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQoZXZ0LT5jaWdfaWQpOwotICAgICAgICBncm91cFN0YXRlTWFjaGluZV8tPlByb2Nlc3NIY2lOb3RpZk9uQ2lnUmVtb3ZlKGV2dC0+c3RhdHVzLCBncm91cCk7Ci0gICAgICAgIHJlbW92ZV9ncm91cF9pZl9wb3NzaWJsZShncm91cCk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgZXZlbnQgIiA8PCBpbnR7ZXZlbnRfdHlwZX07Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBJc29DaXNFdmVudHNDYih1aW50MTZfdCBldmVudF90eXBlLCB2b2lkKiBkYXRhKSB7Ci0gICAgc3dpdGNoIChldmVudF90eXBlKSB7Ci0gICAgICBjYXNlIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lzRGF0YUF2YWlsYWJsZTogewotICAgICAgICBhdXRvKiBldmVudCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19kYXRhX2V2dCo+KGRhdGEpOwotCi0gICAgICAgIGlmICghYXVkaW9fc2lua19yZWFkeV90b19yZWNlaXZlKSBicmVhazsKLQotICAgICAgICBTZW5kQXVkaW9EYXRhKGV2ZW50LT5wX21zZy0+ZGF0YSArIGV2ZW50LT5wX21zZy0+b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5wX21zZy0+bGVuIC0gZXZlbnQtPnBfbXNnLT5vZmZzZXQpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNFc3RhYmxpc2hDbXBsOiB7Ci0gICAgICAgIGF1dG8qIGV2ZW50ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9jbXBsX2V2dCo+KAotICAgICAgICAgICAgICAgIGRhdGEpOwotCi0gICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPQotICAgICAgICAgICAgbGVBdWRpb0RldmljZXNfLkZpbmRCeUNpc0Nvbm5IZGwoZXZlbnQtPmNpc19jb25uX2hkbCk7Ci0gICAgICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgbm8gYm9uZGVkIExlIEF1ZGlvIERldmljZSB3aXRoIENJUzogIgotICAgICAgICAgICAgICAgICAgICAgPDwgK2V2ZW50LT5jaXNfY29ubl9oZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9Ci0gICAgICAgICAgICBhc2VHcm91cHNfLkZpbmRCeUlkKGxlQXVkaW9EZXZpY2UtPmdyb3VwX2lkXyk7Ci0KLSAgICAgICAgaWYgKGV2ZW50LT5tYXhfcGR1X210b3MgPiAwKQotICAgICAgICAgIGdyb3VwLT5TZXRUcmFuc3BvcnRMYXRlbmN5KGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LT50cmFuc19sYXRfbXRvcyk7Ci0gICAgICAgIGlmIChldmVudC0+bWF4X3BkdV9zdG9tID4gMCkKLSAgICAgICAgICBncm91cC0+U2V0VHJhbnNwb3J0TGF0ZW5jeShsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LT50cmFuc19sYXRfc3RvbSk7Ci0KLSAgICAgICAgZ3JvdXBTdGF0ZU1hY2hpbmVfLT5Qcm9jZXNzSGNpTm90aWZDaXNFc3RhYmxpc2hlZChncm91cCwgbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpc0Rpc2Nvbm5lY3RlZDogewotICAgICAgICBhdXRvKiBldmVudCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19kaXNjb25uZWN0ZWRfZXZ0Kj4oCi0gICAgICAgICAgICAgICAgZGF0YSk7Ci0KLSAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9Ci0gICAgICAgICAgICBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5Q2lzQ29ubkhkbChldmVudC0+Y2lzX2Nvbm5faGRsKTsKLSAgICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBubyBib25kZWQgTGUgQXVkaW8gRGV2aWNlIHdpdGggQ0lTOiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCArZXZlbnQtPmNpc19jb25uX2hkbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwID0KLSAgICAgICAgICAgIGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLQotICAgICAgICBncm91cFN0YXRlTWFjaGluZV8tPlByb2Nlc3NIY2lOb3RpZkNpc0Rpc2Nvbm5lY3RlZChncm91cCwgbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiLCBOb3QgaGFuZGVsZWQgSVNPIGV2ZW50IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBJc29TZXR1cElzb0RhdGFQYXRoQ2IodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IC8qIGNpZ19pZCAqLykgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPQotICAgICAgICBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5Q2lzQ29ubkhkbChjb25uX2hhbmRsZSk7Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLQotICAgIGluc3RhbmNlLT5ncm91cFN0YXRlTWFjaGluZV8tPlByb2Nlc3NIY2lOb3RpZlNldHVwSXNvRGF0YVBhdGgoCi0gICAgICAgIGdyb3VwLCBsZUF1ZGlvRGV2aWNlLCBzdGF0dXMsIGNvbm5faGFuZGxlKTsKLSAgfQotCi0gIHZvaWQgSXNvUmVtb3ZlSXNvRGF0YVBhdGhDYih1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IC8qIGNpZ19pZCAqLykgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPQotICAgICAgICBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5Q2lzQ29ubkhkbChjb25uX2hhbmRsZSk7Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLQotICAgIGluc3RhbmNlLT5ncm91cFN0YXRlTWFjaGluZV8tPlByb2Nlc3NIY2lOb3RpZlJlbW92ZUlzb0RhdGFQYXRoKAotICAgICAgICBncm91cCwgbGVBdWRpb0RldmljZSwgc3RhdHVzLCBjb25uX2hhbmRsZSk7Ci0gIH0KLQotICB2b2lkIElzb0xpbmtRdWFsaXR5UmVhZENiKAotICAgICAgdWludDhfdCBjb25uX2hhbmRsZSwgdWludDhfdCBjaWdfaWQsIHVpbnQzMl90IHR4VW5hY2tlZFBhY2tldHMsCi0gICAgICB1aW50MzJfdCB0eEZsdXNoZWRQYWNrZXRzLCB1aW50MzJfdCB0eExhc3RTdWJldmVudFBhY2tldHMsCi0gICAgICB1aW50MzJfdCByZXRyYW5zbWl0dGVkUGFja2V0cywgdWludDMyX3QgY3JjRXJyb3JQYWNrZXRzLAotICAgICAgdWludDMyX3QgcnhVbnJlY2VpdmVkUGFja2V0cywgdWludDMyX3QgZHVwbGljYXRlUGFja2V0cykgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPQotICAgICAgICBsZUF1ZGlvRGV2aWNlc18uRmluZEJ5Q2lzQ29ubkhkbChjb25uX2hhbmRsZSk7Ci0gICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiwgZGV2aWNlIHVuZGVyIGNvbm5lY3Rpb24gaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGNvbm5faGFuZGxlKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGhhcyBiZWVuIGRpc2Nvbm5lY2VjdGVkIGluIG1lYW50aW1lIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IGFzZUdyb3Vwc18uRmluZEJ5SWQobGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfKTsKLQotICAgIGluc3RhbmNlLT5ncm91cFN0YXRlTWFjaGluZV8tPlByb2Nlc3NIY2lOb3RpZklzb0xpbmtRdWFsaXR5UmVhZCgKLSAgICAgICAgZ3JvdXAsIGxlQXVkaW9EZXZpY2UsIGNvbm5faGFuZGxlLCB0eFVuYWNrZWRQYWNrZXRzLCB0eEZsdXNoZWRQYWNrZXRzLAotICAgICAgICB0eExhc3RTdWJldmVudFBhY2tldHMsIHJldHJhbnNtaXR0ZWRQYWNrZXRzLCBjcmNFcnJvclBhY2tldHMsCi0gICAgICAgIHJ4VW5yZWNlaXZlZFBhY2tldHMsIGR1cGxpY2F0ZVBhY2tldHMpOwotICB9Ci0KLSAgdm9pZCBTdGF0dXNSZXBvcnRDYihpbnQgZ3JvdXBfaWQsIEdyb3VwU3RyZWFtU3RhdHVzIHN0YXR1cykgewotICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgICBjYXNlIEdyb3VwU3RyZWFtU3RhdHVzOjpTVFJFQU1JTkc6Ci0gICAgICAgIHN0cmVhbV9yZXF1ZXN0X3N0YXJ0ZWRfID0gZmFsc2U7Ci0gICAgICAgIGlmIChhdWRpb19zb3VyY2VfcmVhZHlfdG9fc2VuZCkgU3RhcnRTZW5kaW5nQXVkaW8oYWN0aXZlX2dyb3VwX2lkXyk7Ci0gICAgICAgIGlmIChhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmUpIFN0YXJ0UmVjZWl2aW5nQXVkaW8oYWN0aXZlX2dyb3VwX2lkXyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHcm91cFN0cmVhbVN0YXR1czo6U1VTUEVOREVEOgotICAgICAgICAvKiogU3RvcCBBdWRpbyBidXQgZG9uJ3QgcmVsZWFzZSBhbGwgdGhlIEF1ZGlvIHJlc291cmNlcyAqLwotICAgICAgICBTdXNwZW5kQXVkaW8oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdyb3VwU3RyZWFtU3RhdHVzOjpJRExFOgotICAgICAgICBpZiAoc3RyZWFtX3JlcXVlc3Rfc3RhcnRlZF8pIHsKLSAgICAgICAgICBzdHJlYW1fcmVxdWVzdF9zdGFydGVkXyA9IGZhbHNlOwotICAgICAgICAgIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdEdBVFRfSUYgZ2F0dF9pZl87Ci0gIGJsdWV0b290aDo6bGVfYXVkaW86OkxlQXVkaW9DbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrc187Ci0gIExlQXVkaW9EZXZpY2VzIGxlQXVkaW9EZXZpY2VzXzsKLSAgTGVBdWRpb0RldmljZUdyb3VwcyBhc2VHcm91cHNfOwotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmUqIGdyb3VwU3RhdGVNYWNoaW5lXzsKLSAgaW50IGFjdGl2ZV9ncm91cF9pZF87Ci0gIGJvb2wgc3RyZWFtX3JlcXVlc3Rfc3RhcnRlZF87Ci0gIExlQXVkaW9Db250ZXh0VHlwZSBjdXJyZW50X2NvbnRleHRfdHlwZV87Ci0KLSAgYm9vbCBhdWRpb19zaW5rX3JlYWR5X3RvX3JlY2VpdmU7Ci0gIGJvb2wgYXVkaW9fc291cmNlX3JlYWR5X3RvX3NlbmQ7Ci0KLSAgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiBjdXJyZW50X3NvdXJjZV9jb2RlY19jb25maWc7Ci0gIExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24gY3VycmVudF9zaW5rX2NvZGVjX2NvbmZpZzsKLSAgTGMzRW5jb2RlciogbGMzX2VuY29kZXI7Ci0gIExjM0RlY29kZXIqIGxjM19kZWNvZGVyOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBlbmNvZGVkX2RhdGE7Ci0gIGNvbnN0IHZvaWQqIGF1ZGlvX3NvdXJjZV9pbnN0YW5jZV87Ci0gIGNvbnN0IHZvaWQqIGF1ZGlvX3NpbmtfaW5zdGFuY2VfOwotCi0gIHZvaWQgQ2xpZW50QXVkaW9JbnRlZnJhY2VSZWxlYXNlKCkgewotICAgIGlmIChhdWRpb19zb3VyY2VfaW5zdGFuY2VfKSB7Ci0gICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0b3AoKTsKLSAgICAgIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6UmVsZWFzZShhdWRpb19zb3VyY2VfaW5zdGFuY2VfKTsKLSAgICAgIGF1ZGlvX3NvdXJjZV9pbnN0YW5jZV8gPSBudWxscHRyOwotICAgIH0KLQotICAgIGlmIChhdWRpb19zaW5rX2luc3RhbmNlXykgewotICAgICAgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U3RvcCgpOwotICAgICAgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6UmVsZWFzZShhdWRpb19zaW5rX2luc3RhbmNlXyk7Ci0gICAgICBhdWRpb19zaW5rX2luc3RhbmNlXyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci19OwotCi0vKiBUaGlzIGlzIGEgZ2VuZXJpYyBjYWxsYmFjayBtZXRob2QgZm9yIGdhdHQgY2xpZW50IHdoaWNoIGhhbmRsZXMgZXZlcnkgY2xpZW50Ci0gKiBhcHBsaWNhdGlvbiBldmVudHMuCi0gKi8KLXZvaWQgbGVfYXVkaW9fZ2F0dGNfY2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICBpZiAoIXBfZGF0YSB8fCAhaW5zdGFuY2UpIHJldHVybjsKLQotICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZXZlbnQgPSAiIDw8ICtldmVudDsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfR0FUVENfREVSRUdfRVZUOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19OT1RJRl9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+TGVBdWRpb0NoYXJWYWx1ZUhhbmRsZSgKLSAgICAgICAgICBwX2RhdGEtPm5vdGlmeS5jb25uX2lkLCBwX2RhdGEtPm5vdGlmeS5oYW5kbGUsIHBfZGF0YS0+bm90aWZ5LmxlbiwKLSAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4ocF9kYXRhLT5ub3RpZnkudmFsdWUpKTsKLQotICAgICAgaWYgKCFwX2RhdGEtPm5vdGlmeS5pc19ub3RpZnkpCi0gICAgICAgIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybShwX2RhdGEtPm5vdGlmeS5jb25uX2lkLCBwX2RhdGEtPm5vdGlmeS5oYW5kbGUpOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOgotICAgICAgaW5zdGFuY2UtPk9uR2F0dENvbm5lY3RlZChwX2RhdGEtPm9wZW4uc3RhdHVzLCBwX2RhdGEtPm9wZW4uY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5vcGVuLmNsaWVudF9pZiwgcF9kYXRhLT5vcGVuLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+b3Blbi50cmFuc3BvcnQsIHBfZGF0YS0+b3Blbi5tdHUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+T25FbmNyeXB0aW9uQ29tcGxldGUocF9kYXRhLT5lbmNfY21wbC5yZW1vdGVfYmRhLCBCVE1fU1VDQ0VTUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0NMT1NFX0VWVDoKLSAgICAgIGluc3RhbmNlLT5PbkdhdHREaXNjb25uZWN0ZWQoCi0gICAgICAgICAgcF9kYXRhLT5jbG9zZS5jb25uX2lkLCBwX2RhdGEtPmNsb3NlLmNsaWVudF9pZiwKLSAgICAgICAgICBwX2RhdGEtPmNsb3NlLnJlbW90ZV9iZGEsIHBfZGF0YS0+Y2xvc2UucmVhc29uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUOgotICAgICAgaW5zdGFuY2UtPk9uU2VydmljZVNlYXJjaENvbXBsZXRlKHBfZGF0YS0+c2VhcmNoX2NtcGwuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfRElTQ19ET05FX0VWVDoKLSAgICAgIGluc3RhbmNlLT5PbkdhdHRTZXJ2aWNlRGlzY292ZXJ5RG9uZShwX2RhdGEtPnNlcnZpY2VfY2hhbmdlZC5yZW1vdGVfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU1JWQ19DSEdfRVZUOgotICAgICAgaW5zdGFuY2UtPk9uU2VydmljZUNoYW5nZUV2ZW50KHBfZGF0YS0+cmVtb3RlX2JkYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9HQVRUQ19DRkdfTVRVX0VWVDoKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLWNsYXNzIExlQXVkaW9TdGF0ZU1hY2hpbmVIY2lDYWxsYmFja3NJbXBsIDogcHVibGljIENpZ0NhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2b2lkIE9uQ2lnRXZlbnQodWludDhfdCBldmVudCwgdm9pZCogZGF0YSkgb3ZlcnJpZGUgewotICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPklzb0NpZ0V2ZW50c0NiKGV2ZW50LCBkYXRhKTsKLSAgfQotCi0gIHZvaWQgT25DaXNFdmVudCh1aW50OF90IGV2ZW50LCB2b2lkKiBkYXRhKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+SXNvQ2lzRXZlbnRzQ2IoZXZlbnQsIGRhdGEpOwotICB9Ci0KLSAgdm9pZCBPblNldHVwSXNvRGF0YVBhdGgodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNpZ19pZCkgb3ZlcnJpZGUgewotICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPklzb1NldHVwSXNvRGF0YVBhdGhDYihzdGF0dXMsIGNvbm5faGFuZGxlLCBjaWdfaWQpOwotICB9Ci0KLSAgdm9pZCBPblJlbW92ZUlzb0RhdGFQYXRoKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBjb25uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2lnX2lkKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+SXNvUmVtb3ZlSXNvRGF0YVBhdGhDYihzdGF0dXMsIGNvbm5faGFuZGxlLCBjaWdfaWQpOwotICB9Ci0KLSAgdm9pZCBPbklzb0xpbmtRdWFsaXR5UmVhZCgKLSAgICAgIHVpbnQ4X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgY2lnX2lkLCB1aW50MzJfdCB0eFVuYWNrZWRQYWNrZXRzLAotICAgICAgdWludDMyX3QgdHhGbHVzaGVkUGFja2V0cywgdWludDMyX3QgdHhMYXN0U3ViZXZlbnRQYWNrZXRzLAotICAgICAgdWludDMyX3QgcmV0cmFuc21pdHRlZFBhY2tldHMsIHVpbnQzMl90IGNyY0Vycm9yUGFja2V0cywKLSAgICAgIHVpbnQzMl90IHJ4VW5yZWNlaXZlZFBhY2tldHMsIHVpbnQzMl90IGR1cGxpY2F0ZVBhY2tldHMpIHsKLSAgICBpZiAoaW5zdGFuY2UpCi0gICAgICBpbnN0YW5jZS0+SXNvTGlua1F1YWxpdHlSZWFkQ2IoY29ubl9oYW5kbGUsIGNpZ19pZCwgdHhVbmFja2VkUGFja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eEZsdXNoZWRQYWNrZXRzLCB0eExhc3RTdWJldmVudFBhY2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmFuc21pdHRlZFBhY2tldHMsIGNyY0Vycm9yUGFja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFVucmVjZWl2ZWRQYWNrZXRzLCBkdXBsaWNhdGVQYWNrZXRzKTsKLSAgfQotfTsKLQotTGVBdWRpb1N0YXRlTWFjaGluZUhjaUNhbGxiYWNrc0ltcGwgc3RhdGVNYWNoaW5lSGNpQ2FsbGJhY2tzSW1wbDsKLQotY2xhc3MgQ2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2b2lkIFN0YXR1c1JlcG9ydENiKGludCBncm91cF9pZCwgR3JvdXBTdHJlYW1TdGF0dXMgc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+U3RhdHVzUmVwb3J0Q2IoZ3JvdXBfaWQsIHN0YXR1cyk7Ci0gIH0KLQotICB2b2lkIE9uU3RhdGVUcmFuc2l0aW9uVGltZW91dChpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkxlQXVkaW9EZXZpY2VTZXRTdGF0ZVRpbWVvdXQoZ3JvdXBfaWQpOwotICB9Ci19OwotCi1DYWxsYmFja3NJbXBsIHN0YXRlTWFjaGluZUNhbGxiYWNrc0ltcGw7Ci0KLWNsYXNzIExlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlckltcGwKLSAgICA6IHB1YmxpYyBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rUmVjZWl2ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBPbkF1ZGlvRGF0YVJlYWR5KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25BdWRpb0RhdGFSZWFkeShkYXRhKTsKLSAgfQotICB2b2lkIE9uQXVkaW9TdXNwZW5kKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19zdXNwZW5kX3Byb21pc2UpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkF1ZGlvU2lua1N1c3BlbmQoKTsKLSAgICBkb19zdXNwZW5kX3Byb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9SZXN1bWUoc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3Jlc3VtZV9wcm9taXNlKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25BdWRpb1NpbmtSZXN1bWUoKTsKLSAgICBkb19yZXN1bWVfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgT25BdWRpb01ldGFkYXRhVXBkYXRlKAotICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IGRvX21ldGFkYXRhX3VwZGF0ZV9wcm9taXNlLAotICAgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QmIHNvdXJjZV9tZXRhZGF0YSkgb3ZlcnJpZGUgewotICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPk9uQXVkaW9NZXRhZGF0YVVwZGF0ZShzb3VyY2VfbWV0YWRhdGEpOwotICAgIGRvX21ldGFkYXRhX3VwZGF0ZV9wcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci19OwotCi1jbGFzcyBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlckltcGwKLSAgICA6IHB1YmxpYyBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlciB7Ci0gcHVibGljOgotICB2b2lkIE9uQXVkaW9TdXNwZW5kKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19zdXNwZW5kX3Byb21pc2UpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkF1ZGlvU291cmNlU3VzcGVuZCgpOwotICAgIGRvX3N1c3BlbmRfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotICB2b2lkIE9uQXVkaW9SZXN1bWUoc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3Jlc3VtZV9wcm9taXNlKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25BdWRpb1NvdXJjZVJlc3VtZSgpOwotICAgIGRvX3Jlc3VtZV9wcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci19OwotCi1MZUF1ZGlvQ2xpZW50QXVkaW9TaW5rUmVjZWl2ZXJJbXBsIGF1ZGlvU2lua1JlY2VpdmVySW1wbDsKLUxlQXVkaW9DbGllbnRBdWRpb1NvdXJjZVJlY2VpdmVySW1wbCBhdWRpb1NvdXJjZVJlY2VpdmVySW1wbDsKLQotY2xhc3MgRGV2aWNlR3JvdXBzQ2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBEZXZpY2VHcm91cHNDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgdm9pZCBPbkdyb3VwQWRkZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5Pbkdyb3VwQWRkZWRDYihhZGRyZXNzLCB1dWlkLCBncm91cF9pZCk7Ci0gIH0KLSAgdm9pZCBPbkdyb3VwTWVtYmVyQWRkZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25Hcm91cE1lbWJlckFkZGVkQ2IoYWRkcmVzcywgZ3JvdXBfaWQpOwotICB9Ci0gIHZvaWQgT25Hcm91cE1lbWJlclJlbW92ZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgaWYgKGluc3RhbmNlKSBpbnN0YW5jZS0+T25Hcm91cE1lbWJlclJlbW92ZWRDYihhZGRyZXNzLCBncm91cF9pZCk7Ci0gIH0KLSAgdm9pZCBPbkdyb3VwUmVtb3ZlZChjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsIGludCBncm91cF9pZCkgewotICAgIC8qIHRvIGltcGxlbWVudCBpZiBuZWVkZWQgKi8KLSAgfQotICB2b2lkIE9uR3JvdXBBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsIGludCBncm91cF9pZCkgewotICAgIC8qIHRvIGltcGxlbWVudCBpZiBuZWVkZWQgKi8KLSAgfQotfTsKLQotY2xhc3MgRGV2aWNlR3JvdXBzQ2FsbGJhY2tzSW1wbDsKLURldmljZUdyb3Vwc0NhbGxiYWNrc0ltcGwgZGV2aWNlR3JvdXBzQ2FsbGJhY2tzSW1wbDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgTGVBdWRpb0NsaWVudDo6QWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgYm9vbCBhdXRvY29ubmVjdCkgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTm90IGluaXRpYWxpemVkIHlldCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5zdGFuY2UtPkFkZEZyb21TdG9yYWdlKGFkZHIsIGF1dG9jb25uZWN0KTsKLX0KLQotYm9vbCBMZUF1ZGlvQ2xpZW50OjpJc0xlQXVkaW9DbGllbnRSdW5uaW5nKHZvaWQpIHsgcmV0dXJuIGluc3RhbmNlICE9IG51bGxwdHI7IH0KLQotTGVBdWRpb0NsaWVudCogTGVBdWRpb0NsaWVudDo6R2V0KCkgewotICBDSEVDSyhpbnN0YW5jZSk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLQotLyogSW5pdGlhbGl6ZXIgb2YgbWFpbiBsZSBhdWRpbyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhbmQgaXRzIGluc3RhbmNlICovCi12b2lkIExlQXVkaW9DbGllbnQ6OkluaXRpYWxpemUoCi0gICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6TGVBdWRpb0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzXywKLSAgICBiYXNlOjpDbG9zdXJlIGluaXRDYiwgYmFzZTo6Q2FsbGJhY2s8Ym9vbCgpPiBoYWxfMl8xX3ZlcmlmaWVyKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIExPRyhFUlJPUikgPDwgIkFscmVhZHkgaW5pdGlhbGl6ZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkKLSAgICAgICAgICAgLT5zdXBwb3J0c19ibGVfY29ubmVjdGVkX2lzb2Nocm9ub3VzX3N0cmVhbV9jZW50cmFsKCkgJiYKLSAgICAgICFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKQotICAgICAgICAgICAtPnN1cHBvcnRzX2JsZV9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtX3BlcmlwaGVyYWwoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkNvbnRyb2xsZXIgcmVwb3J0cyBubyBJU08gc3VwcG9ydC4iCi0gICAgICAgICAgICAgICAgICAiIExlQXVkaW9DbGllbnQgSW5pdCBhYm9ydGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HX0FTU0VSVChzdGQ6Om1vdmUoaGFsXzJfMV92ZXJpZmllcikuUnVuKCkpCi0gICAgICA8PCBfX2Z1bmNfXwotICAgICAgPDwgIiwgTEUgQXVkaW8gQ2xpZW50IHJlcXVpcmVzIEJsdWV0b290aCBBdWRpbyBIQUwgVjIuMSBhdCBsZWFzdC4gRWl0aGVyICIKLSAgICAgICAgICJkaXNhYmxlIExFIEF1ZGlvIFByb2ZpbGUsIG9yIHVwZGF0ZSB5b3VyIEhBTCI7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U3RhcnQoKTsKLQotICBhdWRpb1NpbmtSZWNlaXZlciA9ICZhdWRpb1NpbmtSZWNlaXZlckltcGw7Ci0gIGF1ZGlvU291cmNlUmVjZWl2ZXIgPSAmYXVkaW9Tb3VyY2VSZWNlaXZlckltcGw7Ci0gIHN0YXRlTWFjaGluZUhjaUNhbGxiYWNrcyA9ICZzdGF0ZU1hY2hpbmVIY2lDYWxsYmFja3NJbXBsOwotICBzdGF0ZU1hY2hpbmVDYWxsYmFja3MgPSAmc3RhdGVNYWNoaW5lQ2FsbGJhY2tzSW1wbDsKLSAgZGV2aWNlX2dyb3VwX2NhbGxiYWNrcyA9ICZkZXZpY2VHcm91cHNDYWxsYmFja3NJbXBsOwotICBpbnN0YW5jZSA9IG5ldyBMZUF1ZGlvQ2xpZW50SW1wbChjYWxsYmFja3NfLCBzdGF0ZU1hY2hpbmVDYWxsYmFja3MsIGluaXRDYik7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVnaXN0ZXJDaWdDYWxsYmFja3Moc3RhdGVNYWNoaW5lSGNpQ2FsbGJhY2tzKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50OjpEZWJ1Z0R1bXAoaW50IGZkKSB7Ci0gIGRwcmludGYoZmQsICJMZUF1ZGlvIE1hbmFnZXI6IFxuIik7Ci0gIGlmIChpbnN0YW5jZSkKLSAgICBpbnN0YW5jZS0+RHVtcChmZCk7Ci0gIGVsc2UKLSAgICBkcHJpbnRmKGZkLCAiICBOb3QgaW5pdGlhbGl6ZWQgXG4iKTsKLQotICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkRlYnVnRHVtcChmZCk7Ci0gIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OkRlYnVnRHVtcChmZCk7Ci0gIGRwcmludGYoZmQsICJcbiIpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnQ6OkNsZWFudXAodm9pZCkgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTm90IGluaXRpYWxpemVkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBMZUF1ZGlvQ2xpZW50SW1wbCogcHRyID0gaW5zdGFuY2U7Ci0gIGluc3RhbmNlID0gbnVsbHB0cjsKLSAgcHRyLT5DbGVhbnVwKCk7Ci0gIGRlbGV0ZSBwdHI7Ci0KLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpDbGVhbnVwKCk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlN0b3AoKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9jbGllbnRfYXVkaW8uY2MgYi9idGEvbGVfYXVkaW8vY2xpZW50X2F1ZGlvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmJhZjYyLi4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9jbGllbnRfYXVkaW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAyMDE5IEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY2xpZW50X2F1ZGlvLmgiCi0KLSNpbmNsdWRlICJhdWRpb19oYWxfaW50ZXJmYWNlL2xlX2F1ZGlvX3NvZnR3YXJlLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiY29tbW9uL3JlcGVhdGluZ190aW1lci5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS93YWtlbG9jay5oIgotCi11c2luZyBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6TGVBdWRpb0NsaWVudEludGVyZmFjZTsKLQotbmFtZXNwYWNlIHsKLUxlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24gc291cmNlX2NvZGVjX2NvbmZpZzsKLWJsdWV0b290aDo6Y29tbW9uOjpSZXBlYXRpbmdUaW1lciBhdWRpb190aW1lcjsKLUxlQXVkaW9DbGllbnRJbnRlcmZhY2UqIGxlQXVkaW9DbGllbnRJbnRlcmZhY2UgPSBudWxscHRyOwotTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luayogc2lua0NsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2UqIHNvdXJjZUNsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci1MZUF1ZGlvQ2xpZW50QXVkaW9TaW5rUmVjZWl2ZXIqIGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIgPSBudWxscHRyOwotTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlUmVjZWl2ZXIqIGxvY2FsQXVkaW9Tb3VyY2VSZWNlaXZlciA9IG51bGxwdHI7Ci0KLWVudW0gewotICBIQUxfVU5JTklUSUFMSVpFRCwKLSAgSEFMX1NUT1BQRUQsCi0gIEhBTF9TVEFSVEVELAotfSBsZV9hdWRpb19zaW5rX2hhbF9zdGF0ZSwKLSAgICBsZV9hdWRpb19zb3VyY2VfaGFsX3N0YXRlOwotCi1zdHJ1Y3QgQXVkaW9IYWxTdGF0cyB7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlczsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2NvdW50OwotICB1aW50NjRfdCBtZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzOwotCi0gIEF1ZGlvSGFsU3RhdHMoKSB7IFJlc2V0KCk7IH0KLQotICB2b2lkIFJlc2V0KCkgewotICAgIG1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2J5dGVzID0gMDsKLSAgICBtZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19jb3VudCA9IDA7Ci0gICAgbWVkaWFfcmVhZF9sYXN0X3VuZGVyZmxvd191cyA9IDA7Ci0gIH0KLX07Ci0KLUF1ZGlvSGFsU3RhdHMgc3RhdHM7Ci0KLWJvb2wgbGVfYXVkaW9fc2lua19vbl9yZXN1bWVfcmVxKGJvb2wgc3RhcnRfbWVkaWFfdGFzayk7Ci1ib29sIGxlX2F1ZGlvX3Npbmtfb25fc3VzcGVuZF9yZXEoKTsKLQotdm9pZCBzZW5kX2F1ZGlvX2RhdGEoKSB7Ci0gIHVpbnQzMl90IGJ5dGVzX3Blcl90aWNrID0KLSAgICAgIChzb3VyY2VfY29kZWNfY29uZmlnLm51bV9jaGFubmVscyAqIHNvdXJjZV9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgKgotICAgICAgIHNvdXJjZV9jb2RlY19jb25maWcuZGF0YV9pbnRlcnZhbF91cyAvIDEwMDAgKgotICAgICAgIChzb3VyY2VfY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSAvIDgpKSAvCi0gICAgICAxMDAwOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEoYnl0ZXNfcGVyX3RpY2spOwotCi0gIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOwotICBpZiAoc2lua0NsaWVudEludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgYnl0ZXNfcmVhZCA9IHNpbmtDbGllbnRJbnRlcmZhY2UtPlJlYWQoZGF0YS5kYXRhKCksIGJ5dGVzX3Blcl90aWNrKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIG5vIExFIEF1ZGlvIHNpbmsgY2xpZW50IGludGVyZmFjZSAtIGFib3J0aW5nLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIGJ5dGVzX3JlYWQ6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihieXRlc19yZWFkKQotICAvLyAgICAgICAgICA8PCAiLCBieXRlc19wZXJfdGljazogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzX3Blcl90aWNrKTsKLQotICBpZiAoYnl0ZXNfcmVhZCA8IGJ5dGVzX3Blcl90aWNrKSB7Ci0gICAgc3RhdHMubWVkaWFfcmVhZF90b3RhbF91bmRlcmZsb3dfYnl0ZXMgKz0gYnl0ZXNfcGVyX3RpY2sgLSBieXRlc19yZWFkOwotICAgIHN0YXRzLm1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2NvdW50Kys7Ci0gICAgc3RhdHMubWVkaWFfcmVhZF9sYXN0X3VuZGVyZmxvd191cyA9Ci0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICB9Ci0KLSAgaWYgKGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIgIT0gbnVsbHB0cikgewotICAgIGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXItPk9uQXVkaW9EYXRhUmVhZHkoZGF0YSk7Ci0gIH0KLX0KLQotdm9pZCBzdGFydF9hdWRpb190aWNrcygpIHsKLSAgd2FrZWxvY2tfYWNxdWlyZSgpOwotICBhdWRpb190aW1lci5TY2hlZHVsZVBlcmlvZGljKAotICAgICAgZ2V0X21haW5fdGhyZWFkKCktPkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZzZW5kX2F1ZGlvX2RhdGEpLAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKHNvdXJjZV9jb2RlY19jb25maWcuZGF0YV9pbnRlcnZhbF91cykpOwotfQotCi12b2lkIHN0b3BfYXVkaW9fdGlja3MoKSB7Ci0gIGF1ZGlvX3RpbWVyLkNhbmNlbEFuZFdhaXQoKTsKLSAgd2FrZWxvY2tfcmVsZWFzZSgpOwotfQotCi1ib29sIGxlX2F1ZGlvX3Npbmtfb25fcmVzdW1lX3JlcShib29sIHN0YXJ0X21lZGlhX3Rhc2spIHsKLSAgaWYgKGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIgIT0gbnVsbHB0cikgewotICAgIC8vIENhbGwgT25BdWRpb1Jlc3VtZSBhbmQgYmxvY2sgdGlsbCBpdCByZXR1cm5zLgotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19yZXN1bWVfcHJvbWlzZTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBkb19yZXN1bWVfZnV0dXJlID0gZG9fcmVzdW1lX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGJ0X3N0YXR1c190IHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmRPbmNlKCZMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rUmVjZWl2ZXI6Ok9uQXVkaW9SZXN1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQobG9jYWxBdWRpb1NpbmtSZWNlaXZlciksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShkb19yZXN1bWVfcHJvbWlzZSkpKTsKLSAgICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBkb19yZXN1bWVfZnV0dXJlLndhaXQoKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBMRV9BVURJT19DVFJMX0NNRF9TVEFSVDogZG9faW5fbWFpbl90aHJlYWQgZXJyPSIKLSAgICAgICAgICAgICAgICAgPDwgc3RhdHVzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBMRV9BVURJT19DVFJMX0NNRF9TVEFSVDogYXVkaW8gc2luayByZWNlaXZlciBub3Qgc3RhcnRlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgbGVfYXVkaW9fc291cmNlX29uX3Jlc3VtZV9yZXEoYm9vbCBzdGFydF9tZWRpYV90YXNrKSB7Ci0gIGlmIChsb2NhbEF1ZGlvU291cmNlUmVjZWl2ZXIgIT0gbnVsbHB0cikgewotICAgIC8vIENhbGwgT25BdWRpb1Jlc3VtZSBhbmQgYmxvY2sgdGlsbCBpdCByZXR1cm5zLgotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19yZXN1bWVfcHJvbWlzZTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBkb19yZXN1bWVfZnV0dXJlID0gZG9fcmVzdW1lX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGJ0X3N0YXR1c190IHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmRPbmNlKCZMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlcjo6T25BdWRpb1Jlc3VtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChsb2NhbEF1ZGlvU291cmNlUmVjZWl2ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZG9fcmVzdW1lX3Byb21pc2UpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgZG9fcmVzdW1lX2Z1dHVyZS53YWl0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogTEVfQVVESU9fQ1RSTF9DTURfU1RBUlQ6IGRvX2luX21haW5fdGhyZWFkIGVycj0iCi0gICAgICAgICAgICAgICAgIDw8IHN0YXR1czsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKQotICAgICAgICA8PCBfX2Z1bmNfXwotICAgICAgICA8PCAiOiBMRV9BVURJT19DVFJMX0NNRF9TVEFSVDogYXVkaW8gc291cmNlIHJlY2VpdmVyIG5vdCBzdGFydGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBsZV9hdWRpb19zaW5rX29uX3N1c3BlbmRfcmVxKCkgewotICBzdG9wX2F1ZGlvX3RpY2tzKCk7Ci0gIGlmIChsb2NhbEF1ZGlvU2lua1JlY2VpdmVyICE9IG51bGxwdHIpIHsKLSAgICAvLyBDYWxsIE9uQXVkaW9TdXNwZW5kIGFuZCBibG9jayB0aWxsIGl0IHJldHVybnMuCi0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3N1c3BlbmRfcHJvbWlzZTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBkb19zdXNwZW5kX2Z1dHVyZSA9IGRvX3N1c3BlbmRfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJkxlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlcjo6T25BdWRpb1N1c3BlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQobG9jYWxBdWRpb1NpbmtSZWNlaXZlciksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShkb19zdXNwZW5kX3Byb21pc2UpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgZG9fc3VzcGVuZF9mdXR1cmUud2FpdCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogTEVfQVVESU9fQ1RSTF9DTURfU1VTUEVORDogZG9faW5fbWFpbl90aHJlYWQgZXJyPSIKLSAgICAgICAgICAgICAgICAgPDwgc3RhdHVzOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBMRV9BVURJT19DVFJMX0NNRF9TVVNQRU5EOiBhdWRpbyByZWNlaXZlciBub3Qgc3RhcnRlZCI7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGxlX2F1ZGlvX3NvdXJjZV9vbl9zdXNwZW5kX3JlcSgpIHsKLSAgaWYgKGxvY2FsQXVkaW9Tb3VyY2VSZWNlaXZlciAhPSBudWxscHRyKSB7Ci0gICAgLy8gQ2FsbCBPbkF1ZGlvU3VzcGVuZCBhbmQgYmxvY2sgdGlsbCBpdCByZXR1cm5zLgotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19zdXNwZW5kX3Byb21pc2U7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gZG9fc3VzcGVuZF9mdXR1cmUgPSBkb19zdXNwZW5kX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGJ0X3N0YXR1c190IHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmRPbmNlKCZMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlcjo6T25BdWRpb1N1c3BlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQobG9jYWxBdWRpb1NvdXJjZVJlY2VpdmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRvX3N1c3BlbmRfcHJvbWlzZSkpKTsKLSAgICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBkb19zdXNwZW5kX2Z1dHVyZS53YWl0KCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBMRV9BVURJT19DVFJMX0NNRF9TVVNQRU5EOiBkb19pbl9tYWluX3RocmVhZCBlcnI9IgotICAgICAgICAgICAgICAgICA8PCBzdGF0dXM7Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IExFX0FVRElPX0NUUkxfQ01EX1NVU1BFTkQ6IGF1ZGlvIHJlY2VpdmVyIG5vdCBzdGFydGVkIjsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgbGVfYXVkaW9fc2lua19vbl9tZXRhZGF0YV91cGRhdGVfcmVxKAotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90JiBzb3VyY2VfbWV0YWRhdGEpIHsKLSAgaWYgKGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgYXVkaW8gcmVjZWl2ZXIgbm90IHN0YXJ0ZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENhbGwgT25BdWRpb1N1c3BlbmQgYW5kIGJsb2NrIHRpbGwgaXQgcmV0dXJucy4KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3VwZGF0ZV9tZXRhZGF0YV9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBkb191cGRhdGVfbWV0YWRhdGFfZnV0dXJlID0KLSAgICAgIGRvX3VwZGF0ZV9tZXRhZGF0YV9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmTGVBdWRpb0NsaWVudEF1ZGlvU2lua1JlY2VpdmVyOjpPbkF1ZGlvTWV0YWRhdGFVcGRhdGUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIpLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRvX3VwZGF0ZV9tZXRhZGF0YV9wcm9taXNlKSwgc291cmNlX21ldGFkYXRhKSk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIGRvX3VwZGF0ZV9tZXRhZGF0YV9mdXR1cmUud2FpdCgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBkb19pbl9tYWluX3RocmVhZCBlcnI9IiA8PCBzdGF0dXM7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0YXJ0KAotICAgIGNvbnN0IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24mIGNvZGVjX2NvbmZpZ3VyYXRpb24sCi0gICAgTGVBdWRpb0NsaWVudEF1ZGlvU2lua1JlY2VpdmVyKiBhdWRpb1JlY2VpdmVyKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoIXNpbmtDbGllbnRJbnRlcmZhY2UpIHsKLSAgICBMT0coRVJST1IpIDw8ICJzaW5rQ2xpZW50SW50ZXJmYWNlIGlzIG5vdCBBY3F1aXJlZCEiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChsZV9hdWRpb19zaW5rX2hhbF9zdGF0ZSA9PSBIQUxfU1RBUlRFRCkgewotICAgIExPRyhFUlJPUikgPDwgIkxFIGF1ZGlvIGRldmljZSBIQUwgaXMgYWxyZWFkeSBpbiB1c2UhIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogTGUgQXVkaW8gU291cmNlIE9wZW4sIGJpdHMgcGVyIHNhbXBsZTogIgotICAgICAgICAgICAgPDwgaW50e2NvZGVjX2NvbmZpZ3VyYXRpb24uYml0c19wZXJfc2FtcGxlfQotICAgICAgICAgICAgPDwgIiwgbnVtIGNoYW5uZWxzOiAiIDw8IGludHtjb2RlY19jb25maWd1cmF0aW9uLm51bV9jaGFubmVsc30KLSAgICAgICAgICAgIDw8ICIsIHNhbXBsZSByYXRlOiAiIDw8IGNvZGVjX2NvbmZpZ3VyYXRpb24uc2FtcGxlX3JhdGUKLSAgICAgICAgICAgIDw8ICIsIGRhdGEgaW50ZXJ2YWw6ICIgPDwgY29kZWNfY29uZmlndXJhdGlvbi5kYXRhX2ludGVydmFsX3VzOwotCi0gIHN0YXRzLlJlc2V0KCk7Ci0KLSAgLyogR2xvYmFsIGNvbmZpZyBmb3IgcGVyaW9kaWMgYXVkaW8gZGF0YSAqLwotICBzb3VyY2VfY29kZWNfY29uZmlnID0gY29kZWNfY29uZmlndXJhdGlvbjsKLSAgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6UGNtUGFyYW1ldGVycyBwY21QYXJhbWV0ZXJzID0gewotICAgICAgLmRhdGFfaW50ZXJ2YWxfdXMgPSBjb2RlY19jb25maWd1cmF0aW9uLmRhdGFfaW50ZXJ2YWxfdXMsCi0gICAgICAuc2FtcGxlX3JhdGUgPSBjb2RlY19jb25maWd1cmF0aW9uLnNhbXBsZV9yYXRlLAotICAgICAgLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX2NvbmZpZ3VyYXRpb24uYml0c19wZXJfc2FtcGxlLAotICAgICAgLmNoYW5uZWxzX2NvdW50ID0gY29kZWNfY29uZmlndXJhdGlvbi5udW1fY2hhbm5lbHN9OwotCi0gIHNpbmtDbGllbnRJbnRlcmZhY2UtPlNldFBjbVBhcmFtZXRlcnMocGNtUGFyYW1ldGVycyk7Ci0gIHNpbmtDbGllbnRJbnRlcmZhY2UtPlN0YXJ0U2Vzc2lvbigpOwotCi0gIGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIgPSBhdWRpb1JlY2VpdmVyOwotICBsZV9hdWRpb19zaW5rX2hhbF9zdGF0ZSA9IEhBTF9TVEFSVEVEOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6U3RvcCgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoIXNpbmtDbGllbnRJbnRlcmZhY2UpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgc2lua0NsaWVudEludGVyZmFjZSBzdG9wcGVkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobGVfYXVkaW9fc2lua19oYWxfc3RhdGUgIT0gSEFMX1NUQVJURUQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJMRSBhdWRpbyBkZXZpY2UgSEFMIHdhcyBub3Qgc3RhcnRlZCEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBMZSBBdWRpbyBTb3VyY2UgQ2xvc2UiOwotCi0gIHNpbmtDbGllbnRJbnRlcmZhY2UtPlN0b3BTZXNzaW9uKCk7Ci0gIGxlX2F1ZGlvX3NpbmtfaGFsX3N0YXRlID0gSEFMX1NUT1BQRUQ7Ci0gIGxvY2FsQXVkaW9TaW5rUmVjZWl2ZXIgPSBudWxscHRyOwotCi0gIHN0b3BfYXVkaW9fdGlja3MoKTsKLX0KLQotY29uc3Qgdm9pZCogTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpBY3F1aXJlKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIGlmIChzaW5rQ2xpZW50SW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiwgU2luayBjbGllbnQgaW50ZXJmYWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQiOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgLyogR2V0IHBvaW50ZXIgdG8gc2luZ2xldG9uIExFIGF1ZGlvIGNsaWVudCBpbnRlcmZhY2UgKi8KLSAgaWYgKGxlQXVkaW9DbGllbnRJbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgIGxlQXVkaW9DbGllbnRJbnRlcmZhY2UgPSBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXQoKTsKLQotICAgIGlmIChsZUF1ZGlvQ2xpZW50SW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgY2FuJ3QgZ2V0IExFIGF1ZGlvIGNsaWVudCBpbnRlcmZhY2UiOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgYXV0byBzaW5rX3N0cmVhbV9jYiA9IGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpTdHJlYW1DYWxsYmFja3N7Ci0gICAgICAub25fcmVzdW1lXyA9IGxlX2F1ZGlvX3Npbmtfb25fcmVzdW1lX3JlcSwKLSAgICAgIC5vbl9zdXNwZW5kXyA9IGxlX2F1ZGlvX3Npbmtfb25fc3VzcGVuZF9yZXEsCi0gICAgICAub25fbWV0YWRhdGFfdXBkYXRlXyA9IGxlX2F1ZGlvX3Npbmtfb25fbWV0YWRhdGFfdXBkYXRlX3JlcSwKLSAgfTsKLQotICBzaW5rQ2xpZW50SW50ZXJmYWNlID0KLSAgICAgIGxlQXVkaW9DbGllbnRJbnRlcmZhY2UtPkdldFNpbmsoc2lua19zdHJlYW1fY2IsIGdldF9tYWluX3RocmVhZCgpKTsKLQotICBpZiAoc2lua0NsaWVudEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBjYW4ndCBnZXQgTEUgYXVkaW8gc2luayBjbGllbnQgaW50ZXJmYWNlIjsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIGxlX2F1ZGlvX3NpbmtfaGFsX3N0YXRlID0gSEFMX1NUT1BQRUQ7Ci0gIHJldHVybiBzaW5rQ2xpZW50SW50ZXJmYWNlOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6UmVsZWFzZShjb25zdCB2b2lkKiBpbnN0YW5jZSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIGlmIChzaW5rQ2xpZW50SW50ZXJmYWNlICE9IGluc3RhbmNlKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJUcnlpbmcgdG8gcmVsZWFzZSBub3Qgb3duIHNlc3Npb24iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChsZV9hdWRpb19zaW5rX2hhbF9zdGF0ZSA9PSBIQUxfVU5JTklUSUFMSVpFRCkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiTEUgYXVkaW8gZGV2aWNlIEhBTCBpcyBub3QgcnVubmluZy4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNpbmtDbGllbnRJbnRlcmZhY2UtPkNsZWFudXAoKTsKLSAgbGVBdWRpb0NsaWVudEludGVyZmFjZS0+UmVsZWFzZVNpbmsoc2lua0NsaWVudEludGVyZmFjZSk7Ci0gIGxlX2F1ZGlvX3NpbmtfaGFsX3N0YXRlID0gSEFMX1VOSU5JVElBTElaRUQ7Ci0gIHNpbmtDbGllbnRJbnRlcmZhY2UgPSBudWxscHRyOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKChzaW5rQ2xpZW50SW50ZXJmYWNlID09IG51bGxwdHIpIHx8Ci0gICAgICAobGVfYXVkaW9fc2lua19oYWxfc3RhdGUgIT0gSEFMX1NUQVJURUQpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTEUgYXVkaW8gZGV2aWNlIEhBTCB3YXMgbm90IHN0YXJ0ZWQhIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzaW5rQ2xpZW50SW50ZXJmYWNlLT5Db25maXJtU3RyZWFtaW5nUmVxdWVzdCgpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgc3RhcnRfYXVkaW9fdGlja3MiOwotICBzdGFydF9hdWRpb190aWNrcygpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6Q2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoKHNpbmtDbGllbnRJbnRlcmZhY2UgPT0gbnVsbHB0cikgfHwKLSAgICAgIChsZV9hdWRpb19zaW5rX2hhbF9zdGF0ZSAhPSBIQUxfU1RBUlRFRCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJMRSBhdWRpbyBkZXZpY2UgSEFMIHdhcyBub3Qgc3RhcnRlZCEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNpbmtDbGllbnRJbnRlcmZhY2UtPkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlVwZGF0ZVJlbW90ZURlbGF5KHVpbnQxNl90IHJlbW90ZV9kZWxheV9tcykgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIGlmICgoc2lua0NsaWVudEludGVyZmFjZSA9PSBudWxscHRyKSB8fAotICAgICAgKGxlX2F1ZGlvX3NpbmtfaGFsX3N0YXRlICE9IEhBTF9TVEFSVEVEKSkgewotICAgIExPRyhFUlJPUikgPDwgIkxFIGF1ZGlvIGRldmljZSBIQUwgd2FzIG5vdCBzdGFydGVkISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2lua0NsaWVudEludGVyZmFjZS0+U2V0UmVtb3RlRGVsYXkocmVtb3RlX2RlbGF5X21zKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkRlYnVnRHVtcChpbnQgZmQpIHsKLSAgdWludDY0X3Qgbm93X3VzID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKLSAgc3RyZWFtIDw8ICIgIExlIEF1ZGlvIEF1ZGlvIEhBTDoiCi0gICAgICAgICA8PCAiXG4gICAgQ291bnRzICh1bmRlcmZsb3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIKLSAgICAgICAgIDw8IHN0YXRzLm1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2NvdW50Ci0gICAgICAgICA8PCAiXG4gICAgQnl0ZXMgKHVuZGVyZmxvdykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIKLSAgICAgICAgIDw8IHN0YXRzLm1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2J5dGVzCi0gICAgICAgICA8PCAiXG4gICAgTGFzdCB1cGRhdGUgdGltZSBhZ28gaW4gbXMgKHVuZGVyZmxvdykgICAgICAgICAgICAgICAgICA6ICIKLSAgICAgICAgIDw8IChzdGF0cy5tZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzID4gMAotICAgICAgICAgICAgICAgICA/ICh1bnNpZ25lZCBsb25nIGxvbmcpKG5vd191cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubWVkaWFfcmVhZF9sYXN0X3VuZGVyZmxvd191cykgLwotICAgICAgICAgICAgICAgICAgICAgICAxMDAwCi0gICAgICAgICAgICAgICAgIDogMCkKLSAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgZHByaW50ZihmZCwgIiVzIiwgc3RyZWFtLnN0cigpLmNfc3RyKCkpOwotfQotCi1ib29sIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0YXJ0KAotICAgIGNvbnN0IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24mIGNvZGVjX2NvbmZpZ3VyYXRpb24sCi0gICAgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlUmVjZWl2ZXIqIGF1ZGlvUmVjZWl2ZXIpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoIXNvdXJjZUNsaWVudEludGVyZmFjZSkgewotICAgIExPRyhFUlJPUikgPDwgInNvdXJjZUNsaWVudEludGVyZmFjZSBpcyBub3QgQWNxdWlyZWQhIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobGVfYXVkaW9fc291cmNlX2hhbF9zdGF0ZSA9PSBIQUxfU1RBUlRFRCkgewotICAgIExPRyhFUlJPUikgPDwgIkxFIGF1ZGlvIGRldmljZSBIQUwgaXMgYWxyZWFkeSBpbiB1c2UhIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogTGUgQXVkaW8gU2luayBPcGVuLCBiaXQgcmF0ZTogIgotICAgICAgICAgICAgPDwgY29kZWNfY29uZmlndXJhdGlvbi5iaXRzX3Blcl9zYW1wbGUKLSAgICAgICAgICAgIDw8ICIsIG51bSBjaGFubmVsczogIiA8PCBpbnR7Y29kZWNfY29uZmlndXJhdGlvbi5udW1fY2hhbm5lbHN9Ci0gICAgICAgICAgICA8PCAiLCBzYW1wbGUgcmF0ZTogIiA8PCBjb2RlY19jb25maWd1cmF0aW9uLnNhbXBsZV9yYXRlCi0gICAgICAgICAgICA8PCAiLCBkYXRhIGludGVydmFsOiAiIDw8IGNvZGVjX2NvbmZpZ3VyYXRpb24uZGF0YV9pbnRlcnZhbF91czsKLQotICBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpQY21QYXJhbWV0ZXJzIHBjbVBhcmFtZXRlcnMgPSB7Ci0gICAgICAuZGF0YV9pbnRlcnZhbF91cyA9IGNvZGVjX2NvbmZpZ3VyYXRpb24uZGF0YV9pbnRlcnZhbF91cywKLSAgICAgIC5zYW1wbGVfcmF0ZSA9IGNvZGVjX2NvbmZpZ3VyYXRpb24uc2FtcGxlX3JhdGUsCi0gICAgICAuYml0c19wZXJfc2FtcGxlID0gY29kZWNfY29uZmlndXJhdGlvbi5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAuY2hhbm5lbHNfY291bnQgPSBjb2RlY19jb25maWd1cmF0aW9uLm51bV9jaGFubmVsc307Ci0KLSAgc291cmNlQ2xpZW50SW50ZXJmYWNlLT5TZXRQY21QYXJhbWV0ZXJzKHBjbVBhcmFtZXRlcnMpOwotICBzb3VyY2VDbGllbnRJbnRlcmZhY2UtPlN0YXJ0U2Vzc2lvbigpOwotCi0gIGxvY2FsQXVkaW9Tb3VyY2VSZWNlaXZlciA9IGF1ZGlvUmVjZWl2ZXI7Ci0gIGxlX2F1ZGlvX3NvdXJjZV9oYWxfc3RhdGUgPSBIQUxfU1RBUlRFRDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U3RvcCgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoIXNvdXJjZUNsaWVudEludGVyZmFjZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBzb3VyY2VDbGllbnRJbnRlcmZhY2Ugc3RvcHBlZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxlX2F1ZGlvX3NvdXJjZV9oYWxfc3RhdGUgIT0gSEFMX1NUQVJURUQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJMRSBhdWRpbyBkZXZpY2UgSEFMIHdhcyBub3Qgc3RhcnRlZCEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBMZSBBdWRpbyBTaW5rIENsb3NlIjsKLQotICBzb3VyY2VDbGllbnRJbnRlcmZhY2UtPlN0b3BTZXNzaW9uKCk7Ci0gIGxlX2F1ZGlvX3NvdXJjZV9oYWxfc3RhdGUgPSBIQUxfU1RPUFBFRDsKLSAgbG9jYWxBdWRpb1NvdXJjZVJlY2VpdmVyID0gbnVsbHB0cjsKLX0KLQotY29uc3Qgdm9pZCogTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6QWNxdWlyZSgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAoc291cmNlQ2xpZW50SW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiwgU291cmNlIGNsaWVudCBpbnRlcmZhY2UgYWxyZWFkeSBpbml0aWFsaXplZCI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICAvKiBHZXQgcG9pbnRlciB0byBzaW5nbGV0b24gTEUgYXVkaW8gY2xpZW50IGludGVyZmFjZSAqLwotICBpZiAobGVBdWRpb0NsaWVudEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgbGVBdWRpb0NsaWVudEludGVyZmFjZSA9IExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OkdldCgpOwotCi0gICAgaWYgKGxlQXVkaW9DbGllbnRJbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBjYW4ndCBnZXQgTEUgYXVkaW8gY2xpZW50IGludGVyZmFjZSI7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLQotICBhdXRvIHNvdXJjZV9zdHJlYW1fY2IgPSBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6U3RyZWFtQ2FsbGJhY2tzewotICAgICAgLm9uX3Jlc3VtZV8gPSBsZV9hdWRpb19zb3VyY2Vfb25fcmVzdW1lX3JlcSwKLSAgICAgIC5vbl9zdXNwZW5kXyA9IGxlX2F1ZGlvX3NvdXJjZV9vbl9zdXNwZW5kX3JlcSwKLSAgfTsKLQotICBzb3VyY2VDbGllbnRJbnRlcmZhY2UgPQotICAgICAgbGVBdWRpb0NsaWVudEludGVyZmFjZS0+R2V0U291cmNlKHNvdXJjZV9zdHJlYW1fY2IsIGdldF9tYWluX3RocmVhZCgpKTsKLQotICBpZiAoc291cmNlQ2xpZW50SW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGNhbid0IGdldCBMRSBhdWRpbyBzb3VyY2UgY2xpZW50IGludGVyZmFjZSI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBsZV9hdWRpb19zb3VyY2VfaGFsX3N0YXRlID0gSEFMX1NUT1BQRUQ7Ci0gIHJldHVybiBzb3VyY2VDbGllbnRJbnRlcmZhY2U7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6UmVsZWFzZShjb25zdCB2b2lkKiBpbnN0YW5jZSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIGlmIChzb3VyY2VDbGllbnRJbnRlcmZhY2UgIT0gaW5zdGFuY2UpIHsKLSAgICBMT0coV0FSTklORykgPDwgIlRyeWluZyB0byByZWxlYXNlIG5vdCBvd24gc2Vzc2lvbiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxlX2F1ZGlvX3NvdXJjZV9oYWxfc3RhdGUgPT0gSEFMX1VOSU5JVElBTElaRUQpIHsKLSAgICBMT0coV0FSTklORykgPDwgIiwgTEUgYXVkaW8gZGV2aWNlIHNvdXJjZSBIQUwgaXMgbm90IHJ1bm5pbmcuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzb3VyY2VDbGllbnRJbnRlcmZhY2UtPkNsZWFudXAoKTsKLSAgbGVBdWRpb0NsaWVudEludGVyZmFjZS0+UmVsZWFzZVNvdXJjZShzb3VyY2VDbGllbnRJbnRlcmZhY2UpOwotICBsZV9hdWRpb19zb3VyY2VfaGFsX3N0YXRlID0gSEFMX1VOSU5JVElBTElaRUQ7Ci0gIHNvdXJjZUNsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci19Ci0KLXNpemVfdCBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rOjpTZW5kRGF0YSh1aW50OF90KiBkYXRhLCB1aW50MTZfdCBzaXplKSB7Ci0gIHNpemVfdCBieXRlc193cml0dGVuOwotICBpZiAoIXNvdXJjZUNsaWVudEludGVyZmFjZSkgewotICAgIExPRyhFUlJPUikgPDwgInNvdXJjZUNsaWVudEludGVyZmFjZSBub3QgaW5pdGlhbGl6ZWQhIjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChsZV9hdWRpb19zb3VyY2VfaGFsX3N0YXRlICE9IEhBTF9TVEFSVEVEKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTEUgYXVkaW8gZGV2aWNlIEhBTCB3YXMgbm90IHN0YXJ0ZWQhIjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIFRPRE86IFdoYXQgdG8gZG8gaWYgbm90IGFsbCBkYXRhIGlzIHdyaXR0ZW4gPyAqLwotICBieXRlc193cml0dGVuID0gc291cmNlQ2xpZW50SW50ZXJmYWNlLT5Xcml0ZShkYXRhLCBzaXplKTsKLSAgaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gc2l6ZSkKLSAgICBMT0coRVJST1IpIDw8ICIsIE5vdCBhbGwgZGF0YSBpcyB3cml0dGVuIHRvIHNvdXJjZSBIQUwuIGJ5dGVzIHdyaXR0ZW46ICIKLSAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oYnl0ZXNfd3JpdHRlbikKLSAgICAgICAgICAgICAgIDw8ICIsIHRvdGFsOiAiIDw8IHN0YXRpY19jYXN0PGludD4oc2l6ZSk7Ci0KLSAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKChzb3VyY2VDbGllbnRJbnRlcmZhY2UgPT0gbnVsbHB0cikgfHwKLSAgICAgIChsZV9hdWRpb19zb3VyY2VfaGFsX3N0YXRlICE9IEhBTF9TVEFSVEVEKSkgewotICAgIExPRyhFUlJPUikgPDwgIkxFIGF1ZGlvIGRldmljZSBIQUwgd2FzIG5vdCBzdGFydGVkISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc291cmNlQ2xpZW50SW50ZXJmYWNlLT5Db25maXJtU3RyZWFtaW5nUmVxdWVzdCgpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKChzb3VyY2VDbGllbnRJbnRlcmZhY2UgPT0gbnVsbHB0cikgfHwKLSAgICAgIChsZV9hdWRpb19zb3VyY2VfaGFsX3N0YXRlICE9IEhBTF9TVEFSVEVEKSkgewotICAgIExPRyhFUlJPUikgPDwgIkxFIGF1ZGlvIGRldmljZSBIQUwgd2FzIG5vdCBzdGFydGVkISI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc291cmNlQ2xpZW50SW50ZXJmYWNlLT5DYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6VXBkYXRlUmVtb3RlRGVsYXkodWludDE2X3QgcmVtb3RlX2RlbGF5X21zKSB7Ci0gIGlmICgoc291cmNlQ2xpZW50SW50ZXJmYWNlID09IG51bGxwdHIpIHx8Ci0gICAgICAobGVfYXVkaW9fc291cmNlX2hhbF9zdGF0ZSAhPSBIQUxfU1RBUlRFRCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJMRSBhdWRpbyBkZXZpY2UgSEFMIHdhcyBub3Qgc3RhcnRlZCEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNvdXJjZUNsaWVudEludGVyZmFjZS0+U2V0UmVtb3RlRGVsYXkocmVtb3RlX2RlbGF5X21zKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rOjpEZWJ1Z0R1bXAoaW50IGZkKSB7Ci0gIC8qIFRPRE86IEFkZCBzb21lIHN0YXRpc3RpYyBmb3Igc291cmNlIGNsaWVudCBpbnRlcmZhY2UgKi8KLX0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9jbGllbnRfYXVkaW8uaCBiL2J0YS9sZV9hdWRpby9jbGllbnRfYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZmIyMy4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vY2xpZW50X2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAiYXVkaW9faGFsX2ludGVyZmFjZS9sZV9hdWRpb19zb2Z0d2FyZS5oIgotCi0vKiBJbXBsZW1lbnRhdGlvbnMgb2YgTGUgQXVkaW8gd2lsbCBhbHNvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSAqLwotY2xhc3MgTGVBdWRpb0NsaWVudEF1ZGlvU2lua1JlY2VpdmVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkxlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE9uQXVkaW9EYXRhUmVhZHkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQXVkaW9TdXNwZW5kKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19zdXNwZW5kX3Byb21pc2UpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQXVkaW9SZXN1bWUoc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3Jlc3VtZV9wcm9taXNlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvTWV0YWRhdGFVcGRhdGUoCi0gICAgICBzdGQ6OnByb21pc2U8dm9pZD4gZG9fdXBkYXRlX21ldGFkYXRhX3Byb21pc2UsCi0gICAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCYgc291cmNlX21ldGFkYXRhKSA9IDA7Ci19OwotY2xhc3MgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlUmVjZWl2ZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+TGVBdWRpb0NsaWVudEF1ZGlvU291cmNlUmVjZWl2ZXIoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvU3VzcGVuZChzdGQ6OnByb21pc2U8dm9pZD4gZG9fc3VzcGVuZF9wcm9taXNlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvUmVzdW1lKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19yZXN1bWVfcHJvbWlzZSkgPSAwOwotfTsKLQotLyogUmVwcmVzZW50cyBjb25maWd1cmF0aW9uIG9mIGF1ZGlvIGNvZGVjLCBhcyBleGNoYW5nZWQgYmV0d2VlbiBsZSBhdWRpbyBhbmQKLSAqIHBob25lLgotICogSXQgY2FuIGFsc28gYmUgcGFzc2VkIHRvIHRoZSBhdWRpbyBzb3VyY2UgdG8gY29uZmlndXJlIGl0cyBwYXJhbWV0ZXJzLgotICovCi1zdHJ1Y3QgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiB7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ2hhbm5lbE51bWJlck1vbm8gPQotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtDaGFubmVsTnVtYmVyTW9ubzsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDaGFubmVsTnVtYmVyU3RlcmVvID0KLSAgICAgIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjprQ2hhbm5lbE51bWJlclN0ZXJlbzsKLQotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtTYW1wbGVSYXRlNDgwMDAgPQotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtTYW1wbGVSYXRlNDgwMDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1NhbXBsZVJhdGU0NDEwMCA9Ci0gICAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6a1NhbXBsZVJhdGU0NDEwMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrU2FtcGxlUmF0ZTMyMDAwID0KLSAgICAgIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjprU2FtcGxlUmF0ZTMyMDAwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtTYW1wbGVSYXRlMjQwMDAgPQotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtTYW1wbGVSYXRlMjQwMDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1NhbXBsZVJhdGUxNjAwMCA9Ci0gICAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6a1NhbXBsZVJhdGUxNjAwMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrU2FtcGxlUmF0ZTgwMDAgPQotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtTYW1wbGVSYXRlODAwMDsKLQotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0JpdHNQZXJTYW1wbGUxNiA9Ci0gICAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6a0JpdHNQZXJTYW1wbGUxNjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtCaXRzUGVyU2FtcGxlMjQgPQotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtCaXRzUGVyU2FtcGxlMjQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQml0c1BlclNhbXBsZTMyID0KLSAgICAgIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjprQml0c1BlclNhbXBsZTMyOwotCi0gIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0ludGVydmFsNzUwMFVzID0gNzUwMDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrSW50ZXJ2YWwxMDAwMFVzID0gMTAwMDA7Ci0KLSAgLyoqIG51bWJlciBvZiBjaGFubmVscyAqLwotICB1aW50OF90IG51bV9jaGFubmVsczsKLQotICAvKiogc2FtcGxpbmcgcmF0ZSB0aGF0IHRoZSBjb2RlYyBleHBlY3RzIHRvIHJlY2VpdmUgZnJvbSBhdWRpbyBmcmFtZXdvcmsgKi8KLSAgdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0KLSAgLyoqIGJpdHMgcGVyIHNhbXBsZSB0aGF0IGNvZGVjIGV4cGVjdHMgdG8gcmVjZWl2ZSBmcm9tIGF1ZGlvIGZyYW1ld29yayAqLwotICB1aW50OF90IGJpdHNfcGVyX3NhbXBsZTsKLQotICAvKiogRGF0YSBpbnRlcnZhbCBkZXRlcm1pbmVzIGhvdyBvZnRlbiB3ZSBzZW5kIHNhbXBsZXMgdG8gdGhlIHJlbW90ZS4gVGhpcwotICAgKiBzaG91bGQgbWF0Y2ggaG93IG9mdGVuIHdlIGdyYWIgZGF0YSBmcm9tIGF1ZGlvIHNvdXJjZSwgb3B0aW9uYWxseSB3ZSBjYW4KLSAgICogZ3JhYiBkYXRhIGV2ZXJ5IDIgb3IgMyBpbnRlcnZhbHMsIGJ1dCB0aGlzIHdvdWxkIGluY3JlYXNlIGxhdGVuY3kuCi0gICAqCi0gICAqIFZhbHVlIGlzIHByb3ZpZGVkIGluIHVzLgotICAgKi8KLSAgdWludDMyX3QgZGF0YV9pbnRlcnZhbF91czsKLQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiYgb3RoZXIpIHsKLSAgICByZXR1cm4gISgobnVtX2NoYW5uZWxzID09IG90aGVyLm51bV9jaGFubmVscykgJiYKLSAgICAgICAgICAgICAoc2FtcGxlX3JhdGUgPT0gb3RoZXIuc2FtcGxlX3JhdGUpICYmCi0gICAgICAgICAgICAgKGJpdHNfcGVyX3NhbXBsZSA9PSBvdGhlci5iaXRzX3Blcl9zYW1wbGUpICYmCi0gICAgICAgICAgICAgKGRhdGFfaW50ZXJ2YWxfdXMgPT0gb3RoZXIuZGF0YV9pbnRlcnZhbF91cykpOwotICB9Ci0KLSAgYm9vbCBJc0ludmFsaWQoKSB7Ci0gICAgcmV0dXJuIChudW1fY2hhbm5lbHMgPT0gMCkgfHwgKHNhbXBsZV9yYXRlID09IDApIHx8Ci0gICAgICAgICAgIChiaXRzX3Blcl9zYW1wbGUgPT0gMCkgfHwgKGRhdGFfaW50ZXJ2YWxfdXMgPT0gMCk7Ci0gIH0KLX07Ci0KLS8qIFJlcHJlc2VudHMgc291cmNlIG9mIGF1ZGlvIGZvciBsZSBhdWRpbyBjbGllbnQgKi8KLWNsYXNzIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBTdGFydChjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY0NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlciogYXVkaW9SZWNlaXZlcik7Ci0gIHN0YXRpYyB2b2lkIFN0b3AoKTsKLSAgc3RhdGljIGNvbnN0IHZvaWQqIEFjcXVpcmUoKTsKLSAgc3RhdGljIHZvaWQgUmVsZWFzZShjb25zdCB2b2lkKiBpbnN0YW5jZSk7Ci0gIHN0YXRpYyB2b2lkIENvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0KCk7Ci0gIHN0YXRpYyB2b2lkIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgc3RhdGljIHZvaWQgVXBkYXRlUmVtb3RlRGVsYXkodWludDE2X3QgcmVtb3RlX2RlbGF5X21zKTsKLSAgc3RhdGljIHZvaWQgRGVidWdEdW1wKGludCBmZCk7Ci19OwotCi0vKiBSZXByZXNlbnRzIGF1ZGlvIHNpbmsgZm9yIGxlIGF1ZGlvIGNsaWVudCAqLwotY2xhc3MgTGVBdWRpb0NsaWVudEF1ZGlvU2luayB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBTdGFydChjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY0NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZVJlY2VpdmVyKiBhdWRpb1JlY2VpdmVyKTsKLSAgc3RhdGljIHZvaWQgU3RvcCgpOwotICBzdGF0aWMgY29uc3Qgdm9pZCogQWNxdWlyZSgpOwotICBzdGF0aWMgdm9pZCBSZWxlYXNlKGNvbnN0IHZvaWQqIGluc3RhbmNlKTsKLSAgc3RhdGljIHNpemVfdCBTZW5kRGF0YSh1aW50OF90KiBkYXRhLCB1aW50MTZfdCBzaXplKTsKLSAgc3RhdGljIHZvaWQgQ29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKTsKLSAgc3RhdGljIHZvaWQgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpOwotICBzdGF0aWMgdm9pZCBVcGRhdGVSZW1vdGVEZWxheSh1aW50MTZfdCByZW1vdGVfZGVsYXlfbXMpOwotICBzdGF0aWMgdm9pZCBEZWJ1Z0R1bXAoaW50IGZkKTsKLX07CmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vY2xpZW50X2F1ZGlvX3Rlc3QuY2MgYi9idGEvbGVfYXVkaW8vY2xpZW50X2F1ZGlvX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWFkYzYuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL2NsaWVudF9hdWRpb190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjbGllbnRfYXVkaW8uaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJhdWRpb19oYWxfaW50ZXJmYWNlL2xlX2F1ZGlvX3NvZnR3YXJlLmgiCi0jaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2JsdWV0b290aC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6QXNzaWduOwotdXNpbmcgOjp0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVyblBvaW50ZWU7Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyBzdGQ6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiIm1zOwotCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZCgidGVzdCBtZXNzYWdlIGxvb3AiKTsKLWJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogZ2V0X21haW5fdGhyZWFkKCkgewotICByZXR1cm4gJm1lc3NhZ2VfbG9vcF90aHJlYWQ7Ci19Ci1idF9zdGF0dXNfdCBkb19pbl9tYWluX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaykgewotICBpZiAoIW1lc3NhZ2VfbG9vcF90aHJlYWQuRG9JblRocmVhZChmcm9tX2hlcmUsIHN0ZDo6bW92ZSh0YXNrKSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCBmcm9tICIgPDwgZnJvbV9oZXJlLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3BfOwotYmFzZTo6TWVzc2FnZUxvb3AqIGdldF9tYWluX21lc3NhZ2VfbG9vcCgpIHsgcmV0dXJuIG1lc3NhZ2VfbG9vcF87IH0KLQotc3RhdGljIHZvaWQgaW5pdF9tZXNzYWdlX2xvb3BfdGhyZWFkKCkgewotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgaWYgKCFtZXNzYWdlX2xvb3BfdGhyZWFkLklzUnVubmluZygpKSB7Ci0gICAgRkFJTCgpIDw8ICJ1bmFibGUgdG8gY3JlYXRlIG1lc3NhZ2UgbG9vcCB0aHJlYWQuIjsKLSAgfQotCi0gIGlmICghbWVzc2FnZV9sb29wX3RocmVhZC5FbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKSkKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc2V0IHJlYWwgdGltZSBzY2hlZHVsaW5nIjsKLQotICBtZXNzYWdlX2xvb3BfID0gbWVzc2FnZV9sb29wX3RocmVhZC5tZXNzYWdlX2xvb3AoKTsKLSAgaWYgKG1lc3NhZ2VfbG9vcF8gPT0gbnVsbHB0cikgRkFJTCgpIDw8ICJ1bmFibGUgdG8gZ2V0IG1lc3NhZ2UgbG9vcC4iOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX21lc3NhZ2VfbG9vcF90aHJlYWQoKSB7Ci0gIG1lc3NhZ2VfbG9vcF8gPSBudWxscHRyOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci19Ci0KLXVzaW5nIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOwotCi1jbGFzcyBNb2NrTGVBdWRpb0NsaWVudEludGVyZmFjZVNpbmsgOiBwdWJsaWMgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luayB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRCgodm9pZCksIENsZWFudXAsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTZXRQY21QYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAoY29uc3QgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6UGNtUGFyYW1ldGVycyYgcGFyYW1zKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU2V0UmVtb3RlRGVsYXksICh1aW50MTZfdCBkZWxheV9yZXBvcnRfbXMpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdGFydFNlc3Npb24sICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdG9wU2Vzc2lvbiwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIENvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0LCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoc2l6ZV90KSwgUmVhZCwgKHVpbnQ4X3QgKiBwX2J1ZiwgdWludDMyX3QgbGVuKSk7Ci19OwotCi1jbGFzcyBNb2NrTGVBdWRpb0NsaWVudEludGVyZmFjZVNvdXJjZSA6IHB1YmxpYyBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDbGVhbnVwLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU2V0UGNtUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgKGNvbnN0IExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlBjbVBhcmFtZXRlcnMmIHBhcmFtcyksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFNldFJlbW90ZURlbGF5LCAodWludDE2X3QgZGVsYXlfcmVwb3J0X21zKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU3RhcnRTZXNzaW9uLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU3RvcFNlc3Npb24sICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDb25maXJtU3RyZWFtaW5nUmVxdWVzdCwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIENhbmNlbFN0cmVhbWluZ1JlcXVlc3QsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHNpemVfdCksIFdyaXRlLCAoY29uc3QgdWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbikpOwotfTsKLQotY2xhc3MgTW9ja0xlQXVkaW9DbGllbnRJbnRlcmZhY2UgOiBwdWJsaWMgTGVBdWRpb0NsaWVudEludGVyZmFjZSB7Ci0gcHVibGljOgotICBNb2NrTGVBdWRpb0NsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgfk1vY2tMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIE1PQ0tfTUVUSE9EKChTaW5rKiksIEdldFNpbmssCi0gICAgICAgICAgICAgIChibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6U3RyZWFtQ2FsbGJhY2tzIHN0cmVhbV9jYiwKLSAgICAgICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wKSk7Ci0gIE1PQ0tfTUVUSE9EKChTb3VyY2UqKSwgR2V0U291cmNlLAotICAgICAgICAgICAgICAoYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OlN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgICAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIG1lc3NhZ2VfbG9vcCkpOwotfTsKLQotTGVBdWRpb0NsaWVudEludGVyZmFjZSogbW9ja0ludGVyZmFjZTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLU1vY2tMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBpbnRlcmZhY2VfbW9jazsKLU1vY2tMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlU2luayogc2lua19tb2NrOwotTW9ja0xlQXVkaW9DbGllbnRJbnRlcmZhY2VTb3VyY2UqIHNvdXJjZV9tb2NrOwotCi1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXQoKSB7IHJldHVybiBpbnRlcmZhY2VfbW9jazsgfQotCi1MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXRTaW5rKAotICAgIFN0cmVhbUNhbGxiYWNrcyBzdHJlYW1fY2IsCi0gICAgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBtZXNzYWdlX2xvb3ApIHsKLSAgcmV0dXJuIGludGVyZmFjZV9tb2NrLT5HZXRTaW5rKHN0cmVhbV9jYiwgbWVzc2FnZV9sb29wKTsKLX0KLQotTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlKiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpHZXRTb3VyY2UoCi0gICAgU3RyZWFtQ2FsbGJhY2tzIHN0cmVhbV9jYiwKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIG1lc3NhZ2VfbG9vcCkgewotICByZXR1cm4gaW50ZXJmYWNlX21vY2stPkdldFNvdXJjZShzdHJlYW1fY2IsIG1lc3NhZ2VfbG9vcCk7Ci19Ci0KLWJvb2wgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6UmVsZWFzZVNpbmsoTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luayogc2luaykgewotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6UmVsZWFzZVNvdXJjZSgKLSAgICBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2UqIHNvdXJjZSkgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rOjpDbGVhbnVwKCkge30KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6U2V0UGNtUGFyYW1ldGVycygKLSAgICBjb25zdCBQY21QYXJhbWV0ZXJzJiBwYXJhbXMpIHt9Ci12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbms6OlNldFJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5X3JlcG9ydF9tcykge30KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6U3RhcnRTZXNzaW9uKCkge30KLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U2luazo6U3RvcFNlc3Npb24oKSB7fQotdm9pZCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTaW5rOjpDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpe307Ci12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbms6OkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKXt9OwotCi12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6Q2xlYW51cCgpIHt9Ci12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6U2V0UGNtUGFyYW1ldGVycygKLSAgICBjb25zdCBQY21QYXJhbWV0ZXJzJiBwYXJhbXMpIHt9Ci12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6U2V0UmVtb3RlRGVsYXkodWludDE2X3QgZGVsYXlfcmVwb3J0X21zKSB7fQotdm9pZCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2U6OlN0YXJ0U2Vzc2lvbigpIHt9Ci12b2lkIExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6U3RvcFNlc3Npb24oKSB7fQotdm9pZCBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpTb3VyY2U6OkNvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0KCl7fTsKLXZvaWQgTGVBdWRpb0NsaWVudEludGVyZmFjZTo6U291cmNlOjpDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCl7fTsKLQotc2l6ZV90IExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNvdXJjZTo6V3JpdGUoY29uc3QgdWludDhfdCogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW4pIHsKLSAgcmV0dXJuIHNvdXJjZV9tb2NrLT5Xcml0ZShwX2J1ZiwgbGVuKTsKLX0KLQotc2l6ZV90IExlQXVkaW9DbGllbnRJbnRlcmZhY2U6OlNpbms6OlJlYWQodWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbikgewotICByZXR1cm4gc2lua19tb2NrLT5SZWFkKHBfYnVmLCBsZW4pOwotfQotfSAgLy8gbmFtZXNwYWNlIGxlX2F1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotY2xhc3MgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NpbmtFdmVudFJlY2VpdmVyCi0gICAgOiBwdWJsaWMgTGVBdWRpb0NsaWVudEF1ZGlvU2lua1JlY2VpdmVyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25BdWRpb0RhdGFSZWFkeSwgKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25BdWRpb1N1c3BlbmQsIChzdGQ6OnByb21pc2U8dm9pZD4gZG9fc3VzcGVuZF9wcm9taXNlKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25BdWRpb1Jlc3VtZSwgKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19yZXN1bWVfcHJvbWlzZSksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uQXVkaW9NZXRhZGF0YVVwZGF0ZSwKLSAgICAgICAgICAgICAgKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb191cGRhdGVfbWV0YWRhdGFfcHJvbWlzZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90JiBzb3VyY2VfbWV0YWRhdGEpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLX07Ci0KLWNsYXNzIE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VFdmVudFJlY2VpdmVyCi0gICAgOiBwdWJsaWMgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlUmVjZWl2ZXIgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkF1ZGlvU3VzcGVuZCwgKHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19zdXNwZW5kX3Byb21pc2UpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkF1ZGlvUmVzdW1lLCAoc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3Jlc3VtZV9wcm9taXNlKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci19OwotCi1jbGFzcyBMZUF1ZGlvQ2xpZW50QXVkaW9UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFNldFVwKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBpbml0X21lc3NhZ2VfbG9vcF90aHJlYWQoKTsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6aW50ZXJmYWNlX21vY2sgPSAmbW9ja19jbGllbnRfaW50ZXJmYWNlXzsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6c2lua19tb2NrID0gJm1vY2tfY2xpZW50X2ludGVyZmFjZV9zaW5rXzsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6c291cmNlX21vY2sgPSAmbW9ja19jbGllbnRfaW50ZXJmYWNlX3NvdXJjZV87Ci0KLSAgICAvLyBJbml0IHNpbmsgQXVkaW8gSEFMIG1vY2sKLSAgICBpc19zaW5rX2FjcXVpcmVkID0gZmFsc2U7Ci0gICAgaGFsX3Npbmtfc3RyZWFtX2NiID0gey5vbl9zdXNwZW5kXyA9IG51bGxwdHIsIC5vbl9yZXN1bWVfID0gbnVsbHB0cn07Ci0KLSAgICBPTl9DQUxMKG1vY2tfY2xpZW50X2ludGVyZmFjZV8sIEdldFNpbmsoXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KERvQWxsKFNhdmVBcmc8MD4oJmhhbF9zaW5rX3N0cmVhbV9jYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbigmaXNfc2lua19hY3F1aXJlZCwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybihibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6c2lua19tb2NrKSkpOwotICAgIE9OX0NBTEwobW9ja19jbGllbnRfaW50ZXJmYWNlX3NpbmtfLCBDbGVhbnVwKCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KEFzc2lnbigmaXNfc2lua19hY3F1aXJlZCwgZmFsc2UpKTsKLQotICAgIC8vIEluaXQgc291cmNlIEF1ZGlvIEhBTCBtb2NrCi0gICAgaXNfc291cmNlX2FjcXVpcmVkID0gZmFsc2U7Ci0gICAgaGFsX3NvdXJjZV9zdHJlYW1fY2IgPSB7Lm9uX3N1c3BlbmRfID0gbnVsbHB0ciwgLm9uX3Jlc3VtZV8gPSBudWxscHRyfTsKLQotICAgIE9OX0NBTEwobW9ja19jbGllbnRfaW50ZXJmYWNlXywgR2V0U291cmNlKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChTYXZlQXJnPDA+KCZoYWxfc291cmNlX3N0cmVhbV9jYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbigmaXNfc291cmNlX2FjcXVpcmVkLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpzb3VyY2VfbW9jaykpKTsKLSAgICBPTl9DQUxMKG1vY2tfY2xpZW50X2ludGVyZmFjZV9zb3VyY2VfLCBDbGVhbnVwKCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KEFzc2lnbigmaXNfc291cmNlX2FjcXVpcmVkLCBmYWxzZSkpOwotICB9Ci0KLSAgdm9pZCBBY3F1aXJlQXVkaW9TaW5rKHZvaWQpIHsKLSAgICBhdWRpb19zaW5rX2luc3RhbmNlXyA9IExlQXVkaW9DbGllbnRBdWRpb1Npbms6OkFjcXVpcmUoKTsKLSAgfQotCi0gIHZvaWQgUmVsZWFzZUF1ZGlvU2luayh2b2lkKSB7Ci0gICAgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6UmVsZWFzZShhdWRpb19zaW5rX2luc3RhbmNlXyk7Ci0gICAgYXVkaW9fc2lua19pbnN0YW5jZV8gPSBudWxscHRyOwotICB9Ci0KLSAgdm9pZCBBY3F1aXJlQXVkaW9Tb3VyY2Uodm9pZCkgewotICAgIGF1ZGlvX3NvdXJjZV9pbnN0YW5jZV8gPSBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkFjcXVpcmUoKTsKLSAgfQotCi0gIHZvaWQgUmVsZWFzZUF1ZGlvU291cmNlKHZvaWQpIHsKLSAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlJlbGVhc2UoYXVkaW9fc291cmNlX2luc3RhbmNlXyk7Ci0gICAgYXVkaW9fc291cmNlX2luc3RhbmNlXyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKHZvaWQpIG92ZXJyaWRlIHsKLSAgICAvKiBXZSBoYXZlIHRvIGNhbGwgQ2xlYW51cCB0byB0aWR5IHVwIHNvbWUgc3RhdGljIHZhcmlhYmxlcy4KLSAgICAgKiBJZiBvbiB0aGUgSEFMIGVuZCBTb3VyY2UgaXMgcnVubmluZyBpdCBtZWFucyB3ZSBhcmUgcnVubmluZyB0aGUgU2luawotICAgICAqIG9uIG91ciBlbmQsIGFuZCB2aWNlIHZlcnNhLgotICAgICAqLwotICAgIGlmIChpc19zb3VyY2VfYWNxdWlyZWQgPT0gdHJ1ZSkgUmVsZWFzZUF1ZGlvU2luaygpOwotICAgIGlmIChpc19zaW5rX2FjcXVpcmVkID09IHRydWUpIFJlbGVhc2VBdWRpb1NvdXJjZSgpOwotCi0gICAgY2xlYW51cF9tZXNzYWdlX2xvb3BfdGhyZWFkKCk7Ci0KLSAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6c2lua19tb2NrID0gbnVsbHB0cjsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6c291cmNlX21vY2sgPSBudWxscHRyOwotICB9Ci0KLSAgTW9ja0xlQXVkaW9DbGllbnRJbnRlcmZhY2UgbW9ja19jbGllbnRfaW50ZXJmYWNlXzsKLSAgTW9ja0xlQXVkaW9DbGllbnRJbnRlcmZhY2VTaW5rIG1vY2tfY2xpZW50X2ludGVyZmFjZV9zaW5rXzsKLSAgTW9ja0xlQXVkaW9DbGllbnRJbnRlcmZhY2VTb3VyY2UgbW9ja19jbGllbnRfaW50ZXJmYWNlX3NvdXJjZV87Ci0KLSAgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NpbmtFdmVudFJlY2VpdmVyIG1vY2tfaGFsX3NpbmtfZXZlbnRfcmVjZWl2ZXJfOwotICBNb2NrTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlRXZlbnRSZWNlaXZlciBtb2NrX2hhbF9zb3VyY2VfZXZlbnRfcmVjZWl2ZXJfOwotCi0gIGJvb2wgaXNfc291cmNlX2FjcXVpcmVkID0gZmFsc2U7Ci0gIGJvb2wgaXNfc2lua19hY3F1aXJlZCA9IGZhbHNlOwotICBjb25zdCB2b2lkKiBhdWRpb19zaW5rX2luc3RhbmNlXyA9IG51bGxwdHI7Ci0gIGNvbnN0IHZvaWQqIGF1ZGlvX3NvdXJjZV9pbnN0YW5jZV8gPSBudWxscHRyOwotCi0gIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpTdHJlYW1DYWxsYmFja3MgaGFsX3NvdXJjZV9zdHJlYW1fY2I7Ci0gIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpTdHJlYW1DYWxsYmFja3MgaGFsX3Npbmtfc3RyZWFtX2NiOwotCi0gIGNvbnN0IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24gZGVmYXVsdF9jb2RlY19jb25mewotICAgICAgLm51bV9jaGFubmVscyA9IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtDaGFubmVsTnVtYmVyTW9ubywKLSAgICAgIC5zYW1wbGVfcmF0ZSA9IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtTYW1wbGVSYXRlNDQxMDAsCi0gICAgICAuYml0c19wZXJfc2FtcGxlID0gTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbjo6a0JpdHNQZXJTYW1wbGUyNCwKLSAgICAgIC5kYXRhX2ludGVydmFsX3VzID0gTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbjo6a0ludGVydmFsMTAwMDBVcywKLSAgfTsKLX07Ci0KLVRFU1RfRihMZUF1ZGlvQ2xpZW50QXVkaW9UZXN0LCB0ZXN0TGVBdWRpb0NsaWVudEF1ZGlvU2lua0luaXRpYWxpemVDbGVhbnVwKSB7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2ludGVyZmFjZV8sIEdldFNvdXJjZShfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChBc3NpZ24oJmlzX3NvdXJjZV9hY3F1aXJlZCwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpzb3VyY2VfbW9jaykpKTsKLSAgQWNxdWlyZUF1ZGlvU2luaygpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2ludGVyZmFjZV9zb3VyY2VfLCBDbGVhbnVwKCkpCi0gICAgICAuV2lsbE9uY2UoQXNzaWduKCZpc19zb3VyY2VfYWNxdWlyZWQsIGZhbHNlKSk7Ci0gIFJlbGVhc2VBdWRpb1NpbmsoKTsKLX0KLQotVEVTVF9GKExlQXVkaW9DbGllbnRBdWRpb1Rlc3QsIHRlc3RMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VJbml0aWFsaXplQ2xlYW51cCkgewotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9pbnRlcmZhY2VfLCBHZXRTaW5rKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKEFzc2lnbigmaXNfc2lua19hY3F1aXJlZCwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjpzaW5rX21vY2spKSk7Ci0gIEFjcXVpcmVBdWRpb1NvdXJjZSgpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2ludGVyZmFjZV9zaW5rXywgQ2xlYW51cCgpKQotICAgICAgLldpbGxPbmNlKEFzc2lnbigmaXNfc2lua19hY3F1aXJlZCwgZmFsc2UpKTsKLSAgUmVsZWFzZUF1ZGlvU291cmNlKCk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQ2xpZW50QXVkaW9UZXN0LCB0ZXN0TGVBdWRpb0NsaWVudEF1ZGlvU2lua1N0YXJ0U3RvcCkgewotICBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpQY21QYXJhbWV0ZXJzIHBhcmFtczsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfaW50ZXJmYWNlX3NvdXJjZV8sIFNldFBjbVBhcmFtZXRlcnMoXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZwYXJhbXMpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfaW50ZXJmYWNlX3NvdXJjZV8sIFN0YXJ0U2Vzc2lvbigpKS5UaW1lcygxKTsKLQotICBBY3F1aXJlQXVkaW9TaW5rKCk7Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0YXJ0KGRlZmF1bHRfY29kZWNfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfaGFsX3NvdXJjZV9ldmVudF9yZWNlaXZlcl8pKTsKLQotICBBU1NFUlRfRVEocGFyYW1zLmNoYW5uZWxzX2NvdW50LAotICAgICAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtDaGFubmVsTnVtYmVyTW9ubyk7Ci0gIEFTU0VSVF9FUShwYXJhbXMuc2FtcGxlX3JhdGUsIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjprU2FtcGxlUmF0ZTQ0MTAwKTsKLSAgQVNTRVJUX0VRKHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6a0JpdHNQZXJTYW1wbGUyNCk7Ci0gIEFTU0VSVF9FUShwYXJhbXMuZGF0YV9pbnRlcnZhbF91cywgMTAwMDB1KTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9pbnRlcmZhY2Vfc291cmNlXywgU3RvcFNlc3Npb24oKSkuVGltZXMoMSk7Ci0KLSAgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U3RvcCgpOwotfQotCi1URVNUX0YoTGVBdWRpb0NsaWVudEF1ZGlvVGVzdCwgdGVzdExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZVN0YXJ0U3RvcCkgewotICBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOjpQY21QYXJhbWV0ZXJzIHBhcmFtczsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfaW50ZXJmYWNlX3NpbmtfLCBTZXRQY21QYXJhbWV0ZXJzKF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmcGFyYW1zKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2ludGVyZmFjZV9zaW5rXywgU3RhcnRTZXNzaW9uKCkpLlRpbWVzKDEpOwotCi0gIEFjcXVpcmVBdWRpb1NvdXJjZSgpOwotICBBU1NFUlRfVFJVRShMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0YXJ0KGRlZmF1bHRfY29kZWNfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9ja19oYWxfc2lua19ldmVudF9yZWNlaXZlcl8pKTsKLQotICBBU1NFUlRfRVEocGFyYW1zLmNoYW5uZWxzX2NvdW50LAotICAgICAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6bGVfYXVkaW86OmtDaGFubmVsTnVtYmVyTW9ubyk7Ci0gIEFTU0VSVF9FUShwYXJhbXMuc2FtcGxlX3JhdGUsIGJsdWV0b290aDo6YXVkaW86OmxlX2F1ZGlvOjprU2FtcGxlUmF0ZTQ0MTAwKTsKLSAgQVNTRVJUX0VRKHBhcmFtcy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICBibHVldG9vdGg6OmF1ZGlvOjpsZV9hdWRpbzo6a0JpdHNQZXJTYW1wbGUyNCk7Ci0gIEFTU0VSVF9FUShwYXJhbXMuZGF0YV9pbnRlcnZhbF91cywgMTAwMDB1KTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9pbnRlcmZhY2Vfc2lua18sIFN0b3BTZXNzaW9uKCkpLlRpbWVzKDEpOwotCi0gIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6U3RvcCgpOwotfQotCi1URVNUX0YoTGVBdWRpb0NsaWVudEF1ZGlvVGVzdCwgdGVzdExlQXVkaW9DbGllbnRBdWRpb1NpbmtTZW5kRGF0YSkgewotICBBY3F1aXJlQXVkaW9TaW5rKCk7Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0YXJ0KGRlZmF1bHRfY29kZWNfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfaGFsX3NvdXJjZV9ldmVudF9yZWNlaXZlcl8pKTsKLQotICBjb25zdCB1aW50OF90KiBleHBfcCA9IG51bGxwdHI7Ci0gIHVpbnQzMl90IGV4cF9sZW4gPSAwOwotICB1aW50OF90IGlucHV0X2J1ZltdID0gewotICAgICAgMHgwMiwKLSAgICAgIDB4MDMsCi0gICAgICAweDA1LAotICAgICAgMHgxOSwKLSAgfTsKLSAgT05fQ0FMTChtb2NrX2NsaWVudF9pbnRlcmZhY2Vfc291cmNlXywgV3JpdGUoXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChTYXZlQXJnPDA+KCZleHBfcCksIFNhdmVBcmc8MT4oJmV4cF9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuUG9pbnRlZSgmZXhwX2xlbikpKTsKLQotICBBU1NFUlRfRVEoTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U2VuZERhdGEoaW5wdXRfYnVmLCBzaXplb2YoaW5wdXRfYnVmKSksCi0gICAgICAgICAgICBzaXplb2YoaW5wdXRfYnVmKSk7Ci0gIEFTU0VSVF9FUShleHBfbGVuLCBzaXplb2YoaW5wdXRfYnVmKSk7Ci0gIEFTU0VSVF9FUShleHBfcCwgaW5wdXRfYnVmKTsKLQotICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0b3AoKTsKLX0KLQotVEVTVF9GKExlQXVkaW9DbGllbnRBdWRpb1Rlc3QsIHRlc3RMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rU3VzcGVuZCkgewotICBBY3F1aXJlQXVkaW9TaW5rKCk7Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlN0YXJ0KGRlZmF1bHRfY29kZWNfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfaGFsX3NvdXJjZV9ldmVudF9yZWNlaXZlcl8pKTsKLQotICBBU1NFUlRfTkUoaGFsX3NvdXJjZV9zdHJlYW1fY2Iub25fc3VzcGVuZF8sIG51bGxwdHIpOwotCi0gIC8qIEV4cGVjdCBMZUF1ZGlvIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXIgdG8gZ2V0IGNhbGxlZCB3aGVuIEhBTCBjYWxscyB0aGUKLSAgICogY2xpZW50X2F1ZGlvJ3MgaW50ZXJuYWwgc3VzcGVuZCBjYWxsYmFjay4KLSAgICovCi0gIEVYUEVDVF9DQUxMKG1vY2tfaGFsX3NvdXJjZV9ldmVudF9yZWNlaXZlcl8sIE9uQXVkaW9TdXNwZW5kKF8pKS5UaW1lcygxKTsKLSAgQVNTRVJUX1RSVUUoaGFsX3NvdXJjZV9zdHJlYW1fY2Iub25fc3VzcGVuZF8oKSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQ2xpZW50QXVkaW9UZXN0LCB0ZXN0TGVBdWRpb0NsaWVudEF1ZGlvU291cmNlU3VzcGVuZCkgewotICBBY3F1aXJlQXVkaW9Tb3VyY2UoKTsKLSAgQVNTRVJUX1RSVUUoTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpTdGFydChkZWZhdWx0X2NvZGVjX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfaGFsX3NpbmtfZXZlbnRfcmVjZWl2ZXJfKSk7Ci0KLSAgQVNTRVJUX05FKGhhbF9zaW5rX3N0cmVhbV9jYi5vbl9zdXNwZW5kXywgbnVsbHB0cik7Ci0KLSAgLyogRXhwZWN0IExlQXVkaW8gcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lciB0byBnZXQgY2FsbGVkIHdoZW4gSEFMIGNhbGxzIHRoZQotICAgKiBjbGllbnRfYXVkaW8ncyBpbnRlcm5hbCBzdXNwZW5kIGNhbGxiYWNrLgotICAgKi8KLSAgRVhQRUNUX0NBTEwobW9ja19oYWxfc2lua19ldmVudF9yZWNlaXZlcl8sIE9uQXVkaW9TdXNwZW5kKF8pKS5UaW1lcygxKTsKLSAgQVNTRVJUX1RSVUUoaGFsX3Npbmtfc3RyZWFtX2NiLm9uX3N1c3BlbmRfKCkpOwotfQotCi1URVNUX0YoTGVBdWRpb0NsaWVudEF1ZGlvVGVzdCwgdGVzdExlQXVkaW9DbGllbnRBdWRpb1NpbmtSZXN1bWUpIHsKLSAgQWNxdWlyZUF1ZGlvU2luaygpOwotICBBU1NFUlRfVFJVRShMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rOjpTdGFydChkZWZhdWx0X2NvZGVjX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2NrX2hhbF9zb3VyY2VfZXZlbnRfcmVjZWl2ZXJfKSk7Ci0KLSAgQVNTRVJUX05FKGhhbF9zb3VyY2Vfc3RyZWFtX2NiLm9uX3Jlc3VtZV8sIG51bGxwdHIpOwotCi0gIC8qIEV4cGVjdCBMZUF1ZGlvIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXIgdG8gZ2V0IGNhbGxlZCB3aGVuIEhBTCBjYWxscyB0aGUKLSAgICogY2xpZW50X2F1ZGlvJ3MgaW50ZXJuYWwgcmVzdW1lIGNhbGxiYWNrLgotICAgKi8KLSAgRVhQRUNUX0NBTEwobW9ja19oYWxfc291cmNlX2V2ZW50X3JlY2VpdmVyXywgT25BdWRpb1Jlc3VtZShfKSkuVGltZXMoMSk7Ci0gIGJvb2wgc3RhcnRfbWVkaWFfdGFzayA9IGZhbHNlOwotICBBU1NFUlRfVFJVRShoYWxfc291cmNlX3N0cmVhbV9jYi5vbl9yZXN1bWVfKHN0YXJ0X21lZGlhX3Rhc2spKTsKLX0KLQotVEVTVF9GKExlQXVkaW9DbGllbnRBdWRpb1Rlc3QsCi0gICAgICAgdGVzdExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZVJlc3VtZVN0YXJ0U291cmNlVGFzaykgewotICBjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uIGNvZGVjX2NvbmZ7Ci0gICAgICAubnVtX2NoYW5uZWxzID0gTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbjo6a0NoYW5uZWxOdW1iZXJTdGVyZW8sCi0gICAgICAuc2FtcGxlX3JhdGUgPSBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uOjprU2FtcGxlUmF0ZTE2MDAwLAotICAgICAgLmJpdHNfcGVyX3NhbXBsZSA9IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtCaXRzUGVyU2FtcGxlMjQsCi0gICAgICAuZGF0YV9pbnRlcnZhbF91cyA9IExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtJbnRlcnZhbDEwMDAwVXMsCi0gIH07Ci0gIEFjcXVpcmVBdWRpb1NvdXJjZSgpOwotICBBU1NFUlRfVFJVRShMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlN0YXJ0KGNvZGVjX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfaGFsX3NpbmtfZXZlbnRfcmVjZWl2ZXJfKSk7Ci0KLSAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gcmVzdW1lZF90czsKLSAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gZXhlY3V0ZWRfdHM7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotCi0gIHVpbnQzMl90IGNhbGN1bGF0ZWRfYnl0ZXNfcGVyX3RpY2sgPSAwOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9pbnRlcmZhY2Vfc2lua18sIFJlYWQoXywgXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2UoWyZdKHVpbnQ4X3QqIHBfYnVmLCB1aW50MzJfdCBsZW4pIC0+IHVpbnQzMl90IHsKLSAgICAgICAgZXhlY3V0ZWRfdHMgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKLSAgICAgICAgY2FsY3VsYXRlZF9ieXRlc19wZXJfdGljayA9IGxlbjsKLQotICAgICAgICAvLyBmYWtlIHNvbWUgZGF0YSBmcm9tIGF1ZGlvIGZyYW1ld29yawotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwdTsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgICAgcF9idWZbaV0gPSBpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIGV4YWN0bHkgYXMgbXVjaCBkYXRhIGFzIHJlcXVlc3RlZAotICAgICAgICBwcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgICByZXR1cm4gbGVuOwotICAgICAgfSkpOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBkYXRhX3Byb21pc2U7Ci0gIGF1dG8gZGF0YV9mdXR1cmUgPSBkYXRhX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotCi0gIC8qIEV4cGVjdCB0aGlzIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB0byBDbGllbnQgYnkgdGhlIEhBTCBnbHVlIGxheWVyICovCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1lZGlhX2RhdGFfdG9fc2VuZDsKLSAgRVhQRUNUX0NBTEwobW9ja19oYWxfc2lua19ldmVudF9yZWNlaXZlcl8sIE9uQXVkaW9EYXRhUmVhZHkoXykpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlKFsmXShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSkgLT4gdm9pZCB7Ci0gICAgICAgIG1lZGlhX2RhdGFfdG9fc2VuZCA9IHN0ZDo6bW92ZShkYXRhKTsKLSAgICAgICAgZGF0YV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgfSkpOwotCi0gIC8qIEV4cGVjdCBMZUF1ZGlvIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXIgdG8gZ2V0IGNhbGxlZCB3aGVuIEhBTCBjYWxscyB0aGUKLSAgICogY2xpZW50X2F1ZGlvJ3MgaW50ZXJuYWwgcmVzdW1lIGNhbGxiYWNrLgotICAgKi8KLSAgQVNTRVJUX05FKGhhbF9zaW5rX3N0cmVhbV9jYi5vbl9yZXN1bWVfLCBudWxscHRyKTsKLSAgRVhQRUNUX0NBTEwobW9ja19oYWxfc2lua19ldmVudF9yZWNlaXZlcl8sIE9uQXVkaW9SZXN1bWUoXykpLlRpbWVzKDEpOwotICByZXN1bWVkX3RzID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7Ci0gIGJvb2wgc3RhcnRfbWVkaWFfdGFzayA9IHRydWU7Ci0gIEFTU0VSVF9UUlVFKGhhbF9zaW5rX3N0cmVhbV9jYi5vbl9yZXN1bWVfKHN0YXJ0X21lZGlhX3Rhc2spKTsKLSAgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpOwotCi0gIEFTU0VSVF9FUShmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpLAotICAgICAgICAgICAgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0KLSAgQVNTRVJUX0VRKGRhdGFfZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKSwKLSAgICAgICAgICAgIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotCi0gIC8vIENoZWNrIGFnYWlucyBleHBlY3RlZCBwYXlsb2FkIHNpemUKLSAgY29uc3QgdWludDMyX3QgY2hhbm5lbF9ieXRlc19wZXJfc2FtcGxlID0gKDI0IC8qYnBzKi8gLyA4KTsKLSAgY29uc3QgdWludDMyX3QgY2hhbm5lbF9ieXRlc19wZXJfMTBtc19hdF8xNjAwMEh6ID0KLSAgICAgICgoMTBtcykuY291bnQoKSAqIGNoYW5uZWxfYnl0ZXNfcGVyX3NhbXBsZSAqIDE2MDAwIC8qSHoqLykgLwotICAgICAgKDEwMDBtcykuY291bnQoKTsKLQotICAvLyBFeHBlY3QgMiBjaGFubmVsIChzdGVyZW8pIGRhdGEKLSAgQVNTRVJUX0VRKGNhbGN1bGF0ZWRfYnl0ZXNfcGVyX3RpY2ssIDIgKiBjaGFubmVsX2J5dGVzX3Blcl8xMG1zX2F0XzE2MDAwSHopOwotCi0gIC8vIFZlcmlmeSBjYWxsYmFjayBjYWxsIGludGVydmFsIGZvciB0aGUgcmVxdWVzdGVkIDEwbXMgKCsybXMgZXJyb3IgbWFyZ2luKQotICBhdXRvIGRlbHRhID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCi0gICAgICBleGVjdXRlZF90cyAtIHJlc3VtZWRfdHMpOwotICBFWFBFQ1RfVFJVRSgoZGVsdGEgPj0gMTBtcykgJiYgKGRlbHRhIDw9IDEybXMpKTsKLQotICAvLyBWZXJpZnkgaWYgd2UgZ290IGp1c3QgcmlnaHQgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGNhbGxiYWNrIGNhbGwKLSAgQVNTRVJUX0VRKG1lZGlhX2RhdGFfdG9fc2VuZC5zaXplKCksIGNhbGN1bGF0ZWRfYnl0ZXNfcGVyX3RpY2spOwotfQotCi1URVNUX0YoTGVBdWRpb0NsaWVudEF1ZGlvVGVzdCwgdGVzdExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZVJlc3VtZSkgewotICBBY3F1aXJlQXVkaW9Tb3VyY2UoKTsKLSAgQVNTRVJUX1RSVUUoTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpTdGFydChkZWZhdWx0X2NvZGVjX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfaGFsX3NpbmtfZXZlbnRfcmVjZWl2ZXJfKSk7Ci0KLSAgQVNTRVJUX05FKGhhbF9zaW5rX3N0cmVhbV9jYi5vbl9yZXN1bWVfLCBudWxscHRyKTsKLQotICAvKiBFeHBlY3QgTGVBdWRpbyByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVyIHRvIGdldCBjYWxsZWQgd2hlbiBIQUwgY2FsbHMgdGhlCi0gICAqIGNsaWVudF9hdWRpbydzIGludGVybmFsIHJlc3VtZSBjYWxsYmFjay4KLSAgICovCi0gIEVYUEVDVF9DQUxMKG1vY2tfaGFsX3NpbmtfZXZlbnRfcmVjZWl2ZXJfLCBPbkF1ZGlvUmVzdW1lKF8pKS5UaW1lcygxKTsKLSAgYm9vbCBzdGFydF9tZWRpYV90YXNrID0gZmFsc2U7Ci0gIEFTU0VSVF9UUlVFKGhhbF9zaW5rX3N0cmVhbV9jYi5vbl9yZXN1bWVfKHN0YXJ0X21lZGlhX3Rhc2spKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9jbGllbnRfbGludXguY2MgYi9idGEvbGVfYXVkaW8vY2xpZW50X2xpbnV4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDlhOGZlLi4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9jbGllbnRfbGludXguY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotCi1jbGFzcyBMZUF1ZGlvQ2xpZW50SW1wbCA6IHB1YmxpYyBMZUF1ZGlvQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIExlQXVkaW9DbGllbnRJbXBsKHZvaWQpID0gZGVmYXVsdDsKLSAgfkxlQXVkaW9DbGllbnRJbXBsKHZvaWQpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7fQotICB2b2lkIENvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUge30KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgR3JvdXBBZGROb2RlKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgb3ZlcnJpZGUge30KLSAgdm9pZCBHcm91cFJlbW92ZU5vZGUoY29uc3QgaW50IGdyb3VwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSBvdmVycmlkZSB7fQotICB2b2lkIEdyb3VwU3RyZWFtKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgdWludDE2X3QgY29udGVudF90eXBlKSBvdmVycmlkZSB7fQotICB2b2lkIEdyb3VwU3VzcGVuZChjb25zdCBpbnQgZ3JvdXBfaWQpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgR3JvdXBTdG9wKGNvbnN0IGludCBncm91cF9pZCkgb3ZlcnJpZGUge30KLSAgdm9pZCBHcm91cERlc3Ryb3koY29uc3QgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7fQotICB2b2lkIEdyb3VwU2V0QWN0aXZlKGNvbnN0IGludCBncm91cF9pZCkgb3ZlcnJpZGUge30KLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gR2V0R3JvdXBEZXZpY2VzKGNvbnN0IGludCBncm91cF9pZCkgb3ZlcnJpZGUgewotICAgIHJldHVybiB7fTsKLSAgfQotfTsKLQotdm9pZCBMZUF1ZGlvQ2xpZW50OjpJbml0aWFsaXplKAotICAgIGJsdWV0b290aDo6bGVfYXVkaW86OkxlQXVkaW9DbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICBiYXNlOjpDbG9zdXJlIGluaXRDYiwgYmFzZTo6Q2FsbGJhY2s8Ym9vbCgpPiBoYWxfMl8xX3ZlcmlmaWVyKSB7fQotdm9pZCBMZUF1ZGlvQ2xpZW50OjpDbGVhbnVwKHZvaWQpIHt9Ci1MZUF1ZGlvQ2xpZW50KiBMZUF1ZGlvQ2xpZW50OjpHZXQodm9pZCkgeyByZXR1cm4gbnVsbHB0cjsgfQotdm9pZCBMZUF1ZGlvQ2xpZW50OjpEZWJ1Z0R1bXAoaW50IGZkKSB7fQotdm9pZCBMZUF1ZGlvQ2xpZW50OjpBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBib29sIGF1dG9jb25uZWN0KSB7fQotYm9vbCBMZUF1ZGlvQ2xpZW50OjpJc0xlQXVkaW9DbGllbnRSdW5uaW5nKCkgeyByZXR1cm4gZmFsc2U7IH0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9jbGllbnRfcGFyc2VyLmNjIGIvYnRhL2xlX2F1ZGlvL2NsaWVudF9wYXJzZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDJlMDUuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL2NsaWVudF9wYXJzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqICBUaGlzIG1vZHVsZSBjb250YWlucyBBUEkgb2YgdGhlIGF1ZGlvIHN0cmVhbSBjb250cm9sIHByb3RvY29sLgotICovCi0KLSNpbmNsdWRlICJjbGllbnRfcGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2NvbW1vbl90eXBlcy5oPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxudW1lcmljPgotCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNpbmNsdWRlICJsZV9hdWRpb190eXBlcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotCi11c2luZyBsZV9hdWRpbzo6dHlwZXM6OmFjc19hY19yZWNvcmQ7Ci0KLW5hbWVzcGFjZSBsZV9hdWRpbyB7Ci1uYW1lc3BhY2UgY2xpZW50X3BhcnNlciB7Ci1uYW1lc3BhY2UgYXNjcyB7Ci1zdGF0aWMgc3RkOjptYXA8dWludDhfdCwgc3RkOjpzdHJpbmc+IGFzZV9zdGF0ZV9tYXBfc3RyaW5nID0gewotICAgIHtrQXNlU3RhdGVJZGxlLCAiSWRsZSJ9LAotICAgIHtrQXNlU3RhdGVDb2RlY0NvbmZpZ3VyZWQsICJDb2RlYyBDb25maWd1cmVkIn0sCi0gICAge2tBc2VTdGF0ZVFvc0NvbmZpZ3VyZWQsICJRb1MgQ29uZmlndXJlZCJ9LAotICAgIHtrQXNlU3RhdGVFbmFibGluZywgIkVuYWJsaW5nIn0sCi0gICAge2tBc2VTdGF0ZVN0cmVhbWluZywgIlN0cmVhbWluZyJ9LAotICAgIHtrQXNlU3RhdGVEaXNhYmxpbmcsICJEaXNhYmxpbmcifSwKLSAgICB7a0FzZVN0YXRlUmVsZWFzaW5nLCAiUmVsZWFzaW5nIn0sCi19OwotCi1zdGF0aWMgc3RkOjptYXA8dWludDhfdCwgc3RkOjpzdHJpbmc+IGN0cF9vcGNvZGVfbWFwX3N0cmluZyA9IHsKLSAgICB7a0N0cE9wY29kZUNvZGVjQ29uZmlndXJhdGlvbiwgIkNvbmZpZyBDb2RlYyJ9LAotICAgIHtrQ3RwT3Bjb2RlUW9zQ29uZmlndXJhdGlvbiwgIkNvbmZpZyBRb1MifSwKLSAgICB7a0N0cE9wY29kZUVuYWJsZSwgIkVuYWJsZSJ9LAotICAgIHtrQ3RwT3Bjb2RlUmVjZWl2ZXJTdGFydFJlYWR5LCAiUmVjZWl2ZXIgU3RhcnQgUmVhZHkifSwKLSAgICB7a0N0cE9wY29kZURpc2FibGUsICJEaXNhYmxlIn0sCi0gICAge2tDdHBPcGNvZGVSZWNlaXZlclN0b3BSZWFkeSwgIlJlY2VpdmVyIFN0b3AgUmVhZHkifSwKLSAgICB7a0N0cE9wY29kZVVwZGF0ZU1ldGFkYXRhLCAiVXBkYXRlIE1ldGFkYXRhIn0sCi0gICAge2tDdHBPcGNvZGVSZWxlYXNlLCAiUmVsZWFzZSJ9LAotfTsKLQotc3RhdGljIHN0ZDo6bWFwPHVpbnQ4X3QsIHN0ZDo6c3RyaW5nPiBjdHBfcmVhc29uX21hcF9zdHJpbmcgPSB7Ci0gICAge2tDdHBSZXNwb25zZU5vUmVhc29uLCAiIn0sCi0gICAge2tDdHBSZXNwb25zZUNvZGVjSWQsICJDb2RlYyBJRCJ9LAotICAgIHtrQ3RwUmVzcG9uc2VDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbiwgIkNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24ifSwKLSAgICB7a0N0cFJlc3BvbnNlU2R1SW50ZXJ2YWwsICJTRFUgaW50ZXJ2YWwifSwKLSAgICB7a0N0cFJlc3BvbnNlRnJhbWluZywgIkZyYW1pbmcifSwKLSAgICB7a0N0cFJlc3BvbnNlUGh5LCAiUEhZIn0sCi0gICAge2tDdHBSZXNwb25zZU1heGltdW1TZHVTaXplLCAiTWF4aW11bSBTRFUgc2l6ZSJ9LAotICAgIHtrQ3RwUmVzcG9uc2VSZXRyYW5zbWlzc2lvbk51bWJlciwgIlJldHJhbnNtaXNzaW9uIG51bWJlciJ9LAotICAgIHtrQ3RwUmVzcG9uc2VNYXhUcmFuc3BvcnRMYXRlbmN5LCAiTWF4IFRyYW5zcG9ydCBsYXRlbmN5In0sCi0gICAge2tDdHBSZXNwb25zZVByZXNlbnRhdGlvbkRlbGF5LCAiUHJlc2VudGF0aW9uIGRlbGF5In0sCi0gICAge2tDdHBSZXNwb25zZUludmFsaWRBc2VDaXNNYXBwaW5nLCAiSW52YWxpZCBBU0UgQ0lTIG1hcHBpbmcifSwKLX07Ci0KLXN0YXRpYyBzdGQ6Om1hcDx1aW50OF90LCBzdGQ6OnN0cmluZz4gY3RwX3Jlc3BvbnNlX2NvZGVfbWFwX3N0cmluZyA9IHsKLSAgICB7a0N0cFJlc3BvbnNlQ29kZVN1Y2Nlc3MsICJTdWNjZXNzIn0sCi0gICAge2tDdHBSZXNwb25zZUNvZGVVbnN1cHBvcnRlZE9wY29kZSwgIlVuc3VwcG9ydGVkIE9wY29kZSJ9LAotICAgIHtrQ3RwUmVzcG9uc2VDb2RlSW52YWxpZExlbmd0aCwgIkludmFsaWQgTGVuZ3RoIn0sCi0gICAge2tDdHBSZXNwb25zZUNvZGVJbnZhbGlkQXNlSWQsICJJbnZhbGlkIEFTRSBJRCJ9LAotICAgIHtrQ3RwUmVzcG9uc2VDb2RlSW52YWxpZEFzZVN0YXRlTWFjaGluZVRyYW5zaXRpb24sCi0gICAgICJJbnZhbGlkIEFTRSBTdGF0ZSBNYWNoaW5lIFRyYW5zaXRpb24ifSwKLSAgICB7a0N0cFJlc3BvbnNlQ29kZUludmFsaWRBc2VEaXJlY3Rpb24sICJJbnZhbGlkIEFTRSBEaXJlY3Rpb24ifSwKLSAgICB7a0N0cFJlc3BvbnNlQ29kZVVuc3VwcG9ydGVkQXVkaW9DYXBhYmlsaXRpZXMsCi0gICAgICJVbnN1cHBvcnRlZCBBdWRpbyBDYXBhYmlsaXRpZXMifSwKLSAgICB7a0N0cFJlc3BvbnNlQ29kZVVuc3VwcG9ydGVkQ29uZmlndXJhdGlvblBhcmFtZXRlclZhbHVlLAotICAgICAiVW5zdXBwb3J0ZWQgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgVmFsdWUifSwKLSAgICB7a0N0cFJlc3BvbnNlQ29kZVJlamVjdGVkQ29uZmlndXJhdGlvblBhcmFtZXRlclZhbHVlLAotICAgICAiUmVqZWN0ZWQgQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIgVmFsdWUifSwKLSAgICB7a0N0cFJlc3BvbnNlQ29kZUludmFsaWRDb25maWd1cmF0aW9uUGFyYW1ldGVyVmFsdWUsCi0gICAgICJJbnZhbGlkIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIFZhbHVlIn0sCi0gICAge2tDdHBSZXNwb25zZUNvZGVVbnN1cHBvcnRlZE1ldGFkYXRhLCAiVW5zdXBwb3J0ZWQgTWV0YWRhdGEifSwKLSAgICB7a0N0cFJlc3BvbnNlQ29kZVJlamVjdGVkTWV0YWRhdGEsICJSZWplY3RlZCBNZXRhZGF0YSJ9LAotICAgIHtrQ3RwUmVzcG9uc2VDb2RlSW52YWxpZE1ldGFkYXRhLCAiSW52YWxpZCBNZXRhZGF0YSJ9LAotICAgIHtrQ3RwUmVzcG9uc2VDb2RlSW5zdWZmaWNpZW50UmVzb3VyY2VzLCAiSW5zdWZmaWNpZW50IFJlc291cmNlcyJ9LAotICAgIHtrQ3RwUmVzcG9uc2VDb2RlVW5zcGVjaWZpZWRFcnJvciwgIlVuc3BlY2lmaWVkIEVycm9yIn0sCi19OwotCi1ib29sIFBhcnNlQXNlU3RhdHVzSGVhZGVyKGFzZV9yc3BfaGRyJiBhcmgsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUpIHsKLSAgaWYgKGxlbiA8IGtBc2VSc3BIZHJNaW5MZW4pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiLCB3cm9uZyBsZW4gb2YgQVNFIGNoYXIgKGhlYWRlcik6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihsZW4pOwotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KGFyaC5pZCwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDgoYXJoLnN0YXRlLCB2YWx1ZSk7Ci0KLSAgTE9HKElORk8pIDw8ICJBU0Ugc3RhdHVzOiAiCi0gICAgICAgICAgICA8PCAiXHRBU0UgaWQ6ICIgPDwgbG9naGV4KGFyaC5pZCkKLSAgICAgICAgICAgIDw8ICJcdEFTRSBzdGF0ZTogIiA8PCBhc2Vfc3RhdGVfbWFwX3N0cmluZ1thcmguc3RhdGVdIDw8ICIgKCIKLSAgICAgICAgICAgIDw8IGxvZ2hleChhcmguc3RhdGUpIDw8ICIpIjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZUFzZVN0YXR1c0NvZGVjQ29uZmlndXJlZFN0YXRlUGFyYW1zKAotICAgIHN0cnVjdCBhc2VfY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMmIHJzcCwgdWludDE2X3QgbGVuLAotICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKSB7Ci0gIHVpbnQ4X3QgY29kZWNfc3BlY19jb25mX2xlbjsKLQotICBpZiAobGVuIDwga0FzZVN0YXR1c0NvZGVjQ29uZk1pbkxlbikgewotICAgIExPRyhFUlJPUikgPDwgIldyb25nIGxlbiBvZiBjb2RlYyBjb25mIHN0YXR1cyAoQ29kZWMgY29uZiBoZWFkZXIpIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDgocnNwLmZyYW1pbmcsIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJzcC5wcmVmZXJyZWRfcGh5LCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UOChyc3AucHJlZmVycmVkX3JldHJhbnNfbmIsIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihyc3AubWF4X3RyYW5zcG9ydF9sYXRlbmN5LCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UMjQocnNwLnByZXNfZGVsYXlfbWluLCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UMjQocnNwLnByZXNfZGVsYXlfbWF4LCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UMjQocnNwLnByZWZlcnJlZF9wcmVzX2RlbGF5X21pbiwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDI0KHJzcC5wcmVmZXJyZWRfcHJlc19kZWxheV9tYXgsIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJzcC5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UMTYocnNwLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkLCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UMTYocnNwLmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDgoY29kZWNfc3BlY19jb25mX2xlbiwgdmFsdWUpOwotCi0gIGxlbiAtPSBrQXNlU3RhdHVzQ29kZWNDb25mTWluTGVuOwotCi0gIGlmIChsZW4gIT0gY29kZWNfc3BlY19jb25mX2xlbikgewotICAgIExPRyhFUlJPUikgPDwgIldyb25nIGxlbiBvZiBjb2RlYyBjb25mIHN0YXR1cyAoQ29kZWMgc3BlYyBjb25mKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChjb2RlY19zcGVjX2NvbmZfbGVuKQotICAgIHJzcC5jb2RlY19zcGVjX2NvbmYgPQotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pih2YWx1ZSwgdmFsdWUgKyBjb2RlY19zcGVjX2NvbmZfbGVuKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgQ29kZWMgY29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIDw8ICJcblx0RnJhbWluZzogIiA8PCBsb2doZXgocnNwLmZyYW1pbmcpCi0gICAgICAgICAgICA8PCAiXG5cdFByZWZlcnJlZCBQSFk6ICIgPDwgbG9naGV4KHJzcC5wcmVmZXJyZWRfcGh5KQotICAgICAgICAgICAgPDwgIlxuXHRQcmVmZXJyZWQgcmV0cmFuc21pc3Npb24gbnVtYmVyOiAiCi0gICAgICAgICAgICA8PCBsb2doZXgocnNwLnByZWZlcnJlZF9yZXRyYW5zX25iKSA8PCAiXG5cdE1heCB0cmFuc3BvcnQgbGF0ZW5jeTogIgotICAgICAgICAgICAgPDwgbG9naGV4KHJzcC5tYXhfdHJhbnNwb3J0X2xhdGVuY3kpCi0gICAgICAgICAgICA8PCAiXG5cdFByZXNlbmNlIGRlbGF5IG1pbjogIiA8PCBsb2doZXgocnNwLnByZXNfZGVsYXlfbWluKQotICAgICAgICAgICAgPDwgIlxuXHRQcmVzZW5jZSBkZWxheSBtYXg6ICIgPDwgbG9naGV4KHJzcC5wcmVzX2RlbGF5X21heCkKLSAgICAgICAgICAgIDw8ICJcblx0UHJlZmVycmVkUHJlc2VudGF0aW9uRGVsYXlNaW46ICIKLSAgICAgICAgICAgIDw8IGxvZ2hleChyc3AucHJlZmVycmVkX3ByZXNfZGVsYXlfbWluKQotICAgICAgICAgICAgPDwgIlxuXHRQcmVmZXJyZWRQcmVzZW50YXRpb25EZWxheU1heDogIgotICAgICAgICAgICAgPDwgbG9naGV4KHJzcC5wcmVmZXJyZWRfcHJlc19kZWxheV9tYXgpCi0gICAgICAgICAgICA8PCAiXG5cdENvZGluZyBmb3JtYXQ6ICIgPDwgbG9naGV4KHJzcC5jb2RlY19pZC5jb2RpbmdfZm9ybWF0KQotICAgICAgICAgICAgPDwgIlxuXHRWZW5kb3IgY29kZWMgY29tcGFueSBJRDogIgotICAgICAgICAgICAgPDwgbG9naGV4KHJzcC5jb2RlY19pZC52ZW5kb3JfY29tcGFueV9pZCkKLSAgICAgICAgICAgIDw8ICJcblx0VmVuZG9yIGNvZGVjIElEOiAiIDw8IGxvZ2hleChyc3AuY29kZWNfaWQudmVuZG9yX2NvZGVjX2lkKQotICAgICAgICAgICAgPDwgIlxuXHRDb2RlYyBzcGVjaWZpYyBjb25mIGxlbjogIiA8PCAoaW50KWNvZGVjX3NwZWNfY29uZl9sZW4KLSAgICAgICAgICAgIDw8ICJcblx0Q29kZWMgc3BlY2lmaWMgY29uZjogIgotICAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKHJzcC5jb2RlY19zcGVjX2NvbmYuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcC5jb2RlY19zcGVjX2NvbmYuc2l6ZSgpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZUFzZVN0YXR1c1Fvc0NvbmZpZ3VyZWRTdGF0ZVBhcmFtcygKLSAgICBzdHJ1Y3QgYXNlX3Fvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyYgcnNwLCB1aW50MTZfdCBsZW4sCi0gICAgY29uc3QgdWludDhfdCogdmFsdWUpIHsKLSAgaWYgKGxlbiAhPSBrQXNlU3RhdHVzQ29kZWNRb3NDb25mTWluTGVuKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIEFTRSBjaGFyYWN0ZXJpc3RpYyAoUU9TIGNvbmYgaGVhZGVyKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHJzcC5jaWdfaWQsIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJzcC5jaXNfaWQsIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQyNChyc3Auc2R1X2ludGVydmFsLCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UOChyc3AuZnJhbWluZywgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDgocnNwLnBoeSwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDE2KHJzcC5tYXhfc2R1LCB2YWx1ZSk7Ci0gIFNUUkVBTV9UT19VSU5UOChyc3AucmV0cmFuc19uYiwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDE2KHJzcC5tYXhfdHJhbnNwb3J0X2xhdGVuY3ksIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQyNChyc3AucHJlc19kZWxheSwgdmFsdWUpOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBDb2RlYyBRb1MgQ29uZmlndXJlZCIKLSAgICAgICAgICAgIDw8ICJcblx0Q0lHOiAiIDw8IGxvZ2hleChyc3AuY2lnX2lkKQotICAgICAgICAgICAgPDwgIlxuXHRDSVM6ICIgPDwgbG9naGV4KHJzcC5jaXNfaWQpCi0gICAgICAgICAgICA8PCAiXG5cdFNEVSBpbnRlcnZhbDogIiA8PCBsb2doZXgocnNwLnNkdV9pbnRlcnZhbCkKLSAgICAgICAgICAgIDw8ICJcblx0RnJhbWluZzogIiA8PCBsb2doZXgocnNwLmZyYW1pbmcpCi0gICAgICAgICAgICA8PCAiXG5cdFBIWTogIiA8PCBsb2doZXgocnNwLnBoeSkKLSAgICAgICAgICAgIDw8ICJcblx0TWF4IFNEVTogIiA8PCBsb2doZXgocnNwLm1heF9zZHUpCi0gICAgICAgICAgICA8PCAiXG5cdFJldHJhbnNtaXNzaW9uIG51bWJlcjogIiA8PCBsb2doZXgocnNwLnJldHJhbnNfbmIpCi0gICAgICAgICAgICA8PCAiXG5cdE1heCB0cmFuc3BvcnQgbGF0ZW5jeTogIgotICAgICAgICAgICAgPDwgbG9naGV4KHJzcC5tYXhfdHJhbnNwb3J0X2xhdGVuY3kpCi0gICAgICAgICAgICA8PCAiXG5cdFByZXNlbnRhdGlvbiBkZWxheTogIiA8PCBsb2doZXgocnNwLnByZXNfZGVsYXkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlQXNlU3RhdHVzVHJhbnNpZW50U3RhdGVQYXJhbXMoc3RydWN0IGFzZV90cmFuc2llbnRfc3RhdGVfcGFyYW1zJiByc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgewotICB1aW50OF90IG1ldGFkYXRhX2xlbjsKLQotICBpZiAobGVuIDwga0FzZVN0YXR1c1RyYW5zTWluTGVuKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIEFTRSBjaGFyYWN0ZXJpc3RpYyAobWV0YWRhdGEpIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDgocnNwLmNpZ19pZCwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDgocnNwLmNpc19pZCwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDgobWV0YWRhdGFfbGVuLCB2YWx1ZSk7Ci0gIGxlbiAtPSBrQXNlU3RhdHVzVHJhbnNNaW5MZW47Ci0KLSAgaWYgKGxlbiAhPSBtZXRhZGF0YV9sZW4pIHsKLSAgICBMT0coRVJST1IpIDw8ICJXcm9uZyBsZW4gb2YgQVNFIGNoYXJhY3RlcmlzdGljIChtZXRhZGF0YSkiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChtZXRhZGF0YV9sZW4gPiAwKQotICAgIHJzcC5tZXRhZGF0YSA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHZhbHVlLCB2YWx1ZSArIG1ldGFkYXRhX2xlbik7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIFN0YXR1cyBlbmFibGluZy9zdHJlYW1pbmcvZGlzYWJsaW5nIgotICAgICAgICAgICAgPDwgIlxuXHRDSUc6ICIgPDwgbG9naGV4KHJzcC5jaWdfaWQpCi0gICAgICAgICAgICA8PCAiXG5cdENJUzogIiA8PCBsb2doZXgocnNwLmNpc19pZCkgPDwgIlxuXHRNZXRhZGF0YTogIgotICAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKHJzcC5tZXRhZGF0YS5kYXRhKCksIHJzcC5tZXRhZGF0YS5zaXplKCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlQXNlQ3RwTm90aWZpY2F0aW9uKHN0cnVjdCBjdHBfbnRmJiBudGYsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUpIHsKLSAgdWludDhfdCBudW1fZW50cmllczsKLQotICBpZiAobGVuIDwga0N0cE50Zk1pbkxlbikgewotICAgIExPRyhFUlJPUikgPDwgIldyb25nIGxlbiBvZiBBU0UgY29udHJvbCBwb2ludCBub3RpZmljYXRpb246ICIgPDwgKGludClsZW47Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KG50Zi5vcCwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDgobnVtX2VudHJpZXMsIHZhbHVlKTsKLQotICBpZiAobGVuICE9IGtDdHBOdGZNaW5MZW4gKyAobnVtX2VudHJpZXMgKiBrQ3RwQXNlRW50cnlNaW5MZW4pKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIEFTRSBjb250cm9sIHBvaW50IG5vdGlmaWNhdGlvbiAoQVNFIElEcykiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgewotICAgIHN0cnVjdCBjdHBfYXNlX2VudHJ5IGVudHJ5OwotCi0gICAgU1RSRUFNX1RPX1VJTlQ4KGVudHJ5LmFzZV9pZCwgdmFsdWUpOwotICAgIFNUUkVBTV9UT19VSU5UOChlbnRyeS5yZXNwb25zZV9jb2RlLCB2YWx1ZSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGVudHJ5LnJlYXNvbiwgdmFsdWUpOwotCi0gICAgbnRmLmVudHJpZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShlbnRyeSkpOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIENvbnRyb2wgcG9pbnQgbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgPDwgIlxuXHRPcGNvZGU6ICIgPDwgY3RwX29wY29kZV9tYXBfc3RyaW5nW250Zi5vcF0gPDwgIiAoIgotICAgICAgICAgICAgPDwgbG9naGV4KG50Zi5vcCkgPDwgIikiCi0gICAgICAgICAgICA8PCAiXG5cdE51bSBBU0UgSURzOiAiIDw8IChpbnQpbnVtX2VudHJpZXM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykKLSAgICBMT0coSU5GTykgPDwgIlxuXHRBU0UgSURbIiA8PCBsb2doZXgobnRmLmVudHJpZXNbaV0uYXNlX2lkKQotICAgICAgICAgICAgICA8PCAiXSByZXNwb25zZTogIgotICAgICAgICAgICAgICA8PCBjdHBfcmVzcG9uc2VfY29kZV9tYXBfc3RyaW5nW250Zi5lbnRyaWVzW2ldLnJlc3BvbnNlX2NvZGVdCi0gICAgICAgICAgICAgIDw8ICIgKCIgPDwgbG9naGV4KG50Zi5lbnRyaWVzW2ldLnJlc3BvbnNlX2NvZGUpIDw8ICIpIgotICAgICAgICAgICAgICA8PCAiIHJlYXNvbjogIiA8PCBjdHBfcmVhc29uX21hcF9zdHJpbmdbbnRmLmVudHJpZXNbaV0ucmVhc29uXQotICAgICAgICAgICAgICA8PCAiICgiIDw8IGxvZ2hleChudGYuZW50cmllc1tpXS5yZWFzb24pIDw8ICIpIjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQcmVwYXJlQXNlQ3RwQ29kZWNDb25maWcoY29uc3Qgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9jb2RlY19jb25mPiYgY29uZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgaWYgKGNvbmZzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjpzdHJpbmcgY29uZl9lbnRzX3N0cjsKLSAgc2l6ZV90IG1zZ19sZW4gPSBzdGQ6OmFjY3VtdWxhdGUoCi0gICAgICBjb25mcy5iZWdpbigpLCBjb25mcy5lbmQoKSwKLSAgICAgIGNvbmZzLnNpemUoKSAqIGtDdHBDb2RlY0NvbmZNaW5MZW4gKyBrQXNlTnVtU2l6ZSArIGtDdHBPcFNpemUsCi0gICAgICBbJmNvbmZfZW50c19zdHJdKHNpemVfdCBjdXJfbGVuLCBhdXRvIGNvbnN0JiBjb25mKSB7Ci0gICAgICAgIGF1dG8gbHR2X21hcCA9IGNvbmYuY29kZWNfY29uZmlnLkdldEFzTHR2TWFwKCk7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgW3R5cGUsIHZhbHVlXSA6IGx0dl9tYXAuVmFsdWVzKCkpIHsKLSAgICAgICAgICBjb25mX2VudHNfc3RyICs9Ci0gICAgICAgICAgICAgICJcdHR5cGU6ICIgKyBzdGQ6OnRvX3N0cmluZyh0eXBlKSArCi0gICAgICAgICAgICAgICJcdGxlbjogIiArIHN0ZDo6dG9fc3RyaW5nKHZhbHVlLnNpemUoKSkgKwotICAgICAgICAgICAgICAiXHRkYXRhOiAiICsgYmFzZTo6SGV4RW5jb2RlKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKSArICJcbiI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgcmV0dXJuIGN1cl9sZW4gKyBsdHZfbWFwLlJhd1BhY2tldFNpemUoKTsKLSAgICAgIH0pOwotICB2YWx1ZS5yZXNpemUobXNnX2xlbik7Ci0KLSAgdWludDhfdCogbXNnID0gdmFsdWUuZGF0YSgpOwotICBVSU5UOF9UT19TVFJFQU0obXNnLCBrQ3RwT3Bjb2RlQ29kZWNDb25maWd1cmF0aW9uKTsKLQotICBVSU5UOF9UT19TVFJFQU0obXNnLCBjb25mcy5zaXplKCkpOwotICBmb3IgKGNvbnN0IHN0cnVjdCBjdHBfY29kZWNfY29uZiYgY29uZiA6IGNvbmZzKSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5hc2VfaWQpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShtc2csIGNvbmYudGFyZ2V0X2xhdGVuY3kpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShtc2csIGNvbmYudGFyZ2V0X3BoeSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5jb2RlY19pZC5jb2RpbmdfZm9ybWF0KTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKG1zZywgY29uZi5jb2RlY19pZC52ZW5kb3JfY29tcGFueV9pZCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShtc2csIGNvbmYuY29kZWNfaWQudmVuZG9yX2NvZGVjX2lkKTsKLQotICAgIGF1dG8gbHR2X21hcCA9IGNvbmYuY29kZWNfY29uZmlnLkdldEFzTHR2TWFwKCk7Ci0gICAgYXV0byBjb2RlY19zcGVjX2NvbmZfbGVuID0gbHR2X21hcC5SYXdQYWNrZXRTaXplKCk7Ci0KLSAgICBVSU5UOF9UT19TVFJFQU0obXNnLCBjb2RlY19zcGVjX2NvbmZfbGVuKTsKLSAgICBtc2cgPSBsdHZfbWFwLlJhd1BhY2tldChtc2cpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIENvZGVjIGNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgIDw8ICJcblx0QXNlIGlkOiAiIDw8IGxvZ2hleChjb25mLmFzZV9pZCkKLSAgICAgICAgICAgICAgPDwgIlxuXHRUYXJnZXQgbGF0ZW5jeTogIiA8PCBsb2doZXgoY29uZi50YXJnZXRfbGF0ZW5jeSkKLSAgICAgICAgICAgICAgPDwgIlxuXHRUYXJnZXQgUEhZOiAiIDw8IGxvZ2hleChjb25mLnRhcmdldF9waHkpCi0gICAgICAgICAgICAgIDw8ICJcblx0Q29kaW5nIGZvcm1hdDogIiA8PCBsb2doZXgoY29uZi5jb2RlY19pZC5jb2RpbmdfZm9ybWF0KQotICAgICAgICAgICAgICA8PCAiXG5cdFZlbmRvciBjb2RlYyBjb21wYW55IElEOiAiCi0gICAgICAgICAgICAgIDw8IGxvZ2hleChjb25mLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkKQotICAgICAgICAgICAgICA8PCAiXG5cdFZlbmRvciBjb2RlYyBJRDogIgotICAgICAgICAgICAgICA8PCBsb2doZXgoY29uZi5jb2RlY19pZC52ZW5kb3JfY29kZWNfaWQpCi0gICAgICAgICAgICAgIDw8ICJcblx0Q29kZWMgY29uZmlnIGxlbjogIgotICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGNvZGVjX3NwZWNfY29uZl9sZW4pCi0gICAgICAgICAgICAgIDw8ICJcblx0Q29kZWMgc3BlYyBjb25mOiAiCi0gICAgICAgICAgICAgIDw8ICJcbiIKLSAgICAgICAgICAgICAgPDwgY29uZl9lbnRzX3N0cjsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFByZXBhcmVBc2VDdHBDb25maWdRb3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9xb3NfY29uZj4mIGNvbmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgewotICBpZiAoY29uZnMuc2l6ZSgpID09IDApIHJldHVybiBmYWxzZTsKLSAgdmFsdWUucmVzaXplKGNvbmZzLnNpemUoKSAqIGtDdHBRb3NDb25mTWluTGVuICsga0FzZU51bVNpemUgKyBrQ3RwT3BTaXplKTsKLQotICB1aW50OF90KiBtc2cgPSB2YWx1ZS5kYXRhKCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShtc2csIGtDdHBPcGNvZGVRb3NDb25maWd1cmF0aW9uKTsKLSAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZnMuc2l6ZSgpKTsKLQotICBmb3IgKGNvbnN0IHN0cnVjdCBjdHBfcW9zX2NvbmYmIGNvbmYgOiBjb25mcykgewotICAgIFVJTlQ4X1RPX1NUUkVBTShtc2csIGNvbmYuYXNlX2lkKTsKLSAgICBVSU5UOF9UT19TVFJFQU0obXNnLCBjb25mLmNpZyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5jaXMpOwotICAgIFVJTlQyNF9UT19TVFJFQU0obXNnLCBjb25mLnNkdV9pbnRlcnZhbCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5mcmFtaW5nKTsKLSAgICBVSU5UOF9UT19TVFJFQU0obXNnLCBjb25mLnBoeSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShtc2csIGNvbmYubWF4X3NkdSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5yZXRyYW5zX25iKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKG1zZywgY29uZi5tYXhfdHJhbnNwb3J0X2xhdGVuY3kpOwotICAgIFVJTlQyNF9UT19TVFJFQU0obXNnLCBjb25mLnByZXNfZGVsYXkpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIFFvUyBjb25maWd1cmF0aW9uIgotICAgICAgICAgICAgICA8PCAiXG5cdEFzZSBpZDogIiA8PCBsb2doZXgoY29uZi5hc2VfaWQpCi0gICAgICAgICAgICAgIDw8ICJcblx0Y2lnOiAiIDw8IGxvZ2hleChjb25mLmNpZykKLSAgICAgICAgICAgICAgPDwgIlxuXHRDaXM6ICIgPDwgbG9naGV4KGNvbmYuY2lzKQotICAgICAgICAgICAgICA8PCAiXG5cdFNEVSBpbnRlcnZhbDogIiA8PCBsb2doZXgoY29uZi5zZHVfaW50ZXJ2YWwpCi0gICAgICAgICAgICAgIDw8ICJcblx0RnJhbWluZzogIiA8PCBsb2doZXgoY29uZi5mcmFtaW5nKQotICAgICAgICAgICAgICA8PCAiXG5cdFBoeTogIiA8PCBsb2doZXgoY29uZi5waHkpCi0gICAgICAgICAgICAgIDw8ICJcblx0TWF4IHNkdSBzaXplOiAiIDw8IGxvZ2hleChjb25mLm1heF9zZHUpCi0gICAgICAgICAgICAgIDw8ICJcblx0UmV0cmFucyBuYjogIiA8PCBsb2doZXgoY29uZi5yZXRyYW5zX25iKQotICAgICAgICAgICAgICA8PCAiXG5cdE1heCBUcmFuc3BvcnQgbGF0ZW5jeTogIgotICAgICAgICAgICAgICA8PCBsb2doZXgoY29uZi5tYXhfdHJhbnNwb3J0X2xhdGVuY3kpCi0gICAgICAgICAgICAgIDw8ICJcblx0UHJlcyBkZWxheTogIiA8PCBsb2doZXgoY29uZi5wcmVzX2RlbGF5KTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFByZXBhcmVBc2VDdHBFbmFibGUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9lbmFibGU+JiBjb25mcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgaWYgKGNvbmZzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgdWludDE2X3QgbXNnX2xlbiA9IGNvbmZzLnNpemUoKSAqIGtDdHBFbmFibGVNaW5MZW4gKyBrQXNlTnVtU2l6ZSArIGtDdHBPcFNpemU7Ci0gIHN0ZDo6Zm9yX2VhY2goY29uZnMuYmVnaW4oKSwgY29uZnMuZW5kKCksCi0gICAgICAgICAgICAgICAgWyZtc2dfbGVuXShjb25zdCBzdHJ1Y3QgY3RwX2VuYWJsZSYgY29uZikgewotICAgICAgICAgICAgICAgICAgbXNnX2xlbiArPSBjb25mLm1ldGFkYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgdmFsdWUucmVzaXplKG1zZ19sZW4pOwotCi0gIHVpbnQ4X3QqIG1zZyA9IHZhbHVlLmRhdGEoKTsKLSAgVUlOVDhfVE9fU1RSRUFNKG1zZywga0N0cE9wY29kZUVuYWJsZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShtc2csIGNvbmZzLnNpemUoKSk7Ci0KLSAgZm9yIChjb25zdCBzdHJ1Y3QgY3RwX2VuYWJsZSYgY29uZiA6IGNvbmZzKSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5hc2VfaWQpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShtc2csIGNvbmYubWV0YWRhdGEuc2l6ZSgpKTsKLSAgICBBUlJBWV9UT19TVFJFQU0obXNnLCBjb25mLm1ldGFkYXRhLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihjb25mLm1ldGFkYXRhLnNpemUoKSkpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIEVuYWJsZSIKLSAgICAgICAgICAgICAgPDwgIlxuXHRBc2UgaWQ6ICIgPDwgbG9naGV4KGNvbmYuYXNlX2lkKSA8PCAiXG5cdE1ldGFkYXRhOiAiCi0gICAgICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZShjb25mLm1ldGFkYXRhLmRhdGEoKSwgY29uZi5tZXRhZGF0YS5zaXplKCkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdGFydFJlYWR5KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBhc2VfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gIGlmIChhc2VfaWRzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gIHZhbHVlLnJlc2l6ZShhc2VfaWRzLnNpemUoKSAqIGtBc2VJZFNpemUgKyBrQXNlTnVtU2l6ZSArIGtDdHBPcFNpemUpOwotCi0gIHVpbnQ4X3QqIG1zZyA9IHZhbHVlLmRhdGEoKTsKLSAgVUlOVDhfVE9fU1RSRUFNKG1zZywga0N0cE9wY29kZVJlY2VpdmVyU3RhcnRSZWFkeSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShtc2csIGFzZV9pZHMuc2l6ZSgpKTsKLQotICBmb3IgKGNvbnN0IHVpbnQ4X3QmIGlkIDogYXNlX2lkcykgewotICAgIFVJTlQ4X1RPX1NUUkVBTShtc2csIGlkKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBSZWNlaXZlclN0YXJ0UmVhZHkiCi0gICAgICAgICAgICAgIDw8ICJcblx0QXNlIGlkOiAiIDw8IGxvZ2hleChpZCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQcmVwYXJlQXNlQ3RwRGlzYWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYXNlX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gIGlmIChhc2VfaWRzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gIHZhbHVlLnJlc2l6ZShhc2VfaWRzLnNpemUoKSAqIGtBc2VJZFNpemUgKyBrQXNlTnVtU2l6ZSArIGtDdHBPcFNpemUpOwotCi0gIHVpbnQ4X3QqIG1zZyA9IHZhbHVlLmRhdGEoKTsKLSAgVUlOVDhfVE9fU1RSRUFNKG1zZywga0N0cE9wY29kZURpc2FibGUpOwotICBVSU5UOF9UT19TVFJFQU0obXNnLCBhc2VfaWRzLnNpemUoKSk7Ci0KLSAgZm9yIChjb25zdCB1aW50OF90JiBpZCA6IGFzZV9pZHMpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0obXNnLCBpZCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgRGlzYWJsZSIKLSAgICAgICAgICAgICAgPDwgIlxuXHRBc2UgaWQ6ICIgPDwgbG9naGV4KGlkKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFByZXBhcmVBc2VDdHBBdWRpb1JlY2VpdmVyU3RvcFJlYWR5KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBhc2VfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgaWYgKGFzZV9pZHMuc2l6ZSgpID09IDApIHJldHVybiBmYWxzZTsKLSAgdmFsdWUucmVzaXplKGFzZV9pZHMuc2l6ZSgpICoga0FzZUlkU2l6ZSArIGtBc2VOdW1TaXplICsga0N0cE9wU2l6ZSk7Ci0KLSAgdWludDhfdCogbXNnID0gdmFsdWUuZGF0YSgpOwotICBVSU5UOF9UT19TVFJFQU0obXNnLCBrQ3RwT3Bjb2RlUmVjZWl2ZXJTdG9wUmVhZHkpOwotICBVSU5UOF9UT19TVFJFQU0obXNnLCBhc2VfaWRzLnNpemUoKSk7Ci0KLSAgZm9yIChjb25zdCB1aW50OF90JiBhc2VfaWQgOiBhc2VfaWRzKSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgYXNlX2lkKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBSZWNlaXZlclN0b3BSZWFkeSIKLSAgICAgICAgICAgICAgPDwgIlxuXHRBc2UgaWQ6ICIgPDwgbG9naGV4KGFzZV9pZCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQcmVwYXJlQXNlQ3RwVXBkYXRlTWV0YWRhdGEoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF91cGRhdGVfbWV0YWRhdGE+JiBjb25mcywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgaWYgKGNvbmZzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgdWludDE2X3QgbXNnX2xlbiA9Ci0gICAgICBjb25mcy5zaXplKCkgKiBrQ3RwVXBkYXRlTWV0YWRhdGFNaW5MZW4gKyBrQXNlTnVtU2l6ZSArIGtDdHBPcFNpemU7Ci0gIHN0ZDo6Zm9yX2VhY2goY29uZnMuYmVnaW4oKSwgY29uZnMuZW5kKCksCi0gICAgICAgICAgICAgICAgWyZtc2dfbGVuXShjb25zdCBzdHJ1Y3QgY3RwX3VwZGF0ZV9tZXRhZGF0YSYgY29uZikgewotICAgICAgICAgICAgICAgICAgbXNnX2xlbiArPSBjb25mLm1ldGFkYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgdmFsdWUucmVzaXplKG1zZ19sZW4pOwotCi0gIHVpbnQ4X3QqIG1zZyA9IHZhbHVlLmRhdGEoKTsKLSAgVUlOVDhfVE9fU1RSRUFNKG1zZywga0N0cE9wY29kZVVwZGF0ZU1ldGFkYXRhKTsKLSAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZnMuc2l6ZSgpKTsKLQotICBmb3IgKGNvbnN0IHN0cnVjdCBjdHBfdXBkYXRlX21ldGFkYXRhJiBjb25mIDogY29uZnMpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0obXNnLCBjb25mLmFzZV9pZCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKG1zZywgY29uZi5tZXRhZGF0YS5zaXplKCkpOwotICAgIEFSUkFZX1RPX1NUUkVBTShtc2csIGNvbmYubWV0YWRhdGEuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNvbmYubWV0YWRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgVXBkYXRlIE1ldGFkYXRhIgotICAgICAgICAgICAgICA8PCAiXG5cdEFzZSBpZDogIiA8PCBsb2doZXgoY29uZi5hc2VfaWQpIDw8ICJcblx0TWV0YWRhdGE6ICIKLSAgICAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKGNvbmYubWV0YWRhdGEuZGF0YSgpLCBjb25mLm1ldGFkYXRhLnNpemUoKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQcmVwYXJlQXNlQ3RwUmVsZWFzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYXNlX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gIGlmIChhc2VfaWRzLnNpemUoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgdmFsdWUucmVzaXplKGFzZV9pZHMuc2l6ZSgpICoga0FzZUlkU2l6ZSArIGtBc2VOdW1TaXplICsga0N0cE9wU2l6ZSk7Ci0KLSAgdWludDhfdCogbXNnID0gdmFsdWUuZGF0YSgpOwotICBVSU5UOF9UT19TVFJFQU0obXNnLCBrQ3RwT3Bjb2RlUmVsZWFzZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShtc2csIGFzZV9pZHMuc2l6ZSgpKTsKLQotICBmb3IgKGNvbnN0IHVpbnQ4X3QmIGFzZV9pZCA6IGFzZV9pZHMpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0obXNnLCBhc2VfaWQpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIFJlbGVhc2UiCi0gICAgICAgICAgICAgIDw8ICJcblx0QXNlIGlkOiAiIDw8IGxvZ2hleChhc2VfaWQpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UgYXNjcwotCi1uYW1lc3BhY2UgcGFjcyB7Ci0KLWJvb2wgUGFyc2VQYWMoc3RkOjp2ZWN0b3I8c3RydWN0IGFjc19hY19yZWNvcmQ+JiBwYWNfcmVjcywgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSkgewotICBpZiAobGVuIDwga0Fjc1BhY0Rpc2NvdmVyUnNwTWluTGVuKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIFBBQyBjaGFyYWN0ZXJpc3RpYyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDhfdCBwYWNfcmVjX25iOwotICBTVFJFQU1fVE9fVUlOVDgocGFjX3JlY19uYiwgdmFsdWUpOwotICBsZW4gLT0ga0Fjc1BhY0Rpc2NvdmVyUnNwTWluTGVuOwotCi0gIHBhY19yZWNzLnJlc2VydmUocGFjX3JlY19uYik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcGFjX3JlY19uYjsgaSsrKSB7Ci0gICAgc3RydWN0IGFjc19hY19yZWNvcmQgcmVjOwotICAgIHVpbnQ4X3QgY29kZWNfc3BlY19jYXBfbGVuLCBtZXRhZGF0YV9sZW47Ci0KLSAgICBpZiAobGVuIDwga0Fjc1BhY1JlY29yZE1pbkxlbikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIFBBQyByZWNvcmQiOwotICAgICAgcGFjX3JlY3MuY2xlYXIoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDgocmVjLmNvZGVjX2lkLmNvZGluZ19mb3JtYXQsIHZhbHVlKTsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KHJlYy5jb2RlY19pZC52ZW5kb3JfY29tcGFueV9pZCwgdmFsdWUpOwotICAgIFNUUkVBTV9UT19VSU5UMTYocmVjLmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCwgdmFsdWUpOwotICAgIFNUUkVBTV9UT19VSU5UOChjb2RlY19zcGVjX2NhcF9sZW4sIHZhbHVlKTsKLSAgICBsZW4gLT0ga0Fjc1BhY1JlY29yZE1pbkxlbiAtIGtBY3NQYWNNZXRhZGF0YUxlbkxlbjsKLQotICAgIGlmIChsZW4gPCBjb2RlY19zcGVjX2NhcF9sZW4gKyBrQWNzUGFjTWV0YWRhdGFMZW5MZW4pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIldyb25nIGxlbiBvZiBQQUMgcmVjb3JkIChjb2RlYyBzcGVjaWZpYyBjYXBhYmlsaXRpZXMpIjsKLSAgICAgIHBhY19yZWNzLmNsZWFyKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBwYXJzZWQ7Ci0gICAgcmVjLmNvZGVjX3NwZWNfY2FwcyA9Ci0gICAgICAgIHR5cGVzOjpMZUF1ZGlvTHR2TWFwOjpQYXJzZSh2YWx1ZSwgY29kZWNfc3BlY19jYXBfbGVuLCBwYXJzZWQpOwotICAgIGlmICghcGFyc2VkKSByZXR1cm4gZmFsc2U7Ci0KLSAgICB2YWx1ZSArPSBjb2RlY19zcGVjX2NhcF9sZW47Ci0gICAgbGVuIC09IGNvZGVjX3NwZWNfY2FwX2xlbjsKLQotICAgIFNUUkVBTV9UT19VSU5UOChtZXRhZGF0YV9sZW4sIHZhbHVlKTsKLSAgICBsZW4gLT0ga0Fjc1BhY01ldGFkYXRhTGVuTGVuOwotCi0gICAgaWYgKGxlbiA8IG1ldGFkYXRhX2xlbikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIFBBQyByZWNvcmQgKG1ldGFkYXRhKSI7Ci0gICAgICBwYWNfcmVjcy5jbGVhcigpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJlYy5tZXRhZGF0YSA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHZhbHVlLCB2YWx1ZSArIG1ldGFkYXRhX2xlbik7Ci0gICAgdmFsdWUgKz0gbWV0YWRhdGFfbGVuOwotICAgIGxlbiAtPSBtZXRhZGF0YV9sZW47Ci0KLSAgICBwYWNfcmVjcy5wdXNoX2JhY2soc3RkOjptb3ZlKHJlYykpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VBdWRpb0xvY2F0aW9ucyh0eXBlczo6QXVkaW9Mb2NhdGlvbnMmIGF1ZGlvX2xvY2F0aW9ucywgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKSB7Ci0gIGlmIChsZW4gIT0ga0F1ZGlvTG9jYXRpb25zUnNwTWluTGVuKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIEF1ZGlvIExvY2F0aW9uIGNoYXJhY3RlcmlzdGljIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDMyKGF1ZGlvX2xvY2F0aW9ucywgdmFsdWUpOwotCi0gIExPRyhJTkZPKSA8PCAiQXVkaW8gbG9jYXRpb25zOiAiIDw8IGF1ZGlvX2xvY2F0aW9ucy50b19zdHJpbmcoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZVN1cHBvcnRlZEF1ZGlvQ29udGV4dHMoc3RydWN0IGFjc19zdXBwb3J0ZWRfYXVkaW9fY29udGV4dHMmIGNvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgewotICBpZiAobGVuICE9IGtBc2VBdWRpb1N1cHBDb250UnNwTWluTGVuKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIEF1ZGlvIFN1cHBvcnRlZCBDb250ZXh0IGNoYXJhY3RlcmlzdGljIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDE2KGNvbnRleHRzLnNua19zdXBwX2NvbnQsIHZhbHVlKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihjb250ZXh0cy5zcmNfc3VwcF9jb250LCB2YWx1ZSk7Ci0KLSAgTE9HKElORk8pIDw8ICJTdXBwb3J0ZWQgQXVkaW8gQ29udGV4dHM6ICIKLSAgICAgICAgICAgIDw8ICJcblx0U3VwcG9ydGVkIFNpbmsgQ29udGV4dHM6ICIKLSAgICAgICAgICAgIDw8IGNvbnRleHRzLnNua19zdXBwX2NvbnQudG9fc3RyaW5nKCkKLSAgICAgICAgICAgIDw8ICJcblx0U3VwcG9ydGVkIFNvdXJjZSBDb250ZXh0czogIgotICAgICAgICAgICAgPDwgY29udGV4dHMuc3JjX3N1cHBfY29udC50b19zdHJpbmcoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZUF2YWlsYWJsZUF1ZGlvQ29udGV4dHMoc3RydWN0IGFjc19hdmFpbGFibGVfYXVkaW9fY29udGV4dHMmIGNvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgewotICBpZiAobGVuICE9IGtBc2VBdWRpb0F2YWlsUnNwTWluTGVuKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiV3JvbmcgbGVuIG9mIEF1ZGlvIEF2YWlsYWJpbGl0eSBjaGFyYWN0ZXJpc3RpYyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQxNihjb250ZXh0cy5zbmtfYXZhaWxfY29udCwgdmFsdWUpOwotICBTVFJFQU1fVE9fVUlOVDE2KGNvbnRleHRzLnNyY19hdmFpbF9jb250LCB2YWx1ZSk7Ci0KLSAgTE9HKElORk8pIDw8ICJBdmFpbGFibGUgQXVkaW8gQ29udGV4dHM6ICIKLSAgICAgICAgICAgIDw8ICJcblx0QXZhaWxhYmxlIFNpbmsgQ29udGV4dHM6ICIKLSAgICAgICAgICAgIDw8IGNvbnRleHRzLnNua19hdmFpbF9jb250LnRvX3N0cmluZygpCi0gICAgICAgICAgICA8PCAiXG5cdEF2YWlsYWJsZSBTb3VyY2UgQ29udGV4dHM6ICIKLSAgICAgICAgICAgIDw8IGNvbnRleHRzLnNyY19hdmFpbF9jb250LnRvX3N0cmluZygpOwotCi0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlIHBhY3MKLQotfSAgLy8gbmFtZXNwYWNlIGNsaWVudF9wYXJzZXIKLX0gIC8vIG5hbWVzcGFjZSBsZV9hdWRpbwpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL2NsaWVudF9wYXJzZXIuaCBiL2J0YS9sZV9hdWRpby9jbGllbnRfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OWY0NTIuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL2NsaWVudF9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBdWRpbyBTdHJlYW0gQ29udHJvbCAoTEVfQVVESU8pIEFQSSBmdW5jdGlvbiBleHRlcm5hbAotICogZGVmaW5pdGlvbnMuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsZV9hdWRpb190eXBlcy5oIgotCi1uYW1lc3BhY2UgbGVfYXVkaW8gewotbmFtZXNwYWNlIGNsaWVudF9wYXJzZXIgewotbmFtZXNwYWNlIGFzY3MgewotLyoKLSAqIEFsbCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIGFyZSBkZXNjcmliZWQgaW4gQXVkaW8gU3RyZWFtIENvbnRyb2wgU2VydmljZQotICogc3BlY2lmaWNhdGlvbgotICovCi0KLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVTdWNjZXNzID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVVbnN1cHBvcnRlZE9wY29kZSA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VDb2RlSW52YWxpZExlbmd0aCA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VDb2RlSW52YWxpZEFzZUlkID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVJbnZhbGlkQXNlU3RhdGVNYWNoaW5lVHJhbnNpdGlvbiA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VDb2RlSW52YWxpZEFzZURpcmVjdGlvbiA9IDB4MDU7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VDb2RlVW5zdXBwb3J0ZWRBdWRpb0NhcGFiaWxpdGllcyA9IDB4MDY7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VDb2RlVW5zdXBwb3J0ZWRDb25maWd1cmF0aW9uUGFyYW1ldGVyVmFsdWUgPSAweDA3OwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlQ29kZVJlamVjdGVkQ29uZmlndXJhdGlvblBhcmFtZXRlclZhbHVlID0gMHgwODsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVJbnZhbGlkQ29uZmlndXJhdGlvblBhcmFtZXRlclZhbHVlID0gMHgwOTsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVVbnN1cHBvcnRlZE1ldGFkYXRhID0gMHgwQTsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVSZWplY3RlZE1ldGFkYXRhID0gMHgwQjsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVJbnZhbGlkTWV0YWRhdGEgPSAweDBDOwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlQ29kZUluc3VmZmljaWVudFJlc291cmNlcyA9IDB4MEQ7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VDb2RlVW5zcGVjaWZpZWRFcnJvciA9IDB4MEU7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZU5vUmVhc29uID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBSZXNwb25zZUNvZGVjSWQgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlQ29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24gPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlU2R1SW50ZXJ2YWwgPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlRnJhbWluZyA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VQaHkgPSAweDA1OwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlTWF4aW11bVNkdVNpemUgPSAweDA2OwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlUmV0cmFuc21pc3Npb25OdW1iZXIgPSAweDA3OwotY29uc3RleHByIHVpbnQ4X3Qga0N0cFJlc3BvbnNlTWF4VHJhbnNwb3J0TGF0ZW5jeSA9IDB4MDg7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VQcmVzZW50YXRpb25EZWxheSA9IDB4MDk7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwUmVzcG9uc2VJbnZhbGlkQXNlQ2lzTWFwcGluZyA9IDB4MEE7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvRXJyb3JDdHBVbnN1cHBvcnRlcmRPcGNvZGUgPSAweEZGOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9FcnJvckN0cFRydW5jYXRlZE9wZXJhdGlvbiA9IDB4RkU7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb0Vycm9yQ3RwQ3RwRXJyID0gMHhGRDsKLQotLyogQVNFIHN0YXRlcyAqLwotY29uc3RleHByIHVpbnQ4X3Qga0FzZVN0YXRlSWRsZSA9IDB4MDA7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlU3RhdGVDb2RlY0NvbmZpZ3VyZWQgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3Qga0FzZVN0YXRlUW9zQ29uZmlndXJlZCA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlU3RhdGVFbmFibGluZyA9IDB4MDM7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlU3RhdGVTdHJlYW1pbmcgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3Qga0FzZVN0YXRlRGlzYWJsaW5nID0gMHgwNTsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VTdGF0ZVJlbGVhc2luZyA9IDB4MDY7Ci0KLS8qIENvbnRyb2wgcG9pbnQgb3Bjb2RlcyAqLwotY29uc3RleHByIHVpbnQ4X3Qga0N0cE9wY29kZUNvZGVjQ29uZmlndXJhdGlvbiA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwT3Bjb2RlUW9zQ29uZmlndXJhdGlvbiA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwT3Bjb2RlRW5hYmxlID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBPcGNvZGVSZWNlaXZlclN0YXJ0UmVhZHkgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3Qga0N0cE9wY29kZURpc2FibGUgPSAweDA1OwotY29uc3RleHByIHVpbnQ4X3Qga0N0cE9wY29kZVJlY2VpdmVyU3RvcFJlYWR5ID0gMHgwNjsKLWNvbnN0ZXhwciB1aW50OF90IGtDdHBPcGNvZGVVcGRhdGVNZXRhZGF0YSA9IDB4MDc7Ci1jb25zdGV4cHIgdWludDhfdCBrQ3RwT3Bjb2RlUmVsZWFzZSA9IDB4MDg7Ci0KLS8qIEFTRSBzdGF0dXMgbWFza3MgKi8KLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0FzZVJzcEhlYWRlck1hc2tDdHJsU3RhdHVzRmFpbHVyZU9wY29kZSA9IDB4MDBGRjAwMDA7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtBc2VSc3BIZWFkZXJNYXNrQ3RybFN0YXR1c0Vycm9yQ29kZSA9IDB4MDAwMEZGMDA7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtBc2VSc3BIZWFkZXJNYXNrQ3RybFN0YXR1c0Vycm9yUmVhc29uID0gMHgwMDAwMDBGRjsKLQotY29uc3RleHByIHVpbnQxNl90IGtBc2VTdGF0dXNDb2RlY0NvbmZNaW5MZW4gPSAyMzsKLXN0cnVjdCBhc2VfY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMgewotICB1aW50OF90IGZyYW1pbmc7Ci0gIHVpbnQ4X3QgcHJlZmVycmVkX3BoeTsKLSAgdWludDhfdCBwcmVmZXJyZWRfcmV0cmFuc19uYjsKLSAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICB1aW50MzJfdCBwcmVzX2RlbGF5X21pbjsKLSAgdWludDMyX3QgcHJlc19kZWxheV9tYXg7Ci0gIHVpbnQzMl90IHByZWZlcnJlZF9wcmVzX2RlbGF5X21pbjsKLSAgdWludDMyX3QgcHJlZmVycmVkX3ByZXNfZGVsYXlfbWF4OwotICB0eXBlczo6TGVBdWRpb0NvZGVjSWQgY29kZWNfaWQ7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvZGVjX3NwZWNfY29uZjsKLX07Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrQXNlU3RhdHVzQ29kZWNRb3NDb25mTWluTGVuID0gMTU7Ci1zdHJ1Y3QgYXNlX3Fvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50OF90IGNpc19pZDsKLSAgdWludDMyX3Qgc2R1X2ludGVydmFsOwotICB1aW50OF90IGZyYW1pbmc7Ci0gIHVpbnQ4X3QgcGh5OwotICB1aW50MTZfdCBtYXhfc2R1OwotICB1aW50OF90IHJldHJhbnNfbmI7Ci0gIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeTsKLSAgdWludDMyX3QgcHJlc19kZWxheTsKLX07Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrQXNlU3RhdHVzVHJhbnNNaW5MZW4gPSAzOwotc3RydWN0IGFzZV90cmFuc2llbnRfc3RhdGVfcGFyYW1zIHsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtZXRhZGF0YTsKLX07Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrQ3RwQXNlRW50cnlNaW5MZW4gPSAzOwotc3RydWN0IGN0cF9hc2VfZW50cnkgewotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCByZXNwb25zZV9jb2RlOwotICB1aW50OF90IHJlYXNvbjsKLX07Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrQ3RwTnRmTWluTGVuID0gMjsKLXN0cnVjdCBjdHBfbnRmIHsKLSAgdWludDhfdCBvcDsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9hc2VfZW50cnk+IGVudHJpZXM7Ci19OwotCi1jb25zdGV4cHIgdWludDE2X3Qga0FzZVJzcEhkck1pbkxlbiA9IDI7Ci1zdHJ1Y3QgYXNlX3JzcF9oZHIgewotICB1aW50OF90IGlkOwotICB1aW50OF90IHN0YXRlOwotfTsKLQotY29uc3RleHByIHVpbnQ4X3Qga0N0cE9wU2l6ZSA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlTnVtU2l6ZSA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlSWRTaXplID0gMTsKLQotY29uc3RleHByIHVpbnQxNl90IGtDdHBDb2RlY0NvbmZNaW5MZW4gPSA5Owotc3RydWN0IGN0cF9jb2RlY19jb25mIHsKLSAgdWludDhfdCBhc2VfaWQ7Ci0gIHVpbnQ4X3QgdGFyZ2V0X2xhdGVuY3k7Ci0gIHVpbnQ4X3QgdGFyZ2V0X3BoeTsKLSAgdHlwZXM6OkxlQXVkaW9Db2RlY0lkIGNvZGVjX2lkOwotICB0eXBlczo6TGVBdWRpb0xjM0NvbmZpZyBjb2RlY19jb25maWc7Ci19OwotCi1jb25zdGV4cHIgdWludDE2X3Qga0N0cFFvc0NvbmZNaW5MZW4gPSAxNjsKLXN0cnVjdCBjdHBfcW9zX2NvbmYgewotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCBjaWc7Ci0gIHVpbnQ4X3QgY2lzOwotICB1aW50MzJfdCBzZHVfaW50ZXJ2YWw7Ci0gIHVpbnQ4X3QgZnJhbWluZzsKLSAgdWludDhfdCBwaHk7Ci0gIHVpbnQxNl90IG1heF9zZHU7Ci0gIHVpbnQ4X3QgcmV0cmFuc19uYjsKLSAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICB1aW50MzJfdCBwcmVzX2RlbGF5OwotfTsKLQotY29uc3RleHByIHVpbnQxNl90IGtDdHBFbmFibGVNaW5MZW4gPSAyOwotc3RydWN0IGN0cF9lbmFibGUgewotICB1aW50OF90IGFzZV9pZDsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWV0YWRhdGE7Ci19OwotCi1jb25zdGV4cHIgdWludDE2X3Qga0N0cFVwZGF0ZU1ldGFkYXRhTWluTGVuID0gMjsKLXN0cnVjdCBjdHBfdXBkYXRlX21ldGFkYXRhIHsKLSAgdWludDhfdCBhc2VfaWQ7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1ldGFkYXRhOwotfTsKLQotLyogRGV2aWNlIGNvbnRyb2wgYW5kIGNvbW1vbiBmdW5jdGlvbnMgKi8KLWJvb2wgUGFyc2VBc2VTdGF0dXNIZWFkZXIoYXNlX3JzcF9oZHImIHJzcCwgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSk7Ci1ib29sIFBhcnNlQXNlU3RhdHVzQ29kZWNDb25maWd1cmVkU3RhdGVQYXJhbXMoCi0gICAgc3RydWN0IGFzZV9jb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyYgcnNwLCB1aW50MTZfdCBsZW4sCi0gICAgY29uc3QgdWludDhfdCogdmFsdWUpOwotYm9vbCBQYXJzZUFzZVN0YXR1c1Fvc0NvbmZpZ3VyZWRTdGF0ZVBhcmFtcygKLSAgICBzdHJ1Y3QgYXNlX3Fvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyYgcnNwLCB1aW50MTZfdCBsZW4sCi0gICAgY29uc3QgdWludDhfdCogdmFsdWUpOwotYm9vbCBQYXJzZUFzZVN0YXR1c1RyYW5zaWVudFN0YXRlUGFyYW1zKHN0cnVjdCBhc2VfdHJhbnNpZW50X3N0YXRlX3BhcmFtcyYgcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgY29uc3QgdWludDhfdCogdmFsdWUpOwotYm9vbCBQYXJzZUFzZUN0cE5vdGlmaWNhdGlvbihzdHJ1Y3QgY3RwX250ZiYgbnRmLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnKGNvbnN0IHN0ZDo6dmVjdG9yPHN0cnVjdCBjdHBfY29kZWNfY29uZj4mIGNvbmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cENvbmZpZ1Fvcyhjb25zdCBzdGQ6OnZlY3RvcjxzdHJ1Y3QgY3RwX3Fvc19jb25mPiYgY29uZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cEVuYWJsZShjb25zdCBzdGQ6OnZlY3RvcjxzdHJ1Y3QgY3RwX2VuYWJsZT4mIGNvbmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSk7Ci1ib29sIFByZXBhcmVBc2VDdHBBdWRpb1JlY2VpdmVyU3RhcnRSZWFkeShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cERpc2FibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdG9wUmVhZHkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cFVwZGF0ZU1ldGFkYXRhKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0cnVjdCBjdHBfdXBkYXRlX21ldGFkYXRhPiYgY29uZnMsCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLWJvb2wgUHJlcGFyZUFzZUN0cFJlbGVhc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLX0gIC8vIG5hbWVzcGFjZSBhc2NzCi0KLW5hbWVzcGFjZSBwYWNzIHsKLQotY29uc3RleHByIHVpbnQxNl90IGtBY3NQYWNSZWNvcmRNaW5MZW4gPSA3OwotY29uc3RleHByIHVpbnQ4X3Qga0Fjc1BhY01ldGFkYXRhTGVuTGVuID0gMTsKLWNvbnN0ZXhwciB1aW50MTZfdCBrQWNzUGFjRGlzY292ZXJSc3BNaW5MZW4gPSAxOwotCi1jb25zdGV4cHIgdWludDE2X3Qga0F1ZGlvTG9jYXRpb25zUnNwTWluTGVuID0gNDsKLQotY29uc3RleHByIHVpbnQxNl90IGtBc2VBdWRpb0F2YWlsUnNwTWluTGVuID0gNDsKLXN0cnVjdCBhY3NfYXZhaWxhYmxlX2F1ZGlvX2NvbnRleHRzIHsKLSAgc3RkOjpiaXRzZXQ8MTY+IHNua19hdmFpbF9jb250OwotICBzdGQ6OmJpdHNldDwxNj4gc3JjX2F2YWlsX2NvbnQ7Ci19OwotCi1jb25zdGV4cHIgdWludDE2X3Qga0FzZUF1ZGlvU3VwcENvbnRSc3BNaW5MZW4gPSA0Owotc3RydWN0IGFjc19zdXBwb3J0ZWRfYXVkaW9fY29udGV4dHMgewotICBzdGQ6OmJpdHNldDwxNj4gc25rX3N1cHBfY29udDsKLSAgc3RkOjpiaXRzZXQ8MTY+IHNyY19zdXBwX2NvbnQ7Ci19OwotCi1ib29sIFBhcnNlUGFjKHN0ZDo6dmVjdG9yPHN0cnVjdCB0eXBlczo6YWNzX2FjX3JlY29yZD4mIHBhY19yZWNzLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKTsKLWJvb2wgUGFyc2VBdWRpb0xvY2F0aW9ucyh0eXBlczo6QXVkaW9Mb2NhdGlvbnMmIGF1ZGlvX2xvY2F0aW9ucywgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKTsKLWJvb2wgUGFyc2VBdmFpbGFibGVBdWRpb0NvbnRleHRzKHN0cnVjdCBhY3NfYXZhaWxhYmxlX2F1ZGlvX2NvbnRleHRzJiByc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKTsKLWJvb2wgUGFyc2VTdXBwb3J0ZWRBdWRpb0NvbnRleHRzKHN0cnVjdCBhY3Nfc3VwcG9ydGVkX2F1ZGlvX2NvbnRleHRzJiByc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKTsKLX0gIC8vIG5hbWVzcGFjZSBwYWNzCi19ICAvLyBuYW1lc3BhY2UgY2xpZW50X3BhcnNlcgotfSAgLy8gbmFtZXNwYWNlIGxlX2F1ZGlvCmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vY2xpZW50X3BhcnNlcl90ZXN0LmNjIGIvYnRhL2xlX2F1ZGlvL2NsaWVudF9wYXJzZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4NmU4OC4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vY2xpZW50X3BhcnNlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY2xpZW50X3BhcnNlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAibGVfYXVkaW9fdHlwZXMuaCIKLQotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLW5hbWVzcGFjZSBjbGllbnRfcGFyc2VyIHsKLW5hbWVzcGFjZSBwYWNzIHsKLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFBhcnNlUGFjSW52YWxpZExlbmd0aCkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotCi0gIGNvbnN0IHVpbnQ4X3QgaW52YWxpZF9udW1fcmVjb3Jkc1tdID0gezB4MDF9OwotICBBU1NFUlRfRkFMU0UoCi0gICAgICBQYXJzZVBhYyhwYWNfcmVjcywgc2l6ZW9mKGludmFsaWRfbnVtX3JlY29yZHMpLCBpbnZhbGlkX251bV9yZWNvcmRzKSk7Ci0KLSAgY29uc3QgdWludDhfdCBub19jYXBzX2xlbltdID0gewotICAgICAgLy8gTnVtIHJlY29yZHMKLSAgICAgIDB4MDEsCi0gICAgICAvLyBDb2RlY19JRAotICAgICAgMHgwMSwKLSAgICAgIDB4MDIsCi0gICAgICAweDAzLAotICAgICAgMHgwNCwKLSAgICAgIDB4MDUsCi0gIH07Ci0gIEFTU0VSVF9GQUxTRShQYXJzZVBhYyhwYWNfcmVjcywgc2l6ZW9mKG5vX2NhcHNfbGVuKSwgbm9fY2Fwc19sZW4pKTsKLQotICBjb25zdCB1aW50OF90IG5vX21ldGFsZW5bXSA9IHsKLSAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAweDAxLAotICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgMHgwMywKLSAgICAgIDB4MDQsCi0gICAgICAweDA1LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDAwLAotICB9OwotICBBU1NFUlRfRkFMU0UoUGFyc2VQYWMocGFjX3JlY3MsIHNpemVvZihub19tZXRhbGVuKSwgbm9fbWV0YWxlbikpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VQYWNFbXB0eSkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotICBjb25zdCB1aW50OF90IHZhbHVlW10gPSB7MHgwMH07Ci0KLSAgQVNTRVJUX1RSVUUoUGFyc2VQYWMocGFjX3JlY3MsIHNpemVvZih2YWx1ZSksIHZhbHVlKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZVBhY0VtcHR5Q2Fwc0VtcHR5TWV0YSkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotCi0gIGNvbnN0IHVpbnQ4X3QgdmFsdWVbXSA9IHsKLSAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAweDAxLAotICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAzLAotICAgICAgMHgwMiwKLSAgICAgIDB4MDUsCi0gICAgICAweDA0LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDAwLAotICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAweDAwLAotICB9OwotICBBU1NFUlRfVFJVRShQYXJzZVBhYyhwYWNfcmVjcywgc2l6ZW9mKHZhbHVlKSwgdmFsdWUpKTsKLQotICBBU1NFUlRfRVEocGFjX3JlY3Muc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LCAweDAxdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC52ZW5kb3JfY29tcGFueV9pZCwgMHgwMjAzdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC52ZW5kb3JfY29kZWNfaWQsIDB4MDQwNXUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VQYWNJbnZhbGlkQ2Fwc0xlbikgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotCi0gIGNvbnN0IHVpbnQ4X3QgYmFkX2NhcHNsZW1bXSA9IHsKLSAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAweDAxLAotICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAzLAotICAgICAgMHgwMiwKLSAgICAgIDB4MDUsCi0gICAgICAweDA0LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDA1LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4KLSAgICAgIDB4MDIsICAvLyBbMF0ubGVuZ3RoLAotICAgICAgMHgwMiwgIC8vIFswXS50eXBlLAotICAgICAgMHgwMywgIC8vIFswXS52YWx1ZVswXQotICAgICAgMHgwMywgIC8vIFsxXS5sZW5ndGgKLSAgICAgIDB4MDMsICAvLyBbMV0udHlwZQotICAgICAgMHgwNCwgIC8vIFsxXS52YWx1ZVswXQotICAgICAgMHgwNSwgIC8vIFsxXS52YWx1ZVsxXQotICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAweDAwLAotICB9OwotICBBU1NFUlRfRkFMU0UoUGFyc2VQYWMocGFjX3JlY3MsIHNpemVvZihiYWRfY2Fwc2xlbSksIGJhZF9jYXBzbGVtKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RydWN0IHR5cGVzOjphY3NfYWNfcmVjb3JkPiBwYWNfcmVjczI7Ci0KLSAgY29uc3QgdWludDhfdCBiYWRfY2Fwc2xlbjJbXSA9IHsKLSAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAweDAxLAotICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAzLAotICAgICAgMHgwMiwKLSAgICAgIDB4MDUsCi0gICAgICAweDA0LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDIwLAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4KLSAgICAgIDB4MDIsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDMsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDMsICAvLyBbMV0ubGVuZ3RoCi0gICAgICAweDAzLCAgLy8gWzFdLnR5cGUKLSAgICAgIDB4MDQsICAvLyBbMV0udmFsdWVbMF0KLSAgICAgIDB4MDUsICAvLyBbMV0udmFsdWVbMV0KLSAgICAgIC8vIE1ldGFkYXRhIExlbmd0aAotICAgICAgMHgwMCwKLSAgfTsKLSAgQVNTRVJUX0ZBTFNFKFBhcnNlUGFjKHBhY19yZWNzMiwgc2l6ZW9mKGJhZF9jYXBzbGVuMiksIGJhZF9jYXBzbGVuMikpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VQYWNJbnZhbGlkQ2Fwc0x0dkxlbikgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotCi0gIGNvbnN0IHVpbnQ4X3QgYmFkX2x0dl9sZW5bXSA9IHsKLSAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAweDAxLAotICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAzLAotICAgICAgMHgwMiwKLSAgICAgIDB4MDUsCi0gICAgICAweDA0LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDA3LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4KLSAgICAgIDB4MDIsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDMsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDYsICAvLyBbMV0uYmFkX2xlbmd0aAotICAgICAgMHgwMywgIC8vIFsxXS50eXBlCi0gICAgICAweDA0LCAgLy8gWzFdLnZhbHVlWzBdCi0gICAgICAweDA1LCAgLy8gWzFdLnZhbHVlWzFdCi0gICAgICAvLyBNZXRhZGF0YSBMZW5ndGgKLSAgICAgIDB4MDAsCi0gIH07Ci0gIEFTU0VSVF9GQUxTRShQYXJzZVBhYyhwYWNfcmVjcywgc2l6ZW9mKGJhZF9sdHZfbGVuKSwgYmFkX2x0dl9sZW4pKTsKLQotICBjb25zdCB1aW50OF90IGJhZF9sdHZfbGVuMltdID0gewotICAgICAgLy8gTnVtIHJlY29yZHMKLSAgICAgIDB4MDEsCi0gICAgICAvLyBDb2RlY19JRAotICAgICAgMHgwMSwKLSAgICAgIDB4MDMsCi0gICAgICAweDAyLAotICAgICAgMHgwNSwKLSAgICAgIDB4MDQsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLiBMZW4KLSAgICAgIDB4MDcsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLgotICAgICAgMHgwMiwgIC8vIFswXS5sZW5ndGgKLSAgICAgIDB4MDIsICAvLyBbMF0udHlwZQotICAgICAgMHgwMywgIC8vIFswXS52YWx1ZVswXQotICAgICAgMHgwNCwgIC8vIFsxXS5iYWRfbGVuZ3RoCi0gICAgICAweDAzLCAgLy8gWzFdLnR5cGUKLSAgICAgIDB4MDQsICAvLyBbMV0udmFsdWVbMF0KLSAgICAgIDB4MDUsICAvLyBbMV0udmFsdWVbMV0KLSAgICAgIC8vIE1ldGFkYXRhIExlbmd0aAotICAgICAgMHgwMCwKLSAgfTsKLSAgQVNTRVJUX0ZBTFNFKFBhcnNlUGFjKHBhY19yZWNzLCBzaXplb2YoYmFkX2x0dl9sZW4yKSwgYmFkX2x0dl9sZW4yKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZVBhY051bGxMdHYpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IHR5cGVzOjphY3NfYWNfcmVjb3JkPiBwYWNfcmVjczsKLQotICBjb25zdCB1aW50OF90IHZhbHVlW10gPSB7Ci0gICAgICAvLyBOdW0gcmVjb3JkcwotICAgICAgMHgwMSwKLSAgICAgIC8vIENvZGVjX0lECi0gICAgICAweDAxLAotICAgICAgMHgwMywKLSAgICAgIDB4MDIsCi0gICAgICAweDA1LAotICAgICAgMHgwNCwKLSAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuIExlbgotICAgICAgMHgwQSwKLSAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuCi0gICAgICAweDAyLCAgLy8gWzBdLmxlbmd0aAotICAgICAgMHgwMiwgIC8vIFswXS50eXBlCi0gICAgICAweDAzLCAgLy8gWzBdLnZhbHVlWzBdCi0gICAgICAweDAzLCAgLy8gWzFdLmxlbmd0aAotICAgICAgMHgwMywgIC8vIFsxXS50eXBlCi0gICAgICAweDA0LCAgLy8gWzFdLnZhbHVlWzBdCi0gICAgICAweDA1LCAgLy8gWzFdLnZhbHVlWzFdCi0gICAgICAweDAxLCAgLy8gWzJdLmxlbmd0aCA8LS0gYSBjYXBhYmlsaXR5IHdpdGhvdXQgYSB2YWx1ZQotICAgICAgMHgwNCwgIC8vIFsyXS50eXBlCi0gICAgICAweDAwLCAgLy8gWzNdbGVuZ3RoIDwtLSB0aGlzIHNlZW1zIHBvc3NpYmxlIGFsdGhvdWdoIHVzZWxlc3MKLSAgICAgIC8vIE1ldGFkYXRhIExlbmd0aAotICAgICAgMHgwMCwKLSAgfTsKLSAgQVNTRVJUX1RSVUUoUGFyc2VQYWMocGFjX3JlY3MsIHNpemVvZih2YWx1ZSksIHZhbHVlKSk7Ci0KLSAgQVNTRVJUX0VRKHBhY19yZWNzLnNpemUoKSwgMXUpOwotICBBU1NFUlRfRVEocGFjX3JlY3NbMF0uY29kZWNfaWQuY29kaW5nX2Zvcm1hdCwgMHgwMXUpOwotICBBU1NFUlRfRVEocGFjX3JlY3NbMF0uY29kZWNfaWQudmVuZG9yX2NvbXBhbnlfaWQsIDB4MDIwM3UpOwotICBBU1NFUlRfRVEocGFjX3JlY3NbMF0uY29kZWNfaWQudmVuZG9yX2NvZGVjX2lkLCAweDA0MDV1KTsKLQotICBhdXRvIGNvZGVjX3NwZWNfY2FwcyA9IHBhY19yZWNzWzBdLmNvZGVjX3NwZWNfY2Fwcy5WYWx1ZXMoKTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwcy5zaXplKCksIDN1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwcy5jb3VudCgweDAydSksIDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwc1sweDAydV0uc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHNbMHgwMnVdWzBdLCAweDAzdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHMuY291bnQoMHgwM3UpLCAxdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHNbMHgwM3VdLnNpemUoKSwgMnUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzWzB4MDN1XVswXSwgMHgwNHUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzWzB4MDN1XVsxXSwgMHgwNXUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzLmNvdW50KDB4MDR1KSwgMXUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzWzB4MDR1XS5zaXplKCksIDB1KTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFBhcnNlUGFjRW1wdHlNZXRhKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0cnVjdCB0eXBlczo6YWNzX2FjX3JlY29yZD4gcGFjX3JlY3M7Ci0KLSAgY29uc3QgdWludDhfdCB2YWx1ZVtdID0gewotICAgICAgLy8gTnVtIHJlY29yZHMKLSAgICAgIDB4MDEsCi0gICAgICAvLyBDb2RlY19JRAotICAgICAgMHgwMSwKLSAgICAgIDB4MDMsCi0gICAgICAweDAyLAotICAgICAgMHgwNSwKLSAgICAgIDB4MDQsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLiBMZW4KLSAgICAgIDB4MDcsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLgotICAgICAgMHgwMiwgIC8vIFswXS5sZW5ndGgKLSAgICAgIDB4MDIsICAvLyBbMF0udHlwZQotICAgICAgMHgwMywgIC8vIFswXS52YWx1ZVswXQotICAgICAgMHgwMywgIC8vIFsxXS5sZW5ndGgKLSAgICAgIDB4MDMsICAvLyBbMV0udHlwZQotICAgICAgMHgwNCwgIC8vIFsxXS52YWx1ZVswXQotICAgICAgMHgwNSwgIC8vIFsxXS52YWx1ZVsxXQotICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAweDAwLAotICB9OwotICBBU1NFUlRfVFJVRShQYXJzZVBhYyhwYWNfcmVjcywgc2l6ZW9mKHZhbHVlKSwgdmFsdWUpKTsKLQotICBBU1NFUlRfRVEocGFjX3JlY3Muc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LCAweDAxdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC52ZW5kb3JfY29tcGFueV9pZCwgMHgwMjAzdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC52ZW5kb3JfY29kZWNfaWQsIDB4MDQwNXUpOwotCi0gIGF1dG8gY29kZWNfc3BlY19jYXBzID0gcGFjX3JlY3NbMF0uY29kZWNfc3BlY19jYXBzLlZhbHVlcygpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzLnNpemUoKSwgMnUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzLmNvdW50KDB4MDJ1KSwgMXUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzWzB4MDJ1XS5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwc1sweDAydV1bMF0sIDB4MDN1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwcy5jb3VudCgweDAzdSksIDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwc1sweDAzdV0uc2l6ZSgpLCAydSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHNbMHgwM3VdWzBdLCAweDA0dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHNbMHgwM3VdWzFdLCAweDA1dSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZVBhY0ludmFsaWRNZXRhTGVuZ3RoKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0cnVjdCB0eXBlczo6YWNzX2FjX3JlY29yZD4gcGFjX3JlY3M7Ci0KLSAgY29uc3QgdWludDhfdCB2YWx1ZVtdID0gewotICAgICAgLy8gTnVtIHJlY29yZHMKLSAgICAgIDB4MDEsCi0gICAgICAvLyBDb2RlY19JRAotICAgICAgMHgwMSwgMHgwMywgMHgwMiwgMHgwNSwgMHgwNCwKLSAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuIExlbgotICAgICAgMHgwNywKLSAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuCi0gICAgICAweDAyLCAgLy8gWzBdLmxlbmd0aAotICAgICAgMHgwMiwgIC8vIFswXS50eXBlCi0gICAgICAweDAzLCAgLy8gWzBdLnZhbHVlWzBdCi0gICAgICAweDAzLCAgLy8gWzFdLmxlbmd0aAotICAgICAgMHgwMywgIC8vIFsxXS50eXBlCi0gICAgICAweDA0LCAgLy8gWzFdLnZhbHVlWzBdCi0gICAgICAweDA1LCAgLy8gWzFdLnZhbHVlWzFdCi0gICAgICAgICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAweDA1LAotICAgICAgLy8gTWV0YWRhdGEKLSAgICAgIDB4MDMsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDEsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDAsICAvLyBbMF0udmFsdWVbMV0KLSAgfTsKLSAgQVNTRVJUX0ZBTFNFKFBhcnNlUGFjKHBhY19yZWNzLCBzaXplb2YodmFsdWUpLCB2YWx1ZSkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VQYWNWYWxpZE1ldGEpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IHR5cGVzOjphY3NfYWNfcmVjb3JkPiBwYWNfcmVjczsKLQotICBjb25zdCB1aW50OF90IHZhbHVlW10gPSB7Ci0gICAgICAvLyBOdW0gcmVjb3JkcwotICAgICAgMHgwMSwKLSAgICAgIC8vIENvZGVjX0lECi0gICAgICAweDAxLCAweDAzLCAweDAyLCAweDA1LCAweDA0LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDA3LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4KLSAgICAgIDB4MDIsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDMsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDMsICAvLyBbMV0ubGVuZ3RoCi0gICAgICAweDAzLCAgLy8gWzFdLnR5cGUKLSAgICAgIDB4MDQsICAvLyBbMV0udmFsdWVbMF0KLSAgICAgIDB4MDUsICAvLyBbMV0udmFsdWVbMV0KLSAgICAgICAgICAgICAvLyBNZXRhZGF0YSBMZW5ndGgKLSAgICAgIDB4MDQsCi0gICAgICAvLyBNZXRhZGF0YQotICAgICAgMHgwMywgIC8vIFswXS5sZW5ndGgKLSAgICAgIDB4MDIsICAvLyBbMF0udHlwZQotICAgICAgMHgwMSwgIC8vIFswXS52YWx1ZVswXQotICAgICAgMHgwMCwgIC8vIFswXS52YWx1ZVsxXQotICB9OwotICBBU1NFUlRfVFJVRShQYXJzZVBhYyhwYWNfcmVjcywgc2l6ZW9mKHZhbHVlKSwgdmFsdWUpKTsKLQotICBBU1NFUlRfRVEocGFjX3JlY3Muc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LCAweDAxdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC52ZW5kb3JfY29tcGFueV9pZCwgMHgwMjAzdSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5jb2RlY19pZC52ZW5kb3JfY29kZWNfaWQsIDB4MDQwNXUpOwotCi0gIGF1dG8gY29kZWNfc3BlY19jYXBzID0gcGFjX3JlY3NbMF0uY29kZWNfc3BlY19jYXBzLlZhbHVlcygpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzLnNpemUoKSwgMnUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzLmNvdW50KDB4MDJ1KSwgMXUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzWzB4MDJ1XS5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwc1sweDAydV1bMF0sIDB4MDN1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwcy5jb3VudCgweDAzdSksIDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2Fwc1sweDAzdV0uc2l6ZSgpLCAydSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHNbMHgwM3VdWzBdLCAweDA0dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHNbMHgwM3VdWzFdLCAweDA1dSk7Ci0KLSAgQVNTRVJUX0VRKHBhY19yZWNzWzBdLm1ldGFkYXRhLnNpemUoKSwgNHUpOwotICBBU1NFUlRfRVEocGFjX3JlY3NbMF0ubWV0YWRhdGFbMF0sIDB4MDN1KTsKLSAgQVNTRVJUX0VRKHBhY19yZWNzWzBdLm1ldGFkYXRhWzFdLCAweDAydSk7Ci0gIEFTU0VSVF9FUShwYWNfcmVjc1swXS5tZXRhZGF0YVsyXSwgMHgwMXUpOwotICBBU1NFUlRfRVEocGFjX3JlY3NbMF0ubWV0YWRhdGFbM10sIDB4MDB1KTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFBhcnNlUGFjSW52YWxpZE51bVJlY29yZHMpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IHR5cGVzOjphY3NfYWNfcmVjb3JkPiBwYWNfcmVjczsKLQotICBjb25zdCB1aW50OF90IHZhbHVlW10gPSB7Ci0gICAgICAvLyBOdW0gcmVjb3JkcwotICAgICAgMHgwMiwKLSAgICAgIC8vIENvZGVjX0lECi0gICAgICAweDAxLCAweDAzLCAweDAyLCAweDA1LCAweDA0LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4gTGVuCi0gICAgICAweDA3LAotICAgICAgLy8gQ29kZWMgU3BlYy4gQ2Fwcy4KLSAgICAgIDB4MDIsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDMsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDMsICAvLyBbMV0ubGVuZ3RoCi0gICAgICAweDAzLCAgLy8gWzFdLnR5cGUKLSAgICAgIDB4MDQsICAvLyBbMV0udmFsdWVbMF0KLSAgICAgIDB4MDUsICAvLyBbMV0udmFsdWVbMV0KLSAgICAgICAgICAgICAvLyBNZXRhZGF0YSBMZW5ndGgKLSAgICAgIDB4MDQsCi0gICAgICAvLyBNZXRhZGF0YQotICAgICAgMHgwMywgIC8vIFswXS5sZW5ndGgKLSAgICAgIDB4MDIsICAvLyBbMF0udHlwZQotICAgICAgMHgwMSwgIC8vIFswXS52YWx1ZVswXQotICAgICAgMHgwMCwgIC8vIFswXS52YWx1ZVsxXQotICB9OwotICBBU1NFUlRfRkFMU0UoUGFyc2VQYWMocGFjX3JlY3MsIHNpemVvZih2YWx1ZSksIHZhbHVlKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZVBhY011bHRpcGxlUmVjb3JkcykgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotCi0gIGNvbnN0IHVpbnQ4X3QgdmFsdWVbXSA9IHsKLSAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAweDAzLAotICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MDEsIDB4MDMsIDB4MDIsIDB4MDUsIDB4MDQsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLiBMZW4KLSAgICAgIDB4MDAsCi0gICAgICAvLyBNZXRhZGF0YSBMZW5ndGgKLSAgICAgIDB4MDAsCi0gICAgICAvLyBDb2RlY19JRAotICAgICAgMHgwNiwgMHgwOCwgMHgwNywgMHgwQSwgMHgwOSwKLSAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuIExlbgotICAgICAgMHgwMywKLSAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuCi0gICAgICAweDAyLCAgLy8gWzBdLmxlbmd0aAotICAgICAgMHgwMiwgIC8vIFswXS50eXBlCi0gICAgICAweDAzLCAgLy8gWzBdLnZhbHVlWzBdCi0gICAgICAgICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAweDA0LAotICAgICAgLy8gTWV0YWRhdGEKLSAgICAgIDB4MDMsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDEsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDAsICAvLyBbMF0udmFsdWVbMV0sCi0gICAgICAgICAgICAgLy8gQ29kZWNfSUQKLSAgICAgIDB4MTEsIDB4MTMsIDB4MTIsIDB4MTUsIDB4MTQsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLiBMZW4KLSAgICAgIDB4MDcsCi0gICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLgotICAgICAgMHgwMiwgIC8vIFswXS5sZW5ndGgKLSAgICAgIDB4MTIsICAvLyBbMF0udHlwZQotICAgICAgMHgxMywgIC8vIFswXS52YWx1ZVswXQotICAgICAgMHgwMywgIC8vIFsxXS5sZW5ndGgKLSAgICAgIDB4MTMsICAvLyBbMV0udHlwZQotICAgICAgMHgxNCwgIC8vIFsxXS52YWx1ZVswXQotICAgICAgMHgxNSwgIC8vIFsxXS52YWx1ZVsxXQotICAgICAgICAgICAgIC8vIE1ldGFkYXRhIExlbmd0aAotICAgICAgMHgwNCwKLSAgICAgIC8vIE1ldGFkYXRhCi0gICAgICAweDAzLCAgLy8gWzBdLmxlbmd0aAotICAgICAgMHgxMiwgIC8vIFswXS50eXBlCi0gICAgICAweDExLCAgLy8gWzBdLnZhbHVlWzBdCi0gICAgICAweDEwLCAgLy8gWzBdLnZhbHVlWzFdCi0gIH07Ci0gIEFTU0VSVF9UUlVFKFBhcnNlUGFjKHBhY19yZWNzLCBzaXplb2YodmFsdWUpLCB2YWx1ZSkpOwotICBBU1NFUlRfRVEocGFjX3JlY3Muc2l6ZSgpLCAzdSk7Ci0KLSAgLy8gVmVyaWZ5IDFzdCByZWNvcmQKLSAgYXV0byYgcmVjb3JkMCA9IHBhY19yZWNzWzBdOwotCi0gIEFTU0VSVF9FUShyZWNvcmQwLmNvZGVjX2lkLmNvZGluZ19mb3JtYXQsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKHJlY29yZDAuY29kZWNfaWQudmVuZG9yX2NvbXBhbnlfaWQsIDB4MDIwM3UpOwotICBBU1NFUlRfRVEocmVjb3JkMC5jb2RlY19pZC52ZW5kb3JfY29kZWNfaWQsIDB4MDQwNXUpOwotICBBU1NFUlRfRVEocmVjb3JkMC5jb2RlY19zcGVjX2NhcHMuU2l6ZSgpLCAwdSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQwLm1ldGFkYXRhLnNpemUoKSwgMHUpOwotCi0gIC8vIFZlcmlmeSAybmQgcmVjb3JkCi0gIGF1dG8mIHJlY29yZDEgPSBwYWNfcmVjc1sxXTsKLQotICBBU1NFUlRfRVEocmVjb3JkMS5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LCAweDA2dSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQxLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkLCAweDA3MDh1KTsKLSAgQVNTRVJUX0VRKHJlY29yZDEuY29kZWNfaWQudmVuZG9yX2NvZGVjX2lkLCAweDA5MEF1KTsKLQotICBhdXRvIGNvZGVjX3NwZWNfY2FwczEgPSByZWNvcmQxLmNvZGVjX3NwZWNfY2Fwcy5WYWx1ZXMoKTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2FwczEuc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHMxLmNvdW50KDB4MDJ1KSwgMXUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzMVsweDAydV0uc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHMxWzB4MDJ1XVswXSwgMHgwM3UpOwotCi0gIEFTU0VSVF9FUShyZWNvcmQxLm1ldGFkYXRhLnNpemUoKSwgNHUpOwotICBBU1NFUlRfRVEocmVjb3JkMS5tZXRhZGF0YVswXSwgMHgwM3UpOwotICBBU1NFUlRfRVEocmVjb3JkMS5tZXRhZGF0YVsxXSwgMHgwMnUpOwotICBBU1NFUlRfRVEocmVjb3JkMS5tZXRhZGF0YVsyXSwgMHgwMXUpOwotICBBU1NFUlRfRVEocmVjb3JkMS5tZXRhZGF0YVszXSwgMHgwMHUpOwotCi0gIC8vIFZlcmlmeSAzcmQgcmVjb3JkCi0gIGF1dG8mIHJlY29yZDIgPSBwYWNfcmVjc1syXTsKLQotICBBU1NFUlRfRVEocmVjb3JkMi5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LCAweDExdSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQyLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkLCAweDEyMTN1KTsKLSAgQVNTRVJUX0VRKHJlY29yZDIuY29kZWNfaWQudmVuZG9yX2NvZGVjX2lkLCAweDE0MTV1KTsKLQotICBhdXRvIGNvZGVjX3NwZWNfY2FwczIgPSByZWNvcmQyLmNvZGVjX3NwZWNfY2Fwcy5WYWx1ZXMoKTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2FwczIuc2l6ZSgpLCAydSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHMyLmNvdW50KDB4MTJ1KSwgMXUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzMlsweDEydV0uc2l6ZSgpLCAxdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19zcGVjX2NhcHMyWzB4MTJ1XVswXSwgMHgxM3UpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzMi5jb3VudCgweDEzdSksIDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2FwczJbMHgxM3VdLnNpemUoKSwgMnUpOwotICBBU1NFUlRfRVEoY29kZWNfc3BlY19jYXBzMlsweDEzdV1bMF0sIDB4MTR1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX3NwZWNfY2FwczJbMHgxM3VdWzFdLCAweDE1dSk7Ci0KLSAgQVNTRVJUX0VRKHJlY29yZDIubWV0YWRhdGEuc2l6ZSgpLCA0dSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQyLm1ldGFkYXRhWzBdLCAweDAzdSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQyLm1ldGFkYXRhWzFdLCAweDEydSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQyLm1ldGFkYXRhWzJdLCAweDExdSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQyLm1ldGFkYXRhWzNdLCAweDEwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZUF1ZGlvTG9jYXRpb25zSW52YWxpZExlbmd0aCkgewotICB0eXBlczo6QXVkaW9Mb2NhdGlvbnMgbG9jYXRpb25zID0KLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbk1vbm9VbnNwZWNpZmllZDsKLSAgY29uc3QgdWludDhfdCB2YWx1ZTFbXSA9IHsKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgMHgwMywKLSAgfTsKLSAgUGFyc2VBdWRpb0xvY2F0aW9ucyhsb2NhdGlvbnMsIHNpemVvZih2YWx1ZTEpLCB2YWx1ZTEpOwotICBBU1NFUlRfRVEobG9jYXRpb25zLCAwdSk7Ci0KLSAgY29uc3QgdWludDhfdCB2YWx1ZTJbXSA9IHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1fTsKLSAgUGFyc2VBdWRpb0xvY2F0aW9ucyhsb2NhdGlvbnMsIHNpemVvZih2YWx1ZTIpLCB2YWx1ZTIpOwotICBBU1NFUlRfRVEobG9jYXRpb25zLCAwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZUF1ZGlvTG9jYXRpb25zKSB7Ci0gIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyBsb2NhdGlvbnMgPQotICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uTW9ub1Vuc3BlY2lmaWVkOwotICBjb25zdCB1aW50OF90IHZhbHVlMVtdID0gezB4MDEsIDB4MDIsIDB4MDMsIDB4MDR9OwotICBQYXJzZUF1ZGlvTG9jYXRpb25zKGxvY2F0aW9ucywgc2l6ZW9mKHZhbHVlMSksIHZhbHVlMSk7Ci0gIEFTU0VSVF9FUShsb2NhdGlvbnMsIDB4MDQwMzAyMDF1KTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFBhcnNlQXZhaWxhYmxlQXVkaW9Db250ZXh0c0ludmFsaWRMZW5ndGgpIHsKLSAgYWNzX2F2YWlsYWJsZV9hdWRpb19jb250ZXh0cyBhdmFpbF9jb250ZXh0czsKLSAgY29uc3QgdWludDhfdCB2YWx1ZTFbXSA9IHsKLSAgICAgIC8vIFNpbmsgYXZhaWxhYmxlIGNvbnRleHRzCi0gICAgICAweDAxLCAweDAyLAotICAgICAgLy8gTWlzc2luZyBTb3VyY2UgYXZhaWxhYmxlIGNvbnRleHRzCi0gIH07Ci0KLSAgUGFyc2VBdmFpbGFibGVBdWRpb0NvbnRleHRzKGF2YWlsX2NvbnRleHRzLCBzaXplb2YodmFsdWUxKSwgdmFsdWUxKTsKLSAgQVNTRVJUX0VRKGF2YWlsX2NvbnRleHRzLnNua19hdmFpbF9jb250LCAwdSk7Ci0gIEFTU0VSVF9FUShhdmFpbF9jb250ZXh0cy5zcmNfYXZhaWxfY29udCwgMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VBdmFpbGFibGVBdWRpb0NvbnRleHRzKSB7Ci0gIGFjc19hdmFpbGFibGVfYXVkaW9fY29udGV4dHMgYXZhaWxfY29udGV4dHM7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBTaW5rIGF2YWlsYWJsZSBjb250ZXh0cwotICAgICAgMHgwMSwKLSAgICAgIDB4MDIsCi0gICAgICAvLyBTb3VyY2UgYXZhaWxhYmxlIGNvbnRleHRzCi0gICAgICAweDAzLAotICAgICAgMHgwNCwKLSAgfTsKLQotICBQYXJzZUF2YWlsYWJsZUF1ZGlvQ29udGV4dHMoYXZhaWxfY29udGV4dHMsIHNpemVvZih2YWx1ZTEpLCB2YWx1ZTEpOwotICBBU1NFUlRfRVEoYXZhaWxfY29udGV4dHMuc25rX2F2YWlsX2NvbnQsIDB4MDIwMXUpOwotICBBU1NFUlRfRVEoYXZhaWxfY29udGV4dHMuc3JjX2F2YWlsX2NvbnQsIDB4MDQwM3UpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VTdXBwb3J0ZWRBdWRpb0NvbnRleHRzSW52YWxpZExlbmd0aCkgewotICBhY3Nfc3VwcG9ydGVkX2F1ZGlvX2NvbnRleHRzIHN1cHBfY29udGV4dHM7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBTaW5rIHN1cHBvcnRlZCBjb250ZXh0cwotICAgICAgMHgwMSwgMHgwMiwKLSAgICAgIC8vIE1pc3NpbmcgU291cmNlIHN1cHBvcnRlZCBjb250ZXh0cwotICB9OwotCi0gIFBhcnNlU3VwcG9ydGVkQXVkaW9Db250ZXh0cyhzdXBwX2NvbnRleHRzLCBzaXplb2YodmFsdWUxKSwgdmFsdWUxKTsKLSAgQVNTRVJUX0VRKHN1cHBfY29udGV4dHMuc25rX3N1cHBfY29udCwgMHUpOwotICBBU1NFUlRfRVEoc3VwcF9jb250ZXh0cy5zcmNfc3VwcF9jb250LCAwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZVN1cHBvcnRlZEF1ZGlvQ29udGV4dHMpIHsKLSAgYWNzX3N1cHBvcnRlZF9hdWRpb19jb250ZXh0cyBzdXBwX2NvbnRleHRzOwotICBjb25zdCB1aW50OF90IHZhbHVlMVtdID0gewotICAgICAgLy8gU2luayBzdXBwb3J0ZWQgY29udGV4dHMKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgLy8gU291cmNlIHN1cHBvcnRlZCBjb250ZXh0cwotICAgICAgMHgwMywKLSAgICAgIDB4MDQsCi0gIH07Ci0KLSAgUGFyc2VTdXBwb3J0ZWRBdWRpb0NvbnRleHRzKHN1cHBfY29udGV4dHMsIHNpemVvZih2YWx1ZTEpLCB2YWx1ZTEpOwotICBBU1NFUlRfRVEoc3VwcF9jb250ZXh0cy5zbmtfc3VwcF9jb250LCAweDAyMDF1KTsKLSAgQVNTRVJUX0VRKHN1cHBfY29udGV4dHMuc3JjX3N1cHBfY29udCwgMHgwNDAzdSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNzCi0KLW5hbWVzcGFjZSBhc2NzIHsKLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFBhcnNlQXNlU3RhdHVzSGVhZGVySW52YWxpZExlbmd0aCkgewotICBhc2VfcnNwX2hkciBhcmg7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBBc2UgSUQKLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgU3RhdGUgaXMgbWlzc2luZyBoZXJlCi0gIH07Ci0gIEFTU0VSVF9GQUxTRShQYXJzZUFzZVN0YXR1c0hlYWRlcihhcmgsIHNpemVvZih2YWx1ZTEpLCB2YWx1ZTEpKTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFBhcnNlQXNlU3RhdHVzSGVhZGVyKSB7Ci0gIGFzZV9yc3BfaGRyIGFyaDsKLSAgY29uc3QgdWludDhfdCB2YWx1ZTFbXSA9IHsKLSAgICAgIC8vIEFzZSBJRAotICAgICAgMHgwMSwKLSAgICAgIC8vIEFTRSBTdGF0ZQotICAgICAgMHgwMCwgIC8vICdJZGxlJyBzdGF0ZQotICAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgQVNFIFBhcmFtcyBmb3IgdGhlICdJZGxlJyBzdGF0ZQotICB9OwotICBBU1NFUlRfVFJVRShQYXJzZUFzZVN0YXR1c0hlYWRlcihhcmgsIHNpemVvZih2YWx1ZTEpLCB2YWx1ZTEpKTsKLSAgQVNTRVJUX0VRKGFyaC5pZCwgMHgwMXUpOwotICBBU1NFUlRfRVEoYXJoLnN0YXRlLCAweDAwdSk7Ci0KLSAgY29uc3QgdWludDhfdCB2YWx1ZTJbXSA9IHsKLSAgICAgIC8vIEFzZSBJRAotICAgICAgMHgwMiwKLSAgICAgIC8vIEFTRSBTdGF0ZQotICAgICAgMHgwNCwgIC8vICdTdHJlYW1pbmcnIHN0YXRlCi0gICAgICAvLyBBZGRpdGlvbmFsIEFTRSBQYXJhbXMgZm9yIHRoZSAnU3RyZWFtaW5nJyBzdGF0ZQotICAgICAgLy8gTWV0YWRhdGEgTGVuCi0gICAgICAweDAzLAotICAgICAgLy8gTWV0YWRhdGEKLSAgICAgIDB4MDMsICAvLyBbMF0ubGVuZ3RoCi0gICAgICAweDAyLCAgLy8gWzBdLnR5cGUKLSAgICAgIDB4MDEsICAvLyBbMF0udmFsdWVbMF0KLSAgICAgIDB4MDAsICAvLyBbMF0udmFsdWVbMV0KLSAgfTsKLSAgQVNTRVJUX1RSVUUoUGFyc2VBc2VTdGF0dXNIZWFkZXIoYXJoLCBzaXplb2YodmFsdWUyKSwgdmFsdWUyKSk7Ci0gIEFTU0VSVF9FUShhcmguaWQsIDB4MDJ1KTsKLSAgQVNTRVJUX0VRKGFyaC5zdGF0ZSwgMHgwNHUpOwotICAvLyBDdXJyZW50bHkgYWRkaXRpb25hbCBzdGF0ZSBwYXJhbWV0ZXJzIGFyZSBub3QgaGFuZGxlZAotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LAotICAgICB0ZXN0UGFyc2VBc2VTdGF0dXNDb2RlY0NvbmZpZ3VyZWRTdGF0ZVBhcmFtc0ludmFsaWRMZW5ndGgpIHsKLSAgYXNlX2NvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zOwotICBjb25zdCB1aW50OF90IHZhbHVlMVtdID0gewotICAgICAgLy8gQXNlIElECi0gICAgICAweDAyLAotICAgICAgLy8gQVNFIFN0YXRlCi0gICAgICAweDAxLCAgLy8gJ0NvZGVjIENvbmZpZ3VyZWQnIHN0YXRlCi0gICAgICAvLyBGcmFtaW5nCi0gICAgICAweDAxLCAgLy8gVW5mcmFtZWQKLSAgICAgIC8vIFBlZmVycmVkIFBIWQotICAgICAgMHgwMiwgIC8vIDJNIFBIWQotICAgICAgLy8gUHJlZmVycmVkIHJldHJhbnNpbXNzaW9uIE51bS4KLSAgICAgIDB4MDQsCi0gICAgICAvLyBNYXggdHJhbnNwb3J0IExhdGVuY3kKLSAgICAgIDB4MDUsIDB4MDAsCi0gICAgICAvLyBQcmVzc2VudGF0aW9uIGRlbGF5IG1pbi4KLSAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0gICAgICAvLyBQcmVzc2VudGF0aW9uIGRlbGF5IG1heC4KLSAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0gICAgICAvLyBQcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRlbGF5IG1pbi4KLSAgICAgIDB4MDEsIDB4MDIsIDB4MDMsCi0gICAgICAvLyBQcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRlbGF5IG1heC4KLSAgICAgIDB4MDEsIDB4MDIsIDB4MDMsCi0gICAgICAvLyBDb2RlYyBJRAotICAgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKLSAgICAgIC8vIE1pc3NpbmcgQ29kZWMgc3BlYy4gY29uZi4gbGVuZ3RoCi0gIH07Ci0KLSAgQVNTRVJUX0ZBTFNFKFBhcnNlQXNlU3RhdHVzQ29kZWNDb25maWd1cmVkU3RhdGVQYXJhbXMoCi0gICAgICBjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcywgc2l6ZW9mKHZhbHVlMSkgLSAyLCB2YWx1ZTEgKyAyKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZUFzZVN0YXR1c0NvZGVjQ29uZmlndXJlZFN0YXRlUGFyYW1zKSB7Ci0gIGFzZV9jb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyBjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtczsKLSAgY29uc3QgdWludDhfdCB2YWx1ZTFbXSA9IHsKLSAgICAgIC8vIEFzZSBJRAotICAgICAgMHgwMSwKLSAgICAgIC8vIEFTRSBTdGF0ZQotICAgICAgMHgwMSwgIC8vICdDb2RlYyBDb25maWd1cmVkJyBzdGF0ZQotICAgICAgLy8gRnJhbWluZwotICAgICAgMHgwMSwgIC8vIFVuZnJhbWVkCi0gICAgICAvLyBQZWZlcnJlZCBQSFkKLSAgICAgIDB4MDIsICAvLyAyTSBQSFkKLSAgICAgIC8vIFByZWZlcnJlZCByZXRyYW5zaW1zc2lvbiBOdW0uCi0gICAgICAweDA0LAotICAgICAgLy8gTWF4IHRyYW5zcG9ydCBMYXRlbmN5Ci0gICAgICAweDA1LAotICAgICAgMHgwMCwKLSAgICAgIC8vIFByZXNzZW50YXRpb24gZGVsYXkgbWluLgotICAgICAgMHgwMCwKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgLy8gUHJlc3NlbnRhdGlvbiBkZWxheSBtYXguCi0gICAgICAweDEwLAotICAgICAgMHgxMSwKLSAgICAgIDB4MTIsCi0gICAgICAvLyBQcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRlbGF5IG1pbi4KLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgMHgwMywKLSAgICAgIC8vIFByZWZlcnJlZCBwcmVzZW50YXRpb24gZGVsYXkgbWF4LgotICAgICAgMHgwOSwKLSAgICAgIDB4MTAsCi0gICAgICAweDExLAotICAgICAgLy8gQ29kZWMgSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgMHgwMywKLSAgICAgIDB4MDQsCi0gICAgICAweDA1LAotICAgICAgLy8gQ29kZWMgc3BlYy4gY29uZi4gbGVuZ3RoCi0gICAgICAweDAwLAotICB9OwotCi0gIC8vIFN0YXRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgcmlnaHQgYWZ0ZXIgdGhlIEFTRSBJRCBhbmQgc3RhdGUgYnl0ZXMKLSAgQVNTRVJUX1RSVUUoUGFyc2VBc2VTdGF0dXNDb2RlY0NvbmZpZ3VyZWRTdGF0ZVBhcmFtcygKLSAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLCBzaXplb2YodmFsdWUxKSAtIDIsIHZhbHVlMSArIDIpKTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmZyYW1pbmcsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9waHksIDB4MDJ1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9yZXRyYW5zX25iLCAweDA0dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3ksIDB4MDAwNXUpOwotICBBU1NFUlRfRVEoY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMucHJlc19kZWxheV9taW4sIDB4MDIwMTAwdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5wcmVzX2RlbGF5X21heCwgMHgxMjExMTB1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9wcmVzX2RlbGF5X21pbiwgMHgwMzAyMDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9wcmVzX2RlbGF5X21heCwgMHgxMTEwMDl1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLmNvZGluZ19mb3JtYXQsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkLCAweDAzMDJ1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCwgMHgwNTA0dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5jb2RlY19zcGVjX2NvbmYuc2l6ZSgpLCAwdSk7Ci0KLSAgY29uc3QgdWludDhfdCB2YWx1ZTJbXSA9IHsKLSAgICAgIC8vIEFzZSBJRAotICAgICAgMHgwMiwKLSAgICAgIC8vIEFTRSBTdGF0ZQotICAgICAgMHgwMSwgIC8vICdDb2RlYyBDb25maWd1cmVkJyBzdGF0ZQotICAgICAgLy8gRnJhbWluZwotICAgICAgMHgwMSwgIC8vIFVuZnJhbWVkCi0gICAgICAvLyBQZWZlcnJlZCBQSFkKLSAgICAgIDB4MDIsICAvLyAyTSBQSFkKLSAgICAgIC8vIFByZWZlcnJlZCByZXRyYW5zaW1zc2lvbiBOdW0uCi0gICAgICAweDA0LAotICAgICAgLy8gTWF4IHRyYW5zcG9ydCBMYXRlbmN5Ci0gICAgICAweDA1LAotICAgICAgMHgwMCwKLSAgICAgIC8vIFByZXNzZW50YXRpb24gZGVsYXkgbWluLgotICAgICAgMHgwMCwKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgLy8gUHJlc3NlbnRhdGlvbiBkZWxheSBtYXguCi0gICAgICAweDEwLAotICAgICAgMHgxMSwKLSAgICAgIDB4MTIsCi0gICAgICAvLyBQcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRlbGF5IG1pbi4KLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgMHgwMywKLSAgICAgIC8vIFByZWZlcnJlZCBwcmVzZW50YXRpb24gZGVsYXkgbWF4LgotICAgICAgMHgwOSwKLSAgICAgIDB4MTAsCi0gICAgICAweDExLAotICAgICAgLy8gQ29kZWMgSUQKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICAgICAgMHgwMywKLSAgICAgIDB4MDQsCi0gICAgICAweDA1LAotICAgICAgLy8gQ29kZWMgc3BlYy4gY29uZi4gbGVuZ3RoCi0gICAgICAweDA1LAotICAgICAgLy8gQ29kZWMgc3BlYy4gY29uZi4KLSAgICAgIDB4MEEsCi0gICAgICAweDBCLAotICAgICAgMHgwQywKLSAgICAgIDB4MEQsCi0gICAgICAweDBFLAotICB9OwotCi0gIC8vIFN0YXRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgcmlnaHQgYWZ0ZXIgdGhlIEFTRSBJRCBhbmQgc3RhdGUgYnl0ZXMKLSAgQVNTRVJUX1RSVUUoUGFyc2VBc2VTdGF0dXNDb2RlY0NvbmZpZ3VyZWRTdGF0ZVBhcmFtcygKLSAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLCBzaXplb2YodmFsdWUyKSAtIDIsIHZhbHVlMiArIDIpKTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmZyYW1pbmcsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9waHksIDB4MDJ1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9yZXRyYW5zX25iLCAweDA0dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3ksIDB4MDAwNXUpOwotICBBU1NFUlRfRVEoY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMucHJlc19kZWxheV9taW4sIDB4MDIwMTAwdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5wcmVzX2RlbGF5X21heCwgMHgxMjExMTB1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9wcmVzX2RlbGF5X21pbiwgMHgwMzAyMDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9wcmVzX2RlbGF5X21heCwgMHgxMTEwMDl1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLmNvZGluZ19mb3JtYXQsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkLCAweDAzMDJ1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCwgMHgwNTA0dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5jb2RlY19zcGVjX2NvbmYuc2l6ZSgpLCA1dSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5jb2RlY19zcGVjX2NvbmZbMF0sIDB4MEF1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX3NwZWNfY29uZlsxXSwgMHgwQnUpOwotICBBU1NFUlRfRVEoY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMuY29kZWNfc3BlY19jb25mWzJdLCAweDBDdSk7Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5jb2RlY19zcGVjX2NvbmZbM10sIDB4MER1KTsKLSAgQVNTRVJUX0VRKGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX3NwZWNfY29uZls0XSwgMHgwRXUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LAotICAgICB0ZXN0UGFyc2VBc2VTdGF0dXNRb3NDb25maWd1cmVkU3RhdGVQYXJhbXNJbnZhbGlkTGVuZ3RoKSB7Ci0gIHN0cnVjdCBhc2VfcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zIHJzcCB7Ci0gICAgLmNpZ19pZCA9IDAsIC5jaXNfaWQgPSAwCi0gIH07Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBBc2UgSUQKLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgU3RhdGUKLSAgICAgIDB4MDIsICAvLyAnUW9TIENvbmZpZ3VyZWQnIHN0YXRlCi0gICAgICAweDAzLCAgLy8gQ0lHX0lECi0gICAgICAweDA0LCAgLy8gQ0lTX0lECi0gIH07Ci0KLSAgUGFyc2VBc2VTdGF0dXNRb3NDb25maWd1cmVkU3RhdGVQYXJhbXMocnNwLCBzaXplb2YodmFsdWUxKSAtIDIsIHZhbHVlMSArIDIpOwotICBBU1NFUlRfRVEocnNwLmNpZ19pZCwgMCk7Ci0gIEFTU0VSVF9FUShyc3AuY2lzX2lkLCAwKTsKLQotICBjb25zdCB1aW50OF90IHZhbHVlMltdID0gewotICAgICAgLy8gQXNlIElECi0gICAgICAweDAxLAotICAgICAgLy8gQVNFIFN0YXRlCi0gICAgICAweDAyLCAgLy8gJ1FvUyBDb25maWd1cmVkJyBzdGF0ZQotICAgICAgICAgICAgIC8vIENJR19JRAotICAgICAgMHgwMywKLSAgICAgIC8vIENJU19JRAotICAgICAgMHgwNCwKLSAgICAgIC8vIFNEVSBJbnRlcnZhbAotICAgICAgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAgIC8vIEZyYW1pbmcKLSAgICAgIDB4MDEsCi0gICAgICAvLyBQSFkKLSAgICAgIDB4MDIsCi0gICAgICAvLyBNYXggU0RVCi0gICAgICAweDA4LCAweDA5LAotICAgICAgLy8gUmV0cmFuc21pc3Npb24gTnVtLgotICAgICAgMHgwQSwKLSAgICAgIC8vIE1heCBUcmFuc3BvcnQgTGF0ZW5jeQotICAgICAgMHgwQiwgMHgwQywKLSAgICAgIC8vIFByZXNlbnRhdGlvbiBEZWxheQotICAgICAgMHgwRCwgMHgwRSwKLSAgICAgIC8vIE1pc3NpbmcgQnl0ZQotICB9OwotCi0gIFBhcnNlQXNlU3RhdHVzUW9zQ29uZmlndXJlZFN0YXRlUGFyYW1zKHJzcCwgc2l6ZW9mKHZhbHVlMikgLSAyLCB2YWx1ZTIgKyAyKTsKLSAgQVNTRVJUX0VRKHJzcC5jaWdfaWQsIDApOwotICBBU1NFUlRfRVEocnNwLmNpc19pZCwgMCk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQYXJzZUFzZVN0YXR1c1Fvc0NvbmZpZ3VyZWRTdGF0ZVBhcmFtcykgewotICBzdHJ1Y3QgYXNlX3Fvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyByc3A7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWVbXSA9IHsKLSAgICAgIC8vIEFzZSBJRAotICAgICAgMHgwMSwKLSAgICAgIC8vIEFTRSBTdGF0ZSAtICdRb1MgQ29uZmlndXJlZCcKLSAgICAgIDB4MDIsCi0gICAgICAvLyBDSUdfSUQKLSAgICAgIDB4MDMsCi0gICAgICAvLyBDSVNfSUQKLSAgICAgIDB4MDQsCi0gICAgICAvLyBTRFUgSW50ZXJ2YWwKLSAgICAgIDB4MDUsCi0gICAgICAweDA2LAotICAgICAgMHgwNywKLSAgICAgIC8vIEZyYW1pbmcKLSAgICAgIDB4MDEsCi0gICAgICAvLyBQSFkKLSAgICAgIDB4MDIsCi0gICAgICAvLyBNYXggU0RVCi0gICAgICAweDE4LAotICAgICAgMHgxOSwKLSAgICAgIC8vIFJldHJhbnNtaXNzaW9uIE51bS4KLSAgICAgIDB4MUEsCi0gICAgICAvLyBNYXggVHJhbnNwb3J0IExhdGVuY3kKLSAgICAgIDB4MUIsCi0gICAgICAweDFDLAotICAgICAgLy8gUHJlc2VudGF0aW9uIERlbGF5Ci0gICAgICAweDFELAotICAgICAgMHgxRSwKLSAgICAgIDB4MUYsCi0gIH07Ci0KLSAgUGFyc2VBc2VTdGF0dXNRb3NDb25maWd1cmVkU3RhdGVQYXJhbXMocnNwLCBzaXplb2YodmFsdWUpIC0gMiwgdmFsdWUgKyAyKTsKLSAgQVNTRVJUX0VRKHJzcC5jaWdfaWQsIDB4MDN1KTsKLSAgQVNTRVJUX0VRKHJzcC5jaXNfaWQsIDB4MDR1KTsKLSAgQVNTRVJUX0VRKHJzcC5zZHVfaW50ZXJ2YWwsIDB4MDcwNjA1dSk7Ci0gIEFTU0VSVF9FUShyc3AuZnJhbWluZywgMHgwMXUpOwotICBBU1NFUlRfRVEocnNwLnBoeSwgMHgwMnUpOwotICBBU1NFUlRfRVEocnNwLm1heF9zZHUsIDB4MTkxOHUpOwotICBBU1NFUlRfRVEocnNwLnJldHJhbnNfbmIsIDB4MUF1KTsKLSAgQVNTRVJUX0VRKHJzcC5tYXhfdHJhbnNwb3J0X2xhdGVuY3ksIDB4MUMxQnUpOwotICBBU1NFUlRfRVEocnNwLnByZXNfZGVsYXksIDB4MUYxRTFEdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsCi0gICAgIHRlc3RQYXJzZUFzZVN0YXR1c1RyYW5zaWVudFN0YXRlUGFyYW1zSW52YWxpZExlbmd0aCkgewotICBhc2VfdHJhbnNpZW50X3N0YXRlX3BhcmFtcyBwYXJhbXM7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBBc2UgSUQKLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgU3RhdGUKLSAgICAgIDB4MDMsICAvLyAnRW5hYmxpbmcnIHN0YXRlCi0gICAgICAgICAgICAgLy8gbWlzc2luZyBNZXRhZGF0YSBsZW5ndGgKLSAgICAgICAgICAgICAvLyBtaXNzaW5nIE1ldGFkYXRhCi0gIH07Ci0gIFBhcnNlQXNlU3RhdHVzVHJhbnNpZW50U3RhdGVQYXJhbXMocGFyYW1zLCBzaXplb2YodmFsdWUxKSAtIDIsIHZhbHVlMSArIDIpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VBc2VTdGF0dXNUcmFuc2llbnRTdGF0ZVBhcmFtcykgewotICBhc2VfdHJhbnNpZW50X3N0YXRlX3BhcmFtcyBwYXJhbXM7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBBc2UgSUQKLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgU3RhdGUKLSAgICAgIDB4MDMsICAvLyAnRW5hYmxpbmcnIHN0YXRlCi0gICAgICAvLyBNZXRhZGF0YSBsZW5ndGgKLSAgICAgIDB4MDAsCi0gIH07Ci0gIFBhcnNlQXNlU3RhdHVzVHJhbnNpZW50U3RhdGVQYXJhbXMocGFyYW1zLCBzaXplb2YodmFsdWUxKSAtIDIsIHZhbHVlMSArIDIpOwotICBBU1NFUlRfRVEocGFyYW1zLm1ldGFkYXRhLnNpemUoKSwgMHUpOwotCi0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUyW10gPSB7Ci0gICAgICAvLyBBc2UgSUQKLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgU3RhdGUKLSAgICAgIDB4MDMsICAvLyAnRW5hYmxpbmcnIHN0YXRlCi0gICAgICAvLyBDSUdfSUQKLSAgICAgIDB4MDMsCi0gICAgICAvLyBDSVNfSUQKLSAgICAgIDB4MDQsCi0gICAgICAvLyBNZXRhZGF0YSBsZW5ndGgKLSAgICAgIDB4MDMsCi0gICAgICAvLyBNZXRhZGF0YQotICAgICAgMHgwMiwgIC8vIFswXS5sZW5ndGgKLSAgICAgIDB4MDEsICAvLyBbMF0udHlwZQotICAgICAgMHgwMCwgIC8vIFswXS52YWx1ZVswXQotICB9OwotICBQYXJzZUFzZVN0YXR1c1RyYW5zaWVudFN0YXRlUGFyYW1zKHBhcmFtcywgc2l6ZW9mKHZhbHVlMikgLSAyLCB2YWx1ZTIgKyAyKTsKLQotICBBU1NFUlRfRVEocGFyYW1zLm1ldGFkYXRhLnNpemUoKSwgM3UpOwotICBBU1NFUlRfRVEocGFyYW1zLm1ldGFkYXRhWzBdLCAweDAydSk7Ci0gIEFTU0VSVF9FUShwYXJhbXMubWV0YWRhdGFbMV0sIDB4MDF1KTsKLSAgQVNTRVJUX0VRKHBhcmFtcy5tZXRhZGF0YVsyXSwgMHgwMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VBc2VDdHBOb3RpZmljYXRpb25JbnZhbGlkTGVuZ3RoKSB7Ci0gIGN0cF9udGYgbnRmOwotICBjb25zdCB1aW50OF90IHZhbHVlMVtdID0gewotICAgICAgLy8gT3Bjb2RlCi0gICAgICAweDAxLAotICAgICAgLy8gTnVtYmVyIG9mIEFTRXMKLSAgICAgIDB4MDIsCi0gICAgICAvLyBBU0UgSUQKLSAgICAgIDB4MDEsCi0gICAgICAvLyBSZXNwb25zZSBDb2RlCi0gICAgICAweDAxLAotICAgICAgLy8gUmVhc29uCi0gICAgICAweDAxLAotICAgICAgLy8gQVNFIElECi0gICAgICAweDAyLAotICAgICAgLy8gUmVzcG9uc2UgQ29kZQotICAgICAgMHgwMiwKLSAgICAgIC8vIE1pc3NpbmcgUmVhc29uCi0gIH07Ci0gIFBhcnNlQXNlQ3RwTm90aWZpY2F0aW9uKG50Ziwgc2l6ZW9mKHZhbHVlMSksIHZhbHVlMSk7Ci0KLSAgLy8gSW4gY2FzZSBvZiBpbnZhbGlkIHBheWxvYWQgYXQgbGVhc3Qgd2UgZ2V0IHRoZSBvcGNvZGUKLSAgQVNTRVJUX0VRKG50Zi5vcCwgMHgwMXUpOwotICBBU1NFUlRfRVEobnRmLmVudHJpZXMuc2l6ZSgpLCAwdSk7Ci0KLSAgY29uc3QgdWludDhfdCB2YWx1ZTJbXSA9IHsKLSAgICAgIC8vIE9wY29kZQotICAgICAgMHgwMSwKLSAgICAgIC8vIE1pc3NpbmcgTnVtYmVyIG9mIEFTRXMKLSAgICAgIC8vIE1pc3NpbmcgQVNFIElECi0gICAgICAvLyBNaXNzaW5nIFJlc3BvbnNlIENvZGUKLSAgICAgIC8vIE1pc3NpbmcgUmVhc29uCi0gICAgICAvLyBNaXNzaW5nIEFTRSBJRAotICAgICAgLy8gTWlzc2luZyBSZXNwb25zZSBDb2RlCi0gICAgICAvLyBNaXNzaW5nIFJlYXNvbgotICB9OwotICBudGYuZW50cmllcy5jbGVhcigpOwotICBQYXJzZUFzZUN0cE5vdGlmaWNhdGlvbihudGYsIHNpemVvZih2YWx1ZTIpLCB2YWx1ZTIpOwotCi0gIC8vIEluIGNhc2Ugb2YgaW52YWxpZCBwYXlsb2FkIGF0IGxlYXN0IHdlIGdldCB0aGUgb3Bjb2RlCi0gIEFTU0VSVF9FUShudGYub3AsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKG50Zi5lbnRyaWVzLnNpemUoKSwgMHUpOwotCi0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUzW10gPSB7Ci0gICAgICAvLyBPcGNvZGUKLSAgICAgIDB4MDEsCi0gICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICAgICAgMHgwMywKLSAgICAgIC8vIEFTRSBJRAotICAgICAgMHgwMSwKLSAgICAgIC8vIFJlc3BvbnNlIENvZGUKLSAgICAgIDB4MDEsCi0gICAgICAvLyBSZWFzb24KLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgSUQKLSAgICAgIDB4MDIsCi0gICAgICAvLyBSZXNwb25zZSBDb2RlCi0gICAgICAweDAyLAotICAgICAgLy8gUmVhc29uCi0gICAgICAweDAzLAotICAgICAgLy8gTWlzc2luZyB0aGUgZW50aXJlIEFTRSBlbnRyeQotICB9OwotCi0gIG50Zi5lbnRyaWVzLmNsZWFyKCk7Ci0gIFBhcnNlQXNlQ3RwTm90aWZpY2F0aW9uKG50Ziwgc2l6ZW9mKHZhbHVlMyksIHZhbHVlMyk7Ci0gIC8vIEluIGNhc2Ugb2YgaW52YWxpZCBwYXlsb2FkIGF0IGxlYXN0IHdlIGdldCB0aGUgb3Bjb2RlCi0gIEFTU0VSVF9FUShudGYub3AsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKG50Zi5lbnRyaWVzLnNpemUoKSwgMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UGFyc2VBc2VDdHBOb3RpZmljYXRpb24pIHsKLSAgY3RwX250ZiBudGY7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsdWUxW10gPSB7Ci0gICAgICAvLyBPcGNvZGUKLSAgICAgIDB4MDEsCi0gICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICAgICAgMHgwMiwKLSAgICAgIC8vIEFTRSBJRAotICAgICAgMHgwMSwKLSAgICAgIC8vIFJlc3BvbnNlIENvZGUKLSAgICAgIDB4MDEsCi0gICAgICAvLyBSZWFzb24KLSAgICAgIDB4MDEsCi0gICAgICAvLyBBU0UgSUQKLSAgICAgIDB4MDMsCi0gICAgICAvLyBSZXNwb25zZSBDb2RlCi0gICAgICAweDAyLAotICAgICAgLy8gUmVhc29uCi0gICAgICAweDAzLAotICB9OwotICBQYXJzZUFzZUN0cE5vdGlmaWNhdGlvbihudGYsIHNpemVvZih2YWx1ZTEpLCB2YWx1ZTEpOwotCi0gIEFTU0VSVF9FUShudGYub3AsIDB4MDF1KTsKLSAgQVNTRVJUX0VRKG50Zi5lbnRyaWVzLnNpemUoKSwgMnUpOwotICBBU1NFUlRfRVEobnRmLmVudHJpZXNbMF0uYXNlX2lkLCAweDAxdSk7Ci0gIEFTU0VSVF9FUShudGYuZW50cmllc1swXS5yZXNwb25zZV9jb2RlLCAweDAxdSk7Ci0gIEFTU0VSVF9FUShudGYuZW50cmllc1swXS5yZWFzb24sIDB4MDEpOwotICBBU1NFUlRfRVEobnRmLmVudHJpZXNbMV0uYXNlX2lkLCAweDAzdSk7Ci0gIEFTU0VSVF9FUShudGYuZW50cmllc1sxXS5yZXNwb25zZV9jb2RlLCAweDAydSk7Ci0gIEFTU0VSVF9FUShudGYuZW50cmllc1sxXS5yZWFzb24sIDB4MDMpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnRW1wdHkpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9jb2RlY19jb25mPiBjb25mczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgUHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnKGNvbmZzLCB2YWx1ZSk7Ci0KLSAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnU2luZ2xlKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0cnVjdCBjdHBfY29kZWNfY29uZj4gY29uZnM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIHR5cGVzOjpMZUF1ZGlvQ29kZWNJZCBjb2RlY19pZHsuY29kaW5nX2Zvcm1hdCA9IDB4MDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX2NvbXBhbnlfaWQgPSAweDAyMDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX2NvZGVjX2lkID0gMHgwNDA1fTsKLSAgdHlwZXM6OkxlQXVkaW9MYzNDb25maWcgY29kZWNfY29uZnsuc2FtcGxpbmdfZnJlcXVlbmN5ID0gMHgxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWVfZHVyYXRpb24gPSAweDAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24gPSAweDA0MDUwNjA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lID0gMHgwMjAzfTsKLQotICBjb25mcy5wdXNoX2JhY2soY3RwX2NvZGVjX2NvbmZ7Ci0gICAgICAuYXNlX2lkID0gMHgwNSwKLSAgICAgIC50YXJnZXRfbGF0ZW5jeSA9IDB4MDMsCi0gICAgICAudGFyZ2V0X3BoeSA9IDB4MDIsCi0gICAgICAuY29kZWNfaWQgPSBjb2RlY19pZCwKLSAgICAgIC5jb2RlY19jb25maWcgPSBjb2RlY19jb25mLAotICB9KTsKLSAgUHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnKGNvbmZzLCB2YWx1ZSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMSk7ICAvLyBDb25maWcgQ29kZWMgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAxKTsgIC8vIE51bWJlciBvZiBBU0VzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA1KTsgIC8vIEFTRVswXSBBU0UgSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgLy8gQVNFWzBdIFRhcmdldCBMYXRlbmN5Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgIC8vIEFTRVswXSBUYXJnZXQgUGh5Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA2KTsgIC8vIEFTRVswXS5Db2RlY0lEIENvZGluZyBGb3JtYXQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29tcGFueSBJRCBMU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29tcGFueSBJRCBNU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDUpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29kZWMgSUQgTFNCCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0KTsgIC8vIEFTRVswXS5Db2RlY0lEIENvZGVjIElEIE1TQgotCi0gIC8vIEFTRVswXS5Db2RlYyBTcGVjLiBDb25mLiBMZW5ndGggLSBMQzMgc3BlY2lmaWMKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDggKyA4KTsgIC8vICogNCoyIGJ5dGVzIGZvciA0IExUViB0eXBlcyBhbmQgbGVuZ3RocyArIDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIGZvciB0aGUgdmFsdWVzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBTYW1wbGluZyBGcmVxLiBMZW5ndGgKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDEpOyAgIC8vIFNhbXBsaW5nIEZyZXEuIFR5cGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTApOyAgIC8vIFNhbXBsaW5nIEZyZXEuIFZhbHVlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBGcmFtZSBEdXJhdGlvbi4gTGVuZ3RoCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBGcmFtZSBEdXJhdGlvbi4gVHlwZQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMyk7ICAgLy8gRnJhbWUgRHVyYXRpb24uIFZhbHVlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA1KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIExlbmd0aAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMyk7ICAgLy8gQXVkaW8gQ2hhbm5lbCBBbGxvY2F0aW9ucyBUeXBlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA3KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA2KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA1KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzJdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzNdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIExlbmd0aAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwNCk7ICAgLy8gT2N0ZXRzIFBlciBGcmFtZSBUeXBlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIFZhbHVlWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIFZhbHVlWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZS5zaXplKCksIGkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnTXVsdGlwbGUpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9jb2RlY19jb25mPiBjb25mczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgdHlwZXM6OkxlQXVkaW9Db2RlY0lkIGNvZGVjX2lkey5jb2RpbmdfZm9ybWF0ID0gMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3JfY29tcGFueV9pZCA9IDB4MDIwMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3JfY29kZWNfaWQgPSAweDA0MDV9OwotICB0eXBlczo6TGVBdWRpb0xjM0NvbmZpZyBjb2RlY19jb25mey5zYW1wbGluZ19mcmVxdWVuY3kgPSAweDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcmFtZV9kdXJhdGlvbiA9IDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NoYW5uZWxfYWxsb2NhdGlvbiA9IDB4MDQwNTA2MDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9jdGV0c19wZXJfY29kZWNfZnJhbWUgPSAweDAyMDN9OwotCi0gIGNvbmZzLnB1c2hfYmFjayhjdHBfY29kZWNfY29uZnsKLSAgICAgIC5hc2VfaWQgPSAweDA1LAotICAgICAgLnRhcmdldF9sYXRlbmN5ID0gMHgwMywKLSAgICAgIC50YXJnZXRfcGh5ID0gMHgwMiwKLSAgICAgIC5jb2RlY19pZCA9IGNvZGVjX2lkLAotICAgICAgLmNvZGVjX2NvbmZpZyA9IGNvZGVjX2NvbmYsCi0gIH0pOwotICBQcmVwYXJlQXNlQ3RwQ29kZWNDb25maWcoY29uZnMsIHZhbHVlKTsKLQotICB1aW50OF90IGkgPSAwOwotICBBU1NFUlRfTkUodmFsdWUuc2l6ZSgpLCAwdSk7Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAxKTsgIC8vIENvbmZpZyBDb2RlYyBPcGNvZGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDEpOyAgLy8gTnVtYmVyIG9mIEFTRXMKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDUpOyAgLy8gQVNFWzBdIEFTRSBJRAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMyk7ICAvLyBBU0VbMF0gVGFyZ2V0IExhdGVuY3kKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgLy8gQVNFWzBdIFRhcmdldCBQaHkKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDYpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29kaW5nIEZvcm1hdAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMyk7ICAvLyBBU0VbMF0uQ29kZWNJRCBDb21wYW55IElEIExTQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMik7ICAvLyBBU0VbMF0uQ29kZWNJRCBDb21wYW55IElEIE1TQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwNSk7ICAvLyBBU0VbMF0uQ29kZWNJRCBDb2RlYyBJRCBMU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDQpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29kZWMgSUQgTVNCCi0KLSAgLy8gQVNFWzBdLkNvZGVjIFNwZWMuIENvbmYuIExlbmd0aCAtIExDMyBzcGVjaWZpYwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgOCArIDgpOyAgLy8gKiA0KjIgYnl0ZXMgZm9yIDQgTFRWIHR5cGVzIGFuZCBsZW5ndGhzICsgOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgZm9yIHRoZSB2YWx1ZXMKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIFNhbXBsaW5nIEZyZXEuIExlbmd0aAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMSk7ICAgLy8gU2FtcGxpbmcgRnJlcS4gVHlwZQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMCk7ICAgLy8gU2FtcGxpbmcgRnJlcS4gVmFsdWUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIEZyYW1lIER1cmF0aW9uLiBMZW5ndGgKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIEZyYW1lIER1cmF0aW9uLiBUeXBlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBGcmFtZSBEdXJhdGlvbi4gVmFsdWUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDUpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgTGVuZ3RoCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFR5cGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDcpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDYpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbMV0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDUpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbMl0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDQpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbM10KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgIC8vIE9jdGV0cyBQZXIgRnJhbWUgTGVuZ3RoCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0KTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIFR5cGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgIC8vIE9jdGV0cyBQZXIgRnJhbWUgVmFsdWVbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIE9jdGV0cyBQZXIgRnJhbWUgVmFsdWVbMV0KLSAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgaSk7Ci0KLSAgdHlwZXM6OkxlQXVkaW9Db2RlY0lkIGNvZGVjX2lkMnsuY29kaW5nX2Zvcm1hdCA9IDB4MTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9jb21wYW55X2lkID0gMHgxMjEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3JfY29kZWNfaWQgPSAweDE0MTV9OwotICB0eXBlczo6TGVBdWRpb0xjM0NvbmZpZyBjb2RlY19jb25mMnsuc2FtcGxpbmdfZnJlcXVlbmN5ID0gMHgxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1lX2R1cmF0aW9uID0gMHgxMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NoYW5uZWxfYWxsb2NhdGlvbiA9IDB4MTQxNTE2MTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lID0gMHgxMjEzfTsKLQotICBjb25mcy5wdXNoX2JhY2soY3RwX2NvZGVjX2NvbmZ7Ci0gICAgICAuYXNlX2lkID0gMHgxNSwKLSAgICAgIC50YXJnZXRfbGF0ZW5jeSA9IDB4MTMsCi0gICAgICAudGFyZ2V0X3BoeSA9IDB4MDEsCi0gICAgICAuY29kZWNfaWQgPSBjb2RlY19pZDIsCi0gICAgICAuY29kZWNfY29uZmlnID0gY29kZWNfY29uZjIsCi0gIH0pOwotICBQcmVwYXJlQXNlQ3RwQ29kZWNDb25maWcoY29uZnMsIHZhbHVlKTsKLQotICBpID0gMDsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMSk7ICAvLyBDb25maWcgQ29kZWMgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgIC8vIE51bWJlciBvZiBBU0VzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA1KTsgIC8vIEFTRVswXSBBU0UgSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgLy8gQVNFWzBdIFRhcmdldCBMYXRlbmN5Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgIC8vIEFTRVswXSBUYXJnZXQgUGh5Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA2KTsgIC8vIEFTRVswXS5Db2RlY0lEIENvZGluZyBGb3JtYXQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29tcGFueSBJRCBMU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29tcGFueSBJRCBNU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDUpOyAgLy8gQVNFWzBdLkNvZGVjSUQgQ29kZWMgSUQgTFNCCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0KTsgIC8vIEFTRVswXS5Db2RlY0lEIENvZGVjIElEIE1TQgotCi0gIC8vIEFTRVswXS5Db2RlYyBTcGVjLiBDb25mLiBMZW5ndGggLSBMQzMgc3BlY2lmaWMKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDggKyA4KTsgIC8vICogNCoyIGJ5dGVzIGZvciA0IExUViB0eXBlcyBhbmQgbGVuZ3RocyArIDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIGZvciB0aGUgdmFsdWVzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBTYW1wbGluZyBGcmVxLiBMZW5ndGgKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDEpOyAgIC8vIFNhbXBsaW5nIEZyZXEuIFR5cGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTApOyAgIC8vIFNhbXBsaW5nIEZyZXEuIFZhbHVlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBGcmFtZSBEdXJhdGlvbi4gTGVuZ3RoCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBGcmFtZSBEdXJhdGlvbi4gVHlwZQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMyk7ICAgLy8gRnJhbWUgRHVyYXRpb24uIFZhbHVlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA1KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIExlbmd0aAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMyk7ICAgLy8gQXVkaW8gQ2hhbm5lbCBBbGxvY2F0aW9ucyBUeXBlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA3KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA2KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA1KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzJdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0KTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFZhbHVlWzNdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIExlbmd0aAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwNCk7ICAgLy8gT2N0ZXRzIFBlciBGcmFtZSBUeXBlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIFZhbHVlWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAyKTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIFZhbHVlWzFdCi0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTUpOyAgLy8gQVNFWzFdIEFTRSBJRAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMyk7ICAvLyBBU0VbMV0gVGFyZ2V0IExhdGVuY3kKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDEpOyAgLy8gQVNFWzFdIFRhcmdldCBQaHkKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTYpOyAgLy8gQVNFWzFdLkNvZGVjSUQgQ29kaW5nIEZvcm1hdAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMyk7ICAvLyBBU0VbMV0uQ29kZWNJRCBDb21wYW55IElEIExTQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMik7ICAvLyBBU0VbMV0uQ29kZWNJRCBDb21wYW55IElEIE1TQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxNSk7ICAvLyBBU0VbMV0uQ29kZWNJRCBDb2RlYyBJRCBMU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTQpOyAgLy8gQVNFWzFdLkNvZGVjSUQgQ29kZWMgSUQgTVNCCi0KLSAgLy8gQVNFWzFdLkNvZGVjIFNwZWMuIENvbmYuIExlbmd0aCAtIExDMyBzcGVjaWZpYwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgOCArIDgpOyAgLy8gKiA0KjIgYnl0ZXMgZm9yIDQgTFRWIHR5cGVzIGFuZCBsZW5ndGhzICsgOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgZm9yIHRoZSB2YWx1ZXMKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIFNhbXBsaW5nIEZyZXEuIExlbmd0aAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMSk7ICAgLy8gU2FtcGxpbmcgRnJlcS4gVHlwZQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMSk7ICAgLy8gU2FtcGxpbmcgRnJlcS4gVmFsdWUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIEZyYW1lIER1cmF0aW9uLiBMZW5ndGgKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDIpOyAgIC8vIEZyYW1lIER1cmF0aW9uLiBUeXBlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDEzKTsgICAvLyBGcmFtZSBEdXJhdGlvbi4gVmFsdWUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDUpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgTGVuZ3RoCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzKTsgICAvLyBBdWRpbyBDaGFubmVsIEFsbG9jYXRpb25zIFR5cGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTcpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTYpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbMV0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTUpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbMl0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTQpOyAgIC8vIEF1ZGlvIENoYW5uZWwgQWxsb2NhdGlvbnMgVmFsdWVbM10KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDMpOyAgIC8vIE9jdGV0cyBQZXIgRnJhbWUgTGVuZ3RoCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0KTsgICAvLyBPY3RldHMgUGVyIEZyYW1lIFR5cGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTMpOyAgIC8vIE9jdGV0cyBQZXIgRnJhbWUgVmFsdWVbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTIpOyAgIC8vIE9jdGV0cyBQZXIgRnJhbWUgVmFsdWVbMV0KLQotICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCBpKTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFByZXBhcmVBc2VDdHBDb25maWdRb3NFbXB0eSkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgY3RwX3Fvc19jb25mPiBjb25mczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgUHJlcGFyZUFzZUN0cENvbmZpZ1Fvcyhjb25mcywgdmFsdWUpOwotICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCAwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwQ29uZmlnUW9zU2luZ2xlKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0cnVjdCBjdHBfcW9zX2NvbmY+IGNvbmZzOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICBjb25zdCBjdHBfcW9zX2NvbmYgY29uZnsuYXNlX2lkID0gMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZyA9IDB4MTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXMgPSAweDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsID0gMHgwMDEzMTQxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAweDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5ID0gMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHUgPSAweDAyMDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXRyYW5zX25iID0gMHgwNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IDB4MDMwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNfZGVsYXkgPSAweDAwMTIxMzE0fTsKLSAgY29uZnMucHVzaF9iYWNrKGNvbmYpOwotCi0gIFByZXBhcmVBc2VDdHBDb25maWdRb3MoY29uZnMsIHZhbHVlKTsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAydSk7ICAvLyBDb25maWcgUU9TIE9wY29kZQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMXUpOyAgLy8gTnVtYmVyIG9mIEFTRQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMXUpOyAgLy8gQVNFIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDExdSk7ICAvLyBDSUcgSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTJ1KTsgIC8vIENJUyBJRAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxNXUpOyAgLy8gU0RVIEludGVydmFsIFswXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxNHUpOyAgLy8gU0RVIEludGVydmFsIFsxXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxM3UpOyAgLy8gU0RVIEludGVydmFsIFsyXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMXUpOyAgLy8gRnJhbWluZwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMXUpOyAgLy8gUGh5Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzdSk7ICAvLyBNYXggU0RVIExTQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMnUpOyAgLy8gTWF4IFNEVSBNU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDR1KTsgIC8vIFJldHJhbnNtaXNzaW9uCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAydSk7ICAvLyBNYXguIFRyYW5zLiBMYXRlbmN5IExTQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwM3UpOyAgLy8gTWF4LiBUcmFucy4gTGF0ZW5jeSBNU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTR1KTsgIC8vIFByZXMuIERlbGF5WzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDEzdSk7ICAvLyBQcmVzLiBEZWxheVsxXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMnUpOyAgLy8gUHJlcy4gRGVsYXlbMl0KLSAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgaSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwQ29uZmlnUW9zTXVsdGlwbGUpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF9xb3NfY29uZj4gY29uZnM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIGNvbnN0IGN0cF9xb3NfY29uZiBjb25mey5hc2VfaWQgPSAweDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnID0gMHgxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpcyA9IDB4MTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWwgPSAweDEzMTQxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAweDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5ID0gMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHUgPSAweDAyMDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXRyYW5zX25iID0gMHgwNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IDB4MDMwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNfZGVsYXkgPSAweDEyMTMxNH07Ci0gIGNvbmZzLnB1c2hfYmFjayhjb25mKTsKLQotICBjb25zdCBjdHBfcW9zX2NvbmYgY29uZjJ7LmFzZV9pZCA9IDB4MTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnID0gMHgyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXMgPSAweDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbCA9IDB4MjMyNDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdSA9IDB4MjIyMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXRyYW5zX25iID0gMHgyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPSAweDIzMjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc19kZWxheSA9IDB4MjIyMzI0fTsKLSAgY29uZnMucHVzaF9iYWNrKGNvbmYyKTsKLQotICBQcmVwYXJlQXNlQ3RwQ29uZmlnUW9zKGNvbmZzLCB2YWx1ZSk7Ci0gIEFTU0VSVF9ORSh2YWx1ZS5zaXplKCksIDB1KTsKLQotICB1aW50OF90IGkgPSAwOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMnUpOyAgLy8gQ29uZmlnIFFPUyBPcGNvZGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDJ1KTsgIC8vIE51bWJlciBvZiBBU0UKLSAgLy8gMXN0IEFTRSBDb25maWcKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDF1KTsgIC8vIEFTRSBJRAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQ0lHIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDEydSk7ICAvLyBDSVMgSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTV1KTsgIC8vIFNEVSBJbnRlcnZhbCBbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTR1KTsgIC8vIFNEVSBJbnRlcnZhbCBbMV0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTN1KTsgIC8vIFNEVSBJbnRlcnZhbCBbMl0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDF1KTsgIC8vIEZyYW1pbmcKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDF1KTsgIC8vIFBoeQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwM3UpOyAgLy8gTWF4IFNEVSBMU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDJ1KTsgIC8vIE1heCBTRFUgTVNCCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA0dSk7ICAvLyBSZXRyYW5zbWlzc2lvbgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMnUpOyAgLy8gTWF4LiBUcmFucy4gTGF0ZW5jeSBMU0IKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDN1KTsgIC8vIE1heC4gVHJhbnMuIExhdGVuY3kgTVNCCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDE0dSk7ICAvLyBQcmVzLiBEZWxheVswXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxM3UpOyAgLy8gUHJlcy4gRGVsYXlbMV0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MTJ1KTsgIC8vIFByZXMuIERlbGF5WzJdCi0gIC8vIDJuZCBBU0UgQ29uZmlnCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDExdSk7ICAvLyBBU0UgSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjF1KTsgIC8vIENJRyBJRAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgyMnUpOyAgLy8gQ0lTIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDI1dSk7ICAvLyBTRFUgSW50ZXJ2YWwgWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDI0dSk7ICAvLyBTRFUgSW50ZXJ2YWwgWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIzdSk7ICAvLyBTRFUgSW50ZXJ2YWwgWzJdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAydSk7ICAvLyBGcmFtaW5nCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAydSk7ICAvLyBQaHkKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjN1KTsgIC8vIE1heCBTRFUgTFNCCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIydSk7ICAvLyBNYXggU0RVIE1TQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgyNHUpOyAgLy8gUmV0cmFuc21pc3Npb24KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjJ1KTsgIC8vIE1heC4gVHJhbnMuIExhdGVuY3kgTFNCCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIzdSk7ICAvLyBNYXguIFRyYW5zLiBMYXRlbmN5IE1TQgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgyNHUpOyAgLy8gUHJlcy4gRGVsYXlbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjN1KTsgIC8vIFByZXMuIERlbGF5WzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIydSk7ICAvLyBQcmVzLiBEZWxheVsyXQotCi0gIEFTU0VSVF9FUSh2YWx1ZS5zaXplKCksIGkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cEVuYWJsZUVtcHR5KSB7Ci0gIHN0ZDo6dmVjdG9yPHN0cnVjdCBjdHBfZW5hYmxlPiBjb25mczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgUHJlcGFyZUFzZUN0cEVuYWJsZShjb25mcywgdmFsdWUpOwotICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCAwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwRW5hYmxlU2luZ2xlKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0cnVjdCBjdHBfZW5hYmxlPiBjb25mczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgY3RwX2VuYWJsZSBjb25mey5hc2VfaWQgPSAweDExLCAubWV0YWRhdGEgPSB7MHgwMiwgMHgyMiwgMHgyMX19OwotICBjb25mcy5wdXNoX2JhY2soY29uZik7Ci0KLSAgUHJlcGFyZUFzZUN0cEVuYWJsZShjb25mcywgdmFsdWUpOwotICBBU1NFUlRfTkUodmFsdWUuc2l6ZSgpLCAwdSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDN1KTsgIC8vIEVuYWJsZSBPcGNvZGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDF1KTsgIC8vIE51bWJlciBvZiBBU0VzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDExdSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDN1KTsgIC8vIE1ldGFkYXRhIExlbgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwMnUpOyAgLy8gTWV0YWRhdGFbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjJ1KTsgIC8vIE1ldGFkYXRhWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIxdSk7ICAvLyBNZXRhZGF0YVsyXQotICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCBpKTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFByZXBhcmVBc2VDdHBFbmFibGVNdWx0aXBsZSkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgY3RwX2VuYWJsZT4gY29uZnM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIGN0cF9lbmFibGUgY29uZnsuYXNlX2lkID0gMHgxMSwgLm1ldGFkYXRhID0gezB4MDIsIDB4MjIsIDB4MjF9fTsKLSAgY29uZnMucHVzaF9iYWNrKGNvbmYpOwotCi0gIGN0cF9lbmFibGUgY29uZjJ7LmFzZV9pZCA9IDB4MjEsIC5tZXRhZGF0YSA9IHsweDAzLCAweDM1LCAweDM2LCAweDM3fX07Ci0gIGNvbmZzLnB1c2hfYmFjayhjb25mMik7Ci0KLSAgUHJlcGFyZUFzZUN0cEVuYWJsZShjb25mcywgdmFsdWUpOwotICBBU1NFUlRfTkUodmFsdWUuc2l6ZSgpLCAwdSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDN1KTsgIC8vIEVuYWJsZSBPcGNvZGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDJ1KTsgIC8vIE51bWJlciBvZiBBU0VzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDExdSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDN1KTsgIC8vIEFTRVswXSBNZXRhZGF0YSBMZW4KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDJ1KTsgIC8vIEFTRVswXSBNZXRhZGF0YVswXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgyMnUpOyAgLy8gQVNFWzBdIE1ldGFkYXRhWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIxdSk7ICAvLyBBU0VbMF0gTWV0YWRhdGFbMl0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjF1KTsgIC8vIEFTRVsxXSBJRAotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwNHUpOyAgLy8gQVNFWzFdIE1ldGFkYXRhIExlbgotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwM3UpOyAgLy8gQVNFWzFdIE1ldGFkYXRhWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDM1dSk7ICAvLyBBU0VbMV0gTWV0YWRhdGFbMV0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MzZ1KTsgIC8vIEFTRVsxXSBNZXRhZGF0YVsyXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgzN3UpOyAgLy8gQVNFWzFdIE1ldGFkYXRhWzNdCi0gIEFTU0VSVF9FUSh2YWx1ZS5zaXplKCksIGkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdGFydFJlYWR5RW1wdHkpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXNlX2lkczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgUHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdGFydFJlYWR5KGFzZV9pZHMsIHZhbHVlKTsKLSAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdGFydFJlYWR5U2luZ2xlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFzZV9pZHM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIGFzZV9pZHMucHVzaF9iYWNrKDB4MTEpOwotCi0gIFByZXBhcmVBc2VDdHBBdWRpb1JlY2VpdmVyU3RhcnRSZWFkeShhc2VfaWRzLCB2YWx1ZSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwNHUpOyAgLy8gUmVjZWl2ZXIgU3RhcnQgUmVhZHkgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAxdSk7ICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUShpLCB2YWx1ZS5zaXplKCkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LAotICAgICB0ZXN0UHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdGFydFJlYWR5TXVsdGlwbGUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXNlX2lkczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgYXNlX2lkcy5wdXNoX2JhY2soMHgxMSk7Ci0gIGFzZV9pZHMucHVzaF9iYWNrKDB4MzYpOwotCi0gIFByZXBhcmVBc2VDdHBBdWRpb1JlY2VpdmVyU3RhcnRSZWFkeShhc2VfaWRzLCB2YWx1ZSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwNHUpOyAgLy8gUmVjZWl2ZXIgU3RhcnQgUmVhZHkgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAydSk7ICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDM2dSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKGksIHZhbHVlLnNpemUoKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwRGlzYWJsZUVtcHR5KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFzZV9pZHM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIFByZXBhcmVBc2VDdHBEaXNhYmxlKGFzZV9pZHMsIHZhbHVlKTsKLSAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cERpc2FibGVTaW5nbGUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXNlX2lkczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgYXNlX2lkcy5wdXNoX2JhY2soMHgxMSk7Ci0KLSAgUHJlcGFyZUFzZUN0cERpc2FibGUoYXNlX2lkcywgdmFsdWUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9ORSh2YWx1ZS5zaXplKCksIDB1KTsKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDV1KTsgIC8vIERpc2FibGUgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAxdSk7ICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUShpLCB2YWx1ZS5zaXplKCkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cERpc2FibGVNdWx0aXBsZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhc2VfaWRzOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICBhc2VfaWRzLnB1c2hfYmFjaygweDExKTsKLSAgYXNlX2lkcy5wdXNoX2JhY2soMHgzNik7Ci0KLSAgUHJlcGFyZUFzZUN0cERpc2FibGUoYXNlX2lkcywgdmFsdWUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9ORSh2YWx1ZS5zaXplKCksIDB1KTsKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDV1KTsgIC8vIERpc2FibGUgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAydSk7ICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDM2dSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKGksIHZhbHVlLnNpemUoKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwQXVkaW9SZWNlaXZlclN0b3BSZWFkeUVtcHR5KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFzZV9pZHM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIFByZXBhcmVBc2VDdHBBdWRpb1JlY2VpdmVyU3RvcFJlYWR5KGFzZV9pZHMsIHZhbHVlKTsKLSAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgMHUpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdG9wUmVhZHlTaW5nbGUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXNlX2lkczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgYXNlX2lkcy5wdXNoX2JhY2soMHgxMSk7Ci0KLSAgUHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdG9wUmVhZHkoYXNlX2lkcywgdmFsdWUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9ORSh2YWx1ZS5zaXplKCksIDB1KTsKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDZ1KTsgIC8vIFJldmVpY2VyIFN0b3AgUmVhZHkgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAxdSk7ICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUShpLCB2YWx1ZS5zaXplKCkpOwotfQotCi1URVNUKExlQXVkaW9DbGllbnRQYXJzZXJUZXN0LCB0ZXN0UHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdG9wUmVhZHlNdWx0aXBsZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhc2VfaWRzOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICBhc2VfaWRzLnB1c2hfYmFjaygweDExKTsKLSAgYXNlX2lkcy5wdXNoX2JhY2soMHgzNik7Ci0KLSAgUHJlcGFyZUFzZUN0cEF1ZGlvUmVjZWl2ZXJTdG9wUmVhZHkoYXNlX2lkcywgdmFsdWUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9ORSh2YWx1ZS5zaXplKCksIDB1KTsKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDZ1KTsgIC8vIFJldmVpY2VyIFN0b3AgUmVhZHkgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAydSk7ICAgICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDM2dSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKGksIHZhbHVlLnNpemUoKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwVXBkYXRlTWV0YWRhdGFFbXB0eSkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgY3RwX3VwZGF0ZV9tZXRhZGF0YT4gY29uZnM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIFByZXBhcmVBc2VDdHBVcGRhdGVNZXRhZGF0YShjb25mcywgdmFsdWUpOwotICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCAwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwVXBkYXRlTWV0YWRhdGFTaW5nbGUpIHsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IGN0cF91cGRhdGVfbWV0YWRhdGE+IGNvbmZzOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICBjdHBfdXBkYXRlX21ldGFkYXRhIGNvbmZ7LmFzZV9pZCA9IDB4MTEsIC5tZXRhZGF0YSA9IHsweDAyLCAweDIyLCAweDIxfX07Ci0gIGNvbmZzLnB1c2hfYmFjayhjb25mKTsKLQotICBQcmVwYXJlQXNlQ3RwVXBkYXRlTWV0YWRhdGEoY29uZnMsIHZhbHVlKTsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA3dSk7ICAvLyBVcGRhdGUgTWV0YWRhdGEgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAxdSk7ICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzdSk7ICAvLyBNZXRhZGF0YSBMZW4KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDJ1KTsgIC8vIE1ldGFkYXRhWzBdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIydSk7ICAvLyBNZXRhZGF0YVsxXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgyMXUpOyAgLy8gTWV0YWRhdGFbMl0KLSAgQVNTRVJUX0VRKGksIHZhbHVlLnNpemUoKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwVXBkYXRlTWV0YWRhdGFNdWx0aXBsZSkgewotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgY3RwX3VwZGF0ZV9tZXRhZGF0YT4gY29uZnM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIGN0cF91cGRhdGVfbWV0YWRhdGEgY29uZnsuYXNlX2lkID0gMHgxMSwgLm1ldGFkYXRhID0gezB4MDIsIDB4MjIsIDB4MjF9fTsKLSAgY29uZnMucHVzaF9iYWNrKGNvbmYpOwotCi0gIGN0cF91cGRhdGVfbWV0YWRhdGEgY29uZjJ7LmFzZV9pZCA9IDB4MjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGFkYXRhID0gezB4MDMsIDB4MzUsIDB4MzYsIDB4Mzd9fTsKLSAgY29uZnMucHVzaF9iYWNrKGNvbmYyKTsKLQotICBQcmVwYXJlQXNlQ3RwVXBkYXRlTWV0YWRhdGEoY29uZnMsIHZhbHVlKTsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotCi0gIHVpbnQ4X3QgaSA9IDA7Ci0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDA3dSk7ICAvLyBVcGRhdGUgTWV0YWRhdGEgT3Bjb2RlCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAydSk7ICAvLyBOdW1iZXIgb2YgQVNFcwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgxMXUpOyAgLy8gQVNFWzBdIElECi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAzdSk7ICAvLyBBU0VbMF0gTWV0YWRhdGEgTGVuCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDAydSk7ICAvLyBBU0VbMF0gTWV0YWRhdGFbMF0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MjJ1KTsgIC8vIEFTRVswXSBNZXRhZGF0YVsxXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgyMXUpOyAgLy8gQVNFWzBdIE1ldGFkYXRhWzJdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDIxdSk7ICAvLyBBU0VbMV0gSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDR1KTsgIC8vIEFTRVsxXSBNZXRhZGF0YSBMZW4KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MDN1KTsgIC8vIEFTRVsxXSBNZXRhZGF0YVswXQotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgzNXUpOyAgLy8gQVNFWzFdIE1ldGFkYXRhWzFdCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDM2dSk7ICAvLyBBU0VbMV0gTWV0YWRhdGFbMl0KLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4Mzd1KTsgIC8vIEFTRVsxXSBNZXRhZGF0YVsyXQotICBBU1NFUlRfRVEoaSwgdmFsdWUuc2l6ZSgpKTsKLX0KLQotVEVTVChMZUF1ZGlvQ2xpZW50UGFyc2VyVGVzdCwgdGVzdFByZXBhcmVBc2VDdHBSZWxlYXNlRW1wdHkpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXNlX2lkczsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgUHJlcGFyZUFzZUN0cFJlbGVhc2UoYXNlX2lkcywgdmFsdWUpOwotICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCAwdSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwUmVsZWFzZVNpbmdsZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhc2VfaWRzOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICBhc2VfaWRzLnB1c2hfYmFjaygweDExKTsKLQotICBQcmVwYXJlQXNlQ3RwUmVsZWFzZShhc2VfaWRzLCB2YWx1ZSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwOHUpOyAgLy8gUmVsZWFzZSBPcGNvZGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDF1KTsgICAgIC8vIE51bWJlciBvZiBBU0VzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDExdSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKGksIHZhbHVlLnNpemUoKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0NsaWVudFBhcnNlclRlc3QsIHRlc3RQcmVwYXJlQXNlQ3RwUmVsZWFzZU11bHRpcGxlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFzZV9pZHM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gIGFzZV9pZHMucHVzaF9iYWNrKDB4MTEpOwotICBhc2VfaWRzLnB1c2hfYmFjaygweDM2KTsKLQotICBQcmVwYXJlQXNlQ3RwUmVsZWFzZShhc2VfaWRzLCB2YWx1ZSk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgQVNTRVJUX05FKHZhbHVlLnNpemUoKSwgMHUpOwotICBBU1NFUlRfRVEodmFsdWVbaSsrXSwgMHgwOHUpOyAgLy8gUmVsZWFzZSBPcGNvZGUKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDJ1KTsgICAgIC8vIE51bWJlciBvZiBBU0VzCi0gIEFTU0VSVF9FUSh2YWx1ZVtpKytdLCAweDExdSk7ICAvLyBBU0VbMF0gSUQKLSAgQVNTRVJUX0VRKHZhbHVlW2krK10sIDB4MzZ1KTsgIC8vIEFTRVswXSBJRAotICBBU1NFUlRfRVEoaSwgdmFsdWUuc2l6ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFzY3MKLQotfSAgLy8gbmFtZXNwYWNlIGNsaWVudF9wYXJzZXIKLX0gIC8vIG5hbWVzcGFjZSBsZV9hdWRpbwpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL2RldmljZXMuY2MgYi9idGEvbGVfYXVkaW8vZGV2aWNlcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjMGRlNi4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vZGV2aWNlcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BCi0gKiAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImRldmljZXMuaCIKLQotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0YV9ncm91cHMuaCIKLSNpbmNsdWRlICJidGFfbGVfYXVkaW9fYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2lzb19hcGkuaCIKLSNpbmNsdWRlICJidG1faXNvX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgImNsaWVudF9hdWRpby5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludC5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6a0lzb0NpZ0ZyYW1pbmdGcmFtZWQ7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6a0lzb0NpZ0ZyYW1pbmdVbmZyYW1lZDsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjprSXNvQ2lnUGFja2luZ1NlcXVlbnRpYWw7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6a0lzb0NpZ1BoeTFNOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OmtJc29DaWdQaHkyTTsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb1NjYTBUbzIwUHBtOwotdXNpbmcgbGVfYXVkaW86OnNldF9jb25maWd1cmF0aW9uczo6Q29kZWNDYXBhYmlsaXR5U2V0dGluZzsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6YXNlOwotdXNpbmcgbGVfYXVkaW86OnR5cGVzOjpBc2VTdGF0ZTsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6QXVkaW9Db250ZXh0czsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6QXVkaW9Mb2NhdGlvbnM7Ci11c2luZyBsZV9hdWRpbzo6dHlwZXM6OkF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6QmlkaXJlY3RBc2VzUGFpcjsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvZGVjSWQ7Ci11c2luZyBsZV9hdWRpbzo6dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZTsKLXVzaW5nIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0xjM0NvbmZpZzsKLQotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLS8qIExlQXVkaW9EZXZpY2VHcm91cCBDbGFzcyBtZXRob2RzIGltcGxlbWVudGF0aW9uICovCi12b2lkIExlQXVkaW9EZXZpY2VHcm91cDo6QWRkTm9kZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4mIGxlQXVkaW9EZXZpY2UpIHsKLSAgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfID0gZ3JvdXBfaWRfOwotICBsZUF1ZGlvRGV2aWNlc18ucHVzaF9iYWNrKHN0ZDo6d2Vha19wdHI8TGVBdWRpb0RldmljZT4obGVBdWRpb0RldmljZSkpOwotfQotCi12b2lkIExlQXVkaW9EZXZpY2VHcm91cDo6UmVtb3ZlTm9kZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4mIGxlQXVkaW9EZXZpY2UpIHsKLSAgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfID0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd247Ci0gIGxlQXVkaW9EZXZpY2VzXy5lcmFzZSgKLSAgICAgIHN0ZDo6cmVtb3ZlX2lmKAotICAgICAgICAgIGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgWyZsZUF1ZGlvRGV2aWNlXShhdXRvJiBkKSB7IHJldHVybiBkLmxvY2soKSA9PSBsZUF1ZGlvRGV2aWNlOyB9KSwKLSAgICAgIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZUdyb3VwOjpJc0VtcHR5KHZvaWQpIHsgcmV0dXJuIGxlQXVkaW9EZXZpY2VzXy5zaXplKCkgPT0gMDsgfQotCi1ib29sIExlQXVkaW9EZXZpY2VHcm91cDo6SXNBbnlEZXZpY2VDb25uZWN0ZWQodm9pZCkgewotICByZXR1cm4gKE51bU9mQ29ubmVjdGVkKCkgIT0gMCk7Ci19Ci0KLWludCBMZUF1ZGlvRGV2aWNlR3JvdXA6OlNpemUodm9pZCkgeyByZXR1cm4gbGVBdWRpb0RldmljZXNfLnNpemUoKTsgfQotCi1pbnQgTGVBdWRpb0RldmljZUdyb3VwOjpOdW1PZkNvbm5lY3RlZCh0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgewotICBpZiAobGVBdWRpb0RldmljZXNfLmVtcHR5KCkpIHJldHVybiAwOwotCi0gIGJvb2wgY2hlY2tfY29udGV4dF90eXBlID0gKGNvbnRleHRfdHlwZSAhPSBMZUF1ZGlvQ29udGV4dFR5cGU6OlJGVSk7Ci0gIEF1ZGlvQ29udGV4dHMgdHlwZV9zZXQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29udGV4dF90eXBlKTsKLQotICAvKiByZXR1cm4gbnVtYmVyIG9mIGNvbm5lY3RlZCBkZXZpY2VzIGZyb20gdGhlIHNldCovCi0gIHJldHVybiBzdGQ6OmNvdW50X2lmKAotICAgICAgbGVBdWRpb0RldmljZXNfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSwKLSAgICAgIFt0eXBlX3NldCwgY2hlY2tfY29udGV4dF90eXBlXShhdXRvJiBpdGVyKSB7Ci0gICAgICAgIGlmIChpdGVyLmV4cGlyZWQoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoaXRlci5sb2NrKCktPmNvbm5faWRfID09IEdBVFRfSU5WQUxJRF9DT05OX0lEKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFjaGVja19jb250ZXh0X3R5cGUpIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiAoaXRlci5sb2NrKCktPkdldEF2YWlsYWJsZUNvbnRleHRzKCkgJiB0eXBlX3NldCkuYW55KCk7Ci0gICAgICB9KTsKLX0KLQotdm9pZCBMZUF1ZGlvRGV2aWNlR3JvdXA6OkNsZWFudXAodm9pZCkgeyBsZUF1ZGlvRGV2aWNlc18uY2xlYXIoKTsgfQotCi12b2lkIExlQXVkaW9EZXZpY2VHcm91cDo6RGVhY3RpdmF0ZSh2b2lkKSB7Ci0gIGZvciAoYXV0byogbGVBdWRpb0RldmljZSA9IEdldEZpcnN0QWN0aXZlRGV2aWNlKCk7IGxlQXVkaW9EZXZpY2U7Ci0gICAgICAgbGVBdWRpb0RldmljZSA9IEdldE5leHRBY3RpdmVEZXZpY2UobGVBdWRpb0RldmljZSkpIHsKLSAgICBmb3IgKGF1dG8qIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlKCk7IGFzZTsKLSAgICAgICAgIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldE5leHRBY3RpdmVBc2UoYXNlKSkgewotICAgICAgYXNlLT5hY3RpdmUgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotTGVBdWRpb0RldmljZSogTGVBdWRpb0RldmljZUdyb3VwOjpHZXRGaXJzdERldmljZSh2b2lkKSB7Ci0gIHJldHVybiAobGVBdWRpb0RldmljZXNfLmZyb250KCkubG9jaygpKS5nZXQoKTsKLX0KLQotTGVBdWRpb0RldmljZSogTGVBdWRpb0RldmljZUdyb3VwOjpHZXRGaXJzdERldmljZVdpdGhBY3RpdmVDb250ZXh0KAotICAgIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gIEF1ZGlvQ29udGV4dHMgdHlwZV9zZXQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29udGV4dF90eXBlKTsKLQotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICBsZUF1ZGlvRGV2aWNlc18uYmVnaW4oKSwgbGVBdWRpb0RldmljZXNfLmVuZCgpLCBbJnR5cGVfc2V0XShhdXRvJiBpdGVyKSB7Ci0gICAgICAgIGlmIChpdGVyLmV4cGlyZWQoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gKGl0ZXIubG9jaygpLT5HZXRBdmFpbGFibGVDb250ZXh0cygpICYgdHlwZV9zZXQpLmFueSgpOwotICAgICAgfSk7Ci0KLSAgaWYgKChpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKSkgfHwgKGl0ZXItPmV4cGlyZWQoKSkpIHJldHVybiBudWxscHRyOwotCi0gIHJldHVybiAoaXRlci0+bG9jaygpKS5nZXQoKTsKLX0KLQotTGVBdWRpb0RldmljZSogTGVBdWRpb0RldmljZUdyb3VwOjpHZXROZXh0RGV2aWNlKExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmxlQXVkaW9EZXZpY2VdKGF1dG8mIGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuZXhwaXJlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZC5sb2NrKCkpLmdldCgpID09IGxlQXVkaW9EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAvKiBJZiByZWZlcmVuY2UgZGV2aWNlIG5vdCBmb3VuZCAqLwotICBpZiAoaXRlciA9PSBsZUF1ZGlvRGV2aWNlc18uZW5kKCkpIHJldHVybiBudWxscHRyOwotCi0gIHN0ZDo6YWR2YW5jZShpdGVyLCAxKTsKLSAgLyogSWYgcmVmZXJlbmNlIGRldmljZSBpcyBsYXN0IGluIGdyb3VwICovCi0gIGlmIChpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgaWYgKGl0ZXItPmV4cGlyZWQoKSkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIChpdGVyLT5sb2NrKCkpLmdldCgpOwotfQotCi1MZUF1ZGlvRGV2aWNlKiBMZUF1ZGlvRGV2aWNlR3JvdXA6OkdldE5leHREZXZpY2VXaXRoQWN0aXZlQ29udGV4dCgKLSAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLCB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgewotICBBdWRpb0NvbnRleHRzIHR5cGVfc2V0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbnRleHRfdHlwZSk7Ci0KLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmxlQXVkaW9EZXZpY2VdKGF1dG8mIGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuZXhwaXJlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZC5sb2NrKCkpLmdldCgpID09IGxlQXVkaW9EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAvKiBJZiByZWZlcmVuY2UgZGV2aWNlIG5vdCBmb3VuZCAqLwotICBpZiAoaXRlciA9PSBsZUF1ZGlvRGV2aWNlc18uZW5kKCkpIHJldHVybiBudWxscHRyOwotCi0gIHN0ZDo6YWR2YW5jZShpdGVyLCAxKTsKLSAgLyogSWYgcmVmZXJlbmNlIGRldmljZSBpcyBsYXN0IGluIGdyb3VwICovCi0gIGlmIChpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgaXRlciA9IHN0ZDo6ZmluZF9pZihpdGVyLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksIFsmdHlwZV9zZXRdKGF1dG8mIGQpIHsKLSAgICBpZiAoZC5leHBpcmVkKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIChkLmxvY2soKS0+R2V0QXZhaWxhYmxlQ29udGV4dHMoKSAmIHR5cGVfc2V0KS5hbnkoKTsKLSAgICA7Ci0gIH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBsZUF1ZGlvRGV2aWNlc18uZW5kKCkpID8gbnVsbHB0ciA6IChpdGVyLT5sb2NrKCkpLmdldCgpOwotfQotCi1ib29sIExlQXVkaW9EZXZpY2VHcm91cDo6SXNEZXZpY2VJblRoZUdyb3VwKExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmxlQXVkaW9EZXZpY2VdKGF1dG8mIGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuZXhwaXJlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZC5sb2NrKCkpLmdldCgpID09IGxlQXVkaW9EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICBpZiAoKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpKSB8fCAoaXRlci0+ZXhwaXJlZCgpKSkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExlQXVkaW9EZXZpY2VHcm91cDo6SGF2ZUFsbEFjdGl2ZURldmljZXNBc2VzVGhlU2FtZVN0YXRlKEFzZVN0YXRlIHN0YXRlKSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZigKLSAgICAgIGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksIFsmc3RhdGVdKGF1dG8mIGQpIHsKLSAgICAgICAgaWYgKGQuZXhwaXJlZCgpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAhKCgoZC5sb2NrKCkpLmdldCgpKS0+SGF2ZUFsbEFjdGl2ZUFzZXNTYW1lU3RhdGUoc3RhdGUpKTsKLSAgICAgIH0pOwotCi0gIHJldHVybiBpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKTsKLX0KLQotTGVBdWRpb0RldmljZSogTGVBdWRpb0RldmljZUdyb3VwOjpHZXRGaXJzdEFjdGl2ZURldmljZSh2b2lkKSB7Ci0gIGF1dG8gaXRlciA9Ci0gICAgICBzdGQ6OmZpbmRfaWYobGVBdWRpb0RldmljZXNfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSwgW10oYXV0byYgZCkgewotICAgICAgICBpZiAoZC5leHBpcmVkKCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuICgoZC5sb2NrKCkpLmdldCgpKS0+SGF2ZUFjdGl2ZUFzZSgpOwotICAgICAgfSk7Ci0KLSAgaWYgKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpIHx8IGl0ZXItPmV4cGlyZWQoKSkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIChpdGVyLT5sb2NrKCkpLmdldCgpOwotfQotCi1MZUF1ZGlvRGV2aWNlKiBMZUF1ZGlvRGV2aWNlR3JvdXA6OkdldE5leHRBY3RpdmVEZXZpY2UoCi0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYobGVBdWRpb0RldmljZXNfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmbGVBdWRpb0RldmljZV0oYXV0byYgZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5leHBpcmVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkLmxvY2soKSkuZ2V0KCkgPT0gbGVBdWRpb0RldmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gIGlmIChpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKSB8fAotICAgICAgc3RkOjpkaXN0YW5jZShpdGVyLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCkpIDwgMSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpdGVyID0gc3RkOjpmaW5kX2lmKHN0ZDo6bmV4dChpdGVyLCAxKSwgbGVBdWRpb0RldmljZXNfLmVuZCgpLCBbXShhdXRvJiBkKSB7Ci0gICAgaWYgKGQuZXhwaXJlZCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoKGQubG9jaygpKS5nZXQoKSktPkhhdmVBY3RpdmVBc2UoKTsKLSAgfSk7Ci0KLSAgcmV0dXJuIChpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKSkgPyBudWxscHRyIDogKGl0ZXItPmxvY2soKSkuZ2V0KCk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZUdyb3VwOjpTZXRDb250ZXh0VHlwZShMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gIC8qIFhYWDogZ3JvdXAgY29udGV4dCBwb2xpY3kgPyAvIG1heSBpdCBkaXNhbGxvdyB0byBjaGFuZ2UgdHlwZSA/KSAqLwotICBjb250ZXh0X3R5cGVfID0gY29udGV4dF90eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1MZUF1ZGlvQ29udGV4dFR5cGUgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRDb250ZXh0VHlwZSh2b2lkKSB7Ci0gIHJldHVybiBjb250ZXh0X3R5cGVfOwotfQotCi11aW50MzJfdCBMZUF1ZGlvRGV2aWNlR3JvdXA6OkdldFNkdUludGVydmFsKHVpbnQ4X3QgZGlyZWN0aW9uKSB7Ci0gIGZvciAoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IEdldEZpcnN0QWN0aXZlRGV2aWNlKCk7Ci0gICAgICAgbGVBdWRpb0RldmljZSAhPSBudWxscHRyOwotICAgICAgIGxlQXVkaW9EZXZpY2UgPSBHZXROZXh0QWN0aXZlRGV2aWNlKGxlQXVkaW9EZXZpY2UpKSB7Ci0gICAgc3RydWN0IGFzZSogYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2VCeURpcmVjdGlvbihkaXJlY3Rpb24pOwotICAgIGlmICghYXNlKSBjb250aW51ZTsKLQotICAgIHJldHVybiBhc2UtPmNvZGVjX2NvbmZpZy5HZXRGcmFtZUR1cmF0aW9uVXMoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi11aW50OF90IExlQXVkaW9EZXZpY2VHcm91cDo6R2V0U0NBKHZvaWQpIHsKLSAgdWludDhfdCBzY2EgPSBrSXNvU2NhMFRvMjBQcG07Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBsZUF1ZGlvRGV2aWNlIDogbGVBdWRpb0RldmljZXNfKSB7Ci0gICAgdWludDhfdCBkZXZfc2NhID0KLSAgICAgICAgQlRNX0dldFBlZXJTQ0EobGVBdWRpb0RldmljZS5sb2NrKCktPmFkZHJlc3NfLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgLyogSWYgd2UgY291bGQgbm90IHJlYWQgU0NBIGZyb20gdGhlIHBlZXIgZGV2aWNlIG9yIHNjYSBpcyAwLAotICAgICAqIHRoZW4gdGhlcmUgaXMgbm8gcmVhc29uIHRvIGNvbnRpbnVlLgotICAgICAqLwotICAgIGlmICgoZGV2X3NjYSA9PSAweEZGKSB8fCAoZGV2X3NjYSA9PSAwKSkgcmV0dXJuIDA7Ci0KLSAgICAvKiBUaGUgU2xhdmVzX0Nsb2NrX0FjY3VyYWN5IHBhcmFtZXRlciBzaGFsbCBiZSB0aGUgd29yc3QtY2FzZSBzbGVlcCBjbG9jawotICAgICAqYWNjdXJhY3kgb2YgYWxsIHRoZSBzbGF2ZXMgdGhhdCB3aWxsIHBhcnRpY2lwYXRlIGluIHRoZSBDSUcuCi0gICAgICovCi0gICAgaWYgKGRldl9zY2EgPCBzY2EpIHsKLSAgICAgIHNjYSA9IGRldl9zY2E7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHNjYTsKLX0KLQotdWludDhfdCBMZUF1ZGlvRGV2aWNlR3JvdXA6OkdldFBhY2tpbmcodm9pZCkgewotICAvKiBUT0RPOiBEZWNpZGUgYWJvdXQgcGFja2luZyAqLwotICByZXR1cm4ga0lzb0NpZ1BhY2tpbmdTZXF1ZW50aWFsOwotfQotCi11aW50OF90IExlQXVkaW9EZXZpY2VHcm91cDo6R2V0RnJhbWluZyh2b2lkKSB7Ci0gIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBHZXRGaXJzdEFjdGl2ZURldmljZSgpOwotICBMT0dfQVNTRVJUKGxlQXVkaW9EZXZpY2UpCi0gICAgICA8PCBfX2Z1bmNfXyA8PCAiIFNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgZGV2aWNlLiI7Ci0KLSAgZG8gewotICAgIHN0cnVjdCBhc2UqIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlKCk7Ci0gICAgaWYgKCFhc2UpIGNvbnRpbnVlOwotCi0gICAgZG8gewotICAgICAgaWYgKGFzZS0+ZnJhbWluZyA9PSB0eXBlczo6a0ZyYW1pbmdVbmZyYW1lZFBkdVVuc3VwcG9ydGVkKQotICAgICAgICByZXR1cm4ga0lzb0NpZ0ZyYW1pbmdGcmFtZWQ7Ci0gICAgfSB3aGlsZSAoKGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldE5leHRBY3RpdmVBc2UoYXNlKSkpOwotICB9IHdoaWxlICgobGVBdWRpb0RldmljZSA9IEdldE5leHRBY3RpdmVEZXZpY2UobGVBdWRpb0RldmljZSkpKTsKLQotICByZXR1cm4ga0lzb0NpZ0ZyYW1pbmdVbmZyYW1lZDsKLX0KLQotdWludDhfdCBMZUF1ZGlvRGV2aWNlR3JvdXA6OkdldFRhcmdldExhdGVuY3kodm9pZCkgewotICAvKiBUT0RPOiBEZWNpZGUgYWJvdXQgdGFyZ2V0IGxhdGVuY3kgKi8KLSAgcmV0dXJuIHR5cGVzOjprVGFyZ2V0TGF0ZW5jeUJhbGFuY2VkTGF0ZW5jeVJlbGlhYmlsaXR5OwotfQotCi0vKiBUT0RPOiBQcmVmZXJyZWQgcGFyYW1ldGVyIG1heSBiZSBvdGhlciB0aGFuIG1pbmltdW0gKi8KLXN0YXRpYyB1aW50MTZfdCBmaW5kX21heF90cmFuc3BvcnRfbGF0ZW5jeShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlyZWN0aW9uKSB7Ci0gIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IDA7Ci0KLSAgZm9yIChMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0QWN0aXZlRGV2aWNlKCk7Ci0gICAgICAgbGVBdWRpb0RldmljZSAhPSBudWxscHRyOwotICAgICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKSkgewotICAgIGZvciAoYXNlKiBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGlyZWN0aW9uKGRpcmVjdGlvbik7Ci0gICAgICAgICBhc2UgIT0gbnVsbHB0cjsKLSAgICAgICAgIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldE5leHRBY3RpdmVBc2VXaXRoU2FtZURpcmVjdGlvbihhc2UpKSB7Ci0gICAgICBpZiAoIWFzZSkgYnJlYWs7Ci0KLSAgICAgIGlmICghbWF4X3RyYW5zcG9ydF9sYXRlbmN5KQotICAgICAgICAvLyBmaXJzdCBhc3NpZ25tZW50Ci0gICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IGFzZS0+bWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICAgICAgZWxzZSBpZiAoYXNlLT5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPCBtYXhfdHJhbnNwb3J0X2xhdGVuY3kpCi0gICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IGFzZS0+bWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICAgIH0KLSAgfQotCi0gIGlmIChtYXhfdHJhbnNwb3J0X2xhdGVuY3kgPCB0eXBlczo6a01heFRyYW5zcG9ydExhdGVuY3lNaW4pCi0gICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5ID0gdHlwZXM6OmtNYXhUcmFuc3BvcnRMYXRlbmN5TWluOwotICBlbHNlIGlmIChtYXhfdHJhbnNwb3J0X2xhdGVuY3kgPiB0eXBlczo6a01heFRyYW5zcG9ydExhdGVuY3lNYXgpCi0gICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5ID0gdHlwZXM6OmtNYXhUcmFuc3BvcnRMYXRlbmN5TWF4OwotCi0gIHJldHVybiBtYXhfdHJhbnNwb3J0X2xhdGVuY3k7Ci19Ci0KLXVpbnQxNl90IExlQXVkaW9EZXZpY2VHcm91cDo6R2V0TWF4VHJhbnNwb3J0TGF0ZW5jeVN0b20odm9pZCkgewotICByZXR1cm4gZmluZF9tYXhfdHJhbnNwb3J0X2xhdGVuY3kodGhpcywgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKTsKLX0KLQotdWludDE2X3QgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRNYXhUcmFuc3BvcnRMYXRlbmN5TXRvcyh2b2lkKSB7Ci0gIHJldHVybiBmaW5kX21heF90cmFuc3BvcnRfbGF0ZW5jeSh0aGlzLCB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rKTsKLX0KLQotdWludDE2X3QgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRUcmFuc3BvcnRMYXRlbmN5KHVpbnQ4X3QgZGlyZWN0aW9uKSB7Ci0gIGlmIChkaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaykgewotICAgIHJldHVybiB0cmFuc3BvcnRfbGF0ZW5jeV9tdG9zXzsKLSAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF9sYXRlbmN5X3N0b21fOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBkaXJlY3Rpb24iOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXZvaWQgTGVBdWRpb0RldmljZUdyb3VwOjpTZXRUcmFuc3BvcnRMYXRlbmN5KHVpbnQ4X3QgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbmV3X3RyYW5zcG9ydF9sYXRlbmN5KSB7Ci0gIHVpbnQxNl90KiB0cmFuc3BvcnRfbGF0ZW5jeTsKLQotICBpZiAoZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspIHsKLSAgICB0cmFuc3BvcnRfbGF0ZW5jeSA9ICZ0cmFuc3BvcnRfbGF0ZW5jeV9tdG9zXzsKLSAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKSB7Ci0gICAgdHJhbnNwb3J0X2xhdGVuY3kgPSAmdHJhbnNwb3J0X2xhdGVuY3lfc3RvbV87Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIGRpcmVjdGlvbiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCp0cmFuc3BvcnRfbGF0ZW5jeSA9PSBuZXdfdHJhbnNwb3J0X2xhdGVuY3kpIHJldHVybjsKLQotICBpZiAoKCp0cmFuc3BvcnRfbGF0ZW5jeSAhPSAwKSAmJgotICAgICAgKCp0cmFuc3BvcnRfbGF0ZW5jeSAhPSBuZXdfdHJhbnNwb3J0X2xhdGVuY3kpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIERpZmZlcmVudCB0cmFuc3BvcnQgbGF0ZW5jeSBmb3IgZ3JvdXA6ICIKLSAgICAgICAgICAgICAgICAgPDwgIiBvbGQ6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PigqdHJhbnNwb3J0X2xhdGVuY3kpCi0gICAgICAgICAgICAgICAgIDw8ICIgW21zXSwgbmV3OiAiIDw8IHN0YXRpY19jYXN0PGludD4obmV3X3RyYW5zcG9ydF9sYXRlbmN5KQotICAgICAgICAgICAgICAgICA8PCAiIFttc10iOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCB1cGRhdGVkIGdyb3VwICIgPDwgc3RhdGljX2Nhc3Q8aW50Pihncm91cF9pZF8pCi0gICAgICAgICAgICA8PCAiIHRyYW5zcG9ydCBsYXRlbmN5OiAiIDw8IHN0YXRpY19jYXN0PGludD4obmV3X3RyYW5zcG9ydF9sYXRlbmN5KQotICAgICAgICAgICAgPDwgIiBbbXNdIjsKLSAgKnRyYW5zcG9ydF9sYXRlbmN5ID0gbmV3X3RyYW5zcG9ydF9sYXRlbmN5OwotfQotCi11aW50OF90IExlQXVkaW9EZXZpY2VHcm91cDo6R2V0UGh5Qml0bWFzayh1aW50OF90IGRpcmVjdGlvbikgewotICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gR2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgTE9HX0FTU0VSVChsZUF1ZGlvRGV2aWNlKQotICAgICAgPDwgX19mdW5jX18gPDwgIiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIGRldmljZS4iOwotCi0gIC8vIGxvY2FsIHN1cHBvcnRlZCBQSFkncwotICB1aW50OF90IHBoeV9iaXRmaWVsZCA9IGtJc29DaWdQaHkxTTsKLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfMm1fcGh5KCkpCi0gICAgcGh5X2JpdGZpZWxkIHw9IGtJc29DaWdQaHkyTTsKLQotICBpZiAoIWxlQXVkaW9EZXZpY2UpIHsKLSAgICBMT0coRVJST1IpIDw8ICJObyBhY3RpdmUgbGVhdWRpbyBkZXZpY2UgZm9yIGRpcmVjdGlvbj86ICIgPDwgK2RpcmVjdGlvbjsKLSAgICByZXR1cm4gcGh5X2JpdGZpZWxkOwotICB9Ci0KLSAgZG8gewotICAgIHN0cnVjdCBhc2UqIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlQnlEaXJlY3Rpb24oZGlyZWN0aW9uKTsKLSAgICBpZiAoIWFzZSkgcmV0dXJuIHBoeV9iaXRmaWVsZDsKLQotICAgIGRvIHsKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gYXNlLT5kaXJlY3Rpb24pIHsKLSAgICAgICAgcGh5X2JpdGZpZWxkICY9IGxlQXVkaW9EZXZpY2UtPkdldFBoeUJpdG1hc2soKTsKLQotICAgICAgICAvLyBBIHZhbHVlIG9mIDB4MDAgZGVub3RlcyBubyBwcmVmZXJlbmNlCi0gICAgICAgIGlmIChhc2UtPnByZWZlcnJlZF9waHkpIHBoeV9iaXRmaWVsZCAmPSBhc2UtPnByZWZlcnJlZF9waHk7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoKGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldE5leHRBY3RpdmVBc2VXaXRoU2FtZURpcmVjdGlvbihhc2UpKSk7Ci0gIH0gd2hpbGUgKChsZUF1ZGlvRGV2aWNlID0gR2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKSkpOwotCi0gIHJldHVybiBwaHlfYml0ZmllbGQ7Ci19Ci0KLXVpbnQ4X3QgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRUYXJnZXRQaHkodWludDhfdCBkaXJlY3Rpb24pIHsKLSAgdWludDhfdCBwaHlfYml0ZmllbGQgPSBHZXRQaHlCaXRtYXNrKGRpcmVjdGlvbik7Ci0KLSAgLy8gcHJlZmVyIHRvIHVzZSAyTSBpZiBzdXBwb3J0ZWQKLSAgaWYgKHBoeV9iaXRmaWVsZCAmIGtJc29DaWdQaHkyTSkKLSAgICByZXR1cm4gdHlwZXM6OmtUYXJnZXRQaHkyTTsKLSAgZWxzZSBpZiAocGh5X2JpdGZpZWxkICYga0lzb0NpZ1BoeTFNKQotICAgIHJldHVybiB0eXBlczo6a1RhcmdldFBoeTFNOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRQcmVzZW50YXRpb25EZWxheSh1aW50MzJfdCogZGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaXJlY3Rpb24pIHsKLSAgdWludDMyX3QgZGVsYXlfbWluID0gMDsKLSAgdWludDMyX3QgZGVsYXlfbWF4ID0gVUlOVDMyX01BWDsKLSAgdWludDMyX3QgcHJlZmVycmVkX2RlbGF5X21pbiA9IGRlbGF5X21pbjsKLSAgdWludDMyX3QgcHJlZmVycmVkX2RlbGF5X21heCA9IGRlbGF5X21heDsKLQotICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gR2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgTE9HX0FTU0VSVChsZUF1ZGlvRGV2aWNlKQotICAgICAgPDwgX19mdW5jX18gPDwgIiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIGRldmljZS4iOwotCi0gIGRvIHsKLSAgICBzdHJ1Y3QgYXNlKiBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGlyZWN0aW9uKGRpcmVjdGlvbik7Ci0gICAgaWYgKCFhc2UpIGNvbnRpbnVlOyAgLy8gZGV2aWNlIGhhcyBubyBhY3RpdmUgQVNFcyBpbiB0aGlzIGRpcmVjdGlvbgotCi0gICAgZG8gewotICAgICAgLyogTm8gY29tbW9uIHJhbmdlIGNoZWNrICovCi0gICAgICBpZiAoYXNlLT5wcmVzX2RlbGF5X21pbiA+IGRlbGF5X21heCB8fCBhc2UtPnByZXNfZGVsYXlfbWF4IDwgZGVsYXlfbWluKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhc2UtPnByZXNfZGVsYXlfbWluID4gZGVsYXlfbWluKSBkZWxheV9taW4gPSBhc2UtPnByZXNfZGVsYXlfbWluOwotICAgICAgaWYgKGFzZS0+cHJlc19kZWxheV9tYXggPCBkZWxheV9tYXgpIGRlbGF5X21heCA9IGFzZS0+cHJlc19kZWxheV9tYXg7Ci0gICAgICBpZiAoYXNlLT5wcmVmZXJyZWRfcHJlc19kZWxheV9taW4gPiBwcmVmZXJyZWRfZGVsYXlfbWluKQotICAgICAgICBwcmVmZXJyZWRfZGVsYXlfbWluID0gYXNlLT5wcmVmZXJyZWRfcHJlc19kZWxheV9taW47Ci0gICAgICBpZiAoYXNlLT5wcmVmZXJyZWRfcHJlc19kZWxheV9tYXggPCBwcmVmZXJyZWRfZGVsYXlfbWF4ICYmCi0gICAgICAgICAgYXNlLT5wcmVmZXJyZWRfcHJlc19kZWxheV9tYXggIT0gdHlwZXM6OmtQcmVzRGVsYXlOb1ByZWZlcmVuY2UpCi0gICAgICAgIHByZWZlcnJlZF9kZWxheV9tYXggPSBhc2UtPnByZWZlcnJlZF9wcmVzX2RlbGF5X21heDsKLSAgICB9IHdoaWxlICgoYXNlID0gbGVBdWRpb0RldmljZS0+R2V0TmV4dEFjdGl2ZUFzZVdpdGhTYW1lRGlyZWN0aW9uKGFzZSkpKTsKLSAgfSB3aGlsZSAoKGxlQXVkaW9EZXZpY2UgPSBHZXROZXh0QWN0aXZlRGV2aWNlKGxlQXVkaW9EZXZpY2UpKSk7Ci0KLSAgaWYgKHByZWZlcnJlZF9kZWxheV9taW4gPD0gcHJlZmVycmVkX2RlbGF5X21heCAmJgotICAgICAgcHJlZmVycmVkX2RlbGF5X21pbiA+IGRlbGF5X21pbiAmJiBwcmVmZXJyZWRfZGVsYXlfbWluIDwgZGVsYXlfbWF4KSB7Ci0gICAgKmRlbGF5ID0gcHJlZmVycmVkX2RlbGF5X21pbjsKLSAgfSBlbHNlIHsKLSAgICAqZGVsYXkgPSBkZWxheV9taW47Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDE2X3QgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRSZW1vdGVEZWxheSh1aW50OF90IGRpcmVjdGlvbikgewotICB1aW50MTZfdCByZW1vdGVfZGVsYXlfbXMgPSAwOwotICB1aW50MzJfdCBwcmVzZW50YXRpb25fZGVsYXk7Ci0KLSAgaWYgKCFHZXRQcmVzZW50YXRpb25EZWxheSgmcHJlc2VudGF0aW9uX2RlbGF5LCBkaXJlY3Rpb24pKSB7Ci0gICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVucyBhdCBzdHJlYW0gcmVxdWVzdCB0aW1lIGJ1dCB0byBiZSBzYWZlIHJldHVybgotICAgICAqIHNvbWUgc2FtcGxlIHZhbHVlIHRvIG5vdCBicmVhayBzdHJlYW1pbmcKLSAgICAgKi8KLSAgICByZXR1cm4gMTAwOwotICB9Ci0KLSAgLyogdXMgdG8gbXMgKi8KLSAgcmVtb3RlX2RlbGF5X21zID0gcHJlc2VudGF0aW9uX2RlbGF5IC8gMTAwMDsKLSAgcmVtb3RlX2RlbGF5X21zICs9IEdldFRyYW5zcG9ydExhdGVuY3koZGlyZWN0aW9uKSAvIDEwMDA7Ci0KLSAgcmV0dXJuIHJlbW90ZV9kZWxheV9tczsKLX0KLQotLyogVGhpcyBtZXRob2QgcmV0dXJucyBBdWRpb0NvbnRleHQgdmFsdWUgaWYgc3VwcG9ydCBmb3IgYW55IHR5cGUgaGFzIGNoYW5nZWQgKi8KLXN0ZDo6b3B0aW9uYWw8QXVkaW9Db250ZXh0cz4gTGVBdWRpb0RldmljZUdyb3VwOjpVcGRhdGVBY3RpdmVDb250ZXh0c01hcCh2b2lkKSB7Ci0gIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBncm91cCBpZDogIiA8PCBncm91cF9pZF8gPDwgIiBhY3RpdmUgY29udGV4dHM6ICIKLSAgICAgICAgICAgICA8PCBsb2doZXgoYWN0aXZlX2NvbnRleHRzX21hc2tfLnRvX3Vsb25nKCkpOwotICByZXR1cm4gVXBkYXRlQWN0aXZlQ29udGV4dHNNYXAoYWN0aXZlX2NvbnRleHRzX21hc2tfKTsKLX0KLQotLyogVGhpcyBtZXRob2QgcmV0dXJucyBBdWRpb0NvbnRleHQgdmFsdWUgaWYgc3VwcG9ydCBmb3IgYW55IHR5cGUgaGFzIGNoYW5nZWQgKi8KLXN0ZDo6b3B0aW9uYWw8QXVkaW9Db250ZXh0cz4gTGVBdWRpb0RldmljZUdyb3VwOjpVcGRhdGVBY3RpdmVDb250ZXh0c01hcCgKLSAgICBBdWRpb0NvbnRleHRzIHVwZGF0ZV9jb250ZXh0cykgewotICBBdWRpb0NvbnRleHRzIGNvbnRleHRzID0gMHgwMDAwOwotICBib29sIGFjdGl2ZV9jb250ZXh0c19oYXNfYmVlbl9tb2RpZmllZCA9IGZhbHNlOwotCi0gIGZvciAoTGVBdWRpb0NvbnRleHRUeXBlIGN0eF90eXBlIDogdHlwZXM6OmtMZUF1ZGlvQ29udGV4dEFsbFR5cGVzQXJyYXkpIHsKLSAgICBBdWRpb0NvbnRleHRzIHR5cGVfc2V0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGN0eF90eXBlKTsKLQotICAgIGlmICgodHlwZV9zZXQgJiB1cGRhdGVfY29udGV4dHMpLm5vbmUoKSkgewotICAgICAgLyogRmlsbCBjb250ZXh0IGJpdHNldCBmb3IgcG9zc2libGUgcmV0dXJuZWQgdmFsdWUgaWYgdXBkYXRlZCAqLwotICAgICAgaWYgKGFjdGl2ZV9jb250ZXh0X3RvX2NvbmZpZ3VyYXRpb25fbWFwLmNvdW50KGN0eF90eXBlKSA+IDApCi0gICAgICAgIGNvbnRleHRzIHw9IHR5cGVfc2V0OwotCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBhdXRvIG5ld19jb25mID0gRmluZEZpcnN0U3VwcG9ydGVkQ29uZmlndXJhdGlvbihjdHhfdHlwZSk7Ci0KLSAgICAvKiBDaGVjayBpZiBzdXBwb3J0IGZvciBjb250ZXh0IHR5cGUgaGFzIGNoYW5nZWQgKi8KLSAgICBpZiAoYWN0aXZlX2NvbnRleHRfdG9fY29uZmlndXJhdGlvbl9tYXAuY291bnQoY3R4X3R5cGUpID09IDAgfHwKLSAgICAgICAgYWN0aXZlX2NvbnRleHRfdG9fY29uZmlndXJhdGlvbl9tYXBbY3R4X3R5cGVdID09IG51bGxwdHIpIHsKLSAgICAgIC8qIEN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgY29udGV4dCB0eXBlIGlzIGVtcHR5ICovCi0gICAgICBpZiAobmV3X2NvbmYgPT0gbnVsbHB0cikgewotICAgICAgICAvKiBDb25maWd1cmF0aW9uIHJlbWFpbnMgZW1wdHkgKi8KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBDb25maWd1cmF0aW9uIGNoYW5nZXMgZnJvbSBlbXB0eSB0byBzb21lICovCi0gICAgICAgIGNvbnRleHRzIHw9IHR5cGVfc2V0OwotICAgICAgICBhY3RpdmVfY29udGV4dHNfaGFzX2JlZW5fbW9kaWZpZWQgPSB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDdXJyZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnRleHQgdHlwZSBpcyBub3QgZW1wdHkgKi8KLSAgICAgIGlmIChuZXdfY29uZiA9PSBudWxscHRyKSB7Ci0gICAgICAgIC8qIENvbmZpZ3VyYXRpb24gY2hhbmdlZCB0byBlbXB0eSAqLwotICAgICAgICBjb250ZXh0cyAmPSB+dHlwZV9zZXQ7Ci0gICAgICAgIGFjdGl2ZV9jb250ZXh0c19oYXNfYmVlbl9tb2RpZmllZCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKG5ld19jb25mICE9IGFjdGl2ZV9jb250ZXh0X3RvX2NvbmZpZ3VyYXRpb25fbWFwW2N0eF90eXBlXSkgewotICAgICAgICAvKiBDb25maWd1cmF0aW9uIGNoYW5nZWQgdG8gYW55IG90aGVyICovCi0gICAgICAgIGNvbnRleHRzIHw9IHR5cGVfc2V0OwotICAgICAgICBhY3RpdmVfY29udGV4dHNfaGFzX2JlZW5fbW9kaWZpZWQgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogQ29uZmlndXJhdGlvbiBpcyB0aGUgc2FtZSAqLwotICAgICAgICBjb250ZXh0cyB8PSB0eXBlX3NldDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIHVwZGF0ZWQgY29udGV4dDogIiA8PCBsb2doZXgoaW50KGN0eF90eXBlKSkKLSAgICAgICAgICAgICAgPDwgIiwgIgotICAgICAgICAgICAgICA8PCAoYWN0aXZlX2NvbnRleHRfdG9fY29uZmlndXJhdGlvbl9tYXBbY3R4X3R5cGVdICE9IG51bGxwdHIKLSAgICAgICAgICAgICAgICAgICAgICA/IGFjdGl2ZV9jb250ZXh0X3RvX2NvbmZpZ3VyYXRpb25fbWFwW2N0eF90eXBlXS0+bmFtZQotICAgICAgICAgICAgICAgICAgICAgIDogImVtcHR5IikKLSAgICAgICAgICAgICAgPDwgIiAtPiAiIDw8IChuZXdfY29uZiAhPSBudWxscHRyID8gbmV3X2NvbmYtPm5hbWUgOiAiZW1wdHkiKTsKLSAgICBhY3RpdmVfY29udGV4dF90b19jb25maWd1cmF0aW9uX21hcFtjdHhfdHlwZV0gPSBuZXdfY29uZjsKLSAgfQotCi0gIC8qIFNvbWUgY29udGV4dHMgaGF2ZSBjaGFuZ2VkLCByZXR1cm4gbmV3IGFjdGl2ZSBjb250ZXh0IGJpdHNldCAqLwotICBpZiAoYWN0aXZlX2NvbnRleHRzX2hhc19iZWVuX21vZGlmaWVkKSB7Ci0gICAgYWN0aXZlX2NvbnRleHRzX21hc2tfID0gY29udGV4dHM7Ci0gICAgcmV0dXJuIGNvbnRleHRzOwotICB9Ci0KLSAgLyogTm90aGluZyBoYXMgY2hhbmdlZCAqLwotICByZXR1cm4gc3RkOjpudWxsb3B0OwotfQotCi1ib29sIExlQXVkaW9EZXZpY2VHcm91cDo6UmVsb2FkQXVkaW9Mb2NhdGlvbnModm9pZCkgewotICBBdWRpb0xvY2F0aW9ucyB1cGRhdGVkX3Nua19hdWRpb19sb2NhdGlvbnNfID0KLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbk1vbm9VbnNwZWNpZmllZDsKLSAgQXVkaW9Mb2NhdGlvbnMgdXBkYXRlZF9zcmNfYXVkaW9fbG9jYXRpb25zXyA9Ci0gICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Nb25vVW5zcGVjaWZpZWQ7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBsZUF1ZGlvRGV2aWNlc18pIHsKLSAgICBpZiAoZGV2aWNlLmV4cGlyZWQoKSkgY29udGludWU7Ci0gICAgdXBkYXRlZF9zbmtfYXVkaW9fbG9jYXRpb25zXyB8PSBkZXZpY2UubG9jaygpLmdldCgpLT5zbmtfYXVkaW9fbG9jYXRpb25zXzsKLSAgICB1cGRhdGVkX3NyY19hdWRpb19sb2NhdGlvbnNfIHw9IGRldmljZS5sb2NrKCkuZ2V0KCktPnNyY19hdWRpb19sb2NhdGlvbnNfOwotICB9Ci0KLSAgLyogTm90aGluZyBoYXMgY2hhbmdlZCAqLwotICBpZiAoKHVwZGF0ZWRfc25rX2F1ZGlvX2xvY2F0aW9uc18gPT0gc25rX2F1ZGlvX2xvY2F0aW9uc18pICYmCi0gICAgICAodXBkYXRlZF9zcmNfYXVkaW9fbG9jYXRpb25zXyA9PSBzcmNfYXVkaW9fbG9jYXRpb25zXykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNua19hdWRpb19sb2NhdGlvbnNfID0gdXBkYXRlZF9zbmtfYXVkaW9fbG9jYXRpb25zXzsKLSAgc3JjX2F1ZGlvX2xvY2F0aW9uc18gPSB1cGRhdGVkX3NyY19hdWRpb19sb2NhdGlvbnNfOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExlQXVkaW9EZXZpY2VHcm91cDo6SXNJblRyYW5zaXRpb24odm9pZCkgewotICByZXR1cm4gdGFyZ2V0X3N0YXRlXyAhPSBjdXJyZW50X3N0YXRlXzsKLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlR3JvdXA6OklzUmVsZWFzaW5nKHZvaWQpIHsKLSAgcmV0dXJuIHRhcmdldF9zdGF0ZV8gPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRTsKLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlR3JvdXA6OklzR3JvdXBTdHJlYW1SZWFkeSh2b2lkKSB7Ci0gIGF1dG8gaXRlciA9Ci0gICAgICBzdGQ6OmZpbmRfaWYobGVBdWRpb0RldmljZXNfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSwgW10oYXV0byYgZCkgewotICAgICAgICBpZiAoZC5leHBpcmVkKCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuICEoKChkLmxvY2soKSkuZ2V0KCkpLT5IYXZlQWxsQWN0aXZlQXNlc0Npc0VzdCgpKTsKLSAgICAgIH0pOwotCi0gIHJldHVybiBpdGVyID09IGxlQXVkaW9EZXZpY2VzXy5lbmQoKTsKLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlR3JvdXA6OkhhdmVBbGxBY3RpdmVEZXZpY2VzQ2lzRGlzYyh2b2lkKSB7Ci0gIGF1dG8gaXRlciA9Ci0gICAgICBzdGQ6OmZpbmRfaWYobGVBdWRpb0RldmljZXNfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSwgW10oYXV0byYgZCkgewotICAgICAgICBpZiAoZC5leHBpcmVkKCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuICEoKChkLmxvY2soKSkuZ2V0KCkpLT5IYXZlQWxsQXNlc0Npc0Rpc2MoKSk7Ci0gICAgICB9KTsKLQotICByZXR1cm4gaXRlciA9PSBsZUF1ZGlvRGV2aWNlc18uZW5kKCk7Ci19Ci0KLXVpbnQ4X3QgTGVBdWRpb0RldmljZUdyb3VwOjpHZXRGaXJzdEZyZWVDaXNJZCh2b2lkKSB7Ci0gIGZvciAodWludDhfdCBpZCA9IDA7IGlkIDwgVUlOVDhfTUFYOyBpZCsrKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF0oYXV0byYgZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmV4cGlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChkLmxvY2soKSkuZ2V0KCkpLT5IYXNDaXNJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgaWYgKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpKSByZXR1cm4gaWQ7Ci0gIH0KLQotICByZXR1cm4ga0ludmFsaWRDaXNJZDsKLX0KLQotYm9vbCBDaGVja0lmU3RyYXRlZ3lTdXBwb3J0ZWQodHlwZXM6OkxlQXVkaW9Db25maWd1cmF0aW9uU3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6QXVkaW9Mb2NhdGlvbnMgYXVkaW9fbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXF1ZXN0ZWRfY2hhbm5lbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudF9tYXNrKSB7Ci0gIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzdHJhdGVneTogIiA8PCAoaW50KXN0cmF0ZWd5Ci0gICAgICAgICAgICAgPDwgIiBsb2NhdGlvbnM6ICIgPDwgK2F1ZGlvX2xvY2F0aW9ucy50b191bG9uZygpOwotCi0gIHN3aXRjaCAoc3RyYXRlZ3kpIHsKLSAgICBjYXNlIHR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjpNT05PX09ORV9DSVNfUEVSX0RFVklDRToKLSAgICAgIHJldHVybiBhdWRpb19sb2NhdGlvbnMuYW55KCk7Ci0gICAgY2FzZSB0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6U1RFUkVPX1RXT19DSVNFU19QRVJfREVWSUNFOgotICAgICAgaWYgKChhdWRpb19sb2NhdGlvbnMudG9fdWxvbmcoKSAmCi0gICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkFueUxlZnQpICYmCi0gICAgICAgICAgKGF1ZGlvX2xvY2F0aW9ucy50b191bG9uZygpICYKLSAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQW55UmlnaHQpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgdHlwZXM6OkxlQXVkaW9Db25maWd1cmF0aW9uU3RyYXRlZ3k6OlNURVJFT19PTkVfQ0lTX1BFUl9ERVZJQ0U6Ci0gICAgICBpZiAoIShhdWRpb19sb2NhdGlvbnMudG9fdWxvbmcoKSAmCi0gICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25BbnlMZWZ0KSB8fAotICAgICAgICAgICEoYXVkaW9fbG9jYXRpb25zLnRvX3Vsb25nKCkgJgotICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQW55UmlnaHQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiByZXF1ZXN0ZWQgY2hhbiBjbnQgIgotICAgICAgICAgICAgICAgICA8PCArcmVxdWVzdGVkX2NoYW5uZWxfY291bnQKLSAgICAgICAgICAgICAgICAgPDwgIiBjaGFuIG1hc2s6ICIgPDwgbG9naGV4KGNoYW5uZWxfY291bnRfbWFzayk7Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIGlmIHJlcXVlc3RlZCBjaGFubmVsIGNvdW50IGlzIHNldCBpbiB0aGUgY2hhbm5lbCBjb3VudAotICAgICAgICogbWFzay4gSW4gdGhlIGNoYW5uZWxfY291bnRfbWFzaywgYml0MCBpcyBzZXQgd2hlbiAxIGNoYW5uZWwgaXMKLSAgICAgICAqIHN1cHBvcnRlZC4KLSAgICAgICAqLwotICAgICAgcmV0dXJuICgoMSA8PCAocmVxdWVzdGVkX2NoYW5uZWxfY291bnQgLSAxKSkgJiBjaGFubmVsX2NvdW50X21hc2spOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgbWV0aG9kIGNoZWNrIGlmIGdyb3VwIHN1cHBvcnQgZ2l2ZW4gYXVkaW8gY29uZmlndXJhdGlvbgotICogcmVxdWlyZW1lbnQgZm9yIGNvbm5lY3RlZCBkZXZpY2VzIGluIHRoZSBncm91cCBhbmQgYXZhaWxhYmxlIEFTRXMKLSAqIChubyBtYXR0ZXIgb24gdGhlIEFTRSBzdGF0ZSkgYW5kIGZvciBnaXZlbiBjb250ZXh0IHR5cGUKLSAqLwotYm9vbCBMZUF1ZGlvRGV2aWNlR3JvdXA6OklzQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICBjb25zdCBzZXRfY29uZmlndXJhdGlvbnM6OkF1ZGlvU2V0Q29uZmlndXJhdGlvbiogYXVkaW9fc2V0X2NvbmYsCi0gICAgdHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpIHsKLSAgaWYgKCFzZXRfY29uZmlndXJhdGlvbnM6OmNoZWNrX2lmX21heV9jb3Zlcl9zY2VuYXJpbygKLSAgICAgICAgICBhdWRpb19zZXRfY29uZiwgTnVtT2ZDb25uZWN0ZWQoY29udGV4dF90eXBlKSkpIHsKLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2Fubm90IGNvdmVyIHNjZW5hcmlvICIKLSAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oY29udGV4dF90eXBlKQotICAgICAgICAgICAgICAgPDwgIiBzaXplIG9mIGZvciBjb250ZXh0IHR5cGU6ICIKLSAgICAgICAgICAgICAgIDw8ICtOdW1PZkNvbm5lY3RlZChjb250ZXh0X3R5cGUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIFRPRE8gRm9yIG5vdzogc2V0IGFzZSBpZiBtYXRjaGluZyB3aXRoIGZpcnN0IHBhYy4KLSAgICogMSkgV2UgYXNzdW1lIGFzIHdlbGwgdGhhdCBkZXZpY2VzIHdpbGwgbWF0Y2ggcmVxdWlyZW1lbnRzIGluIG9yZGVyCi0gICAqICAgIGUuZy4gMSBEZXZpY2UgLSAxIFJlcXVpcmVtZW50LCAyIERldmljZSAtIDIgUmVxdWlyZW1lbnQgZXRjLgotICAgKiAyKSBBU0VzIHNob3VsZCBiZSBhY3RpdmUgb25seSBpZiBiZXN0IChhY2NvcmRpbmcgdG8gcHJpb3JpdHkgbGlzdCkgZnVsbAotICAgKiAgICBzY2VuYXJpb24gd2lsbCBiZSBjb3ZlcmVkLgotICAgKiAzKSBBU0VzIHNob3VsZCBiZSBmaWxsZWQgYWNjb3JkaW5nIHRvIHBlcmZvcm1hbmNlIHByb2ZpbGUuCi0gICAqLwotICBmb3IgKGNvbnN0IGF1dG8mIGVudCA6ICgqYXVkaW9fc2V0X2NvbmYpLmNvbmZzKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIiBMb29raW5nIGZvciBjb25maWd1cmF0aW9uOiAiIDw8IGF1ZGlvX3NldF9jb25mLT5uYW1lCi0gICAgICAgICAgICAgICA8PCAiIC0gIgotICAgICAgICAgICAgICAgPDwgKGVudC5kaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luayA/ICJzbmsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInNyYyIpOwotCi0gICAgdWludDhfdCByZXF1aXJlZF9kZXZpY2VfY250ID0gZW50LmRldmljZV9jbnQ7Ci0gICAgdWludDhfdCBtYXhfcmVxdWlyZWRfYXNlX3Blcl9kZXYgPQotICAgICAgICBlbnQuYXNlX2NudCAvIGVudC5kZXZpY2VfY250ICsgKGVudC5hc2VfY250ICUgZW50LmRldmljZV9jbnQpOwotICAgIHVpbnQ4X3QgYWN0aXZlX2FzZV9udW0gPSAwOwotICAgIGF1dG8gc3RyYXRlZ3kgPSBlbnQuc3RyYXRlZ3k7Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTnVtYmVyIG9mIGRldmljZXM6ICIgPDwgK3JlcXVpcmVkX2RldmljZV9jbnQKLSAgICAgICAgICAgICAgIDw8ICIgbnVtYmVyIG9mIEFTRXM6ICIgPDwgK2VudC5hc2VfY250Ci0gICAgICAgICAgICAgICA8PCAiIE1heCBBU0UgcGVyIGRldmljZTogIiA8PCArbWF4X3JlcXVpcmVkX2FzZV9wZXJfZGV2Ci0gICAgICAgICAgICAgICA8PCAiIHN0cmF0ZWd5OiAiIDw8IHN0YXRpY19jYXN0PGludD4oc3RyYXRlZ3kpOwotCi0gICAgZm9yIChhdXRvKiBkZXZpY2UgPSBHZXRGaXJzdERldmljZVdpdGhBY3RpdmVDb250ZXh0KGNvbnRleHRfdHlwZSk7Ci0gICAgICAgICBkZXZpY2UgIT0gbnVsbHB0ciAmJiByZXF1aXJlZF9kZXZpY2VfY250ID4gMDsKLSAgICAgICAgIGRldmljZSA9IEdldE5leHREZXZpY2VXaXRoQWN0aXZlQ29udGV4dChkZXZpY2UsIGNvbnRleHRfdHlwZSkpIHsKLSAgICAgIC8qIFNraXAgaWYgZGV2aWNlIGhhcyBBU0UgY29uZmlndXJlZCBpbiB0aGlzIGRpcmVjdGlvbiBhbHJlYWR5ICovCi0KLSAgICAgIGlmIChkZXZpY2UtPmFzZXNfLmVtcHR5KCkpIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIWRldmljZS0+SXNDb2RlY0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoZW50LmRpcmVjdGlvbiwgZW50LmNvZGVjKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGludCBuZWVkZWRfYXNlID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihtYXhfcmVxdWlyZWRfYXNlX3Blcl9kZXYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGVudC5hc2VfY250IC0gYWN0aXZlX2FzZV9udW0pKTsKLQotICAgICAgLyogSWYgd2UgcmVxdWlyZWQgbW9yZSBBU0VzIHBlciBkZXZpY2Ugd2hpY2ggbWVhbnMgd2Ugd291bGQgbGlrZSB0bwotICAgICAgICogY3JlYXRlIG1vcmUgQ0lTZXMgdG8gb25lIGRldmljZSwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFsbG9jYXRpb24KLSAgICAgICAqIGlmIGl0IGFsbG93cyB1cyB0byBkbyB0aGlzLgotICAgICAgICovCi0KLSAgICAgIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyBhdWRpb19sb2NhdGlvbnMgPSAwOwotICAgICAgLyogQ2hlY2sgZGlyZWN0aW9uIGFuZCBpZiBhdWRpbyBsb2NhdGlvbiBhbGxvd3MgdG8gY3JlYXRlIG1vcmUgY2lzZSAqLwotICAgICAgaWYgKGVudC5kaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaykKLSAgICAgICAgYXVkaW9fbG9jYXRpb25zID0gZGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zXzsKLSAgICAgIGVsc2UKLSAgICAgICAgYXVkaW9fbG9jYXRpb25zID0gZGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zXzsKLQotICAgICAgLyogVE9ETyBNYWtlIGl0IG5vIExjMyBzcGVjaWZpYyAqLwotICAgICAgaWYgKCFDaGVja0lmU3RyYXRlZ3lTdXBwb3J0ZWQoCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBhdWRpb19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgIHN0ZDo6Z2V0PExlQXVkaW9MYzNDb25maWc+KGVudC5jb2RlYy5jb25maWcpLkdldENoYW5uZWxDb3VudCgpLAotICAgICAgICAgICAgICBkZXZpY2UtPkdldExjM1N1cHBvcnRlZENoYW5uZWxDb3VudChlbnQuZGlyZWN0aW9uKSkpIHsKLSAgICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluc3VmZmljaWVudCBkZXZpY2UgYXVkaW8gYWxsb2NhdGlvbjogIgotICAgICAgICAgICAgICAgICAgIDw8IGF1ZGlvX2xvY2F0aW9uczsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoYXV0byYgYXNlIDogZGV2aWNlLT5hc2VzXykgewotICAgICAgICBpZiAoYXNlLmRpcmVjdGlvbiAhPSBlbnQuZGlyZWN0aW9uKSBjb250aW51ZTsKLQotICAgICAgICBhY3RpdmVfYXNlX251bSsrOwotICAgICAgICBuZWVkZWRfYXNlLS07Ci0KLSAgICAgICAgaWYgKG5lZWRlZF9hc2UgPT0gMCkgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHJlcXVpcmVkX2RldmljZV9jbnQtLTsKLSAgICB9Ci0KLSAgICBpZiAocmVxdWlyZWRfZGV2aWNlX2NudCA+IDApIHsKLSAgICAgIC8qIERvbid0IGxlZnQgYW55IGFjdGl2ZSBkZXZpY2VzIGlmIHJlcXVpcmVtZW50cyBhcmUgbm90IG1ldCAqLwotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvdWxkIG5vdCBjb25maWd1cmUgYWxsIHRoZSBkZXZpY2VzIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBETE9HKElORk8pIDw8ICJDaG9vc2VkIEFTRSBDb25maWd1cmF0aW9uIGZvciBncm91cDogIiA8PCB0aGlzLT5ncm91cF9pZF8KLSAgICAgICAgICAgICA8PCAiIGNvbmZpZ3VyYXRpb246ICIgPDwgYXVkaW9fc2V0X2NvbmYtPm5hbWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi11aW50MzJfdCBHZXRGaXJzdExlZnQoY29uc3QgdHlwZXM6OkF1ZGlvTG9jYXRpb25zIGF1ZGlvX2xvY2F0aW9ucykgewotICB1aW50MzJfdCBhdWRpb19sb2NhdGlvbl91bG9uZyA9IGF1ZGlvX2xvY2F0aW9ucy50b191bG9uZygpOwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkJhY2tMZWZ0KQotICAgIHJldHVybiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25CYWNrTGVmdDsKLQotICBpZiAoYXVkaW9fbG9jYXRpb25fdWxvbmcgJiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnRPZkNlbnRlcikKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0T2ZDZW50ZXI7Ci0KLSAgaWYgKGF1ZGlvX2xvY2F0aW9uX3Vsb25nICYgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uU2lkZUxlZnQpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblNpZGVMZWZ0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblRvcEZyb250TGVmdCkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uVG9wRnJvbnRMZWZ0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblRvcEJhY2tMZWZ0KQotICAgIHJldHVybiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Ub3BCYWNrTGVmdDsKLQotICBpZiAoYXVkaW9fbG9jYXRpb25fdWxvbmcgJiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Ub3BTaWRlTGVmdCkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uVG9wU2lkZUxlZnQ7Ci0KLSAgaWYgKGF1ZGlvX2xvY2F0aW9uX3Vsb25nICYgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQm90dG9tRnJvbnRMZWZ0KQotICAgIHJldHVybiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Cb3R0b21Gcm9udExlZnQ7Ci0KLSAgaWYgKGF1ZGlvX2xvY2F0aW9uX3Vsb25nICYgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0V2lkZSkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0V2lkZTsKLQotICBpZiAoYXVkaW9fbG9jYXRpb25fdWxvbmcgJiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25MZWZ0U3Vycm91bmQpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkxlZnRTdXJyb3VuZDsKLQotICBMT0dfQVNTRVJUKDApIDw8IF9fZnVuY19fIDw8ICIgc2hhbGwgbm90IGhhcHBlbiI7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBHZXRGaXJzdFJpZ2h0KGNvbnN0IHR5cGVzOjpBdWRpb0xvY2F0aW9ucyBhdWRpb19sb2NhdGlvbnMpIHsKLSAgdWludDMyX3QgYXVkaW9fbG9jYXRpb25fdWxvbmcgPSBhdWRpb19sb2NhdGlvbnMudG9fdWxvbmcoKTsKLQotICBpZiAoYXVkaW9fbG9jYXRpb25fdWxvbmcgJiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0KQotICAgIHJldHVybiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkJhY2tSaWdodCkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQmFja1JpZ2h0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmCi0gICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0T2ZDZW50ZXIpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHRPZkNlbnRlcjsKLQotICBpZiAoYXVkaW9fbG9jYXRpb25fdWxvbmcgJiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TaWRlUmlnaHQpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblNpZGVSaWdodDsKLQotICBpZiAoYXVkaW9fbG9jYXRpb25fdWxvbmcgJiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Ub3BGcm9udFJpZ2h0KQotICAgIHJldHVybiBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Ub3BGcm9udFJpZ2h0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblRvcEJhY2tSaWdodCkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uVG9wQmFja1JpZ2h0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblRvcFNpZGVSaWdodCkKLSAgICByZXR1cm4gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uVG9wU2lkZVJpZ2h0OwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkJvdHRvbUZyb250UmlnaHQpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkJvdHRvbUZyb250UmlnaHQ7Ci0KLSAgaWYgKGF1ZGlvX2xvY2F0aW9uX3Vsb25nICYgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodFdpZGUpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHRXaWRlOwotCi0gIGlmIChhdWRpb19sb2NhdGlvbl91bG9uZyAmIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblJpZ2h0U3Vycm91bmQpCi0gICAgcmV0dXJuIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblJpZ2h0U3Vycm91bmQ7Ci0KLSAgTE9HX0FTU0VSVCgwKSA8PCBfX2Z1bmNfXyA8PCAiIHNoYWxsIG5vdCBoYXBwZW4iOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgUGlja0F1ZGlvTG9jYXRpb24odHlwZXM6OkxlQXVkaW9Db25maWd1cmF0aW9uU3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6QXVkaW9Mb2NhdGlvbnMgYXVkaW9fbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OkF1ZGlvTG9jYXRpb25zKiBncm91cF9hdWRpb19sb2NhdGlvbnMpIHsKLSAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHN0cmF0ZWd5OiAiIDw8IChpbnQpc3RyYXRlZ3kKLSAgICAgICAgICAgICA8PCAiIGxvY2F0aW9uczogIiA8PCArYXVkaW9fbG9jYXRpb25zLnRvX3Vsb25nKCkKLSAgICAgICAgICAgICA8PCAiIGdyb3VwIGxvY2F0aW9uczogIiA8PCArZ3JvdXBfYXVkaW9fbG9jYXRpb25zLT50b191bG9uZygpOwotCi0gIHN3aXRjaCAoc3RyYXRlZ3kpIHsKLSAgICBjYXNlIHR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjpNT05PX09ORV9DSVNfUEVSX0RFVklDRToKLSAgICBjYXNlIHR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjpTVEVSRU9fVFdPX0NJU0VTX1BFUl9ERVZJQ0U6Ci0gICAgICBpZiAoKGF1ZGlvX2xvY2F0aW9ucy50b191bG9uZygpICYKLSAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQW55TGVmdCkgJiYKLSAgICAgICAgICAhKGdyb3VwX2F1ZGlvX2xvY2F0aW9ucy0+dG9fdWxvbmcoKSAmCi0gICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25BbnlMZWZ0KSkgewotICAgICAgICB1aW50MzJfdCBsZWZ0X2xvY2F0aW9uID0gR2V0Rmlyc3RMZWZ0KGF1ZGlvX2xvY2F0aW9ucyk7Ci0gICAgICAgICpncm91cF9hdWRpb19sb2NhdGlvbnMgfD0gbGVmdF9sb2NhdGlvbjsKLSAgICAgICAgcmV0dXJuIGxlZnRfbG9jYXRpb247Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoYXVkaW9fbG9jYXRpb25zLnRvX3Vsb25nKCkgJgotICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25BbnlSaWdodCkgJiYKLSAgICAgICAgICAhKGdyb3VwX2F1ZGlvX2xvY2F0aW9ucy0+dG9fdWxvbmcoKSAmCi0gICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25BbnlSaWdodCkpIHsKLSAgICAgICAgdWludDMyX3QgcmlnaHRfbG9jYXRpb24gPSBHZXRGaXJzdFJpZ2h0KGF1ZGlvX2xvY2F0aW9ucyk7Ci0gICAgICAgICpncm91cF9hdWRpb19sb2NhdGlvbnMgfD0gcmlnaHRfbG9jYXRpb247Ci0gICAgICAgIHJldHVybiByaWdodF9sb2NhdGlvbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdHlwZXM6OkxlQXVkaW9Db25maWd1cmF0aW9uU3RyYXRlZ3k6OlNURVJFT19PTkVfQ0lTX1BFUl9ERVZJQ0U6Ci0gICAgICBpZiAoKGF1ZGlvX2xvY2F0aW9ucy50b191bG9uZygpICYKLSAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uQW55TGVmdCkgJiYKLSAgICAgICAgICAoYXVkaW9fbG9jYXRpb25zLnRvX3Vsb25nKCkgJgotICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25BbnlSaWdodCkpIHsKLSAgICAgICAgdWludDMyX3QgbGVmdF9sb2NhdGlvbiA9IEdldEZpcnN0TGVmdChhdWRpb19sb2NhdGlvbnMpOwotICAgICAgICB1aW50MzJfdCByaWdodF9sb2NhdGlvbiA9IEdldEZpcnN0UmlnaHQoYXVkaW9fbG9jYXRpb25zKTsKLSAgICAgICAgKmdyb3VwX2F1ZGlvX2xvY2F0aW9ucyB8PSBsZWZ0X2xvY2F0aW9uIHwgcmlnaHRfbG9jYXRpb247Ci0gICAgICAgIHJldHVybiBsZWZ0X2xvY2F0aW9uIHwgcmlnaHRfbG9jYXRpb247Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0FTU0VSVCgwKSA8PCAiIFNoYWxsIG5ldmVyIGhhcHBlbiAiOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotICBMT0dfQVNTRVJUKDApIDw8ICIgU2hhbGwgbmV2ZXIgaGFwcGVuICI7Ci0gIHJldHVybiAwOwotfQotCi1ib29sIExlQXVkaW9EZXZpY2U6OkNvbmZpZ3VyZUFzZXMoCi0gICAgY29uc3QgbGVfYXVkaW86OnNldF9jb25maWd1cmF0aW9uczo6U2V0Q29uZmlndXJhdGlvbiYgZW50LAotICAgIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlLAotICAgIHVpbnQ4X3QqIG51bWJlcl9vZl9hbHJlYWR5X2FjdGl2ZV9ncm91cF9hc2UsCi0gICAgdHlwZXM6OkF1ZGlvTG9jYXRpb25zJiBncm91cF9zbmtfYXVkaW9fbG9jYXRpb25zLAotICAgIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyYgZ3JvdXBfc3JjX2F1ZGlvX2xvY2F0aW9ucywgYm9vbCByZWNvbm5lY3QpIHsKLSAgc3RydWN0IGFzZSogYXNlID0gR2V0Rmlyc3RJbmFjdGl2ZUFzZShlbnQuZGlyZWN0aW9uLCByZWNvbm5lY3QpOwotICBpZiAoIWFzZSkgcmV0dXJuIGZhbHNlOwotCi0gIHVpbnQ4X3QgYWN0aXZlX2FzZXMgPSAqbnVtYmVyX29mX2FscmVhZHlfYWN0aXZlX2dyb3VwX2FzZTsKLSAgdWludDhfdCBtYXhfcmVxdWlyZWRfYXNlX3Blcl9kZXYgPQotICAgICAgZW50LmFzZV9jbnQgLyBlbnQuZGV2aWNlX2NudCArIChlbnQuYXNlX2NudCAlIGVudC5kZXZpY2VfY250KTsKLSAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5IHN0cmF0ZWd5ID0gZW50LnN0cmF0ZWd5OwotCi0gIGJvb2wgaXNfY29kZWNfc3VwcG9ydGVkID0KLSAgICAgIElzQ29kZWNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGVudC5kaXJlY3Rpb24sIGVudC5jb2RlYyk7Ci0gIGlmICghaXNfY29kZWNfc3VwcG9ydGVkKSByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IG5lZWRlZF9hc2UgPSBzdGQ6Om1pbigoaW50KShtYXhfcmVxdWlyZWRfYXNlX3Blcl9kZXYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGVudC5hc2VfY250IC0gYWN0aXZlX2FzZXMpKTsKLQotICB0eXBlczo6QXVkaW9Mb2NhdGlvbnMgYXVkaW9fbG9jYXRpb25zID0gMDsKLSAgdHlwZXM6OkF1ZGlvTG9jYXRpb25zKiBncm91cF9hdWRpb19sb2NhdGlvbnM7Ci0gIC8qIENoZWNrIGRpcmVjdGlvbiBhbmQgaWYgYXVkaW8gbG9jYXRpb24gYWxsb3dzIHRvIGNyZWF0ZSBtb3JlIGNpc2UgKi8KLSAgaWYgKGVudC5kaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaykgewotICAgIGF1ZGlvX2xvY2F0aW9ucyA9IHNua19hdWRpb19sb2NhdGlvbnNfOwotICAgIGdyb3VwX2F1ZGlvX2xvY2F0aW9ucyA9ICZncm91cF9zbmtfYXVkaW9fbG9jYXRpb25zOwotICB9IGVsc2UgewotICAgIGF1ZGlvX2xvY2F0aW9ucyA9IHNyY19hdWRpb19sb2NhdGlvbnNfOwotICAgIGdyb3VwX2F1ZGlvX2xvY2F0aW9ucyA9ICZncm91cF9zcmNfYXVkaW9fbG9jYXRpb25zOwotICB9Ci0KLSAgZm9yICg7IG5lZWRlZF9hc2UgJiYgYXNlOyBuZWVkZWRfYXNlLS0pIHsKLSAgICBhc2UtPmFjdGl2ZSA9IHRydWU7Ci0gICAgYWN0aXZlX2FzZXMrKzsKLQotICAgIGlmIChhc2UtPnN0YXRlID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQpCi0gICAgICBhc2UtPnJlY29uZmlndXJlID0gdHJ1ZTsKLQotICAgIGFzZS0+Y29kZWNfaWQgPSBlbnQuY29kZWMuaWQ7Ci0gICAgLyogVE9ETzogZmluZCBiZXR0ZXIgd2F5IHRvIG5vdCB1c2UgTEMzIGV4cGxpY2l0bHkgKi8KLSAgICBhc2UtPmNvZGVjX2NvbmZpZyA9IHN0ZDo6Z2V0PExlQXVkaW9MYzNDb25maWc+KGVudC5jb2RlYy5jb25maWcpOwotCi0gICAgLypMZXQncyBjaG9vc2UgYXVkaW8gY2hhbm5lbCBhbGxvY2F0aW9uIGlmIG5vdCBzZXQgKi8KLSAgICBhc2UtPmNvZGVjX2NvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24gPQotICAgICAgICBQaWNrQXVkaW9Mb2NhdGlvbihzdHJhdGVneSwgYXVkaW9fbG9jYXRpb25zLCBncm91cF9hdWRpb19sb2NhdGlvbnMpOwotCi0gICAgYXNlLT5tYXhfc2R1X3NpemUgPSBjb2RlY19zcGVjX2NhcHM6OkdldEF1ZGlvQ2hhbm5lbENvdW50cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2UtPmNvZGVjX2NvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24pICoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzZS0+Y29kZWNfY29uZmlnLm9jdGV0c19wZXJfY29kZWNfZnJhbWU7Ci0gICAgYXNlLT5tZXRhZGF0YSA9IEdldE1ldGFkYXRhKGNvbnRleHRfdHlwZSk7Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlPSIgPDwgYWRkcmVzc18KLSAgICAgICAgICAgICAgIDw8ICIsIGFjdGl2YXRlZCBBU0UgaWQ9IiA8PCArYXNlLT5pZAotICAgICAgICAgICAgICAgPDwgIiwgZGlyZWN0aW9uPSIgPDwgK2FzZS0+ZGlyZWN0aW9uCi0gICAgICAgICAgICAgICA8PCAiLCBtYXhfc2R1X3NpemU9IiA8PCArYXNlLT5tYXhfc2R1X3NpemUKLSAgICAgICAgICAgICAgIDw8ICIsIGNpc19pZD0iIDw8ICthc2UtPmNpc19pZDsKLQotICAgIGFzZSA9IEdldEZpcnN0SW5hY3RpdmVBc2UoZW50LmRpcmVjdGlvbiwgcmVjb25uZWN0KTsKLSAgfQotCi0gICpudW1iZXJfb2ZfYWxyZWFkeV9hY3RpdmVfZ3JvdXBfYXNlID0gYWN0aXZlX2FzZXM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIG1ldGhvZCBzaG91bGQgY2hvb3NlIGFwcm9wZXJpYXRlIEFTRXMgdG8gYmUgYWN0aXZlIGFuZCBzZXQgYSBjYWNoZWQKLSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNvZGVjIGFuZCBxb3MuCi0gKi8KLWJvb2wgTGVBdWRpb0RldmljZUdyb3VwOjpDb25maWd1cmVBc2VzKAotICAgIGNvbnN0IHNldF9jb25maWd1cmF0aW9uczo6QXVkaW9TZXRDb25maWd1cmF0aW9uKiBhdWRpb19zZXRfY29uZiwKLSAgICB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgewotICBpZiAoIXNldF9jb25maWd1cmF0aW9uczo6Y2hlY2tfaWZfbWF5X2NvdmVyX3NjZW5hcmlvKAotICAgICAgICAgIGF1ZGlvX3NldF9jb25mLCBOdW1PZkNvbm5lY3RlZChjb250ZXh0X3R5cGUpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVE9ETyBGb3Igbm93OiBzZXQgYXNlIGlmIG1hdGNoaW5nIHdpdGggZmlyc3QgcGFjLgotICAgKiAxKSBXZSBhc3N1bWUgYXMgd2VsbCB0aGF0IGRldmljZXMgd2lsbCBtYXRjaCByZXF1aXJlbWVudHMgaW4gb3JkZXIKLSAgICogICAgZS5nLiAxIERldmljZSAtIDEgUmVxdWlyZW1lbnQsIDIgRGV2aWNlIC0gMiBSZXF1aXJlbWVudCBldGMuCi0gICAqIDIpIEFTRXMgc2hvdWxkIGJlIGFjdGl2ZSBvbmx5IGlmIGJlc3QgKGFjY29yZGluZyB0byBwcmlvcml0eSBsaXN0KSBmdWxsCi0gICAqICAgIHNjZW5hcmlvbiB3aWxsIGJlIGNvdmVyZWQuCi0gICAqIDMpIEFTRXMgc2hvdWxkIGJlIGZpbGxlZCBhY2NvcmRpbmcgdG8gcGVyZm9ybWFuY2UgcHJvZmlsZS4KLSAgICovCi0KLSAgdHlwZXM6OkF1ZGlvTG9jYXRpb25zIGdyb3VwX3Nua19hdWRpb19sb2NhdGlvbnMgPSAwOwotICB0eXBlczo6QXVkaW9Mb2NhdGlvbnMgZ3JvdXBfc3JjX2F1ZGlvX2xvY2F0aW9ucyA9IDA7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBlbnQgOiAoKmF1ZGlvX3NldF9jb25mKS5jb25mcykgewotICAgIERMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICIgTG9va2luZyBmb3IgcmVxdWlyZW1lbnRzOiAiIDw8IGF1ZGlvX3NldF9jb25mLT5uYW1lIDw8ICIgLSAiCi0gICAgICAgICAgICAgICA8PCAoZW50LmRpcmVjdGlvbiA9PSAxID8gInNuayIgOiAic3JjIik7Ci0KLSAgICB1aW50OF90IHJlcXVpcmVkX2RldmljZV9jbnQgPSBlbnQuZGV2aWNlX2NudDsKLSAgICB1aW50OF90IG1heF9yZXF1aXJlZF9hc2VfcGVyX2RldiA9Ci0gICAgICAgIGVudC5hc2VfY250IC8gZW50LmRldmljZV9jbnQgKyAoZW50LmFzZV9jbnQgJSBlbnQuZGV2aWNlX2NudCk7Ci0gICAgdWludDhfdCBhY3RpdmVfYXNlX251bSA9IDA7Ci0gICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5IHN0cmF0ZWd5ID0gZW50LnN0cmF0ZWd5OwotCi0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE51bWJlciBvZiBkZXZpY2VzOiAiIDw8ICtyZXF1aXJlZF9kZXZpY2VfY250Ci0gICAgICAgICAgICAgICA8PCAiIG51bWJlciBvZiBBU0VzOiAiIDw8ICtlbnQuYXNlX2NudAotICAgICAgICAgICAgICAgPDwgIiBNYXggQVNFIHBlciBkZXZpY2U6ICIgPDwgK21heF9yZXF1aXJlZF9hc2VfcGVyX2RldgotICAgICAgICAgICAgICAgPDwgIiBzdHJhdGVneTogIiA8PCAoaW50KXN0cmF0ZWd5OwotCi0gICAgZm9yIChhdXRvKiBkZXZpY2UgPSBHZXRGaXJzdERldmljZVdpdGhBY3RpdmVDb250ZXh0KGNvbnRleHRfdHlwZSk7Ci0gICAgICAgICBkZXZpY2UgIT0gbnVsbHB0ciAmJiByZXF1aXJlZF9kZXZpY2VfY250ID4gMDsKLSAgICAgICAgIGRldmljZSA9IEdldE5leHREZXZpY2VXaXRoQWN0aXZlQ29udGV4dChkZXZpY2UsIGNvbnRleHRfdHlwZSkpIHsKLSAgICAgIC8qIFNraXAgaWYgZGV2aWNlIGhhcyBBU0UgY29uZmlndXJlZCBpbiB0aGlzIGRpcmVjdGlvbiBhbHJlYWR5ICovCi0gICAgICBpZiAoZGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGlyZWN0aW9uKGVudC5kaXJlY3Rpb24pKSBjb250aW51ZTsKLQotICAgICAgaWYgKCFkZXZpY2UtPkNvbmZpZ3VyZUFzZXMoZW50LCBjb250ZXh0X3R5cGUsICZhY3RpdmVfYXNlX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX3Nua19hdWRpb19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9zcmNfYXVkaW9fbG9jYXRpb25zKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHJlcXVpcmVkX2RldmljZV9jbnQtLTsKLSAgICB9Ci0KLSAgICBpZiAocmVxdWlyZWRfZGV2aWNlX2NudCA+IDApIHsKLSAgICAgIC8qIERvbid0IGxlZnQgYW55IGFjdGl2ZSBkZXZpY2VzIGlmIHJlcXVpcmVtZW50cyBhcmUgbm90IG1ldCAqLwotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGNvdWxkIG5vdCBjb25maWd1cmUgYWxsIHRoZSBkZXZpY2VzIjsKLSAgICAgIERlYWN0aXZhdGUoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBMT0coSU5GTykgPDwgIkNob29zZWQgQVNFIENvbmZpZ3VyYXRpb24gZm9yIGdyb3VwOiAiIDw8IHRoaXMtPmdyb3VwX2lkXwotICAgICAgICAgICAgPDwgIiBjb25maWd1cmF0aW9uOiAiIDw8IGF1ZGlvX3NldF9jb25mLT5uYW1lOwotCi0gIGFjdGl2ZV9jb250ZXh0X3R5cGVfID0gY29udGV4dF90eXBlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qCi1MZUF1ZGlvRGV2aWNlR3JvdXA6OkdldEFjdGl2ZUNvbmZpZ3VyYXRpb24odm9pZCkgewotICByZXR1cm4gYWN0aXZlX2NvbnRleHRfdG9fY29uZmlndXJhdGlvbl9tYXBbYWN0aXZlX2NvbnRleHRfdHlwZV9dOwotfQotQXVkaW9Db250ZXh0cyBMZUF1ZGlvRGV2aWNlR3JvdXA6OkdldEFjdGl2ZUNvbnRleHRzKHZvaWQpIHsKLSAgcmV0dXJuIGFjdGl2ZV9jb250ZXh0c19tYXNrXzsKLX0KLQotc3RkOjpvcHRpb25hbDxMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uPgotTGVBdWRpb0RldmljZUdyb3VwOjpHZXRDb2RlY0NvbmZpZ3VyYXRpb25CeURpcmVjdGlvbigKLSAgICB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGdyb3VwX2NvbnRleHRfdHlwZSwgdWludDhfdCBkaXJlY3Rpb24pIHsKLSAgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qIGF1ZGlvX3NldF9jb25mID0KLSAgICAgIGFjdGl2ZV9jb250ZXh0X3RvX2NvbmZpZ3VyYXRpb25fbWFwW2dyb3VwX2NvbnRleHRfdHlwZV07Ci0gIExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb24gZ3JvdXBfY29uZmlnID0gezAsIDAsIDAsIDB9OwotICBpZiAoIWF1ZGlvX3NldF9jb25mKSByZXR1cm4gc3RkOjpudWxsb3B0OwotCi0gIGZvciAoY29uc3QgYXV0byYgY29uZiA6IGF1ZGlvX3NldF9jb25mLT5jb25mcykgewotICAgIGlmIChjb25mLmRpcmVjdGlvbiAhPSBkaXJlY3Rpb24pIGNvbnRpbnVlOwotCi0gICAgaWYgKGdyb3VwX2NvbmZpZy5zYW1wbGVfcmF0ZSAhPSAwICYmCi0gICAgICAgIGNvbmYuY29kZWMuR2V0Q29uZmlnU2FtcGxpbmdGcmVxdWVuY3koKSAhPSBncm91cF9jb25maWcuc2FtcGxlX3JhdGUpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0cmVhbSBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgImRldGVybWluZWQgKHNhbXBsaW5nIGZyZXF1ZW5jeSBkaWZmZXJzKSBmb3IgZGlyZWN0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGRpcmVjdGlvbik7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICBncm91cF9jb25maWcuc2FtcGxlX3JhdGUgPSBjb25mLmNvZGVjLkdldENvbmZpZ1NhbXBsaW5nRnJlcXVlbmN5KCk7Ci0KLSAgICBpZiAoZ3JvdXBfY29uZmlnLmRhdGFfaW50ZXJ2YWxfdXMgIT0gMCAmJgotICAgICAgICBjb25mLmNvZGVjLkdldENvbmZpZ0RhdGFJbnRlcnZhbFVzKCkgIT0gZ3JvdXBfY29uZmlnLmRhdGFfaW50ZXJ2YWxfdXMpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0cmVhbSBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgImRldGVybWluZWQgKGRhdGEgaW50ZXJ2YWwgZGlmZmVycykgZm9yIGRpcmVjdGlvbjogIgotICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChkaXJlY3Rpb24pOwotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgZ3JvdXBfY29uZmlnLmRhdGFfaW50ZXJ2YWxfdXMgPSBjb25mLmNvZGVjLkdldENvbmZpZ0RhdGFJbnRlcnZhbFVzKCk7Ci0KLSAgICBpZiAoZ3JvdXBfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSAhPSAwICYmCi0gICAgICAgIGNvbmYuY29kZWMuR2V0Q29uZmlnQml0c1BlclNhbXBsZSgpICE9IGdyb3VwX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0cmVhbSBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgImRldGVybWluZWQgKGJpdHMgcGVyIHNhbXBsZSBkaWZmZXJzKSBmb3IgZGlyZWN0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGRpcmVjdGlvbik7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICBncm91cF9jb25maWcuYml0c19wZXJfc2FtcGxlID0gY29uZi5jb2RlYy5HZXRDb25maWdCaXRzUGVyU2FtcGxlKCk7Ci0KLSAgICBncm91cF9jb25maWcubnVtX2NoYW5uZWxzICs9Ci0gICAgICAgIGNvbmYuY29kZWMuR2V0Q29uZmlnQ2hhbm5lbENvdW50KCkgKiBjb25mLmRldmljZV9jbnQ7Ci0gIH0KLQotICBpZiAoZ3JvdXBfY29uZmlnLklzSW52YWxpZCgpKSByZXR1cm4gc3RkOjpudWxsb3B0OwotCi0gIHJldHVybiBncm91cF9jb25maWc7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZUdyb3VwOjpJc01ldGFkYXRhQ2hhbmdlZCgKLSAgICB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgewotICBmb3IgKGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBHZXRGaXJzdEFjdGl2ZURldmljZSgpOyBsZUF1ZGlvRGV2aWNlOwotICAgICAgIGxlQXVkaW9EZXZpY2UgPSBHZXROZXh0QWN0aXZlRGV2aWNlKGxlQXVkaW9EZXZpY2UpKSB7Ci0gICAgaWYgKGxlQXVkaW9EZXZpY2UtPklzTWV0YWRhdGFDaGFuZ2VkKGNvbnRleHRfdHlwZSkpIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi10eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIExlQXVkaW9EZXZpY2VHcm91cDo6R2V0Q3VycmVudENvbnRleHRUeXBlKHZvaWQpIHsKLSAgcmV0dXJuIGFjdGl2ZV9jb250ZXh0X3R5cGVfOwotfQotCi1jb25zdCBzZXRfY29uZmlndXJhdGlvbnM6OkF1ZGlvU2V0Q29uZmlndXJhdGlvbioKLUxlQXVkaW9EZXZpY2VHcm91cDo6RmluZEZpcnN0U3VwcG9ydGVkQ29uZmlndXJhdGlvbigKLSAgICBMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gIGNvbnN0IHNldF9jb25maWd1cmF0aW9uczo6QXVkaW9TZXRDb25maWd1cmF0aW9ucyogY29uZnMgPQotICAgICAgc2V0X2NvbmZpZ3VyYXRpb25zOjpnZXRfY29uZnNfYnlfdHlwZShjb250ZXh0X3R5cGUpOwotCi0gIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjb250ZXh0IHR5cGU6ICIgPDwgKGludCljb250ZXh0X3R5cGUKLSAgICAgICAgICAgICA8PCAiIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlczogIiA8PCBOdW1PZkNvbm5lY3RlZCgpOwotCi0gIC8qIEZpbHRlciBvdXQgZGV2aWNlIHNldCBmb3IgYWxsIHNjZW5hcmlvcyAqLwotICBpZiAoIXNldF9jb25maWd1cmF0aW9uczo6Y2hlY2tfaWZfbWF5X2NvdmVyX3NjZW5hcmlvKGNvbmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bU9mQ29ubmVjdGVkKCkpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBncm91cCBpcyB1bmFibGUgdG8gY292ZXIgc2NlbmFyaW8iOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgLyogRmlsdGVyIG91dCBkZXZpY2Ugc2V0IGZvciBlYWNoIGVuZCBldmVyeSBzY2VuYXJpbyAqLwotCi0gIGZvciAoY29uc3QgYXV0byYgY29uZiA6ICpjb25mcykgewotICAgIGlmIChJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uZiwgY29udGV4dF90eXBlKSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGZvdW5kOiAiIDw8IGNvbmYtPm5hbWU7Ci0gICAgICByZXR1cm4gY29uZjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLyogVGhpcyBtZXRob2Qgc2hvdWxkIGNob29zZSBhcHJvcGVyaWF0ZSBBU0VzIHRvIGJlIGFjdGl2ZSBhbmQgc2V0IGEgY2FjaGVkCi0gKiBjb25maWd1cmF0aW9uIGZvciBjb2RlYyBhbmQgcW9zLgotICovCi1ib29sIExlQXVkaW9EZXZpY2VHcm91cDo6Q29uZmlndXJlKExlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpIHsKLSAgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qIGNvbmYgPQotICAgICAgYWN0aXZlX2NvbnRleHRfdG9fY29uZmlndXJhdGlvbl9tYXBbY29udGV4dF90eXBlXTsKLQotICBETE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gIGlmICghY29uZikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgcmVxdWVzdGVkIGNvbnRleHQgdHlwZTogIgotICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb250ZXh0X3R5cGUpKQotICAgICAgICAgICAgICAgPDwgIiwgaXMgaW4gbWlzbWF0Y2ggd2l0aCBjYWNoZWQgYWN0aXZlIGNvbnRleHRzIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2V0dGluZyBjb250ZXh0IHR5cGU6ICIgPDwgaW50KGNvbnRleHRfdHlwZSk7Ci0KLSAgaWYgKCFDb25maWd1cmVBc2VzKGNvbmYsIGNvbnRleHRfdHlwZSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHJlcXVlc3RlZCBwaWNrIEFTRSBjb25maWcgY29udGV4dCB0eXBlOiAiCi0gICAgICAgICAgICAgICA8PCBsb2doZXgoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbnRleHRfdHlwZSkpCi0gICAgICAgICAgICAgICA8PCAiLCBpcyBpbiBtaXNtYXRjaCB3aXRoIGNhY2hlZCBhY3RpdmUgY29udGV4dHMiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotTGVBdWRpb0RldmljZUdyb3VwOjp+TGVBdWRpb0RldmljZUdyb3VwKHZvaWQpIHsgdGhpcy0+Q2xlYW51cCgpOyB9Ci12b2lkIExlQXVkaW9EZXZpY2VHcm91cDo6RHVtcChpbnQgZmQpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICBhdXRvKiBhY3RpdmVfY29uZiA9IEdldEFjdGl2ZUNvbmZpZ3VyYXRpb24oKTsKLQotICBzdHJlYW0gPDwgIiAgICA9PSBHcm91cCBpZDogIiA8PCBncm91cF9pZF8gPDwgIiA9PSBcbiIKLSAgICAgICAgIDw8ICIgICAgICBzdGF0ZTogIiA8PCBHZXRTdGF0ZSgpIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICB0YXJnZXQgc3RhdGU6ICIgPDwgR2V0VGFyZ2V0U3RhdGUoKSA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgbnVtYmVyIG9mIGRldmljZXM6ICIgPDwgU2l6ZSgpIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICBudW1iZXIgb2YgY29ubmVjdGVkIGRldmljZXM6ICIgPDwgTnVtT2ZDb25uZWN0ZWQoKSA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgYWN0aXZlIGNvbnRleHQgdHlwZXM6ICIKLSAgICAgICAgIDw8IGxvZ2hleChHZXRBY3RpdmVDb250ZXh0cygpLnRvX3Vsb25nKCkpIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICBjdXJyZW50IGNvbnRleHQgdHlwZTogIgotICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihHZXRDdXJyZW50Q29udGV4dFR5cGUoKSkgPDwgIlxuIgotICAgICAgICAgPDwgIiAgICAgIGFjdGl2ZSBzdHJlYW0gY29uZmlndXJhdGlvbiBuYW1lOiAiCi0gICAgICAgICA8PCAoYWN0aXZlX2NvbmYgPyBhY3RpdmVfY29uZi0+bmFtZSA6ICIgbm90IHNldCIpIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgTGFzdCB1c2VkIHN0cmVhbSBjb25maWd1cmF0aW9uOiBcbiIKLSAgICAgICAgIDw8ICIgICAgICB2YWxpZDogIiA8PCAoc3RyZWFtX2NvbmYudmFsaWQgPyAiIFllcyAiIDogIiBObyIpIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICBjb2RlYyBpZCA6ICIgPDwgKyhzdHJlYW1fY29uZi5pZC5jb2RpbmdfZm9ybWF0KSA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgbmFtZTogIgotICAgICAgICAgPDwgKHN0cmVhbV9jb25mLmNvbmYgIT0gbnVsbHB0ciA/IHN0cmVhbV9jb25mLmNvbmYtPm5hbWUgOiAiIG51bGwgIikKLSAgICAgICAgIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICBudW1iZXIgb2Ygc2lua3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gIgotICAgICAgICAgPDwgc3RyZWFtX2NvbmYuc2lua19udW1fb2ZfZGV2aWNlcyA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgbnVtYmVyIG9mIHNpbmtfc3RyZWFtcyBjb25uZWN0ZWQ6ICIKLSAgICAgICAgIDw8IHN0cmVhbV9jb25mLnNpbmtfc3RyZWFtcy5zaXplKCkgPDwgIlxuIgotICAgICAgICAgPDwgIiAgICAgIG51bWJlciBvZiBzb3VyY2VzIGluIHRoZSBjb25maWd1cmF0aW9uICIKLSAgICAgICAgIDw8IHN0cmVhbV9jb25mLnNvdXJjZV9udW1fb2ZfZGV2aWNlcyA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgbnVtYmVyIG9mIHNvdXJjZV9zdHJlYW1zIGNvbm5lY3RlZDogIgotICAgICAgICAgPDwgc3RyZWFtX2NvbmYuc291cmNlX3N0cmVhbXMuc2l6ZSgpIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICA9PT0gZGV2aWNlczogPT09XG4iOwotCi0gIGRwcmludGYoZmQsICIlcyIsIHN0cmVhbS5zdHIoKS5jX3N0cigpKTsKLQotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZV9pdGVyIDogbGVBdWRpb0RldmljZXNfKSB7Ci0gICAgZGV2aWNlX2l0ZXIubG9jaygpLT5EdW1wKGZkKTsKLSAgfQotfQotCi0vKiBMZUF1ZGlvRGV2aWNlIENsYXNzIG1ldGhvZHMgaW1wbGVtZW50YXRpb24gKi8KLXZvaWQgTGVBdWRpb0RldmljZTo6Q2xlYXJQQUNzKHZvaWQpIHsKLSAgc25rX3BhY3NfLmNsZWFyKCk7Ci0gIHNyY19wYWNzXy5jbGVhcigpOwotfQotCi1MZUF1ZGlvRGV2aWNlOjp+TGVBdWRpb0RldmljZSh2b2lkKSB7Ci0gIGFsYXJtX2ZyZWUobGlua19xdWFsaXR5X3RpbWVyKTsKLSAgdGhpcy0+Q2xlYXJQQUNzKCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0RldmljZTo6UmVnaXN0ZXJQQUNzKAotICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCB0eXBlczo6YWNzX2FjX3JlY29yZD4qIHBhY19kYiwKLSAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+KiBwYWNfcmVjcykgewotICAvKiBDbGVhciBQQUMgZGF0YWJhc2UgZm9yIGNoYXJhY3RlcmlzdGljIGluIGNhc2UgaWYgcmUtcmVhZCwgaW5kaWNhdGVkICovCi0gIGlmICghcGFjX2RiLT5lbXB0eSgpKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCB1cGdyYWRlIFBBQ3MgZm9yIGNoYXJhY3RlcmlzdGljIjsKLSAgICBwYWNfZGItPmNsZWFyKCk7Ci0gIH0KLQotICAvKiBUT0RPIHdyYXAgdGhpcyBsb2dnaW5nIHBhcnQgd2l0aCBkZWJ1ZyBmbGFnICovCi0gIGZvciAoY29uc3Qgc3RydWN0IHR5cGVzOjphY3NfYWNfcmVjb3JkJiBwYWMgOiAqcGFjX3JlY3MpIHsKLSAgICBMT0coSU5GTykgPDwgIlJlZ2lzdGVyaW5nIFBBQyIKLSAgICAgICAgICAgICAgPDwgIlxuXHRDb2RpbmcgZm9ybWF0OiAiIDw8IGxvZ2hleChwYWMuY29kZWNfaWQuY29kaW5nX2Zvcm1hdCkKLSAgICAgICAgICAgICAgPDwgIlxuXHRWZW5kb3IgY29kZWMgY29tcGFueSBJRDogIgotICAgICAgICAgICAgICA8PCBsb2doZXgocGFjLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkKQotICAgICAgICAgICAgICA8PCAiXG5cdFZlbmRvciBjb2RlYyBJRDogIiA8PCBsb2doZXgocGFjLmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCkKLSAgICAgICAgICAgICAgPDwgIlxuXHRDb2RlYyBzcGVjIGNhcHM6XG4iCi0gICAgICAgICAgICAgIDw8IHBhYy5jb2RlY19zcGVjX2NhcHMuVG9TdHJpbmcoKSA8PCAiXG5cdE1ldGFkYXRhOiAiCi0gICAgICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZShwYWMubWV0YWRhdGEuZGF0YSgpLCBwYWMubWV0YWRhdGEuc2l6ZSgpKTsKLSAgfQotCi0gIHBhY19kYi0+aW5zZXJ0KHBhY19kYi0+YmVnaW4oKSwgcGFjX3JlY3MtPmJlZ2luKCksIHBhY19yZWNzLT5lbmQoKSk7Ci19Ci0KLXN0cnVjdCBhc2UqIExlQXVkaW9EZXZpY2U6OkdldEFzZUJ5VmFsSGFuZGxlKHVpbnQxNl90IHZhbF9oZGwpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKAotICAgICAgYXNlc18uYmVnaW4oKSwgYXNlc18uZW5kKCksCi0gICAgICBbJnZhbF9oZGxdKGNvbnN0IGF1dG8mIGFzZSkgeyByZXR1cm4gYXNlLmhkbHMudmFsX2hkbCA9PSB2YWxfaGRsOyB9KTsKLQotICByZXR1cm4gKGl0ZXIgPT0gYXNlc18uZW5kKCkpID8gbnVsbHB0ciA6ICYoKml0ZXIpOwotfQotCi1zdHJ1Y3QgYXNlKiBMZUF1ZGlvRGV2aWNlOjpHZXRGaXJzdEluYWN0aXZlQXNlV2l0aFN0YXRlKHVpbnQ4X3QgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2VTdGF0ZSBzdGF0ZSkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICBhc2VzXy5iZWdpbigpLCBhc2VzXy5lbmQoKSwgW2RpcmVjdGlvbiwgc3RhdGVdKGNvbnN0IGF1dG8mIGFzZSkgewotICAgICAgICByZXR1cm4gKChhc2UuZGlyZWN0aW9uID09IGRpcmVjdGlvbikgJiYgKGFzZS5zdGF0ZSA9PSBzdGF0ZSkpOwotICAgICAgfSk7Ci0KLSAgcmV0dXJuIChpdGVyID09IGFzZXNfLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLX0KLQotc3RydWN0IGFzZSogTGVBdWRpb0RldmljZTo6R2V0Rmlyc3RBY3RpdmVBc2Uodm9pZCkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYXNlc18uYmVnaW4oKSwgYXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvJiBhc2UpIHsgcmV0dXJuIGFzZS5hY3RpdmU7IH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBhc2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci19Ci0KLXN0cnVjdCBhc2UqIExlQXVkaW9EZXZpY2U6OkdldEZpcnN0QWN0aXZlQXNlQnlEaXJlY3Rpb24odWludDhfdCBkaXJlY3Rpb24pIHsKLSAgYXV0byBpdGVyID0KLSAgICAgIHN0ZDo6ZmluZF9pZihhc2VzXy5iZWdpbigpLCBhc2VzXy5lbmQoKSwgW2RpcmVjdGlvbl0oY29uc3QgYXV0byYgYXNlKSB7Ci0gICAgICAgIHJldHVybiAoYXNlLmFjdGl2ZSAmJiAoYXNlLmRpcmVjdGlvbiA9PSBkaXJlY3Rpb24pKTsKLSAgICAgIH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBhc2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci19Ci0KLXN0cnVjdCBhc2UqIExlQXVkaW9EZXZpY2U6OkdldE5leHRBY3RpdmVBc2VXaXRoU2FtZURpcmVjdGlvbigKLSAgICBzdHJ1Y3QgYXNlKiBiYXNlX2FzZSkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYXNlc18uYmVnaW4oKSwgYXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmJhc2VfYXNlXShhdXRvJiBhc2UpIHsgcmV0dXJuIGJhc2VfYXNlID09ICZhc2U7IH0pOwotCi0gIC8qIEludmFsaWQgYXNlIGdpdmVuICovCi0gIGlmIChpdGVyID09IGFzZXNfLmVuZCgpIHx8IHN0ZDo6ZGlzdGFuY2UoaXRlciwgYXNlc18uZW5kKCkpIDwgMSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpdGVyID0KLSAgICAgIHN0ZDo6ZmluZF9pZihzdGQ6Om5leHQoaXRlciwgMSksIGFzZXNfLmVuZCgpLCBbJml0ZXJdKGNvbnN0IGF1dG8mIGFzZSkgewotICAgICAgICByZXR1cm4gYXNlLmFjdGl2ZSAmJiAoKml0ZXIpLmRpcmVjdGlvbiA9PSBhc2UuZGlyZWN0aW9uOwotICAgICAgfSk7Ci0KLSAgcmV0dXJuIChpdGVyID09IGFzZXNfLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLX0KLQotc3RydWN0IGFzZSogTGVBdWRpb0RldmljZTo6R2V0Rmlyc3RBY3RpdmVBc2VCeURhdGFQYXRoU3RhdGUoCi0gICAgdHlwZXM6OkF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZSBzdGF0ZSkgewotICBhdXRvIGl0ZXIgPQotICAgICAgc3RkOjpmaW5kX2lmKGFzZXNfLmJlZ2luKCksIGFzZXNfLmVuZCgpLCBbc3RhdGVdKGNvbnN0IGF1dG8mIGFzZSkgewotICAgICAgICByZXR1cm4gKGFzZS5hY3RpdmUgJiYgKGFzZS5kYXRhX3BhdGhfc3RhdGUgPT0gc3RhdGUpKTsKLSAgICAgIH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBhc2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci19Ci0KLXN0cnVjdCBhc2UqIExlQXVkaW9EZXZpY2U6OkdldEZpcnN0SW5hY3RpdmVBc2UodWludDhfdCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjb25uZWN0KSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihhc2VzXy5iZWdpbigpLCBhc2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXJlY3Rpb24sIHJlY29ubmVjdF0oY29uc3QgYXV0byYgYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc2UuYWN0aXZlIHx8IChhc2UuZGlyZWN0aW9uICE9IGRpcmVjdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb25uZWN0KSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFzZS5jaXNfaWQgIT0ga0ludmFsaWRDaXNJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICByZXR1cm4gKGl0ZXIgPT0gYXNlc18uZW5kKCkpID8gbnVsbHB0ciA6ICYoKml0ZXIpOwotfQotCi1zdHJ1Y3QgYXNlKiBMZUF1ZGlvRGV2aWNlOjpHZXROZXh0QWN0aXZlQXNlKHN0cnVjdCBhc2UqIGJhc2VfYXNlKSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihhc2VzXy5iZWdpbigpLCBhc2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYmFzZV9hc2VdKGF1dG8mIGFzZSkgeyByZXR1cm4gYmFzZV9hc2UgPT0gJmFzZTsgfSk7Ci0KLSAgLyogSW52YWxpZCBhc2UgZ2l2ZW4gKi8KLSAgaWYgKGl0ZXIgPT0gYXNlc18uZW5kKCkgfHwgc3RkOjpkaXN0YW5jZShpdGVyLCBhc2VzXy5lbmQoKSkgPCAxKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoc3RkOjpuZXh0KGl0ZXIsIDEpLCBhc2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvJiBhc2UpIHsgcmV0dXJuIGFzZS5hY3RpdmU7IH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBhc2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci19Ci0KLXN0cnVjdCBhc2UqIExlQXVkaW9EZXZpY2U6OkdldEFzZVRvTWF0Y2hCaWRpcmVjdGlvbkNpcyhzdHJ1Y3QgYXNlKiBiYXNlX2FzZSkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYXNlc18uYmVnaW4oKSwgYXNlc18uZW5kKCksIFsmYmFzZV9hc2VdKGF1dG8mIGFzZSkgewotICAgIHJldHVybiAoYmFzZV9hc2UtPmNpc19jb25uX2hkbCA9PSBhc2UuY2lzX2Nvbm5faGRsKSAmJgotICAgICAgICAgICAoYmFzZV9hc2UtPmRpcmVjdGlvbiAhPSBhc2UuZGlyZWN0aW9uKTsKLSAgfSk7Ci0gIHJldHVybiAoaXRlciA9PSBhc2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci19Ci0KLUJpZGlyZWN0QXNlc1BhaXIgTGVBdWRpb0RldmljZTo6R2V0QXNlc0J5Q2lzQ29ubkhkbCh1aW50MTZfdCBjb25uX2hkbCkgewotICBCaWRpcmVjdEFzZXNQYWlyIGFzZXM7Ci0KLSAgZm9yIChhdXRvJiBhc2UgOiBhc2VzXykgewotICAgIGlmIChhc2UuY2lzX2Nvbm5faGRsID09IGNvbm5faGRsKSB7Ci0gICAgICBpZiAoYXNlLmRpcmVjdGlvbiA9PSB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rKSB7Ci0gICAgICAgIGFzZXMuc2luayA9ICZhc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhc2VzLnNvdXJjZSA9ICZhc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGFzZXM7Ci19Ci0KLUJpZGlyZWN0QXNlc1BhaXIgTGVBdWRpb0RldmljZTo6R2V0QXNlc0J5Q2lzSWQodWludDhfdCBjaXNfaWQpIHsKLSAgQmlkaXJlY3RBc2VzUGFpciBhc2VzOwotCi0gIGZvciAoYXV0byYgYXNlIDogYXNlc18pIHsKLSAgICBpZiAoYXNlLmNpc19pZCA9PSBjaXNfaWQpIHsKLSAgICAgIGlmIChhc2UuZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspIHsKLSAgICAgICAgYXNlcy5zaW5rID0gJmFzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFzZXMuc291cmNlID0gJmFzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gYXNlczsKLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlOjpIYXZlQWN0aXZlQXNlKHZvaWQpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGFzZXNfLmJlZ2luKCksIGFzZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0byYgYXNlKSB7IHJldHVybiBhc2UuYWN0aXZlOyB9KTsKLQotICByZXR1cm4gaXRlciAhPSBhc2VzXy5lbmQoKTsKLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlOjpIYXZlQW55VW5jb25maWd1cmVkQXNlcyh2b2lkKSB7Ci0gIC8qIEluIGNvbmZpZ3VyaW5nIHN0YXRlIHdoZW4gYWN0aXZlIGluIElkbGUgb3IgQ29uZmlndXJlZCBhbmQgcmVjb25maWd1cmUgKi8KLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGFzZXNfLmJlZ2luKCksIGFzZXNfLmVuZCgpLCBbXShjb25zdCBhdXRvJiBhc2UpIHsKLSAgICBpZiAoIWFzZS5hY3RpdmUpIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChhc2Uuc3RhdGUgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSB8fAotICAgICAgICAoKGFzZS5zdGF0ZSA9PSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKSAmJgotICAgICAgICAgYXNlLnJlY29uZmlndXJlKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICByZXR1cm4gaXRlciAhPSBhc2VzXy5lbmQoKTsKLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlOjpIYXZlQWxsQWN0aXZlQXNlc1NhbWVTdGF0ZShBc2VTdGF0ZSBzdGF0ZSkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICBhc2VzXy5iZWdpbigpLCBhc2VzXy5lbmQoKSwKLSAgICAgIFsmc3RhdGVdKGNvbnN0IGF1dG8mIGFzZSkgeyByZXR1cm4gYXNlLmFjdGl2ZSAmJiAoYXNlLnN0YXRlICE9IHN0YXRlKTsgfSk7Ci0KLSAgcmV0dXJuIGl0ZXIgPT0gYXNlc18uZW5kKCk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZTo6SXNSZWFkeVRvQ3JlYXRlU3RyZWFtKHZvaWQpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGFzZXNfLmJlZ2luKCksIGFzZXNfLmVuZCgpLCBbXShjb25zdCBhdXRvJiBhc2UpIHsKLSAgICBpZiAoIWFzZS5hY3RpdmUpIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChhc2UuZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmsgJiYKLSAgICAgICAgKGFzZS5zdGF0ZSAhPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcgJiYKLSAgICAgICAgIGFzZS5zdGF0ZSAhPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9FTkFCTElORykpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChhc2UuZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSAmJgotICAgICAgICBhc2Uuc3RhdGUgIT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRU5BQkxJTkcpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLSAgfSk7Ci0KLSAgcmV0dXJuIGl0ZXIgPT0gYXNlc18uZW5kKCk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZTo6SXNSZWFkeVRvU3VzcGVuZFN0cmVhbSh2b2lkKSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihhc2VzXy5iZWdpbigpLCBhc2VzXy5lbmQoKSwgW10oY29uc3QgYXV0byYgYXNlKSB7Ci0gICAgaWYgKCFhc2UuYWN0aXZlKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoYXNlLmRpcmVjdGlvbiA9PSB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rICYmCi0gICAgICAgIGFzZS5zdGF0ZSAhPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKGFzZS5kaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlICYmCi0gICAgICAgIGFzZS5zdGF0ZSAhPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9ESVNBQkxJTkcpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLSAgfSk7Ci0KLSAgcmV0dXJuIGl0ZXIgPT0gYXNlc18uZW5kKCk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZTo6SGF2ZUFsbEFjdGl2ZUFzZXNDaXNFc3Qodm9pZCkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYXNlc18uYmVnaW4oKSwgYXNlc18uZW5kKCksIFtdKGNvbnN0IGF1dG8mIGFzZSkgewotICAgIHJldHVybiBhc2UuYWN0aXZlICYmCi0gICAgICAgICAgIChhc2UuZGF0YV9wYXRoX3N0YXRlICE9IEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0VTVEFCTElTSEVEKTsKLSAgfSk7Ci0KLSAgcmV0dXJuIGl0ZXIgPT0gYXNlc18uZW5kKCk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZTo6SGF2ZUFsbEFzZXNDaXNEaXNjKHZvaWQpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGFzZXNfLmJlZ2luKCksIGFzZXNfLmVuZCgpLCBbXShjb25zdCBhdXRvJiBhc2UpIHsKLSAgICByZXR1cm4gYXNlLmFjdGl2ZSAmJgotICAgICAgICAgICAoYXNlLmRhdGFfcGF0aF9zdGF0ZSAhPSBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19BU1NJR05FRCk7Ci0gIH0pOwotCi0gIHJldHVybiBpdGVyID09IGFzZXNfLmVuZCgpOwotfQotCi1ib29sIExlQXVkaW9EZXZpY2U6Okhhc0Npc0lkKHVpbnQ4X3QgaWQpIHsKLSAgc3RydWN0IGFzZSogYXNlID0gR2V0Rmlyc3RBY3RpdmVBc2UoKTsKLQotICB3aGlsZSAoYXNlKSB7Ci0gICAgaWYgKGFzZS0+Y2lzX2lkID09IGlkKSByZXR1cm4gdHJ1ZTsKLSAgICBhc2UgPSBHZXROZXh0QWN0aXZlQXNlKGFzZSk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXVpbnQ4X3QgTGVBdWRpb0RldmljZTo6R2V0TWF0Y2hpbmdCaWRpcmVjdGlvbkNpc0lkKAotICAgIGNvbnN0IHN0cnVjdCB0eXBlczo6YXNlKiBiYXNlX2FzZSkgewotICBmb3IgKGF1dG8mIGFzZSA6IGFzZXNfKSB7Ci0gICAgYXV0byYgY2lzID0gYXNlLmNpc19pZDsKLSAgICBpZiAoIWFzZS5hY3RpdmUpIGNvbnRpbnVlOwotCi0gICAgaW50IG51bV9jaXNlcyA9Ci0gICAgICAgIHN0ZDo6Y291bnRfaWYoYXNlc18uYmVnaW4oKSwgYXNlc18uZW5kKCksIFsmY2lzXShjb25zdCBhdXRvJiBpdGVyX2FzZSkgewotICAgICAgICAgIHJldHVybiBpdGVyX2FzZS5hY3RpdmUgJiYgaXRlcl9hc2UuY2lzX2lkID09IGNpczsKLSAgICAgICAgfSk7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZXJlIGlzIG9ubHkgb25lIEFTRSBmb3IgZGV2aWNlIHdpdGggdW5pcXVlIENJUyBJRCBhbmQgb3Bwb3NpdGUgdG8KLSAgICAgKiBkaXJlY3Rpb24gLSBpdCBtYXkgYmUgYmktZGlyZWN0aW9uYWwvY29tcGxldGl2ZS4KLSAgICAgKi8KLSAgICBpZiAobnVtX2Npc2VzID09IDEgJiYKLSAgICAgICAgKChiYXNlX2FzZS0+ZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmsgJiYKLSAgICAgICAgICBhc2UuZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSkgfHwKLSAgICAgICAgIChiYXNlX2FzZS0+ZGlyZWN0aW9uID09IHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSAmJgotICAgICAgICAgIGFzZS5kaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaykpKSB7Ci0gICAgICByZXR1cm4gYXNlLmNpc19pZDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4ga0ludmFsaWRDaXNJZDsKLX0KLQotdWludDhfdCBMZUF1ZGlvRGV2aWNlOjpHZXRMYzNTdXBwb3J0ZWRDaGFubmVsQ291bnQodWludDhfdCBkaXJlY3Rpb24pIHsKLSAgYXV0byYgcGFjcyA9Ci0gICAgICBkaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luayA/IHNua19wYWNzXyA6IHNyY19wYWNzXzsKLQotICBpZiAocGFjcy5zaXplKCkgPT0gMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBtaXNzaW5nIFBBQyBmb3IgZGlyZWN0aW9uICIgPDwgK2RpcmVjdGlvbjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgcGFjX3R1cGxlIDogcGFjcykgewotICAgIC8qIEdldCBQQUMgcmVjb3JkcyBmcm9tIHR1cGxlIGFzIHNlY29uZCBlbGVtZW50IGZyb20gdHVwbGUgKi8KLSAgICBhdXRvJiBwYWNfcmVjcyA9IHN0ZDo6Z2V0PDE+KHBhY190dXBsZSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gcGFjIDogcGFjX3JlY3MpIHsKLSAgICAgIGlmIChwYWMuY29kZWNfaWQuY29kaW5nX2Zvcm1hdCAhPSB0eXBlczo6a0xlQXVkaW9Db2RpbmdGb3JtYXRMQzMpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBhdXRvIHN1cHBvcnRlZF9jaGFubmVsX2NvdW50X2x0diA9IHBhYy5jb2RlY19zcGVjX2NhcHMuRmluZCgKLSAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNUeXBlQXVkaW9DaGFubmVsQ291bnRzKTsKLQotICAgICAgcmV0dXJuIFZFQ19VSU5UOF9UT19VSU5UOChzdXBwb3J0ZWRfY2hhbm5lbF9jb3VudF9sdHYudmFsdWUoKSk7Ci0gICAgfTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1ib29sIExlQXVkaW9EZXZpY2U6OklzQ29kZWNDb25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgIHVpbnQ4X3QgZGlyZWN0aW9uLCBjb25zdCBDb2RlY0NhcGFiaWxpdHlTZXR0aW5nJiBjb2RlY19jYXBhYmlsaXR5X3NldHRpbmcpIHsKLSAgYXV0byYgcGFjcyA9Ci0gICAgICBkaXJlY3Rpb24gPT0gdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luayA/IHNua19wYWNzXyA6IHNyY19wYWNzXzsKLQotICBpZiAocGFjcy5zaXplKCkgPT0gMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBtaXNzaW5nIFBBQyBmb3IgZGlyZWN0aW9uICIgPDwgK2RpcmVjdGlvbjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBUT0RPOiBWYWxpZGF0ZSBjaGFubmVsIGxvY2F0aW9ucyAqLwotCi0gIGZvciAoY29uc3QgYXV0byYgcGFjX3R1cGxlIDogcGFjcykgewotICAgIC8qIEdldCBQQUMgcmVjb3JkcyBmcm9tIHR1cGxlIGFzIHNlY29uZCBlbGVtZW50IGZyb20gdHVwbGUgKi8KLSAgICBhdXRvJiBwYWNfcmVjcyA9IHN0ZDo6Z2V0PDE+KHBhY190dXBsZSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gcGFjIDogcGFjX3JlY3MpIHsKLSAgICAgIGlmICghSXNDb2RlY0NhcGFiaWxpdHlTZXR0aW5nU3VwcG9ydGVkKHBhYywgY29kZWNfY2FwYWJpbGl0eV9zZXR0aW5nKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH07Ci0gIH0KLQotICAvKiBEb2Vzbid0IG1hdGNoIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gd2l0aCBhbnkgUEFDICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHN1cHBvcnRlZCBQSFkncyBiaXRmaWVsZAotICovCi11aW50OF90IExlQXVkaW9EZXZpY2U6OkdldFBoeUJpdG1hc2sodm9pZCkgewotICB1aW50OF90IHBoeV9iaXRmaWVsZCA9IGtJc29DaWdQaHkxTTsKLQotICBpZiAoQlRNX0lzUGh5Mm1TdXBwb3J0ZWQoYWRkcmVzc18sIEJUX1RSQU5TUE9SVF9MRSkpCi0gICAgcGh5X2JpdGZpZWxkIHw9IGtJc29DaWdQaHkyTTsKLQotICByZXR1cm4gcGh5X2JpdGZpZWxkOwotfQotCi12b2lkIExlQXVkaW9EZXZpY2U6OlNldFN1cHBvcnRlZENvbnRleHRzKEF1ZGlvQ29udGV4dHMgc25rX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbnRleHRzIHNyY19jb250ZXh0cykgewotICBzdXBwX3Nua19jb250ZXh0XyA9IHNua19jb250ZXh0czsKLSAgc3VwcF9zcmNfY29udGV4dF8gPSBzcmNfY29udGV4dHM7Ci19Ci0KLXZvaWQgTGVBdWRpb0RldmljZTo6RHVtcChpbnQgZmQpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICBzdHJlYW0gPDwgIiAgICAgICAgYWRkcmVzczogIiA8PCBhZGRyZXNzXyA8PCAiXG4iCi0gICAgICAgICA8PCAoY29ubl9pZF8gPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQgPyAiICAgICAgICAgIE5vdCBjb25uZWN0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiAgICAgICAgICBDb25uZWN0ZWQgY29ubl9pZCA9IikKLSAgICAgICAgIDw8IChjb25uX2lkXyA9PSBHQVRUX0lOVkFMSURfQ09OTl9JRCA/ICIiIDogc3RkOjp0b19zdHJpbmcoY29ubl9pZF8pKQotICAgICAgICAgPDwgIlxuIgotICAgICAgICAgPDwgIiAgICAgICAgICBzZXQgbWVtYmVyOiAiIDw8IChjc2lzX21lbWJlcl8gPyAiIFllcyIgOiAiIE5vIikgPDwgIlxuIgotICAgICAgICAgPDwgIiAgICAgICAgICBrbm93bl9zZXJ2aWNlX2hhbmRsZXNfOiAiIDw8IGtub3duX3NlcnZpY2VfaGFuZGxlc18KLSAgICAgICAgIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICAgICAgbm90aWZ5X2Nvbm5lY3RlZF9hZnRlcl9yZWFkXzogIgotICAgICAgICAgPDwgbm90aWZ5X2Nvbm5lY3RlZF9hZnRlcl9yZWFkXyA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgICAgIHJlbW92aW5nX2RldmljZV86ICIgPDwgcmVtb3ZpbmdfZGV2aWNlXyA8PCAiXG4iCi0gICAgICAgICA8PCAiICAgICAgICAgIGZpcnN0X2Nvbm5lY3Rpb25fOiAiIDw8IGZpcnN0X2Nvbm5lY3Rpb25fIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICAgICAgZW5jcnlwdGVkXzogIiA8PCBlbmNyeXB0ZWRfIDw8ICJcbiIKLSAgICAgICAgIDw8ICIgICAgICAgICAgY29ubmVjdGluZ19hY3RpdmVseV86ICIgPDwgY29ubmVjdGluZ19hY3RpdmVseV8gPDwgIlxuIjsKLQotICBkcHJpbnRmKGZkLCAiJXMiLCBzdHJlYW0uc3RyKCkuY19zdHIoKSk7Ci19Ci0KLUF1ZGlvQ29udGV4dHMgTGVBdWRpb0RldmljZTo6R2V0QXZhaWxhYmxlQ29udGV4dHModm9pZCkgewotICByZXR1cm4gYXZhaWxfc25rX2NvbnRleHRzXyB8IGF2YWlsX3NyY19jb250ZXh0c187Ci19Ci0KLS8qIFJldHVybnMgWE9SIG9mIHVwZGF0ZWQgc2luayBhbmQgc291cmNlIGJpdHNldCBjb250ZXh0IHR5cGVzICovCi1BdWRpb0NvbnRleHRzIExlQXVkaW9EZXZpY2U6OlNldEF2YWlsYWJsZUNvbnRleHRzKEF1ZGlvQ29udGV4dHMgc25rX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NvbnRleHRzIHNyY19jb250ZXh0cykgewotICBBdWRpb0NvbnRleHRzIHVwZGF0ZWRfY29udGV4dHM7Ci0KLSAgdXBkYXRlZF9jb250ZXh0cyA9IHNua19jb250ZXh0cyBeIGF2YWlsX3Nua19jb250ZXh0c187Ci0gIHVwZGF0ZWRfY29udGV4dHMgfD0gc3JjX2NvbnRleHRzIF4gYXZhaWxfc3JjX2NvbnRleHRzXzsKLQotICBETE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgPDwgIlxuXHQgYXZhaWxfc25rX2NvbnRleHRzXzogIiA8PCBhdmFpbF9zbmtfY29udGV4dHNfLnRvX3N0cmluZygpCi0gICAgICAgICAgICAgPDwgIlxuXHQgYXZhaWxfc3JjX2NvbnRleHRzXzogIiA8PCBhdmFpbF9zcmNfY29udGV4dHNfLnRvX3N0cmluZygpCi0gICAgICAgICAgICAgPDwgIlxuXHQgc25rX2NvbnRleHRzOiIgPDwgc25rX2NvbnRleHRzLnRvX3N0cmluZygpCi0gICAgICAgICAgICAgPDwgIlxuXHQgc3JjX2NvbnRleHRzOiAiIDw8IHNyY19jb250ZXh0cy50b19zdHJpbmcoKQotICAgICAgICAgICAgIDw8ICJcblx0IHVwZGF0ZWRfY29udGV4dHM6ICIgPDwgdXBkYXRlZF9jb250ZXh0cy50b19zdHJpbmcoKTsKLQotICBhdmFpbF9zbmtfY29udGV4dHNfID0gc25rX2NvbnRleHRzOwotICBhdmFpbF9zcmNfY29udGV4dHNfID0gc3JjX2NvbnRleHRzOwotCi0gIHJldHVybiB1cGRhdGVkX2NvbnRleHRzOwotfQotCi12b2lkIExlQXVkaW9EZXZpY2U6OkRlYWN0aXZhdGVBbGxBc2VzKHZvaWQpIHsKLSAgLyogSnVzdCBjbGVhciBzdGF0ZXMgYW5kIGtlZXAgcHJldmlvdXMgY29uZmlndXJhdGlvbiBmb3IgdXNlCi0gICAqIGluIGNhc2UgZGV2aWNlIHdpbGwgZ2V0IHJlY29ubmVjdGVkCi0gICAqLwotICBmb3IgKGF1dG8mIGFzZSA6IGFzZXNfKSB7Ci0gICAgaWYgKGFzZS5hY3RpdmUpIHsKLSAgICAgIGFzZS5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEU7Ci0gICAgICBhc2UuZGF0YV9wYXRoX3N0YXRlID0gQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpJRExFOwotICAgICAgYXNlLmFjdGl2ZSA9IGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBMZUF1ZGlvRGV2aWNlOjpHZXRNZXRhZGF0YSgKLSAgICBMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1ldGFkYXRhOwotCi0gIEFwcGVuZE1ldGFkYXRhTHR2RW50cnlGb3JTdHJlYW1pbmdDb250ZXh0KG1ldGFkYXRhLCBjb250ZXh0X3R5cGUpOwotICBBcHBlbmRNZXRhZGF0YUx0dkVudHJ5Rm9yQ2NpZExpc3QobWV0YWRhdGEsIGNvbnRleHRfdHlwZSk7Ci0KLSAgcmV0dXJuIHN0ZDo6bW92ZShtZXRhZGF0YSk7Ci19Ci0KLWJvb2wgTGVBdWRpb0RldmljZTo6SXNNZXRhZGF0YUNoYW5nZWQodHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpIHsKLSAgZm9yIChhdXRvKiBhc2UgPSB0aGlzLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOyBhc2U7Ci0gICAgICAgYXNlID0gdGhpcy0+R2V0TmV4dEFjdGl2ZUFzZShhc2UpKSB7Ci0gICAgaWYgKHRoaXMtPkdldE1ldGFkYXRhKGNvbnRleHRfdHlwZSkgIT0gYXNlLT5tZXRhZGF0YSkgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUxlQXVkaW9EZXZpY2VHcm91cCogTGVBdWRpb0RldmljZUdyb3Vwczo6QWRkKGludCBncm91cF9pZCkgewotICAvKiBHZXQgZmlyc3QgZnJlZSBncm91cCBpZCAqLwotICBpZiAoRmluZEJ5SWQoZ3JvdXBfaWQpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIiwgZ3JvdXAgYWxyZWFkeSBleGlzdHMsIGlkOiAiIDw8IGxvZ2hleChncm91cF9pZCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICByZXR1cm4gKGdyb3Vwc18uZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8TGVBdWRpb0RldmljZUdyb3VwPihncm91cF9pZCkpKQotICAgICAgLmdldCgpOwotfQotCi12b2lkIExlQXVkaW9EZXZpY2VHcm91cHM6OlJlbW92ZShpbnQgZ3JvdXBfaWQpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKAotICAgICAgZ3JvdXBzXy5iZWdpbigpLCBncm91cHNfLmVuZCgpLAotICAgICAgWyZncm91cF9pZF0oYXV0byBjb25zdCYgZ3JvdXApIHsgcmV0dXJuIGdyb3VwLT5ncm91cF9pZF8gPT0gZ3JvdXBfaWQ7IH0pOwotCi0gIGlmIChpdGVyID09IGdyb3Vwc18uZW5kKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIG5vIHN1Y2ggZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ3JvdXBzXy5lcmFzZShpdGVyKTsKLX0KLQotTGVBdWRpb0RldmljZUdyb3VwKiBMZUF1ZGlvRGV2aWNlR3JvdXBzOjpGaW5kQnlJZChpbnQgZ3JvdXBfaWQpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKAotICAgICAgZ3JvdXBzXy5iZWdpbigpLCBncm91cHNfLmVuZCgpLAotICAgICAgWyZncm91cF9pZF0oYXV0byBjb25zdCYgZ3JvdXApIHsgcmV0dXJuIGdyb3VwLT5ncm91cF9pZF8gPT0gZ3JvdXBfaWQ7IH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBncm91cHNfLmVuZCgpKSA/IG51bGxwdHIgOiBpdGVyLT5nZXQoKTsKLX0KLQotdm9pZCBMZUF1ZGlvRGV2aWNlR3JvdXBzOjpDbGVhbnVwKHZvaWQpIHsKLSAgZm9yIChhdXRvJiBnIDogZ3JvdXBzXykgewotICAgIGctPkNsZWFudXAoKTsKLSAgfQotCi0gIGdyb3Vwc18uY2xlYXIoKTsKLX0KLQotdm9pZCBMZUF1ZGlvRGV2aWNlR3JvdXBzOjpEdW1wKGludCBmZCkgewotICBmb3IgKGF1dG8mIGcgOiBncm91cHNfKSB7Ci0gICAgZy0+RHVtcChmZCk7Ci0gIH0KLX0KLQotYm9vbCBMZUF1ZGlvRGV2aWNlR3JvdXBzOjpJc0FueUluVHJhbnNpdGlvbih2b2lkKSB7Ci0gIGZvciAoYXV0byYgZyA6IGdyb3Vwc18pIHsKLSAgICBpZiAoZy0+SXNJblRyYW5zaXRpb24oKSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdyb3VwOiAiIDw8IGctPmdyb3VwX2lkXwotICAgICAgICAgICAgICAgICA8PCAiIGlzIGluIHRyYW5zaXRpb24iOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc2l6ZV90IExlQXVkaW9EZXZpY2VHcm91cHM6OlNpemUoKSB7IHJldHVybiAoZ3JvdXBzXy5zaXplKCkpOyB9Ci0KLXN0ZDo6dmVjdG9yPGludD4gTGVBdWRpb0RldmljZUdyb3Vwczo6R2V0R3JvdXBzSWRzKHZvaWQpIHsKLSAgc3RkOjp2ZWN0b3I8aW50PiByZXN1bHQ7Ci0KLSAgZm9yIChhdXRvIGNvbnN0JiBncm91cCA6IGdyb3Vwc18pIHsKLSAgICByZXN1bHQucHVzaF9iYWNrKGdyb3VwLT5ncm91cF9pZF8pOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogTGVBdWRpb0RldmljZXMgQ2xhc3MgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbiAqLwotdm9pZCBMZUF1ZGlvRGV2aWNlczo6QWRkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGJvb2wgZmlyc3RfY29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpIHsKLSAgYXV0byBkZXZpY2UgPSBGaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGFkZHJlc3M6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgPDwgIiBpcyBhbHJlYWR5IGFzc2lnbmVkIHRvIGdyb3VwOiAiIDw8IGRldmljZS0+Z3JvdXBfaWRfOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxlQXVkaW9EZXZpY2VzXy5lbXBsYWNlX2JhY2soCi0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExlQXVkaW9EZXZpY2U+KGFkZHJlc3MsIGZpcnN0X2Nvbm5lY3Rpb24sIGdyb3VwX2lkKSk7Ci19Ci0KLXZvaWQgTGVBdWRpb0RldmljZXM6OlJlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihsZUF1ZGlvRGV2aWNlc18uYmVnaW4oKSwgbGVBdWRpb0RldmljZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZhZGRyZXNzXShhdXRvIGNvbnN0JiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXyA9PSBhZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgaWYgKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBubyBzdWNoIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsZUF1ZGlvRGV2aWNlc18uZXJhc2UoaXRlcik7Ci19Ci0KLUxlQXVkaW9EZXZpY2UqIExlQXVkaW9EZXZpY2VzOjpGaW5kQnlBZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmFkZHJlc3NdKGF1dG8gY29uc3QmIGxlQXVkaW9EZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfID09IGFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICByZXR1cm4gKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpKSA/IG51bGxwdHIgOiBpdGVyLT5nZXQoKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPExlQXVkaW9EZXZpY2U+IExlQXVkaW9EZXZpY2VzOjpHZXRCeUFkZHJlc3MoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYobGVBdWRpb0RldmljZXNfLmJlZ2luKCksIGxlQXVkaW9EZXZpY2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYWRkcmVzc10oYXV0byBjb25zdCYgbGVBdWRpb0RldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVBdWRpb0RldmljZS0+YWRkcmVzc18gPT0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gIHJldHVybiAoaXRlciA9PSBsZUF1ZGlvRGV2aWNlc18uZW5kKCkpID8gbnVsbHB0ciA6ICppdGVyOwotfQotCi1MZUF1ZGlvRGV2aWNlKiBMZUF1ZGlvRGV2aWNlczo6RmluZEJ5Q29ubklkKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNvbm5faWRdKGF1dG8gY29uc3QmIGxlQXVkaW9EZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfID09IGNvbm5faWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICByZXR1cm4gKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpKSA/IG51bGxwdHIgOiBpdGVyLT5nZXQoKTsKLX0KLQotTGVBdWRpb0RldmljZSogTGVBdWRpb0RldmljZXM6OkZpbmRCeUNpc0Nvbm5IZGwoY29uc3QgdWludDE2X3QgY29ubl9oZGwpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGxlQXVkaW9EZXZpY2VzXy5iZWdpbigpLCBsZUF1ZGlvRGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNvbm5faGRsXShhdXRvJiBkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQXVkaW9EZXZpY2UqIGRldjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlkaXJlY3RBc2VzUGFpciBhc2VzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldiA9IGQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZXMgPSBkZXYtPkdldEFzZXNCeUNpc0Nvbm5IZGwoY29ubl9oZGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNlcy5zaW5rIHx8IGFzZXMuc291cmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgaWYgKGl0ZXIgPT0gbGVBdWRpb0RldmljZXNfLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gaXRlci0+Z2V0KCk7Ci19Ci0KLXNpemVfdCBMZUF1ZGlvRGV2aWNlczo6U2l6ZSgpIHsgcmV0dXJuIChsZUF1ZGlvRGV2aWNlc18uc2l6ZSgpKTsgfQotCi12b2lkIExlQXVkaW9EZXZpY2VzOjpEdW1wKGludCBmZCwgaW50IGdyb3VwX2lkKSB7Ci0gIGZvciAoYXV0byBjb25zdCYgZGV2aWNlIDogbGVBdWRpb0RldmljZXNfKSB7Ci0gICAgaWYgKGRldmljZS0+Z3JvdXBfaWRfID09IGdyb3VwX2lkKSB7Ci0gICAgICBkZXZpY2UtPkR1bXAoZmQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIExlQXVkaW9EZXZpY2VzOjpDbGVhbnVwKHZvaWQpIHsgbGVBdWRpb0RldmljZXNfLmNsZWFyKCk7IH0KLQotfSAgLy8gbmFtZXNwYWNlIGxlX2F1ZGlvCmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vZGV2aWNlcy5oIGIvYnRhL2xlX2F1ZGlvL2RldmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwMWRkMS4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vZGV2aWNlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQQotICogLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDx0dXBsZT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidF90eXBlcy5oIgotI2luY2x1ZGUgImJ0YV9ncm91cHMuaCIKLSNpbmNsdWRlICJidG1faXNvX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgImNsaWVudF9hdWRpby5oIgotI2luY2x1ZGUgImdhdHRfYXBpLmgiCi0jaW5jbHVkZSAibGVfYXVkaW9fdHlwZXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBsZV9hdWRpbyB7Ci0vKiBDbGFzcyBkZWZpbml0aW9ucyAqLwotCi0vKiBMZUF1ZGlvRGV2aWNlIGNsYXNzIHJlcHJlc2VudHMgR0FUVCBzZXJ2ZXIgZGV2aWNlIHdpdGggQVNDUywgUEFDIHNlcnZpY2VzIGFzCi0gKiBtYW5kYXRvcnkuIERldmljZSBtYXkgY29udGFpbiBtdWx0aXBsZSBBU0VzLCBQQUNzLCBhdWRpbyBsb2NhdGlvbnMuIEFTRXMgZnJvbQotICogbXVsdGlwbGUgZGV2aWNlcyBtYXkgYmUgZm9ybWVkIGluIGdyb3VwLgotICoKLSAqIERldmljZSBpcyBjcmVhdGVkIGFmdGVyIGNvbm5lY3Rpb24gb3IgYWZ0ZXIgc3RvcmFnZSByZXN0b3JhdGlvbi4KLSAqCi0gKiBBY3RpdmUgZGV2aWNlIG1lYW5zIHRoYXQgZGV2aWNlIGhhcyBhdCBsZWFzdCBvbmUgQVNFIHdoaWNoIHdpbGwgcGFydGljaXBhdGUKLSAqIGluIGFueSBzdGF0ZSB0cmFuc2l0aW9uIG9mIHN0YXRlIG1hY2hpbmUuIEFTRXMgYW5kIGRldmljZXMgd2lsbCBiZSBhY3RpdmF0ZWQKLSAqIGFjY29yZGluZyB0byByZXF1ZXN0ZWQgYnkgdXBwZXIgY29udGV4dCB0eXBlLgotICovCi1jbGFzcyBMZUF1ZGlvRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIFJhd0FkZHJlc3MgYWRkcmVzc187Ci0KLSAgYm9vbCBrbm93bl9zZXJ2aWNlX2hhbmRsZXNfOwotICBib29sIG5vdGlmeV9jb25uZWN0ZWRfYWZ0ZXJfcmVhZF87Ci0gIGJvb2wgcmVtb3ZpbmdfZGV2aWNlXzsKLQotICAvKiB3ZSBhcmUgbWFraW5nIGFjdGl2ZSBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhpcyBkZXZpY2UsICdkaXJlY3QgY29ubmVjdCcuCi0gICAqIFRoaXMgaXMgdHJ1ZSBvbmx5IGR1cmluZyBpbml0aWFsIHBoYXNlIG9mIGZpcnN0IGNvbm5lY3Rpb24uICovCi0gIGJvb2wgZmlyc3RfY29ubmVjdGlvbl87Ci0gIGJvb2wgY29ubmVjdGluZ19hY3RpdmVseV87Ci0gIHVpbnQxNl90IGNvbm5faWRfOwotICBib29sIGVuY3J5cHRlZF87Ci0gIGludCBncm91cF9pZF87Ci0gIGJvb2wgY3Npc19tZW1iZXJfOwotCi0gIHVpbnQ4X3QgYXVkaW9fZGlyZWN0aW9uc187Ci0gIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyBzbmtfYXVkaW9fbG9jYXRpb25zXzsKLSAgdHlwZXM6OkF1ZGlvTG9jYXRpb25zIHNyY19hdWRpb19sb2NhdGlvbnNfOwotCi0gIHR5cGVzOjpQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdGllcyBzbmtfcGFjc187Ci0gIHR5cGVzOjpQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdGllcyBzcmNfcGFjc187Ci0KLSAgc3RydWN0IHR5cGVzOjpoZGxfcGFpciBzbmtfYXVkaW9fbG9jYXRpb25zX2hkbHNfOwotICBzdHJ1Y3QgdHlwZXM6OmhkbF9wYWlyIHNyY19hdWRpb19sb2NhdGlvbnNfaGRsc187Ci0gIHN0cnVjdCB0eXBlczo6aGRsX3BhaXIgYXVkaW9fYXZhaWxfaGRsc187Ci0gIHN0cnVjdCB0eXBlczo6aGRsX3BhaXIgYXVkaW9fc3VwcF9jb250X2hkbHNfOwotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFzZT4gYXNlc187Ci0gIHN0cnVjdCB0eXBlczo6aGRsX3BhaXIgY3RwX2hkbHNfOwotCi0gIGFsYXJtX3QqIGxpbmtfcXVhbGl0eV90aW1lcjsKLSAgdWludDE2X3QgbGlua19xdWFsaXR5X3RpbWVyX2RhdGE7Ci0KLSAgTGVBdWRpb0RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzXywgYm9vbCBmaXJzdF9jb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIGludCBncm91cF9pZCA9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKQotICAgICAgOiBhZGRyZXNzXyhhZGRyZXNzXyksCi0gICAgICAgIGtub3duX3NlcnZpY2VfaGFuZGxlc18oZmFsc2UpLAotICAgICAgICBub3RpZnlfY29ubmVjdGVkX2FmdGVyX3JlYWRfKGZhbHNlKSwKLSAgICAgICAgcmVtb3ZpbmdfZGV2aWNlXyhmYWxzZSksCi0gICAgICAgIGZpcnN0X2Nvbm5lY3Rpb25fKGZpcnN0X2Nvbm5lY3Rpb24pLAotICAgICAgICBjb25uZWN0aW5nX2FjdGl2ZWx5XyhmaXJzdF9jb25uZWN0aW9uKSwKLSAgICAgICAgY29ubl9pZF8oR0FUVF9JTlZBTElEX0NPTk5fSUQpLAotICAgICAgICBlbmNyeXB0ZWRfKGZhbHNlKSwKLSAgICAgICAgZ3JvdXBfaWRfKGdyb3VwX2lkKSwKLSAgICAgICAgY3Npc19tZW1iZXJfKGZhbHNlKSwKLSAgICAgICAgYXVkaW9fZGlyZWN0aW9uc18oMCksCi0gICAgICAgIGxpbmtfcXVhbGl0eV90aW1lcihudWxscHRyKSB7fQotICB+TGVBdWRpb0RldmljZSh2b2lkKTsKLQotICB2b2lkIENsZWFyUEFDcyh2b2lkKTsKLSAgdm9pZCBSZWdpc3RlclBBQ3Moc3RkOjp2ZWN0b3I8c3RydWN0IHR5cGVzOjphY3NfYWNfcmVjb3JkPiogYXByX2RiLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgdHlwZXM6OmFjc19hY19yZWNvcmQ+KiBhcHIpOwotICBzdHJ1Y3QgdHlwZXM6OmFzZSogR2V0QXNlQnlWYWxIYW5kbGUodWludDE2X3QgdmFsX2hkbCk7Ci0gIHN0cnVjdCB0eXBlczo6YXNlKiBHZXRGaXJzdEFjdGl2ZUFzZSh2b2lkKTsKLSAgc3RydWN0IHR5cGVzOjphc2UqIEdldEZpcnN0QWN0aXZlQXNlQnlEaXJlY3Rpb24odWludDhfdCBkaXJlY3Rpb24pOwotICBzdHJ1Y3QgdHlwZXM6OmFzZSogR2V0TmV4dEFjdGl2ZUFzZVdpdGhTYW1lRGlyZWN0aW9uKAotICAgICAgc3RydWN0IHR5cGVzOjphc2UqIGJhc2VfYXNlKTsKLSAgc3RydWN0IHR5cGVzOjphc2UqIEdldEZpcnN0QWN0aXZlQXNlQnlEYXRhUGF0aFN0YXRlKAotICAgICAgdHlwZXM6OkF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZSBzdGF0ZSk7Ci0gIHN0cnVjdCB0eXBlczo6YXNlKiBHZXRGaXJzdEluYWN0aXZlQXNlKHVpbnQ4X3QgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY29ubmVjdCA9IGZhbHNlKTsKLSAgc3RydWN0IHR5cGVzOjphc2UqIEdldEZpcnN0SW5hY3RpdmVBc2VXaXRoU3RhdGUodWludDhfdCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZSBzdGF0ZSk7Ci0gIHN0cnVjdCB0eXBlczo6YXNlKiBHZXROZXh0QWN0aXZlQXNlKHN0cnVjdCB0eXBlczo6YXNlKiBhc2UpOwotICBzdHJ1Y3QgdHlwZXM6OmFzZSogR2V0QXNlVG9NYXRjaEJpZGlyZWN0aW9uQ2lzKHN0cnVjdCB0eXBlczo6YXNlKiBhc2UpOwotICB0eXBlczo6QmlkaXJlY3RBc2VzUGFpciBHZXRBc2VzQnlDaXNDb25uSGRsKHVpbnQxNl90IGNvbm5faGRsKTsKLSAgdHlwZXM6OkJpZGlyZWN0QXNlc1BhaXIgR2V0QXNlc0J5Q2lzSWQodWludDhfdCBjaXNfaWQpOwotICBib29sIEhhdmVBY3RpdmVBc2Uodm9pZCk7Ci0gIGJvb2wgSGF2ZUFsbEFjdGl2ZUFzZXNTYW1lU3RhdGUodHlwZXM6OkFzZVN0YXRlIHN0YXRlKTsKLSAgYm9vbCBIYXZlQW55VW5jb25maWd1cmVkQXNlcyh2b2lkKTsKLSAgYm9vbCBJc1JlYWR5VG9DcmVhdGVTdHJlYW0odm9pZCk7Ci0gIGJvb2wgSXNSZWFkeVRvU3VzcGVuZFN0cmVhbSh2b2lkKTsKLSAgYm9vbCBIYXZlQWxsQWN0aXZlQXNlc0Npc0VzdCh2b2lkKTsKLSAgYm9vbCBIYXZlQWxsQXNlc0Npc0Rpc2Modm9pZCk7Ci0gIGJvb2wgSGFzQ2lzSWQodWludDhfdCBpZCk7Ci0gIHVpbnQ4X3QgR2V0TWF0Y2hpbmdCaWRpcmVjdGlvbkNpc0lkKGNvbnN0IHN0cnVjdCB0eXBlczo6YXNlKiBiYXNlX2FzZSk7Ci0gIGJvb2wgSXNDb2RlY0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICB1aW50OF90IGRpcmVjdGlvbiwgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpDb2RlY0NhcGFiaWxpdHlTZXR0aW5nJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19jYXBhYmlsaXR5X3NldHRpbmcpOwotICB1aW50OF90IEdldExjM1N1cHBvcnRlZENoYW5uZWxDb3VudCh1aW50OF90IGRpcmVjdGlvbik7Ci0gIHVpbnQ4X3QgR2V0UGh5Qml0bWFzayh2b2lkKTsKLSAgYm9vbCBDb25maWd1cmVBc2VzKGNvbnN0IGxlX2F1ZGlvOjpzZXRfY29uZmlndXJhdGlvbnM6OlNldENvbmZpZ3VyYXRpb24mIGVudCwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogbnVtYmVyX29mX2FscmVhZHlfYWN0aXZlX2dyb3VwX2FzZSwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyYgZ3JvdXBfc25rX2F1ZGlvX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyYgZ3JvdXBfc3JjX2F1ZGlvX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjb25uZWN0ID0gZmFsc2UpOwotICB2b2lkIFNldFN1cHBvcnRlZENvbnRleHRzKHR5cGVzOjpBdWRpb0NvbnRleHRzIHNua19jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6QXVkaW9Db250ZXh0cyBzcmNfY29udGV4dHMpOwotICB0eXBlczo6QXVkaW9Db250ZXh0cyBHZXRBdmFpbGFibGVDb250ZXh0cyh2b2lkKTsKLSAgdHlwZXM6OkF1ZGlvQ29udGV4dHMgU2V0QXZhaWxhYmxlQ29udGV4dHModHlwZXM6OkF1ZGlvQ29udGV4dHMgc25rX2NvbnRfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6QXVkaW9Db250ZXh0cyBzcmNfY29udF92YWwpOwotICB2b2lkIERlYWN0aXZhdGVBbGxBc2VzKHZvaWQpOwotICB2b2lkIER1bXAoaW50IGZkKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gR2V0TWV0YWRhdGEodHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpOwotICBib29sIElzTWV0YWRhdGFDaGFuZ2VkKHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKTsKLQotIHByaXZhdGU6Ci0gIHR5cGVzOjpBdWRpb0NvbnRleHRzIGF2YWlsX3Nua19jb250ZXh0c187Ci0gIHR5cGVzOjpBdWRpb0NvbnRleHRzIGF2YWlsX3NyY19jb250ZXh0c187Ci0gIHR5cGVzOjpBdWRpb0NvbnRleHRzIHN1cHBfc25rX2NvbnRleHRfOwotICB0eXBlczo6QXVkaW9Db250ZXh0cyBzdXBwX3NyY19jb250ZXh0XzsKLX07Ci0KLS8qIExlQXVkaW9EZXZpY2VzIGNsYXNzIHJlcHJlc2VudHMgYSB3cmFwZXIgaGVscGVyIG92ZXIgYWxsIGRldmljZXMgaW4gbGUgYXVkaW8KLSAqIGltcGxlbWVudGF0aW9uLiBJdCBhbGxvd3MgdG8gb3BlcmF0ZSBvbiBkZXZpY2UgZnJvbSBhIGxpc3QgKHZlY3RvciBjb250YWluZXIpCi0gKiB1c2luZyBkZXRlcm1pbmFudHMgbGlrZSBhZGRyZXNzLCBjb25uZWN0aW9uIGlkIGV0Yy4KLSAqLwotY2xhc3MgTGVBdWRpb0RldmljZXMgewotIHB1YmxpYzoKLSAgdm9pZCBBZGQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBmaXJzdF9jb25uZWN0aW9uLAotICAgICAgICAgICBpbnQgZ3JvdXBfaWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bik7Ci0gIHZvaWQgUmVtb3ZlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotICBMZUF1ZGlvRGV2aWNlKiBGaW5kQnlBZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotICBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4gR2V0QnlBZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotICBMZUF1ZGlvRGV2aWNlKiBGaW5kQnlDb25uSWQodWludDE2X3QgY29ubl9pZCk7Ci0gIExlQXVkaW9EZXZpY2UqIEZpbmRCeUNpc0Nvbm5IZGwoY29uc3QgdWludDE2X3QgY29ubl9oZGwpOwotICBzaXplX3QgU2l6ZSh2b2lkKTsKLSAgdm9pZCBEdW1wKGludCBmZCwgaW50IGdyb3VwX2lkKTsKLSAgdm9pZCBDbGVhbnVwKHZvaWQpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPExlQXVkaW9EZXZpY2U+PiBsZUF1ZGlvRGV2aWNlc187Ci19OwotCi0vKiBMZUF1ZGlvRGV2aWNlR3JvdXAgY2xhc3MgcmVwcmVzZW50cyBncm91cCBvZiBMZUF1ZGlvRGV2aWNlcyBhbmQgYWxsb3dzIHRvCi0gKiBwZXJmb3JtIG9wZXJhdGlvbnMgb24gdGhlbS4gR3JvdXAgc3RhdGVzIGFyZSBBU0Ugc3RhdGVzIGR1ZSB0byBuYXR1cmUgb2YKLSAqIGdyb3VwIHdoaWNoIG9wZXJhdGVzIGZpbmFsbHkgb2YgQVNFcy4KLSAqCi0gKiBHcm91cCBpcyBjcmVhdGVkIGFmdGVyIGFkZGluZyBhIG5vZGUgdG8gbmV3IGdyb3VwIGlkICh3aGljaCBpcyBub3Qgb24gbGlzdCkuCi0gKi8KLQotY2xhc3MgTGVBdWRpb0RldmljZUdyb3VwIHsKLSBwdWJsaWM6Ci0gIGNvbnN0IGludCBncm91cF9pZF87Ci0gIGJvb2wgY2lnX2NyZWF0ZWRfOwotCi0gIHN0cnVjdCBzdHJlYW1fY29uZmlndXJhdGlvbiBzdHJlYW1fY29uZjsKLQotICB1aW50OF90IGF1ZGlvX2RpcmVjdGlvbnNfOwotICB0eXBlczo6QXVkaW9Mb2NhdGlvbnMgc25rX2F1ZGlvX2xvY2F0aW9uc187Ci0gIHR5cGVzOjpBdWRpb0xvY2F0aW9ucyBzcmNfYXVkaW9fbG9jYXRpb25zXzsKLQotICBleHBsaWNpdCBMZUF1ZGlvRGV2aWNlR3JvdXAoY29uc3QgaW50IGdyb3VwX2lkKQotICAgICAgOiBncm91cF9pZF8oZ3JvdXBfaWQpLAotICAgICAgICBjaWdfY3JlYXRlZF8oZmFsc2UpLAotICAgICAgICBhdWRpb19kaXJlY3Rpb25zXygwKSwKLSAgICAgICAgdHJhbnNwb3J0X2xhdGVuY3lfbXRvc18oMCksCi0gICAgICAgIHRyYW5zcG9ydF9sYXRlbmN5X3N0b21fKDApLAotICAgICAgICBhY3RpdmVfY29udGV4dF90eXBlXyh0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlOjpVTklOSVRJQUxJWkVEKSwKLSAgICAgICAgdGFyZ2V0X3N0YXRlXyh0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSksCi0gICAgICAgIGN1cnJlbnRfc3RhdGVfKHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKSwKLSAgICAgICAgY29udGV4dF90eXBlXyh0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlOjpVTklOSVRJQUxJWkVEKSB7Ci0gICAgc3RyZWFtX2NvbmYudmFsaWQgPSBmYWxzZTsKLSAgICBzdHJlYW1fY29uZi5jb25mID0gbnVsbHB0cjsKLSAgICBzdHJlYW1fY29uZi5zaW5rX251bV9vZl9kZXZpY2VzID0gMDsKLSAgICBzdHJlYW1fY29uZi5zb3VyY2VfbnVtX29mX2RldmljZXMgPSAwOwotICB9Ci0gIH5MZUF1ZGlvRGV2aWNlR3JvdXAodm9pZCk7Ci0KLSAgdm9pZCBBZGROb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMZUF1ZGlvRGV2aWNlPiYgbGVBdWRpb0RldmljZSk7Ci0gIHZvaWQgUmVtb3ZlTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4mIGxlQXVkaW9EZXZpY2UpOwotICBib29sIElzRW1wdHkodm9pZCk7Ci0gIGJvb2wgSXNBbnlEZXZpY2VDb25uZWN0ZWQodm9pZCk7Ci0gIGludCBTaXplKHZvaWQpOwotICBpbnQgTnVtT2ZDb25uZWN0ZWQoCi0gICAgICB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSA9IHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU6OlJGVSk7Ci0gIHZvaWQgRGVhY3RpdmF0ZSh2b2lkKTsKLSAgdm9pZCBDbGVhbnVwKHZvaWQpOwotICBMZUF1ZGlvRGV2aWNlKiBHZXRGaXJzdERldmljZSh2b2lkKTsKLSAgTGVBdWRpb0RldmljZSogR2V0Rmlyc3REZXZpY2VXaXRoQWN0aXZlQ29udGV4dCgKLSAgICAgIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKTsKLSAgTGVBdWRpb0RldmljZSogR2V0TmV4dERldmljZShMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKTsKLSAgTGVBdWRpb0RldmljZSogR2V0TmV4dERldmljZVdpdGhBY3RpdmVDb250ZXh0KAotICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwgdHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpOwotICBMZUF1ZGlvRGV2aWNlKiBHZXRGaXJzdEFjdGl2ZURldmljZSh2b2lkKTsKLSAgTGVBdWRpb0RldmljZSogR2V0TmV4dEFjdGl2ZURldmljZShMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKTsKLSAgYm9vbCBJc0RldmljZUluVGhlR3JvdXAoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSk7Ci0gIGJvb2wgSGF2ZUFsbEFjdGl2ZURldmljZXNBc2VzVGhlU2FtZVN0YXRlKHR5cGVzOjpBc2VTdGF0ZSBzdGF0ZSk7Ci0gIGJvb2wgSXNHcm91cFN0cmVhbVJlYWR5KHZvaWQpOwotICBib29sIEhhdmVBbGxBY3RpdmVEZXZpY2VzQ2lzRGlzYyh2b2lkKTsKLSAgdWludDhfdCBHZXRGaXJzdEZyZWVDaXNJZCh2b2lkKTsKLSAgYm9vbCBDb25maWd1cmUodHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpOwotICBib29sIFNldENvbnRleHRUeXBlKHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKTsKLSAgdHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBHZXRDb250ZXh0VHlwZSh2b2lkKTsKLSAgdWludDMyX3QgR2V0U2R1SW50ZXJ2YWwodWludDhfdCBkaXJlY3Rpb24pOwotICB1aW50OF90IEdldFNDQSh2b2lkKTsKLSAgdWludDhfdCBHZXRQYWNraW5nKHZvaWQpOwotICB1aW50OF90IEdldEZyYW1pbmcodm9pZCk7Ci0gIHVpbnQ4X3QgR2V0VGFyZ2V0TGF0ZW5jeSh2b2lkKTsKLSAgdWludDE2X3QgR2V0TWF4VHJhbnNwb3J0TGF0ZW5jeVN0b20odm9pZCk7Ci0gIHVpbnQxNl90IEdldE1heFRyYW5zcG9ydExhdGVuY3lNdG9zKHZvaWQpOwotICB2b2lkIFNldFRyYW5zcG9ydExhdGVuY3kodWludDhfdCBkaXJlY3Rpb24sIHVpbnQxNl90IHRyYW5zcG9ydF9sYXRlbmN5KTsKLSAgdWludDhfdCBHZXRQaHlCaXRtYXNrKHVpbnQ4X3QgZGlyZWN0aW9uKTsKLSAgdWludDhfdCBHZXRUYXJnZXRQaHkodWludDhfdCBkaXJlY3Rpb24pOwotICBib29sIEdldFByZXNlbnRhdGlvbkRlbGF5KHVpbnQzMl90KiBkZWxheSwgdWludDhfdCBkaXJlY3Rpb24pOwotICB1aW50MTZfdCBHZXRSZW1vdGVEZWxheSh1aW50OF90IGRpcmVjdGlvbik7Ci0gIHN0ZDo6b3B0aW9uYWw8dHlwZXM6OkF1ZGlvQ29udGV4dHM+IFVwZGF0ZUFjdGl2ZUNvbnRleHRzTWFwKAotICAgICAgdHlwZXM6OkF1ZGlvQ29udGV4dHMgY29udGV4dHMpOwotICBzdGQ6Om9wdGlvbmFsPHR5cGVzOjpBdWRpb0NvbnRleHRzPiBVcGRhdGVBY3RpdmVDb250ZXh0c01hcCh2b2lkKTsKLSAgYm9vbCBSZWxvYWRBdWRpb0xvY2F0aW9ucyh2b2lkKTsKLSAgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qIEdldEFjdGl2ZUNvbmZpZ3VyYXRpb24odm9pZCk7Ci0gIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgR2V0Q3VycmVudENvbnRleHRUeXBlKHZvaWQpOwotICB0eXBlczo6QXVkaW9Db250ZXh0cyBHZXRBY3RpdmVDb250ZXh0cyh2b2lkKTsKLSAgc3RkOjpvcHRpb25hbDxMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uPiBHZXRDb2RlY0NvbmZpZ3VyYXRpb25CeURpcmVjdGlvbigKLSAgICAgIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgZ3JvdXBfY29udGV4dF90eXBlLCB1aW50OF90IGRpcmVjdGlvbik7Ci0gIGJvb2wgSXNNZXRhZGF0YUNoYW5nZWQodHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBncm91cF9jb250ZXh0X3R5cGUpOwotCi0gIGlubGluZSB0eXBlczo6QXNlU3RhdGUgR2V0U3RhdGUodm9pZCkgY29uc3QgeyByZXR1cm4gY3VycmVudF9zdGF0ZV87IH0KLSAgdm9pZCBTZXRTdGF0ZSh0eXBlczo6QXNlU3RhdGUgc3RhdGUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjdXJyZW50IHN0YXRlOiAiIDw8IGN1cnJlbnRfc3RhdGVfCi0gICAgICAgICAgICAgIDw8ICIgbmV3IHN0YXRlOiAiIDw8IHN0YXRlOwotICAgIGN1cnJlbnRfc3RhdGVfID0gc3RhdGU7Ci0gIH0KLQotICBpbmxpbmUgdHlwZXM6OkFzZVN0YXRlIEdldFRhcmdldFN0YXRlKHZvaWQpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF9zdGF0ZV87IH0KLSAgdm9pZCBTZXRUYXJnZXRTdGF0ZSh0eXBlczo6QXNlU3RhdGUgc3RhdGUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0YXJnZXQgc3RhdGU6ICIgPDwgdGFyZ2V0X3N0YXRlXwotICAgICAgICAgICAgICA8PCAiIG5ldyB0YXJnZXQgc3RhdGU6ICIgPDwgc3RhdGU7Ci0gICAgdGFyZ2V0X3N0YXRlXyA9IHN0YXRlOwotICB9Ci0KLSAgYm9vbCBJc0luVHJhbnNpdGlvbih2b2lkKTsKLSAgYm9vbCBJc1JlbGVhc2luZyh2b2lkKTsKLSAgdm9pZCBEdW1wKGludCBmZCk7Ci0KLSBwcml2YXRlOgotICB1aW50MTZfdCB0cmFuc3BvcnRfbGF0ZW5jeV9tdG9zXzsKLSAgdWludDE2X3QgdHJhbnNwb3J0X2xhdGVuY3lfc3RvbV87Ci0KLSAgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qCi0gIEZpbmRGaXJzdFN1cHBvcnRlZENvbmZpZ3VyYXRpb24odHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpOwotICBib29sIENvbmZpZ3VyZUFzZXMoCi0gICAgICBjb25zdCBzZXRfY29uZmlndXJhdGlvbnM6OkF1ZGlvU2V0Q29uZmlndXJhdGlvbiogYXVkaW9fc2V0X2NvbmYsCi0gICAgICB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSk7Ci0gIGJvb2wgSXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qIGF1ZGlvX3NldF9jb25maWd1cmF0aW9uLAotICAgICAgdHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpOwotICB1aW50MTZfdCBHZXRUcmFuc3BvcnRMYXRlbmN5KHVpbnQ4X3QgZGlyZWN0aW9uKTsKLQotICAvKiBNYXNrIGFuZCB0YWJsZSBvZiBjdXJyZW50bHkgc3VwcG9ydGVkIGNvbnRleHRzICovCi0gIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgYWN0aXZlX2NvbnRleHRfdHlwZV87Ci0gIHR5cGVzOjpBdWRpb0NvbnRleHRzIGFjdGl2ZV9jb250ZXh0c19tYXNrXzsKLSAgc3RkOjptYXA8dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSwKLSAgICAgICAgICAgY29uc3Qgc2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qPgotICAgICAgYWN0aXZlX2NvbnRleHRfdG9fY29uZmlndXJhdGlvbl9tYXA7Ci0KLSAgdHlwZXM6OkFzZVN0YXRlIHRhcmdldF9zdGF0ZV87Ci0gIHR5cGVzOjpBc2VTdGF0ZSBjdXJyZW50X3N0YXRlXzsKLSAgdHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGVfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OndlYWtfcHRyPExlQXVkaW9EZXZpY2U+PiBsZUF1ZGlvRGV2aWNlc187Ci19OwotCi0vKiBMZUF1ZGlvRGV2aWNlR3JvdXAgY2xhc3MgcmVwcmVzZW50cyBhIHdyYXBlciBoZWxwZXIgb3ZlciBhbGwgZGV2aWNlIGdyb3VwcyBpbgotICogbGUgYXVkaW8gaW1wbGVtZW50YXRpb24uIEl0IGFsbG93cyB0byBvcGVyYXRlIG9uIGRldmljZSBncm91cCBmcm9tIGEgbGlzdAotICogKHZlY3RvciBjb250YWluZXIpIHVzaW5nIGRldGVybWluYW50cyBsaWtlIGlkLgotICovCi1jbGFzcyBMZUF1ZGlvRGV2aWNlR3JvdXBzIHsKLSBwdWJsaWM6Ci0gIExlQXVkaW9EZXZpY2VHcm91cCogQWRkKGludCBncm91cF9pZCk7Ci0gIHZvaWQgUmVtb3ZlKGNvbnN0IGludCBncm91cF9pZCk7Ci0gIExlQXVkaW9EZXZpY2VHcm91cCogRmluZEJ5SWQoaW50IGdyb3VwX2lkKTsKLSAgc3RkOjp2ZWN0b3I8aW50PiBHZXRHcm91cHNJZHModm9pZCk7Ci0gIHNpemVfdCBTaXplKCk7Ci0gIGJvb2wgSXNBbnlJblRyYW5zaXRpb24oKTsKLSAgdm9pZCBDbGVhbnVwKHZvaWQpOwotICB2b2lkIER1bXAoaW50IGZkKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxMZUF1ZGlvRGV2aWNlR3JvdXA+PiBncm91cHNfOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBsZV9hdWRpbwpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL2RldmljZXNfdGVzdC5jYyBiL2J0YS9sZV9hdWRpby9kZXZpY2VzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOWY1NDIuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL2RldmljZXNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYnRtX2FwaV9tb2NrLmgiCi0jaW5jbHVkZSAibGVfYXVkaW9fdHlwZXMuaCIKLSNpbmNsdWRlICJtb2NrX2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotCi10QUNMX0NPTk4qIGJ0bV9iZGFfdG9fYWNsKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgewotCi11c2luZyA6OmxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlOwotdXNpbmcgOjpsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwOwotdXNpbmcgOjpsZV9hdWRpbzo6TGVBdWRpb0RldmljZXM7Ci11c2luZyA6OmxlX2F1ZGlvOjp0eXBlczo6QXNlU3RhdGU7Ci11c2luZyA6OmxlX2F1ZGlvOjp0eXBlczo6QXVkaW9Db250ZXh0czsKLXVzaW5nIDo6bGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU7Ci11c2luZyB0ZXN0aW5nOjpUZXN0OwotCi1SYXdBZGRyZXNzIEdldFRlc3RBZGRyZXNzKGludCBpbmRleCkgewotICBDSEVDS19MVChpbmRleCwgVUlOVDhfTUFYKTsKLSAgUmF3QWRkcmVzcyByZXN1bHQgPSB7Ci0gICAgICB7MHhDMCwgMHhERSwgMHhDMCwgMHhERSwgMHgwMCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oaW5kZXgpfX07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWNsYXNzIExlQXVkaW9EZXZpY2VzVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgZGV2aWNlc18gPSBuZXcgTGVBdWRpb0RldmljZXMoKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1JbnRlcmZhY2UoJmJ0bV9pbnRlcmZhY2UpOwotICAgIGNvbnRyb2xsZXI6OlNldE1vY2tDb250cm9sbGVySW50ZXJmYWNlKCZjb250cm9sbGVyX2ludGVyZmFjZV8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjb250cm9sbGVyOjpTZXRNb2NrQ29udHJvbGxlckludGVyZmFjZShudWxscHRyKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1JbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgZGVsZXRlIGRldmljZXNfOwotICB9Ci0KLSAgTGVBdWRpb0RldmljZXMqIGRldmljZXNfID0gbnVsbHB0cjsKLSAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpNb2NrQnRtSW50ZXJmYWNlIGJ0bV9pbnRlcmZhY2U7Ci0gIGNvbnRyb2xsZXI6Ok1vY2tDb250cm9sbGVySW50ZXJmYWNlIGNvbnRyb2xsZXJfaW50ZXJmYWNlXzsKLX07Ci0KLVRFU1RfRihMZUF1ZGlvRGV2aWNlc1Rlc3QsIHRlc3RfYWRkKSB7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMCwgZGV2aWNlc18tPlNpemUoKSk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzAsIHRydWUpOwotICBBU1NFUlRfRVEoKHNpemVfdCkxLCBkZXZpY2VzXy0+U2l6ZSgpKTsKLSAgZGV2aWNlc18tPkFkZChHZXRUZXN0QWRkcmVzcygxKSwgdHJ1ZSwgMSk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTIsIGRldmljZXNfLT5TaXplKCkpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMiwgZGV2aWNlc18tPlNpemUoKSk7Ci0gIGRldmljZXNfLT5BZGQoR2V0VGVzdEFkZHJlc3MoMSksIHRydWUsIDIpOwotICBBU1NFUlRfRVEoKHNpemVfdCkyLCBkZXZpY2VzXy0+U2l6ZSgpKTsKLX0KLQotVEVTVF9GKExlQXVkaW9EZXZpY2VzVGVzdCwgdGVzdF9yZW1vdmUpIHsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18xLCB0cnVlKTsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMiA9IEdldFRlc3RBZGRyZXNzKDIpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18yLCB0cnVlKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMywgZGV2aWNlc18tPlNpemUoKSk7Ci0gIGRldmljZXNfLT5SZW1vdmUodGVzdF9hZGRyZXNzXzApOwotICBBU1NFUlRfRVEoKHNpemVfdCkyLCBkZXZpY2VzXy0+U2l6ZSgpKTsKLSAgZGV2aWNlc18tPlJlbW92ZShHZXRUZXN0QWRkcmVzcygzKSk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTIsIGRldmljZXNfLT5TaXplKCkpOwotICBkZXZpY2VzXy0+UmVtb3ZlKHRlc3RfYWRkcmVzc18wKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMiwgZGV2aWNlc18tPlNpemUoKSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvRGV2aWNlc1Rlc3QsIHRlc3RfZmluZF9ieV9hZGRyZXNzX3N1Y2Nlc3MpIHsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18xLCBmYWxzZSk7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzIgPSBHZXRUZXN0QWRkcmVzcygyKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMiwgdHJ1ZSk7Ci0gIExlQXVkaW9EZXZpY2UqIGRldmljZSA9IGRldmljZXNfLT5GaW5kQnlBZGRyZXNzKHRlc3RfYWRkcmVzc18xKTsKLSAgQVNTRVJUX05FKG51bGxwdHIsIGRldmljZSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X2FkZHJlc3NfMSwgZGV2aWNlLT5hZGRyZXNzXyk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvRGV2aWNlc1Rlc3QsIHRlc3RfZmluZF9ieV9hZGRyZXNzX2ZhaWxlZCkgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzAsIHRydWUpOwotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18yID0gR2V0VGVzdEFkZHJlc3MoMik7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzIsIHRydWUpOwotICBMZUF1ZGlvRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VzXy0+RmluZEJ5QWRkcmVzcyhHZXRUZXN0QWRkcmVzcygxKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkZXZpY2UpOwotfQotCi1URVNUX0YoTGVBdWRpb0RldmljZXNUZXN0LCB0ZXN0X2dldF9ieV9hZGRyZXNzX3N1Y2Nlc3MpIHsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18xLCBmYWxzZSk7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzIgPSBHZXRUZXN0QWRkcmVzcygyKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMiwgdHJ1ZSk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxMZUF1ZGlvRGV2aWNlPiBkZXZpY2UgPQotICAgICAgZGV2aWNlc18tPkdldEJ5QWRkcmVzcyh0ZXN0X2FkZHJlc3NfMSk7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBkZXZpY2UpOwotICBBU1NFUlRfRVEodGVzdF9hZGRyZXNzXzEsIGRldmljZS0+YWRkcmVzc18pOwotfQotCi1URVNUX0YoTGVBdWRpb0RldmljZXNUZXN0LCB0ZXN0X2dldF9ieV9hZGRyZXNzX2ZhaWxlZCkgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzAsIHRydWUpOwotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18yID0gR2V0VGVzdEFkZHJlc3MoMik7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzIsIHRydWUpOwotICBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4gZGV2aWNlID0KLSAgICAgIGRldmljZXNfLT5HZXRCeUFkZHJlc3MoR2V0VGVzdEFkZHJlc3MoMSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZGV2aWNlKTsKLX0KLQotVEVTVF9GKExlQXVkaW9EZXZpY2VzVGVzdCwgdGVzdF9maW5kX2J5X2Nvbm5faWRfc3VjY2VzcykgewotICBkZXZpY2VzXy0+QWRkKEdldFRlc3RBZGRyZXNzKDEpLCB0cnVlKTsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgZGV2aWNlc18tPkFkZChHZXRUZXN0QWRkcmVzcyg0KSwgdHJ1ZSk7Ci0gIExlQXVkaW9EZXZpY2UqIGRldmljZSA9IGRldmljZXNfLT5GaW5kQnlBZGRyZXNzKHRlc3RfYWRkcmVzc18wKTsKLSAgZGV2aWNlLT5jb25uX2lkXyA9IDB4MDAwNTsKLSAgQVNTRVJUX0VRKGRldmljZSwgZGV2aWNlc18tPkZpbmRCeUNvbm5JZCgweDAwMDUpKTsKLX0KLQotVEVTVF9GKExlQXVkaW9EZXZpY2VzVGVzdCwgdGVzdF9maW5kX2J5X2Nvbm5faWRfZmFpbGVkKSB7Ci0gIGRldmljZXNfLT5BZGQoR2V0VGVzdEFkZHJlc3MoMSksIHRydWUpOwotICBkZXZpY2VzXy0+QWRkKEdldFRlc3RBZGRyZXNzKDApLCB0cnVlKTsKLSAgZGV2aWNlc18tPkFkZChHZXRUZXN0QWRkcmVzcyg0KSwgdHJ1ZSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkZXZpY2VzXy0+RmluZEJ5Q29ubklkKDB4MDAwNikpOwotfQotCi0vKiBUT0RPOiBBZGQgRmluZEJ5Q2lzQ29ubkhkbCB0ZXN0IGNhc2VzIChBU0UpICovCi0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgewotdXNpbmcgbmFtZXNwYWNlIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY2FwczsKLXVzaW5nIG5hbWVzcGFjZSA6OmxlX2F1ZGlvOjpzZXRfY29uZmlndXJhdGlvbnM7Ci11c2luZyBuYW1lc3BhY2UgOjpsZV9hdWRpbzo6dHlwZXM7Ci0KLXN0YXRpYyBjb25zdCBoZGxfcGFpciBoZGxfcGFpcl9uaWwgPSBoZGxfcGFpcigweDAwMDAsIDB4MDAwMCk7Ci0KLWVudW0gY2xhc3MgTGMzU2V0dGluZ0lkIHsKLSAgX0JFR0lOLAotICBMQzNfOF8xID0gX0JFR0lOLAotICBMQzNfOF8yLAotICBMQzNfMTZfMSwKLSAgTEMzXzE2XzIsCi0gIExDM18yNF8xLAotICBMQzNfMjRfMiwKLSAgTEMzXzMyXzEsCi0gIExDM18zMl8yLAotICBMQzNfNDQxXzEsCi0gIExDM180NDFfMiwKLSAgTEMzXzQ4XzEsCi0gIExDM180OF8yLAotICBMQzNfNDhfMywKLSAgTEMzXzQ4XzQsCi0gIExDM180OF81LAotICBMQzNfNDhfNiwKLSAgX0VORCwKLSAgVU5TVVBQT1JURUQgPSBfRU5ELAotfTsKLXN0YXRpYyBjb25zdGV4cHIgaW50IExjM1NldHRpbmdJZEJlZ2luID0gc3RhdGljX2Nhc3Q8aW50PihMYzNTZXR0aW5nSWQ6Ol9CRUdJTik7Ci1zdGF0aWMgY29uc3RleHByIGludCBMYzNTZXR0aW5nSWRFbmQgPSBzdGF0aWNfY2FzdDxpbnQ+KExjM1NldHRpbmdJZDo6X0VORCk7Ci0KLWJvb2wgSXNMYzNTZXR0aW5nU3VwcG9ydGVkKExlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUsIExjM1NldHRpbmdJZCBpZCkgewotICAvKiBVcGRhdGUgdGhvc2UgdmFsdWVzLCBvbiBhbnkgY2hhbmdlIG9mIGNvZGVjIGxpbmtlZCB3aXRoIGNvbnRlbnQgdHlwZSAqLwotICBzd2l0Y2ggKGNvbnRleHRfdHlwZSkgewotICAgIGNhc2UgTGVBdWRpb0NvbnRleHRUeXBlOjpSSU5HVE9ORToKLSAgICBjYXNlIExlQXVkaW9Db250ZXh0VHlwZTo6Q09OVkVSU0FUSU9OQUw6Ci0gICAgICBpZiAoaWQgPT0gTGMzU2V0dGluZ0lkOjpMQzNfMTZfMSB8fCBpZCA9PSBMYzNTZXR0aW5nSWQ6OkxDM18xNl8yKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUE6Ci0gICAgICBpZiAoaWQgPT0gTGMzU2V0dGluZ0lkOjpMQzNfMTZfMSB8fCBpZCA9PSBMYzNTZXR0aW5nSWQ6OkxDM18xNl8yIHx8Ci0gICAgICAgICAgaWQgPT0gTGMzU2V0dGluZ0lkOjpMQzNfNDhfNCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpZCA9PSBMYzNTZXR0aW5nSWQ6OkxDM18xNl8yKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0gIH07Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9TYW1wbGluZ0ZyZXFSZnUgPSAweDBFOwotdWludDhfdCBHZXRTYW1wbGluZ0ZyZXF1ZW5jeShMYzNTZXR0aW5nSWQgaWQpIHsKLSAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfOF8xOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfOF8yOgotICAgICAgcmV0dXJuIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXE4MDAwSHo7Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM18xNl8xOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfMTZfMjoKLSAgICAgIHJldHVybiA6OmxlX2F1ZGlvOjpjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvU2FtcGxpbmdGcmVxMTYwMDBIejsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzI0XzE6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM18yNF8yOgotICAgICAgcmV0dXJuIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXEyNDAwMEh6OwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfMzJfMToKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzMyXzI6Ci0gICAgICByZXR1cm4gOjpsZV9hdWRpbzo6Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTMyMDAwSHo7Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180NDFfMToKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ0MV8yOgotICAgICAgcmV0dXJuIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXE0NDEwMEh6OwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfMToKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ4XzI6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180OF8zOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfNDoKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ4XzU6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180OF82OgotICAgICAgcmV0dXJuIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXE0ODAwMEh6OwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpVTlNVUFBPUlRFRDoKLSAgICAgIHJldHVybiBrTGVBdWRpb1NhbXBsaW5nRnJlcVJmdTsKLSAgfQotfQotCi1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyUmZ1ID0gMHgwMjsKLXVpbnQ4X3QgR2V0RnJhbWVEdXJhdGlvbihMYzNTZXR0aW5nSWQgaWQpIHsKLSAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfOF8xOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfMTZfMToKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzI0XzE6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM18zMl8xOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDQxXzE6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180OF8xOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfMzoKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ4XzU6Ci0gICAgICByZXR1cm4gOjpsZV9hdWRpbzo6Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVEdXI3NTAwdXM7Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM184XzI6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM18xNl8yOgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfMjRfMjoKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzMyXzI6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180NDFfMjoKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ4XzI6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180OF80OgotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfNjoKLSAgICAgIHJldHVybiA6OmxlX2F1ZGlvOjpjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1cjEwMDAwdXM7Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OlVOU1VQUE9SVEVEOgotICAgICAgcmV0dXJuIGtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1clJmdTsKLSAgfQotfQotCi1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM09jdGV0c1BlckNvZGVjRnJhbWVJbnZhbGlkID0gMDsKLXVpbnQxNl90IEdldE9jdGV0c1BlckNvZGVjRnJhbWUoTGMzU2V0dGluZ0lkIGlkKSB7Ci0gIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzhfMToKLSAgICAgIHJldHVybiAyNjsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzhfMjoKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzE2XzE6Ci0gICAgICByZXR1cm4gMzA7Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM18xNl8yOgotICAgICAgcmV0dXJuIDQwOwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfMjRfMToKLSAgICAgIHJldHVybiA0NTsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzI0XzI6Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM18zMl8xOgotICAgICAgcmV0dXJuIDYwOwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfMzJfMjoKLSAgICAgIHJldHVybiA4MDsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ0MV8xOgotICAgICAgcmV0dXJuIDk3OwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDQxXzI6Ci0gICAgICByZXR1cm4gMTMwOwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfMToKLSAgICAgIHJldHVybiA3NTsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ4XzI6Ci0gICAgICByZXR1cm4gMTAwOwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfMzoKLSAgICAgIHJldHVybiA5MDsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6TEMzXzQ4XzQ6Ci0gICAgICByZXR1cm4gMTIwOwotICAgIGNhc2UgTGMzU2V0dGluZ0lkOjpMQzNfNDhfNToKLSAgICAgIHJldHVybiAxMTY7Ci0gICAgY2FzZSBMYzNTZXR0aW5nSWQ6OkxDM180OF82OgotICAgICAgcmV0dXJuIDE1NTsKLSAgICBjYXNlIExjM1NldHRpbmdJZDo6VU5TVVBQT1JURUQ6Ci0gICAgICByZXR1cm4ga0xlQXVkaW9Db2RlY0xDM09jdGV0c1BlckNvZGVjRnJhbWVJbnZhbGlkOwotICB9Ci19Ci0KLWNsYXNzIFB1Ymxpc2hlZEF1ZGlvQ2FwYWJpbGl0aWVzQnVpbGRlciB7Ci0gcHVibGljOgotICBQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdGllc0J1aWxkZXIoKSB7fQotCi0gIHZvaWQgQWRkKExlQXVkaW9Db2RlY0lkIGNvZGVjX2lkLCB1aW50OF90IGNvbmZfc2FtcGxpbmdfZnJlcXVlbmN5LAotICAgICAgICAgICB1aW50OF90IGNvbmZfZnJhbWVfZHVyYXRpb24sIHVpbnQ4X3QgYXVkaW9fY2hhbm5lbF9jb3VudHMsCi0gICAgICAgICAgIHVpbnQxNl90IG9jdGV0c19wZXJfZnJhbWUsIHVpbnQ4X3QgY29kZWNfZnJhbWVzX3Blcl9zZHUgPSAwKSB7Ci0gICAgdWludDE2X3Qgc2FtcGxpbmdfZnJlcXVlbmNpZXMgPQotICAgICAgICBTYW1wbGluZ0ZyZXFDb25maWcyQ2FwYWJpbGl0eShjb25mX3NhbXBsaW5nX2ZyZXF1ZW5jeSk7Ci0gICAgdWludDhfdCBmcmFtZV9kdXJhdGlvbnMgPQotICAgICAgICBGcmFtZUR1cmF0aW9uQ29uZmlnMkNhcGFiaWxpdHkoY29uZl9mcmFtZV9kdXJhdGlvbik7Ci0gICAgdWludDhfdCBtYXhfY29kZWNfZnJhbWVzX3Blcl9zZHUgPSBjb2RlY19mcmFtZXNfcGVyX3NkdTsKLSAgICB1aW50MzJfdCBvY3RldHNfcGVyX2ZyYW1lX3JhbmdlID0KLSAgICAgICAgb2N0ZXRzX3Blcl9mcmFtZSB8IChvY3RldHNfcGVyX2ZyYW1lIDw8IDE2KTsKLQotICAgIHBhY19yZWNvcmRzXy5wdXNoX2JhY2soCi0gICAgICAgIGFjc19hY19yZWNvcmQoey5jb2RlY19pZCA9IGNvZGVjX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAuY29kZWNfc3BlY19jYXBzID0gTGVBdWRpb0x0dk1hcCh7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB7a0xlQXVkaW9Db2RlY0xDM1R5cGVTYW1wbGluZ0ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2X1RPX1ZFQ19VSU5UOChzYW1wbGluZ19mcmVxdWVuY2llcyl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAge2tMZUF1ZGlvQ29kZWNMQzNUeXBlRnJhbWVEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOF9UT19WRUNfVUlOVDgoZnJhbWVfZHVyYXRpb25zKX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7a0xlQXVkaW9Db2RlY0xDM1R5cGVBdWRpb0NoYW5uZWxDb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDhfVE9fVkVDX1VJTlQ4KGF1ZGlvX2NoYW5uZWxfY291bnRzKX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7a0xlQXVkaW9Db2RlY0xDM1R5cGVPY3RldFBlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMl9UT19WRUNfVUlOVDgob2N0ZXRzX3Blcl9mcmFtZV9yYW5nZSl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAge2tMZUF1ZGlvQ29kZWNMQzNUeXBlTWF4Q29kZWNGcmFtZXNQZXJTZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDhfVE9fVkVDX1VJTlQ4KG1heF9jb2RlY19mcmFtZXNfcGVyX3NkdSl9LAotICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgLm1ldGFkYXRhID0gc3RkOjp2ZWN0b3I8dWludDhfdD4oMCl9KSk7Ci0gIH0KLQotICB2b2lkIEFkZChjb25zdCBDb2RlY0NhcGFiaWxpdHlTZXR0aW5nJiBzZXR0aW5nLAotICAgICAgICAgICB1aW50OF90IGF1ZGlvX2NoYW5uZWxfY291bnRzKSB7Ci0gICAgaWYgKHNldHRpbmcuaWQgIT0gTGVBdWRpb0NvZGVjSWRMYzMpIHJldHVybjsKLQotICAgIGNvbnN0IExlQXVkaW9MYzNDb25maWcgY29uZmlnID0gc3RkOjpnZXQ8TGVBdWRpb0xjM0NvbmZpZz4oc2V0dGluZy5jb25maWcpOwotCi0gICAgQWRkKHNldHRpbmcuaWQsIGNvbmZpZy5zYW1wbGluZ19mcmVxdWVuY3ksIGNvbmZpZy5mcmFtZV9kdXJhdGlvbiwKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudHMsIGNvbmZpZy5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lKTsKLSAgfQotCi0gIHZvaWQgUmVzZXQoKSB7IHBhY19yZWNvcmRzXy5jbGVhcigpOyB9Ci0KLSAgUHVibGlzaGVkQXVkaW9DYXBhYmlsaXRpZXMgR2V0KCkgewotICAgIHJldHVybiBQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdGllcyh7e2hkbF9wYWlyX25pbCwgcGFjX3JlY29yZHNffX0pOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxhY3NfYWNfcmVjb3JkPiBwYWNfcmVjb3Jkc187Ci19OwotCi1zdHJ1Y3QgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbkRhdGEgewotICBMZUF1ZGlvRGV2aWNlKiBkZXZpY2U7Ci0gIHVpbnQ4X3QgYXVkaW9fY2hhbm5lbF9jb3VudHNfc25rOwotICB1aW50OF90IGF1ZGlvX2NoYW5uZWxfY291bnRzX3NyYzsKLQotICB1aW50OF90IGFjdGl2ZV9jaGFubmVsX251bV9zbms7Ci0gIHVpbnQ4X3QgYWN0aXZlX2NoYW5uZWxfbnVtX3NyYzsKLX07Ci0KLWNsYXNzIExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgZ3JvdXBfID0gbmV3IExlQXVkaW9EZXZpY2VHcm91cChncm91cF9pZF8pOwotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja0J0bUludGVyZmFjZSgmYnRtX2ludGVyZmFjZV8pOwotICAgIGNvbnRyb2xsZXI6OlNldE1vY2tDb250cm9sbGVySW50ZXJmYWNlKCZjb250cm9sbGVyX2ludGVyZmFjZV8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjb250cm9sbGVyOjpTZXRNb2NrQ29udHJvbGxlckludGVyZmFjZShudWxscHRyKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1JbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgZGV2aWNlc18uY2xlYXIoKTsKLSAgICBkZWxldGUgZ3JvdXBfOwotICB9Ci0KLSAgTGVBdWRpb0RldmljZSogQWRkVGVzdERldmljZShpbnQgc25rX2FzZV9udW0sIGludCBzcmNfYXNlX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc25rX2FzZV9udW1fY2FjaGVkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FzZV9udW1fY2FjaGVkID0gMCkgewotICAgIGludCBpbmRleCA9IGdyb3VwXy0+U2l6ZSgpICsgMTsKLSAgICBhdXRvIGRldmljZSA9Ci0gICAgICAgIChzdGQ6Om1ha2Vfc2hhcmVkPExlQXVkaW9EZXZpY2U+KEdldFRlc3RBZGRyZXNzKGluZGV4KSwgZmFsc2UpKTsKLSAgICBkZXZpY2VzXy5wdXNoX2JhY2soZGV2aWNlKTsKLSAgICBncm91cF8tPkFkZE5vZGUoZGV2aWNlKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjX2FzZV9udW07IGkrKykgewotICAgICAgZGV2aWNlLT5hc2VzXy5lbXBsYWNlX2JhY2soMHgwMDAwLCAweDAwMDAsIGtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNua19hc2VfbnVtOyBpKyspIHsKLSAgICAgIGRldmljZS0+YXNlc18uZW1wbGFjZV9iYWNrKDB4MDAwMCwgMHgwMDAwLCBrTGVBdWRpb0RpcmVjdGlvblNpbmspOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjX2FzZV9udW1fY2FjaGVkOyBpKyspIHsKLSAgICAgIHN0cnVjdCBhc2UgYXNlKDB4MDAwMCwgMHgwMDAwLCBrTGVBdWRpb0RpcmVjdGlvblNvdXJjZSk7Ci0gICAgICBhc2Uuc3RhdGUgPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEOwotICAgICAgZGV2aWNlLT5hc2VzXy5wdXNoX2JhY2soYXNlKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNua19hc2VfbnVtX2NhY2hlZDsgaSsrKSB7Ci0gICAgICBzdHJ1Y3QgYXNlIGFzZSgweDAwMDAsIDB4MDAwMCwga0xlQXVkaW9EaXJlY3Rpb25TaW5rKTsKLSAgICAgIGFzZS5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQ7Ci0gICAgICBkZXZpY2UtPmFzZXNfLnB1c2hfYmFjayhhc2UpOwotICAgIH0KLQotICAgIGRldmljZS0+U2V0U3VwcG9ydGVkQ29udGV4dHMoKHVpbnQxNl90KWtMZUF1ZGlvQ29udGV4dEFsbFR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KWtMZUF1ZGlvQ29udGV4dEFsbFR5cGVzKTsKLSAgICBkZXZpY2UtPlNldEF2YWlsYWJsZUNvbnRleHRzKCh1aW50MTZfdClrTGVBdWRpb0NvbnRleHRBbGxUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdClrTGVBdWRpb0NvbnRleHRBbGxUeXBlcyk7Ci0gICAgZGV2aWNlLT5zbmtfYXVkaW9fbG9jYXRpb25zXyA9Ci0gICAgICAgIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCB8Ci0gICAgICAgIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQ7Ci0gICAgZGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zXyA9Ci0gICAgICAgIDo6bGVfYXVkaW86OmNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdDsKLQotICAgIGRldmljZS0+Y29ubl9pZF8gPSBpbmRleDsKLSAgICByZXR1cm4gZGV2aWNlLmdldCgpOwotICB9Ci0KLSAgdm9pZCBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uVmVyZGljdCgKLSAgICAgIGNvbnN0IFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhJiBkYXRhKSB7Ci0gICAgdWludDhfdCBhY3RpdmVfY2hhbm5lbF9udW1fc25rID0gMDsKLSAgICB1aW50OF90IGFjdGl2ZV9jaGFubmVsX251bV9zcmMgPSAwOwotCi0gICAgYm9vbCBoYXZlX2FjdGl2ZV9hc2UgPQotICAgICAgICBkYXRhLmFjdGl2ZV9jaGFubmVsX251bV9zbmsgKyBkYXRhLmFjdGl2ZV9jaGFubmVsX251bV9zcmM7Ci0gICAgQVNTRVJUX0VRKGhhdmVfYWN0aXZlX2FzZSwgZGF0YS5kZXZpY2UtPkhhdmVBY3RpdmVBc2UoKSk7Ci0KLSAgICBmb3IgKGFzZSogYXNlID0gZGF0YS5kZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlKCk7IGFzZTsKLSAgICAgICAgIGFzZSA9IGRhdGEuZGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpIHsKLSAgICAgIGlmIChhc2UtPmRpcmVjdGlvbiA9PSBrTGVBdWRpb0RpcmVjdGlvblNpbmspCi0gICAgICAgIGFjdGl2ZV9jaGFubmVsX251bV9zbmsgKz0KLSAgICAgICAgICAgIEdldEF1ZGlvQ2hhbm5lbENvdW50cyhhc2UtPmNvZGVjX2NvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24pOwotICAgICAgZWxzZQotICAgICAgICBhY3RpdmVfY2hhbm5lbF9udW1fc3JjICs9Ci0gICAgICAgICAgICBHZXRBdWRpb0NoYW5uZWxDb3VudHMoYXNlLT5jb2RlY19jb25maWcuYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfRVEoZGF0YS5hY3RpdmVfY2hhbm5lbF9udW1fc25rLCBhY3RpdmVfY2hhbm5lbF9udW1fc25rKTsKLSAgICBBU1NFUlRfRVEoZGF0YS5hY3RpdmVfY2hhbm5lbF9udW1fc3JjLCBhY3RpdmVfY2hhbm5lbF9udW1fc3JjKTsKLSAgfQotCi0gIHZvaWQgU2V0Q2lzSW5mb3JtYXRpb25Ub0FjdGl2ZUFzZSh2b2lkKSB7Ci0gICAgdWludDhfdCBjaXNfaWQgPSAxOwotICAgIHVpbnQxNl90IGNpc19jb25uX2hkbCA9IDB4MDA2MDsKLQotICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlc18pIHsKLSAgICAgIGZvciAoYXV0byYgYXNlIDogZGV2aWNlLT5hc2VzXykgewotICAgICAgICBpZiAoYXNlLmFjdGl2ZSkgewotICAgICAgICAgIGFzZS5jaXNfaWQgPSBjaXNfaWQrKzsKLSAgICAgICAgICBhc2UuY2lzX2Nvbm5faGRsID0gY2lzX2Nvbm5faGRsKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIFRlc3RTaW5nbGVBc2VDb25maWd1cmF0aW9uKExlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbkRhdGEqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uKiBhdWRpb19zZXRfY29uZikgewotICAgIC8vIHRoZSBjb25maWd1cmF0aW9uIHNob3VsZCBmYWlsIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgYXNlcyBleHBlY3RlZAotICAgIGJvb2wgc3VjY2Vzc19leHBlY3RlZCA9IGRhdGFfc2l6ZSA+IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhX3NpemU7IGkrKykgewotICAgICAgc3VjY2Vzc19leHBlY3RlZCAmPQotICAgICAgICAgIChkYXRhW2ldLmFjdGl2ZV9jaGFubmVsX251bV9zbmsgKyBkYXRhW2ldLmFjdGl2ZV9jaGFubmVsX251bV9zcmMpID4gMDsKLQotICAgICAgLyogUHJlcGFyZSBQQUMncyAqLwotICAgICAgUHVibGlzaGVkQXVkaW9DYXBhYmlsaXRpZXNCdWlsZGVyIHNua19wYWNfYnVpbGRlciwgc3JjX3BhY19idWlsZGVyOwotICAgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6ICgqYXVkaW9fc2V0X2NvbmYpLmNvbmZzKSB7Ci0gICAgICAgIGlmIChlbnRyeS5kaXJlY3Rpb24gPT0ga0xlQXVkaW9EaXJlY3Rpb25TaW5rKSB7Ci0gICAgICAgICAgc25rX3BhY19idWlsZGVyLkFkZChlbnRyeS5jb2RlYywgZGF0YVtpXS5hdWRpb19jaGFubmVsX2NvdW50c19zbmspOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNyY19wYWNfYnVpbGRlci5BZGQoZW50cnkuY29kZWMsIGRhdGFbaV0uYXVkaW9fY2hhbm5lbF9jb3VudHNfc3JjKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBkYXRhW2ldLmRldmljZS0+c25rX3BhY3NfID0gc25rX3BhY19idWlsZGVyLkdldCgpOwotICAgICAgZGF0YVtpXS5kZXZpY2UtPnNyY19wYWNzXyA9IHNyY19wYWNfYnVpbGRlci5HZXQoKTsKLSAgICB9Ci0KLSAgICAvKiBTdGltdWxhdGUgdXBkYXRlIG9mIGFjdGl2ZSBjb250ZXh0IG1hcCAqLwotICAgIGdyb3VwXy0+VXBkYXRlQWN0aXZlQ29udGV4dHNNYXAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbnRleHRfdHlwZSkpOwotICAgIEFTU0VSVF9FUShzdWNjZXNzX2V4cGVjdGVkLCBncm91cF8tPkNvbmZpZ3VyZShjb250ZXh0X3R5cGUpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YV9zaXplOyBpKyspIHsKLSAgICAgIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25WZXJkaWN0KGRhdGFbaV0pOwotICAgIH0KLSAgfQotCi0gIHZvaWQgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbkRhdGEqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRhdGFfc2l6ZSkgewotICAgIGNvbnN0IGF1dG8qIGNvbmZpZ3VyYXRpb25zID0gZ2V0X2NvbmZzX2J5X3R5cGUoY29udGV4dF90eXBlKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGF1ZGlvX3NldF9jb25mIDogKmNvbmZpZ3VyYXRpb25zKSB7Ci0gICAgICAvLyB0aGUgY29uZmlndXJhdGlvbiBzaG91bGQgZmFpbCBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIGFzZXMgZXhwZWN0ZWQKLSAgICAgIGJvb2wgc3VjY2Vzc19leHBlY3RlZCA9IGRhdGFfc2l6ZSA+IDA7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHN1Y2Nlc3NfZXhwZWN0ZWQgJj0gKGRhdGFbaV0uYWN0aXZlX2NoYW5uZWxfbnVtX3NuayArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0uYWN0aXZlX2NoYW5uZWxfbnVtX3NyYykgPiAwOwotCi0gICAgICAgIC8qIFByZXBhcmUgUEFDJ3MgKi8KLSAgICAgICAgUHVibGlzaGVkQXVkaW9DYXBhYmlsaXRpZXNCdWlsZGVyIHNua19wYWNfYnVpbGRlciwgc3JjX3BhY19idWlsZGVyOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogKCphdWRpb19zZXRfY29uZikuY29uZnMpIHsKLSAgICAgICAgICBpZiAoZW50cnkuZGlyZWN0aW9uID09IGtMZUF1ZGlvRGlyZWN0aW9uU2luaykgewotICAgICAgICAgICAgc25rX3BhY19idWlsZGVyLkFkZChlbnRyeS5jb2RlYywgZGF0YVtpXS5hdWRpb19jaGFubmVsX2NvdW50c19zbmspOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfcGFjX2J1aWxkZXIuQWRkKGVudHJ5LmNvZGVjLCBkYXRhW2ldLmF1ZGlvX2NoYW5uZWxfY291bnRzX3NyYyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YVtpXS5kZXZpY2UtPnNua19wYWNzXyA9IHNua19wYWNfYnVpbGRlci5HZXQoKTsKLSAgICAgICAgZGF0YVtpXS5kZXZpY2UtPnNyY19wYWNzXyA9IHNyY19wYWNfYnVpbGRlci5HZXQoKTsKLSAgICAgIH0KLQotICAgICAgLyogU3RpbXVsYXRlIHVwZGF0ZSBvZiBhY3RpdmUgY29udGV4dCBtYXAgKi8KLSAgICAgIGdyb3VwXy0+VXBkYXRlQWN0aXZlQ29udGV4dHNNYXAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbnRleHRfdHlwZSkpOwotICAgICAgQVNTRVJUX0VRKHN1Y2Nlc3NfZXhwZWN0ZWQsIGdyb3VwXy0+Q29uZmlndXJlKGNvbnRleHRfdHlwZSkpOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25WZXJkaWN0KGRhdGFbaV0pOwotICAgICAgfQotCi0gICAgICBncm91cF8tPkRlYWN0aXZhdGUoKTsKLSAgICAgIFRlc3RBc2VzSW5hY3RpdmUoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFRlc3RBc2VzQWN0aXZlKExlQXVkaW9Db2RlY0lkIGNvZGVjX2lkLCB1aW50OF90IHNhbXBsaW5nX2ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZyYW1lX2R1cmF0aW9uLCB1aW50MTZfdCBvY3RldHNfcGVyX2ZyYW1lKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzXykgewotICAgICAgZm9yIChjb25zdCBhdXRvJiBhc2UgOiBkZXZpY2UtPmFzZXNfKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKGFzZS5hY3RpdmUpOwotICAgICAgICBBU1NFUlRfRVEoYXNlLmNvZGVjX2lkLCBjb2RlY19pZCk7Ci0KLSAgICAgICAgLyogRklYTUU6IFZhbGlkYXRlIG90aGVyIGNvZGVjIHBhcmFtZXRlcnMgdGhhbiBMQzMgaWYgYW55ICovCi0gICAgICAgIEFTU0VSVF9FUShhc2UuY29kZWNfaWQsIExlQXVkaW9Db2RlY0lkTGMzKTsKLSAgICAgICAgaWYgKGFzZS5jb2RlY19pZCA9PSBMZUF1ZGlvQ29kZWNJZExjMykgewotICAgICAgICAgIEFTU0VSVF9FUShhc2UuY29kZWNfY29uZmlnLnNhbXBsaW5nX2ZyZXF1ZW5jeSwgc2FtcGxpbmdfZnJlcXVlbmN5KTsKLSAgICAgICAgICBBU1NFUlRfRVEoYXNlLmNvZGVjX2NvbmZpZy5mcmFtZV9kdXJhdGlvbiwgZnJhbWVfZHVyYXRpb24pOwotICAgICAgICAgIEFTU0VSVF9FUShhc2UuY29kZWNfY29uZmlnLm9jdGV0c19wZXJfY29kZWNfZnJhbWUsIG9jdGV0c19wZXJfZnJhbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBUZXN0QWN0aXZlQXNlcyh2b2lkKSB7Ci0gICAgZm9yIChhdXRvJiBkZXZpY2UgOiBkZXZpY2VzXykgewotICAgICAgZm9yIChjb25zdCBhdXRvJiBhc2UgOiBkZXZpY2UtPmFzZXNfKSB7Ci0gICAgICAgIGlmIChhc2UuYWN0aXZlKSB7Ci0gICAgICAgICAgQVNTRVJUX0ZBTFNFKGFzZS5jaXNfaWQgPT0gOjpsZV9hdWRpbzo6a0ludmFsaWRDaXNJZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIFRlc3RBc2VzSW5hY3RpdmF0ZWQoY29uc3QgTGVBdWRpb0RldmljZSogZGV2aWNlKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBhc2UgOiBkZXZpY2UtPmFzZXNfKSB7Ci0gICAgICBBU1NFUlRfRkFMU0UoYXNlLmFjdGl2ZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBUZXN0QXNlc0luYWN0aXZlKCkgewotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlc18pIHsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgYXNlIDogZGV2aWNlLT5hc2VzXykgewotICAgICAgICBBU1NFUlRfRkFMU0UoYXNlLmFjdGl2ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBUZXN0TGMzQ29kZWNDb25maWcoTGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgewotICAgIGZvciAoaW50IGkgPSBMYzNTZXR0aW5nSWRCZWdpbjsgaSA8IExjM1NldHRpbmdJZEVuZDsgaSsrKSB7Ci0gICAgICAvLyB0ZXN0IGVhY2ggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgYWdhaW5zdCB2YWxpZCBhbmQgaW52YWxpZCB2YWx1ZQotICAgICAgc3RkOjphcnJheTxMYzNTZXR0aW5nSWQsIDI+IHRlc3RfdmFyaWFudHMgPSB7c3RhdGljX2Nhc3Q8TGMzU2V0dGluZ0lkPihpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjM1NldHRpbmdJZDo6VU5TVVBQT1JURUR9OwotCi0gICAgICBjb25zdCBib29sIGlzX2xjM19zZXR0aW5nX3N1cHBvcnRlZCA9Ci0gICAgICAgICAgSXNMYzNTZXR0aW5nU3VwcG9ydGVkKGNvbnRleHRfdHlwZSwgc3RhdGljX2Nhc3Q8TGMzU2V0dGluZ0lkPihpKSk7Ci0KLSAgICAgIGZvciAoY29uc3QgYXV0byBzZl92YXJpYW50IDogdGVzdF92YXJpYW50cykgewotICAgICAgICB1aW50OF90IHNhbXBsaW5nX2ZyZXF1ZW5jeSA9IEdldFNhbXBsaW5nRnJlcXVlbmN5KHNmX3ZhcmlhbnQpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gZmRfdmFyaWFudCA6IHRlc3RfdmFyaWFudHMpIHsKLSAgICAgICAgICB1aW50OF90IGZyYW1lX2R1cmF0aW9uID0gR2V0RnJhbWVEdXJhdGlvbihmZF92YXJpYW50KTsKLSAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gb3BjZl92YXJpYW50IDogdGVzdF92YXJpYW50cykgewotICAgICAgICAgICAgdWludDE2X3Qgb2N0ZXRzX3Blcl9mcmFtZSA9IEdldE9jdGV0c1BlckNvZGVjRnJhbWUob3BjZl92YXJpYW50KTsKLQotICAgICAgICAgICAgUHVibGlzaGVkQXVkaW9DYXBhYmlsaXRpZXNCdWlsZGVyIHBhY19idWlsZGVyOwotICAgICAgICAgICAgcGFjX2J1aWxkZXIuQWRkKAotICAgICAgICAgICAgICAgIExlQXVkaW9Db2RlY0lkTGMzLCBzYW1wbGluZ19mcmVxdWVuY3ksIGZyYW1lX2R1cmF0aW9uLAotICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLCBvY3RldHNfcGVyX2ZyYW1lKTsKLSAgICAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlc18pIHsKLSAgICAgICAgICAgICAgLyogRm9yIHNpbXBsaWNpdHkgY29uZmlndXJlIGJvdGggUEFDcyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICAgIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgICBkZXZpY2UtPnNua19wYWNzXyA9IHBhY19idWlsZGVyLkdldCgpOwotICAgICAgICAgICAgICBkZXZpY2UtPnNyY19wYWNzXyA9IHBhY19idWlsZGVyLkdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sIHN1Y2Nlc3NfZXhwZWN0ZWQgPSBpc19sYzNfc2V0dGluZ19zdXBwb3J0ZWQ7Ci0gICAgICAgICAgICBpZiAoaXNfbGMzX3NldHRpbmdfc3VwcG9ydGVkICYmCi0gICAgICAgICAgICAgICAgKHNmX3ZhcmlhbnQgPT0gTGMzU2V0dGluZ0lkOjpVTlNVUFBPUlRFRCB8fAotICAgICAgICAgICAgICAgICBmZF92YXJpYW50ID09IExjM1NldHRpbmdJZDo6VU5TVVBQT1JURUQgfHwKLSAgICAgICAgICAgICAgICAgb3BjZl92YXJpYW50ID09IExjM1NldHRpbmdJZDo6VU5TVVBQT1JURUQpKSB7Ci0gICAgICAgICAgICAgIHN1Y2Nlc3NfZXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU3RpbXVsYXRlIHVwZGF0ZSBvZiBhY3RpdmUgY29udGV4dCBtYXAgKi8KLSAgICAgICAgICAgIGdyb3VwXy0+VXBkYXRlQWN0aXZlQ29udGV4dHNNYXAoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbnRleHRfdHlwZSkpOwotICAgICAgICAgICAgQVNTRVJUX0VRKHN1Y2Nlc3NfZXhwZWN0ZWQsIGdyb3VwXy0+Q29uZmlndXJlKGNvbnRleHRfdHlwZSkpOwotICAgICAgICAgICAgaWYgKHN1Y2Nlc3NfZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgVGVzdEFzZXNBY3RpdmUoTGVBdWRpb0NvZGVjSWRMYzMsIHNhbXBsaW5nX2ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZHVyYXRpb24sIG9jdGV0c19wZXJfZnJhbWUpOwotICAgICAgICAgICAgICBncm91cF8tPkRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVGVzdEFzZXNJbmFjdGl2ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGNvbnN0IGludCBncm91cF9pZF8gPSA2OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4+IGRldmljZXNfOwotICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwXyA9IG51bGxwdHI7Ci0gIGJsdWV0b290aDo6bWFuYWdlcjo6TW9ja0J0bUludGVyZmFjZSBidG1faW50ZXJmYWNlXzsKLSAgY29udHJvbGxlcjo6TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UgY29udHJvbGxlcl9pbnRlcmZhY2VfOwotfTsKLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF9tb25vX3NwZWFrZXJfcmluZ3RvbmUpIHsKLSAgTGVBdWRpb0RldmljZSogbW9ub19zcGVha2VyID0gQWRkVGVzdERldmljZSgxLCAwKTsKLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbkRhdGEgZGF0YSh7bW9ub19zcGVha2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudE5vbmUsIDEsIDB9KTsKLQotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uKExlQXVkaW9Db250ZXh0VHlwZTo6UklOR1RPTkUsICZkYXRhLCAxKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF9tb25vX3NwZWFrZXJfY29udmVyc2lvbmFsKSB7Ci0gIExlQXVkaW9EZXZpY2UqIG1vbm9fc3BlYWtlciA9IEFkZFRlc3REZXZpY2UoMSwgMCk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGEoe21vbm9fc3BlYWtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnROb25lLCAwLCAwfSk7Ci0KLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMLCAmZGF0YSwgMSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfbW9ub19zcGVha2VyX21lZGlhKSB7Ci0gIExlQXVkaW9EZXZpY2UqIG1vbm9fc3BlYWtlciA9IEFkZFRlc3REZXZpY2UoMSwgMCk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGEoe21vbm9fc3BlYWtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnROb25lLCAxLCAwfSk7Ci0KLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGU6Ok1FRElBLCAmZGF0YSwgMSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfYm91bmRlZF9oZWFkcGhvbmVzX3Jpbmd0b25lKSB7Ci0gIExlQXVkaW9EZXZpY2UqIGJvdW5kZWRfaGVhZHBob25lcyA9IEFkZFRlc3REZXZpY2UoMiwgMCk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGEoe2JvdW5kZWRfaGVhZHBob25lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFR3b0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnROb25lLCAyLCAwfSk7Ci0KLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGU6OlJJTkdUT05FLCAmZGF0YSwgMSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfYm91bmRlZF9oZWFkcGhvbmVzX2NvbnZlcnNpb25hbCkgewotICBMZUF1ZGlvRGV2aWNlKiBib3VuZGVkX2hlYWRwaG9uZXMgPSBBZGRUZXN0RGV2aWNlKDIsIDApOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhKHtib3VuZGVkX2hlYWRwaG9uZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRUd29DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50Tm9uZSwgMCwgMH0pOwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpDT05WRVJTQVRJT05BTCwgJmRhdGEsIDEpOwotfQotCi1URVNUX0YoTGVBdWRpb0FzZUNvbmZpZ3VyYXRpb25UZXN0LCB0ZXN0X2JvdW5kZWRfaGVhZHBob25lc19tZWRpYSkgewotICBMZUF1ZGlvRGV2aWNlKiBib3VuZGVkX2hlYWRwaG9uZXMgPSBBZGRUZXN0RGV2aWNlKDIsIDApOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhKHtib3VuZGVkX2hlYWRwaG9uZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRUd29DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50Tm9uZSwgMiwgMH0pOwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQSwgJmRhdGEsIDEpOwotfQotCi1URVNUX0YoTGVBdWRpb0FzZUNvbmZpZ3VyYXRpb25UZXN0LCB0ZXN0X2JvdW5kZWRfaGVhZHNldF9yaW5ndG9uZSkgewotICBMZUF1ZGlvRGV2aWNlKiBib3VuZGVkX2hlYWRzZXQgPSBBZGRUZXN0RGV2aWNlKDIsIDEpOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhKAotICAgICAge2JvdW5kZWRfaGVhZHNldCwga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFR3b0NoYW5uZWwsCi0gICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsIDIsIDB9KTsKLQotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uKExlQXVkaW9Db250ZXh0VHlwZTo6UklOR1RPTkUsICZkYXRhLCAxKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF9ib3VuZGVkX2hlYWRzZXRfY29udmVyc2lvbmFsKSB7Ci0gIExlQXVkaW9EZXZpY2UqIGJvdW5kZWRfaGVhZHNldCA9IEFkZFRlc3REZXZpY2UoMiwgMSk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGEoCi0gICAgICB7Ym91bmRlZF9oZWFkc2V0LCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50VHdvQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMiwgMX0pOwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpDT05WRVJTQVRJT05BTCwgJmRhdGEsIDEpOwotfQotCi1URVNUX0YoTGVBdWRpb0FzZUNvbmZpZ3VyYXRpb25UZXN0LCB0ZXN0X2JvdW5kZWRfaGVhZHNldF9tZWRpYSkgewotICBMZUF1ZGlvRGV2aWNlKiBib3VuZGVkX2hlYWRzZXQgPSBBZGRUZXN0RGV2aWNlKDIsIDEpOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhKAotICAgICAge2JvdW5kZWRfaGVhZHNldCwga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFR3b0NoYW5uZWwsCi0gICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsIDIsIDB9KTsKLQotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uKExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUEsICZkYXRhLCAxKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF9lYXJidWRzX3Jpbmd0b25lKSB7Ci0gIExlQXVkaW9EZXZpY2UqIGxlZnQgPSBBZGRUZXN0RGV2aWNlKDEsIDEpOwotICBMZUF1ZGlvRGV2aWNlKiByaWdodCA9IEFkZFRlc3REZXZpY2UoMSwgMSk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGFbXSA9IHsKLSAgICAgIHtsZWZ0LCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMSwgMH0sCi0gICAgICB7cmlnaHQsIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLAotICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLCAxLCAwfX07Ci0KLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGU6OlJJTkdUT05FLCBkYXRhLCAyKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF9lYXJidWRzX2NvbnZlcnNpb25hbCkgewotICBMZUF1ZGlvRGV2aWNlKiBsZWZ0ID0gQWRkVGVzdERldmljZSgxLCAxKTsKLSAgTGVBdWRpb0RldmljZSogcmlnaHQgPSBBZGRUZXN0RGV2aWNlKDEsIDEpOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhW10gPSB7Ci0gICAgICB7bGVmdCwga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsCi0gICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsIDEsIDF9LAotICAgICAge3JpZ2h0LCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMSwgMH19OwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpDT05WRVJTQVRJT05BTCwgZGF0YSwgMik7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfZWFyYnVkc19tZWRpYSkgewotICBMZUF1ZGlvRGV2aWNlKiBsZWZ0ID0gQWRkVGVzdERldmljZSgxLCAxKTsKLSAgTGVBdWRpb0RldmljZSogcmlnaHQgPSBBZGRUZXN0RGV2aWNlKDEsIDEpOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhW10gPSB7Ci0gICAgICB7bGVmdCwga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsCi0gICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsIDEsIDB9LAotICAgICAge3JpZ2h0LCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMSwgMH19OwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQSwgZGF0YSwgMik7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfaGFuZHNmcmVlX3Jpbmd0b25lKSB7Ci0gIExlQXVkaW9EZXZpY2UqIGhhbmRzZnJlZSA9IEFkZFRlc3REZXZpY2UoMSwgMSk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGEoCi0gICAgICB7aGFuZHNmcmVlLCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMSwgMH0pOwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpSSU5HVE9ORSwgJmRhdGEsIDEpOwotfQotCi1URVNUX0YoTGVBdWRpb0FzZUNvbmZpZ3VyYXRpb25UZXN0LCB0ZXN0X2hhbmRzZnJlZV9jb252ZXJzaW9uYWwpIHsKLSAgTGVBdWRpb0RldmljZSogaGFuZHNmcmVlID0gQWRkVGVzdERldmljZSgxLCAxKTsKLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbkRhdGEgZGF0YSgKLSAgICAgIHtoYW5kc2ZyZWUsIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLAotICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLCAxLCAxfSk7Ci0KLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMLCAmZGF0YSwgMSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfaGFuZHNmcmVlX2Z1bGxfY2FjaGVkX2NvbnZlcnNpb25hbCkgewotICBMZUF1ZGlvRGV2aWNlKiBoYW5kc2ZyZWUgPSBBZGRUZXN0RGV2aWNlKDAsIDAsIDEsIDEpOwotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhKAotICAgICAge2hhbmRzZnJlZSwga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsCi0gICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsIDEsIDF9KTsKLQotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uKExlQXVkaW9Db250ZXh0VHlwZTo6Q09OVkVSU0FUSU9OQUwsICZkYXRhLCAxKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwKLSAgICAgICB0ZXN0X2hhbmRzZnJlZV9wYXJ0aWFsX2NhY2hlZF9jb252ZXJzaW9uYWwpIHsKLSAgTGVBdWRpb0RldmljZSogaGFuZHNmcmVlID0gQWRkVGVzdERldmljZSgxLCAwLCAwLCAxKTsKLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbkRhdGEgZGF0YSgKLSAgICAgIHtoYW5kc2ZyZWUsIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLAotICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsLCAxLCAxfSk7Ci0KLSAgVGVzdEdyb3VwQXNlQ29uZmlndXJhdGlvbihMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMLCAmZGF0YSwgMSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfaGFuZHNmcmVlX21lZGlhKSB7Ci0gIExlQXVkaW9EZXZpY2UqIGhhbmRzZnJlZSA9IEFkZFRlc3REZXZpY2UoMSwgMSk7Ci0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25EYXRhIGRhdGEoCi0gICAgICB7aGFuZHNmcmVlLCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMSwgMH0pOwotCi0gIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb24oTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQSwgJmRhdGEsIDEpOwotfQotCi1URVNUX0YoTGVBdWRpb0FzZUNvbmZpZ3VyYXRpb25UZXN0LCB0ZXN0X2xjM19jb25maWdfcmluZ3RvbmUpIHsKLSAgQWRkVGVzdERldmljZSgxLCAwKTsKLQotICBUZXN0TGMzQ29kZWNDb25maWcoTGVBdWRpb0NvbnRleHRUeXBlOjpSSU5HVE9ORSk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfbGMzX2NvbmZpZ19jb252ZXJzaW9uYWwpIHsKLSAgQWRkVGVzdERldmljZSgxLCAxKTsKLQotICBUZXN0TGMzQ29kZWNDb25maWcoTGVBdWRpb0NvbnRleHRUeXBlOjpDT05WRVJTQVRJT05BTCk7Ci19Ci0KLVRFU1RfRihMZUF1ZGlvQXNlQ29uZmlndXJhdGlvblRlc3QsIHRlc3RfbGMzX2NvbmZpZ19tZWRpYSkgewotICBBZGRUZXN0RGV2aWNlKDEsIDApOwotCi0gIFRlc3RMYzNDb2RlY0NvbmZpZyhMZUF1ZGlvQ29udGV4dFR5cGU6Ok1FRElBKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF91bnN1cHBvcnRlZF9jb2RlYykgewotICBjb25zdCBMZUF1ZGlvQ29kZWNJZCBVbnN1cHBvcnRlZENvZGVjSWQgPSB7Ci0gICAgICAuY29kaW5nX2Zvcm1hdCA9IGtMZUF1ZGlvQ29kaW5nRm9ybWF0VmVuZG9yU3BlY2lmaWMsCi0gICAgICAudmVuZG9yX2NvbXBhbnlfaWQgPSAweEJBRCwKLSAgICAgIC52ZW5kb3JfY29kZWNfaWQgPSAweEMwREUsCi0gIH07Ci0KLSAgTGVBdWRpb0RldmljZSogZGV2aWNlID0gQWRkVGVzdERldmljZSgxLCAwKTsKLQotICBQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdGllc0J1aWxkZXIgcGFjX2J1aWxkZXI7Ci0gIHBhY19idWlsZGVyLkFkZChVbnN1cHBvcnRlZENvZGVjSWQsCi0gICAgICAgICAgICAgICAgICBHZXRTYW1wbGluZ0ZyZXF1ZW5jeShMYzNTZXR0aW5nSWQ6OkxDM18xNl8yKSwKLSAgICAgICAgICAgICAgICAgIEdldEZyYW1lRHVyYXRpb24oTGMzU2V0dGluZ0lkOjpMQzNfMTZfMiksCi0gICAgICAgICAgICAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgIEdldE9jdGV0c1BlckNvZGVjRnJhbWUoTGMzU2V0dGluZ0lkOjpMQzNfMTZfMikpOwotICBkZXZpY2UtPnNua19wYWNzXyA9IHBhY19idWlsZGVyLkdldCgpOwotICBkZXZpY2UtPnNyY19wYWNzXyA9IHBhY19idWlsZGVyLkdldCgpOwotCi0gIEFTU0VSVF9GQUxTRShncm91cF8tPkNvbmZpZ3VyZShMZUF1ZGlvQ29udGV4dFR5cGU6OlJJTkdUT05FKSk7Ci0gIFRlc3RBc2VzSW5hY3RpdmUoKTsKLX0KLQotVEVTVF9GKExlQXVkaW9Bc2VDb25maWd1cmF0aW9uVGVzdCwgdGVzdF9yZWNvbm5lY3Rpb25fbWVkaWEpIHsKLSAgTGVBdWRpb0RldmljZSogbGVmdCA9IEFkZFRlc3REZXZpY2UoMiwgMSk7Ci0gIExlQXVkaW9EZXZpY2UqIHJpZ2h0ID0gQWRkVGVzdERldmljZSgyLCAxKTsKLQotICBUZXN0R3JvdXBBc2VDb25maWd1cmF0aW9uRGF0YSBkYXRhW10gPSB7Ci0gICAgICB7bGVmdCwga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsCi0gICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwsIDEsIDB9LAotICAgICAge3JpZ2h0LCBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwKLSAgICAgICBrTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCwgMSwgMH19OwotCi0gIFRlc3RTaW5nbGVBc2VDb25maWd1cmF0aW9uKExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUEsIGRhdGEsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rXzQ4XzQpOwotCi0gIFNldENpc0luZm9ybWF0aW9uVG9BY3RpdmVBc2UoKTsKLQotICAvKiBMZWZ0IGdvdCBkaXNjb25uZWN0ZWQgKi8KLSAgbGVmdC0+RGVhY3RpdmF0ZUFsbEFzZXMoKTsKLSAgVGVzdEFzZXNJbmFjdGl2YXRlZChsZWZ0KTsKLQotICAvKiBQcmVwYXJlIHJlY29uZmlndXJhdGlvbiAqLwotICB1aW50OF90IG51bWJlcl9vZl9hY3RpdmVfYXNlcyA9IDE7ICAvLyBSaWdodCBvbmUKLSAgYXV0byogYXNlID0gcmlnaHQtPkdldEZpcnN0QWN0aXZlQXNlQnlEaXJlY3Rpb24oa0xlQXVkaW9EaXJlY3Rpb25TaW5rKTsKLSAgOjpsZV9hdWRpbzo6dHlwZXM6OkF1ZGlvTG9jYXRpb25zIGdyb3VwX3Nua19hdWRpb19sb2NhdGlvbiA9Ci0gICAgICBhc2UtPmNvZGVjX2NvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb247Ci0gIDo6bGVfYXVkaW86OnR5cGVzOjpBdWRpb0xvY2F0aW9ucyBncm91cF9zcmNfYXVkaW9fbG9jYXRpb24gPQotICAgICAgYXNlLT5jb2RlY19jb25maWcuYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uOwotCi0gIC8qIEdldCBrbm93biByZXF1aXJlbWVudCovCi0gIGF1dG8qIGNvbmZpZ3VyYXRpb24gPSAma0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua180OF80OwotCi0gIC8qIEdldCBlbnRyeSBmb3IgdGhlIHNpbmsgZGlyZWN0aW9uIGFuZCB1c2UgaXQgdG8gc2V0IGNvbmZpZ3VyYXRpb24gKi8KLSAgZm9yIChhdXRvJiBlbnQgOiBjb25maWd1cmF0aW9uLT5jb25mcykgewotICAgIGlmIChlbnQuZGlyZWN0aW9uID09IDo6bGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspIHsKLSAgICAgIGxlZnQtPkNvbmZpZ3VyZUFzZXMoZW50LCBncm91cF8tPkdldEN1cnJlbnRDb250ZXh0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyX29mX2FjdGl2ZV9hc2VzLCBncm91cF9zbmtfYXVkaW9fbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX3NyY19hdWRpb19sb2NhdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgQVNTRVJUX1RSVUUobnVtYmVyX29mX2FjdGl2ZV9hc2VzID09IDIpOwotICBBU1NFUlRfVFJVRShncm91cF9zbmtfYXVkaW9fbG9jYXRpb24gPT0ga0NoYW5uZWxBbGxvY2F0aW9uU3RlcmVvKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgIFRlc3RHcm91cEFzZUNvbmZpZ3VyYXRpb25WZXJkaWN0KGRhdGFbaV0pOwotICB9Ci0KLSAgVGVzdEFjdGl2ZUFzZXMoKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9oYWxfdmVyaWZpZXIuY2MgYi9idGEvbGVfYXVkaW8vaGFsX3ZlcmlmaWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjEwNzE0Li4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9oYWxfdmVyaWZpZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYXVkaW9faGFsX2ludGVyZmFjZS9oYWxfdmVyc2lvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotCi1ib29sIExlQXVkaW9IYWxWZXJpZmllcjo6U3VwcG9ydHNMZUF1ZGlvKCkgewotICByZXR1cm4gYmx1ZXRvb3RoOjphdWRpbzo6SGFsVmVyc2lvbk1hbmFnZXI6OkdldEhhbFZlcnNpb24oKSA+PQotICAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6Qmx1ZXRvb3RoQXVkaW9IYWxWZXJzaW9uOjpWRVJTSU9OXzJfMTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9oYWxfdmVyaWZpZXJfbGludXguY2MgYi9idGEvbGVfYXVkaW8vaGFsX3ZlcmlmaWVyX2xpbnV4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODNlODVjLi4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9oYWxfdmVyaWZpZXJfbGludXguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotCi1ib29sIExlQXVkaW9IYWxWZXJpZmllcjo6U3VwcG9ydHNMZUF1ZGlvKCkgeyByZXR1cm4gZmFsc2U7IH0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9sZV9hdWRpb19jbGllbnRfdGVzdC5jYyBiL2J0YS9sZV9hdWRpby9sZV9hdWRpb19jbGllbnRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZTRjOC4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vbGVfYXVkaW9fY2xpZW50X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0KLSNpbmNsdWRlICJidGEvY3Npcy9jc2lzX3R5cGVzLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpX21vY2suaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZV9tb2NrLmgiCi0jaW5jbHVkZSAiYnRhX2dyb3Vwcy5oIgotI2luY2x1ZGUgImJ0YV9sZV9hdWRpb19hcGkuaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2VfbW9jay5oIgotI2luY2x1ZGUgImJ0bV9hcGlfbW9jay5oIgotI2luY2x1ZGUgImJ0bV9pc29fYXBpLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiZ2F0dC9kYXRhYmFzZV9idWlsZGVyLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvYnRfZ2F0dF90eXBlcy5oIgotI2luY2x1ZGUgImxlX2F1ZGlvX3R5cGVzLmgiCi0jaW5jbHVkZSAibW9ja19jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibW9ja19jc2lzX2NsaWVudC5oIgotI2luY2x1ZGUgIm1vY2tfZGV2aWNlX2dyb3Vwcy5oIgotI2luY2x1ZGUgIm1vY2tfaXNvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtb2NrX2xlX2F1ZGlvX2NsaWVudF9hdWRpby5oIgotI2luY2x1ZGUgIm1vY2tfc3RhdGVfbWFjaGluZS5oIgotCi11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6QW55TnVtYmVyOwotdXNpbmcgdGVzdGluZzo6QXRMZWFzdDsKLXVzaW5nIHRlc3Rpbmc6OkF0TW9zdDsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6SW52b2tlOwotdXNpbmcgdGVzdGluZzo6TW9jazsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2tGdW5jdGlvbjsKLXVzaW5nIHRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgdGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlRlc3Q7Ci11c2luZyB0ZXN0aW5nOjpXaXRoQXJnOwotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg6OmxlX2F1ZGlvOwotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gRGlzYWJsZXMgbW9zdCBsaWtlbHkgZmFsc2UtcG9zaXRpdmVzIGZyb20gYmFzZTo6U3BsaXRTdHJpbmcoKQotZXh0ZXJuICJDIiBjb25zdCBjaGFyKiBfX2FzYW5fZGVmYXVsdF9vcHRpb25zKCkgewotICByZXR1cm4gImRldGVjdF9jb250YWluZXJfb3ZlcmZsb3c9MCI7Ci19Ci0KLXN0ZDo6YXRvbWljPGludD4gbnVtX2FzeW5jX3Rhc2tzOwotYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQoInRlc3QgbWVzc2FnZSBsb29wIik7Ci1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsKLSAgcmV0dXJuICZtZXNzYWdlX2xvb3BfdGhyZWFkOwotfQotYnRfc3RhdHVzX3QgZG9faW5fbWFpbl90aHJlYWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2spIHsKLSAgLy8gV3JhcCB0aGUgdGFzayB3aXRoIHRhc2sgY291bnRlciBzbyB3ZSBjb3VsZCBsYXRlciBrbm93IGlmIHRoZXJlIGFyZQotICAvLyBhbnkgY2FsbGJhY2tzIHNjaGVkdWxlZCBhbmQgd2Ugc2hvdWxkIHdhaXQgYmVmb3JlIHBlcmZvcm1pbmcgc29tZSBhY3Rpb25zCi0gIGlmICghbWVzc2FnZV9sb29wX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgICAgIGZyb21faGVyZSwKLSAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgW10oYmFzZTo6T25jZUNsb3N1cmUgdGFzaywgc3RkOjphdG9taWM8aW50PiYgbnVtX2FzeW5jX3Rhc2tzKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjptb3ZlKHRhc2spLlJ1bigpOwotICAgICAgICAgICAgICAgIG51bV9hc3luY190YXNrcy0tOwotICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICBzdGQ6Om1vdmUodGFzayksIHN0ZDo6cmVmKG51bV9hc3luY190YXNrcykpKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIGZyb20gIiA8PCBmcm9tX2hlcmUuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgbnVtX2FzeW5jX3Rhc2tzKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJhc2U6Ok1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3BfOwotYmFzZTo6TWVzc2FnZUxvb3AqIGdldF9tYWluX21lc3NhZ2VfbG9vcCgpIHsgcmV0dXJuIG1lc3NhZ2VfbG9vcF87IH0KLQotc3RhdGljIHZvaWQgaW5pdF9tZXNzYWdlX2xvb3BfdGhyZWFkKCkgewotICBudW1fYXN5bmNfdGFza3MgPSAwOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgaWYgKCFtZXNzYWdlX2xvb3BfdGhyZWFkLklzUnVubmluZygpKSB7Ci0gICAgRkFJTCgpIDw8ICJ1bmFibGUgdG8gY3JlYXRlIG1lc3NhZ2UgbG9vcCB0aHJlYWQuIjsKLSAgfQotCi0gIGlmICghbWVzc2FnZV9sb29wX3RocmVhZC5FbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKSkKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc2V0IHJlYWwgdGltZSBzY2hlZHVsaW5nIjsKLQotICBtZXNzYWdlX2xvb3BfID0gbWVzc2FnZV9sb29wX3RocmVhZC5tZXNzYWdlX2xvb3AoKTsKLSAgaWYgKG1lc3NhZ2VfbG9vcF8gPT0gbnVsbHB0cikgRkFJTCgpIDw8ICJ1bmFibGUgdG8gZ2V0IG1lc3NhZ2UgbG9vcC4iOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX21lc3NhZ2VfbG9vcF90aHJlYWQoKSB7Ci0gIG1lc3NhZ2VfbG9vcF8gPSBudWxscHRyOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci19Ci0KLW5hbWVzcGFjZSBsZV9hdWRpbyB7Ci1uYW1lc3BhY2UgewotY2xhc3MgTW9ja0xlQXVkaW9DbGllbnRDYWxsYmFja3MKLSAgICA6IHB1YmxpYyBibHVldG9vdGg6OmxlX2F1ZGlvOjpMZUF1ZGlvQ2xpZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25Db25uZWN0aW9uU3RhdGUsCi0gICAgICAgICAgICAgIChDb25uZWN0aW9uU3RhdGUgc3RhdGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkdyb3VwU3RhdHVzLCAoaW50IGdyb3VwX2lkLCBHcm91cFN0YXR1cyBncm91cF9zdGF0dXMpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkdyb3VwTm9kZVN0YXR1cywKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBncm91cF9pZCwKLSAgICAgICAgICAgICAgIEdyb3VwTm9kZVN0YXR1cyBub2RlX3N0YXR1cyksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uQXVkaW9Db25mLAotICAgICAgICAgICAgICAodWludDhfdCBkaXJlY3Rpb24sIGludCBncm91cF9pZCwgdWludDMyX3Qgc25rX2F1ZGlvX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX2F1ZGlvX2xvY2F0aW9uLCB1aW50MTZfdCBhdmFpbF9jb250KSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci19OwotCi1jbGFzcyBVbmljYXN0VGVzdE5vSW5pdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXBNb2NrQXVkaW9IYWwoKSB7Ci0gICAgLy8gU291cmNlCi0gICAgaXNfYXVkaW9faGFsX3NvdXJjZV9hY3F1aXJlZCA9IGZhbHNlOwotCi0gICAgT05fQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIFt0aGlzXShjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY19jb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgIExlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlciogYXVkaW9SZWNlaXZlcikgewotICAgICAgICAgICAgICBhdWRpb19zaW5rX3JlY2VpdmVyXyA9IGF1ZGlvUmVjZWl2ZXI7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSk7Ci0gICAgT05fQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIEFjcXVpcmUpLldpbGxCeURlZmF1bHQoW3RoaXNdKCkgLT4gdm9pZCogewotICAgICAgaWYgKCFpc19hdWRpb19oYWxfc291cmNlX2FjcXVpcmVkKSB7Ci0gICAgICAgIGlzX2F1ZGlvX2hhbF9zb3VyY2VfYWNxdWlyZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gJm1vY2tfYXVkaW9fc291cmNlXzsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfSk7Ci0gICAgT05fQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFJlbGVhc2UpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXShjb25zdCB2b2lkKiBpbnN0KSAtPiB2b2lkIHsKLSAgICAgICAgICBpZiAoaXNfYXVkaW9faGFsX3NvdXJjZV9hY3F1aXJlZCkgewotICAgICAgICAgICAgaXNfYXVkaW9faGFsX3NvdXJjZV9hY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICBNb2NrTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpTZXRNb2NrSW5zdGFuY2VGb3JUZXN0aW5nKAotICAgICAgICAmbW9ja19hdWRpb19zb3VyY2VfKTsKLQotICAgIC8vIFNpbmsKLSAgICBpc19hdWRpb19oYWxfc2lua19hY3F1aXJlZCA9IGZhbHNlOwotCi0gICAgT05fQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBTdGFydChfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBbdGhpc10oY29uc3QgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNfY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlciogYXVkaW9SZWNlaXZlcikgewotICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfcmVjZWl2ZXJfID0gYXVkaW9SZWNlaXZlcjsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9KTsKLSAgICBPTl9DQUxMKG1vY2tfYXVkaW9fc2lua18sIEFjcXVpcmUpLldpbGxCeURlZmF1bHQoW3RoaXNdKCkgLT4gdm9pZCogewotICAgICAgaWYgKCFpc19hdWRpb19oYWxfc2lua19hY3F1aXJlZCkgewotICAgICAgICBpc19hdWRpb19oYWxfc2lua19hY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiAmbW9ja19hdWRpb19zaW5rXzsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfSk7Ci0gICAgT05fQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBSZWxlYXNlKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpc10oY29uc3Qgdm9pZCogaW5zdCkgLT4gdm9pZCB7Ci0gICAgICAgICAgaWYgKGlzX2F1ZGlvX2hhbF9zaW5rX2FjcXVpcmVkKSB7Ci0gICAgICAgICAgICBpc19hdWRpb19oYWxfc2lua19hY3F1aXJlZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgT05fQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBTZW5kRGF0YSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoW10odWludDhfdCogZGF0YSwgdWludDE2X3Qgc2l6ZSkgeyByZXR1cm4gc2l6ZTsgfSk7Ci0KLSAgICBNb2NrTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U2V0TW9ja0luc3RhbmNlRm9yVGVzdGluZygmbW9ja19hdWRpb19zaW5rXyk7Ci0KLSAgICAvLyBIQUwKLSAgICBPTl9DQUxMKG1vY2tfaGFsXzJfMV92ZXJpZmllciwgQ2FsbCgpKS5XaWxsQnlEZWZhdWx0KFtdKCkgLT4gYm9vbCB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9KTsKLSAgfQotCi0gIHZvaWQgSW5qZWN0R3JvdXBEZXZpY2VSZW1vdmVkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBncm91cF9pZCkgewotICAgIGdyb3VwX2NhbGxiYWNrc18tPk9uR3JvdXBNZW1iZXJSZW1vdmVkKGFkZHJlc3MsIGdyb3VwX2lkKTsKLSAgfQotCi0gIHZvaWQgSW5qZWN0R3JvdXBEZXZpY2VBZGRlZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgZ3JvdXBfaWQpIHsKLSAgICBibHVldG9vdGg6OlV1aWQgdXVpZCA9IGxlX2F1ZGlvOjp1dWlkOjprQ2FwU2VydmljZVV1aWQ7Ci0KLSAgICBpbnQgZ3JvdXBfbWVtYmVyc19udW0gPSAwOwotICAgIGZvciAoY29uc3QgYXV0byYgW2FkZHIsIGlkXSA6IGdyb3VwcykgewotICAgICAgaWYgKGlkID09IGdyb3VwX2lkKSBncm91cF9tZW1iZXJzX251bSsrOwotICAgIH0KLQotICAgIGJvb2wgZmlyc3RfZGV2aWNlID0gKGdyb3VwX21lbWJlcnNfbnVtID09IDEpOwotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgaW50IGdyb3VwX2lkLCBibHVldG9vdGg6OlV1aWQgdXVpZCwKLSAgICAgICAgICAgICAgIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHNDYWxsYmFja3MqIGdyb3VwX2NhbGxiYWNrcywKLSAgICAgICAgICAgICAgIGJvb2wgZmlyc3RfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgIGlmIChmaXJzdF9kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBncm91cF9jYWxsYmFja3MtPk9uR3JvdXBBZGRlZChhZGRyLCB1dWlkLCBncm91cF9pZCk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBfY2FsbGJhY2tzLT5Pbkdyb3VwTWVtYmVyQWRkZWQoYWRkciwgZ3JvdXBfaWQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgYWRkcmVzcywgZ3JvdXBfaWQsIHV1aWQsIGJhc2U6OlVucmV0YWluZWQodGhpcy0+Z3JvdXBfY2FsbGJhY2tzXyksCi0gICAgICAgICAgICBmaXJzdF9kZXZpY2UpKTsKLSAgfQotCi0gIHZvaWQgSW5qZWN0Q29ubmVjdGVkRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgQVNTRVJUX05FKGNvbm5faWQsIEdBVFRfSU5WQUxJRF9DT05OX0lEKTsKLSAgICB0QlRBX0dBVFRDX09QRU4gZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IHN0YXR1cywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgICAgICAuY2xpZW50X2lmID0gZ2F0dF9pZiwKLSAgICAgICAgLnJlbW90ZV9iZGEgPSBhZGRyZXNzLAotICAgICAgICAudHJhbnNwb3J0ID0gR0FUVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgIC5tdHUgPSAyNDAsCi0gICAgfTsKLQotICAgIEFTU0VSVF9ORShwZWVyX2RldmljZXMuY291bnQoY29ubl9pZCksIDB1KTsKLSAgICBwZWVyX2RldmljZXMuYXQoY29ubl9pZCktPmNvbm5lY3RlZCA9IHRydWU7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICBbXSh0QlRBX0dBVFRDX0NCQUNLKiBnYXR0X2NhbGxiYWNrLCB0QlRBX0dBVFRDX09QRU4gZXZlbnRfZGF0YSkgewotICAgICAgICAgICAgICBnYXR0X2NhbGxiYWNrKEJUQV9HQVRUQ19PUEVOX0VWVCwgKHRCVEFfR0FUVEMqKSZldmVudF9kYXRhKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMtPmdhdHRfY2FsbGJhY2spLCBldmVudF9kYXRhKSk7Ci0gIH0KLQotICB2b2lkIEluamVjdERpc2Nvbm5lY3RlZEV2ZW50KHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICBBU1NFUlRfTkUoY29ubl9pZCwgR0FUVF9JTlZBTElEX0NPTk5fSUQpOwotICAgIEFTU0VSVF9ORShwZWVyX2RldmljZXMuY291bnQoY29ubl9pZCksIDB1KTsKLQotICAgIHRCVEFfR0FUVENfQ0xPU0UgZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgICAgICAuY2xpZW50X2lmID0gZ2F0dF9pZiwKLSAgICAgICAgLnJlbW90ZV9iZGEgPSBwZWVyX2RldmljZXMuYXQoY29ubl9pZCktPmFkZHIsCi0gICAgICAgIC5yZWFzb24gPSBHQVRUX0NPTk5fVEVSTUlOQVRFX1BFRVJfVVNFUiwKLSAgICB9OwotCi0gICAgcGVlcl9kZXZpY2VzLmF0KGNvbm5faWQpLT5jb25uZWN0ZWQgPSBmYWxzZTsKLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgIFtdKHRCVEFfR0FUVENfQ0JBQ0sqIGdhdHRfY2FsbGJhY2ssIHRCVEFfR0FUVENfQ0xPU0UgZXZlbnRfZGF0YSkgewotICAgICAgICAgICAgICBnYXR0X2NhbGxiYWNrKEJUQV9HQVRUQ19DTE9TRV9FVlQsICh0QlRBX0dBVFRDKikmZXZlbnRfZGF0YSk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzLT5nYXR0X2NhbGxiYWNrKSwgZXZlbnRfZGF0YSkpOwotICB9Ci0KLSAgdm9pZCBJbmplY3RTZWFyY2hDb21wbGV0ZUV2ZW50KHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICBBU1NFUlRfTkUoY29ubl9pZCwgR0FUVF9JTlZBTElEX0NPTk5fSUQpOwotICAgIHRCVEFfR0FUVENfU0VBUkNIX0NNUEwgZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgIH07Ci0KLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtdKHRCVEFfR0FUVENfQ0JBQ0sqIGdhdHRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVENfU0VBUkNIX0NNUEwgZXZlbnRfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRBX0dBVFRDKikmZXZlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcy0+Z2F0dF9jYWxsYmFjayksIGV2ZW50X2RhdGEpKTsKLSAgfQotCi0gIHZvaWQgSW5qZWN0Tm90aWZpY2F0aW9uRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgdGVzdF9hZGRyZXNzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUpIHsKLSAgICBBU1NFUlRfTkUoY29ubl9pZCwgR0FUVF9JTlZBTElEX0NPTk5fSUQpOwotICAgIHRCVEFfR0FUVENfTk9USUZZIGV2ZW50X2RhdGEgPSB7Ci0gICAgICAgIC5jb25uX2lkID0gY29ubl9pZCwKLSAgICAgICAgLmJkYSA9IHRlc3RfYWRkcmVzcywKLSAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgLmxlbiA9ICh1aW50OF90KXZhbHVlLnNpemUoKSwKLSAgICAgICAgLmlzX25vdGlmeSA9IHRydWUsCi0gICAgfTsKLQotICAgIHN0ZDo6Y29weSh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSwgZXZlbnRfZGF0YS52YWx1ZSk7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICBbXSh0QlRBX0dBVFRDX0NCQUNLKiBnYXR0X2NhbGxiYWNrLCB0QlRBX0dBVFRDX05PVElGWSBldmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX05PVElGX0VWVCwgKHRCVEFfR0FUVEMqKSZldmVudF9kYXRhKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMtPmdhdHRfY2FsbGJhY2spLCBldmVudF9kYXRhKSk7Ci0gIH0KLQotICB2b2lkIFNldFVwTW9ja0dhdHQoKSB7Ci0gICAgLy8gZGVmYXVsdCBhY3Rpb24gZm9yIEdldENoYXJhY3RlcmlzdGljIGZ1bmN0aW9uIGNhbGwKLSAgICBPTl9DQUxMKG1vY2tfZ2F0dF9pbnRlcmZhY2VfLCBHZXRDaGFyYWN0ZXJpc3RpYyhfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBJbnZva2UoWyZdKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgLT4gY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHsKLSAgICAgICAgICAgICAgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+JiBzZXJ2aWNlcyA9Ci0gICAgICAgICAgICAgICAgICBwZWVyX2RldmljZXMuYXQoY29ubl9pZCktPnNlcnZpY2VzOwotICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIHNlcnZpY2UgOiBzZXJ2aWNlcykgewotICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgY2hhcmFjdGVyaXN0aWMgOiBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcykgewotICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcmlzdGljLnZhbHVlX2hhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZjaGFyYWN0ZXJpc3RpYzsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICAgIH0pKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBHZXRPd25pbmdTZXJ2aWNlIGZ1bmN0aW9uIGNhbGwKLSAgICBPTl9DQUxMKG1vY2tfZ2F0dF9pbnRlcmZhY2VfLCBHZXRPd25pbmdTZXJ2aWNlKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoCi0gICAgICAgICAgICBbJl0odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKSAtPiBjb25zdCBnYXR0OjpTZXJ2aWNlKiB7Ci0gICAgICAgICAgICAgIHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiYgc2VydmljZXMgPQotICAgICAgICAgICAgICAgICAgcGVlcl9kZXZpY2VzLmF0KGNvbm5faWQpLT5zZXJ2aWNlczsKLSAgICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5oYW5kbGUgPD0gaGFuZGxlICYmIHNlcnZpY2UuZW5kX2hhbmRsZSA+PSBoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAmc2VydmljZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICAgIH0pKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBTZXJ2aWNlU2VhcmNoUmVxdWVzdCBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgU2VydmljZVNlYXJjaFJlcXVlc3QoXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFdpdGhBcmc8MD4oSW52b2tlKAotICAgICAgICAgICAgWyZdKHVpbnQxNl90IGNvbm5faWQpIHsgSW5qZWN0U2VhcmNoQ29tcGxldGVFdmVudChjb25uX2lkKTsgfSkpKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBHZXRTZXJ2aWNlcyBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgR2V0U2VydmljZXMoXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFdpdGhBcmc8MD4oCi0gICAgICAgICAgICBJbnZva2UoWyZdKHVpbnQxNl90IGNvbm5faWQpIC0+IHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiogewotICAgICAgICAgICAgICByZXR1cm4gJnBlZXJfZGV2aWNlcy5hdChjb25uX2lkKS0+c2VydmljZXM7Ci0gICAgICAgICAgICB9KSkpOwotCi0gICAgLy8gZGVmYXVsdCBhY3Rpb24gZm9yIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oR0FUVF9TVUNDRVNTKSk7Ci0KLSAgICAvLyBkZWZhdWx0IGFjdGlvbiBmb3IgRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnMgZnVuY3Rpb24gY2FsbAotICAgIE9OX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIERlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oR0FUVF9TVUNDRVNTKSk7Ci0KLSAgICAvLyBkZWZhdWx0IGFjdGlvbiBmb3IgV3JpdGVEZXNjcmlwdG9yIGZ1bmN0aW9uIGNhbGwKLSAgICBPTl9DQUxMKG1vY2tfZ2F0dF9xdWV1ZV8sIFdyaXRlRGVzY3JpcHRvcihfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBJbnZva2UoW10odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLCB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgLT4gdm9pZCB7Ci0gICAgICAgICAgICAgIGlmIChjYikKLSAgICAgICAgICAgICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogY2JfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGNvbm5faWQsIEdBVFRfU1VDQ0VTUywgaGFuZGxlLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGNiX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYiwgY29ubl9pZCwgaGFuZGxlLCB2YWx1ZS5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmRhdGEoKSwgY2JfZGF0YSkpOwotICAgICAgICAgICAgfSkpOwotCi0gICAgZ2xvYmFsX2Nvbm5faWQgPSAxOwotICAgIE9OX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIE9wZW4oXywgXywgXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgICAgSW52b2tlKFsmXSh0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCBib29sIG9wcG9ydHVuaXN0aWMpIHsKLSAgICAgICAgICAgICAgSW5qZWN0Q29ubmVjdGVkRXZlbnQocmVtb3RlX2JkYSwgZ2xvYmFsX2Nvbm5faWQrKyk7Ci0gICAgICAgICAgICB9KSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfZ2F0dF9pbnRlcmZhY2VfLCBDbG9zZShfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKAotICAgICAgICAgICAgWyZdKHVpbnQxNl90IGNvbm5faWQpIHsgSW5qZWN0RGlzY29ubmVjdGVkRXZlbnQoY29ubl9pZCk7IH0pKTsKLQotICAgIC8vIGRlZmF1bHQgQ2hhcmFjdGVyaXN0aWMgcmVhZCBoYW5kbGVyIGRpc3BhdGNoZXMgcmVxdWVzdHMgdG8gc2VydmljZSBtb2NrcwotICAgIE9OX0NBTEwobW9ja19nYXR0X3F1ZXVlXywgUmVhZENoYXJhY3RlcmlzdGljKF8sIF8sIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoWyZdKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFQURfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgICAgICAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgIFtdKHN0ZDo6bWFwPHVpbnQxNl90LCBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0RldmljZVdyYXBwZXI+PioKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2RldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsIEdBVFRfUkVBRF9PUF9DQiBjYiwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBpZiAocGVlcl9kZXZpY2VzLT5jb3VudChjb25uX2lkKSkgewotICAgICAgICAgICAgICAgICAgICAgIGF1dG8mIGRldmljZSA9IHBlZXJfZGV2aWNlcy0+YXQoY29ubl9pZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgYXV0byBzdmMgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+c2VydmljZXMuYmVnaW4oKSwgZGV2aWNlLT5zZXJ2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhbmRsZV0oY29uc3QgZ2F0dDo6U2VydmljZSYgc3ZjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChoYW5kbGUgPj0gc3ZjLmhhbmRsZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhbmRsZSA8PSBzdmMuZW5kX2hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gZGV2aWNlLT5zZXJ2aWNlcy5lbmQoKSkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggdG8gbW9ja2FibGUgaGFuZGxlciBmdW5jdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjLT5oYW5kbGUgPT0gZGV2aWNlLT5jc2lzLT5zdGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5jc2lzLT5PblJlYWRDaGFyYWN0ZXJpc3RpYyhoYW5kbGUsIGNiLCBjYl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN2Yy0+aGFuZGxlID09IGRldmljZS0+Y2FzLT5zdGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5jYXMtPk9uUmVhZENoYXJhY3RlcmlzdGljKGhhbmRsZSwgY2IsIGNiX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ZjLT5oYW5kbGUgPT0gZGV2aWNlLT5hc2NzLT5zdGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hc2NzLT5PblJlYWRDaGFyYWN0ZXJpc3RpYyhoYW5kbGUsIGNiLCBjYl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN2Yy0+aGFuZGxlID09IGRldmljZS0+cGFjcy0+c3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+cGFjcy0+T25SZWFkQ2hhcmFjdGVyaXN0aWMoaGFuZGxlLCBjYiwgY2JfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgJnBlZXJfZGV2aWNlcywgY29ubl9pZCwgaGFuZGxlLCBjYiwgY2JfZGF0YSkpOwotICAgICAgICB9KSk7Ci0gIH0KLQotICB2b2lkIFNldFVwTW9ja0dyb3VwcygpIHsKLSAgICBNb2NrQ3Npc0NsaWVudDo6U2V0TW9ja0luc3RhbmNlRm9yVGVzdGluZygmbW9ja19jc2lzX2NsaWVudF9tb2R1bGVfKTsKLSAgICBNb2NrRGV2aWNlR3JvdXBzOjpTZXRNb2NrSW5zdGFuY2VGb3JUZXN0aW5nKCZtb2NrX2dyb3Vwc19tb2R1bGVfKTsKLSAgICBNb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpTZXRNb2NrSW5zdGFuY2VGb3JUZXN0aW5nKAotICAgICAgICAmbW9ja19zdGF0ZV9tYWNoaW5lXyk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgR2V0KCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigmbW9ja19jc2lzX2NsaWVudF9tb2R1bGVfKSk7Ci0KLSAgICAvLyBTdG9yZSBncm91cCBjYWxsYmFja3Mgc28gdGhhdCB3ZSBjb3VsZCBpbmplY3QgZ3JvdXBpbmcgZXZlbnRzCi0gICAgZ3JvdXBfY2FsbGJhY2tzXyA9IG51bGxwdHI7Ci0gICAgT05fQ0FMTChtb2NrX2dyb3Vwc19tb2R1bGVfLCBJbml0aWFsaXplKF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChTYXZlQXJnPDA+KCZncm91cF9jYWxsYmFja3NfKSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfZ3JvdXBzX21vZHVsZV8sIEdldEdyb3VwSWQoXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBibHVldG9vdGg6OlV1aWQgdXVpZCkgewotICAgICAgICAgIGlmIChncm91cHMuZmluZChhZGRyKSAhPSBncm91cHMuZW5kKCkpIHJldHVybiBncm91cHMuYXQoYWRkcik7Ci0gICAgICAgICAgcmV0dXJuIGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duOwotICAgICAgICB9KTsKLQotICAgIE9OX0NBTEwobW9ja19ncm91cHNfbW9kdWxlXywgUmVtb3ZlRGV2aWNlKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpc10oY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgaW50IGdyb3VwX2lkXykgewotICAgICAgICAgIGludCBncm91cF9pZCA9IC0xOwotICAgICAgICAgIGlmIChncm91cHMuZmluZChhZGRyKSAhPSBncm91cHMuZW5kKCkpIHsKLSAgICAgICAgICAgIGdyb3VwX2lkID0gZ3JvdXBzW2FkZHJdOwotICAgICAgICAgICAgZ3JvdXBzLmVyYXNlKGFkZHIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZ3JvdXBfaWQgPCAwKSByZXR1cm47Ci0KLSAgICAgICAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHNDYWxsYmFja3MqCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfY2FsbGJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2NhbGxiYWNrcy0+T25Hcm91cE1lbWJlclJlbW92ZWQoYWRkcmVzcywgZ3JvdXBfaWQpOwotICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgIGFkZHIsIGdyb3VwX2lkLCBiYXNlOjpVbnJldGFpbmVkKGdyb3VwX2NhbGxiYWNrc18pKSk7Ci0gICAgICAgIH0pOwotCi0gICAgLy8gT3VyIHRlc3QgZGV2aWNlcyBoYXZlIHVuaXF1ZSBMU0IgLSB1c2UgaXQgZm9yIHVuaXF1ZSBncm91cGluZyB3aGVuCi0gICAgLy8gZGV2aWNlcyBhZGRlZCB3aXRoIGEgbm9uLUNJUyBjb250ZXh0IGFuZCBubyBncm91cGluZyBpbmZvCi0gICAgT05fQ0FMTChtb2NrX2dyb3Vwc19tb2R1bGVfLAotICAgICAgICAgICAgQWRkRGV2aWNlKF8sIGxlX2F1ZGlvOjp1dWlkOjprQ2FwU2VydmljZVV1aWQsIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIFt0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6VXVpZCB1dWlkID0gbGVfYXVkaW86OnV1aWQ6OmtDYXBTZXJ2aWNlVXVpZCwKLSAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bikgLT4gaW50IHsKLSAgICAgICAgICAgICAgaWYgKGdyb3VwX2lkID09IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKSB7Ci0gICAgICAgICAgICAgICAgLyogR2VuZXJhdGUgZ3JvdXAgaWQgZnJvbSBhZGRyZXNzICovCi0gICAgICAgICAgICAgICAgZ3JvdXBzW2FkZHJdID0gYWRkci5hZGRyZXNzW1Jhd0FkZHJlc3M6OmtMZW5ndGggLSAxXTsKLSAgICAgICAgICAgICAgICBncm91cF9pZCA9IGdyb3Vwc1thZGRyXTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBncm91cHNbYWRkcl0gPSBncm91cF9pZDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIEluamVjdEdyb3VwRGV2aWNlQWRkZWQoYWRkciwgZ3JvdXBzW2FkZHJdKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGFkZHIuYWRkcmVzc1tSYXdBZGRyZXNzOjprTGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICB9KTsKLQotICAgIE9OX0NBTEwobW9ja19zdGF0ZV9tYWNoaW5lXywgSW5pdGlhbGl6ZShfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoU2F2ZUFyZzwwPigmc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfKSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sIFN0YXJ0U3RyZWFtKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpc10oTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gICAgICAgICAgaWYgKGdyb3VwLT5HZXRTdGF0ZSgpID09Ci0gICAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpIHsKLSAgICAgICAgICAgIGlmIChncm91cC0+R2V0Q29udGV4dFR5cGUoKSAhPSBjb250ZXh0X3R5cGUpIHsKLSAgICAgICAgICAgICAgLyogVE9ETzogU3dpdGNoIGNvbnRleHQgb2YgZ3JvdXAgKi8KLSAgICAgICAgICAgICAgZ3JvdXAtPlNldENvbnRleHRUeXBlKGNvbnRleHRfdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBncm91cC0+Q29uZmlndXJlKGNvbnRleHRfdHlwZSk7Ci0KLSAgICAgICAgICAvLyBGYWtlIEFTRSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgZm9yIChMZUF1ZGlvRGV2aWNlKiBkZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgICAgICAgICAgICAgIGRldmljZSAhPSBudWxscHRyOyBkZXZpY2UgPSBncm91cC0+R2V0TmV4dERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICAgICAgICAgICAgaWYgKCFhc2UuYWN0aXZlKSBjb250aW51ZTsKLQotICAgICAgICAgICAgICAvLyBBbmQgYWxzbyBza2lwIHRoZSBhc2UgZXN0YWJsaXNobWVudCBwcm9jZWR1cmUgd2hpY2ggc2hvdWxkCi0gICAgICAgICAgICAgIC8vIGJlIHRlc3RlZCBhcyBwYXJ0IG9mIHRoZSBzdGF0ZSBtYWNoaW5lIHVuaXQgdGVzdHMKLSAgICAgICAgICAgICAgYXNlLmRhdGFfcGF0aF9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICB0eXBlczo6QXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpEQVRBX1BBVEhfRVNUQUJMSVNIRUQ7Ci0gICAgICAgICAgICAgIGFzZS5jaXNfY29ubl9oZGwgPSBpc29fY29uX2NvdW50ZXJfKys7Ci0gICAgICAgICAgICAgIGFzZS5hY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgICBhc2Uuc3RhdGUgPSB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIEluamVjdCB0aGUgc3RhdGUKLSAgICAgICAgICBncm91cC0+U2V0VGFyZ2V0U3RhdGUoCi0gICAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotICAgICAgICAgIGdyb3VwLT5TZXRTdGF0ZShncm91cC0+R2V0VGFyZ2V0U3RhdGUoKSk7Ci0gICAgICAgICAgc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfLT5TdGF0dXNSZXBvcnRDYigKLSAgICAgICAgICAgICAgZ3JvdXAtPmdyb3VwX2lkXywgR3JvdXBTdHJlYW1TdGF0dXM6OlNUUkVBTUlORyk7Ci0gICAgICAgICAgc3RyZWFtaW5nX2dyb3Vwc1tncm91cC0+Z3JvdXBfaWRfXSA9IGdyb3VwOwotCi0gICAgICAgICAgLyogQXNzdW1lIENJRyBpcyBjcmVhdGVkICovCi0gICAgICAgICAgZ3JvdXAtPmNpZ19jcmVhdGVkXyA9IHRydWU7Ci0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sIFN1c3BlbmRTdHJlYW0oXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgICAgICAgLy8gRmFrZSBBU0Ugc3RhdGUKLSAgICAgICAgICBmb3IgKExlQXVkaW9EZXZpY2UqIGRldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICAgICAgICAgICAgICAgZGV2aWNlICE9IG51bGxwdHI7IGRldmljZSA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgYXNlIDogZGV2aWNlLT5hc2VzXykgewotICAgICAgICAgICAgICBhc2UuZGF0YV9wYXRoX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgIHR5cGVzOjpBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19FU1RBQkxJU0hFRDsKLSAgICAgICAgICAgICAgYXNlLmFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICBhc2Uuc3RhdGUgPQotICAgICAgICAgICAgICAgICAgdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIEluamVjdCB0aGUgc3RhdGUKLSAgICAgICAgICBncm91cC0+U2V0VGFyZ2V0U3RhdGUoCi0gICAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCk7Ci0gICAgICAgICAgZ3JvdXAtPlNldFN0YXRlKGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpKTsKLSAgICAgICAgICBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18tPlN0YXR1c1JlcG9ydENiKAotICAgICAgICAgICAgICBncm91cC0+Z3JvdXBfaWRfLCBHcm91cFN0cmVhbVN0YXR1czo6U1VTUEVOREVEKTsKLSAgICAgICAgfSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sIFByb2Nlc3NIY2lOb3RpZkFjbERpc2Nvbm5lY3RlZChfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoW3RoaXNdKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICAgICAgaWYgKCFncm91cCkgcmV0dXJuOwotICAgICAgICAgIGF1dG8qIHN0cmVhbV9jb25mID0gJmdyb3VwLT5zdHJlYW1fY29uZjsKLSAgICAgICAgICBpZiAoc3RyZWFtX2NvbmYtPnZhbGlkKSB7Ci0gICAgICAgICAgICBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zLmVyYXNlKAotICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZUF1ZGlvRGV2aWNlXShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGFzZXMgPSBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXIuZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzZXMuc2luazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgICAgICBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zLmVuZCgpKTsKLQotICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVyYXNlKAotICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHN0cmVhbV9jb25mLT5zb3VyY2Vfc3RyZWFtcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zb3VyY2Vfc3RyZWFtcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGVBdWRpb0RldmljZV0oYXV0byYgcGFpcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBhc2VzID0gbGVBdWRpb0RldmljZS0+R2V0QXNlc0J5Q2lzQ29ubkhkbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyLmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc2VzLnNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgICAgICBzdHJlYW1fY29uZi0+c291cmNlX3N0cmVhbXMuZW5kKCkpOwotCi0gICAgICAgICAgICBpZiAoc3RyZWFtX2NvbmYtPnNpbmtfc3RyZWFtcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHN0cmVhbSBzdG9wcGVkICI7Ci0gICAgICAgICAgICAgIHN0cmVhbV9jb25mLT52YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChncm91cC0+SXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBncm91cC0+Y2lnX2NyZWF0ZWRfID0gZmFsc2U7Ci0gICAgICAgICAgICBJbmplY3RDaWdSZW1vdmVkKGdyb3VwLT5ncm91cF9pZF8pOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sIFByb2Nlc3NIY2lOb3RpZkNpc0Rpc2Nvbm5lY3RlZChfLCBfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBbXShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLAotICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZGlzY29ubmVjdGVkX2V2dCogZXZlbnQpIHsKLSAgICAgICAgICAgICAgaWYgKCFncm91cCkgcmV0dXJuOwotICAgICAgICAgICAgICBhdXRvIGFzZXNfcGFpciA9Ci0gICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKGV2ZW50LT5jaXNfY29ubl9oZGwpOwotICAgICAgICAgICAgICBpZiAoYXNlc19wYWlyLnNpbmspIHsKLSAgICAgICAgICAgICAgICBhc2VzX3BhaXIuc2luay0+ZGF0YV9wYXRoX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgdHlwZXM6OkF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0FTU0lHTkVEOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChhc2VzX3BhaXIuc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgYXNlc19wYWlyLnNvdXJjZS0+ZGF0YV9wYXRoX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgdHlwZXM6OkF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0FTU0lHTkVEOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8qIEludmFsaWRhdGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaWYgbmVlZGVkICovCi0gICAgICAgICAgICAgIGF1dG8qIHN0cmVhbV9jb25mID0gJmdyb3VwLT5zdHJlYW1fY29uZjsKLSAgICAgICAgICAgICAgaWYgKHN0cmVhbV9jb25mLT52YWxpZCkgewotICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZXJhc2UoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNpbmtfc3RyZWFtcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNpbmtfc3RyZWFtcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtsZUF1ZGlvRGV2aWNlXShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gYXNlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKHBhaXIuZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc2luayBhc2UgdG8gZGVsZXRlLiBDaXMgaGFuZGxlOiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGludCkocGFpci5maXJzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYXNlIHBvaW50ZXI6ICIgPDwgYXNlcy5zaW5rOwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNlcy5zaW5rOwotICAgICAgICAgICAgICAgICAgICAgICAgfSksCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW5kKCkpOwotCi0gICAgICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVyYXNlKAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZV9pZigKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zb3VyY2Vfc3RyZWFtcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgW2xlQXVkaW9EZXZpY2VdKGF1dG8mIHBhaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBhc2VzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPkdldEFzZXNCeUNpc0Nvbm5IZGwocGFpci5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgX19mdW5jX18gPDwgIiBzb3VyY2UgdG8gZGVsZXRlLiBDaXMgaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoaW50KShwYWlyLmZpcnN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhc2UgcG9pbnRlcjogICIgPDwgYXNlcy5zb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc2VzLnNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZi0+c291cmNlX3N0cmVhbXMuZW5kKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc3RyZWFtIHN0b3BwZWQgIjsKLSAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT52YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sIFN0b3BTdHJlYW0oXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgICAgICAgZm9yIChMZUF1ZGlvRGV2aWNlKiBkZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgICAgICAgICAgICAgIGRldmljZSAhPSBudWxscHRyOyBkZXZpY2UgPSBncm91cC0+R2V0TmV4dERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICAgICAgICAgICAgYXNlLmRhdGFfcGF0aF9zdGF0ZSA9IHR5cGVzOjpBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OklETEU7Ci0gICAgICAgICAgICAgIGFzZS5hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYXNlLnN0YXRlID0gdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEU7Ci0gICAgICAgICAgICAgIGFzZS5jaXNfY29ubl9oZGwgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIEluamVjdCB0aGUgc3RhdGUKLSAgICAgICAgICBncm91cC0+U2V0VGFyZ2V0U3RhdGUodHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpOwotICAgICAgICAgIGdyb3VwLT5TZXRTdGF0ZShncm91cC0+R2V0VGFyZ2V0U3RhdGUoKSk7Ci0gICAgICAgICAgc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfLT5TdGF0dXNSZXBvcnRDYihncm91cC0+Z3JvdXBfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBTdHJlYW1TdGF0dXM6OklETEUpOwotICAgICAgICB9KTsKLSAgfQotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgaW5pdF9tZXNzYWdlX2xvb3BfdGhyZWFkKCk7Ci0KLSAgICBPTl9DQUxMKGNvbnRyb2xsZXJfaW50ZXJmYWNlXywgU3VwcG9ydHNCbGVDb25uZWN0ZWRJc29jaHJvbm91c1N0cmVhbUNlbnRyYWwpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7Ci0gICAgT05fQ0FMTChjb250cm9sbGVyX2ludGVyZmFjZV8sCi0gICAgICAgICAgICBTdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtUGVyaXBoZXJhbCkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAgIGNvbnRyb2xsZXI6OlNldE1vY2tDb250cm9sbGVySW50ZXJmYWNlKCZjb250cm9sbGVyX2ludGVyZmFjZV8pOwotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja0J0bUludGVyZmFjZSgmbW9ja19idG1faW50ZXJmYWNlXyk7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRJbnRlcmZhY2UoJm1vY2tfZ2F0dF9pbnRlcmZhY2VfKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dFF1ZXVlKCZtb2NrX2dhdHRfcXVldWVfKTsKLSAgICBibHVldG9vdGg6OnN0b3JhZ2U6OlNldE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSgmbW9ja19idGlmX3N0b3JhZ2VfKTsKLQotICAgIGlzb19tYW5hZ2VyXyA9IGJsdWV0b290aDo6aGNpOjpJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICAgIEFTU0VSVF9ORShpc29fbWFuYWdlcl8sIG51bGxwdHIpOwotICAgIGlzb19tYW5hZ2VyXy0+U3RhcnQoKTsKLQotICAgIG1vY2tfaXNvX21hbmFnZXJfID0gTW9ja0lzb01hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gICAgT05fQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlZ2lzdGVyQ2lnQ2FsbGJhY2tzKF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChTYXZlQXJnPDA+KCZjaWdfY2FsbGJhY2tzXykpOwotCi0gICAgU2V0VXBNb2NrQXVkaW9IYWwoKTsKLSAgICBTZXRVcE1vY2tHcm91cHMoKTsKLSAgICBTZXRVcE1vY2tHYXR0KCk7Ci0KLSAgICBBU1NFUlRfRkFMU0UoTGVBdWRpb0NsaWVudDo6SXNMZUF1ZGlvQ2xpZW50UnVubmluZygpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgLy8gTWVzc2FnZSBsb29wIGNsZWFudXAgc2hvdWxkIHdhaXQgZm9yIGFsbCB0aGUgJ3RpbGwgbm93JyBzY2hlZHVsZWQgY2FsbHMKLSAgICAvLyBzbyBpdCBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGF0IHRoZSB2ZXJ5IGJlZ2dpbm5pbmcgb2YgdGVhcmRvd24uCi0gICAgY2xlYW51cF9tZXNzYWdlX2xvb3BfdGhyZWFkKCk7Ci0KLSAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIHNpbmNlIFN0b3AoKSBhbmQgQ2xlYW51cCgpIG1heSB0cmlnZ2VyIHNvbWUgY2FsbGJhY2tzIG9yCi0gICAgLy8gZHJvcCB1bmlxdWUgcG9pbnRlcnMgdG8gbW9ja3Mgd2UgaGF2ZSByYXcgcG9pbnRlciBmb3IgYW5kIHdlIHdhbnQgdG8KLSAgICAvLyB2ZXJpZnkgdGhlbSBhbGwuCi0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotCi0gICAgaWYgKExlQXVkaW9DbGllbnQ6OklzTGVBdWRpb0NsaWVudFJ1bm5pbmcoKSkgewotICAgICAgRVhQRUNUX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIEFwcERlcmVnaXN0ZXIoZ2F0dF9pZikpLlRpbWVzKDEpOwotICAgICAgTGVBdWRpb0NsaWVudDo6Q2xlYW51cCgpOwotICAgICAgQVNTRVJUX0ZBTFNFKExlQXVkaW9DbGllbnQ6OklzTGVBdWRpb0NsaWVudFJ1bm5pbmcoKSk7Ci0gICAgfQotCi0gICAgaXNvX21hbmFnZXJfLT5TdG9wKCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgY2xhc3MgTW9ja0RldmljZVdyYXBwZXIgewotICAgIGNsYXNzIElHYXR0SGFuZGxlcnMgewotICAgICBwdWJsaWM6Ci0gICAgICAvLyBJR2F0dEhhbmRsZXJzKCkgPSBkZWZhdWx0OwotICAgICAgdmlydHVhbCB+SUdhdHRIYW5kbGVycygpID0gZGVmYXVsdDsKLSAgICAgIHZpcnR1YWwgdm9pZCBPblJlYWRDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBoYW5kbGUsIEdBVFRfUkVBRF9PUF9DQiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSA9IDA7Ci0gICAgICB2aXJ0dWFsIHZvaWQgT25Xcml0ZUNoYXJhY3RlcmlzdGljKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2JfZGF0YSkgPSAwOwotICAgIH07Ci0KLSAgIHB1YmxpYzoKLSAgICBzdHJ1Y3QgY3Npc19tb2NrIDogcHVibGljIElHYXR0SGFuZGxlcnMgewotICAgICAgdWludDE2X3Qgc3RhcnQgPSAwOwotICAgICAgdWludDE2X3QgZW5kID0gMDsKLSAgICAgIHVpbnQxNl90IHNpcmtfY2hhciA9IDA7Ci0gICAgICB1aW50MTZfdCBzaXJrX2NjYyA9IDA7Ci0gICAgICB1aW50MTZfdCBzaXplX2NoYXIgPSAwOwotICAgICAgdWludDE2X3Qgc2l6ZV9jY2MgPSAwOwotICAgICAgdWludDE2X3QgbG9ja19jaGFyID0gMDsKLSAgICAgIHVpbnQxNl90IGxvY2tfY2NjID0gMDsKLSAgICAgIHVpbnQxNl90IHJhbmtfY2hhciA9IDA7Ci0KLSAgICAgIGludCByYW5rID0gMDsKLSAgICAgIGludCBzaXplID0gMDsKLQotICAgICAgTU9DS19NRVRIT0QoKHZvaWQpLCBPblJlYWRDaGFyYWN0ZXJpc3RpYywKLSAgICAgICAgICAgICAgICAgICh1aW50MTZfdCBoYW5kbGUsIEdBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSksCi0gICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgICAgIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25Xcml0ZUNoYXJhY3RlcmlzdGljLAotICAgICAgICAgICAgICAgICAgKHVpbnQxNl90IGhhbmRsZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLCBHQVRUX1dSSVRFX09QX0NCIGNiLAotICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpLAotICAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBjYXNfbW9jayA6IHB1YmxpYyBJR2F0dEhhbmRsZXJzIHsKLSAgICAgIHVpbnQxNl90IHN0YXJ0ID0gMDsKLSAgICAgIHVpbnQxNl90IGVuZCA9IDA7Ci0gICAgICB1aW50MTZfdCBjc2lzX2luY2x1ZGUgPSAwOwotCi0gICAgICBNT0NLX01FVEhPRCgodm9pZCksIE9uUmVhZENoYXJhY3RlcmlzdGljLAotICAgICAgICAgICAgICAgICAgKHVpbnQxNl90IGhhbmRsZSwgR0FUVF9SRUFEX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSwKLSAgICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICAgICAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbldyaXRlQ2hhcmFjdGVyaXN0aWMsCi0gICAgICAgICAgICAgICAgICAodWludDE2X3QgaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsIEdBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogY2JfZGF0YSksCi0gICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgICB9OwotCi0gICAgc3RydWN0IHBhY3NfbW9jayA6IHB1YmxpYyBJR2F0dEhhbmRsZXJzIHsKLSAgICAgIHVpbnQxNl90IHN0YXJ0ID0gMDsKLSAgICAgIHVpbnQxNl90IHNpbmtfcGFjX2NoYXIgPSAwOwotICAgICAgdWludDE2X3Qgc2lua19wYWNfY2NjID0gMDsKLSAgICAgIHVpbnQxNl90IHNpbmtfYXVkaW9fbG9jX2NoYXIgPSAwOwotICAgICAgdWludDE2X3Qgc2lua19hdWRpb19sb2NfY2NjID0gMDsKLSAgICAgIHVpbnQxNl90IHNvdXJjZV9wYWNfY2hhciA9IDA7Ci0gICAgICB1aW50MTZfdCBzb3VyY2VfcGFjX2NjYyA9IDA7Ci0gICAgICB1aW50MTZfdCBzb3VyY2VfYXVkaW9fbG9jX2NoYXIgPSAwOwotICAgICAgdWludDE2X3Qgc291cmNlX2F1ZGlvX2xvY19jY2MgPSAwOwotICAgICAgdWludDE2X3QgYXZhaWxfY29udGV4dHNfY2hhciA9IDA7Ci0gICAgICB1aW50MTZfdCBhdmFpbF9jb250ZXh0c19jY2MgPSAwOwotICAgICAgdWludDE2X3Qgc3VwcF9jb250ZXh0c19jaGFyID0gMDsKLSAgICAgIHVpbnQxNl90IHN1cHBfY29udGV4dHNfY2NjID0gMDsKLSAgICAgIHVpbnQxNl90IGVuZCA9IDA7Ci0KLSAgICAgIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25SZWFkQ2hhcmFjdGVyaXN0aWMsCi0gICAgICAgICAgICAgICAgICAodWludDE2X3QgaGFuZGxlLCBHQVRUX1JFQURfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpLAotICAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gICAgICBNT0NLX01FVEhPRCgodm9pZCksIE9uV3JpdGVDaGFyYWN0ZXJpc3RpYywKLSAgICAgICAgICAgICAgICAgICh1aW50MTZfdCBoYW5kbGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwgR0FUVF9XUklURV9PUF9DQiBjYiwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSwKLSAgICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgYXNjc19tb2NrIDogcHVibGljIElHYXR0SGFuZGxlcnMgewotICAgICAgdWludDE2X3Qgc3RhcnQgPSAwOwotICAgICAgdWludDE2X3Qgc2lua19hc2VfY2hhciA9IDA7Ci0gICAgICB1aW50MTZfdCBzaW5rX2FzZV9jY2MgPSAwOwotICAgICAgdWludDE2X3Qgc291cmNlX2FzZV9jaGFyID0gMDsKLSAgICAgIHVpbnQxNl90IHNvdXJjZV9hc2VfY2NjID0gMDsKLSAgICAgIHVpbnQxNl90IGN0cF9jaGFyID0gMDsKLSAgICAgIHVpbnQxNl90IGN0cF9jY2MgPSAwOwotICAgICAgdWludDE2X3QgZW5kID0gMDsKLQotICAgICAgTU9DS19NRVRIT0QoKHZvaWQpLCBPblJlYWRDaGFyYWN0ZXJpc3RpYywKLSAgICAgICAgICAgICAgICAgICh1aW50MTZfdCBoYW5kbGUsIEdBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSksCi0gICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgICAgIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25Xcml0ZUNoYXJhY3RlcmlzdGljLAotICAgICAgICAgICAgICAgICAgKHVpbnQxNl90IGhhbmRsZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLCBHQVRUX1dSSVRFX09QX0NCIGNiLAotICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpLAotICAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gICAgfTsKLQotICAgIE1vY2tEZXZpY2VXcmFwcGVyKFJhd0FkZHJlc3MgYWRkciwgY29uc3Qgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+JiBzZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0RldmljZVdyYXBwZXI6OmNzaXNfbW9jaz4gY3NpcywKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0RldmljZVdyYXBwZXI6OmNhc19tb2NrPiBjYXMsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1vY2tEZXZpY2VXcmFwcGVyOjphc2NzX21vY2s+IGFzY3MsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1vY2tEZXZpY2VXcmFwcGVyOjpwYWNzX21vY2s+IHBhY3MpCi0gICAgICAgIDogYWRkcihhZGRyKSB7Ci0gICAgICB0aGlzLT5zZXJ2aWNlcyA9IHNlcnZpY2VzOwotICAgICAgdGhpcy0+Y3NpcyA9IHN0ZDo6bW92ZShjc2lzKTsKLSAgICAgIHRoaXMtPmNhcyA9IHN0ZDo6bW92ZShjYXMpOwotICAgICAgdGhpcy0+YXNjcyA9IHN0ZDo6bW92ZShhc2NzKTsKLSAgICAgIHRoaXMtPnBhY3MgPSBzdGQ6Om1vdmUocGFjcyk7Ci0gICAgfQotCi0gICAgfk1vY2tEZXZpY2VXcmFwcGVyKCkgewotICAgICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoY3Npcy5nZXQoKSk7Ci0gICAgICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhjYXMuZ2V0KCkpOwotICAgICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoYXNjcy5nZXQoKSk7Ci0gICAgICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhwYWNzLmdldCgpKTsKLSAgICB9Ci0KLSAgICBSYXdBZGRyZXNzIGFkZHI7Ci0gICAgYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKLQotICAgIC8vIEEgbGlzdCBvZiBzZXJ2aWNlcyBhbmQgdGhlaXIgdXNlZnVsIHBhcmFtcwotICAgIHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiBzZXJ2aWNlczsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y3Npc19tb2NrPiBjc2lzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjYXNfbW9jaz4gY2FzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxhc2NzX21vY2s+IGFzY3M7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHBhY3NfbW9jaz4gcGFjczsKLSAgfTsKLQotICB2b2lkIFN5bmNPbk1haW5Mb29wKCkgewotICAgIC8vIFdhaXQgZm9yIHRoZSBtYWluIGxvb3AgdG8gZmx1c2gKLSAgICAvLyBXQVJOSU5HOiBOb3QgdGVzdGVkIHdpdGggVGltZXJzIHB1c2hpbmcgcGVyaW9kaWMgdGFza3MgdG8gdGhlIG1haW4gbG9vcAotICAgIHdoaWxlIChudW1fYXN5bmNfdGFza3MgPiAwKQotICAgICAgOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0TGVBdWRpbyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBib29sIGlzRW5jcnlwdGVkID0gdHJ1ZSkgewotICAgIC8vIGJ5IGRlZmF1bHQgaW5kaWNhdGUgbGluayBhcyBlbmNyeXB0ZWQKLSAgICBPTl9DQUxMKG1vY2tfYnRtX2ludGVyZmFjZV8sIEJUTV9Jc0VuY3J5cHRlZChhZGRyZXNzLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKGlzRW5jcnlwdGVkKSkpOwotCi0gICAgRVhQRUNUX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIE9wZW4oZ2F0dF9pZiwgYWRkcmVzcywgdHJ1ZSwgXykpLlRpbWVzKDEpOwotCi0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmTGVBdWRpb0NsaWVudDo6Q29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoTGVBdWRpb0NsaWVudDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0KLSAgICBTeW5jT25NYWluTG9vcCgpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0TGVBdWRpbyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgU3luY09uTWFpbkxvb3AoKTsKLSAgICBFWFBFQ1RfQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgQ2xvc2UoY29ubl9pZCkpLlRpbWVzKDEpOwotICAgIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIGFkZHJlc3MpKQotICAgICAgICAuVGltZXMoMSk7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmTGVBdWRpb0NsaWVudDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoTGVBdWRpb0NsaWVudDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIENvbm5lY3RDc2lzRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2lua19hdWRpb19hbGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvdXJjZV9hdWRpb19hbGxvY2F0aW9uLCB1aW50OF90IGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX2lkLCB1aW50OF90IHJhbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25uZWN0X3Rocm91Z2hfY3NpcyA9IGZhbHNlKSB7Ci0gICAgU2V0U2FtcGxlRGF0YWJhc2VFYXJidWRzVmFsaWQoY29ubl9pZCwgYWRkciwgc2lua19hdWRpb19hbGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hdWRpb19hbGxvY2F0aW9uLCB0cnVlLCAvKmFkZF9jc2lzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfY2FzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfcGFjcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2FzY3MqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX3NpemUsIHJhbmspOwotICAgIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQsIGFkZHIpKQotICAgICAgICAuVGltZXMoMSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICAgIE9uR3JvdXBOb2RlU3RhdHVzKGFkZHIsIGdyb3VwX2lkLCBHcm91cE5vZGVTdGF0dXM6OkFEREVEKSkKLSAgICAgICAgLlRpbWVzKDEpOwotCi0gICAgaWYgKGNvbm5lY3RfdGhyb3VnaF9jc2lzKSB7Ci0gICAgICAvLyBBZGQgaXQgdGhlIHdheSBDU0lTIHdvdWxkIGRvOiBhZGQgdG8gZ3JvdXAgYW5kIHRoZW4gY29ubmVjdAotICAgICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkxlQXVkaW9DbGllbnQ6Okdyb3VwQWRkTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoTGVBdWRpb0NsaWVudDo6R2V0KCkpLCBncm91cF9pZCwgYWRkcikpOwotICAgICAgQ29ubmVjdExlQXVkaW8oYWRkcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSB1c3VhbCBjb25uZWN0Ci0gICAgICAvLyBTaW5jZSBkZXZpY2UgaGFzIENTSVMsIGxldHMgYWRkIGl0IGhlcmUgdG8gZ3JvdXBzIGFscmVhZHkgbm93Ci0gICAgICBncm91cHNbYWRkcl0gPSBncm91cF9pZDsKLSAgICAgIENvbm5lY3RMZUF1ZGlvKGFkZHIpOwotICAgICAgSW5qZWN0R3JvdXBEZXZpY2VBZGRlZChhZGRyLCBncm91cF9pZCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb25uZWN0Tm9uQ3Npc0RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfYXVkaW9fYWxsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzb3VyY2VfYXVkaW9fYWxsb2NhdGlvbikgewotICAgIFNldFNhbXBsZURhdGFiYXNlRWFyYnVkc1ZhbGlkKGNvbm5faWQsIGFkZHIsIHNpbmtfYXVkaW9fYWxsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYXVkaW9fYWxsb2NhdGlvbiwgZmFsc2UsIC8qYWRkX2NzaXMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfY2FzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX3BhY3MqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfYXNjcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7Ci0gICAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwgYWRkcikpCi0gICAgICAgIC5UaW1lcygxKTsKLQotICAgIENvbm5lY3RMZUF1ZGlvKGFkZHIpOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVNZXRhZGF0YShhdWRpb191c2FnZV90IHVzYWdlLCBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50X3R5cGUpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gZG9fbWV0YWRhdGFfdXBkYXRlX3Byb21pc2U7Ci0KLSAgICBzdHJ1Y3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEgdHJhY2tzX1syXSA9IHsKLSAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCAwfSwKLSAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCAwfX07Ci0KLSAgICBzb3VyY2VfbWV0YWRhdGFfdCBzb3VyY2VfbWV0YWRhdGEgPSB7LnRyYWNrX2NvdW50ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYWNrcyA9ICZ0cmFja3NfWzBdfTsKLQotICAgIHRyYWNrc19bMF0udXNhZ2UgPSB1c2FnZTsKLSAgICB0cmFja3NfWzBdLmNvbnRlbnRfdHlwZSA9IGNvbnRlbnRfdHlwZTsKLQotICAgIGF1dG8gZG9fbWV0YWRhdGFfdXBkYXRlX2Z1dHVyZSA9IGRvX21ldGFkYXRhX3VwZGF0ZV9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICBhdWRpb19zaW5rX3JlY2VpdmVyXy0+T25BdWRpb01ldGFkYXRhVXBkYXRlKAotICAgICAgICBzdGQ6Om1vdmUoZG9fbWV0YWRhdGFfdXBkYXRlX3Byb21pc2UpLCBzb3VyY2VfbWV0YWRhdGEpOwotICAgIGRvX21ldGFkYXRhX3VwZGF0ZV9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBTdGFydFN0cmVhbWluZyhhdWRpb191c2FnZV90IHVzYWdlLCBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX2lkLCBib29sIHJlY29uZmlndXJlZF9zaW5rID0gZmFsc2UpIHsKLSAgICBBU1NFUlRfTkUoYXVkaW9fc2lua19yZWNlaXZlcl8sIG51bGxwdHIpOwotCi0gICAgVXBkYXRlTWV0YWRhdGEodXNhZ2UsIGNvbnRlbnRfdHlwZSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIENvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0KCkpLlRpbWVzKDEpOwotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBkb19yZXN1bWVfc2lua19wcm9taXNlOwotICAgIGF1dG8gZG9fcmVzdW1lX3NpbmtfZnV0dXJlID0gZG9fcmVzdW1lX3NpbmtfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgLyogSXQncyBlbm91Z2ggdG8gY2FsbCBvbmx5IG9uZSBzdXNwZW5kIGV2ZW4gaWYgaXQnbGwgYmUgYmktZGlyZWN0aW9uYWwKLSAgICAgKiBzdHJlYW1pbmcuIEZpcnN0IHJlc3VtZSB3aWxsIHRyaWdnZXIgR3JvdXBTdHJlYW0uCi0gICAgICoKLSAgICAgKiBUaGVyZSBpcyBubyAtICdvbmx5IHNvdXJjZSByZWNlaXZlcicgc2NlbmFyaW8gKGUuZy4gc2luZ2xlIG1pY3JvcGhvbmUpLgotICAgICAqIElmIHRoZXJlIHdpbGwgYmUgc3VjaCB0ZXN0IG9yaWVudGVkIHNjZW5hcmlvLCBzdWNoIHJlc3VtZSBjaG9vc2UgbG9naWMKLSAgICAgKiBzaG91bGQgYmUgYXBwbGllZC4KLSAgICAgKi8KLSAgICBhdWRpb19zaW5rX3JlY2VpdmVyXy0+T25BdWRpb1Jlc3VtZShzdGQ6Om1vdmUoZG9fcmVzdW1lX3NpbmtfcHJvbWlzZSkpOwotICAgIGRvX3Jlc3VtZV9zaW5rX2Z1dHVyZS53YWl0KCk7Ci0gICAgU3luY09uTWFpbkxvb3AoKTsKLQotICAgIGlmIChyZWNvbmZpZ3VyZWRfc2luaykgewotICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3Jlc3VtZV9zaW5rX3JlY29uZl9wcm9taXNlOwotICAgICAgYXV0byBkb19yZXN1bWVfc2lua19yZWNvbmZfZnV0dXJlID0KLSAgICAgICAgICBkb19yZXN1bWVfc2lua19yZWNvbmZfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0KLSAgICAgIGF1ZGlvX3NpbmtfcmVjZWl2ZXJfLT5PbkF1ZGlvUmVzdW1lKAotICAgICAgICAgIHN0ZDo6bW92ZShkb19yZXN1bWVfc2lua19yZWNvbmZfcHJvbWlzZSkpOwotICAgICAgZG9fcmVzdW1lX3NpbmtfcmVjb25mX2Z1dHVyZS53YWl0KCk7Ci0gICAgfQotCi0gICAgaWYgKHVzYWdlID09IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04pIHsKLSAgICAgIEFTU0VSVF9ORShhdWRpb19zb3VyY2VfcmVjZWl2ZXJfLCBudWxscHRyKTsKLQotICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3Jlc3VtZV9zb3VyY2VfcHJvbWlzZTsKLSAgICAgIGF1dG8gZG9fcmVzdW1lX3NvdXJjZV9mdXR1cmUgPSBkb19yZXN1bWVfc291cmNlX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgICAgYXVkaW9fc291cmNlX3JlY2VpdmVyXy0+T25BdWRpb1Jlc3VtZSgKLSAgICAgICAgICBzdGQ6Om1vdmUoZG9fcmVzdW1lX3NvdXJjZV9wcm9taXNlKSk7Ci0gICAgICBkb19yZXN1bWVfc291cmNlX2Z1dHVyZS53YWl0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTdG9wU3RyZWFtaW5nKGludCBncm91cF9pZCwgYm9vbCBzdXNwZW5kX3NvdXJjZSA9IGZhbHNlKSB7Ci0gICAgQVNTRVJUX05FKGF1ZGlvX3NpbmtfcmVjZWl2ZXJfLCBudWxscHRyKTsKLQotICAgIC8qIFRPRE8gV2Ugc2hvdWxkIGhhdmUgYSB3YXkgdG8gY29uZmlybSBTdG9wKCkgb3RoZXJ3aXNlLCBhdWRpbyBmcmFtZXdvcmsKLSAgICAgKiBtaWdodCBoYXZlIGRpZmZlcmVudCBzdGF0ZSB0aGF0IGl0IGlzIGluIHRoZSBsZV9hdWRpbyBjb2RlIC0gYXMgdGVhcmluZwotICAgICAqIGRvd24gQ0lTZXMgbWlnaHQgdGFrZSBzb21lIHRpbWUKLSAgICAgKi8KLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gZG9fc3VzcGVuZF9zaW5rX3Byb21pc2U7Ci0gICAgYXV0byBkb19zdXNwZW5kX3NpbmtfZnV0dXJlID0gZG9fc3VzcGVuZF9zaW5rX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIC8qIEl0J3MgZW5vdWdoIHRvIGNhbGwgb25seSBvbmUgcmVzdW1lIGV2ZW4gaWYgaXQnbGwgYmUgYmktZGlyZWN0aW9uYWwKLSAgICAgKiBzdHJlYW1pbmcuIEZpcnN0IHN1c3BlbmQgd2lsbCB0cmlnZ2VyIEdyb3VwU3RvcC4KLSAgICAgKgotICAgICAqIFRoZXJlIGlzIG5vIC0gJ29ubHkgc291cmNlIHJlY2VpdmVyJyBzY2VuYXJpbyAoZS5nLiBzaW5nbGUgbWljcm9waG9uZSkuCi0gICAgICogSWYgdGhlcmUgd2lsbCBiZSBzdWNoIHRlc3Qgb3JpZW50ZWQgc2NlbmFyaW8sIHN1Y2ggcmVzdW1lIGNob29zZSBsb2dpYwotICAgICAqIHNob3VsZCBiZSBhcHBsaWVkLgotICAgICAqLwotICAgIGF1ZGlvX3NpbmtfcmVjZWl2ZXJfLT5PbkF1ZGlvU3VzcGVuZChzdGQ6Om1vdmUoZG9fc3VzcGVuZF9zaW5rX3Byb21pc2UpKTsKLSAgICBkb19zdXNwZW5kX3NpbmtfZnV0dXJlLndhaXQoKTsKLQotICAgIGlmIChzdXNwZW5kX3NvdXJjZSkgewotICAgICAgQVNTRVJUX05FKGF1ZGlvX3NvdXJjZV9yZWNlaXZlcl8sIG51bGxwdHIpOwotICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IGRvX3N1c3BlbmRfc291cmNlX3Byb21pc2U7Ci0gICAgICBhdXRvIGRvX3N1c3BlbmRfc291cmNlX2Z1dHVyZSA9IGRvX3N1c3BlbmRfc291cmNlX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgICAgYXVkaW9fc291cmNlX3JlY2VpdmVyXy0+T25BdWRpb1N1c3BlbmQoCi0gICAgICAgICAgc3RkOjptb3ZlKGRvX3N1c3BlbmRfc291cmNlX3Byb21pc2UpKTsKLSAgICAgIGRvX3N1c3BlbmRfc291cmNlX2Z1dHVyZS53YWl0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRfc2FtcGxlX2RhdGFiYXNlKHVpbnQxNl90IGNvbm5faWQsIFJhd0FkZHJlc3MgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2NrRGV2aWNlV3JhcHBlcjo6Y3Npc19tb2NrPiBjc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1vY2tEZXZpY2VXcmFwcGVyOjpjYXNfbW9jaz4gY2FzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1vY2tEZXZpY2VXcmFwcGVyOjphc2NzX21vY2s+IGFzY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0RldmljZVdyYXBwZXI6OnBhY3NfbW9jaz4gcGFjcykgewotICAgIGdhdHQ6OkRhdGFiYXNlQnVpbGRlciBib2I7Ci0KLSAgICAvKiBHZW5lcmljIEFjY2VzcyBTZXJ2aWNlICovCi0gICAgYm9iLkFkZFNlcnZpY2UoMHgwMDAxLCAweDAwMDMsIFV1aWQ6OkZyb20xNkJpdCgweDE4MDApLCB0cnVlKTsKLSAgICAvKiBEZXZpY2UgTmFtZSBDaGFyLiAqLwotICAgIGJvYi5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMDIsIDB4MDAwMywgVXVpZDo6RnJvbTE2Qml0KDB4MmEwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEKTsKLQotICAgIGlmIChjc2lzLT5zdGFydCkgewotICAgICAgYm9vbCBpc19wcmltYXJ5ID0gdHJ1ZTsKLSAgICAgIGJvYi5BZGRTZXJ2aWNlKGNzaXMtPnN0YXJ0LCBjc2lzLT5lbmQsIGJsdWV0b290aDo6Y3Npczo6a0NzaXNTZXJ2aWNlVXVpZCwKLSAgICAgICAgICAgICAgICAgICAgIGlzX3ByaW1hcnkpOwotICAgICAgaWYgKGNzaXMtPnNpcmtfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjc2lzLT5zaXJrX2NoYXIsIGNzaXMtPnNpcmtfY2hhciArIDEsCi0gICAgICAgICAgICBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2lya1V1aWQsCi0gICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotICAgICAgICBpZiAoY3Npcy0+c2lya19jY2MpCi0gICAgICAgICAgYm9iLkFkZERlc2NyaXB0b3IoY3Npcy0+c2lya19jY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNzaXMtPnNpemVfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjc2lzLT5zaXplX2NoYXIsIGNzaXMtPnNpemVfY2hhciArIDEsCi0gICAgICAgICAgICBibHVldG9vdGg6OmNzaXM6OmtDc2lzU2l6ZVV1aWQsCi0gICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotICAgICAgICBpZiAoY3Npcy0+c2l6ZV9jY2MpCi0gICAgICAgICAgYm9iLkFkZERlc2NyaXB0b3IoY3Npcy0+c2l6ZV9jY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNzaXMtPmxvY2tfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoY3Npcy0+bG9ja19jaGFyLCBjc2lzLT5sb2NrX2NoYXIgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjc2lzOjprQ3Npc0xvY2tVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURSk7Ci0gICAgICAgIGlmIChjc2lzLT5sb2NrX2NjYykKLSAgICAgICAgICBib2IuQWRkRGVzY3JpcHRvcihjc2lzLT5sb2NrX2NjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgICAgfQotCi0gICAgICBpZiAoY3Npcy0+cmFua19jaGFyKQotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoY3Npcy0+cmFua19jaGFyLCBjc2lzLT5yYW5rX2NoYXIgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjc2lzOjprQ3Npc1JhbmtVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgIH0KLQotICAgIGlmIChjYXMtPnN0YXJ0KSB7Ci0gICAgICBib29sIGlzX3ByaW1hcnkgPSB0cnVlOwotICAgICAgYm9iLkFkZFNlcnZpY2UoY2FzLT5zdGFydCwgY2FzLT5lbmQsIGxlX2F1ZGlvOjp1dWlkOjprQ2FwU2VydmljZVV1aWQsCi0gICAgICAgICAgICAgICAgICAgICBpc19wcmltYXJ5KTsKLSAgICAgIC8vIEluY2x1ZGUgQ1NJUyBzZXJ2aWNlIGluc2lkZQotICAgICAgaWYgKGNhcy0+Y3Npc19pbmNsdWRlKQotICAgICAgICBib2IuQWRkSW5jbHVkZWRTZXJ2aWNlKGNhcy0+Y3Npc19pbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Y3Npczo6a0NzaXNTZXJ2aWNlVXVpZCwgY3Npcy0+c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Npcy0+ZW5kKTsKLSAgICB9Ci0KLSAgICBpZiAocGFjcy0+c3RhcnQpIHsKLSAgICAgIGJvb2wgaXNfcHJpbWFyeSA9IHRydWU7Ci0gICAgICBib2IuQWRkU2VydmljZShwYWNzLT5zdGFydCwgcGFjcy0+ZW5kLAotICAgICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdHlTZXJ2aWNlVXVpZCwKLSAgICAgICAgICAgICAgICAgICAgIGlzX3ByaW1hcnkpOwotCi0gICAgICBpZiAocGFjcy0+c2lua19wYWNfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBwYWNzLT5zaW5rX3BhY19jaGFyLCBwYWNzLT5zaW5rX3BhY19jaGFyICsgMSwKLSAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprU2lua1B1Ymxpc2hlZEF1ZGlvQ2FwYWJpbGl0eUNoYXJhY3RlcmlzdGljVXVpZCwKLSAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEKTsKLSAgICAgICAgaWYgKHBhY3MtPnNpbmtfcGFjX2NjYykKLSAgICAgICAgICBib2IuQWRkRGVzY3JpcHRvcihwYWNzLT5zaW5rX3BhY19jY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBhY3MtPnNpbmtfYXVkaW9fbG9jX2NoYXIpIHsKLSAgICAgICAgYm9iLkFkZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgICAgcGFjcy0+c2lua19hdWRpb19sb2NfY2hhciwgcGFjcy0+c2lua19hdWRpb19sb2NfY2hhciArIDEsCi0gICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6a1NpbmtBdWRpb0xvY2F0aW9uQ2hhcmFjdGVyaXN0aWNVdWlkLAotICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgICAgICBpZiAocGFjcy0+c2lua19hdWRpb19sb2NfY2NjKQotICAgICAgICAgIGJvYi5BZGREZXNjcmlwdG9yKHBhY3MtPnNpbmtfYXVkaW9fbG9jX2NjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgICAgfQotCi0gICAgICBpZiAocGFjcy0+c291cmNlX3BhY19jaGFyKSB7Ci0gICAgICAgIGJvYi5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgIHBhY3MtPnNvdXJjZV9wYWNfY2hhciwgcGFjcy0+c291cmNlX3BhY19jaGFyICsgMSwKLSAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprU291cmNlUHVibGlzaGVkQXVkaW9DYXBhYmlsaXR5Q2hhcmFjdGVyaXN0aWNVdWlkLAotICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgICAgICBpZiAocGFjcy0+c291cmNlX3BhY19jY2MpCi0gICAgICAgICAgYm9iLkFkZERlc2NyaXB0b3IocGFjcy0+c291cmNlX3BhY19jY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBhY3MtPnNvdXJjZV9hdWRpb19sb2NfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBwYWNzLT5zb3VyY2VfYXVkaW9fbG9jX2NoYXIsIHBhY3MtPnNvdXJjZV9hdWRpb19sb2NfY2hhciArIDEsCi0gICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6a1NvdXJjZUF1ZGlvTG9jYXRpb25DaGFyYWN0ZXJpc3RpY1V1aWQsCi0gICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgICAgIGlmIChwYWNzLT5zb3VyY2VfYXVkaW9fbG9jX2NjYykKLSAgICAgICAgICBib2IuQWRkRGVzY3JpcHRvcihwYWNzLT5zb3VyY2VfYXVkaW9fbG9jX2NjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgICAgfQotCi0gICAgICBpZiAocGFjcy0+YXZhaWxfY29udGV4dHNfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBwYWNzLT5hdmFpbF9jb250ZXh0c19jaGFyLCBwYWNzLT5hdmFpbF9jb250ZXh0c19jaGFyICsgMSwKLSAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprQXVkaW9Db250ZXh0QXZhaWxhYmlsaXR5Q2hhcmFjdGVyaXN0aWNVdWlkLAotICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgICAgICBpZiAocGFjcy0+YXZhaWxfY29udGV4dHNfY2NjKQotICAgICAgICAgIGJvYi5BZGREZXNjcmlwdG9yKHBhY3MtPmF2YWlsX2NvbnRleHRzX2NjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICAgICAgfQotCi0gICAgICBpZiAocGFjcy0+c3VwcF9jb250ZXh0c19jaGFyKSB7Ci0gICAgICAgIGJvYi5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgIHBhY3MtPnN1cHBfY29udGV4dHNfY2hhciwgcGFjcy0+c3VwcF9jb250ZXh0c19jaGFyICsgMSwKLSAgICAgICAgICAgIGxlX2F1ZGlvOjp1dWlkOjprQXVkaW9TdXBwb3J0ZWRDb250ZXh0Q2hhcmFjdGVyaXN0aWNVdWlkLAotICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgICAgICBpZiAocGFjcy0+c3VwcF9jb250ZXh0c19jY2MpCi0gICAgICAgICAgYm9iLkFkZERlc2NyaXB0b3IocGFjcy0+c3VwcF9jb250ZXh0c19jY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYXNjcy0+c3RhcnQpIHsKLSAgICAgIGJvb2wgaXNfcHJpbWFyeSA9IHRydWU7Ci0gICAgICBib2IuQWRkU2VydmljZShhc2NzLT5zdGFydCwgYXNjcy0+ZW5kLAotICAgICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtBdWRpb1N0cmVhbUNvbnRyb2xTZXJ2aWNlVXVpZCwKLSAgICAgICAgICAgICAgICAgICAgIGlzX3ByaW1hcnkpOwotICAgICAgaWYgKGFzY3MtPnNpbmtfYXNlX2NoYXIpIHsKLSAgICAgICAgYm9iLkFkZENoYXJhY3RlcmlzdGljKGFzY3MtPnNpbmtfYXNlX2NoYXIsIGFzY3MtPnNpbmtfYXNlX2NoYXIgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtTaW5rQXVkaW9TdHJlYW1FbmRwb2ludFV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgICAgIGlmIChhc2NzLT5zaW5rX2FzZV9jY2MpCi0gICAgICAgICAgYm9iLkFkZERlc2NyaXB0b3IoYXNjcy0+c2lua19hc2VfY2NjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYXNjcy0+c291cmNlX2FzZV9jaGFyKSB7Ci0gICAgICAgIGJvYi5BZGRDaGFyYWN0ZXJpc3RpYyhhc2NzLT5zb3VyY2VfYXNlX2NoYXIsIGFzY3MtPnNvdXJjZV9hc2VfY2hhciArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZV9hdWRpbzo6dXVpZDo6a1NvdXJjZUF1ZGlvU3RyZWFtRW5kcG9pbnRVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgICAgICBpZiAoYXNjcy0+c291cmNlX2FzZV9jY2MpCi0gICAgICAgICAgYm9iLkFkZERlc2NyaXB0b3IoYXNjcy0+c291cmNlX2FzZV9jY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKTsKLSAgICAgIH0KLSAgICAgIGlmIChhc2NzLT5jdHBfY2hhcikgewotICAgICAgICBib2IuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBhc2NzLT5jdHBfY2hhciwgYXNjcy0+Y3RwX2NoYXIgKyAxLAotICAgICAgICAgICAgbGVfYXVkaW86OnV1aWQ6OmtBdWRpb1N0cmVhbUVuZHBvaW50Q29udHJvbFBvaW50Q2hhcmFjdGVyaXN0aWNVdWlkLAotICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQpOwotICAgICAgICBpZiAoYXNjcy0+Y3RwX2NjYykKLSAgICAgICAgICBib2IuQWRkRGVzY3JpcHRvcihhc2NzLT5jdHBfY2NjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXNzaWduIGNvbm5faWQgdG8gYSBjZXJ0YWluIGRldmljZSAtIHRoaXMgZG9lcyBub3QgbWVhbiBpdCBpcyBjb25uZWN0ZWQKLSAgICBhdXRvIGRldl93cmFwcGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrRGV2aWNlV3JhcHBlcj4oCi0gICAgICAgIGFkZHIsIGJvYi5CdWlsZCgpLlNlcnZpY2VzKCksIHN0ZDo6bW92ZShjc2lzKSwgc3RkOjptb3ZlKGNhcyksCi0gICAgICAgIHN0ZDo6bW92ZShhc2NzKSwgc3RkOjptb3ZlKHBhY3MpKTsKLSAgICBwZWVyX2RldmljZXMuZW1wbGFjZShjb25uX2lkLCBzdGQ6Om1vdmUoZGV2X3dyYXBwZXIpKTsKLSAgfQotCi0gIHZvaWQgU2V0U2FtcGxlRGF0YWJhc2VFbXB0eSh1aW50MTZfdCBjb25uX2lkLCBSYXdBZGRyZXNzIGFkZHIpIHsKLSAgICBhdXRvIGNzaXMgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vY2tEZXZpY2VXcmFwcGVyOjpjc2lzX21vY2s+KCk7Ci0gICAgYXV0byBjYXMgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vY2tEZXZpY2VXcmFwcGVyOjpjYXNfbW9jaz4oKTsKLSAgICBhdXRvIHBhY3MgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vY2tEZXZpY2VXcmFwcGVyOjpwYWNzX21vY2s+KCk7Ci0gICAgYXV0byBhc2NzID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrRGV2aWNlV3JhcHBlcjo6YXNjc19tb2NrPigpOwotICAgIHNldF9zYW1wbGVfZGF0YWJhc2UoY29ubl9pZCwgYWRkciwgc3RkOjptb3ZlKGNzaXMpLCBzdGQ6Om1vdmUoY2FzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShhc2NzKSwgc3RkOjptb3ZlKHBhY3MpKTsKLSAgfQotCi0gIHZvaWQgU2V0U2FtcGxlRGF0YWJhc2VFYXJidWRzVmFsaWQodWludDE2X3QgY29ubl9pZCwgUmF3QWRkcmVzcyBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfYXVkaW9fYWxsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzb3VyY2VfYXVkaW9fYWxsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZF9jc2lzID0gdHJ1ZSwgYm9vbCBhZGRfY2FzID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZF9wYWNzID0gdHJ1ZSwgYm9vbCBhZGRfYXNjcyA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZXRfc2l6ZSA9IDIsIHVpbnQ4X3QgcmFuayA9IDEpIHsKLSAgICBhdXRvIGNzaXMgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vY2tEZXZpY2VXcmFwcGVyOjpjc2lzX21vY2s+KCk7Ci0gICAgaWYgKGFkZF9jc2lzKSB7Ci0gICAgICAvLyBhdHRyaWJ1dGUgaGFuZGxlcwotICAgICAgY3Npcy0+c3RhcnQgPSAweDAwMTA7Ci0gICAgICBjc2lzLT5zaXJrX2NoYXIgPSAweDAwMjA7Ci0gICAgICBjc2lzLT5zaXJrX2NjYyA9IDB4MDAyMjsKLSAgICAgIGNzaXMtPnNpemVfY2hhciA9IDB4MDAyMzsKLSAgICAgIGNzaXMtPnNpemVfY2NjID0gMHgwMDI1OwotICAgICAgY3Npcy0+bG9ja19jaGFyID0gMHgwMDI2OwotICAgICAgY3Npcy0+bG9ja19jY2MgPSAweDAwMjg7Ci0gICAgICBjc2lzLT5yYW5rX2NoYXIgPSAweDAwMjk7Ci0gICAgICBjc2lzLT5lbmQgPSAweDAwMzA7Ci0gICAgICAvLyBvdGhlciBwYXJhbXMKLSAgICAgIGNzaXMtPnNpemUgPSBzZXRfc2l6ZTsKLSAgICAgIGNzaXMtPnJhbmsgPSByYW5rOwotICAgIH0KLQotICAgIGF1dG8gY2FzID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrRGV2aWNlV3JhcHBlcjo6Y2FzX21vY2s+KCk7Ci0gICAgaWYgKGFkZF9jYXMpIHsKLSAgICAgIC8vIGF0dHJpYnV0ZSBoYW5kbGVzCi0gICAgICBjYXMtPnN0YXJ0ID0gMHgwMDQwOwotICAgICAgaWYgKGFkZF9jc2lzKSBjYXMtPmNzaXNfaW5jbHVkZSA9IDB4MDA0MTsKLSAgICAgIGNhcy0+ZW5kID0gMHgwMDUwOwotICAgICAgLy8gb3RoZXIgcGFyYW1zCi0gICAgfQotCi0gICAgYXV0byBwYWNzID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrRGV2aWNlV3JhcHBlcjo6cGFjc19tb2NrPigpOwotICAgIGlmIChhZGRfcGFjcykgewotICAgICAgLy8gYXR0cmlidXRlIGhhbmRsZXMKLSAgICAgIHBhY3MtPnN0YXJ0ID0gMHgwMDYwOwotICAgICAgcGFjcy0+c2lua19wYWNfY2hhciA9IDB4MDA2MTsKLSAgICAgIHBhY3MtPnNpbmtfcGFjX2NjYyA9IDB4MDA2MzsKLSAgICAgIHBhY3MtPnNpbmtfYXVkaW9fbG9jX2NoYXIgPSAweDAwNjQ7Ci0gICAgICBwYWNzLT5zaW5rX2F1ZGlvX2xvY19jY2MgPSAweDAwNjY7Ci0gICAgICBwYWNzLT5zb3VyY2VfcGFjX2NoYXIgPSAweDAwNjc7Ci0gICAgICBwYWNzLT5zb3VyY2VfcGFjX2NjYyA9IDB4MDA2OTsKLSAgICAgIHBhY3MtPnNvdXJjZV9hdWRpb19sb2NfY2hhciA9IDB4MDA3MDsKLSAgICAgIHBhY3MtPnNvdXJjZV9hdWRpb19sb2NfY2NjID0gMHgwMDcyOwotICAgICAgcGFjcy0+YXZhaWxfY29udGV4dHNfY2hhciA9IDB4MDA3MzsKLSAgICAgIHBhY3MtPmF2YWlsX2NvbnRleHRzX2NjYyA9IDB4MDA3NTsKLSAgICAgIHBhY3MtPnN1cHBfY29udGV4dHNfY2hhciA9IDB4MDA3NjsKLSAgICAgIHBhY3MtPnN1cHBfY29udGV4dHNfY2NjID0gMHgwMDc4OwotICAgICAgcGFjcy0+ZW5kID0gMHgwMDgwOwotICAgICAgLy8gb3RoZXIgcGFyYW1zCi0gICAgfQotCi0gICAgYXV0byBhc2NzID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrRGV2aWNlV3JhcHBlcjo6YXNjc19tb2NrPigpOwotICAgIGlmIChhZGRfYXNjcykgewotICAgICAgLy8gYXR0cmlidXRlIGhhbmRsZXMKLSAgICAgIGFzY3MtPnN0YXJ0ID0gMHgwMDkwOwotICAgICAgYXNjcy0+c2lua19hc2VfY2hhciA9IDB4MDA5MTsKLSAgICAgIGFzY3MtPnNpbmtfYXNlX2NjYyA9IDB4MDA5MzsKLSAgICAgIGFzY3MtPnNvdXJjZV9hc2VfY2hhciA9IDB4MDA5NDsKLSAgICAgIGFzY3MtPnNvdXJjZV9hc2VfY2NjID0gMHgwMDk2OwotICAgICAgYXNjcy0+Y3RwX2NoYXIgPSAweDAwOTc7Ci0gICAgICBhc2NzLT5jdHBfY2NjID0gMHgwMDk5OwotICAgICAgYXNjcy0+ZW5kID0gMHgwMEEwOwotICAgICAgLy8gb3RoZXIgcGFyYW1zCi0gICAgfQotCi0gICAgc2V0X3NhbXBsZV9kYXRhYmFzZShjb25uX2lkLCBhZGRyLCBzdGQ6Om1vdmUoY3NpcyksIHN0ZDo6bW92ZShjYXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGFzY3MpLCBzdGQ6Om1vdmUocGFjcykpOwotCi0gICAgaWYgKGFkZF9wYWNzKSB7Ci0gICAgICB1aW50OF90IHNua19hbGxvY2F0aW9uWzRdOwotICAgICAgdWludDhfdCBzcmNfYWxsb2NhdGlvbls0XTsKLQotICAgICAgc25rX2FsbG9jYXRpb25bMF0gPSAodWludDhfdCkoc2lua19hdWRpb19hbGxvY2F0aW9uKTsKLSAgICAgIHNua19hbGxvY2F0aW9uWzFdID0gKHVpbnQ4X3QpKHNpbmtfYXVkaW9fYWxsb2NhdGlvbiA+PiA4KTsKLSAgICAgIHNua19hbGxvY2F0aW9uWzJdID0gKHVpbnQ4X3QpKHNpbmtfYXVkaW9fYWxsb2NhdGlvbiA+PiAxNik7Ci0gICAgICBzbmtfYWxsb2NhdGlvblszXSA9ICh1aW50OF90KShzaW5rX2F1ZGlvX2FsbG9jYXRpb24gPj4gMjQpOwotCi0gICAgICBzcmNfYWxsb2NhdGlvblswXSA9ICh1aW50OF90KShzb3VyY2VfYXVkaW9fYWxsb2NhdGlvbik7Ci0gICAgICBzcmNfYWxsb2NhdGlvblsxXSA9ICh1aW50OF90KShzb3VyY2VfYXVkaW9fYWxsb2NhdGlvbiA+PiA4KTsKLSAgICAgIHNyY19hbGxvY2F0aW9uWzJdID0gKHVpbnQ4X3QpKHNvdXJjZV9hdWRpb19hbGxvY2F0aW9uID4+IDE2KTsKLSAgICAgIHNyY19hbGxvY2F0aW9uWzNdID0gKHVpbnQ4X3QpKHNvdXJjZV9hdWRpb19hbGxvY2F0aW9uID4+IDI0KTsKLQotICAgICAgLy8gU2V0IHBhY3MgZGVmYXVsdCByZWFkIHZhbHVlcwotICAgICAgT05fQ0FMTCgqcGVlcl9kZXZpY2VzLmF0KGNvbm5faWQpLT5wYWNzLCBPblJlYWRDaGFyYWN0ZXJpc3RpYyhfLCBfLCBfKSkKLSAgICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgICAgW3RoaXMsIGNvbm5faWQsIHNua19hbGxvY2F0aW9uLCBzcmNfYWxsb2NhdGlvbl0oCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIEdBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICAgICAgICAgICAgICAgIGF1dG8mIHBhY3MgPSBwZWVyX2RldmljZXMuYXQoY29ubl9pZCktPnBhY3M7Ci0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBwYWNzLT5zaW5rX3BhY19jaGFyICsgMSkgewotICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gTnVtIHJlY29yZHMKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjX0lECi0gICAgICAgICAgICAgICAgICAgICAgMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuIExlbgotICAgICAgICAgICAgICAgICAgICAgIDB4MTAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAweDAxLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDQsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAweDA1LAotICAgICAgICAgICAgICAgICAgICAgIDB4MDQsCi0gICAgICAgICAgICAgICAgICAgICAgMHgxRSwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MjgsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBNZXRhZGF0YSBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjX0lECi0gICAgICAgICAgICAgICAgICAgICAgMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjIFNwZWMuIENhcHMuIExlbgotICAgICAgICAgICAgICAgICAgICAgIDB4MTAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAweDAxLAotICAgICAgICAgICAgICAgICAgICAgIDB4ODAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAweDA1LAotICAgICAgICAgICAgICAgICAgICAgIDB4MDQsCi0gICAgICAgICAgICAgICAgICAgICAgMHg3OCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIDB4NzgsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBNZXRhZGF0YSBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZSA9PSBwYWNzLT5zaW5rX2F1ZGlvX2xvY19jaGFyICsgMSkgewotICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gTG9jYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgc25rX2FsbG9jYXRpb25bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgc25rX2FsbG9jYXRpb25bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgc25rX2FsbG9jYXRpb25bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgc25rX2FsbG9jYXRpb25bM10sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlID09IHBhY3MtPnNvdXJjZV9wYWNfY2hhciArIDEpIHsKLSAgICAgICAgICAgICAgICAgIHZhbHVlID0gewotICAgICAgICAgICAgICAgICAgICAgIC8vIE51bSByZWNvcmRzCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBDb2RlY19JRAotICAgICAgICAgICAgICAgICAgICAgIDB4MDYsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLiBMZW4KLSAgICAgICAgICAgICAgICAgICAgICAweDEwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAweDA0LAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAweDAzLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAweDA0LAotICAgICAgICAgICAgICAgICAgICAgIDB4MUUsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDI4LAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBDb2RlY19JRAotICAgICAgICAgICAgICAgICAgICAgIDB4MDYsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDAwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBDb2RlYyBTcGVjLiBDYXBzLiBMZW4KLSAgICAgICAgICAgICAgICAgICAgICAweDEwLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAweDA0LAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAweDAzLAotICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAweDA0LAotICAgICAgICAgICAgICAgICAgICAgIDB4MUUsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAweDI4LAotICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgLy8gTWV0YWRhdGEgTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGUgPT0gcGFjcy0+c291cmNlX2F1ZGlvX2xvY19jaGFyICsgMSkgewotICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gTG9jYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX2FsbG9jYXRpb25bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX2FsbG9jYXRpb25bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX2FsbG9jYXRpb25bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX2FsbG9jYXRpb25bM10sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlID09IHBhY3MtPmF2YWlsX2NvbnRleHRzX2NoYXIgKyAxKSB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5rIEF2YWlsIENvbnRleHRzCi0gICAgICAgICAgICAgICAgICAgICAgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAweGZmLAotICAgICAgICAgICAgICAgICAgICAgIC8vIFNvdXJjZSBBdmFpbCBDb250ZXh0cwotICAgICAgICAgICAgICAgICAgICAgIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgMHhmZiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGUgPT0gcGFjcy0+c3VwcF9jb250ZXh0c19jaGFyICsgMSkgewotICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBBdmFpbCBDb250ZXh0cwotICAgICAgICAgICAgICAgICAgICAgIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UgQXZhaWwgQ29udGV4dHMKLSAgICAgICAgICAgICAgICAgICAgICAweGZmLAotICAgICAgICAgICAgICAgICAgICAgIDB4ZmYsCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYihjb25uX2lkLCBHQVRUX1NVQ0NFU1MsIGhhbmRsZSwgdmFsdWUuc2l6ZSgpLCB2YWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgY2JfZGF0YSk7Ci0gICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIGlmIChhZGRfYXNjcykgewotICAgICAgLy8gU2V0IGFzY3MgZGVmYXVsdCByZWFkIHZhbHVlcwotICAgICAgT05fQ0FMTCgqcGVlcl9kZXZpY2VzLmF0KGNvbm5faWQpLT5hc2NzLCBPblJlYWRDaGFyYWN0ZXJpc3RpYyhfLCBfLCBfKSkKLSAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpcywgY29ubl9pZF0odWludDE2X3QgaGFuZGxlLCBHQVRUX1JFQURfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpIHsKLSAgICAgICAgICAgIGF1dG8mIGFzY3MgPSBwZWVyX2RldmljZXMuYXQoY29ubl9pZCktPmFzY3M7Ci0gICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gYXNjcy0+c2lua19hc2VfY2hhciArIDEpIHsKLSAgICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAvLyBBU0UgSUQKLSAgICAgICAgICAgICAgICAgIDB4MDEsCi0gICAgICAgICAgICAgICAgICAvLyBTdGF0ZQotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKSwKLSAgICAgICAgICAgICAgICAgIC8vIE5vIEFkZGl0aW9uYWwgQVNFIHBhcmFtcyBmb3IgSURMRSBzdGF0ZQotICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGUgPT0gYXNjcy0+c291cmNlX2FzZV9jaGFyICsgMSkgewotICAgICAgICAgICAgICB2YWx1ZSA9IHsKLSAgICAgICAgICAgICAgICAgIC8vIEFTRSBJRAotICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAgIC8vIFN0YXRlCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgICBsZV9hdWRpbzo6dHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpLAotICAgICAgICAgICAgICAgICAgLy8gTm8gQWRkaXRpb25hbCBBU0UgcGFyYW1zIGZvciBJRExFIHN0YXRlCi0gICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYihjb25uX2lkLCBHQVRUX1NVQ0NFU1MsIGhhbmRsZSwgdmFsdWUuc2l6ZSgpLCB2YWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgICBjYl9kYXRhKTsKLSAgICAgICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFRlc3RBdWRpb0RhdGFUcmFuc2ZlcihpbnQgZ3JvdXBfaWQsIHVpbnQ4X3QgY2lzX2NvdW50X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaXNfY291bnRfaW4sIGludCBkYXRhX2xlbikgewotICAgIEFTU0VSVF9ORShhdWRpb19zaW5rX3JlY2VpdmVyXywgbnVsbHB0cik7Ci0KLSAgICAvLyBFeHBlY3QgdHdvIGNoYW5uZWxzIElTTyBEYXRhIHRvIGJlIHNlbnQKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gaGFuZGxlczsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNlbmRJc29EYXRhKF8sIF8sIF8pKQotICAgICAgICAuVGltZXMoY2lzX2NvdW50X291dCkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KAotICAgICAgICAgICAgWyZoYW5kbGVzXSh1aW50MTZfdCBpc29faGFuZGxlLCBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2xlbikgeyBoYW5kbGVzLnB1c2hfYmFjayhpc29faGFuZGxlKTsgfSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YShkYXRhX2xlbik7Ci0gICAgYXVkaW9fc2lua19yZWNlaXZlcl8tPk9uQXVkaW9EYXRhUmVhZHkoZGF0YSk7Ci0KLSAgICAvLyBJbmplY3QgbWljcm9waG9uZSBkYXRhIGZyb20gYSBzaW5nbGUgcGVlciBkZXZpY2UKLSAgICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBTZW5kRGF0YShfLCBfKSkuVGltZXMoY2lzX2NvdW50X2luKTsKLSAgICBBU1NFUlRfRVEoc3RyZWFtaW5nX2dyb3Vwcy5jb3VudChncm91cF9pZCksIDF1KTsKLQotICAgIGlmIChjaXNfY291bnRfaW4pIHsKLSAgICAgIEFTU0VSVF9ORShhdWRpb19zb3VyY2VfcmVjZWl2ZXJfLCBudWxscHRyKTsKLQotICAgICAgYXV0byBncm91cCA9IHN0cmVhbWluZ19ncm91cHMuYXQoZ3JvdXBfaWQpOwotICAgICAgZm9yIChMZUF1ZGlvRGV2aWNlKiBkZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsgZGV2aWNlICE9IG51bGxwdHI7Ci0gICAgICAgICAgIGRldmljZSA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgZm9yIChhdXRvJiBhc2UgOiBkZXZpY2UtPmFzZXNfKSB7Ci0gICAgICAgICAgaWYgKGFzZS5kaXJlY3Rpb24gPT0gbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSkgewotICAgICAgICAgICAgSW5qZWN0SW5jb21pbmdJc29EYXRhKGdyb3VwX2lkLCBhc2UuY2lzX2Nvbm5faGRsKTsKLSAgICAgICAgICAgIC0tY2lzX2NvdW50X2luOwotICAgICAgICAgICAgaWYgKCFjaXNfY291bnRfaW4pIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWNpc19jb3VudF9pbikgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU3luY09uTWFpbkxvb3AoKTsKLSAgICBzdGQ6OnNvcnQoaGFuZGxlcy5iZWdpbigpLCBoYW5kbGVzLmVuZCgpKTsKLSAgICBBU1NFUlRfRVEoc3RkOjp1bmlxdWUoaGFuZGxlcy5iZWdpbigpLCBoYW5kbGVzLmVuZCgpKSAtIGhhbmRsZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgY2lzX2NvdW50X291dCk7Ci0gICAgQVNTRVJUX0VRKGNpc19jb3VudF9pbiwgMCk7Ci0gICAgaGFuZGxlcy5jbGVhcigpOwotCi0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19pc29fbWFuYWdlcl8pOwotICAgIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NpbmtfKTsKLSAgfQotCi0gIHZvaWQgSW5qZWN0SW5jb21pbmdJc29EYXRhKHVpbnQxNl90IGNpZ19pZCwgdWludDE2X3QgY2lzX2Nvbl9oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSA0MCkgewotICAgIEJUX0hEUiogYnRfaGRyID0gKEJUX0hEUiopbWFsbG9jKHNpemVvZihCVF9IRFIpICsgcGF5bG9hZF9zaXplKTsKLQotICAgIGJ0X2hkci0+b2Zmc2V0ID0gMDsKLSAgICBidF9oZHItPmxlbiA9IHBheWxvYWRfc2l6ZTsKLQotICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2RhdGFfZXZ0IGNpc19ldnQ7Ci0gICAgY2lzX2V2dC5jaWdfaWQgPSBjaWdfaWQ7Ci0gICAgY2lzX2V2dC5jaXNfY29ubl9oZGwgPSBjaXNfY29uX2hkbDsKLSAgICBjaXNfZXZ0LnRzID0gMDsKLSAgICBjaXNfZXZ0LmV2dF9sb3N0ID0gMDsKLSAgICBjaXNfZXZ0LnBfbXNnID0gYnRfaGRyOwotCi0gICAgQVNTRVJUX05FKGNpZ19jYWxsYmFja3NfLCBudWxscHRyKTsKLSAgICBjaWdfY2FsbGJhY2tzXy0+T25DaXNFdmVudCgKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNEYXRhQXZhaWxhYmxlLCAmY2lzX2V2dCk7Ci0gICAgZnJlZShidF9oZHIpOwotICB9Ci0KLSAgdm9pZCBJbmplY3RDaXNEaXNjb25uZWN0ZWQodWludDE2X3QgY2lnX2lkLCB1aW50MTZfdCBjaXNfY29uX2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWFzb24gPSAwKSB7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZGlzY29ubmVjdGVkX2V2dCBjaXNfZXZ0OwotICAgIGNpc19ldnQuY2lnX2lkID0gY2lnX2lkOwotICAgIGNpc19ldnQuY2lzX2Nvbm5faGRsID0gY2lzX2Nvbl9oZGw7Ci0gICAgY2lzX2V2dC5yZWFzb24gPSByZWFzb247Ci0KLSAgICBBU1NFUlRfTkUoY2lnX2NhbGxiYWNrc18sIG51bGxwdHIpOwotICAgIGNpZ19jYWxsYmFja3NfLT5PbkNpc0V2ZW50KAotICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpc0Rpc2Nvbm5lY3RlZCwgJmNpc19ldnQpOwotICB9Ci0KLSAgdm9pZCBJbmplY3RDaWdSZW1vdmVkKHVpbnQ4X3QgY2lnX2lkKSB7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfcmVtb3ZlX2NtcGxfZXZ0IGV2dDsKLSAgICBldnQuc3RhdHVzID0gMDsKLSAgICBldnQuY2lnX2lkID0gY2lnX2lkOwotCi0gICAgQVNTRVJUX05FKGNpZ19jYWxsYmFja3NfLCBudWxscHRyKTsKLSAgICBjaWdfY2FsbGJhY2tzXy0+T25DaXNFdmVudCgKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaWdPblJlbW92ZUNtcGwsICZldnQpOwotICB9Ci0KLSAgTW9ja0xlQXVkaW9DbGllbnRDYWxsYmFja3MgbW9ja19jbGllbnRfY2FsbGJhY2tzXzsKLSAgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSBtb2NrX2F1ZGlvX3NvdXJjZV87Ci0gIE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rIG1vY2tfYXVkaW9fc2lua187Ci0gIExlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlciogYXVkaW9fc2lua19yZWNlaXZlcl8gPSBudWxscHRyOwotICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlciogYXVkaW9fc291cmNlX3JlY2VpdmVyXyA9IG51bGxwdHI7Ci0KLSAgYm9vbCBpc19hdWRpb19oYWxfc291cmNlX2FjcXVpcmVkOwotICBib29sIGlzX2F1ZGlvX2hhbF9zaW5rX2FjcXVpcmVkOwotCi0gIE1vY2tDc2lzQ2xpZW50IG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXzsKLSAgTW9ja0RldmljZUdyb3VwcyBtb2NrX2dyb3Vwc19tb2R1bGVfOwotICBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzQ2FsbGJhY2tzKiBncm91cF9jYWxsYmFja3NfOwotICBNb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lIG1vY2tfc3RhdGVfbWFjaGluZV87Ci0KLSAgTW9ja0Z1bmN0aW9uPHZvaWQoKT4gbW9ja19zdG9yYWdlX2xvYWQ7Ci0gIE1vY2tGdW5jdGlvbjxib29sKCk+IG1vY2tfaGFsXzJfMV92ZXJpZmllcjsKLQotICBjb250cm9sbGVyOjpNb2NrQ29udHJvbGxlckludGVyZmFjZSBjb250cm9sbGVyX2ludGVyZmFjZV87Ci0gIGJsdWV0b290aDo6bWFuYWdlcjo6TW9ja0J0bUludGVyZmFjZSBtb2NrX2J0bV9pbnRlcmZhY2VfOwotICBnYXR0OjpNb2NrQnRhR2F0dEludGVyZmFjZSBtb2NrX2dhdHRfaW50ZXJmYWNlXzsKLSAgZ2F0dDo6TW9ja0J0YUdhdHRRdWV1ZSBtb2NrX2dhdHRfcXVldWVfOwotICB0QlRBX0dBVFRDX0NCQUNLKiBnYXR0X2NhbGxiYWNrOwotICBjb25zdCB1aW50OF90IGdhdHRfaWYgPSAweGZlOwotICB1aW50OF90IGdsb2JhbF9jb25uX2lkID0gMTsKLSAgbGVfYXVkaW86OkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6Q2FsbGJhY2tzKiBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc187Ci0gIHN0ZDo6bWFwPGludCwgTGVBdWRpb0RldmljZUdyb3VwKj4gc3RyZWFtaW5nX2dyb3VwczsKLQotICBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlciogaXNvX21hbmFnZXJfOwotICBNb2NrSXNvTWFuYWdlciogbW9ja19pc29fbWFuYWdlcl87Ci0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Q2lnQ2FsbGJhY2tzKiBjaWdfY2FsbGJhY2tzXyA9IG51bGxwdHI7Ci0gIHVpbnQxNl90IGlzb19jb25fY291bnRlcl8gPSAxOwotCi0gIGJsdWV0b290aDo6c3RvcmFnZTo6TW9ja0J0aWZTdG9yYWdlSW50ZXJmYWNlIG1vY2tfYnRpZl9zdG9yYWdlXzsKLQotICBzdGQ6Om1hcDx1aW50MTZfdCwgc3RkOjp1bmlxdWVfcHRyPE1vY2tEZXZpY2VXcmFwcGVyPj4gcGVlcl9kZXZpY2VzOwotICBzdGQ6Omxpc3Q8aW50PiBncm91cF9sb2NrczsKLSAgc3RkOjptYXA8UmF3QWRkcmVzcywgaW50PiBncm91cHM7Ci19OwotCi1jbGFzcyBVbmljYXN0VGVzdCA6IHB1YmxpYyBVbmljYXN0VGVzdE5vSW5pdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIFVuaWNhc3RUZXN0Tm9Jbml0OjpTZXRVcCgpOwotCi0gICAgRVhQRUNUX0NBTEwobW9ja19oYWxfMl8xX3ZlcmlmaWVyLCBDYWxsKCkpLlRpbWVzKDEpOwotICAgIEVYUEVDVF9DQUxMKG1vY2tfc3RvcmFnZV9sb2FkLCBDYWxsKCkpLlRpbWVzKDEpOwotCi0gICAgQnRhQXBwUmVnaXN0ZXJDYWxsYmFjayBhcHBfcmVnaXN0ZXJfY2FsbGJhY2s7Ci0gICAgRVhQRUNUX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIEFwcFJlZ2lzdGVyKF8sIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmZ2F0dF9jYWxsYmFjayksCi0gICAgICAgICAgICAgICAgICAgICAgICBTYXZlQXJnPDE+KCZhcHBfcmVnaXN0ZXJfY2FsbGJhY2spKSk7Ci0gICAgTGVBdWRpb0NsaWVudDo6SW5pdGlhbGl6ZSgKLSAgICAgICAgJm1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgIGJhc2U6OkJpbmQoW10oTW9ja0Z1bmN0aW9uPHZvaWQoKT4qIGZvbykgeyBmb28tPkNhbGwoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAmbW9ja19zdG9yYWdlX2xvYWQpLAotICAgICAgICBiYXNlOjpCaW5kKFtdKE1vY2tGdW5jdGlvbjxib29sKCk+KiBmb28pIHsgcmV0dXJuIGZvby0+Q2FsbCgpOyB9LAotICAgICAgICAgICAgICAgICAgICZtb2NrX2hhbF8yXzFfdmVyaWZpZXIpKTsKLQotICAgIFN5bmNPbk1haW5Mb29wKCk7Ci0gICAgQVNTRVJUX1RSVUUoZ2F0dF9jYWxsYmFjayk7Ci0gICAgQVNTRVJUX1RSVUUoZ3JvdXBfY2FsbGJhY2tzXyk7Ci0gICAgQVNTRVJUX1RSVUUoYXBwX3JlZ2lzdGVyX2NhbGxiYWNrKTsKLSAgICBhcHBfcmVnaXN0ZXJfY2FsbGJhY2suUnVuKGdhdHRfaWYsIEdBVFRfU1VDQ0VTUyk7Ci0gICAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfZ2F0dF9pbnRlcmZhY2VfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZ3JvdXBzLmNsZWFyKCk7Ci0gICAgVW5pY2FzdFRlc3ROb0luaXQ6OlRlYXJEb3duKCk7Ci0gIH0KLX07Ci0KLVJhd0FkZHJlc3MgR2V0VGVzdEFkZHJlc3ModWludDhfdCBpbmRleCkgewotICBDSEVDS19MVChpbmRleCwgVUlOVDhfTUFYKTsKLSAgUmF3QWRkcmVzcyByZXN1bHQgPSB7ezB4QzAsIDB4REUsIDB4QzAsIDB4REUsIDB4MDAsIGluZGV4fX07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgSW5pdGlhbGl6ZSkgewotICBBU1NFUlRfTkUoTGVBdWRpb0NsaWVudDo6R2V0KCksIG51bGxwdHIpOwotICBBU1NFUlRfVFJVRShMZUF1ZGlvQ2xpZW50OjpJc0xlQXVkaW9DbGllbnRSdW5uaW5nKCkpOwotfQotCi1URVNUX0YoVW5pY2FzdFRlc3ROb0luaXQsIEluaXRpYWxpemVOb0hhbF8yXzEpIHsKLSAgQVNTRVJUX0ZBTFNFKExlQXVkaW9DbGllbnQ6OklzTGVBdWRpb0NsaWVudFJ1bm5pbmcoKSk7Ci0KLSAgLy8gUmVwb3J0IEZhbHNlIHdoZW4gYXNrZWQgZm9yIEF1ZGlvIEhBTCAyLjEgc3VwcG9ydAotICBPTl9DQUxMKG1vY2tfaGFsXzJfMV92ZXJpZmllciwgQ2FsbCgpKS5XaWxsQnlEZWZhdWx0KFtdKCkgLT4gYm9vbCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICBCdGFBcHBSZWdpc3RlckNhbGxiYWNrIGFwcF9yZWdpc3Rlcl9jYWxsYmFjazsKLSAgT05fQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgQXBwUmVnaXN0ZXIoXywgXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChTYXZlQXJnPDA+KCZnYXR0X2NhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVBcmc8MT4oJmFwcF9yZWdpc3Rlcl9jYWxsYmFjaykpKTsKLQotICBFWFBFQ1RfREVBVEgoCi0gICAgICBMZUF1ZGlvQ2xpZW50OjpJbml0aWFsaXplKAotICAgICAgICAgICZtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgIGJhc2U6OkJpbmQoW10oTW9ja0Z1bmN0aW9uPHZvaWQoKT4qIGZvbykgeyBmb28tPkNhbGwoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICZtb2NrX3N0b3JhZ2VfbG9hZCksCi0gICAgICAgICAgYmFzZTo6QmluZChbXShNb2NrRnVuY3Rpb248Ym9vbCgpPiogZm9vKSB7IHJldHVybiBmb28tPkNhbGwoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICZtb2NrX2hhbF8yXzFfdmVyaWZpZXIpKSwKLSAgICAgICIsIExFIEF1ZGlvIENsaWVudCByZXF1aXJlcyBCbHVldG9vdGggQXVkaW8gSEFMIFYyLjEgYXQgbGVhc3QuIEVpdGhlciAiCi0gICAgICAiZGlzYWJsZSBMRSBBdWRpbyBQcm9maWxlLCBvciB1cGRhdGUgeW91ciBIQUwiKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBDb25uZWN0T25lRWFyYnVkRW1wdHkpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFNldFNhbXBsZURhdGFiYXNlRW1wdHkoMSwgdGVzdF9hZGRyZXNzMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MwKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIENsb3NlKF8pKS5UaW1lcygxKTsKLSAgQ29ubmVjdExlQXVkaW8odGVzdF9hZGRyZXNzMCk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgQ29ubmVjdE9uZUVhcmJ1ZE5vUGFjcykgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgU2V0U2FtcGxlRGF0YWJhc2VFYXJidWRzVmFsaWQoCi0gICAgICAxLCB0ZXN0X2FkZHJlc3MwLCBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8sCi0gICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8sIHRydWUsIC8qYWRkX2NzaXMqLwotICAgICAgdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFkZF9jYXMqLwotICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFkZF9wYWNzKi8KLSAgICAgIHRydWUgLyphZGRfYXNjcyovKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHRlc3RfYWRkcmVzczApKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgQ2xvc2UoXykpLlRpbWVzKDEpOwotICBDb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBDb25uZWN0T25lRWFyYnVkTm9Bc2NzKSB7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBTZXRTYW1wbGVEYXRhYmFzZUVhcmJ1ZHNWYWxpZCgKLSAgICAgIDEsIHRlc3RfYWRkcmVzczAsIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywKLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywgdHJ1ZSwgLyphZGRfY3NpcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2NhcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX3BhY3MqLwotICAgICAgZmFsc2UgLyphZGRfYXNjcyovKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHRlc3RfYWRkcmVzczApKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgQ2xvc2UoXykpLlRpbWVzKDEpOwotICBDb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBDb25uZWN0T25lRWFyYnVkTm9DYXMpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIHVpbnQxNl90IGNvbm5faWQgPSAxOwotICBTZXRTYW1wbGVEYXRhYmFzZUVhcmJ1ZHNWYWxpZCgKLSAgICAgIGNvbm5faWQsIHRlc3RfYWRkcmVzczAsIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywKLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywgdHJ1ZSwgLyphZGRfY3NpcyovCi0gICAgICBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2NhcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX3BhY3MqLwotICAgICAgdHJ1ZSAvKmFkZF9hc2NzKi8pOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVELCB0ZXN0X2FkZHJlc3MwKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdExlQXVkaW8odGVzdF9hZGRyZXNzMCk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgQ29ubmVjdE9uZUVhcmJ1ZE5vQ3NpcykgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgU2V0U2FtcGxlRGF0YWJhc2VFYXJidWRzVmFsaWQoCi0gICAgICAxLCB0ZXN0X2FkZHJlc3MwLCBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8sCi0gICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8sIGZhbHNlLCAvKmFkZF9jc2lzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2NhcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFkZF9wYWNzKi8KLSAgICAgIHRydWUgLyphZGRfYXNjcyovKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQsIHRlc3RfYWRkcmVzczApKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBDb25uZWN0RGlzY29ubmVjdE9uZUVhcmJ1ZCkgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgU2V0U2FtcGxlRGF0YWJhc2VFYXJidWRzVmFsaWQoMSwgdGVzdF9hZGRyZXNzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8pOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzMCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIENvbm5lY3RMZUF1ZGlvKHRlc3RfYWRkcmVzczApOwotICBEaXNjb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwLCAxKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBDb25uZWN0VHdvRWFyYnVkc0NzaXNHcm91cGVkKSB7Ci0gIHVpbnQ4X3QgZ3JvdXBfc2l6ZSA9IDI7Ci0gIGludCBncm91cF9pZCA9IDI7Ci0KLSAgLy8gUmVwb3J0IHdvcmtpbmcgQ1NJUwotICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgSXNDc2lzQ2xpZW50UnVubmluZygpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAvLyBGaXJzdCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYnRpZl9zdG9yYWdlXywgQWRkTGVhdWRpb0F1dG9jb25uZWN0KHRlc3RfYWRkcmVzczAsIHRydWUpKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0Q3Npc0RldmljZSh0ZXN0X2FkZHJlc3MwLCAxIC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwgZ3JvdXBfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWQsIDEgLyogcmFuayovKTsKLQotICAvLyBTZWNvbmQgZWFyYnVkCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MxLCB0cnVlKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdENzaXNEZXZpY2UodGVzdF9hZGRyZXNzMSwgMiAvKmNvbm5faWQqLywKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodCwgZ3JvdXBfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWQsIDIgLyogcmFuayovLCB0cnVlIC8qY29ubmVjdF90aHJvdWdoX2NzaXMqLyk7Ci0KLSAgLy8gVmVyaWZ5IGdyb3VwaW5nIGluZm9ybWF0aW9uCi0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGRldnMgPQotICAgICAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdldEdyb3VwRGV2aWNlcyhncm91cF9pZCk7Ci0gIEFTU0VSVF9ORShzdGQ6OmZpbmQoZGV2cy5iZWdpbigpLCBkZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MwKSwgZGV2cy5lbmQoKSk7Ci0gIEFTU0VSVF9ORShzdGQ6OmZpbmQoZGV2cy5iZWdpbigpLCBkZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MxKSwgZGV2cy5lbmQoKSk7Ci0KLSAgRGlzY29ubmVjdExlQXVkaW8odGVzdF9hZGRyZXNzMCwgMSk7Ci0gIERpc2Nvbm5lY3RMZUF1ZGlvKHRlc3RfYWRkcmVzczEsIDIpOwotfQotCi1URVNUX0YoVW5pY2FzdFRlc3QsIENvbm5lY3RUd29FYXJidWRzQ3Npc0dyb3VwVW5rbm93bkF0Q29ubmVjdCkgewotICB1aW50OF90IGdyb3VwX3NpemUgPSAyOwotICB1aW50OF90IGdyb3VwX2lkID0gMjsKLQotICAvLyBSZXBvcnQgd29ya2luZyBDU0lTCi0gIE9OX0NBTEwobW9ja19jc2lzX2NsaWVudF9tb2R1bGVfLCBJc0NzaXNDbGllbnRSdW5uaW5nKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4odHJ1ZSkpOwotCi0gIC8vIEZpcnN0IGVhcmJ1ZCBjb25uZWN0cyB3aXRob3V0IGtub3duIGdyb3VwaW5nCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MwLCB0cnVlKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdENzaXNEZXZpY2UodGVzdF9hZGRyZXNzMCwgMSAvKmNvbm5faWQqLywKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQsIGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkLCAxIC8qIHJhbmsqLyk7Ci0KLSAgLy8gU2Vjb25kIGVhcmJ1ZAotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczEgPSBHZXRUZXN0QWRkcmVzcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19idGlmX3N0b3JhZ2VfLCBBZGRMZWF1ZGlvQXV0b2Nvbm5lY3QodGVzdF9hZGRyZXNzMSwgdHJ1ZSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczEsIDIgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsIGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkLCAyIC8qIHJhbmsqLywgdHJ1ZSAvKmNvbm5lY3RfdGhyb3VnaF9jc2lzKi8pOwotCi0gIC8vIFZlcmlmeSBncm91cGluZyBpbmZvcm1hdGlvbgotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBkZXZzID0KLSAgICAgIExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQpOwotICBBU1NFUlRfTkUoc3RkOjpmaW5kKGRldnMuYmVnaW4oKSwgZGV2cy5lbmQoKSwgdGVzdF9hZGRyZXNzMCksIGRldnMuZW5kKCkpOwotICBBU1NFUlRfTkUoc3RkOjpmaW5kKGRldnMuYmVnaW4oKSwgZGV2cy5lbmQoKSwgdGVzdF9hZGRyZXNzMSksIGRldnMuZW5kKCkpOwotCi0gIERpc2Nvbm5lY3RMZUF1ZGlvKHRlc3RfYWRkcmVzczAsIDEpOwotICBEaXNjb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MxLCAyKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0Tm9Jbml0LCBMb2FkU3RvcmVkRWFyYnVkc0NzaXNHcm91cGVkKSB7Ci0gIC8vIFByZXBhcmUgdHdvIGRldmljZXMKLSAgdWludDhfdCBncm91cF9zaXplID0gMjsKLSAgdWludDhfdCBncm91cF9pZCA9IDI7Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFNldFNhbXBsZURhdGFiYXNlRWFyYnVkc1ZhbGlkKAotICAgICAgMSwgdGVzdF9hZGRyZXNzMCwgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LAotICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LCB0cnVlLCAvKmFkZF9jc2lzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfY2FzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfcGFjcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2FzY3MqLwotICAgICAgZ3JvdXBfc2l6ZSwgMSk7Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MxID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIFNldFNhbXBsZURhdGFiYXNlRWFyYnVkc1ZhbGlkKAotICAgICAgMiwgdGVzdF9hZGRyZXNzMSwgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodCwKLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsIHRydWUsIC8qYWRkX2NzaXMqLwotICAgICAgdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfY2FzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX3BhY3MqLwotICAgICAgdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfYXNjcyovCi0gICAgICBncm91cF9zaXplLCAyKTsKLQotICAvLyBMb2FkIGRldmljZXMgZnJvbSB0aGUgc3RvcmFnZSB3aGVuIHN0b3JhZ2UgQVBJIGlzIGNhbGxlZAotICBib29sIGF1dG9jb25uZWN0ID0gdHJ1ZTsKLSAgRVhQRUNUX0NBTEwobW9ja19zdG9yYWdlX2xvYWQsIENhbGwoKSkuV2lsbE9uY2UoWyZdKCkgewotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmTGVBdWRpb0NsaWVudDo6QWRkRnJvbVN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYWRkcmVzczAsIGF1dG9jb25uZWN0KSk7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZMZUF1ZGlvQ2xpZW50OjpBZGRGcm9tU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9hZGRyZXNzMSwgYXV0b2Nvbm5lY3QpKTsKLSAgfSk7Ci0KLSAgLy8gRXhwZWN0IHN0b3JlZCBkZXZpY2UwIHRvIGNvbm5lY3QgYXV0b21hdGljYWxseQotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzMCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIE9OX0NBTEwobW9ja19idG1faW50ZXJmYWNlXywgQlRNX0lzRW5jcnlwdGVkKHRlc3RfYWRkcmVzczAsIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKHRydWUpKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZ2F0dF9pbnRlcmZhY2VfLCBPcGVuKGdhdHRfaWYsIHRlc3RfYWRkcmVzczAsIGZhbHNlLCBfKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICAvLyBFeHBlY3Qgc3RvcmVkIGRldmljZTEgdG8gY29ubmVjdCBhdXRvbWF0aWNhbGx5Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVELCB0ZXN0X2FkZHJlc3MxKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgT05fQ0FMTChtb2NrX2J0bV9pbnRlcmZhY2VfLCBCVE1fSXNFbmNyeXB0ZWQodGVzdF9hZGRyZXNzMSwgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChSZXR1cm4odHJ1ZSkpKTsKLSAgRVhQRUNUX0NBTEwobW9ja19nYXR0X2ludGVyZmFjZV8sIE9wZW4oZ2F0dF9pZiwgdGVzdF9hZGRyZXNzMSwgZmFsc2UsIF8pKQotICAgICAgLlRpbWVzKDEpOwotCi0gIE9OX0NBTEwobW9ja19ncm91cHNfbW9kdWxlXywgR2V0R3JvdXBJZChfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KERvQWxsKFJldHVybihncm91cF9pZCkpKTsKLQotICBPTl9DQUxMKG1vY2tfYnRtX2ludGVyZmFjZV8sCi0gICAgICAgICAgR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0KHRlc3RfYWRkcmVzczAsIE5vdE51bGwoKSwgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDE+KEJUTV9TRUNfRkxBR19FTkNSWVBURUQpLCBSZXR1cm4odHJ1ZSkpKTsKLQotICAvLyBJbml0aWFsaXplCi0gIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgYXBwX3JlZ2lzdGVyX2NhbGxiYWNrOwotICBPTl9DQUxMKG1vY2tfZ2F0dF9pbnRlcmZhY2VfLCBBcHBSZWdpc3RlcihfLCBfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KERvQWxsKFNhdmVBcmc8MD4oJmdhdHRfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZUFyZzwxPigmYXBwX3JlZ2lzdGVyX2NhbGxiYWNrKSkpOwotICBMZUF1ZGlvQ2xpZW50OjpJbml0aWFsaXplKAotICAgICAgJm1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICBiYXNlOjpCaW5kKFtdKE1vY2tGdW5jdGlvbjx2b2lkKCk+KiBmb28pIHsgZm9vLT5DYWxsKCk7IH0sCi0gICAgICAgICAgICAgICAgICZtb2NrX3N0b3JhZ2VfbG9hZCksCi0gICAgICBiYXNlOjpCaW5kKFtdKE1vY2tGdW5jdGlvbjxib29sKCk+KiBmb28pIHsgcmV0dXJuIGZvby0+Q2FsbCgpOyB9LAotICAgICAgICAgICAgICAgICAmbW9ja19oYWxfMl8xX3ZlcmlmaWVyKSk7Ci0gIGlmIChhcHBfcmVnaXN0ZXJfY2FsbGJhY2spIGFwcF9yZWdpc3Rlcl9jYWxsYmFjay5SdW4oZ2F0dF9pZiwgR0FUVF9TVUNDRVNTKTsKLQotICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBzdG9yYWdlIGNhbGxiYWNrIGJlZm9yZSB2ZXJpZnlpbmcgc3R1ZmYKLSAgU3luY09uTWFpbkxvb3AoKTsKLSAgQVNTRVJUX1RSVUUoTGVBdWRpb0NsaWVudDo6SXNMZUF1ZGlvQ2xpZW50UnVubmluZygpKTsKLQotICAvLyBWZXJpZnkgaWYgYWxsIHdlbnQgd2VsbCBhbmQgd2UgZ290IHRoZSBwcm9wZXIgZ3JvdXAKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2cyA9Ci0gICAgICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBEZXZpY2VzKGdyb3VwX2lkKTsKLSAgQVNTRVJUX05FKHN0ZDo6ZmluZChkZXZzLmJlZ2luKCksIGRldnMuZW5kKCksIHRlc3RfYWRkcmVzczApLCBkZXZzLmVuZCgpKTsKLSAgQVNTRVJUX05FKHN0ZDo6ZmluZChkZXZzLmJlZ2luKCksIGRldnMuZW5kKCksIHRlc3RfYWRkcmVzczEpLCBkZXZzLmVuZCgpKTsKLQotICBEaXNjb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwLCAxKTsKLSAgRGlzY29ubmVjdExlQXVkaW8odGVzdF9hZGRyZXNzMSwgMik7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdE5vSW5pdCwgTG9hZFN0b3JlZEVhcmJ1ZHNDc2lzR3JvdXBlZERpZmZlcmVudGx5KSB7Ci0gIC8vIFByZXBhcmUgdHdvIGRldmljZXMKLSAgdWludDhfdCBncm91cF9zaXplID0gMTsKLQotICAvLyBEZXZpY2UgMAotICB1aW50OF90IGdyb3VwX2lkMCA9IDI7Ci0gIGJvb2wgYXV0b2Nvbm5lY3QwID0gdHJ1ZTsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFNldFNhbXBsZURhdGFiYXNlRWFyYnVkc1ZhbGlkKAotICAgICAgMSwgdGVzdF9hZGRyZXNzMCwgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LAotICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LCB0cnVlLCAvKmFkZF9jc2lzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfY2FzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphZGRfcGFjcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2FzY3MqLwotICAgICAgZ3JvdXBfc2l6ZSwgMSk7Ci0KLSAgT05fQ0FMTChtb2NrX2dyb3Vwc19tb2R1bGVfLCBHZXRHcm91cElkKHRlc3RfYWRkcmVzczAsIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKGdyb3VwX2lkMCkpKTsKLQotICAvLyBEZXZpY2UgMQotICB1aW50OF90IGdyb3VwX2lkMSA9IDM7Ci0gIGJvb2wgYXV0b2Nvbm5lY3QxID0gZmFsc2U7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBTZXRTYW1wbGVEYXRhYmFzZUVhcmJ1ZHNWYWxpZCgKLSAgICAgIDIsIHRlc3RfYWRkcmVzczEsIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsCi0gICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LCB0cnVlLCAvKmFkZF9jc2lzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2NhcyovCi0gICAgICB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFkZF9wYWNzKi8KLSAgICAgIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWRkX2FzY3MqLwotICAgICAgZ3JvdXBfc2l6ZSwgMik7Ci0KLSAgT05fQ0FMTChtb2NrX2dyb3Vwc19tb2R1bGVfLCBHZXRHcm91cElkKHRlc3RfYWRkcmVzczEsIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKGdyb3VwX2lkMSkpKTsKLQotICAvLyBMb2FkIGRldmljZXMgZnJvbSB0aGUgc3RvcmFnZSB3aGVuIHN0b3JhZ2UgQVBJIGlzIGNhbGxlZAotICBFWFBFQ1RfQ0FMTChtb2NrX3N0b3JhZ2VfbG9hZCwgQ2FsbCgpKS5XaWxsT25jZShbJl0oKSB7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZMZUF1ZGlvQ2xpZW50OjpBZGRGcm9tU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9hZGRyZXNzMCwgYXV0b2Nvbm5lY3QwKSk7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZMZUF1ZGlvQ2xpZW50OjpBZGRGcm9tU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9hZGRyZXNzMSwgYXV0b2Nvbm5lY3QxKSk7Ci0gIH0pOwotCi0gIC8vIEV4cGVjdCBzdG9yZWQgZGV2aWNlMCB0byBjb25uZWN0IGF1dG9tYXRpY2FsbHkKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQsIHRlc3RfYWRkcmVzczApKQotICAgICAgLlRpbWVzKDEpOwotICBPTl9DQUxMKG1vY2tfYnRtX2ludGVyZmFjZV8sIEJUTV9Jc0VuY3J5cHRlZCh0ZXN0X2FkZHJlc3MwLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KERvQWxsKFJldHVybih0cnVlKSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgT3BlbihnYXR0X2lmLCB0ZXN0X2FkZHJlc3MwLCBmYWxzZSwgXykpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgLy8gRXhwZWN0IHN0b3JlZCBkZXZpY2UxIHRvIE5PVCBjb25uZWN0IGF1dG9tYXRpY2FsbHkKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQsIHRlc3RfYWRkcmVzczEpKQotICAgICAgLlRpbWVzKDApOwotICBPTl9DQUxMKG1vY2tfYnRtX2ludGVyZmFjZV8sIEJUTV9Jc0VuY3J5cHRlZCh0ZXN0X2FkZHJlc3MxLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KERvQWxsKFJldHVybih0cnVlKSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgT3BlbihnYXR0X2lmLCB0ZXN0X2FkZHJlc3MxLCBmYWxzZSwgXykpCi0gICAgICAuVGltZXMoMCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZQotICBCdGFBcHBSZWdpc3RlckNhbGxiYWNrIGFwcF9yZWdpc3Rlcl9jYWxsYmFjazsKLSAgT05fQ0FMTChtb2NrX2dhdHRfaW50ZXJmYWNlXywgQXBwUmVnaXN0ZXIoXywgXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChTYXZlQXJnPDA+KCZnYXR0X2NhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVBcmc8MT4oJmFwcF9yZWdpc3Rlcl9jYWxsYmFjaykpKTsKLSAgTGVBdWRpb0NsaWVudDo6SW5pdGlhbGl6ZSgKLSAgICAgICZtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgYmFzZTo6QmluZChbXShNb2NrRnVuY3Rpb248dm9pZCgpPiogZm9vKSB7IGZvby0+Q2FsbCgpOyB9LAotICAgICAgICAgICAgICAgICAmbW9ja19zdG9yYWdlX2xvYWQpLAotICAgICAgYmFzZTo6QmluZChbXShNb2NrRnVuY3Rpb248Ym9vbCgpPiogZm9vKSB7IHJldHVybiBmb28tPkNhbGwoKTsgfSwKLSAgICAgICAgICAgICAgICAgJm1vY2tfaGFsXzJfMV92ZXJpZmllcikpOwotICBpZiAoYXBwX3JlZ2lzdGVyX2NhbGxiYWNrKSBhcHBfcmVnaXN0ZXJfY2FsbGJhY2suUnVuKGdhdHRfaWYsIEdBVFRfU1VDQ0VTUyk7Ci0KLSAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgc3RvcmFnZSBjYWxsYmFjayBiZWZvcmUgdmVyaWZ5aW5nIHN0dWZmCi0gIFN5bmNPbk1haW5Mb29wKCk7Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9DbGllbnQ6OklzTGVBdWRpb0NsaWVudFJ1bm5pbmcoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2cyA9Ci0gICAgICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBEZXZpY2VzKGdyb3VwX2lkMCk7Ci0gIEFTU0VSVF9ORShzdGQ6OmZpbmQoZGV2cy5iZWdpbigpLCBkZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MwKSwgZGV2cy5lbmQoKSk7Ci0gIEFTU0VSVF9FUShzdGQ6OmZpbmQoZGV2cy5iZWdpbigpLCBkZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MxKSwgZGV2cy5lbmQoKSk7Ci0KLSAgZGV2cyA9IExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQxKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZmluZChkZXZzLmJlZ2luKCksIGRldnMuZW5kKCksIHRlc3RfYWRkcmVzczApLCBkZXZzLmVuZCgpKTsKLSAgQVNTRVJUX05FKHN0ZDo6ZmluZChkZXZzLmJlZ2luKCksIGRldnMuZW5kKCksIHRlc3RfYWRkcmVzczEpLCBkZXZzLmVuZCgpKTsKLQotICBEaXNjb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwLCAxKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBHcm91cGluZ0FkZFJlbW92ZSkgewotICAvLyBFYXJidWQgY29ubmVjdHMgd2l0aG91dCBrbm93biBncm91cGluZwotICB1aW50OF90IGdyb3VwX2lkMCA9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duOwotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MwLCB0cnVlKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdE5vbkNzaXNEZXZpY2UodGVzdF9hZGRyZXNzMCwgMSAvKmNvbm5faWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQpOwotCi0gIGdyb3VwX2lkMCA9IE1vY2tEZXZpY2VHcm91cHM6OkRldmljZUdyb3Vwczo6R2V0KCktPkdldEdyb3VwSWQodGVzdF9hZGRyZXNzMCk7Ci0KLSAgLy8gRWFyYnVkIGNvbm5lY3RzIHdpdGhvdXQga25vd24gZ3JvdXBpbmcKLSAgdWludDhfdCBncm91cF9pZDEgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MxID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYnRpZl9zdG9yYWdlXywgQWRkTGVhdWRpb0F1dG9jb25uZWN0KHRlc3RfYWRkcmVzczEsIHRydWUpKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0Tm9uQ3Npc0RldmljZSh0ZXN0X2FkZHJlc3MxLCAyIC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0KTsKLQotICBncm91cF9pZDEgPSBNb2NrRGV2aWNlR3JvdXBzOjpEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKHRlc3RfYWRkcmVzczEpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2J0aWZfc3RvcmFnZV8pOwotCi0gIC8vIFZlcmlmeSBpbmRpdmlkdWFsIGdyb3VwcwotICBBU1NFUlRfTkUoZ3JvdXBfaWQwLCBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bik7Ci0gIEFTU0VSVF9ORShncm91cF9pZDEsIGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKTsKLSAgQVNTRVJUX05FKGdyb3VwX2lkMCwgZ3JvdXBfaWQxKTsKLSAgQVNTRVJUX0VRKExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQwKS5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQxKS5zaXplKCksIDF1KTsKLQotICAvLyBFeHBlY3RhdGlvbnMgb24gcmVhc3NpZ25pbmcgc2Vjb25kIGVhcmJ1ZCB0byB0aGUgZmlyc3QgZ3JvdXAKLSAgaW50IGRldjFfc3RvcmFnZV9ncm91cCA9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duOwotICBpbnQgZGV2MV9uZXdfZ3JvdXAgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICBPbkdyb3VwTm9kZVN0YXR1cyh0ZXN0X2FkZHJlc3MxLCBncm91cF9pZDEsIEdyb3VwTm9kZVN0YXR1czo6UkVNT1ZFRCkpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uR3JvdXBOb2RlU3RhdHVzKHRlc3RfYWRkcmVzczEsIF8sIEdyb3VwTm9kZVN0YXR1czo6QURERUQpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8MT4oJmRldjFfbmV3X2dyb3VwKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZ3JvdXBzX21vZHVsZV8sIFJlbW92ZURldmljZSh0ZXN0X2FkZHJlc3MxLCBncm91cF9pZDEpKQotICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2dyb3Vwc19tb2R1bGVfLCBBZGREZXZpY2UodGVzdF9hZGRyZXNzMSwgXywgXykpCi0gICAgICAuVGltZXMoQW55TnVtYmVyKCkpOwotCi0gIExlQXVkaW9DbGllbnQ6OkdldCgpLT5Hcm91cFJlbW92ZU5vZGUoZ3JvdXBfaWQxLCB0ZXN0X2FkZHJlc3MxKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19ncm91cHNfbW9kdWxlXyk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19ncm91cHNfbW9kdWxlXywgQWRkRGV2aWNlKHRlc3RfYWRkcmVzczEsIF8sIGdyb3VwX2lkMCkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdyb3VwQWRkTm9kZShncm91cF9pZDAsIHRlc3RfYWRkcmVzczEpOwotICBTeW5jT25NYWluTG9vcCgpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19ncm91cHNfbW9kdWxlXyk7Ci0KLSAgZGV2MV9zdG9yYWdlX2dyb3VwID0KLSAgICAgIE1vY2tEZXZpY2VHcm91cHM6OkRldmljZUdyb3Vwczo6R2V0KCktPkdldEdyb3VwSWQodGVzdF9hZGRyZXNzMSk7Ci0KLSAgLy8gVmVyaWZ5IHJlZ3JvdXBpbmcgcmVzdWx0cwotICBFWFBFQ1RfRVEoZGV2MV9uZXdfZ3JvdXAsIGdyb3VwX2lkMCk7Ci0gIEVYUEVDVF9FUShkZXYxX25ld19ncm91cCwgZGV2MV9zdG9yYWdlX2dyb3VwKTsKLSAgQVNTRVJUX0VRKExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQxKS5zaXplKCksIDB1KTsKLSAgQVNTRVJUX0VRKExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQwKS5zaXplKCksIDJ1KTsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2cyA9Ci0gICAgICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBEZXZpY2VzKGdyb3VwX2lkMCk7Ci0gIEFTU0VSVF9ORShzdGQ6OmZpbmQoZGV2cy5iZWdpbigpLCBkZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MwKSwgZGV2cy5lbmQoKSk7Ci0gIEFTU0VSVF9ORShzdGQ6OmZpbmQoZGV2cy5iZWdpbigpLCBkZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MxKSwgZGV2cy5lbmQoKSk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgR3JvdXBpbmdBZGRUd2ljZU5vUmVtb3ZlKSB7Ci0gIC8vIEVhcmJ1ZCBjb25uZWN0cyB3aXRob3V0IGtub3duIGdyb3VwaW5nCi0gIHVpbnQ4X3QgZ3JvdXBfaWQwID0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd247Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MwLCB0cnVlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oKSkKLSAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0gIENvbm5lY3ROb25Dc2lzRGV2aWNlKHRlc3RfYWRkcmVzczAsIDEgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0KTsKLQotICBncm91cF9pZDAgPSBNb2NrRGV2aWNlR3JvdXBzOjpEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKHRlc3RfYWRkcmVzczApOwotCi0gIC8vIEVhcmJ1ZCBjb25uZWN0cyB3aXRob3V0IGtub3duIGdyb3VwaW5nCi0gIHVpbnQ4X3QgZ3JvdXBfaWQxID0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd247Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MxLCB0cnVlKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oKSkKLSAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0gIENvbm5lY3ROb25Dc2lzRGV2aWNlKHRlc3RfYWRkcmVzczEsIDIgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2J0aWZfc3RvcmFnZV8pOwotCi0gIGdyb3VwX2lkMSA9IE1vY2tEZXZpY2VHcm91cHM6OkRldmljZUdyb3Vwczo6R2V0KCktPkdldEdyb3VwSWQodGVzdF9hZGRyZXNzMSk7Ci0gIC8vIFZlcmlmeSBpbmRpdmlkdWFsIGdyb3VwcwotICBBU1NFUlRfTkUoZ3JvdXBfaWQwLCBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bik7Ci0gIEFTU0VSVF9ORShncm91cF9pZDEsIGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKTsKLSAgQVNTRVJUX05FKGdyb3VwX2lkMCwgZ3JvdXBfaWQxKTsKLSAgQVNTRVJUX0VRKExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQwKS5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQxKS5zaXplKCksIDF1KTsKLQotICAvLyBFeHBlY3RhdGlvbnMgb24gcmVhc3NpZ25pbmcgc2Vjb25kIGVhcmJ1ZCB0byB0aGUgZmlyc3QgZ3JvdXAKLSAgaW50IGRldjFfc3RvcmFnZV9ncm91cCA9IGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duOwotICBpbnQgZGV2MV9uZXdfZ3JvdXAgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICBPbkdyb3VwTm9kZVN0YXR1cyh0ZXN0X2FkZHJlc3MxLCBncm91cF9pZDEsIEdyb3VwTm9kZVN0YXR1czo6UkVNT1ZFRCkpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uR3JvdXBOb2RlU3RhdHVzKHRlc3RfYWRkcmVzczEsIF8sIEdyb3VwTm9kZVN0YXR1czo6QURERUQpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8MT4oJmRldjFfbmV3X2dyb3VwKSk7Ci0KLSAgLy8gRklYTUU6IFdlIHNob3VsZCBleHBlY3QgcmVtb3ZhbCB3aXRoIGdyb3VwX2lkIGNvbnRleHQuIE5vIHN1Y2ggQVBJIGV4aXN0cy4KLSAgRVhQRUNUX0NBTEwobW9ja19ncm91cHNfbW9kdWxlXywgUmVtb3ZlRGV2aWNlKHRlc3RfYWRkcmVzczEsIGdyb3VwX2lkMSkpCi0gICAgICAuVGltZXMoQXRMZWFzdCgxKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZ3JvdXBzX21vZHVsZV8sIEFkZERldmljZSh0ZXN0X2FkZHJlc3MxLCBfLCBfKSkKLSAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZ3JvdXBzX21vZHVsZV8sIEFkZERldmljZSh0ZXN0X2FkZHJlc3MxLCBfLCBncm91cF9pZDApKQotICAgICAgLlRpbWVzKDEpOwotCi0gIC8vIFJlZ3JvdXAgZGV2aWNlOiBhc3NpZ24gbmV3IGdyb3VwIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgZmlyc3Qgb25lCi0gIExlQXVkaW9DbGllbnQ6OkdldCgpLT5Hcm91cEFkZE5vZGUoZ3JvdXBfaWQwLCB0ZXN0X2FkZHJlc3MxKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfZ3JvdXBzX21vZHVsZV8pOwotCi0gIGRldjFfc3RvcmFnZV9ncm91cCA9Ci0gICAgICBNb2NrRGV2aWNlR3JvdXBzOjpEZXZpY2VHcm91cHM6OkdldCgpLT5HZXRHcm91cElkKHRlc3RfYWRkcmVzczEpOwotCi0gIC8vIFZlcmlmeSByZWdyb3VwaW5nIHJlc3VsdHMKLSAgRVhQRUNUX0VRKGRldjFfbmV3X2dyb3VwLCBncm91cF9pZDApOwotICBFWFBFQ1RfRVEoZGV2MV9uZXdfZ3JvdXAsIGRldjFfc3RvcmFnZV9ncm91cCk7Ci0gIEFTU0VSVF9FUShMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBEZXZpY2VzKGdyb3VwX2lkMSkuc2l6ZSgpLCAwdSk7Ci0gIEFTU0VSVF9FUShMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R2V0R3JvdXBEZXZpY2VzKGdyb3VwX2lkMCkuc2l6ZSgpLCAydSk7Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGRldnMgPQotICAgICAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdldEdyb3VwRGV2aWNlcyhncm91cF9pZDApOwotICBBU1NFUlRfTkUoc3RkOjpmaW5kKGRldnMuYmVnaW4oKSwgZGV2cy5lbmQoKSwgdGVzdF9hZGRyZXNzMCksIGRldnMuZW5kKCkpOwotICBBU1NFUlRfTkUoc3RkOjpmaW5kKGRldnMuYmVnaW4oKSwgZGV2cy5lbmQoKSwgdGVzdF9hZGRyZXNzMSksIGRldnMuZW5kKCkpOwotfQotCi1URVNUX0YoVW5pY2FzdFRlc3QsIFJlbW92ZVR3b0VhcmJ1ZHNDc2lzR3JvdXBlZCkgewotICB1aW50OF90IGdyb3VwX3NpemUgPSAyOwotICBpbnQgZ3JvdXBfaWQwID0gMjsKLSAgaW50IGdyb3VwX2lkMSA9IDM7Ci0KLSAgLy8gUmVwb3J0IHdvcmtpbmcgQ1NJUwotICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgSXNDc2lzQ2xpZW50UnVubmluZygpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAvLyBGaXJzdCBncm91cCAtIEZpcnN0IGVhcmJ1ZAotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgRVhQRUNUX0NBTEwobW9ja19idGlmX3N0b3JhZ2VfLCBBZGRMZWF1ZGlvQXV0b2Nvbm5lY3QodGVzdF9hZGRyZXNzMCwgdHJ1ZSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczAsIDEgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZDAsIDEgLyogcmFuayovKTsKLQotICAvLyBGaXJzdCBncm91cCAtIFNlY29uZCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MxID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYnRpZl9zdG9yYWdlXywgQWRkTGVhdWRpb0F1dG9jb25uZWN0KHRlc3RfYWRkcmVzczEsIHRydWUpKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0Q3Npc0RldmljZSh0ZXN0X2FkZHJlc3MxLCAyIC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZDAsIDIgLyogcmFuayovLCB0cnVlIC8qY29ubmVjdF90aHJvdWdoX2NzaXMqLyk7Ci0KLSAgLy8gU2Vjb25kIGdyb3VwIC0gRmlyc3QgZWFyYnVkCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMiA9IEdldFRlc3RBZGRyZXNzKDIpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MyLCB0cnVlKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdENzaXNEZXZpY2UodGVzdF9hZGRyZXNzMiwgMyAvKmNvbm5faWQqLywKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQsIGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkMSwgMSAvKiByYW5rKi8pOwotCi0gIC8vIFNlY29uZCBncm91cCAtIFNlY29uZCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MzID0gR2V0VGVzdEFkZHJlc3MoMyk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYnRpZl9zdG9yYWdlXywgQWRkTGVhdWRpb0F1dG9jb25uZWN0KHRlc3RfYWRkcmVzczMsIHRydWUpKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0Q3Npc0RldmljZSh0ZXN0X2FkZHJlc3MzLCA0IC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZDEsIDIgLyogcmFuayovLCB0cnVlIC8qY29ubmVjdF90aHJvdWdoX2NzaXMqLyk7Ci0KLSAgLy8gRmlyc3QgZ3JvdXAgLSB2ZXJpZnkgZ3JvdXBpbmcgaW5mb3JtYXRpb24KLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZ3JvdXAwX2RldnMgPQotICAgICAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdldEdyb3VwRGV2aWNlcyhncm91cF9pZDApOwotICBBU1NFUlRfTkUoc3RkOjpmaW5kKGdyb3VwMF9kZXZzLmJlZ2luKCksIGdyb3VwMF9kZXZzLmVuZCgpLCB0ZXN0X2FkZHJlc3MwKSwKLSAgICAgICAgICAgIGdyb3VwMF9kZXZzLmVuZCgpKTsKLSAgQVNTRVJUX05FKHN0ZDo6ZmluZChncm91cDBfZGV2cy5iZWdpbigpLCBncm91cDBfZGV2cy5lbmQoKSwgdGVzdF9hZGRyZXNzMSksCi0gICAgICAgICAgICBncm91cDBfZGV2cy5lbmQoKSk7Ci0KLSAgLy8gU2Vjb25kIGdyb3VwIC0gdmVyaWZ5IGdyb3VwaW5nIGluZm9ybWF0aW9uCi0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGdyb3VwMV9kZXZzID0KLSAgICAgIExlQXVkaW9DbGllbnQ6OkdldCgpLT5HZXRHcm91cERldmljZXMoZ3JvdXBfaWQxKTsKLSAgQVNTRVJUX05FKHN0ZDo6ZmluZChncm91cDFfZGV2cy5iZWdpbigpLCBncm91cDFfZGV2cy5lbmQoKSwgdGVzdF9hZGRyZXNzMiksCi0gICAgICAgICAgICBncm91cDFfZGV2cy5lbmQoKSk7Ci0gIEFTU0VSVF9ORShzdGQ6OmZpbmQoZ3JvdXAxX2RldnMuYmVnaW4oKSwgZ3JvdXAxX2RldnMuZW5kKCksIHRlc3RfYWRkcmVzczMpLAotICAgICAgICAgICAgZ3JvdXAxX2RldnMuZW5kKCkpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19idGlmX3N0b3JhZ2VfKTsKLQotICAvLyBFeHBlY3Qgb25lIG9mIHRoZSBncm91cHMgdG8gYmUgZHJvcHBlZCBhbmQgZGV2aWNlcyB0byBiZSBkaXNjb25uZWN0ZWQKLSAgRVhQRUNUX0NBTEwobW9ja19ncm91cHNfbW9kdWxlXywgUmVtb3ZlRGV2aWNlKHRlc3RfYWRkcmVzczAsIGdyb3VwX2lkMCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfZ3JvdXBzX21vZHVsZV8sIFJlbW92ZURldmljZSh0ZXN0X2FkZHJlc3MxLCBncm91cF9pZDApKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICBPbkdyb3VwTm9kZVN0YXR1cyh0ZXN0X2FkZHJlc3MwLCBncm91cF9pZDAsIEdyb3VwTm9kZVN0YXR1czo6UkVNT1ZFRCkpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICBPbkdyb3VwTm9kZVN0YXR1cyh0ZXN0X2FkZHJlc3MxLCBncm91cF9pZDAsIEdyb3VwTm9kZVN0YXR1czo6UkVNT1ZFRCkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzMCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MxKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICAvLyBFeHBlY3QgdGhlIG90aGVyIGdyb3VwcyB0byBiZSBsZWZ0IGFzIGlzCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sIE9uR3JvdXBTdGF0dXMoZ3JvdXBfaWQxLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MyKSkKLSAgICAgIC5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHRlc3RfYWRkcmVzczMpKQotICAgICAgLlRpbWVzKDApOwotCi0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZMZUF1ZGlvQ2xpZW50OjpHcm91cERlc3Ryb3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChMZUF1ZGlvQ2xpZW50OjpHZXQoKSksIGdyb3VwX2lkMCkpOwotCi0gIFN5bmNPbk1haW5Mb29wKCk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2J0aWZfc3RvcmFnZV8pOwotfQotCi1URVNUX0YoVW5pY2FzdFRlc3QsIFJlbW92ZVdoaWxlU3RyZWFtaW5nKSB7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBpbnQgZ3JvdXBfaWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLQotICBTZXRTYW1wbGVEYXRhYmFzZUVhcmJ1ZHNWYWxpZCgKLSAgICAgIDEsIHRlc3RfYWRkcmVzczAsIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywKLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywgZmFsc2UgLyphZGRfY3NpcyovLAotICAgICAgdHJ1ZSAvKmFkZF9jYXMqLywgdHJ1ZSAvKmFkZF9wYWNzKi8sIHRydWUgLyphZGRfYXNjcyovLCAxIC8qc2V0X3NpemUqLywKLSAgICAgIDAgLypyYW5rKi8pOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzMCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uR3JvdXBOb2RlU3RhdHVzKHRlc3RfYWRkcmVzczAsIF8sIEdyb3VwTm9kZVN0YXR1czo6QURERUQpKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MT4oJmdyb3VwX2lkKSkpOwotCi0gIENvbm5lY3RMZUF1ZGlvKHRlc3RfYWRkcmVzczApOwotICBBU1NFUlRfTkUoZ3JvdXBfaWQsIGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKTsKLQotICAvLyBTdGFydCBzdHJlYW1pbmcKLSAgdWludDhfdCBjaXNfY291bnRfb3V0ID0gMTsKLSAgdWludDhfdCBjaXNfY291bnRfaW4gPSAwOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RhcnQoXywgXykpLlRpbWVzKDEpOwotICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R3JvdXBTZXRBY3RpdmUoZ3JvdXBfaWQpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sIFN0YXJ0U3RyZWFtKF8sIF8pKS5UaW1lcygxKTsKLQotICBTdGFydFN0cmVhbWluZyhBVURJT19VU0FHRV9NRURJQSwgQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBncm91cF9pZCk7Ci0KLSAgU3luY09uTWFpbkxvb3AoKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfc3RhdGVfbWFjaGluZV8pOwotICBTeW5jT25NYWluTG9vcCgpOwotCi0gIC8vIFZlcmlmeSBEYXRhIHRyYW5zZmVyIG9uIG9uZSBhdWRpbyBzb3VyY2UgY2lzCi0gIFRlc3RBdWRpb0RhdGFUcmFuc2Zlcihncm91cF9pZCwgY2lzX2NvdW50X291dCwgY2lzX2NvdW50X2luLCAxOTIwKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2dyb3Vwc19tb2R1bGVfLCBSZW1vdmVEZXZpY2UodGVzdF9hZGRyZXNzMCwgZ3JvdXBfaWQpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTChtb2NrX3N0YXRlX21hY2hpbmVfLCBQcm9jZXNzSGNpTm90aWZBY2xEaXNjb25uZWN0ZWQoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmZ3JvdXApKSk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgIE9uR3JvdXBOb2RlU3RhdHVzKHRlc3RfYWRkcmVzczAsIGdyb3VwX2lkLCBHcm91cE5vZGVTdGF0dXM6OlJFTU9WRUQpKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzMCkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPlJlbW92ZURldmljZSh0ZXN0X2FkZHJlc3MwKTsKLQotICBTeW5jT25NYWluTG9vcCgpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19ncm91cHNfbW9kdWxlXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX3N0YXRlX21hY2hpbmVfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotCi0gIEFTU0VSVF9ORShncm91cCwgbnVsbHB0cik7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgU3BlYWtlclN0cmVhbWluZykgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgaW50IGdyb3VwX2lkID0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd247Ci0KLSAgU2V0U2FtcGxlRGF0YWJhc2VFYXJidWRzVmFsaWQoCi0gICAgICAxLCB0ZXN0X2FkZHJlc3MwLCBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8sCi0gICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25TdGVyZW8sIGZhbHNlIC8qYWRkX2NzaXMqLywKLSAgICAgIHRydWUgLyphZGRfY2FzKi8sIHRydWUgLyphZGRfcGFjcyovLCB0cnVlIC8qYWRkX2FzY3MqLywgMSAvKnNldF9zaXplKi8sCi0gICAgICAwIC8qcmFuayovKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGllbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQsIHRlc3RfYWRkcmVzczApKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkdyb3VwTm9kZVN0YXR1cyh0ZXN0X2FkZHJlc3MwLCBfLCBHcm91cE5vZGVTdGF0dXM6OkFEREVEKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDE+KCZncm91cF9pZCkpKTsKLQotICBDb25uZWN0TGVBdWRpbyh0ZXN0X2FkZHJlc3MwKTsKLSAgQVNTRVJUX05FKGdyb3VwX2lkLCBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bik7Ci0KLSAgLy8gU3RhcnQgc3RyZWFtaW5nCi0gIHVpbnQ4X3QgY2lzX2NvdW50X291dCA9IDE7Ci0gIHVpbnQ4X3QgY2lzX2NvdW50X2luID0gMDsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdyb3VwU2V0QWN0aXZlKGdyb3VwX2lkKTsKLQotICBTdGFydFN0cmVhbWluZyhBVURJT19VU0FHRV9NRURJQSwgQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBncm91cF9pZCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLQotICAvLyBWZXJpZnkgRGF0YSB0cmFuc2ZlciBvbiBvbmUgYXVkaW8gc291cmNlIGNpcwotICBUZXN0QXVkaW9EYXRhVHJhbnNmZXIoZ3JvdXBfaWQsIGNpc19jb3VudF9vdXQsIGNpc19jb3VudF9pbiwgMTkyMCk7Ci0KLSAgLy8gU3VzcGVuZAotICAvKlRPRE8gTmVlZCBhIHdheSB0byB2ZXJpZnkgU1RPUCAqLwotICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R3JvdXBTdXNwZW5kKGdyb3VwX2lkKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLQotICAvLyBSZXN1bWUKLSAgU3RhcnRTdHJlYW1pbmcoQVVESU9fVVNBR0VfTUVESUEsIEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgZ3JvdXBfaWQpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19jbGllbnRfY2FsbGJhY2tzXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NvdXJjZV8pOwotCi0gIC8vIFN0b3AKLSAgU3RvcFN0cmVhbWluZyhncm91cF9pZCk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2NsaWVudF9jYWxsYmFja3NfKTsKLQotICAvLyBSZWxlYXNlCi0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RvcCgpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBSZWxlYXNlKF8pKS5UaW1lcygxKTsKLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdyb3VwU2V0QWN0aXZlKGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc291cmNlXyk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgU3BlYWtlclN0cmVhbWluZ0F1dG9ub21vdXNSZWxlYXNlKSB7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBpbnQgZ3JvdXBfaWQgPSBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bjsKLQotICBTZXRTYW1wbGVEYXRhYmFzZUVhcmJ1ZHNWYWxpZCgKLSAgICAgIDEsIHRlc3RfYWRkcmVzczAsIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywKLSAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvblN0ZXJlbywgZmFsc2UgLyphZGRfY3NpcyovLAotICAgICAgdHJ1ZSAvKmFkZF9jYXMqLywgdHJ1ZSAvKmFkZF9wYWNzKi8sIHRydWUgLyphZGRfYXNjcyovLCAxIC8qc2V0X3NpemUqLywKLSAgICAgIDAgLypyYW5rKi8pOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsaWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzMCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xpZW50X2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIE9uR3JvdXBOb2RlU3RhdHVzKHRlc3RfYWRkcmVzczAsIF8sIEdyb3VwTm9kZVN0YXR1czo6QURERUQpKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MT4oJmdyb3VwX2lkKSkpOwotCi0gIENvbm5lY3RMZUF1ZGlvKHRlc3RfYWRkcmVzczApOwotICBBU1NFUlRfTkUoZ3JvdXBfaWQsIGJsdWV0b290aDo6Z3JvdXBzOjprR3JvdXBVbmtub3duKTsKLQotICAvLyBTdGFydCBzdHJlYW1pbmcKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBTdGFydChfLCBfKSkuVGltZXMoMSk7Ci0gIExlQXVkaW9DbGllbnQ6OkdldCgpLT5Hcm91cFNldEFjdGl2ZShncm91cF9pZCk7Ci0KLSAgU3RhcnRTdHJlYW1pbmcoQVVESU9fVVNBR0VfTUVESUEsIEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgZ3JvdXBfaWQpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2NsaWVudF9jYWxsYmFja3NfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc291cmNlXyk7Ci0gIFN5bmNPbk1haW5Mb29wKCk7Ci0KLSAgLy8gVmVyaWZ5IERhdGEgdHJhbnNmZXIgb24gb25lIGF1ZGlvIHNvdXJjZSBjaXMKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCAxIC8qIGNpc19jb3VudF9vdXQgKi8sIDAgLyogY2lzX2NvdW50X2luICovLAotICAgICAgICAgICAgICAgICAgICAgICAgMTkyMCk7Ci0KLSAgLy8gSW5qZWN0IHRoZSBJRExFIHN0YXRlIGFzIGlmIGFuIGF1dG9ub21vdXMgcmVsZWFzZSBoYXBwZW5lZAotICBhdXRvIGdyb3VwID0gc3RyZWFtaW5nX2dyb3Vwcy5hdChncm91cF9pZCk7Ci0gIEFTU0VSVF9ORShncm91cCwgbnVsbHB0cik7Ci0gIGZvciAoTGVBdWRpb0RldmljZSogZGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7IGRldmljZSAhPSBudWxscHRyOwotICAgICAgIGRldmljZSA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGRldmljZSkpIHsKLSAgICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICAgIGFzZS5kYXRhX3BhdGhfc3RhdGUgPSB0eXBlczo6QXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpJRExFOwotICAgICAgYXNlLnN0YXRlID0gdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEU7Ci0gICAgICBJbmplY3RDaXNEaXNjb25uZWN0ZWQoZ3JvdXBfaWQsIGFzZS5jaXNfY29ubl9oZGwpOwotICAgIH0KLSAgfQotCi0gIC8vIFZlcmlmeSBubyBEYXRhIHRyYW5zZmVyIGFmdGVyIHRoZSBhdXRvbm9tb3VzIHJlbGVhc2UKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCAwIC8qIGNpc19jb3VudF9vdXQgKi8sIDAgLyogY2lzX2NvdW50X2luICovLAotICAgICAgICAgICAgICAgICAgICAgICAgMTkyMCk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgVHdvRWFyYnVkc1N0cmVhbWluZykgewotICB1aW50OF90IGdyb3VwX3NpemUgPSAyOwotICBpbnQgZ3JvdXBfaWQgPSAyOwotCi0gIC8vIFJlcG9ydCB3b3JraW5nIENTSVMKLSAgT05fQ0FMTChtb2NrX2NzaXNfY2xpZW50X21vZHVsZV8sIElzQ3Npc0NsaWVudFJ1bm5pbmcoKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7Ci0KLSAgLy8gRmlyc3QgZWFyYnVkCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MwLCB0cnVlKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdENzaXNEZXZpY2UodGVzdF9hZGRyZXNzMCwgMSAvKmNvbm5faWQqLywKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQsIGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkLCAxIC8qIHJhbmsqLyk7Ci0KLSAgLy8gU2Vjb25kIGVhcmJ1ZAotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczEgPSBHZXRUZXN0QWRkcmVzcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19idGlmX3N0b3JhZ2VfLCBBZGRMZWF1ZGlvQXV0b2Nvbm5lY3QodGVzdF9hZGRyZXNzMSwgdHJ1ZSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczEsIDIgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsIGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkLCAyIC8qIHJhbmsqLywgdHJ1ZSAvKmNvbm5lY3RfdGhyb3VnaF9jc2lzKi8pOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RhcnQoXywgXykpLlRpbWVzKDEpOwotICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R3JvdXBTZXRBY3RpdmUoZ3JvdXBfaWQpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLQotICAvLyBTdGFydCBzdHJlYW1pbmcgd2l0aCByZWNvbmZpZ3VyYXRpb24gZnJvbSBkZWZhdWx0IG1lZGlhIHN0cmVhbSBzZXR1cAotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCkpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0b3AoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc2lua18sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLQotICBTdGFydFN0cmVhbWluZyhBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19DT05URU5UX1RZUEVfU1BFRUNILAotICAgICAgICAgICAgICAgICBncm91cF9pZCwgdHJ1ZSAvKiByZWNvbmZpZ3VyZSAqLyk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc2lua18pOwotICBTeW5jT25NYWluTG9vcCgpOwotCi0gIC8vIFZlcmlmeSBEYXRhIHRyYW5zZmVyIG9uIHR3byBwZWVyIHNpbmtzIGFuZCBvbmUgc291cmNlCi0gIHVpbnQ4X3QgY2lzX2NvdW50X291dCA9IDI7Ci0gIHVpbnQ4X3QgY2lzX2NvdW50X2luID0gMTsKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCBjaXNfY291bnRfb3V0LCBjaXNfY291bnRfaW4sIDY0MCk7Ci0KLSAgLy8gU3VzcGVuZAotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFJlbGVhc2UoXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBSZWxlYXNlKF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBTdG9wKCkpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBTdG9wKCkpLlRpbWVzKDApOwotICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R3JvdXBTdXNwZW5kKGdyb3VwX2lkKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc291cmNlXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NpbmtfKTsKLQotICAvLyBSZXN1bWUKLSAgU3RhcnRTdHJlYW1pbmcoQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwKLSAgICAgICAgICAgICAgICAgZ3JvdXBfaWQpOwotICBTeW5jT25NYWluTG9vcCgpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc2lua18pOwotCi0gIC8vIFZlcmlmeSBEYXRhIHRyYW5zZmVyIHN0aWxsIHdvcmtzCi0gIFRlc3RBdWRpb0RhdGFUcmFuc2Zlcihncm91cF9pZCwgY2lzX2NvdW50X291dCwgY2lzX2NvdW50X2luLCA2NDApOwotCi0gIC8vIFN0b3AKLSAgU3RvcFN0cmVhbWluZyhncm91cF9pZCwgdHJ1ZSk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2NsaWVudF9jYWxsYmFja3NfKTsKLQotICAvLyBSZWxlYXNlCi0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RvcCgpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBSZWxlYXNlKF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zaW5rXywgU3RvcCgpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zaW5rXywgUmVsZWFzZShfKSkuVGltZXMoMSk7Ci0gIExlQXVkaW9DbGllbnQ6OkdldCgpLT5Hcm91cFNldEFjdGl2ZShibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93bik7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NvdXJjZV8pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zaW5rXyk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgVHdvRWFyYnVkc1N0cmVhbWluZ0NvbnRleHRTd2l0Y2hTaW1wbGUpIHsKLSAgdWludDhfdCBncm91cF9zaXplID0gMjsKLSAgaW50IGdyb3VwX2lkID0gMjsKLQotICAvLyBSZXBvcnQgd29ya2luZyBDU0lTCi0gIE9OX0NBTEwobW9ja19jc2lzX2NsaWVudF9tb2R1bGVfLCBJc0NzaXNDbGllbnRSdW5uaW5nKCkpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4odHJ1ZSkpOwotCi0gIC8vIEZpcnN0IGVhcmJ1ZAotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzczAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgRVhQRUNUX0NBTEwobW9ja19idGlmX3N0b3JhZ2VfLCBBZGRMZWF1ZGlvQXV0b2Nvbm5lY3QodGVzdF9hZGRyZXNzMCwgdHJ1ZSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczAsIDEgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZCwgMSAvKiByYW5rKi8pOwotCi0gIC8vIFNlY29uZCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MxID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYnRpZl9zdG9yYWdlXywgQWRkTGVhdWRpb0F1dG9jb25uZWN0KHRlc3RfYWRkcmVzczEsIHRydWUpKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0Q3Npc0RldmljZSh0ZXN0X2FkZHJlc3MxLCAyIC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZCwgMiAvKiByYW5rKi8sIHRydWUgLypjb25uZWN0X3Rocm91Z2hfY3NpcyovKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdyb3VwU2V0QWN0aXZlKGdyb3VwX2lkKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc291cmNlXyk7Ci0KLSAgLy8gU3RhcnQgc3RyZWFtaW5nIHdpdGggcmVjb25maWd1cmF0aW9uIGZyb20gZGVmYXVsdCBtZWRpYSBzdHJlYW0gc2V0dXAKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX3N0YXRlX21hY2hpbmVfLAotICAgICAgU3RhcnRTdHJlYW0oXywgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU6Ok5PVElGSUNBVElPTlMpKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCkpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0b3AoKSkuVGltZXMoMSk7Ci0KLSAgU3RhcnRTdHJlYW1pbmcoQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgIHRydWUgLyogcmVjb25maWd1cmUgKi8pOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2NsaWVudF9jYWxsYmFja3NfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc291cmNlXyk7Ci0gIFN5bmNPbk1haW5Mb29wKCk7Ci0KLSAgLy8gRG8gYSBjb250ZW50IHN3aXRjaCB0byBBTEVSVFMKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBSZWxlYXNlKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBTdG9wKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBTdGFydCkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc3RhdGVfbWFjaGluZV8sCi0gICAgICAgICAgICAgIFN0YXJ0U3RyZWFtKF8sIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlOjpBTEVSVFMpKQotICAgICAgLlRpbWVzKDEpOwotICBVcGRhdGVNZXRhZGF0YShBVURJT19VU0FHRV9BTEFSTSwgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19jbGllbnRfY2FsbGJhY2tzXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NvdXJjZV8pOwotCi0gIC8vIERvIGEgY29udGVudCBzd2l0Y2ggdG8gRU1FUkdFTkNZCi0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgUmVsZWFzZSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RvcCkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RhcnQpLlRpbWVzKDApOwotCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19zdGF0ZV9tYWNoaW5lXywKLSAgICAgIFN0YXJ0U3RyZWFtKF8sIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlOjpFTUVSR0VOQ1lBTEFSTSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIFVwZGF0ZU1ldGFkYXRhKEFVRElPX1VTQUdFX0VNRVJHRU5DWSwgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLX0KLQotVEVTVF9GKFVuaWNhc3RUZXN0LCBUd29FYXJidWRzU3RyZWFtaW5nQ29udGV4dFN3aXRjaFJlY29uZmlndXJlKSB7Ci0gIHVpbnQ4X3QgZ3JvdXBfc2l6ZSA9IDI7Ci0gIGludCBncm91cF9pZCA9IDI7Ci0KLSAgLy8gUmVwb3J0IHdvcmtpbmcgQ1NJUwotICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgSXNDc2lzQ2xpZW50UnVubmluZygpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAvLyBGaXJzdCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYnRpZl9zdG9yYWdlXywgQWRkTGVhdWRpb0F1dG9jb25uZWN0KHRlc3RfYWRkcmVzczAsIHRydWUpKQotICAgICAgLlRpbWVzKDEpOwotICBDb25uZWN0Q3Npc0RldmljZSh0ZXN0X2FkZHJlc3MwLCAxIC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwgZ3JvdXBfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWQsIDEgLyogcmFuayovKTsKLQotICAvLyBTZWNvbmQgZWFyYnVkCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2J0aWZfc3RvcmFnZV8sIEFkZExlYXVkaW9BdXRvY29ubmVjdCh0ZXN0X2FkZHJlc3MxLCB0cnVlKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgQ29ubmVjdENzaXNEZXZpY2UodGVzdF9hZGRyZXNzMSwgMiAvKmNvbm5faWQqLywKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodCwgZ3JvdXBfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWQsIDIgLyogcmFuayovLCB0cnVlIC8qY29ubmVjdF90aHJvdWdoX2NzaXMqLyk7Ci0KLSAgLy8gU3RhcnQgc3RyZWFtaW5nIE1FRElBCi0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgU3RhcnQoXywgXykpLlRpbWVzKDEpOwotICBMZUF1ZGlvQ2xpZW50OjpHZXQoKS0+R3JvdXBTZXRBY3RpdmUoZ3JvdXBfaWQpOwotCi0gIFN0YXJ0U3RyZWFtaW5nKEFVRElPX1VTQUdFX01FRElBLCBBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIGdyb3VwX2lkKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19jbGllbnRfY2FsbGJhY2tzXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NvdXJjZV8pOwotICBTeW5jT25NYWluTG9vcCgpOwotCi0gIC8vIFZlcmlmeSBEYXRhIHRyYW5zZmVyIG9uIHR3byBwZWVyIHNpbmtzCi0gIHVpbnQ4X3QgY2lzX2NvdW50X291dCA9IDI7Ci0gIHVpbnQ4X3QgY2lzX2NvdW50X2luID0gMDsKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCBjaXNfY291bnRfb3V0LCBjaXNfY291bnRfaW4sIDE5MjApOwotCi0gIC8vIFN0b3AKLSAgU3RvcFN0cmVhbWluZyhncm91cF9pZCk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2NsaWVudF9jYWxsYmFja3NfKTsKLQotICAvLyBTdGFydCBzdHJlYW1pbmcKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBTdGFydChfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXVkaW9fc291cmNlXywgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwobW9ja19hdWRpb19zb3VyY2VfLCBTdG9wKCkpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NpbmtfLCBTdGFydChfLCBfKSkuVGltZXMoMSk7Ci0gIExlQXVkaW9DbGllbnQ6OkdldCgpLT5Hcm91cFNldEFjdGl2ZShncm91cF9pZCk7Ci0KLSAgU3RhcnRTdHJlYW1pbmcoQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwKLSAgICAgICAgICAgICAgICAgZ3JvdXBfaWQsIHRydWUgLyogcmVjb25maWd1cmUgKi8pOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2NsaWVudF9jYWxsYmFja3NfKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfYXVkaW9fc291cmNlXyk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2F1ZGlvX3NpbmtfKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLQotICAvLyBWZXJpZnkgRGF0YSB0cmFuc2ZlciBvbiB0d28gcGVlciBzaW5rcyBhbmQgb25lIHNvdXJjZQotICBjaXNfY291bnRfb3V0ID0gMjsKLSAgY2lzX2NvdW50X2luID0gMTsKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCBjaXNfY291bnRfb3V0LCBjaXNfY291bnRfaW4sIDY0MCk7Ci19Ci0KLVRFU1RfRihVbmljYXN0VGVzdCwgVHdvRWFyYnVkczJuZExhdGVDb25uZWN0KSB7Ci0gIHVpbnQ4X3QgZ3JvdXBfc2l6ZSA9IDI7Ci0gIGludCBncm91cF9pZCA9IDI7Ci0KLSAgLy8gUmVwb3J0IHdvcmtpbmcgQ1NJUwotICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgSXNDc2lzQ2xpZW50UnVubmluZygpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAvLyBGaXJzdCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczAsIDEgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZCwgMSAvKiByYW5rKi8pOwotCi0gIC8vIFN0YXJ0IHN0cmVhbWluZwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdyb3VwU2V0QWN0aXZlKGdyb3VwX2lkKTsKLQotICBTdGFydFN0cmVhbWluZyhBVURJT19VU0FHRV9NRURJQSwgQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBncm91cF9pZCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLQotICAvLyBFeHBlY3Qgb25lIGlzbyBjaGFubmVsIHRvIGJlIGZlZCB3aXRoIGRhdGEKLSAgdWludDhfdCBjaXNfY291bnRfb3V0ID0gMTsKLSAgdWludDhfdCBjaXNfY291bnRfaW4gPSAwOwotICBUZXN0QXVkaW9EYXRhVHJhbnNmZXIoZ3JvdXBfaWQsIGNpc19jb3VudF9vdXQsIGNpc19jb3VudF9pbiwgMTkyMCk7Ci0KLSAgLy8gU2Vjb25kIGVhcmJ1ZCBjb25uZWN0cyBkdXJpbmcgc3RyZWFtCi0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBDb25uZWN0Q3Npc0RldmljZSh0ZXN0X2FkZHJlc3MxLCAyIC8qY29ubl9pZCovLAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZCwgMiAvKiByYW5rKi8sIHRydWUgLypjb25uZWN0X3Rocm91Z2hfY3NpcyovKTsKLQotICAvKiBXZSBzaG91bGQgZXhwZWN0IHR3byBpc28gY2hhbm5lbHMgdG8gYmUgZmVkIHdpdGggZGF0YSwgYnV0IGZvciBub3csIHdoZW4KLSAgICogc2Vjb25kIGRldmljZSBpcyBjb25uZWN0ZWQgbGF0ZXIsIHdlIGp1c3QgY29udGludWUgc3RyZWFtIHRvIG9uZSBkZXZpY2UuCi0gICAqIFRPRE86IGltcHJvdmUgaXQuCi0gICAqLwotICBjaXNfY291bnRfb3V0ID0gMTsKLSAgY2lzX2NvdW50X2luID0gMDsKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCBjaXNfY291bnRfb3V0LCBjaXNfY291bnRfaW4sIDE5MjApOwotfQotCi1URVNUX0YoVW5pY2FzdFRlc3QsIFR3b0VhcmJ1ZHMybmREaXNjb25uZWN0KSB7Ci0gIHVpbnQ4X3QgZ3JvdXBfc2l6ZSA9IDI7Ci0gIGludCBncm91cF9pZCA9IDI7Ci0KLSAgLy8gUmVwb3J0IHdvcmtpbmcgQ1NJUwotICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgSXNDc2lzQ2xpZW50UnVubmluZygpKQotICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAvLyBGaXJzdCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MwID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczAsIDEgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0LCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICBncm91cF9pZCwgMSAvKiByYW5rKi8pOwotCi0gIC8vIFNlY29uZCBlYXJidWQKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MxID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIENvbm5lY3RDc2lzRGV2aWNlKHRlc3RfYWRkcmVzczEsIDIgLypjb25uX2lkKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQsIGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkLCAyIC8qIHJhbmsqLywgdHJ1ZSAvKmNvbm5lY3RfdGhyb3VnaF9jc2lzKi8pOwotCi0gIC8vIFN0YXJ0IHN0cmVhbWluZwotICBFWFBFQ1RfQ0FMTChtb2NrX2F1ZGlvX3NvdXJjZV8sIFN0YXJ0KF8sIF8pKS5UaW1lcygxKTsKLSAgTGVBdWRpb0NsaWVudDo6R2V0KCktPkdyb3VwU2V0QWN0aXZlKGdyb3VwX2lkKTsKLQotICBTdGFydFN0cmVhbWluZyhBVURJT19VU0FHRV9NRURJQSwgQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBncm91cF9pZCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfY2xpZW50X2NhbGxiYWNrc18pOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19hdWRpb19zb3VyY2VfKTsKLSAgU3luY09uTWFpbkxvb3AoKTsKLQotICAvLyBFeHBlY3QgdHdvIGlzbyBjaGFubmVscyB0byBiZSBmZWQgd2l0aCBkYXRhCi0gIHVpbnQ4X3QgY2lzX2NvdW50X291dCA9IDI7Ci0gIHVpbnQ4X3QgY2lzX2NvdW50X2luID0gMDsKLSAgVGVzdEF1ZGlvRGF0YVRyYW5zZmVyKGdyb3VwX2lkLCBjaXNfY291bnRfb3V0LCBjaXNfY291bnRfaW4sIDE5MjApOwotCi0gIC8vIERpc2Nvbm5lY3Qgb25lIGRldmljZSBhbmQgZXhwZWN0IHRoZSBncm91cCB0byBrZWVwIG9uIHN0cmVhbWluZwotICBFWFBFQ1RfQ0FMTChtb2NrX3N0YXRlX21hY2hpbmVfLCBTdG9wU3RyZWFtKF8pKS5UaW1lcygwKTsKLSAgYXV0byBncm91cCA9IHN0cmVhbWluZ19ncm91cHMuYXQoZ3JvdXBfaWQpOwotICBhdXRvIGRldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICBJbmplY3RDaXNEaXNjb25uZWN0ZWQoZ3JvdXBfaWQsIGFzZS5jaXNfY29ubl9oZGwpOwotICB9Ci0gIERpc2Nvbm5lY3RMZUF1ZGlvKGRldmljZS0+YWRkcmVzc18sIDEpOwotICBTeW5jT25NYWluTG9vcCgpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbW9ja19jbGllbnRfY2FsbGJhY2tzXyk7Ci0KLSAgLy8gRXhwZWN0IG9uZSBjaGFubmVsIElTTyBEYXRhIHRvIGJlIHNlbnQKLSAgY2lzX2NvdW50X291dCA9IDE7Ci0gIGNpc19jb3VudF9pbiA9IDA7Ci0gIFRlc3RBdWRpb0RhdGFUcmFuc2Zlcihncm91cF9pZCwgY2lzX2NvdW50X291dCwgY2lzX2NvdW50X2luLCAxOTIwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9sZV9hdWRpb190eXBlcy5jYyBiL2J0YS9sZV9hdWRpby9sZV9hdWRpb190eXBlcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0ZDFhZi4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vbGVfYXVkaW9fdHlwZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgQmFzaWMgQXVkaW8gUHJvZmlsZSAvIEF1ZGlvIFN0cmVhbSBDb250cm9sCi0gKiBhbmQgUHVibGlzaGVkIEF1ZGlvIENhcGFiaWxpdGllcyBkZWZpbml0aW9ucywgc3RydWN0dXJlcyBldGMuCi0gKi8KLQotI2luY2x1ZGUgImxlX2F1ZGlvX3R5cGVzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotCi0jaW5jbHVkZSAiYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgImNsaWVudF9hdWRpby5oIgotI2luY2x1ZGUgImNsaWVudF9wYXJzZXIuaCIKLQotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLXVzaW5nIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU7Ci0KLW5hbWVzcGFjZSBzZXRfY29uZmlndXJhdGlvbnMgewotdXNpbmcgc2V0X2NvbmZpZ3VyYXRpb25zOjpDb2RlY0NhcGFiaWxpdHlTZXR0aW5nOwotdXNpbmcgdHlwZXM6OmFjc19hY19yZWNvcmQ7Ci11c2luZyB0eXBlczo6a0xlQXVkaW9Db2RpbmdGb3JtYXRMQzM7Ci11c2luZyB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rOwotdXNpbmcgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlOwotdXNpbmcgdHlwZXM6OkxlQXVkaW9MYzNDb25maWc7Ci0KLXN0YXRpYyB1aW50OF90IG1pbl9yZXFfZGV2aWNlc19jbnQoCi0gICAgY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uKiBhdWRpb19zZXRfY29uZikgewotICBzdGQ6OnBhaXI8dWludDhfdCAvKiBzaW5rICovLCB1aW50OF90IC8qIHNvdXJjZSAqLz4gc25rX3NyY19wYWlyKDAsIDApOwotCi0gIGZvciAoYXV0byBlbnQgOiAoKmF1ZGlvX3NldF9jb25mKS5jb25mcykgewotICAgIGlmIChlbnQuZGlyZWN0aW9uID09IGtMZUF1ZGlvRGlyZWN0aW9uU2luaykKLSAgICAgIHNua19zcmNfcGFpci5maXJzdCArPSBlbnQuZGV2aWNlX2NudDsKLSAgICBpZiAoZW50LmRpcmVjdGlvbiA9PSBrTGVBdWRpb0RpcmVjdGlvblNvdXJjZSkKLSAgICAgIHNua19zcmNfcGFpci5zZWNvbmQgKz0gZW50LmRldmljZV9jbnQ7Ci0gIH0KLQotICByZXR1cm4gc3RkOjptYXgoc25rX3NyY19wYWlyLmZpcnN0LCBzbmtfc3JjX3BhaXIuc2Vjb25kKTsKLX0KLQotc3RhdGljIHVpbnQ4X3QgbWluX3JlcV9kZXZpY2VzX2NudCgKLSAgICBjb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb25zKiBhdWRpb19zZXRfY29uZnMpIHsKLSAgdWludDhfdCBjdXJyX21pbl9yZXFfZGV2aWNlc19jbnQgPSAweGZmOwotCi0gIGZvciAoYXV0byBlbnQgOiAqYXVkaW9fc2V0X2NvbmZzKSB7Ci0gICAgdWludDhfdCByZXFfZGV2aWNlc19jbnQgPSBtaW5fcmVxX2RldmljZXNfY250KGVudCk7Ci0gICAgaWYgKHJlcV9kZXZpY2VzX2NudCA8IGN1cnJfbWluX3JlcV9kZXZpY2VzX2NudCkKLSAgICAgIGN1cnJfbWluX3JlcV9kZXZpY2VzX2NudCA9IHJlcV9kZXZpY2VzX2NudDsKLSAgfQotCi0gIHJldHVybiBjdXJyX21pbl9yZXFfZGV2aWNlc19jbnQ7Ci19Ci0KLWJvb2wgY2hlY2tfaWZfbWF5X2NvdmVyX3NjZW5hcmlvKGNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbnMqIGF1ZGlvX3NldF9jb25mcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfc2l6ZSkgewotICBpZiAoIWF1ZGlvX3NldF9jb25mcykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgbm8gYXVkaW8gcmVxdWlyZW1lbnRzIGZvciBncm91cCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIGdyb3VwX3NpemUgPj0gbWluX3JlcV9kZXZpY2VzX2NudChhdWRpb19zZXRfY29uZnMpOwotfQotCi1ib29sIGNoZWNrX2lmX21heV9jb3Zlcl9zY2VuYXJpbyhjb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24qIGF1ZGlvX3NldF9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBncm91cF9zaXplKSB7Ci0gIGlmICghYXVkaW9fc2V0X2NvbmYpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIG5vIGF1ZGlvIHJlcXVpcmVtZW50IGZvciBncm91cCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIGdyb3VwX3NpemUgPj0gbWluX3JlcV9kZXZpY2VzX2NudChhdWRpb19zZXRfY29uZik7Ci19Ci0KLXN0YXRpYyBib29sIElzQ29kZWNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHR5cGVzOjpMZUF1ZGlvTHR2TWFwJiBwYWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGVBdWRpb0xjM0NvbmZpZyYgbGMzX2NvbmZpZykgewotICBjb25zdCBhdXRvJiByZXFzID0gbGMzX2NvbmZpZy5HZXRBc0x0dk1hcCgpOwotICB1aW50OF90IHU4X3JlcV92YWwsIHU4X3BhY192YWw7Ci0gIHVpbnQxNl90IHUxNl9yZXFfdmFsLCB1MTZfcGFjX3ZhbDsKLQotICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgYXV0byByZXEgPSByZXFzLkZpbmQoY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzVHlwZVNhbXBsaW5nRnJlcSk7Ci0gIGF1dG8gcGFjID0gcGFjcy5GaW5kKGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM1R5cGVTYW1wbGluZ0ZyZXEpOwotICBpZiAoIXJlcSB8fCAhcGFjKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgbGFjayBvZiBzYW1wbGluZyBmcmVxdWVuY3kgZmllbGRzIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1OF9yZXFfdmFsID0gVkVDX1VJTlQ4X1RPX1VJTlQ4KHJlcS52YWx1ZSgpKTsKLSAgdTE2X3BhY192YWwgPSBWRUNfVUlOVDhfVE9fVUlOVDE2KHBhYy52YWx1ZSgpKTsKLQotICAvKgotICAgKiBOb3RlOiBSZXF1aXJlbWVudHMgYXJlIGluIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gd2hpY2gKLSAgICogYXJlIHZhbHVlcyBjb21pbmcgZnJvbSBCQVAgQXBwZW5kaXggQTEuMi4xCi0gICAqLwotICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgUmVxOlNhbXBsRnJlcT0iIDw8IGxvZ2hleCh1OF9yZXFfdmFsKTsKLSAgLyogTk9URTogQmVsb3cgaXMgQ29kZWMgc3BlY2lmaWMgY2FiYWJpbGl0aWVzIGNvbWVzIGZvcm0gQkFQIEFwcGVuZGl4IEEgQTEuMS4xCi0gICAqIE5vdGUgdGhpcyBpcyBhIGJpdGZpZWxkCi0gICAqLwotICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgUGFjOlNhbXBsRnJlcT0iIDw8IGxvZ2hleCh1MTZfcGFjX3ZhbCk7Ci0KLSAgLyogVE9ETzogSW50ZWdyYXRlIHdpdGggY29kZWMgY2FwYWJpbGl0aWVzICovCi0gIGlmICgodThfcmVxX3ZhbCAhPSBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvU2FtcGxpbmdGcmVxMTYwMDBIeiAmJgotICAgICAgIHU4X3JlcV92YWwgIT0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTQ4MDAwSHopIHx8Ci0gICAgICAhKHUxNl9wYWNfdmFsICYKLSAgICAgICAgY29kZWNfc3BlY19jYXBzOjpTYW1wbGluZ0ZyZXFDb25maWcyQ2FwYWJpbGl0eSh1OF9yZXFfdmFsKSkpIHsKLSAgICBETE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBzYW1wbGluZyBmcmVxdWVuY3kgbm90IHN1cHBvcnRlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogRnJhbWUgZHVyYXRpb24gKi8KLSAgcmVxID0gcmVxcy5GaW5kKGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM1R5cGVGcmFtZUR1cmF0aW9uKTsKLSAgcGFjID0gcGFjcy5GaW5kKGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM1R5cGVGcmFtZUR1cmF0aW9uKTsKLSAgaWYgKCFyZXEgfHwgIXBhYykgewotICAgIERMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGxhY2sgb2YgZnJhbWUgZHVyYXRpb24gZmllbGRzIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1OF9yZXFfdmFsID0gVkVDX1VJTlQ4X1RPX1VJTlQ4KHJlcS52YWx1ZSgpKTsKLSAgdThfcGFjX3ZhbCA9IFZFQ19VSU5UOF9UT19VSU5UOChwYWMudmFsdWUoKSk7Ci0gIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBSZXE6RnJhbWVEdXI9IiA8PCBsb2doZXgodThfcmVxX3ZhbCk7Ci0gIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBQYWM6RnJhbWVEdXI9IiA8PCBsb2doZXgodThfcGFjX3ZhbCk7Ci0KLSAgaWYgKCh1OF9yZXFfdmFsICE9IGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyNzUwMHVzICYmCi0gICAgICAgdThfcmVxX3ZhbCAhPSBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1cjEwMDAwdXMpIHx8Ci0gICAgICAhKHU4X3BhY192YWwgJgotICAgICAgICAoY29kZWNfc3BlY19jYXBzOjpGcmFtZUR1cmF0aW9uQ29uZmlnMkNhcGFiaWxpdHkodThfcmVxX3ZhbCkpKSkgewotICAgIERMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGZyYW1lIGR1cmF0aW9uIG5vdCBzdXBwb3J0ZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ4X3QgcmVxdWlyZWRfYXVkaW9fY2hhbl9udW0gPSBsYzNfY29uZmlnLkdldENoYW5uZWxDb3VudCgpOwotICBwYWMgPSBwYWNzLkZpbmQoY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzVHlwZUF1ZGlvQ2hhbm5lbENvdW50cyk7Ci0KLSAgLyoKLSAgICogQkFQX1ZhbGlkYXRpb25fcjA3IDEuOS4yIEF1ZGlvIGNoYW5uZWwgc3VwcG9ydCByZXF1aXJlbWVudHMKLSAgICogIlRoZSBVbmljYXN0IFNlcnZlciBzaGFsbCBzdXBwb3J0IGFuIEF1ZGlvX0NoYW5uZWxfQ291bnRzIHZhbHVlIG9mIDB4MDEKLSAgICogKDBiMDAwMDAwMDEgPSBvbmUgY2hhbm5lbCkgYW5kIG1heSBzdXBwb3J0IG90aGVyIHZhbHVlcyBkZWZpbmVkIGJ5IGFuCi0gICAqIGltcGxlbWVudGF0aW9uIG9yIGJ5IGEgaGlnaGVyLWxheWVyIHNwZWNpZmljYXRpb24uIgotICAgKgotICAgKiBUaHVzIGlmIEF1ZGlvX0NoYW5uZWxfQ291bnRzIGlzIG5vdCBwcmVzZW50IGluIFBBQyBMVFYgc3RydWN0dXJlLCB3ZSBhc3N1bWUKLSAgICogdGhlIFVuaWNhc3QgU2VydmVyIHN1cHBvcnRzIG1hbmRhdG9yeSBvbmUgY2hhbm5lbC4KLSAgICovCi0gIGlmICghcGFjKSB7Ci0gICAgRExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBubyBBdWRpb19DaGFubmVsX0NvdW50cyBmaWVsZCBpbiBQQUMiOwotICAgIHU4X3BhY192YWwgPSAweDAxOwotICB9IGVsc2UgewotICAgIHU4X3BhY192YWwgPSBWRUNfVUlOVDhfVE9fVUlOVDgocGFjLnZhbHVlKCkpOwotICB9Ci0KLSAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFBhYzpBdWRpb0NoYW5DbnQ9IiA8PCBsb2doZXgodThfcGFjX3ZhbCk7Ci0gIGlmICghKCgxIDw8IChyZXF1aXJlZF9hdWRpb19jaGFuX251bSAtIDEpKSAmIHU4X3BhY192YWwpKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgY2hhbm5lbCBjb3VudCB3YXJuaW5nIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBPY3RldHMgcGVyIGZyYW1lICovCi0gIHJlcSA9IHJlcXMuRmluZChjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNUeXBlT2N0ZXRQZXJGcmFtZSk7Ci0gIHBhYyA9IHBhY3MuRmluZChjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNUeXBlT2N0ZXRQZXJGcmFtZSk7Ci0KLSAgaWYgKCFyZXEgfHwgIXBhYykgewotICAgIERMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGxhY2sgb2Ygb2N0ZXQgcGVyIGZyYW1lIGZpZWxkcyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdTE2X3JlcV92YWwgPSBWRUNfVUlOVDhfVE9fVUlOVDE2KHJlcS52YWx1ZSgpKTsKLSAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFJlcTpPY3RldHNQZXJGcmFtZT0iIDw8IGludCh1MTZfcmVxX3ZhbCk7Ci0KLSAgLyogTWluaW1hbCB2YWx1ZSAwLTEgYnl0ZSAqLwotICB1MTZfcGFjX3ZhbCA9IFZFQ19VSU5UOF9UT19VSU5UMTYocGFjLnZhbHVlKCkpOwotICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgUGFjOk1pbk9jdGV0c1BlckZyYW1lPSIgPDwgaW50KHUxNl9wYWNfdmFsKTsKLSAgaWYgKHUxNl9yZXFfdmFsIDwgdTE2X3BhY192YWwpIHsKLSAgICBETE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBvY3RldCBwZXIgZnJhbWUgYmVsb3cgbWluaW11bSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogTWF4aW1hbCB2YWx1ZSAyLTMgYnl0ZSAqLwotICB1MTZfcGFjX3ZhbCA9IE9GRl9WRUNfVUlOVDhfVE9fVUlOVDE2KHBhYy52YWx1ZSgpLCAyKTsKLSAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFBhYzpNYXhPY3RldHNQZXJGcmFtZT0iIDw8IGludCh1MTZfcGFjX3ZhbCk7Ci0gIGlmICh1MTZfcmVxX3ZhbCA+IHUxNl9wYWNfdmFsKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgb2N0ZXQgcGVyIGZyYW1lIGFib3ZlIG1heGltdW0iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIElzQ29kZWNDYXBhYmlsaXR5U2V0dGluZ1N1cHBvcnRlZCgKLSAgICBjb25zdCBhY3NfYWNfcmVjb3JkJiBwYWMsCi0gICAgY29uc3QgQ29kZWNDYXBhYmlsaXR5U2V0dGluZyYgY29kZWNfY2FwYWJpbGl0eV9zZXR0aW5nKSB7Ci0gIGNvbnN0IGF1dG8mIGNvZGVjX2lkID0gY29kZWNfY2FwYWJpbGl0eV9zZXR0aW5nLmlkOwotCi0gIGlmIChjb2RlY19pZCAhPSBwYWMuY29kZWNfaWQpIHJldHVybiBmYWxzZTsKLQotICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFNldHRpbmdzIGZvciBmb3JtYXQgIiA8PCArY29kZWNfaWQuY29kaW5nX2Zvcm1hdDsKLQotICBzd2l0Y2ggKGNvZGVjX2lkLmNvZGluZ19mb3JtYXQpIHsKLSAgICBjYXNlIGtMZUF1ZGlvQ29kaW5nRm9ybWF0TEMzOgotICAgICAgcmV0dXJuIElzQ29kZWNDb25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgIHBhYy5jb2RlY19zcGVjX2NhcHMsCi0gICAgICAgICAgc3RkOjpnZXQ8TGVBdWRpb0xjM0NvbmZpZz4oY29kZWNfY2FwYWJpbGl0eV9zZXR0aW5nLmNvbmZpZykpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9ucyogZ2V0X2NvbmZzX2J5X3R5cGUoTGVBdWRpb0NvbnRleHRUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBMZUF1ZGlvQ29udGV4dFR5cGU6Ok1FRElBOgotICAgICAgcmV0dXJuICZhdWRpb19zZXRfY29uZl9tZWRpYTsKLSAgICBjYXNlIExlQXVkaW9Db250ZXh0VHlwZTo6Q09OVkVSU0FUSU9OQUw6Ci0gICAgICByZXR1cm4gJmF1ZGlvX3NldF9jb25mX2NvbnZlcnNhdGlvbmFsOwotICAgIGNhc2UgTGVBdWRpb0NvbnRleHRUeXBlOjpSSU5HVE9ORToKLSAgICAgIHJldHVybiAmYXVkaW9fc2V0X2NvbmZfcmluZ3RvbmU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAmYXVkaW9fc2V0X2NvbmZfZGVmYXVsdDsKLSAgfQotfQotdWludDMyX3QgQ29kZWNDYXBhYmlsaXR5U2V0dGluZzo6R2V0Q29uZmlnU2FtcGxpbmdGcmVxdWVuY3koKSBjb25zdCB7Ci0gIHN3aXRjaCAoaWQuY29kaW5nX2Zvcm1hdCkgewotICAgIGNhc2Uga0xlQXVkaW9Db2RpbmdGb3JtYXRMQzM6Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8dHlwZXM6OkxlQXVkaW9MYzNDb25maWc+KGNvbmZpZykuR2V0U2FtcGxpbmdGcmVxdWVuY3lIeigpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgY29kZWMgaWQiOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLXVpbnQzMl90IENvZGVjQ2FwYWJpbGl0eVNldHRpbmc6OkdldENvbmZpZ0RhdGFJbnRlcnZhbFVzKCkgY29uc3QgewotICBzd2l0Y2ggKGlkLmNvZGluZ19mb3JtYXQpIHsKLSAgICBjYXNlIGtMZUF1ZGlvQ29kaW5nRm9ybWF0TEMzOgotICAgICAgcmV0dXJuIHN0ZDo6Z2V0PHR5cGVzOjpMZUF1ZGlvTGMzQ29uZmlnPihjb25maWcpLkdldEZyYW1lRHVyYXRpb25VcygpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgY29kZWMgaWQiOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLXVpbnQ4X3QgQ29kZWNDYXBhYmlsaXR5U2V0dGluZzo6R2V0Q29uZmlnQml0c1BlclNhbXBsZSgpIGNvbnN0IHsKLSAgc3dpdGNoIChpZC5jb2RpbmdfZm9ybWF0KSB7Ci0gICAgY2FzZSBrTGVBdWRpb0NvZGluZ0Zvcm1hdExDMzoKLSAgICAgIC8qIFhYWCBMQzMgc3VwcG9ydHMgMTYsIDI0LCAzMiAqLwotICAgICAgcmV0dXJuIDE2OwotICAgIGRlZmF1bHQ6Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgY29kZWMgaWQiOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLXVpbnQ4X3QgQ29kZWNDYXBhYmlsaXR5U2V0dGluZzo6R2V0Q29uZmlnQ2hhbm5lbENvdW50KCkgY29uc3QgewotICBzd2l0Y2ggKGlkLmNvZGluZ19mb3JtYXQpIHsKLSAgICBjYXNlIGtMZUF1ZGlvQ29kaW5nRm9ybWF0TEMzOgotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBjb3VudCA9ICIKLSAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmdldDx0eXBlczo6TGVBdWRpb0xjM0NvbmZpZz4oY29uZmlnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hhbm5lbF9jb3VudCk7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8dHlwZXM6OkxlQXVkaW9MYzNDb25maWc+KGNvbmZpZykuY2hhbm5lbF9jb3VudDsKLSAgICBkZWZhdWx0OgotICAgICAgRExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIGNvZGVjIGlkIjsKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci19ICAvLyBuYW1lc3BhY2Ugc2V0X2NvbmZpZ3VyYXRpb25zCi0KLW5hbWVzcGFjZSB0eXBlcyB7Ci0vKiBIZWxwZXIgbWFwIGZvciBtYXRjaGluZyB2YXJpb3VzIGZyZXF1ZW5jeSBub3RhdGlvbnMgKi8KLWNvbnN0IHN0ZDo6bWFwPHVpbnQ4X3QsIHVpbnQzMl90PiBMZUF1ZGlvTGMzQ29uZmlnOjpzYW1wbGluZ19mcmVxX21hcCA9IHsKLSAgICB7Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTgwMDBIeiwKLSAgICAgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbjo6a1NhbXBsZVJhdGU4MDAwfSwKLSAgICB7Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTE2MDAwSHosCi0gICAgIExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtTYW1wbGVSYXRlMTYwMDB9LAotICAgIHtjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvU2FtcGxpbmdGcmVxMjQwMDBIeiwKLSAgICAgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbjo6a1NhbXBsZVJhdGUyNDAwMH0sCi0gICAge2NvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXEzMjAwMEh6LAotICAgICBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uOjprU2FtcGxlUmF0ZTMyMDAwfSwKLSAgICB7Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTQ0MTAwSHosCi0gICAgIExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtTYW1wbGVSYXRlNDQxMDB9LAotICAgIHtjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvU2FtcGxpbmdGcmVxNDgwMDBIeiwKLSAgICAgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbjo6a1NhbXBsZVJhdGU0ODAwMH19OwotCi0vKiBIZWxwZXIgbWFwIGZvciBtYXRjaGluZyB2YXJpb3VzIGZyYW1lIGR1cmF0aW9ucyBub3RhdGlvbnMgKi8KLWNvbnN0IHN0ZDo6bWFwPHVpbnQ4X3QsIHVpbnQzMl90PiBMZUF1ZGlvTGMzQ29uZmlnOjpmcmFtZV9kdXJhdGlvbl9tYXAgPSB7Ci0gICAge2NvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyNzUwMHVzLAotICAgICBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uOjprSW50ZXJ2YWw3NTAwVXN9LAotICAgIHtjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1cjEwMDAwdXMsCi0gICAgIExlQXVkaW9Db2RlY0NvbmZpZ3VyYXRpb246OmtJbnRlcnZhbDEwMDAwVXN9fTsKLQotc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gTGVBdWRpb0x0dk1hcDo6RmluZCh1aW50OF90IHR5cGUpIGNvbnN0IHsKLSAgYXV0byBpdGVyID0KLSAgICAgIHN0ZDo6ZmluZF9pZih2YWx1ZXMuY2JlZ2luKCksIHZhbHVlcy5jZW5kKCksCi0gICAgICAgICAgICAgICAgICAgW3R5cGVdKGNvbnN0IGF1dG8mIHZhbHVlKSB7IHJldHVybiB2YWx1ZS5maXJzdCA9PSB0eXBlOyB9KTsKLQotICBpZiAoaXRlciA9PSB2YWx1ZXMuY2VuZCgpKSByZXR1cm4gc3RkOjpudWxsb3B0OwotCi0gIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci19Ci0KLXVpbnQ4X3QqIExlQXVkaW9MdHZNYXA6OlJhd1BhY2tldCh1aW50OF90KiBwX2J1ZikgY29uc3QgewotICBmb3IgKGF1dG8gY29uc3QmIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBfYnVmLCB2YWx1ZS5zZWNvbmQuc2l6ZSgpICsgMSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBfYnVmLCB2YWx1ZS5maXJzdCk7Ci0gICAgQVJSQVlfVE9fU1RSRUFNKHBfYnVmLCB2YWx1ZS5zZWNvbmQuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlLnNlY29uZC5zaXplKCkpKTsKLSAgfQotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotTGVBdWRpb0x0dk1hcCBMZUF1ZGlvTHR2TWFwOjpQYXJzZShjb25zdCB1aW50OF90KiBwX3ZhbHVlLCB1aW50OF90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgc3VjY2VzcykgewotICBMZUF1ZGlvTHR2TWFwIGx0dl9tYXA7Ci0KLSAgaWYgKGxlbiA+IDApIHsKLSAgICBjb25zdCBhdXRvIHBfdmFsdWVfZW5kID0gcF92YWx1ZSArIGxlbjsKLQotICAgIHdoaWxlICgocF92YWx1ZV9lbmQgLSBwX3ZhbHVlKSA+IDApIHsKLSAgICAgIHVpbnQ4X3QgbHR2X2xlbjsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChsdHZfbGVuLCBwX3ZhbHVlKTsKLQotICAgICAgLy8gVW51c3VhbCwgYnV0IHBvc3NpYmxlIGNhc2UKLSAgICAgIGlmIChsdHZfbGVuID09IDApIGNvbnRpbnVlOwotCi0gICAgICBpZiAocF92YWx1ZV9lbmQgPCAocF92YWx1ZSArIGx0dl9sZW4pKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIEludmFsaWQgbHR2X2xlbjogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGx0dl9sZW4pOwotICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBMZUF1ZGlvTHR2TWFwKCk7Ci0gICAgICB9Ci0KLSAgICAgIHVpbnQ4X3QgbHR2X3R5cGU7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgobHR2X3R5cGUsIHBfdmFsdWUpOwotICAgICAgbHR2X2xlbiAtPSBzaXplb2YobHR2X3R5cGUpOwotCi0gICAgICBjb25zdCBhdXRvIHBfdGVtcCA9IHBfdmFsdWU7Ci0gICAgICBwX3ZhbHVlICs9IGx0dl9sZW47Ci0KLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGx0dl92YWx1ZShwX3RlbXAsIHBfdmFsdWUpOwotICAgICAgbHR2X21hcC52YWx1ZXMuZW1wbGFjZShsdHZfdHlwZSwgc3RkOjptb3ZlKGx0dl92YWx1ZSkpOwotICAgIH0KLSAgfQotCi0gIHN1Y2Nlc3MgPSB0cnVlOwotICByZXR1cm4gbHR2X21hcDsKLX0KLQotc2l6ZV90IExlQXVkaW9MdHZNYXA6OlJhd1BhY2tldFNpemUoKSBjb25zdCB7Ci0gIHNpemVfdCBieXRlcyA9IDA7Ci0KLSAgZm9yIChhdXRvIGNvbnN0JiB2YWx1ZSA6IHZhbHVlcykgewotICAgIGJ5dGVzICs9ICgvKiBsdHZfbGVuICsgbHR2X3R5cGUgKi8gMiArIHZhbHVlLnNlY29uZC5zaXplKCkpOwotICB9Ci0KLSAgcmV0dXJuIGJ5dGVzOwotfQotCi1zdGQ6OnN0cmluZyBMZUF1ZGlvTHR2TWFwOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgZGVidWdfc3RyOwotCi0gIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOwotCi0gICAgc3N0cmVhbSA8PCAiXHR0eXBlOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKHZhbHVlLmZpcnN0KQotICAgICAgICAgICAgPDwgIlx0bGVuOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKHZhbHVlLnNlY29uZC5zaXplKCkpIDw8ICJcdGRhdGE6ICIKLSAgICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZSh2YWx1ZS5zZWNvbmQuZGF0YSgpLCB2YWx1ZS5zZWNvbmQuc2l6ZSgpKSArICJcbiI7Ci0KLSAgICBkZWJ1Z19zdHIgKz0gc3N0cmVhbS5zdHIoKTsKLSAgfQotCi0gIHJldHVybiBkZWJ1Z19zdHI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0eXBlcwotCi12b2lkIEFwcGVuZE1ldGFkYXRhTHR2RW50cnlGb3JDY2lkTGlzdChzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNjaWRfbHR2X2VudHJ5OwotICAvKiBUT0RPOiBHZXQgQ0NJRCB2YWx1ZXMgZnJvbSBTZXJ2aWNlICovCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNjaWRfY29udmVyc2F0aW9uYWwgPSB7MHgxMn07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNjaWRfbWVkaWEgPSB7MHg1Nn07Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGNjaWRfdmFsdWUgPSBudWxscHRyOwotCi0gIC8qIENDSUQgbGlzdCAqLwotICBzd2l0Y2ggKGNvbnRleHRfdHlwZSkgewotICAgIGNhc2UgTGVBdWRpb0NvbnRleHRUeXBlOjpDT05WRVJTQVRJT05BTDoKLSAgICAgIGNjaWRfdmFsdWUgPSAmY2NpZF9jb252ZXJzYXRpb25hbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTGVBdWRpb0NvbnRleHRUeXBlOjpNRURJQToKLSAgICAgIGNjaWRfdmFsdWUgPSAmY2NpZF9tZWRpYTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmICghY2NpZF92YWx1ZSkgcmV0dXJuOwotCi0gIGNjaWRfbHR2X2VudHJ5LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90Pih0eXBlczo6a0xlQXVkaW9NZXRhZGF0YVR5cGVMZW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZF92YWx1ZS0+c2l6ZSgpKSk7Ci0gIGNjaWRfbHR2X2VudHJ5LnB1c2hfYmFjaygKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHR5cGVzOjprTGVBdWRpb01ldGFkYXRhVHlwZUNjaWRMaXN0KSk7Ci0gIGNjaWRfbHR2X2VudHJ5Lmluc2VydChjY2lkX2x0dl9lbnRyeS5lbmQoKSwgY2NpZF92YWx1ZS0+YmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNjaWRfdmFsdWUtPmVuZCgpKTsKLQotICBtZXRhZGF0YS5pbnNlcnQobWV0YWRhdGEuZW5kKCksIGNjaWRfbHR2X2VudHJ5LmJlZ2luKCksIGNjaWRfbHR2X2VudHJ5LmVuZCgpKTsKLX0KLQotdm9pZCBBcHBlbmRNZXRhZGF0YUx0dkVudHJ5Rm9yU3RyZWFtaW5nQ29udGV4dCgKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWV0YWRhdGEsIExlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RyZWFtaW5nX2NvbnRleHRfbHR2X2VudHJ5OwotCi0gIHN0cmVhbWluZ19jb250ZXh0X2x0dl9lbnRyeS5yZXNpemUoCi0gICAgICB0eXBlczo6a0xlQXVkaW9NZXRhZGF0YVR5cGVMZW4gKyB0eXBlczo6a0xlQXVkaW9NZXRhZGF0YUxlbkxlbiArCi0gICAgICB0eXBlczo6a0xlQXVkaW9NZXRhZGF0YVN0cmVhbWluZ0F1ZGlvQ29udGV4dExlbik7Ci0gIHVpbnQ4X3QqIHN0cmVhbWluZ19jb250ZXh0X2x0dl9lbnRyeV9idWYgPSBzdHJlYW1pbmdfY29udGV4dF9sdHZfZW50cnkuZGF0YSgpOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShzdHJlYW1pbmdfY29udGV4dF9sdHZfZW50cnlfYnVmLAotICAgICAgICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvTWV0YWRhdGFUeXBlTGVuICsKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9NZXRhZGF0YVN0cmVhbWluZ0F1ZGlvQ29udGV4dExlbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShzdHJlYW1pbmdfY29udGV4dF9sdHZfZW50cnlfYnVmLAotICAgICAgICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvTWV0YWRhdGFUeXBlU3RyZWFtaW5nQXVkaW9Db250ZXh0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShzdHJlYW1pbmdfY29udGV4dF9sdHZfZW50cnlfYnVmLAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb250ZXh0X3R5cGUpKTsKLQotICBtZXRhZGF0YS5pbnNlcnQobWV0YWRhdGEuZW5kKCksIHN0cmVhbWluZ19jb250ZXh0X2x0dl9lbnRyeS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgc3RyZWFtaW5nX2NvbnRleHRfbHR2X2VudHJ5LmVuZCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxlX2F1ZGlvCi0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0xjM0NvbmZpZyYgY29uZmlnKSB7Ci0gIG9zIDw8ICIgTGVBdWRpb0xjM0NvbmZpZyhTYW1wbEZyZXE9IiA8PCBsb2doZXgoY29uZmlnLnNhbXBsaW5nX2ZyZXF1ZW5jeSkKLSAgICAgPDwgIiwgRnJhbWVEdXI9IiA8PCBsb2doZXgoY29uZmlnLmZyYW1lX2R1cmF0aW9uKQotICAgICA8PCAiLCBPY3RldHNQZXJGcmFtZT0iIDw8IGludChjb25maWcub2N0ZXRzX3Blcl9jb2RlY19mcmFtZSkKLSAgICAgPDwgIiwgQXVkaW9DaGFuTG9jPSIgPDwgbG9naGV4KGNvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24pIDw8ICIpIjsKLSAgcmV0dXJuIG9zOwotfQotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZV9hdWRpbzo6dHlwZXM6OkFzZVN0YXRlJiBzdGF0ZSkgewotICBzdGF0aWMgY29uc3QgY2hhciogY2hhcl92YWx1ZV9bN10gPSB7Ci0gICAgICAiSURMRSIsICAgICAgIkNPREVDX0NPTkZJR1VSRUQiLCAiUU9TX0NPTkZJR1VSRUQiLCAiRU5BQkxJTkciLAotICAgICAgIlNUUkVBTUlORyIsICJESVNBQkxJTkciLCAgICAgICAgIlJFTEVBU0lORyIsCi0gIH07Ci0KLSAgb3MgPDwgY2hhcl92YWx1ZV9bc3RhdGljX2Nhc3Q8dWludDhfdD4oc3RhdGUpXSA8PCAiICgiCi0gICAgIDw8ICIweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHN0YXRpY19jYXN0PGludD4oc3RhdGUpCi0gICAgIDw8ICIpIjsKLSAgcmV0dXJuIG9zOwotfQpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL2xlX2F1ZGlvX3R5cGVzLmggYi9idGEvbGVfYXVkaW8vbGVfYXVkaW9fdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1YjIzOC4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vbGVfYXVkaW9fdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBCYXNpYyBBdWRpbyBQcm9maWxlIC8gQXVkaW8gU3RyZWFtIENvbnRyb2wKLSAqIGFuZCBQdWJsaXNoZWQgQXVkaW8gQ2FwYWJpbGl0aWVzIGRlZmluaXRpb25zLCBzdHJ1Y3R1cmVzIGV0Yy4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Yml0c2V0PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmFyaWFudD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGFfZ3JvdXBzLmgiCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9pc29fYXBpX3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBsZV9hdWRpbyB7Ci0KLSNkZWZpbmUgVUlOVDhfVE9fVkVDX1VJTlQ4KHU4KSBcCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHsgdTggfQotI2RlZmluZSBVSU5UMTZfVE9fVkVDX1VJTlQ4KHUxNikgXAotICBzdGQ6OnZlY3Rvcjx1aW50OF90PigodWludDhfdCopJnUxNiwgKHVpbnQ4X3QqKSZ1MTYgKyBzaXplb2YodTE2KSkKLSNkZWZpbmUgVUlOVDMyX1RPX1ZFQ19VSU5UOCh1MzIpIFwKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4oKHVpbnQ4X3QqKSZ1MzIsICh1aW50OF90KikmdTMyICsgc2l6ZW9mKHUzMikpCi0KLSNkZWZpbmUgVkVDX1VJTlQ4X1RPX1VJTlQ4KHZlYykgdmVjLmRhdGEoKVswXQotI2RlZmluZSBWRUNfVUlOVDhfVE9fVUlOVDE2KHZlYykgKCh2ZWMuZGF0YSgpWzFdIDw8IDgpICsgdmVjLmRhdGEoKVswXSkKLSNkZWZpbmUgT0ZGX1ZFQ19VSU5UOF9UT19VSU5UMTYodmVjLCBvZmYpIFwKLSAgKCh2ZWMuZGF0YSgpWzEgKyBvZmZdIDw8IDgpICsgdmVjLmRhdGEoKVswICsgb2ZmXSkKLSNkZWZpbmUgVkVDX1VJTlQ4X1RPX1VJTlQzMih2ZWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKHZlYy5kYXRhKClbM10gPDwgMjQpICsgKHZlYy5kYXRhKClbMl0gPDwgMTYpICsgKHZlYy5kYXRhKClbMV0gPDwgOCkgKyBcCi0gICB2ZWMuZGF0YSgpWzBdKQotCi1uYW1lc3BhY2UgdXVpZCB7Ci0vKiBDQVAgc2VydmljZQotICogVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gaWRlbnRpZnkgcGVlciByb2xlICh3aGljaCB3ZSBhcmUgbm90IHVzaW5nIGZvciBub3cpCi0gKiBhbmQgdG8gd3JhcCBDU0lTIHNlcnZpY2UgYXMgdGhpcyBpcyByZXF1aXJlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZQotICogQ1NJUwotICogUGxhY2UgaG9sZGVyCi0gKi8KLXN0YXRpYyBjb25zdCBibHVldG9vdGg6OlV1aWQga0NhcFNlcnZpY2VVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweEVFRUUpOwotCi0vKiBBc3NpZ25lZCBudW1iZXJzIGZvciBhdHRyaWJ1dGVzICovCi1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtQdWJsaXNoZWRBdWRpb0NhcGFiaWxpdHlTZXJ2aWNlVXVpZCA9Ci0gICAgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgxODUwKTsKLXN0YXRpYyBjb25zdCBibHVldG9vdGg6OlV1aWQga0F1ZGlvU3RyZWFtQ29udHJvbFNlcnZpY2VVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDE4NEUpOwotCi0vKiBQdWJsaXNoZWQgQXVkaW8gQ2FwYWJpbGl0aWVzIFNlcnZpY2UgQ2hhcmFjdGVyaXN0aWNzICovCi1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtTaW5rUHVibGlzaGVkQXVkaW9DYXBhYmlsaXR5Q2hhcmFjdGVyaXN0aWNVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQzkpOwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrU291cmNlUHVibGlzaGVkQXVkaW9DYXBhYmlsaXR5Q2hhcmFjdGVyaXN0aWNVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQ0IpOwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrU2lua0F1ZGlvTG9jYXRpb25DaGFyYWN0ZXJpc3RpY1V1aWQgPQotICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MkJDQSk7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtTb3VyY2VBdWRpb0xvY2F0aW9uQ2hhcmFjdGVyaXN0aWNVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQ0MpOwotCi0vKiBBdWRpbyBTdHJlYW0gQ29udHJvbCBTZXJ2aWNlIENoYXJhY3RlcmlzdGljcyAqLwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrQXVkaW9Db250ZXh0QXZhaWxhYmlsaXR5Q2hhcmFjdGVyaXN0aWNVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQ0QpOwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrQXVkaW9TdXBwb3J0ZWRDb250ZXh0Q2hhcmFjdGVyaXN0aWNVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQ0UpOwotCi0vKiBBdWRpbyBTdHJlYW0gQ29udHJvbCBTZXJ2aWNlIENoYXJhY3RlcmlzdGljcyAqLwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrU2lua0F1ZGlvU3RyZWFtRW5kcG9pbnRVdWlkID0KLSAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQzQpOwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBrU291cmNlQXVkaW9TdHJlYW1FbmRwb2ludFV1aWQgPQotICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MkJDNSk7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkCi0gICAga0F1ZGlvU3RyZWFtRW5kcG9pbnRDb250cm9sUG9pbnRDaGFyYWN0ZXJpc3RpY1V1aWQgPQotICAgICAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDJCQzYpOwotfSAgLy8gbmFtZXNwYWNlIHV1aWQKLQotbmFtZXNwYWNlIGNvZGVjX3NwZWNfY29uZiB7Ci0vKiBMVFYgVHlwZXMgKi8KLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNUeXBlU2FtcGxpbmdGcmVxID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNUeXBlRnJhbWVEdXJhdGlvbiA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb0NvZGVjTEMzVHlwZUF1ZGlvQ2hhbm5lbEFsbG9jYXRpb24gPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM1R5cGVPY3RldFBlckZyYW1lID0gMHgwNDsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNUeXBlQ29kZWNGcmFtZUJsb2Nrc1BlclNkdSA9IDB4MDU7Ci0KLS8qIFNhbXBsaW5nIEZyZXF1ZW5jaWVzICovCi1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTgwMDBIeiA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTExMDI1SHogPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9TYW1wbGluZ0ZyZXExNjAwMEh6ID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvU2FtcGxpbmdGcmVxMjIwNTBIeiA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTI0MDAwSHogPSAweDA1OwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9TYW1wbGluZ0ZyZXEzMjAwMEh6ID0gMHgwNjsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvU2FtcGxpbmdGcmVxNDQxMDBIeiA9IDB4MDc7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTQ4MDAwSHogPSAweDA4OwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9TYW1wbGluZ0ZyZXE4ODIwMEh6ID0gMHgwOTsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvU2FtcGxpbmdGcmVxOTYwMDBIeiA9IDB4MEE7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTE3NjQwMEh6ID0gMHgwQjsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvU2FtcGxpbmdGcmVxMTkyMDAwSHogPSAweDBDOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9TYW1wbGluZ0ZyZXEzODQwMDBIeiA9IDB4MEQ7Ci0KLS8qIEZyYW1lIER1cmF0aW9ucyAqLwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyNzUwMHVzID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1cjEwMDAwdXMgPSAweDAxOwotCi0vKiBBdWRpbyBBbGxvY2F0aW9ucyAqLwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Nb25vVW5zcGVjaWZpZWQgPSAweDAwMDAwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQgPSAweDAwMDAwMDAxOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0ID0gMHgwMDAwMDAwMjsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uRnJvbnRDZW50ZXIgPSAweDAwMDAwMDA0OwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Mb3dGcmVxRWZmZWN0czEgPSAweDAwMDAwMDA4OwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25CYWNrTGVmdCA9IDB4MDAwMDAwMTA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvbkJhY2tSaWdodCA9IDB4MDAwMDAwMjA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdE9mQ2VudGVyID0gMHgwMDAwMDA0MDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodE9mQ2VudGVyID0gMHgwMDAwMDA4MDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uQmFja0NlbnRlciA9IDB4MDAwMDAxMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvbkxvd0ZyZXFFZmZlY3RzMiA9IDB4MDAwMDAyMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvblNpZGVMZWZ0ID0gMHgwMDAwMDQwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uU2lkZVJpZ2h0ID0gMHgwMDAwMDgwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uVG9wRnJvbnRMZWZ0ID0gMHgwMDAwMTAwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uVG9wRnJvbnRSaWdodCA9IDB4MDAwMDIwMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvblRvcEZyb250Q2VudGVyID0gMHgwMDAwNDAwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uVG9wQ2VudGVyID0gMHgwMDAwODAwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uVG9wQmFja0xlZnQgPSAweDAwMDEwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Ub3BCYWNrUmlnaHQgPSAweDAwMDIwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Ub3BTaWRlTGVmdCA9IDB4MDAwNDAwMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvblRvcFNpZGVSaWdodCA9IDB4MDAwODAwMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvblRvcFNpZGVDZW50ZXIgPSAweDAwMTAwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Cb3R0b21Gcm9udENlbnRlciA9IDB4MDAyMDAwMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvbkJvdHRvbUZyb250TGVmdCA9IDB4MDA0MDAwMDA7Ci1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvbkJvdHRvbUZyb250UmlnaHQgPSAweDAwODAwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnRXaWRlID0gMHgwMTAwMDAwMDsKLWNvbnN0ZXhwciB1aW50MzJfdCBrTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodFdpZGUgPSAweDAyMDAwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25MZWZ0U3Vycm91bmQgPSAweDA0MDAwMDAwOwotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25SaWdodFN1cnJvdW5kID0gMHgwODAwMDAwMDsKLQotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25BbnlMZWZ0ID0KLSAgICBrTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0IHwga0xlQXVkaW9Mb2NhdGlvbkJhY2tMZWZ0IHwKLSAgICBrTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0T2ZDZW50ZXIgfCBrTGVBdWRpb0xvY2F0aW9uU2lkZUxlZnQgfAotICAgIGtMZUF1ZGlvTG9jYXRpb25Ub3BGcm9udExlZnQgfCBrTGVBdWRpb0xvY2F0aW9uVG9wQmFja0xlZnQgfAotICAgIGtMZUF1ZGlvTG9jYXRpb25Ub3BTaWRlTGVmdCB8IGtMZUF1ZGlvTG9jYXRpb25Cb3R0b21Gcm9udExlZnQgfAotICAgIGtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnRXaWRlIHwga0xlQXVkaW9Mb2NhdGlvbkxlZnRTdXJyb3VuZDsKLQotY29uc3RleHByIHVpbnQzMl90IGtMZUF1ZGlvTG9jYXRpb25BbnlSaWdodCA9Ci0gICAga0xlQXVkaW9Mb2NhdGlvbkZyb250UmlnaHQgfCBrTGVBdWRpb0xvY2F0aW9uQmFja1JpZ2h0IHwKLSAgICBrTGVBdWRpb0xvY2F0aW9uRnJvbnRSaWdodE9mQ2VudGVyIHwga0xlQXVkaW9Mb2NhdGlvblNpZGVSaWdodCB8Ci0gICAga0xlQXVkaW9Mb2NhdGlvblRvcEZyb250UmlnaHQgfCBrTGVBdWRpb0xvY2F0aW9uVG9wQmFja1JpZ2h0IHwKLSAgICBrTGVBdWRpb0xvY2F0aW9uVG9wU2lkZVJpZ2h0IHwga0xlQXVkaW9Mb2NhdGlvbkJvdHRvbUZyb250UmlnaHQgfAotICAgIGtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0V2lkZSB8IGtMZUF1ZGlvTG9jYXRpb25SaWdodFN1cnJvdW5kOwotCi1jb25zdGV4cHIgdWludDMyX3Qga0xlQXVkaW9Mb2NhdGlvblN0ZXJlbyA9Ci0gICAga0xlQXVkaW9Mb2NhdGlvbkZyb250TGVmdCB8IGtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0OwotCi0vKiBPY3RldHMgUGVyIEZyYW1lICovCi1jb25zdGV4cHIgdWludDE2X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lTGVuMzAgPSAzMDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb0NvZGVjTEMzRnJhbWVMZW40MCA9IDQwOwotY29uc3RleHByIHVpbnQxNl90IGtMZUF1ZGlvQ29kZWNMQzNGcmFtZUxlbjEyMCA9IDEyMDsKLQotfSAgLy8gbmFtZXNwYWNlIGNvZGVjX3NwZWNfY29uZgotCi1jb25zdGV4cHIgdWludDhfdCBrSW52YWxpZENpc0lkID0gMHhGRjsKLQotbmFtZXNwYWNlIGNvZGVjX3NwZWNfY2FwcyB7Ci11aW50MTZfdCBjb25zdGV4cHIgU2FtcGxpbmdGcmVxQ29uZmlnMkNhcGFiaWxpdHkodWludDhfdCBjb25mKSB7Ci0gIHJldHVybiAoMSA8PCAoY29uZiAtIDEpKTsKLX0KLQotdWludDhfdCBjb25zdGV4cHIgRnJhbWVEdXJhdGlvbkNvbmZpZzJDYXBhYmlsaXR5KHVpbnQ4X3QgY29uZikgewotICByZXR1cm4gKDB4MDEgPDwgKGNvbmYpKTsKLX0KLQotaW5saW5lIHVpbnQ4X3QgR2V0QXVkaW9DaGFubmVsQ291bnRzKHN0ZDo6Yml0c2V0PDMyPiBhbGxvY2F0aW9uKSB7Ci0gIC8qCi0gICAqIEJBUCBkMDlyMDcgQjQuMi4zIEF1ZGlvX0NoYW5uZWxfQWxsb2NhdGlvbgotICAgKiAiKC4uLikgQXVkaW9fQ2hhbm5lbF9BbGxvY2F0aW9uIGJpdG1hcCB2YWx1ZSBvZiBhbGwgemVyb3Mgb3IgdGhlCi0gICAqIGFic2VuY2Ugb2YgdGhlIEF1ZGlvX0NoYW5uZWxfQWxsb2NhdGlvbiBMVFYgc3RydWN0dXJlIHdpdGhpbiBhCi0gICAqIENvZGVjX1NwZWNpZmljX0NvbmZpZ3VyYXRpb24gZmllbGQgc2hhbGwgYmUgaW50ZXJwcmV0ZWQgYXMgZGVmaW5pbmcgYQotICAgKiBzaW5nbGUgYXVkaW8gY2hhbm5lbCBvZiBNb25vIGF1ZGlvIChhIHNpbmdsZSBjaGFubmVsIG9mIG5vIHNwZWNpZmllZAotICAgKiBBdWRpbyBMb2NhdGlvbikuCi0gICAqLwotICB1aW50OF90IGF1ZGlvX2NoYW5uZWxfY291bnRzID0gYWxsb2NhdGlvbi5jb3VudCgpID86IDE7Ci0gIHJldHVybiAoMHgwMSA8PCAoYXVkaW9fY2hhbm5lbF9jb3VudHMgLSAxKSk7Ci19Ci0KLS8qIExUViBUeXBlcyAtIHNhbWUgdmFsdWVzIGFzIGluIENvZGVjIFNwZWNpZmljIENvbmZpZ3VyYXRpb25zIGJ1dCAweDAzIGlzCi0gKiBuYW1lZCBkaWZmZXJlbnRseS4KLSAqLwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM1R5cGVTYW1wbGluZ0ZyZXEgPQotICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM1R5cGVTYW1wbGluZ0ZyZXE7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb0NvZGVjTEMzVHlwZUZyYW1lRHVyYXRpb24gPQotICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM1R5cGVGcmFtZUR1cmF0aW9uOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM1R5cGVBdWRpb0NoYW5uZWxDb3VudHMgPQotICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM1R5cGVBdWRpb0NoYW5uZWxBbGxvY2F0aW9uOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM1R5cGVPY3RldFBlckZyYW1lID0KLSAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNUeXBlT2N0ZXRQZXJGcmFtZTsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNUeXBlTWF4Q29kZWNGcmFtZXNQZXJTZHUgPQotICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM1R5cGVDb2RlY0ZyYW1lQmxvY2tzUGVyU2R1OwotCi0vKiBTYW1wbGluZyBGcmVxdWVuY2llcyAqLwotY29uc3RleHByIHVpbnQxNl90IGtMZUF1ZGlvU2FtcGxpbmdGcmVxODAwMEh6ID0KLSAgICBTYW1wbGluZ0ZyZXFDb25maWcyQ2FwYWJpbGl0eShjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvU2FtcGxpbmdGcmVxODAwMEh6KTsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTE2MDAwSHogPQotICAgIFNhbXBsaW5nRnJlcUNvbmZpZzJDYXBhYmlsaXR5KGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXExNjAwMEh6KTsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTI0MDAwSHogPQotICAgIFNhbXBsaW5nRnJlcUNvbmZpZzJDYXBhYmlsaXR5KGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXEyNDAwMEh6KTsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTMyMDAwSHogPQotICAgIFNhbXBsaW5nRnJlcUNvbmZpZzJDYXBhYmlsaXR5KGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXEzMjAwMEh6KTsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTQ0MTAwSHogPQotICAgIFNhbXBsaW5nRnJlcUNvbmZpZzJDYXBhYmlsaXR5KGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXE0NDEwMEh6KTsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb1NhbXBsaW5nRnJlcTQ4MDAwSHogPQotICAgIFNhbXBsaW5nRnJlcUNvbmZpZzJDYXBhYmlsaXR5KGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXE0ODAwMEh6KTsKLQotLyogRnJhbWUgRHVyYXRpb25zICovCi1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb0NvZGVjTEMzRnJhbWVEdXI3NTAwdXMgPQotICAgIEZyYW1lRHVyYXRpb25Db25maWcyQ2FwYWJpbGl0eSgKLSAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVEdXI3NTAwdXMpOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyMTAwMDB1cyA9Ci0gICAgRnJhbWVEdXJhdGlvbkNvbmZpZzJDYXBhYmlsaXR5KAotICAgICAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1cjEwMDAwdXMpOwotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyUHJlZmVyNzUwMHVzID0gMHgxMDsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNGcmFtZUR1clByZWZlcjEwMDAwdXMgPSAweDIwOwotCi0vKiBBdWRpbyBDaGFubmVsIENvdW50cyAqLwotLyogRWFjaCBiaXQgcmVwcmVzZW50cyBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGNoYW5uZWw6IGJpdCAwIC0gb25lIGNoYW5uZWwsCi0gKiBiaXQgMSAtIHR3bywgYml0IDMgLSBmb3VyIGNoYW5uZWxzLiBNdWx0aXBsZSBiaXRzIGNhbiBiZSBlbmFibGVkIGF0IG9uY2UuCi0gKi8KLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnROb25lID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRUd29DaGFubmVsID0gMHgwMjsKLQotLyogT2N0ZXRzIFBlciBGcmFtZSAtIHNhbWUgYXMgaW4gQ29kZWMgU3BlY2lmaWMgQ29uZmlndXJhdGlvbnMgYnV0IGluCi0gKiBjYXBhYmlsaXRpZXMgd2UgZ2V0IHR3byB2YWx1ZXM6IG1pbiBhbmQgbWF4LgotICovCi1jb25zdGV4cHIgdWludDE2X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lTGVuMzAgPQotICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM0ZyYW1lTGVuMzA7Ci1jb25zdGV4cHIgdWludDE2X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lTGVuNDAgPQotICAgIGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM0ZyYW1lTGVuNDA7Ci1jb25zdGV4cHIgdWludDE2X3Qga0xlQXVkaW9Db2RlY0xDM0ZyYW1lTGVuMTIwID0KLSAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNGcmFtZUxlbjEyMDsKLQotfTsgIC8vIG5hbWVzcGFjZSBjb2RlY19zcGVjX2NhcHMKLQotbmFtZXNwYWNlIHR5cGVzIHsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvQ29kaW5nRm9ybWF0TEMzID0gYmx1ZXRvb3RoOjpoY2k6OmtJc29Db2RpbmdGb3JtYXRMYzM7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb0NvZGluZ0Zvcm1hdFZlbmRvclNwZWNpZmljID0KLSAgICBibHVldG9vdGg6OmhjaTo6a0lzb0NvZGluZ0Zvcm1hdFZlbmRvclNwZWNpZmljOwotY29uc3RleHByIHVpbnQxNl90IGtMZUF1ZGlvVmVuZG9yQ29tcGFueUlkVW5kZWZpbmVkID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVBdWRpb1ZlbmRvckNvZGVjSWRVbmRlZmluZWQgPSAweDAwOwotCi0vKiBNZXRhZGF0YSB0eXBlcyBmcm9tIEFzc2lnbmVkIE51bWJlcnMgKi8KLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvTWV0YWRhdGFUeXBlUHJlZmVycmVkQXVkaW9Db250ZXh0ID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvTWV0YWRhdGFUeXBlU3RyZWFtaW5nQXVkaW9Db250ZXh0ID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvTWV0YWRhdGFUeXBlQ2NpZExpc3QgPSAweDAzOwotCi1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb01ldGFkYXRhVHlwZUxlbiA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVBdWRpb01ldGFkYXRhTGVuTGVuID0gMTsKLQotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9NZXRhZGF0YVN0cmVhbWluZ0F1ZGlvQ29udGV4dExlbiA9IDI7Ci0KLS8qIENTSVMgVHlwZXMgKi8KLWNvbnN0ZXhwciB1aW50OF90IGtEZWZhdWx0U2NhbkR1cmF0aW9uUyA9IDU7Ci1jb25zdGV4cHIgdWludDhfdCBrRGVmYXVsdENzaXNTZXRTaXplID0gMjsKLQotY29uc3RleHByIHVpbnQ4X3Qga0xlQXVkaW9EaXJlY3Rpb25TaW5rID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtMZUF1ZGlvRGlyZWN0aW9uU291cmNlID0gMHgwMjsKLQotLyogQXVkaW8gc3RyZWFtIGNvbmZpZyB0eXBlcyAqLwotY29uc3RleHByIHVpbnQ4X3Qga0ZyYW1pbmdVbmZyYW1lZFBkdVN1cHBvcnRlZCA9IDB4MDA7Ci1jb25zdGV4cHIgdWludDhfdCBrRnJhbWluZ1VuZnJhbWVkUGR1VW5zdXBwb3J0ZWQgPSAweDAxOwotCi1jb25zdGV4cHIgdWludDhfdCBrVGFyZ2V0TGF0ZW5jeUxvd2VyID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtUYXJnZXRMYXRlbmN5QmFsYW5jZWRMYXRlbmN5UmVsaWFiaWxpdHkgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3Qga1RhcmdldExhdGVuY3lIaWdoZXJSZWxpYWJpbGl0eSA9IDB4MDM7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtUYXJnZXRQaHkxTSA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrVGFyZ2V0UGh5Mk0gPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3Qga1RhcmdldFBoeUNvZGVkID0gMHgwMzsKLQotY29uc3RleHByIHVpbnQzMl90IGtQcmVzRGVsYXlOb1ByZWZlcmVuY2UgPSAweDAwMDAwMDAwOwotCi1jb25zdGV4cHIgdWludDE2X3Qga01heFRyYW5zcG9ydExhdGVuY3lNaW4gPSAweDAwMDU7Ci1jb25zdGV4cHIgdWludDE2X3Qga01heFRyYW5zcG9ydExhdGVuY3lNYXggPSAweDBGQTA7Ci0KLS8qIEVudW1zICovCi1lbnVtIGNsYXNzIENzaXNMb2NrU3RhdGUgOiB1aW50OF90IHsKLSAgQ1NJU19TVEFURV9VTlNFVCA9IDB4MDAsCi0gIENTSVNfU1RBVEVfVU5MT0NLRUQsCi0gIENTSVNfU1RBVEVfTE9DS0VECi19OwotCi1lbnVtIGNsYXNzIENzaXNEaXNjb3ZlcnlTdGF0ZSA6IHVpbnQ4X3QgewotICBDU0lTX0RJU0NPVkVSWV9JRExFLAotICBDU0lTX0RJU0NPVkVSWV9PTkdPSU5HLAotICBDU0lTX0RJU0NPVkVSWV9DT01QTEVURUQsCi19OwotCi0vKiBBU0Ugc3RhdGVzIGFjY29yZGluZyB0byBCQVAgZGVmaW5lZCBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSBjbGFzcyBBc2VTdGF0ZSA6IHVpbnQ4X3QgewotICBCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUgPSAweDAwLAotICBCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQgPSAweDAxLAotICBCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEID0gMHgwMiwKLSAgQlRBX0xFX0FVRElPX0FTRV9TVEFURV9FTkFCTElORyA9IDB4MDMsCi0gIEJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HID0gMHgwNCwKLSAgQlRBX0xFX0FVRElPX0FTRV9TVEFURV9ESVNBQkxJTkcgPSAweDA1LAotICBCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1JFTEVBU0lORyA9IDB4MDYsCi19OwotCi1lbnVtIGNsYXNzIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZSB7Ci0gIElETEUsCi0gIENJU19ESVNDT05ORUNUSU5HLAotICBDSVNfQVNTSUdORUQsCi0gIENJU19QRU5ESU5HLAotICBDSVNfRVNUQUJMSVNIRUQsCi0gIERBVEFfUEFUSF9FU1RBQkxJU0hFRCwKLX07Ci0KLS8qIENvbnRleHQgVHlwZXMgKi8KLWVudW0gY2xhc3MgTGVBdWRpb0NvbnRleHRUeXBlIDogdWludDE2X3QgewotICBVTklOSVRJQUxJWkVEID0gMHgwMDAwLAotICBVTlNQRUNJRklFRCA9IDB4MDAwMSwKLSAgQ09OVkVSU0FUSU9OQUwgPSAweDAwMDIsCi0gIE1FRElBID0gMHgwMDA0LAotICBHQU1FID0gMHgwMDA4LAotICBJTlNUUlVDVElPTkFMID0gMHgwMDEwLAotICBWT0lDRUFTU0lTVEFOVFMgPSAweDAwMjAsCi0gIExJVkUgPSAweDAwNDAsCi0gIFNPVU5ERUZGRUNUUyA9IDB4MDA4MCwKLSAgTk9USUZJQ0FUSU9OUyA9IDB4MDEwMCwKLSAgUklOR1RPTkUgPSAweDAyMDAsCi0gIEFMRVJUUyA9IDB4MDQwMCwKLSAgRU1FUkdFTkNZQUxBUk0gPSAweDA4MDAsCi0gIFJGVSA9IDB4MTAwMCwKLX07Ci0KLS8qIENvbmZpZ3VyYXRpb24gc3RyYXRlZ3kgKi8KLWVudW0gY2xhc3MgTGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneSA6IHVpbnQ4X3QgewotICBNT05PX09ORV9DSVNfUEVSX0RFVklDRSA9IDB4MDAsIC8qIENvbW1vbiB0cnVlIHdpcmVsZXNzIHNwZWFrZXJzICovCi0gIFNURVJFT19UV09fQ0lTRVNfUEVSX0RFVklDRSA9Ci0gICAgICAweDAxLCAvKiBSZXF1aXJlcyAyIEFTRXMgYW5kIDIgQXVkaW8gQWxsb2NhdGlvbiBmb3IgbGVmdC9yaWdodCAqLwotICBTVEVSRU9fT05FX0NJU19QRVJfREVWSUNFID0gMHgwMiwgLyogUmVxdWlyZXMgY2hhbm5lbCBjb3VudCAyKi8KLSAgUkZVID0gMHgwMywKLX07Ci0KLWNvbnN0ZXhwciBMZUF1ZGlvQ29udGV4dFR5cGUgb3BlcmF0b3J8KExlQXVkaW9Db250ZXh0VHlwZSBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvQ29udGV4dFR5cGUgcmhzKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxMZUF1ZGlvQ29udGV4dFR5cGU+KAotICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8TGVBdWRpb0NvbnRleHRUeXBlPjo6dHlwZT4obGhzKSB8Ci0gICAgICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxMZUF1ZGlvQ29udGV4dFR5cGU+Ojp0eXBlPihyaHMpKTsKLX0KLQotY29uc3RleHByIExlQXVkaW9Db250ZXh0VHlwZSBrTGVBdWRpb0NvbnRleHRBbGxUeXBlc0FycmF5W10gPSB7Ci0gICAgTGVBdWRpb0NvbnRleHRUeXBlOjpVTlNQRUNJRklFRCwgICBMZUF1ZGlvQ29udGV4dFR5cGU6OkNPTlZFUlNBVElPTkFMLAotICAgIExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUEsICAgICAgICAgTGVBdWRpb0NvbnRleHRUeXBlOjpHQU1FLAotICAgIExlQXVkaW9Db250ZXh0VHlwZTo6SU5TVFJVQ1RJT05BTCwgTGVBdWRpb0NvbnRleHRUeXBlOjpWT0lDRUFTU0lTVEFOVFMsCi0gICAgTGVBdWRpb0NvbnRleHRUeXBlOjpMSVZFLCAgICAgICAgICBMZUF1ZGlvQ29udGV4dFR5cGU6OlNPVU5ERUZGRUNUUywKLSAgICBMZUF1ZGlvQ29udGV4dFR5cGU6Ok5PVElGSUNBVElPTlMsIExlQXVkaW9Db250ZXh0VHlwZTo6UklOR1RPTkUsCi0gICAgTGVBdWRpb0NvbnRleHRUeXBlOjpBTEVSVFMsICAgICAgICBMZUF1ZGlvQ29udGV4dFR5cGU6OkVNRVJHRU5DWUFMQVJNLAotfTsKLQotY29uc3RleHByIExlQXVkaW9Db250ZXh0VHlwZSBrTGVBdWRpb0NvbnRleHRBbGxUeXBlcyA9Ci0gICAgTGVBdWRpb0NvbnRleHRUeXBlOjpVTlNQRUNJRklFRCB8IExlQXVkaW9Db250ZXh0VHlwZTo6Q09OVkVSU0FUSU9OQUwgfAotICAgIExlQXVkaW9Db250ZXh0VHlwZTo6TUVESUEgfCBMZUF1ZGlvQ29udGV4dFR5cGU6OkdBTUUgfAotICAgIExlQXVkaW9Db250ZXh0VHlwZTo6SU5TVFJVQ1RJT05BTCB8IExlQXVkaW9Db250ZXh0VHlwZTo6Vk9JQ0VBU1NJU1RBTlRTIHwKLSAgICBMZUF1ZGlvQ29udGV4dFR5cGU6OkxJVkUgfCBMZUF1ZGlvQ29udGV4dFR5cGU6OlNPVU5ERUZGRUNUUyB8Ci0gICAgTGVBdWRpb0NvbnRleHRUeXBlOjpOT1RJRklDQVRJT05TIHwgTGVBdWRpb0NvbnRleHRUeXBlOjpSSU5HVE9ORSB8Ci0gICAgTGVBdWRpb0NvbnRleHRUeXBlOjpBTEVSVFMgfCBMZUF1ZGlvQ29udGV4dFR5cGU6OkVNRVJHRU5DWUFMQVJNOwotCi0vKiBTdHJ1Y3R1cmVzICovCi1jbGFzcyBMZUF1ZGlvTHR2TWFwIHsKLSBwdWJsaWM6Ci0gIExlQXVkaW9MdHZNYXAoKSB7fQotICBMZUF1ZGlvTHR2TWFwKHN0ZDo6bWFwPHVpbnQ4X3QsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiB2YWx1ZXMpCi0gICAgICA6IHZhbHVlcyhzdGQ6Om1vdmUodmFsdWVzKSkge30KLQotICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBGaW5kKHVpbnQ4X3QgdHlwZSkgY29uc3Q7Ci0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlcy5lbXB0eSgpOyB9Ci0gIHZvaWQgQ2xlYXIoKSB7IHZhbHVlcy5jbGVhcigpOyB9Ci0gIHNpemVfdCBTaXplKCkgY29uc3QgeyByZXR1cm4gdmFsdWVzLnNpemUoKTsgfQotICBjb25zdCBzdGQ6Om1hcDx1aW50OF90LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIFZhbHVlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0gIHNpemVfdCBSYXdQYWNrZXRTaXplKCkgY29uc3Q7Ci0gIHVpbnQ4X3QqIFJhd1BhY2tldCh1aW50OF90KiBwX2J1ZikgY29uc3Q7Ci0gIHN0YXRpYyBMZUF1ZGlvTHR2TWFwIFBhcnNlKGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB1aW50OF90IGxlbiwgYm9vbCYgc3VjY2Vzcyk7Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDx1aW50OF90LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gdmFsdWVzOwotfTsKLQotc3RydWN0IExlQXVkaW9MYzNDb25maWcgewotICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8dWludDhfdCwgdWludDMyX3Q+IHNhbXBsaW5nX2ZyZXFfbWFwOwotICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8dWludDhfdCwgdWludDMyX3Q+IGZyYW1lX2R1cmF0aW9uX21hcDsKLQotICB1aW50OF90IHNhbXBsaW5nX2ZyZXF1ZW5jeTsKLSAgdWludDhfdCBmcmFtZV9kdXJhdGlvbjsKLSAgdWludDE2X3Qgb2N0ZXRzX3Blcl9jb2RlY19mcmFtZTsKLSAgdWludDMyX3QgYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uOwotICB1aW50OF90IGNoYW5uZWxfY291bnQ7Ci0KLSAgLyoqIFJldHVybnMgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSByZXByZXNlbnRhdGlvbiBpbiBIeiAqLwotICB1aW50MzJfdCBHZXRTYW1wbGluZ0ZyZXF1ZW5jeUh6KCkgY29uc3QgewotICAgIHJldHVybiBzYW1wbGluZ19mcmVxX21hcC5jb3VudChzYW1wbGluZ19mcmVxdWVuY3kpCi0gICAgICAgICAgICAgICA/IHNhbXBsaW5nX2ZyZXFfbWFwLmF0KHNhbXBsaW5nX2ZyZXF1ZW5jeSkKLSAgICAgICAgICAgICAgIDogMDsKLSAgfQotCi0gIC8qKiBSZXR1cm5zIHRoZSBmcmFtZSBkdXJhdGlvbiByZXByZXNlbnRhdGlvbiBpbiB1cyAqLwotICB1aW50MzJfdCBHZXRGcmFtZUR1cmF0aW9uVXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZyYW1lX2R1cmF0aW9uX21hcC5jb3VudChmcmFtZV9kdXJhdGlvbikKLSAgICAgICAgICAgICAgID8gZnJhbWVfZHVyYXRpb25fbWFwLmF0KGZyYW1lX2R1cmF0aW9uKQotICAgICAgICAgICAgICAgOiAwOwotICB9Ci0KLSAgdWludDhfdCBHZXRDaGFubmVsQ291bnQodm9pZCkgY29uc3QgeyByZXR1cm4gY2hhbm5lbF9jb3VudDsgfQotCi0gIExlQXVkaW9MdHZNYXAgR2V0QXNMdHZNYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIExlQXVkaW9MdHZNYXAoewotICAgICAgICB7Y29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzVHlwZVNhbXBsaW5nRnJlcSwKLSAgICAgICAgIFVJTlQ4X1RPX1ZFQ19VSU5UOChzYW1wbGluZ19mcmVxdWVuY3kpfSwKLSAgICAgICAge2NvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM1R5cGVGcmFtZUR1cmF0aW9uLAotICAgICAgICAgVUlOVDhfVE9fVkVDX1VJTlQ4KGZyYW1lX2R1cmF0aW9uKX0sCi0gICAgICAgIHtjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNUeXBlQXVkaW9DaGFubmVsQWxsb2NhdGlvbiwKLSAgICAgICAgIFVJTlQzMl9UT19WRUNfVUlOVDgoYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uKX0sCi0gICAgICAgIHtjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvQ29kZWNMQzNUeXBlT2N0ZXRQZXJGcmFtZSwKLSAgICAgICAgIFVJTlQxNl9UT19WRUNfVUlOVDgob2N0ZXRzX3Blcl9jb2RlY19mcmFtZSl9LAotICAgIH0pOwotICB9Ci19OwotCi1zdHJ1Y3QgTGVBdWRpb0NvZGVjSWQgewotICB1aW50OF90IGNvZGluZ19mb3JtYXQ7Ci0gIHVpbnQxNl90IHZlbmRvcl9jb21wYW55X2lkOwotICB1aW50MTZfdCB2ZW5kb3JfY29kZWNfaWQ7Ci0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMZUF1ZGlvQ29kZWNJZCYgbGhzLCBjb25zdCBMZUF1ZGlvQ29kZWNJZCYgcmhzKSB7Ci0gICAgaWYgKGxocy5jb2RpbmdfZm9ybWF0ICE9IHJocy5jb2RpbmdfZm9ybWF0KSByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobGhzLmNvZGluZ19mb3JtYXQgPT0ga0xlQXVkaW9Db2RpbmdGb3JtYXRWZW5kb3JTcGVjaWZpYyAmJgotICAgICAgICAobGhzLnZlbmRvcl9jb21wYW55X2lkICE9IHJocy52ZW5kb3JfY29tcGFueV9pZCB8fAotICAgICAgICAgbGhzLnZlbmRvcl9jb2RlY19pZCAhPSByaHMudmVuZG9yX2NvZGVjX2lkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBMZUF1ZGlvQ29kZWNJZCYgbGhzLCBjb25zdCBMZUF1ZGlvQ29kZWNJZCYgcmhzKSB7Ci0gICAgcmV0dXJuICEobGhzID09IHJocyk7Ci0gIH0KLX07Ci0KLXN0cnVjdCBoZGxfcGFpciB7Ci0gIGhkbF9wYWlyKCkgPSBkZWZhdWx0OwotICBoZGxfcGFpcih1aW50MTZfdCB2YWxfaGRsLCB1aW50MTZfdCBjY2NfaGRsKQotICAgICAgOiB2YWxfaGRsKHZhbF9oZGwpLCBjY2NfaGRsKGNjY19oZGwpIHt9Ci0KLSAgdWludDE2X3QgdmFsX2hkbCA9IDA7Ci0gIHVpbnQxNl90IGNjY19oZGwgPSAwOwotfTsKLQotc3RydWN0IGFzZSB7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQXNlSWRJbnZhbGlkID0gMHgwMDsKLQotICBhc2UodWludDE2X3QgdmFsX2hkbCwgdWludDE2X3QgY2NjX2hkbCwgdWludDhfdCBkaXJlY3Rpb24pCi0gICAgICA6IGhkbHModmFsX2hkbCwgY2NjX2hkbCksCi0gICAgICAgIGlkKGtBc2VJZEludmFsaWQpLAotICAgICAgICBjaXNfaWQoa0ludmFsaWRDaXNJZCksCi0gICAgICAgIGRpcmVjdGlvbihkaXJlY3Rpb24pLAotICAgICAgICBhY3RpdmUoZmFsc2UpLAotICAgICAgICByZWNvbmZpZ3VyZShmYWxzZSksCi0gICAgICAgIGRhdGFfcGF0aF9zdGF0ZShBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OklETEUpLAotICAgICAgICBwcmVmZXJyZWRfcGh5KDApLAotICAgICAgICBzdGF0ZShBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKSB7fQotCi0gIHN0cnVjdCBoZGxfcGFpciBoZGxzOwotICB1aW50OF90IGlkOwotICB1aW50OF90IGNpc19pZDsKLSAgY29uc3QgdWludDhfdCBkaXJlY3Rpb247Ci0gIHVpbnQxNl90IGNpc19jb25uX2hkbCA9IDA7Ci0KLSAgYm9vbCBhY3RpdmU7Ci0gIGJvb2wgcmVjb25maWd1cmU7Ci0gIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZSBkYXRhX3BhdGhfc3RhdGU7Ci0KLSAgLyogQ29kZWMgY29uZmlndXJhdGlvbiAqLwotICBMZUF1ZGlvQ29kZWNJZCBjb2RlY19pZDsKLSAgTGVBdWRpb0xjM0NvbmZpZyBjb2RlY19jb25maWc7Ci0gIHVpbnQ4X3QgZnJhbWluZzsKLSAgdWludDhfdCBwcmVmZXJyZWRfcGh5OwotCi0gIC8qIFFvcyBjb25maWd1cmF0aW9uICovCi0gIHVpbnQxNl90IG1heF9zZHVfc2l6ZTsKLSAgdWludDhfdCByZXRyYW5zX25iOwotICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3k7Ci0gIHVpbnQzMl90IHByZXNfZGVsYXlfbWluOwotICB1aW50MzJfdCBwcmVzX2RlbGF5X21heDsKLSAgdWludDMyX3QgcHJlZmVycmVkX3ByZXNfZGVsYXlfbWluOwotICB1aW50MzJfdCBwcmVmZXJyZWRfcHJlc19kZWxheV9tYXg7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWV0YWRhdGE7Ci0KLSAgQXNlU3RhdGUgc3RhdGU7Ci19OwotCi1zdHJ1Y3QgQmlkaXJlY3RBc2VzUGFpciB7Ci0gIHN0cnVjdCBhc2UqIHNpbms7Ci0gIHN0cnVjdCBhc2UqIHNvdXJjZTsKLX07Ci0KLXN0cnVjdCBhY3NfYWNfcmVjb3JkIHsKLSAgTGVBdWRpb0NvZGVjSWQgY29kZWNfaWQ7Ci0gIExlQXVkaW9MdHZNYXAgY29kZWNfc3BlY19jYXBzOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtZXRhZGF0YTsKLX07Ci0KLXVzaW5nIFB1Ymxpc2hlZEF1ZGlvQ2FwYWJpbGl0aWVzID0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPGhkbF9wYWlyLCBzdGQ6OnZlY3RvcjxhY3NfYWNfcmVjb3JkPj4+OwotdXNpbmcgQXVkaW9Mb2NhdGlvbnMgPSBzdGQ6OmJpdHNldDwzMj47Ci11c2luZyBBdWRpb0NvbnRleHRzID0gc3RkOjpiaXRzZXQ8MTY+OwotCi19ICAvLyBuYW1lc3BhY2UgdHlwZXMKLQotbmFtZXNwYWNlIHNldF9jb25maWd1cmF0aW9ucyB7Ci0KLXN0cnVjdCBDb2RlY0NhcGFiaWxpdHlTZXR0aW5nIHsKLSAgdHlwZXM6OkxlQXVkaW9Db2RlY0lkIGlkOwotCi0gIC8qIENvZGVjIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gdmFyaWFudCAqLwotICBzdGQ6OnZhcmlhbnQ8dHlwZXM6OkxlQXVkaW9MYzNDb25maWc+IGNvbmZpZzsKLQotICAvKiBTYW1wbGluZyBmcmVxZW5jeSByZXF1ZXN0ZWQgZm9yIGNvZGVjICovCi0gIHVpbnQzMl90IEdldENvbmZpZ1NhbXBsaW5nRnJlcXVlbmN5KCkgY29uc3Q7Ci0gIC8qIERhdGEgZmV0Y2gvZmVlZCBpbnRlcnZhbCBmb3IgY29kZWMgaW4gbWljcm9zZWNvbmRzICovCi0gIHVpbnQzMl90IEdldENvbmZpZ0RhdGFJbnRlcnZhbFVzKCkgY29uc3Q7Ci0gIC8qIEF1ZGlvIGJpdCBkZXB0aCByZXF1aXJlZCBmb3IgY29kZWMgKi8KLSAgdWludDhfdCBHZXRDb25maWdCaXRzUGVyU2FtcGxlKCkgY29uc3Q7Ci0gIC8qIEF1ZGlvIGNoYW5uZWxzIG51bWJlciBmb3Igc3RyZWFtICovCi0gIHVpbnQ4X3QgR2V0Q29uZmlnQ2hhbm5lbENvdW50KCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgU2V0Q29uZmlndXJhdGlvbiB7Ci0gIFNldENvbmZpZ3VyYXRpb24odWludDhfdCBkaXJlY3Rpb24sIHVpbnQ4X3QgZGV2aWNlX2NudCwgdWludDhfdCBhc2VfY250LAotICAgICAgICAgICAgICAgICAgIENvZGVjQ2FwYWJpbGl0eVNldHRpbmcgY29kZWMsCi0gICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5IHN0cmF0ZWd5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PTk9fT05FX0NJU19QRVJfREVWSUNFKQotICAgICAgOiBkaXJlY3Rpb24oZGlyZWN0aW9uKSwKLSAgICAgICAgZGV2aWNlX2NudChkZXZpY2VfY250KSwKLSAgICAgICAgYXNlX2NudChhc2VfY250KSwKLSAgICAgICAgY29kZWMoY29kZWMpLAotICAgICAgICBzdHJhdGVneShzdHJhdGVneSkge30KLQotICB1aW50OF90IGRpcmVjdGlvbjsgIC8qIERpcmVjdGlvbiBvZiBzZXQgKi8KLSAgdWludDhfdCBkZXZpY2VfY250OyAvKiBIb3cgbWFueSBkZXZpY2VzIG11c3QgYmUgaW4gc2V0ICovCi0gIHVpbnQ4X3QgYXNlX2NudDsgICAgLyogSG93IG1hbnkgQVNFIHdlIG5lZWQgaW4gY29uZmlndXJhdGlvbiAqLwotICBDb2RlY0NhcGFiaWxpdHlTZXR0aW5nIGNvZGVjOwotICB0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneSBzdHJhdGVneTsKLX07Ci0KLS8qIERlZmluZWQgYXVkaW8gc2NlbmFyaW9zICovCi1zdHJ1Y3QgQXVkaW9TZXRDb25maWd1cmF0aW9uIHsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgc3RkOjp2ZWN0b3I8c3RydWN0IFNldENvbmZpZ3VyYXRpb24+IGNvbmZzOwotfTsKLQotdXNpbmcgQXVkaW9TZXRDb25maWd1cmF0aW9ucyA9IHN0ZDo6dmVjdG9yPGNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbio+OwotCi1jb25zdCB0eXBlczo6TGVBdWRpb0NvZGVjSWQgTGVBdWRpb0NvZGVjSWRMYzMgPSB7Ci0gICAgLmNvZGluZ19mb3JtYXQgPSB0eXBlczo6a0xlQXVkaW9Db2RpbmdGb3JtYXRMQzMsCi0gICAgLnZlbmRvcl9jb21wYW55X2lkID0gdHlwZXM6OmtMZUF1ZGlvVmVuZG9yQ29tcGFueUlkVW5kZWZpbmVkLAotICAgIC52ZW5kb3JfY29kZWNfaWQgPSB0eXBlczo6a0xlQXVkaW9WZW5kb3JDb2RlY0lkVW5kZWZpbmVkfTsKLQotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQ2hhbm5lbEFsbG9jYXRpb25Nb25vID0KLSAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Nb25vVW5zcGVjaWZpZWQ7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtDaGFubmVsQWxsb2NhdGlvblN0ZXJlbyA9Ci0gICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0xvY2F0aW9uRnJvbnRMZWZ0IHwKLSAgICBjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0OwotCi0vKioKLSAqIFN1cHBvcnRlZCBhdWRpbyBjb2RlYyBjYXBhYmlsaXR5IHNldHRpbmdzCi0gKgotICogVGhlIHN1YnNldCBvZiBjYXBhYmlsaXRpZXMgZGVmaW5lZCBpbiBCQVBfVmFsaWRhdGlvbl9yMTMgVGFibGUgMy42LgotICovCi1jb25zdGV4cHIgQ29kZWNDYXBhYmlsaXR5U2V0dGluZyBjb2RlY19sYzNfMTZfMSh1aW50OF90IGNoYW5uZWxfY291bnQpIHsKLSAgcmV0dXJuIENvZGVjQ2FwYWJpbGl0eVNldHRpbmd7Ci0gICAgICAuaWQgPSBMZUF1ZGlvQ29kZWNJZExjMywKLSAgICAgIC5jb25maWcgPSB0eXBlczo6TGVBdWRpb0xjM0NvbmZpZyh7Ci0gICAgICAgICAgLnNhbXBsaW5nX2ZyZXF1ZW5jeSA9IGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9TYW1wbGluZ0ZyZXExNjAwMEh6LAotICAgICAgICAgIC5mcmFtZV9kdXJhdGlvbiA9IGNvZGVjX3NwZWNfY29uZjo6a0xlQXVkaW9Db2RlY0xDM0ZyYW1lRHVyNzUwMHVzLAotICAgICAgICAgIC5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lID0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVMZW4zMCwKLSAgICAgICAgICAuY2hhbm5lbF9jb3VudCA9IGNoYW5uZWxfY291bnQsCi0gICAgICAgICAgLmF1ZGlvX2NoYW5uZWxfYWxsb2NhdGlvbiA9IDAsCi0gICAgICB9KX07Ci19Ci0KLWNvbnN0ZXhwciBDb2RlY0NhcGFiaWxpdHlTZXR0aW5nIGNvZGVjX2xjM18xNl8yKHVpbnQ4X3QgY2hhbm5lbF9jb3VudCkgewotICByZXR1cm4gQ29kZWNDYXBhYmlsaXR5U2V0dGluZ3sKLSAgICAgIC5pZCA9IExlQXVkaW9Db2RlY0lkTGMzLAotICAgICAgLmNvbmZpZyA9IHR5cGVzOjpMZUF1ZGlvTGMzQ29uZmlnKHsKLSAgICAgICAgICAuc2FtcGxpbmdfZnJlcXVlbmN5ID0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTE2MDAwSHosCi0gICAgICAgICAgLmZyYW1lX2R1cmF0aW9uID0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVEdXIxMDAwMHVzLAotICAgICAgICAgIC5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lID0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVMZW40MCwKLSAgICAgICAgICAuY2hhbm5lbF9jb3VudCA9IGNoYW5uZWxfY291bnQsCi0gICAgICAgICAgLmF1ZGlvX2NoYW5uZWxfYWxsb2NhdGlvbiA9IDAsCi0gICAgICB9KX07Ci19Ci0KLWNvbnN0ZXhwciBDb2RlY0NhcGFiaWxpdHlTZXR0aW5nIGNvZGVjX2xjM180OF80KHVpbnQ4X3QgY2hhbm5lbF9jb3VudCkgewotICByZXR1cm4gQ29kZWNDYXBhYmlsaXR5U2V0dGluZ3sKLSAgICAgIC5pZCA9IExlQXVkaW9Db2RlY0lkTGMzLAotICAgICAgLmNvbmZpZyA9IHR5cGVzOjpMZUF1ZGlvTGMzQ29uZmlnKHsKLSAgICAgICAgICAuc2FtcGxpbmdfZnJlcXVlbmN5ID0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb1NhbXBsaW5nRnJlcTQ4MDAwSHosCi0gICAgICAgICAgLmZyYW1lX2R1cmF0aW9uID0gY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVEdXIxMDAwMHVzLAotICAgICAgICAgIC5vY3RldHNfcGVyX2NvZGVjX2ZyYW1lID0KLSAgICAgICAgICAgICAgY29kZWNfc3BlY19jb25mOjprTGVBdWRpb0NvZGVjTEMzRnJhbWVMZW4xMjAsCi0gICAgICAgICAgLmNoYW5uZWxfY291bnQgPSBjaGFubmVsX2NvdW50LAotICAgICAgICAgIC5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24gPSAwLAotICAgICAgfSl9OwotfQotCi0vKgotICogQXVkaW9TZXRDb25maWd1cmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIHNldCBjb25maWd1cmF0aW9uIGFuZCBjb2RlYyBzZXR0aW5ncwotICogdG8gdG8gYmUgdXNlZCBieSBsZSBhdWRpbyBwb2xpY3kgdG8gbWF0Y2ggdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gd2l0aAotICogYXVkaW8gc2VydmVyIGNhcGFiaWxpdGllcy4gVGhlIGNvZGVjIHNldHRpbmdzIGFyZSBkZWZpbmVkIHdpdGggcmVzcGVjdCB0bwotICogIkJyb2FkY2FzdCBTb3VyY2UgYXVkaW8gY2FwYWJpbGl0eSBjb25maWd1cmF0aW9uIHN1cHBvcnQgcmVxdWlyZW1lbnRzIgotICogZGVmaW5lZCBpbiBCQVAgZDA5cjA2Ci0gKi8KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rXzE2XzIgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua18xNl8yIiwKLSAgICAuY29uZnMgPSB7U2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMSwgMSwKLSAgICAgICAgY29kZWNfbGMzXzE2XzIoCi0gICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uIGtTaW5nbGVEZXZfT25lQ2hhbk1vbm9TbmtfMTZfMSA9IHsKLSAgICAubmFtZSA9ICJrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rXzE2XzEiLAotICAgIC5jb25mcyA9IHtTZXRDb25maWd1cmF0aW9uKAotICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLCAxLCAxLAotICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rXzE2XzEgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rXzE2XzEiLAotICAgIC5jb25mcyA9IHtTZXRDb25maWd1cmF0aW9uKAotICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLCAxLCAxLAotICAgICAgICBjb2RlY19sYzNfMTZfMShjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRUd29DaGFubmVsKSwKLSAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjoKLSAgICAgICAgICAgIFNURVJFT19PTkVfQ0lTX1BFUl9ERVZJQ0UpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfMTZfMSA9IHsKLSAgICAubmFtZSA9ICJrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfMTZfMSIsCi0gICAgLmNvbmZzID0ge1NldENvbmZpZ3VyYXRpb24oCi0gICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDEsIDIsCi0gICAgICAgIGNvZGVjX2xjM18xNl8xKAotICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCksCi0gICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICBTVEVSRU9fVFdPX0NJU0VTX1BFUl9ERVZJQ0UpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rXzE2XzEgPSB7Ci0gICAgLm5hbWUgPSAia0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua18xNl8xIiwKLSAgICAuY29uZnMgPSB7U2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMiwgMiwKLSAgICAgICAgY29kZWNfbGMzXzE2XzEoCi0gICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uIGtTaW5nbGVEZXZfVHdvQ2hhblN0ZXJlb1Nua180OF80ID0gewotICAgIC5uYW1lID0gImtTaW5nbGVEZXZfVHdvQ2hhblN0ZXJlb1Nua180OF80IiwKLSAgICAuY29uZnMgPSB7U2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMSwgMSwKLSAgICAgICAgY29kZWNfbGMzXzQ4XzQoY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50VHdvQ2hhbm5lbCksCi0gICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICBTVEVSRU9fT05FX0NJU19QRVJfREVWSUNFKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua180OF80ID0gewotICAgIC5uYW1lID0gImtEdWFsRGV2X09uZUNoYW5TdGVyZW9TbmtfNDhfNCIsCi0gICAgLmNvbmZzID0ge1NldENvbmZpZ3VyYXRpb24oCi0gICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDIsIDIsCi0gICAgICAgIGNvZGVjX2xjM180OF80KAotICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCkpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfNDhfNCA9IHsKLSAgICAubmFtZSA9ICJrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfNDhfNCIsCi0gICAgLmNvbmZzID0ge1NldENvbmZpZ3VyYXRpb24oCi0gICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDEsIDIsCi0gICAgICAgIGNvZGVjX2xjM180OF80KAotICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCksCi0gICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICBTVEVSRU9fVFdPX0NJU0VTX1BFUl9ERVZJQ0UpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rXzQ4XzQgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua180OF80IiwKLSAgICAuY29uZnMgPSB7U2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMSwgMSwKLSAgICAgICAgY29kZWNfbGMzXzQ4XzQoCi0gICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uIGtTaW5nbGVEZXZfVHdvQ2hhblN0ZXJlb1Nua18xNl8yID0gewotICAgIC5uYW1lID0gImtTaW5nbGVEZXZfVHdvQ2hhblN0ZXJlb1Nua18xNl8yIiwKLSAgICAuY29uZnMgPSB7U2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMSwgMSwKLSAgICAgICAgY29kZWNfbGMzXzE2XzIoY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50VHdvQ2hhbm5lbCksCi0gICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICBTVEVSRU9fT05FX0NJU19QRVJfREVWSUNFKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga1NpbmdsZURldl9PbmVDaGFuU3RlcmVvU25rXzE2XzIgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9PbmVDaGFuU3RlcmVvU25rXzE2XzIiLAotICAgIC5jb25mcyA9IHtTZXRDb25maWd1cmF0aW9uKAotICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLCAxLCAyLAotICAgICAgICBjb2RlY19sYzNfMTZfMigKLSAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpLAotICAgICAgICBsZV9hdWRpbzo6dHlwZXM6OkxlQXVkaW9Db25maWd1cmF0aW9uU3RyYXRlZ3k6OgotICAgICAgICAgICAgU1RFUkVPX1RXT19DSVNFU19QRVJfREVWSUNFKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua18xNl8yID0gewotICAgIC5uYW1lID0gImtEdWFsRGV2X09uZUNoYW5TdGVyZW9TbmtfMTZfMiIsCi0gICAgLmNvbmZzID0ge1NldENvbmZpZ3VyYXRpb24oCi0gICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDIsIDIsCi0gICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCkpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rX09uZUNoYW5Nb25vU3JjXzE2XzEgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua19PbmVDaGFuTW9ub1NyY18xNl8xIiwKLSAgICAuY29uZnMgPSB7Ci0gICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLCAxLCAxLAotICAgICAgICAgICAgY29kZWNfbGMzXzE2XzEoCi0gICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCkpLAotICAgICAgICBTZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlLCAxLCAxLAotICAgICAgICAgICAgY29kZWNfbGMzXzE2XzEoCi0gICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCkpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rX09uZUNoYW5Nb25vU3JjXzE2XzIgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua19PbmVDaGFuTW9ub1NyY18xNl8yIiwKLSAgICAuY29uZnMgPSB7Ci0gICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLCAxLCAxLAotICAgICAgICAgICAgY29kZWNfbGMzXzE2XzIoCi0gICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCkpLAotICAgICAgICBTZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlLCAxLCAxLAotICAgICAgICAgICAgY29kZWNfbGMzXzE2XzIoCi0gICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCkpfX07Ci0KLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbiBrU2luZ2xlRGV2X1R3b0NoYW5TdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMiA9IHsKLSAgICAubmFtZSA9ICJrU2luZ2xlRGV2X1R3b0NoYW5TdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMiIsCi0gICAgLmNvbmZzID0gewotICAgICAgICBTZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMSwgMSwKLSAgICAgICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFR3b0NoYW5uZWwpLAotICAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjoKLSAgICAgICAgICAgICAgICBTVEVSRU9fT05FX0NJU19QRVJfREVWSUNFKSwKLSAgICAgICAgU2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSwgMSwgMSwKLSAgICAgICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24KLSAgICBrRHVhbERldl9PbmVDaGFuRG91YmxlU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzIgPSB7Ci0gICAgICAgIC5uYW1lID0gImtEdWFsRGV2X09uZUNoYW5Eb3VibGVTdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMiIsCi0gICAgICAgIC5jb25mcyA9IHsKLSAgICAgICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMiwgNCwKLSAgICAgICAgICAgICAgICBjb2RlY19sYzNfMTZfMigKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCksCi0gICAgICAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29uZmlndXJhdGlvblN0cmF0ZWd5OjoKLSAgICAgICAgICAgICAgICAgICAgU1RFUkVPX1RXT19DSVNFU19QRVJfREVWSUNFKSwKLSAgICAgICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlLCAxLCAxLAotICAgICAgICAgICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OgotICAgICAgICAgICAgICAgICAgICAgICAga0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga1NpbmdsZURldl9PbmVDaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzIgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9PbmVDaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzIiLAotICAgIC5jb25mcyA9IHsKLSAgICAgICAgU2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDEsIDIsCi0gICAgICAgICAgICBjb2RlY19sYzNfMTZfMigKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSwKLSAgICAgICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICAgICAgU1RFUkVPX1RXT19DSVNFU19QRVJfREVWSUNFKSwKLSAgICAgICAgU2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSwgMSwgMSwKLSAgICAgICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8yID0gewotICAgIC5uYW1lID0gImtEdWFsRGV2X09uZUNoYW5TdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMiIsCi0gICAgLmNvbmZzID0gewotICAgICAgICBTZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgdHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaywgMiwgMiwKLSAgICAgICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpKSwKLSAgICAgICAgU2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSwgMSwgMSwKLSAgICAgICAgICAgIGNvZGVjX2xjM18xNl8yKAotICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpKX19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24ga1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzEgPSB7Ci0gICAgLm5hbWUgPSAia1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzEiLAotICAgIC5jb25mcyA9IHsKLSAgICAgICAgU2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDEsIDEsCi0gICAgICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRUd29DaGFubmVsKSwKLSAgICAgICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICAgICAgU1RFUkVPX09ORV9DSVNfUEVSX0RFVklDRSksCi0gICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25Tb3VyY2UsIDEsIDEsCi0gICAgICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uIGtTaW5nbGVEZXZfT25lQ2hhblN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8xID0gewotICAgIC5uYW1lID0gImtTaW5nbGVEZXZfT25lQ2hhblN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8xIiwKLSAgICAuY29uZnMgPSB7Ci0gICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rLCAxLCAyLAotICAgICAgICAgICAgY29kZWNfbGMzXzE2XzEoCi0gICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjprTGVBdWRpb0NvZGVjTEMzQ2hhbm5lbENvdW50U2luZ2xlQ2hhbm5lbCksCi0gICAgICAgICAgICBsZV9hdWRpbzo6dHlwZXM6OkxlQXVkaW9Db25maWd1cmF0aW9uU3RyYXRlZ3k6OgotICAgICAgICAgICAgICAgIFNURVJFT19UV09fQ0lTRVNfUEVSX0RFVklDRSksCi0gICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25Tb3VyY2UsIDEsIDEsCi0gICAgICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uIGtEdWFsRGV2X09uZUNoYW5TdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMSA9IHsKLSAgICAubmFtZSA9ICJrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzEiLAotICAgIC5jb25mcyA9IHsKLSAgICAgICAgU2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDIsIDIsCi0gICAgICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSksCi0gICAgICAgIFNldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICB0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25Tb3VyY2UsIDEsIDEsCi0gICAgICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjX2NhcHM6OmtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9uCi0gICAga0R1YWxEZXZfT25lQ2hhbkRvdWJsZVN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8xID0gewotICAgICAgICAubmFtZSA9ICJrRHVhbERldl9PbmVDaGFuRG91YmxlU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzEiLAotICAgICAgICAuY29uZnMgPSB7Ci0gICAgICAgICAgICBTZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmssIDIsIDQsCi0gICAgICAgICAgICAgICAgY29kZWNfbGMzXzE2XzEoCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNfY2Fwczo6a0xlQXVkaW9Db2RlY0xDM0NoYW5uZWxDb3VudFNpbmdsZUNoYW5uZWwpLAotICAgICAgICAgICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbmZpZ3VyYXRpb25TdHJhdGVneTo6Ci0gICAgICAgICAgICAgICAgICAgIFNURVJFT19UV09fQ0lTRVNfUEVSX0RFVklDRSksCi0gICAgICAgICAgICBTZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIHR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSwgMSwgMSwKLSAgICAgICAgICAgICAgICBjb2RlY19sYzNfMTZfMSgKLSAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY19jYXBzOjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGtMZUF1ZGlvQ29kZWNMQzNDaGFubmVsQ291bnRTaW5nbGVDaGFubmVsKSl9fTsKLQotLyogRGVmaW5lZCBhdWRpbyBzY2VuYXJpbyBsaW5rZWQgd2l0aCBjb250ZXh0IHR5cGUsIHByaW9yaXR5IHNvcnRlZCAqLwotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9ucyBhdWRpb19zZXRfY29uZl9yaW5ndG9uZSA9IHsKLSAgICAma0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua18xNl8yLCAgICZrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rXzE2XzEsCi0gICAgJmtTaW5nbGVEZXZfT25lQ2hhblN0ZXJlb1Nua18xNl8yLCAma1NpbmdsZURldl9PbmVDaGFuU3RlcmVvU25rXzE2XzEsCi0gICAgJmtTaW5nbGVEZXZfVHdvQ2hhblN0ZXJlb1Nua18xNl8yLCAma1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rXzE2XzEsCi0gICAgJmtTaW5nbGVEZXZfT25lQ2hhbk1vbm9TbmtfMTZfMiwgICAma1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua18xNl8xLAotfTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9ucyBhdWRpb19zZXRfY29uZl9jb252ZXJzYXRpb25hbCA9IHsKLSAgICAma0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8yLAotICAgICZrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzEsCi0gICAgJmtEdWFsRGV2X09uZUNoYW5Eb3VibGVTdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMiwKLSAgICAma0R1YWxEZXZfT25lQ2hhbkRvdWJsZVN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8xLAotICAgICZrU2luZ2xlRGV2X1R3b0NoYW5TdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMiwKLSAgICAma1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rX09uZUNoYW5Nb25vU3JjXzE2XzEsCi0gICAgJmtTaW5nbGVEZXZfT25lQ2hhblN0ZXJlb1Nua19PbmVDaGFuTW9ub1NyY18xNl8yLAotICAgICZrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfT25lQ2hhbk1vbm9TcmNfMTZfMSwKLSAgICAma1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua19PbmVDaGFuTW9ub1NyY18xNl8yLAotICAgICZrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rX09uZUNoYW5Nb25vU3JjXzE2XzEsCi19OwotCi1jb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb25zIGF1ZGlvX3NldF9jb25mX21lZGlhID0gewotICAgICZrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rXzQ4XzQsICAgJmtEdWFsRGV2X09uZUNoYW5TdGVyZW9TbmtfMTZfMiwKLSAgICAma0R1YWxEZXZfT25lQ2hhblN0ZXJlb1Nua18xNl8xLCAgICZrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfNDhfNCwKLSAgICAma1NpbmdsZURldl9PbmVDaGFuU3RlcmVvU25rXzE2XzIsICZrU2luZ2xlRGV2X09uZUNoYW5TdGVyZW9TbmtfMTZfMSwKLSAgICAma1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rXzQ4XzQsICZrU2luZ2xlRGV2X1R3b0NoYW5TdGVyZW9TbmtfMTZfMiwKLSAgICAma1NpbmdsZURldl9Ud29DaGFuU3RlcmVvU25rXzE2XzEsICZrU2luZ2xlRGV2X09uZUNoYW5Nb25vU25rXzQ4XzQsCi0gICAgJmtTaW5nbGVEZXZfT25lQ2hhbk1vbm9TbmtfMTZfMiwgICAma1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua18xNl8xLAotfTsKLQotY29uc3QgQXVkaW9TZXRDb25maWd1cmF0aW9ucyBhdWRpb19zZXRfY29uZl9kZWZhdWx0ID0gewotICAgICZrRHVhbERldl9PbmVDaGFuU3RlcmVvU25rXzE2XzIsCi0gICAgJmtTaW5nbGVEZXZfT25lQ2hhblN0ZXJlb1Nua18xNl8yLAotICAgICZrU2luZ2xlRGV2X1R3b0NoYW5TdGVyZW9TbmtfMTZfMiwKLSAgICAma1NpbmdsZURldl9PbmVDaGFuTW9ub1Nua18xNl8yLAotfTsKLQotLyogRGVjbGFyYXRpb25zICovCi1ib29sIGNoZWNrX2lmX21heV9jb3Zlcl9zY2VuYXJpbygKLSAgICBjb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb25zKiBhdWRpb19zZXRfY29uZmlndXJhdGlvbnMsIHVpbnQ4X3QgZ3JvdXBfc2l6ZSk7Ci1ib29sIGNoZWNrX2lmX21heV9jb3Zlcl9zY2VuYXJpbygKLSAgICBjb25zdCBBdWRpb1NldENvbmZpZ3VyYXRpb24qIGF1ZGlvX3NldF9jb25maWd1cmF0aW9uLCB1aW50OF90IGdyb3VwX3NpemUpOwotYm9vbCBJc0NvZGVjQ2FwYWJpbGl0eVNldHRpbmdTdXBwb3J0ZWQoCi0gICAgY29uc3QgdHlwZXM6OmFjc19hY19yZWNvcmQmIHBhY19yZWNvcmQsCi0gICAgY29uc3QgQ29kZWNDYXBhYmlsaXR5U2V0dGluZyYgY29kZWNfY2FwYWJpbGl0eV9zZXR0aW5nKTsKLWNvbnN0IEF1ZGlvU2V0Q29uZmlndXJhdGlvbnMqIGdldF9jb25mc19ieV90eXBlKHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgdHlwZSk7Ci19ICAvLyBuYW1lc3BhY2Ugc2V0X2NvbmZpZ3VyYXRpb25zCi0KLXN0cnVjdCBzdHJlYW1fY29uZmlndXJhdGlvbiB7Ci0gIGJvb2wgdmFsaWQ7Ci0KLSAgdHlwZXM6OkxlQXVkaW9Db2RlY0lkIGlkOwotCi0gIC8qIFBvaW50ZXIgdG8gY2hvc2VuIHJlcSAqLwotICBjb25zdCBsZV9hdWRpbzo6c2V0X2NvbmZpZ3VyYXRpb25zOjpBdWRpb1NldENvbmZpZ3VyYXRpb24qIGNvbmY7Ci0KLSAgLyogU2luayBjb25maWd1cmF0aW9uICovCi0gIC8qIEZvciBub3cgd2UgaGF2ZSBhbHdheXMgc2FtZSBmcmVxdWVuY3kgZm9yIGFsbCB0aGUgY2hhbm5lbHMgKi8KLSAgdWludDMyX3Qgc2lua19zYW1wbGVfZnJlcXVlbmN5X2h6OwotICB1aW50MzJfdCBzaW5rX2ZyYW1lX2R1cmF0aW9uX3VzOwotICB1aW50MTZfdCBzaW5rX29jdGV0c19wZXJfY29kZWNfZnJhbWU7Ci0gIC8qIE51bWJlciBvZiBjaGFubmVscyBpcyB3aGF0IHdlIHdpbGwgcmVxdWVzdCBmcm9tIGF1ZGlvIGZyYW1ld29yayAqLwotICB1aW50OF90IHNpbmtfbnVtX29mX2NoYW5uZWxzOwotICBpbnQgc2lua19udW1fb2ZfZGV2aWNlczsKLSAgLyogY2lzX2hhbmRsZSwgYXVkaW8gbG9jYXRpb24qLwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQzMl90Pj4gc2lua19zdHJlYW1zOwotCi0gIC8qIFNvdXJjZSBjb25maWd1cmF0aW9uICovCi0gIC8qIEZvciBub3cgd2UgaGF2ZSBhbHdheXMgc2FtZSBmcmVxdWVuY3kgZm9yIGFsbCB0aGUgY2hhbm5lbHMgKi8KLSAgdWludDMyX3Qgc291cmNlX3NhbXBsZV9mcmVxdWVuY3lfaHo7Ci0gIHVpbnQzMl90IHNvdXJjZV9mcmFtZV9kdXJhdGlvbl91czsKLSAgdWludDE2X3Qgc291cmNlX29jdGV0c19wZXJfY29kZWNfZnJhbWU7Ci0gIC8qIE51bWJlciBvZiBjaGFubmVscyBpcyB3aGF0IHdlIHdpbGwgcmVxdWVzdCBmcm9tIGF1ZGlvIGZyYW1ld29yayAqLwotICB1aW50OF90IHNvdXJjZV9udW1fb2ZfY2hhbm5lbHM7Ci0gIGludCBzb3VyY2VfbnVtX29mX2RldmljZXM7Ci0gIC8qIGNpc19oYW5kbGUsIGF1ZGlvIGxvY2F0aW9uKi8KLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MzJfdD4+IHNvdXJjZV9zdHJlYW1zOwotfTsKLQotdm9pZCBBcHBlbmRNZXRhZGF0YUx0dkVudHJ5Rm9yQ2NpZExpc3Qoc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZSBjb250ZXh0X3R5cGUpOwotdm9pZCBBcHBlbmRNZXRhZGF0YUx0dkVudHJ5Rm9yU3RyZWFtaW5nQ29udGV4dCgKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWV0YWRhdGEsIHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKTsKLQotfSAgLy8gbmFtZXNwYWNlIGxlX2F1ZGlvCi0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0xjM0NvbmZpZyYgY29uZmlnKTsKLQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVfYXVkaW86OnR5cGVzOjpBc2VTdGF0ZSYgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL2xlX2F1ZGlvX3R5cGVzX3Rlc3QuY2MgYi9idGEvbGVfYXVkaW8vbGVfYXVkaW9fdHlwZXNfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2ZjFlNC4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vbGVfYXVkaW9fdHlwZXNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibGVfYXVkaW9fdHlwZXMuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLW5hbWVzcGFjZSB0eXBlcyB7Ci0KLXVzaW5nIDo6dGVzdGluZzo6QWxsT2Y7Ci11c2luZyA6OnRlc3Rpbmc6OkNvbnRhaW5zOwotdXNpbmcgOjp0ZXN0aW5nOjpFbGVtZW50c0FyZTsKLXVzaW5nIDo6dGVzdGluZzo6RWxlbWVudHNBcmVBcnJheTsKLXVzaW5nIDo6dGVzdGluZzo6RXE7Ci11c2luZyA6OnRlc3Rpbmc6OlBhaXI7Ci11c2luZyA6OnRlc3Rpbmc6OlNpemVJczsKLQotVEVTVChMZUF1ZGlvTHR2TWFwVGVzdCwgdGVzdF9zZXJpYWxpemF0aW9uKSB7Ci0gIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbHR2X3Rlc3RfdmVjewotICAgICAgMHgwMiwgMHgwMSwgMHgwYSwKLSAgICAgIDB4MDMsIDB4MDIsIDB4YWEsIDB4YmIsCi0gICAgICAweDA0LCAweDAzLCAweGRlLCAweGMwLCAweGRlLAotICAgICAgMHgwNSwgMHgwNCwgMHhjMCwgMHhkZSwgMHhjMCwgMHhkZSwKLSAgfTsKLSAgLy8gY2xhbmctZm9ybWF0IG9uCi0KLSAgLy8gUGFyc2UKLSAgYm9vbCBzdWNjZXNzOwotICBMZUF1ZGlvTHR2TWFwIGx0dl9tYXAgPQotICAgICAgTGVBdWRpb0x0dk1hcDo6UGFyc2UobHR2X3Rlc3RfdmVjLmRhdGEoKSwgbHR2X3Rlc3RfdmVjLnNpemUoKSwgc3VjY2Vzcyk7Ci0gIEFTU0VSVF9UUlVFKHN1Y2Nlc3MpOwotICBBU1NFUlRfRkFMU0UobHR2X21hcC5Jc0VtcHR5KCkpOwotICBBU1NFUlRfRVEoKHNpemVfdCk0LCBsdHZfbWFwLlNpemUoKSk7Ci0KLSAgQVNTRVJUX1RSVUUobHR2X21hcC5GaW5kKDB4MDEpKTsKLSAgQVNTRVJUX1RIQVQoKihsdHZfbWFwLkZpbmQoMHgwMSkpLCBFbGVtZW50c0FyZSgweDBhKSk7Ci0gIEFTU0VSVF9UUlVFKGx0dl9tYXAuRmluZCgweDAyKSk7Ci0gIEFTU0VSVF9USEFUKCoobHR2X21hcC5GaW5kKDB4MDIpKSwgRWxlbWVudHNBcmUoMHhhYSwgMHhiYikpOwotICBBU1NFUlRfVFJVRShsdHZfbWFwLkZpbmQoMHgwMykpOwotICBBU1NFUlRfVEhBVCgqKGx0dl9tYXAuRmluZCgweDAzKSksIEVsZW1lbnRzQXJlKDB4ZGUsIDB4YzAsIDB4ZGUpKTsKLSAgQVNTRVJUX1RSVUUobHR2X21hcC5GaW5kKDB4MDQpKTsKLSAgQVNTRVJUX1RIQVQoKihsdHZfbWFwLkZpbmQoMHgwNCkpLCBFbGVtZW50c0FyZSgweGMwLCAweGRlLCAweGMwLCAweGRlKSk7Ci0KLSAgLy8gUmF3UGFja2V0Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlcmlhbGl6ZWQobHR2X21hcC5SYXdQYWNrZXRTaXplKCkpOwotICBBU1NFUlRfVFJVRShsdHZfbWFwLlJhd1BhY2tldChzZXJpYWxpemVkLmRhdGEoKSkpOwotICBBU1NFUlRfVEhBVChzZXJpYWxpemVkLCBFbGVtZW50c0FyZUFycmF5KGx0dl90ZXN0X3ZlYykpOwotfQotCi1URVNUKExlQXVkaW9MdHZNYXBUZXN0LCB0ZXN0X3NlcmlhbGl6YXRpb25fbHR2X2xlbl9pc196ZXJvKSB7Ci0gIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbHR2X3Rlc3RfdmVjewotICAgICAgMHgwMiwgMHgwMSwgMHgwYSwKLSAgICAgIDB4MDMsIDB4MDIsIDB4YWEsIDB4YmIsCi0gICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvLyBsdHZfbGVuID09IDAKLSAgICAgIDB4MDUsIDB4MDQsIDB4YzAsIDB4ZGUsIDB4YzAsIDB4ZGUsCi0gIH07Ci0gIC8vIGNsYW5nLWZvcm1hdCBvbgotCi0gIC8vIFBhcnNlCi0gIGJvb2wgc3VjY2VzczsKLSAgTGVBdWRpb0x0dk1hcCBsdHZfbWFwID0KLSAgICAgIExlQXVkaW9MdHZNYXA6OlBhcnNlKGx0dl90ZXN0X3ZlYy5kYXRhKCksIGx0dl90ZXN0X3ZlYy5zaXplKCksIHN1Y2Nlc3MpOwotICBBU1NFUlRfVFJVRShzdWNjZXNzKTsKLSAgQVNTRVJUX0ZBTFNFKGx0dl9tYXAuSXNFbXB0eSgpKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMywgbHR2X21hcC5TaXplKCkpOwotCi0gIEFTU0VSVF9UUlVFKGx0dl9tYXAuRmluZCgweDAxKSk7Ci0gIEFTU0VSVF9USEFUKCoobHR2X21hcC5GaW5kKDB4MDEpKSwgRWxlbWVudHNBcmUoMHgwYSkpOwotICBBU1NFUlRfVFJVRShsdHZfbWFwLkZpbmQoMHgwMikpOwotICBBU1NFUlRfVEhBVCgqKGx0dl9tYXAuRmluZCgweDAyKSksIEVsZW1lbnRzQXJlKDB4YWEsIDB4YmIpKTsKLSAgQVNTRVJUX1RSVUUobHR2X21hcC5GaW5kKDB4MDQpKTsKLSAgQVNTRVJUX1RIQVQoKihsdHZfbWFwLkZpbmQoMHgwNCkpLCBFbGVtZW50c0FyZSgweGMwLCAweGRlLCAweGMwLCAweGRlKSk7Ci0KLSAgLy8gUmF3UGFja2V0Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlcmlhbGl6ZWQobHR2X21hcC5SYXdQYWNrZXRTaXplKCkpOwotICBBU1NFUlRfVFJVRShsdHZfbWFwLlJhd1BhY2tldChzZXJpYWxpemVkLmRhdGEoKSkpOwotICBBU1NFUlRfVEhBVChzZXJpYWxpemVkLCBFbGVtZW50c0FyZSgweDAyLCAweDAxLCAweDBhLCAweDAzLCAweDAyLCAweGFhLCAweGJiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1LCAweDA0LCAweGMwLCAweGRlLCAweGMwLCAweGRlKSk7Ci19Ci0KLVRFU1QoTGVBdWRpb0x0dk1hcFRlc3QsIHRlc3Rfc2VyaWFsaXphdGlvbl9sdHZfbGVuX2lzX29uZSkgewotICAvLyBjbGFuZy1mb3JtYXQgb2ZmCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGx0dl90ZXN0X3ZlY3sKLSAgICAweDAyLCAweDAxLCAweDBhLAotICAgIDB4MDEsIDB4MDIsCi0gIH07Ci0gIC8vIGNsYW5nLWZvcm1hdCBvbgotCi0gIC8vIFBhcnNlCi0gIGJvb2wgc3VjY2VzczsKLSAgTGVBdWRpb0x0dk1hcCBsdHZfbWFwID0KLSAgICAgIExlQXVkaW9MdHZNYXA6OlBhcnNlKGx0dl90ZXN0X3ZlYy5kYXRhKCksIGx0dl90ZXN0X3ZlYy5zaXplKCksIHN1Y2Nlc3MpOwotICBBU1NFUlRfVFJVRShzdWNjZXNzKTsKLSAgQVNTRVJUX0ZBTFNFKGx0dl9tYXAuSXNFbXB0eSgpKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMiwgbHR2X21hcC5TaXplKCkpOwotCi0gIEFTU0VSVF9UUlVFKGx0dl9tYXAuRmluZCgweDAxKSk7Ci0gIEFTU0VSVF9USEFUKCoobHR2X21hcC5GaW5kKDB4MDEpKSwgRWxlbWVudHNBcmUoMHgwYSkpOwotICBBU1NFUlRfVFJVRShsdHZfbWFwLkZpbmQoMHgwMikpOwotICBBU1NFUlRfVEhBVCgqKGx0dl9tYXAuRmluZCgweDAyKSksIFNpemVJcygwKSk7Ci0KLSAgLy8gUmF3UGFja2V0Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlcmlhbGl6ZWQobHR2X21hcC5SYXdQYWNrZXRTaXplKCkpOwotICBBU1NFUlRfVFJVRShsdHZfbWFwLlJhd1BhY2tldChzZXJpYWxpemVkLmRhdGEoKSkpOwotICBBU1NFUlRfVEhBVChzZXJpYWxpemVkLCBFbGVtZW50c0FyZUFycmF5KGx0dl90ZXN0X3ZlYykpOwotfQotCi1URVNUKExlQXVkaW9MdHZNYXBUZXN0LCB0ZXN0X3NlcmlhbGl6YXRpb25fbHR2X2xlbl9pc19pbnZhbGlkKSB7Ci0gIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbHR2X3Rlc3RfdmVjXzF7Ci0gICAgICAweDAyLCAweDAxLCAweDBhLAotICAgICAgMHgwNCwgMHgwMiwgMHhhYSwgMHhiYiwgLy8gb25lIGJ5dGUgbWlzc2luZwotICB9OwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsdHZfdGVzdF92ZWNfMnsKLSAgICAgIDB4MDIsIDB4MDEsIDB4MGEsCi0gICAgICAweDAzLCAweDAyLCAweGFhLCAweGJiLAotICAgICAgMHgwMSwKLSAgfTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbHR2X3Rlc3RfdmVjXzN7Ci0gICAgICAweDAyLCAweDAxLCAweDBhLAotICAgICAgMHgwMywgMHgwMiwgMHhhYSwgMHhiYiwKLSAgICAgIDB4MDIsIDB4MDMsCi0gIH07Ci0gIC8vIGNsYW5nLWZvcm1hdCBvbgotCi0gIC8vIFBhcnNlCi0gIGJvb2wgc3VjY2VzcyA9IHRydWU7Ci0gIExlQXVkaW9MdHZNYXAgbHR2X21hcDsKLQotICBsdHZfbWFwID0gTGVBdWRpb0x0dk1hcDo6UGFyc2UobHR2X3Rlc3RfdmVjXzEuZGF0YSgpLCBsdHZfdGVzdF92ZWNfMS5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKTsKLSAgQVNTRVJUX0ZBTFNFKHN1Y2Nlc3MpOwotCi0gIGx0dl9tYXAgPSBMZUF1ZGlvTHR2TWFwOjpQYXJzZShsdHZfdGVzdF92ZWNfMi5kYXRhKCksIGx0dl90ZXN0X3ZlY18yLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MpOwotICBBU1NFUlRfRkFMU0Uoc3VjY2Vzcyk7Ci0KLSAgbHR2X21hcCA9IExlQXVkaW9MdHZNYXA6OlBhcnNlKGx0dl90ZXN0X3ZlY18zLmRhdGEoKSwgbHR2X3Rlc3RfdmVjXzMuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzcyk7Ci0gIEFTU0VSVF9GQUxTRShzdWNjZXNzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHR5cGVzCi19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9tb2NrX2lzb19tYW5hZ2VyLmNjIGIvYnRhL2xlX2F1ZGlvL21vY2tfaXNvX21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTc5ZTcuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL21vY2tfaXNvX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vY2tfaXNvX21hbmFnZXIuaCIKLQotTW9ja0lzb01hbmFnZXIqIG1vY2tfcGltcGxfOwotTW9ja0lzb01hbmFnZXIqIE1vY2tJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpIHsKLSAgYmx1ZXRvb3RoOjpoY2k6Oklzb01hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gIHJldHVybiBtb2NrX3BpbXBsXzsKLX0KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotc3RydWN0IElzb01hbmFnZXI6OmltcGwgOiBwdWJsaWMgTW9ja0lzb01hbmFnZXIgewotIHB1YmxpYzoKLSAgaW1wbCgpID0gZGVmYXVsdDsKLSAgfmltcGwoKSA9IGRlZmF1bHQ7Ci19OwotCi1Jc29NYW5hZ2VyOjpJc29NYW5hZ2VyKCkge30KLQotdm9pZCBJc29NYW5hZ2VyOjpSZWdpc3RlckNpZ0NhbGxiYWNrcygKLSAgICBpc29fbWFuYWdlcjo6Q2lnQ2FsbGJhY2tzKiBjYWxsYmFja3MpIGNvbnN0IHsKLSAgaWYgKCFwaW1wbF8pIHJldHVybjsKLSAgcGltcGxfLT5SZWdpc3RlckNpZ0NhbGxiYWNrcyhjYWxsYmFja3MpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlJlZ2lzdGVyQmlnQ2FsbGJhY2tzKAotICAgIGlzb19tYW5hZ2VyOjpCaWdDYWxsYmFja3MqIGNhbGxiYWNrcykgY29uc3QgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPlJlZ2lzdGVyQmlnQ2FsbGJhY2tzKGNhbGxiYWNrcyk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6Q3JlYXRlQ2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zKSB7Ci0gIGlmICghcGltcGxfKSByZXR1cm47Ci0gIHBpbXBsXy0+Q3JlYXRlQ2lnKGNpZ19pZCwgc3RkOjptb3ZlKGNpZ19wYXJhbXMpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpSZWNvbmZpZ3VyZUNpZygKLSAgICB1aW50OF90IGNpZ19pZCwgc3RydWN0IGlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zKSB7Ci0gIGlmICghcGltcGxfKSByZXR1cm47Ci0gIHBpbXBsXy0+UmVjb25maWd1cmVDaWcoY2lnX2lkLCBzdGQ6Om1vdmUoY2lnX3BhcmFtcykpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlJlbW92ZUNpZyh1aW50OF90IGNpZ19pZCkgeyBwaW1wbF8tPlJlbW92ZUNpZyhjaWdfaWQpOyB9Ci0KLXZvaWQgSXNvTWFuYWdlcjo6RXN0YWJsaXNoQ2lzKAotICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgY29ubl9wYXJhbXMpIHsKLSAgaWYgKCFwaW1wbF8pIHJldHVybjsKLSAgcGltcGxfLT5Fc3RhYmxpc2hDaXMoc3RkOjptb3ZlKGNvbm5fcGFyYW1zKSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6RGlzY29ubmVjdENpcyh1aW50MTZfdCBjaXNfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPkRpc2Nvbm5lY3RDaXMoY2lzX2hhbmRsZSwgcmVhc29uKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpTZXR1cElzb0RhdGFQYXRoKAotICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIHN0cnVjdCBpc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMgcGF0aF9wYXJhbXMpIHsKLSAgaWYgKCFwaW1wbF8pIHJldHVybjsKLSAgcGltcGxfLT5TZXR1cElzb0RhdGFQYXRoKGlzb19oYW5kbGUsIHN0ZDo6bW92ZShwYXRoX3BhcmFtcykpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlJlbW92ZUlzb0RhdGFQYXRoKHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpcikgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPlJlbW92ZUlzb0RhdGFQYXRoKGlzb19oYW5kbGUsIGRhdGFfcGF0aF9kaXIpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlJlYWRJc29MaW5rUXVhbGl0eSh1aW50MTZfdCBpc29faGFuZGxlKSB7Ci0gIGlmICghcGltcGxfKSByZXR1cm47Ci0gIHBpbXBsXy0+UmVhZElzb0xpbmtRdWFsaXR5KGlzb19oYW5kbGUpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlNlbmRJc29EYXRhKHVpbnQxNl90IGlzb19oYW5kbGUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfbGVuKSB7Ci0gIGlmICghcGltcGxfKSByZXR1cm47Ci0gIHBpbXBsXy0+U2VuZElzb0RhdGEoaXNvX2hhbmRsZSwgZGF0YSwgZGF0YV9sZW4pOwotfQotCi12b2lkIElzb01hbmFnZXI6OkNyZWF0ZUJpZyh1aW50OF90IGJpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMgYmlnX3BhcmFtcykgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPkNyZWF0ZUJpZyhiaWdfaWQsIHN0ZDo6bW92ZShiaWdfcGFyYW1zKSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6VGVybWluYXRlQmlnKHVpbnQ4X3QgYmlnX2lkLCB1aW50OF90IHJlYXNvbikgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPlRlcm1pbmF0ZUJpZyhiaWdfaWQsIHJlYXNvbik7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6SGFuZGxlSXNvRGF0YSh2b2lkKiBwX21zZykgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPkhhbmRsZUlzb0RhdGEoc3RhdGljX2Nhc3Q8QlRfSERSKj4ocF9tc2cpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVEaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByZWFzb24pIHsKLSAgaWYgKCFwaW1wbF8pIHJldHVybjsKLSAgcGltcGxfLT5IYW5kbGVEaXNjb25uZWN0KGhhbmRsZSwgcmVhc29uKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVOdW1Db21wbERhdGFQa3RzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbikgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPkhhbmRsZU51bUNvbXBsRGF0YVBrdHMocCwgZXZ0X2xlbik7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6SGFuZGxlR2ROdW1Db21wbERhdGFQa3RzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY3JlZGl0cykge30KLQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVIY2lFdmVudCh1aW50OF90IHN1Yl9jb2RlLCB1aW50OF90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCkgewotICBpZiAoIXBpbXBsXykgcmV0dXJuOwotICBwaW1wbF8tPkhhbmRsZUhjaUV2ZW50KHN1Yl9jb2RlLCBwYXJhbXMsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6U3RhcnQoKSB7Ci0gIC8vIEl0IGlzIG5lZWRlZCBoZXJlIGFzIElzb01hbmFnZXIgd2hpY2ggaXMgYSBzaW5nbGV0b24gY3JlYXRlcyBpdCwgYnV0IGluCi0gIC8vIHRoaXMgbW9jayB3ZSB3YW50IHRvIGRlc3Ryb3kgYW5kIHJlY3JlYXRlIHRoZSBtb2NrIG9uIGVhY2ggdGVzdCBjYXNlLgotICBpZiAoIXBpbXBsXykgewotICAgIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oKTsKLSAgfQotCi0gIG1vY2tfcGltcGxfID0gcGltcGxfLmdldCgpOwotICBwaW1wbF8tPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6U3RvcCgpIHsKLSAgLy8gSXQgaXMgbmVlZGVkIGhlcmUgYXMgSXNvTWFuYWdlciB3aGljaCBpcyBhIHNpbmdsZXRvbiBjcmVhdGVzIGl0LCBidXQgaW4KLSAgLy8gdGhpcyBtb2NrIHdlIHdhbnQgdG8gZGVzdHJveSBhbmQgcmVjcmVhdGUgdGhlIG1vY2sgb24gZWFjaCB0ZXN0IGNhc2UuCi0gIGlmIChwaW1wbF8pIHsKLSAgICBwaW1wbF8tPlN0b3AoKTsKLSAgICBwaW1wbF8ucmVzZXQoKTsKLSAgfQotCi0gIG1vY2tfcGltcGxfID0gbnVsbHB0cjsKLX0KLQotSXNvTWFuYWdlcjo6fklzb01hbmFnZXIoKSA9IGRlZmF1bHQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9tb2NrX2lzb19tYW5hZ2VyLmggYi9idGEvbGVfYXVkaW8vbW9ja19pc29fbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGExMGFiLi4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9tb2NrX2lzb19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlICJidG1faXNvX2FwaS5oIgotCi1zdHJ1Y3QgTW9ja0lzb01hbmFnZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIE1vY2tJc29NYW5hZ2VyKiBHZXRJbnN0YW5jZSgpOwotCi0gIE1vY2tJc29NYW5hZ2VyKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5Nb2NrSXNvTWFuYWdlcigpID0gZGVmYXVsdDsKLQotICBNT0NLX01FVEhPRCgodm9pZCksIFJlZ2lzdGVyQ2lnQ2FsbGJhY2tzLAotICAgICAgICAgICAgICAoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpDaWdDYWxsYmFja3MgKiBjYWxsYmFja3MpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBSZWdpc3RlckJpZ0NhbGxiYWNrcywKLSAgICAgICAgICAgICAgKGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6QmlnQ2FsbGJhY2tzICogY2FsbGJhY2tzKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKAotICAgICAgKHZvaWQpLCBDcmVhdGVDaWcsCi0gICAgICAodWludDhfdCBjaWdfaWQsCi0gICAgICAgc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMgY2lnX3BhcmFtcykpOwotICBNT0NLX01FVEhPRCgKLSAgICAgICh2b2lkKSwgUmVjb25maWd1cmVDaWcsCi0gICAgICAodWludDhfdCBjaWdfaWQsCi0gICAgICAgc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMgY2lnX3BhcmFtcykpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlbW92ZUNpZywgKHVpbnQ4X3QgY2lnX2lkKSk7Ci0gIE1PQ0tfTUVUSE9EKAotICAgICAgKHZvaWQpLCBFc3RhYmxpc2hDaXMsCi0gICAgICAoc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgY29ubl9wYXJhbXMpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBEaXNjb25uZWN0Q2lzLCAodWludDE2X3QgY2lzX2hhbmRsZSwgdWludDhfdCByZWFzb24pKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICAodm9pZCksIFNldHVwSXNvRGF0YVBhdGgsCi0gICAgICAodWludDE2X3QgaXNvX2hhbmRsZSwKLSAgICAgICBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjppc29fZGF0YV9wYXRoX3BhcmFtcyBwYXRoX3BhcmFtcykpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlbW92ZUlzb0RhdGFQYXRoLAotICAgICAgICAgICAgICAodWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU2VuZElzb0RhdGEsCi0gICAgICAgICAgICAgICh1aW50MTZfdCBpc29faGFuZGxlLCBjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MTZfdCBkYXRhX2xlbikpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlYWRJc29MaW5rUXVhbGl0eSwgKHVpbnQxNl90IGlzb19oYW5kbGUpKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICAodm9pZCksIENyZWF0ZUJpZywKLSAgICAgICh1aW50OF90IGJpZ19pZCwKLSAgICAgICBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpiaWdfY3JlYXRlX3BhcmFtcyBiaWdfcGFyYW1zKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgVGVybWluYXRlQmlnLCAodWludDhfdCBiaWdfaWQsIHVpbnQ4X3QgcmVhc29uKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgSGFuZGxlSXNvRGF0YSwgKHZvaWQqIHBfbXNnKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgSGFuZGxlRGlzY29ubmVjdCwgKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByZWFzb24pKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBIYW5kbGVOdW1Db21wbERhdGFQa3RzLCAodWludDhfdCAqIHAsIHVpbnQ4X3QgZXZ0X2xlbikpOwotICBNT0NLX01FVEhPRCgodm9pZCksIEhhbmRsZUdkTnVtQ29tcGxEYXRhUGt0cywgKHVpbnQ4X3QgKiBwLCB1aW50OF90IGV2dF9sZW4pKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBIYW5kbGVIY2lFdmVudCwKLSAgICAgICAgICAgICAgKHVpbnQ4X3Qgc3ViX2NvZGUsIHVpbnQ4X3QqIHBhcmFtcywgdWludDE2X3QgbGVuZ3RoKSk7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdGFydCwgKCkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFN0b3AsICgpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrSXNvTWFuYWdlcik7Ci19OwpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvLmNjIGIvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc5YjRjLi4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9tb2NrX2xlX2F1ZGlvX2NsaWVudF9hdWRpby5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibW9ja19sZV9hdWRpb19jbGllbnRfYXVkaW8uaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKiBTb3VyY2UgbW9jayAqLwotc3RhdGljIE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2UqIHNvdXJjZV9pbnN0YW5jZSA9IG51bGxwdHI7Ci12b2lkIE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlNldE1vY2tJbnN0YW5jZUZvclRlc3RpbmcoCi0gICAgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSogbW9jaykgewotICBzb3VyY2VfaW5zdGFuY2UgPSBtb2NrOwotfQotCi1ib29sIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6U3RhcnQoCi0gICAgY29uc3QgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNDb25maWd1cmF0aW9uLAotICAgIExlQXVkaW9DbGllbnRBdWRpb1NpbmtSZWNlaXZlciogYXVkaW9SZWNlaXZlcikgewotICBMT0dfQVNTRVJUKHNvdXJjZV9pbnN0YW5jZSkKLSAgICAgIDw8ICJNb2NrIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gc291cmNlX2luc3RhbmNlLT5TdGFydChjb2RlY0NvbmZpZ3VyYXRpb24sIGF1ZGlvUmVjZWl2ZXIpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6U3RvcCgpIHsKLSAgTE9HX0FTU0VSVChzb3VyY2VfaW5zdGFuY2UpCi0gICAgICA8PCAiTW9jayBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2UgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgc291cmNlX2luc3RhbmNlLT5TdG9wKCk7Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIGlzIHdyb25nISB3ZSB3aWxsIHJldHVybiBhIGRpZmZlcmVudCBjbGFzcyBvYmplY3QgLSBub3QgZXZlbiBpbgotLy8gaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci1jb25zdCB2b2lkKiBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkFjcXVpcmUoKSB7Ci0gIExPR19BU1NFUlQoc291cmNlX2luc3RhbmNlKQotICAgICAgPDwgIk1vY2sgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBzb3VyY2VfaW5zdGFuY2UtPkFjcXVpcmUoKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlJlbGVhc2UoY29uc3Qgdm9pZCogaW5zdCkgewotICBMT0dfQVNTRVJUKHNvdXJjZV9pbnN0YW5jZSkKLSAgICAgIDw8ICJNb2NrIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBzb3VyY2VfaW5zdGFuY2UtPlJlbGVhc2UoaW5zdCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgTE9HX0FTU0VSVChzb3VyY2VfaW5zdGFuY2UpCi0gICAgICA8PCAiTW9jayBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHNvdXJjZV9pbnN0YW5jZS0+Q29uZmlybVN0cmVhbWluZ1JlcXVlc3QoKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKSB7Ci0gIExPR19BU1NFUlQoc291cmNlX2luc3RhbmNlKQotICAgICAgPDwgIk1vY2sgTGVBdWRpb0NsaWVudEF1ZGlvU2luayBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBzb3VyY2VfaW5zdGFuY2UtPkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlVwZGF0ZVJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5KSB7Ci0gIExPR19BU1NFUlQoc291cmNlX2luc3RhbmNlKQotICAgICAgPDwgIk1vY2sgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHNvdXJjZV9pbnN0YW5jZS0+VXBkYXRlUmVtb3RlRGVsYXkoZGVsYXkpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6RGVidWdEdW1wKGludCBmZCkgewotICBMT0dfQVNTRVJUKHNvdXJjZV9pbnN0YW5jZSkKLSAgICAgIDw8ICJNb2NrIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBzb3VyY2VfaW5zdGFuY2UtPkRlYnVnRHVtcChmZCk7Ci19Ci0KLS8qIFNpbmsgbW9jayAqLwotc3RhdGljIE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rKiBzaW5rX2luc3RhbmNlID0gbnVsbHB0cjsKLXZvaWQgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1Npbms6OlNldE1vY2tJbnN0YW5jZUZvclRlc3RpbmcoCi0gICAgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NpbmsqIG1vY2spIHsKLSAgc2lua19pbnN0YW5jZSA9IG1vY2s7Ci19Ci0KLWJvb2wgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6U3RhcnQoCi0gICAgY29uc3QgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNDb25maWd1cmF0aW9uLAotICAgIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZVJlY2VpdmVyKiBhdWRpb1JlY2VpdmVyKSB7Ci0gIExPR19BU1NFUlQoc2lua19pbnN0YW5jZSkgPDwgIk1vY2sgTGVBdWRpb0NsaWVudEF1ZGlvU2luayBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gc2lua19pbnN0YW5jZS0+U3RhcnQoY29kZWNDb25maWd1cmF0aW9uLCBhdWRpb1JlY2VpdmVyKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rOjpTdG9wKCkgewotICBMT0dfQVNTRVJUKHNpbmtfaW5zdGFuY2UpIDw8ICJNb2NrIExlQXVkaW9DbGllbnRBdWRpb1NpbmsgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgc2lua19pbnN0YW5jZS0+U3RvcCgpOwotfQotCi0vLyBGSVhNRTogVGhpcyBpcyB3cm9uZyEgd2Ugd2lsbCByZXR1cm4gYSBkaWZmZXJlbnQgY2xhc3Mgb2JqZWN0IC0gbm90IGV2ZW4gaW4KLS8vIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotY29uc3Qgdm9pZCogTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6QWNxdWlyZSgpIHsKLSAgTE9HX0FTU0VSVChzaW5rX2luc3RhbmNlKSA8PCAiTW9jayBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBzaW5rX2luc3RhbmNlLT5BY3F1aXJlKCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6UmVsZWFzZShjb25zdCB2b2lkKiBpbnN0KSB7Ci0gIExPR19BU1NFUlQoc2lua19pbnN0YW5jZSkgPDwgIk1vY2sgTGVBdWRpb0NsaWVudEF1ZGlvU2luayBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBzaW5rX2luc3RhbmNlLT5SZWxlYXNlKGluc3QpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlVwZGF0ZVJlbW90ZURlbGF5KHVpbnQxNl90IGRlbGF5KSB7Ci0gIExPR19BU1NFUlQoc2lua19pbnN0YW5jZSkgPDwgIk1vY2sgTGVBdWRpb0NsaWVudEF1ZGlvU2luayBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBzaW5rX2luc3RhbmNlLT5VcGRhdGVSZW1vdGVEZWxheShkZWxheSk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6RGVidWdEdW1wKGludCBmZCkgewotICBMT0dfQVNTRVJUKHNpbmtfaW5zdGFuY2UpIDw8ICJNb2NrIExlQXVkaW9DbGllbnRBdWRpb1NpbmsgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgc2lua19pbnN0YW5jZS0+RGVidWdEdW1wKGZkKTsKLX0KLQotc2l6ZV90IExlQXVkaW9DbGllbnRBdWRpb1Npbms6OlNlbmREYXRhKHVpbnQ4X3QqIGRhdGEsIHVpbnQxNl90IHNpemUpIHsKLSAgTE9HX0FTU0VSVChzaW5rX2luc3RhbmNlKSA8PCAiTW9jayBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBzaW5rX2luc3RhbmNlLT5TZW5kRGF0YShkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rOjpDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgTE9HX0FTU0VSVChzaW5rX2luc3RhbmNlKSA8PCAiTW9jayBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHNpbmtfaW5zdGFuY2UtPkNvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0KCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU2luazo6Q2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgTE9HX0FTU0VSVChzaW5rX2luc3RhbmNlKSA8PCAiTW9jayBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHNpbmtfaW5zdGFuY2UtPkNhbmNlbFN0cmVhbWluZ1JlcXVlc3QoKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9tb2NrX2xlX2F1ZGlvX2NsaWVudF9hdWRpby5oIGIvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWU4ZjcuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlICJjbGllbnRfYXVkaW8uaCIKLQotY2xhc3MgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTZXRNb2NrSW5zdGFuY2VGb3JUZXN0aW5nKE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2UqIG1vY2spOwotICBNT0NLX01FVEhPRCgoYm9vbCksIFN0YXJ0LAotICAgICAgICAgICAgICAoY29uc3QgTGVBdWRpb0NvZGVjQ29uZmlndXJhdGlvbiYgY29kZWNDb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgTGVBdWRpb0NsaWVudEF1ZGlvU2lua1JlY2VpdmVyKiBhdWRpb1JlY2VpdmVyKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU3RvcCwgKCkpOwotICBNT0NLX01FVEhPRCgoY29uc3Qgdm9pZCopLCBBY3F1aXJlLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgUmVsZWFzZSwgKGNvbnN0IHZvaWQqKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ29uZmlybVN0cmVhbWluZ1JlcXVlc3QsICgpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0LCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgVXBkYXRlUmVtb3RlRGVsYXksICh1aW50MTZfdCBkZWxheSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIERlYnVnRHVtcCwgKGludCBmZCkpOwotfTsKLQotY2xhc3MgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NpbmsgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgU2V0TW9ja0luc3RhbmNlRm9yVGVzdGluZyhNb2NrTGVBdWRpb0NsaWVudEF1ZGlvU2luayogbW9jayk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgU3RhcnQsCi0gICAgICAgICAgICAgIChjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY0NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2VSZWNlaXZlciogYXVkaW9SZWNlaXZlcikpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFN0b3AsICgpKTsKLSAgTU9DS19NRVRIT0QoKGNvbnN0IHZvaWQqKSwgQWNxdWlyZSwgKCkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlbGVhc2UsIChjb25zdCB2b2lkKikpOwotICBNT0NLX01FVEhPRCgoc2l6ZV90KSwgU2VuZERhdGEsICh1aW50OF90ICogZGF0YSwgdWludDE2X3Qgc2l6ZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIENvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0LCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ2FuY2VsU3RyZWFtaW5nUmVxdWVzdCwgKCkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFVwZGF0ZVJlbW90ZURlbGF5LCAodWludDE2X3QgZGVsYXkpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBEZWJ1Z0R1bXAsIChpbnQgZmQpKTsKLX07CmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vbW9ja19sZV9hdWRpb19jbGllbnRfYXVkaW9fc291cmNlLmNjIGIvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvX3NvdXJjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0ZDc0Yi4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vbW9ja19sZV9hdWRpb19jbGllbnRfYXVkaW9fc291cmNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvX3NvdXJjZS5oIgotCi1zdGF0aWMgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSogaW5zdGFuY2U7Ci12b2lkIE1vY2tMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OlNldE1vY2tJbnN0YW5jZUZvclRlc3RpbmcoCi0gICAgTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSogbW9jaykgewotICBpbnN0YW5jZSA9IG1vY2s7Ci19Ci0KLWJvb2wgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpTdGFydCgKLSAgICBjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY0NvbmZpZ3VyYXRpb24sCi0gICAgTGVBdWRpb0NsaWVudEF1ZGlvU2lua1JlY2VpdmVyKiBhdWRpb1JlY2VpdmVyLCB1aW50MTZfdCByZW1vdGVfZGVsYXlfbXMpIHsKLSAgcmV0dXJuIGluc3RhbmNlLT5TdGFydChjb2RlY0NvbmZpZ3VyYXRpb24sIGF1ZGlvUmVjZWl2ZXIsIHJlbW90ZV9kZWxheV9tcyk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpTdG9wKCkgeyBpbnN0YW5jZS0+U3RvcCgpOyB9Ci0KLS8vIEZJWE1FOiBUaGlzIGlzIHdyb25nISB3ZSB3aWxsIHJldHVybiBhIGRpZmZlcmVudCBjbGFzcyBvYmplY3QgLSBub3QgZXZlbiBpbgotLy8gaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci1jb25zdCB2b2lkKiBMZUF1ZGlvQ2xpZW50QXVkaW9Tb3VyY2U6OkFjcXVpcmUoKSB7IHJldHVybiBpbnN0YW5jZS0+QWNxdWlyZSgpOyB9Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpSZWxlYXNlKGNvbnN0IHZvaWQqIGluc3QpIHsKLSAgaW5zdGFuY2UtPlJlbGVhc2UoaW5zdCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpDb25maXJtU3RyZWFtaW5nUmVxdWVzdCgpIHsKLSAgaW5zdGFuY2UtPkNvbmZpcm1TdHJlYW1pbmdSZXF1ZXN0KCk7Ci19Ci0KLXZvaWQgTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlOjpDYW5jZWxTdHJlYW1pbmdSZXF1ZXN0KCkgewotICBpbnN0YW5jZS0+Q2FuY2VsU3RyZWFtaW5nUmVxdWVzdCgpOwotfQotCi12b2lkIExlQXVkaW9DbGllbnRBdWRpb1NvdXJjZTo6RGVidWdEdW1wKGludCBmZCkgeyBpbnN0YW5jZS0+RGVidWdEdW1wKGZkKTsgfQpkaWZmIC0tZ2l0IGEvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvX3NvdXJjZS5oIGIvYnRhL2xlX2F1ZGlvL21vY2tfbGVfYXVkaW9fY2xpZW50X2F1ZGlvX3NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTY0NmE1Li4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9tb2NrX2xlX2F1ZGlvX2NsaWVudF9hdWRpb19zb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgImNsaWVudF9hdWRpby5oIgotCi1jbGFzcyBNb2NrTGVBdWRpb0NsaWVudEF1ZGlvU291cmNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFNldE1vY2tJbnN0YW5jZUZvclRlc3RpbmcoTW9ja0xlQXVkaW9DbGllbnRBdWRpb1NvdXJjZSogbW9jayk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgU3RhcnQsCi0gICAgICAgICAgICAgIChjb25zdCBMZUF1ZGlvQ29kZWNDb25maWd1cmF0aW9uJiBjb2RlY0NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICBMZUF1ZGlvQ2xpZW50QXVkaW9TaW5rUmVjZWl2ZXIqIGF1ZGlvUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICB1aW50MTZfdCByZW1vdGVfZGVsYXlfbXMpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdG9wLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKChjb25zdCB2b2lkKiksIEFjcXVpcmUsICgpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBSZWxlYXNlLCAoY29uc3Qgdm9pZCopKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBEZWJ1Z0R1bXAsIChpbnQgZmQpKTsKLX07CmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vbW9ja19zdGF0ZV9tYWNoaW5lLmNjIGIvYnRhL2xlX2F1ZGlvL21vY2tfc3RhdGVfbWFjaGluZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZjRmNC4uMDAwMDAwMAotLS0gYS9idGEvbGVfYXVkaW8vbW9ja19zdGF0ZV9tYWNoaW5lLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vY2tfc3RhdGVfbWFjaGluZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLXN0YXRpYyBNb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lKiBtb2NrX21hY2hpbmUgPSBudWxscHRyOwotCi12b2lkIGxlX2F1ZGlvOjpMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkluaXRpYWxpemUoCi0gICAgbGVfYXVkaW86OkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6Q2FsbGJhY2tzKiBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrcykgewotICBMT0dfQVNTRVJUKG1vY2tfbWFjaGluZSkgPDwgIk1vY2sgU3RhdGUgTWFjaGluZSBub3Qgc2V0ISI7Ci0gIG1vY2tfbWFjaGluZS0+SW5pdGlhbGl6ZShzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrcyk7Ci19Ci0KLXZvaWQgbGVfYXVkaW86OkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6Q2xlYW51cCh2b2lkKSB7Ci0gIExPR19BU1NFUlQobW9ja19tYWNoaW5lKSA8PCAiTW9jayBTdGF0ZSBNYWNoaW5lIG5vdCBzZXQhIjsKLSAgbW9ja19tYWNoaW5lLT5DbGVhbnVwKCk7Ci19Ci0KLWxlX2F1ZGlvOjpMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmUqIGxlX2F1ZGlvOjpMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgKLSAgICB2b2lkKSB7Ci0gIHJldHVybiBtb2NrX21hY2hpbmU7Ci19Ci0KLXZvaWQgTW9ja0xlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6U2V0TW9ja0luc3RhbmNlRm9yVGVzdGluZygKLSAgICBNb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lKiBtYWNoaW5lKSB7Ci0gIG1vY2tfbWFjaGluZSA9IG1hY2hpbmU7Ci19CmRpZmYgLS1naXQgYS9idGEvbGVfYXVkaW8vbW9ja19zdGF0ZV9tYWNoaW5lLmggYi9idGEvbGVfYXVkaW8vbW9ja19zdGF0ZV9tYWNoaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTBiNGYuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL21vY2tfc3RhdGVfbWFjaGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAic3RhdGVfbWFjaGluZS5oIgotCi1jbGFzcyBNb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lIDogcHVibGljIGxlX2F1ZGlvOjpMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmUgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKGJvb2wpLCBTdGFydFN0cmVhbSwKLSAgICAgICAgICAgICAgKGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlR3JvdXAgKiBncm91cCwKLSAgICAgICAgICAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoYm9vbCksIEF0dGFjaFRvU3RyZWFtLAotICAgICAgICAgICAgICAobGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cCAqIGdyb3VwLAotICAgICAgICAgICAgICAgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdXNwZW5kU3RyZWFtLCAobGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cCAqIGdyb3VwKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU3RvcFN0cmVhbSwgKGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlR3JvdXAgKiBncm91cCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFByb2Nlc3NHYXR0Tm90aWZFdmVudCwKLSAgICAgICAgICAgICAgKHVpbnQ4X3QgKiB2YWx1ZSwgdWludDE2X3QgbGVuLCBsZV9hdWRpbzo6dHlwZXM6OmFzZSogYXNlLAotICAgICAgICAgICAgICAgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UsCi0gICAgICAgICAgICAgICBsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwKiBncm91cCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgUHJvY2Vzc0hjaU5vdGlmT25DaWdDcmVhdGUsCi0gICAgICAgICAgICAgIChsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwICogZ3JvdXAsIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgdWludDhfdCBjaWdfaWQsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb25uX2hhbmRsZXMpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBQcm9jZXNzSGNpTm90aWZPbkNpZ1JlbW92ZSwKLSAgICAgICAgICAgICAgKHVpbnQ4X3Qgc3RhdHVzLCBsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwKiBncm91cCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgKLSAgICAgICh2b2lkKSwgUHJvY2Vzc0hjaU5vdGlmQ2lzRXN0YWJsaXNoZWQsCi0gICAgICAobGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cCAqIGdyb3VwLAotICAgICAgIGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLAotICAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9jbXBsX2V2dCogZXZlbnQpLAotICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgUHJvY2Vzc0hjaU5vdGlmQ2lzRGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAobGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cCAqIGdyb3VwLAotICAgICAgICAgICAgICAgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UsCi0gICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19kaXNjb25uZWN0ZWRfZXZ0KiBldmVudCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFByb2Nlc3NIY2lOb3RpZlNldHVwSXNvRGF0YVBhdGgsCi0gICAgICAgICAgICAgIChsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwICogZ3JvdXAsCi0gICAgICAgICAgICAgICBsZV9hdWRpbzo6TGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2hkbCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFByb2Nlc3NIY2lOb3RpZlJlbW92ZUlzb0RhdGFQYXRoLAotICAgICAgICAgICAgICAobGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cCAqIGdyb3VwLAotICAgICAgICAgICAgICAgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UsIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9oZGwpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBJbml0aWFsaXplLAotICAgICAgICAgICAgICAobGVfYXVkaW86OkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6Q2FsbGJhY2tzICoKLSAgICAgICAgICAgICAgIHN0YXRlX21hY2hpbmVfY2FsbGJhY2tzKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ2xlYW51cCwgKCkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFByb2Nlc3NIY2lOb3RpZklzb0xpbmtRdWFsaXR5UmVhZCwKLSAgICAgICAgICAgICAgKGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlR3JvdXAgKiBncm91cCwKLSAgICAgICAgICAgICAgIGxlX2F1ZGlvOjpMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLCB1aW50OF90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgdWludDMyX3QgdHhVbmFja2VkUGFja2V0cywgdWludDMyX3QgdHhGbHVzaGVkUGFja2V0cywKLSAgICAgICAgICAgICAgIHVpbnQzMl90IHR4TGFzdFN1YmV2ZW50UGFja2V0cywgdWludDMyX3QgcmV0cmFuc21pdHRlZFBhY2tldHMsCi0gICAgICAgICAgICAgICB1aW50MzJfdCBjcmNFcnJvclBhY2tldHMsIHVpbnQzMl90IHJ4VW5yZWNlaXZlZFBhY2tldHMsCi0gICAgICAgICAgICAgICB1aW50MzJfdCBkdXBsaWNhdGVQYWNrZXRzKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgUHJvY2Vzc0hjaU5vdGlmQWNsRGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAobGVfYXVkaW86OkxlQXVkaW9EZXZpY2VHcm91cCAqIGdyb3VwLAotICAgICAgICAgICAgICAgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQotICBzdGF0aWMgdm9pZCBTZXRNb2NrSW5zdGFuY2VGb3JUZXN0aW5nKE1vY2tMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmUqIG1hY2hpbmUpOwotfTsKZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9zdGF0ZV9tYWNoaW5lLmNjIGIvYnRhL2xlX2F1ZGlvL3N0YXRlX21hY2hpbmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGMzNTkuLjAwMDAwMDAKLS0tIGEvYnRhL2xlX2F1ZGlvL3N0YXRlX21hY2hpbmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdGF0ZV9tYWNoaW5lLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJidF90eXBlcy5oIgotI2luY2x1ZGUgImJ0YV9nYXR0X3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9pc29fYXBpLmgiCi0jaW5jbHVkZSAiY2xpZW50X3BhcnNlci5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKLSNpbmNsdWRlICJoY2ltc2dzLmgiCi0jaW5jbHVkZSAibGVfYXVkaW9fdHlwZXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotLyogQVNDUyBzdGF0ZSBtYWNoaW5lIDEuMAotICoKLSAqIFN0YXRlIG1hY2hpbmUgbWFuYWdlcyBncm91cCBvZiBBU0VzIHRvIG1ha2UgdHJhbnNpdGlvbiBmcm9tIG9uZSBzdGF0ZSB0bwotICogYW5vdGhlciBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiBhbmQga2VlcGluZyBpbnZvbHZlZCBuZWNlc3NhcnkgZXh0ZXJuYWxzCi0gKiBsaWtlOiBJU08sIENJRywgSVNPIGRhdGEgcGF0aCwgYXVkaW8gcGF0aCBmb3JtL3RvIHVwcGVyIGxheWVyLgotICoKLSAqIEdyb3VwU3RyZWFtIChBUEkpOiBHcm91cFN0cmVhbSBtZXRob2Qgb2YgdGhpcyBsZSBhdWRpbyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICogICAgICAgICAgICAgICAgICAgIG9iamVjdCBzaG91bGQgYWxsb3cgdHJhbnNpdGlvbiBmcm9tIElkbGUgKE5vIENhY2hpbmcpLAotICogICAgICAgICAgICAgICAgICAgIENvZGVjIENvbmZpZ3VyZWQgKENhY2hpbmcgYWZ0ZXIgcmVsZWFzZSkgc3RhdGUgdG8KLSAqICAgICAgICAgICAgICAgICAgICBTdHJlYW1pbmcgZm9yIGFsbCBBU0VzIGluIGdyb3VwIHdpdGhpbiB0aW1lIGxpbWl0LiBUaW1lCi0gKiAgICAgICAgICAgICAgICAgICAgbGltaXQgc2hvdWxkIGtlZXAgc2FmZSB3aG9sZSBzdGF0ZSBtYWNoaW5lIGZyb20gYmVpbmcKLSAqICAgICAgICAgICAgICAgICAgICBzdHVja2VkIGluIGFueSBpbi1taWRkbGUgc3RhdGUsIHdoaWNoIGlzIG5vdCBhIGRlc3RpbmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgc3RhdGUuCi0gKgotICogICAgICAgICAgICAgICAgICAgIFRPRE8gU2Vjb25kIGZ1bmN0aW9uYWxpdHkgb2Ygc3RyZWFtaW5nIHNob3VsZCBiZSBzd2l0Y2gKLSAqICAgICAgICAgICAgICAgICAgICBjb250ZXh0IHdoaWNoIHdpbGwgYmFzZSBvbiBwcmV2aW91cyBzdGF0ZSwgY29udGV4dCB0eXBlLgotICoKLSAqIEdyb3VwU3RvcCAoQVBJKTogR3JvdXBTdG9wIG1ldGhvZCBvZiB0aGlzIGxlIGF1ZGlvIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gKiAgICAgICAgICAgICAgICAgIG9iamVjdCBzaG91bGQgYWxsb3cgc2FmZSB0cmFuc2l0aW9uIGZyb20gYW55IHN0YXRlIHRvIElkbGUKLSAqICAgICAgICAgICAgICAgICAgb3IgQ29kZWMgQ29uZmlndXJlZCAoaWYgY2FjaGluZyBzdXBwb3J0ZWQpLgotICoKLSAqIOKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVpuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVpuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVpuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVpuKVkOKVkOKVkOKVkOKVkOKVkOKVlwotICog4pWRICBDdXJyZW50IFN0YXRlICAg4pWRIEFTRSBDb250cm9sIFBvaW50IE9wZXJhdGlvbiDilZEgICAgUmVzdWx0ICAgIOKVkSAgICBOZXh0IFN0YXRlICAgIOKVkSBOb3RlIOKVkQotICog4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWs4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWs4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWs4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWs4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjCi0gKiDilZEgSWRsZSAgICAgICAgICAgICDilZEgQ29uZmlnIENvZGVjICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIENvZGVjIENvbmZpZ3VyZWQg4pWRICArICAg4pWRCi0gKiDilZEgQ29kZWMgQ29uZmlndXJlZCDilZEgQ29uZmlnIENvZGVjICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIENvZGVjIENvbmZpZ3VyZWQg4pWRICAtICAg4pWRCi0gKiDilZEgQ29kZWMgQ29uZmlndXJlZCDilZEgUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFJlbGVhc2luZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgQ29kZWMgQ29uZmlndXJlZCDilZEgQ29uZmlnIFFvUyAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFFvUyBDb25maWd1cmVkICAg4pWRICArICAg4pWRCi0gKiDilZEgUW9TIENvbmZpZ3VyZWQgICDilZEgQ29uZmlnIENvZGVjICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIENvZGVjIENvbmZpZ3VyZWQg4pWRICAtICAg4pWRCi0gKiDilZEgUW9TIENvbmZpZ3VyZWQgICDilZEgQ29uZmlnIFFvUyAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFFvUyBDb25maWd1cmVkICAg4pWRICAtICAg4pWRCi0gKiDilZEgUW9TIENvbmZpZ3VyZWQgICDilZEgUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFJlbGVhc2luZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgUW9TIENvbmZpZ3VyZWQgICDilZEgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIEVuYWJsaW5nICAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgRW5hYmxpbmcgICAgICAgICDilZEgUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFJlbGVhc2luZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgRW5hYmxpbmcgICAgICAgICDilZEgVXBkYXRlIE1ldGFkYXRhICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIEVuYWJsaW5nICAgICAgICAg4pWRICAtICAg4pWRCi0gKiDilZEgRW5hYmxpbmcgICAgICAgICDilZEgRGlzYWJsZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIERpc2FibGluZyAgICAgICAg4pWRICAtICAg4pWRCi0gKiDilZEgRW5hYmxpbmcgICAgICAgICDilZEgUmVjZWl2ZXIgU3RhcnQgUmVhZHkgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFN0cmVhbWluZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgU3RyZWFtaW5nICAgICAgICDilZEgVXBkYXRlIE1ldGFkYXRhICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFN0cmVhbWluZyAgICAgICAg4pWRICAtICAg4pWRCi0gKiDilZEgU3RyZWFtaW5nICAgICAgICDilZEgRGlzYWJsZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIERpc2FibGluZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgU3RyZWFtaW5nICAgICAgICDilZEgUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFJlbGVhc2luZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgRGlzYWJsaW5nICAgICAgICDilZEgUmVjZWl2ZXIgU3RvcCBSZWFkeSAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFFvUyBDb25maWd1cmVkICAg4pWRICArICAg4pWRCi0gKiDilZEgRGlzYWJsaW5nICAgICAgICDilZEgUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIFJlbGVhc2luZyAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgUmVsZWFzaW5nICAgICAgICDilZEgUmVsZWFzZWQgKG5vIGNhY2hpbmcpICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIElkbGUgICAgICAgICAgICAg4pWRICArICAg4pWRCi0gKiDilZEgUmVsZWFzaW5nICAgICAgICDilZEgUmVsZWFzZWQgKGNhY2hpbmcpICAgICAgICAgIOKVkSBTdWNjZXNzICAgICAg4pWRIENvZGVjIENvbmZpZ3VyZWQg4pWRICAtICAg4pWRCi0gKiDilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilanilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilanilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilanilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilanilZDilZDilZDilZDilZDilZDilZ0KLSAqCi0gKiArIC0gc3VwcG9ydGVkIHRyYW5zaXRpb24KLSAqIC0gLSBub3Qgc3VwcG9ydGVkCi0gKi8KLS8vIGNsYW5nLWZvcm1hdCBvbgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlcjsKLXVzaW5nIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzOwotdXNpbmcgbGVfYXVkaW86OkxlQXVkaW9EZXZpY2U7Ci11c2luZyBsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwOwotdXNpbmcgbGVfYXVkaW86OkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTsKLQotdXNpbmcgbGVfYXVkaW86OnR5cGVzOjphc2U7Ci11c2luZyBsZV9hdWRpbzo6dHlwZXM6OkFzZVN0YXRlOwotdXNpbmcgbGVfYXVkaW86OnR5cGVzOjpBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciBpbnQgbGlua1F1YWxpdHlDaGVja0ludGVydmFsID0gNDAwMDsKLQotc3RhdGljIHZvaWQgbGlua19xdWFsaXR5X2NiKHZvaWQqIGRhdGEpIHsKLSAgLy8gdmVyeSB1Z2x5LCBidXQgd2UgbmVlZCB0byBwYXNzIGp1c3QgdHdvIGJ5dGVzCi0gIHVpbnQxNl90IGNpc19jb25uX2hhbmRsZSA9ICooKHVpbnQxNl90KilkYXRhKTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZWFkSXNvTGlua1F1YWxpdHkoY2lzX2Nvbm5faGFuZGxlKTsKLX0KLQotY2xhc3MgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lSW1wbDsKLUxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZUltcGwqIGluc3RhbmNlOwotCi1jbGFzcyBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmVJbXBsIDogcHVibGljIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZSB7Ci0gcHVibGljOgotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmVJbXBsKENhbGxiYWNrcyogc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfKQotICAgICAgOiBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18oc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfKSwKLSAgICAgICAgd2F0Y2hkb2dfKGFsYXJtX25ldygiTGVBdWRpb1N0YXRlTWFjaGluZVRpbWVyIikpIHt9Ci0KLSAgfkxlQXVkaW9Hcm91cFN0YXRlTWFjaGluZUltcGwoKSB7Ci0gICAgYWxhcm1fZnJlZSh3YXRjaGRvZ18pOwotICAgIHdhdGNoZG9nXyA9IG51bGxwdHI7Ci0gIH0KLQotICBib29sIEF0dGFjaFRvU3RyZWFtKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdyb3VwIGlkOiAiIDw8IGdyb3VwLT5ncm91cF9pZF8KLSAgICAgICAgICAgICAgPDwgIiBkZXZpY2U6ICIgPDwgbGVBdWRpb0RldmljZS0+YWRkcmVzc187Ci0KLSAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIHN0cmVhbS4KLSAgICAgKiBMaW1pdGF0aW9uIGhlcmUgaXMgdGhhdCBkZXZpY2Ugc2hvdWxkIGJlIHByZXZpb3VzbHkgaW4gdGhlIHN0cmVhbWluZwotICAgICAqIGdyb3VwIGFuZCBqdXN0IGdvdCByZWNvbm5lY3RlZC4KLSAgICAgKi8KLSAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgIT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgZ3JvdXAgbm90IGluIHRoZSBzdHJlYW1pbmcgc3RhdGU6ICIgPDwgZ3JvdXAtPkdldFN0YXRlKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgUHJlcGFyZUFuZFNlbmRDb2RlY0NvbmZpZ3VyZShncm91cCwgbGVBdWRpb0RldmljZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIFN0YXJ0U3RyZWFtKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgbGVfYXVkaW86OnR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGUgY29udGV4dF90eXBlKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY3VycmVudCBzdGF0ZTogIiA8PCBncm91cC0+R2V0U3RhdGUoKTsKLQotICAgIHN3aXRjaCAoZ3JvdXAtPkdldFN0YXRlKCkpIHsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRDoKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRToKLSAgICAgICAgaWYgKCFncm91cC0+Q29uZmlndXJlKGNvbnRleHRfdHlwZSkpIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGZhaWxlZCB0byBzZXQgQVNFIGNvbmZpZ3VyYXRpb24iOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbCBBU0VzIHNob3VsZCBhaW0gdG8gYWNoaWV2ZSB0YXJnZXQgc3RhdGUgKi8KLSAgICAgICAgZ3JvdXAtPlNldENvbnRleHRUeXBlKGNvbnRleHRfdHlwZSk7Ci0gICAgICAgIFNldFRhcmdldFN0YXRlKGdyb3VwLCBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotICAgICAgICBQcmVwYXJlQW5kU2VuZENvZGVjQ29uZmlndXJlKGdyb3VwLCBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEOiB7Ci0gICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBncm91cCBoYXMgbm8gYWN0aXZlIGRldmljZXMiOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbCBBU0VzIHNob3VsZCBhaW0gdG8gYWNoaWV2ZSB0YXJnZXQgc3RhdGUgKi8KLSAgICAgICAgU2V0VGFyZ2V0U3RhdGUoZ3JvdXAsIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORyk7Ci0gICAgICAgIFByZXBhcmVBbmRTZW5kRW5hYmxlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkc6IHsKLSAgICAgICAgLyogVGhpcyBjYXNlIGp1c3QgdXBkYXRlcyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBzdHJlYW0sIGluIGNhc2UKLSAgICAgICAgICogc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgc2F0aXNmaWVkCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIWdyb3VwLT5Jc01ldGFkYXRhQ2hhbmdlZChjb250ZXh0X3R5cGUpKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0QWN0aXZlRGV2aWNlKCk7Ci0gICAgICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgZ3JvdXAgaGFzIG5vIGFjdGl2ZSBkZXZpY2VzIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBQcmVwYXJlQW5kU2VuZFVwZGF0ZU1ldGFkYXRhKGdyb3VwLCBsZUF1ZGlvRGV2aWNlLCBjb250ZXh0X3R5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHRyYW5zaXQgZnJvbSAiIDw8IGdyb3VwLT5HZXRTdGF0ZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIFN1c3BlbmRTdHJlYW0oTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCkgb3ZlcnJpZGUgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICBMT0dfQVNTRVJUKGxlQXVkaW9EZXZpY2UpCi0gICAgICAgIDw8IF9fZnVuY19fIDw8ICIgU2hvdWxkbid0IGJlIGNhbGxlZCB3aXRob3V0IGFuIGFjdGl2ZSBkZXZpY2UuIjsKLQotICAgIC8qIEFsbCBBU0VzIHNob3VsZCBhaW0gdG8gYWNoaWV2ZSB0YXJnZXQgc3RhdGUgKi8KLSAgICBTZXRUYXJnZXRTdGF0ZShncm91cCwgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpOwotICAgIFByZXBhcmVBbmRTZW5kRGlzYWJsZShsZUF1ZGlvRGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgU3RvcFN0cmVhbShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSBvdmVycmlkZSB7Ci0gICAgaWYgKGdyb3VwLT5Jc1JlbGVhc2luZygpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgZ3JvdXAgYWxyZWFkeSBpbiByZWxlYXNpbmcgcHJvY2VzcyI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdEFjdGl2ZURldmljZSgpOwotICAgIGlmIChsZUF1ZGlvRGV2aWNlID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIGRldmljZS4iOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEFsbCBBc2VzIHNob3VsZCBhaW0gdG8gYWNoaWV2ZSB0YXJnZXQgc3RhdGUgKi8KLSAgICBTZXRUYXJnZXRTdGF0ZShncm91cCwgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSk7Ci0gICAgUHJlcGFyZUFuZFNlbmRSZWxlYXNlKGxlQXVkaW9EZXZpY2UpOwotICB9Ci0KLSAgdm9pZCBQcm9jZXNzR2F0dE5vdGlmRXZlbnQodWludDhfdCogdmFsdWUsIHVpbnQxNl90IGxlbiwgc3RydWN0IGFzZSogYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSBvdmVycmlkZSB7Ci0gICAgc3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfcnNwX2hkciBhcmg7Ci0KLSAgICBQYXJzZUFzZVN0YXR1c0hlYWRlcihhcmgsIGxlbiwgdmFsdWUpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXwotICAgICAgICAgICAgICA8PCAiLCBBU0UgaWQ6ICIgPDwgK2FzZS0+aWQgPDwgIiBzdGF0ZSBjaGFuZ2VkICIgPDwgYXNlLT5zdGF0ZQotICAgICAgICAgICAgICA8PCAiIC0+ICIgPDwgQXNlU3RhdGUoYXJoLnN0YXRlKTsKLQotICAgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8QXNlU3RhdGU+KGFyaC5zdGF0ZSkpIHsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRToKLSAgICAgICAgQXNlU3RhdGVNYWNoaW5lUHJvY2Vzc0lkbGUoYXJoLCBhc2UsIGdyb3VwLCBsZUF1ZGlvRGV2aWNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQ6Ci0gICAgICAgIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NDb2RlY0NvbmZpZ3VyZWQoCi0gICAgICAgICAgICBhcmgsIGFzZSwgdmFsdWUgKyBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6a0FzZVJzcEhkck1pbkxlbiwKLSAgICAgICAgICAgIGxlbiAtIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjprQXNlUnNwSGRyTWluTGVuLCBncm91cCwKLSAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQ6Ci0gICAgICAgIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NRb3NDb25maWd1cmVkKGFyaCwgYXNlLCBncm91cCwgbGVBdWRpb0RldmljZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9FTkFCTElORzoKLSAgICAgICAgQXNlU3RhdGVNYWNoaW5lUHJvY2Vzc0VuYWJsaW5nKGFyaCwgYXNlLCBncm91cCwgbGVBdWRpb0RldmljZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkc6Ci0gICAgICAgIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NTdHJlYW1pbmcoCi0gICAgICAgICAgICBhcmgsIGFzZSwgdmFsdWUgKyBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6a0FzZVJzcEhkck1pbkxlbiwKLSAgICAgICAgICAgIGxlbiAtIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjprQXNlUnNwSGRyTWluTGVuLCBncm91cCwKLSAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRElTQUJMSU5HOgotICAgICAgICBBc2VTdGF0ZU1hY2hpbmVQcm9jZXNzRGlzYWJsaW5nKGFyaCwgYXNlLCBncm91cCwgbGVBdWRpb0RldmljZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9SRUxFQVNJTkc6Ci0gICAgICAgIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NSZWxlYXNpbmcoYXJoLCBhc2UsIGdyb3VwLCBsZUF1ZGlvRGV2aWNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgV3JvbmcgQUVTIHN0YXR1czogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFyaC5zdGF0ZSk7Ci0gICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFByb2Nlc3NIY2lOb3RpZk9uQ2lnQ3JlYXRlKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb25uX2hhbmRsZXMpIG92ZXJyaWRlIHsKLSAgICB1aW50OF90IGkgPSAwOwotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2U7Ci0gICAgc3RydWN0IGxlX2F1ZGlvOjp0eXBlczo6YXNlKiBhc2U7Ci0KLSAgICAvKiBUT0RPOiBXaGF0IGlmIG5vdCBhbGwgY2lzZXMgd2lsbCBiZSBjb25maWd1cmVkID8KLSAgICAgKiBjb25uX2hhbmRsZS5zaXplKCkgIT0gYWN0aXZlIGFzZXMgaW4gZ3JvdXAKLSAgICAgKi8KLQotICAgIGlmICghZ3JvdXApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBjaWciOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiwgZmFpbGVkIHRvIGNyZWF0ZSBDSUcsIHJlYXNvbjogIiA8PCBsb2doZXgoc3RhdHVzKTsKLSAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdyb3VwLT5jaWdfY3JlYXRlZF8gPSB0cnVlOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJHcm91cCBpZDogIiA8PCArZ3JvdXAtPmdyb3VwX2lkXwotICAgICAgICAgICAgICA8PCAiIGNvbm5faGFuZGxlIHNpemUgIiA8PCArY29ubl9oYW5kbGVzLnNpemUoKTsKLQotICAgIC8qIEFzc2lnbiBhbGwgY29ubmVjdGlvbiBoYW5kbGVzIHRvIGFzZXMuIENJUyBJRCBvcmRlciBpcyByZXByZXNlbnRlZCBieSB0aGUKLSAgICAgKiBvcmRlciBvZiBhY3RpdmUgQVNFcyBpbiBhY3RpdmUgbGVBdWRpb0RldmljZXMKLSAgICAgKi8KLQotICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICBMT0dfQVNTRVJUKGxlQXVkaW9EZXZpY2UpCi0gICAgICAgIDw8IF9fZnVuY19fIDw8ICIgU2hvdWxkbid0IGJlIGNhbGxlZCB3aXRob3V0IGFuIGFjdGl2ZSBkZXZpY2UuIjsKLQotICAgIC8qIEFzc2lnbiBhbGwgY29ubmVjdGlvbiBoYW5kbGVzIHRvIGFzZXMgKi8KLSAgICBkbyB7Ci0gICAgICBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGF0YVBhdGhTdGF0ZSgKLSAgICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OklETEUpOwotICAgICAgTE9HX0FTU0VSVChhc2UpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIEFTRSI7Ci0gICAgICBkbyB7Ci0gICAgICAgIGF1dG8gYXNlc19wYWlyID0gbGVBdWRpb0RldmljZS0+R2V0QXNlc0J5Q2lzSWQoYXNlLT5jaXNfaWQpOwotCi0gICAgICAgIGlmIChhc2VzX3BhaXIuc2luaykgewotICAgICAgICAgIGFzZXNfcGFpci5zaW5rLT5jaXNfY29ubl9oZGwgPSBjb25uX2hhbmRsZXNbaV07Ci0gICAgICAgICAgYXNlc19wYWlyLnNpbmstPmRhdGFfcGF0aF9zdGF0ZSA9Ci0gICAgICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0FTU0lHTkVEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhc2VzX3BhaXIuc291cmNlKSB7Ci0gICAgICAgICAgYXNlc19wYWlyLnNvdXJjZS0+Y2lzX2Nvbm5faGRsID0gY29ubl9oYW5kbGVzW2ldOwotICAgICAgICAgIGFzZXNfcGFpci5zb3VyY2UtPmRhdGFfcGF0aF9zdGF0ZSA9Ci0gICAgICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0FTU0lHTkVEOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0gd2hpbGUgKChhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGF0YVBhdGhTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpJRExFKSkgJiYKLSAgICAgICAgICAgICAgIChpIDwgY29ubl9oYW5kbGVzLnNpemUoKSkpOwotICAgIH0gd2hpbGUgKChsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHRBY3RpdmVEZXZpY2UobGVBdWRpb0RldmljZSkpICYmCi0gICAgICAgICAgICAgKGkgPCBjb25uX2hhbmRsZXMuc2l6ZSgpKSk7Ci0KLSAgICAvKiBMYXN0IG5vZGUgY29uZmlndXJlZCwgcHJvY2VzcyBncm91cCB0byBjb2RlYyBjb25maWd1cmVkIHN0YXRlICovCi0gICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKTsKLQotICAgIGlmIChncm91cC0+R2V0VGFyZ2V0U3RhdGUoKSA9PSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpIHsKLSAgICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICAgIExPR19BU1NFUlQobGVBdWRpb0RldmljZSkKLSAgICAgICAgICA8PCBfX2Z1bmNfXyA8PCAiIFNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgZGV2aWNlLiI7Ci0gICAgICBQcmVwYXJlQW5kU2VuZEVuYWJsZShsZUF1ZGlvRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiLCBpbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24sIGZyb206ICIgPDwgZ3JvdXAtPkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgdG86ICIgPDwgZ3JvdXAtPkdldFRhcmdldFN0YXRlKCk7Ci0gICAgICBTdG9wU3RyZWFtKGdyb3VwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEZyZWVMaW5rUXVhbGl0eVJlcG9ydHMoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5saW5rX3F1YWxpdHlfdGltZXIgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgYWxhcm1fZnJlZShsZUF1ZGlvRGV2aWNlLT5saW5rX3F1YWxpdHlfdGltZXIpOwotICAgIGxlQXVkaW9EZXZpY2UtPmxpbmtfcXVhbGl0eV90aW1lciA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIFByb2Nlc3NIY2lOb3RpZk9uQ2lnUmVtb3ZlKHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXApIG92ZXJyaWRlIHsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIGZhaWxlZCB0byByZW1vdmUgY2lnLCBpZDogIiA8PCBsb2doZXgoZ3JvdXAtPmdyb3VwX2lkXykKLSAgICAgICAgICAgICAgICAgPDwgIiwgc3RhdHVzOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdyb3VwLT5jaWdfY3JlYXRlZF8gPSBmYWxzZTsKLQotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgICBpZiAoIWxlQXVkaW9EZXZpY2UpIHJldHVybjsKLQotICAgIGRvIHsKLSAgICAgIEZyZWVMaW5rUXVhbGl0eVJlcG9ydHMobGVBdWRpb0RldmljZSk7Ci0KLSAgICAgIGZvciAoYXV0byYgYXNlIDogbGVBdWRpb0RldmljZS0+YXNlc18pIHsKLSAgICAgICAgYXNlLmRhdGFfcGF0aF9zdGF0ZSA9IEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6SURMRTsKLSAgICAgICAgYXNlLmNpc19pZCA9IGxlX2F1ZGlvOjprSW52YWxpZENpc0lkOwotICAgICAgfQotICAgIH0gd2hpbGUgKChsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHREZXZpY2UobGVBdWRpb0RldmljZSkpKTsKLSAgfQotCi0gIHZvaWQgUHJvY2Vzc0hjaU5vdGlmU2V0dXBJc29EYXRhUGF0aChMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9oYW5kbGUpIG92ZXJyaWRlIHsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGZhaWxlZCB0byBzZXR1cCBkYXRhIHBhdGgiOwotICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBjaXMuKi8KLSAgICBhdXRvIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlQnlEYXRhUGF0aFN0YXRlKAotICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19FU1RBQkxJU0hFRCk7Ci0KLSAgICBpZiAoYXNlLT5jaXNfY29ubl9oZGwgIT0gY29ubl9oYW5kbGUpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBDYW5ub3QgZmluZCBhc2UgYnkgaGFuZGxlICIgPDwgK2Nvbm5faGFuZGxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFzZS0+ZGF0YV9wYXRoX3N0YXRlID0gQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpEQVRBX1BBVEhfRVNUQUJMSVNIRUQ7Ci0KLSAgICBpZiAoZ3JvdXAtPkdldFRhcmdldFN0YXRlKCkgIT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBHcm91cCAiIDw8IGdyb3VwLT5ncm91cF9pZF8KLSAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCB0YXJnZXRpbmcgc3RyZWFtaW5nIHN0YXRlIGFueSBtb3JlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSk7Ci0gICAgaWYgKCFhc2UpIHsKLSAgICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKTsKLQotICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgICAgIHN0YXRlX21hY2hpbmVfY2FsbGJhY2tzXy0+U3RhdHVzUmVwb3J0Q2IoZ3JvdXAtPmdyb3VwX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cFN0cmVhbVN0YXR1czo6U1RSRUFNSU5HKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOwotICAgIH0KLQotICAgIExPR19BU1NFUlQoYXNlKSA8PCBfX2Z1bmNfXyA8PCAiIHNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgQVNFIjsKLSAgICBpZiAoYXNlLT5kYXRhX3BhdGhfc3RhdGUgPT0gQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfRVNUQUJMSVNIRUQpCi0gICAgICBQcmVwYXJlRGF0YVBhdGgoYXNlKTsKLSAgICBlbHNlCi0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgQ0lTIGdvdCBkaXNjb25uZWN0ZWQ/IGhhbmRsZTogIiA8PCArYXNlLT5jaXNfY29ubl9oZGw7Ci0gIH0KLQotICB2b2lkIFByb2Nlc3NIY2lOb3RpZlJlbW92ZUlzb0RhdGFQYXRoKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2hkbCkgb3ZlcnJpZGUgewotICAgIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgZmFpbGVkIHRvIHJlbW92ZSBJU08gZGF0YSBwYXRoLCByZWFzb246ICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXR1cyk7Ci0gICAgICBTdG9wU3RyZWFtKGdyb3VwKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgZG9fZGlzY29ubmVjdCA9IGZhbHNlOwotCi0gICAgYXV0byBhc2VzX3BhaXIgPSBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKGNvbm5faGRsKTsKLSAgICBpZiAoYXNlc19wYWlyLnNpbmsgJiYgKGFzZXNfcGFpci5zaW5rLT5kYXRhX3BhdGhfc3RhdGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6REFUQV9QQVRIX0VTVEFCTElTSEVEKSkgewotICAgICAgYXNlc19wYWlyLnNpbmstPmRhdGFfcGF0aF9zdGF0ZSA9Ci0gICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfRElTQ09OTkVDVElORzsKLSAgICAgIGRvX2Rpc2Nvbm5lY3QgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChhc2VzX3BhaXIuc291cmNlICYmCi0gICAgICAgIGFzZXNfcGFpci5zb3VyY2UtPmRhdGFfcGF0aF9zdGF0ZSA9PQotICAgICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpEQVRBX1BBVEhfRVNUQUJMSVNIRUQpIHsKLSAgICAgIGFzZXNfcGFpci5zb3VyY2UtPmRhdGFfcGF0aF9zdGF0ZSA9Ci0gICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfRElTQ09OTkVDVElORzsKLSAgICAgIGRvX2Rpc2Nvbm5lY3QgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChkb19kaXNjb25uZWN0KQotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RGlzY29ubmVjdENpcyhjb25uX2hkbCwgSENJX0VSUl9QRUVSX1VTRVIpOwotICB9Ci0KLSAgdm9pZCBQcm9jZXNzSGNpTm90aWZJc29MaW5rUXVhbGl0eVJlYWQoCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLAotICAgICAgdWludDhfdCBjb25uX2hhbmRsZSwgdWludDMyX3QgdHhVbmFja2VkUGFja2V0cywgdWludDMyX3QgdHhGbHVzaGVkUGFja2V0cywKLSAgICAgIHVpbnQzMl90IHR4TGFzdFN1YmV2ZW50UGFja2V0cywgdWludDMyX3QgcmV0cmFuc21pdHRlZFBhY2tldHMsCi0gICAgICB1aW50MzJfdCBjcmNFcnJvclBhY2tldHMsIHVpbnQzMl90IHJ4VW5yZWNlaXZlZFBhY2tldHMsCi0gICAgICB1aW50MzJfdCBkdXBsaWNhdGVQYWNrZXRzKSB7Ci0gICAgTE9HKElORk8pIDw8ICJjb25uX2hhbmRsZTogIiA8PCBsb2doZXgoY29ubl9oYW5kbGUpCi0gICAgICAgICAgICAgIDw8ICIsIHR4VW5hY2tlZFBhY2tldHM6ICIgPDwgbG9naGV4KHR4VW5hY2tlZFBhY2tldHMpCi0gICAgICAgICAgICAgIDw8ICIsIHR4Rmx1c2hlZFBhY2tldHM6ICIgPDwgbG9naGV4KHR4Rmx1c2hlZFBhY2tldHMpCi0gICAgICAgICAgICAgIDw8ICIsIHR4TGFzdFN1YmV2ZW50UGFja2V0czogIiA8PCBsb2doZXgodHhMYXN0U3ViZXZlbnRQYWNrZXRzKQotICAgICAgICAgICAgICA8PCAiLCByZXRyYW5zbWl0dGVkUGFja2V0czogIiA8PCBsb2doZXgocmV0cmFuc21pdHRlZFBhY2tldHMpCi0gICAgICAgICAgICAgIDw8ICIsIGNyY0Vycm9yUGFja2V0czogIiA8PCBsb2doZXgoY3JjRXJyb3JQYWNrZXRzKQotICAgICAgICAgICAgICA8PCAiLCByeFVucmVjZWl2ZWRQYWNrZXRzOiAiIDw8IGxvZ2hleChyeFVucmVjZWl2ZWRQYWNrZXRzKQotICAgICAgICAgICAgICA8PCAiLCBkdXBsaWNhdGVQYWNrZXRzOiAiIDw8IGxvZ2hleChkdXBsaWNhdGVQYWNrZXRzKTsKLSAgfQotCi0gIHZvaWQgUHJvY2Vzc0hjaU5vdGlmQWNsRGlzY29ubmVjdGVkKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBGcmVlTGlua1F1YWxpdHlSZXBvcnRzKGxlQXVkaW9EZXZpY2UpOwotICAgIGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfID0gR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci0KLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgZ3JvdXAgaXMgbnVsbCBmb3IgZGV2aWNlOiAiIDw8IGxlQXVkaW9EZXZpY2UtPmFkZHJlc3NfCi0gICAgICAgICAgICAgICAgIDw8ICIgZ3JvdXBfaWQ6ICIgPDwgbGVBdWRpb0RldmljZS0+Z3JvdXBfaWRfOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8qIHN0cmVhbV9jb25mID0gJmdyb3VwLT5zdHJlYW1fY29uZjsKLSAgICBpZiAoc3RyZWFtX2NvbmYtPnZhbGlkKSB7Ci0gICAgICBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zLmVyYXNlKAotICAgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZi0+c2lua19zdHJlYW1zLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIFtsZUF1ZGlvRGV2aWNlXShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGFzZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPkdldEFzZXNCeUNpc0Nvbm5IZGwocGFpci5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNlcy5zaW5rOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW5kKCkpOwotCi0gICAgICBzdHJlYW1fY29uZi0+c291cmNlX3N0cmVhbXMuZXJhc2UoCi0gICAgICAgICAgc3RkOjpyZW1vdmVfaWYoc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIFtsZUF1ZGlvRGV2aWNlXShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGFzZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPkdldEFzZXNCeUNpc0Nvbm5IZGwocGFpci5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNlcy5zb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfSksCi0gICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVuZCgpKTsKLQotICAgICAgaWYgKHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW1wdHkoKSAmJgotICAgICAgICAgIHN0cmVhbV9jb25mLT5zb3VyY2Vfc3RyZWFtcy5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHN0cmVhbSBzdG9wcGVkICI7Ci0gICAgICAgIHN0cmVhbV9jb25mLT52YWxpZCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIG1hcmsgQVNFcyBhcyBub3QgdXNlZC4gKi8KLSAgICBsZUF1ZGlvRGV2aWNlLT5EZWFjdGl2YXRlQWxsQXNlcygpOwotCi0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZTogIiA8PCBsZUF1ZGlvRGV2aWNlLT5hZGRyZXNzXwotICAgICAgICAgICAgICAgPDwgIiBncm91cCBjb25uZWN0ZWQ6ICIgPDwgZ3JvdXAtPklzQW55RGV2aWNlQ29ubmVjdGVkKCkKLSAgICAgICAgICAgICAgIDw8ICIgYWxsIGFjdGl2ZSBhc2UgZGlzY29ubmVjdGVkOiAiCi0gICAgICAgICAgICAgICA8PCBncm91cC0+SGF2ZUFsbEFjdGl2ZURldmljZXNDaXNEaXNjKCk7Ci0KLSAgICAvKiBHcm91cCBoYXMgY2hhbmdlZC4gTGV0cyB1cGRhdGUgYXZhaWxhYmxlIGNvbnRleHRzICovCi0gICAgZ3JvdXAtPlVwZGF0ZUFjdGl2ZUNvbnRleHRzTWFwKCk7Ci0KLSAgICAvKiBBQ0wgb2Ygb25lIG9mIHRoZSBkZXZpY2UgaGFzIGJlZW4gZHJvcHBlZC4KLSAgICAgKiBJZiB0aGVyZSBpcyBhY3RpdmUgQ0lTLCBkbyBub3RoaW5nIGhlcmUuIEp1c3QgdXBkYXRlIHRoZSBhY3RpdmUgY29udGV4dHMKLSAgICAgKiB0YWJsZQotICAgICAqLwotICAgIGlmIChncm91cC0+SXNBbnlEZXZpY2VDb25uZWN0ZWQoKSAmJgotICAgICAgICAhZ3JvdXAtPkhhdmVBbGxBY3RpdmVEZXZpY2VzQ2lzRGlzYygpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogR3JvdXAgaXMgbm90IGNvbm5lY3RlZCBhbmQgYWxsIHRoZSBDSVNlcyBhcmUgZG93bi4KLSAgICAgKiBJZiBncm91cCBpcyBpbiBJZGxlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgIGlmIChncm91cC0+R2V0U3RhdGUoKSA9PSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBncm91cDogIiA8PCBncm91cC0+Z3JvdXBfaWRfIDw8ICIgaXMgaW4gSURMRSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogQ2xlYW4gc3RhdGVzIGFuZCBkZXN0cm95IEhDSSBncm91cCAqLwotICAgIGdyb3VwLT5TZXRTdGF0ZShBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKTsKLSAgICBncm91cC0+U2V0VGFyZ2V0U3RhdGUoQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSk7Ci0gICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZCh3YXRjaGRvZ18pKSBhbGFybV9jYW5jZWwod2F0Y2hkb2dfKTsKLSAgICBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18tPlN0YXR1c1JlcG9ydENiKGdyb3VwLT5ncm91cF9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cFN0cmVhbVN0YXR1czo6SURMRSk7Ci0KLSAgICBpZiAoIWdyb3VwLT5jaWdfY3JlYXRlZF8pIHJldHVybjsKLQotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlJlbW92ZUNpZyhncm91cC0+Z3JvdXBfaWRfKTsKLSAgfQotCi0gIHZvaWQgUHJvY2Vzc0hjaU5vdGlmQ2lzRXN0YWJsaXNoZWQoCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0KiBldmVudCkKLSAgICAgIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICAgIGF1dG8gYXNlc19wYWlyID0gbGVBdWRpb0RldmljZS0+R2V0QXNlc0J5Q2lzQ29ubkhkbChldmVudC0+Y2lzX2Nvbm5faGRsKTsKLQotICAgIGlmIChldmVudC0+c3RhdHVzKSB7Ci0gICAgICBpZiAoYXNlc19wYWlyLnNpbmspCi0gICAgICAgIGFzZXNfcGFpci5zaW5rLT5kYXRhX3BhdGhfc3RhdGUgPQotICAgICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfQVNTSUdORUQ7Ci0gICAgICBpZiAoYXNlc19wYWlyLnNvdXJjZSkKLSAgICAgICAgYXNlc19wYWlyLnNvdXJjZS0+ZGF0YV9wYXRoX3N0YXRlID0KLSAgICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0FTU0lHTkVEOwotCi0gICAgICAvKiBDSVMgZXN0YWJsaXNobWVudCBmYWlsZWQuIFJlbW92ZSBDSUcgaWYgbm8gb3RoZXIgQ0lTIGlzIGFscmVhZHkgY3JlYXRlZAotICAgICAgICogb3IgcGVuZGluZy4gSWYgQ0lTIGlzIGVzdGFibGlzaGVkLCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBpbiBkaXNjb25uZWN0ZWQKLSAgICAgICAqIGNvbXBsZXRlIGV2ZW50Ci0gICAgICAgKi8KLSAgICAgIGlmIChncm91cC0+SGF2ZUFsbEFjdGl2ZURldmljZXNDaXNEaXNjKCkpIHsKLSAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlQ2lnKGdyb3VwLT5ncm91cF9pZF8pOwotICAgICAgfQotCi0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIGZhaWxlZCB0byBjcmVhdGUgQ0lTLCBzdGF0dXM6ICIgPDwgbG9naGV4KGV2ZW50LT5zdGF0dXMpOwotCi0gICAgICBTdG9wU3RyZWFtKGdyb3VwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXAtPkdldFRhcmdldFN0YXRlKCkgIT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIFVuaW50ZW5kZWQgQ0lTIGVzdGFibGlzaGVtZW50IGV2ZW50IGNhbWUiOwotICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGFzZXNfcGFpci5zaW5rKQotICAgICAgYXNlc19wYWlyLnNpbmstPmRhdGFfcGF0aF9zdGF0ZSA9Ci0gICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfRVNUQUJMSVNIRUQ7Ci0gICAgaWYgKGFzZXNfcGFpci5zb3VyY2UpCi0gICAgICBhc2VzX3BhaXIuc291cmNlLT5kYXRhX3BhdGhfc3RhdGUgPQotICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0VTVEFCTElTSEVEOwotCi0gICAgaWYgKG9zaV9wcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguaXNvX2xpbmtfcXVhbGl0eV9yZXBvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7Ci0gICAgICBsZUF1ZGlvRGV2aWNlLT5saW5rX3F1YWxpdHlfdGltZXIgPQotICAgICAgICAgIGFsYXJtX25ld19wZXJpb2RpYygibGVfYXVkaW9fY2lzX2xpbmtfcXVhbGl0eSIpOwotICAgICAgbGVBdWRpb0RldmljZS0+bGlua19xdWFsaXR5X3RpbWVyX2RhdGEgPSBldmVudC0+Y2lzX2Nvbm5faGRsOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKGxlQXVkaW9EZXZpY2UtPmxpbmtfcXVhbGl0eV90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUXVhbGl0eUNoZWNrSW50ZXJ2YWwsIGxpbmtfcXVhbGl0eV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmbGVBdWRpb0RldmljZS0+bGlua19xdWFsaXR5X3RpbWVyX2RhdGEpOwotICAgIH0KLQotICAgIGlmICghbGVBdWRpb0RldmljZS0+SGF2ZUFsbEFjdGl2ZUFzZXNDaXNFc3QoKSkgewotICAgICAgLyogTW9yZSBjaXMgZXN0YWJsaXNoZWQgZXZlbnQgaGFzIHRvIGNvbWUgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpZHM7Ci0KLSAgICAvKiBBbGwgQ0lTZXMgY3JlYXRlZC4gU2VuZCBzdGFydCByZWFkeSBmb3Igc291cmNlIEFTRSBiZWZvcmUgd2UgY2FuIGdvCi0gICAgICogdG8gc3RyZWFtaW5nIHN0YXRlLgotICAgICAqLwotICAgIHN0cnVjdCBhc2UqIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlKCk7Ci0gICAgTE9HX0FTU0VSVChhc2UpIDw8IF9fZnVuY19fIDw8ICIgc2hvdWxkbid0IGJlIGNhbGxlZCB3aXRob3V0IGFuIGFjdGl2ZSBBU0UiOwotICAgIGRvIHsKLSAgICAgIGlmIChhc2UtPmRpcmVjdGlvbiA9PSBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKQotICAgICAgICBpZHMucHVzaF9iYWNrKGFzZS0+aWQpOwotICAgIH0gd2hpbGUgKChhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpKTsKLQotICAgIGlmIChpZHMuc2l6ZSgpID4gMCkgewotICAgICAgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OlByZXBhcmVBc2VDdHBBdWRpb1JlY2VpdmVyU3RhcnRSZWFkeSgKLSAgICAgICAgICBpZHMsIHZhbHVlKTsKLQotICAgICAgQnRhR2F0dFF1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgTlVMTCwgTlVMTCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBDaXMgZXN0YWJsaXNobWVudCBtYXkgY2FtZSBhZnRlciBzZXR0aW5nIGdyb3VwIHN0YXRlIHRvIHN0cmVhbWluZywgZS5nLgotICAgICAqIGZvciBhdXRvbm9tb3VzIHNjZW5hcmlvIHdoZW4gYXNlIGlzIHNpbmsgKi8KLSAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HICYmCi0gICAgICAgIGdyb3VwLT5Jc0dyb3VwU3RyZWFtUmVhZHkoKSkgewotICAgICAgLyogTm8gbW9yZSB0cmFuc2l0aW9uIGZvciBncm91cCAqLwotICAgICAgYWxhcm1fY2FuY2VsKHdhdGNoZG9nXyk7Ci0gICAgICBQcmVwYXJlRGF0YVBhdGgoZ3JvdXApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUHJvY2Vzc0hjaU5vdGlmQ2lzRGlzY29ubmVjdGVkKAotICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2Rpc2Nvbm5lY3RlZF9ldnQqIGV2ZW50KSBvdmVycmlkZSB7Ci0gICAgLyogUmVzZXQgdGhlIGRpc2Nvbm5lY3RlZCBDSVMgc3RhdGVzICovCi0KLSAgICBGcmVlTGlua1F1YWxpdHlSZXBvcnRzKGxlQXVkaW9EZXZpY2UpOwotCi0gICAgYXV0byBhc2VzX3BhaXIgPSBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKGV2ZW50LT5jaXNfY29ubl9oZGwpOwotICAgIGlmIChhc2VzX3BhaXIuc2luaykgewotICAgICAgYXNlc19wYWlyLnNpbmstPmRhdGFfcGF0aF9zdGF0ZSA9IEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX0FTU0lHTkVEOwotICAgIH0KLSAgICBpZiAoYXNlc19wYWlyLnNvdXJjZSkgewotICAgICAgYXNlc19wYWlyLnNvdXJjZS0+ZGF0YV9wYXRoX3N0YXRlID0KLSAgICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19BU1NJR05FRDsKLSAgICB9Ci0KLSAgICAvKiBJbnZhbGlkYXRlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlmIG5lZWRlZCAqLwotICAgIGF1dG8qIHN0cmVhbV9jb25mID0gJmdyb3VwLT5zdHJlYW1fY29uZjsKLSAgICBpZiAoc3RyZWFtX2NvbmYtPnZhbGlkKSB7Ci0gICAgICBpZiAoYXNlc19wYWlyLnNpbmspIHsKLSAgICAgICAgc3RyZWFtX2NvbmYtPnNpbmtfc3RyZWFtcy5lcmFzZSgKLSAgICAgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmV2ZW50XShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudC0+Y2lzX2Nvbm5faGRsID09IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW5kKCkpOwotICAgICAgfQotCi0gICAgICBpZiAoYXNlc19wYWlyLnNvdXJjZSkgewotICAgICAgICBzdHJlYW1fY29uZi0+c291cmNlX3N0cmVhbXMuZXJhc2UoCi0gICAgICAgICAgICBzdGQ6OnJlbW92ZV9pZihzdHJlYW1fY29uZi0+c291cmNlX3N0cmVhbXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zb3VyY2Vfc3RyZWFtcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmZXZlbnRdKGF1dG8mIHBhaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LT5jaXNfY29ubl9oZGwgPT0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVuZCgpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW1wdHkoKSAmJgotICAgICAgICAgIHN0cmVhbV9jb25mLT5zb3VyY2Vfc3RyZWFtcy5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHN0cmVhbSBzdG9wcGVkICI7Ci0gICAgICAgIHN0cmVhbV9jb25mLT52YWxpZCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGF1dG8gdGFyZ2V0X3N0YXRlID0gZ3JvdXAtPkdldFRhcmdldFN0YXRlKCk7Ci0gICAgc3dpdGNoICh0YXJnZXRfc3RhdGUpIHsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HOgotICAgICAgICAvKiBTb21ldGhpbmcgd3JvbmcgaGFwcGVuIHdoZW4gc3RyZWFtaW5nIG9yIHdoZW4gY3JlYXRpbmcgc3RyZWFtLgotICAgICAgICAgKiBJZiB0aGVyZSBpcyBvdGhlciBkZXZpY2UgY29ubmVjdGVkIGFuZCBzdHJlYW1pbmcsIGp1c3QgbGVhdmUgaXQgYXMgaXQKLSAgICAgICAgICogaXMsIG90aGVyd2lzZSBzdG9wIHRoZSBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIWdyb3VwLT5IYXZlQWxsQWN0aXZlRGV2aWNlc0Npc0Rpc2MoKSkgewotICAgICAgICAgIC8qIFRPRE86IFJlY29uZmlndXJlIExDMyBjb2RlYyBmcm9tIGhlcmUgb3IgbWF5YmUgb3RoZXIgcGxhY2U/Ki8KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKklmIHRoZXJlIGlzIG5vIG1vcmUgYXNlIHRvIHN0cmVhbS4gU3VzcGVuZCBhdWRpbyBhbmQgY2xlYXIgc3RhdGUKLSAgICAgICAgICogbWFjaGluZSAtPiBnbyB0byBJZGxlICovCi0gICAgICAgIHN0YXRlX21hY2hpbmVfY2FsbGJhY2tzXy0+U3RhdHVzUmVwb3J0Q2IoZ3JvdXAtPmdyb3VwX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cFN0cmVhbVN0YXR1czo6U1VTUEVOREVEKTsKLSAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRDoKLSAgICAgICAgLyogSW50ZW50aW9uYWwgZ3JvdXAgZGlzY29ubmVjdCBoYXMgZmluaXNoZWQsIGJ1dCB0aGUgbGFzdCBDSVMgaW4gdGhlCi0gICAgICAgICAqIGV2ZW50IGNhbWUgYWZ0ZXIgdGhlIEFTRSBub3RpZmljYXRpb24uCi0gICAgICAgICAqIElmIGdyb3VwIGlzIGFscmVhZHkgc3VzcGVuZGVkIGFuZCBhbGwgQ0lTIGFyZSBkaXNjb25uZWN0ZWQsIHdlIGNhbgotICAgICAgICAgKiByZXBvcnQgU1VTUEVOREVEIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChncm91cC0+R2V0U3RhdGUoKSA9PQotICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKSAmJgotICAgICAgICAgICAgZ3JvdXAtPkhhdmVBbGxBY3RpdmVEZXZpY2VzQ2lzRGlzYygpKSB7Ci0gICAgICAgICAgLyogTm8gbW9yZSB0cmFuc2l0aW9uIGZvciBncm91cCAqLwotICAgICAgICAgIGFsYXJtX2NhbmNlbCh3YXRjaGRvZ18pOwotCi0gICAgICAgICAgc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfLT5TdGF0dXNSZXBvcnRDYigKLSAgICAgICAgICAgICAgZ3JvdXAtPmdyb3VwX2lkXywgR3JvdXBTdHJlYW1TdGF0dXM6OlNVU1BFTkRFRCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFOgotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEOgotICAgICAgICAvKiBUaG9zZSB0d28gYXJlIHVzZWQgd2hlbiBjbG9zaW5nIHRoZSBzdHJlYW0gYW5kIENJUyBkaXNjb25uZWN0aW9uIGlzCi0gICAgICAgICAqIGV4cGVjdGVkICovCi0gICAgICAgIGlmIChncm91cC0+SGF2ZUFsbEFjdGl2ZURldmljZXNDaXNEaXNjKCkpIHsKLSAgICAgICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVDaWcoZ3JvdXAtPmdyb3VwX2lkXyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBXZSBzaG91bGQgc2VuZCBSZWNlaXZlciBTdG9wIFJlYWR5IHdoZW4gYWN0aW5nIGFzIGEgc291cmNlICovCi0gICAgaWYgKGFzZXNfcGFpci5zb3VyY2UgJiYKLSAgICAgICAgYXNlc19wYWlyLnNvdXJjZS0+c3RhdGUgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRElTQUJMSU5HKSB7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpZHMgPSB7YXNlc19wYWlyLnNvdXJjZS0+aWR9OwotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgICAgIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpQcmVwYXJlQXNlQ3RwQXVkaW9SZWNlaXZlclN0b3BSZWFkeShpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotICAgICAgQnRhR2F0dFF1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgTlVMTCwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogVGVhciBkb3duIENJUydzIGRhdGEgcGF0aHMgd2l0aGluIHRoZSBncm91cCAqLwotICAgIHN0cnVjdCBhc2UqIGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldEZpcnN0QWN0aXZlQXNlQnlEYXRhUGF0aFN0YXRlKAotICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkRBVEFfUEFUSF9FU1RBQkxJU0hFRCk7Ci0gICAgaWYgKCFhc2UpIHsKLSAgICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKTsKLSAgICAgIC8qIE5vIG1vcmUgQVNFcyB0byBkaXNjb25uZWN0IHRoZWlyIENJU2VzICovCi0gICAgICBpZiAoIWxlQXVkaW9EZXZpY2UpIHJldHVybjsKLQotICAgICAgYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsKLSAgICB9Ci0KLSAgICBMT0dfQVNTRVJUKGFzZSkgPDwgX19mdW5jX18gPDwgIiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIEFTRSI7Ci0gICAgYXNlc19wYWlyID0gbGVBdWRpb0RldmljZS0+R2V0QXNlc0J5Q2lzQ29ubkhkbChhc2UtPmNpc19jb25uX2hkbCk7Ci0KLSAgICBpZiAoYXNlLT5kYXRhX3BhdGhfc3RhdGUgPT0KLSAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpEQVRBX1BBVEhfRVNUQUJMSVNIRUQpIHsKLSAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlJlbW92ZUlzb0RhdGFQYXRoKAotICAgICAgICAgIGFzZS0+Y2lzX2Nvbm5faGRsLAotICAgICAgICAgIChhc2VzX3BhaXIuc2luawotICAgICAgICAgICAgICAgPyBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbk91dAotICAgICAgICAgICAgICAgOiAweDAwKSB8Ci0gICAgICAgICAgICAgIChhc2VzX3BhaXIuc291cmNlCi0gICAgICAgICAgICAgICAgICAgPyBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbkluCi0gICAgICAgICAgICAgICAgICAgOiAweDAwKSk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtTdGF0ZVRyYW5zaXRpb25UaW1lb3V0TXMgPSA1MDAwOwotICBzdGF0aWMgY29uc3RleHByIGNoYXIga1N0YXRlVHJhbnNpdGlvblRpbWVvdXRNc1Byb3BbXSA9Ci0gICAgICAicGVyc2lzdC5ibHVldG9vdGgubGVhdWRpby5kZXZpY2Uuc2V0LnN0YXRlLnRpbWVvdXRtcyI7Ci0gIENhbGxiYWNrcyogc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfOwotICBhbGFybV90KiB3YXRjaGRvZ187Ci0KLSAgLyogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgb24gdGltZW91dCBkdXJpbmcgdHJhbnNpdGlvbiB0byB0YXJnZXQgc3RhdGUgKi8KLSAgdm9pZCBPblN0YXRlVHJhbnNpdGlvblRpbWVvdXQoaW50IGdyb3VwX2lkKSB7Ci0gICAgc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfLT5PblN0YXRlVHJhbnNpdGlvblRpbWVvdXQoZ3JvdXBfaWQpOwotICB9Ci0KLSAgdm9pZCBTZXRUYXJnZXRTdGF0ZShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBBc2VTdGF0ZSBzdGF0ZSkgewotICAgIGdyb3VwLT5TZXRUYXJnZXRTdGF0ZShzdGF0ZSk7Ci0KLSAgICAvKiBHcm91cCBzaG91bGQgdGllIGluIHRpbWUgdG8gZ2V0IHJlcXVlc3RlZCBzdGF0dXMgKi8KLSAgICB1aW50NjRfdCB0aW1lb3V0TXMgPSBrU3RhdGVUcmFuc2l0aW9uVGltZW91dE1zOwotICAgIHRpbWVvdXRNcyA9Ci0gICAgICAgIG9zaV9wcm9wZXJ0eV9nZXRfaW50MzIoa1N0YXRlVHJhbnNpdGlvblRpbWVvdXRNc1Byb3AsIHRpbWVvdXRNcyk7Ci0KLSAgICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKHdhdGNoZG9nXykpIGFsYXJtX2NhbmNlbCh3YXRjaGRvZ18pOwotCi0gICAgYWxhcm1fc2V0X29uX21sb29wKAotICAgICAgICB3YXRjaGRvZ18sIHRpbWVvdXRNcywKLSAgICAgICAgW10odm9pZCogZGF0YSkgewotICAgICAgICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPk9uU3RhdGVUcmFuc2l0aW9uVGltZW91dChQVFJfVE9fSU5UKGRhdGEpKTsKLSAgICAgICAgfSwKLSAgICAgICAgSU5UX1RPX1BUUihncm91cC0+Z3JvdXBfaWRfKSk7Ci0gIH0KLQotICB2b2lkIENpZ0NyZWF0ZShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdEFjdGl2ZURldmljZSgpOwotICAgIHN0cnVjdCBhc2UqIGFzZTsKLSAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbXRvcywgc2R1X2ludGVydmFsX3N0b207Ci0gICAgdWludDhfdCBwYWNraW5nLCBmcmFtaW5nLCBzY2E7Ci0gICAgc3RkOjp2ZWN0b3I8RVhUX0NJU19DRkc+IGNpc19jZmdzOwotCi0gICAgaWYgKGdyb3VwLT5jaWdfY3JlYXRlZF8pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBncm91cCBpZCAiIDw8IGdyb3VwLT5ncm91cF9pZF8KLSAgICAgICAgICAgICAgICAgPDwgIiBpcyBhbHJlYWR5IGNyZWF0ZWQgIGluIHRoZSBjb250cm9sbGVyLiAiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBubyBhY3RpdmUgZGV2aWNlcyBpbiBncm91cCI7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzZHVfaW50ZXJ2YWxfbXRvcyA9Ci0gICAgICAgIGdyb3VwLT5HZXRTZHVJbnRlcnZhbChsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luayk7Ci0gICAgc2R1X2ludGVydmFsX3N0b20gPQotICAgICAgICBncm91cC0+R2V0U2R1SW50ZXJ2YWwobGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSk7Ci0gICAgc2NhID0gZ3JvdXAtPkdldFNDQSgpOwotICAgIHBhY2tpbmcgPSBncm91cC0+R2V0UGFja2luZygpOwotICAgIGZyYW1pbmcgPSBncm91cC0+R2V0RnJhbWluZygpOwotICAgIHVpbnQxNl90IG1heF90cmFuc19sYXRfbXRvcyA9IGdyb3VwLT5HZXRNYXhUcmFuc3BvcnRMYXRlbmN5TXRvcygpOwotICAgIHVpbnQxNl90IG1heF90cmFuc19sYXRfc3RvbSA9IGdyb3VwLT5HZXRNYXhUcmFuc3BvcnRMYXRlbmN5U3RvbSgpOwotCi0gICAgZG8gewotICAgICAgYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsKLSAgICAgIExPR19BU1NFUlQoYXNlKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc2hvdWxkbid0IGJlIGNhbGxlZCB3aXRob3V0IGFuIGFjdGl2ZSBBU0UiOwotICAgICAgZG8gewotICAgICAgICBhdXRvJiBjaXMgPSBhc2UtPmNpc19pZDsKLSAgICAgICAgYXV0byBpdGVyID0KLSAgICAgICAgICAgIGZpbmRfaWYoY2lzX2NmZ3MuYmVnaW4oKSwgY2lzX2NmZ3MuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgIFsmY2lzXShhdXRvIGNvbnN0JiBjZmcpIHsgcmV0dXJuIGNpcyA9PSBjZmcuY2lzX2lkOyB9KTsKLQotICAgICAgICAvKiBDSVMgY29uZmlndXJhdGlvbiBhbHJlYWR5IG9uIGxpc3QgKi8KLSAgICAgICAgaWYgKGl0ZXIgIT0gY2lzX2NmZ3MuZW5kKCkpIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gYXNlc19wYWlyID0gbGVBdWRpb0RldmljZS0+R2V0QXNlc0J5Q2lzSWQoY2lzKTsKLSAgICAgICAgRVhUX0NJU19DRkcgY2lzX2NmZzsKLSAgICAgICAgY2lzX2NmZy5jaXNfaWQgPSBhc2UtPmNpc19pZDsKLSAgICAgICAgY2lzX2NmZy5waHlfbXRvcyA9Ci0gICAgICAgICAgICBncm91cC0+R2V0UGh5Qml0bWFzayhsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luayk7Ci0gICAgICAgIGNpc19jZmcucGh5X3N0b20gPQotICAgICAgICAgICAgZ3JvdXAtPkdldFBoeUJpdG1hc2sobGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSk7Ci0KLSAgICAgICAgaWYgKGFzZXNfcGFpci5zaW5rKSB7Ci0gICAgICAgICAgLyogVE9ETzogY29uZmlnIHNob3VsZCBiZSBwcmV2aW91c2x5IGFkb3B0ZWQgKi8KLSAgICAgICAgICBjaXNfY2ZnLm1heF9zZHVfc2l6ZV9tdG9zID0gYXNlLT5tYXhfc2R1X3NpemU7Ci0gICAgICAgICAgY2lzX2NmZy5ydG5fbXRvcyA9IGFzZS0+cmV0cmFuc19uYjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXNlc19wYWlyLnNvdXJjZSkgewotICAgICAgICAgIC8qIFRPRE86IGNvbmZpZyBzaG91bGQgYmUgcHJldmlvdXNseSBhZG9wdGVkICovCi0gICAgICAgICAgY2lzX2NmZy5tYXhfc2R1X3NpemVfc3RvbSA9IGFzZS0+bWF4X3NkdV9zaXplOwotICAgICAgICAgIGNpc19jZmcucnRuX3N0b20gPSBhc2UtPnJldHJhbnNfbmI7Ci0gICAgICAgIH0KLQotICAgICAgICBjaXNfY2Zncy5wdXNoX2JhY2soY2lzX2NmZyk7Ci0gICAgICB9IHdoaWxlICgoYXNlID0gbGVBdWRpb0RldmljZS0+R2V0TmV4dEFjdGl2ZUFzZShhc2UpKSk7Ci0gICAgfSB3aGlsZSAoKGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKSkpOwotCi0gICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBwYXJhbSA9IHsKLSAgICAgICAgLnNkdV9pdHZfbXRvcyA9IHNkdV9pbnRlcnZhbF9tdG9zLAotICAgICAgICAuc2R1X2l0dl9zdG9tID0gc2R1X2ludGVydmFsX3N0b20sCi0gICAgICAgIC5zY2EgPSBzY2EsCi0gICAgICAgIC5wYWNraW5nID0gcGFja2luZywKLSAgICAgICAgLmZyYW1pbmcgPSBmcmFtaW5nLAotICAgICAgICAubWF4X3RyYW5zX2xhdF9zdG9tID0gbWF4X3RyYW5zX2xhdF9zdG9tLAotICAgICAgICAubWF4X3RyYW5zX2xhdF9tdG9zID0gbWF4X3RyYW5zX2xhdF9tdG9zLAotICAgICAgICAuY2lzX2NmZ3MgPSBzdGQ6Om1vdmUoY2lzX2NmZ3MpLAotICAgIH07Ci0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKGdyb3VwLT5ncm91cF9pZF8sIHN0ZDo6bW92ZShwYXJhbSkpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgQ2lzQ3JlYXRlRm9yRGV2aWNlKExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBzdGQ6OnZlY3RvcjxFWFRfQ0lTX0NSRUFURV9DRkc+IGNvbm5fcGFpcnM7Ci0gICAgc3RydWN0IGFzZSogYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsKLSAgICBkbyB7Ci0gICAgICAvKiBGaXJzdCBpbiBhc2UgcGFpciBpcyBTaW5rLCBzZWNvbmQgU291cmNlICovCi0gICAgICBhdXRvIGFzZXNfcGFpciA9IGxlQXVkaW9EZXZpY2UtPkdldEFzZXNCeUNpc0Nvbm5IZGwoYXNlLT5jaXNfY29ubl9oZGwpOwotCi0gICAgICAvKiBBbHJlYWR5IGluIHBlbmRpbmcgc3RhdGUgLSBiaS1kaXJlY3Rpb25hbCBDSVMgKi8KLSAgICAgIGlmIChhc2UtPmRhdGFfcGF0aF9zdGF0ZSA9PSBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19QRU5ESU5HKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKGFzZXNfcGFpci5zaW5rKQotICAgICAgICBhc2VzX3BhaXIuc2luay0+ZGF0YV9wYXRoX3N0YXRlID0gQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfUEVORElORzsKLSAgICAgIGlmIChhc2VzX3BhaXIuc291cmNlKQotICAgICAgICBhc2VzX3BhaXIuc291cmNlLT5kYXRhX3BhdGhfc3RhdGUgPQotICAgICAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfUEVORElORzsKLQotICAgICAgdWludDE2X3QgYWNsX2hhbmRsZSA9Ci0gICAgICAgICAgQlRNX0dldEhDSUNvbm5IYW5kbGUobGVBdWRpb0RldmljZS0+YWRkcmVzc18sIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgICBjb25uX3BhaXJzLnB1c2hfYmFjayh7LmNpc19jb25uX2hhbmRsZSA9IGFzZS0+Y2lzX2Nvbm5faGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hY2xfY29ubl9oYW5kbGUgPSBhY2xfaGFuZGxlfSk7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjaXMgaGFuZGxlOiAiIDw8ICthc2UtPmNpc19jb25uX2hkbAotICAgICAgICAgICAgICAgIDw8ICIgYWNsIGhhbmRsZSA6ICIgPDwgbG9naGV4KCthY2xfaGFuZGxlKTsKLQotICAgIH0gd2hpbGUgKChhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpKTsKLQotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcygKLSAgICAgICAgey5jb25uX3BhaXJzID0gc3RkOjptb3ZlKGNvbm5fcGFpcnMpfSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBDaXNDcmVhdGUoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCkgewotICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3RBY3RpdmVEZXZpY2UoKTsKLSAgICBzdHJ1Y3QgYXNlKiBhc2U7Ci0gICAgc3RkOjp2ZWN0b3I8RVhUX0NJU19DUkVBVEVfQ0ZHPiBjb25uX3BhaXJzOwotCi0gICAgTE9HX0FTU0VSVChsZUF1ZGlvRGV2aWNlKQotICAgICAgICA8PCBfX2Z1bmNfXyA8PCAiIFNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgZGV2aWNlLiI7Ci0KLSAgICBkbyB7Ci0gICAgICBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOwotICAgICAgTE9HX0FTU0VSVChhc2UpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIEFTRSI7Ci0gICAgICBkbyB7Ci0gICAgICAgIC8qIEZpcnN0IGlzIGFzZSBwYWlyIGlzIFNpbmssIHNlY29uZCBTb3VyY2UgKi8KLSAgICAgICAgYXV0byBhc2VzX3BhaXIgPSBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKGFzZS0+Y2lzX2Nvbm5faGRsKTsKLQotICAgICAgICAvKiBBbHJlYWR5IGluIHBlbmRpbmcgc3RhdGUgLSBiaS1kaXJlY3Rpb25hbCBDSVMgKi8KLSAgICAgICAgaWYgKGFzZS0+ZGF0YV9wYXRoX3N0YXRlID09IEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX1BFTkRJTkcpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGFzZXNfcGFpci5zaW5rKQotICAgICAgICAgIGFzZXNfcGFpci5zaW5rLT5kYXRhX3BhdGhfc3RhdGUgPQotICAgICAgICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19QRU5ESU5HOwotICAgICAgICBpZiAoYXNlc19wYWlyLnNvdXJjZSkKLSAgICAgICAgICBhc2VzX3BhaXIuc291cmNlLT5kYXRhX3BhdGhfc3RhdGUgPQotICAgICAgICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19QRU5ESU5HOwotCi0gICAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUgPQotICAgICAgICAgICAgQlRNX0dldEhDSUNvbm5IYW5kbGUobGVBdWRpb0RldmljZS0+YWRkcmVzc18sIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgICAgIGNvbm5fcGFpcnMucHVzaF9iYWNrKHsuY2lzX2Nvbm5faGFuZGxlID0gYXNlLT5jaXNfY29ubl9oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWNsX2Nvbm5faGFuZGxlID0gYWNsX2hhbmRsZX0pOwotICAgICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2lzIGhhbmRsZTogIiA8PCArYXNlLT5jaXNfY29ubl9oZGwKLSAgICAgICAgICAgICAgICAgICA8PCAiIGFjbCBoYW5kbGUgOiAiIDw8IGxvZ2hleCgrYWNsX2hhbmRsZSk7Ci0KLSAgICAgIH0gd2hpbGUgKChhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpKTsKLSAgICB9IHdoaWxlICgobGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXROZXh0QWN0aXZlRGV2aWNlKGxlQXVkaW9EZXZpY2UpKSk7Ci0KLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMoCi0gICAgICAgIHsuY29ubl9wYWlycyA9IHN0ZDo6bW92ZShjb25uX3BhaXJzKX0pOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgUHJlcGFyZURhdGFQYXRoKGNvbnN0IHN0cnVjdCBhc2UqIGFzZSkgewotICAgIC8qIFRPRE8gSGFuZGxlIEhXIG9mZmxvYWRpbmcgYXMgd2UgaGFuZGxlIGhlcmUgb25seSBIQ0kgZm9yIG5vdyAqLwotICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMgcGFyYW0gPSB7Ci0gICAgICAgIC5kYXRhX3BhdGhfZGlyID0KLSAgICAgICAgICAgIGFzZS0+ZGlyZWN0aW9uID09IGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rCi0gICAgICAgICAgICAgICAgPyBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbkluCi0gICAgICAgICAgICAgICAgOiBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbk91dCwKLSAgICAgICAgLmRhdGFfcGF0aF9pZCA9IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoSGNpLAotICAgICAgICAuY29kZWNfaWRfZm9ybWF0ID0gYXNlLT5jb2RlY19pZC5jb2RpbmdfZm9ybWF0LAotICAgICAgICAuY29kZWNfaWRfY29tcGFueSA9IGFzZS0+Y29kZWNfaWQudmVuZG9yX2NvbXBhbnlfaWQsCi0gICAgICAgIC5jb2RlY19pZF92ZW5kb3IgPSBhc2UtPmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCwKLSAgICAgICAgLmNvbnRyb2xsZXJfZGVsYXkgPSAweDAwMDAwMDAwLAotICAgICAgICAuY29kZWNfY29uZiA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCksCi0gICAgfTsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZXR1cElzb0RhdGFQYXRoKGFzZS0+Y2lzX2Nvbm5faGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBhcmFtKSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgUHJlcGFyZURhdGFQYXRoKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXApIHsKLSAgICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0QWN0aXZlRGV2aWNlKCk7Ci0gICAgTE9HX0FTU0VSVChsZUF1ZGlvRGV2aWNlKQotICAgICAgICA8PCBfX2Z1bmNfXyA8PCAiIFNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgZGV2aWNlLiI7Ci0KLSAgICBhdXRvKiBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOwotICAgIExPR19BU1NFUlQoYXNlKSA8PCBfX2Z1bmNfXyA8PCAiIHNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgQVNFIjsKLSAgICBQcmVwYXJlRGF0YVBhdGgoYXNlKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIFJlbGVhc2VEYXRhUGF0aChMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdEFjdGl2ZURldmljZSgpOwotICAgIExPR19BU1NFUlQobGVBdWRpb0RldmljZSkKLSAgICAgICAgPDwgX19mdW5jX18gPDwgIiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIGRldmljZS4iOwotCi0gICAgYXV0byBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZUJ5RGF0YVBhdGhTdGF0ZSgKLSAgICAgICAgQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpEQVRBX1BBVEhfRVNUQUJMSVNIRUQpOwotICAgIExPR19BU1NFUlQoYXNlKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICA8PCAiIFNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgQVNFLiI7Ci0KLSAgICBhdXRvIGFzZXNfcGFpciA9IGxlQXVkaW9EZXZpY2UtPkdldEFzZXNCeUNpc0Nvbm5IZGwoYXNlLT5jaXNfY29ubl9oZGwpOwotCi0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgICAgIGFzZS0+Y2lzX2Nvbm5faGRsLAotICAgICAgICAoYXNlc19wYWlyLnNpbmsgPyBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbk91dAotICAgICAgICAgICAgICAgICAgICAgICAgOiAweDAwKSB8Ci0gICAgICAgICAgICAoYXNlc19wYWlyLnNvdXJjZQotICAgICAgICAgICAgICAgICA/IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uSW4KLSAgICAgICAgICAgICAgICAgOiAweDAwKSk7Ci0gIH0KLQotICB2b2lkIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NJZGxlKAotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfcnNwX2hkciYgYXJoLCBzdHJ1Y3QgYXNlKiBhc2UsCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgc3dpdGNoIChhc2UtPnN0YXRlKSB7Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEU6Ci0gICAgICAgIGlmIChhc2UtPmlkID09IDB4MDApIHsKLSAgICAgICAgICAvKiBJbml0aWFsIHN0YXRlIG9mIEFzZSAtIHVwZGF0ZSBpZCAqLwotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICA8PCAiLCBkaXNjb3ZlcmVkIGFzZSBpZDogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFyaC5pZCk7Ci0gICAgICAgICAgYXNlLT5pZCA9IGFyaC5pZDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUkVMRUFTSU5HOiB7Ci0gICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2VOZXh0OwotICAgICAgICBhc2UtPnN0YXRlID0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRTsKLSAgICAgICAgYXNlLT5hY3RpdmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIWxlQXVkaW9EZXZpY2UtPkhhdmVBbGxBY3RpdmVBc2VzU2FtZVN0YXRlKAotICAgICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpKSB7Ci0gICAgICAgICAgLyogTW9yZSBBU0VzIG5vdGlmaWNhdGlvbiBmcm9tIHRoaXMgZGV2aWNlIGhhcyB0byBjb21lIGZvciB0aGlzIGdyb3VwCi0gICAgICAgICAgICovCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVBdWRpb0RldmljZU5leHQgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKTsKLQotICAgICAgICAvKiBDb25maWd1cmUgQVNFcyBmb3IgbmV4dCBkZXZpY2UgaW4gZ3JvdXAgKi8KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2VOZXh0KSB7Ci0gICAgICAgICAgUHJlcGFyZUFuZFNlbmRSZWxlYXNlKGxlQXVkaW9EZXZpY2VOZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBMYXN0IG5vZGUgaXMgaW4gcmVsZWFzaW5nIHN0YXRlKi8KLSAgICAgICAgICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKHdhdGNoZG9nXykpIGFsYXJtX2NhbmNlbCh3YXRjaGRvZ18pOwotCi0gICAgICAgICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpOwotCi0gICAgICAgICAgc3RhdGVfbWFjaGluZV9jYWxsYmFja3NfLT5TdGF0dXNSZXBvcnRDYihncm91cC0+Z3JvdXBfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBTdHJlYW1TdGF0dXM6OklETEUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24sIGZyb206ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFzZS0+c3RhdGUpIDw8ICIsIHRvOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKTsKLSAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU3RhcnRDb25maWdRb1NGb3JUaGVHcm91cChMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdEFjdGl2ZURldmljZSgpOwotICAgIGlmICghbGVBdWRpb0RldmljZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBubyBhY3RpdmUgZGV2aWNlcyBpbiBncm91cCI7Ci0gICAgICBTdG9wU3RyZWFtKGdyb3VwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBQcmVwYXJlQW5kU2VuZENvbmZpZ1Fvcyhncm91cCwgbGVBdWRpb0RldmljZSk7Ci0gIH0KLQotICB2b2lkIFByZXBhcmVBbmRTZW5kQ29kZWNDb25maWd1cmUoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBzdHJ1Y3QgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OmN0cF9jb2RlY19jb25mIGNvbmY7Ci0gICAgc3RkOjp2ZWN0b3I8c3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpjdHBfY29kZWNfY29uZj4gY29uZnM7Ci0gICAgc3RydWN0IGFzZSogYXNlOwotCi0gICAgYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsKLSAgICBMT0dfQVNTRVJUKGFzZSkgPDwgX19mdW5jX18gPDwgIiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIEFTRSI7Ci0gICAgZG8gewotICAgICAgY29uZi5hc2VfaWQgPSBhc2UtPmlkOwotICAgICAgY29uZi50YXJnZXRfbGF0ZW5jeSA9IGdyb3VwLT5HZXRUYXJnZXRMYXRlbmN5KCk7Ci0gICAgICBjb25mLnRhcmdldF9waHkgPSBncm91cC0+R2V0VGFyZ2V0UGh5KGFzZS0+ZGlyZWN0aW9uKTsKLSAgICAgIGNvbmYuY29kZWNfaWQgPSBhc2UtPmNvZGVjX2lkOwotICAgICAgY29uZi5jb2RlY19jb25maWcgPSBhc2UtPmNvZGVjX2NvbmZpZzsKLSAgICAgIGNvbmZzLnB1c2hfYmFjayhjb25mKTsKLSAgICB9IHdoaWxlICgoYXNlID0gbGVBdWRpb0RldmljZS0+R2V0TmV4dEFjdGl2ZUFzZShhc2UpKSk7Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6UHJlcGFyZUFzZUN0cENvZGVjQ29uZmlnKGNvbmZzLCB2YWx1ZSk7Ci0gICAgQnRhR2F0dFF1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfTk9fUlNQLCBOVUxMLCBOVUxMKTsKLSAgfQotCi0gIHZvaWQgQXNlU3RhdGVNYWNoaW5lUHJvY2Vzc0NvZGVjQ29uZmlndXJlZCgKLSAgICAgIHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6YXNlX3JzcF9oZHImIGFyaCwgc3RydWN0IGFzZSogYXNlLAotICAgICAgdWludDhfdCogZGF0YSwgdWludDE2X3QgbGVuLCBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIGlmICghZ3JvdXApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgbGVBdWRpb0RldmljZSBkb2Vzbid0IGJlbG9uZyB0byBhbnkgZ3JvdXAiOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogYXNlIGNvbnRhaW4gY3VycmVudCBBU0Ugc3RhdGUuIE5ldyBzdGF0ZSBpcyBpbiAiYXJoIiAqLwotICAgIHN3aXRjaCAoYXNlLT5zdGF0ZSkgewotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFOiB7Ci0gICAgICAgIGlmIChhc2UtPmlkID09IDB4MDApIHsKLSAgICAgICAgICAvKiBJbml0aWFsIHN0YXRlIG9mIEFzZSAtIHVwZGF0ZSBpZCAqLwotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICA8PCAiLCBkaXNjb3ZlcmVkIGFzZSBpZDogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFyaC5pZCk7Ci0gICAgICAgICAgYXNlLT5pZCA9IGFyaC5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2VOZXh0OwotCi0gICAgICAgIHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6YXNlX2NvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zCi0gICAgICAgICAgICByc3A7Ci0KLSAgICAgICAgLyogQ2FjaGUgY29kZWMgY29uZmlndXJlZCBzdGF0dXMgdmFsdWVzIGZvciBmdXJ0aGVyCi0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24vcmVjb25maWd1cmF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIVBhcnNlQXNlU3RhdHVzQ29kZWNDb25maWd1cmVkU3RhdGVQYXJhbXMocnNwLCBsZW4sIGRhdGEpKSB7Ci0gICAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzZS0+ZnJhbWluZyA9IHJzcC5mcmFtaW5nOwotICAgICAgICBhc2UtPnByZWZlcnJlZF9waHkgPSByc3AucHJlZmVycmVkX3BoeTsKLSAgICAgICAgYXNlLT5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPSByc3AubWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICAgICAgICBhc2UtPnByZXNfZGVsYXlfbWluID0gcnNwLnByZXNfZGVsYXlfbWluOwotICAgICAgICBhc2UtPnByZXNfZGVsYXlfbWF4ID0gcnNwLnByZXNfZGVsYXlfbWF4OwotICAgICAgICBhc2UtPnByZWZlcnJlZF9wcmVzX2RlbGF5X21pbiA9IHJzcC5wcmVmZXJyZWRfcHJlc19kZWxheV9taW47Ci0gICAgICAgIGFzZS0+cHJlZmVycmVkX3ByZXNfZGVsYXlfbWF4ID0gcnNwLnByZWZlcnJlZF9wcmVzX2RlbGF5X21heDsKLSAgICAgICAgYXNlLT5yZXRyYW5zX25iID0gcnNwLnByZWZlcnJlZF9yZXRyYW5zX25iOwotCi0gICAgICAgIGFzZS0+c3RhdGUgPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEOwotCi0gICAgICAgIGlmIChncm91cC0+R2V0VGFyZ2V0U3RhdGUoKSA9PSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKSB7Ci0gICAgICAgICAgLyogVGhpcyBpcyBhdXRvbm9tdXMgY2hhbmdlIG9mIHRoZSByZW1vdGUgZGV2aWNlICovCi0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQXV0b25vbXVzIGNoYW5nZS4gSnVzdCBzdG9yZSBpdC4gIjsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGVBdWRpb0RldmljZS0+SGF2ZUFueVVuY29uZmlndXJlZEFzZXMoKSkgewotICAgICAgICAgIC8qIE1vcmUgQVNFcyBub3RpZmljYXRpb24gZnJvbSB0aGlzIGRldmljZSBoYXMgdG8gY29tZSBmb3IgdGhpcyBncm91cAotICAgICAgICAgICAqLwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChncm91cC0+R2V0U3RhdGUoKSA9PSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpIHsKLSAgICAgICAgICAvKiBXZSBhcmUgaGVyZSBiZWNhdXNlIG9mIHRoZSByZWNvbm5lY3Rpb24gb2YgdGhlIHNpbmdsZSBkZXZpY2UuICovCi0gICAgICAgICAgUHJlcGFyZUFuZFNlbmRDb25maWdRb3MoZ3JvdXAsIGxlQXVkaW9EZXZpY2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxlQXVkaW9EZXZpY2VOZXh0ID0gZ3JvdXAtPkdldE5leHRBY3RpdmVEZXZpY2UobGVBdWRpb0RldmljZSk7Ci0KLSAgICAgICAgLyogQ29uZmlndXJlIEFTRXMgZm9yIG5leHQgZGV2aWNlIGluIGdyb3VwICovCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlTmV4dCkgewotICAgICAgICAgIFByZXBhcmVBbmRTZW5kQ29kZWNDb25maWd1cmUoZ3JvdXAsIGxlQXVkaW9EZXZpY2VOZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBMYXN0IG5vZGUgY29uZmlndXJlZCwgcHJvY2VzcyBncm91cCB0byBjb2RlYyBjb25maWd1cmVkIHN0YXRlICovCi0gICAgICAgICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQpOwotCi0gICAgICAgICAgaWYgKGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpID09Ci0gICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgICAgICAgU3RhcnRDb25maWdRb1NGb3JUaGVHcm91cChncm91cCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uLCBmcm9tOiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGdyb3VwLT5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHRvOiAiIDw8IGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpOwotICAgICAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQ6IHsKLSAgICAgICAgLyogUmVjZWl2ZWQgQ29uZmlndXJlZCBpbiBDb25maWd1cmVkIHN0YXRlLiBUaGlzIGNvdWxkIGJlIGRvbmUKLSAgICAgICAgICogYXV0b25vbW91c2x5IGJlY2F1c2Ugb2YgdGhlIHJlY29uZmlndXJhdGlvbiBkb25lIGJ5IHVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6YXNlX2NvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zCi0gICAgICAgICAgICByc3A7Ci0KLSAgICAgICAgLyogQ2FjaGUgY29kZWMgY29uZmlndXJlZCBzdGF0dXMgdmFsdWVzIGZvciBmdXJ0aGVyCi0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24vcmVjb25maWd1cmF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIVBhcnNlQXNlU3RhdHVzQ29kZWNDb25maWd1cmVkU3RhdGVQYXJhbXMocnNwLCBsZW4sIGRhdGEpKSB7Ci0gICAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNlLT5mcmFtaW5nID0gcnNwLmZyYW1pbmc7Ci0gICAgICAgIGFzZS0+cHJlZmVycmVkX3BoeSA9IHJzcC5wcmVmZXJyZWRfcGh5OwotICAgICAgICBhc2UtPm1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IHJzcC5tYXhfdHJhbnNwb3J0X2xhdGVuY3k7Ci0gICAgICAgIGFzZS0+cHJlc19kZWxheV9taW4gPSByc3AucHJlc19kZWxheV9taW47Ci0gICAgICAgIGFzZS0+cHJlc19kZWxheV9tYXggPSByc3AucHJlc19kZWxheV9tYXg7Ci0gICAgICAgIGFzZS0+cHJlZmVycmVkX3ByZXNfZGVsYXlfbWluID0gcnNwLnByZWZlcnJlZF9wcmVzX2RlbGF5X21pbjsKLSAgICAgICAgYXNlLT5wcmVmZXJyZWRfcHJlc19kZWxheV9tYXggPSByc3AucHJlZmVycmVkX3ByZXNfZGVsYXlfbWF4OwotICAgICAgICBhc2UtPnJldHJhbnNfbmIgPSByc3AucHJlZmVycmVkX3JldHJhbnNfbmI7Ci0KLSAgICAgICAgLyogVGhpcyBtYXkgYmUgYSBub3RpZmljYXRpb24gZnJvbSBhIHJlLWNvbmZpZ3VyZWQgQVNFICovCi0gICAgICAgIGFzZS0+cmVjb25maWd1cmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAobGVBdWRpb0RldmljZS0+SGF2ZUFueVVuY29uZmlndXJlZEFzZXMoKSkgewotICAgICAgICAgIC8qIFdhaXRpbmcgZm9yIG90aGVycyB0byBiZSByZWNvbmZpZ3VyZWQgKi8KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICAgICAgLyogV2UgYXJlIGhlcmUgYmVjYXVzZSBvZiB0aGUgcmVjb25uZWN0aW9uIG9mIHRoZSBzaW5nbGUgZGV2aWNlLiAqLwotICAgICAgICAgIFByZXBhcmVBbmRTZW5kQ29uZmlnUW9zKGdyb3VwLCBsZUF1ZGlvRGV2aWNlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlTmV4dCA9Ci0gICAgICAgICAgICBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKTsKLQotICAgICAgICAvKiBDb25maWd1cmUgQVNFcyBmb3IgbmV4dCBkZXZpY2UgaW4gZ3JvdXAgKi8KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2VOZXh0KSB7Ci0gICAgICAgICAgUHJlcGFyZUFuZFNlbmRDb2RlY0NvbmZpZ3VyZShncm91cCwgbGVBdWRpb0RldmljZU5leHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIExhc3Qgbm9kZSBjb25maWd1cmVkLCBwcm9jZXNzIGdyb3VwIHRvIGNvZGVjIGNvbmZpZ3VyZWQgc3RhdGUgKi8KLSAgICAgICAgICBncm91cC0+U2V0U3RhdGUoQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCk7Ci0KLSAgICAgICAgICBpZiAoZ3JvdXAtPkdldFRhcmdldFN0YXRlKCkgPT0KLSAgICAgICAgICAgICAgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICAgICAgICBTdGFydENvbmZpZ1FvU0ZvclRoZUdyb3VwKGdyb3VwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBBdXRvbm9tb3VzZSBjaGFuZ2UgPzogIiA8PCBncm91cC0+R2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCB0bzogIiA8PCBncm91cC0+R2V0VGFyZ2V0U3RhdGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQ6Ci0gICAgICAgIC8qIFRPRE86IENvbmZpZyBDb2RlYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUkVMRUFTSU5HOgotICAgICAgICBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlTmV4dDsKLSAgICAgICAgYXNlLT5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQ7Ci0gICAgICAgIGFzZS0+YWN0aXZlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlLT5IYXZlQWxsQWN0aXZlQXNlc1NhbWVTdGF0ZSgKLSAgICAgICAgICAgICAgICBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKSkgewotICAgICAgICAgIC8qIE1vcmUgQVNFcyBub3RpZmljYXRpb24gZnJvbSB0aGlzIGRldmljZSBoYXMgdG8gY29tZSBmb3IgdGhpcyBncm91cAotICAgICAgICAgICAqLwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxlQXVkaW9EZXZpY2VOZXh0ID0gZ3JvdXAtPkdldE5leHRBY3RpdmVEZXZpY2UobGVBdWRpb0RldmljZSk7Ci0KLSAgICAgICAgLyogQ29uZmlndXJlIEFTRXMgZm9yIG5leHQgZGV2aWNlIGluIGdyb3VwICovCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlTmV4dCkgewotICAgICAgICAgIFByZXBhcmVBbmRTZW5kUmVsZWFzZShsZUF1ZGlvRGV2aWNlTmV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLyogTGFzdCBub2RlIGlzIGluIHJlbGVhc2luZyBzdGF0ZSovCi0gICAgICAgICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZCh3YXRjaGRvZ18pKSBhbGFybV9jYW5jZWwod2F0Y2hkb2dfKTsKLQotICAgICAgICAgIGdyb3VwLT5TZXRTdGF0ZShBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKTsKLSAgICAgICAgICAvKiBSZW1vdGUgZGV2aWNlIGhhcyBjYWNoZSBhbmQga2VlcCBzdGF5aW5nIGluIGNvbmZpZ3VyZWQgc3RhdGUgYWZ0ZXIKLSAgICAgICAgICAgKiByZWxlYXNlLiBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGlzIGlzIGEgdGFyZ2V0IHN0YXRlIHJlcXVlc3RlZCBieQotICAgICAgICAgICAqIHJlbW90ZSBkZXZpY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgZ3JvdXAtPlNldFRhcmdldFN0YXRlKGdyb3VwLT5HZXRTdGF0ZSgpKTsKLSAgICAgICAgICBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18tPlN0YXR1c1JlcG9ydENiKGdyb3VwLT5ncm91cF9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cFN0cmVhbVN0YXR1czo6SURMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiwgZnJvbTogIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oYXNlLT5zdGF0ZSkgPDwgIiwgdG86ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgICBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCk7Ci0gICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NRb3NDb25maWd1cmVkKAotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfcnNwX2hkciYgYXJoLCBzdHJ1Y3QgYXNlKiBhc2UsCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgaWYgKCFncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBsZUF1ZGlvRGV2aWNlIGRvZXNuJ3QgYmVsb25nIHRvIGFueSBncm91cCI7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFzZS0+c3RhdGUpIHsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRDogewotICAgICAgICBhc2UtPnN0YXRlID0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQ7Ci0KLSAgICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlLT5IYXZlQWxsQWN0aXZlQXNlc1NhbWVTdGF0ZSgKLSAgICAgICAgICAgICAgICBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCkpIHsKLSAgICAgICAgICAvKiBNb3JlIEFTRXMgbm90aWZpY2F0aW9uIGZyb20gdGhpcyBkZXZpY2UgaGFzIHRvIGNvbWUgZm9yIHRoaXMgZ3JvdXAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICAgICAgLyogV2UgYXJlIGhlcmUgYmVjYXVzZSBvZiB0aGUgcmVjb25uZWN0aW9uIG9mIHRoZSBzaW5nbGUgZGV2aWNlLiAqLwotICAgICAgICAgIFByZXBhcmVBbmRTZW5kRW5hYmxlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2VOZXh0ID0KLSAgICAgICAgICAgIGdyb3VwLT5HZXROZXh0QWN0aXZlRGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotCi0gICAgICAgIC8qIENvbmZpZ3VyZSBBU0VzIHFvcyBmb3IgbmV4dCBkZXZpY2UgaW4gZ3JvdXAgKi8KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2VOZXh0KSB7Ci0gICAgICAgICAgUHJlcGFyZUFuZFNlbmRDb25maWdRb3MoZ3JvdXAsIGxlQXVkaW9EZXZpY2VOZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDaWdDcmVhdGUoZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEOgotICAgICAgICAvKiBUT0RPOiBDb25maWcgQ29kZWMgZXJyb3IvQ29uZmlnIFFvcy9Db25maWcgUW9TIGVycm9yL0VuYWJsZSBlcnJvciAqLwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HOgotICAgICAgICBpZiAoYXNlLT5kaXJlY3Rpb24gPT0gbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSkgewotICAgICAgICAgIC8qIFNvdXJjZSBBU0UgY2Fubm90IGdvIGZyb20gU3RyZWFtaW5nIHRvIFFvUyBDb25maWd1cmVkIHN0YXRlICovCi0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24sIGZyb206ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oYXNlLT5zdGF0ZSkgPDwgIiwgdG86ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpOwotICAgICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzZS0+c3RhdGUgPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRDsKLQotICAgICAgICAvKiBQcm9jZXNzIHRoZSBEaXNhYmxlIFRyYW5zaXRpb24gb2YgdGhlIHJlc3Qgb2YgZ3JvdXAgbWVtYmVycyBpZiBubwotICAgICAgICAgKiBtb3JlIEFTRSBub3RpZmljYXRpb25zIGhhcyB0byBjb21lIGZyb20gdGhpcyBkZXZpY2UuICovCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5Jc1JlYWR5VG9TdXNwZW5kU3RyZWFtKCkpCi0gICAgICAgICAgUHJvY2Vzc0dyb3VwRGlzYWJsZShncm91cCwgbGVBdWRpb0RldmljZSk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRElTQUJMSU5HOiB7Ci0gICAgICAgIGFzZS0+c3RhdGUgPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRDsKLQotICAgICAgICAvKiBNb3JlIEFTRXMgbm90aWZpY2F0aW9uIGZyb20gdGhpcyBkZXZpY2UgaGFzIHRvIGNvbWUgZm9yIHRoaXMgZ3JvdXAgKi8KLSAgICAgICAgaWYgKCFncm91cC0+SGF2ZUFsbEFjdGl2ZURldmljZXNBc2VzVGhlU2FtZVN0YXRlKAotICAgICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKTsKLQotICAgICAgICBpZiAoIWdyb3VwLT5IYXZlQWxsQWN0aXZlRGV2aWNlc0Npc0Rpc2MoKSkgcmV0dXJuOwotCi0gICAgICAgIGlmIChncm91cC0+R2V0VGFyZ2V0U3RhdGUoKSA9PQotICAgICAgICAgICAgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgICAvKiBObyBtb3JlIHRyYW5zaXRpb24gZm9yIGdyb3VwICovCi0gICAgICAgICAgYWxhcm1fY2FuY2VsKHdhdGNoZG9nXyk7Ci0KLSAgICAgICAgICBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18tPlN0YXR1c1JlcG9ydENiKAotICAgICAgICAgICAgICBncm91cC0+Z3JvdXBfaWRfLCBHcm91cFN0cmVhbVN0YXR1czo6U1VTUEVOREVEKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiwgZnJvbTogIgotICAgICAgICAgICAgICAgICAgICAgPDwgZ3JvdXAtPkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHRvOiAiIDw8IGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpOwotICAgICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uLCBmcm9tOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pihhc2UtPnN0YXRlKSA8PCAiLCB0bzogIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKTsKLSAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUHJlcGFyZUFuZFNlbmRFbmFibGUoTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6Y3RwX2VuYWJsZSBjb25mOwotICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6Y3RwX2VuYWJsZT4gY29uZnM7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgc3RydWN0IGFzZSogYXNlOwotCi0gICAgYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsKLSAgICBMT0dfQVNTRVJUKGFzZSkgPDwgX19mdW5jX18gPDwgIiBzaG91bGRuJ3QgYmUgY2FsbGVkIHdpdGhvdXQgYW4gYWN0aXZlIEFTRSI7Ci0gICAgZG8gewotICAgICAgY29uZi5hc2VfaWQgPSBhc2UtPmlkOwotICAgICAgY29uZi5tZXRhZGF0YSA9IGFzZS0+bWV0YWRhdGE7Ci0gICAgICBjb25mcy5wdXNoX2JhY2soY29uZik7Ci0gICAgfSB3aGlsZSAoKGFzZSA9IGxlQXVkaW9EZXZpY2UtPkdldE5leHRBY3RpdmVBc2UoYXNlKSkpOwotCi0gICAgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OlByZXBhcmVBc2VDdHBFbmFibGUoY29uZnMsIHZhbHVlKTsKLQotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgTlVMTCwgTlVMTCk7Ci0gIH0KLQotICB2b2lkIFByZXBhcmVBbmRTZW5kRGlzYWJsZShMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgYXNlKiBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOwotICAgIExPR19BU1NFUlQoYXNlKSA8PCBfX2Z1bmNfXyA8PCAiIHNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgQVNFIjsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlkczsKLSAgICBkbyB7Ci0gICAgICBpZHMucHVzaF9iYWNrKGFzZS0+aWQpOwotICAgIH0gd2hpbGUgKChhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpQcmVwYXJlQXNlQ3RwRGlzYWJsZShpZHMsIHZhbHVlKTsKLQotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgTlVMTCwgTlVMTCk7Ci0gIH0KLQotICB2b2lkIFByZXBhcmVBbmRTZW5kUmVsZWFzZShMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgYXNlKiBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOwotICAgIExPR19BU1NFUlQoYXNlKSA8PCBfX2Z1bmNfXyA8PCAiIHNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgQVNFIjsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlkczsKLSAgICBkbyB7Ci0gICAgICBpZHMucHVzaF9iYWNrKGFzZS0+aWQpOwotICAgIH0gd2hpbGUgKChhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpQcmVwYXJlQXNlQ3RwUmVsZWFzZShpZHMsIHZhbHVlKTsKLQotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgTlVMTCwgTlVMTCk7Ci0gIH0KLQotICB2b2lkIFByZXBhcmVBbmRTZW5kQ29uZmlnUW9zKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSkgewotICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6Y3RwX3Fvc19jb25mPiBjb25mczsKLQotICAgIGZvciAoc3RydWN0IGFzZSogYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsgYXNlICE9IG51bGxwdHI7Ci0gICAgICAgICBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXROZXh0QWN0aXZlQXNlKGFzZSkpIHsKLSAgICAgIC8qIEdldCBjb21wbGV0aXZlICh0byBiZSBiaS1kaXJlY3Rpb25hbCBDSVMpIENJUyBJRCBmb3IgQVNFICovCi0gICAgICB1aW50OF90IGNpc19pZCA9IGxlQXVkaW9EZXZpY2UtPkdldE1hdGNoaW5nQmlkaXJlY3Rpb25DaXNJZChhc2UpOwotICAgICAgaWYgKGNpc19pZCA9PSBsZV9hdWRpbzo6a0ludmFsaWRDaXNJZCkgewotICAgICAgICAvKiBHZXQgbmV4dCBmcmVlIENJUyBJRCBmb3IgZ3JvdXAgKi8KLSAgICAgICAgY2lzX2lkID0gZ3JvdXAtPkdldEZpcnN0RnJlZUNpc0lkKCk7Ci0gICAgICAgIGlmIChjaXNfaWQgPT0gbGVfYXVkaW86OmtJbnZhbGlkQ2lzSWQpIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGZhaWxlZCB0byBnZXQgZnJlZSBDSVMgSUQiOwotICAgICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhc2UtPmNpc19pZCA9IGNpc19pZDsKLQotICAgICAgLyogVE9ETzogQ29uZmlndXJlIGZpcnN0IEFTRSBxb3MgYWNjb3JkaW5nIHRvIGNvbnRleHQgdHlwZSAqLwotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpjdHBfcW9zX2NvbmYgY29uZjsKLSAgICAgIGNvbmYuYXNlX2lkID0gYXNlLT5pZDsKLSAgICAgIGNvbmYuY2lnID0gZ3JvdXAtPmdyb3VwX2lkXzsKLSAgICAgIGNvbmYuY2lzID0gYXNlLT5jaXNfaWQ7Ci0gICAgICBjb25mLmZyYW1pbmcgPSBncm91cC0+R2V0RnJhbWluZygpOwotICAgICAgY29uZi5waHkgPSBncm91cC0+R2V0UGh5Qml0bWFzayhhc2UtPmRpcmVjdGlvbik7Ci0gICAgICBjb25mLm1heF9zZHUgPSBhc2UtPm1heF9zZHVfc2l6ZTsKLSAgICAgIGNvbmYucmV0cmFuc19uYiA9IGFzZS0+cmV0cmFuc19uYjsKLSAgICAgIGlmICghZ3JvdXAtPkdldFByZXNlbnRhdGlvbkRlbGF5KCZjb25mLnByZXNfZGVsYXksIGFzZS0+ZGlyZWN0aW9uKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGluY29uc2lzdGVudCBwcmVzZW50YXRpb24gZGVsYXkgZm9yIGdyb3VwIjsKLSAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY29uZi5zZHVfaW50ZXJ2YWwgPSBncm91cC0+R2V0U2R1SW50ZXJ2YWwoYXNlLT5kaXJlY3Rpb24pOwotICAgICAgaWYgKCFjb25mLnNkdV9pbnRlcnZhbCkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHVuc3VwcG9ydGVkIFNEVSBpbnRlcnZhbCBmb3IgZ3JvdXAiOwotICAgICAgICBTdG9wU3RyZWFtKGdyb3VwKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoYXNlLT5kaXJlY3Rpb24gPT0gbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspIHsKLSAgICAgICAgY29uZi5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPSBncm91cC0+R2V0TWF4VHJhbnNwb3J0TGF0ZW5jeU10b3MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbmYubWF4X3RyYW5zcG9ydF9sYXRlbmN5ID0gZ3JvdXAtPkdldE1heFRyYW5zcG9ydExhdGVuY3lTdG9tKCk7Ci0gICAgICB9Ci0gICAgICBjb25mcy5wdXNoX2JhY2soY29uZik7Ci0gICAgfQotCi0gICAgTE9HX0FTU0VSVChjb25mcy5zaXplKCkgPiAwKQotICAgICAgICA8PCBfX2Z1bmNfXyA8PCAiIHNob3VsZG4ndCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgQVNFIjsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgIGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjpQcmVwYXJlQXNlQ3RwQ29uZmlnUW9zKGNvbmZzLCB2YWx1ZSk7Ci0KLSAgICBCdGFHYXR0UXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMobGVBdWRpb0RldmljZS0+Y29ubl9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIE5VTEwsIE5VTEwpOwotICB9Ci0KLSAgdm9pZCBQcmVwYXJlQW5kU2VuZFVwZGF0ZU1ldGFkYXRhKAotICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgIGxlX2F1ZGlvOjp0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgewotICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6Y3RwX3VwZGF0ZV9tZXRhZGF0YT4KLSAgICAgICAgY29uZnM7Ci0KLSAgICBmb3IgKDsgbGVBdWRpb0RldmljZTsKLSAgICAgICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShsZUF1ZGlvRGV2aWNlKSkgewotICAgICAgaWYgKCFsZUF1ZGlvRGV2aWNlLT5Jc01ldGFkYXRhQ2hhbmdlZChjb250ZXh0X3R5cGUpKSBjb250aW51ZTsKLQotICAgICAgYXV0byBuZXdfbWV0YWRhdGEgPSBsZUF1ZGlvRGV2aWNlLT5HZXRNZXRhZGF0YShjb250ZXh0X3R5cGUpOwotCi0gICAgICAvKiBSZXF1ZXN0IHNlcnZlciB0byB1cGRhdGUgQVNFcyB3aXRoIG5ldyBtZXRhZGF0YSAqLwotICAgICAgZm9yIChzdHJ1Y3QgYXNlKiBhc2UgPSBsZUF1ZGlvRGV2aWNlLT5HZXRGaXJzdEFjdGl2ZUFzZSgpOyBhc2UgIT0gbnVsbHB0cjsKLSAgICAgICAgICAgYXNlID0gbGVBdWRpb0RldmljZS0+R2V0TmV4dEFjdGl2ZUFzZShhc2UpKSB7Ci0gICAgICAgIHN0cnVjdCBsZV9hdWRpbzo6Y2xpZW50X3BhcnNlcjo6YXNjczo6Y3RwX3VwZGF0ZV9tZXRhZGF0YSBjb25mOwotCi0gICAgICAgIGNvbmYuYXNlX2lkID0gYXNlLT5pZDsKLSAgICAgICAgY29uZi5tZXRhZGF0YSA9IG5ld19tZXRhZGF0YTsKLQotICAgICAgICBjb25mcy5wdXNoX2JhY2soY29uZik7Ci0gICAgICB9Ci0KLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgICAgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OlByZXBhcmVBc2VDdHBVcGRhdGVNZXRhZGF0YShjb25mcywgdmFsdWUpOwotCi0gICAgICBCdGFHYXR0UXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMobGVBdWRpb0RldmljZS0+Y29ubl9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfTk9fUlNQLCBOVUxMLCBOVUxMKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHZvaWQgQXNlU3RhdGVNYWNoaW5lUHJvY2Vzc0VuYWJsaW5nKAotICAgICAgc3RydWN0IGxlX2F1ZGlvOjpjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfcnNwX2hkciYgYXJoLCBzdHJ1Y3QgYXNlKiBhc2UsCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgaWYgKCFncm91cCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBsZUF1ZGlvRGV2aWNlIGRvZXNuJ3QgYmVsb25nIHRvIGFueSBncm91cCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGdyb3VwLT5HZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgLyogV2UgYXJlIGhlcmUgYmVjYXVzZSBvZiB0aGUgcmVjb25uZWN0aW9uIG9mIHRoZSBzaW5nbGUgZGV2aWNlLiAqLwotICAgICAgQ2lzQ3JlYXRlRm9yRGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoYXNlLT5zdGF0ZSkgewotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRDoKLSAgICAgICAgYXNlLT5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0VOQUJMSU5HOwotCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5Jc1JlYWR5VG9DcmVhdGVTdHJlYW0oKSkKLSAgICAgICAgICBQcm9jZXNzR3JvdXBFbmFibGUoZ3JvdXAsIGxlQXVkaW9EZXZpY2UpOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0VOQUJMSU5HOgotICAgICAgICAvKiBFbmFibGUvU3dpdGNoIENvbnRlbnQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiwgZnJvbTogIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oYXNlLT5zdGF0ZSkgPDwgIiwgdG86ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgICBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9FTkFCTElORyk7Ci0gICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NTdHJlYW1pbmcoCi0gICAgICBzdHJ1Y3QgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9yc3BfaGRyJiBhcmgsIHN0cnVjdCBhc2UqIGFzZSwKLSAgICAgIHVpbnQ4X3QqIGRhdGEsIHVpbnQxNl90IGxlbiwgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGxlQXVkaW9EZXZpY2UgZG9lc24ndCBiZWxvbmcgdG8gYW55IGdyb3VwIjsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoYXNlLT5zdGF0ZSkgewotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRDoKLSAgICAgICAgLyogQXMgcGVyIEFTQ1MgMS4wIDoKLSAgICAgICAgICogSWYgYSBDSVMgaGFzIGJlZW4gZXN0YWJsaXNoZWQgYW5kIHRoZSBzZXJ2ZXIgaXMgYWN0aW5nIGFzIEF1ZGlvIFNpbmsKLSAgICAgICAgICogZm9yIHRoZSBBU0UsIGFuZCBpZiB0aGUgc2VydmVyIGlzIHJlYWR5IHRvIHJlY2VpdmUgYXVkaW8gZGF0YQotICAgICAgICAgKiB0cmFuc21pdHRlZCBieSB0aGUgY2xpZW50LCB0aGUgc2VydmVyIG1heSBhdXRvbm9tb3VzbHkgaW5pdGlhdGUgdGhlCi0gICAgICAgICAqIFJlY2VpdmVyIFN0YXJ0IFJlYWR5LCBhcyBkZWZpbmVkIGluIFNlY3Rpb24gNS40LCB3aXRob3V0IGZpcnN0Ci0gICAgICAgICAqIHNlbmRpbmcgYSBub3RpZmljYXRpb24gb2YgdGhlIEFTRSBjaGFyYWN0ZXJpc3RpYyB2YWx1ZSBpbiB0aGUKLSAgICAgICAgICogRW5hYmxpbmcgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYXNlLT5kaXJlY3Rpb24gIT0gbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiwgZnJvbTogIgotICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pihhc2UtPnN0YXRlKSA8PCAiLCB0bzogIgotICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotICAgICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFzZS0+c3RhdGUgPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkc7Ci0KLSAgICAgICAgaWYgKGdyb3VwLT5HZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgICAgIC8qIFdlIGFyZSBoZXJlIGJlY2F1c2Ugb2YgdGhlIHJlY29ubmVjdGlvbiBvZiB0aGUgc2luZ2xlIGRldmljZS4gKi8KLSAgICAgICAgICBDaXNDcmVhdGVGb3JEZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlQXVkaW9EZXZpY2UtPklzUmVhZHlUb0NyZWF0ZVN0cmVhbSgpKQotICAgICAgICAgIFByb2Nlc3NHcm91cEVuYWJsZShncm91cCwgbGVBdWRpb0RldmljZSk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRU5BQkxJTkc6IHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0KLSAgICAgICAgYXNlLT5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORzsKLQotICAgICAgICBpZiAoZ3JvdXAtPkdldFN0YXRlKCkgPT0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICAgICAgLyogV2UgYXJlIGhlcmUgYmVjYXVzZSBvZiB0aGUgcmVjb25uZWN0aW9uIG9mIHRoZSBzaW5nbGUgZGV2aWNlLiAqLwotICAgICAgICAgIGF1dG8qIHN0cmVhbV9jb25mID0gJmdyb3VwLT5zdHJlYW1fY29uZjsKLSAgICAgICAgICBpZiAoYXNlLT5kaXJlY3Rpb24gPT0gbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNvdXJjZSkgewotICAgICAgICAgICAgc3RyZWFtX2NvbmYtPnNvdXJjZV9zdHJlYW1zLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICBhc2UtPmNpc19jb25uX2hkbCwgYXNlLT5jb2RlY19jb25maWcuYXVkaW9fY2hhbm5lbF9hbGxvY2F0aW9uKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmVhbV9jb25mLT5zaW5rX3N0cmVhbXMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFzZS0+Y2lzX2Nvbm5faGRsLCBhc2UtPmNvZGVjX2NvbmZpZy5hdWRpb19jaGFubmVsX2FsbG9jYXRpb24pKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWdyb3VwLT5IYXZlQWxsQWN0aXZlRGV2aWNlc0FzZXNUaGVTYW1lU3RhdGUoCi0gICAgICAgICAgICAgICAgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKSkgewotICAgICAgICAgIC8qIE1vcmUgQVNFcyBub3RpZmljYXRpb24gZm9ybSB0aGlzIGRldmljZSBoYXMgdG8gY29tZSBmb3IgdGhpcyBncm91cAotICAgICAgICAgICAqLwotCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdyb3VwLT5HZXRTdGF0ZSgpID09IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgICAgIC8qIFdlIGFyZSBoZXJlIGJlY2F1c2Ugb2YgdGhlIHJlY29ubmVjdGlvbiBvZiB0aGUgc2luZ2xlIGRldmljZS4gKi8KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBMYXN0IG5vZGUgaXMgaW4gc3RyZWFtaW5nIHN0YXRlICovCi0gICAgICAgIGdyb3VwLT5TZXRTdGF0ZShBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gICAgICAgIC8qIE5vdCBhbGwgQ0lTZXMgZXN0YWJsaXNoIGV2ZW5zIGNhbWUgKi8KLSAgICAgICAgaWYgKCFncm91cC0+SXNHcm91cFN0cmVhbVJlYWR5KCkpIHJldHVybjsKLQotICAgICAgICBpZiAoZ3JvdXAtPkdldFRhcmdldFN0YXRlKCkgPT0KLSAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgICAgIC8qIE5vIG1vcmUgdHJhbnNpdGlvbiBmb3IgZ3JvdXAgKi8KLSAgICAgICAgICBhbGFybV9jYW5jZWwod2F0Y2hkb2dfKTsKLSAgICAgICAgICBQcmVwYXJlRGF0YVBhdGgoZ3JvdXApOwotCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uLCBmcm9tOiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBncm91cC0+R2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIiwgdG86ICIgPDwgZ3JvdXAtPkdldFRhcmdldFN0YXRlKCk7Ci0gICAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORzogewotICAgICAgICBzdHJ1Y3QgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV90cmFuc2llbnRfc3RhdGVfcGFyYW1zIHJzcDsKLQotICAgICAgICBpZiAoIVBhcnNlQXNlU3RhdHVzVHJhbnNpZW50U3RhdGVQYXJhbXMocnNwLCBsZW4sIGRhdGEpKSB7Ci0gICAgICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FjaGUgY3VycmVudCBzZXQgdXAgbWV0YWRhdGEgdmFsdWVzIGZvciBmb3IgZnVydGhlciBwb3NzaWJsZQotICAgICAgICAgKiByZWNvbmZpZ3VyYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoc3RydWN0IGFzZSogYXNlID0gbGVBdWRpb0RldmljZS0+R2V0Rmlyc3RBY3RpdmVBc2UoKTsKLSAgICAgICAgICAgICBhc2UgIT0gbnVsbHB0cjsgYXNlID0gbGVBdWRpb0RldmljZS0+R2V0TmV4dEFjdGl2ZUFzZShhc2UpKSB7Ci0gICAgICAgICAgYXNlLT5tZXRhZGF0YSA9IHJzcC5tZXRhZGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIFByZXBhcmVBbmRTZW5kVXBkYXRlTWV0YWRhdGEoZ3JvdXAsIGxlQXVkaW9EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAtPkdldENvbnRleHRUeXBlKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uLCBmcm9tOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pihhc2UtPnN0YXRlKSA8PCAiLCB0bzogIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORyk7Ci0gICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NEaXNhYmxpbmcoCi0gICAgICBzdHJ1Y3QgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9yc3BfaGRyJiBhcmgsIHN0cnVjdCBhc2UqIGFzZSwKLSAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGxlQXVkaW9EZXZpY2UgZG9lc24ndCBiZWxvbmcgdG8gYW55IGdyb3VwIjsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhc2UtPmRpcmVjdGlvbiA9PSBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU2luaykgewotICAgICAgLyogU2luayBBU0Ugc3RhdGUgbWFjaGluZSBkb2VzIG5vdCBoYXZlIERpc2FibGluZyBzdGF0ZSAqLwotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiLCBpbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24sIGZyb206ICIgPDwgZ3JvdXAtPkdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgdG86ICIgPDwgZ3JvdXAtPkdldFRhcmdldFN0YXRlKCk7Ci0gICAgICBTdG9wU3RyZWFtKGdyb3VwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFzZS0+c3RhdGUpIHsKLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRU5BQkxJTkc6Ci0gICAgICAgIC8qIFRPRE86IERpc2FibGUgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORzoKLSAgICAgICAgYXNlLT5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0RJU0FCTElORzsKLQotICAgICAgICAvKiBQcm9jZXNzIHRoZSBEaXNhYmxlIFRyYW5zaXRpb24gb2YgdGhlIHJlc3Qgb2YgZ3JvdXAgbWVtYmVycyBpZiBubwotICAgICAgICAgKiBtb3JlIEFTRSBub3RpZmljYXRpb25zIGhhcyB0byBjb21lIGZyb20gdGhpcyBkZXZpY2UuICovCi0gICAgICAgIGlmIChsZUF1ZGlvRGV2aWNlLT5Jc1JlYWR5VG9TdXNwZW5kU3RyZWFtKCkpCi0gICAgICAgICAgUHJvY2Vzc0dyb3VwRGlzYWJsZShncm91cCwgbGVBdWRpb0RldmljZSk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiwgaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uLCBmcm9tOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pihhc2UtPnN0YXRlKSA8PCAiLCB0bzogIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0RJU0FCTElORyk7Ci0gICAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEFzZVN0YXRlTWFjaGluZVByb2Nlc3NSZWxlYXNpbmcoCi0gICAgICBzdHJ1Y3QgbGVfYXVkaW86OmNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9yc3BfaGRyJiBhcmgsIHN0cnVjdCBhc2UqIGFzZSwKLSAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBpZiAoIWdyb3VwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIGxlQXVkaW9EZXZpY2UgZG9lc24ndCBiZWxvbmcgdG8gYW55IGdyb3VwIjsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoYXNlLT5zdGF0ZSkgewotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEOgotICAgICAgY2FzZSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9ESVNBQkxJTkc6IHsKLSAgICAgICAgYXNlLT5zdGF0ZSA9IEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1JFTEVBU0lORzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEOgotICAgICAgICAvKiBBdCB0aGlzIHBvaW50IGFsbCBvZiB0aGUgYWN0aXZlIEFTRXMgd2l0aGluIGdyb3VwIGFyZSByZWxlYXNlZC4gKi8KLSAgICAgICAgaWYgKGdyb3VwLT5jaWdfY3JlYXRlZF8pCi0gICAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlQ2lnKGdyb3VwLT5ncm91cF9pZF8pOwotCi0gICAgICAgIGFzZS0+c3RhdGUgPSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9SRUxFQVNJTkc7Ci0gICAgICAgIGlmIChncm91cC0+SGF2ZUFsbEFjdGl2ZURldmljZXNBc2VzVGhlU2FtZVN0YXRlKAotICAgICAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1JFTEVBU0lORykpCi0gICAgICAgICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1JFTEVBU0lORyk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRU5BQkxJTkc6Ci0gICAgICBjYXNlIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORzogewotICAgICAgICBhc2UtPnN0YXRlID0gQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUkVMRUFTSU5HOwotCi0gICAgICAgIC8qIFNpbmNlIHNpbmdsZSBhc2UgZ2V0cyBpbnRvIFJlbGVhc2luZyBzdGF0ZSwgbGV0cyBhc3N1bWUgb3VyIG5ldwotICAgICAgICAgKiB0YXJnZXQgc3RhdGUgaXMgSURMRQotICAgICAgICAgKi8KLSAgICAgICAgU2V0VGFyZ2V0U3RhdGUoZ3JvdXAsIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpOwotCi0gICAgICAgIC8qIEhhcHBlbnMgd2hlbiBiaS1kaXJlY3Rpb25hbCBjb21wbGV0aXZlIEFTRSByZWxlYXNpbmcgc3RhdGUgY2FtZSAqLwotICAgICAgICBpZiAoYXNlLT5kYXRhX3BhdGhfc3RhdGUgPT0gQXVkaW9TdHJlYW1EYXRhUGF0aFN0YXRlOjpDSVNfRElTQ09OTkVDVElORykKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoYXNlLT5kYXRhX3BhdGhfc3RhdGUgPT0KLSAgICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6REFUQV9QQVRIX0VTVEFCTElTSEVEKSB7Ci0gICAgICAgICAgYXV0byBhc2VzX3BhaXIgPQotICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5HZXRBc2VzQnlDaXNDb25uSGRsKGFzZS0+Y2lzX2Nvbm5faGRsKTsKLSAgICAgICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVJc29EYXRhUGF0aCgKLSAgICAgICAgICAgICAgYXNlLT5jaXNfY29ubl9oZGwsCi0gICAgICAgICAgICAgIChhc2VzX3BhaXIuc2luawotICAgICAgICAgICAgICAgICAgID8gYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRGF0YVBhdGhEaXJlY3Rpb25PdXQKLSAgICAgICAgICAgICAgICAgICA6IDB4MDApIHwKLSAgICAgICAgICAgICAgICAgIChhc2VzX3BhaXIuc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgID8gYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRGF0YVBhdGhEaXJlY3Rpb25JbgotICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDApKTsKLSAgICAgICAgfSBlbHNlIGlmIChhc2UtPmRhdGFfcGF0aF9zdGF0ZSA9PQotICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbURhdGFQYXRoU3RhdGU6OkNJU19FU1RBQkxJU0hFRCB8fAotICAgICAgICAgICAgICAgICAgIGFzZS0+ZGF0YV9wYXRoX3N0YXRlID09Ci0gICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtRGF0YVBhdGhTdGF0ZTo6Q0lTX1BFTkRJTkcpIHsKLSAgICAgICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5EaXNjb25uZWN0Q2lzKGFzZS0+Y2lzX2Nvbm5faGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VSUl9QRUVSX1VTRVIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiwgTm90aGluZyB0byBkbyBhc2UgZGF0YSBwYXRoIHN0YXRlOiAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oYXNlLT5kYXRhX3BhdGhfc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiLCBpbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24sIGZyb206ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGFzZS0+c3RhdGUpIDw8ICIsIHRvOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfUkVMRUFTSU5HKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBQcm9jZXNzR3JvdXBFbmFibGUoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwgTGVBdWRpb0RldmljZSogZGV2aWNlKSB7Ci0gICAgLyogRW5hYmxlIEFTRXMgZm9yIG5leHQgZGV2aWNlIGluIGdyb3VwLiAqLwotICAgIExlQXVkaW9EZXZpY2UqIGRldmljZU5leHQgPSBncm91cC0+R2V0TmV4dEFjdGl2ZURldmljZShkZXZpY2UpOwotICAgIGlmIChkZXZpY2VOZXh0KSB7Ci0gICAgICBQcmVwYXJlQW5kU2VuZEVuYWJsZShkZXZpY2VOZXh0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50IGFsbCBvZiB0aGUgYWN0aXZlIEFTRXMgd2l0aGluIGdyb3VwIGFyZSBlbmFibGVkLiBUaGUgc2VydmVyCi0gICAgICogbWlnaHQgcGVyZm9ybSBhdXRvbm9tb3VzIHN0YXRlIHRyYW5zaXRpb24gZm9yIFNpbmsgQVNFIGFuZCBza2lwIEVuYWJsaW5nCi0gICAgICogc3RhdGUgbm90aWZpY2F0aW9uIGFuZCB0cmFuc2l0IHRvIFN0cmVhbWluZyBkaXJlY3RseS4gU28gY2hlY2sgdGhlIGdyb3VwCi0gICAgICogc3RhdGUsIGJlY2F1c2Ugd2UgbWlnaHQgYmUgcmVhZHkgdG8gY3JlYXRlIENJUy4gKi8KLSAgICBpZiAoZ3JvdXAtPkhhdmVBbGxBY3RpdmVEZXZpY2VzQXNlc1RoZVNhbWVTdGF0ZSgKLSAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORykpIHsKLSAgICAgIGdyb3VwLT5TZXRTdGF0ZShBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncm91cC0+U2V0U3RhdGUoQXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfRU5BQkxJTkcpOwotICAgIH0KLQotICAgIGlmIChncm91cC0+R2V0VGFyZ2V0U3RhdGUoKSA9PSBBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpIHsKLSAgICAgIENpc0NyZWF0ZShncm91cCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiwgaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uLCBmcm9tOiAiIDw8IGdyb3VwLT5HZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIsIHRvOiAiIDw8IGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpOwotICAgICAgU3RvcFN0cmVhbShncm91cCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBQcm9jZXNzR3JvdXBEaXNhYmxlKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIExlQXVkaW9EZXZpY2UqIGRldmljZSkgewotICAgIC8qIERpc2FibGUgQVNFcyBmb3IgbmV4dCBkZXZpY2UgaW4gZ3JvdXAuICovCi0gICAgTGVBdWRpb0RldmljZSogZGV2aWNlTmV4dCA9IGdyb3VwLT5HZXROZXh0QWN0aXZlRGV2aWNlKGRldmljZSk7Ci0gICAgaWYgKGRldmljZU5leHQpIHsKLSAgICAgIFByZXBhcmVBbmRTZW5kRGlzYWJsZShkZXZpY2VOZXh0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50IGFsbCBvZiB0aGUgYWN0aXZlIEFTRXMgd2l0aGluIGdyb3VwIGFyZSBkaXNhYmxlZC4gQXMgdGhlcmUKLSAgICAgKiBpcyBubyBEaXNhYmxpbmcgc3RhdGUgZm9yIFNpbmsgQVNFLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBhbGwgb2YgdGhlCi0gICAgICogYWN0aXZlIEFTRXMgYXJlIFNpbmsgQVNFIGFuZCB3aWxsIHRyYW5zaXQgdG8gUW9TIHN0YXRlLiBTbyBjaGVjawotICAgICAqIHRoZSBncm91cCBzdGF0ZSwgYmVjYXVzZSB3ZSBtaWdodCBiZSByZWFkeSB0byByZWxlYXNlIGRhdGEgcGF0aC4gKi8KLSAgICBpZiAoZ3JvdXAtPkhhdmVBbGxBY3RpdmVEZXZpY2VzQXNlc1RoZVNhbWVTdGF0ZSgKLSAgICAgICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKSkgewotICAgICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKTsKLSAgICB9IGVsc2UgewotICAgICAgZ3JvdXAtPlNldFN0YXRlKEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0RJU0FCTElORyk7Ci0gICAgfQotCi0gICAgLyogVHJhbnNpdGlvbiB0byBRb1MgY29uZmlndXJlZCBpcyBkb25lIGJ5IENJUyBkaXNjb25uZWN0aW9uICovCi0gICAgaWYgKGdyb3VwLT5HZXRUYXJnZXRTdGF0ZSgpID09Ci0gICAgICAgIEFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKSB7Ci0gICAgICBSZWxlYXNlRGF0YVBhdGgoZ3JvdXApOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIsIGludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiwgZnJvbTogIiA8PCBncm91cC0+R2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICA8PCAiLCB0bzogIiA8PCBncm91cC0+R2V0VGFyZ2V0U3RhdGUoKTsKLSAgICAgIFN0b3BTdHJlYW0oZ3JvdXApOwotICAgIH0KLSAgfQotfTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgbGVfYXVkaW8gewotdm9pZCBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkluaXRpYWxpemUoQ2FsbGJhY2tzKiBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18pIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5zdGFuY2UgPSBuZXcgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lSW1wbChzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrc18pOwotfQotCi12b2lkIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6Q2xlYW51cCgpIHsKLSAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotCi0gIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZUltcGwqIHB0ciA9IGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0KLSAgZGVsZXRlIHB0cjsKLX0KLQotTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lKiBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpIHsKLSAgQ0hFQ0soaW5zdGFuY2UpOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9zdGF0ZV9tYWNoaW5lLmggYi9idGEvbGVfYXVkaW8vc3RhdGVfbWFjaGluZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM2NWU4Li4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9zdGF0ZV9tYWNoaW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0bV9pc29fYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2lzb19hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvYnRfbGVfYXVkaW8uaCIKLSNpbmNsdWRlICJsZV9hdWRpb190eXBlcy5oIgotCi1uYW1lc3BhY2UgbGVfYXVkaW8gewotCi0vKiBTdGF0ZSBtYWNoaW5lIGludGVyZmFjZSAqLwotY2xhc3MgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lIHsKLSBwdWJsaWM6Ci0gIGNsYXNzIENhbGxiYWNrcyB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+Q2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB2b2lkIFN0YXR1c1JlcG9ydENiKAotICAgICAgICBpbnQgZ3JvdXBfaWQsIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzIHN0YXR1cykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPblN0YXRlVHJhbnNpdGlvblRpbWVvdXQoaW50IGdyb3VwX2lkKSA9IDA7Ci0gIH07Ci0KLSAgdmlydHVhbCB+TGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoQ2FsbGJhY2tzKiBzdGF0ZV9tYWNoaW5lX2NhbGxiYWNrcyk7Ci0gIHN0YXRpYyB2b2lkIENsZWFudXAodm9pZCk7Ci0gIHN0YXRpYyBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmUqIEdldCh2b2lkKTsKLQotICB2aXJ0dWFsIGJvb2wgQXR0YWNoVG9TdHJlYW0oTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpID0gMDsKLSAgdmlydHVhbCBib29sIFN0YXJ0U3RyZWFtKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlIGNvbnRleHRfdHlwZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU3VzcGVuZFN0cmVhbShMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wU3RyZWFtKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXApID0gMDsKLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NHYXR0Tm90aWZFdmVudCh1aW50OF90KiB2YWx1ZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0eXBlczo6YXNlKiBhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NIY2lOb3RpZk9uQ2lnQ3JlYXRlKAotICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgY2lnX2lkLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvbm5faGFuZGxlcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgUHJvY2Vzc0hjaU5vdGlmT25DaWdSZW1vdmUodWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBQcm9jZXNzSGNpTm90aWZDaXNFc3RhYmxpc2hlZCgKLSAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UsCi0gICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfY21wbF9ldnQqIGV2ZW50KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBQcm9jZXNzSGNpTm90aWZDaXNEaXNjb25uZWN0ZWQoCi0gICAgICBMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLCBMZUF1ZGlvRGV2aWNlKiBsZUF1ZGlvRGV2aWNlLAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZGlzY29ubmVjdGVkX2V2dCogZXZlbnQpID0gMDsKLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NIY2lOb3RpZlNldHVwSXNvRGF0YVBhdGgoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faGRsKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBQcm9jZXNzSGNpTm90aWZSZW1vdmVJc29EYXRhUGF0aChMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZSogbGVBdWRpb0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9oZGwpID0gMDsKLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NIY2lOb3RpZklzb0xpbmtRdWFsaXR5UmVhZCgKLSAgICAgIExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UsCi0gICAgICB1aW50OF90IGNvbm5faGFuZGxlLCB1aW50MzJfdCB0eFVuYWNrZWRQYWNrZXRzLCB1aW50MzJfdCB0eEZsdXNoZWRQYWNrZXRzLAotICAgICAgdWludDMyX3QgdHhMYXN0U3ViZXZlbnRQYWNrZXRzLCB1aW50MzJfdCByZXRyYW5zbWl0dGVkUGFja2V0cywKLSAgICAgIHVpbnQzMl90IGNyY0Vycm9yUGFja2V0cywgdWludDMyX3QgcnhVbnJlY2VpdmVkUGFja2V0cywKLSAgICAgIHVpbnQzMl90IGR1cGxpY2F0ZVBhY2tldHMpID0gMDsKLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NIY2lOb3RpZkFjbERpc2Nvbm5lY3RlZChMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQXVkaW9EZXZpY2UqIGxlQXVkaW9EZXZpY2UpID0gMDsKLX07Ci19ICAvLyBuYW1lc3BhY2UgbGVfYXVkaW8KZGlmZiAtLWdpdCBhL2J0YS9sZV9hdWRpby9zdGF0ZV9tYWNoaW5lX3Rlc3QuY2MgYi9idGEvbGVfYXVkaW8vc3RhdGVfbWFjaGluZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQzMzliLi4wMDAwMDAwCi0tLSBhL2J0YS9sZV9hdWRpby9zdGF0ZV9tYWNoaW5lX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdGF0ZV9tYWNoaW5lLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpX21vY2suaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZV9tb2NrLmgiCi0jaW5jbHVkZSAiYnRtX2FwaV9tb2NrLmgiCi0jaW5jbHVkZSAiY2xpZW50X3BhcnNlci5oIgotI2luY2x1ZGUgImZha2Vfb3NpLmgiCi0jaW5jbHVkZSAibW9ja19jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibW9ja19pc29fbWFuYWdlci5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKLXVzaW5nIDo6dGVzdGluZzo6QXRMZWFzdDsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyA6OnRlc3Rpbmc6Okludm9rZTsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgOjp0ZXN0aW5nOjpUZXN0OwotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotZXh0ZXJuIHN0cnVjdCBmYWtlX29zaV9hbGFybV9zZXRfb25fbWxvb3AgZmFrZV9vc2lfYWxhcm1fc2V0X29uX21sb29wXzsKLQotbmFtZXNwYWNlIGxlX2F1ZGlvIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEp1c3Qgc29tZSBhcmJpdHJhcnkgaW5pdGlhbCBoYW5kbGVzIC0gaXQgaGFzIG5vIHJlYWwgbWVhbmluZwotI2RlZmluZSBBVFRSX0hBTkRMRV9BU0NTX1BPT0xfU1RBUlQgKDB4MDAwMCB8IDMyKQotI2RlZmluZSBBVFRSX0hBTkRMRV9QQUNTX1BPT0xfU1RBUlQgKDB4RkYwMCB8IDY0KQotCi1jb25zdGV4cHIgdWludDE2X3Qga0NvbnRleHRUeXBlVW5zcGVjaWZpZWQgPSAweDAwMDE7Ci1jb25zdGV4cHIgdWludDE2X3Qga0NvbnRleHRUeXBlQ29udmVyc2F0aW9uYWwgPSAweDAwMDI7Ci1jb25zdGV4cHIgdWludDE2X3Qga0NvbnRleHRUeXBlTWVkaWEgPSAweDAwMDQ7Ci0vLyBjb25zdGV4cHIgdWludDE2X3Qga0NvbnRleHRUeXBlSW5zdHJ1Y3Rpb25hbCA9IDB4MDAwODsKLS8vIGNvbnN0ZXhwciB1aW50MTZfdCBrQ29udGV4dFR5cGVBdHRlbnRpb25TZWVraW5nID0gMHgwMDEwOwotLy8gY29uc3RleHByIHVpbnQxNl90IGtDb250ZXh0VHlwZUltbWVkaWF0ZUFsbGVydCA9IDB4MDAyMDsKLS8vIGNvbnN0ZXhwciB1aW50MTZfdCBrQ29udGV4dFR5cGVNYW5NYWNoaW5lID0gMHgwMDQwOwotLy8gY29uc3RleHByIHVpbnQxNl90IGtDb250ZXh0VHlwZUVtZXJnZW5jeUFsZXJ0ID0gMHgwMDgwOwotY29uc3RleHByIHVpbnQxNl90IGtDb250ZXh0VHlwZVJpbmd0b25lID0gMHgwMTAwOwotLy8gY29uc3RleHByIHVpbnQxNl90IGtDb250ZXh0VHlwZVRWID0gMHgwMjAwOwotLy8gY29uc3RleHByIHVpbnQxNl90IGtDb250ZXh0VHlwZVJGVUxpdmUgPSAweDA0MDA7Ci0KLW5hbWVzcGFjZSBjb2RlY19zcGVjaWZpYyB7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtMYzNDb2RpbmdGb3JtYXQgPSAweDA2OwotCi0vLyBSZWZlcmVuY2UgQ29kZWMgQ2FwYWJpbGl0aWVzIHZhbHVlcyB0byB0ZXN0IGFnYWluc3QKLWNvbnN0ZXhwciB1aW50OF90IGtDYXBUeXBlU3VwcG9ydGVkU2FtcGxpbmdGcmVxdWVuY2llcyA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQ2FwVHlwZVN1cHBvcnRlZEZyYW1lRHVyYXRpb25zID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IGtDYXBUeXBlQXVkaW9DaGFubmVsQ291bnQgPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3Qga0NhcFR5cGVTdXBwb3J0ZWRPY3RldHNQZXJDb2RlY0ZyYW1lID0gMHgwNDsKLS8vIGNvbnN0ZXhwciB1aW50OF90IGtDYXBUeXBlU3VwcG9ydGVkTGMzQ29kZWNGcmFtZXNQZXJTZHUgPSAweDA1OwotCi0vLyBjb25zdGV4cHIgdWludDhfdCBrQ2FwU2FtcGxpbmdGcmVxdWVuY3k4MDAwSHogPSAweDAwMDE7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQ2FwU2FtcGxpbmdGcmVxdWVuY3kxMTAyNUh6ID0gMHgwMDAyOwotY29uc3RleHByIHVpbnQ4X3Qga0NhcFNhbXBsaW5nRnJlcXVlbmN5MTYwMDBIeiA9IDB4MDAwNDsKLS8vIGNvbnN0ZXhwciB1aW50OF90IGtDYXBTYW1wbGluZ0ZyZXF1ZW5jeTIyMDUwSHogPSAweDAwMDg7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQ2FwU2FtcGxpbmdGcmVxdWVuY3kyNDAwMEh6ID0gMHgwMDEwOwotLy8gY29uc3RleHByIHVpbnQ4X3Qga0NhcFNhbXBsaW5nRnJlcXVlbmN5MzIwMDBIeiA9IDB4MDAyMDsKLS8vIGNvbnN0ZXhwciB1aW50OF90IGtDYXBTYW1wbGluZ0ZyZXF1ZW5jeTQ0MTAwSHogPSAweDAwNDA7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQ2FwU2FtcGxpbmdGcmVxdWVuY3k0ODAwMEh6ID0gMHgwMDgwOwotLy8gY29uc3RleHByIHVpbnQ4X3Qga0NhcFNhbXBsaW5nRnJlcXVlbmN5ODgyMDBIeiA9IDB4MDEwMDsKLS8vIGNvbnN0ZXhwciB1aW50OF90IGtDYXBTYW1wbGluZ0ZyZXF1ZW5jeTk2MDAwSHogPSAweDAyMDA7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQ2FwU2FtcGxpbmdGcmVxdWVuY3kxNzY0MDBIeiA9IDB4MDQwMDsKLS8vIGNvbnN0ZXhwciB1aW50OF90IGtDYXBTYW1wbGluZ0ZyZXF1ZW5jeTE5MjAwMEh6ID0gMHgwODAwOwotLy8gY29uc3RleHByIHVpbnQ4X3Qga0NhcFNhbXBsaW5nRnJlcXVlbmN5Mzg0MDAwSHogPSAweDEwMDA7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtDYXBGcmFtZUR1cmF0aW9uN3A1bXMgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3Qga0NhcEZyYW1lRHVyYXRpb24xMG1zID0gMHgwMjsKLS8vIGNvbnN0ZXhwciB1aW50OF90IGtDYXBGcmFtZUR1cmF0aW9uN3A1bXNQcmVmZXJyZWQgPSAweDEwOwotY29uc3RleHByIHVpbnQ4X3Qga0NhcEZyYW1lRHVyYXRpb24xMG1zUHJlZmVycmVkID0gMHgyMDsKLX0gIC8vIG5hbWVzcGFjZSBjb2RlY19zcGVjaWZpYwotCi1uYW1lc3BhY2UgYXNjcyB7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlU3RhdGVJZGxlID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VTdGF0ZUNvZGVjQ29uZmlndXJlZCA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlU3RhdGVRb1NDb25maWd1cmVkID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VTdGF0ZUVuYWJsaW5nID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VTdGF0ZVN0cmVhbWluZyA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlU3RhdGVEaXNhYmxpbmcgPSAweDA1OwotY29uc3RleHByIHVpbnQ4X3Qga0FzZVN0YXRlUmVsZWFzaW5nID0gMHgwNjsKLQotLy8gY29uc3RleHByIHVpbnQ4X3Qga0FzZVBhcmFtRGlyZWN0aW9uU2VydmVySXNBdWRpb1NpbmsgPSAweDAxOwotLy8gY29uc3RleHByIHVpbnQ4X3Qga0FzZVBhcmFtRGlyZWN0aW9uU2VydmVySXNBdWRpb1NvdXJjZSA9IDB4MDI7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtBc2VQYXJhbUZyYW1pbmdVbmZyYW1lZFN1cHBvcnRlZCA9IDB4MDA7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQXNlUGFyYW1GcmFtaW5nVW5mcmFtZWROb3RTdXBwb3J0ZWQgPSAweDAxOwotCi0vLyBjb25zdGV4cHIgdWludDhfdCBrQXNlUGFyYW1QcmVmZXJyZWRQaHkxTSA9IDB4MDE7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQXNlUGFyYW1QcmVmZXJyZWRQaHkyTSA9IDB4MDI7Ci0vLyBjb25zdGV4cHIgdWludDhfdCBrQXNlUGFyYW1QcmVmZXJyZWRQaHlDb2RlZCA9IDB4MDQ7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtBc2VDdHBPcGNvZGVDb25maWd1cmVDb2RlYyA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlQ3RwT3Bjb2RlQ29uZmlndXJlUW9zID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VDdHBPcGNvZGVFbmFibGUgPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3Qga0FzZUN0cE9wY29kZVJlY2VpdmVyU3RhcnRSZWFkeSA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlQ3RwT3Bjb2RlRGlzYWJsZSA9IDB4MDU7Ci1jb25zdGV4cHIgdWludDhfdCBrQXNlQ3RwT3Bjb2RlUmVjZWl2ZXJTdG9wUmVhZHkgPSAweDA2OwotLy8gY29uc3RleHByIHVpbnQ4X3Qga0FzZUN0cE9wY29kZVVwZGF0ZU1ldGFkYXRhID0gMHgwNzsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VDdHBPcGNvZGVSZWxlYXNlID0gMHgwODsKLWNvbnN0ZXhwciB1aW50OF90IGtBc2VDdHBPcGNvZGVNYXhWYWwgPSBrQXNlQ3RwT3Bjb2RlUmVsZWFzZTsKLQotfSAgLy8gbmFtZXNwYWNlIGFzY3MKLQotc3RhdGljIFJhd0FkZHJlc3MgR2V0VGVzdEFkZHJlc3ModWludDhfdCBpbmRleCkgewotICByZXR1cm4ge3sweEMwLCAweERFLCAweEMwLCAweERFLCAweDAwLCBpbmRleH19OwotfQotCi1zdGF0aWMgdWludDhfdCBhc2VfaWRfbGFzdF9hc3NpZ25lZDsKLQotY2xhc3MgTW9ja0xlQXVkaW9Hcm91cFN0YXRlTWFjaGluZUNhbGxiYWNrcwotICAgIDogcHVibGljIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIE1vY2tMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmVDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIH5Nb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lQ2FsbGJhY2tzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotICBNT0NLX01FVEhPRCgodm9pZCksIFN0YXR1c1JlcG9ydENiLAotICAgICAgICAgICAgICAoaW50IGdyb3VwX2lkLCBibHVldG9vdGg6OmxlX2F1ZGlvOjpHcm91cFN0cmVhbVN0YXR1cyBzdGF0dXMpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPblN0YXRlVHJhbnNpdGlvblRpbWVvdXQsIChpbnQgZ3JvdXBfaWQpLCAob3ZlcnJpZGUpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lQ2FsbGJhY2tzKTsKLX07Ci0KLWNsYXNzIFN0YXRlTWFjaGluZVRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLmNsZWFyKCk7Ci0gICAgY29udHJvbGxlcjo6U2V0TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UoJm1vY2tfY29udHJvbGxlcl8pOwotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja0J0bUludGVyZmFjZSgmYnRtX2ludGVyZmFjZSk7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRJbnRlcmZhY2UoJmdhdHRfaW50ZXJmYWNlKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dFF1ZXVlKCZnYXR0X3F1ZXVlKTsKLQotICAgIGFzZV9pZF9sYXN0X2Fzc2lnbmVkID0gdHlwZXM6OmFzZTo6a0FzZUlkSW52YWxpZDsKLSAgICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkluaXRpYWxpemUoJm1vY2tfY2FsbGJhY2tzXyk7Ci0KLSAgICAvLyBTdXBwb3J0IDJNIFBoeQotICAgIE9OX0NBTEwobW9ja19jb250cm9sbGVyXywgU3VwcG9ydHNCbGUybVBoeSgpKS5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7Ci0gICAgT05fQ0FMTChidG1faW50ZXJmYWNlLCBJc1BoeTJtU3VwcG9ydGVkKF8sIF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7Ci0gICAgT05fQ0FMTChidG1faW50ZXJmYWNlLCBHZXRIQ0lDb25uSGFuZGxlKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIEludm9rZShbXShSYXdBZGRyZXNzIGNvbnN0JiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgICAgICAgICAgICByZXR1cm4gcmVtb3RlX2JkYS5Jc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IEhDSV9JTlZBTElEX0hBTkRMRQotICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh1aW50MTZfdCkocmVtb3RlX2JkYS5hZGRyZXNzWzBdIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGEuYWRkcmVzc1sxXSBeCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVfYmRhLmFkZHJlc3NbMl0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW90ZV9iZGEuYWRkcmVzc1szXSBeIHJlbW90ZV9iZGEuYWRkcmVzc1s0XSBeCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9iZGEuYWRkcmVzc1s1XSk7Ci0gICAgICAgICAgICB9KSk7Ci0KLSAgICBPTl9DQUxMKGdhdHRfcXVldWUsIFdyaXRlQ2hhcmFjdGVyaXN0aWMoXywgXywgXywgR0FUVF9XUklURV9OT19SU1AsIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoW3RoaXNdKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICAgICAgICAgIGZvciAoYXV0byYgZGV2IDogbGVfYXVkaW9fZGV2aWNlc18pIHsKLSAgICAgICAgICAgIGlmIChkZXYtPmNvbm5faWRfID09IGNvbm5faWQpIHsKLSAgICAgICAgICAgICAgLy8gQ29udHJvbCBwb2ludCB3cml0ZSBoYW5kbGVyCi0gICAgICAgICAgICAgIGlmIChkZXYtPmN0cF9oZGxzXy52YWxfaGRsID09IGhhbmRsZSkgewotICAgICAgICAgICAgICAgIEhhbmRsZUN0cE9wZXJhdGlvbihkZXYuZ2V0KCksIHZhbHVlLCBjYiwgY2JfZGF0YSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KSk7Ci0KLSAgICBDb25maWd1cmVJc29NYW5hZ2VyTW9jaygpOwotICB9Ci0KLSAgdm9pZCBIYW5kbGVDdHBPcGVyYXRpb24oTGVBdWRpb0RldmljZSogZGV2aWNlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICAgIGF1dG8gb3Bjb2RlID0gdmFsdWVbMF07Ci0KLSAgICAvLyBWZXJpZnkgYWdhaW5zdCB2YWxpZCBvcGNvZGUgcmFuZ2UKLSAgICBBU1NFUlRfTFQob3Bjb2RlLCBhc2NzOjprQXNlQ3RwT3Bjb2RlTWF4VmFsICsgMSk7Ci0gICAgQVNTRVJUX05FKG9wY29kZSwgMCk7Ci0KLSAgICBpZiAoYXNlX2N0cF9oYW5kbGVyc1tvcGNvZGVdKQotICAgICAgYXNlX2N0cF9oYW5kbGVyc1tvcGNvZGVdKGRldmljZSwgc3RkOjptb3ZlKHZhbHVlKSwgY2IsIGNiX2RhdGEpOwotICB9Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGEgZGV0ZXJtaW5pc3RpYyAoYW5kIHVuaXF1ZSBvbiB0aGUgZW50aXJlIGRldmljZSkKLSAqIGNvbm5lY3Rpb24gaGFuZGxlIGZvciBhIGdpdmVuIGNpcy4KLSAqLwotI2RlZmluZSBVTklRVUVfQ0lTX0NPTk5fSEFORExFKGNpZ19pZCwgY2lzX2luZGV4KSAoY2lnX2lkIDw8IDggfCBjaXNfaW5kZXgpCi0KLSAgdm9pZCBDb25maWd1cmVJc29NYW5hZ2VyTW9jaygpIHsKLSAgICBpc29fbWFuYWdlcl8gPSBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKTsKLSAgICBBU1NFUlRfTkUoaXNvX21hbmFnZXJfLCBudWxscHRyKTsKLSAgICBpc29fbWFuYWdlcl8tPlN0YXJ0KCk7Ci0KLSAgICBtb2NrX2lzb19tYW5hZ2VyXyA9IE1vY2tJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICAgIEFTU0VSVF9ORShtb2NrX2lzb19tYW5hZ2VyXywgbnVsbHB0cik7Ci0KLSAgICBPTl9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIFt0aGlzXSh1aW50OF90IGNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfcGFyYW1zIHApIHsKLSAgICAgICAgICAgICAgRExPRyhJTkZPKSA8PCAiQ3JlYXRlQ2lnIjsKLQotICAgICAgICAgICAgICBhdXRvJiBncm91cCA9IGxlX2F1ZGlvX2RldmljZV9ncm91cHNfW2NpZ19pZF07Ci0gICAgICAgICAgICAgIGlmIChncm91cCkgewotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb25uX2hhbmRsZXM7Ci0gICAgICAgICAgICAgICAgLy8gRmFrZSBjb25uZWN0aW9uIElEIGZvciBlYWNoIGNpcyBpbiBhIHJlcXVlc3QKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDwgcC5jaXNfY2Zncy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgY29ubl9oYW5kbGVzLnB1c2hfYmFjayhVTklRVUVfQ0lTX0NPTk5fSEFORExFKGNpZ19pZCwgaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5Qcm9jZXNzSGNpTm90aWZPbkNpZ0NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAuZ2V0KCksIDAsIGNpZ19pZCwgY29ubl9oYW5kbGVzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICBPTl9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlQ2lnKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpc10odWludDhfdCBjaWdfaWQpIHsKLSAgICAgICAgICBETE9HKElORk8pIDw8ICJDcmVhdGVSZW1vdmUiOwotCi0gICAgICAgICAgYXV0byYgZ3JvdXAgPSBsZV9hdWRpb19kZXZpY2VfZ3JvdXBzX1tjaWdfaWRdOwotICAgICAgICAgIGlmIChncm91cCkgewotICAgICAgICAgICAgLy8gRmFrZSBjb25uZWN0aW9uIElEIGZvciBlYWNoIGNpcyBpbiBhIHJlcXVlc3QKLSAgICAgICAgICAgIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlByb2Nlc3NIY2lOb3RpZk9uQ2lnUmVtb3ZlKAotICAgICAgICAgICAgICAgIDAsIGdyb3VwLmdldCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgT05fQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXSh1aW50MTZfdCBjb25uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKSB7Ci0gICAgICAgICAgRExPRyhJTkZPKSA8PCAiU2V0dXBJc29EYXRhUGF0aCI7Ci0KLSAgICAgICAgICBhdXRvIGRldl9pdCA9Ci0gICAgICAgICAgICAgIHN0ZDo6ZmluZF9pZihsZV9hdWRpb19kZXZpY2VzXy5iZWdpbigpLCBsZV9hdWRpb19kZXZpY2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY29ubl9oYW5kbGVdKGF1dG8mIGRldikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGFzZXMgPSBkZXYtPkdldEFzZXNCeUNpc0Nvbm5IZGwoY29ubl9oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFzZXMuc2luayB8fCBhc2VzLnNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICBpZiAoZGV2X2l0ID09IGxlX2F1ZGlvX2RldmljZXNfLmVuZCgpKSB7Ci0gICAgICAgICAgICBETE9HKEVSUk9SKSA8PCAiRGV2aWNlIG5vdCBmb3VuZCI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZm9yIChhdXRvJiBrdl9wYWlyIDogbGVfYXVkaW9fZGV2aWNlX2dyb3Vwc18pIHsKLSAgICAgICAgICAgIGF1dG8mIGdyb3VwID0ga3ZfcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAtPklzRGV2aWNlSW5UaGVHcm91cChkZXZfaXQtPmdldCgpKSkgewotICAgICAgICAgICAgICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5Qcm9jZXNzSGNpTm90aWZTZXR1cElzb0RhdGFQYXRoKAotICAgICAgICAgICAgICAgICAgZ3JvdXAuZ2V0KCksIGRldl9pdC0+Z2V0KCksIDAsIGNvbm5faGFuZGxlKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICBPTl9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXSh1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDhfdCBpc29fZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgRExPRyhJTkZPKSA8PCAiUmVtb3ZlSXNvRGF0YVBhdGgiOwotCi0gICAgICAgICAgYXV0byBkZXZfaXQgPQotICAgICAgICAgICAgICBzdGQ6OmZpbmRfaWYobGVfYXVkaW9fZGV2aWNlc18uYmVnaW4oKSwgbGVfYXVkaW9fZGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNvbm5faGFuZGxlXShhdXRvJiBkZXYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBhc2VzID0gZGV2LT5HZXRBc2VzQnlDaXNDb25uSGRsKGNvbm5faGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChhc2VzLnNpbmsgfHwgYXNlcy5zb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgaWYgKGRldl9pdCA9PSBsZV9hdWRpb19kZXZpY2VzXy5lbmQoKSkgewotICAgICAgICAgICAgRExPRyhFUlJPUikgPDwgIkRldmljZSBub3QgZm91bmQiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGZvciAoYXV0byYga3ZfcGFpciA6IGxlX2F1ZGlvX2RldmljZV9ncm91cHNfKSB7Ci0gICAgICAgICAgICBhdXRvJiBncm91cCA9IGt2X3BhaXIuc2Vjb25kOwotICAgICAgICAgICAgaWYgKGdyb3VwLT5Jc0RldmljZUluVGhlR3JvdXAoZGV2X2l0LT5nZXQoKSkpIHsKLSAgICAgICAgICAgICAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+UHJvY2Vzc0hjaU5vdGlmUmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgICAgICAgICAgICAgICBncm91cC5nZXQoKSwgZGV2X2l0LT5nZXQoKSwgMCwgY29ubl9oYW5kbGUpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIE9OX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXShibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9wYXJhbXMpIHsKLSAgICAgICAgICBETE9HKElORk8pIDw8ICJFc3RhYmxpc2hDaXMiOwotCi0gICAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY29ubl9wYXJhbXMuY29ubl9wYWlycykgewotICAgICAgICAgICAgYXV0byBkZXZfaXQgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICAgICAgICAgICAgbGVfYXVkaW9fZGV2aWNlc18uYmVnaW4oKSwgbGVfYXVkaW9fZGV2aWNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgWyZwYWlyXShhdXRvJiBkZXYpIHsKLSAgICAgICAgICAgICAgICAgIGF1dG8gYXNlcyA9IGRldi0+R2V0QXNlc0J5Q2lzQ29ubkhkbChwYWlyLmNpc19jb25uX2hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gKGFzZXMuc2luayB8fCBhc2VzLnNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZiAoZGV2X2l0ID09IGxlX2F1ZGlvX2RldmljZXNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAgIERMT0coRVJST1IpIDw8ICJEZXZpY2Ugbm90IGZvdW5kIjsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGF1dG8mIGt2X3BhaXIgOiBsZV9hdWRpb19kZXZpY2VfZ3JvdXBzXykgewotICAgICAgICAgICAgICBhdXRvJiBncm91cCA9IGt2X3BhaXIuc2Vjb25kOwotICAgICAgICAgICAgICBpZiAoZ3JvdXAtPklzRGV2aWNlSW5UaGVHcm91cChkZXZfaXQtPmdldCgpKSkgewotICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9jbXBsX2V2dCBldnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBGaWxsIHByb3BlciB2YWx1ZXMgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgZXZ0LnN0YXR1cyA9IDB4MDA7Ci0gICAgICAgICAgICAgICAgZXZ0LmNpZ19pZCA9IGdyb3VwLT5ncm91cF9pZF87Ci0gICAgICAgICAgICAgICAgZXZ0LmNpc19jb25uX2hkbCA9IHBhaXIuY2lzX2Nvbm5faGFuZGxlOwotICAgICAgICAgICAgICAgIGV2dC5jaWdfc3luY19kZWxheSA9IDA7Ci0gICAgICAgICAgICAgICAgZXZ0LmNpc19zeW5jX2RlbGF5ID0gMDsKLSAgICAgICAgICAgICAgICBldnQudHJhbnNfbGF0X210b3MgPSAwOwotICAgICAgICAgICAgICAgIGV2dC50cmFuc19sYXRfc3RvbSA9IDA7Ci0gICAgICAgICAgICAgICAgZXZ0LnBoeV9tdG9zID0gMDsKLSAgICAgICAgICAgICAgICBldnQucGh5X3N0b20gPSAwOwotICAgICAgICAgICAgICAgIGV2dC5uc2UgPSAwOwotICAgICAgICAgICAgICAgIGV2dC5ibl9tdG9zID0gMDsKLSAgICAgICAgICAgICAgICBldnQuYm5fc3RvbSA9IDA7Ci0gICAgICAgICAgICAgICAgZXZ0LmZ0X210b3MgPSAwOwotICAgICAgICAgICAgICAgIGV2dC5mdF9zdG9tID0gMDsKLSAgICAgICAgICAgICAgICBldnQubWF4X3BkdV9tdG9zID0gMDsKLSAgICAgICAgICAgICAgICBldnQubWF4X3BkdV9zdG9tID0gMDsKLSAgICAgICAgICAgICAgICBldnQuaXNvX2l0diA9IDA7Ci0KLSAgICAgICAgICAgICAgICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5Qcm9jZXNzSGNpTm90aWZDaXNFc3RhYmxpc2hlZCgKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAuZ2V0KCksIGRldl9pdC0+Z2V0KCksICZldnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIE9OX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpc10odWludDE2X3QgY2lzX2hhbmRsZSwgdWludDhfdCByZWFzb24pIHsKLSAgICAgICAgICBETE9HKElORk8pIDw8ICJEaXNjb25uZWN0Q2lzIjsKLQotICAgICAgICAgIGF1dG8gZGV2X2l0ID0KLSAgICAgICAgICAgICAgc3RkOjpmaW5kX2lmKGxlX2F1ZGlvX2RldmljZXNfLmJlZ2luKCksIGxlX2F1ZGlvX2RldmljZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZjaXNfaGFuZGxlXShhdXRvJiBkZXYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBhc2VzID0gZGV2LT5HZXRBc2VzQnlDaXNDb25uSGRsKGNpc19oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFzZXMuc2luayB8fCBhc2VzLnNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICBpZiAoZGV2X2l0ID09IGxlX2F1ZGlvX2RldmljZXNfLmVuZCgpKSB7Ci0gICAgICAgICAgICBETE9HKEVSUk9SKSA8PCAiRGV2aWNlIG5vdCBmb3VuZCI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZm9yIChhdXRvJiBrdl9wYWlyIDogbGVfYXVkaW9fZGV2aWNlX2dyb3Vwc18pIHsKLSAgICAgICAgICAgIGF1dG8mIGdyb3VwID0ga3ZfcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAtPklzRGV2aWNlSW5UaGVHcm91cChkZXZfaXQtPmdldCgpKSkgewotICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19kaXNjb25uZWN0ZWRfZXZ0IGV2dHsKLSAgICAgICAgICAgICAgICAgIC5yZWFzb24gPSByZWFzb24sCi0gICAgICAgICAgICAgICAgICAuY2lnX2lkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZ3JvdXAtPmdyb3VwX2lkXyksCi0gICAgICAgICAgICAgICAgICAuY2lzX2Nvbm5faGRsID0gY2lzX2hhbmRsZSwKLSAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+UHJvY2Vzc0hjaU5vdGlmQ2lzRGlzY29ubmVjdGVkKAotICAgICAgICAgICAgICAgICAgZ3JvdXAuZ2V0KCksIGRldl9pdC0+Z2V0KCksICZldnQpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgaXNvX21hbmFnZXJfLT5TdG9wKCk7Ci0gICAgbW9ja19pc29fbWFuYWdlcl8gPSBudWxscHRyOwotCi0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRRdWV1ZShudWxscHRyKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dEludGVyZmFjZShudWxscHRyKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1JbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgY29udHJvbGxlcjo6U2V0TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UobnVsbHB0cik7Ci0KLSAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDw9IGFzY3M6OmtBc2VDdHBPcGNvZGVNYXhWYWw7ICsraSkKLSAgICAgIGFzZV9jdHBfaGFuZGxlcnNbaV0gPSBudWxscHRyOwotCi0gICAgbGVfYXVkaW9fZGV2aWNlc18uY2xlYXIoKTsKLSAgICBjYWNoZWRfY29kZWNfY29uZmlndXJhdGlvbl9tYXBfLmNsZWFyKCk7Ci0gICAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpDbGVhbnVwKCk7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4gUHJlcGFyZUNvbm5lY3RlZERldmljZSh1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcnN0X2Nvbm5lY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2FzZV9zbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2FzZV9zcmMpIHsKLSAgICBhdXRvIGxlQXVkaW9EZXZpY2UgPQotICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExlQXVkaW9EZXZpY2U+KEdldFRlc3RBZGRyZXNzKGlkKSwgZmlyc3RfY29ubmVjdGlvbik7Ci0gICAgbGVBdWRpb0RldmljZS0+Y29ubl9pZF8gPSBpZDsKLQotICAgIHVpbnQxNl90IGF0dHJfaGFuZGxlID0gQVRUUl9IQU5ETEVfQVNDU19QT09MX1NUQVJUOwotICAgIGxlQXVkaW9EZXZpY2UtPnNua19hdWRpb19sb2NhdGlvbnNfaGRsc18udmFsX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0gICAgbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc19oZGxzXy5jY2NfaGRsID0gYXR0cl9oYW5kbGUrKzsKLSAgICBsZUF1ZGlvRGV2aWNlLT5zcmNfYXVkaW9fbG9jYXRpb25zX2hkbHNfLnZhbF9oZGwgPSBhdHRyX2hhbmRsZSsrOwotICAgIGxlQXVkaW9EZXZpY2UtPnNyY19hdWRpb19sb2NhdGlvbnNfaGRsc18uY2NjX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0gICAgbGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18udmFsX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0gICAgbGVBdWRpb0RldmljZS0+YXVkaW9fYXZhaWxfaGRsc18uY2NjX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0gICAgbGVBdWRpb0RldmljZS0+YXVkaW9fc3VwcF9jb250X2hkbHNfLnZhbF9oZGwgPSBhdHRyX2hhbmRsZSsrOwotICAgIGxlQXVkaW9EZXZpY2UtPmF1ZGlvX3N1cHBfY29udF9oZGxzXy5jY2NfaGRsID0gYXR0cl9oYW5kbGUrKzsKLSAgICBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0gICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLmNjY19oZGwgPSBhdHRyX2hhbmRsZSsrOwotCi0gICAgLy8gQWRkIHNvbWUgU2luayBBU0VzCi0gICAgd2hpbGUgKG51bV9hc2Vfc25rKSB7Ci0gICAgICB0eXBlczo6YXNlIGFzZSgwLCAwLCAweDAxKTsKLSAgICAgIGFzZS5oZGxzLnZhbF9oZGwgPSBhdHRyX2hhbmRsZSsrOwotICAgICAgYXNlLmhkbHMuY2NjX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0KLSAgICAgIGxlQXVkaW9EZXZpY2UtPmFzZXNfLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoYXNlKSk7Ci0gICAgICBudW1fYXNlX3Nuay0tOwotICAgIH0KLQotICAgIC8vIEFkZCBzb21lIFNvdXJjZSBBU0VzCi0gICAgd2hpbGUgKG51bV9hc2Vfc3JjKSB7Ci0gICAgICB0eXBlczo6YXNlIGFzZSgwLCAwLCAweDAyKTsKLSAgICAgIGFzZS5oZGxzLnZhbF9oZGwgPSBhdHRyX2hhbmRsZSsrOwotICAgICAgYXNlLmhkbHMuY2NjX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0KLSAgICAgIGxlQXVkaW9EZXZpY2UtPmFzZXNfLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoYXNlKSk7Ci0gICAgICBudW1fYXNlX3NyYy0tOwotICAgIH0KLQotICAgIGxlX2F1ZGlvX2RldmljZXNfLnB1c2hfYmFjayhsZUF1ZGlvRGV2aWNlKTsKLQotICAgIHJldHVybiBzdGQ6Om1vdmUobGVBdWRpb0RldmljZSk7Ci0gIH0KLQotICBMZUF1ZGlvRGV2aWNlR3JvdXAqIEdyb3VwVGhlRGV2aWNlKAotICAgICAgaW50IGdyb3VwX2lkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGVBdWRpb0RldmljZT4mIGxlQXVkaW9EZXZpY2UpIHsKLSAgICBpZiAobGVfYXVkaW9fZGV2aWNlX2dyb3Vwc18uY291bnQoZ3JvdXBfaWQpID09IDApIHsKLSAgICAgIGxlX2F1ZGlvX2RldmljZV9ncm91cHNfW2dyb3VwX2lkXSA9Ci0gICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxMZUF1ZGlvRGV2aWNlR3JvdXA+KGdyb3VwX2lkKTsKLSAgICB9Ci0KLSAgICBhdXRvJiBncm91cCA9IGxlX2F1ZGlvX2RldmljZV9ncm91cHNfW2dyb3VwX2lkXTsKLQotICAgIGdyb3VwLT5BZGROb2RlKGxlQXVkaW9EZXZpY2UpOwotICAgIGlmIChncm91cC0+SXNFbXB0eSgpKSByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJldHVybiAmKCpncm91cCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbih0eXBlczo6YXNlKiBhc2UsIExlQXVkaW9EZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuZXdfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG5ld19zdGF0ZV9wYXJhbXMpIHsKLSAgICAvLyBQcmVwYXJlIGFkZGl0aW9uYWwgcGFyYW1zCi0gICAgc3dpdGNoIChuZXdfc3RhdGUpIHsKLSAgICAgIGNhc2UgYXNjczo6a0FzZVN0YXRlQ29kZWNDb25maWd1cmVkOiB7Ci0gICAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9jb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyogY29uZiA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDwKLSAgICAgICAgICAgICAgICBjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMqPigKLSAgICAgICAgICAgICAgICBuZXdfc3RhdGVfcGFyYW1zKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbm90aWZfdmFsdWUoMjUgKyBjb25mLT5jb2RlY19zcGVjX2NvbmYuc2l6ZSgpKTsKLSAgICAgICAgYXV0byogcCA9IG5vdGlmX3ZhbHVlLmRhdGEoKTsKLQotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYXNlLT5pZCA9PSB0eXBlczo6YXNlOjprQXNlSWRJbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyArK2FzZV9pZF9sYXN0X2Fzc2lnbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc2UtPmlkKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIG5ld19zdGF0ZSk7Ci0KLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGNvbmYtPmZyYW1pbmcpOwotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgY29uZi0+cHJlZmVycmVkX3BoeSk7Ci0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBjb25mLT5wcmVmZXJyZWRfcmV0cmFuc19uYik7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgY29uZi0+bWF4X3RyYW5zcG9ydF9sYXRlbmN5KTsKLSAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCBjb25mLT5wcmVzX2RlbGF5X21pbik7Ci0gICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgY29uZi0+cHJlc19kZWxheV9tYXgpOwotICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIGNvbmYtPnByZWZlcnJlZF9wcmVzX2RlbGF5X21pbik7Ci0gICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgY29uZi0+cHJlZmVycmVkX3ByZXNfZGVsYXlfbWF4KTsKLQotICAgICAgICAvLyBDb2RlY0lEOgotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgY29uZi0+Y29kZWNfaWQuY29kaW5nX2Zvcm1hdCk7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgY29uZi0+Y29kZWNfaWQudmVuZG9yX2NvbXBhbnlfaWQpOwotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNvbmYtPmNvZGVjX2lkLnZlbmRvcl9jb2RlY19pZCk7Ci0KLSAgICAgICAgLy8gQ29kZWMgU3BlYy4gQ29uZi4gTGVuZ3RoIGFuZCBEYXRhCi0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBjb25mLT5jb2RlY19zcGVjX2NvbmYuc2l6ZSgpKTsKLSAgICAgICAgbWVtY3B5KHAsIGNvbmYtPmNvZGVjX3NwZWNfY29uZi5kYXRhKCksIGNvbmYtPmNvZGVjX3NwZWNfY29uZi5zaXplKCkpOwotCi0gICAgICAgIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlByb2Nlc3NHYXR0Tm90aWZFdmVudCgKLSAgICAgICAgICAgIG5vdGlmX3ZhbHVlLmRhdGEoKSwgbm90aWZfdmFsdWUuc2l6ZSgpLCBhc2UsIGRldmljZSwgZ3JvdXApOwotICAgICAgfSBicmVhazsKLQotICAgICAgY2FzZSBhc2NzOjprQXNlU3RhdGVRb1NDb25maWd1cmVkOiB7Ci0gICAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9xb3NfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMqIGNvbmYgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2xpZW50X3BhcnNlcjo6YXNjczo6YXNlX3Fvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyo+KAotICAgICAgICAgICAgICAgIG5ld19zdGF0ZV9wYXJhbXMpOwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBub3RpZl92YWx1ZSgxNyk7Ci0gICAgICAgIGF1dG8qIHAgPSBub3RpZl92YWx1ZS5kYXRhKCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSBoZWFkZXIKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGFzZS0+aWQpOwotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgbmV3X3N0YXRlKTsKLQotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgY29uZi0+Y2lnX2lkKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGNvbmYtPmNpc19pZCk7Ci0gICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgY29uZi0+c2R1X2ludGVydmFsKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGNvbmYtPmZyYW1pbmcpOwotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgY29uZi0+cGh5KTsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBjb25mLT5tYXhfc2R1KTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGNvbmYtPnJldHJhbnNfbmIpOwotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNvbmYtPm1heF90cmFuc3BvcnRfbGF0ZW5jeSk7Ci0gICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgY29uZi0+cHJlc19kZWxheSk7Ci0KLSAgICAgICAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+UHJvY2Vzc0dhdHROb3RpZkV2ZW50KAotICAgICAgICAgICAgbm90aWZfdmFsdWUuZGF0YSgpLCBub3RpZl92YWx1ZS5zaXplKCksIGFzZSwgZGV2aWNlLCBncm91cCk7Ci0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIGFzY3M6OmtBc2VTdGF0ZUVuYWJsaW5nOgotICAgICAgICAvLyBmYWxsLXRocm91Z2gKLSAgICAgIGNhc2UgYXNjczo6a0FzZVN0YXRlU3RyZWFtaW5nOgotICAgICAgICAvLyBmYWxsLXRocm91Z2gKLSAgICAgIGNhc2UgYXNjczo6a0FzZVN0YXRlRGlzYWJsaW5nOiB7Ci0gICAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV90cmFuc2llbnRfc3RhdGVfcGFyYW1zKiBwYXJhbXMgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2xpZW50X3BhcnNlcjo6YXNjczo6YXNlX3RyYW5zaWVudF9zdGF0ZV9wYXJhbXMqPigKLSAgICAgICAgICAgICAgICBuZXdfc3RhdGVfcGFyYW1zKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbm90aWZfdmFsdWUoNSArIHBhcmFtcy0+bWV0YWRhdGEuc2l6ZSgpKTsKLSAgICAgICAgYXV0byogcCA9IG5vdGlmX3ZhbHVlLmRhdGEoKTsKLQotICAgICAgICAvLyBQcmVwYXJlIGhlYWRlcgotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYXNlLT5pZCk7Ci0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBuZXdfc3RhdGUpOwotCi0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBncm91cC0+Z3JvdXBfaWRfKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGFzZS0+Y2lzX2lkKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBhcmFtcy0+bWV0YWRhdGEuc2l6ZSgpKTsKLSAgICAgICAgbWVtY3B5KHAsIHBhcmFtcy0+bWV0YWRhdGEuZGF0YSgpLCBwYXJhbXMtPm1ldGFkYXRhLnNpemUoKSk7Ci0KLSAgICAgICAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+UHJvY2Vzc0dhdHROb3RpZkV2ZW50KAotICAgICAgICAgICAgbm90aWZfdmFsdWUuZGF0YSgpLCBub3RpZl92YWx1ZS5zaXplKCksIGFzZSwgZGV2aWNlLCBncm91cCk7Ci0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIGFzY3M6OmtBc2VTdGF0ZVJlbGVhc2luZzoKLSAgICAgICAgLy8gZmFsbC10aHJvdWdoCi0gICAgICBjYXNlIGFzY3M6OmtBc2VTdGF0ZUlkbGU6IHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbm90aWZfdmFsdWUoMik7Ci0gICAgICAgIGF1dG8qIHAgPSBub3RpZl92YWx1ZS5kYXRhKCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSBoZWFkZXIKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGFzZS0+aWQgPT0gdHlwZXM6OmFzZTo6a0FzZUlkSW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKythc2VfaWRfbGFzdF9hc3NpZ25lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXNlLT5pZCk7Ci0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBuZXdfc3RhdGUpOwotCi0gICAgICAgIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlByb2Nlc3NHYXR0Tm90aWZFdmVudCgKLSAgICAgICAgICAgIG5vdGlmX3ZhbHVlLmRhdGEoKSwgbm90aWZfdmFsdWUuc2l6ZSgpLCBhc2UsIGRldmljZSwgZ3JvdXApOwotICAgICAgfSBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIEluc2VydFBhY1JlY29yZCgKLSAgICAgIHN0ZDo6dmVjdG9yPHR5cGVzOjphY3NfYWNfcmVjb3JkPiYgcmVjcywKLSAgICAgIHVpbnQxNl90IHNhbXBsaW5nX2ZyZXF1ZW5jaWVzX2JpdGZpZWxkLAotICAgICAgdWludDhfdCBzdXBwb3J0ZWRfZnJhbWVfZHVyYXRpb25zX2JpdGZpZWxkLAotICAgICAgdWludDhfdCBhdWRpb19jaGFubmVsX2NvdW50X2JpdGZpZWxkLAotICAgICAgdWludDE2X3Qgc3VwcG9ydGVkX29jdGV0c19wZXJfY29kZWNfZnJhbWVfbWluLAotICAgICAgdWludDE2X3Qgc3VwcG9ydGVkX29jdGV0c19wZXJfY29kZWNfZnJhbWVfbWF4LAotICAgICAgdWludDhfdCBjb2RpbmdfZm9ybWF0ID0gY29kZWNfc3BlY2lmaWM6OmtMYzNDb2RpbmdGb3JtYXQsCi0gICAgICB1aW50MTZfdCB2ZW5kb3JfY29tcGFueV9pZCA9IDB4MDAwMCwgdWludDE2X3QgdmVuZG9yX2NvZGVjX2lkID0gMHgwMDAwLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWV0YWRhdGEgPSB7fSkgewotICAgIHJlY3MucHVzaF9iYWNrKHsKLSAgICAgICAgLmNvZGVjX2lkID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAuY29kaW5nX2Zvcm1hdCA9IGNvZGluZ19mb3JtYXQsCi0gICAgICAgICAgICAgICAgLnZlbmRvcl9jb21wYW55X2lkID0gdmVuZG9yX2NvbXBhbnlfaWQsCi0gICAgICAgICAgICAgICAgLnZlbmRvcl9jb2RlY19pZCA9IHZlbmRvcl9jb2RlY19pZCwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIC5jb2RlY19zcGVjX2NhcHMgPSB0eXBlczo6TGVBdWRpb0x0dk1hcCh7Ci0gICAgICAgICAgICB7Y29kZWNfc3BlY2lmaWM6OmtDYXBUeXBlU3VwcG9ydGVkU2FtcGxpbmdGcmVxdWVuY2llcywKLSAgICAgICAgICAgICB7KHVpbnQ4X3QpKHNhbXBsaW5nX2ZyZXF1ZW5jaWVzX2JpdGZpZWxkKSwKLSAgICAgICAgICAgICAgKHVpbnQ4X3QpKHNhbXBsaW5nX2ZyZXF1ZW5jaWVzX2JpdGZpZWxkID4+IDgpfX0sCi0gICAgICAgICAgICB7Y29kZWNfc3BlY2lmaWM6OmtDYXBUeXBlU3VwcG9ydGVkRnJhbWVEdXJhdGlvbnMsCi0gICAgICAgICAgICAge3N1cHBvcnRlZF9mcmFtZV9kdXJhdGlvbnNfYml0ZmllbGR9fSwKLSAgICAgICAgICAgIHtjb2RlY19zcGVjaWZpYzo6a0NhcFR5cGVBdWRpb0NoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICB7YXVkaW9fY2hhbm5lbF9jb3VudF9iaXRmaWVsZH19LAotICAgICAgICAgICAge2NvZGVjX3NwZWNpZmljOjprQ2FwVHlwZVN1cHBvcnRlZE9jdGV0c1BlckNvZGVjRnJhbWUsCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvLyBNaW4KLSAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHN1cHBvcnRlZF9vY3RldHNfcGVyX2NvZGVjX2ZyYW1lX21pbiksCi0gICAgICAgICAgICAgICAgICh1aW50OF90KShzdXBwb3J0ZWRfb2N0ZXRzX3Blcl9jb2RlY19mcmFtZV9taW4gPj4gOCksCi0gICAgICAgICAgICAgICAgIC8vIE1heAotICAgICAgICAgICAgICAgICAodWludDhfdCkoc3VwcG9ydGVkX29jdGV0c19wZXJfY29kZWNfZnJhbWVfbWF4KSwKLSAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHN1cHBvcnRlZF9vY3RldHNfcGVyX2NvZGVjX2ZyYW1lX21heCA+PiA4KSwKLSAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSksCi0gICAgICAgIC5tZXRhZGF0YSA9IHN0ZDo6bW92ZShtZXRhZGF0YSksCi0gICAgfSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBJbmplY3RJbml0aWFsSWRsZU5vdGlmaWNhdGlvbihMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwKSB7Ci0gICAgZm9yIChhdXRvKiBkZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsgZGV2aWNlICE9IG51bGxwdHI7Ci0gICAgICAgICBkZXZpY2UgPSBncm91cC0+R2V0TmV4dERldmljZShkZXZpY2UpKSB7Ci0gICAgICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICAgICAgSW5qZWN0QXNlU3RhdGVOb3RpZmljYXRpb24oJmFzZSwgZGV2aWNlLCBncm91cCwgYXNjczo6a0FzZVN0YXRlSWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBNdWx0aXBsZVRlc3REZXZpY2VQcmVwYXJlKGludCBsZWF1ZGlvX2dyb3VwX2lkLCB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkZXZpY2VfY250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnNlcnRfZGVmYXVsdF9wYWNfcmVjb3JkcyA9IHRydWUpIHsKLSAgICAvLyBQcmVwYXJlIGZha2UgY29ubmVjdGVkIGRldmljZSBncm91cAotICAgIGJvb2wgZmlyc3RfY29ubmVjdGlvbnMgPSB0cnVlOwotICAgIGludCB0b3RhbF9kZXZpY2VzID0gZGV2aWNlX2NudDsKLSAgICBsZV9hdWRpbzo6TGVBdWRpb0RldmljZUdyb3VwKiBncm91cCA9IG51bGxwdHI7Ci0KLSAgICB1aW50OF90IG51bV9hc2Vfc25rOwotICAgIHVpbnQ4X3QgbnVtX2FzZV9zcmM7Ci0gICAgc3dpdGNoIChjb250ZXh0X3R5cGUpIHsKLSAgICAgIGNhc2Uga0NvbnRleHRUeXBlUmluZ3RvbmU6Ci0gICAgICAgIG51bV9hc2Vfc25rID0gMTsKLSAgICAgICAgbnVtX2FzZV9zcmMgPSAwOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBrQ29udGV4dFR5cGVNZWRpYToKLSAgICAgICAgbnVtX2FzZV9zbmsgPSAyOwotICAgICAgICBudW1fYXNlX3NyYyA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOgotICAgICAgICBudW1fYXNlX3NuayA9IDE7Ci0gICAgICAgIG51bV9hc2Vfc3JjID0gMTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoZGV2aWNlX2NudCkgewotICAgICAgYXV0byBsZUF1ZGlvRGV2aWNlID0gUHJlcGFyZUNvbm5lY3RlZERldmljZSgKLSAgICAgICAgICBkZXZpY2VfY250LS0sIGZpcnN0X2Nvbm5lY3Rpb25zLCBudW1fYXNlX3NuaywgbnVtX2FzZV9zcmMpOwotCi0gICAgICBpZiAoaW5zZXJ0X2RlZmF1bHRfcGFjX3JlY29yZHMpIHsKLSAgICAgICAgdWludDE2X3QgYXR0cl9oYW5kbGUgPSBBVFRSX0hBTkRMRV9QQUNTX1BPT0xfU1RBUlQ7Ci0KLSAgICAgICAgLyogQXMgcGVyIHNwZWMsIHVuc3BlY2lmaWVkIHNoYWxsIGJlIHN1cHBvcnRlZCAqLwotICAgICAgICB0eXBlczo6QXVkaW9Db250ZXh0cyBzbmtfY29udGV4dF90eXBlID0ga0NvbnRleHRUeXBlVW5zcGVjaWZpZWQ7Ci0gICAgICAgIHR5cGVzOjpBdWRpb0NvbnRleHRzIHNyY19jb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVVbnNwZWNpZmllZDsKLQotICAgICAgICAvLyBQcmVwYXJlIFNpbmsgUHVibGlzaGVkIEF1ZGlvIENhcGFiaWxpdHkgcmVjb3JkcwotICAgICAgICBpZiAoKGNvbnRleHRfdHlwZSAmIGtDb250ZXh0VHlwZVJpbmd0b25lKSB8fAotICAgICAgICAgICAgKGNvbnRleHRfdHlwZSAmIGtDb250ZXh0VHlwZU1lZGlhKSB8fAotICAgICAgICAgICAgKGNvbnRleHRfdHlwZSAmIGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsKSkgewotICAgICAgICAgIC8vIFNldCB0YXJnZXQgQVNFIGNvbmZpZ3VyYXRpb25zCi0gICAgICAgICAgc3RkOjp2ZWN0b3I8dHlwZXM6OmFjc19hY19yZWNvcmQ+IHBhY19yZWNzOwotCi0gICAgICAgICAgSW5zZXJ0UGFjUmVjb3JkKHBhY19yZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpYzo6a0NhcFNhbXBsaW5nRnJlcXVlbmN5MTYwMDBIeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWM6OmtDYXBGcmFtZUR1cmF0aW9uMTBtcyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpYzo6a0NhcEZyYW1lRHVyYXRpb243cDVtcyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpYzo6a0NhcEZyYW1lRHVyYXRpb24xMG1zUHJlZmVycmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwYjAwMDAwMDAxLCAzMCwgMTIwKTsKLQotICAgICAgICAgIHR5cGVzOjpoZGxfcGFpciBoYW5kbGVfcGFpcjsKLSAgICAgICAgICBoYW5kbGVfcGFpci52YWxfaGRsID0gYXR0cl9oYW5kbGUrKzsKLSAgICAgICAgICBoYW5kbGVfcGFpci5jY2NfaGRsID0gYXR0cl9oYW5kbGUrKzsKLQotICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPnNua19wYWNzXy5lbXBsYWNlX2JhY2soCi0gICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6Om1vdmUoaGFuZGxlX3BhaXIpLCBwYWNfcmVjcykpOwotCi0gICAgICAgICAgc25rX2NvbnRleHRfdHlwZSB8PSBjb250ZXh0X3R5cGU7Ci0gICAgICAgICAgbGVBdWRpb0RldmljZS0+c25rX2F1ZGlvX2xvY2F0aW9uc18gPQotICAgICAgICAgICAgICA6OmxlX2F1ZGlvOjpjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQgfAotICAgICAgICAgICAgICA6OmxlX2F1ZGlvOjpjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udFJpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJlcGFyZSBTb3VyY2UgUHVibGlzaGVkIEF1ZGlvIENhcGFiaWxpdHkgcmVjb3JkcwotICAgICAgICBpZiAoY29udGV4dF90eXBlICYga0NvbnRleHRUeXBlQ29udmVyc2F0aW9uYWwpIHsKLSAgICAgICAgICAvLyBTZXQgdGFyZ2V0IEFTRSBjb25maWd1cmF0aW9ucwotICAgICAgICAgIHN0ZDo6dmVjdG9yPHR5cGVzOjphY3NfYWNfcmVjb3JkPiBwYWNfcmVjczsKLQotICAgICAgICAgIEluc2VydFBhY1JlY29yZChwYWNfcmVjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWM6OmtDYXBTYW1wbGluZ0ZyZXF1ZW5jeTE2MDAwSHosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljOjprQ2FwRnJhbWVEdXJhdGlvbjEwbXMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWM6OmtDYXBGcmFtZUR1cmF0aW9uN3A1bXMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWM6OmtDYXBGcmFtZUR1cmF0aW9uMTBtc1ByZWZlcnJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMGIwMDAwMDAwMSwgMzAsIDEyMCk7Ci0KLSAgICAgICAgICB0eXBlczo6aGRsX3BhaXIgaGFuZGxlX3BhaXI7Ci0gICAgICAgICAgaGFuZGxlX3BhaXIudmFsX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0gICAgICAgICAgaGFuZGxlX3BhaXIuY2NjX2hkbCA9IGF0dHJfaGFuZGxlKys7Ci0KLSAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5zcmNfcGFjc18uZW1wbGFjZV9iYWNrKAotICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjptb3ZlKGhhbmRsZV9wYWlyKSwgcGFjX3JlY3MpKTsKLSAgICAgICAgICBzcmNfY29udGV4dF90eXBlIHw9IGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOwotCi0gICAgICAgICAgbGVBdWRpb0RldmljZS0+c3JjX2F1ZGlvX2xvY2F0aW9uc18gPQotICAgICAgICAgICAgICA6OmxlX2F1ZGlvOjpjb2RlY19zcGVjX2NvbmY6OmtMZUF1ZGlvTG9jYXRpb25Gcm9udExlZnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsZUF1ZGlvRGV2aWNlLT5TZXRTdXBwb3J0ZWRDb250ZXh0cyhzbmtfY29udGV4dF90eXBlLCBzcmNfY29udGV4dF90eXBlKTsKLSAgICAgICAgbGVBdWRpb0RldmljZS0+U2V0QXZhaWxhYmxlQ29udGV4dHMoc25rX2NvbnRleHRfdHlwZSwgc3JjX2NvbnRleHRfdHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIGdyb3VwID0gR3JvdXBUaGVEZXZpY2UobGVhdWRpb19ncm91cF9pZCwgc3RkOjptb3ZlKGxlQXVkaW9EZXZpY2UpKTsKLSAgICB9Ci0KLSAgICAvKiBTdGltdWxhdGUgdXBkYXRlIG9mIGFjdGl2ZSBjb250ZXh0IG1hcCAqLwotICAgIHR5cGVzOjpBdWRpb0NvbnRleHRzIHR5cGVfc2V0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbnRleHRfdHlwZSk7Ci0gICAgZ3JvdXAtPlVwZGF0ZUFjdGl2ZUNvbnRleHRzTWFwKHR5cGVfc2V0KTsKLQotICAgIEFTU0VSVF9ORShncm91cCwgbnVsbHB0cik7Ci0gICAgQVNTRVJUX0VRKGdyb3VwLT5TaXplKCksIHRvdGFsX2RldmljZXMpOwotICB9Ci0KLSAgTGVBdWRpb0RldmljZUdyb3VwKiBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGludCBsZWF1ZGlvX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZGV2aWNlX2NudCA9IDEpIHsKLSAgICBNdWx0aXBsZVRlc3REZXZpY2VQcmVwYXJlKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSwgZGV2aWNlX2NudCk7Ci0gICAgcmV0dXJuIGxlX2F1ZGlvX2RldmljZV9ncm91cHNfLmNvdW50KGxlYXVkaW9fZ3JvdXBfaWQpCi0gICAgICAgICAgICAgICA/IGxlX2F1ZGlvX2RldmljZV9ncm91cHNfW2xlYXVkaW9fZ3JvdXBfaWRdLmdldCgpCi0gICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIFByZXBhcmVDb25maWd1cmVDb2RlY0hhbmRsZXIoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJpZnlfYXNlX2NvdW50ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FjaGluZyA9IGZhbHNlKSB7Ci0gICAgYXNlX2N0cF9oYW5kbGVyc1thc2NzOjprQXNlQ3RwT3Bjb2RlQ29uZmlndXJlQ29kZWNdID0KLSAgICAgICAgW2dyb3VwLCB2ZXJpZnlfYXNlX2NvdW50LCBjYWNoaW5nLCB0aGlzXSgKLSAgICAgICAgICAgIExlQXVkaW9EZXZpY2UqIGRldmljZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gICAgICAgICAgYXV0byBudW1fYXNlID0gdmFsdWVbMV07Ci0KLSAgICAgICAgICAvLyBWZXJpZnkgYXNlIGNvdW50IGlmIG5lZWRlZAotICAgICAgICAgIGlmICh2ZXJpZnlfYXNlX2NvdW50KSBBU1NFUlRfRVEodmVyaWZ5X2FzZV9jb3VudCwgbnVtX2FzZSk7Ci0KLSAgICAgICAgICAvLyBJbmplY3QgQ29uZmlndXJlZCBBU0Ugc3RhdGUgbm90aWZpY2F0aW9uIGZvciBlYWNoIHJlcXVlc3RlZCBBU0UKLSAgICAgICAgICBhdXRvKiBhc2VfcCA9ICZ2YWx1ZVsyXTsKLSAgICAgICAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDwgbnVtX2FzZTsgKytpKSB7Ci0gICAgICAgICAgICBjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMKLSAgICAgICAgICAgICAgICBjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtczsKLQotICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIEFTRSBJRCAgKi8KLSAgICAgICAgICAgIGF1dG8gYXNlX2lkID0gKmFzZV9wKys7Ci0gICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAotICAgICAgICAgICAgICAgIGRldmljZS0+YXNlc18uYmVnaW4oKSwgZGV2aWNlLT5hc2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICBbYXNlX2lkXShhdXRvJiBhc2UpIHsgcmV0dXJuIChhc2UuaWQgPT0gYXNlX2lkKTsgfSk7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoaXQsIGRldmljZS0+YXNlc18uZW5kKCkpOwotICAgICAgICAgICAgY29uc3QgYXV0byBhc2UgPSAmKCppdCk7Ci0KLSAgICAgICAgICAgIC8vIFNraXAgdGFyZ2V0IGxhdGVuY3kgcGFyYW0KLSAgICAgICAgICAgIGFzZV9wKys7Ci0KLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9waHkgPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLmNvZGluZ19mb3JtYXQgPSBhc2VfcFswXTsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX2lkLnZlbmRvcl9jb21wYW55X2lkID0KLSAgICAgICAgICAgICAgICAodWludDE2X3QpKGFzZV9wWzFdIDw8IDggfCBhc2VfcFsyXSksCi0gICAgICAgICAgICBjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5jb2RlY19pZC52ZW5kb3JfY29kZWNfaWQgPQotICAgICAgICAgICAgICAgICh1aW50MTZfdCkoYXNlX3BbM10gPDwgOCB8IGFzZV9wWzRdKSwKLSAgICAgICAgICAgIGFzZV9wICs9IDU7Ci0KLSAgICAgICAgICAgIGF1dG8gY29kZWNfc3BlY19wYXJhbV9sZW4gPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIGF1dG8gbnVtX2hhbmRsZWRfYnl0ZXMgPSBhc2VfcCAtIHZhbHVlLmRhdGEoKTsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNvZGVjX3NwZWNfY29uZiA9Ci0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmJlZ2luKCkgKyBudW1faGFuZGxlZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuYmVnaW4oKSArIG51bV9oYW5kbGVkX2J5dGVzICsgY29kZWNfc3BlY19wYXJhbV9sZW4pOwotICAgICAgICAgICAgYXNlX3AgKz0gY29kZWNfc3BlY19wYXJhbV9sZW47Ci0KLSAgICAgICAgICAgIC8vIFNvbWUgaW5pdGlhbCBRb1Mgc2V0dGluZ3MKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmZyYW1pbmcgPQotICAgICAgICAgICAgICAgIGFzY3M6OmtBc2VQYXJhbUZyYW1pbmdVbmZyYW1lZFN1cHBvcnRlZDsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9yZXRyYW5zX25iID0gMHgwNDsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLm1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IDB4MDAwNTsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZXNfZGVsYXlfbWluID0gMHhBQkFCQUI7Ci0gICAgICAgICAgICBjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5wcmVzX2RlbGF5X21heCA9IDB4Q0RDRENEOwotICAgICAgICAgICAgY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMucHJlZmVycmVkX3ByZXNfZGVsYXlfbWluID0KLSAgICAgICAgICAgICAgICB0eXBlczo6a1ByZXNEZWxheU5vUHJlZmVyZW5jZTsKLSAgICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZWZlcnJlZF9wcmVzX2RlbGF5X21heCA9Ci0gICAgICAgICAgICAgICAgdHlwZXM6OmtQcmVzRGVsYXlOb1ByZWZlcmVuY2U7Ci0KLSAgICAgICAgICAgIGlmIChjYWNoaW5nKSB7Ci0gICAgICAgICAgICAgIGNhY2hlZF9jb2RlY19jb25maWd1cmF0aW9uX21hcF9bYXNlX2lkXSA9Ci0gICAgICAgICAgICAgICAgICBjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEluamVjdEFzZVN0YXRlTm90aWZpY2F0aW9uKGFzZSwgZGV2aWNlLCBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3M6OmtBc2VTdGF0ZUNvZGVjQ29uZmlndXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICB9Ci0KLSAgdm9pZCBQcmVwYXJlQ29uZmlndXJlUW9zSGFuZGxlcihMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJpZnlfYXNlX2NvdW50ID0gMCkgewotICAgIGFzZV9jdHBfaGFuZGxlcnNbYXNjczo6a0FzZUN0cE9wY29kZUNvbmZpZ3VyZVFvc10gPQotICAgICAgICBbZ3JvdXAsIHZlcmlmeV9hc2VfY291bnRdKExlQXVkaW9EZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gICAgICAgICAgYXV0byBudW1fYXNlID0gdmFsdWVbMV07Ci0KLSAgICAgICAgICAvLyBWZXJpZnkgYXNlIGNvdW50IGlmIG5lZWRlZAotICAgICAgICAgIGlmICh2ZXJpZnlfYXNlX2NvdW50KSBBU1NFUlRfRVEodmVyaWZ5X2FzZV9jb3VudCwgbnVtX2FzZSk7Ci0KLSAgICAgICAgICAvLyBJbmplY3QgQ29uZmlndXJlZCBRb1Mgc3RhdGUgbm90aWZpY2F0aW9uIGZvciBlYWNoIHJlcXVlc3RlZCBBU0UKLSAgICAgICAgICBhdXRvKiBhc2VfcCA9ICZ2YWx1ZVsyXTsKLSAgICAgICAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDwgbnVtX2FzZTsgKytpKSB7Ci0gICAgICAgICAgICBjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zCi0gICAgICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zOwotCi0gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgQVNFIElEICAqLwotICAgICAgICAgICAgYXV0byBhc2VfaWQgPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT5hc2VzXy5iZWdpbigpLCBkZXZpY2UtPmFzZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgIFthc2VfaWRdKGF1dG8mIGFzZSkgeyByZXR1cm4gKGFzZS5pZCA9PSBhc2VfaWQpOyB9KTsKLSAgICAgICAgICAgIEFTU0VSVF9ORShpdCwgZGV2aWNlLT5hc2VzXy5lbmQoKSk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGFzZSA9ICYoKml0KTsKLQotICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNpZ19pZCA9ICphc2VfcCsrOwotICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLmNpc19pZCA9ICphc2VfcCsrOwotCi0gICAgICAgICAgICBxb3NfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMuc2R1X2ludGVydmFsID0KLSAgICAgICAgICAgICAgICAodWludDMyX3QpKChhc2VfcFswXSA8PCAxNikgfCAoYXNlX3BbMV0gPDwgOCkgfCBhc2VfcFsyXSk7Ci0gICAgICAgICAgICBhc2VfcCArPSAzOwotCi0gICAgICAgICAgICBxb3NfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMuZnJhbWluZyA9ICphc2VfcCsrOwotICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnBoeSA9ICphc2VfcCsrOwotICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLm1heF9zZHUgPQotICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKGFzZV9wWzBdIDw8IDgpIHwgYXNlX3BbMV0pOwotICAgICAgICAgICAgYXNlX3AgKz0gMjsKLQotICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnJldHJhbnNfbmIgPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIHFvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPQotICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKGFzZV9wWzBdIDw8IDgpIHwgYXNlX3BbMV0pOwotICAgICAgICAgICAgYXNlX3AgKz0gMjsKLQotICAgICAgICAgICAgcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zLnByZXNfZGVsYXkgPQotICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKGFzZV9wWzBdIDw8IDE2KSB8IChhc2VfcFsxXSA8PCA4KSB8IGFzZV9wWzJdKTsKLSAgICAgICAgICAgIGFzZV9wICs9IDM7Ci0KLSAgICAgICAgICAgIEluamVjdEFzZVN0YXRlTm90aWZpY2F0aW9uKGFzZSwgZGV2aWNlLCBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3M6OmtBc2VTdGF0ZVFvU0NvbmZpZ3VyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gIH0KLQotICB2b2lkIFByZXBhcmVFbmFibGVIYW5kbGVyKExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsIGludCB2ZXJpZnlfYXNlX2NvdW50ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluamVjdF9lbmFibGluZyA9IHRydWUpIHsKLSAgICBhc2VfY3RwX2hhbmRsZXJzW2FzY3M6OmtBc2VDdHBPcGNvZGVFbmFibGVdID0KLSAgICAgICAgW2dyb3VwLCB2ZXJpZnlfYXNlX2NvdW50LCBpbmplY3RfZW5hYmxpbmddKAotICAgICAgICAgICAgTGVBdWRpb0RldmljZSogZGV2aWNlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgICAgICAgICBhdXRvIG51bV9hc2UgPSB2YWx1ZVsxXTsKLQotICAgICAgICAgIC8vIFZlcmlmeSBhc2UgY291bnQgaWYgbmVlZGVkCi0gICAgICAgICAgaWYgKHZlcmlmeV9hc2VfY291bnQpIEFTU0VSVF9FUSh2ZXJpZnlfYXNlX2NvdW50LCBudW1fYXNlKTsKLQotICAgICAgICAgIC8vIEluamVjdCBTdHJlYW1pbmcgQVNFIHN0YXRlIG5vdGlmaWNhdGlvbiBmb3IgZWFjaCByZXF1ZXN0ZWQgQVNFCi0gICAgICAgICAgYXV0byogYXNlX3AgPSAmdmFsdWVbMl07Ci0gICAgICAgICAgZm9yIChhdXRvIGkgPSAwdTsgaSA8IG51bV9hc2U7ICsraSkgewotICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIEFTRSBJRCAgKi8KLSAgICAgICAgICAgIGF1dG8gYXNlX2lkID0gKmFzZV9wKys7Ci0gICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAotICAgICAgICAgICAgICAgIGRldmljZS0+YXNlc18uYmVnaW4oKSwgZGV2aWNlLT5hc2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICBbYXNlX2lkXShhdXRvJiBhc2UpIHsgcmV0dXJuIChhc2UuaWQgPT0gYXNlX2lkKTsgfSk7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoaXQsIGRldmljZS0+YXNlc18uZW5kKCkpOwotICAgICAgICAgICAgY29uc3QgYXV0byBhc2UgPSAmKCppdCk7Ci0KLSAgICAgICAgICAgIGF1dG8gbWV0YV9sZW4gPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIGF1dG8gbnVtX2hhbmRsZWRfYnl0ZXMgPSBhc2VfcCAtIHZhbHVlLmRhdGEoKTsKLSAgICAgICAgICAgIGFzZV9wICs9IG51bV9oYW5kbGVkX2J5dGVzOwotCi0gICAgICAgICAgICBjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfdHJhbnNpZW50X3N0YXRlX3BhcmFtcyBlbmFibGVfcGFyYW1zID0gewotICAgICAgICAgICAgICAgIC5tZXRhZGF0YSA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5iZWdpbigpICsgbnVtX2hhbmRsZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmJlZ2luKCkgKyBudW1faGFuZGxlZF9ieXRlcyArIG1ldGFfbGVuKX07Ci0KLSAgICAgICAgICAgIC8vIFNlcnZlciBkb2VzIHRoZSAnUmVjZWl2ZXJTdGFydFJlYWR5JyBvbiBpdHMgb3duIC0gZ29lcyB0bwotICAgICAgICAgICAgLy8gU3RyZWFtaW5nLCB3aGVuIGluIFNpbmsgcm9sZQotICAgICAgICAgICAgaWYgKGFzZS0+ZGlyZWN0aW9uICYgbGVfYXVkaW86OnR5cGVzOjprTGVBdWRpb0RpcmVjdGlvblNpbmspIHsKLSAgICAgICAgICAgICAgaWYgKGluamVjdF9lbmFibGluZykKLSAgICAgICAgICAgICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbihhc2UsIGRldmljZSwgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjczo6a0FzZVN0YXRlRW5hYmxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZV9wYXJhbXMpOwotICAgICAgICAgICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgICAgICAgIGFzZSwgZGV2aWNlLCBncm91cCwgYXNjczo6a0FzZVN0YXRlU3RyZWFtaW5nLCAmZW5hYmxlX3BhcmFtcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgICAgICAgIGFzZSwgZGV2aWNlLCBncm91cCwgYXNjczo6a0FzZVN0YXRlRW5hYmxpbmcsICZlbmFibGVfcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gIH0KLQotICB2b2lkIFByZXBhcmVEaXNhYmxlSGFuZGxlcihMZUF1ZGlvRGV2aWNlR3JvdXAqIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyaWZ5X2FzZV9jb3VudCA9IDApIHsKLSAgICBhc2VfY3RwX2hhbmRsZXJzW2FzY3M6OmtBc2VDdHBPcGNvZGVEaXNhYmxlXSA9Ci0gICAgICAgIFtncm91cCwgdmVyaWZ5X2FzZV9jb3VudF0oTGVBdWRpb0RldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgICAgICAgICBhdXRvIG51bV9hc2UgPSB2YWx1ZVsxXTsKLQotICAgICAgICAgIC8vIFZlcmlmeSBhc2UgY291bnQgaWYgbmVlZGVkCi0gICAgICAgICAgaWYgKHZlcmlmeV9hc2VfY291bnQpIEFTU0VSVF9FUSh2ZXJpZnlfYXNlX2NvdW50LCBudW1fYXNlKTsKLSAgICAgICAgICBBU1NFUlRfRVEodmFsdWUuc2l6ZSgpLCAydWwgKyBudW1fYXNlKTsKLQotICAgICAgICAgIC8vIEluamVjdCBEaXNhYmxpbmcgJiBRb1MgQ29uZi4gQVNFIHN0YXRlIG5vdGlmaWNhdGlvbiBmb3IgZWFjaCBBU0UKLSAgICAgICAgICBhdXRvKiBhc2VfcCA9ICZ2YWx1ZVsyXTsKLSAgICAgICAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDwgbnVtX2FzZTsgKytpKSB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgQVNFIElEICAqLwotICAgICAgICAgICAgYXV0byBhc2VfaWQgPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT5hc2VzXy5iZWdpbigpLCBkZXZpY2UtPmFzZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgIFthc2VfaWRdKGF1dG8mIGFzZSkgeyByZXR1cm4gKGFzZS5pZCA9PSBhc2VfaWQpOyB9KTsKLSAgICAgICAgICAgIEFTU0VSVF9ORShpdCwgZGV2aWNlLT5hc2VzXy5lbmQoKSk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGFzZSA9ICYoKml0KTsKLQotICAgICAgICAgICAgLy8gVGhlIERpc2FibGluZyBzdGF0ZSBpcyBwcmVzZW50IGZvciBTb3VyY2UgQVNFCi0gICAgICAgICAgICBpZiAoYXNlLT5kaXJlY3Rpb24gJiBsZV9hdWRpbzo6dHlwZXM6OmtMZUF1ZGlvRGlyZWN0aW9uU291cmNlKSB7Ci0gICAgICAgICAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV90cmFuc2llbnRfc3RhdGVfcGFyYW1zIGRpc2FibGluZ19wYXJhbXMgPQotICAgICAgICAgICAgICAgICAgey5tZXRhZGF0YSA9IHt9fTsKLSAgICAgICAgICAgICAgSW5qZWN0QXNlU3RhdGVOb3RpZmljYXRpb24oYXNlLCBkZXZpY2UsIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzOjprQXNlU3RhdGVEaXNhYmxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNhYmxpbmdfcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2VydmVyIGRvZXMgdGhlICdSZWNlaXZlclN0b3BSZWFkeScgb24gaXRzIG93biAtIGdvZXMgdG8KLSAgICAgICAgICAgIC8vIFN0cmVhbWluZywgd2hlbiBpbiBTaW5rIHJvbGUKLSAgICAgICAgICAgIGlmIChhc2UtPmRpcmVjdGlvbiAmIGxlX2F1ZGlvOjp0eXBlczo6a0xlQXVkaW9EaXJlY3Rpb25TaW5rKSB7Ci0gICAgICAgICAgICAgIC8vIEZJWE1FOiBGb3Igbm93IG91ciBmYWtlIHBlZXIgZG9lcyBub3QgcmVtZW1iZXIgcW9zIHBhcmFtcwotICAgICAgICAgICAgICBjbGllbnRfcGFyc2VyOjphc2NzOjphc2VfcW9zX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zCi0gICAgICAgICAgICAgICAgICBxb3NfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXM7Ci0gICAgICAgICAgICAgIEluamVjdEFzZVN0YXRlTm90aWZpY2F0aW9uKGFzZSwgZGV2aWNlLCBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjczo6a0FzZVN0YXRlUW9TQ29uZmlndXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICB9Ci0KLSAgdm9pZCBQcmVwYXJlUmVjZWl2ZXJTdGFydFJlYWR5KExlQXVkaW9EZXZpY2VHcm91cCogZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyaWZ5X2FzZV9jb3VudCA9IDApIHsKLSAgICBhc2VfY3RwX2hhbmRsZXJzW2FzY3M6OmtBc2VDdHBPcGNvZGVSZWNlaXZlclN0YXJ0UmVhZHldID0KLSAgICAgICAgW2dyb3VwLCB2ZXJpZnlfYXNlX2NvdW50XShMZUF1ZGlvRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICAgICAgICAgIGF1dG8gbnVtX2FzZSA9IHZhbHVlWzFdOwotCi0gICAgICAgICAgLy8gVmVyaWZ5IGFzZSBjb3VudCBpZiBuZWVkZWQKLSAgICAgICAgICBpZiAodmVyaWZ5X2FzZV9jb3VudCkgQVNTRVJUX0VRKHZlcmlmeV9hc2VfY291bnQsIG51bV9hc2UpOwotCi0gICAgICAgICAgLy8gSW5qZWN0IFN0cmVhbWluZyBBU0Ugc3RhdGUgbm90aWZpY2F0aW9uIGZvciBlYWNoIFNvdXJjZSBBU0UKLSAgICAgICAgICBhdXRvKiBhc2VfcCA9ICZ2YWx1ZVsyXTsKLSAgICAgICAgICBmb3IgKGF1dG8gaSA9IDB1OyBpIDwgbnVtX2FzZTsgKytpKSB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgQVNFIElEICAqLwotICAgICAgICAgICAgYXV0byBhc2VfaWQgPSAqYXNlX3ArKzsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT5hc2VzXy5iZWdpbigpLCBkZXZpY2UtPmFzZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgIFthc2VfaWRdKGF1dG8mIGFzZSkgeyByZXR1cm4gKGFzZS5pZCA9PSBhc2VfaWQpOyB9KTsKLSAgICAgICAgICAgIEFTU0VSVF9ORShpdCwgZGV2aWNlLT5hc2VzXy5lbmQoKSk7Ci0KLSAgICAgICAgICAgIC8vIE9uY2Ugd2UgZGlkIHRoZSAnUmVjZWl2ZXJTdGFydFJlYWR5JyB0aGUgc2VydmVyIGdvZXMgdG8KLSAgICAgICAgICAgIC8vIFN0cmVhbWluZywgd2hlbiBpbiBTb3VyY2Ugcm9sZQotICAgICAgICAgICAgYXV0byBtZXRhX2xlbiA9ICphc2VfcCsrOwotICAgICAgICAgICAgYXV0byBudW1faGFuZGxlZF9ieXRlcyA9IGFzZV9wIC0gdmFsdWUuZGF0YSgpOwotICAgICAgICAgICAgYXNlX3AgKz0gbnVtX2hhbmRsZWRfYnl0ZXM7Ci0KLSAgICAgICAgICAgIGNvbnN0IGF1dG8mIGFzZSA9ICYoKml0KTsKLSAgICAgICAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV90cmFuc2llbnRfc3RhdGVfcGFyYW1zIGVuYWJsZV9wYXJhbXMgPSB7Ci0gICAgICAgICAgICAgICAgLm1ldGFkYXRhID0gc3RkOjp2ZWN0b3I8dWludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmJlZ2luKCkgKyBudW1faGFuZGxlZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuYmVnaW4oKSArIG51bV9oYW5kbGVkX2J5dGVzICsgbWV0YV9sZW4pfTsKLSAgICAgICAgICAgIEluamVjdEFzZVN0YXRlTm90aWZpY2F0aW9uKAotICAgICAgICAgICAgICAgIGFzZSwgZGV2aWNlLCBncm91cCwgYXNjczo6a0FzZVN0YXRlU3RyZWFtaW5nLCAmZW5hYmxlX3BhcmFtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICB9Ci0KLSAgdm9pZCBQcmVwYXJlUmVjZWl2ZXJTdG9wUmVhZHkoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcmlmeV9hc2VfY291bnQgPSAwKSB7Ci0gICAgYXNlX2N0cF9oYW5kbGVyc1thc2NzOjprQXNlQ3RwT3Bjb2RlUmVjZWl2ZXJTdG9wUmVhZHldID0KLSAgICAgICAgW2dyb3VwLCB2ZXJpZnlfYXNlX2NvdW50XShMZUF1ZGlvRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICAgICAgICAgIGF1dG8gbnVtX2FzZSA9IHZhbHVlWzFdOwotCi0gICAgICAgICAgLy8gVmVyaWZ5IGFzZSBjb3VudCBpZiBuZWVkZWQKLSAgICAgICAgICBpZiAodmVyaWZ5X2FzZV9jb3VudCkgQVNTRVJUX0VRKHZlcmlmeV9hc2VfY291bnQsIG51bV9hc2UpOwotCi0gICAgICAgICAgLy8gSW5qZWN0IFFvUyBjb25maWd1cmVkIEFTRSBzdGF0ZSBub3RpZmljYXRpb24gZm9yIGVhY2ggU291cmNlIEFTRQotICAgICAgICAgIGF1dG8qIGFzZV9wID0gJnZhbHVlWzJdOwotICAgICAgICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBudW1fYXNlOyArK2kpIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBBU0UgSUQgICovCi0gICAgICAgICAgICBhdXRvIGFzZV9pZCA9ICphc2VfcCsrOwotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKLSAgICAgICAgICAgICAgICBkZXZpY2UtPmFzZXNfLmJlZ2luKCksIGRldmljZS0+YXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgW2FzZV9pZF0oYXV0byYgYXNlKSB7IHJldHVybiAoYXNlLmlkID09IGFzZV9pZCk7IH0pOwotICAgICAgICAgICAgQVNTRVJUX05FKGl0LCBkZXZpY2UtPmFzZXNfLmVuZCgpKTsKLQotICAgICAgICAgICAgY29uc3QgYXV0byYgYXNlID0gJigqaXQpOwotCi0gICAgICAgICAgICAvLyBGSVhNRTogRm9yIG5vdyBvdXIgZmFrZSBwZWVyIGRvZXMgbm90IHJlbWVtYmVyIHFvcyBwYXJhbXMKLSAgICAgICAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9xb3NfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMKLSAgICAgICAgICAgICAgICBxb3NfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXM7Ci0gICAgICAgICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbihhc2UsIGRldmljZSwgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzOjprQXNlU3RhdGVRb1NDb25maWd1cmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFvc19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICB9Ci0KLSAgdm9pZCBQcmVwYXJlUmVsZWFzZUhhbmRsZXIoTGVBdWRpb0RldmljZUdyb3VwKiBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcmlmeV9hc2VfY291bnQgPSAwKSB7Ci0gICAgYXNlX2N0cF9oYW5kbGVyc1thc2NzOjprQXNlQ3RwT3Bjb2RlUmVsZWFzZV0gPQotICAgICAgICBbZ3JvdXAsIHZlcmlmeV9hc2VfY291bnQsIHRoaXNdKExlQXVkaW9EZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gICAgICAgICAgYXV0byBudW1fYXNlID0gdmFsdWVbMV07Ci0KLSAgICAgICAgICAvLyBWZXJpZnkgYXNlIGNvdW50IGlmIG5lZWRlZAotICAgICAgICAgIGlmICh2ZXJpZnlfYXNlX2NvdW50KSBBU1NFUlRfRVEodmVyaWZ5X2FzZV9jb3VudCwgbnVtX2FzZSk7Ci0gICAgICAgICAgQVNTRVJUX0VRKHZhbHVlLnNpemUoKSwgMnVsICsgbnVtX2FzZSk7Ci0KLSAgICAgICAgICAvLyBJbmplY3QgUmVsZWFzaW5nICYgSWRsZSBBU0Ugc3RhdGUgbm90aWZpY2F0aW9uIGZvciBlYWNoIEFTRQotICAgICAgICAgIGF1dG8qIGFzZV9wID0gJnZhbHVlWzJdOwotICAgICAgICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBudW1fYXNlOyArK2kpIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBBU0UgSUQgICovCi0gICAgICAgICAgICBhdXRvIGFzZV9pZCA9ICphc2VfcCsrOwotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKLSAgICAgICAgICAgICAgICBkZXZpY2UtPmFzZXNfLmJlZ2luKCksIGRldmljZS0+YXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgW2FzZV9pZF0oYXV0byYgYXNlKSB7IHJldHVybiAoYXNlLmlkID09IGFzZV9pZCk7IH0pOwotICAgICAgICAgICAgQVNTRVJUX05FKGl0LCBkZXZpY2UtPmFzZXNfLmVuZCgpKTsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gYXNlID0gJigqaXQpOwotCi0gICAgICAgICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbihhc2UsIGRldmljZSwgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzOjprQXNlU3RhdGVSZWxlYXNpbmcsIG51bGxwdHIpOwotCi0gICAgICAgICAgICAvKiBDaGVjayBpZiBjb2RlYyBjb25maWd1cmF0aW9uIGlzIGNhY2hlZCAqLwotICAgICAgICAgICAgaWYgKGNhY2hlZF9jb2RlY19jb25maWd1cmF0aW9uX21hcF8uY291bnQoYXNlX2lkKSA+IDApIHsKLSAgICAgICAgICAgICAgSW5qZWN0QXNlU3RhdGVOb3RpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgICBhc2UsIGRldmljZSwgZ3JvdXAsIGFzY3M6OmtBc2VTdGF0ZUNvZGVjQ29uZmlndXJlZCwKLSAgICAgICAgICAgICAgICAgICZjYWNoZWRfY29kZWNfY29uZmlndXJhdGlvbl9tYXBfW2FzZV9pZF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgLy8gUmVsZWFzZSAtIG5vIGNhY2hpbmcKLSAgICAgICAgICAgICAgSW5qZWN0QXNlU3RhdGVOb3RpZmljYXRpb24oYXNlLCBkZXZpY2UsIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzOjprQXNlU3RhdGVJZGxlLCBudWxscHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gIH0KLQotICBjb250cm9sbGVyOjpNb2NrQ29udHJvbGxlckludGVyZmFjZSBtb2NrX2NvbnRyb2xsZXJfOwotICBibHVldG9vdGg6Om1hbmFnZXI6Ok1vY2tCdG1JbnRlcmZhY2UgYnRtX2ludGVyZmFjZTsKLSAgZ2F0dDo6TW9ja0J0YUdhdHRJbnRlcmZhY2UgZ2F0dF9pbnRlcmZhY2U7Ci0gIGdhdHQ6Ok1vY2tCdGFHYXR0UXVldWUgZ2F0dF9xdWV1ZTsKLQotICBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlciogaXNvX21hbmFnZXJfOwotICBNb2NrSXNvTWFuYWdlciogbW9ja19pc29fbWFuYWdlcl87Ci0KLSAgc3RkOjpmdW5jdGlvbjx2b2lkKExlQXVkaW9EZXZpY2UqIGRldmljZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKT4KLSAgICAgIGFzZV9jdHBfaGFuZGxlcnNbYXNjczo6a0FzZUN0cE9wY29kZU1heFZhbCArIDFdID0ge251bGxwdHJ9OwotICBzdGQ6Om1hcDxpbnQsIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9jb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcz4KLSAgICAgIGNhY2hlZF9jb2RlY19jb25maWd1cmF0aW9uX21hcF87Ci0KLSAgTW9ja0xlQXVkaW9Hcm91cFN0YXRlTWFjaGluZUNhbGxiYWNrcyBtb2NrX2NhbGxiYWNrc187Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxMZUF1ZGlvRGV2aWNlPj4gbGVfYXVkaW9fZGV2aWNlc187Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QsIHN0ZDo6dW5pcXVlX3B0cjxMZUF1ZGlvRGV2aWNlR3JvdXA+PgotICAgICAgbGVfYXVkaW9fZGV2aWNlX2dyb3Vwc187Ci19OwotCi1URVNUX0YoU3RhdGVNYWNoaW5lVGVzdCwgdGVzdEluaXQpIHsKLSAgQVNTRVJUX05FKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCksIG51bGxwdHIpOwotfQotCi1URVNUX0YoU3RhdGVNYWNoaW5lVGVzdCwgdGVzdENsZWFudXApIHsKLSAgQVNTRVJUX05FKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCksIG51bGxwdHIpOwotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkNsZWFudXAoKTsKLSAgRVhQRUNUX0RFQVRIKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCksICIiKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RDb25maWd1cmVDb2RlY1NpbmdsZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZVJpbmd0b25lOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDI7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggUmluZ3RvbmUgY29udGV4dCBpbiBtaW5kLCBvbmx5IG9uZSBBU0UKLSAgICogc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgYXV0byogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwLCAxKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoMik7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIEFTU0VSVF9UUlVFKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0YXJ0U3RyZWFtKAotICAgICAgZ3JvdXAsIHN0YXRpY19jYXN0PHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU+KGNvbnRleHRfdHlwZSkpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RDb25maWd1cmVDb2RlY011bHRpKSB7Ci0gIGNvbnN0IGF1dG8gY29udGV4dF90eXBlID0ga0NvbnRleHRUeXBlTWVkaWE7Ci0gIGNvbnN0IGF1dG8gbGVhdWRpb19ncm91cF9pZCA9IDI7Ci0gIGNvbnN0IGF1dG8gbnVtX2RldmljZXMgPSAyOwotCi0gIC8vIFByZXBhcmUgbXVsdGlwbGUgZmFrZSBjb25uZWN0ZWQgZGV2aWNlcyBpbiBhIGdyb3VwCi0gIGF1dG8qIGdyb3VwID0KLSAgICAgIFByZXBhcmVTaW5nbGVUZXN0RGV2aWNlR3JvdXAobGVhdWRpb19ncm91cF9pZCwgY29udGV4dF90eXBlLCBudW1fZGV2aWNlcyk7Ci0gIEFTU0VSVF9FUShncm91cC0+U2l6ZSgpLCBudW1fZGV2aWNlcyk7Ci0KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCk7Ci0KLSAgYXV0byBleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4gPSAwOwotICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7Ci0gIHdoaWxlIChsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAgIC5UaW1lcyhBdExlYXN0KDEpKTsKLSAgICBleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4rKzsKLSAgICBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHREZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiwgbnVtX2RldmljZXMpOwotCi0gIEluamVjdEluaXRpYWxJZGxlTm90aWZpY2F0aW9uKGdyb3VwKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIHRoZSBjb250ZW50Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0YXJ0U3RyZWFtKAotICAgICAgZ3JvdXAsIHN0YXRpY19jYXN0PHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU+KGNvbnRleHRfdHlwZSkpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RDb25maWd1cmVRb3NTaW5nbGUpIHsKLSAgY29uc3QgYXV0byBjb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVSaW5ndG9uZTsKLSAgY29uc3QgaW50IGxlYXVkaW9fZ3JvdXBfaWQgPSAzOwotCi0gIC8vIFByZXBhcmUgZmFrZSBjb25uZWN0ZWQgZGV2aWNlIGdyb3VwCi0gIGF1dG8qIGdyb3VwID0gUHJlcGFyZVNpbmdsZVRlc3REZXZpY2VHcm91cChsZWF1ZGlvX2dyb3VwX2lkLCBjb250ZXh0X3R5cGUpOwotCi0gIC8qIFNpbmNlIHdlIHByZXBhcmVkIGRldmljZSB3aXRoIFJpbmd0b25lIGNvbnRleHQgaW4gbWluZCwgb25seSBvbmUgQVNFCi0gICAqIHNob3VsZCBoYXZlIGJlZW4gY29uZmlndXJlZC4KLSAgICovCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMSk7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAxKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoMyk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMCk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIEFTU0VSVF9UUlVFKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0YXJ0U3RyZWFtKAotICAgICAgZ3JvdXAsIHN0YXRpY19jYXN0PHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU+KGNvbnRleHRfdHlwZSkpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0Q29uZmlndXJlUW9zTXVsdGlwbGUpIHsKLSAgY29uc3QgYXV0byBjb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVNZWRpYTsKLSAgY29uc3QgYXV0byBsZWF1ZGlvX2dyb3VwX2lkID0gMzsKLSAgY29uc3QgYXV0byBudW1fZGV2aWNlcyA9IDI7Ci0KLSAgLy8gUHJlcGFyZSBtdWx0aXBsZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2VzIGluIGEgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPQotICAgICAgUHJlcGFyZVNpbmdsZVRlc3REZXZpY2VHcm91cChsZWF1ZGlvX2dyb3VwX2lkLCBjb250ZXh0X3R5cGUsIG51bV9kZXZpY2VzKTsKLSAgQVNTRVJUX0VRKGdyb3VwLT5TaXplKCksIG51bV9kZXZpY2VzKTsKLQotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXApOwotCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgYXV0byBleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4gPSAwOwotICB3aGlsZSAobGVBdWRpb0RldmljZSkgewotICAgIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYyhsZUF1ZGlvRGV2aWNlLT5jb25uX2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLCBfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIF8sIF8pKQotICAgICAgICAuVGltZXMoQXRMZWFzdCgyKSk7Ci0gICAgZXhwZWN0ZWRfZGV2aWNlc193cml0dGVuKys7Ci0gICAgbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGxlQXVkaW9EZXZpY2UpOwotICB9Ci0gIEFTU0VSVF9FUShleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4sIG51bV9kZXZpY2VzKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIENyZWF0ZUNpZyhfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRXN0YWJsaXNoQ2lzKF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBTZXR1cElzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRGlzY29ubmVjdENpcyhfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlQ2lnKF8pKS5UaW1lcygwKTsKLQotICBJbmplY3RJbml0aWFsSWRsZU5vdGlmaWNhdGlvbihncm91cCk7Ci0KLSAgLy8gU3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHN0cmVhbSBNZWRpYSBjb250ZW50Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0YXJ0U3RyZWFtKAotICAgICAgZ3JvdXAsIHN0YXRpY19jYXN0PHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU+KGNvbnRleHRfdHlwZSkpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0U3RyZWFtU2luZ2xlKSB7Ci0gIGNvbnN0IGF1dG8gY29udGV4dF90eXBlID0ga0NvbnRleHRUeXBlUmluZ3RvbmU7Ci0gIGNvbnN0IGludCBsZWF1ZGlvX2dyb3VwX2lkID0gNDsKLQotICAvLyBQcmVwYXJlIGZha2UgY29ubmVjdGVkIGRldmljZSBncm91cAotICBhdXRvKiBncm91cCA9IFByZXBhcmVTaW5nbGVUZXN0RGV2aWNlR3JvdXAobGVhdWRpb19ncm91cF9pZCwgY29udGV4dF90eXBlKTsKLQotICAvKiBTaW5jZSB3ZSBwcmVwYXJlZCBkZXZpY2Ugd2l0aCBSaW5ndG9uZSBjb250ZXh0IGluIG1pbmQsIG9ubHkgb25lIEFTRQotICAgKiBzaG91bGQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCi0gICAqLwotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwLCAxKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCwgMSk7Ci0KLSAgYXV0byogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBFWFBFQ1RfQ0FMTChnYXR0X3F1ZXVlLAotICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKDEsIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLCBfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfTk9fUlNQLCBfLCBfKSkKLSAgICAgIC5UaW1lcygzKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIENyZWF0ZUNpZyhfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRXN0YWJsaXNoQ2lzKF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBTZXR1cElzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRGlzY29ubmVjdENpcyhfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlQ2lnKF8pKS5UaW1lcygwKTsKLQotICBJbmplY3RJbml0aWFsSWRsZU5vdGlmaWNhdGlvbihncm91cCk7Ci0KLSAgLy8gVmFsaWRhdGUgR3JvdXBTdHJlYW1TdGF0dXMKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2NhbGxiYWNrc18sCi0gICAgICBTdGF0dXNSZXBvcnRDYihsZWF1ZGlvX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdHJlYW1TdGF0dXM6OlNUUkVBTUlORykpOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBBU1NFUlRfVFJVRShMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb25lZCB0byBhIHByb3BlciBzdGF0ZQotICBBU1NFUlRfRVEoZ3JvdXAtPkdldFN0YXRlKCksCi0gICAgICAgICAgICB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RTdHJlYW1Ta2lwRW5hYmxpbmdTaW5rKSB7Ci0gIGNvbnN0IGF1dG8gY29udGV4dF90eXBlID0ga0NvbnRleHRUeXBlUmluZ3RvbmU7Ci0gIGNvbnN0IGludCBsZWF1ZGlvX2dyb3VwX2lkID0gNDsKLQotICAvLyBQcmVwYXJlIGZha2UgY29ubmVjdGVkIGRldmljZSBncm91cAotICBhdXRvKiBncm91cCA9IFByZXBhcmVTaW5nbGVUZXN0RGV2aWNlR3JvdXAobGVhdWRpb19ncm91cF9pZCwgY29udGV4dF90eXBlKTsKLQotICAvKiBTaW5jZSB3ZSBwcmVwYXJlZCBkZXZpY2Ugd2l0aCBSaW5ndG9uZSBjb250ZXh0IGluIG1pbmQsIG9ubHkgb25lIEFTRQotICAgKiBzaG91bGQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCi0gICAqLwotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwLCAxKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCwgMSwgZmFsc2UpOwotCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoMyk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMCk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIC8vIFZhbGlkYXRlIEdyb3VwU3RyZWFtU3RhdHVzCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19jYWxsYmFja3NfLAotICAgICAgU3RhdHVzUmVwb3J0Q2IobGVhdWRpb19ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzOjpTVFJFQU1JTkcpKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgQVNTRVJUX1RSVUUoTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3RhcnRTdHJlYW0oCi0gICAgICBncm91cCwgc3RhdGljX2Nhc3Q8dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZT4oY29udGV4dF90eXBlKSkpOwotCi0gIC8vIENoZWNrIGlmIGdyb3VwIGhhcyB0cmFuc2l0aW9uZWQgdG8gYSBwcm9wZXIgc3RhdGUKLSAgQVNTRVJUX0VRKGdyb3VwLT5HZXRTdGF0ZSgpLAotICAgICAgICAgICAgdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORyk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0U3RyZWFtU2tpcEVuYWJsaW5nU2lua1NvdXJjZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggQ29udmVyc2lvbmFsIGNvbnRleHQgaW4gbWluZCwgb25lIFNpbmsgQVNFCi0gICAqIGFuZCBvbmUgU291cmNlIEFTRSBzaG91bGQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCi0gICAqLwotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwLCAyKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCwgMiwgZmFsc2UpOwotICBQcmVwYXJlUmVjZWl2ZXJTdGFydFJlYWR5KGdyb3VwLCAxKTsKLQotICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7Ci0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWMoMSwgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIF8sIF8pKQotICAgICAgLlRpbWVzKDQpOwotCi0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDApOwotCi0gIEluamVjdEluaXRpYWxJZGxlTm90aWZpY2F0aW9uKGdyb3VwKTsKLQotICAvLyBWYWxpZGF0ZSBHcm91cFN0cmVhbVN0YXR1cwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2FsbGJhY2tzXywKLSAgICAgIFN0YXR1c1JlcG9ydENiKGxlYXVkaW9fZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmxlX2F1ZGlvOjpHcm91cFN0cmVhbVN0YXR1czo6U1RSRUFNSU5HKSk7Ci0KLSAgLy8gU3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHN0cmVhbSBNZWRpYSBjb250ZW50Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0YXJ0U3RyZWFtKAotICAgICAgZ3JvdXAsIHN0YXRpY19jYXN0PHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU+KGNvbnRleHRfdHlwZSkpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotfQotCi1URVNUX0YoU3RhdGVNYWNoaW5lVGVzdCwgdGVzdFN0cmVhbU11bHRpcGxlQ29udmVyc2F0aW9uYWwpIHsKLSAgY29uc3QgYXV0byBjb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVDb252ZXJzYXRpb25hbDsKLSAgY29uc3QgYXV0byBsZWF1ZGlvX2dyb3VwX2lkID0gNDsKLSAgY29uc3QgYXV0byBudW1fZGV2aWNlcyA9IDI7Ci0KLSAgLy8gUHJlcGFyZSBtdWx0aXBsZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2VzIGluIGEgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPQotICAgICAgUHJlcGFyZVNpbmdsZVRlc3REZXZpY2VHcm91cChsZWF1ZGlvX2dyb3VwX2lkLCBjb250ZXh0X3R5cGUsIG51bV9kZXZpY2VzKTsKLSAgQVNTRVJUX0VRKGdyb3VwLT5TaXplKCksIG51bV9kZXZpY2VzKTsKLQotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXApOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCk7Ci0gIFByZXBhcmVSZWNlaXZlclN0YXJ0UmVhZHkoZ3JvdXAsIDEpOwotCi0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKEF0TGVhc3QoMSkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDMpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDApOwotCi0gIEluamVjdEluaXRpYWxJZGxlTm90aWZpY2F0aW9uKGdyb3VwKTsKLQotICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7Ci0gIGF1dG8gZXhwZWN0ZWRfZGV2aWNlc193cml0dGVuID0gMDsKLSAgd2hpbGUgKGxlQXVkaW9EZXZpY2UpIHsKLSAgICBFWFBFQ1RfQ0FMTChnYXR0X3F1ZXVlLAotICAgICAgICAgICAgICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWMobGVBdWRpb0RldmljZS0+Y29ubl9pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfTk9fUlNQLCBfLCBfKSkKLSAgICAgICAgLlRpbWVzKEF0TGVhc3QoMykpOwotICAgIGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbisrOwotICAgIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0TmV4dERldmljZShsZUF1ZGlvRGV2aWNlKTsKLSAgfQotICBBU1NFUlRfRVEoZXhwZWN0ZWRfZGV2aWNlc193cml0dGVuLCBudW1fZGV2aWNlcyk7Ci0KLSAgLy8gVmFsaWRhdGUgR3JvdXBTdHJlYW1TdGF0dXMKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2NhbGxiYWNrc18sCi0gICAgICBTdGF0dXNSZXBvcnRDYihsZWF1ZGlvX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdHJlYW1TdGF0dXM6OlNUUkVBTUlORykpOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBBU1NFUlRfVFJVRShMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb25lZCB0byBhIHByb3BlciBzdGF0ZQotICBBU1NFUlRfRVEoZ3JvdXAtPkdldFN0YXRlKCksCi0gICAgICAgICAgICB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RTdHJlYW1NdWx0aXBsZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZU1lZGlhOwotICBjb25zdCBhdXRvIGxlYXVkaW9fZ3JvdXBfaWQgPSA0OwotICBjb25zdCBhdXRvIG51bV9kZXZpY2VzID0gMjsKLQotICAvLyBQcmVwYXJlIG11bHRpcGxlIGZha2UgY29ubmVjdGVkIGRldmljZXMgaW4gYSBncm91cAotICBhdXRvKiBncm91cCA9Ci0gICAgICBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSwgbnVtX2RldmljZXMpOwotICBBU1NFUlRfRVEoZ3JvdXAtPlNpemUoKSwgbnVtX2RldmljZXMpOwotCi0gIFByZXBhcmVDb25maWd1cmVDb2RlY0hhbmRsZXIoZ3JvdXApOwotICBQcmVwYXJlQ29uZmlndXJlUW9zSGFuZGxlcihncm91cCk7Ci0gIFByZXBhcmVFbmFibGVIYW5kbGVyKGdyb3VwKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIENyZWF0ZUNpZyhfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRXN0YWJsaXNoQ2lzKF8pKS5UaW1lcyhBdExlYXN0KDEpKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBTZXR1cElzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygyKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRGlzY29ubmVjdENpcyhfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlQ2lnKF8pKS5UaW1lcygwKTsKLQotICBJbmplY3RJbml0aWFsSWRsZU5vdGlmaWNhdGlvbihncm91cCk7Ci0KLSAgYXV0byogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBhdXRvIGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiA9IDA7Ci0gIHdoaWxlIChsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAgIC5UaW1lcyhBdExlYXN0KDMpKTsKLSAgICBleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4rKzsKLSAgICBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHREZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiwgbnVtX2RldmljZXMpOwotCi0gIC8vIFZhbGlkYXRlIEdyb3VwU3RyZWFtU3RhdHVzCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19jYWxsYmFja3NfLAotICAgICAgU3RhdHVzUmVwb3J0Q2IobGVhdWRpb19ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzOjpTVFJFQU1JTkcpKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgQVNTRVJUX1RSVUUoTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3RhcnRTdHJlYW0oCi0gICAgICBncm91cCwgc3RhdGljX2Nhc3Q8dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZT4oY29udGV4dF90eXBlKSkpOwotCi0gIC8vIENoZWNrIGlmIGdyb3VwIGhhcyB0cmFuc2l0aW9uZWQgdG8gYSBwcm9wZXIgc3RhdGUKLSAgQVNTRVJUX0VRKGdyb3VwLT5HZXRTdGF0ZSgpLAotICAgICAgICAgICAgdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1NUUkVBTUlORyk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0RGlzYWJsZVNpbmdsZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZVJpbmd0b25lOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggUmluZ3RvbmUgY29udGV4dCBpbiBtaW5kLCBvbmx5IG9uZSBBU0UKLSAgICogc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMSk7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAxKTsKLSAgUHJlcGFyZUVuYWJsZUhhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlRGlzYWJsZUhhbmRsZXIoZ3JvdXAsIDEpOwotCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoNCk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMCk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gIC8vIFZhbGlkYXRlIEdyb3VwU3RyZWFtU3RhdHVzCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19jYWxsYmFja3NfLAotICAgICAgU3RhdHVzUmVwb3J0Q2IobGVhdWRpb19ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzOjpTVVNQRU5ERUQpKTsKLQotICAvLyBTdXNwZW5kIHRoZSBzdHJlYW0KLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3VzcGVuZFN0cmVhbShncm91cCk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb24gdG8gYSBwcm9wZXIgc3RhdGUKLSAgQVNTRVJUX0VRKGdyb3VwLT5HZXRTdGF0ZSgpLAotICAgICAgICAgICAgdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3REaXNhYmxlTXVsdGlwbGUpIHsKLSAgY29uc3QgYXV0byBjb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVNZWRpYTsKLSAgY29uc3QgYXV0byBsZWF1ZGlvX2dyb3VwX2lkID0gNDsKLSAgY29uc3QgYXV0byBudW1fZGV2aWNlcyA9IDI7Ci0KLSAgLy8gUHJlcGFyZSBtdWx0aXBsZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2VzIGluIGEgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPQotICAgICAgUHJlcGFyZVNpbmdsZVRlc3REZXZpY2VHcm91cChsZWF1ZGlvX2dyb3VwX2lkLCBjb250ZXh0X3R5cGUsIG51bV9kZXZpY2VzKTsKLSAgQVNTRVJUX0VRKGdyb3VwLT5TaXplKCksIG51bV9kZXZpY2VzKTsKLQotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXApOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCk7Ci0gIFByZXBhcmVEaXNhYmxlSGFuZGxlcihncm91cCk7Ci0KLSAgYXV0byogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBhdXRvIGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiA9IDA7Ci0gIHdoaWxlIChsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAgIC5UaW1lcyhBdExlYXN0KDQpKTsKLSAgICBleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4rKzsKLSAgICBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHREZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiwgbnVtX2RldmljZXMpOwotCi0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygyKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygyKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDApOwotCi0gIEluamVjdEluaXRpYWxJZGxlTm90aWZpY2F0aW9uKGdyb3VwKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3RhcnRTdHJlYW0oCi0gICAgICBncm91cCwgc3RhdGljX2Nhc3Q8dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZT4oY29udGV4dF90eXBlKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb25lZCB0byBhIHByb3BlciBzdGF0ZQotICBBU1NFUlRfRVEoZ3JvdXAtPkdldFN0YXRlKCksCi0gICAgICAgICAgICB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKTsKLQotICAvLyBWYWxpZGF0ZSBHcm91cFN0cmVhbVN0YXR1cwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2FsbGJhY2tzXywKLSAgICAgIFN0YXR1c1JlcG9ydENiKGxlYXVkaW9fZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmxlX2F1ZGlvOjpHcm91cFN0cmVhbVN0YXR1czo6U1VTUEVOREVEKSk7Ci0KLSAgLy8gU3VzcGVuZCB0aGUgc3RyZWFtCi0gIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN1c3BlbmRTdHJlYW0oZ3JvdXApOwotCi0gIC8vIENoZWNrIGlmIGdyb3VwIGhhcyB0cmFuc2l0aW9uZWQgdG8gYSBwcm9wZXIgc3RhdGUKLSAgQVNTRVJUX0VRKGdyb3VwLT5HZXRTdGF0ZSgpLAotICAgICAgICAgICAgdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3REaXNhYmxlQmlkaXJlY3Rpb25hbCkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggQ29udmVyc2lvbmFsIGNvbnRleHQgaW4gbWluZCwgU2luayBhbmQgU291cmNlCi0gICAqIEFTRXMgc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMik7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAyKTsKLSAgUHJlcGFyZUVuYWJsZUhhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlRGlzYWJsZUhhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlUmVjZWl2ZXJTdGFydFJlYWR5KGdyb3VwLCAxKTsKLSAgUHJlcGFyZVJlY2VpdmVyU3RvcFJlYWR5KGdyb3VwLCAxKTsKLQotICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7Ci0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWMoMSwgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIF8sIF8pKQotICAgICAgLlRpbWVzKEF0TGVhc3QoNCkpOwotCi0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDApOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gIC8vIFN1c3BlbmQgdGhlIHN0cmVhbQotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdXNwZW5kU3RyZWFtKGdyb3VwKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9RT1NfQ09ORklHVVJFRCk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0UmVsZWFzZVNpbmdsZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZVJpbmd0b25lOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggUmluZ3RvbmUgY29udGV4dCBpbiBtaW5kLCBvbmx5IG9uZSBBU0UKLSAgICogc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMSk7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAxKTsKLSAgUHJlcGFyZUVuYWJsZUhhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlRGlzYWJsZUhhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlUmVsZWFzZUhhbmRsZXIoZ3JvdXAsIDEpOwotCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoNCk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMSk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gIC8vIFZhbGlkYXRlIEdyb3VwU3RyZWFtU3RhdHVzCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgU3RhdHVzUmVwb3J0Q2IobGVhdWRpb19ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdHJlYW1TdGF0dXM6OklETEUpKTsKLQotICAvLyBTdG9wIHRoZSBzdHJlYW0KLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3RvcFN0cmVhbShncm91cCk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb25lZCB0byBhIHByb3BlciBzdGF0ZQotICBBU1NFUlRfRVEoZ3JvdXAtPkdldFN0YXRlKCksIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9JRExFKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RSZWxlYXNlQ2FjaGluZ1NpbmdsZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZVJpbmd0b25lOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggUmluZ3RvbmUgY29udGV4dCBpbiBtaW5kLCBvbmx5IG9uZSBBU0UKLSAgICogc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMSwgdHJ1ZSk7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAxKTsKLSAgUHJlcGFyZUVuYWJsZUhhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlRGlzYWJsZUhhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlUmVsZWFzZUhhbmRsZXIoZ3JvdXAsIDEpOwotCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoNCk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMSk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIC8vIFZhbGlkYXRlIEdyb3VwU3RyZWFtU3RhdHVzCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgU3RhdHVzUmVwb3J0Q2IobGVhdWRpb19ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdHJlYW1TdGF0dXM6OklETEUpKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2NhbGxiYWNrc18sCi0gICAgICBTdGF0dXNSZXBvcnRDYihsZWF1ZGlvX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdHJlYW1TdGF0dXM6OlNUUkVBTUlORykpOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gIC8vIFN0b3AgdGhlIHN0cmVhbQotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdG9wU3RyZWFtKGdyb3VwKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RTdHJlYW1DYWNoaW5nU2luZ2xlKSB7Ci0gIGNvbnN0IGF1dG8gY29udGV4dF90eXBlID0ga0NvbnRleHRUeXBlUmluZ3RvbmU7Ci0gIGNvbnN0IGludCBsZWF1ZGlvX2dyb3VwX2lkID0gNDsKLQotICAvLyBQcmVwYXJlIGZha2UgY29ubmVjdGVkIGRldmljZSBncm91cAotICBhdXRvKiBncm91cCA9IFByZXBhcmVTaW5nbGVUZXN0RGV2aWNlR3JvdXAobGVhdWRpb19ncm91cF9pZCwgY29udGV4dF90eXBlKTsKLQotICAvKiBTaW5jZSB3ZSBwcmVwYXJlZCBkZXZpY2Ugd2l0aCBSaW5ndG9uZSBjb250ZXh0IGluIG1pbmQsIG9ubHkgb25lIEFTRQotICAgKiBzaG91bGQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCi0gICAqLwotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwLCAxLCB0cnVlKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXAsIDEpOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCwgMSk7Ci0gIFByZXBhcmVEaXNhYmxlSGFuZGxlcihncm91cCwgMSk7Ci0gIFByZXBhcmVSZWxlYXNlSGFuZGxlcihncm91cCwgMSk7Ci0KLSAgYXV0byogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBFWFBFQ1RfQ0FMTChnYXR0X3F1ZXVlLAotICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKDEsIGxlQXVkaW9EZXZpY2UtPmN0cF9oZGxzXy52YWxfaGRsLCBfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfTk9fUlNQLCBfLCBfKSkKLSAgICAgIC5UaW1lcyg0ICsgMyk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMik7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMik7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMSk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIC8vIFZhbGlkYXRlIEdyb3VwU3RyZWFtU3RhdHVzCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgU3RhdHVzUmVwb3J0Q2IobGVhdWRpb19ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6R3JvdXBTdHJlYW1TdGF0dXM6OklETEUpKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIFN0YXR1c1JlcG9ydENiKGxlYXVkaW9fZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzOjpTVFJFQU1JTkcpKQotICAgICAgLlRpbWVzKDIpOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gIC8vIFN0b3AgdGhlIHN0cmVhbQotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdG9wU3RyZWFtKGdyb3VwKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3RhcnRTdHJlYW0oCi0gICAgICBncm91cCwgc3RhdGljX2Nhc3Q8dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZT4oY29udGV4dF90eXBlKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb25lZCB0byBhIHByb3BlciBzdGF0ZQotICBBU1NFUlRfRVEoZ3JvdXAtPkdldFN0YXRlKCksCi0gICAgICAgICAgICB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RSZWxlYXNlTXVsdGlwbGUpIHsKLSAgY29uc3QgYXV0byBjb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVNZWRpYTsKLSAgY29uc3QgYXV0byBsZWF1ZGlvX2dyb3VwX2lkID0gNjsKLSAgY29uc3QgYXV0byBudW1fZGV2aWNlcyA9IDI7Ci0KLSAgLy8gUHJlcGFyZSBtdWx0aXBsZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2VzIGluIGEgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPQotICAgICAgUHJlcGFyZVNpbmdsZVRlc3REZXZpY2VHcm91cChsZWF1ZGlvX2dyb3VwX2lkLCBjb250ZXh0X3R5cGUsIG51bV9kZXZpY2VzKTsKLSAgQVNTRVJUX0VRKGdyb3VwLT5TaXplKCksIG51bV9kZXZpY2VzKTsKLQotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXApOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCk7Ci0gIFByZXBhcmVEaXNhYmxlSGFuZGxlcihncm91cCk7Ci0gIFByZXBhcmVSZWxlYXNlSGFuZGxlcihncm91cCk7Ci0KLSAgYXV0byogbGVBdWRpb0RldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOwotICBhdXRvIGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiA9IDA7Ci0gIHdoaWxlIChsZUF1ZGlvRGV2aWNlKSB7Ci0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKGxlQXVkaW9EZXZpY2UtPmNvbm5faWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAgIC5UaW1lcyhBdExlYXN0KDQpKTsKLSAgICBleHBlY3RlZF9kZXZpY2VzX3dyaXR0ZW4rKzsKLSAgICBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldE5leHREZXZpY2UobGVBdWRpb0RldmljZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKGV4cGVjdGVkX2RldmljZXNfd3JpdHRlbiwgbnVtX2RldmljZXMpOwotCi0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygyKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygyKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDEpOwotCi0gIEluamVjdEluaXRpYWxJZGxlTm90aWZpY2F0aW9uKGdyb3VwKTsKLQotICAvLyBTdGFydCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc3RyZWFtIE1lZGlhIGNvbnRlbnQKLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3RhcnRTdHJlYW0oCi0gICAgICBncm91cCwgc3RhdGljX2Nhc3Q8dHlwZXM6OkxlQXVkaW9Db250ZXh0VHlwZT4oY29udGV4dF90eXBlKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgZ3JvdXAgaGFzIHRyYW5zaXRpb25lZCB0byBhIHByb3BlciBzdGF0ZQotICBBU1NFUlRfRVEoZ3JvdXAtPkdldFN0YXRlKCksCi0gICAgICAgICAgICB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKTsKLQotICAvLyBWYWxpZGF0ZSBHcm91cFN0cmVhbVN0YXR1cwotICBFWFBFQ1RfQ0FMTChtb2NrX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgIFN0YXR1c1JlcG9ydENiKGxlYXVkaW9fZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RyZWFtU3RhdHVzOjpJRExFKSk7Ci0KLSAgLy8gU3RvcCB0aGUgc3RyZWFtCi0gIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0b3BTdHJlYW0oZ3JvdXApOwotCi0gIC8vIENoZWNrIGlmIGdyb3VwIGhhcyB0cmFuc2l0aW9uZWQgdG8gYSBwcm9wZXIgc3RhdGUKLSAgQVNTRVJUX0VRKGdyb3VwLT5HZXRTdGF0ZSgpLCB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0UmVsZWFzZUJpZGlyZWN0aW9uYWwpIHsKLSAgY29uc3QgYXV0byBjb250ZXh0X3R5cGUgPSBrQ29udGV4dFR5cGVDb252ZXJzYXRpb25hbDsKLSAgY29uc3QgYXV0byBsZWF1ZGlvX2dyb3VwX2lkID0gNjsKLQotICAvLyBQcmVwYXJlIGZha2UgY29ubmVjdGVkIGRldmljZSBncm91cAotICBhdXRvKiBncm91cCA9IFByZXBhcmVTaW5nbGVUZXN0RGV2aWNlR3JvdXAobGVhdWRpb19ncm91cF9pZCwgY29udGV4dF90eXBlKTsKLQotICAvKiBTaW5jZSB3ZSBwcmVwYXJlZCBkZXZpY2Ugd2l0aCBDb252ZXJzaW9uYWwgY29udGV4dCBpbiBtaW5kLCBTaW5rIGFuZCBTb3VyY2UKLSAgICogQVNFcyBzaG91bGQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCi0gICAqLwotICBQcmVwYXJlQ29uZmlndXJlQ29kZWNIYW5kbGVyKGdyb3VwLCAyKTsKLSAgUHJlcGFyZUNvbmZpZ3VyZVFvc0hhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlRW5hYmxlSGFuZGxlcihncm91cCwgMik7Ci0gIFByZXBhcmVEaXNhYmxlSGFuZGxlcihncm91cCwgMik7Ci0gIFByZXBhcmVSZWNlaXZlclN0YXJ0UmVhZHkoZ3JvdXAsIDEpOwotICBQcmVwYXJlUmVsZWFzZUhhbmRsZXIoZ3JvdXAsIDIpOwotCi0gIGF1dG8qIGxlQXVkaW9EZXZpY2UgPSBncm91cC0+R2V0Rmlyc3REZXZpY2UoKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYygxLCBsZUF1ZGlvRGV2aWNlLT5jdHBfaGRsc18udmFsX2hkbCwgXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX05PX1JTUCwgXywgXykpCi0gICAgICAuVGltZXMoQXRMZWFzdCg0KSk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBDcmVhdGVDaWcoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIEVzdGFibGlzaENpcyhfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgU2V0dXBJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMik7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIERpc2Nvbm5lY3RDaXMoXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUNpZyhfKSkuVGltZXMoMSk7Ci0KLSAgSW5qZWN0SW5pdGlhbElkbGVOb3RpZmljYXRpb24oZ3JvdXApOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwKLSAgICAgICAgICAgIHR5cGVzOjpBc2VTdGF0ZTo6QlRBX0xFX0FVRElPX0FTRV9TVEFURV9TVFJFQU1JTkcpOwotCi0gIC8vIFN0b3AgdGhlIHN0cmVhbQotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdG9wU3RyZWFtKGdyb3VwKTsKLQotICAvLyBDaGVjayBpZiBncm91cCBoYXMgdHJhbnNpdGlvbmVkIHRvIGEgcHJvcGVyIHN0YXRlCi0gIEFTU0VSVF9FUShncm91cC0+R2V0U3RhdGUoKSwgdHlwZXM6OkFzZVN0YXRlOjpCVEFfTEVfQVVESU9fQVNFX1NUQVRFX0lETEUpOwotfQotCi1URVNUX0YoU3RhdGVNYWNoaW5lVGVzdCwgdGVzdERpc2FibGVBbmRSZWxlYXNlQmlkaXJlY3Rpb25hbCkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggQ29udmVyc2lvbmFsIGNvbnRleHQgaW4gbWluZCwgU2luayBhbmQgU291cmNlCi0gICAqIEFTRXMgc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMik7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAyKTsKLSAgUHJlcGFyZUVuYWJsZUhhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlRGlzYWJsZUhhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlUmVjZWl2ZXJTdGFydFJlYWR5KGdyb3VwLCAxKTsKLSAgUHJlcGFyZVJlY2VpdmVyU3RvcFJlYWR5KGdyb3VwLCAxKTsKLSAgUHJlcGFyZVJlbGVhc2VIYW5kbGVyKGdyb3VwLCAyKTsKLQotICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7Ci0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWMoMSwgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIF8sIF8pKQotICAgICAgLlRpbWVzKEF0TGVhc3QoNCkpOwotCi0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDIpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDEpOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKTsKLQotICAvLyBTdXNwZW5kIHRoZSBzdHJlYW0KLSAgTGVBdWRpb0dyb3VwU3RhdGVNYWNoaW5lOjpHZXQoKS0+U3VzcGVuZFN0cmVhbShncm91cCk7Ci0KLSAgLy8gU3RvcCB0aGUgc3RyZWFtCi0gIExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0b3BTdHJlYW0oZ3JvdXApOwotCi0gIC8vIENoZWNrIGlmIGdyb3VwIGhhcyB0cmFuc2l0aW9uZWQgdG8gYSBwcm9wZXIgc3RhdGUKLSAgQVNTRVJUX0VRKGdyb3VwLT5HZXRTdGF0ZSgpLCB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSk7Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0QXNlSWRBc3NpZ25tZW50SWRsZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOwotICBjb25zdCBhdXRvIGxlYXVkaW9fZ3JvdXBfaWQgPSA2OwotICBjb25zdCBhdXRvIG51bV9kZXZpY2VzID0gMTsKLQotICAvLyBQcmVwYXJlIG11bHRpcGxlIGZha2UgY29ubmVjdGVkIGRldmljZXMgaW4gYSBncm91cAotICBhdXRvKiBncm91cCA9Ci0gICAgICBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSwgbnVtX2RldmljZXMpOwotICBBU1NFUlRfRVEoZ3JvdXAtPlNpemUoKSwgbnVtX2RldmljZXMpOwotCi0gIC8vIFNob3VsZCBub3QgdHJpZ2dlciBhbnkgYWN0aW9uIG9uIG91ciBzaWRlCi0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsIFdyaXRlQ2hhcmFjdGVyaXN0aWMoXywgXywgXywgXywgXywgXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIENyZWF0ZUNpZyhfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRXN0YWJsaXNoQ2lzKF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBTZXR1cElzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVJc29EYXRhUGF0aChfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgRGlzY29ubmVjdENpcyhfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgUmVtb3ZlQ2lnKF8pKS5UaW1lcygwKTsKLQotICBmb3IgKGF1dG8qIGRldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOyBkZXZpY2UgIT0gbnVsbHB0cjsKLSAgICAgICBkZXZpY2UgPSBncm91cC0+R2V0TmV4dERldmljZShkZXZpY2UpKSB7Ci0gICAgZm9yIChhdXRvJiBhc2UgOiBkZXZpY2UtPmFzZXNfKSB7Ci0gICAgICBBU1NFUlRfRVEoYXNlLmlkLCBsZV9hdWRpbzo6dHlwZXM6OmFzZTo6a0FzZUlkSW52YWxpZCk7Ci0gICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbigmYXNlLCBkZXZpY2UsIGdyb3VwLCBhc2NzOjprQXNlU3RhdGVJZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gICAgICBBU1NFUlRfRVEoYXNlLmlkLCBhc2VfaWRfbGFzdF9hc3NpZ25lZCk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0QXNlSWRBc3NpZ25tZW50Q29kZWNDb25maWd1cmVkKSB7Ci0gIGNvbnN0IGF1dG8gY29udGV4dF90eXBlID0ga0NvbnRleHRUeXBlQ29udmVyc2F0aW9uYWw7Ci0gIGNvbnN0IGF1dG8gbGVhdWRpb19ncm91cF9pZCA9IDY7Ci0gIGNvbnN0IGF1dG8gbnVtX2RldmljZXMgPSAxOwotCi0gIC8vIFByZXBhcmUgbXVsdGlwbGUgZmFrZSBjb25uZWN0ZWQgZGV2aWNlcyBpbiBhIGdyb3VwCi0gIGF1dG8qIGdyb3VwID0KLSAgICAgIFByZXBhcmVTaW5nbGVUZXN0RGV2aWNlR3JvdXAobGVhdWRpb19ncm91cF9pZCwgY29udGV4dF90eXBlLCBudW1fZGV2aWNlcyk7Ci0gIEFTU0VSVF9FUShncm91cC0+U2l6ZSgpLCBudW1fZGV2aWNlcyk7Ci0KLSAgLy8gU2hvdWxkIG5vdCB0cmlnZ2VyIGFueSBhY3Rpb24gb24gb3VyIHNpZGUKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgV3JpdGVDaGFyYWN0ZXJpc3RpYyhfLCBfLCBfLCBfLCBfLCBfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2lzb19tYW5hZ2VyXywgQ3JlYXRlQ2lnKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBFc3RhYmxpc2hDaXMoXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFNldHVwSXNvRGF0YVBhdGgoXywgXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19pc29fbWFuYWdlcl8sIFJlbW92ZUlzb0RhdGFQYXRoKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBEaXNjb25uZWN0Q2lzKF8sIF8pKS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaXNvX21hbmFnZXJfLCBSZW1vdmVDaWcoXykpLlRpbWVzKDApOwotCi0gIGZvciAoYXV0byogZGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7IGRldmljZSAhPSBudWxscHRyOwotICAgICAgIGRldmljZSA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGRldmljZSkpIHsKLSAgICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9jb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcwotICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zOwotCi0gICAgICBBU1NFUlRfRVEoYXNlLmlkLCBsZV9hdWRpbzo6dHlwZXM6OmFzZTo6a0FzZUlkSW52YWxpZCk7Ci0gICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbigmYXNlLCBkZXZpY2UsIGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjczo6a0FzZVN0YXRlQ29kZWNDb25maWd1cmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zKTsKLSAgICAgIEFTU0VSVF9FUShhc2UuaWQsIGFzZV9pZF9sYXN0X2Fzc2lnbmVkKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RBc2VBdXRvbm9tb3VzUmVsZWFzZSkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZUNvbnZlcnNhdGlvbmFsOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggQ29udmVyc2lvbmFsIGNvbnRleHQgaW4gbWluZCwgU2luayBhbmQgU291cmNlCi0gICAqIEFTRXMgc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMik7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAyKTsKLSAgUHJlcGFyZUVuYWJsZUhhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlRGlzYWJsZUhhbmRsZXIoZ3JvdXAsIDIpOwotICBQcmVwYXJlUmVjZWl2ZXJTdGFydFJlYWR5KGdyb3VwLCAxKTsKLSAgUHJlcGFyZVJlY2VpdmVyU3RvcFJlYWR5KGdyb3VwLCAxKTsKLSAgUHJlcGFyZVJlbGVhc2VIYW5kbGVyKGdyb3VwLCAyKTsKLQotICBJbmplY3RJbml0aWFsSWRsZU5vdGlmaWNhdGlvbihncm91cCk7Ci0KLSAgLy8gVmFsaWRhdGUgaW5pdGlhbCBHcm91cFN0cmVhbVN0YXR1cwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfY2FsbGJhY2tzXywKLSAgICAgIFN0YXR1c1JlcG9ydENiKGxlYXVkaW9fZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmxlX2F1ZGlvOjpHcm91cFN0cmVhbVN0YXR1czo6U1RSRUFNSU5HKSk7Ci0KLSAgLy8gU3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHN0cmVhbSBNZWRpYSBjb250ZW50Ci0gIEFTU0VSVF9UUlVFKExlQXVkaW9Hcm91cFN0YXRlTWFjaGluZTo6R2V0KCktPlN0YXJ0U3RyZWFtKAotICAgICAgZ3JvdXAsIHN0YXRpY19jYXN0PHR5cGVzOjpMZUF1ZGlvQ29udGV4dFR5cGU+KGNvbnRleHRfdHlwZSkpKTsKLQotICAvLyBWYWxpZGF0ZSBuZXcgR3JvdXBTdHJlYW1TdGF0dXMKLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFja3NfLAotICAgICAgICAgICAgICBTdGF0dXNSZXBvcnRDYihsZWF1ZGlvX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmxlX2F1ZGlvOjpHcm91cFN0cmVhbVN0YXR1czo6SURMRSkpOwotCi0gIGZvciAoYXV0byogZGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7IGRldmljZSAhPSBudWxscHRyOwotICAgICAgIGRldmljZSA9IGdyb3VwLT5HZXROZXh0RGV2aWNlKGRldmljZSkpIHsKLSAgICBmb3IgKGF1dG8mIGFzZSA6IGRldmljZS0+YXNlc18pIHsKLSAgICAgIGNsaWVudF9wYXJzZXI6OmFzY3M6OmFzZV9jb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcwotICAgICAgICAgIGNvZGVjX2NvbmZpZ3VyZWRfc3RhdGVfcGFyYW1zOwotCi0gICAgICBBU1NFUlRfRVEoYXNlLnN0YXRlLCB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfU1RSRUFNSU5HKTsKLQotICAgICAgLy8gRWFjaCBvbmUgZG9lcyB0aGUgYXV0b25vbW91cyByZWxlYXNlCi0gICAgICBJbmplY3RBc2VTdGF0ZU5vdGlmaWNhdGlvbigmYXNlLCBkZXZpY2UsIGdyb3VwLCBhc2NzOjprQXNlU3RhdGVSZWxlYXNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY29uZmlndXJlZF9zdGF0ZV9wYXJhbXMpOwotICAgICAgSW5qZWN0QXNlU3RhdGVOb3RpZmljYXRpb24oJmFzZSwgZGV2aWNlLCBncm91cCwgYXNjczo6a0FzZVN0YXRlSWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19jb25maWd1cmVkX3N0YXRlX3BhcmFtcyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVmVyaWZ5IHdlJ3ZlIGhhbmRsZWQgdGhlIHJlbGVhc2UgYW5kIHVwZGF0ZWQgYWxsIHN0YXRlcwotICBmb3IgKGF1dG8qIGRldmljZSA9IGdyb3VwLT5HZXRGaXJzdERldmljZSgpOyBkZXZpY2UgIT0gbnVsbHB0cjsKLSAgICAgICBkZXZpY2UgPSBncm91cC0+R2V0TmV4dERldmljZShkZXZpY2UpKSB7Ci0gICAgZm9yIChhdXRvJiBhc2UgOiBkZXZpY2UtPmFzZXNfKSB7Ci0gICAgICBBU1NFUlRfRVEoYXNlLnN0YXRlLCB0eXBlczo6QXNlU3RhdGU6OkJUQV9MRV9BVURJT19BU0VfU1RBVEVfSURMRSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0U3RhdGVUcmFuc2l0aW9uVGltZW91dCkgewotICBjb25zdCBhdXRvIGNvbnRleHRfdHlwZSA9IGtDb250ZXh0VHlwZVJpbmd0b25lOwotICBjb25zdCBpbnQgbGVhdWRpb19ncm91cF9pZCA9IDQ7Ci0KLSAgLy8gUHJlcGFyZSBmYWtlIGNvbm5lY3RlZCBkZXZpY2UgZ3JvdXAKLSAgYXV0byogZ3JvdXAgPSBQcmVwYXJlU2luZ2xlVGVzdERldmljZUdyb3VwKGxlYXVkaW9fZ3JvdXBfaWQsIGNvbnRleHRfdHlwZSk7Ci0KLSAgLyogU2luY2Ugd2UgcHJlcGFyZWQgZGV2aWNlIHdpdGggUmluZ3RvbmUgY29udGV4dCBpbiBtaW5kLCBvbmx5IG9uZSBBU0UKLSAgICogc2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkLgotICAgKi8KLSAgUHJlcGFyZUNvbmZpZ3VyZUNvZGVjSGFuZGxlcihncm91cCwgMSk7Ci0gIFByZXBhcmVDb25maWd1cmVRb3NIYW5kbGVyKGdyb3VwLCAxKTsKLQotICBhdXRvKiBsZUF1ZGlvRGV2aWNlID0gZ3JvdXAtPkdldEZpcnN0RGV2aWNlKCk7Ci0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWMoMSwgbGVBdWRpb0RldmljZS0+Y3RwX2hkbHNfLnZhbF9oZGwsIF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9OT19SU1AsIF8sIF8pKQotICAgICAgLlRpbWVzKDMpOwotCi0gIC8vIFN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBzdHJlYW0gTWVkaWEgY29udGVudAotICBBU1NFUlRfVFJVRShMZUF1ZGlvR3JvdXBTdGF0ZU1hY2hpbmU6OkdldCgpLT5TdGFydFN0cmVhbSgKLSAgICAgIGdyb3VwLCBzdGF0aWNfY2FzdDx0eXBlczo6TGVBdWRpb0NvbnRleHRUeXBlPihjb250ZXh0X3R5cGUpKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgdGltZW91dCBpcyBmaXJlZAotICBFWFBFQ1RfQ0FMTChtb2NrX2NhbGxiYWNrc18sIE9uU3RhdGVUcmFuc2l0aW9uVGltZW91dChsZWF1ZGlvX2dyb3VwX2lkKSk7Ci0KLSAgLy8gc2ltdWxhdGUgdGltZW91dCBzZWNvbmRzIHBhc3NlZCwgYWxhcm0gZXhlY3V0aW5nCi0gIGZha2Vfb3NpX2FsYXJtX3NldF9vbl9tbG9vcF8uY2IoZmFrZV9vc2lfYWxhcm1fc2V0X29uX21sb29wXy5kYXRhKTsKLSAgQVNTRVJUX0VRKDEsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJhbGFybV9zZXRfb25fbWxvb3AiXSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZV9hdWRpbwpkaWZmIC0tZ2l0IGEvYnRhL3Bhbi9idGFfcGFuX2FjdC5jYyBiL2J0YS9wYW4vYnRhX3Bhbl9hY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODFmYTAuLjAwMDAwMDAKLS0tIGEvYnRhL3Bhbi9idGFfcGFuX2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGFuIGFjdGlvbiBmdW5jdGlvbnMgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoIgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotLy8gUEFOX0lOQ0xVREVECi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaWYgKFBBTl9JTkNMVURFRCA9PSBUUlVFKQotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX3Bhbl9jby5oIgotI2luY2x1ZGUgImJ0YS9wYW4vYnRhX3Bhbl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3Bhbl9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKiBSWCBhbmQgVFggZGF0YSBmbG93IG1hc2sgKi8KLSNkZWZpbmUgQlRBX1BBTl9SWF9NQVNLIDB4MEYKLSNkZWZpbmUgQlRBX1BBTl9UWF9NQVNLIDB4RjAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICBidGFfcGFuX3BtX2Nvbm5fYnVzeQotICoKLSAqIERlc2NyaXB0aW9uIHNldCBwYW4gcG0gY29ubmVjdGlvbiBidXN5IHN0YXRlCi0gKgotICogUGFyYW1zICAgICAgcF9zY2I6IHN0YXRlIG1hY2hpbmUgY29udHJvbCBibG9jayBvZiBwYW4gY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX3Bhbl9wbV9jb25uX2J1c3kodEJUQV9QQU5fU0NCKiBwX3NjYikgewotICBpZiAoKHBfc2NiICE9IE5VTEwpICYmIChwX3NjYi0+c3RhdGUgIT0gQlRBX1BBTl9JRExFX1NUKSkKLSAgICBidGFfc3lzX2J1c3koQlRBX0lEX1BBTiwgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPmJkX2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgIGJ0YV9wYW5fcG1fY29ubl9pZGxlCi0gKgotICogRGVzY3JpcHRpb24gc2V0IHBhbiBwbSBjb25uZWN0aW9uIGlkbGUgc3RhdGUKLSAqCi0gKiBQYXJhbXMgICAgICBwX3NjYjogc3RhdGUgbWFjaGluZSBjb250cm9sIGJsb2NrIG9mIHBhbiBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX3BtX2Nvbm5faWRsZSh0QlRBX1BBTl9TQ0IqIHBfc2NiKSB7Ci0gIGlmICgocF9zY2IgIT0gTlVMTCkgJiYgKHBfc2NiLT5zdGF0ZSAhPSBCVEFfUEFOX0lETEVfU1QpKQotICAgIGJ0YV9zeXNfaWRsZShCVEFfSURfUEFOLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+YmRfYWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2Nvbm5fc3RhdGVfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbm5lY3Rpb24gc3RhdGUgY2FsbGJhY2sgZnJvbSBQYW4gcHJvZmlsZQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX3Bhbl9jb25uX3N0YXRlX2NiYWNrKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UEFOX1JFU1VMVCBzdGF0ZSwgYm9vbCBpc19yb2xlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNyY19yb2xlLCB1aW50OF90IGRzdF9yb2xlKSB7Ci0gIHRCVEFfUEFOX1NDQiogcF9zY2I7Ci0gIHRCVEFfUEFOX0NPTk4qIHBfYnVmID0gKHRCVEFfUEFOX0NPTk4qKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVEFfUEFOX0NPTk4pKTsKLQotICBpZiAoKHN0YXRlID09IFBBTl9TVUNDRVNTKSAmJiAhaXNfcm9sZV9jaGFuZ2UpIHsKLSAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX1BBTl9DT05OX09QRU5fRVZUOwotICAgIHBfc2NiID0gYnRhX3Bhbl9zY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gICAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICAgIC8qIGFsbG9jYXRlIGFuIHNjYiAqLwotICAgICAgcF9zY2IgPSBidGFfcGFuX3NjYl9hbGxvYygpOwotICAgIH0KLSAgICAvKiB3ZSBoYXZlIGV4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zICovCi0gICAgaWYgKCFwX3NjYikgewotICAgICAgUEFOX0Rpc2Nvbm5lY3QoaGFuZGxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwX3NjYi0+aGFuZGxlID0gaGFuZGxlOwotICAgIHBfc2NiLT5sb2NhbF9yb2xlID0gc3JjX3JvbGU7Ci0gICAgcF9zY2ItPnBlZXJfcm9sZSA9IGRzdF9yb2xlOwotICAgIHBfc2NiLT5wYW5fZmxvd19lbmFibGUgPSB0cnVlOwotICAgIHBfc2NiLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgICBwX3NjYi0+ZGF0YV9xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0KLSAgICBpZiAoc3JjX3JvbGUgPT0gUEFOX1JPTEVfQ0xJRU5UKQotICAgICAgcF9zY2ItPmFwcF9pZCA9IGJ0YV9wYW5fY2IuYXBwX2lkWzBdOwotICAgIGVsc2UgaWYgKHNyY19yb2xlID09IFBBTl9ST0xFX05BUF9TRVJWRVIpCi0gICAgICBwX3NjYi0+YXBwX2lkID0gYnRhX3Bhbl9jYi5hcHBfaWRbMl07Ci0gIH0gZWxzZSBpZiAoKHN0YXRlICE9IFBBTl9TVUNDRVNTKSAmJiAhaXNfcm9sZV9jaGFuZ2UpIHsKLSAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX1BBTl9DT05OX0NMT1NFX0VWVDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2J1Zi0+cmVzdWx0ID0gc3RhdGU7Ci0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fZGF0YV9mbG93X2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEYXRhIGZsb3cgc3RhdHVzIGNhbGxiYWNrIGZyb20gUEFOCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX2RhdGFfZmxvd19jYih1aW50MTZfdCBoYW5kbGUsIHRQQU5fUkVTVUxUIHJlc3VsdCkgewotICB0QlRBX1BBTl9TQ0IqIHBfc2NiOwotCi0gIHBfc2NiID0gYnRhX3Bhbl9zY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIGlmIChwX3NjYiA9PSBOVUxMKSByZXR1cm47Ci0KLSAgaWYgKHJlc3VsdCA9PSBQQU5fVFhfRkxPV19PTikgewotICAgIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7Ci0gICAgcF9idWYtPmV2ZW50ID0gQlRBX1BBTl9CTkVQX0ZMT1dfRU5BQkxFX0VWVDsKLSAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotICAgIGJ0YV9wYW5fY29fcnhfZmxvdyhoYW5kbGUsIHBfc2NiLT5hcHBfaWQsIHRydWUpOwotICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQQU5fVFhfRkxPV19PRkYpIHsKLSAgICBwX3NjYi0+cGFuX2Zsb3dfZW5hYmxlID0gZmFsc2U7Ci0gICAgYnRhX3Bhbl9jb19yeF9mbG93KGhhbmRsZSwgcF9zY2ItPmFwcF9pZCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2RhdGFfYnVmX2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZGF0YSBpbmRpY2F0aW9uIGNhbGxiYWNrIGZyb20gcGFuIHByb2ZpbGUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9wYW5fZGF0YV9idWZfaW5kX2NiYWNrKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgZHN0LCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYsIGJvb2wgZXh0LCBib29sIGZvcndhcmQpIHsKLSAgdEJUQV9QQU5fU0NCKiBwX3NjYiA9IGJ0YV9wYW5fc2NiX2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzaXplb2YoQlRfSERSKSArIHNpemVvZih0QlRBX1BBTl9EQVRBX1BBUkFNUykgKyBwX2J1Zi0+bGVuID4KLSAgICAgIFBBTl9CVUZfU0laRSkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjMxNDYyMzciKTsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcmVjZWl2ZWQgYnVmZmVyIGxlbmd0aCB0b28gbGFyZ2U6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+bGVuKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCVF9IRFIqIHBfbmV3X2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoUEFOX0JVRl9TSVpFKTsKLSAgbWVtY3B5KCh1aW50OF90KikocF9uZXdfYnVmICsgMSkgKyBzaXplb2YodEJUQV9QQU5fREFUQV9QQVJBTVMpLAotICAgICAgICAgKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwgcF9idWYtPmxlbik7Ci0gIHBfbmV3X2J1Zi0+bGVuID0gcF9idWYtPmxlbjsKLSAgcF9uZXdfYnVmLT5vZmZzZXQgPSBzaXplb2YodEJUQV9QQU5fREFUQV9QQVJBTVMpOwotCi0gIC8qIGNvcHkgcGFyYW1zIGludG8gdGhlIHNwYWNlIGJlZm9yZSB0aGUgZGF0YSAqLwotICAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX25ld19idWYpLT5zcmMgPSBzcmM7Ci0gICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfbmV3X2J1ZiktPmRzdCA9IGRzdDsKLSAgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9uZXdfYnVmKS0+cHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9uZXdfYnVmKS0+ZXh0ID0gZXh0OwotICAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX25ld19idWYpLT5mb3J3YXJkID0gZm9yd2FyZDsKLQotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfc2NiLT5kYXRhX3F1ZXVlLCBwX25ld19idWYpOwotICBCVF9IRFJfUklHSUQqIHBfZXZlbnQgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLSAgcF9ldmVudC0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7Ci0gIHBfZXZlbnQtPmV2ZW50ID0gQlRBX1BBTl9SWF9GUk9NX0JORVBfUkVBRFlfRVZUOwotICBidGFfc3lzX3NlbmRtc2cocF9ldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX3BmaWx0X2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX3BmaWx0X2luZF9jYmFjayh1aW50MTZfdCBoYW5kbGUsIGJvb2wgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQQU5fUkVTVUxUIHJlc3VsdCwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMpIHsKLSAgYnRhX3Bhbl9jb19wZmlsdF9pbmQoaGFuZGxlLCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0ID09IFBBTl9TVUNDRVNTKSA/IEJUQV9QQU5fU1VDQ0VTUyA6IEJUQV9QQU5fRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMsIHBfZmlsdGVycyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX21maWx0X2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX21maWx0X2luZF9jYmFjayh1aW50MTZfdCBoYW5kbGUsIGJvb2wgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQQU5fUkVTVUxUIHJlc3VsdCwgdWludDE2X3QgbnVtX21maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9tZmlsdGVycykgewotICBidGFfcGFuX2NvX21maWx0X2luZChoYW5kbGUsIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQgPT0gUEFOX1NVQ0NFU1MpID8gQlRBX1BBTl9TVUNDRVNTIDogQlRBX1BBTl9GQUlMLAotICAgICAgICAgICAgICAgICAgICAgICBudW1fbWZpbHRlcnMsIHBfbWZpbHRlcnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9oYXNfbXVsdGlwbGVfY29ubmVjdGlvbnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIG11bHRpcGxlIEdOL05BUCBjb25uZWN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZGV2aWNlcwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRhX3Bhbl9oYXNfbXVsdGlwbGVfY29ubmVjdGlvbnModWludDhfdCBhcHBfaWQpIHsKLSAgdEJUQV9QQU5fU0NCKiBwX3NjYiA9IE5VTEw7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotCi0gIGZvciAodWludDhfdCBpbmRleCA9IDA7IGluZGV4IDwgQlRBX1BBTl9OVU1fQ09OTjsgaW5kZXgrKykgewotICAgIHBfc2NiID0gJmJ0YV9wYW5fY2Iuc2NiW2luZGV4XTsKLSAgICBpZiAocF9zY2ItPmluX3VzZSAmJiBhcHBfaWQgPT0gcF9zY2ItPmFwcF9pZCkgewotICAgICAgLyogc2F2ZSB0ZW1wIGJkX2FkZHIgKi8KLSAgICAgIGJkX2FkZHIgPSBwX3NjYi0+YmRfYWRkcjsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGNhbm5vdCBmaW5kIGEgbWF0Y2ggdGhlbiB0aGVyZSBpcyBubyBjb25uZWN0aW9uIGF0IGFsbCAqLwotICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmluZCB3aGV0aGVyIHRoZXJlIGlzIGFub3RoZXIgY29ubmVjdGlvbiB3aXRoIGRpZmZlcmVudCBkZXZpY2Ugb3RoZXIgdGhhbgotICAgICBQQU5VLgotICAgICAgQ291bGQgYmUgc2FtZSBzZXJ2aWNlIG9yIGRpZmZlcmVudCBzZXJ2aWNlICovCi0gIGZvciAodWludDhfdCBpbmRleCA9IDA7IGluZGV4IDwgQlRBX1BBTl9OVU1fQ09OTjsgaW5kZXgrKykgewotICAgIHBfc2NiID0gJmJ0YV9wYW5fY2Iuc2NiW2luZGV4XTsKLSAgICBpZiAocF9zY2ItPmluX3VzZSAmJiBwX3NjYi0+YXBwX2lkICE9IGJ0YV9wYW5fY2IuYXBwX2lkWzBdICYmCi0gICAgICAgIGJkX2FkZHIgIT0gcF9zY2ItPmJkX2FkZHIpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2VuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2VuYWJsZSh0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgdFBBTl9SRUdJU1RFUiByZWdfZGF0YTsKLQotICBidGFfcGFuX2NiLnBfY2JhY2sgPSBwX2RhdGEtPmFwaV9lbmFibGUucF9jYmFjazsKLQotICByZWdfZGF0YS5wYW5fY29ubl9zdGF0ZV9jYiA9IGJ0YV9wYW5fY29ubl9zdGF0ZV9jYmFjazsKLSAgcmVnX2RhdGEucGFuX2JyaWRnZV9yZXFfY2IgPSBOVUxMOwotICByZWdfZGF0YS5wYW5fZGF0YV9idWZfaW5kX2NiID0gYnRhX3Bhbl9kYXRhX2J1Zl9pbmRfY2JhY2s7Ci0gIHJlZ19kYXRhLnBhbl9kYXRhX2luZF9jYiA9IE5VTEw7Ci0gIHJlZ19kYXRhLnBhbl9wZmlsdF9pbmRfY2IgPSBidGFfcGFuX3BmaWx0X2luZF9jYmFjazsKLSAgcmVnX2RhdGEucGFuX21maWx0X2luZF9jYiA9IGJ0YV9wYW5fbWZpbHRfaW5kX2NiYWNrOwotICByZWdfZGF0YS5wYW5fdHhfZGF0YV9mbG93X2NiID0gYnRhX3Bhbl9kYXRhX2Zsb3dfY2I7Ci0KLSAgUEFOX1JlZ2lzdGVyKCZyZWdfZGF0YSk7Ci0KLSAgYnRhX3Bhbl9jYi5mbG93X21hc2sgPSBidGFfcGFuX2NvX2luaXQoJmJ0YV9wYW5fY2IucV9sZXZlbCk7Ci0gIGJ0YV9wYW5fY2IucF9jYmFjayhCVEFfUEFOX0VOQUJMRV9FVlQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9zZXRfcm9sZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9zZXRfcm9sZSh0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgdFBBTl9SRVNVTFQgc3RhdHVzOwotICB0QlRBX1BBTiBidGFfcGFuOwotCi0gIGJ0YV9wYW5fY2IuYXBwX2lkWzBdID0gcF9kYXRhLT5hcGlfc2V0X3JvbGUudXNlcl9hcHBfaWQ7Ci0gIGJ0YV9wYW5fY2IuYXBwX2lkWzJdID0gcF9kYXRhLT5hcGlfc2V0X3JvbGUubmFwX2FwcF9pZDsKLQotICAvKiBzZXQgc2VjdXJpdHkgY29ycmVjdGx5IGluIGFwaSBhbmQgaGVyZSAqLwotICBzdGF0dXMgPQotICAgICAgUEFOX1NldFJvbGUocF9kYXRhLT5hcGlfc2V0X3JvbGUucm9sZSwgcF9kYXRhLT5hcGlfc2V0X3JvbGUudXNlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hcGlfc2V0X3JvbGUubmFwX25hbWUpOwotCi0gIGJ0YV9wYW4uc2V0X3JvbGUucm9sZSA9IHBfZGF0YS0+YXBpX3NldF9yb2xlLnJvbGU7Ci0gIGlmIChzdGF0dXMgPT0gUEFOX1NVQ0NFU1MpIHsKLSAgICBpZiAocF9kYXRhLT5hcGlfc2V0X3JvbGUucm9sZSAmIFBBTl9ST0xFX05BUF9TRVJWRVIpCi0gICAgICBidGFfc3lzX2FkZF91dWlkKFVVSURfU0VSVkNMQVNTX05BUCk7Ci0gICAgZWxzZQotICAgICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19OQVApOwotCi0gICAgaWYgKHBfZGF0YS0+YXBpX3NldF9yb2xlLnJvbGUgJiBQQU5fUk9MRV9DTElFTlQpCi0gICAgICBidGFfc3lzX2FkZF91dWlkKFVVSURfU0VSVkNMQVNTX1BBTlUpOwotICAgIGVsc2UKLSAgICAgIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfUEFOVSk7Ci0KLSAgICBidGFfcGFuLnNldF9yb2xlLnN0YXR1cyA9IEJUQV9QQU5fU1VDQ0VTUzsKLSAgfQotICAvKiBpZiBzdGF0dXMgaXMgbm90IHN1Y2Nlc3MgY2xlYXIgZXZlcnl0aGluZyAqLwotICBlbHNlIHsKLSAgICBQQU5fU2V0Um9sZSgwLCBOVUxMLCBOVUxMKTsKLSAgICBidGFfc3lzX3JlbW92ZV91dWlkKFVVSURfU0VSVkNMQVNTX05BUCk7Ci0gICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19HTik7Ci0gICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19QQU5VKTsKLSAgICBidGFfcGFuLnNldF9yb2xlLnN0YXR1cyA9IEJUQV9QQU5fRkFJTDsKLSAgfQotICBidGFfcGFuX2NiLnBfY2JhY2soQlRBX1BBTl9TRVRfUk9MRV9FVlQsICZidGFfcGFuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fZGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2Rpc2FibGUodm9pZCkgewotICBCVF9IRFIqIHBfYnVmOwotICB0QlRBX1BBTl9TQ0IqIHBfc2NiID0gJmJ0YV9wYW5fY2Iuc2NiWzBdOwotICB1aW50OF90IGk7Ci0KLSAgLyogY2xvc2UgYWxsIGNvbm5lY3Rpb25zICovCi0gIFBBTl9TZXRSb2xlKDAsIE5VTEwsIE5VTEwpOwotCi0jaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFKQotICBidGFfc3lzX3JlbW92ZV91dWlkKFVVSURfU0VSVkNMQVNTX05BUCk7Ci0gIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfR04pOwotICBidGFfc3lzX3JlbW92ZV91dWlkKFVVSURfU0VSVkNMQVNTX1BBTlUpOwotI2VuZGlmICAvLyBCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QKLSAgLyogZnJlZSBhbGwgcXVldWVkIHVwIGRhdGEgYnVmZmVycyAqLwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX1BBTl9OVU1fQ09OTjsgaSsrLCBwX3NjYisrKSB7Ci0gICAgaWYgKHBfc2NiLT5pbl91c2UpIHsKLSAgICAgIHdoaWxlICgocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX3NjYi0+ZGF0YV9xdWV1ZSkpICE9Ci0gICAgICAgICAgICAgTlVMTCkKLSAgICAgICAgb3NpX2ZyZWUocF9idWYpOwotCi0gICAgICBidGFfcGFuX2NvX2Nsb3NlKHBfc2NiLT5oYW5kbGUsIHBfc2NiLT5hcHBfaWQpOwotICAgIH0KLSAgfQotCi0gIFBBTl9EZXJlZ2lzdGVyKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fb3Blbih0QlRBX1BBTl9TQ0IqIHBfc2NiLCB0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgdFBBTl9SRVNVTFQgc3RhdHVzOwotICB0QlRBX1BBTiBidGFfcGFuOwotCi0gIHN0YXR1cyA9IFBBTl9Db25uZWN0KHBfZGF0YS0+YXBpX29wZW4uYmRfYWRkciwgcF9kYXRhLT5hcGlfb3Blbi5sb2NhbF9yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmFwaV9vcGVuLnBlZXJfcm9sZSwgJnBfc2NiLT5oYW5kbGUpOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBwYW4gY29ubmVjdCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBQQU5fU1VDQ0VTUykgewotICAgIHBfc2NiLT5iZF9hZGRyID0gcF9kYXRhLT5hcGlfb3Blbi5iZF9hZGRyOwotICAgIHBfc2NiLT5sb2NhbF9yb2xlID0gcF9kYXRhLT5hcGlfb3Blbi5sb2NhbF9yb2xlOwotICAgIHBfc2NiLT5wZWVyX3JvbGUgPSBwX2RhdGEtPmFwaV9vcGVuLnBlZXJfcm9sZTsKLSAgICBidGFfcGFuLm9wZW5pbmcuYmRfYWRkciA9IHBfZGF0YS0+YXBpX29wZW4uYmRfYWRkcjsKLSAgICBidGFfcGFuLm9wZW5pbmcuaGFuZGxlID0gcF9zY2ItPmhhbmRsZTsKLSAgICBidGFfcGFuX2NiLnBfY2JhY2soQlRBX1BBTl9PUEVOSU5HX0VWVCwgJmJ0YV9wYW4pOwotCi0gIH0gZWxzZSB7Ci0gICAgYnRhX3Bhbl9zY2JfZGVhbGxvYyhwX3NjYik7Ci0gICAgYnRhX3Bhbi5vcGVuLmJkX2FkZHIgPSBwX2RhdGEtPmFwaV9vcGVuLmJkX2FkZHI7Ci0gICAgYnRhX3Bhbi5vcGVuLnN0YXR1cyA9IEJUQV9QQU5fRkFJTDsKLSAgICBidGFfcGFuLm9wZW4ubG9jYWxfcm9sZSA9IHBfZGF0YS0+YXBpX29wZW4ubG9jYWxfcm9sZTsKLSAgICBidGFfcGFuLm9wZW4ucGVlcl9yb2xlID0gcF9kYXRhLT5hcGlfb3Blbi5wZWVyX3JvbGU7Ci0gICAgYnRhX3Bhbl9jYi5wX2NiYWNrKEJUQV9QQU5fT1BFTl9FVlQsICZidGFfcGFuKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2FwaV9jbG9zZSh0QlRBX1BBTl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9QQU5fQ09OTiogcF9idWYgPSAodEJUQV9QQU5fQ09OTiopb3NpX21hbGxvYyhzaXplb2YodEJUQV9QQU5fQ09OTikpOwotCi0gIFBBTl9EaXNjb25uZWN0KHBfc2NiLT5oYW5kbGUpOwotCi0gIC8qCi0gICAqIFNlbmQgYW4gZXZlbnQgdG8gQlRBIHNvIHRoYXQgYXBwbGljYXRpb24gd2lsbCBnZXQgdGhlIGNvbm5lY3Rpb24KLSAgICogY2xvc2UgZXZlbnQuCi0gICAqLwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX1BBTl9DT05OX0NMT1NFX0VWVDsKLSAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IHBfc2NiLT5oYW5kbGU7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY29ubl9vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBwcm9jZXNzIGNvbm5lY3Rpb24gb3BlbiBldmVudAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY29ubl9vcGVuKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX1BBTiBidGFfcGFuOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIHBhbiBjb25uZWN0aW9uIHJlc3VsdDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm4ucmVzdWx0KTsKLQotICBidGFfcGFuLm9wZW4uYmRfYWRkciA9IHBfc2NiLT5iZF9hZGRyOwotICBidGFfcGFuLm9wZW4uaGFuZGxlID0gcF9zY2ItPmhhbmRsZTsKLSAgYnRhX3Bhbi5vcGVuLmxvY2FsX3JvbGUgPSBwX3NjYi0+bG9jYWxfcm9sZTsKLSAgYnRhX3Bhbi5vcGVuLnBlZXJfcm9sZSA9IHBfc2NiLT5wZWVyX3JvbGU7Ci0KLSAgaWYgKHBfZGF0YS0+Y29ubi5yZXN1bHQgPT0gUEFOX1NVQ0NFU1MpIHsKLSAgICBidGFfcGFuLm9wZW4uc3RhdHVzID0gQlRBX1BBTl9TVUNDRVNTOwotICAgIHBfc2NiLT5wYW5fZmxvd19lbmFibGUgPSB0cnVlOwotICAgIHBfc2NiLT5hcHBfZmxvd19lbmFibGUgPSB0cnVlOwotICAgIGJ0YV9zeXNfY29ubl9vcGVuKEJUQV9JRF9QQU4sIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5iZF9hZGRyKTsKLSAgfSBlbHNlIHsKLSAgICBidGFfcGFuX3NjYl9kZWFsbG9jKHBfc2NiKTsKLSAgICBidGFfcGFuLm9wZW4uc3RhdHVzID0gQlRBX1BBTl9GQUlMOwotICB9Ci0KLSAgcF9zY2ItPnBhbl9mbG93X2VuYWJsZSA9IHRydWU7Ci0gIHBfc2NiLT5hcHBfZmxvd19lbmFibGUgPSB0cnVlOwotCi0gIC8qIElmIGFwcF9pZCBpcyBOQVAvR04sIGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgotICAgICBJZiB0aGVyZSBhcmUsIHByb3ZpZGUgYSBzcGVjaWFsIGFwcF9pZCB0byBkbSB0byBlbmZvcmNlIGNlbnRyYWwgcm9sZSBvbmx5LgotICAgICAqLwotICBpZiAocF9zY2ItPmFwcF9pZCA9PSBidGFfcGFuX2NiLmFwcF9pZFsyXSAmJgotICAgICAgYnRhX3Bhbl9oYXNfbXVsdGlwbGVfY29ubmVjdGlvbnMocF9zY2ItPmFwcF9pZCkpIHsKLSAgICBwX3NjYi0+YXBwX2lkID0gQlRBX0FQUF9JRF9QQU5fTVVMVEk7Ci0gIH0KLQotICBidGFfc3lzX2Nvbm5fb3BlbihCVEFfSURfUEFOLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+YmRfYWRkcik7Ci0gIGJ0YV9wYW5fY2IucF9jYmFjayhCVEFfUEFOX09QRU5fRVZULCAmYnRhX3Bhbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2Nvbm5fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHByb2Nlc3MgY29ubmVjdGlvbiBjbG9zZSBldmVudAotICoKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jb25uX2Nsb3NlKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX1BBTiBidGFfcGFuOwotICBCVF9IRFIqIHBfYnVmOwotCi0gIGJ0YV9wYW4uY2xvc2UuaGFuZGxlID0gcF9kYXRhLT5oZHIubGF5ZXJfc3BlY2lmaWM7Ci0KLSAgYnRhX3N5c19jb25uX2Nsb3NlKEJUQV9JRF9QQU4sIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5iZF9hZGRyKTsKLQotICAvKiBmcmVlIGFsbCBxdWV1ZWQgdXAgZGF0YSBidWZmZXJzICovCi0gIHdoaWxlICgocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX3NjYi0+ZGF0YV9xdWV1ZSkpICE9IE5VTEwpCi0gICAgb3NpX2ZyZWUocF9idWYpOwotCi0gIGJ0YV9wYW5fc2NiX2RlYWxsb2MocF9zY2IpOwotCi0gIGJ0YV9wYW5fY2IucF9jYmFjayhCVEFfUEFOX0NMT1NFX0VWVCwgJmJ0YV9wYW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9yeF9wYXRoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgZGF0YSBvbiB0aGUgUlggcGF0aCAoZGF0YSBzZW50IGZyb20gdGhlIHBob25lIHRvCi0gKiAgICAgICAgICAgICAgICAgIEJUQSkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fcnhfcGF0aCh0QlRBX1BBTl9TQ0IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgLyogaWYgZGF0YSBwYXRoIGNvbmZpZ3VyZWQgZm9yIHJ4IHB1bGwgKi8KLSAgaWYgKChidGFfcGFuX2NiLmZsb3dfbWFzayAmIEJUQV9QQU5fUlhfTUFTSykgPT0gQlRBX1BBTl9SWF9QVUxMKSB7Ci0gICAgLyogaWYgd2UgY2FuIGFjY2VwdCBkYXRhICovCi0gICAgaWYgKHBfc2NiLT5wYW5fZmxvd19lbmFibGUpIHsKLSAgICAgIC8qIGNhbGwgYXBwbGljYXRpb24gY2FsbG91dCBmdW5jdGlvbiBmb3IgcnggcGF0aCAqLwotICAgICAgYnRhX3Bhbl9jb19yeF9wYXRoKHBfc2NiLT5oYW5kbGUsIHBfc2NiLT5hcHBfaWQpOwotICAgIH0KLSAgfQotICAvKiBlbHNlIGRhdGEgcGF0aCBjb25maWd1cmVkIGZvciByeCBwdXNoICovCi0gIGVsc2UgewotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX3R4X3BhdGgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSB0aGUgVFggZGF0YSBwYXRoIChkYXRhIHNlbnQgZnJvbSBCVEEgdG8gdGhlIHBob25lKS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl90eF9wYXRoKHRCVEFfUEFOX1NDQiogcF9zY2IsIFVOVVNFRF9BVFRSIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSkgewotICBidGFfcGFuX3BtX2Nvbm5fYnVzeShwX3NjYik7Ci0gIC8qIGNhbGwgYXBwbGljYXRpb24gY2FsbG91dCBmdW5jdGlvbiBmb3IgdHggcGF0aCAqLwotICBidGFfcGFuX2NvX3R4X3BhdGgocF9zY2ItPmhhbmRsZSwgcF9zY2ItPmFwcF9pZCk7Ci0KLSAgLyogZnJlZSBkYXRhIHRoYXQgZXhjZWVkcyBxdWV1ZSBsZXZlbCAqLwotICB3aGlsZSAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfc2NiLT5kYXRhX3F1ZXVlKSA+IGJ0YV9wYW5fY2IucV9sZXZlbCkgewotICAgIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX3NjYi0+ZGF0YV9xdWV1ZSk7Ci0gICAgaWYgKHBfYnVmICE9IG51bGxwdHIpIHsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9Ci0gIH0KLQotICBidGFfcGFuX3BtX2Nvbm5faWRsZShwX3NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX3R4X2Zsb3cKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCB0aGUgYXBwbGljYXRpb24gZmxvdyBjb250cm9sIHN0YXRlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX3R4X2Zsb3codEJUQV9QQU5fU0NCKiBwX3NjYiwgdEJUQV9QQU5fREFUQSogcF9kYXRhKSB7Ci0gIHBfc2NiLT5hcHBfZmxvd19lbmFibGUgPSBwX2RhdGEtPmNpX3R4X2Zsb3cuZW5hYmxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl93cml0ZV9idWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhIGJ0YV9wYW5fY2lfcnhfd3JpdGVidWYoKSBhbmQgc2VuZCBkYXRhIHRvIFBBTi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl93cml0ZV9idWYodEJUQV9QQU5fU0NCKiBwX3NjYiwgdEJUQV9QQU5fREFUQSogcF9kYXRhKSB7Ci0gIGlmICgoYnRhX3Bhbl9jYi5mbG93X21hc2sgJiBCVEFfUEFOX1JYX01BU0spID09IEJUQV9QQU5fUlhfUFVTSF9CVUYpIHsKLSAgICBidGFfcGFuX3BtX2Nvbm5fYnVzeShwX3NjYik7Ci0KLSAgICBQQU5fV3JpdGVCdWYocF9zY2ItPmhhbmRsZSwgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9kYXRhKS0+ZHN0LAotICAgICAgICAgICAgICAgICAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX2RhdGEpLT5zcmMsCi0gICAgICAgICAgICAgICAgICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfZGF0YSktPnByb3RvY29sLCAoQlRfSERSKilwX2RhdGEsCi0gICAgICAgICAgICAgICAgICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfZGF0YSktPmV4dCk7Ci0gICAgYnRhX3Bhbl9wbV9jb25uX2lkbGUocF9zY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2ZyZWVfYnVmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlcyB0aGUgZGF0YSBidWZmZXIgZHVyaW5nIGNsb3Npbmcgc3RhdGUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9mcmVlX2J1ZihVTlVTRURfQVRUUiB0QlRBX1BBTl9TQ0IqIHBfc2NiLCB0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgb3NpX2ZyZWUocF9kYXRhKTsKLX0KLQotI2VuZGlmIC8qIFBBTl9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvYnRhL3Bhbi9idGFfcGFuX2FwaS5jYyBiL2J0YS9wYW4vYnRhX3Bhbl9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YWQwZGYuLjAwMDAwMDAKLS0tIGEvYnRhL3Bhbi9idGFfcGFuX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZm9yIFBBTiBzdWJzeXN0ZW0gb2YgQlRBLAotICogIEJyb2FkY29tJ3MgQmx1ZXRvb3RoIGFwcGxpY2F0aW9uIGxheWVyIGZvciBtb2JpbGUgcGhvbmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpbmNsdWRlICJidGEvcGFuL2J0YV9wYW5faW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgY29uc3QgdEJUQV9TWVNfUkVHIGJ0YV9wYW5fcmVnID0ge2J0YV9wYW5faGRsX2V2ZW50LCBCVEFfUGFuRGlzYWJsZX07Ci0KLSNpZm5kZWYgUEFOX1NFQ1VSSVRZCi0jZGVmaW5lIFBBTl9TRUNVUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19JTl9FTkNSWVBUIHwgXAotICAgQlRNX1NFQ19PVVRfRU5DUllQVCkKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1BhbkVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIFBBTiBzZXJ2aWNlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgUEFOIEFQSSBhcmUgY2FsbGVkLgotICogICAgICAgICAgICAgICAgICBXaGVuIHRoZSBlbmFibGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgQlRBX1BBTl9FTkFCTEVfRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9QYW5FbmFibGUodEJUQV9QQU5fQ0JBQ0sgcF9jYmFjaykgewotICB0QlRBX1BBTl9BUElfRU5BQkxFKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9QQU5fQVBJX0VOQUJMRSopb3NpX21hbGxvYyhzaXplb2YodEJUQV9QQU5fQVBJX0VOQUJMRSkpOwotCi0gIC8qIHJlZ2lzdGVyIHdpdGggQlRBIHN5c3RlbSBtYW5hZ2VyICovCi0gIGJ0YV9zeXNfcmVnaXN0ZXIoQlRBX0lEX1BBTiwgJmJ0YV9wYW5fcmVnKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX1BBTl9BUElfRU5BQkxFX0VWVDsKLSAgcF9idWYtPnBfY2JhY2sgPSBwX2NiYWNrOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfUGFuRGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzYWJsZXMgUEFOIHNlcnZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9QYW5EaXNhYmxlKHZvaWQpIHsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotCi0gIGJ0YV9zeXNfZGVyZWdpc3RlcihCVEFfSURfUEFOKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX1BBTl9BUElfRElTQUJMRV9FVlQ7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9QYW5TZXRSb2xlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIFBBTiByb2xlcy4gV2hlbiB0aGUgZW5hYmxlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZQotICogICAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9QQU5fU0VUX1JPTEVfRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9QYW5TZXRSb2xlKHRCVEFfUEFOX1JPTEUgcm9sZSwgdEJUQV9QQU5fUk9MRV9JTkZPKiBwX3VzZXJfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgdEJUQV9QQU5fUk9MRV9JTkZPKiBwX25hcF9pbmZvKSB7Ci0gIHRCVEFfUEFOX0FQSV9TRVRfUk9MRSogcF9idWYgPQotICAgICAgKHRCVEFfUEFOX0FQSV9TRVRfUk9MRSopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9QQU5fQVBJX1NFVF9ST0xFKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9QQU5fQVBJX1NFVF9ST0xFX0VWVDsKLSAgcF9idWYtPnJvbGUgPSByb2xlOwotCi0gIGlmIChyb2xlICYgQlRBX1BBTl9ST0xFX1BBTlUpIHsKLSAgICBpZiAocF91c2VyX2luZm8tPnBfc3J2X25hbWUpCi0gICAgICBzdHJsY3B5KHBfYnVmLT51c2VyX25hbWUsIHBfdXNlcl9pbmZvLT5wX3Nydl9uYW1lLCBCVEFfU0VSVklDRV9OQU1FX0xFTik7Ci0KLSAgICBwX2J1Zi0+dXNlcl9hcHBfaWQgPSBwX3VzZXJfaW5mby0+YXBwX2lkOwotICB9Ci0KLSAgaWYgKHJvbGUgJiBCVEFfUEFOX1JPTEVfTkFQKSB7Ci0gICAgaWYgKHBfbmFwX2luZm8tPnBfc3J2X25hbWUpCi0gICAgICBzdHJsY3B5KHBfYnVmLT5uYXBfbmFtZSwgcF9uYXBfaW5mby0+cF9zcnZfbmFtZSwgQlRBX1NFUlZJQ0VfTkFNRV9MRU4pOwotCi0gICAgcF9idWYtPm5hcF9hcHBfaWQgPSBwX25hcF9pbmZvLT5hcHBfaWQ7Ci0gIH0KLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1Bhbk9wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE9wZW5zIGEgY29ubmVjdGlvbiB0byBhIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBXaGVuIGNvbm5lY3Rpb24gaXMgb3BlbiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIEJUQV9QQU5fT1BFTl9FVlQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9QYW5PcGVuKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfUEFOX1JPTEUgbG9jYWxfcm9sZSwKLSAgICAgICAgICAgICAgICAgdEJUQV9QQU5fUk9MRSBwZWVyX3JvbGUpIHsKLSAgdEJUQV9QQU5fQVBJX09QRU4qIHBfYnVmID0KLSAgICAgICh0QlRBX1BBTl9BUElfT1BFTiopb3NpX21hbGxvYyhzaXplb2YodEJUQV9QQU5fQVBJX09QRU4pKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX1BBTl9BUElfT1BFTl9FVlQ7Ci0gIHBfYnVmLT5sb2NhbF9yb2xlID0gbG9jYWxfcm9sZTsKLSAgcF9idWYtPnBlZXJfcm9sZSA9IHBlZXJfcm9sZTsKLSAgcF9idWYtPmJkX2FkZHIgPSBiZF9hZGRyOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfUGFuQ2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIGEgUEFOICBjb25uZWN0aW9uIHRvIGEgcGVlciBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9QYW5DbG9zZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotCi0gIHBfYnVmLT5ldmVudCA9IEJUQV9QQU5fQVBJX0NMT1NFX0VWVDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19CmRpZmYgLS1naXQgYS9idGEvcGFuL2J0YV9wYW5fY2kuY2MgYi9idGEvcGFuL2J0YV9wYW5fY2kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjIxODcuLjAwMDAwMDAKLS0tIGEvYnRhL3Bhbi9idGFfcGFuX2NpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgZGF0YSBnYXRld2F5IGNhbGwtaW4gZnVuY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvcGFuL2J0YV9wYW5faW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jaV90eF9yZWFkeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBldmVudCB0byBQQU4gaW5kaWNhdGluZyB0aGUgcGhvbmUgaXMKLSAqICAgICAgICAgICAgICAgICAgcmVhZHkgZm9yIG1vcmUgZGF0YSBhbmQgUEFOIHNob3VsZCBjYWxsCi0gKiAgICAgICAgICAgICAgICAgIGJ0YV9wYW5fY29fdHhfcGF0aCgpLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgVFggZGF0YSBwYXRoIGlzIGNvbmZpZ3VyZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gdXNlIGEgcHVsbCBpbnRlcmZhY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY2lfdHhfcmVhZHkodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpKTsKLQotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7Ci0gIHBfYnVmLT5ldmVudCA9IEJUQV9QQU5fQ0lfVFhfUkVBRFlfRVZUOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NpX3J4X3JlYWR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIGV2ZW50IHRvIFBBTiBpbmRpY2F0aW5nIHRoZSBwaG9uZQotICogICAgICAgICAgICAgICAgICBoYXMgZGF0YSBhdmFpbGFibGUgdG8gc2VuZCB0byBQQU4gYW5kIFBBTiBzaG91bGQgY2FsbAotICogICAgICAgICAgICAgICAgICBidGFfcGFuX2NvX3J4X3BhdGgoKS4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHRoZSBSWAotICogICAgICAgICAgICAgICAgICBkYXRhIHBhdGggaXMgY29uZmlndXJlZCB0byB1c2UgYSBwdWxsIGludGVyZmFjZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jaV9yeF9yZWFkeSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9IChCVF9IRFJfUklHSUQqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpOwotCi0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLSAgcF9idWYtPmV2ZW50ID0gQlRBX1BBTl9DSV9SWF9SRUFEWV9FVlQ7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY2lfdHhfZmxvdwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGF0YSBmbG93IG9uCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBUWCBwYXRoLiAgVGhlIHBob25lIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgZGlzYWJsZSBkYXRhIGZsb3cgd2hlbiBpdCBpcyBjb25nZXN0ZWQgYW5kIGNhbm5vdCBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgYW55IG1vcmUgZGF0YSBzZW50IGJ5IGJ0YV9wYW5fY29fdHhfd3JpdGUoKS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIFRYIGRhdGEgcGF0aCBpcyBjb25maWd1cmVkIHRvIHVzZSBhIHB1c2ggaW50ZXJmYWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2NpX3R4X2Zsb3codWludDE2X3QgaGFuZGxlLCBib29sIGVuYWJsZSkgewotICB0QlRBX1BBTl9DSV9UWF9GTE9XKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9QQU5fQ0lfVFhfRkxPVyopb3NpX21hbGxvYyhzaXplb2YodEJUQV9QQU5fQ0lfVFhfRkxPVykpOwotCi0gIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfUEFOX0NJX1RYX0ZMT1dfRVZUOwotICBwX2J1Zi0+ZW5hYmxlID0gZW5hYmxlOwotCi0gIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NpX3J4X3dyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGRhdGEgdG8gUEFOIHdoZW4gdGhlIFJYIHBhdGgKLSAqICAgICAgICAgICAgICAgICAgaXMgY29uZmlndXJlZCB0byB1c2UgYSBwdXNoIGludGVyZmFjZS4gIFRoZSBmdW5jdGlvbiBjb3BpZXMKLSAqICAgICAgICAgICAgICAgICAgZGF0YSB0byBhbiBldmVudCBidWZmZXIgYW5kIHNlbmRzIGl0IHRvIFBBTi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jaV9yeF93cml0ZSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBzcmMsIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuLCBib29sIGV4dCkgewotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhQQU5fQlVGX1NJWkUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBQQU5fTUlOSU1VTV9PRkZTRVQ7Ci0KLSAgLyogY29weSBhbGwgb3RoZXIgcGFyYW1zIGJlZm9yZSB0aGUgZGF0YSAqLwotICAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX2J1ZiktPnNyYyA9IHNyYzsKLSAgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9idWYpLT5kc3QgPSBkc3Q7Ci0gICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfYnVmKS0+cHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9idWYpLT5leHQgPSBleHQ7Ci0gIHBfYnVmLT5sZW4gPSBsZW47Ci0KLSAgLyogY29weSBkYXRhICovCi0gIG1lbWNweSgodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2RhdGEsIGxlbik7Ci0KLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfUEFOX0NJX1JYX1dSSVRFQlVGX0VWVDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jaV9yeF93cml0ZWJ1ZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBkYXRhIHRvIHRoZSBwaG9uZSB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBSWCBwYXRoIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGEgcHVzaCBpbnRlcmZhY2Ugd2l0aAotICogICAgICAgICAgICAgICAgICB6ZXJvIGNvcHkuICBUaGUgZnVuY3Rpb24gc2VuZHMgYW4gZXZlbnQgdG8gUEFOIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyLiBUaGUgYnVmZmVyIHdpbGwgYmUgZnJlZWQgYnkgQlRBOyB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGhvbmUgbXVzdCBub3QgZnJlZSB0aGUgYnVmZmVyLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2NpX3J4X3dyaXRlYnVmKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHNyYywgdWludDE2X3QgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZiwgYm9vbCBleHQpIHsKLSAgLyogY29weSBhbGwgb3RoZXIgcGFyYW1zIGJlZm9yZSB0aGUgZGF0YSAqLwotICAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX2J1ZiktPnNyYyA9IHNyYzsKLSAgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9idWYpLT5kc3QgPSBkc3Q7Ci0gICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfYnVmKS0+cHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9idWYpLT5leHQgPSBleHQ7Ci0KLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOwotICBwX2J1Zi0+ZXZlbnQgPSBCVEFfUEFOX0NJX1JYX1dSSVRFQlVGX0VWVDsKLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY2lfcmVhZGJ1ZgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CVF9IRFIqIGJ0YV9wYW5fY2lfcmVhZGJ1Zih1aW50MTZfdCBoYW5kbGUsIFJhd0FkZHJlc3MmIHNyYywgUmF3QWRkcmVzcyYgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfcHJvdG9jb2wsIGJvb2wqIHBfZXh0LCBib29sKiBwX2ZvcndhcmQpIHsKLSAgdEJUQV9QQU5fU0NCKiBwX3NjYiA9IGJ0YV9wYW5fc2NiX2J5X2hhbmRsZShoYW5kbGUpOwotICBCVF9IRFIqIHBfYnVmOwotCi0gIGlmIChwX3NjYiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICBwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfc2NiLT5kYXRhX3F1ZXVlKTsKLSAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICBzcmMgPSAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX2J1ZiktPnNyYzsKLSAgICBkc3QgPSAoKHRCVEFfUEFOX0RBVEFfUEFSQU1TKilwX2J1ZiktPmRzdDsKLSAgICAqcF9wcm90b2NvbCA9ICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfYnVmKS0+cHJvdG9jb2w7Ci0gICAgKnBfZXh0ID0gKCh0QlRBX1BBTl9EQVRBX1BBUkFNUyopcF9idWYpLT5leHQ7Ci0gICAgKnBfZm9yd2FyZCA9ICgodEJUQV9QQU5fREFUQV9QQVJBTVMqKXBfYnVmKS0+Zm9yd2FyZDsKLSAgfQotCi0gIHJldHVybiBwX2J1ZjsKLX0KZGlmZiAtLWdpdCBhL2J0YS9wYW4vYnRhX3Bhbl9pbnQuaCBiL2J0YS9wYW4vYnRhX3Bhbl9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwYzQ4OS4uMDAwMDAwMAotLS0gYS9idGEvcGFuL2J0YV9wYW5faW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwcml2YXRlIGludGVyZmFjZSBmaWxlIGZvciB0aGUgQlRBIGRhdGEgZ2F0ZXdheS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfUEFOX0lOVF9ICi0jZGVmaW5lIEJUQV9QQU5fSU5UX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX3Bhbl9hcGkuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wYW5fYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUEFOIGV2ZW50cyAqLwotZW51bSB7Ci0gIC8qIHRoZXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSB0aGUgc3RhdGUgbWFjaGluZSAqLwotICBCVEFfUEFOX0FQSV9DTE9TRV9FVlQgPSBCVEFfU1lTX0VWVF9TVEFSVChCVEFfSURfUEFOKSwKLSAgQlRBX1BBTl9DSV9UWF9SRUFEWV9FVlQsCi0gIEJUQV9QQU5fQ0lfUlhfUkVBRFlfRVZULAotICBCVEFfUEFOX0NJX1RYX0ZMT1dfRVZULAotICBCVEFfUEFOX0NJX1JYX1dSSVRFX0VWVCwKLSAgQlRBX1BBTl9DSV9SWF9XUklURUJVRl9FVlQsCi0gIEJUQV9QQU5fQ09OTl9PUEVOX0VWVCwKLSAgQlRBX1BBTl9DT05OX0NMT1NFX0VWVCwKLSAgQlRBX1BBTl9CTkVQX0ZMT1dfRU5BQkxFX0VWVCwKLSAgQlRBX1BBTl9SWF9GUk9NX0JORVBfUkVBRFlfRVZULAotCi0gIC8qIHRoZXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBvdXRzaWRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lICovCi0gIEJUQV9QQU5fQVBJX0VOQUJMRV9FVlQsCi0gIEJUQV9QQU5fQVBJX0RJU0FCTEVfRVZULAotICBCVEFfUEFOX0FQSV9TRVRfUk9MRV9FVlQsCi0gIEJUQV9QQU5fQVBJX09QRU5fRVZUCi19OwotCi0vKiBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSB7IEJUQV9QQU5fSURMRV9TVCwgQlRBX1BBTl9PUEVOX1NULCBCVEFfUEFOX0NMT1NJTkdfU1QgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRGF0YSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGRhdGEgdHlwZSBmb3IgQlRBX1BBTl9BUElfRU5BQkxFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOyAgICAgICAgLyogRXZlbnQgaGVhZGVyICovCi0gIHRCVEFfUEFOX0NCQUNLKiBwX2NiYWNrOyAvKiBQQU4gY2FsbGJhY2sgZnVuY3Rpb24gKi8KLX0gdEJUQV9QQU5fQVBJX0VOQUJMRTsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfUEFOX0FQSV9SRUdfUk9MRV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXZlbnQgaGVhZGVyICovCi0gIGNoYXIgdXNlcl9uYW1lW0JUQV9TRVJWSUNFX05BTUVfTEVOICsgMV07IC8qIFNlcnZpY2UgbmFtZSAqLwotICBjaGFyIG5hcF9uYW1lW0JUQV9TRVJWSUNFX05BTUVfTEVOICsgMV07ICAvKiBTZXJ2aWNlIG5hbWUgKi8KLSAgdEJUQV9QQU5fUk9MRSByb2xlOwotICB1aW50OF90IHVzZXJfYXBwX2lkOwotICB1aW50OF90IG5hcF9hcHBfaWQ7Ci19IHRCVEFfUEFOX0FQSV9TRVRfUk9MRTsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfUEFOX0FQSV9PUEVOX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOyAgICAgICAgIC8qIEV2ZW50IGhlYWRlciAqLwotICB0QlRBX1BBTl9ST0xFIGxvY2FsX3JvbGU7IC8qIGxvY2FsIHJvbGUgKi8KLSAgdEJUQV9QQU5fUk9MRSBwZWVyX3JvbGU7ICAvKiBwZWVyIHJvbGUgKi8KLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAgICAgICAvKiBwZWVyIGJkYWRkciAqLwotfSB0QlRBX1BBTl9BUElfT1BFTjsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfUEFOX0NJX1RYX0ZMT1dfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7IC8qIEV2ZW50IGhlYWRlciAqLwotICBib29sIGVuYWJsZTsgLyogRmxvdyBjb250cm9sIHNldHRpbmcgKi8KLX0gdEJUQV9QQU5fQ0lfVFhfRkxPVzsKLQotLyogZGF0YSB0eXBlIGZvciBCVEFfUEFOX0NPTk5fT1BFTl9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSX1JJR0lEIGhkcjsgLyogRXZlbnQgaGVhZGVyICovCi0gIHRQQU5fUkVTVUxUIHJlc3VsdDsKLQotfSB0QlRBX1BBTl9DT05OOwotCi0vKiBwYW4gZGF0YSBwYXJhbSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFJfUklHSUQgaGRyOwotICBSYXdBZGRyZXNzIHNyYzsKLSAgUmF3QWRkcmVzcyBkc3Q7Ci0gIHVpbnQxNl90IHByb3RvY29sOwotICBib29sIGV4dDsKLSAgYm9vbCBmb3J3YXJkOwotCi19IHRCVEFfUEFOX0RBVEFfUEFSQU1TOwotCi0vKiB1bmlvbiBvZiBhbGwgZGF0YSB0eXBlcyAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVEFfUEFOX0FQSV9FTkFCTEUgYXBpX2VuYWJsZTsKLSAgdEJUQV9QQU5fQVBJX1NFVF9ST0xFIGFwaV9zZXRfcm9sZTsKLSAgdEJUQV9QQU5fQVBJX09QRU4gYXBpX29wZW47Ci0gIHRCVEFfUEFOX0NJX1RYX0ZMT1cgY2lfdHhfZmxvdzsKLSAgdEJUQV9QQU5fQ09OTiBjb25uOwotICB0QlRBX1BBTl9EQVRBX1BBUkFNUyBwYXJhbXM7Ci19IHRCVEFfUEFOX0RBVEE7Ci0KLS8qIHN0YXRlIG1hY2hpbmUgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7IC8qIHBlZXIgYmRhZGRyICovCi0gIGZpeGVkX3F1ZXVlX3QqCi0gICAgICBkYXRhX3F1ZXVlOyAgICAvKiBRdWV1ZSBvZiBidWZmZXJzIHdhaXRpbmcgdG8gYmUgcGFzc2VkIHRvIGFwcGxpY2F0aW9uICovCi0gIHVpbnQxNl90IGhhbmRsZTsgICAvKiBCVEEgUEFOL0JORVAgaGFuZGxlICovCi0gIGJvb2wgaW5fdXNlOyAgICAgICAvKiBzY2IgaW4gdXNlICovCi0gIHRCVEFfU0VDIHNlY19tYXNrOyAvKiBTZWN1cml0eSBtYXNrICovCi0gIGJvb2wgcGFuX2Zsb3dfZW5hYmxlOyAgICAgLyogQk5FUCBmbG93IGNvbnRyb2wgc3RhdGUgKi8KLSAgYm9vbCBhcHBfZmxvd19lbmFibGU7ICAgICAvKiBBcHBsaWNhdGlvbiBmbG93IGNvbnRyb2wgc3RhdGUgKi8KLSAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgICAvKiBTdGF0ZSBtYWNoaW5lIHN0YXRlICovCi0gIHRCVEFfUEFOX1JPTEUgbG9jYWxfcm9sZTsgLyogbG9jYWwgcm9sZSAqLwotICB0QlRBX1BBTl9ST0xFIHBlZXJfcm9sZTsgIC8qIHBlZXIgcm9sZSAqLwotICB1aW50OF90IGFwcF9pZDsgICAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGlkIGZvciB0aGUgY29ubmVjdGlvbiAqLwotCi19IHRCVEFfUEFOX1NDQjsKLQotLyogbWFpbiBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfUEFOX1NDQiBzY2JbQlRBX1BBTl9OVU1fQ09OTl07IC8qIHN0YXRlIG1hY2hpbmUgY29udHJvbCBibG9ja3MgKi8KLSAgdEJUQV9QQU5fQ0JBQ0sqIHBfY2JhY2s7ICAgICAgICAgICAgLyogUEFOIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIHVpbnQ4X3QgYXBwX2lkWzNdOyAgICAgICAgICAgICAgICAgIC8qIGFwcGxpY2F0aW9uIGlkIGZvciBQQU4gcm9sZXMgKi8KLSAgdWludDhfdCBmbG93X21hc2s7ICAgICAgICAgICAgICAgICAgLyogRGF0YSBmbG93IG1hc2sgKi8KLSAgdWludDhfdCBxX2xldmVsOyAvKiBxdWV1ZSBsZXZlbCBzZXQgYnkgYXBwbGljYXRpb24gZm9yIFRYIGRhdGEgKi8KLQotfSB0QlRBX1BBTl9DQjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQQU4gY29udHJvbCBibG9jayAqLwotZXh0ZXJuIHRCVEFfUEFOX0NCIGJ0YV9wYW5fY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRCVEFfUEFOX1NDQiogYnRhX3Bhbl9zY2JfYWxsb2Modm9pZCk7Ci1leHRlcm4gdm9pZCBidGFfcGFuX3NjYl9kZWFsbG9jKHRCVEFfUEFOX1NDQiogcF9zY2IpOwotZXh0ZXJuIHVpbnQ4X3QgYnRhX3Bhbl9zY2JfdG9faWR4KHRCVEFfUEFOX1NDQiogcF9zY2IpOwotZXh0ZXJuIHRCVEFfUEFOX1NDQiogYnRhX3Bhbl9zY2JfYnlfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gYm9vbCBidGFfcGFuX2hkbF9ldmVudChCVF9IRFJfUklHSUQqIHBfbXNnKTsKLQotLyogYWN0aW9uIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9lbmFibGUodEJUQV9QQU5fREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9wYW5fZGlzYWJsZSh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9wYW5fc2V0X3JvbGUodEJUQV9QQU5fREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9wYW5fb3Blbih0QlRBX1BBTl9TQ0IqIHBfc2NiLCB0QlRBX1BBTl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl9hcGlfY2xvc2UodEJUQV9QQU5fU0NCKiBwX3NjYiwgdEJUQV9QQU5fREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9wYW5fcnhfcGF0aCh0QlRBX1BBTl9TQ0IqIHBfc2NiLCB0QlRBX1BBTl9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX3Bhbl90eF9wYXRoKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfcGFuX3R4X2Zsb3codEJUQV9QQU5fU0NCKiBwX3NjYiwgdEJUQV9QQU5fREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9wYW5fY29ubl9vcGVuKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfcGFuX2Nvbm5fY2xvc2UodEJUQV9QQU5fU0NCKiBwX3NjYiwgdEJUQV9QQU5fREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9wYW5fd3JpdGVfYnVmKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfcGFuX2ZyZWVfYnVmKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSk7Ci0KLSNlbmRpZiAvKiBCVEFfUEFOX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvcGFuL2J0YV9wYW5fbWFpbi5jYyBiL2J0YS9wYW4vYnRhX3Bhbl9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWQ5NTkzLi4wMDAwMDAwCi0tLSBhL2J0YS9wYW4vYnRhX3Bhbl9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQQU4gbWFpbiBmdW5jdGlvbnMgYW5kIHN0YXRlIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpbmNsdWRlICJidGEvcGFuL2J0YV9wYW5faW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29uc3RhbnRzIGFuZCB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHN0YXRlIG1hY2hpbmUgYWN0aW9uIGVudW1lcmF0aW9uIGxpc3QgKi8KLWVudW0gewotICBCVEFfUEFOX0FQSV9DTE9TRSwKLSAgQlRBX1BBTl9UWF9QQVRILAotICBCVEFfUEFOX1JYX1BBVEgsCi0gIEJUQV9QQU5fVFhfRkxPVywKLSAgQlRBX1BBTl9XUklURV9CVUYsCi0gIEJUQV9QQU5fQ09OTl9PUEVOLAotICBCVEFfUEFOX0NPTk5fQ0xPU0UsCi0gIEJUQV9QQU5fRlJFRV9CVUYsCi0gIEJUQV9QQU5fSUdOT1JFLAotICBCVEFfUEFOX01BWF9BQ1RJT05TCi19OwotCi0vKiB0eXBlIGZvciBhY3Rpb24gZnVuY3Rpb25zICovCi10eXBlZGVmIHZvaWQgKCp0QlRBX1BBTl9BQ1RJT04pKHRCVEFfUEFOX1NDQiogcF9zY2IsIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIGFjdGlvbiBmdW5jdGlvbiBsaXN0ICovCi1jb25zdCB0QlRBX1BBTl9BQ1RJT04gYnRhX3Bhbl9hY3Rpb25bXSA9IHsKLSAgICBidGFfcGFuX2FwaV9jbG9zZSwgYnRhX3Bhbl90eF9wYXRoLCAgIGJ0YV9wYW5fcnhfcGF0aCwgICAgYnRhX3Bhbl90eF9mbG93LAotICAgIGJ0YV9wYW5fd3JpdGVfYnVmLCBidGFfcGFuX2Nvbm5fb3BlbiwgYnRhX3Bhbl9jb25uX2Nsb3NlLCBidGFfcGFuX2ZyZWVfYnVmLAotCi19OwotCi0vKiBzdGF0ZSB0YWJsZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBCVEFfUEFOX0FDVElPTlMgMSAgICAvKiBudW1iZXIgb2YgYWN0aW9ucyAqLwotI2RlZmluZSBCVEFfUEFOX05FWFRfU1RBVEUgMSAvKiBwb3NpdGlvbiBvZiBuZXh0IHN0YXRlICovCi0jZGVmaW5lIEJUQV9QQU5fTlVNX0NPTFMgMiAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwotCi0vKiBzdGF0ZSB0YWJsZSBmb3IgbGlzdGVuIHN0YXRlICovCi1jb25zdCB1aW50OF90IGJ0YV9wYW5fc3RfaWRsZVtdW0JUQV9QQU5fTlVNX0NPTFNdID0gewotICAgIC8qIEFQSV9DTE9TRSAqLyB7QlRBX1BBTl9BUElfQ0xPU0UsIEJUQV9QQU5fSURMRV9TVH0sCi0gICAgLyogQ0lfVFhfUkVBRFkgKi8ge0JUQV9QQU5fSUdOT1JFLCBCVEFfUEFOX0lETEVfU1R9LAotICAgIC8qIENJX1JYX1JFQURZICovIHtCVEFfUEFOX0lHTk9SRSwgQlRBX1BBTl9JRExFX1NUfSwKLSAgICAvKiBDSV9UWF9GTE9XICovIHtCVEFfUEFOX0lHTk9SRSwgQlRBX1BBTl9JRExFX1NUfSwKLSAgICAvKiBDSV9SWF9XUklURSAqLyB7QlRBX1BBTl9JR05PUkUsIEJUQV9QQU5fSURMRV9TVH0sCi0gICAgLyogQ0lfUlhfV1JJVEVCVUYgKi8ge0JUQV9QQU5fSUdOT1JFLCBCVEFfUEFOX0lETEVfU1R9LAotICAgIC8qIFBBTl9DT05OX09QRU4gKi8ge0JUQV9QQU5fQ09OTl9PUEVOLCBCVEFfUEFOX09QRU5fU1R9LAotICAgIC8qIFBBTl9DT05OX0NMT1NFICovIHtCVEFfUEFOX0NPTk5fT1BFTiwgQlRBX1BBTl9JRExFX1NUfSwKLSAgICAvKiBGTE9XX0VOQUJMRSAqLyB7QlRBX1BBTl9JR05PUkUsIEJUQV9QQU5fSURMRV9TVH0sCi0gICAgLyogQk5FUF9EQVRBICovIHtCVEFfUEFOX0lHTk9SRSwgQlRBX1BBTl9JRExFX1NUfQotCi19OwotCi0vKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBidGFfcGFuX3N0X29wZW5bXVtCVEFfUEFOX05VTV9DT0xTXSA9IHsKLSAgICAvKiBBUElfQ0xPU0UgKi8ge0JUQV9QQU5fQVBJX0NMT1NFLCBCVEFfUEFOX09QRU5fU1R9LAotICAgIC8qIENJX1RYX1JFQURZICovIHtCVEFfUEFOX1RYX1BBVEgsIEJUQV9QQU5fT1BFTl9TVH0sCi0gICAgLyogQ0lfUlhfUkVBRFkgKi8ge0JUQV9QQU5fUlhfUEFUSCwgQlRBX1BBTl9PUEVOX1NUfSwKLSAgICAvKiBDSV9UWF9GTE9XICovIHtCVEFfUEFOX1RYX0ZMT1csIEJUQV9QQU5fT1BFTl9TVH0sCi0gICAgLyogQ0lfUlhfV1JJVEUgKi8ge0JUQV9QQU5fSUdOT1JFLCBCVEFfUEFOX09QRU5fU1R9LAotICAgIC8qIENJX1JYX1dSSVRFQlVGICovIHtCVEFfUEFOX1dSSVRFX0JVRiwgQlRBX1BBTl9PUEVOX1NUfSwKLSAgICAvKiBQQU5fQ09OTl9PUEVOICovIHtCVEFfUEFOX0lHTk9SRSwgQlRBX1BBTl9PUEVOX1NUfSwKLSAgICAvKiBQQU5fQ09OTl9DTE9TRSAqLyB7QlRBX1BBTl9DT05OX0NMT1NFLCBCVEFfUEFOX0lETEVfU1R9LAotICAgIC8qIEZMT1dfRU5BQkxFICovIHtCVEFfUEFOX1JYX1BBVEgsIEJUQV9QQU5fT1BFTl9TVH0sCi0gICAgLyogQk5FUF9EQVRBICovIHtCVEFfUEFOX1RYX1BBVEgsIEJUQV9QQU5fT1BFTl9TVH19OwotCi0vKiBzdGF0ZSB0YWJsZSBmb3IgY2xvc2luZyBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBidGFfcGFuX3N0X2Nsb3NpbmdbXVtCVEFfUEFOX05VTV9DT0xTXSA9IHsKLSAgICAvKiBBUElfQ0xPU0UgKi8ge0JUQV9QQU5fSUdOT1JFLCBCVEFfUEFOX0NMT1NJTkdfU1R9LAotICAgIC8qIENJX1RYX1JFQURZICovIHtCVEFfUEFOX1RYX1BBVEgsIEJUQV9QQU5fQ0xPU0lOR19TVH0sCi0gICAgLyogQ0lfUlhfUkVBRFkgKi8ge0JUQV9QQU5fUlhfUEFUSCwgQlRBX1BBTl9DTE9TSU5HX1NUfSwKLSAgICAvKiBDSV9UWF9GTE9XICovIHtCVEFfUEFOX1RYX0ZMT1csIEJUQV9QQU5fQ0xPU0lOR19TVH0sCi0gICAgLyogQ0lfUlhfV1JJVEUgKi8ge0JUQV9QQU5fSUdOT1JFLCBCVEFfUEFOX0NMT1NJTkdfU1R9LAotICAgIC8qIENJX1JYX1dSSVRFQlVGICovIHtCVEFfUEFOX0ZSRUVfQlVGLCBCVEFfUEFOX0NMT1NJTkdfU1R9LAotICAgIC8qIFBBTl9DT05OX09QRU4gKi8ge0JUQV9QQU5fSUdOT1JFLCBCVEFfUEFOX0NMT1NJTkdfU1R9LAotICAgIC8qIFBBTl9DT05OX0NMT1NFICovIHtCVEFfUEFOX0NPTk5fQ0xPU0UsIEJUQV9QQU5fSURMRV9TVH0sCi0gICAgLyogRkxPV19FTkFCTEUgKi8ge0JUQV9QQU5fUlhfUEFUSCwgQlRBX1BBTl9DTE9TSU5HX1NUfSwKLSAgICAvKiBCTkVQX0RBVEEgKi8ge0JUQV9QQU5fVFhfUEFUSCwgQlRBX1BBTl9DTE9TSU5HX1NUfX07Ci0KLS8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX1BBTl9TVF9UQkwpW0JUQV9QQU5fTlVNX0NPTFNdOwotCi0vKiBzdGF0ZSB0YWJsZSAqLwotY29uc3QgdEJUQV9QQU5fU1RfVEJMIGJ0YV9wYW5fc3RfdGJsW10gPSB7YnRhX3Bhbl9zdF9pZGxlLCBidGFfcGFuX3N0X29wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfcGFuX3N0X2Nsb3Npbmd9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEdsb2JhbCBkYXRhCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUEFOIGNvbnRyb2wgYmxvY2sgKi8KLXRCVEFfUEFOX0NCIGJ0YV9wYW5fY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX3NjYl9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWxsb2NhdGUgYSBQQU4gc2VydmVyIGNvbnRyb2wgYmxvY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2NiLCBvciBOVUxMIGlmIG5vbmUgY291bGQgYmUgYWxsb2NhdGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX1BBTl9TQ0IqIGJ0YV9wYW5fc2NiX2FsbG9jKHZvaWQpIHsKLSAgdEJUQV9QQU5fU0NCKiBwX3NjYiA9ICZidGFfcGFuX2NiLnNjYlswXTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9QQU5fTlVNX0NPTk47IGkrKywgcF9zY2IrKykgewotICAgIGlmICghcF9zY2ItPmluX3VzZSkgewotICAgICAgcF9zY2ItPmluX3VzZSA9IHRydWU7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfcGFuX3NjYl9hbGxvYyAlZCIsIGkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGkgPT0gQlRBX1BBTl9OVU1fQ09OTikgewotICAgIC8qIG91dCBvZiBzY2JzICovCi0gICAgcF9zY2IgPSBOVUxMOwotICAgIEFQUExfVFJBQ0VfV0FSTklORygiT3V0IG9mIHNjYnMiKTsKLSAgfQotICByZXR1cm4gcF9zY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX3NtX2V4ZWN1dGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXRlIG1hY2hpbmUgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24gZm9yIFBBTgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRhX3Bhbl9zbV9leGVjdXRlKHRCVEFfUEFOX1NDQiogcF9zY2IsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfUEFOX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX1BBTl9TVF9UQkwgc3RhdGVfdGFibGU7Ci0gIHVpbnQ4X3QgYWN0aW9uOwotICBpbnQgaTsKLQotICBBUFBMX1RSQUNFX0VWRU5UKCJQQU4gc2NiPSVkIGV2ZW50PTB4JXggc3RhdGU9JWQiLCBidGFfcGFuX3NjYl90b19pZHgocF9zY2IpLAotICAgICAgICAgICAgICAgICAgIGV2ZW50LCBwX3NjYi0+c3RhdGUpOwotCi0gIC8qIGxvb2sgdXAgdGhlIHN0YXRlIHRhYmxlIGZvciB0aGUgY3VycmVudCBzdGF0ZSAqLwotICBzdGF0ZV90YWJsZSA9IGJ0YV9wYW5fc3RfdGJsW3Bfc2NiLT5zdGF0ZV07Ci0KLSAgZXZlbnQgJj0gMHgwMEZGOwotCi0gIC8qIHNldCBuZXh0IHN0YXRlICovCi0gIHBfc2NiLT5zdGF0ZSA9IHN0YXRlX3RhYmxlW2V2ZW50XVtCVEFfUEFOX05FWFRfU1RBVEVdOwotCi0gIC8qIGV4ZWN1dGUgYWN0aW9uIGZ1bmN0aW9ucyAqLwotICBmb3IgKGkgPSAwOyBpIDwgQlRBX1BBTl9BQ1RJT05TOyBpKyspIHsKLSAgICBhY3Rpb24gPSBzdGF0ZV90YWJsZVtldmVudF1baV07Ci0gICAgQ0hFQ0soYWN0aW9uIDwgQlRBX1BBTl9NQVhfQUNUSU9OUyk7Ci0gICAgaWYgKGFjdGlvbiA9PSBCVEFfUEFOX0lHTk9SRSkgY29udGludWU7Ci0gICAgKCpidGFfcGFuX2FjdGlvblthY3Rpb25dKShwX3NjYiwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9hcGlfZW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gQVBJIGVuYWJsZSBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9wYW5fYXBpX2VuYWJsZSh0QlRBX1BBTl9EQVRBKiBwX2RhdGEpIHsKLSAgLyogaW5pdGlhbGl6ZSBjb250cm9sIGJsb2NrICovCi0gIG1lbXNldCgmYnRhX3Bhbl9jYiwgMCwgc2l6ZW9mKGJ0YV9wYW5fY2IpKTsKLQotICAvKiBzdG9yZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotICBidGFfcGFuX2NiLnBfY2JhY2sgPSBwX2RhdGEtPmFwaV9lbmFibGUucF9jYmFjazsKLSAgYnRhX3Bhbl9lbmFibGUocF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fYXBpX2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhbiBBUEkgZGlzYWJsZSBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9wYW5fYXBpX2Rpc2FibGUoVU5VU0VEX0FUVFIgdEJUQV9QQU5fREFUQSogcF9kYXRhKSB7Ci0gIGJ0YV9wYW5fZGlzYWJsZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9hcGlfb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIEFQSSBsaXN0ZW4gZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfcGFuX2FwaV9vcGVuKHRCVEFfUEFOX0RBVEEqIHBfZGF0YSkgewotICB0QlRBX1BBTl9TQ0IqIHBfc2NiOwotICB0QlRBX1BBTiBidGFfcGFuOwotCi0gIC8qIGFsbG9jYXRlIGFuIHNjYiAqLwotICBwX3NjYiA9IGJ0YV9wYW5fc2NiX2FsbG9jKCk7Ci0gIGlmIChwX3NjYiAhPSBOVUxMKSB7Ci0gICAgYnRhX3Bhbl9vcGVuKHBfc2NiLCBwX2RhdGEpOwotICB9IGVsc2UgewotICAgIGJ0YV9wYW4ub3Blbi5iZF9hZGRyID0gcF9kYXRhLT5hcGlfb3Blbi5iZF9hZGRyOwotICAgIGJ0YV9wYW4ub3Blbi5zdGF0dXMgPSBCVEFfUEFOX0ZBSUw7Ci0gICAgYnRhX3Bhbl9jYi5wX2NiYWNrKEJUQV9QQU5fT1BFTl9FVlQsICZidGFfcGFuKTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fc2NiX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlYWxsb2NhdGUgYSBsaW5rIGNvbnRyb2wgYmxvY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fc2NiX2RlYWxsb2ModEJUQV9QQU5fU0NCKiBwX3NjYikgewotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfcGFuX3NjYl9kZWFsbG9jICVkIiwgYnRhX3Bhbl9zY2JfdG9faWR4KHBfc2NiKSk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUocF9zY2ItPmRhdGFfcXVldWUsIE5VTEwpOwotICBtZW1zZXQocF9zY2IsIDAsIHNpemVvZih0QlRBX1BBTl9TQ0IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fc2NiX3RvX2lkeAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gYSBwb2ludGVyIHRvIGFuIHNjYiwgcmV0dXJuIGl0cyBpbmRleC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBJbmRleCBvZiBzY2IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRhX3Bhbl9zY2JfdG9faWR4KHRCVEFfUEFOX1NDQiogcF9zY2IpIHsKLSAgcmV0dXJuICgodWludDhfdCkocF9zY2IgLSBidGFfcGFuX2NiLnNjYikpICsgMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fc2NiX2J5X2hhbmRsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZCBzY2IgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHNjYiBvciBOVUxMIGlmIG5vdCBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9QQU5fU0NCKiBidGFfcGFuX3NjYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIHRCVEFfUEFOX1NDQiogcF9zY2IgPSAmYnRhX3Bhbl9jYi5zY2JbMF07Ci0gIHVpbnQ4X3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRBX1BBTl9OVU1fQ09OTjsgaSsrLCBwX3NjYisrKSB7Ci0gICAgaWYgKHBfc2NiLT5oYW5kbGUgPT0gaGFuZGxlKSB7Ci0gICAgICByZXR1cm4gcF9zY2I7Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLSAgQVBQTF9UUkFDRV9XQVJOSU5HKCJObyBzY2IgZm9yIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2hkbF9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGF0YSBnYXRld2F5IG1haW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9wYW5faGRsX2V2ZW50KEJUX0hEUl9SSUdJRCogcF9tc2cpIHsKLSAgdEJUQV9QQU5fU0NCKiBwX3NjYjsKLSAgYm9vbCBmcmVlYnVmID0gdHJ1ZTsKLQotICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkgewotICAgIC8qIGhhbmRsZSBlbmFibGUgZXZlbnQgKi8KLSAgICBjYXNlIEJUQV9QQU5fQVBJX0VOQUJMRV9FVlQ6Ci0gICAgICBidGFfcGFuX2FwaV9lbmFibGUoKHRCVEFfUEFOX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogaGFuZGxlIGRpc2FibGUgZXZlbnQgKi8KLSAgICBjYXNlIEJUQV9QQU5fQVBJX0RJU0FCTEVfRVZUOgotICAgICAgYnRhX3Bhbl9hcGlfZGlzYWJsZSgodEJUQV9QQU5fREFUQSopcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBoYW5kbGUgc2V0IHJvbGUgZXZlbnQgKi8KLSAgICBjYXNlIEJUQV9QQU5fQVBJX1NFVF9ST0xFX0VWVDoKLSAgICAgIGJ0YV9wYW5fc2V0X3JvbGUoKHRCVEFfUEFOX0RBVEEqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogaGFuZGxlIG9wZW4gZXZlbnQgKi8KLSAgICBjYXNlIEJUQV9QQU5fQVBJX09QRU5fRVZUOgotICAgICAgYnRhX3Bhbl9hcGlfb3BlbigodEJUQV9QQU5fREFUQSopcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBldmVudHMgdGhhdCByZXF1aXJlIGJ1ZmZlciBub3QgYmUgcmVsZWFzZWQgKi8KLSAgICBjYXNlIEJUQV9QQU5fQ0lfUlhfV1JJVEVCVUZfRVZUOgotICAgICAgZnJlZWJ1ZiA9IGZhbHNlOwotICAgICAgcF9zY2IgPSBidGFfcGFuX3NjYl9ieV9oYW5kbGUocF9tc2ctPmxheWVyX3NwZWNpZmljKTsKLSAgICAgIGlmIChwX3NjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGJ0YV9wYW5fc21fZXhlY3V0ZShwX3NjYiwgcF9tc2ctPmV2ZW50LCAodEJUQV9QQU5fREFUQSopcF9tc2cpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBhbGwgb3RoZXIgZXZlbnRzICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHBfc2NiID0gYnRhX3Bhbl9zY2JfYnlfaGFuZGxlKHBfbXNnLT5sYXllcl9zcGVjaWZpYyk7Ci0gICAgICBpZiAocF9zY2IgIT0gTlVMTCkgewotICAgICAgICBidGFfcGFuX3NtX2V4ZWN1dGUocF9zY2IsIHBfbXNnLT5ldmVudCwgKHRCVEFfUEFOX0RBVEEqKXBfbXNnKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBmcmVlYnVmOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3BiL2J0YV9wYnNfaW50LmggYi9idGEvcGIvYnRhX3Bic19pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2YTVmOS4uMDAwMDAwMAotLS0gYS9idGEvcGIvYnRhX3Bic19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHJpdmF0ZSBmaWxlIGZvciB0aGUgcGhvbmUgYm9vayBhY2Nlc3Mgc2VydmVyIChQQlMpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUQV9QQlNfSU5UX0gKLSNkZWZpbmUgQlRBX1BCU19JTlRfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUHJvZmlsZSBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLSNkZWZpbmUgQlRBX1BCU19TVVBGX0RPV05MT0FEIDB4MDAwMQotI2RlZmluZSBCVEFfUEJTX1NVUkZfQlJPV1NFIDB4MDAwMgotCi0vKiBQcm9maWxlIHN1cHBvcnRlZCByZXBvc2l0b3JpZXMgKi8KLSNkZWZpbmUgQlRBX1BCU19SRVBPU0lUX0xPQ0FMIDB4MDEgLyogTG9jYWwgUGhvbmVCb29rICovCi0jZGVmaW5lIEJUQV9QQlNfUkVQT1NJVF9TSU0gMHgwMiAgIC8qIFNJTSBjYXJkIFBob25lQm9vayAqLwotCi0jZGVmaW5lIEJUQV9QQlNfVEFSR0VUX1VVSUQgXAotICAiXHg3OVx4NjFceDM1XHhmMFx4ZjBceGM1XHgxMVx4ZDhceDA5XHg2Nlx4MDhceDAwXHgyMFx4MGNceDlhXHg2NiIKLSNkZWZpbmUgQlRBX1BCU19VVUlEX0xFTkdUSCAxNgotI2RlZmluZSBCVEFfUEJTX01BWF9BVVRIX0tFWV9TSVpFIFwKLSAgMTYgLyogTXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIE9CWF9NQVhfQVVUSF9LRVlfU0laRSAqLwotCi0jZGVmaW5lIEJUQV9QQlNfREVGQVVMVF9WRVJTSU9OIDB4MDEwMSAvKiBmb3IgUEJBUCBQU0UgdmVyc2lvbiAxLjEgKi8KLQotLyogQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCByZWFsbV9jaGFyc2V0OyAvKiBTZXJ2ZXIgb25seSAqLwotICBib29sIHVzZXJpZF9yZXE7IC8qIHRydWUgaWYgdXNlciBpZCBpcyByZXF1aXJlZCBkdXJpbmcgb2JleCBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgIChTZXJ2ZXIgb25seSkgKi8KLSAgdWludDhfdCBzdXBwb3J0ZWRfZmVhdHVyZXM7ICAgICAvKiBTZXJ2ZXIgc3VwcG9ydGVkIGZlYXR1cmVzICovCi0gIHVpbnQ4X3Qgc3VwcG9ydGVkX3JlcG9zaXRvcmllczsgLyogU2VydmVyIHN1cHBvcnRlZCByZXBvc2l0b3JpZXMgKi8KLQotfSB0QlRBX1BCU19DRkc7Ci0KLSNlbmRpZiAvKiBCVEFfUEJTX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvc2RwL2J0YV9zZHAuY2MgYi9idGEvc2RwL2J0YV9zZHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjVjN2YuLjAwMDAwMDAKLS0tIGEvYnRhL3NkcC9idGFfc2RwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgbWFpbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciB0aGUgQlRBIE1DRSBJL0YKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRhL3NkcC9idGFfc2RwX2ludC5oIgotCi10QlRBX1NEUF9DQiBidGFfc2RwX2NiOwpkaWZmIC0tZ2l0IGEvYnRhL3NkcC9idGFfc2RwX2FjdC5jYyBiL2J0YS9zZHAvYnRhX3NkcF9hY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTJlOTMuLjAwMDAwMDAKLS0tIGEvYnRhL3NkcC9idGFfc2RwX2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFjdGlvbiBmdW5jdGlvbnMgZm9yIFNEUCBzZWFyY2guCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc2RwLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9zZHBfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3NkcC9idGFfc2RwX2ludC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3NvY2tfc2RwLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgdm9pZCBidGFfY3JlYXRlX21uc19zZHBfcmVjb3JkKGJsdWV0b290aF9zZHBfcmVjb3JkKiByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfcmVjKSB7Ci0gIHRTRFBfRElTQ19BVFRSKiBwX2F0dHI7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLSAgdWludDE2X3QgcHZlcnNpb24gPSAwOwotICByZWNvcmQtPm1ucy5oZHIudHlwZSA9IFNEUF9UWVBFX01BUF9NTlM7Ci0gIHJlY29yZC0+bW5zLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0gMDsKLSAgcmVjb3JkLT5tbnMuaGRyLnNlcnZpY2VfbmFtZSA9IE5VTEw7Ci0gIHJlY29yZC0+bW5zLmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXIgPSAwOwotICByZWNvcmQtPm1ucy5oZHIubDJjYXBfcHNtID0gLTE7Ci0gIHJlY29yZC0+bW5zLmhkci5wcm9maWxlX3ZlcnNpb24gPSAwOwotICByZWNvcmQtPm1ucy5zdXBwb3J0ZWRfZmVhdHVyZXMgPSAweDAwMDAwMDFGOyAgLy8gZGVmYXVsdCB2YWx1ZSBpZiBub3QgZm91bmQKLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX01BUF9TVVBQT1JURURfRkVBVFVSRVMpOwotICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICByZWNvcmQtPm1ucy5zdXBwb3J0ZWRfZmVhdHVyZXMgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MzI7Ci0gIH0KLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+bW5zLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0KLSAgICAgICAgU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICByZWNvcmQtPm1ucy5oZHIuc2VydmljZV9uYW1lID0gKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5OwotICB9Ci0KLSAgaWYgKFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhwX3JlYywgVVVJRF9TRVJWQ0xBU1NfTUFQX1BST0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB2ZXJzaW9uKSkgewotICAgIHJlY29yZC0+bW5zLmhkci5wcm9maWxlX3ZlcnNpb24gPSBwdmVyc2lvbjsKLSAgfQotCi0gIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3JlYywgVVVJRF9QUk9UT0NPTF9SRkNPTU0sICZwZSkpIHsKLSAgICByZWNvcmQtPm1ucy5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyID0gcGUucGFyYW1zWzBdOwotICB9Ci0KLSAgcF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9HT0VQX0wyQ0FQX1BTTSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+bW5zLmhkci5sMmNhcF9wc20gPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2NyZWF0ZV9tYXNfc2RwX3JlY29yZChibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYykgewotICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyOwotICB0U0RQX1BST1RPQ09MX0VMRU0gcGU7Ci0gIHVpbnQxNl90IHB2ZXJzaW9uID0gLTE7Ci0KLSAgcmVjb3JkLT5tYXMuaGRyLnR5cGUgPSBTRFBfVFlQRV9NQVBfTUFTOwotICByZWNvcmQtPm1hcy5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCA9IDA7Ci0gIHJlY29yZC0+bWFzLmhkci5zZXJ2aWNlX25hbWUgPSBOVUxMOwotICByZWNvcmQtPm1hcy5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyID0gMDsKLSAgcmVjb3JkLT5tYXMuaGRyLmwyY2FwX3BzbSA9IC0xOwotICByZWNvcmQtPm1hcy5oZHIucHJvZmlsZV92ZXJzaW9uID0gMDsKLSAgcmVjb3JkLT5tYXMubWFzX2luc3RhbmNlX2lkID0gMDsKLSAgcmVjb3JkLT5tYXMuc3VwcG9ydGVkX2ZlYXR1cmVzID0gMHgwMDAwMDAxRjsKLSAgcmVjb3JkLT5tYXMuc3VwcG9ydGVkX21lc3NhZ2VfdHlwZXMgPSAwOwotCi0gIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfTUFTX0lOU1RBTkNFX0lEKTsKLSAgaWYgKHBfYXR0ciAhPSBOVUxMKSB7Ci0gICAgcmVjb3JkLT5tYXMubWFzX2luc3RhbmNlX2lkID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTg7Ci0gIH0KLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NVUFBPUlRFRF9NU0dfVFlQRSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+bWFzLnN1cHBvcnRlZF9tZXNzYWdlX3R5cGVzID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTg7Ci0gIH0KLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX01BUF9TVVBQT1JURURfRkVBVFVSRVMpOwotICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICByZWNvcmQtPm1hcy5zdXBwb3J0ZWRfZmVhdHVyZXMgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MzI7Ci0gIH0KLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+bWFzLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0KLSAgICAgICAgU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICByZWNvcmQtPm1hcy5oZHIuc2VydmljZV9uYW1lID0gKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5OwotICB9Ci0KLSAgaWYgKFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhwX3JlYywgVVVJRF9TRVJWQ0xBU1NfTUFQX1BST0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB2ZXJzaW9uKSkgewotICAgIHJlY29yZC0+bWFzLmhkci5wcm9maWxlX3ZlcnNpb24gPSBwdmVyc2lvbjsKLSAgfQotCi0gIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3JlYywgVVVJRF9QUk9UT0NPTF9SRkNPTU0sICZwZSkpIHsKLSAgICByZWNvcmQtPm1hcy5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyID0gcGUucGFyYW1zWzBdOwotICB9Ci0KLSAgcF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9HT0VQX0wyQ0FQX1BTTSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+bWFzLmhkci5sMmNhcF9wc20gPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2NyZWF0ZV9wc2Vfc2RwX3JlY29yZChibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYykgewotICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyOwotICB1aW50MTZfdCBwdmVyc2lvbjsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHBlOwotCi0gIHJlY29yZC0+cHNlLmhkci50eXBlID0gU0RQX1RZUEVfUEJBUF9QU0U7Ci0gIHJlY29yZC0+cHNlLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0gMDsKLSAgcmVjb3JkLT5wc2UuaGRyLnNlcnZpY2VfbmFtZSA9IE5VTEw7Ci0gIHJlY29yZC0+cHNlLmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXIgPSAwOwotICByZWNvcmQtPnBzZS5oZHIubDJjYXBfcHNtID0gLTE7Ci0gIHJlY29yZC0+cHNlLmhkci5wcm9maWxlX3ZlcnNpb24gPSAwOwotICByZWNvcmQtPnBzZS5zdXBwb3J0ZWRfZmVhdHVyZXMgPSAweDAwMDAwMDAzOwotICByZWNvcmQtPnBzZS5zdXBwb3J0ZWRfcmVwb3NpdG9yaWVzID0gMDsKLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NVUFBPUlRFRF9SRVBPU0lUT1JJRVMpOwotICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICByZWNvcmQtPnBzZS5zdXBwb3J0ZWRfcmVwb3NpdG9yaWVzID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTg7Ci0gIH0KLSAgcF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9QQkFQX1NVUFBPUlRFRF9GRUFUVVJFUyk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+cHNlLnN1cHBvcnRlZF9mZWF0dXJlcyA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUzMjsKLSAgfQotCi0gIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU0VSVklDRV9OQU1FKTsKLSAgaWYgKHBfYXR0ciAhPSBOVUxMKSB7Ci0gICAgcmVjb3JkLT5wc2UuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggPQotICAgICAgICBTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpOwotICAgIHJlY29yZC0+cHNlLmhkci5zZXJ2aWNlX25hbWUgPSAoY2hhciopcF9hdHRyLT5hdHRyX3ZhbHVlLnYuYXJyYXk7Ci0gIH0KLQotICBpZiAoU0RQX0ZpbmRQcm9maWxlVmVyc2lvbkluUmVjKHBfcmVjLCBVVUlEX1NFUlZDTEFTU19QSE9ORV9BQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB2ZXJzaW9uKSkgewotICAgIHJlY29yZC0+cHNlLmhkci5wcm9maWxlX3ZlcnNpb24gPSBwdmVyc2lvbjsKLSAgfQotCi0gIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3JlYywgVVVJRF9QUk9UT0NPTF9SRkNPTU0sICZwZSkpIHsKLSAgICByZWNvcmQtPnBzZS5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyID0gcGUucGFyYW1zWzBdOwotICB9Ci0KLSAgcF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9HT0VQX0wyQ0FQX1BTTSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+cHNlLmhkci5sMmNhcF9wc20gPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX2NyZWF0ZV9vcHNfc2RwX3JlY29yZChibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYykgewotICB0U0RQX0RJU0NfQVRUUiAqcF9hdHRyLCAqcF9zYXR0cjsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHBlOwotICB1aW50MTZfdCBwdmVyc2lvbiA9IC0xOwotCi0gIHJlY29yZC0+b3BzLmhkci50eXBlID0gU0RQX1RZUEVfT1BQX1NFUlZFUjsKLSAgcmVjb3JkLT5vcHMuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggPSAwOwotICByZWNvcmQtPm9wcy5oZHIuc2VydmljZV9uYW1lID0gTlVMTDsKLSAgcmVjb3JkLT5vcHMuaGRyLnJmY29tbV9jaGFubmVsX251bWJlciA9IDA7Ci0gIHJlY29yZC0+b3BzLmhkci5sMmNhcF9wc20gPSAtMTsKLSAgcmVjb3JkLT5vcHMuaGRyLnByb2ZpbGVfdmVyc2lvbiA9IDA7Ci0gIHJlY29yZC0+b3BzLnN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuID0gMDsKLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+b3BzLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0KLSAgICAgICAgU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICByZWNvcmQtPm9wcy5oZHIuc2VydmljZV9uYW1lID0gKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5OwotICB9Ci0KLSAgaWYgKFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhwX3JlYywgVVVJRF9TRVJWQ0xBU1NfT0JFWF9PQkpFQ1RfUFVTSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHZlcnNpb24pKSB7Ci0gICAgcmVjb3JkLT5vcHMuaGRyLnByb2ZpbGVfdmVyc2lvbiA9IHB2ZXJzaW9uOwotICB9Ci0KLSAgaWYgKFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjKHBfcmVjLCBVVUlEX1BST1RPQ09MX1JGQ09NTSwgJnBlKSkgewotICAgIHJlY29yZC0+b3BzLmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXIgPSBwZS5wYXJhbXNbMF07Ci0gIH0KLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX0dPRVBfTDJDQVBfUFNNKTsKLSAgaWYgKHBfYXR0ciAhPSBOVUxMKSB7Ci0gICAgcmVjb3JkLT5vcHMuaGRyLmwyY2FwX3BzbSA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgfQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NVUFBPUlRFRF9GT1JNQVRTX0xJU1QpOwotICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICAvKiBTYWZldHkgY2hlY2sgLSBlYWNoIGVudHJ5IHNob3VsZCBpdHNlbGYgYmUgYSBzZXF1ZW5jZSAqLwotICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUocF9hdHRyLT5hdHRyX2xlbl90eXBlKSAhPSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSB7Ci0gICAgICByZWNvcmQtPm9wcy5zdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbiA9IDA7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICIlcygpIC0gc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdCAtIHdyb25nIGF0dHJpYnV0ZSBsZW5ndGgvdHlwZToiCi0gICAgICAgICAgIiAweCUwMnggLSBleHBlY3RlZCAweDA2IiwKLSAgICAgICAgICBfX2Z1bmNfXywgcF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIC8qIDEgYnl0ZSBmb3IgdHlwZS9sZW5ndGggMSBieXRlIGZvciB2YWx1ZSAqLwotICAgICAgcmVjb3JkLT5vcHMuc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdF9sZW4gPQotICAgICAgICAgIFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgLyAyOwotCi0gICAgICAvKiBFeHRyYWN0IGVhY2ggdmFsdWUgaW50byAqLwotICAgICAgZm9yIChwX3NhdHRyID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsgcF9zYXR0ciAhPSBOVUxMOwotICAgICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgaWYgKChTRFBfRElTQ19BVFRSX1RZUEUocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVUlOVF9ERVNDX1RZUEUpICYmCi0gICAgICAgICAgICAoU0RQX0RJU0NfQVRUUl9MRU4ocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gMSkpIHsKLSAgICAgICAgICBpZiAoY291bnQgPT0gc2l6ZW9mKHJlY29yZC0+b3BzLnN1cHBvcnRlZF9mb3JtYXRzX2xpc3QpKSB7Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgICAgICIlcygpIC0gc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdCAtIGNvdW50IG92ZXJmbG93IC0gIgotICAgICAgICAgICAgICAgICJ0b28gbWFueSBzdWIgYXR0cmlidXRlcyEhIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAvKiBJZiB5b3UgaGl0IHRoaXMsIG5ldyBmb3JtYXRzIGhhdmUgYmVlbiBhZGRlZCwKLSAgICAgICAgICAgICAqIHVwZGF0ZSBTRFBfT1BQX1NVUFBPUlRFRF9GT1JNQVRTX01BWF9MRU5HVEggKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICByZWNvcmQtPm9wcy5zdXBwb3J0ZWRfZm9ybWF0c19saXN0W2NvdW50XSA9IHBfc2F0dHItPmF0dHJfdmFsdWUudi51ODsKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAgICIlcygpIC0gc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdCAtIHdyb25nIHN1YiBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAibGVuZ3RoL3R5cGU6IDB4JTAyeCAtIGV4cGVjdGVkIDB4ODAiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9zYXR0ci0+YXR0cl9sZW5fdHlwZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChyZWNvcmQtPm9wcy5zdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbiAhPSBjb3VudCkgewotICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAiJXMoKSAtIHN1cHBvcnRlZF9mb3JtYXRzX2xpc3QgLSBMZW5ndGggb2YgYXR0cmlidXRlIGRpZmZlcmVudCAiCi0gICAgICAgICAgICAiZnJvbSB0aGUgYWN0dWFsIG51bWJlciBvZiBzdWItYXR0cmlidXRlcyBpbiB0aGUgc2VxdWVuY2UgIgotICAgICAgICAgICAgImF0dC1sZW5ndGg6ICVkIC0gbnVtYmVyIG9mIGVsZW1lbnRzOiAlZCIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkLT5vcHMuc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdF9sZW4sIGNvdW50KTsKLSAgICAgIH0KLSAgICAgIHJlY29yZC0+b3BzLnN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuID0gY291bnQ7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9jcmVhdGVfc2FwX3NkcF9yZWNvcmQoYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9yZWMpIHsKLSAgdFNEUF9ESVNDX0FUVFIqIHBfYXR0cjsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHBlOwotICB1aW50MTZfdCBwdmVyc2lvbiA9IC0xOwotCi0gIHJlY29yZC0+c2FwLmhkci50eXBlID0gU0RQX1RZUEVfTUFQX01BUzsKLSAgcmVjb3JkLT5zYXAuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggPSAwOwotICByZWNvcmQtPnNhcC5oZHIuc2VydmljZV9uYW1lID0gTlVMTDsKLSAgcmVjb3JkLT5zYXAuaGRyLnJmY29tbV9jaGFubmVsX251bWJlciA9IDA7Ci0gIHJlY29yZC0+c2FwLmhkci5sMmNhcF9wc20gPSAtMTsKLSAgcmVjb3JkLT5zYXAuaGRyLnByb2ZpbGVfdmVyc2lvbiA9IDA7Ci0KLSAgcF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9TRVJWSUNFX05BTUUpOwotICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICByZWNvcmQtPnNhcC5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCA9Ci0gICAgICAgIFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSk7Ci0gICAgcmVjb3JkLT5zYXAuaGRyLnNlcnZpY2VfbmFtZSA9IChjaGFyKilwX2F0dHItPmF0dHJfdmFsdWUudi5hcnJheTsKLSAgfQotCi0gIGlmIChTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMocF9yZWMsIFVVSURfU0VSVkNMQVNTX1NBUCwgJnB2ZXJzaW9uKSkgewotICAgIHJlY29yZC0+c2FwLmhkci5wcm9maWxlX3ZlcnNpb24gPSBwdmVyc2lvbjsKLSAgfQotCi0gIGlmIChTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhwX3JlYywgVVVJRF9QUk9UT0NPTF9SRkNPTU0sICZwZSkpIHsKLSAgICByZWNvcmQtPnNhcC5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyID0gcGUucGFyYW1zWzBdOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YV9jcmVhdGVfZGlwX3NkcF9yZWNvcmQoYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9yZWMpIHsKLSAgdFNEUF9ESVNDX0FUVFIqIHBfYXR0cjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcygpIiwgX19mdW5jX18pOwotCi0gIC8qIGhkciBpcyByZWR1bmRhbmN5IGluIGRpcCAqLwotICByZWNvcmQtPmRpcC5oZHIudHlwZSA9IFNEUF9UWVBFX0RJUDsKLSAgcmVjb3JkLT5kaXAuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggPSAwOwotICByZWNvcmQtPmRpcC5oZHIuc2VydmljZV9uYW1lID0gbnVsbHB0cjsKLSAgcmVjb3JkLT5kaXAuaGRyLnJmY29tbV9jaGFubmVsX251bWJlciA9IDA7Ci0gIHJlY29yZC0+ZGlwLmhkci5sMmNhcF9wc20gPSAtMTsKLSAgcmVjb3JkLT5kaXAuaGRyLnByb2ZpbGVfdmVyc2lvbiA9IDA7Ci0KLSAgcF9hdHRyID0KLSAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU1BFQ0lGSUNBVElPTl9JRCk7Ci0gIGlmIChwX2F0dHIgIT0gbnVsbHB0cikKLSAgICByZWNvcmQtPmRpcC5zcGVjX2lkID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICBlbHNlCi0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXMoKSBBVFRSX0lEX1NQRUNJRklDQVRJT05fSUQgbm90IGZvdW5kIiwgX19mdW5jX18pOwotCi0gIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfVkVORE9SX0lEKTsKLSAgaWYgKHBfYXR0ciAhPSBudWxscHRyKQotICAgIHJlY29yZC0+ZGlwLnZlbmRvciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgZWxzZQotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgQVRUUl9JRF9WRU5ET1JfSUQgbm90IGZvdW5kIiwgX19mdW5jX18pOwotCi0gIHBfYXR0ciA9Ci0gICAgICBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1ZFTkRPUl9JRF9TT1VSQ0UpOwotICBpZiAocF9hdHRyICE9IG51bGxwdHIpCi0gICAgcmVjb3JkLT5kaXAudmVuZG9yX2lkX3NvdXJjZSA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgZWxzZQotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgQVRUUl9JRF9WRU5ET1JfSURfU09VUkNFIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKLQotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1BST0RVQ1RfSUQpOwotICBpZiAocF9hdHRyICE9IG51bGxwdHIpCi0gICAgcmVjb3JkLT5kaXAucHJvZHVjdCA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgZWxzZQotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgQVRUUl9JRF9QUk9EVUNUX0lEIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKLQotICBwX2F0dHIgPQotICAgICAgU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9QUk9EVUNUX1ZFUlNJT04pOwotICBpZiAocF9hdHRyICE9IG51bGxwdHIpCi0gICAgcmVjb3JkLT5kaXAudmVyc2lvbiA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgZWxzZQotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgQVRUUl9JRF9QUk9EVUNUX1ZFUlNJT04gbm90IGZvdW5kIiwgX19mdW5jX18pOwotCi0gIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfUFJJTUFSWV9SRUNPUkQpOwotICBpZiAocF9hdHRyICE9IG51bGxwdHIpCi0gICAgcmVjb3JkLT5kaXAucHJpbWFyeV9yZWNvcmQgPSAhKCFwX2F0dHItPmF0dHJfdmFsdWUudi51OCk7Ci0gIGVsc2UKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcygpIEFUVFJfSURfUFJJTUFSWV9SRUNPUkQgbm90IGZvdW5kIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCBidGFfY3JlYXRlX3Jhd19zZHBfcmVjb3JkKGJsdWV0b290aF9zZHBfcmVjb3JkKiByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfcmVjKSB7Ci0gIHRTRFBfRElTQ19BVFRSKiBwX2F0dHI7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwZTsKLQotICByZWNvcmQtPmhkci50eXBlID0gU0RQX1RZUEVfUkFXOwotICByZWNvcmQtPmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0gMDsKLSAgcmVjb3JkLT5oZHIuc2VydmljZV9uYW1lID0gTlVMTDsKLSAgcmVjb3JkLT5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyID0gLTE7Ci0gIHJlY29yZC0+aGRyLmwyY2FwX3BzbSA9IC0xOwotICByZWNvcmQtPmhkci5wcm9maWxlX3ZlcnNpb24gPSAtMTsKLQotICAvKiBUcnkgdG8gZXh0cmFjdCBhIHNlcnZpY2UgbmFtZSAqLwotICBwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSk7Ci0gIGlmIChwX2F0dHIgIT0gTlVMTCkgewotICAgIHJlY29yZC0+cHNlLmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0KLSAgICAgICAgU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICByZWNvcmQtPnBzZS5oZHIuc2VydmljZV9uYW1lID0gKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5OwotICB9Ci0KLSAgLyogVHJ5IHRvIGV4dHJhY3QgYW4gUkZDT01NIGNoYW5uZWwgKi8KLSAgaWYgKFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjKHBfcmVjLCBVVUlEX1BST1RPQ09MX1JGQ09NTSwgJnBlKSkgewotICAgIHJlY29yZC0+cHNlLmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXIgPSBwZS5wYXJhbXNbMF07Ci0gIH0KLSAgcmVjb3JkLT5oZHIudXNlcjFfcHRyX2xlbiA9IHBfYnRhX3NkcF9jZmctPnBfc2RwX2RiLT5yYXdfc2l6ZTsKLSAgcmVjb3JkLT5oZHIudXNlcjFfcHRyID0gcF9idGFfc2RwX2NmZy0+cF9zZHBfZGItPnJhd19kYXRhOwotfQotCi0vKiogQ2FsbGJhY2sgZnJvbSBidG0gYWZ0ZXIgc2VhcmNoIGlzIGNvbXBsZXRlZCAqLwotc3RhdGljIHZvaWQgYnRhX3NkcF9zZWFyY2hfY2JhY2sodFNEUF9SRVNVTFQgcmVzdWx0LCBjb25zdCB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgdEJUQV9TRFBfU1RBVFVTIHN0YXR1cyA9IEJUQV9TRFBfRkFJTFVSRTsKLSAgaW50IGNvdW50ID0gMDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMoKSAtICByZXM6IDB4JXgiLCBfX2Z1bmNfXywgcmVzdWx0KTsKLQotICBidGFfc2RwX2NiLnNkcF9hY3RpdmUgPSBmYWxzZTsKLQotICBpZiAoYnRhX3NkcF9jYi5wX2RtX2NiYWNrID09IE5VTEwpIHJldHVybjsKLQotICBVdWlkJiB1dWlkID0gKihyZWludGVycHJldF9jYXN0PFV1aWQqPihjb25zdF9jYXN0PHZvaWQqPih1c2VyX2RhdGEpKSk7Ci0KLSAgdEJUQV9TRFBfU0VBUkNIX0NPTVAgZXZ0X2RhdGE7Ci0gIG1lbXNldCgmZXZ0X2RhdGEsIDAsIHNpemVvZihldnRfZGF0YSkpOwotICBldnRfZGF0YS5yZW1vdGVfYWRkciA9IGJ0YV9zZHBfY2IucmVtb3RlX2FkZHI7Ci0gIGV2dF9kYXRhLnV1aWQgPSB1dWlkOwotCi0gIGlmIChyZXN1bHQgPT0gU0RQX1NVQ0NFU1MgfHwgcmVzdWx0ID09IFNEUF9EQl9GVUxMKSB7Ci0gICAgdFNEUF9ESVNDX1JFQyogcF9yZWMgPSBOVUxMOwotICAgIGRvIHsKLSAgICAgIHBfcmVjID0gU0RQX0ZpbmRTZXJ2aWNlVVVJREluRGIocF9idGFfc2RwX2NmZy0+cF9zZHBfZGIsIHV1aWQsIHBfcmVjKTsKLSAgICAgIC8qIGdlbmVyYXRlIHRoZSBtYXRjaGluZyByZWNvcmQgZGF0YSBwb2ludGVyICovCi0gICAgICBpZiAoIXBfcmVjKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzKCkgLSBVVUlEIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHN0YXR1cyA9IEJUQV9TRFBfU1VDQ0VTUzsKLSAgICAgIGlmICh1dWlkID09IFVVSURfTUFQX01BUykgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcygpIC0gZm91bmQgTUFQIChNQVMpIHV1aWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0YV9jcmVhdGVfbWFzX3NkcF9yZWNvcmQoJmV2dF9kYXRhLnJlY29yZHNbY291bnRdLCBwX3JlYyk7Ci0gICAgICB9IGVsc2UgaWYgKHV1aWQgPT0gVVVJRF9NQVBfTU5TKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzKCkgLSBmb3VuZCBNQVAgKE1OUykgdXVpZCIsIF9fZnVuY19fKTsKLSAgICAgICAgYnRhX2NyZWF0ZV9tbnNfc2RwX3JlY29yZCgmZXZ0X2RhdGEucmVjb3Jkc1tjb3VudF0sIHBfcmVjKTsKLSAgICAgIH0gZWxzZSBpZiAodXVpZCA9PSBVVUlEX1BCQVBfUFNFKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzKCkgLSBmb3VuZCBQQkFQIChQU0UpIHV1aWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0YV9jcmVhdGVfcHNlX3NkcF9yZWNvcmQoJmV2dF9kYXRhLnJlY29yZHNbY291bnRdLCBwX3JlYyk7Ci0gICAgICB9IGVsc2UgaWYgKHV1aWQgPT0gVVVJRF9PQkVYX09CSkVDVF9QVVNIKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzKCkgLSBmb3VuZCBPYmplY3QgUHVzaCBTZXJ2ZXIgKE9QUykgdXVpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBidGFfY3JlYXRlX29wc19zZHBfcmVjb3JkKCZldnRfZGF0YS5yZWNvcmRzW2NvdW50XSwgcF9yZWMpOwotICAgICAgfSBlbHNlIGlmICh1dWlkID09IFVVSURfU0FQKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzKCkgLSBmb3VuZCBTQVAgdXVpZCIsIF9fZnVuY19fKTsKLSAgICAgICAgYnRhX2NyZWF0ZV9zYXBfc2RwX3JlY29yZCgmZXZ0X2RhdGEucmVjb3Jkc1tjb3VudF0sIHBfcmVjKTsKLSAgICAgIH0gZWxzZSBpZiAodXVpZCA9PSBVVUlEX0RJUCkgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcygpIC0gZm91bmQgRElQIHV1aWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0YV9jcmVhdGVfZGlwX3NkcF9yZWNvcmQoJmV2dF9kYXRhLnJlY29yZHNbY291bnRdLCBwX3JlYyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiB3ZSBkbyBub3QgaGF2ZSBzcGVjaWZpYyBzdHJ1Y3R1cmUgZm9yIHRoaXMgKi8KLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXMoKSAtIHByb2ZpbGUgbm90IGlkZW50aWZpZWQuIHVzaW5nIHJhdyBkYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0YV9jcmVhdGVfcmF3X3NkcF9yZWNvcmQoJmV2dF9kYXRhLnJlY29yZHNbY291bnRdLCBwX3JlYyk7Ci0gICAgICAgIHBfcmVjID0gTlVMTDsgIC8vIFRlcm1pbmF0ZSBsb29wCi0gICAgICAgIC8qIEZvciByYXcsIHdlIG9ubHkgZXh0cmFjdCB0aGUgZmlyc3QgZW50cnksIGFuZCB0aGVuIHJldHVybiB0aGUKLSAgICAgICAgICAgZW50aXJlIHJhdyBkYXRhIGNodW5rLgotICAgICAgICAgICBUT0RPOiBGaW5kIGEgd2F5IHRvIHNwbGl0IHRoZSByYXcgZGF0YSBpbnRvIHJlY29yZCBjaHVua3MsIGFuZAotICAgICAgICAgICBpdGVyYXRlIHRvIGV4dHJhY3QgZ2VuZXJpYyBkYXRhIGZvciBlYWNoIGNodW5rIC0gZS5nLiByZmNvbW0KLSAgICAgICAgICAgY2hhbm5lbCBhbmQgc2VydmljZSBuYW1lLiAqLwotICAgICAgfQotICAgICAgY291bnQrKzsKLSAgICB9IHdoaWxlIChwX3JlYyAhPSBOVUxMICYmIGNvdW50IDwgQlRBX1NEUF9NQVhfUkVDT1JEUyk7Ci0KLSAgICBldnRfZGF0YS5yZWNvcmRfY291bnQgPSBjb3VudDsKLSAgfQotICBldnRfZGF0YS5zdGF0dXMgPSBzdGF0dXM7Ci0KLSAgdEJUQV9TRFAgYnRhX3NkcDsKLSAgYnRhX3NkcC5zZHBfc2VhcmNoX2NvbXAgPSBldnRfZGF0YTsKLSAgYnRhX3NkcF9jYi5wX2RtX2NiYWNrKEJUQV9TRFBfU0VBUkNIX0NPTVBfRVZULCAmYnRhX3NkcCwgKHZvaWQqKSZ1dWlkKTsKLSAgb3NpX2ZyZWUoY29uc3RfY2FzdDx2b2lkKj4oCi0gICAgICB1c2VyX2RhdGEpKTsgIC8vIFdlIG5vIGxvbmdlciBuZWVkIHRoZSB1c2VyIGRhdGEgdG8gdHJhY2sgdGhlIHNlYXJjaAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBidGFfc2RwX2VuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICBJbml0aWFsaXplcyB0aGUgU0RQIEkvRgotICoKLSAqIFJldHVybnMgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3NkcF9lbmFibGUodEJUQV9TRFBfRE1fQ0JBQ0sqIHBfY2JhY2spIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaW4sIHNkcF9hY3RpdmU6JWQiLCBfX2Z1bmNfXywgYnRhX3NkcF9jYi5zZHBfYWN0aXZlKTsKLSAgdEJUQV9TRFBfU1RBVFVTIHN0YXR1cyA9IEJUQV9TRFBfU1VDQ0VTUzsKLSAgYnRhX3NkcF9jYi5wX2RtX2NiYWNrID0gcF9jYmFjazsKLSAgdEJUQV9TRFAgYnRhX3NkcDsKLSAgYnRhX3NkcC5zdGF0dXMgPSBzdGF0dXM7Ci0gIGJ0YV9zZHBfY2IucF9kbV9jYmFjayhCVEFfU0RQX0VOQUJMRV9FVlQsICZidGFfc2RwLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX3NkcF9zZWFyY2gKLSAqCi0gKiBEZXNjcmlwdGlvbiAgRGlzY292ZXJzIGFsbCBzZHAgcmVjb3JkcyBmb3IgYW4gdXVpZCBvbiByZW1vdGUgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc2RwX3NlYXJjaChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIGNvbnN0IGJsdWV0b290aDo6VXVpZCB1dWlkKSB7Ci0gIHRCVEFfU0RQX1NUQVRVUyBzdGF0dXMgPSBCVEFfU0RQX0ZBSUxVUkU7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgaW4sIHNkcF9hY3RpdmU6JWQiLCBfX2Z1bmNfXywgYnRhX3NkcF9jYi5zZHBfYWN0aXZlKTsKLQotICBpZiAoYnRhX3NkcF9jYi5zZHBfYWN0aXZlKSB7Ci0gICAgLyogU0RQIGlzIHN0aWxsIGluIHByb2dyZXNzICovCi0gICAgc3RhdHVzID0gQlRBX1NEUF9CVVNZOwotICAgIGlmIChidGFfc2RwX2NiLnBfZG1fY2JhY2spIHsKLSAgICAgIHRCVEFfU0RQX1NFQVJDSF9DT01QIHJlc3VsdDsKLSAgICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7Ci0gICAgICByZXN1bHQudXVpZCA9IHV1aWQ7Ci0gICAgICByZXN1bHQucmVtb3RlX2FkZHIgPSBiZF9hZGRyOwotICAgICAgcmVzdWx0LnN0YXR1cyA9IHN0YXR1czsKLSAgICAgIHRCVEFfU0RQIGJ0YV9zZHA7Ci0gICAgICBidGFfc2RwLnNkcF9zZWFyY2hfY29tcCA9IHJlc3VsdDsKLSAgICAgIGJ0YV9zZHBfY2IucF9kbV9jYmFjayhCVEFfU0RQX1NFQVJDSF9DT01QX0VWVCwgJmJ0YV9zZHAsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBidGFfc2RwX2NiLnNkcF9hY3RpdmUgPSB0cnVlOwotICBidGFfc2RwX2NiLnJlbW90ZV9hZGRyID0gYmRfYWRkcjsKLQotICAvKiBpbml0aWFsaXplIHRoZSBzZWFyY2ggZm9yIHRoZSB1dWlkICovCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIGluaXQgZGlzY292ZXJ5IHdpdGggVVVJRDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICB1dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIFNEUF9Jbml0RGlzY292ZXJ5RGIocF9idGFfc2RwX2NmZy0+cF9zZHBfZGIsIHBfYnRhX3NkcF9jZmctPnNkcF9kYl9zaXplLCAxLAotICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLCAwLCBOVUxMKTsKLQotICBVdWlkKiBidGFfc2RwX3NlYXJjaF91dWlkID0gKFV1aWQqKW9zaV9tYWxsb2Moc2l6ZW9mKFV1aWQpKTsKLSAgKmJ0YV9zZHBfc2VhcmNoX3V1aWQgPSB1dWlkOwotICBpZiAoIVNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIoYmRfYWRkciwgcF9idGFfc2RwX2NmZy0+cF9zZHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfc2RwX3NlYXJjaF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilidGFfc2RwX3NlYXJjaF91dWlkKSkgewotICAgIGJ0YV9zZHBfY2Iuc2RwX2FjdGl2ZSA9IGZhbHNlOwotCi0gICAgLyogZmFpbGVkIHRvIHN0YXJ0IFNEUC4gcmVwb3J0IHRoZSBmYWlsdXJlIHJpZ2h0IGF3YXkgKi8KLSAgICBpZiAoYnRhX3NkcF9jYi5wX2RtX2NiYWNrKSB7Ci0gICAgICB0QlRBX1NEUF9TRUFSQ0hfQ09NUCByZXN1bHQ7Ci0gICAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOwotICAgICAgcmVzdWx0LnV1aWQgPSB1dWlkOwotICAgICAgcmVzdWx0LnJlbW90ZV9hZGRyID0gYmRfYWRkcjsKLSAgICAgIHJlc3VsdC5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICB0QlRBX1NEUCBidGFfc2RwOwotICAgICAgYnRhX3NkcC5zZHBfc2VhcmNoX2NvbXAgPSByZXN1bHQ7Ci0gICAgICBidGFfc2RwX2NiLnBfZG1fY2JhY2soQlRBX1NEUF9TRUFSQ0hfQ09NUF9FVlQsICZidGFfc2RwLCBOVUxMKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgZWxzZSByZXBvcnQgdGhlIHJlc3VsdCB3aGVuIHRoZSBjYmFjayBpcyBjYWxsZWQKLSAgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX3NkcF9yZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgRGlzY292ZXJzIGFsbCBzZHAgcmVjb3JkcyBmb3IgYW4gdXVpZCBvbiByZW1vdGUgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc2RwX2NyZWF0ZV9yZWNvcmQodm9pZCogdXNlcl9kYXRhKSB7Ci0gIGlmIChidGFfc2RwX2NiLnBfZG1fY2JhY2spCi0gICAgYnRhX3NkcF9jYi5wX2RtX2NiYWNrKEJUQV9TRFBfQ1JFQVRFX1JFQ09SRF9VU0VSX0VWVCwgTlVMTCwgdXNlcl9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRhX3NkcF9jcmVhdGVfcmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gIERpc2NvdmVycyBhbGwgc2RwIHJlY29yZHMgZm9yIGFuIHV1aWQgb24gcmVtb3RlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3NkcF9yZW1vdmVfcmVjb3JkKHZvaWQqIHVzZXJfZGF0YSkgewotICBpZiAoYnRhX3NkcF9jYi5wX2RtX2NiYWNrKQotICAgIGJ0YV9zZHBfY2IucF9kbV9jYmFjayhCVEFfU0RQX1JFTU9WRV9SRUNPUkRfVVNFUl9FVlQsIE5VTEwsIHVzZXJfZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idGEvc2RwL2J0YV9zZHBfYXBpLmNjIGIvYnRhL3NkcC9idGFfc2RwX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMzAwOS4uMDAwMDAwMAotLS0gYS9idGEvc2RwL2J0YV9zZHBfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSSBmb3IgU0RQIHNlYXJjaCBzdWJzeXN0ZW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX3NkcF9hcGkuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgImJ0YS9zZHAvYnRhX3NkcF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIiAgLy8gZG9faW5fbWFpbl90aHJlYWQKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfU2RwRW5hYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGUgdGhlIFNEUCBzZWFyY2ggSS9GIHNlcnZpY2UuIFdoZW4gdGhlIGVuYWJsZQotICogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gaXMgY29tcGxldGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggYSBCVEFfU0RQX0VOQUJMRV9FVlQuIFRoaXMgZnVuY3Rpb24gbXVzdAotICogICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgU0RQIHNlYXJjaCBBUEkgYXJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TRFBfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBCVEFfU0RQX0ZBSUwgaWYgaW50ZXJuYWwgZmFpbHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9TRFBfU1RBVFVTIEJUQV9TZHBFbmFibGUodEJUQV9TRFBfRE1fQ0JBQ0sqIHBfY2JhY2spIHsKLSAgaWYgKCFwX2NiYWNrKSB7Ci0gICAgcmV0dXJuIEJUQV9TRFBfRkFJTFVSRTsKLSAgfQotCi0gIG1lbXNldCgmYnRhX3NkcF9jYiwgMCwgc2l6ZW9mKHRCVEFfU0RQX0NCKSk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfc2RwX2VuYWJsZSwgcF9jYmFjaykpOwotICByZXR1cm4gQlRBX1NEUF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1NkcFNlYXJjaAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBzZXJ2aWNlIGRpc2NvdmVyeSBmb3IgYSBzcGVjaWZpYwotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIG9uIGdpdmVuIHBlZXIgZGV2aWNlLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgY29tcGxldGVkIHRoZSB0QlRBX1NEUF9ETV9DQkFDSyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCB3aXRoIGEgQlRBX1NEUF9TRUFSQ0hfQ09NUExFVEVfRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBX1NEUF9TVUNDRVNTLCBpZiB0aGUgcmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUQV9TRFBfRkFJTFVSRSwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX1NEUF9TVEFUVVMgQlRBX1NkcFNlYXJjaChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfc2RwX3NlYXJjaCwgYmRfYWRkciwgdXVpZCkpOwotICByZXR1cm4gQlRBX1NEUF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1NkcENyZWF0ZVJlY29yZEJ5VXNlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgYSBjYWxsYmFjayB0byBjcmVhdGUgYSBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkLiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGV2ZW50Ci0gKiAgICAgICAgICAgICAgICAgIEJUQV9TRFBfQ1JFQVRFX1JFQ09SRF9VU0VSX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TRFBfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfU0RQX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9TRFBfU1RBVFVTIEJUQV9TZHBDcmVhdGVSZWNvcmRCeVVzZXIodm9pZCogdXNlcl9kYXRhKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfc2RwX2NyZWF0ZV9yZWNvcmQsIHVzZXJfZGF0YSkpOwotICByZXR1cm4gQlRBX1NEUF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX1NkcFJlbW92ZVJlY29yZEJ5VXNlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgYSBjYWxsYmFjayB0byByZW1vdmUgYSBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkLiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGV2ZW50Ci0gKiAgICAgICAgICAgICAgICAgIEJUQV9TRFBfUkVNT1ZFX1JFQ09SRF9VU0VSX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUQV9TRFBfU1VDQ0VTUywgaWYgdGhlIHJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICogICAgICAgICAgICAgICAgICBCVEFfU0RQX0ZBSUxVUkUsIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9TRFBfU1RBVFVTIEJUQV9TZHBSZW1vdmVSZWNvcmRCeVVzZXIodm9pZCogdXNlcl9kYXRhKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfc2RwX3JlbW92ZV9yZWNvcmQsIHVzZXJfZGF0YSkpOwotICByZXR1cm4gQlRBX1NEUF9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3NkcC9idGFfc2RwX2NmZy5jYyBiL2J0YS9zZHAvYnRhX3NkcF9jZmcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTc0NWQuLjAwMDAwMDAKLS0tIGEvYnRhL3NkcC9idGFfc2RwX2NmZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgY29tcGlsZS10aW1lIGNvbmZpZ3VyYWJsZSBjb25zdGFudHMgZm9yIFNEUCBTZWFyY2gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9zZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0KLSNpZm5kZWYgQlRBX1NEUF9EQl9TSVpFCi0jZGVmaW5lIEJUQV9TRFBfREJfU0laRSA0NTAwCi0jZW5kaWYKLQotc3RhdGljIHRTRFBfRElTQ09WRVJZX0RCCi0gICAgYnRhX3NkcF9kYl9kYXRhW0JUQV9TRFBfREJfU0laRSAvIHNpemVvZih0U0RQX0RJU0NPVkVSWV9EQildOwotCi0vKiBTRFAgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KLWNvbnN0IHRCVEFfU0RQX0NGRyBidGFfc2RwX2NmZyA9IHsKLSAgICAoQlRBX1NEUF9EQl9TSVpFIC8gc2l6ZW9mKHRTRFBfRElTQ09WRVJZX0RCKSkgKiBzaXplb2YodFNEUF9ESVNDT1ZFUllfREIpLAotICAgIGJ0YV9zZHBfZGJfZGF0YSAvKiBUaGUgZGF0YSBidWZmZXIgdG8ga2VlcCBTRFAgZGF0YWJhc2UgKi8KLX07Ci0KLWNvbnN0IHRCVEFfU0RQX0NGRyogcF9idGFfc2RwX2NmZyA9ICZidGFfc2RwX2NmZzsKZGlmZiAtLWdpdCBhL2J0YS9zZHAvYnRhX3NkcF9pbnQuaCBiL2J0YS9zZHAvYnRhX3NkcF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjODg4Zi4uMDAwMDAwMAotLS0gYS9idGEvc2RwL2J0YV9zZHBfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHJpdmF0ZSBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIEJUQSBTRFAgSS9GCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX1NEUF9JTlRfSAotI2RlZmluZSBCVEFfU0RQX0lOVF9ICi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfc2RwX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogU0RQIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBzZHBfYWN0aXZlOwotICBSYXdBZGRyZXNzIHJlbW90ZV9hZGRyOwotICB0QlRBX1NEUF9ETV9DQkFDSyogcF9kbV9jYmFjazsKLX0gdEJUQV9TRFBfQ0I7Ci0KLS8qIFNEUCBjb250cm9sIGJsb2NrICovCi1leHRlcm4gdEJUQV9TRFBfQ0IgYnRhX3NkcF9jYjsKLQotLyogY29uZmlnIHN0cnVjdCAqLwotZXh0ZXJuIHRCVEFfU0RQX0NGRyogcF9idGFfc2RwX2NmZzsKLQotZXh0ZXJuIHZvaWQgYnRhX3NkcF9lbmFibGUodEJUQV9TRFBfRE1fQ0JBQ0sqIHBfY2JhY2spOwotZXh0ZXJuIHZvaWQgYnRhX3NkcF9zZWFyY2goY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIHV1aWQpOwotZXh0ZXJuIHZvaWQgYnRhX3NkcF9jcmVhdGVfcmVjb3JkKHZvaWQqIHVzZXJfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfc2RwX3JlbW92ZV9yZWNvcmQodm9pZCogdXNlcl9kYXRhKTsKLQotI2VuZGlmIC8qIEJUQV9TRFBfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9zeXMvYnRhX3N5cy5oIGIvYnRhL3N5cy9idGFfc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzhlYjUuLjAwMDAwMDAKLS0tIGEvYnRhL3N5cy9idGFfc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZpbGUgZm9yIHRoZSBCVEEgc3lzdGVtIG1hbmFnZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlRBX1NZU19ICi0jZGVmaW5lIEJUQV9TWVNfSAotCi0jaW5jbHVkZSA8YmFzZS90aW1lL3RpbWUuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgYW5kIGRhdGEgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiB2ZW5kb3Igc3BlY2lmaWMgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiB0eXBlICovCi10eXBlZGVmIGJvb2wodEJUQV9TWVNfVlNfRVZUX0hETFIpKHVpbnQxNl90IGV2dCwgdm9pZCogcCk7Ci0KLS8qIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gdHlwZSAqLwotdHlwZWRlZiBib29sKHRCVEFfU1lTX0VWVF9IRExSKShCVF9IRFJfUklHSUQqIHBfbXNnKTsKLXN0YXRpY19hc3NlcnQoCi0gICAgc2l6ZW9mKEJUX0hEUikgPT0gc2l6ZW9mKEJUX0hEUl9SSUdJRCksCi0gICAgIlJpZ2lkIHJlcGxhY2VtZW50IHNob3VsZCBiZSBzYW1lIHNpemUgc3RydWN0IHdpdGggZmxleGlibGUgbWVtYmVyIik7Ci0KLS8qIGRpc2FibGUgZnVuY3Rpb24gdHlwZSAqLwotdHlwZWRlZiB2b2lkKHRCVEFfU1lTX0RJU0FCTEUpKHZvaWQpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWlubGluZSBjb25zdCBUKiBTcGVjaWFsaXplKFUqIHUpIHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgVCo+KHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KHUpKTsKLX0KLQotI2lmbmRlZiBCVEFfRE1fTlVNX0pWX0lECi0jZGVmaW5lIEJUQV9ETV9OVU1fSlZfSUQgMgotI2VuZGlmCi0KLS8qIFNXIHN1Yi1zeXN0ZW1zICovCi0jZGVmaW5lIEJUQV9JRF9TWVMgMCAvKiBzeXN0ZW0gbWFuYWdlciAqLwotLyogQkxVRVRPT1RIIFBBUlQgLSBmcm9tIDAgdG8gQlRBX0lEX0JMVUVUT09USF9NQVggKi8KLSNkZWZpbmUgQlRBX0lEX0RNX1NFQVJDSCAyICAgICAgLyogZGV2aWNlIG1hbmFnZXIgc2VhcmNoICovCi0jZGVmaW5lIEJUQV9JRF9ETV9TRUMgMyAgICAgICAgIC8qIGRldmljZSBtYW5hZ2VyIHNlY3VyaXR5ICovCi0jZGVmaW5lIEJUQV9JRF9ERyA0ICAgICAgICAgICAgIC8qIGRhdGEgZ2F0ZXdheSAqLwotI2RlZmluZSBCVEFfSURfQUcgNSAgICAgICAgICAgICAvKiBhdWRpbyBnYXRld2F5ICovCi0jZGVmaW5lIEJUQV9JRF9PUEMgNiAgICAgICAgICAgIC8qIG9iamVjdCBwdXNoIGNsaWVudCAqLwotI2RlZmluZSBCVEFfSURfT1BTIDcgICAgICAgICAgICAvKiBvYmplY3QgcHVzaCBzZXJ2ZXIgKi8KLSNkZWZpbmUgQlRBX0lEX0ZUUyA4ICAgICAgICAgICAgLyogZmlsZSB0cmFuc2ZlciBzZXJ2ZXIgKi8KLSNkZWZpbmUgQlRBX0lEX0NUIDkgICAgICAgICAgICAgLyogY29yZGxlc3MgdGVsZXBob255IHRlcm1pbmFsICovCi0jZGVmaW5lIEJUQV9JRF9GVEMgMTAgICAgICAgICAgIC8qIGZpbGUgdHJhbnNmZXIgY2xpZW50ICovCi0jZGVmaW5lIEJUQV9JRF9TUyAxMSAgICAgICAgICAgIC8qIHN5bmNocm9uaXphdGlvbiBzZXJ2ZXIgKi8KLSNkZWZpbmUgQlRBX0lEX1BSIDEyICAgICAgICAgICAgLyogUHJpbnRlciBjbGllbnQgKi8KLSNkZWZpbmUgQlRBX0lEX0JJQyAxMyAgICAgICAgICAgLyogQmFzaWMgSW1hZ2luZyBDbGllbnQgKi8KLSNkZWZpbmUgQlRBX0lEX1BBTiAxNCAgICAgICAgICAgLyogUGVyc29uYWwgQXJlYSBOZXR3b3JraW5nICovCi0jZGVmaW5lIEJUQV9JRF9CSVMgMTUgICAgICAgICAgIC8qIEJhc2ljIEltYWdpbmcgU2VydmVyICovCi0jZGVmaW5lIEJUQV9JRF9BQ0MgMTYgICAgICAgICAgIC8qIEFkdmFuY2VkIENhbWVyYSBDbGllbnQgKi8KLSNkZWZpbmUgQlRBX0lEX1NDIDE3ICAgICAgICAgICAgLyogU0lNIENhcmQgQWNjZXNzIHNlcnZlciAqLwotI2RlZmluZSBCVEFfSURfQVYgMTggICAgICAgICAgICAvKiBBZHZhbmNlZCBhdWRpby92aWRlbyAqLwotI2RlZmluZSBCVEFfSURfSEQgMjAgICAgICAgICAgICAvKiBISUQgRGV2aWNlICovCi0jZGVmaW5lIEJUQV9JRF9DRyAyMSAgICAgICAgICAgIC8qIENvcmRsZXNzIEdhdGV3YXkgKi8KLSNkZWZpbmUgQlRBX0lEX0JQIDIyICAgICAgICAgICAgLyogQmFzaWMgUHJpbnRpbmcgQ2xpZW50ICovCi0jZGVmaW5lIEJUQV9JRF9ISCAyMyAgICAgICAgICAgIC8qIEh1bWFuIEludGVyZmFjZSBEZXZpY2UgSG9zdCAqLwotI2RlZmluZSBCVEFfSURfUEJTIDI0ICAgICAgICAgICAvKiBQaG9uZSBCb29rIEFjY2VzcyBTZXJ2ZXIgKi8KLSNkZWZpbmUgQlRBX0lEX1BCQyAyNSAgICAgICAgICAgLyogUGhvbmUgQm9vayBBY2Nlc3MgQ2xpZW50ICovCi0jZGVmaW5lIEJUQV9JRF9KViAyNiAgICAgICAgICAgIC8qIEphdmEgKi8KLSNkZWZpbmUgQlRBX0lEX0hTIDI3ICAgICAgICAgICAgLyogSGVhZHNldCAqLwotI2RlZmluZSBCVEFfSURfTVNFIDI4ICAgICAgICAgICAvKiBNZXNzYWdlIFNlcnZlciBFcXVpcG1lbnQgKi8KLSNkZWZpbmUgQlRBX0lEX01DRSAyOSAgICAgICAgICAgLyogTWVzc2FnZSBDbGllbnQgRXF1aXBtZW50ICovCi0jZGVmaW5lIEJUQV9JRF9ITCAzMCAgICAgICAgICAgIC8qIEhlYWx0aCBEZXZpY2UgUHJvZmlsZSovCi0jZGVmaW5lIEJUQV9JRF9HQVRUQyAzMSAgICAgICAgIC8qIEdBVFQgQ2xpZW50ICovCi0jZGVmaW5lIEJUQV9JRF9HQVRUUyAzMiAgICAgICAgIC8qIEdBVFQgQ2xpZW50ICovCi0jZGVmaW5lIEJUQV9JRF9TRFAgMzMgICAgICAgICAgIC8qIFNEUCBDbGllbnQgKi8KLSNkZWZpbmUgQlRBX0lEX0JMVUVUT09USF9NQVggMzQgLyogbGFzdCBCVCBwcm9maWxlICovCi0KLSNkZWZpbmUgQlRBX0lEX01BWCAoNDQgKyBCVEFfRE1fTlVNX0pWX0lEKQotCi10eXBlZGVmIHVpbnQ4X3QgdEJUQV9TWVNfSUQ7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBCdGFJZFN5c1RleHQodEJUQV9TWVNfSUQgc3lzX2lkKSB7Ci0gIHN3aXRjaCAoc3lzX2lkKSB7Ci0gICAgY2FzZSBCVEFfSURfRE1fU0VBUkNIOiAgLy8gMgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJTY2FubmVyIik7Ci0gICAgY2FzZSBCVEFfSURfQUc6ICAvLyA1Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkF1ZGlvIGdhdGV3YXkiKTsKLSAgICBjYXNlIEJUQV9JRF9QQU46ICAvLyAxNAotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJQQU4gUGVyc29uYWwgYXJlYSBuZXR3b3JrIik7Ci0gICAgY2FzZSBCVEFfSURfQVY6ICAvLyAxOAotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJBZHZhbmNlZCBhdWRpby92aWRlbyIpOwotICAgIGNhc2UgQlRBX0lEX0hEOiAgLy8gMjAKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiSElEIEh1bWFuIGludGVyZmFjZSBkZXZpY2UiKTsKLSAgICBjYXNlIEJUQV9JRF9ISDogIC8vIDIzCi0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkhJRCBIdW1hbiBpbnRlcmZhY2UgaG9zdCIpOwotICAgIGNhc2UgQlRBX0lEX0dBVFRDOiAgLy8gMzEKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVCBjbGllbnQiKTsKLSAgICBjYXNlIEJUQV9JRF9HQVRUUzogIC8vIDMyCi0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFQgc2VydmVyIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVW5rbm93biIpOwotICB9Ci19Ci0KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBCVEFfU1lTX0NPTk5fT1BFTiA9IDB4MDAsCi0gIEJUQV9TWVNfQ09OTl9DTE9TRSA9IDB4MDEsCi0gIEJUQV9TWVNfQVBQX09QRU4gPSAweDAyLAotICBCVEFfU1lTX0FQUF9DTE9TRSA9IDB4MDMsCi0gIEJUQV9TWVNfU0NPX09QRU4gPSAweDA0LAotICBCVEFfU1lTX1NDT19DTE9TRSA9IDB4MDUsCi0gIEJUQV9TWVNfQ09OTl9JRExFID0gMHgwNiwKLSAgQlRBX1NZU19DT05OX0JVU1kgPSAweDA3LAotICBCVEFfU1lTX1JPTEVfQ0hBTkdFID0gMHgxNCwgLyogcm9sZSBjaGFuZ2UgKi8KLX0gdEJUQV9TWVNfQ09OTl9TVEFUVVM7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBidGFfc3lzX2Nvbm5fc3RhdHVzX3RleHQodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBCVEFfU1lTX0NPTk5fT1BFTjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQlRBX1NZU19DT05OX09QRU4iKTsKLSAgICBjYXNlIEJUQV9TWVNfQ09OTl9DTE9TRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQlRBX1NZU19DT05OX0NMT1NFIik7Ci0gICAgY2FzZSBCVEFfU1lTX0FQUF9PUEVOOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJCVEFfU1lTX0FQUF9PUEVOIik7Ci0gICAgY2FzZSBCVEFfU1lTX0FQUF9DTE9TRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQlRBX1NZU19BUFBfQ0xPU0UiKTsKLSAgICBjYXNlIEJUQV9TWVNfU0NPX09QRU46Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkJUQV9TWVNfU0NPX09QRU4iKTsKLSAgICBjYXNlIEJUQV9TWVNfU0NPX0NMT1NFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJCVEFfU1lTX1NDT19DTE9TRSIpOwotICAgIGNhc2UgQlRBX1NZU19DT05OX0lETEU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkJUQV9TWVNfQ09OTl9JRExFIik7Ci0gICAgY2FzZSBCVEFfU1lTX0NPTk5fQlVTWToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQlRBX1NZU19DT05OX0JVU1kiKTsKLSAgICBjYXNlIEJUQV9TWVNfUk9MRV9DSEFOR0U6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkJUQV9TWVNfUk9MRV9DSEFOR0UiKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOIik7Ci0gIH0KLX0KLQotLyogY29ubiBjYWxsYmFjayBmb3Igcm9sZSAvIGxvdyBwb3dlciBtYW5hZ2VyKi8KLXR5cGVkZWYgdm9pZCh0QlRBX1NZU19DT05OX0NCQUNLKSh0QlRBX1NZU19DT05OX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci0KLS8qIGNvbm4gY2FsbGJhY2sgZm9yIHJvbGUgLyBsb3cgcG93ZXIgbWFuYWdlciovCi10eXBlZGVmIHZvaWQodEJUQV9TWVNfU1NSX0NGR19DQkFDSykodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdG91dCk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYmx1ZXRvb3RoOjpVdWlkIGN1c3RvbV91dWlkOwotICB1aW50MzJfdCBoYW5kbGU7Ci19IHRCVEFfQ1VTVE9NX1VVSUQ7Ci0KLSNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUpCi0vKiBlaXIgY2FsbGJhY2sgZm9yIGFkZGluZy9yZW1vdmVpbmcgVVVJRCAqLwotdHlwZWRlZiB2b2lkKHRCVEFfU1lTX0VJUl9DQkFDSykodWludDE2X3QgdXVpZDE2LCBib29sIGFkZGluZyk7Ci10eXBlZGVmIHZvaWQodEJUQV9TWVNfQ1VTVF9FSVJfQ0JBQ0spKGNvbnN0IHRCVEFfQ1VTVE9NX1VVSUQgJmN1cnIsIGJvb2wgYWRkaW5nKTsKLSNlbmRpZgotCi0vKiByZWdpc3RyYXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfU1lTX0VWVF9IRExSKiBldnRfaGRscjsKLSAgdEJUQV9TWVNfRElTQUJMRSogZGlzYWJsZTsKLX0gdEJUQV9TWVNfUkVHOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHRyYWNlIGxldmVsICovCi1leHRlcm4gdWludDhfdCBhcHBsX3RyYWNlX2xldmVsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ2FsY3VsYXRlIHN0YXJ0IG9mIGV2ZW50IGVudW1lcmF0aW9uOyBpZCBpcyB0b3AgOCBiaXRzIG9mIGV2ZW50ICovCi0jZGVmaW5lIEJUQV9TWVNfRVZUX1NUQVJUKGlkKSAoKGlkKSA8PCA4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc2V0X2ZvcndhcmRfaHdfZmFpbHVyZXMoYm9vbCB2YWx1ZSk7Ci12b2lkIEJUQV9zeXNfc2lnbmFsX2h3X2Vycm9yKCk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9zeXNfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfcmVnaXN0ZXIodWludDhfdCBpZCwgY29uc3QgdEJUQV9TWVNfUkVHKiBwX3JlZyk7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2RlcmVnaXN0ZXIodWludDhfdCBpZCk7Ci1leHRlcm4gYm9vbCBidGFfc3lzX2lzX3JlZ2lzdGVyKHVpbnQ4X3QgaWQpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19zZW5kbXNnKHZvaWQqIHBfbXNnKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfc2VuZG1zZ19kZWxheWVkKHZvaWQqIHBfbXNnLCBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGRlbGF5KTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfc3RhcnRfdGltZXIoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldmVudCwgdWludDE2X3QgbGF5ZXJfc3BlY2lmaWMpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19kaXNhYmxlKCk7Ci0KLWV4dGVybiB2b2lkIGJ0YV9zeXNfcm1fcmVnaXN0ZXIodEJUQV9TWVNfQ09OTl9DQkFDSyogcF9jYmFjayk7Ci1leHRlcm4gdm9pZCBidGFfc3lzX3BtX3JlZ2lzdGVyKHRCVEFfU1lTX0NPTk5fQ0JBQ0sqIHBfY2JhY2spOwotCi1leHRlcm4gdm9pZCBidGFfc3lzX3Njb19yZWdpc3Rlcih0QlRBX1NZU19DT05OX0NCQUNLKiBwX2NiYWNrKTsKLQotZXh0ZXJuIHZvaWQgYnRhX3N5c19jb25uX29wZW4odWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19jb25uX2Nsb3NlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2FwcF9vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19hcHBfY2xvc2UodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19zY29fb3Blbih1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfc2NvX2Nsb3NlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfc2NvX3VzZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19zY29fdW51c2UodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19pZGxlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2J1c3kodWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotZXh0ZXJuIHZvaWQgYnRhX3N5c19zc3JfY2ZnX3JlZ2lzdGVyKHRCVEFfU1lTX1NTUl9DRkdfQ0JBQ0sqIHBfY2JhY2spOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19jaGdfc3NyX2NvbmZpZyh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2xhdGVuY3ksIHVpbnQxNl90IG1pbl90b3V0KTsKLQotZXh0ZXJuIHZvaWQgYnRhX3N5c19yb2xlX2NoZ19yZWdpc3Rlcih0QlRBX1NZU19DT05OX0NCQUNLKiBwX2NiYWNrKTsKLWV4dGVybiB2b2lkIGJ0YV9zeXNfbm90aWZ5X3JvbGVfY2hnKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSBuZXdfcm9sZSwgdEhDSV9TVEFUVVMgaGNpX3N0YXR1cyk7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2NvbGxpc2lvbl9yZWdpc3Rlcih1aW50OF90IGJ0YV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfU1lTX0NPTk5fQ0JBQ0sqIHBfY2JhY2spOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19ub3RpZnlfY29sbGlzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci0KLSNpZiAoQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUICE9IFRSVUUpCi1leHRlcm4gdm9pZCBidGFfc3lzX2Vpcl9yZWdpc3Rlcih0QlRBX1NZU19FSVJfQ0JBQ0sqIHBfY2JhY2spOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19hZGRfdXVpZCh1aW50MTZfdCB1dWlkMTYpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19yZW1vdmVfdXVpZCh1aW50MTZfdCB1dWlkMTYpOwotZXh0ZXJuIHZvaWQgYnRhX3N5c19jdXN0X2Vpcl9yZWdpc3Rlcih0QlRBX1NZU19DVVNUX0VJUl9DQkFDSyogcF9jYmFjayk7Ci1leHRlcm4gdm9pZCBidGFfc3lzX2FkZF9jdXN0X3V1aWQoY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3Vycik7Ci1leHRlcm4gdm9pZCBidGFfc3lzX3JlbW92ZV9jdXN0X3V1aWQoY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3Vycik7Ci0jZWxzZQotI2RlZmluZSBidGFfc3lzX2Vpcl9yZWdpc3Rlcih1dCkKLSNkZWZpbmUgYnRhX3N5c19hZGRfdXVpZCh1dCkKLSNkZWZpbmUgYnRhX3N5c19yZW1vdmVfdXVpZCh1dCkKLSNkZWZpbmUgYnRhX3N5c19jdXN0X2Vpcl9yZWdpc3Rlcih1dCkKLSNkZWZpbmUgYnRhX3N5c19hZGRfY3VzdF91dWlkKHV0KQotI2RlZmluZSBidGFfc3lzX3JlbW92ZV9jdXN0X3V1aWQodXQpCi0jZW5kaWYKLQotI2VuZGlmIC8qIEJUQV9TWVNfSCAqLwpkaWZmIC0tZ2l0IGEvYnRhL3N5cy9idGFfc3lzX2Nvbm4uY2MgYi9idGEvc3lzL2J0YV9zeXNfY29ubi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5NmY4Ni4uMDAwMDAwMAotLS0gYS9idGEvc3lzL2J0YV9zeXNfY29ubi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFJvdXRlcyBjb25uZWN0aW9uIHN0YXR1cyBjYWxsYmFja3MgZnJvbSB2YXJpb3VzIHN1YiBzeXN0ZW1zIHRvIERNCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5c19pbnQuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX3JtX3JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIERNIHRvIHJlZ2lzdGVyIHJvbGUgbWFuYWdlbWVudCBjYWxsYmFja3MKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19ybV9yZWdpc3Rlcih0QlRBX1NZU19DT05OX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGJ0YV9zeXNfY2IucHJtX2NiID0gcF9jYmFjazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfcm9sZV9jaGdfcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgQVYgdG8gcmVnaXN0ZXIgcm9sZSBjaGFuZ2UgY2FsbGJhY2tzCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfcm9sZV9jaGdfcmVnaXN0ZXIodEJUQV9TWVNfQ09OTl9DQkFDSyogcF9jYmFjaykgewotICBidGFfc3lzX2NiLnBfcm9sZV9jYiA9IHBfY2JhY2s7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19zc3JfY2ZnX3JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIERNIHRvIHJlZ2lzdGVyIFNTUiBjb25maWd1cmF0aW9uIGNhbGxiYWNrCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfc3NyX2NmZ19yZWdpc3Rlcih0QlRBX1NZU19TU1JfQ0ZHX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGJ0YV9zeXNfY2IucF9zc3JfY2IgPSBwX2NiYWNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19yb2xlX2NoZ19yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBBViB0byByZWdpc3RlciByb2xlIGNoYW5nZSBjYWxsYmFja3MKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19ub3RpZnlfcm9sZV9jaGcoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLCB0SENJX1JPTEUgbmV3X3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpIHsKLSAgTE9HX0RFQlVHKCJSb2xlIGNoYW5nZWQgcGVlcjolcyBuZXdfcm9sZTolcyBoY2lfc3RhdHVzOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwZWVyX2FkZHIpLCBSb2xlVGV4dChuZXdfcm9sZSkuY19zdHIoKSwKLSAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoaGNpX3N0YXR1cykuY19zdHIoKSk7Ci0gIGlmIChidGFfc3lzX2NiLnBfcm9sZV9jYikgewotICAgIGJ0YV9zeXNfY2IucF9yb2xlX2NiKEJUQV9TWVNfUk9MRV9DSEFOR0UsIG5ld19yb2xlLCBoY2lfc3RhdHVzLCBwZWVyX2FkZHIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX2NvbGxpc2lvbl9yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IGFueSBCVEEgbW9kdWxlIHRvIHJlZ2lzdGVyIGZvciBjb2xsaXNpb24gZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfY29sbGlzaW9uX3JlZ2lzdGVyKHVpbnQ4X3QgYnRhX2lkLCB0QlRBX1NZU19DT05OX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIHVpbnQ4X3QgaW5kZXg7Ci0KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0NPTExJU0lPTl9SRUc7IGluZGV4KyspIHsKLSAgICBpZiAoKGJ0YV9zeXNfY2IuY29sbGlfcmVnLmlkW2luZGV4XSA9PSBidGFfaWQpIHx8Ci0gICAgICAgIChidGFfc3lzX2NiLmNvbGxpX3JlZy5pZFtpbmRleF0gPT0gMCkpIHsKLSAgICAgIGJ0YV9zeXNfY2IuY29sbGlfcmVnLmlkW2luZGV4XSA9IGJ0YV9pZDsKLSAgICAgIGJ0YV9zeXNfY2IuY29sbGlfcmVnLnBfY29sbF9jYmFja1tpbmRleF0gPSBwX2NiYWNrOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19ub3RpZnlfY29sbGlzaW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIERNIHRvIG5vdGlmeSBjb2xsaXNpb24gZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfbm90aWZ5X2NvbGxpc2lvbihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgdWludDhfdCBpbmRleDsKLQotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfQ09MTElTSU9OX1JFRzsgaW5kZXgrKykgewotICAgIGlmICgoYnRhX3N5c19jYi5jb2xsaV9yZWcuaWRbaW5kZXhdICE9IDApICYmCi0gICAgICAgIChidGFfc3lzX2NiLmNvbGxpX3JlZy5wX2NvbGxfY2JhY2tbaW5kZXhdICE9IE5VTEwpKSB7Ci0gICAgICBidGFfc3lzX2NiLmNvbGxpX3JlZy5wX2NvbGxfY2JhY2tbaW5kZXhdKEJUQV9TWVNfQ09OTl9PUEVOLCBCVEFfSURfU1lTLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHIpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19zY29fcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgQVYgdG8gcmVnaXN0ZXIgc2NvIGNvbm5lY3Rpb24gY2hhbmdlIGNhbGxiYWNrcwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3Njb19yZWdpc3Rlcih0QlRBX1NZU19DT05OX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGJ0YV9zeXNfY2IucF9zY29fY2IgPSBwX2NiYWNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19wbV9yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBETSB0byByZWdpc3RlciBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrcwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3BtX3JlZ2lzdGVyKHRCVEFfU1lTX0NPTk5fQ0JBQ0sqIHBfY2JhY2spIHsKLSAgYnRhX3N5c19jYi5wcG1fY2IgPSBwX2NiYWNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19jb25uX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgc3Vic3lzdGVtcyB3aGVuIGEgY29ubmVjdGlvbiBpcyBtYWRlIHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2aWNlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfY29ubl9vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgaWYgKGJ0YV9zeXNfY2IucHJtX2NiKSB7Ci0gICAgYnRhX3N5c19jYi5wcm1fY2IoQlRBX1NZU19DT05OX09QRU4sIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLQotICBpZiAoYnRhX3N5c19jYi5wcG1fY2IpIHsKLSAgICBidGFfc3lzX2NiLnBwbV9jYihCVEFfU1lTX0NPTk5fT1BFTiwgaWQsIGFwcF9pZCwgcGVlcl9hZGRyKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19jb25uX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIHN1YnN5c3RlbXMgd2hlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgaXMgY2xvc2VkCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfY29ubl9jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBpZiAoYnRhX3N5c19jYi5wcm1fY2IpIHsKLSAgICBidGFfc3lzX2NiLnBybV9jYihCVEFfU1lTX0NPTk5fQ0xPU0UsIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLQotICBpZiAoYnRhX3N5c19jYi5wcG1fY2IpIHsKLSAgICBidGFfc3lzX2NiLnBwbV9jYihCVEFfU1lTX0NPTk5fQ0xPU0UsIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfYXBwX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgc3Vic3lzdGVtcyB3aGVuIGFwcGxpY2F0aW9uIGluaXRpYXRlcwotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgcGVlciBkZXZpY2UKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19hcHBfb3Blbih1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGlmIChidGFfc3lzX2NiLnBwbV9jYikgewotICAgIGJ0YV9zeXNfY2IucHBtX2NiKEJUQV9TWVNfQVBQX09QRU4sIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfYXBwX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIHN1YnN5c3RlbXMgd2hlbiBhcHBsaWNhdGlvbiBpbml0aWF0ZXMgY2xvc2UKLSAqICAgICAgICAgICAgICAgICAgb2YgY29ubmVjdGlvbiB0byBwZWVyIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfYXBwX2Nsb3NlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgaWYgKGJ0YV9zeXNfY2IucHBtX2NiKSB7Ci0gICAgYnRhX3N5c19jYi5wcG1fY2IoQlRBX1NZU19BUFBfQ0xPU0UsIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfc2NvX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgc3Vic3lzdGVtcyB3aGVuIHNjbyBjb25uZWN0aW9uIGZvciB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UgaXMgb3BlbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfc2NvX29wZW4odWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICAvKiBBRyB0cmlnZ2VycyBwX3Njb19jYiBieSBidGFfc3lzX3Njb191c2UuICovCi0gIGlmICgoaWQgIT0gQlRBX0lEX0FHKSAmJiAoYnRhX3N5c19jYi5wX3Njb19jYikpIHsKLSAgICAvKiB3aXRob3V0IHF1ZXJ5aW5nIEJUTV9HZXROdW1TY29MaW5rcygpICovCi0gICAgYnRhX3N5c19jYi5wX3Njb19jYihCVEFfU1lTX1NDT19PUEVOLCAxLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLQotICBpZiAoYnRhX3N5c19jYi5wcG1fY2IpIHsKLSAgICBidGFfc3lzX2NiLnBwbV9jYihCVEFfU1lTX1NDT19PUEVOLCBpZCwgYXBwX2lkLCBwZWVyX2FkZHIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX3Njb19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBzdWJzeXN0ZW1zIHdoZW4gc2NvIGNvbm5lY3Rpb24gZm9yIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZSBpcyBjbG9zZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3Njb19jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIHVpbnQ4X3QgbnVtX3Njb19saW5rczsKLQotICBpZiAoKGlkICE9IEJUQV9JRF9BRykgJiYgKGJ0YV9zeXNfY2IucF9zY29fY2IpKSB7Ci0gICAgbnVtX3Njb19saW5rcyA9IEJUTV9HZXROdW1TY29MaW5rcygpOwotICAgIGJ0YV9zeXNfY2IucF9zY29fY2IoQlRBX1NZU19TQ09fQ0xPU0UsIG51bV9zY29fbGlua3MsIGFwcF9pZCwgcGVlcl9hZGRyKTsKLSAgfQotCi0gIGlmIChidGFfc3lzX2NiLnBwbV9jYikgewotICAgIGJ0YV9zeXNfY2IucHBtX2NiKEJUQV9TWVNfU0NPX0NMT1NFLCBpZCwgYXBwX2lkLCBwZWVyX2FkZHIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX3Njb191c2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgc3Vic3lzdGVtcyB3aGVuIHRoYXQgc2VydmljZSBuZWVkcyB0byB1c2Ugc2NvLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3Njb191c2UoVU5VU0VEX0FUVFIgdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgLyogQVYgc3RyZWFtaW5nIG5lZWQgdG8gYmUgc3VzcGVuZGVkIGJlZm9yZSBTQ08gaXMgY29ubmVjdGVkLiAqLwotICBpZiAoYnRhX3N5c19jYi5wX3Njb19jYikgewotICAgIC8qIHdpdGhvdXQgcXVlcnlpbmcgQlRNX0dldE51bVNjb0xpbmtzKCkgKi8KLSAgICBidGFfc3lzX2NiLnBfc2NvX2NiKEJUQV9TWVNfU0NPX09QRU4sIDEsIGFwcF9pZCwgcGVlcl9hZGRyKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19zY29fdW51c2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgc3Vic3lzdGVtcyB3aGVuIHNjbyBjb25uZWN0aW9uIGZvciB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3Njb191bnVzZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGlmICgoYnRhX3N5c19jYi5wX3Njb19jYikpIHsKLSAgICB1aW50OF90IG51bV9zY29fbGlua3MgPSBCVE1fR2V0TnVtU2NvTGlua3MoKTsKLSAgICBidGFfc3lzX2NiLnBfc2NvX2NiKEJUQV9TWVNfU0NPX0NMT1NFLCBudW1fc2NvX2xpbmtzLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX2NoZ19zc3JfY29uZmlnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIHN1YnN5c3RlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gYXBwIFNTUgotICogICAgICAgICAgICAgICAgICBzZXR0aW5nIG5lZWRzIHRvIGJlIGNoYW5nZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19jaGdfc3NyX2NvbmZpZyh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgdWludDE2X3QgbWF4X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3RvdXQpIHsKLSAgaWYgKGJ0YV9zeXNfY2IucF9zc3JfY2IpIHsKLSAgICBidGFfc3lzX2NiLnBfc3NyX2NiKGlkLCBhcHBfaWQsIG1heF9sYXRlbmN5LCBtaW5fdG91dCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfaWRsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBzdWJzeXN0ZW1zIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbm5lY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgcGVlciBkZXZpY2UgaXMgaWRsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfaWRsZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGlmIChidGFfc3lzX2NiLnBybV9jYikgewotICAgIGJ0YV9zeXNfY2IucHJtX2NiKEJUQV9TWVNfQ09OTl9JRExFLCBpZCwgYXBwX2lkLCBwZWVyX2FkZHIpOwotICB9Ci0KLSAgaWYgKGJ0YV9zeXNfY2IucHBtX2NiKSB7Ci0gICAgYnRhX3N5c19jYi5wcG1fY2IoQlRBX1NZU19DT05OX0lETEUsIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfYnVzeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBzdWJzeXN0ZW1zIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbm5lY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgcGVlciBkZXZpY2UgaXMgYnVzeQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfYnVzeSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGlmIChidGFfc3lzX2NiLnBybV9jYikgewotICAgIGJ0YV9zeXNfY2IucHJtX2NiKEJUQV9TWVNfQ09OTl9CVVNZLCBpZCwgYXBwX2lkLCBwZWVyX2FkZHIpOwotICB9Ci0KLSAgaWYgKGJ0YV9zeXNfY2IucHBtX2NiKSB7Ci0gICAgYnRhX3N5c19jYi5wcG1fY2IoQlRBX1NZU19DT05OX0JVU1ksIGlkLCBhcHBfaWQsIHBlZXJfYWRkcik7Ci0gIH0KLX0KLQotI2lmIChCVEFfRUlSX0NBTk5FRF9VVUlEX0xJU1QgIT0gVFJVRSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX2Vpcl9yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBETSB0byByZWdpc3RlciBFSVIgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNhbgotICogICAgICAgICAgICAgICAgICBiZSB1c2VkIGJ5IHRoZSBvdGhlciBCVEEgbW9kdWxlcyB0byBhZGQvcmVtb3ZlIFVVSUQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19laXJfcmVnaXN0ZXIodEJUQV9TWVNfRUlSX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGJ0YV9zeXNfY2IuZWlyX2NiID0gcF9jYmFjazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfY3VzdF9laXJfcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBCVEEgRE0gdG8gcmVnaXN0ZXIgRUlSIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjYW4KLSAqICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgb3RoZXIgQlRBIG1vZHVsZXMgdG8gYWRkL3JlbW92ZSBjdXN0b20gVVVJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX2N1c3RfZWlyX3JlZ2lzdGVyKHRCVEFfU1lTX0NVU1RfRUlSX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIGJ0YV9zeXNfY2IuY3VzdF9laXJfY2IgPSBwX2NiYWNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19hZGRfdXVpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBzdWJzeXN0ZW1zIHRvIGluZGljYXRlIHRvIERNIHRoYXQgbmV3IHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgY2xhc3MgVVVJRCBpcyBhZGRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX2FkZF91dWlkKHVpbnQxNl90IHV1aWQxNikgewotICBpZiAoYnRhX3N5c19jYi5laXJfY2IpIHsKLSAgICBidGFfc3lzX2NiLmVpcl9jYih1dWlkMTYsIHRydWUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX3JlbW92ZV91dWlkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgYnkgQlRBIHN1YnN5c3RlbXMgdG8gaW5kaWNhdGUgdG8gRE0gdGhhdCB0aGUgc2VydmljZQotICogICAgICAgICAgICAgICAgICBjbGFzcyBVVUlEIGlzIHJlbW92ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19yZW1vdmVfdXVpZCh1aW50MTZfdCB1dWlkMTYpIHsKLSAgaWYgKGJ0YV9zeXNfY2IuZWlyX2NiKSB7Ci0gICAgYnRhX3N5c19jYi5laXJfY2IodXVpZDE2LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfYWRkX2N1c3RfdXVpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBzdWJzeXN0ZW1zIHRvIGluZGljYXRlIHRvIERNIHRoYXQgdGhlIGN1c3RvbSBzZXJ2aWNlCi0gKiAgICAgICAgICAgICAgICAgIGNsYXNzIFVVSUQgaXMgcmVtb3ZlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX2FkZF9jdXN0X3V1aWQoY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3VycikgewotICBpZiAoYnRhX3N5c19jYi5jdXN0X2Vpcl9jYikgewotICAgIGJ0YV9zeXNfY2IuY3VzdF9laXJfY2IoY3VyciwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfcmVtb3ZlX2N1c3RfdXVpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IEJUQSBzdWJzeXN0ZW1zIHRvIGluZGljYXRlIHRvIERNIHRoYXQgdGhlIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgY2xhc3MgVVVJRCBpcyByZW1vdmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zeXNfcmVtb3ZlX2N1c3RfdXVpZChjb25zdCB0QlRBX0NVU1RPTV9VVUlEJiBjdXJyKSB7Ci0gIGlmIChidGFfc3lzX2NiLmN1c3RfZWlyX2NiKSB7Ci0gICAgYnRhX3N5c19jYi5jdXN0X2Vpcl9jYihjdXJyLCBmYWxzZSk7Ci0gIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRhL3N5cy9idGFfc3lzX2ludC5oIGIvYnRhL3N5cy9idGFfc3lzX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDg3ZjRkLi4wMDAwMDAwCi0tLSBhL2J0YS9zeXMvYnRhX3N5c19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgcHJpdmF0ZSBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlIEJUQSBzeXN0ZW0gbWFuYWdlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVEFfU1lTX0lOVF9ICi0jZGVmaW5lIEJUQV9TWVNfSU5UX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyBhbmQgZGF0YSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHN0YXRlIHRhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29sbGlzaW9uIGNhbGxiYWNrICovCi0jZGVmaW5lIE1BWF9DT0xMSVNJT05fUkVHIDUKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGlkW01BWF9DT0xMSVNJT05fUkVHXTsKLSAgdEJUQV9TWVNfQ09OTl9DQkFDSyogcF9jb2xsX2NiYWNrW01BWF9DT0xMSVNJT05fUkVHXTsKLX0gdEJUQV9TWVNfQ09MTElTSU9OOwotCi0vKiBzeXN0ZW0gbWFuYWdlciBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfU1lTX1JFRyogcmVnW0JUQV9JRF9NQVhdOyAvKiByZWdpc3RyYXRpb24gc3RydWN0dXJlcyAqLwotICBib29sIGlzX3JlZ1tCVEFfSURfTUFYXTsgICAgICAgLyogcmVnaXN0cmF0aW9uIHN0cnVjdHVyZXMgKi8KLSAgYm9vbCBmb3J3YXJkX2h3X2ZhaWx1cmVzOwotICB1aW50MTZfdCBzeXNfZmVhdHVyZXM7ICAgICAgICAgLyogQml0bWFzayBvZiBzeXMgZmVhdHVyZXMgKi8KLQotICB0QlRBX1NZU19DT05OX0NCQUNLKiBwcm1fY2I7IC8qIHJvbGUgbWFuYWdlbWVudCBjYWxsYmFjayByZWdpc3RlcmVkIGJ5IERNICovCi0gIHRCVEFfU1lTX0NPTk5fQ0JBQ0sqCi0gICAgICBwcG1fY2I7IC8qIGxvdyBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgRE0gKi8KLSAgdEJUQV9TWVNfQ09OTl9DQkFDSyoKLSAgICAgIHBfc2NvX2NiOyAvKiBTQ08gY29ubmVjdGlvbiBjaGFuZ2UgY2FsbGJhY2sgcmVnaXN0ZXJlZCBieSBBViAqLwotICB0QlRBX1NZU19DT05OX0NCQUNLKiBwX3JvbGVfY2I7IC8qIHJvbGUgY2hhbmdlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgQVYgKi8KLSAgdEJUQV9TWVNfQ09MTElTSU9OIGNvbGxpX3JlZzsgICAvKiBjb2xsaXNpb24gaGFuZGxpbmcgbW9kdWxlICovCi0jaWYgKEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCAhPSBUUlVFKQotICB0QlRBX1NZU19FSVJfQ0JBQ0sqIGVpcl9jYjsgLyogYWRkL3JlbW92ZSBVVUlEIGludG8gRUlSICovCi0gIHRCVEFfU1lTX0NVU1RfRUlSX0NCQUNLKiBjdXN0X2Vpcl9jYjsgLyogYWRkL3JlbW92ZSBjdXN0b21lciBVVUlEIGludG8gRUlSICovCi0jZW5kaWYKLSAgdEJUQV9TWVNfU1NSX0NGR19DQkFDSyogcF9zc3JfY2I7Ci0gIC8qIFZTIGV2ZW50IGhhbmRsZXIgKi8KLSAgdEJUQV9TWVNfVlNfRVZUX0hETFIqIHBfdnNfZXZ0X2hkbHI7Ci0KLX0gdEJUQV9TWVNfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEdsb2JhbCB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBzeXN0ZW0gbWFuYWdlciBjb250cm9sIGJsb2NrICovCi1leHRlcm4gdEJUQV9TWVNfQ0IgYnRhX3N5c19jYjsKLQotI2VuZGlmIC8qIEJUQV9TWVNfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2J0YS9zeXMvYnRhX3N5c19tYWluLmNjIGIvYnRhL3N5cy9idGFfc3lzX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDMzOTguLjAwMDAwMDAKLS0tIGEvYnRhL3N5cy9idGFfc3lzX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBtYWluIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIHRoZSBCVEEgc3lzdGVtIG1hbmFnZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfc3lzX21haW4iCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXNfaW50LmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiICAvLyBkb19pbl9tYWluX3RocmVhZAotCi12b2lkIEJUSUZfZG1fb25faHdfZXJyb3IoKTsKLQotLyogc3lzdGVtIG1hbmFnZXIgY29udHJvbCBibG9jayBkZWZpbml0aW9uICovCi10QlRBX1NZU19DQiBidGFfc3lzX2NiOwotCi0vKiB0cmFjZSBsZXZlbCAqLwotLyogVE9ETyBIYXJkLWNvZGVkIHRyYWNlIGxldmVscyAtICBOZWVkcyB0byBiZSBjb25maWd1cmFibGUgKi8KLXVpbnQ4X3QgYXBwbF90cmFjZV9sZXZlbCA9IEFQUExfSU5JVElBTF9UUkFDRV9MRVZFTDsKLXVpbnQ4X3QgYnRpZl90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUQSBpbml0aWFsaXphdGlvbjsgY2FsbGVkIGZyb20gdGFzayBpbml0aWFsaXphdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19pbml0KHZvaWQpIHsKLSAgbWVtc2V0KCZidGFfc3lzX2NiLCAwLCBzaXplb2YodEJUQV9TWVNfQ0IpKTsKLX0KLQotdm9pZCBidGFfc2V0X2ZvcndhcmRfaHdfZmFpbHVyZXMoYm9vbCB2YWx1ZSkgewotICBidGFfc3lzX2NiLmZvcndhcmRfaHdfZmFpbHVyZXMgPSB2YWx1ZTsKLX0KLQotdm9pZCBCVEFfc3lzX3NpZ25hbF9od19lcnJvcigpIHsKLSAgaWYgKGJ0YV9zeXNfY2IuZm9yd2FyZF9od19mYWlsdXJlcykgewotICAgIEJUSUZfZG1fb25faHdfZXJyb3IoKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRBIGV2ZW50IGhhbmRsZXI7IGNhbGxlZCBmcm9tIHRhc2sgZXZlbnQgaGFuZGxlci4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9zeXNfZXZlbnQoQlRfSERSX1JJR0lEKiBwX21zZykgewotICB1aW50OF90IGlkOwotICBib29sIGZyZWVidWYgPSB0cnVlOwotCi0gIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBFdmVudCAweCV4IiwgX19mdW5jX18sIHBfbXNnLT5ldmVudCk7Ci0KLSAgLyogZ2V0IHN1YnN5c3RlbSBpZCBmcm9tIGV2ZW50ICovCi0gIGlkID0gKHVpbnQ4X3QpKHBfbXNnLT5ldmVudCA+PiA4KTsKLQotICAvKiB2ZXJpZnkgaWQgYW5kIGNhbGwgc3Vic3lzdGVtIGV2ZW50IGhhbmRsZXIgKi8KLSAgaWYgKChpZCA8IEJUQV9JRF9NQVgpICYmIChidGFfc3lzX2NiLnJlZ1tpZF0gIT0gTlVMTCkpIHsKLSAgICBmcmVlYnVmID0gKCpidGFfc3lzX2NiLnJlZ1tpZF0tPmV2dF9oZGxyKShwX21zZyk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oIklnbm9yaW5nIHJlY2VpcHQgb2YgdW5yZWdpc3RlcmVkIGV2ZW50IGlkOiVzIiwKLSAgICAgICAgICAgICBCdGFJZFN5c1RleHQoaWQpLmNfc3RyKCkpOwotICB9Ci0KLSAgaWYgKGZyZWVidWYpIHsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBvdGhlciBCVEEgc3Vic3lzdGVtcyB0byByZWdpc3RlciB0aGVpciBldmVudAotICogICAgICAgICAgICAgICAgICBoYW5kbGVyLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3JlZ2lzdGVyKHVpbnQ4X3QgaWQsIGNvbnN0IHRCVEFfU1lTX1JFRyogcF9yZWcpIHsKLSAgYnRhX3N5c19jYi5yZWdbaWRdID0gKHRCVEFfU1lTX1JFRyopcF9yZWc7Ci0gIGJ0YV9zeXNfY2IuaXNfcmVnW2lkXSA9IHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX2RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCBieSBvdGhlciBCVEEgc3Vic3lzdGVtcyB0byBkZS1yZWdpc3RlcgotICogICAgICAgICAgICAgICAgICBoYW5kbGVyLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX2RlcmVnaXN0ZXIodWludDhfdCBpZCkgeyBidGFfc3lzX2NiLmlzX3JlZ1tpZF0gPSBmYWxzZTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19pc19yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIGJ5IG90aGVyIEJUQSBzdWJzeXN0ZW1zIHRvIGdldCByZWdpc3RlcmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1cy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX3N5c19pc19yZWdpc3Rlcih1aW50OF90IGlkKSB7IHJldHVybiBidGFfc3lzX2NiLmlzX3JlZ1tpZF07IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9zeXNfc2VuZG1zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIEdLSSBtZXNzYWdlIHRvIEJUQS4gIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgb3B0aW1pemUgc2VuZGluZyBvZiBtZXNzYWdlcyB0byBCVEEuICBJdCBpcyBjYWxsZWQgYnkgQlRBCi0gKiAgICAgICAgICAgICAgICAgIEFQSSBmdW5jdGlvbnMgYW5kIGNhbGwtaW4gZnVuY3Rpb25zLgotICoKLSAqICAgICAgICAgICAgICAgICAgVE9ETyAoYXBhbmlja2UpOiBBZGQgbG9jYXRpb24gb2JqZWN0IGFzIHBhcmFtZXRlciBmb3IgZWFzaWVyCi0gKiAgICAgICAgICAgICAgICAgIGZ1dHVyZSBkZWJ1Z2dpbmcgd2hlbiBkb2luZyBhbGFybSByZWZhY3RvcgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfc3lzX3NlbmRtc2codm9pZCogcF9tc2cpIHsKLSAgaWYgKGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICBiYXNlOjpCaW5kKCZidGFfc3lzX2V2ZW50LCBzdGF0aWNfY2FzdDxCVF9IRFJfUklHSUQqPihwX21zZykpKSAhPQotICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGRvX2luX21haW5fdGhyZWFkIGZhaWxlZCI7Ci0gIH0KLX0KLQotdm9pZCBidGFfc3lzX3NlbmRtc2dfZGVsYXllZCh2b2lkKiBwX21zZywgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkZWxheSkgewotICBpZiAoZG9faW5fbWFpbl90aHJlYWRfZGVsYXllZCgKLSAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgYmFzZTo6QmluZCgmYnRhX3N5c19ldmVudCwgc3RhdGljX2Nhc3Q8QlRfSERSX1JJR0lEKj4ocF9tc2cpKSwKLSAgICAgICAgICBkZWxheSkgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGRvX2luX21haW5fdGhyZWFkX2RlbGF5ZWQgZmFpbGVkIjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3N5c19zdGFydF90aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgYSBwcm90b2NvbCB0aW1lciBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQKLSAqICAgICAgICAgICAgICAgICAgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19zdGFydF90aW1lcihhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxheWVyX3NwZWNpZmljKSB7Ci0gIEJUX0hEUl9SSUdJRCogcF9idWYgPSAoQlRfSERSX1JJR0lEKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKTsKLQotICBwX2J1Zi0+ZXZlbnQgPSBldmVudDsKLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gbGF5ZXJfc3BlY2lmaWM7Ci0KLSAgYWxhcm1fc2V0X29uX21sb29wKGFsYXJtLCBpbnRlcnZhbF9tcywgYnRhX3N5c19zZW5kbXNnLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc3lzX2Rpc2FibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZvciBlYWNoIHJlZ2lzdGVyZWQgc3Vic3lzdGVtIGV4ZWN1dGUgaXRzIGRpc2FibGUgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3N5c19kaXNhYmxlKCkgewotICBpbnQgYnRhX2lkID0gQlRBX0lEX0RNX1NFQVJDSDsKLSAgaW50IGJ0YV9pZF9tYXggPSBCVEFfSURfQkxVRVRPT1RIX01BWDsKLQotICBmb3IgKDsgYnRhX2lkIDw9IGJ0YV9pZF9tYXg7IGJ0YV9pZCsrKSB7Ci0gICAgaWYgKGJ0YV9zeXNfY2IucmVnW2J0YV9pZF0gIT0gTlVMTCkgewotICAgICAgaWYgKGJ0YV9zeXNfY2IuaXNfcmVnW2J0YV9pZF0gJiYKLSAgICAgICAgICBidGFfc3lzX2NiLnJlZ1tidGFfaWRdLT5kaXNhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgKCpidGFfc3lzX2NiLnJlZ1tidGFfaWRdLT5kaXNhYmxlKSgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRhL3N5cy91dGwuY2MgYi9idGEvc3lzL3V0bC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkOTAzNC4uMDAwMDAwMAotLS0gYS9idGEvc3lzL3V0bC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL3V0bC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgdXRsX3N0cjJpbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjb252ZXJ0cyBhIGNoYXJhY3RlciBzdHJpbmcgdG8gYW4KLSAqICAgICAgICAgICAgICAgICAgaW50ZWdlci4gIEFjY2VwdGFibGUgdmFsdWVzIGluIHN0cmluZyBhcmUgMC05LiAgSWYgaW52YWxpZAotICogICAgICAgICAgICAgICAgICBzdHJpbmcgb3Igc3RyaW5nIHZhbHVlIHRvbyBsYXJnZSwgLTEgaXMgcmV0dXJuZWQuICBMZWFkaW5nCi0gKiAgICAgICAgICAgICAgICAgIHNwYWNlcyBhcmUgc2tpcHBlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBJbnRlZ2VyIHZhbHVlIG9yIC0xIG9uIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQxNl90IHV0bF9zdHIyaW50KGNvbnN0IGNoYXIqIHBfcykgewotICBpbnQzMl90IHZhbCA9IDA7Ci0KLSAgZm9yICg7ICpwX3MgPT0gJyAnICYmICpwX3MgIT0gMDsgcF9zKyspCi0gICAgOwotCi0gIGlmICgqcF9zID09IDApIHJldHVybiAtMTsKLQotICBmb3IgKDs7KSB7Ci0gICAgaWYgKCgqcF9zIDwgJzAnKSB8fCAoKnBfcyA+ICc5JykpIHJldHVybiAtMTsKLQotICAgIHZhbCArPSAoaW50MzJfdCkoKnBfcysrIC0gJzAnKTsKLQotICAgIGlmICh2YWwgPiAzMjc2NykgcmV0dXJuIC0xOwotCi0gICAgaWYgKCpwX3MgPT0gMCkgewotICAgICAgcmV0dXJuIChpbnQxNl90KXZhbDsKLSAgICB9IGVsc2UgewotICAgICAgdmFsICo9IDEwOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgdXRsX3N0cnVjbXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjb21wYXJlcyB0d28gc3RyaW5ncyBpbiB1cHBlcmNhc2UuCi0gKiAgICAgICAgICAgICAgICAgIFN0cmluZyBwX3MgbXVzdCBiZSB1cHBlcmNhc2UuICBTdHJpbmcgcF90IGlzIGNvbnZlcnRlZCB0bwotICogICAgICAgICAgICAgICAgICB1cHBlcmNhc2UgaWYgbG93ZXJjYXNlLiAgSWYgcF9zIGVuZHMgZmlyc3QsIHRoZSBzdWJzdHJpbmcKLSAqICAgICAgICAgICAgICAgICAgbWF0Y2ggaXMgY291bnRlZCBhcyBhIG1hdGNoLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIDAgaWYgc3RyaW5ncyBtYXRjaCwgbm9uemVybyBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB1dGxfc3RydWNtcChjb25zdCBjaGFyKiBwX3MsIGNvbnN0IGNoYXIqIHBfdCkgewotICBjaGFyIGM7Ci0KLSAgd2hpbGUgKCpwX3MgJiYgKnBfdCkgewotICAgIGMgPSAqcF90Kys7Ci0gICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7Ci0gICAgICBjIC09IDB4MjA7Ci0gICAgfQotICAgIGlmICgqcF9zKysgIT0gYykgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICAvKiBpZiBwX3QgaGl0IG51bGwgZmlyc3QsIG5vIG1hdGNoICovCi0gIGlmICgqcF90ID09IDAgJiYgKnBfcyAhPSAwKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgLyogZWxzZSBwX3MgaGl0IG51bGwgZmlyc3QsIGNvdW50IGFzIG1hdGNoICovCi0gIGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1dGxfaXRvYQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNvbnZlcnRzIGEgdWludDE2X3QgdG8gYSBzdHJpbmcuICBUaGUKLSAqICAgICAgICAgICAgICAgICAgc3RyaW5nIGlzIE5VTEwtdGVybWluYXRlZC4gIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcwotICogICAgICAgICAgICAgICAgICByZXR1cm5lZDsKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBMZW5ndGggb2Ygc3RyaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IHV0bF9pdG9hKHVpbnQxNl90IGksIGNoYXIqIHBfcykgewotICB1aW50MTZfdCBqLCBrOwotICBjaGFyKiBwID0gcF9zOwotICBib29sIGZpbGwgPSBmYWxzZTsKLQotICBpZiAoaSA9PSAwKSB7Ci0gICAgLyogdGFrZSBjYXJlIG9mIHplcm8gY2FzZSAqLwotICAgICpwKysgPSAnMCc7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChqID0gMTAwMDA7IGogPiAwOyBqIC89IDEwKSB7Ci0gICAgICBrID0gaSAvIGo7Ci0gICAgICBpICU9IGo7Ci0gICAgICBpZiAoayA+IDAgfHwgZmlsbCkgewotICAgICAgICAqcCsrID0gayArICcwJzsKLSAgICAgICAgZmlsbCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICpwID0gMDsKLSAgcmV0dXJuICh1aW50OF90KShwIC0gcF9zKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHV0bF9zZXRfZGV2aWNlX2NsYXNzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGxvY2FsIERldmljZSBDbGFzcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICBwX2NvZCAgIC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIGNsYXNzIHRvIHNldCB0bwotICoKLSAqICAgICAgICAgICAgICAgICAgY21kICAgICAtIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBjbGFzcyB0byB1cGRhdGUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfVVRMX1NFVF9DT0RfTUFKT1JfTUlOT1IsIC0gb3ZlcndyaXRlIG1ham9yLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yIGNsYXNzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfVVRMX1NFVF9DT0RfU0VSVklDRV9DTEFTUyAtIHNldCB0aGUgYml0cyBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9VVExfQ0xSX0NPRF9TRVJWSUNFX0NMQVNTIC0gY2xlYXIgdGhlIGJpdHMgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfVVRMX1NFVF9DT0RfQUxMIC0gb3ZlcndyaXRlIG1ham9yLCBtaW5vciwgc2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHMgaW4gc2VydmljZSBjbGFzcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX1VUTF9JTklUX0NPRCAtIG92ZXJ3cml0ZSBtYWpvciwgbWlub3IsIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgY2xhc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgdXRsX3NldF9kZXZpY2VfY2xhc3ModEJUQV9VVExfQ09EKiBwX2NvZCwgdWludDhfdCBjbWQpIHsKLSAgdWludDhfdCogZGV2OwotICB1aW50MTZfdCBzZXJ2aWNlOwotICB1aW50OF90IG1pbm9yLCBtYWpvcjsKLSAgREVWX0NMQVNTIGRldl9jbGFzczsKLQotICBkZXYgPSBCVE1fUmVhZERldmljZUNsYXNzKCk7Ci0gIEJUTV9DT0RfU0VSVklDRV9DTEFTUyhzZXJ2aWNlLCBkZXYpOwotICBCVE1fQ09EX01JTk9SX0NMQVNTKG1pbm9yLCBkZXYpOwotICBCVE1fQ09EX01BSk9SX0NMQVNTKG1ham9yLCBkZXYpOwotCi0gIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBCVEFfVVRMX1NFVF9DT0RfTUFKT1JfTUlOT1I6Ci0gICAgICBtaW5vciA9IHBfY29kLT5taW5vciAmIEJUTV9DT0RfTUlOT1JfQ0xBU1NfTUFTSzsKLSAgICAgIG1ham9yID0gcF9jb2QtPm1ham9yICYgQlRNX0NPRF9NQUpPUl9DTEFTU19NQVNLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9VVExfU0VUX0NPRF9TRVJWSUNFX0NMQVNTOgotICAgICAgLyogY2xlYXIgb3V0IHRoZSBiaXRzIHRoYXQgaXMgbm90IFNFUlZJQ0VfQ0xBU1MgYml0cyAqLwotICAgICAgcF9jb2QtPnNlcnZpY2UgJj0gQlRNX0NPRF9TRVJWSUNFX0NMQVNTX01BU0s7Ci0gICAgICBzZXJ2aWNlID0gc2VydmljZSB8IHBfY29kLT5zZXJ2aWNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9VVExfQ0xSX0NPRF9TRVJWSUNFX0NMQVNTOgotICAgICAgcF9jb2QtPnNlcnZpY2UgJj0gQlRNX0NPRF9TRVJWSUNFX0NMQVNTX01BU0s7Ci0gICAgICBzZXJ2aWNlID0gc2VydmljZSAmICh+cF9jb2QtPnNlcnZpY2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9VVExfU0VUX0NPRF9BTEw6Ci0gICAgICBtaW5vciA9IHBfY29kLT5taW5vciAmIEJUTV9DT0RfTUlOT1JfQ0xBU1NfTUFTSzsKLSAgICAgIG1ham9yID0gcF9jb2QtPm1ham9yICYgQlRNX0NPRF9NQUpPUl9DTEFTU19NQVNLOwotICAgICAgcF9jb2QtPnNlcnZpY2UgJj0gQlRNX0NPRF9TRVJWSUNFX0NMQVNTX01BU0s7Ci0gICAgICBzZXJ2aWNlID0gc2VydmljZSB8IHBfY29kLT5zZXJ2aWNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9VVExfSU5JVF9DT0Q6Ci0gICAgICBtaW5vciA9IHBfY29kLT5taW5vciAmIEJUTV9DT0RfTUlOT1JfQ0xBU1NfTUFTSzsKLSAgICAgIG1ham9yID0gcF9jb2QtPm1ham9yICYgQlRNX0NPRF9NQUpPUl9DTEFTU19NQVNLOwotICAgICAgc2VydmljZSA9IHBfY29kLT5zZXJ2aWNlICYgQlRNX0NPRF9TRVJWSUNFX0NMQVNTX01BU0s7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBjb252ZXJ0IHRoZSBmaWVsZHMgaW50byB0aGUgZGV2aWNlIGNsYXNzIHR5cGUgKi8KLSAgRklFTERTX1RPX0NPRChkZXZfY2xhc3MsIG1pbm9yLCBtYWpvciwgc2VydmljZSk7Ci0KLSAgaWYgKEJUTV9TZXREZXZpY2VDbGFzcyhkZXZfY2xhc3MpID09IEJUTV9TVUNDRVNTKSByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1dGxfaXNpbnRzdHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhbgotICogICAgICAgICAgICAgICAgICBpbnRlZ2VyIHN0cmluZyBvciBub3QKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3NmdWwsIE90aGVyd2lzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHV0bF9pc2ludHN0cihjb25zdCBjaGFyKiBwX3MpIHsKLSAgdWludDE2X3QgaSA9IDA7Ci0KLSAgZm9yIChpID0gMDsgcF9zW2ldICE9IDA7IGkrKykgewotICAgIGlmICgoKHBfc1tpXSA8ICcwJykgfHwgKHBfc1tpXSA+ICc5JykpICYmIChwX3NbaV0gIT0gJzsnKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1dGxfaXNkaWFsY2hhcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgIGlzIGFuIGFjY2VwdGFibGUgZGlhbCBkaWdpdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBPdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCB1dGxfaXNkaWFsY2hhcihjb25zdCBjaGFyIGQpIHsKLSAgcmV0dXJuICgoKGQgPj0gJzAnKSAmJiAoZCA8PSAnOScpKSB8fCAoZCA9PSAnKicpIHx8IChkID09ICcrJykgfHwKLSAgICAgICAgICAoZCA9PSAnIycpIHx8IChkID09ICc7JykgfHwgKGQgPT0gJywnKSB8fAotICAgICAgICAgICgoZCA+PSAnQScpICYmIChkIDw9ICdDJykpIHx8Ci0gICAgICAgICAgKChkID09ICdwJykgfHwgKGQgPT0gJ1AnKSB8fCAoZCA9PSAndycpIHx8IChkID09ICdXJykpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHV0bF9pc2RpYWxzdHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucwotICogICAgICAgICAgICAgICAgICBvbmx5IGRpYWwgZGlnaXRzIG9yIG5vdAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgT3RoZXJ3aXNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgdXRsX2lzZGlhbHN0cihjb25zdCBjaGFyKiBwX3MpIHsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgcF9zW2ldICE9IDA7IGkrKykgewotICAgIC8vIGluY2x1ZGUgY2hhcnMgbm90IGluIHNwZWMgdGhhdCB3b3JrIHNlbnQgYnkgc29tZSBoZWFkc2V0cy4KLSAgICBpZiAoISh1dGxfaXNkaWFsY2hhcihwX3NbaV0pIHx8IChwX3NbaV0gPT0gJy0nKSkpIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2J0YV9kaXBfdGVzdC5jYyBiL2J0YS90ZXN0L2J0YV9kaXBfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxZjNkMS4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9idGFfZGlwX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJidGEvc2RwL2J0YV9zZHBfYWN0LmNjIgotI2luY2x1ZGUgInN0YWNrL3NkcC9zZHBfYXBpLmNjIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHsKLWNvbnN0IFJhd0FkZHJlc3MgYmRhZGRyKHsweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2fSk7Ci19ICAvLyBuYW1lc3BhY2UKLQotZXh0ZXJuIHRCVEFfU0RQX0NCIGJ0YV9zZHBfY2I7Ci1leHRlcm4gdEJUQV9TRFBfQ0ZHKiBwX2J0YV9zZHBfY2ZnOwotCi1zdGF0aWMgdFNEUF9ESVNDX0FUVFIgZ19hdHRyX3NlcnZpY2VfY2xhc3NfaWRfbGlzdDsKLXN0YXRpYyB0U0RQX0RJU0NfQVRUUiBnX3N1Yl9hdHRyOwotc3RhdGljIHRTRFBfRElTQ19BVFRSIGdfYXR0cl9zcGVjX2lkOwotc3RhdGljIHRTRFBfRElTQ19BVFRSIGdfYXR0cl92ZW5kb3JfaWQ7Ci1zdGF0aWMgdFNEUF9ESVNDX0FUVFIgZ19hdHRyX3ZlbmRvcl9pZF9zcmM7Ci1zdGF0aWMgdFNEUF9ESVNDX0FUVFIgZ19hdHRyX3ZlbmRvcl9wcm9kdWN0X2lkOwotc3RhdGljIHRTRFBfRElTQ19BVFRSIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF92ZXJzaW9uOwotc3RhdGljIHRTRFBfRElTQ19BVFRSIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF9wcmltYXJ5X3JlY29yZDsKLXN0YXRpYyB0U0RQX0RJU0NfUkVDIGdfcmVjOwotCi1ib29sIHNkcHVfY29tcGFyZV91dWlkX3dpdGhfYXR0cihjb25zdCBVdWlkJiB1dWlkLCB0U0RQX0RJU0NfQVRUUiogcF9hdHRyKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBzZHBfZG1fY2JhY2sodEJUQV9TRFBfRVZUIGV2ZW50LCB0QlRBX1NEUCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkgewotICByZXR1cm47Ci19Ci0KLWNsYXNzIEJ0YURpcFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgZ19hdHRyX3NlcnZpY2VfY2xhc3NfaWRfbGlzdC5wX25leHRfYXR0ciA9ICZnX2F0dHJfc3BlY19pZDsKLSAgICBnX2F0dHJfc2VydmljZV9jbGFzc19pZF9saXN0LmF0dHJfaWQgPSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVDsKLSAgICBnX2F0dHJfc2VydmljZV9jbGFzc19pZF9saXN0LmF0dHJfbGVuX3R5cGUgPSAoREFUQV9FTEVfU0VRX0RFU0NfVFlQRTw8MTIpfDI7Ci0gICAgZ19hdHRyX3NlcnZpY2VfY2xhc3NfaWRfbGlzdC5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0ciA9ICZnX3N1Yl9hdHRyOwotICAgIGdfc3ViX2F0dHIuYXR0cl9sZW5fdHlwZSA9IChVVUlEX0RFU0NfVFlQRTw8MTIpfDI7Ci0gICAgZ19zdWJfYXR0ci5hdHRyX3ZhbHVlLnYudTE2ID0gMHgxMjAwOwotCi0gICAgZ19hdHRyX3NwZWNfaWQucF9uZXh0X2F0dHIgPSAmZ19hdHRyX3ZlbmRvcl9pZDsKLSAgICBnX2F0dHJfc3BlY19pZC5hdHRyX2lkID0gQVRUUl9JRF9TUEVDSUZJQ0FUSU9OX0lEOwotICAgIGdfYXR0cl9zcGVjX2lkLmF0dHJfbGVuX3R5cGUgPSAoVUlOVF9ERVNDX1RZUEU8PDEyKXwyOwotICAgIGdfYXR0cl9zcGVjX2lkLmF0dHJfdmFsdWUudi51MTYgPSAweDAxMDM7Ci0KLSAgICBnX2F0dHJfdmVuZG9yX2lkLnBfbmV4dF9hdHRyID0gJmdfYXR0cl92ZW5kb3JfaWRfc3JjOwotICAgIGdfYXR0cl92ZW5kb3JfaWQuYXR0cl9pZCA9IEFUVFJfSURfVkVORE9SX0lEOwotICAgIGdfYXR0cl92ZW5kb3JfaWQuYXR0cl9sZW5fdHlwZSA9IChVSU5UX0RFU0NfVFlQRTw8MTIpfDI7Ci0gICAgZ19hdHRyX3ZlbmRvcl9pZC5hdHRyX3ZhbHVlLnYudTE2ID0gMHgxOGQxOwotCi0gICAgLy8gQWxsb2NhdGlvbiBzaG91bGQgc3VjY2VlZAotICAgIGdfYXR0cl92ZW5kb3JfaWRfc3JjLnBfbmV4dF9hdHRyID0gJmdfYXR0cl92ZW5kb3JfcHJvZHVjdF9pZDsKLSAgICBnX2F0dHJfdmVuZG9yX2lkX3NyYy5hdHRyX2lkID0gQVRUUl9JRF9WRU5ET1JfSURfU09VUkNFOwotICAgIGdfYXR0cl92ZW5kb3JfaWRfc3JjLmF0dHJfbGVuX3R5cGUgPSAoVUlOVF9ERVNDX1RZUEU8PDEyKXwyOwotICAgIGdfYXR0cl92ZW5kb3JfaWRfc3JjLmF0dHJfdmFsdWUudi51MTYgPSAxOwotCi0gICAgZ19hdHRyX3ZlbmRvcl9wcm9kdWN0X2lkLnBfbmV4dF9hdHRyID0gJmdfYXR0cl92ZW5kb3JfcHJvZHVjdF92ZXJzaW9uOwotICAgIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF9pZC5hdHRyX2lkID0gQVRUUl9JRF9QUk9EVUNUX0lEOwotICAgIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF9pZC5hdHRyX2xlbl90eXBlID0gKFVJTlRfREVTQ19UWVBFPDwxMil8MjsKLSAgICBnX2F0dHJfdmVuZG9yX3Byb2R1Y3RfaWQuYXR0cl92YWx1ZS52LnUxNiA9IDB4MTIzNDsKLQotICAgIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF92ZXJzaW9uLnBfbmV4dF9hdHRyID0gJmdfYXR0cl92ZW5kb3JfcHJvZHVjdF9wcmltYXJ5X3JlY29yZDsKLSAgICBnX2F0dHJfdmVuZG9yX3Byb2R1Y3RfdmVyc2lvbi5hdHRyX2lkID0gQVRUUl9JRF9QUk9EVUNUX1ZFUlNJT047Ci0gICAgZ19hdHRyX3ZlbmRvcl9wcm9kdWN0X3ZlcnNpb24uYXR0cl9sZW5fdHlwZSA9IChVSU5UX0RFU0NfVFlQRTw8MTIpfDI7Ci0gICAgZ19hdHRyX3ZlbmRvcl9wcm9kdWN0X3ZlcnNpb24uYXR0cl92YWx1ZS52LnUxNiA9IDB4MDEwMDsKLQotICAgIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF9wcmltYXJ5X3JlY29yZC5wX25leHRfYXR0ciA9ICZnX2F0dHJfdmVuZG9yX3Byb2R1Y3RfcHJpbWFyeV9yZWNvcmQ7Ci0gICAgZ19hdHRyX3ZlbmRvcl9wcm9kdWN0X3ByaW1hcnlfcmVjb3JkLmF0dHJfaWQgPSBBVFRSX0lEX1BSSU1BUllfUkVDT1JEOwotICAgIGdfYXR0cl92ZW5kb3JfcHJvZHVjdF9wcmltYXJ5X3JlY29yZC5hdHRyX2xlbl90eXBlID0gKEJPT0xFQU5fREVTQ19UWVBFPDwxMik7Ci0gICAgZ19hdHRyX3ZlbmRvcl9wcm9kdWN0X3ByaW1hcnlfcmVjb3JkLmF0dHJfdmFsdWUudi51OCA9IDE7Ci0KLSAgICBnX3JlYy5wX2ZpcnN0X2F0dHIgPSAmZ19hdHRyX3NlcnZpY2VfY2xhc3NfaWRfbGlzdDsKLSAgICBnX3JlYy5wX25leHRfcmVjID0gbnVsbHB0cjsKLSAgICBnX3JlYy5yZW1vdGVfYmRfYWRkciA9IGJkYWRkcjsKLSAgICBnX3JlYy50aW1lX3JlYWQgPSAwOwotCi0gICAgYnRhX3NkcF9jYi5wX2RtX2NiYWNrID0gc2RwX2RtX2NiYWNrOwotICAgIGJ0YV9zZHBfY2IucmVtb3RlX2FkZHIgPSBiZGFkZHI7Ci0KLSAgICBwX2J0YV9zZHBfY2ZnLT5wX3NkcF9kYi0+cF9maXJzdF9yZWMgPSAmZ19yZWM7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUge30KLX07Ci0KLS8vIFRlc3QgdGhhdCBidGFfY3JlYXRlX2RpcF9zZHBfcmVjb3JkIGNhbiBwYXJzZSBzZHAgcmVjb3JkIHRvIGJsdWV0b290aF9zZHBfcmVjb3JkIGNvcnJlY3RseQotVEVTVF9GKEJ0YURpcFRlc3QsIHRlc3RfYnRhX2NyZWF0ZV9kaXBfc2RwX3JlY29yZCkgewotICBibHVldG9vdGhfc2RwX3JlY29yZCByZWNvcmQ7Ci0KLSAgYnRhX2NyZWF0ZV9kaXBfc2RwX3JlY29yZCgmcmVjb3JkLCAmZ19yZWMpOwotCi0gIEFTU0VSVF9FUShyZWNvcmQuZGlwLnNwZWNfaWQsIDB4MDEwMyk7Ci0gIEFTU0VSVF9FUShyZWNvcmQuZGlwLnZlbmRvciwgMHgxOGQxKTsKLSAgQVNTRVJUX0VRKHJlY29yZC5kaXAudmVuZG9yX2lkX3NvdXJjZSwgMSk7Ci0gIEFTU0VSVF9FUShyZWNvcmQuZGlwLnByb2R1Y3QsIDB4MTIzNCk7Ci0gIEFTU0VSVF9FUShyZWNvcmQuZGlwLnZlcnNpb24sIDB4MDEwMCk7Ci0gIEFTU0VSVF9FUShyZWNvcmQuZGlwLnByaW1hcnlfcmVjb3JkLCB0cnVlKTsKLX0KLQotVEVTVF9GKEJ0YURpcFRlc3QsIHRlc3RfYnRhX3NkcF9zZWFyY2hfY2JhY2spIHsKLSAgVXVpZCogdXNlcmRhdGEgPSAoVXVpZCopbWFsbG9jKHNpemVvZihVdWlkKSk7Ci0KLSAgbWVtY3B5KHVzZXJkYXRhLCAmVVVJRF9ESVAsIHNpemVvZihVVUlEX0RJUCkpOwotICBidGFfc2RwX3NlYXJjaF9jYmFjayhTRFBfU1VDQ0VTUywgdXNlcmRhdGEpOwotfQotCmRpZmYgLS1naXQgYS9idGEvdGVzdC9idGFfZG1fY3VzdF91dWlkX3Rlc3QuY2MgYi9idGEvdGVzdC9idGFfZG1fY3VzdF91dWlkX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwY2RjYjUuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvYnRhX2RtX2N1c3RfdXVpZF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJidGEvZG0vYnRhX2RtX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1jbGFzcyBCdGFDdXN0VXVpZCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IGJ0YV9kbV9jYiA9IHt9OyB9Ci19OwotCi1uYW1lc3BhY2UgewotICB1aW50MzJfdCBoYW5kbGUxID0gMTsKLSAgdWludDMyX3QgaGFuZGxlMiA9IDI7Ci0gIHN0YXRpYyBjb25zdCBVdWlkIHV1aWQxID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFV1aWQ6OlVVSUQxMjhCaXR7ezB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsCi0gICAgICAgICAgICAgICAgICAgICAgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZn19KTsKLSAgc3RhdGljIGNvbnN0IFV1aWQgdXVpZDIgPSBVdWlkOjpGcm9tMTI4Qml0QkUoCi0gICAgVXVpZDo6VVVJRDEyOEJpdHt7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgzMywKLSAgICAgICAgICAgICAgICAgICAgICAweDMzLCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU5fX0pOwotfQotCi0vLyBUZXN0IHdlIGNhbiByZW1vdmUvYWRkIDEyOCBiaXQgY3VzdG9tIFVVSUQgZnJvbS90byBidGFfZG1fY2IuYnRhX2N1c3RvbV91dWlkCi1URVNUX0YoQnRhQ3VzdFV1aWQsIHRlc3RfYWRkX3JlbW92ZV9jdXN0X3V1aWQpIHsKLSAgdEJUQV9DVVNUT01fVVVJRCYgY3VycjAgPSBidGFfZG1fY2IuYnRhX2N1c3RvbV91dWlkWzBdOwotICB0QlRBX0NVU1RPTV9VVUlEJiBjdXJyMSA9IGJ0YV9kbV9jYi5idGFfY3VzdG9tX3V1aWRbMV07Ci0gIHRCVEFfQ1VTVE9NX1VVSUQgY3VycjBfZXhwZWN0ID0ge3V1aWQxLCBoYW5kbGUxfTsKLSAgdEJUQV9DVVNUT01fVVVJRCBjdXJyMV9leHBlY3QgPSB7dXVpZDIsIGhhbmRsZTJ9OwotICAvLyBBZGQgZmlyc3QgMTI4IGJpdCBjdXN0b20gVVVJRAotICBidGFfZG1fZWlyX3VwZGF0ZV9jdXN0X3V1aWQoY3VycjBfZXhwZWN0LCB0cnVlKTsKLSAgQVNTRVJUX1NUUkVRKHV1aWQxLlRvU3RyaW5nKCkuY19zdHIoKSwgY3VycjAuY3VzdG9tX3V1aWQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgLy8gQWRkIHNlY29uZCAxMjggYml0IGN1c3RvbSBVVUlECi0gIGJ0YV9kbV9laXJfdXBkYXRlX2N1c3RfdXVpZChjdXJyMV9leHBlY3QsIHRydWUpOwotICBBU1NFUlRfU1RSRVEodXVpZDIuVG9TdHJpbmcoKS5jX3N0cigpLCBjdXJyMS5jdXN0b21fdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGN1cnIwX2V4cGVjdC5jdXN0b21fdXVpZC5VcGRhdGVVdWlkKFV1aWQ6OmtFbXB0eSk7Ci0gIGN1cnIxX2V4cGVjdC5jdXN0b21fdXVpZC5VcGRhdGVVdWlkKFV1aWQ6OmtFbXB0eSk7Ci0gIC8vIFJlbW92ZSBmaXJzdCAxMjggYml0IGN1c3RvbSBVVUlECi0gIGJ0YV9kbV9laXJfdXBkYXRlX2N1c3RfdXVpZChjdXJyMF9leHBlY3QsIGZhbHNlKTsKLSAgQVNTRVJUX1NUUkVRKFV1aWQ6OmtFbXB0eS5Ub1N0cmluZygpLmNfc3RyKCksIGN1cnIwLmN1c3RvbV91dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIC8vIFJlbW92ZSBzZWNvbmQgMTI4IGJpdCBjdXN0b20gVVVJRAotICBidGFfZG1fZWlyX3VwZGF0ZV9jdXN0X3V1aWQoY3VycjFfZXhwZWN0LCBmYWxzZSk7Ci0gIEFTU0VSVF9TVFJFUShVdWlkOjprRW1wdHkuVG9TdHJpbmcoKS5jX3N0cigpLCBjdXJyMS5jdXN0b21fdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvYnRhX2RtX3Rlc3QuY2MgYi9idGEvdGVzdC9idGFfZG1fdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhZGU3YS4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9idGFfZG1fdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJidGEvZG0vYnRhX2RtX2ludC5oIgotI2luY2x1ZGUgImJ0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZG1fYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2hmX2NsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfb3NpX2FsYXJtLmgiCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsLmgiCi0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi1leHRlcm4gc3RydWN0IGJ0bV9jbGllbnRfaW50ZXJmYWNlX3MgYnRtX2NsaWVudF9pbnRlcmZhY2U7Ci0KLXZvaWQgTG9nTXNnKHVpbnQzMl90IHRyYWNlX3NldF9tYXNrLCBjb25zdCBjaGFyKiBmbXRfc3RyLCAuLi4pIHt9Ci0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIE1lc3NhZ2VMb29wOwotfSAgLy8gbmFtZXNwYWNlIGJhc2UKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciB1aW50OF90IGtVbnVzZWRUaW1lciA9IEJUQV9JRF9NQVg7Ci19ICAvLyBuYW1lc3BhY2UKLQotc3RydWN0IGFsYXJtX3QgewotICBhbGFybV90KGNvbnN0IGNoYXIqIG5hbWUpe307Ci0gIGludCBhbnlfdmFsdWU7Ci19OwotCi1jbGFzcyBCdGFEbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLmNsZWFyKCk7Ci0gICAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9uZXcuYm9keSA9IFtdKGNvbnN0IGNoYXIqIG5hbWUpIC0+IGFsYXJtX3QqIHsKLSAgICAgIHJldHVybiBuZXcgYWxhcm1fdChuYW1lKTsKLSAgICB9OwotICAgIHRlc3Q6Om1vY2s6Om9zaV9hbGFybTo6YWxhcm1fZnJlZS5ib2R5ID0gW10oYWxhcm1fdCogYWxhcm0pIHsKLSAgICAgIGRlbGV0ZSBhbGFybTsKLSAgICB9OwotCi0gICAgYnRhX2RtX2luaXRfY2IoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRBX0RNX05VTV9QTV9USU1FUjsgaSsrKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IEJUQV9ETV9QTV9NT0RFX1RJTUVSX01BWDsgaisrKSB7Ci0gICAgICAgIGJ0YV9kbV9jYi5wbV90aW1lcltpXS5zcnZjX2lkW2pdID0ga1VudXNlZFRpbWVyOwotICAgICAgfQotICAgIH0KLSAgfQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGJ0YV9kbV9kZWluaXRfY2IoKTsKLSAgICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX25ldyA9IHt9OwotICAgIHRlc3Q6Om1vY2s6Om9zaV9hbGFybTo6YWxhcm1fZnJlZSA9IHt9OwotICB9Ci19OwotCi1URVNUX0YoQnRhRG1UZXN0LCBub3ApIHsKLSAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICBBU1NFUlRfRVEodHJ1ZSwgc3RhdHVzKTsKLX0KLQotVEVTVF9GKEJ0YURtVGVzdCwgZGlzYWJsZV9ub19hY2xfbGlua3MpIHsKLSAgYnRhX2RtX2NiLmRpc2FibGluZyA9IHRydWU7Ci0KLSAgYWxhcm1fY2FsbGJhY2tfdCBhbGFybV9jYWxsYmFjazsKLSAgdm9pZCogYWxhcm1fZGF0YXtudWxscHRyfTsKLSAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9zZXRfb25fbWxvb3AuYm9keSA9Ci0gICAgICBbJmFsYXJtX2NhbGxiYWNrLCAmYWxhcm1fZGF0YV0oYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYXJtX2NhbGxiYWNrX3QgY2IsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoYWxhcm0gIT0gbnVsbHB0cik7Ci0gICAgICAgIGFsYXJtX2NhbGxiYWNrID0gY2I7Ci0gICAgICAgIGFsYXJtX2RhdGEgPSBkYXRhOwotICAgICAgfTsKLQotICBidGFfZG1fZGlzYWJsZSgpOyAgLy8gV2FpdGluZyBmb3IgYWxsIEFDTCBjb25uZWN0aW9ucyB0byBkcmFpbgotICBBU1NFUlRfRVEoMCwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImJ0bV9yZW1vdmVfYWNsIl0pOwotICBBU1NFUlRfRVEoMSwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImFsYXJtX3NldF9vbl9tbG9vcCJdKTsKLQotICAvLyBFeGVjdXRlIHRpbWVyIGNhbGxiYWNrCi0gIGFsYXJtX2NhbGxiYWNrKGFsYXJtX2RhdGEpOwotICBBU1NFUlRfRVEoMSwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImFsYXJtX3NldF9vbl9tbG9vcCJdKTsKLSAgQVNTRVJUX0VRKDAsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJCVElGX2RtX2Rpc2FibGUiXSk7Ci0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiZnV0dXJlX3JlYWR5Il0pOwotICBBU1NFUlRfVFJVRSghYnRhX2RtX2NiLmRpc2FibGluZyk7Ci0KLSAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9zZXRfb25fbWxvb3AgPSB7fTsKLX0KLQotVEVTVF9GKEJ0YURtVGVzdCwgZGlzYWJsZV9maXJzdF9wYXNzX3dpdGhfYWNsX2xpbmtzKSB7Ci0gIHVpbnQxNl90IGxpbmtzX3VwID0gMTsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fR2V0TnVtQWNsTGlua3MuYm9keSA9IFsmbGlua3NfdXBdKCkgewotICAgIHJldHVybiBsaW5rc191cDsKLSAgfTsKLSAgYnRhX2RtX2NiLmRpc2FibGluZyA9IHRydWU7Ci0gIC8vIEFDTCBsaW5rIGlzIG9wZW4KLSAgYnRhX2RtX2NiLmRldmljZV9saXN0LmNvdW50ID0gMTsKLQotICBhbGFybV9jYWxsYmFja190IGFsYXJtX2NhbGxiYWNrOwotICB2b2lkKiBhbGFybV9kYXRhe251bGxwdHJ9OwotICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX3NldF9vbl9tbG9vcC5ib2R5ID0KLSAgICAgIFsmYWxhcm1fY2FsbGJhY2ssICZhbGFybV9kYXRhXShhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YSkgewotICAgICAgICBBU1NFUlRfVFJVRShhbGFybSAhPSBudWxscHRyKTsKLSAgICAgICAgYWxhcm1fY2FsbGJhY2sgPSBjYjsKLSAgICAgICAgYWxhcm1fZGF0YSA9IGRhdGE7Ci0gICAgICB9OwotCi0gIGJ0YV9kbV9kaXNhYmxlKCk7ICAgICAgICAgICAgICAvLyBXYWl0aW5nIGZvciBhbGwgQUNMIGNvbm5lY3Rpb25zIHRvIGRyYWluCi0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYWxhcm1fc2V0X29uX21sb29wIl0pOwotICBBU1NFUlRfRVEoMCwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbIkJUSUZfZG1fZGlzYWJsZSJdKTsKLQotICBsaW5rc191cCA9IDA7Ci0gIC8vIEZpcnN0IGRpc2FibGUgcGFzcwotICBhbGFybV9jYWxsYmFjayhhbGFybV9kYXRhKTsKLSAgQVNTRVJUX0VRKDEsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJhbGFybV9zZXRfb25fbWxvb3AiXSk7Ci0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiQlRJRl9kbV9kaXNhYmxlIl0pOwotICBBU1NFUlRfVFJVRSghYnRhX2RtX2NiLmRpc2FibGluZyk7Ci0KLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fR2V0TnVtQWNsTGlua3MgPSB7fTsKLSAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9zZXRfb25fbWxvb3AgPSB7fTsKLX0KLQotVEVTVF9GKEJ0YURtVGVzdCwgZGlzYWJsZV9zZWNvbmRfcGFzc193aXRoX2FjbF9saW5rcykgewotICB1aW50MTZfdCBsaW5rc191cCA9IDE7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX0dldE51bUFjbExpbmtzLmJvZHkgPSBbJmxpbmtzX3VwXSgpIHsKLSAgICByZXR1cm4gbGlua3NfdXA7Ci0gIH07Ci0gIGJ0YV9kbV9jYi5kaXNhYmxpbmcgPSB0cnVlOwotICAvLyBBQ0wgbGluayBpcyBvcGVuCi0gIGJ0YV9kbV9jYi5kZXZpY2VfbGlzdC5jb3VudCA9IDE7Ci0KLSAgYWxhcm1fY2FsbGJhY2tfdCBhbGFybV9jYWxsYmFjazsKLSAgdm9pZCogYWxhcm1fZGF0YXtudWxscHRyfTsKLSAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9zZXRfb25fbWxvb3AuYm9keSA9Ci0gICAgICBbJmFsYXJtX2NhbGxiYWNrLCAmYWxhcm1fZGF0YV0oYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYXJtX2NhbGxiYWNrX3QgY2IsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoYWxhcm0gIT0gbnVsbHB0cik7Ci0gICAgICAgIGFsYXJtX2NhbGxiYWNrID0gY2I7Ci0gICAgICAgIGFsYXJtX2RhdGEgPSBkYXRhOwotICAgICAgfTsKLQotICBidGFfZG1fZGlzYWJsZSgpOyAgLy8gV2FpdGluZyBmb3IgYWxsIEFDTCBjb25uZWN0aW9ucyB0byBkcmFpbgotICBBU1NFUlRfRVEoMSwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImFsYXJtX3NldF9vbl9tbG9vcCJdKTsKLSAgQVNTRVJUX0VRKDAsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJCVElGX2RtX2Rpc2FibGUiXSk7Ci0KLSAgLy8gRmlyc3QgZGlzYWJsZSBwYXNzCi0gIGFsYXJtX2NhbGxiYWNrKGFsYXJtX2RhdGEpOwotICBBU1NFUlRfRVEoMiwgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImFsYXJtX3NldF9vbl9tbG9vcCJdKTsKLSAgQVNTRVJUX0VRKDAsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJCVElGX2RtX2Rpc2FibGUiXSk7Ci0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRtX3JlbW92ZV9hY2wiXSk7Ci0KLSAgLy8gU2Vjb25kIGRpc2FibGUgcGFzcwotICBhbGFybV9jYWxsYmFjayhhbGFybV9kYXRhKTsKLSAgQVNTRVJUX0VRKDEsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJCVElGX2RtX2Rpc2FibGUiXSk7Ci0gIEFTU0VSVF9UUlVFKCFidGFfZG1fY2IuZGlzYWJsaW5nKTsKLQotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9HZXROdW1BY2xMaW5rcyA9IHt9OwotICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX3NldF9vbl9tbG9vcCA9IHt9OwotfQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvYnRhX2dhdHRfdGVzdC5jYyBiL2J0YS90ZXN0L2J0YV9nYXR0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTliOWYuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvYnRhX2dhdHRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJidGEvZ2F0dC9idGFfZ2F0dGNfaW50LmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9nYXR0L2dhdHRfaW50LmgiCi0KLS8vIFRPRE8gcHV0IHRoaXMgaW4gY29tbW9uIHBsYWNlCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLW5hbWVzcGFjZSBwYXJhbSB7Ci1zdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCogdmFsdWU7Ci0gIHZvaWQqIGRhdGE7Ci19IGJ0YV9nYXR0X3JlYWRfY29tcGxldGVfY2FsbGJhY2s7Ci19ICAvLyBuYW1lc3BhY2UgcGFyYW0KLXZvaWQgYnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLmNvbm5faWQgPSBjb25uX2lkOwotICBwYXJhbTo6YnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjay5zdGF0dXMgPSBzdGF0dXM7Ci0gIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLmhhbmRsZSA9IGhhbmRsZTsKLSAgcGFyYW06OmJ0YV9nYXR0X3JlYWRfY29tcGxldGVfY2FsbGJhY2subGVuID0gbGVuOwotICBwYXJhbTo6YnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjay52YWx1ZSA9IHZhbHVlOwotICBwYXJhbTo6YnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjay5kYXRhID0gZGF0YTsKLX0KLQotbmFtZXNwYWNlIHBhcmFtIHsKLXN0cnVjdCB7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgbGVuOwotICBjb25zdCB1aW50OF90KiB2YWx1ZTsKLSAgdm9pZCogZGF0YTsKLX0gYnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2s7Ci19ICAvLyBuYW1lc3BhY2UgcGFyYW0KLQotdm9pZCBidGFfZ2F0dF93cml0ZV9jb21wbGV0ZV9jYWxsYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgcGFyYW06OmJ0YV9nYXR0X3dyaXRlX2NvbXBsZXRlX2NhbGxiYWNrLmNvbm5faWQgPSBjb25uX2lkOwotICBwYXJhbTo6YnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2suc3RhdHVzID0gc3RhdHVzOwotICBwYXJhbTo6YnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2suaGFuZGxlID0gaGFuZGxlOwotICBwYXJhbTo6YnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2subGVuID0gbGVuOwotICBwYXJhbTo6YnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2sudmFsdWUgPSB2YWx1ZTsKLSAgcGFyYW06OmJ0YV9nYXR0X3dyaXRlX2NvbXBsZXRlX2NhbGxiYWNrLmRhdGEgPSBkYXRhOwotfQotCi1uYW1lc3BhY2UgcGFyYW0gewotc3RydWN0IHsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgdm9pZCogZGF0YTsKLX0gYnRhX2dhdHRfY29uZmlndXJlX210dV9jb21wbGV0ZV9jYWxsYmFjazsKLX0gIC8vIG5hbWVzcGFjZSBwYXJhbQotCi12b2lkIGJ0YV9nYXR0X2NvbmZpZ3VyZV9tdHVfY29tcGxldGVfY2FsbGJhY2sodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB2b2lkKiBkYXRhKSB7Ci0gIHBhcmFtOjpidGFfZ2F0dF9jb25maWd1cmVfbXR1X2NvbXBsZXRlX2NhbGxiYWNrLmNvbm5faWQgPSBjb25uX2lkOwotICBwYXJhbTo6YnRhX2dhdHRfY29uZmlndXJlX210dV9jb21wbGV0ZV9jYWxsYmFjay5zdGF0dXMgPSBzdGF0dXM7Ci0gIHBhcmFtOjpidGFfZ2F0dF9jb25maWd1cmVfbXR1X2NvbXBsZXRlX2NhbGxiYWNrLmRhdGEgPSBkYXRhOwotfQotCi1uYW1lc3BhY2UgcGFyYW0gewotc3RydWN0IHsKLSAgdEJUQV9HQVRUQ19FVlQgZXZlbnQ7Ci0gIHRCVEFfR0FUVEMqIHBfZGF0YTsKLX0gYnRhX2dhdHRjX2V2ZW50X2NvbXBsZXRlX2NhbGxiYWNrOwotfSAgLy8gbmFtZXNwYWNlIHBhcmFtCi0KLXZvaWQgYnRhX2dhdHRjX2V2ZW50X2NvbXBsZXRlX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUQyogcF9kYXRhKSB7Ci0gIHBhcmFtOjpidGFfZ2F0dGNfZXZlbnRfY29tcGxldGVfY2FsbGJhY2suZXZlbnQgPSBldmVudDsKLSAgcGFyYW06OmJ0YV9nYXR0Y19ldmVudF9jb21wbGV0ZV9jYWxsYmFjay5wX2RhdGEgPSBwX2RhdGE7Ci19Ci0KLWNsYXNzIEJ0YUdhdHRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLmNsZWFyKCk7Ci0gICAgcGFyYW06OmJ0YV9nYXR0X3JlYWRfY29tcGxldGVfY2FsbGJhY2sgPSB7fTsKLSAgICBwYXJhbTo6YnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2sgPSB7fTsKLSAgICBwYXJhbTo6YnRhX2dhdHRfY29uZmlndXJlX210dV9jb21wbGV0ZV9jYWxsYmFjayA9IHt9OwotICAgIHBhcmFtOjpidGFfZ2F0dGNfZXZlbnRfY29tcGxldGVfY2FsbGJhY2sgPSB7fTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotCi0gIHRCVEFfR0FUVENfUkNCIGFwcF9jb250cm9sX2Jsb2NrID0gewotICAgICAgLnBfY2JhY2sgPSBidGFfZ2F0dGNfZXZlbnRfY29tcGxldGVfY2FsbGJhY2ssCi0gIH07Ci0KLSAgdEdBVFRfQ0xfQ09NUExFVEUgZ2F0dF9jbF9jb21wbGV0ZSA9IHsKLSAgICAgIC5hdHRfdmFsdWUgPQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLmNvbm5faWQgPSAxLAotICAgICAgICAgICAgICAuaGFuZGxlID0gMiwKLSAgICAgICAgICAgICAgLm9mZnNldCA9IDMsCi0gICAgICAgICAgICAgIC5hdXRoX3JlcSA9IEdBVFRfQVVUSF9SRVFfTk9ORSwKLSAgICAgICAgICAgICAgLnZhbHVlID0gezEwLCAxMSwgMTIsIDEzfSwKLSAgICAgICAgICAgICAgLmxlbiA9IDQsICAvLyBsZW5ndGggb2YgdmFsdWUgYWJvdmUKLSAgICAgICAgICB9LAotICB9OwotCi0gIHRCVEFfR0FUVENfU0VSViBzZXJ2aWNlX2NvbnRyb2xfYmxvY2sgPSB7Ci0gICAgICAubXR1ID0gNDU2LAotICB9OwotICB0QlRBX0dBVFRDX0RBVEEgY29tbWFuZF9xdWV1ZTsKLQotICB0QlRBX0dBVFRDX0NMQ0IgY2xpZW50X2NoYW5uZWxfY29udHJvbF9ibG9jayA9IHsKLSAgICAgIC5wX3FfY21kID0gJmNvbW1hbmRfcXVldWUsCi0gICAgICAucF9yY2IgPSAmYXBwX2NvbnRyb2xfYmxvY2ssCi0gICAgICAucF9zcmNiID0gJnNlcnZpY2VfY29udHJvbF9ibG9jaywKLSAgICAgIC5idGFfY29ubl9pZCA9IDQ1NiwKLSAgfTsKLX07Ci0KLVRFU1RfRihCdGFHYXR0VGVzdCwgYnRhX2dhdHRjX29wX2NtcGxfcmVhZCkgewotICBjb21tYW5kX3F1ZXVlID0gewotICAgICAgLmFwaV9yZWFkID0gIC8vIHRCVEFfR0FUVENfQVBJX1JFQUQKLSAgICAgIHsKLSAgICAgICAgICAuaGRyID0KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLmV2ZW50ID0gQlRBX0dBVFRDX0FQSV9SRUFEX0VWVCwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAuaGFuZGxlID0gMTIzLAotICAgICAgICAgIC5yZWFkX2NiID0gYnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjaywKLSAgICAgICAgICAucmVhZF9jYl9kYXRhID0gc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpLAotICAgICAgfSwKLSAgfTsKLQotICBjbGllbnRfY2hhbm5lbF9jb250cm9sX2Jsb2NrLnBfcV9jbWQgPSAmY29tbWFuZF9xdWV1ZTsKLQotICB0QlRBX0dBVFRDX0RBVEEgZGF0YSA9IHsKLSAgICAgIC5vcF9jbXBsID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5vcF9jb2RlID0gR0FUVENfT1BUWVBFX1JFQUQsCi0gICAgICAgICAgICAgIC5zdGF0dXMgPSBHQVRUX09VVF9PRl9SQU5HRSwKLSAgICAgICAgICAgICAgLnBfY21wbCA9ICZnYXR0X2NsX2NvbXBsZXRlLAotICAgICAgICAgIH0sCi0gIH07Ci0KLSAgYnRhX2dhdHRjX29wX2NtcGwoJmNsaWVudF9jaGFubmVsX2NvbnRyb2xfYmxvY2ssICZkYXRhKTsKLSAgQVNTRVJUX0VRKDEsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJvc2lfZnJlZV9hbmRfcmVzZXQiXSk7Ci0gIEFTU0VSVF9FUSg0NTYsIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLmNvbm5faWQpOwotICBBU1NFUlRfRVEoR0FUVF9PVVRfT0ZfUkFOR0UsIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLnN0YXR1cyk7Ci0gIEFTU0VSVF9FUSgxMjMsIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLmhhbmRsZSk7Ci0gIEFTU0VSVF9FUSg0LCBwYXJhbTo6YnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjay5sZW4pOwotICBBU1NFUlRfRVEoMTAsIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLnZhbHVlWzBdKTsKLSAgQVNTRVJUX0VRKHRoaXMsIHBhcmFtOjpidGFfZ2F0dF9yZWFkX2NvbXBsZXRlX2NhbGxiYWNrLmRhdGEpOwotfQotCi1URVNUX0YoQnRhR2F0dFRlc3QsIGJ0YV9nYXR0Y19vcF9jbXBsX3dyaXRlKSB7Ci0gIGNvbW1hbmRfcXVldWUgPSB7Ci0gICAgICAuYXBpX3dyaXRlID0gIC8vIHRCVEFfR0FUVENfQVBJX1dSSVRFCi0gICAgICB7Ci0gICAgICAgICAgLmhkciA9Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC5ldmVudCA9IEJUQV9HQVRUQ19BUElfV1JJVEVfRVZULAotICAgICAgICAgICAgICB9LAotICAgICAgICAgIC5oYW5kbGUgPSAxMjMsCi0gICAgICAgICAgLndyaXRlX2NiID0gYnRhX2dhdHRfd3JpdGVfY29tcGxldGVfY2FsbGJhY2ssCi0gICAgICAgICAgLndyaXRlX2NiX2RhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcyksCi0gICAgICB9LAotICB9OwotCi0gIGNsaWVudF9jaGFubmVsX2NvbnRyb2xfYmxvY2sucF9xX2NtZCA9ICZjb21tYW5kX3F1ZXVlOwotCi0gIHRCVEFfR0FUVENfREFUQSBkYXRhID0gewotICAgICAgLm9wX2NtcGwgPQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLm9wX2NvZGUgPSBHQVRUQ19PUFRZUEVfV1JJVEUsCi0gICAgICAgICAgICAgIC5zdGF0dXMgPSBHQVRUX09VVF9PRl9SQU5HRSwKLSAgICAgICAgICAgICAgLnBfY21wbCA9ICZnYXR0X2NsX2NvbXBsZXRlLAotICAgICAgICAgIH0sCi0gIH07Ci0KLSAgYnRhX2dhdHRjX29wX2NtcGwoJmNsaWVudF9jaGFubmVsX2NvbnRyb2xfYmxvY2ssICZkYXRhKTsKLSAgQVNTRVJUX0VRKDEsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJvc2lfZnJlZV9hbmRfcmVzZXQiXSk7Ci0gIEFTU0VSVF9FUSg0NTYsIHBhcmFtOjpidGFfZ2F0dF93cml0ZV9jb21wbGV0ZV9jYWxsYmFjay5jb25uX2lkKTsKLSAgQVNTRVJUX0VRKDIsIHBhcmFtOjpidGFfZ2F0dF93cml0ZV9jb21wbGV0ZV9jYWxsYmFjay5oYW5kbGUpOwotICBBU1NFUlRfRVEoR0FUVF9PVVRfT0ZfUkFOR0UsIHBhcmFtOjpidGFfZ2F0dF93cml0ZV9jb21wbGV0ZV9jYWxsYmFjay5zdGF0dXMpOwotICBBU1NFUlRfRVEodGhpcywgcGFyYW06OmJ0YV9nYXR0X3dyaXRlX2NvbXBsZXRlX2NhbGxiYWNrLmRhdGEpOwotfQotCi1URVNUX0YoQnRhR2F0dFRlc3QsIGJ0YV9nYXR0Y19vcF9jbXBsX2NvbmZpZykgewotICBjb21tYW5kX3F1ZXVlID0gewotICAgICAgLmFwaV9tdHUgPSAgLy8gdEJUQV9HQVRUQ19BUElfQ0ZHX01UVQotICAgICAgewotICAgICAgICAgIC5oZHIgPQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAuZXZlbnQgPSBCVEFfR0FUVENfQVBJX0NGR19NVFVfRVZULAotICAgICAgICAgICAgICB9LAotICAgICAgICAgIC5tdHVfY2IgPSBidGFfZ2F0dF9jb25maWd1cmVfbXR1X2NvbXBsZXRlX2NhbGxiYWNrLAotICAgICAgICAgIC5tdHVfY2JfZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSwKLSAgICAgIH0sCi0gIH07Ci0KLSAgY2xpZW50X2NoYW5uZWxfY29udHJvbF9ibG9jay5wX3FfY21kID0gJmNvbW1hbmRfcXVldWU7Ci0KLSAgdEJUQV9HQVRUQ19EQVRBIGRhdGEgPSB7Ci0gICAgICAub3BfY21wbCA9Ci0gICAgICAgICAgewotICAgICAgICAgICAgICAub3BfY29kZSA9IEdBVFRDX09QVFlQRV9DT05GSUcsCi0gICAgICAgICAgICAgIC5zdGF0dXMgPSBHQVRUX1BSQ19JTl9QUk9HUkVTUywKLSAgICAgICAgICB9LAotICB9OwotCi0gIGJ0YV9nYXR0Y19vcF9jbXBsKCZjbGllbnRfY2hhbm5lbF9jb250cm9sX2Jsb2NrLCAmZGF0YSk7Ci0gIEFTU0VSVF9FUSgxLCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsib3NpX2ZyZWVfYW5kX3Jlc2V0Il0pOwotICBBU1NFUlRfRVEoNDU2LCBwYXJhbTo6YnRhX2dhdHRfY29uZmlndXJlX210dV9jb21wbGV0ZV9jYWxsYmFjay5jb25uX2lkKTsKLQotICBBU1NFUlRfRVEoR0FUVF9QUkNfSU5fUFJPR1JFU1MsCi0gICAgICAgICAgICBwYXJhbTo6YnRhX2dhdHRfY29uZmlndXJlX210dV9jb21wbGV0ZV9jYWxsYmFjay5zdGF0dXMpOwotICBBU1NFUlRfRVEodGhpcywgcGFyYW06OmJ0YV9nYXR0X2NvbmZpZ3VyZV9tdHVfY29tcGxldGVfY2FsbGJhY2suZGF0YSk7Ci19Ci0KLVRFU1RfRihCdGFHYXR0VGVzdCwgYnRhX2dhdHRjX29wX2NtcGxfZXhlY3V0ZSkgewotICBjb21tYW5kX3F1ZXVlID0gewotICAgICAgLmFwaV9leGVjID0gIC8vIHRCVEFfR0FUVENfQVBJX0VYRUMKLSAgICAgIHsKLSAgICAgICAgICAuaGRyID0KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLmV2ZW50ID0gQlRBX0dBVFRDX0FQSV9FWEVDX0VWVCwKLSAgICAgICAgICAgICAgfSwKLSAgICAgIH0sCi0gIH07Ci0KLSAgY2xpZW50X2NoYW5uZWxfY29udHJvbF9ibG9jay5wX3FfY21kID0gJmNvbW1hbmRfcXVldWU7Ci0KLSAgdEJUQV9HQVRUQ19EQVRBIGRhdGEgPSB7Ci0gICAgICAub3BfY21wbCA9Ci0gICAgICAgICAgewotICAgICAgICAgICAgICAub3BfY29kZSA9IEdBVFRDX09QVFlQRV9FWEVfV1JJVEUsCi0gICAgICAgICAgfSwKLSAgfTsKLQotICBidGFfZ2F0dGNfb3BfY21wbCgmY2xpZW50X2NoYW5uZWxfY29udHJvbF9ibG9jaywgJmRhdGEpOwotICBBU1NFUlRfRVEoQlRBX0dBVFRDX0VYRUNfRVZULCBwYXJhbTo6YnRhX2dhdHRjX2V2ZW50X2NvbXBsZXRlX2NhbGxiYWNrLmV2ZW50KTsKLSAgQVNTRVJUX0VRKDEsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJvc2lfZnJlZV9hbmRfcmVzZXQiXSk7Ci19Ci0KLVRFU1RfRihCdGFHYXR0VGVzdCwgYnRhX2dhdHRjX29wX2NtcGxfcmVhZF9pbnRlcnJ1cHRlZCkgewotICBjb21tYW5kX3F1ZXVlID0gewotICAgICAgLmFwaV9yZWFkID0gIC8vIHRCVEFfR0FUVENfQVBJX1JFQUQKLSAgICAgIHsKLSAgICAgICAgICAuaGRyID0KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLmV2ZW50ID0gQlRBX0dBVFRDX0FQSV9SRUFEX0VWVCwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAuaGFuZGxlID0gMTIzLAotICAgICAgICAgIC5yZWFkX2NiID0gYnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjaywKLSAgICAgICAgICAucmVhZF9jYl9kYXRhID0gc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpLAotICAgICAgfSwKLSAgfTsKLQotICBjbGllbnRfY2hhbm5lbF9jb250cm9sX2Jsb2NrLnBfcV9jbWQgPSAmY29tbWFuZF9xdWV1ZTsKLQotICAvLyBDcmVhdGUgaW50ZXJydXB0IGNvbmRpdGlvbgotICBjbGllbnRfY2hhbm5lbF9jb250cm9sX2Jsb2NrLmF1dG9fdXBkYXRlID0gQlRBX0dBVFRDX0RJU0NfV0FJVElORzsKLSAgY2xpZW50X2NoYW5uZWxfY29udHJvbF9ibG9jay5wX3NyY2ItPnNydmNfaGRsX2NoZyA9IDE7Ci0KLSAgdEJUQV9HQVRUQ19EQVRBIGRhdGEgPSB7Ci0gICAgICAub3BfY21wbCA9Ci0gICAgICAgICAgewotICAgICAgICAgICAgICAub3BfY29kZSA9IEdBVFRDX09QVFlQRV9SRUFELAotICAgICAgICAgICAgICAuc3RhdHVzID0gR0FUVF9PVVRfT0ZfUkFOR0UsCi0gICAgICAgICAgICAgIC5wX2NtcGwgPSAmZ2F0dF9jbF9jb21wbGV0ZSwKLSAgICAgICAgICB9LAotICB9OwotCi0gIGJ0YV9nYXR0Y19vcF9jbXBsKCZjbGllbnRfY2hhbm5lbF9jb250cm9sX2Jsb2NrLCAmZGF0YSk7Ci0gIEFTU0VSVF9FUShHQVRUX0VSUk9SLCBwYXJhbTo6YnRhX2dhdHRfcmVhZF9jb21wbGV0ZV9jYWxsYmFjay5zdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvYnRhX2hmX2NsaWVudF9hZGRfcmVjb3JkX3Rlc3QuY2MgYi9idGEvdGVzdC9idGFfaGZfY2xpZW50X2FkZF9yZWNvcmRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1MGNjMC4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9idGFfaGZfY2xpZW50X2FkZF9yZWNvcmRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3NkcC5jYyIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvc3JjL2J0aWZfaGZfY2xpZW50LmNjIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLXN0YXRpYyB1aW50MTZfdCBnVmVyc2lvbjsKLQotLy8gRGVmaW5lIGFwcGxfdHJhY2VfbGV2ZWwgZXZlbiB0aG91Z2ggTG9nTXNnIGlzIHRyaXZpYWwuICBUaGlzIGlzIHJlcXVpcmVkIHdoZW4KLS8vIGNvdmVyYWdlIGlzIGVuYWJsZWQgYmVjYXVzZSB0aGUgY29tcGlsZXIgaXMgdW5hYmxlIHRvIGVsaW1pbmF0ZSB0aGUgYGlmYAotLy8gY2hlY2tzIGFnYWluc3QgYXBwbF90cmFjZV9sZXZlbCBpbiBBUFBMX1RSQUNFXyogbWFjcm9zLgotdWludDhfdCBhcHBsX3RyYWNlX2xldmVsID0gMDsKLXZvaWQgTG9nTXNnKHVpbnQzMl90IHRyYWNlX3NldF9tYXNrLCBjb25zdCBjaGFyKiBmbXRfc3RyLCAuLi4pIHt9Ci1ib29sIFNEUF9BZGRQcm90b2NvbExpc3QodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1BST1RPQ09MX0VMRU0qIHBfZWxlbV9saXN0KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9zZXJ2aWNlX3V1aWRzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFByb2ZpbGVEZXNjcmlwdG9yTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IHByb2ZpbGVfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uKSB7Ci0gIGdWZXJzaW9uID0gdmVyc2lvbjsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBTRFBfQWRkQXR0cmlidXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9pZCwgdWludDhfdCBhdHRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXR0cl9sZW4sIHVpbnQ4X3QqIHBfdmFsKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFV1aWRTZXF1ZW5jZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IGF0dHJfaWQsIHVpbnQxNl90IG51bV91dWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF91dWlkcykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNsYXNzIEJ0YUhmQ2xpZW50QWRkUmVjb3JkVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBnVmVyc2lvbiA9IDA7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUge30KLX07Ci0KLVRFU1RfRihCdGFIZkNsaWVudEFkZFJlY29yZFRlc3QsIHRlc3RfaGZfY2xpZW50X2FkZF9yZWNvcmQpIHsKLSAgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlcyA9IEJUSUZfSEZfQ0xJRU5UX0ZFQVRVUkVTOwotICB1aW50MzJfdCBzZHBfaGFuZGxlID0gMDsKLSAgdWludDhfdCBzY24gPSAwOwotCi0gIGJ0YV9oZl9jbGllbnRfYWRkX3JlY29yZCgiSGFuZHNmcmVlIiwgc2NuLCBmZWF0dXJlcywgc2RwX2hhbmRsZSk7Ci0gIEFTU0VSVF9FUShnVmVyc2lvbiwgQlRBX0hGUF9WRVJTSU9OKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvYnRhX2hmX2NsaWVudF90ZXN0LmNjIGIvYnRhL3Rlc3QvYnRhX2hmX2NsaWVudF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmE2NjlkLi4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2J0YV9oZl9jbGllbnRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmFzZSB7Ci1jbGFzcyBNZXNzYWdlTG9vcDsKLX0gIC8vIG5hbWVzcGFjZSBiYXNlCi0KLWJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogZ2V0X21haW5fdGhyZWFkKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotCi1uYW1lc3BhY2UgewotY29uc3QgUmF3QWRkcmVzcyBiZGFkZHIxKHsweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2fSk7Ci1jb25zdCBSYXdBZGRyZXNzIGJkYWRkcjIoezB4NjYsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTF9KTsKLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBUT0RPKGpwYXdsb3dza2kpOiB0aGVyZSBpcyBzb21lIHdlaXJkIGRlcGVuZGVuY3kgaXNzdWUgaW4gdGVzdHMsIGFuZCB0aGUKLS8vIHRlc3RzIGhlcmUgZmFpbCB0byBjb21waWxlIHdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLgotdm9pZCBMb2dNc2codWludDMyX3QgdHJhY2Vfc2V0X21hc2ssIGNvbnN0IGNoYXIqIGZtdF9zdHIsIC4uLikge30KLQotY2xhc3MgQnRhSGZDbGllbnRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAvLyBSZXNldCB0aGUgbWVtb3J5IGJsb2NrLCB0aGlzIGlzIHRoZSBzdGF0ZSBvbiB3aGljaCB0aGUgYWxsb2NhdGUgaGFuZGxlCi0gICAgLy8gd291bGQgc3RhcnQgb3BlcmF0aW5nCi0gICAgYnRhX2hmX2NsaWVudF9jYl9hcnJfaW5pdCgpOwotICB9Ci19OwotCi0vLyBUZXN0IHRoYXQgd2hlbiB3ZSBjYW4gYWxsb2NhdGUgYSBkZXZpY2Ugb24gdGhlIGJsb2NrIGFuZCB0aGVuIGNoZWNrCi0vLyB0aGUgc3RhdHVzIG9mIHRoZSBibG9ja3MKLVRFU1RfRihCdGFIZkNsaWVudFRlc3QsIHRlc3RfYWxsb2NhdGVfYmxvY2tfb25lX2RldmljZSkgewotICB1aW50MTZfdCBwX2hhbmRsZSA9IDA7Ci0gIGJvb2wgc3RhdHVzID0gYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUoYmRhZGRyMSwgJnBfaGFuZGxlKTsKLQotICAvLyBBbGxvY2F0aW9uIHNob3VsZCBzdWNjZWVkCi0gIEVYUEVDVF9FUSh0cnVlLCBzdGF0dXMpOwotICBFWFBFQ1RfR1QocF9oYW5kbGUsIDApOwotfQotCi0vLyBUZXN0IHRoYXQgd2UgY2Fubm90IGFsbG9jYXRlIHRoZSBzYW1lIGRldmljZSBvbiB0d28gc2VwYXJhdGUgY29udHJvbCBibG9ja3MKLVRFU1RfRihCdGFIZkNsaWVudFRlc3QsIHRlc3Rfbm9fYWxsb2NhdGVfYmxvY2tfc2FtZV9kZXZpY2UpIHsKLSAgdWludDE2X3QgcF9oYW5kbGU7Ci0gIGJvb2wgc3RhdHVzID0gYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUoYmRhZGRyMSwgJnBfaGFuZGxlKTsKLQotICAvLyBBbGxvY2F0aW9uIHNob3VsZCBzdWNjZWVkCi0gIEVYUEVDVF9FUSh0cnVlLCBzdGF0dXMpOwotICBFWFBFQ1RfR1QocF9oYW5kbGUsIDApOwotCi0gIEVYUEVDVF9UUlVFKGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9iZGEoYmRhZGRyMSkgIT0gTlVMTCk7Ci0KLSAgc3RhdHVzID0gYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUoYmRhZGRyMSwgJnBfaGFuZGxlKTsKLQotICAvLyBBbGxvY2F0aW9uIHNob3VsZCBmYWlsCi0gIEVYUEVDVF9FUShmYWxzZSwgc3RhdHVzKTsKLX0KLQotLy8gVGVzdCB0aGF0IHdlIGNhbiBhbGxvY2F0ZSB0d28gZGlmZmVyZW50IGRldmljZXMgYXMgc2VwYXJhdGUgY29udHJvbCBibG9ja3MKLVRFU1RfRihCdGFIZkNsaWVudFRlc3QsIHRlc3RfYWxsb2NhdGVfYmxvY2tfZGlmZl9kZXZpY2UpIHsKLSAgdWludDE2X3QgcF9oYW5kbGVfZmlyc3Q7Ci0gIGJvb2wgc3RhdHVzID0gYnRhX2hmX2NsaWVudF9hbGxvY2F0ZV9oYW5kbGUoYmRhZGRyMSwgJnBfaGFuZGxlX2ZpcnN0KTsKLQotICAvLyBBbGxvY2F0aW9uIHNob3VsZCBzdWNjZWVkCi0gIEVYUEVDVF9FUSh0cnVlLCBzdGF0dXMpOwotICBFWFBFQ1RfR1QocF9oYW5kbGVfZmlyc3QsIDApOwotCi0gIEVYUEVDVF9UUlVFKGJ0YV9oZl9jbGllbnRfZmluZF9jYl9ieV9iZGEoYmRhZGRyMikgPT0gTlVMTCk7Ci0KLSAgdWludDE2X3QgcF9oYW5kbGVfc2Vjb25kOwotICBzdGF0dXMgPSBidGFfaGZfY2xpZW50X2FsbG9jYXRlX2hhbmRsZShiZGFkZHIyLCAmcF9oYW5kbGVfc2Vjb25kKTsKLQotICAvLyBBbGxvY2F0aW9uIHNob3VsZCBzdWNjZWVkCi0gIEVYUEVDVF9FUSh0cnVlLCBzdGF0dXMpOwotICBFWFBFQ1RfR1QocF9oYW5kbGVfc2Vjb25kLCAwKTsKLSAgRVhQRUNUX05FKHBfaGFuZGxlX2ZpcnN0LCBwX2hhbmRsZV9zZWNvbmQpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvYnRhX3Bhbl90ZXN0LmNjIGIvYnRhL3Rlc3QvYnRhX3Bhbl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWEwODVlLi4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2J0YV9wYW5fdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0YS9wYW4vYnRhX3Bhbl9pbnQuaCIKLQotLy8gVE9ETyBwdXQgdGhpcyBpbiBjb21tb24gcGxhY2UKLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotY2xhc3MgQnRhUGFuVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHt9Ci19OwotCi1URVNUX0YoQnRhUGFuVGVzdCwgbm9wKSB7fQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL2J0YV9kbV9hcGlfbW9jay5jYyBiL2J0YS90ZXN0L2NvbW1vbi9idGFfZG1fYXBpX21vY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODk5MjAuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvY29tbW9uL2J0YV9kbV9hcGlfbW9jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJidGFfZG1fYXBpX21vY2suaCIKLQotc3RhdGljIGRtOjpNb2NrQnRhRG1JbnRlcmZhY2UqIGRtX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0KLXZvaWQgZG06OlNldE1vY2tCdGFEbUludGVyZmFjZShNb2NrQnRhRG1JbnRlcmZhY2UqIG1vY2tfYnRhX2RtX2ludGVyZmFjZSkgewotICBkbV9pbnRlcmZhY2UgPSBtb2NrX2J0YV9kbV9pbnRlcmZhY2U7Ci19Ci0KLXZvaWQgQlRBX0RtQmxlU2Nhbihib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uKSB7Ci0gIExPR19BU1NFUlQoZG1faW50ZXJmYWNlKSA8PCAiTW9jayBCVEEgRE0gaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGRtX2ludGVyZmFjZS0+QlRBX0RtQmxlU2NhbihzdGFydCwgZHVyYXRpb24pOwotfQotCi12b2lkIEJUQV9EbUJsZUNzaXNPYnNlcnZlKGJvb2wgb2JzZXJ2ZSwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYikgewotICBMT0dfQVNTRVJUKGRtX2ludGVyZmFjZSkgPDwgIk1vY2sgQlRBIERNIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBkbV9pbnRlcmZhY2UtPkJUQV9EbUJsZUNzaXNPYnNlcnZlKG9ic2VydmUsIHBfcmVzdWx0c19jYik7Ci19CmRpZmYgLS1naXQgYS9idGEvdGVzdC9jb21tb24vYnRhX2RtX2FwaV9tb2NrLmggYi9idGEvdGVzdC9jb21tb24vYnRhX2RtX2FwaV9tb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzlhYTcuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvY29tbW9uL2J0YV9kbV9hcGlfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2RtX2FwaS5oIgotCi1uYW1lc3BhY2UgZG0gewotCi1jbGFzcyBCdGFEbUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQlRBX0RtQmxlU2Nhbihib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBCVEFfRG1CbGVDc2lzT2JzZXJ2ZShib29sIG9ic2VydmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9yZXN1bHRzX2NiKSA9IDA7Ci0gIHZpcnR1YWwgfkJ0YURtSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgTW9ja0J0YURtSW50ZXJmYWNlIDogcHVibGljIEJ0YURtSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQlRBX0RtQmxlU2NhbiwgKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24pKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBCVEFfRG1CbGVDc2lzT2JzZXJ2ZSwKLSAgICAgICAgICAgICAgKGJvb2wgb2JzZXJ2ZSwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYikpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrQnRhRG1JbnRlcmZhY2V9IGZvciB0ZXN0aW5nCi0gKgotICogQHBhcmFtIG1vY2tfYnRhX2RtX2ludGVyZmFjZSBwb2ludGVyIHRvIG1vY2sgYnRhIGRtIGludGVyZmFjZSwKLSAqIGNvdWxkIGJlIG51bGwKLSAqLwotdm9pZCBTZXRNb2NrQnRhRG1JbnRlcmZhY2UoTW9ja0J0YURtSW50ZXJmYWNlKiBtb2NrX2J0YV9kbV9pbnRlcmZhY2UpOwotCi19ICAvLyBuYW1lc3BhY2UgZG0KZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2NvbW1vbi9idGFfZ2F0dF9hcGlfbW9jay5jYyBiL2J0YS90ZXN0L2NvbW1vbi9idGFfZ2F0dF9hcGlfbW9jay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5MWU2Zi4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfYXBpX21vY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaV9tb2NrLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0YXRpYyBnYXR0OjpNb2NrQnRhR2F0dEludGVyZmFjZSogZ2F0dF9pbnRlcmZhY2UgPSBudWxscHRyOwotCi12b2lkIGdhdHQ6OlNldE1vY2tCdGFHYXR0SW50ZXJmYWNlKAotICAgIE1vY2tCdGFHYXR0SW50ZXJmYWNlKiBtb2NrX2J0YV9nYXR0X2ludGVyZmFjZSkgewotICBnYXR0X2ludGVyZmFjZSA9IG1vY2tfYnRhX2dhdHRfaW50ZXJmYWNlOwotfQotCi12b2lkIEJUQV9HQVRUQ19BcHBSZWdpc3Rlcih0QlRBX0dBVFRDX0NCQUNLKiBwX2NsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgY2IsIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIExPR19BU1NFUlQoZ2F0dF9pbnRlcmZhY2UpIDw8ICJNb2NrIEdBVFQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgZ2F0dF9pbnRlcmZhY2UtPkFwcFJlZ2lzdGVyKHBfY2xpZW50X2NiLCBjYiwgZWF0dF9zdXBwb3J0KTsKLX0KLQotdm9pZCBCVEFfR0FUVENfQXBwRGVyZWdpc3Rlcih0R0FUVF9JRiBjbGllbnRfaWYpIHsKLSAgTE9HX0FTU0VSVChnYXR0X2ludGVyZmFjZSkgPDwgIk1vY2sgR0FUVCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBnYXR0X2ludGVyZmFjZS0+QXBwRGVyZWdpc3RlcihjbGllbnRfaWYpOwotfQotCi12b2lkIEJUQV9HQVRUQ19PcGVuKHRHQVRUX0lGIGNsaWVudF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7Ci0gIExPR19BU1NFUlQoZ2F0dF9pbnRlcmZhY2UpIDw8ICJNb2NrIEdBVFQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgZ2F0dF9pbnRlcmZhY2UtPk9wZW4oY2xpZW50X2lmLCByZW1vdGVfYmRhLCBpc19kaXJlY3QsIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pc3RpYywgaW5pdGlhdGluZ19waHlzKTsKLX0KLQotdm9pZCBCVEFfR0FUVENfT3Blbih0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCBib29sIG9wcG9ydHVuaXN0aWMpIHsKLSAgTE9HX0FTU0VSVChnYXR0X2ludGVyZmFjZSkgPDwgIk1vY2sgR0FUVCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBnYXR0X2ludGVyZmFjZS0+T3BlbihjbGllbnRfaWYsIHJlbW90ZV9iZGEsIGlzX2RpcmVjdCwgb3Bwb3J0dW5pc3RpYyk7Ci19Ci0KLXZvaWQgQlRBX0dBVFRDX0NhbmNlbE9wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCkgewotICBMT0dfQVNTRVJUKGdhdHRfaW50ZXJmYWNlKSA8PCAiTW9jayBHQVRUIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIGdhdHRfaW50ZXJmYWNlLT5DYW5jZWxPcGVuKGNsaWVudF9pZiwgcmVtb3RlX2JkYSwgaXNfZGlyZWN0KTsKLX0KLQotdm9pZCBCVEFfR0FUVENfQ2xvc2UodWludDE2X3QgY29ubl9pZCkgewotICBMT0dfQVNTRVJUKGdhdHRfaW50ZXJmYWNlKSA8PCAiTW9jayBHQVRUIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIGdhdHRfaW50ZXJmYWNlLT5DbG9zZShjb25uX2lkKTsKLX0KLQotdm9pZCBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF9zcnZjX3V1aWQpIHsKLSAgTE9HX0FTU0VSVChnYXR0X2ludGVyZmFjZSkgPDwgIk1vY2sgR0FUVCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBnYXR0X2ludGVyZmFjZS0+U2VydmljZVNlYXJjaFJlcXVlc3QoY29ubl9pZCwgcF9zcnZjX3V1aWQpOwotfQotCi12b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBjaWQpIHsKLSAgTE9HX0FTU0VSVChnYXR0X2ludGVyZmFjZSkgPDwgIk1vY2sgR0FUVCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBnYXR0X2ludGVyZmFjZS0+U2VuZEluZENvbmZpcm0oY29ubl9pZCwgY2lkKTsKLX0KLQotY29uc3Qgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+KiBCVEFfR0FUVENfR2V0U2VydmljZXModWludDE2X3QgY29ubl9pZCkgewotICBMT0dfQVNTRVJUKGdhdHRfaW50ZXJmYWNlKSA8PCAiTW9jayBHQVRUIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBnYXR0X2ludGVyZmFjZS0+R2V0U2VydmljZXMoY29ubl9pZCk7Ci19Ci0KLWNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIExPR19BU1NFUlQoZ2F0dF9pbnRlcmZhY2UpIDw8ICJNb2NrIEdBVFQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGdhdHRfaW50ZXJmYWNlLT5HZXRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBoYW5kbGUpOwotfQotCi1jb25zdCBnYXR0OjpTZXJ2aWNlKiBCVEFfR0FUVENfR2V0T3duaW5nU2VydmljZSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIExPR19BU1NFUlQoZ2F0dF9pbnRlcmZhY2UpIDw8ICJNb2NrIEdBVFQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGdhdHRfaW50ZXJmYWNlLT5HZXRPd25pbmdTZXJ2aWNlKGNvbm5faWQsIGhhbmRsZSk7Ci19Ci0KLXRHQVRUX1NUQVRVUyBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIHsKLSAgTE9HX0FTU0VSVChnYXR0X2ludGVyZmFjZSkgPDwgIk1vY2sgR0FUVCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gZ2F0dF9pbnRlcmZhY2UtPlJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhjbGllbnRfaWYsIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7Ci19Ci0KLXRHQVRUX1NUQVRVUyBCVEFfR0FUVENfRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnModEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIHsKLSAgTE9HX0FTU0VSVChnYXR0X2ludGVyZmFjZSkgPDwgIk1vY2sgR0FUVCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gZ2F0dF9pbnRlcmZhY2UtPkRlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGNsaWVudF9pZiwgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL2J0YV9nYXR0X2FwaV9tb2NrLmggYi9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfYXBpX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkYWRiOS4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfYXBpX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGdhdHQgewotCi1jbGFzcyBCdGFHYXR0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBBcHBSZWdpc3Rlcih0QlRBX0dBVFRDX0NCQUNLKiBwX2NsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgY2IsIGJvb2wgZWF0dF9zdXBwb3J0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBcHBEZXJlZ2lzdGVyKHRHQVRUX0lGIGNsaWVudF9pZikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT3Blbih0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBvcHBvcnR1bmlzdGljLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluaXRpYXRpbmdfcGh5cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT3Blbih0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCBib29sIG9wcG9ydHVuaXN0aWMpID0gMDsKLSAgdmlydHVhbCB2b2lkIENhbmNlbE9wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ2xvc2UodWludDE2X3QgY29ubl9pZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2VydmljZVNlYXJjaFJlcXVlc3QodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF9zcnZjX3V1aWQpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNlbmRJbmRDb25maXJtKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNpZCkgPSAwOwotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6bGlzdDxTZXJ2aWNlPiogR2V0U2VydmljZXModWludDE2X3QgY29ubl9pZCkgPSAwOwotICB2aXJ0dWFsIGNvbnN0IENoYXJhY3RlcmlzdGljKiBHZXRDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpID0gMDsKLSAgdmlydHVhbCBjb25zdCBTZXJ2aWNlKiBHZXRPd25pbmdTZXJ2aWNlKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpID0gMDsKLSAgdmlydHVhbCB0R0FUVF9TVEFUVVMgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKHRHQVRUX0lGIGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpID0gMDsKLSAgdmlydHVhbCB0R0FUVF9TVEFUVVMgRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnModEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpID0gMDsKLSAgdmlydHVhbCB+QnRhR2F0dEludGVyZmFjZSgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIE1vY2tCdGFHYXR0SW50ZXJmYWNlIDogcHVibGljIEJ0YUdhdHRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBBcHBSZWdpc3RlciwKLSAgICAgICAgICAgICAgKHRCVEFfR0FUVENfQ0JBQ0sgKiBwX2NsaWVudF9jYiwgQnRhQXBwUmVnaXN0ZXJDYWxsYmFjayBjYiwKLSAgICAgICAgICAgICAgIGJvb2wgZWF0dF9zdXBwb3J0KSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQXBwRGVyZWdpc3RlciwgKHRHQVRUX0lGIGNsaWVudF9pZiksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9wZW4sCi0gICAgICAgICAgICAgICh0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgb3Bwb3J0dW5pc3RpYywKLSAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT3BlbiwKLSAgICAgICAgICAgICAgKHRHQVRUX0lGIGNsaWVudF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgYm9vbCBpc19kaXJlY3QsCi0gICAgICAgICAgICAgICBib29sIG9wcG9ydHVuaXN0aWMpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDYW5jZWxPcGVuLAotICAgICAgICAgICAgICAodEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDbG9zZSwgKHVpbnQxNl90IGNvbm5faWQpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTZXJ2aWNlU2VhcmNoUmVxdWVzdCwKLSAgICAgICAgICAgICAgKHVpbnQxNl90IGNvbm5faWQsIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF9zcnZjX3V1aWQpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTZW5kSW5kQ29uZmlybSwgKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNpZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoc3RkOjpsaXN0PFNlcnZpY2U+KiksIEdldFNlcnZpY2VzLCAodWludDE2X3QgY29ubl9pZCkpOwotICBNT0NLX01FVEhPRCgoY29uc3QgQ2hhcmFjdGVyaXN0aWMqKSwgR2V0Q2hhcmFjdGVyaXN0aWMsCi0gICAgICAgICAgICAgICh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUpKTsKLSAgTU9DS19NRVRIT0QoKGNvbnN0IFNlcnZpY2UqKSwgR2V0T3duaW5nU2VydmljZSwKLSAgICAgICAgICAgICAgKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSkpOwotICBNT0NLX01FVEhPRCgodEdBVFRfU1RBVFVTKSwgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zLAotICAgICAgICAgICAgICAodEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh0R0FUVF9TVEFUVVMpLCBEZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucywKLSAgICAgICAgICAgICAgKHRHQVRUX0lGIGNsaWVudF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrQnRhR2F0dEludGVyZmFjZX0gZm9yIHRlc3RpbmcKLSAqCi0gKiBAcGFyYW0gbW9ja19idGFfZ2F0dF9pbnRlcmZhY2UgcG9pbnRlciB0byBtb2NrIGJ0YSBnYXR0IGludGVyZmFjZSwKLSAqIGNvdWxkIGJlIG51bGwKLSAqLwotdm9pZCBTZXRNb2NrQnRhR2F0dEludGVyZmFjZShNb2NrQnRhR2F0dEludGVyZmFjZSogbW9ja19idGFfZ2F0dF9pbnRlcmZhY2UpOwotCi19ICAvLyBuYW1lc3BhY2UgZ2F0dApkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL2J0YV9nYXR0X3F1ZXVlX21vY2suY2MgYi9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfcXVldWVfbW9jay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxZmJhMy4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfcXVldWVfbW9jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZV9tb2NrLmgiCi0KLXN0YXRpYyBnYXR0OjpNb2NrQnRhR2F0dFF1ZXVlKiBnYXR0X3F1ZXVlID0gbnVsbHB0cjsKLQotdm9pZCBnYXR0OjpTZXRNb2NrQnRhR2F0dFF1ZXVlKE1vY2tCdGFHYXR0UXVldWUqIG1vY2tfYnRhX2dhdHRfcXVldWUpIHsKLSAgZ2F0dF9xdWV1ZSA9IG1vY2tfYnRhX2dhdHRfcXVldWU7Ci19Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpDbGVhbih1aW50MTZfdCBjb25uX2lkKSB7IGdhdHRfcXVldWUtPkNsZWFuKGNvbm5faWQpOyB9Ci0KLXZvaWQgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFQURfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgZ2F0dF9xdWV1ZS0+UmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSwgY2IsIGNiX2RhdGEpOwotfQotCi12b2lkIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgZ2F0dF9xdWV1ZS0+V3JpdGVDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBoYW5kbGUsIHZhbHVlLCB3cml0ZV90eXBlLCBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9kYXRhKTsKLX0KLQotdm9pZCBCdGFHYXR0UXVldWU6OldyaXRlRGVzY3JpcHRvcih1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgZ2F0dF9xdWV1ZS0+V3JpdGVEZXNjcmlwdG9yKGNvbm5faWQsIGhhbmRsZSwgdmFsdWUsIHdyaXRlX3R5cGUsIGNiLCBjYl9kYXRhKTsKLX0KLQotdm9pZCBCdGFHYXR0UXVldWU6OkNvbmZpZ3VyZU10dSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUpIHsKLSAgTE9HX0FTU0VSVChnYXR0X3F1ZXVlKSA8PCAiTW9jayBHQVRUIHF1ZXVlIG5vdCBzZXQhIjsKLSAgZ2F0dF9xdWV1ZS0+Q29uZmlndXJlTXR1KGNvbm5faWQsIG10dSk7Ci19CmRpZmYgLS1naXQgYS9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfcXVldWVfbW9jay5oIGIvYnRhL3Rlc3QvY29tbW9uL2J0YV9nYXR0X3F1ZXVlX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlNjJhYi4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9jb21tb24vYnRhX2dhdHRfcXVldWVfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWUuaCIKLQotbmFtZXNwYWNlIGdhdHQgewotCi1jbGFzcyBNb2NrQnRhR2F0dFF1ZXVlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ2xlYW4sICh1aW50MTZfdCBjb25uX2lkKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgUmVhZENoYXJhY3RlcmlzdGljLAotICAgICAgICAgICAgICAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCBHQVRUX1JFQURfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgV3JpdGVDaGFyYWN0ZXJpc3RpYywKLSAgICAgICAgICAgICAgKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsIEdBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgV3JpdGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwgR0FUVF9XUklURV9PUF9DQiBjYiwKLSAgICAgICAgICAgICAgIHZvaWQqIGNiX2RhdGEpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBDb25maWd1cmVNdHUsICh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUpKTsKLX07Ci0KLS8qKgotICogU2V0IHRoZSB7QGxpbmsgTW9ja0J0YUdhdHRRdWV1ZX0gZm9yIHRlc3RpbmcKLSAqCi0gKiBAcGFyYW0gbW9ja19idGFfZ2F0dF9xdWV1ZSBwb2ludGVyIHRvIG1vY2sgYnRhIGdhdHQgcXVldWUsIGNvdWxkIGJlIG51bGwKLSAqLwotdm9pZCBTZXRNb2NrQnRhR2F0dFF1ZXVlKE1vY2tCdGFHYXR0UXVldWUqIG1vY2tfYnRhX2dhdHRfcXVldWUpOwotCi19ICAvLyBuYW1lc3BhY2UgZ2F0dApkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL2J0aWZfc3RvcmFnZV9tb2NrLmNjIGIvYnRhL3Rlc3QvY29tbW9uL2J0aWZfc3RvcmFnZV9tb2NrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDM4OWM2Li4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2NvbW1vbi9idGlmX3N0b3JhZ2VfbW9jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJidGlmX3N0b3JhZ2VfbW9jay5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLXN0YXRpYyBibHVldG9vdGg6OnN0b3JhZ2U6Ok1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSogYnRpZl9zdG9yYWdlX2ludGVyZmFjZSA9Ci0gICAgbnVsbHB0cjsKLQotdm9pZCBibHVldG9vdGg6OnN0b3JhZ2U6OlNldE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSgKLSAgICBNb2NrQnRpZlN0b3JhZ2VJbnRlcmZhY2UqIG1vY2tfYnRpZl9zdG9yYWdlX2ludGVyZmFjZSkgewotICBidGlmX3N0b3JhZ2VfaW50ZXJmYWNlID0gbW9ja19idGlmX3N0b3JhZ2VfaW50ZXJmYWNlOwotfQotCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfbGVhdWRpb19hdXRvY29ubmVjdChSYXdBZGRyZXNzIGNvbnN0JiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCkgewotICBMT0dfQVNTRVJUKGJ0aWZfc3RvcmFnZV9pbnRlcmZhY2UpIDw8ICJNb2NrIHN0b3JhZ2UgbW9kdWxlIG5vdCBzZXQhIjsKLSAgYnRpZl9zdG9yYWdlX2ludGVyZmFjZS0+QWRkTGVhdWRpb0F1dG9jb25uZWN0KGFkZHIsIGF1dG9jb25uZWN0KTsKLX0KLQotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2xlYXVkaW8oUmF3QWRkcmVzcyBjb25zdCYgYWRkcikgewotICBMT0dfQVNTRVJUKGJ0aWZfc3RvcmFnZV9pbnRlcmZhY2UpIDw8ICJNb2NrIHN0b3JhZ2UgbW9kdWxlIG5vdCBzZXQhIjsKLSAgYnRpZl9zdG9yYWdlX2ludGVyZmFjZS0+UmVtb3ZlTGVhdWRpbyhhZGRyKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idGEvdGVzdC9jb21tb24vYnRpZl9zdG9yYWdlX21vY2suaCBiL2J0YS90ZXN0L2NvbW1vbi9idGlmX3N0b3JhZ2VfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg3YmM5Li4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2NvbW1vbi9idGlmX3N0b3JhZ2VfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1jbGFzcyBCdGlmU3RvcmFnZUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQWRkTGVhdWRpb0F1dG9jb25uZWN0KFJhd0FkZHJlc3MgY29uc3QmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlTGVhdWRpbyhSYXdBZGRyZXNzIGNvbnN0JiBhZGRyKSA9IDA7Ci0gIHZpcnR1YWwgfkJ0aWZTdG9yYWdlSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgTW9ja0J0aWZTdG9yYWdlSW50ZXJmYWNlIDogcHVibGljIEJ0aWZTdG9yYWdlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQWRkTGVhdWRpb0F1dG9jb25uZWN0LAotICAgICAgICAgICAgICAoUmF3QWRkcmVzcyBjb25zdCYgYWRkciwgYm9vbCBhdXRvY29ubmVjdCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlbW92ZUxlYXVkaW8sIChSYXdBZGRyZXNzIGNvbnN0JiBhZGRyKSwgKG92ZXJyaWRlKSk7Ci19OwotCi0vKioKLSAqIFNldCB0aGUge0BsaW5rIE1vY2tCaWZTdG9yYWdlSW50ZXJmYWNlfSBmb3IgdGVzdGluZwotICoKLSAqIEBwYXJhbSBtb2NrX2J0aWZfc3RvcmFnZV9pbnRlcmZhY2UgcG9pbnRlciB0byBtb2NrIGJ0bSBzZWN1cml0eQotICogaW50ZXJuYWwgaW50ZXJmYWNlLCBjb3VsZCBiZSBudWxsCi0gKi8KLXZvaWQgU2V0TW9ja0J0aWZTdG9yYWdlSW50ZXJmYWNlKAotICAgIE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSogbW9ja19idGlmX3N0b3JhZ2VfaW50ZXJmYWNlKTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2NvbW1vbi9idG1fYXBpX21vY2suY2MgYi9idGEvdGVzdC9jb21tb24vYnRtX2FwaV9tb2NrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjlhNjIzLi4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2NvbW1vbi9idG1fYXBpX21vY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRtX2FwaV9tb2NrLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgYmx1ZXRvb3RoOjptYW5hZ2VyOjpNb2NrQnRtSW50ZXJmYWNlKiBidG1faW50ZXJmYWNlID0gbnVsbHB0cjsKLQotdm9pZCBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1JbnRlcmZhY2UoCi0gICAgTW9ja0J0bUludGVyZmFjZSogbW9ja19idG1faW50ZXJmYWNlKSB7Ci0gIGJ0bV9pbnRlcmZhY2UgPSBtb2NrX2J0bV9pbnRlcmZhY2U7Ci19Ci0KLWJvb2wgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2VjX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIExPR19BU1NFUlQoYnRtX2ludGVyZmFjZSkgPDwgIk1vY2sgYnRtIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBidG1faW50ZXJmYWNlLT5HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoYmRfYWRkciwgcF9zZWNfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKLX0KLQotYm9vbCBCVE1fSXNMaW5rS2V5S25vd24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgTE9HX0FTU0VSVChidG1faW50ZXJmYWNlKSA8PCAiTW9jayBidG0gaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGJ0bV9pbnRlcmZhY2UtPklzTGlua0tleUtub3duKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci19Ci0KLWJvb2wgQlRNX0lzRW5jcnlwdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHJldHVybiBidG1faW50ZXJmYWNlLT5CVE1fSXNFbmNyeXB0ZWQoYmRfYWRkciwgdHJhbnNwb3J0KTsKLX0KLQotdEJUTV9TVEFUVVMgQlRNX1NldEVuY3J5cHRpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHsKLSAgcmV0dXJuIGJ0bV9pbnRlcmZhY2UtPlNldEVuY3J5cHRpb24oYmRfYWRkciwgdHJhbnNwb3J0LCBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JlZl9kYXRhLCBzZWNfYWN0KTsKLX0KLQotYm9vbCBCVE1fSXNQaHkybVN1cHBvcnRlZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBMT0dfQVNTRVJUKGJ0bV9pbnRlcmZhY2UpIDw8ICJNb2NrIGJ0bSBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gYnRtX2ludGVyZmFjZS0+SXNQaHkybVN1cHBvcnRlZChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotfQotCi11aW50OF90IEJUTV9HZXRQZWVyU0NBKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIExPR19BU1NFUlQoYnRtX2ludGVyZmFjZSkgPDwgIk1vY2sgYnRtIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBidG1faW50ZXJmYWNlLT5HZXRQZWVyU0NBKHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci19Ci0KLXZvaWQgQlRNX0JsZVNldFBoeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHR4X3BoeXMsIHVpbnQ4X3QgcnhfcGh5cywKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfb3B0aW9ucykgewotICBMT0dfQVNTRVJUKGJ0bV9pbnRlcmZhY2UpIDw8ICJNb2NrIGJ0bSBpbnRlcmZhY2Ugbm90IHNldCEiOwotICBidG1faW50ZXJmYWNlLT5CbGVTZXRQaHkoYmRfYWRkciwgdHhfcGh5cywgcnhfcGh5cywgcGh5X29wdGlvbnMpOwotfQotCi1ib29sIEJUTV9TZWNJc1NlY3VyaXR5UGVuZGluZyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIExPR19BU1NFUlQoYnRtX2ludGVyZmFjZSkgPDwgIk1vY2sgYnRtIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBidG1faW50ZXJmYWNlLT5TZWNJc1NlY3VyaXR5UGVuZGluZyhiZF9hZGRyKTsKLX0KLQotdEJUTV9TRUNfREVWX1JFQyogYnRtX2ZpbmRfZGV2KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgTE9HX0FTU0VSVChidG1faW50ZXJmYWNlKSA8PCAiTW9jayBidG0gaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGJ0bV9pbnRlcmZhY2UtPkZpbmREZXZpY2UoYmRfYWRkcik7Ci19Ci0KLXZvaWQgQlRNX1JlcXVlc3RQZWVyU0NBKFJhd0FkZHJlc3MgY29uc3QmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIExPR19BU1NFUlQoYnRtX2ludGVyZmFjZSkgPDwgIk1vY2sgYnRtIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIGJ0bV9pbnRlcmZhY2UtPlJlcXVlc3RQZWVyU0NBKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci19Ci0KLXVpbnQxNl90IEJUTV9HZXRIQ0lDb25uSGFuZGxlKFJhd0FkZHJlc3MgY29uc3QmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBMT0dfQVNTRVJUKGJ0bV9pbnRlcmZhY2UpIDw8ICJNb2NrIGJ0bSBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gYnRtX2ludGVyZmFjZS0+R2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCB0cmFuc3BvcnQpOwotfQotCi12b2lkIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKSB7Ci0gIExPR19BU1NFUlQoYnRtX2ludGVyZmFjZSkgPDwgIk1vY2sgYnRtIGludGVyZmFjZSBub3Qgc2V0ISI7Ci0gIHJldHVybiBidG1faW50ZXJmYWNlLT5BY2xEaXNjb25uZWN0RnJvbUhhbmRsZShoYW5kbGUsIHJlYXNvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL2J0bV9hcGlfbW9jay5oIGIvYnRhL3Rlc3QvY29tbW9uL2J0bV9hcGlfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTMwYTZkLi4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2NvbW1vbi9idG1fYXBpX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9zZWN1cml0eV9kZXZpY2VfcmVjb3JkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbWFuYWdlciB7Ci0KLWNsYXNzIEJ0bUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zZWNfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpID0gMDsKLSAgdmlydHVhbCBib29sIElzTGlua0tleUtub3duKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgQlRNX0lzRW5jcnlwdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpID0gMDsKLSAgdmlydHVhbCB0QlRNX1NUQVRVUyBTZXRFbmNyeXB0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCkgPSAwOwotICB2aXJ0dWFsIHRCVE1fU0VDX0RFVl9SRUMqIEZpbmREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgPSAwOwotICB2aXJ0dWFsIGJvb2wgSXNQaHkybVN1cHBvcnRlZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgPSAwOwotICB2aXJ0dWFsIHVpbnQ4X3QgR2V0UGVlclNDQShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQmxlU2V0UGh5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgdHhfcGh5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ4X3BoeXMsIHVpbnQxNl90IHBoeV9vcHRpb25zKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTZWNJc1NlY3VyaXR5UGVuZGluZyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZXF1ZXN0UGVlclNDQShSYXdBZGRyZXNzIGNvbnN0JiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpID0gMDsKLSAgdmlydHVhbCB1aW50MTZfdCBHZXRIQ0lDb25uSGFuZGxlKFJhd0FkZHJlc3MgY29uc3QmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQWNsRGlzY29ubmVjdEZyb21IYW5kbGUodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pID0gMDsKLSAgdmlydHVhbCB+QnRtSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgTW9ja0J0bUludGVyZmFjZSA6IHB1YmxpYyBCdG1JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKGJvb2wpLCBHZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90KiBwX3NlY19mbGFncywKLSAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgSXNMaW5rS2V5S25vd24sCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoYm9vbCksIEJUTV9Jc0VuY3J5cHRlZCwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh0QlRNX1NUQVRVUyksIFNldEVuY3J5cHRpb24sCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLCB2b2lkKiBwX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh0QlRNX1NFQ19ERVZfUkVDKiksIEZpbmREZXZpY2UsIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgSXNQaHkybVN1cHBvcnRlZCwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh1aW50OF90KSwgR2V0UGVlclNDQSwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQmxlU2V0UGh5LAotICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCB0eF9waHlzLCB1aW50OF90IHJ4X3BoeXMsCi0gICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfb3B0aW9ucyksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoYm9vbCksIFNlY0lzU2VjdXJpdHlQZW5kaW5nLCAoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlcXVlc3RQZWVyU0NBLAotICAgICAgICAgICAgICAoUmF3QWRkcmVzcyBjb25zdCYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHVpbnQxNl90KSwgR2V0SENJQ29ubkhhbmRsZSwKLSAgICAgICAgICAgICAgKFJhd0FkZHJlc3MgY29uc3QmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQWNsRGlzY29ubmVjdEZyb21IYW5kbGUsCi0gICAgICAgICAgICAgICh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbiksIChvdmVycmlkZSkpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrQnRtSW50ZXJmYWNlfSBmb3IgdGVzdGluZwotICoKLSAqIEBwYXJhbSBtb2NrX2J0bV9pbnRlcmZhY2UgcG9pbnRlciB0byBtb2NrIGJ0bSBpbnRlcmZhY2UsIGNvdWxkIGJlIG51bGwKLSAqLwotdm9pZCBTZXRNb2NrQnRtSW50ZXJmYWNlKE1vY2tCdG1JbnRlcmZhY2UqIG1vY2tfYnRtX2ludGVyZmFjZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9idGEvdGVzdC9jb21tb24vZmFrZV9vc2kuaCBiL2J0YS90ZXN0L2NvbW1vbi9mYWtlX29zaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU2ZDU4Li4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2NvbW1vbi9mYWtlX29zaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0KLXN0cnVjdCBmYWtlX29zaV9hbGFybV9zZXRfb25fbWxvb3AgewotICB1aW50NjRfdCBpbnRlcnZhbF9tc3swfTsKLSAgYWxhcm1fY2FsbGJhY2tfdCBjYnt9OwotICB2b2lkKiBkYXRhe251bGxwdHJ9OwotfTsKZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuY2MgYi9idGEvdGVzdC9jb21tb24vbW9ja19jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2YyODY1Li4wMDAwMDAwCi0tLSBhL2J0YS90ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmRrLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtb2NrX2NvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLQotc3RhdGljIGNvbnRyb2xsZXI6Ok1vY2tDb250cm9sbGVySW50ZXJmYWNlKiBjb250cm9sbGVyX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0KLXZvaWQgY29udHJvbGxlcjo6U2V0TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UoCi0gICAgTW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UqIGludGVyZmFjZSkgewotICBjb250cm9sbGVyX2ludGVyZmFjZSA9IGludGVyZmFjZTsKLX0KLQotdWludDE2X3QgZ2V0X2lzb19kYXRhX3NpemUodm9pZCkgewotICBMT0dfQVNTRVJUKGNvbnRyb2xsZXJfaW50ZXJmYWNlKSA8PCAiTW9jayBjb250cm9sbGVyIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlLT5HZXRJc29EYXRhU2l6ZSgpOwotfQotCi11aW50OF90IGdldF9pc29fYnVmZmVyX2NvdW50KHZvaWQpIHsKLSAgTE9HX0FTU0VSVChjb250cm9sbGVyX2ludGVyZmFjZSkgPDwgIk1vY2sgY29udHJvbGxlciBub3Qgc2V0ISI7Ci0gIHJldHVybiBjb250cm9sbGVyX2ludGVyZmFjZS0+R2V0SXNvQnVmZmVyQ291bnQoKTsKLX0KLQotYm9vbCBzdXBwb3J0c19ibGVfaXNvY2hyb25vdXNfYnJvYWRjYXN0ZXIodm9pZCkgewotICBMT0dfQVNTRVJUKGNvbnRyb2xsZXJfaW50ZXJmYWNlKSA8PCAiTW9jayBjb250cm9sbGVyIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlLT5TdXBwb3J0c0JsZUlzb2Nocm9ub3VzQnJvYWRjYXN0ZXIoKTsKLX0KLQotYm9vbCBzdXBwb3J0c19ibGVfMm1fcGh5KHZvaWQpIHsKLSAgTE9HX0FTU0VSVChjb250cm9sbGVyX2ludGVyZmFjZSkgPDwgIk1vY2sgY29udHJvbGxlciBub3Qgc2V0ISI7Ci0gIHJldHVybiBjb250cm9sbGVyX2ludGVyZmFjZS0+U3VwcG9ydHNCbGUybVBoeSgpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtX2NlbnRyYWwodm9pZCkgewotICBMT0dfQVNTRVJUKGNvbnRyb2xsZXJfaW50ZXJmYWNlKSA8PCAiTW9jayBjb250cm9sbGVyIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlLT5TdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtQ2VudHJhbCgpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtX3BlcmlwaGVyYWwodm9pZCkgewotICBMT0dfQVNTRVJUKGNvbnRyb2xsZXJfaW50ZXJmYWNlKSA8PCAiTW9jayBjb250cm9sbGVyIG5vdCBzZXQhIjsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlCi0gICAgICAtPlN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1QZXJpcGhlcmFsKCk7Ci19Ci0KLWNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkgewotICBzdGF0aWMgY29udHJvbGxlcl90KiBjb250cm9sbGVyX2luc3RhbmNlID0gbmV3IGNvbnRyb2xsZXJfdCgpOwotCi0gIGNvbnRyb2xsZXJfaW5zdGFuY2UtPmdldF9pc29fZGF0YV9zaXplID0gJmdldF9pc29fZGF0YV9zaXplOwotICBjb250cm9sbGVyX2luc3RhbmNlLT5nZXRfaXNvX2J1ZmZlcl9jb3VudCA9ICZnZXRfaXNvX2J1ZmZlcl9jb3VudDsKLSAgY29udHJvbGxlcl9pbnN0YW5jZS0+c3VwcG9ydHNfYmxlX2lzb2Nocm9ub3VzX2Jyb2FkY2FzdGVyID0KLSAgICAgICZzdXBwb3J0c19ibGVfaXNvY2hyb25vdXNfYnJvYWRjYXN0ZXI7Ci0gIGNvbnRyb2xsZXJfaW5zdGFuY2UtPnN1cHBvcnRzX2JsZV8ybV9waHkgPSAmc3VwcG9ydHNfYmxlXzJtX3BoeTsKLSAgY29udHJvbGxlcl9pbnN0YW5jZS0+c3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fY2VudHJhbCA9Ci0gICAgICAmc3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fY2VudHJhbDsKLSAgY29udHJvbGxlcl9pbnN0YW5jZS0+c3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fcGVyaXBoZXJhbCA9Ci0gICAgICAmc3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fcGVyaXBoZXJhbDsKLQotICByZXR1cm4gY29udHJvbGxlcl9pbnN0YW5jZTsKLX0KZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuaCBiL2J0YS90ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5NThlNi4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9jb21tb24vbW9ja19jb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmRrLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAiaGNpbXNncy5oIgotCi1uYW1lc3BhY2UgY29udHJvbGxlciB7Ci1jbGFzcyBDb250cm9sbGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdWludDhfdCBHZXRJc29CdWZmZXJDb3VudCh2b2lkKSA9IDA7Ci0gIHZpcnR1YWwgdWludDE2X3QgR2V0SXNvRGF0YVNpemUodm9pZCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVDb25uZWN0ZWRJc29jaHJvbm91c1N0cmVhbUNlbnRyYWwodm9pZCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVDb25uZWN0ZWRJc29jaHJvbm91c1N0cmVhbVBlcmlwaGVyYWwodm9pZCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVJc29jaHJvbm91c0Jyb2FkY2FzdGVyKHZvaWQpID0gMDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlMm1QaHkodm9pZCkgPSAwOwotCi0gIHZpcnR1YWwgfkNvbnRyb2xsZXJJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBNb2NrQ29udHJvbGxlckludGVyZmFjZSA6IHB1YmxpYyBDb250cm9sbGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh1aW50OF90KSwgR2V0SXNvQnVmZmVyQ291bnQsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHVpbnQxNl90KSwgR2V0SXNvRGF0YVNpemUsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKGJvb2wpLCBTdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtQ2VudHJhbCwgKCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoYm9vbCksIFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1QZXJpcGhlcmFsLCAoKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgU3VwcG9ydHNCbGVJc29jaHJvbm91c0Jyb2FkY2FzdGVyLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgU3VwcG9ydHNCbGUybVBoeSwgKCksIChvdmVycmlkZSkpOwotfTsKLQotdm9pZCBTZXRNb2NrQ29udHJvbGxlckludGVyZmFjZSgKLSAgICBNb2NrQ29udHJvbGxlckludGVyZmFjZSogbW9ja19jb250cm9sbGVyX2ludGVyZmFjZSk7Ci19ICAvLyBuYW1lc3BhY2UgY29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL21vY2tfY3Npc19jbGllbnQuY2MgYi9idGEvdGVzdC9jb21tb24vbW9ja19jc2lzX2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzMTk2OS4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9jb21tb24vbW9ja19jc2lzX2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuZGsuCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vY2tfY3Npc19jbGllbnQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1zdGF0aWMgTW9ja0NzaXNDbGllbnQqIG1vY2tfY3Npc19jbGllbnQ7Ci0KLXZvaWQgTW9ja0NzaXNDbGllbnQ6OlNldE1vY2tJbnN0YW5jZUZvclRlc3RpbmcoTW9ja0NzaXNDbGllbnQqIG1vY2spIHsKLSAgbW9ja19jc2lzX2NsaWVudCA9IG1vY2s7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50OjpJbml0aWFsaXplKAotICAgIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzLCBiYXNlOjpDbG9zdXJlIGluaXRDYikgewotICBMT0dfQVNTRVJUKG1vY2tfY3Npc19jbGllbnQpIDw8ICJNb2NrIENzaXNDbGllbnQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgbW9ja19jc2lzX2NsaWVudC0+SW5pdGlhbGl6ZShjYWxsYmFja3MsIGluaXRDYik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50OjpDbGVhblVwKCkgewotICBMT0dfQVNTRVJUKG1vY2tfY3Npc19jbGllbnQpIDw8ICJNb2NrIENzaXNDbGllbnQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgbW9ja19jc2lzX2NsaWVudC0+Q2xlYW5VcCgpOwotfQotCi1ibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnQqIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDo6R2V0KCkgewotICBMT0dfQVNTRVJUKG1vY2tfY3Npc19jbGllbnQpIDw8ICJNb2NrIENzaXNDbGllbnQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgcmV0dXJuIG1vY2tfY3Npc19jbGllbnQtPkdldCgpOwotfQotCi12b2lkIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDo6RGVidWdEdW1wKGludCBmZCkgewotICBMT0dfQVNTRVJUKG1vY2tfY3Npc19jbGllbnQpIDw8ICJNb2NrIENzaXNDbGllbnQgaW50ZXJmYWNlIG5vdCBzZXQhIjsKLSAgbW9ja19jc2lzX2NsaWVudC0+RGVidWdEdW1wKGZkKTsKLX0KLQotYm9vbCBibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnQ6OklzQ3Npc0NsaWVudFJ1bm5pbmcoKSB7Ci0gIExPR19BU1NFUlQobW9ja19jc2lzX2NsaWVudCkgPDwgIk1vY2sgQ3Npc0NsaWVudCBpbnRlcmZhY2Ugbm90IHNldCEiOwotICByZXR1cm4gbW9ja19jc2lzX2NsaWVudC0+SXNDc2lzQ2xpZW50UnVubmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL21vY2tfY3Npc19jbGllbnQuaCBiL2J0YS90ZXN0L2NvbW1vbi9tb2NrX2NzaXNfY2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzEwNmEuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvY29tbW9uL21vY2tfY3Npc19jbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuZGsuCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgImJ0YV9jc2lzX2FwaS5oIgotCi1jbGFzcyBNb2NrQ3Npc0NsaWVudCA6IHB1YmxpYyBibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnQgewotIHB1YmxpYzoKLSAgLyogT3ZlcnJpZGVzICovCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ29ubmVjdCwgKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBEaXNjb25uZWN0LCAoY29uc3QgUmF3QWRkcmVzcyYgYWRkciksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlbW92ZURldmljZSwgKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKGludCksIEdldEdyb3VwSWQsIChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBibHVldG9vdGg6OlV1aWQgdXVpZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIExvY2tHcm91cCwKLSAgICAgICAgICAgICAgKGNvbnN0IGludCBncm91cF9pZCwgYm9vbCBsb2NrLCBibHVldG9vdGg6OmNzaXM6OkNzaXNMb2NrQ2IgY2IpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+KSwgR2V0RGV2aWNlTGlzdCwgKGludCBncm91cF9pZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCi0gIC8qIENhbGxlZCBmcm9tIHN0YXRpYyBtZXRob2RzICovCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgSW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgKGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudENhbGxiYWNrcyAqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUgaW5pdENiKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ2xlYW5VcCwgKCkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIERlYnVnRHVtcCwgKGludCBmZCkpOwotICBNT0NLX01FVEhPRCgoYm9vbCksIElzQ3Npc0NsaWVudFJ1bm5pbmcsICgpKTsKLSAgTU9DS19NRVRIT0QoKENzaXNDbGllbnQqKSwgR2V0LCAoKSk7Ci0KLSAgc3RhdGljIHZvaWQgU2V0TW9ja0luc3RhbmNlRm9yVGVzdGluZyhNb2NrQ3Npc0NsaWVudCogbW9jayk7Ci19OwpkaWZmIC0tZ2l0IGEvYnRhL3Rlc3QvY29tbW9uL21vY2tfZGV2aWNlX2dyb3Vwcy5jYyBiL2J0YS90ZXN0L2NvbW1vbi9tb2NrX2RldmljZV9ncm91cHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Yzc3MzUuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvY29tbW9uL21vY2tfZGV2aWNlX2dyb3Vwcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtb2NrX2RldmljZV9ncm91cHMuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1zdGF0aWMgTW9ja0RldmljZUdyb3VwcyogbW9ja19ncm91cHMgPSBudWxscHRyOwotCi12b2lkIE1vY2tEZXZpY2VHcm91cHM6OlNldE1vY2tJbnN0YW5jZUZvclRlc3RpbmcoTW9ja0RldmljZUdyb3VwcyogZ3JvdXBzKSB7Ci0gIG1vY2tfZ3JvdXBzID0gZ3JvdXBzOwotfQotCi1ibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzKiBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzOjpHZXQoKSB7Ci0gIHJldHVybiBtb2NrX2dyb3VwczsKLX0KLQotdm9pZCBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzOjpJbml0aWFsaXplKAotICAgIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHNDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICBMT0dfQVNTRVJUKG1vY2tfZ3JvdXBzKSA8PCAiTW9jayBEZXZpY2UgR3JvdXBzIG5vdCBzZXQhIjsKLSAgbW9ja19ncm91cHMtPkluaXRpYWxpemUoY2FsbGJhY2tzKTsKLX07Ci0KLXZvaWQgYmx1ZXRvb3RoOjpncm91cHM6OkRldmljZUdyb3Vwczo6Q2xlYW5VcCgKLSAgICBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzQ2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgTE9HX0FTU0VSVChtb2NrX2dyb3VwcykgPDwgIk1vY2sgRGV2aWNlIEdyb3VwcyBub3Qgc2V0ISI7Ci0gIG1vY2tfZ3JvdXBzLT5DbGVhblVwKGNhbGxiYWNrcyk7Ci19CmRpZmYgLS1naXQgYS9idGEvdGVzdC9jb21tb24vbW9ja19kZXZpY2VfZ3JvdXBzLmggYi9idGEvdGVzdC9jb21tb24vbW9ja19kZXZpY2VfZ3JvdXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDJmNDAuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvY29tbW9uL21vY2tfZGV2aWNlX2dyb3Vwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgImJ0YV9ncm91cHMuaCIKLQotY2xhc3MgTW9ja0RldmljZUdyb3VwcyA6IHB1YmxpYyBibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzIHsKLSBwdWJsaWM6Ci0gIC8qIE92ZXJyaWRlcyAqLwotICBNT0NLX01FVEhPRCgoaW50KSwgQWRkRGV2aWNlLAotICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgYmx1ZXRvb3RoOjpVdWlkIHV1aWQsIGludCBncm91cF9pZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgoaW50KSwgR2V0R3JvdXBJZCwgKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGJsdWV0b290aDo6VXVpZCB1dWlkKSwKLSAgICAgICAgICAgICAgKGNvbnN0IG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgUmVtb3ZlRGV2aWNlLCAoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgaW50IGdyb3VwX2lkKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChzaXplX3QpLCBHZXRTZXJpYWxpemVkU2l6ZSwgKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpLAotICAgICAgICAgICAgICAoY29uc3Qgb3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKGJvb2wpLCBTZXJpYWxpemVEZXZpY2VHcm91cHMsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBwX291dCwgc2l6ZV90IGJ1ZmZlcl9zaXplKSwKLSAgICAgICAgICAgICAgKGNvbnN0IG92ZXJyaWRlKSk7Ci0KLSAgLyogQ2FsbGVkIGZyb20gc3RhdGljIG1ldGhvZHMgKi8KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBJbml0aWFsaXplLAotICAgICAgICAgICAgICAoYmx1ZXRvb3RoOjpncm91cHM6OkRldmljZUdyb3Vwc0NhbGxiYWNrcyAqIGNhbGxiYWNrcykpOwotICBNT0NLX01FVEhPRCgodm9pZCksIENsZWFuVXAsCi0gICAgICAgICAgICAgIChibHVldG9vdGg6Omdyb3Vwczo6RGV2aWNlR3JvdXBzQ2FsbGJhY2tzICogY2FsbGJhY2tzKSk7Ci0KLSAgc3RhdGljIHZvaWQgU2V0TW9ja0luc3RhbmNlRm9yVGVzdGluZyhNb2NrRGV2aWNlR3JvdXBzKiBtYWNoaW5lKTsKLX07CmRpZmYgLS1naXQgYS9idGEvdGVzdC9nYXR0L2RhdGFiYXNlX2J1aWxkZXJfc2FtcGxlX2RldmljZV90ZXN0LmNjIGIvYnRhL3Rlc3QvZ2F0dC9kYXRhYmFzZV9idWlsZGVyX3NhbXBsZV9kZXZpY2VfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmZjAzMS4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9nYXR0L2RhdGFiYXNlX2J1aWxkZXJfc2FtcGxlX2RldmljZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImdhdHQvZGF0YWJhc2VfYnVpbGRlci5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotbmFtZXNwYWNlIGdhdHQgewotCi1uYW1lc3BhY2UgewotLyogRVhQRUNUX0VRIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggc3RhdGljIGNvbnN0ZXhwciBmaWVsZHMsIG5lZWQgYSB2YXJpYWJsZQotICogd2l0aCBhZGRyZXNzICovCi1jb25zdGV4cHIgc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4gRVhQTE9SRV9FTkQgPQotICAgIERhdGFiYXNlQnVpbGRlcjo6RVhQTE9SRV9FTkQ7Ci0KLS8qIG1ha2VfcGFpciBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIEVYUEVDVF9FUSwgaGF2ZSBvd24gaGVscGVyIGluc3RlYWQgKi8KLWlubGluZSBzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PiBtYWtlX3BhaXJfdTE2KHVpbnQxNl90IGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2Vjb25kKSB7Ci0gIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmaXJzdCwgc2Vjb25kKTsKLX0KLQotLy8gY2xhbmctZm9ybWF0IG9mZgotVXVpZCBTRVJWSUNFXzFfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODAwLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzJfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODAxLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzNfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODBmLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzRfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDBmZWY1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzVfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODBhLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzZfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDBmZTU1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotCi1VdWlkIFNFUlZJQ0VfMV9DSEFSXzFfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYTAwLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzFfQ0hBUl8yX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMmEwMS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLVV1aWQgU0VSVklDRV8xX0NIQVJfM19VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJhMDQtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci0KLVV1aWQgU0VSVklDRV8zX0NIQVJfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJhMTktMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci1VdWlkIFNFUlZJQ0VfM19DSEFSXzFfREVTQ18xX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMjkwMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLQotVXVpZCBTRVJWSUNFXzRfQ0hBUl8xX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCI4MDgyY2FhOC00MWE2LTQwMjEtOTFjNi01NmY5Yjk1NGNjMzQiKTsKLVV1aWQgU0VSVklDRV80X0NIQVJfMl9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiNzI0MjQ5ZjAtNWVjMy00YjVmLTg4MDQtNDIzNDVhZjA4NjUxIik7Ci1VdWlkIFNFUlZJQ0VfNF9DSEFSXzNfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjZjNTNkYjI1LTQ3YTEtNDVmZS1hMDIyLTdjOTJmYjMzNGZkNCIpOwotVXVpZCBTRVJWSUNFXzRfQ0hBUl80X1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCI5ZDg0YjlhMy0wMDBjLTQ5ZDgtOTE4My04NTViNjczZmRhMzEiKTsKLVV1aWQgU0VSVklDRV80X0NIQVJfNV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiNDU3ODcxZTgtZDUxNi00Y2ExLTkxMTYtNTdkMGIxN2I5Y2IyIik7Ci1VdWlkIFNFUlZJQ0VfNF9DSEFSXzZfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjVmNzhkZjk0LTc5OGMtNDZmNS05OTBhLWIzZWI2YTA2NWM4OCIpOwotVXVpZCBTRVJWSUNFXzRfQ0hBUl82X0RFU0NfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDI5MDItMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci0KLVV1aWQgU0VSVklDRV81X0NIQVJfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJhMjktMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci1VdWlkIFNFUlZJQ0VfNV9DSEFSXzJfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYTI0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzVfQ0hBUl8zX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMmEyNS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLVV1aWQgU0VSVklDRV81X0NIQVJfNF9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJhMjctMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci1VdWlkIFNFUlZJQ0VfNV9DSEFSXzVfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYTI2LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzVfQ0hBUl82X1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMmEyOC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLVV1aWQgU0VSVklDRV81X0NIQVJfN19VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJhNTAtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci0KLVV1aWQgU0VSVklDRV82X0NIQVJfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDAwMDEtMTAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci1VdWlkIFNFUlZJQ0VfNl9DSEFSXzFfREVTQ18xX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMjkwMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLVV1aWQgU0VSVklDRV82X0NIQVJfMl9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDAwMDItMTAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7Ci1VdWlkIFNFUlZJQ0VfNl9DSEFSXzNfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAwMDAzLTEwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotLy8gY2xhbmctZm9ybWF0IG9uCi0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0vKiBDb250ZW50IG9mIHNhbXBsZSBkYXRhYmFzZSwgY29tZXMgZnJvbSBEYXlkcmVhbSBjb250cm9sbGVyOgotU2VydmljZTogaGFuZGxlPTB4MDAwMSwgZW5kX2hhbmRsZT0weDAwMDcsIHV1aWQ9MDAwMDE4MDAtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiCi0JIENoYXJhY3RlcmlzdGljOiBkZWNsYXJhdGlvbl9oYW5kbGU9MHgwMDAyLCB2YWx1ZV9oYW5kbGU9MHgwMDAzLCB1dWlkPTAwMDAyYTAwLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiwgcHJvcD0weDAyCi0JIENoYXJhY3RlcmlzdGljOiBkZWNsYXJhdGlvbl9oYW5kbGU9MHgwMDA0LCB2YWx1ZV9oYW5kbGU9MHgwMDA1LCB1dWlkPTAwMDAyYTAxLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiwgcHJvcD0weDAyCi0JIENoYXJhY3RlcmlzdGljOiBkZWNsYXJhdGlvbl9oYW5kbGU9MHgwMDA2LCB2YWx1ZV9oYW5kbGU9MHgwMDA3LCB1dWlkPTAwMDAyYTA0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiwgcHJvcD0weDAyCi1TZXJ2aWNlOiBoYW5kbGU9MHgwMDA4LCBlbmRfaGFuZGxlPTB4MDAwOCwgdXVpZD0wMDAwMTgwMS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIKLVNlcnZpY2U6IGhhbmRsZT0weDAwMDksIGVuZF9oYW5kbGU9MHgwMDBjLCB1dWlkPTAwMDAxODBmLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAwYSwgdmFsdWVfaGFuZGxlPTB4MDAwYiwgdXVpZD0wMDAwMmExOS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgxMgotCQkgRGVzY3JpcHRvcjogaGFuZGxlPTB4MDAwYywgdXVpZD0wMDAwMjkwMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIKLVNlcnZpY2U6IGhhbmRsZT0weDAwMGQsIGVuZF9oYW5kbGU9MHgwMDFhLCB1dWlkPTAwMDBmZWY1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAwZSwgdmFsdWVfaGFuZGxlPTB4MDAwZiwgdXVpZD04MDgyY2FhOC00MWE2LTQwMjEtOTFjNi01NmY5Yjk1NGNjMzQsIHByb3A9MHgwYQotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxMCwgdmFsdWVfaGFuZGxlPTB4MDAxMSwgdXVpZD03MjQyNDlmMC01ZWMzLTRiNWYtODgwNC00MjM0NWFmMDg2NTEsIHByb3A9MHgwYQotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxMiwgdmFsdWVfaGFuZGxlPTB4MDAxMywgdXVpZD02YzUzZGIyNS00N2ExLTQ1ZmUtYTAyMi03YzkyZmIzMzRmZDQsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxNCwgdmFsdWVfaGFuZGxlPTB4MDAxNSwgdXVpZD05ZDg0YjlhMy0wMDBjLTQ5ZDgtOTE4My04NTViNjczZmRhMzEsIHByb3A9MHgwYQotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxNiwgdmFsdWVfaGFuZGxlPTB4MDAxNywgdXVpZD00NTc4NzFlOC1kNTE2LTRjYTEtOTExNi01N2QwYjE3YjljYjIsIHByb3A9MHgwZQotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxOCwgdmFsdWVfaGFuZGxlPTB4MDAxOSwgdXVpZD01Zjc4ZGY5NC03OThjLTQ2ZjUtOTkwYS1iM2ViNmEwNjVjODgsIHByb3A9MHgxMgotCQkgRGVzY3JpcHRvcjogaGFuZGxlPTB4MDAxYSwgdXVpZD0wMDAwMjkwMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIKLVNlcnZpY2U6IGhhbmRsZT0weDAwMWIsIGVuZF9oYW5kbGU9MHgwMDI5LCB1dWlkPTAwMDAxODBhLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxYywgdmFsdWVfaGFuZGxlPTB4MDAxZCwgdXVpZD0wMDAwMmEyOS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAxZSwgdmFsdWVfaGFuZGxlPTB4MDAxZiwgdXVpZD0wMDAwMmEyNC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAyMCwgdmFsdWVfaGFuZGxlPTB4MDAyMSwgdXVpZD0wMDAwMmEyNS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAyMiwgdmFsdWVfaGFuZGxlPTB4MDAyMywgdXVpZD0wMDAwMmEyNy0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAyNCwgdmFsdWVfaGFuZGxlPTB4MDAyNSwgdXVpZD0wMDAwMmEyNi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAyNiwgdmFsdWVfaGFuZGxlPTB4MDAyNywgdXVpZD0wMDAwMmEyOC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAyOCwgdmFsdWVfaGFuZGxlPTB4MDAyOSwgdXVpZD0wMDAwMmE1MC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotU2VydmljZTogaGFuZGxlPTB4MDAyYSwgZW5kX2hhbmRsZT0weDAwMzEsIHV1aWQ9MDAwMGZlNTUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiCi0JIENoYXJhY3RlcmlzdGljOiBkZWNsYXJhdGlvbl9oYW5kbGU9MHgwMDJiLCB2YWx1ZV9oYW5kbGU9MHgwMDJjLCB1dWlkPTAwMDAwMDAxLTEwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiwgcHJvcD0weDEwCi0JCSBEZXNjcmlwdG9yOiBoYW5kbGU9MHgwMDJkLCB1dWlkPTAwMDAyOTAyLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYgotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAyZSwgdmFsdWVfaGFuZGxlPTB4MDAyZiwgdXVpZD0wMDAwMDAwMi0xMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwOAotCSBDaGFyYWN0ZXJpc3RpYzogZGVjbGFyYXRpb25faGFuZGxlPTB4MDAzMCwgdmFsdWVfaGFuZGxlPTB4MDAzMSwgdXVpZD0wMDAwMDAwMy0xMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIsIHByb3A9MHgwMgotKi8KLS8vIGNsYW5nLWZvcm1hdCBvbgotCi0vKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBEYXRhYmFzZUJ1aWxkZXIgd2lsbCBwcm9wZXJseSBkaXNjb3ZlciBkYXRhYmFzZQotICogY29udGVudCBmcm9tIGEgcmVtb3RlIGRldmljZS4gSXQgYWxzbyB2ZXJpZnkgdGhhdCBhZnRlciB0aGUgZGlzY292ZXJ5IGlzCi0gKiBkb25lLCByZXR1cm5lZCBkYXRhYmFzZSBpcyBlcXVhbCB0byB0aGUgZGlzY292ZXJlZCBvbmUgKi8KLVRFU1QoRGF0YWJhc2VCdWlsZGVyU2FtcGxlRGV2aWNlVGVzdCwgRG9EaXNjb3ZlcnkpIHsKLSAgRGF0YWJhc2VCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgRVhQRUNUX0ZBTFNFKGJ1aWxkZXIuSW5Qcm9ncmVzcygpKTsKLQotICAvLyBBdCBzdGFydCBvZiBkaXNjb3ZlcnksIGJ1aWxkZXIgd2lsbCByZWNlaXZlIEFsbCBzZXJ2aWNlcyBpbiBvcmRlciBmcm9tCi0gIC8vIGxvd2VyIGxheWVycy4KLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwMSwgMHgwMDA3LCBTRVJWSUNFXzFfVVVJRCwgdHJ1ZSk7Ci0KLSAgLy8gVGhlIG1vbWVudCB3ZSByZWNlaXZlIGZpcnN0IHNlcnZpY2UsIHdlIGFyZSBpbiBwcm9ncmVzcwotICAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgSW5Qcm9ncmVzcyBzdGF0ZSBvbmNlIHdlIHNlbnQgR0FUVCByZXF1ZXN0LAotICAvLyBub3Qgd2hlbiBpdCdzIGJhY2sgYW5kIHBhcnNlZAotICBFWFBFQ1RfVFJVRShidWlsZGVyLkluUHJvZ3Jlc3MoKSk7Ci0KLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwOCwgMHgwMDA4LCBTRVJWSUNFXzJfVVVJRCwgdHJ1ZSk7Ci0gIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwMDksIDB4MDAwYywgU0VSVklDRV8zX1VVSUQsIHRydWUpOwotICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDBkLCAweDAwMWEsIFNFUlZJQ0VfNF9VVUlELCB0cnVlKTsKLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAxYiwgMHgwMDI5LCBTRVJWSUNFXzVfVVVJRCwgdHJ1ZSk7Ci0gIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwMmEsIDB4MDAzMSwgU0VSVklDRV82X1VVSUQsIHRydWUpOwotCi0gIC8vIEF0IHRoaXMgbW9tZW50LCBhbGwgc2VydmljZXMgYXJlIHJlY2VpdmVkLCBzdGFjayB3aWxsIGdyYWIgdGhlbSBvbmUgYW5kIG9uZQotICAvLyB0byBkaXNjb3ZlciB0aGVpciBjb250ZW50LgotICBFWFBFQ1RfVFJVRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLQotICAvLyBHcmFiYmluZyBmaXJzdCBzZXJ2aWNlLCB0byBzdGFydCBJbmNsdWRlZCBTZXJ2aWNlIGFuZCBDaGFyYWN0ZXJpc3RpYwotICAvLyBkaXNjb3ZlcnkKLSAgRVhQRUNUX0VRKGJ1aWxkZXIuQ3VycmVudGx5RXhwbG9yZWRTZXJ2aWNlKCksIG1ha2VfcGFpcl91MTYoMHgwMDAxLCAweDAwMDcpKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwMiwgMHgwMDAzLCBTRVJWSUNFXzFfQ0hBUl8xX1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwNCwgMHgwMDA1LCBTRVJWSUNFXzFfQ0hBUl8yX1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwNiwgMHgwMDA3LCBTRVJWSUNFXzFfQ0hBUl8zX1VVSUQsIDB4MDIpOwotCi0gIC8vIEFsbCBjaGFyYWN0ZXJpc3RpY3Mgd2VyZSBkaXNjb3ZlcmVkLCBzdGFjayB3aWxsIHRyeSB0byBsb29rIGZvcgotICAvLyBkZXNjcmlwdG9ycy4gU2luY2UgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIGRlc2NyaXB0b3JzLCBidWlsZGVyIHNob3VsZCByZXR1cm4KLSAgLy8gbm90aGluZyBtb3JlIHRvIGRpc2NvdmVyCi0gIEVYUEVDVF9FUShidWlsZGVyLk5leHREZXNjcmlwdG9yUmFuZ2VUb0V4cGxvcmUoKSwgRVhQTE9SRV9FTkQpOwotCi0gIC8vIFNlcnZpY2Ugd2l0aCBoYW5kbGVzIDB4MDAwOCwgMHgwMDA4IGlzIHNraXBwZWQgZm9yIGV4cGxvcmF0aW9uIC0gd2Uga25vdwotICAvLyBpdCdzIGVtcHR5LgotICBFWFBFQ1RfVFJVRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGJ1aWxkZXIuQ3VycmVudGx5RXhwbG9yZWRTZXJ2aWNlKCksIG1ha2VfcGFpcl91MTYoMHgwMDA5LCAweDAwMGMpKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwYSwgMHgwMDBiLCBTRVJWSUNFXzNfQ0hBUl8xX1VVSUQsIDB4MTIpOwotCi0gIEVYUEVDVF9FUShidWlsZGVyLk5leHREZXNjcmlwdG9yUmFuZ2VUb0V4cGxvcmUoKSwKLSAgICAgICAgICAgIG1ha2VfcGFpcl91MTYoMHgwMDBjLCAweDAwMGMpKTsKLQotICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDBjLCBTRVJWSUNFXzNfQ0hBUl8xX0RFU0NfMV9VVUlEKTsKLQotICAvLyBBbGwgZGVzY3JpcHRvcnMgd2VyZSBleHBsb3JlZAotICBFWFBFQ1RfRVEoYnVpbGRlci5OZXh0RGVzY3JpcHRvclJhbmdlVG9FeHBsb3JlKCksIEVYUExPUkVfRU5EKTsKLQotICBFWFBFQ1RfVFJVRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGJ1aWxkZXIuQ3VycmVudGx5RXhwbG9yZWRTZXJ2aWNlKCksIG1ha2VfcGFpcl91MTYoMHgwMDBkLCAweDAwMWEpKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwZSwgMHgwMDBmLCBTRVJWSUNFXzRfQ0hBUl8xX1VVSUQsIDB4MGEpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxMCwgMHgwMDExLCBTRVJWSUNFXzRfQ0hBUl8yX1VVSUQsIDB4MGEpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxMiwgMHgwMDEzLCBTRVJWSUNFXzRfQ0hBUl8zX1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxNCwgMHgwMDE1LCBTRVJWSUNFXzRfQ0hBUl80X1VVSUQsIDB4MGEpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxNiwgMHgwMDE3LCBTRVJWSUNFXzRfQ0hBUl81X1VVSUQsIDB4MGUpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxOCwgMHgwMDE5LCBTRVJWSUNFXzRfQ0hBUl82X1VVSUQsIDB4MTIpOwotCi0gIC8vIEp1c3QgbGFzdCBDaGFyYWN0ZXJpc3RpYyBoYXZlIHNwYWNlIGZvciBkZXNjcmlwdG9yCi0gIEVYUEVDVF9FUShidWlsZGVyLk5leHREZXNjcmlwdG9yUmFuZ2VUb0V4cGxvcmUoKSwKLSAgICAgICAgICAgIG1ha2VfcGFpcl91MTYoMHgwMDFhLCAweDAwMWEpKTsKLQotICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDFhLCBTRVJWSUNFXzRfQ0hBUl82X0RFU0NfMV9VVUlEKTsKLQotICAvLyBBbGwgZGVzY3JpcHRvcnMgd2VyZSBleHBsb3JlZAotICBFWFBFQ1RfRVEoYnVpbGRlci5OZXh0RGVzY3JpcHRvclJhbmdlVG9FeHBsb3JlKCksIEVYUExPUkVfRU5EKTsKLQotICBFWFBFQ1RfVFJVRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGJ1aWxkZXIuQ3VycmVudGx5RXhwbG9yZWRTZXJ2aWNlKCksIG1ha2VfcGFpcl91MTYoMHgwMDFiLCAweDAwMjkpKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxYywgMHgwMDFkLCBTRVJWSUNFXzVfQ0hBUl8xX1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxZSwgMHgwMDFmLCBTRVJWSUNFXzVfQ0hBUl8yX1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyMCwgMHgwMDIxLCBTRVJWSUNFXzVfQ0hBUl8zX1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyMiwgMHgwMDIzLCBTRVJWSUNFXzVfQ0hBUl80X1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyNCwgMHgwMDI1LCBTRVJWSUNFXzVfQ0hBUl81X1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyNiwgMHgwMDI3LCBTRVJWSUNFXzVfQ0hBUl82X1VVSUQsIDB4MDIpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyOCwgMHgwMDI5LCBTRVJWSUNFXzVfQ0hBUl83X1VVSUQsIDB4MDIpOwotCi0gIC8vIE5vIHNwYWNlIGZvciBkZXNjcmlwdG9ycwotICBFWFBFQ1RfRVEoYnVpbGRlci5OZXh0RGVzY3JpcHRvclJhbmdlVG9FeHBsb3JlKCksIEVYUExPUkVfRU5EKTsKLQotICBFWFBFQ1RfVFJVRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLSAgRVhQRUNUX0VRKGJ1aWxkZXIuQ3VycmVudGx5RXhwbG9yZWRTZXJ2aWNlKCksIG1ha2VfcGFpcl91MTYoMHgwMDJhLCAweDAwMzEpKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyYiwgMHgwMDJjLCBTRVJWSUNFXzZfQ0hBUl8xX1VVSUQsIDB4MTApOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAyZSwgMHgwMDJmLCBTRVJWSUNFXzZfQ0hBUl8yX1VVSUQsIDB4MDgpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAzMCwgMHgwMDMxLCBTRVJWSUNFXzZfQ0hBUl8zX1VVSUQsIDB4MDIpOwotCi0gIC8vIEp1c3Qgb25lIENoYXJhY3RlcmlzdGljIGhhdmUgc3BhY2UgZm9yIGRlc2NyaXB0b3IKLSAgRVhQRUNUX0VRKGJ1aWxkZXIuTmV4dERlc2NyaXB0b3JSYW5nZVRvRXhwbG9yZSgpLAotICAgICAgICAgICAgbWFrZV9wYWlyX3UxNigweDAwMmQsIDB4MDAyZCkpOwotCi0gIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMmQsIFNFUlZJQ0VfNl9DSEFSXzFfREVTQ18xX1VVSUQpOwotCi0gIC8vIEFsbCBkZXNjcmlwdG9ycyB3ZXJlIGV4cGxvcmVkCi0gIEVYUEVDVF9FUShidWlsZGVyLk5leHREZXNjcmlwdG9yUmFuZ2VUb0V4cGxvcmUoKSwgRVhQTE9SRV9FTkQpOwotCi0gIEVYUEVDVF9GQUxTRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLQotICBFWFBFQ1RfVFJVRShidWlsZGVyLkluUHJvZ3Jlc3MoKSk7Ci0gIERhdGFiYXNlIHJlc3VsdCA9IGJ1aWxkZXIuQnVpbGQoKTsKLSAgRVhQRUNUX0ZBTFNFKGJ1aWxkZXIuSW5Qcm9ncmVzcygpKTsKLQotICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmV0dXJuZWQgZGF0YWJhc2UgbWF0Y2hlcyB3aGF0IHdhcyBkaXNjb3ZlcmVkCi0gIGF1dG8gc2VydmljZSA9IHJlc3VsdC5TZXJ2aWNlcygpLmJlZ2luKCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5oYW5kbGUsIDB4MDAwMSk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT51dWlkLCBTRVJWSUNFXzFfVVVJRCk7Ci0KLSAgRVhQRUNUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1swXS51dWlkLCBTRVJWSUNFXzFfQ0hBUl8xX1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzFdLnV1aWQsIFNFUlZJQ0VfMV9DSEFSXzJfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMl0udXVpZCwgU0VSVklDRV8xX0NIQVJfM19VVUlEKTsKLQotICBzZXJ2aWNlKys7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT51dWlkLCBTRVJWSUNFXzJfVVVJRCk7Ci0KLSAgc2VydmljZSsrOwotICBFWFBFQ1RfRVEoc2VydmljZS0+dXVpZCwgU0VSVklDRV8zX1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzBdLnV1aWQsIFNFUlZJQ0VfM19DSEFSXzFfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMF0uZGVzY3JpcHRvcnNbMF0udXVpZCwKLSAgICAgICAgICAgIFNFUlZJQ0VfM19DSEFSXzFfREVTQ18xX1VVSUQpOwotCi0gIHNlcnZpY2UrKzsKLSAgRVhQRUNUX0VRKHNlcnZpY2UtPnV1aWQsIFNFUlZJQ0VfNF9VVUlEKTsKLSAgRVhQRUNUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1swXS51dWlkLCBTRVJWSUNFXzRfQ0hBUl8xX1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzFdLnV1aWQsIFNFUlZJQ0VfNF9DSEFSXzJfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMl0udXVpZCwgU0VSVklDRV80X0NIQVJfM19VVUlEKTsKLSAgRVhQRUNUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1szXS51dWlkLCBTRVJWSUNFXzRfQ0hBUl80X1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzRdLnV1aWQsIFNFUlZJQ0VfNF9DSEFSXzVfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbNV0udXVpZCwgU0VSVklDRV80X0NIQVJfNl9VVUlEKTsKLSAgRVhQRUNUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1s1XS5kZXNjcmlwdG9yc1swXS51dWlkLAotICAgICAgICAgICAgU0VSVklDRV80X0NIQVJfNl9ERVNDXzFfVVVJRCk7Ci0KLSAgc2VydmljZSsrOwotICBFWFBFQ1RfRVEoc2VydmljZS0+dXVpZCwgU0VSVklDRV81X1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzBdLnV1aWQsIFNFUlZJQ0VfNV9DSEFSXzFfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMV0udXVpZCwgU0VSVklDRV81X0NIQVJfMl9VVUlEKTsKLSAgRVhQRUNUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1syXS51dWlkLCBTRVJWSUNFXzVfQ0hBUl8zX1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzNdLnV1aWQsIFNFUlZJQ0VfNV9DSEFSXzRfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbNF0udXVpZCwgU0VSVklDRV81X0NIQVJfNV9VVUlEKTsKLSAgRVhQRUNUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1s1XS51dWlkLCBTRVJWSUNFXzVfQ0hBUl82X1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzZdLnV1aWQsIFNFUlZJQ0VfNV9DSEFSXzdfVVVJRCk7Ci0KLSAgc2VydmljZSsrOwotICBFWFBFQ1RfRVEoc2VydmljZS0+dXVpZCwgU0VSVklDRV82X1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzBdLnV1aWQsIFNFUlZJQ0VfNl9DSEFSXzFfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMF0uZGVzY3JpcHRvcnNbMF0udXVpZCwKLSAgICAgICAgICAgIFNFUlZJQ0VfNl9DSEFSXzFfREVTQ18xX1VVSUQpOwotICBFWFBFQ1RfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzFdLnV1aWQsIFNFUlZJQ0VfNl9DSEFSXzJfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMl0udXVpZCwgU0VSVklDRV82X0NIQVJfM19VVUlEKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGdhdHQKZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2dhdHQvZGF0YWJhc2VfYnVpbGRlcl90ZXN0LmNjIGIvYnRhL3Rlc3QvZ2F0dC9kYXRhYmFzZV9idWlsZGVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM3NDcuLjAwMDAwMDAKLS0tIGEvYnRhL3Rlc3QvZ2F0dC9kYXRhYmFzZV9idWlsZGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdhdHQvZGF0YWJhc2VfYnVpbGRlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLW5hbWVzcGFjZSBnYXR0IHsKLQotbmFtZXNwYWNlIHsKLS8qIG1ha2VfcGFpciBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIEFTU0VSVF9FUSwgaGF2ZSBvd24gaGVscGVyIGluc3RlYWQgKi8KLWlubGluZSBzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PiBtYWtlX3BhaXJfdTE2KHVpbnQxNl90IGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2Vjb25kKSB7Ci0gIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmaXJzdCwgc2Vjb25kKTsKLX0KLQotVXVpZCBTRVJWSUNFXzFfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODAwLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzJfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODAxLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzNfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODBmLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzRfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDBmZWY1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzVfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODBhLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzFfQ0hBUl8xX1VVSUQgPQotICAgIFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYTAwLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotVXVpZCBTRVJWSUNFXzFfQ0hBUl8xX0RFU0NfMV9VVUlEID0KLSAgICBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMjkwMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8qIFZlcmlmeSBhZGRpbmcgZW1wdHkgc2VydmljZSB3b3JrcyBvayAqLwotVEVTVChEYXRhYmFzZUJ1aWxkZXJUZXN0LCBFbXB0eVNlcnZpY2VBZGRUZXN0KSB7Ci0gIERhdGFiYXNlQnVpbGRlciBidWlsZGVyOwotCi0gIEVYUEVDVF9GQUxTRShidWlsZGVyLkluUHJvZ3Jlc3MoKSk7Ci0KLSAgLy8gU2ltcGxlIGRhdGFiYXNlLCBqdXN0IG9uZSBlbXB0eQotICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDAxLCAweDAwMDEsIFNFUlZJQ0VfMV9VVUlELCB0cnVlKTsKLSAgRVhQRUNUX0ZBTFNFKGJ1aWxkZXIuU3RhcnROZXh0U2VydmljZUV4cGxvcmF0aW9uKCkpOwotCi0gIERhdGFiYXNlIHJlc3VsdCA9IGJ1aWxkZXIuQnVpbGQoKTsKLQotICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmV0dXJuZWQgZGF0YWJhc2UgbWF0Y2hlcyB3aGF0IHdhcyBkaXNjb3ZlcmVkCi0gIGF1dG8gc2VydmljZSA9IHJlc3VsdC5TZXJ2aWNlcygpLmJlZ2luKCk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5oYW5kbGUsIDB4MDAwMSk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5lbmRfaGFuZGxlLCAweDAwMDEpOwotICBBU1NFUlRfRVEoc2VydmljZS0+aXNfcHJpbWFyeSwgdHJ1ZSk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT51dWlkLCBTRVJWSUNFXzFfVVVJRCk7Ci19Ci0KLS8qIFZlcmlmeSBhZGRpbmcgc2VydmljZSwgY2hhcmFjdGVyaXN0aWMgYW5kIGRlc2NyaXB0b3Igd29yayAqLwotVEVTVChEYXRhYmFzZUJ1aWxkZXJUZXN0LCBEZXNjcmlwdG9yQWRkVGVzdCkgewotICBEYXRhYmFzZUJ1aWxkZXIgYnVpbGRlcjsKLQotICBFWFBFQ1RfRkFMU0UoYnVpbGRlci5JblByb2dyZXNzKCkpOwotCi0gIC8vIFNpbXBsZSBkYXRhYmFzZSwganVzdCBvbmUgZW1wdHkKLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwMSwgMHgwMDBmLCBTRVJWSUNFXzFfVVVJRCwgdHJ1ZSk7Ci0gIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDAyLCAweDAwMDMsIFNFUlZJQ0VfMV9DSEFSXzFfVVVJRCwgMHgwMik7Ci0gIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMDQsIFNFUlZJQ0VfMV9DSEFSXzFfREVTQ18xX1VVSUQpOwotCi0gIERhdGFiYXNlIHJlc3VsdCA9IGJ1aWxkZXIuQnVpbGQoKTsKLQotICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmV0dXJuZWQgZGF0YWJhc2UgbWF0Y2hlcyB3aGF0IHdhcyBkaXNjb3ZlcmVkCi0gIGF1dG8gc2VydmljZSA9IHJlc3VsdC5TZXJ2aWNlcygpLmJlZ2luKCk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5oYW5kbGUsIDB4MDAwMSk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5lbmRfaGFuZGxlLCAweDAwMGYpOwotICBBU1NFUlRfRVEoc2VydmljZS0+aXNfcHJpbWFyeSwgdHJ1ZSk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT51dWlkLCBTRVJWSUNFXzFfVVVJRCk7Ci0KLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1swXS51dWlkLCBTRVJWSUNFXzFfQ0hBUl8xX1VVSUQpOwotICBBU1NFUlRfRVEoc2VydmljZS0+Y2hhcmFjdGVyaXN0aWNzWzBdLmRlY2xhcmF0aW9uX2hhbmRsZSwgMHgwMDAyKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1swXS52YWx1ZV9oYW5kbGUsIDB4MDAwMyk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMF0ucHJvcGVydGllcywgMHgwMik7Ci0KLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljc1swXS5kZXNjcmlwdG9yc1swXS51dWlkLAotICAgICAgICAgICAgU0VSVklDRV8xX0NIQVJfMV9ERVNDXzFfVVVJRCk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3NbMF0uZGVzY3JpcHRvcnNbMF0uaGFuZGxlLCAweDAwMDQpOwotfQotCi0vKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBEYXRhYmFzZUJ1aWxkZXIgcHJvcGVybHkgaGFuZGxlIGRpc2NvdmVyeSBvZgotICogc2Vjb25kYXJ5IHNlcnZpY2UsIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGRpc2NvdmVyeSBxdWV1ZSBmcm9tIGluY2x1ZGVkIHNlcnZpY2UKLSAqIGRlZmluaXRpb24uIFN1Y2ggc2VydmljZSBtaWdodCBjb21lIG91dCBvZiBvcmRlci4gICovCi1URVNUKERhdGFiYXNlQnVpbGRlclRlc3QsIFNlY29uZGFyeVNlcnZpY2VPdXRPZk9yZGVyVGVzdCkgewotICBEYXRhYmFzZUJ1aWxkZXIgYnVpbGRlcjsKLQotICBFWFBFQ1RfRkFMU0UoYnVpbGRlci5JblByb2dyZXNzKCkpOwotCi0gIC8vIEF0IHN0YXJ0IG9mIGRpc2NvdmVyeSwgYnVpbGRlciB3aWxsIHJlY2VpdmUgQWxsIHNlcnZpY2VzIGluIG9yZGVyIGZyb20KLSAgLy8gbG93ZXIgbGF5ZXJzLgotICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDAxLCAweDAwMGYsIFNFUlZJQ0VfMV9VVUlELCB0cnVlKTsKLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAzMCwgMHgwMDNmLCBTRVJWSUNFXzNfVVVJRCwgdHJ1ZSk7Ci0gIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwNTAsIDB4MDA1ZiwgU0VSVklDRV81X1VVSUQsIHRydWUpOwotCi0gIC8vIEZpcnN0IHNlcnZpY2Ugc2tpcHBlZCwgbm8gcGxhY2UgZm9yIGhhbmRsZXMKLSAgRVhQRUNUX1RSVUUoYnVpbGRlci5TdGFydE5leHRTZXJ2aWNlRXhwbG9yYXRpb24oKSk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLkN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpLCBtYWtlX3BhaXJfdTE2KDB4MDAwMSwgMHgwMDBmKSk7Ci0KLSAgLy8gRm9yIHRoaXMgdGVzdCwgY29udGVudCBvZiBmaXJzdCBzZXJ2aWNlIGlzIGlycmV2ZWxhbnQKLQotICBFWFBFQ1RfVFJVRShidWlsZGVyLlN0YXJ0TmV4dFNlcnZpY2VFeHBsb3JhdGlvbigpKTsKLSAgLy8gR3JhYmJpbmcgZmlyc3Qgc2VydmljZSwgdG8gc3RhcnQgSW5jbHVkZWQgU2VydmljZSBhbmQgQ2hhcmFjdGVyaXN0aWMKLSAgLy8gZGlzY292ZXJ5Ci0gIEFTU0VSVF9FUShidWlsZGVyLkN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpLCBtYWtlX3BhaXJfdTE2KDB4MDAzMCwgMHgwMDNmKSk7Ci0KLSAgYnVpbGRlci5BZGRJbmNsdWRlZFNlcnZpY2UoMHgwMDMxLCBTRVJWSUNFXzRfVVVJRCwgMHgwMDQwLCAweDAwNGYpOwotICBidWlsZGVyLkFkZEluY2x1ZGVkU2VydmljZSgweDAwMzIsIFNFUlZJQ0VfMl9VVUlELCAweDAwMjAsIDB4MDAyZik7Ci0KLSAgLyogU2Vjb25kYXJ5IHNlcnZpY2UgZXhwbG9yYXRpb24gKi8KLSAgRVhQRUNUX1RSVUUoYnVpbGRlci5TdGFydE5leHRTZXJ2aWNlRXhwbG9yYXRpb24oKSk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLkN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpLCBtYWtlX3BhaXJfdTE2KDB4MDAyMCwgMHgwMDJmKSk7Ci0KLSAgLyogU2Vjb25kYXJ5IHNlcnZpY2UgZXhwbG9yYXRpb24gKi8KLSAgRVhQRUNUX1RSVUUoYnVpbGRlci5TdGFydE5leHRTZXJ2aWNlRXhwbG9yYXRpb24oKSk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLkN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpLCBtYWtlX3BhaXJfdTE2KDB4MDA0MCwgMHgwMDRmKSk7Ci0KLSAgLyogQmFjayB0byBwcmltYXJ5IHNlcnZpY2UgZXhwbG9yYXRpb24gKi8KLSAgRVhQRUNUX1RSVUUoYnVpbGRlci5TdGFydE5leHRTZXJ2aWNlRXhwbG9yYXRpb24oKSk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLkN1cnJlbnRseUV4cGxvcmVkU2VydmljZSgpLCBtYWtlX3BhaXJfdTE2KDB4MDA1MCwgMHgwMDVmKSk7Ci0KLSAgRGF0YWJhc2UgcmVzdWx0ID0gYnVpbGRlci5CdWlsZCgpOwotCi0gIC8vIHZlcmlmeSB0aGF0IHRoZSByZXR1cm5lZCBkYXRhYmFzZSBtYXRjaGVzIHdoYXQgd2FzIGRpc2NvdmVyZWQKLSAgYXV0byBzZXJ2aWNlID0gcmVzdWx0LlNlcnZpY2VzKCkuYmVnaW4oKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmhhbmRsZSwgMHgwMDAxKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmlzX3ByaW1hcnksIHRydWUpOwotICBBU1NFUlRfRVEoc2VydmljZS0+dXVpZCwgU0VSVklDRV8xX1VVSUQpOwotCi0gIHNlcnZpY2UrKzsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmhhbmRsZSwgMHgwMDIwKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmVuZF9oYW5kbGUsIDB4MDAyZik7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT51dWlkLCBTRVJWSUNFXzJfVVVJRCk7Ci0gIEFTU0VSVF9FUShzZXJ2aWNlLT5pc19wcmltYXJ5LCBmYWxzZSk7Ci0KLSAgc2VydmljZSsrOwotICBBU1NFUlRfRVEoc2VydmljZS0+aGFuZGxlLCAweDAwMzApOwotICBBU1NFUlRfRVEoc2VydmljZS0+ZW5kX2hhbmRsZSwgMHgwMDNmKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPnV1aWQsIFNFUlZJQ0VfM19VVUlEKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmlzX3ByaW1hcnksIHRydWUpOwotICBBU1NFUlRfRVEoc2VydmljZS0+aW5jbHVkZWRfc2VydmljZXMuc2l6ZSgpLCAoc2l6ZV90KTIpOwotICBBU1NFUlRfRVEoc2VydmljZS0+aW5jbHVkZWRfc2VydmljZXNbMF0uc3RhcnRfaGFuZGxlLCAweDAwNDApOwotICBBU1NFUlRfRVEoc2VydmljZS0+aW5jbHVkZWRfc2VydmljZXNbMF0uZW5kX2hhbmRsZSwgMHgwMDRmKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmluY2x1ZGVkX3NlcnZpY2VzWzFdLnN0YXJ0X2hhbmRsZSwgMHgwMDIwKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmluY2x1ZGVkX3NlcnZpY2VzWzFdLmVuZF9oYW5kbGUsIDB4MDAyZik7Ci0KLSAgc2VydmljZSsrOwotICBBU1NFUlRfRVEoc2VydmljZS0+aGFuZGxlLCAweDAwNDApOwotICBBU1NFUlRfRVEoc2VydmljZS0+dXVpZCwgU0VSVklDRV80X1VVSUQpOwotICBBU1NFUlRfRVEoc2VydmljZS0+aXNfcHJpbWFyeSwgZmFsc2UpOwotCi0gIHNlcnZpY2UrKzsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmhhbmRsZSwgMHgwMDUwKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPnV1aWQsIFNFUlZJQ0VfNV9VVUlEKTsKLSAgQVNTRVJUX0VRKHNlcnZpY2UtPmlzX3ByaW1hcnksIHRydWUpOwotCi0gIHNlcnZpY2UrKzsKLSAgQVNTRVJUX0VRKHNlcnZpY2UsIHJlc3VsdC5TZXJ2aWNlcygpLmVuZCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGdhdHQKZGlmZiAtLWdpdCBhL2J0YS90ZXN0L2dhdHQvZGF0YWJhc2VfdGVzdC5jYyBiL2J0YS90ZXN0L2dhdHQvZGF0YWJhc2VfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlOTA3Yi4uMDAwMDAwMAotLS0gYS9idGEvdGVzdC9nYXR0L2RhdGFiYXNlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdhdHQvZGF0YWJhc2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImdhdHQvZGF0YWJhc2VfYnVpbGRlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2F0dGRlZnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLW5hbWVzcGFjZSBnYXR0IHsKLQotbmFtZXNwYWNlIHsKLWNvbnN0IFV1aWQgUFJJTUFSWV9TRVJWSUNFID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9QUklfU0VSVklDRSk7Ci1jb25zdCBVdWlkIFNFQ09OREFSWV9TRVJWSUNFID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9TRUNfU0VSVklDRSk7Ci1jb25zdCBVdWlkIElOQ0xVREUgPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0lOQ0xVREVfU0VSVklDRSk7Ci1jb25zdCBVdWlkIENIQVJBQ1RFUklTVElDID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0RFQ0xBUkUpOwotY29uc3QgVXVpZCBDSEFSQUNURVJJU1RJQ19FWFRFTkRFRF9QUk9QRVJUSUVTID0KLSAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfRVhUX1BST1ApOwotCi1VdWlkIFNFUlZJQ0VfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMTgwMCIpOwotVXVpZCBTRVJWSUNFXzJfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjE4MDEiKTsKLVV1aWQgU0VSVklDRV8xX0NIQVJfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMmEwMCIpOwotVXVpZCBTRVJWSUNFXzFfQ0hBUl8xX0RFU0NfMV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMjkwMiIpOwotfSAgLy8gbmFtZXNwYWNlCi0KLS8qIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgZWFjaCBwb3NzaWJsZSBHQVRUIGNhY2hlIGVsZW1lbnQgaXMgcHJvcGVybHkKLSAqIHNlcmlhbGl6ZWQgaW50byBTdG9yZWRBdHRyaWJ1dGUgKi8KLVRFU1QoR2F0dERhdGFiYXNlVGVzdCwgc2VyaWFsaXplX2Rlc2VyaWFsaXplX2JpbmFyeV90ZXN0KSB7Ci0gIERhdGFiYXNlQnVpbGRlciBidWlsZGVyOwotICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDAxLCAweDAwMGYsIFNFUlZJQ0VfMV9VVUlELCB0cnVlKTsKLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAxMCwgMHgwMDFmLCBTRVJWSUNFXzJfVVVJRCwgZmFsc2UpOwotICBidWlsZGVyLkFkZEluY2x1ZGVkU2VydmljZSgweDAwMDIsIFNFUlZJQ0VfMl9VVUlELCAweDAwMTAsIDB4MDAxZik7Ci0gIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDAzLCAweDAwMDQsIFNFUlZJQ0VfMV9DSEFSXzFfVVVJRCwgMHgwMik7Ci0gIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMDUsIFNFUlZJQ0VfMV9DSEFSXzFfREVTQ18xX1VVSUQpOwotICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDA2LCBDSEFSQUNURVJJU1RJQ19FWFRFTkRFRF9QUk9QRVJUSUVTKTsKLQotICAvLyBTZXQgdmFsdWUgb2Ygb25seSDCq0NoYXJhY3RlcmlzdGljIEV4dGVuZGVkIFByb3BlcnRpZXPCuyBkZXNjcmlwdG9yCi0gIGJ1aWxkZXIuU2V0VmFsdWVPZkRlc2NyaXB0b3JzKHsweDAwMDF9KTsKLQotICBEYXRhYmFzZSBkYiA9IGJ1aWxkZXIuQnVpbGQoKTsKLSAgc3RkOjp2ZWN0b3I8U3RvcmVkQXR0cmlidXRlPiBzZXJpYWxpemVkID0gZGIuU2VyaWFsaXplKCk7Ci0KLSAgLy8gUHJpbWFyeSBTZXJ2aWNlCi0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzBdLmhhbmRsZSwgMHgwMDAxKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbMF0udHlwZSwgUFJJTUFSWV9TRVJWSUNFKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbMF0udmFsdWUuc2VydmljZS51dWlkLCBTRVJWSUNFXzFfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzBdLnZhbHVlLnNlcnZpY2UuZW5kX2hhbmRsZSwgMHgwMDBmKTsKLQotICAvLyBTZWNvbmRhcnkgU2VydmljZQotICBFWFBFQ1RfRVEoc2VyaWFsaXplZFsxXS5oYW5kbGUsIDB4MDAxMCk7Ci0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzFdLnR5cGUsIFNFQ09OREFSWV9TRVJWSUNFKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbMV0udmFsdWUuc2VydmljZS51dWlkLCBTRVJWSUNFXzJfVVVJRCk7Ci0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzFdLnZhbHVlLnNlcnZpY2UuZW5kX2hhbmRsZSwgMHgwMDFmKTsKLQotICAvLyBJbmNsdWRlZCBTZXJ2aWNlCi0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzJdLmhhbmRsZSwgMHgwMDAyKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbMl0udHlwZSwgSU5DTFVERSk7Ci0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzJdLnZhbHVlLmluY2x1ZGVkX3NlcnZpY2UuaGFuZGxlLCAweDAwMTApOwotICBFWFBFQ1RfRVEoc2VyaWFsaXplZFsyXS52YWx1ZS5pbmNsdWRlZF9zZXJ2aWNlLmVuZF9oYW5kbGUsIDB4MDAxZik7Ci0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzJdLnZhbHVlLmluY2x1ZGVkX3NlcnZpY2UudXVpZCwgU0VSVklDRV8yX1VVSUQpOwotCi0gIC8vIENoYXJhY3RlcmlzdGljCi0gIEVYUEVDVF9FUShzZXJpYWxpemVkWzNdLmhhbmRsZSwgMHgwMDAzKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbM10udHlwZSwgQ0hBUkFDVEVSSVNUSUMpOwotICBFWFBFQ1RfRVEoc2VyaWFsaXplZFszXS52YWx1ZS5jaGFyYWN0ZXJpc3RpYy5wcm9wZXJ0aWVzLCAweDAyKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbM10udmFsdWUuY2hhcmFjdGVyaXN0aWMudmFsdWVfaGFuZGxlLCAweDAwMDQpOwotICBFWFBFQ1RfRVEoc2VyaWFsaXplZFszXS52YWx1ZS5jaGFyYWN0ZXJpc3RpYy51dWlkLCBTRVJWSUNFXzFfQ0hBUl8xX1VVSUQpOwotCi0gIC8vIERlc2NyaXB0b3IKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbNF0uaGFuZGxlLCAweDAwMDUpOwotICBFWFBFQ1RfRVEoc2VyaWFsaXplZFs0XS50eXBlLCBTRVJWSUNFXzFfQ0hBUl8xX0RFU0NfMV9VVUlEKTsKLQotICAvLyBDaGFyYWN0ZXJpc3RpYyBFeHRlbmRlZCBQcm9wZXJ0aWVzIERlc2NyaXB0b3IKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbNV0uaGFuZGxlLCAweDAwMDYpOwotICBFWFBFQ1RfRVEoc2VyaWFsaXplZFs1XS50eXBlLCBDSEFSQUNURVJJU1RJQ19FWFRFTkRFRF9QUk9QRVJUSUVTKTsKLSAgRVhQRUNUX0VRKHNlcmlhbGl6ZWRbNV0udmFsdWUuY2hhcmFjdGVyaXN0aWNfZXh0ZW5kZWRfcHJvcGVydGllcywgMHgwMDAxKTsKLX0KLQotLyogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBTZXJ2aWNlIHJlcHJlc2VudGVkIGluIFN0b3JlZEF0dHJpYnV0ZSBoYXZlIHByb3BlcgotICogYmluYXJ5IGZvcm1hdC4gKi8KLVRFU1QoR2F0dENhY2hlVGVzdCwgc3RvcmVkX2F0dHJpYnV0ZV90b19iaW5hcnlfc2VydmljZV90ZXN0KSB7Ci0gIFN0b3JlZEF0dHJpYnV0ZSBhdHRyOwotCi0gIC8qIG1ha2Ugc3VyZSBwYWRkaW5nIGF0IGVuZCBvZiB1bmlvbiBpcyBjbGVhcmVkICovCi0gIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKLQotICBhdHRyID0gewotICAgICAgLmhhbmRsZSA9IDB4MDAwMSwKLSAgICAgIC50eXBlID0gUFJJTUFSWV9TRVJWSUNFLAotICAgICAgLnZhbHVlID0gey5zZXJ2aWNlID0gey51dWlkID0gVXVpZDo6RnJvbVN0cmluZygiMTgwMCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmRfaGFuZGxlID0gMHgwMDFjfX0sCi0gIH07Ci0KLSAgY29uc3RleHByIHNpemVfdCBsZW4gPSBzaXplb2YoU3RvcmVkQXR0cmlidXRlKTsKLSAgLy8gY2xhbmctZm9ybWF0IG9mZgotICB1aW50OF90IGJpbmFyeV9mb3JtW2xlbl0gPSB7Ci0gICAgICAvKmhhbmRsZSAqLyAweDAxLCAweDAwLAotICAgICAgLyogdHlwZSovIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NUYsIDB4OUIsIDB4MzQsIDB4RkIsCi0gICAgICAvKiBzZXJ2aWNlIHV1aWQgKi8gMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1RiwgMHg5QiwgMHgzNCwgMHhGQiwKLSAgICAgIC8qIGVuZCBoYW5kbGUgKi8gMHgxQywgMHgwMCwKLSAgICAgIC8qIGNsZWFyZWQgcGFkZGluZyBhdCBlbmQgb2YgdW5pb24qLyAweDAwLCAweDAwfTsKLSAgLy8gY2xhbmctZm9ybWF0IG9uCi0KLSAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmc6Ci0gIC8vIExPRyhFUlJPUikgPDwgIiAiIDw8IGJhc2U6OkhleEVuY29kZSgmYXR0ciwgbGVuKTsKLSAgRVhQRUNUX0VRKG1lbWNtcChiaW5hcnlfZm9ybSwgJmF0dHIsIGxlbiksIDApOwotfQotCi0vKiBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IFNlcnZpY2UgcmVwcmVzZW50ZWQgaW4gU3RvcmVkQXR0cmlidXRlIGhhdmUgcHJvcGVyCi0gKiBiaW5hcnkgZm9ybWF0LiAqLwotVEVTVChHYXR0Q2FjaGVUZXN0LCBzdG9yZWRfYXR0cmlidXRlX3RvX2JpbmFyeV9pbmNsdWRlZF9zZXJ2aWNlX3Rlc3QpIHsKLSAgU3RvcmVkQXR0cmlidXRlIGF0dHI7Ci0KLSAgLyogbWFrZSBzdXJlIHBhZGRpbmcgYXQgZW5kIG9mIHVuaW9uIGlzIGNsZWFyZWQgKi8KLSAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOwotCi0gIGF0dHIgPSB7Ci0gICAgICAuaGFuZGxlID0gMHgwMDAxLAotICAgICAgLnR5cGUgPSBJTkNMVURFLAotICAgICAgLnZhbHVlID0gey5pbmNsdWRlZF9zZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZSA9IDB4MDAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lbmRfaGFuZGxlID0gMHgwMDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgLnV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxODAxIiksCi0gICAgICAgICAgICAgICAgICAgIH19LAotICB9OwotCi0gIGNvbnN0ZXhwciBzaXplX3QgbGVuID0gc2l6ZW9mKFN0b3JlZEF0dHJpYnV0ZSk7Ci0gIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSAgdWludDhfdCBiaW5hcnlfZm9ybVtsZW5dID0gewotICAgICAgLypoYW5kbGUgKi8gMHgwMSwgMHgwMCwKLSAgICAgIC8qIHR5cGUqLyAweDAwLCAweDAwLCAweDI4LCAweDAyLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVGLCAweDlCLCAweDM0LCAweEZCLAotICAgICAgLyogaGFuZGxlICovIDB4MTAsIDB4MDAsCi0gICAgICAvKiBlbmQgaGFuZGxlICovIDB4MWYsIDB4MDAsCi0gICAgICAvKiBzZXJ2aWNlIHV1aWQgKi8gMHgwMCwgMHgwMCwgMHgxOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1RiwgMHg5QiwgMHgzNCwgMHhGQn07Ci0gIC8vIGNsYW5nLWZvcm1hdCBvbgotCi0gIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nOgotICAvLyBMT0coRVJST1IpIDw8ICIgIiA8PCBiYXNlOjpIZXhFbmNvZGUoJmF0dHIsIGxlbik7Ci0gIEVYUEVDVF9FUShtZW1jbXAoYmluYXJ5X2Zvcm0sICZhdHRyLCBsZW4pLCAwKTsKLX0KLQotLyogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCDCq0NoYXJhY3RlcmlzdGljIEV4dGVuZGVkIFByb3BlcnRpZXPCuyBkZXNjcmlwdG9yCi0gKiByZXByZXNlbnRlZCBpbiBTdG9yZWRBdHRyaWJ1dGUgaGF2ZSBwcm9wZXIgYmluYXJ5IGZvcm1hdC4gKi8KLVRFU1QoR2F0dENhY2hlVGVzdCwgc3RvcmVkX2F0dHJpYnV0ZV90b19iaW5hcnlfY2hhcmFjdGVyaXN0aWNfdGVzdCkgewotICBTdG9yZWRBdHRyaWJ1dGUgYXR0cjsKLQotICAvKiBtYWtlIHN1cmUgcGFkZGluZyBhdCBlbmQgb2YgdW5pb24gaXMgY2xlYXJlZCAqLwotICBtZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7Ci0KLSAgYXR0ciA9IHsKLSAgICAgIC5oYW5kbGUgPSAweDAwMDIsCi0gICAgICAudHlwZSA9IENIQVJBQ1RFUklTVElDLAotICAgICAgLnZhbHVlID0gey5jaGFyYWN0ZXJpc3RpYyA9IHsucHJvcGVydGllcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9oYW5kbGUgPSAweDAwMDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51dWlkID0gVXVpZDo6RnJvbVN0cmluZygiMmEwMCIpfX0sCi0gIH07Ci0KLSAgY29uc3RleHByIHNpemVfdCBsZW4gPSBzaXplb2YoU3RvcmVkQXR0cmlidXRlKTsKLSAgLy8gY2xhbmctZm9ybWF0IG9mZgotICB1aW50OF90IGJpbmFyeV9mb3JtW2xlbl0gPSB7Ci0gICAgICAvKmhhbmRsZSAqLyAweDAyLCAweDAwLAotICAgICAgLyogdHlwZSAqLyAweDAwLCAweDAwLCAweDI4LCAweDAzLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVGLCAweDlCLCAweDM0LCAweEZCLAotICAgICAgLyogcHJvcGVydGllcyAqLyAweDAyLAotICAgICAgLyogYWZ0ZXIgcHJvcGVydGllcyB0aGVyZSBpcyBvbmUgYnl0ZSBwYWRkaW5nLiBUaGlzIG1pZ2h0IGNhdXNlIHRyb3ViZQotICAgICAgICAgb24gb3RoZXIgcGxhdGZvcm1zLCBpbnZlc3RpZ2F0ZSBpZiBpdCdzIGV2ZXIgYSBwcm9ibGVtICovIDB4MDAsCi0gICAgICAvKiB2YWx1ZSBoYW5kbGUgKi8gMHgwMywgMHgwMCwKLSAgICAgIC8qIHV1aWQgKi8gMHgwMCwgMHgwMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1RiwgMHg5QiwgMHgzNCwgMHhGQn07Ci0gIC8vIGNsYW5nLWZvcm1hdCBvbgotCi0gIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nOgotICAvLyBMT0coRVJST1IpIDw8ICIgIiA8PCBiYXNlOjpIZXhFbmNvZGUoJmF0dHIsIGxlbik7Ci0gIEVYUEVDVF9FUShtZW1jbXAoYmluYXJ5X2Zvcm0sICZhdHRyLCBsZW4pLCAwKTsKLX0KLQotLyogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBEZXNjcmlwdG9yIHJlcHJlc2VudGVkIGluIFN0b3JlZEF0dHJpYnV0ZSBoYXZlCi0gKiBwcm9wZXIgYmluYXJ5IGZvcm1hdC4gKi8KLVRFU1QoR2F0dENhY2hlVGVzdCwgc3RvcmVkX2F0dHJpYnV0ZV90b19iaW5hcnlfZGVzY3JpcHRvcl90ZXN0KSB7Ci0gIFN0b3JlZEF0dHJpYnV0ZSBhdHRyOwotCi0gIC8qIG1ha2Ugc3VyZSBwYWRkaW5nIGF0IGVuZCBvZiB1bmlvbiBpcyBjbGVhcmVkICovCi0gIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKLQotICBhdHRyID0gey5oYW5kbGUgPSAweDAwMDMsIC50eXBlID0gVXVpZDo6RnJvbVN0cmluZygiMjkwMiIpLCAudmFsdWUgPSB7fX07Ci0KLSAgY29uc3RleHByIHNpemVfdCBsZW4gPSBzaXplb2YoU3RvcmVkQXR0cmlidXRlKTsKLSAgLy8gY2xhbmctZm9ybWF0IG9mZgotICB1aW50OF90IGJpbmFyeV9mb3JtW2xlbl0gPSB7Ci0gICAgICAvKmhhbmRsZSAqLyAweDAzLCAweDAwLAotICAgICAgLyogdHlwZSAqLyAweDAwLCAweDAwLCAweDI5LCAweDAyLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVGLCAweDlCLCAweDM0LCAweEZCLAotICAgICAgLyogY2xlYXIgcGFkZGluZyAgICAqLyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgLy8gY2xhbmctZm9ybWF0IG9uCi0KLSAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmc6Ci0gIC8vIExPRyhFUlJPUikgPDwgIiAiIDw8IGJhc2U6OkhleEVuY29kZSgmYXR0ciwgbGVuKTsKLSAgRVhQRUNUX0VRKG1lbWNtcChiaW5hcnlfZm9ybSwgJmF0dHIsIGxlbiksIDApOwotfQotCi0vLyBFeGFtcGxlIGZyb20gQmx1ZXRvb3RoIFNQRUMgVjUuMiwgVm9sIDMsIFBhcnQgRywgQVBQRU5ESVggQgotVEVTVChHYXR0RGF0YWJhc2VUZXN0LCBoYXNoX3Rlc3QpIHsKLSAgRGF0YWJhc2VCdWlsZGVyIGJ1aWxkZXI7Ci0gIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwMDEsIDB4MDAwNSwgVXVpZDo6RnJvbTE2Qml0KDB4MTgwMCksIHRydWUpOwotICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDA2LCAweDAwMEQsIFV1aWQ6OkZyb20xNkJpdCgweDE4MDEpLCB0cnVlKTsKLSAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwRSwgMHgwMDEzLCBVdWlkOjpGcm9tMTZCaXQoMHgxODA4KSwgdHJ1ZSk7Ci0gIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwMTQsIDB4RkZGRiwgVXVpZDo6RnJvbTE2Qml0KDB4MTgwRiksIGZhbHNlKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwMiwgMHgwMDAzLCBVdWlkOjpGcm9tMTZCaXQoMHgyQTAwKSwgMHgwQSk7Ci0gIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDA0LCAweDAwMDUsIFV1aWQ6OkZyb20xNkJpdCgweDJBMDEpLCAweDAyKTsKLQotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwNywgMHgwMDA4LCBVdWlkOjpGcm9tMTZCaXQoMHgyQTA1KSwgMHgyMCk7Ci0gIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMDksIFV1aWQ6OkZyb20xNkJpdCgweDI5MDIpKTsKLSAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMEEsIDB4MDAwQiwgVXVpZDo6RnJvbTE2Qml0KDB4MkIyOSksIDB4MEEpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwQywgMHgwMDBELCBVdWlkOjpGcm9tMTZCaXQoMHgyQjJBKSwgMHgwMik7Ci0KLSAgYnVpbGRlci5BZGRJbmNsdWRlZFNlcnZpY2UoMHgwMDBGLCBVdWlkOjpGcm9tMTZCaXQoMHgxODBGKSwgMHgwMDE0LCAweDAwMTYpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAxMCwgMHgwMDExLCBVdWlkOjpGcm9tMTZCaXQoMHgyQTE4KSwgMHhBMik7Ci0gIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMTIsIFV1aWQ6OkZyb20xNkJpdCgweDI5MDIpKTsKLSAgYnVpbGRlci5BZGREZXNjcmlwdG9yKDB4MDAxMywgVXVpZDo6RnJvbTE2Qml0KDB4MjkwMCkpOwotCi0gIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDE1LCAweDAwMTYsIFV1aWQ6OkZyb20xNkJpdCgweDJBMTkpLCAweDAyKTsKLQotICAvLyBzZXQgY2hhcmFjdGVyaXN0aWMgZXh0ZW5kZWQgcHJvcGVydGllcyBkZXNjcmlwdG9yIHZhbHVlcwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gZGVzY3JpcHRvclZhbHVlcyA9IHsweDAwMDB9OwotICBidWlsZGVyLlNldFZhbHVlT2ZEZXNjcmlwdG9ycyhkZXNjcmlwdG9yVmFsdWVzKTsKLQotICBEYXRhYmFzZSBkYiA9IGJ1aWxkZXIuQnVpbGQoKTsKLQotICAvLyBCaWcgZW5kaWFuIGV4YW1wbGUgZnJvbSBCbHVldG9vdGggU1BFQyBWNS4yLCBWb2wgMywgUGFydCBHLCBBUFBFTkRJWCBCCi0gIE9jdGV0MTYgZXhwZWN0ZWRfaGFzaHsweEYxLCAweENBLCAweDJELCAweDQ4LCAweEVDLCAweEY1LCAweDhCLCAweEFDLAotICAgICAgICAgICAgICAgICAgICAgICAgMHg4QSwgMHg4OCwgMHgzMCwgMHhCQiwgMHhCOSwgMHhGQiwgMHhBOSwgMHg5MH07Ci0KLSAgT2N0ZXQxNiBoYXNoID0gZGIuSGFzaCgpOwotICAvLyBDb252ZXJ0IG91dHB1dCBoYXNoIGZyb20gbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuCi0gIHN0ZDo6cmV2ZXJzZShoYXNoLmJlZ2luKCksIGhhc2guZW5kKCkpOwotCi0gIEVYUEVDVF9FUShoYXNoLCBleHBlY3RlZF9oYXNoKTsKLX0KLQotLyogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBEZXNjcmlwdG9yIHJlcHJlc2VudGVkIGluIFN0b3JlZEF0dHJpYnV0ZSBoYXZlCi0gKiBwcm9wZXIgYmluYXJ5IGZvcm1hdC4gKi8KLVRFU1QoR2F0dENhY2hlVGVzdCwKLSAgICAgc3RvcmVkX2F0dHJpYnV0ZV90b19iaW5hcnlfY2hhcmFjdGVyaXN0aWNfZXh0ZW5kZWRfcHJvcGVydGllc190ZXN0KSB7Ci0gIFN0b3JlZEF0dHJpYnV0ZSBhdHRyOwotCi0gIC8qIG1ha2Ugc3VyZSBwYWRkaW5nIGF0IGVuZCBvZiB1bmlvbiBpcyBjbGVhcmVkICovCi0gIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKLQotICBhdHRyID0gey5oYW5kbGUgPSAweDAwMDMsCi0gICAgICAgICAgLnR5cGUgPSBVdWlkOjpGcm9tU3RyaW5nKCIyOTAwIiksCi0gICAgICAgICAgLnZhbHVlID0gey5jaGFyYWN0ZXJpc3RpY19leHRlbmRlZF9wcm9wZXJ0aWVzID0gMHgwMDAxfX07Ci0KLSAgY29uc3RleHByIHNpemVfdCBsZW4gPSBzaXplb2YoU3RvcmVkQXR0cmlidXRlKTsKLSAgLy8gY2xhbmctZm9ybWF0IG9mZgotICB1aW50OF90IGJpbmFyeV9mb3JtW2xlbl0gPSB7Ci0gICAgICAvKmhhbmRsZSAqLyAweDAzLCAweDAwLAotICAgICAgLyogdHlwZSAqLyAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVGLCAweDlCLCAweDM0LCAweEZCLAotICAgICAgLyogY2hhcmFjdGVyaXN0aWMgZXh0ZW5kZWQgcHJvcGVydGllcyAqLyAweDAxLCAweDAwLAotICAgICAgLyogY2xlYXIgcGFkZGluZyAgICAqLyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgLy8gY2xhbmctZm9ybWF0IG9uCi0KLSAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmc6Ci0gIC8vIExPRyhFUlJPUikgPDwgIiAiIDw8IGJhc2U6OkhleEVuY29kZSgmYXR0ciwgbGVuKTsKLSAgRVhQRUNUX0VRKG1lbWNtcChiaW5hcnlfZm9ybSwgJmF0dHIsIGxlbiksIDApOwotfQotfSAgLy8gbmFtZXNwYWNlIGdhdHQKZGlmZiAtLWdpdCBhL2J0YS92Yy9kZXZpY2UuY2MgYi9idGEvdmMvZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM1NDA4Li4wMDAwMDAwCi0tLSBhL2J0YS92Yy9kZXZpY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKLSNpbmNsdWRlICJnYXR0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjp2Yzo6aW50ZXJuYWw7Ci0KLXZvaWQgVm9sdW1lQ29udHJvbERldmljZTo6RGlzY29ubmVjdCh0R0FUVF9JRiBnYXR0X2lmKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IHRoaXMtPlRvU3RyaW5nKCk7Ci0KLSAgaWYgKElzQ29ubmVjdGVkKCkpIHsKLSAgICBpZiAodm9sdW1lX3N0YXRlX2hhbmRsZSAhPSAwKQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX3N0YXRlX2hhbmRsZSk7Ci0KLSAgICBpZiAodm9sdW1lX2ZsYWdzX2hhbmRsZSAhPSAwKQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2ZsYWdzX2hhbmRsZSk7Ci0KLSAgICBCdGFHYXR0UXVldWU6OkNsZWFuKGNvbm5lY3Rpb25faWQpOwotICAgIEJUQV9HQVRUQ19DbG9zZShjb25uZWN0aW9uX2lkKTsKLSAgICBjb25uZWN0aW9uX2lkID0gR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci0gIH0gZWxzZSB7Ci0gICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZ2F0dF9pZiwgYWRkcmVzcywgZmFsc2UpOwotICB9Ci0KLSAgZGV2aWNlX3JlYWR5ID0gZmFsc2U7Ci0gIGhhbmRsZXNfcGVuZGluZy5jbGVhcigpOwotfQotCi0vKgotICogRmluZCB0aGUgaGFuZGxlIGZvciB0aGUgY2xpZW50IGNoYXJhY3RlcmlzdGljcyBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4KLSAqIGNoYXJhY3RlcmlzdGljcwotICovCi11aW50MTZfdCBWb2x1bWVDb250cm9sRGV2aWNlOjpmaW5kX2NjY19oYW5kbGUodWludDE2X3QgY2hyY19oYW5kbGUpIHsKLSAgY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHBfY2hhciA9Ci0gICAgICBCVEFfR0FUVENfR2V0Q2hhcmFjdGVyaXN0aWMoY29ubmVjdGlvbl9pZCwgY2hyY19oYW5kbGUpOwotICBpZiAoIXBfY2hhcikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBubyBzdWNoIGhhbmRsZT0iIDw8IGxvZ2hleChjaHJjX2hhbmRsZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBmb3IgKGNvbnN0IGdhdHQ6OkRlc2NyaXB0b3ImIGRlc2MgOiBwX2NoYXItPmRlc2NyaXB0b3JzKSB7Ci0gICAgaWYgKGRlc2MudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpCi0gICAgICByZXR1cm4gZGVzYy5oYW5kbGU7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotYm9vbCBWb2x1bWVDb250cm9sRGV2aWNlOjpzZXRfdm9sdW1lX2NvbnRyb2xfc2VydmljZV9oYW5kbGVzKAotICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UmIHNlcnZpY2UpIHsKLSAgdWludDE2X3Qgc3RhdGVfaGFuZGxlID0gMCwgc3RhdGVfY2NjX2hhbmRsZSA9IDAsIGNvbnRyb2xfcG9pbnRfaGFuZGxlID0gMCwKLSAgICAgICAgICAgZmxhZ3NfaGFuZGxlID0gMCwgZmxhZ3NfY2NjX2hhbmRsZSA9IDA7Ci0KLSAgZm9yIChjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyYgY2hyYyA6IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgaWYgKGNocmMudXVpZCA9PSBrVm9sdW1lQ29udHJvbFN0YXRlVXVpZCkgewotICAgICAgc3RhdGVfaGFuZGxlID0gY2hyYy52YWx1ZV9oYW5kbGU7Ci0gICAgICBzdGF0ZV9jY2NfaGFuZGxlID0gZmluZF9jY2NfaGFuZGxlKGNocmMudmFsdWVfaGFuZGxlKTsKLSAgICB9IGVsc2UgaWYgKGNocmMudXVpZCA9PSBrVm9sdW1lQ29udHJvbFBvaW50VXVpZCkgewotICAgICAgY29udHJvbF9wb2ludF9oYW5kbGUgPSBjaHJjLnZhbHVlX2hhbmRsZTsKLSAgICB9IGVsc2UgaWYgKGNocmMudXVpZCA9PSBrVm9sdW1lRmxhZ3NVdWlkKSB7Ci0gICAgICBmbGFnc19oYW5kbGUgPSBjaHJjLnZhbHVlX2hhbmRsZTsKLSAgICAgIGZsYWdzX2NjY19oYW5kbGUgPSBmaW5kX2NjY19oYW5kbGUoY2hyYy52YWx1ZV9oYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogdW5rbm93biBjaGFyYWN0ZXJpc3RpYz0iIDw8IGNocmMudXVpZDsKLSAgICB9Ci0gIH0KLQotICAvLyBWYWxpZGF0ZSBzZXJ2aWNlIGhhbmRsZXMKLSAgaWYgKEdBVFRfSEFORExFX0lTX1ZBTElEKHN0YXRlX2hhbmRsZSkgJiYKLSAgICAgIEdBVFRfSEFORExFX0lTX1ZBTElEKHN0YXRlX2NjY19oYW5kbGUpICYmCi0gICAgICBHQVRUX0hBTkRMRV9JU19WQUxJRChjb250cm9sX3BvaW50X2hhbmRsZSkgJiYKLSAgICAgIEdBVFRfSEFORExFX0lTX1ZBTElEKGZsYWdzX2hhbmRsZSkKLSAgICAgIC8qIHZvbHVtZV9mbGFnc19jY2NfaGFuZGxlIGlzIG9wdGlvbmFsICovKSB7Ci0gICAgdm9sdW1lX3N0YXRlX2hhbmRsZSA9IHN0YXRlX2hhbmRsZTsKLSAgICB2b2x1bWVfc3RhdGVfY2NjX2hhbmRsZSA9IHN0YXRlX2NjY19oYW5kbGU7Ci0gICAgdm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlID0gY29udHJvbF9wb2ludF9oYW5kbGU7Ci0gICAgdm9sdW1lX2ZsYWdzX2hhbmRsZSA9IGZsYWdzX2hhbmRsZTsKLSAgICB2b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZSA9IGZsYWdzX2NjY19oYW5kbGU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgVm9sdW1lQ29udHJvbERldmljZTo6VXBkYXRlSGFuZGxlcyh2b2lkKSB7Ci0gIFJlc2V0SGFuZGxlcygpOwotCi0gIGJvb2wgdmNzX2ZvdW5kID0gZmFsc2U7Ci0gIGNvbnN0IHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiogc2VydmljZXMgPQotICAgICAgQlRBX0dBVFRDX0dldFNlcnZpY2VzKGNvbm5lY3Rpb25faWQpOwotICBpZiAoc2VydmljZXMgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgIk5vIHNlcnZpY2VzIGZvdW5kIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmb3IgKGF1dG8gY29uc3QmIHNlcnZpY2UgOiAqc2VydmljZXMpIHsKLSAgICBpZiAoc2VydmljZS51dWlkID09IGtWb2x1bWVDb250cm9sVXVpZCkgewotICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBWQ1MsIGhhbmRsZT0iIDw8IGxvZ2hleChzZXJ2aWNlLmhhbmRsZSk7Ci0gICAgICB2Y3NfZm91bmQgPSBzZXRfdm9sdW1lX2NvbnRyb2xfc2VydmljZV9oYW5kbGVzKHNlcnZpY2UpOwotICAgICAgaWYgKCF2Y3NfZm91bmQpIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB2Y3NfZm91bmQ7Ci19Ci0KLXZvaWQgVm9sdW1lQ29udHJvbERldmljZTo6UmVzZXRIYW5kbGVzKHZvaWQpIHsKLSAgZGV2aWNlX3JlYWR5ID0gZmFsc2U7Ci0KLSAgLy8gdGhlIGhhbmRsZXMgYXJlIG5vdCB2YWxpZCwgc28gZGlzY2FyZCBwZW5kaW5nIEdBVFQgb3BlcmF0aW9ucwotICBCdGFHYXR0UXVldWU6OkNsZWFuKGNvbm5lY3Rpb25faWQpOwotCi0gIHZvbHVtZV9zdGF0ZV9oYW5kbGUgPSAwOwotICB2b2x1bWVfc3RhdGVfY2NjX2hhbmRsZSA9IDA7Ci0gIHZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSA9IDA7Ci0gIHZvbHVtZV9mbGFnc19oYW5kbGUgPSAwOwotICB2b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZSA9IDA7Ci19Ci0KLXZvaWQgVm9sdW1lQ29udHJvbERldmljZTo6Q29udHJvbFBvaW50T3BlcmF0aW9uKHVpbnQ4X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNldF92YWx1ZSh7b3Bjb2RlLCBjaGFuZ2VfY291bnRlcn0pOwotICBpZiAoYXJnICE9IG51bGxwdHIpCi0gICAgc2V0X3ZhbHVlLmluc2VydChzZXRfdmFsdWUuZW5kKCksICgqYXJnKS5iZWdpbigpLCAoKmFyZykuZW5kKCkpOwotCi0gIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjb25uZWN0aW9uX2lkLCB2b2x1bWVfY29udHJvbF9wb2ludF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFsdWUsIEdBVFRfV1JJVEUsIGNiLCBjYl9kYXRhKTsKLX0KLQotYm9vbCBWb2x1bWVDb250cm9sRGV2aWNlOjpzdWJzY3JpYmVfZm9yX25vdGlmaWNhdGlvbnModEdBVFRfSUYgZ2F0dF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNjY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiKSB7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhnYXR0X2lmLCBhZGRyZXNzLCBoYW5kbGUpOwotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkLCBzdGF0dXM9IiA8PCBsb2doZXgoK3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUoMik7Ci0gIHVpbnQ4X3QqIHB0ciA9IHZhbHVlLmRhdGEoKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwdHIsIEdBVFRfQ0hBUl9DTElFTlRfQ09ORklHX05PVElGSUNBVElPTik7Ci0gIEJ0YUdhdHRRdWV1ZTo6V3JpdGVEZXNjcmlwdG9yKGNvbm5lY3Rpb25faWQsIGNjY19oYW5kbGUsIHN0ZDo6bW92ZSh2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEUsIGNiLCBudWxscHRyKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBFbnF1ZXVlIEdBVFQgcmVxdWVzdHMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIHRvIGJlCi0gKiBmdW5jdGlvbmFsLiBUaGlzIGluY2x1ZGVzIFN0YXRlIGNoYXJhY3RlcmlzdGljcyByZWFkIGFuZCBzdWJzY3JpcHRpb24uCi0gKiBUaG9zZSBjaGFyYWN0ZXJpc3RpY3MgY29udGFpbiB0aGUgY2hhbmdlIGNvdW50ZXIgbmVlZGVkIHRvIHNlbmQgYW55IHJlcXVlc3QKLSAqIHZpYSBDb250cm9sIFBvaW50LiBPbmNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIHRoZSBkZXZpY2UgY2FuIGJlIHN0b3JlZAotICogYW5kIHJlcG9ydGVkIGFzIGNvbm5lY3RlZC4gSW4gZWFjaCBjYXNlIHdlIHN1YnNjcmliZSBmaXJzdCB0byBiZSBzdXJlIHdlIGRvCi0gKiBub3QgbWlzcyBhbnkgdmFsdWUgY2hhbmdlLgotICovCi1ib29sIFZvbHVtZUNvbnRyb2xEZXZpY2U6OkVucXVldWVJbml0aWFsUmVxdWVzdHMoCi0gICAgdEdBVFRfSUYgZ2F0dF9pZiwgR0FUVF9SRUFEX09QX0NCIGNocmNfcmVhZF9jYiwKLSAgICBHQVRUX1dSSVRFX09QX0NCIGNjY2Rfd3JpdGVfY2IpIHsKLSAgaGFuZGxlc19wZW5kaW5nLmNsZWFyKCk7Ci0gIGhhbmRsZXNfcGVuZGluZy5pbnNlcnQodm9sdW1lX3N0YXRlX2hhbmRsZSk7Ci0gIGhhbmRsZXNfcGVuZGluZy5pbnNlcnQodm9sdW1lX3N0YXRlX2NjY19oYW5kbGUpOwotICBpZiAoIXN1YnNjcmliZV9mb3Jfbm90aWZpY2F0aW9ucyhnYXR0X2lmLCB2b2x1bWVfc3RhdGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfc3RhdGVfY2NjX2hhbmRsZSwgY2NjZF93cml0ZV9jYikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyhjb25uZWN0aW9uX2lkLCB2b2x1bWVfc3RhdGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJjX3JlYWRfY2IsIG51bGxwdHIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIEVucXVldWUgdGhlIHJlbWFpbmluZyByZXF1ZXN0cy4gVGhvc2UgYXJlIG5vdCBzbyBjcnVjaWFsIGFuZCBjYW4gYmUgZG9uZQotICogb25jZSBWb2x1bWUgQ29udHJvbCBpbnN0YW5jZSBpbmRpY2F0ZXMgaXQncyByZWFkaW5lc3MgdG8gcHJvZmlsZS4KLSAqIFRoaXMgaW5jbHVkZXMgY2hhcmFjdGVyaXN0aWNzIHJlYWQgYW5kIHN1YnNjcmlwdGlvbi4KLSAqIEluIGVhY2ggY2FzZSB3ZSBzdWJzY3JpYmUgZmlyc3QgdG8gYmUgc3VyZSB3ZSBkbyBub3QgbWlzcyBhbnkgdmFsdWUgY2hhbmdlLgotICovCi12b2lkIFZvbHVtZUNvbnRyb2xEZXZpY2U6OkVucXVldWVSZW1haW5pbmdSZXF1ZXN0cygKLSAgICB0R0FUVF9JRiBnYXR0X2lmLCBHQVRUX1JFQURfT1BfQ0IgY2hyY19yZWFkX2NiLAotICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2NjZF93cml0ZV9jYikgewotICBzdGQ6Om1hcDx1aW50MTZfdCwgdWludDE2X3Q+IGhhbmRsZV9wYWlyc3sKLSAgICAgIHt2b2x1bWVfZmxhZ3NfaGFuZGxlLCB2b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZX0sCi0gIH07Ci0KLSAgZm9yIChhdXRvIGNvbnN0JiBoYW5kbGVzIDogaGFuZGxlX3BhaXJzKSB7Ci0gICAgaWYgKEdBVFRfSEFORExFX0lTX1ZBTElEKGhhbmRsZXMuc2Vjb25kKSkgewotICAgICAgc3Vic2NyaWJlX2Zvcl9ub3RpZmljYXRpb25zKGdhdHRfaWYsIGhhbmRsZXMuZmlyc3QsIGhhbmRsZXMuc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjY2Rfd3JpdGVfY2IpOwotICAgIH0KLQotICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGNvbm5lY3Rpb25faWQsIGhhbmRsZXMuZmlyc3QsIGNocmNfcmVhZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgfQotfQotCi1ib29sIFZvbHVtZUNvbnRyb2xEZXZpY2U6OlZlcmlmeVJlYWR5KHVpbnQxNl90IGhhbmRsZSkgewotICBoYW5kbGVzX3BlbmRpbmcuZXJhc2UoaGFuZGxlKTsKLSAgZGV2aWNlX3JlYWR5ID0gaGFuZGxlc19wZW5kaW5nLnNpemUoKSA9PSAwOwotICByZXR1cm4gZGV2aWNlX3JlYWR5OwotfQotCi1ib29sIFZvbHVtZUNvbnRyb2xEZXZpY2U6OklzRW5jcnlwdGlvbkVuYWJsZWQoKSB7Ci0gIHJldHVybiBCVE1fSXNFbmNyeXB0ZWQoYWRkcmVzcywgQlRfVFJBTlNQT1JUX0xFKTsKLX0KLQotYm9vbCBWb2x1bWVDb250cm9sRGV2aWNlOjpFbmFibGVFbmNyeXB0aW9uKHRCVE1fU0VDX0NBTExCQUNLKiBjYWxsYmFjaykgewotICBpbnQgcmVzdWx0ID0gQlRNX1NldEVuY3J5cHRpb24oYWRkcmVzcywgQlRfVFJBTlNQT1JUX0xFLCBjYWxsYmFjaywgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfU0VDX0VOQ1JZUFQpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcmVzdWx0PSIgPDwgK3Jlc3VsdDsKLSAgLy8gVE9ETzogc2hvdWxkIHdlIGNhcmUgYWJvdXQgdGhlIHJlc3VsdD8/Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYnRhL3ZjL2RldmljZXMuaCBiL2J0YS92Yy9kZXZpY2VzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGM2YzkuLjAwMDAwMDAKLS0tIGEvYnRhL3ZjL2RldmljZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGEvdmMvdHlwZXMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X3ZjLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdmMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgVm9sdW1lQ29udHJvbERldmljZSB7Ci0gcHVibGljOgotICBSYXdBZGRyZXNzIGFkZHJlc3M7Ci0gIC8qIFRoaXMgaXMgdHJ1ZSBvbmx5IGR1cmluZyBmaXJzdCBjb25uZWN0aW9uIHRvIHByb2ZpbGUsIHVudGlsIHdlIHN0b3JlIHRoZQotICAgKiBkZXZpY2UKLSAgICovCi0gIGJvb2wgZmlyc3RfY29ubmVjdGlvbjsKLQotICAvKiB3ZSBhcmUgbWFraW5nIGFjdGl2ZSBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhpcyBkZXZpY2UsICdkaXJlY3QgY29ubmVjdCcuCi0gICAqIFRoaXMgaXMgdHJ1ZSBvbmx5IGR1cmluZyBpbml0aWFsIHBoYXNlIG9mIGZpcnN0IGNvbm5lY3Rpb24uICovCi0gIGJvb2wgY29ubmVjdGluZ19hY3RpdmVseTsKLQotICBib29sIHNlcnZpY2VfY2hhbmdlZF9yY3ZkOwotCi0gIHVpbnQ4X3Qgdm9sdW1lOwotICB1aW50OF90IGNoYW5nZV9jb3VudGVyOwotICBib29sIG11dGU7Ci0gIHVpbnQ4X3QgZmxhZ3M7Ci0KLSAgdWludDE2X3QgY29ubmVjdGlvbl9pZDsKLQotICAvKiBWb2x1bWUgQ29udHJvbCBTZXJ2aWNlICovCi0gIHVpbnQxNl90IHZvbHVtZV9zdGF0ZV9oYW5kbGU7Ci0gIHVpbnQxNl90IHZvbHVtZV9zdGF0ZV9jY2NfaGFuZGxlOwotICB1aW50MTZfdCB2b2x1bWVfY29udHJvbF9wb2ludF9oYW5kbGU7Ci0gIHVpbnQxNl90IHZvbHVtZV9mbGFnc19oYW5kbGU7Ci0gIHVpbnQxNl90IHZvbHVtZV9mbGFnc19jY2NfaGFuZGxlOwotCi0gIGJvb2wgZGV2aWNlX3JlYWR5OyAvKiBTZXQgd2hlbiBkZXZpY2UgcmVhZCBzZXJ2ZXIgc3RhdHVzIGFuZCByZWdpc3RnZXJlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMgKi8KLQotICBWb2x1bWVDb250cm9sRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGJvb2wgZmlyc3RfY29ubmVjdGlvbikKLSAgICAgIDogYWRkcmVzcyhhZGRyZXNzKSwKLSAgICAgICAgZmlyc3RfY29ubmVjdGlvbihmaXJzdF9jb25uZWN0aW9uKSwKLSAgICAgICAgY29ubmVjdGluZ19hY3RpdmVseShmaXJzdF9jb25uZWN0aW9uKSwKLSAgICAgICAgc2VydmljZV9jaGFuZ2VkX3JjdmQoZmFsc2UpLAotICAgICAgICB2b2x1bWUoMCksCi0gICAgICAgIGNoYW5nZV9jb3VudGVyKDApLAotICAgICAgICBtdXRlKGZhbHNlKSwKLSAgICAgICAgZmxhZ3MoMCksCi0gICAgICAgIGNvbm5lY3Rpb25faWQoR0FUVF9JTlZBTElEX0NPTk5fSUQpLAotICAgICAgICB2b2x1bWVfc3RhdGVfaGFuZGxlKDApLAotICAgICAgICB2b2x1bWVfc3RhdGVfY2NjX2hhbmRsZSgwKSwKLSAgICAgICAgdm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlKDApLAotICAgICAgICB2b2x1bWVfZmxhZ3NfaGFuZGxlKDApLAotICAgICAgICB2b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZSgwKSwKLSAgICAgICAgZGV2aWNlX3JlYWR5KGZhbHNlKSB7fQotCi0gIH5Wb2x1bWVDb250cm9sRGV2aWNlKCkgPSBkZWZhdWx0OwotCi0gIGlubGluZSBzdGQ6OnN0cmluZyBUb1N0cmluZygpIHsgcmV0dXJuIGFkZHJlc3MuVG9TdHJpbmcoKTsgfQotCi0gIHZvaWQgRGVidWdEdW1wKGludCBmZCkgeyBkcHJpbnRmKGZkLCAiJXNcbiIsIHRoaXMtPlRvU3RyaW5nKCkuY19zdHIoKSk7IH0KLQotICBib29sIElzQ29ubmVjdGVkKCkgeyByZXR1cm4gY29ubmVjdGlvbl9pZCAhPSBHQVRUX0lOVkFMSURfQ09OTl9JRDsgfQotCi0gIHZvaWQgRGlzY29ubmVjdCh0R0FUVF9JRiBnYXR0X2lmKTsKLQotICBib29sIFVwZGF0ZUhhbmRsZXModm9pZCk7Ci0KLSAgdm9pZCBSZXNldEhhbmRsZXModm9pZCk7Ci0KLSAgYm9vbCBIYXNIYW5kbGVzKHZvaWQpIHsgcmV0dXJuIEdBVFRfSEFORExFX0lTX1ZBTElEKHZvbHVtZV9zdGF0ZV9oYW5kbGUpOyB9Ci0KLSAgdm9pZCBDb250cm9sUG9pbnRPcGVyYXRpb24odWludDhfdCBvcGNvZGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBhcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpOwotICBib29sIElzRW5jcnlwdGlvbkVuYWJsZWQoKTsKLQotICBib29sIEVuYWJsZUVuY3J5cHRpb24odEJUTV9TRUNfQ0FMTEJBQ0sqIGNhbGxiYWNrKTsKLQotICBib29sIEVucXVldWVJbml0aWFsUmVxdWVzdHModEdBVFRfSUYgZ2F0dF9pZiwgR0FUVF9SRUFEX09QX0NCIGNocmNfcmVhZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2NjZF93cml0ZV9jYik7Ci0gIHZvaWQgRW5xdWV1ZVJlbWFpbmluZ1JlcXVlc3RzKHRHQVRUX0lGIGdhdHRfaWYsIEdBVFRfUkVBRF9PUF9DQiBjaHJjX3JlYWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2NjZF93cml0ZV9jYik7Ci0gIGJvb2wgVmVyaWZ5UmVhZHkodWludDE2X3QgaGFuZGxlKTsKLQotIHByaXZhdGU6Ci0gIC8qCi0gICAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgcGVuZGluZyBHQVRUIG9wZXJhdGlvbiBoYW5kbGVzLiBPbmNlIHRoZSBsaXN0IGlzCi0gICAqIGVtcHR5IHRoZSBkZXZpY2UgaXMgYXNzdW1lZCByZWFkeSBhbmQgY29ubmVjdGVkLiBXZSBhcmUgZG9pbmcgaXQgYmVjYXVzZSB3ZQotICAgKiB3YW50IHRvIG1ha2Ugc3VyZSBhbGwgdGhlIHJlcXVpcmVkIGNoYXJhY3RlcmlzdGljcyBhbmQgZGVzY3JpdG9ycyBhcmUKLSAgICogYXZhaWxhYmxlIG9uIHNlcnZlciBzaWRlLgotICAgKi8KLSAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQxNl90PiBoYW5kbGVzX3BlbmRpbmc7Ci0KLSAgdWludDE2X3QgZmluZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNocmNfaGFuZGxlKTsKLSAgYm9vbCBzZXRfdm9sdW1lX2NvbnRyb2xfc2VydmljZV9oYW5kbGVzKGNvbnN0IGdhdHQ6OlNlcnZpY2UmIHNlcnZpY2UpOwotICBib29sIHN1YnNjcmliZV9mb3Jfbm90aWZpY2F0aW9ucyh0R0FUVF9JRiBnYXR0X2lmLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNjY19oYW5kbGUsIEdBVFRfV1JJVEVfT1BfQ0IgY2IpOwotfTsKLQotY2xhc3MgVm9sdW1lQ29udHJvbERldmljZXMgewotIHB1YmxpYzoKLSAgdm9pZCBBZGQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBmaXJzdF9jb25uZWN0aW9uKSB7Ci0gICAgaWYgKEZpbmRCeUFkZHJlc3MoYWRkcmVzcykgIT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgZGV2aWNlc18uZW1wbGFjZV9iYWNrKGFkZHJlc3MsIGZpcnN0X2Nvbm5lY3Rpb24pOwotICB9Ci0KLSAgdm9pZCBSZW1vdmUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIGZvciAoYXV0byBpdCA9IGRldmljZXNfLmJlZ2luKCk7IGl0ICE9IGRldmljZXNfLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoaXQtPmFkZHJlc3MgPT0gYWRkcmVzcykgewotICAgICAgICBpdCA9IGRldmljZXNfLmVyYXNlKGl0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgVm9sdW1lQ29udHJvbERldmljZSogRmluZEJ5QWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXNfLmJlZ2luKCksIGRldmljZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmFkZHJlc3NdKGNvbnN0IFZvbHVtZUNvbnRyb2xEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuYWRkcmVzcyA9PSBhZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBWb2x1bWVDb250cm9sRGV2aWNlKiBGaW5kQnlDb25uSWQodWludDE2X3QgY29ubmVjdGlvbl9pZCkgewotICAgIGF1dG8gaXRlciA9Ci0gICAgICAgIHN0ZDo6ZmluZF9pZihkZXZpY2VzXy5iZWdpbigpLCBkZXZpY2VzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgIFsmY29ubmVjdGlvbl9pZF0oY29uc3QgVm9sdW1lQ29udHJvbERldmljZSYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuY29ubmVjdGlvbl9pZCA9PSBjb25uZWN0aW9uX2lkOwotICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gKGl0ZXIgPT0gZGV2aWNlc18uZW5kKCkpID8gbnVsbHB0ciA6ICYoKml0ZXIpOwotICB9Ci0KLSAgc2l6ZV90IFNpemUoKSB7IHJldHVybiAoZGV2aWNlc18uc2l6ZSgpKTsgfQotCi0gIHZvaWQgQ2xlYXIoKSB7IGRldmljZXNfLmNsZWFyKCk7IH0KLQotICB2b2lkIERlYnVnRHVtcChpbnQgZmQpIHsKLSAgICBmb3IgKGF1dG8mIGRldmljZSA6IGRldmljZXNfKSB7Ci0gICAgICBkZXZpY2UuRGVidWdEdW1wKGZkKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QodEdBVFRfSUYgZ2F0dF9pZikgewotICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlc18pIHsKLSAgICAgIGRldmljZS5EaXNjb25uZWN0KGdhdHRfaWYpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgQ29udHJvbFBvaW50T3BlcmF0aW9uKHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+JiBkZXZpY2VzLCB1aW50OF90IG9wY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICAgIGZvciAoYXV0byYgYWRkciA6IGRldmljZXMpIHsKLSAgICAgIFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSA9IEZpbmRCeUFkZHJlc3MoYWRkcik7Ci0gICAgICBpZiAoZGV2aWNlICYmIGRldmljZS0+SXNDb25uZWN0ZWQoKSkKLSAgICAgICAgZGV2aWNlLT5Db250cm9sUG9pbnRPcGVyYXRpb24ob3Bjb2RlLCBhcmcsIGNiLCBjYl9kYXRhKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPFZvbHVtZUNvbnRyb2xEZXZpY2U+IGRldmljZXNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdmMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS92Yy9kZXZpY2VzX3Rlc3QuY2MgYi9idGEvdmMvZGV2aWNlc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTE2NjkyLi4wMDAwMDAwCi0tLSBhL2J0YS92Yy9kZXZpY2VzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImRldmljZXMuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaV9tb2NrLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWVfbW9jay5oIgotI2luY2x1ZGUgImJ0bV9hcGlfbW9jay5oIgotI2luY2x1ZGUgImdhdHQvZGF0YWJhc2VfYnVpbGRlci5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdmMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpNb2NrOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlNldEFyZ1BvaW50ZWU7Ci11c2luZyA6OnRlc3Rpbmc6OlRlc3Q7Ci0KLVJhd0FkZHJlc3MgR2V0VGVzdEFkZHJlc3MoaW50IGluZGV4KSB7Ci0gIENIRUNLX0xUKGluZGV4LCBVSU5UOF9NQVgpOwotICBSYXdBZGRyZXNzIHJlc3VsdCA9IHsKLSAgICAgIHsweEMwLCAweERFLCAweEMwLCAweERFLCAweDAwLCBzdGF0aWNfY2FzdDx1aW50OF90PihpbmRleCl9fTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY2xhc3MgVm9sdW1lQ29udHJvbERldmljZXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGRldmljZXNfID0gbmV3IFZvbHVtZUNvbnRyb2xEZXZpY2VzKCk7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRJbnRlcmZhY2UoJmdhdHRfaW50ZXJmYWNlKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dFF1ZXVlKCZnYXR0X3F1ZXVlKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRRdWV1ZShudWxscHRyKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dEludGVyZmFjZShudWxscHRyKTsKLSAgICBkZWxldGUgZGV2aWNlc187Ci0gIH0KLQotICBWb2x1bWVDb250cm9sRGV2aWNlcyogZGV2aWNlc18gPSBudWxscHRyOwotICBnYXR0OjpNb2NrQnRhR2F0dEludGVyZmFjZSBnYXR0X2ludGVyZmFjZTsKLSAgZ2F0dDo6TW9ja0J0YUdhdHRRdWV1ZSBnYXR0X3F1ZXVlOwotfTsKLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xEZXZpY2VzVGVzdCwgdGVzdF9hZGQpIHsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBBU1NFUlRfRVEoKHNpemVfdCkwLCBkZXZpY2VzXy0+U2l6ZSgpKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMCwgdHJ1ZSk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGRldmljZXNfLT5TaXplKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZXNUZXN0LCB0ZXN0X2FkZF90d2ljZSkgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTAsIGRldmljZXNfLT5TaXplKCkpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMCwgdHJ1ZSk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGRldmljZXNfLT5TaXplKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZXNUZXN0LCB0ZXN0X3JlbW92ZSkgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzEgPSBHZXRUZXN0QWRkcmVzcygxKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMCwgdHJ1ZSk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzEsIHRydWUpOwotICBBU1NFUlRfRVEoKHNpemVfdCkyLCBkZXZpY2VzXy0+U2l6ZSgpKTsKLSAgZGV2aWNlc18tPlJlbW92ZSh0ZXN0X2FkZHJlc3NfMCk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGRldmljZXNfLT5TaXplKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZXNUZXN0LCB0ZXN0X2NsZWFyKSB7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzAgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgQVNTRVJUX0VRKChzaXplX3QpMCwgZGV2aWNlc18tPlNpemUoKSk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzAsIHRydWUpOwotICBBU1NFUlRfRVEoKHNpemVfdCkxLCBkZXZpY2VzXy0+U2l6ZSgpKTsKLSAgZGV2aWNlc18tPkNsZWFyKCk7Ci0gIEFTU0VSVF9FUSgoc2l6ZV90KTAsIGRldmljZXNfLT5TaXplKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZXNUZXN0LCB0ZXN0X2ZpbmRfYnlfYWRkcmVzcykgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzEgPSBHZXRUZXN0QWRkcmVzcygxKTsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMiA9IEdldFRlc3RBZGRyZXNzKDIpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18wLCB0cnVlKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMSwgZmFsc2UpOwotICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzc18yLCB0cnVlKTsKLSAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0gZGV2aWNlc18tPkZpbmRCeUFkZHJlc3ModGVzdF9hZGRyZXNzXzEpOwotICBBU1NFUlRfTkUobnVsbHB0ciwgZGV2aWNlKTsKLSAgQVNTRVJUX0VRKHRlc3RfYWRkcmVzc18xLCBkZXZpY2UtPmFkZHJlc3MpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZXNUZXN0LCB0ZXN0X2ZpbmRfYnlfY29ubl9pZCkgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzAsIHRydWUpOwotICBWb2x1bWVDb250cm9sRGV2aWNlKiB0ZXN0X2RldmljZSA9IGRldmljZXNfLT5GaW5kQnlBZGRyZXNzKHRlc3RfYWRkcmVzc18wKTsKLSAgdGVzdF9kZXZpY2UtPmNvbm5lY3Rpb25faWQgPSAweDAwMDU7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBkZXZpY2VzXy0+RmluZEJ5Q29ubklkKHRlc3RfZGV2aWNlLT5jb25uZWN0aW9uX2lkKSk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sRGV2aWNlc1Rlc3QsIHRlc3RfZGlzY29ubmVjdCkgewotICBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18wID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzXzEgPSBHZXRUZXN0QWRkcmVzcygxKTsKLSAgZGV2aWNlc18tPkFkZCh0ZXN0X2FkZHJlc3NfMCwgdHJ1ZSk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzXzEsIHRydWUpOwotICBWb2x1bWVDb250cm9sRGV2aWNlKiB0ZXN0X2RldmljZV8wID0gZGV2aWNlc18tPkZpbmRCeUFkZHJlc3ModGVzdF9hZGRyZXNzXzApOwotICB0ZXN0X2RldmljZV8wLT5jb25uZWN0aW9uX2lkID0gMHgwMDA1OwotICB0R0FUVF9JRiBnYXR0X2lmID0gODsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIENsb3NlKHRlc3RfZGV2aWNlXzAtPmNvbm5lY3Rpb25faWQpKTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIENhbmNlbE9wZW4oZ2F0dF9pZiwgdGVzdF9hZGRyZXNzXzEsIF8pKTsKLSAgZGV2aWNlc18tPkRpc2Nvbm5lY3QoZ2F0dF9pZik7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sRGV2aWNlc1Rlc3QsIHRlc3RfY29udHJvbF9wb2ludF9vcGVyYXRpb24pIHsKLSAgdWludDhfdCBvcGNvZGUgPSA1MDsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2aWNlczsKLQotICBmb3IgKGludCBpID0gNTsgaSA+IDA7IGktLSkgewotICAgIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoaSk7Ci0gICAgZGV2aWNlcy5wdXNoX2JhY2sodGVzdF9hZGRyZXNzKTsKLSAgICB1aW50OF90IGNoYW5nZV9jb3VudGVyID0gMTAgKiBpOwotICAgIHVpbnQxNl90IGNvbnRyb2xfcG9pbnRfaGFuZGxlID0gMHgwMDIwICsgaTsKLSAgICB1aW50MTZfdCBjb25uZWN0aW9uX2lkID0gaTsKLSAgICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzcywgdHJ1ZSk7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0gZGV2aWNlc18tPkZpbmRCeUFkZHJlc3ModGVzdF9hZGRyZXNzKTsKLSAgICBkZXZpY2UtPmNvbm5lY3Rpb25faWQgPSBjb25uZWN0aW9uX2lkOwotICAgIGRldmljZS0+Y2hhbmdlX2NvdW50ZXIgPSBjaGFuZ2VfY291bnRlcjsKLSAgICBkZXZpY2UtPnZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSA9IGNvbnRyb2xfcG9pbnRfaGFuZGxlOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfZXhwZWN0ZWQoe29wY29kZSwgY2hhbmdlX2NvdW50ZXJ9KTsKLQotICAgIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYyhjb25uZWN0aW9uX2lkLCBjb250cm9sX3BvaW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZXhwZWN0ZWQsIEdBVFRfV1JJVEUsIF8sIF8pKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBhcmcgPSBudWxscHRyOwotICBHQVRUX1dSSVRFX09QX0NCIGNiID0gbnVsbHB0cjsKLSAgdm9pZCogY2JfZGF0YSA9IG51bGxwdHI7Ci0gIGRldmljZXNfLT5Db250cm9sUG9pbnRPcGVyYXRpb24oZGV2aWNlcywgb3Bjb2RlLCBhcmcsIGNiLCBjYl9kYXRhKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xEZXZpY2VzVGVzdCwgdGVzdF9jb250cm9sX3BvaW50X29wZXJhdGlvbl9hcmdzKSB7Ci0gIHVpbnQ4X3Qgb3Bjb2RlID0gNjA7Ci0gIHVpbnQ4X3QgYXJnXzEgPSAweDAyOwotICB1aW50OF90IGFyZ18yID0gMHgwNTsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2aWNlczsKLQotICBmb3IgKGludCBpID0gNTsgaSA+IDA7IGktLSkgewotICAgIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoaSk7Ci0gICAgZGV2aWNlcy5wdXNoX2JhY2sodGVzdF9hZGRyZXNzKTsKLSAgICB1aW50OF90IGNoYW5nZV9jb3VudGVyID0gMTAgKiBpOwotICAgIHVpbnQxNl90IGNvbnRyb2xfcG9pbnRfaGFuZGxlID0gMHgwMDIwICsgaTsKLSAgICB1aW50MTZfdCBjb25uZWN0aW9uX2lkID0gaTsKLSAgICBkZXZpY2VzXy0+QWRkKHRlc3RfYWRkcmVzcywgdHJ1ZSk7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0gZGV2aWNlc18tPkZpbmRCeUFkZHJlc3ModGVzdF9hZGRyZXNzKTsKLSAgICBkZXZpY2UtPmNvbm5lY3Rpb25faWQgPSBjb25uZWN0aW9uX2lkOwotICAgIGRldmljZS0+Y2hhbmdlX2NvdW50ZXIgPSBjaGFuZ2VfY291bnRlcjsKLSAgICBkZXZpY2UtPnZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSA9IGNvbnRyb2xfcG9pbnRfaGFuZGxlOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfZXhwZWN0ZWQoe29wY29kZSwgY2hhbmdlX2NvdW50ZXIsIGFyZ18xLCBhcmdfMn0pOwotCi0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKGNvbm5lY3Rpb25faWQsIGNvbnRyb2xfcG9pbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9leHBlY3RlZCwgR0FUVF9XUklURSwgXywgXykpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXJnKHthcmdfMSwgYXJnXzJ9KTsKLSAgR0FUVF9XUklURV9PUF9DQiBjYiA9IG51bGxwdHI7Ci0gIHZvaWQqIGNiX2RhdGEgPSBudWxscHRyOwotICBkZXZpY2VzXy0+Q29udHJvbFBvaW50T3BlcmF0aW9uKGRldmljZXMsIG9wY29kZSwgJmFyZywgY2IsIGNiX2RhdGEpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZXNUZXN0LCB0ZXN0X2NvbnRyb2xfcG9pbnRfc2tpcF9ub3RfY29ubmVjdGVkKSB7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIGRldmljZXNfLT5BZGQodGVzdF9hZGRyZXNzLCB0cnVlKTsKLSAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0gZGV2aWNlc18tPkZpbmRCeUFkZHJlc3ModGVzdF9hZGRyZXNzKTsKLSAgZGV2aWNlLT5jb25uZWN0aW9uX2lkID0gR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci0gIHVpbnQxNl90IGNvbnRyb2xfcG9pbnRfaGFuZGxlID0gMHgwMDIwOwotICBkZXZpY2UtPnZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSA9IGNvbnRyb2xfcG9pbnRfaGFuZGxlOwotCi0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsCi0gICAgICAgICAgICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWMoXywgY29udHJvbF9wb2ludF9oYW5kbGUsIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDApOwotCi0gIHVpbnQ4X3Qgb3Bjb2RlID0gNTsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2aWNlcyA9IHt0ZXN0X2FkZHJlc3N9OwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogYXJnID0gbnVsbHB0cjsKLSAgR0FUVF9XUklURV9PUF9DQiBjYiA9IG51bGxwdHI7Ci0gIHZvaWQqIGNiX2RhdGEgPSBudWxscHRyOwotICBkZXZpY2VzXy0+Q29udHJvbFBvaW50T3BlcmF0aW9uKGRldmljZXMsIG9wY29kZSwgYXJnLCBjYiwgY2JfZGF0YSk7Ci19Ci0KLWNsYXNzIFZvbHVtZUNvbnRyb2xEZXZpY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGRldmljZSA9IG5ldyBWb2x1bWVDb250cm9sRGV2aWNlKEdldFRlc3RBZGRyZXNzKDEpLCB0cnVlKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dEludGVyZmFjZSgmZ2F0dF9pbnRlcmZhY2UpOwotICAgIGdhdHQ6OlNldE1vY2tCdGFHYXR0UXVldWUoJmdhdHRfcXVldWUpOwotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja0J0bUludGVyZmFjZSgmYnRtX2ludGVyZmFjZSk7Ci0KLSAgICBPTl9DQUxMKGdhdHRfaW50ZXJmYWNlLCBHZXRDaGFyYWN0ZXJpc3RpYyhfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBJbnZva2UoWyZdKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgLT4gY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHsKLSAgICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIGNoYXJhY3RlcmlzdGljIDogc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYy52YWx1ZV9oYW5kbGUgPT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAmY2hhcmFjdGVyaXN0aWM7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgICAgICB9KSk7Ci0KLSAgICBPTl9DQUxMKGdhdHRfaW50ZXJmYWNlLCBHZXRPd25pbmdTZXJ2aWNlKF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoCi0gICAgICAgICAgICBbJl0odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlKSAtPiBjb25zdCBnYXR0OjpTZXJ2aWNlKiB7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgc2VydmljZSA6IHNlcnZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaGFuZGxlIDw9IGhhbmRsZSAmJiBzZXJ2aWNlLmVuZF9oYW5kbGUgPj0gaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gJnNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgICAgICB9KSk7Ci0KLSAgICBPTl9DQUxMKGdhdHRfaW50ZXJmYWNlLCBHZXRTZXJ2aWNlcyhfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oJnNlcnZpY2VzKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja0J0bUludGVyZmFjZShudWxscHRyKTsKLSAgICBnYXR0OjpTZXRNb2NrQnRhR2F0dFF1ZXVlKG51bGxwdHIpOwotICAgIGdhdHQ6OlNldE1vY2tCdGFHYXR0SW50ZXJmYWNlKG51bGxwdHIpOwotICAgIGRlbGV0ZSBkZXZpY2U7Ci0gIH0KLQotICAvKiBzYW1wbGUgZGF0YWJhc2UgMXhWQ1MsIDJ4QUlDUywgMnhWT0NTICovCi0gIHZvaWQgU2V0U2FtcGxlRGF0YWJhc2UxKHZvaWQpIHsKLSAgICBnYXR0OjpEYXRhYmFzZUJ1aWxkZXIgYnVpbGRlcjsKLSAgICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDAxLCAweDAwMTYsIGtWb2x1bWVDb250cm9sVXVpZCwgdHJ1ZSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgMHgwMDEwLCAweDAwMTEsIGtWb2x1bWVDb250cm9sU3RhdGVVdWlkLAotICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotICAgIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMTMsIDB4MDAxNCwga1ZvbHVtZUNvbnRyb2xQb2ludFV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEUpOwotICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDE1LCAweDAwMTYsIGtWb2x1bWVGbGFnc1V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDBhMCwgMHgwMGEzLAotICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpLCB0cnVlKTsKLSAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDBhMSwgMHgwMGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9HQVRUX1NSVl9DSEdEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotICAgIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwYTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgc2VydmljZXMgPSBidWlsZGVyLkJ1aWxkKCkuU2VydmljZXMoKTsKLSAgICBBU1NFUlRfRVEodHJ1ZSwgZGV2aWNlLT5VcGRhdGVIYW5kbGVzKCkpOwotICB9Ci0KLSAgLyogc2FtcGxlIGRhdGFiYXNlIG5vIFZDUyAqLwotICB2b2lkIFNldFNhbXBsZURhdGFiYXNlMih2b2lkKSB7Ci0gICAgZ2F0dDo6RGF0YWJhc2VCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwMSwgMHgwMDAzLCBVdWlkOjpGcm9tMTZCaXQoMHgxODAwKSwgdHJ1ZSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMDIsIDB4MDAwMywgVXVpZDo6RnJvbTE2Qml0KDB4MmEwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgc2VydmljZXMgPSBidWlsZGVyLkJ1aWxkKCkuU2VydmljZXMoKTsKLSAgICBBU1NFUlRfRVEoZmFsc2UsIGRldmljZS0+VXBkYXRlSGFuZGxlcygpKTsKLSAgfQotCi0gIFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSA9IG51bGxwdHI7Ci0gIGdhdHQ6Ok1vY2tCdGFHYXR0SW50ZXJmYWNlIGdhdHRfaW50ZXJmYWNlOwotICBnYXR0OjpNb2NrQnRhR2F0dFF1ZXVlIGdhdHRfcXVldWU7Ci0gIGJsdWV0b290aDo6bWFuYWdlcjo6TW9ja0J0bUludGVyZmFjZSBidG1faW50ZXJmYWNlOwotICBzdGQ6Omxpc3Q8Z2F0dDo6U2VydmljZT4gc2VydmljZXM7Ci19OwotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZVRlc3QsIHRlc3Rfc2VydmljZV92b2x1bWVfY29udHJvbF9ub3RfZm91bmQpIHsKLSAgU2V0U2FtcGxlRGF0YWJhc2UyKCk7Ci0gIEFTU0VSVF9FUShmYWxzZSwgZGV2aWNlLT5IYXNIYW5kbGVzKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZVRlc3QsIHRlc3Rfc2VydmljZV92b2x1bWVfY29udHJvbF9pbmNvbXBsZXRlKSB7Ci0gIGdhdHQ6OkRhdGFiYXNlQnVpbGRlciBidWlsZGVyOwotICBidWlsZGVyLkFkZFNlcnZpY2UoMHgwMDAxLCAweDAwMDYsIGtWb2x1bWVDb250cm9sVXVpZCwgdHJ1ZSk7Ci0gIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAweDAwMDIsIDB4MDAwMywga1ZvbHVtZUNvbnRyb2xTdGF0ZVV1aWQsCi0gICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDA0LCBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRykpOwotICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDAwNSwgMHgwMDA2LCBrVm9sdW1lQ29udHJvbFBvaW50VXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEUpOwotICAvKiBubyBWb2x1bWUgQ29udHJvbCBGbGFncyBjaGFyYWN0ZXJpc3RpYyAqLwotICBzZXJ2aWNlcyA9IGJ1aWxkZXIuQnVpbGQoKS5TZXJ2aWNlcygpOwotICBBU1NFUlRfRVEoZmFsc2UsIGRldmljZS0+VXBkYXRlSGFuZGxlcygpKTsKLSAgQVNTRVJUX0VRKDB4MDAwMCwgZGV2aWNlLT52b2x1bWVfc3RhdGVfaGFuZGxlKTsKLSAgQVNTRVJUX0VRKDB4MDAwMCwgZGV2aWNlLT52b2x1bWVfc3RhdGVfY2NjX2hhbmRsZSk7Ci0gIEFTU0VSVF9FUSgweDAwMDAsIGRldmljZS0+dm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlKTsKLSAgQVNTRVJUX0VRKDB4MDAwMCwgZGV2aWNlLT52b2x1bWVfZmxhZ3NfaGFuZGxlKTsKLSAgQVNTRVJUX0VRKDB4MDAwMCwgZGV2aWNlLT52b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZSk7Ci0gIEFTU0VSVF9FUShmYWxzZSwgZGV2aWNlLT5IYXNIYW5kbGVzKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZVRlc3QsIHRlc3Rfc2VydmljZXNfY2hhbmdlZCkgewotICBTZXRTYW1wbGVEYXRhYmFzZTEoKTsKLSAgQVNTRVJUX05FKDAsIGRldmljZS0+dm9sdW1lX3N0YXRlX2hhbmRsZSk7Ci0gIEFTU0VSVF9ORSgwLCBkZXZpY2UtPnZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSk7Ci0gIEFTU0VSVF9ORSgwLCBkZXZpY2UtPnZvbHVtZV9mbGFnc19oYW5kbGUpOwotICBBU1NFUlRfRVEodHJ1ZSwgZGV2aWNlLT5IYXNIYW5kbGVzKCkpOwotICBTZXRTYW1wbGVEYXRhYmFzZTIoKTsKLSAgQVNTRVJUX0VRKDAsIGRldmljZS0+dm9sdW1lX3N0YXRlX2hhbmRsZSk7Ci0gIEFTU0VSVF9FUSgwLCBkZXZpY2UtPnZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSk7Ci0gIEFTU0VSVF9FUSgwLCBkZXZpY2UtPnZvbHVtZV9mbGFnc19oYW5kbGUpOwotICBBU1NFUlRfRVEoZmFsc2UsIGRldmljZS0+SGFzSGFuZGxlcygpKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xEZXZpY2VUZXN0LCB0ZXN0X2VucXVldWVfaW5pdGlhbF9yZXF1ZXN0cykgewotICBTZXRTYW1wbGVEYXRhYmFzZTEoKTsKLQotICB0R0FUVF9JRiBnYXR0X2lmID0gMHgwMDAxOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uX2RhdGEoezB4MDEsIDB4MDB9KTsKLQotICBzdGQ6Om1hcDx1aW50MTZfdCwgdWludDE2X3Q+IGV4cGVjdGVkX3RvX3JlYWRfd3JpdGV7Ci0gICAgICB7MHgwMDExLCAweDAwMTJ9IC8qIHZvbHVtZSBjb250cm9sIHN0YXRlICovfTsKLQotICBmb3IgKGF1dG8gY29uc3QmIGhhbmRsZV9wYWlyIDogZXhwZWN0ZWRfdG9fcmVhZF93cml0ZSkgewotICAgIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsIFJlYWRDaGFyYWN0ZXJpc3RpYyhfLCBoYW5kbGVfcGFpci5maXJzdCwgXywgXykpOwotICAgIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsIFdyaXRlRGVzY3JpcHRvcihfLCBoYW5kbGVfcGFpci5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgXywgXykpOwotICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhnYXR0X2lmLCBfLCBoYW5kbGVfcGFpci5maXJzdCkpOwotICB9Ci0KLSAgYXV0byBjaHJjX3JlYWRfY2IgPSBbXSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkge307Ci0gIGF1dG8gY2NjZF93cml0ZV9jYiA9IFtdKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkge307Ci0gIEFTU0VSVF9FUSh0cnVlLCBkZXZpY2UtPkVucXVldWVJbml0aWFsUmVxdWVzdHMoZ2F0dF9pZiwgY2hyY19yZWFkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjY2Rfd3JpdGVfY2IpKTsKLX07Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sRGV2aWNlVGVzdCwgdGVzdF9kZXZpY2VfcmVhZHkpIHsKLSAgU2V0U2FtcGxlRGF0YWJhc2UxKCk7Ci0KLSAgLy8gZ3JhYiBhbGwgdGhlIGhhbmRsZXMgcmVxdWVzdGVkCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiByZXF1ZXN0ZWRfaGFuZGxlczsKLSAgT05fQ0FMTChnYXR0X3F1ZXVlLCBXcml0ZURlc2NyaXB0b3IoXywgXywgXywgXywgXywgXykpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoCi0gICAgICAgICAgWyZyZXF1ZXN0ZWRfaGFuZGxlc10oCi0gICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwgR0FUVF9XUklURV9PUF9DQiBjYiwKLSAgICAgICAgICAgICAgdm9pZCogY2JfZGF0YSkgLT4gdm9pZCB7IHJlcXVlc3RlZF9oYW5kbGVzLnB1c2hfYmFjayhoYW5kbGUpOyB9KSk7Ci0gIE9OX0NBTEwoZ2F0dF9xdWV1ZSwgUmVhZENoYXJhY3RlcmlzdGljKF8sIF8sIF8sIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKAotICAgICAgICAgIFsmcmVxdWVzdGVkX2hhbmRsZXNdKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFQURfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIC0+IHZvaWQgewotICAgICAgICAgICAgcmVxdWVzdGVkX2hhbmRsZXMucHVzaF9iYWNrKGhhbmRsZSk7Ci0gICAgICAgICAgfSkpOwotCi0gIGF1dG8gY2hyY19yZWFkX2NiID0gW10odWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHt9OwotICBhdXRvIGNjY2Rfd3JpdGVfY2IgPSBbXSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgY29uc3QgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHt9OwotICBBU1NFUlRfRVEodHJ1ZSwgZGV2aWNlLT5FbnF1ZXVlSW5pdGlhbFJlcXVlc3RzKDB4MDAwMSwgY2hyY19yZWFkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjY2Rfd3JpdGVfY2IpKTsKLSAgQVNTRVJUX05FKChzaXplX3QpMCwgcmVxdWVzdGVkX2hhbmRsZXMuc2l6ZSgpKTsKLQotICAvLyBpbmRpY2F0ZSBub24tcGVuZGluZyByZXF1ZXN0cwotICBBU1NFUlRfRVEoZmFsc2UsIGRldmljZS0+ZGV2aWNlX3JlYWR5KTsKLSAgZGV2aWNlLT5WZXJpZnlSZWFkeSgweGZmZmYpOwotCi0gIGZvciAodWludDE2X3QgaGFuZGxlIDogcmVxdWVzdGVkX2hhbmRsZXMpIHsKLSAgICBBU1NFUlRfRVEoZmFsc2UsIGRldmljZS0+ZGV2aWNlX3JlYWR5KTsKLSAgICBkZXZpY2UtPlZlcmlmeVJlYWR5KGhhbmRsZSk7Ci0gIH0KLQotICBBU1NFUlRfRVEodHJ1ZSwgZGV2aWNlLT5kZXZpY2VfcmVhZHkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZVRlc3QsIHRlc3RfZW5xdWV1ZV9yZW1haW5pbmdfcmVxdWVzdHMpIHsKLSAgU2V0U2FtcGxlRGF0YWJhc2UxKCk7Ci0KLSAgdEdBVFRfSUYgZ2F0dF9pZiA9IDB4MDAwMTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbl9kYXRhKHsweDAxLCAweDAwfSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGV4cGVjdGVkX3RvX3JlYWR7MHgwMDE2IC8qIHZvbHVtZSBmbGFncyAqL307Ci0KLSAgc3RkOjptYXA8dWludDE2X3QsIHVpbnQxNl90PiBleHBlY3RlZF90b193cml0ZV92YWx1ZV9jY2NfaGFuZGxlX21hcHt9OwotCi0gIGZvciAodWludDE2X3QgaGFuZGxlIDogZXhwZWN0ZWRfdG9fcmVhZCkgewotICAgIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsIFJlYWRDaGFyYWN0ZXJpc3RpYyhfLCBoYW5kbGUsIF8sIF8pKTsKLSAgfQotCi0gIGZvciAoYXV0byBjb25zdCYgaGFuZGxlX3BhaXIgOiBleHBlY3RlZF90b193cml0ZV92YWx1ZV9jY2NfaGFuZGxlX21hcCkgewotICAgIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsIFdyaXRlRGVzY3JpcHRvcihfLCBoYW5kbGVfcGFpci5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgXywgXykpOwotICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhnYXR0X2lmLCBfLCBoYW5kbGVfcGFpci5maXJzdCkpOwotICB9Ci0KLSAgYXV0byBjaHJjX3JlYWRfY2IgPSBbXSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkge307Ci0gIGF1dG8gY2NjZF93cml0ZV9jYiA9IFtdKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkge307Ci0gIGRldmljZS0+RW5xdWV1ZVJlbWFpbmluZ1JlcXVlc3RzKGdhdHRfaWYsIGNocmNfcmVhZF9jYiwgY2NjZF93cml0ZV9jYik7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sRGV2aWNlVGVzdCwgdGVzdF9jaGVja19saW5rX2VuY3J5cHRlZCkgewotICBPTl9DQUxMKGJ0bV9pbnRlcmZhY2UsIEJUTV9Jc0VuY3J5cHRlZChfLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KERvQWxsKFJldHVybih0cnVlKSkpOwotICBBU1NFUlRfRVEodHJ1ZSwgZGV2aWNlLT5Jc0VuY3J5cHRpb25FbmFibGVkKCkpOwotCi0gIE9OX0NBTEwoYnRtX2ludGVyZmFjZSwgQlRNX0lzRW5jcnlwdGVkKF8sIF8pKQotICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKGZhbHNlKSkpOwotICBBU1NFUlRfTkUodHJ1ZSwgZGV2aWNlLT5Jc0VuY3J5cHRpb25FbmFibGVkKCkpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbERldmljZVRlc3QsIHRlc3RfY29udHJvbF9wb2ludF9vcGVyYXRpb24pIHsKLSAgR0FUVF9XUklURV9PUF9DQiB3cml0ZV9jYiA9IFtdKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7fTsKLSAgU2V0U2FtcGxlRGF0YWJhc2UxKCk7Ci0gIGRldmljZS0+Y2hhbmdlX2NvdW50ZXIgPSAweDAxOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZF9kYXRhKHsweDAzLCAweDAxfSk7Ci0gIEVYUEVDVF9DQUxMKGdhdHRfcXVldWUsIFdyaXRlQ2hhcmFjdGVyaXN0aWMoXywgMHgwMDE0LCBleHBlY3RlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEUsIHdyaXRlX2NiLCBudWxscHRyKSk7Ci0gIGRldmljZS0+Q29udHJvbFBvaW50T3BlcmF0aW9uKDB4MDMsIG51bGxwdHIsIHdyaXRlX2NiLCBudWxscHRyKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xEZXZpY2VUZXN0LCB0ZXN0X2NvbnRyb2xfcG9pbnRfb3BlcmF0aW9uX2FyZykgewotICBHQVRUX1dSSVRFX09QX0NCIHdyaXRlX2NiID0gW10odWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHt9OwotICBTZXRTYW1wbGVEYXRhYmFzZTEoKTsKLSAgZGV2aWNlLT5jaGFuZ2VfY291bnRlciA9IDB4NTU7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkX2RhdGEoezB4MDEsIDB4NTUsIDB4MDIsIDB4MDN9KTsKLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgV3JpdGVDaGFyYWN0ZXJpc3RpYyhfLCAweDAwMTQsIGV4cGVjdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgd3JpdGVfY2IsIG51bGxwdHIpKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXJnKHsweDAyLCAweDAzfSk7Ci0gIGRldmljZS0+Q29udHJvbFBvaW50T3BlcmF0aW9uKDB4MDEsICZhcmcsIHdyaXRlX2NiLCBudWxscHRyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdmMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0YS92Yy90eXBlcy5oIGIvYnRhL3ZjL3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NjFkNjUuLjAwMDAwMDAKLS0tIGEvYnRhL3ZjL3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9ncm91cHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdmMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLyogY2xhbmctZm9ybWF0IG9mZiAqLwotLyogVm9sdW1lIGNvbnRyb2wgcG9pbnQgb3Bjb2RlcyAqLwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVWb2x1bWVEb3duICAgICAgICAgPSAweDAwOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVWb2x1bWVVcCAgICAgICAgICAgPSAweDAxOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVVbm11dGVWb2x1bWVEb3duICAgPSAweDAyOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVVbm11dGVWb2x1bWVVcCAgICAgPSAweDAzOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVTZXRBYnNvbHV0ZVZvbHVtZSAgPSAweDA0Owotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVVbm11dGUgICAgICAgICAgICAgPSAweDA1Owotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sUG9pbnRPcGNvZGVNdXRlICAgICAgICAgICAgICAgPSAweDA2OwotCi1zdGF0aWMgY29uc3QgVXVpZCBrVm9sdW1lQ29udHJvbFV1aWQgICAgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb20xNkJpdCgweDE4NDQpOwotc3RhdGljIGNvbnN0IFV1aWQga1ZvbHVtZUNvbnRyb2xTdGF0ZVV1aWQgICAgICAgICAgICAgPSBVdWlkOjpGcm9tMTZCaXQoMHgyQjdEKTsKLXN0YXRpYyBjb25zdCBVdWlkIGtWb2x1bWVDb250cm9sUG9pbnRVdWlkICAgICAgICAgICAgID0gVXVpZDo6RnJvbTE2Qml0KDB4MkI3RSk7Ci1zdGF0aWMgY29uc3QgVXVpZCBrVm9sdW1lRmxhZ3NVdWlkICAgICAgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb20xNkJpdCgweDJCN0YpOwotLyogY2xhbmctZm9ybWF0IG9uICovCi0KLXN0cnVjdCBWb2x1bWVPcGVyYXRpb24gewotICBpbnQgb3BlcmF0aW9uX2lkXzsKLSAgaW50IGdyb3VwX2lkXzsKLQotICBib29sIHN0YXJ0ZWRfOwotCi0gIHVpbnQ4X3Qgb3Bjb2RlXzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXJndW1lbnRzXzsKLQotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBkZXZpY2VzXzsKLSAgYWxhcm1fdCogb3BlcmF0aW9uX3RpbWVvdXRfOwotCi0gIFZvbHVtZU9wZXJhdGlvbihpbnQgb3BlcmF0aW9uX2lkLCBpbnQgZ3JvdXBfaWQsIHVpbnQ4X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gZGV2aWNlcykKLSAgICAgIDogb3BlcmF0aW9uX2lkXyhvcGVyYXRpb25faWQpLAotICAgICAgICBncm91cF9pZF8oZ3JvdXBfaWQpLAotICAgICAgICBvcGNvZGVfKG9wY29kZSksCi0gICAgICAgIGFyZ3VtZW50c18oYXJndW1lbnRzKSwKLSAgICAgICAgZGV2aWNlc18oZGV2aWNlcykgewotICAgIGF1dG8gbmFtZSA9ICJvcGVyYXRpb25fdGltZW91dF8iICsgc3RkOjp0b19zdHJpbmcob3BlcmF0aW9uX2lkKTsKLSAgICBvcGVyYXRpb25fdGltZW91dF8gPSBhbGFybV9uZXcobmFtZS5jX3N0cigpKTsKLSAgICBzdGFydGVkXyA9IGZhbHNlOwotICB9OwotCi0gIH5Wb2x1bWVPcGVyYXRpb24oKSB7Ci0gICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChvcGVyYXRpb25fdGltZW91dF8pKQotICAgICAgYWxhcm1fY2FuY2VsKG9wZXJhdGlvbl90aW1lb3V0Xyk7Ci0KLSAgICBhbGFybV9mcmVlKG9wZXJhdGlvbl90aW1lb3V0Xyk7Ci0gICAgb3BlcmF0aW9uX3RpbWVvdXRfID0gbnVsbHB0cjsKLSAgfQotCi0gIGJvb2wgSXNHcm91cE9wZXJhdGlvbih2b2lkKSB7Ci0gICAgcmV0dXJuIChncm91cF9pZF8gIT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pOwotICB9Ci0KLSAgYm9vbCBJc1N0YXJ0ZWQodm9pZCkgeyByZXR1cm4gc3RhcnRlZF87IH07Ci0gIHZvaWQgU3RhcnQodm9pZCkgeyBzdGFydGVkXyA9IHRydWU7IH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHZjCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9idGEvdmMvdmMuY2MgYi9idGEvdmMvdmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjYxZTguLjAwMDAwMDAKLS0tIGEvYnRhL3ZjL3ZjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3ZjLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYnRhL2xlX2F1ZGlvL2xlX2F1ZGlvX3R5cGVzLmgiCi0jaW5jbHVkZSAiYnRhX2NzaXNfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWUuaCIKLSNpbmNsdWRlICJidGFfdmNfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6Q2xvc3VyZTsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6dmM6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg6OnZjOjppbnRlcm5hbDsKLQotbmFtZXNwYWNlIHsKLWNsYXNzIFZvbHVtZUNvbnRyb2xJbXBsOwotVm9sdW1lQ29udHJvbEltcGwqIGluc3RhbmNlOwotCi0vKioKLSAqIE92ZXJ2aWV3OgotICoKLSAqIFRoaXMgaXMgVm9sdW1lIENvbnRyb2wgSW1wbGVtZW50YXRpb24gY2xhc3Mgd2hpY2ggcmVhbGl6ZSBWb2x1bWUgQ29udHJvbAotICogUHJvZmlsZSAoVkNQKQotICoKLSAqIEVhY2ggY29ubmVjdGVkIHBlZXIgZGV2aWNlIHN1cHBvcnRpbmcgVm9sdW1lIENvbnRyb2wgU2VydmljZSAoVkNTKSBpcyBvbiB0aGUKLSAqIGxpc3Qgb2YgZGV2aWNlcyAodm9sdW1lX2NvbnRyb2xfZGV2aWNlc18pLgotICoKLSAqIE9uY2UgYWxsIHRoZSBtYW5kYXRvcnkgY2hhcmFjdGVyaXN0aXMgZm9yIGFsbCB0aGUgc2VydmljZXMgYXJlIGRpc2NvdmVyZWQsCi0gKiBGbHVvcmlkZSBjYWxscyBPTl9DT05ORUNURUQgY2FsbGJhY2suCi0gKgotICogSXQgaXMgYXNzdW1lZCB0aGF0IHdoZW5ldmVyIGFwcGxpY2F0aW9uIGNoYW5nZXMgZ2VuZXJhbCBhdWRpbyBvcHRpb25zIGluIHRoaXMKLSAqIHByb2ZpbGUgZS5nLiBWb2x1bWUgdXAvZG93biwgbXV0ZS91bm11dGUgZXRjLCBwcm9maWxlIGNvbmZpZ3VyZXMgYWxsIHRoZQotICogZGV2aWNlcyB3aGljaCBhcmUgYWN0aXZlIExlIEF1ZGlvIGRldmljZXMuCi0gKgotICoKLSAqLwotY2xhc3MgVm9sdW1lQ29udHJvbEltcGwgOiBwdWJsaWMgVm9sdW1lQ29udHJvbCB7Ci0gcHVibGljOgotICB+Vm9sdW1lQ29udHJvbEltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgVm9sdW1lQ29udHJvbEltcGwoYmx1ZXRvb3RoOjp2Yzo6Vm9sdW1lQ29udHJvbENhbGxiYWNrcyogY2FsbGJhY2tzKQotICAgICAgOiBnYXR0X2lmXygwKSwgY2FsbGJhY2tzXyhjYWxsYmFja3MpLCBsYXRlc3Rfb3BlcmF0aW9uX2lkXygwKSB7Ci0gICAgQlRBX0dBVFRDX0FwcFJlZ2lzdGVyKAotICAgICAgICBnYXR0Y19jYWxsYmFja19zdGF0aWMsCi0gICAgICAgIGJhc2U6OkJpbmQoW10odWludDhfdCBjbGllbnRfaWQsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgICAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbid0IHN0YXJ0IFZvbHVtZSBDb250cm9sIHByb2ZpbGUgLSBubyBnYXR0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudHMgbGVmdCEiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbnN0YW5jZS0+Z2F0dF9pZl8gPSBjbGllbnRfaWQ7Ci0gICAgICAgIH0pLAotICAgICAgICB0cnVlKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzOwotCi0gICAgYXV0byBkZXZpY2UgPSB2b2x1bWVfY29udHJvbF9kZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICB2b2x1bWVfY29udHJvbF9kZXZpY2VzXy5BZGQoYWRkcmVzcywgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSA9IHRydWU7Ci0gICAgfQotCi0gICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9pZl8sIGFkZHJlc3MsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHZvaWQgQWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBhdXRvX2Nvbm5lY3QpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgPDwgIiwgYXV0b19jb25uZWN0PSIgPDwgYXV0b19jb25uZWN0OwotCi0gICAgaWYgKGF1dG9fY29ubmVjdCkgewotICAgICAgdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uQWRkKGFkZHJlc3MsIGZhbHNlKTsKLQotICAgICAgLyogQWRkIGRldmljZSBpbnRvIEJHIGNvbm5lY3Rpb24gdG8gYWNjZXB0IHJlbW90ZSBpbml0aWF0ZWQgY29ubmVjdGlvbiAqLwotICAgICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9pZl8sIGFkZHJlc3MsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkdhdHRDb25uZWN0ZWQodEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgY29ubmVjdGlvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfSUYgLypjbGllbnRfaWYqLywgUmF3QWRkcmVzcyBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIC8qdHJhbnNwb3J0Ki8sIHVpbnQxNl90IC8qbXR1Ki8pIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYWRkcmVzcz0iIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgPDwgIiwgY29ubmVjdGlvbl9pZD0iIDw8IGNvbm5lY3Rpb25faWQ7Ci0KLSAgICBWb2x1bWVDb250cm9sRGV2aWNlKiBkZXZpY2UgPQotICAgICAgICB2b2x1bWVfY29udHJvbF9kZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSwgYWRkcmVzcz0iIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gVm9sdW1lIENvbnRyb2wgZGV2aWNlIjsKLSAgICAgIGRldmljZV9jbGVhbnVwX2hlbHBlcihkZXZpY2UsIGRldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGV2aWNlLT5jb25uZWN0aW9uX2lkID0gY29ubmVjdGlvbl9pZDsKLQotICAgIGlmIChkZXZpY2UtPklzRW5jcnlwdGlvbkVuYWJsZWQoKSkgewotICAgICAgT25FbmNyeXB0aW9uQ29tcGxldGUoYWRkcmVzcywgQlRNX1NVQ0NFU1MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZGV2aWNlLT5FbmFibGVFbmNyeXB0aW9uKGVuY19jYWxsYmFja19zdGF0aWMpKSB7Ci0gICAgICBkZXZpY2VfY2xlYW51cF9oZWxwZXIoZGV2aWNlLCBkZXZpY2UtPmNvbm5lY3RpbmdfYWN0aXZlbHkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25FbmNyeXB0aW9uQ29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzdWNjZXNzKSB7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0KLSAgICAgICAgdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldmljZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UgIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdWNjZXNzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJlbmNyeXB0aW9uIGZhaWxlZCAiCi0gICAgICAgICAgICAgICAgIDw8ICJzdGF0dXM6ICIgPDwgaW50e3N1Y2Nlc3N9OwotICAgICAgLy8gSWYgdGhlIGVuY3J5cHRpb24gZmFpbGVkLCBkbyBub3QgcmVtb3ZlIHRoZSBkZXZpY2UuCi0gICAgICAvLyBEaXNjb25uZWN0IG9ubHksIHNpbmNlIHRoZSBBbmRyb2lkIHdpbGwgdHJ5IHRvIHJlLWVuYWJsZSBlbmNyeXB0aW9uCi0gICAgICAvLyBhZnRlciBkaXNjb25uZWN0aW9uCi0gICAgICBkZXZpY2UtPkRpc2Nvbm5lY3QoZ2F0dF9pZl8pOwotICAgICAgaWYgKGRldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSkKLSAgICAgICAgY2FsbGJhY2tzXy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+YWRkcmVzcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzIDw8ICIgc3RhdHVzOiAiIDw8ICtzdWNjZXNzOwotCi0gICAgaWYgKGRldmljZS0+SGFzSGFuZGxlcygpKSB7Ci0gICAgICBkZXZpY2UtPkVucXVldWVJbml0aWFsUmVxdWVzdHMoZ2F0dF9pZl8sIGNocmNfcmVhZF9jYWxsYmFja19zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25HYXR0V3JpdGVDY2NTdGF0aWMpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGRldmljZS0+Zmlyc3RfY29ubmVjdGlvbiA9IHRydWU7Ci0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoZGV2aWNlLT5jb25uZWN0aW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrVm9sdW1lQ29udHJvbFV1aWQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlQ2hhbmdlRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSA9Ci0gICAgICAgIHZvbHVtZV9jb250cm9sX2RldmljZXNfLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzOwotICAgIGRldmljZS0+Zmlyc3RfY29ubmVjdGlvbiA9IHRydWU7Ci0gICAgZGV2aWNlLT5zZXJ2aWNlX2NoYW5nZWRfcmN2ZCA9IHRydWU7Ci0gICAgQnRhR2F0dFF1ZXVlOjpDbGVhbihkZXZpY2UtPmNvbm5lY3Rpb25faWQpOwotICB9Ci0KLSAgdm9pZCBPblNlcnZpY2VEaXNjRG9uZUV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBWb2x1bWVDb250cm9sRGV2aWNlKiBkZXZpY2UgPQotICAgICAgICB2b2x1bWVfY29udHJvbF9kZXZpY2VzXy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSAiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGRldmljZS0+c2VydmljZV9jaGFuZ2VkX3JjdmQpCi0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoZGV2aWNlLT5jb25uZWN0aW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrVm9sdW1lQ29udHJvbFV1aWQpOwotICB9Ci0KLSAgdm9pZCBPblNlcnZpY2VTZWFyY2hDb21wbGV0ZSh1aW50MTZfdCBjb25uZWN0aW9uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzKSB7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0KLSAgICAgICAgdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRmluZEJ5Q29ubklkKGNvbm5lY3Rpb25faWQpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubmVjdGlvbl9pZD0iCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjb25uZWN0aW9uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBLbm93biBkZXZpY2UsIG5vdGhpbmcgdG8gZG8gKi8KLSAgICBpZiAoIWRldmljZS0+Zmlyc3RfY29ubmVjdGlvbikgcmV0dXJuOwotCi0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIC8qIGNsb3NlIGNvbm5lY3Rpb24gYW5kIHJlcG9ydCBzZXJ2aWNlIGRpc2NvdmVyeSBjb21wbGV0ZSB3aXRoIGVycm9yICovCi0gICAgICBMT0coRVJST1IpIDw8ICJTZXJ2aWNlIGRpc2NvdmVyeSBmYWlsZWQiOwotICAgICAgZGV2aWNlX2NsZWFudXBfaGVscGVyKGRldmljZSwgZGV2aWNlLT5maXJzdF9jb25uZWN0aW9uKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBkZXZpY2UtPlVwZGF0ZUhhbmRsZXMoKTsKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkluY29tcGxldGUgc2VydmljZSBkYXRhYmFzZSI7Ci0gICAgICBkZXZpY2VfY2xlYW51cF9oZWxwZXIoZGV2aWNlLCB0cnVlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkZXZpY2UtPkVucXVldWVJbml0aWFsUmVxdWVzdHMoZ2F0dF9pZl8sIGNocmNfcmVhZF9jYWxsYmFja19zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uR2F0dFdyaXRlQ2NjU3RhdGljKTsKLSAgfQotCi0gIHZvaWQgT25DaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbm90aWZpY2F0aW9uKSB7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0gdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogdW5rbm93biBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3RhdHVzPSIgPDwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChoYW5kbGUgPT0gZGV2aWNlLT52b2x1bWVfc3RhdGVfaGFuZGxlKSB7Ci0gICAgICBPblZvbHVtZUNvbnRyb2xTdGF0ZVJlYWRPck5vdGlmaWVkKGRldmljZSwgbGVuLCB2YWx1ZSwgaXNfbm90aWZpY2F0aW9uKTsKLSAgICAgIHZlcmlmeV9kZXZpY2VfcmVhZHkoZGV2aWNlLCBoYW5kbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoaGFuZGxlID09IGRldmljZS0+dm9sdW1lX2ZsYWdzX2hhbmRsZSkgewotICAgICAgT25Wb2x1bWVDb250cm9sRmxhZ3NDaGFuZ2VkKGRldmljZSwgbGVuLCB2YWx1ZSk7Ci0gICAgICB2ZXJpZnlfZGV2aWNlX3JlYWR5KGRldmljZSwgaGFuZGxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVua25vd24gaGFuZGxlPSIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gIH0KLQotICB2b2lkIE9uTm90aWZpY2F0aW9uRXZlbnQodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYW5kbGU9IiA8PCBsb2doZXgoaGFuZGxlKTsKLSAgICBPbkNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2VkKGNvbm5faWQsIEdBVFRfU1VDQ0VTUywgaGFuZGxlLCBsZW4sIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIFZvbHVtZUNvbnRyb2xSZWFkQ29tbW9uKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSkgewotICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSwgY2hyY19yZWFkX2NhbGxiYWNrX3N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgSGFuZGxlQXV0b25vbXVzVm9sdW1lQ2hhbmdlKFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc192b2x1bWVfY2hhbmdlLCBib29sIGlzX211dGVfY2hhbmdlKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCBkZXZpY2UtPmFkZHJlc3MKLSAgICAgICAgICAgICAgIDw8ICIgaXMgdm9sdW1lIGNoYW5nZTogIiA8PCBpc192b2x1bWVfY2hhbmdlCi0gICAgICAgICAgICAgICA8PCAiIGlzIG11dGUgY2hhbmdlOiAiIDw8IGlzX211dGVfY2hhbmdlOwotCi0gICAgaWYgKCFpc192b2x1bWVfY2hhbmdlICYmICFpc19tdXRlX2NoYW5nZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiQXV0b25vbW91cyBjaGFuZ2UgYnV0IHZvbHVtZSBhbmQgbXV0ZSBkaWQgbm90IGNoYW5nZWQuIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGNzaXNfYXBpID0gQ3Npc0NsaWVudDo6R2V0KCk7Ci0gICAgaWYgKCFjc2lzX2FwaSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENzaXMgaXMgbm90IGF2YWlsYWJsZSI7Ci0gICAgICBjYWxsYmFja3NfLT5PblZvbHVtZVN0YXRlQ2hhbmdlZChkZXZpY2UtPmFkZHJlc3MsIGRldmljZS0+dm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5tdXRlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGdyb3VwX2lkID0KLSAgICAgICAgY3Npc19hcGktPkdldEdyb3VwSWQoZGV2aWNlLT5hZGRyZXNzLCBsZV9hdWRpbzo6dXVpZDo6a0NhcFNlcnZpY2VVdWlkKTsKLSAgICBpZiAoZ3JvdXBfaWQgPT0gYmx1ZXRvb3RoOjpncm91cHM6OmtHcm91cFVua25vd24pIHsKLSAgICAgIERMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBObyBncm91cCBmb3IgZGV2aWNlICIgPDwgZGV2aWNlLT5hZGRyZXNzOwotICAgICAgY2FsbGJhY2tzXy0+T25Wb2x1bWVTdGF0ZUNoYW5nZWQoZGV2aWNlLT5hZGRyZXNzLCBkZXZpY2UtPnZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+bXV0ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBkZXZpY2VzID0gY3Npc19hcGktPkdldERldmljZUxpc3QoZ3JvdXBfaWQpOwotICAgIGZvciAoYXV0byBpdCA9IGRldmljZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlcy5lbmQoKTspIHsKLSAgICAgIGF1dG8gZGV2ID0gdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRmluZEJ5QWRkcmVzcygqaXQpOwotICAgICAgaWYgKCFkZXYgfHwgIWRldi0+SXNDb25uZWN0ZWQoKSB8fCAoZGV2LT5hZGRyZXNzID09IGRldmljZS0+YWRkcmVzcykpIHsKLSAgICAgICAgaXQgPSBkZXZpY2VzLmVyYXNlKGl0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0Kys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlzX3ZvbHVtZV9jaGFuZ2UpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFyZyh7ZGV2aWNlLT52b2x1bWV9KTsKLSAgICAgIFByZXBhcmVWb2x1bWVDb250cm9sT3BlcmF0aW9uKGRldmljZXMsIGdyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NvbnRyb2xQb2ludE9wY29kZVNldEFic29sdXRlVm9sdW1lLCBhcmcpOwotICAgIH0KLQotICAgIGlmIChpc19tdXRlX2NoYW5nZSkgewotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXJnOwotICAgICAgdWludDhfdCBvcGNvZGUgPQotICAgICAgICAgIGRldmljZS0+bXV0ZSA/IGtDb250cm9sUG9pbnRPcGNvZGVNdXRlIDoga0NvbnRyb2xQb2ludE9wY29kZVVubXV0ZTsKLSAgICAgIFByZXBhcmVWb2x1bWVDb250cm9sT3BlcmF0aW9uKGRldmljZXMsIGdyb3VwX2lkLCBvcGNvZGUsIGFyZyk7Ci0gICAgfQotCi0gICAgU3RhcnRRdWV1ZU9wZXJhdGlvbigpOwotICB9Ci0KLSAgdm9pZCBPblZvbHVtZUNvbnRyb2xTdGF0ZVJlYWRPck5vdGlmaWVkKFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX25vdGlmaWNhdGlvbikgewotICAgIGlmIChsZW4gIT0gMykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG1hbGZvcm1lZCBsZW49IiA8PCBsb2doZXgobGVuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1aW50OF90IHZvbDsKLSAgICB1aW50OF90IG11dGU7Ci0gICAgdWludDhfdCogcHAgPSB2YWx1ZTsKLSAgICBTVFJFQU1fVE9fVUlOVDgodm9sLCBwcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KG11dGUsIHBwKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoZGV2aWNlLT5jaGFuZ2VfY291bnRlciwgcHApOwotCi0gICAgYm9vbCBpc192b2x1bWVfY2hhbmdlID0gKGRldmljZS0+dm9sdW1lICE9IHZvbCk7Ci0gICAgZGV2aWNlLT52b2x1bWUgPSB2b2w7Ci0KLSAgICBib29sIGlzX211dGVfY2hhbmdlID0gKGRldmljZS0+bXV0ZSAhPSBtdXRlKTsKLSAgICBkZXZpY2UtPm11dGUgPSBtdXRlOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdm9sdW1lICIgPDwgbG9naGV4KGRldmljZS0+dm9sdW1lKSA8PCAiIG11dGUgIgotICAgICAgICAgICAgICA8PCBsb2doZXgoZGV2aWNlLT5tdXRlKSA8PCAiIGNoYW5nZV9jb3VudGVyICIKLSAgICAgICAgICAgICAgPDwgbG9naGV4KGRldmljZS0+Y2hhbmdlX2NvdW50ZXIpOwotCi0gICAgaWYgKCFkZXZpY2UtPmRldmljZV9yZWFkeSkgcmV0dXJuOwotCi0gICAgLyogVGhpcyBpcyBqdXN0IGEgcmVhZCwgc2VuZCBzaW5nbGUgbm90aWZpY2F0aW9uICovCi0gICAgaWYgKCFpc19ub3RpZmljYXRpb24pIHsKLSAgICAgIGNhbGxiYWNrc18tPk9uVm9sdW1lU3RhdGVDaGFuZ2VkKGRldmljZS0+YWRkcmVzcywgZGV2aWNlLT52b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPm11dGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gYWRkciA9IGRldmljZS0+YWRkcmVzczsKLSAgICBhdXRvIG9wID0gZmluZF9pZihvbmdvaW5nX29wZXJhdGlvbnNfLmJlZ2luKCksIG9uZ29pbmdfb3BlcmF0aW9uc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgW2FkZHJdKGF1dG8mIG9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IGZpbmQob3BlcmF0aW9uLmRldmljZXNfLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZGV2aWNlc18uZW5kKCksIGFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ICE9IG9wZXJhdGlvbi5kZXZpY2VzXy5lbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICBpZiAob3AgPT0gb25nb2luZ19vcGVyYXRpb25zXy5lbmQoKSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbiBpZCBmb3IgZGV2aWNlOiAiCi0gICAgICAgICAgICAgICAgIDw8IGRldmljZS0+YWRkcmVzcyA8PCAiLiBBdXRvbm9tdXMgY2hhbmdlIjsKLSAgICAgIEhhbmRsZUF1dG9ub211c1ZvbHVtZUNoYW5nZShkZXZpY2UsIGlzX3ZvbHVtZV9jaGFuZ2UsIGlzX211dGVfY2hhbmdlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgb3BlcmF0aW9uIGZvdW5kOiAiIDw8IG9wLT5vcGVyYXRpb25faWRfCi0gICAgICAgICAgICAgICA8PCAiIGZvciBncm91cCBpZDogIiA8PCBvcC0+Z3JvdXBfaWRfOwotCi0gICAgLyogUmVjZWl2ZWQgbm90aWZpY2F0aW9uIGZyb20gdGhlIGRldmljZSB3ZSBkbyBleHBlY3QgKi8KLSAgICBhdXRvIGl0ID0gZmluZChvcC0+ZGV2aWNlc18uYmVnaW4oKSwgb3AtPmRldmljZXNfLmVuZCgpLCBkZXZpY2UtPmFkZHJlc3MpOwotICAgIG9wLT5kZXZpY2VzXy5lcmFzZShpdCk7Ci0gICAgaWYgKCFvcC0+ZGV2aWNlc18uZW1wdHkoKSkgewotICAgICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHdhaXQgZm9yIG1vcmUgcmVzcG9uc2VzIGZvciBvcGVyYXRpb25faWQ6ICIKLSAgICAgICAgICAgICAgICAgPDwgb3AtPm9wZXJhdGlvbl9pZF87Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG9wLT5Jc0dyb3VwT3BlcmF0aW9uKCkpCi0gICAgICBjYWxsYmFja3NfLT5Pbkdyb3VwVm9sdW1lU3RhdGVDaGFuZ2VkKG9wLT5ncm91cF9pZF8sIGRldmljZS0+dm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPm11dGUpOwotICAgIGVsc2UKLSAgICAgIGNhbGxiYWNrc18tPk9uVm9sdW1lU3RhdGVDaGFuZ2VkKGRldmljZS0+YWRkcmVzcywgZGV2aWNlLT52b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPm11dGUpOwotCi0gICAgb25nb2luZ19vcGVyYXRpb25zXy5lcmFzZShvcCk7Ci0gICAgU3RhcnRRdWV1ZU9wZXJhdGlvbigpOwotICB9Ci0KLSAgdm9pZCBPblZvbHVtZUNvbnRyb2xGbGFnc0NoYW5nZWQoVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlKSB7Ci0gICAgZGV2aWNlLT5mbGFncyA9ICp2YWx1ZTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGZsYWdzICIgPDwgbG9naGV4KGRldmljZS0+ZmxhZ3MpOwotICB9Ci0KLSAgdm9pZCBPbkdhdHRXcml0ZUNjYyh1aW50MTZfdCBjb25uZWN0aW9uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAvKmRhdGEqLykgewotICAgIFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSA9Ci0gICAgICAgIHZvbHVtZV9jb250cm9sX2RldmljZXNfLkZpbmRCeUNvbm5JZChjb25uZWN0aW9uX2lkKTsKLSAgICBpZiAoIWRldmljZSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgInVua25vd24gY29ubmVjdGlvbl9pZD0iIDw8IGxvZ2hleChjb25uZWN0aW9uX2lkKTsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6Q2xlYW4oY29ubmVjdGlvbl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uOiAiIDw8IGxvZ2hleChoYW5kbGUpCi0gICAgICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLSAgICAgIGRldmljZV9jbGVhbnVwX2hlbHBlcihkZXZpY2UsIHRydWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICA8PCAiU3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIGZvciBpbmRpY2F0aW9uczogIiA8PCBsb2doZXgoaGFuZGxlKTsKLQotICAgIHZlcmlmeV9kZXZpY2VfcmVhZHkoZGV2aWNlLCBoYW5kbGUpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgT25HYXR0V3JpdGVDY2NTdGF0aWModWludDE2X3QgY29ubmVjdGlvbl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgaWYgKCFpbnN0YW5jZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm8gaW5zdGFuY2U9IiA8PCBoYW5kbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW5zdGFuY2UtPk9uR2F0dFdyaXRlQ2NjKGNvbm5lY3Rpb25faWQsIHN0YXR1cywgaGFuZGxlLCBsZW4sIHZhbHVlLCBkYXRhKTsKLSAgfQotCi0gIHZvaWQgRHVtcChpbnQgZmQpIHsgdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRGVidWdEdW1wKGZkKTsgfQotCi0gIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0KLSAgICAgICAgdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldmljZSkgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBHQVBfRVZUX0NPTk5fQ0xPU0VEOiAiIDw8IGRldmljZS0+YWRkcmVzczsKLSAgICBkZXZpY2VfY2xlYW51cF9oZWxwZXIoZGV2aWNlLCB0cnVlKTsKLSAgfQotCi0gIHZvaWQgT25HYXR0RGlzY29ubmVjdGVkKHVpbnQxNl90IGNvbm5lY3Rpb25faWQsIHRHQVRUX0lGIC8qY2xpZW50X2lmKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRElTQ09OTl9SRUFTT04gLypyZWFzb24qLykgewotICAgIFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSA9Ci0gICAgICAgIHZvbHVtZV9jb250cm9sX2RldmljZXNfLkZpbmRCeUNvbm5JZChjb25uZWN0aW9uX2lkKTsKLSAgICBpZiAoIWRldmljZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiIFNraXBwaW5nIHVua25vd24gZGV2aWNlIGRpc2Nvbm5lY3QsIGNvbm5lY3Rpb25faWQ9IgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY29ubmVjdGlvbl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGl0IG1lYW5zLCBkZXZpY2UgaGFzIG5vdCBiZWVuIGV4bGljaXRseSBkaXNjb25uZWN0ZWQuCi0gICAgYm9vbCBkZXZpY2VfcmVhZHkgPSBkZXZpY2UtPmRldmljZV9yZWFkeTsKLQotICAgIGRldmljZV9jbGVhbnVwX2hlbHBlcihkZXZpY2UsIGRldmljZS0+Y29ubmVjdGluZ19hY3RpdmVseSk7Ci0KLSAgICBpZiAoZGV2aWNlX3JlYWR5KSB7Ci0gICAgICB2b2x1bWVfY29udHJvbF9kZXZpY2VzXy5BZGQocmVtb3RlX2JkYSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIEFkZCBkZXZpY2UgaW50byBCRyBjb25uZWN0aW9uIHRvIGFjY2VwdCByZW1vdGUgaW5pdGlhdGVkIGNvbm5lY3Rpb24gKi8KLSAgICAgIEJUQV9HQVRUQ19PcGVuKGdhdHRfaWZfLCByZW1vdGVfYmRhLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVtb3ZlRGV2aWNlRnJvbU9wZXJhdGlvbkxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgaW50IG9wZXJhdGlvbl9pZCkgewotICAgIGF1dG8gb3AgPSBmaW5kX2lmKG9uZ29pbmdfb3BlcmF0aW9uc18uYmVnaW4oKSwgb25nb2luZ19vcGVyYXRpb25zXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBbb3BlcmF0aW9uX2lkXShhdXRvJiBvcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb24ub3BlcmF0aW9uX2lkXyA9PSBvcGVyYXRpb25faWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAob3AgPT0gb25nb2luZ19vcGVyYXRpb25zXy5lbmQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiIENvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbiBpZDogIiA8PCBvcGVyYXRpb25faWQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBpdCA9IGZpbmQob3AtPmRldmljZXNfLmJlZ2luKCksIG9wLT5kZXZpY2VzXy5lbmQoKSwgYWRkcik7Ci0gICAgaWYgKGl0ICE9IG9wLT5kZXZpY2VzXy5lbmQoKSkgewotICAgICAgb3AtPmRldmljZXNfLmVyYXNlKGl0KTsKLSAgICAgIGlmIChvcC0+ZGV2aWNlc18uZW1wdHkoKSkgewotICAgICAgICBvbmdvaW5nX29wZXJhdGlvbnNfLmVyYXNlKG9wKTsKLSAgICAgICAgU3RhcnRRdWV1ZU9wZXJhdGlvbigpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25Xcml0ZUNvbnRyb2xSZXNwb25zZSh1aW50MTZfdCBjb25uZWN0aW9uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB2b2lkKiBkYXRhKSB7Ci0gICAgVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlID0KLSAgICAgICAgdm9sdW1lX2NvbnRyb2xfZGV2aWNlc18uRmluZEJ5Q29ubklkKGNvbm5lY3Rpb25faWQpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSBkaXNjb25uZWN0LCBjb25uZWN0aW9uX2lkPSIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGNvbm5lY3Rpb25faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiV3JpdGUgcmVzcG9uc2UgaGFuZGxlOiAiIDw8IGxvZ2hleChoYW5kbGUpCi0gICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IGxvZ2hleCgoaW50KShzdGF0dXMpKTsKLQotICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSByZXR1cm47Ci0KLSAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCByZW1vdmUgZGV2aWNlIGZyb20gdGhlIHRyYWNraW5nIG9wZXJhdGlvbiBsaXN0ICovCi0gICAgUmVtb3ZlRGV2aWNlRnJvbU9wZXJhdGlvbkxpc3QoZGV2aWNlLT5hZGRyZXNzLCBQVFJfVE9fSU5UKGRhdGEpKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIG9wZXJhdGlvbl9jYWxsYmFjayh2b2lkKiBkYXRhKSB7Ci0gICAgaW5zdGFuY2UtPkNhbmNlbFZvbHVtZU9wZXJhdGlvbihQVFJfVE9fSU5UKGRhdGEpKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRRdWV1ZU9wZXJhdGlvbih2b2lkKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIGlmIChvbmdvaW5nX29wZXJhdGlvbnNfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9OwotCi0gICAgYXV0byBvcCA9ICZvbmdvaW5nX29wZXJhdGlvbnNfLmZyb250KCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBvcGVyYXRpb25faWQ6ICIgPDwgb3AtPm9wZXJhdGlvbl9pZF87Ci0KLSAgICBpZiAob3AtPklzU3RhcnRlZCgpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB3YWl0IHVudGlsIG9wZXJhdGlvbiAiIDw8IG9wLT5vcGVyYXRpb25faWRfCi0gICAgICAgICAgICAgICAgPDwgIiBpcyBjb21wbGV0ZSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgb3AtPlN0YXJ0KCk7Ci0KLSAgICBhbGFybV9zZXRfb25fbWxvb3Aob3AtPm9wZXJhdGlvbl90aW1lb3V0XywgMzAwMCwgb3BlcmF0aW9uX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICBJTlRfVE9fUFRSKG9wLT5vcGVyYXRpb25faWRfKSk7Ci0gICAgZGV2aWNlc19jb250cm9sX3BvaW50X2hlbHBlcigKLSAgICAgICAgb3AtPmRldmljZXNfLCBvcC0+b3Bjb2RlXywKLSAgICAgICAgb3AtPmFyZ3VtZW50c18uc2l6ZSgpID09IDAgPyBudWxscHRyIDogJihvcC0+YXJndW1lbnRzXykpOwotICB9Ci0KLSAgdm9pZCBDYW5jZWxWb2x1bWVPcGVyYXRpb24oaW50IG9wZXJhdGlvbl9pZCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbmNlbGluZyBvcGVyYXRpb25faWQ6ICIgPDwgb3BlcmF0aW9uX2lkOwotCi0gICAgYXV0byBvcCA9IGZpbmRfaWYoCi0gICAgICAgIG9uZ29pbmdfb3BlcmF0aW9uc18uYmVnaW4oKSwgb25nb2luZ19vcGVyYXRpb25zXy5lbmQoKSwKLSAgICAgICAgW29wZXJhdGlvbl9pZF0oYXV0byYgaXQpIHsgcmV0dXJuIGl0Lm9wZXJhdGlvbl9pZF8gPT0gb3BlcmF0aW9uX2lkOyB9KTsKLQotICAgIGlmIChvcCA9PSBvbmdvaW5nX29wZXJhdGlvbnNfLmVuZCgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgQ291bGQgbm90IGZpbmQgb3BlcmF0aW9uX2lkOiAiIDw8IG9wZXJhdGlvbl9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBQb3NzaWJseSBjbG9zZSBHQVRUIG9wZXJhdGlvbnMgKi8KLSAgICBvbmdvaW5nX29wZXJhdGlvbnNfLmVyYXNlKG9wKTsKLSAgICBTdGFydFF1ZXVlT3BlcmF0aW9uKCk7Ci0gIH0KLQotICB2b2lkIFByb2NlZWRWb2x1bWVPcGVyYXRpb24oaW50IG9wZXJhdGlvbl9pZCkgewotICAgIGF1dG8gb3AgPSBmaW5kX2lmKG9uZ29pbmdfb3BlcmF0aW9uc18uYmVnaW4oKSwgb25nb2luZ19vcGVyYXRpb25zXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBbb3BlcmF0aW9uX2lkXShhdXRvJiBvcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb24ub3BlcmF0aW9uX2lkXyA9PSBvcGVyYXRpb25faWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgb3BlcmF0aW9uX2lkOiAiIDw8IG9wZXJhdGlvbl9pZDsKLQotICAgIGlmIChvcCA9PSBvbmdvaW5nX29wZXJhdGlvbnNfLmVuZCgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgQ291bGQgbm90IGZpbmQgb3BlcmF0aW9uX2lkOiAiIDw8IG9wZXJhdGlvbl9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcHJvY2VkdXJlIGNvbnRpbnVlZCBmb3Igb3BlcmF0aW9uX2lkOiAiCi0gICAgICAgICAgICAgICA8PCBvcC0+b3BlcmF0aW9uX2lkXzsKLQotICAgIGFsYXJtX3NldF9vbl9tbG9vcChvcC0+b3BlcmF0aW9uX3RpbWVvdXRfLCAzMDAwLCBvcGVyYXRpb25fY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIElOVF9UT19QVFIob3AtPm9wZXJhdGlvbl9pZF8pKTsKLSAgICBkZXZpY2VzX2NvbnRyb2xfcG9pbnRfaGVscGVyKG9wLT5kZXZpY2VzXywgb3AtPm9wY29kZV8sICYob3AtPmFyZ3VtZW50c18pKTsKLSAgfQotCi0gIHZvaWQgUHJlcGFyZVZvbHVtZUNvbnRyb2xPcGVyYXRpb24oc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4mIGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX2lkLCB1aW50OF90IG9wY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYXJndW1lbnRzKSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG51bSBvZiBkZXZpY2VzOiAiIDw8IGRldmljZXMuc2l6ZSgpCi0gICAgICAgICAgICAgICA8PCAiIGdyb3VwX2lkOiAiIDw8IGdyb3VwX2lkIDw8ICIgb3Bjb2RlOiAiIDw8ICtvcGNvZGUKLSAgICAgICAgICAgICAgIDw8ICIgYXJnIHNpemU6ICIgPDwgYXJndW1lbnRzLnNpemUoKTsKLQotICAgIG9uZ29pbmdfb3BlcmF0aW9uc18uZW1wbGFjZV9iYWNrKGxhdGVzdF9vcGVyYXRpb25faWRfKyssIGdyb3VwX2lkLCBvcGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLCBkZXZpY2VzKTsKLSAgfQotCi0gIHZvaWQgU2V0Vm9sdW1lKHN0ZDo6dmFyaWFudDxSYXdBZGRyZXNzLCBpbnQ+IGFkZHJfb3JfZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdm9sdW1lKSBvdmVycmlkZSB7Ci0gICAgRExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHZvbDogIiA8PCArdm9sdW1lOwotCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYXJnKHt2b2x1bWV9KTsKLSAgICB1aW50OF90IG9wY29kZSA9IGtDb250cm9sUG9pbnRPcGNvZGVTZXRBYnNvbHV0ZVZvbHVtZTsKLQotICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFJhd0FkZHJlc3M+KGFkZHJfb3JfZ3JvdXBfaWQpKSB7Ci0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBzdGQ6OmdldDxSYXdBZGRyZXNzPihhZGRyX29yX2dyb3VwX2lkKTsKLSAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGRldmljZXMgPSB7Ci0gICAgICAgICAgc3RkOjpnZXQ8UmF3QWRkcmVzcz4oYWRkcl9vcl9ncm91cF9pZCl9OwotCi0gICAgICBQcmVwYXJlVm9sdW1lQ29udHJvbE9wZXJhdGlvbihkZXZpY2VzLCBibHVldG9vdGg6Omdyb3Vwczo6a0dyb3VwVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwgYXJnKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogSGFuZGxlIGdyb3VwIGNoYW5nZSAqLwotICAgICAgYXV0byBncm91cF9pZCA9IHN0ZDo6Z2V0PGludD4oYWRkcl9vcl9ncm91cF9pZCk7Ci0gICAgICBETE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXA6ICIgPDwgZ3JvdXBfaWQ7Ci0gICAgICBhdXRvIGNzaXNfYXBpID0gQ3Npc0NsaWVudDo6R2V0KCk7Ci0gICAgICBpZiAoIWNzaXNfYXBpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBDc2lzIGlzIG5vdCB0aGVyZSI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgYXV0byBkZXZpY2VzID0gY3Npc19hcGktPkdldERldmljZUxpc3QoZ3JvdXBfaWQpOwotICAgICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VzLmVuZCgpOykgewotICAgICAgICBhdXRvIGRldiA9IHZvbHVtZV9jb250cm9sX2RldmljZXNfLkZpbmRCeUFkZHJlc3MoKml0KTsKLSAgICAgICAgaWYgKCFkZXYgfHwgIWRldi0+SXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgIGl0ID0gZGV2aWNlcy5lcmFzZShpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaXQrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZGV2aWNlcy5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBncm91cCBpZCA6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBjb25uZWN0ZWQ/ICI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgUHJlcGFyZVZvbHVtZUNvbnRyb2xPcGVyYXRpb24oZGV2aWNlcywgZ3JvdXBfaWQsIG9wY29kZSwgYXJnKTsKLSAgICB9Ci0KLSAgICBTdGFydFF1ZXVlT3BlcmF0aW9uKCk7Ci0gIH0KLQotICB2b2lkIENsZWFuVXAoKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIHZvbHVtZV9jb250cm9sX2RldmljZXNfLkRpc2Nvbm5lY3QoZ2F0dF9pZl8pOwotICAgIHZvbHVtZV9jb250cm9sX2RldmljZXNfLkNsZWFyKCk7Ci0gICAgb25nb2luZ19vcGVyYXRpb25zXy5jbGVhcigpOwotICAgIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyKGdhdHRfaWZfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdEdBVFRfSUYgZ2F0dF9pZl87Ci0gIGJsdWV0b290aDo6dmM6OlZvbHVtZUNvbnRyb2xDYWxsYmFja3MqIGNhbGxiYWNrc187Ci0gIFZvbHVtZUNvbnRyb2xEZXZpY2VzIHZvbHVtZV9jb250cm9sX2RldmljZXNfOwotCi0gIC8qIFVzZWQgdG8gdHJhY2sgdm9sdW1lIGNvbnRyb2wgb3BlcmF0aW9ucyAqLwotICBzdGQ6Omxpc3Q8Vm9sdW1lT3BlcmF0aW9uPiBvbmdvaW5nX29wZXJhdGlvbnNfOwotICBpbnQgbGF0ZXN0X29wZXJhdGlvbl9pZF87Ci0KLSAgdm9pZCB2ZXJpZnlfZGV2aWNlX3JlYWR5KFZvbHVtZUNvbnRyb2xEZXZpY2UqIGRldmljZSwgdWludDE2X3QgaGFuZGxlKSB7Ci0gICAgaWYgKGRldmljZS0+ZGV2aWNlX3JlYWR5KSByZXR1cm47Ci0KLSAgICAvLyBWZXJpZnlSZWFkeSBzZXRzIHRoZSBkZXZpY2VfcmVhZHkgZmxhZyBpZiBhbGwgcmVtYWluaW5nIEdBVFQgb3BlcmF0aW9ucwotICAgIC8vIGFyZSBjb21wbGV0ZWQKLSAgICBpZiAoZGV2aWNlLT5WZXJpZnlSZWFkeShoYW5kbGUpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBPdXRzdGFuZGluZyByZWFkcyBjb21wbGV0ZWQuIjsKLQotICAgICAgY2FsbGJhY2tzXy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmFkZHJlc3MpOwotCi0gICAgICBkZXZpY2UtPmNvbm5lY3RpbmdfYWN0aXZlbHkgPSB0cnVlOwotCi0gICAgICBkZXZpY2UtPmZpcnN0X2Nvbm5lY3Rpb24gPSBmYWxzZTsKLQotICAgICAgLy8gb25jZSBwcm9maWxlIGNvbm5lY3RlZCB3ZSBjYW4gbm90aWZ5IGN1cnJlbnQgc3RhdGVzCi0gICAgICBjYWxsYmFja3NfLT5PblZvbHVtZVN0YXRlQ2hhbmdlZChkZXZpY2UtPmFkZHJlc3MsIGRldmljZS0+dm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5tdXRlKTsKLQotICAgICAgZGV2aWNlLT5FbnF1ZXVlUmVtYWluaW5nUmVxdWVzdHMoZ2F0dF9pZl8sIGNocmNfcmVhZF9jYWxsYmFja19zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkdhdHRXcml0ZUNjY1N0YXRpYyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBkZXZpY2VfY2xlYW51cF9oZWxwZXIoVm9sdW1lQ29udHJvbERldmljZSogZGV2aWNlLCBib29sIG5vdGlmeSkgewotICAgIGRldmljZS0+RGlzY29ubmVjdChnYXR0X2lmXyk7Ci0gICAgaWYgKG5vdGlmeSkKLSAgICAgIGNhbGxiYWNrc18tPk9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hZGRyZXNzKTsKLSAgICB2b2x1bWVfY29udHJvbF9kZXZpY2VzXy5SZW1vdmUoZGV2aWNlLT5hZGRyZXNzKTsKLSAgfQotCi0gIHZvaWQgZGV2aWNlc19jb250cm9sX3BvaW50X2hlbHBlcihzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiYgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcGVyYXRpb25faWQgPSAtMSkgewotICAgIHZvbHVtZV9jb250cm9sX2RldmljZXNfLkNvbnRyb2xQb2ludE9wZXJhdGlvbigKLSAgICAgICAgZGV2aWNlcywgb3Bjb2RlLCBhcmcsCi0gICAgICAgIFtdKHVpbnQxNl90IGNvbm5lY3Rpb25faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgICAgICAgIGlmIChpbnN0YW5jZSkKLSAgICAgICAgICAgIGluc3RhbmNlLT5PbldyaXRlQ29udHJvbFJlc3BvbnNlKGNvbm5lY3Rpb25faWQsIHN0YXR1cywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0gICAgICAgIH0sCi0gICAgICAgIElOVF9UT19QVFIob3BlcmF0aW9uX2lkKSk7Ci0gIH0KLQotICB2b2lkIGdhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBldmVudCA9ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihldmVudCk7Ci0KLSAgICBpZiAocF9kYXRhID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOiB7Ci0gICAgICAgIHRCVEFfR0FUVENfT1BFTiYgbyA9IHBfZGF0YS0+b3BlbjsKLSAgICAgICAgT25HYXR0Q29ubmVjdGVkKG8uc3RhdHVzLCBvLmNvbm5faWQsIG8uY2xpZW50X2lmLCBvLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBvLnRyYW5zcG9ydCwgby5tdHUpOwotCi0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIEJUQV9HQVRUQ19DTE9TRV9FVlQ6IHsKLSAgICAgICAgdEJUQV9HQVRUQ19DTE9TRSYgYyA9IHBfZGF0YS0+Y2xvc2U7Ci0gICAgICAgIE9uR2F0dERpc2Nvbm5lY3RlZChjLmNvbm5faWQsIGMuY2xpZW50X2lmLCBjLnJlbW90ZV9iZGEsIGMucmVhc29uKTsKLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgICAgT25TZXJ2aWNlU2VhcmNoQ29tcGxldGUocF9kYXRhLT5zZWFyY2hfY21wbC5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLnN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUQV9HQVRUQ19OT1RJRl9FVlQ6IHsKLSAgICAgICAgdEJUQV9HQVRUQ19OT1RJRlkmIG4gPSBwX2RhdGEtPm5vdGlmeTsKLSAgICAgICAgaWYgKCFuLmlzX25vdGlmeSB8fCBuLmxlbiA+IEdBVFRfTUFYX0FUVFJfTEVOKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiByZWplY3RlZCBCVEFfR0FUVENfTk9USUZfRVZULiBpc19ub3RpZnk9IgotICAgICAgICAgICAgICAgICAgICAgPDwgbi5pc19ub3RpZnkgPDwgIiwgbGVuPSIgPDwgc3RhdGljX2Nhc3Q8aW50PihuLmxlbik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgT25Ob3RpZmljYXRpb25FdmVudChuLmNvbm5faWQsIG4uaGFuZGxlLCBuLmxlbiwgbi52YWx1ZSk7Ci0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQ6Ci0gICAgICAgIE9uRW5jcnlwdGlvbkNvbXBsZXRlKHBfZGF0YS0+ZW5jX2NtcGwucmVtb3RlX2JkYSwgQlRNX1NVQ0NFU1MpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVEFfR0FUVENfU1JWQ19DSEdfRVZUOgotICAgICAgICBPblNlcnZpY2VDaGFuZ2VFdmVudChwX2RhdGEtPnJlbW90ZV9iZGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVEFfR0FUVENfU1JWQ19ESVNDX0RPTkVfRVZUOgotICAgICAgICBPblNlcnZpY2VEaXNjRG9uZUV2ZW50KHBfZGF0YS0+cmVtb3RlX2JkYSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBnYXR0Y19jYWxsYmFja19zdGF0aWModEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPmdhdHRjX2NhbGxiYWNrKGV2ZW50LCBwX2RhdGEpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgZW5jX2NhbGxiYWNrX3N0YXRpYyhjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzLCB0QlRfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLCB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgICBpZiAoaW5zdGFuY2UpIGluc3RhbmNlLT5PbkVuY3J5cHRpb25Db21wbGV0ZSgqYWRkcmVzcywgc3RhdHVzKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGNocmNfcmVhZF9jYWxsYmFja19zdGF0aWModWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PbkNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2VkKGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZGF0YSwgZmFsc2UpOwotICB9Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgVm9sdW1lQ29udHJvbDo6SW5pdGlhbGl6ZSgKLSAgICBibHVldG9vdGg6OnZjOjpWb2x1bWVDb250cm9sQ2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZCEiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluc3RhbmNlID0gbmV3IFZvbHVtZUNvbnRyb2xJbXBsKGNhbGxiYWNrcyk7Ci19Ci0KLWJvb2wgVm9sdW1lQ29udHJvbDo6SXNWb2x1bWVDb250cm9sUnVubmluZygpIHsgcmV0dXJuIGluc3RhbmNlOyB9Ci0KLVZvbHVtZUNvbnRyb2wqIFZvbHVtZUNvbnRyb2w6OkdldCh2b2lkKSB7Ci0gIENIRUNLKGluc3RhbmNlKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfTsKLQotdm9pZCBWb2x1bWVDb250cm9sOjpBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9fY29ubmVjdCkgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTm90IGluaXRpYWxpemVkIHlldCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5zdGFuY2UtPkFkZEZyb21TdG9yYWdlKGFkZHJlc3MsIGF1dG9fY29ubmVjdCk7Ci19OwotCi12b2lkIFZvbHVtZUNvbnRyb2w6OkNsZWFuVXAoKSB7Ci0gIGlmICghaW5zdGFuY2UpIHsKLSAgICBMT0coRVJST1IpIDw8ICJOb3QgaW5pdGlhbGl6ZWQhIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBWb2x1bWVDb250cm9sSW1wbCogcHRyID0gaW5zdGFuY2U7Ci0gIGluc3RhbmNlID0gbnVsbHB0cjsKLQotICBwdHItPkNsZWFuVXAoKTsKLQotICBkZWxldGUgcHRyOwotfTsKLQotdm9pZCBWb2x1bWVDb250cm9sOjpEZWJ1Z0R1bXAoaW50IGZkKSB7Ci0gIGRwcmludGYoZmQsICJWb2x1bWUgQ29udHJvbCBNYW5hZ2VyOlxuIik7Ci0gIGlmIChpbnN0YW5jZSkgaW5zdGFuY2UtPkR1bXAoZmQpOwotICBkcHJpbnRmKGZkLCAiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2J0YS92Yy92Y190ZXN0LmNjIGIvYnRhL3ZjL3ZjX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDRmMjAuLjAwMDAwMDAKLS0tIGEvYnRhL3ZjL3ZjX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaV9tb2NrLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfcXVldWVfbW9jay5oIgotI2luY2x1ZGUgImJ0YV92Y19hcGkuaCIKLSNpbmNsdWRlICJidG1fYXBpX21vY2suaCIKLSNpbmNsdWRlICJnYXR0L2RhdGFiYXNlX2J1aWxkZXIuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9nYXR0X3R5cGVzLmgiCi0jaW5jbHVkZSAibW9ja19jc2lzX2NsaWVudC5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLXZvaWQgYnRpZl9zdG9yYWdlX2FkZF92b2x1bWVfY29udHJvbChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBib29sIGF1dG9fY29ubikge30KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdmMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIGJhc2U6OkJpbmQ7Ci11c2luZyBiYXNlOjpVbnJldGFpbmVkOwotCi11c2luZyBibHVldG9vdGg6OnZjOjpDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OnZjOjpWb2x1bWVDb250cm9sQ2FsbGJhY2tzOwotCi11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpEb0RlZmF1bHQ7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpNb2NrOwotdXNpbmcgdGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyB0ZXN0aW5nOjpTZXRBcmdQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6V2l0aEFyZzsKLQotUmF3QWRkcmVzcyBHZXRUZXN0QWRkcmVzcyhpbnQgaW5kZXgpIHsKLSAgQ0hFQ0tfTFQoaW5kZXgsIFVJTlQ4X01BWCk7Ci0gIFJhd0FkZHJlc3MgcmVzdWx0ID0gewotICAgICAgezB4QzAsIDB4REUsIDB4QzAsIDB4REUsIDB4MDAsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGluZGV4KX19OwotICByZXR1cm4gcmVzdWx0OwotfQotCi1jbGFzcyBNb2NrVm9sdW1lQ29udHJvbENhbGxiYWNrcyA6IHB1YmxpYyBWb2x1bWVDb250cm9sQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIE1vY2tWb2x1bWVDb250cm9sQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotICB+TW9ja1ZvbHVtZUNvbnRyb2xDYWxsYmFja3MoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkNvbm5lY3Rpb25TdGF0ZSwKLSAgICAgICAgICAgICAgKENvbm5lY3Rpb25TdGF0ZSBzdGF0ZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uVm9sdW1lU3RhdGVDaGFuZ2VkLAotICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCB2b2x1bWUsIGJvb2wgbXV0ZSksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uR3JvdXBWb2x1bWVTdGF0ZUNoYW5nZWQsCi0gICAgICAgICAgICAgIChpbnQgZ3JvdXBfaWQsIHVpbnQ4X3Qgdm9sdW1lLCBib29sIG11dGUpLCAob3ZlcnJpZGUpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrVm9sdW1lQ29udHJvbENhbGxiYWNrcyk7Ci19OwotCi1jbGFzcyBWb2x1bWVDb250cm9sVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByaXZhdGU6Ci0gIHZvaWQgc2V0X3NhbXBsZV9kYXRhYmFzZSh1aW50MTZfdCBjb25uX2lkLCBib29sIHZjcywgYm9vbCB2Y3NfYnJva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhaWNzLCBib29sIGFpY3NfYnJva2VuLCBib29sIHZvY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZvY3NfYnJva2VuKSB7Ci0gICAgZ2F0dDo6RGF0YWJhc2VCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDAwMSwgMHgwMDAzLCBVdWlkOjpGcm9tMTZCaXQoMHgxODAwKSwgdHJ1ZSk7Ci0gICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMDIsIDB4MDAwMywgVXVpZDo6RnJvbTE2Qml0KDB4MmEwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCk7Ci0gICAgLyogMHgwMDA0LTB4MDAwZiBSRlUgKi8KLSAgICBpZiAodmNzKSB7Ci0gICAgICAvKiBWQ1MgKi8KLSAgICAgIGJ1aWxkZXIuQWRkU2VydmljZSgweDAwMTAsIDB4MDAyNiwga1ZvbHVtZUNvbnRyb2xVdWlkLCB0cnVlKTsKLSAgICAgIGlmIChhaWNzKSB7Ci0gICAgICAgIC8qIFRPRE8gUGxhY2UgaG9sZGVyICovCi0gICAgICB9Ci0gICAgICBpZiAodm9jcykgewotICAgICAgICAvKiBUT0RPIFBsYWNlIGhvbGRlciAqLwotICAgICAgfQotICAgICAgLyogMHgwMDE1LTB4MDAxZiBSRlUgKi8KLSAgICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgMHgwMDIwLCAweDAwMjEsIGtWb2x1bWVDb250cm9sU3RhdGVVdWlkLAotICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEIHwgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSk7Ci0gICAgICBidWlsZGVyLkFkZERlc2NyaXB0b3IoMHgwMDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgICBpZiAoIXZjc19icm9rZW4pIHsKLSAgICAgICAgYnVpbGRlci5BZGRDaGFyYWN0ZXJpc3RpYygweDAwMjMsIDB4MDAyNCwga1ZvbHVtZUNvbnRyb2xQb2ludFV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1dSSVRFKTsKLSAgICAgIH0KLSAgICAgIGJ1aWxkZXIuQWRkQ2hhcmFjdGVyaXN0aWMoMHgwMDI1LCAweDAwMjYsIGtWb2x1bWVGbGFnc1V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEKTsKLSAgICAgIC8qIDB4MDAyNy0weDAwMmYgUkZVICovCi0gICAgICBpZiAoYWljcykgewotICAgICAgICAvKiBUT0RPIFBsYWNlIGhvbGRlciBmb3IgQUlDUyAqLwotICAgICAgfQotICAgICAgaWYgKHZvY3MpIHsKLSAgICAgICAgLyogVE9ETyBQbGFjZSBob2xkZXIgZm9yIFZPQ1MgKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgLyogMHgwMDhjLTB4MDA4ZiBSRlUgKi8KLQotICAgIC8qIEdBVFRTICovCi0gICAgYnVpbGRlci5BZGRTZXJ2aWNlKDB4MDA5MCwgMHgwMDkzLAotICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpLCB0cnVlKTsKLSAgICBidWlsZGVyLkFkZENoYXJhY3RlcmlzdGljKDB4MDA5MSwgMHgwMDkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9HQVRUX1NSVl9DSEdEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlkpOwotICAgIGJ1aWxkZXIuQWRkRGVzY3JpcHRvcigweDAwOTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSk7Ci0gICAgc2VydmljZXNfbWFwW2Nvbm5faWRdID0gYnVpbGRlci5CdWlsZCgpLlNlcnZpY2VzKCk7Ci0KLSAgICBPTl9DQUxMKGdhdHRfcXVldWUsIFJlYWRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBfLCBfLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoSW52b2tlKFsmXSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRUFEX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLQotICAgICAgICAgIHN3aXRjaCAoaGFuZGxlKSB7Ci0gICAgICAgICAgICBjYXNlIDB4MDAwMzoKLSAgICAgICAgICAgICAgLyogZGV2aWNlIG5hbWUgKi8KLSAgICAgICAgICAgICAgdmFsdWUucmVzaXplKDIwKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMHgwMDIxOgotICAgICAgICAgICAgICAvKiB2b2x1bWUgc3RhdGUgKi8KLSAgICAgICAgICAgICAgdmFsdWUucmVzaXplKDMpOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAweDAwMjY6Ci0gICAgICAgICAgICAgIC8qIHZvbHVtZSBmbGFncyAqLwotICAgICAgICAgICAgICB2YWx1ZS5yZXNpemUoMSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjYihjb25uX2lkLCBHQVRUX1NVQ0NFU1MsIGhhbmRsZSwgdmFsdWUuc2l6ZSgpLCB2YWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgY2JfZGF0YSk7Ci0gICAgICAgIH0pKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1JbnRlcmZhY2UoJmJ0bV9pbnRlcmZhY2UpOwotICAgIE1vY2tDc2lzQ2xpZW50OjpTZXRNb2NrSW5zdGFuY2VGb3JUZXN0aW5nKCZtb2NrX2NzaXNfY2xpZW50X21vZHVsZV8pOwotICAgIGdhdHQ6OlNldE1vY2tCdGFHYXR0SW50ZXJmYWNlKCZnYXR0X2ludGVyZmFjZSk7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRRdWV1ZSgmZ2F0dF9xdWV1ZSk7Ci0gICAgY2FsbGJhY2tzLnJlc2V0KG5ldyBNb2NrVm9sdW1lQ29udHJvbENhbGxiYWNrcygpKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBHZXRDaGFyYWN0ZXJpc3RpYyBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChnYXR0X2ludGVyZmFjZSwgR2V0Q2hhcmFjdGVyaXN0aWMoXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgICAgSW52b2tlKFsmXSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIC0+IGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiB7Ci0gICAgICAgICAgICAgIHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiYgc2VydmljZXMgPSBzZXJ2aWNlc19tYXBbY29ubl9pZF07Ci0gICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgc2VydmljZSA6IHNlcnZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBjaGFyYWN0ZXJpc3RpYyA6IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyaXN0aWMudmFsdWVfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJmNoYXJhY3RlcmlzdGljOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICAgICAgfSkpOwotCi0gICAgLy8gZGVmYXVsdCBhY3Rpb24gZm9yIEdldE93bmluZ1NlcnZpY2UgZnVuY3Rpb24gY2FsbAotICAgIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIEdldE93bmluZ1NlcnZpY2UoXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZSgKLSAgICAgICAgICAgIFsmXSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUpIC0+IGNvbnN0IGdhdHQ6OlNlcnZpY2UqIHsKLSAgICAgICAgICAgICAgc3RkOjpsaXN0PGdhdHQ6OlNlcnZpY2U+JiBzZXJ2aWNlcyA9IHNlcnZpY2VzX21hcFtjb25uX2lkXTsKLSAgICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBzZXJ2aWNlIDogc2VydmljZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5oYW5kbGUgPD0gaGFuZGxlICYmIHNlcnZpY2UuZW5kX2hhbmRsZSA+PSBoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAmc2VydmljZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICAgIH0pKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBHZXRTZXJ2aWNlcyBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChnYXR0X2ludGVyZmFjZSwgR2V0U2VydmljZXMoXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFdpdGhBcmc8MD4oCi0gICAgICAgICAgICBJbnZva2UoWyZdKHVpbnQxNl90IGNvbm5faWQpIC0+IHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiogewotICAgICAgICAgICAgICByZXR1cm4gJnNlcnZpY2VzX21hcFtjb25uX2lkXTsKLSAgICAgICAgICAgIH0pKSk7Ci0KLSAgICAvLyBkZWZhdWx0IGFjdGlvbiBmb3IgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zIGZ1bmN0aW9uIGNhbGwKLSAgICBPTl9DQUxMKGdhdHRfaW50ZXJmYWNlLCBSZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoZ2F0dF9pZiwgXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihHQVRUX1NVQ0NFU1MpKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBEZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyBmdW5jdGlvbiBjYWxsCi0gICAgT05fQ0FMTChnYXR0X2ludGVyZmFjZSwgRGVyZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoZ2F0dF9pZiwgXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihHQVRUX1NVQ0NFU1MpKTsKLQotICAgIC8vIGRlZmF1bHQgYWN0aW9uIGZvciBXcml0ZURlc2NyaXB0b3IgZnVuY3Rpb24gY2FsbAotICAgIE9OX0NBTEwoZ2F0dF9xdWV1ZSwgV3JpdGVEZXNjcmlwdG9yKF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIEludm9rZShbXSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgaWYgKGNiKQotICAgICAgICAgICAgICAgIGNiKGNvbm5faWQsIEdBVFRfU1VDQ0VTUywgaGFuZGxlLCB2YWx1ZS5zaXplKCksIHZhbHVlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICBjYl9kYXRhKTsKLSAgICAgICAgICAgIH0pKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24odm9pZCkgb3ZlcnJpZGUgewotICAgIHNlcnZpY2VzX21hcC5jbGVhcigpOwotICAgIGNhbGxiYWNrcy5yZXNldCgpOwotICAgIGdhdHQ6OlNldE1vY2tCdGFHYXR0UXVldWUobnVsbHB0cik7Ci0gICAgZ2F0dDo6U2V0TW9ja0J0YUdhdHRJbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpTZXRNb2NrQnRtSW50ZXJmYWNlKG51bGxwdHIpOwotICB9Ci0KLSAgdm9pZCBUZXN0QXBwUmVnaXN0ZXIodm9pZCkgewotICAgIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgYXBwX3JlZ2lzdGVyX2NhbGxiYWNrOwotICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLCBBcHBSZWdpc3RlcihfLCBfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmdhdHRfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZUFyZzwxPigmYXBwX3JlZ2lzdGVyX2NhbGxiYWNrKSkpOwotICAgIFZvbHVtZUNvbnRyb2w6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgICBBU1NFUlRfVFJVRShnYXR0X2NhbGxiYWNrKTsKLSAgICBBU1NFUlRfVFJVRShhcHBfcmVnaXN0ZXJfY2FsbGJhY2spOwotICAgIGFwcF9yZWdpc3Rlcl9jYWxsYmFjay5SdW4oZ2F0dF9pZiwgR0FUVF9TVUNDRVNTKTsKLSAgICBBU1NFUlRfVFJVRShWb2x1bWVDb250cm9sOjpJc1ZvbHVtZUNvbnRyb2xSdW5uaW5nKCkpOwotICB9Ci0KLSAgdm9pZCBUZXN0QXBwVW5yZWdpc3Rlcih2b2lkKSB7Ci0gICAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIEFwcERlcmVnaXN0ZXIoZ2F0dF9pZikpOwotICAgIFZvbHVtZUNvbnRyb2w6OkNsZWFuVXAoKTsKLSAgICBBU1NFUlRfRkFMU0UoVm9sdW1lQ29udHJvbDo6SXNWb2x1bWVDb250cm9sUnVubmluZygpKTsKLSAgICBnYXR0X2NhbGxiYWNrID0gbnVsbHB0cjsKLSAgfQotCi0gIHZvaWQgVGVzdENvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8vIGJ5IGRlZmF1bHQgaW5kaWNhdGUgbGluayBhcyBlbmNyeXB0ZWQKLSAgICBPTl9DQUxMKGJ0bV9pbnRlcmZhY2UsIEJUTV9Jc0VuY3J5cHRlZChhZGRyZXNzLCBfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKHRydWUpKSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChnYXR0X2ludGVyZmFjZSwgT3BlbihnYXR0X2lmLCBhZGRyZXNzLCB0cnVlLCBfKSk7Ci0gICAgVm9sdW1lQ29udHJvbDo6R2V0KCktPkNvbm5lY3QoYWRkcmVzcyk7Ci0gIH0KLQotICB2b2lkIFRlc3REaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICBpZiAoY29ubl9pZCkgewotICAgICAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIENsb3NlKGNvbm5faWQpKTsKLSAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIENhbmNlbE9wZW4oZ2F0dF9pZiwgYWRkcmVzcywgXykpOwotICAgIH0KLSAgICBWb2x1bWVDb250cm9sOjpHZXQoKS0+RGlzY29ubmVjdChhZGRyZXNzKTsKLSAgfQotCi0gIHZvaWQgVGVzdEFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGJvb2wgYXV0b19jb25uZWN0KSB7Ci0gICAgLy8gYnkgZGVmYXVsdCBpbmRpY2F0ZSBsaW5rIGFzIGVuY3J5cHRlZAotICAgIE9OX0NBTEwoYnRtX2ludGVyZmFjZSwgQlRNX0lzRW5jcnlwdGVkKGFkZHJlc3MsIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChSZXR1cm4odHJ1ZSkpKTsKLQotICAgIGlmIChhdXRvX2Nvbm5lY3QpIHsKLSAgICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLCBPcGVuKGdhdHRfaWYsIGFkZHJlc3MsIGZhbHNlLCBfKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLCBPcGVuKGdhdHRfaWYsIGFkZHJlc3MsIF8sIF8pKS5UaW1lcygwKTsKLSAgICB9Ci0gICAgVm9sdW1lQ29udHJvbDo6R2V0KCktPkFkZEZyb21TdG9yYWdlKGFkZHJlc3MsIGF1dG9fY29ubmVjdCk7Ci0gIH0KLQotICB2b2lkIFRlc3RTdWJzY3JpYmVOb3RpZmljYXRpb25zKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dWludDE2X3QsIHVpbnQxNl90PiYgaGFuZGxlX3BhaXJzKSB7Ci0gICAgU2V0U2FtcGxlRGF0YWJhc2UoY29ubl9pZCk7Ci0gICAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gICAgVGVzdENvbm5lY3QoYWRkcmVzcyk7Ci0gICAgR2V0Q29ubmVjdGVkRXZlbnQoYWRkcmVzcywgY29ubl9pZCk7Ci0KLSAgICBFWFBFQ1RfQ0FMTChnYXR0X3F1ZXVlLCBXcml0ZURlc2NyaXB0b3IoXywgXywgXywgXywgXywgXykpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShEb0RlZmF1bHQoKSk7Ci0gICAgRVhQRUNUX0NBTEwoZ2F0dF9pbnRlcmZhY2UsIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhfLCBfLCBfKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KERvRGVmYXVsdCgpKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5vdGlmeV92YWx1ZSh7MHgwMSwgMHgwMH0pOwotICAgIGZvciAoYXV0byBjb25zdCYgaGFuZGxlcyA6IGhhbmRsZV9wYWlycykgewotICAgICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgV3JpdGVEZXNjcmlwdG9yKGNvbm5faWQsIGhhbmRsZXMuc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV92YWx1ZSwgR0FUVF9XUklURSwgXywgXykpCi0gICAgICAgICAgLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKLSAgICAgIEVYUEVDVF9DQUxMKGdhdHRfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsIGFkZHJlc3MsIGhhbmRsZXMuZmlyc3QpKQotICAgICAgICAgIC5XaWxsT25jZShEb0RlZmF1bHQoKSk7Ci0gICAgfQotCi0gICAgR2V0U2VhcmNoQ29tcGxldGVFdmVudChjb25uX2lkKTsKLSAgICBUZXN0QXBwVW5yZWdpc3RlcigpOwotICB9Ci0KLSAgdm9pZCBUZXN0UmVhZENoYXJhY3RlcmlzdGljKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gaGFuZGxlcykgewotICAgIFNldFNhbXBsZURhdGFiYXNlKGNvbm5faWQpOwotICAgIFRlc3RBcHBSZWdpc3RlcigpOwotICAgIFRlc3RDb25uZWN0KGFkZHJlc3MpOwotICAgIEdldENvbm5lY3RlZEV2ZW50KGFkZHJlc3MsIGNvbm5faWQpOwotCi0gICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgUmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIF8sIF8sIF8pKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoRG9EZWZhdWx0KCkpOwotICAgIGZvciAoYXV0byBjb25zdCYgaGFuZGxlIDogaGFuZGxlcykgewotICAgICAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwgUmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGhhbmRsZSwgXywgXykpCi0gICAgICAgICAgLldpbGxPbmNlKERvRGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KGNvbm5faWQpOwotICAgIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci0gIH0KLQotICB2b2lkIEdldENvbm5lY3RlZEV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICB0QlRBX0dBVFRDX09QRU4gZXZlbnRfZGF0YSA9IHsKLSAgICAgICAgLnN0YXR1cyA9IEdBVFRfU1VDQ0VTUywKLSAgICAgICAgLmNvbm5faWQgPSBjb25uX2lkLAotICAgICAgICAuY2xpZW50X2lmID0gZ2F0dF9pZiwKLSAgICAgICAgLnJlbW90ZV9iZGEgPSBhZGRyZXNzLAotICAgICAgICAudHJhbnNwb3J0ID0gR0FUVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgIC5tdHUgPSAyNDAsCi0gICAgfTsKLQotICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX09QRU5fRVZULCAodEJUQV9HQVRUQyopJmV2ZW50X2RhdGEpOwotICB9Ci0KLSAgdm9pZCBHZXREaXNjb25uZWN0ZWRFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgdEJUQV9HQVRUQ19DTE9TRSBldmVudF9kYXRhID0gewotICAgICAgICAuc3RhdHVzID0gR0FUVF9TVUNDRVNTLAotICAgICAgICAuY29ubl9pZCA9IGNvbm5faWQsCi0gICAgICAgIC5jbGllbnRfaWYgPSBnYXR0X2lmLAotICAgICAgICAucmVtb3RlX2JkYSA9IGFkZHJlc3MsCi0gICAgICAgIC5yZWFzb24gPSBHQVRUX0NPTk5fVEVSTUlOQVRFX1BFRVJfVVNFUiwKLSAgICB9OwotCi0gICAgZ2F0dF9jYWxsYmFjayhCVEFfR0FUVENfQ0xPU0VfRVZULCAodEJUQV9HQVRUQyopJmV2ZW50X2RhdGEpOwotICB9Ci0KLSAgdm9pZCBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICB0QlRBX0dBVFRDX1NFQVJDSF9DTVBMIGV2ZW50X2RhdGEgPSB7Ci0gICAgICAgIC5zdGF0dXMgPSBHQVRUX1NVQ0NFU1MsCi0gICAgICAgIC5jb25uX2lkID0gY29ubl9pZCwKLSAgICB9OwotCi0gICAgZ2F0dF9jYWxsYmFjayhCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZULCAodEJUQV9HQVRUQyopJmV2ZW50X2RhdGEpOwotICB9Ci0KLSAgdm9pZCBTZXRFbmNyeXB0aW9uUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGJvb2wgc3VjY2VzcykgewotICAgIE9OX0NBTEwoYnRtX2ludGVyZmFjZSwgQlRNX0lzRW5jcnlwdGVkKGFkZHJlc3MsIF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChEb0FsbChSZXR1cm4oZmFsc2UpKSk7Ci0gICAgRVhQRUNUX0NBTEwoYnRtX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBTZXRFbmNyeXB0aW9uKGFkZHJlc3MsIF8sIE5vdE51bGwoKSwgXywgQlRNX0JMRV9TRUNfRU5DUllQVCkpCi0gICAgICAgIC5XaWxsT25jZShJbnZva2UoCi0gICAgICAgICAgICBbJnN1Y2Nlc3NdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSAtPiB0QlRNX1NUQVRVUyB7Ci0gICAgICAgICAgICAgIHBfY2FsbGJhY2soJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID8gQlRNX1NVQ0NFU1MgOiBCVE1fRkFJTEVEX09OX1NFQ1VSSVRZKTsKLSAgICAgICAgICAgICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICAgICAgICAgICAgfSkpOwotICB9Ci0KLSAgdm9pZCBTZXRTYW1wbGVEYXRhYmFzZVZDUyh1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgc2V0X3NhbXBsZV9kYXRhYmFzZShjb25uX2lkLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCBTZXRTYW1wbGVEYXRhYmFzZU5vVkNTKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICBzZXRfc2FtcGxlX2RhdGFiYXNlKGNvbm5faWQsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHZvaWQgU2V0U2FtcGxlRGF0YWJhc2VWQ1NCcm9rZW4odWludDE2X3QgY29ubl9pZCkgewotICAgIHNldF9zYW1wbGVfZGF0YWJhc2UoY29ubl9pZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHZvaWQgU2V0U2FtcGxlRGF0YWJhc2UodWludDE2X3QgY29ubl9pZCkgewotICAgIHNldF9zYW1wbGVfZGF0YWJhc2UoY29ubl9pZCwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja1ZvbHVtZUNvbnRyb2xDYWxsYmFja3M+IGNhbGxiYWNrczsKLSAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpNb2NrQnRtSW50ZXJmYWNlIGJ0bV9pbnRlcmZhY2U7Ci0gIE1vY2tDc2lzQ2xpZW50IG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXzsKLSAgZ2F0dDo6TW9ja0J0YUdhdHRJbnRlcmZhY2UgZ2F0dF9pbnRlcmZhY2U7Ci0gIGdhdHQ6Ok1vY2tCdGFHYXR0UXVldWUgZ2F0dF9xdWV1ZTsKLSAgdEJUQV9HQVRUQ19DQkFDSyogZ2F0dF9jYWxsYmFjazsKLSAgY29uc3QgdWludDhfdCBnYXR0X2lmID0gMHhmZjsKLSAgc3RkOjptYXA8dWludDE2X3QsIHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPj4gc2VydmljZXNfbWFwOwotfTsKLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X2dldF91bmluaXRpYWxpemVkKSB7Ci0gIEFTU0VSVF9ERUFUSChWb2x1bWVDb250cm9sOjpHZXQoKSwgIiIpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbFRlc3QsIHRlc3RfaW5pdGlhbGl6ZSkgewotICBWb2x1bWVDb250cm9sOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIEFTU0VSVF9UUlVFKFZvbHVtZUNvbnRyb2w6OklzVm9sdW1lQ29udHJvbFJ1bm5pbmcoKSk7Ci0gIFZvbHVtZUNvbnRyb2w6OkNsZWFuVXAoKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X2luaXRpYWxpemVfdHdpY2UpIHsKLSAgVm9sdW1lQ29udHJvbDo6SW5pdGlhbGl6ZShjYWxsYmFja3MuZ2V0KCkpOwotICBWb2x1bWVDb250cm9sKiB2b2x1bWVfY29udHJvbF9wID0gVm9sdW1lQ29udHJvbDo6R2V0KCk7Ci0gIFZvbHVtZUNvbnRyb2w6OkluaXRpYWxpemUoY2FsbGJhY2tzLmdldCgpKTsKLSAgQVNTRVJUX0VRKHZvbHVtZV9jb250cm9sX3AsIFZvbHVtZUNvbnRyb2w6OkdldCgpKTsKLSAgVm9sdW1lQ29udHJvbDo6Q2xlYW5VcCgpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbFRlc3QsIHRlc3RfY2xlYW51cF9pbml0aWFsaXplZCkgewotICBWb2x1bWVDb250cm9sOjpJbml0aWFsaXplKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIFZvbHVtZUNvbnRyb2w6OkNsZWFuVXAoKTsKLSAgQVNTRVJUX0ZBTFNFKFZvbHVtZUNvbnRyb2w6OklzVm9sdW1lQ29udHJvbFJ1bm5pbmcoKSk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVGVzdCwgdGVzdF9jbGVhbnVwX3VuaW5pdGlhbGl6ZWQpIHsKLSAgVm9sdW1lQ29udHJvbDo6Q2xlYW5VcCgpOwotICBBU1NFUlRfRkFMU0UoVm9sdW1lQ29udHJvbDo6SXNWb2x1bWVDb250cm9sUnVubmluZygpKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X2FwcF9yZWdpc3RyYXRpb24pIHsKLSAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVGVzdCwgdGVzdF9jb25uZWN0KSB7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0Q29ubmVjdChHZXRUZXN0QWRkcmVzcygwKSk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVGVzdCwgdGVzdF9hZGRfZnJvbV9zdG9yYWdlKSB7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMCksIHRydWUpOwotICBUZXN0QWRkRnJvbVN0b3JhZ2UoR2V0VGVzdEFkZHJlc3MoMSksIGZhbHNlKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X2Rpc2Nvbm5lY3Rfbm9uX2Nvbm5lY3RlZCkgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHRlc3RfYWRkcmVzcykpOwotICBUZXN0RGlzY29ubmVjdCh0ZXN0X2FkZHJlc3MsIDApOwotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbFRlc3QsIHRlc3RfZGlzY29ubmVjdF9jb25uZWN0ZWQpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIEdldENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgMSk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MpKTsKLSAgVGVzdERpc2Nvbm5lY3QodGVzdF9hZGRyZXNzLCAxKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X2Rpc2Nvbm5lY3RlZCkgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgR2V0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHRlc3RfYWRkcmVzcykpOwotICBHZXREaXNjb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbFRlc3QsIHRlc3RfZGlzY29ubmVjdGVkX3doaWxlX2F1dG9jb25uZWN0KSB7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0QWRkRnJvbVN0b3JhZ2UodGVzdF9hZGRyZXNzLCB0cnVlKTsKLSAgR2V0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgLy8gYXV0b2Nvbm5lY3QgLSBkb24ndCBpbmRpY2F0ZSBkaXNjb25uZWN0aW9uCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MpKQotICAgICAgLlRpbWVzKDApOwotICBHZXREaXNjb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBUZXN0QXBwVW5yZWdpc3RlcigpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbFRlc3QsIHRlc3RfcmVjb25uZWN0X2FmdGVyX2VuY3J5cHRpb25fZmFpbGVkKSB7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0QWRkRnJvbVN0b3JhZ2UodGVzdF9hZGRyZXNzLCB0cnVlKTsKLSAgU2V0RW5jcnlwdGlvblJlc3VsdCh0ZXN0X2FkZHJlc3MsIGZhbHNlKTsKLSAgLy8gYXV0b2Nvbm5lY3QgLSBkb24ndCBpbmRpY2F0ZSBkaXNjb25uZWN0aW9uCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MpKQotICAgICAgLlRpbWVzKDApOwotICBHZXRDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmYnRtX2ludGVyZmFjZSk7Ci0gIFNldEVuY3J5cHRpb25SZXN1bHQodGVzdF9hZGRyZXNzLCB0cnVlKTsKLSAgR2V0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X2Rpc2NvdmVyeV92Y3NfZm91bmQpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgU2V0U2FtcGxlRGF0YWJhc2VWQ1MoMSk7Ci0gIFRlc3RBcHBSZWdpc3RlcigpOwotICBUZXN0Q29ubmVjdCh0ZXN0X2FkZHJlc3MpOwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLAotICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCwgdGVzdF9hZGRyZXNzKSk7Ci0gIEdldENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgMSk7Ci0gIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoMSk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVGVzdCwgdGVzdF9kaXNjb3ZlcnlfdmNzX25vdF9mb3VuZCkgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICBTZXRTYW1wbGVEYXRhYmFzZU5vVkNTKDEpOwotICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgVGVzdENvbm5lY3QodGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywKLSAgICAgICAgICAgICAgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHRlc3RfYWRkcmVzcykpOwotICBHZXRDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3MsIDEpOwotCi0gIEdldFNlYXJjaENvbXBsZXRlRXZlbnQoMSk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGNhbGxiYWNrcy5nZXQoKSk7Ci0gIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVGVzdCwgdGVzdF9kaXNjb3ZlcnlfdmNzX2Jyb2tlbikgewotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICBTZXRTYW1wbGVEYXRhYmFzZVZDU0Jyb2tlbigxKTsKLSAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0gIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsCi0gICAgICAgICAgICAgIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVELCB0ZXN0X2FkZHJlc3MpKTsKLSAgR2V0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCAxKTsKLSAgR2V0U2VhcmNoQ29tcGxldGVFdmVudCgxKTsKLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoY2FsbGJhY2tzLmdldCgpKTsKLSAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLX0KLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xUZXN0LCB0ZXN0X3N1YnNjcmliZV92Y3Nfdm9sdW1lX3N0YXRlKSB7Ci0gIHN0ZDo6bWFwPHVpbnQxNl90LCB1aW50MTZfdD4gaGFuZGxlcyh7ezB4MDAyMSwgMHgwMDIyfX0pOwotICBUZXN0U3Vic2NyaWJlTm90aWZpY2F0aW9ucyhHZXRUZXN0QWRkcmVzcygwKSwgMSwgaGFuZGxlcyk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVGVzdCwgdGVzdF9yZWFkX3Zjc192b2x1bWVfc3RhdGUpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Wb2x1bWVTdGF0ZUNoYW5nZWQodGVzdF9hZGRyZXNzLCBfLCBfKSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBoYW5kbGVzKHsweDAwMjF9KTsKLSAgVGVzdFJlYWRDaGFyYWN0ZXJpc3RpYyh0ZXN0X2FkZHJlc3MsIDEsIGhhbmRsZXMpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbFRlc3QsIHRlc3RfcmVhZF92Y3Nfdm9sdW1lX2ZsYWdzKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBoYW5kbGVzKHsweDAwMjZ9KTsKLSAgVGVzdFJlYWRDaGFyYWN0ZXJpc3RpYyhHZXRUZXN0QWRkcmVzcygwKSwgMSwgaGFuZGxlcyk7Ci19Ci0KLWNsYXNzIFZvbHVtZUNvbnRyb2xDYWxsYmFja1Rlc3QgOiBwdWJsaWMgVm9sdW1lQ29udHJvbFRlc3QgewotIHByb3RlY3RlZDoKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MgPSBHZXRUZXN0QWRkcmVzcygwKTsKLSAgdWludDE2X3QgY29ubl9pZCA9IDIyOwotCi0gIHZvaWQgU2V0VXAodm9pZCkgb3ZlcnJpZGUgewotICAgIFZvbHVtZUNvbnRyb2xUZXN0OjpTZXRVcCgpOwotICAgIFNldFNhbXBsZURhdGFiYXNlKGNvbm5faWQpOwotICAgIFRlc3RBcHBSZWdpc3RlcigpOwotICAgIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gICAgR2V0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzLCBjb25uX2lkKTsKLSAgICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KGNvbm5faWQpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bih2b2lkKSBvdmVycmlkZSB7Ci0gICAgVGVzdEFwcFVucmVnaXN0ZXIoKTsKLSAgICBWb2x1bWVDb250cm9sVGVzdDo6VGVhckRvd24oKTsKLSAgfQotCi0gIHZvaWQgR2V0Tm90aWZpY2F0aW9uRXZlbnQodWludDE2X3QgaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgICB0QlRBX0dBVFRDX05PVElGWSBldmVudF9kYXRhID0gewotICAgICAgICAuY29ubl9pZCA9IGNvbm5faWQsCi0gICAgICAgIC5iZGEgPSB0ZXN0X2FkZHJlc3MsCi0gICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAgIC5sZW4gPSAodWludDhfdCl2YWx1ZS5zaXplKCksCi0gICAgICAgIC5pc19ub3RpZnkgPSB0cnVlLAotICAgIH07Ci0KLSAgICBzdGQ6OmNvcHkodmFsdWUuYmVnaW4oKSwgdmFsdWUuZW5kKCksIGV2ZW50X2RhdGEudmFsdWUpOwotICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX05PVElGX0VWVCwgKHRCVEFfR0FUVEMqKSZldmVudF9kYXRhKTsKLSAgfQotfTsKLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xDYWxsYmFja1Rlc3QsIHRlc3Rfdm9sdW1lX3N0YXRlX2NoYW5nZWQpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUoezB4MDMsIDB4MDEsIDB4MDJ9KTsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Wb2x1bWVTdGF0ZUNoYW5nZWQodGVzdF9hZGRyZXNzLCAweDAzLCB0cnVlKSk7Ci0gIEdldE5vdGlmaWNhdGlvbkV2ZW50KDB4MDAyMSwgdmFsdWUpOwotfQotCi1URVNUX0YoVm9sdW1lQ29udHJvbENhbGxiYWNrVGVzdCwgdGVzdF92b2x1bWVfc3RhdGVfY2hhbmdlZF9tYWxmb3JtZWQpIHsKLSAgRVhQRUNUX0NBTEwoKmNhbGxiYWNrcywgT25Wb2x1bWVTdGF0ZUNoYW5nZWQodGVzdF9hZGRyZXNzLCBfLCBfKSkuVGltZXMoMCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRvb19zaG9ydCh7MHgwMywgMHgwMX0pOwotICBHZXROb3RpZmljYXRpb25FdmVudCgweDAwMjEsIHRvb19zaG9ydCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRvb19sb25nKHsweDAzLCAweDAxLCAweDAyLCAweDAzfSk7Ci0gIEdldE5vdGlmaWNhdGlvbkV2ZW50KDB4MDAyMSwgdG9vX2xvbmcpOwotfQotCi1jbGFzcyBWb2x1bWVDb250cm9sVmFsdWVTZXRUZXN0IDogcHVibGljIFZvbHVtZUNvbnRyb2xUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0gIHVpbnQxNl90IGNvbm5faWQgPSAyMjsKLQotICB2b2lkIFNldFVwKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBWb2x1bWVDb250cm9sVGVzdDo6U2V0VXAoKTsKLSAgICBTZXRTYW1wbGVEYXRhYmFzZShjb25uX2lkKTsKLSAgICBUZXN0QXBwUmVnaXN0ZXIoKTsKLSAgICBUZXN0Q29ubmVjdCh0ZXN0X2FkZHJlc3MpOwotICAgIEdldENvbm5lY3RlZEV2ZW50KHRlc3RfYWRkcmVzcywgY29ubl9pZCk7Ci0gICAgR2V0U2VhcmNoQ29tcGxldGVFdmVudChjb25uX2lkKTsKLSAgfQotCi0gIHZvaWQgR2V0Tm90aWZpY2F0aW9uRXZlbnQodWludDE2X3QgaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgICB0QlRBX0dBVFRDX05PVElGWSBldmVudF9kYXRhID0gewotICAgICAgICAuY29ubl9pZCA9IGNvbm5faWQsCi0gICAgICAgIC5iZGEgPSB0ZXN0X2FkZHJlc3MsCi0gICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAgIC5sZW4gPSAodWludDhfdCl2YWx1ZS5zaXplKCksCi0gICAgICAgIC5pc19ub3RpZnkgPSB0cnVlLAotICAgIH07Ci0KLSAgICBzdGQ6OmNvcHkodmFsdWUuYmVnaW4oKSwgdmFsdWUuZW5kKCksIGV2ZW50X2RhdGEudmFsdWUpOwotICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX05PVElGX0VWVCwgKHRCVEFfR0FUVEMqKSZldmVudF9kYXRhKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24odm9pZCkgb3ZlcnJpZGUgewotICAgIFRlc3RBcHBVbnJlZ2lzdGVyKCk7Ci0gICAgVm9sdW1lQ29udHJvbFRlc3Q6OlRlYXJEb3duKCk7Ci0gIH0KLX07Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sVmFsdWVTZXRUZXN0LCB0ZXN0X3NldF92b2x1bWUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWRfZGF0YSh7MHgwNCwgMHgwMCwgMHgxMH0pOwotICBFWFBFQ1RfQ0FMTChnYXR0X3F1ZXVlLCBXcml0ZUNoYXJhY3RlcmlzdGljKGNvbm5faWQsIDB4MDAyNCwgZXhwZWN0ZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFLCBfLCBfKSk7Ci0gIFZvbHVtZUNvbnRyb2w6OkdldCgpLT5TZXRWb2x1bWUodGVzdF9hZGRyZXNzLCAweDEwKTsKLX0KLQotY2xhc3MgVm9sdW1lQ29udHJvbENzaXMgOiBwdWJsaWMgVm9sdW1lQ29udHJvbFRlc3QgewotIHByb3RlY3RlZDoKLSAgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMSA9IEdldFRlc3RBZGRyZXNzKDApOwotICBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18yID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGNzaXNfZ3JvdXAgPSB7dGVzdF9hZGRyZXNzXzEsIHRlc3RfYWRkcmVzc18yfTsKLQotICB1aW50MTZfdCBjb25uX2lkXzEgPSAyMjsKLSAgdWludDE2X3QgY29ubl9pZF8yID0gMzM7Ci0gIGludCBncm91cF9pZCA9IDU7Ci0KLSAgdm9pZCBTZXRVcCh2b2lkKSBvdmVycmlkZSB7Ci0gICAgVm9sdW1lQ29udHJvbFRlc3Q6OlNldFVwKCk7Ci0KLSAgICBPTl9DQUxMKG1vY2tfY3Npc19jbGllbnRfbW9kdWxlXywgR2V0KCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigmbW9ja19jc2lzX2NsaWVudF9tb2R1bGVfKSk7Ci0KLSAgICAvLyBSZXBvcnQgd29ya2luZyBDU0lTCi0gICAgT05fQ0FMTChtb2NrX2NzaXNfY2xpZW50X21vZHVsZV8sIElzQ3Npc0NsaWVudFJ1bm5pbmcoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKLQotICAgIE9OX0NBTEwobW9ja19jc2lzX2NsaWVudF9tb2R1bGVfLCBHZXREZXZpY2VMaXN0KF8pKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oY3Npc19ncm91cCkpOwotCi0gICAgT05fQ0FMTChtb2NrX2NzaXNfY2xpZW50X21vZHVsZV8sIEdldEdyb3VwSWQoXywgXykpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihncm91cF9pZCkpOwotCi0gICAgU2V0U2FtcGxlRGF0YWJhc2UoY29ubl9pZF8xKTsKLSAgICBTZXRTYW1wbGVEYXRhYmFzZShjb25uX2lkXzIpOwotCi0gICAgVGVzdEFwcFJlZ2lzdGVyKCk7Ci0KLSAgICBUZXN0Q29ubmVjdCh0ZXN0X2FkZHJlc3NfMSk7Ci0gICAgR2V0Q29ubmVjdGVkRXZlbnQodGVzdF9hZGRyZXNzXzEsIGNvbm5faWRfMSk7Ci0gICAgR2V0U2VhcmNoQ29tcGxldGVFdmVudChjb25uX2lkXzEpOwotICAgIFRlc3RDb25uZWN0KHRlc3RfYWRkcmVzc18yKTsKLSAgICBHZXRDb25uZWN0ZWRFdmVudCh0ZXN0X2FkZHJlc3NfMiwgY29ubl9pZF8yKTsKLSAgICBHZXRTZWFyY2hDb21wbGV0ZUV2ZW50KGNvbm5faWRfMik7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBUZXN0QXBwVW5yZWdpc3RlcigpOwotICAgIFZvbHVtZUNvbnRyb2xUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgdm9pZCBHZXROb3RpZmljYXRpb25FdmVudCh1aW50MTZfdCBjb25uX2lkLCBjb25zdCBSYXdBZGRyZXNzJiB0ZXN0X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKLSAgICB0QlRBX0dBVFRDX05PVElGWSBldmVudF9kYXRhID0gewotICAgICAgICAuY29ubl9pZCA9IGNvbm5faWQsCi0gICAgICAgIC5iZGEgPSB0ZXN0X2FkZHJlc3MsCi0gICAgICAgIC5oYW5kbGUgPSBoYW5kbGUsCi0gICAgICAgIC5sZW4gPSAodWludDhfdCl2YWx1ZS5zaXplKCksCi0gICAgICAgIC5pc19ub3RpZnkgPSB0cnVlLAotICAgIH07Ci0KLSAgICBzdGQ6OmNvcHkodmFsdWUuYmVnaW4oKSwgdmFsdWUuZW5kKCksIGV2ZW50X2RhdGEudmFsdWUpOwotICAgIGdhdHRfY2FsbGJhY2soQlRBX0dBVFRDX05PVElGX0VWVCwgKHRCVEFfR0FUVEMqKSZldmVudF9kYXRhKTsKLSAgfQotfTsKLQotVEVTVF9GKFZvbHVtZUNvbnRyb2xDc2lzLCB0ZXN0X3NldF92b2x1bWUpIHsKLSAgLyogU2V0IHZhbHVlIGZvciB0aGUgZ3JvdXAgKi8KLSAgRVhQRUNUX0NBTEwoZ2F0dF9xdWV1ZSwKLSAgICAgICAgICAgICAgV3JpdGVDaGFyYWN0ZXJpc3RpYyhjb25uX2lkXzEsIDB4MDAyNCwgXywgR0FUVF9XUklURSwgXywgXykpOwotICBFWFBFQ1RfQ0FMTChnYXR0X3F1ZXVlLAotICAgICAgICAgICAgICBXcml0ZUNoYXJhY3RlcmlzdGljKGNvbm5faWRfMiwgMHgwMDI0LCBfLCBHQVRUX1dSSVRFLCBfLCBfKSk7Ci0KLSAgVm9sdW1lQ29udHJvbDo6R2V0KCktPlNldFZvbHVtZShncm91cF9pZCwgMTApOwotCi0gIC8qIE5vdyBpbmplY3Qgbm90aWZpY2F0aW9uIGFuZCBtYWtlIHN1cmUgY2FsbGJhY2sgaXMgc2VudCB1cCB0byBKYXZhIGxheWVyICovCi0gIEVYUEVDVF9DQUxMKCpjYWxsYmFja3MsIE9uR3JvdXBWb2x1bWVTdGF0ZUNoYW5nZWQoZ3JvdXBfaWQsIDB4MDMsIHRydWUpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSh7MHgwMywgMHgwMSwgMHgwMn0pOwotICBHZXROb3RpZmljYXRpb25FdmVudChjb25uX2lkXzEsIHRlc3RfYWRkcmVzc18xLCAweDAwMjEsIHZhbHVlKTsKLSAgR2V0Tm90aWZpY2F0aW9uRXZlbnQoY29ubl9pZF8yLCB0ZXN0X2FkZHJlc3NfMiwgMHgwMDIxLCB2YWx1ZSk7Ci19Ci0KLVRFU1RfRihWb2x1bWVDb250cm9sQ3NpcywgYXV0b25vbXVzX3Rlc3Rfc2V0X3ZvbHVtZSkgewotICAvKiBOb3cgaW5qZWN0IG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBzdXJlIGNhbGxiYWNrIGlzIHNlbnQgdXAgdG8gSmF2YSBsYXllciAqLwotICBFWFBFQ1RfQ0FMTCgqY2FsbGJhY2tzLCBPbkdyb3VwVm9sdW1lU3RhdGVDaGFuZ2VkKGdyb3VwX2lkLCAweDAzLCBmYWxzZSkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKHsweDAzLCAweDAwLCAweDAyfSk7Ci0gIEdldE5vdGlmaWNhdGlvbkV2ZW50KGNvbm5faWRfMSwgdGVzdF9hZGRyZXNzXzEsIDB4MDAyMSwgdmFsdWUpOwotICBHZXROb3RpZmljYXRpb25FdmVudChjb25uX2lkXzIsIHRlc3RfYWRkcmVzc18yLCAweDAwMjEsIHZhbHVlKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdmMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0Y29yZS9BbmRyb2lkLmJwIGIvYnRjb3JlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNzFjNzkuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyBsaWJidGNvcmUgc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldCBhbmQgaG9zdAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJidGNvcmVfZGVmYXVsdHMiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2RldmljZV9jbGFzcy5jYyIsCi0gICAgICAgICJzcmMvaGFsX3V0aWwuY2MiLAotICAgICAgICAic3JjL21vZHVsZS5jYyIsCi0gICAgICAgICJzcmMvb3NpX21vZHVsZS5jYyIsCi0gICAgICAgICJzcmMvcHJvcGVydHkuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRhcmdldDogewotICAgICAgICBsaW51eF9nbGliYzogewotICAgICAgICAgICAgY2ZsYWdzOiBbIi1EX0dOVV9TT1VSQ0UiXSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0Y29yZSIsCi0gICAgZGVmYXVsdHM6IFsibGliYnRjb3JlX2RlZmF1bHRzIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnRjb3JlLXN0YXRpYyIsCi0gICAgZGVmYXVsdHM6IFsibGliYnRjb3JlX2RlZmF1bHRzIl0sCi0gICAgY2ZsYWdzOiBbIi1EU1RBVElDX0xJQkJMVUVUT09USCJdLAotfQotCi1jY19saWJyYXJ5X2hlYWRlcnMgewotICAgIG5hbWU6ICJsaWJidGNvcmVfaGVhZGVycyIsCi0gICAgZGVmYXVsdHM6IFsibGliY2hyb21lX3N1cHBvcnRfZGVmYXVsdHMiXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4vIl0sCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotLy8gTm90ZTogSXQncyBnb29kIHRvIGdldCB0aGUgdGVzdHMgY29tcGlsZWQgYm90aCBmb3IgdGhlIGhvc3QgYW5kIHRoZSB0YXJnZXQgc28KLS8vIHdlIGdldCB0byB0ZXN0IHdpdGggYm90aCBCaW9uaWMgbGliYyBhbmQgZ2xpYmMKLS8vIGxpYmJ0Y29yZSB1bml0IHRlc3RzIGZvciB0YXJnZXQgYW5kIGhvc3QKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9idGNvcmUiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL2J0Il0sCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9kZXZpY2VfY2xhc3NfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0L3Byb3BlcnR5X3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnRjb3JlIiwKLSAgICAgICAgImxpYm9zaS1BbGxvY2F0aW9uVGVzdEhhcm5lc3MiLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL2J0Y29yZS9CVUlMRC5nbiBiL2J0Y29yZS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwZGVkMy4uMDAwMDAwMAotLS0gYS9idGNvcmUvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc3RhdGljX2xpYnJhcnkoImJ0Y29yZSIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAic3JjL2RldmljZV9jbGFzcy5jYyIsCi0gICAgInNyYy9oYWxfdXRpbC5jYyIsCi0gICAgInNyYy9tb2R1bGUuY2MiLAotICAgICJzcmMvb3NpX21vZHVsZS5jYyIsCi0gICAgInNyYy9wcm9wZXJ0eS5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgImluY2x1ZGUiLAotICAgICIvL2J0IiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idDp0YXJnZXRfZGVmYXVsdHMiIF0KLQotICBkZXBzID0gWwotICAgICIvL2J0L2dkL3J1c3Qvc2hpbTppbml0X2ZsYWdzX2JyaWRnZV9oZWFkZXIiLAotICAgICIvL2J0L2dkL3J1c3Qvc2hpbTpsaWJibHVldG9vdGhfcnVzdF9pbnRlcm9wIiwKLSAgICAiLy9idC9nZC9ydXN0L3NoaW06bWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiwKLSAgXQotfQotCi1pZiAodXNlLnRlc3QpIHsKLSAgZXhlY3V0YWJsZSgibmV0X3Rlc3RfYnRjb3JlIikgewotICAgIHNvdXJjZXMgPSBbCi0gICAgICAiLy9idC9vc2kvdGVzdC9BbGxvY2F0aW9uVGVzdEhhcm5lc3MuY2MiLAotICAgICAgInRlc3QvZGV2aWNlX2NsYXNzX3Rlc3QuY2MiLAotICAgICAgInRlc3QvcHJvcGVydHlfdGVzdC5jYyIsCi0gICAgXQotCi0gICAgaW5jbHVkZV9kaXJzID0gWwotICAgICAgImluY2x1ZGUiLAotICAgICAgIi8vYnQiLAotICAgIF0KLQotICAgIGRlcHMgPSBbCi0gICAgICAiLy9idC9idGNvcmUiLAotICAgICAgIi8vYnQvb3NpIiwKLSAgICAgICIvL2J0L3R5cGVzIiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICIvL2J0OmV4dGVybmFsX2d0ZXN0X21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0KLSAgICBsaWJzID0gWwotICAgICAgInB0aHJlYWQiLAotICAgICAgInJ0IiwKLSAgICAgICJkbCIsCi0gICAgXQotICB9Ci19CmRpZmYgLS1naXQgYS9idGNvcmUvZnV6emVyL0FuZHJvaWQuYnAgYi9idGNvcmUvZnV6emVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjUwMTAuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2Z1enplci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJidGNvcmVfZnV6el9kZWZhdWx0cyIsCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJzdGF0c2xvZ19idCIsCi0gICAgICAgICJsaWJibHVldG9vdGgiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMSIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmV2ZW50IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmJ0Y29yZSIsCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgICAgICAibGlibW9kcGI2NCIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYmJsdWV0b290aC1wcm90b3MiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QvcnVzdC9zaGltIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfaGVhZGVycyIsCi0gICAgXSwKLSAgICBmdXp6X2NvbmZpZzogewotICAgICAgICBjYzogWwotICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAotICAgICAgICBdLAotICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAotICAgIH0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJidGNvcmVfZGV2aWNlX2NsYXNzX2Z1enplciIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImJ0Y29yZV9mdXp6X2RlZmF1bHRzIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJ0Y29yZV9kZXZpY2VfY2xhc3NfZnV6emVyLmNwcCIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImJ0Y29yZV9wcm9wZXJ0eV9mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJidGNvcmVfZnV6el9kZWZhdWx0cyIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJidGNvcmVfcHJvcGVydHlfZnV6emVyLmNwcCIsCi0gICAgXSwKLQotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiYnRjb3JlX21vZHVsZV9mdXp6ZXIiLAotICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJidGNvcmVfZnV6el9kZWZhdWx0cyIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJidGNvcmVfbW9kdWxlX2Z1enplci5jcHAiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9idGNvcmUvZnV6emVyL1JFQURNRS5tZCBiL2J0Y29yZS9mdXp6ZXIvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjc3MGU0Li4wMDAwMDAwCi0tLSBhL2J0Y29yZS9mdXp6ZXIvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBGdXp6ZXJzIGZvciBsaWJidGNvcmUKLQotIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucwotVGhlIGZ1enplciBwbHVnaW5zIGZvciBgbGliYnRjb3JlYCBhcmUgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCi1zb3VyY2UgY29kZSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgotCi0jIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCi1UaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZC1jb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KLWluY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplcnMuCi0KLUZ1enplcnMgYXNzaWducyB2YWx1ZXMgdG8gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHRvIHBhc3Mgb24gdG8gbGliYnRjb3JlOgotMS4gQmx1ZXRvb3RoIERldmljZSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGRldmljZVR5cGVgKQotMi4gQmx1ZXRvb3RoIEFkYXB0ZXIgVmlzaWJpbGl0eSBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYG1vZGVgKQotMy4gQmx1ZXRvb3RoIEFkZHJlc3MgKHBhcmFtZXRlciBuYW1lOiBgYnRBZGRyZXNzYCkKLTQuIEJsdWV0b290aCBEZXZpY2UgQ2xhc3MgcGFyYW1ldGVyIChwYXJhbWV0ZXIgbmFtZTogYGRldmljZUNsYXNzVGApCi0KLXwgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Ci18LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAotfCBgZGV2aWNlVHlwZWAgfCAwLmBCVF9ERVZJQ0VfREVWVFlQRV9CUkVEUmAgMS5gQlRfREVWSUNFX0RFVlRZUEVfQkxFYCAyLmBCVF9ERVZJQ0VfREVWVFlQRV9EVUFMYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKLXwgYG1vZGVgIHwgMC5gQlRfU0NBTl9NT0RFX05PTkVgIDEuYEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRWAgMi5gQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Ci18IGBidEFkZHJlc3NgIHwgVmFsdWVzIGluc2lkZSBhcnJheSByYW5nZXMgZnJvbSBgMHgwYCB0byBgMHhGRmAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Ci18IGBkZXZpY2VDbGFzc1RgIHwgVmFsdWVzIGluc2lkZSBhcnJheSByYW5nZXMgZnJvbSBgMHgwYCB0byBgMHhGRmAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Ci1UaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW5zIGFyZSBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgotCi0jIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCi1UaGUgcGx1Z2lucyBmZWVkIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgbW9kdWxlLgotVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbnMgdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKLW1hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc24ndCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKLWNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCi0KLSMjIEJ1aWxkCi0KLVRoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGJ0Y29yZV9kZXZpY2VfY2xhc3NfZnV6emVyLCBidGNvcmVfcHJvcGVydHlfZnV6emVyIGFuZCBidGNvcmVfbW9kdWxlX2Z1enplciBiaW5hcmllcy4KLQotIyMjIEFuZHJvaWQKLQotIyMjIyBTdGVwcyB0byBidWlsZAotQnVpbGQgdGhlIGZ1enplcgotYGBgCi0gICQgbW0gLWokKG5wcm9jKSBidGNvcmVfZGV2aWNlX2NsYXNzX2Z1enplcgotICAkIG1tIC1qJChucHJvYykgYnRjb3JlX3Byb3BlcnR5X2Z1enplcgotICAkIG1tIC1qJChucHJvYykgYnRjb3JlX21vZHVsZV9mdXp6ZXIKLWBgYAotIyMjIFN0ZXBzIHRvIHJ1bgotCi1UbyBydW4gb24gZGV2aWNlCi1gYGAKLSAgJCBhZGIgc3luYyBkYXRhCi0gICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvYnRjb3JlX2RldmljZV9jbGFzc19mdXp6ZXIvYnRjb3JlX2RldmljZV9jbGFzc19mdXp6ZXIKLSAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9idGNvcmVfcHJvcGVydHlfZnV6emVyL2J0Y29yZV9wcm9wZXJ0eV9mdXp6ZXIKLSAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9idGNvcmVfbW9kdWxlX2Z1enplci9idGNvcmVfbW9kdWxlX2Z1enplcgotYGBgCi0KLSMjIFJlZmVyZW5jZXM6Ci0gKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAotICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvYnRjb3JlL2Z1enplci9idGNvcmVfZGV2aWNlX2NsYXNzX2Z1enplci5jcHAgYi9idGNvcmUvZnV6emVyL2J0Y29yZV9kZXZpY2VfY2xhc3NfZnV6emVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3NjNiMi4uMDAwMDAwMAotLS0gYS9idGNvcmUvZnV6emVyL2J0Y29yZV9kZXZpY2VfY2xhc3NfZnV6emVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL2RldmljZV9jbGFzcy5oIgotCi1jbGFzcyBCVENvcmVEZXZpY2VDbGFzc0Z1enplciB7Ci0gcHVibGljOgotICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPEZ1enplZERhdGFQcm92aWRlcj4gbUZkcCA9IG51bGxwdHI7Ci19OwotCi12b2lkIEJUQ29yZURldmljZUNsYXNzRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIG1GZHAgPSBzdGQ6Om1ha2VfdW5pcXVlPEZ1enplZERhdGFQcm92aWRlcj4oZGF0YSwgc2l6ZSk7Ci0gIHNpemVfdCBkY1N0cmVhbVNpemUgPSBzaXplb2YoYnRfZGV2aWNlX2NsYXNzX3QpICogc2l6ZW9mKHVpbnQ4X3QpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRjU3RyZWFtU3JjKGRjU3RyZWFtU2l6ZSwgMHgwKTsKLSAgbUZkcC0+Q29uc3VtZURhdGEoZGNTdHJlYW1TcmMuZGF0YSgpLCBkY1N0cmVhbVNpemUpOwotCi0gIGJ0X2RldmljZV9jbGFzc190IGRldmljZUNsYXNzOwotICBkZXZpY2VfY2xhc3NfZnJvbV9zdHJlYW0oJmRldmljZUNsYXNzLCBkY1N0cmVhbVNyYy5kYXRhKCkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRjU3RyZWFtRHN0KGRjU3RyZWFtU2l6ZSwgMHgwKTsKLSAgKHZvaWQpZGV2aWNlX2NsYXNzX3RvX3N0cmVhbSgmZGV2aWNlQ2xhc3MsIGRjU3RyZWFtRHN0LmRhdGEoKSwgZGNTdHJlYW1TaXplKTsKLQotICBkZXZpY2VfY2xhc3Nfc2V0X2xpbWl0ZWQoJmRldmljZUNsYXNzLCBtRmRwLT5Db25zdW1lQm9vbCgpKTsKLSAgKHZvaWQpZGV2aWNlX2NsYXNzX2dldF9saW1pdGVkKCZkZXZpY2VDbGFzcyk7Ci0KLSAgaW50IHZhbCA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7Ci0gIGRldmljZV9jbGFzc19zZXRfbWFqb3JfZGV2aWNlKCZkZXZpY2VDbGFzcywgdmFsKTsKLSAgKHZvaWQpZGV2aWNlX2NsYXNzX2dldF9tYWpvcl9kZXZpY2UoJmRldmljZUNsYXNzKTsKLQotICB2YWwgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOwotICBkZXZpY2VfY2xhc3Nfc2V0X21pbm9yX2RldmljZSgmZGV2aWNlQ2xhc3MsIHZhbCk7Ci0gICh2b2lkKWRldmljZV9jbGFzc19nZXRfbWlub3JfZGV2aWNlKCZkZXZpY2VDbGFzcyk7Ci0KLSAgZGV2aWNlX2NsYXNzX3NldF9pbmZvcm1hdGlvbigmZGV2aWNlQ2xhc3MsIG1GZHAtPkNvbnN1bWVCb29sKCkpOwotICAodm9pZClkZXZpY2VfY2xhc3NfZ2V0X2luZm9ybWF0aW9uKCZkZXZpY2VDbGFzcyk7Ci0KLSAgYnRfZGV2aWNlX2NsYXNzX3QgZGV2aWNlQ2xhc3NDb3B5OwotICAodm9pZClkZXZpY2VfY2xhc3NfY29weSgmZGV2aWNlQ2xhc3NDb3B5LCAmZGV2aWNlQ2xhc3MpOwotICAodm9pZClkZXZpY2VfY2xhc3NfZXF1YWxzKCZkZXZpY2VDbGFzcywgJmRldmljZUNsYXNzQ29weSk7Ci0KLSAgdmFsID0gbUZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZSgxLCBJTlRfTUFYKTsKLSAgZGV2aWNlX2NsYXNzX2Zyb21faW50KCZkZXZpY2VDbGFzcywgdmFsKTsKLSAgKHZvaWQpZGV2aWNlX2NsYXNzX3RvX2ludCgmZGV2aWNlQ2xhc3MpOwotfQotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIEJUQ29yZURldmljZUNsYXNzRnV6emVyIGJ0Q29yZURldmljZUNsYXNzRnV6emVyOwotICBidENvcmVEZXZpY2VDbGFzc0Z1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2J0Y29yZS9mdXp6ZXIvYnRjb3JlX21vZHVsZV9mdXp6ZXIuY3BwIGIvYnRjb3JlL2Z1enplci9idGNvcmVfbW9kdWxlX2Z1enplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTU3NDcuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2Z1enplci9idGNvcmVfbW9kdWxlX2Z1enplci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL2hhbF91dGlsLmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvbW9kdWxlLmgiCi0KLWV4dGVybiBjb25zdCBtb2R1bGVfdCBvc2lfbW9kdWxlOwotCi1leHRlcm4gIkMiIHsKLXN0cnVjdCBhbmRyb2lkX25hbWVzcGFjZV90KiBhbmRyb2lkX2dldF9leHBvcnRlZF9uYW1lc3BhY2UoY29uc3QgY2hhciopIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci19Ci0KLWNsYXNzIEJUQ29yZU1vZHVsZUZ1enplciB7Ci0gcHVibGljOgotICB2b2lkIHByb2Nlc3MoKTsKLX07Ci0KLXZvaWQgQlRDb3JlTW9kdWxlRnV6emVyOjpwcm9jZXNzKCkgewotICBjb25zdCBidF9pbnRlcmZhY2VfdCogaW50ZXJmYWNlOwotICAodm9pZCloYWxfdXRpbF9sb2FkX2J0X2xpYnJhcnkoJmludGVyZmFjZSk7Ci0gIG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0KCk7Ci0gIG1vZHVsZV9pbml0KCZvc2lfbW9kdWxlKTsKLSAgKHZvaWQpbW9kdWxlX3N0YXJ0X3VwKCZvc2lfbW9kdWxlKTsKLSAgKHZvaWQpZ2V0X21vZHVsZShvc2lfbW9kdWxlLm5hbWUpOwotICBtb2R1bGVfc2h1dF9kb3duKCZvc2lfbW9kdWxlKTsKLSAgbW9kdWxlX2NsZWFuX3VwKCZvc2lfbW9kdWxlKTsKLSAgbW9kdWxlX21hbmFnZW1lbnRfc3RvcCgpOwotfQotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpIHsKLSAgQlRDb3JlTW9kdWxlRnV6emVyIGJ0Q29yZU1vZHVsZUZ1enplcjsKLSAgYnRDb3JlTW9kdWxlRnV6emVyLnByb2Nlc3MoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9idGNvcmUvZnV6emVyL2J0Y29yZV9wcm9wZXJ0eV9mdXp6ZXIuY3BwIGIvYnRjb3JlL2Z1enplci9idGNvcmVfcHJvcGVydHlfZnV6emVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiMGMwMS4uMDAwMDAwMAotLS0gYS9idGNvcmUvZnV6emVyL2J0Y29yZV9wcm9wZXJ0eV9mdXp6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvcHJvcGVydHkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotY29uc3RleHByIGludDMyX3Qga1JhbmRvbVN0cmluZ0xlbmd0aCA9IDI1NjsKLQotY2xhc3MgQlRDb3JlUHJvcGVydHlGdXp6ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxGdXp6ZWREYXRhUHJvdmlkZXI+IG1GZHAgPSBudWxscHRyOwotfTsKLQotdm9pZCBCVENvcmVQcm9wZXJ0eUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBtRmRwID0gc3RkOjptYWtlX3VuaXF1ZTxGdXp6ZWREYXRhUHJvdmlkZXI+KGRhdGEsIHNpemUpOwotICB1aW50OF90IGFkZHJbUmF3QWRkcmVzczo6a0xlbmd0aF07Ci0gIG1GZHAtPkNvbnN1bWVEYXRhKGFkZHIsIHNpemVvZih1aW50OF90KSAqIFJhd0FkZHJlc3M6OmtMZW5ndGgpOwotICBSYXdBZGRyZXNzIGJ0QWRkcmVzcyA9IHthZGRyfTsKLSAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfYWRkcigmYnRBZGRyZXNzKTsKLSAgcHJvcGVydHlfYXNfYWRkcihwcm9wZXJ0eSk7Ci0gIHByb3BlcnR5X2ZyZWUocHJvcGVydHkpOwotCi0gIGJ0X2RldmljZV9jbGFzc190IGRldmljZUNsYXNzID0ge3ttRmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCl9fTsKLSAgcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfZGV2aWNlX2NsYXNzKCZkZXZpY2VDbGFzcyk7Ci0KLSAgY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIHBEZXZpY2VDbGFzcyA9IHByb3BlcnR5X2FzX2RldmljZV9jbGFzcyhwcm9wZXJ0eSk7Ci0gICh2b2lkKWRldmljZV9jbGFzc190b19pbnQocERldmljZUNsYXNzKTsKLSAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eSk7Ci0KLSAgYnRfZGV2aWNlX3R5cGVfdCBkZXZpY2VUeXBlID0KLSAgICAgIChidF9kZXZpY2VfdHlwZV90KShtRmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOwotICBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19kZXZpY2VfdHlwZShkZXZpY2VUeXBlKTsKLSAgKHZvaWQpcHJvcGVydHlfYXNfZGV2aWNlX3R5cGUocHJvcGVydHkpOwotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLQotICB1aW50MzJfdCB0aW1lb3V0ID0gbUZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOwotICBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19kaXNjb3ZlcnlfdGltZW91dCh0aW1lb3V0KTsKLSAgKHZvaWQpcHJvcGVydHlfYXNfZGlzY292ZXJ5X3RpbWVvdXQocHJvcGVydHkpOwotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLQotICBzdGQ6OnN0cmluZyBuYW1lID0gbUZkcC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKTsKLSAgcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfbmFtZShuYW1lLmNfc3RyKCkpOwotICAodm9pZClwcm9wZXJ0eV9hc19uYW1lKHByb3BlcnR5KTsKLSAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eSk7Ci0KLSAgaW50OF90IHJzc2kgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWw8aW50OF90PigpOwotICBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19yc3NpKHJzc2kpOwotICAodm9pZClwcm9wZXJ0eV9hc19yc3NpKHByb3BlcnR5KTsKLSAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eSk7Ci0KLSAgYnRfc2Nhbl9tb2RlX3QgbW9kZSA9IChidF9zY2FuX21vZGVfdCkobUZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKLSAgcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfc2Nhbl9tb2RlKG1vZGUpOwotICAodm9pZClwcm9wZXJ0eV9hc19zY2FuX21vZGUocHJvcGVydHkpOwotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLQotICBzaXplX3QgdXVpZFNpemUgPSBzaXplb2YodWludDhfdCkgKiBibHVldG9vdGg6OlV1aWQ6OmtOdW1CeXRlczEyODsKLSAgdWludDhfdCB1dWlkW2JsdWV0b290aDo6VXVpZDo6a051bUJ5dGVzMTI4XTsKLSAgbUZkcC0+Q29uc3VtZURhdGEodXVpZCwgdXVpZFNpemUpOwotICBVdWlkIHV1aWRCRSA9IFV1aWQ6OkZyb20xMjhCaXRCRSh1dWlkKTsKLSAgcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfdXVpZHMoJnV1aWRCRSwgMSk7Ci0gIHNpemVfdCB1dWlkQ291bnQ7Ci0gICh2b2lkKXByb3BlcnR5X2FzX3V1aWRzKHByb3BlcnR5LCAmdXVpZENvdW50KTsKLSAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eSk7Ci0KLSAgbUZkcC0+Q29uc3VtZURhdGEodXVpZCwgdXVpZFNpemUpOwotICBVdWlkIHV1aWRMRSA9IFV1aWQ6OkZyb20xMjhCaXRMRSh1dWlkKTsKLSAgVXVpZCB1dWlkc1tdID0ge3V1aWRCRSwgdXVpZExFfTsKLSAgYnRfcHJvcGVydHlfdCogcHJvcGVydHlTcmMgPSBwcm9wZXJ0eV9uZXdfdXVpZHModXVpZHMsIHN0ZDo6c2l6ZSh1dWlkcykpOwotICBidF9wcm9wZXJ0eV90IHByb3BlcnR5RGVzdDsKLSAgKHZvaWQpcHJvcGVydHlfY29weSgmcHJvcGVydHlEZXN0LCBwcm9wZXJ0eVNyYyk7Ci0gIHByb3BlcnR5X2ZyZWUocHJvcGVydHlTcmMpOwotfQotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIEJUQ29yZVByb3BlcnR5RnV6emVyIGJ0Q29yZVByb3BlcnR5RnV6emVyOwotICBidENvcmVQcm9wZXJ0eUZ1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2J0Y29yZS9pbmNsdWRlL2RldmljZV9jbGFzcy5oIGIvYnRjb3JlL2luY2x1ZGUvZGV2aWNlX2NsYXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZmJmM2YuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvZGV2aWNlX2NsYXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vLyBQcm92aWRlcyBDbGFzcyBPZiBEZXZpY2UgcHJpbWl0aXZlIGFzIHNwZWNpZmllZCBpbiB0aGUgYmx1ZXRvb3RoIHNwZWMuCi0vLyBbQ2xhc3MgT2YgRGV2aWNlXQotLy8gKGh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvZW4tdXMvc3BlY2lmaWNhdGlvbi9hc3NpZ25lZC1udW1iZXJzL2Jhc2ViYW5kKQotCi0vLyBEZXZpY2UgY2xhc3MgbWF5IGJlIGRlZmluZWQgaW4gb3RoZXIgc3RydWN0dXJlcy4KLS8vIE9ubHkgdXNlIGRlZmluZWQgbWV0aG9kcyB0byBtYW5pcHVsYXRlIGludGVybmFscy4KLXR5cGVkZWYgc3RydWN0IGJ0X2RldmljZV9jbGFzc190IHsKLSAgdWludDhfdCBfWzNdOyAgLy8gRG8gbm90IGFjY2VzcyBkaXJlY3RseTsgdXNlIG1ldGhvZHMgYmVsb3cuCi19IGJ0X2RldmljZV9jbGFzc190OwotCi0vLyBDb3BpZXMgdGhlIHxkYXRhfCBjbGFzcyBvZiBkZXZpY2Ugc3RyZWFtIGludG8gZGV2aWNlIGNsYXNzIHxkY3wuICB8ZGN8Ci0vLyBhbmQgfGRhdGF8IG11c3Qgbm90IGJlIE5VTEwuCi12b2lkIGRldmljZV9jbGFzc19mcm9tX3N0cmVhbShidF9kZXZpY2VfY2xhc3NfdCogZGMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEpOwotCi0vLyBTZXJpYWxpemVzIHRoZSBkZXZpY2UgY2xhc3MgfGRjfCB0byBwb2ludGVyIGFyZ3VtZW50IHxkYXRhfCBpbiBiaWcgZW5kaWFuCi0vLyBmb3JtYXQuICB8bGVufCBtdXN0IGNvbnRhaW4gdGhlIGJ1ZmZlciBzaXplIG9mIHxkYXRhfC4gIFJldHVybnMgdGhlIGFjdHVhbAotLy8gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHxkYXRhfC4gIHxkY3wgYW5kIHxkYXRhfCBtdXN0IG5vdCBiZSBOVUxMLgotaW50IGRldmljZV9jbGFzc190b19zdHJlYW0oY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7Ci0KLS8vIENvcGllcyB0aGUgfGRhdGF8IGNsYXNzIG9mIGRldmljZSBpbnRlZ2VyIGludG8gZGV2aWNlIGNsYXNzIHxkY3wuICB8ZGN8Ci0vLyBtdXN0IG5vdCBiZSBOVUxMLgotdm9pZCBkZXZpY2VfY2xhc3NfZnJvbV9pbnQoYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBpbnQgZGF0YSk7Ci0KLS8vIFJldHVybnMgdGhlIGRldmljZSBjbGFzcyB8ZGN8IGluIGludGVnZXIgZm9ybWF0LiAgfGRjfCBtdXN0IG5vdCBiZSBOVUxMLgotaW50IGRldmljZV9jbGFzc190b19pbnQoY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjKTsKLQotLy8gQ29tcGFyZXMgYW5kIHJldHVybnMgfHRydWV8IGlmIHR3byBkZXZpY2UgY2xhc3NlcyB8cDF8IGFuZCB8cDJ8IGFyZSBlcXVhbC4KLS8vIEZhbHNlIG90aGVyd2lzZS4KLWJvb2wgZGV2aWNlX2NsYXNzX2VxdWFscyhjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIHAyKTsKLQotLy8gQ29waWVzIGFuZCByZXR1cm5zIHx0cnVlfCBpZiB0aGUgZGV2aWNlIGNsYXNzIHdhcyBzdWNjZXNzZnVsbHkgY29waWVkIGZyb20KLS8vICB8cDJ8IGludG8gfHAxfC4gIEZhbHNlIG90aGVyd2lzZS4KLWJvb2wgZGV2aWNlX2NsYXNzX2NvcHkoYnRfZGV2aWNlX2NsYXNzX3QqIGRlc3QsIGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBzcmMpOwotCi0vLyBRdWVyeSwgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgdGhlIG1ham9yIGRldmljZSBjbGFzcy4gIHxkY3wgbXVzdCBub3QgYmUKLS8vIE5VTEwuCi1pbnQgZGV2aWNlX2NsYXNzX2dldF9tYWpvcl9kZXZpY2UoY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjKTsKLXZvaWQgZGV2aWNlX2NsYXNzX3NldF9tYWpvcl9kZXZpY2UoYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBpbnQgdmFsKTsKLQotLy8gUXVlcnksIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIHRoZSBtaW5vciBkZXZpY2UgY2xhc3MuIHxkY3wgbXVzdCBub3QgYmUgTlVMTC4KLWludCBkZXZpY2VfY2xhc3NfZ2V0X21pbm9yX2RldmljZShjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMpOwotdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X21pbm9yX2RldmljZShidF9kZXZpY2VfY2xhc3NfdCogZGMsIGludCB2YWwpOwotCi0vLyBRdWVyeSwgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgdGhlIHZhcmlvdXMgbWFqb3Igc2VydmljZSBjbGFzcyBmZWF0dXJlcy4KLS8vIHxkY3wgbXVzdCBub3QgYmUgTlVMTC4KLWJvb2wgZGV2aWNlX2NsYXNzX2dldF9saW1pdGVkKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYyk7Ci12b2lkIGRldmljZV9jbGFzc19zZXRfbGltaXRlZChidF9kZXZpY2VfY2xhc3NfdCogZGMsIGJvb2wgc2V0KTsKLQotYm9vbCBkZXZpY2VfY2xhc3NfZ2V0X3Bvc2l0aW9uaW5nKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYyk7Ci12b2lkIGRldmljZV9jbGFzc19zZXRfcG9zaXRpb25pbmcoYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBib29sIHNldCk7Ci0KLWJvb2wgZGV2aWNlX2NsYXNzX2dldF9uZXR3b3JraW5nKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYyk7Ci12b2lkIGRldmljZV9jbGFzc19zZXRfbmV0d29ya2luZyhidF9kZXZpY2VfY2xhc3NfdCogZGMsIGJvb2wgc2V0KTsKLQotYm9vbCBkZXZpY2VfY2xhc3NfZ2V0X3JlbmRlcmluZyhjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMpOwotdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X3JlbmRlcmluZyhidF9kZXZpY2VfY2xhc3NfdCogZGMsIGJvb2wgc2V0KTsKLQotYm9vbCBkZXZpY2VfY2xhc3NfZ2V0X2NhcHR1cmluZyhjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMpOwotdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X2NhcHR1cmluZyhidF9kZXZpY2VfY2xhc3NfdCogZGMsIGJvb2wgc2V0KTsKLQotYm9vbCBkZXZpY2VfY2xhc3NfZ2V0X29iamVjdF90cmFuc2Zlcihjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMpOwotdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X29iamVjdF90cmFuc2ZlcihidF9kZXZpY2VfY2xhc3NfdCogZGMsIGJvb2wgc2V0KTsKLQotYm9vbCBkZXZpY2VfY2xhc3NfZ2V0X2F1ZGlvKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYyk7Ci12b2lkIGRldmljZV9jbGFzc19zZXRfYXVkaW8oYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBib29sIHNldCk7Ci0KLWJvb2wgZGV2aWNlX2NsYXNzX2dldF90ZWxlcGhvbnkoY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjKTsKLXZvaWQgZGV2aWNlX2NsYXNzX3NldF90ZWxlcGhvbnkoYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBib29sIHNldCk7Ci0KLWJvb2wgZGV2aWNlX2NsYXNzX2dldF9pbmZvcm1hdGlvbihjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMpOwotdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X2luZm9ybWF0aW9uKGJ0X2RldmljZV9jbGFzc190KiBkYywgYm9vbCBzZXQpOwpkaWZmIC0tZ2l0IGEvYnRjb3JlL2luY2x1ZGUvZGV2aWNlX2ZlYXR1cmVzLmggYi9idGNvcmUvaW5jbHVkZS9kZXZpY2VfZmVhdHVyZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiMmRmNi4uMDAwMDAwMAotLS0gYS9idGNvcmUvaW5jbHVkZS9kZXZpY2VfZmVhdHVyZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLy8gUmVwcmVzZW50cyBhIHBhZ2Ugb2YgZGV2aWNlIGZlYXR1cmUgZW5hYmxlZC9kaXNhYmxlZCBiaXRzIHJldHVybmVkCi0vLyBieSB0aGUgbG9jYWwgY29udHJvbGxlci4gU2VlIHRoZSBibHVldG9vdGggc3BlYyBmb3IgYml0IGluZGV4ZXMuCi10eXBlZGVmIHN0cnVjdCB7IHVpbnQ4X3QgYXNfYXJyYXlbOF07IH0gYnRfZGV2aWNlX2ZlYXR1cmVzX3Q7CmRpZmYgLS1naXQgYS9idGNvcmUvaW5jbHVkZS9ldmVudF9tYXNrLmggYi9idGNvcmUvaW5jbHVkZS9ldmVudF9tYXNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWZlNjQuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvZXZlbnRfbWFzay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vLyBSZXByZXNlbnRzIGEgbWFzayB3aGljaCBjYW4gYmUgdXNlZCB0byB0ZWxsIHRoZSBjb250cm9sbGVyIHdoaWNoCi0vLyBIQ0kgZXZlbnRzIHRoZSBzdGFjayB3aXNoZXMgdG8gYmUgaW5mb3JtZWQgYWJvdXQuIFNlZSB0aGUgYmx1ZXRvb3RoCi0vLyBzcGVjIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgZWFjaCBiaXQgbWVhbnMuCi10eXBlZGVmIHN0cnVjdCB7IGNvbnN0IHVpbnQ4X3QgYXNfYXJyYXlbOF07IH0gYnRfZXZlbnRfbWFza190OwpkaWZmIC0tZ2l0IGEvYnRjb3JlL2luY2x1ZGUvaGFsX3V0aWwuaCBiL2J0Y29yZS9pbmNsdWRlL2hhbF91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTY2OGYuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvaGFsX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0vLyBMb2FkcyB0aGUgQmx1ZXRvb3RoIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gbG9va3MgZXhwbGljaXRseSBmb3IKLS8vIGxpYmJsdWV0b290aC5zbyBhbmQgbG9hZHMgaXQuCi1pbnQgaGFsX3V0aWxfbG9hZF9idF9saWJyYXJ5KGNvbnN0IGJ0X2ludGVyZmFjZV90KiogaW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL2J0Y29yZS9pbmNsdWRlL2lhYy5oIGIvYnRjb3JlL2luY2x1ZGUvaWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzgzMGUuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvaWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8vIElucXVpcnkgQWNjZXNzIENvZGUKLS8vIFtCbHVldG9vdGggQmFzZWJhbmRdCi0vLyAoaHR0cHM6Ly93d3cuYmx1ZXRvb3RoLm9yZy9lbi11cy9zcGVjaWZpY2F0aW9uL2Fzc2lnbmVkLW51bWJlcnMvYmFzZWJhbmQpCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgaWFjWzNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBidF9pbnF1aXJ5X2FjY2Vzc19jb2RlX3Q7CmRpZmYgLS1naXQgYS9idGNvcmUvaW5jbHVkZS9tb2R1bGUuaCBiL2J0Y29yZS9pbmNsdWRlL21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmY1ZmQyLi4wMDAwMDAwCi0tLSBhL2J0Y29yZS9pbmNsdWRlL21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZnV0dXJlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0KLXR5cGVkZWYgZnV0dXJlX3QqICgqbW9kdWxlX2xpZmVjeWNsZV9mbikodm9pZCk7Ci0KLSNkZWZpbmUgQlRDT1JFX01BWF9NT0RVTEVfREVQRU5ERU5DSUVTIDEwCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciogbmFtZXtudWxscHRyfTsKLSAgbW9kdWxlX2xpZmVjeWNsZV9mbiBpbml0e251bGxwdHJ9OwotICBtb2R1bGVfbGlmZWN5Y2xlX2ZuIHN0YXJ0X3Vwe251bGxwdHJ9OwotICBtb2R1bGVfbGlmZWN5Y2xlX2ZuIHNodXRfZG93bntudWxscHRyfTsKLSAgbW9kdWxlX2xpZmVjeWNsZV9mbiBjbGVhbl91cHtudWxscHRyfTsKLSAgY29uc3QgY2hhciogZGVwZW5kZW5jaWVzW0JUQ09SRV9NQVhfTU9EVUxFX0RFUEVOREVOQ0lFU117bnVsbHB0cn07Ci19IG1vZHVsZV90OwotCi0vLyBQcmVwYXJlcyBtb2R1bGUgbWFuYWdlbWVudC4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIHdpdGgKLS8vIG1vZHVsZXMuCi12b2lkIG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0KHZvaWQpOwotLy8gQ2xlYW5zIHVwIGFsbCBtb2R1bGUgbWFuYWdlbWVudCByZXNvdXJjZXMuCi12b2lkIG1vZHVsZV9tYW5hZ2VtZW50X3N0b3Aodm9pZCk7Ci0KLWNvbnN0IG1vZHVsZV90KiBnZXRfbW9kdWxlKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vLyBJbml0aWFsaXplIHRoZSBwcm92aWRlZCBtb2R1bGUuIHxtb2R1bGV8IG1heSBub3QgYmUgTlVMTAotLy8gYW5kIG11c3Qgbm90IGJlIGluaXRpYWxpemVkLgotYm9vbCBtb2R1bGVfaW5pdChjb25zdCBtb2R1bGVfdCogbW9kdWxlKTsKLS8vIFN0YXJ0IHVwIHRoZSBwcm92aWRlZCBtb2R1bGUuIHxtb2R1bGV8IG1heSBub3QgYmUgTlVMTAotLy8gYW5kIG11c3QgYmUgaW5pdGlhbGl6ZWQgb3IgaGF2ZSBubyBpbml0IGZ1bmN0aW9uLgotYm9vbCBtb2R1bGVfc3RhcnRfdXAoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSk7Ci0vLyBTaHV0IGRvd24gdGhlIHByb3ZpZGVkIG1vZHVsZS4gfG1vZHVsZXwgbWF5IG5vdCBiZSBOVUxMLgotLy8gSWYgbm90IHN0YXJ0ZWQsIGRvZXMgbm90aGluZy4KLXZvaWQgbW9kdWxlX3NodXRfZG93bihjb25zdCBtb2R1bGVfdCogbW9kdWxlKTsKLS8vIENsZWFuIHVwIHRoZSBwcm92aWRlZCBtb2R1bGUuIHxtb2R1bGV8IG1heSBub3QgYmUgTlVMTC4KLS8vIElmIG5vdCBpbml0aWFsaXplZCwgZG9lcyBub3RoaW5nLgotdm9pZCBtb2R1bGVfY2xlYW5fdXAoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSk7CmRpZmYgLS1naXQgYS9idGNvcmUvaW5jbHVkZS9vc2lfbW9kdWxlLmggYi9idGNvcmUvaW5jbHVkZS9vc2lfbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTgwMzkuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvb3NpX21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotc3RhdGljIGNvbnN0IGNoYXIgT1NJX01PRFVMRVtdID0gIm9zaV9tb2R1bGUiOwpkaWZmIC0tZ2l0IGEvYnRjb3JlL2luY2x1ZGUvcHJvcGVydHkuaCBiL2J0Y29yZS9pbmNsdWRlL3Byb3BlcnR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZDRkNDEuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvcHJvcGVydHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvZGV2aWNlX2NsYXNzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gQ29waWVzIGFuIGFycmF5IG9mIGNvbnNlY3V0aXZlIHByb3BlcnRpZXMgb2YgfGNvdW50fCB0byBhIG5ld2x5Ci0vLyBhbGxvY2F0ZWQgYXJyYXkuIHxwcm9wZXJ0aWVzfCBtdXN0IG5vdCBiZSBOVUxMLgotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfY29weV9hcnJheShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpOwotCi0vLyBDb3BpZXMgfHNyY3wgdG8gfGRlc3R8LiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB8ZGVzdHwuCi0vLyB8c3JjfCBhbmQgfGRlc3R8IG11c3Qgbm90IGJlIE5VTEwuCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9jb3B5KGJ0X3Byb3BlcnR5X3QqIGRlc3QsIGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHNyYyk7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIHR3byBwcm9wZXJ0aWVzIHxwMXwgYW5kIHxwMnwgYXJlIGVxdWFsLgotLy8gfHAxfCBhbmQgfHAyfCBtdXN0IG5vdCBiZSBOVUxMLgotYm9vbCBwcm9wZXJ0eV9lcXVhbHMoY29uc3QgYnRfcHJvcGVydHlfdCogcDEsIGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHAyKTsKLQotLy8gUHJvcGVydHkgcmVzb3VyY2UgYWxsb2NhdGlvbnMuIENhbGxlciBpcyBleHBlY3RlZCB0byBmcmVlIHxwcm9wZXJ0eXwKLS8vIHVzaW5nIHxwcm9wZXJ0eV9mcmVlfCBvciB8cHJvcGVydHlfZnJlZV9hcnJheXwuCi0vLyBQYXJhbWV0ZXIgbXVzdCBub3QgYmUgTlVMTC4gQSBjb3B5IG9mIHRoZSBwYXJhbWV0ZXIgaXMgbWFkZSBhbmQKLS8vIHN0b3JlZCBpbiB0aGUgcHJvcGVydHkuCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9uZXdfYWRkcihjb25zdCBSYXdBZGRyZXNzKiBhZGRyKTsKLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19kZXZpY2VfY2xhc3MoY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjKTsKLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19kZXZpY2VfdHlwZShidF9kZXZpY2VfdHlwZV90IGRldmljZV90eXBlKTsKLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19kaXNjb3ZlcnlfdGltZW91dChjb25zdCB1aW50MzJfdCB0aW1lb3V0KTsKLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19uYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfbmV3X3Jzc2koY29uc3QgaW50OF90IHJzc2kpOwotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfbmV3X3NjYW5fbW9kZShidF9zY2FuX21vZGVfdCBzY2FuX21vZGUpOwotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfbmV3X3V1aWRzKGNvbnN0IGJsdWV0b290aDo6VXVpZCogdXVpZCwgc2l6ZV90IGNvdW50KTsKLQotLy8gUHJvcGVydHkgcmVzb3VyY2UgZnJlZXMgYm90aCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi12b2lkIHByb3BlcnR5X2ZyZWUoYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotdm9pZCBwcm9wZXJ0eV9mcmVlX2FycmF5KGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMsIHNpemVfdCBjb3VudCk7Ci0KLS8vIFZhbHVlIGNoZWNrIGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZSBjb250ZW50cyBvZiB0aGUgcHJvcGVydHkgYXJlCi0vLyBjaGVja2VkIGZvciB0aGUgcmVzcGVjdGl2ZSB2YWxpZGl0eSBhbmQgcmV0dXJucyB0cnVlLCBmYWxzZSBvdGhlcndpc2UuCi0vLyB8cHJvcGVydHl8IG11c3Qgbm90IGJlIE5VTEwuCi1ib29sIHByb3BlcnR5X2lzX2FkZHIoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotYm9vbCBwcm9wZXJ0eV9pc19kZXZpY2VfY2xhc3MoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotYm9vbCBwcm9wZXJ0eV9pc19kZXZpY2VfdHlwZShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci1ib29sIHByb3BlcnR5X2lzX2Rpc2NvdmVyeV90aW1lb3V0KGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KTsKLWJvb2wgcHJvcGVydHlfaXNfbmFtZShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci1ib29sIHByb3BlcnR5X2lzX3Jzc2koY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotYm9vbCBwcm9wZXJ0eV9pc19zY2FuX21vZGUoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotYm9vbCBwcm9wZXJ0eV9pc191dWlkcyhjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci0KLS8vIFZhbHVlIGNvbnZlcnNpb24gY29udmVuaWVuY2UgbWV0aG9kcy4gVGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9wZXJ0eSBhcmUKLS8vIHByb3Blcmx5IHR5cGVkIGFuZCByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiB8cHJvcGVydHl8IG11c3Qgbm90IGJlIE5VTEwuCi1jb25zdCBSYXdBZGRyZXNzKiBwcm9wZXJ0eV9hc19hZGRyKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KTsKLWNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBwcm9wZXJ0eV9hc19kZXZpY2VfY2xhc3MoCi0gICAgY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotYnRfZGV2aWNlX3R5cGVfdCBwcm9wZXJ0eV9hc19kZXZpY2VfdHlwZShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci11aW50MzJfdCBwcm9wZXJ0eV9hc19kaXNjb3ZlcnlfdGltZW91dChjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci1jb25zdCBidF9iZG5hbWVfdCogcHJvcGVydHlfYXNfbmFtZShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci1pbnQ4X3QgcHJvcGVydHlfYXNfcnNzaShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci1idF9zY2FuX21vZGVfdCBwcm9wZXJ0eV9hc19zY2FuX21vZGUoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBwcm9wZXJ0eV9hc191dWlkcyhjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb3VudCk7CmRpZmYgLS1naXQgYS9idGNvcmUvaW5jbHVkZS92ZXJzaW9uLmggYi9idGNvcmUvaW5jbHVkZS92ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Nzg3YzcuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL2luY2x1ZGUvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgaGNpX3ZlcnNpb247Ci0gIHVpbnQxNl90IGhjaV9yZXZpc2lvbjsKLSAgdWludDhfdCBsbXBfdmVyc2lvbjsKLSAgdWludDE2X3QgbWFudWZhY3R1cmVyOwotICB1aW50MTZfdCBsbXBfc3VidmVyc2lvbjsKLX0gYnRfdmVyc2lvbl90OwpkaWZmIC0tZ2l0IGEvYnRjb3JlL3NyYy9kZXZpY2VfY2xhc3MuY2MgYi9idGNvcmUvc3JjL2RldmljZV9jbGFzcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZDFlZC4uMDAwMDAwMAotLS0gYS9idGNvcmUvc3JjL2RldmljZV9jbGFzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL2RldmljZV9jbGFzcy5oIgotI2luY2x1ZGUgImNoZWNrLmgiCi0KLXR5cGVkZWYgc3RydWN0IF9idF9kZXZpY2VfY2xhc3NfdCB7Ci0gIHVpbnQzMl90IHVudXNlZCA6IDI7ICAvLyBMU0JzCi0gIHVpbnQzMl90IG1pbm9yX2RldmljZSA6IDY7Ci0gIHVpbnQzMl90IG1ham9yX2RldmljZSA6IDU7Ci0gIHVpbnQzMl90IG1ham9yX3NlcnZpY2UgOiAxMTsgIC8vIE1TQnMKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIF9idF9kZXZpY2VfY2xhc3NfdDsKLQotLy8gQ29udmVuaWVuY2UgdG8gaW50ZXJwcmV0IHJhdyBkZXZpY2UgY2xhc3MgYnl0ZXMuCi0jZGVmaW5lIERDKHgpICgoX2J0X2RldmljZV9jbGFzc190KikoeCkpCi0KLS8vIEVuc3VyZSB0aGUgaW50ZXJuYWwgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uIGFuZCBwdWJsaWMgb25lCi0vLyBoYXZlIGVxdWFsIHNpemUuCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihfYnRfZGV2aWNlX2NsYXNzX3QpID09IHNpemVvZihidF9kZXZpY2VfY2xhc3NfdCksCi0gICAgICAgICAgICAgICJJbnRlcm5hbCBhbmQgZXh0ZXJuYWwgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uIHNob3VsZCBoYXZlICIKLSAgICAgICAgICAgICAgInRoZSBzYW1lIHNpemUiKTsKLQotLy8gW01ham9yIFNlcnZpY2UgQ2xhc3Nlc10KLS8vIChodHRwczovL3d3dy5ibHVldG9vdGgub3JnL2VuLXVzL3NwZWNpZmljYXRpb24vYXNzaWduZWQtbnVtYmVycy9iYXNlYmFuZCkKLWVudW0gewotICBEQ19MSU1JVEVEX0RJU0NPVkVSQUJMRV9NT0RFID0gMHgwMDAxLAotICBEQ19SRVNFUlZFRDE0ID0gMHgwMDAyLAotICBEQ19SRVNFUlZFRDE1ID0gMHgwMDA0LAotICBEQ19QT1NJVElPTklORyA9IDB4MDAwOCwKLSAgRENfTkVUV09SS0lORyA9IDB4MDAxMCwKLSAgRENfUkVOREVSSU5HID0gMHgwMDIwLAotICBEQ19DQVBUVVJJTkcgPSAweDAwNDAsCi0gIERDX09CSkVDVF9UUkFOU0ZFUiA9IDB4MDA4MCwKLSAgRENfQVVESU8gPSAweDAxMDAsCi0gIERDX1RFTEVQSE9OWSA9IDB4MDIwMCwKLSAgRENfSU5GT1JNQVRJT04gPSAweDA0MDAsCi19OwotCi1zdGF0aWMgYm9vbCBkZXZpY2VfY2xhc3NfZ2V0X21ham9yX3NlcnZpY2VfKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hc2spOwotc3RhdGljIHZvaWQgZGV2aWNlX2NsYXNzX2Nscl9tYWpvcl9zZXJ2aWNlXyhidF9kZXZpY2VfY2xhc3NfdCogZGMsIGludCBiaXRtYXNrKTsKLXN0YXRpYyB2b2lkIGRldmljZV9jbGFzc19zZXRfbWFqb3Jfc2VydmljZV8oYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBpbnQgYml0bWFzayk7Ci0KLXZvaWQgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKGJ0X2RldmljZV9jbGFzc190KiBkYywgY29uc3QgdWludDhfdCogZGF0YSkgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLSAgKmRjID0gKihidF9kZXZpY2VfY2xhc3NfdCopZGF0YTsKLX0KLQotaW50IGRldmljZV9jbGFzc190b19zdHJlYW0oY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLSAgQ0hFQ0sobGVuID49IHNpemVvZihidF9kZXZpY2VfY2xhc3NfdCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihidF9kZXZpY2VfY2xhc3NfdCk7ICsraSkgewotICAgIGRhdGFbaV0gPSBkYy0+X1tpXTsKLSAgfQotICByZXR1cm4gc2l6ZW9mKGJ0X2RldmljZV9jbGFzc190KTsKLX0KLQotdm9pZCBkZXZpY2VfY2xhc3NfZnJvbV9pbnQoYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBpbnQgZGF0YSkgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgQ0hFQ0soZGF0YSAhPSAwKTsKLSAgLy8gQ2FyZWZ1bCB3aXRoIGVuZGlhbmVzcy4KLSAgZGMtPl9bMF0gPSBkYXRhICYgMHhmZjsKLSAgZGMtPl9bMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7Ci0gIGRjLT5fWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKLX0KLQotaW50IGRldmljZV9jbGFzc190b19pbnQoY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjKSB7Ci0gIENIRUNLKGRjICE9IE5VTEwpOwotICAvLyBDYXJlZnVsIHdpdGggZW5kaWFuZXNzLgotICBpbnQgdmFsID0gMDsKLSAgbWVtY3B5KCZ2YWwsIGRjLCBzaXplb2YoKmRjKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGxlMzJ0b2godmFsKSAmIDB4ZmZmZmZmKTsKLX0KLQotYm9vbCBkZXZpY2VfY2xhc3NfZXF1YWxzKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogcDIpIHsKLSAgQ0hFQ0socDEgIT0gTlVMTCk7Ci0gIENIRUNLKHAyICE9IE5VTEwpOwotICByZXR1cm4gKG1lbWNtcChwMSwgcDIsIHNpemVvZihidF9kZXZpY2VfY2xhc3NfdCkpID09IDApOwotfQotCi1ib29sIGRldmljZV9jbGFzc19jb3B5KGJ0X2RldmljZV9jbGFzc190KiBkZXN0LCBjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogc3JjKSB7Ci0gIENIRUNLKGRlc3QgIT0gTlVMTCk7Ci0gIENIRUNLKHNyYyAhPSBOVUxMKTsKLSAgcmV0dXJuIChtZW1jcHkoZGVzdCwgc3JjLCBzaXplb2YoYnRfZGV2aWNlX2NsYXNzX3QpKSA9PSBkZXN0KTsKLX0KLQotaW50IGRldmljZV9jbGFzc19nZXRfbWFqb3JfZGV2aWNlKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYykgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgcmV0dXJuIERDKGRjKS0+bWFqb3JfZGV2aWNlOwotfQotCi12b2lkIGRldmljZV9jbGFzc19zZXRfbWFqb3JfZGV2aWNlKGJ0X2RldmljZV9jbGFzc190KiBkYywgaW50IHZhbCkgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgREMoZGMpLT5tYWpvcl9kZXZpY2UgPSB2YWw7Ci19Ci0KLWludCBkZXZpY2VfY2xhc3NfZ2V0X21pbm9yX2RldmljZShjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMpIHsKLSAgQ0hFQ0soZGMgIT0gTlVMTCk7Ci0gIHJldHVybiBEQyhkYyktPm1pbm9yX2RldmljZTsKLX0KLQotdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X21pbm9yX2RldmljZShidF9kZXZpY2VfY2xhc3NfdCogZGMsIGludCB2YWwpIHsKLSAgQ0hFQ0soZGMgIT0gTlVMTCk7Ci0gIERDKGRjKS0+bWlub3JfZGV2aWNlID0gdmFsOwotfQotCi1ib29sIGRldmljZV9jbGFzc19nZXRfaW5mb3JtYXRpb24oY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjKSB7Ci0gIENIRUNLKGRjICE9IE5VTEwpOwotICByZXR1cm4gZGV2aWNlX2NsYXNzX2dldF9tYWpvcl9zZXJ2aWNlXyhkYywgRENfSU5GT1JNQVRJT04pOwotfQotCi12b2lkIGRldmljZV9jbGFzc19zZXRfaW5mb3JtYXRpb24oYnRfZGV2aWNlX2NsYXNzX3QqIGRjLCBib29sIHNldCkgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgaWYgKHNldCkKLSAgICBkZXZpY2VfY2xhc3Nfc2V0X21ham9yX3NlcnZpY2VfKGRjLCBEQ19JTkZPUk1BVElPTik7Ci0gIGVsc2UKLSAgICBkZXZpY2VfY2xhc3NfY2xyX21ham9yX3NlcnZpY2VfKGRjLCBEQ19JTkZPUk1BVElPTik7Ci19Ci0KLWJvb2wgZGV2aWNlX2NsYXNzX2dldF9saW1pdGVkKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYykgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgcmV0dXJuIGRldmljZV9jbGFzc19nZXRfbWFqb3Jfc2VydmljZV8oZGMsIERDX0xJTUlURURfRElTQ09WRVJBQkxFX01PREUpOwotfQotCi12b2lkIGRldmljZV9jbGFzc19zZXRfbGltaXRlZChidF9kZXZpY2VfY2xhc3NfdCogZGMsIGJvb2wgc2V0KSB7Ci0gIENIRUNLKGRjICE9IE5VTEwpOwotICBpZiAoc2V0KQotICAgIGRldmljZV9jbGFzc19zZXRfbWFqb3Jfc2VydmljZV8oZGMsIERDX0xJTUlURURfRElTQ09WRVJBQkxFX01PREUpOwotICBlbHNlCi0gICAgZGV2aWNlX2NsYXNzX2Nscl9tYWpvcl9zZXJ2aWNlXyhkYywgRENfTElNSVRFRF9ESVNDT1ZFUkFCTEVfTU9ERSk7Ci19Ci0KLXN0YXRpYyBib29sIGRldmljZV9jbGFzc19nZXRfbWFqb3Jfc2VydmljZV8oY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFzaykgewotICByZXR1cm4gKERDKGRjKS0+bWFqb3Jfc2VydmljZSAmIGJpdG1hc2spOwotfQotCi1zdGF0aWMgdm9pZCBkZXZpY2VfY2xhc3NfY2xyX21ham9yX3NlcnZpY2VfKGJ0X2RldmljZV9jbGFzc190KiBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hc2spIHsKLSAgREMoZGMpLT5tYWpvcl9zZXJ2aWNlICY9IH5iaXRtYXNrOwotfQotCi1zdGF0aWMgdm9pZCBkZXZpY2VfY2xhc3Nfc2V0X21ham9yX3NlcnZpY2VfKGJ0X2RldmljZV9jbGFzc190KiBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hc2spIHsKLSAgREMoZGMpLT5tYWpvcl9zZXJ2aWNlIHw9IGJpdG1hc2s7Ci19CmRpZmYgLS1naXQgYS9idGNvcmUvc3JjL2hhbF91dGlsLmNjIGIvYnRjb3JlL3NyYy9oYWxfdXRpbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxYTNiNC4uMDAwMDAwMAotLS0gYS9idGNvcmUvc3JjL2hhbF91dGlsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNkZWZpbmUgTE9HX1RBRyAiaGFsX3V0aWwiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9oYWxfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotCi11c2luZyBiYXNlOjpTdHJpbmdQcmludGY7Ci0KLWV4dGVybiBidF9pbnRlcmZhY2VfdCBibHVldG9vdGhJbnRlcmZhY2U7Ci0KLWludCBoYWxfdXRpbF9sb2FkX2J0X2xpYnJhcnkoY29uc3QgYnRfaW50ZXJmYWNlX3QqKiBpbnRlcmZhY2UpIHsKLSAgKmludGVyZmFjZSA9ICZibHVldG9vdGhJbnRlcmZhY2U7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9idGNvcmUvc3JjL21vZHVsZS5jYyBiL2J0Y29yZS9zcmMvbW9kdWxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ2NDNkLi4wMDAwMDAwCi0tLSBhL2J0Y29yZS9zcmMvbW9kdWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9jb3JlX21vZHVsZSIKLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgTU9EVUxFX1NUQVRFX05PTkUgPSAwLAotICBNT0RVTEVfU1RBVEVfSU5JVElBTElaRUQgPSAxLAotICBNT0RVTEVfU1RBVEVfU1RBUlRFRCA9IDIKLX0gbW9kdWxlX3N0YXRlX3Q7Ci0KLXN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgbW9kdWxlX3QqLCBtb2R1bGVfc3RhdGVfdD4gbWV0YWRhdGE7Ci0KLS8vIFRPRE8oamFtdXJhYSk6IHJlbW92ZSB0aGlzIGxvY2sgYWZ0ZXIgdGhlIHN0YXJ0dXAgc2VxdWVuY2UgaXMgY2xlYW4KLXN0YXRpYyBzdGQ6Om11dGV4IG1ldGFkYXRhX211dGV4OwotCi1zdGF0aWMgYm9vbCBjYWxsX2xpZmVjeWNsZV9mdW5jdGlvbihtb2R1bGVfbGlmZWN5Y2xlX2ZuIGZ1bmN0aW9uKTsKLXN0YXRpYyBtb2R1bGVfc3RhdGVfdCBnZXRfbW9kdWxlX3N0YXRlKGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpOwotc3RhdGljIHZvaWQgc2V0X21vZHVsZV9zdGF0ZShjb25zdCBtb2R1bGVfdCogbW9kdWxlLCBtb2R1bGVfc3RhdGVfdCBzdGF0ZSk7Ci0KLXZvaWQgbW9kdWxlX21hbmFnZW1lbnRfc3RhcnQodm9pZCkge30KLQotdm9pZCBtb2R1bGVfbWFuYWdlbWVudF9zdG9wKHZvaWQpIHsgbWV0YWRhdGEuY2xlYXIoKTsgfQotCi1jb25zdCBtb2R1bGVfdCogZ2V0X21vZHVsZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIG1vZHVsZV90KiBtb2R1bGUgPSAobW9kdWxlX3QqKWRsc3ltKFJUTERfREVGQVVMVCwgbmFtZSk7Ci0gIENIRUNLKG1vZHVsZSk7Ci0gIHJldHVybiBtb2R1bGU7Ci19Ci0KLWJvb2wgbW9kdWxlX2luaXQoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkgewotICBDSEVDSyhtb2R1bGUgIT0gTlVMTCk7Ci0gIENIRUNLKGdldF9tb2R1bGVfc3RhdGUobW9kdWxlKSA9PSBNT0RVTEVfU1RBVEVfTk9ORSk7Ci0KLSAgaWYgKCFjYWxsX2xpZmVjeWNsZV9mdW5jdGlvbihtb2R1bGUtPmluaXQpKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtb2R1bGUgXCIlc1wiIiwgX19mdW5jX18sIG1vZHVsZS0+bmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2V0X21vZHVsZV9zdGF0ZShtb2R1bGUsIE1PRFVMRV9TVEFURV9JTklUSUFMSVpFRCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIG1vZHVsZV9zdGFydF91cChjb25zdCBtb2R1bGVfdCogbW9kdWxlKSB7Ci0gIENIRUNLKG1vZHVsZSAhPSBOVUxMKTsKLSAgLy8gVE9ETyh6YWNob3ZlcmZsb3cpOiByZW1vdmUgbW9kdWxlLT5pbml0IGNoZWNrIG9uY2UgYXV0b21hZ2ljIG9yZGVyL2NhbGwgaXMKLSAgLy8gaW4gcGxhY2UuCi0gIC8vIFRoaXMgaGFjayBpcyBoZXJlIHNvIG1vZHVsZXMgd2hpY2ggZG9uJ3QgcmVxdWlyZSBpbml0IGRvbid0IGhhdmUgdG8gaGF2ZQotICAvLyB1c2VsZXNzIGNhbGxzCi0gIC8vIGFzIHdlJ3JlIGNvbnZlcnRpbmcgdGhlIHN0YXJ0dXAgc2VxdWVuY2UuCi0gIENIRUNLKGdldF9tb2R1bGVfc3RhdGUobW9kdWxlKSA9PSBNT0RVTEVfU1RBVEVfSU5JVElBTElaRUQgfHwKLSAgICAgICAgbW9kdWxlLT5pbml0ID09IE5VTEwpOwotCi0gIExPR19JTkZPKCIlcyBTdGFydGluZyBtb2R1bGUgXCIlc1wiIiwgX19mdW5jX18sIG1vZHVsZS0+bmFtZSk7Ci0gIGlmICghY2FsbF9saWZlY3ljbGVfZnVuY3Rpb24obW9kdWxlLT5zdGFydF91cCkpIHsKLSAgICBMT0dfRVJST1IoIiVzIEZhaWxlZCB0byBzdGFydCB1cCBtb2R1bGUgXCIlc1wiIiwgX19mdW5jX18sIG1vZHVsZS0+bmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIExPR19JTkZPKCIlcyBTdGFydGVkIG1vZHVsZSBcIiVzXCIiLCBfX2Z1bmNfXywgbW9kdWxlLT5uYW1lKTsKLQotICBzZXRfbW9kdWxlX3N0YXRlKG1vZHVsZSwgTU9EVUxFX1NUQVRFX1NUQVJURUQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBtb2R1bGVfc2h1dF9kb3duKGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpIHsKLSAgQ0hFQ0sobW9kdWxlICE9IE5VTEwpOwotICBtb2R1bGVfc3RhdGVfdCBzdGF0ZSA9IGdldF9tb2R1bGVfc3RhdGUobW9kdWxlKTsKLSAgQ0hFQ0soc3RhdGUgPD0gTU9EVUxFX1NUQVRFX1NUQVJURUQpOwotCi0gIC8vIE9ubHkgc29tZXRoaW5nIHRvIGRvIGlmIHRoZSBtb2R1bGUgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQKLSAgaWYgKHN0YXRlIDwgTU9EVUxFX1NUQVRFX1NUQVJURUQpIHJldHVybjsKLQotICBMT0dfSU5GTygiJXMgU2h1dHRpbmcgZG93biBtb2R1bGUgXCIlc1wiIiwgX19mdW5jX18sIG1vZHVsZS0+bmFtZSk7Ci0gIGlmICghY2FsbF9saWZlY3ljbGVfZnVuY3Rpb24obW9kdWxlLT5zaHV0X2Rvd24pKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBGYWlsZWQgdG8gc2h1dGRvd24gbW9kdWxlIFwiJXNcIi4gQ29udGludWluZyBhbnl3YXkuIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIG1vZHVsZS0+bmFtZSk7Ci0gIH0KLSAgTE9HX0lORk8oIiVzIFNodXRkb3duIG9mIG1vZHVsZSBcIiVzXCIgY29tcGxldGVkIiwgX19mdW5jX18sIG1vZHVsZS0+bmFtZSk7Ci0KLSAgc2V0X21vZHVsZV9zdGF0ZShtb2R1bGUsIE1PRFVMRV9TVEFURV9JTklUSUFMSVpFRCk7Ci19Ci0KLXZvaWQgbW9kdWxlX2NsZWFuX3VwKGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpIHsKLSAgQ0hFQ0sobW9kdWxlICE9IE5VTEwpOwotICBtb2R1bGVfc3RhdGVfdCBzdGF0ZSA9IGdldF9tb2R1bGVfc3RhdGUobW9kdWxlKTsKLSAgQ0hFQ0soc3RhdGUgPD0gTU9EVUxFX1NUQVRFX0lOSVRJQUxJWkVEKTsKLQotICAvLyBPbmx5IHNvbWV0aGluZyB0byBkbyBpZiB0aGUgbW9kdWxlIHdhcyBhY3R1YWxseSBpbml0aWFsaXplZAotICBpZiAoc3RhdGUgPCBNT0RVTEVfU1RBVEVfSU5JVElBTElaRUQpIHJldHVybjsKLQotICBMT0dfSU5GTygiJXMgQ2xlYW5pbmcgdXAgbW9kdWxlIFwiJXNcIiIsIF9fZnVuY19fLCBtb2R1bGUtPm5hbWUpOwotICBpZiAoIWNhbGxfbGlmZWN5Y2xlX2Z1bmN0aW9uKG1vZHVsZS0+Y2xlYW5fdXApKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBGYWlsZWQgdG8gY2xlYW51cCBtb2R1bGUgXCIlc1wiLiBDb250aW51aW5nIGFueXdheS4iLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgbW9kdWxlLT5uYW1lKTsKLSAgfQotICBMT0dfSU5GTygiJXMgQ2xlYW51cCBvZiBtb2R1bGUgXCIlc1wiIGNvbXBsZXRlZCIsIF9fZnVuY19fLCBtb2R1bGUtPm5hbWUpOwotCi0gIHNldF9tb2R1bGVfc3RhdGUobW9kdWxlLCBNT0RVTEVfU1RBVEVfTk9ORSk7Ci19Ci0KLXN0YXRpYyBib29sIGNhbGxfbGlmZWN5Y2xlX2Z1bmN0aW9uKG1vZHVsZV9saWZlY3ljbGVfZm4gZnVuY3Rpb24pIHsKLSAgLy8gQSBOVUxMIGxpZmVjeWNsZSBmdW5jdGlvbiBtZWFucyBpdCBpc24ndCBuZWVkZWQsIHNvIGFzc3VtZSBzdWNjZXNzCi0gIGlmICghZnVuY3Rpb24pIHJldHVybiB0cnVlOwotCi0gIGZ1dHVyZV90KiBmdXR1cmUgPSBmdW5jdGlvbigpOwotCi0gIC8vIEEgTlVMTCBmdXR1cmUgbWVhbnMgc3luY2hyb25vdXMgc3VjY2VzcwotICBpZiAoIWZ1dHVyZSkgcmV0dXJuIHRydWU7Ci0KLSAgLy8gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgZnV0dXJlCi0gIHJldHVybiBmdXR1cmVfYXdhaXQoZnV0dXJlKTsKLX0KLQotc3RhdGljIG1vZHVsZV9zdGF0ZV90IGdldF9tb2R1bGVfc3RhdGUoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtZXRhZGF0YV9tdXRleCk7Ci0gIGF1dG8gbWFwX3B0ciA9IG1ldGFkYXRhLmZpbmQobW9kdWxlKTsKLQotICByZXR1cm4gKG1hcF9wdHIgIT0gbWV0YWRhdGEuZW5kKCkpID8gbWFwX3B0ci0+c2Vjb25kIDogTU9EVUxFX1NUQVRFX05PTkU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9tb2R1bGVfc3RhdGUoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSwgbW9kdWxlX3N0YXRlX3Qgc3RhdGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobWV0YWRhdGFfbXV0ZXgpOwotICBtZXRhZGF0YVttb2R1bGVdID0gc3RhdGU7Ci19CmRpZmYgLS1naXQgYS9idGNvcmUvc3JjL29zaV9tb2R1bGUuY2MgYi9idGNvcmUvc3JjL29zaV9tb2R1bGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODFjODcuLjAwMDAwMDAKLS0tIGEvYnRjb3JlL3NyYy9vc2lfbW9kdWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X29zaV9tb2R1bGUiCi0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9vc2lfbW9kdWxlLmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvbW9kdWxlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS93YWtlbG9jay5oIgotCi1mdXR1cmVfdCogb3NpX2luaXQodm9pZCkgewotICByZXR1cm4gZnV0dXJlX25ld19pbW1lZGlhdGUoRlVUVVJFX1NVQ0NFU1MpOwotfQotCi1mdXR1cmVfdCogb3NpX2NsZWFuX3VwKHZvaWQpIHsKLSAgYWxhcm1fY2xlYW51cCgpOwotICB3YWtlbG9ja19jbGVhbnVwKCk7Ci0gIHJldHVybiBmdXR1cmVfbmV3X2ltbWVkaWF0ZShGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wgZXh0ZXJuIGNvbnN0IG1vZHVsZV90IG9zaV9tb2R1bGUgPSB7Lm5hbWUgPSBPU0lfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdCA9IG9zaV9pbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRfdXAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2h1dF9kb3duID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsZWFuX3VwID0gb3NpX2NsZWFuX3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVwZW5kZW5jaWVzID0ge05VTEx9fTsKZGlmZiAtLWdpdCBhL2J0Y29yZS9zcmMvcHJvcGVydHkuY2MgYi9idGNvcmUvc3JjL3Byb3BlcnR5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjVhMzAzLi4wMDAwMDAwCi0tLSBhL2J0Y29yZS9zcmMvcHJvcGVydHkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvcHJvcGVydHkuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvZGV2aWNlX2NsYXNzLmgiCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotc3RhdGljIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld18odm9pZCogdmFsLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpOwotCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9jb3B5X2FycmF5KGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCkgewotICBDSEVDSyhwcm9wZXJ0aWVzICE9IE5VTEwpOwotICBidF9wcm9wZXJ0eV90KiBjbG9uZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxidF9wcm9wZXJ0eV90Kj4ob3NpX2NhbGxvYyhzaXplb2YoYnRfcHJvcGVydHlfdCkgKiBjb3VudCkpOwotCi0gIG1lbWNweSgmY2xvbmVbMF0sICZwcm9wZXJ0aWVzWzBdLCBzaXplb2YoYnRfcHJvcGVydHlfdCkgKiBjb3VudCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIGNsb25lW2ldLnZhbCA9IG9zaV9jYWxsb2MoY2xvbmVbaV0ubGVuKTsKLSAgICBtZW1jcHkoY2xvbmVbaV0udmFsLCBwcm9wZXJ0aWVzW2ldLnZhbCwgY2xvbmVbaV0ubGVuKTsKLSAgfQotCi0gIHJldHVybiBjbG9uZTsKLX0KLQotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfY29weShidF9wcm9wZXJ0eV90KiBkZXN0LCBjb25zdCBidF9wcm9wZXJ0eV90KiBzcmMpIHsKLSAgQ0hFQ0soZGVzdCAhPSBOVUxMKTsKLSAgQ0hFQ0soc3JjICE9IE5VTEwpOwotICByZXR1cm4gKGJ0X3Byb3BlcnR5X3QqKW1lbWNweShkZXN0LCBzcmMsIHNpemVvZihidF9wcm9wZXJ0eV90KSk7Ci19Ci0KLWJvb2wgcHJvcGVydHlfZXF1YWxzKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHAxLCBjb25zdCBidF9wcm9wZXJ0eV90KiBwMikgewotICAvLyBUd28gbnVsbCBwcm9wZXJ0aWVzIGFyZSBub3QgdGhlIHNhbWUuIE1heSBuZWVkIHRvIHJldmlzaXQgdGhhdAotICAvLyBkZWNpc2lvbiB3aGVuIHdlIGhhdmUgYSB0ZXN0IGNhc2UgdGhhdCBleGVyY2lzZXMgdGhhdCBjb25kaXRpb24uCi0gIGlmICghcDEgfHwgIXAyIHx8IHAxLT50eXBlICE9IHAyLT50eXBlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQWx0aG91Z2ggdGhlIEJsdWV0b290aCBuYW1lIGlzIGEgMjQ5LWJ5dGUgYXJyYXksIHRoZSBpbXBsZW1lbnRhdGlvbgotICAvLyB0cmVhdHMgaXQgbGlrZSBhIHZhcmlhYmxlLWxlbmd0aCBhcnJheSB3aXRoIGl0cyBzaXplIHNwZWNpZmllZCBpbiB0aGUKLSAgLy8gcHJvcGVydHkncyBgbGVuYCBmaWVsZC4gV2Ugc3BlY2lhbC1jYXNlIHRoZSBlcXVpdmFsZW5jZSBvZiBCRE5BTUUKLSAgLy8gdHlwZXMgaGVyZSBieSB0cnVuY2F0aW5nIHRoZSBsYXJnZXIsIHplcm8tcGFkZGVkIG5hbWUgdG8gaXRzIHN0cmluZwotICAvLyBsZW5ndGggYW5kIGNvbXBhcmluZyBhZ2FpbnN0IHRoZSBzaG9ydGVyIG5hbWUuCi0gIC8vCi0gIC8vIE5vdGU6IGl0IG1heSBiZSB0aGUgY2FzZSB0aGF0IGJvdGggc3RyaW5ncyBhcmUgemVyby1wYWRkZWQgYnV0IHRoYXQKLSAgLy8gaGFzbid0IGNvbWUgdXAgeWV0IHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBoYW5kbGUgaXQuCi0gIGlmIChwMS0+dHlwZSA9PSBCVF9QUk9QRVJUWV9CRE5BTUUgJiYgcDEtPmxlbiAhPSBwMi0+bGVuKSB7Ci0gICAgY29uc3QgYnRfcHJvcGVydHlfdCAqc2hvcnRlciA9IHAxLCAqbG9uZ2VyID0gcDI7Ci0gICAgaWYgKHAxLT5sZW4gPiBwMi0+bGVuKSB7Ci0gICAgICBzaG9ydGVyID0gcDI7Ci0gICAgICBsb25nZXIgPSBwMTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmxlbigoY29uc3QgY2hhciopbG9uZ2VyLT52YWwpID09IChzaXplX3Qpc2hvcnRlci0+bGVuICYmCi0gICAgICAgICAgICFtZW1jbXAobG9uZ2VyLT52YWwsIHNob3J0ZXItPnZhbCwgc2hvcnRlci0+bGVuKTsKLSAgfQotCi0gIHJldHVybiBwMS0+bGVuID09IHAyLT5sZW4gJiYgIW1lbWNtcChwMS0+dmFsLCBwMi0+dmFsLCBwMS0+bGVuKTsKLX0KLQotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfbmV3X2FkZHIoY29uc3QgUmF3QWRkcmVzcyogYWRkcikgewotICBDSEVDSyhhZGRyICE9IE5VTEwpOwotICByZXR1cm4gcHJvcGVydHlfbmV3Xygodm9pZCopYWRkciwgc2l6ZW9mKFJhd0FkZHJlc3MpLCBCVF9QUk9QRVJUWV9CREFERFIpOwotfQotCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9uZXdfZGV2aWNlX2NsYXNzKGNvbnN0IGJ0X2RldmljZV9jbGFzc190KiBkYykgewotICBDSEVDSyhkYyAhPSBOVUxMKTsKLSAgcmV0dXJuIHByb3BlcnR5X25ld18oKHZvaWQqKWRjLCBzaXplb2YoYnRfZGV2aWNlX2NsYXNzX3QpLAotICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UpOwotfQotCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9uZXdfZGV2aWNlX3R5cGUoYnRfZGV2aWNlX3R5cGVfdCB0eXBlKSB7Ci0gIHJldHVybiBwcm9wZXJ0eV9uZXdfKCh2b2lkKikmdHlwZSwgc2l6ZW9mKGJ0X2RldmljZV90eXBlX3QpLAotICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRSk7Ci19Ci0KLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19kaXNjb3ZlcnlfdGltZW91dChjb25zdCB1aW50MzJfdCB0aW1lb3V0KSB7Ci0gIHJldHVybiBwcm9wZXJ0eV9uZXdfKCh2b2lkKikmdGltZW91dCwgc2l6ZW9mKHVpbnQzMl90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVCk7Ci19Ci0KLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19uYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgQ0hFQ0sobmFtZSAhPSBOVUxMKTsKLSAgcmV0dXJuIHByb3BlcnR5X25ld18oKHZvaWQqKW5hbWUsIHNpemVvZihidF9iZG5hbWVfdCksIEJUX1BST1BFUlRZX0JETkFNRSk7Ci19Ci0KLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X25ld19yc3NpKGludDhfdCByc3NpKSB7Ci0gIHJldHVybiBwcm9wZXJ0eV9uZXdfKCh2b2lkKikmcnNzaSwgc2l6ZW9mKGludDhfdCksIEJUX1BST1BFUlRZX1JFTU9URV9SU1NJKTsKLX0KLQotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfbmV3X3NjYW5fbW9kZShidF9zY2FuX21vZGVfdCBzY2FuX21vZGUpIHsKLSAgcmV0dXJuIHByb3BlcnR5X25ld18oKHZvaWQqKSZzY2FuX21vZGUsIHNpemVvZihidF9zY2FuX21vZGVfdCksCi0gICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFKTsKLX0KLQotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfbmV3X3V1aWRzKGNvbnN0IFV1aWQqIHV1aWQsIHNpemVfdCBjb3VudCkgewotICBDSEVDSyh1dWlkICE9IE5VTEwpOwotICByZXR1cm4gcHJvcGVydHlfbmV3Xygodm9pZCopdXVpZCwgc2l6ZW9mKFV1aWQpICogY291bnQsIEJUX1BST1BFUlRZX1VVSURTKTsKLX0KLQotdm9pZCBwcm9wZXJ0eV9mcmVlKGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIHByb3BlcnR5X2ZyZWVfYXJyYXkocHJvcGVydHksIDEpOwotfQotCi12b2lkIHByb3BlcnR5X2ZyZWVfYXJyYXkoYnRfcHJvcGVydHlfdCogcHJvcGVydGllcywgc2l6ZV90IGNvdW50KSB7Ci0gIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHJldHVybjsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBvc2lfZnJlZShwcm9wZXJ0aWVzW2ldLnZhbCk7Ci0gIH0KLQotICBvc2lfZnJlZShwcm9wZXJ0aWVzKTsKLX0KLQotYm9vbCBwcm9wZXJ0eV9pc19hZGRyKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5ICE9IE5VTEwpOwotICByZXR1cm4gcHJvcGVydHktPnR5cGUgPT0gQlRfUFJPUEVSVFlfQkRBRERSOwotfQotCi1ib29sIHByb3BlcnR5X2lzX2RldmljZV9jbGFzcyhjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBDSEVDSyhwcm9wZXJ0eSAhPSBOVUxMKTsKLSAgcmV0dXJuIHByb3BlcnR5LT50eXBlID09IEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRTsKLX0KLQotYm9vbCBwcm9wZXJ0eV9pc19kZXZpY2VfdHlwZShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBDSEVDSyhwcm9wZXJ0eSAhPSBOVUxMKTsKLSAgcmV0dXJuIHByb3BlcnR5LT50eXBlID09IEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFOwotfQotCi1ib29sIHByb3BlcnR5X2lzX2Rpc2NvdmVyeV90aW1lb3V0KGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5ICE9IE5VTEwpOwotICByZXR1cm4gcHJvcGVydHktPnR5cGUgPT0gQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVDsKLX0KLQotYm9vbCBwcm9wZXJ0eV9pc19uYW1lKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5ICE9IE5VTEwpOwotICByZXR1cm4gcHJvcGVydHktPnR5cGUgPT0gQlRfUFJPUEVSVFlfQkROQU1FOwotfQotCi1ib29sIHByb3BlcnR5X2lzX3Jzc2koY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgQ0hFQ0socHJvcGVydHkgIT0gTlVMTCk7Ci0gIHJldHVybiBwcm9wZXJ0eS0+dHlwZSA9PSBCVF9QUk9QRVJUWV9SRU1PVEVfUlNTSTsKLX0KLQotYm9vbCBwcm9wZXJ0eV9pc19zY2FuX21vZGUoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgQ0hFQ0socHJvcGVydHkgIT0gTlVMTCk7Ci0gIHJldHVybiBwcm9wZXJ0eS0+dHlwZSA9PSBCVF9QUk9QRVJUWV9BREFQVEVSX1NDQU5fTU9ERTsKLX0KLQotYm9vbCBwcm9wZXJ0eV9pc191dWlkcyhjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBDSEVDSyhwcm9wZXJ0eSAhPSBOVUxMKTsKLSAgcmV0dXJuIHByb3BlcnR5LT50eXBlID09IEJUX1BST1BFUlRZX1VVSURTOwotfQotCi0vLyBDb252ZW5pZW5jZSBjb252ZXJzaW9uIG1ldGhvZHMgdG8gcHJvcGVydHkgdmFsdWVzCi1jb25zdCBSYXdBZGRyZXNzKiBwcm9wZXJ0eV9hc19hZGRyKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5X2lzX2FkZHIocHJvcGVydHkpKTsKLSAgcmV0dXJuIChjb25zdCBSYXdBZGRyZXNzKilwcm9wZXJ0eS0+dmFsOwotfQotCi1jb25zdCBidF9kZXZpY2VfY2xhc3NfdCogcHJvcGVydHlfYXNfZGV2aWNlX2NsYXNzKAotICAgIGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5X2lzX2RldmljZV9jbGFzcyhwcm9wZXJ0eSkpOwotICByZXR1cm4gKGNvbnN0IGJ0X2RldmljZV9jbGFzc190Kilwcm9wZXJ0eS0+dmFsOwotfQotCi1idF9kZXZpY2VfdHlwZV90IHByb3BlcnR5X2FzX2RldmljZV90eXBlKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5X2lzX2RldmljZV90eXBlKHByb3BlcnR5KSk7Ci0gIHJldHVybiAqKGNvbnN0IGJ0X2RldmljZV90eXBlX3QqKXByb3BlcnR5LT52YWw7Ci19Ci0KLXVpbnQzMl90IHByb3BlcnR5X2FzX2Rpc2NvdmVyeV90aW1lb3V0KGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5X2lzX2Rpc2NvdmVyeV90aW1lb3V0KHByb3BlcnR5KSk7Ci0gIHJldHVybiAqKGNvbnN0IHVpbnQzMl90Kilwcm9wZXJ0eS0+dmFsOwotfQotCi1jb25zdCBidF9iZG5hbWVfdCogcHJvcGVydHlfYXNfbmFtZShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBDSEVDSyhwcm9wZXJ0eV9pc19uYW1lKHByb3BlcnR5KSk7Ci0gIHJldHVybiAoY29uc3QgYnRfYmRuYW1lX3QqKXByb3BlcnR5LT52YWw7Ci19Ci0KLWludDhfdCBwcm9wZXJ0eV9hc19yc3NpKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIENIRUNLKHByb3BlcnR5X2lzX3Jzc2kocHJvcGVydHkpKTsKLSAgcmV0dXJuICooY29uc3QgaW50OF90Kilwcm9wZXJ0eS0+dmFsOwotfQotCi1idF9zY2FuX21vZGVfdCBwcm9wZXJ0eV9hc19zY2FuX21vZGUoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgQ0hFQ0socHJvcGVydHlfaXNfc2Nhbl9tb2RlKHByb3BlcnR5KSk7Ci0gIHJldHVybiAqKGNvbnN0IGJ0X3NjYW5fbW9kZV90Kilwcm9wZXJ0eS0+dmFsOwotfQotCi1jb25zdCBVdWlkKiBwcm9wZXJ0eV9hc191dWlkcyhjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSwgc2l6ZV90KiBjb3VudCkgewotICBDSEVDSyhwcm9wZXJ0eV9pc191dWlkcyhwcm9wZXJ0eSkpOwotICAqY291bnQgPSBzaXplb2YoVXVpZCkgLyBwcm9wZXJ0eS0+bGVuOwotICByZXR1cm4gKGNvbnN0IFV1aWQqKXByb3BlcnR5LT52YWw7Ci19Ci0KLXN0YXRpYyBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9uZXdfKHZvaWQqIHZhbCwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7Ci0gIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5ID0KLSAgICAgIHN0YXRpY19jYXN0PGJ0X3Byb3BlcnR5X3QqPihvc2lfY2FsbG9jKHNpemVvZihidF9wcm9wZXJ0eV90KSkpOwotCi0gIHByb3BlcnR5LT52YWwgPSBvc2lfY2FsbG9jKGxlbiArIDEpOwotICBpZiAodHlwZSA9PSBCVF9QUk9QRVJUWV9CRE5BTUUpIHsKLSAgICBzdHJsY3B5KChjaGFyKilwcm9wZXJ0eS0+dmFsLCAoY29uc3QgY2hhciopdmFsLCBsZW4pOwotICB9IGVsc2UgewotICAgIG1lbWNweShwcm9wZXJ0eS0+dmFsLCB2YWwsIGxlbik7Ci0gIH0KLQotICBwcm9wZXJ0eS0+dHlwZSA9IHR5cGU7Ci0gIHByb3BlcnR5LT5sZW4gPSBsZW47Ci0KLSAgcmV0dXJuIHByb3BlcnR5OwotfQpkaWZmIC0tZ2l0IGEvYnRjb3JlL3Rlc3QvZGV2aWNlX2NsYXNzX3Rlc3QuY2MgYi9idGNvcmUvdGVzdC9kZXZpY2VfY2xhc3NfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYTFmZS4uMDAwMDAwMAotLS0gYS9idGNvcmUvdGVzdC9kZXZpY2VfY2xhc3NfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgIm9zaS90ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvZGV2aWNlX2NsYXNzLmgiCi0KLTo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGNoZWNrX2JpdGZpZWxkKGNvbnN0IGNoYXIqIG1fZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5fZXhwciwgaW50IG0sIGludCBuKSB7Ci0gIGlmIChtID09IG4pIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLQotICBzcy5zdHIoIiIpOwotICBzcyA8PCBzdGQ6OnNob3diYXNlIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBtOwotICBzdGQ6OnN0cmluZyBleHBlY3RlZF9zdHIgPSBzcy5zdHIoKTsKLQotICBzcy5zdHIoIiIpOwotICBzcyA8PCBzdGQ6OnNob3diYXNlIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBuOwotICBzdGQ6OnN0cmluZyBhY3R1YWxfc3RyID0gc3Muc3RyKCk7Ci0KLSAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1fZXhwciA8PCAiIGFuZCAiIDw8IG5fZXhwciA8PCAiICggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZXhwZWN0ZWRfc3RyIDw8ICIgdnMgIiA8PCBhY3R1YWxfc3RyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICkiOwotfQotCi1jbGFzcyBEZXZpY2VDbGFzc1Rlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHt9OwotCi1URVNUX0YoRGV2aWNlQ2xhc3NUZXN0LCBjb2Rfc2l6ZW9mKSB7Ci0gIHVpbnQ4X3QgZGNfc3RyZWFtW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjMDsKLSAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYzAsIGRjX3N0cmVhbSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTMsIHNpemVvZihkYzApKTsKLX0KLQotVEVTVF9GKERldmljZUNsYXNzVGVzdCwgc2ltcGxlKSB7Ci0gIHVpbnQ4X3QgZGNfc3RyZWFtW11bc2l6ZW9mKGJ0X2RldmljZV9jbGFzc190KV0gPSB7Ci0gICAgICB7MHgwMCwgMHgwMCwgMHgwMH0sIHsweGZmLCAweGZmLCAweGZmfSwgezB4YWEsIDB4NTUsIDB4YWF9LAotICAgICAgezB4MDEsIDB4MjMsIDB4NDV9LCB7MHgyMCwgMHgwNywgMHgxNH0sCi0gIH07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoZGNfc3RyZWFtKSAvIHNpemVvZihidF9kZXZpY2VfY2xhc3NfdCk7IGkrKykgewotICAgIGJ0X2RldmljZV9jbGFzc190IGRjOwotICAgIGRldmljZV9jbGFzc19mcm9tX3N0cmVhbSgmZGMsICh1aW50OF90KikmZGNfc3RyZWFtW2ldKTsKLQotICAgIHVpbnQ4X3QqIHRvX3N0cmVhbSA9ICh1aW50OF90KikmZGM7Ci0gICAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgKHVuc2lnbmVkKWRjX3N0cmVhbVtpXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmVhbVswXSk7Ci0gICAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgKHVuc2lnbmVkKWRjX3N0cmVhbVtpXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmVhbVsxXSk7Ci0gICAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgKHVuc2lnbmVkKWRjX3N0cmVhbVtpXVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmVhbVsyXSk7Ci0gIH0KLX0KLQotVEVTVF9GKERldmljZUNsYXNzVGVzdCwgdG9fc3RyZWFtKSB7Ci0gIHsKLSAgICBidF9kZXZpY2VfY2xhc3NfdCBkYzsKLQotICAgIHVpbnQ4X3QgZGNfc3RyZWFtMFtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4YWF9OwotICAgIGRldmljZV9jbGFzc19mcm9tX3N0cmVhbSgmZGMsIGRjX3N0cmVhbTApOwotCi0gICAgdWludDhfdCBkY19zdHJlYW0xW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gICAgaW50IHJjID0gZGV2aWNlX2NsYXNzX3RvX3N0cmVhbSgmZGMsIGRjX3N0cmVhbTEsIHNpemVvZihkY19zdHJlYW0xKSk7Ci0gICAgRVhQRUNUX0VRKDMsIHJjKTsKLQotICAgIHVpbnQzMl90IHZhbCA9IDA7Ci0gICAgbWVtY3B5KCZ2YWwsICZkYywgc2l6ZW9mKGRjKSk7Ci0gICAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgMHgwMDAwMDAwMCwgdmFsKTsKLQotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4MDAsIGRjX3N0cmVhbTFbMF0pOwotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4MDAsIGRjX3N0cmVhbTFbMV0pOwotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4MDAsIGRjX3N0cmVhbTFbMl0pOwotICB9Ci0KLSAgewotICAgIHVpbnQ4X3QgZGNfc3RyZWFtMFtdID0gezB4YWEsIDB4NTUsIDB4YWEsIDB4NTV9OwotICAgIHVpbnQ4X3QgZGNfc3RyZWFtMVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0gICAgYnRfZGV2aWNlX2NsYXNzX3QgZGM7Ci0gICAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYywgZGNfc3RyZWFtMCk7Ci0KLSAgICBpbnQgcmMgPSBkZXZpY2VfY2xhc3NfdG9fc3RyZWFtKCZkYywgZGNfc3RyZWFtMSwgc2l6ZW9mKGRjX3N0cmVhbTEpKTsKLSAgICBFWFBFQ1RfRVEoMywgcmMpOwotICAgIHVpbnQzMl90IHZhbCA9IDA7Ci0gICAgbWVtY3B5KCZ2YWwsICZkYywgc2l6ZW9mKGRjKSk7Ci0gICAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgMHgwMGFhNTVhYSwgdmFsKTsKLQotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4YWEsIGRjX3N0cmVhbTFbMF0pOwotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4NTUsIGRjX3N0cmVhbTFbMV0pOwotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4YWEsIGRjX3N0cmVhbTFbMl0pOwotICB9Ci0KLSAgewotICAgIHVpbnQ4X3QgZGNfc3RyZWFtMFtdID0gezB4MDEsIDB4MjMsIDB4NDUsIDB4Njd9OwotICAgIHVpbnQ4X3QgZGNfc3RyZWFtMVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0gICAgYnRfZGV2aWNlX2NsYXNzX3QgZGM7Ci0gICAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYywgZGNfc3RyZWFtMCk7Ci0KLSAgICBpbnQgcmMgPSBkZXZpY2VfY2xhc3NfdG9fc3RyZWFtKCZkYywgZGNfc3RyZWFtMSwgc2l6ZW9mKGRjX3N0cmVhbTEpKTsKLSAgICBFWFBFQ1RfRVEoMywgcmMpOwotICAgIHVpbnQzMl90IHZhbCA9IDA7Ci0gICAgbWVtY3B5KCZ2YWwsICZkYywgc2l6ZW9mKGRjKSk7Ci0gICAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgMHg0NTIzMDEsIHZhbCk7Ci0KLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKGNoZWNrX2JpdGZpZWxkLCAweDAxLCBkY19zdHJlYW0xWzBdKTsKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKGNoZWNrX2JpdGZpZWxkLCAweDIzLCBkY19zdHJlYW0xWzFdKTsKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQyKGNoZWNrX2JpdGZpZWxkLCAweDQ1LCBkY19zdHJlYW0xWzJdKTsKLSAgfQotfQotCi1URVNUX0YoRGV2aWNlQ2xhc3NUZXN0LCBsaW1pdGVkX2Rpc2NvdmVyYWJsZV9tb2RlKSB7Ci0gIHVpbnQ4X3QgZGNfc3RyZWFtW10gPSB7MHgwMCwgMHgwMCwgMHgwMH07Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjOwotICBkZXZpY2VfY2xhc3NfZnJvbV9zdHJlYW0oJmRjLCBkY19zdHJlYW0pOwotICB1aW50MzJfdCB0ZXN0ID0gMDsKLSAgbWVtY3B5KCZ0ZXN0LCAmZGMsIHNpemVvZihkYykpOwotCi0gIEVYUEVDVF9GQUxTRShkZXZpY2VfY2xhc3NfZ2V0X2xpbWl0ZWQoJmRjKSk7Ci0gIEVYUEVDVF9FUSgodW5zaWduZWQpMHgwMDAwMDAwMCwgdGVzdCk7Ci0KLSAgZGV2aWNlX2NsYXNzX3NldF9saW1pdGVkKCZkYywgdHJ1ZSk7Ci0gIHRlc3QgPSAwOwotICBtZW1jcHkoJnRlc3QsICZkYywgc2l6ZW9mKGRjKSk7Ci0gIEVYUEVDVF9UUlVFKGRldmljZV9jbGFzc19nZXRfbGltaXRlZCgmZGMpKTsKLSAgRVhQRUNUX0VRKCh1bnNpZ25lZCkweDAwMDAyMDAwLCB0ZXN0KTsKLQotICBkZXZpY2VfY2xhc3Nfc2V0X2xpbWl0ZWQoJmRjLCBmYWxzZSk7Ci0gIHRlc3QgPSAwOwotICBtZW1jcHkoJnRlc3QsICZkYywgc2l6ZW9mKGRjKSk7Ci0gIEVYUEVDVF9GQUxTRShkZXZpY2VfY2xhc3NfZ2V0X2xpbWl0ZWQoJmRjKSk7Ci0gIEVYUEVDVF9FUSgodW5zaWduZWQpMHgwMDAwMDAwMCwgdGVzdCk7Ci0KLSAgZGV2aWNlX2NsYXNzX3NldF9saW1pdGVkKCZkYywgdHJ1ZSk7Ci0gIHRlc3QgPSAwOwotICBtZW1jcHkoJnRlc3QsICZkYywgc2l6ZW9mKGRjKSk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoY2hlY2tfYml0ZmllbGQsIDB4MDAwMDIwMDAsIHRlc3QpOwotCi0gIGRldmljZV9jbGFzc19zZXRfbGltaXRlZCgmZGMsIGZhbHNlKTsKLSAgdGVzdCA9IDA7Ci0gIG1lbWNweSgmdGVzdCwgJmRjLCBzaXplb2YoZGMpKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihjaGVja19iaXRmaWVsZCwgMHgwMDAwMDAwMCwgdGVzdCk7Ci19Ci0KLVRFU1RfRihEZXZpY2VDbGFzc1Rlc3QsIGVxdWFscykgewotICB1aW50OF90IGRjX3N0cmVhbTBbXSA9IHsweDAwLCAweDAxLCAweDAyfTsKLSAgdWludDhfdCBkY19zdHJlYW0xW10gPSB7MHgwMCwgMHgwMiwgMHgwM307Ci0KLSAgYnRfZGV2aWNlX2NsYXNzX3QgZGMwOwotICBkZXZpY2VfY2xhc3NfZnJvbV9zdHJlYW0oJmRjMCwgZGNfc3RyZWFtMCk7Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjMTsKLSAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYzEsIGRjX3N0cmVhbTEpOwotICBFWFBFQ1RfRkFMU0UoZGV2aWNlX2NsYXNzX2VxdWFscygmZGMwLCAmZGMxKSk7Ci19Ci0KLVRFU1RfRihEZXZpY2VDbGFzc1Rlc3QsIGNvcHkpIHsKLSAgdWludDhfdCBkY19zdHJlYW0wW10gPSB7MHhhYSwgMHg1NSwgMHgzM307Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjMDsKLSAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYzAsIGRjX3N0cmVhbTApOwotICBidF9kZXZpY2VfY2xhc3NfdCBkYzE7Ci0gIEVYUEVDVF9UUlVFKGRldmljZV9jbGFzc19jb3B5KCZkYzEsICZkYzApKTsKLSAgRVhQRUNUX1RSVUUoZGV2aWNlX2NsYXNzX2VxdWFscygmZGMwLCAmZGMxKSk7Ci19Ci0KLVRFU1RfRihEZXZpY2VDbGFzc1Rlc3QsIGZyb21faW50KSB7Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjMTsKLSAgaW50IGNvZDEgPSAweDVhMDIwYzsgIC8vIDU4OTg3NjQKLSAgZGV2aWNlX2NsYXNzX2Zyb21faW50KCZkYzEsIGNvZDEpOwotCi0gIHVpbnQ4X3QgZGNfc3RyZWFtW10gPSB7MHgwYywgMHgwMiwgMHg1YX07Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjMjsKLSAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYzIsIGRjX3N0cmVhbSk7Ci0gIEVYUEVDVF9UUlVFKGRldmljZV9jbGFzc19lcXVhbHMoJmRjMSwgJmRjMikpOwotfQotCi1URVNUX0YoRGV2aWNlQ2xhc3NUZXN0LCB0b19pbnQpIHsKLSAgYnRfZGV2aWNlX2NsYXNzX3QgZGMxID0ge3sweDBjLCAweDAyLCAweDVhfX07Ci0gIGludCBjb2QxID0gZGV2aWNlX2NsYXNzX3RvX2ludCgmZGMxKTsKLQotICBFWFBFQ1RfRVEoZGMxLl9bMF0sIDB4MGMpOwotICBFWFBFQ1RfRVEoZGMxLl9bMV0sIDB4MDIpOwotICBFWFBFQ1RfRVEoZGMxLl9bMl0sIDB4NWEpOwotCi0gIGJ0X2RldmljZV9jbGFzc190IGRjMjsKLSAgdWludDhfdCBkY19zdHJlYW1bXSA9IHsweDBjLCAweDAyLCAweDVhfTsKLSAgZGV2aWNlX2NsYXNzX2Zyb21fc3RyZWFtKCZkYzIsIGRjX3N0cmVhbSk7Ci0KLSAgRVhQRUNUX0VRKGRjMi5fWzBdLCAweDBjKTsKLSAgRVhQRUNUX0VRKGRjMi5fWzFdLCAweDAyKTsKLSAgRVhQRUNUX0VRKGRjMi5fWzJdLCAweDVhKTsKLQotICBpbnQgY29kMiA9IGRldmljZV9jbGFzc190b19pbnQoJmRjMik7Ci0gIEVYUEVDVF9FUShjb2QxLCBjb2QyKTsKLSAgRVhQRUNUX0VRKGNvZDEsIDB4NWEwMjBjKTsgIC8vIDU4OTg3NjQKLX0KLQotVEVTVF9GKERldmljZUNsYXNzVGVzdCwgZW5kaWFuKSB7Ci0gIGJ0X2RldmljZV9jbGFzc190IGRjOwotICBpbnQgY29kMSA9IDB4MjAwNzE0OyAgLy8gMjA5ODk2NAotICBkZXZpY2VfY2xhc3NfZnJvbV9pbnQoJmRjLCBjb2QxKTsKLQotICBFWFBFQ1RfRVEoZGMuX1swXSwgMHgxNCk7Ci0gIEVYUEVDVF9FUShkYy5fWzFdLCAweDA3KTsKLSAgRVhQRUNUX0VRKGRjLl9bMl0sIDB4MjApOwotCi0gIGludCBjb2QyID0gZGV2aWNlX2NsYXNzX3RvX2ludCgmZGMpOwotICBFWFBFQ1RfRVEoY29kMSwgY29kMik7Ci0gIEVYUEVDVF9FUShjb2QyLCAweDIwMDcxNCk7ICAvLyAyMDk4OTY0Ci19CmRpZmYgLS1naXQgYS9idGNvcmUvdGVzdC9wcm9wZXJ0eV90ZXN0LmNjIGIvYnRjb3JlL3Rlc3QvcHJvcGVydHlfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4ZWQyMi4uMDAwMDAwMAotLS0gYS9idGNvcmUvdGVzdC9wcm9wZXJ0eV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL3Byb3BlcnR5LmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAib3NpL3Rlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLWNsYXNzIFByb3BlcnR5VGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3Mge307Ci0KLVRFU1RfRihQcm9wZXJ0eVRlc3QsIGFkZHIpIHsKLSAgUmF3QWRkcmVzcyBhZGRyMCA9IHt7MHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4Nn19OwotICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19hZGRyKCZhZGRyMCk7Ci0KLSAgRVhQRUNUX0VRKGFkZHIwLmFkZHJlc3NbMF0sICgodWludDhfdCopcHJvcGVydHktPnZhbClbMF0pOwotICBFWFBFQ1RfRVEoYWRkcjAuYWRkcmVzc1sxXSwgKCh1aW50OF90Kilwcm9wZXJ0eS0+dmFsKVsxXSk7Ci0gIEVYUEVDVF9FUShhZGRyMC5hZGRyZXNzWzJdLCAoKHVpbnQ4X3QqKXByb3BlcnR5LT52YWwpWzJdKTsKLSAgRVhQRUNUX0VRKGFkZHIwLmFkZHJlc3NbM10sICgodWludDhfdCopcHJvcGVydHktPnZhbClbM10pOwotICBFWFBFQ1RfRVEoYWRkcjAuYWRkcmVzc1s0XSwgKCh1aW50OF90Kilwcm9wZXJ0eS0+dmFsKVs0XSk7Ci0gIEVYUEVDVF9FUShhZGRyMC5hZGRyZXNzWzVdLCAoKHVpbnQ4X3QqKXByb3BlcnR5LT52YWwpWzVdKTsKLSAgRVhQRUNUX0VRKEJUX1BST1BFUlRZX0JEQUREUiwgcHJvcGVydHktPnR5cGUpOwotICBFWFBFQ1RfRVEoKGludClzaXplb2YoUmF3QWRkcmVzcyksIHByb3BlcnR5LT5sZW4pOwotCi0gIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIxID0gcHJvcGVydHlfYXNfYWRkcihwcm9wZXJ0eSk7Ci0gIEVYUEVDVF9FUShhZGRyMC5hZGRyZXNzWzBdLCBhZGRyMS0+YWRkcmVzc1swXSk7Ci0KLSAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eSk7Ci19Ci0KLVRFU1RfRihQcm9wZXJ0eVRlc3QsIGRldmljZV9jbGFzcykgewotICBidF9kZXZpY2VfY2xhc3NfdCBkYzAgPSB7ezB4MDEsIDB4MjMsIDB4NDV9fTsKLSAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfZGV2aWNlX2NsYXNzKCZkYzApOwotCi0gIEVYUEVDVF9FUShkYzAuX1swXSwgKCh1aW50OF90Kilwcm9wZXJ0eS0+dmFsKVswXSk7Ci0gIEVYUEVDVF9FUShkYzAuX1sxXSwgKCh1aW50OF90Kilwcm9wZXJ0eS0+dmFsKVsxXSk7Ci0gIEVYUEVDVF9FUShkYzAuX1syXSwgKCh1aW50OF90Kilwcm9wZXJ0eS0+dmFsKVsyXSk7Ci0gIEVYUEVDVF9FUShCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UsIHByb3BlcnR5LT50eXBlKTsKLSAgRVhQRUNUX0VRKChpbnQpc2l6ZW9mKGJ0X2RldmljZV9jbGFzc190KSwgcHJvcGVydHktPmxlbik7Ci0KLSAgY29uc3QgYnRfZGV2aWNlX2NsYXNzX3QqIGRjMSA9IHByb3BlcnR5X2FzX2RldmljZV9jbGFzcyhwcm9wZXJ0eSk7Ci0gIGludCBkY19pbnQgPSBkZXZpY2VfY2xhc3NfdG9faW50KGRjMSk7Ci0gIEVYUEVDVF9FUSgweDQ1MjMwMSwgZGNfaW50KTsKLQotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLX0KLQotVEVTVF9GKFByb3BlcnR5VGVzdCwgZGV2aWNlX3R5cGUpIHsKLSAgYnRfZGV2aWNlX3R5cGVfdCBkdDAgPSAoYnRfZGV2aWNlX3R5cGVfdCkxOwotICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19kZXZpY2VfdHlwZShkdDApOwotCi0gIEVYUEVDVF9FUSgoaW50KWR0MCwgKihpbnQqKXByb3BlcnR5LT52YWwpOwotICBFWFBFQ1RfRVEoQlRfUFJPUEVSVFlfVFlQRV9PRl9ERVZJQ0UsIHByb3BlcnR5LT50eXBlKTsKLSAgRVhQRUNUX0VRKChpbnQpc2l6ZW9mKGJ0X2RldmljZV90eXBlX3QpLCBwcm9wZXJ0eS0+bGVuKTsKLQotICBidF9kZXZpY2VfdHlwZV90IGR0MSA9IHByb3BlcnR5X2FzX2RldmljZV90eXBlKHByb3BlcnR5KTsKLSAgRVhQRUNUX0VRKDEsIChpbnQpZHQxKTsKLQotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLX0KLQotVEVTVF9GKFByb3BlcnR5VGVzdCwgZGlzY292ZXJ5X3RpbWVvdXQpIHsKLSAgdWludDMyX3QgdGltZW91dDAgPSAxMjM0NTsKLSAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfZGlzY292ZXJ5X3RpbWVvdXQodGltZW91dDApOwotCi0gIEVYUEVDVF9FUSh0aW1lb3V0MCwgKih1aW50MzJfdCopcHJvcGVydHktPnZhbCk7Ci0gIEVYUEVDVF9FUShCVF9QUk9QRVJUWV9BREFQVEVSX0RJU0NPVkVSWV9USU1FT1VULCBwcm9wZXJ0eS0+dHlwZSk7Ci0gIEVYUEVDVF9FUSgoaW50KXNpemVvZih1aW50MzJfdCksIHByb3BlcnR5LT5sZW4pOwotCi0gIHVpbnQzMl90IHRpbWVvdXQxID0gcHJvcGVydHlfYXNfZGlzY292ZXJ5X3RpbWVvdXQocHJvcGVydHkpOwotICBFWFBFQ1RfRVEodGltZW91dDAsIHRpbWVvdXQxKTsKLQotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLX0KLQotVEVTVF9GKFByb3BlcnR5VGVzdCwgbmFtZSkgewotICBjb25zdCBjaGFyKiBuYW1lMCA9ICJNeSBidGNvcmUgbmFtZSI7Ci0gIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5ID0gcHJvcGVydHlfbmV3X25hbWUobmFtZTApOwotCi0gIEVYUEVDVF9FUSgwLCBzdHJjbXAoKGNoYXIqKW5hbWUwLCAoY2hhciopcHJvcGVydHktPnZhbCkpOwotICBFWFBFQ1RfRVEoQlRfUFJPUEVSVFlfQkROQU1FLCBwcm9wZXJ0eS0+dHlwZSk7Ci0gIEVYUEVDVF9FUSgoaW50KXNpemVvZihidF9iZG5hbWVfdCksIHByb3BlcnR5LT5sZW4pOwotCi0gIGNvbnN0IGJ0X2JkbmFtZV90KiBuYW1lMSA9IHByb3BlcnR5X2FzX25hbWUocHJvcGVydHkpOwotICBFWFBFQ1RfRVEoMCwgc3RyY21wKChjaGFyKiluYW1lMCwgKGNoYXIqKW5hbWUxLT5uYW1lKSk7Ci0KLSAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eSk7Ci19Ci0KLVRFU1RfRihQcm9wZXJ0eVRlc3QsIHJzc2kpIHsKLSAgaW50OF90IHJzc2kwID0gLTU2OwotICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19yc3NpKHJzc2kwKTsKLQotICBFWFBFQ1RfRVEoKihpbnQ4X3QqKXByb3BlcnR5LT52YWwsIHJzc2kwKTsKLSAgRVhQRUNUX0VRKEJUX1BST1BFUlRZX1JFTU9URV9SU1NJLCBwcm9wZXJ0eS0+dHlwZSk7Ci0gIEVYUEVDVF9FUSgoaW50KXNpemVvZihpbnQ4X3QpLCBwcm9wZXJ0eS0+bGVuKTsKLQotICBpbnQ4X3QgcnNzMSA9IHByb3BlcnR5X2FzX3Jzc2kocHJvcGVydHkpOwotICBFWFBFQ1RfRVEocnNzaTAsIHJzczEpOwotCi0gIHByb3BlcnR5X2ZyZWUocHJvcGVydHkpOwotfQotCi1URVNUX0YoUHJvcGVydHlUZXN0LCBzY2FuX21vZGUpIHsKLSAgYnRfc2Nhbl9tb2RlX3QgbW9kZTAgPSAoYnRfc2Nhbl9tb2RlX3QpMzsKLSAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfc2Nhbl9tb2RlKG1vZGUwKTsKLQotICBFWFBFQ1RfRVEoKihpbnQqKXByb3BlcnR5LT52YWwsIG1vZGUwKTsKLSAgRVhQRUNUX0VRKEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFLCBwcm9wZXJ0eS0+dHlwZSk7Ci0gIEVYUEVDVF9FUSgoaW50KXNpemVvZihpbnQpLCBwcm9wZXJ0eS0+bGVuKTsKLQotICBidF9zY2FuX21vZGVfdCBtb2RlMSA9IHByb3BlcnR5X2FzX3NjYW5fbW9kZShwcm9wZXJ0eSk7Ci0gIEVYUEVDVF9FUSgoaW50KW1vZGUwLCAoaW50KW1vZGUxKTsKLQotICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLX0KLQotVEVTVF9GKFByb3BlcnR5VGVzdCwgdXVpZHMpIHsKLSAgVXVpZCB1dWlkMCA9IFV1aWQ6OkZyb20xMjhCaXRCRSh7ewotICAgICAgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwKLSAgICAgIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmYsCi0gIH19KTsKLSAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfdXVpZHMoJnV1aWQwLCAxKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVtY21wKHV1aWQwLlRvMTI4Qml0QkUoKS5kYXRhKCksIHByb3BlcnR5LT52YWwsIHNpemVvZihVdWlkKSkpOwotICBFWFBFQ1RfRVEoQlRfUFJPUEVSVFlfVVVJRFMsIHByb3BlcnR5LT50eXBlKTsKLSAgRVhQRUNUX0VRKChpbnQpc2l6ZW9mKFV1aWQpLCBwcm9wZXJ0eS0+bGVuKTsKLQotICBzaXplX3QgdXVpZF9jbnQxOwotICBjb25zdCBVdWlkKiB1dWlkMSA9IHByb3BlcnR5X2FzX3V1aWRzKHByb3BlcnR5LCAmdXVpZF9jbnQxKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCAqdXVpZDEpOwotCi0gIHByb3BlcnR5X2ZyZWUocHJvcGVydHkpOwotfQotCi1URVNUX0YoUHJvcGVydHlUZXN0LCBjb3B5KSB7Ci0gIHsKLSAgICBVdWlkIHV1aWRzW10gPSB7Ci0gICAgICAgIFV1aWQ6OkZyb20xMjhCaXRCRSh7ewotICAgICAgICAgICAgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhhYSwKLSAgICAgICAgICAgIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmYsCi0gICAgICAgIH19KSwKLSAgICAgICAgVXVpZDo6RnJvbTEyOEJpdEJFKHt7Ci0gICAgICAgICAgICAweGYwLCAweGUxLCAweGQyLCAweGMzLCAweGY0LCAweGU1LCAweGQ2LCAweGM3LCAweGY4LCAweGU5LCAweGRhLAotICAgICAgICAgICAgMHhjYiwgMHhmYywgMHhlZCwgMHhkZSwgMHhjZiwKLSAgICAgICAgfX0pLAotICAgIH07Ci0KLSAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eTAgPQotICAgICAgICBwcm9wZXJ0eV9uZXdfdXVpZHModXVpZHMsIHNpemVvZih1dWlkcykgLyBzaXplb2YoVXVpZCkpOwotCi0gICAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0eTE7Ci0gICAgcHJvcGVydHlfY29weSgmcHJvcGVydHkxLCBwcm9wZXJ0eTApOwotICAgIEVYUEVDVF9UUlVFKHByb3BlcnR5X2VxdWFscyhwcm9wZXJ0eTAsICZwcm9wZXJ0eTEpKTsKLQotICAgIHByb3BlcnR5X2ZyZWUocHJvcGVydHkwKTsKLSAgfQotfQotCi1URVNUX0YoUHJvcGVydHlUZXN0LCBlcXVhbHMpIHsKLSAgewotICAgIFJhd0FkZHJlc3MgYWRkcjAgPSB7ezB4MSwgMHgyLCAweDMsIDB4NCwgMHg1LCAweDZ9fTsKLSAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eTAgPSBwcm9wZXJ0eV9uZXdfYWRkcigmYWRkcjApOwotCi0gICAgYnRfZGV2aWNlX2NsYXNzX3QgZGMwID0ge3sweDAxLCAweDIzLCAweDQ1fX07Ci0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkxID0gcHJvcGVydHlfbmV3X2RldmljZV9jbGFzcygmZGMwKTsKLQotICAgIEVYUEVDVF9GQUxTRShwcm9wZXJ0eV9lcXVhbHMocHJvcGVydHkwLCBwcm9wZXJ0eTEpKTsKLQotICAgIHByb3BlcnR5X2ZyZWUocHJvcGVydHkwKTsKLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5MSk7Ci0gIH0KLQotICB7Ci0gICAgUmF3QWRkcmVzcyBhZGRyID0ge3sweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2fX07Ci0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkwID0gcHJvcGVydHlfbmV3X2FkZHIoJmFkZHIpOwotICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5MSA9IHByb3BlcnR5X25ld19hZGRyKCZhZGRyKTsKLQotICAgIEVYUEVDVF9UUlVFKHByb3BlcnR5X2VxdWFscyhwcm9wZXJ0eTAsIHByb3BlcnR5MSkpOwotCi0gICAgcHJvcGVydHlfZnJlZShwcm9wZXJ0eTApOwotICAgIHByb3BlcnR5X2ZyZWUocHJvcGVydHkxKTsKLSAgfQotCi0gIHsKLSAgICBSYXdBZGRyZXNzIGFkZHIwID0ge3sweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2fX07Ci0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkwID0gcHJvcGVydHlfbmV3X2FkZHIoJmFkZHIwKTsKLQotICAgIFJhd0FkZHJlc3MgYWRkcjEgPSB7ezB4MSwgMHgyLCAweDMsIDB4NCwgMHg1LCAweGZmfX07Ci0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkxID0gcHJvcGVydHlfbmV3X2FkZHIoJmFkZHIxKTsKLQotICAgIEVYUEVDVF9GQUxTRShwcm9wZXJ0eV9lcXVhbHMocHJvcGVydHkwLCBwcm9wZXJ0eTEpKTsKLQotICAgIHByb3BlcnR5X2ZyZWUocHJvcGVydHkwKTsKLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5MSk7Ci0gIH0KLQotICB7Ci0gICAgY29uc3QgY2hhciogbmFtZTAgPSAiTXkgYnRjb3JlIG5hbWUiOwotICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5MCA9IHByb3BlcnR5X25ld19uYW1lKG5hbWUwKTsKLQotICAgIGNvbnN0IGNoYXIqIG5hbWUxID0gIk15IGJ0Y29yZSBuYW1lIjsKLSAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eTEgPSBwcm9wZXJ0eV9uZXdfbmFtZShuYW1lMSk7Ci0KLSAgICBFWFBFQ1RfVFJVRShwcm9wZXJ0eV9lcXVhbHMocHJvcGVydHkwLCBwcm9wZXJ0eTEpKTsKLQotICAgIHByb3BlcnR5X2ZyZWUocHJvcGVydHkwKTsKLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5MSk7Ci0gIH0KLQotICB7Ci0gICAgY29uc3QgY2hhciogbmFtZTAgPSAiTXkgYnRjb3JlIG5hbWUiOwotICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5MCA9IHByb3BlcnR5X25ld19uYW1lKG5hbWUwKTsKLQotICAgIGNvbnN0IGNoYXIqIG5hbWUxID0gIk15IGJ0Y29yZSBuYW1lICAgICAiOwotICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5MSA9IHByb3BlcnR5X25ld19uYW1lKG5hbWUxKTsKLQotICAgIEVYUEVDVF9GQUxTRShwcm9wZXJ0eV9lcXVhbHMocHJvcGVydHkwLCBwcm9wZXJ0eTEpKTsKLQotICAgIHByb3BlcnR5X2ZyZWUocHJvcGVydHkwKTsKLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5MSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0aWYvQW5kcm9pZC5icCBiL2J0aWYvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkY2ViZC4uMDAwMDAwMAotLS0gYS9idGlmL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLy8gQ29tbW9uIHZhcmlhYmxlcwotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotYnRpZkNvbW1vbkluY2x1ZGVzID0gWwotICAgICJzeXN0ZW0vYnQiLAotICAgICJzeXN0ZW0vYnQvYnRhL2RtIiwKLSAgICAic3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAic3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICJzeXN0ZW0vYnQvYnRpZi9hdnJjcCIsCi0gICAgInN5c3RlbS9idC9idGlmL2NvIiwKLSAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgInN5c3RlbS9idC9kZXZpY2UvaW5jbHVkZSIsCi0gICAgInN5c3RlbS9idC9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZSIsCi0gICAgInN5c3RlbS9idC9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZSIsCi0gICAgInN5c3RlbS9idC9nZCIsCi0gICAgInN5c3RlbS9idC9oY2kvaW5jbHVkZSIsCi0gICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICJzeXN0ZW0vYnQvc3RhY2svYTJkcCIsCi0gICAgInN5c3RlbS9idC9zdGFjay9hdmR0IiwKLSAgICAic3lzdGVtL2J0L3N0YWNrL2J0bSIsCi0gICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAic3lzdGVtL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAic3lzdGVtL2J0L3VkcnYvaW5jbHVkZSIsCi0gICAgInN5c3RlbS9idC91dGlscy9pbmNsdWRlIiwKLSAgICAic3lzdGVtL2J0L3ZuZC9pbmNsdWRlIiwKLSAgICAic3lzdGVtL2xpYmh3YmluZGVyL2luY2x1ZGUiLAotXQotCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlic3RhdHNsb2dfYnQiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbInN0YXRzbG9nX2J0LmNwcCJdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbInN0YXRzbG9nX2J0LmgiXSwKLSAgICBleHBvcnRfZ2VuZXJhdGVkX2hlYWRlcnM6IFsic3RhdHNsb2dfYnQuaCJdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJsaWJzdGF0c3NvY2tldCIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAgICAgICAgICAibGlic3RhdHNzb2NrZXQiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgaG9zdDogewotICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgICAgICAgICAibGlic3RhdHNzb2NrZXQiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgICAgICAgICAibGlic3RhdHNzb2NrZXQiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAic3RhdHNsb2dfYnQuaCIsCi0gICAgdG9vbHM6IFsic3RhdHMtbG9nLWFwaS1nZW4iXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIHN0YXRzLWxvZy1hcGktZ2VuKSAtLWhlYWRlciAkKGdlbkRpcikvc3RhdHNsb2dfYnQuaCAtLW1vZHVsZSBibHVldG9vdGgiCi0gICAgICAgICsgIiAtLW5hbWVzcGFjZSBibHVldG9vdGgiLAotICAgIG91dDogWyJzdGF0c2xvZ19idC5oIl0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJzdGF0c2xvZ19idC5jcHAiLAotICAgIHRvb2xzOiBbInN0YXRzLWxvZy1hcGktZ2VuIl0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBzdGF0cy1sb2ctYXBpLWdlbikgLS1jcHAgJChnZW5EaXIpL3N0YXRzbG9nX2J0LmNwcCAtLW1vZHVsZSBibHVldG9vdGgiCi0gICAgICAgICsgIiAtLW5hbWVzcGFjZSBibHVldG9vdGggLS1pbXBvcnRIZWFkZXIgc3RhdHNsb2dfYnQuaCIsCi0gICAgb3V0OiBbInN0YXRzbG9nX2J0LmNwcCJdLAotfQotCi0vLyBsaWJidGlmIHN0YXRpYyBsaWJyYXJ5IGZvciB0YXJnZXQKLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliYnRpZl9kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IGJ0aWZDb21tb25JbmNsdWRlcywKLSAgICBzcmNzOiBbCi0gICAgICAgIC8vIEFWUkNQIFRhcmdldCBTZXJ2aWNlCi0gICAgICAgICJhdnJjcC9hdnJjcF9zZXJ2aWNlLmNjIiwKLSAgICAgICAgLy8gQ2FsbG91dHMKLSAgICAgICAgImNvL2J0YV9kbV9jby5jYyIsCi0gICAgICAgICJjby9idGFfYXZfY28uY2MiLAotICAgICAgICAiY28vYnRhX2hoX2NvLmNjIiwKLSAgICAgICAgImNvL2J0YV9wYW5fY28uY2MiLAotICAgICAgICAiY28vYnRhX2dhdHRzX2NvLmNjIiwKLSAgICAgICAgLy8gSEFMIGxheWVyCi0gICAgICAgICJzcmMvYmx1ZXRvb3RoLmNjIiwKLSAgICAgICAgLy8gQlRJRiBpbXBsZW1lbnRhdGlvbgotICAgICAgICAic3JjL2J0aWZfYTJkcC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9hMmRwX2NvbnRyb2wuY2MiLAotICAgICAgICAic3JjL2J0aWZfYTJkcF9zaW5rLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2EyZHBfc291cmNlLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2F2LmNjIiwKLSAgICAgICAgInNyYy9idGlmX2JsZV9hZHZlcnRpc2VyLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2JsZV9zY2FubmVyLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2Jxci5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9jb25maWcuY2MiLAotICAgICAgICAic3JjL2J0aWZfY29uZmlnX2NhY2hlLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2NvbmZpZ190cmFuc2NvZGUuY2MiLAotICAgICAgICAic3JjL2J0aWZfY29yZS5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9jc2lzX2NsaWVudC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9kZWJ1Zy5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9kZWJ1Z19idHNub29wLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2RlYnVnX2Nvbm4uY2MiLAotICAgICAgICAic3JjL2J0aWZfZG0uY2MiLAotICAgICAgICAic3JjL2J0aWZfZ2F0dC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9nYXR0X2NsaWVudC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9nYXR0X3NlcnZlci5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9nYXR0X3Rlc3QuY2MiLAotICAgICAgICAic3JjL2J0aWZfZ2F0dF91dGlsLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3ZjLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2hlYXJpbmdfYWlkLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2hmLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2hmX2NsaWVudC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9oaC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9oZC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9sZV9hdWRpby5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9tZXRyaWNzX2xvZ2dpbmcuY2MiLAotICAgICAgICAic3JjL2J0aWZfcGFuLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3Byb2ZpbGVfcXVldWUuY2MiLAotICAgICAgICAic3JjL2J0aWZfcmMuY2MiLAotICAgICAgICAic3JjL2J0aWZfc2RwLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3NkcF9zZXJ2ZXIuY2MiLAotICAgICAgICAic3JjL2J0aWZfc29jay5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9zb2NrX3JmYy5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9zb2NrX2wyY2FwLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3NvY2tfc2NvLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3NvY2tfc2RwLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3NvY2tfdGhyZWFkLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3NvY2tfdXRpbC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9zdG9yYWdlLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3VpZC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl91dGlsLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2tleXN0b3JlLmNjIiwKLSAgICAgICAgInNyYy9zdGFja19tYW5hZ2VyLmNjIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYTJkcEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMSIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYnRpbnl4bWwyIiwKLSAgICAgICAgImxpYnoiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICAgICAgICAgImxpYnN0YXRzbG9nX2J0IiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBzcmNzOiBbInNyYy9idGlmX2F2cmNwX2F1ZGlvX3RyYWNrLmNjIl0sCi0gICAgICAgIH0sCi0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAgICAgICJzcmMvYnRpZl9hdnJjcF9hdWRpb190cmFja19saW51eC5jYyIsCi0gICAgICAgICAgICAgICAgICAgICAic3JjL2J0aWZfbGVhdWRpb19oYWxfdmVyc2lvbl9ob3N0LmNjIiwKLSAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICB3aG9sZV9zdGF0aWNfbGliczogWwotICAgICAgICAiYXZyY3AtdGFyZ2V0LXNlcnZpY2UiLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgICAgICAibGliYnQtYXVkaW8taGFsLWludGVyZmFjZSIsCi0gICAgICAgICJsaWJhdWRpby1hMmRwLWh3LXV0aWxzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidGlmIiwKLSAgICBkZWZhdWx0czogWyJsaWJidGlmX2RlZmF1bHRzIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnRpZi1zdGF0aWMiLAotICAgIGRlZmF1bHRzOiBbImxpYmJ0aWZfZGVmYXVsdHMiXSwKLSAgICBjZmxhZ3M6IFsiLURTVEFUSUNfTElCQkxVRVRPT1RIIl0sCi19Ci0KLS8vIGJ0aWYgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYnRpZiIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IGJ0aWZDb21tb25JbmNsdWRlcywKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2J0aWZfc3RvcmFnZV90ZXN0LmNjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmEyZHBAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjEiLAotICAgICAgICAiYW5kcm9pZC5zeXN0ZW0uc3VzcGVuZC5jb250cm9sLVYxLW5kayIsCi0gICAgICAgICJsaWJiaW5kZXJfbmRrIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1idGEiLAotICAgICAgICAibGliYnRjb3JlIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1zdGFjayIsCi0gICAgICAgICJsaWJidC1zYmMtZGVjb2RlciIsCi0gICAgICAgICJsaWJidC1zYmMtZW5jb2RlciIsCi0gICAgICAgICJsaWJidC11dGlscyIsCi0gICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKLSAgICAgICAgImxpYmc3MjJjb2RlYyIsCi0gICAgICAgICJsaWJsYzNjb2RlYyIsCi0gICAgICAgICJsaWJidGRldmljZSIsCi0gICAgICAgICJsaWJidC1oY2kiLAotICAgICAgICAibGlidWRydi11aXBjIiwKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgXSwKLSAgICB3aG9sZV9zdGF0aWNfbGliczogWwotICAgICAgICAibGliYnRpZiIsCi0gICAgICAgICJsaWJibHVldG9vdGgtZHVtcHN5cyIsCi0gICAgICAgICJsaWJibHVldG9vdGgtZm9yLXRlc3RzIiwKLSAgICBdLAotICAgIGNmbGFnczogWyItREJVSUxEQ0ZHIl0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKLSAgICB9LAotfQotCi0vLyBidGlmIHByb2ZpbGUgcXVldWUgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYnRpZl9wcm9maWxlX3F1ZXVlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGluY2x1ZGVfZGlyczogYnRpZkNvbW1vbkluY2x1ZGVzLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9idGlmX3Byb2ZpbGVfcXVldWUuY2MiLAotICAgICAgICAidGVzdC9idGlmX3Byb2ZpbGVfcXVldWVfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotICAgIGNmbGFnczogWyItREJVSUxEQ0ZHIl0sCi19Ci0KLS8vIGJ0aWYgcmMgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYnRpZl9yYyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgaW5jbHVkZV9kaXJzOiBidGlmQ29tbW9uSW5jbHVkZXMsCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9idGlmX3JjX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYm9zaS1BbGxvY2F0aW9uVGVzdEhhcm5lc3MiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbIi1EQlVJTERDRkciXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAotICAgIH0sCi19Ci0KLS8vIGJ0aWYgY29uZmlnIGNhY2hlIHVuaXQgdGVzdHMgZm9yIHRhcmdldAotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2J0aWZfY29uZmlnX2NhY2hlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLSAgICBpbmNsdWRlX2RpcnM6IGJ0aWZDb21tb25JbmNsdWRlcywKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYnRpZl9jb25maWdfY2FjaGUuY2MiLAotICAgICAgICAidGVzdC9idGlmX2NvbmZpZ19jYWNoZV90ZXN0LmNjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliYysrZnMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbIi1EQlVJTERDRkciXSwKLX0KLQotLy8gYnRpZiBoZiBjbGllbnQgc2VydmljZSB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYnRpZl9oZl9jbGllbnRfc2VydmljZSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IGJ0aWZDb21tb25JbmNsdWRlcywKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2J0aWZfaGZfY2xpZW50X3NlcnZpY2VfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotICAgIGNmbGFnczogWyItREJVSUxEQ0ZHIl0sCi19Ci0KLS8vIEN5Y2xlIHN0YWNrIHRlc3QKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9idGlmX3N0YWNrIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9kbSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvY28iLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZGV2aWNlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9hMmRwIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9hdmR0IiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9idG0iLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAgICAgInN5c3RlbS9idC91ZHJ2L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3ZuZC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9saWJmbXEvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vbGliaHdiaW5kZXIvaW5jbHVkZSIsCi0gICAgICAgIF0sCi0gICAgICBzcmNzOiBbCi0gICAgICAgICAgIjpMaWJCbHVldG9vdGhTb3VyY2VzIiwKLSAgICAgICAgICAiOlRlc3RDb21tb25NYWluSGFuZGxlciIsCi0gICAgICAgICAgIjpUZXN0Q29tbW9uTW9ja0Z1bmN0aW9ucyIsCi0gICAgICAgICAgIjpUZXN0TW9ja0FuZHJvaWRIYXJkd2FyZSIsCi0gICAgICAgICAgIjpCdGFEbVNvdXJjZXMiLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFBZyIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0YUFyIiwKLSAgICAgICAgICAiOlRlc3RNb2NrQnRhQXYiLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFDc2lzIiwKLSAgICAgICAgICAiOlRlc3RNb2NrQnRhR2F0dCIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0YUdyb3VwcyIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0YUhkIiwKLSAgICAgICAgICAiOlRlc3RNb2NrQnRhSGVhcmluZ0FpZCIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0YUhmIiwKLSAgICAgICAgICAiOlRlc3RNb2NrQnRhSGgiLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFKdiIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0YUxlQXVkaW8iLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFMZUF1ZGlvSGFsVmVyaWZpZXIiLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFQYW4iLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFTZHAiLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFTeXMiLAotICAgICAgICAgICI6VGVzdE1vY2tCdGFWYyIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0dSIsCi0gICAgICAgICAgIjpUZXN0TW9ja0J0Y29yZSIsCi0gICAgICAgICAgIjpUZXN0TW9ja0NvbW1vbiIsCi0gICAgICAgICAgIjpUZXN0TW9ja0ZyYW1ld29ya3MiLAotICAgICAgICAgICI6VGVzdE1vY2tIY2kiLAotICAgICAgICAgICI6VGVzdE1vY2tNYWluU2hpbSIsCi0gICAgICAgICAgIjpUZXN0TW9ja1N0YWNrIiwKLSAgICAgICAgICAiOlRlc3RNb2NrU3lzdGVtTGliZm1xIiwKLSAgICAgICAgICAiOlRlc3RNb2NrVWRydiIsCi0gICAgICAgICAgIjpUZXN0TW9ja1V0aWxzIiwKLSAgICAgICAgICAidGVzdC9idGlmX2NvcmVfdGVzdC5jYyIsCi0gICAgICBdLAotICAgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNEYXRhU2NoZW1hX2giLAotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICAgIF0sCi0gICAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYTJkcEAxLjAiLAotICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjAiLAotICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjEiLAotICAgICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAgICJsaWJmbGF0YnVmZmVycy1jcHAiLAotICAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICAgImxpYnRpbnl4bWwyIiwKLSAgICAgIF0sCi0gICAgICB3aG9sZV9zdGF0aWNfbGliczogWwotICAgICAgICAgICJsaWJidGlmIiwKLSAgICAgIF0sCi0gICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgICAgICAgICJsaWJidGRldmljZSIsCi0gICAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgICAibGlib3NpIiwKLSAgICAgIF0sCi0gICAgICBjZmxhZ3M6IFsiLURCVUlMRENGRyJdLAotICAgICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJib3VuZHMiXSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvYnRpZi9CVUlMRC5nbiBiL2J0aWYvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmU1NjIuLjAwMDAwMDAKLS0tIGEvYnRpZi9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc3RhdGljX2xpYnJhcnkoImJ0aWYiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgIyBUT0RPKGFicHMpIC0gRG8gd2UgbmVlZCB0aGlzPwotICAgICIvL2J0L2F1ZGlvX2EyZHBfaHcvc3JjL2F1ZGlvX2EyZHBfaHdfdXRpbHMuY2MiLAotICAgICIvL2J0L2F1ZGlvX2hlYXJpbmdfYWlkX2h3L3NyYy9hdWRpb19oZWFyaW5nX2FpZF9od191dGlscy5jYyIsCi0KLSAgICAjIEFWUkNQIFRhcmdldCBTZXJ2aWNlCi0gICAgImF2cmNwL2F2cmNwX3NlcnZpY2UuY2MiLAotICAgICJjby9idGFfYXZfY28uY2MiLAotCi0gICAgIyBDYWxsb3V0cwotICAgICJjby9idGFfZG1fY28uY2MiLAotICAgICJjby9idGFfZ2F0dHNfY28uY2MiLAotICAgICJjby9idGFfaGhfY28uY2MiLAotICAgICJjby9idGFfcGFuX2NvLmNjIiwKLQotICAgICMgSEFMIGxheWVyCi0gICAgInNyYy9ibHVldG9vdGguY2MiLAotCi0gICAgIyBCVElGIGltcGxlbWVudGF0aW9uCi0gICAgInNyYy9idGlmX2EyZHAuY2MiLAotCi0gICAgInNyYy9idGlmX2EyZHBfY29udHJvbC5jYyIsCi0gICAgInNyYy9idGlmX2EyZHBfc2luay5jYyIsCi0gICAgInNyYy9idGlmX2EyZHBfc291cmNlLmNjIiwKLSAgICAic3JjL2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uY2MiLAotICAgICJzcmMvYnRpZl9hdi5jYyIsCi0KLSAgICAjIFRPRE8oYWJwcykgLSBNb3ZlIHRoaXMgYWJzdHJhY3Rpb24gZWxzZXdoZXJlCi0gICAgIyAic3JjL2J0aWZfYXZyY3BfYXVkaW9fdHJhY2suY2MiLAotICAgICJzcmMvYnRpZl9hdnJjcF9hdWRpb190cmFja19saW51eC5jYyIsCi0gICAgInNyYy9idGlmX2JsZV9hZHZlcnRpc2VyLmNjIiwKLSAgICAic3JjL2J0aWZfYmxlX3NjYW5uZXIuY2MiLAotICAgICJzcmMvYnRpZl9icXIuY2MiLAotICAgICJzcmMvYnRpZl9jc2lzX2NsaWVudC5jYyIsCi0gICAgInNyYy9idGlmX2NvbmZpZy5jYyIsCi0gICAgInNyYy9idGlmX2NvbmZpZ19jYWNoZS5jYyIsCi0gICAgInNyYy9idGlmX2NvbmZpZ190cmFuc2NvZGUuY2MiLAotICAgICJzcmMvYnRpZl9jb3JlLmNjIiwKLSAgICAic3JjL2J0aWZfZGVidWcuY2MiLAotICAgICJzcmMvYnRpZl9kZWJ1Z19idHNub29wLmNjIiwKLSAgICAic3JjL2J0aWZfZGVidWdfY29ubi5jYyIsCi0gICAgInNyYy9idGlmX2RtLmNjIiwKLSAgICAic3JjL2J0aWZfZ2F0dC5jYyIsCi0gICAgInNyYy9idGlmX2dhdHRfY2xpZW50LmNjIiwKLSAgICAic3JjL2J0aWZfZ2F0dF9zZXJ2ZXIuY2MiLAotICAgICJzcmMvYnRpZl9nYXR0X3Rlc3QuY2MiLAotICAgICJzcmMvYnRpZl9nYXR0X3V0aWwuY2MiLAotICAgICJzcmMvYnRpZl9oZC5jYyIsCi0gICAgInNyYy9idGlmX3ZjLmNjIiwKLSAgICAic3JjL2J0aWZfaGVhcmluZ19haWQuY2MiLAotICAgICJzcmMvYnRpZl9oZi5jYyIsCi0gICAgInNyYy9idGlmX2hmX2NsaWVudC5jYyIsCi0gICAgInNyYy9idGlmX2hoLmNjIiwKLSAgICAic3JjL2J0aWZfa2V5c3RvcmUuY2MiLAotICAgICJzcmMvYnRpZl9sZV9hdWRpby5jYyIsCi0gICAgInNyYy9idGlmX21ldHJpY3NfbG9nZ2luZy5jYyIsCi0gICAgInNyYy9idGlmX3Bhbi5jYyIsCi0gICAgInNyYy9idGlmX3Byb2ZpbGVfcXVldWUuY2MiLAotICAgICJzcmMvYnRpZl9yYy5jYyIsCi0gICAgInNyYy9idGlmX3NkcC5jYyIsCi0gICAgInNyYy9idGlmX3NkcF9zZXJ2ZXIuY2MiLAotICAgICJzcmMvYnRpZl9zb2NrLmNjIiwKLSAgICAic3JjL2J0aWZfc29ja19sMmNhcC5jYyIsCi0gICAgInNyYy9idGlmX3NvY2tfcmZjLmNjIiwKLSAgICAic3JjL2J0aWZfc29ja19zY28uY2MiLAotICAgICJzcmMvYnRpZl9zb2NrX3NkcC5jYyIsCi0gICAgInNyYy9idGlmX3NvY2tfdGhyZWFkLmNjIiwKLSAgICAic3JjL2J0aWZfc29ja191dGlsLmNjIiwKLSAgICAic3JjL2J0aWZfc3RvcmFnZS5jYyIsCi0gICAgInNyYy9idGlmX3VpZC5jYyIsCi0gICAgInNyYy9idGlmX3V0aWwuY2MiLAotICAgICJzcmMvc3RhY2tfbWFuYWdlci5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgImluY2x1ZGUiLAotICAgICIvL2J0LyIsCi0gICAgIi8vYnQvYnRhL2RtIiwKLSAgICAiLy9idC9saW51eF9pbmNsdWRlIiwKLSAgICAiLy9idC9hdWRpb19hMmRwX2h3L2luY2x1ZGUiLAotICAgICIvL2J0L2F1ZGlvX2hlYXJpbmdfYWlkX2h3L2luY2x1ZGUiLAotICAgICIvL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAiLy9idC9idGEvc3lzIiwKLSAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgIi8vYnQvZGV2aWNlL2luY2x1ZGUiLAotICAgICIvL2J0L2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlIiwKLSAgICAiLy9idC9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZSIsCi0gICAgIi8vYnQvZ2QiLAotICAgICIvL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAiLy9idC9zdGFjay9hMmRwIiwKLSAgICAiLy9idC9zdGFjay9idG0iLAotICAgICIvL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAiLy9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAiLy9idC91ZHJ2L2luY2x1ZGUiLAotICAgICIvL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICIvL2J0L3ZuZC9pbmNsdWRlIiwKLSAgICAiLy9idC9wcm9maWxlL2F2cmNwIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQ6bGliYnQtcGxhdGZvcm0tcHJvdG9zLWxpdGUiLAotICAgICIvL2J0L2NvbW1vbiIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvcHJvZmlsZS9hdnJjcDpwcm9maWxlX2F2cmNwIiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWwotICAgICIvL2J0OnRhcmdldF9kZWZhdWx0cyIsCi0gICAgIi8vYnQ6ZXh0ZXJuYWxfdGlueXhtbDIiLAotICBdCi19CmRpZmYgLS1naXQgYS9idGlmL2F2cmNwL2F2cmNwX3NlcnZpY2UuY2MgYi9idGlmL2F2cmNwL2F2cmNwX3NlcnZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmNiZWUuLjAwMDAwMDAKLS0tIGEvYnRpZi9hdnJjcC9hdnJjcF9zZXJ2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhdnJjcF9zZXJ2aWNlLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3Rhc2svY2FuY2VsYWJsZV90YXNrX3RyYWNrZXIuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJidGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX2RtLmgiCi0jaW5jbHVkZSAiZGV2aWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotLy8gU3RhdGljIHZhcmlhYmxlcyBhbmQgaW50ZXJmYWNlIGRlZmluaXRpb25zCi1BdnJjcFNlcnZpY2UqIEF2cmNwU2VydmljZTo6aW5zdGFuY2VfID0gbnVsbHB0cjsKLUF2cmNwU2VydmljZTo6U2VydmljZUludGVyZmFjZUltcGwqIEF2cmNwU2VydmljZTo6c2VydmljZV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLQotdm9pZCBkb19pbl9hdnJjcF9qbmkoY29uc3QgYmFzZTo6Q2xvc3VyZSYgdGFzaykgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgdGFzayk7Ci19Ci0KLWNsYXNzIEEyZHBJbnRlcmZhY2VJbXBsIDogcHVibGljIEEyZHBJbnRlcmZhY2UgewotICBSYXdBZGRyZXNzIGFjdGl2ZV9wZWVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gYnRpZl9hdl9zb3VyY2VfYWN0aXZlX3BlZXIoKTsgfQotCi0gIGJvb2wgaXNfcGVlcl9pbl9zaWxlbmNlX21vZGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGJ0aWZfYXZfaXNfcGVlcl9zaWxlbmNlZChwZWVyX2FkZHJlc3MpOwotICB9Ci19IGEyZHBfaW50ZXJmYWNlXzsKLQotY2xhc3MgQXZyY3BJbnRlcmZhY2VJbXBsIDogcHVibGljIEF2cmNwSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHVpbnQxNl90IEdldEF2cmNwVmVyc2lvbigpIHsKLSAgICByZXR1cm4gQVZSQ19HZXRQcm9maWxlVmVyc2lvbigpOwotICB9Ci0KLSAgdWludDE2X3QgQWRkUmVjb3JkKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgY29uc3QgY2hhciogcF9zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX3Byb3ZpZGVyX25hbWUsIHVpbnQxNl90IGNhdGVnb3JpZXMsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlLCBib29sIGJyb3dzZV9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9maWxlX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3Zlcl9hcnRfcHNtKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIEFWUkNfQWRkUmVjb3JkKHNlcnZpY2VfdXVpZCwgcF9zZXJ2aWNlX25hbWUsIHBfcHJvdmlkZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcywgc2RwX2hhbmRsZSwgYnJvd3NlX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uLCBjb3Zlcl9hcnRfcHNtKTsKLSAgfQotCi0gIHVpbnQxNl90IFJlbW92ZVJlY29yZCh1aW50MzJfdCBzZHBfaGFuZGxlKSB7Ci0gICAgcmV0dXJuIEFWUkNfUmVtb3ZlUmVjb3JkKHNkcF9oYW5kbGUpOwotICB9Ci0KLSAgdWludDE2X3QgRmluZFNlcnZpY2UodWludDE2X3Qgc2VydmljZV91dWlkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19TRFBfREJfUEFSQU1TKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19GSU5EX0NCQUNLIHBfY2JhY2spIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gQVZSQ19GaW5kU2VydmljZShzZXJ2aWNlX3V1aWQsIGJkX2FkZHIsIHBfZGIsIHBfY2JhY2spOwotICB9Ci0KLSAgdWludDE2X3QgT3Blbih1aW50OF90KiBwX2hhbmRsZSwgdEFWUkNfQ09OTl9DQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBBVlJDX09wZW4ocF9oYW5kbGUsIHBfY2NiLCBiZF9hZGRyKTsKLSAgfQotCi0gIHVpbnQxNl90IE9wZW5Ccm93c2UodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgY29ubl9yb2xlKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIEFWUkNfT3BlbkJyb3dzZShoYW5kbGUsIGNvbm5fcm9sZSk7Ci0gIH0KLQotICB1aW50MTZfdCBHZXRQZWVyTXR1KHVpbnQ4X3QgaGFuZGxlKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIEFWQ1RfR2V0UGVlck10dShoYW5kbGUpOwotICB9Ci0KLSAgdWludDE2X3QgR2V0QnJvd3NlTXR1KHVpbnQ4X3QgaGFuZGxlKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIEFWQ1RfR2V0QnJvd3NlTXR1KGhhbmRsZSk7Ci0gIH0KLQotICB1aW50MTZfdCBDbG9zZSh1aW50OF90IGhhbmRsZSkgb3ZlcnJpZGUgeyByZXR1cm4gQVZSQ19DbG9zZShoYW5kbGUpOyB9Ci0KLSAgdWludDE2X3QgQ2xvc2VCcm93c2UodWludDhfdCBoYW5kbGUpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gQVZSQ19DbG9zZUJyb3dzZShoYW5kbGUpOwotICB9Ci0KLSAgdWludDE2X3QgTXNnUmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGN0eXBlLAotICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBBVlJDX01zZ1JlcShoYW5kbGUsIGxhYmVsLCBjdHlwZSwgcF9wa3QpOwotICB9Ci19IGF2cmNwX2ludGVyZmFjZV87Ci0KLWNsYXNzIFNkcEludGVyZmFjZUltcGwgOiBwdWJsaWMgU2RwSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIGJvb2wgSW5pdERpc2NvdmVyeURiKHRTRFBfRElTQ09WRVJZX0RCKiBhLCB1aW50MzJfdCBiLCB1aW50MTZfdCBjLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQqIGQsIHVpbnQxNl90IGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBmKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIFNEUF9Jbml0RGlzY292ZXJ5RGIoYSwgYiwgYywgZCwgZSwgZik7Ci0gIH0KLQotICBib29sIFNlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGEsIHRTRFBfRElTQ09WRVJZX0RCKiBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBjKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdChhLCBiLCBjKTsKLSAgfQotCi0gIHRTRFBfRElTQ19SRUMqIEZpbmRTZXJ2aWNlSW5EYih0U0RQX0RJU0NPVkVSWV9EQiogYSwgdWludDE2X3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2RwX2Rpc2NfcmVjKiBjKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIFNEUF9GaW5kU2VydmljZUluRGIoYSwgYiwgYyk7Ci0gIH0KLQotICB0U0RQX0RJU0NfQVRUUiogRmluZEF0dHJpYnV0ZUluUmVjKHRfc2RwX2Rpc2NfcmVjKiBhLCB1aW50MTZfdCBiKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMoYSwgYik7Ci0gIH0KLQotICBib29sIEZpbmRQcm9maWxlVmVyc2lvbkluUmVjKHRfc2RwX2Rpc2NfcmVjKiBhLCB1aW50MTZfdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhhLCBiLCBjKTsKLSAgfQotfSBzZHBfaW50ZXJmYWNlXzsKLQotLy8gQSB3cmFwcGVyIGNsYXNzIGZvciB0aGUgbWVkaWEgY2FsbGJhY2tzIHRoYXQgaGFuZGxlcyB0aHJlYWQKLS8vIHN3aXRjaGluZy9zeW5jaHJvbml6YXRpb24gc28gdGhlIGRldmljZXMgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpdC4KLWNsYXNzIE1lZGlhSW50ZXJmYWNlV3JhcHBlciA6IHB1YmxpYyBNZWRpYUludGVyZmFjZSB7Ci0gcHVibGljOgotICBNZWRpYUludGVyZmFjZVdyYXBwZXIoTWVkaWFJbnRlcmZhY2UqIGNiKSA6IHdyYXBwZWRfKGNiKXt9OwotCi0gIHZvaWQgU2VuZEtleUV2ZW50KHVpbnQ4X3Qga2V5LCBLZXlTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIGRvX2luX2F2cmNwX2puaShiYXNlOjpCaW5kKCZNZWRpYUludGVyZmFjZTo6U2VuZEtleUV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod3JhcHBlZF8pLCBrZXksIHN0YXRlKSk7Ci0gIH0KLQotICB2b2lkIEdldFNvbmdJbmZvKFNvbmdJbmZvQ2FsbGJhY2sgaW5mb19jYikgb3ZlcnJpZGUgewotICAgIGF1dG8gY2JfbGFtYmRhID0gW10oU29uZ0luZm9DYWxsYmFjayBjYiwgU29uZ0luZm8gZGF0YSkgewotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBkYXRhKSk7Ci0gICAgfTsKLQotICAgIGF1dG8gYm91bmRfY2IgPSBiYXNlOjpCaW5kKGNiX2xhbWJkYSwgaW5mb19jYik7Ci0KLSAgICBkb19pbl9hdnJjcF9qbmkoYmFzZTo6QmluZCgmTWVkaWFJbnRlcmZhY2U6OkdldFNvbmdJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod3JhcHBlZF8pLCBib3VuZF9jYikpOwotICB9Ci0KLSAgdm9pZCBHZXRQbGF5U3RhdHVzKFBsYXlTdGF0dXNDYWxsYmFjayBzdGF0dXNfY2IpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGNiX2xhbWJkYSA9IFtdKFBsYXlTdGF0dXNDYWxsYmFjayBjYiwgUGxheVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChjYiwgc3RhdHVzKSk7Ci0gICAgfTsKLQotICAgIGF1dG8gYm91bmRfY2IgPSBiYXNlOjpCaW5kKGNiX2xhbWJkYSwgc3RhdHVzX2NiKTsKLQotICAgIGRvX2luX2F2cmNwX2puaShiYXNlOjpCaW5kKCZNZWRpYUludGVyZmFjZTo6R2V0UGxheVN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHdyYXBwZWRfKSwgYm91bmRfY2IpKTsKLSAgfQotCi0gIHZvaWQgR2V0Tm93UGxheWluZ0xpc3QoTm93UGxheWluZ0NhbGxiYWNrIG5vd19wbGF5aW5nX2NiKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjYl9sYW1iZGEgPSBbXShOb3dQbGF5aW5nQ2FsbGJhY2sgY2IsIHN0ZDo6c3RyaW5nIGN1cnJfbWVkaWFfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gc29uZ19saXN0KSB7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGNiLCBjdXJyX21lZGlhX2lkLCBzdGQ6Om1vdmUoc29uZ19saXN0KSkpOwotICAgIH07Ci0KLSAgICBhdXRvIGJvdW5kX2NiID0gYmFzZTo6QmluZChjYl9sYW1iZGEsIG5vd19wbGF5aW5nX2NiKTsKLQotICAgIGRvX2luX2F2cmNwX2puaShiYXNlOjpCaW5kKCZNZWRpYUludGVyZmFjZTo6R2V0Tm93UGxheWluZ0xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3cmFwcGVkXyksIGJvdW5kX2NiKSk7Ci0gIH0KLQotICB2b2lkIEdldE1lZGlhUGxheWVyTGlzdChNZWRpYUxpc3RDYWxsYmFjayBsaXN0X2NiKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjYl9sYW1iZGEgPSBbXShNZWRpYUxpc3RDYWxsYmFjayBjYiwgdWludDE2X3QgY3Vycl9wbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVBsYXllckluZm8+IHBsYXllcl9saXN0KSB7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGNiLCBjdXJyX3BsYXllciwgc3RkOjptb3ZlKHBsYXllcl9saXN0KSkpOwotICAgIH07Ci0KLSAgICBhdXRvIGJvdW5kX2NiID0gYmFzZTo6QmluZChjYl9sYW1iZGEsIGxpc3RfY2IpOwotCi0gICAgZG9faW5fYXZyY3Bfam5pKGJhc2U6OkJpbmQoJk1lZGlhSW50ZXJmYWNlOjpHZXRNZWRpYVBsYXllckxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3cmFwcGVkXyksIGJvdW5kX2NiKSk7Ci0gIH0KLQotICB2b2lkIEdldEZvbGRlckl0ZW1zKHVpbnQxNl90IHBsYXllcl9pZCwgc3RkOjpzdHJpbmcgbWVkaWFfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgRm9sZGVySXRlbXNDYWxsYmFjayBmb2xkZXJfY2IpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGNiX2xhbWJkYSA9IFtdKEZvbGRlckl0ZW1zQ2FsbGJhY2sgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gaXRlbV9saXN0KSB7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoY2IsIHN0ZDo6bW92ZShpdGVtX2xpc3QpKSk7Ci0gICAgfTsKLQotICAgIGF1dG8gYm91bmRfY2IgPSBiYXNlOjpCaW5kKGNiX2xhbWJkYSwgZm9sZGVyX2NiKTsKLQotICAgIGRvX2luX2F2cmNwX2puaShiYXNlOjpCaW5kKCZNZWRpYUludGVyZmFjZTo6R2V0Rm9sZGVySXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3cmFwcGVkXyksIHBsYXllcl9pZCwgbWVkaWFfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRfY2IpKTsKLSAgfQotCi0gIHZvaWQgU2V0QnJvd3NlZFBsYXllcih1aW50MTZfdCBwbGF5ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXRCcm93c2VkUGxheWVyQ2FsbGJhY2sgYnJvd3NlX2NiKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjYl9sYW1iZGEgPSBbXShTZXRCcm93c2VkUGxheWVyQ2FsbGJhY2sgY2IsIGJvb2wgc3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJvb3RfaWQsIHVpbnQzMl90IG51bV9pdGVtcykgewotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBzdWNjZXNzLCByb290X2lkLCBudW1faXRlbXMpKTsKLSAgICB9OwotCi0gICAgYXV0byBib3VuZF9jYiA9IGJhc2U6OkJpbmQoY2JfbGFtYmRhLCBicm93c2VfY2IpOwotCi0gICAgZG9faW5fYXZyY3Bfam5pKGJhc2U6OkJpbmQoJk1lZGlhSW50ZXJmYWNlOjpTZXRCcm93c2VkUGxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod3JhcHBlZF8pLCBwbGF5ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRfY2IpKTsKLSAgfQotCi0gIHZvaWQgUGxheUl0ZW0odWludDE2X3QgcGxheWVyX2lkLCBib29sIG5vd19wbGF5aW5nLAotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lZGlhX2lkKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fYXZyY3Bfam5pKGJhc2U6OkJpbmQoJk1lZGlhSW50ZXJmYWNlOjpQbGF5SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHdyYXBwZWRfKSwgcGxheWVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd19wbGF5aW5nLCBtZWRpYV9pZCkpOwotICB9Ci0KLSAgdm9pZCBTZXRBY3RpdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIGRvX2luX2F2cmNwX2puaShiYXNlOjpCaW5kKCZNZWRpYUludGVyZmFjZTo6U2V0QWN0aXZlRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod3JhcHBlZF8pLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyVXBkYXRlQ2FsbGJhY2soTWVkaWFDYWxsYmFja3MqIGNhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgd3JhcHBlZF8tPlJlZ2lzdGVyVXBkYXRlQ2FsbGJhY2soY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyVXBkYXRlQ2FsbGJhY2soTWVkaWFDYWxsYmFja3MqIGNhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgd3JhcHBlZF8tPlVucmVnaXN0ZXJVcGRhdGVDYWxsYmFjayhjYWxsYmFjayk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1lZGlhSW50ZXJmYWNlKiB3cmFwcGVkXzsKLX07Ci0KLS8vIEEgd3JhcHBlciBjbGFzcyBmb3IgdGhlIG1lZGlhIGNhbGxiYWNrcyB0aGF0IGhhbmRsZXMgdGhyZWFkCi0vLyBzd2l0Y2hpbmcvc3luY2hyb25pemF0aW9uIHNvIHRoZSBkZXZpY2VzIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQuCi1jbGFzcyBWb2x1bWVJbnRlcmZhY2VXcmFwcGVyIDogcHVibGljIFZvbHVtZUludGVyZmFjZSB7Ci0gcHVibGljOgotICBWb2x1bWVJbnRlcmZhY2VXcmFwcGVyKFZvbHVtZUludGVyZmFjZSogaW50ZXJmYWNlKSA6IHdyYXBwZWRfKGludGVyZmFjZSl7fTsKLQotICB2b2lkIERldmljZUNvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9hdnJjcF9qbmkoCi0gICAgICAgIGJhc2U6OkJpbmQoc3RhdGljX2Nhc3Q8dm9pZCAoVm9sdW1lSW50ZXJmYWNlOjoqKShjb25zdCBSYXdBZGRyZXNzJik+KAotICAgICAgICAgICAgICAgICAgICAgICAmVm9sdW1lSW50ZXJmYWNlOjpEZXZpY2VDb25uZWN0ZWQpLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod3JhcHBlZF8pLCBiZGFkZHIpKTsKLSAgfQotCi0gIHZvaWQgRGV2aWNlQ29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwgVm9sdW1lQ2hhbmdlZENiIGNiKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjYl9sYW1iZGEgPSBbXShWb2x1bWVDaGFuZ2VkQ2IgY2IsIGludDhfdCB2b2x1bWUpIHsKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChjYiwgdm9sdW1lKSk7Ci0gICAgfTsKLQotICAgIGF1dG8gYm91bmRfY2IgPSBiYXNlOjpCaW5kKGNiX2xhbWJkYSwgY2IpOwotCi0gICAgZG9faW5fYXZyY3Bfam5pKGJhc2U6OkJpbmQoc3RhdGljX2Nhc3Q8dm9pZCAoVm9sdW1lSW50ZXJmYWNlOjoqKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYsIFZvbHVtZUNoYW5nZWRDYik+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVm9sdW1lSW50ZXJmYWNlOjpEZXZpY2VDb25uZWN0ZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQod3JhcHBlZF8pLCBiZGFkZHIsIGJvdW5kX2NiKSk7Ci0gIH0KLQotICB2b2lkIERldmljZURpc2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9hdnJjcF9qbmkoYmFzZTo6QmluZCgmVm9sdW1lSW50ZXJmYWNlOjpEZXZpY2VEaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh3cmFwcGVkXyksIGJkYWRkcikpOwotICB9Ci0KLSAgdm9pZCBTZXRWb2x1bWUoaW50OF90IHZvbHVtZSkgb3ZlcnJpZGUgewotICAgIGRvX2luX2F2cmNwX2puaShiYXNlOjpCaW5kKCZWb2x1bWVJbnRlcmZhY2U6OlNldFZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHdyYXBwZWRfKSwgdm9sdW1lKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFZvbHVtZUludGVyZmFjZSogd3JhcHBlZF87Ci19OwotCi12b2lkIEF2cmNwU2VydmljZTo6SW5pdChNZWRpYUludGVyZmFjZSogbWVkaWFfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSW50ZXJmYWNlKiB2b2x1bWVfaW50ZXJmYWNlKSB7Ci0gIExPRyhJTkZPKSA8PCAiQVZSQ1AgVGFyZ2V0IFNlcnZpY2Ugc3RhcnRlZCI7Ci0KLSAgcHJvZmlsZV92ZXJzaW9uID0gYXZyY3BfaW50ZXJmYWNlXy5HZXRBdnJjcFZlcnNpb24oKTsKLQotICB1aW50MTZfdCBzdXBwb3J0ZWRfZmVhdHVyZXMgPSBHZXRTdXBwb3J0ZWRGZWF0dXJlcyhwcm9maWxlX3ZlcnNpb24pOwotICBzZHBfcmVjb3JkX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLQotICBhdnJjcF9pbnRlcmZhY2VfLkFkZFJlY29yZChVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBViBSZW1vdGUgQ29udHJvbCBUYXJnZXQiLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfZmVhdHVyZXMsIHNkcF9yZWNvcmRfaGFuZGxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX3ZlcnNpb24sIDApOwotICBidGFfc3lzX2FkZF91dWlkKFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCk7Ci0KLSAgbWVkaWFfaW50ZXJmYWNlXyA9IG5ldyBNZWRpYUludGVyZmFjZVdyYXBwZXIobWVkaWFfaW50ZXJmYWNlKTsKLSAgbWVkaWFfaW50ZXJmYWNlLT5SZWdpc3RlclVwZGF0ZUNhbGxiYWNrKGluc3RhbmNlXyk7Ci0KLSAgVm9sdW1lSW50ZXJmYWNlV3JhcHBlciogd3JhcHBlZF92b2x1bWVfaW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgaWYgKHZvbHVtZV9pbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIHdyYXBwZWRfdm9sdW1lX2ludGVyZmFjZSA9IG5ldyBWb2x1bWVJbnRlcmZhY2VXcmFwcGVyKHZvbHVtZV9pbnRlcmZhY2UpOwotICB9Ci0KLSAgdm9sdW1lX2ludGVyZmFjZV8gPSB3cmFwcGVkX3ZvbHVtZV9pbnRlcmZhY2U7Ci0KLSAgQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoCi0gICAgICBiYXNlOjpCaW5kKCZBdnJjcFNlcnZpY2U6OkRldmljZUNhbGxiYWNrLCBiYXNlOjpVbnJldGFpbmVkKGluc3RhbmNlXykpLAotICAgICAgJmF2cmNwX2ludGVyZmFjZV8sICZzZHBfaW50ZXJmYWNlXywgd3JhcHBlZF92b2x1bWVfaW50ZXJmYWNlKTsKLSAgY29ubmVjdGlvbl9oYW5kbGVyXyA9IENvbm5lY3Rpb25IYW5kbGVyOjpHZXQoKTsKLX0KLQotdWludDE2X3QgQXZyY3BTZXJ2aWNlOjpHZXRTdXBwb3J0ZWRGZWF0dXJlcyh1aW50MTZfdCBwcm9maWxlX3ZlcnNpb24pIHsKLSAgc3dpdGNoIChwcm9maWxlX3ZlcnNpb24pIHsKLSAgICBjYXNlIEFWUkNfUkVWXzFfNjoKLSAgICAgIHJldHVybiBBVlJDUF9TVVBGX1RHXzFfNjsKLSAgICBjYXNlIEFWUkNfUkVWXzFfNToKLSAgICAgIHJldHVybiBBVlJDUF9TVVBGX1RHXzFfNTsKLSAgICBjYXNlIEFWUkNfUkVWXzFfNDoKLSAgICAgIHJldHVybiBBVlJDUF9TVVBGX1RHXzFfNDsKLSAgICBjYXNlIEFWUkNfUkVWXzFfMzoKLSAgICAgIHJldHVybiBBVlJDUF9TVVBGX1RHXzFfMzsKLSAgfQotICByZXR1cm4gQVZSQ1BfU1VQRl9UR19ERUZBVUxUOwotfQotCi12b2lkIEF2cmNwU2VydmljZTo6Q2xlYW51cCgpIHsKLSAgTE9HKElORk8pIDw8ICJBVlJDUCBUYXJnZXQgU2VydmljZSBzdG9wcGVkIjsKLQotICBhdnJjcF9pbnRlcmZhY2VfLlJlbW92ZVJlY29yZChzZHBfcmVjb3JkX2hhbmRsZSk7Ci0gIGJ0YV9zeXNfcmVtb3ZlX3V1aWQoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUKTsKLSAgc2RwX3JlY29yZF9oYW5kbGUgPSAtMTsKLQotICBjb25uZWN0aW9uX2hhbmRsZXJfLT5DbGVhblVwKCk7Ci0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBpZiAodm9sdW1lX2ludGVyZmFjZV8gIT0gbnVsbHB0cikgewotICAgIGRlbGV0ZSB2b2x1bWVfaW50ZXJmYWNlXzsKLSAgfQotICBkZWxldGUgbWVkaWFfaW50ZXJmYWNlXzsKLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OlJlZ2lzdGVyQmlwU2VydmVyKGludCBwc20pIHsKLSAgTE9HKElORk8pIDw8ICJBVlJDUCBUYXJnZXQgU2VydmljZSBoYXMgcmVnaXN0ZXJlZCBhIEJJUCBPQkVYIHNlcnZlciwgcHNtPSIKLSAgICAgICAgICAgIDw8IHBzbTsKLSAgYXZyY3BfaW50ZXJmYWNlXy5SZW1vdmVSZWNvcmQoc2RwX3JlY29yZF9oYW5kbGUpOwotICB1aW50MTZfdCBzdXBwb3J0ZWRfZmVhdHVyZXMKLSAgICAgID0gR2V0U3VwcG9ydGVkRmVhdHVyZXMocHJvZmlsZV92ZXJzaW9uKSB8IEFWUkNfU1VQRl9UR19QTEFZRVJfQ09WRVJfQVJUOwotICBzZHBfcmVjb3JkX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgYXZyY3BfaW50ZXJmYWNlXy5BZGRSZWNvcmQoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVYgUmVtb3RlIENvbnRyb2wgVGFyZ2V0IiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2ZlYXR1cmVzLCBzZHBfcmVjb3JkX2hhbmRsZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uLCBwc20pOwotfQotCi12b2lkIEF2cmNwU2VydmljZTo6VW5yZWdpc3RlckJpcFNlcnZlcigpIHsKLSAgTE9HKElORk8pIDw8ICJBVlJDUCBUYXJnZXQgU2VydmljZSBoYXMgdW5yZWdpc3RlcmVkIGEgQklQIE9CRVggc2VydmVyIjsKLSAgYXZyY3BfaW50ZXJmYWNlXy5SZW1vdmVSZWNvcmQoc2RwX3JlY29yZF9oYW5kbGUpOwotICB1aW50MTZfdCBzdXBwb3J0ZWRfZmVhdHVyZXMgPSBHZXRTdXBwb3J0ZWRGZWF0dXJlcyhwcm9maWxlX3ZlcnNpb24pOwotICBzZHBfcmVjb3JkX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgYXZyY3BfaW50ZXJmYWNlXy5BZGRSZWNvcmQoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVYgUmVtb3RlIENvbnRyb2wgVGFyZ2V0IiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2ZlYXR1cmVzLCBzZHBfcmVjb3JkX2hhbmRsZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uLCAwKTsKLX0KLQotQXZyY3BTZXJ2aWNlKiBBdnJjcFNlcnZpY2U6OkdldCgpIHsKLSAgQ0hFQ0soaW5zdGFuY2VfKTsKLSAgcmV0dXJuIGluc3RhbmNlXzsKLX0KLQotU2VydmljZUludGVyZmFjZSogQXZyY3BTZXJ2aWNlOjpHZXRTZXJ2aWNlSW50ZXJmYWNlKCkgewotICBpZiAoc2VydmljZV9pbnRlcmZhY2VfID09IG51bGxwdHIpIHsKLSAgICBzZXJ2aWNlX2ludGVyZmFjZV8gPSBuZXcgU2VydmljZUludGVyZmFjZUltcGwoKTsKLSAgfQotCi0gIHJldHVybiBzZXJ2aWNlX2ludGVyZmFjZV87Ci19Ci0KLXZvaWQgQXZyY3BTZXJ2aWNlOjpDb25uZWN0RGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikgewotICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBhZGRyZXNzPSIgPDwgYmRhZGRyLlRvU3RyaW5nKCk7Ci0KLSAgY29ubmVjdGlvbl9oYW5kbGVyXy0+Q29ubmVjdERldmljZShiZGFkZHIpOwotfQotCi12b2lkIEF2cmNwU2VydmljZTo6RGlzY29ubmVjdERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIHsKLSAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogYWRkcmVzcz0iIDw8IGJkYWRkci5Ub1N0cmluZygpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfLT5EaXNjb25uZWN0RGV2aWNlKGJkYWRkcik7Ci19Ci0KLXZvaWQgQXZyY3BTZXJ2aWNlOjpTZXRCaXBDbGllbnRTdGF0dXMoY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCkgewotICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBhZGRyZXNzPSIgPDwgYmRhZGRyLlRvU3RyaW5nKCkKLSAgICAgICAgICAgIDw8ICIsIGNvbm5lY3RlZD0iIDw8IGNvbm5lY3RlZDsKLSAgY29ubmVjdGlvbl9oYW5kbGVyXy0+U2V0QmlwQ2xpZW50U3RhdHVzKGJkYWRkciwgY29ubmVjdGVkKTsKLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OlNlbmRNZWRpYVVwZGF0ZShib29sIHRyYWNrX2NoYW5nZWQsIGJvb2wgcGxheV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBxdWV1ZSkgewotICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiIHRyYWNrX2NoYW5nZWQ9IiA8PCB0cmFja19jaGFuZ2VkCi0gICAgICAgICAgICA8PCAiIDogIgotICAgICAgICAgICAgPDwgIiBwbGF5X3N0YXRlPSIgPDwgcGxheV9zdGF0ZSA8PCAiIDogIgotICAgICAgICAgICAgPDwgIiBxdWV1ZT0iIDw8IHF1ZXVlOwotCi0gIC8vIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICAvLyBkZXZpY2UgdXBkYXRlIGhhcHBlbnMgb24gdGhlIG1haW4gdGhyZWFkLgotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6Ci0gICAgICAgaW5zdGFuY2VfLT5jb25uZWN0aW9uX2hhbmRsZXJfLT5HZXRMaXN0T2ZEZXZpY2VzKCkpIHsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmRGV2aWNlOjpTZW5kTWVkaWFVcGRhdGUsIGRldmljZS5nZXQoKS0+R2V0KCksIHRyYWNrX2NoYW5nZWQsIHBsYXlfc3RhdGUsIHF1ZXVlKSk7Ci0gIH0KLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OlNlbmRGb2xkZXJVcGRhdGUoYm9vbCBhdmFpbGFibGVfcGxheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkcmVzc2VkX3BsYXllcnMsIGJvb2wgdWlkcykgewotICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiIGF2YWlsYWJsZV9wbGF5ZXJzPSIgPDwgYXZhaWxhYmxlX3BsYXllcnMKLSAgICAgICAgICAgIDw8ICIgOiAiCi0gICAgICAgICAgICA8PCAiIGFkZHJlc3NlZF9wbGF5ZXJzPSIgPDwgYWRkcmVzc2VkX3BsYXllcnMgPDwgIiA6ICIKLSAgICAgICAgICAgIDw8ICIgdWlkcz0iIDw8IHVpZHM7Ci0KLSAgLy8gRW5zdXJlIHRoYXQgdGhlIHVwZGF0ZSBpcyBwb3N0ZWQgdG8gdGhlIGNvcnJlY3QgdGhyZWFkCi0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDoKLSAgICAgICBpbnN0YW5jZV8tPmNvbm5lY3Rpb25faGFuZGxlcl8tPkdldExpc3RPZkRldmljZXMoKSkgewotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmRGV2aWNlOjpTZW5kRm9sZGVyVXBkYXRlLCBkZXZpY2UuZ2V0KCktPkdldCgpLCBhdmFpbGFibGVfcGxheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3BsYXllcnMsIHVpZHMpKTsKLSAgfQotfQotCi0vLyBTZW5kIG91dCB0aGUgdHJhY2sgY2hhbmdlZCBpbmZvIHRvIHVwZGF0ZSB0aGUgcGxheWJhY2sgc3RhdGUgZm9yIGVhY2ggZGV2aWNlCi12b2lkIEF2cmNwU2VydmljZTo6U2VuZEFjdGl2ZURldmljZUNoYW5nZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBTZW5kTWVkaWFVcGRhdGUoZmFsc2UsIHRydWUsIGZhbHNlKTsKLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OkRldmljZUNhbGxiYWNrKHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IG5ld19kZXZpY2UpIHsKLSAgaWYgKG5ld19kZXZpY2UgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIC8vIFRPRE8gKGFwYW5pY2tlKTogUGFzcyB0aGUgaW50ZXJmYWNlcyBpbnRvIHRoZSBjb25uZWN0aW9uIGhhbmRsZXIKLSAgLy8gc28gdGhhdCB0aGUgZGV2aWNlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIGFueSBpbnRlcmZhY2VzIHRoZXkgbmVlZC4KLSAgbmV3X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKG1lZGlhX2ludGVyZmFjZV8sICZhMmRwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfaW50ZXJmYWNlXyk7Ci19Ci0KLS8vIFNlcnZpY2UgSW50ZXJmYWNlCi12b2lkIEF2cmNwU2VydmljZTo6U2VydmljZUludGVyZmFjZUltcGw6OkluaXQoCi0gICAgTWVkaWFJbnRlcmZhY2UqIG1lZGlhX2ludGVyZmFjZSwgVm9sdW1lSW50ZXJmYWNlKiB2b2x1bWVfaW50ZXJmYWNlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNlcnZpY2VfaW50ZXJmYWNlX2xvY2tfKTsKLQotICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBibG9jayB1bnRpbCB0aGUgc2VydmljZSBpcyBjb21wbGV0ZWx5IHVwIHNvCi0gIC8vIHRoYXQgaXRzIHBvc3NpYmxlIHRvIGNhbGwgR2V0KCkgb24gdGhlIHNlcnZpY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZwotICAvLyBpbml0IHdpdGhvdXQgaXNzdWVzLgotCi0gIENIRUNLKGluc3RhbmNlXyA9PSBudWxscHRyKTsKLSAgaW5zdGFuY2VfID0gbmV3IEF2cmNwU2VydmljZSgpOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQXZyY3BTZXJ2aWNlOjpJbml0LCBiYXNlOjpVbnJldGFpbmVkKGluc3RhbmNlXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfaW50ZXJmYWNlLCB2b2x1bWVfaW50ZXJmYWNlKSk7Ci19Ci0KLXZvaWQgQXZyY3BTZXJ2aWNlOjpTZXJ2aWNlSW50ZXJmYWNlSW1wbDo6UmVnaXN0ZXJCaXBTZXJ2ZXIoaW50IHBzbSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzZXJ2aWNlX2ludGVyZmFjZV9sb2NrXyk7Ci0gIENIRUNLKGluc3RhbmNlXyAhPSBudWxscHRyKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZBdnJjcFNlcnZpY2U6OlJlZ2lzdGVyQmlwU2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChpbnN0YW5jZV8pLCBwc20pKTsKLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OlNlcnZpY2VJbnRlcmZhY2VJbXBsOjpVbnJlZ2lzdGVyQmlwU2VydmVyKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzZXJ2aWNlX2ludGVyZmFjZV9sb2NrXyk7Ci0gIENIRUNLKGluc3RhbmNlXyAhPSBudWxscHRyKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZBdnJjcFNlcnZpY2U6OlVucmVnaXN0ZXJCaXBTZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGluc3RhbmNlXykpKTsKLX0KLQotYm9vbCBBdnJjcFNlcnZpY2U6OlNlcnZpY2VJbnRlcmZhY2VJbXBsOjpDb25uZWN0RGV2aWNlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzZXJ2aWNlX2ludGVyZmFjZV9sb2NrXyk7Ci0gIENIRUNLKGluc3RhbmNlXyAhPSBudWxscHRyKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZBdnJjcFNlcnZpY2U6OkNvbm5lY3REZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGluc3RhbmNlXyksIGJkYWRkcikpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBdnJjcFNlcnZpY2U6OlNlcnZpY2VJbnRlcmZhY2VJbXBsOjpEaXNjb25uZWN0RGV2aWNlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzZXJ2aWNlX2ludGVyZmFjZV9sb2NrXyk7Ci0gIENIRUNLKGluc3RhbmNlXyAhPSBudWxscHRyKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZBdnJjcFNlcnZpY2U6OkRpc2Nvbm5lY3REZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGluc3RhbmNlXyksIGJkYWRkcikpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OlNlcnZpY2VJbnRlcmZhY2VJbXBsOjpTZXRCaXBDbGllbnRTdGF0dXMoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLCBib29sIGNvbm5lY3RlZCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzZXJ2aWNlX2ludGVyZmFjZV9sb2NrXyk7Ci0gIENIRUNLKGluc3RhbmNlXyAhPSBudWxscHRyKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZBdnJjcFNlcnZpY2U6OlNldEJpcENsaWVudFN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaW5zdGFuY2VfKSwgYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkKSk7Ci19Ci0KLWJvb2wgQXZyY3BTZXJ2aWNlOjpTZXJ2aWNlSW50ZXJmYWNlSW1wbDo6Q2xlYW51cCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc2VydmljZV9pbnRlcmZhY2VfbG9ja18pOwotCi0gIGlmIChpbnN0YW5jZV8gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQXZyY3BTZXJ2aWNlOjpDbGVhbnVwLCBiYXNlOjpPd25lZChpbnN0YW5jZV8pKSk7Ci0KLSAgLy8gU2V0dGluZyBpbnN0YW5jZSB0byBudWxscHRyIGhlcmUgaXMgZmluZSBzaW5jZSBpdCB3aWxsIGJlIGRlbGV0ZWQgb24gdGhlCi0gIC8vIG90aGVyIHRocmVhZC4KLSAgaW5zdGFuY2VfID0gbnVsbHB0cjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBdnJjcFNlcnZpY2U6OkRlYnVnRHVtcChpbnQgZmQpIHsKLSAgaWYgKGluc3RhbmNlXyA9PSBudWxscHRyKSB7Ci0gICAgZHByaW50ZihmZCwgIlxuQVZSQ1AgVGFyZ2V0IFNlcnZpY2Ugbm90IHN0YXJ0ZWRcbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gZGV2aWNlX2xpc3QgPSBpbnN0YW5jZV8tPmNvbm5lY3Rpb25faGFuZGxlcl8tPkdldExpc3RPZkRldmljZXMoKTsKLSAgZHByaW50ZihmZCwgIlxuQVZSQ1AgVGFyZ2V0IE5hdGl2ZSBTZXJ2aWNlOiAlenUgZGV2aWNlc1xuIiwKLSAgICAgICAgICBkZXZpY2VfbGlzdC5zaXplKCkpOwotCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKLSAgewotICAgIFNjb3BlZEluZGVudCBpbmRlbnQoc3RyZWFtKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZV9saXN0KSB7Ci0gICAgICBzdHJlYW0gPDwgKmRldmljZSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZHByaW50ZihmZCwgIiVzIiwgc3RyZWFtLnN0cigpLmNfc3RyKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0aWYvYXZyY3AvYXZyY3Bfc2VydmljZS5oIGIvYnRpZi9hdnJjcC9hdnJjcF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NzYzMWUuLjAwMDAwMDAKLS0tIGEvYnRpZi9hdnJjcC9hdnJjcF9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiaGFyZHdhcmUvYXZyY3AvYXZyY3AuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAicHJvZmlsZS9hdnJjcC9jb25uZWN0aW9uX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJyYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLS8qKgotICogQXZyY3BTZXJ2aWNlIGlzIHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZSBmb3IgQVZSQ1AgVGFyZ2V0LiBJdCBoYW5kbGVzIGFueQotICogcmVxdWlyZWQgdGhyZWFkIHN3aXRjaGluZywgaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbiwgYW5kIHByb3ZpZGVzIGFuIEFQSQotICogZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3RpbmcgZGV2aWNlcy4KLSAqIFRPRE8gKGFwYW5pY2tlKTogSW5zdGVhZCBvZiBwcm92aWRpbmcgYSBzZXJ2aWNlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwKLSAqIGhhdmUgdGhlIEF2cmNwU2VydmljZSBpdHNlbGYgYmUgaXRzIGludGVyZmFjZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGFjY2VzcwotICogaXQgaW5kaXJlY3RseS4KLSAqLwotY2xhc3MgQXZyY3BTZXJ2aWNlIDogcHVibGljIE1lZGlhQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBHZXRzIGEgaGFuZGxlIHRvIHRoZSBBdnJjcFNlcnZpY2UKLSAgICoKLSAgICogQ3VycmVudGx5IHVzZWQgYnkgQTJEUCB0byB0ZWxsIEFWUkNQIHRvIGluaXRpYXRlIGEgY29ubmVjdGlvbiB0byB0aGUKLSAgICogcmVtb3RlIGRldmljZS4KLSAgICovCi0gIHN0YXRpYyBBdnJjcFNlcnZpY2UqIEdldCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGludGVyZmFjZSB0byBjb250cm9sIHRoaXMgc2VydmljZS4gVGhlIEF2cmNwOjpTZXJ2aWNlSW50ZXJmYWNlCi0gICAqIGhhbmRsZXMgYWxsIHRocmVhZCBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUgY2FsbGVyIHRocmVhZCBhbmQgdGhlIHRocmVhZCB0aGUKLSAgICogc2VydmljZSBydW5zIG9uLCB0aGF0IHdheSB3aG9ldmVyIHVzZXMgdGhlIGludGVyZmFjZSBkb2Vzbid0IG5lZWQgdG8gYmUKLSAgICogYXdhcmUgd2hpY2ggdGhyZWFkIHRoZSBzZXJ2aWNlIHJ1bnMgb24uCi0gICAqLwotICBzdGF0aWMgU2VydmljZUludGVyZmFjZSogR2V0U2VydmljZUludGVyZmFjZSgpOwotCi0gIHZvaWQgSW5pdChNZWRpYUludGVyZmFjZSogbWVkaWFfaW50ZXJmYWNlLCBWb2x1bWVJbnRlcmZhY2UqIHZvbHVtZV9pbnRlcmZhY2UpOwotICB2b2lkIENsZWFudXAoKTsKLQotICB2b2lkIFJlZ2lzdGVyQmlwU2VydmVyKGludCBwc20pOwotICB2b2lkIFVucmVnaXN0ZXJCaXBTZXJ2ZXIoKTsKLQotICB2b2lkIENvbm5lY3REZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyKTsKLSAgdm9pZCBEaXNjb25uZWN0RGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcik7Ci0KLSAgdm9pZCBTZXRCaXBDbGllbnRTdGF0dXMoY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLCBib29sIGNvbm5lY3RlZCk7Ci0KLSAgLy8gRnVuY3Rpb25zIGluaGVyaXRlZCBmcm9tIE1lZGlhQ2FsbGJhY2tzIGluIG9yZGVyIHRvIHJlY2VpdmUgdXBkYXRlcwotICB2b2lkIFNlbmRNZWRpYVVwZGF0ZShib29sIHRyYWNrX2NoYW5nZWQsIGJvb2wgcGxheV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBxdWV1ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2VuZEZvbGRlclVwZGF0ZShib29sIGF2YWlsYWJsZV9wbGF5ZXJzLCBib29sIGFkZHJlc3NlZF9wbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHF1ZXVlKSBvdmVycmlkZTsKLSAgdm9pZCBTZW5kQWN0aXZlRGV2aWNlQ2hhbmdlZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZTsKLQotICBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBTZXJ2aWNlSW50ZXJmYWNlIHsKLSAgIHB1YmxpYzoKLSAgICB2b2lkIEluaXQoTWVkaWFJbnRlcmZhY2UqIG1lZGlhX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgVm9sdW1lSW50ZXJmYWNlKiB2b2x1bWVfaW50ZXJmYWNlKSBvdmVycmlkZTsKLSAgICB2b2lkIFJlZ2lzdGVyQmlwU2VydmVyKGludCBwc20pIG92ZXJyaWRlOwotICAgIHZvaWQgVW5yZWdpc3RlckJpcFNlcnZlcigpIG92ZXJyaWRlOwotICAgIGJvb2wgQ29ubmVjdERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIG92ZXJyaWRlOwotICAgIGJvb2wgRGlzY29ubmVjdERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIG92ZXJyaWRlOwotICAgIHZvaWQgU2V0QmlwQ2xpZW50U3RhdHVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOwotICAgIGJvb2wgQ2xlYW51cCgpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIHN0ZDo6bXV0ZXggc2VydmljZV9pbnRlcmZhY2VfbG9ja187Ci0gIH07Ci0KLSAgc3RhdGljIHZvaWQgRGVidWdEdW1wKGludCBmZCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgRGV2aWNlQ2FsbGJhY2soc3RkOjpzaGFyZWRfcHRyPERldmljZT4gZGV2aWNlKTsKLSAgdWludDE2X3QgR2V0U3VwcG9ydGVkRmVhdHVyZXModWludDE2X3QgcHJvZmlsZV92ZXJzaW9uKTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBBdnJjcFNlcnZpY2UqIGluc3RhbmNlXzsKLSAgc3RhdGljIFNlcnZpY2VJbnRlcmZhY2VJbXBsKiBzZXJ2aWNlX2ludGVyZmFjZV87Ci0KLSAgdWludDMyX3Qgc2RwX3JlY29yZF9oYW5kbGUgPSAtMTsKLSAgdWludDE2X3QgcHJvZmlsZV92ZXJzaW9uID0gLTE7Ci0KLSAgTWVkaWFJbnRlcmZhY2UqIG1lZGlhX2ludGVyZmFjZV8gPSBudWxscHRyOwotICBWb2x1bWVJbnRlcmZhY2UqIHZvbHVtZV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLQotICBDb25uZWN0aW9uSGFuZGxlciogY29ubmVjdGlvbl9oYW5kbGVyXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1pbmxpbmUgYm9vbCBpc19uZXdfYXZyY3BfZW5hYmxlZCgpIHsKLSAgcmV0dXJuIG9zaV9wcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguZW5hYmxlbmV3YXZyY3AiLCB0cnVlKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvY28vYnRhX2F2X2NvLmNjIGIvYnRpZi9jby9idGFfYXZfY28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDA2ZjEuLjAwMDAwMDAKLS0tIGEvYnRpZi9jby9idGFfYXZfY28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgYWR2YW5jZWQgYXVkaW8vdmlkZW8gY2FsbC1vdXQgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZm9yCi0gKiAgQlRJRi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hdl9jaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2EyZHBfc291cmNlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXYuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X2F2LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2EyZHBfZXJyb3JfY29kZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2ZHRfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLy8gTWFjcm8gdG8gcmV0cmlldmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFycmF5Ci0jZGVmaW5lIEJUQV9BVl9DT19OVU1fRUxFTUVOVFMoX19hKSAoc2l6ZW9mKF9fYSkgLyBzaXplb2YoKF9fYSlbMF0pKQotCi0vLyBNYWNybyB0byBjb252ZXJ0IEJUQSBBViBhdWRpbyBoYW5kbGUgdG8gaW5kZXggYW5kIHZpY2UgdmVyc2EKLSNkZWZpbmUgQlRBX0FWX0NPX0FVRElPX0hBTkRMRV9UT19JTkRFWChidGFfYXZfaGFuZGxlKSBcCi0gICgoKGJ0YV9hdl9oYW5kbGUpICYgKH5CVEFfQVZfQ0hOTF9NU0spKSAtIDEpCi0jZGVmaW5lIEJUQV9BVl9DT19BVURJT19JTkRFWF9UT19IQU5ETEUoaW5kZXgpIFwKLSAgKCgoaW5kZXgpICsgMSkgfCBCVEFfQVZfQ0hOTF9BVURJTykKLQotY2xhc3MgQnRhQXZDb1NlcCB7Ci0gcHVibGljOgotICBCdGFBdkNvU2VwKCkKLSAgICAgIDogc2VwX2luZm9faWR4KDApLCBzZWlkKDApLCBjb2RlY19jYXBze30sIG51bV9wcm90ZWN0KDApLCBwcm90ZWN0X2luZm97fSB7Ci0gICAgUmVzZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgc3RhdGUuCi0gICAqLwotICB2b2lkIFJlc2V0KCkgewotICAgIHNlcF9pbmZvX2lkeCA9IDA7Ci0gICAgc2VpZCA9IDA7Ci0gICAgbWVtc2V0KGNvZGVjX2NhcHMsIDAsIHNpemVvZihjb2RlY19jYXBzKSk7Ci0gICAgbnVtX3Byb3RlY3QgPSAwOwotICAgIG1lbXNldChwcm90ZWN0X2luZm8sIDAsIHNpemVvZihwcm90ZWN0X2luZm8pKTsKLSAgfQotCi0gIHVpbnQ4X3Qgc2VwX2luZm9faWR4OyAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWwgU0VQIGluZGV4IChpbiBCVEEgdGFibGVzKQotICB1aW50OF90IHNlaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlZXIgU0VQIGluZGV4IChpbiBwZWVyIHRhYmxlcykKLSAgdWludDhfdCBjb2RlY19jYXBzW0FWRFRfQ09ERUNfU0laRV07ICAgICAvLyBQZWVyIFNFUCBjb2RlYyBjYXBhYmlsaXRpZXMKLSAgdWludDhfdCBudW1fcHJvdGVjdDsgICAgICAgICAgICAgICAgICAgICAvLyBQZWVyIFNFUCBudW1iZXIgb2YgQ1AgZWxlbWVudHMKLSAgdWludDhfdCBwcm90ZWN0X2luZm9bQVZEVF9DUF9JTkZPX0xFTl07ICAvLyBQZWVyIFNFUCBjb250ZW50IHByb3RlY3Rpb24gaW5mbwotfTsKLQotY2xhc3MgQnRhQXZDb1BlZXIgewotIHB1YmxpYzoKLSAgQnRhQXZDb1BlZXIoKQotICAgICAgOiBhZGRyKFJhd0FkZHJlc3M6OmtFbXB0eSksCi0gICAgICAgIG51bV9zaW5rcygwKSwKLSAgICAgICAgbnVtX3NvdXJjZXMoMCksCi0gICAgICAgIG51bV9zZXBzKDApLAotICAgICAgICBudW1fcnhfc2lua3MoMCksCi0gICAgICAgIG51bV9yeF9zb3VyY2VzKDApLAotICAgICAgICBudW1fc3VwX3NpbmtzKDApLAotICAgICAgICBudW1fc3VwX3NvdXJjZXMoMCksCi0gICAgICAgIHBfc2luayhudWxscHRyKSwKLSAgICAgICAgcF9zb3VyY2UobnVsbHB0ciksCi0gICAgICAgIGNvZGVjX2NvbmZpZ3t9LAotICAgICAgICBhY2NlcHRvcihmYWxzZSksCi0gICAgICAgIHJlY29uZmlnX25lZWRlZChmYWxzZSksCi0gICAgICAgIG9wZW5lZChmYWxzZSksCi0gICAgICAgIG10dSgwKSwKLSAgICAgICAgdXVpZF90b19jb25uZWN0KDApLAotICAgICAgICBidGFfYXZfaGFuZGxlXygwKSwKLSAgICAgICAgY29kZWNzXyhudWxscHRyKSwKLSAgICAgICAgY29udGVudF9wcm90ZWN0X2FjdGl2ZV8oZmFsc2UpIHsKLSAgICBSZXNldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGNvZGVjX3ByaW9yaXRpZXMgdGhlIGNvZGVjIHByaW9yaXRpZXMgdG8gdXNlIGZvciB0aGUgaW5pdGlhbGl6YXRpb24KLSAgICovCi0gIHZvaWQgSW5pdChjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzKTsKLQotICAvKioKLSAgICogUmVzZXQgdGhlIHN0YXRlLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byB1c2UKLSAgICovCi0gIHZvaWQgUmVzZXQodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIEJUQSBBViBoYW5kbGUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIEJUQSBBViBoYW5kbGUKLSAgICovCi0gIHRCVEFfQVZfSE5ETCBCdGFBdkhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGJ0YV9hdl9oYW5kbGVfOyB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgQTJEUCBjb2RlY3MuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIEEyRFAgY29kZWNzCi0gICAqLwotICBBMmRwQ29kZWNzKiBHZXRDb2RlY3MoKSB7IHJldHVybiBjb2RlY3NfOyB9Ci0KLSAgYm9vbCBDb250ZW50UHJvdGVjdEFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGNvbnRlbnRfcHJvdGVjdF9hY3RpdmVfOyB9Ci0gIHZvaWQgU2V0Q29udGVudFByb3RlY3RBY3RpdmUoYm9vbCBjcF9hY3RpdmUpIHsKLSAgICBjb250ZW50X3Byb3RlY3RfYWN0aXZlXyA9IGNwX2FjdGl2ZTsKLSAgfQotCi0gIFJhd0FkZHJlc3MgYWRkcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlZXIgYWRkcmVzcwotICBCdGFBdkNvU2VwIHNpbmtzW0JUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVhdOyAgICAvLyBTdXBwb3J0ZWQgc2lua3MKLSAgQnRhQXZDb1NlcCBzb3VyY2VzW0JUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVhdOyAgLy8gU3VwcG9ydGVkIHNvdXJjZXMKLSAgdWludDhfdCBudW1fc2lua3M7ICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiBzaW5rcyBhdCBwZWVyCi0gIHVpbnQ4X3QgbnVtX3NvdXJjZXM7ICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2Ygc291cmNlcyBhdCBwZWVyCi0gIHVpbnQ4X3QgbnVtX3NlcHM7ICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgU0VQcyBhdCBwZWVyCi0gIHVpbnQ4X3QgbnVtX3J4X3NpbmtzOyAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcmVjZWl2ZWQgc2lua3MKLSAgdWludDhfdCBudW1fcnhfc291cmNlczsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiByZWNlaXZlZCBzb3VyY2VzCi0gIHVpbnQ4X3QgbnVtX3N1cF9zaW5rczsgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNpbmtzCi0gIHVpbnQ4X3QgbnVtX3N1cF9zb3VyY2VzOyAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNvdXJjZXMKLSAgY29uc3QgQnRhQXZDb1NlcCogcF9zaW5rOyAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSBzZWxlY3RlZCBzaW5rCi0gIGNvbnN0IEJ0YUF2Q29TZXAqIHBfc291cmNlOyAgICAgICAgICAgICAvLyBDdXJyZW50bHkgc2VsZWN0ZWQgc291cmNlCi0gIHVpbnQ4X3QgY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07ICAvLyBDdXJyZW50IGNvZGVjIGNvbmZpZ3VyYXRpb24KLSAgYm9vbCBhY2NlcHRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRydWUgaWYgYWNjZXB0b3IKLSAgYm9vbCByZWNvbmZpZ19uZWVkZWQ7ICAgICAgICAgICAgICAgICAgIC8vIFRydWUgaWYgcmVjb25maWd1cmF0aW9uIGlzIG5lZWRlZAotICBib29sIG9wZW5lZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZiBvcGVuZWQKLSAgdWludDE2X3QgbXR1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gVHJhbnNtaXQgVW5pdCBzaXplCi0gIHVpbnQxNl90IHV1aWRfdG9fY29ubmVjdDsgICAgICAgICAgICAgICAvLyBVVUlEIG9mIHBlZXIgZGV2aWNlCi0KLSBwcml2YXRlOgotICB0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZV87ICAgLy8gQlRBIEFWIGhhbmRsZSB0byB1c2UKLSAgQTJkcENvZGVjcyogY29kZWNzXzsgICAgICAgICAgIC8vIExvY2FsbHkgc3VwcG9ydGVkIGNvZGVjcwotICBib29sIGNvbnRlbnRfcHJvdGVjdF9hY3RpdmVfOyAgLy8gVHJ1ZSBpZiBDb250ZW50IFByb3RlY3QgaXMgYWN0aXZlCi19OwotCi1jbGFzcyBCdGFBdkNvIHsKLSBwdWJsaWM6Ci0gIEJ0YUF2Q28oYm9vbCBjb250ZW50X3Byb3RlY3RfZW5hYmxlZCkKLSAgICAgIDogYWN0aXZlX3BlZXJfKG51bGxwdHIpLAotICAgICAgICBjb2RlY19jb25maWdfe30sCi0gICAgICAgIGNvbnRlbnRfcHJvdGVjdF9lbmFibGVkXyhjb250ZW50X3Byb3RlY3RfZW5hYmxlZCksCi0gICAgICAgIGNvbnRlbnRfcHJvdGVjdF9mbGFnXygwKSB7Ci0gICAgUmVzZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGNvZGVjX3ByaW9yaXRpZXMgdGhlIGNvZGVjIHByaW9yaXRpZXMgdG8gdXNlIGZvciB0aGUgaW5pdGlhbGl6YXRpb24KLSAgICovCi0gIHZvaWQgSW5pdChjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzKTsKLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgYSBjb2RlYyBpcyBzdXBwb3J0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjb2RlY19pbmRleCB0aGUgaW5kZXggb2YgdGhlIGNvZGVjIHRvIGNoZWNrCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZWMgaXMgc3VwcG9ydGVkLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgSXNTdXBwb3J0ZWRDb2RlYyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGZvciB0aGUgYWN0aXZlIHBlZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29kZWMgY29uZmlndXJhdGlvbiBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGxwdHIKLSAgICovCi0gIEEyZHBDb2RlY0NvbmZpZyogR2V0QWN0aXZlUGVlckN1cnJlbnRDb2RlYygpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgYSBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHJldHVybiB0aGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbHB0cgotICAgKi8KLSAgQTJkcENvZGVjQ29uZmlnKiBHZXRQZWVyQ3VycmVudENvZGVjKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIHBlZXIgVVVJRCBmb3IgYSBnaXZlbiBCVEEgQVYgaGFuZGxlLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byB1c2UKLSAgICogQHJldHVybiB0aGUgcGVlciBVVUlEIGlmIGZvdW5kLCBvdGhlcndpc2UgMAotICAgKi8KLSAgdWludDE2X3QgRmluZFBlZXJVdWlkKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlKTsKLQotICAvKioKLSAgICogUHJvY2VzcyB0aGUgQVZEVFAgZGlzY292ZXJ5IHJlc3VsdDogbnVtYmVyIG9mIFN0cmVhbSBFbmQgUG9pbnRzIChTRVApCi0gICAqIGZvdW5kIGR1cmluZyB0aGUgQVZEVFAgc3RyZWFtIGRpc2NvdmVyeSBwcm9jZXNzLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIG51bV9zZXBzIHRoZSBudW1iZXIgb2YgZGlzY292ZXJlZCBTRVBzCi0gICAqIEBwYXJhbSBudW1fc2lua3MgbnVtYmVyIG9mIGRpc2NvdmVyZWQgU2luayBTRVBzCi0gICAqIEBwYXJhbSBudW1fc291cmNlcyBudW1iZXIgb2YgZGlzY292ZXJlZCBTb3VyY2UgU0VQcwotICAgKiBAcGFyYW0gdXVpZF9sb2NhbCBsb2NhbCBVVUlECi0gICAqLwotICB2b2lkIFByb2Nlc3NEaXNjb3ZlcnlSZXN1bHQodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQ4X3QgbnVtX3NlcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zaW5rcywgdWludDhfdCBudW1fc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWRfbG9jYWwpOwotCi0gIC8qKgotICAgKiBQcm9jZXNzIHJldHJpZXZlZCBjb2RlYyBjb25maWd1cmF0aW9uIGFuZCBjb250ZW50IHByb3RlY3Rpb24gZnJvbQotICAgKiBQZWVyIFNpbmsgU0VQLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIHBfY29kZWNfaW5mbyB0aGUgcGVlciBzaW5rIGNhcGFiaWxpdHkgZmlsbGVkLWluIGJ5IHRoZSBjYWxsZXIuCi0gICAqIE9uIHN1Y2Nlc3MsIGl0IHdpbGwgY29udGFpbiB0aGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGZvciB0aGUgcGVlci4KLSAgICogQHBhcmFtIHBfc2VwX2luZm9faWR4IHRoZSBwZWVyIFNFUCBpbmRleCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGVlcgotICAgKiBzaW5rIGNhcGFiaWxpdHkgZmlsbGVkLWluIGJ5IHRoZSBjYWxsZXIuIE9uIHN1Y2Nlc3MsIGl0IHdpbGwgY29udGFpbgotICAgKiB0aGUgU0VQIGluZGV4IGZvciB0aGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGZvciB0aGUgcGVlci4KLSAgICogQHBhcmFtIHNlaWQgdGhlIHBlZXIgU0VQIGluZGV4IGluIHBlZXIgdGFibGVzCi0gICAqIEBwYXJhbSBwX251bV9wcm90ZWN0IHRoZSBwZWVyIFNFUCBudW1iZXIgb2YgY29udGVudCBwcm90ZWN0aW9uIGVsZW1lbnRzCi0gICAqIGZpbGxlZC1pbiBieSB0aGUgY2FsbGVyLiBPbiBzdWNjZXNzLCBpdCB3aWxsIGNvbnRhaW4gdGhlIFNFUCBudW1iZXIgb2YKLSAgICogY29udGVudCBwcm90ZWN0aW9uIGVsZW1lbnRzIGZvciB0aGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGZvciB0aGUKLSAgICogcGVlci4KLSAgICogQHBhcmFtIHBfcHJvdGVjdF9pbmZvIHRoZSBwZWVyIFNFUCBjb250ZW50IHByb3RlY3Rpb24gaW5mbyBmaWxsZWQtaW4gYnkKLSAgICogdGhlIGNhbGxlci4gT24gc3VjY2VzcywgaXQgd2lsbCBjb250YWluIHRoZSBTRVAgY29udGVudCBwcm90ZWN0aW9uIGluZm8KLSAgICogZm9yIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwZWVyLgotICAgKiBAcmV0dXJuIEEyRFBfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgQTJEUF9GQUlMCi0gICAqLwotICB0QTJEUF9TVEFUVVMgUHJvY2Vzc1NvdXJjZUdldENvbmZpZyh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2VwX2luZm9faWR4LCB1aW50OF90IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvKTsKLQotICAvKioKLSAgICogUHJvY2VzcyByZXRyaWV2ZWQgY29kZWMgY29uZmlndXJhdGlvbiBhbmQgY29udGVudCBwcm90ZWN0aW9uIGZyb20KLSAgICogUGVlciBTb3VyY2UgU0VQLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIHBfY29kZWNfaW5mbyB0aGUgcGVlciBzb3VyY2UgY2FwYWJpbGl0eSBmaWxsZWQtaW4gYnkgdGhlIGNhbGxlci4KLSAgICogT24gc3VjY2VzcywgaXQgd2lsbCBjb250YWluIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwZWVyLgotICAgKiBAcGFyYW0gcF9zZXBfaW5mb19pZHggdGhlIHBlZXIgU0VQIGluZGV4IGZvciB0aGUgY29ycmVzcG9uZGluZyBwZWVyCi0gICAqIHNvdXJjZSBjYXBhYmlsaXR5IGZpbGxlZC1pbiBieSB0aGUgY2FsbGVyLiBPbiBzdWNjZXNzLCBpdCB3aWxsIGNvbnRhaW4KLSAgICogdGhlIFNFUCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHBlZXIuCi0gICAqIEBwYXJhbSBzZWlkIHRoZSBwZWVyIFNFUCBpbmRleCBpbiBwZWVyIHRhYmxlcwotICAgKiBAcGFyYW0gcF9udW1fcHJvdGVjdCB0aGUgcGVlciBTRVAgbnVtYmVyIG9mIGNvbnRlbnQgcHJvdGVjdGlvbiBlbGVtZW50cwotICAgKiBmaWxsZWQtaW4gYnkgdGhlIGNhbGxlci4gT24gc3VjY2VzcywgaXQgd2lsbCBjb250YWluIHRoZSBTRVAgbnVtYmVyIG9mCi0gICAqIGNvbnRlbnQgcHJvdGVjdGlvbiBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgdGhlCi0gICAqIHBlZXIuCi0gICAqIEBwYXJhbSBwX3Byb3RlY3RfaW5mbyB0aGUgcGVlciBTRVAgY29udGVudCBwcm90ZWN0aW9uIGluZm8gZmlsbGVkLWluIGJ5Ci0gICAqIHRoZSBjYWxsZXIuIE9uIHN1Y2Nlc3MsIGl0IHdpbGwgY29udGFpbiB0aGUgU0VQIGNvbnRlbnQgcHJvdGVjdGlvbiBpbmZvCi0gICAqIGZvciB0aGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGZvciB0aGUgcGVlci4KLSAgICogQHJldHVybiBBMkRQX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIEEyRFBfRkFJTAotICAgKi8KLSAgdEEyRFBfU1RBVFVTIFByb2Nlc3NTaW5rR2V0Q29uZmlnKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zZXBfaW5mb19pZHgsIHVpbnQ4X3Qgc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Byb3RlY3RfaW5mbyk7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgQVZEVFAgU2V0IENvbmZpZyB0byBzZXQgdGhlIGNvZGVjIGFuZCBjb250ZW50IHByb3RlY3Rpb24KLSAgICogY29uZmlndXJhdGlvbiBvZiB0aGUgYXVkaW8gc3RyZWFtLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIHBfY29kZWNfaW5mbyB0aGUgY29kZWMgY29uZmlndXJhdGlvbiB0byBzZXQKLSAgICogQHBhcmFtIHNlaWQgc3RyZWFtIGVuZHBvaW50IElEIG9mIHN0cmVhbSBpbml0aWF0aW5nIHRoZSBvcGVyYXRpb24KLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzCi0gICAqIEBwYXJhbSBudW1fcHJvdGVjdCB0aGUgcGVlciBTRVAgbnVtYmVyIG9mIGNvbnRlbnQgcHJvdGVjdGlvbiBlbGVtZW50cwotICAgKiBAcGFyYW0gcF9wcm90ZWN0X2luZm8gdGhlIHBlZXIgU0VQIGNvbm50ZW50IHByb3RlY3Rpb24gaW5mbwotICAgKiBAcGFyYW0gdF9sb2NhbF9zZXAgdGhlIGxvY2FsIFNFUDogQVZEVF9UU0VQX1NSQyBvciBBVkRUX1RTRVBfU05LCi0gICAqIEBwYXJhbSBhdmR0X2hhbmRsZSB0aGUgQVZEVFAgaGFuZGxlCi0gICAqLwotICB2b2lkIFByb2Nlc3NTZXRDb25maWcodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIHVpbnQ4X3Qgc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3Byb3RlY3QsIGNvbnN0IHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0X2xvY2FsX3NlcCwgdWludDhfdCBhdmR0X2hhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgQVZEVFAgT3BlbiB3aGVuIHRoZSBzdHJlYW0gY29ubmVjdGlvbiBpcyBvcGVuZWQuCi0gICAqCi0gICAqIEBwYXJhbSBidGFfYXZfaGFuZGxlIHRoZSBCVEEgQVYgaGFuZGxlIHRvIGlkZW50aWZ5IHRoZSBwZWVyCi0gICAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgYWRkcmVzcwotICAgKiBAcGFyYW0gbXR1IHRoZSBNVFUgb2YgdGhlIGNvbm5lY3Rpb24KLSAgICovCi0gIHZvaWQgUHJvY2Vzc09wZW4odEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtdHUpOwotCi0gIC8qKgotICAgKiBQcm9jZXNzIEFWRFRQIENsb3NlIHdoZW4gdGhlIHN0cmVhbSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAgICoKLSAgICogQHBhcmFtIGJ0YV9hdl9oYW5kbGUgdGhlIEJUQSBBViBoYW5kbGUgdG8gaWRlbnRpZnkgdGhlIHBlZXIKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzCi0gICAqLwotICB2b2lkIFByb2Nlc3NDbG9zZSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotICAvKioKLSAgICogUHJvY2VzcyBBVkRUUCBTdGFydCB3aGVuIHRoZSBhdWRpbyBkYXRhIHN0cmVhbWluZyBpcyBzdGFydGVkLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIHBfY29kZWNfaW5mbyB0aGUgY29kZWMgY29uZmlndXJhdGlvbgotICAgKiBAcGFyYW0gcF9ub19ydHBfaGVhZGVyIG9uIHJldHVybiwgc2V0IHRvIHRydWUgaWYgdGhlIGF1ZGlvIGRhdGEgcGFja2V0cwotICAgKiBzaG91bGQgbm90IGNvbnRhaW4gUlRQIGhlYWRlcgotICAgKi8KLSAgdm9pZCBQcm9jZXNzU3RhcnQodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBib29sKiBwX25vX3J0cF9oZWFkZXIpOwotCi0gIC8qKgotICAgKiBQcm9jZXNzIEFWRFRQIFN0b3Agd2hlbiB0aGUgYXVkaW8gZGF0YSBzdHJlYW1pbmcgaXMgc3RvcHBlZC4KLSAgICoKLSAgICogQHBhcmFtIGJ0YV9hdl9oYW5kbGUgdGhlIEJUQSBBViBoYW5kbGUgdG8gaWRlbnRpZnkgdGhlIHBlZXIKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzCi0gICAqLwotICB2b2lkIFByb2Nlc3NTdG9wKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5leHQgZW5jb2RlZCBhdWRpbyBkYXRhIHBhY2tldCB0byBzZW5kLgotICAgKgotICAgKiBAcGFyYW0gcF9jb2RlY19pbmZvIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uCi0gICAqIEBwYXJhbSBwX3RpbWVzdGFtcCBvbiByZXR1cm4sIHNldCB0byB0aGUgdGltZXN0YW1wIG9mIHRoZSBkYXRhIHBhY2tldAotICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVuY29kZWQgZGF0YSBwYWNrZXQgb3IgbnVsbHB0ciBpZiBubyBlbmNvZGVkIGRhdGEgdG8gc2VuZAotICAgKi8KLSAgQlRfSERSKiBHZXROZXh0U291cmNlRGF0YVBhY2tldChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKTsKLQotICAvKioKLSAgICogQW4gYXVkaW8gcGFja2V0IGhhcyBiZWVuIGRyb3BwZWQuCi0gICAqIFRoaXMgc2lnbmFsIGNhbiBiZSB1c2VkIGJ5IHRoZSBlbmNvZGVyIHRvIHJlZHVjZSB0aGUgZW5jb2RlciBiaXQgcmF0ZQotICAgKiBzZXR0aW5nLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICovCi0gIHZvaWQgRGF0YVBhY2tldFdhc0Ryb3BwZWQodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotICAvKioKLSAgICogUHJvY2VzcyBBVkRUUCBBdWRpbyBEZWxheSB3aGVuIHRoZSBpbml0aWFsIGRlbGF5IHJlcG9ydCBpcyByZWNlaXZlZCBieQotICAgKiB0aGUgU291cmNlLgotICAgKgotICAgKiBAcGFyYW0gYnRhX2F2X2hhbmRsZSB0aGUgQlRBIEFWIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgcGVlcgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIGRlbGF5IHRoZSByZXBvcnRlZCBkZWxheSBpbiAxLzEwdGggb2YgYSBtaWxsaXNlY29uZAotICAgKi8KLSAgdm9pZCBQcm9jZXNzQXVkaW9EZWxheSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IGRlbGF5KTsKLQotICAvKioKLSAgICogVXBkYXRlIHRoZSBNVFUgb2YgdGhlIGF1ZGlvIGRhdGEgY29ubmVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGJ0YV9hdl9oYW5kbGUgdGhlIEJUQSBBViBoYW5kbGUgdG8gaWRlbnRpZnkgdGhlIHBlZXIKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzCi0gICAqIEBwYXJhbSBtdHUgdGhlIG5ldyBNVFUgb2YgdGhlIGF1ZGlvIGRhdGEgY29ubmVjdGlvbgotICAgKi8KLSAgdm9pZCBVcGRhdGVNdHUodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1KTsKLQotICAvKioKLSAgICogU2V0IHRoZSBhY3RpdmUgcGVlci4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzCi0gICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgU2V0QWN0aXZlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVuY29kZXIgcGFyYW1ldGVycyBmb3IgYSBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIHBfcGVlcl9wYXJhbXMgb24gcmV0dXJuLCBzZXQgdG8gdGhlIHBlZXIncyBlbmNvZGVyIHBhcmFtZXRlcnMKLSAgICovCi0gIHZvaWQgR2V0UGVlckVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TKiBwX3BlZXJfcGFyYW1zKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBTb3VyY2UgZW5jb2RlciBpbnRlcmZhY2UgZm9yIHRoZSBjdXJyZW50IGNvZGVjLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBTb3VyY2UgZW5jb2RlciBpbnRlcmZhY2UgZm9yIHRoZSBjdXJyZW50IGNvZGVjCi0gICAqLwotICBjb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogR2V0U291cmNlRW5jb2RlckludGVyZmFjZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIFNpbmsgZGVjb2RlciBpbnRlcmZhY2UgZm9yIHRoZSBjdXJyZW50IGNvZGVjLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBTaW5rIGRlY29kZXIgaW50ZXJmYWNlIGZvciB0aGUgY3VycmVudCBjb2RlYwotICAgKi8KLSAgY29uc3QgdEEyRFBfREVDT0RFUl9JTlRFUkZBQ0UqIEdldFNpbmtEZWNvZGVySW50ZXJmYWNlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY29kZWMgdXNlciBjb25maWd1cmF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHBhcmFtIGNvZGVjX3VzZXJfY29uZmlnIHRoZSBjb2RlYyB1c2VyIGNvbmZpZ3VyYXRpb24gdG8gc2V0Ci0gICAqIEBwYXJhbSBwX3Jlc3RhcnRfb3V0cHV0IGlmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KLSAgICogdGhhdCByZXF1aXJlcyByZXN0YXJ0aW5nIG9mIHRoZSBBMkRQIGNvbm5lY3Rpb24sIGZsYWcgfHBfcmVzdGFydF9vdXRwdXR8Ci0gICAqIHdpbGwgYmUgc2V0IHRvIHRydWUuCi0gICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgU2V0Q29kZWNVc2VyQ29uZmlnKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY29kZWMgYXVkaW8gY29uZmlndXJhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGNvZGVjX2F1ZGlvX2NvbmZpZyB0aGUgY29kZWMgYXVkaW8gY29uZmlndXJhdGlvbiB0byBzZXQKLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBTZXRDb2RlY0F1ZGlvQ29uZmlnKGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfYXVkaW9fY29uZmlnKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBTb3VyY2UgZW5jb2RlciBtYXhpbXVtIGZyYW1lIHNpemUgZm9yIHRoZSBjdXJyZW50IGNvZGVjLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBlZmZlY3RpdmUgZnJhbWUgc2l6ZSBmb3IgdGhlIGN1cnJlbnQgY29kZWMKLSAgICovCi0gIGludCBHZXRTb3VyY2VFbmNvZGVyRWZmZWN0aXZlRnJhbWVTaXplKCk7Ci0KLSAgLyoqCi0gICAqIFJlcG9ydCB0aGUgc291cmNlIGNvZGVjIHN0YXRlIGZvciBhIHBlZXIKLSAgICoKLSAgICogQHBhcmFtIHBfcGVlciB0aGUgcGVlciB0byByZXBvcnQKLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBSZXBvcnRTb3VyY2VDb2RlY1N0YXRlKEJ0YUF2Q29QZWVyKiBwX3BlZXIpOwotCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIHNpbmsgY29kZWMgc3RhdGUgZm9yIGEgcGVlcgotICAgKgotICAgKiBAcGFyYW0gcF9wZWVyIHRoZSBwZWVyIHRvIHJlcG9ydAotICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBib29sIFJlcG9ydFNpbmtDb2RlY1N0YXRlKEJ0YUF2Q29QZWVyKiBwX3BlZXIpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRlbnQgcHJvdGVjdGlvbiBmbGFnLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IHByb3RlY3Rpb24gZmxhZy4gSXQgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgKiBBVkRUX0NQX1NDTVNfQ09QWV9ORVZFUiwgQVZEVF9DUF9TQ01TX0NPUFlfT05DRSwgQVZEVF9DUF9TQ01TX0NPUFlfRlJFRQotICAgKi8KLSAgdWludDhfdCBDb250ZW50UHJvdGVjdEZsYWcoKSBjb25zdCB7IHJldHVybiBjb250ZW50X3Byb3RlY3RfZmxhZ187IH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjb250ZW50IHByb3RlY3Rpb24gZmxhZy4KLSAgICoKLSAgICogQHBhcmFtIGNwX2ZsYWcgdGhlIGNvbnRlbnQgcHJvdGVjdGlvbiBmbGFnLiBJdCBzaG91bGQgYmUgb25lIG9mIHRoZQotICAgKiBmb2xsb3dpbmc6Ci0gICAqIEFWRFRfQ1BfU0NNU19DT1BZX05FVkVSLCBBVkRUX0NQX1NDTVNfQ09QWV9PTkNFLCBBVkRUX0NQX1NDTVNfQ09QWV9GUkVFCi0gICAqIE5PVEU6IElmIENvbnRlbnQgUHJvdGVjdGlvbiBpcyBub3QgZW5hYmxlZCBvbiB0aGUgc3lzdGVtLCB0aGVuCi0gICAqIHRoZSBvbmx5IGFjY2VwdGFibGUgdmFpbHVlIGlzIEFWRFRfQ1BfU0NNU19DT1BZX0ZSRUUuCi0gICAqLwotICB2b2lkIFNldENvbnRlbnRQcm90ZWN0RmxhZyh1aW50OF90IGNwX2ZsYWcpIHsKLSAgICBpZiAoIUNvbnRlbnRQcm90ZWN0RW5hYmxlZCgpICYmIChjcF9mbGFnICE9IEFWRFRfQ1BfU0NNU19DT1BZX0ZSRUUpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnRlbnRfcHJvdGVjdF9mbGFnXyA9IGNwX2ZsYWc7Ci0gIH0KLQotICAvKioKLSAgICogRHVtcCBkZWJ1Zy1yZWxhdGVkIGluZm9ybWF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpdG9yIHRvIHVzZSBmb3Igd3JpdGluZyB0aGUgQVNDSUkgZm9ybWF0dGVkCi0gICAqIGluZm9ybWF0aW9uCi0gICAqLwotICB2b2lkIERlYnVnRHVtcChpbnQgZmQpOwotCi0gIC8qKgotICAgKiBGaW5kIHRoZSBwZWVyIGVudHJ5IGZvciBhIGdpdmVuIHBlZXIgYWRkcmVzcy4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzIHRvIHVzZQotICAgKiBAcmV0dXJuIHRoZSBwZWVyIGVudHJ5IGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbHB0cgotICAgKi8KLSAgQnRhQXZDb1BlZXIqIEZpbmRQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIHBlZXIgU2luayBTRVAgZW50cnkgZm9yIGEgZ2l2ZW4gY29kZWMgaW5kZXguCi0gICAqCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIHBlZXIgdG8gdXNlCi0gICAqIEBwYXJhbSBjb2RlY19pbmRleCB0aGUgY29kZWMgaW5kZXggdG8gdXNlCi0gICAqIEByZXR1cm4gdGhlIHBlZXIgU2luayBTRVAgZm9yIHRoZSBjb2RlYyBpbmRleCBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGxwdHIKLSAgICovCi0gIEJ0YUF2Q29TZXAqIEZpbmRQZWVyU2luayhCdGFBdkNvUGVlciogcF9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgpOwotCi0gIC8qKgotICAgKiBGaW5kIHRoZSBwZWVyIFNvdXJjZSBTRVAgZW50cnkgZm9yIGEgZ2l2ZW4gY29kZWMgaW5kZXguCi0gICAqCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIHBlZXIgdG8gdXNlCi0gICAqIEBwYXJhbSBjb2RlY19jb25maWcgdGhlIGNvZGVjIGluZGV4IHRvIHVzZQotICAgKiBAcmV0dXJuIHRoZSBwZWVyIFNvdXJjZSBTRVAgZm9yIHRoZSBjb2RlYyBpbmRleCBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGxwdHIKLSAgICovCi0gIEJ0YUF2Q29TZXAqIEZpbmRQZWVyU291cmNlKEJ0YUF2Q29QZWVyKiBwX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KTsKLQotIHByaXZhdGU6Ci0gIC8qKgotICAgKiBSZXNldCB0aGUgc3RhdGUuCi0gICAqLwotICB2b2lkIFJlc2V0KCk7Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIHBlZXIgZW50cnkgZm9yIGEgZ2l2ZW4gQlRBIEFWIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGJ0YV9hdl9oYW5kbGUgdGhlIEJUQSBBViBoYW5kbGUgdG8gdXNlCi0gICAqIEByZXR1cm4gdGhlIHBlZXIgZW50cnkgaWYgZm91bmQsIG90aGVyd2lzZSBudWxscHRyCi0gICAqLwotICBCdGFBdkNvUGVlciogRmluZFBlZXIodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUpOwotCi0gIC8qKgotICAgKiBGaW5kIHRoZSBwZWVyIGVudHJ5IGZvciBhIGdpdmVuIEJUQSBBViBoYW5kbGUgYW5kIHVwZGF0ZSBpdCB3aXRoIHRoZQotICAgKiBwZWVyIGFkZHJlc3MuCi0gICAqCi0gICAqIEBwYXJhbSBidGFfYXZfaGFuZGxlIHRoZSBCVEEgQVYgaGFuZGxlIHRvIHVzZQotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICogQHJldHVybiB0aGUgcGVlciBlbnRyeSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGxwdHIKLSAgICovCi0gIEJ0YUF2Q29QZWVyKiBGaW5kUGVlckFuZFVwZGF0ZSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIFNlbGVjdCB0aGUgU291cmNlIGNvZGVjIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gcGVlciBjb2RlYyBzdXBwb3J0LgotICAgKgotICAgKiBGdXJ0aGVybW9yZSwgdGhlIGxvY2FsIHN0YXRlIGZvciB0aGUgcmVtYWluaW5nIG5vbi1zZWxlY3RlZCBjb2RlY3MgaXMKLSAgICogdXBkYXRlZCB0byByZWZsZWN0IHdoZXRoZXIgdGhlIGNvZGVjIGlzIHNlbGVjdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIHBlZXIgdG8gdXNlCi0gICAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIFNFUCBTaW5rIGVudHJ5IG9uIHN1Y2Nlc3MsCi0gICAqIG90aGVyd2lzZSBudWxscHRyCi0gICAqLwotICBjb25zdCBCdGFBdkNvU2VwKiBTZWxlY3RTb3VyY2VDb2RlYyhCdGFBdkNvUGVlciogcF9wZWVyKTsKLQotICAvKioKLSAgICogU2VsZWN0IHRoZSBTaW5rIGNvZGVjIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gcGVlciBjb2RlYyBzdXBwb3J0LgotICAgKgotICAgKiBGdXJ0aGVybW9yZSwgdGhlIGxvY2FsIHN0YXRlIGZvciB0aGUgcmVtYWluaW5nIG5vbi1zZWxlY3RlZCBjb2RlY3MgaXMKLSAgICogdXBkYXRlZCB0byByZWZsZWN0IHdoZXRoZXIgdGhlIGNvZGVjIGlzIHNlbGVjdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIHBlZXIgdG8gdXNlCi0gICAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIFNFUCBTb3VyY2UgZW50cnkgb24gc3VjY2VzcywKLSAgICogb3RoZXJ3aXNlIG51bGxwdHIKLSAgICovCi0gIGNvbnN0IEJ0YUF2Q29TZXAqIFNlbGVjdFNpbmtDb2RlYyhCdGFBdkNvUGVlciogcF9wZWVyKTsKLQotICAvKioKLSAgICogU2F2ZSBuZXcgY29kZWMgY29uZmlndXJhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHBfcGVlciB0aGUgcGVlciB0byB1c2UKLSAgICogQHBhcmFtIG5ld19jb2RlY19jb25maWcgdGhlIG5ldyBjb2RlYyBjb25maWd1cmF0aW9uIHRvIHVzZQotICAgKiBAcGFyYW0gbnVtX3Byb3RlY3QgdGhlIG51bWJlciBvZiBjb250ZW50IHByb3RlY3Rpb24gZWxlbWVudHMKLSAgICogQHBhcmFtIHBfcHJvdGVjdF9pbmZvIHRoZSBjb250ZW50IHByb3RlY3Rpb24gaW5mbyB0byB1c2UKLSAgICovCi0gIHZvaWQgU2F2ZU5ld0NvZGVjQ29uZmlnKEJ0YUF2Q29QZWVyKiBwX3BlZXIsIGNvbnN0IHVpbnQ4X3QqIG5ld19jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3Byb3RlY3QsIGNvbnN0IHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBPdmVyLVRoZS1BaXIgcHJlZmVycmVkIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0gICAqCi0gICAqIFRoZSBPVEEgcHJlZmVyZWQgY29kZWMgY29uZmlndXJhdGlvbiBpcyBpZ25vcmVkIGlmIHRoZSBjdXJyZW50Ci0gICAqIGNvZGVjIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgZXhwbGljaXQgdXNlciBjb25maWd1cmF0aW9uLCBvciBpZiB0aGUKLSAgICogY29kZWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNhbWUgY29kZWMgY29udGFpbnMgZXhwbGljaXQgdXNlcgotICAgKiBjb25maWd1cmF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcF9wZWVyIGlzIHRoZSBwZWVyIGRldmljZSB0aGF0IHNlbnQgdGhlIE9UQSBjb2RlYyBjb25maWd1cmF0aW9uCi0gICAqIEBwYXJhbSBwX290YV9jb2RlY19jb25maWcgY29udGFpbnMgdGhlIHJlY2VpdmVkIE9UQSBBMkRQIGNvZGVjCi0gICAqIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgcmVtb3RlIHBlZXIuIE5vdGU6IHRoaXMgaXMgbm90IHRoZSBwZWVyIGNvZGVjCi0gICAqIGNhcGFiaWxpdHksIGJ1dCB0aGUgY29kZWMgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBwZWVyIHdvdWxkIGxpa2UgdG8gdXNlLgotICAgKiBAcGFyYW0gbnVtX3Byb3RlY3QgaXMgdGhlIG51bWJlciBvZiBjb250ZW50IHByb3RlY3Rpb24gbWV0aG9kcyB0byB1c2UKLSAgICogQHBhcmFtIHBfcHJvdGVjdF9pbmZvIGNvbnRhaW5zIHRoZSBjb250ZW50IHByb3RlY3Rpb24gaW5mb3JtYXRpb24gdG8gdXNlLgotICAgKiBAcGFyYW0gcF9yZXN0YXJ0X291dHB1dCBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uCi0gICAqIHRoYXQgcmVxdWlyZXMgcmVzdGFydGluZyBvZiB0aGUgQTJEUCBjb25uZWN0aW9uLCBmbGFnIHxwX3Jlc3RhcnRfb3V0cHV0fAotICAgKiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBTZXRDb2RlY090YUNvbmZpZyhCdGFBdkNvUGVlciogcF9wZWVyLCBjb25zdCB1aW50OF90KiBwX290YV9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcHJvdGVjdCwgY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCk7Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSBhbGwgc2VsZWN0YWJsZSBTb3VyY2UgY29kZWNzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMKLSAgICogaW5mb3JtYXRpb24gZnJvbSBhIFNpbmsgcGVlci4KLSAgICoKLSAgICogQHBhcmFtIHBfcGVlciB0aGUgcGVlciBTaW5rIFNFUCB0byB1c2UKLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvZGVjcyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkCi0gICAqLwotICBzaXplX3QgVXBkYXRlQWxsU2VsZWN0YWJsZVNvdXJjZUNvZGVjcyhCdGFBdkNvUGVlciogcF9wZWVyKTsKLQotICAvKioKLSAgICogVXBkYXRlIGEgc2VsZWN0YWJsZSBTb3VyY2UgY29kZWMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBpbmZvcm1hdGlvbgotICAgKiBmcm9tIGEgU2luayBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gY29kZWNfY29uZmlnIHRoZSBjb2RlYyBjb25maWcgaW5mbyB0byBpZGVudGlmeSB0aGUgY29kZWMgdG8gdXBkYXRlCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIHBlZXIgU2luayBTRVAgdG8gdXNlCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZWMgaXMgdXBkYXRlZCwgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBib29sIFVwZGF0ZVNlbGVjdGFibGVTb3VyY2VDb2RlYyhjb25zdCBBMmRwQ29kZWNDb25maWcmIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRhQXZDb1BlZXIqIHBfcGVlcik7Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSBhbGwgc2VsZWN0YWJsZSBTaW5rIGNvZGVjcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvZGVjCi0gICAqIGluZm9ybWF0aW9uIGZyb20gYSBTb3VyY2UgcGVlci4KLSAgICoKLSAgICogQHBhcmFtIHBfcGVlciB0aGUgcGVlciBTb3VyY2UgU0VQIHRvIHVzZQotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29kZWNzIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQKLSAgICovCi0gIHNpemVfdCBVcGRhdGVBbGxTZWxlY3RhYmxlU2lua0NvZGVjcyhCdGFBdkNvUGVlciogcF9wZWVyKTsKLQotICAvKioKLSAgICogVXBkYXRlIGEgc2VsZWN0YWJsZSBTaW5rIGNvZGVjIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgaW5mb3JtYXRpb24KLSAgICogZnJvbSBhIFNvdXJjZSBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gY29kZWNfY29uZmlnIHRoZSBjb2RlYyBjb25maWcgaW5mbyB0byBpZGVudGlmeSB0aGUgY29kZWMgdG8gdXBkYXRlCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIHBlZXIgU291cmNlIFNFUCB0byB1c2UKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2RlYyBpcyB1cGRhdGVkLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgVXBkYXRlU2VsZWN0YWJsZVNpbmtDb2RlYyhjb25zdCBBMmRwQ29kZWNDb25maWcmIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0YUF2Q29QZWVyKiBwX3BlZXIpOwotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIHNlbGVjdCBTb3VyY2UgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgYSBTaW5rIHBlZXIuCi0gICAqCi0gICAqIEBwYXJhbSBjb2RlY19jb25maWcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gdG8gdXNlCi0gICAqIEBwYXJhbSBwX3BlZXIgdGhlIFNpbmsgcGVlciB0byB1c2UKLSAgICogQHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgU0VQIFNpbmsgZW50cnkgb24gc3VjY2VzcywKLSAgICogb3RuZXJ3aXNlIG51bGxwdHIKLSAgICovCi0gIGNvbnN0IEJ0YUF2Q29TZXAqIEF0dGVtcHRTb3VyY2VDb2RlY1NlbGVjdGlvbigKLSAgICAgIGNvbnN0IEEyZHBDb2RlY0NvbmZpZyYgY29kZWNfY29uZmlnLCBCdGFBdkNvUGVlciogcF9wZWVyKTsKLQotICAvKioKLSAgICogQXR0ZW1wdCB0byBzZWxlY3QgU2luayBjb2RlYyBjb25maWd1cmF0aW9uIGZvciBhIFNvdXJjZSBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gY29kZWNfY29uZmlnIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIHRvIHVzZQotICAgKiBAcGFyYW0gcF9wZWVyIHRoZSBTb3VyY2UgcGVlciB0byB1c2UKLSAgICogQHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgU0VQIFNvdXJjZSBlbnRyeSBvbiBzdWNjZXNzLAotICAgKiBvdG5lcndpc2UgbnVsbHB0cgotICAgKi8KLSAgY29uc3QgQnRhQXZDb1NlcCogQXR0ZW1wdFNpbmtDb2RlY1NlbGVjdGlvbigKLSAgICAgIGNvbnN0IEEyZHBDb2RlY0NvbmZpZyYgY29kZWNfY29uZmlnLCBCdGFBdkNvUGVlciogcF9wZWVyKTsKLQotICAvKioKLSAgICogQ2hlY2sgaWYgYSBwZWVyIFNFUCBoYXMgY29udGVudCBwcm90ZWN0aW9uIGVuYWJsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBwX3NlcCB0aGUgcGVlciBTRVAgdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwZWVyIFNFUCBoYXMgY29udGVudCBwcm90ZWN0aW9uIGVuYWJsZWQsCi0gICAqIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBBdWRpb1NlcEhhc0NvbnRlbnRQcm90ZWN0aW9uKGNvbnN0IEJ0YUF2Q29TZXAqIHBfc2VwKTsKLQotICAvKioKLSAgICogQ2hlY2sgaWYgYSBjb250ZW50IHByb3RlY3Rpb24gc2VydmljZSBpcyBTQ01TLVQuCi0gICAqCi0gICAqIEBwYXJhbSBwX29yb3RlY3RfaW5mbyB0aGUgY29udGVudCBwcm90ZWN0aW9uIGluZm8gdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDb250ZW50aW9uIFByb3RlY3Rpb24gaW4gQHBhcmFtIHBfcHJvdGVjdF9pbmZvCi0gICAqIGlzIFNDTVMtVCwgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBzdGF0aWMgYm9vbCBDb250ZW50UHJvdGVjdElzU2Ntc3QoY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8pOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiBhdWRpbyBwcm90ZWN0IGluZm8gY29udGFpbnMgU0NNUy1UIENvbnRlbnQgUHJvdGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIG51bV9wcm90ZWN0IG51bWJlciBvZiBwcm90ZWN0IHNjaGVtZXMKLSAgICogQHBhcmFtIHBfcHJvdGVjdF9pbmZvIHRoZSBwcm90ZWN0IGluZm8gdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIEBwYXJhbSBwX3Byb3RlY3RfaW5mbyBjb250YWlucyBTQ01TLVQsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgc3RhdGljIGJvb2wgQXVkaW9Qcm90ZWN0SGFzU2Ntc3QodWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8pOwotCi0gIGJvb2wgQ29udGVudFByb3RlY3RFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gY29udGVudF9wcm90ZWN0X2VuYWJsZWRfOyB9Ci0KLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggY29kZWNfbG9ja187ICAvLyBQcm90ZWN0IGFjY2VzcyB0byB0aGUgY29kZWMgc3RhdGUKLSAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY19wcmlvcml0aWVzXzsgIC8vIENvbmZpZ3VyZWQKLSAgQnRhQXZDb1BlZXIgcGVlcnNfW0JUQV9BVl9OVU1fU1RSU107ICAgICAvLyBDb25uZWN0ZWQgcGVlciBpbmZvcm1hdGlvbgotICBCdGFBdkNvUGVlciogYWN0aXZlX3BlZXJfOyAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGFjdGl2ZSBwZWVyCi0gIHVpbnQ4X3QgY29kZWNfY29uZmlnX1tBVkRUX0NPREVDX1NJWkVdOyAgLy8gQ3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uCi0gIGNvbnN0IGJvb2wgY29udGVudF9wcm90ZWN0X2VuYWJsZWRfOyAgICAgLy8gVHJ1ZSBpZiBDb250ZW50IFByb3RlY3QgaXMgZW5hYmxlZAotICB1aW50OF90IGNvbnRlbnRfcHJvdGVjdF9mbGFnXzsgICAgICAgICAgIC8vIENvbnRlbnQgUHJvdGVjdCBmbGFnCi19OwotCi0vLyBTQ01TLVQgcHJvdGVjdCBpbmZvCi1jb25zdCB1aW50OF90IGJ0YV9hdl9jb19jcF9zY21zdFtBVkRUX0NQX0lORk9fTEVOXSA9IHsweDAyLCAweDAyLCAweDAwfTsKLQotLy8gQ29udHJvbCBibG9jayBpbnN0YW5jZQotI2lmIChCVEFfQVZfQ09fQ1BfU0NNU19UID09IFRSVUUpCi1zdGF0aWMgY29uc3QgYm9vbCBrQ29udGVudFByb3RlY3RFbmFibGVkID0gdHJ1ZTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgYm9vbCBrQ29udGVudFByb3RlY3RFbmFibGVkID0gZmFsc2U7Ci0jZW5kaWYKLXN0YXRpYyBCdGFBdkNvIGJ0YV9hdl9jb19jYihrQ29udGVudFByb3RlY3RFbmFibGVkKTsKLQotdm9pZCBCdGFBdkNvUGVlcjo6SW5pdCgKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzKSB7Ci0gIFJlc2V0KGJ0YV9hdl9oYW5kbGVfKTsKLSAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgY29uZmlnCi0gIGNvZGVjc18gPSBuZXcgQTJkcENvZGVjcyhjb2RlY19wcmlvcml0aWVzKTsKLSAgY29kZWNzXy0+aW5pdCgpOwotICBBMkRQX0luaXREZWZhdWx0Q29kZWMoY29kZWNfY29uZmlnKTsKLX0KLQotdm9pZCBCdGFBdkNvUGVlcjo6UmVzZXQodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUpIHsKLSAgYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBCVEFfQVZfQ09fTlVNX0VMRU1FTlRTKHNpbmtzKTsgaSsrKSB7Ci0gICAgQnRhQXZDb1NlcCYgc2luayA9IHNpbmtzW2ldOwotICAgIHNpbmsuUmVzZXQoKTsKLSAgfQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEJUQV9BVl9DT19OVU1fRUxFTUVOVFMoc291cmNlcyk7IGkrKykgewotICAgIEJ0YUF2Q29TZXAmIHNvdXJjZSA9IHNvdXJjZXNbaV07Ci0gICAgc291cmNlLlJlc2V0KCk7Ci0gIH0KLSAgbnVtX3NpbmtzID0gMDsKLSAgbnVtX3NvdXJjZXMgPSAwOwotICBudW1fc2VwcyA9IDA7Ci0gIG51bV9yeF9zaW5rcyA9IDA7Ci0gIG51bV9yeF9zb3VyY2VzID0gMDsKLSAgbnVtX3N1cF9zaW5rcyA9IDA7Ci0gIG51bV9zdXBfc291cmNlcyA9IDA7Ci0gIHBfc2luayA9IG51bGxwdHI7Ci0gIHBfc291cmNlID0gbnVsbHB0cjsKLSAgbWVtc2V0KGNvZGVjX2NvbmZpZywgMCwgc2l6ZW9mKGNvZGVjX2NvbmZpZykpOwotICBhY2NlcHRvciA9IGZhbHNlOwotICByZWNvbmZpZ19uZWVkZWQgPSBmYWxzZTsKLSAgb3BlbmVkID0gZmFsc2U7Ci0gIG10dSA9IDA7Ci0gIHV1aWRfdG9fY29ubmVjdCA9IDA7Ci0KLSAgYnRhX2F2X2hhbmRsZV8gPSBidGFfYXZfaGFuZGxlOwotICBkZWxldGUgY29kZWNzXzsKLSAgY29kZWNzXyA9IG51bGxwdHI7Ci0gIGNvbnRlbnRfcHJvdGVjdF9hY3RpdmVfID0gZmFsc2U7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6SW5pdCgKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19sb2NrXyk7Ci0KLSAgLy8gUmVzZXQgdGhlIGNvbnRyb2wgYmxvY2sKLSAgUmVzZXQoKTsKLSAgY29kZWNfcHJpb3JpdGllc18gPSBjb2RlY19wcmlvcml0aWVzOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQlRBX0FWX0NPX05VTV9FTEVNRU5UUyhwZWVyc18pOyBpKyspIHsKLSAgICBCdGFBdkNvUGVlciogcF9wZWVyID0gJnBlZXJzX1tpXTsKLSAgICBwX3BlZXItPkluaXQoY29kZWNfcHJpb3JpdGllcyk7Ci0gIH0KLX0KLQotdm9pZCBCdGFBdkNvOjpSZXNldCgpIHsKLSAgY29kZWNfcHJpb3JpdGllc18uY2xlYXIoKTsKLSAgYWN0aXZlX3BlZXJfID0gbnVsbHB0cjsKLSAgY29udGVudF9wcm90ZWN0X2ZsYWdfID0gMDsKLSAgbWVtc2V0KGNvZGVjX2NvbmZpZ18sIDAsIHNpemVvZihjb2RlY19jb25maWdfKSk7Ci0KLSAgaWYgKENvbnRlbnRQcm90ZWN0RW5hYmxlZCgpKSB7Ci0gICAgU2V0Q29udGVudFByb3RlY3RGbGFnKEFWRFRfQ1BfU0NNU19DT1BZX05FVkVSKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRDb250ZW50UHJvdGVjdEZsYWcoQVZEVF9DUF9TQ01TX0NPUFlfRlJFRSk7Ci0gIH0KLQotICAvLyBSZXNldCB0aGUgcGVlcnMgYW5kIGluaXRpYWxpemUgdGhlIGhhbmRsZXMKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBCVEFfQVZfQ09fTlVNX0VMRU1FTlRTKHBlZXJzXyk7IGkrKykgewotICAgIEJ0YUF2Q29QZWVyKiBwX3BlZXIgPSAmcGVlcnNfW2ldOwotICAgIHBfcGVlci0+UmVzZXQoQlRBX0FWX0NPX0FVRElPX0lOREVYX1RPX0hBTkRMRShpKSk7Ci0gIH0KLX0KLQotYm9vbCBCdGFBdkNvOjpJc1N1cHBvcnRlZENvZGVjKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KSB7Ci0gIC8vIEFsbCBwZWVyIHN0YXRlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHNhbWUgbG9jYWwgY29kZWMgY29uZmlnLAotICAvLyBoZW5jZSB3ZSBjaGVjayBvbmx5IHRoZSBmaXJzdCBwZWVyLgotICBBMmRwQ29kZWNzKiBjb2RlY3MgPSBwZWVyc19bMF0uR2V0Q29kZWNzKCk7Ci0gIENIRUNLKGNvZGVjcyAhPSBudWxscHRyKTsKLSAgcmV0dXJuIGNvZGVjcy0+aXNTdXBwb3J0ZWRDb2RlYyhjb2RlY19pbmRleCk7Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZyogQnRhQXZDbzo6R2V0QWN0aXZlUGVlckN1cnJlbnRDb2RlYygpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX2xvY2tfKTsKLQotICBpZiAoYWN0aXZlX3BlZXJfID09IG51bGxwdHIgfHwgYWN0aXZlX3BlZXJfLT5HZXRDb2RlY3MoKSA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIGFjdGl2ZV9wZWVyXy0+R2V0Q29kZWNzKCktPmdldEN1cnJlbnRDb2RlY0NvbmZpZygpOwotfQotCi1BMmRwQ29kZWNDb25maWcqIEJ0YUF2Q286OkdldFBlZXJDdXJyZW50Q29kZWMoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19sb2NrXyk7Ci0KLSAgQnRhQXZDb1BlZXIqIHBlZXIgPSBGaW5kUGVlcihwZWVyX2FkZHJlc3MpOwotICBpZiAocGVlciA9PSBudWxscHRyIHx8IHBlZXItPkdldENvZGVjcygpID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gcGVlci0+R2V0Q29kZWNzKCktPmdldEN1cnJlbnRDb2RlY0NvbmZpZygpOwotfQotCi1CdGFBdkNvUGVlciogQnRhQXZDbzo6RmluZFBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQlRBX0FWX0NPX05VTV9FTEVNRU5UUyhwZWVyc18pOyBpKyspIHsKLSAgICBCdGFBdkNvUGVlciogcF9wZWVyID0gJnBlZXJzX1tpXTsKLSAgICBpZiAocF9wZWVyLT5hZGRyID09IHBlZXJfYWRkcmVzcykgewotICAgICAgcmV0dXJuIHBfcGVlcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUJ0YUF2Q29QZWVyKiBCdGFBdkNvOjpGaW5kUGVlcih0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSkgewotICB1aW50OF90IGluZGV4OwotCi0gIGluZGV4ID0gQlRBX0FWX0NPX0FVRElPX0hBTkRMRV9UT19JTkRFWChidGFfYXZfaGFuZGxlKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogYnRhX2F2X2hhbmRsZSA9IDB4JXggaW5kZXggPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9oYW5kbGUsIGluZGV4KTsKLQotICAvLyBTYW5pdHkgY2hlY2sKLSAgaWYgKGluZGV4ID49IEJUQV9BVl9DT19OVU1fRUxFTUVOVFMocGVlcnNfKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogcGVlciBpbmRleCAlZCBmb3IgQlRBIEFWIGhhbmRsZSAweCV4IGlzIG91dCBvZiBib3VuZHMiLCBfX2Z1bmNfXywKLSAgICAgICAgaW5kZXgsIGJ0YV9hdl9oYW5kbGUpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgcmV0dXJuICZwZWVyc19baW5kZXhdOwotfQotCi1CdGFBdkNvUGVlciogQnRhQXZDbzo6RmluZFBlZXJBbmRVcGRhdGUodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9hdl9oYW5kbGUgPSAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2F2X2hhbmRsZSk7Ci0KLSAgQnRhQXZDb1BlZXIqIHBfcGVlciA9IEZpbmRQZWVyKGJ0YV9hdl9oYW5kbGUpOwotICBpZiAocF9wZWVyID09IG51bGxwdHIpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcGVlciBlbnRyeSBmb3IgQlRBIEFWIGhhbmRsZSAweCV4IHBlZXIgJXMgbm90IGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9hdl9oYW5kbGUgPSAweCV4IHByZXZpb3VzIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBwX3BlZXItPmFkZHIgPSBwZWVyX2FkZHJlc3M7Ci0gIHJldHVybiBwX3BlZXI7Ci19Ci0KLXVpbnQxNl90IEJ0YUF2Q286OkZpbmRQZWVyVXVpZCh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSkgewotICBCdGFBdkNvUGVlciogcF9wZWVyID0gRmluZFBlZXIoYnRhX2F2X2hhbmRsZSk7Ci0gIGlmIChwX3BlZXIgPT0gbnVsbHB0cikgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBwX3BlZXItPnV1aWRfdG9fY29ubmVjdDsKLX0KLQotdm9pZCBCdGFBdkNvOjpQcm9jZXNzRGlzY292ZXJ5UmVzdWx0KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zZXBzLCB1aW50OF90IG51bV9zaW5rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zb3VyY2VzLCB1aW50MTZfdCB1dWlkX2xvY2FsKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IHBlZXIgJXMgYnRhX2F2X2hhbmRsZToweCV4IG51bV9zZXBzOiVkIG51bV9zaW5rczolZCBudW1fc291cmNlczolZCIsCi0gICAgICBfX2Z1bmNfXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2F2X2hhbmRsZSwgbnVtX3NlcHMsCi0gICAgICBudW1fc2lua3MsIG51bV9zb3VyY2VzKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyCi0gIEJ0YUF2Q29QZWVyKiBwX3BlZXIgPSBGaW5kUGVlckFuZFVwZGF0ZShidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MpOwotICBpZiAocF9wZWVyID09IG51bGxwdHIpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IGNvdWxkIG5vdCBmaW5kIHBlZXIgZW50cnkgZm9yIGJ0YV9hdl9oYW5kbGUgMHgleCBwZWVyICVzIiwKLSAgICAgICAgX19mdW5jX18sIGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFNhbml0eSBjaGVjayA6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotICBpZiAocF9wZWVyLT5vcGVuZWQpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcGVlciAlcyBhbHJlYWR5IG9wZW5lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLQotICAvKiBDb3B5IHRoZSBkaXNjb3ZlcnkgcmVzdWx0cyAqLwotICBwX3BlZXItPmFkZHIgPSBwZWVyX2FkZHJlc3M7Ci0gIHBfcGVlci0+bnVtX3NpbmtzID0gbnVtX3NpbmtzOwotICBwX3BlZXItPm51bV9zb3VyY2VzID0gbnVtX3NvdXJjZXM7Ci0gIHBfcGVlci0+bnVtX3NlcHMgPSBudW1fc2VwczsKLSAgcF9wZWVyLT5udW1fcnhfc2lua3MgPSAwOwotICBwX3BlZXItPm51bV9yeF9zb3VyY2VzID0gMDsKLSAgcF9wZWVyLT5udW1fc3VwX3NpbmtzID0gMDsKLSAgcF9wZWVyLT5udW1fc3VwX3NvdXJjZXMgPSAwOwotICBpZiAodXVpZF9sb2NhbCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKSB7Ci0gICAgcF9wZWVyLT51dWlkX3RvX2Nvbm5lY3QgPSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0U7Ci0gIH0gZWxzZSBpZiAodXVpZF9sb2NhbCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UpIHsKLSAgICBwX3BlZXItPnV1aWRfdG9fY29ubmVjdCA9IFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTks7Ci0gIH0KLX0KLQotdEEyRFBfU1RBVFVTIEJ0YUF2Q286OlByb2Nlc3NTb3VyY2VHZXRDb25maWcoCi0gICAgdEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICB1aW50OF90KiBwX2NvZGVjX2luZm8sIHVpbnQ4X3QqIHBfc2VwX2luZm9faWR4LCB1aW50OF90IHNlaWQsCi0gICAgdWludDhfdCogcF9udW1fcHJvdGVjdCwgdWludDhfdCogcF9wcm90ZWN0X2luZm8pIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYnRhX2F2X2hhbmRsZToweCV4IGNvZGVjOiVzIHNlaWQ6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNOYW1lKHBfY29kZWNfaW5mbyksIHNlaWQpOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbnVtX3Byb3RlY3Q6MHglMDJ4IHByb3RlY3RfaW5mbzoweCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwX251bV9wcm90ZWN0LCBwX3Byb3RlY3RfaW5mb1swXSwKLSAgICAgICAgICAgICAgICAgICBwX3Byb3RlY3RfaW5mb1sxXSwgcF9wcm90ZWN0X2luZm9bMl0pOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY0luZm9TdHJpbmcocF9jb2RlY19pbmZvKS5jX3N0cigpKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyCi0gIEJ0YUF2Q29QZWVyKiBwX3BlZXIgPSBGaW5kUGVlckFuZFVwZGF0ZShidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MpOwotICBpZiAocF9wZWVyID09IG51bGxwdHIpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IGNvdWxkIG5vdCBmaW5kIHBlZXIgZW50cnkgZm9yIGJ0YV9hdl9oYW5kbGUgMHgleCBwZWVyICVzIiwKLSAgICAgICAgX19mdW5jX18sIGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBBMkRQX0ZBSUw7Ci0gIH0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIobz0lZCwgbl9zaW5rcz0lZCwgbl9yeF9zaW5rcz0lZCwgbl9zdXBfc2lua3M9JWQpIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9wZWVyLT5vcGVuZWQsIHBfcGVlci0+bnVtX3NpbmtzLAotICAgICAgICAgICAgICAgICAgIHBfcGVlci0+bnVtX3J4X3NpbmtzLCBwX3BlZXItPm51bV9zdXBfc2lua3MpOwotCi0gIHBfcGVlci0+bnVtX3J4X3NpbmtzKys7Ci0KLSAgLy8gQ2hlY2sgdGhlIHBlZXIncyBTaW5rIGNvZGVjCi0gIGlmIChBMkRQX0lzUGVlclNpbmtDb2RlY1ZhbGlkKHBfY29kZWNfaW5mbykpIHsKLSAgICAvLyBJZiB0aGVyZSBpcyByb29tIGZvciBhIG5ldyBvbmUKLSAgICBpZiAocF9wZWVyLT5udW1fc3VwX3NpbmtzIDwgQlRBX0FWX0NPX05VTV9FTEVNRU5UUyhwX3BlZXItPnNpbmtzKSkgewotICAgICAgQnRhQXZDb1NlcCogcF9zaW5rID0gJnBfcGVlci0+c2lua3NbcF9wZWVyLT5udW1fc3VwX3NpbmtzKytdOwotCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogc2F2ZWQgY2Fwc1sleDoleDoleDoleDoleDoleF0iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9jb2RlY19pbmZvWzFdLCBwX2NvZGVjX2luZm9bMl0sIHBfY29kZWNfaW5mb1szXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9jb2RlY19pbmZvWzRdLCBwX2NvZGVjX2luZm9bNV0sIHBfY29kZWNfaW5mb1s2XSk7Ci0KLSAgICAgIG1lbWNweShwX3NpbmstPmNvZGVjX2NhcHMsIHBfY29kZWNfaW5mbywgQVZEVF9DT0RFQ19TSVpFKTsKLSAgICAgIHBfc2luay0+c2VwX2luZm9faWR4ID0gKnBfc2VwX2luZm9faWR4OwotICAgICAgcF9zaW5rLT5zZWlkID0gc2VpZDsKLSAgICAgIHBfc2luay0+bnVtX3Byb3RlY3QgPSAqcF9udW1fcHJvdGVjdDsKLSAgICAgIG1lbWNweShwX3NpbmstPnByb3RlY3RfaW5mbywgcF9wcm90ZWN0X2luZm8sIEFWRFRfQ1BfSU5GT19MRU4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcGVlciAlcyA6IG5vIG1vcmUgcm9vbSBmb3IgU2luayBpbmZvIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgU2luayBnZXQgY2FwYWJpbGl0aWVzIG9yIGFsbCBzdXBwb3J0ZWQgY29kZWMKLSAgLy8gY2FwYWJpbGl0aWVzIGFyZSByZXRyaWV2ZWQuCi0gIGlmICgocF9wZWVyLT5udW1fcnhfc2lua3MgIT0gcF9wZWVyLT5udW1fc2lua3MpICYmCi0gICAgICAocF9wZWVyLT5udW1fc3VwX3NpbmtzICE9IEJUQV9BVl9DT19OVU1fRUxFTUVOVFMocF9wZWVyLT5zaW5rcykpKSB7Ci0gICAgcmV0dXJuIEEyRFBfRkFJTDsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbGFzdCBTaW5rIGNvZGVjIHJlYWNoZWQgZm9yIHBlZXIgJXMgKGxvY2FsICVzKSIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hY2NlcHRvciA/ICJhY2NlcHRvciIgOiAiaW5pdGlhdG9yIik7Ci0KLSAgLy8gU2VsZWN0IHRoZSBTb3VyY2UgY29kZWMKLSAgY29uc3QgQnRhQXZDb1NlcCogcF9zaW5rID0gbnVsbHB0cjsKLSAgaWYgKHBfcGVlci0+YWNjZXB0b3IpIHsKLSAgICBVcGRhdGVBbGxTZWxlY3RhYmxlU291cmNlQ29kZWNzKHBfcGVlcik7Ci0gICAgaWYgKHBfcGVlci0+cF9zaW5rID09IG51bGxwdHIpIHsKLSAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgY29kZWMKLSAgICAgIHBfcGVlci0+cF9zaW5rID0KLSAgICAgICAgICBGaW5kUGVlclNpbmsocF9wZWVyLCBBMkRQX1NvdXJjZUNvZGVjSW5kZXgocF9wZWVyLT5jb2RlY19jb25maWcpKTsKLSAgICB9Ci0gICAgcF9zaW5rID0gcF9wZWVyLT5wX3Npbms7Ci0gICAgaWYgKHBfc2luayA9PSBudWxscHRyKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogY2Fubm90IGZpbmQgdGhlIHNlbGVjdGVkIGNvZGVjIGZvciBwZWVyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIEEyRFBfRkFJTDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGJ0aWZfYXZfcGVlcl9wcmVmZXJzX21hbmRhdG9yeV9jb2RlYyhwX3BlZXItPmFkZHIpKSB7Ci0gICAgICAvLyBBcHBseSB1c2VyIHByZWZlcnJlZCBjb2RlYyBkaXJlY3RseSBiZWZvcmUgZmlyc3QgY29kZWMgc2VsZWN0ZWQuCi0gICAgICBwX3NpbmsgPSBGaW5kUGVlclNpbmsocF9wZWVyLCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQyk7Ci0gICAgICBpZiAocF9zaW5rICE9IG51bGxwdHIpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9BUEkoIiVzOiBtYW5kYXRvcnkgY29kZWMgcHJlZmVycmVkIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgaGlnaF9wcmlvcml0eV9tYW5kYXRvcnl7Ci0gICAgICAgICAgICAuY29kZWNfdHlwZSA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDLAotICAgICAgICAgICAgLmNvZGVjX3ByaW9yaXR5ID0gQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0hJR0hFU1QsCi0gICAgICAgICAgICAvLyBVc2luZyBkZWZhdWx0IHNldHRpbmdzIGZvciB0aG9zZSB1bnRvdWNoZWQgZmllbGRzCi0gICAgICAgIH07Ci0gICAgICAgIHVpbnQ4X3QgcmVzdWx0X2NvZGVjX2NvbmZpZ1tBVkRUX0NPREVDX1NJWkVdOwotICAgICAgICBib29sIHJlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgICAgICAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICAgICAgICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gICAgICAgIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwZWVyX3BhcmFtczsKLSAgICAgICAgR2V0UGVlckVuY29kZXJQYXJhbWV0ZXJzKHBfcGVlci0+YWRkciwgJnBlZXJfcGFyYW1zKTsKLSAgICAgICAgcF9wZWVyLT5HZXRDb2RlY3MoKS0+c2V0Q29kZWNVc2VyQ29uZmlnKAotICAgICAgICAgICAgaGlnaF9wcmlvcml0eV9tYW5kYXRvcnksICZwZWVyX3BhcmFtcywgcF9zaW5rLT5jb2RlY19jYXBzLAotICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZywgJnJlc3RhcnRfaW5wdXQsICZyZXN0YXJ0X291dHB1dCwKLSAgICAgICAgICAgICZjb25maWdfdXBkYXRlZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBtYW5kYXRvcnkgY29kZWMgbm90IGZvdW5kIGZvciBwZWVyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcF9zaW5rID0gU2VsZWN0U291cmNlQ29kZWMocF9wZWVyKTsKLSAgICBpZiAocF9zaW5rID09IG51bGxwdHIpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYW5ub3Qgc2V0IHVwIGNvZGVjIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIEEyRFBfRkFJTDsKLSAgICB9Ci0gIH0KLQotICAvLyBCeSBkZWZhdWx0LCBubyBjb250ZW50IHByb3RlY3Rpb24KLSAgKnBfbnVtX3Byb3RlY3QgPSAwOwotICBpZiAoQ29udGVudFByb3RlY3RFbmFibGVkKCkgJiYgcF9wZWVyLT5Db250ZW50UHJvdGVjdEFjdGl2ZSgpKSB7Ci0gICAgKnBfbnVtX3Byb3RlY3QgPSBBVkRUX0NQX0lORk9fTEVOOwotICAgIG1lbWNweShwX3Byb3RlY3RfaW5mbywgYnRhX2F2X2NvX2NwX3NjbXN0LCBBVkRUX0NQX0lORk9fTEVOKTsKLSAgfQotCi0gIC8vIElmIGFjY2VwdG9yIC0+IHJlY29uZmlnIG90aGVyd2lzZSByZXBseSBmb3IgY29uZmlndXJhdGlvbgotICAqcF9zZXBfaW5mb19pZHggPSBwX3NpbmstPnNlcF9pbmZvX2lkeDsKLSAgQVBQTF9UUkFDRV9FVkVOVCgiJXM6IHBlZXIgJXMgYWNjZXB0b3I6JXMgcmVjb25maWdfbmVlZGVkOiVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAocF9wZWVyLT5hY2NlcHRvcikgPyAidHJ1ZSIgOiAiZmFsc2UiLAotICAgICAgICAgICAgICAgICAgIChwX3BlZXItPnJlY29uZmlnX25lZWRlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgaWYgKHBfcGVlci0+YWNjZXB0b3IpIHsKLSAgICBpZiAocF9wZWVyLT5yZWNvbmZpZ19uZWVkZWQpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjYWxsIEJUQV9BdlJlY29uZmlnKDB4JXgpIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9oYW5kbGUsIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgQlRBX0F2UmVjb25maWcoYnRhX2F2X2hhbmRsZSwgdHJ1ZSwgcF9zaW5rLT5zZXBfaW5mb19pZHgsCi0gICAgICAgICAgICAgICAgICAgICBwX3BlZXItPmNvZGVjX2NvbmZpZywgKnBfbnVtX3Byb3RlY3QsIGJ0YV9hdl9jb19jcF9zY21zdCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG1lbWNweShwX2NvZGVjX2luZm8sIHBfcGVlci0+Y29kZWNfY29uZmlnLCBBVkRUX0NPREVDX1NJWkUpOwotICB9Ci0KLSAgLy8gcmVwb3J0IHRoaXMgcGVlciBzZWxlY3RhYmxlIGNvZGVjcyBhZnRlciByZXRyaWV2ZWQgYWxsIGl0cyBjYXBhYmlsaXRpZXMuCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiByZXRyaWV2ZWQgIiA8PCArcF9wZWVyLT5udW1fcnhfc2lua3MKLSAgICAgICAgICAgIDw8ICIgY2FwYWJpbGl0aWVzIGZyb20gcGVlciAiIDw8IHBfcGVlci0+YWRkcjsKLSAgUmVwb3J0U291cmNlQ29kZWNTdGF0ZShwX3BlZXIpOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLXRBMkRQX1NUQVRVUyBCdGFBdkNvOjpQcm9jZXNzU2lua0dldENvbmZpZyh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2VwX2luZm9faWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VpZCwgdWludDhfdCogcF9udW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Byb3RlY3RfaW5mbykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbG9ja18pOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9hdl9oYW5kbGU6MHgleCBjb2RlYzolcyBzZWlkOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICBBMkRQX0NvZGVjTmFtZShwX2NvZGVjX2luZm8pLCBzZWlkKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG51bV9wcm90ZWN0OjB4JTAyeCBwcm90ZWN0X2luZm86MHglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcF9udW1fcHJvdGVjdCwgcF9wcm90ZWN0X2luZm9bMF0sCi0gICAgICAgICAgICAgICAgICAgcF9wcm90ZWN0X2luZm9bMV0sIHBfcHJvdGVjdF9pbmZvWzJdKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvZGVjOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfY29kZWNfaW5mbykuY19zdHIoKSk7Ci0KLSAgLy8gRmluZCB0aGUgcGVlcgotICBCdGFBdkNvUGVlciogcF9wZWVyID0gRmluZFBlZXJBbmRVcGRhdGUoYnRhX2F2X2hhbmRsZSwgcGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBfcGVlciA9PSBudWxscHRyKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgIiVzOiBjb3VsZCBub3QgZmluZCBwZWVyIGVudHJ5IGZvciBidGFfYXZfaGFuZGxlIDB4JXggcGVlciAlcyIsCi0gICAgICAgIF9fZnVuY19fLCBidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQTJEUF9GQUlMOwotICB9Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IHBlZXIgJXMgZm91bmQgKG89JWQsIG5fc291cmNlcz0lZCwgbl9yeF9zb3VyY2VzPSVkLCAiCi0gICAgICAibl9zdXBfc291cmNlcz0lZCkiLAotICAgICAgX19mdW5jX18sIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfcGVlci0+b3BlbmVkLAotICAgICAgcF9wZWVyLT5udW1fc291cmNlcywgcF9wZWVyLT5udW1fcnhfc291cmNlcywgcF9wZWVyLT5udW1fc3VwX3NvdXJjZXMpOwotCi0gIHBfcGVlci0+bnVtX3J4X3NvdXJjZXMrKzsKLQotICAvLyBDaGVjayB0aGUgcGVlcidzIFNvdXJjZSBjb2RlYwotICBpZiAoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKHBfY29kZWNfaW5mbykpIHsKLSAgICAvLyBJZiB0aGVyZSBpcyByb29tIGZvciBhIG5ldyBvbmUKLSAgICBpZiAocF9wZWVyLT5udW1fc3VwX3NvdXJjZXMgPCBCVEFfQVZfQ09fTlVNX0VMRU1FTlRTKHBfcGVlci0+c291cmNlcykpIHsKLSAgICAgIEJ0YUF2Q29TZXAqIHBfc291cmNlID0gJnBfcGVlci0+c291cmNlc1twX3BlZXItPm51bV9zdXBfc291cmNlcysrXTsKLQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNhdmVkIGNhcHNbJXg6JXg6JXg6JXg6JXg6JXhdIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfY29kZWNfaW5mb1sxXSwgcF9jb2RlY19pbmZvWzJdLCBwX2NvZGVjX2luZm9bM10sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfY29kZWNfaW5mb1s0XSwgcF9jb2RlY19pbmZvWzVdLCBwX2NvZGVjX2luZm9bNl0pOwotCi0gICAgICBtZW1jcHkocF9zb3VyY2UtPmNvZGVjX2NhcHMsIHBfY29kZWNfaW5mbywgQVZEVF9DT0RFQ19TSVpFKTsKLSAgICAgIHBfc291cmNlLT5zZXBfaW5mb19pZHggPSAqcF9zZXBfaW5mb19pZHg7Ci0gICAgICBwX3NvdXJjZS0+c2VpZCA9IHNlaWQ7Ci0gICAgICBwX3NvdXJjZS0+bnVtX3Byb3RlY3QgPSAqcF9udW1fcHJvdGVjdDsKLSAgICAgIG1lbWNweShwX3NvdXJjZS0+cHJvdGVjdF9pbmZvLCBwX3Byb3RlY3RfaW5mbywgQVZEVF9DUF9JTkZPX0xFTik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBwZWVyICVzIDogbm8gbW9yZSByb29tIGZvciBTb3VyY2UgaW5mbyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IFNvdXJjZSBnZXQgY2FwYWJpbGl0aWVzIG9yIGFsbCBzdXBwb3J0ZWQgY29kZWMKLSAgLy8gY2FwYWJpbGl0aWVzIGFyZSByZXRyaWV2ZWQuCi0gIGlmICgocF9wZWVyLT5udW1fcnhfc291cmNlcyAhPSBwX3BlZXItPm51bV9zb3VyY2VzKSAmJgotICAgICAgKHBfcGVlci0+bnVtX3N1cF9zb3VyY2VzICE9IEJUQV9BVl9DT19OVU1fRUxFTUVOVFMocF9wZWVyLT5zb3VyY2VzKSkpIHsKLSAgICByZXR1cm4gQTJEUF9GQUlMOwotICB9Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsYXN0IFNvdXJjZSBjb2RlYyByZWFjaGVkIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgLy8gU2VsZWN0IHRoZSBTaW5rIGNvZGVjCi0gIGNvbnN0IEJ0YUF2Q29TZXAqIHBfc291cmNlID0gbnVsbHB0cjsKLSAgaWYgKHBfcGVlci0+YWNjZXB0b3IpIHsKLSAgICBVcGRhdGVBbGxTZWxlY3RhYmxlU2lua0NvZGVjcyhwX3BlZXIpOwotICAgIGlmIChwX3BlZXItPnBfc291cmNlID09IG51bGxwdHIpIHsKLSAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgY29kZWMKLSAgICAgIHBfcGVlci0+cF9zb3VyY2UgPQotICAgICAgICAgIEZpbmRQZWVyU291cmNlKHBfcGVlciwgQTJEUF9TaW5rQ29kZWNJbmRleChwX3BlZXItPmNvZGVjX2NvbmZpZykpOwotICAgIH0KLSAgICBwX3NvdXJjZSA9IHBfcGVlci0+cF9zb3VyY2U7Ci0gICAgaWYgKHBfc291cmNlID09IG51bGxwdHIpIHsKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYW5ub3QgZmluZCB0aGUgc2VsZWN0ZWQgY29kZWMgZm9yIHBlZXIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gQTJEUF9GQUlMOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwX3NvdXJjZSA9IFNlbGVjdFNpbmtDb2RlYyhwX3BlZXIpOwotICAgIGlmIChwX3NvdXJjZSA9PSBudWxscHRyKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogY2Fubm90IHNldCB1cCBjb2RlYyBmb3IgdGhlIHBlZXIgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gQTJEUF9GQUlMOwotICAgIH0KLSAgfQotCi0gIC8vIEJ5IGRlZmF1bHQsIG5vIGNvbnRlbnQgcHJvdGVjdGlvbgotICAqcF9udW1fcHJvdGVjdCA9IDA7Ci0gIGlmIChDb250ZW50UHJvdGVjdEVuYWJsZWQoKSAmJiBwX3BlZXItPkNvbnRlbnRQcm90ZWN0QWN0aXZlKCkpIHsKLSAgICAqcF9udW1fcHJvdGVjdCA9IEFWRFRfQ1BfSU5GT19MRU47Ci0gICAgbWVtY3B5KHBfcHJvdGVjdF9pbmZvLCBidGFfYXZfY29fY3Bfc2Ntc3QsIEFWRFRfQ1BfSU5GT19MRU4pOwotICB9Ci0KLSAgLy8gSWYgYWNjZXB0b3IgLT4gcmVjb25maWcgb3RoZXJ3aXNlIHJlcGx5IGZvciBjb25maWd1cmF0aW9uCi0gICpwX3NlcF9pbmZvX2lkeCA9IHBfc291cmNlLT5zZXBfaW5mb19pZHg7Ci0gIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBwZWVyICVzIGFjY2VwdG9yOiVzIHJlY29uZmlnX25lZWRlZDolcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgKHBfcGVlci0+YWNjZXB0b3IpID8gInRydWUiIDogImZhbHNlIiwKLSAgICAgICAgICAgICAgICAgICAocF9wZWVyLT5yZWNvbmZpZ19uZWVkZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0gIGlmIChwX3BlZXItPmFjY2VwdG9yKSB7Ci0gICAgaWYgKHBfcGVlci0+cmVjb25maWdfbmVlZGVkKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY2FsbCBCVEFfQXZSZWNvbmZpZygweCV4KSBmb3IgcGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBidGFfYXZfaGFuZGxlLCBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIEJUQV9BdlJlY29uZmlnKGJ0YV9hdl9oYW5kbGUsIHRydWUsIHBfc291cmNlLT5zZXBfaW5mb19pZHgsCi0gICAgICAgICAgICAgICAgICAgICBwX3BlZXItPmNvZGVjX2NvbmZpZywgKnBfbnVtX3Byb3RlY3QsIGJ0YV9hdl9jb19jcF9zY21zdCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG1lbWNweShwX2NvZGVjX2luZm8sIHBfcGVlci0+Y29kZWNfY29uZmlnLCBBVkRUX0NPREVDX1NJWkUpOwotICB9Ci0KLSAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLX0KLQotdm9pZCBCdGFBdkNvOjpQcm9jZXNzU2V0Q29uZmlnKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBzZWlkLCB1aW50OF90IG51bV9wcm90ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdF9sb2NhbF9zZXAsIHVpbnQ4X3QgYXZkdF9oYW5kbGUpIHsKLSAgdEEyRFBfU1RBVFVTIHN0YXR1cyA9IEEyRFBfU1VDQ0VTUzsKLSAgdWludDhfdCBjYXRlZ29yeSA9IEEyRFBfU1VDQ0VTUzsKLSAgYm9vbCByZWNvbmZpZ19uZWVkZWQgPSBmYWxzZTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBidGFfYXZfaGFuZGxlPTB4JXggcGVlcl9hZGRyZXNzPSVzIHNlaWQ9JWQgIgotICAgICAgIm51bV9wcm90ZWN0PSVkIHRfbG9jYWxfc2VwPSVkIGF2ZHRfaGFuZGxlPSVkIiwKLSAgICAgIF9fZnVuY19fLCBidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBzZWlkLAotICAgICAgbnVtX3Byb3RlY3QsIHRfbG9jYWxfc2VwLCBhdmR0X2hhbmRsZSk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwX2NvZGVjX2luZm9bJXg6JXg6JXg6JXg6JXg6JXhdIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9jb2RlY19pbmZvWzFdLCBwX2NvZGVjX2luZm9bMl0sIHBfY29kZWNfaW5mb1szXSwKLSAgICAgICAgICAgICAgICAgICBwX2NvZGVjX2luZm9bNF0sIHBfY29kZWNfaW5mb1s1XSwgcF9jb2RlY19pbmZvWzZdKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG51bV9wcm90ZWN0OjB4JTAyeCBwcm90ZWN0X2luZm86MHglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBudW1fcHJvdGVjdCwgcF9wcm90ZWN0X2luZm9bMF0sIHBfcHJvdGVjdF9pbmZvWzFdLAotICAgICAgICAgICAgICAgICAgIHBfcHJvdGVjdF9pbmZvWzJdKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvZGVjOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfY29kZWNfaW5mbykuY19zdHIoKSk7Ci0KLSAgLy8gRmluZCB0aGUgcGVlcgotICBCdGFBdkNvUGVlciogcF9wZWVyID0gRmluZFBlZXJBbmRVcGRhdGUoYnRhX2F2X2hhbmRsZSwgcGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBfcGVlciA9PSBudWxscHRyKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgIiVzOiBjb3VsZCBub3QgZmluZCBwZWVyIGVudHJ5IGZvciBidGFfYXZfaGFuZGxlIDB4JXggcGVlciAlcyIsCi0gICAgICAgIF9fZnVuY19fLCBidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAvLyBDYWxsIGNhbGwtaW4gcmVqZWN0aW5nIHRoZSBjb25maWd1cmF0aW9uCi0gICAgYnRhX2F2X2NpX3NldGNvbmZpZyhidGFfYXZfaGFuZGxlLCBBMkRQX0JVU1ksIEFWRFRfQVNDX0NPREVDLCAwLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGF2ZHRfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBwZWVyICVzIGZvdW5kIChvPSVkLCBuX3NpbmtzPSVkLCBuX3J4X3NpbmtzPSVkLCAiCi0gICAgICAibl9zdXBfc2lua3M9JWQpIiwKLSAgICAgIF9fZnVuY19fLCBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3BlZXItPm9wZW5lZCwKLSAgICAgIHBfcGVlci0+bnVtX3NpbmtzLCBwX3BlZXItPm51bV9yeF9zaW5rcywgcF9wZWVyLT5udW1fc3VwX3NpbmtzKTsKLQotICAvLyBTYW5pdHkgY2hlY2s6IHNob3VsZCBub3QgYmUgb3BlbmVkIGF0IHRoaXMgcG9pbnQKLSAgaWYgKHBfcGVlci0+b3BlbmVkKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHBlZXIgJXMgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci0KLSAgaWYgKG51bV9wcm90ZWN0ICE9IDApIHsKLSAgICBpZiAoQ29udGVudFByb3RlY3RFbmFibGVkKCkpIHsKLSAgICAgIGlmICgobnVtX3Byb3RlY3QgIT0gMSkgfHwKLSAgICAgICAgICAhQnRhQXZDbzo6Q29udGVudFByb3RlY3RJc1NjbXN0KHBfcHJvdGVjdF9pbmZvKSkgewotICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogd3JvbmcgQ1AgY29uZmlndXJhdGlvbiBmb3IgcGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBzdGF0dXMgPSBBMkRQX0JBRF9DUF9UWVBFOwotICAgICAgICBjYXRlZ29yeSA9IEFWRFRfQVNDX1BST1RFQ1Q7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIERvIG5vdCBzdXBwb3J0IGNvbnRlbnQgcHJvdGVjdGlvbiBmb3IgdGhlIHRpbWUgYmVpbmcKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBDUCBjb25maWd1cmF0aW9uIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgc3RhdHVzID0gQTJEUF9CQURfQ1BfVFlQRTsKLSAgICAgIGNhdGVnb3J5ID0gQVZEVF9BU0NfUFJPVEVDVDsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IEEyRFBfU1VDQ0VTUykgewotICAgIGJvb2wgY29kZWNfY29uZmlnX3N1cHBvcnRlZCA9IGZhbHNlOwotCi0gICAgaWYgKHRfbG9jYWxfc2VwID09IEFWRFRfVFNFUF9TTkspIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGlzIEEyRFAgU291cmNlIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgY29kZWNfY29uZmlnX3N1cHBvcnRlZCA9IEEyRFBfSXNTaW5rQ29kZWNTdXBwb3J0ZWQocF9jb2RlY19pbmZvKTsKLSAgICAgIGlmIChjb2RlY19jb25maWdfc3VwcG9ydGVkKSB7Ci0gICAgICAgIC8vIElmIFBlZXIgaXMgU291cmNlLCBhbmQgb3VyIGNvbmZpZyBzdWJzZXQgbWF0Y2hlcyB3aXRoIHdoYXQgaXMKLSAgICAgICAgLy8gcmVxdWVzdGVkIGJ5IHBlZXIsIHRoZW4ganVzdCBhY2NlcHQgd2hhdCBwZWVyIHdhbnRzLgotICAgICAgICBTYXZlTmV3Q29kZWNDb25maWcocF9wZWVyLCBwX2NvZGVjX2luZm8sIG51bV9wcm90ZWN0LCBwX3Byb3RlY3RfaW5mbyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0X2xvY2FsX3NlcCA9PSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyBpcyBBMkRQIFNJTksiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAvLyBJZ25vcmUgdGhlIHJlc3RhcnRfb3V0cHV0IGZsYWc6IGFjY2VwdGluZyB0aGUgcmVtb3RlIGRldmljZSdzCi0gICAgICAvLyBjb2RlYyBzZWxlY3Rpb24gc2hvdWxkIG5vdCB0cmlnZ2VyIGNvZGVjIHJlY29uZmlndXJhdGlvbi4KLSAgICAgIGJvb2wgZHVtbXlfcmVzdGFydF9vdXRwdXQgPSBmYWxzZTsKLSAgICAgIGlmICgocF9wZWVyLT5HZXRDb2RlY3MoKSA9PSBudWxscHRyKSB8fAotICAgICAgICAgICFTZXRDb2RlY090YUNvbmZpZyhwX3BlZXIsIHBfY29kZWNfaW5mbywgbnVtX3Byb3RlY3QsIHBfcHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXlfcmVzdGFydF9vdXRwdXQpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBjYW5ub3Qgc2V0IHNvdXJjZSBjb2RlYyAlcyBmb3IgcGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNOYW1lKHBfY29kZWNfaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb2RlY19jb25maWdfc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgLy8gQ2hlY2sgaWYgcmVjb25maWd1cmF0aW9uIGlzIG5lZWRlZAotICAgICAgICBpZiAoKChudW1fcHJvdGVjdCA9PSAxKSAmJiAhcF9wZWVyLT5Db250ZW50UHJvdGVjdEFjdGl2ZSgpKSkgewotICAgICAgICAgIHJlY29uZmlnX25lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiBjb2RlYyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAotICAgIGlmICghY29kZWNfY29uZmlnX3N1cHBvcnRlZCkgewotICAgICAgY2F0ZWdvcnkgPSBBVkRUX0FTQ19DT0RFQzsKLSAgICAgIHN0YXR1cyA9IEEyRFBfV1JPTkdfQ09ERUM7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyByZWplY3Qgcz0lZCBjPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBzdGF0dXMsIGNhdGVnb3J5KTsKLSAgICAvLyBDYWxsIGNhbGwtaW4gcmVqZWN0aW5nIHRoZSBjb25maWd1cmF0aW9uCi0gICAgYnRhX2F2X2NpX3NldGNvbmZpZyhidGFfYXZfaGFuZGxlLCBzdGF0dXMsIGNhdGVnb3J5LCAwLCBudWxscHRyLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBNYXJrIHRoYXQgdGhpcyBpcyBhbiBhY2NlcHRvciBwZWVyCi0gIHBfcGVlci0+YWNjZXB0b3IgPSB0cnVlOwotICBwX3BlZXItPnJlY29uZmlnX25lZWRlZCA9IHJlY29uZmlnX25lZWRlZDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYWNjZXB0IHJlY29uZj0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHJlY29uZmlnX25lZWRlZCk7Ci0gIC8vIENhbGwgY2FsbC1pbiBhY2NlcHRpbmcgdGhlIGNvbmZpZ3VyYXRpb24KLSAgYnRhX2F2X2NpX3NldGNvbmZpZyhidGFfYXZfaGFuZGxlLCBBMkRQX1NVQ0NFU1MsIEEyRFBfU1VDQ0VTUywgMCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICByZWNvbmZpZ19uZWVkZWQsIGF2ZHRfaGFuZGxlKTsKLX0KLQotdm9pZCBCdGFBdkNvOjpQcm9jZXNzT3Blbih0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50MTZfdCBtdHUpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYnRhX2F2X2hhbmRsZTogMHgleCBtdHU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBidGFfYXZfaGFuZGxlLCBtdHUpOwotCi0gIC8vIEZpbmQgdGhlIHBlZXIKLSAgQnRhQXZDb1BlZXIqIHBfcGVlciA9IEZpbmRQZWVyQW5kVXBkYXRlKGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwX3BlZXIgPT0gbnVsbHB0cikgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogY291bGQgbm90IGZpbmQgcGVlciBlbnRyeSBmb3IgYnRhX2F2X2hhbmRsZSAweCV4IHBlZXIgJXMiLAotICAgICAgICBfX2Z1bmNfXywgYnRhX2F2X2hhbmRsZSwgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfcGVlci0+b3BlbmVkID0gdHJ1ZTsKLSAgcF9wZWVyLT5tdHUgPSBtdHU7Ci0KLSAgLy8gVGhlIGZpcnN0IGNvbm5lY3RlZCBwZWVyIGJlY29tZXMgdGhlIGFjdGl2ZSBwZWVyCi0gIGlmIChhY3RpdmVfcGVlcl8gPT0gbnVsbHB0cikgewotICAgIGFjdGl2ZV9wZWVyXyA9IHBfcGVlcjsKLSAgfQotfQotCi12b2lkIEJ0YUF2Q286OlByb2Nlc3NDbG9zZSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyBidGFfYXZfaGFuZGxlOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2F2X2hhbmRsZSk7Ci0gIGJ0aWZfYXZfcmVzZXRfYXVkaW9fZGVsYXkoKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyCi0gIEJ0YUF2Q29QZWVyKiBwX3BlZXIgPSBGaW5kUGVlckFuZFVwZGF0ZShidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MpOwotICBpZiAocF9wZWVyID09IG51bGxwdHIpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IGNvdWxkIG5vdCBmaW5kIHBlZXIgZW50cnkgZm9yIGJ0YV9hdl9oYW5kbGUgMHgleCBwZWVyICVzIiwKLSAgICAgICAgX19mdW5jX18sIGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBSZXNldCB0aGUgYWN0aXZlIHBlZXIKLSAgaWYgKGFjdGl2ZV9wZWVyXyA9PSBwX3BlZXIpIHsKLSAgICBhY3RpdmVfcGVlcl8gPSBudWxscHRyOwotICB9Ci0gIC8vIE1hcmsgdGhlIHBlZXIgY2xvc2VkIGFuZCBjbGVhbiB0aGUgcGVlciBpbmZvCi0gIHBfcGVlci0+SW5pdChjb2RlY19wcmlvcml0aWVzXyk7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6UHJvY2Vzc1N0YXJ0KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBib29sKiBwX25vX3J0cF9oZWFkZXIpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMgYnRhX2F2X2hhbmRsZTogMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGJ0YV9hdl9oYW5kbGUpOwotCi0gIC8vIEZpbmQgdGhlIHBlZXIKLSAgQnRhQXZDb1BlZXIqIHBfcGVlciA9IEZpbmRQZWVyQW5kVXBkYXRlKGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwX3BlZXIgPT0gbnVsbHB0cikgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogY291bGQgbm90IGZpbmQgcGVlciBlbnRyeSBmb3IgYnRhX2F2X2hhbmRsZSAweCV4IHBlZXIgJXMiLAotICAgICAgICBfX2Z1bmNfXywgYnRhX2F2X2hhbmRsZSwgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBhZGRfcnRwX2hlYWRlciA9Ci0gICAgICBBMkRQX1VzZXNSdHBIZWFkZXIocF9wZWVyLT5Db250ZW50UHJvdGVjdEFjdGl2ZSgpLCBwX2NvZGVjX2luZm8pOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBidGFfYXZfaGFuZGxlOiAweCV4IGFkZF9ydHBfaGVhZGVyOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGJ0YV9hdl9oYW5kbGUsIGFkZF9ydHBfaGVhZGVyID8gInRydWUiIDogImZhbHNlIik7Ci0gICpwX25vX3J0cF9oZWFkZXIgPSAhYWRkX3J0cF9oZWFkZXI7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6UHJvY2Vzc1N0b3AodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyBidGFfYXZfaGFuZGxlOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2F2X2hhbmRsZSk7Ci0gIC8vIE5vdGhpbmcgdG8gZG8KLX0KLQotQlRfSERSKiBCdGFBdkNvOjpHZXROZXh0U291cmNlRGF0YVBhY2tldChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX3RpbWVzdGFtcCkgewotICBCVF9IRFIqIHBfYnVmOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb2RlYzogJXMiLCBfX2Z1bmNfXywgQTJEUF9Db2RlY05hbWUocF9jb2RlY19pbmZvKSk7Ci0KLSAgcF9idWYgPSBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3JlYWRidWYoKTsKLSAgaWYgKHBfYnVmID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOwotCi0gIC8qCi0gICAqIFJldHJpZXZlIHRoZSB0aW1lc3RhbXAgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWVkaWEgcGFja2V0LAotICAgKiBhbmQgc2V0IHVwIHRoZSBwYWNrZXQgaGVhZGVyLgotICAgKgotICAgKiBJbiBtZWRpYSBwYWNrZXQsIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOgotICAgKiBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgOiBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIGluIHRoZSBwYWNrZXQKLSAgICogcF9idWYtPndvcmRbMF0gOiB0aW1lc3RhbXAKLSAgICovCi0gIGlmICghQTJEUF9HZXRQYWNrZXRUaW1lc3RhbXAocF9jb2RlY19pbmZvLCAoY29uc3QgdWludDhfdCopKHBfYnVmICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90aW1lc3RhbXApIHx8Ci0gICAgICAhQTJEUF9CdWlsZENvZGVjSGVhZGVyKHBfY29kZWNfaW5mbywgcF9idWYsIHBfYnVmLT5sYXllcl9zcGVjaWZpYykpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAoJWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pKTsKLSAgfQotCi0gIGlmIChDb250ZW50UHJvdGVjdEVuYWJsZWQoKSAmJiAoYWN0aXZlX3BlZXJfICE9IG51bGxwdHIpICYmCi0gICAgICBhY3RpdmVfcGVlcl8tPkNvbnRlbnRQcm90ZWN0QWN0aXZlKCkpIHsKLSAgICBwX2J1Zi0+bGVuKys7Ci0gICAgcF9idWYtPm9mZnNldC0tOwotICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICAgICpwID0gQ29udGVudFByb3RlY3RGbGFnKCk7Ci0gIH0KLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6RGF0YVBhY2tldFdhc0Ryb3BwZWQodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBBUFBMX1RSQUNFX0VSUk9SKCIlczogcGVlciAlcyBkcm9wcGVkIGF1ZGlvIHBhY2tldCBvbiBoYW5kbGUgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGJ0YV9hdl9oYW5kbGUpOwotfQotCi12b2lkIEJ0YUF2Q286OlByb2Nlc3NBdWRpb0RlbGF5KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRlbGF5KSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIGJ0YV9hdl9oYW5kbGU6IDB4JXggZGVsYXk6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGJ0YV9hdl9oYW5kbGUsIGRlbGF5KTsKLQotICBidGlmX2F2X3NldF9hdWRpb19kZWxheShwZWVyX2FkZHJlc3MsIGRlbGF5KTsKLX0KLQotdm9pZCBCdGFBdkNvOjpVcGRhdGVNdHUodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IG10dSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcGVlciAiIDw8IHBlZXJfYWRkcmVzcwotICAgICAgICAgICAgPDwgIiBidGFfYXZfaGFuZGxlOiAiIDw8IGxvZ2hleChidGFfYXZfaGFuZGxlKSA8PCAiIG10dTogIiA8PCBtdHU7Ci0KLSAgLy8gRmluZCB0aGUgcGVlcgotICBCdGFBdkNvUGVlciogcF9wZWVyID0gRmluZFBlZXJBbmRVcGRhdGUoYnRhX2F2X2hhbmRsZSwgcGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBfcGVlciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb3VsZCBub3QgZmluZCBwZWVyIGVudHJ5IGZvciBidGFfYXZfaGFuZGxlICIKLSAgICAgICAgICAgICAgIDw8IGxvZ2hleChidGFfYXZfaGFuZGxlKSA8PCAiIHBlZXIgIiA8PCBwZWVyX2FkZHJlc3M7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfcGVlci0+bXR1ID0gbXR1OwotfQotCi1ib29sIEJ0YUF2Q286OlNldEFjdGl2ZVBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogcGVlcl9hZGRyZXNzPSIgPDwgcGVlcl9hZGRyZXNzOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19sb2NrXyk7Ci0KLSAgaWYgKHBlZXJfYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICAvLyBSZXNldCB0aGUgYWN0aXZlIHBlZXI7Ci0gICAgYWN0aXZlX3BlZXJfID0gbnVsbHB0cjsKLSAgICBtZW1zZXQoY29kZWNfY29uZmlnXywgMCwgc2l6ZW9mKGNvZGVjX2NvbmZpZ18pKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIEZpbmQgdGhlIHBlZXIKLSAgQnRhQXZDb1BlZXIqIHBfcGVlciA9IEZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwX3BlZXIgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGFjdGl2ZV9wZWVyXyA9IHBfcGVlcjsKLSAgbWVtY3B5KGNvZGVjX2NvbmZpZ18sIGFjdGl2ZV9wZWVyXy0+Y29kZWNfY29uZmlnLCBBVkRUX0NPREVDX1NJWkUpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogY29kZWMgPSAiIDw8IEEyRFBfQ29kZWNJbmZvU3RyaW5nKGNvZGVjX2NvbmZpZ18pOwotICAvLyByZXBvcnQgdGhlIHNlbGVjdGVkIGNvZGVjIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBuZXcgYWN0aXZlIHBlZXIuCi0gIFJlcG9ydFNvdXJjZUNvZGVjU3RhdGUoYWN0aXZlX3BlZXJfKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6R2V0UGVlckVuY29kZXJQYXJhbWV0ZXJzKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMpIHsKLSAgdWludDE2X3QgbWluX210dSA9IDB4RkZGRjsKLSAgQ0hFQ0socF9wZWVyX3BhcmFtcyAhPSBudWxscHRyKSA8PCAiUGVlciBhZGRyZXNzICIgPDwgcGVlcl9hZGRyZXNzOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19sb2NrXyk7Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgTVRVCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQlRBX0FWX0NPX05VTV9FTEVNRU5UUyhwZWVyc18pOyBpKyspIHsKLSAgICBjb25zdCBCdGFBdkNvUGVlciogcF9wZWVyID0gJnBlZXJzX1tpXTsKLSAgICBpZiAoIXBfcGVlci0+b3BlbmVkKSBjb250aW51ZTsKLSAgICBpZiAocF9wZWVyLT5hZGRyICE9IHBlZXJfYWRkcmVzcykgY29udGludWU7Ci0gICAgaWYgKHBfcGVlci0+bXR1IDwgbWluX210dSkgbWluX210dSA9IHBfcGVlci0+bXR1OwotICB9Ci0gIHBfcGVlcl9wYXJhbXMtPnBlZXJfbXR1ID0gbWluX210dTsKLSAgcF9wZWVyX3BhcmFtcy0+aXNfcGVlcl9lZHIgPSBidGlmX2F2X2lzX3BlZXJfZWRyKHBlZXJfYWRkcmVzcyk7Ci0gIHBfcGVlcl9wYXJhbXMtPnBlZXJfc3VwcG9ydHNfM21icHMgPQotICAgICAgYnRpZl9hdl9wZWVyX3N1cHBvcnRzXzNtYnBzKHBlZXJfYWRkcmVzcyk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IHBlZXJfYWRkcmVzcz0lcyBwZWVyX210dT0lZCBpc19wZWVyX2Vkcj0lcyBwZWVyX3N1cHBvcnRzXzNtYnBzPSVzIiwKLSAgICAgIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBwX3BlZXJfcGFyYW1zLT5wZWVyX210dSwKLSAgICAgIGxvZ2Jvb2wocF9wZWVyX3BhcmFtcy0+aXNfcGVlcl9lZHIpLmNfc3RyKCksCi0gICAgICBsb2dib29sKHBfcGVlcl9wYXJhbXMtPnBlZXJfc3VwcG9ydHNfM21icHMpLmNfc3RyKCkpOwotfQotCi1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogQnRhQXZDbzo6R2V0U291cmNlRW5jb2RlckludGVyZmFjZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX2xvY2tfKTsKLQotICByZXR1cm4gQTJEUF9HZXRFbmNvZGVySW50ZXJmYWNlKGNvZGVjX2NvbmZpZ18pOwotfQotCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQnRhQXZDbzo6R2V0U2lua0RlY29kZXJJbnRlcmZhY2UoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19sb2NrXyk7Ci0KLSAgcmV0dXJuIEEyRFBfR2V0RGVjb2RlckludGVyZmFjZShjb2RlY19jb25maWdfKTsKLX0KLQotYm9vbCBCdGFBdkNvOjpTZXRDb2RlY1VzZXJDb25maWcoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfdXNlcl9jb25maWcsIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQpIHsKLSAgdWludDhfdCByZXN1bHRfY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIGNvbnN0IEJ0YUF2Q29TZXAqIHBfc2luayA9IG51bGxwdHI7Ci0gIGJvb2wgcmVzdGFydF9pbnB1dCA9IGZhbHNlOwotICBib29sIHJlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gIGJvb2wgY29uZmlnX3VwZGF0ZWQgPSBmYWxzZTsKLSAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXJfYWRkcmVzcz0iIDw8IHBlZXJfYWRkcmVzcwotICAgICAgICAgIDw8ICIgY29kZWNfdXNlcl9jb25maWc9eyIgPDwgY29kZWNfdXNlcl9jb25maWcuVG9TdHJpbmcoKSA8PCAifSI7Ci0KLSAgKnBfcmVzdGFydF9vdXRwdXQgPSBmYWxzZTsKLQotICBCdGFBdkNvUGVlciogcF9wZWVyID0gRmluZFBlZXIocGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBfcGVlciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW5ub3QgZmluZCBwZWVyICIgPDwgcGVlcl9hZGRyZXNzCi0gICAgICAgICAgICAgICA8PCAiIHRvIGNvbmZpZ3VyZSI7Ci0gICAgc3VjY2VzcyA9IGZhbHNlOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIC8vIERvbid0IGNhbGwgQlRBX0F2UmVjb25maWcoKSBwcmlvciB0byByZXRyaWV2aW5nIGFsbCBwZWVyJ3MgY2FwYWJpbGl0aWVzCi0gIGlmICgocF9wZWVyLT5udW1fcnhfc2lua3MgIT0gcF9wZWVyLT5udW1fc2lua3MpICYmCi0gICAgICAocF9wZWVyLT5udW1fc3VwX3NpbmtzICE9IEJUQV9BVl9DT19OVU1fRUxFTUVOVFMocF9wZWVyLT5zaW5rcykpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXIgIiA8PCBwX3BlZXItPmFkZHIKLSAgICAgICAgICAgICAgICAgPDwgIiA6IG5vdCBhbGwgcGVlcidzIGNhcGFiaWxpdGllcyBoYXZlIGJlZW4gcmV0cmlldmVkIjsKLSAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgLy8gRmluZCB0aGUgcGVlciBTRVAgY29kZWMgdG8gdXNlCi0gIGlmIChjb2RlY191c2VyX2NvbmZpZy5jb2RlY190eXBlIDwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCkgewotICAgIHBfc2luayA9IEZpbmRQZWVyU2luayhwX3BlZXIsIGNvZGVjX3VzZXJfY29uZmlnLmNvZGVjX3R5cGUpOwotICB9IGVsc2UgewotICAgIC8vIFVzZSB0aGUgY3VycmVudCBzaW5rIGNvZGVjCi0gICAgcF9zaW5rID0gcF9wZWVyLT5wX3Npbms7Ci0gIH0KLSAgaWYgKHBfc2luayA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyICIgPDwgcF9wZWVyLT5hZGRyCi0gICAgICAgICAgICAgICA8PCAiIDogY2Fubm90IGZpbmQgcGVlciBTRVAgdG8gY29uZmlndXJlIGZvciBjb2RlYyB0eXBlICIKLSAgICAgICAgICAgICAgIDw8IGNvZGVjX3VzZXJfY29uZmlnLmNvZGVjX3R5cGU7Ci0gICAgc3VjY2VzcyA9IGZhbHNlOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwZWVyX3BhcmFtczsKLSAgR2V0UGVlckVuY29kZXJQYXJhbWV0ZXJzKHBfcGVlci0+YWRkciwgJnBlZXJfcGFyYW1zKTsKLSAgaWYgKCFwX3BlZXItPkdldENvZGVjcygpLT5zZXRDb2RlY1VzZXJDb25maWcoCi0gICAgICAgICAgY29kZWNfdXNlcl9jb25maWcsICZwZWVyX3BhcmFtcywgcF9zaW5rLT5jb2RlY19jYXBzLAotICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcsICZyZXN0YXJ0X2lucHV0LCAmcmVzdGFydF9vdXRwdXQsCi0gICAgICAgICAgJmNvbmZpZ191cGRhdGVkKSkgewotICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLQotICBpZiAocmVzdGFydF9vdXRwdXQpIHsKLSAgICB1aW50OF90IG51bV9wcm90ZWN0ID0gMDsKLSAgICBpZiAoQ29udGVudFByb3RlY3RFbmFibGVkKCkgJiYgcF9wZWVyLT5Db250ZW50UHJvdGVjdEFjdGl2ZSgpKSB7Ci0gICAgICBudW1fcHJvdGVjdCA9IEFWRFRfQ1BfSU5GT19MRU47Ci0gICAgfQotCi0gICAgcF9zaW5rID0gU2VsZWN0U291cmNlQ29kZWMocF9wZWVyKTsKLSAgICBpZiAocF9zaW5rID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcGVlciAiIDw8IHBfcGVlci0+YWRkcgotICAgICAgICAgICAgICAgICA8PCAiIDogY2Fubm90IHNldCB1cCBjb2RlYyBmb3IgdGhlIHBlZXIgU0lOSyI7Ci0gICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gICAgcF9wZWVyLT5hY2NlcHRvciA9IGZhbHNlOwotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogY2FsbCBCVEFfQXZSZWNvbmZpZygiCi0gICAgICAgICAgICA8PCBsb2doZXgocF9wZWVyLT5CdGFBdkhhbmRsZSgpKSA8PCAiKSI7Ci0gICAgQlRBX0F2UmVjb25maWcocF9wZWVyLT5CdGFBdkhhbmRsZSgpLCB0cnVlLCBwX3NpbmstPnNlcF9pbmZvX2lkeCwKLSAgICAgICAgICAgICAgICAgICBwX3BlZXItPmNvZGVjX2NvbmZpZywgbnVtX3Byb3RlY3QsIGJ0YV9hdl9jb19jcF9zY21zdCk7Ci0gICAgKnBfcmVzdGFydF9vdXRwdXQgPSB0cnVlOwotICB9Ci0KLWRvbmU6Ci0gIC8vIFdlIHNlbmQgdGhlIHVwY2FsbCBpZiB0aGVyZSBpcyBubyBjaGFuZ2Ugb3IgdGhlIHVzZXIgY29uZmlnIGZhaWxlZCBmb3IKLSAgLy8gY3VycmVudCBhY3RpdmUgcGVlciwgc28gdGhlIGNhbGxlciB3b3VsZCBrbm93IGl0IGZhaWxlZC4gSWYgdGhlcmUgaXMgbm8KLSAgLy8gZXJyb3IsIHRoZSBuZXcgc2VsZWN0ZWQgY29kZWMgY29uZmlndXJhdGlvbiB3b3VsZCBiZSBzZW50IGFmdGVyIHdlIGFyZQotICAvLyByZWFkeSB0byBzdGFydCBhIG5ldyBzZXNzaW9uIHdpdGggdGhlIGF1ZGlvIEhBTC4KLSAgLy8gRm9yIG5vbmUgYWN0aXZlIHBlZXIsIHdlIHVuY29uZGl0aW9uYWxseSBzZW5kIHRoZSB1cGNhbGwsIHNvIHRoZSBjYWxsZXIKLSAgLy8gd291bGQgYWx3YXlzIGtub3cgdGhlIHJlc3VsdC4KLSAgLy8gTk9URTogQ3VycmVudGx5LCB0aGUgaW5wdXQgaXMgcmVzdGFydGVkIGJ5IHNlbmRpbmcgYW4gdXBjYWxsCi0gIC8vIGFuZCBpbmZvcm1pbmcgdGhlIE1lZGlhIEZyYW1ld29yayBhYm91dCB0aGUgY2hhbmdlLgotICBpZiAocF9wZWVyICE9IG51bGxwdHIgJiYKLSAgICAgICghcmVzdGFydF9vdXRwdXQgfHwgIXN1Y2Nlc3MgfHwgcF9wZWVyICE9IGFjdGl2ZV9wZWVyXykpIHsKLSAgICByZXR1cm4gUmVwb3J0U291cmNlQ29kZWNTdGF0ZShwX3BlZXIpOwotICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWJvb2wgQnRhQXZDbzo6U2V0Q29kZWNBdWRpb0NvbmZpZygKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZykgewotICB1aW50OF90IHJlc3VsdF9jb2RlY19jb25maWdbQVZEVF9DT0RFQ19TSVpFXTsKLSAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgIDw8ICI6IGNvZGVjX2F1ZGlvX2NvbmZpZzogIiA8PCBjb2RlY19hdWRpb19jb25maWcuVG9TdHJpbmcoKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyIHRoYXQgaXMgY3VycmVudGx5IG9wZW4KLSAgQnRhQXZDb1BlZXIqIHBfcGVlciA9IGFjdGl2ZV9wZWVyXzsKLSAgaWYgKHBfcGVlciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBubyBhY3RpdmUgcGVlciB0byBjb25maWd1cmUiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIERvbid0IGNhbGwgQlRBX0F2UmVjb25maWcoKSBwcmlvciB0byByZXRyaWV2aW5nIGFsbCBwZWVyJ3MgY2FwYWJpbGl0aWVzCi0gIGlmICgocF9wZWVyLT5udW1fcnhfc2lua3MgIT0gcF9wZWVyLT5udW1fc2lua3MpICYmCi0gICAgICAocF9wZWVyLT5udW1fc3VwX3NpbmtzICE9IEJUQV9BVl9DT19OVU1fRUxFTUVOVFMocF9wZWVyLT5zaW5rcykpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXIgIiA8PCBwX3BlZXItPmFkZHIKLSAgICAgICAgICAgICAgICAgPDwgIiA6IG5vdCBhbGwgcGVlcidzIGNhcGFiaWxpdGllcyBoYXZlIGJlZW4gcmV0cmlldmVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBVc2UgdGhlIGN1cnJlbnQgc2luayBjb2RlYwotICBjb25zdCBCdGFBdkNvU2VwKiBwX3NpbmsgPSBwX3BlZXItPnBfc2luazsKLSAgaWYgKHBfc2luayA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyICIgPDwgcF9wZWVyLT5hZGRyCi0gICAgICAgICAgICAgICA8PCAiIDogY2Fubm90IGZpbmQgcGVlciBTRVAgdG8gY29uZmlndXJlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMgcGVlcl9wYXJhbXM7Ci0gIEdldFBlZXJFbmNvZGVyUGFyYW1ldGVycyhwX3BlZXItPmFkZHIsICZwZWVyX3BhcmFtcyk7Ci0gIGlmICghcF9wZWVyLT5HZXRDb2RlY3MoKS0+c2V0Q29kZWNBdWRpb0NvbmZpZygKLSAgICAgICAgICBjb2RlY19hdWRpb19jb25maWcsICZwZWVyX3BhcmFtcywgcF9zaW5rLT5jb2RlY19jYXBzLAotICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcsICZyZXN0YXJ0X291dHB1dCwgJmNvbmZpZ191cGRhdGVkKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChyZXN0YXJ0X291dHB1dCkgewotICAgIHVpbnQ4X3QgbnVtX3Byb3RlY3QgPSAwOwotICAgIGlmIChDb250ZW50UHJvdGVjdEVuYWJsZWQoKSAmJiBwX3BlZXItPkNvbnRlbnRQcm90ZWN0QWN0aXZlKCkpIHsKLSAgICAgIG51bV9wcm90ZWN0ID0gQVZEVF9DUF9JTkZPX0xFTjsKLSAgICB9Ci0KLSAgICBTYXZlTmV3Q29kZWNDb25maWcocF9wZWVyLCByZXN1bHRfY29kZWNfY29uZmlnLCBwX3NpbmstPm51bV9wcm90ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBwX3NpbmstPnByb3RlY3RfaW5mbyk7Ci0KLSAgICBwX3BlZXItPmFjY2VwdG9yID0gZmFsc2U7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYWxsIEJUQV9BdlJlY29uZmlnKCIKLSAgICAgICAgICAgIDw8IGxvZ2hleChwX3BlZXItPkJ0YUF2SGFuZGxlKCkpIDw8ICIpIjsKLSAgICBCVEFfQXZSZWNvbmZpZyhwX3BlZXItPkJ0YUF2SGFuZGxlKCksIHRydWUsIHBfc2luay0+c2VwX2luZm9faWR4LAotICAgICAgICAgICAgICAgICAgIHBfcGVlci0+Y29kZWNfY29uZmlnLCBudW1fcHJvdGVjdCwgYnRhX2F2X2NvX2NwX3NjbXN0KTsKLSAgfQotCi0gIGlmIChjb25maWdfdXBkYXRlZCkgewotICAgIC8vIE5PVEU6IEN1cnJlbnRseSwgdGhlIGlucHV0IGlzIHJlc3RhcnRlZCBieSBzZW5kaW5nIGFuIHVwY2FsbAotICAgIC8vIGFuZCBpbmZvcm1pbmcgdGhlIE1lZGlhIEZyYW1ld29yayBhYm91dCB0aGUgY2hhbmdlIG9mIHNlbGVjdGVkIGNvZGVjLgotICAgIHJldHVybiBSZXBvcnRTb3VyY2VDb2RlY1N0YXRlKHBfcGVlcik7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IEJ0YUF2Q286OkdldFNvdXJjZUVuY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19sb2NrXyk7Ci0KLSAgcmV0dXJuIEEyRFBfR2V0RWVjb2RlckVmZmVjdGl2ZUZyYW1lU2l6ZShjb2RlY19jb25maWdfKTsKLX0KLQotYm9vbCBCdGFBdkNvOjpSZXBvcnRTb3VyY2VDb2RlY1N0YXRlKEJ0YUF2Q29QZWVyKiBwX3BlZXIpIHsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZzsKLSAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzOwotICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllczsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXJfYWRkcmVzcz0iIDw8IHBfcGVlci0+YWRkcjsKLSAgQTJkcENvZGVjcyogY29kZWNzID0gcF9wZWVyLT5HZXRDb2RlY3MoKTsKLSAgQ0hFQ0soY29kZWNzICE9IG51bGxwdHIpOwotICBpZiAoIWNvZGVjcy0+Z2V0Q29kZWNDb25maWdBbmRDYXBhYmlsaXRpZXMoJmNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcykpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUGVlciAiIDw8IHBfcGVlci0+YWRkcgotICAgICAgICAgICAgICAgICA8PCAiIDogZXJyb3IgcmVwb3J0aW5nIGF1ZGlvIHNvdXJjZSBjb2RlYyBzdGF0ZTogY2Fubm90IGdldCAiCi0gICAgICAgICAgICAgICAgICAgICJjb2RlYyBjb25maWcgYW5kIGNhcGFiaWxpdGllcyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyICIgPDwgcF9wZWVyLT5hZGRyIDw8ICIgY29kZWNfY29uZmlnPXsiCi0gICAgICAgICAgICA8PCBjb2RlY19jb25maWcuVG9TdHJpbmcoKSA8PCAifSI7Ci0gIGJ0aWZfYXZfcmVwb3J0X3NvdXJjZV9jb2RlY19zdGF0ZShwX3BlZXItPmFkZHIsIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCdGFBdkNvOjpSZXBvcnRTaW5rQ29kZWNTdGF0ZShCdGFBdkNvUGVlciogcF9wZWVyKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyX2FkZHJlc3M9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgLy8gTm90aGluZyB0byBkbyAoZm9yIG5vdykKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6RGVidWdEdW1wKGludCBmZCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbG9ja18pOwotCi0gIC8vCi0gIC8vIEFjdGl2ZSBwZWVyIGNvZGVjLXNwZWNpZmljIHN0YXRzCi0gIC8vCi0gIGlmIChhY3RpdmVfcGVlcl8gIT0gbnVsbHB0cikgewotICAgIEEyZHBDb2RlY3MqIGEyZHBfY29kZWNzID0gYWN0aXZlX3BlZXJfLT5HZXRDb2RlY3MoKTsKLSAgICBpZiAoYTJkcF9jb2RlY3MgIT0gbnVsbHB0cikgewotICAgICAgYTJkcF9jb2RlY3MtPmRlYnVnX2NvZGVjX2R1bXAoZmQpOwotICAgIH0KLSAgfQotCi0gIGlmIChhcHBsX3RyYWNlX2xldmVsIDwgQlRfVFJBQ0VfTEVWRUxfREVCVUcpIHJldHVybjsKLQotICBkcHJpbnRmKGZkLCAiXG5BMkRQIFBlZXJzIFN0YXRlOlxuIik7Ci0gIGRwcmludGYoZmQsICIgIEFjdGl2ZSBwZWVyOiAlc1xuIiwKLSAgICAgICAgICAoYWN0aXZlX3BlZXJfICE9IG51bGxwdHIpID8gYWN0aXZlX3BlZXJfLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibnVsbCIpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQlRBX0FWX0NPX05VTV9FTEVNRU5UUyhwZWVyc18pOyBpKyspIHsKLSAgICBjb25zdCBCdGFBdkNvUGVlciYgcGVlciA9IHBlZXJzX1tpXTsKLSAgICBpZiAocGVlci5hZGRyLklzRW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGRwcmludGYoZmQsICIgIFBlZXI6ICVzXG4iLCBwZWVyLmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIE51bWJlciBvZiBzaW5rczogJXVcbiIsIHBlZXIubnVtX3NpbmtzKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIE51bWJlciBvZiBzb3VyY2VzOiAldVxuIiwgcGVlci5udW1fc291cmNlcyk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBOdW1iZXIgb2YgU0VQczogJXVcbiIsIHBlZXIubnVtX3NlcHMpOwotICAgIGRwcmludGYoZmQsICIgICAgTnVtYmVyIG9mIHJlY2VpdmVkIHNpbmtzOiAldVxuIiwgcGVlci5udW1fcnhfc2lua3MpOwotICAgIGRwcmludGYoZmQsICIgICAgTnVtYmVyIG9mIHJlY2VpdmVkIHNvdXJjZXM6ICV1XG4iLCBwZWVyLm51bV9yeF9zb3VyY2VzKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIE51bWJlciBvZiBzdXBwb3J0ZWQgc2lua3M6ICV1XG4iLCBwZWVyLm51bV9zdXBfc2lua3MpOwotICAgIGRwcmludGYoZmQsICIgICAgTnVtYmVyIG9mIHN1cHBvcnRlZCBzb3VyY2VzOiAldVxuIiwgcGVlci5udW1fc3VwX3NvdXJjZXMpOwotICAgIGRwcmludGYoZmQsICIgICAgQWNjZXB0b3I6ICVzXG4iLCAocGVlci5hY2NlcHRvcikgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFJlY29uZmlnIG5lZWRlZDogJXNcbiIsCi0gICAgICAgICAgICAocGVlci5yZWNvbmZpZ19uZWVkZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICBPcGVuZWQ6ICVzXG4iLCAocGVlci5vcGVuZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgZHByaW50ZihmZCwgIiAgICBNVFU6ICV1XG4iLCBwZWVyLm10dSk7Ci0gICAgZHByaW50ZihmZCwgIiAgICBVVUlEIHRvIGNvbm5lY3Q6IDB4JXhcbiIsIHBlZXIudXVpZF90b19jb25uZWN0KTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEJUQSBBViBoYW5kbGU6ICV1XG4iLCBwZWVyLkJ0YUF2SGFuZGxlKCkpOwotICB9Ci19Ci0KLWJvb2wgQnRhQXZDbzo6Q29udGVudFByb3RlY3RJc1NjbXN0KGNvbnN0IHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICgqcF9wcm90ZWN0X2luZm8gPj0gQVZEVF9DUF9MT1NDKSB7Ci0gICAgdWludDE2X3QgY3BfaWQ7Ci0gICAgcF9wcm90ZWN0X2luZm8rKzsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGNwX2lkLCBwX3Byb3RlY3RfaW5mbyk7Ci0gICAgaWYgKGNwX2lkID09IEFWRFRfQ1BfU0NNU19UX0lEKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU0NNUy1UIGZvdW5kIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBCdGFBdkNvOjpBdWRpb1Byb3RlY3RIYXNTY21zdCh1aW50OF90IG51bV9wcm90ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3Byb3RlY3RfaW5mbykgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgd2hpbGUgKG51bV9wcm90ZWN0LS0pIHsKLSAgICBpZiAoQnRhQXZDbzo6Q29udGVudFByb3RlY3RJc1NjbXN0KHBfcHJvdGVjdF9pbmZvKSkgcmV0dXJuIHRydWU7Ci0gICAgLy8gTW92ZSB0byB0aGUgbmV4dCBDb250ZW50IFByb3RlY3Qgc2NoZW1hCi0gICAgcF9wcm90ZWN0X2luZm8gKz0gKnBfcHJvdGVjdF9pbmZvICsgMTsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU0NNUy1UIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEJ0YUF2Q286OkF1ZGlvU2VwSGFzQ29udGVudFByb3RlY3Rpb24oY29uc3QgQnRhQXZDb1NlcCogcF9zZXApIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLy8gQ2hlY2sgaWYgY29udGVudCBwcm90ZWN0aW9uIGlzIGVuYWJsZWQgZm9yIHRoaXMgc3RyZWFtCi0gIGlmIChDb250ZW50UHJvdGVjdEZsYWcoKSAhPSBBVkRUX0NQX1NDTVNfQ09QWV9GUkVFKSB7Ci0gICAgcmV0dXJuIEJ0YUF2Q286OkF1ZGlvUHJvdGVjdEhhc1NjbXN0KHBfc2VwLT5udW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXAtPnByb3RlY3RfaW5mbyk7Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbm90IHJlcXVpcmVkIiwgX19mdW5jX18pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgQnRhQXZDb1NlcCogQnRhQXZDbzo6U2VsZWN0U291cmNlQ29kZWMoQnRhQXZDb1BlZXIqIHBfcGVlcikgewotICBjb25zdCBCdGFBdkNvU2VwKiBwX3NpbmsgPSBudWxscHRyOwotCi0gIC8vIFVwZGF0ZSBhbGwgc2VsZWN0YWJsZSBjb2RlY3MuCi0gIC8vIFRoaXMgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgc2VsZWN0YWJsZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNvZGVjLgotICAvLyBOT1RFOiBUaGUgc2VsZWN0YWJsZSBjb2RlYyBpbmZvIGlzIHVzZWQgb25seSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlLgotICBVcGRhdGVBbGxTZWxlY3RhYmxlU291cmNlQ29kZWNzKHBfcGVlcik7Ci0KLSAgLy8gU2VsZWN0IHRoZSBjb2RlYwotICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBwX3BlZXItPkdldENvZGVjcygpLT5vcmRlcmVkU291cmNlQ29kZWNzKCkpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHRyeWluZyBjb2RlYyAiIDw8IGl0ZXItPm5hbWUoKTsKLSAgICBwX3NpbmsgPSBBdHRlbXB0U291cmNlQ29kZWNTZWxlY3Rpb24oKml0ZXIsIHBfcGVlcik7Ci0gICAgaWYgKHBfc2luayAhPSBudWxscHRyKSB7Ci0gICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHNlbGVjdGVkIGNvZGVjICIgPDwgaXRlci0+bmFtZSgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogY2Fubm90IHVzZSBjb2RlYyAiIDw8IGl0ZXItPm5hbWUoKTsKLSAgfQotICByZXR1cm4gcF9zaW5rOwotfQotCi1jb25zdCBCdGFBdkNvU2VwKiBCdGFBdkNvOjpTZWxlY3RTaW5rQ29kZWMoQnRhQXZDb1BlZXIqIHBfcGVlcikgewotICBjb25zdCBCdGFBdkNvU2VwKiBwX3NvdXJjZSA9IG51bGxwdHI7Ci0KLSAgLy8gVXBkYXRlIGFsbCBzZWxlY3RhYmxlIGNvZGVjcy4KLSAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gdXBkYXRlIHRoZSBzZWxlY3RhYmxlIHBhcmFtZXRlcnMgZm9yIGVhY2ggY29kZWMuCi0gIC8vIE5PVEU6IFRoZSBzZWxlY3RhYmxlIGNvZGVjIGluZm8gaXMgdXNlZCBvbmx5IGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2UuCi0gIFVwZGF0ZUFsbFNlbGVjdGFibGVTaW5rQ29kZWNzKHBfcGVlcik7Ci0KLSAgLy8gU2VsZWN0IHRoZSBjb2RlYwotICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBwX3BlZXItPkdldENvZGVjcygpLT5vcmRlcmVkU2lua0NvZGVjcygpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHRyeWluZyBjb2RlYyAlcyIsIF9fZnVuY19fLCBpdGVyLT5uYW1lKCkuY19zdHIoKSk7Ci0gICAgcF9zb3VyY2UgPSBBdHRlbXB0U2lua0NvZGVjU2VsZWN0aW9uKCppdGVyLCBwX3BlZXIpOwotICAgIGlmIChwX3NvdXJjZSAhPSBudWxscHRyKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogc2VsZWN0ZWQgY29kZWMgJXMiLCBfX2Z1bmNfXywgaXRlci0+bmFtZSgpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjYW5ub3QgdXNlIGNvZGVjICVzIiwgX19mdW5jX18sIGl0ZXItPm5hbWUoKS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIE5PVEU6IFVuY29uZGl0aW9uYWxseSBkaXNwYXRjaCB0aGUgZXZlbnQgdG8gbWFrZSBzdXJlIGEgY2FsbGJhY2sgd2l0aAotICAvLyB0aGUgbW9zdCByZWNlbnQgY29kZWMgaW5mbyBpcyBnZW5lcmF0ZWQuCi0gIFJlcG9ydFNpbmtDb2RlY1N0YXRlKHBfcGVlcik7Ci0KLSAgcmV0dXJuIHBfc291cmNlOwotfQotCi1CdGFBdkNvU2VwKiBCdGFBdkNvOjpGaW5kUGVlclNpbmsoQnRhQXZDb1BlZXIqIHBfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCkgewotICBpZiAoY29kZWNfaW5kZXggPT0gQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IGludmFsaWQgY29kZWMgaW5kZXggZm9yIHBlZXIgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICAvLyBGaW5kIHRoZSBwZWVyIFNpbmsgZm9yIHRoZSBjb2RlYwotICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcF9wZWVyLT5udW1fc3VwX3NpbmtzOyBpbmRleCsrKSB7Ci0gICAgQnRhQXZDb1NlcCogcF9zaW5rID0gJnBfcGVlci0+c2lua3NbaW5kZXhdOwotICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IHBlZXJfY29kZWNfaW5kZXggPQotICAgICAgICBBMkRQX1NvdXJjZUNvZGVjSW5kZXgocF9zaW5rLT5jb2RlY19jYXBzKTsKLSAgICBpZiAocGVlcl9jb2RlY19pbmRleCAhPSBjb2RlY19pbmRleCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghQXVkaW9TZXBIYXNDb250ZW50UHJvdGVjdGlvbihwX3NpbmspKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgICAgICIlczogcGVlciBTaW5rIGZvciBjb2RlYyAlcyBkb2VzIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAiQ29udGVudCBQcm90ZWN0aW9uIiwKLSAgICAgICAgICBfX2Z1bmNfXywgQTJEUF9Db2RlY0luZGV4U3RyKGNvZGVjX2luZGV4KSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBfc2luazsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQnRhQXZDb1NlcCogQnRhQXZDbzo6RmluZFBlZXJTb3VyY2UoQnRhQXZDb1BlZXIqIHBfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KSB7Ci0gIGlmIChjb2RlY19pbmRleCA9PSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogaW52YWxpZCBjb2RlYyBpbmRleCBmb3IgcGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIC8vIEZpbmQgdGhlIHBlZXIgU291cmNlIGZvciB0aGUgY29kZWMKLSAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBfcGVlci0+bnVtX3N1cF9zb3VyY2VzOyBpbmRleCsrKSB7Ci0gICAgQnRhQXZDb1NlcCogcF9zb3VyY2UgPSAmcF9wZWVyLT5zb3VyY2VzW2luZGV4XTsKLSAgICBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBwZWVyX2NvZGVjX2luZGV4ID0KLSAgICAgICAgQTJEUF9TaW5rQ29kZWNJbmRleChwX3NvdXJjZS0+Y29kZWNfY2Fwcyk7Ci0gICAgaWYgKHBlZXJfY29kZWNfaW5kZXggIT0gY29kZWNfaW5kZXgpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoIUF1ZGlvU2VwSGFzQ29udGVudFByb3RlY3Rpb24ocF9zb3VyY2UpKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgICAgICIlczogcGVlciBTb3VyY2UgZm9yIGNvZGVjICVzIGRvZXMgbm90IHN1cHBvcnQgIgotICAgICAgICAgICJDb250ZW50IFByb3RlY3Rpb24iLAotICAgICAgICAgIF9fZnVuY19fLCBBMkRQX0NvZGVjSW5kZXhTdHIoY29kZWNfaW5kZXgpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICByZXR1cm4gcF9zb3VyY2U7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWNvbnN0IEJ0YUF2Q29TZXAqIEJ0YUF2Q286OkF0dGVtcHRTb3VyY2VDb2RlY1NlbGVjdGlvbigKLSAgICBjb25zdCBBMmRwQ29kZWNDb25maWcmIGNvZGVjX2NvbmZpZywgQnRhQXZDb1BlZXIqIHBfcGVlcikgewotICB1aW50OF90IG5ld19jb2RlY19jb25maWdbQVZEVF9DT0RFQ19TSVpFXTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyIFNpbmsgZm9yIHRoZSBjb2RlYwotICBCdGFBdkNvU2VwKiBwX3NpbmsgPSBGaW5kUGVlclNpbmsocF9wZWVyLCBjb2RlY19jb25maWcuY29kZWNJbmRleCgpKTsKLSAgaWYgKHBfc2luayA9PSBudWxscHRyKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgU2luayBmb3IgY29kZWMgJXMgbm90IGZvdW5kIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjb2RlY19jb25maWcubmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmICghcF9wZWVyLT5HZXRDb2RlY3MoKS0+c2V0Q29kZWNDb25maWcoCi0gICAgICAgICAgcF9zaW5rLT5jb2RlY19jYXBzLCB0cnVlIC8qIGlzX2NhcGFiaWxpdHkgKi8sIG5ld19jb2RlY19jb25maWcsCi0gICAgICAgICAgdHJ1ZSAvKiBzZWxlY3RfY3VycmVudF9jb2RlYyAqLykpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY2Fubm90IHNldCBzb3VyY2UgY29kZWMgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5uYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcF9wZWVyLT5wX3NpbmsgPSBwX3Npbms7Ci0KLSAgU2F2ZU5ld0NvZGVjQ29uZmlnKHBfcGVlciwgbmV3X2NvZGVjX2NvbmZpZywgcF9zaW5rLT5udW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgIHBfc2luay0+cHJvdGVjdF9pbmZvKTsKLQotICByZXR1cm4gcF9zaW5rOwotfQotCi1jb25zdCBCdGFBdkNvU2VwKiBCdGFBdkNvOjpBdHRlbXB0U2lua0NvZGVjU2VsZWN0aW9uKAotICAgIGNvbnN0IEEyZHBDb2RlY0NvbmZpZyYgY29kZWNfY29uZmlnLCBCdGFBdkNvUGVlciogcF9wZWVyKSB7Ci0gIHVpbnQ4X3QgbmV3X2NvZGVjX2NvbmZpZ1tBVkRUX0NPREVDX1NJWkVdOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIC8vIEZpbmQgdGhlIHBlZXIgU291cmNlIGZvciB0aGUgY29kZWMKLSAgQnRhQXZDb1NlcCogcF9zb3VyY2UgPSBGaW5kUGVlclNvdXJjZShwX3BlZXIsIGNvZGVjX2NvbmZpZy5jb2RlY0luZGV4KCkpOwotICBpZiAocF9zb3VyY2UgPT0gbnVsbHB0cikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyIFNvdXJjZSBmb3IgY29kZWMgJXMgbm90IGZvdW5kIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjb2RlY19jb25maWcubmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmICghcF9wZWVyLT5HZXRDb2RlY3MoKS0+c2V0U2lua0NvZGVjQ29uZmlnKAotICAgICAgICAgIHBfc291cmNlLT5jb2RlY19jYXBzLCB0cnVlIC8qIGlzX2NhcGFiaWxpdHkgKi8sIG5ld19jb2RlY19jb25maWcsCi0gICAgICAgICAgdHJ1ZSAvKiBzZWxlY3RfY3VycmVudF9jb2RlYyAqLykpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY2Fubm90IHNldCBzaW5rIGNvZGVjICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjb2RlY19jb25maWcubmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHBfcGVlci0+cF9zb3VyY2UgPSBwX3NvdXJjZTsKLQotICBTYXZlTmV3Q29kZWNDb25maWcocF9wZWVyLCBuZXdfY29kZWNfY29uZmlnLCBwX3NvdXJjZS0+bnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgICBwX3NvdXJjZS0+cHJvdGVjdF9pbmZvKTsKLQotICByZXR1cm4gcF9zb3VyY2U7Ci19Ci0KLXNpemVfdCBCdGFBdkNvOjpVcGRhdGVBbGxTZWxlY3RhYmxlU291cmNlQ29kZWNzKEJ0YUF2Q29QZWVyKiBwX3BlZXIpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHBlZXIgJXMiLCBfX2Z1bmNfXywgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgc2l6ZV90IHVwZGF0ZWRfY29kZWNzID0gMDsKLSAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogcF9wZWVyLT5HZXRDb2RlY3MoKS0+b3JkZXJlZFNvdXJjZUNvZGVjcygpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHVwZGF0aW5nIHNlbGVjdGFibGUgY29kZWMgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGl0ZXItPm5hbWUoKS5jX3N0cigpKTsKLSAgICBpZiAoVXBkYXRlU2VsZWN0YWJsZVNvdXJjZUNvZGVjKCppdGVyLCBwX3BlZXIpKSB7Ci0gICAgICB1cGRhdGVkX2NvZGVjcysrOwotICAgIH0KLSAgfQotICByZXR1cm4gdXBkYXRlZF9jb2RlY3M7Ci19Ci0KLWJvb2wgQnRhQXZDbzo6VXBkYXRlU2VsZWN0YWJsZVNvdXJjZUNvZGVjKGNvbnN0IEEyZHBDb2RlY0NvbmZpZyYgY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRhQXZDb1BlZXIqIHBfcGVlcikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyIsIF9fZnVuY19fLCBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyIFNpbmsgZm9yIHRoZSBjb2RlYwotICBjb25zdCBCdGFBdkNvU2VwKiBwX3NpbmsgPSBGaW5kUGVlclNpbmsocF9wZWVyLCBjb2RlY19jb25maWcuY29kZWNJbmRleCgpKTsKLSAgaWYgKHBfc2luayA9PSBudWxscHRyKSB7Ci0gICAgLy8gVGhlIHBlZXIgU2luayBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvZGVjCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghcF9wZWVyLT5HZXRDb2RlY3MoKS0+c2V0UGVlclNpbmtDb2RlY0NhcGFiaWxpdGllcyhwX3NpbmstPmNvZGVjX2NhcHMpKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogY2Fubm90IHVwZGF0ZSBwZWVyICVzIGNvZGVjIGNhcGFiaWxpdGllcyBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY05hbWUocF9zaW5rLT5jb2RlY19jYXBzKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgQnRhQXZDbzo6VXBkYXRlQWxsU2VsZWN0YWJsZVNpbmtDb2RlY3MoQnRhQXZDb1BlZXIqIHBfcGVlcikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyIsIF9fZnVuY19fLCBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBzaXplX3QgdXBkYXRlZF9jb2RlY3MgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBwX3BlZXItPkdldENvZGVjcygpLT5vcmRlcmVkU2lua0NvZGVjcygpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHVwZGF0aW5nIHNlbGVjdGFibGUgY29kZWMgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGl0ZXItPm5hbWUoKS5jX3N0cigpKTsKLSAgICBpZiAoVXBkYXRlU2VsZWN0YWJsZVNpbmtDb2RlYygqaXRlciwgcF9wZWVyKSkgewotICAgICAgdXBkYXRlZF9jb2RlY3MrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHVwZGF0ZWRfY29kZWNzOwotfQotCi1ib29sIEJ0YUF2Q286OlVwZGF0ZVNlbGVjdGFibGVTaW5rQ29kZWMoY29uc3QgQTJkcENvZGVjQ29uZmlnJiBjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRhQXZDb1BlZXIqIHBfcGVlcikgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyIsIF9fZnVuY19fLCBwX3BlZXItPmFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvLyBGaW5kIHRoZSBwZWVyIFNvdXJjZSBmb3IgdGhlIGNvZGVjCi0gIGNvbnN0IEJ0YUF2Q29TZXAqIHBfc291cmNlID0KLSAgICAgIEZpbmRQZWVyU291cmNlKHBfcGVlciwgY29kZWNfY29uZmlnLmNvZGVjSW5kZXgoKSk7Ci0gIGlmIChwX3NvdXJjZSA9PSBudWxscHRyKSB7Ci0gICAgLy8gVGhlIHBlZXIgU291cmNlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29kZWMKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFwX3BlZXItPkdldENvZGVjcygpLT5zZXRQZWVyU291cmNlQ29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgcF9zb3VyY2UtPmNvZGVjX2NhcHMpKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogY2Fubm90IHVwZGF0ZSBwZWVyICVzIGNvZGVjIGNhcGFiaWxpdGllcyBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9wZWVyLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY05hbWUocF9zb3VyY2UtPmNvZGVjX2NhcHMpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRhQXZDbzo6U2F2ZU5ld0NvZGVjQ29uZmlnKEJ0YUF2Q29QZWVyKiBwX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBuZXdfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfcHJvdGVjdF9pbmZvKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwZWVyICVzIiwgX19mdW5jX18sIHBfcGVlci0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgQTJEUF9Db2RlY0luZm9TdHJpbmcobmV3X2NvZGVjX2NvbmZpZykuY19zdHIoKSk7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX2xvY2tfKTsKLQotICBtZW1jcHkoY29kZWNfY29uZmlnXywgbmV3X2NvZGVjX2NvbmZpZywgc2l6ZW9mKGNvZGVjX2NvbmZpZ18pKTsKLSAgbWVtY3B5KHBfcGVlci0+Y29kZWNfY29uZmlnLCBuZXdfY29kZWNfY29uZmlnLCBBVkRUX0NPREVDX1NJWkUpOwotCi0gIGlmIChDb250ZW50UHJvdGVjdEVuYWJsZWQoKSkgewotICAgIC8vIENoZWNrIGlmIHRoaXMgU2luayBzdXBwb3J0cyBTQ01TCi0gICAgYm9vbCBjcF9hY3RpdmUgPSBCdGFBdkNvOjpBdWRpb1Byb3RlY3RIYXNTY21zdChudW1fcHJvdGVjdCwgcF9wcm90ZWN0X2luZm8pOwotICAgIHBfcGVlci0+U2V0Q29udGVudFByb3RlY3RBY3RpdmUoY3BfYWN0aXZlKTsKLSAgfQotfQotCi1ib29sIEJ0YUF2Q286OlNldENvZGVjT3RhQ29uZmlnKEJ0YUF2Q29QZWVyKiBwX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfb3RhX2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQpIHsKLSAgdWludDhfdCByZXN1bHRfY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIGJvb2wgcmVzdGFydF9pbnB1dCA9IGZhbHNlOwotICBib29sIHJlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gIGJvb2wgY29uZmlnX3VwZGF0ZWQgPSBmYWxzZTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcGVlcl9hZGRyZXNzPSIgPDwgcF9wZWVyLT5hZGRyCi0gICAgICAgICAgICA8PCAiLCBjb2RlYzogIiA8PCBBMkRQX0NvZGVjSW5mb1N0cmluZyhwX290YV9jb2RlY19jb25maWcpOwotCi0gICpwX3Jlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0KLSAgLy8gRmluZCB0aGUgcGVlciBTRVAgY29kZWMgdG8gdXNlCi0gIGNvbnN0IEJ0YUF2Q29TZXAqIHBfc2luayA9Ci0gICAgICBGaW5kUGVlclNpbmsocF9wZWVyLCBBMkRQX1NvdXJjZUNvZGVjSW5kZXgocF9vdGFfY29kZWNfY29uZmlnKSk7Ci0gIGlmICgocF9wZWVyLT5udW1fc3VwX3NpbmtzID4gMCkgJiYgKHBfc2luayA9PSBudWxscHRyKSkgewotICAgIC8vIFRoZXJlIGFyZSBubyBwZWVyIFNFUHMgaWYgd2UgZGlkbid0IGRvIHRoZSBkaXNjb3ZlcnkgcHJvY2VkdXJlIHlldC4KLSAgICAvLyBXZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCBmcm9tIHRoZSBwZWVyLCBzbyB3ZSBjYW4KLSAgICAvLyBwcm9jZWVkIHdpdGggdGhlIE9UQSBjb2RlYyBjb25maWd1cmF0aW9uLgotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcGVlciAiIDw8IHBfcGVlci0+YWRkcgotICAgICAgICAgICAgICAgPDwgIiA6IGNhbm5vdCBmaW5kIHBlZXIgU0VQIHRvIGNvbmZpZ3VyZSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TIHBlZXJfcGFyYW1zOwotICBHZXRQZWVyRW5jb2RlclBhcmFtZXRlcnMocF9wZWVyLT5hZGRyLCAmcGVlcl9wYXJhbXMpOwotICBpZiAoIXBfcGVlci0+R2V0Q29kZWNzKCktPnNldENvZGVjT3RhQ29uZmlnKAotICAgICAgICAgIHBfb3RhX2NvZGVjX2NvbmZpZywgJnBlZXJfcGFyYW1zLCByZXN1bHRfY29kZWNfY29uZmlnLCAmcmVzdGFydF9pbnB1dCwKLSAgICAgICAgICAmcmVzdGFydF9vdXRwdXQsICZjb25maWdfdXBkYXRlZCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXIgIiA8PCBwX3BlZXItPmFkZHIKLSAgICAgICAgICAgICAgIDw8ICIgOiBjYW5ub3Qgc2V0IE9UQSBjb25maWciOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChyZXN0YXJ0X291dHB1dCkgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogcmVzdGFydCBvdXRwdXQgZm9yIGNvZGVjOiAiCi0gICAgICAgICAgICA8PCBBMkRQX0NvZGVjSW5mb1N0cmluZyhyZXN1bHRfY29kZWNfY29uZmlnKTsKLQotICAgICpwX3Jlc3RhcnRfb3V0cHV0ID0gdHJ1ZTsKLSAgICBwX3BlZXItPnBfc2luayA9IHBfc2luazsKLSAgICBTYXZlTmV3Q29kZWNDb25maWcocF9wZWVyLCByZXN1bHRfY29kZWNfY29uZmlnLCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9wcm90ZWN0X2luZm8pOwotICB9Ci0KLSAgaWYgKHJlc3RhcnRfaW5wdXQgfHwgY29uZmlnX3VwZGF0ZWQpIHsKLSAgICAvLyBOT1RFOiBDdXJyZW50bHksIHRoZSBpbnB1dCBpcyByZXN0YXJ0ZWQgYnkgc2VuZGluZyBhbiB1cGNhbGwKLSAgICAvLyBhbmQgaW5mb3JtaW5nIHRoZSBNZWRpYSBGcmFtZXdvcmsgYWJvdXQgdGhlIGNoYW5nZSBvZiBzZWxlY3RlZCBjb2RlYy4KLSAgICBSZXBvcnRTb3VyY2VDb2RlY1N0YXRlKHBfcGVlcik7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBidGFfYXZfY29faW5pdCgKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzKSB7Ci0gIGJ0YV9hdl9jb19jYi5Jbml0KGNvZGVjX3ByaW9yaXRpZXMpOwotfQotCi1ib29sIGJ0YV9hdl9jb19pc19zdXBwb3J0ZWRfY29kZWMoYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgpIHsKLSAgcmV0dXJuIGJ0YV9hdl9jb19jYi5Jc1N1cHBvcnRlZENvZGVjKGNvZGVjX2luZGV4KTsKLX0KLQotQTJkcENvZGVjQ29uZmlnKiBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYyh2b2lkKSB7Ci0gIHJldHVybiBidGFfYXZfY29fY2IuR2V0QWN0aXZlUGVlckN1cnJlbnRDb2RlYygpOwotfQotCi1BMmRwQ29kZWNDb25maWcqIGJ0YV9hdl9nZXRfYTJkcF9wZWVyX2N1cnJlbnRfY29kZWMoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIHJldHVybiBidGFfYXZfY29fY2IuR2V0UGVlckN1cnJlbnRDb2RlYyhwZWVyX2FkZHJlc3MpOwotfQotCi1ib29sIGJ0YV9hdl9jb19hdWRpb19pbml0KGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgcmV0dXJuIEEyRFBfSW5pdENvZGVjQ29uZmlnKGNvZGVjX2luZGV4LCBwX2NmZyk7Ci19Ci0KLXZvaWQgYnRhX2F2X2NvX2F1ZGlvX2Rpc2NfcmVzKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50OF90IG51bV9zZXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fc2lua3MsIHVpbnQ4X3QgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1dWlkX2xvY2FsKSB7Ci0gIGJ0YV9hdl9jb19jYi5Qcm9jZXNzRGlzY292ZXJ5UmVzdWx0KGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcywgbnVtX3NlcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zaW5rcywgbnVtX3NvdXJjZXMsIHV1aWRfbG9jYWwpOwotfQotCi10QTJEUF9TVEFUVVMgYnRhX2F2X2NvX2F1ZGlvX2dldGNvbmZpZyh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2VwX2luZm9faWR4LCB1aW50OF90IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX251bV9wcm90ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9wcm90ZWN0X2luZm8pIHsKLSAgdWludDE2X3QgcGVlcl91dWlkID0gYnRhX2F2X2NvX2NiLkZpbmRQZWVyVXVpZChidGFfYXZfaGFuZGxlKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcGVlciAlcyBidGFfYXZfaGFuZGxlPTB4JXggcGVlcl91dWlkPTB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBidGFfYXZfaGFuZGxlLCBwZWVyX3V1aWQpOwotCi0gIHN3aXRjaCAocGVlcl91dWlkKSB7Ci0gICAgY2FzZSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0U6Ci0gICAgICByZXR1cm4gYnRhX2F2X2NvX2NiLlByb2Nlc3NTaW5rR2V0Q29uZmlnKAotICAgICAgICAgIGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcywgcF9jb2RlY19pbmZvLCBwX3NlcF9pbmZvX2lkeCwgc2VpZCwKLSAgICAgICAgICBwX251bV9wcm90ZWN0LCBwX3Byb3RlY3RfaW5mbyk7Ci0gICAgY2FzZSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LOgotICAgICAgcmV0dXJuIGJ0YV9hdl9jb19jYi5Qcm9jZXNzU291cmNlR2V0Q29uZmlnKAotICAgICAgICAgIGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcywgcF9jb2RlY19pbmZvLCBwX3NlcF9pbmZvX2lkeCwgc2VpZCwKLSAgICAgICAgICBwX251bV9wcm90ZWN0LCBwX3Byb3RlY3RfaW5mbyk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAiJXM6IHBlZXIgJXMgOiBJbnZhbGlkIHBlZXIgVVVJRDogMHgleCBmb3IgYnRhX2F2X2hhbmRsZSAweCV4IiwKLSAgICAgIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBwZWVyX3V1aWQsIGJ0YV9hdl9oYW5kbGUpOwotICByZXR1cm4gQTJEUF9GQUlMOwotfQotCi12b2lkIGJ0YV9hdl9jb19hdWRpb19zZXRjb25maWcodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywgdWludDhfdCBzZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3Byb3RlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0X2xvY2FsX3NlcCwgdWludDhfdCBhdmR0X2hhbmRsZSkgewotICBidGFfYXZfY29fY2IuUHJvY2Vzc1NldENvbmZpZyhidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MsIHBfY29kZWNfaW5mbywgc2VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Byb3RlY3QsIHBfcHJvdGVjdF9pbmZvLCB0X2xvY2FsX3NlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9oYW5kbGUpOwotfQotCi12b2lkIGJ0YV9hdl9jb19hdWRpb19vcGVuKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IG10dSkgewotICBidGFfYXZfY29fY2IuUHJvY2Vzc09wZW4oYnRhX2F2X2hhbmRsZSwgcGVlcl9hZGRyZXNzLCBtdHUpOwotfQotCi12b2lkIGJ0YV9hdl9jb19hdWRpb19jbG9zZSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBidGFfYXZfY29fY2IuUHJvY2Vzc0Nsb3NlKGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcyk7Ci19Ci0KLXZvaWQgYnRhX2F2X2NvX2F1ZGlvX3N0YXJ0KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBib29sKiBwX25vX3J0cF9oZWFkZXIpIHsKLSAgYnRhX2F2X2NvX2NiLlByb2Nlc3NTdGFydChidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MsIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX25vX3J0cF9oZWFkZXIpOwotfQotCi12b2lkIGJ0YV9hdl9jb19hdWRpb19zdG9wKHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgYnRhX2F2X2NvX2NiLlByb2Nlc3NTdG9wKGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcyk7Ci19Ci0KLUJUX0hEUiogYnRhX2F2X2NvX2F1ZGlvX3NvdXJjZV9kYXRhX3BhdGgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF90aW1lc3RhbXApIHsKLSAgcmV0dXJuIGJ0YV9hdl9jb19jYi5HZXROZXh0U291cmNlRGF0YVBhY2tldChwX2NvZGVjX2luZm8sIHBfdGltZXN0YW1wKTsKLX0KLQotdm9pZCBidGFfYXZfY29fYXVkaW9fZHJvcCh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIGJ0YV9hdl9jb19jYi5EYXRhUGFja2V0V2FzRHJvcHBlZChidGFfYXZfaGFuZGxlLCBwZWVyX2FkZHJlc3MpOwotfQotCi12b2lkIGJ0YV9hdl9jb19hdWRpb19kZWxheSh0QlRBX0FWX0hOREwgYnRhX2F2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywgdWludDE2X3QgZGVsYXkpIHsKLSAgYnRhX2F2X2NvX2NiLlByb2Nlc3NBdWRpb0RlbGF5KGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcywgZGVsYXkpOwotfQotCi12b2lkIGJ0YV9hdl9jb19hdWRpb191cGRhdGVfbXR1KHRCVEFfQVZfSE5ETCBidGFfYXZfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IG10dSkgewotICBidGFfYXZfY29fY2IuVXBkYXRlTXR1KGJ0YV9hdl9oYW5kbGUsIHBlZXJfYWRkcmVzcywgbXR1KTsKLX0KLQotYm9vbCBidGFfYXZfY29fc2V0X2FjdGl2ZV9wZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICByZXR1cm4gYnRhX2F2X2NvX2NiLlNldEFjdGl2ZVBlZXIocGVlcl9hZGRyZXNzKTsKLX0KLQotdm9pZCBidGFfYXZfY29fZ2V0X3BlZXJfcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMpIHsKLSAgYnRhX2F2X2NvX2NiLkdldFBlZXJFbmNvZGVyUGFyYW1ldGVycyhwZWVyX2FkZHJlc3MsIHBfcGVlcl9wYXJhbXMpOwotfQotCi1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogYnRhX2F2X2NvX2dldF9lbmNvZGVyX2ludGVyZmFjZSh2b2lkKSB7Ci0gIHJldHVybiBidGFfYXZfY29fY2IuR2V0U291cmNlRW5jb2RlckludGVyZmFjZSgpOwotfQotCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogYnRhX2F2X2NvX2dldF9kZWNvZGVyX2ludGVyZmFjZSh2b2lkKSB7Ci0gIHJldHVybiBidGFfYXZfY29fY2IuR2V0U2lua0RlY29kZXJJbnRlcmZhY2UoKTsKLX0KLQotYm9vbCBidGFfYXZfY29fc2V0X2NvZGVjX3VzZXJfY29uZmlnKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX3VzZXJfY29uZmlnLCBib29sKiBwX3Jlc3RhcnRfb3V0cHV0KSB7Ci0gIHJldHVybiBidGFfYXZfY29fY2IuU2V0Q29kZWNVc2VyQ29uZmlnKHBlZXJfYWRkcmVzcywgY29kZWNfdXNlcl9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdGFydF9vdXRwdXQpOwotfQotCi1ib29sIGJ0YV9hdl9jb19zZXRfY29kZWNfYXVkaW9fY29uZmlnKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfYXVkaW9fY29uZmlnKSB7Ci0gIHJldHVybiBidGFfYXZfY29fY2IuU2V0Q29kZWNBdWRpb0NvbmZpZyhjb2RlY19hdWRpb19jb25maWcpOwotfQotCi1pbnQgYnRhX2F2X2NvX2dldF9lbmNvZGVyX2VmZmVjdGl2ZV9mcmFtZV9zaXplKCkgewotICByZXR1cm4gYnRhX2F2X2NvX2NiLkdldFNvdXJjZUVuY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoKTsKLX0KLQotYnRhdl9hMmRwX3NjbXN0X2luZm9fdCBidGFfYXZfY29fZ2V0X3NjbXN0X2luZm8oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIEJ0YUF2Q29QZWVyKiBwX3BlZXIgPSBidGFfYXZfY29fY2IuRmluZFBlZXIocGVlcl9hZGRyZXNzKTsKLSAgQ0hFQ0socF9wZWVyICE9IG51bGxwdHIpOwotICBidGF2X2EyZHBfc2Ntc3RfaW5mb190IHNjbXN0X2luZm97fTsKLSAgc2Ntc3RfaW5mby5lbmFibGVfc3RhdHVzID0gQlRBVl9BMkRQX1NDTVNUX0RJU0FCTEVEOwotCi0gIGlmIChwX3BlZXItPkNvbnRlbnRQcm90ZWN0QWN0aXZlKCkpIHsKLSAgICBzY21zdF9pbmZvLmVuYWJsZV9zdGF0dXMgPSBCVEFWX0EyRFBfU0NNU1RfRU5BQkxFRDsKLSAgICBzY21zdF9pbmZvLmNwX2hlYWRlciA9IGJ0YV9hdl9jb19jYi5Db250ZW50UHJvdGVjdEZsYWcoKTsKLSAgfQotCi0gIHJldHVybiBzY21zdF9pbmZvOwotfQotCi12b2lkIGJ0aWZfYTJkcF9jb2RlY19kZWJ1Z19kdW1wKGludCBmZCkgeyBidGFfYXZfY29fY2IuRGVidWdEdW1wKGZkKTsgfQpkaWZmIC0tZ2l0IGEvYnRpZi9jby9idGFfZG1fY28uY2MgYi9idGlmL2NvL2J0YV9kbV9jby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NjQ4MS4uMDAwMDAwMAotLS0gYS9idGlmL2NvL2J0YV9kbV9jby5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9kbV9jaS5oIgotI2luY2x1ZGUgImJ0YV9kbV9jby5oIgotI2luY2x1ZGUgImJ0YV9zeXMuaCIKLSNpbmNsdWRlICJidGVfYXBwbC5oIgotI2luY2x1ZGUgImJ0aWZfZG0uaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotLy8gdEJURV9BUFBMX0NGRy5ibGVfaW9fY2FwIGlzIHNldCB0byBCVE1fSU9fQ0FQX1VOS05PV04gYXQgc3RydWN0dXJlCi0vLyBpbml0aWFsaXphdGlvbiBzaW5jZSBidGlmX3N0b3JhZ2UgaXNuJ3QgcmVhZHkgeWV0IGZvciBkYXRhIHRvIGJlIGZldGNoZWQuCi0vLyBUaGlzIHZhbHVlIGlzIGluaXRpYWxpemVkIHByb3Blcmx5IGR1cmluZyBmaXJzdCB1c2UgYnkgZmV0Y2hpbmcgcHJvcGVybHkKLS8vIGZyb20gYnRpZl9zdG9yYWdlLgotdEJURV9BUFBMX0NGRyBidGVfYXBwbF9jZmcgPSB7Ci0gICAgQlRBX0xFX0FVVEhfUkVRX1NDX01JVE1fQk9ORCwgIC8vIEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVtZW50cwotICAgIEJUTV9JT19DQVBfVU5LTk9XTiwgQlRNX0JMRV9JTklUSUFUT1JfS0VZX1NJWkUsIEJUTV9CTEVfUkVTUE9OREVSX0tFWV9TSVpFLAotICAgIEJUTV9CTEVfTUFYX0tFWV9TSVpFfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9jb19nZXRfY29tcHJlc3NfbWVtb3J5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgRE0gdG8gZ2V0IG1lbW9yeSBmb3IKLSBjb21wcmVzc2lvbgotCi0gKiBQYXJhbWV0ZXJzICAgICAgIGlkICAtICBCVEEgU1lTIElECi0gKiAgICAgICAgICAgICAgICAgIG1lbW9yeV9wIC0gbWVtb3J5IHJldHVybiBieSBjYWxsb3V0Ci0gKiAgICAgICAgICAgICAgICAgIG1lbW9yeV9zaXplIC0gbWVtb3J5IHNpemUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9kbV9jb19nZXRfY29tcHJlc3NfbWVtb3J5KFVOVVNFRF9BVFRSIHRCVEFfU1lTX0lEIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90KiogbWVtb3J5X3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQzMl90KiBtZW1vcnlfc2l6ZSkgewotICByZXR1cm4gdHJ1ZTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnRpZi9jby9idGFfZ2F0dHNfY28uY2MgYi9idGlmL2NvL2J0YV9nYXR0c19jby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwNTZkNi4uMDAwMDAwMAotLS0gYS9idGlmL2NvL2J0YV9nYXR0c19jby5jYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTG9jYWwgdHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQlRJRl9HQVRUU19NQVhfU1JWX0NIR19DTFRfU0laRSA1MAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgZW5hYmxlOwotICB1aW50OF90IG51bV9jbGllbnRzOwotICB0R0FUVFNfU1JWX0NIRyBzcnZfY2hnW0JUSUZfR0FUVFNfTUFYX1NSVl9DSEdfQ0xUX1NJWkVdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBidGlmX2dhdHRzX3Nydl9jaGdfY2JfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIHZhcmlhYmxlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBidGlmX2dhdHRzX3Nydl9jaGdfY2JfdCBidGlmX2dhdHRzX3Nydl9jaGdfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBidGlmX2dhdHRzX2NoZWNrX2luaXQodm9pZCkgewotICBidGlmX2dhdHRzX3Nydl9jaGdfY2JfdCogcF9jYiA9ICZidGlmX2dhdHRzX3Nydl9jaGdfY2I7Ci0KLSAgaWYgKCFwX2NiLT5lbmFibGUpIHsKLSAgICBtZW1zZXQocF9jYiwgMCwgc2l6ZW9mKGJ0aWZfZ2F0dHNfc3J2X2NoZ19jYl90KSk7Ci0gICAgcF9jYi0+ZW5hYmxlID0gdHJ1ZTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbGx5IGNhbGxlZCBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJ0aWZfZ2F0dHNfYWRkX2JvbmRlZF9kZXZfZnJvbV9udihjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgYnRpZl9nYXR0c19zcnZfY2hnX2NiX3QqIHBfY2IgPSAmYnRpZl9nYXR0c19zcnZfY2hnX2NiOwotICBib29sIGZvdW5kID0gZmFsc2U7Ci0gIHVpbnQ4X3QgaTsKLQotICBidGlmX2dhdHRzX2NoZWNrX2luaXQoKTsKLQotICBmb3IgKGkgPSAwOyBpICE9IHBfY2ItPm51bV9jbGllbnRzOyArK2kpIHsKLSAgICBpZiAocF9jYi0+c3J2X2NoZ1tpXS5iZGEgPT0gYmRhKSB7Ci0gICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWZvdW5kKSB7Ci0gICAgaWYgKHBfY2ItPm51bV9jbGllbnRzIDwgQlRJRl9HQVRUU19NQVhfU1JWX0NIR19DTFRfU0laRSkgewotICAgICAgcF9jYi0+c3J2X2NoZ1twX2NiLT5udW1fY2xpZW50c10uYmRhID0gYmRhOwotICAgICAgcF9jYi0+c3J2X2NoZ1twX2NiLT5udW1fY2xpZW50c10uc3J2X2NoYW5nZWQgPSBmYWxzZTsKLSAgICAgIHBfY2ItPm51bV9jbGllbnRzKys7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idGlmL2NvL2J0YV9oaF9jby5jYyBiL2J0aWYvY28vYnRhX2hoX2NvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWI3OTMyLi4wMDAwMDAwCi0tLSBhL2J0aWYvY28vYnRhX2hoX2NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidGFfaGhfY28uaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L3VoaWQuaD4KLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2hoX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfaGguaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1jb25zdCBjaGFyKiBkZXZfcGF0aCA9ICIvZGV2L3VoaWQiOwotCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNkZWZpbmUgQlRBX0hIX05WX0xPQURfTUFYIDE2Ci1zdGF0aWMgdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkgc1JlcG9ydENhY2hlW0JUQV9ISF9OVl9MT0FEX01BWF07Ci0jZGVmaW5lIEdFVF9SUFRfUlNQX09GRlNFVCA5Ci0jZGVmaW5lIEJUQV9ISF9DQUNIRV9SRVBPUlRfVkVSU0lPTiAxCi0jZGVmaW5lIFRIUkVBRF9OT1JNQUxfUFJJT1JJVFkgMAotI2RlZmluZSBCVF9ISF9USFJFQUQgImJ0X2hoX3RocmVhZCIKLQotdm9pZCB1aGlkX3NldF9ub25fYmxvY2tpbmcoaW50IGZkKSB7Ci0gIGludCBvcHRzID0gZmNudGwoZmQsIEZfR0VURkwpOwotICBpZiAob3B0cyA8IDApCi0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXMoKSBHZXR0aW5nIGZsYWdzIGZhaWxlZCAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotCi0gIG9wdHMgfD0gT19OT05CTE9DSzsKLQotICBpZiAoZmNudGwoZmQsIEZfU0VURkwsIG9wdHMpIDwgMCkKLSAgICBBUFBMX1RSQUNFX0VWRU5UKCIlcygpIFNldHRpbmcgbm9uLWJsb2NraW5nIGZsYWcgZmFpbGVkICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLS8qSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSBVSElEIHdyaXRlIGFuZCBlcnJvciBjaGVja2luZyovCi1zdGF0aWMgaW50IHVoaWRfd3JpdGUoaW50IGZkLCBjb25zdCBzdHJ1Y3QgdWhpZF9ldmVudCogZXYpIHsKLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHdyaXRlKGZkLCBldiwgc2l6ZW9mKCpldikpKTsKLQotICBpZiAocmV0IDwgMCkgewotICAgIGludCBydG4gPSAtZXJybm87Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IENhbm5vdCB3cml0ZSB0byB1aGlkOiVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfSBlbHNlIGlmIChyZXQgIT0gKHNzaXplX3Qpc2l6ZW9mKCpldikpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogV3Jvbmcgc2l6ZSB3cml0dGVuIHRvIHVoaWQ6ICV6ZCAhPSAlenUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHJldCwgc2l6ZW9mKCpldikpOwotICAgIHJldHVybiAtRUZBVUxUOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEludGVybmFsIGZ1bmN0aW9uIHRvIHBhcnNlIHRoZSBldmVudHMgcmVjZWl2ZWQgZnJvbSBVSElEIGRyaXZlciovCi1zdGF0aWMgaW50IHVoaWRfcmVhZF9ldmVudChidGlmX2hoX2RldmljZV90KiBwX2RldikgewotICBDSEVDSyhwX2Rldik7Ci0KLSAgc3RydWN0IHVoaWRfZXZlbnQgZXY7Ci0gIG1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwotCi0gIHNzaXplX3QgcmV0OwotICBPU0lfTk9fSU5UUihyZXQgPSByZWFkKHBfZGV2LT5mZCwgJmV2LCBzaXplb2YoZXYpKSk7Ci0KLSAgaWYgKHJldCA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IFJlYWQgSFVQIG9uIHVoaWQtY2RldiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAtRUZBVUxUOwotICB9IGVsc2UgaWYgKHJldCA8IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IHJlYWQgdWhpZC1jZGV2OiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLWVycm5vOwotICB9Ci0KLSAgc3dpdGNoIChldi50eXBlKSB7Ci0gICAgY2FzZSBVSElEX1NUQVJUOgotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiVUhJRF9TVEFSVCBmcm9tIHVoaWQtZGV2XG4iKTsKLSAgICAgIHBfZGV2LT5yZWFkeV9mb3JfZGF0YSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVISURfU1RPUDoKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIlVISURfU1RPUCBmcm9tIHVoaWQtZGV2XG4iKTsKLSAgICAgIHBfZGV2LT5yZWFkeV9mb3JfZGF0YSA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVSElEX09QRU46Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJVSElEX09QRU4gZnJvbSB1aGlkLWRldlxuIik7Ci0gICAgICBwX2Rldi0+cmVhZHlfZm9yX2RhdGEgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVSElEX0NMT1NFOgotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiVUhJRF9DTE9TRSBmcm9tIHVoaWQtZGV2XG4iKTsKLSAgICAgIHBfZGV2LT5yZWFkeV9mb3JfZGF0YSA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVSElEX09VVFBVVDoKLSAgICAgIGlmIChyZXQgPCAoc3NpemVfdCkoc2l6ZW9mKGV2LnR5cGUpICsgc2l6ZW9mKGV2LnUub3V0cHV0KSkpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgc2l6ZSByZWFkIGZyb20gdWhpZC1kZXY6ICV6ZCA8ICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJldCwgc2l6ZW9mKGV2LnR5cGUpICsgc2l6ZW9mKGV2LnUub3V0cHV0KSk7Ci0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgfQotCi0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJVSElEX09VVFBVVDogUmVwb3J0IHR5cGUgPSAlZCwgcmVwb3J0X3NpemUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGV2LnUub3V0cHV0LnJ0eXBlLCBldi51Lm91dHB1dC5zaXplKTsKLSAgICAgIC8vIFNlbmQgU0VUX1JFUE9SVCB3aXRoIGZlYXR1cmUgcmVwb3J0IGlmIHRoZSByZXBvcnQgdHlwZSBpbiBvdXRwdXQgZXZlbnQKLSAgICAgIC8vIGlzIEZFQVRVUkUKLSAgICAgIGlmIChldi51Lm91dHB1dC5ydHlwZSA9PSBVSElEX0ZFQVRVUkVfUkVQT1JUKQotICAgICAgICBidGlmX2hoX3NldHJlcG9ydChwX2RldiwgQlRISF9GRUFUVVJFX1JFUE9SVCwgZXYudS5vdXRwdXQuc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXYudS5vdXRwdXQuZGF0YSk7Ci0gICAgICBlbHNlIGlmIChldi51Lm91dHB1dC5ydHlwZSA9PSBVSElEX09VVFBVVF9SRVBPUlQpCi0gICAgICAgIGJ0aWZfaGhfc2VuZGRhdGEocF9kZXYsIGV2LnUub3V0cHV0LnNpemUsIGV2LnUub3V0cHV0LmRhdGEpOwotICAgICAgZWxzZQotICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogVUhJRF9PVVRQVVQ6IEludmFsaWQgcmVwb3J0IHR5cGUgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnUub3V0cHV0LnJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVUhJRF9PVVRQVVRfRVY6Ci0gICAgICBpZiAocmV0IDwgKHNzaXplX3QpKHNpemVvZihldi50eXBlKSArIHNpemVvZihldi51Lm91dHB1dF9ldikpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIHNpemUgcmVhZCBmcm9tIHVoaWQtZGV2OiAlemQgPCAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGV2LnR5cGUpICsgc2l6ZW9mKGV2LnUub3V0cHV0X2V2KSk7Ci0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgfQotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiVUhJRF9PVVRQVVRfRVYgZnJvbSB1aGlkLWRldlxuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVISURfRkVBVFVSRToKLSAgICAgIGlmIChyZXQgPCAoc3NpemVfdCkoc2l6ZW9mKGV2LnR5cGUpICsgc2l6ZW9mKGV2LnUuZmVhdHVyZSkpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiJXM6IFVISURfRkVBVFVSRTogSW52YWxpZCBzaXplIHJlYWQgZnJvbSB1aGlkLWRldjogJXpkIDwgJXp1IiwKLSAgICAgICAgICAgIF9fZnVuY19fLCByZXQsIHNpemVvZihldi50eXBlKSArIHNpemVvZihldi51LmZlYXR1cmUpKTsKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICB9Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJVSElEX0ZFQVRVUkU6IFJlcG9ydCB0eXBlID0gJWQiLCBldi51LmZlYXR1cmUucnR5cGUpOwotICAgICAgcF9kZXYtPmdldF9ycHRfc250Kys7Ci0gICAgICBpZiAocF9kZXYtPmdldF9ycHRfaWRfcXVldWUpIHsKLSAgICAgICAgdWludDMyX3QqIGdldF9ycHRfaWQgPSAodWludDMyX3QqKW9zaV9tYWxsb2Moc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICAgICpnZXRfcnB0X2lkID0gZXYudS5mZWF0dXJlLmlkOwotICAgICAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfZGV2LT5nZXRfcnB0X2lkX3F1ZXVlLCAodm9pZCopZ2V0X3JwdF9pZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZXYudS5mZWF0dXJlLnJ0eXBlID09IFVISURfRkVBVFVSRV9SRVBPUlQpCi0gICAgICAgIGJ0aWZfaGhfZ2V0cmVwb3J0KHBfZGV2LCBCVEhIX0ZFQVRVUkVfUkVQT1JULCBldi51LmZlYXR1cmUucm51bSwgMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBVSElEX0ZFQVRVUkU6IEludmFsaWQgcmVwb3J0IHR5cGUgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnUuZmVhdHVyZS5ydHlwZSk7Ci0gICAgICBicmVhazsKLSNpZmRlZiBPU19BTkRST0lEICAvLyBIb3N0IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IFVISURfU0VUX1JFUE9SVAotICAgIGNhc2UgVUhJRF9TRVRfUkVQT1JUOgotICAgICAgaWYgKHJldCA8IChzc2l6ZV90KShzaXplb2YoZXYudHlwZSkgKyBzaXplb2YoZXYudS5zZXRfcmVwb3J0KSkpIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBzaXplIHJlYWQgZnJvbSB1aGlkLWRldjogJXpkIDwgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXQsIHNpemVvZihldi50eXBlKSArIHNpemVvZihldi51LnNldF9yZXBvcnQpKTsKLSAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICB9Ci0KLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiVUhJRF9TRVRfUkVQT1JUOiBSZXBvcnQgdHlwZSA9ICVkLCByZXBvcnRfc2l6ZSA9ICVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAsIGV2LnUuc2V0X3JlcG9ydC5ydHlwZSwgZXYudS5zZXRfcmVwb3J0LnNpemUpOwotCi0gICAgICAgIGlmIChldi51LnNldF9yZXBvcnQucnR5cGUgPT0gVUhJRF9GRUFUVVJFX1JFUE9SVCkKLSAgICAgICAgICAgIGJ0aWZfaGhfc2V0cmVwb3J0KHBfZGV2LCBCVEhIX0ZFQVRVUkVfUkVQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYudS5zZXRfcmVwb3J0LnNpemUsIGV2LnUuc2V0X3JlcG9ydC5kYXRhKTsKLSAgICAgICAgZWxzZSBpZiAoZXYudS5zZXRfcmVwb3J0LnJ0eXBlID09IFVISURfT1VUUFVUX1JFUE9SVCkKLSAgICAgICAgICAgIGJ0aWZfaGhfc2V0cmVwb3J0KHBfZGV2LCBCVEhIX09VVFBVVF9SRVBPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi51LnNldF9yZXBvcnQuc2l6ZSwgZXYudS5zZXRfcmVwb3J0LmRhdGEpOwotICAgICAgICBlbHNlIGlmKGV2LnUuc2V0X3JlcG9ydC5ydHlwZSA9PSBVSElEX0lOUFVUX1JFUE9SVCkKLSAgICAgICAgICAgIGJ0aWZfaGhfc2V0cmVwb3J0KHBfZGV2LCBCVEhIX0lOUFVUX1JFUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnUuc2V0X3JlcG9ydC5zaXplLCBldi51LnNldF9yZXBvcnQuZGF0YSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOlVISURfU0VUX1JFUE9SVDogSW52YWxpZCBSZXBvcnQgdHlwZSA9ICVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAsIF9fZnVuY19fLCBldi51LnNldF9yZXBvcnQucnR5cGUpOwotICAgICAgICBicmVhazsKLSNlbmRpZiAgLy8gaWZkZWYgT1NfQU5EUk9JRAotICAgIGRlZmF1bHQ6Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJJbnZhbGlkIGV2ZW50IGZyb20gdWhpZC1kZXY6ICV1XG4iLCBldi50eXBlKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uIGNyZWF0ZV90aHJlYWQKLSAqCi0gKiBEZXNjcmlwdGlvbiBjcmVhdCBhIHNlbGVjdCBsb29wCi0gKgotICogUmV0dXJucyBwdGhyZWFkX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlubGluZSBwdGhyZWFkX3QgY3JlYXRlX3RocmVhZCh2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImNyZWF0ZV90aHJlYWQ6IGVudGVyZWQiKTsKLSAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7Ci0KLSAgcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKLSAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwotICBwdGhyZWFkX3QgdGhyZWFkX2lkID0gLTE7Ci0gIGlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkX2lkLCAmdGhyZWFkX2F0dHIsIHN0YXJ0X3JvdXRpbmUsIGFyZykgIT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoInB0aHJlYWRfY3JlYXRlIDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKCJjcmVhdGVfdGhyZWFkOiB0aHJlYWQgY3JlYXRlZCBzdWNjZXNzZnVsbHkiKTsKLSAgcmV0dXJuIHRocmVhZF9pZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiBidGlmX2hoX3BvbGxfZXZlbnRfdGhyZWFkCi0gKgotICogRGVzY3JpcHRpb24gdGhlIHBvbGxpbmcgdGhyZWFkIHdoaWNoIHBvbGxzIGZvciBldmVudCBmcm9tIFVISUQgZHJpdmVyCi0gKgotICogUmV0dXJucyB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkKiBidGlmX2hoX3BvbGxfZXZlbnRfdGhyZWFkKHZvaWQqIGFyZykgewotICBidGlmX2hoX2RldmljZV90KiBwX2RldiA9IChidGlmX2hoX2RldmljZV90Kilhcmc7Ci0gIHN0cnVjdCBwb2xsZmQgcGZkc1sxXTsKLQotICAvLyBUaGlzIHRocmVhZCBpcyBjcmVhdGVkIGJ5IGJ0X21haW5fdGhyZWFkIHdpdGggUlQgcHJpb3JpdHkuIExvd2VyIHRoZSB0aHJlYWQKLSAgLy8gcHJpb3JpdHkgaGVyZSBzaW5jZSB0aGUgdGFza3MgaW4gdGhpcyB0aHJlYWQgaXMgbm90IHRpbWluZyBjcml0aWNhbC4KLSAgc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkX3BhcmFtczsKLSAgc2NoZWRfcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gVEhSRUFEX05PUk1BTF9QUklPUklUWTsKLSAgaWYgKHNjaGVkX3NldHNjaGVkdWxlcihnZXR0aWQoKSwgU0NIRURfT1RIRVIsICZzY2hlZF9wYXJhbXMpKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEZhaWxlZCB0byBzZXQgdGhyZWFkIHByaW9yaXR5IHRvIG5vcm1hbCIsIF9fZnVuY19fKTsKLSAgICBwX2Rldi0+aGhfcG9sbF90aHJlYWRfaWQgPSAtMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBwX2Rldi0+cGlkID0gZ2V0dGlkKCk7Ci0gIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgQlRfSEhfVEhSRUFEKTsKLSAgTE9HX0RFQlVHKCJIb3N0IGhpZCBwb2xsaW5nIHRocmVhZCBjcmVhdGVkIG5hbWU6JXMgcGlkOiVkIGZkOiVkIiwKLSAgICAgICAgICAgIEJUX0hIX1RIUkVBRCwgcF9kZXYtPnBpZCwgcF9kZXYtPmZkKTsKLQotICBwZmRzWzBdLmZkID0gcF9kZXYtPmZkOwotICBwZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKLQotICAvLyBTZXQgdGhlIHVoaWQgZmQgYXMgbm9uLWJsb2NraW5nIHRvIGVuc3VyZSB3ZSBuZXZlciBibG9jayB0aGUgQlRVIHRocmVhZAotICB1aGlkX3NldF9ub25fYmxvY2tpbmcocF9kZXYtPmZkKTsKLQotICB3aGlsZSAocF9kZXYtPmhoX2tlZXBfcG9sbGluZykgewotICAgIGludCByZXQ7Ci0gICAgT1NJX05PX0lOVFIocmV0ID0gcG9sbChwZmRzLCAxLCA1MCkpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IHBvbGwgZm9yIGZkczogJXNcbiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChwZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBQT0xMSU4iLCBfX2Z1bmNfXyk7Ci0gICAgICByZXQgPSB1aGlkX3JlYWRfZXZlbnQocF9kZXYpOwotICAgICAgaWYgKHJldCAhPSAwKSBicmVhazsKLSAgICB9Ci0gIH0KLQotICBwX2Rldi0+aGhfcG9sbF90aHJlYWRfaWQgPSAtMTsKLSAgcF9kZXYtPnBpZCA9IC0xOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJ0aWZfaGhfY2xvc2VfcG9sbF90aHJlYWQoYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHBfZGV2LT5oaF9rZWVwX3BvbGxpbmcgPSAwOwotICBpZiAocF9kZXYtPmhoX3BvbGxfdGhyZWFkX2lkID4gMCkKLSAgICBwdGhyZWFkX2pvaW4ocF9kZXYtPmhoX3BvbGxfdGhyZWFkX2lkLCBOVUxMKTsKLQotICByZXR1cm47Ci19Ci0KLXZvaWQgYnRhX2hoX2NvX2Rlc3Ryb3koaW50IGZkKSB7Ci0gIHN0cnVjdCB1aGlkX2V2ZW50IGV2OwotICBtZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKLSAgZXYudHlwZSA9IFVISURfREVTVFJPWTsKLSAgdWhpZF93cml0ZShmZCwgJmV2KTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IENsb3NpbmcgZmQ9JWQiLCBfX2Z1bmNfXywgZmQpOwotICBjbG9zZShmZCk7Ci19Ci0KLWludCBidGFfaGhfY29fd3JpdGUoaW50IGZkLCB1aW50OF90KiBycHQsIHVpbnQxNl90IGxlbikgewotICBBUFBMX1RSQUNFX1ZFUkJPU0UoIiVzOiBVSElEIHdyaXRlICVkIiwgX19mdW5jX18sIGxlbik7Ci0KLSAgc3RydWN0IHVoaWRfZXZlbnQgZXY7Ci0gIG1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwotICBldi50eXBlID0gVUhJRF9JTlBVVDsKLSAgZXYudS5pbnB1dC5zaXplID0gbGVuOwotICBpZiAobGVuID4gc2l6ZW9mKGV2LnUuaW5wdXQuZGF0YSkpIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBSZXBvcnQgc2l6ZSBncmVhdGVyIHRoYW4gYWxsb3dlZCBzaXplIiwgX19mdW5jX18pOwotICAgIHJldHVybiAtMTsKLSAgfQotICBtZW1jcHkoZXYudS5pbnB1dC5kYXRhLCBycHQsIGxlbik7Ci0KLSAgcmV0dXJuIHVoaWRfd3JpdGUoZmQsICZldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICBidGFfaGhfY29fb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgV2hlbiBjb25uZWN0aW9uIGlzIG9wZW5lZCwgdGhpcyBjYWxsLW91dCBmdW5jdGlvbiBpcyBleGVjdXRlZAotICogICAgICAgICAgICAgICBieSBISCB0byBkbyBwbGF0Zm9ybSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgIHZvaWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfY29fb3Blbih1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3Qgc3ViX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX0FUVFJfTUFTSyBhdHRyX21hc2ssIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIHVpbnQzMl90IGk7Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2ID0gTlVMTDsKLQotICBpZiAoZGV2X2hhbmRsZSA9PSBCVEFfSEhfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBPb3BzLCBkZXZfaGFuZGxlICglZCkgaXMgaW52YWxpZC4uLiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBkZXZfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgQlRJRl9ISF9NQVhfSElEOyBpKyspIHsKLSAgICBwX2RldiA9ICZidGlmX2hoX2NiLmRldmljZXNbaV07Ci0gICAgaWYgKHBfZGV2LT5kZXZfc3RhdHVzICE9IEJUSEhfQ09OTl9TVEFURV9VTktOT1dOICYmCi0gICAgICAgIHBfZGV2LT5kZXZfaGFuZGxlID09IGRldl9oYW5kbGUpIHsKLSAgICAgIC8vIFdlIGZvdW5kIGEgZGV2aWNlIHdpdGggdGhlIHNhbWUgaGFuZGxlLiBNdXN0IGJlIGEgZGV2aWNlIHJlY29ubmVjdGVkLgotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICIlczogRm91bmQgYW4gZXhpc3RpbmcgZGV2aWNlIHdpdGggdGhlIHNhbWUgaGFuZGxlIGRldl9zdGF0dXM9JWQsICIKLSAgICAgICAgICAiYWRkcmVzcz0lcywgYXR0cl9tYXNrPTB4JTA0eCwgc3ViX2NsYXNzPTB4JTAyeCwgYXBwX2lkPSVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgcF9kZXYtPmRldl9zdGF0dXMsIHBfZGV2LT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICBwX2Rldi0+YXR0cl9tYXNrLCBwX2Rldi0+c3ViX2NsYXNzLCBwX2Rldi0+YXBwX2lkKTsKLQotICAgICAgaWYgKHBfZGV2LT5mZCA8IDApIHsKLSAgICAgICAgcF9kZXYtPmZkID0gb3BlbihkZXZfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKLSAgICAgICAgaWYgKHBfZGV2LT5mZCA8IDApIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRXJyb3I6IGZhaWxlZCB0byBvcGVuIHVoaWQsIGVycjolcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiB1aGlkIGZkID0gJWQiLCBfX2Z1bmNfXywgcF9kZXYtPmZkKTsKLSAgICAgIH0KLQotICAgICAgcF9kZXYtPmhoX2tlZXBfcG9sbGluZyA9IDE7Ci0gICAgICBwX2Rldi0+aGhfcG9sbF90aHJlYWRfaWQgPQotICAgICAgICAgIGNyZWF0ZV90aHJlYWQoYnRpZl9oaF9wb2xsX2V2ZW50X3RocmVhZCwgcF9kZXYpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBfZGV2ID0gTlVMTDsKLSAgfQotCi0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgLy8gRGlkIG5vdCBmaW5kIGEgZGV2aWNlIHJlY29ubmVjdGlvbiBjYXNlLiBGaW5kIGFuIGVtcHR5IHNsb3Qgbm93LgotICAgIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgICAgaWYgKGJ0aWZfaGhfY2IuZGV2aWNlc1tpXS5kZXZfc3RhdHVzID09IEJUSEhfQ09OTl9TVEFURV9VTktOT1dOKSB7Ci0gICAgICAgIHBfZGV2ID0gJmJ0aWZfaGhfY2IuZGV2aWNlc1tpXTsKLSAgICAgICAgcF9kZXYtPmRldl9oYW5kbGUgPSBkZXZfaGFuZGxlOwotICAgICAgICBwX2Rldi0+YXR0cl9tYXNrID0gYXR0cl9tYXNrOwotICAgICAgICBwX2Rldi0+c3ViX2NsYXNzID0gc3ViX2NsYXNzOwotICAgICAgICBwX2Rldi0+YXBwX2lkID0gYXBwX2lkOwotICAgICAgICBwX2Rldi0+bG9jYWxfdnVwID0gZmFsc2U7Ci0KLSAgICAgICAgYnRpZl9oaF9jYi5kZXZpY2VfbnVtKys7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgZGV2aWNlLG9wZW4gdGhlIHVoaWQgZHJpdmVyIG5vdy4KLSAgICAgICAgcF9kZXYtPmZkID0gb3BlbihkZXZfcGF0aCwgT19SRFdSIHwgT19DTE9FWEVDKTsKLSAgICAgICAgaWYgKHBfZGV2LT5mZCA8IDApIHsKLSAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRXJyb3I6IGZhaWxlZCB0byBvcGVuIHVoaWQsIGVycjolcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHVoaWQgZmQgPSAlZCIsIF9fZnVuY19fLCBwX2Rldi0+ZmQpOwotICAgICAgICAgIHBfZGV2LT5oaF9rZWVwX3BvbGxpbmcgPSAxOwotICAgICAgICAgIHBfZGV2LT5oaF9wb2xsX3RocmVhZF9pZCA9Ci0gICAgICAgICAgICAgIGNyZWF0ZV90aHJlYWQoYnRpZl9oaF9wb2xsX2V2ZW50X3RocmVhZCwgcF9kZXYpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRXJyb3I6IHRvbyBtYW55IEhJRCBkZXZpY2VzIGFyZSBjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9kZXYtPmRldl9zdGF0dXMgPSBCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVEVEOwotICBwX2Rldi0+Z2V0X3JwdF9pZF9xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIENIRUNLKHBfZGV2LT5nZXRfcnB0X2lkX3F1ZXVlKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogUmV0dXJuIGRldmljZSBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgcF9kZXYtPmRldl9zdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgYnRhX2hoX2NvX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICBXaGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCB0aGlzIGNhbGwtb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkCi0gKiAgICAgICAgICAgICAgIGJ5IEhIIHRvIGRvIHBsYXRmb3JtIHNwZWNpZmljIGZpbmFsaXphdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgIGRldl9oYW5kbGUgIC0gZGV2aWNlIGhhbmRsZQotICogICAgICAgICAgICAgICAgICBhcHBfaWQgICAgICAtIGFwcGxpY2F0aW9uIGlkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2NvX2Nsb3NlKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsKLSAgdWludDMyX3QgaTsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYgPSBOVUxMOwotCi0gIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IGRldl9oYW5kbGUgPSAlZCwgYXBwX2lkID0gJWQiLCBfX2Z1bmNfXywgZGV2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIGFwcF9pZCk7Ci0gIGlmIChkZXZfaGFuZGxlID09IEJUQV9ISF9JTlZBTElEX0hBTkRMRSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IE9vcHMsIGRldl9oYW5kbGUgKCVkKSBpcyBpbnZhbGlkLi4uIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGRldl9oYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgIHBfZGV2ID0gJmJ0aWZfaGhfY2IuZGV2aWNlc1tpXTsKLSAgICBmaXhlZF9xdWV1ZV9mbHVzaChwX2Rldi0+Z2V0X3JwdF9pZF9xdWV1ZSwgb3NpX2ZyZWUpOwotICAgIGZpeGVkX3F1ZXVlX2ZyZWUocF9kZXYtPmdldF9ycHRfaWRfcXVldWUsIE5VTEwpOwotICAgIHBfZGV2LT5nZXRfcnB0X2lkX3F1ZXVlID0gTlVMTDsKLSAgICBpZiAocF9kZXYtPmRldl9zdGF0dXMgIT0gQlRISF9DT05OX1NUQVRFX1VOS05PV04gJiYKLSAgICAgICAgcF9kZXYtPmRldl9oYW5kbGUgPT0gZGV2X2hhbmRsZSkgewotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICIlczogRm91bmQgYW4gZXhpc3RpbmcgZGV2aWNlIHdpdGggdGhlIHNhbWUgaGFuZGxlICIKLSAgICAgICAgICAiZGV2X3N0YXR1cyA9ICVkLCBkZXZfaGFuZGxlID0lZCIsCi0gICAgICAgICAgX19mdW5jX18sIHBfZGV2LT5kZXZfc3RhdHVzLCBwX2Rldi0+ZGV2X2hhbmRsZSk7Ci0gICAgICBidGlmX2hoX2Nsb3NlX3BvbGxfdGhyZWFkKHBfZGV2KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2NvX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgQlRBIHdoZW4gSElEIGhvc3QgcmVjZWl2ZSBhCi0gKiAgICAgICAgICAgICAgICAgIGRhdGEgcmVwb3J0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgZGV2X2hhbmRsZSAgLSBkZXZpY2UgaGFuZGxlCi0gKiAgICAgICAgICAgICAgICAgICpwX3JwdCAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVwb3J0IGRhdGEKLSAqICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAgLSBsZW5ndGggb2YgcmVwb3J0IGRhdGEKLSAqICAgICAgICAgICAgICAgICAgbW9kZSAgICAgICAgLSBIaWQgaG9zdCBQcm90b2NvbCBNb2RlCi0gKiAgICAgICAgICAgICAgICAgIHN1Yl9jbGFzICAgIC0gRGV2aWNlIFN1YmNsYXNzCi0gKiAgICAgICAgICAgICAgICAgIGFwcF9pZCAgICAgIC0gYXBwbGljYXRpb24gaWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9jb19kYXRhKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCogcF9ycHQsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9QUk9UT19NT0RFIG1vZGUsIHVpbnQ4X3Qgc3ViX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGN0cnlfY29kZSwgVU5VU0VEX0FUVFIgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFwcF9pZCkgewotICBidGlmX2hoX2RldmljZV90KiBwX2RldjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBkZXZfaGFuZGxlID0gJWQsIHN1YmNsYXNzID0gMHglMDJYLCBtb2RlID0gJWQsICIKLSAgICAgICJjdHJ5X2NvZGUgPSAlZCwgYXBwX2lkID0gJWQiLAotICAgICAgX19mdW5jX18sIGRldl9oYW5kbGUsIHN1Yl9jbGFzcywgbW9kZSwgY3RyeV9jb2RlLCBhcHBfaWQpOwotCi0gIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfaGFuZGxlKGRldl9oYW5kbGUpOwotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEVycm9yOiB1bmtub3duIEhJRCBkZXZpY2UgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGRldl9oYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFdhaXQgYSBtYXhpbXVtIG9mIE1BWF9QT0xMSU5HX0FUVEVNUFRTIHggUE9MTElOR19TTEVFUF9EVVJBVElPTiBpbiBjYXNlCi0gIC8vIGRldmljZSBjcmVhdGlvbiBpcyBwZW5kaW5nLgotICBpZiAocF9kZXYtPmZkID49IDApIHsKLSAgICB1aW50MzJfdCBwb2xsaW5nX2F0dGVtcHRzID0gMDsKLSAgICB3aGlsZSAoIXBfZGV2LT5yZWFkeV9mb3JfZGF0YSAmJgotICAgICAgICAgICBwb2xsaW5nX2F0dGVtcHRzKysgPCBCVElGX0hIX01BWF9QT0xMSU5HX0FUVEVNUFRTKSB7Ci0gICAgICB1c2xlZXAoQlRJRl9ISF9QT0xMSU5HX1NMRUVQX0RVUkFUSU9OX1VTKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTZW5kIHRoZSBISUQgZGF0YSB0byB0aGUga2VybmVsLgotICBpZiAoKHBfZGV2LT5mZCA+PSAwKSAmJiBwX2Rldi0+cmVhZHlfZm9yX2RhdGEpIHsKLSAgICBidGFfaGhfY29fd3JpdGUocF9kZXYtPmZkLCBwX3JwdCwgbGVuKTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBFcnJvcjogZmQgPSAlZCwgcmVhZHkgJWQsIGxlbiA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5mZCwgcF9kZXYtPnJlYWR5X2Zvcl9kYXRhLCBsZW4pOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfY29fc2VuZF9oaWRfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYnRpZl9oaC5jIHRvIHByb2Nlc3MgRFNDUAotICogICAgICAgICAgICAgICAgICByZWNlaXZlZC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGRldl9oYW5kbGUgIC0gZGV2aWNlIGhhbmRsZQotICogICAgICAgICAgICAgICAgICBkc2NwX2xlbiAgICAtIHJlcG9ydCBkZXNjcmlwdG9yIGxlbmd0aAotICogICAgICAgICAgICAgICAgICAqcF9kc2NwICAgICAtIHJlcG9ydCBkZXNjcmlwdG9yCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfY29fc2VuZF9oaWRfaW5mbyhidGlmX2hoX2RldmljZV90KiBwX2RldiwgY29uc3QgY2hhciogZGV2X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZlbmRvcl9pZCwgdWludDE2X3QgcHJvZHVjdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmVyc2lvbiwgdWludDhfdCBjdHJ5X2NvZGUsIGludCBkc2NwX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kc2NwKSB7Ci0gIGludCByZXN1bHQ7Ci0gIHN0cnVjdCB1aGlkX2V2ZW50IGV2OwotCi0gIGlmIChwX2Rldi0+ZmQgPCAwKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogRXJyb3I6IGZkID0gJWQsIGRzY3BfbGVuID0gJWQiLCBfX2Z1bmNfXywgcF9kZXYtPmZkLAotICAgICAgICAgICAgICAgICAgICAgICBkc2NwX2xlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogZmQgPSAlZCwgbmFtZSA9IFslc10sIGRzY3BfbGVuID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5mZCwgZGV2X25hbWUsIGRzY3BfbGVuKTsKLSAgQVBQTF9UUkFDRV9XQVJOSU5HKAotICAgICAgIiVzOiB2ZW5kb3JfaWQgPSAweCUwNHgsIHByb2R1Y3RfaWQgPSAweCUwNHgsIHZlcnNpb249IDB4JTA0eCwiCi0gICAgICAiY3RyeV9jb2RlPTB4JTAyeCIsCi0gICAgICBfX2Z1bmNfXywgdmVuZG9yX2lkLCBwcm9kdWN0X2lkLCB2ZXJzaW9uLCBjdHJ5X2NvZGUpOwotCi0gIC8vIENyZWF0ZSBhbmQgc2VuZCBoaWQgZGVzY3JpcHRvciB0byBrZXJuZWwKLSAgbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7Ci0gIGV2LnR5cGUgPSBVSElEX0NSRUFURTsKLSAgc3RybGNweSgoY2hhciopZXYudS5jcmVhdGUubmFtZSwgZGV2X25hbWUsIHNpemVvZihldi51LmNyZWF0ZS5uYW1lKSk7Ci0gIHNucHJpbnRmKChjaGFyKilldi51LmNyZWF0ZS51bmlxLCBzaXplb2YoZXYudS5jcmVhdGUudW5pcSksICIlcyIsCi0gICAgICAgICAgIHBfZGV2LT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGV2LnUuY3JlYXRlLnJkX3NpemUgPSBkc2NwX2xlbjsKLSAgZXYudS5jcmVhdGUucmRfZGF0YSA9IHBfZHNjcDsKLSAgZXYudS5jcmVhdGUuYnVzID0gQlVTX0JMVUVUT09USDsKLSAgZXYudS5jcmVhdGUudmVuZG9yID0gdmVuZG9yX2lkOwotICBldi51LmNyZWF0ZS5wcm9kdWN0ID0gcHJvZHVjdF9pZDsKLSAgZXYudS5jcmVhdGUudmVyc2lvbiA9IHZlcnNpb247Ci0gIGV2LnUuY3JlYXRlLmNvdW50cnkgPSBjdHJ5X2NvZGU7Ci0gIHJlc3VsdCA9IHVoaWRfd3JpdGUocF9kZXYtPmZkLCAmZXYpOwotCi0gIEFQUExfVFJBQ0VfV0FSTklORygKLSAgICAgICIlczogd3JvdGUgZGVzY3JpcHRvciB0byBmZCA9ICVkLCBkc2NwX2xlbiA9ICVkLCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLAotICAgICAgcF9kZXYtPmZkLCBkc2NwX2xlbiwgcmVzdWx0KTsKLQotICBpZiAocmVzdWx0KSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogRXJyb3I6IGZhaWxlZCB0byBzZW5kIERTQ1AsIHJlc3VsdCA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0KLSAgICAvKiBUaGUgSElEIHJlcG9ydCBkZXNjcmlwdG9yIGlzIGNvcnJ1cHRlZC4gQ2xvc2UgdGhlIGRyaXZlci4gKi8KLSAgICBjbG9zZShwX2Rldi0+ZmQpOwotICAgIHBfZGV2LT5mZCA9IC0xOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfY29fc2V0X3JwdF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBISCB3aGVuIFNldCBSZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgaXMgcmVjZWl2ZWQgb24gQ29udHJvbCBDaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfaGhfY29fc2V0X3JwdF9yc3AodWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IHN0YXR1cykgewotICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRXJyb3I6IFVISURfU0VUX1JFUE9SVF9SRVBMWSBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2NvX2dldF9ycHRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgSEggd2hlbiBHZXQgUmVwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIGlzIHJlY2VpdmVkIG9uIENvbnRyb2wgQ2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2hoX2NvX2dldF9ycHRfcnNwKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3QqIHBfcnB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIHN0cnVjdCB1aGlkX2V2ZW50IGV2OwotICBidGlmX2hoX2RldmljZV90KiBwX2RldjsKLQotICBBUFBMX1RSQUNFX1ZFUkJPU0UoIiVzOiBkZXZfaGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgZGV2X2hhbmRsZSk7Ci0KLSAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9oYW5kbGUoZGV2X2hhbmRsZSk7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogRXJyb3I6IHVua25vd24gSElEIGRldmljZSBoYW5kbGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgZGV2X2hhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFwX2Rldi0+Z2V0X3JwdF9pZF9xdWV1ZSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEVycm9yOiBtaXNzaW5nIFVISURfR0VUX1JFUE9SVCBpZCBxdWV1ZSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTZW5kIHRoZSBISUQgcmVwb3J0IHRvIHRoZSBrZXJuZWwuCi0gIGlmIChwX2Rldi0+ZmQgPj0gMCAmJiBwX2Rldi0+Z2V0X3JwdF9zbnQgPiAwICYmIHBfZGV2LT5nZXRfcnB0X3NudC0tKSB7Ci0gICAgdWludDMyX3QqIGdldF9ycHRfaWQgPQotICAgICAgICAodWludDMyX3QqKWZpeGVkX3F1ZXVlX2RlcXVldWUocF9kZXYtPmdldF9ycHRfaWRfcXVldWUpOwotICAgIG1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwotICAgIGV2LnR5cGUgPSBVSElEX0ZFQVRVUkVfQU5TV0VSOwotICAgIGV2LnUuZmVhdHVyZV9hbnN3ZXIuaWQgPSAqZ2V0X3JwdF9pZDsKLSAgICBldi51LmZlYXR1cmVfYW5zd2VyLmVyciA9IHN0YXR1czsKLSAgICBldi51LmZlYXR1cmVfYW5zd2VyLnNpemUgPSBsZW47Ci0gICAgb3NpX2ZyZWUoZ2V0X3JwdF9pZCk7Ci0gICAgaWYgKGxlbiA+IDApIHsKLSAgICAgIGlmIChsZW4gPiBVSElEX0RBVEFfTUFYKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IFJlcG9ydCBzaXplIGdyZWF0ZXIgdGhhbiBhbGxvd2VkIHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBtZW1jcHkoZXYudS5mZWF0dXJlX2Fuc3dlci5kYXRhLCBwX3JwdCArIEdFVF9SUFRfUlNQX09GRlNFVCwgbGVuKTsKLSAgICAgIHVoaWRfd3JpdGUocF9kZXYtPmZkLCAmZXYpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2hoX2xlX2NvX3JwdF9pbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxvdXQgZnVuY3Rpb24gaXMgdG8gY29udmV5IHRoZSByZXBvcnQgaW5mb3JtYXRpb24gb24KLSAqICAgICAgICAgICAgICAgICAgYSBIT0dQIGRldmljZSB0byB0aGUgYXBwbGljYXRpb24uIEFwcGxpY2F0aW9uIGNhbiBzYXZlIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaW4gTlYgaWYgZGV2aWNlIGlzIGJvbmRlZCBhbmQgbG9hZCBpdCBiYWNrIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgc3RhY2sgcmVib290LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcmVtb3RlX2JkYSAgLSByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgcF9lbnRyeSAgICAgLSByZXBvcnQgZW50cnkgcG9pbnRlcgotICogICAgICAgICAgICAgICAgICBhcHBfaWQgICAgICAtIGFwcGxpY2F0aW9uIGlkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9sZV9jb19ycHRfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkqIHBfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCkgewotICB1bnNpZ25lZCBpZHggPSAwOwotCi0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSByZW1vdGVfYmRhLlRvU3RyaW5nKCk7Ci0gIGNvbnN0IGNoYXIqIGJkc3RyID0gYWRkcnN0ci5jX3N0cigpOwotCi0gIHNpemVfdCBsZW4gPSBidGlmX2NvbmZpZ19nZXRfYmluX2xlbmd0aChiZHN0ciwgIkhpZFJlcG9ydCIpOwotICBpZiAobGVuID49IHNpemVvZih0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSkgJiYgbGVuIDw9IHNpemVvZihzUmVwb3J0Q2FjaGUpKSB7Ci0gICAgYnRpZl9jb25maWdfZ2V0X2JpbihiZHN0ciwgIkhpZFJlcG9ydCIsICh1aW50OF90KilzUmVwb3J0Q2FjaGUsICZsZW4pOwotICAgIGlkeCA9IGxlbiAvIHNpemVvZih0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSk7Ci0gIH0KLQotICBpZiAoaWR4IDwgQlRBX0hIX05WX0xPQURfTUFYKSB7Ci0gICAgbWVtY3B5KCZzUmVwb3J0Q2FjaGVbaWR4KytdLCBwX2VudHJ5LCBzaXplb2YodEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkpKTsKLSAgICBidGlmX2NvbmZpZ19zZXRfYmluKGJkc3RyLCAiSGlkUmVwb3J0IiwgKGNvbnN0IHVpbnQ4X3QqKXNSZXBvcnRDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkeCAqIHNpemVvZih0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSkpOwotICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJIaWRSZXBvcnRWZXJzaW9uIiwgQlRBX0hIX0NBQ0hFX1JFUE9SVF9WRVJTSU9OKTsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcygpIC0gU2F2aW5nIHJlcG9ydDsgZGV2PSVzLCBpZHg9JWQiLCBfX2Z1bmNfXywgYmRzdHIsCi0gICAgICAgICAgICAgICAgICAgICBpZHgpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGhfbGVfY29fY2FjaGVfbG9hZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsb3V0IGZ1bmN0aW9uIGlzIHRvIHJlcXVlc3QgdGhlIGFwcGxpY2F0aW9uIHRvIGxvYWQKLSAqICAgICAgICAgICAgICAgICAgdGhlIGNhY2hlZCBIT0dQIHJlcG9ydCBpZiB0aGVyZSBpcyBhbnkuIFdoZW4gY2FjaGUgcmVhZGluZwotICogICAgICAgICAgICAgICAgICBpcyBjb21wbGV0ZWQsIGJ0YV9oaF9sZV9jb19jYWNoZV9sb2FkKCkgaXMgY2FsbGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHJlbW90ZV9iZGEgIC0gcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfbnVtX3JwdCAgIC0gbnVtYmVyIG9mIGNhY2hlZCByZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgYXBwX2lkICAgICAgLSBhcHBsaWNhdGlvbiBpZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIGNhY2hlZCByZXBvcnQgYXJyYXkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkqIGJ0YV9oaF9sZV9jb19jYWNoZV9sb2FkKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fcnB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSByZW1vdGVfYmRhLlRvU3RyaW5nKCk7Ci0gIGNvbnN0IGNoYXIqIGJkc3RyID0gYWRkcnN0ci5jX3N0cigpOwotCi0gIHNpemVfdCBsZW4gPSBidGlmX2NvbmZpZ19nZXRfYmluX2xlbmd0aChiZHN0ciwgIkhpZFJlcG9ydCIpOwotICBpZiAoIXBfbnVtX3JwdCB8fCBsZW4gPCBzaXplb2YodEJUQV9ISF9SUFRfQ0FDSEVfRU5UUlkpKSByZXR1cm4gTlVMTDsKLQotICBpZiAobGVuID4gc2l6ZW9mKHNSZXBvcnRDYWNoZSkpIGxlbiA9IHNpemVvZihzUmVwb3J0Q2FjaGUpOwotICBidGlmX2NvbmZpZ19nZXRfYmluKGJkc3RyLCAiSGlkUmVwb3J0IiwgKHVpbnQ4X3QqKXNSZXBvcnRDYWNoZSwgJmxlbik7Ci0KLSAgaW50IGNhY2hlX3ZlcnNpb24gPSAtMTsKLSAgYnRpZl9jb25maWdfZ2V0X2ludChiZHN0ciwgIkhpZFJlcG9ydFZlcnNpb24iLCAmY2FjaGVfdmVyc2lvbik7Ci0KLSAgaWYgKGNhY2hlX3ZlcnNpb24gIT0gQlRBX0hIX0NBQ0hFX1JFUE9SVF9WRVJTSU9OKSB7Ci0gICAgYnRhX2hoX2xlX2NvX3Jlc2V0X3JwdF9jYWNoZShyZW1vdGVfYmRhLCBhcHBfaWQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgKnBfbnVtX3JwdCA9IGxlbiAvIHNpemVvZih0QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSk7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMoKSAtIExvYWRlZCAlZCByZXBvcnRzOyBkZXY9JXMiLCBfX2Z1bmNfXywgKnBfbnVtX3JwdCwKLSAgICAgICAgICAgICAgICAgICBiZHN0cik7Ci0KLSAgcmV0dXJuIHNSZXBvcnRDYWNoZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9oaF9sZV9jb19yZXNldF9ycHRfY2FjaGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbG91dCBmdW5jdGlvbiBpcyB0byByZXNldCB0aGUgSE9HUCBkZXZpY2UgY2FjaGUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICByZW1vdGVfYmRhICAtIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9oaF9sZV9jb19yZXNldF9ycHRfY2FjaGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCkgewotICBzdGQ6OnN0cmluZyBhZGRyc3RyID0gcmVtb3RlX2JkYS5Ub1N0cmluZygpOwotICBjb25zdCBjaGFyKiBiZHN0ciA9IGFkZHJzdHIuY19zdHIoKTsKLQotICBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsICJIaWRSZXBvcnQiKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkUmVwb3J0VmVyc2lvbiIpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlcygpIC0gUmVzZXQgY2FjaGUgZm9yIGJkYSAlcyIsIF9fZnVuY19fLCBiZHN0cik7Ci19CmRpZmYgLS1naXQgYS9idGlmL2NvL2J0YV9wYW5fY28uY2MgYi9idGlmL2NvL2J0YV9wYW5fY28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTRlMzcuLjAwMDAwMDAKLS0tIGEvYnRpZi9jby9idGFfcGFuX2NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRhX3Bhbl9jby5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIFBBTiBzdGFjayBjYWxsb3V0IGFwaQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgImJ0YV9wYW5fY28uaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3Bhbi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9wYW5fYXBpLmgiCi0jaW5jbHVkZSAiYnRhX3Bhbl9jaS5oIgotI2luY2x1ZGUgImJ0aWZfcGFuX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiYnRpZl9zb2NrX3RocmVhZC5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInBhbl9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NvX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIERhdGEgZmxvdyBtYXNrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGJ0YV9wYW5fY29faW5pdCh1aW50OF90KiBxX2xldmVsKSB7Ci0gIEJUSUZfVFJBQ0VfQVBJKCJidGFfcGFuX2NvX2luaXQiKTsKLQotICAvKiBzZXQgdGhlIHFfbGV2ZWwgdG8gMzAgYnVmZmVycyAqLwotICAqcV9sZXZlbCA9IDMwOwotCi0gIC8vIHJldHVybiAoQlRBX1BBTl9SWF9QVUxMIHwgQlRBX1BBTl9UWF9QVUxMKTsKLSAgcmV0dXJuIChCVEFfUEFOX1JYX1BVU0hfQlVGIHwgQlRBX1BBTl9SWF9QVVNIIHwgQlRBX1BBTl9UWF9QVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY29fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFBBTiB3aGVuIGEgY29ubmVjdGlvbiB0byBhCi0gKiAgICAgICAgICAgICAgICAgIHBlZXIgaXMgY2xvc2VkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfcGFuX2NvX2Nsb3NlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsKLSAgQlRJRl9UUkFDRV9BUEkoImJ0YV9wYW5fY29fY2xvc2U6YXBwX2lkOiVkLCBoYW5kbGU6JWQiLCBhcHBfaWQsIGhhbmRsZSk7Ci0gIGJ0cGFuX2Nvbm5fdCogY29ubiA9IGJ0cGFuX2ZpbmRfY29ubl9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKGNvbm4gJiYgY29ubi0+c3RhdGUgPT0gUEFOX1NUQVRFX09QRU4pIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCJidGFfcGFuX2NvX2Nsb3NlIik7Ci0KLSAgICAvLyBsZXQgYnRhIGNsb3NlIGV2ZW50IHJlc2V0IHRoaXMgaGFuZGxlIGFzIGl0IG5lZWRzCi0gICAgLy8gdGhlIGhhbmRsZSB0byBmaW5kIHRoZSBjb25uZWN0aW9uIHVwb24gQ0xPU0UKLSAgICAvLyBjb25uLT5oYW5kbGUgPSAtMTsKLSAgICBjb25uLT5zdGF0ZSA9IFBBTl9TVEFURV9DTE9TRTsKLSAgICBidHBhbl9jYi5vcGVuX2NvdW50LS07Ci0KLSAgICBpZiAoYnRwYW5fY2Iub3Blbl9jb3VudCA9PSAwICYmIGJ0cGFuX2NiLnRhcF9mZCAhPSAtMSkgewotICAgICAgYnRwYW5fdGFwX2Nsb3NlKGJ0cGFuX2NiLnRhcF9mZCk7Ci0gICAgICBidHBhbl9jYi50YXBfZmQgPSAtMTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9wYW5fY29fdHhfcGF0aAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgUEFOIHRvIHRyYW5zZmVyIGRhdGEgb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIFRYIHBhdGg7IHRoYXQgaXMsIGRhdGEgYmVpbmcgc2VudCBmcm9tIEJUQSB0byB0aGUgcGhvbmUuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHRoZSBUWCBkYXRhIHBhdGggaXMgY29uZmlndXJlZAotICogICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIHB1bGwgaW50ZXJmYWNlLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCB0eXBpY2FsbHkgY2FsbCBCbHVldG9vdGggc3RhY2sgZnVuY3Rpb25zCi0gKiAgICAgICAgICAgICAgICAgIFBPUlRfUmVhZCgpIG9yIFBPUlRfUmVhZERhdGEoKSB0byByZWFkIGRhdGEgZnJvbSBSRkNPTU0KLSAqICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBzZW5kIGRhdGEgdGhhdAotICogICAgICAgICAgICAgICAgICBkYXRhIHRvIHRoZSBwaG9uZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jb190eF9wYXRoKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgUmF3QWRkcmVzcyBzcmM7Ci0gIFJhd0FkZHJlc3MgZHN0OwotICB1aW50MTZfdCBwcm90b2NvbDsKLSAgYm9vbCBleHQ7Ci0gIGJvb2wgZm9yd2FyZDsKLQotICBCVElGX1RSQUNFX0FQSSgiJXMsIGhhbmRsZTolZCwgYXBwX2lkOiVkIiwgX19mdW5jX18sIGhhbmRsZSwgYXBwX2lkKTsKLQotICBidHBhbl9jb25uX3QqIGNvbm4gPSBidHBhbl9maW5kX2Nvbm5faGFuZGxlKGhhbmRsZSk7Ci0gIGlmICghY29ubikgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBwYW4gY29ubmVjdGlvbiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAoY29ubi0+c3RhdGUgIT0gUEFOX1NUQVRFX09QRU4pIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogY29ubiBpcyBub3Qgb3BlbmVkLCBjb25uOiVwLCBjb25uLT5zdGF0ZTolZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29ubiwgY29ubi0+c3RhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRvIHsKLSAgICAvKiByZWFkIG5leHQgZGF0YSBidWZmZXIgZnJvbSBwYW4gKi8KLSAgICBwX2J1ZiA9IGJ0YV9wYW5fY2lfcmVhZGJ1ZihoYW5kbGUsIHNyYywgZHN0LCAmcHJvdG9jb2wsICZleHQsICZmb3J3YXJkKTsKLSAgICBpZiAocF9idWYpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIiVzLCBjYWxsaW5nIGJ0YXBwX3RhcF9zZW5kLCAiCi0gICAgICAgICAgInBfYnVmLT5sZW46JWQsIG9mZnNldDolZCIsCi0gICAgICAgICAgX19mdW5jX18sIHBfYnVmLT5sZW4sIHBfYnVmLT5vZmZzZXQpOwotICAgICAgaWYgKGlzX2VtcHR5X2V0aF9hZGRyKGNvbm4tPmV0aF9hZGRyKSAmJiBpc192YWxpZF9idF9ldGhfYWRkcihzcmMpKSB7Ci0gICAgICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBwYW4gYnQgcGVlciBhZGRyOiAiIDw8IGNvbm4tPnBlZXIKLSAgICAgICAgICAgICAgICA8PCAiIHVwZGF0ZSBpdHMgZXRoZXJuZXQgYWRkcjogIiA8PCBzcmM7Ci0gICAgICAgIGNvbm4tPmV0aF9hZGRyID0gc3JjOwotICAgICAgfQotICAgICAgYnRwYW5fdGFwX3NlbmQoYnRwYW5fY2IudGFwX2ZkLCBzcmMsIGRzdCwgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAoY2hhciopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2J1Zi0+bGVuLCBleHQsCi0gICAgICAgICAgICAgICAgICAgICBmb3J3YXJkKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9Ci0KLSAgfSB3aGlsZSAocF9idWYgIT0gTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NvX3J4X3BhdGgKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY29fcnhfcGF0aChVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCkgewotICBCVElGX1RSQUNFX0FQSSgiYnRhX3Bhbl9jb19yeF9wYXRoIG5vdCB1c2VkIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NvX3J4X2Zsb3cKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFBBTiB0byBlbmFibGUgb3IgZGlzYWJsZQotICogICAgICAgICAgICAgICAgICBkYXRhIGZsb3cgb24gdGhlIFJYIHBhdGggd2hlbiBpdCBpcyBjb25maWd1cmVkIHRvIHVzZQotICogICAgICAgICAgICAgICAgICBhIHB1c2ggaW50ZXJmYWNlLiAgSWYgZGF0YSBmbG93IGlzIGRpc2FibGVkIHRoZSBwaG9uZSBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIG5vdCBjYWxsIGJ0YV9wYW5fY2lfcnhfd3JpdGUoKSBvciBidGFfcGFuX2NpX3J4X3dyaXRlYnVmKCkKLSAqICAgICAgICAgICAgICAgICAgdW50aWwgZGF0YSBmbG93IGlzIGVuYWJsZWQgYWdhaW4uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9wYW5fY29fcnhfZmxvdyhVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsIFVOVVNFRF9BVFRSIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYm9vbCBlbmFibGUpIHsKLSAgQlRJRl9UUkFDRV9BUEkoImJ0YV9wYW5fY29fcnhfZmxvdywgZW5hYmxlZDolZCwgbm90IHVzZWQiLCBlbmFibGUpOwotICBidHBhbl9jb25uX3QqIGNvbm4gPSBidHBhbl9maW5kX2Nvbm5faGFuZGxlKGhhbmRsZSk7Ci0gIGlmICghY29ubiB8fCBjb25uLT5zdGF0ZSAhPSBQQU5fU1RBVEVfT1BFTikgcmV0dXJuOwotICBidHBhbl9zZXRfZmxvd19jb250cm9sKGVuYWJsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcGFuX2NvX2ZpbHRfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBwcm90b2NvbCBmaWx0ZXIgaW5kaWNhdGlvbiBmcm9tIHBlZXIgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jb19wZmlsdF9pbmQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9maWx0ZXJzKSB7Ci0gIEJUSUZfVFJBQ0VfQVBJKCJidGFfcGFuX2NvX3BmaWx0X2luZCIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3Bhbl9jb19tZmlsdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIG11bHRpY2FzdCBmaWx0ZXIgaW5kaWNhdGlvbiBmcm9tIHBlZXIgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3Bhbl9jb19tZmlsdF9pbmQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9maWx0ZXJzKSB7Ci0gIEJUSUZfVFJBQ0VfQVBJKCJidGFfcGFuX2NvX21maWx0X2luZCIpOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfYTJkcC5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfYTJkcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQ5NTYxLi4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2EyZHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfQTJEUF9ICi0jZGVmaW5lIEJUSUZfQTJEUF9ICi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXZfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gUHJvY2VzcyAnaWRsZScgcmVxdWVzdCBmcm9tIHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgZHVyaW5nIGluaXRpYWxpemF0aW9uLgotdm9pZCBidGlmX2EyZHBfb25faWRsZSh2b2lkKTsKLQotLy8gUHJvY2VzcyAnc3RhcnQnIHJlcXVlc3QgZnJvbSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIHByZXBhcmUgZm9yIEEyRFAKLS8vIHN0cmVhbWluZy4KLS8vIHxwZWVyX2FkZHJ8IGlzIHRoZSBwZWVyIGFkZHJlc3MuCi0vLyB8cF9hdl9zdGFydHwgaXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IC0gc2VlIHx0QlRBX0FWX1NUQVJUfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhbiBBQ0sgZm9yIHRoZSBsb2NhbCBjb21tYW5kIHdhcyBzZW50LCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIGJ0aWZfYTJkcF9vbl9zdGFydGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwgdEJUQV9BVl9TVEFSVCogcF9hdl9zdGFydCk7Ci0KLS8vIFByb2Nlc3MgJ3N0b3AnIHJlcXVlc3QgZnJvbSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIHN0b3AgQTJEUCBzdHJlYW1pbmcuCi0vLyB8cF9hdl9zdXNwZW5kfCBpcyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QgLSBzZWUKLS8vIHx0QlRBX0FWX1NVU1BFTkR8Lgotdm9pZCBidGlmX2EyZHBfb25fc3RvcHBlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCk7Ci0KLS8vIFByb2Nlc3MgJ3N1c3BlbmQnIHJlcXVlc3QgZnJvbSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIHN1c3BlbmQgQTJEUAotLy8gc3RyZWFtaW5nLgotLy8gfHBfYXZfc3VzcGVuZHwgaXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IC0gc2VlCi0vLyB8dEJUQV9BVl9TVVNQRU5EfC4KLXZvaWQgYnRpZl9hMmRwX29uX3N1c3BlbmRlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCk7Ci0KLS8vIFByb2Nlc3MgJ29mZmxvYWQgc3RhcnQnIHJlcXVlc3QgZnJvbSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIHN0YXJ0Ci0vLyBvZmZsb2FkaW5nIG9mIHRoZSBBMkRQIHN0cmVhbWluZy4KLS8vIHxwZWVyX2FkZHJ8IGlzIHRoZSBwZWVyIGFkZHJlc3MuCi0vLyB8c3RhdHVzfCBpcyB0aGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIHJlcXVlc3QgcHJpb3IgdG8gdGhpcyBjYWxsLgotLy8gVGhlIHZhbHVlIGNhbiBiZSB8QlRBX0FWX1NVQ0NFU1N8IGlmIHRoZSBwcm9jZXNzaW5nIGhhcyBiZWVuIHN1Y2Nlc3NmdWwKLS8vIHNvIGZhciwgb3IgfEJUQV9BVl9GQUlMKnwgaWYgdGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgZmFpbGVkLgotdm9pZCBidGlmX2EyZHBfb25fb2ZmbG9hZF9zdGFydGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRVUyBzdGF0dXMpOwotCi0vLyBEdW1wIGRlYnVnLXJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBBMkRQIG1vZHVsZS4KLS8vIHxmZHwgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgZm9yIHdyaXRpbmcgdGhlIEFTQ0lJIGZvcm1hdHRlZAotLy8gaW5mb3JtYXRpb24uCi12b2lkIGJ0aWZfZGVidWdfYTJkcF9kdW1wKGludCBmZCk7Ci0KLSNlbmRpZiAvKiBCVElGX0EyRFBfSCAqLwpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfYTJkcF9jb250cm9sLmggYi9idGlmL2luY2x1ZGUvYnRpZl9hMmRwX2NvbnRyb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhMGYxYi4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9hMmRwX2NvbnRyb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfQTJEUF9DT05UUk9MX0gKLSNkZWZpbmUgQlRJRl9BMkRQX0NPTlRST0xfSAotCi0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaCIKLQotLy8gSW5pdGlhbGl6ZSB0aGUgQTJEUCBjb250cm9sIG1vZHVsZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgdGhlCi0vLyBzdGFydHVwIHN0YWdlIG9mIEEyRFAgc3RyZWFtaW5nLgotdm9pZCBidGlmX2EyZHBfY29udHJvbF9pbml0KHZvaWQpOwotCi0vLyBDbGVhbnVwIHRoZSBBMkRQIGNvbnRyb2wgbW9kdWxlLiBJdCBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyB0aGUgc2h1dGRvd24KLS8vIHN0YWdlIG9mIEEyRFAgc3RyZWFtaW5nLgotdm9pZCBidGlmX2EyZHBfY29udHJvbF9jbGVhbnVwKHZvaWQpOwotCi0vLyBBY2tub3dsZWRnZSBBMkRQIGNvbW1hbmQgdG8gdGhlIG9yaWdpbiBvZiBhdWRpbyBzdHJlYW1pbmcuCi0vLyB8c3RhdHVzfCBpcyB0aGUgYWNrbm93bGVkZW1lbnQgc3RhdHVzIC0gc2VlIHx0QTJEUF9DVFJMX0FDS3wuCi12b2lkIGJ0aWZfYTJkcF9jb21tYW5kX2Fjayh0QTJEUF9DVFJMX0FDSyBzdGF0dXMpOwotCi0vLyBJbmNyZW1lbnQgdGhlIHRvdGFsIG51bWJlciBhdWRpbyBkYXRhIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGVuY29kZWQgc2luY2UKLS8vIGxhc3QgZW5jb2RpbmcgYXR0ZW1wdC4KLS8vIHxieXRlc19yZWFkfCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGluY3JlbWVudCBieS4KLXZvaWQgYnRpZl9hMmRwX2NvbnRyb2xfbG9nX2J5dGVzX3JlYWQodWludDMyX3QgYnl0ZXNfcmVhZCk7Ci0KLS8vIFNldCB0aGUgYXVkaW8gZGVsYXkgcmVwb3J0ZWQgdG8gdGhlIGF1ZGlvIEhBTCBpbiB1aW50cyBvZiAxLzEwbXMuCi0vLyB8ZGVsYXl8IGlzIHRoZSBhdWRpbyBkZWxheSB0byBzZXQuCi12b2lkIGJ0aWZfYTJkcF9jb250cm9sX3NldF9hdWRpb19kZWxheSh1aW50MTZfdCBkZWxheSk7Ci0KLS8vIFJlc2V0IHRoZSByZW1vdGUgYXVkaW8gZGV2aWNlJ3MgZGVsYXkgdmFsdWUgYW5kIHJlc2V0IHRoZSBjb3VudGVyIHRoYXQga2VlcHMKLS8vIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gYnl0ZXMgc2VudAotdm9pZCBidGlmX2EyZHBfY29udHJvbF9yZXNldF9hdWRpb19kZWxheSh2b2lkKTsKLQotI2VuZGlmIC8qIEJUSUZfQTJEUF9DT05UUk9MX0ggKi8KZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2EyZHBfc2luay5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfYTJkcF9zaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOThiOWMuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfYTJkcF9zaW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9BMkRQX1NJTktfSAotI2RlZmluZSBCVElGX0EyRFBfU0lOS19ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImF1ZGlvX2EyZHBfaHcvaW5jbHVkZS9hdWRpb19hMmRwX2h3LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8KLS8vIEF1ZGlvIGZvY3VzIHN0YXRlIGZvciBhdWRpbyB0cmFjay4KLS8vCi0vLyBOT1RFOiBUaGUgdmFsdWVzIG11c3QgYmUgc2FtZSBhczoKLS8vICAtIEEyZHBTaW5rU3RyZWFtaW5nU3RhdGVNYWNoaW5lLlNUQVRFX0ZPQ1VTX0xPU1QgPSAwCi0vLyAgLSBBMmRwU2lua1N0cmVhbWluZ1N0YXRlTWFjaGluZS5TVEFURV9GT0NVU19HUkFOVEVEID0gMQotLy8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSUZfQTJEUF9TSU5LX0ZPQ1VTX05PVF9HUkFOVEVEID0gMCwKLSAgQlRJRl9BMkRQX1NJTktfRk9DVVNfR1JBTlRFRCA9IDEKLX0gYnRpZl9hMmRwX3NpbmtfZm9jdXNfc3RhdGVfdDsKLQotLy8gSW5pdGlhbGl6ZSB0aGUgQTJEUCBTaW5rIG1vZHVsZS4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHByaW9yIHRvIHVzaW5nIHRoZQotLy8gbW9kdWxlLgotYm9vbCBidGlmX2EyZHBfc2lua19pbml0KHZvaWQpOwotCi0vLyBTdGFydHVwIHRoZSBBMkRQIFNpbmsgbW9kdWxlLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgYWZ0ZXIKLS8vIGJ0aWZfYTJkcF9zaW5rX2luaXQoKSB0byBwcmVwYXJlIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3NpbmcgYXVkaW8KLS8vIHN0cmVhbWluZy4KLWJvb2wgYnRpZl9hMmRwX3Npbmtfc3RhcnR1cCh2b2lkKTsKLQotLy8gU3RhcnQgdGhlIEEyRFAgU2luayBzZXNzaW9uLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgYWZ0ZXIKLS8vIGJ0aWZfYTJkcF9zaW5rX3N0YXJ0dXAoKSB0byBzdGFydCB0aGUgc3RyZWFtaW5nIHNlc3Npb24gZm9yIHxwZWVyX2FkZHJlc3N8LgotYm9vbCBidGlmX2EyZHBfc2lua19zdGFydF9zZXNzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKTsKLQotLy8gUmVzdGFydCB0aGUgQTJEUCBTaW5rIHNlc3Npb24uCi0vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIEJUSUYgc3RhdGUgbWFjaGluZSBhZnRlcgotLy8gYnRpZl9hMmRwX3Npbmtfc3RhcnR1cCgpIHRvIHJlc3RhcnQgdGhlIHN0cmVhbWluZyBzZXNzaW9uLgotLy8gfG9sZF9wZWVyX2FkZHJlc3N8IGlzIHRoZSBwZWVyIGFkZHJlc3Mgb2YgdGhlIG9sZCBzZXNzaW9uLiBUaGlzIGFkZHJlc3MKLS8vIGNhbiBiZSBlbXB0eS4KLS8vIHxuZXdfcGVlcl9hZGRyZXNzfCBpcyB0aGUgcGVlciBhZGRyZXNzIG9mIHRoZSBuZXcgc2Vzc2lvbi4gVGhpcyBhZGRyZXNzCi0vLyBjYW5ub3QgYmUgZW1wdHkuCi1ib29sIGJ0aWZfYTJkcF9zaW5rX3Jlc3RhcnRfc2Vzc2lvbihjb25zdCBSYXdBZGRyZXNzJiBvbGRfcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbmV3X3BlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpOwotCi0vLyBFbmQgdGhlIEEyRFAgU2luayBzZXNzaW9uLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgdG8gZW5kIHRoZQotLy8gc3RyZWFtaW5nIHNlc3Npb24gZm9yIHxwZWVyX2FkZHJlc3N8LgotYm9vbCBidGlmX2EyZHBfc2lua19lbmRfc2Vzc2lvbihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0vLyBTaHV0ZG93biB0aGUgQTJEUCBTaW5rIG1vZHVsZS4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIGJlZm9yZQotLy8gYnRpZl9hMmRwX3NpbmtfY2xlYW51cCgpIHRvIHNodXRkb3duIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBhdWRpbyBzdHJlYW1pbmcuCi12b2lkIGJ0aWZfYTJkcF9zaW5rX3NodXRkb3duKHZvaWQpOwotCi0vLyBDbGVhbnVwIHRoZSBBMkRQIFNpbmsgbW9kdWxlLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgZHVyaW5nIGdyYWNlZnVsCi0vLyBjbGVhbnVwLgotdm9pZCBidGlmX2EyZHBfc2lua19jbGVhbnVwKHZvaWQpOwotCi0vLyBHZXQgdGhlIGF1ZGlvIHNhbXBsZSByYXRlIGZvciB0aGUgQTJEUCBTaW5rIG1vZHVsZS4KLXRBMkRQX1NBTVBMRV9SQVRFIGJ0aWZfYTJkcF9zaW5rX2dldF9zYW1wbGVfcmF0ZSh2b2lkKTsKLQotLy8gR2V0IHRoZSBhdWRpbyBjaGFubmVsIGNvdW50IGZvciB0aGUgQTJEUCBTaW5rIG1vZHVsZS4KLXRBMkRQX0NIQU5ORUxfQ09VTlQgYnRpZl9hMmRwX3NpbmtfZ2V0X2NoYW5uZWxfY291bnQodm9pZCk7Ci0KLS8vIEdldCB0aGUgYXVkaW8gYml0cyBwZXIgc2FtcGxlIGZvciB0aGUgQTJEUCBTaW5rIG1vZHVsZS4KLXRBMkRQX0JJVFNfUEVSX1NBTVBMRSBidGlmX2EyZHBfc2lua19nZXRfYml0c19wZXJfc2FtcGxlKHZvaWQpOwotCi0vLyBVcGRhdGUgdGhlIGRlY29kZXIgZm9yIHRoZSBBMkRQIFNpbmsgbW9kdWxlLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIG5ldyBjb2RlYyBpbmZvcm1hdGlvbi4KLXZvaWQgYnRpZl9hMmRwX3NpbmtfdXBkYXRlX2RlY29kZXIoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gUHJvY2VzcyAnaWRsZScgcmVxdWVzdCBmcm9tIHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgZHVyaW5nIGluaXRpYWxpemF0aW9uLgotdm9pZCBidGlmX2EyZHBfc2lua19vbl9pZGxlKHZvaWQpOwotCi0vLyBQcm9jZXNzICdzdG9wJyByZXF1ZXN0IGZyb20gdGhlIEJUSUYgc3RhdGUgbWFjaGluZSB0byBzdG9wIEEyRFAgc3RyZWFtaW5nLgotLy8gfHBfYXZfc3VzcGVuZHwgaXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IC0gc2VlCi0vLyB8dEJUQV9BVl9TVVNQRU5EfC4KLXZvaWQgYnRpZl9hMmRwX3Npbmtfb25fc3RvcHBlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCk7Ci0KLS8vIFByb2Nlc3MgJ3N1c3BlbmQnIHJlcXVlc3QgZnJvbSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIHN1c3BlbmQgQTJEUAotLy8gc3RyZWFtaW5nLgotLy8gfHBfYXZfc3VzcGVuZHwgaXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IC0gc2VlCi0vLyB8dEJUQV9BVl9TVVNQRU5EfC4KLXZvaWQgYnRpZl9hMmRwX3Npbmtfb25fc3VzcGVuZGVkKHRCVEFfQVZfU1VTUEVORCogcF9hdl9zdXNwZW5kKTsKLQotLy8gU3RhcnQgdGhlIGRlY29kZXIgZm9yIHRoZSBBMkRQIFNpbmsgbW9kdWxlLgotYm9vbCBidGlmX2EyZHBfc2lua19vbl9zdGFydCh2b2lkKTsKLQotLy8gRW5hYmxlL2Rpc2FibGUgZGlzY2FyZGluZyBvZiByZWNlaXZlZCBBMkRQIGZyYW1lcy4KLS8vIElmIHxlbmFibGV8IGlzIHRydWUsIHRoZSBkaXNjYXJkaW5nIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBpcyBkaXNhYmxlZC4KLXZvaWQgYnRpZl9hMmRwX3Npbmtfc2V0X3J4X2ZsdXNoKGJvb2wgZW5hYmxlKTsKLQotLy8gRW5xdWV1ZSBhIGJ1ZmZlciB0byB0aGUgQTJEUCBTaW5rIHF1ZXVlLiBJZiB0aGUgcXVldWUgaGFzIHJlYWNoZWQgaXRzCi0vLyBtYXhpbXVtIHNpemUgfE1BWF9JTlBVVF9BMkRQX0ZSQU1FX1FVRVVFX1NafCwgdGhlIG9sZGVzdCBidWZmZXIgaXMKLS8vIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuCi0vLyB8cF9idWZ8IGlzIHRoZSBidWZmZXIgdG8gZW5xdWV1ZS4KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBTaW5rIHF1ZXVlIGFmdGVyIHRoZSBlbnF1ZWluZy4KLXVpbnQ4X3QgYnRpZl9hMmRwX3NpbmtfZW5xdWV1ZV9idWYoQlRfSERSKiBwX2J1Zik7Ci0KLS8vIER1bXAgZGVidWctcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIEEyRFAgU2luayBtb2R1bGUuCi0vLyB8ZmR8IGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gdXNlIGZvciB3cml0aW5nIHRoZSBBU0NJSSBmb3JtYXR0ZWQKLS8vIGluZm9ybWF0aW9uLgotdm9pZCBidGlmX2EyZHBfc2lua19kZWJ1Z19kdW1wKGludCBmZCk7Ci0KLS8vIENyZWF0ZSBhIHJlcXVlc3QgdG8gc2V0IHRoZSBhdWRpbyBmb2N1cyBzdGF0ZSBmb3IgdGhlIGF1ZGlvIHRyYWNrLgotLy8gfHN0YXRlfCBpcyB0aGUgbmV3IHN0YXRlIHZhbHVlIC0gc2VlIHxidGlmX2EyZHBfc2lua19mb2N1c19zdGF0ZV90fAotLy8gZm9yIHZhbGlkIHZhbHVlcy4KLXZvaWQgYnRpZl9hMmRwX3Npbmtfc2V0X2ZvY3VzX3N0YXRlX3JlcShidGlmX2EyZHBfc2lua19mb2N1c19zdGF0ZV90IHN0YXRlKTsKLQotLy8gU2V0IHRoZSBhdWRpbyB0cmFjayBnYWluIGZvciB0aGUgYXVkaW8gdHJhY2suCi0vLyB8Z2FpbnwgaXMgdGhlIGF1ZGlvIHRyYWNrIGdhaW4gdmFsdWUgdG8gdXNlLgotdm9pZCBidGlmX2EyZHBfc2lua19zZXRfYXVkaW9fdHJhY2tfZ2FpbihmbG9hdCBnYWluKTsKLQotI2VuZGlmIC8qIEJUSUZfQTJEUF9TSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2EyZHBfc291cmNlLmggYi9idGlmL2luY2x1ZGUvYnRpZl9hMmRwX3NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGI0YjI0Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2EyZHBfc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9BMkRQX1NPVVJDRV9ICi0jZGVmaW5lIEJUSUZfQTJEUF9TT1VSQ0VfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfYXYuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgU291cmNlIG1vZHVsZS4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHByaW9yIHRvIHVzaW5nIHRoZQotLy8gbW9kdWxlLgotYm9vbCBidGlmX2EyZHBfc291cmNlX2luaXQodm9pZCk7Ci0KLS8vIFN0YXJ0dXAgdGhlIEEyRFAgU291cmNlIG1vZHVsZS4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIGFmdGVyCi0vLyBidGlmX2EyZHBfc291cmNlX2luaXQoKSB0byBwcmVwYXJlIHRvIHN0YXJ0IHN0cmVhbWluZy4KLWJvb2wgYnRpZl9hMmRwX3NvdXJjZV9zdGFydHVwKHZvaWQpOwotCi0vLyBTdGFydCB0aGUgQTJEUCBTb3VyY2Ugc2Vzc2lvbi4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIGFmdGVyCi0vLyBidGlmX2EyZHBfc291cmNlX3N0YXJ0dXAoKSB0byBzdGFydCB0aGUgc3RyZWFtaW5nIHNlc3Npb24gZm9yIHxwZWVyX2FkZHJlc3N8LgotYm9vbCBidGlmX2EyZHBfc291cmNlX3N0YXJ0X3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSk7Ci0KLS8vIFJlc3RhcnQgdGhlIEEyRFAgU291cmNlIHNlc3Npb24uCi0vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIEJUSUYgc3RhdGUgbWFjaGluZSBhZnRlcgotLy8gYnRpZl9hMmRwX3NvdXJjZV9zdGFydHVwKCkgdG8gcmVzdGFydCB0aGUgc3RyZWFtaW5nIHNlc3Npb24uCi0vLyB8b2xkX3BlZXJfYWRkcmVzc3wgaXMgdGhlIHBlZXIgYWRkcmVzcyBvZiB0aGUgb2xkIHNlc3Npb24uIFRoaXMgYWRkcmVzcwotLy8gY2FuIGJlIGVtcHR5LgotLy8gfG5ld19wZWVyX2FkZHJlc3N8IGlzIHRoZSBwZWVyIGFkZHJlc3Mgb2YgdGhlIG5ldyBzZXNzaW9uLiBUaGlzIGFkZHJlc3MKLS8vIGNhbm5vdCBiZSBlbXB0eS4KLWJvb2wgYnRpZl9hMmRwX3NvdXJjZV9yZXN0YXJ0X3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgb2xkX3BlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbmV3X3BlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSk7Ci0KLS8vIEVuZCB0aGUgQTJEUCBTb3VyY2Ugc2Vzc2lvbi4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIGVuZCB0aGUKLS8vIHN0cmVhbWluZyBzZXNzaW9uIGZvciB8cGVlcl9hZGRyZXNzfC4KLWJvb2wgYnRpZl9hMmRwX3NvdXJjZV9lbmRfc2Vzc2lvbihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0vLyBTaHV0ZG93biB0aGUgQTJEUCBTb3VyY2UgbW9kdWxlLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgdG8gc3RvcCBzdHJlYW1pbmcuCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2h1dGRvd24odm9pZCk7Ci0KLS8vIENsZWFudXAgdGhlIEEyRFAgU291cmNlIG1vZHVsZS4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIGR1cmluZyBncmFjZWZ1bAotLy8gY2xlYW51cC4KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9jbGVhbnVwKHZvaWQpOwotCi0vLyBDaGVjayB3aGV0aGVyIHRoZSBBMkRQIFNvdXJjZSBtZWRpYSB0YXNrIGlzIHJ1bm5pbmcuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIEEyRFAgU291cmNlIG1lZGlhIHRhc2sgaXMgcnVubmluZywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBidGlmX2EyZHBfc291cmNlX21lZGlhX3Rhc2tfaXNfcnVubmluZyh2b2lkKTsKLQotLy8gQ2hlY2sgd2hldGhlciB0aGUgQTJEUCBTb3VyY2UgbWVkaWEgdGFzayBpcyBzaHV0dGluZyBkb3duLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIFNvdXJjZSBtZWRpYSB0YXNrIGlzIHNodXR0aW5nIGRvd24uCi1ib29sIGJ0aWZfYTJkcF9zb3VyY2VfbWVkaWFfdGFza19pc19zaHV0dGluZ19kb3duKHZvaWQpOwotCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgQTJEUCBTb3VyY2UgbW9kdWxlIGlzIHN0cmVhbWluZy4KLWJvb2wgYnRpZl9hMmRwX3NvdXJjZV9pc19zdHJlYW1pbmcodm9pZCk7Ci0KLS8vIFByb2Nlc3MgYSByZXF1ZXN0IHRvIHN0YXJ0IHRoZSBBMkRQIGF1ZGlvIGVuY29kaW5nIHRhc2suCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnRfYXVkaW9fcmVxKHZvaWQpOwotCi0vLyBQcm9jZXNzIGEgcmVxdWVzdCB0byBzdG9wIHRoZSBBMkRQIGF1ZGlvIGVuY29kaW5nIHRhc2suCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc3RvcF9hdWRpb19yZXEodm9pZCk7Ci0KLS8vIFByb2Nlc3MgYSByZXF1ZXN0IHRvIHVwZGF0ZSB0aGUgQTJEUCBhdWRpbyBlbmNvZGVyIHdpdGggdXNlciBwcmVmZXJyZWQKLS8vIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0vLyBUaGUgcGVlciBhZGRyZXNzIGlzIHxwZWVyX2FkZHJ8LgotLy8gfGNvZGVjX3VzZXJfY29uZmlnfCBjb250YWlucyB0aGUgcHJlZmVycmVkIGNvZGVjIHVzZXIgY29uZmlndXJhdGlvbi4KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9yZXEoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGNvZGVjX3VzZXJfcHJlZmVyZW5jZXMsCi0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSk7Ci0KLS8vIFByb2Nlc3MgYSByZXF1ZXN0IHRvIHVwZGF0ZSB0aGUgQTJEUCBhdWRpbyBlbmNvZGluZyB3aXRoIG5ldyBhdWRpbwotLy8gY29uZmlndXJhdGlvbiBmZWVkaW5nIHBhcmFtZXRlcnMgc3RvcmVkIGluIHxjb2RlY19hdWRpb19jb25maWd8LgotLy8gVGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkIGFyZTogfGNvZGVjX2F1ZGlvX2NvbmZpZy5zYW1wbGVfcmF0ZXwsCi0vLyB8Y29kZWNfYXVkaW9fY29uZmlnLmJpdHNfcGVyX3NhbXBsZXwgYW5kIHxjb2RlY19hdWRpb19jb25maWcuY2hhbm5lbF9tb2RlfC4KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9mZWVkaW5nX3VwZGF0ZV9yZXEoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19hdWRpb19jb25maWcpOwotCi0vLyBQcm9jZXNzICdpZGxlJyByZXF1ZXN0IGZyb20gdGhlIEJUSUYgc3RhdGUgbWFjaGluZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfb25faWRsZSh2b2lkKTsKLQotLy8gUHJvY2VzcyAnc3RvcCcgcmVxdWVzdCBmcm9tIHRoZSBCVElGIHN0YXRlIG1hY2hpbmUgdG8gc3RvcCBBMkRQIHN0cmVhbWluZy4KLS8vIHxwX2F2X3N1c3BlbmR8IGlzIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCAtIHNlZQotLy8gfHRCVEFfQVZfU1VTUEVORHwuCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfb25fc3RvcHBlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCk7Ci0KLS8vIFByb2Nlc3MgJ3N1c3BlbmQnIHJlcXVlc3QgZnJvbSB0aGUgQlRJRiBzdGF0ZSBtYWNoaW5lIHRvIHN1c3BlbmQgQTJEUAotLy8gc3RyZWFtaW5nLgotLy8gfHBfYXZfc3VzcGVuZHwgaXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IC0gc2VlCi0vLyB8dEJUQV9BVl9TVVNQRU5EfC4KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9vbl9zdXNwZW5kZWQodEJUQV9BVl9TVVNQRU5EKiBwX2F2X3N1c3BlbmQpOwotCi0vLyBFbmFibGUvZGlzYWJsZSBkaXNjYXJkaW5nIG9mIHRyYW5zbWl0dGVkIGZyYW1lcy4KLS8vIElmIHxlbmFibGV8IGlzIHRydWUsIHRoZSBkaXNjYXJkaW5nIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBpcyBkaXNhYmxlZC4KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9zZXRfdHhfZmx1c2goYm9vbCBlbmFibGUpOwotCi0vLyBHZXQgdGhlIG5leHQgQTJEUCBidWZmZXIgdG8gc2VuZC4KLS8vIFJldHVybnMgdGhlIG5leHQgQTJEUCBidWZmZXIgdG8gc2VuZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBOVUxMLgotQlRfSERSKiBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3JlYWRidWYodm9pZCk7Ci0KLS8vIER1bXAgZGVidWctcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIEEyRFAgU291cmNlIG1vZHVsZS4KLS8vIHxmZHwgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgZm9yIHdyaXRpbmcgdGhlIEFTQ0lJIGZvcm1hdHRlZAotLy8gaW5mb3JtYXRpb24uCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2VfZGVidWdfZHVtcChpbnQgZmQpOwotCi0vLyBTZXQgdGhlIGR5bmFtaWMgYXVkaW8gYnVmZmVyIHNpemUKLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9zZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSgKLSAgICB1aW50OF90IGR5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUpOwotCi0jZW5kaWYgLyogQlRJRl9BMkRQX1NPVVJDRV9IICovCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9hY2wuaCBiL2J0aWYvaW5jbHVkZS9idGlmX2FjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmE2ZDkzLi4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2FjbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi12b2lkIEJUSUZfZG1fcmVwb3J0X2lucXVpcnlfc3RhdHVzX2NoYW5nZSh1aW50OF90IGJ1c3lfbGV2ZWxfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uaCBiL2J0aWYvaW5jbHVkZS9idGlmX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjU4NTUuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbiB7Ci0KLUFjdGl2aXR5QXR0cmlidXRpb25JbnRlcmZhY2UqIGdldF9hY3Rpdml0eV9hdHRyaWJ1dGlvbl9pbnN0YW5jZSgpOwotCi19Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9hcGkuaCBiL2J0aWYvaW5jbHVkZS9idGlmX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM2NDBhLi4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfYXBpLmgKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgTWFpbiBBUEkgaGVhZGVyIGZpbGUgZm9yIGFsbCBCVElGIGZ1bmN0aW9ucyBhY2Nlc3NlZAotICogICAgICAgICAgICAgICAgIGZyb20gbWFpbiBibHVldG9vdGggSEFMLiBBbGwgSEFMIGV4dGVuc2lvbnMgd2lsbCBub3QKLSAqICAgICAgICAgICAgICAgICByZXF1aXJlIGhlYWRlcmZpbGVzIGFzIHRoZXkgd291bGQgYmUgYWNjZXNzZWQgdGhyb3VnaAotICogICAgICAgICAgICAgICAgIGNhbGxvdXQvY2FsbGlucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfQVBJX0gKLSNkZWZpbmUgQlRJRl9BUElfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfZG0uaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEJUSUYgQ09SRSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2luaXRfYmx1ZXRvb3RoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGVzIEJUSUYgdGFzayBhbmQgcHJlcGFyZXMgQlQgc2NoZWR1bGVyIGZvciBzdGFydHVwCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX2luaXRfYmx1ZXRvb3RoKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9lbmFibGVfYmx1ZXRvb3RoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQZXJmb3JtcyBjaGlwIHBvd2VyIG9uIGFuZCBraWNrc3RhcnRzIE9TIHNjaGVkdWxlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9lbmFibGVfYmx1ZXRvb3RoKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9jbGVhbnVwX2JsdWV0b290aAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xlYW51cCBCVElGIHN0YXRlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9jbGVhbnVwX2JsdWV0b290aCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGlzX3Jlc3RyaWN0ZWRfbW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2tzIGlmIEJUIHdhcyBlbmFibGVkIGluIHJlc3RyaWNlZCBtb2RlLiBJbiByZXN0cmljdGVkCi0gKiAgICAgICAgICAgICAgICAgIG1vZGUsIGJvbmRzIHRoYXQgYXJlIGNyZWF0ZWQgYXJlIG1hcmtlZCBhcyB0ZW1wb3JhcnkuCi0gKiAgICAgICAgICAgICAgICAgIFRoZXNlIGJvbmRzIHBlcnNpc3QgdW50aWwgd2UgbGVhdmUgcmVzdHJpY3RlZCBtb2RlLCBhdAotICogICAgICAgICAgICAgICAgICB3aGljaCBwb2ludCB0aGV5IHdpbGwgYmUgZGVsZXRlZCBmcm9tIHRoZSBjb25maWcuIEFsc28KLSAqICAgICAgICAgICAgICAgICAgd2hpbGUgaW4gcmVzdHJpY3RlZCBtb2RlLCB0aGUgdXNlciBjYW4gYWNjZXNzIGRldmljZXMKLSAqICAgICAgICAgICAgICAgICAgdGhhdCBhcmUgYWxyZWFkeSBwYWlyZWQgYmVmb3JlIGVudGVyaW5nIHJlc3RyaWN0ZWQgbW9kZSwKLSAqICAgICAgICAgICAgICAgICAgYnV0IHRoZXkgY2Fubm90IHJlbW92ZSBhbnkgb2YgdGhlc2UgZGV2aWNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBpc19yZXN0cmljdGVkX21vZGUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBpc19jb21tb25fY3JpdGVyaWFfbW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgQlQgaXMgZW5hYmxlZCBpbiBjb21tb24gY3JpdGVyaWEgbW9kZS4gSW4gdGhpcwotICogICAgICAgICAgICAgICAgICBtb2RlLCB3aWxsIHVzZSB0aGUgTFRLIGZyb20gdGhlIGtleXN0b3JlIHRvIGF1dGhlbnRpY2F0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9jb21tb25fY3JpdGVyaWFfY29uZmlnX2NvbXBhcmVfcmVzdWx0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIGNvbW1vbiBjcml0ZXJpYSBjb25maWcgY29tcGFyZSByZXN1bHQgZm9yIGNvbmZpcm1pbmcKLSAqICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZyBjaGVja3N1bSBjb21wYXJlIHJlc3VsdC4gV2hlbiB0aGUgY29tbW9uIGNyaXRlcmlhCi0gKiAgICAgICAgICAgICAgICAgIG1vZGUgZG9lc24ndCBlbmFibGUsIGl0IHNob3VsZCBiZSBhbGwgcGFzcyAoMGIxMSkuCi0gKiAgICAgICAgICAgICAgICAgIEJpdCBkZWZpbmU6Ci0gKiAgICAgICAgICAgICAgICAgICAgQ09ORklHX0ZJTEVfQ09NUEFSRV9QQVNTID0gMGIwMQotICogICAgICAgICAgICAgICAgICAgIENPTkZJR19CQUNLVVBfQ09NUEFSRV9QQVNTID0gMGIxMAotICoKLSAqIFJldHVybnMgICAgICAgICAgaW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBnZXRfY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGlzX2F0dl9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9jYWwgZGV2aWNlIGlzIGFuIEFuZHJvaWQgVFYKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlLCBmYWxzZSBpZiBpdCBpcyBub3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgaXNfYXR2X2RldmljZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZ2V0X2FkYXB0ZXJfcHJvcGVydGllcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmV0Y2hlcyBhbGwgbG9jYWwgYWRhcHRlciBwcm9wZXJ0aWVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9nZXRfYWRhcHRlcl9wcm9wZXJ0aWVzKHZvaWQpOwotCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9kZWVwX2NvcHkoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2dldF9hZGFwdGVyX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBGZXRjaGVzIHByb3BlcnR5IHZhbHVlIGZyb20gbG9jYWwgY2FjaGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2dldF9hZGFwdGVyX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc2V0X2FkYXB0ZXJfcHJvcGVydHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFVwZGF0ZXMgY29yZSBzdGFjayB3aXRoIHByb3BlcnR5IHZhbHVlIGFuZCBzdG9yZXMgaXQgaW4KLSAqICAgICAgICAgICAgICAgICAgbG9jYWwgY2FjaGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX3NldF9hZGFwdGVyX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZldGNoZXMgdGhlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkgZnJvbSB0aGUgTlZSQU0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KFJhd0FkZHJlc3MgcmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGZXRjaGVzIGFsbCB0aGUgcmVtb3RlIGRldmljZSBwcm9wZXJ0aWVzIGZyb20gTlZSQU0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMoUmF3QWRkcmVzcyByZW1vdGVfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBXcml0ZXMgdGhlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkgdG8gTlZSQU0uCi0gKiAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSwgQlRfUFJPUEVSVFlfUkVNT1RFX0ZSSUVORExZX05BTUUgaXMgdGhlIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGRldmljZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBzZXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBCVElGIERNIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZG1fc3RhcnRfZGlzY292ZXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBkZXZpY2UgZGlzY292ZXJ5L2lucXVpcnkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2RtX3N0YXJ0X2Rpc2NvdmVyeSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZG1fY2FuY2VsX2Rpc2NvdmVyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FuY2VscyBzZWFyY2gKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2RtX2NhbmNlbF9kaXNjb3Zlcnkodm9pZCk7Ci0KLWJvb2wgYnRpZl9kbV9wYWlyaW5nX2lzX2J1c3koKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2NyZWF0ZV9ib25kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWF0ZSBib25kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2RtX2NyZWF0ZV9ib25kKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgaW50IHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2NyZWF0ZV9ib25kX291dF9vZl9iYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWF0ZSBib25kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UgdXNpbmcgT09CIGRhdGEuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kbV9jcmVhdGVfYm9uZF9vdXRfb2ZfYmFuZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCBwMTkyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCBwMjU2X2RhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9jYW5jZWxfYm9uZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhdGUgYm9uZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kbV9jYW5jZWxfYm9uZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9yZW1vdmVfYm9uZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlcyBib25kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2RtX3JlbW92ZV9ib25kKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2dldF9jb25uZWN0aW9uX3N0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW90ZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgMCBpZiBub3QgY29ubmVjdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IGJ0aWZfZG1fZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3Bpbl9yZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlQgbGVnYWN5IHBhaXJpbmcgLSBQSU4gY29kZSByZXBseQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fcGluX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgdWludDhfdCBhY2NlcHQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbiwgYnRfcGluX2NvZGVfdCBwaW5fY29kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3Bhc3NrZXlfcmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUIFNTUCBwYXNza2V5IHJlcGx5Ci0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX2RtX3Bhc3NrZXlfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdWludDhfdCBhY2NlcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc2tleSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3NzcF9yZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlQgU1NQIFJlcGx5IC0gSnVzdCBXb3JrcywgTnVtZXJpYyBDb21wYXJpc29uICYgUGFzc2tleQotICogICAgICAgICAgICAgICAgICBFbnRyeQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fc3NwX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfc3NwX3ZhcmlhbnRfdCB2YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFjY2VwdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2dldF9hZGFwdGVyX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBRdWVyaWVzIHRoZSBCVEEgZm9yIHRoZSBhZGFwdGVyIHByb3BlcnR5Ci0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX2RtX2dldF9hZGFwdGVyX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3QqIHByb3ApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9nZXRfcmVtb3RlX3NlcnZpY2VzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBTRFAgdG8gZ2V0IHJlbW90ZSBzZXJ2aWNlcwotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2RtX2dldF9yZW1vdGVfc2VydmljZXMoY29uc3QgUmF3QWRkcmVzcyByZW1vdGVfYWRkciwgaW50IHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2R1dF9tb2RlX2NvbmZpZ3VyZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29uZmlndXJlIFRlc3QgTW9kZSAtICdlbmFibGUnIHRvIDEgcHV0cyB0aGUgZGV2aWNlIGluIHRlc3QKLSAqICAgICAgICAgICAgICAgICAgbW9kZSBhbmQgMCBleGl0cyB0ZXN0IG1vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2R1dF9tb2RlX2NvbmZpZ3VyZSh1aW50OF90IGVuYWJsZSk7Ci0KLWJvb2wgYnRpZl9pc19kdXRfbW9kZSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kdXRfbW9kZV9zZW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgIFNlbmRzIGEgSENJIFZlbmRvciBzcGVjaWZpYyBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kdXRfbW9kZV9zZW5kKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogYnVmLCB1aW50OF90IGxlbik7Ci0KLXZvaWQgYnRpZl9ibGVfdHJhbnNtaXR0ZXJfdGVzdCh1aW50OF90IHR4X2ZyZXEsIHVpbnQ4X3QgdGVzdF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhY2tldF9wYXlsb2FkKTsKLQotdm9pZCBidGlmX2JsZV9yZWNlaXZlcl90ZXN0KHVpbnQ4X3QgcnhfZnJlcSk7Ci12b2lkIGJ0aWZfYmxlX3Rlc3RfZW5kKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3JlYWRfZW5lcmd5X2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgUmVhZHMgdGhlIGVuZXJneSBpbmZvIGZyb20gY29udHJvbGxlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fcmVhZF9lbmVyZ3lfaW5mbygpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9jb25maWdfaGNpX3Nub29wX2xvZwotICoKLSAqIERlc2NyaXB0aW9uICAgICBlbmFibGUgb3IgZGlzYWJsZSBIQ0kgc25vb3AgbG9nCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfY29uZmlnX2hjaV9zbm9vcF9sb2codWludDhfdCBlbmFibGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kZWJ1Z19ib25kX2V2ZW50X2R1bXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgRHVtcCBib25kIGV2ZW50IGluZm9ybWF0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kZWJ1Z19ib25kX2V2ZW50X2R1bXAoaW50IGZkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgU2V0IGR5bmFtaWMgYXVkaW8gYnVmZmVyIHNpemUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZShpbnQgY29kZWMsIGludCBzaXplKTsKLQotI2VuZGlmIC8qIEJUSUZfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2F2LmggYi9idGlmL2luY2x1ZGUvYnRpZl9hdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTMwOTVlLi4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2F2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBCVElGIEFWIEFQSSBmdW5jdGlvbnMgYWNjZXNzZWQgaW50ZXJuYWxseS4KLSAqLwotCi0jaWZuZGVmIEJUSUZfQVZfSAotI2RlZmluZSBCVElGX0FWX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X2F2LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hdl9hcGkuaCIKLS8vICNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLQotLyoqCi0gKiBXaGVuIHRoZSBsb2NhbCBkZXZpY2UgaXMgQTJEUCBzb3VyY2UsIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYWN0aXZlIHBlZXIuCi0gKi8KLVJhd0FkZHJlc3MgYnRpZl9hdl9zb3VyY2VfYWN0aXZlX3BlZXIodm9pZCk7Ci0KLS8qKgotICogV2hlbiB0aGUgbG9jYWwgZGV2aWNlIGlzIEEyRFAgc2luaywgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBhY3RpdmUgcGVlci4KLSAqLwotUmF3QWRkcmVzcyBidGlmX2F2X3NpbmtfYWN0aXZlX3BlZXIodm9pZCk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciBBMkRQIFNpbmsgaXMgZW5hYmxlZC4KLSAqLwotYm9vbCBidGlmX2F2X2lzX3NpbmtfZW5hYmxlZCh2b2lkKTsKLQotLyoqCi0gKiBTdGFydCBzdHJlYW1pbmcuCi0gKi8KLXZvaWQgYnRpZl9hdl9zdHJlYW1fc3RhcnQodm9pZCk7Ci0KLS8qKgotICogU3RvcCBzdHJlYW1pbmcuCi0gKgotICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzIG9yIFJhd0FkZHJlc3M6OmtFbXB0eSB0byBzdG9wIGFsbCBwZWVycwotICovCi12b2lkIGJ0aWZfYXZfc3RyZWFtX3N0b3AoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotLyoqCi0gKiBTdXNwZW5kIHN0cmVhbWluZy4KLSAqLwotdm9pZCBidGlmX2F2X3N0cmVhbV9zdXNwZW5kKHZvaWQpOwotCi0vKioKLSAqIFN0YXJ0IG9mZmxvYWQgc3RyZWFtaW5nLgotICovCi12b2lkIGJ0aWZfYXZfc3RyZWFtX3N0YXJ0X29mZmxvYWQodm9pZCk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciByZWFkeSB0byBzdGFydCB0aGUgQTJEUCBzdHJlYW0uCi0gKi8KLWJvb2wgYnRpZl9hdl9zdHJlYW1fcmVhZHkodm9pZCk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciB0aGUgQTJEUCBzdHJlYW0gaXMgaW4gc3RhcnRlZCBzdGF0ZSBhbmQgcmVhZHkKLSAqIGZvciBtZWRpYSBzdGFydC4KLSAqLwotYm9vbCBidGlmX2F2X3N0cmVhbV9zdGFydGVkX3JlYWR5KHZvaWQpOwotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBjb25uZWN0ZWQgcGVlciAoZWl0aGVyIFNvdXJjZSBvciBTaW5rKQotICovCi1ib29sIGJ0aWZfYXZfaXNfY29ubmVjdGVkKHZvaWQpOwotCi0vKioKLSAqIEdldCB0aGUgU3RyZWFtIEVuZHBvaW50IFR5cGUgb2YgdGhlIEFjdGl2ZSBwZWVyLgotICoKLSAqIEByZXR1cm4gdGhlIHN0cmVhbSBlbmRwb2ludCB0eXBlOiBlaXRoZXIgQVZEVF9UU0VQX1NSQyBvciBBVkRUX1RTRVBfU05LCi0gKi8KLXVpbnQ4X3QgYnRpZl9hdl9nZXRfcGVlcl9zZXAodm9pZCk7Ci0KLS8qKgotICogQ2xlYXIgdGhlIHJlbW90ZSBzdXNwZW5kZWQgZmxhZyBmb3IgdGhlIGFjdGl2ZSBwZWVyLgotICovCi12b2lkIGJ0aWZfYXZfY2xlYXJfcmVtb3RlX3N1c3BlbmRfZmxhZyh2b2lkKTsKLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIHRoZSBjb25uZWN0ZWQgQTJEUCBwZWVyIHN1cHBvcnRzIEVEUi4KLSAqCi0gKiBUaGUgdmFsdWUgY2FuIGJlIHByb3ZpZGVkIG9ubHkgaWYgdGhlIHJlbW90ZSBwZWVyIGlzIGNvbm5lY3RlZC4KLSAqIE90aGVyd2lzZSwgdGhlIGFuc3dlciB3aWxsIGJlIGFsd2F5cyBmYWxzZS4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVtb3RlIHBlZXIgaXMgY2FwYWJsZSBvZiBFRFIKLSAqLwotYm9vbCBidGlmX2F2X2lzX3BlZXJfZWRyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGVkIEEyRFAgcGVlciBzdXBwb3J0cyAzIE1icHMgRURSLgotICoKLSAqIFRoZSB2YWx1ZSBjYW4gYmUgcHJvdmlkZWQgb25seSBpZiB0aGUgcmVtb3RlIHBlZXIgaXMgY29ubmVjdGVkLgotICogT3RoZXJ3aXNlLCB0aGUgYW5zd2VyIHdpbGwgYmUgYWx3YXlzIGZhbHNlLgotICoKLSAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgYWRkcmVzcwotICogQHJldHVybiB0cnVlIGlmIHRoZSByZW1vdGUgcGVlciBpcyBjYXBhYmxlIG9mIEVEUiBhbmQgc3VwcG9ydHMgMyBNYnBzCi0gKi8KLWJvb2wgYnRpZl9hdl9wZWVyX3N1cHBvcnRzXzNtYnBzKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciB0aGUgbWFuZGF0b3J5IGNvZGVjIGlzIG1vcmUgcHJlZmVycmVkIGZvciB0aGlzIHBlZXIuCi0gKgotICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgdGFyZ2V0IHBlZXIgYWRkcmVzcwotICogQHJldHVybiB0cnVlIGlmIG9wdGlvbmFsIGNvZGVjcyBhcmUgbm90IHByZWZlcnJlZCB0byBiZSB1c2VkCi0gKi8KLWJvb2wgYnRpZl9hdl9wZWVyX3ByZWZlcnNfbWFuZGF0b3J5X2NvZGVjKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogUmVwb3J0IEEyRFAgU291cmNlIENvZGVjIFN0YXRlIGZvciBhIHBlZXIuCi0gKgotICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgcGVlciB0byByZXBvcnQKLSAqIEBwYXJhbSBjb2RlY19jb25maWcgdGhlIGNvZGVjIGNvbmZpZyB0byByZXBvcnQKLSAqIEBwYXJhbSBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzIHRoZSBjb2RlY3MgbG9jYWwgY2FwYWJpbGl0aWVzIHRvIHJlcG9ydAotICogQHBhcmFtIGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcyB0aGUgY29kZWNzIHNlbGVjdGFibGUgY2FwYWJpbGl0aWVzCi0gKiB0byByZXBvcnQKLSAqLwotdm9pZCBidGlmX2F2X3JlcG9ydF9zb3VyY2VfY29kZWNfc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfY29uZmlnLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYKLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKTsKLQotLyoqCi0gKiBJbml0aWFsaXplIC8gc2h1dCBkb3duIHRoZSBBMkRQIFNvdXJjZSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSBlbmFibGUgdHJ1ZSB0byBlbmFibGUgdGhlIEEyRFAgU291cmNlIHNlcnZpY2UsIGZhbHNlIHRvIGRpc2FibGUgaXQKLSAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKi8KLWJ0X3N0YXR1c190IGJ0aWZfYXZfc291cmNlX2V4ZWN1dGVfc2VydmljZShib29sIGVuYWJsZSk7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSAvIHNodXQgZG93biB0aGUgQTJEUCBTaW5rIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIGVuYWJsZSB0cnVlIHRvIGVuYWJsZSB0aGUgQTJEUCBTaW5rIHNlcnZpY2UsIGZhbHNlIHRvIGRpc2FibGUgaXQKLSAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKi8KLWJ0X3N0YXR1c190IGJ0aWZfYXZfc2lua19leGVjdXRlX3NlcnZpY2UoYm9vbCBlbmFibGUpOwotCi0vKioKLSAqIFBlZXIgQUNMIGRpc2Nvbm5lY3RlZC4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBkaXNjb25uZWN0ZWQgcGVlciBhZGRyZXNzCi0gKi8KLXZvaWQgYnRpZl9hdl9hY2xfZGlzY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogRHVtcCBkZWJ1Zy1yZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgQlRJRiBBViBtb2R1bGUuCi0gKgotICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gdXNlIGZvciB3cml0aW5nIHRoZSBBU0NJSSBmb3JtYXR0ZWQKLSAqIGluZm9ybWF0aW9uCi0gKi8KLXZvaWQgYnRpZl9kZWJ1Z19hdl9kdW1wKGludCBmZCk7Ci0KLS8qKgotICogU2V0IHRoZSBhdWRpbyBkZWxheSBmb3IgdGhlIHN0cmVhbS4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBwZWVyIHRvIHJlcG9ydAotICogQHBhcmFtIGRlbGF5IHRoZSBkZWxheSB0byBzZXQgaW4gdW5pdHMgb2YgMS8xMG1zCi0gKi8KLXZvaWQgYnRpZl9hdl9zZXRfYXVkaW9fZGVsYXkoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50MTZfdCBkZWxheSk7Ci0KLS8qKgotICogR2V0IHRoZSBhdWRpbyBkZWxheSBmb3IgdGhlIHN0cmVhbS4KLSAqICBAcGFyYW0gIG5vbmUKLSAqLwotdWludDE2X3QgYnRpZl9hdl9nZXRfYXVkaW9fZGVsYXkodm9pZCk7Ci0KLS8qKgotICogUmVzZXQgdGhlIGF1ZGlvIGRlbGF5IGFuZCBjb3VudCBvZiBhdWRpbyBieXRlcyBzZW50IHRvIHplcm8uCi0gKi8KLXZvaWQgYnRpZl9hdl9yZXNldF9hdWRpb19kZWxheSh2b2lkKTsKLQotLyoqCi0gKiBDYWxsZWQgdG8gZGlzY29ubmVjdCBwZWVyIGRldmljZSB3aGVuCi0gKiAgcmVtb3RlIGluaXRpYXRpZWQgb2ZmbG9hZCBzdGFydCBmYWlsZWQKLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRvIGRpc2Nvbm5lY3QKLSAqCi0gKi8KLXZvaWQgYnRpZl9hdl9zcmNfZGlzY29ubmVjdF9zaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogIGNoZWNrIEEyRFAgb2ZmbG9hZCBzdXBwb3J0IGVuYWJsZWQKLSAqICBAcGFyYW0gIG5vbmUKLSAqLwotYm9vbCBidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9lbmFibGVkKHZvaWQpOwotCi0vKioKLSAqICBjaGVjayBBMkRQIG9mZmxvYWQgZW5hYmxlZCBhbmQgcnVubmluZwotICogIEBwYXJhbSAgbm9uZQotICovCi1ib29sIGJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX3J1bm5pbmcodm9pZCk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciBwZWVyIGRldmljZSBpcyBzaWxlbmNlZAotICoKLSAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdG8gY2hlY2sKLSAqCi0gKi8KLWJvb2wgYnRpZl9hdl9pc19wZWVyX3NpbGVuY2VkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKgotICogU2V0IHRoZSBkeW5hbWljIGF1ZGlvIGJ1ZmZlciBzaXplCi0gKgotICogQHBhcmFtIGR5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUgdG8gc2V0Ci0gKi8KLXZvaWQgYnRpZl9hdl9zZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSh1aW50OF90IGR5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUpOwotCi0jZW5kaWYgLyogQlRJRl9BVl9IICovCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9hdl9jby5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfYXZfY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlODEwZi4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9hdl9jby5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX0FWX0NPX0gKLSNkZWZpbmUgQlRJRl9BVl9DT19ICi0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hMmRwX3NvdXJjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBTZXRzIHRoZSBhY3RpdmUgcGVlciB0byB8cGVlcl9hZGRyfC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIGJ0YV9hdl9jb19zZXRfYWN0aXZlX3BlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBwZWVyIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyLgotLy8gVGhlIHBlZXIgYWRkcmVzcyBpcyB8cGVlcl9hZGRyfC4KLS8vIFRoZSBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gfHBfcGVlcl9wYXJhbXN8LgotLy8gfHBfcGVlcl9wYXJhbXN8IGNhbm5vdCBiZSBudWxsLgotdm9pZCBidGFfYXZfY29fZ2V0X3BlZXJfcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMpOwotCi0vLyBHZXRzIHRoZSBjdXJyZW50IEEyRFAgZW5jb2RlciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmNvZGUgYW5kCi0vLyBwcmVwYXJlIEEyRFAgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uIC0gc2VlIHx0QTJEUF9FTkNPREVSX0lOVEVSRkFDRXwuCi0vLyBSZXR1cm5zIHRoZSBBMkRQIGVuY29kZXIgaW50ZXJmYWNlIGlmIHRoZSBjdXJyZW50IGNvZGVjIGlzIHNldHVwLAotLy8gb3RoZXJ3aXNlIE5VTEwuCi1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogYnRhX2F2X2NvX2dldF9lbmNvZGVyX2ludGVyZmFjZSh2b2lkKTsKLQotLy8gR2V0cyB0aGUgY3VycmVudCBBMkRQIGRlY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHJlY2VpdmVkCi0vLyBBMkRQIHBhY2tldHMgLSBzZWUgfHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFfC4KLS8vIFJldHVybnMgdGhlIEEyRFAgZGVjb2RlciBpbnRlcmZhY2UgaWYgdGhlIGN1cnJlbnQgY29kZWMgaXMgc2V0dXAsIG90aGVyd2lzZQotLy8gTlVMTC4KLWNvbnN0IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFKiBidGFfYXZfY29fZ2V0X2RlY29kZXJfaW50ZXJmYWNlKHZvaWQpOwotCi0vLyBTZXRzIHRoZSB1c2VyIHByZWZlcnJlZCBjb2RlYyBjb25maWd1cmF0aW9uLgotLy8gVGhlIHBlZXIgYWRkcmVzcyBpcyB8cGVlcl9hZGRyfC4KLS8vIHxjb2RlY191c2VyX2NvbmZpZ3wgY29udGFpbnMgdGhlIHByZWZlcnJlZCBjb2RlYyBjb25maWd1cmF0aW9uLgotLy8gfHJlc3RhcnRfb3V0cHV0fCBpcyB1c2VkIHRvIGtub3cgd2hldGhlciBBViBpcyByZWNvbmZpZ3VyaW5nIHdpdGggcmVtb3RlLgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgYnRhX2F2X2NvX3NldF9jb2RlY191c2VyX2NvbmZpZygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywgYm9vbCogcF9yZXN0YXJ0X291dHB1dCk7Ci0KLS8vIFNldHMgdGhlIEF1ZGlvIEhBTCBzZWxlY3RlZCBhdWRpbyBmZWVkaW5nIHBhcmFtZXRlcnMuCi0vLyBUaG9zZSBwYXJhbWV0ZXJzIGFyZSBhcHBsaWVkIG9ubHkgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb2RlYy4KLS8vIHxjb2RlY19hdWRpb19jb25maWd8IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBhdWRpbyBmZWVkaW5nIGNvbmZpZ3VyYXRpb24uCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBidGFfYXZfY29fc2V0X2NvZGVjX2F1ZGlvX2NvbmZpZygKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZyk7Ci0KLS8vIEluaXRpYWxpemVzIHRoZSBjb250cm9sIGJsb2NrLgotLy8gfGNvZGVjX3ByaW9yaXRpZXN8IGNvbnRhaW5zIHRoZSBBMkRQIFNvdXJjZSBjb2RlYyBwcmlvcml0aWVzIHRvIHVzZS4KLXZvaWQgYnRhX2F2X2NvX2luaXQoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllcyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBjb2RlYyBmb3IgfGNvZGVjX2luZGV4fCBpcyBzdXBwb3J0ZWQuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvZGVjIGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBidGFfYXZfY29faXNfc3VwcG9ydGVkX2NvZGVjKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KTsKLQotLy8gR2V0cyB0aGUgY3VycmVudCBBMkRQIGNvZGVjIGZvciB0aGUgYWN0aXZlIHBlZXIuCi0vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCB8QTJkcENvZGVjQ29uZmlnfCBpZiB2YWxpZCwgb3RoZXJ3aXNlCi0vLyBudWxscHRyLgotQTJkcENvZGVjQ29uZmlnKiBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYyh2b2lkKTsKLQotLy8gR2V0cyB0aGUgY3VycmVudCBBMkRQIGNvZGVjIGZvciBhIHBlZXIgaWRlbnRpZmllZCBieSB8cGVlcl9hZGRyZXNzfC4KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHxBMmRwQ29kZWNDb25maWd8IGlmIHZhbGlkLCBvdGhlcndpc2UKLS8vIG51bGxwdHIuCi1BMmRwQ29kZWNDb25maWcqIGJ0YV9hdl9nZXRfYTJkcF9wZWVyX2N1cnJlbnRfY29kZWMoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBlZmZlY3RpdmUgZnJhbWUgc2l6ZSBmcm9tIHRoZSBjdXJyZW50IGVuY29kZXIuCi0vLyBSZXR1cm5zIHRoZSBlZmZlY3RpdmUgZnJhbWUgc2l6ZSBpZiB0aGUgZW5jb2RlciBpcyBjb25maWd1cmVkLCBvdGhlcndpc2UgMC4KLWludCBidGFfYXZfY29fZ2V0X2VuY29kZXJfZWZmZWN0aXZlX2ZyYW1lX3NpemUoKTsKLQotLy8gRHVtcCBBMkRQIGNvZGVjIGRlYnVnLXJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBBMkRQIG1vZHVsZS4KLS8vIHxmZHwgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgZm9yIHdyaXRpbmcgdGhlIEFTQ0lJIGZvcm1hdHRlZAotLy8gaW5mb3JtYXRpb24uCi12b2lkIGJ0aWZfYTJkcF9jb2RlY19kZWJ1Z19kdW1wKGludCBmZCk7Ci0KLSNlbmRpZiAgLy8gQlRJRl9BVl9DT19ICmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9hdnJjcF9hdWRpb190cmFjay5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfYXZyY3BfYXVkaW9fdHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjYTFjOC4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9hdnJjcF9hdWRpb190cmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJbXBsZW1lbnRzIGFuIEFQSSB0byBiZSB1c2VkIGJ5IEEyRFAgdG8gZG8gc3RyZWFtaW5nIG9mIG11c2ljIG92ZXIgYSBtZWRpYQotICogc3RyZWFtLiBUaGlzIEFQSSBwcm92aWRlcyBtZWNoYW5pc20gdG8gY3JlYXRlIGFuZCBjb250cm9sIHBsYXliYWNrIG9mIHRoZQotICogbWVkaWEgc3RyZWFtIGRlcGVuZGluZyBvbiB0aGUgZGF0YSBiaXRzIGNvbWluZyBmcm9tIHRoZSByZW1vdGUgZGV2aWNlLiBUaGUKLSAqIG1lZGlhIHN0cmVhbSBpcyBwbGF5ZWQgb3ZlciB0aGUgZGVmYXVsdCBhdWRpbyBtZWRpYSBzdHJlYW0gdHlwZSBhbmQgaGVuY2UKLSAqIHZvbHVtZSBjb250cm9sIGlzIGhhbmRsZWQgZW50aXJlbHkgYnkgdGhlIEF1ZGlvIE1hbmFnZXIgKHdoaWNoIGlzIGFsc28gdGhlCi0gKiBvcmlnaW5hbCBtb3RpdmF0aW9uIGZvciB0aGlzIHNvbHV0aW9uLgotICoKLSAqIFRPRE86IE9uY2UgdGhlIEF1ZGlvTWFuYWdlciBwcm92aWRlcyBzdXBwb3J0IGZvciBwYXRjaGluZyBhdWRpbyBzb3VyY2VzIHdpdGgKLSAqIHZvbHVtZSBjb250cm9sIHdlIHNob3VsZCBkZXByZWNhdGUgdGhpcyBmaWxlLgotICovCi0KLS8qKgotICogQ3JlYXRlcyBhbiBhdWRpbyB0cmFjayBvYmplY3QgYW5kIHJldHVybnMgYSB2b2lkIGhhbmRsZS4gVXNlIHRoaXMgaGFuZGxlIHRvCi0gKiB0aGUKLSAqIGZvbGxvd2luZyBmdW5jdGlvbnMuCi0gKgotICogVGhlIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlIGlzIG1haW50YWluZWQgYnkgdGhlIGNhbGxlciBvZiB0aGlzIEFQSSBhbmQgaXQKLSAqIHNob3VsZCBldmVudHVhbGx5IGJlCi0gKiBkZWxldGVkIHVzaW5nIEJ0aWZBdnJjcEF1ZGlvVHJhY2tEZWxldGUgKHNlZSBiZWxvdykuCi0gKi8KLXZvaWQqIEJ0aWZBdnJjcEF1ZGlvVHJhY2tDcmVhdGUoaW50IHRyYWNrRnJlcSwgaW50IGJpdHNQZXJTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQpOwotCi0vKioKLSAqIFN0YXJ0cyB0aGUgYXVkaW8gdHJhY2suCi0gKi8KLXZvaWQgQnRpZkF2cmNwQXVkaW9UcmFja1N0YXJ0KHZvaWQqIGhhbmRsZSk7Ci0KLS8qKgotICogUGF1c2VzIHRoZSBhdWRpbyB0cmFjay4KLSAqLwotdm9pZCBCdGlmQXZyY3BBdWRpb1RyYWNrUGF1c2Uodm9pZCogaGFuZGxlKTsKLQotLyoqCi0gKiBTZXRzIGF1ZGlvIHRyYWNrIGdhaW4uCi0gKi8KLXZvaWQgQnRpZkF2cmNwU2V0QXVkaW9UcmFja0dhaW4odm9pZCogaGFuZGxlLCBmbG9hdCBnYWluKTsKLQotLyoqCi0gKiBTdG9wIC8gRGVsZXRlIHRoZSBhdWRpbyB0cmFjay4KLSAqIERlbGV0ZSBzaG91bGQgdXN1YWxseSBiZSBjYWxsZWQgc3RvcC4KLSAqLwotdm9pZCBCdGlmQXZyY3BBdWRpb1RyYWNrU3RvcCh2b2lkKiBoYW5kbGUpOwotdm9pZCBCdGlmQXZyY3BBdWRpb1RyYWNrRGVsZXRlKHZvaWQqIGhhbmRsZSk7Ci0KLS8qKgotICogV3JpdGVzIHRoZSBhdWRpbyB0cmFjayBkYXRhIHRvIGZpbGUuCi0gKgotICogVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcuCi0gKi8KLWludCBCdGlmQXZyY3BBdWRpb1RyYWNrV3JpdGVEYXRhKHZvaWQqIGhhbmRsZSwgdm9pZCogYXVkaW9CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyTGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2Jxci5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfYnFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkY2ZmNjAuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfYnFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBCVElGX0JRUl9IXwotI2RlZmluZSBCVElGX0JRUl9IXwotCi0jaW5jbHVkZSAiYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgImNvbW1vbi9sZWFreV9ib25kZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYnFyIHsKLQotLy8gQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0IChCUVIpCi0vLwotLy8gSXQgaXMgYSBmZWF0dXJlIHRvIHN0YXJ0IHRoZSBtZWNoYW5pc20gaW4gdGhlIEJsdWV0b290aCBjb250cm9sbGVyIHRvIHJlcG9ydAotLy8gQmx1ZXRvb3RoIFF1YWxpdHkgZXZlbnQgdG8gdGhlIGhvc3QgYW5kIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgZW5hYmxlZDoKLS8vICAgW1F1YWxpdHkgTW9uaXRvcmluZyBNb2RlXQotLy8gICAgIFRoZSBjb250cm9sbGVyIHNoYWxsIHBlcmlvZGljYWxseSBzZW5kIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCBzdWItZXZlbnQKLS8vICAgICB0byB0aGUgaG9zdC4KLS8vCi0vLyAgIFtBcHByb2FjaGluZyBMU1RPXQotLy8gICAgIE9uY2Ugbm8gcGFja2V0cyBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgY29ubmVjdGVkIEJsdWV0b290aCBkZXZpY2UgZm9yIGEKLS8vICAgICBkdXJhdGlvbiBsb25nZXIgdGhhbiB0aGUgaGFsZiBvZiBMU1RPIChMaW5rIFN1cGVydmlzaW9uIFRpbWVPdXQpIHZhbHVlLAotLy8gICAgIHRoZSBjb250cm9sbGVyIHNoYWxsIHJlcG9ydCBBcHByb2FjaGluZyBMU1RPIGV2ZW50IHRvIHRoZSBob3N0LgotLy8KLS8vICAgW0EyRFAgQXVkaW8gQ2hvcHB5XQotLy8gICAgIFdoZW4gdGhlIGNvbnRyb2xsZXIgZGV0ZWN0cyB0aGUgZmFjdG9ycyB3aGljaCB3aWxsIGNhdXNlIGF1ZGlvIGNob3BweSwKLS8vICAgICB0aGUgY29udHJvbGxlciBzaGFsbCByZXBvcnQgQTJEUCBBdWRpbyBDaG9wcHkgZXZlbnQgdG8gdGhlIGhvc3QuCi0vLwotLy8gICBbKGUpU0NPIFZvaWNlIENob3BweV0KLS8vICAgICBXaGVuIHRoZSBjb250cm9sbGVyIGRldGVjdHMgdGhlIGZhY3RvcnMgd2hpY2ggd2lsbCBjYXVzZSB2b2ljZSBjaG9wcHksCi0vLyAgICAgdGhlIGNvbnRyb2xsZXIgc2hhbGwgcmVwb3J0IChlKVNDTyBWb2ljZSBDaG9wcHkgZXZlbnQgdG8gdGhlIGhvc3QuCi0vLwotLy8gICBbUm9vdCBJbmZsYW1tYXRpb25dCi0vLyAgICAgV2hlbiB0aGUgY29udHJvbGxlciBlbmNvdW50ZXJzIGFuIGVycm9yIGl0IHNoYWxsIHJlcG9ydCBSb290IEluZmxhbW1hdGlvbgotLy8gICAgIGV2ZW50IGluZGljYXRpbmcgdGhlIGVycm9yIGNvZGUgdG8gdGhlIGhvc3QuCi0vLwotLy8gICBbTE1QL0xMIG1lc3NhZ2UgdHJhY2VdCi0vLyAgICAgVGhlIGNvbnRyb2xsZXIgc2VuZHMgdGhlIExNUC9MTCBtZXNzYWdlIGhhbmRzaGFraW5nIHdpdGggdGhlIHJlbW90ZQotLy8gICAgIGRldmljZSB0byB0aGUgaG9zdC4KLS8vCi0vLyAgIFtCbHVldG9vdGggTXVsdGktcHJvZmlsZS9Db2V4IHNjaGVkdWxpbmcgdHJhY2VdCi0vLyAgICAgVGhlIGNvbnRyb2xsZXIgc2VuZHMgaXRzIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gb24gaGFuZGxpbmcgdGhlIEJsdWV0b290aAotLy8gICAgIG11bHRpcGxlIHByb2ZpbGVzIGFuZCB3aXJlbGVzcyBjb2V4aXN0ZW5jZSBpbiB0aGUgMi40IEdoeiBiYW5kIHRvIHRoZQotLy8gICAgIGhvc3QuCi0vLwotLy8gICBbRW5hYmxlIHRoZSBDb250cm9sbGVyIERlYnVnIEluZm9ybWF0aW9uIG1lY2hhbmlzbV0KLS8vICAgICBBZnRlciBlbmFibGluZyB0aGUgQ29udHJvbGxlciBEZWJ1ZyBJbmZvcm1hdGlvbiBtZWNoYW5pc20sIHRoZSBjb250cm9sbGVyCi0vLyAgICAganVzdCBjYW4gYXV0b25vbW91c2x5IHJlcG9ydCBkZWJ1ZyBsb2dnaW5nIGluZm9ybWF0aW9uIHZpYSB0aGUgQ29udHJvbGxlcgotLy8gICAgIERlYnVnIEluZm8gc3ViLWV2ZW50IHRvIHRoZSBob3N0LgotLy8KLQotLy8gQml0IG1hc2tzIGZvciB0aGUgc2VsZWN0ZWQgcXVhbGl0eSBldmVudCByZXBvcnRpbmcuCi1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtRdWFsaXR5RXZlbnRNYXNrQWxsT2ZmID0gMDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1F1YWxpdHlFdmVudE1hc2tNb25pdG9yTW9kZSA9IDB4MDAwMDAwMDE7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtRdWFsaXR5RXZlbnRNYXNrQXBwcm9hY2hMc3RvID0gMHgwMDAwMDAwMjsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1F1YWxpdHlFdmVudE1hc2tBMmRwQXVkaW9DaG9wcHkgPSAweDAwMDAwMDA0Owotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrUXVhbGl0eUV2ZW50TWFza1Njb1ZvaWNlQ2hvcHB5ID0gMHgwMDAwMDAwODsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1F1YWxpdHlFdmVudE1hc2tSb290SW5mbGFtbWF0aW9uID0gMHgwMDAwMDAxMDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1F1YWxpdHlFdmVudE1hc2tMbXBNZXNzYWdlVHJhY2UgPSAweDAwMDEwMDAwOwotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrUXVhbGl0eUV2ZW50TWFza0J0U2NoZWR1bGluZ1RyYWNlID0gMHgwMDAyMDAwMDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1F1YWxpdHlFdmVudE1hc2tDb250cm9sbGVyRGJnSW5mbyA9IDB4MDAwNDAwMDA7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtRdWFsaXR5RXZlbnRNYXNrQWxsID0KLSAgICBrUXVhbGl0eUV2ZW50TWFza01vbml0b3JNb2RlIHwga1F1YWxpdHlFdmVudE1hc2tBcHByb2FjaExzdG8gfAotICAgIGtRdWFsaXR5RXZlbnRNYXNrQTJkcEF1ZGlvQ2hvcHB5IHwga1F1YWxpdHlFdmVudE1hc2tTY29Wb2ljZUNob3BweSB8Ci0gICAga1F1YWxpdHlFdmVudE1hc2tSb290SW5mbGFtbWF0aW9uIHwga1F1YWxpdHlFdmVudE1hc2tMbXBNZXNzYWdlVHJhY2UgfAotICAgIGtRdWFsaXR5RXZlbnRNYXNrQnRTY2hlZHVsaW5nVHJhY2UgfCBrUXVhbGl0eUV2ZW50TWFza0NvbnRyb2xsZXJEYmdJbmZvOwotLy8gRGVmaW5lIHRoZSBtaW5pbXVtIHRpbWUgaW50ZXJ2YWwgKGluIG1zKSBvZiBxdWFsaXR5IGV2ZW50IHJlcG9ydGluZyBmb3IgdGhlCi0vLyBzZWxlY3RlZCBxdWFsaXR5IGV2ZW50KHMpLiBDb250cm9sbGVyIEZpcm13YXJlIHNob3VsZCBub3QgcmVwb3J0IHRoZSBuZXh0Ci0vLyBldmVudCB3aXRoaW4gdGhlIGRlZmluZWQgdGltZSBpbnRlcnZhbC4KLXN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01pblJlcG9ydEludGVydmFsTm9MaW1pdCA9IDA7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtNaW5SZXBvcnRJbnRlcnZhbE1heE1zID0gMHhGRkZGOwotLy8gVGhlIG1heGltdW0gY291bnQgb2YgTG9nIER1bXAgcmVsYXRlZCBldmVudCBjYW4gYmUgd3JpdHRlbiBpbiB0aGUgbG9nIGZpbGUuCi1zdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtMb2dEdW1wRXZlbnRQZXJGaWxlID0gMHgwMEZGOwotLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIHRoZSBsaW5rIFF1YWxpdHkgcmVsYXRlZCBldmVudCBleGNlcHQKLS8vIFZlbmRvciBTcGVjaWZpYyBQYXJhbWV0ZXJzLgotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtMaW5rUXVhbGl0eVBhcmFtVG90YWxMZW4gPSA0ODsKLS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgcGFyYW1ldGVycyBvZiB0aGUgUk9PVF9JTkZMQU1NQVRJT04gZXZlbnQgZXhjZXB0IFZlbmRvcgotLy8gU3BlY2lmaWMgUGFyYW1ldGVycy4KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrUm9vdEluZmxhbW1hdGlvblBhcmFtVG90YWxMZW4gPSAzOwotLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIHRoZSBMb2cgRHVtcCByZWxhdGVkIGV2ZW50IGV4Y2VwdCBWZW5kb3IKLS8vIFNwZWNpZmljIFBhcmFtZXRlcnMuCi1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0xvZ0R1bXBQYXJhbVRvdGFsTGVuID0gMzsKLS8vIFdhcm5pbmcgY3JpdGVyaWEgb2YgdGhlIFJTU0kgdmFsdWUuCi1zdGF0aWMgY29uc3RleHByIGludDhfdCBrQ3JpV2FyblJzc2kgPSAtODA7Ci0vLyBXYXJuaW5nIGNyaXRlcmlhIG9mIHRoZSB1bnVzZWQgQUZIIGNoYW5uZWwgY291bnQuCi1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0NyaVdhcm5VbnVzZWRDaCA9IDU1OwotLy8gVGhlIHF1ZXVlIHNpemUgb2YgcmVjb3JkaW5nIHRoZSBCUVIgZXZlbnRzLgotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtCcXJFdmVudFF1ZXVlU2l6ZSA9IDI1OwotLy8gVGhlIFByb3BlcnR5IG9mIEJRUiBldmVudCBtYXNrIGNvbmZpZ3VyYXRpb24uCi1zdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtwUHJvcGVydHlFdmVudE1hc2sgPQotICAgICJwZXJzaXN0LmJsdWV0b290aC5icXIuZXZlbnRfbWFzayI7Ci0vLyBUaGUgUHJvcGVydHkgb2YgQlFSIG1pbmltdW0gcmVwb3J0IGludGVydmFsIGNvbmZpZ3VyYXRpb24uCi1zdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtwUHJvcGVydHlNaW5SZXBvcnRJbnRlcnZhbE1zID0KLSAgICAicGVyc2lzdC5ibHVldG9vdGguYnFyLm1pbl9pbnRlcnZhbF9tcyI7Ci0vLyBQYXRoIG9mIHRoZSBMTVAvTEwgbWVzc2FnZSB0cmFjZSBsb2cgZmlsZS4KLXN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga3BMbXBMbE1lc3NhZ2VUcmFjZUxvZ1BhdGggPQotICAgICIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2xtcF9sbF9tZXNzYWdlX3RyYWNlLmxvZyI7Ci0vLyBQYXRoIG9mIHRoZSBsYXN0IExNUC9MTCBtZXNzYWdlIHRyYWNlIGxvZyBmaWxlLgotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrcExtcExsTWVzc2FnZVRyYWNlTGFzdExvZ1BhdGggPQotICAgICIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2xtcF9sbF9tZXNzYWdlX3RyYWNlLmxvZy5sYXN0IjsKLS8vIFBhdGggb2YgdGhlIEJsdWV0b290aCBNdWx0aS1wcm9maWxlL0NvZXggc2NoZWR1bGluZyB0cmFjZSBsb2cgZmlsZS4KLXN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga3BCdFNjaGVkdWxpbmdUcmFjZUxvZ1BhdGggPQotICAgICIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0X3NjaGVkdWxpbmdfdHJhY2UubG9nIjsKLS8vIFBhdGggb2YgdGhlIGxhc3QgQmx1ZXRvb3RoIE11bHRpLXByb2ZpbGUvQ29leCBzY2hlZHVsaW5nIHRyYWNlIGxvZyBmaWxlLgotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrcEJ0U2NoZWR1bGluZ1RyYWNlTGFzdExvZ1BhdGggPQotICAgICIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0X3NjaGVkdWxpbmdfdHJhY2UubG9nLmxhc3QiOwotCi0vLyBGaWxlIERlc2NyaXB0b3Igb2YgTE1QL0xMIG1lc3NhZ2UgdHJhY2UgbG9nCi1zdGF0aWMgaW50IExtcExsTWVzc2FnZVRyYWNlTG9nRmQgPSBJTlZBTElEX0ZEOwotLy8gRmlsZSBEZXNjcmlwdG9yIG9mIEJsdWV0b290aCBNdWx0aS1wcm9maWxlL0NvZXggc2NoZWR1bGluZyB0cmFjZSBsb2cKLXN0YXRpYyBpbnQgQnRTY2hlZHVsaW5nVHJhY2VMb2dGZCA9IElOVkFMSURfRkQ7Ci0vLyBDb3VudGVyIG9mIExNUC9MTCBtZXNzYWdlIHRyYWNlCi1zdGF0aWMgdWludDE2X3QgTG1wTGxNZXNzYWdlVHJhY2VDb3VudGVyID0gMDsKLS8vIENvdW50ZXIgb2YgQmx1ZXRvb3RoIE11bHRpLXByb2ZpbGUvQ29leCBzY2hlZHVsaW5nIHRyYWNlCi1zdGF0aWMgdWludDE2X3QgQnRTY2hlZHVsaW5nVHJhY2VDb3VudGVyID0gMDsKLQotLy8gQWN0aW9uIGRlZmluaXRpb24KLS8vCi0vLyBBY3Rpb24gdG8gQWRkLCBEZWxldGUgb3IgQ2xlYXIgdGhlIHJlcG9ydGluZyBvZiBxdWFsaXR5IGV2ZW50KHMpLgotLy8gRGVsZXRlIHdpbGwgY2xlYXIgc3BlY2lmaWMgcXVhbGl0eSBldmVudChzKSByZXBvcnRpbmcuIENsZWFyIHdpbGwgY2xlYXIgYWxsCi0vLyBxdWFsaXR5IGV2ZW50cyByZXBvcnRpbmcuCi1lbnVtIEJxclJlcG9ydEFjdGlvbiA6IHVpbnQ4X3QgewotICBSRVBPUlRfQUNUSU9OX0FERCA9IDB4MDAsCi0gIFJFUE9SVF9BQ1RJT05fREVMRVRFID0gMHgwMSwKLSAgUkVQT1JUX0FDVElPTl9DTEVBUiA9IDB4MDIKLX07Ci0KLS8vIFJlcG9ydCBJRCBkZWZpbml0aW9uCi1lbnVtIEJxclF1YWxpdHlSZXBvcnRJZCA6IHVpbnQ4X3QgewotICBRVUFMSVRZX1JFUE9SVF9JRF9NT05JVE9SX01PREUgPSAweDAxLAotICBRVUFMSVRZX1JFUE9SVF9JRF9BUFBST0FDSF9MU1RPID0gMHgwMiwKLSAgUVVBTElUWV9SRVBPUlRfSURfQTJEUF9BVURJT19DSE9QUFkgPSAweDAzLAotICBRVUFMSVRZX1JFUE9SVF9JRF9TQ09fVk9JQ0VfQ0hPUFBZID0gMHgwNCwKLSAgUVVBTElUWV9SRVBPUlRfSURfUk9PVF9JTkZMQU1NQVRJT04gPSAweDA1LAotICBRVUFMSVRZX1JFUE9SVF9JRF9MTVBfTExfTUVTU0FHRV9UUkFDRSA9IDB4MTEsCi0gIFFVQUxJVFlfUkVQT1JUX0lEX0JUX1NDSEVEVUxJTkdfVFJBQ0UgPSAweDEyLAotICBRVUFMSVRZX1JFUE9SVF9JRF9DT05UUk9MTEVSX0RCR19JTkZPID0gMHgxMwotfTsKLQotLy8gUGFja2V0IFR5cGUgZGVmaW5pdGlvbgotZW51bSBCcXJQYWNrZXRUeXBlIDogdWludDhfdCB7Ci0gIFBBQ0tFVF9UWVBFX0lEID0gMHgwMSwKLSAgUEFDS0VUX1RZUEVfTlVMTCwKLSAgUEFDS0VUX1RZUEVfUE9MTCwKLSAgUEFDS0VUX1RZUEVfRkhTLAotICBQQUNLRVRfVFlQRV9IVjEsCi0gIFBBQ0tFVF9UWVBFX0hWMiwKLSAgUEFDS0VUX1RZUEVfSFYzLAotICBQQUNLRVRfVFlQRV9EViwKLSAgUEFDS0VUX1RZUEVfRVYzLAotICBQQUNLRVRfVFlQRV9FVjQsCi0gIFBBQ0tFVF9UWVBFX0VWNSwKLSAgUEFDS0VUX1RZUEVfMkVWMywKLSAgUEFDS0VUX1RZUEVfMkVWNSwKLSAgUEFDS0VUX1RZUEVfM0VWMywKLSAgUEFDS0VUX1RZUEVfM0VWNSwKLSAgUEFDS0VUX1RZUEVfRE0xLAotICBQQUNLRVRfVFlQRV9ESDEsCi0gIFBBQ0tFVF9UWVBFX0RNMywKLSAgUEFDS0VUX1RZUEVfREgzLAotICBQQUNLRVRfVFlQRV9ETTUsCi0gIFBBQ0tFVF9UWVBFX0RINSwKLSAgUEFDS0VUX1RZUEVfQVVYMSwKLSAgUEFDS0VUX1RZUEVfMkRIMSwKLSAgUEFDS0VUX1RZUEVfMkRIMywKLSAgUEFDS0VUX1RZUEVfMkRINSwKLSAgUEFDS0VUX1RZUEVfM0RIMSwKLSAgUEFDS0VUX1RZUEVfM0RIMywKLSAgUEFDS0VUX1RZUEVfM0RINQotfTsKLQotLy8gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJxclJlcG9ydEFjdGlvbiByZXBvcnRfYWN0aW9uOwotICB1aW50MzJfdCBxdWFsaXR5X2V2ZW50X21hc2s7Ci0gIHVpbnQxNl90IG1pbmltdW1fcmVwb3J0X2ludGVydmFsX21zOwotfSBCcXJDb25maWd1cmF0aW9uOwotCi0vLyBMaW5rIHF1YWxpdHkgcmVsYXRlZCBCUVIgZXZlbnQKLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gUXVhbGl0eSByZXBvcnQgSUQuCi0gIHVpbnQ4X3QgcXVhbGl0eV9yZXBvcnRfaWQ7Ci0gIC8vIFBhY2tldCB0eXBlIG9mIHRoZSBjb25uZWN0aW9uLgotICB1aW50OF90IHBhY2tldF90eXBlczsKLSAgLy8gQ29ubmVjdGlvbiBoYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24uCi0gIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlOwotICAvLyBQZXJmb3JtaW5nIFJvbGUgZm9yIHRoZSBjb25uZWN0aW9uLgotICB1aW50OF90IGNvbm5lY3Rpb25fcm9sZTsKLSAgLy8gQ3VycmVudCBUcmFuc21pdCBQb3dlciBMZXZlbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMKLSAgLy8gdGhlIGNvbnRyb2xsZXIncyByZXNwb25zZSB0byB0aGUgSENJX1JlYWRfVHJhbnNtaXRfUG93ZXJfTGV2ZWwgSENJIGNvbW1hbmQuCi0gIGludDhfdCB0eF9wb3dlcl9sZXZlbDsKLSAgLy8gUmVjZWl2ZWQgU2lnbmFsIFN0cmVuZ3RoIEluZGljYXRpb24gKFJTU0kpIHZhbHVlIGZvciB0aGUgY29ubmVjdGlvbi4gVGhpcwotICAvLyB2YWx1ZSBpcyBhbiBhYnNvbHV0ZSByZWNlaXZlciBzaWduYWwgc3RyZW5ndGggdmFsdWUuCi0gIGludDhfdCByc3NpOwotICAvLyBTaWduYWwtdG8tTm9pc2UgUmF0aW8gKFNOUikgdmFsdWUgZm9yIHRoZSBjb25uZWN0aW9uLiBJdCBpcyB0aGUgYXZlcmFnZQotICAvLyBTTlIgb2YgYWxsIHRoZSBjaGFubmVscyB1c2VkIGJ5IHRoZSBsaW5rIGN1cnJlbnRseS4KLSAgdWludDhfdCBzbnI7Ci0gIC8vIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHVudXNlZCBjaGFubmVscyBpbiBBRkhfY2hhbm5lbF9tYXAuCi0gIHVpbnQ4X3QgdW51c2VkX2FmaF9jaGFubmVsX2NvdW50OwotICAvLyBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB0aGUgY2hhbm5lbHMgd2hpY2ggYXJlIGludGVyZmVyZWQgYW5kIHF1YWxpdHkgaXMKLSAgLy8gYmFkIGJ1dCBhcmUgc3RpbGwgc2VsZWN0ZWQgZm9yIEFGSC4KLSAgdWludDhfdCBhZmhfc2VsZWN0X3VuaWRlYWxfY2hhbm5lbF9jb3VudDsKLSAgLy8gQ3VycmVudCBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQgU2V0dGluZy4KLSAgLy8gVW5pdDogTiAqIDAuMzEyNSBtcyAoMSBCbHVldG9vdGggQ2xvY2spCi0gIHVpbnQxNl90IGxzdG87Ci0gIC8vIFBpY29uZXQgQ2xvY2sgZm9yIHRoZSBzcGVjaWZpZWQgQ29ubmVjdGlvbl9IYW5kbGUuIFRoaXMgdmFsdWUgaXMgdGhlIHNhbWUKLSAgLy8gYXMgdGhlIGNvbnRyb2xsZXIncyByZXNwb25zZSB0byBIQ0lfUmVhZF9DbG9jayBIQ0kgY29tbWFuZCB3aXRoIHRoZQotICAvLyBwYXJhbWV0ZXIgIldoaWNoX0Nsb2NrIiBvZiAweDAxIChQaWNvbmV0IENsb2NrKS4KLSAgLy8gVW5pdDogTiAqIDAuMzEyNSBtcyAoMSBCbHVldG9vdGggQ2xvY2spCi0gIHVpbnQzMl90IGNvbm5lY3Rpb25fcGljb25ldF9jbG9jazsKLSAgLy8gVGhlIGNvdW50IG9mIHJldHJhbnNtaXNzaW9uLgotICB1aW50MzJfdCByZXRyYW5zbWlzc2lvbl9jb3VudDsKLSAgLy8gVGhlIGNvdW50IG9mIG5vIFJYLgotICB1aW50MzJfdCBub19yeF9jb3VudDsKLSAgLy8gVGhlIGNvdW50IG9mIE5BSyAoTmVnYXRpdmUgQWNrbm93bGVkZ2UpLgotICB1aW50MzJfdCBuYWtfY291bnQ7Ci0gIC8vIFRpbWVzdGFtcCBvZiBsYXN0IFRYIEFDSy4KLSAgLy8gVW5pdDogTiAqIDAuMzEyNSBtcyAoMSBCbHVldG9vdGggQ2xvY2spCi0gIHVpbnQzMl90IGxhc3RfdHhfYWNrX3RpbWVzdGFtcDsKLSAgLy8gVGhlIGNvdW50IG9mIEZsb3ctb2ZmIChTVE9QKS4KLSAgdWludDMyX3QgZmxvd19vZmZfY291bnQ7Ci0gIC8vIFRpbWVzdGFtcCBvZiBsYXN0IEZsb3ctb24gKEdPKS4KLSAgLy8gVW5pdDogTiAqIDAuMzEyNSBtcyAoMSBCbHVldG9vdGggQ2xvY2spCi0gIHVpbnQzMl90IGxhc3RfZmxvd19vbl90aW1lc3RhbXA7Ci0gIC8vIEJ1ZmZlciBvdmVyZmxvdyBjb3VudCAoaG93IG1hbnkgYnl0ZXMgb2YgVFggZGF0YSBhcmUgZHJvcHBlZCkgc2luY2UgdGhlCi0gIC8vIGxhc3QgZXZlbnQuCi0gIHVpbnQzMl90IGJ1ZmZlcl9vdmVyZmxvd19ieXRlczsKLSAgLy8gQnVmZmVyIHVuZGVyZmxvdyBjb3VudCAoaW4gYnl0ZSkuCi0gIHVpbnQzMl90IGJ1ZmZlcl91bmRlcmZsb3dfYnl0ZXM7Ci0gIC8vIEZvciB0aGUgY29udHJvbGxlciB2ZW5kb3IgdG8gb2J0YWluIG1vcmUgdmVuZG9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCi0gIHVpbnQ4X3QqIHZlbmRvcl9zcGVjaWZpY19wYXJhbWV0ZXI7Ci19IEJxckxpbmtRdWFsaXR5RXZlbnQ7Ci0KLS8vIExvZyBkdW1wIHJlbGF0ZWQgQlFSIGV2ZW50Ci10eXBlZGVmIHN0cnVjdCB7Ci0gIC8vIFF1YWxpdHkgcmVwb3J0IElELgotICB1aW50OF90IHF1YWxpdHlfcmVwb3J0X2lkOwotICAvLyBDb25uZWN0aW9uIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbi4KLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGU7Ci0gIC8vIEZvciB0aGUgY29udHJvbGxlciB2ZW5kb3IgdG8gb2J0YWluIG1vcmUgdmVuZG9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCi0gIHVpbnQ4X3QqIHZlbmRvcl9zcGVjaWZpY19wYXJhbWV0ZXI7Ci19IEJxckxvZ0R1bXBFdmVudDsKLQotLy8gQlFSIHN1Yi1ldmVudCBvZiBWZW5kb3IgU3BlY2lmaWMgRXZlbnQKLWNsYXNzIEJxclZzZVN1YkV2dCB7Ci0gcHVibGljOgotICAvLyBQYXJzZSB0aGUgTGluayBRdWFsaXR5IHJlbGF0ZWQgQlFSIGV2ZW50LgotICAvLwotICAvLyBAcGFyYW0gbGVuZ3RoIFRvdGFsIGxlbmd0aCBvZiBhbGwgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIHN1Yi1ldmVudC4KLSAgLy8gQHBhcmFtIHBfcGFyYW1fYnVmIEEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIHN1Yi1ldmVudC4KLSAgdm9pZCBQYXJzZUJxckxpbmtRdWFsaXR5RXZ0KHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX3BhcmFtX2J1Zik7Ci0gIC8vIFdyaXRlIHRoZSBMTVAvTEwgbWVzc2FnZSB0cmFjZSB0byB0aGUgbG9nIGZpbGUuCi0gIC8vCi0gIC8vIEBwYXJhbSBmZCBUaGUgRmlsZSBEZXNjcmlwdG9yIG9mIHRoZSBsb2cgZmlsZS4KLSAgLy8gQHBhcmFtIGxlbmd0aCBUb3RhbCBsZW5ndGggb2YgYWxsIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBzdWItZXZlbnQuCi0gIC8vIEBwYXJhbSBwX3BhcmFtX2J1ZiBBIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBzdWItZXZlbnQuCi0gIHZvaWQgV3JpdGVMbXBMbFRyYWNlTG9nRmlsZShpbnQgZmQsIHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX3BhcmFtX2J1Zik7Ci0gIC8vIFdyaXRlIHRoZSBCbHVldG9vdGggTXVsdGktcHJvZmlsZS9Db2V4IHNjaGVkdWxpbmcgdHJhY2UgdG8gdGhlIGxvZyBmaWxlLgotICAvLwotICAvLyBAcGFyYW0gZmQgVGhlIEZpbGUgRGVzY3JpcHRvciBvZiB0aGUgbG9nIGZpbGUuCi0gIC8vIEBwYXJhbSBsZW5ndGggVG90YWwgbGVuZ3RoIG9mIGFsbCBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBpbiB0aGUgc3ViLWV2ZW50LgotICAvLyBAcGFyYW0gcF9wYXJhbV9idWYgQSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBpbiB0aGUgc3ViLWV2ZW50LgotICB2b2lkIFdyaXRlQnRTY2hlZHVsaW5nVHJhY2VMb2dGaWxlKGludCBmZCwgdWludDhfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9wYXJhbV9idWYpOwotICAvLyBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJsdWV0b290aCBRdWFsaXR5IGV2ZW50LgotICAvLwotICAvLyBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCbHVldG9vdGggUXVhbGl0eSBldmVudC4KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKLQotICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJxclZzZVN1YkV2dCYgYSkgewotICAgIHJldHVybiBvcyA8PCBhLlRvU3RyaW5nKCk7Ci0gIH0KLQotICB2aXJ0dWFsIH5CcXJWc2VTdWJFdnQoKSA9IGRlZmF1bHQ7Ci0gIC8vIExpbmsgUXVhbGl0eSByZWxhdGVkIEJRUiBldmVudAotICBCcXJMaW5rUXVhbGl0eUV2ZW50IGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfID0ge307Ci0gIC8vIExvZyBEdW1wIHJlbGF0ZWQgQlFSIGV2ZW50Ci0gIEJxckxvZ0R1bXBFdmVudCBicXJfbG9nX2R1bXBfZXZlbnRfID0ge307Ci0gIC8vIExvY2FsIHdhbGwgY2xvY2sgdGltZXN0YW1wIG9mIHJlY2VpdmluZyBCUVIgVlNFIHN1Yi1ldmVudAotICBzdGQ6OnRtIHRtX3RpbWVzdGFtcF8gPSB7fTsKLX07Ci0KLS8vIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgUXVhbGl0eSBSZXBvcnQgSUQuCi0vLwotLy8gQHBhcmFtIHF1YWxpdHlfcmVwb3J0X2lkIFRoZSBxdWFsaXR5IHJlcG9ydCBJRCB0byBjb252ZXJ0LgotLy8gQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgUXVhbGl0eSBSZXBvcnQgSUQuCi1zdGQ6OnN0cmluZyBRdWFsaXR5UmVwb3J0SWRUb1N0cmluZyh1aW50OF90IHF1YWxpdHlfcmVwb3J0X2lkKTsKLQotLy8gR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQYWNrZXQgVHlwZS4KLS8vCi0vLyBAcGFyYW0gcGFja2V0X3R5cGUgVGhlIHBhY2tldCB0eXBlIHRvIGNvbnZlcnQuCi0vLyBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQYWNrZXQgVHlwZS4KLXN0ZDo6c3RyaW5nIFBhY2tldFR5cGVUb1N0cmluZyh1aW50OF90IHBhY2tldF90eXBlKTsKLQotLy8gRW5hYmxlL0Rpc2FibGUgQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0IG1lY2hhbmlzbS4KLS8vCi0vLyBXaGljaCBRdWFsaXR5IGV2ZW50IHdpbGwgYmUgZW5hYmxlZCBpcyBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmcgb2YgdGhlCi0vLyBwcm9wZXJ0eSAicGVyc2lzdC5ibHVldG9vdGguYnFyLmV2ZW50X21hc2siLgotLy8gQW5kIHRoZSBtaW5pbXVtIHRpbWUgaW50ZXJ2YWwgb2YgcXVhbGl0eSBldmVudCByZXBvcnRpbmcgZGVwZW5kcyBvbiB0aGUKLS8vIHNldHRpbmcgb2YgcHJvcGVydHkgInBlcnNpc3QuYmx1ZXRvb3RoLmJxci5taW5faW50ZXJ2YWxfbXMiLgotLy8KLS8vIEBwYXJhbSBpc19lbmFibGUgVHJ1ZS9GYWxzZSB0byBlbmFibGUvZGlzYWJsZSBCbHVldG9vdGggUXVhbGl0eSBSZXBvcnQKLS8vICAgbWVjaGFuaXNtIGluIHRoZSBCbHVldG9vdGggY29udHJvbGxlci4KLXZvaWQgRW5hYmxlQnRRdWFsaXR5UmVwb3J0KGJvb2wgaXNfZW5hYmxlKTsKLQotLy8gQ29uZmlndXJlIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCBzZXR0aW5nIHRvIHRoZSBCbHVldG9vdGggY29udHJvbGxlci4KLS8vCi0vLyBAcGFyYW0gYnFyX2NvbmZpZyBUaGUgc3RydWN0IG9mIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KLXZvaWQgQ29uZmlndXJlQnFyKGNvbnN0IEJxckNvbmZpZ3VyYXRpb24mIGJxcl9jb25maWcpOwotCi0vLyBDYWxsYmFjayBpbnZva2VkIG9uIGNvbXBsZXRpb24gb2YgdmVuZG9yIHNwZWNpZmljIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydAotLy8gY29tbWFuZC4KLS8vCi0vLyBAcGFyYW0gcF92c2NfY21wbF9wYXJhbXMgQSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBpbiB0aGUgdmVuZG9yCi0vLyAgIHNwZWNpZmljIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuCi12b2lkIEJxclZzY0NvbXBsZXRlQ2FsbGJhY2sodEJUTV9WU0NfQ01QTCogcF92c2NfY21wbF9wYXJhbXMpOwotCi0vLyBJbnZva2VkIG9uIGNvbXBsZXRpb24gb2YgQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0IGNvbmZpZ3VyYXRpb24uIFRoZW4gaXQgd2lsbAotLy8gUmVnaXN0ZXIvVW5yZWdpc3RlciBmb3IgcmVjZWl2aW5nIFZTRSAtIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCBzdWItZXZlbnQuCi0vLwotLy8gQHBhcmFtIGN1cnJlbnRfZXZ0X21hc2sgSW5kaWNhdGVzIGN1cnJlbnQgcXVhbGl0eSBldmVudCBiaXQgbWFzayBzZXR0aW5nIGluCi0vLyAgIHRoZSBCbHVldG9vdGggY29udHJvbGxlci4KLXZvaWQgQ29uZmlndXJlQnFyQ21wbCh1aW50MzJfdCBjdXJyZW50X2V2dF9tYXNrKTsKLQotLy8gQ2F0ZWdvcml6ZSB0aGUgaW5jb21pbmcgQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0LgotLy8KLS8vIEBwYXJhbSBsZW5ndGggTGVuZ3RocyBvZiB0aGUgcXVhbGl0eSByZXBvcnQgc2VudCBmcm9tIHRoZSBCbHVldG9vdGgKLS8vICAgY29udHJvbGxlci4KLS8vIEBwYXJhbSBwX2Jxcl9ldmVudCBBIHBvaW50ZXIgdG8gdGhlIEJRUiBWU0Ugc3ViLWV2ZW50IHdoaWNoIGlzIHNlbnQgZnJvbSB0aGUKLS8vICAgQmx1ZXRvb3RoIGNvbnRyb2xsZXIuCi12b2lkIENhdGVnb3JpemVCcXJFdmVudCh1aW50OF90IGxlbmd0aCwgdWludDhfdCogcF9icXJfZXZlbnQpOwotCi0vLyBSZWNvcmQgYSBuZXcgaW5jb21pbmcgTGluayBRdWFsaXR5IHJlbGF0ZWQgQlFSIGV2ZW50IGluIHF1YWxpdHkgZXZlbnQgcXVldWUuCi0vLwotLy8gQHBhcmFtIGxlbmd0aCBMZW5ndGhzIG9mIHRoZSBMaW5rIFF1YWxpdHkgcmVsYXRlZCBCUVIgZXZlbnQuCi0vLyBAcGFyYW0gcF9saW5rX3F1YWxpdHlfZXZlbnQgQSBwb2ludGVyIHRvIHRoZSBMaW5rIFF1YWxpdHkgcmVsYXRlZCBCUVIgZXZlbnQuCi12b2lkIEFkZExpbmtRdWFsaXR5RXZlbnRUb1F1ZXVlKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX2xpbmtfcXVhbGl0eV9ldmVudCk7Ci0KLS8vIER1bXAgdGhlIExNUC9MTCBtZXNzYWdlIGhhbmRzaGFraW5nIHdpdGggdGhlIHJlbW90ZSBkZXZpY2UgdG8gYSBsb2cgZmlsZS4KLS8vCi0vLyBAcGFyYW0gbGVuZ3RoIExlbmd0aHMgb2YgdGhlIExNUC9MTCBtZXNzYWdlIHRyYWNlIGV2ZW50LgotLy8gQHBhcmFtIHBfbG1wX2xsX21lc3NhZ2VfZXZlbnQgQSBwb2ludGVyIHRvIHRoZSBMTVAvTEwgbWVzc2FnZSB0cmFjZSBldmVudC4KLXZvaWQgRHVtcExtcExsTWVzc2FnZSh1aW50OF90IGxlbmd0aCwgdWludDhfdCogcF9sbXBfbGxfbWVzc2FnZV9ldmVudCk7Ci0KLS8vIE9wZW4gdGhlIExNUC9MTCBtZXNzYWdlIHRyYWNlIGxvZyBmaWxlLgotLy8KLS8vIEByZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIExNUC9MTCBtZXNzYWdlIHRyYWNlIGxvZyBmaWxlLgotaW50IE9wZW5MbXBMbFRyYWNlTG9nRmlsZSgpOwotCi0vLyBEdW1wIHRoZSBCbHVldG9vdGggTXVsdGktcHJvZmlsZS9Db2V4IHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gdG8gYSBsb2cgZmlsZS4KLS8vCi0vLyBAcGFyYW0gbGVuZ3RoIExlbmd0aHMgb2YgdGhlIEJsdWV0b290aCBNdWx0aS1wcm9maWxlL0NvZXggc2NoZWR1bGluZyB0cmFjZQotLy8gICBldmVudC4KLS8vIEBwYXJhbSBwX2J0X3NjaGVkdWxpbmdfZXZlbnQgQSBwb2ludGVyIHRvIHRoZSBCbHVldG9vdGggTXVsdGktcHJvZmlsZS9Db2V4Ci0vLyAgIHNjaGVkdWxpbmcgdHJhY2UgZXZlbnQuCi12b2lkIER1bXBCdFNjaGVkdWxpbmcodWludDhfdCBsZW5ndGgsIHVpbnQ4X3QqIHBfYnRfc2NoZWR1bGluZ19ldmVudCk7Ci0KLS8vIE9wZW4gdGhlIEJsdWV0b290aCBNdWx0aS1wcm9maWxlL0NvZXggc2NoZWR1bGluZyB0cmFjZSBsb2cgZmlsZS4KLS8vCi0vLyBAcmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBCbHVldG9vdGggTXVsdGktcHJvZmlsZS9Db2V4IHNjaGVkdWxpbmcKLS8vICAgdHJhY2UgbG9nIGZpbGUuCi1pbnQgT3BlbkJ0U2NoZWR1bGluZ1RyYWNlTG9nRmlsZSgpOwotCi0vLyBEdW1wIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCBpbmZvcm1hdGlvbi4KLS8vCi0vLyBAcGFyYW0gZmQgVGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgZm9yIGR1bXBpbmcgaW5mb3JtYXRpb24uCi12b2lkIERlYnVnRHVtcChpbnQgZmQpOwotCi19ICAvLyBuYW1lc3BhY2UgYnFyCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLSNlbmRpZiAgLy8gQlRJRl9CUVJfSF8KZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2NvbW1vbi5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmY5ZmEuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfQ09NTU9OX0gKLSNkZWZpbmUgQlRJRl9DT01NT05fSAotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotI2luY2x1ZGUgImFic3RyYWN0X21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFTU0VSVEMoY29uZCwgbXNnLCB2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0dfRVJST1IoIiMjIyBBU1NFUlQgOiAlcyAlcyBsaW5lICVkICVzICglZCkgIyMjIiwgX19GSUxFX18sIF9fZnVuY19fLCBcCi0gICAgICAgICAgICAgICAgX19MSU5FX18sIChtc2cpLCAodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8qIENhbGN1bGF0ZSBzdGFydCBvZiBldmVudCBlbnVtZXJhdGlvbjsgaWQgaXMgdG9wIDggYml0cyBvZiBldmVudCAqLwotI2RlZmluZSBCVElGX1NJR19TVEFSVChpZCkgKChpZCkgPDwgOCkKLQotLyogRm9yIHVwc3RyZWFtIHRoZSBNU0IgYml0IGlzIGFsd2F5cyBTRVQgKi8KLSNkZWZpbmUgQlRJRl9TSUdfQ0JfQklUICgweDgwMDApCi0jZGVmaW5lIEJUSUZfU0lHX0NCX1NUQVJUKGlkKSAoKChpZCkgPDwgOCkgfCBCVElGX1NJR19DQl9CSVQpCi0KLS8qCi0gKiBBIG1lbWNweSgzKSB3cmFwcGVyIHdoZW4gY29weWluZyBtZW1vcnkgdGhhdCBtaWdodCBub3QgYmUgYWxpZ25lZC4KLSAqCi0gKiBPbiBjZXJ0YWluIGFyY2hpdGVjdHVyZXMsIGlmIHRoZSBtZW1jcHkoMykgYXJndW1lbnRzIGFwcGVhciB0byBiZQotICogcG9pbnRpbmcgdG8gYWxpZ25lZCBtZW1vcnkgKGUuZy4sIHN0cnVjdCBwb2ludGVycyksIHRoZSBjb21waWxlciBtaWdodAotICogZ2VuZXJhdGUgb3B0aW1pemVkIG1lbWNweSgzKSBjb2RlLiBIb3dldmVyLCBpZiB0aGUgb3JpZ2luYWwgbWVtb3J5IHdhcyBub3QKLSAqIGFsaWduZWQgKGUuZy4sIGJlY2F1c2Ugb2YgaW5jb3JyZWN0ICJjaGFyICoiIHRvIHN0cnVjdCBwb2ludGVyIGNhc3RpbmcpLAotICogdGhlIHJlc3VsdCBjb2RlIG1pZ2h0IHRyaWdnZXIgU0lHQlVTIGNyYXNoLgotICoKLSAqIEFzIGEgc2hvcnQtdGVybSBzb2x1dGlvbiwgd2UgdXNlIHRoZSBoZWxwIG9mIHRoZSBtYXliZV9ub25fYWxpZ25lZF9tZW1jcHkoKQotICogbWFjcm8gdG8gaWRlbnRpZnkgYW5kIGZpeCBzdWNoIGNhc2VzLiBJbiB0aGUgZnV0dXJlLCB3ZSBzaG91bGQgZml4IHRoZQotICogcHJvYmxlbWF0aWMgImNoYXIgKiIgdG8gc3RydWN0IHBvaW50ZXIgY2FzdGluZywgYW5kIHRoaXMgbWFjcm8gaXRzZWxmIHNob3VsZAotICogYmUgcmVtb3ZlZC4KLSAqLwotI2RlZmluZSBtYXliZV9ub25fYWxpZ25lZF9tZW1jcHkoX2EsIF9iLCBfYykgXAotICBtZW1jcHkoKHZvaWQqKShfYSksICh2b2lkKikoX2IpLCAoX2MpKQotCi0vKiBCVElGIHN1Yi1zeXN0ZW1zICovCi0jZGVmaW5lIEJUSUZfQ09SRSAwCi0jZGVmaW5lIEJUSUZfRE0gMQotI2RlZmluZSBCVElGX0hGUCAyCi0jZGVmaW5lIEJUSUZfQVYgMwotI2RlZmluZSBCVElGX1BBTiA0Ci0jZGVmaW5lIEJUSUZfSEZfQ0xJRU5UIDUKLQotI2RlZmluZSBIQUxfQ0JBQ0soUF9DQiwgUF9DQkFDSywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChQX0NCKSAmJiAoUF9DQiktPlBfQ0JBQ0spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9BUEkoIiVzOiBIQUwgJXMtPiVzIiwgX19mdW5jX18sICNQX0NCLCAjUF9DQkFDSyk7IFwKLSAgICAgIChQX0NCKS0+UF9DQkFDSyhfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQVNTRVJUQygwLCAiQ2FsbGJhY2sgaXMgTlVMTCIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8qKgotICogQlRJRiBldmVudHMgZm9yIHJlcXVlc3RzIHRoYXQgcmVxdWlyZSBjb250ZXh0IHN3aXRjaCB0byBidGlmIHRhc2sKLSAqIG9uIGRvd25zdHJlYW1zIHBhdGgKLSAqLwotZW51bSB7Ci0gIEJUSUZfRE1fQVBJX1NUQVJUID0gQlRJRl9TSUdfU1RBUlQoQlRJRl9ETSksCi0gIEJUSUZfRE1fRU5BQkxFX1NFUlZJQ0UsCi0gIEJUSUZfRE1fRElTQUJMRV9TRVJWSUNFLAotICAvKiBhZGQgaGVyZSAqLwotCi0gIEJUSUZfSEZQX0FQSV9TVEFSVCA9IEJUSUZfU0lHX1NUQVJUKEJUSUZfSEZQKSwKLSAgLyogYWRkIGhlcmUgKi8KLQotICBCVElGX0FWX0FQSV9TVEFSVCA9IEJUSUZfU0lHX1NUQVJUKEJUSUZfQVYpLAotICAvKiBhZGQgaGVyZSAqLwotfTsKLQotLyoqCi0gKiBCVElGIGV2ZW50cyBmb3IgY2FsbGJhY2tzIHRoYXQgcmVxdWlyZSBjb250ZXh0IHN3aXRjaCB0byBidGlmIHRhc2sKLSAqIG9uIHVwc3RyZWFtIHBhdGggLSBUeXBpY2FsbHkgdGhlc2Ugd291bGQgYmUgbm9uLUJUQSBldmVudHMKLSAqIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgQlRJRiBsYXllci4KLSAqLwotZW51bSB7Ci0gIEJUSUZfQ09SRV9DQl9TVEFSVCA9IEJUSUZfU0lHX0NCX1NUQVJUKEJUSUZfQ09SRSksCi0gIC8qIGFkZCBoZXJlICovCi0KLSAgQlRJRl9IRlBfQ0JfU1RBUlQgPSBCVElGX1NJR19DQl9TVEFSVChCVElGX0hGUCksCi0gIEJUSUZfSEZQX0NCX0FVRElPX0NPTk5FQ1RJTkcsIC8qIEhGIEFVRElPIGNvbm5lY3QgaGFzIGJlZW4gc2VudCB0byBCVEEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5ICovCi0KLSAgQlRJRl9QQU5fQ0JfU1RBUlQgPSBCVElGX1NJR19DQl9TVEFSVChCVElGX1BBTiksCi0gIEJUSUZfUEFOX0NCX0RJU0NPTk5FQ1RJTkcsIC8qIFBBTiBEaXNjb25uZWN0IGhhcyBiZWVuIHNlbnQgdG8gQlRBIHN1Y2Nlc3NmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEJUSUZfSEZfQ0xJRU5UX0NMSUVOVF9DQl9TVEFSVCA9IEJUSUZfU0lHX0NCX1NUQVJUKEJUSUZfSEZfQ0xJRU5UKSwKLSAgQlRJRl9IRl9DTElFTlRfQ0JfQVVESU9fQ09OTkVDVElORywgLyogQVVESU8gY29ubmVjdCBoYXMgYmVlbiBzZW50IHRvIEJUQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBkZWZpbml0aW9ucyBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHZvaWQodEJUSUZfQ0JBQ0spKHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX3BhcmFtKTsKLXR5cGVkZWYgdm9pZCh0QlRJRl9DT1BZX0NCQUNLKSh1aW50MTZfdCBldmVudCwgY2hhciogcF9kZXN0LCBjaGFyKiBwX3NyYyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBkZWZpbml0aW9ucyBhbmQgcmV0dXJuIHZhbHVlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdGhpcyB0eXBlIGhhbmRsZXMgYWxsIGJ0aWYgY29udGV4dCBzd2l0Y2hlcyBiZXR3ZWVuIEJUVSBhbmQgSEFMICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHRCVElGX0NCQUNLKiBwX2NiOyAvKiBjb250ZXh0IHN3aXRjaCBjYWxsYmFjayAqLwotCi0gIC8qIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGNhbGxiYWNrICovCi0gIHVpbnQxNl90IGV2ZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVzc2FnZSBldmVudCBpZCAqLwotICBjaGFyIF9fYXR0cmlidXRlX18oKGFsaWduZWQpKSBwX3BhcmFtW107IC8qIHBhcmFtZXRlciBhcmVhIG5lZWRzIHRvIGJlIGxhc3QgKi8KLX0gdEJUSUZfQ09OVEVYVF9TV0lUQ0hfQ0JBQ0s7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gYnRfc3RhdHVzX3QgZG9faW5fam5pX3RocmVhZChiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrKTsKLWV4dGVybiBidF9zdGF0dXNfdCBkb19pbl9qbmlfdGhyZWFkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrKTsKLWV4dGVybiBib29sIGlzX29uX2puaV90aHJlYWQoKTsKLWV4dGVybiBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AqIGdldF9qbmlfbWVzc2FnZV9sb29wKCk7Ci0KLXVzaW5nIEJ0Sm5pQ2xvc3VyZSA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPjsKLXZvaWQgcG9zdF9vbl9idF9qbmkoQnRKbmlDbG9zdXJlIGNsb3N1cmUpOwotCi0vKioKLSAqIFRoaXMgdGVtcGxhdGUgd3JhcHMgY2FsbGJhY2sgaW50byBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgb24gam5pCi0gKiB0aHJlYWQKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1iYXNlOjpDYWxsYmFjazxSKEFyZ3MuLi4pPiBqbmlfdGhyZWFkX3dyYXBwZXIoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpDYWxsYmFjazxSKEFyZ3MuLi4pPiBjYikgewotICByZXR1cm4gYmFzZTo6QmluZCgKLSAgICAgIFtdKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsIGJhc2U6OkNhbGxiYWNrPFIoQXJncy4uLik+IGNiLAotICAgICAgICAgQXJncy4uLiBhcmdzKSB7Ci0gICAgICAgIGRvX2luX2puaV90aHJlYWQoZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoY2IsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotICAgICAgfSwKLSAgICAgIGZyb21faGVyZSwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXRCVEFfU0VSVklDRV9NQVNLIGJ0aWZfZ2V0X2VuYWJsZWRfc2VydmljZXNfbWFzayh2b2lkKTsKLXZvaWQgYnRpZl9lbmFibGVfc2VydmljZSh0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCk7Ci12b2lkIGJ0aWZfZGlzYWJsZV9zZXJ2aWNlKHRCVEFfU0VSVklDRV9JRCBzZXJ2aWNlX2lkKTsKLWludCBidGlmX2lzX2VuYWJsZWQodm9pZCk7Ci0KLS8qKgotICogQlRJRl9FdmVudHMKLSAqLwotdm9pZCBidGlmX2VuYWJsZV9ibHVldG9vdGhfZXZ0KCk7Ci12b2lkIGJ0aWZfYWRhcHRlcl9wcm9wZXJ0aWVzX2V2dChidF9zdGF0dXNfdCBzdGF0dXMsIHVpbnQzMl90IG51bV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHBfcHJvcHMpOwotdm9pZCBidGlmX3JlbW90ZV9wcm9wZXJ0aWVzX2V2dChidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1fcHJvcHMsIGJ0X3Byb3BlcnR5X3QqIHBfcHJvcHMpOwotCi12b2lkIGJ0ZV9sb2FkX2RpZF9jb25mKGNvbnN0IGNoYXIqIHBfcGF0aCk7Ci12b2lkIGJ0ZV9tYWluX2luaXQodm9pZCk7Ci0KLWJ0X3N0YXR1c190IGJ0aWZfdHJhbnNmZXJfY29udGV4dCh0QlRJRl9DQkFDSyogcF9jYmFjaywgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9wYXJhbXMsIGludCBwYXJhbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUSUZfQ09QWV9DQkFDSyogcF9jb3B5X2NiYWNrKTsKLQotdm9pZCBidGlmX2luaXRfb2soKTsKLQotdm9pZCBpbnZva2VfYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiKGJ0X3N0YXRlX3Qgc3RhdGUpOwotdm9pZCBpbnZva2VfYWRhcHRlcl9wcm9wZXJ0aWVzX2NiKGJ0X3N0YXR1c190IHN0YXR1cywgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpOwotdm9pZCBpbnZva2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKTsKLXZvaWQgaW52b2tlX2RldmljZV9mb3VuZF9jYihpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpOwotdm9pZCBpbnZva2VfZGlzY292ZXJ5X3N0YXRlX2NoYW5nZWRfY2IoYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpOwotdm9pZCBpbnZva2VfcGluX3JlcXVlc3RfY2IoUmF3QWRkcmVzcyBiZF9hZGRyLCBidF9iZG5hbWVfdCBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kLCBib29sIG1pbl8xNl9kaWdpdCk7Ci12b2lkIGludm9rZV9zc3BfcmVxdWVzdF9jYihSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2JkbmFtZV90IGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19rZXkpOwotdm9pZCBpbnZva2Vfb29iX2RhdGFfcmVxdWVzdF9jYih0QlRfVFJBTlNQT1JUIHQsIGJvb2wgdmFsaWQsIE9jdGV0MTYgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0ZXQxNiByLCBSYXdBZGRyZXNzIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkZHJlc3NfdHlwZSk7Ci12b2lkIGludm9rZV9ib25kX3N0YXRlX2NoYW5nZWRfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlLCBpbnQgZmFpbF9yZWFzb24pOwotdm9pZCBpbnZva2VfYWNsX3N0YXRlX2NoYW5nZWRfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9hY2xfc3RhdGVfdCBzdGF0ZSwgaW50IHRyYW5zcG9ydF9saW5rX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9oY2lfZXJyb3JfY29kZV90IGhjaV9yZWFzb24pOwotdm9pZCBpbnZva2VfdGhyZWFkX2V2dF9jYihidF9jYl90aHJlYWRfZXZ0IGV2ZW50KTsKLXZvaWQgaW52b2tlX2xlX3Rlc3RfbW9kZV9jYihidF9zdGF0dXNfdCBzdGF0dXMsIHVpbnQxNl90IGNvdW50KTsKLXZvaWQgaW52b2tlX2VuZXJneV9pbmZvX2NiKGJ0X2FjdGl2aXR5X2VuZXJneV9pbmZvIGVuZXJneV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfdWlkX3RyYWZmaWNfdCogdWlkX2RhdGEpOwotdm9pZCBpbnZva2VfbGlua19xdWFsaXR5X3JlcG9ydF9jYigKLSAgICB1aW50NjRfdCB0aW1lc3RhbXAsIGludCByZXBvcnRfaWQsIGludCByc3NpLCBpbnQgc25yLAotICAgIGludCByZXRyYW5zbWlzc2lvbl9jb3VudCwgaW50IHBhY2tldHNfbm90X3JlY2VpdmVfY291bnQsCi0gICAgaW50IG5lZ2F0aXZlX2Fja25vd2xlZGdlbWVudF9jb3VudCk7Ci0KLSNlbmRpZiAvKiBCVElGX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCBiL2J0aWYvaW5jbHVkZS9idGlmX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdkZDNhLi4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIEJUSUZfQ09ORklHX01PRFVMRVtdID0gImJ0aWZfY29uZmlnX21vZHVsZSI7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBCVF9DT05GSUdfS0VZX1NEUF9ESV9NQU5VRkFDVFVSRVIgPQotICAgICJTZHBEaU1hbnVmYWN0dXJlciI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgQlRfQ09ORklHX0tFWV9TRFBfRElfTU9ERUwgPSAiU2RwRGlNb2RlbCI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgQlRfQ09ORklHX0tFWV9TRFBfRElfSFdfVkVSU0lPTiA9Ci0gICAgIlNkcERpSGFyZHdhcmVWZXJzaW9uIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBCVF9DT05GSUdfS0VZX1NEUF9ESV9WRU5ET1JfSURfU1JDID0KLSAgICAiU2RwRGlWZW5kb3JJZFNvdXJjZSI7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfTUZDVCA9ICJNYW51ZmFjdHVyZXIiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIEJUX0NPTkZJR19LRVlfUkVNT1RFX1ZFUl9WRVIgPSAiTG1wVmVyIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfU1VCVkVSID0gIkxtcFN1YlZlciI7Ci0KLWJvb2wgYnRpZl9jb25maWdfZXhpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOwotYm9vbCBidGlmX2NvbmZpZ19nZXRfaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCogdmFsdWUpOwotYm9vbCBidGlmX2NvbmZpZ19zZXRfaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSk7Ci1ib29sIGJ0aWZfY29uZmlnX2dldF91aW50NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHZhbHVlKTsKLWJvb2wgYnRpZl9jb25maWdfc2V0X3VpbnQ2NChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSk7Ci1ib29sIGJ0aWZfY29uZmlnX2dldF9zdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogdmFsdWUsIGludCogc2l6ZV9ieXRlcyk7Ci1ib29sIGJ0aWZfY29uZmlnX3NldF9zdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLWJvb2wgYnRpZl9jb25maWdfZ2V0X2Jpbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgc2l6ZV90KiBsZW5ndGgpOwotYm9vbCBidGlmX2NvbmZpZ19zZXRfYmluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCBzaXplX3QgbGVuZ3RoKTsKLWJvb2wgYnRpZl9jb25maWdfcmVtb3ZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5KTsKLQotc2l6ZV90IGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOwotCi1zdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBidGlmX2NvbmZpZ19nZXRfcGFpcmVkX2RldmljZXMoKTsKLQotdm9pZCBidGlmX2NvbmZpZ19zYXZlKHZvaWQpOwotdm9pZCBidGlmX2NvbmZpZ19mbHVzaCh2b2lkKTsKLWJvb2wgYnRpZl9jb25maWdfY2xlYXIodm9pZCk7Ci0KLS8vIFRPRE8oemFjaG92ZXJmbG93KTogRXd3Li4ud2UgbmVlZCB0byBtb3ZlIHRoZXNlIG91dC4gVGhlc2UgYXJlIHBlZXIgc3BlY2lmaWMsCi0vLyBub3QgY29uZmlnIGdlbmVyYWwuCi1ib29sIGJ0aWZfZ2V0X2FkZHJlc3NfdHlwZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKTsKLWJvb2wgYnRpZl9nZXRfZGV2aWNlX3R5cGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgaW50KiBwX2RldmljZV90eXBlKTsKLQotdm9pZCBidGlmX2RlYnVnX2NvbmZpZ19kdW1wKGludCBmZCk7CmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9jb25maWdfY2FjaGUuaCBiL2J0aWYvaW5jbHVkZS9idGlmX2NvbmZpZ19jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTJkODI5Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2NvbmZpZ19jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgImNvbW1vbi9scnUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb25maWcuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJyYXdfYWRkcmVzcy5oIgotCi1jbGFzcyBCdGlmQ29uZmlnQ2FjaGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQnRpZkNvbmZpZ0NhY2hlKHNpemVfdCBjYXBhY2l0eSk7Ci0gIH5CdGlmQ29uZmlnQ2FjaGUoKTsKLQotICB2b2lkIENsZWFyKCk7Ci0gIHZvaWQgSW5pdChzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IHNvdXJjZSk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRQZXJzaXN0ZW50U2VjdGlvbk5hbWVzKCk7Ci0gIGNvbmZpZ190IFBlcnNpc3RlbnRTZWN0aW9uQ29weSgpOwotICBib29sIEhhc1NlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25fbmFtZSk7Ci0gIGJvb2wgSGFzVW5wYWlyZWRTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uX25hbWUpOwotICBib29sIEhhc1BlcnNpc3RlbnRTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uX25hbWUpOwotICBib29sIEhhc0tleShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5KTsKLSAgYm9vbCBSZW1vdmVLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0gIHZvaWQgUmVtb3ZlUGVyc2lzdGVudFNlY3Rpb25zV2l0aEtleShjb25zdCBzdGQ6OnN0cmluZyYga2V5KTsKLQotICAvLyBTZXR0ZXJzIGFuZCBnZXR0ZXJzCi0gIHZvaWQgU2V0U3RyaW5nKHN0ZDo6c3RyaW5nIHNlY3Rpb25fbmFtZSwgc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSk7Ci0gIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEdldFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0gIHZvaWQgU2V0SW50KHN0ZDo6c3RyaW5nIHNlY3Rpb25fbmFtZSwgc3RkOjpzdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotICBzdGQ6Om9wdGlvbmFsPGludD4gR2V0SW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0gIHZvaWQgU2V0VWludDY0KHN0ZDo6c3RyaW5nIHNlY3Rpb25fbmFtZSwgc3RkOjpzdHJpbmcga2V5LCB1aW50NjRfdCB2YWx1ZSk7Ci0gIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IEdldFVpbnQ2NChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0gIHZvaWQgU2V0Qm9vbChzdGQ6OnN0cmluZyBzZWN0aW9uX25hbWUsIHN0ZDo6c3RyaW5nIGtleSwgYm9vbCB2YWx1ZSk7Ci0gIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gR2V0Qm9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0KLSBwcml2YXRlOgotICBibHVldG9vdGg6OmNvbW1vbjo6TGVnYWN5THJ1Q2FjaGU8c3RkOjpzdHJpbmcsIHNlY3Rpb25fdD4KLSAgICAgIHVucGFpcmVkX2RldmljZXNfY2FjaGVfOwotICBjb25maWdfdCBwYWlyZWRfZGV2aWNlc19saXN0XzsKLX07CmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9jb25maWdfdHJhbnNjb2RlLmggYi9idGlmL2luY2x1ZGUvYnRpZl9jb25maWdfdHJhbnNjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWI5NDMuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfY29uZmlnX3RyYW5zY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotCi1zdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGJ0aWZfY29uZmlnX3RyYW5zY29kZShjb25zdCBjaGFyKiB4bWxfZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfZGVidWcuaCBiL2J0aWYvaW5jbHVkZS9idGlmX2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTRlNTAuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vLyBEZWJ1ZyBBUEkKLQotdm9pZCBidGlmX2RlYnVnX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9kZWJ1Z19idHNub29wLmggYi9idGlmL2luY2x1ZGUvYnRpZl9kZWJ1Z19idHNub29wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjA1N2QuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfYnRzbm9vcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgQlRTTk9PWl9DVVJSRU5UX1ZFUlNJT04gMHgwMgotCi0vLyBUaGUgcHJlYW1ibGUgaXMgc3RvcmVkIHVuLWVuY3J5cHRlZCBhcyB0aGUgZmlyc3QgcGFydAotLy8gb2YgdGhlIGZpbGUuCi10eXBlZGVmIHN0cnVjdCBidHNub296X3ByZWFtYmxlX3QgewotICB1aW50OF90IHZlcnNpb247Ci0gIHVpbnQ2NF90IGxhc3RfdGltZXN0YW1wX21zOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgYnRzbm9vel9wcmVhbWJsZV90OwotCi0vLyBPbmUgaGVhZGVyIGZvciBlYWNoIEhDSSBwYWNrZXQKLXR5cGVkZWYgc3RydWN0IGJ0c25vb3pfaGVhZGVyX3QgewotICB1aW50MTZfdCBsZW5ndGg7Ci0gIHVpbnQxNl90IHBhY2tldF9sZW5ndGg7Ci0gIHVpbnQzMl90IGRlbHRhX3RpbWVfbXM7Ci0gIHVpbnQ4X3QgdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIGJ0c25vb3pfaGVhZGVyX3Q7Ci0KLS8vIEluaXRpYWxpemVzIGJ0c25vb3AgbWVtb3J5IGxvZ2dpbmcgYW5kIHJlZ2lzdGVycwotdm9pZCBidGlmX2RlYnVnX2J0c25vb3BfaW5pdCh2b2lkKTsKLQotLy8gV3JpdGVzIGJ0c25vb3AgZGF0YSBiYXNlNjQgZW5jb2RlZCB0byBmZAotdm9pZCBidGlmX2RlYnVnX2J0c25vb3BfZHVtcChpbnQgZmQpOwpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfY29ubi5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfY29ubi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWIzMzM1Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2RlYnVnX2Nvbm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSAiZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi10eXBlZGVmIGVudW0gewotICBCVElGX0RFQlVHX0NPTk5FQ1RFRCA9IDEsCi0gIEJUSUZfREVCVUdfRElTQ09OTkVDVEVECi19IGJ0aWZfZGVidWdfY29ubl9zdGF0ZV90OwotCi0vLyBSZXBvcnQgYSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZQotdm9pZCBidGlmX2RlYnVnX2Nvbm5fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRpZl9kZWJ1Z19jb25uX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0R0FUVF9ESVNDT05OX1JFQVNPTiBkaXNjb25uZWN0X3JlYXNvbik7Ci0KLXZvaWQgYnRpZl9kZWJ1Z19jb25uX2R1bXAoaW50IGZkKTsKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2RtLmggYi9idGlmL2luY2x1ZGUvYnRpZl9kbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmYwNDc2Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2RtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX0RNX0gKLSNkZWZpbmUgQlRJRl9ETV9ICi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRlX2FwcGwuaCIKLSNpbmNsdWRlICJidGlmX3VpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2RtX2luaXQodWlkX3NldF90KiBzZXQpOwotdm9pZCBidGlmX2RtX2NsZWFudXAodm9pZCk7Ci0KLS8qKgotICogQlRJRiBjYWxsYmFjayB0byBzd2l0Y2ggY29udGV4dCBmcm9tIGJ0ZSB0byBidGlmCi0gKi8KLXZvaWQgYnRlX2RtX2V2dCh0QlRBX0RNX1NFQ19FVlQgZXZlbnQsIHRCVEFfRE1fU0VDKiBwX2RhdGEpOwotCi0vKioKLSAqIE5vdGlmeSBCVCBkaXNhYmxlIGJlaW5nIGluaXRpYXRlZC4gRE0gbWF5IGNob3NlIHRvIGFib3J0Ci0gKiBwZW5kaW5nIGNvbW1hbmRzLCBsaWtlIHBhaXJpbmcKLSAqLwotdm9pZCBidGlmX2RtX29uX2Rpc2FibGUodm9pZCk7Ci0KLS8qKgotICogQ2FsbG91dCBmb3IgaGFuZGxpbmcgaW9fY2FwYWJpbGl0aWVzIHJlcXVlc3QKLSAqLwotdm9pZCBidGlmX2RtX3Byb2NfaW9fcmVxKHRCVE1fQVVUSF9SRVEqIHBfYXV0aF9yZXEsIGJvb2wgaXNfb3JpZyk7Ci0vKioKLSAqIENhbGxvdXQgZm9yIGhhbmRsaW5nIGlvX2NhcGFiaWxpdGllcyByZXNwb25zZQotICovCi12b2lkIGJ0aWZfZG1fcHJvY19pb19yc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9JT19DQVAgaW9fY2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fT09CX0RBVEEgb29iX2RhdGEsIHRCVE1fQVVUSF9SRVEgYXV0aF9yZXEpOwotCi0vKioKLSAqIE91dC1vZi1iYW5kIGZ1bmN0aW9ucwotICovCi12b2lkIGJ0aWZfZG1fc2V0X29vYl9mb3JfaW9fcmVxKHRCVE1fT09CX0RBVEEqIHBfb29iX2RhdGEpOwotdm9pZCBidGlmX2RtX3NldF9vb2JfZm9yX2xlX2lvX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX09PQl9EQVRBKiBwX29vYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0FVVEhfUkVRKiBwX2F1dGhfcmVxKTsKLSNpZmRlZiBCVElGX0RNX09PQl9URVNUCi12b2lkIGJ0aWZfZG1fbG9hZF9sb2NhbF9vb2Iodm9pZCk7Ci12b2lkIGJ0aWZfZG1fcHJvY19sb2Nfb29iKHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIGlzX3ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKTsKLWJvb2wgYnRpZl9kbV9wcm9jX3JtdF9vb2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgT2N0ZXQxNiogcF9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPY3RldDE2KiBwX3IpOwotdm9pZCBidGlmX2RtX2dlbmVyYXRlX2xvY2FsX29vYl9kYXRhKHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLSNlbmRpZiAvKiBCVElGX0RNX09PQl9URVNUICovCi0KLS8qY2FsbG91dCBmb3IgcmVhZGluZyBTTVAgcHJvcGVydGllcyBmcm9tIFRleHQgZmlsZSovCi1ib29sIGJ0aWZfZG1fZ2V0X3NtcF9jb25maWcodEJURV9BUFBMX0NGRyogcF9jZmcpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaXNfcGVuY19rZXlfcmN2ZDsKLSAgdEJUTV9MRV9QRU5DX0tFWVMgcGVuY19rZXk7IC8qIHJlY2VpdmVkIHBlZXIgZW5jcnlwdGlvbiBrZXkgKi8KLSAgYm9vbCBpc19wY3Nya19rZXlfcmN2ZDsKLSAgdEJUTV9MRV9QQ1NSS19LRVlTIHBjc3JrX2tleTsgLyogcmVjZWl2ZWQgcGVlciBkZXZpY2UgU1JLICovCi0gIGJvb2wgaXNfcGlkX2tleV9yY3ZkOwotICB0QlRNX0xFX1BJRF9LRVlTIHBpZF9rZXk7IC8qIHBlZXIgZGV2aWNlIElEIGtleSAqLwotICBib29sIGlzX2xlbmNfa2V5X3JjdmQ7Ci0gIHRCVE1fTEVfTEVOQ19LRVlTCi0gICAgICBsZW5jX2tleTsgLyogbG9jYWwgZW5jcnlwdGlvbiByZXByb2R1Y3Rpb24ga2V5cyBMVEsgPSA9IGQxKEVSLERJViwwKSovCi0gIGJvb2wgaXNfbGNzcmtfa2V5X3JjdmQ7Ci0gIHRCVE1fTEVfTENTUktfS0VZUyBsY3Nya19rZXk7IC8qIGxvY2FsIGRldmljZSBDU1JLID0gZDEoRVIsRElWLDEpKi8KLSAgYm9vbCBpc19saWRrX2tleV9yY3ZkOyAgICAgICAgLyogbG9jYWwgaWRlbnRpdHkga2V5IHJlY2VpdmVkICovCi19IGJ0aWZfZG1fYmxlX2NiX3Q7Ci0KLSNkZWZpbmUgQlRJRl9ETV9MRV9MT0NBTF9LRVlfSVIgKDEgPDwgMCkKLSNkZWZpbmUgQlRJRl9ETV9MRV9MT0NBTF9LRVlfSVJLICgxIDw8IDEpCi0jZGVmaW5lIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0RISyAoMSA8PCAyKQotI2RlZmluZSBCVElGX0RNX0xFX0xPQ0FMX0tFWV9FUiAoMSA8PCAzKQotCi12b2lkIGJ0aWZfZG1fbG9hZF9ibGVfbG9jYWxfa2V5cyh2b2lkKTsKLXZvaWQgYnRpZl9kbV9nZXRfYmxlX2xvY2FsX2tleXModEJUQV9ETV9CTEVfTE9DQUxfS0VZX01BU0sqIHBfa2V5X21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIHBfZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQkxFX0xPQ0FMX0lEX0tFWVMqIHBfaWRfa2V5cyk7Ci12b2lkIGJ0aWZfZG1fdXBkYXRlX2JsZV9yZW1vdGVfcHJvcGVydGllcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfTkFNRSBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlKTsKLQotYm9vbCBjaGVja19jb2RfaGlkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9nYXR0LmggYi9idGlmL2luY2x1ZGUvYnRpZl9nYXR0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTFlNmQuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfZ2F0dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIE5hbWU6ICAgICAgICAgIGJ0aWZfZ2F0dC5oCi0gKgotICogIERlc2NyaXB0aW9uOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX0dBVFRfSAotI2RlZmluZSBCVElGX0dBVFRfSAotCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0LmgiCi0KLWV4dGVybiBjb25zdCBidGdhdHRfY2xpZW50X2ludGVyZmFjZV90IGJ0Z2F0dENsaWVudEludGVyZmFjZTsKLWV4dGVybiBjb25zdCBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90IGJ0Z2F0dFNlcnZlckludGVyZmFjZTsKLQotQmxlQWR2ZXJ0aXNlckludGVyZmFjZSogZ2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCk7Ci1CbGVTY2FubmVySW50ZXJmYWNlKiBnZXRfYmxlX3NjYW5uZXJfaW5zdGFuY2UoKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfZ2F0dF91dGlsLmggYi9idGlmL2luY2x1ZGUvYnRpZl9nYXR0X3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllOGMwOS4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9nYXR0X3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9HQVRUX1VUSUxfSAotI2RlZmluZSBCVElGX0dBVFRfVVRJTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9nYXR0Lmg+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIGJ0aWZfdG9fYnRhX3Jlc3BvbnNlKHRHQVRUU19SU1AqIHBfZGVzdCwgYnRnYXR0X3Jlc3BvbnNlX3QqIHBfc3JjKTsKLQotdm9pZCBidGlmX2dhdHRfY2hlY2tfZW5jcnlwdGVkX2xpbmsoUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotZXh0ZXJuIHZvaWQgYnRpZl9nYXR0X21vdmVfdHJhY2tfYWR2X2RhdGEoYnRnYXR0X3RyYWNrX2Fkdl9pbmZvX3QqIHBfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0Z2F0dF90cmFja19hZHZfaW5mb190KiBwX3NyYyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfaGQuaCBiL2J0aWYvaW5jbHVkZS9idGlmX2hkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZWJkY2YuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfaGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfSERfSAotI2RlZmluZSBCVElGX0hEX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hkLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRJRl9IRF9ESVNBQkxFRCA9IDAsCi0gIEJUSUZfSERfRU5BQkxFRCwKLSAgQlRJRl9IRF9ESVNBQkxJTkcKLX0gQlRJRl9IRF9TVEFUVVM7Ci0KLS8qIEJUSUYtSEQgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVElGX0hEX1NUQVRVUyBzdGF0dXM7Ci0gIGJvb2wgYXBwX3JlZ2lzdGVyZWQ7Ci0gIGJvb2wgc2VydmljZV9kZXJlZ19hY3RpdmU7Ci0gIGJvb2wgZm9yY2VkX2Rpc2M7Ci19IGJ0aWZfaGRfY2JfdDsKLQotZXh0ZXJuIGJ0aWZfaGRfY2JfdCBidGlmX2hkX2NiOwotCi1leHRlcm4gdm9pZCBidGlmX2hkX3JlbW92ZV9kZXZpY2UoUmF3QWRkcmVzcyBiZF9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0aWZfaGRfc2VydmljZV9yZWdpc3RyYXRpb24oKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9oZi5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfaGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxOWFlMS4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9oZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2ludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoZWFkc2V0IHsKLQotLyoqCi0gKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIGhlYWRzZXQgaW50ZXJmYWNlIGZyb20gdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyeQotICoKLSAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGhlYWRzZXQgaW50ZXJmYWNlCi0gKi8KLUludGVyZmFjZSogR2V0SW50ZXJmYWNlKCk7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIEhhbmRzLUZyZWUgY2FsbCBpbiBwcm9ncmVzcy4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgbm8gY2FsbCBpcyBpbiBwcm9ncmVzcy4KLSAqLwotYm9vbCBJc0NhbGxJZGxlKCk7Ci0KLS8qKgotICogU3RhcnQgdXAgb3Igc2h1dGRvd24gdGhlIHNlcnZpY2UKLSAqCi0gKiBAcGFyYW0gYl9lbmFibGUgdHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKLSAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKi8KLWJ0X3N0YXR1c190IEV4ZWN1dGVTZXJ2aWNlKGJvb2wgYl9lbmFibGUpOwotCi19ICAvLyBuYW1lc3BhY2UgaGVhZHNldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfaGguaCBiL2J0aWYvaW5jbHVkZS9idGlmX2hoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxM2MzYTUuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfaGguaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfSEhfSAotI2RlZmluZSBCVElGX0hIX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hoLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2hoX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBCVElGX0hIX01BWF9ISUQgOAotI2RlZmluZSBCVElGX0hIX01BWF9BRERFRF9ERVYgMzIKLQotI2RlZmluZSBCVElGX0hIX01BWF9LRVlTVEFURVMgMwotI2RlZmluZSBCVElGX0hIX0tFWVNUQVRFX01BU0tfTlVNTE9DSyAweDAxCi0jZGVmaW5lIEJUSUZfSEhfS0VZU1RBVEVfTUFTS19DQVBTTE9DSyAweDAyCi0jZGVmaW5lIEJUSUZfSEhfS0VZU1RBVEVfTUFTS19TQ1JPTExMT0NLIDB4MDQKLQotI2RlZmluZSBCVElGX0hIX01BWF9QT0xMSU5HX0FUVEVNUFRTIDEwCi0jZGVmaW5lIEJUSUZfSEhfUE9MTElOR19TTEVFUF9EVVJBVElPTl9VUyA1MDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBkZWZpbml0aW9ucyBhbmQgcmV0dXJuIHZhbHVlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBlbnVtIDogdW5zaWduZWQgewotICBCVElGX0hIX0RJU0FCTEVEID0gMCwKLSAgQlRJRl9ISF9FTkFCTEVELAotICBCVElGX0hIX0RJU0FCTElORywKLSAgQlRJRl9ISF9ERVZfVU5LTk9XTiwKLSAgQlRJRl9ISF9ERVZfQ09OTkVDVElORywKLSAgQlRJRl9ISF9ERVZfQ09OTkVDVEVELAotICBCVElGX0hIX0RFVl9ESVNDT05ORUNURUQKLX0gQlRJRl9ISF9TVEFUVVM7Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgYnRpZl9oaF9zdGF0dXNfdGV4dChjb25zdCBCVElGX0hIX1NUQVRVUyYgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVElGX0hIX0RJU0FCTEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUSUZfSEhfRU5BQkxFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVElGX0hIX0RJU0FCTElORyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVElGX0hIX0RFVl9VTktOT1dOKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUSUZfSEhfREVWX0NPTk5FQ1RJTkcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRJRl9ISF9ERVZfQ09OTkVDVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUSUZfSEhfREVWX0RJU0NPTk5FQ1RFRCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTlslaGh1XSIsIHN0YXR1cyk7Ci0gIH0KLX0KLSN1bmRlZiBDQVNFX1JFVFVSTl9URVhUCi0KLS8vIFNoYXJlZCB3aXRoIHVoaWQgcG9sbGluZyB0aHJlYWQKLXR5cGVkZWYgc3RydWN0IHsKLSAgYnRoaF9jb25uZWN0aW9uX3N0YXRlX3QgZGV2X3N0YXR1czsKLSAgdWludDhfdCBkZXZfaGFuZGxlOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVEFfSEhfQVRUUl9NQVNLIGF0dHJfbWFzazsKLSAgdWludDhfdCBzdWJfY2xhc3M7Ci0gIHVpbnQ4X3QgYXBwX2lkOwotICBpbnQgZmQ7Ci0gIGJvb2wgcmVhZHlfZm9yX2RhdGE7Ci0gIHB0aHJlYWRfdCBoaF9wb2xsX3RocmVhZF9pZDsKLSAgcGlkX3QgcGlkey0xfTsKLSAgdWludDhfdCBoaF9rZWVwX3BvbGxpbmc7Ci0gIGFsYXJtX3QqIHZ1cF90aW1lcjsKLSAgZml4ZWRfcXVldWVfdCogZ2V0X3JwdF9pZF9xdWV1ZTsKLSAgdWludDhfdCBnZXRfcnB0X3NudDsKLSAgYm9vbCBsb2NhbF92dXA7ICAvLyBJbmRpY2F0ZWQgbG9jYWxseSBpbml0aWF0ZWQgVlVQCi19IGJ0aWZfaGhfZGV2aWNlX3Q7Ci0KLS8qIENvbnRyb2wgYmxvY2sgdG8gbWFpbnRhaW4gcHJvcGVydGllcyBvZiBkZXZpY2VzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgZGV2X2hhbmRsZTsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB0QlRBX0hIX0FUVFJfTUFTSyBhdHRyX21hc2s7Ci19IGJ0aWZfaGhfYWRkZWRfZGV2aWNlX3Q7Ci0KLS8qKgotICogQlRJRi1ISCBjb250cm9sIGJsb2NrIHRvIG1haW50YWluIGFkZGVkIGRldmljZXMgYW5kIGN1cnJlbnRseQotICogY29ubmVjdGVkIGhpZCBkZXZpY2VzCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRJRl9ISF9TVEFUVVMgc3RhdHVzOwotICBidGlmX2hoX2RldmljZV90IGRldmljZXNbQlRJRl9ISF9NQVhfSElEXTsKLSAgdWludDMyX3QgZGV2aWNlX251bTsKLSAgYnRpZl9oaF9hZGRlZF9kZXZpY2VfdCBhZGRlZF9kZXZpY2VzW0JUSUZfSEhfTUFYX0FEREVEX0RFVl07Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfY3Vycl9kZXY7Ci0gIGJvb2wgc2VydmljZV9kZXJlZ19hY3RpdmU7Ci0gIFJhd0FkZHJlc3MgcGVuZGluZ19jb25uX2FkZHJlc3M7Ci19IGJ0aWZfaGhfY2JfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBidGlmX2hoX2NiX3QgYnRpZl9oaF9jYjsKLQotZXh0ZXJuIGJ0aWZfaGhfZGV2aWNlX3QqIGJ0aWZfaGhfZmluZF9jb25uZWN0ZWRfZGV2X2J5X2hhbmRsZSh1aW50OF90IGhhbmRsZSk7Ci1leHRlcm4gdm9pZCBidGlmX2hoX3JlbW92ZV9kZXZpY2UoUmF3QWRkcmVzcyBiZF9hZGRyKTsKLWV4dGVybiBib29sIGJ0aWZfaGhfYWRkX2FkZGVkX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ISF9BVFRSX01BU0sgYXR0cl9tYXNrKTsKLWV4dGVybiBidF9zdGF0dXNfdCBidGlmX2hoX3ZpcnR1YWxfdW5wbHVnKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRpZl9oaF9kaXNjb25uZWN0KFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRpZl9oaF9zZXRyZXBvcnQoYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhoX3JlcG9ydF90eXBlX3Qgcl90eXBlLCB1aW50MTZfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmVwb3J0KTsKLWV4dGVybiB2b2lkIGJ0aWZfaGhfc2VuZGRhdGEoYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYsIHVpbnQxNl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJlcG9ydCk7Ci1leHRlcm4gdm9pZCBidGlmX2hoX2dldHJlcG9ydChidGlmX2hoX2RldmljZV90KiBwX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGhfcmVwb3J0X3R5cGVfdCByX3R5cGUsIHVpbnQ4X3QgcmVwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBidWZmZXJTaXplKTsKLWV4dGVybiB2b2lkIGJ0aWZfaGhfc2VydmljZV9yZWdpc3RyYXRpb24oYm9vbCBlbmFibGUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX2tleXN0b3JlLmggYi9idGlmL2luY2x1ZGUvYnRpZl9rZXlzdG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjBmM2I4Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX2tleXN0b3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfa2V5c3RvcmUuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoX2tleXN0b3JlIHsKLQotQmx1ZXRvb3RoS2V5c3RvcmVJbnRlcmZhY2UqIGdldEJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGhfa2V5c3RvcmUKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9tZXRyaWNzX2xvZ2dpbmcuaCBiL2J0aWYvaW5jbHVkZS9idGlmX21ldHJpY3NfbG9nZ2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjRjOTA3Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX21ldHJpY3NfbG9nZ2luZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoL2VudW1zLnBiLmg+Ci0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9oY2kvZW51bXMucGIuaD4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9tZXRyaWNfaWRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBsb2dfYTJkcF9hdWRpb191bmRlcnJ1bl9ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fbWlzc2luZ19wY21fYnl0ZXMpOwotCi12b2lkIGxvZ19hMmRwX2F1ZGlvX292ZXJydW5fZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKTsKLQotdm9pZCBsb2dfYTJkcF9wbGF5YmFja19ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jb2RpbmdfbW9kZSk7Ci0KLXZvaWQgbG9nX3JlYWRfcnNzaV9yZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSk7Ci0KLXZvaWQgbG9nX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9yZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotCi12b2lkIGxvZ19yZWFkX3R4X3Bvd2VyX2xldmVsX3Jlc3VsdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci0KLXZvaWQgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBwb3J0LCBpbnQgdHlwZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW0gY29ubmVjdGlvbl9zdGF0ZSwKLSAgICBpbnQ2NF90IHR4X2J5dGVzLCBpbnQ2NF90IHJ4X2J5dGVzLCBpbnQgdWlkLCBpbnQgc2VydmVyX3BvcnQsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRSb2xlRW51bSBzb2NrZXRfcm9sZSk7Ci0KLWJvb2wgaW5pdF9tZXRyaWNfaWRfYWxsb2NhdG9yKAotICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+JiBwYWlyZWRfZGV2aWNlX21hcCwKLSAgICBibHVldG9vdGg6OnNoaW06OkNhbGxiYWNrTGVnYWN5IHNhdmVfaWRfY2FsbGJhY2ssCi0gICAgYmx1ZXRvb3RoOjpzaGltOjpDYWxsYmFja0xlZ2FjeSBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrKTsKLQotYm9vbCBjbG9zZV9tZXRyaWNfaWRfYWxsb2NhdG9yKCk7Ci0KLWludCBhbGxvY2F0ZV9tZXRyaWNfaWRfZnJvbV9tZXRyaWNfaWRfYWxsb2NhdG9yKGNvbnN0IFJhd0FkZHJlc3MmKTsKLQotaW50IHNhdmVfbWV0cmljX2lkX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihjb25zdCBSYXdBZGRyZXNzJik7Ci0KLXZvaWQgZm9yZ2V0X2RldmljZV9mcm9tX21ldHJpY19pZF9hbGxvY2F0b3IoY29uc3QgUmF3QWRkcmVzcyYpOwotCi1ib29sIGlzX3ZhbGlkX2lkX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihjb25zdCBpbnQgaWQpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX3Bhbi5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfcGFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZGE1YjMuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfcGFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX3Bhbi5oCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEJsdWV0b290aCBwYW4gSW50ZXJmYWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX1BBTl9ICi0jZGVmaW5lIEJUSUZfUEFOX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3Bhbi5oPgotCi1idHBhbl9pbnRlcmZhY2VfdCogYnRpZl9wYW5faW50ZXJmYWNlKCk7Ci12b2lkIGJ0aWZfcGFuX2luaXQoKTsKLXZvaWQgYnRpZl9wYW5fY2xlYW51cCgpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX3Bhbl9pbnRlcm5hbC5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfcGFuX2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MDFhNmMuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfcGFuX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9wYW5faW50ZXJuYWwuaAotICoKLSAqICBEZXNjcmlwdGlvbjogICBCbHVldG9vdGggcGFuIGludGVybmFsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX1BBTl9JTlRFUk5BTF9ICi0jZGVmaW5lIEJUSUZfUEFOX0lOVEVSTkFMX0gKLQotI2luY2x1ZGUgImJ0aWZfcGFuLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUEFOX05BUF9TRVJWSUNFX05BTUUgIkFuZHJvaWQgTmV0d29yayBBY2Nlc3MgUG9pbnQiCi0jZGVmaW5lIFBBTlVfU0VSVklDRV9OQU1FICJBbmRyb2lkIE5ldHdvcmsgVXNlciIKLSNkZWZpbmUgVEFQX0lGX05BTUUgImJ0LXBhbiIKLSNkZWZpbmUgVEFQX01BWF9QS1RfV1JJVEVfTEVOIDIwMDAKLQotI2RlZmluZSBQQU5fU1RBVEVfT1BFTiAxCi0jZGVmaW5lIFBBTl9TVEFURV9DTE9TRSAyCi0jaWZuZGVmIFBBTl9ST0xFX0lOQUNUSVZFCi0jZGVmaW5lIFBBTl9ST0xFX0lOQUNUSVZFIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgZGVmaW5pdGlvbnMgYW5kIHJldHVybiB2YWx1ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IGV0aF9oZHIgewotICBSYXdBZGRyZXNzIGhfZGVzdDsKLSAgUmF3QWRkcmVzcyBoX3NyYzsKLSAgc2hvcnQgaF9wcm90bzsKLX0gdEVUSF9IRFI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGhhbmRsZTsKLSAgaW50IHN0YXRlOwotICB1aW50MTZfdCBwcm90b2NvbDsKLSAgUmF3QWRkcmVzcyBwZWVyOwotICB0QlRBX1BBTl9ST0xFIGxvY2FsX3JvbGU7Ci0gIHRCVEFfUEFOX1JPTEUgcmVtb3RlX3JvbGU7Ci0gIFJhd0FkZHJlc3MgZXRoX2FkZHI7Ci19IGJ0cGFuX2Nvbm5fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgYnRsX2lmX2hhbmRsZTsKLSAgaW50IGJ0bF9pZl9oYW5kbGVfcGFudTsKLSAgaW50IHRhcF9mZDsKLSAgaW50IGVuYWJsZWQ7Ci0gIGludCBvcGVuX2NvdW50OwotICBpbnQgZmxvdzsgIC8vIDE6IG91dGJvdW5kIGRhdGEgZmxvdyBvbjsgMDogb3V0Ym91bmQgZGF0YSBmbG93IG9mZgotICBidHBhbl9jb25uX3QgY29ubnNbTUFYX1BBTl9DT05OU107Ci0gIGludCBjb25nZXN0X3BhY2tldF9zaXplOwotICB1bnNpZ25lZCBjaGFyIGNvbmdlc3RfcGFja2V0WzE2MDBdOyAgLy8gbWF4IGV0aGVybmV0IHBhY2tldCBzaXplCi19IGJ0cGFuX2NiX3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gYnRwYW5fY2JfdCBidHBhbl9jYjsKLWJ0cGFuX2Nvbm5fdCogYnRwYW5fbmV3X2Nvbm4oaW50IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9QQU5fUk9MRSBsb2NhbF9yb2xlLCB0QlRBX1BBTl9ST0xFIHBlZXJfcm9sZSk7Ci1idHBhbl9jb25uX3QqIGJ0cGFuX2ZpbmRfY29ubl9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpOwotYnRwYW5fY29ubl90KiBidHBhbl9maW5kX2Nvbm5faGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci12b2lkIGJ0cGFuX3NldF9mbG93X2NvbnRyb2woYm9vbCBlbmFibGUpOwotaW50IGJ0cGFuX2dldF9jb25uZWN0ZWRfY291bnQodm9pZCk7Ci1pbnQgYnRwYW5fdGFwX29wZW4odm9pZCk7Ci12b2lkIGNyZWF0ZV90YXBfcmVhZF90aHJlYWQoaW50IHRhcF9mZCk7Ci12b2lkIGRlc3Ryb3lfdGFwX3JlYWRfdGhyZWFkKHZvaWQpOwotaW50IGJ0cGFuX3RhcF9jbG9zZShpbnQgdGFwX2ZkKTsKLWludCBidHBhbl90YXBfc2VuZChpbnQgdGFwX2ZkLCBjb25zdCBSYXdBZGRyZXNzJiBzcmMsIGNvbnN0IFJhd0FkZHJlc3MmIGRzdCwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm90b2NvbCwgY29uc3QgY2hhciogYnVmZiwgdWludDE2X3Qgc2l6ZSwgYm9vbCBleHQsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBmb3J3YXJkKTsKLQotc3RhdGljIGlubGluZSBpbnQgaXNfZW1wdHlfZXRoX2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICByZXR1cm4gYWRkciA9PSBSYXdBZGRyZXNzOjprRW1wdHk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX3ZhbGlkX2J0X2V0aF9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgaWYgKGlzX2VtcHR5X2V0aF9hZGRyKGFkZHIpKSByZXR1cm4gMDsKLSAgcmV0dXJuIGFkZHIuYWRkcmVzc1swXSAmIDEgPyAwIDogMTsgLyogQ2Fubm90IGJlIG11bHRpY2FzdGluZyBhZGRyZXNzICovCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfcHJvZmlsZV9xdWV1ZS5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfcHJvZmlsZV9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2MxOTc4Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX3Byb2ZpbGVfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfcHJvZmlsZV9xdWV1ZS5oCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEJsdWV0b290aCByZW1vdGUgZGV2aWNlIGNvbm5lY3Rpb24gcXVldWluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9QUk9GSUxFX1FVRVVFX0gKLSNkZWZpbmUgQlRJRl9QUk9GSUxFX1FVRVVFX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdHlwZWRlZiBidF9zdGF0dXNfdCAoKmJ0aWZfY29ubmVjdF9jYl90KShSYXdBZGRyZXNzKiBiZGEsIHVpbnQxNl90IHV1aWQpOwotCi1idF9zdGF0dXNfdCBidGlmX3F1ZXVlX2Nvbm5lY3QodWludDE2X3QgdXVpZCwgY29uc3QgUmF3QWRkcmVzcyogYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29ubmVjdF9jYl90IGNvbm5lY3RfY2IpOwotdm9pZCBidGlmX3F1ZXVlX2NsZWFudXAodWludDE2X3QgdXVpZCk7Ci12b2lkIGJ0aWZfcXVldWVfYWR2YW5jZSgpOwotCi0vKioKLSAqIERpc3BhdGNoIHRoZSBuZXh0IHBlbmRpbmcgY29ubmVjdCByZXF1ZXN0LgotICogTk9URTogTXVzdCBiZSBjYWxsZWQgb24gdGhlIEpOSSB0aHJlYWQuCi0gKgotICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IKLSAqIGNvZGUKLSAqLwotYnRfc3RhdHVzX3QgYnRpZl9xdWV1ZV9jb25uZWN0X25leHQodm9pZCk7Ci0KLXZvaWQgYnRpZl9xdWV1ZV9yZWxlYXNlKCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfcmMuaCBiL2J0aWYvaW5jbHVkZS9idGlmX3JjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDBmYTQuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQlRJRl9SQ19ICi0jZGVmaW5lIEJUSUZfUkNfSAotCi0jaW5jbHVkZSAiYnRhX2F2X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLWNsYXNzIFJhd0FkZHJlc3M7Ci0KLXZvaWQgYnRpZl9yY19oYW5kbGVyKHRCVEFfQVZfRVZUIGV2ZW50LCB0QlRBX0FWKiBwX2RhdGEpOwotdWludDhfdCBidGlmX3JjX2dldF9jb25uZWN0ZWRfcGVlcl9oYW5kbGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXZvaWQgYnRpZl9yY19jaGVja19oYW5kbGVfcGVuZGluZ19wbGF5KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNlbmRUb0FwcCk7Ci1ib29sIGJ0aWZfcmNfaXNfY29ubmVjdGVkX3BlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotI2VuZGlmICAvLyBCVElGX1JDX0gKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX3NkcC5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfc2RwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMGRhZWQuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfc2RwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX3NkcC5oCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEJsdWV0b290aCBTRFAgc2VhcmNoIEludGVyZmFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9TRFBfSAotI2RlZmluZSBCVElGX1NEUF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9zZHAuaD4KLQotYnRzZHBfaW50ZXJmYWNlX3QqIGJ0aWZfc2RwX2dldF9pbnRlcmZhY2UoKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrLmggYi9idGlmL2luY2x1ZGUvYnRpZl9zb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDM3OGUuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfc29jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJ0aWZfdWlkLmgiCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9zb2NrLmg+Ci0KLWNvbnN0IGJ0c29ja19pbnRlcmZhY2VfdCogYnRpZl9zb2NrX2dldF9pbnRlcmZhY2Uodm9pZCk7Ci0KLWJ0X3N0YXR1c190IGJ0aWZfc29ja19pbml0KHVpZF9zZXRfdCogdWlkX3NldCk7Ci12b2lkIGJ0aWZfc29ja19jbGVhbnVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfc29ja19sMmNhcC5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfc29ja19sMmNhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWFkZWI4Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX3NvY2tfbDJjYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTDJDQVAgU29ja2V0IEludGVyZmFjZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX1NPQ0tfTDJDQVBfSAotI2RlZmluZSBCVElGX1NPQ0tfTDJDQVBfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLSNpbmNsdWRlICJidGlmX3VpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLWJ0X3N0YXR1c190IGJ0c29ja19sMmNhcF9pbml0KGludCBoYW5kbGUsIHVpZF9zZXRfdCogc2V0KTsKLWJ0X3N0YXR1c190IGJ0c29ja19sMmNhcF9jbGVhbnVwKCk7Ci1idF9zdGF0dXNfdCBidHNvY2tfbDJjYXBfbGlzdGVuKGNvbnN0IGNoYXIqIG5hbWUsIGludCBjaGFubmVsLCBpbnQqIHNvY2tfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgaW50IGFwcF91aWQpOwotYnRfc3RhdHVzX3QgYnRzb2NrX2wyY2FwX2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNvY2tfZmQsIGludCBmbGFncywgaW50IGFwcF91aWQpOwotdm9pZCBidHNvY2tfbDJjYXBfc2lnbmFsZWQoaW50IGZkLCBpbnQgZmxhZ3MsIHVpbnQzMl90IHVzZXJfaWQpOwotdm9pZCBvbl9sMmNhcF9wc21fYXNzaWduZWQoaW50IGlkLCBpbnQgcHNtKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3JmYy5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfc29ja19yZmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ODk2YS4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3JmYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9zb2NrLmgKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgQmx1ZXRvb3RoIHNvY2tldCBJbnRlcmZhY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfU09DS19SRkNfSAotI2RlZmluZSBCVElGX1NPQ0tfUkZDX0gKLQotI2luY2x1ZGUgImJ0aWZfdWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotYnRfc3RhdHVzX3QgYnRzb2NrX3JmY19pbml0KGludCBoYW5kbGUsIHVpZF9zZXRfdCogc2V0KTsKLWJ0X3N0YXR1c190IGJ0c29ja19yZmNfY2xlYW51cCgpOwotYnRfc3RhdHVzX3QgYnRzb2NrX3JmY19saXN0ZW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsIGludCogc29ja19mZCwgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcF91aWQpOwotYnRfc3RhdHVzX3QgYnRzb2NrX3JmY19jb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiB1dWlkLCBpbnQgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNvY2tfZmQsIGludCBmbGFncywgaW50IGFwcF91aWQpOwotdm9pZCBidHNvY2tfcmZjX3NpZ25hbGVkKGludCBmZCwgaW50IGZsYWdzLCB1aW50MzJfdCB1c2VyX2lkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3Njby5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfc29ja19zY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3MmE2YS4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3Njby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxMyBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgdGhyZWFkX3QgdGhyZWFkX3Q7Ci0KLWJ0X3N0YXR1c190IGJ0c29ja19zY29faW5pdCh0aHJlYWRfdCogdGhyZWFkKTsKLWJ0X3N0YXR1c190IGJ0c29ja19zY29fY2xlYW51cCh2b2lkKTsKLWJ0X3N0YXR1c190IGJ0c29ja19zY29fbGlzdGVuKGludCogc29ja19mZCwgaW50IGZsYWdzKTsKLWJ0X3N0YXR1c190IGJ0c29ja19zY29fY29ubmVjdChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBpbnQqIHNvY2tfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX3NvY2tfc2RwLmggYi9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3NkcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTlkYTg0Li4wMDAwMDAwCi0tLSBhL2J0aWYvaW5jbHVkZS9idGlmX3NvY2tfc2RwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfU09DS19TRFBfSAotI2RlZmluZSBCVElGX1NPQ0tfU0RQX0gKLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIFVVSURfT0JFWF9PQkpFQ1RfUFVTSCA9Ci0gICAgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgxMTA1KTsKLXN0YXRpYyBjb25zdCBibHVldG9vdGg6OlV1aWQgVVVJRF9QQkFQX1BTRSA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MTEyRik7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIFVVSURfTUFQX01BUyA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MTEzMik7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIFVVSURfU0FQID0gYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoMHgxMTJEKTsKLXN0YXRpYyBjb25zdCBibHVldG9vdGg6OlV1aWQgVVVJRF9TUFAgPSBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCgweDExMDEpOwotc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBVVUlEX0RJUCA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MTIwMCk7Ci1zdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpVdWlkIFVVSURfTUFQX01OUyA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KDB4MTEzMyk7Ci0KLWludCBhZGRfcmZjX3NkcF9yZWMoY29uc3QgY2hhciogbmFtZSwgYmx1ZXRvb3RoOjpVdWlkIHV1aWQsIGludCBzY24pOwotdm9pZCBkZWxfcmZjX3NkcF9yZWMoaW50IGhhbmRsZSk7Ci1ib29sIGlzX3Jlc2VydmVkX3JmY19jaGFubmVsKGludCBjaGFubmVsKTsKLWludCBnZXRfcmVzZXJ2ZWRfcmZjX2NoYW5uZWwoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3RocmVhZC5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfc29ja190aHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MzE3Yi4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX1NPQ0tfVEhSRUFEX0gKLSNkZWZpbmUgQlRJRl9TT0NLX1RIUkVBRF9ICi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9zb2NrLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNPQ0tfVEhSRUFEX0ZEX1JEIDEgICAgICAgICAgICAgICAvKiBCVCBzb2NrZXQgcmVhZCBzaWduYWwgKi8KLSNkZWZpbmUgU09DS19USFJFQURfRkRfV1IgKDEgPDwgMSkgICAgICAgIC8qIEJUIHNvY2tldCB3cml0ZSBzaWduYWwgKi8KLSNkZWZpbmUgU09DS19USFJFQURfRkRfRVhDRVBUSU9OICgxIDw8IDIpIC8qIEJUIHNvY2tldCBleGNlcHRpb24gc2luZ2FsICovCi0KLS8qIEFkZCBCVCBzb2NrZXQgZmQgaW4gY3VycmVudCBzb2NrZXQgcG9sbCB0aHJlYWQgY29udGV4dCBpbW1lZGlhdGVseSAqLwotI2RlZmluZSBTT0NLX1RIUkVBRF9BRERfRkRfU1lOQyAoMSA8PCAzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB2b2lkICgqYnRzb2NrX3NpZ25hbGVkX2NiKShpbnQgZmQsIGludCB0eXBlLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQpOwotdHlwZWRlZiB2b2lkICgqYnRzb2NrX2NtZF9jYikoaW50IGNtZF9mZCwgaW50IHR5cGUsIGludCBzaXplLCB1aW50MzJfdCB1c2VyX2lkKTsKLQotdm9pZCBidHNvY2tfdGhyZWFkX2luaXQoKTsKLWludCBidHNvY2tfdGhyZWFkX2FkZF9mZChpbnQgaGFuZGxlLCBpbnQgZmQsIGludCB0eXBlLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZCk7Ci1ib29sIGJ0c29ja190aHJlYWRfcmVtb3ZlX2ZkX2FuZF9jbG9zZShpbnQgdGhyZWFkX2hhbmRsZSwgaW50IGZkKTsKLWludCBidHNvY2tfdGhyZWFkX3dha2V1cChpbnQgaGFuZGxlKTsKLWludCBidHNvY2tfdGhyZWFkX3Bvc3RfY21kKGludCBoYW5kbGUsIGludCBjbWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNtZF9kYXRhLCBpbnQgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZCk7Ci1pbnQgYnRzb2NrX3RocmVhZF9jcmVhdGUoYnRzb2NrX3NpZ25hbGVkX2NiIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0c29ja19jbWRfY2IgY21kX2NhbGxiYWNrKTsKLWludCBidHNvY2tfdGhyZWFkX2V4aXQoaW50IGhhbmRsZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRpZi9pbmNsdWRlL2J0aWZfc29ja191dGlsLmggYi9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYmJmYi4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9zb2NrX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfc29ja191dGlsLmgKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgQmx1ZXRvb3RoIHNvY2tldCBJbnRlcmZhY2UgSGVscGVyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9TT0NLX1VUSUxfSAotI2RlZmluZSBCVElGX1NPQ0tfVVRJTF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotaW50IHNvY2tfc2VuZF9mZChpbnQgc29ja19mZCwgY29uc3QgdWludDhfdCogYnVmZmVyLCBpbnQgbGVuLCBpbnQgc2VuZF9mZCk7Ci1pbnQgc29ja19zZW5kX2FsbChpbnQgc29ja19mZCwgY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuKTsKLWludCBzb2NrX3JlY3ZfYWxsKGludCBzb2NrX2ZkLCB1aW50OF90KiBidWYsIGludCBsZW4pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCBiL2J0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2YWQ2MC4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVElGX1NUT1JBR0VfSAotI2RlZmluZSBCVElGX1NUT1JBR0VfSAotCi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3V1aWQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfZGV2aWNlX3R5cGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWShwX3Byb3AsIHQsIGwsIHBfdikgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwX3Byb3ApLT50eXBlID0gKHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwX3Byb3ApLT5sZW4gPSAobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwX3Byb3ApLT52YWwgPSAocF92KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9nZXRfYWRhcHRlcl9wcm9wZXJ0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIEZldGNoZXMgdGhlIGFkYXB0ZXIgcHJvcGVydHktPnR5cGUKLSAqICAgICAgICAgICAgICAgICAgZnJvbSBOVlJBTSBhbmQgZmlsbHMgcHJvcGVydHktPnZhbC4KLSAqICAgICAgICAgICAgICAgICAgQ2FsbGVyIHNob3VsZCBwcm92aWRlIG1lbW9yeSBmb3IgcHJvcGVydHktPnZhbCBhbmQKLSAqICAgICAgICAgICAgICAgICAgc2V0IHRoZSBwcm9wZXJ0eS0+dmFsCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgZmV0Y2ggd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfZ2V0X2FkYXB0ZXJfcHJvcGVydHkoYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3NldF9hZGFwdGVyX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gU3RvcmVzIHRoZSBhZGFwdGVyIHByb3BlcnR5Ci0gKiAgICAgICAgICAgICAgICAgIHRvIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X2FkYXB0ZXJfcHJvcGVydHkoYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gRmV0Y2hlcyB0aGUgcmVtb3RlIGRldmljZSBwcm9wZXJ0eS0+dHlwZQotICogICAgICAgICAgICAgICAgICBmcm9tIE5WUkFNIGFuZCBmaWxscyBwcm9wZXJ0eS0+dmFsLgotICogICAgICAgICAgICAgICAgICBDYWxsZXIgc2hvdWxkIHByb3ZpZGUgbWVtb3J5IGZvciBwcm9wZXJ0eS0+dmFsIGFuZAotICogICAgICAgICAgICAgICAgICBzZXQgdGhlIHByb3BlcnR5LT52YWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBmZXRjaCB3YXMgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gU3RvcmVzIHRoZSByZW1vdGUgZGV2aWNlIHByb3BlcnR5Ci0gKiAgICAgICAgICAgICAgICAgIHRvIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9nZXRfaW9fY2FwcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIEZldGNoZXMgdGhlIGxvY2FsIElucHV0L091dHB1dAotICogICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgbG9jYWwgSU8gQ2FwYWJpbGl0eSBvZiBkZXZpY2UuIElmIG5vdCBzdG9yZWQsCi0gKiAgICAgICAgICAgICAgICAgIHJldHVybnMgQlRNX0xPQ0FMX0lPX0NBUFMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRpZl9zdG9yYWdlX2dldF9sb2NhbF9pb19jYXBzKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfZ2V0X2lvX2NhcHNfYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gRmV0Y2hlcyB0aGUgbG9jYWwgSW5wdXQvT3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBvZiB0aGUgQkxFIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgbG9jYWwgSU8gQ2FwYWJpbGl0eSBvZiBCTEUgZGV2aWNlLiBJZiBub3Qgc3RvcmVkLAotICogICAgICAgICAgICAgICAgICByZXR1cm5zIEJUTV9MT0NBTF9JT19DQVBTX0JMRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBidGlmX3N0b3JhZ2VfZ2V0X2xvY2FsX2lvX2NhcHNfYmxlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfYWRkX3JlbW90ZV9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBBZGRzIGEgbmV3bHkgZGlzY292ZXJlZCBkZXZpY2UgdG8KLSAqICAgICAgICAgICAgICAgICAgdHJhY2sgYWxvbmcgd2l0aCB0aGUgdGltZXN0YW1wLiBBbHNvLCBzdG9yZXMgdGhlIHZhcmlvdXMKLSAqICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyAtIFJTU0ksIEJEQUREUiwgTkFNRSAoaWYgZm91bmQgaW4gRUlSKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9hZGRfcmVtb3RlX2RldmljZShjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfYm9uZGVkX2RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIEFkZHMgdGhlIG5ld2x5IGJvbmRlZCBkZXZpY2UgdG8gTlZSQU0KLSAqICAgICAgICAgICAgICAgICAgYWxvbmcgd2l0aCB0aGUgbGluay1rZXksIEtleSB0eXBlIGFuZCBQaW4ga2V5IGxlbmd0aAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIHN0b3JlIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2FkZF9ib25kZWRfZGV2aWNlKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtLZXkgbGlua19rZXksIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fbGVuZ3RoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfYm9uZGVkX2RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIERlbGV0ZXMgdGhlIGJvbmRlZCBkZXZpY2UgZnJvbSBOVlJBTQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9ib25kZWRfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfYm9uZGVkX2RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIERlbGV0ZXMgdGhlIGJvbmRlZCBkZXZpY2UgZnJvbSBOVlJBTQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2RldmljZXModm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfYWRkX2hpZF9kZXZpY2VfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIEFkZHMgdGhlIGhpZCBpbmZvcm1hdGlvbiBvZiBib25kZWQgaGlkCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZXMtdG8gTlZSQU0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBzdG9yZSB3YXMgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2FkZF9oaWRfZGV2aWNlX2luZm8oCi0gICAgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIHVpbnQxNl90IGF0dHJfbWFzaywgdWludDhfdCBzdWJfY2xhc3MsCi0gICAgdWludDhfdCBhcHBfaWQsIHVpbnQxNl90IHZlbmRvcl9pZCwgdWludDE2X3QgcHJvZHVjdF9pZCwgdWludDE2X3QgdmVyc2lvbiwKLSAgICB1aW50OF90IGN0cnlfY29kZSwgdWludDE2X3Qgc3NyX21heF9sYXRlbmN5LCB1aW50MTZfdCBzc3JfbWluX3RvdXQsCi0gICAgdWludDE2X3QgZGxfbGVuLCB1aW50OF90KiBkc2NfbGlzdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfaGlkX2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBMb2FkcyBoaWQgaW5mbyBmb3IgYWxsIHRoZSBib25kZWQgZGV2aWNlcwotICogICAgICAgICAgICAgICAgICBmcm9tIE5WUkFNIGFuZCBhZGRzIHRob3NlIGRldmljZXMgIHRvIHRoZSBCVEFfSEguCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2hpZF9pbmZvKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIERlbGV0ZXMgdGhlIGJvbmRlZCBoaWQgZGV2aWNlIGluZm8gZnJvbQotICogICAgICAgICAgICAgICAgICBOVlJBTQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkcik7Ci0KLS8qKiBMb2FkcyBpbmZvcm1hdGlvbiBhYm91dCBib25kZWQgaGVhcmluZyBhaWQgZGV2aWNlcyAqLwotdm9pZCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfaGVhcmluZ19haWRzKCk7Ci0KLS8qKiBEZWxldGVzIHRoZSBib25kZWQgaGVhcmluZyBhaWQgZGV2aWNlIGluZm8gZnJvbSBOVlJBTSAqLwotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2hlYXJpbmdfYWlkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi0vKiogU2V0L1Vuc2V0IHRoZSBoZWFyaW5nIGFpZCBkZXZpY2UgSEVBUklOR19BSURfSVNfQUNDRVBUTElTVEVEIGZsYWcuICovCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfaGVhcmluZ19haWRfYWNjZXB0bGlzdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRfdG9fYWNjZXB0bGlzdCk7Ci0KLS8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgR0FUVCBDbGllbnQgc3VwcG9ydGVkIGZlYXR1cmVzIHN1cHBvcnQgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3NldF9nYXR0X2NsX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmVhdCk7Ci0KLS8qKiBHZXQgY2xpZW50IHN1cHBvcnRlZCBmZWF0dXJlcyAqLwotdWludDhfdCBidGlmX3N0b3JhZ2VfZ2V0X2dhdHRfY2xfc3VwcF9mZWF0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogUmVtb3ZlIGNsaWVudCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3JlbW92ZV9nYXR0X2NsX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBHQVRUIHNlcnZlciBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3NldF9nYXR0X3NyX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90IGZlYXQpOwotCi0vKiogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBHQVRUIHNlcnZlciBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLXVpbnQ4X3QgYnRpZl9zdG9yYWdlX2dldF9zcl9zdXBwX2ZlYXQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBTdG9yZSBsYXN0IHNlcnZlciBkYXRhYmFzZSBoYXNoIGZvciByZW1vdGUgY2xpZW50ICovCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfZ2F0dF9jbF9kYl9oYXNoKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIE9jdGV0MTYgaGFzaCk7Ci0KLS8qKiBHZXQgbGFzdCBzZXJ2ZXIgZGF0YWJhc2UgaGFzaCBmb3IgcmVtb3RlIGNsaWVudCAqLwotT2N0ZXQxNiBidGlmX3N0b3JhZ2VfZ2V0X2dhdHRfY2xfZGJfaGFzaChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIFJlbW92ZSBsYXN0IHNlcnZlciBkYXRhYmFzZSBoYXNoIGZvciByZW1vdGUgY2xpZW50ICovCi12b2lkIGJ0aWZfc3RvcmFnZV9yZW1vdmVfZ2F0dF9jbF9kYl9oYXNoKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogR2V0IHRoZSBoZWFyaW5nIGFpZCBkZXZpY2UgcHJvcGVydGllcy4gKi8KLWJvb2wgYnRpZl9zdG9yYWdlX2dldF9oZWFyaW5nX2FpZF9wcm9wKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3QqIGNhcGFiaWxpdGllcywgdWludDY0X3QqIGhpX3N5bmNfaWQsCi0gICAgdWludDE2X3QqIHJlbmRlcl9kZWxheSwgdWludDE2X3QqIHByZXBhcmF0aW9uX2RlbGF5LCB1aW50MTZfdCogY29kZWNzKTsKLQotLyoqIFN0b3JlIExlIEF1ZGlvIGRldmljZSBhdXRvY29ubmVjdCBmbGFnICovCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfbGVhdWRpb19hdXRvY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCk7Ci0KLS8qKiBSZW1vdmUgTGUgQXVkaW8gZGV2aWNlIGZyb20gdGhlIHN0b3JhZ2UgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3JlbW92ZV9sZWF1ZGlvKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi0vKiogTG9hZCBib25kZWQgTGUgQXVkaW8gZGV2aWNlcyAqLwotdm9pZCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfbGVhdWRpbyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9pc19yZXRyaWN0ZWRfZGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gY2hlY2tzIGlmIHRoaXMgZGV2aWNlIGlzIGEgcmVzdHJpY3RlZAotICogICAgICAgICAgICAgICAgICBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgIGlmIHRoZSBkZXZpY2UgaXMgbGFibGVkIGFzIHJlc3RyaWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRpZl9zdG9yYWdlX2lzX3Jlc3RyaWN0ZWRfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKTsKLQotaW50IGJ0aWZfc3RvcmFnZV9nZXRfbnVtX2JvbmRlZF9kZXZpY2VzKHZvaWQpOwotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2JsZV9ib25kaW5nX2tleShSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGgpOwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9ibGVfYm9uZGluZ19rZXkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW5ndGgpOwotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2JsZV9sb2NhbF9rZXkoY29uc3QgT2N0ZXQxNiYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUpOwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9ibGVfYm9uZGluZ19rZXlzKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKTsKLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9yZW1vdmVfYmxlX2xvY2FsX2tleXModm9pZCk7Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfZ2V0X2JsZV9sb2NhbF9rZXkodWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPY3RldDE2KiBrZXlfdmFsdWUpOwotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9hZGRyX3R5cGUoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIGFkZHJfdHlwZSk7Ci0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2FkZHJfdHlwZShjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUpOwotCi1ib29sIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2FkZHJfdHlwZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFJiBhZGRyX3R5cGUpOwotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9hZGRyX3R5cGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QkxFX0FERFJfVFlQRSYgYWRkcl90eXBlKTsKLWJvb2wgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3R5cGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9ERVZJQ0VfVFlQRSYgZGV2aWNlX3R5cGUpOwotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfdHlwZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUX0RFVklDRV9UWVBFJiBkZXZpY2VfdHlwZSk7Ci0KLXZvaWQgYnRpZl9zdG9yYWdlX2FkZF9ncm91cHMoY29uc3QgUmF3QWRkcmVzcyYgYWRkcik7Ci12b2lkIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9ncm91cHModm9pZCk7Ci12b2lkIGJ0aWZfc3RvcmFnZV9yZW1vdmVfZ3JvdXBzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfY3Npc19hdXRvY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCk7Ci12b2lkIGJ0aWZfc3RvcmFnZV91cGRhdGVfY3Npc19pbmZvKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpOwotdm9pZCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfY3Npc19kZXZpY2VzKCk7Ci12b2lkIGJ0aWZfc3RvcmFnZV9yZW1vdmVfY3Npc19kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9sb2FkX2hpZGQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvYWRzIGhpZGQgYm9uZGVkIGRldmljZSBhbmQgInBsdWdzIiBpdCBpbnRvIGhpZGQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfbG9hZF9oaWRkKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3NldF9oaWRkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdG9yZXMgaGlkZCBib25kZWQgZGV2aWNlIGluZm8gaW4gbnZyYW0uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9zZXRfaGlkZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfcmVtb3ZlX2hpZGQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZXMgaGlkZCBib25kZWQgZGV2aWNlIGluZm8gZnJvbSBudnJhbQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2hpZGQoUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIpOwotCi0vLyBHZXRzIHRoZSBkZXZpY2UgbmFtZSBmb3IgYSBnaXZlbiBCbHVldG9vdGggYWRkcmVzcyB8YmRfYWRkcnwuCi0vLyBUaGUgZGV2aWNlIG5hbWUgKGlmIGZvdW5kKSBpcyBzdG9yZWQgaW4gfG5hbWV8LgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgbmFtZSBpcyBmb3VuZCwgb3RoZXJ2aXNlIGZhbHNlLgotLy8gTm90ZTogfG5hbWV8IHNob3VsZCBwb2ludCB0byBhIGJ1ZmZlciB0aGF0IGNhbiBzdG9yZSBzdHJpbmcgb2YgbGVuZ3RoCi0vLyB8QlRNX01BWF9SRU1fQkRfTkFNRV9MRU58LgotYm9vbCBidGlmX3N0b3JhZ2VfZ2V0X3N0b3JlZF9yZW1vdGVfbmFtZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjaGFyKiBuYW1lKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXhwb3J0ZWQgZm9yIHVuaXQgdGVzdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBidGlmX3NwbGl0X3V1aWRzX3N0cmluZyhjb25zdCBjaGFyKiBzdHIsIGJsdWV0b290aDo6VXVpZCogcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfdXVpZHMpOwotCi0jZW5kaWYgLyogQlRJRl9TVE9SQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2J0aWYvaW5jbHVkZS9idGlmX3VpZC5oIGIvYnRpZi9pbmNsdWRlL2J0aWZfdWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTBmMDEuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfdWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi1zdHJ1Y3QgdWlkX3NldF90OwotdHlwZWRlZiBzdHJ1Y3QgdWlkX3NldF90IHVpZF9zZXRfdDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgVUlEIHNldCB0byBrZWVwIHRyYWNrIG9mIHRyYWZmaWMgcGVyIFVJRC4KLSAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZyB0aGlzIG9iamVjdCB2aWEgdWlkX3NldF9kZXN0cm95KCkuCi0gKi8KLXVpZF9zZXRfdCogdWlkX3NldF9jcmVhdGUoKTsKLQotdm9pZCB1aWRfc2V0X2Rlc3Ryb3kodWlkX3NldF90KiBzZXQpOwotCi12b2lkIHVpZF9zZXRfYWRkX3R4KHVpZF9zZXRfdCogc2V0LCBpbnQzMl90IGFwcF91aWQsIHVpbnQ2NF90IGJ5dGVzKTsKLXZvaWQgdWlkX3NldF9hZGRfcngodWlkX3NldF90KiBzZXQsIGludDMyX3QgYXBwX3VpZCwgdWludDY0X3QgYnl0ZXMpOwotCi0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYnRfdWlkX3RyYWZmaWNfdCBzdHJ1Y3RzLCB3aGVyZSB0aGUgZW5kIG9mIHRoZSBhcnJheQotICogaXMgc2lnbmFsZWQgYnkgYW4gZWxlbWVudCB3aXRoIGFwcF91aWQgPT0gLTEuCi0gKgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBvc2lfZnJlZSgpIG9uIHRoZSByZXR1cm5lZCBhcnJheS4KLSAqLwotYnRfdWlkX3RyYWZmaWNfdCogdWlkX3NldF9yZWFkX2FuZF9jbGVhcih1aWRfc2V0X3QqIHNldCk7CmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvYnRpZl91dGlsLmggYi9idGlmL2luY2x1ZGUvYnRpZl91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzkyMmYuLjAwMDAwMDAKLS0tIGEvYnRpZi9pbmNsdWRlL2J0aWZfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfVVRJTF9ICi0jZGVmaW5lIEJUSUZfVVRJTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfZGV2X2NsYXNzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDQVNFX1JFVFVSTl9TVFIoY29uc3QpIFwKLSAgY2FzZSBjb25zdDogICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb25zdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIGRlZmluaXRpb25zIGZvciBjYWxsYmFjayBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBjaGFyKiBkdW1wX2J0X3N0YXR1cyhidF9zdGF0dXNfdCBzdGF0dXMpOwotY29uc3QgY2hhciogZHVtcF9kbV9zZWFyY2hfZXZlbnQodWludDE2X3QgZXZlbnQpOwotY29uc3QgY2hhciogZHVtcF9kbV9ldmVudCh1aW50MTZfdCBldmVudCk7Ci1jb25zdCBjaGFyKiBkdW1wX2hmX2V2ZW50KHVpbnQxNl90IGV2ZW50KTsKLWNvbnN0IGNoYXIqIGR1bXBfaGZfY2xpZW50X2V2ZW50KHVpbnQxNl90IGV2ZW50KTsKLWNvbnN0IGNoYXIqIGR1bXBfaGhfZXZlbnQodWludDE2X3QgZXZlbnQpOwotY29uc3QgY2hhciogZHVtcF9oZF9ldmVudCh1aW50MTZfdCBldmVudCk7Ci1jb25zdCBjaGFyKiBkdW1wX3Byb3BlcnR5X3R5cGUoYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpOwotY29uc3QgY2hhciogZHVtcF9hZGFwdGVyX3NjYW5fbW9kZShidF9zY2FuX21vZGVfdCBtb2RlKTsKLWNvbnN0IGNoYXIqIGR1bXBfdGhyZWFkX2V2dChidF9jYl90aHJlYWRfZXZ0IGV2dCk7Ci1jb25zdCBjaGFyKiBkdW1wX2F2X2Nvbm5fc3RhdGUodWludDE2X3QgZXZlbnQpOwotY29uc3QgY2hhciogZHVtcF9hdl9hdWRpb19zdGF0ZSh1aW50MTZfdCBldmVudCk7Ci1jb25zdCBjaGFyKiBkdW1wX3JjX2V2ZW50KHVpbnQ4X3QgZXZlbnQpOwotY29uc3QgY2hhciogZHVtcF9yY19ub3RpZmljYXRpb25fZXZlbnRfaWQodWludDhfdCBldmVudF9pZCk7Ci1jb25zdCBjaGFyKiBkdW1wX3JjX3BkdSh1aW50OF90IHBkdSk7Ci0KLXVpbnQzMl90IGRldmNsYXNzMnVpbnQoREVWX0NMQVNTIGRldl9jbGFzcyk7Ci12b2lkIHVpbnQyZGV2Y2xhc3ModWludDMyX3QgZGV2LCBERVZfQ0xBU1MgZGV2X2NsYXNzKTsKLQotaW50IGFzY2lpXzJfaGV4KGNvbnN0IGNoYXIqIHBfYXNjaWksIGludCBsZW4sIHVpbnQ4X3QqIHBfaGV4KTsKLQotI2VuZGlmIC8qIEJUSUZfVVRJTF9IICovCmRpZmYgLS1naXQgYS9idGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIGIvYnRpZi9pbmNsdWRlL3N0YWNrX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyMGRkZC4uMDAwMDAwMAotLS0gYS9idGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKCppbml0X3N0YWNrKSh2b2lkKTsKLSAgdm9pZCAoKnN0YXJ0X3VwX3N0YWNrX2FzeW5jKSh2b2lkKTsKLSAgdm9pZCAoKnNodXRfZG93bl9zdGFja19hc3luYykodm9pZCk7Ci0gIHZvaWQgKCpjbGVhbl91cF9zdGFjaykodm9pZCk7Ci0KLSAgYm9vbCAoKmdldF9zdGFja19pc19ydW5uaW5nKSh2b2lkKTsKLX0gc3RhY2tfbWFuYWdlcl90OwotCi1jb25zdCBzdGFja19tYW5hZ2VyX3QqIHN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpOwotCi0vLyBUT0RPKHphY2hvdmVyZmxvdyk6IHJlbW92ZSB0aGlzIHRlcnJpYmxlIGhhY2sgb25jZSB0aGUgc3RhcnR1cCBzZXF1ZW5jZSBpcwotLy8gbW9yZSBzYW5lCi1mdXR1cmVfdCogc3RhY2tfbWFuYWdlcl9nZXRfaGFja19mdXR1cmUoKTsKZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2JsdWV0b290aC5jYyBiL2J0aWYvc3JjL2JsdWV0b290aC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2Mzc0Ni4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9ibHVldG9vdGguY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYmx1ZXRvb3RoLmMKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgQmx1ZXRvb3RoIEhBTCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZiIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfY3Npcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9oZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hlYXJpbmdfYWlkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGZfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9sZV9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3Bhbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3JjLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc2RwLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc29jay5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3ZjLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2NzaXNfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2hlYXJpbmdfYWlkX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvYXZyY3AvYXZyY3Bfc2VydmljZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9zdGFja19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiYnRpZl9hMmRwLmgiCi0jaW5jbHVkZSAiYnRpZl9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIgotI2luY2x1ZGUgImJ0aWZfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9hdi5oIgotI2luY2x1ZGUgImJ0aWZfYnFyLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmX2RlYnVnLmgiCi0jaW5jbHVkZSAiYnRpZl9kZWJ1Z19idHNub29wLmgiCi0jaW5jbHVkZSAiYnRpZl9kZWJ1Z19jb25uLmgiCi0jaW5jbHVkZSAiYnRpZl9oZi5oIgotI2luY2x1ZGUgImJ0aWZfa2V5c3RvcmUuaCIKLSNpbmNsdWRlICJidGlmX21ldHJpY3NfbG9nZ2luZy5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImNvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3IuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNzLmgiCi0jaW5jbHVkZSAiY29tbW9uL29zX3V0aWxzLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgImdkL2NvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdGlvbl90cmFja2VyLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvd2FrZWxvY2suaCIKLSNpbmNsdWRlICJzdGFjay9nYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudEludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6aGVhcmluZ19haWQ6OkhlYXJpbmdBaWRJbnRlcmZhY2U7Ci11c2luZyBibHVldG9vdGg6OmxlX2F1ZGlvOjpMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjp2Yzo6Vm9sdW1lQ29udHJvbEludGVyZmFjZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYnRfY2FsbGJhY2tzX3QqIGJ0X2hhbF9jYmFja3MgPSBOVUxMOwotYm9vbCByZXN0cmljdGVkX21vZGUgPSBmYWxzZTsKLWJvb2wgY29tbW9uX2NyaXRlcmlhX21vZGUgPSBmYWxzZTsKLWNvbnN0IGludCBDT05GSUdfQ09NUEFSRV9BTExfUEFTUyA9IDBiMTE7Ci1pbnQgY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdCA9IENPTkZJR19DT01QQVJFX0FMTF9QQVNTOwotYm9vbCBpc19sb2NhbF9kZXZpY2VfYXR2ID0gZmFsc2U7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogbGlzdCBhbGwgZXh0ZW5kZWQgaW50ZXJmYWNlcyBoZXJlICovCi0KLS8qIGhhbmRzZnJlZSBwcm9maWxlIC0gY2xpZW50ICovCi1leHRlcm4gY29uc3QgYnRoZl9jbGllbnRfaW50ZXJmYWNlX3QqIGJ0aWZfaGZfY2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLS8qIGFkdmFuY2VkIGF1ZGlvIHByb2ZpbGUgKi8KLWV4dGVybiBjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCogYnRpZl9hdl9nZXRfc3JjX2ludGVyZmFjZSgpOwotZXh0ZXJuIGNvbnN0IGJ0YXZfc2lua19pbnRlcmZhY2VfdCogYnRpZl9hdl9nZXRfc2lua19pbnRlcmZhY2UoKTsKLS8qcmZjIGwyY2FwKi8KLWV4dGVybiBjb25zdCBidHNvY2tfaW50ZXJmYWNlX3QqIGJ0aWZfc29ja19nZXRfaW50ZXJmYWNlKCk7Ci0vKiBoaWQgaG9zdCBwcm9maWxlICovCi1leHRlcm4gY29uc3QgYnRoaF9pbnRlcmZhY2VfdCogYnRpZl9oaF9nZXRfaW50ZXJmYWNlKCk7Ci0vKiBoaWQgZGV2aWNlIHByb2ZpbGUgKi8KLWV4dGVybiBjb25zdCBidGhkX2ludGVyZmFjZV90KiBidGlmX2hkX2dldF9pbnRlcmZhY2UoKTsKLS8qcGFuKi8KLWV4dGVybiBjb25zdCBidHBhbl9pbnRlcmZhY2VfdCogYnRpZl9wYW5fZ2V0X2ludGVyZmFjZSgpOwotLyogZ2F0dCAqLwotZXh0ZXJuIGNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCogYnRpZl9nYXR0X2dldF9pbnRlcmZhY2UoKTsKLS8qIGF2cmMgdGFyZ2V0ICovCi1leHRlcm4gY29uc3QgYnRyY19pbnRlcmZhY2VfdCogYnRpZl9yY19nZXRfaW50ZXJmYWNlKCk7Ci0vKiBhdnJjIGNvbnRyb2xsZXIgKi8KLWV4dGVybiBjb25zdCBidHJjX2N0cmxfaW50ZXJmYWNlX3QqIGJ0aWZfcmNfY3RybF9nZXRfaW50ZXJmYWNlKCk7Ci0vKlNEUCBzZWFyY2ggY2xpZW50Ki8KLWV4dGVybiBjb25zdCBidHNkcF9pbnRlcmZhY2VfdCogYnRpZl9zZHBfZ2V0X2ludGVyZmFjZSgpOwotLypIZWFyaW5nIEFpZCBjbGllbnQqLwotZXh0ZXJuIEhlYXJpbmdBaWRJbnRlcmZhY2UqIGJ0aWZfaGVhcmluZ19haWRfZ2V0X2ludGVyZmFjZSgpOwotLyogTGVBdWRpbyB0ZXN0aSBjbGllbnQgKi8KLWV4dGVybiBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKiBidGlmX2xlX2F1ZGlvX2dldF9pbnRlcmZhY2UoKTsKLS8qIENvb3JkaW5hdGVkIFNldCBTZXJ2aWNlIENsaWVudCAqLwotZXh0ZXJuIENzaXNDbGllbnRJbnRlcmZhY2UqIGJ0aWZfY3Npc19jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotLyogVm9sdW1lIENvbnRyb2wgY2xpZW50ICovCi1leHRlcm4gVm9sdW1lQ29udHJvbEludGVyZmFjZSogYnRpZl92b2x1bWVfY29udHJvbF9nZXRfaW50ZXJmYWNlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYm9vbCBpbnRlcmZhY2VfcmVhZHkodm9pZCkgeyByZXR1cm4gYnRfaGFsX2NiYWNrcyAhPSBOVUxMOyB9Ci12b2lkIHNldF9oYWxfY2JhY2tzKGJ0X2NhbGxiYWNrc190KiBjYWxsYmFja3MpIHsgYnRfaGFsX2NiYWNrcyA9IGNhbGxiYWNrczsgfQotCi1zdGF0aWMgYm9vbCBpc19wcm9maWxlKGNvbnN0IGNoYXIqIHAxLCBjb25zdCBjaGFyKiBwMikgewotICBDSEVDSyhwMSk7Ci0gIENIRUNLKHAyKTsKLSAgcmV0dXJuIHN0cmxlbihwMSkgPT0gc3RybGVuKHAyKSAmJiBzdHJuY21wKHAxLCBwMiwgc3RybGVuKHAyKSkgPT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICBCTFVFVE9PVEggSEFMIElOVEVSRkFDRSBGVU5DVElPTlMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBpbml0KGJ0X2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGJvb2wgc3RhcnRfcmVzdHJpY3RlZCwKLSAgICAgICAgICAgICAgICBib29sIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlLCBpbnQgY29uZmlnX2NvbXBhcmVfcmVzdWx0LAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBpbml0X2ZsYWdzLCBib29sIGlzX2F0dikgewotICBMT0dfSU5GTygKLSAgICAgICIlczogc3RhcnQgcmVzdHJpY3RlZCA9ICVkIDsgY29tbW9uIGNyaXRlcmlhIG1vZGUgPSAlZCwgY29uZmlnIGNvbXBhcmUgIgotICAgICAgInJlc3VsdCA9ICVkIiwKLSAgICAgIF9fZnVuY19fLCBzdGFydF9yZXN0cmljdGVkLCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSwKLSAgICAgIGNvbmZpZ19jb21wYXJlX3Jlc3VsdCk7Ci0KLSAgYmx1ZXRvb3RoOjpjb21tb246OkluaXRGbGFnczo6TG9hZChpbml0X2ZsYWdzKTsKLQotICBpZiAoaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfRE9ORTsKLQotI2lmZGVmIEJMVUVEUk9JRF9ERUJVRwotICBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdCgpOwotI2VuZGlmCi0KLSAgc2V0X2hhbF9jYmFja3MoY2FsbGJhY2tzKTsKLQotICByZXN0cmljdGVkX21vZGUgPSBzdGFydF9yZXN0cmljdGVkOwotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6U2V0QnRLZXlzdG9yZUludGVyZmFjZSgKLSAgICAgICAgYmx1ZXRvb3RoOjpibHVldG9vdGhfa2V5c3RvcmU6OmdldEJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKCkpOwotICAgIGJsdWV0b290aDo6b3M6OlBhcmFtZXRlclByb3ZpZGVyOjpTZXRDb21tb25Dcml0ZXJpYU1vZGUoCi0gICAgICAgIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKTsKLSAgICBpZiAoaXNfYmx1ZXRvb3RoX3VpZCgpICYmIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKSB7Ci0gICAgICBibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6U2V0Q29tbW9uQ3JpdGVyaWFDb25maWdDb21wYXJlUmVzdWx0KAotICAgICAgICAgIGNvbmZpZ19jb21wYXJlX3Jlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJsdWV0b290aDo6b3M6OlBhcmFtZXRlclByb3ZpZGVyOjpTZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoCi0gICAgICAgICAgQ09ORklHX0NPTVBBUkVfQUxMX1BBU1MpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb21tb25fY3JpdGVyaWFfbW9kZSA9IGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlOwotICAgIGNvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQgPSBjb25maWdfY29tcGFyZV9yZXN1bHQ7Ci0gIH0KLQotICBpc19sb2NhbF9kZXZpY2VfYXR2ID0gaXNfYXR2OwotCi0gIHN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpLT5pbml0X3N0YWNrKCk7Ci0gIGJ0aWZfZGVidWdfaW5pdCgpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgZW5hYmxlKCkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBzdGFja19tYW5hZ2VyX2dldF9pbnRlcmZhY2UoKS0+c3RhcnRfdXBfc3RhY2tfYXN5bmMoKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGRpc2FibGUodm9pZCkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBzdGFja19tYW5hZ2VyX2dldF9pbnRlcmZhY2UoKS0+c2h1dF9kb3duX3N0YWNrX2FzeW5jKCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cCh2b2lkKSB7IHN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpLT5jbGVhbl91cF9zdGFjaygpOyB9Ci0KLWJvb2wgaXNfcmVzdHJpY3RlZF9tb2RlKCkgeyByZXR1cm4gcmVzdHJpY3RlZF9tb2RlOyB9Ci1ib29sIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKCkgewotICByZXR1cm4gaXNfYmx1ZXRvb3RoX3VpZCgpICYmIGNvbW1vbl9jcml0ZXJpYV9tb2RlOwotfQotLy8gaWYgY29tbW9uIGNyaXRlcmlhIG1vZGUgZGlzYWJsZSwgd2lsbCBhbHdheXMgcmV0dXJuCi0vLyBDT05GSUdfQ09NUEFSRV9BTExfUEFTUygwYjExKSBpbmRpY2F0ZSBkb24ndCBjaGVjayBjb25maWcgY2hlY2tzdW0uCi1pbnQgZ2V0X2NvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQoKSB7Ci0gIHJldHVybiBpc19jb21tb25fY3JpdGVyaWFfbW9kZSgpID8gY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENPTkZJR19DT01QQVJFX0FMTF9QQVNTOwotfQotCi1ib29sIGlzX2F0dl9kZXZpY2UoKSB7IHJldHVybiBpc19sb2NhbF9kZXZpY2VfYXR2OyB9Ci0KLXN0YXRpYyBpbnQgZ2V0X2FkYXB0ZXJfcHJvcGVydGllcyh2b2lkKSB7Ci0gIGlmICghYnRpZl9pc19lbmFibGVkKCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9nZXRfYWRhcHRlcl9wcm9wZXJ0aWVzKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBnZXRfYWRhcHRlcl9wcm9wZXJ0eShidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICAvKiBBbGxvdyBnZXRfYWRhcHRlcl9wcm9wZXJ0eSBvbmx5IGZvciBCREFERFIgYW5kIEJETkFNRSBpZiBCVCBpcyBkaXNhYmxlZCAqLwotICBpZiAoIWJ0aWZfaXNfZW5hYmxlZCgpICYmICh0eXBlICE9IEJUX1BST1BFUlRZX0JEQUREUikgJiYKLSAgICAgICh0eXBlICE9IEJUX1BST1BFUlRZX0JETkFNRSkgJiYgKHR5cGUgIT0gQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFKSkKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZ2V0X2FkYXB0ZXJfcHJvcGVydHksIHR5cGUpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHNldF9hZGFwdGVyX3Byb3BlcnR5KGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIGlmICghYnRpZl9pc19lbmFibGVkKCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIHN3aXRjaCAocHJvcGVydHktPnR5cGUpIHsKLSAgICBjYXNlIEJUX1BST1BFUlRZX0JETkFNRToKLSAgICBjYXNlIEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFOgotICAgIGNhc2UgQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVDoKLSAgICBjYXNlIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRToKLSAgICBjYXNlIEJUX1BST1BFUlRZX0xPQ0FMX0lPX0NBUFM6Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9JT19DQVBTX0JMRToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfc2V0X2FkYXB0ZXJfcHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zaV9mcmVlKHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZGVlcF9jb3B5KHByb3BlcnR5KSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyKSB7Ci0gIGlmICghYnRpZl9pc19lbmFibGVkKCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZW1vdGVfYWRkcikpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICBpZiAoIWJ0aWZfaXNfZW5hYmxlZCgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlbW90ZV9hZGRyLCB0eXBlKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotaW50IHNldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIGlmICghYnRpZl9pc19lbmFibGVkKCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgIFtdKFJhd0FkZHJlc3MgcmVtb3RlX2FkZHIsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJnJlbW90ZV9hZGRyLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIG9zaV9mcmVlKHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAqcmVtb3RlX2FkZHIsIHByb3BlcnR5X2RlZXBfY29weShwcm9wZXJ0eSkpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1pbnQgZ2V0X3JlbW90ZV9zZXJ2aWNlcyhSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwgaW50IHRyYW5zcG9ydCkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fZ2V0X3JlbW90ZV9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVtb3RlX2FkZHIsIHRyYW5zcG9ydCkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgc3RhcnRfZGlzY292ZXJ5KHZvaWQpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX3N0YXJ0X2Rpc2NvdmVyeSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY2FuY2VsX2Rpc2NvdmVyeSh2b2lkKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9kbV9jYW5jZWxfZGlzY292ZXJ5KSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBjcmVhdGVfYm9uZChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBpbnQgdHJhbnNwb3J0KSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICBpZiAoYnRpZl9kbV9wYWlyaW5nX2lzX2J1c3koKSkgcmV0dXJuIEJUX1NUQVRVU19CVVNZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoYnRpZl9kbV9jcmVhdGVfYm9uZCwgKmJkX2FkZHIsIHRyYW5zcG9ydCkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2JvbmRfb3V0X29mX2JhbmQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCogcDE5Ml9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF9vb2JfZGF0YV90KiBwMjU2X2RhdGEpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIGlmIChidGlmX2RtX3BhaXJpbmdfaXNfYnVzeSgpKSByZXR1cm4gQlRfU1RBVFVTX0JVU1k7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZShidGlmX2RtX2NyZWF0ZV9ib25kX291dF9vZl9iYW5kLCAqYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCAqcDE5Ml9kYXRhLCAqcDI1Nl9kYXRhKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBnZW5lcmF0ZV9sb2NhbF9vb2JfZGF0YSh0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIHJldHVybiBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9kbV9nZW5lcmF0ZV9sb2NhbF9vb2JfZGF0YSwgdHJhbnNwb3J0KSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2FuY2VsX2JvbmQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fY2FuY2VsX2JvbmQsICpiZF9hZGRyKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCByZW1vdmVfYm9uZChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGlmIChpc19yZXN0cmljdGVkX21vZGUoKSAmJiAhYnRpZl9zdG9yYWdlX2lzX3Jlc3RyaWN0ZWRfZGV2aWNlKGJkX2FkZHIpKQotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLQotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fcmVtb3ZlX2JvbmQsICpiZF9hZGRyKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBnZXRfY29ubmVjdGlvbl9zdGF0ZShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiAwOwotCi0gIHJldHVybiBidGlmX2RtX2dldF9jb25uZWN0aW9uX3N0YXRlKGJkX2FkZHIpOwotfQotCi1zdGF0aWMgaW50IHBpbl9yZXBseShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCB1aW50OF90IGFjY2VwdCwgdWludDhfdCBwaW5fbGVuLAotICAgICAgICAgICAgICAgICAgICAgYnRfcGluX2NvZGVfdCogcGluX2NvZGUpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIGlmIChwaW5fY29kZSA9PSBudWxscHRyIHx8IHBpbl9sZW4gPiBQSU5fQ09ERV9MRU4pIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fcGluX3JlcGx5LCAqYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQsIHBpbl9sZW4sICpwaW5fY29kZSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgc3NwX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJ0X3NzcF92YXJpYW50X3QgdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWNjZXB0LCB1aW50MzJfdCBwYXNza2V5KSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICBpZiAodmFyaWFudCA9PSBCVF9TU1BfVkFSSUFOVF9QQVNTS0VZX0VOVFJZKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fc3NwX3JlcGx5LCAqYmRfYWRkciwgdmFyaWFudCwgYWNjZXB0KSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCByZWFkX2VuZXJneV9pbmZvKCkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fcmVhZF9lbmVyZ3lfaW5mbykpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJndW1lbnRzKSB7Ci0gIGJ0aWZfZGVidWdfY29ubl9kdW1wKGZkKTsKLSAgYnRpZl9kZWJ1Z19ib25kX2V2ZW50X2R1bXAoZmQpOwotICBidGlmX2RlYnVnX2EyZHBfZHVtcChmZCk7Ci0gIGJ0aWZfZGVidWdfYXZfZHVtcChmZCk7Ci0gIGJ0YV9kZWJ1Z19hdl9kdW1wKGZkKTsKLSAgc3RhY2tfZGVidWdfYXZkdHBfYXBpX2R1bXAoZmQpOwotICBibHVldG9vdGg6OmF2cmNwOjpBdnJjcFNlcnZpY2U6OkRlYnVnRHVtcChmZCk7Ci0gIGJ0aWZfZGVidWdfY29uZmlnX2R1bXAoZmQpOwotICBCVEFfSGZDbGllbnREdW1wU3RhdGlzdGljcyhmZCk7Ci0gIHdha2Vsb2NrX2RlYnVnX2R1bXAoZmQpOwotICBvc2lfYWxsb2NhdG9yX2RlYnVnX2R1bXAoZmQpOwotICBhbGFybV9kZWJ1Z19kdW1wKGZkKTsKLSAgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50OjpEZWJ1Z0R1bXAoZmQpOwotICBIZWFyaW5nQWlkOjpEZWJ1Z0R1bXAoZmQpOwotICBMZUF1ZGlvQ2xpZW50OjpEZWJ1Z0R1bXAoZmQpOwotICBjb25uZWN0aW9uX21hbmFnZXI6OmR1bXAoZmQpOwotICBibHVldG9vdGg6OmJxcjo6RGVidWdEdW1wKGZkKTsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6RHVtcChmZCwgYXJndW1lbnRzKTsKLSAgfSBlbHNlIHsKLSNpZiAoQlRTTk9PUF9NRU0gPT0gVFJVRSkKLSAgICBidGlmX2RlYnVnX2J0c25vb3BfZHVtcChmZCk7Ci0jZW5kaWYKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBkdW1wTWV0cmljcyhzdGQ6OnN0cmluZyogb3V0cHV0KSB7Ci0gIGJsdWV0b290aDo6Y29tbW9uOjpCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZyhvdXRwdXQpOwotfQotCi1zdGF0aWMgY29uc3Qgdm9pZCogZ2V0X3Byb2ZpbGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIqIHByb2ZpbGVfaWQpIHsKLSAgTE9HX0lORk8oIiVzOiBpZCA9ICVzIiwgX19mdW5jX18sIHByb2ZpbGVfaWQpOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gTlVMTDsKLQotICAvKiBjaGVjayBmb3Igc3VwcG9ydGVkIHByb2ZpbGUgaW50ZXJmYWNlcyAqLwotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0hBTkRTRlJFRV9JRCkpCi0gICAgcmV0dXJuIGJsdWV0b290aDo6aGVhZHNldDo6R2V0SW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9IQU5EU0ZSRUVfQ0xJRU5UX0lEKSkKLSAgICByZXR1cm4gYnRpZl9oZl9jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfU09DS0VUU19JRCkpCi0gICAgcmV0dXJuIGJ0aWZfc29ja19nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9QQU5fSUQpKQotICAgIHJldHVybiBidGlmX3Bhbl9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9BRFZBTkNFRF9BVURJT19JRCkpCi0gICAgcmV0dXJuIGJ0aWZfYXZfZ2V0X3NyY19pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0FEVkFOQ0VEX0FVRElPX1NJTktfSUQpKQotICAgIHJldHVybiBidGlmX2F2X2dldF9zaW5rX2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfSElESE9TVF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfaGhfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfSElEREVWX0lEKSkKLSAgICByZXR1cm4gYnRpZl9oZF9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9TRFBfQ0xJRU5UX0lEKSkKLSAgICByZXR1cm4gYnRpZl9zZHBfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfR0FUVF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfZ2F0dF9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9BVl9SQ19JRCkpCi0gICAgcmV0dXJuIGJ0aWZfcmNfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfQVZfUkNfQ1RSTF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfcmNfY3RybF9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9IRUFSSU5HX0FJRF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfaGVhcmluZ19haWRfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX0tFWVNUT1JFX0lEKSkKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpibHVldG9vdGhfa2V5c3RvcmU6OmdldEJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfQUNUSVZJVFlfQVRUUklCVVRJT05fSUQpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6YWN0aXZpdHlfYXR0cmlidXRpb246OmdldF9hY3Rpdml0eV9hdHRyaWJ1dGlvbl9pbnN0YW5jZSgpOwotICB9Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9MRV9BVURJT19JRCkpCi0gICAgcmV0dXJuIGJ0aWZfbGVfYXVkaW9fZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfVkNfSUQpKQotICAgIHJldHVybiBidGlmX3ZvbHVtZV9jb250cm9sX2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0NTSVNfQ0xJRU5UX0lEKSkKLSAgICByZXR1cm4gYnRpZl9jc2lzX2NsaWVudF9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBkdXRfbW9kZV9jb25maWd1cmUodWludDhfdCBlbmFibGUpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIGlmICghc3RhY2tfbWFuYWdlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9zdGFja19pc19ydW5uaW5nKCkpCi0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2R1dF9tb2RlX2NvbmZpZ3VyZSwgZW5hYmxlKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotaW50IGR1dF9tb2RlX3NlbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICBpZiAoIWJ0aWZfaXNfZHV0X21vZGUoKSkgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIHVpbnQ4X3QqIGNvcHkgPSAodWludDhfdCopb3NpX2NhbGxvYyhsZW4pOwotICBtZW1jcHkoY29weSwgYnVmLCBsZW4pOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBbXSh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9kdXRfbW9kZV9zZW5kKG9wY29kZSwgYnVmLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICBvc2lfZnJlZShidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwgY29weSwgbGVuKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotaW50IGxlX3Rlc3RfbW9kZSh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBjYXNlIEhDSV9CTEVfVFJBTlNNSVRURVJfVEVTVDoKLSAgICAgIGlmIChsZW4gIT0gMykgcmV0dXJuIEJUX1NUQVRVU19QQVJNX0lOVkFMSUQ7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfYmxlX3RyYW5zbWl0dGVyX3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0JMRV9SRUNFSVZFUl9URVNUOgotICAgICAgaWYgKGxlbiAhPSAxKSByZXR1cm4gQlRfU1RBVFVTX1BBUk1fSU5WQUxJRDsKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKGJ0aWZfYmxlX3JlY2VpdmVyX3Rlc3QsIGJ1ZlswXSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfQkxFX1RFU1RfRU5EOgotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2JsZV90ZXN0X2VuZCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfb3NfY2FsbG91dHNfdCogd2FrZWxvY2tfb3NfY2FsbG91dHNfc2F2ZWQgPSBudWxscHRyOwotCi1zdGF0aWMgaW50IGFjcXVpcmVfd2FrZV9sb2NrX2NiKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSkgewotICByZXR1cm4gZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZChiYXNlOjpJZ25vcmVSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2Vsb2NrX29zX2NhbGxvdXRzX3NhdmVkLT5hY3F1aXJlX3dha2VfbG9jayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja19uYW1lKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV93YWtlX2xvY2tfY2IoY29uc3QgY2hhciogbG9ja19uYW1lKSB7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJhc2U6Oklnbm9yZVJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZWxvY2tfb3NfY2FsbG91dHNfc2F2ZWQtPnJlbGVhc2Vfd2FrZV9sb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrX25hbWUpKTsKLX0KLQotc3RhdGljIGJ0X29zX2NhbGxvdXRzX3Qgd2FrZWxvY2tfb3NfY2FsbG91dHNfam5pID0gewotICAgIHNpemVvZih3YWtlbG9ja19vc19jYWxsb3V0c19qbmkpLAotICAgIG51bGxwdHIgLyogbm90IHVzZWQgKi8sCi0gICAgYWNxdWlyZV93YWtlX2xvY2tfY2IsCi0gICAgcmVsZWFzZV93YWtlX2xvY2tfY2IsCi19OwotCi1zdGF0aWMgaW50IHNldF9vc19jYWxsb3V0cyhidF9vc19jYWxsb3V0c190KiBjYWxsb3V0cykgewotICB3YWtlbG9ja19vc19jYWxsb3V0c19zYXZlZCA9IGNhbGxvdXRzOwotICB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHMoJndha2Vsb2NrX29zX2NhbGxvdXRzX2puaSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBjb25maWdfY2xlYXIodm9pZCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBidGlmX2NvbmZpZ19jbGVhcigpID8gQlRfU1RBVFVTX1NVQ0NFU1MgOiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotc3RhdGljIGJsdWV0b290aDo6YXZyY3A6OlNlcnZpY2VJbnRlcmZhY2UqIGdldF9hdnJjcF9zZXJ2aWNlKHZvaWQpIHsKLSAgcmV0dXJuIGJsdWV0b290aDo6YXZyY3A6OkF2cmNwU2VydmljZTo6R2V0U2VydmljZUludGVyZmFjZSgpOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgb2JmdXNjYXRlX2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICByZXR1cm4gYmx1ZXRvb3RoOjpjb21tb246OkFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoCi0gICAgICBhZGRyZXNzKTsKLX0KLQotc3RhdGljIGludCBnZXRfbWV0cmljX2lkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgcmV0dXJuIGFsbG9jYXRlX21ldHJpY19pZF9mcm9tX21ldHJpY19pZF9hbGxvY2F0b3IoYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUoaW50IGNvZGVjLCBpbnQgc2l6ZSkgewotICByZXR1cm4gYnRpZl9zZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZShjb2RlYywgc2l6ZSk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wgYnRfaW50ZXJmYWNlX3QgYmx1ZXRvb3RoSW50ZXJmYWNlID0gewotICAgIHNpemVvZihibHVldG9vdGhJbnRlcmZhY2UpLAotICAgIGluaXQsCi0gICAgZW5hYmxlLAotICAgIGRpc2FibGUsCi0gICAgY2xlYW51cCwKLSAgICBnZXRfYWRhcHRlcl9wcm9wZXJ0aWVzLAotICAgIGdldF9hZGFwdGVyX3Byb3BlcnR5LAotICAgIHNldF9hZGFwdGVyX3Byb3BlcnR5LAotICAgIGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMsCi0gICAgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHksCi0gICAgc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHksCi0gICAgbnVsbHB0ciwKLSAgICBnZXRfcmVtb3RlX3NlcnZpY2VzLAotICAgIHN0YXJ0X2Rpc2NvdmVyeSwKLSAgICBjYW5jZWxfZGlzY292ZXJ5LAotICAgIGNyZWF0ZV9ib25kLAotICAgIGNyZWF0ZV9ib25kX291dF9vZl9iYW5kLAotICAgIHJlbW92ZV9ib25kLAotICAgIGNhbmNlbF9ib25kLAotICAgIGdldF9jb25uZWN0aW9uX3N0YXRlLAotICAgIHBpbl9yZXBseSwKLSAgICBzc3BfcmVwbHksCi0gICAgZ2V0X3Byb2ZpbGVfaW50ZXJmYWNlLAotICAgIGR1dF9tb2RlX2NvbmZpZ3VyZSwKLSAgICBkdXRfbW9kZV9zZW5kLAotICAgIGxlX3Rlc3RfbW9kZSwKLSAgICBzZXRfb3NfY2FsbG91dHMsCi0gICAgcmVhZF9lbmVyZ3lfaW5mbywKLSAgICBkdW1wLAotICAgIGR1bXBNZXRyaWNzLAotICAgIGNvbmZpZ19jbGVhciwKLSAgICBpbnRlcm9wX2RhdGFiYXNlX2NsZWFyLAotICAgIGludGVyb3BfZGF0YWJhc2VfYWRkLAotICAgIGdldF9hdnJjcF9zZXJ2aWNlLAotICAgIG9iZnVzY2F0ZV9hZGRyZXNzLAotICAgIGdldF9tZXRyaWNfaWQsCi0gICAgc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUsCi0gICAgZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGF9OwotCi0vLyBjYWxsYmFjayByZXBvcnRpbmcgaGVscGVycwotCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9kZWVwX2NvcHlfYXJyYXkoaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgYnRfcHJvcGVydHlfdCogY29weSA9IG51bGxwdHI7Ci0gIGlmIChudW1fcHJvcGVydGllcyA+IDApIHsKLSAgICBzaXplX3QgY29udGVudF9sZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3Byb3BlcnRpZXM7IGkrKykgewotICAgICAgYXV0byBsZW4gPSBwcm9wZXJ0aWVzW2ldLmxlbjsKLSAgICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIGNvbnRlbnRfbGVuICs9IGxlbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjb3B5ID0gKGJ0X3Byb3BlcnR5X3QqKW9zaV9jYWxsb2MoKHNpemVvZihidF9wcm9wZXJ0eV90KSAqIG51bV9wcm9wZXJ0aWVzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuKTsKLSAgICBBU1NFUlQoY29weSAhPSBudWxscHRyKTsKLSAgICB1aW50OF90KiBjb250ZW50ID0gKHVpbnQ4X3QqKShjb3B5ICsgbnVtX3Byb3BlcnRpZXMpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcHJvcGVydGllczsgaSsrKSB7Ci0gICAgICBhdXRvIGxlbiA9IHByb3BlcnRpZXNbaV0ubGVuOwotICAgICAgY29weVtpXS50eXBlID0gcHJvcGVydGllc1tpXS50eXBlOwotICAgICAgY29weVtpXS5sZW4gPSBsZW47Ci0gICAgICBpZiAobGVuIDw9IDApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBjb3B5W2ldLnZhbCA9IGNvbnRlbnQ7Ci0gICAgICBtZW1jcHkoY29udGVudCwgcHJvcGVydGllc1tpXS52YWwsIGxlbik7Ci0gICAgICBjb250ZW50ICs9IGxlbjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLXZvaWQgaW52b2tlX2FkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYihidF9zdGF0ZV90IHN0YXRlKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShidF9zdGF0ZV90IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2IsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSk7Ci19Ci0KLXZvaWQgaW52b2tlX2FkYXB0ZXJfcHJvcGVydGllc19jYihidF9zdGF0dXNfdCBzdGF0dXMsIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICBbXShidF9zdGF0dXNfdCBzdGF0dXMsIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCBhZGFwdGVyX3Byb3BlcnRpZXNfY2IsIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBvc2lfZnJlZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2RlZXBfY29weV9hcnJheShudW1fcHJvcGVydGllcywgcHJvcGVydGllcykpKTsKLX0KLQotdm9pZCBpbnZva2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgW10oYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgJmJkX2FkZHIsIG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBvc2lfZnJlZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYmRfYWRkciwgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9kZWVwX2NvcHlfYXJyYXkobnVtX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMpKSk7Ci19Ci0KLXZvaWQgaW52b2tlX2RldmljZV9mb3VuZF9jYihpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgIFtdKGludCBudW1fcHJvcGVydGllcywgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCBkZXZpY2VfZm91bmRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NpX2ZyZWUocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZGVlcF9jb3B5X2FycmF5KG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKSkpOwotfQotCi12b2lkIGludm9rZV9kaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYihidF9kaXNjb3Zlcnlfc3RhdGVfdCBzdGF0ZSkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSk7Ci19Ci0KLXZvaWQgaW52b2tlX3Bpbl9yZXF1ZXN0X2NiKFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfYmRuYW1lX3QgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZCwgYm9vbCBtaW5fMTZfZGlnaXQpIHsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfYmRuYW1lX3QgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJvb2wgbWluXzE2X2RpZ2l0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgcGluX3JlcXVlc3RfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJkX2FkZHIsICZiZF9uYW1lLCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluXzE2X2RpZ2l0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIsIGJkX25hbWUsIGNvZCwgbWluXzE2X2RpZ2l0KSk7Ci19Ci0KLXZvaWQgaW52b2tlX3NzcF9yZXF1ZXN0X2NiKFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfYmRuYW1lX3QgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZCwgYnRfc3NwX3ZhcmlhbnRfdCBwYWlyaW5nX3ZhcmlhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNzX2tleSkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgW10oUmF3QWRkcmVzcyBiZF9hZGRyLCBidF9iZG5hbWVfdCBiZF9uYW1lLCB1aW50MzJfdCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LCB1aW50MzJfdCBwYXNzX2tleSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCBzc3BfcmVxdWVzdF9jYiwgJmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiZF9uYW1lLCBjb2QsIHBhaXJpbmdfdmFyaWFudCwgcGFzc19rZXkpOwotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLCBiZF9uYW1lLCBjb2QsIHBhaXJpbmdfdmFyaWFudCwgcGFzc19rZXkpKTsKLX0KLQotdm9pZCBpbnZva2Vfb29iX2RhdGFfcmVxdWVzdF9jYih0QlRfVFJBTlNQT1JUIHQsIGJvb2wgdmFsaWQsIE9jdGV0MTYgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0ZXQxNiByLCBSYXdBZGRyZXNzIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkZHJlc3NfdHlwZSkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0X29vYl9kYXRhX3Qgb29iX2RhdGEgPSB7fTsKLSAgY2hhciogbG9jYWxfbmFtZTsKLSAgQlRNX1JlYWRMb2NhbERldmljZU5hbWUoJmxvY2FsX25hbWUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IEJUTV9NQVhfTE9DX0JEX05BTUVfTEVOOyBpKyspIHsKLSAgICBvb2JfZGF0YS5kZXZpY2VfbmFtZVtpXSA9IGxvY2FsX25hbWVbaV07Ci0gIH0KLQotICAvLyBTZXQgdGhlIGxvY2FsIGFkZHJlc3MKLSAgaW50IGogPSA1OwotICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgIG9vYl9kYXRhLmFkZHJlc3NbaV0gPSByYXdfYWRkcmVzcy5hZGRyZXNzW2pdOwotICAgIGotLTsKLSAgfQotICBvb2JfZGF0YS5hZGRyZXNzWzZdID0gYWRkcmVzc190eXBlOwotCi0gIC8vIEVhY2ggdmFsdWUgKGZvciBDIGFuZCBSKSBpcyAxNiBvY3RldHMgaW4gbGVuZ3RoCi0gIGJvb2wgY19lbXB0eSA9IHRydWU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIC8vIEMgY2Fubm90IGJlIGFsbCAwcywgaWYgc28gdGhlbiB3ZSB3YW50IHRvIGZhaWwKLSAgICBpZiAoY1tpXSAhPSAwKSBjX2VtcHR5ID0gZmFsc2U7Ci0gICAgb29iX2RhdGEuY1tpXSA9IGNbaV07Ci0gICAgLy8gUiBpcyBvcHRpb25hbCBhbmQgbWF5IGJlIGVtcHR5Ci0gICAgb29iX2RhdGEucltpXSA9IHJbaV07Ci0gIH0KLSAgb29iX2RhdGEuaXNfdmFsaWQgPSB2YWxpZCAmJiAhY19lbXB0eTsKLSAgLy8gVGhlIG9vYl9kYXRhX2xlbmd0aCBpcyAyIG9jdGVjdHMgaW4gbGVuZ3RoLiAgVGhlIHZhbHVlIGluY2x1ZGVzIHRoZSBsZW5ndGgKLSAgLy8gb2YgaXRzZWxmLiAxNiArIDE2ICsgMiA9IDM0IERhdGEgMHgwMDIyIExpdHRsZSBFbmRpYW4gb3JkZXIgMHgyMjAwCi0gIG9vYl9kYXRhLm9vYl9kYXRhX2xlbmd0aFswXSA9IDA7Ci0gIG9vYl9kYXRhLm9vYl9kYXRhX2xlbmd0aFsxXSA9IDM0OwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgIFtdKHRCVF9UUkFOU1BPUlQgdCwgYnRfb29iX2RhdGFfdCBvb2JfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGFfY2IsIHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb2JfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgdCwgb29iX2RhdGEpKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IEZhaWxlZCB0byBjYWxsIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKLSAgfQotfQotCi12b2lkIGludm9rZV9ib25kX3N0YXRlX2NoYW5nZWRfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlLCBpbnQgZmFpbF9yZWFzb24pIHsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSwgaW50IGZhaWxfcmVhc29uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib25kX3N0YXRlX2NoYW5nZWRfY2IsIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmRfYWRkciwgc3RhdGUsIGZhaWxfcmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYmRfYWRkciwgc3RhdGUsIGZhaWxfcmVhc29uKSk7Ci19Ci0KLXZvaWQgaW52b2tlX2FjbF9zdGF0ZV9jaGFuZ2VkX2NiKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYWNsX3N0YXRlX3Qgc3RhdGUsIGludCB0cmFuc3BvcnRfbGlua190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfaGNpX2Vycm9yX2NvZGVfdCBoY2lfcmVhc29uKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICBbXShidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfYWNsX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgaW50IHRyYW5zcG9ydF9saW5rX3R5cGUsIGJ0X2hjaV9lcnJvcl9jb2RlX3QgaGNpX3JlYXNvbikgewotICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIGFjbF9zdGF0ZV9jaGFuZ2VkX2NiLCBzdGF0dXMsICZiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCB0cmFuc3BvcnRfbGlua190eXBlLCBoY2lfcmVhc29uKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIHN0YXR1cywgYmRfYWRkciwgc3RhdGUsIHRyYW5zcG9ydF9saW5rX3R5cGUsIGhjaV9yZWFzb24pKTsKLX0KLQotdm9pZCBpbnZva2VfdGhyZWFkX2V2dF9jYihidF9jYl90aHJlYWRfZXZ0IGV2ZW50KSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShidF9jYl90aHJlYWRfZXZ0IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgdGhyZWFkX2V2dF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gRElTQVNTT0NJQVRFX0pWTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9oYWxfY2JhY2tzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KSk7Ci19Ci0KLXZvaWQgaW52b2tlX2xlX3Rlc3RfbW9kZV9jYihidF9zdGF0dXNfdCBzdGF0dXMsIHVpbnQxNl90IGNvdW50KSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShidF9zdGF0dXNfdCBzdGF0dXMsIHVpbnQxNl90IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgbGVfdGVzdF9tb2RlX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgY291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBjb3VudCkpOwotfQotCi0vLyB0YWtlcyBvd25lcnNoaXAgb2YgfHVpZF9kYXRhfAotdm9pZCBpbnZva2VfZW5lcmd5X2luZm9fY2IoYnRfYWN0aXZpdHlfZW5lcmd5X2luZm8gZW5lcmd5X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidF91aWRfdHJhZmZpY190KiB1aWRfZGF0YSkgewotICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10oYnRfYWN0aXZpdHlfZW5lcmd5X2luZm8gZW5lcmd5X2luZm8sIGJ0X3VpZF90cmFmZmljX3QqIHVpZF9kYXRhKSB7Ci0gICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgZW5lcmd5X2luZm9fY2IsICZlbmVyZ3lfaW5mbywgdWlkX2RhdGEpOwotICAgICAgICAgICAgb3NpX2ZyZWUodWlkX2RhdGEpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgZW5lcmd5X2luZm8sIHVpZF9kYXRhKSk7Ci19Ci0KLXZvaWQgaW52b2tlX2xpbmtfcXVhbGl0eV9yZXBvcnRfY2IoCi0gICAgdWludDY0X3QgdGltZXN0YW1wLCBpbnQgcmVwb3J0X2lkLCBpbnQgcnNzaSwgaW50IHNuciwKLSAgICBpbnQgcmV0cmFuc21pc3Npb25fY291bnQsIGludCBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LAotICAgIGludCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpIHsKLSAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgIFtdKHVpbnQ2NF90IHRpbWVzdGFtcCwgaW50IHJlcG9ydF9pZCwgaW50IHJzc2ksIGludCBzbnIsCi0gICAgICAgICAgICAgaW50IHJldHJhbnNtaXNzaW9uX2NvdW50LCBpbnQgcGFja2V0c19ub3RfcmVjZWl2ZV9jb3VudCwKLSAgICAgICAgICAgICBpbnQgbmVnYXRpdmVfYWNrbm93bGVkZ2VtZW50X2NvdW50KSB7Ci0gICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgbGlua19xdWFsaXR5X3JlcG9ydF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHJlcG9ydF9pZCwgcnNzaSwgc25yLCByZXRyYW5zbWlzc2lvbl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2Fja25vd2xlZGdlbWVudF9jb3VudCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICB0aW1lc3RhbXAsIHJlcG9ydF9pZCwgcnNzaSwgc25yLCByZXRyYW5zbWlzc2lvbl9jb3VudCwKLSAgICAgICAgICBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfYTJkcC5jYyBiL2J0aWYvc3JjL2J0aWZfYTJkcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1ZDcxNy4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2EyZHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9hMmRwIgotCi0jaW5jbHVkZSAiYnRpZl9hMmRwLmgiCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpbmNsdWRlICJhdWRpb19hMmRwX2h3L2luY2x1ZGUvYXVkaW9fYTJkcF9ody5oIgotI2luY2x1ZGUgImF1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZy5oIgotI2luY2x1ZGUgImJ0YV9hdl9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2EyZHBfY29udHJvbC5oIgotI2luY2x1ZGUgImJ0aWZfYTJkcF9zaW5rLmgiCi0jaW5jbHVkZSAiYnRpZl9hMmRwX3NvdXJjZS5oIgotI2luY2x1ZGUgImJ0aWZfYXYuaCIKLSNpbmNsdWRlICJidGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAiYnRpZl9oZi5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdm9pZCBidGlmX2EyZHBfb25faWRsZSh2b2lkKSB7Ci0gIExPR19WRVJCT1NFKCJQZWVyIHN0cmVhbSBlbmRwb2ludCB0eXBlOiVzIiwKLSAgICAgICAgICAgICAgcGVlcl9zdHJlYW1fZW5kcG9pbnRfdGV4dChidGlmX2F2X2dldF9wZWVyX3NlcCgpKS5jX3N0cigpKTsKLSAgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NOSykgewotICAgIGJ0aWZfYTJkcF9zb3VyY2Vfb25faWRsZSgpOwotICB9IGVsc2UgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NSQykgewotICAgIGJ0aWZfYTJkcF9zaW5rX29uX2lkbGUoKTsKLSAgfQotfQotCi1ib29sIGJ0aWZfYTJkcF9vbl9zdGFydGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwgdEJUQV9BVl9TVEFSVCogcF9hdl9zdGFydCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogIyMgT04gQTJEUCBTVEFSVEVEICMjIHBlZXIgIiA8PCBwZWVyX2FkZHIgPDwgIiBwX2F2X3N0YXJ0OiIgPDwgcF9hdl9zdGFydDsKLQotICBpZiAocF9hdl9zdGFydCA9PSBOVUxMKSB7Ci0gICAgdEEyRFBfQ1RSTF9BQ0sgc3RhdHVzID0gQTJEUF9DVFJMX0FDS19TVUNDRVNTOwotICAgIGlmICghYmx1ZXRvb3RoOjpoZWFkc2V0OjpJc0NhbGxJZGxlKCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcGVlciAiIDw8IHBlZXJfYWRkciA8PCAiIGNhbGwgaW4gcHJvZ3Jlc3MsIGRvIG5vdCBzdGFydCBBMkRQIHN0cmVhbSI7Ci0gICAgICBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFOwotICAgIH0KLSAgICAvKiBqdXN0IGFjayBiYWNrIGEgbG9jYWwgc3RhcnQgcmVxdWVzdCwgZG8gbm90IHN0YXJ0IHRoZSBtZWRpYSBlbmNvZGVyIHNpbmNlCi0gICAgICogdGhpcyBpcyBub3QgZm9yIEJUQV9BVl9TVEFSVF9FVlQuICovCi0gICAgaWYgKGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N0YXJ0ZWQoc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHBlZXIgIiA8PCBwZWVyX2FkZHIgPDwgIiBzdGF0dXM6IiA8PCArcF9hdl9zdGFydC0+c3RhdHVzCi0gICAgICAgICAgICA8PCAiIHN1c3BlbmRpbmc6IiA8PCBsb2dib29sKHBfYXZfc3RhcnQtPnN1c3BlbmRpbmcpIDw8ICIgaW5pdGlhdG9yOiIgPDwgbG9nYm9vbChwX2F2X3N0YXJ0LT5pbml0aWF0b3IpOwotCi0gIGlmIChwX2F2X3N0YXJ0LT5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpIHsKLSAgICBpZiAocF9hdl9zdGFydC0+c3VzcGVuZGluZykgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXIgIiA8PCBwZWVyX2FkZHIgPDwgIiBBMkRQIGlzIHN1c3BlbmRpbmcgYW5kIGlnbm9yZXMgdGhlIHN0YXJ0ZWQgZXZlbnQiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoYnRpZl9hdl9pc19hMmRwX29mZmxvYWRfcnVubmluZygpKSB7Ci0gICAgICBidGlmX2F2X3N0cmVhbV9zdGFydF9vZmZsb2FkKCk7Ci0gICAgfSBlbHNlIGlmIChibHVldG9vdGg6OmF1ZGlvOjphMmRwOjppc19oYWxfMl8wX2VuYWJsZWQoKSkgewotICAgICAgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NOSykgewotICAgICAgICAvKiBTdGFydCB0aGUgbWVkaWEgZW5jb2RlciB0byBkbyB0aGUgU1cgYXVkaW8gc3RyZWFtICovCi0gICAgICAgIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnRfYXVkaW9fcmVxKCk7Ci0gICAgICB9Ci0gICAgICBpZiAocF9hdl9zdGFydC0+aW5pdGlhdG9yKSB7Ci0gICAgICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmFja19zdHJlYW1fc3RhcnRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHBfYXZfc3RhcnQtPmluaXRpYXRvcikgewotICAgICAgICBidGlmX2EyZHBfY29tbWFuZF9hY2soQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICAvKiBtZWRpYSB0YXNrIGlzIGF1dG8tc3RhcnRlZCB1cG9uIFVJUEMgY29ubmVjdGlvbiBvZiBhMmRwIGF1ZGlvcGF0aCAqLwotICAgIH0KLSAgfSBlbHNlIGlmIChwX2F2X3N0YXJ0LT5pbml0aWF0b3IpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXIgIiA8PCBwZWVyX2FkZHIgPDwgIiBBMkRQIHN0YXJ0IHJlcXVlc3QgZmFpbGVkOiBzdGF0dXMgPSAiIDw8ICtwX2F2X3N0YXJ0LT5zdGF0dXM7Ci0gICAgaWYgKGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICB9IGVsc2UgewotICAgICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBidGlmX2EyZHBfb25fc3RvcHBlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCkgewotICBMT0dfSU5GTygiJXM6ICMjIE9OIEEyRFAgU1RPUFBFRCAjIyBwX2F2X3N1c3BlbmQ9JXAiLCBfX2Z1bmNfXywgcF9hdl9zdXNwZW5kKTsKLQotICBpZiAoYnRpZl9hdl9nZXRfcGVlcl9zZXAoKSA9PSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgYnRpZl9hMmRwX3Npbmtfb25fc3RvcHBlZChwX2F2X3N1c3BlbmQpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkgfHwKLSAgICAgICFidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHsKLSAgICBidGlmX2EyZHBfc291cmNlX29uX3N0b3BwZWQocF9hdl9zdXNwZW5kKTsKLSAgfQotfQotCi12b2lkIGJ0aWZfYTJkcF9vbl9zdXNwZW5kZWQodEJUQV9BVl9TVVNQRU5EKiBwX2F2X3N1c3BlbmQpIHsKLSAgTE9HX0lORk8oIiVzOiAjIyBPTiBBMkRQIFNVU1BFTkRFRCAjIyBwX2F2X3N1c3BlbmQ9JXAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcF9hdl9zdXNwZW5kKTsKLSAgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NSQykgewotICAgIGJ0aWZfYTJkcF9zaW5rX29uX3N1c3BlbmRlZChwX2F2X3N1c3BlbmQpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkgfHwKLSAgICAgICFidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHsKLSAgICBidGlmX2EyZHBfc291cmNlX29uX3N1c3BlbmRlZChwX2F2X3N1c3BlbmQpOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX29uX29mZmxvYWRfc3RhcnRlZChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9TVEFUVVMgc3RhdHVzKSB7Ci0gIHRBMkRQX0NUUkxfQUNLIGFjazsKLSAgTE9HX0lORk8oIiVzOiBwZWVyICVzIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBwZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICBzdGF0dXMpOwotCi0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBCVEFfQVZfU1VDQ0VTUzoKLSAgICAgIGFjayA9IEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0FWX0ZBSUxfUkVTT1VSQ0VTOgotICAgICAgTE9HX0VSUk9SKCIlczogcGVlciAlcyBGQUlMRUQgVU5TVVBQT1JURUQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBwZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGFjayA9IEEyRFBfQ1RSTF9BQ0tfVU5TVVBQT1JURUQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCIlczogcGVlciAlcyBGQUlMRUQ6IHN0YXR1cyA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgcGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgc3RhdHVzKTsKLSAgICAgIGFjayA9IEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHsKLSAgICBpZiAoYWNrICE9IEJUQV9BVl9TVUNDRVNTICYmIGJ0aWZfYXZfc3RyZWFtX3N0YXJ0ZWRfcmVhZHkoKSkgewotICAgICAgLy8gT2ZmbG9hZCByZXF1ZXN0IHdpbGwgcmV0dXJuIHdpdGggZmFpbHVyZSBmcm9tIGJ0aWZfYXYgc20gaWYKLSAgICAgIC8vIHN1c3BlbmQgaXMgdHJpZ2dlcmVkIGZvciByZW1vdGUgc3RhcnQuIERpc2Nvbm5lY3Qgb25seSBpZiBTb0MKLSAgICAgIC8vIHJldHVybmVkIGZhaWx1cmUgZm9yIG9mZmxvYWQgVlNDCi0gICAgICBMT0dfRVJST1IoIiVzOiBwZWVyICVzIG9mZmxvYWQgc3RhcnQgZmFpbGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgcGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBidGlmX2F2X3NyY19kaXNjb25uZWN0X3NpbmsocGVlcl9hZGRyKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6YWNrX3N0cmVhbV9zdGFydGVkKGFjayk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKGFjayk7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2RlYnVnX2EyZHBfZHVtcChpbnQgZmQpIHsKLSAgYnRpZl9hMmRwX3NvdXJjZV9kZWJ1Z19kdW1wKGZkKTsKLSAgYnRpZl9hMmRwX3NpbmtfZGVidWdfZHVtcChmZCk7Ci0gIGJ0aWZfYTJkcF9jb2RlY19kZWJ1Z19kdW1wKGZkKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfYTJkcF9jb250cm9sLmNjIGIvYnRpZi9zcmMvYnRpZl9hMmRwX2NvbnRyb2wuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzY2JhZTQuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9hMmRwX2NvbnRyb2wuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9hMmRwX2NvbnRyb2wiCi0KLSNpbmNsdWRlICJidGlmX2EyZHBfY29udHJvbC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaCIKLSNpbmNsdWRlICJidGlmX2EyZHAuaCIKLSNpbmNsdWRlICJidGlmX2EyZHBfc2luay5oIgotI2luY2x1ZGUgImJ0aWZfYTJkcF9zb3VyY2UuaCIKLSNpbmNsdWRlICJidGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZl9hdl9jby5oIgotI2luY2x1ZGUgImJ0aWZfaGYuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotI2luY2x1ZGUgInVpcGMuaCIKLQotI2RlZmluZSBBMkRQX0RBVEFfUkVBRF9QT0xMX01TIDEwCi0KLXN0cnVjdCB7Ci0gIHVpbnQ2NF90IHRvdGFsX2J5dGVzX3JlYWQgPSAwOwotICB1aW50MTZfdCBhdWRpb19kZWxheSA9IDA7Ci0gIHN0cnVjdCB0aW1lc3BlYyB0aW1lc3RhbXAgPSB7fTsKLX0gZGVsYXlfcmVwb3J0X3N0YXRzOwotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfZGF0YV9jYih0VUlQQ19DSF9JRCBjaF9pZCwgdFVJUENfRVZFTlQgZXZlbnQpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX2N0cmxfY2IodFVJUENfQ0hfSUQgY2hfaWQsIHRVSVBDX0VWRU5UIGV2ZW50KTsKLQotLyogV2UgY2FuIGhhdmUgbWF4IG9uZSBjb21tYW5kIHBlbmRpbmcgKi8KLXN0YXRpYyB0QTJEUF9DVFJMX0NNRCBhMmRwX2NtZF9wZW5kaW5nID0gQTJEUF9DVFJMX0NNRF9OT05FOwotc3RkOjp1bmlxdWVfcHRyPHRVSVBDX1NUQVRFPiBhMmRwX3VpcGMgPSBudWxscHRyOwotCi12b2lkIGJ0aWZfYTJkcF9jb250cm9sX2luaXQodm9pZCkgewotICBhMmRwX3VpcGMgPSBVSVBDX0luaXQoKTsKLSAgVUlQQ19PcGVuKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwgYnRpZl9hMmRwX2N0cmxfY2IsIEEyRFBfQ1RSTF9QQVRIKTsKLX0KLQotdm9pZCBidGlmX2EyZHBfY29udHJvbF9jbGVhbnVwKHZvaWQpIHsKLSAgLyogVGhpcyBjYWxscyBibG9ja3MgdW50aWwgVUlQQyBpcyBmdWxseSBjbG9zZWQgKi8KLSAgaWYgKGEyZHBfdWlwYyAhPSBudWxscHRyKSB7Ci0gICAgVUlQQ19DbG9zZSgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FMTCk7Ci0gIH0KLX0KLQotc3RhdGljIHRBMkRQX0NUUkxfQUNLIGJ0aWZfYTJkcF9jb250cm9sX29uX2NoZWNrX3JlYWR5KCkgewotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9tZWRpYV90YXNrX2lzX3NodXR0aW5nX2Rvd24oKSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIiVzOiBBMkRQIGNvbW1hbmQgY2hlY2sgcmVhZHkgd2hpbGUgbWVkaWEgdGFzayBzaHV0dGluZyBkb3duIiwKLSAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBBMkRQX0NUUkxfQUNLX0ZBSUxVUkU7Ci0gIH0KLQotICAvKiBjaGVjayB3aGV0aGVyIEFWIGlzIHJlYWR5IHRvIHNldHVwIEEyRFAgZGF0YXBhdGggKi8KLSAgaWYgKGJ0aWZfYXZfc3RyZWFtX3JlYWR5KCkgfHwgYnRpZl9hdl9zdHJlYW1fc3RhcnRlZF9yZWFkeSgpKSB7Ci0gICAgcmV0dXJuIEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICIlczogQTJEUCBjb21tYW5kIGNoZWNrIHJlYWR5IHdoaWxlIEFWIHN0cmVhbSBpcyBub3QgcmVhZHkiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRTsKLSAgfQotfQotCi1zdGF0aWMgdEEyRFBfQ1RSTF9BQ0sgYnRpZl9hMmRwX2NvbnRyb2xfb25fc3RhcnQoKSB7Ci0gIC8qCi0gICAqIERvbid0IHNlbmQgU1RBUlQgcmVxdWVzdCB0byBzdGFjayB3aGlsZSB3ZSBhcmUgaW4gYSBjYWxsLgotICAgKiBTb21lIGhlYWRzZXRzIHN1Y2ggYXMgIlNvbnkgTVc2MDAiLCBkb24ndCBhbGxvdyBBVkRUUCBTVEFSVAotICAgKiB3aGlsZSBpbiBhIGNhbGwsIGFuZCByZXNwb25kIHdpdGggQkFEX1NUQVRFLgotICAgKi8KLSAgaWYgKCFibHVldG9vdGg6OmhlYWRzZXQ6OklzQ2FsbElkbGUoKSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEEyRFAgY29tbWFuZCBzdGFydCB3aGlsZSBjYWxsIHN0YXRlIGlzIGJ1c3kiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEEyRFBfQ1RSTF9BQ0tfSU5DQUxMX0ZBSUxVUkU7Ci0gIH0KLQotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9pc19zdHJlYW1pbmcoKSkgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IEEyRFAgY29tbWFuZCBzdGFydCB3aGlsZSBzb3VyY2UgaXMgc3RyZWFtaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBBMkRQX0NUUkxfQUNLX0ZBSUxVUkU7Ci0gIH0KLQotICBpZiAoYnRpZl9hdl9zdHJlYW1fcmVhZHkoKSkgewotICAgIC8qIFNldHVwIGF1ZGlvIGRhdGEgY2hhbm5lbCBsaXN0ZW5lciAqLwotICAgIFVJUENfT3BlbigqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBidGlmX2EyZHBfZGF0YV9jYiwKLSAgICAgICAgICAgICAgQTJEUF9EQVRBX1BBVEgpOwotCi0gICAgLyoKLSAgICAgKiBQb3N0IHN0YXJ0IGV2ZW50IGFuZCB3YWl0IGZvciBhdWRpbyBwYXRoIHRvIG9wZW4uCi0gICAgICogSWYgd2UgYXJlIHRoZSBzb3VyY2UsIHRoZSBBQ0sgd2lsbCBiZSBzZW50IGFmdGVyIHRoZSBzdGFydAotICAgICAqIHByb2NlZHVyZSBpcyBjb21wbGV0ZWQsIG90aGV3aXNlIHNlbmQgaXQgbm93LgotICAgICAqLwotICAgIGJ0aWZfYXZfc3RyZWFtX3N0YXJ0KCk7Ci0gICAgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NSQykgcmV0dXJuIEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgfQotCi0gIGlmIChidGlmX2F2X3N0cmVhbV9zdGFydGVkX3JlYWR5KCkpIHsKLSAgICAvKgotICAgICAqIEFscmVhZHkgc3RhcnRlZCwgc2V0dXAgYXVkaW8gZGF0YSBjaGFubmVsIGxpc3RlbmVyIGFuZCBBQ0sKLSAgICAgKiBiYWNrIGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIFVJUENfT3BlbigqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBidGlmX2EyZHBfZGF0YV9jYiwKLSAgICAgICAgICAgICAgQTJEUF9EQVRBX1BBVEgpOwotICAgIHJldHVybiBBMkRQX0NUUkxfQUNLX1NVQ0NFU1M7Ci0gIH0KLSAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogQTJEUCBjb21tYW5kIHN0YXJ0IHdoaWxlIEFWIHN0cmVhbSBpcyBub3QgcmVhZHkiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICByZXR1cm4gQTJEUF9DVFJMX0FDS19GQUlMVVJFOwotfQotCi1zdGF0aWMgdEEyRFBfQ1RSTF9BQ0sgYnRpZl9hMmRwX2NvbnRyb2xfb25fc3RvcCgpIHsKLSAgaWYgKGJ0aWZfYXZfZ2V0X3BlZXJfc2VwKCkgPT0gQVZEVF9UU0VQX1NOSyAmJgotICAgICAgIWJ0aWZfYTJkcF9zb3VyY2VfaXNfc3RyZWFtaW5nKCkpIHsKLSAgICAvKiBXZSBhcmUgYWxyZWFkeSBzdG9wcGVkLCBqdXN0IGFjayBiYWNrICovCi0gICAgcmV0dXJuIEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgfQotICBidGlmX2F2X3N0cmVhbV9zdG9wKFJhd0FkZHJlc3M6OmtFbXB0eSk7Ci0gIHJldHVybiBBMkRQX0NUUkxfQUNLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9jb250cm9sX29uX3N1c3BlbmQoKSB7Ci0gIC8qIExvY2FsIHN1c3BlbmQgKi8KLSAgaWYgKGJ0aWZfYXZfc3RyZWFtX3N0YXJ0ZWRfcmVhZHkoKSkgewotICAgIGJ0aWZfYXZfc3RyZWFtX3N1c3BlbmQoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogSWYgd2UgYXJlIG5vdCBpbiBzdGFydGVkIHN0YXRlLCBqdXN0IGFjayBiYWNrIG9rIGFuZCBsZXQKLSAgICogYXVkaW9mbGluZ2VyIGNsb3NlIHRoZSBjaGFubmVsLiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgYXJlCi0gICAqIHJlbW90ZWx5IHN1c3BlbmRlZCwgY2xlYXIgUkVNT1RFIFNVU1BFTkQgZmxhZy4KLSAgICovCi0gIGJ0aWZfYXZfY2xlYXJfcmVtb3RlX3N1c3BlbmRfZmxhZygpOwotICBidGlmX2EyZHBfY29tbWFuZF9hY2soQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX2NvbnRyb2xfb25fZ2V0X2lucHV0X2F1ZGlvX2NvbmZpZygpIHsKLSAgdEEyRFBfU0FNUExFX1JBVEUgc2FtcGxlX3JhdGUgPSBidGlmX2EyZHBfc2lua19nZXRfc2FtcGxlX3JhdGUoKTsKLSAgdEEyRFBfQ0hBTk5FTF9DT1VOVCBjaGFubmVsX2NvdW50ID0gYnRpZl9hMmRwX3NpbmtfZ2V0X2NoYW5uZWxfY291bnQoKTsKLQotICBidGlmX2EyZHBfY29tbWFuZF9hY2soQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgVUlQQ19TZW5kKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwgMCwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzYW1wbGVfcmF0ZSksCi0gICAgICAgICAgICBzaXplb2YodEEyRFBfU0FNUExFX1JBVEUpKTsKLSAgVUlQQ19TZW5kKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwgMCwgJmNoYW5uZWxfY291bnQsCi0gICAgICAgICAgICBzaXplb2YodEEyRFBfQ0hBTk5FTF9DT1VOVCkpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfY29udHJvbF9vbl9nZXRfb3V0cHV0X2F1ZGlvX2NvbmZpZygpIHsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICBjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotICBjb2RlY19jYXBhYmlsaXR5LnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gIGNvZGVjX2NhcGFiaWxpdHkuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICBjb2RlY19jYXBhYmlsaXR5LmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLQotICBBMmRwQ29kZWNDb25maWcqIGN1cnJlbnRfY29kZWMgPSBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYygpOwotICBpZiAoY3VycmVudF9jb2RlYyAhPSBudWxscHRyKSB7Ci0gICAgY29kZWNfY29uZmlnID0gY3VycmVudF9jb2RlYy0+Z2V0Q29kZWNDb25maWcoKTsKLSAgICBjb2RlY19jYXBhYmlsaXR5ID0gY3VycmVudF9jb2RlYy0+Z2V0Q29kZWNDYXBhYmlsaXR5KCk7Ci0gIH0KLQotICBidGlmX2EyZHBfY29tbWFuZF9hY2soQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgLy8gU2VuZCB0aGUgY3VycmVudCBjb2RlYyBjb25maWcKLSAgVUlQQ19TZW5kKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwgMCwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZjb2RlY19jb25maWcuc2FtcGxlX3JhdGUpLAotICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSk7Ci0gIFVJUENfU2VuZCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSksCi0gICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90KSk7Ci0gIFVJUENfU2VuZCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSksCi0gICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSk7Ci0gIC8vIFNlbmQgdGhlIGN1cnJlbnQgY29kZWMgY2FwYWJpbGl0eQotICBVSVBDX1NlbmQoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJmNvZGVjX2NhcGFiaWxpdHkuc2FtcGxlX3JhdGUpLAotICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSk7Ci0gIFVJUENfU2VuZCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmY29kZWNfY2FwYWJpbGl0eS5iaXRzX3Blcl9zYW1wbGUpLAotICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCkpOwotICBVSVBDX1NlbmQoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJmNvZGVjX2NhcGFiaWxpdHkuY2hhbm5lbF9tb2RlKSwKLSAgICAgICAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX2NvbnRyb2xfb25fc2V0X291dHB1dF9hdWRpb19jb25maWcoKSB7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWc7Ci0gIGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICBjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotCi0gIGJ0aWZfYTJkcF9jb21tYW5kX2FjayhBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAvLyBTZW5kIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZwotICBpZiAoVUlQQ19SZWFkKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QpKSAhPQotICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90KSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciByZWFkaW5nIHNhbXBsZSByYXRlIGZyb20gYXVkaW8gSEFMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoVUlQQ19SZWFkKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSksCi0gICAgICAgICAgICAgICAgc2l6ZW9mKGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCkpICE9Ci0gICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90KSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciByZWFkaW5nIGJpdHMgcGVyIHNhbXBsZSBmcm9tIGF1ZGlvIEhBTCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChVSVBDX1JlYWQoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KSkgIT0KLSAgICAgIHNpemVvZihidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QpKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IEVycm9yIHJlYWRpbmcgY2hhbm5lbCBtb2RlIGZyb20gYXVkaW8gSEFMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBBMkRQX0NUUkxfU0VUX09VVFBVVF9BVURJT19DT05GSUc6ICIKLSAgICAgICJzYW1wbGVfcmF0ZT0weCV4IGJpdHNfcGVyX3NhbXBsZT0weCV4ICIKLSAgICAgICJjaGFubmVsX21vZGU9MHgleCIsCi0gICAgICBfX2Z1bmNfXywgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlLCBjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlLAotICAgICAgY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfZmVlZGluZ191cGRhdGVfcmVxKGNvZGVjX2NvbmZpZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9jb250cm9sX29uX2dldF9wcmVzZW50YXRpb25fcG9zaXRpb24oKSB7Ci0gIGJ0aWZfYTJkcF9jb21tYW5kX2FjayhBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotCi0gIFVJUENfU2VuZCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsCi0gICAgICAgICAgICAodWludDhfdCopJihkZWxheV9yZXBvcnRfc3RhdHMudG90YWxfYnl0ZXNfcmVhZCksIHNpemVvZih1aW50NjRfdCkpOwotICBVSVBDX1NlbmQoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLAotICAgICAgICAgICAgKHVpbnQ4X3QqKSYoZGVsYXlfcmVwb3J0X3N0YXRzLmF1ZGlvX2RlbGF5KSwgc2l6ZW9mKHVpbnQxNl90KSk7Ci0KLSAgdWludDMyX3Qgc2Vjb25kcyA9IGRlbGF5X3JlcG9ydF9zdGF0cy50aW1lc3RhbXAudHZfc2VjOwotICBVSVBDX1NlbmQoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMLCAwLCAodWludDhfdCopJnNlY29uZHMsCi0gICAgICAgICAgICBzaXplb2Yoc2Vjb25kcykpOwotCi0gIHVpbnQzMl90IG5zZWMgPSBkZWxheV9yZXBvcnRfc3RhdHMudGltZXN0YW1wLnR2X25zZWM7Ci0gIFVJUENfU2VuZCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0NUUkwsIDAsICh1aW50OF90KikmbnNlYywgc2l6ZW9mKG5zZWMpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3JlY3ZfY3RybF9kYXRhKHZvaWQpIHsKLSAgdEEyRFBfQ1RSTF9DTUQgY21kID0gQTJEUF9DVFJMX0NNRF9OT05FOwotICBpbnQgbjsKLQotICB1aW50OF90IHJlYWRfY21kID0gMDsgLyogVGhlIHJlYWQgY29tbWFuZCBzaXplIGlzIG9uZSBvY3RldCAqLwotICBuID0gVUlQQ19SZWFkKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwgJnJlYWRfY21kLCAxKTsKLSAgY21kID0gc3RhdGljX2Nhc3Q8dEEyRFBfQ1RSTF9DTUQ+KHJlYWRfY21kKTsKLQotICAvKiBkZXRhY2ggb24gY3RybCBjaGFubmVsIG1lYW5zIGF1ZGlvZmxpbmdlciBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkICovCi0gIGlmIChuID09IDApIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBDVFJMIENIIERFVEFDSEVEIiwgX19mdW5jX18pOwotICAgIFVJUENfQ2xvc2UoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBEb24ndCBsb2cgQTJEUF9DVFJMX0dFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04gYnkgZGVmYXVsdCwgYmVjYXVzZSBpdAotICAvLyBjb3VsZCBiZSB2ZXJ5IGNoYXR0eSB3aGVuIGF1ZGlvIGlzIHN0cmVhbWluZy4KLSAgaWYgKGNtZCA9PSBBMkRQX0NUUkxfR0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBhMmRwLWN0cmwtY21kIDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2EyZHBfaHdfZHVtcF9jdHJsX2V2ZW50KGNtZCkpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IGEyZHAtY3RybC1jbWQgOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudChjbWQpKTsKLSAgfQotCi0gIGEyZHBfY21kX3BlbmRpbmcgPSBjbWQ7Ci0gIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBBMkRQX0NUUkxfQ01EX0NIRUNLX1JFQURZOgotICAgICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKGJ0aWZfYTJkcF9jb250cm9sX29uX2NoZWNrX3JlYWR5KCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEEyRFBfQ1RSTF9DTURfU1RBUlQ6Ci0gICAgICBidGlmX2EyZHBfY29tbWFuZF9hY2soYnRpZl9hMmRwX2NvbnRyb2xfb25fc3RhcnQoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQTJEUF9DVFJMX0NNRF9TVE9QOgotICAgICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKGJ0aWZfYTJkcF9jb250cm9sX29uX3N0b3AoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQTJEUF9DVFJMX0NNRF9TVVNQRU5EOgotICAgICAgYnRpZl9hMmRwX2NvbnRyb2xfb25fc3VzcGVuZCgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEEyRFBfQ1RSTF9HRVRfSU5QVVRfQVVESU9fQ09ORklHOgotICAgICAgYnRpZl9hMmRwX2NvbnRyb2xfb25fZ2V0X2lucHV0X2F1ZGlvX2NvbmZpZygpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEEyRFBfQ1RSTF9HRVRfT1VUUFVUX0FVRElPX0NPTkZJRzoKLSAgICAgIGJ0aWZfYTJkcF9jb250cm9sX29uX2dldF9vdXRwdXRfYXVkaW9fY29uZmlnKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQTJEUF9DVFJMX1NFVF9PVVRQVVRfQVVESU9fQ09ORklHOgotICAgICAgYnRpZl9hMmRwX2NvbnRyb2xfb25fc2V0X291dHB1dF9hdWRpb19jb25maWcoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBMkRQX0NUUkxfR0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTjoKLSAgICAgIGJ0aWZfYTJkcF9jb250cm9sX29uX2dldF9wcmVzZW50YXRpb25fcG9zaXRpb24oKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBVTlNVUFBPUlRFRCBDTUQgKCVkKSIsIF9fZnVuY19fLCBjbWQpOwotICAgICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIERvbid0IGxvZyBBMkRQX0NUUkxfR0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiBieSBkZWZhdWx0LCBiZWNhdXNlIGl0Ci0gIC8vIGNvdWxkIGJlIHZlcnkgY2hhdHR5IHdoZW4gYXVkaW8gaXMgc3RyZWFtaW5nLgotICBpZiAoY21kID09IEEyRFBfQ1RSTF9HRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGEyZHAtY3RybC1jbWQgOiAlcyBET05FIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudChjbWQpKTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBhMmRwLWN0cmwtY21kIDogJXMgRE9ORSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudChjbWQpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfY3RybF9jYihVTlVTRURfQVRUUiB0VUlQQ19DSF9JRCBjaF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRVSVBDX0VWRU5UIGV2ZW50KSB7Ci0gIC8vIERvbid0IGxvZyBVSVBDX1JYX0RBVEFfUkVBRFlfRVZUIGJ5IGRlZmF1bHQsIGJlY2F1c2UgaXQKLSAgLy8gY291bGQgYmUgdmVyeSBjaGF0dHkgd2hlbiBhdWRpbyBpcyBzdHJlYW1pbmcuCi0gIGlmIChldmVudCA9PSBVSVBDX1JYX0RBVEFfUkVBRFlfRVZUKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IEEyRFAtQ1RSTC1DSEFOTkVMIEVWRU5UICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBkdW1wX3VpcGNfZXZlbnQoZXZlbnQpKTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBBMkRQLUNUUkwtQ0hBTk5FTCBFVkVOVCAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBkdW1wX3VpcGNfZXZlbnQoZXZlbnQpKTsKLSAgfQotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFVJUENfT1BFTl9FVlQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVUlQQ19DTE9TRV9FVlQ6Ci0gICAgICAvKiByZXN0YXJ0IGN0cmwgc2VydmVyIHVubGVzcyB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLwotICAgICAgaWYgKGJ0aWZfYTJkcF9zb3VyY2VfbWVkaWFfdGFza19pc19ydW5uaW5nKCkpCi0gICAgICAgIFVJUENfT3BlbigqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0NUUkwsIGJ0aWZfYTJkcF9jdHJsX2NiLAotICAgICAgICAgICAgICAgICAgQTJEUF9DVFJMX1BBVEgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFVJUENfUlhfREFUQV9SRUFEWV9FVlQ6Ci0gICAgICBidGlmX2EyZHBfcmVjdl9jdHJsX2RhdGEoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiAjIyMgQTJEUC1DVFJMLUNIQU5ORUwgRVZFTlQgJWQgTk9UIEhBTkRMRUQgIyMjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9kYXRhX2NiKFVOVVNFRF9BVFRSIHRVSVBDX0NIX0lEIGNoX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFVJUENfRVZFTlQgZXZlbnQpIHsKLSAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogQlRJRiBNRURJQSAoQTJEUC1EQVRBKSBFVkVOVCAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgZHVtcF91aXBjX2V2ZW50KGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgVUlQQ19PUEVOX0VWVDoKLSAgICAgIC8qCi0gICAgICAgKiBSZWFkIGRpcmVjdGx5IGZyb20gbWVkaWEgdGFzayBmcm9tIGhlcmUgb24gKGtlZXAgY2FsbGJhY2sgZm9yCi0gICAgICAgKiBjb25uZWN0aW9uIGV2ZW50cy4KLSAgICAgICAqLwotICAgICAgVUlQQ19Jb2N0bCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLAotICAgICAgICAgICAgICAgICBVSVBDX1JFR19SRU1PVkVfQUNUSVZFX1JFQURTRVQsIE5VTEwpOwotICAgICAgVUlQQ19Jb2N0bCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBVSVBDX1NFVF9SRUFEX1BPTExfVE1PLAotICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihBMkRQX0RBVEFfUkVBRF9QT0xMX01TKSk7Ci0KLSAgICAgIGlmIChidGlmX2F2X2dldF9wZWVyX3NlcCgpID09IEFWRFRfVFNFUF9TTkspIHsKLSAgICAgICAgLyogU3RhcnQgdGhlIG1lZGlhIHRhc2sgdG8gZW5jb2RlIHRoZSBhdWRpbyAqLwotICAgICAgICBidGlmX2EyZHBfc291cmNlX3N0YXJ0X2F1ZGlvX3JlcSgpOwotICAgICAgfQotCi0gICAgICAvKiBBQ0sgYmFjayB3aGVuIG1lZGlhIHRhc2sgaXMgZnVsbHkgc3RhcnRlZCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFVJUENfQ0xPU0VfRVZUOgotICAgICAgQVBQTF9UUkFDRV9FVkVOVCgiJXM6ICMjIEFVRElPIFBBVEggREVUQUNIRUQgIyMiLCBfX2Z1bmNfXyk7Ci0gICAgICBidGlmX2EyZHBfY29tbWFuZF9hY2soQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgIC8qCi0gICAgICAgKiBTZW5kIHN0b3AgcmVxdWVzdCBvbmx5IGlmIHdlIGFyZSBhY3RpdmVseSBzdHJlYW1pbmcgYW5kIGhhdmVuJ3QKLSAgICAgICAqIHJlY2VpdmVkIGEgc3RvcCByZXF1ZXN0LiBQb3RlbnRpYWxseSwgdGhlIGF1ZGlvZmxpbmdlciBkZXRhY2hlZAotICAgICAgICogYWJub3JtYWxseS4KLSAgICAgICAqLwotICAgICAgaWYgKGJ0aWZfYTJkcF9zb3VyY2VfaXNfc3RyZWFtaW5nKCkpIHsKLSAgICAgICAgLyogUG9zdCBzdG9wIGV2ZW50IGFuZCB3YWl0IGZvciBhdWRpbyBwYXRoIHRvIHN0b3AgKi8KLSAgICAgICAgYnRpZl9hdl9zdHJlYW1fc3RvcChSYXdBZGRyZXNzOjprRW1wdHkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6ICMjIyBBMkRQLURBVEEgRVZFTlQgJWQgTk9UIEhBTkRMRUQgIyMjIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKHRBMkRQX0NUUkxfQUNLIHN0YXR1cykgewotICB1aW50OF90IGFjayA9IHN0YXR1czsKLQotICAvLyBEb24ndCBsb2cgQTJEUF9DVFJMX0dFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04gYnkgZGVmYXVsdCwgYmVjYXVzZSBpdAotICAvLyBjb3VsZCBiZSB2ZXJ5IGNoYXR0eSB3aGVuIGF1ZGlvIGlzIHN0cmVhbWluZy4KLSAgaWYgKGEyZHBfY21kX3BlbmRpbmcgPT0gQTJEUF9DVFJMX0dFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04pIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogIyMgYTJkcCBhY2sgOiAlcywgc3RhdHVzICVkICMjIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBhdWRpb19hMmRwX2h3X2R1bXBfY3RybF9ldmVudChhMmRwX2NtZF9wZW5kaW5nKSwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiAjIyBhMmRwIGFjayA6ICVzLCBzdGF0dXMgJWQgIyMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYTJkcF9od19kdW1wX2N0cmxfZXZlbnQoYTJkcF9jbWRfcGVuZGluZyksIHN0YXR1cyk7Ci0gIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgKi8KLSAgaWYgKGEyZHBfY21kX3BlbmRpbmcgPT0gQTJEUF9DVFJMX0NNRF9OT05FKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHdhcm5pbmcgOiBubyBjb21tYW5kIHBlbmRpbmcsIGlnbm9yZSBhY2siLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2xlYXIgcGVuZGluZyAqLwotICBhMmRwX2NtZF9wZW5kaW5nID0gQTJEUF9DVFJMX0NNRF9OT05FOwotCi0gIC8qIEFja25vd2xlZGdlIHN0YXJ0IHJlcXVlc3QgKi8KLSAgaWYgKGEyZHBfdWlwYyAhPSBudWxscHRyKSB7Ci0gICAgVUlQQ19TZW5kKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQ1RSTCwgMCwgJmFjaywgc2l6ZW9mKGFjaykpOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX2NvbnRyb2xfbG9nX2J5dGVzX3JlYWQodWludDMyX3QgYnl0ZXNfcmVhZCkgewotICBkZWxheV9yZXBvcnRfc3RhdHMudG90YWxfYnl0ZXNfcmVhZCArPSBieXRlc19yZWFkOwotICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmRlbGF5X3JlcG9ydF9zdGF0cy50aW1lc3RhbXApOwotfQotCi12b2lkIGJ0aWZfYTJkcF9jb250cm9sX3NldF9hdWRpb19kZWxheSh1aW50MTZfdCBkZWxheSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogREVMQVk6ICUuMWYgbXMiLCBfX2Z1bmNfXywgKGZsb2F0KWRlbGF5IC8gMTApOwotICBkZWxheV9yZXBvcnRfc3RhdHMuYXVkaW9fZGVsYXkgPSBkZWxheTsKLX0KLQotdm9pZCBidGlmX2EyZHBfY29udHJvbF9yZXNldF9hdWRpb19kZWxheSh2b2lkKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBkZWxheV9yZXBvcnRfc3RhdHMuYXVkaW9fZGVsYXkgPSAwOwotICBkZWxheV9yZXBvcnRfc3RhdHMudG90YWxfYnl0ZXNfcmVhZCA9IDA7Ci0gIGRlbGF5X3JlcG9ydF9zdGF0cy50aW1lc3RhbXAgPSB7fTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfYTJkcF9zaW5rLmNjIGIvYnRpZi9zcmMvYnRpZl9hMmRwX3NpbmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTk2NWEuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9hMmRwX3NpbmsuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9hMmRwX3NpbmsiCi0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hMmRwX3NpbmsuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXZfY28uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hdnJjcF9hdWRpb190cmFjay5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3V0aWwuaCIgIC8vIENBU0VfUkVUVVJOX1NUUgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQ7Ci11c2luZyBMb2NrR3VhcmQgPSBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD47Ci0KLS8qKgotICogVGhlIHJlY2VpdmluZyBxdWV1ZSBidWZmZXIgc2l6ZS4KLSAqLwotI2RlZmluZSBNQVhfSU5QVVRfQTJEUF9GUkFNRV9RVUVVRV9TWiAoTUFYX1BDTV9GUkFNRV9OVU1fUEVSX1RJQ0sgKiAyKQotCi0jZGVmaW5lIEJUSUZfU0lOS19NRURJQV9USU1FX1RJQ0tfTVMgMjAKLQotLyogSW4gY2FzZSBvZiBBMkRQIFNpbmssIHdlIHdpbGwgZGVsYXkgc3RhcnQgYnkgNSBBVkRUUCBQYWNrZXRzICovCi0jZGVmaW5lIE1BWF9BMkRQX0RFTEFZRURfU1RBUlRfRlJBTUVfQ09VTlQgNQotCi1lbnVtIHsKLSAgQlRJRl9BMkRQX1NJTktfU1RBVEVfT0ZGLAotICBCVElGX0EyRFBfU0lOS19TVEFURV9TVEFSVElOR19VUCwKLSAgQlRJRl9BMkRQX1NJTktfU1RBVEVfUlVOTklORywKLSAgQlRJRl9BMkRQX1NJTktfU1RBVEVfU0hVVFRJTkdfRE9XTgotfTsKLQotLyogQlRJRiBNZWRpYSBTaW5rIGNvbW1hbmQgZXZlbnQgZGVmaW5pdGlvbiAqLwotZW51bSB7Ci0gIEJUSUZfTUVESUFfU0lOS19ERUNPREVSX1VQREFURSA9IDEsCi0gIEJUSUZfTUVESUFfU0lOS19DTEVBUl9UUkFDSywKLSAgQlRJRl9NRURJQV9TSU5LX1NFVF9GT0NVU19TVEFURSwKLSAgQlRJRl9NRURJQV9TSU5LX0FVRElPX1JYX0ZMVVNILAotICBCVElGX01FRElBX1NJTktfU1RBUlQsCi0gIEJUSUZfTUVESUFfU0lOS19TVVNQRU5ECi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIHVpbnQ4X3QgY29kZWNfaW5mb1tBVkRUX0NPREVDX1NJWkVdOwotfSB0QlRJRl9NRURJQV9TSU5LX0RFQ09ERVJfVVBEQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUl9SSUdJRCBoZHI7Ci0gIGJ0aWZfYTJkcF9zaW5rX2ZvY3VzX3N0YXRlX3QgZm9jdXNfc3RhdGU7Ci19IHRCVElGX01FRElBX1NJTktfRk9DVVNfVVBEQVRFOwotCi0vKiBCVElGIEEyRFAgU2luayBjb250cm9sIGJsb2NrICovCi1jbGFzcyBCdGlmQTJkcFNpbmtDb250cm9sQmxvY2sgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQnRpZkEyZHBTaW5rQ29udHJvbEJsb2NrKGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlYWRfbmFtZSkKLSAgICAgIDogd29ya2VyX3RocmVhZCh0aHJlYWRfbmFtZSksCi0gICAgICAgIHJ4X2F1ZGlvX3F1ZXVlKG51bGxwdHIpLAotICAgICAgICByeF9mbHVzaChmYWxzZSksCi0gICAgICAgIGRlY29kZV9hbGFybShudWxscHRyKSwKLSAgICAgICAgc2FtcGxlX3JhdGUoMCksCi0gICAgICAgIGNoYW5uZWxfY291bnQoMCksCi0gICAgICAgIHJ4X2ZvY3VzX3N0YXRlKEJUSUZfQTJEUF9TSU5LX0ZPQ1VTX05PVF9HUkFOVEVEKSwKLSAgICAgICAgYXVkaW9fdHJhY2sobnVsbHB0ciksCi0gICAgICAgIGRlY29kZXJfaW50ZXJmYWNlKG51bGxwdHIpIHt9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBpZiAoYXVkaW9fdHJhY2sgIT0gbnVsbHB0cikgewotICAgICAgQnRpZkF2cmNwQXVkaW9UcmFja1N0b3AoYXVkaW9fdHJhY2spOwotICAgICAgQnRpZkF2cmNwQXVkaW9UcmFja0RlbGV0ZShhdWRpb190cmFjayk7Ci0gICAgfQotICAgIGF1ZGlvX3RyYWNrID0gbnVsbHB0cjsKLSAgICBmaXhlZF9xdWV1ZV9mcmVlKHJ4X2F1ZGlvX3F1ZXVlLCBudWxscHRyKTsKLSAgICByeF9hdWRpb19xdWV1ZSA9IG51bGxwdHI7Ci0gICAgYWxhcm1fZnJlZShkZWNvZGVfYWxhcm0pOwotICAgIGRlY29kZV9hbGFybSA9IG51bGxwdHI7Ci0gICAgcnhfZmx1c2ggPSBmYWxzZTsKLSAgICByeF9mb2N1c19zdGF0ZSA9IEJUSUZfQTJEUF9TSU5LX0ZPQ1VTX05PVF9HUkFOVEVEOwotICAgIHNhbXBsZV9yYXRlID0gMDsKLSAgICBjaGFubmVsX2NvdW50ID0gMDsKLSAgICBkZWNvZGVyX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBNZXNzYWdlTG9vcFRocmVhZCB3b3JrZXJfdGhyZWFkOwotICBmaXhlZF9xdWV1ZV90KiByeF9hdWRpb19xdWV1ZTsKLSAgYm9vbCByeF9mbHVzaDsgLyogZGlzY2FyZHMgYW55IGluY29taW5nIGRhdGEgd2hlbiB0cnVlICovCi0gIGFsYXJtX3QqIGRlY29kZV9hbGFybTsKLSAgdEEyRFBfU0FNUExFX1JBVEUgc2FtcGxlX3JhdGU7Ci0gIHRBMkRQX0JJVFNfUEVSX1NBTVBMRSBiaXRzX3Blcl9zYW1wbGU7Ci0gIHRBMkRQX0NIQU5ORUxfQ09VTlQgY2hhbm5lbF9jb3VudDsKLSAgYnRpZl9hMmRwX3NpbmtfZm9jdXNfc3RhdGVfdCByeF9mb2N1c19zdGF0ZTsgLyogYXVkaW8gZm9jdXMgc3RhdGUgKi8KLSAgdm9pZCogYXVkaW9fdHJhY2s7Ci0gIGNvbnN0IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFKiBkZWNvZGVyX2ludGVyZmFjZTsKLX07Ci0KLS8vIE11dGV4IGZvciBiZWxvdyBkYXRhIHN0cnVjdHVyZXMuCi1zdGF0aWMgc3RkOjptdXRleCBnX211dGV4OwotCi1zdGF0aWMgQnRpZkEyZHBTaW5rQ29udHJvbEJsb2NrIGJ0aWZfYTJkcF9zaW5rX2NiKCJidF9hMmRwX3Npbmtfd29ya2VyX3RocmVhZCIpOwotCi1zdGF0aWMgc3RkOjphdG9taWM8aW50PiBidGlmX2EyZHBfc2lua19zdGF0ZXtCVElGX0EyRFBfU0lOS19TVEFURV9PRkZ9OwotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19pbml0X2RlbGF5ZWQoKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX3N0YXJ0dXBfZGVsYXllZCgpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3Npbmtfc3RhcnRfc2Vzc2lvbl9kZWxheWVkKAotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfZW5kX3Nlc3Npb25fZGVsYXllZCgpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3Npbmtfc2h1dGRvd25fZGVsYXllZCgpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfY2xlYW51cF9kZWxheWVkKCk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19jb21tYW5kX3JlYWR5KEJUX0hEUl9SSUdJRCogcF9tc2cpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfYXVkaW9faGFuZGxlX3N0b3BfZGVjb2RpbmcoKTsKLXN0YXRpYyB2b2lkIGJ0aWZfZGVjb2RlX2FsYXJtX2NiKHZvaWQqIGNvbnRleHQpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfYXVkaW9faGFuZGxlX3N0YXJ0X2RlY29kaW5nKCk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19hdmtfaGFuZGxlX3RpbWVyKCk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19hdWRpb19yeF9mbHVzaF9yZXEoKTsKLS8qIEhhbmRsZSBpbmNvbWluZyBtZWRpYSBwYWNrZXRzIEEyRFAgU0lOSyBzdHJlYW1pbmcgKi8KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX2hhbmRsZV9pbmNfbWVkaWEoQlRfSERSKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19kZWNvZGVyX3VwZGF0ZV9ldmVudCgKLSAgICB0QlRJRl9NRURJQV9TSU5LX0RFQ09ERVJfVVBEQVRFKiBwX2J1Zik7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19jbGVhcl90cmFja19ldmVudCgpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3Npbmtfc2V0X2ZvY3VzX3N0YXRlX2V2ZW50KAotICAgIGJ0aWZfYTJkcF9zaW5rX2ZvY3VzX3N0YXRlX3Qgc3RhdGUpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfYXVkaW9fcnhfZmx1c2hfZXZlbnQoKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX2NsZWFyX3RyYWNrX2V2ZW50X3JlcSgpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3Npbmtfb25fc3RhcnRfZXZlbnQoKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX29uX3N1c3BlbmRfZXZlbnQoKTsKLQotVU5VU0VEX0FUVFIgc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBfbWVkaWFfZXZlbnQodWludDE2X3QgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX01FRElBX1NJTktfREVDT0RFUl9VUERBVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfTUVESUFfU0lOS19DTEVBUl9UUkFDSykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9NRURJQV9TSU5LX1NFVF9GT0NVU19TVEFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9NRURJQV9TSU5LX0FVRElPX1JYX0ZMVVNIKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX01FRElBX1NJTktfU1RBUlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfTUVESUFfU0lOS19TVVNQRU5EKQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gIlVOS05PV04gQTJEUCBTSU5LIEVWRU5UIjsKLX0KLQotYm9vbCBidGlmX2EyZHBfc2lua19pbml0KCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotCi0gIGlmIChidGlmX2EyZHBfc2lua19zdGF0ZSAhPSBCVElGX0EyRFBfU0lOS19TVEFURV9PRkYpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBBMkRQIFNpbmsgbWVkaWEgdGFzayBhbHJlYWR5IHJ1bm5pbmciLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnRpZl9hMmRwX3NpbmtfY2IuUmVzZXQoKTsKLSAgYnRpZl9hMmRwX3Npbmtfc3RhdGUgPSBCVElGX0EyRFBfU0lOS19TVEFURV9TVEFSVElOR19VUDsKLQotICAvKiBTdGFydCBBMkRQIFNpbmsgbWVkaWEgdGFzayAqLwotICBidGlmX2EyZHBfc2lua19jYi53b3JrZXJfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgaWYgKCFidGlmX2EyZHBfc2lua19jYi53b3JrZXJfdGhyZWFkLklzUnVubmluZygpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogdW5hYmxlIHRvIHN0YXJ0IHVwIG1lZGlhIHRocmVhZCIsIF9fZnVuY19fKTsKLSAgICBidGlmX2EyZHBfc2lua19zdGF0ZSA9IEJUSUZfQTJEUF9TSU5LX1NUQVRFX09GRjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBidGlmX2EyZHBfc2lua19jYi5yeF9hdWRpb19xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0KLSAgLyogU2NoZWR1bGUgdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdGlvbnMgKi8KLSAgaWYgKCFidGlmX2EyZHBfc2lua19jYi53b3JrZXJfdGhyZWFkLkVuYWJsZVJlYWxUaW1lU2NoZWR1bGluZygpKSB7Ci0jaWYgZGVmaW5lZChPU19BTkRST0lEKQotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IEZhaWxlZCB0byBpbmNyZWFzZSBBMkRQIGRlY29kZXIgdGhyZWFkIHByaW9yaXR5IjsKLSNlbmRpZgotICB9Ci0gIGJ0aWZfYTJkcF9zaW5rX2NiLndvcmtlcl90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9hMmRwX3NpbmtfaW5pdF9kZWxheWVkKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19pbml0X2RlbGF5ZWQoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgYnRpZl9hMmRwX3Npbmtfc3RhdGUgPSBCVElGX0EyRFBfU0lOS19TVEFURV9SVU5OSU5HOwotfQotCi1ib29sIGJ0aWZfYTJkcF9zaW5rX3N0YXJ0dXAoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2EyZHBfc2lua19zdGFydHVwX2RlbGF5ZWQpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX3N0YXJ0dXBfZGVsYXllZCgpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICBMb2NrR3VhcmQgbG9jayhnX211dGV4KTsKLSAgLy8gTm90aGluZyB0byBkbwotfQotCi1ib29sIGJ0aWZfYTJkcF9zaW5rX3N0YXJ0X3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHBlZXJfYWRkcmVzcz0iIDw8IHBlZXJfYWRkcmVzczsKLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX2NiLndvcmtlcl90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfYTJkcF9zaW5rX3N0YXJ0X3Nlc3Npb25fZGVsYXllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBjYW5ub3Qgc2V0IHByb21pc2UgYnV0IHRyaWdnZXJzIGNyYXNoCi0gICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyX2FkZHJlc3M9IiA8PCBwZWVyX2FkZHJlc3MKLSAgICAgICAgICAgICAgIDw8ICIgZmFpbHMgdG8gY29udGV4dCBzd2l0Y2giOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19zdGFydF9zZXNzaW9uX2RlbGF5ZWQoCi0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotICBwZWVyX3JlYWR5X3Byb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gIC8vIE5vdGhpbmcgdG8gZG8KLX0KLQotYm9vbCBidGlmX2EyZHBfc2lua19yZXN0YXJ0X3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgb2xkX3BlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIG5ld19wZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBvbGRfcGVlcl9hZGRyZXNzPSIgPDwgb2xkX3BlZXJfYWRkcmVzcwotICAgICAgICAgICAgPDwgIiBuZXdfcGVlcl9hZGRyZXNzPSIgPDwgbmV3X3BlZXJfYWRkcmVzczsKLQotICBDSEVDSyghbmV3X3BlZXJfYWRkcmVzcy5Jc0VtcHR5KCkpOwotCi0gIGlmICghb2xkX3BlZXJfYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBidGlmX2EyZHBfc2lua19lbmRfc2Vzc2lvbihvbGRfcGVlcl9hZGRyZXNzKTsKLSAgfQotCi0gIGlmICghYnRhX2F2X2NvX3NldF9hY3RpdmVfcGVlcihuZXdfcGVlcl9hZGRyZXNzKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IENhbm5vdCBzdHJlYW0gYXVkaW86IGNhbm5vdCBzZXQgYWN0aXZlIHBlZXIgdG8gIgotICAgICAgICAgICAgICAgPDwgbmV3X3BlZXJfYWRkcmVzczsKLSAgICBwZWVyX3JlYWR5X3Byb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG9sZF9wZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgYnRpZl9hMmRwX3Npbmtfc3RhcnR1cCgpOwotICB9Ci0gIGJ0aWZfYTJkcF9zaW5rX3N0YXJ0X3Nlc3Npb24obmV3X3BlZXJfYWRkcmVzcywgc3RkOjptb3ZlKHBlZXJfcmVhZHlfcHJvbWlzZSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYTJkcF9zaW5rX2VuZF9zZXNzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBMT0dfSU5GTygiJXM6IHBlZXJfYWRkcmVzcz0lcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2EyZHBfc2lua19lbmRfc2Vzc2lvbl9kZWxheWVkKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19lbmRfc2Vzc2lvbl9kZWxheWVkKCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotICAvLyBOb3RoaW5nIHRvIGRvCi19Ci0KLXZvaWQgYnRpZl9hMmRwX3Npbmtfc2h1dGRvd24oKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2EyZHBfc2lua19zaHV0ZG93bl9kZWxheWVkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX3NodXRkb3duX2RlbGF5ZWQoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0gIC8vIE5vdGhpbmcgdG8gZG8KLX0KLQotdm9pZCBidGlmX2EyZHBfc2lua19jbGVhbnVwKCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYWxhcm1fdCogZGVjb2RlX2FsYXJtOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgc2luayBpcyBzaHV0ZG93bgotICBidGlmX2EyZHBfc2lua19zaHV0ZG93bigpOwotCi0gIHsKLSAgICBMb2NrR3VhcmQgbG9jayhnX211dGV4KTsKLSAgICBpZiAoKGJ0aWZfYTJkcF9zaW5rX3N0YXRlID09IEJUSUZfQTJEUF9TSU5LX1NUQVRFX09GRikgfHwKLSAgICAgICAgKGJ0aWZfYTJkcF9zaW5rX3N0YXRlID09IEJUSUZfQTJEUF9TSU5LX1NUQVRFX1NIVVRUSU5HX0RPV04pKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIE1ha2Ugc3VyZSBubyBjaGFubmVscyBhcmUgcmVzdGFydGVkIHdoaWxlIHNodXR0aW5nIGRvd24KLSAgICBidGlmX2EyZHBfc2lua19zdGF0ZSA9IEJUSUZfQTJEUF9TSU5LX1NUQVRFX1NIVVRUSU5HX0RPV047Ci0KLSAgICBkZWNvZGVfYWxhcm0gPSBidGlmX2EyZHBfc2lua19jYi5kZWNvZGVfYWxhcm07Ci0gICAgYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2RlX2FsYXJtID0gbnVsbHB0cjsKLSAgfQotCi0gIC8vIFN0b3AgdGhlIHRpbWVyCi0gIGFsYXJtX2ZyZWUoZGVjb2RlX2FsYXJtKTsKLQotICAvLyBFeGl0IHRoZSB0aHJlYWQKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2EyZHBfc2lua19jbGVhbnVwX2RlbGF5ZWQpKTsKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5TaHV0RG93bigpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19jbGVhbnVwX2RlbGF5ZWQoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0KLSAgZml4ZWRfcXVldWVfZnJlZShidGlmX2EyZHBfc2lua19jYi5yeF9hdWRpb19xdWV1ZSwgbnVsbHB0cik7Ci0gIGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2F1ZGlvX3F1ZXVlID0gbnVsbHB0cjsKLSAgYnRpZl9hMmRwX3Npbmtfc3RhdGUgPSBCVElGX0EyRFBfU0lOS19TVEFURV9PRkY7Ci19Ci0KLXRBMkRQX1NBTVBMRV9SQVRFIGJ0aWZfYTJkcF9zaW5rX2dldF9zYW1wbGVfcmF0ZSgpIHsKLSAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0gIHJldHVybiBidGlmX2EyZHBfc2lua19jYi5zYW1wbGVfcmF0ZTsKLX0KLQotdEEyRFBfQklUU19QRVJfU0FNUExFIGJ0aWZfYTJkcF9zaW5rX2dldF9iaXRzX3Blcl9zYW1wbGUoKSB7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotICByZXR1cm4gYnRpZl9hMmRwX3NpbmtfY2IuYml0c19wZXJfc2FtcGxlOwotfQotCi10QTJEUF9DSEFOTkVMX0NPVU5UIGJ0aWZfYTJkcF9zaW5rX2dldF9jaGFubmVsX2NvdW50KCkgewotICBMb2NrR3VhcmQgbG9jayhnX211dGV4KTsKLSAgcmV0dXJuIGJ0aWZfYTJkcF9zaW5rX2NiLmNoYW5uZWxfY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX2NvbW1hbmRfcmVhZHkoQlRfSERSX1JJR0lEKiBwX21zZykgewotICBMT0dfVkVSQk9TRSgiJXM6IGV2ZW50ICVkICVzIiwgX19mdW5jX18sIHBfbXNnLT5ldmVudCwKLSAgICAgICAgICAgICAgZHVtcF9tZWRpYV9ldmVudChwX21zZy0+ZXZlbnQpKTsKLQotICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkgewotICAgIGNhc2UgQlRJRl9NRURJQV9TSU5LX0RFQ09ERVJfVVBEQVRFOgotICAgICAgYnRpZl9hMmRwX3NpbmtfZGVjb2Rlcl91cGRhdGVfZXZlbnQoCi0gICAgICAgICAgKHRCVElGX01FRElBX1NJTktfREVDT0RFUl9VUERBVEUqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9NRURJQV9TSU5LX0NMRUFSX1RSQUNLOgotICAgICAgYnRpZl9hMmRwX3NpbmtfY2xlYXJfdHJhY2tfZXZlbnQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9NRURJQV9TSU5LX1NFVF9GT0NVU19TVEFURTogewotICAgICAgYnRpZl9hMmRwX3NpbmtfZm9jdXNfc3RhdGVfdCBzdGF0ZSA9Ci0gICAgICAgICAgKCh0QlRJRl9NRURJQV9TSU5LX0ZPQ1VTX1VQREFURSopcF9tc2cpLT5mb2N1c19zdGF0ZTsKLSAgICAgIGJ0aWZfYTJkcF9zaW5rX3NldF9mb2N1c19zdGF0ZV9ldmVudChzdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVElGX01FRElBX1NJTktfQVVESU9fUlhfRkxVU0g6Ci0gICAgICBidGlmX2EyZHBfc2lua19hdWRpb19yeF9mbHVzaF9ldmVudCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVElGX01FRElBX1NJTktfU1RBUlQ6Ci0gICAgICBidGlmX2EyZHBfc2lua19vbl9zdGFydF9ldmVudCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVElGX01FRElBX1NJTktfU1VTUEVORDoKLSAgICAgIGJ0aWZfYTJkcF9zaW5rX29uX3N1c3BlbmRfZXZlbnQoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIiVzOiB1bmtub3duIGV2ZW50ICVkIiwgX19mdW5jX18sIHBfbXNnLT5ldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIG9zaV9mcmVlKHBfbXNnKTsKLSAgTE9HX1ZFUkJPU0UoIiVzOiAlcyBET05FIiwgX19mdW5jX18sIGR1bXBfbWVkaWFfZXZlbnQocF9tc2ctPmV2ZW50KSk7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NpbmtfdXBkYXRlX2RlY29kZXIoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgdEJUSUZfTUVESUFfU0lOS19ERUNPREVSX1VQREFURSogcF9idWYgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDx0QlRJRl9NRURJQV9TSU5LX0RFQ09ERVJfVVBEQVRFKj4oCi0gICAgICAgICAgb3NpX21hbGxvYyhzaXplb2YodEJUSUZfTUVESUFfU0lOS19ERUNPREVSX1VQREFURSkpKTsKLQotICBBUFBMX1RSQUNFX0VWRU5UKCIlczogcF9jb2RlY19pbmZvWyV4OiV4OiV4OiV4OiV4OiV4XSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfY29kZWNfaW5mb1sxXSwgcF9jb2RlY19pbmZvWzJdLCBwX2NvZGVjX2luZm9bM10sCi0gICAgICAgICAgICAgICAgICAgcF9jb2RlY19pbmZvWzRdLCBwX2NvZGVjX2luZm9bNV0sIHBfY29kZWNfaW5mb1s2XSk7Ci0KLSAgbWVtY3B5KHBfYnVmLT5jb2RlY19pbmZvLCBwX2NvZGVjX2luZm8sIEFWRFRfQ09ERUNfU0laRSk7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVElGX01FRElBX1NJTktfREVDT0RFUl9VUERBVEU7Ci0KLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoYnRpZl9hMmRwX3NpbmtfY29tbWFuZF9yZWFkeSwgKEJUX0hEUl9SSUdJRCopcF9idWYpKTsKLX0KLQotdm9pZCBidGlmX2EyZHBfc2lua19vbl9pZGxlKCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIEJUX0hEUl9SSUdJRCogcF9idWYgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxCVF9IRFJfUklHSUQqPihvc2lfbWFsbG9jKHNpemVvZihCVF9IRFJfUklHSUQpKSk7Ci0gIHBfYnVmLT5ldmVudCA9IEJUSUZfTUVESUFfU0lOS19TVVNQRU5EOwotICBidGlmX2EyZHBfc2lua19jYi53b3JrZXJfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfYTJkcF9zaW5rX2NvbW1hbmRfcmVhZHksIHBfYnVmKSk7Ci0KLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX3N0YXRlID09IEJUSUZfQTJEUF9TSU5LX1NUQVRFX09GRikgcmV0dXJuOwotICBidGlmX2EyZHBfc2lua19hdWRpb19oYW5kbGVfc3RvcF9kZWNvZGluZygpOwotICBidGlmX2EyZHBfc2lua19jbGVhcl90cmFja19ldmVudF9yZXEoKTsKLX0KLQotdm9pZCBidGlmX2EyZHBfc2lua19vbl9zdG9wcGVkKFVOVVNFRF9BVFRSIHRCVEFfQVZfU1VTUEVORCogcF9hdl9zdXNwZW5kKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9Ci0gICAgICByZWludGVycHJldF9jYXN0PEJUX0hEUl9SSUdJRCo+KG9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRJRl9NRURJQV9TSU5LX1NVU1BFTkQ7Ci0gIGJ0aWZfYTJkcF9zaW5rX2NiLndvcmtlcl90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9hMmRwX3NpbmtfY29tbWFuZF9yZWFkeSwgcF9idWYpKTsKLQotICBpZiAoYnRpZl9hMmRwX3Npbmtfc3RhdGUgPT0gQlRJRl9BMkRQX1NJTktfU1RBVEVfT0ZGKSByZXR1cm47Ci0gIGJ0aWZfYTJkcF9zaW5rX2F1ZGlvX2hhbmRsZV9zdG9wX2RlY29kaW5nKCk7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3Npbmtfb25fc3VzcGVuZGVkKFVOVVNFRF9BVFRSIHRCVEFfQVZfU1VTUEVORCogcF9hdl9zdXNwZW5kKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9Ci0gICAgICByZWludGVycHJldF9jYXN0PEJUX0hEUl9SSUdJRCo+KG9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRJRl9NRURJQV9TSU5LX1NVU1BFTkQ7Ci0gIGJ0aWZfYTJkcF9zaW5rX2NiLndvcmtlcl90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9hMmRwX3NpbmtfY29tbWFuZF9yZWFkeSwgcF9idWYpKTsKLQotICBpZiAoYnRpZl9hMmRwX3Npbmtfc3RhdGUgPT0gQlRJRl9BMkRQX1NJTktfU1RBVEVfT0ZGKSByZXR1cm47Ci0gIGJ0aWZfYTJkcF9zaW5rX2F1ZGlvX2hhbmRsZV9zdG9wX2RlY29kaW5nKCk7Ci19Ci0KLWJvb2wgYnRpZl9hMmRwX3Npbmtfb25fc3RhcnQoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLQotICBCVF9IRFJfUklHSUQqIHBfYnVmID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QlRfSERSX1JJR0lEKj4ob3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSkpOwotICBwX2J1Zi0+ZXZlbnQgPSBCVElGX01FRElBX1NJTktfU1RBUlQ7Ci0gIGJ0aWZfYTJkcF9zaW5rX2NiLndvcmtlcl90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9hMmRwX3NpbmtfY29tbWFuZF9yZWFkeSwgcF9idWYpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfYXVkaW9faGFuZGxlX3N0b3BfZGVjb2RpbmcoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgYWxhcm1fdCogb2xkX2FsYXJtOwotICB7Ci0gICAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0gICAgYnRpZl9hMmRwX3NpbmtfY2IucnhfZmx1c2ggPSB0cnVlOwotICAgIGJ0aWZfYTJkcF9zaW5rX2F1ZGlvX3J4X2ZsdXNoX3JlcSgpOwotICAgIG9sZF9hbGFybSA9IGJ0aWZfYTJkcF9zaW5rX2NiLmRlY29kZV9hbGFybTsKLSAgICBidGlmX2EyZHBfc2lua19jYi5kZWNvZGVfYWxhcm0gPSBudWxscHRyOwotICB9Ci0KLSAgLy8gRHJvcCB0aGUgbG9jayBoZXJlLCBidGlmX2RlY29kZV9hbGFybV9jYiBtYXkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY2FsbGVkCi0gIC8vIHdoaWxlIHdlIGFsYXJtIGZyZWUgbGVhZGluZyB0byBkZWFkbG9jay4KLSAgLy8KLSAgLy8gYWxhcm1fZnJlZSB3YWl0cyBmb3IgYnRpZl9kZWNvZGVfYWxhcm1fY2Igd2hpY2ggaXMgd2FpdGluZyBmb3IgZ19tdXRleC4KLSAgYWxhcm1fZnJlZShvbGRfYWxhcm0pOwotCi0gIHsKLSAgICBMb2NrR3VhcmQgbG9jayhnX211dGV4KTsKLSNpZm5kZWYgT1NfR0VORVJJQwotICAgIEJ0aWZBdnJjcEF1ZGlvVHJhY2tQYXVzZShidGlmX2EyZHBfc2lua19jYi5hdWRpb190cmFjayk7Ci0jZW5kaWYKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RlY29kZV9hbGFybV9jYihVTlVTRURfQVRUUiB2b2lkKiBjb250ZXh0KSB7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotICBidGlmX2EyZHBfc2lua19jYi53b3JrZXJfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfYTJkcF9zaW5rX2F2a19oYW5kbGVfdGltZXIpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfY2xlYXJfdHJhY2tfZXZlbnQoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0KLSNpZm5kZWYgT1NfR0VORVJJQwotICBCdGlmQXZyY3BBdWRpb1RyYWNrU3RvcChidGlmX2EyZHBfc2lua19jYi5hdWRpb190cmFjayk7Ci0gIEJ0aWZBdnJjcEF1ZGlvVHJhY2tEZWxldGUoYnRpZl9hMmRwX3NpbmtfY2IuYXVkaW9fdHJhY2spOwotI2VuZGlmCi0gIGJ0aWZfYTJkcF9zaW5rX2NiLmF1ZGlvX3RyYWNrID0gbnVsbHB0cjsKLX0KLQotLy8gTXVzdCBiZSBjYWxsZWQgd2hpbGUgbG9ja2VkLgotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NpbmtfYXVkaW9faGFuZGxlX3N0YXJ0X2RlY29kaW5nKCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChidGlmX2EyZHBfc2lua19jYi5kZWNvZGVfYWxhcm0gIT0gbnVsbHB0cikKLSAgICByZXR1cm47ICAvLyBBbHJlYWR5IHN0YXJ0ZWQgZGVjb2RpbmcKLQotI2lmbmRlZiBPU19HRU5FUklDCi0gIEJ0aWZBdnJjcEF1ZGlvVHJhY2tTdGFydChidGlmX2EyZHBfc2lua19jYi5hdWRpb190cmFjayk7Ci0jZW5kaWYKLQotICBidGlmX2EyZHBfc2lua19jYi5kZWNvZGVfYWxhcm0gPSBhbGFybV9uZXdfcGVyaW9kaWMoImJ0aWYuYTJkcF9zaW5rX2RlY29kZSIpOwotICBpZiAoYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2RlX2FsYXJtID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgZGVjb2RlIGFsYXJtIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBhbGFybV9zZXQoYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2RlX2FsYXJtLCBCVElGX1NJTktfTUVESUFfVElNRV9USUNLX01TLAotICAgICAgICAgICAgYnRpZl9kZWNvZGVfYWxhcm1fY2IsIG51bGxwdHIpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19vbl9kZWNvZGVfY29tcGxldGUodWludDhfdCogZGF0YSwgdWludDMyX3QgbGVuKSB7Ci0jaWZuZGVmIE9TX0dFTkVSSUMKLSAgQnRpZkF2cmNwQXVkaW9UcmFja1dyaXRlRGF0YShidGlmX2EyZHBfc2lua19jYi5hdWRpb190cmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihkYXRhKSwgbGVuKTsKLSNlbmRpZgotfQotCi0vLyBNdXN0IGJlIGNhbGxlZCB3aGlsZSBsb2NrZWQuCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19oYW5kbGVfaW5jX21lZGlhKEJUX0hEUiogcF9tc2cpIHsKLSAgaWYgKChidGlmX2F2X2dldF9wZWVyX3NlcCgpID09IEFWRFRfVFNFUF9TTkspIHx8Ci0gICAgICAoYnRpZl9hMmRwX3NpbmtfY2IucnhfZmx1c2gpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN0YXRlIGNoYW5nZWQgaGFwcGVuZWQgaW4gdGhpcyB0aWNrIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIENIRUNLKGJ0aWZfYTJkcF9zaW5rX2NiLmRlY29kZXJfaW50ZXJmYWNlICE9IG51bGxwdHIpOwotICBpZiAoIWJ0aWZfYTJkcF9zaW5rX2NiLmRlY29kZXJfaW50ZXJmYWNlLT5kZWNvZGVfcGFja2V0KHBfbXNnKSkgewotICAgIExPR19FUlJPUigiJXM6IGRlY29kaW5nIGZhaWxlZCIsIF9fZnVuY19fKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19hdmtfaGFuZGxlX3RpbWVyKCkgewotICBMb2NrR3VhcmQgbG9jayhnX211dGV4KTsKLQotICBCVF9IRFIqIHBfbXNnOwotICBpZiAoZml4ZWRfcXVldWVfaXNfZW1wdHkoYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGVtcHR5IHF1ZXVlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGluIGNhc2Ugb2YgZm9jdXMgbm90IGdyYW50ZWQgKi8KLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2ZvY3VzX3N0YXRlID09IEJUSUZfQTJEUF9TSU5LX0ZPQ1VTX05PVF9HUkFOVEVEKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNraXBwaW5nIGZyYW1lcyBzaW5jZSBmb2N1cyBpcyBub3QgcHJlc2VudCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIFBsYXkgb25seSBpbiBCVElGX0EyRFBfU0lOS19GT0NVU19HUkFOVEVEIGNhc2UgKi8KLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2ZsdXNoKSB7Ci0gICAgZml4ZWRfcXVldWVfZmx1c2goYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUsIG9zaV9mcmVlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcHJvY2VzcyBmcmFtZXMgYmVnaW4iLCBfX2Z1bmNfXyk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgcF9tc2cgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShidGlmX2EyZHBfc2lua19jYi5yeF9hdWRpb19xdWV1ZSk7Ci0gICAgaWYgKHBfbXNnID09IE5VTEwpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbnVtYmVyIG9mIHBhY2tldHMgaW4gcXVldWUgJXp1IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUpKTsKLQotICAgIC8qIFF1ZXVlIHBhY2tldCBoYXMgbGVzcyBmcmFtZXMgKi8KLSAgICBidGlmX2EyZHBfc2lua19oYW5kbGVfaW5jX21lZGlhKHBfbXNnKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gIH0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHByb2Nlc3MgZnJhbWVzIGVuZCIsIF9fZnVuY19fKTsKLX0KLQotLyogd2hlbiB0cnVlIG1lZGlhIHRhc2sgZGlzY2FyZHMgYW55IHJ4IGZyYW1lcyAqLwotdm9pZCBidGlmX2EyZHBfc2lua19zZXRfcnhfZmx1c2goYm9vbCBlbmFibGUpIHsKLSAgTE9HX0lORk8oIiVzOiBlbmFibGU9JXMiLCBfX2Z1bmNfXywgKGVuYWJsZSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0KLSAgYnRpZl9hMmRwX3NpbmtfY2IucnhfZmx1c2ggPSBlbmFibGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX2F1ZGlvX3J4X2ZsdXNoX2V2ZW50KCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotICAvLyBGbHVzaCBhbGwgcmVjZWl2ZWQgZW5jb2RlZCBhdWRpbyBidWZmZXJzCi0gIGZpeGVkX3F1ZXVlX2ZsdXNoKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2F1ZGlvX3F1ZXVlLCBvc2lfZnJlZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX2RlY29kZXJfdXBkYXRlX2V2ZW50KAotICAgIHRCVElGX01FRElBX1NJTktfREVDT0RFUl9VUERBVEUqIHBfYnVmKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgTG9ja0d1YXJkIGxvY2soZ19tdXRleCk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBwX2NvZGVjX2luZm9bJXg6JXg6JXg6JXg6JXg6JXhdIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9idWYtPmNvZGVjX2luZm9bMV0sIHBfYnVmLT5jb2RlY19pbmZvWzJdLAotICAgICAgICAgICAgICAgICAgIHBfYnVmLT5jb2RlY19pbmZvWzNdLCBwX2J1Zi0+Y29kZWNfaW5mb1s0XSwKLSAgICAgICAgICAgICAgICAgICBwX2J1Zi0+Y29kZWNfaW5mb1s1XSwgcF9idWYtPmNvZGVjX2luZm9bNl0pOwotCi0gIGludCBzYW1wbGVfcmF0ZSA9IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlKHBfYnVmLT5jb2RlY19pbmZvKTsKLSAgaWYgKHNhbXBsZV9yYXRlID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGdldCB0aGUgdHJhY2sgZnJlcXVlbmN5IiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBpbnQgYml0c19wZXJfc2FtcGxlID0gQTJEUF9HZXRUcmFja0JpdHNQZXJTYW1wbGUocF9idWYtPmNvZGVjX2luZm8pOwotICBpZiAoYml0c19wZXJfc2FtcGxlID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGdldCB0aGUgYml0cyBwZXIgc2FtcGxlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBpbnQgY2hhbm5lbF9jb3VudCA9IEEyRFBfR2V0VHJhY2tDaGFubmVsQ291bnQocF9idWYtPmNvZGVjX2luZm8pOwotICBpZiAoY2hhbm5lbF9jb3VudCA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBnZXQgdGhlIGNoYW5uZWwgY291bnQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludCBjaGFubmVsX3R5cGUgPSBBMkRQX0dldFNpbmtUcmFja0NoYW5uZWxUeXBlKHBfYnVmLT5jb2RlY19pbmZvKTsKLSAgaWYgKGNoYW5uZWxfdHlwZSA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBnZXQgdGhlIFNpbmsgY2hhbm5lbCB0eXBlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBidGlmX2EyZHBfc2lua19jYi5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwotICBidGlmX2EyZHBfc2lua19jYi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0gIGJ0aWZfYTJkcF9zaW5rX2NiLmNoYW5uZWxfY291bnQgPSBjaGFubmVsX2NvdW50OwotCi0gIGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2ZsdXNoID0gZmFsc2U7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiByZXNldCB0byBTaW5rIHJvbGUiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2Rlcl9pbnRlcmZhY2UgPSBidGFfYXZfY29fZ2V0X2RlY29kZXJfaW50ZXJmYWNlKCk7Ci0gIGlmIChidGlmX2EyZHBfc2lua19jYi5kZWNvZGVyX2ludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IHN0cmVhbSBhdWRpbzogbm8gc291cmNlIGRlY29kZXIgaW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2Rlcl9pbnRlcmZhY2UtPmRlY29kZXJfaW5pdCgKLSAgICAgICAgICBidGlmX2EyZHBfc2lua19vbl9kZWNvZGVfY29tcGxldGUpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogZmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2Rlcl9pbnRlcmZhY2UtPmRlY29kZXJfY29uZmlndXJlICE9IG51bGxwdHIpIHsKLSAgICBidGlmX2EyZHBfc2lua19jYi5kZWNvZGVyX2ludGVyZmFjZS0+ZGVjb2Rlcl9jb25maWd1cmUocF9idWYtPmNvZGVjX2luZm8pOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNyZWF0ZSBhdWRpbyB0cmFjayIsIF9fZnVuY19fKTsKLSAgYnRpZl9hMmRwX3NpbmtfY2IuYXVkaW9fdHJhY2sgPQotI2lmbmRlZiBPU19HRU5FUklDCi0gICAgICBCdGlmQXZyY3BBdWRpb1RyYWNrQ3JlYXRlKHNhbXBsZV9yYXRlLCBiaXRzX3Blcl9zYW1wbGUsIGNoYW5uZWxfY291bnQpOwotI2Vsc2UKLSAgICAgIE5VTEw7Ci0jZW5kaWYKLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX2NiLmF1ZGlvX3RyYWNrID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIiVzOiB0cmFjayBjcmVhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXVpbnQ4X3QgYnRpZl9hMmRwX3NpbmtfZW5xdWV1ZV9idWYoQlRfSERSKiBwX3BrdCkgewotICBMb2NrR3VhcmQgbG9jayhnX211dGV4KTsKLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2ZsdXNoKSAvKiBGbHVzaCBlbmFibGVkLCBkbyBub3QgZW5xdWV1ZSAqLwotICAgIHJldHVybiBmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUpOwotCi0gIGlmIChmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUpID09Ci0gICAgICBNQVhfSU5QVVRfQTJEUF9GUkFNRV9RVUVVRV9TWikgewotICAgIHVpbnQ4X3QgcmV0ID0gZml4ZWRfcXVldWVfbGVuZ3RoKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2F1ZGlvX3F1ZXVlKTsKLSAgICBvc2lfZnJlZShmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShidGlmX2EyZHBfc2lua19jYi5yeF9hdWRpb19xdWV1ZSkpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBCVElGX1RSQUNFX1ZFUkJPU0UoIiVzICsiLCBfX2Z1bmNfXyk7Ci0gIC8qIEFsbG9jYXRlIGFuZCBxdWV1ZSB0aGlzIGJ1ZmZlciAqLwotICBCVF9IRFIqIHBfbXNnID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QlRfSERSKj4ob3NpX21hbGxvYyhzaXplb2YoKnBfbXNnKSArIHBfcGt0LT5sZW4pKTsKLSAgbWVtY3B5KHBfbXNnLCBwX3BrdCwgc2l6ZW9mKCpwX21zZykpOwotICBwX21zZy0+b2Zmc2V0ID0gMDsKLSAgbWVtY3B5KHBfbXNnLT5kYXRhLCBwX3BrdC0+ZGF0YSArIHBfcGt0LT5vZmZzZXQsIHBfcGt0LT5sZW4pOwotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2F1ZGlvX3F1ZXVlLCBwX21zZyk7Ci0gIGlmIChmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUpID09Ci0gICAgICBNQVhfQTJEUF9ERUxBWUVEX1NUQVJUX0ZSQU1FX0NPVU5UKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEluaXRpYXRlIGRlY29kaW5nIiwgX19mdW5jX18pOwotICAgIGJ0aWZfYTJkcF9zaW5rX2F1ZGlvX2hhbmRsZV9zdGFydF9kZWNvZGluZygpOwotICB9Ci0KLSAgcmV0dXJuIGZpeGVkX3F1ZXVlX2xlbmd0aChidGlmX2EyZHBfc2lua19jYi5yeF9hdWRpb19xdWV1ZSk7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NpbmtfYXVkaW9fcnhfZmx1c2hfcmVxKCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChmaXhlZF9xdWV1ZV9pc19lbXB0eShidGlmX2EyZHBfc2lua19jYi5yeF9hdWRpb19xdWV1ZSkpIHsKLSAgICAvKiBRdWV1ZSBpcyBhbHJlYWR5IGVtcHR5ICovCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRfSERSX1JJR0lEKiBwX2J1ZiA9Ci0gICAgICByZWludGVycHJldF9jYXN0PEJUX0hEUl9SSUdJRCo+KG9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUl9SSUdJRCkpKTsKLSAgcF9idWYtPmV2ZW50ID0gQlRJRl9NRURJQV9TSU5LX0FVRElPX1JYX0ZMVVNIOwotICBidGlmX2EyZHBfc2lua19jYi53b3JrZXJfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfYTJkcF9zaW5rX2NvbW1hbmRfcmVhZHksIHBfYnVmKSk7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NpbmtfZGVidWdfZHVtcChVTlVTRURfQVRUUiBpbnQgZmQpIHsKLSAgLy8gTm90aGluZyB0byBkbwotfQotCi12b2lkIGJ0aWZfYTJkcF9zaW5rX3NldF9mb2N1c19zdGF0ZV9yZXEoYnRpZl9hMmRwX3NpbmtfZm9jdXNfc3RhdGVfdCBzdGF0ZSkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHRCVElGX01FRElBX1NJTktfRk9DVVNfVVBEQVRFKiBwX2J1ZiA9Ci0gICAgICByZWludGVycHJldF9jYXN0PHRCVElGX01FRElBX1NJTktfRk9DVVNfVVBEQVRFKj4oCi0gICAgICAgICAgb3NpX21hbGxvYyhzaXplb2YodEJUSUZfTUVESUFfU0lOS19GT0NVU19VUERBVEUpKSk7Ci0gIHBfYnVmLT5mb2N1c19zdGF0ZSA9IHN0YXRlOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRJRl9NRURJQV9TSU5LX1NFVF9GT0NVU19TVEFURTsKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoYnRpZl9hMmRwX3NpbmtfY29tbWFuZF9yZWFkeSwgKEJUX0hEUl9SSUdJRCopcF9idWYpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3Npbmtfc2V0X2ZvY3VzX3N0YXRlX2V2ZW50KAotICAgIGJ0aWZfYTJkcF9zaW5rX2ZvY3VzX3N0YXRlX3Qgc3RhdGUpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lZCIsIF9fZnVuY19fLCBzdGF0ZSk7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzZXR0aW5nIGZvY3VzIHN0YXRlIHRvICVkIiwgX19mdW5jX18sIHN0YXRlKTsKLSAgYnRpZl9hMmRwX3NpbmtfY2IucnhfZm9jdXNfc3RhdGUgPSBzdGF0ZTsKLSAgaWYgKGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2ZvY3VzX3N0YXRlID09IEJUSUZfQTJEUF9TSU5LX0ZPQ1VTX05PVF9HUkFOVEVEKSB7Ci0gICAgZml4ZWRfcXVldWVfZmx1c2goYnRpZl9hMmRwX3NpbmtfY2IucnhfYXVkaW9fcXVldWUsIG9zaV9mcmVlKTsKLSAgICBidGlmX2EyZHBfc2lua19jYi5yeF9mbHVzaCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoYnRpZl9hMmRwX3NpbmtfY2IucnhfZm9jdXNfc3RhdGUgPT0gQlRJRl9BMkRQX1NJTktfRk9DVVNfR1JBTlRFRCkgewotICAgIGJ0aWZfYTJkcF9zaW5rX2NiLnJ4X2ZsdXNoID0gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2EyZHBfc2lua19zZXRfYXVkaW9fdHJhY2tfZ2FpbihmbG9hdCBnYWluKSB7Ci0gIExPR19JTkZPKCIlczogc2V0IGdhaW4gdG8gJWYiLCBfX2Z1bmNfXywgZ2Fpbik7Ci0gIExvY2tHdWFyZCBsb2NrKGdfbXV0ZXgpOwotCi0jaWZuZGVmIE9TX0dFTkVSSUMKLSAgQnRpZkF2cmNwU2V0QXVkaW9UcmFja0dhaW4oYnRpZl9hMmRwX3NpbmtfY2IuYXVkaW9fdHJhY2ssIGdhaW4pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX2NsZWFyX3RyYWNrX2V2ZW50X3JlcSgpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICBCVF9IRFJfUklHSUQqIHBfYnVmID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QlRfSERSX1JJR0lEKj4ob3NpX21hbGxvYyhzaXplb2YoQlRfSERSX1JJR0lEKSkpOwotCi0gIHBfYnVmLT5ldmVudCA9IEJUSUZfTUVESUFfU0lOS19DTEVBUl9UUkFDSzsKLSAgYnRpZl9hMmRwX3NpbmtfY2Iud29ya2VyX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2EyZHBfc2lua19jb21tYW5kX3JlYWR5LCBwX2J1ZikpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc2lua19vbl9zdGFydF9ldmVudCgpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICgoYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2Rlcl9pbnRlcmZhY2UgIT0gbnVsbHB0cikgJiYKLSAgICAgIChidGlmX2EyZHBfc2lua19jYi5kZWNvZGVyX2ludGVyZmFjZS0+ZGVjb2Rlcl9zdGFydCAhPSBudWxscHRyKSkgewotICAgIGJ0aWZfYTJkcF9zaW5rX2NiLmRlY29kZXJfaW50ZXJmYWNlLT5kZWNvZGVyX3N0YXJ0KCk7Ci0gIH0KLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zaW5rX29uX3N1c3BlbmRfZXZlbnQoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoKGJ0aWZfYTJkcF9zaW5rX2NiLmRlY29kZXJfaW50ZXJmYWNlICE9IG51bGxwdHIpICYmCi0gICAgICAoYnRpZl9hMmRwX3NpbmtfY2IuZGVjb2Rlcl9pbnRlcmZhY2UtPmRlY29kZXJfc3VzcGVuZCAhPSBudWxscHRyKSkgewotICAgIGJ0aWZfYTJkcF9zaW5rX2NiLmRlY29kZXJfaW50ZXJmYWNlLT5kZWNvZGVyX3N1c3BlbmQoKTsKLSAgfQotCi0gIHJldHVybjsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfYTJkcF9zb3VyY2UuY2MgYi9idGlmL3NyYy9idGlmX2EyZHBfc291cmNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNhYTBjLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfYTJkcF9zb3VyY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfYTJkcF9zb3VyY2UiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9ydW5fbG9vcC5oPgotI2lmbmRlZiBPU19HRU5FUklDCi0jaW5jbHVkZSA8Y3V0aWxzL3RyYWNlLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaCIKLSNpbmNsdWRlICJhdWRpb19oYWxfaW50ZXJmYWNlL2EyZHBfZW5jb2RpbmcuaCIKLSNpbmNsdWRlICJidGFfYXZfY2kuaCIKLSNpbmNsdWRlICJidGlmX2EyZHAuaCIKLSNpbmNsdWRlICJidGlmX2EyZHBfY29udHJvbC5oIgotI2luY2x1ZGUgImJ0aWZfYTJkcF9zb3VyY2UuaCIKLSNpbmNsdWRlICJidGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZl9hdl9jby5oIgotI2luY2x1ZGUgImJ0aWZfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgImNvbW1vbi9yZXBlYXRpbmdfdGltZXIuaCIKLSNpbmNsdWRlICJjb21tb24vdGltZV91dGlsLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS93YWtlbG9jay5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLSNpbmNsdWRlICJ1aXBjLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpBMmRwU2Vzc2lvbk1ldHJpY3M7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6Qmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpSZXBlYXRpbmdUaW1lcjsKLQotZXh0ZXJuIHN0ZDo6dW5pcXVlX3B0cjx0VUlQQ19TVEFURT4gYTJkcF91aXBjOwotCi0vKioKLSAqIFRoZSB0eXBpY2FsIHJ1bmxldmVsIG9mIHRoZSB0eCBxdWV1ZSBzaXplIGlzIH4xIGJ1ZmZlcgotICogYnV0IGR1ZSB0byBsaW5rIGZsb3cgY29udHJvbCBvciB0aHJlYWQgcHJlZW1wdGlvbiBpbiBsb3dlcgotICogbGF5ZXJzIHdlIG1pZ2h0IG5lZWQgdG8gdGVtcG9yYXJpbHkgYnVmZmVyIHVwIGRhdGEuCi0gKi8KLSNkZWZpbmUgTUFYX09VVFBVVF9BMkRQX0ZSQU1FX1FVRVVFX1NaIChNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDSyAqIDIpCi0KLWNsYXNzIFNjaGVkdWxpbmdTdGF0cyB7Ci0gcHVibGljOgotICBTY2hlZHVsaW5nU3RhdHMoKSB7IFJlc2V0KCk7IH0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICB0b3RhbF91cGRhdGVzID0gMDsKLSAgICBsYXN0X3VwZGF0ZV91cyA9IDA7Ci0gICAgb3ZlcmR1ZV9zY2hlZHVsaW5nX2NvdW50ID0gMDsKLSAgICB0b3RhbF9vdmVyZHVlX3NjaGVkdWxpbmdfZGVsdGFfdXMgPSAwOwotICAgIG1heF9vdmVyZHVlX3NjaGVkdWxpbmdfZGVsdGFfdXMgPSAwOwotICAgIHByZW1hdHVyZV9zY2hlZHVsaW5nX2NvdW50ID0gMDsKLSAgICB0b3RhbF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyA9IDA7Ci0gICAgbWF4X3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzID0gMDsKLSAgICBleGFjdF9zY2hlZHVsaW5nX2NvdW50ID0gMDsKLSAgICB0b3RhbF9zY2hlZHVsaW5nX3RpbWVfdXMgPSAwOwotICB9Ci0KLSAgLy8gQ291bnRlciBmb3IgdG90YWwgdXBkYXRlcwotICBzaXplX3QgdG90YWxfdXBkYXRlczsKLQotICAvLyBMYXN0IHVwZGF0ZSB0aW1lc3RhbXAgKGluIHVzKQotICB1aW50NjRfdCBsYXN0X3VwZGF0ZV91czsKLQotICAvLyBDb3VudGVyIGZvciBvdmVyZHVlIHNjaGVkdWxpbmcKLSAgc2l6ZV90IG92ZXJkdWVfc2NoZWR1bGluZ19jb3VudDsKLQotICAvLyBBY2N1bXVsYXRlZCBvdmVyZHVlIHNjaGVkdWxpbmcgZGV2aWF0aW9ucyAoaW4gdXMpCi0gIHVpbnQ2NF90IHRvdGFsX292ZXJkdWVfc2NoZWR1bGluZ19kZWx0YV91czsKLQotICAvLyBNYXguIG92ZXJkdWUgc2NoZWR1bGluZyBkZWx0YSB0aW1lIChpbiB1cykKLSAgdWludDY0X3QgbWF4X292ZXJkdWVfc2NoZWR1bGluZ19kZWx0YV91czsKLQotICAvLyBDb3VudGVyIGZvciBwcmVtYXR1cmUgc2NoZWR1bGluZwotICBzaXplX3QgcHJlbWF0dXJlX3NjaGVkdWxpbmdfY291bnQ7Ci0KLSAgLy8gQWNjdW11bGF0ZWQgcHJlbWF0dXJlIHNjaGVkdWxpbmcgZGV2aWF0aW9ucyAoaW4gdXMpCi0gIHVpbnQ2NF90IHRvdGFsX3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzOwotCi0gIC8vIE1heC4gcHJlbWF0dXJlIHNjaGVkdWxpbmcgZGVsdGEgdGltZSAoaW4gdXMpCi0gIHVpbnQ2NF90IG1heF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91czsKLQotICAvLyBDb3VudGVyIGZvciBleGFjdCBzY2hlZHVsaW5nCi0gIHNpemVfdCBleGFjdF9zY2hlZHVsaW5nX2NvdW50OwotCi0gIC8vIEFjY3VtdWxhdGVkIGFuZCBjb3VudGVkIHNjaGVkdWxpbmcgdGltZSAoaW4gdXMpCi0gIHVpbnQ2NF90IHRvdGFsX3NjaGVkdWxpbmdfdGltZV91czsKLX07Ci0KLWNsYXNzIEJ0aWZNZWRpYVN0YXRzIHsKLSBwdWJsaWM6Ci0gIEJ0aWZNZWRpYVN0YXRzKCkgeyBSZXNldCgpOyB9Ci0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgc2Vzc2lvbl9zdGFydF91cyA9IDA7Ci0gICAgc2Vzc2lvbl9lbmRfdXMgPSAwOwotICAgIHR4X3F1ZXVlX2VucXVldWVfc3RhdHMuUmVzZXQoKTsKLSAgICB0eF9xdWV1ZV9kZXF1ZXVlX3N0YXRzLlJlc2V0KCk7Ci0gICAgdHhfcXVldWVfdG90YWxfZnJhbWVzID0gMDsKLSAgICB0eF9xdWV1ZV9tYXhfZnJhbWVzX3Blcl9wYWNrZXQgPSAwOwotICAgIHR4X3F1ZXVlX3RvdGFsX3F1ZXVlaW5nX3RpbWVfdXMgPSAwOwotICAgIHR4X3F1ZXVlX21heF9xdWV1ZWluZ190aW1lX3VzID0gMDsKLSAgICB0eF9xdWV1ZV90b3RhbF9yZWFkYnVmX2NhbGxzID0gMDsKLSAgICB0eF9xdWV1ZV9sYXN0X3JlYWRidWZfdXMgPSAwOwotICAgIHR4X3F1ZXVlX3RvdGFsX2ZsdXNoZWRfbWVzc2FnZXMgPSAwOwotICAgIHR4X3F1ZXVlX2xhc3RfZmx1c2hlZF91cyA9IDA7Ci0gICAgdHhfcXVldWVfdG90YWxfZHJvcHBlZF9tZXNzYWdlcyA9IDA7Ci0gICAgdHhfcXVldWVfbWF4X2Ryb3BwZWRfbWVzc2FnZXMgPSAwOwotICAgIHR4X3F1ZXVlX2Ryb3BvdXRzID0gMDsKLSAgICB0eF9xdWV1ZV9sYXN0X2Ryb3BvdXRzX3VzID0gMDsKLSAgICBtZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlcyA9IDA7Ci0gICAgbWVkaWFfcmVhZF90b3RhbF91bmRlcmZsb3dfY291bnQgPSAwOwotICAgIG1lZGlhX3JlYWRfbGFzdF91bmRlcmZsb3dfdXMgPSAwOwotICAgIGNvZGVjX2luZGV4ID0gLTE7Ci0gIH0KLQotICB1aW50NjRfdCBzZXNzaW9uX3N0YXJ0X3VzOwotICB1aW50NjRfdCBzZXNzaW9uX2VuZF91czsKLQotICBTY2hlZHVsaW5nU3RhdHMgdHhfcXVldWVfZW5xdWV1ZV9zdGF0czsKLSAgU2NoZWR1bGluZ1N0YXRzIHR4X3F1ZXVlX2RlcXVldWVfc3RhdHM7Ci0KLSAgc2l6ZV90IHR4X3F1ZXVlX3RvdGFsX2ZyYW1lczsKLSAgc2l6ZV90IHR4X3F1ZXVlX21heF9mcmFtZXNfcGVyX3BhY2tldDsKLQotICB1aW50NjRfdCB0eF9xdWV1ZV90b3RhbF9xdWV1ZWluZ190aW1lX3VzOwotICB1aW50NjRfdCB0eF9xdWV1ZV9tYXhfcXVldWVpbmdfdGltZV91czsKLQotICBzaXplX3QgdHhfcXVldWVfdG90YWxfcmVhZGJ1Zl9jYWxsczsKLSAgdWludDY0X3QgdHhfcXVldWVfbGFzdF9yZWFkYnVmX3VzOwotCi0gIHNpemVfdCB0eF9xdWV1ZV90b3RhbF9mbHVzaGVkX21lc3NhZ2VzOwotICB1aW50NjRfdCB0eF9xdWV1ZV9sYXN0X2ZsdXNoZWRfdXM7Ci0KLSAgc2l6ZV90IHR4X3F1ZXVlX3RvdGFsX2Ryb3BwZWRfbWVzc2FnZXM7Ci0gIHNpemVfdCB0eF9xdWV1ZV9tYXhfZHJvcHBlZF9tZXNzYWdlczsKLSAgc2l6ZV90IHR4X3F1ZXVlX2Ryb3BvdXRzOwotICB1aW50NjRfdCB0eF9xdWV1ZV9sYXN0X2Ryb3BvdXRzX3VzOwotCi0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlczsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfdW5kZXJmbG93X2NvdW50OwotICB1aW50NjRfdCBtZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzOwotCi0gIGludCBjb2RlY19pbmRleCA9IC0xOwotfTsKLQotY2xhc3MgQnRpZkEyZHBTb3VyY2UgewotIHB1YmxpYzoKLSAgZW51bSBSdW5TdGF0ZSB7Ci0gICAga1N0YXRlT2ZmLAotICAgIGtTdGF0ZVN0YXJ0aW5nVXAsCi0gICAga1N0YXRlUnVubmluZywKLSAgICBrU3RhdGVTaHV0dGluZ0Rvd24KLSAgfTsKLQotICBCdGlmQTJkcFNvdXJjZSgpCi0gICAgICA6IHR4X2F1ZGlvX3F1ZXVlKG51bGxwdHIpLAotICAgICAgICB0eF9mbHVzaChmYWxzZSksCi0gICAgICAgIGVuY29kZXJfaW50ZXJmYWNlKG51bGxwdHIpLAotICAgICAgICBlbmNvZGVyX2ludGVydmFsX21zKDApLAotICAgICAgICBzdGF0ZV8oa1N0YXRlT2ZmKSB7fQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgZml4ZWRfcXVldWVfZnJlZSh0eF9hdWRpb19xdWV1ZSwgbnVsbHB0cik7Ci0gICAgdHhfYXVkaW9fcXVldWUgPSBudWxscHRyOwotICAgIHR4X2ZsdXNoID0gZmFsc2U7Ci0gICAgbWVkaWFfYWxhcm0uQ2FuY2VsQW5kV2FpdCgpOwotICAgIHdha2Vsb2NrX3JlbGVhc2UoKTsKLSAgICBlbmNvZGVyX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgZW5jb2Rlcl9pbnRlcnZhbF9tcyA9IDA7Ci0gICAgc3RhdHMuUmVzZXQoKTsKLSAgICBhY2N1bXVsYXRlZF9zdGF0cy5SZXNldCgpOwotICAgIHN0YXRlXyA9IGtTdGF0ZU9mZjsKLSAgfQotCi0gIEJ0aWZBMmRwU291cmNlOjpSdW5TdGF0ZSBTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQotICBzdGQ6OnN0cmluZyBTdGF0ZVN0cigpIGNvbnN0IHsKLSAgICBzd2l0Y2ggKHN0YXRlXykgewotICAgICAgY2FzZSBrU3RhdGVPZmY6Ci0gICAgICAgIHJldHVybiAiU1RBVEVfT0ZGIjsKLSAgICAgIGNhc2Uga1N0YXRlU3RhcnRpbmdVcDoKLSAgICAgICAgcmV0dXJuICJTVEFURV9TVEFSVElOR19VUCI7Ci0gICAgICBjYXNlIGtTdGF0ZVJ1bm5pbmc6Ci0gICAgICAgIHJldHVybiAiU1RBVEVfUlVOTklORyI7Ci0gICAgICBjYXNlIGtTdGF0ZVNodXR0aW5nRG93bjoKLSAgICAgICAgcmV0dXJuICJTVEFURV9TSFVUVElOR19ET1dOIjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNldFN0YXRlKEJ0aWZBMmRwU291cmNlOjpSdW5TdGF0ZSBzdGF0ZSkgeyBzdGF0ZV8gPSBzdGF0ZTsgfQotCi0gIGZpeGVkX3F1ZXVlX3QqIHR4X2F1ZGlvX3F1ZXVlOwotICBib29sIHR4X2ZsdXNoOyAvKiBEaXNjYXJkcyBhbnkgb3V0Z29pbmcgZGF0YSB3aGVuIHRydWUgKi8KLSAgUmVwZWF0aW5nVGltZXIgbWVkaWFfYWxhcm07Ci0gIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFKiBlbmNvZGVyX2ludGVyZmFjZTsKLSAgdWludDY0X3QgZW5jb2Rlcl9pbnRlcnZhbF9tczsgLyogTG9jYWwgY29weSBvZiB0aGUgZW5jb2RlciBpbnRlcnZhbCAqLwotICBCdGlmTWVkaWFTdGF0cyBzdGF0czsKLSAgQnRpZk1lZGlhU3RhdHMgYWNjdW11bGF0ZWRfc3RhdHM7Ci0KLSBwcml2YXRlOgotICBCdGlmQTJkcFNvdXJjZTo6UnVuU3RhdGUgc3RhdGVfOwotfTsKLQotc3RhdGljIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCBidGlmX2EyZHBfc291cmNlX3RocmVhZCgKLSAgICAiYnRfYTJkcF9zb3VyY2Vfd29ya2VyX3RocmVhZCIpOwotc3RhdGljIEJ0aWZBMmRwU291cmNlIGJ0aWZfYTJkcF9zb3VyY2VfY2I7Ci0KLXN0YXRpYyB1aW50OF90IGJ0aWZfYTJkcF9zb3VyY2VfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSA9Ci0gICAgTUFYX09VVFBVVF9BMkRQX0ZSQU1FX1FVRVVFX1NaOwotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2luaXRfZGVsYXllZCh2b2lkKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnR1cF9kZWxheWVkKHZvaWQpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9zdGFydF9zZXNzaW9uX2RlbGF5ZWQoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCBzdGQ6OnByb21pc2U8dm9pZD4gc3RhcnRfc2Vzc2lvbl9wcm9taXNlKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2VfZW5kX3Nlc3Npb25fZGVsYXllZCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9zaHV0ZG93bl9kZWxheWVkKHZvaWQpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9jbGVhbnVwX2RlbGF5ZWQodm9pZCk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3R4X3N0YXJ0X2V2ZW50KHZvaWQpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9hdWRpb190eF9zdG9wX2V2ZW50KHZvaWQpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9hdWRpb190eF9mbHVzaF9ldmVudCh2b2lkKTsKLS8vIFNldCB1cCB0aGUgQTJEUCBTb3VyY2UgY29kZWMsIGFuZCBwcmVwYXJlIHRoZSBlbmNvZGVyLgotLy8gVGhlIHBlZXIgYWRkcmVzcyBpcyB8cGVlcl9hZGRyfC4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byBzdGFydGluZyBBMkRQIHN0cmVhbWluZy4KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0dXBfY29kZWMoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0dXBfY29kZWNfZGVsYXllZCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9jbGVhbnVwX2NvZGVjKCk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2NsZWFudXBfY29kZWNfZGVsYXllZCgpOwotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9ldmVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfdXNlcl9wcmVmZXJlbmNlcywKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2VfYXVkaW9fZmVlZGluZ191cGRhdGVfZXZlbnQoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19hdWRpb19jb25maWcpOwotc3RhdGljIGJvb2wgYnRpZl9hMmRwX3NvdXJjZV9hdWRpb190eF9mbHVzaF9yZXEodm9pZCk7Ci1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2F1ZGlvX2hhbmRsZV90aW1lcih2b2lkKTsKLXN0YXRpYyB1aW50MzJfdCBidGlmX2EyZHBfc291cmNlX3JlYWRfY2FsbGJhY2sodWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbik7Ci1zdGF0aWMgYm9vbCBidGlmX2EyZHBfc291cmNlX2VucXVldWVfY2FsbGJhY2soQlRfSERSKiBwX2J1Ziwgc2l6ZV90IGZyYW1lc19uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQpOwotc3RhdGljIHZvaWQgbG9nX3RzdGFtcHNfdXMoY29uc3QgY2hhciogY29tbWVudCwgdWludDY0X3QgdGltZXN0YW1wX3VzKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zY2hlZHVsaW5nX3N0YXRzKFNjaGVkdWxpbmdTdGF0cyogc3RhdHMsIHVpbnQ2NF90IG5vd191cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGV4cGVjdGVkX2RlbHRhKTsKLS8vIFVwZGF0ZSB0aGUgQTJEUCBTb3VyY2UgcmVsYXRlZCBtZXRyaWNzLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBjb2xsZWN0aW5nIHRoZSBtZXRyaWNzLgotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV91cGRhdGVfbWV0cmljcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGJ0bV9yZWFkX3Jzc2lfY2Iodm9pZCogZGF0YSk7Ci1zdGF0aWMgdm9pZCBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NiKHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRtX3JlYWRfdHhfcG93ZXJfY2Iodm9pZCogZGF0YSk7Ci0KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9hY2N1bXVsYXRlX3NjaGVkdWxpbmdfc3RhdHMoU2NoZWR1bGluZ1N0YXRzKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxpbmdTdGF0cyogZHN0KSB7Ci0gIGRzdC0+dG90YWxfdXBkYXRlcyArPSBzcmMtPnRvdGFsX3VwZGF0ZXM7Ci0gIGRzdC0+bGFzdF91cGRhdGVfdXMgPSBzcmMtPmxhc3RfdXBkYXRlX3VzOwotICBkc3QtPm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudCArPSBzcmMtPm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudDsKLSAgZHN0LT50b3RhbF9vdmVyZHVlX3NjaGVkdWxpbmdfZGVsdGFfdXMgKz0KLSAgICAgIHNyYy0+dG90YWxfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzOwotICBkc3QtPm1heF9vdmVyZHVlX3NjaGVkdWxpbmdfZGVsdGFfdXMgPQotICAgICAgc3RkOjptYXgoZHN0LT5tYXhfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzLAotICAgICAgICAgICAgICAgc3JjLT5tYXhfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzKTsKLSAgZHN0LT5wcmVtYXR1cmVfc2NoZWR1bGluZ19jb3VudCArPSBzcmMtPnByZW1hdHVyZV9zY2hlZHVsaW5nX2NvdW50OwotICBkc3QtPnRvdGFsX3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzICs9Ci0gICAgICBzcmMtPnRvdGFsX3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzOwotICBkc3QtPm1heF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyA9Ci0gICAgICBzdGQ6Om1heChkc3QtPm1heF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cywKLSAgICAgICAgICAgICAgIHNyYy0+bWF4X3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzKTsKLSAgZHN0LT5leGFjdF9zY2hlZHVsaW5nX2NvdW50ICs9IHNyYy0+ZXhhY3Rfc2NoZWR1bGluZ19jb3VudDsKLSAgZHN0LT50b3RhbF9zY2hlZHVsaW5nX3RpbWVfdXMgKz0gc3JjLT50b3RhbF9zY2hlZHVsaW5nX3RpbWVfdXM7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9hY2N1bXVsYXRlX3N0YXRzKEJ0aWZNZWRpYVN0YXRzKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmTWVkaWFTdGF0cyogZHN0KSB7Ci0gIGRzdC0+dHhfcXVldWVfdG90YWxfZnJhbWVzICs9IHNyYy0+dHhfcXVldWVfdG90YWxfZnJhbWVzOwotICBkc3QtPnR4X3F1ZXVlX21heF9mcmFtZXNfcGVyX3BhY2tldCA9IHN0ZDo6bWF4KAotICAgICAgZHN0LT50eF9xdWV1ZV9tYXhfZnJhbWVzX3Blcl9wYWNrZXQsIHNyYy0+dHhfcXVldWVfbWF4X2ZyYW1lc19wZXJfcGFja2V0KTsKLSAgZHN0LT50eF9xdWV1ZV90b3RhbF9xdWV1ZWluZ190aW1lX3VzICs9IHNyYy0+dHhfcXVldWVfdG90YWxfcXVldWVpbmdfdGltZV91czsKLSAgZHN0LT50eF9xdWV1ZV9tYXhfcXVldWVpbmdfdGltZV91cyA9IHN0ZDo6bWF4KAotICAgICAgZHN0LT50eF9xdWV1ZV9tYXhfcXVldWVpbmdfdGltZV91cywgc3JjLT50eF9xdWV1ZV9tYXhfcXVldWVpbmdfdGltZV91cyk7Ci0gIGRzdC0+dHhfcXVldWVfdG90YWxfcmVhZGJ1Zl9jYWxscyArPSBzcmMtPnR4X3F1ZXVlX3RvdGFsX3JlYWRidWZfY2FsbHM7Ci0gIGRzdC0+dHhfcXVldWVfbGFzdF9yZWFkYnVmX3VzID0gc3JjLT50eF9xdWV1ZV9sYXN0X3JlYWRidWZfdXM7Ci0gIGRzdC0+dHhfcXVldWVfdG90YWxfZmx1c2hlZF9tZXNzYWdlcyArPSBzcmMtPnR4X3F1ZXVlX3RvdGFsX2ZsdXNoZWRfbWVzc2FnZXM7Ci0gIGRzdC0+dHhfcXVldWVfbGFzdF9mbHVzaGVkX3VzID0gc3JjLT50eF9xdWV1ZV9sYXN0X2ZsdXNoZWRfdXM7Ci0gIGRzdC0+dHhfcXVldWVfdG90YWxfZHJvcHBlZF9tZXNzYWdlcyArPSBzcmMtPnR4X3F1ZXVlX3RvdGFsX2Ryb3BwZWRfbWVzc2FnZXM7Ci0gIGRzdC0+dHhfcXVldWVfbWF4X2Ryb3BwZWRfbWVzc2FnZXMgPSBzdGQ6Om1heCgKLSAgICAgIGRzdC0+dHhfcXVldWVfbWF4X2Ryb3BwZWRfbWVzc2FnZXMsIHNyYy0+dHhfcXVldWVfbWF4X2Ryb3BwZWRfbWVzc2FnZXMpOwotICBkc3QtPnR4X3F1ZXVlX2Ryb3BvdXRzICs9IHNyYy0+dHhfcXVldWVfZHJvcG91dHM7Ci0gIGRzdC0+dHhfcXVldWVfbGFzdF9kcm9wb3V0c191cyA9IHNyYy0+dHhfcXVldWVfbGFzdF9kcm9wb3V0c191czsKLSAgZHN0LT5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlcyArPQotICAgICAgc3JjLT5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlczsKLSAgZHN0LT5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19jb3VudCArPQotICAgICAgc3JjLT5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19jb3VudDsKLSAgZHN0LT5tZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzID0gc3JjLT5tZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzOwotICBpZiAoZHN0LT5jb2RlY19pbmRleCA8IDApIGRzdC0+Y29kZWNfaW5kZXggPSBzcmMtPmNvZGVjX2luZGV4OwotICBidGlmX2EyZHBfc291cmNlX2FjY3VtdWxhdGVfc2NoZWR1bGluZ19zdGF0cygmc3JjLT50eF9xdWV1ZV9lbnF1ZXVlX3N0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0LT50eF9xdWV1ZV9lbnF1ZXVlX3N0YXRzKTsKLSAgYnRpZl9hMmRwX3NvdXJjZV9hY2N1bXVsYXRlX3NjaGVkdWxpbmdfc3RhdHMoJnNyYy0+dHhfcXVldWVfZGVxdWV1ZV9zdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdC0+dHhfcXVldWVfZGVxdWV1ZV9zdGF0cyk7Ci0gIHNyYy0+UmVzZXQoKTsKLX0KLQotYm9vbCBidGlmX2EyZHBfc291cmNlX2luaXQodm9pZCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLy8gU3RhcnQgQTJEUCBTb3VyY2UgbWVkaWEgdGFzawotICBidGlmX2EyZHBfc291cmNlX3RocmVhZC5TdGFydFVwKCk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0aWZfYTJkcF9zb3VyY2VfaW5pdF9kZWxheWVkKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2luaXRfZGVsYXllZCh2b2lkKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgLy8gTm90aGluZyB0byBkbwotfQotCi1ib29sIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnR1cCh2b2lkKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotCi0gIGlmIChidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlKCkgIT0gQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZU9mZikgewotICAgIExPR19FUlJPUigiJXM6IEEyRFAgU291cmNlIG1lZGlhIHRhc2sgYWxyZWFkeSBydW5uaW5nIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ0aWZfYTJkcF9zb3VyY2VfY2IuUmVzZXQoKTsKLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5TZXRTdGF0ZShCdGlmQTJkcFNvdXJjZTo6a1N0YXRlU3RhcnRpbmdVcCk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfY2IudHhfYXVkaW9fcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotCi0gIC8vIFNjaGVkdWxlIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb25zCi0gIGJ0aWZfYTJkcF9zb3VyY2VfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnR1cF9kZWxheWVkKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnR1cF9kZWxheWVkKCkgewotICBMT0dfSU5GTygiJXM6IHN0YXRlPSVzIiwgX19mdW5jX18sIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKS5jX3N0cigpKTsKLSAgaWYgKCFidGlmX2EyZHBfc291cmNlX3RocmVhZC5FbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKSkgewotI2lmIGRlZmluZWQoT1NfQU5EUk9JRCkKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBlbmFibGUgcmVhbCB0aW1lIHNjaGVkdWxpbmciOwotI2VuZGlmCi0gIH0KLSAgaWYgKCFibHVldG9vdGg6OmF1ZGlvOjphMmRwOjppbml0KCZidGlmX2EyZHBfc291cmNlX3RocmVhZCkpIHsKLSAgICBpZiAoYnRpZl9hdl9pc19hMmRwX29mZmxvYWRfZW5hYmxlZCgpKSB7Ci0gICAgICAvLyBUT0RPOiBCbHVldG9vdGhBMmRwQDEuMCBpcyBkZXByZWNhdGVkCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogVXNpbmcgQmx1ZXRvb3RoQTJkcCBIQUwiOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogVXNpbmcgbGVnYWN5IEhBTCI7Ci0gICAgICBidGlmX2EyZHBfY29udHJvbF9pbml0KCk7Ci0gICAgfQotICB9Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU2V0U3RhdGUoQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZVJ1bm5pbmcpOwotfQotCi1ib29sIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnRfc2Vzc2lvbihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyX2FkZHJlc3M9IiA8PCBwZWVyX2FkZHJlc3MKLSAgICAgICAgICAgIDw8ICIgc3RhdGU9IiA8PCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0dXBfY29kZWMocGVlcl9hZGRyZXNzKTsKLSAgaWYgKGJ0aWZfYTJkcF9zb3VyY2VfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZidGlmX2EyZHBfc291cmNlX3N0YXJ0X3Nlc3Npb25fZGVsYXllZCwgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBjYW5ub3Qgc2V0IHByb21pc2UgYnV0IHRyaWdnZXJzIGNyYXNoCi0gICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyX2FkZHJlc3M9IiA8PCBwZWVyX2FkZHJlc3MKLSAgICAgICAgICAgICAgIDw8ICIgc3RhdGU9IiA8PCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkKLSAgICAgICAgICAgICAgIDw8ICIgZmFpbHMgdG8gY29udGV4dCBzd2l0Y2giOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX3N0YXJ0X3Nlc3Npb25fZGVsYXllZCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHBlZXJfYWRkcmVzcz0iIDw8IHBlZXJfYWRkcmVzcwotICAgICAgICAgICAgPDwgIiBzdGF0ZT0iIDw8IGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKTsKLSAgaWYgKGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGUoKSAhPSBCdGlmQTJkcFNvdXJjZTo6a1N0YXRlUnVubmluZykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogQTJEUCBTb3VyY2UgbWVkaWEgdGFzayBpcyBub3QgcnVubmluZyI7Ci0gICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjpzdGFydF9zZXNzaW9uKCk7Ci0gICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6c2V0X3JlbW90ZV9kZWxheShidGlmX2F2X2dldF9hdWRpb19kZWxheSgpKTsKLSAgICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoCi0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9CUkVEUiwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQmx1ZXRvb3RoU2Vzc2lvblN0YXJ0KAotICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6Q09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsIDApOwotICB9Ci0gIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLX0KLQotYm9vbCBidGlmX2EyZHBfc291cmNlX3Jlc3RhcnRfc2Vzc2lvbihjb25zdCBSYXdBZGRyZXNzJiBvbGRfcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBuZXdfcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKSB7Ci0gIGJvb2wgaXNfc3RyZWFtaW5nID0gYnRpZl9hMmRwX3NvdXJjZV9jYi5tZWRpYV9hbGFybS5Jc1NjaGVkdWxlZCgpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogb2xkX3BlZXJfYWRkcmVzcz0iIDw8IG9sZF9wZWVyX2FkZHJlc3MKLSAgICAgICAgICAgIDw8ICIgbmV3X3BlZXJfYWRkcmVzcz0iIDw8IG5ld19wZWVyX2FkZHJlc3MKLSAgICAgICAgICAgIDw8ICIgaXNfc3RyZWFtaW5nPSIgPDwgbG9nYm9vbChpc19zdHJlYW1pbmcpCi0gICAgICAgICAgICA8PCAiIHN0YXRlPSIgPDwgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpOwotCi0gIENIRUNLKCFuZXdfcGVlcl9hZGRyZXNzLklzRW1wdHkoKSk7Ci0KLSAgLy8gTXVzdCBzdG9wIGZpcnN0IHRoZSBhdWRpbyBzdHJlYW1pbmcKLSAgaWYgKGlzX3N0cmVhbWluZykgewotICAgIGJ0aWZfYTJkcF9zb3VyY2Vfc3RvcF9hdWRpb19yZXEoKTsKLSAgfQotCi0gIC8vIElmIHRoZSBvbGQgYWN0aXZlIHBlZXIgd2FzIHZhbGlkLCBlbmQgdGhlIG9sZCBzZXNzaW9uLgotICAvLyBPdGhlcndpc2UsIHRpbWUgdG8gc3RhcnR1cCB0aGUgQTJEUCBTb3VyY2UgcHJvY2Vzc2luZy4KLSAgaWYgKCFvbGRfcGVlcl9hZGRyZXNzLklzRW1wdHkoKSkgewotICAgIGJ0aWZfYTJkcF9zb3VyY2VfZW5kX3Nlc3Npb24ob2xkX3BlZXJfYWRkcmVzcyk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9zdGFydHVwKCk7Ci0gIH0KLQotICAvLyBTdGFydCB0aGUgc2Vzc2lvbi4KLSAgYnRpZl9hMmRwX3NvdXJjZV9zdGFydF9zZXNzaW9uKG5ld19wZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVlcl9yZWFkeV9wcm9taXNlKSk7Ci0gIC8vIElmIGF1ZGlvIHdhcyBzdHJlYW1pbmcgYmVmb3JlLCBET04nVCBzdGFydCBhdWRpbyBzdHJlYW1pbmcsIGJ1dCBsZWF2ZSB0aGUKLSAgLy8gY29udHJvbCB0byB0aGUgYXVkaW8gSEFMLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBidGlmX2EyZHBfc291cmNlX2VuZF9zZXNzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBMT0dfSU5GTygiJXM6IHBlZXJfYWRkcmVzcz0lcyBzdGF0ZT0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZidGlmX2EyZHBfc291cmNlX2VuZF9zZXNzaW9uX2RlbGF5ZWQsIHBlZXJfYWRkcmVzcykpOwotICBidGlmX2EyZHBfc291cmNlX2NsZWFudXBfY29kZWMoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2VfZW5kX3Nlc3Npb25fZGVsYXllZCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgTE9HX0lORk8oIiVzOiBwZWVyX2FkZHJlc3M9JXMgc3RhdGU9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotICBpZiAoKGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGUoKSA9PSBCdGlmQTJkcFNvdXJjZTo6a1N0YXRlUnVubmluZykgfHwKLSAgICAgIChidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlKCkgPT0gQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZVNodXR0aW5nRG93bikpIHsKLSAgICBidGlmX2F2X3N0cmVhbV9zdG9wKHBlZXJfYWRkcmVzcyk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCIlczogQTJEUCBTb3VyY2UgbWVkaWEgdGFzayBpcyBub3QgcnVubmluZyIsIF9fZnVuY19fKTsKLSAgfQotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjplbmRfc2Vzc2lvbigpOwotICAgIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25FbmQoCi0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpESVNDT05ORUNUX1JFQVNPTl9VTktOT1dOLCAwKTsKLSAgfSBlbHNlIHsKLSAgICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uRW5kKAotICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6RElTQ09OTkVDVF9SRUFTT05fVU5LTk9XTiwgMCk7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2EyZHBfc291cmNlX3NodXRkb3duKHZvaWQpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lcyIsIF9fZnVuY19fLCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0KLSAgaWYgKChidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlKCkgPT0gQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZU9mZikgfHwKLSAgICAgIChidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlKCkgPT0gQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZVNodXR0aW5nRG93bikpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBNYWtlIHN1cmUgbm8gY2hhbm5lbHMgYXJlIHJlc3RhcnRlZCB3aGlsZSBzaHV0dGluZyBkb3duICovCi0gIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU2V0U3RhdGUoQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZVNodXR0aW5nRG93bik7Ci0KLSAgYnRpZl9hMmRwX3NvdXJjZV90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9hMmRwX3NvdXJjZV9zaHV0ZG93bl9kZWxheWVkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2h1dGRvd25fZGVsYXllZCh2b2lkKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotCi0gIC8vIFN0b3AgdGhlIHRpbWVyCi0gIGJ0aWZfYTJkcF9zb3VyY2VfY2IubWVkaWFfYWxhcm0uQ2FuY2VsQW5kV2FpdCgpOwotICB3YWtlbG9ja19yZWxlYXNlKCk7Ci0KLSAgaWYgKGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6Y2xlYW51cCgpOwotICB9IGVsc2UgewotICAgIGJ0aWZfYTJkcF9jb250cm9sX2NsZWFudXAoKTsKLSAgfQotICBmaXhlZF9xdWV1ZV9mcmVlKGJ0aWZfYTJkcF9zb3VyY2VfY2IudHhfYXVkaW9fcXVldWUsIG51bGxwdHIpOwotICBidGlmX2EyZHBfc291cmNlX2NiLnR4X2F1ZGlvX3F1ZXVlID0gbnVsbHB0cjsKLQotICBidGlmX2EyZHBfc291cmNlX2NiLlNldFN0YXRlKEJ0aWZBMmRwU291cmNlOjprU3RhdGVPZmYpOwotfQotCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2VfY2xlYW51cCh2b2lkKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgc291cmNlIGlzIHNodXRkb3duCi0gIGJ0aWZfYTJkcF9zb3VyY2Vfc2h1dGRvd24oKTsKLQotICBidGlmX2EyZHBfc291cmNlX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGlmX2EyZHBfc291cmNlX2NsZWFudXBfZGVsYXllZCkpOwotCi0gIC8vIEV4aXQgdGhlIHRocmVhZAotICBidGlmX2EyZHBfc291cmNlX3RocmVhZC5TaHV0RG93bigpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2NsZWFudXBfZGVsYXllZCh2b2lkKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotICAvLyBOb3RoaW5nIHRvIGRvCi19Ci0KLWJvb2wgYnRpZl9hMmRwX3NvdXJjZV9tZWRpYV90YXNrX2lzX3J1bm5pbmcodm9pZCkgewotICByZXR1cm4gKGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGUoKSA9PSBCdGlmQTJkcFNvdXJjZTo6a1N0YXRlUnVubmluZyk7Ci19Ci0KLWJvb2wgYnRpZl9hMmRwX3NvdXJjZV9tZWRpYV90YXNrX2lzX3NodXR0aW5nX2Rvd24odm9pZCkgewotICByZXR1cm4gKGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGUoKSA9PSBCdGlmQTJkcFNvdXJjZTo6a1N0YXRlU2h1dHRpbmdEb3duKTsKLX0KLQotYm9vbCBidGlmX2EyZHBfc291cmNlX2lzX3N0cmVhbWluZyh2b2lkKSB7Ci0gIHJldHVybiBidGlmX2EyZHBfc291cmNlX2NiLm1lZGlhX2FsYXJtLklzU2NoZWR1bGVkKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0dXBfY29kZWMoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIExPR19JTkZPKCIlczogcGVlcl9hZGRyZXNzPSVzIHN0YXRlPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKS5jX3N0cigpKTsKLQotICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBsYXRmb3JtIGhhcyA4IGJpdHMvYnl0ZSBzaW5jZQotICAvLyB3ZSdyZSB1c2luZyB0aGF0IGluIGZyYW1lIHNpemUgY2FsY3VsYXRpb25zIG5vdy4KLSAgQ0hFQ0soQ0hBUl9CSVQgPT0gOCk7Ci0KLSAgYnRpZl9hMmRwX3NvdXJjZV9hdWRpb190eF9mbHVzaF9yZXEoKTsKLSAgYnRpZl9hMmRwX3NvdXJjZV90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJmJ0aWZfYTJkcF9zb3VyY2Vfc2V0dXBfY29kZWNfZGVsYXllZCwgcGVlcl9hZGRyZXNzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0dXBfY29kZWNfZGVsYXllZCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgTE9HX0lORk8oIiVzOiBwZWVyX2FkZHJlc3M9JXMgc3RhdGU9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotCi0gIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwZWVyX3BhcmFtczsKLSAgYnRhX2F2X2NvX2dldF9wZWVyX3BhcmFtcyhwZWVyX2FkZHJlc3MsICZwZWVyX3BhcmFtcyk7Ci0KLSAgaWYgKCFidGFfYXZfY29fc2V0X2FjdGl2ZV9wZWVyKHBlZXJfYWRkcmVzcykpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBDYW5ub3Qgc3RyZWFtIGF1ZGlvOiBjYW5ub3Qgc2V0IGFjdGl2ZSBwZWVyIHRvICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlID0gYnRhX2F2X2NvX2dldF9lbmNvZGVyX2ludGVyZmFjZSgpOwotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogQ2Fubm90IHN0cmVhbSBhdWRpbzogbm8gc291cmNlIGVuY29kZXIgaW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcgPSBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYygpOwotICBpZiAoYTJkcF9jb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgIExPR19FUlJPUigiJXM6IENhbm5vdCBzdHJlYW0gYXVkaW86IGN1cnJlbnQgY29kZWMgaXMgbm90IHNldCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlLT5lbmNvZGVyX2luaXQoCi0gICAgICAmcGVlcl9wYXJhbXMsIGEyZHBfY29kZWNfY29uZmlnLCBidGlmX2EyZHBfc291cmNlX3JlYWRfY2FsbGJhY2ssCi0gICAgICBidGlmX2EyZHBfc291cmNlX2VucXVldWVfY2FsbGJhY2spOwotCi0gIC8vIFNhdmUgYSBsb2NhbCBjb3B5IG9mIHRoZSBlbmNvZGVyX2ludGVydmFsX21zCi0gIGJ0aWZfYTJkcF9zb3VyY2VfY2IuZW5jb2Rlcl9pbnRlcnZhbF9tcyA9Ci0gICAgICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlLT5nZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcygpOwotCi0gIGlmIChibHVldG9vdGg6OmF1ZGlvOjphMmRwOjppc19oYWxfMl8wX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OnNldHVwX2NvZGVjKCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9jbGVhbnVwX2NvZGVjKCkgewotICBMT0dfSU5GTygiJXM6IHN0YXRlPSVzIiwgX19mdW5jX18sIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKS5jX3N0cigpKTsKLSAgaWYgKGJ0aWZfYTJkcF9zb3VyY2VfaXNfc3RyZWFtaW5nKCkpIHsKLSAgICAvLyBNdXN0IHN0b3AgbWVkaWEgdGFzayBmaXJzdCBiZWZvcmUgY2xlYW5pbmcgdXAgdGhlIGVuY29kZXIKLSAgICBidGlmX2EyZHBfc291cmNlX3N0b3BfYXVkaW9fcmVxKCk7Ci0gIH0KLSAgYnRpZl9hMmRwX3NvdXJjZV90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9hMmRwX3NvdXJjZV9jbGVhbnVwX2NvZGVjX2RlbGF5ZWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9jbGVhbnVwX2NvZGVjX2RlbGF5ZWQoKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZS0+ZW5jb2Rlcl9jbGVhbnVwKCk7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2EyZHBfc291cmNlX3N0YXJ0X2F1ZGlvX3JlcSh2b2lkKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotCi0gIGJ0aWZfYTJkcF9zb3VyY2VfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0aWZfYTJkcF9zb3VyY2VfYXVkaW9fdHhfc3RhcnRfZXZlbnQpKTsKLX0KLQotdm9pZCBidGlmX2EyZHBfc291cmNlX3N0b3BfYXVkaW9fcmVxKHZvaWQpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lcyIsIF9fZnVuY19fLCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0KLSAgYnRpZl9hMmRwX3NvdXJjZV90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9hMmRwX3NvdXJjZV9hdWRpb190eF9zdG9wX2V2ZW50KSk7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9yZXEoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGNvZGVjX3VzZXJfcHJlZmVyZW5jZXMsCi0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcGVlcl9hZGRyZXNzPSIgPDwgcGVlcl9hZGRyZXNzCi0gICAgICAgICAgICA8PCAiIHN0YXRlPSIgPDwgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpIDw8ICIgIgotICAgICAgICAgICAgPDwgY29kZWNfdXNlcl9wcmVmZXJlbmNlcy5zaXplKCkgPDwgIiBjb2RlY19wcmVmZXJlbmNlKHMpIjsKLSAgaWYgKCFidGlmX2EyZHBfc291cmNlX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmYnRpZl9hMmRwX3NvdXJjZV9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MsIGNvZGVjX3VzZXJfcHJlZmVyZW5jZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBlZXJfcmVhZHlfcHJvbWlzZSkpKSkgewotICAgIC8vIGNhbm5vdCBzZXQgcHJvbWlzZSBidXQgdHJpZ2dlcnMgY3Jhc2gKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IHBlZXJfYWRkcmVzcz0iIDw8IHBlZXJfYWRkcmVzcwotICAgICAgICAgICAgICAgPDwgIiBzdGF0ZT0iIDw8IGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKQotICAgICAgICAgICAgICAgPDwgIiBmYWlscyB0byBjb250ZXh0IHN3aXRjaCI7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9ldmVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfdXNlcl9wcmVmZXJlbmNlcywKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKSB7Ci0gIGJvb2wgcmVzdGFydF9vdXRwdXQgPSBmYWxzZTsKLSAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0gIGZvciAoYXV0byBjb2RlY191c2VyX2NvbmZpZyA6IGNvZGVjX3VzZXJfcHJlZmVyZW5jZXMpIHsKLSAgICBzdWNjZXNzID0gYnRhX2F2X2NvX3NldF9jb2RlY191c2VyX2NvbmZpZyhwZWVyX2FkZHJlc3MsIGNvZGVjX3VzZXJfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0YXJ0X291dHB1dCk7Ci0gICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZWVyX2FkZHJlc3M9IiA8PCBwZWVyX2FkZHJlc3MKLSAgICAgICAgICAgICAgICA8PCAiIHN0YXRlPSIgPDwgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpCi0gICAgICAgICAgICAgICAgPDwgIiBjb2RlY19wcmVmZXJlbmNlPXsiIDw8IGNvZGVjX3VzZXJfY29uZmlnLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICA8PCAifSByZXN0YXJ0X291dHB1dD0iIDw8IChyZXN0YXJ0X291dHB1dCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChzdWNjZXNzICYmIHJlc3RhcnRfb3V0cHV0KSB7Ci0gICAgLy8gQ29kZWMgcmVjb25maWd1cmF0aW9uIGlzIGluIHByb2dyZXNzLCBhbmQgaXQgaXMgc2FmZSB0byB1bmxvY2sgc2luY2UKLSAgICAvLyByZW1haW5pbmcgdGFza3MgbGlrZSBzdGFydGluZyBhdWRpbyBzZXNzaW9uIGFuZCByZXBvcnRpbmcgbmV3IGNvZGVjCi0gICAgLy8gd2lsbCBiZSBoYW5kbGVkIGJ5IEJUQV9BVl9SRUNPTkZJR19FVlQgbGF0ZXIuCi0gICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNhbm5vdCB1cGRhdGUgY29kZWMgdXNlciBjb25maWd1cmF0aW9uKHMpIjsKLSAgfQotICBpZiAoIXBlZXJfYWRkcmVzcy5Jc0VtcHR5KCkgJiYgcGVlcl9hZGRyZXNzID09IGJ0aWZfYXZfc291cmNlX2FjdGl2ZV9wZWVyKCkpIHsKLSAgICAvLyBObyBtb3JlIGFjdGlvbnMgbmVlZGVkIHdpdGggcmVtb3RlLCBhbmQgaWYgc3VjY2VlZCwgdXNlciBoYWQgY2hhbmdlZCB0aGUKLSAgICAvLyBjb25maWcgbGlrZSB0aGUgYml0cyBwZXIgc2FtcGxlIG9ubHkuIExldCdzIHJlc3VtZSB0aGUgc2Vzc2lvbiBub3cuCi0gICAgYnRpZl9hMmRwX3NvdXJjZV9zdGFydF9zZXNzaW9uKHBlZXJfYWRkcmVzcywgc3RkOjptb3ZlKHBlZXJfcmVhZHlfcHJvbWlzZSkpOwotICB9IGVsc2UgewotICAgIC8vIFVubG9jayBmb3Igbm9uLWFjdGl2ZSBwZWVyCi0gICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9mZWVkaW5nX3VwZGF0ZV9yZXEoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19hdWRpb19jb25maWcpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lcyIsIF9fZnVuY19fLCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0aWZfYTJkcF9zb3VyY2VfYXVkaW9fZmVlZGluZ191cGRhdGVfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfYXVkaW9fY29uZmlnKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYTJkcF9zb3VyY2VfYXVkaW9fZmVlZGluZ191cGRhdGVfZXZlbnQoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19hdWRpb19jb25maWcpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lcyIsIF9fZnVuY19fLCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0gIGlmICghYnRhX2F2X2NvX3NldF9jb2RlY19hdWRpb19jb25maWcoY29kZWNfYXVkaW9fY29uZmlnKSkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCB1cGRhdGUgY29kZWMgYXVkaW8gZmVlZGluZyBwYXJhbWV0ZXJzIiwgX19mdW5jX18pOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9vbl9pZGxlKHZvaWQpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lcyIsIF9fZnVuY19fLCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0gIGlmIChidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlKCkgPT0gQnRpZkEyZHBTb3VyY2U6OmtTdGF0ZU9mZikgcmV0dXJuOwotCi0gIC8qIE1ha2Ugc3VyZSBtZWRpYSB0YXNrIGlzIHN0b3BwZWQgKi8KLSAgYnRpZl9hMmRwX3NvdXJjZV9zdG9wX2F1ZGlvX3JlcSgpOwotfQotCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfb25fc3RvcHBlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCkgewotICBMT0dfSU5GTygiJXM6IHN0YXRlPSVzIiwgX19mdW5jX18sIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKS5jX3N0cigpKTsKLQotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZSgpID09IEJ0aWZBMmRwU291cmNlOjprU3RhdGVPZmYpIHJldHVybjsKLQotICAvLyBhbGxvdyB1c2luZyB0aGlzIEFQSSBmb3Igb3RoZXIgKGFja25vd2xlZGdlbWVudCBhbmQgc3RvcHBpbmcgbWVkaWEgdGFzaykKLSAgLy8gdGhhbiBzdXNwZW5kCi0gIGlmIChwX2F2X3N1c3BlbmQgIT0gbnVsbHB0ciAmJiBwX2F2X3N1c3BlbmQtPnN0YXR1cyAhPSBCVEFfQVZfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IEEyRFAgc3RvcCBmYWlsZWQ6IHN0YXR1cz0lZCwgaW5pdGlhdG9yPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHBfYXZfc3VzcGVuZC0+c3RhdHVzLAotICAgICAgICAgICAgICAocF9hdl9zdXNwZW5kLT5pbml0aWF0b3IgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gICAgaWYgKHBfYXZfc3VzcGVuZC0+aW5pdGlhdG9yKSB7Ci0gICAgICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6YWNrX3N0cmVhbV9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0aWZfYTJkcF9jb21tYW5kX2FjayhBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIChidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGVuc3VyZSB0eCBmcmFtZXMgYXJlIGltbWVkaWF0ZWx5IHN1c3BlbmRlZAotICBidGlmX2EyZHBfc291cmNlX2NiLnR4X2ZsdXNoID0gdHJ1ZTsKLSAgLy8gZW5zdXJlIHR4IGZyYW1lcyBhcmUgaW1tZWRpYXRlbHkgZmx1c2hlZAotICBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3R4X2ZsdXNoX3JlcSgpOwotCi0gIC8vIHJlcXVlc3QgdG8gc3RvcCBtZWRpYSB0YXNrCi0gIGJ0aWZfYTJkcF9zb3VyY2Vfc3RvcF9hdWRpb19yZXEoKTsKLQotICAvLyBvbmNlIHNvZnR3YXJlIHN0cmVhbSBpcyBmdWxseSBzdG9wcGVkIHdlIHdpbGwgYWNrIGJhY2sKLX0KLQotdm9pZCBidGlmX2EyZHBfc291cmNlX29uX3N1c3BlbmRlZCh0QlRBX0FWX1NVU1BFTkQqIHBfYXZfc3VzcGVuZCkgewotICBMT0dfSU5GTygiJXM6IHN0YXRlPSVzIiwgX19mdW5jX18sIGJ0aWZfYTJkcF9zb3VyY2VfY2IuU3RhdGVTdHIoKS5jX3N0cigpKTsKLQotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZSgpID09IEJ0aWZBMmRwU291cmNlOjprU3RhdGVPZmYpIHJldHVybjsKLQotICBDSEVDSyhwX2F2X3N1c3BlbmQgIT0gbnVsbHB0cikgPDwgIlN1c3BlbmQgcmVzdWx0IGNvdWxkIG5vdCBiZSBudWxscHRyIjsKLQotICAvLyBjaGVjayBmb3Igc3RhdHVzIGZhaWx1cmVzCi0gIGlmIChwX2F2X3N1c3BlbmQtPnN0YXR1cyAhPSBCVEFfQVZfU1VDQ0VTUykgewotICAgIExPR19XQVJOKCIlczogQTJEUCBzdXNwZW5kIGZhaWxlZDogc3RhdHVzPSVkLCBpbml0aWF0b3I9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICBwX2F2X3N1c3BlbmQtPnN0YXR1cywKLSAgICAgICAgICAgICAocF9hdl9zdXNwZW5kLT5pbml0aWF0b3IgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gICAgaWYgKHBfYXZfc3VzcGVuZC0+aW5pdGlhdG9yKSB7Ci0gICAgICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6YWNrX3N0cmVhbV9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0aWZfYTJkcF9jb21tYW5kX2FjayhBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIChidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGVuc3VyZSB0eCBmcmFtZXMgYXJlIGltbWVkaWF0ZWx5IHN1c3BlbmRlZAotICBidGlmX2EyZHBfc291cmNlX2NiLnR4X2ZsdXNoID0gdHJ1ZTsKLQotICAvLyBzdG9wIHRpbWVyIHRpY2sKLSAgYnRpZl9hMmRwX3NvdXJjZV9zdG9wX2F1ZGlvX3JlcSgpOwotCi0gIC8vIG9uY2Ugc29mdHdhcmUgc3RyZWFtIGlzIGZ1bGx5IHN0b3BwZWQgd2Ugd2lsbCBhY2sgYmFjawotfQotCi0vKiB3aGVuIHRydWUgbWVkaWEgdGFzayBkaXNjYXJkcyBhbnkgdHggZnJhbWVzICovCi12b2lkIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0X3R4X2ZsdXNoKGJvb2wgZW5hYmxlKSB7Ci0gIExPR19JTkZPKCIlczogZW5hYmxlPSVzIHN0YXRlPSVzIiwgX19mdW5jX18sIChlbmFibGUpID8gInRydWUiIDogImZhbHNlIiwKLSAgICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotICBidGlmX2EyZHBfc291cmNlX2NiLnR4X2ZsdXNoID0gZW5hYmxlOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3R4X3N0YXJ0X2V2ZW50KHZvaWQpIHsKLSAgTE9HX0lORk8oCi0gICAgICAiJXM6IG1lZGlhX2FsYXJtIGlzICVzLCBzdHJlYW1pbmcgJXMgc3RhdGU9JXMiLCBfX2Z1bmNfXywKLSAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2IubWVkaWFfYWxhcm0uSXNTY2hlZHVsZWQoKSA/ICJydW5uaW5nIiA6ICJzdG9wcGVkIiwKLSAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfaXNfc3RyZWFtaW5nKCkgPyAidHJ1ZSIgOiAiZmFsc2UiLAotICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotCi0gIGlmIChidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHJldHVybjsKLQotICAvKiBSZXNldCB0aGUgbWVkaWEgZmVlZGluZyBzdGF0ZSAqLwotICBDSEVDSyhidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlICE9IG51bGxwdHIpOwotICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlLT5mZWVkaW5nX3Jlc2V0KCk7Ci0KLSAgQVBQTF9UUkFDRV9FVkVOVCgKLSAgICAgICIlczogc3RhcnRpbmcgdGltZXIgJSIgUFJJdTY0ICIgbXMiLCBfX2Z1bmNfXywKLSAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2IuZW5jb2Rlcl9pbnRlcmZhY2UtPmdldF9lbmNvZGVyX2ludGVydmFsX21zKCkpOwotCi0gIC8qIGF1ZGlvIGVuZ2luZSBzdGFydGluZywgcmVzZXQgdHggc3VzcGVuZGVkIGZsYWcgKi8KLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9mbHVzaCA9IGZhbHNlOwotCi0gIHdha2Vsb2NrX2FjcXVpcmUoKTsKLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5tZWRpYV9hbGFybS5TY2hlZHVsZVBlcmlvZGljKAotICAgICAgYnRpZl9hMmRwX3NvdXJjZV90aHJlYWQuR2V0V2Vha1B0cigpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZidGlmX2EyZHBfc291cmNlX2F1ZGlvX2hhbmRsZV90aW1lciksCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCi0gICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZS0+Z2V0X2VuY29kZXJfaW50ZXJ2YWxfbXMoKSkpOwotCi0gIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMuUmVzZXQoKTsKLSAgLy8gQXNzaWduIHNlc3Npb25fc3RhcnRfdXMgdG8gMSB3aGVuCi0gIC8vIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpIGlzIDAgdG8gaW5kaWNhdGUKLSAgLy8gYnRpZl9hMmRwX3NvdXJjZV9zdGFydF9hdWRpb19yZXEoKSBoYXMgYmVlbiBjYWxsZWQKLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy5zZXNzaW9uX3N0YXJ0X3VzID0KLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICBpZiAoYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy5zZXNzaW9uX3N0YXJ0X3VzID09IDApIHsKLSAgICBidGlmX2EyZHBfc291cmNlX2NiLnN0YXRzLnNlc3Npb25fc3RhcnRfdXMgPSAxOwotICB9Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMuc2Vzc2lvbl9lbmRfdXMgPSAwOwotICBBMmRwQ29kZWNDb25maWcqIGNvZGVjX2NvbmZpZyA9IGJ0YV9hdl9nZXRfYTJkcF9jdXJyZW50X2NvZGVjKCk7Ci0gIGlmIChjb2RlY19jb25maWcgIT0gbnVsbHB0cikgewotICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMuY29kZWNfaW5kZXggPSBjb2RlY19jb25maWctPmNvZGVjSW5kZXgoKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3R4X3N0b3BfZXZlbnQodm9pZCkgewotICBMT0dfSU5GTygKLSAgICAgICIlczogbWVkaWFfYWxhcm0gaXMgJXMsIHN0cmVhbWluZyAlcyBzdGF0ZT0lcyIsIF9fZnVuY19fLAotICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5tZWRpYV9hbGFybS5Jc1NjaGVkdWxlZCgpID8gInJ1bm5pbmciIDogInN0b3BwZWQiLAotICAgICAgYnRpZl9hMmRwX3NvdXJjZV9pc19zdHJlYW1pbmcoKSA/ICJ0cnVlIiA6ICJmYWxzZSIsCi0gICAgICBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0KLSAgaWYgKGJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX3J1bm5pbmcoKSkgcmV0dXJuOwotCi0gIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMuc2Vzc2lvbl9lbmRfdXMgPQotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfdXBkYXRlX21ldHJpY3MoKTsKLSAgYnRpZl9hMmRwX3NvdXJjZV9hY2N1bXVsYXRlX3N0YXRzKCZidGlmX2EyZHBfc291cmNlX2NiLnN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ0aWZfYTJkcF9zb3VyY2VfY2IuYWNjdW11bGF0ZWRfc3RhdHMpOwotCi0gIHVpbnQ4X3QgcF9idWZbQVVESU9fU1RSRUFNX09VVFBVVF9CVUZGRVJfU1ogKiAyXTsKLQotICAvLyBLZWVwIHRyYWNrIG9mIGF1ZGlvIGRhdGEgc3RpbGwgbGVmdCBpbiB0aGUgcGlwZQotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBidGlmX2EyZHBfY29udHJvbF9sb2dfYnl0ZXNfcmVhZCgKLSAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6cmVhZChwX2J1Ziwgc2l6ZW9mKHBfYnVmKSkpOwotICB9IGVsc2UgaWYgKGEyZHBfdWlwYyAhPSBudWxscHRyKSB7Ci0gICAgYnRpZl9hMmRwX2NvbnRyb2xfbG9nX2J5dGVzX3JlYWQoCi0gICAgICAgIFVJUENfUmVhZCgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBwX2J1Ziwgc2l6ZW9mKHBfYnVmKSkpOwotICB9Ci0KLSAgLyogU3RvcCB0aGUgdGltZXIgZmlyc3QgKi8KLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5tZWRpYV9hbGFybS5DYW5jZWxBbmRXYWl0KCk7Ci0gIHdha2Vsb2NrX3JlbGVhc2UoKTsKLQotICBpZiAoYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6aXNfaGFsXzJfMF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICB9IGVsc2UgaWYgKGEyZHBfdWlwYyAhPSBudWxscHRyKSB7Ci0gICAgVUlQQ19DbG9zZSgqYTJkcF91aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPKTsKLQotICAgIC8qCi0gICAgICogVHJ5IHRvIHNlbmQgYWNrbm93bGVkZ2VtZW50IG9uY2UgdGhlIG1lZGlhIHN0cmVhbSBpcwotICAgICAqIHN0b3BwZWQuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgQTJEUCBIQUwgbGF5ZXIgaXMKLSAgICAgKiB1bi1ibG9ja2VkIG9uIHdhaXQgZm9yIGFja25vd2xlZGdtZW50IGZvciB0aGUgc2VudCBjb21tYW5kLgotICAgICAqIFRoaXMgcmVzb2x2ZXMgYSBjb3JuZXIgY2FzZXMgQVZEVFAgU1VTUEVORCBjb2xsaXNpb24KLSAgICAgKiB3aGVuIHRoZSBEVVQgYW5kIHRoZSByZW1vdGUgZGV2aWNlIGlzc3VlIFNVU1BFTkQgc2ltdWx0YW5lb3VzbHkKLSAgICAgKiBhbmQgZHVlIHRvIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBTVVNQRU5EIHJlcXVlc3QgZnJvbSB0aGUgcmVtb3RlLAotICAgICAqIHRoZSBtZWRpYSBwYXRoIGlzIHRvcm4gZG93bi4gSWYgdGhlIEEyRFAgSEFMIGhhcHBlbnMgdG8gd2FpdAotICAgICAqIGZvciBBQ0sgZm9yIHRoZSBpbml0aWF0ZWQgU1VTUEVORCwgaXQgd291bGQgbmV2ZXIgcmVjZWl2ZSBpdCBjYXN1aW5nCi0gICAgICogYSBibG9jay93YWl0LiBEdWUgdG8gdGhpcyBhY2tub3dsZWRnZW1lbnQsIHRoZSBBMkRQIEhBTCBpcyBndXJhbnRlZWQKLSAgICAgKiB0byBnZXQgdGhlIEFDSyBmb3IgYW55IHBlbmRpbmcgY29tbWFuZCBpbiBzdWNoIGNhc2VzLgotICAgICAqLwotCi0gICAgYnRpZl9hMmRwX2NvbW1hbmRfYWNrKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gIH0KLQotICAvKiBhdWRpbyBlbmdpbmUgc3RvcHBlZCwgcmVzZXQgdHggc3VzcGVuZGVkIGZsYWcgKi8KLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9mbHVzaCA9IGZhbHNlOwotCi0gIC8qIFJlc2V0IHRoZSBtZWRpYSBmZWVkaW5nIHN0YXRlICovCi0gIGlmIChidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlICE9IG51bGxwdHIpCi0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZS0+ZmVlZGluZ19yZXNldCgpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2F1ZGlvX2hhbmRsZV90aW1lcih2b2lkKSB7Ci0gIGlmIChidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkpIHJldHVybjsKLQotICB1aW50NjRfdCB0aW1lc3RhbXBfdXMgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgbG9nX3RzdGFtcHNfdXMoIkEyRFAgU291cmNlIHR4IHRpbWVyIiwgdGltZXN0YW1wX3VzKTsKLQotICBpZiAoIWJ0aWZfYTJkcF9zb3VyY2VfY2IubWVkaWFfYWxhcm0uSXNTY2hlZHVsZWQoKSkgewotICAgIExPR19FUlJPUigiJXM6IEVSUk9SIE1lZGlhIHRhc2sgU2NoZWR1bGVkIGFmdGVyIFN1c3BlbmQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENIRUNLKGJ0aWZfYTJkcF9zb3VyY2VfY2IuZW5jb2Rlcl9pbnRlcmZhY2UgIT0gbnVsbHB0cik7Ci0gIHNpemVfdCB0cmFuc21pdF9xdWV1ZV9sZW5ndGggPQotICAgICAgZml4ZWRfcXVldWVfbGVuZ3RoKGJ0aWZfYTJkcF9zb3VyY2VfY2IudHhfYXVkaW9fcXVldWUpOwotI2lmbmRlZiBPU19HRU5FUklDCi0gIEFUUkFDRV9JTlQoImJ0aWYgVFggcXVldWUiLCB0cmFuc21pdF9xdWV1ZV9sZW5ndGgpOwotI2VuZGlmCi0gIGlmIChidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlLT5zZXRfdHJhbnNtaXRfcXVldWVfbGVuZ3RoICE9Ci0gICAgICBudWxscHRyKSB7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVyZmFjZS0+c2V0X3RyYW5zbWl0X3F1ZXVlX2xlbmd0aCgKLSAgICAgICAgdHJhbnNtaXRfcXVldWVfbGVuZ3RoKTsKLSAgfQotICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlLT5zZW5kX2ZyYW1lcyh0aW1lc3RhbXBfdXMpOwotICBidGFfYXZfY2lfc3JjX2RhdGFfcmVhZHkoQlRBX0FWX0NITkxfQVVESU8pOwotICB1cGRhdGVfc2NoZWR1bGluZ19zdGF0cygmYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy50eF9xdWV1ZV9lbnF1ZXVlX3N0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2IuZW5jb2Rlcl9pbnRlcnZhbF9tcyAqIDEwMDApOwotfQotCi1zdGF0aWMgdWludDMyX3QgYnRpZl9hMmRwX3NvdXJjZV9yZWFkX2NhbGxiYWNrKHVpbnQ4X3QqIHBfYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IDA7Ci0KLSAgaWYgKGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgYnl0ZXNfcmVhZCA9IGJsdWV0b290aDo6YXVkaW86OmEyZHA6OnJlYWQocF9idWYsIGxlbik7Ci0gIH0gZWxzZSBpZiAoYTJkcF91aXBjICE9IG51bGxwdHIpIHsKLSAgICBieXRlc19yZWFkID0gVUlQQ19SZWFkKCphMmRwX3VpcGMsIFVJUENfQ0hfSURfQVZfQVVESU8sIHBfYnVmLCBsZW4pOwotICB9Ci0KLSAgaWYgKGJ5dGVzX3JlYWQgPCBsZW4pIHsKLSAgICBMT0dfV0FSTigiJXM6IFVOREVSRkxPVzogT05MWSBSRUFEICVkIEJZVEVTIE9VVCBPRiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgIGJ5dGVzX3JlYWQsIGxlbik7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlcyArPQotICAgICAgICAobGVuIC0gYnl0ZXNfcmVhZCk7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19jb3VudCsrOwotICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMubWVkaWFfcmVhZF9sYXN0X3VuZGVyZmxvd191cyA9Ci0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICAgIGxvZ19hMmRwX2F1ZGlvX3VuZGVycnVuX2V2ZW50KGJ0aWZfYXZfc291cmNlX2FjdGl2ZV9wZWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ5dGVzX3JlYWQpOwotICB9Ci0KLSAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci19Ci0KLXN0YXRpYyBib29sIGJ0aWZfYTJkcF9zb3VyY2VfZW5xdWV1ZV9jYWxsYmFjayhCVF9IRFIqIHBfYnVmLCBzaXplX3QgZnJhbWVzX24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNfcmVhZCkgewotICB1aW50NjRfdCBub3dfdXMgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgYnRpZl9hMmRwX2NvbnRyb2xfbG9nX2J5dGVzX3JlYWQoYnl0ZXNfcmVhZCk7Ci0KLSAgLyogQ2hlY2sgaWYgdGltZXIgd2FzIHN0b3BwZWQgKG1lZGlhIHRhc2sgc3RvcHBlZCkgKi8KLSAgaWYgKCFidGlmX2EyZHBfc291cmNlX2NiLm1lZGlhX2FsYXJtLklzU2NoZWR1bGVkKCkpIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgdGhlIHRyYW5zbWlzc2lvbiBxdWV1ZSBoYXMgYmVlbiBmbHVzaGVkICovCi0gIGlmIChidGlmX2EyZHBfc291cmNlX2NiLnR4X2ZsdXNoKSB7Ci0gICAgTE9HX1ZFUkJPU0UoIiVzOiB0eCBzdXNwZW5kZWQsIGRpc2NhcmRlZCBmcmFtZSIsIF9fZnVuY19fKTsKLQotICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMudHhfcXVldWVfdG90YWxfZmx1c2hlZF9tZXNzYWdlcyArPQotICAgICAgICBmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9hdWRpb19xdWV1ZSk7Ci0gICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy50eF9xdWV1ZV9sYXN0X2ZsdXNoZWRfdXMgPSBub3dfdXM7Ci0gICAgZml4ZWRfcXVldWVfZmx1c2goYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9hdWRpb19xdWV1ZSwgb3NpX2ZyZWUpOwotCi0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBUWCBxdWV1ZSBvdmVyZmxvdwotICAvLyBUT0RPOiBVc2luZyBmcmFtZXNfbiBoZXJlIGlzIHByb2JhYmx5IHdyb25nOiBzaG91bGQgYmUgIisgMSIgaW5zdGVhZC4KLSAgaWYgKGZpeGVkX3F1ZXVlX2xlbmd0aChidGlmX2EyZHBfc291cmNlX2NiLnR4X2F1ZGlvX3F1ZXVlKSArIGZyYW1lc19uID4KLSAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSkgewotICAgIExPR19XQVJOKCIlczogVFggcXVldWUgYnVmZmVyIHNpemUgbm93PSV1IGFkZGluZz0ldSBtYXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAodWludDMyX3QpZml4ZWRfcXVldWVfbGVuZ3RoKGJ0aWZfYTJkcF9zb3VyY2VfY2IudHhfYXVkaW9fcXVldWUpLAotICAgICAgICAgICAgICh1aW50MzJfdClmcmFtZXNfbiwgYnRpZl9hMmRwX3NvdXJjZV9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplKTsKLSAgICAvLyBLZWVwIHRyYWNrIG9mIGRyb3Atb3V0cwotICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMudHhfcXVldWVfZHJvcG91dHMrKzsKLSAgICBidGlmX2EyZHBfc291cmNlX2NiLnN0YXRzLnR4X3F1ZXVlX2xhc3RfZHJvcG91dHNfdXMgPSBub3dfdXM7Ci0KLSAgICAvLyBGbHVzaCBhbGwgcXVldWVkIGJ1ZmZlcnMKLSAgICBzaXplX3QgZHJvcF9uID0gZml4ZWRfcXVldWVfbGVuZ3RoKGJ0aWZfYTJkcF9zb3VyY2VfY2IudHhfYXVkaW9fcXVldWUpOwotICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMudHhfcXVldWVfbWF4X2Ryb3BwZWRfbWVzc2FnZXMgPSBzdGQ6Om1heCgKLSAgICAgICAgZHJvcF9uLCBidGlmX2EyZHBfc291cmNlX2NiLnN0YXRzLnR4X3F1ZXVlX21heF9kcm9wcGVkX21lc3NhZ2VzKTsKLSAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyA9IDA7Ci0gICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzID0gMDsKLSAgICB3aGlsZSAoZml4ZWRfcXVldWVfbGVuZ3RoKGJ0aWZfYTJkcF9zb3VyY2VfY2IudHhfYXVkaW9fcXVldWUpKSB7Ci0gICAgICBidGlmX2EyZHBfc291cmNlX2NiLnN0YXRzLnR4X3F1ZXVlX3RvdGFsX2Ryb3BwZWRfbWVzc2FnZXMrKzsKLSAgICAgIHZvaWQqIHBfZGF0YSA9Ci0gICAgICAgICAgZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9hdWRpb19xdWV1ZSk7Ci0gICAgICBpZiAocF9kYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgYXV0byBwX2Ryb3BwZWRfYnVmID0gc3RhdGljX2Nhc3Q8QlRfSERSKj4ocF9kYXRhKTsKLSAgICAgICAgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyArPSBwX2Ryb3BwZWRfYnVmLT5sZW47Ci0gICAgICAgIG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzICs9IHBfZHJvcHBlZF9idWYtPmxheWVyX3NwZWNpZmljOwotICAgICAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgICAgfQotICAgIH0KLSAgICBsb2dfYTJkcF9hdWRpb19vdmVycnVuX2V2ZW50KGJ0aWZfYXZfc291cmNlX2FjdGl2ZV9wZWVyKCksIGRyb3BfbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfY2IuZW5jb2Rlcl9pbnRlcnZhbF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyk7Ci0KLSAgICAvLyBSZXF1ZXN0IGFkZGl0aW9uYWwgZGVidWcgaW5mbyBpZiB3ZSBoYWQgdG8gZmx1c2ggYnVmZmVycwotICAgIFJhd0FkZHJlc3MgcGVlcl9iZGEgPSBidGlmX2F2X3NvdXJjZV9hY3RpdmVfcGVlcigpOwotICAgIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9SZWFkUlNTSShwZWVyX2JkYSwgYnRtX3JlYWRfcnNzaV9jYik7Ci0gICAgaWYgKHN0YXR1cyAhPSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgIExPR19XQVJOKCIlczogQ2Fubm90IHJlYWQgUlNTSTogc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgfQotICAgIHN0YXR1cyA9IEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIocGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NiKTsKLSAgICBpZiAoc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgTE9HX1dBUk4oIiVzOiBDYW5ub3QgcmVhZCBGYWlsZWQgQ29udGFjdCBDb3VudGVyOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgfQotICAgIHN0YXR1cyA9Ci0gICAgICAgIEJUTV9SZWFkVHhQb3dlcihwZWVyX2JkYSwgQlRfVFJBTlNQT1JUX0JSX0VEUiwgYnRtX3JlYWRfdHhfcG93ZXJfY2IpOwotICAgIGlmIChzdGF0dXMgIT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICBMT0dfV0FSTigiJXM6IENhbm5vdCByZWFkIFR4IFBvd2VyOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICB9Ci0gIH0KLQotICAvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgKi8KLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy50eF9xdWV1ZV90b3RhbF9mcmFtZXMgKz0gZnJhbWVzX247Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMudHhfcXVldWVfbWF4X2ZyYW1lc19wZXJfcGFja2V0ID0gc3RkOjptYXgoCi0gICAgICBmcmFtZXNfbiwgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy50eF9xdWV1ZV9tYXhfZnJhbWVzX3Blcl9wYWNrZXQpOwotICBDSEVDSyhidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlICE9IG51bGxwdHIpOwotCi0gIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9hdWRpb19xdWV1ZSwgcF9idWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3R4X2ZsdXNoX2V2ZW50KHZvaWQpIHsKLSAgLyogRmx1c2ggYWxsIGVucXVldWVkIGF1ZGlvIGJ1ZmZlcnMgKGVuY29kZWQpICovCi0gIExPR19JTkZPKCIlczogc3RhdGU9JXMiLCBfX2Z1bmNfXywgYnRpZl9hMmRwX3NvdXJjZV9jYi5TdGF0ZVN0cigpLmNfc3RyKCkpOwotICBpZiAoYnRpZl9hdl9pc19hMmRwX29mZmxvYWRfcnVubmluZygpKSByZXR1cm47Ci0KLSAgaWYgKGJ0aWZfYTJkcF9zb3VyY2VfY2IuZW5jb2Rlcl9pbnRlcmZhY2UgIT0gbnVsbHB0cikKLSAgICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJmYWNlLT5mZWVkaW5nX2ZsdXNoKCk7Ci0KLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy50eF9xdWV1ZV90b3RhbF9mbHVzaGVkX21lc3NhZ2VzICs9Ci0gICAgICBmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9hdWRpb19xdWV1ZSk7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMudHhfcXVldWVfbGFzdF9mbHVzaGVkX3VzID0KLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICBmaXhlZF9xdWV1ZV9mbHVzaChidGlmX2EyZHBfc291cmNlX2NiLnR4X2F1ZGlvX3F1ZXVlLCBvc2lfZnJlZSk7Ci0KLSAgaWYgKCFibHVldG9vdGg6OmF1ZGlvOjphMmRwOjppc19oYWxfMl8wX2VuYWJsZWQoKSAmJiBhMmRwX3VpcGMgIT0gbnVsbHB0cikgewotICAgIFVJUENfSW9jdGwoKmEyZHBfdWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTywgVUlQQ19SRVFfUlhfRkxVU0gsIG51bGxwdHIpOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGJ0aWZfYTJkcF9zb3VyY2VfYXVkaW9fdHhfZmx1c2hfcmVxKHZvaWQpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0ZT0lcyIsIF9fZnVuY19fLCBidGlmX2EyZHBfc291cmNlX2NiLlN0YXRlU3RyKCkuY19zdHIoKSk7Ci0KLSAgYnRpZl9hMmRwX3NvdXJjZV90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9hMmRwX3NvdXJjZV9hdWRpb190eF9mbHVzaF9ldmVudCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQlRfSERSKiBidGlmX2EyZHBfc291cmNlX2F1ZGlvX3JlYWRidWYodm9pZCkgewotICB1aW50NjRfdCBub3dfdXMgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgQlRfSERSKiBwX2J1ZiA9Ci0gICAgICAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShidGlmX2EyZHBfc291cmNlX2NiLnR4X2F1ZGlvX3F1ZXVlKTsKLQotICBidGlmX2EyZHBfc291cmNlX2NiLnN0YXRzLnR4X3F1ZXVlX3RvdGFsX3JlYWRidWZfY2FsbHMrKzsKLSAgYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cy50eF9xdWV1ZV9sYXN0X3JlYWRidWZfdXMgPSBub3dfdXM7Ci0gIGlmIChwX2J1ZiAhPSBudWxscHRyKSB7Ci0gICAgLy8gVXBkYXRlIHRoZSBzdGF0aXN0aWNzCi0gICAgdXBkYXRlX3NjaGVkdWxpbmdfc3RhdHMoJmJ0aWZfYTJkcF9zb3VyY2VfY2Iuc3RhdHMudHhfcXVldWVfZGVxdWV1ZV9zdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dfdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVydmFsX21zICogMTAwMCk7Ci0gIH0KLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvZ190c3RhbXBzX3VzKGNvbnN0IGNoYXIqIGNvbW1lbnQsIHVpbnQ2NF90IHRpbWVzdGFtcF91cykgewotICBzdGF0aWMgdWludDY0X3QgcHJldl91cyA9IDA7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBbJXNdIHRzICUwOCIgUFJJdTY0ICIsIGRpZmYgOiAlMDgiIFBSSXU2NAotICAgICAgICAgICAgICAgICAgICIsIHF1ZXVlIHN6ICV6dSIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbW1lbnQsIHRpbWVzdGFtcF91cywgdGltZXN0YW1wX3VzIC0gcHJldl91cywKLSAgICAgICAgICAgICAgICAgICBmaXhlZF9xdWV1ZV9sZW5ndGgoYnRpZl9hMmRwX3NvdXJjZV9jYi50eF9hdWRpb19xdWV1ZSkpOwotICBwcmV2X3VzID0gdGltZXN0YW1wX3VzOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfc2NoZWR1bGluZ19zdGF0cyhTY2hlZHVsaW5nU3RhdHMqIHN0YXRzLCB1aW50NjRfdCBub3dfdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBleHBlY3RlZF9kZWx0YSkgewotICB1aW50NjRfdCBsYXN0X3VzID0gc3RhdHMtPmxhc3RfdXBkYXRlX3VzOwotCi0gIHN0YXRzLT50b3RhbF91cGRhdGVzKys7Ci0gIHN0YXRzLT5sYXN0X3VwZGF0ZV91cyA9IG5vd191czsKLQotICBpZiAobGFzdF91cyA9PSAwKSByZXR1cm47ICAvLyBGaXJzdCB1cGRhdGU6IGV4cGVjdGVkIGRlbHRhIGRvZXNuJ3QgYXBwbHkKLQotICB1aW50NjRfdCBkZWFkbGluZV91cyA9IGxhc3RfdXMgKyBleHBlY3RlZF9kZWx0YTsKLSAgaWYgKGRlYWRsaW5lX3VzIDwgbm93X3VzKSB7Ci0gICAgLy8gT3ZlcmR1ZSBzY2hlZHVsaW5nCi0gICAgdWludDY0X3QgZGVsdGFfdXMgPSBub3dfdXMgLSBkZWFkbGluZV91czsKLSAgICAvLyBJZ25vcmUgZXh0cmVtZSBvdXRsaWVycwotICAgIGlmIChkZWx0YV91cyA8IDEwICogZXhwZWN0ZWRfZGVsdGEpIHsKLSAgICAgIHN0YXRzLT5tYXhfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzID0KLSAgICAgICAgICBzdGQ6Om1heChkZWx0YV91cywgc3RhdHMtPm1heF9vdmVyZHVlX3NjaGVkdWxpbmdfZGVsdGFfdXMpOwotICAgICAgc3RhdHMtPnRvdGFsX292ZXJkdWVfc2NoZWR1bGluZ19kZWx0YV91cyArPSBkZWx0YV91czsKLSAgICAgIHN0YXRzLT5vdmVyZHVlX3NjaGVkdWxpbmdfY291bnQrKzsKLSAgICAgIHN0YXRzLT50b3RhbF9zY2hlZHVsaW5nX3RpbWVfdXMgKz0gbm93X3VzIC0gbGFzdF91czsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoZGVhZGxpbmVfdXMgPiBub3dfdXMpIHsKLSAgICAvLyBQcmVtYXR1cmUgc2NoZWR1bGluZwotICAgIHVpbnQ2NF90IGRlbHRhX3VzID0gZGVhZGxpbmVfdXMgLSBub3dfdXM7Ci0gICAgLy8gSWdub3JlIGV4dHJlbWUgb3V0bGllcnMKLSAgICBpZiAoZGVsdGFfdXMgPCAxMCAqIGV4cGVjdGVkX2RlbHRhKSB7Ci0gICAgICBzdGF0cy0+bWF4X3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzID0KLSAgICAgICAgICBzdGQ6Om1heChkZWx0YV91cywgc3RhdHMtPm1heF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyk7Ci0gICAgICBzdGF0cy0+dG90YWxfcHJlbWF0dXJlX3NjaGVkdWxpbmdfZGVsdGFfdXMgKz0gZGVsdGFfdXM7Ci0gICAgICBzdGF0cy0+cHJlbWF0dXJlX3NjaGVkdWxpbmdfY291bnQrKzsKLSAgICAgIHN0YXRzLT50b3RhbF9zY2hlZHVsaW5nX3RpbWVfdXMgKz0gbm93X3VzIC0gbGFzdF91czsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT24tdGltZSBzY2hlZHVsaW5nCi0gICAgc3RhdHMtPmV4YWN0X3NjaGVkdWxpbmdfY291bnQrKzsKLSAgICBzdGF0cy0+dG90YWxfc2NoZWR1bGluZ190aW1lX3VzICs9IG5vd191cyAtIGxhc3RfdXM7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2EyZHBfc291cmNlX2RlYnVnX2R1bXAoaW50IGZkKSB7Ci0gIGJ0aWZfYTJkcF9zb3VyY2VfYWNjdW11bGF0ZV9zdGF0cygmYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGlmX2EyZHBfc291cmNlX2NiLmFjY3VtdWxhdGVkX3N0YXRzKTsKLSAgdWludDY0X3Qgbm93X3VzID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIEJ0aWZNZWRpYVN0YXRzKiBhY2N1bXVsYXRlZF9zdGF0cyA9ICZidGlmX2EyZHBfc291cmNlX2NiLmFjY3VtdWxhdGVkX3N0YXRzOwotICBTY2hlZHVsaW5nU3RhdHMqIGVucXVldWVfc3RhdHMgPSAmYWNjdW11bGF0ZWRfc3RhdHMtPnR4X3F1ZXVlX2VucXVldWVfc3RhdHM7Ci0gIFNjaGVkdWxpbmdTdGF0cyogZGVxdWV1ZV9zdGF0cyA9ICZhY2N1bXVsYXRlZF9zdGF0cy0+dHhfcXVldWVfZGVxdWV1ZV9zdGF0czsKLSAgc2l6ZV90IGF2ZV9zaXplOwotICB1aW50NjRfdCBhdmVfdGltZV91czsKLQotICBkcHJpbnRmKGZkLCAiXG5BMkRQIFN0YXRlOlxuIik7Ci0gIGRwcmludGYoZmQsICIgIFR4UXVldWU6XG4iKTsKLQotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIENvdW50cyAoZW5xdWV1ZS9kZXF1ZXVlL3JlYWRidWYpICAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dSAvICV6dVxuIiwKLSAgICAgICAgICBlbnF1ZXVlX3N0YXRzLT50b3RhbF91cGRhdGVzLCBkZXF1ZXVlX3N0YXRzLT50b3RhbF91cGRhdGVzLAotICAgICAgICAgIGFjY3VtdWxhdGVkX3N0YXRzLT50eF9xdWV1ZV90b3RhbF9yZWFkYnVmX2NhbGxzKTsKLQotICBkcHJpbnRmKAotICAgICAgZmQsCi0gICAgICAiICBMYXN0IHVwZGF0ZSB0aW1lIGFnbyBpbiBtcyAoZW5xdWV1ZS9kZXF1ZXVlL3JlYWRidWYpICAgIDogJWxsdSAvICVsbHUgIgotICAgICAgIi8gJWxsdVxuIiwKLSAgICAgIChlbnF1ZXVlX3N0YXRzLT5sYXN0X3VwZGF0ZV91cyA+IDApCi0gICAgICAgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKShub3dfdXMgLSBlbnF1ZXVlX3N0YXRzLT5sYXN0X3VwZGF0ZV91cykgLyAxMDAwCi0gICAgICAgICAgOiAwLAotICAgICAgKGRlcXVldWVfc3RhdHMtPmxhc3RfdXBkYXRlX3VzID4gMCkKLSAgICAgICAgICA/ICh1bnNpZ25lZCBsb25nIGxvbmcpKG5vd191cyAtIGRlcXVldWVfc3RhdHMtPmxhc3RfdXBkYXRlX3VzKSAvIDEwMDAKLSAgICAgICAgICA6IDAsCi0gICAgICAoYWNjdW11bGF0ZWRfc3RhdHMtPnR4X3F1ZXVlX2xhc3RfcmVhZGJ1Zl91cyA+IDApCi0gICAgICAgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKShub3dfdXMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRfc3RhdHMtPnR4X3F1ZXVlX2xhc3RfcmVhZGJ1Zl91cykgLwotICAgICAgICAgICAgICAgIDEwMDAKLSAgICAgICAgICA6IDApOwotCi0gIGF2ZV9zaXplID0gMDsKLSAgaWYgKGVucXVldWVfc3RhdHMtPnRvdGFsX3VwZGF0ZXMgIT0gMCkKLSAgICBhdmVfc2l6ZSA9Ci0gICAgICAgIGFjY3VtdWxhdGVkX3N0YXRzLT50eF9xdWV1ZV90b3RhbF9mcmFtZXMgLyBlbnF1ZXVlX3N0YXRzLT50b3RhbF91cGRhdGVzOwotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIEZyYW1lcyBwZXIgcGFja2V0ICh0b3RhbC9tYXgvYXZlKSAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dSAvICV6dVxuIiwKLSAgICAgICAgICBhY2N1bXVsYXRlZF9zdGF0cy0+dHhfcXVldWVfdG90YWxfZnJhbWVzLAotICAgICAgICAgIGFjY3VtdWxhdGVkX3N0YXRzLT50eF9xdWV1ZV9tYXhfZnJhbWVzX3Blcl9wYWNrZXQsIGF2ZV9zaXplKTsKLQotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIENvdW50cyAoZmx1c2hlZC9kcm9wcGVkL2Ryb3BvdXRzKSAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dSAvICV6dVxuIiwKLSAgICAgICAgICBhY2N1bXVsYXRlZF9zdGF0cy0+dHhfcXVldWVfdG90YWxfZmx1c2hlZF9tZXNzYWdlcywKLSAgICAgICAgICBhY2N1bXVsYXRlZF9zdGF0cy0+dHhfcXVldWVfdG90YWxfZHJvcHBlZF9tZXNzYWdlcywKLSAgICAgICAgICBhY2N1bXVsYXRlZF9zdGF0cy0+dHhfcXVldWVfZHJvcG91dHMpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgQ291bnRzIChtYXggZHJvcHBlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICV6dVxuIiwKLSAgICAgICAgICBhY2N1bXVsYXRlZF9zdGF0cy0+dHhfcXVldWVfbWF4X2Ryb3BwZWRfbWVzc2FnZXMpOwotCi0gIGRwcmludGYoCi0gICAgICBmZCwKLSAgICAgICIgIExhc3QgdXBkYXRlIHRpbWUgYWdvIGluIG1zIChmbHVzaGVkL2Ryb3BwZWQpICAgICAgICAgICAgOiAlbGx1IC8gIgotICAgICAgIiVsbHVcbiIsCi0gICAgICAoYWNjdW11bGF0ZWRfc3RhdHMtPnR4X3F1ZXVlX2xhc3RfZmx1c2hlZF91cyA+IDApCi0gICAgICAgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKShub3dfdXMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRfc3RhdHMtPnR4X3F1ZXVlX2xhc3RfZmx1c2hlZF91cykgLwotICAgICAgICAgICAgICAgIDEwMDAKLSAgICAgICAgICA6IDAsCi0gICAgICAoYWNjdW11bGF0ZWRfc3RhdHMtPnR4X3F1ZXVlX2xhc3RfZHJvcG91dHNfdXMgPiAwKQotICAgICAgICAgID8gKHVuc2lnbmVkIGxvbmcgbG9uZykobm93X3VzIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkX3N0YXRzLT50eF9xdWV1ZV9sYXN0X2Ryb3BvdXRzX3VzKSAvCi0gICAgICAgICAgICAgICAgMTAwMAotICAgICAgICAgIDogMCk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBDb3VudHMgKHVuZGVyZmxvdykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJXp1XG4iLAotICAgICAgICAgIGFjY3VtdWxhdGVkX3N0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19jb3VudCk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBCeXRlcyAodW5kZXJmbG93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJXp1XG4iLAotICAgICAgICAgIGFjY3VtdWxhdGVkX3N0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19ieXRlcyk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBMYXN0IHVwZGF0ZSB0aW1lIGFnbyBpbiBtcyAodW5kZXJmbG93KSAgICAgICAgICAgICAgICAgIDogJWxsdVxuIiwKLSAgICAgICAgICAoYWNjdW11bGF0ZWRfc3RhdHMtPm1lZGlhX3JlYWRfbGFzdF91bmRlcmZsb3dfdXMgPiAwKQotICAgICAgICAgICAgICA/ICh1bnNpZ25lZCBsb25nIGxvbmcpKG5vd191cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRfc3RhdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5tZWRpYV9yZWFkX2xhc3RfdW5kZXJmbG93X3VzKSAvCi0gICAgICAgICAgICAgICAgICAgIDEwMDAKLSAgICAgICAgICAgICAgOiAwKTsKLQotICAvLwotICAvLyBUeFF1ZXVlIGVucXVldWUgc3RhdHMKLSAgLy8KLSAgZHByaW50ZigKLSAgICAgIGZkLAotICAgICAgIiAgRW5xdWV1ZSBkZXZpYXRpb24gY291bnRzIChvdmVyZHVlL3ByZW1hdHVyZSkgICAgICAgICAgICA6ICV6dSAvICV6dVxuIiwKLSAgICAgIGVucXVldWVfc3RhdHMtPm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudCwKLSAgICAgIGVucXVldWVfc3RhdHMtPnByZW1hdHVyZV9zY2hlZHVsaW5nX2NvdW50KTsKLQotICBhdmVfdGltZV91cyA9IDA7Ci0gIGlmIChlbnF1ZXVlX3N0YXRzLT5vdmVyZHVlX3NjaGVkdWxpbmdfY291bnQgIT0gMCkgewotICAgIGF2ZV90aW1lX3VzID0gZW5xdWV1ZV9zdGF0cy0+dG90YWxfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8KLSAgICAgICAgICAgICAgICAgIGVucXVldWVfc3RhdHMtPm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudDsKLSAgfQotICBkcHJpbnRmKAotICAgICAgZmQsCi0gICAgICAiICBFbnF1ZXVlIG92ZXJkdWUgc2NoZWR1bGluZyB0aW1lIGluIG1zICh0b3RhbC9tYXgvYXZlKSAgIDogJWxsdSAvICVsbHUgIgotICAgICAgIi8gJWxsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZW5xdWV1ZV9zdGF0cy0+dG90YWxfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8KLSAgICAgICAgICAxMDAwLAotICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllbnF1ZXVlX3N0YXRzLT5tYXhfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8gMTAwMCwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXZlX3RpbWVfdXMgLyAxMDAwKTsKLQotICBhdmVfdGltZV91cyA9IDA7Ci0gIGlmIChlbnF1ZXVlX3N0YXRzLT5wcmVtYXR1cmVfc2NoZWR1bGluZ19jb3VudCAhPSAwKSB7Ci0gICAgYXZlX3RpbWVfdXMgPSBlbnF1ZXVlX3N0YXRzLT50b3RhbF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyAvCi0gICAgICAgICAgICAgICAgICBlbnF1ZXVlX3N0YXRzLT5wcmVtYXR1cmVfc2NoZWR1bGluZ19jb3VudDsKLSAgfQotICBkcHJpbnRmKAotICAgICAgZmQsCi0gICAgICAiICBFbnF1ZXVlIHByZW1hdHVyZSBzY2hlZHVsaW5nIHRpbWUgaW4gbXMgKHRvdGFsL21heC9hdmUpIDogJWxsdSAvICVsbHUgIgotICAgICAgIi8gJWxsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZW5xdWV1ZV9zdGF0cy0+dG90YWxfcHJlbWF0dXJlX3NjaGVkdWxpbmdfZGVsdGFfdXMgLwotICAgICAgICAgIDEwMDAsCi0gICAgICAodW5zaWduZWQgbG9uZyBsb25nKWVucXVldWVfc3RhdHMtPm1heF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyAvCi0gICAgICAgICAgMTAwMCwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXZlX3RpbWVfdXMgLyAxMDAwKTsKLQotICAvLwotICAvLyBUeFF1ZXVlIGRlcXVldWUgc3RhdHMKLSAgLy8KLSAgZHByaW50ZigKLSAgICAgIGZkLAotICAgICAgIiAgRGVxdWV1ZSBkZXZpYXRpb24gY291bnRzIChvdmVyZHVlL3ByZW1hdHVyZSkgICAgICAgICAgICA6ICV6dSAvICV6dVxuIiwKLSAgICAgIGRlcXVldWVfc3RhdHMtPm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudCwKLSAgICAgIGRlcXVldWVfc3RhdHMtPnByZW1hdHVyZV9zY2hlZHVsaW5nX2NvdW50KTsKLQotICBhdmVfdGltZV91cyA9IDA7Ci0gIGlmIChkZXF1ZXVlX3N0YXRzLT5vdmVyZHVlX3NjaGVkdWxpbmdfY291bnQgIT0gMCkgewotICAgIGF2ZV90aW1lX3VzID0gZGVxdWV1ZV9zdGF0cy0+dG90YWxfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8KLSAgICAgICAgICAgICAgICAgIGRlcXVldWVfc3RhdHMtPm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudDsKLSAgfQotICBkcHJpbnRmKAotICAgICAgZmQsCi0gICAgICAiICBEZXF1ZXVlIG92ZXJkdWUgc2NoZWR1bGluZyB0aW1lIGluIG1zICh0b3RhbC9tYXgvYXZlKSAgIDogJWxsdSAvICVsbHUgIgotICAgICAgIi8gJWxsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGVxdWV1ZV9zdGF0cy0+dG90YWxfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8KLSAgICAgICAgICAxMDAwLAotICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXF1ZXVlX3N0YXRzLT5tYXhfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8gMTAwMCwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXZlX3RpbWVfdXMgLyAxMDAwKTsKLQotICBhdmVfdGltZV91cyA9IDA7Ci0gIGlmIChkZXF1ZXVlX3N0YXRzLT5wcmVtYXR1cmVfc2NoZWR1bGluZ19jb3VudCAhPSAwKSB7Ci0gICAgYXZlX3RpbWVfdXMgPSBkZXF1ZXVlX3N0YXRzLT50b3RhbF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyAvCi0gICAgICAgICAgICAgICAgICBkZXF1ZXVlX3N0YXRzLT5wcmVtYXR1cmVfc2NoZWR1bGluZ19jb3VudDsKLSAgfQotICBkcHJpbnRmKAotICAgICAgZmQsCi0gICAgICAiICBEZXF1ZXVlIHByZW1hdHVyZSBzY2hlZHVsaW5nIHRpbWUgaW4gbXMgKHRvdGFsL21heC9hdmUpIDogJWxsdSAvICVsbHUgIgotICAgICAgIi8gJWxsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGVxdWV1ZV9zdGF0cy0+dG90YWxfcHJlbWF0dXJlX3NjaGVkdWxpbmdfZGVsdGFfdXMgLwotICAgICAgICAgIDEwMDAsCi0gICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRlcXVldWVfc3RhdHMtPm1heF9wcmVtYXR1cmVfc2NoZWR1bGluZ19kZWx0YV91cyAvCi0gICAgICAgICAgMTAwMCwKLSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXZlX3RpbWVfdXMgLyAxMDAwKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hMmRwX3NvdXJjZV91cGRhdGVfbWV0cmljcyh2b2lkKSB7Ci0gIEJ0aWZNZWRpYVN0YXRzIHN0YXRzID0gYnRpZl9hMmRwX3NvdXJjZV9jYi5zdGF0czsKLSAgU2NoZWR1bGluZ1N0YXRzIGVucXVldWVfc3RhdHMgPSBzdGF0cy50eF9xdWV1ZV9lbnF1ZXVlX3N0YXRzOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczsKLSAgbWV0cmljcy5jb2RlY19pbmRleCA9IHN0YXRzLmNvZGVjX2luZGV4OwotICBtZXRyaWNzLmlzX2EyZHBfb2ZmbG9hZCA9IGJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX3J1bm5pbmcoKTsKLSAgLy8gc2Vzc2lvbl9zdGFydF91cyBpcyAwIHdoZW4gYnRpZl9hMmRwX3NvdXJjZV9zdGFydF9hdWRpb19yZXEoKSBpcyBub3QgY2FsbGVkCi0gIC8vIG1hcmsgdGhlIG1ldHJpYyBkdXJhdGlvbiBhcyBpbnZhbGlkICgtMSkgaW4gdGhpcyBjYXNlCi0gIGlmIChzdGF0cy5zZXNzaW9uX3N0YXJ0X3VzICE9IDApIHsKLSAgICBpbnQ2NF90IHNlc3Npb25fZW5kX3VzID0gc3RhdHMuc2Vzc2lvbl9lbmRfdXMgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0cy5zZXNzaW9uX2VuZF91czsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHNlc3Npb25fZW5kX3VzKSA+IHN0YXRzLnNlc3Npb25fc3RhcnRfdXMpIHsKLSAgICAgIG1ldHJpY3MuYXVkaW9fZHVyYXRpb25fbXMgPQotICAgICAgICAgIChzZXNzaW9uX2VuZF91cyAtIHN0YXRzLnNlc3Npb25fc3RhcnRfdXMpIC8gMTAwMDsKLSAgICB9Ci0gIH0KLQotICBpZiAoZW5xdWV1ZV9zdGF0cy50b3RhbF91cGRhdGVzID4gMSkgewotICAgIG1ldHJpY3MubWVkaWFfdGltZXJfbWluX21zID0KLSAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9jYi5lbmNvZGVyX2ludGVydmFsX21zIC0KLSAgICAgICAgKGVucXVldWVfc3RhdHMubWF4X3ByZW1hdHVyZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8gMTAwMCk7Ci0gICAgbWV0cmljcy5tZWRpYV90aW1lcl9tYXhfbXMgPQotICAgICAgICBidGlmX2EyZHBfc291cmNlX2NiLmVuY29kZXJfaW50ZXJ2YWxfbXMgKwotICAgICAgICAoZW5xdWV1ZV9zdGF0cy5tYXhfb3ZlcmR1ZV9zY2hlZHVsaW5nX2RlbHRhX3VzIC8gMTAwMCk7Ci0KLSAgICBtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSBlbnF1ZXVlX3N0YXRzLm92ZXJkdWVfc2NoZWR1bGluZ19jb3VudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZV9zdGF0cy5wcmVtYXR1cmVfc2NoZWR1bGluZ19jb3VudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZV9zdGF0cy5leGFjdF9zY2hlZHVsaW5nX2NvdW50OwotICAgIGlmIChtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPiAwKSB7Ci0gICAgICBtZXRyaWNzLm1lZGlhX3RpbWVyX2F2Z19tcyA9IGVucXVldWVfc3RhdHMudG90YWxfc2NoZWR1bGluZ190aW1lX3VzIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMDAgKiBtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQpOwotICAgIH0KLQotICAgIG1ldHJpY3MuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IHN0YXRzLnR4X3F1ZXVlX21heF9kcm9wcGVkX21lc3NhZ2VzOwotICAgIG1ldHJpY3MuYnVmZmVyX292ZXJydW5zX3RvdGFsID0gc3RhdHMudHhfcXVldWVfdG90YWxfZHJvcHBlZF9tZXNzYWdlczsKLSAgICBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPSBzdGF0cy5tZWRpYV9yZWFkX3RvdGFsX3VuZGVyZmxvd19jb3VudDsKLSAgICBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDA7Ci0gICAgaWYgKG1ldHJpY3MuYnVmZmVyX3VuZGVycnVuc19jb3VudCA+IDApIHsKLSAgICAgIG1ldHJpY3MuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0KLSAgICAgICAgICAoZmxvYXQpc3RhdHMubWVkaWFfcmVhZF90b3RhbF91bmRlcmZsb3dfYnl0ZXMgLwotICAgICAgICAgIG1ldHJpY3MuYnVmZmVyX3VuZGVycnVuc19jb3VudDsKLSAgICB9Ci0gIH0KLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQTJkcFNlc3Npb24obWV0cmljcyk7Ci19Ci0KLXZvaWQgYnRpZl9hMmRwX3NvdXJjZV9zZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSgKLSAgICB1aW50OF90IGR5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUpIHsKLSAgYnRpZl9hMmRwX3NvdXJjZV9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplID0gZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgYnRtX3JlYWRfcnNzaV9jYih2b2lkKiBkYXRhKSB7Ci0gIGlmIChkYXRhID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBSZWFkIFJTU0kgcmVxdWVzdCB0aW1lZCBvdXQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUTV9SU1NJX1JFU1VMVCogcmVzdWx0ID0gKHRCVE1fUlNTSV9SRVNVTFQqKWRhdGE7Ci0gIGlmIChyZXN1bHQtPnN0YXR1cyAhPSBCVE1fU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IHVuYWJsZSB0byByZWFkIHJlbW90ZSBSU1NJIChzdGF0dXMgJWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHJlc3VsdC0+c3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsb2dfcmVhZF9yc3NpX3Jlc3VsdChyZXN1bHQtPnJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+aGNpX3N0YXR1cywgcmVzdWx0LT5yc3NpKTsKLQotICBMT0dfV0FSTigiJXM6IGRldmljZTogJXMsIHJzc2k6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgIHJlc3VsdC0+cmVtX2JkYS5Ub1N0cmluZygpLmNfc3RyKCksIHJlc3VsdC0+cnNzaSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY2Iodm9pZCogZGF0YSkgewotICBpZiAoZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogUmVhZCBGYWlsZWQgQ29udGFjdCBDb3VudGVyIHJlcXVlc3QgdGltZWQgb3V0IiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVE1fRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUl9SRVNVTFQqIHJlc3VsdCA9Ci0gICAgICAodEJUTV9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX1JFU1VMVCopZGF0YTsKLSAgaWYgKHJlc3VsdC0+c3RhdHVzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogdW5hYmxlIHRvIHJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnRlciAoc3RhdHVzICVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICByZXN1bHQtPnN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxvZ19yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfcmVzdWx0KAotICAgICAgcmVzdWx0LT5yZW1fYmRhLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgcmVzdWx0LT5oY2lfc3RhdHVzLCByZXN1bHQtPmZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotCi0gIExPR19XQVJOKCIlczogZGV2aWNlOiAlcywgRmFpbGVkIENvbnRhY3QgQ291bnRlcjogJXUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcmVzdWx0LT5yZW1fYmRhLlRvU3RyaW5nKCkuY19zdHIoKSwgcmVzdWx0LT5mYWlsZWRfY29udGFjdF9jb3VudGVyKTsKLX0KLQotc3RhdGljIHZvaWQgYnRtX3JlYWRfdHhfcG93ZXJfY2Iodm9pZCogZGF0YSkgewotICBpZiAoZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogUmVhZCBUeCBQb3dlciByZXF1ZXN0IHRpbWVkIG91dCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRNX1RYX1BPV0VSX1JFU1VMVCogcmVzdWx0ID0gKHRCVE1fVFhfUE9XRVJfUkVTVUxUKilkYXRhOwotICBpZiAocmVzdWx0LT5zdGF0dXMgIT0gQlRNX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiB1bmFibGUgdG8gcmVhZCBUeCBQb3dlciAoc3RhdHVzICVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICByZXN1bHQtPnN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxvZ19yZWFkX3R4X3Bvd2VyX2xldmVsX3Jlc3VsdChyZXN1bHQtPnJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5oY2lfc3RhdHVzLCByZXN1bHQtPnR4X3Bvd2VyKTsKLQotICBMT0dfV0FSTigiJXM6IGRldmljZTogJXMsIFR4IFBvd2VyOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICByZXN1bHQtPnJlbV9iZGEuVG9TdHJpbmcoKS5jX3N0cigpLCByZXN1bHQtPnR4X3Bvd2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uY2MgYi9idGlmL3NyYy9idGlmX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjE2MWNjLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24iCi0KLSNpbmNsdWRlICJidGlmX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uIHsKLQotQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZSogZ2V0X2FjdGl2aXR5X2F0dHJpYnV0aW9uX2luc3RhbmNlKCkgewotICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpnZXRfYWN0aXZpdHlfYXR0cmlidXRpb25faW5zdGFuY2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2F2LmNjIGIvYnRpZi9zcmMvYnRpZl9hdi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhN2Y0NS4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2F2LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTYgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0aWZfYXYiCi0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hdi5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvYTJkcC9lbnVtcy5wYi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJhdWRpb19oYWxfaW50ZXJmYWNlL2EyZHBfZW5jb2RpbmcuaCIKLSNpbmNsdWRlICJidGEvYXYvYnRhX2F2X2ludC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2EyZHAuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hMmRwX2NvbnRyb2wuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hMmRwX3NpbmsuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hMmRwX3NvdXJjZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfcHJvZmlsZV9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3JjLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfdXRpbC5oIgotI2luY2x1ZGUgImJ0aWZfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJjb21tb24vc3RhdGVfbWFjaGluZS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2F2LmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9yYy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQnRpZkF2U291cmNlU2VydmljZU5hbWUgPSAiQWR2YW5jZWQgQXVkaW8gU291cmNlIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQnRpZkF2U2lua1NlcnZpY2VOYW1lID0gIkFkdmFuY2VkIEF1ZGlvIFNpbmsiOwotc3RhdGljIGNvbnN0ZXhwciBpbnQga0RlZmF1bHRNYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgPSAxOwotc3RhdGljIGNvbnN0ZXhwciB0QlRBX0FWX0hOREwga0J0YUhhbmRsZVVua25vd24gPSAwOwotCi1uYW1lc3BhY2UgewotY29uc3RleHByIGNoYXIga0J0bUxvZ0hpc3RvcnlUYWdbXSA9ICJBMkRQIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTG9jYWwgdHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBzYW1wbGVfcmF0ZTsKLSAgaW50IGNoYW5uZWxfY291bnQ7Ci0gIFJhd0FkZHJlc3MgcGVlcl9hZGRyZXNzOwotfSBidGlmX2F2X3NpbmtfY29uZmlnX3JlcV90OwotCi0vKioKLSAqIEJUSUYgQVYgZXZlbnRzCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIFJldXNlIEJUQV9BVl9YWFhfRVZUIC0gTm8gbmVlZCB0byByZWRlZmluZSB0aGVtIGhlcmUgKi8KLSAgQlRJRl9BVl9DT05ORUNUX1JFUV9FVlQgPSBCVEFfQVZfTUFYX0VWVCwKLSAgQlRJRl9BVl9ESVNDT05ORUNUX1JFUV9FVlQsCi0gIEJUSUZfQVZfU1RBUlRfU1RSRUFNX1JFUV9FVlQsCi0gIEJUSUZfQVZfU1RPUF9TVFJFQU1fUkVRX0VWVCwKLSAgQlRJRl9BVl9TVVNQRU5EX1NUUkVBTV9SRVFfRVZULAotICBCVElGX0FWX1NJTktfQ09ORklHX1JFUV9FVlQsCi0gIEJUSUZfQVZfQUNMX0RJU0NPTk5FQ1RFRCwKLSAgQlRJRl9BVl9PRkZMT0FEX1NUQVJUX1JFUV9FVlQsCi0gIEJUSUZfQVZfQVZSQ1BfT1BFTl9FVlQsCi0gIEJUSUZfQVZfQVZSQ1BfQ0xPU0VfRVZULAotICBCVElGX0FWX0FWUkNQX1JFTU9URV9QTEFZX0VWVCwKLX0gYnRpZl9hdl9zbV9ldmVudF90OwotCi1jbGFzcyBCdGlmQXZFdmVudCB7Ci0gcHVibGljOgotICBCdGlmQXZFdmVudCh1aW50MzJfdCBldmVudCwgY29uc3Qgdm9pZCogcF9kYXRhLCBzaXplX3QgZGF0YV9sZW5ndGgpOwotICBCdGlmQXZFdmVudChjb25zdCBCdGlmQXZFdmVudCYgb3RoZXIpOwotICBCdGlmQXZFdmVudCgpID0gZGVsZXRlOwotICB+QnRpZkF2RXZlbnQoKTsKLSAgQnRpZkF2RXZlbnQmIG9wZXJhdG9yPShjb25zdCBCdGlmQXZFdmVudCYgb3RoZXIpOwotCi0gIHVpbnQzMl90IEV2ZW50KCkgY29uc3QgeyByZXR1cm4gZXZlbnRfOyB9Ci0gIHZvaWQqIERhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQotICBzaXplX3QgRGF0YUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfbGVuZ3RoXzsgfQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXZlbnROYW1lKHVpbnQzMl90IGV2ZW50KTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRGVlcENvcHkodWludDMyX3QgZXZlbnQsIGNvbnN0IHZvaWQqIHBfZGF0YSwgc2l6ZV90IGRhdGFfbGVuZ3RoKTsKLSAgdm9pZCBEZWVwRnJlZSgpOwotCi0gIHVpbnQzMl90IGV2ZW50XzsKLSAgdm9pZCogZGF0YV87Ci0gIHNpemVfdCBkYXRhX2xlbmd0aF87Ci19OwotCi1jbGFzcyBCdGlmQXZQZWVyOwotc3RhdGljIGJ0X3N0YXR1c190IHNpbmtfc2V0X2FjdGl2ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotLy8gU2hvdWxkIG5vdCBuZWVkIGRlZGljYXRlZCBTdXNwZW5kIHN0YXRlIGFzIGFjdHVhbCBhY3Rpb25zIGFyZSBubwotLy8gZGlmZmVyZW50IHRoYW4gT3BlbiBzdGF0ZS4gU3VzcGVuZCBmbGFncyBhcmUgbmVlZGVkIGhvd2V2ZXIgdG8gcHJldmVudAotLy8gbWVkaWEgdGFzayBmcm9tIHRyeWluZyB0byByZXN0YXJ0IHN0cmVhbSBkdXJpbmcgcmVtb3RlIFN1c3BlbmQgb3Igd2hpbGUKLS8vIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBhIGxvY2FsIFN1c3BlbmQuCi1jbGFzcyBCdGlmQXZTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpjb21tb246OlN0YXRlTWFjaGluZSB7Ci0gcHVibGljOgotICBlbnVtIHsKLSAgICBrU3RhdGVJZGxlLCAgICAgLy8gQVZEVFAgZGlzY29ubmVjdGVkCi0gICAga1N0YXRlT3BlbmluZywgIC8vIE9wZW5pbmcgQVZEVFAgY29ubmVjdGlvbgotICAgIGtTdGF0ZU9wZW5lZCwgICAvLyBBVkRUUCBpcyBpbiBPUEVOIHN0YXRlCi0gICAga1N0YXRlU3RhcnRlZCwgIC8vIEEyRFAgc3RyZWFtIHN0YXJ0ZWQKLSAgICBrU3RhdGVDbG9zaW5nLCAgLy8gQ2xvc2luZyBBVkRUUCBjb25uZWN0aW9uCi0gIH07Ci0KLSAgY2xhc3MgU3RhdGVJZGxlIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZUlkbGUoQnRpZkF2U3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlSWRsZSksIHBlZXJfKHNtLlBlZXIoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIEJ0aWZBdlBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlT3BlbmluZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVPcGVuaW5nKEJ0aWZBdlN0YXRlTWFjaGluZSYgc20pCi0gICAgICAgIDogU3RhdGUoc20sIGtTdGF0ZU9wZW5pbmcpLCBwZWVyXyhzbS5QZWVyKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBCdGlmQXZQZWVyJiBwZWVyXzsKLSAgfTsKLQotICBjbGFzcyBTdGF0ZU9wZW5lZCA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVPcGVuZWQoQnRpZkF2U3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlT3BlbmVkKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkF2UGVlciYgcGVlcl87Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVTdGFydGVkIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZVN0YXJ0ZWQoQnRpZkF2U3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlU3RhcnRlZCksIHBlZXJfKHNtLlBlZXIoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIEJ0aWZBdlBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlQ2xvc2luZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVDbG9zaW5nKEJ0aWZBdlN0YXRlTWFjaGluZSYgc20pCi0gICAgICAgIDogU3RhdGUoc20sIGtTdGF0ZUNsb3NpbmcpLCBwZWVyXyhzbS5QZWVyKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBCdGlmQXZQZWVyJiBwZWVyXzsKLSAgfTsKLQotICBCdGlmQXZTdGF0ZU1hY2hpbmUoQnRpZkF2UGVlciYgYnRpZl9hdl9wZWVyKSA6IHBlZXJfKGJ0aWZfYXZfcGVlcikgewotICAgIHN0YXRlX2lkbGVfID0gbmV3IFN0YXRlSWRsZSgqdGhpcyk7Ci0gICAgc3RhdGVfb3BlbmluZ18gPSBuZXcgU3RhdGVPcGVuaW5nKCp0aGlzKTsKLSAgICBzdGF0ZV9vcGVuZWRfID0gbmV3IFN0YXRlT3BlbmVkKCp0aGlzKTsKLSAgICBzdGF0ZV9zdGFydGVkXyA9IG5ldyBTdGF0ZVN0YXJ0ZWQoKnRoaXMpOwotICAgIHN0YXRlX2Nsb3NpbmdfID0gbmV3IFN0YXRlQ2xvc2luZygqdGhpcyk7Ci0KLSAgICBBZGRTdGF0ZShzdGF0ZV9pZGxlXyk7Ci0gICAgQWRkU3RhdGUoc3RhdGVfb3BlbmluZ18pOwotICAgIEFkZFN0YXRlKHN0YXRlX29wZW5lZF8pOwotICAgIEFkZFN0YXRlKHN0YXRlX3N0YXJ0ZWRfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9jbG9zaW5nXyk7Ci0gICAgU2V0SW5pdGlhbFN0YXRlKHN0YXRlX2lkbGVfKTsKLSAgfQotCi0gIEJ0aWZBdlBlZXImIFBlZXIoKSB7IHJldHVybiBwZWVyXzsgfQotCi0gcHJpdmF0ZToKLSAgQnRpZkF2UGVlciYgcGVlcl87Ci0gIFN0YXRlSWRsZSogc3RhdGVfaWRsZV87Ci0gIFN0YXRlT3BlbmluZyogc3RhdGVfb3BlbmluZ187Ci0gIFN0YXRlT3BlbmVkKiBzdGF0ZV9vcGVuZWRfOwotICBTdGF0ZVN0YXJ0ZWQqIHN0YXRlX3N0YXJ0ZWRfOwotICBTdGF0ZUNsb3NpbmcqIHN0YXRlX2Nsb3NpbmdfOwotfTsKLQotY2xhc3MgQnRpZkF2UGVlciB7Ci0gcHVibGljOgotICBlbnVtIHsKLSAgICBrRmxhZ0xvY2FsU3VzcGVuZFBlbmRpbmcgPSAweDEsCi0gICAga0ZsYWdSZW1vdGVTdXNwZW5kID0gMHgyLAotICAgIGtGbGFnUGVuZGluZ1N0YXJ0ID0gMHg0LAotICAgIGtGbGFnUGVuZGluZ1N0b3AgPSAweDgsCi0gIH07Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1RpbWVvdXRBdk9wZW5PblJjTXMgPSAyICogMTAwMDsgIC8vIDJzCi0KLSAgQnRpZkF2UGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQ4X3QgcGVlcl9zZXAsCi0gICAgICAgICAgICAgdEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUsIHVpbnQ4X3QgcGVlcl9pZCk7Ci0gIH5CdGlmQXZQZWVyKCk7Ci0KLSAgYnRfc3RhdHVzX3QgSW5pdCgpOwotICB2b2lkIENsZWFudXAoKTsKLQotICAvKioKLSAgICogQ2hlY2sgd2hldGhlciB0aGUgcGVlciBjYW4gYmUgZGVsZXRlZC4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYWlyIGNhbiBiZSBkZWxldGVkLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgQ2FuQmVEZWxldGVkKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgdGhlIHBlZXIgaXMgdGhlIGFjdGl2ZSBvbmUuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBlZXIgaXMgdGhlIGFjdGl2ZSBvbmUKLSAgICovCi0gIGJvb2wgSXNBY3RpdmVQZWVyKCkgY29uc3QgeyByZXR1cm4gKFBlZXJBZGRyZXNzKCkgPT0gQWN0aXZlUGVlckFkZHJlc3MoKSk7IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBhY3RpdmUgcGVlci4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgYWN0aXZlIHBlZXIKLSAgICovCi0gIGNvbnN0IFJhd0FkZHJlc3MmIEFjdGl2ZVBlZXJBZGRyZXNzKCkgY29uc3Q7Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyYgUGVlckFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBwZWVyX2FkZHJlc3NfOyB9Ci0gIGJvb2wgSXNTb3VyY2UoKSBjb25zdCB7IHJldHVybiAocGVlcl9zZXBfID09IEFWRFRfVFNFUF9TUkMpOyB9Ci0gIGJvb2wgSXNTaW5rKCkgY29uc3QgeyByZXR1cm4gKHBlZXJfc2VwXyA9PSBBVkRUX1RTRVBfU05LKTsgfQotICB1aW50OF90IFBlZXJTZXAoKSBjb25zdCB7IHJldHVybiBwZWVyX3NlcF87IH0KLSAgLyoqCi0gICAqIEdldCB0aGUgbG9jYWwgZGV2aWNlJ3MgU2VydmljZSBDbGFzcyBVVUlECi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGxvY2FsIGRldmljZSdzIFNlcnZpY2UgQ2xhc3MgVVVJRDogVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFCi0gICAqIG9yIFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTksKLSAgICovCi0gIHVpbnQxNl90IExvY2FsVXVpZFNlcnZpY2VDbGFzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gKElzU2luaygpID8gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFIDogVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSyk7Ci0gIH0KLSAgdEJUQV9BVl9ITkRMIEJ0YUhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGJ0YV9oYW5kbGVfOyB9Ci0gIHZvaWQgU2V0QnRhSGFuZGxlKHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlKSB7IGJ0YV9oYW5kbGVfID0gYnRhX2hhbmRsZTsgfQotICB1aW50OF90IFBlZXJJZCgpIGNvbnN0IHsgcmV0dXJuIHBlZXJfaWRfOyB9Ci0KLSAgQnRpZkF2U3RhdGVNYWNoaW5lJiBTdGF0ZU1hY2hpbmUoKSB7IHJldHVybiBzdGF0ZV9tYWNoaW5lXzsgfQotICBjb25zdCBCdGlmQXZTdGF0ZU1hY2hpbmUmIFN0YXRlTWFjaGluZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlX21hY2hpbmVfOyB9Ci0gIGFsYXJtX3QqIEF2T3Blbk9uUmNUaW1lcigpIHsgcmV0dXJuIGF2X29wZW5fb25fcmNfdGltZXJfOyB9Ci0gIGNvbnN0IGFsYXJtX3QqIEF2T3Blbk9uUmNUaW1lcigpIGNvbnN0IHsgcmV0dXJuIGF2X29wZW5fb25fcmNfdGltZXJfOyB9Ci0KLSAgdm9pZCBTZXRFZHIodEJUQV9BVl9FRFIgZWRyKSB7IGVkcl8gPSBlZHI7IH0KLSAgYm9vbCBJc0VkcigpIGNvbnN0IHsgcmV0dXJuIChlZHJfICE9IDApOyB9Ci0gIGJvb2wgSXMzTWJwcygpIGNvbnN0IHsgcmV0dXJuICgoZWRyXyAmIEJUQV9BVl9FRFJfM01CUFMpICE9IDApOyB9Ci0KLSAgYm9vbCBJc0Nvbm5lY3RlZCgpIGNvbnN0OwotICBib29sIElzU3RyZWFtaW5nKCkgY29uc3Q7Ci0gIGJvb2wgSXNJblNpbGVuY2VNb2RlKCkgY29uc3QgeyByZXR1cm4gaXNfc2lsZW5jZWRfOyB9Ci0KLSAgdm9pZCBTZXRTaWxlbmNlKGJvb2wgc2lsZW5jZSkgeyBpc19zaWxlbmNlZF8gPSBzaWxlbmNlOyB9Ci0KLSAgLy8gQVZEVFAgZGVsYXkgcmVwb3J0aW5nIGluIDEvMTAgbWlsbGlzZWNvbmRzCi0gIHZvaWQgU2V0RGVsYXlSZXBvcnQodWludDE2X3QgZGVsYXkpIHsgZGVsYXlfcmVwb3J0XyA9IGRlbGF5OyB9Ci0gIHVpbnQxNl90IEdldERlbGF5UmVwb3J0KCkgY29uc3QgeyByZXR1cm4gZGVsYXlfcmVwb3J0XzsgfQotCi0gIHZvaWQgU2V0TWFuZGF0b3J5Q29kZWNQcmVmZXJyZWQoYm9vbCBwcmVmZXJyZWQpIHsKLSAgICBtYW5kYXRvcnlfY29kZWNfcHJlZmVycmVkXyA9IHByZWZlcnJlZDsKLSAgfQotICBib29sIElzTWFuZGF0b3J5Q29kZWNQcmVmZXJyZWQoKSBjb25zdCB7IHJldHVybiBtYW5kYXRvcnlfY29kZWNfcHJlZmVycmVkXzsgfQotCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIGFueSBvZiB0aGUgZmxhZ3Mgc3BlY2lmaWVkIGJ5IHRoZSBiaXRsYWdzIG1hc2sgaXMgc2V0LgotICAgKgotICAgKiBAcGFyYW0gYml0ZmxhZ3NfbWFzayB0aGUgYml0ZmxhZ3MgdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgZmxhZ3MgdG8gY2hlY2sgaXMgc2V0LCBvdGhlcndpc2UgZmFsc2UuCi0gICAqLwotICBib29sIENoZWNrRmxhZ3ModWludDhfdCBiaXRmbGFnc19tYXNrKSBjb25zdCB7Ci0gICAgcmV0dXJuICgoZmxhZ3NfICYgYml0ZmxhZ3NfbWFzaykgIT0gMCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IG9ubHkgdGhlIGZsYWdzIGFzIHNwZWNpZmllZCBieSB0aGUgYml0ZmxhZ3MgbWFzay4KLSAgICoKLSAgICogQHBhcmFtIGJpdGZsYWdzX21hc2sgdGhlIGJpdGZsYWdzIHRvIHNldAotICAgKi8KLSAgdm9pZCBTZXRGbGFncyh1aW50OF90IGJpdGZsYWdzX21hc2spIHsgZmxhZ3NfIHw9IGJpdGZsYWdzX21hc2s7IH0KLQotICAvKioKLSAgICogQ2xlYXIgb25seSB0aGUgZmxhZ3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSBiaXRmbGFncyBtYXNrLgotICAgKgotICAgKiBAcGFyYW0gYml0ZmxhZ3NfbWFzayB0aGUgYml0ZmxhZ3MgdG8gY2xlYXIKLSAgICovCi0gIHZvaWQgQ2xlYXJGbGFncyh1aW50OF90IGJpdGZsYWdzX21hc2spIHsgZmxhZ3NfICY9IH5iaXRmbGFnc19tYXNrOyB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIGFsbCBmbGFncy4KLSAgICovCi0gIHZvaWQgQ2xlYXJBbGxGbGFncygpIHsgZmxhZ3NfID0gMDsgfQotCi0gIC8qKgotICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZsYWdzIHRoYXQgYXJlIHNldC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIEZsYWdzVG9TdHJpbmcoKSBjb25zdDsKLQotICBib29sIFNlbGZJbml0aWF0ZWRDb25uZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gc2VsZl9pbml0aWF0ZWRfY29ubmVjdGlvbl87IH0KLSAgdm9pZCBTZXRTZWxmSW5pdGlhdGVkQ29ubmVjdGlvbihib29sIHYpIHsgc2VsZl9pbml0aWF0ZWRfY29ubmVjdGlvbl8gPSB2OyB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBSYXdBZGRyZXNzIHBlZXJfYWRkcmVzc187Ci0gIGNvbnN0IHVpbnQ4X3QgcGVlcl9zZXBfOyAgLy8gU0VQIHR5cGUgb2YgcGVlciBkZXZpY2UKLSAgdEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGVfOwotICBjb25zdCB1aW50OF90IHBlZXJfaWRfOwotICBCdGlmQXZTdGF0ZU1hY2hpbmUgc3RhdGVfbWFjaGluZV87Ci0gIGFsYXJtX3QqIGF2X29wZW5fb25fcmNfdGltZXJfOwotICB0QlRBX0FWX0VEUiBlZHJfOwotICB1aW50OF90IGZsYWdzXzsKLSAgYm9vbCBzZWxmX2luaXRpYXRlZF9jb25uZWN0aW9uXzsKLSAgYm9vbCBpc19zaWxlbmNlZF87Ci0gIHVpbnQxNl90IGRlbGF5X3JlcG9ydF87Ci0gIGJvb2wgbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF8gPSBmYWxzZTsKLX07Ci0KLWNsYXNzIEJ0aWZBdlNvdXJjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgUGVlcklkIGlzIHVzZWQgYXMgQXBwSWQgZm9yIEJUQV9BdlJlZ2lzdGVyKCkgcHVycG9zZQotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1BlZXJJZE1pbiA9IDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrUGVlcklkTWF4ID0gQlRBX0FWX05VTV9TVFJTOwotCi0gIEJ0aWZBdlNvdXJjZSgpCi0gICAgICA6IGNhbGxiYWNrc18obnVsbHB0ciksCi0gICAgICAgIGVuYWJsZWRfKGZhbHNlKSwKLSAgICAgICAgYTJkcF9vZmZsb2FkX2VuYWJsZWRfKGZhbHNlKSwKLSAgICAgICAgbWF4X2Nvbm5lY3RlZF9wZWVyc18oa0RlZmF1bHRNYXhDb25uZWN0ZWRBdWRpb0RldmljZXMpIHt9Ci0gIH5CdGlmQXZTb3VyY2UoKTsKLQotICBidF9zdGF0dXNfdCBJbml0KAotICAgICAgYnRhdl9zb3VyY2VfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywgaW50IG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGNvZGVjX3ByaW9yaXRpZXMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBvZmZsb2FkaW5nX3ByZWZlcmVuY2UpOwotICB2b2lkIENsZWFudXAoKTsKLQotICBidGF2X3NvdXJjZV9jYWxsYmFja3NfdCogQ2FsbGJhY2tzKCkgeyByZXR1cm4gY2FsbGJhY2tzXzsgfQotICBib29sIEVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBlbmFibGVkXzsgfQotICBib29sIEEyZHBPZmZsb2FkRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGEyZHBfb2ZmbG9hZF9lbmFibGVkXzsgfQotCi0gIEJ0aWZBdlBlZXIqIEZpbmRQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0gIEJ0aWZBdlBlZXIqIEZpbmRQZWVyQnlIYW5kbGUodEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUpOwotICBCdGlmQXZQZWVyKiBGaW5kUGVlckJ5UGVlcklkKHVpbnQ4X3QgcGVlcl9pZCk7Ci0gIEJ0aWZBdlBlZXIqIEZpbmRPckNyZWF0ZVBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlKTsKLQotICAvKioKLSAgICogQ2hlY2sgd2hldGhlciBhIGNvbm5lY3Rpb24gdG8gYSBwZWVyIGlzIGFsbG93ZWQuCi0gICAqIFRoZSBjaGVjayBjb25zaWRlcnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3RlZCBwZWVycy4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzIHRvIGNvbm5lY3QgdG8KLSAgICogQHJldHVybiB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCwgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBib29sIEFsbG93ZWRUb0Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSBjb25zdDsKLQotICAvKioKLSAgICogRGVsZXRlIGEgcGVlci4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciB0byBkZWxldGUKLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBEZWxldGVQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIERlbGV0ZSBhbGwgcGVlcnMgdGhhdCBoYXZlIHRyYW5zaXRpb25lZCB0byBJZGxlIHN0YXRlIGFuZCBjYW4gYmUgZGVsZXRlZC4KLSAgICogSWYgYSBwZWVyIHdhcyBqdXN0IGNyZWF0ZWQvaW5pdGlhbGl6ZWQsIHRoZW4gaXQgY2Fubm90IGJlIGRlbGV0ZWQgeWV0LgotICAgKi8KLSAgdm9pZCBEZWxldGVJZGxlUGVlcnMoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBhY3RpdmUgcGVlci4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYWN0aXZlIHBlZXIKLSAgICovCi0gIGNvbnN0IFJhd0FkZHJlc3MmIEFjdGl2ZVBlZXIoKSBjb25zdCB7IHJldHVybiBhY3RpdmVfcGVlcl87IH0KLQotICAvKioKLSAgICogQ2hlY2sgd2hldGhlciBwZWVyIGlzIHNpbGVuY2VkCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIG9uIHNpbGVuY2UgbW9kZSBlbmFibGVkLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgSXNQZWVyU2lsZW5jZWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gICAgaWYgKHBlZXJfYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgQnRpZkF2UGVlciogcGVlciA9IEZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gICAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogcGVlciBpcyBudWxsIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXBlZXItPklzQ29ubmVjdGVkKCkpIHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHBlZXIgaXMgbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBlZXItPklzSW5TaWxlbmNlTW9kZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBwZWVyIHNpbGVuY2UgbW9kZQotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIHRvIHNldAotICAgKiBAcGFyYW0gc2lsZW5jZSB0cnVlIG9uIGVuYWJsZSBzaWxlbmNlIG1vZGUsIGZhbHNlIG9uIGRpc2FibGUKLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBTZXRTaWxlbmNlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIGNvbnN0IGJvb2wgc2lsZW5jZSkgewotICAgIGlmIChwZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIExPR19JTkZPKCIlczogcGVlcjogJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBGaW5kUGVlcihwZWVyX2FkZHJlc3MpOwotICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHBlZXIgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFwZWVyLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBwZWVyIGlzIG5vdCBjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHBlZXItPlNldFNpbGVuY2Uoc2lsZW5jZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBhY3RpdmUgcGVlci4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgYWN0aXZlIHBlZXIgYWRkcmVzcyBvciBSYXdBZGRyZXNzOjprRW1wdHkgdG8KLSAgICogcmVzZXQgdGhlIGFjdGl2ZSBwZWVyCi0gICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgU2V0QWN0aXZlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogcGVlcjogIiA8PCBwZWVyX2FkZHJlc3M7Ci0KLSAgICBpZiAoYWN0aXZlX3BlZXJfID09IHBlZXJfYWRkcmVzcykgewotICAgICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgcmV0dXJuIHRydWU7ICAvLyBOb3RoaW5nIGhhcyBjaGFuZ2VkCi0gICAgfQotICAgIGlmIChwZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGVlciBhZGRyZXNzIGlzIGVtcHR5LCBzaHV0ZG93biB0aGUgQXVkaW8gc291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgaWYgKCFidGFfYXZfY29fc2V0X2FjdGl2ZV9wZWVyKHBlZXJfYWRkcmVzcykpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOiB1bmFibGUgdG8gc2V0IGFjdGl2ZSBwZWVyIHRvIGVtcHR5IGluIEJ0YUF2Q28iOwotICAgICAgfQotICAgICAgYnRpZl9hMmRwX3NvdXJjZV9lbmRfc2Vzc2lvbihhY3RpdmVfcGVlcl8pOwotICAgICAgYnRpZl9hMmRwX3NvdXJjZV9zaHV0ZG93bigpOwotICAgICAgYWN0aXZlX3BlZXJfID0gcGVlcl9hZGRyZXNzOwotICAgICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQnRpZkF2UGVlciogcGVlciA9IEZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gICAgaWYgKHBlZXIgIT0gbnVsbHB0ciAmJiAhcGVlci0+SXNDb25uZWN0ZWQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBFcnJvciBzZXR0aW5nICIgPDwgcGVlci0+UGVlckFkZHJlc3MoKQotICAgICAgICAgICAgICAgICA8PCAiIGFzIGFjdGl2ZSBTb3VyY2UgcGVlciI7Ci0gICAgICBwZWVyX3JlYWR5X3Byb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFidGlmX2EyZHBfc291cmNlX3Jlc3RhcnRfc2Vzc2lvbihhY3RpdmVfcGVlcl8sIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSkgewotICAgICAgLy8gY2Fubm90IHNldCBwcm9taXNlIGJ1dCBuZWVkIHRvIGJlIGhhbmRsZWQgd2l0aGluIHJlc3RhcnRfc2Vzc2lvbgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhY3RpdmVfcGVlcl8gPSBwZWVyX2FkZHJlc3M7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlIHNvdXJjZSBjb2RlYyBjb25maWd1cmF0aW9uIGZvciBhIHBlZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIgdG8gdXBkYXRlCi0gICAqIEBwYXJhbSBjb2RlY19wcmVmZXJlbmNlcyB0aGUgdXBkYXRlZCBjb2RlYyBwcmVmZXJlbmNlcwotICAgKi8KLSAgdm9pZCBVcGRhdGVDb2RlY0NvbmZpZygKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGNvZGVjX3ByZWZlcmVuY2VzLAotICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSkgewotICAgIC8vIFJlc3RhcnQgdGhlIHNlc3Npb24gaWYgdGhlIGNvZGVjIGZvciB0aGUgYWN0aXZlIHBlZXIgaXMgdXBkYXRlZAotICAgIGlmICghcGVlcl9hZGRyZXNzLklzRW1wdHkoKSAmJiBhY3RpdmVfcGVlcl8gPT0gcGVlcl9hZGRyZXNzKSB7Ci0gICAgICBidGlmX2EyZHBfc291cmNlX2VuZF9zZXNzaW9uKGFjdGl2ZV9wZWVyXyk7Ci0gICAgfQotCi0gICAgYnRpZl9hMmRwX3NvdXJjZV9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9yZXEoCi0gICAgICAgIHBlZXJfYWRkcmVzcywgY29kZWNfcHJlZmVyZW5jZXMsIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6bWFwPFJhd0FkZHJlc3MsIEJ0aWZBdlBlZXIqPiYgUGVlcnMoKSBjb25zdCB7IHJldHVybiBwZWVyc187IH0KLQotICB2b2lkIFJlZ2lzdGVyQWxsQnRhSGFuZGxlcygpOwotICB2b2lkIERlcmVnaXN0ZXJBbGxCdGFIYW5kbGVzKCk7Ci0gIHZvaWQgQnRhSGFuZGxlUmVnaXN0ZXJlZCh1aW50OF90IHBlZXJfaWQsIHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ2xlYW51cEFsbFBlZXJzKCk7Ci0KLSAgYnRhdl9zb3VyY2VfY2FsbGJhY2tzX3QqIGNhbGxiYWNrc187Ci0gIGJvb2wgZW5hYmxlZF87Ci0gIGJvb2wgYTJkcF9vZmZsb2FkX2VuYWJsZWRfOwotICBpbnQgbWF4X2Nvbm5lY3RlZF9wZWVyc187Ci0gIHN0ZDo6bWFwPFJhd0FkZHJlc3MsIEJ0aWZBdlBlZXIqPiBwZWVyc187Ci0gIHN0ZDo6c2V0PFJhd0FkZHJlc3M+IHNpbGVuY2VkX3BlZXJzXzsKLSAgUmF3QWRkcmVzcyBhY3RpdmVfcGVlcl87Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QsIHRCVEFfQVZfSE5ETD4gcGVlcl9pZDJidGFfaGFuZGxlXzsKLX07Ci0KLWNsYXNzIEJ0aWZBdlNpbmsgewotIHB1YmxpYzoKLSAgLy8gVGhlIFBlZXJJZCBpcyB1c2VkIGFzIEFwcElkIGZvciBCVEFfQXZSZWdpc3RlcigpIHB1cnBvc2UKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtQZWVySWRNaW4gPSAwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1BlZXJJZE1heCA9IEJUQV9BVl9OVU1fU1RSUzsKLQotICBCdGlmQXZTaW5rKCkKLSAgICAgIDogY2FsbGJhY2tzXyhudWxscHRyKSwKLSAgICAgICAgZW5hYmxlZF8oZmFsc2UpLAotICAgICAgICBtYXhfY29ubmVjdGVkX3BlZXJzXyhrRGVmYXVsdE1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcykge30KLSAgfkJ0aWZBdlNpbmsoKTsKLQotICBidF9zdGF0dXNfdCBJbml0KGJ0YXZfc2lua19jYWxsYmFja3NfdCogY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgIGludCBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMpOwotICB2b2lkIENsZWFudXAoKTsKLQotICBidGF2X3NpbmtfY2FsbGJhY2tzX3QqIENhbGxiYWNrcygpIHsgcmV0dXJuIGNhbGxiYWNrc187IH0KLSAgYm9vbCBFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZW5hYmxlZF87IH0KLQotICBCdGlmQXZQZWVyKiBGaW5kUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotICBCdGlmQXZQZWVyKiBGaW5kUGVlckJ5SGFuZGxlKHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlKTsKLSAgQnRpZkF2UGVlciogRmluZFBlZXJCeVBlZXJJZCh1aW50OF90IHBlZXJfaWQpOwotICBCdGlmQXZQZWVyKiBGaW5kT3JDcmVhdGVQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0hOREwgYnRhX2hhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgYSBjb25uZWN0aW9uIHRvIGEgcGVlciBpcyBhbGxvd2VkLgotICAgKiBUaGUgY2hlY2sgY29uc2lkZXJzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0ZWQgcGVlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgYWRkcmVzcyB0byBjb25uZWN0IHRvCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGFsbG93ZWQsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBBbGxvd2VkVG9Db25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIERlbGV0ZSBhIHBlZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgdG8gZGVsZXRlCi0gICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgRGVsZXRlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBEZWxldGUgYWxsIHBlZXJzIHRoYXQgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gSWRsZSBzdGF0ZSBhbmQgY2FuIGJlIGRlbGV0ZWQuCi0gICAqIElmIGEgcGVlciB3YXMganVzdCBjcmVhdGVkL2luaXRpYWxpemVkLCB0aGVuIGl0IGNhbm5vdCBiZSBkZWxldGVkIHlldC4KLSAgICovCi0gIHZvaWQgRGVsZXRlSWRsZVBlZXJzKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYWN0aXZlIHBlZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGFjdGl2ZSBwZWVyCi0gICAqLwotICBjb25zdCBSYXdBZGRyZXNzJiBBY3RpdmVQZWVyKCkgY29uc3QgeyByZXR1cm4gYWN0aXZlX3BlZXJfOyB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgYWN0aXZlIHBlZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIGFjdGl2ZSBwZWVyIGFkZHJlc3Mgb3IgUmF3QWRkcmVzczo6a0VtcHR5IHRvCi0gICAqIHJlc2V0IHRoZSBhY3RpdmUgcGVlcgotICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBib29sIFNldEFjdGl2ZVBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSkgewotICAgIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IHBlZXI6ICIgPDwgcGVlcl9hZGRyZXNzOwotCi0gICAgaWYgKGFjdGl2ZV9wZWVyXyA9PSBwZWVyX2FkZHJlc3MpIHsKLSAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgIHJldHVybiB0cnVlOyAgLy8gTm90aGluZyBoYXMgY2hhbmdlZAotICAgIH0KLSAgICBpZiAocGVlcl9hZGRyZXNzLklzRW1wdHkoKSkgewotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHBlZXIgYWRkcmVzcyBpcyBlbXB0eSwgc2h1dGRvd24gdGhlIEF1ZGlvIHNpbmsiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICBpZiAoIWJ0YV9hdl9jb19zZXRfYWN0aXZlX3BlZXIocGVlcl9hZGRyZXNzKSkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IHVuYWJsZSB0byBzZXQgYWN0aXZlIHBlZXIgdG8gZW1wdHkgaW4gQnRhQXZDbyI7Ci0gICAgICB9Ci0gICAgICBidGlmX2EyZHBfc2lua19lbmRfc2Vzc2lvbihhY3RpdmVfcGVlcl8pOwotICAgICAgYnRpZl9hMmRwX3Npbmtfc2h1dGRvd24oKTsKLSAgICAgIGFjdGl2ZV9wZWVyXyA9IHBlZXJfYWRkcmVzczsKLSAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBGaW5kUGVlcihwZWVyX2FkZHJlc3MpOwotICAgIGlmIChwZWVyICE9IG51bGxwdHIgJiYgIXBlZXItPklzQ29ubmVjdGVkKCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRXJyb3Igc2V0dGluZyAiIDw8IHBlZXItPlBlZXJBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBhcyBhY3RpdmUgU2luayBwZWVyIjsKLSAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIWJ0aWZfYTJkcF9zaW5rX3Jlc3RhcnRfc2Vzc2lvbihhY3RpdmVfcGVlcl8sIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVlcl9yZWFkeV9wcm9taXNlKSkpIHsKLSAgICAgIC8vIGNhbm5vdCBzZXQgcHJvbWlzZSBidXQgbmVlZCB0byBiZSBoYW5kbGVkIHdpdGhpbiByZXN0YXJ0X3Nlc3Npb24KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYWN0aXZlX3BlZXJfID0gcGVlcl9hZGRyZXNzOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8UmF3QWRkcmVzcywgQnRpZkF2UGVlcio+JiBQZWVycygpIGNvbnN0IHsgcmV0dXJuIHBlZXJzXzsgfQotCi0gIHZvaWQgUmVnaXN0ZXJBbGxCdGFIYW5kbGVzKCk7Ci0gIHZvaWQgRGVyZWdpc3RlckFsbEJ0YUhhbmRsZXMoKTsKLSAgdm9pZCBCdGFIYW5kbGVSZWdpc3RlcmVkKHVpbnQ4X3QgcGVlcl9pZCwgdEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBDbGVhbnVwQWxsUGVlcnMoKTsKLQotICBidGF2X3NpbmtfY2FsbGJhY2tzX3QqIGNhbGxiYWNrc187Ci0gIGJvb2wgZW5hYmxlZF87Ci0gIGludCBtYXhfY29ubmVjdGVkX3BlZXJzXzsKLSAgc3RkOjptYXA8UmF3QWRkcmVzcywgQnRpZkF2UGVlcio+IHBlZXJzXzsKLSAgUmF3QWRkcmVzcyBhY3RpdmVfcGVlcl87Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QsIHRCVEFfQVZfSE5ETD4gcGVlcl9pZDJidGFfaGFuZGxlXzsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCdGlmQXZTb3VyY2UgYnRpZl9hdl9zb3VyY2U7Ci1zdGF0aWMgQnRpZkF2U2luayBidGlmX2F2X3Npbms7Ci0KLS8qIEhlbHBlciBtYWNybyB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uIGluIHRoZSBzdGF0ZSBtYWNoaW5lIGhhbmRsZXJzICovCi0jZGVmaW5lIENIRUNLX1JDX0VWRU5UKGUsIGQpICAgICAgIFwKLSAgY2FzZSBCVEFfQVZfUkNfT1BFTl9FVlQ6ICAgICAgICAgXAotICBjYXNlIEJUQV9BVl9SQ19CUk9XU0VfT1BFTl9FVlQ6ICBcCi0gIGNhc2UgQlRBX0FWX1JDX0NMT1NFX0VWVDogICAgICAgIFwKLSAgY2FzZSBCVEFfQVZfUkNfQlJPV1NFX0NMT1NFX0VWVDogXAotICBjYXNlIEJUQV9BVl9SRU1PVEVfQ01EX0VWVDogICAgICBcCi0gIGNhc2UgQlRBX0FWX1ZFTkRPUl9DTURfRVZUOiAgICAgIFwKLSAgY2FzZSBCVEFfQVZfTUVUQV9NU0dfRVZUOiAgICAgICAgXAotICBjYXNlIEJUQV9BVl9SQ19GRUFUX0VWVDogICAgICAgICBcCi0gIGNhc2UgQlRBX0FWX1JDX1BTTV9FVlQ6ICAgICAgICAgIFwKLSAgY2FzZSBCVEFfQVZfUkVNT1RFX1JTUF9FVlQ6IHsgICAgXAotICAgIGJ0aWZfcmNfaGFuZGxlcihlLCBkKTsgICAgICAgICBcCi0gIH0gYnJlYWs7Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBzcmNfZGlzY29ubmVjdF9zaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci1zdGF0aWMgYnRfc3RhdHVzX3Qgc2lua19kaXNjb25uZWN0X3NyYyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotc3RhdGljIHZvaWQgYnRpZl9hdl9zb3VyY2VfZGlzcGF0Y2hfc21fZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hdl9zbV9ldmVudF90IGV2ZW50KTsKLXN0YXRpYyB2b2lkIGJ0aWZfYXZfc2lua19kaXNwYXRjaF9zbV9ldmVudChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hdl9zbV9ldmVudF90IGV2ZW50KTsKLXN0YXRpYyB2b2lkIGJ0aWZfYXZfaGFuZGxlX2V2ZW50KHVpbnQ4X3QgcGVlcl9zZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0hOREwgYnRhX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ0aWZBdkV2ZW50JiBidGlmX2F2X2V2ZW50KTsKLXN0YXRpYyB2b2lkIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSk7Ci1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9hdWRpb19zdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpOwotc3RhdGljIHZvaWQgYnRpZl9hdl9yZXBvcnRfc2lua19hdWRpb19jb25maWdfc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCBpbnQgc2FtcGxlX3JhdGUsIGludCBjaGFubmVsX2NvdW50KTsKLXN0YXRpYyB2b2lkIGJ0aWZfYXZfcXVlcnlfbWFuZGF0b3J5X2NvZGVjX3ByaW9yaXR5KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci1zdGF0aWMgdm9pZCBidGlmX2F2X3NvdXJjZV9pbml0aWF0ZV9hdl9vcGVuX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGlmX2F2X3NpbmtfaW5pdGlhdGVfYXZfb3Blbl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRhX2F2X3NpbmtfbWVkaWFfY2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9FVlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX01FRElBKiBwX2RhdGEpOwotCi1zdGF0aWMgQnRpZkF2UGVlciogYnRpZl9hdl9zb3VyY2VfZmluZF9wZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICByZXR1cm4gYnRpZl9hdl9zb3VyY2UuRmluZFBlZXIocGVlcl9hZGRyZXNzKTsKLX0KLXN0YXRpYyBCdGlmQXZQZWVyKiBidGlmX2F2X3NpbmtfZmluZF9wZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICByZXR1cm4gYnRpZl9hdl9zaW5rLkZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci19Ci1zdGF0aWMgQnRpZkF2UGVlciogYnRpZl9hdl9maW5kX3BlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIGlmIChidGlmX2F2X3NvdXJjZS5FbmFibGVkKCkpIHJldHVybiBidGlmX2F2X3NvdXJjZV9maW5kX3BlZXIocGVlcl9hZGRyZXNzKTsKLSAgaWYgKGJ0aWZfYXZfc2luay5FbmFibGVkKCkpIHJldHVybiBidGlmX2F2X3NpbmtfZmluZF9wZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIHJldHVybiBudWxscHRyOwotfQotc3RhdGljIEJ0aWZBdlBlZXIqIGJ0aWZfYXZfZmluZF9hY3RpdmVfcGVlcigpIHsKLSAgaWYgKGJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKSkKLSAgICByZXR1cm4gYnRpZl9hdl9zb3VyY2VfZmluZF9wZWVyKGJ0aWZfYXZfc291cmNlLkFjdGl2ZVBlZXIoKSk7Ci0gIGlmIChidGlmX2F2X3NpbmsuRW5hYmxlZCgpKQotICAgIHJldHVybiBidGlmX2F2X3NpbmtfZmluZF9wZWVyKGJ0aWZfYXZfc2luay5BY3RpdmVQZWVyKCkpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMb2NhbCBoZWxwZXIgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IGNoYXIqIGR1bXBfYXZfc21fZXZlbnRfbmFtZShidGlmX2F2X3NtX2V2ZW50X3QgZXZlbnQpIHsKLSAgc3dpdGNoICgoaW50KWV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9FTkFCTEVfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkVHSVNURVJfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9TVEFSVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9TVE9QX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1BST1RFQ1RfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1BST1RFQ1RfUlNQX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1JDX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfQlJPV1NFX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfQlJPV1NFX0NMT1NFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1JFTU9URV9DTURfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkVNT1RFX1JTUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9WRU5ET1JfQ01EX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1ZFTkRPUl9SU1BfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkVDT05GSUdfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfU1VTUEVORF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9QRU5ESU5HX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX01FVEFfTVNHX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1JFSkVDVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9SQ19GRUFUX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1JDX1BTTV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9PRkZMT0FEX1NUQVJUX1JTUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQVZfQ09OTkVDVF9SRVFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0FWX0RJU0NPTk5FQ1RfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BVl9TVEFSVF9TVFJFQU1fUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BVl9TVE9QX1NUUkVBTV9SRVFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0FWX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQVZfU0lOS19DT05GSUdfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BVl9BQ0xfRElTQ09OTkVDVEVEKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0FWX09GRkxPQURfU1RBUlRfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BVl9BVlJDUF9PUEVOX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BVl9BVlJDUF9DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQVZfQVZSQ1BfUkVNT1RFX1BMQVlfRVZUKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV05fRVZFTlQiOwotICB9Ci19Ci0KLUJ0aWZBdkV2ZW50OjpCdGlmQXZFdmVudCh1aW50MzJfdCBldmVudCwgY29uc3Qgdm9pZCogcF9kYXRhLCBzaXplX3QgZGF0YV9sZW5ndGgpCi0gICAgOiBldmVudF8oZXZlbnQpLCBkYXRhXyhudWxscHRyKSwgZGF0YV9sZW5ndGhfKDApIHsKLSAgRGVlcENvcHkoZXZlbnQsIHBfZGF0YSwgZGF0YV9sZW5ndGgpOwotfQotCi1CdGlmQXZFdmVudDo6QnRpZkF2RXZlbnQoY29uc3QgQnRpZkF2RXZlbnQmIG90aGVyKQotICAgIDogZXZlbnRfKDApLCBkYXRhXyhudWxscHRyKSwgZGF0YV9sZW5ndGhfKDApIHsKLSAgKnRoaXMgPSBvdGhlcjsKLX0KLQotQnRpZkF2RXZlbnQmIEJ0aWZBdkV2ZW50OjpvcGVyYXRvcj0oY29uc3QgQnRpZkF2RXZlbnQmIG90aGVyKSB7Ci0gIERlZXBGcmVlKCk7Ci0gIERlZXBDb3B5KG90aGVyLkV2ZW50KCksIG90aGVyLkRhdGEoKSwgb3RoZXIuRGF0YUxlbmd0aCgpKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1CdGlmQXZFdmVudDo6fkJ0aWZBdkV2ZW50KCkgeyBEZWVwRnJlZSgpOyB9Ci0KLXN0ZDo6c3RyaW5nIEJ0aWZBdkV2ZW50OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnRfKTsKLX0KLQotc3RkOjpzdHJpbmcgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZSh1aW50MzJfdCBldmVudCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gZHVtcF9hdl9zbV9ldmVudF9uYW1lKChidGlmX2F2X3NtX2V2ZW50X3QpZXZlbnQpOwotICBzdGQ6OnN0cmluZ3N0cmVhbSBzc192YWx1ZTsKLSAgc3NfdmFsdWUgPDwgIigweCIgPDwgc3RkOjpoZXggPDwgZXZlbnQgPDwgIikiOwotICByZXR1cm4gbmFtZSArIHNzX3ZhbHVlLnN0cigpOwotfQotCi12b2lkIEJ0aWZBdkV2ZW50OjpEZWVwQ29weSh1aW50MzJfdCBldmVudCwgY29uc3Qgdm9pZCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfbGVuZ3RoKSB7Ci0gIGV2ZW50XyA9IGV2ZW50OwotICBkYXRhX2xlbmd0aF8gPSBkYXRhX2xlbmd0aDsKLSAgaWYgKGRhdGFfbGVuZ3RoID09IDApIHsKLSAgICBkYXRhXyA9IG51bGxwdHI7Ci0gIH0gZWxzZSB7Ci0gICAgZGF0YV8gPSBvc2lfbWFsbG9jKGRhdGFfbGVuZ3RoXyk7Ci0gICAgbWVtY3B5KGRhdGFfLCBwX2RhdGEsIGRhdGFfbGVuZ3RoKTsKLSAgfQotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9BVl9NRVRBX01TR19FVlQ6IHsKLSAgICAgIENIRUNLKGRhdGFfbGVuZ3RoID49IHNpemVvZih0QlRBX0FWKSk7Ci0gICAgICBjb25zdCB0QlRBX0FWKiBhdl9zcmMgPSAoY29uc3QgdEJUQV9BViopcF9kYXRhOwotICAgICAgdEJUQV9BViogYXZfZGVzdCA9ICh0QlRBX0FWKilkYXRhXzsKLSAgICAgIGlmIChhdl9zcmMtPm1ldGFfbXNnLnBfZGF0YSAmJiBhdl9zcmMtPm1ldGFfbXNnLmxlbikgewotICAgICAgICBhdl9kZXN0LT5tZXRhX21zZy5wX2RhdGEgPSAodWludDhfdCopb3NpX2NhbGxvYyhhdl9zcmMtPm1ldGFfbXNnLmxlbik7Ci0gICAgICAgIG1lbWNweShhdl9kZXN0LT5tZXRhX21zZy5wX2RhdGEsIGF2X3NyYy0+bWV0YV9tc2cucF9kYXRhLAotICAgICAgICAgICAgICAgYXZfc3JjLT5tZXRhX21zZy5sZW4pOwotICAgICAgfQotCi0gICAgICBpZiAoYXZfc3JjLT5tZXRhX21zZy5wX21zZykgewotICAgICAgICBhdl9kZXN0LT5tZXRhX21zZy5wX21zZyA9ICh0QVZSQ19NU0cqKW9zaV9jYWxsb2Moc2l6ZW9mKHRBVlJDX01TRykpOwotICAgICAgICBtZW1jcHkoYXZfZGVzdC0+bWV0YV9tc2cucF9tc2csIGF2X3NyYy0+bWV0YV9tc2cucF9tc2csCi0gICAgICAgICAgICAgICBzaXplb2YodEFWUkNfTVNHKSk7Ci0KLSAgICAgICAgdEFWUkNfTVNHKiBwX21zZ19zcmMgPSBhdl9zcmMtPm1ldGFfbXNnLnBfbXNnOwotICAgICAgICB0QVZSQ19NU0cqIHBfbXNnX2Rlc3QgPSBhdl9kZXN0LT5tZXRhX21zZy5wX21zZzsKLQotICAgICAgICBpZiAoKHBfbXNnX3NyYy0+aGRyLm9wY29kZSA9PSBBVlJDX09QX1ZFTkRPUikgJiYKLSAgICAgICAgICAgIChwX21zZ19zcmMtPnZlbmRvci5wX3ZlbmRvcl9kYXRhICYmIHBfbXNnX3NyYy0+dmVuZG9yLnZlbmRvcl9sZW4pKSB7Ci0gICAgICAgICAgcF9tc2dfZGVzdC0+dmVuZG9yLnBfdmVuZG9yX2RhdGEgPQotICAgICAgICAgICAgICAodWludDhfdCopb3NpX2NhbGxvYyhwX21zZ19zcmMtPnZlbmRvci52ZW5kb3JfbGVuKTsKLSAgICAgICAgICBtZW1jcHkocF9tc2dfZGVzdC0+dmVuZG9yLnBfdmVuZG9yX2RhdGEsCi0gICAgICAgICAgICAgICAgIHBfbXNnX3NyYy0+dmVuZG9yLnBfdmVuZG9yX2RhdGEsIHBfbXNnX3NyYy0+dmVuZG9yLnZlbmRvcl9sZW4pOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocF9tc2dfc3JjLT5oZHIub3Bjb2RlID09IEFWUkNfT1BfQlJPV1NFKSAmJgotICAgICAgICAgICAgcF9tc2dfc3JjLT5icm93c2UucF9icm93c2VfZGF0YSAmJiBwX21zZ19zcmMtPmJyb3dzZS5icm93c2VfbGVuKSB7Ci0gICAgICAgICAgcF9tc2dfZGVzdC0+YnJvd3NlLnBfYnJvd3NlX2RhdGEgPQotICAgICAgICAgICAgICAodWludDhfdCopb3NpX2NhbGxvYyhwX21zZ19zcmMtPmJyb3dzZS5icm93c2VfbGVuKTsKLSAgICAgICAgICBtZW1jcHkocF9tc2dfZGVzdC0+YnJvd3NlLnBfYnJvd3NlX2RhdGEsCi0gICAgICAgICAgICAgICAgIHBfbXNnX3NyYy0+YnJvd3NlLnBfYnJvd3NlX2RhdGEsIHBfbXNnX3NyYy0+YnJvd3NlLmJyb3dzZV9sZW4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIEJ0aWZBdkV2ZW50OjpEZWVwRnJlZSgpIHsKLSAgc3dpdGNoIChldmVudF8pIHsKLSAgICBjYXNlIEJUQV9BVl9NRVRBX01TR19FVlQ6IHsKLSAgICAgIHRCVEFfQVYqIGF2ID0gKHRCVEFfQVYqKWRhdGFfOwotICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmF2LT5tZXRhX21zZy5wX2RhdGEpOwotCi0gICAgICBpZiAoYXYtPm1ldGFfbXNnLnBfbXNnKSB7Ci0gICAgICAgIGlmIChhdi0+bWV0YV9tc2cucF9tc2ctPmhkci5vcGNvZGUgPT0gQVZSQ19PUF9WRU5ET1IpIHsKLSAgICAgICAgICBvc2lfZnJlZShhdi0+bWV0YV9tc2cucF9tc2ctPnZlbmRvci5wX3ZlbmRvcl9kYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXYtPm1ldGFfbXNnLnBfbXNnLT5oZHIub3Bjb2RlID09IEFWUkNfT1BfQlJPV1NFKSB7Ci0gICAgICAgICAgb3NpX2ZyZWUoYXYtPm1ldGFfbXNnLnBfbXNnLT5icm93c2UucF9icm93c2VfZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmF2LT5tZXRhX21zZy5wX21zZyk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZkYXRhXyk7Ci0gIGRhdGFfbGVuZ3RoXyA9IDA7Ci19Ci0KLUJ0aWZBdlBlZXI6OkJ0aWZBdlBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50OF90IHBlZXJfc2VwLAotICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0hOREwgYnRhX2hhbmRsZSwgdWludDhfdCBwZWVyX2lkKQotICAgIDogcGVlcl9hZGRyZXNzXyhwZWVyX2FkZHJlc3MpLAotICAgICAgcGVlcl9zZXBfKHBlZXJfc2VwKSwKLSAgICAgIGJ0YV9oYW5kbGVfKGJ0YV9oYW5kbGUpLAotICAgICAgcGVlcl9pZF8ocGVlcl9pZCksCi0gICAgICBzdGF0ZV9tYWNoaW5lXygqdGhpcyksCi0gICAgICBhdl9vcGVuX29uX3JjX3RpbWVyXyhudWxscHRyKSwKLSAgICAgIGVkcl8oMCksCi0gICAgICBmbGFnc18oMCksCi0gICAgICBzZWxmX2luaXRpYXRlZF9jb25uZWN0aW9uXyhmYWxzZSksCi0gICAgICBkZWxheV9yZXBvcnRfKDApIHt9Ci0KLUJ0aWZBdlBlZXI6On5CdGlmQXZQZWVyKCkgeyBhbGFybV9mcmVlKGF2X29wZW5fb25fcmNfdGltZXJfKTsgfQotCi1zdGQ6OnN0cmluZyBCdGlmQXZQZWVyOjpGbGFnc1RvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0KLSAgaWYgKGZsYWdzXyAmIEJ0aWZBdlBlZXI6OmtGbGFnTG9jYWxTdXNwZW5kUGVuZGluZykgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICJMT0NBTF9TVVNQRU5EX1BFTkRJTkciOwotICB9Ci0gIGlmIChmbGFnc18gJiBCdGlmQXZQZWVyOjprRmxhZ1JlbW90ZVN1c3BlbmQpIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiUkVNT1RFX1NVU1BFTkQiOwotICB9Ci0gIGlmIChmbGFnc18gJiBCdGlmQXZQZWVyOjprRmxhZ1BlbmRpbmdTdGFydCkgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICJQRU5ESU5HX1NUQVJUIjsKLSAgfQotICBpZiAoZmxhZ3NfICYgQnRpZkF2UGVlcjo6a0ZsYWdQZW5kaW5nU3RvcCkgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICJQRU5ESU5HX1NUT1AiOwotICB9Ci0gIGlmIChyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ID0gIk5vbmUiOwotCi0gIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoIjB4JXgoJXMpIiwgZmxhZ3NfLCByZXN1bHQuY19zdHIoKSk7Ci19Ci0KLWJ0X3N0YXR1c190IEJ0aWZBdlBlZXI6OkluaXQoKSB7Ci0gIGFsYXJtX2ZyZWUoYXZfb3Blbl9vbl9yY190aW1lcl8pOwotICBhdl9vcGVuX29uX3JjX3RpbWVyXyA9IGFsYXJtX25ldygiYnRpZl9hdl9wZWVyLmF2X29wZW5fb25fcmNfdGltZXIiKTsKLSAgaXNfc2lsZW5jZWRfID0gZmFsc2U7Ci0KLSAgc3RhdGVfbWFjaGluZV8uU3RhcnQoKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIEJ0aWZBdlBlZXI6OkNsZWFudXAoKSB7Ci0gIHN0YXRlX21hY2hpbmVfLlF1aXQoKTsKLSAgYWxhcm1fZnJlZShhdl9vcGVuX29uX3JjX3RpbWVyXyk7Ci0gIGF2X29wZW5fb25fcmNfdGltZXJfID0gbnVsbHB0cjsKLX0KLQotYm9vbCBCdGlmQXZQZWVyOjpDYW5CZURlbGV0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoCi0gICAgICAoc3RhdGVfbWFjaGluZV8uU3RhdGVJZCgpID09IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSkgJiYKLSAgICAgIChzdGF0ZV9tYWNoaW5lXy5QcmV2aW91c1N0YXRlSWQoKSAhPSBCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZUludmFsaWQpKTsKLX0KLQotY29uc3QgUmF3QWRkcmVzcyYgQnRpZkF2UGVlcjo6QWN0aXZlUGVlckFkZHJlc3MoKSBjb25zdCB7Ci0gIGlmIChJc1NvdXJjZSgpKSB7Ci0gICAgcmV0dXJuIGJ0aWZfYXZfc2luay5BY3RpdmVQZWVyKCk7Ci0gIH0KLSAgaWYgKElzU2luaygpKSB7Ci0gICAgcmV0dXJuIGJ0aWZfYXZfc291cmNlLkFjdGl2ZVBlZXIoKTsKLSAgfQotICBMT0coRkFUQUwpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogQTJEUCBwZWVyICIgPDwgUGVlckFkZHJlc3MoKQotICAgICAgICAgICAgIDw8ICIgaXMgbmVpdGhlciBTb3VyY2Ugbm9yIFNpbmsiOwotICByZXR1cm4gUmF3QWRkcmVzczo6a0VtcHR5OwotfQotCi1ib29sIEJ0aWZBdlBlZXI6OklzQ29ubmVjdGVkKCkgY29uc3QgewotICBpbnQgc3RhdGUgPSBzdGF0ZV9tYWNoaW5lXy5TdGF0ZUlkKCk7Ci0gIHJldHVybiAoKHN0YXRlID09IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkKSB8fAotICAgICAgICAgIChzdGF0ZSA9PSBCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZVN0YXJ0ZWQpKTsKLX0KLQotYm9vbCBCdGlmQXZQZWVyOjpJc1N0cmVhbWluZygpIGNvbnN0IHsKLSAgaW50IHN0YXRlID0gc3RhdGVfbWFjaGluZV8uU3RhdGVJZCgpOwotICByZXR1cm4gKHN0YXRlID09IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZCk7Ci19Ci0KLUJ0aWZBdlNvdXJjZTo6fkJ0aWZBdlNvdXJjZSgpIHsgQ2xlYW51cEFsbFBlZXJzKCk7IH0KLQotYnRfc3RhdHVzX3QgQnRpZkF2U291cmNlOjpJbml0KAotICAgIGJ0YXZfc291cmNlX2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGludCBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllcywKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBvZmZsb2FkaW5nX3ByZWZlcmVuY2UpIHsKLSAgTE9HX0lORk8oIiVzOiBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXM9JWQiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMpOwotICBpZiAoZW5hYmxlZF8pIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgQ2xlYW51cEFsbFBlZXJzKCk7Ci0gIG1heF9jb25uZWN0ZWRfcGVlcnNfID0gbWF4X2Nvbm5lY3RlZF9hdWRpb19kZXZpY2VzOwotCi0gIC8qIEEyRFAgT0ZGTE9BRCAqLwotICBjaGFyIHZhbHVlX3N1cFtQUk9QRVJUWV9WQUxVRV9NQVhdID0geydcMCd9OwotICBjaGFyIHZhbHVlX2Rpc1tQUk9QRVJUWV9WQUxVRV9NQVhdID0geydcMCd9OwotICBvc2lfcHJvcGVydHlfZ2V0KCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIHZhbHVlX3N1cCwgImZhbHNlIik7Ci0gIG9zaV9wcm9wZXJ0eV9nZXQoInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIHZhbHVlX2RpcywKLSAgICAgICAgICAgICAgICAgICAiZmFsc2UiKTsKLSAgYTJkcF9vZmZsb2FkX2VuYWJsZWRfID0KLSAgICAgIChzdHJjbXAodmFsdWVfc3VwLCAidHJ1ZSIpID09IDApICYmIChzdHJjbXAodmFsdWVfZGlzLCAiZmFsc2UiKSA9PSAwKTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiYTJkcF9vZmZsb2FkLmVuYWJsZSA9ICVkIiwgYTJkcF9vZmZsb2FkX2VuYWJsZWRfKTsKLQotICBjYWxsYmFja3NfID0gY2FsbGJhY2tzOwotICBpZiAoYTJkcF9vZmZsb2FkX2VuYWJsZWRfKSB7Ci0gICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6dXBkYXRlX2NvZGVjX29mZmxvYWRpbmdfY2FwYWJpbGl0aWVzKAotICAgICAgICBvZmZsb2FkaW5nX3ByZWZlcmVuY2UpOwotICB9Ci0gIGJ0YV9hdl9jb19pbml0KGNvZGVjX3ByaW9yaXRpZXMpOwotCi0gIGlmICghYnRpZl9hMmRwX3NvdXJjZV9pbml0KCkpIHsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgYnRpZl9lbmFibGVfc2VydmljZShCVEFfQTJEUF9TT1VSQ0VfU0VSVklDRV9JRCk7Ci0gIGVuYWJsZWRfID0gdHJ1ZTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIEJ0aWZBdlNvdXJjZTo6Q2xlYW51cCgpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gIGlmICghZW5hYmxlZF8pIHJldHVybjsKLQotICBidGlmX3F1ZXVlX2NsZWFudXAoVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFKTsKLQotICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlOwotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKGJhc2U6Oklnbm9yZVJlc3VsdCgmQnRpZkF2U291cmNlOjpTZXRBY3RpdmVQZWVyKSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmJ0aWZfYXZfc291cmNlKSwgUmF3QWRkcmVzczo6a0VtcHR5LAotICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBlZXJfcmVhZHlfcHJvbWlzZSkpKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGlmX2EyZHBfc291cmNlX2NsZWFudXApKTsKLQotICBidGlmX2Rpc2FibGVfc2VydmljZShCVEFfQTJEUF9TT1VSQ0VfU0VSVklDRV9JRCk7Ci0gIENsZWFudXBBbGxQZWVycygpOwotCi0gIGNhbGxiYWNrc18gPSBudWxscHRyOwotICBlbmFibGVkXyA9IGZhbHNlOwotfQotCi1CdGlmQXZQZWVyKiBCdGlmQXZTb3VyY2U6OkZpbmRQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBhdXRvIGl0ID0gcGVlcnNfLmZpbmQocGVlcl9hZGRyZXNzKTsKLSAgaWYgKGl0ICE9IHBlZXJzXy5lbmQoKSkgcmV0dXJuIGl0LT5zZWNvbmQ7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1CdGlmQXZQZWVyKiBCdGlmQXZTb3VyY2U6OkZpbmRQZWVyQnlIYW5kbGUodEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUpIHsKLSAgZm9yIChhdXRvIGl0IDogcGVlcnNfKSB7Ci0gICAgQnRpZkF2UGVlciogcGVlciA9IGl0LnNlY29uZDsKLSAgICBpZiAocGVlci0+QnRhSGFuZGxlKCkgPT0gYnRhX2hhbmRsZSkgewotICAgICAgcmV0dXJuIHBlZXI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1CdGlmQXZQZWVyKiBCdGlmQXZTb3VyY2U6OkZpbmRQZWVyQnlQZWVySWQodWludDhfdCBwZWVyX2lkKSB7Ci0gIGZvciAoYXV0byBpdCA6IHBlZXJzXykgewotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBpdC5zZWNvbmQ7Ci0gICAgaWYgKHBlZXItPlBlZXJJZCgpID09IHBlZXJfaWQpIHsKLSAgICAgIHJldHVybiBwZWVyOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQnRpZkF2UGVlciogQnRpZkF2U291cmNlOjpGaW5kT3JDcmVhdGVQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0hOREwgYnRhX2hhbmRsZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcGVlcl9hZGRyZXNzPSVzIGJ0YV9oYW5kbGU9MHgleCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2hhbmRsZSk7Ci0KLSAgQnRpZkF2UGVlciogcGVlciA9IEZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwZWVyICE9IG51bGxwdHIpIHJldHVybiBwZWVyOwotCi0gIC8vIEZpbmQgbmV4dCBhdmFpbGFiaWUgUGVlciBJRCB0byB1c2UKLSAgdWludDhfdCBwZWVyX2lkOwotICBmb3IgKHBlZXJfaWQgPSBrUGVlcklkTWluOyBwZWVyX2lkIDwga1BlZXJJZE1heDsgcGVlcl9pZCsrKSB7Ci0gICAgaWYgKEZpbmRQZWVyQnlQZWVySWQocGVlcl9pZCkgPT0gbnVsbHB0cikgYnJlYWs7Ci0gIH0KLSAgaWYgKHBlZXJfaWQgPT0ga1BlZXJJZE1heCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogQ2Fubm90IGNyZWF0ZSBwZWVyIGZvciBwZWVyX2FkZHJlc3M9JXMgOiAiCi0gICAgICAgICJjYW5ub3QgYWxsb2NhdGUgdW5pcXVlIFBlZXIgSUQiLAotICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIC8vIEdldCB0aGUgQlRBIEhhbmRsZSAoaWYga25vd24pCi0gIGlmIChidGFfaGFuZGxlID09IGtCdGFIYW5kbGVVbmtub3duKSB7Ci0gICAgYXV0byBpdCA9IHBlZXJfaWQyYnRhX2hhbmRsZV8uZmluZChwZWVyX2lkKTsKLSAgICBpZiAoaXQgPT0gcGVlcl9pZDJidGFfaGFuZGxlXy5lbmQoKSB8fCBpdC0+c2Vjb25kID09IGtCdGFIYW5kbGVVbmtub3duKSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAgICIlczogQ2Fubm90IGNyZWF0ZSBwZWVyIGZvciBwZWVyX2FkZHJlc3M9JXMgOiAiCi0gICAgICAgICAgImNhbm5vdCBjb252ZXJ0IFBlZXIgSUQ9JWQgdG8gdW5pcXVlIEJUQSBIYW5kbGUiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIHBlZXJfaWQpOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGJ0YV9oYW5kbGUgPSBpdC0+c2Vjb25kOwotICB9Ci0KLSAgTE9HX0lORk8oIiVzOiBDcmVhdGUgcGVlcjogcGVlcl9hZGRyZXNzPSVzIGJ0YV9oYW5kbGU9MHgleCBwZWVyX2lkPSVkIiwKLSAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYnRhX2hhbmRsZSwKLSAgICAgICAgICAgcGVlcl9pZCk7Ci0gIHBlZXIgPSBuZXcgQnRpZkF2UGVlcihwZWVyX2FkZHJlc3MsIEFWRFRfVFNFUF9TTkssIGJ0YV9oYW5kbGUsIHBlZXJfaWQpOwotICBwZWVyc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBlZXJfYWRkcmVzcywgcGVlcikpOwotICBwZWVyLT5Jbml0KCk7Ci0gIHJldHVybiBwZWVyOwotfQotCi1ib29sIEJ0aWZBdlNvdXJjZTo6QWxsb3dlZFRvQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIGNvbnN0IHsKLSAgaW50IGNvbm5lY3RlZCA9IDA7Ci0KLSAgLy8gQ291bnQgcGVlcnMgdGhhdCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBvciBhbHJlYWR5IGNvbm5lY3RlZAotICBmb3IgKGF1dG8gaXQgOiBwZWVyc18pIHsKLSAgICBjb25zdCBCdGlmQXZQZWVyKiBwZWVyID0gaXQuc2Vjb25kOwotICAgIHN3aXRjaCAocGVlci0+U3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpKSB7Ci0gICAgICBjYXNlIEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmluZzoKLSAgICAgIGNhc2UgQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQ6Ci0gICAgICBjYXNlIEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZDoKLSAgICAgICAgaWYgKHBlZXItPlBlZXJBZGRyZXNzKCkgPT0gcGVlcl9hZGRyZXNzKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBbHJlYWR5IGNvbm5lY3RlZCBvciBhY2NvdW50ZWQgZm9yCi0gICAgICAgIH0KLSAgICAgICAgY29ubmVjdGVkKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoY29ubmVjdGVkIDwgbWF4X2Nvbm5lY3RlZF9wZWVyc18pOwotfQotCi1ib29sIEJ0aWZBdlNvdXJjZTo6RGVsZXRlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgYXV0byBpdCA9IHBlZXJzXy5maW5kKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChpdCA9PSBwZWVyc18uZW5kKCkpIHJldHVybiBmYWxzZTsKLSAgQnRpZkF2UGVlciogcGVlciA9IGl0LT5zZWNvbmQ7Ci0gIHBlZXItPkNsZWFudXAoKTsKLSAgcGVlcnNfLmVyYXNlKGl0KTsKLSAgZGVsZXRlIHBlZXI7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJ0aWZBdlNvdXJjZTo6RGVsZXRlSWRsZVBlZXJzKCkgewotICBmb3IgKGF1dG8gaXQgPSBwZWVyc18uYmVnaW4oKTsgaXQgIT0gcGVlcnNfLmVuZCgpOykgewotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBpdC0+c2Vjb25kOwotICAgIGF1dG8gcHJldl9pdCA9IGl0Kys7Ci0gICAgaWYgKCFwZWVyLT5DYW5CZURlbGV0ZWQoKSkgY29udGludWU7Ci0gICAgTE9HX0lORk8oIiVzOiBEZWxldGluZyBpZGxlIHBlZXI6ICVzIGJ0YV9oYW5kbGU9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwZWVyLT5CdGFIYW5kbGUoKSk7Ci0gICAgcGVlci0+Q2xlYW51cCgpOwotICAgIHBlZXJzXy5lcmFzZShwcmV2X2l0KTsKLSAgICBkZWxldGUgcGVlcjsKLSAgfQotfQotCi12b2lkIEJ0aWZBdlNvdXJjZTo6Q2xlYW51cEFsbFBlZXJzKCkgewotICB3aGlsZSAoIXBlZXJzXy5lbXB0eSgpKSB7Ci0gICAgYXV0byBpdCA9IHBlZXJzXy5iZWdpbigpOwotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBpdC0+c2Vjb25kOwotICAgIHBlZXItPkNsZWFudXAoKTsKLSAgICBwZWVyc18uZXJhc2UoaXQpOwotICAgIGRlbGV0ZSBwZWVyOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2U291cmNlOjpSZWdpc3RlckFsbEJ0YUhhbmRsZXMoKSB7Ci0gIGZvciAoaW50IHBlZXJfaWQgPSBrUGVlcklkTWluOyBwZWVyX2lkIDwga1BlZXJJZE1heDsgcGVlcl9pZCsrKSB7Ci0gICAgQlRBX0F2UmVnaXN0ZXIoQlRBX0FWX0NITkxfQVVESU8sIGtCdGlmQXZTb3VyY2VTZXJ2aWNlTmFtZS5jX3N0cigpLCBwZWVyX2lkLAotICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSk7Ci0gIH0KLX0KLQotdm9pZCBCdGlmQXZTb3VyY2U6OkRlcmVnaXN0ZXJBbGxCdGFIYW5kbGVzKCkgewotICBmb3IgKGF1dG8gaXQgOiBwZWVyX2lkMmJ0YV9oYW5kbGVfKSB7Ci0gICAgdEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUgPSBpdC5zZWNvbmQ7Ci0gICAgQlRBX0F2RGVyZWdpc3RlcihidGFfaGFuZGxlKTsKLSAgfQotICBwZWVyX2lkMmJ0YV9oYW5kbGVfLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQnRpZkF2U291cmNlOjpCdGFIYW5kbGVSZWdpc3RlcmVkKHVpbnQ4X3QgcGVlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlKSB7Ci0gIHBlZXJfaWQyYnRhX2hhbmRsZV8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBlZXJfaWQsIGJ0YV9oYW5kbGUpKTsKLQotICAvLyBTZXQgdGhlIEJUQSBIYW5kbGUgZm9yIHRoZSBQZWVyIChpZiBleGlzdHMpCi0gIEJ0aWZBdlBlZXIqIHBlZXIgPSBGaW5kUGVlckJ5UGVlcklkKHBlZXJfaWQpOwotICBpZiAocGVlciAhPSBudWxscHRyICYmIHBlZXItPkJ0YUhhbmRsZSgpICE9IGJ0YV9oYW5kbGUpIHsKLSAgICBpZiAocGVlci0+QnRhSGFuZGxlKCkgPT0ga0J0YUhhbmRsZVVua25vd24pIHsKLSAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgIiVzOiBBc3NpZ24gcGVlcjogcGVlcl9hZGRyZXNzPSVzIGJ0YV9oYW5kbGU9MHgleCBwZWVyX2lkPSVkIiwKLSAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICBidGFfaGFuZGxlLCBwZWVyX2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICIlczogQ29ycmVjdCBwZWVyOiBwZWVyX2FkZHJlc3M9JXMgYnRhX2hhbmRsZT0weCV4LT4weCV4IHBlZXJfaWQ9JWQiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgIHBlZXItPkJ0YUhhbmRsZSgpLCBidGFfaGFuZGxlLCBwZWVyX2lkKTsKLSAgICB9Ci0gICAgcGVlci0+U2V0QnRhSGFuZGxlKGJ0YV9oYW5kbGUpOwotICB9Ci19Ci0KLUJ0aWZBdlNpbms6On5CdGlmQXZTaW5rKCkgeyBDbGVhbnVwQWxsUGVlcnMoKTsgfQotCi1idF9zdGF0dXNfdCBCdGlmQXZTaW5rOjpJbml0KGJ0YXZfc2lua19jYWxsYmFja3NfdCogY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2Nvbm5lY3RlZF9hdWRpb19kZXZpY2VzKSB7Ci0gIExPR19JTkZPKCIlcyhtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXM9JWQpIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgbWF4X2Nvbm5lY3RlZF9hdWRpb19kZXZpY2VzKTsKLSAgaWYgKGVuYWJsZWRfKSByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0KLSAgQ2xlYW51cEFsbFBlZXJzKCk7Ci0gIG1heF9jb25uZWN0ZWRfcGVlcnNfID0gbWF4X2Nvbm5lY3RlZF9hdWRpb19kZXZpY2VzOwotICBjYWxsYmFja3NfID0gY2FsbGJhY2tzOwotCi0gIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNfcHJpb3JpdGllczsgIC8vIERlZmF1bHQgcHJpb3JpdGllcwotICBidGFfYXZfY29faW5pdChjb2RlY19wcmlvcml0aWVzKTsKLQotICBpZiAoIWJ0aWZfYTJkcF9zaW5rX2luaXQoKSkgewotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9BMkRQX1NJTktfU0VSVklDRV9JRCk7Ci0gIGVuYWJsZWRfID0gdHJ1ZTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIEJ0aWZBdlNpbms6OkNsZWFudXAoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICBpZiAoIWVuYWJsZWRfKSByZXR1cm47Ci0KLSAgYnRpZl9xdWV1ZV9jbGVhbnVwKFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2U7Ci0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoYmFzZTo6SWdub3JlUmVzdWx0KCZCdGlmQXZTaW5rOjpTZXRBY3RpdmVQZWVyKSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmJ0aWZfYXZfc2luayksIFJhd0FkZHJlc3M6OmtFbXB0eSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9hMmRwX3NpbmtfY2xlYW51cCkpOwotCi0gIGJ0aWZfZGlzYWJsZV9zZXJ2aWNlKEJUQV9BMkRQX1NJTktfU0VSVklDRV9JRCk7Ci0gIENsZWFudXBBbGxQZWVycygpOwotCi0gIGNhbGxiYWNrc18gPSBudWxscHRyOwotICBlbmFibGVkXyA9IGZhbHNlOwotfQotCi1CdGlmQXZQZWVyKiBCdGlmQXZTaW5rOjpGaW5kUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgYXV0byBpdCA9IHBlZXJzXy5maW5kKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChpdCAhPSBwZWVyc18uZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQnRpZkF2UGVlciogQnRpZkF2U2luazo6RmluZFBlZXJCeUhhbmRsZSh0QlRBX0FWX0hOREwgYnRhX2hhbmRsZSkgewotICBmb3IgKGF1dG8gaXQgOiBwZWVyc18pIHsKLSAgICBCdGlmQXZQZWVyKiBwZWVyID0gaXQuc2Vjb25kOwotICAgIGlmIChwZWVyLT5CdGFIYW5kbGUoKSA9PSBidGFfaGFuZGxlKSB7Ci0gICAgICByZXR1cm4gcGVlcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUJ0aWZBdlBlZXIqIEJ0aWZBdlNpbms6OkZpbmRQZWVyQnlQZWVySWQodWludDhfdCBwZWVyX2lkKSB7Ci0gIGZvciAoYXV0byBpdCA6IHBlZXJzXykgewotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBpdC5zZWNvbmQ7Ci0gICAgaWYgKHBlZXItPlBlZXJJZCgpID09IHBlZXJfaWQpIHsKLSAgICAgIHJldHVybiBwZWVyOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQnRpZkF2UGVlciogQnRpZkF2U2luazo6RmluZE9yQ3JlYXRlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwZWVyX2FkZHJlc3M9JXMgYnRhX2hhbmRsZT0weCV4IiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBidGFfaGFuZGxlKTsKLQotICBCdGlmQXZQZWVyKiBwZWVyID0gRmluZFBlZXIocGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBlZXIgIT0gbnVsbHB0cikgcmV0dXJuIHBlZXI7Ci0KLSAgLy8gRmluZCBuZXh0IGF2YWlsYWJpZSBQZWVyIElEIHRvIHVzZQotICB1aW50OF90IHBlZXJfaWQ7Ci0gIGZvciAocGVlcl9pZCA9IGtQZWVySWRNaW47IHBlZXJfaWQgPCBrUGVlcklkTWF4OyBwZWVyX2lkKyspIHsKLSAgICBpZiAoRmluZFBlZXJCeVBlZXJJZChwZWVyX2lkKSA9PSBudWxscHRyKSBicmVhazsKLSAgfQotICBpZiAocGVlcl9pZCA9PSBrUGVlcklkTWF4KSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3QgY3JlYXRlIHBlZXIgZm9yIHBlZXJfYWRkcmVzcz0lcyA6ICIKLSAgICAgICAgImNhbm5vdCBhbGxvY2F0ZSB1bmlxdWUgUGVlciBJRCIsCi0gICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBCVEEgSGFuZGxlIChpZiBrbm93bikKLSAgaWYgKGJ0YV9oYW5kbGUgPT0ga0J0YUhhbmRsZVVua25vd24pIHsKLSAgICBhdXRvIGl0ID0gcGVlcl9pZDJidGFfaGFuZGxlXy5maW5kKHBlZXJfaWQpOwotICAgIGlmIChpdCA9PSBwZWVyX2lkMmJ0YV9oYW5kbGVfLmVuZCgpIHx8IGl0LT5zZWNvbmQgPT0ga0J0YUhhbmRsZVVua25vd24pIHsKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgIiVzOiBDYW5ub3QgY3JlYXRlIHBlZXIgZm9yIHBlZXJfYWRkcmVzcz0lcyA6ICIKLSAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgUGVlciBJRD0lZCB0byB1bmlxdWUgQlRBIEhhbmRsZSIsCi0gICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgcGVlcl9pZCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgYnRhX2hhbmRsZSA9IGl0LT5zZWNvbmQ7Ci0gIH0KLQotICBMT0dfSU5GTygiJXM6IENyZWF0ZSBwZWVyOiBwZWVyX2FkZHJlc3M9JXMgYnRhX2hhbmRsZT0weCV4IHBlZXJfaWQ9JWQiLAotICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBidGFfaGFuZGxlLAotICAgICAgICAgICBwZWVyX2lkKTsKLSAgcGVlciA9IG5ldyBCdGlmQXZQZWVyKHBlZXJfYWRkcmVzcywgQVZEVF9UU0VQX1NSQywgYnRhX2hhbmRsZSwgcGVlcl9pZCk7Ci0gIHBlZXJzXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIocGVlcl9hZGRyZXNzLCBwZWVyKSk7Ci0gIHBlZXItPkluaXQoKTsKLSAgaWYgKGFjdGl2ZV9wZWVyXy5Jc0VtcHR5KCkpIHsKLSAgICBhY3RpdmVfcGVlcl8gPSBwZWVyX2FkZHJlc3M7Ci0gIH0KLSAgcmV0dXJuIHBlZXI7Ci19Ci0KLWJvb2wgQnRpZkF2U2luazo6QWxsb3dlZFRvQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIGNvbnN0IHsKLSAgaW50IGNvbm5lY3RlZCA9IDA7Ci0KLSAgLy8gQ291bnQgcGVlcnMgdGhhdCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBvciBhbHJlYWR5IGNvbm5lY3RlZAotICBmb3IgKGF1dG8gaXQgOiBwZWVyc18pIHsKLSAgICBjb25zdCBCdGlmQXZQZWVyKiBwZWVyID0gaXQuc2Vjb25kOwotICAgIHN3aXRjaCAocGVlci0+U3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpKSB7Ci0gICAgICBjYXNlIEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmluZzoKLSAgICAgIGNhc2UgQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQ6Ci0gICAgICBjYXNlIEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZDoKLSAgICAgICAgaWYgKHBlZXItPlBlZXJBZGRyZXNzKCkgPT0gcGVlcl9hZGRyZXNzKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBbHJlYWR5IGNvbm5lY3RlZCBvciBhY2NvdW50ZWQgZm9yCi0gICAgICAgIH0KLSAgICAgICAgY29ubmVjdGVkKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoY29ubmVjdGVkIDwgbWF4X2Nvbm5lY3RlZF9wZWVyc18pOwotfQotCi1ib29sIEJ0aWZBdlNpbms6OkRlbGV0ZVBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIGF1dG8gaXQgPSBwZWVyc18uZmluZChwZWVyX2FkZHJlc3MpOwotICBpZiAoaXQgPT0gcGVlcnNfLmVuZCgpKSByZXR1cm4gZmFsc2U7Ci0gIEJ0aWZBdlBlZXIqIHBlZXIgPSBpdC0+c2Vjb25kOwotICBwZWVyLT5DbGVhbnVwKCk7Ci0gIHBlZXJzXy5lcmFzZShpdCk7Ci0gIGRlbGV0ZSBwZWVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBCdGlmQXZTaW5rOjpEZWxldGVJZGxlUGVlcnMoKSB7Ci0gIGZvciAoYXV0byBpdCA9IHBlZXJzXy5iZWdpbigpOyBpdCAhPSBwZWVyc18uZW5kKCk7KSB7Ci0gICAgQnRpZkF2UGVlciogcGVlciA9IGl0LT5zZWNvbmQ7Ci0gICAgYXV0byBwcmV2X2l0ID0gaXQrKzsKLSAgICBpZiAoIXBlZXItPkNhbkJlRGVsZXRlZCgpKSBjb250aW51ZTsKLSAgICBMT0dfSU5GTygiJXM6IERlbGV0aW5nIGlkbGUgcGVlcjogJXMgYnRhX2hhbmRsZT0weCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHBlZXItPkJ0YUhhbmRsZSgpKTsKLSAgICBwZWVyLT5DbGVhbnVwKCk7Ci0gICAgcGVlcnNfLmVyYXNlKHByZXZfaXQpOwotICAgIGRlbGV0ZSBwZWVyOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2U2luazo6Q2xlYW51cEFsbFBlZXJzKCkgewotICB3aGlsZSAoIXBlZXJzXy5lbXB0eSgpKSB7Ci0gICAgYXV0byBpdCA9IHBlZXJzXy5iZWdpbigpOwotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBpdC0+c2Vjb25kOwotICAgIHBlZXItPkNsZWFudXAoKTsKLSAgICBwZWVyc18uZXJhc2UoaXQpOwotICAgIGRlbGV0ZSBwZWVyOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2U2luazo6UmVnaXN0ZXJBbGxCdGFIYW5kbGVzKCkgewotICBmb3IgKGludCBwZWVyX2lkID0ga1BlZXJJZE1pbjsgcGVlcl9pZCA8IGtQZWVySWRNYXg7IHBlZXJfaWQrKykgewotICAgIEJUQV9BdlJlZ2lzdGVyKEJUQV9BVl9DSE5MX0FVRElPLCBrQnRpZkF2U2lua1NlcnZpY2VOYW1lLmNfc3RyKCksIHBlZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgYnRhX2F2X3NpbmtfbWVkaWFfY2FsbGJhY2ssIFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2U2luazo6RGVyZWdpc3RlckFsbEJ0YUhhbmRsZXMoKSB7Ci0gIGZvciAoYXV0byBpdCA6IHBlZXJfaWQyYnRhX2hhbmRsZV8pIHsKLSAgICB0QlRBX0FWX0hOREwgYnRhX2hhbmRsZSA9IGl0LnNlY29uZDsKLSAgICBCVEFfQXZEZXJlZ2lzdGVyKGJ0YV9oYW5kbGUpOwotICB9Ci0gIHBlZXJfaWQyYnRhX2hhbmRsZV8uY2xlYXIoKTsKLX0KLQotdm9pZCBCdGlmQXZTaW5rOjpCdGFIYW5kbGVSZWdpc3RlcmVkKHVpbnQ4X3QgcGVlcl9pZCwgdEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUpIHsKLSAgcGVlcl9pZDJidGFfaGFuZGxlXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIocGVlcl9pZCwgYnRhX2hhbmRsZSkpOwotCi0gIC8vIFNldCB0aGUgQlRBIEhhbmRsZSBmb3IgdGhlIFBlZXIgKGlmIGV4aXN0cykKLSAgQnRpZkF2UGVlciogcGVlciA9IEZpbmRQZWVyQnlQZWVySWQocGVlcl9pZCk7Ci0gIGlmIChwZWVyICE9IG51bGxwdHIgJiYgcGVlci0+QnRhSGFuZGxlKCkgIT0gYnRhX2hhbmRsZSkgewotICAgIGlmIChwZWVyLT5CdGFIYW5kbGUoKSA9PSBrQnRhSGFuZGxlVW5rbm93bikgewotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgKLSAgICAgICAgICAiJXM6IEFzc2lnbiBwZWVyOiBwZWVyX2FkZHJlc3M9JXMgYnRhX2hhbmRsZT0weCV4IHBlZXJfaWQ9JWQiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgIGJ0YV9oYW5kbGUsIHBlZXJfaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgIiVzOiBDb3JyZWN0IHBlZXI6IHBlZXJfYWRkcmVzcz0lcyBidGFfaGFuZGxlPTB4JXgtPjB4JXggcGVlcl9pZD0lZCIsCi0gICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgcGVlci0+QnRhSGFuZGxlKCksIGJ0YV9oYW5kbGUsIHBlZXJfaWQpOwotICAgIH0KLSAgICBwZWVyLT5TZXRCdGFIYW5kbGUoYnRhX2hhbmRsZSk7Ci0gIH0KLX0KLQotdm9pZCBCdGlmQXZTdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6T25FbnRlcigpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBwZWVyXy5TZXRFZHIoMCk7Ci0gIHBlZXJfLkNsZWFyQWxsRmxhZ3MoKTsKLQotICAvLyBTdG9wIEEyRFAgaWYgdGhpcyBpcyB0aGUgYWN0aXZlIHBlZXIKLSAgaWYgKHBlZXJfLklzQWN0aXZlUGVlcigpIHx8IHBlZXJfLkFjdGl2ZVBlZXJBZGRyZXNzKCkuSXNFbXB0eSgpKSB7Ci0gICAgYnRpZl9hMmRwX29uX2lkbGUoKTsKLSAgfQotCi0gIC8vIFJlc2V0IHRoZSBhY3RpdmUgcGVlciBpZiB0aGlzIHdhcyB0aGUgYWN0aXZlIHBlZXIgYW5kCi0gIC8vIHRoZSBJZGxlIHN0YXRlIHdhcyByZWVudGVyZWQKLSAgaWYgKHBlZXJfLklzQWN0aXZlUGVlcigpICYmIHBlZXJfLkNhbkJlRGVsZXRlZCgpKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZTsKLSAgICBpZiAocGVlcl8uSXNTaW5rKCkpIHsKLSAgICAgIGJ0aWZfYXZfc291cmNlLlNldEFjdGl2ZVBlZXIoUmF3QWRkcmVzczo6a0VtcHR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVlcl9yZWFkeV9wcm9taXNlKSk7Ci0gICAgfSBlbHNlIGlmIChwZWVyXy5Jc1NvdXJjZSgpKSB7Ci0gICAgICBidGlmX2F2X3NpbmsuU2V0QWN0aXZlUGVlcihSYXdBZGRyZXNzOjprRW1wdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVlcl9yZWFkeV9wcm9taXNlKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRGVsZXRlIHBlZXJzIHRoYXQgYXJlIHJlLWVudGVyaW5nIHRoZSBJZGxlIHN0YXRlCi0gIGlmIChwZWVyXy5Jc1NpbmsoKSkgewotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmQnRpZkF2U291cmNlOjpEZWxldGVJZGxlUGVlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmJ0aWZfYXZfc291cmNlKSkpOwotICB9IGVsc2UgaWYgKHBlZXJfLklzU291cmNlKCkpIHsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkJ0aWZBdlNpbms6OkRlbGV0ZUlkbGVQZWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmYnRpZl9hdl9zaW5rKSkpOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2U3RhdGVNYWNoaW5lOjpTdGF0ZUlkbGU6Ok9uRXhpdCgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotYm9vbCBCdGlmQXZTdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBhY3RpdmVfcGVlcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHBlZXJfLklzQWN0aXZlUGVlcigpKS5jX3N0cigpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfQVZfRU5BQkxFX0VWVDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FWX1NUT1BfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FWX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FWX0FDTF9ESVNDT05ORUNURUQ6Ci0gICAgICAvLyBJZ25vcmUuIEp1c3QgcmUtZW50ZXIgSWRsZSBzbyB0aGUgcGVlciBjYW4gYmUgZGVsZXRlZAotICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BVl9ESVNDT05ORUNUX1JFUV9FVlQ6Ci0gICAgICBpZiAocGVlcl8uQnRhSGFuZGxlKCkgIT0ga0J0YUhhbmRsZVVua25vd24pIHsKLSAgICAgICAgQlRBX0F2Q2xvc2UocGVlcl8uQnRhSGFuZGxlKCkpOwotICAgICAgICBpZiAocGVlcl8uSXNTb3VyY2UoKSkgewotICAgICAgICAgIEJUQV9BdkNsb3NlUmMocGVlcl8uQnRhSGFuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBSZS1lbnRlciBJZGxlIHNvIHRoZSBwZWVyIGNhbiBiZSBkZWxldGVkCi0gICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FWX0NPTk5FQ1RfUkVRX0VWVDoKLSAgICBjYXNlIEJUQV9BVl9QRU5ESU5HX0VWVDogewotICAgICAgYm9vbCBjYW5fY29ubmVjdCA9IHRydWU7Ci0gICAgICBwZWVyXy5TZXRTZWxmSW5pdGlhdGVkQ29ubmVjdGlvbihldmVudCA9PSBCVElGX0FWX0NPTk5FQ1RfUkVRX0VWVCk7Ci0gICAgICAvLyBDaGVjayB3aGV0aGVyIGNvbm5lY3Rpb24gaXMgYWxsb3dlZAotICAgICAgaWYgKHBlZXJfLklzU2luaygpKSB7Ci0gICAgICAgIGNhbl9jb25uZWN0ID0gYnRpZl9hdl9zb3VyY2UuQWxsb3dlZFRvQ29ubmVjdChwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgICAgaWYgKCFjYW5fY29ubmVjdCkgc3JjX2Rpc2Nvbm5lY3Rfc2luayhwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgIH0gZWxzZSBpZiAocGVlcl8uSXNTb3VyY2UoKSkgewotICAgICAgICBjYW5fY29ubmVjdCA9IGJ0aWZfYXZfc2luay5BbGxvd2VkVG9Db25uZWN0KHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgICBpZiAoIWNhbl9jb25uZWN0KSBzaW5rX2Rpc2Nvbm5lY3Rfc3JjKHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgfQotICAgICAgaWYgKCFjYW5fY29ubmVjdCkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBDYW5ub3QgY29ubmVjdCB0byBwZWVyICVzOiB0b28gbWFueSBjb25uZWN0ZWQgIgotICAgICAgICAgICAgInBlZXJzIiwKLSAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHBlZXJfLlNlbGZJbml0aWF0ZWRDb25uZWN0aW9uKCkpIHsKLSAgICAgICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJ0aWZfYXZfcXVlcnlfbWFuZGF0b3J5X2NvZGVjX3ByaW9yaXR5KHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgQlRBX0F2T3BlbihwZWVyXy5QZWVyQWRkcmVzcygpLCBwZWVyXy5CdGFIYW5kbGUoKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgcGVlcl8uTG9jYWxVdWlkU2VydmljZUNsYXNzKCkpOwotICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmluZyk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEJUSUZfQVZfQVZSQ1BfT1BFTl9FVlQ6Ci0gICAgY2FzZSBCVEFfQVZfUkNfT1BFTl9FVlQ6IHsKLSAgICAgIC8vIElPUF9GSVg6IEphYnJhIDYyMCBvbmx5IGRvZXMgQVZSQ1AgT3BlbiB3aXRob3V0IEFWIE9wZW4gd2hlbmV2ZXIgaXQKLSAgICAgIC8vIGNvbm5lY3RzLiBTbyBhcyBwZXIgdGhlIEFWIFdQLCBhbiBBVlJDUCBjb25uZWN0aW9uIGNhbm5vdCBleGlzdAotICAgICAgLy8gd2l0aG91dCBhbiBBViBjb25uZWN0aW9uLiBUaGVyZWZvcmUsIHdlIGluaXRpYXRlIGFuIEFWIGNvbm5lY3Rpb24KLSAgICAgIC8vIGlmIGFuIFJDX09QRU5fRVZUIGlzIHJlY2VpdmVkIHdoZW4gd2UgYXJlIGluIEFWX0NMT1NFRCBzdGF0ZS4KLSAgICAgIC8vIFdlIGluaXRpYXRlIHRoZSBBViBjb25uZWN0aW9uIGFmdGVyIGEgc21hbGwgM3MgdGltZW91dCB0byBhdm9pZCBhbnkKLSAgICAgIC8vIGNvbGxpc2lvbnMgZnJvbSB0aGUgaGVhZHNldHMsIGFzIHNvbWUgaGVhZHNldHMgaW5pdGlhdGUgdGhlIEFWUkNQCi0gICAgICAvLyBjb25uZWN0aW9uIGZpcnN0IGFuZCB0aGVuIGltbWVkaWF0ZWx5IGluaXRpYXRlIHRoZSBBViBjb25uZWN0aW9uCi0gICAgICAvLwotICAgICAgLy8gVE9ETzogV2UgbWF5IG5lZWQgdG8gZG8gdGhpcyBvbmx5IG9uIGFuIEFWUkNQIFBsYXkuIEZpeE1lCi0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgcmVjZWl2ZWQgd2l0aG91dCBBViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLQotICAgICAgYm9vbCBjYW5fY29ubmVjdCA9IHRydWU7Ci0gICAgICAvLyBDaGVjayB3aGV0aGVyIGNvbm5lY3Rpb24gaXMgYWxsb3dlZAotICAgICAgaWYgKHBlZXJfLklzU2luaygpKSB7Ci0gICAgICAgIGNhbl9jb25uZWN0ID0gYnRpZl9hdl9zb3VyY2UuQWxsb3dlZFRvQ29ubmVjdChwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgICAgaWYgKCFjYW5fY29ubmVjdCkgc3JjX2Rpc2Nvbm5lY3Rfc2luayhwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgIH0gZWxzZSBpZiAocGVlcl8uSXNTb3VyY2UoKSkgewotICAgICAgICBjYW5fY29ubmVjdCA9IGJ0aWZfYXZfc2luay5BbGxvd2VkVG9Db25uZWN0KHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgICBpZiAoIWNhbl9jb25uZWN0KSBzaW5rX2Rpc2Nvbm5lY3Rfc3JjKHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgfQotICAgICAgaWYgKCFjYW5fY29ubmVjdCkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBDYW5ub3QgY29ubmVjdCB0byBwZWVyICVzOiB0b28gbWFueSBjb25uZWN0ZWQgIgotICAgICAgICAgICAgInBlZXJzIiwKLSAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoYnRpZl9hdl9zb3VyY2UuRW5hYmxlZCgpKSB7Ci0gICAgICAgIGFsYXJtX3NldF9vbl9tbG9vcCgKLSAgICAgICAgICAgIHBlZXJfLkF2T3Blbk9uUmNUaW1lcigpLCBCdGlmQXZQZWVyOjprVGltZW91dEF2T3Blbk9uUmNNcywKLSAgICAgICAgICAgIGJ0aWZfYXZfc291cmNlX2luaXRpYXRlX2F2X29wZW5fdGltZXJfdGltZW91dCwgJnBlZXJfKTsKLSAgICAgIH0gZWxzZSBpZiAoYnRpZl9hdl9zaW5rLkVuYWJsZWQoKSkgewotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocGVlcl8uQXZPcGVuT25SY1RpbWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZQZWVyOjprVGltZW91dEF2T3Blbk9uUmNNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYXZfc2lua19pbml0aWF0ZV9hdl9vcGVuX3RpbWVyX3RpbWVvdXQsICZwZWVyXyk7Ci0gICAgICB9Ci0gICAgICBpZiAoZXZlbnQgPT0gQlRBX0FWX1JDX09QRU5fRVZUKSB7Ci0gICAgICAgIGJ0aWZfcmNfaGFuZGxlcihldmVudCwgKHRCVEFfQVYqKXBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1JDX0JST1dTRV9PUEVOX0VWVDoKLSAgICAgIGJ0aWZfcmNfaGFuZGxlcihldmVudCwgKHRCVEFfQVYqKXBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIC8vIEluIGNhc2UgU2lnbmFsbGluZyBjaGFubmVsIGlzIG5vdCBkb3duIGFuZCByZW1vdGUgc3RhcnRlZCBTdHJlYW1pbmcKLSAgICAvLyBQcm9jZWR1cmUsIHdlIGhhdmUgdG8gaGFuZGxlIENvbmZpZyBhbmQgT3BlbiBldmVudCBpbiBJZGxlIHN0YXRlLgotICAgIC8vIFdlIGhpdCB0aGVzZSBzY2VuYXJpb3Mgd2hpbGUgcnVubmluZyBQVFMgdGVzdCBjYXNlIGZvciBBVlJDUCBDb250cm9sbGVyLgotICAgIGNhc2UgQlRJRl9BVl9TSU5LX0NPTkZJR19SRVFfRVZUOiB7Ci0gICAgICBjb25zdCBidGlmX2F2X3NpbmtfY29uZmlnX3JlcV90KiBwX2NvbmZpZ19yZXEgPQotICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGJ0aWZfYXZfc2lua19jb25maWdfcmVxX3QqPihwX2RhdGEpOwotICAgICAgYnRpZl9hdl9yZXBvcnRfc2lua19hdWRpb19jb25maWdfc3RhdGUocF9jb25maWdfcmVxLT5wZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NvbmZpZ19yZXEtPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jb25maWdfcmVxLT5jaGFubmVsX2NvdW50KTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfT1BFTl9FVlQ6IHsKLSAgICAgIHRCVEFfQVYqIHBfYnRhX2RhdGEgPSAodEJUQV9BViopcF9kYXRhOwotICAgICAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGU7Ci0gICAgICBpbnQgYXZfc3RhdGU7Ci0gICAgICB0QlRBX0FWX1NUQVRVUyBzdGF0dXMgPSBwX2J0YV9kYXRhLT5vcGVuLnN0YXR1czsKLSAgICAgIGJvb2wgY2FuX2Nvbm5lY3QgPSB0cnVlOwotCi0gICAgICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBzdGF0dXM9JWQoJXMpIGVkcj0weCV4IiwKLSAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAoc3RhdHVzID09IEJUQV9BVl9TVUNDRVNTKSA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiLAotICAgICAgICAgICAgICAgcF9idGFfZGF0YS0+b3Blbi5lZHIpOwotCi0gICAgICBpZiAocF9idGFfZGF0YS0+b3Blbi5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpIHsKLSAgICAgICAgc3RhdGUgPSBCVEFWX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBhdl9zdGF0ZSA9IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkOwotICAgICAgICBwZWVyXy5TZXRFZHIocF9idGFfZGF0YS0+b3Blbi5lZHIpOwotICAgICAgICBDSEVDSyhwZWVyXy5QZWVyU2VwKCkgPT0gcF9idGFfZGF0YS0+b3Blbi5zZXApOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGNvbm5lY3Rpb24gaXMgYWxsb3dlZAotICAgICAgICBpZiAocGVlcl8uSXNTaW5rKCkpIHsKLSAgICAgICAgICBjYW5fY29ubmVjdCA9IGJ0aWZfYXZfc291cmNlLkFsbG93ZWRUb0Nvbm5lY3QocGVlcl8uUGVlckFkZHJlc3MoKSk7Ci0gICAgICAgICAgaWYgKCFjYW5fY29ubmVjdCkgc3JjX2Rpc2Nvbm5lY3Rfc2luayhwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwZWVyXy5Jc1NvdXJjZSgpKSB7Ci0gICAgICAgICAgY2FuX2Nvbm5lY3QgPSBidGlmX2F2X3NpbmsuQWxsb3dlZFRvQ29ubmVjdChwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgICAgICBpZiAoIWNhbl9jb25uZWN0KSBzaW5rX2Rpc2Nvbm5lY3Rfc3JjKHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0ZSA9IEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIGF2X3N0YXRlID0gQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlOwotICAgICAgfQotCi0gICAgICBpZiAoIWNhbl9jb25uZWN0KSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiJXM6IENhbm5vdCBjb25uZWN0IHRvIHBlZXIgJXM6IHRvbyBtYW55IGNvbm5lY3RlZCAiCi0gICAgICAgICAgICAicGVlcnMiLAotICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gUmVwb3J0IHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHN0YXRlKTsKLSAgICAgICAgLy8gQ2hhbmdlIHN0YXRlIHRvIE9wZW4vSWRsZSBiYXNlZCBvbiB0aGUgc3RhdHVzCi0gICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25Ubyhhdl9zdGF0ZSk7Ci0gICAgICAgIGlmIChwZWVyXy5Jc1NpbmsoKSkgewotICAgICAgICAgIC8vIElmIHF1ZXVlZCBQTEFZIGNvbW1hbmQsIHNlbmQgaXQgbm93Ci0gICAgICAgICAgYnRpZl9yY19jaGVja19oYW5kbGVfcGVuZGluZ19wbGF5KAotICAgICAgICAgICAgICBwX2J0YV9kYXRhLT5vcGVuLmJkX2FkZHIsCi0gICAgICAgICAgICAgIChwX2J0YV9kYXRhLT5vcGVuLnN0YXR1cyA9PSBCVEFfQVZfU1VDQ0VTUykpOwotICAgICAgICB9IGVsc2UgaWYgKHBlZXJfLklzU291cmNlKCkgJiYKLSAgICAgICAgICAgICAgICAgICAocF9idGFfZGF0YS0+b3Blbi5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpKSB7Ci0gICAgICAgICAgLy8gQnJpbmcgdXAgQVZSQ1AgY29ubmVjdGlvbiBhcyB3ZWxsCi0gICAgICAgICAgQlRBX0F2T3BlblJjKHBlZXJfLkJ0YUhhbmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1JFTU9URV9DTURfRVZUOgotICAgIGNhc2UgQlRBX0FWX1ZFTkRPUl9DTURfRVZUOgotICAgIGNhc2UgQlRBX0FWX01FVEFfTVNHX0VWVDoKLSAgICBjYXNlIEJUQV9BVl9SQ19GRUFUX0VWVDoKLSAgICBjYXNlIEJUQV9BVl9SQ19QU01fRVZUOgotICAgIGNhc2UgQlRBX0FWX1JFTU9URV9SU1BfRVZUOgotICAgICAgYnRpZl9yY19oYW5kbGVyKGV2ZW50LCAodEJUQV9BViopcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FWX0FWUkNQX0NMT1NFX0VWVDoKLSAgICBjYXNlIEJUQV9BVl9SQ19DTE9TRV9FVlQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgOiBTdG9wcGluZyBBViB0aW1lciIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIGFsYXJtX2NhbmNlbChwZWVyXy5Bdk9wZW5PblJjVGltZXIoKSk7Ci0KLSAgICAgIGlmIChldmVudCA9PSBCVEFfQVZfUkNfQ0xPU0VfRVZUKSB7Ci0gICAgICAgIGJ0aWZfcmNfaGFuZGxlcihldmVudCwgKHRCVEFfQVYqKXBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BVl9PRkZMT0FEX1NUQVJUX1JFUV9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogUGVlciAlcyA6IGV2ZW50PSVzOiBzdHJlYW0gaXMgbm90IE9wZW5lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIGJ0aWZfYTJkcF9vbl9vZmZsb2FkX3N0YXJ0ZWQocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBX0FWX0ZBSUwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyA6IFVuaGFuZGxlZCBldmVudD0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJ0aWZBdlN0YXRlTWFjaGluZTo6U3RhdGVPcGVuaW5nOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8vIEluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdCB3ZSBhcmUgZW50ZXJpbmcgY29ubmVjdGluZyBzdGF0ZQotICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBVl9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcpOwotfQotCi12b2lkIEJ0aWZBdlN0YXRlTWFjaGluZTo6U3RhdGVPcGVuaW5nOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLWJvb2wgQnRpZkF2U3RhdGVNYWNoaW5lOjpTdGF0ZU9wZW5pbmc6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBhY3RpdmVfcGVlcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHBlZXJfLklzQWN0aXZlUGVlcigpKS5jX3N0cigpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0FWX1NUT1BfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FWX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgICBicmVhazsgIC8vIElnbm9yZQotCi0gICAgY2FzZSBCVElGX0FWX0FDTF9ESVNDT05ORUNURUQ6Ci0gICAgICAvLyBBQ0wgRGlzY29ubmVjdGVkIG5lZWRzIHRvIGJlIGhhbmRsZWQgb25seSBpbiBPcGVuaW5nIHN0YXRlLCBiZWNhdXNlCi0gICAgICAvLyBpdCBpcyBpbiBhbiBpbnRlcm1lZGlhdGUgc3RhdGUuIEluIG90aGVyIHN0YXRlcyB3ZSBjYW4gaGFuZGxlCi0gICAgICAvLyBpbmNvbWluZy9vdXRnb2luZyBjb25uZWN0L2Rpc2Nvbm5lY3QgcmVxdWVzdHMuCi0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgIiVzOiBQZWVyICVzIDogZXZlbnQ9JXM6IHRyYW5zaXRpb25pbmcgdG8gSWRsZSBkdWUgdG8gQUNMIERpc2Nvbm5lY3QiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFWX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgaWYgKHBlZXJfLlNlbGZJbml0aWF0ZWRDb25uZWN0aW9uKCkpIHsKLSAgICAgICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BVl9SRUpFQ1RfRVZUOgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBVl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIGlmIChwZWVyXy5TZWxmSW5pdGlhdGVkQ29ubmVjdGlvbigpKSB7Ci0gICAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9PUEVOX0VWVDogewotICAgICAgdEJUQV9BViogcF9idGFfZGF0YSA9ICh0QlRBX0FWKilwX2RhdGE7Ci0gICAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZTsKLSAgICAgIGludCBhdl9zdGF0ZTsKLSAgICAgIHRCVEFfQVZfU1RBVFVTIHN0YXR1cyA9IHBfYnRhX2RhdGEtPm9wZW4uc3RhdHVzOwotCi0gICAgICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBzdGF0dXM9JWQoJXMpIGVkcj0weCV4IiwKLSAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAoc3RhdHVzID09IEJUQV9BVl9TVUNDRVNTKSA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiLAotICAgICAgICAgICAgICAgcF9idGFfZGF0YS0+b3Blbi5lZHIpOwotCi0gICAgICBpZiAocF9idGFfZGF0YS0+b3Blbi5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpIHsKLSAgICAgICAgc3RhdGUgPSBCVEFWX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBhdl9zdGF0ZSA9IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkOwotICAgICAgICBwZWVyXy5TZXRFZHIocF9idGFfZGF0YS0+b3Blbi5lZHIpOwotICAgICAgICBDSEVDSyhwZWVyXy5QZWVyU2VwKCkgPT0gcF9idGFfZGF0YS0+b3Blbi5zZXApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJ0aWZfcmNfaXNfY29ubmVjdGVkX3BlZXIocGVlcl8uUGVlckFkZHJlc3MoKSkpIHsKLSAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBBVlJDUCBjb25uZWN0aW9uLCBpbiBjYXNlIHRoZSBBMkRQIGNvbm5lY3RpdG9uCi0gICAgICAgICAgLy8gZmFpbGVkIGZvciBhbnkgcmVhc29uLgotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IFBlZXIgJXMgOiBEaXNjb25uZWN0aW5nIEFWUkNQIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgIHVpbnQ4X3QgcGVlcl9oYW5kbGUgPQotICAgICAgICAgICAgICBidGlmX3JjX2dldF9jb25uZWN0ZWRfcGVlcl9oYW5kbGUocGVlcl8uUGVlckFkZHJlc3MoKSk7Ci0gICAgICAgICAgaWYgKHBlZXJfaGFuZGxlICE9IEJUUkNfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEJUQV9BdkNsb3NlUmMocGVlcl9oYW5kbGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdGF0ZSA9IEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIGF2X3N0YXRlID0gQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlOwotICAgICAgfQotCi0gICAgICAvLyBSZXBvcnQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgdG8gdGhlIGFwcGxpY2F0aW9uCi0gICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHN0YXRlKTsKLSAgICAgIC8vIENoYW5nZSBzdGF0ZSB0byBPcGVuL0lkbGUgYmFzZWQgb24gdGhlIHN0YXR1cwotICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKGF2X3N0YXRlKTsKLSAgICAgIGlmIChwZWVyXy5Jc1NpbmsoKSkgewotICAgICAgICAvLyBJZiBxdWV1ZWQgUExBWSBjb21tYW5kLCBzZW5kIGl0IG5vdwotICAgICAgICBidGlmX3JjX2NoZWNrX2hhbmRsZV9wZW5kaW5nX3BsYXkoCi0gICAgICAgICAgICBwX2J0YV9kYXRhLT5vcGVuLmJkX2FkZHIsCi0gICAgICAgICAgICAocF9idGFfZGF0YS0+b3Blbi5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpKTsKLSAgICAgIH0gZWxzZSBpZiAocGVlcl8uSXNTb3VyY2UoKSAmJgotICAgICAgICAgICAgICAgICAocF9idGFfZGF0YS0+b3Blbi5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpKSB7Ci0gICAgICAgIC8vIEJyaW5nIHVwIEFWUkNQIGNvbm5lY3Rpb24gYXMgd2VsbAotICAgICAgICBCVEFfQXZPcGVuUmMocGVlcl8uQnRhSGFuZGxlKCkpOwotICAgICAgfQotICAgICAgaWYgKHBlZXJfLlNlbGZJbml0aWF0ZWRDb25uZWN0aW9uKCkpIHsKLSAgICAgICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BVl9TSU5LX0NPTkZJR19SRVFfRVZUOiB7Ci0gICAgICBjb25zdCBidGlmX2F2X3NpbmtfY29uZmlnX3JlcV90KiBwX2NvbmZpZ19yZXEgPQotICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGJ0aWZfYXZfc2lua19jb25maWdfcmVxX3QqPihwX2RhdGEpOwotICAgICAgaWYgKHBlZXJfLklzU291cmNlKCkpIHsKLSAgICAgICAgYnRpZl9hdl9yZXBvcnRfc2lua19hdWRpb19jb25maWdfc3RhdGUocF9jb25maWdfcmVxLT5wZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY29uZmlnX3JlcS0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY29uZmlnX3JlcS0+Y2hhbm5lbF9jb3VudCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BVl9DT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIC8vIFRoZSBkZXZpY2UgaGFzIG1vdmVkIGFscmVhZHkgdG8gT3BlbmluZywgaGVuY2UgZG9uJ3QgcmVwb3J0IHRoZQotICAgICAgLy8gY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiJXM6IFBlZXIgJXMgOiBldmVudD0lcyA6IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RpbmcsICIKLSAgICAgICAgICAiaWdub3JlIENvbm5lY3QgcmVxdWVzdCIsCi0gICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSk7Ci0gICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfUEVORElOR19FVlQ6IHsKLSAgICAgIC8vIFRoZSBkZXZpY2UgaGFzIG1vdmVkIGFscmVhZHkgdG8gT3BlbmluZywgaGVuY2UgZG9uJ3QgcmVwb3J0IHRoZQotICAgICAgLy8gY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiJXM6IFBlZXIgJXMgOiBldmVudD0lcyA6IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RpbmcsICIKLSAgICAgICAgICAiaWdub3JlIGluY29taW5nIHJlcXVlc3QiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfQVZfT0ZGTE9BRF9TVEFSVF9SRVFfRVZUOgotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFBlZXIgJXMgOiBldmVudD0lczogc3RyZWFtIGlzIG5vdCBPcGVuZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSk7Ci0gICAgICBidGlmX2EyZHBfb25fb2ZmbG9hZF9zdGFydGVkKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQV9BVl9GQUlMKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfQ0xPU0VfRVZUOgotICAgICAgYnRpZl9hMmRwX29uX3N0b3BwZWQobnVsbHB0cik7Ci0gICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICBpZiAocGVlcl8uU2VsZkluaXRpYXRlZENvbm5lY3Rpb24oKSkgewotICAgICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FWX0RJU0NPTk5FQ1RfUkVRX0VWVDoKLSAgICAgIEJUQV9BdkNsb3NlKHBlZXJfLkJ0YUhhbmRsZSgpKTsKLSAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBVl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIGlmIChwZWVyXy5TZWxmSW5pdGlhdGVkQ29ubmVjdGlvbigpKSB7Ci0gICAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIENIRUNLX1JDX0VWRU5UKGV2ZW50LCAodEJUQV9BViopcF9kYXRhKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBQZWVyICVzIDogVW5oYW5kbGVkIGV2ZW50PSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJ0aWZBdlN0YXRlTWFjaGluZTo6U3RhdGVPcGVuZWQ6Ok9uRW50ZXIoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQXZQZWVyOjprRmxhZ0xvY2FsU3VzcGVuZFBlbmRpbmcgfAotICAgICAgICAgICAgICAgICAgIEJ0aWZBdlBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0IHwKLSAgICAgICAgICAgICAgICAgICBCdGlmQXZQZWVyOjprRmxhZ1BlbmRpbmdTdG9wKTsKLQotICAvLyBTZXQgdGhlIGFjdGl2ZSBwZWVyIGlmIHRoZSBmaXJzdCBjb25uZWN0ZWQgZGV2aWNlLgotICAvLyBOT1RFOiBUaGlzIHNob3VsZCBiZSBkb25lIG9ubHkgaWYgd2UgYXJlIEEyRFAgU2luaywgYmVjYXVzZSB0aGUgQTJEUCBTaW5rCi0gIC8vIGltcGxlbWVudGF0aW9uIGluIEphdmEgZG9lc24ndCBzdXBwb3J0IGFjdGl2ZSBkZXZpY2VzICh5ZXQpLgotICAvLyBGb3IgQTJEUCBTb3VyY2UsIHRoZSBzZXR0aW5nIG9mIHRoZSBBY3RpdmUgZGV2aWNlIGlzIGRvbmUgYnkgdGhlCi0gIC8vIEFjdGl2ZURldmljZU1hbmFnZXIgaW4gSmF2YS4KLSAgaWYgKHBlZXJfLklzU291cmNlKCkgJiYgYnRpZl9hdl9zaW5rLkFjdGl2ZVBlZXIoKS5Jc0VtcHR5KCkpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlOwotICAgIGlmICghYnRpZl9hdl9zaW5rLlNldEFjdGl2ZVBlZXIocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSkgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgJXMgYXMgYWN0aXZlIFNvdXJjZSBwZWVyIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBCdGlmQXZTdGF0ZU1hY2hpbmU6OlN0YXRlT3BlbmVkOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQXZQZWVyOjprRmxhZ1BlbmRpbmdTdGFydCk7Ci19Ci0KLWJvb2wgQnRpZkF2U3RhdGVNYWNoaW5lOjpTdGF0ZU9wZW5lZDo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKSB7Ci0gIHRCVEFfQVYqIHBfYXYgPSAodEJUQV9BViopcF9kYXRhOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMgYWN0aXZlX3BlZXI9JXMiLAotICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgbG9nYm9vbChwZWVyXy5Jc0FjdGl2ZVBlZXIoKSkuY19zdHIoKSk7Ci0KLSAgaWYgKChldmVudCA9PSBCVEFfQVZfUkVNT1RFX0NNRF9FVlQpICYmCi0gICAgICBwZWVyXy5DaGVja0ZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnUmVtb3RlU3VzcGVuZCkgJiYKLSAgICAgIChwX2F2LT5yZW1vdGVfY21kLnJjX2lkID09IEFWUkNfSURfUExBWSkpIHsKLSAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogUGVlciAlcyA6IFJlc2V0dGluZyByZW1vdGUgc3VzcGVuZCBmbGFnIG9uIFJDIFBMQVkiLAotICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBwZWVyXy5DbGVhckZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnUmVtb3RlU3VzcGVuZCk7Ci0gIH0KLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0FWX1NUT1BfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FWX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FWX0FDTF9ESVNDT05ORUNURUQ6Ci0gICAgICBicmVhazsgIC8vIElnbm9yZQotCi0gICAgY2FzZSBCVElGX0FWX1NUQVJUX1NUUkVBTV9SRVFfRVZUOgotICAgICAgTE9HX0lORk8oIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgQlRBX0F2U3RhcnQocGVlcl8uQnRhSGFuZGxlKCkpOwotICAgICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9TVEFSVF9FVlQ6IHsKLSAgICAgIExPR19JTkZPKAotICAgICAgICAgICIlczogUGVlciAlcyA6IGV2ZW50PSVzIHN0YXR1cz0lZCBzdXNwZW5kaW5nPSVkICIKLSAgICAgICAgICAiaW5pdGlhdG9yPSVkIGZsYWdzPSVzIiwKLSAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLCBwX2F2LT5zdGFydC5zdGF0dXMsCi0gICAgICAgICAgcF9hdi0+c3RhcnQuc3VzcGVuZGluZywgcF9hdi0+c3RhcnQuaW5pdGlhdG9yLAotICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgICAgaWYgKChwX2F2LT5zdGFydC5zdGF0dXMgPT0gQlRBX1NVQ0NFU1MpICYmIHBfYXYtPnN0YXJ0LnN1c3BlbmRpbmcpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAvLyBJZiByZW1vdGUgdHJpZXMgdG8gc3RhcnQgQTJEUCB3aGVuIERVVCBpcyBBMkRQIFNvdXJjZSwgdGhlbiBTdXNwZW5kLgotICAgICAgLy8gSWYgQTJEUCBpcyBTaW5rIGFuZCBjYWxsIGlzIGFjdGl2ZSwgdGhlbiBkaXNjb25uZWN0IHRoZSBBVkRUUCBjaGFubmVsLgotICAgICAgYm9vbCBzaG91bGRfc3VzcGVuZCA9IGZhbHNlOwotICAgICAgaWYgKHBlZXJfLklzU2luaygpKSB7Ci0gICAgICAgIGlmICghcGVlcl8uQ2hlY2tGbGFncyhCdGlmQXZQZWVyOjprRmxhZ1BlbmRpbmdTdGFydCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZQZWVyOjprRmxhZ1JlbW90ZVN1c3BlbmQpKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogUGVlciAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHBlZXJfLlBlZXJBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6IHRyaWdnZXIgU3VzcGVuZCBhcyByZW1vdGUgaW5pdGlhdGVkIjsKLSAgICAgICAgICBzaG91bGRfc3VzcGVuZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBlZXJfLklzQWN0aXZlUGVlcigpKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogUGVlciAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHBlZXJfLlBlZXJBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6IHRyaWdnZXIgU3VzcGVuZCBhcyBub24tYWN0aXZlIjsKLSAgICAgICAgICBzaG91bGRfc3VzcGVuZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBwZWVyIGlzIEEyRFAgU291cmNlLCBkbyBBQ0sgY29tbWFuZHMgdG8gYXVkaW8gSEFMIGFuZCBzdGFydCBtZWRpYQotICAgICAgICAvLyB0YXNrCi0gICAgICAgIGlmIChidGlmX2EyZHBfb25fc3RhcnRlZChwZWVyXy5QZWVyQWRkcmVzcygpLCAmcF9hdi0+c3RhcnQpKSB7Ci0gICAgICAgICAgLy8gT25seSBjbGVhciBwZW5kaW5nIGZsYWcgYWZ0ZXIgYWNrbm93bGVkZ2VtZW50Ci0gICAgICAgICAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQXZQZWVyOjprRmxhZ1BlbmRpbmdTdGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gUmVtYWluIGluIE9wZW4gc3RhdGUgaWYgc3RhdHVzIGZhaWxlZAotICAgICAgaWYgKHBfYXYtPnN0YXJ0LnN0YXR1cyAhPSBCVEFfQVZfU1VDQ0VTUykgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocGVlcl8uSXNTb3VyY2UoKSAmJiBwZWVyXy5Jc0FjdGl2ZVBlZXIoKSkgewotICAgICAgICAvLyBSZW1vdmUgZmx1c2ggc3RhdGUsIHJlYWR5IGZvciBzdHJlYW1pbmcKLSAgICAgICAgYnRpZl9hMmRwX3Npbmtfc2V0X3J4X2ZsdXNoKGZhbHNlKTsKLSAgICAgICAgYnRpZl9hMmRwX3Npbmtfb25fc3RhcnQoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHNob3VsZF9zdXNwZW5kKSB7Ci0gICAgICAgIGJ0aWZfYXZfc291cmNlX2Rpc3BhdGNoX3NtX2V2ZW50KHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfQVZfU1VTUEVORF9TVFJFQU1fUkVRX0VWVCk7Ci0gICAgICB9Ci0gICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVTdGFydGVkKTsKLQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfQVZfRElTQ09OTkVDVF9SRVFfRVZUOgotICAgICAgQlRBX0F2Q2xvc2UocGVlcl8uQnRhSGFuZGxlKCkpOwotICAgICAgaWYgKHBlZXJfLklzU291cmNlKCkpIHsKLSAgICAgICAgQlRBX0F2Q2xvc2VSYyhwZWVyXy5CdGFIYW5kbGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGluZwotICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFWX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORyk7Ci0KLSAgICAgIC8vIFdhaXQgaW4gY2xvc2luZyBzdGF0ZSB1bnRpbCBmdWxseSBjbG9zZWQKLSAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZUNsb3NpbmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9DTE9TRV9FVlQ6Ci0gICAgICAvLyBBVkRUUCBsaW5rIGlzIGNsb3NlZAotICAgICAgLy8gQ2hhbmdlIHN0YXRlIHRvIElkbGUsIHNlbmQgYWNrbm93bGVkZ2VtZW50IGlmIHN0YXJ0IGlzIHBlbmRpbmcKLSAgICAgIGlmIChwZWVyXy5DaGVja0ZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0KSkgewotICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBQZWVyICVzIDogZmFpbGVkIHBlbmRpbmcgc3RhcnQgcmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICB0QlRBX0FWX1NUQVJUIGF2X3N0YXJ0ID0gey5jaG5sID0gcF9hdi0+Y2xvc2UuY2hubCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaG5kbCA9IHBfYXYtPmNsb3NlLmhuZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyA9IEJUQV9BVl9GQUlMX1NUUkVBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdGlhdG9yID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VzcGVuZGluZyA9IHRydWV9OwotICAgICAgICBidGlmX2EyZHBfb25fc3RhcnRlZChwZWVyXy5QZWVyQWRkcmVzcygpLCAmYXZfc3RhcnQpOwotICAgICAgICAvLyBQZW5kaW5nIHN0YXJ0IGZsYWcgd2lsbCBiZSBjbGVhcmVkIHdoZW4gZXhpdCBjdXJyZW50IHN0YXRlCi0gICAgICB9IGVsc2UgaWYgKHBlZXJfLklzQWN0aXZlUGVlcigpKSB7Ci0gICAgICAgIGJ0aWZfYTJkcF9vbl9zdG9wcGVkKG51bGxwdHIpOwotICAgICAgfQotCi0gICAgICAvLyBJbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHRoYXQgd2UgYXJlIGRpc2Nvbm5lY3RlZAotICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFWX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9SRUNPTkZJR19FVlQ6Ci0gICAgICBpZiAocF9hdi0+cmVjb25maWcuc3RhdHVzICE9IEJUQV9BVl9TVUNDRVNTKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IFBlZXIgIiA8PCBwZWVyXy5QZWVyQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIDogZmFpbGVkIHJlY29uZmlndXJhdGlvbiI7Ci0gICAgICAgIGlmIChwZWVyXy5DaGVja0ZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0KSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBQZWVyICIgPDwgcGVlcl8uUGVlckFkZHJlc3MoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIiA6IGNhbm5vdCBwcm9jZWVkIHRvIGRvIEF2U3RhcnQiOwotICAgICAgICAgIHBlZXJfLkNsZWFyRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpOwotICAgICAgICAgIGJ0aWZfYTJkcF9jb21tYW5kX2FjayhBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwZWVyXy5Jc1NpbmsoKSkgewotICAgICAgICAgIHNyY19kaXNjb25uZWN0X3NpbmsocGVlcl8uUGVlckFkZHJlc3MoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGVlcl8uSXNTb3VyY2UoKSkgewotICAgICAgICAgIHNpbmtfZGlzY29ubmVjdF9zcmMocGVlcl8uUGVlckFkZHJlc3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwZWVyXy5Jc0FjdGl2ZVBlZXIoKSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiIDogUGVlciAiIDw8IHBlZXJfLlBlZXJBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgOiBSZWNvbmZpZyBkb25lIC0gY2FsbGluZyBzdGFydFNlc3Npb24oKSB0byBhdWRpbyBIQUwiOwotICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlOwotICAgICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBwZWVyX3JlYWR5X2Z1dHVyZSA9IHBlZXJfcmVhZHlfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgICAgIGJ0aWZfYTJkcF9zb3VyY2Vfc3RhcnRfc2Vzc2lvbihwZWVyXy5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBlZXJfcmVhZHlfcHJvbWlzZSkpOwotICAgICAgfQotICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICIgOiBQZWVyICIgPDwgcGVlcl8uUGVlckFkZHJlc3MoKQotICAgICAgICAgICAgICAgICAgPDwgIiA6IFJlY29uZmlnIGRvbmUgLSBjYWxsaW5nIEJUQV9BdlN0YXJ0KCIKLSAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChwZWVyXy5CdGFIYW5kbGUoKSkgPDwgIikiOwotICAgICAgICBCVEFfQXZTdGFydChwZWVyXy5CdGFIYW5kbGUoKSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BVl9DT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IFBlZXIgJXMgOiBJZ25vcmUgJXMgZm9yIHNhbWUgZGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BVl9PRkZMT0FEX1NUQVJUX1JFUV9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogUGVlciAlcyA6IGV2ZW50PSVzOiBzdHJlYW0gaXMgbm90IE9wZW5lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIGJ0aWZfYTJkcF9vbl9vZmZsb2FkX3N0YXJ0ZWQocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBX0FWX0ZBSUwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfQVZfQVZSQ1BfUkVNT1RFX1BMQVlfRVZUOgotICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdSZW1vdGVTdXNwZW5kKSkgewotICAgICAgICBCVElGX1RSQUNFX0VWRU5UKAotICAgICAgICAgICAgIiVzOiBQZWVyICVzIDogUmVzZXR0aW5nIHJlbW90ZSBzdXNwZW5kIGZsYWcgb24gUkMgUExBWSIsCi0gICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHBlZXJfLkNsZWFyRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdSZW1vdGVTdXNwZW5kKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBDSEVDS19SQ19FVkVOVChldmVudCwgKHRCVEFfQVYqKXBfZGF0YSk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyA6IFVuaGFuZGxlZCBldmVudD0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBCdGlmQXZTdGF0ZU1hY2hpbmU6OlN0YXRlU3RhcnRlZDo6T25FbnRlcigpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvLyBXZSBhcmUgYWdhaW4gaW4gc3RhcnRlZCBzdGF0ZSwgY2xlYXIgYW55IHJlbW90ZSBzdXNwZW5kIGZsYWdzCi0gIHBlZXJfLkNsZWFyRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdSZW1vdGVTdXNwZW5kKTsKLQotICBidGlmX2EyZHBfc2lua19zZXRfcnhfZmx1c2goZmFsc2UpOwotCi0gIC8vIFJlcG9ydCB0aGF0IHdlIGhhdmUgZW50ZXJlZCB0aGUgU3RyZWFtaW5nIHN0YWdlLiBVc3VhbGx5LCB0aGlzIHNob3VsZAotICAvLyBiZSBmb2xsb3dlZCBieSBmb2N1cyBncmFudC4gU2VlIHVwZGF0ZV9hdWRpb19mb2N1c19zdGF0ZSgpCi0gIGJ0aWZfcmVwb3J0X2F1ZGlvX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQVZfQVVESU9fU1RBVEVfU1RBUlRFRCk7Ci19Ci0KLXZvaWQgQnRpZkF2U3RhdGVNYWNoaW5lOjpTdGF0ZVN0YXJ0ZWQ6Ok9uRXhpdCgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotYm9vbCBCdGlmQXZTdGF0ZU1hY2hpbmU6OlN0YXRlU3RhcnRlZDo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICB0QlRBX0FWKiBwX2F2ID0gKHRCVEFfQVYqKXBfZGF0YTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIGFjdGl2ZV9wZWVyPSVzIiwKLSAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxvZ2Jvb2wocGVlcl8uSXNBY3RpdmVQZWVyKCkpLmNfc3RyKCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUSUZfQVZfQUNMX0RJU0NPTk5FQ1RFRDoKLSAgICAgIGJyZWFrOyAgLy8gSWdub3JlCi0KLSAgICBjYXNlIEJUSUZfQVZfU1RBUlRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAvLyBXZSB3ZXJlIHN0YXJ0ZWQgcmVtb3RlbHksIGp1c3QgQUNLIGJhY2sgdGhlIGxvY2FsIHJlcXVlc3QKLSAgICAgIGlmIChwZWVyXy5Jc1NpbmsoKSkgYnRpZl9hMmRwX29uX3N0YXJ0ZWQocGVlcl8uUGVlckFkZHJlc3MoKSwgbnVsbHB0cik7Ci0gICAgICBicmVhazsKLQotICAgIC8vIEZJWE1FIC0tIHVzZSBzdXNwZW5kID0gdHJ1ZSBhbHdheXMgdG8gd29yayBhcm91bmQgaXNzdWUgd2l0aCBCVEEgQVYKLSAgICBjYXNlIEJUSUZfQVZfU1RPUF9TVFJFQU1fUkVRX0VWVDoKLSAgICBjYXNlIEJUSUZfQVZfU1VTUEVORF9TVFJFQU1fUkVRX0VWVDoKLSAgICAgIExPR19JTkZPKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIC8vIFNldCBwZW5kaW5nIGZsYWcgdG8gZW5zdXJlIHRoZSBCVElGIHRhc2sgaXMgbm90IHRyeWluZyB0byByZXN0YXJ0Ci0gICAgICAvLyB0aGUgc3RyZWFtIHdoaWxlIHN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MuCi0gICAgICBwZWVyXy5TZXRGbGFncyhCdGlmQXZQZWVyOjprRmxhZ0xvY2FsU3VzcGVuZFBlbmRpbmcpOwotCi0gICAgICAvLyBJZiB3ZSB3ZXJlIHJlbW90ZWx5IHN1c3BlbmRlZCBidXQgc3VzcGVuZCBsb2NhbGx5LCBsb2NhbCBzdXNwZW5kCi0gICAgICAvLyBhbHdheXMgb3ZlcnJpZGVzLgotICAgICAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQXZQZWVyOjprRmxhZ1JlbW90ZVN1c3BlbmQpOwotCi0gICAgICBpZiAocGVlcl8uSXNTaW5rKCkgJiYKLSAgICAgICAgICAocGVlcl8uSXNBY3RpdmVQZWVyKCkgfHwgIWJ0aWZfYXZfc3RyZWFtX3N0YXJ0ZWRfcmVhZHkoKSkpIHsKLSAgICAgICAgLy8gSW1tZWRpYXRlbHkgc3RvcCB0cmFuc21pc3Npb24gb2YgZnJhbWVzIHdoaWxlIHN1c3BlbmQgaXMgcGVuZGluZwotICAgICAgICBpZiAoZXZlbnQgPT0gQlRJRl9BVl9TVE9QX1NUUkVBTV9SRVFfRVZUKSB7Ci0gICAgICAgICAgYnRpZl9hMmRwX29uX3N0b3BwZWQobnVsbHB0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gZW5zdXJlIHR4IGZyYW1lcyBhcmUgaW1tZWRpYXRlbHkgc3VzcGVuZGVkCi0gICAgICAgICAgYnRpZl9hMmRwX3NvdXJjZV9zZXRfdHhfZmx1c2godHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocGVlcl8uSXNTb3VyY2UoKSkgewotICAgICAgICBidGlmX2EyZHBfb25fc3RvcHBlZChudWxscHRyKTsKLSAgICAgIH0KLSAgICAgIEJUQV9BdlN0b3AocGVlcl8uQnRhSGFuZGxlKCksIHRydWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfQVZfRElTQ09OTkVDVF9SRVFfRVZUOgotICAgICAgTE9HX0lORk8oIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAvLyBSZXF1ZXN0IEFWRFRQIHRvIGNsb3NlCi0gICAgICBCVEFfQXZDbG9zZShwZWVyXy5CdGFIYW5kbGUoKSk7Ci0gICAgICBpZiAocGVlcl8uSXNTb3VyY2UoKSkgewotICAgICAgICBCVEFfQXZDbG9zZVJjKHBlZXJfLkJ0YUhhbmRsZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHdlIGFyZSBkaXNjb25uZWN0aW5nCi0gICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HKTsKLQotICAgICAgLy8gV2FpdCBpbiBjbG9zaW5nIHN0YXRlIHVudGlsIGZ1bGx5IGNsb3NlZAotICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1NVU1BFTkRfRVZUOiB7Ci0gICAgICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBzdGF0dXM9JWQgaW5pdGlhdG9yPSVkIGZsYWdzPSVzIiwKLSAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwgcF9hdi0+c3VzcGVuZC5zdGF0dXMsCi0gICAgICAgICAgICAgICBwX2F2LT5zdXNwZW5kLmluaXRpYXRvciwgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAvLyBBMkRQIHN1c3BlbmRlZCwgc3RvcCBBMkRQIGVuY29kZXIgLyBkZWNvZGVyIHVudGlsIHJlc3VtZWQKLSAgICAgIGlmIChwZWVyXy5Jc0FjdGl2ZVBlZXIoKSB8fCAhYnRpZl9hdl9zdHJlYW1fc3RhcnRlZF9yZWFkeSgpKSB7Ci0gICAgICAgIGJ0aWZfYTJkcF9vbl9zdXNwZW5kZWQoJnBfYXYtPnN1c3BlbmQpOwotICAgICAgfQotCi0gICAgICAvLyBJZiBub3Qgc3VjY2Vzc2Z1bCwgcmVtYWluIGluIGN1cnJlbnQgc3RhdGUKLSAgICAgIGlmIChwX2F2LT5zdXNwZW5kLnN0YXR1cyAhPSBCVEFfQVZfU1VDQ0VTUykgewotICAgICAgICBwZWVyXy5DbGVhckZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnTG9jYWxTdXNwZW5kUGVuZGluZyk7Ci0KLSAgICAgICAgaWYgKHBlZXJfLklzU2luaygpICYmIHBlZXJfLklzQWN0aXZlUGVlcigpKSB7Ci0gICAgICAgICAgLy8gU3VzcGVuZCBmYWlsZWQsIHJlc2V0IGJhY2sgdHggZmx1c2ggc3RhdGUKLSAgICAgICAgICBidGlmX2EyZHBfc291cmNlX3NldF90eF9mbHVzaChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBidGF2X2F1ZGlvX3N0YXRlX3Qgc3RhdGUgPSBCVEFWX0FVRElPX1NUQVRFX1JFTU9URV9TVVNQRU5EOwotICAgICAgaWYgKHBfYXYtPnN1c3BlbmQuaW5pdGlhdG9yICE9IHRydWUpIHsKLSAgICAgICAgLy8gUmVtb3RlIHN1c3BlbmQsIG5vdGlmeSBIQUwgYW5kIGF3YWl0IGF1ZGlvZmxpbmdlciB0bwotICAgICAgICAvLyBzdXNwZW5kL3N0b3Agc3RyZWFtLgotICAgICAgICAvLwotICAgICAgICAvLyBTZXQgcmVtb3RlIHN1c3BlbmQgZmxhZyB0byBibG9jayBtZWRpYSB0YXNrIGZyb20gcmVzdGFydGluZwotICAgICAgICAvLyBzdHJlYW0gb25seSBpZiB3ZSBkaWQgbm90IGFscmVhZHkgaW5pdGlhdGUgYSBsb2NhbCBzdXNwZW5kLgotICAgICAgICBpZiAoIXBlZXJfLkNoZWNrRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdMb2NhbFN1c3BlbmRQZW5kaW5nKSkKLSAgICAgICAgICBwZWVyXy5TZXRGbGFncyhCdGlmQXZQZWVyOjprRmxhZ1JlbW90ZVN1c3BlbmQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGUgPSBCVEFWX0FVRElPX1NUQVRFX1NUT1BQRUQ7Ci0gICAgICB9Ci0KLSAgICAgIGJ0aWZfcmVwb3J0X2F1ZGlvX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHN0YXRlKTsKLSAgICAgIC8vIFN1c3BlbmQgY29tcGxldGVkLCBjbGVhciBsb2NhbCBwZW5kaW5nIGZsYWdzIHdoaWxlIGVudGVyaW5nIE9wZW5lZAotICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfU1RPUF9FVlQ6Ci0gICAgICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIEJ0aWZBdkV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAgIHBlZXJfLlNldEZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnUGVuZGluZ1N0b3ApOwotICAgICAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQXZQZWVyOjprRmxhZ0xvY2FsU3VzcGVuZFBlbmRpbmcpOwotCi0gICAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIGVuY29kZXIgYW5kIGF1ZGlvIHByb3ZpZGVyIHN0YXRlIGJ5IGEgbm9uLWFjdGl2ZSBwZWVyCi0gICAgICAvLyBzaW5jZSB0aGV5IGFyZSBzaGFyZWQgYmV0d2VlbiBwZWVycwotICAgICAgaWYgKHBlZXJfLklzQWN0aXZlUGVlcigpIHx8ICFidGlmX2F2X3N0cmVhbV9zdGFydGVkX3JlYWR5KCkpIHsKLSAgICAgICAgYnRpZl9hMmRwX29uX3N0b3BwZWQoJnBfYXYtPnN1c3BlbmQpOwotICAgICAgfQotCi0gICAgICBidGlmX3JlcG9ydF9hdWRpb19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFWX0FVRElPX1NUQVRFX1NUT1BQRUQpOwotCi0gICAgICAvLyBJZiBzdG9wIHdhcyBzdWNjZXNzZnVsLCBjaGFuZ2Ugc3RhdGUgdG8gT3BlbgotICAgICAgaWYgKHBfYXYtPnN1c3BlbmQuc3RhdHVzID09IEJUQV9BVl9TVUNDRVNTKQotICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX0NMT1NFX0VWVDoKLSAgICAgIExPR19JTkZPKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdQZW5kaW5nU3RvcCk7Ci0KLSAgICAgIC8vIEFWRFRQIGxpbmsgaXMgY2xvc2VkCi0gICAgICBpZiAocGVlcl8uSXNBY3RpdmVQZWVyKCkpIHsKLSAgICAgICAgYnRpZl9hMmRwX29uX3N0b3BwZWQobnVsbHB0cik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGVkCi0gICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotCi0gICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FWX09GRkxPQURfU1RBUlRfUkVRX0VWVDoKLSAgICAgIEJUQV9Bdk9mZmxvYWRTdGFydChwZWVyXy5CdGFIYW5kbGUoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX09GRkxPQURfU1RBUlRfUlNQX0VWVDoKLSAgICAgIGJ0aWZfYTJkcF9vbl9vZmZsb2FkX3N0YXJ0ZWQocGVlcl8uUGVlckFkZHJlc3MoKSwgcF9hdi0+c3RhdHVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBDSEVDS19SQ19FVkVOVChldmVudCwgKHRCVEFfQVYqKXBfZGF0YSk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyA6IFVuaGFuZGxlZCBldmVudD0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJ0aWZBdlN0YXRlTWFjaGluZTo6U3RhdGVDbG9zaW5nOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmIChwZWVyXy5Jc0FjdGl2ZVBlZXIoKSkgewotICAgIGlmIChwZWVyXy5Jc1NpbmsoKSkgewotICAgICAgLy8gSW1tZWRpYXRlbHkgc3RvcCB0cmFuc21pc3Npb24gb2YgZnJhbWVzCi0gICAgICBidGlmX2EyZHBfc291cmNlX3NldF90eF9mbHVzaCh0cnVlKTsKLSAgICAgIC8vIFdhaXQgZm9yIEF1ZGlvIEZsaW5nZXIgdG8gc3RvcCBBMkRQCi0gICAgfSBlbHNlIGlmIChwZWVyXy5Jc1NvdXJjZSgpKSB7Ci0gICAgICBidGlmX2EyZHBfc2lua19zZXRfcnhfZmx1c2godHJ1ZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQnRpZkF2U3RhdGVNYWNoaW5lOjpTdGF0ZUNsb3Npbmc6Ok9uRXhpdCgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotYm9vbCBCdGlmQXZTdGF0ZU1hY2hpbmU6OlN0YXRlQ2xvc2luZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIGFjdGl2ZV9wZWVyPSVzIiwKLSAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBCdGlmQXZFdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxvZ2Jvb2wocGVlcl8uSXNBY3RpdmVQZWVyKCkpLmNfc3RyKCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUSUZfQVZfU1VTUEVORF9TVFJFQU1fUkVRX0VWVDoKLSAgICBjYXNlIEJUSUZfQVZfQUNMX0RJU0NPTk5FQ1RFRDoKLSAgICAgIGJyZWFrOyAgLy8gSWdub3JlCi0KLSAgICBjYXNlIEJUQV9BVl9TVE9QX0VWVDoKLSAgICBjYXNlIEJUSUZfQVZfU1RPUF9TVFJFQU1fUkVRX0VWVDoKLSAgICAgIGlmIChwZWVyXy5Jc0FjdGl2ZVBlZXIoKSkgewotICAgICAgICBidGlmX2EyZHBfb25fc3RvcHBlZChudWxscHRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfQ0xPU0VfRVZUOgotICAgICAgLy8gSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHdlIGFyZSBkaXNjb25uZWN0aW5nCi0gICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotCi0gICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLy8gSGFuZGxlIHRoZSBSQ19DTE9TRSBldmVudCBmb3IgdGhlIGNsZWFudXAKLSAgICBjYXNlIEJUQV9BVl9SQ19DTE9TRV9FVlQ6Ci0gICAgICBidGlmX3JjX2hhbmRsZXIoZXZlbnQsICh0QlRBX0FWKilwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBIYW5kbGUgdGhlIFJDX0JST1dTRV9DTE9TRSBldmVudCBmb3IgdGVzdGluZwotICAgIGNhc2UgQlRBX0FWX1JDX0JST1dTRV9DTE9TRV9FVlQ6Ci0gICAgICBidGlmX3JjX2hhbmRsZXIoZXZlbnQsICh0QlRBX0FWKilwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfQVZfT0ZGTE9BRF9TVEFSVF9SRVFfRVZUOgotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFBlZXIgJXMgOiBldmVudD0lczogc3RyZWFtIGlzIG5vdCBPcGVuZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSk7Ci0gICAgICBidGlmX2EyZHBfb25fb2ZmbG9hZF9zdGFydGVkKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQV9BVl9GQUlMKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IFBlZXIgJXMgOiBVbmhhbmRsZWQgZXZlbnQ9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2RXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogVGltZXIgdG8gdHJpZ2dlciBBViBPcGVuIG9uIHRoZSBTb3VyY2UgaWYgdGhlIHJlbW90ZSBTaW5rIGRldmljZSBlc3RhYmxpc2hlcwotICogQVZSQ1AgY29ubmVjdGlvbiB3aXRob3V0IEFWIGNvbm5lY3Rpb24uIFRoZSB0aW1lciBpcyBuZWVkZWQgdG8gaW50ZXJvcGVyYXRlCi0gKiB3aXRoIGhlYWRzZXRzIHRoYXQgZG8gZXN0YWJsaXNoIEFWIGFmdGVyIEFWUkNQIGNvbm5lY3Rpb24uCi0gKi8KLXN0YXRpYyB2b2lkIGJ0aWZfYXZfc291cmNlX2luaXRpYXRlX2F2X29wZW5fdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIEJ0aWZBdlBlZXIqIHBlZXIgPSAoQnRpZkF2UGVlciopZGF0YTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvLyBDaGVjayBpZiBBVlJDUCBpcyBjb25uZWN0ZWQgdG8gdGhlIHBlZXIKLSAgaWYgKCFidGlmX3JjX2lzX2Nvbm5lY3RlZF9wZWVyKHBlZXItPlBlZXJBZGRyZXNzKCkpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEFWUkNQIHBlZXIgJXMgaXMgbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIENvbm5lY3QgdG8gdGhlIEFWUkNQIHBlZXIKLSAgaWYgKGJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKSAmJgotICAgICAgYnRpZl9hdl9zb3VyY2UuRmluZFBlZXIocGVlci0+UGVlckFkZHJlc3MoKSkgPT0gcGVlcikgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBDb25uZWN0aW5nIHRvIEFWUkNQIHBlZXIgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBidGlmX2F2X3NvdXJjZV9kaXNwYXRjaF9zbV9ldmVudChwZWVyLT5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfQVZfQ09OTkVDVF9SRVFfRVZUKTsKLSAgfQotfQotCi0vKioKLSAqIFRpbWVyIHRvIHRyaWdnZXIgQVYgT3BlbiBvbiB0aGUgU2luayBpZiB0aGUgcmVtb3RlIFNvdXJjZSBkZXZpY2UgZXN0YWJsaXNoZXMKLSAqIEFWUkNQIGNvbm5lY3Rpb24gd2l0aG91dCBBViBjb25uZWN0aW9uLgotICovCi1zdGF0aWMgdm9pZCBidGlmX2F2X3NpbmtfaW5pdGlhdGVfYXZfb3Blbl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgQnRpZkF2UGVlciogcGVlciA9IChCdGlmQXZQZWVyKilkYXRhOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8vIENoZWNrIGlmIEFWUkNQIGlzIGNvbm5lY3RlZCB0byB0aGUgcGVlcgotICBpZiAoIWJ0aWZfcmNfaXNfY29ubmVjdGVkX3BlZXIocGVlci0+UGVlckFkZHJlc3MoKSkpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogQVZSQ1AgcGVlciAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwZWVyLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ29ubmVjdCB0byB0aGUgQVZSQ1AgcGVlcgotICBpZiAoYnRpZl9hdl9zaW5rLkVuYWJsZWQoKSAmJgotICAgICAgYnRpZl9hdl9zaW5rLkZpbmRQZWVyKHBlZXItPlBlZXJBZGRyZXNzKCkpID09IHBlZXIpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQ29ubmVjdGluZyB0byBBVlJDUCBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwZWVyLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYnRpZl9hdl9zaW5rX2Rpc3BhdGNoX3NtX2V2ZW50KHBlZXItPlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfQVZfQ09OTkVDVF9SRVFfRVZUKTsKLSAgfQotfQotCi0vKioKLSAqIFJlcG9ydCB0aGUgQTJEUCBjb25uZWN0aW9uIHN0YXRlCi0gKgotICogQHBhcmFtIHBlZXJfYWRkcmVzcyB0aGUgcGVlciBhZGRyZXNzCi0gKiBAcGFyYW0gc3RhdGUgdGhlIGNvbm5lY3Rpb24gc3RhdGUKLSAqLwotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlKSB7Ci0gIExPR19JTkZPKCIlczogcGVlcl9hZGRyZXNzPSVzIHN0YXRlPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIHN0YXRlKTsKLQotICBpZiAoYnRpZl9hdl9zb3VyY2UuRW5hYmxlZCgpKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0aWZfYXZfc291cmNlLkNhbGxiYWNrcygpLT5jb25uZWN0aW9uX3N0YXRlX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MsIHN0YXRlKSk7Ci0gIH0gZWxzZSBpZiAoYnRpZl9hdl9zaW5rLkVuYWJsZWQoKSkgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidGlmX2F2X3NpbmsuQ2FsbGJhY2tzKCktPmNvbm5lY3Rpb25fc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcywgc3RhdGUpKTsKLSAgfQotfQotCi0vKioKLSAqIFJlcG9ydCB0aGUgYXVkaW8gc3RhdGUgb2YgdGhlIEEyRFAgY29ubmVjdGlvbi4KLSAqIFRoZSBzdGF0ZSBpcyB1cGRhdGVkIHdoZW4gZWl0aGVyIHRoZSByZW1vdGUgZW5kcyBzdGFydHMgc3RyZWFtaW5nCi0gKiAoU3RhcnRlZCBzdGF0ZSkgb3Igd2hlbmV2ZXIgaXQgdHJhbnNpdGlvbnMgb3V0IG9mIFN0YXJ0ZWQgc3RhdGUKLSAqICh0byBPcGVuZWQgb3IgU3RyZWFtaW5nIHN0YXRlKS4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAqIEBwYXJhbSBzdGF0ZSB0aGUgYXVkaW8gc3RhdGUKLSAqLwotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfYXVkaW9fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIExPR19JTkZPKCIlczogcGVlcl9hZGRyZXNzPSVzIHN0YXRlPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIHN0YXRlKTsKLQotICBpZiAoYnRpZl9hdl9zb3VyY2UuRW5hYmxlZCgpKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0aWZfYXZfc291cmNlLkNhbGxiYWNrcygpLT5hdWRpb19zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLCBzdGF0ZSkpOwotICB9IGVsc2UgaWYgKGJ0aWZfYXZfc2luay5FbmFibGVkKCkpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRpZl9hdl9zaW5rLkNhbGxiYWNrcygpLT5hdWRpb19zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLCBzdGF0ZSkpOwotICB9Ci0KLSAgdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjphMmRwOjpBdWRpb0NvZGluZ01vZGVFbnVtOwotICB1c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OmEyZHA6OlBsYXliYWNrU3RhdGVFbnVtOwotICBQbGF5YmFja1N0YXRlRW51bSBwbGF5YmFja19zdGF0ZSA9IFBsYXliYWNrU3RhdGVFbnVtOjpQTEFZQkFDS19TVEFURV9VTktOT1dOOwotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBCVEFWX0FVRElPX1NUQVRFX1NUQVJURUQ6Ci0gICAgICBwbGF5YmFja19zdGF0ZSA9IFBsYXliYWNrU3RhdGVFbnVtOjpQTEFZQkFDS19TVEFURV9QTEFZSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0FVRElPX1NUQVRFX1NUT1BQRUQ6Ci0gICAgICBwbGF5YmFja19zdGF0ZSA9IFBsYXliYWNrU3RhdGVFbnVtOjpQTEFZQkFDS19TVEFURV9OT1RfUExBWUlORzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBBdWRpb0NvZGluZ01vZGVFbnVtIGF1ZGlvX2NvZGluZ19tb2RlID0KLSAgICAgIGJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX3J1bm5pbmcoKQotICAgICAgICAgID8gQXVkaW9Db2RpbmdNb2RlRW51bTo6QVVESU9fQ09ESU5HX01PREVfSEFSRFdBUkUKLSAgICAgICAgICA6IEF1ZGlvQ29kaW5nTW9kZUVudW06OkFVRElPX0NPRElOR19NT0RFX1NPRlRXQVJFOwotCi0gIGxvZ19hMmRwX3BsYXliYWNrX2V2ZW50KHBlZXJfYWRkcmVzcywgcGxheWJhY2tfc3RhdGUsIGF1ZGlvX2NvZGluZ19tb2RlKTsKLX0KLQotdm9pZCBidGlmX2F2X3JlcG9ydF9zb3VyY2VfY29kZWNfc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfY29uZmlnLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYKLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBwZWVyX2FkZHJlc3M9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgaWYgKGJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKSkgewotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZChidGlmX2F2X3NvdXJjZS5DYWxsYmFja3MoKS0+YXVkaW9fY29uZmlnX2NiLCBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgY29kZWNfY29uZmlnLCBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgIGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcykpOwotICB9Ci19Ci0KLS8qKgotICogUmVwb3J0IHRoZSBhdWRpbyBjb25maWcgc3RhdGUgb2YgdGhlIEEyRFAgU2luayBjb25uZWN0aW9uLgotICoKLSAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgYWRkcmVzcwotICogQHBhcmFtIHNhbXBsZV9yYXRlIHRoZSBzYW1wbGUgcmF0ZSAoaW4gc2FtcGxlcyBwZXIgc2Vjb25kKQotICogQHBhcmFtIGNoYW5uZWxfY291bnQgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIE1vbm8sIDIgZm9yIFN0ZXJlbykKLSAqLwotc3RhdGljIHZvaWQgYnRpZl9hdl9yZXBvcnRfc2lua19hdWRpb19jb25maWdfc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCBpbnQgc2FtcGxlX3JhdGUsIGludCBjaGFubmVsX2NvdW50KSB7Ci0gIExPR19JTkZPKCIlczogUGVlciAlcyA6IHNhbXBsZV9yYXRlPSVkIGNoYW5uZWxfY291bnQ9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgc2FtcGxlX3JhdGUsIGNoYW5uZWxfY291bnQpOwotICBpZiAoYnRpZl9hdl9zaW5rLkVuYWJsZWQoKSkgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidGlmX2F2X3NpbmsuQ2FsbGJhY2tzKCktPmF1ZGlvX2NvbmZpZ19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLCBzYW1wbGVfcmF0ZSwgY2hhbm5lbF9jb3VudCkpOwotICB9Ci19Ci0KLS8qKgotICogQ2FsbCBvdXQgdG8gSk5JIC8gSkFWQSBsYXllcnMgdG8gcmV0cmlldmUgd2hldGhlciB0aGUgbWFuZGF0b3J5IGNvZGVjIGlzIG1vcmUKLSAqIHByZWZlcnJlZCB0aGFuIG90aGVycy4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAqLwotc3RhdGljIHZvaWQgYnRpZl9hdl9xdWVyeV9tYW5kYXRvcnlfY29kZWNfcHJpb3JpdHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIGF1dG8gcXVlcnlfcHJpb3JpdHkgPSBbXShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgICBpZiAoIWJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKSkgewotICAgICAgTE9HX1dBUk4oIkJUSUYgQVYgU291cmNlIGlzIG5vdCBlbmFibGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJ0YXZfc291cmNlX2NhbGxiYWNrc190KiBjYWxsYmFja3MgPSBidGlmX2F2X3NvdXJjZS5DYWxsYmFja3MoKTsKLSAgICBib29sIHByZWZlcnJlZCA9IGNhbGxiYWNrcyAhPSBudWxscHRyICYmCi0gICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPm1hbmRhdG9yeV9jb2RlY19wcmVmZXJyZWRfY2IocGVlcl9hZGRyZXNzKTsKLSAgICBpZiAocHJlZmVycmVkKSB7Ci0gICAgICBhdXRvIGFwcGx5X3ByaW9yaXR5ID0gW10oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCBib29sIHByZWZlcnJlZCkgewotICAgICAgICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX3BlZXIocGVlcl9hZGRyZXNzKTsKLSAgICAgICAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgImJ0aWZfYXZfcXVlcnlfbWFuZGF0b3J5X2NvZGVjX3ByaW9yaXR5OiBwZWVyIGlzIG51bGwiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcGVlci0+U2V0TWFuZGF0b3J5Q29kZWNQcmVmZXJyZWQocHJlZmVycmVkKTsKLSAgICAgIH07Ci0gICAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGFwcGx5X3ByaW9yaXR5LCBwZWVyX2FkZHJlc3MsIHByZWZlcnJlZCkpOwotICAgIH0KLSAgfTsKLSAgaWYgKGJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKSkgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShxdWVyeV9wcmlvcml0eSwgcGVlcl9hZGRyZXNzKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcm9jZXNzIEJUSUYgb3IgQlRBIEFWIG9yIEJUQSBBVlJDUCBldmVudHMuIFRoZSBwcm9jZXNzaW5nIGlzIGRvbmUgb24gdGhlCi0gKiBKTkkgdGhyZWFkLgotICoKLSAqIEBwYXJhbSBwZWVyX3NlcCB0aGUgY29ycmVzcG9uZGluZyBwZWVyJ3MgU0VQOiBBVkRUX1RTRVBfU1JDIGlmIHRoZSBwZWVyCi0gKiBpcyBBMkRQIFNvdXJjZSwgb3IgQVZEVF9UU0VQX1NOSyBpZiB0aGUgcGVlciBpcyBBMkRQIFNpbmsuCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MgaWYga25vd24sIG90aGVyd2lzZSBSYXdBZGRyZXNzOjprRW1wdHkKLSAqIEBwYXJhbSBidGFfaGFuZGxlIHRoZSBCVEEgaGFuZGxlIGZvciB0aGUgcGVlciBpZiBrbm93biwgb3RoZXJ3aXNlCi0gKiBrQnRhSGFuZGxlVW5rbm93bgotICogQHBhcmFtIGJ0aWZfYXZfZXZlbnQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQKLSAqLwotc3RhdGljIHZvaWQgYnRpZl9hdl9oYW5kbGVfZXZlbnQodWludDhfdCBwZWVyX3NlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfSE5ETCBidGFfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnRpZkF2RXZlbnQmIGJ0aWZfYXZfZXZlbnQpIHsKLSAgTE9HX0RFQlVHKCJIYW5kbGUgZXZlbnQgcGVlcl9hZGRyZXNzPSVzIGJ0YV9oYW5kbGU9MHgleCIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocGVlcl9hZGRyZXNzKSwgYnRhX2hhbmRsZSk7Ci0KLSAgQnRpZkF2UGVlciogcGVlciA9IG51bGxwdHI7Ci0KLSAgLy8gRmluZCB0aGUgcGVlcgotICBpZiAocGVlcl9hZGRyZXNzICE9IFJhd0FkZHJlc3M6OmtFbXB0eSkgewotICAgIGlmIChwZWVyX3NlcCA9PSBBVkRUX1RTRVBfU05LKSB7Ci0gICAgICBwZWVyID0gYnRpZl9hdl9zb3VyY2UuRmluZE9yQ3JlYXRlUGVlcihwZWVyX2FkZHJlc3MsIGJ0YV9oYW5kbGUpOwotICAgIH0gZWxzZSBpZiAocGVlcl9zZXAgPT0gQVZEVF9UU0VQX1NSQykgewotICAgICAgcGVlciA9IGJ0aWZfYXZfc2luay5GaW5kT3JDcmVhdGVQZWVyKHBlZXJfYWRkcmVzcywgYnRhX2hhbmRsZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGJ0YV9oYW5kbGUgIT0ga0J0YUhhbmRsZVVua25vd24pIHsKLSAgICBpZiAocGVlcl9zZXAgPT0gQVZEVF9UU0VQX1NOSykgewotICAgICAgcGVlciA9IGJ0aWZfYXZfc291cmNlLkZpbmRQZWVyQnlIYW5kbGUoYnRhX2hhbmRsZSk7Ci0gICAgfSBlbHNlIGlmIChwZWVyX3NlcCA9PSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgICBwZWVyID0gYnRpZl9hdl9zaW5rLkZpbmRQZWVyQnlIYW5kbGUoYnRhX2hhbmRsZSk7Ci0gICAgfQotICB9Ci0gIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICJqbmlfdGhyZWFkOiBDYW5ub3QgZmluZCBvciBjcmVhdGUgJXMgcGVlciBmb3IgcGVlcl9hZGRyZXNzPSVzICIKLSAgICAgICAgIiBidGFfaGFuZGxlPTB4JXggOiBldmVudCBkcm9wcGVkOiAlcyIsCi0gICAgICAgIHBlZXJfc3RyZWFtX2VuZHBvaW50X3RleHQocGVlcl9zZXApLmNfc3RyKCksCi0gICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGJ0YV9oYW5kbGUsCi0gICAgICAgIGJ0aWZfYXZfZXZlbnQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwZWVyLT5TdGF0ZU1hY2hpbmUoKS5Qcm9jZXNzRXZlbnQoYnRpZl9hdl9ldmVudC5FdmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hdl9ldmVudC5EYXRhKCkpOwotfQotCi0vKioKLSAqIFByb2Nlc3MgQlRBIEFWIG9yIEJUQSBBVlJDUCBldmVudHMuIFRoZSBwcm9jZXNzaW5nIGlzIGRvbmUgb24gdGhlIEpOSQotICogdGhyZWFkLgotICoKLSAqIEBwYXJhbSBwZWVyX3NlcCB0aGUgY29ycmVzcG9uZGluZyBwZWVyJ3MgU0VQOiBBVkRUX1RTRVBfU1JDIGlmIHRoZSBwZWVyCi0gKiBpcyBBMkRQIFNvdXJjZSwgb3IgQVZEVF9UU0VQX1NOSyBpZiB0aGUgcGVlciBpcyBBMkRQIFNpbmsuCi0gKiBAcGFyYW0gYnRpZl9hdl9ldmVudCB0aGUgY29ycmVzcG9uZGluZyBldmVudAotICovCi1zdGF0aWMgdm9pZCBidGlmX2F2X2hhbmRsZV9idGFfYXZfZXZlbnQodWludDhfdCBwZWVyX3NlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdGlmQXZFdmVudCYgYnRpZl9hdl9ldmVudCkgewotICBSYXdBZGRyZXNzIHBlZXJfYWRkcmVzcyA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgdEJUQV9BVl9ITkRMIGJ0YV9oYW5kbGUgPSBrQnRhSGFuZGxlVW5rbm93bjsKLSAgdEJUQV9BVl9FVlQgZXZlbnQgPSBidGlmX2F2X2V2ZW50LkV2ZW50KCk7Ci0gIHRCVEFfQVYqIHBfZGF0YSA9ICh0QlRBX0FWKilidGlmX2F2X2V2ZW50LkRhdGEoKTsKLSAgc3RkOjpzdHJpbmcgbXNnOwotCi0gIExPR19ERUJVRygKLSAgICAgICJqbmlfdGhyZWFkOiBIYW5kbGUgQlRBIEFWIG9yIEFWUkNQIGV2ZW50ICVzOiBwZWVyX3NlcD0laGh1IGV2ZW50PSVzIiwKLSAgICAgIHBlZXJfc3RyZWFtX2VuZHBvaW50X3RleHQocGVlcl9zZXApLmNfc3RyKCksIHBlZXJfc2VwLAotICAgICAgYnRpZl9hdl9ldmVudC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9BVl9FTkFCTEVfRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX0VOQUJMRSYgZW5hYmxlID0gcF9kYXRhLT5lbmFibGU7Ci0gICAgICBMT0dfREVCVUcoIkVuYWJsZSBmZWF0dXJlcz0weCV4IiwgZW5hYmxlLmZlYXR1cmVzKTsKLSAgICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICB9Ci0gICAgY2FzZSBCVEFfQVZfUkVHSVNURVJfRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX1JFR0lTVEVSJiByZWdpc3RyID0gcF9kYXRhLT5yZWdpc3RyOwotICAgICAgYnRhX2hhbmRsZSA9IHJlZ2lzdHIuaG5kbDsKLSAgICAgIHVpbnQ4X3QgcGVlcl9pZCA9IHJlZ2lzdHIuYXBwX2lkOyAgLy8gVGhlIFBlZXJJZCBpcyB1c2VkIGFzIEFwcElkCi0gICAgICBMT0dfREVCVUcoIlJlZ2lzdGVyIGJ0YV9oYW5kbGU9MHgleCBhcHBfaWQ9JWQiLCBidGFfaGFuZGxlLAotICAgICAgICAgICAgICAgIHJlZ2lzdHIuYXBwX2lkKTsKLSAgICAgIGlmIChwZWVyX3NlcCA9PSBBVkRUX1RTRVBfU05LKSB7Ci0gICAgICAgIGJ0aWZfYXZfc291cmNlLkJ0YUhhbmRsZVJlZ2lzdGVyZWQocGVlcl9pZCwgYnRhX2hhbmRsZSk7Ci0gICAgICB9IGVsc2UgaWYgKHBlZXJfc2VwID09IEFWRFRfVFNFUF9TUkMpIHsKLSAgICAgICAgYnRpZl9hdl9zaW5rLkJ0YUhhbmRsZVJlZ2lzdGVyZWQocGVlcl9pZCwgYnRhX2hhbmRsZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47ICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8KLSAgICB9Ci0gICAgY2FzZSBCVEFfQVZfT1BFTl9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfT1BFTiYgb3BlbiA9IHBfZGF0YS0+b3BlbjsKLSAgICAgIHBlZXJfYWRkcmVzcyA9IG9wZW4uYmRfYWRkcjsKLSAgICAgIGJ0YV9oYW5kbGUgPSBvcGVuLmhuZGw7Ci0gICAgICBtc2cgPSAiU3RyZWFtIG9wZW5lZCI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfQVZfQ0xPU0VfRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX0NMT1NFJiBjbG9zZSA9IHBfZGF0YS0+Y2xvc2U7Ci0gICAgICBidGFfaGFuZGxlID0gY2xvc2UuaG5kbDsKLSAgICAgIG1zZyA9ICJTdHJlYW0gY2xvc2VkIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9TVEFSVF9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfU1RBUlQmIHN0YXJ0ID0gcF9kYXRhLT5zdGFydDsKLSAgICAgIGJ0YV9oYW5kbGUgPSBzdGFydC5obmRsOwotICAgICAgbXNnID0gIlN0cmVhbSBzdGFydGVkIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9TVVNQRU5EX0VWVDoKLSAgICBjYXNlIEJUQV9BVl9TVE9QX0VWVDogewotICAgICAgY29uc3QgdEJUQV9BVl9TVVNQRU5EJiBzdXNwZW5kID0gcF9kYXRhLT5zdXNwZW5kOwotICAgICAgYnRhX2hhbmRsZSA9IHN1c3BlbmQuaG5kbDsKLSAgICAgIG1zZyA9ICJTdHJlYW0gc3RvcHBlZCI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfQVZfUFJPVEVDVF9SRVFfRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX1BST1RFQ1RfUkVRJiBwcm90ZWN0X3JlcSA9IHBfZGF0YS0+cHJvdGVjdF9yZXE7Ci0gICAgICBidGFfaGFuZGxlID0gcHJvdGVjdF9yZXEuaG5kbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9QUk9URUNUX1JTUF9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfUFJPVEVDVF9SU1AmIHByb3RlY3RfcnNwID0gcF9kYXRhLT5wcm90ZWN0X3JzcDsKLSAgICAgIGJ0YV9oYW5kbGUgPSBwcm90ZWN0X3JzcC5obmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0FWX1JDX09QRU5fRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX1JDX09QRU4mIHJjX29wZW4gPSBwX2RhdGEtPnJjX29wZW47Ci0gICAgICBwZWVyX2FkZHJlc3MgPSByY19vcGVuLnBlZXJfYWRkcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9SQ19DTE9TRV9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfUkNfQ0xPU0UmIHJjX2Nsb3NlID0gcF9kYXRhLT5yY19jbG9zZTsKLSAgICAgIHBlZXJfYWRkcmVzcyA9IHJjX2Nsb3NlLnBlZXJfYWRkcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9SQ19CUk9XU0VfT1BFTl9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfUkNfQlJPV1NFX09QRU4mIHJjX2Jyb3dzZV9vcGVuID0gcF9kYXRhLT5yY19icm93c2Vfb3BlbjsKLSAgICAgIHBlZXJfYWRkcmVzcyA9IHJjX2Jyb3dzZV9vcGVuLnBlZXJfYWRkcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9SQ19CUk9XU0VfQ0xPU0VfRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX1JDX0JST1dTRV9DTE9TRSYgcmNfYnJvd3NlX2Nsb3NlID0gcF9kYXRhLT5yY19icm93c2VfY2xvc2U7Ci0gICAgICBwZWVyX2FkZHJlc3MgPSByY19icm93c2VfY2xvc2UucGVlcl9hZGRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0FWX1JFTU9URV9DTURfRVZUOgotICAgIGNhc2UgQlRBX0FWX1JFTU9URV9SU1BfRVZUOgotICAgIGNhc2UgQlRBX0FWX1ZFTkRPUl9DTURfRVZUOgotICAgIGNhc2UgQlRBX0FWX1ZFTkRPUl9SU1BfRVZUOgotICAgIGNhc2UgQlRBX0FWX01FVEFfTVNHX0VWVDoKLSAgICBjYXNlIEJUQV9BVl9PRkZMT0FEX1NUQVJUX1JTUF9FVlQ6IHsKLSAgICAgIC8vIFRPRE86IE1pZ2h0IGJlIHdyb25nIC0gdGhpcyBjb2RlIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRob3NlCi0gICAgICAvLyBldmVudHMgYXJlIHJlY2VpdmVkIGZyb20gdGhlIEFWUkNQIG1vZHVsZS4KLSAgICAgIGlmIChwZWVyX3NlcCA9PSBBVkRUX1RTRVBfU05LKSB7Ci0gICAgICAgIHBlZXJfYWRkcmVzcyA9IGJ0aWZfYXZfc291cmNlLkFjdGl2ZVBlZXIoKTsKLSAgICAgICAgbXNnID0gIlN0cmVhbSBzaW5rIG9mZmxvYWRlZCI7Ci0gICAgICB9IGVsc2UgaWYgKHBlZXJfc2VwID09IEFWRFRfVFNFUF9TUkMpIHsKLSAgICAgICAgcGVlcl9hZGRyZXNzID0gYnRpZl9hdl9zaW5rLkFjdGl2ZVBlZXIoKTsKLSAgICAgICAgbXNnID0gIlN0cmVhbSBzb3VyY2Ugb2ZmbG9hZGVkIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9SRUNPTkZJR19FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfUkVDT05GSUcmIHJlY29uZmlnID0gcF9kYXRhLT5yZWNvbmZpZzsKLSAgICAgIGJ0YV9oYW5kbGUgPSByZWNvbmZpZy5obmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0FWX1BFTkRJTkdfRVZUOiB7Ci0gICAgICBjb25zdCB0QlRBX0FWX1BFTkQmIHBlbmQgPSBwX2RhdGEtPnBlbmQ7Ci0gICAgICBwZWVyX2FkZHJlc3MgPSBwZW5kLmJkX2FkZHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfQVZfUkVKRUNUX0VWVDogewotICAgICAgY29uc3QgdEJUQV9BVl9SRUpFQ1QmIHJlamVjdCA9IHBfZGF0YS0+cmVqZWN0OwotICAgICAgcGVlcl9hZGRyZXNzID0gcmVqZWN0LmJkX2FkZHI7Ci0gICAgICBidGFfaGFuZGxlID0gcmVqZWN0LmhuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfQVZfUkNfRkVBVF9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfUkNfRkVBVCYgcmNfZmVhdCA9IHBfZGF0YS0+cmNfZmVhdDsKLSAgICAgIHBlZXJfYWRkcmVzcyA9IHJjX2ZlYXQucGVlcl9hZGRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0FWX1JDX1BTTV9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfQVZfUkNfUFNNJiByY19wc20gPSBwX2RhdGEtPnJjX2NvdmVyX2FydF9wc207Ci0gICAgICBwZWVyX2FkZHJlc3MgPSByY19wc20ucGVlcl9hZGRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFtc2cuZW1wdHkoKSkgewotICAgIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dIaXN0b3J5VGFnLCBwZWVyX2FkZHJlc3MsIG1zZywKLSAgICAgICAgICAgICAgICAgICBidGlmX2F2X2V2ZW50LlRvU3RyaW5nKCkpOwotICB9Ci0gIGJ0aWZfYXZfaGFuZGxlX2V2ZW50KHBlZXJfc2VwLCBwZWVyX2FkZHJlc3MsIGJ0YV9oYW5kbGUsIGJ0aWZfYXZfZXZlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBidGFfYXZfc291cmNlX2NhbGxiYWNrKHRCVEFfQVZfRVZUIGV2ZW50LCB0QlRBX0FWKiBwX2RhdGEpIHsKLSAgQnRpZkF2RXZlbnQgYnRpZl9hdl9ldmVudChldmVudCwgcF9kYXRhLCBzaXplb2YodEJUQV9BVikpOwotICBCVElGX1RSQUNFX0VWRU5UKCIlczogZXZlbnQ9JXMiLCBfX2Z1bmNfXywgYnRpZl9hdl9ldmVudC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRpZl9hdl9oYW5kbGVfYnRhX2F2X2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRFRfVFNFUF9TTksgLyogcGVlcl9zZXAgKi8sIGJ0aWZfYXZfZXZlbnQpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2F2X3NpbmtfY2FsbGJhY2sodEJUQV9BVl9FVlQgZXZlbnQsIHRCVEFfQVYqIHBfZGF0YSkgewotICBCdGlmQXZFdmVudCBidGlmX2F2X2V2ZW50KGV2ZW50LCBwX2RhdGEsIHNpemVvZih0QlRBX0FWKSk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRpZl9hdl9oYW5kbGVfYnRhX2F2X2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRFRfVFNFUF9TUkMgLyogcGVlcl9zZXAgKi8sIGJ0aWZfYXZfZXZlbnQpKTsKLX0KLQotLy8gVE9ETzogQWxsIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgb24gdGhlIEpOSSB0aHJlYWQKLXN0YXRpYyB2b2lkIGJ0YV9hdl9zaW5rX21lZGlhX2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9NRURJQSogcF9kYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBldmVudD0lZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBhZGRyZXNzPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgKHBfZGF0YS0+YXZrX2NvbmZpZy5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9BVl9TSU5LX01FRElBX0RBVEFfRVZUOiB7Ci0gICAgICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9zaW5rX2ZpbmRfcGVlcihwZWVyX2FkZHJlc3MpOwotICAgICAgaWYgKHBlZXIgIT0gbnVsbHB0ciAmJiBwZWVyLT5Jc0FjdGl2ZVBlZXIoKSkgewotICAgICAgICBpbnQgc3RhdGUgPSBwZWVyLT5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCk7Ci0gICAgICAgIGlmICgoc3RhdGUgPT0gQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVTdGFydGVkKSB8fAotICAgICAgICAgICAgKHN0YXRlID09IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkKSkgewotICAgICAgICAgIHVpbnQ4X3QgcXVldWVfbGVuID0gYnRpZl9hMmRwX3NpbmtfZW5xdWV1ZV9idWYoKEJUX0hEUiopcF9kYXRhKTsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGFja2V0cyBpbiBTaW5rIHF1ZXVlICVkIiwgX19mdW5jX18sIHF1ZXVlX2xlbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9BVl9TSU5LX01FRElBX0NGR19FVlQ6IHsKLSAgICAgIGJ0aWZfYXZfc2lua19jb25maWdfcmVxX3QgY29uZmlnX3JlcTsKLQotICAgICAgLy8gVXBkYXRlIHRoZSBjb2RlYyBpbmZvIG9mIHRoZSBBMkRQIFNpbmsgZGVjb2RlcgotICAgICAgYnRpZl9hMmRwX3NpbmtfdXBkYXRlX2RlY29kZXIoKHVpbnQ4X3QqKShwX2RhdGEtPmF2a19jb25maWcuY29kZWNfaW5mbykpOwotCi0gICAgICBjb25maWdfcmVxLnNhbXBsZV9yYXRlID0KLSAgICAgICAgICBBMkRQX0dldFRyYWNrU2FtcGxlUmF0ZShwX2RhdGEtPmF2a19jb25maWcuY29kZWNfaW5mbyk7Ci0gICAgICBpZiAoY29uZmlnX3JlcS5zYW1wbGVfcmF0ZSA9PSAtMSkgewotICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IGdldCB0aGUgdHJhY2sgZnJlcXVlbmN5IiwgX19mdW5jX18pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNvbmZpZ19yZXEuY2hhbm5lbF9jb3VudCA9Ci0gICAgICAgICAgQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChwX2RhdGEtPmF2a19jb25maWcuY29kZWNfaW5mbyk7Ci0gICAgICBpZiAoY29uZmlnX3JlcS5jaGFubmVsX2NvdW50ID09IC0xKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBDYW5ub3QgZ2V0IHRoZSBjaGFubmVsIGNvdW50IiwgX19mdW5jX18pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNvbmZpZ19yZXEucGVlcl9hZGRyZXNzID0gcF9kYXRhLT5hdmtfY29uZmlnLmJkX2FkZHI7Ci0gICAgICBCdGlmQXZFdmVudCBidGlmX2F2X2V2ZW50KEJUSUZfQVZfU0lOS19DT05GSUdfUkVRX0VWVCwgJmNvbmZpZ19yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjb25maWdfcmVxKSk7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZidGlmX2F2X2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEVF9UU0VQX1NSQywgIC8vIHBlZXJfc2VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19yZXEucGVlcl9hZGRyZXNzLCBrQnRhSGFuZGxlVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hdl9ldmVudCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vLyBJbml0aWFsaXplcyB0aGUgQVYgaW50ZXJmYWNlIGZvciBzb3VyY2UgbW9kZQotc3RhdGljIGJ0X3N0YXR1c190IGluaXRfc3JjKAotICAgIGJ0YXZfc291cmNlX2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGludCBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllcywKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBvZmZsb2FkaW5nX3ByZWZlcmVuY2UpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBidGlmX2F2X3NvdXJjZS5Jbml0KGNhbGxiYWNrcywgbWF4X2Nvbm5lY3RlZF9hdWRpb19kZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19wcmlvcml0aWVzLCBvZmZsb2FkaW5nX3ByZWZlcmVuY2UpOwotfQotCi0vLyBJbml0aWFsaXplcyB0aGUgQVYgaW50ZXJmYWNlIGZvciBzaW5rIG1vZGUKLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0X3NpbmsoYnRhdl9zaW5rX2NhbGxiYWNrc190KiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBidGlmX2F2X3NpbmsuSW5pdChjYWxsYmFja3MsIG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcyk7Ci19Ci0KLS8vIFVwZGF0ZXMgdGhlIGZpbmFsIGZvY3VzIHN0YXRlIHJlcG9ydGVkIGJ5IGNvbXBvbmVudHMgY2FsbGluZyB0aGlzIG1vZHVsZQotc3RhdGljIHZvaWQgdXBkYXRlX2F1ZGlvX2ZvY3VzX3N0YXRlKGludCBzdGF0ZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogc3RhdGU9JWQiLCBfX2Z1bmNfXywgc3RhdGUpOwotICBidGlmX2EyZHBfc2lua19zZXRfZm9jdXNfc3RhdGVfcmVxKChidGlmX2EyZHBfc2lua19mb2N1c19zdGF0ZV90KXN0YXRlKTsKLX0KLQotLy8gVXBkYXRlcyB0aGUgdHJhY2sgZ2FpbiAodXNlZCBmb3IgZHVja2luZykuCi1zdGF0aWMgdm9pZCB1cGRhdGVfYXVkaW9fdHJhY2tfZ2FpbihmbG9hdCBnYWluKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBnYWluPSVmIiwgX19mdW5jX18sIGdhaW4pOwotICBidGlmX2EyZHBfc2lua19zZXRfYXVkaW9fdHJhY2tfZ2FpbihnYWluKTsKLX0KLQotLy8gRXN0YWJsaXNoZXMgdGhlIEFWIHNpZ25hbGxpbmcgY2hhbm5lbCB3aXRoIHRoZSByZW1vdGUgaGVhZHNldAotc3RhdGljIGJ0X3N0YXR1c190IGNvbm5lY3RfaW50KFJhd0FkZHJlc3MqIHBlZXJfYWRkcmVzcywgdWludDE2X3QgdXVpZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGVlcl9hZGRyZXNzPSVzIHV1aWQ9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy0+VG9TdHJpbmcoKS5jX3N0cigpLCB1dWlkKTsKLQotICBhdXRvIGNvbm5lY3Rpb25fdGFzayA9IFtdKFJhd0FkZHJlc3MqIHBlZXJfYWRkcmVzcywgdWludDE2X3QgdXVpZCkgewotICAgIEJ0aWZBdlBlZXIqIHBlZXIgPSBudWxscHRyOwotICAgIGlmICh1dWlkID09IFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSkgewotICAgICAgcGVlciA9IGJ0aWZfYXZfc291cmNlLkZpbmRPckNyZWF0ZVBlZXIoKnBlZXJfYWRkcmVzcywga0J0YUhhbmRsZVVua25vd24pOwotICAgIH0gZWxzZSBpZiAodXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKSB7Ci0gICAgICBwZWVyID0gYnRpZl9hdl9zaW5rLkZpbmRPckNyZWF0ZVBlZXIoKnBlZXJfYWRkcmVzcywga0J0YUhhbmRsZVVua25vd24pOwotICAgIH0KLSAgICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcGVlci0+U3RhdGVNYWNoaW5lKCkuUHJvY2Vzc0V2ZW50KEJUSUZfQVZfQ09OTkVDVF9SRVFfRVZULCBudWxscHRyKTsKLSAgfTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGNvbm5lY3Rpb25fdGFzaywgcGVlcl9hZGRyZXNzLCB1dWlkKSk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNhbid0IHBvc3QgY29ubmVjdGlvbiB0YXNrIHRvIG1haW5fdGhyZWFkIjsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfc291cmNlX3NpbGVuY2VfcGVlcl9pbnQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZSkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGVlcl9hZGRyZXNzPSVzLCBzaWxlbmNlPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgc2lsZW5jZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICBpZiAoIWJ0aWZfYXZfc291cmNlLlNldFNpbGVuY2VQZWVyKHBlZXJfYWRkcmVzcywgc2lsZW5jZSkpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3Igc2V0dGluZyBzaWxlbmNlIHN0YXRlIHRvICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vLyBTZXQgdGhlIGFjdGl2ZSBwZWVyCi1zdGF0aWMgdm9pZCBzZXRfYWN0aXZlX3BlZXJfaW50KHVpbnQ4X3QgcGVlcl9zZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZSkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGVlcl9zZXA9JXMgKCVkKSBwZWVyX2FkZHJlc3M9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAocGVlcl9zZXAgPT0gQVZEVF9UU0VQX1NSQykgPyAiU291cmNlIiA6ICJTaW5rIiwgcGVlcl9zZXAsCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIEJ0aWZBdlBlZXIqIHBlZXIgPSBudWxscHRyOwotICBpZiAocGVlcl9zZXAgPT0gQVZEVF9UU0VQX1NOSykgewotICAgIGlmICghYnRpZl9hdl9zb3VyY2UuU2V0QWN0aXZlUGVlcihwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSkgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgJXMgYXMgYWN0aXZlIFNpbmsgcGVlciIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwZWVyX3NlcCA9PSBBVkRUX1RTRVBfU1JDKSB7Ci0gICAgaWYgKCFidGlmX2F2X3NpbmsuU2V0QWN0aXZlUGVlcihwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVlcl9yZWFkeV9wcm9taXNlKSkpIHsKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciBzZXR0aW5nICVzIGFzIGFjdGl2ZSBTb3VyY2UgcGVlciIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIElmIHJlYWNoZWQgaGVyZSwgd2UgY291bGQgbm90IHNldCB0aGUgYWN0aXZlIHBlZXIKLSAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IENhbm5vdCBzZXQgYWN0aXZlICVzIHBlZXIgdG8gJXM6IHBlZXIgbm90ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgKHBlZXJfc2VwID09IEFWRFRfVFNFUF9TUkMpID8gIlNvdXJjZSIgOiAiU2luayIsCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAocGVlciA9PSBudWxscHRyKSA/ICJmb3VuZCIgOiAiY29ubmVjdGVkIik7Ci0gIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHNyY19jb25uZWN0X3NpbmsoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIGlmICghYnRpZl9hdl9zb3VyY2UuRW5hYmxlZCgpKSB7Ci0gICAgTE9HX1dBUk4oIkJUSUYgQVYgU291cmNlIGlzIG5vdCBlbmFibGVkIik7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLQotICBSYXdBZGRyZXNzIHBlZXJfYWRkcmVzc19jb3B5KHBlZXJfYWRkcmVzcyk7Ci0gIExPR19ERUJVRygiQ29ubmVjdGluZyB0byBBViBzaW5rIHBlZXI6JXMiLAotICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBlZXJfYWRkcmVzc19jb3B5KSk7Ci0KLSAgcmV0dXJuIGJ0aWZfcXVldWVfY29ubmVjdChVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UsICZwZWVyX2FkZHJlc3NfY29weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2ludCk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBzaW5rX2Nvbm5lY3Rfc3JjKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBMT0dfSU5GTygiJXM6IFBlZXIgJXMiLCBfX2Z1bmNfXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKCFidGlmX2F2X3NpbmsuRW5hYmxlZCgpKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogQlRJRiBBViBTaW5rIGlzIG5vdCBlbmFibGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICB9Ci0KLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHJlc3NfY29weShwZWVyX2FkZHJlc3MpOwotICByZXR1cm4gYnRpZl9xdWV1ZV9jb25uZWN0KFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkssICZwZWVyX2FkZHJlc3NfY29weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2ludCk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBzcmNfZGlzY29ubmVjdF9zaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBMT0dfSU5GTygiJXM6IFBlZXIgJXMiLCBfX2Z1bmNfXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKCFidGlmX2F2X3NvdXJjZS5FbmFibGVkKCkpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVElGIEFWIFNvdXJjZSBpcyBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIEJ0aWZBdkV2ZW50IGJ0aWZfYXZfZXZlbnQoQlRJRl9BVl9ESVNDT05ORUNUX1JFUV9FVlQsICZwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBlZXJfYWRkcmVzcykpOwotICByZXR1cm4gZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0aWZfYXZfaGFuZGxlX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRFRfVFNFUF9TTkssICAvLyBwZWVyX3NlcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcywga0J0YUhhbmRsZVVua25vd24sIGJ0aWZfYXZfZXZlbnQpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHNpbmtfZGlzY29ubmVjdF9zcmMoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIExPR19JTkZPKCIlczogUGVlciAlcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBpZiAoIWJ0aWZfYXZfc2luay5FbmFibGVkKCkpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVElGIEFWIFNpbmsgaXMgbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLQotICBCdGlmQXZFdmVudCBidGlmX2F2X2V2ZW50KEJUSUZfQVZfRElTQ09OTkVDVF9SRVFfRVZULCAmcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwZWVyX2FkZHJlc3MpKTsKLSAgcmV0dXJuIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGlmX2F2X2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRUX1RTRVBfU1JDLCAgLy8gcGVlcl9zZXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MsIGtCdGFIYW5kbGVVbmtub3duLCBidGlmX2F2X2V2ZW50KSk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBzaW5rX3NldF9hY3RpdmVfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogUGVlciAlcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBpZiAoIWJ0aWZfYXZfc2luay5FbmFibGVkKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQlRJRiBBViBTb3VyY2UgaXMgbm90IGVuYWJsZWQiOwotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICB9Ci0KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHBlZXJfcmVhZHlfcHJvbWlzZTsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gcGVlcl9yZWFkeV9mdXR1cmUgPSBwZWVyX3JlYWR5X3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJnNldF9hY3RpdmVfcGVlcl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRFRfVFNFUF9TUkMsICAvLyBwZWVyX3NlcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MsIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSk7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBwZWVyX3JlYWR5X2Z1dHVyZS53YWl0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJUSUYgQVYgU2luayBmYWlscyB0byBjaGFuZ2UgcGVlciI7Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHNyY19zZXRfc2lsZW5jZV9zaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2UpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IFBlZXIgJXMiLCBfX2Z1bmNfXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGlmICghYnRpZl9hdl9zb3VyY2UuRW5hYmxlZCgpKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogQlRJRiBBViBTb3VyY2UgaXMgbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLQotICByZXR1cm4gZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZzZXRfc291cmNlX3NpbGVuY2VfcGVlcl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLCBzaWxlbmNlKSk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBzcmNfc2V0X2FjdGl2ZV9zaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogUGVlciAlcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBpZiAoIWJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFWIFNvdXJjZSBpcyBub3QgZW5hYmxlZCI7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLQotICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBwZWVyX3JlYWR5X2Z1dHVyZSA9IHBlZXJfcmVhZHlfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmc2V0X2FjdGl2ZV9wZWVyX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEVF9UU0VQX1NOSywgIC8vIHBlZXJfc2VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcywgc3RkOjptb3ZlKHBlZXJfcmVhZHlfcHJvbWlzZSkpKTsKLSAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIHBlZXJfcmVhZHlfZnV0dXJlLndhaXQoKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQlRJRiBBViBTb3VyY2UgZmFpbHMgdG8gY2hhbmdlIHBlZXIiOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBjb2RlY19jb25maWdfc3JjKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjX3ByZWZlcmVuY2VzKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghYnRpZl9hdl9zb3VyY2UuRW5hYmxlZCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJUSUYgQVYgU291cmNlIGlzIG5vdCBlbmFibGVkIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChwZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJUSUYgQVYgU291cmNlIG5lZWRzIHBlZXIgdG8gY29uZmlnIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1BBUk1fSU5WQUxJRDsKLSAgfQotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2U7Ci0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IHBlZXJfcmVhZHlfZnV0dXJlID0gcGVlcl9yZWFkeV9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmQnRpZkF2U291cmNlOjpVcGRhdGVDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmJ0aWZfYXZfc291cmNlKSwgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgY29kZWNfcHJlZmVyZW5jZXMsIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSk7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBwZWVyX3JlYWR5X2Z1dHVyZS53YWl0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJUSUYgQVYgU291cmNlIGZhaWxzIHRvIGNvbmZpZyBjb2RlYyI7Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9zcmModm9pZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZCdGlmQXZTb3VyY2U6OkNsZWFudXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZidGlmX2F2X3NvdXJjZSkpKTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9zaW5rKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmQnRpZkF2U2luazo6Q2xlYW51cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmJ0aWZfYXZfc2luaykpKTsKLX0KLQotc3RhdGljIGNvbnN0IGJ0YXZfc291cmNlX2ludGVyZmFjZV90IGJ0X2F2X3NyY19pbnRlcmZhY2UgPSB7Ci0gICAgc2l6ZW9mKGJ0YXZfc291cmNlX2ludGVyZmFjZV90KSwKLSAgICBpbml0X3NyYywKLSAgICBzcmNfY29ubmVjdF9zaW5rLAotICAgIHNyY19kaXNjb25uZWN0X3NpbmssCi0gICAgc3JjX3NldF9zaWxlbmNlX3NpbmssCi0gICAgc3JjX3NldF9hY3RpdmVfc2luaywKLSAgICBjb2RlY19jb25maWdfc3JjLAotICAgIGNsZWFudXBfc3JjLAotfTsKLQotc3RhdGljIGNvbnN0IGJ0YXZfc2lua19pbnRlcmZhY2VfdCBidF9hdl9zaW5rX2ludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYnRhdl9zaW5rX2ludGVyZmFjZV90KSwKLSAgICBpbml0X3NpbmssCi0gICAgc2lua19jb25uZWN0X3NyYywKLSAgICBzaW5rX2Rpc2Nvbm5lY3Rfc3JjLAotICAgIGNsZWFudXBfc2luaywKLSAgICB1cGRhdGVfYXVkaW9fZm9jdXNfc3RhdGUsCi0gICAgdXBkYXRlX2F1ZGlvX3RyYWNrX2dhaW4sCi0gICAgc2lua19zZXRfYWN0aXZlX2RldmljZX07Ci0KLVJhd0FkZHJlc3MgYnRpZl9hdl9zb3VyY2VfYWN0aXZlX3BlZXIodm9pZCkgewotICByZXR1cm4gYnRpZl9hdl9zb3VyY2UuQWN0aXZlUGVlcigpOwotfQotUmF3QWRkcmVzcyBidGlmX2F2X3NpbmtfYWN0aXZlX3BlZXIodm9pZCkgeyByZXR1cm4gYnRpZl9hdl9zaW5rLkFjdGl2ZVBlZXIoKTsgfQotCi1ib29sIGJ0aWZfYXZfaXNfc2lua19lbmFibGVkKHZvaWQpIHsgcmV0dXJuIGJ0aWZfYXZfc2luay5FbmFibGVkKCk7IH0KLQotdm9pZCBidGlmX2F2X3N0cmVhbV9zdGFydCh2b2lkKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgYnRpZl9hdl9zb3VyY2VfZGlzcGF0Y2hfc21fZXZlbnQoYnRpZl9hdl9zb3VyY2VfYWN0aXZlX3BlZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRJRl9BVl9TVEFSVF9TVFJFQU1fUkVRX0VWVCk7Ci19Ci0KLXZvaWQgc3JjX2RvX3N1c3BlbmRfaW5fbWFpbl90aHJlYWQoYnRpZl9hdl9zbV9ldmVudF90IGV2ZW50KSB7Ci0gIGlmIChldmVudCAhPSBCVElGX0FWX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQgJiYKLSAgICAgIGV2ZW50ICE9IEJUSUZfQVZfU1RPUF9TVFJFQU1fUkVRX0VWVCkKLSAgICByZXR1cm47Ci0gIGF1dG8gc3JjX2RvX3N0cmVhbV9zdXNwZW5kID0gW10oYnRpZl9hdl9zbV9ldmVudF90IGV2ZW50KSB7Ci0gICAgYm9vbCBpc19pZGxlID0gdHJ1ZTsKLSAgICBmb3IgKGF1dG8gaXQgOiBidGlmX2F2X3NvdXJjZS5QZWVycygpKSB7Ci0gICAgICBjb25zdCBCdGlmQXZQZWVyKiBwZWVyID0gaXQuc2Vjb25kOwotICAgICAgaWYgKHBlZXItPlN0YXRlTWFjaGluZSgpLlN0YXRlSWQoKSA9PSBCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZVN0YXJ0ZWQpIHsKLSAgICAgICAgYnRpZl9hdl9zb3VyY2VfZGlzcGF0Y2hfc21fZXZlbnQocGVlci0+UGVlckFkZHJlc3MoKSwgZXZlbnQpOwotICAgICAgICBpc19pZGxlID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpc19pZGxlKSB7Ci0gICAgICBidGlmX2EyZHBfb25fc3RvcHBlZChudWxscHRyKTsKLSAgICB9Ci0gIH07Ci0gIC8vIHN3aXRjaCB0byBtYWluIHRocmVhZCB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gb2YgYWNjZXNzaW5nIHBlZXJzCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChzcmNfZG9fc3RyZWFtX3N1c3BlbmQsIGV2ZW50KSk7Ci19Ci0KLXZvaWQgYnRpZl9hdl9zdHJlYW1fc3RvcChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgTE9HX0lORk8oIiVzIHBlZXIgJXMiLCBfX2Z1bmNfXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKCFwZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgYnRpZl9hdl9zb3VyY2VfZGlzcGF0Y2hfc21fZXZlbnQocGVlcl9hZGRyZXNzLCBCVElGX0FWX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRoZSBhY3RpdmUgcGVlciBtaWdodCBoYXZlIGNoYW5nZWQgYW5kIHdlIG1pZ2h0IGJlIGluIHRoZSBwcm9jZXNzCi0gIC8vIG9mIHJlY29uZmlndXJpbmcgdGhlIHN0cmVhbS4gV2UgbmVlZCB0byBzdG9wIHRoZSBhcHByb3ByaWF0ZSBwZWVyKHMpLgotICBzcmNfZG9fc3VzcGVuZF9pbl9tYWluX3RocmVhZChCVElGX0FWX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotfQotCi12b2lkIGJ0aWZfYXZfc3RyZWFtX3N1c3BlbmQodm9pZCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIC8vIFRoZSBhY3RpdmUgcGVlciBtaWdodCBoYXZlIGNoYW5nZWQgYW5kIHdlIG1pZ2h0IGJlIGluIHRoZSBwcm9jZXNzCi0gIC8vIG9mIHJlY29uZmlndXJpbmcgdGhlIHN0cmVhbS4gV2UgbmVlZCB0byBzdXNwZW5kIHRoZSBhcHByb3ByaWF0ZSBwZWVyKHMpLgotICBzcmNfZG9fc3VzcGVuZF9pbl9tYWluX3RocmVhZChCVElGX0FWX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQpOwotfQotCi12b2lkIGJ0aWZfYXZfc3RyZWFtX3N0YXJ0X29mZmxvYWQodm9pZCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0aWZfYXZfc291cmNlX2Rpc3BhdGNoX3NtX2V2ZW50KGJ0aWZfYXZfc291cmNlX2FjdGl2ZV9wZWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfQVZfT0ZGTE9BRF9TVEFSVF9SRVFfRVZUKTsKLX0KLQotdm9pZCBidGlmX2F2X3NyY19kaXNjb25uZWN0X3NpbmsoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIExPR19JTkZPKCIlczogcGVlciAlcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgc3JjX2Rpc2Nvbm5lY3Rfc2luayhwZWVyX2FkZHJlc3MpOwotfQotCi1ib29sIGJ0aWZfYXZfc3RyZWFtX3JlYWR5KHZvaWQpIHsKLSAgLy8gTWFrZSBzdXJlIHRoZSBtYWluIGFkYXB0ZXIgaXMgZW5hYmxlZAotICBpZiAoYnRpZl9pc19lbmFibGVkKCkgPT0gMCkgewotICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBNYWluIGFkYXB0ZXIgaXMgbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQnRpZkF2UGVlciogcGVlciA9IGJ0aWZfYXZfZmluZF9hY3RpdmVfcGVlcigpOwotICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogTm8gYWN0aXZlIHBlZXIgZm91bmQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW50IHN0YXRlID0gcGVlci0+U3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpOwotICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBzdGF0ZT0lZCwgZmxhZ3M9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHN0YXRlLAotICAgICAgICAgICBwZWVyLT5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIC8vIGNoZWNrIGlmIHdlIGFyZSByZW1vdGVseSBzdXNwZW5kZWQgb3Igc3RvcCBpcyBwZW5kaW5nCi0gIGlmIChwZWVyLT5DaGVja0ZsYWdzKEJ0aWZBdlBlZXI6OmtGbGFnUmVtb3RlU3VzcGVuZCB8Ci0gICAgICAgICAgICAgICAgICAgICAgIEJ0aWZBdlBlZXI6OmtGbGFnUGVuZGluZ1N0b3ApKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIChzdGF0ZSA9PSBCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZCk7Ci19Ci0KLWJvb2wgYnRpZl9hdl9zdHJlYW1fc3RhcnRlZF9yZWFkeSh2b2lkKSB7Ci0gIEJ0aWZBdlBlZXIqIHBlZXIgPSBidGlmX2F2X2ZpbmRfYWN0aXZlX3BlZXIoKTsKLSAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IE5vIGFjdGl2ZSBwZWVyIGZvdW5kIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBzdGF0ZSA9IHBlZXItPlN0YXRlTWFjaGluZSgpLlN0YXRlSWQoKTsKLSAgYm9vbCByZWFkeSA9IGZhbHNlOwotICBpZiAocGVlci0+Q2hlY2tGbGFncyhCdGlmQXZQZWVyOjprRmxhZ0xvY2FsU3VzcGVuZFBlbmRpbmcgfAotICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZQZWVyOjprRmxhZ1JlbW90ZVN1c3BlbmQgfAotICAgICAgICAgICAgICAgICAgICAgICBCdGlmQXZQZWVyOjprRmxhZ1BlbmRpbmdTdG9wKSkgewotICAgIC8vIERpc2FsbG93IG1lZGlhIHRhc2sgdG8gc3RhcnQgaWYgd2UgaGF2ZSBwZW5kaW5nIGFjdGlvbnMKLSAgICByZWFkeSA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHJlYWR5ID0gKHN0YXRlID09IEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZCk7Ci0gIH0KLSAgTE9HX0lORk8oIiVzOiBQZWVyICVzIDogc3RhdGU9JWQgZmxhZ3M9JXMgcmVhZHk9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIHN0YXRlLAotICAgICAgICAgICBwZWVyLT5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSwgcmVhZHkpOwotCi0gIHJldHVybiByZWFkeTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hdl9zb3VyY2VfZGlzcGF0Y2hfc21fZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hdl9zbV9ldmVudF90IGV2ZW50KSB7Ci0gIEJ0aWZBdkV2ZW50IGJ0aWZfYXZfZXZlbnQoZXZlbnQsIG51bGxwdHIsIDApOwotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGVlcl9hZGRyZXNzPSVzIGV2ZW50PSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBidGlmX2F2X2V2ZW50LlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZidGlmX2F2X2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRUX1RTRVBfU05LLCAgLy8gcGVlcl9zZXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MsIGtCdGFIYW5kbGVVbmtub3duLCBidGlmX2F2X2V2ZW50KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYXZfc2lua19kaXNwYXRjaF9zbV9ldmVudChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hdl9zbV9ldmVudF90IGV2ZW50KSB7Ci0gIEJ0aWZBdkV2ZW50IGJ0aWZfYXZfZXZlbnQoZXZlbnQsIG51bGxwdHIsIDApOwotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGVlcl9hZGRyZXNzPSVzIGV2ZW50PSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBidGlmX2F2X2V2ZW50LlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZidGlmX2F2X2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRUX1RTRVBfU1JDLCAgLy8gcGVlcl9zZXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MsIGtCdGFIYW5kbGVVbmtub3duLCBidGlmX2F2X2V2ZW50KSk7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0aWZfYXZfc291cmNlX2V4ZWN1dGVfc2VydmljZShib29sIGVuYWJsZSkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogU291cmNlIHNlcnZpY2U6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgKGVuYWJsZSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLSAgaWYgKGVuYWJsZSkgewotICAgIC8vIEFkZGVkIEJUQV9BVl9GRUFUX05PX1NDT19TU1BEIC0gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIEJUQSBkb2VzIG5vdAotICAgIC8vIGF1dG8tc3VzcGVuZCBhdiBzdHJlYW1pbmcgb24gQUcgZXZlbnRzKFNDTyBvciBDYWxsKS4gVGhlIHN1c3BlbmQgc2hhbGwKLSAgICAvLyBiZSBpbml0aWF0ZWQgYnkgdGhlIGFwcC9hdWRpb2ZsaW5nZXIgbGF5ZXJzLgotICAgIC8vIFN1cHBvcnQgZm9yIGJyb3dzaW5nIGZvciBTRFAgcmVjb3JkIHNob3VsZCB3b3JrIG9ubHkgaWYgd2UgZW5hYmxlIEJST1dTRQotICAgIC8vIHdoaWxlIHJlZ2lzdGVyaW5nLgotICAgIHRCVEFfQVZfRkVBVCBmZWF0dXJlcyA9IEJUQV9BVl9GRUFUX1JDVEcgfCBCVEFfQVZfRkVBVF9NRVRBREFUQSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FWX0ZFQVRfVkVORE9SIHwgQlRBX0FWX0ZFQVRfTk9fU0NPX1NTUEQ7Ci0KLSAgICBpZiAoZGVsYXlfcmVwb3J0aW5nX2VuYWJsZWQoKSkgewotICAgICAgZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfREVMQVlfUlBUOwotICAgIH0KLQotI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCi0gICAgZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfUkNDVCB8IEJUQV9BVl9GRUFUX0FEVl9DVFJMIHwgQlRBX0FWX0ZFQVRfQlJPV1NFOwotI2VuZGlmCi0gICAgQlRBX0F2RW5hYmxlKGZlYXR1cmVzLCBidGFfYXZfc291cmNlX2NhbGxiYWNrKTsKLSAgICBidGlmX2F2X3NvdXJjZS5SZWdpc3RlckFsbEJ0YUhhbmRsZXMoKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0KLQotICAvLyBEaXNhYmxlIHRoZSBzZXJ2aWNlCi0gIGJ0aWZfYXZfc291cmNlLkRlcmVnaXN0ZXJBbGxCdGFIYW5kbGVzKCk7Ci0gIEJUQV9BdkRpc2FibGUoKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBidGlmX2F2X3NpbmtfZXhlY3V0ZV9zZXJ2aWNlKGJvb2wgZW5hYmxlKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBTaW5rIHNlcnZpY2U6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgKGVuYWJsZSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLSAgaWYgKGVuYWJsZSkgewotICAgIC8vIEFkZGVkIEJUQV9BVl9GRUFUX05PX1NDT19TU1BEIC0gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIEJUQSBkb2VzIG5vdAotICAgIC8vIGF1dG8tc3VzcGVuZCBBViBzdHJlYW1pbmcgb24gQUcgZXZlbnRzIChTQ08gb3IgQ2FsbCkuIFRoZSBzdXNwZW5kIHNoYWxsCi0gICAgLy8gYmUgaW5pdGlhdGVkIGJ5IHRoZSBhcHAvYXVkaW9mbGluZ2VyIGxheWVycy4KLSAgICB0QlRBX0FWX0ZFQVQgZmVhdHVyZXMgPSBCVEFfQVZfRkVBVF9OT19TQ09fU1NQRCB8IEJUQV9BVl9GRUFUX1JDQ1QgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BVl9GRUFUX01FVEFEQVRBIHwgQlRBX0FWX0ZFQVRfVkVORE9SIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQVZfRkVBVF9BRFZfQ1RSTCB8IEJUQV9BVl9GRUFUX1JDVEcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BVl9GRUFUX0JST1dTRSB8IEJUQV9BVl9GRUFUX0NPVkVSX0FSVFdPUks7Ci0KLSAgICBpZiAoZGVsYXlfcmVwb3J0aW5nX2VuYWJsZWQoKSkgewotICAgICAgZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfREVMQVlfUlBUOwotICAgIH0KLQotICAgIEJUQV9BdkVuYWJsZShmZWF0dXJlcywgYnRhX2F2X3NpbmtfY2FsbGJhY2spOwotICAgIGJ0aWZfYXZfc2luay5SZWdpc3RlckFsbEJ0YUhhbmRsZXMoKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0KLQotICAvLyBEaXNhYmxlIHRoZSBzZXJ2aWNlCi0gIGJ0aWZfYXZfc2luay5EZXJlZ2lzdGVyQWxsQnRhSGFuZGxlcygpOwotICBCVEFfQXZEaXNhYmxlKCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLy8gR2V0IHRoZSBBViBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIEEyRFAgc291cmNlIHByb2ZpbGUKLWNvbnN0IGJ0YXZfc291cmNlX2ludGVyZmFjZV90KiBidGlmX2F2X2dldF9zcmNfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRfYXZfc3JjX2ludGVyZmFjZTsKLX0KLQotLy8gR2V0IHRoZSBBViBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIEEyRFAgc2luayBwcm9maWxlCi1jb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqIGJ0aWZfYXZfZ2V0X3NpbmtfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRfYXZfc2lua19pbnRlcmZhY2U7Ci19Ci0KLWJvb2wgYnRpZl9hdl9pc19jb25uZWN0ZWQodm9pZCkgewotICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX2FjdGl2ZV9wZWVyKCk7Ci0gIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBObyBhY3RpdmUgcGVlciBmb3VuZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGNvbm5lY3RlZCA9IHBlZXItPklzQ29ubmVjdGVkKCk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIGlzICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgKGNvbm5lY3RlZCkgPyAiY29ubmVjdGVkIiA6ICJub3QgY29ubmVjdGVkIik7Ci0gIHJldHVybiBjb25uZWN0ZWQ7Ci19Ci0KLXVpbnQ4X3QgYnRpZl9hdl9nZXRfcGVlcl9zZXAodm9pZCkgewotICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX2FjdGl2ZV9wZWVyKCk7Ci0gIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICBMT0dfSU5GTygiTm8gYWN0aXZlIHNpbmsgb3Igc291cmNlIHBlZXIgZm91bmQiKTsKLSAgICByZXR1cm4gQVZEVF9UU0VQX1NOSzsKLSAgfQotCi0gIHVpbnQ4X3QgcGVlcl9zZXAgPSBwZWVyLT5QZWVyU2VwKCk7Ci0gIExPR19JTkZPKCJQZWVyICVzIFNFUCBpcyAlcyAoJWQpIiwgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgIChwZWVyX3NlcCA9PSBBVkRUX1RTRVBfU1JDKSA/ICJTb3VyY2UiIDogIlNpbmsiLCBwZWVyX3NlcCk7Ci0gIHJldHVybiBwZWVyX3NlcDsKLX0KLQotdm9pZCBidGlmX2F2X2NsZWFyX3JlbW90ZV9zdXNwZW5kX2ZsYWcodm9pZCkgewotICBhdXRvIGNsZWFyX3JlbW90ZV9zdXNwZW5kX2ZsYWcgPSBbXSgpIHsKLSAgICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX2FjdGl2ZV9wZWVyKCk7Ci0gICAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogTm8gYWN0aXZlIHBlZXIgZm91bmQiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIDogZmxhZ3M9JXMgYXJlIGNsZWFyZWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgcGVlci0+RmxhZ3NUb1N0cmluZygpLmNfc3RyKCkpOwotICAgIHBlZXItPkNsZWFyRmxhZ3MoQnRpZkF2UGVlcjo6a0ZsYWdSZW1vdGVTdXNwZW5kKTsKLSAgfTsKLSAgLy8gc3dpdGNoIHRvIG1haW4gdGhyZWFkIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiBvZiBhY2Nlc3NpbmcgcGVlcnMKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNsZWFyX3JlbW90ZV9zdXNwZW5kX2ZsYWcpKTsKLX0KLQotYm9vbCBidGlmX2F2X2lzX3BlZXJfZWRyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX3BlZXIocGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IE5vIHBlZXIgZm91bmQgZm9yIHBlZXJfYWRkcmVzcz0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFwZWVyLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgaXNfZWRyID0gcGVlci0+SXNFZHIoKTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMgOiBpc19lZHI9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBpc19lZHIpOwotICByZXR1cm4gaXNfZWRyOwotfQotCi1ib29sIGJ0aWZfYXZfcGVlcl9zdXBwb3J0c18zbWJwcyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgQnRpZkF2UGVlciogcGVlciA9IGJ0aWZfYXZfZmluZF9wZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBObyBwZWVyIGZvdW5kIGZvciBwZWVyX2FkZHJlc3M9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBpczNtYnBzID0gcGVlci0+SXMzTWJwcygpOwotICBib29sIGlzX2Nvbm5lY3RlZCA9IHBlZXItPklzQ29ubmVjdGVkKCk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIDogY29ubmVjdGVkPSVkLCBlZHJfM21icHM9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBpc19jb25uZWN0ZWQsIGlzM21icHMpOwotICByZXR1cm4gKGlzX2Nvbm5lY3RlZCAmJiBpczNtYnBzKTsKLX0KLQotYm9vbCBidGlmX2F2X3BlZXJfcHJlZmVyc19tYW5kYXRvcnlfY29kZWMoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIEJ0aWZBdlBlZXIqIHBlZXIgPSBidGlmX2F2X2ZpbmRfcGVlcihwZWVyX2FkZHJlc3MpOwotICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogTm8gcGVlciBmb3VuZCBmb3IgcGVlcl9hZGRyZXNzPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gcGVlci0+SXNNYW5kYXRvcnlDb2RlY1ByZWZlcnJlZCgpOwotfQotCi12b2lkIGJ0aWZfYXZfYWNsX2Rpc2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgLy8gSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IEFDTCBpcyBkaXNjb25uZWN0ZWQgYW5kIG1vdmUgdG8gaWRsZSBzdGF0ZQotICBMT0dfSU5GTygiJXM6IFBlZXIgJXMgOiBBQ0wgRGlzY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmIChidGlmX2F2X3NvdXJjZS5FbmFibGVkKCkpIHsKLSAgICBidGlmX2F2X3NvdXJjZV9kaXNwYXRjaF9zbV9ldmVudChwZWVyX2FkZHJlc3MsIEJUSUZfQVZfQUNMX0RJU0NPTk5FQ1RFRCk7Ci0gIH0gZWxzZSBpZiAoYnRpZl9hdl9zaW5rLkVuYWJsZWQoKSkgewotICAgIGJ0aWZfYXZfc2lua19kaXNwYXRjaF9zbV9ldmVudChwZWVyX2FkZHJlc3MsIEJUSUZfQVZfQUNMX0RJU0NPTk5FQ1RFRCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9kZWJ1Z19hdl9wZWVyX2R1bXAoaW50IGZkLCBjb25zdCBCdGlmQXZQZWVyJiBwZWVyKSB7Ci0gIHN0ZDo6c3RyaW5nIHN0YXRlX3N0cjsKLSAgaW50IHN0YXRlID0gcGVlci5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCk7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBjYXNlIEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZToKLSAgICAgIHN0YXRlX3N0ciA9ICJJZGxlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQnRpZkF2U3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuaW5nOgotICAgICAgc3RhdGVfc3RyID0gIk9wZW5pbmciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZDoKLSAgICAgIHN0YXRlX3N0ciA9ICJPcGVuZWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCdGlmQXZTdGF0ZU1hY2hpbmU6OmtTdGF0ZVN0YXJ0ZWQ6Ci0gICAgICBzdGF0ZV9zdHIgPSAiU3RhcnRlZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJ0aWZBdlN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZzoKLSAgICAgIHN0YXRlX3N0ciA9ICJDbG9zaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGF0ZV9zdHIgPSAiVW5rbm93bigiICsgc3RkOjp0b19zdHJpbmcoc3RhdGUpICsgIikiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBkcHJpbnRmKGZkLCAiICBQZWVyOiAlc1xuIiwgcGVlci5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGRwcmludGYoZmQsICIgICAgQ29ubmVjdGVkOiAlc1xuIiwgcGVlci5Jc0Nvbm5lY3RlZCgpID8gInRydWUiIDogImZhbHNlIik7Ci0gIGRwcmludGYoZmQsICIgICAgU3RyZWFtaW5nOiAlc1xuIiwgcGVlci5Jc1N0cmVhbWluZygpID8gInRydWUiIDogImZhbHNlIik7Ci0gIGRwcmludGYoZmQsICIgICAgU0VQOiAlZCglcylcbiIsIHBlZXIuUGVlclNlcCgpLAotICAgICAgICAgIChwZWVyLklzU291cmNlKCkpID8gIlNvdXJjZSIgOiAiU2luayIpOwotICBkcHJpbnRmKGZkLCAiICAgIFN0YXRlIE1hY2hpbmU6ICVzXG4iLCBzdGF0ZV9zdHIuY19zdHIoKSk7Ci0gIGRwcmludGYoZmQsICIgICAgRmxhZ3M6ICVzXG4iLCBwZWVyLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgZHByaW50ZihmZCwgIiAgICBPcGVuT25SY1RpbWVyOiAlc1xuIiwKLSAgICAgICAgICBhbGFybV9pc19zY2hlZHVsZWQocGVlci5Bdk9wZW5PblJjVGltZXIoKSkgPyAiU2NoZWR1bGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJOb3Qgc2NoZWR1bGVkIik7Ci0gIGRwcmludGYoZmQsICIgICAgQlRBIEhhbmRsZTogMHgleFxuIiwgcGVlci5CdGFIYW5kbGUoKSk7Ci0gIGRwcmludGYoZmQsICIgICAgUGVlciBJRDogJWRcbiIsIHBlZXIuUGVlcklkKCkpOwotICBkcHJpbnRmKGZkLCAiICAgIEVEUjogJXNcbiIsIHBlZXIuSXNFZHIoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICBkcHJpbnRmKGZkLCAiICAgIFN1cHBvcnQgM01icHM6ICVzXG4iLCBwZWVyLklzM01icHMoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICBkcHJpbnRmKGZkLCAiICAgIFNlbGYgSW5pdGlhdGVkIENvbm5lY3Rpb246ICVzXG4iLAotICAgICAgICAgIHBlZXIuU2VsZkluaXRpYXRlZENvbm5lY3Rpb24oKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICBkcHJpbnRmKGZkLCAiICAgIERlbGF5IFJlcG9ydGluZzogJXUgKGluIDEvMTAgbWlsbGlzZWNvbmRzKSBcbiIsIHBlZXIuR2V0RGVsYXlSZXBvcnQoKSk7Ci0gIGRwcmludGYoZmQsICIgICAgQ29kZWMgUHJlZmVycmVkOiAlc1xuIiwKLSAgICAgICAgICBwZWVyLklzTWFuZGF0b3J5Q29kZWNQcmVmZXJyZWQoKSA/ICJNYW5kYXRvcnkiIDogIk9wdGlvbmFsIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfZGVidWdfYXZfc291cmNlX2R1bXAoaW50IGZkKSB7Ci0gIGJvb2wgZW5hYmxlZCA9IGJ0aWZfYXZfc291cmNlLkVuYWJsZWQoKTsKLQotICBkcHJpbnRmKGZkLCAiXG5BMkRQIFNvdXJjZSBTdGF0ZTogJXNcbiIsIChlbmFibGVkKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICBpZiAoIWVuYWJsZWQpIHJldHVybjsKLSAgZHByaW50ZihmZCwgIiAgQWN0aXZlIHBlZXI6ICVzXG4iLAotICAgICAgICAgIGJ0aWZfYXZfc291cmNlLkFjdGl2ZVBlZXIoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBmb3IgKGF1dG8gaXQgOiBidGlmX2F2X3NvdXJjZS5QZWVycygpKSB7Ci0gICAgY29uc3QgQnRpZkF2UGVlciogcGVlciA9IGl0LnNlY29uZDsKLSAgICBidGlmX2RlYnVnX2F2X3BlZXJfZHVtcChmZCwgKnBlZXIpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfZGVidWdfYXZfc2lua19kdW1wKGludCBmZCkgewotICBib29sIGVuYWJsZWQgPSBidGlmX2F2X3NpbmsuRW5hYmxlZCgpOwotCi0gIGRwcmludGYoZmQsICJcbkEyRFAgU2luayBTdGF0ZTogJXNcbiIsIChlbmFibGVkKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICBpZiAoIWVuYWJsZWQpIHJldHVybjsKLSAgZHByaW50ZihmZCwgIiAgQWN0aXZlIHBlZXI6ICVzXG4iLAotICAgICAgICAgIGJ0aWZfYXZfc2luay5BY3RpdmVQZWVyKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgZHByaW50ZihmZCwgIiAgUGVlcnM6XG4iKTsKLSAgZm9yIChhdXRvIGl0IDogYnRpZl9hdl9zaW5rLlBlZXJzKCkpIHsKLSAgICBjb25zdCBCdGlmQXZQZWVyKiBwZWVyID0gaXQuc2Vjb25kOwotICAgIGJ0aWZfZGVidWdfYXZfcGVlcl9kdW1wKGZkLCAqcGVlcik7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2RlYnVnX2F2X2R1bXAoaW50IGZkKSB7Ci0gIGJ0aWZfZGVidWdfYXZfc291cmNlX2R1bXAoZmQpOwotICBidGlmX2RlYnVnX2F2X3NpbmtfZHVtcChmZCk7Ci19Ci0KLXZvaWQgYnRpZl9hdl9zZXRfYXVkaW9fZGVsYXkoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50MTZfdCBkZWxheSkgewotICBidGlmX2EyZHBfY29udHJvbF9zZXRfYXVkaW9fZGVsYXkoZGVsYXkpOwotICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX3BlZXIocGVlcl9hZGRyZXNzKTsKLSAgaWYgKHBlZXIgIT0gbnVsbHB0ciAmJiBwZWVyLT5Jc1NpbmsoKSkgewotICAgIHBlZXItPlNldERlbGF5UmVwb3J0KGRlbGF5KTsKLSAgICBpZiAocGVlci0+SXNBY3RpdmVQZWVyKCkpIHsKLSAgICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OnNldF9yZW1vdGVfZGVsYXkocGVlci0+R2V0RGVsYXlSZXBvcnQoKSk7Ci0gICAgfQotICB9Ci19Ci0KLXVpbnQxNl90IGJ0aWZfYXZfZ2V0X2F1ZGlvX2RlbGF5KCkgewotICBCdGlmQXZQZWVyKiBwZWVyID0gYnRpZl9hdl9maW5kX2FjdGl2ZV9wZWVyKCk7Ci0gIGlmIChwZWVyICE9IG51bGxwdHIgJiYgcGVlci0+SXNTaW5rKCkpIHsKLSAgICByZXR1cm4gcGVlci0+R2V0RGVsYXlSZXBvcnQoKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBidGlmX2F2X3Jlc2V0X2F1ZGlvX2RlbGF5KHZvaWQpIHsgYnRpZl9hMmRwX2NvbnRyb2xfcmVzZXRfYXVkaW9fZGVsYXkoKTsgfQotCi1ib29sIGJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX2VuYWJsZWQoKSB7Ci0gIHJldHVybiBidGlmX2F2X3NvdXJjZS5BMmRwT2ZmbG9hZEVuYWJsZWQoKTsKLX0KLQotYm9vbCBidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9ydW5uaW5nKCkgewotICBpZiAoIWJ0aWZfYXZfaXNfYTJkcF9vZmZsb2FkX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWJsdWV0b290aDo6YXVkaW86OmEyZHA6OmlzX2hhbF8yXzBfZW5hYmxlZCgpKSB7Ci0gICAgLy8gc2luY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6YTJkcDo6VjFfMCBkZXByZWNhdGVkLCBvZmZsb2FkaW5nCi0gICAgLy8gaXMgc3VwcG9ydGVkIGJ5IEJsdWV0b290aCBBdWRpbyBIQUwgMi4wIG9ubHkuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjppc19oYWxfMl8wX29mZmxvYWRpbmcoKTsKLX0KLQotYm9vbCBidGlmX2F2X2lzX3BlZXJfc2lsZW5jZWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIHJldHVybiBidGlmX2F2X3NvdXJjZS5Jc1BlZXJTaWxlbmNlZChwZWVyX2FkZHJlc3MpOwotfQotCi12b2lkIGJ0aWZfYXZfc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUodWludDhfdCBkeW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplKSB7Ci0gIGJ0aWZfYTJkcF9zb3VyY2Vfc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUoZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2F2cmNwX2F1ZGlvX3RyYWNrLmNjIGIvYnRpZi9zcmMvYnRpZl9hdnJjcF9hdWRpb190cmFjay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNWM5Ny4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2F2cmNwX2F1ZGlvX3RyYWNrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9hdnJjcF9hdWRpb190cmFjayIKLQotI2luY2x1ZGUgImJ0aWZfYXZyY3BfYXVkaW9fdHJhY2suaCIKLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQUF1ZGlvU3RyZWFtKiBzdHJlYW07Ci0gIGludCBiaXRzUGVyU2FtcGxlOwotICBpbnQgY2hhbm5lbENvdW50OwotICBmbG9hdCogYnVmZmVyOwotICBzaXplX3QgYnVmZmVyTGVuZ3RoOwotfSBCdGlmQXZyY3BBdWRpb1RyYWNrOwotCi0jaWYgKERVTVBfUENNX0RBVEEgPT0gVFJVRSkKLUZJTEUqIG91dHB1dFBjbVNhbXBsZUZpbGU7Ci1jaGFyIG91dHB1dEZpbGVuYW1lWzUwXSA9ICIvZGF0YS9taXNjL2JsdWVkcm9pZC9vdXRwdXRfc2FtcGxlLnBjbSI7Ci0jZW5kaWYKLQotdm9pZCogQnRpZkF2cmNwQXVkaW9UcmFja0NyZWF0ZShpbnQgdHJhY2tGcmVxLCBpbnQgYml0c1BlclNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCkgewotICBMT0dfVkVSQk9TRSgiJXMgVHJhY2suY3BwOiBidENyZWF0ZVRyYWNrIGZyZXEgJWQgYnBzICVkIGNoYW5uZWwgJWQgIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrRnJlcSwgYml0c1BlclNhbXBsZSwgY2hhbm5lbENvdW50KTsKLQotICBBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyOwotICBBQXVkaW9TdHJlYW0qIHN0cmVhbTsKLSAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZidWlsZGVyKTsKLSAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKGJ1aWxkZXIsIHRyYWNrRnJlcSk7Ci0gIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KGJ1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKLSAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKLSAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoYnVpbGRlciwgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUpOwotICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Ci0gIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShidWlsZGVyLCAmc3RyZWFtKTsKLSAgQ0hFQ0socmVzdWx0ID09IEFBVURJT19PSyk7Ci0gIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGJ1aWxkZXIpOwotCi0gIEJ0aWZBdnJjcEF1ZGlvVHJhY2sqIHRyYWNrSG9sZGVyID0gbmV3IEJ0aWZBdnJjcEF1ZGlvVHJhY2s7Ci0gIENIRUNLKHRyYWNrSG9sZGVyICE9IE5VTEwpOwotICB0cmFja0hvbGRlci0+c3RyZWFtID0gc3RyZWFtOwotICB0cmFja0hvbGRlci0+Yml0c1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGU7Ci0gIHRyYWNrSG9sZGVyLT5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0gIHRyYWNrSG9sZGVyLT5idWZmZXJMZW5ndGggPQotICAgICAgdHJhY2tIb2xkZXItPmNoYW5uZWxDb3VudCAqIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoc3RyZWFtKTsKLSAgdHJhY2tIb2xkZXItPmJ1ZmZlciA9IG5ldyBmbG9hdFt0cmFja0hvbGRlci0+YnVmZmVyTGVuZ3RoXSgpOwotCi0jaWYgKERVTVBfUENNX0RBVEEgPT0gVFJVRSkKLSAgb3V0cHV0UGNtU2FtcGxlRmlsZSA9IGZvcGVuKG91dHB1dEZpbGVuYW1lLCAiYWIiKTsKLSNlbmRpZgotICByZXR1cm4gKHZvaWQqKXRyYWNrSG9sZGVyOwotfQotCi12b2lkIEJ0aWZBdnJjcEF1ZGlvVHJhY2tTdGFydCh2b2lkKiBoYW5kbGUpIHsKLSAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogaGFuZGxlIGlzIG51bGwhIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBCdGlmQXZyY3BBdWRpb1RyYWNrKiB0cmFja0hvbGRlciA9IHN0YXRpY19jYXN0PEJ0aWZBdnJjcEF1ZGlvVHJhY2sqPihoYW5kbGUpOwotICBDSEVDSyh0cmFja0hvbGRlciAhPSBOVUxMKTsKLSAgQ0hFQ0sodHJhY2tIb2xkZXItPnN0cmVhbSAhPSBOVUxMKTsKLSAgTE9HX1ZFUkJPU0UoIiVzIFRyYWNrLmNwcDogYnRTdGFydFRyYWNrIiwgX19mdW5jX18pOwotICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KHRyYWNrSG9sZGVyLT5zdHJlYW0pOwotfQotCi12b2lkIEJ0aWZBdnJjcEF1ZGlvVHJhY2tTdG9wKHZvaWQqIGhhbmRsZSkgewotICBpZiAoaGFuZGxlID09IE5VTEwpIHsKLSAgICBMT0dfSU5GTygiJXMgaGFuZGxlIGlzIG51bGwuIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBCdGlmQXZyY3BBdWRpb1RyYWNrKiB0cmFja0hvbGRlciA9IHN0YXRpY19jYXN0PEJ0aWZBdnJjcEF1ZGlvVHJhY2sqPihoYW5kbGUpOwotICBpZiAodHJhY2tIb2xkZXIgIT0gTlVMTCAmJiB0cmFja0hvbGRlci0+c3RyZWFtICE9IE5VTEwpIHsKLSAgICBMT0dfVkVSQk9TRSgiJXMgVHJhY2suY3BwOiBidFN0YXJ0VHJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKHRyYWNrSG9sZGVyLT5zdHJlYW0pOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2cmNwQXVkaW9UcmFja0RlbGV0ZSh2b2lkKiBoYW5kbGUpIHsKLSAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgTE9HX0lORk8oIiVzIGhhbmRsZSBpcyBudWxsLiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQnRpZkF2cmNwQXVkaW9UcmFjayogdHJhY2tIb2xkZXIgPSBzdGF0aWNfY2FzdDxCdGlmQXZyY3BBdWRpb1RyYWNrKj4oaGFuZGxlKTsKLSAgaWYgKHRyYWNrSG9sZGVyICE9IE5VTEwgJiYgdHJhY2tIb2xkZXItPnN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgTE9HX1ZFUkJPU0UoIiVzIFRyYWNrLmNwcDogYnRTdGFydFRyYWNrIiwgX19mdW5jX18pOwotICAgIEFBdWRpb1N0cmVhbV9jbG9zZSh0cmFja0hvbGRlci0+c3RyZWFtKTsKLSAgICBkZWxldGUgdHJhY2tIb2xkZXItPmJ1ZmZlcjsKLSAgICBkZWxldGUgdHJhY2tIb2xkZXI7Ci0gIH0KLQotI2lmIChEVU1QX1BDTV9EQVRBID09IFRSVUUpCi0gIGlmIChvdXRwdXRQY21TYW1wbGVGaWxlKSB7Ci0gICAgZmNsb3NlKG91dHB1dFBjbVNhbXBsZUZpbGUpOwotICB9Ci0gIG91dHB1dFBjbVNhbXBsZUZpbGUgPSBOVUxMOwotI2VuZGlmCi19Ci0KLXZvaWQgQnRpZkF2cmNwQXVkaW9UcmFja1BhdXNlKHZvaWQqIGhhbmRsZSkgewotICBpZiAoaGFuZGxlID09IE5VTEwpIHsKLSAgICBMT0dfSU5GTygiJXMgaGFuZGxlIGlzIG51bGwuIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBCdGlmQXZyY3BBdWRpb1RyYWNrKiB0cmFja0hvbGRlciA9IHN0YXRpY19jYXN0PEJ0aWZBdnJjcEF1ZGlvVHJhY2sqPihoYW5kbGUpOwotICBpZiAodHJhY2tIb2xkZXIgIT0gTlVMTCAmJiB0cmFja0hvbGRlci0+c3RyZWFtICE9IE5VTEwpIHsKLSAgICBMT0dfVkVSQk9TRSgiJXMgVHJhY2suY3BwOiBidFBhdXNlVHJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSh0cmFja0hvbGRlci0+c3RyZWFtKTsKLSAgICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKHRyYWNrSG9sZGVyLT5zdHJlYW0pOwotICB9Ci19Ci0KLXZvaWQgQnRpZkF2cmNwU2V0QXVkaW9UcmFja0dhaW4odm9pZCogaGFuZGxlLCBmbG9hdCBnYWluKSB7Ci0gIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgIExPR19JTkZPKCIlcyBoYW5kbGUgaXMgbnVsbC4iLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIERvZXMgbm90aGluZyByaWdodCBub3cKLX0KLQotY29uc3RleHByIGZsb2F0IGtTY2FsZVExNVRvRmxvYXQgPSAxLjBmIC8gMzI3NjguMGY7Ci1jb25zdGV4cHIgZmxvYXQga1NjYWxlUTIzVG9GbG9hdCA9IDEuMGYgLyA4Mzg4NjA4LjBmOwotY29uc3RleHByIGZsb2F0IGtTY2FsZVEzMVRvRmxvYXQgPSAxLjBmIC8gMjE0NzQ4MzY0OC4wZjsKLQotc3RhdGljIHNpemVfdCBzYW1wbGVTaXplRm9yKEJ0aWZBdnJjcEF1ZGlvVHJhY2sqIHRyYWNrSG9sZGVyKSB7Ci0gIHJldHVybiB0cmFja0hvbGRlci0+Yml0c1BlclNhbXBsZSAvIDg7Ci19Ci0KLXN0YXRpYyBzaXplX3QgdHJhbnNjb2RlUTE1VG9GbG9hdCh1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2cmNwQXVkaW9UcmFjayogdHJhY2tIb2xkZXIpIHsKLSAgc2l6ZV90IHNhbXBsZVNpemUgPSBzYW1wbGVTaXplRm9yKHRyYWNrSG9sZGVyKTsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IgKDsgaSA8PSBsZW5ndGggLyBzYW1wbGVTaXplOyBpKyspIHsKLSAgICB0cmFja0hvbGRlci0+YnVmZmVyW2ldID0gKChpbnQxNl90KilidWZmZXIpW2ldICoga1NjYWxlUTE1VG9GbG9hdDsKLSAgfQotICByZXR1cm4gaSAqIHNhbXBsZVNpemU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgdHJhbnNjb2RlUTIzVG9GbG9hdCh1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2cmNwQXVkaW9UcmFjayogdHJhY2tIb2xkZXIpIHsKLSAgc2l6ZV90IHNhbXBsZVNpemUgPSBzYW1wbGVTaXplRm9yKHRyYWNrSG9sZGVyKTsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IgKDsgaSA8PSBsZW5ndGggLyBzYW1wbGVTaXplOyBpKyspIHsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gaSAqIHNhbXBsZVNpemU7Ci0gICAgaW50MzJfdCBzYW1wbGUgPSAqKChpbnQzMl90KikoYnVmZmVyICsgb2Zmc2V0IC0gMSkpICYgMHgwMEZGRkZGRjsKLSAgICB0cmFja0hvbGRlci0+YnVmZmVyW2ldID0gc2FtcGxlICoga1NjYWxlUTIzVG9GbG9hdDsKLSAgfQotICByZXR1cm4gaSAqIHNhbXBsZVNpemU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgdHJhbnNjb2RlUTMxVG9GbG9hdCh1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2cmNwQXVkaW9UcmFjayogdHJhY2tIb2xkZXIpIHsKLSAgc2l6ZV90IHNhbXBsZVNpemUgPSBzYW1wbGVTaXplRm9yKHRyYWNrSG9sZGVyKTsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IgKDsgaSA8PSBsZW5ndGggLyBzYW1wbGVTaXplOyBpKyspIHsKLSAgICB0cmFja0hvbGRlci0+YnVmZmVyW2ldID0gKChpbnQzMl90KilidWZmZXIpW2ldICoga1NjYWxlUTMxVG9GbG9hdDsKLSAgfQotICByZXR1cm4gaSAqIHNhbXBsZVNpemU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgdHJhbnNjb2RlVG9QY21GbG9hdCh1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkF2cmNwQXVkaW9UcmFjayogdHJhY2tIb2xkZXIpIHsKLSAgc3dpdGNoICh0cmFja0hvbGRlci0+Yml0c1BlclNhbXBsZSkgewotICAgIGNhc2UgMTY6Ci0gICAgICByZXR1cm4gdHJhbnNjb2RlUTE1VG9GbG9hdChidWZmZXIsIGxlbmd0aCwgdHJhY2tIb2xkZXIpOwotICAgIGNhc2UgMjQ6Ci0gICAgICByZXR1cm4gdHJhbnNjb2RlUTIzVG9GbG9hdChidWZmZXIsIGxlbmd0aCwgdHJhY2tIb2xkZXIpOwotICAgIGNhc2UgMzI6Ci0gICAgICByZXR1cm4gdHJhbnNjb2RlUTMxVG9GbG9hdChidWZmZXIsIGxlbmd0aCwgdHJhY2tIb2xkZXIpOwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotY29uc3RleHByIGludDY0X3Qga1RpbWVvdXROYW5vcyA9IDEwMCAqIDEwMDAgKiAxMDAwOyAgLy8gMTAwIG1zCi0KLWludCBCdGlmQXZyY3BBdWRpb1RyYWNrV3JpdGVEYXRhKHZvaWQqIGhhbmRsZSwgdm9pZCogYXVkaW9CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyTGVuZ3RoKSB7Ci0gIEJ0aWZBdnJjcEF1ZGlvVHJhY2sqIHRyYWNrSG9sZGVyID0gc3RhdGljX2Nhc3Q8QnRpZkF2cmNwQXVkaW9UcmFjayo+KGhhbmRsZSk7Ci0gIENIRUNLKHRyYWNrSG9sZGVyICE9IE5VTEwpOwotICBDSEVDSyh0cmFja0hvbGRlci0+c3RyZWFtICE9IE5VTEwpOwotICBhYXVkaW9fcmVzdWx0X3QgcmV0dmFsID0gLTE7Ci0jaWYgKERVTVBfUENNX0RBVEEgPT0gVFJVRSkKLSAgaWYgKG91dHB1dFBjbVNhbXBsZUZpbGUpIHsKLSAgICBmd3JpdGUoKGF1ZGlvQnVmZmVyKSwgMSwgKHNpemVfdClidWZmZXJMZW5ndGgsIG91dHB1dFBjbVNhbXBsZUZpbGUpOwotICB9Ci0jZW5kaWYKLQotICBzaXplX3Qgc2FtcGxlU2l6ZSA9IHNhbXBsZVNpemVGb3IodHJhY2tIb2xkZXIpOwotICBpbnQgdHJhbnNjb2RlZENvdW50ID0gMDsKLSAgZG8gewotICAgIHRyYW5zY29kZWRDb3VudCArPQotICAgICAgICB0cmFuc2NvZGVUb1BjbUZsb2F0KCgodWludDhfdCopYXVkaW9CdWZmZXIpICsgdHJhbnNjb2RlZENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCAtIHRyYW5zY29kZWRDb3VudCwgdHJhY2tIb2xkZXIpOwotCi0gICAgcmV0dmFsID0gQUF1ZGlvU3RyZWFtX3dyaXRlKAotICAgICAgICB0cmFja0hvbGRlci0+c3RyZWFtLCB0cmFja0hvbGRlci0+YnVmZmVyLAotICAgICAgICB0cmFuc2NvZGVkQ291bnQgLyAoc2FtcGxlU2l6ZSAqIHRyYWNrSG9sZGVyLT5jaGFubmVsQ291bnQpLAotICAgICAgICBrVGltZW91dE5hbm9zKTsKLSAgICBMT0dfVkVSQk9TRSgiJXMgVHJhY2suY3BwOiBidFdyaXRlRGF0YSBsZW4gPSAlZCByZXQgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCwgcmV0dmFsKTsKLSAgfSB3aGlsZSAodHJhbnNjb2RlZENvdW50IDwgYnVmZmVyTGVuZ3RoKTsKLQotICByZXR1cm4gdHJhbnNjb2RlZENvdW50OwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9hdnJjcF9hdWRpb190cmFja19saW51eC5jYyBiL2J0aWYvc3JjL2J0aWZfYXZyY3BfYXVkaW9fdHJhY2tfbGludXguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzUyMTIuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9hdnJjcF9hdWRpb190cmFja19saW51eC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJidGlmX2F2cmNwX2F1ZGlvX3RyYWNrLmgiCi0KLXZvaWQqIEJ0aWZBdnJjcEF1ZGlvVHJhY2tDcmVhdGUoaW50IHRyYWNrRnJlcSwgaW50IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxUeXBlKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIEJ0aWZBdnJjcEF1ZGlvVHJhY2tTdGFydCh2b2lkKiBoYW5kbGUpIHt9Ci0KLXZvaWQgQnRpZkF2cmNwQXVkaW9UcmFja1N0b3Aodm9pZCogaGFuZGxlKSB7fQotCi12b2lkIEJ0aWZBdnJjcEF1ZGlvVHJhY2tEZWxldGUodm9pZCogaGFuZGxlKSB7fQotCi12b2lkIEJ0aWZBdnJjcEF1ZGlvVHJhY2tQYXVzZSh2b2lkKiBoYW5kbGUpIHt9Ci0KLXZvaWQgQnRpZkF2cmNwU2V0QXVkaW9UcmFja0dhaW4odm9pZCogaGFuZGxlLCBmbG9hdCBnYWluKSB7fQotCi1pbnQgQnRpZkF2cmNwQXVkaW9UcmFja1dyaXRlRGF0YSh2b2lkKiBoYW5kbGUsIHZvaWQqIGF1ZGlvQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcmxlbikgewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfYmxlX2FkdmVydGlzZXIuY2MgYi9idGlmL3NyYy9idGlmX2JsZV9hZHZlcnRpc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGNkYjdmLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfYmxlX2FkdmVydGlzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9ibGVfYWR2ZXJ0aXNlciIKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJsZV9hZHZlcnRpc2VyLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6Ok93bmVkOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgT3duZWRBcnJheVdyYXBwZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgT3duZWRBcnJheVdyYXBwZXIoVCogbykgOiBwdHJfKG8pIHt9Ci0gIH5Pd25lZEFycmF5V3JhcHBlcigpIHsgZGVsZXRlW10gcHRyXzsgfQotICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0gIE93bmVkQXJyYXlXcmFwcGVyKE93bmVkQXJyYXlXcmFwcGVyJiYgb3RoZXIpIG5vZXhjZXB0IHsKLSAgICBwdHJfID0gb3RoZXIucHRyXzsKLSAgICBvdGhlci5wdHJfID0gTlVMTDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBUKiBwdHJfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UKiBVbndyYXAoY29uc3QgT3duZWRBcnJheVdyYXBwZXI8VD4mIG8pIHsKLSAgcmV0dXJuIG8uZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZSBPd25lZEFycmF5V3JhcHBlcjxUPiBPd25lZEFycmF5KFQqIG8pIHsKLSAgcmV0dXJuIE93bmVkQXJyYXlXcmFwcGVyPFQ+KG8pOwotfQotCi12b2lkIHBhcnNlUGFyYW1zKHRCVE1fQkxFX0FEVl9QQVJBTVMqIHBfcGFyYW1zLAotICAgICAgICAgICAgICAgICBjb25zdCBBZHZlcnRpc2VQYXJhbWV0ZXJzJiBwYXJhbXMpIHsKLSAgcF9wYXJhbXMtPmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgPSBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllczsKLSAgcF9wYXJhbXMtPmFkdl9pbnRfbWluID0gcGFyYW1zLm1pbl9pbnRlcnZhbDsKLSAgcF9wYXJhbXMtPmFkdl9pbnRfbWF4ID0gcGFyYW1zLm1heF9pbnRlcnZhbDsKLSAgcF9wYXJhbXMtPmNoYW5uZWxfbWFwID0gcGFyYW1zLmNoYW5uZWxfbWFwOwotICBwX3BhcmFtcy0+YWR2X2ZpbHRlcl9wb2xpY3kgPSAwOwotICBwX3BhcmFtcy0+dHhfcG93ZXIgPSBwYXJhbXMudHhfcG93ZXI7Ci0gIHBfcGFyYW1zLT5wcmltYXJ5X2FkdmVydGlzaW5nX3BoeSA9IHBhcmFtcy5wcmltYXJ5X2FkdmVydGlzaW5nX3BoeTsKLSAgcF9wYXJhbXMtPnNlY29uZGFyeV9hZHZlcnRpc2luZ19waHkgPSBwYXJhbXMuc2Vjb25kYXJ5X2FkdmVydGlzaW5nX3BoeTsKLSAgcF9wYXJhbXMtPnNjYW5fcmVxdWVzdF9ub3RpZmljYXRpb25fZW5hYmxlID0KLSAgICAgIHBhcmFtcy5zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uX2VuYWJsZTsKLX0KLQotdm9pZCBwYXJzZVBlcmlvZGljUGFyYW1zKHRCTEVfUEVSSU9ESUNfQURWX1BBUkFNUyogcF9wZXJpb2RpY19wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfcGFyYW1zKSB7Ci0gIHBfcGVyaW9kaWNfcGFyYW1zLT5lbmFibGUgPSBwZXJpb2RpY19wYXJhbXMuZW5hYmxlOwotICBwX3BlcmlvZGljX3BhcmFtcy0+bWluX2ludGVydmFsID0gcGVyaW9kaWNfcGFyYW1zLm1pbl9pbnRlcnZhbDsKLSAgcF9wZXJpb2RpY19wYXJhbXMtPm1heF9pbnRlcnZhbCA9IHBlcmlvZGljX3BhcmFtcy5tYXhfaW50ZXJ2YWw7Ci0gIHBfcGVyaW9kaWNfcGFyYW1zLT5wZXJpb2RpY19hZHZlcnRpc2luZ19wcm9wZXJ0aWVzID0KLSAgICAgIHBlcmlvZGljX3BhcmFtcy5wZXJpb2RpY19hZHZlcnRpc2luZ19wcm9wZXJ0aWVzOwotfQotCi1jbGFzcyBCbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBCbGVBZHZlcnRpc2VySW50ZXJmYWNlIHsKLSAgfkJsZUFkdmVydGlzZXJJbnRlcmZhY2VJbXBsKCkgb3ZlcnJpZGV7fTsKLQotICB2b2lkIFJlZ2lzdGVyQWR2ZXJ0aXNlckNiKElkU3RhdHVzQ2FsbGJhY2sgY2IsIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHN0YXR1czogIiA8PCArc3RhdHVzCi0gICAgICAgICAgICAgIDw8ICIgLCBhZHZlcmlzZXJfaWQ6ICIgPDwgK2FkdmVydGlzZXJfaWQ7Ci0gICAgZG9faW5fam5pX3RocmVhZChCaW5kKGNiLCBhZHZlcnRpc2VyX2lkLCBzdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJBZHZlcnRpc2VyKElkU3RhdHVzQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLCBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXI6OlJlZ2lzdGVyQWR2ZXJ0aXNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZCbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbDo6UmVnaXN0ZXJBZHZlcnRpc2VyQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNiKSkpOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCkgb3ZlcnJpZGUgewotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIEJpbmQoCi0gICAgICAgICAgICBbXSh1aW50OF90IGFkdmVydGlzZXJfaWQpIHsKLSAgICAgICAgICAgICAgaWYgKCFCbGVBZHZlcnRpc2luZ01hbmFnZXI6OklzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU3RhY2sgYWxyZWFkeSBzaHV0ZG93biI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlVucmVnaXN0ZXIoYWR2ZXJ0aXNlcl9pZCk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpOwotICB9Ci0KLSAgdm9pZCBHZXRPd25BZGRyZXNzKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgR2V0QWRkcmVzc0NhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFCbGVBZHZlcnRpc2luZ01hbmFnZXI6OklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldE93bkFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLCBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgY2IpKSk7Ci0gIH0KLQotICB2b2lkIFNldFBhcmFtZXRlcnModWludDhfdCBhZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2VQYXJhbWV0ZXJzIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICBpZiAoIUJsZUFkdmVydGlzaW5nTWFuYWdlcjo6SXNJbml0aWFsaXplZCgpKSByZXR1cm47Ci0gICAgdEJUTV9CTEVfQURWX1BBUkFNUyogcF9wYXJhbXMgPSBuZXcgdEJUTV9CTEVfQURWX1BBUkFNUzsKLSAgICBwYXJzZVBhcmFtcyhwX3BhcmFtcywgcGFyYW1zKTsKLQotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpTZXRQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBiYXNlOjpPd25lZChwX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsIGNiKSkpOwotICB9Ci0KLSAgdm9pZCBTZXREYXRhKGludCBhZHZlcnRpc2VyX2lkLCBib29sIHNldF9zY2FuX3JzcCwgdmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCi0gICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIGlmICghQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpJc0luaXRpYWxpemVkKCkpIHJldHVybjsKLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXI6OlNldERhdGEsIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCksCi0gICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCwgc2V0X3NjYW5fcnNwLCBzdGQ6Om1vdmUoZGF0YSksCi0gICAgICAgICAgICAgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgY2IpKSk7Ci0gIH0KLQotICB2b2lkIEVuYWJsZSh1aW50OF90IGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLCBTdGF0dXNDYWxsYmFjayBjYiwKLSAgICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb24sIHVpbnQ4X3QgbWF4RXh0QWR2RXZlbnRzLAotICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayB0aW1lb3V0X2NiKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGFkdmVydGlzZXJfaWQ6ICIgPDwgK2FkdmVydGlzZXJfaWQKLSAgICAgICAgICAgIDw8ICIgLGVuYWJsZTogIiA8PCBlbmFibGU7Ci0KLSAgICBpZiAoIUJsZUFkdmVydGlzaW5nTWFuYWdlcjo6SXNJbml0aWFsaXplZCgpKSByZXR1cm47Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpFbmFibGUsIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCksCi0gICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCwgZW5hYmxlLCBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBjYiksIGR1cmF0aW9uLAotICAgICAgICAgICAgIG1heEV4dEFkdkV2ZW50cywgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgdGltZW91dF9jYikpKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRBZHZlcnRpc2luZyh1aW50OF90IGFkdmVydGlzZXJfaWQsIFN0YXR1c0NhbGxiYWNrIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlUGFyYW1ldGVycyBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2VfZGF0YSwgaW50IHRpbWVvdXRfcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgdGltZW91dF9jYikgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICBpZiAoIUJsZUFkdmVydGlzaW5nTWFuYWdlcjo6SXNJbml0aWFsaXplZCgpKSByZXR1cm47Ci0gICAgdEJUTV9CTEVfQURWX1BBUkFNUyogcF9wYXJhbXMgPSBuZXcgdEJUTV9CTEVfQURWX1BBUkFNUzsKLSAgICBwYXJzZVBhcmFtcyhwX3BhcmFtcywgcGFyYW1zKTsKLQotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlcjo6U3RhcnRBZHZlcnRpc2luZywKLSAgICAgICAgICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLCBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsIGNiKSwgYmFzZTo6T3duZWQocF9wYXJhbXMpLAotICAgICAgICAgICAgIHN0ZDo6bW92ZShhZHZlcnRpc2VfZGF0YSksIHN0ZDo6bW92ZShzY2FuX3Jlc3BvbnNlX2RhdGEpLAotICAgICAgICAgICAgIHRpbWVvdXRfcyAqIDEwMCwgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgdGltZW91dF9jYikpKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRBZHZlcnRpc2luZ1NldChpbnQgcmVnX2lkLCBJZFR4UG93ZXJTdGF0dXNDYWxsYmFjayBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmVydGlzZVBhcmFtZXRlcnMgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3BvbnNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyBwZXJpb2RpY19wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwZXJpb2RpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb24sIHVpbnQ4X3QgbWF4RXh0QWR2RXZlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRTdGF0dXNDYWxsYmFjayB0aW1lb3V0X2NiKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICAgIGlmICghQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpJc0luaXRpYWxpemVkKCkpIHJldHVybjsKLSAgICB0QlRNX0JMRV9BRFZfUEFSQU1TKiBwX3BhcmFtcyA9IG5ldyB0QlRNX0JMRV9BRFZfUEFSQU1TOwotICAgIHBhcnNlUGFyYW1zKHBfcGFyYW1zLCBwYXJhbXMpOwotCi0gICAgdEJMRV9QRVJJT0RJQ19BRFZfUEFSQU1TKiBwX3BlcmlvZGljX3BhcmFtcyA9IG5ldyB0QkxFX1BFUklPRElDX0FEVl9QQVJBTVM7Ci0gICAgcGFyc2VQZXJpb2RpY1BhcmFtcyhwX3BlcmlvZGljX3BhcmFtcywgcGVyaW9kaWNfcGFyYW1zKTsKLQotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlcjo6U3RhcnRBZHZlcnRpc2luZ1NldCwKLSAgICAgICAgICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLCBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBjYiksCi0gICAgICAgICAgICAgYmFzZTo6T3duZWQocF9wYXJhbXMpLCBzdGQ6Om1vdmUoYWR2ZXJ0aXNlX2RhdGEpLAotICAgICAgICAgICAgIHN0ZDo6bW92ZShzY2FuX3Jlc3BvbnNlX2RhdGEpLCBiYXNlOjpPd25lZChwX3BlcmlvZGljX3BhcmFtcyksCi0gICAgICAgICAgICAgc3RkOjptb3ZlKHBlcmlvZGljX2RhdGEpLCBkdXJhdGlvbiwgbWF4RXh0QWR2RXZlbnRzLAotICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsIHRpbWVvdXRfY2IpKSk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKAotICAgICAgaW50IGFkdmVydGlzZXJfaWQsIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHBlcmlvZGljX3BhcmFtcywKLSAgICAgIFN0YXR1c0NhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGFkdmVydGlzZXJfaWQ6ICIgPDwgK2FkdmVydGlzZXJfaWQ7Ci0KLSAgICBpZiAoIUJsZUFkdmVydGlzaW5nTWFuYWdlcjo6SXNJbml0aWFsaXplZCgpKSByZXR1cm47Ci0gICAgdEJMRV9QRVJJT0RJQ19BRFZfUEFSQU1TKiBwX3BlcmlvZGljX3BhcmFtcyA9IG5ldyB0QkxFX1BFUklPRElDX0FEVl9QQVJBTVM7Ci0gICAgcGFyc2VQZXJpb2RpY1BhcmFtcyhwX3BlcmlvZGljX3BhcmFtcywgcGVyaW9kaWNfcGFyYW1zKTsKLQotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlcjo6U2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMsCi0gICAgICAgICAgICAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKSwgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICBiYXNlOjpPd25lZChwX3BlcmlvZGljX3BhcmFtcyksCi0gICAgICAgICAgICAgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgY2IpKSk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhKGludCBhZHZlcnRpc2VyX2lkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGFkdmVydGlzZXJfaWQ6ICIgPDwgK2FkdmVydGlzZXJfaWQ7Ci0KLSAgICBpZiAoIUJsZUFkdmVydGlzaW5nTWFuYWdlcjo6SXNJbml0aWFsaXplZCgpKSByZXR1cm47Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlcjo6U2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLCBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRhdGEpLCBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBjYikpKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZShpbnQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBhZHZlcnRpc2VyX2lkOiAiIDw8ICthZHZlcnRpc2VyX2lkCi0gICAgICAgICAgICA8PCAiICxlbmFibGU6ICIgPDwgZW5hYmxlOwotCi0gICAgaWYgKCFCbGVBZHZlcnRpc2luZ01hbmFnZXI6OklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXI6OlNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLCBhZHZlcnRpc2VyX2lkLCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBjYikpKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJDYWxsYmFja3MoQWR2ZXJ0aXNpbmdDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIC8vIEZvciBHRCBvbmx5Ci0gIH0KLX07Ci0KLUJsZUFkdmVydGlzZXJJbnRlcmZhY2UqIGJ0TGVBZHZlcnRpc2VySW5zdGFuY2UgPSBudWxscHRyOwotCi19ICAvLyBuYW1lc3BhY2UKLQotQmxlQWR2ZXJ0aXNlckludGVyZmFjZSogZ2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hZHZlcnRpc2luZ19lbmFibGVkKCkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB1c2UgZ2QgbGUgYWR2ZXJ0aXNlciI7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6Z2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCk7Ci0gIH0gZWxzZSBpZiAoYnRMZUFkdmVydGlzZXJJbnN0YW5jZSA9PSBudWxscHRyKSB7Ci0gICAgYnRMZUFkdmVydGlzZXJJbnN0YW5jZSA9IG5ldyBCbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbCgpOwotICB9Ci0KLSAgcmV0dXJuIGJ0TGVBZHZlcnRpc2VySW5zdGFuY2U7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2JsZV9zY2FubmVyLmNjIGIvYnRpZi9zcmMvYnRpZl9ibGVfc2Nhbm5lci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljY2M1NS4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2JsZV9zY2FubmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9zY2FubmVyIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS90aHJlYWRpbmcvdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9nYXR0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJhZHZlcnRpc2VfZGF0YV9wYXJzZXIuaCIKLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX2NvbmZpZy5oIgotI2luY2x1ZGUgImJ0aWZfZG0uaCIKLSNpbmNsdWRlICJidGlmX2dhdHQuaCIKLSNpbmNsdWRlICJidGlmX2dhdHRfdXRpbC5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbGVfc2Nhbm5pbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidmVuZG9yX2FwaS5oIgotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6T3duZWQ7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLXVzaW5nIFJlZ2lzdGVyQ2FsbGJhY2sgPSBCbGVTY2FubmVySW50ZXJmYWNlOjpSZWdpc3RlckNhbGxiYWNrOwotCi1leHRlcm4gY29uc3QgYnRnYXR0X2NhbGxiYWNrc190KiBidF9nYXR0X2NhbGxiYWNrczsKLQotI2RlZmluZSBTQ0FOX0NCQUNLX0lOX0pOSShQX0NCQUNLLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidF9nYXR0X2NhbGxiYWNrcyAmJiBidF9nYXR0X2NhbGxiYWNrcy0+c2Nhbm5lci0+UF9DQkFDSykgeyAgXAotICAgICAgQlRJRl9UUkFDRV9BUEkoIkhBTCBidF9nYXR0X2NhbGxiYWNrcy0+Y2xpZW50LT4lcyIsICNQX0NCQUNLKTsgXAotICAgICAgZG9faW5fam5pX3RocmVhZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEJpbmQoYnRfZ2F0dF9jYWxsYmFja3MtPnNjYW5uZXItPlBfQ0JBQ0ssIF9fVkFfQVJHU19fKSk7ICAgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQVNTRVJUQygwLCAiQ2FsbGJhY2sgaXMgTlVMTCIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi1uYW1lc3BhY2UgewotCi0vLyBhbGwgYWNjZXNzIHRvIHRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIGRvbmUgb24gdGhlIGpuaSB0aHJlYWQKLXN0ZDo6c2V0PFJhd0FkZHJlc3M+IHJlbW90ZV9iZGFkZHJfY2FjaGU7Ci1zdGQ6OnF1ZXVlPFJhd0FkZHJlc3M+IHJlbW90ZV9iZGFkZHJfY2FjaGVfb3JkZXJlZDsKLWNvbnN0IHNpemVfdCByZW1vdGVfYmRhZGRyX2NhY2hlX21heF9zaXplID0gMTAyNDsKLQotdm9pZCBidGlmX2FkZHJlc3NfY2FjaGVfYWRkKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLCB1aW50OF90IGFkZHJfdHlwZSkgewotICAvLyBSZW1vdmUgdGhlIG9sZGVzdCBlbnRyaWVzCi0gIHdoaWxlIChyZW1vdGVfYmRhZGRyX2NhY2hlLnNpemUoKSA+PSByZW1vdGVfYmRhZGRyX2NhY2hlX21heF9zaXplKSB7Ci0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MgPSByZW1vdGVfYmRhZGRyX2NhY2hlX29yZGVyZWQuZnJvbnQoKTsKLSAgICByZW1vdGVfYmRhZGRyX2NhY2hlLmVyYXNlKHJhd19hZGRyZXNzKTsKLSAgICByZW1vdGVfYmRhZGRyX2NhY2hlX29yZGVyZWQucG9wKCk7Ci0gIH0KLSAgcmVtb3RlX2JkYWRkcl9jYWNoZS5pbnNlcnQocF9iZGEpOwotICByZW1vdGVfYmRhZGRyX2NhY2hlX29yZGVyZWQucHVzaChwX2JkYSk7Ci19Ci0KLWJvb2wgYnRpZl9hZGRyZXNzX2NhY2hlX2ZpbmQoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgcmV0dXJuIChyZW1vdGVfYmRhZGRyX2NhY2hlLmZpbmQocF9iZGEpICE9IHJlbW90ZV9iZGFkZHJfY2FjaGUuZW5kKCkpOwotfQotCi12b2lkIGJ0aWZfYWRkcmVzc19jYWNoZV9pbml0KHZvaWQpIHsKLSAgcmVtb3RlX2JkYWRkcl9jYWNoZS5jbGVhcigpOwotICByZW1vdGVfYmRhZGRyX2NhY2hlX29yZGVyZWQgPSB7fTsKLX0KLQotdm9pZCBidGFfYmF0Y2hfc2Nhbl90aHJlc2hvbGRfY2IodEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSkgewotICBTQ0FOX0NCQUNLX0lOX0pOSShiYXRjaHNjYW5fdGhyZXNob2xkX2NiLCByZWZfdmFsdWUpOwotfQotCi12b2lkIGJ0YV9iYXRjaF9zY2FuX3JlcG9ydHNfY2IoaW50IGNsaWVudF9pZCwgdEJUTV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVwb3J0X2Zvcm1hdCwgdWludDhfdCBudW1fcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIFNDQU5fQ0JBQ0tfSU5fSk5JKGJhdGNoc2Nhbl9yZXBvcnRzX2NiLCBjbGllbnRfaWQsIHN0YXR1cywgcmVwb3J0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgbnVtX3JlY29yZHMsIHN0ZDo6bW92ZShkYXRhKSk7Ci19Ci0KLXZvaWQgYnRhX3NjYW5fcmVzdWx0c19jYl9pbXBsKFJhd0FkZHJlc3MgYmRfYWRkciwgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHJzc2ksIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsZV9ldnRfdHlwZSwgdWludDhfdCBibGVfcHJpbWFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsZV9zZWNvbmRhcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibGVfYWR2ZXJ0aXNpbmdfc2lkLCBpbnQ4X3QgYmxlX3R4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYmxlX3BlcmlvZGljX2Fkdl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gdmFsdWUpIHsKLSAgdWludDhfdCByZW1vdGVfbmFtZV9sZW47Ci0gIGJ0X2RldmljZV90eXBlX3QgZGV2X3R5cGU7Ci0gIGJ0X3Byb3BlcnR5X3QgcHJvcGVydGllczsKLQotICBjb25zdCB1aW50OF90KiBwX2Vpcl9yZW1vdGVfbmFtZSA9IEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKAotICAgICAgdmFsdWUsIEhDSV9FSVJfQ09NUExFVEVfTE9DQUxfTkFNRV9UWVBFLCAmcmVtb3RlX25hbWVfbGVuKTsKLQotICBpZiAocF9laXJfcmVtb3RlX25hbWUgPT0gTlVMTCkgewotICAgIHBfZWlyX3JlbW90ZV9uYW1lID0gQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6R2V0RmllbGRCeVR5cGUoCi0gICAgICAgIHZhbHVlLCBIQ0lfRUlSX1NIT1JURU5FRF9MT0NBTF9OQU1FX1RZUEUsICZyZW1vdGVfbmFtZV9sZW4pOwotICB9Ci0KLSAgaWYgKChhZGRyX3R5cGUgIT0gQkxFX0FERFJfUkFORE9NKSB8fCAocF9laXJfcmVtb3RlX25hbWUpKSB7Ci0gICAgaWYgKCFidGlmX2FkZHJlc3NfY2FjaGVfZmluZChiZF9hZGRyKSkgewotICAgICAgYnRpZl9hZGRyZXNzX2NhY2hlX2FkZChiZF9hZGRyLCBhZGRyX3R5cGUpOwotCi0gICAgICBpZiAocF9laXJfcmVtb3RlX25hbWUpIHsKLSAgICAgICAgaWYgKHJlbW90ZV9uYW1lX2xlbiA+IEJEX05BTUVfTEVOICsgMSB8fAotICAgICAgICAgICAgKHJlbW90ZV9uYW1lX2xlbiA9PSBCRF9OQU1FX0xFTiArIDEgJiYKLSAgICAgICAgICAgICBwX2Vpcl9yZW1vdGVfbmFtZVtCRF9OQU1FX0xFTl0gIT0gJ1wwJykpIHsKLSAgICAgICAgICBMT0dfSU5GTygiJXMgZHJvcHBpbmcgaW52YWxpZCBwYWNrZXQgLSBkZXZpY2UgbmFtZSB0b28gbG9uZzogJWQiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZW1vdGVfbmFtZV9sZW4pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ0X2JkbmFtZV90IGJkbmFtZTsKLSAgICAgICAgbWVtY3B5KGJkbmFtZS5uYW1lLCBwX2Vpcl9yZW1vdGVfbmFtZSwgcmVtb3RlX25hbWVfbGVuKTsKLSAgICAgICAgaWYgKHJlbW90ZV9uYW1lX2xlbiA8IEJEX05BTUVfTEVOICsgMSkKLSAgICAgICAgICBiZG5hbWUubmFtZVtyZW1vdGVfbmFtZV9sZW5dID0gJ1wwJzsKLQotICAgICAgICBMT0dfVkVSQk9TRSgiJXMgQkxFIGRldmljZSBuYW1lPSVzIGxlbj0lZCBkZXZfdHlwZT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBiZG5hbWUubmFtZSwgcmVtb3RlX25hbWVfbGVuLCBkZXZpY2VfdHlwZSk7Ci0gICAgICAgIGJ0aWZfZG1fdXBkYXRlX2JsZV9yZW1vdGVfcHJvcGVydGllcyhiZF9hZGRyLCBiZG5hbWUubmFtZSwgZGV2aWNlX3R5cGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGRldl90eXBlID0gKGJ0X2RldmljZV90eXBlX3QpZGV2aWNlX3R5cGU7Ci0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wZXJ0aWVzLCBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRldl90eXBlKSwgJmRldl90eXBlKTsKLSAgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCYoYmRfYWRkciksICZwcm9wZXJ0aWVzKTsKLQotICBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9hZGRyX3R5cGUoJmJkX2FkZHIsIGFkZHJfdHlwZSk7Ci0gIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2Nhbm5lci0+c2Nhbl9yZXN1bHRfY2IsIGJsZV9ldnRfdHlwZSwgYWRkcl90eXBlLAotICAgICAgICAgICAgJmJkX2FkZHIsIGJsZV9wcmltYXJ5X3BoeSwgYmxlX3NlY29uZGFyeV9waHksIGJsZV9hZHZlcnRpc2luZ19zaWQsCi0gICAgICAgICAgICBibGVfdHhfcG93ZXIsIHJzc2ksIGJsZV9wZXJpb2RpY19hZHZfaW50LCBzdGQ6Om1vdmUodmFsdWUpKTsKLX0KLQotdm9pZCBidGFfc2Nhbl9yZXN1bHRzX2NiKHRCVEFfRE1fU0VBUkNIX0VWVCBldmVudCwgdEJUQV9ETV9TRUFSQ0gqIHBfZGF0YSkgewotICB1aW50OF90IGxlbjsKLQotICBpZiAoZXZlbnQgPT0gQlRBX0RNX0lOUV9DTVBMX0VWVCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzICBCTEUgb2JzZXJ2ZSBjb21wbGV0ZS4gTnVtIFJlc3AgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aW5xX2NtcGwubnVtX3Jlc3BzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZXZlbnQgIT0gQlRBX0RNX0lOUV9SRVNfRVZUKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlcyA6IFVua25vd24gZXZlbnQgMHgleCIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICBpZiAocF9kYXRhLT5pbnFfcmVzLnBfZWlyKSB7Ci0gICAgdmFsdWUuaW5zZXJ0KHZhbHVlLmJlZ2luKCksIHBfZGF0YS0+aW5xX3Jlcy5wX2VpciwKLSAgICAgICAgICAgICAgICAgcF9kYXRhLT5pbnFfcmVzLnBfZWlyICsgcF9kYXRhLT5pbnFfcmVzLmVpcl9sZW4pOwotCi0gICAgaWYgKEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKAotICAgICAgICAgICAgdmFsdWUsIEhDSV9FSVJfQ09NUExFVEVfTE9DQUxfTkFNRV9UWVBFLCAmbGVuKSkgewotICAgICAgcF9kYXRhLT5pbnFfcmVzLnJlbXRfbmFtZV9ub3RfcmVxdWlyZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHRCVEFfRE1fSU5RX1JFUyogciA9ICZwX2RhdGEtPmlucV9yZXM7Ci0gIGRvX2luX2puaV90aHJlYWQoQmluZChidGFfc2Nhbl9yZXN1bHRzX2NiX2ltcGwsIHItPmJkX2FkZHIsIHItPmRldmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgci0+cnNzaSwgci0+YmxlX2FkZHJfdHlwZSwgci0+YmxlX2V2dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgci0+YmxlX3ByaW1hcnlfcGh5LCByLT5ibGVfc2Vjb25kYXJ5X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHItPmJsZV9hZHZlcnRpc2luZ19zaWQsIHItPmJsZV90eF9wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHItPmJsZV9wZXJpb2RpY19hZHZfaW50LCBzdGQ6Om1vdmUodmFsdWUpKSk7Ci19Ci0KLXZvaWQgYnRhX3RyYWNrX2Fkdl9ldmVudF9jYih0QlRNX0JMRV9UUkFDS19BRFZfREFUQSogcF90cmFja19hZHZfZGF0YSkgewotICBidGdhdHRfdHJhY2tfYWR2X2luZm9fdCogYnRpZl9zY2FuX3RyYWNrX2NiID0gbmV3IGJ0Z2F0dF90cmFja19hZHZfaW5mb190OwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBidGlmX2dhdHRfbW92ZV90cmFja19hZHZfZGF0YShidGlmX3NjYW5fdHJhY2tfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidGdhdHRfdHJhY2tfYWR2X2luZm9fdCopcF90cmFja19hZHZfZGF0YSk7Ci0KLSAgU0NBTl9DQkFDS19JTl9KTkkodHJhY2tfYWR2X2V2ZW50X2NiLCBPd25lZChidGlmX3NjYW5fdHJhY2tfY2IpKTsKLX0KLQotdm9pZCBidGFfY2JhY2sodEJUQV9HQVRUQ19FVlQsIHRCVEFfR0FUVEMqKSB7fQotCi1jbGFzcyBCbGVTY2FubmVySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBCbGVTY2FubmVySW50ZXJmYWNlIHsKLSAgfkJsZVNjYW5uZXJJbnRlcmZhY2VJbXBsKCkgb3ZlcnJpZGV7fTsKLQotICB2b2lkIFJlZ2lzdGVyU2Nhbm5lcihjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckNhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgIEJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtdKFJlZ2lzdGVyQ2FsbGJhY2sgY2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVENfQXBwUmVnaXN0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgc3RkOjptb3ZlKGNiKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSkpOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyKGludCBzY2FubmVyX2lkKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZCVEFfR0FUVENfQXBwRGVyZWdpc3Rlciwgc2Nhbm5lcl9pZCkpOwotICB9Ci0KLSAgdm9pZCBTY2FuKGJvb2wgc3RhcnQpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEJpbmQoCi0gICAgICAgIFtdKGJvb2wgc3RhcnQpIHsKLSAgICAgICAgICBpZiAoIXN0YXJ0KSB7Ci0gICAgICAgICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZCVEFfRG1CbGVPYnNlcnZlLCBmYWxzZSwgMCwgbnVsbHB0cikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJ0aWZfYWRkcmVzc19jYWNoZV9pbml0KCk7Ci0gICAgICAgICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgICAgICAgIEZST01fSEVSRSwgQmluZCgmQlRBX0RtQmxlT2JzZXJ2ZSwgdHJ1ZSwgMCwgYnRhX3NjYW5fcmVzdWx0c19jYikpOwotICAgICAgICB9LAotICAgICAgICBzdGFydCkpOwotICB9Ci0KLSAgdm9pZCBTY2FuRmlsdGVyUGFyYW1TZXR1cCgKLSAgICAgIHVpbnQ4X3QgY2xpZW50X2lmLCB1aW50OF90IGFjdGlvbiwgdWludDhfdCBmaWx0X2luZGV4LAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q+IGZpbHRfcGFyYW0sCi0gICAgICBGaWx0ZXJQYXJhbVNldHVwQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAgIGlmIChmaWx0X3BhcmFtICYmIGZpbHRfcGFyYW0tPmRlbHlfbW9kZSA9PSAxKSB7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoQlRNX0JsZVRyYWNrQWR2ZXJ0aXNlciwgYnRhX3RyYWNrX2Fkdl9ldmVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lmKSk7Ci0gICAgfQotCi0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJkJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEJUTV9CTEVfU0NBTl9DT05EX09QPihhY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9pbmRleCwgYmFzZTo6UGFzc2VkKCZmaWx0X3BhcmFtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsIHN0ZDo6bW92ZShjYikpKSk7Ci0gIH0KLQotICB2b2lkIFNjYW5GaWx0ZXJBZGQoaW50IGZpbHRlcl9pbmRleCwgc3RkOjp2ZWN0b3I8QXBjZkNvbW1hbmQ+IGZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDb25maWdDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAlZCIsIF9fZnVuY19fLCBmaWx0ZXJfaW5kZXgpOwotCi0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICZCVE1fTEVfUEZfc2V0LCBmaWx0ZXJfaW5kZXgsIHN0ZDo6bW92ZShmaWx0ZXJzKSwKLSAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcigKLSAgICAgICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgQmluZChzdGQ6Om1vdmUoY2IpLAotICAgICAgICAgICAgICAgICAgICAgMCAvKlRPRE86IHRoaXMgdXNlZCB0byBiZSBmaWx0ZXIgdHlwZSwgdW51c2VkID8qLykpKSk7Ci0gIH0KLQotICB2b2lkIFNjYW5GaWx0ZXJDbGVhcihpbnQgZmlsdGVyX2luZGV4LCBGaWx0ZXJDb25maWdDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBmaWx0ZXJfaW5kZXg6ICVkIiwgX19mdW5jX18sIGZpbHRlcl9pbmRleCk7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmQlRNX0xFX1BGX2NsZWFyLCBmaWx0ZXJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9IRVJFLCBCaW5kKGNiLCBCVE1fQkxFX1BGX1RZUEVfQUxMKSkpKTsKLSAgfQotCi0gIHZvaWQgU2NhbkZpbHRlckVuYWJsZShib29sIGVuYWJsZSwgRW5hYmxlQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogZW5hYmxlOiAlZCIsIF9fZnVuY19fLCBlbmFibGUpOwotCi0gICAgdWludDhfdCBhY3Rpb24gPSBlbmFibGUgPyAxIDogMDsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQlRNX0JsZUVuYWJsZURpc2FibGVGaWx0ZXJGZWF0dXJlLCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBzdGQ6Om1vdmUoY2IpKSkpOwotICB9Ci0KLSAgdm9pZCBTZXRTY2FuUGFyYW1ldGVycyhpbnQgc2Nhbm5lcl9pZCwgaW50IHNjYW5faW50ZXJ2YWwsIGludCBzY2FuX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkJUTV9CbGVTZXRTY2FuUGFyYW1zLCBzY2FuX2ludGVydmFsLCBzY2FuX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfU0NBTl9NT0RFX0FDVEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBzdGQ6Om1vdmUoY2IpKSkpOwotICB9Ci0KLSAgdm9pZCBCYXRjaHNjYW5Db25maWdTdG9yYWdlKGludCBjbGllbnRfaWYsIGludCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhdGNoX3NjYW5fdHJ1bmNfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZCgmQlRNX0JsZVNldFN0b3JhZ2VDb25maWcsICh1aW50OF90KWJhdGNoX3NjYW5fZnVsbF9tYXgsCi0gICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpYmF0Y2hfc2Nhbl90cnVuY19tYXgsCi0gICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsIGNiKSwKLSAgICAgICAgICAgICAgICAgICBidGFfYmF0Y2hfc2Nhbl90aHJlc2hvbGRfY2IsICh0QlRNX0JMRV9SRUZfVkFMVUUpY2xpZW50X2lmKSk7Ci0gIH0KLQotICB2b2lkIEJhdGNoc2NhbkVuYWJsZShpbnQgc2Nhbl9tb2RlLCBpbnQgc2Nhbl9pbnRlcnZhbCwgaW50IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkcl90eXBlLCBpbnQgZGlzY2FyZF9ydWxlLCBDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkJUTV9CbGVFbmFibGVCYXRjaFNjYW4sIHNjYW5fbW9kZSwgc2Nhbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fd2luZG93LCBkaXNjYXJkX3J1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0QkxFX0FERFJfVFlQRT4oYWRkcl90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsIGNiKSkpOwotICB9Ci0KLSAgdm9pZCBCYXRjaHNjYW5EaXNhYmxlKENhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZCVE1fQmxlRGlzYWJsZUJhdGNoU2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgY2IpKSk7Ci0gIH0KLQotICB2b2lkIEJhdGNoc2NhblJlYWRSZXBvcnRzKGludCBjbGllbnRfaWYsIGludCBzY2FuX21vZGUpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZCVE1fQmxlUmVhZFNjYW5SZXBvcnRzLCAodEJMRV9TQ0FOX01PREUpc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgIEJpbmQoYnRhX2JhdGNoX3NjYW5fcmVwb3J0c19jYiwgY2xpZW50X2lmKSkpOwotICB9Ci0KLSAgdm9pZCBTdGFydFN5bmModWludDhfdCBzaWQsIFJhd0FkZHJlc3MgYWRkcmVzcywgdWludDE2X3Qgc2tpcCwKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgU3RhcnRTeW5jQ2Igc3RhcnRfY2IsIFN5bmNSZXBvcnRDYiByZXBvcnRfY2IsCi0gICAgICAgICAgICAgICAgIFN5bmNMb3N0Q2IgbG9zdF9jYikgb3ZlcnJpZGUge30KLQotICB2b2lkIFN0b3BTeW5jKHVpbnQxNl90IGhhbmRsZSkgb3ZlcnJpZGUge30KLQotICB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKFNjYW5uaW5nQ2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgICAvLyBGb3IgR0Qgb25seQotICB9Ci19OwotCi1CbGVTY2FubmVySW50ZXJmYWNlKiBidExlU2Nhbm5lckluc3RhbmNlID0gbnVsbHB0cjsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLUJsZVNjYW5uZXJJbnRlcmZhY2UqIGdldF9ibGVfc2Nhbm5lcl9pbnN0YW5jZSgpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2Nhbm5pbmdfZW5hYmxlZCgpKSB7Ci0gICAgTE9HX0lORk8oIlVzZSBnZCBsZSBzY2FubmVyIik7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6Z2V0X2JsZV9zY2FubmVyX2luc3RhbmNlKCk7Ci0gIH0gZWxzZSBpZiAoYnRMZVNjYW5uZXJJbnN0YW5jZSA9PSBudWxscHRyKSB7Ci0gICAgYnRMZVNjYW5uZXJJbnN0YW5jZSA9IG5ldyBCbGVTY2FubmVySW50ZXJmYWNlSW1wbCgpOwotICB9Ci0gIHJldHVybiBidExlU2Nhbm5lckluc3RhbmNlOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9icXIuY2MgYi9idGlmL3NyYy9idGlmX2Jxci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3N2Y0OS4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2Jxci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmZGVmIE9TX0FORFJPSUQKLSNpbmNsdWRlIDxzdGF0c2xvZ19idC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAiYnRpZl9icXIuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJjb21tb24vbGVha3lfYm9uZGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYnFyIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkxlYWt5Qm9uZGVkUXVldWU7Ci11c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOwotCi0vLyBUaGUgaW5zdGFuY2Ugb2YgQlFSIGV2ZW50IHF1ZXVlCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPExlYWt5Qm9uZGVkUXVldWU8QnFyVnNlU3ViRXZ0Pj4ga3BCcXJFdmVudFF1ZXVlKAotICAgIG5ldyBMZWFreUJvbmRlZFF1ZXVlPEJxclZzZVN1YkV2dD4oa0JxckV2ZW50UXVldWVTaXplKSk7Ci0KLXZvaWQgQnFyVnNlU3ViRXZ0OjpQYXJzZUJxckxpbmtRdWFsaXR5RXZ0KHVpbnQ4X3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9wYXJhbV9idWYpIHsKLSAgaWYgKGxlbmd0aCA8IGtMaW5rUXVhbGl0eVBhcmFtVG90YWxMZW4pIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBQYXJhbWV0ZXIgdG90YWwgbGVuZ3RoOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKGxlbmd0aCkKLSAgICAgICAgICAgICAgIDw8ICIgaXMgYWJub3JtYWwuIEl0IHNoYWxsIGJlIG5vdCBzaG9ydGVyIHRoYW46ICIKLSAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGtMaW5rUXVhbGl0eVBhcmFtVG90YWxMZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOChicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5xdWFsaXR5X3JlcG9ydF9pZCwgcF9wYXJhbV9idWYpOwotICBTVFJFQU1fVE9fVUlOVDgoYnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ucGFja2V0X3R5cGVzLCBwX3BhcmFtX2J1Zik7Ci0gIFNUUkVBTV9UT19VSU5UMTYoYnFyX2xpbmtfcXVhbGl0eV9ldmVudF8uY29ubmVjdGlvbl9oYW5kbGUsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmNvbm5lY3Rpb25fcm9sZSwgcF9wYXJhbV9idWYpOwotICBTVFJFQU1fVE9fSU5UOChicXJfbGlua19xdWFsaXR5X2V2ZW50Xy50eF9wb3dlcl9sZXZlbCwgcF9wYXJhbV9idWYpOwotICBTVFJFQU1fVE9fSU5UOChicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5yc3NpLCBwX3BhcmFtX2J1Zik7Ci0gIFNUUkVBTV9UT19VSU5UOChicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5zbnIsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnVudXNlZF9hZmhfY2hhbm5lbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmFmaF9zZWxlY3RfdW5pZGVhbF9jaGFubmVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgcF9wYXJhbV9idWYpOwotICBTVFJFQU1fVE9fVUlOVDE2KGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmxzdG8sIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQzMihicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5jb25uZWN0aW9uX3BpY29uZXRfY2xvY2ssCi0gICAgICAgICAgICAgICAgICAgcF9wYXJhbV9idWYpOwotICBTVFJFQU1fVE9fVUlOVDMyKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnJldHJhbnNtaXNzaW9uX2NvdW50LCBwX3BhcmFtX2J1Zik7Ci0gIFNUUkVBTV9UT19VSU5UMzIoYnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ubm9fcnhfY291bnQsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQzMihicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5uYWtfY291bnQsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQzMihicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5sYXN0X3R4X2Fja190aW1lc3RhbXAsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQzMihicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5mbG93X29mZl9jb3VudCwgcF9wYXJhbV9idWYpOwotICBTVFJFQU1fVE9fVUlOVDMyKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmxhc3RfZmxvd19vbl90aW1lc3RhbXAsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQzMihicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5idWZmZXJfb3ZlcmZsb3dfYnl0ZXMsIHBfcGFyYW1fYnVmKTsKLSAgU1RSRUFNX1RPX1VJTlQzMihicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5idWZmZXJfdW5kZXJmbG93X2J5dGVzLCBwX3BhcmFtX2J1Zik7Ci0KLSAgY29uc3QgYXV0byBub3cgPSBzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChzeXN0ZW1fY2xvY2s6Om5vdygpKTsKLSAgbG9jYWx0aW1lX3IoJm5vdywgJnRtX3RpbWVzdGFtcF8pOwotfQotCi12b2lkIEJxclZzZVN1YkV2dDo6V3JpdGVMbXBMbFRyYWNlTG9nRmlsZShpbnQgZmQsIHVpbnQ4X3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9wYXJhbV9idWYpIHsKLSAgY29uc3QgYXV0byBub3cgPSBzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChzeXN0ZW1fY2xvY2s6Om5vdygpKTsKLSAgbG9jYWx0aW1lX3IoJm5vdywgJnRtX3RpbWVzdGFtcF8pOwotCi0gIFNUUkVBTV9UT19VSU5UOChicXJfbG9nX2R1bXBfZXZlbnRfLnF1YWxpdHlfcmVwb3J0X2lkLCBwX3BhcmFtX2J1Zik7Ci0gIFNUUkVBTV9UT19VSU5UMTYoYnFyX2xvZ19kdW1wX2V2ZW50Xy5jb25uZWN0aW9uX2hhbmRsZSwgcF9wYXJhbV9idWYpOwotICBsZW5ndGggLT0ga0xvZ0R1bXBQYXJhbVRvdGFsTGVuOwotICBicXJfbG9nX2R1bXBfZXZlbnRfLnZlbmRvcl9zcGVjaWZpY19wYXJhbWV0ZXIgPSBwX3BhcmFtX2J1ZjsKLQotICBzdGQ6OnN0cmluZ3N0cmVhbSBzc19sb2c7Ci0gIHNzX2xvZyA8PCAiXG4iCi0gICAgICAgICA8PCBzdGQ6OnB1dF90aW1lKCZ0bV90aW1lc3RhbXBfLCAiJW0tJWQgJUg6JU06JVMgIikKLSAgICAgICAgIDw8ICJIYW5kbGU6ICIgPDwgbG9naGV4KGJxcl9sb2dfZHVtcF9ldmVudF8uY29ubmVjdGlvbl9oYW5kbGUpCi0gICAgICAgICA8PCAiIFZTUDogIjsKLQotICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIHNzX2xvZy5zdHIoKS5jX3N0cigpLCBzc19sb2cuc3RyKCkuc2l6ZSgpKSk7Ci0gIFRFTVBfRkFJTFVSRV9SRVRSWSgKLSAgICAgIHdyaXRlKGZkLCBicXJfbG9nX2R1bXBfZXZlbnRfLnZlbmRvcl9zcGVjaWZpY19wYXJhbWV0ZXIsIGxlbmd0aCkpOwotICBMbXBMbE1lc3NhZ2VUcmFjZUNvdW50ZXIrKzsKLX0KLQotdm9pZCBCcXJWc2VTdWJFdnQ6OldyaXRlQnRTY2hlZHVsaW5nVHJhY2VMb2dGaWxlKGludCBmZCwgdWludDhfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9wYXJhbV9idWYpIHsKLSAgY29uc3QgYXV0byBub3cgPSBzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChzeXN0ZW1fY2xvY2s6Om5vdygpKTsKLSAgbG9jYWx0aW1lX3IoJm5vdywgJnRtX3RpbWVzdGFtcF8pOwotCi0gIFNUUkVBTV9UT19VSU5UOChicXJfbG9nX2R1bXBfZXZlbnRfLnF1YWxpdHlfcmVwb3J0X2lkLCBwX3BhcmFtX2J1Zik7Ci0gIFNUUkVBTV9UT19VSU5UMTYoYnFyX2xvZ19kdW1wX2V2ZW50Xy5jb25uZWN0aW9uX2hhbmRsZSwgcF9wYXJhbV9idWYpOwotICBsZW5ndGggLT0ga0xvZ0R1bXBQYXJhbVRvdGFsTGVuOwotICBicXJfbG9nX2R1bXBfZXZlbnRfLnZlbmRvcl9zcGVjaWZpY19wYXJhbWV0ZXIgPSBwX3BhcmFtX2J1ZjsKLQotICBzdGQ6OnN0cmluZ3N0cmVhbSBzc19sb2c7Ci0gIHNzX2xvZyA8PCAiXG4iCi0gICAgICAgICA8PCBzdGQ6OnB1dF90aW1lKCZ0bV90aW1lc3RhbXBfLCAiJW0tJWQgJUg6JU06JVMgIikKLSAgICAgICAgIDw8ICJIYW5kbGU6ICIgPDwgbG9naGV4KGJxcl9sb2dfZHVtcF9ldmVudF8uY29ubmVjdGlvbl9oYW5kbGUpCi0gICAgICAgICA8PCAiIFZTUDogIjsKLQotICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIHNzX2xvZy5zdHIoKS5jX3N0cigpLCBzc19sb2cuc3RyKCkuc2l6ZSgpKSk7Ci0gIFRFTVBfRkFJTFVSRV9SRVRSWSgKLSAgICAgIHdyaXRlKGZkLCBicXJfbG9nX2R1bXBfZXZlbnRfLnZlbmRvcl9zcGVjaWZpY19wYXJhbWV0ZXIsIGxlbmd0aCkpOwotICBCdFNjaGVkdWxpbmdUcmFjZUNvdW50ZXIrKzsKLX0KLQotc3RkOjpzdHJpbmcgQnFyVnNlU3ViRXZ0OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8IFF1YWxpdHlSZXBvcnRJZFRvU3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnF1YWxpdHlfcmVwb3J0X2lkKQotICAgICA8PCAiLCBIYW5kbGU6ICIgPDwgbG9naGV4KGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmNvbm5lY3Rpb25faGFuZGxlKQotICAgICA8PCAiLCAiIDw8IFBhY2tldFR5cGVUb1N0cmluZyhicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5wYWNrZXRfdHlwZXMpIDw8ICIsICIKLSAgICAgPDwgKChicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5jb25uZWN0aW9uX3JvbGUgPT0gMCkgPyAiQ2VudHJhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiUGVyaXBoZXJhbCAiKQotICAgICA8PCAiLCBQd0x2OiAiIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnR4X3Bvd2VyX2xldmVsKQotICAgICA8PCAiLCBSU1NJOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnJzc2kpCi0gICAgIDw8ICIsIFNOUjogIiA8PCBzdGQ6OnRvX3N0cmluZyhicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5zbnIpCi0gICAgIDw8ICIsIFVudXNlZENoOiAiCi0gICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnVudXNlZF9hZmhfY2hhbm5lbF9jb3VudCkKLSAgICAgPDwgIiwgVW5pZGVhbENoOiAiCi0gICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmFmaF9zZWxlY3RfdW5pZGVhbF9jaGFubmVsX2NvdW50KQotICAgICA8PCAiLCBSZVR4OiAiCi0gICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnJldHJhbnNtaXNzaW9uX2NvdW50KQotICAgICA8PCAiLCBOb1JYOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLm5vX3J4X2NvdW50KQotICAgICA8PCAiLCBOQUs6ICIgPDwgc3RkOjp0b19zdHJpbmcoYnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ubmFrX2NvdW50KQotICAgICA8PCAiLCBGbG93T2ZmOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKGJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmZsb3dfb2ZmX2NvdW50KQotICAgICA8PCAiLCBPdmVyRmxvdzogIgotICAgICA8PCBzdGQ6OnRvX3N0cmluZyhicXJfbGlua19xdWFsaXR5X2V2ZW50Xy5idWZmZXJfb3ZlcmZsb3dfYnl0ZXMpCi0gICAgIDw8ICIsIFVuZEZsb3c6ICIKLSAgICAgPDwgc3RkOjp0b19zdHJpbmcoYnFyX2xpbmtfcXVhbGl0eV9ldmVudF8uYnVmZmVyX3VuZGVyZmxvd19ieXRlcyk7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotc3RkOjpzdHJpbmcgUXVhbGl0eVJlcG9ydElkVG9TdHJpbmcodWludDhfdCBxdWFsaXR5X3JlcG9ydF9pZCkgewotICBzd2l0Y2ggKHF1YWxpdHlfcmVwb3J0X2lkKSB7Ci0gICAgY2FzZSBRVUFMSVRZX1JFUE9SVF9JRF9NT05JVE9SX01PREU6Ci0gICAgICByZXR1cm4gIk1vbml0b3JpbmcgIjsKLSAgICBjYXNlIFFVQUxJVFlfUkVQT1JUX0lEX0FQUFJPQUNIX0xTVE86Ci0gICAgICByZXR1cm4gIkFwcHJvIExTVE8gIjsKLSAgICBjYXNlIFFVQUxJVFlfUkVQT1JUX0lEX0EyRFBfQVVESU9fQ0hPUFBZOgotICAgICAgcmV0dXJuICJBMkRQIENob3BweSI7Ci0gICAgY2FzZSBRVUFMSVRZX1JFUE9SVF9JRF9TQ09fVk9JQ0VfQ0hPUFBZOgotICAgICAgcmV0dXJuICJTQ08gQ2hvcHB5ICI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiSW52YWxpZCAgICAiOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIFBhY2tldFR5cGVUb1N0cmluZyh1aW50OF90IHBhY2tldF90eXBlKSB7Ci0gIHN3aXRjaCAocGFja2V0X3R5cGUpIHsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFX0lEOgotICAgICAgcmV0dXJuICJJRCI7Ci0gICAgY2FzZSBQQUNLRVRfVFlQRV9OVUxMOgotICAgICAgcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFX1BPTEw6Ci0gICAgICByZXR1cm4gIlBPTEwiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfRkhTOgotICAgICAgcmV0dXJuICJGSFMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfSFYxOgotICAgICAgcmV0dXJuICJIVjEiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfSFYyOgotICAgICAgcmV0dXJuICJIVjIiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfSFYzOgotICAgICAgcmV0dXJuICJIVjMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfRFY6Ci0gICAgICByZXR1cm4gIkRWIjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFX0VWMzoKLSAgICAgIHJldHVybiAiRVYzIjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFX0VWNDoKLSAgICAgIHJldHVybiAiRVY0IjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFX0VWNToKLSAgICAgIHJldHVybiAiRVY1IjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFXzJFVjM6Ci0gICAgICByZXR1cm4gIjJFVjMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfMkVWNToKLSAgICAgIHJldHVybiAiMkVWNSI7Ci0gICAgY2FzZSBQQUNLRVRfVFlQRV8zRVYzOgotICAgICAgcmV0dXJuICIzRVYzIjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFXzNFVjU6Ci0gICAgICByZXR1cm4gIjNFVjUiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfRE0xOgotICAgICAgcmV0dXJuICJETTEiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfREgxOgotICAgICAgcmV0dXJuICJESDEiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfRE0zOgotICAgICAgcmV0dXJuICJETTMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfREgzOgotICAgICAgcmV0dXJuICJESDMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfRE01OgotICAgICAgcmV0dXJuICJETTUiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfREg1OgotICAgICAgcmV0dXJuICJESDUiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfQVVYMToKLSAgICAgIHJldHVybiAiQVVYMSI7Ci0gICAgY2FzZSBQQUNLRVRfVFlQRV8yREgxOgotICAgICAgcmV0dXJuICIyREgxIjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFXzJESDM6Ci0gICAgICByZXR1cm4gIjJESDMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfMkRINToKLSAgICAgIHJldHVybiAiMkRINSI7Ci0gICAgY2FzZSBQQUNLRVRfVFlQRV8zREgxOgotICAgICAgcmV0dXJuICIzREgxIjsKLSAgICBjYXNlIFBBQ0tFVF9UWVBFXzNESDM6Ci0gICAgICByZXR1cm4gIjNESDMiOwotICAgIGNhc2UgUEFDS0VUX1RZUEVfM0RINToKLSAgICAgIHJldHVybiAiM0RINSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5Lbm93biAiOwotICB9Ci19Ci0KLXZvaWQgRW5hYmxlQnRRdWFsaXR5UmVwb3J0KGJvb2wgaXNfZW5hYmxlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBpc19lbmFibGU6ICIgPDwgbG9nYm9vbChpc19lbmFibGUpOwotCi0gIGNoYXIgYnFyX3Byb3BfZXZ0bWFza1tQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICBjaGFyIGJxcl9wcm9wX2ludGVydmFsX21zW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0gIG9zaV9wcm9wZXJ0eV9nZXQoa3BQcm9wZXJ0eUV2ZW50TWFzaywgYnFyX3Byb3BfZXZ0bWFzaywgIiIpOwotICBvc2lfcHJvcGVydHlfZ2V0KGtwUHJvcGVydHlNaW5SZXBvcnRJbnRlcnZhbE1zLCBicXJfcHJvcF9pbnRlcnZhbF9tcywgIiIpOwotCi0gIGlmIChzdHJsZW4oYnFyX3Byb3BfZXZ0bWFzaykgPT0gMCB8fCBzdHJsZW4oYnFyX3Byb3BfaW50ZXJ2YWxfbXMpID09IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0IGlzIGRpc2FibGVkLiIKLSAgICAgICAgICAgICAgICAgPDwgIiBicXJfcHJvcF9ldnRtYXNrOiAiIDw8IGJxcl9wcm9wX2V2dG1hc2sKLSAgICAgICAgICAgICAgICAgPDwgIiwgYnFyX3Byb3BfaW50ZXJ2YWxfbXM6ICIgPDwgYnFyX3Byb3BfaW50ZXJ2YWxfbXM7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQnFyQ29uZmlndXJhdGlvbiBicXJfY29uZmlnID0ge307Ci0KLSAgaWYgKGlzX2VuYWJsZSkgewotICAgIGJxcl9jb25maWcucmVwb3J0X2FjdGlvbiA9IFJFUE9SVF9BQ1RJT05fQUREOwotICAgIGJxcl9jb25maWcucXVhbGl0eV9ldmVudF9tYXNrID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0b2koYnFyX3Byb3BfZXZ0bWFzaykpOwotICAgIGJxcl9jb25maWcubWluaW11bV9yZXBvcnRfaW50ZXJ2YWxfbXMgPQotICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYXRvaShicXJfcHJvcF9pbnRlcnZhbF9tcykpOwotICB9IGVsc2UgewotICAgIGJxcl9jb25maWcucmVwb3J0X2FjdGlvbiA9IFJFUE9SVF9BQ1RJT05fQ0xFQVI7Ci0gICAgYnFyX2NvbmZpZy5xdWFsaXR5X2V2ZW50X21hc2sgPSBrUXVhbGl0eUV2ZW50TWFza0FsbE9mZjsKLSAgICBicXJfY29uZmlnLm1pbmltdW1fcmVwb3J0X2ludGVydmFsX21zID0ga01pblJlcG9ydEludGVydmFsTm9MaW1pdDsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgPDwgIjogRXZlbnQgTWFzazogIiA8PCBsb2doZXgoYnFyX2NvbmZpZy5xdWFsaXR5X2V2ZW50X21hc2spCi0gICAgICAgICAgICA8PCAiLCBJbnRlcnZhbDogIiA8PCBicXJfY29uZmlnLm1pbmltdW1fcmVwb3J0X2ludGVydmFsX21zOwotICBDb25maWd1cmVCcXIoYnFyX2NvbmZpZyk7Ci19Ci0KLXZvaWQgQ29uZmlndXJlQnFyKGNvbnN0IEJxckNvbmZpZ3VyYXRpb24mIGJxcl9jb25maWcpIHsKLSAgaWYgKGJxcl9jb25maWcucmVwb3J0X2FjdGlvbiA+IFJFUE9SVF9BQ1RJT05fQ0xFQVIgfHwKLSAgICAgIGJxcl9jb25maWcucXVhbGl0eV9ldmVudF9tYXNrID4ga1F1YWxpdHlFdmVudE1hc2tBbGwgfHwKLSAgICAgIGJxcl9jb25maWcubWluaW11bV9yZXBvcnRfaW50ZXJ2YWxfbXMgPiBrTWluUmVwb3J0SW50ZXJ2YWxNYXhNcykgewotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIjogSW52YWxpZCBQYXJhbWV0ZXIiCi0gICAgICAgICAgICAgICA8PCAiLCBBY3Rpb246ICIgPDwgYnFyX2NvbmZpZy5yZXBvcnRfYWN0aW9uCi0gICAgICAgICAgICAgICA8PCAiLCBNYXNrOiAiIDw8IGxvZ2hleChicXJfY29uZmlnLnF1YWxpdHlfZXZlbnRfbWFzaykKLSAgICAgICAgICAgICAgIDw8ICIsIEludGVydmFsOiAiIDw8IGJxcl9jb25maWcubWluaW11bV9yZXBvcnRfaW50ZXJ2YWxfbXM7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEFjdGlvbjogIgotICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJxcl9jb25maWcucmVwb3J0X2FjdGlvbikpCi0gICAgICAgICAgICA8PCAiLCBNYXNrOiAiIDw8IGxvZ2hleChicXJfY29uZmlnLnF1YWxpdHlfZXZlbnRfbWFzaykKLSAgICAgICAgICAgIDw8ICIsIEludGVydmFsOiAiIDw8IGJxcl9jb25maWcubWluaW11bV9yZXBvcnRfaW50ZXJ2YWxfbXM7Ci0KLSAgdWludDhfdCBwYXJhbVtzaXplb2YoQnFyQ29uZmlndXJhdGlvbildOwotICB1aW50OF90KiBwX3BhcmFtID0gcGFyYW07Ci0gIFVJTlQ4X1RPX1NUUkVBTShwX3BhcmFtLCBicXJfY29uZmlnLnJlcG9ydF9hY3Rpb24pOwotICBVSU5UMzJfVE9fU1RSRUFNKHBfcGFyYW0sIGJxcl9jb25maWcucXVhbGl0eV9ldmVudF9tYXNrKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwX3BhcmFtLCBicXJfY29uZmlnLm1pbmltdW1fcmVwb3J0X2ludGVydmFsX21zKTsKLQotICBCVE1fVmVuZG9yU3BlY2lmaWNDb21tYW5kKEhDSV9DT05UUk9MTEVSX0JRUiwgcF9wYXJhbSAtIHBhcmFtLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcXJWc2NDb21wbGV0ZUNhbGxiYWNrKTsKLX0KLQotdm9pZCBCcXJWc2NDb21wbGV0ZUNhbGxiYWNrKHRCVE1fVlNDX0NNUEwqIHBfdnNjX2NtcGxfcGFyYW1zKSB7Ci0gIGlmIChwX3ZzY19jbXBsX3BhcmFtcy0+cGFyYW1fbGVuIDwgMSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVGhlIGxlbmd0aCBvZiByZXR1cm5lZCBwYXJhbWV0ZXJzIGlzIGxlc3MgdGhhbiAxIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90KiBwX2V2ZW50X3BhcmFtX2J1ZiA9IHBfdnNjX2NtcGxfcGFyYW1zLT5wX3BhcmFtX2J1ZjsKLSAgdWludDhfdCBzdGF0dXMgPSAweGZmOwotICAvLyBbUmV0dXJuIFBhcmFtZXRlcl0gICAgICAgICB8IFtTaXplXSAgIHwgW1B1cnBvc2VdCi0gIC8vIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgIHwgMSBvY3RldCAgfCBDb21tYW5kIGNvbXBsZXRlIHN0YXR1cwotICAvLyBDdXJyZW50X1F1YWxpdHlfRXZlbnRfTWFzayB8IDQgb2N0ZXRzIHwgSW5kaWNhdGVzIGN1cnJlbnQgYml0IG1hc2sgc2V0dGluZwotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwX2V2ZW50X3BhcmFtX2J1Zik7Ci0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEZhaWwgdG8gY29uZmlndXJlIEJRUi4gc3RhdHVzOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3ZzY19jbXBsX3BhcmFtcy0+cGFyYW1fbGVuICE9IDUpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBUaGUgbGVuZ3RoIG9mIHJldHVybmVkIHBhcmFtZXRlcnMgaXMgbm90IGVxdWFsIHRvIDU6ICIKLSAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKHBfdnNjX2NtcGxfcGFyYW1zLT5wYXJhbV9sZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQzMl90IGN1cnJlbnRfcXVhbGl0eV9ldmVudF9tYXNrID0ga1F1YWxpdHlFdmVudE1hc2tBbGxPZmY7Ci0gIFNUUkVBTV9UT19VSU5UMzIoY3VycmVudF9xdWFsaXR5X2V2ZW50X21hc2ssIHBfZXZlbnRfcGFyYW1fYnVmKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICIsIGN1cnJlbnQgZXZlbnQgbWFzazogIiA8PCBsb2doZXgoY3VycmVudF9xdWFsaXR5X2V2ZW50X21hc2spOwotICBDb25maWd1cmVCcXJDbXBsKGN1cnJlbnRfcXVhbGl0eV9ldmVudF9tYXNrKTsKLX0KLQotdm9pZCBDb25maWd1cmVCcXJDbXBsKHVpbnQzMl90IGN1cnJlbnRfZXZ0X21hc2spIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGN1cnJlbnRfZXZ0X21hc2s6ICIgPDwgbG9naGV4KGN1cnJlbnRfZXZ0X21hc2spOwotICAvLyAoVW4pUmVnaXN0ZXIgZm9yIFZTRSBvZiBCbHVldG9vdGggUXVhbGl0eSBSZXBvcnQgc3ViIGV2ZW50Ci0gIHRCVE1fU1RBVFVTIGJ0bV9zdGF0dXMgPSBCVE1fQlRfUXVhbGl0eV9SZXBvcnRfVlNFX1JlZ2lzdGVyKAotICAgICAgY3VycmVudF9ldnRfbWFzayA+IGtRdWFsaXR5RXZlbnRNYXNrQWxsT2ZmLCBDYXRlZ29yaXplQnFyRXZlbnQpOwotCi0gIGlmIChidG1fc3RhdHVzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBGYWlsIHRvICh1bilyZWdpc3RlciBWU0Ugb2YgQlFSIHN1YiBldmVudC4iCi0gICAgICAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBidG1fc3RhdHVzOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChMbXBMbE1lc3NhZ2VUcmFjZUxvZ0ZkICE9IElOVkFMSURfRkQgJiYKLSAgICAgIChjdXJyZW50X2V2dF9tYXNrICYga1F1YWxpdHlFdmVudE1hc2tMbXBNZXNzYWdlVHJhY2UpID09IDApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQ2xvc2luZyBMTVAvTEwgbG9nIGZpbGUuIjsKLSAgICBjbG9zZShMbXBMbE1lc3NhZ2VUcmFjZUxvZ0ZkKTsKLSAgICBMbXBMbE1lc3NhZ2VUcmFjZUxvZ0ZkID0gSU5WQUxJRF9GRDsKLSAgfQotICBpZiAoQnRTY2hlZHVsaW5nVHJhY2VMb2dGZCAhPSBJTlZBTElEX0ZEICYmCi0gICAgICAoY3VycmVudF9ldnRfbWFzayAmIGtRdWFsaXR5RXZlbnRNYXNrQnRTY2hlZHVsaW5nVHJhY2UpID09IDApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQ2xvc2luZyBTY2hlZHVsaW5nIGxvZyBmaWxlLiI7Ci0gICAgY2xvc2UoQnRTY2hlZHVsaW5nVHJhY2VMb2dGZCk7Ci0gICAgQnRTY2hlZHVsaW5nVHJhY2VMb2dGZCA9IElOVkFMSURfRkQ7Ci0gIH0KLX0KLQotdm9pZCBDYXRlZ29yaXplQnFyRXZlbnQodWludDhfdCBsZW5ndGgsIHVpbnQ4X3QqIHBfYnFyX2V2ZW50KSB7Ci0gIGlmIChsZW5ndGggPT0gMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBMZW5ndGhzIG9mIGFsbCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgemVyby4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgcXVhbGl0eV9yZXBvcnRfaWQgPSBwX2Jxcl9ldmVudFswXTsKLSAgc3dpdGNoIChxdWFsaXR5X3JlcG9ydF9pZCkgewotICAgIGNhc2UgUVVBTElUWV9SRVBPUlRfSURfTU9OSVRPUl9NT0RFOgotICAgIGNhc2UgUVVBTElUWV9SRVBPUlRfSURfQVBQUk9BQ0hfTFNUTzoKLSAgICBjYXNlIFFVQUxJVFlfUkVQT1JUX0lEX0EyRFBfQVVESU9fQ0hPUFBZOgotICAgIGNhc2UgUVVBTElUWV9SRVBPUlRfSURfU0NPX1ZPSUNFX0NIT1BQWToKLSAgICAgIGlmIChsZW5ndGggPCBrTGlua1F1YWxpdHlQYXJhbVRvdGFsTGVuKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBQYXJhbWV0ZXIgdG90YWwgbGVuZ3RoOiAiIDw8IHN0ZDo6dG9fc3RyaW5nKGxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICA8PCAiIGlzIGFibm9ybWFsLiBJdCBzaGFsbCBiZSBub3Qgc2hvcnRlciB0aGFuOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RkOjp0b19zdHJpbmcoa0xpbmtRdWFsaXR5UGFyYW1Ub3RhbExlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgQWRkTGlua1F1YWxpdHlFdmVudFRvUXVldWUobGVuZ3RoLCBwX2Jxcl9ldmVudCk7Ci0gICAgICBicmVhazsKLQotICAgIC8vIFRoZSBSb290IEluZmxhbW1hdGlvbiBhbmQgTG9nIER1bXAgcmVsYXRlZCBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBhbmQKLSAgICAvLyBpbnRlcmNlcHRlZCBhbHJlYWR5LgotICAgIGNhc2UgUVVBTElUWV9SRVBPUlRfSURfUk9PVF9JTkZMQU1NQVRJT046Ci0gICAgY2FzZSBRVUFMSVRZX1JFUE9SVF9JRF9MTVBfTExfTUVTU0FHRV9UUkFDRToKLSAgICBjYXNlIFFVQUxJVFlfUkVQT1JUX0lEX0JUX1NDSEVEVUxJTkdfVFJBQ0U6Ci0gICAgY2FzZSBRVUFMSVRZX1JFUE9SVF9JRF9DT05UUk9MTEVSX0RCR19JTkZPOgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogVW5leHBlY3RlZCBJRDogIiA8PCBsb2doZXgocXVhbGl0eV9yZXBvcnRfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFVua25vd24gSUQ6ICIgPDwgbG9naGV4KHF1YWxpdHlfcmVwb3J0X2lkKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQWRkTGlua1F1YWxpdHlFdmVudFRvUXVldWUodWludDhfdCBsZW5ndGgsIHVpbnQ4X3QqIHBfbGlua19xdWFsaXR5X2V2ZW50KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCcXJWc2VTdWJFdnQ+IHBfYnFyX2V2ZW50ID0gc3RkOjptYWtlX3VuaXF1ZTxCcXJWc2VTdWJFdnQ+KCk7Ci0gIHBfYnFyX2V2ZW50LT5QYXJzZUJxckxpbmtRdWFsaXR5RXZ0KGxlbmd0aCwgcF9saW5rX3F1YWxpdHlfZXZlbnQpOwotCi0gIExPRyhXQVJOSU5HKSA8PCAqcF9icXJfZXZlbnQ7Ci0gIGludm9rZV9saW5rX3F1YWxpdHlfcmVwb3J0X2NiKAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCksCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ucXVhbGl0eV9yZXBvcnRfaWQsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ucnNzaSwKLSAgICAgIHBfYnFyX2V2ZW50LT5icXJfbGlua19xdWFsaXR5X2V2ZW50Xy5zbnIsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ucmV0cmFuc21pc3Npb25fY291bnQsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ubm9fcnhfY291bnQsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ubmFrX2NvdW50KTsKLQotI2lmZGVmIE9TX0FORFJPSUQKLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX1FVQUxJVFlfUkVQT1JUX1JFUE9SVEVELAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnF1YWxpdHlfcmVwb3J0X2lkLAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnBhY2tldF90eXBlcywKLSAgICAgIHBfYnFyX2V2ZW50LT5icXJfbGlua19xdWFsaXR5X2V2ZW50Xy5jb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgIHBfYnFyX2V2ZW50LT5icXJfbGlua19xdWFsaXR5X2V2ZW50Xy5jb25uZWN0aW9uX3JvbGUsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8udHhfcG93ZXJfbGV2ZWwsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ucnNzaSwKLSAgICAgIHBfYnFyX2V2ZW50LT5icXJfbGlua19xdWFsaXR5X2V2ZW50Xy5zbnIsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8udW51c2VkX2FmaF9jaGFubmVsX2NvdW50LAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmFmaF9zZWxlY3RfdW5pZGVhbF9jaGFubmVsX2NvdW50LAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLmxzdG8sCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8uY29ubmVjdGlvbl9waWNvbmV0X2Nsb2NrLAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnJldHJhbnNtaXNzaW9uX2NvdW50LAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLm5vX3J4X2NvdW50LAotICAgICAgcF9icXJfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLm5ha19jb3VudCwKLSAgICAgIHBfYnFyX2V2ZW50LT5icXJfbGlua19xdWFsaXR5X2V2ZW50Xy5sYXN0X3R4X2Fja190aW1lc3RhbXAsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8uZmxvd19vZmZfY291bnQsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8ubGFzdF9mbG93X29uX3RpbWVzdGFtcCwKLSAgICAgIHBfYnFyX2V2ZW50LT5icXJfbGlua19xdWFsaXR5X2V2ZW50Xy5idWZmZXJfb3ZlcmZsb3dfYnl0ZXMsCi0gICAgICBwX2Jxcl9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8uYnVmZmVyX3VuZGVyZmxvd19ieXRlcyk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBsb2cgQlFSIGV2ZW50IHRvIHN0YXRzZCwgZXJyb3IgIgotICAgICAgICAgICAgICAgICA8PCByZXQ7Ci0gIH0KLSNlbHNlCi0gIC8vIFRPRE8oYWJwcykgTWV0cmljcyBmb3Igbm9uLUFuZHJvaWQgYnVpbGQKLSNlbmRpZgotICBrcEJxckV2ZW50UXVldWUtPkVucXVldWUocF9icXJfZXZlbnQucmVsZWFzZSgpKTsKLX0KLQotdm9pZCBEdW1wTG1wTGxNZXNzYWdlKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX2xtcF9sbF9tZXNzYWdlX2V2ZW50KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCcXJWc2VTdWJFdnQ+IHBfYnFyX2V2ZW50ID0gc3RkOjptYWtlX3VuaXF1ZTxCcXJWc2VTdWJFdnQ+KCk7Ci0KLSAgaWYgKExtcExsTWVzc2FnZVRyYWNlTG9nRmQgPT0gSU5WQUxJRF9GRCB8fAotICAgICAgTG1wTGxNZXNzYWdlVHJhY2VDb3VudGVyID49IGtMb2dEdW1wRXZlbnRQZXJGaWxlKSB7Ci0gICAgTG1wTGxNZXNzYWdlVHJhY2VMb2dGZCA9IE9wZW5MbXBMbFRyYWNlTG9nRmlsZSgpOwotICB9Ci0gIGlmIChMbXBMbE1lc3NhZ2VUcmFjZUxvZ0ZkICE9IElOVkFMSURfRkQpIHsKLSAgICBwX2Jxcl9ldmVudC0+V3JpdGVMbXBMbFRyYWNlTG9nRmlsZShMbXBMbE1lc3NhZ2VUcmFjZUxvZ0ZkLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9sbXBfbGxfbWVzc2FnZV9ldmVudCk7Ci0gIH0KLX0KLQotaW50IE9wZW5MbXBMbFRyYWNlTG9nRmlsZSgpIHsKLSAgaWYgKHJlbmFtZShrcExtcExsTWVzc2FnZVRyYWNlTG9nUGF0aCwga3BMbXBMbE1lc3NhZ2VUcmFjZUxhc3RMb2dQYXRoKSAhPSAwICYmCi0gICAgICBlcnJubyAhPSBFTk9FTlQpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFVuYWJsZSB0byByZW5hbWUgJyIKLSAgICAgICAgICAgICAgIDw8IGtwTG1wTGxNZXNzYWdlVHJhY2VMb2dQYXRoIDw8ICInIHRvICciCi0gICAgICAgICAgICAgICA8PCBrcExtcExsTWVzc2FnZVRyYWNlTGFzdExvZ1BhdGggPDwgIicgOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfQotCi0gIG1vZGVfdCBwcmV2bWFzayA9IHVtYXNrKDApOwotICBpbnQgbG9nZmlsZV9mZCA9Ci0gICAgICBvcGVuKGtwTG1wTGxNZXNzYWdlVHJhY2VMb2dQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCk7Ci0gIHVtYXNrKHByZXZtYXNrKTsKLSAgaWYgKGxvZ2ZpbGVfZmQgPT0gSU5WQUxJRF9GRCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5hYmxlIHRvIG9wZW4gJyIgPDwga3BMbXBMbE1lc3NhZ2VUcmFjZUxvZ1BhdGgKLSAgICAgICAgICAgICAgIDw8ICInIDogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gIH0gZWxzZSB7Ci0gICAgTG1wTGxNZXNzYWdlVHJhY2VDb3VudGVyID0gMDsKLSAgfQotICByZXR1cm4gbG9nZmlsZV9mZDsKLX0KLQotdm9pZCBEdW1wQnRTY2hlZHVsaW5nKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX2J0X3NjaGVkdWxpbmdfZXZlbnQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPEJxclZzZVN1YkV2dD4gcF9icXJfZXZlbnQgPSBzdGQ6Om1ha2VfdW5pcXVlPEJxclZzZVN1YkV2dD4oKTsKLQotICBpZiAoQnRTY2hlZHVsaW5nVHJhY2VMb2dGZCA9PSBJTlZBTElEX0ZEIHx8Ci0gICAgICBCdFNjaGVkdWxpbmdUcmFjZUNvdW50ZXIgPT0ga0xvZ0R1bXBFdmVudFBlckZpbGUpIHsKLSAgICBCdFNjaGVkdWxpbmdUcmFjZUxvZ0ZkID0gT3BlbkJ0U2NoZWR1bGluZ1RyYWNlTG9nRmlsZSgpOwotICB9Ci0gIGlmIChCdFNjaGVkdWxpbmdUcmFjZUxvZ0ZkICE9IElOVkFMSURfRkQpIHsKLSAgICBwX2Jxcl9ldmVudC0+V3JpdGVCdFNjaGVkdWxpbmdUcmFjZUxvZ0ZpbGUoQnRTY2hlZHVsaW5nVHJhY2VMb2dGZCwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J0X3NjaGVkdWxpbmdfZXZlbnQpOwotICB9Ci19Ci0KLWludCBPcGVuQnRTY2hlZHVsaW5nVHJhY2VMb2dGaWxlKCkgewotICBpZiAocmVuYW1lKGtwQnRTY2hlZHVsaW5nVHJhY2VMb2dQYXRoLCBrcEJ0U2NoZWR1bGluZ1RyYWNlTGFzdExvZ1BhdGgpICE9IDAgJiYKLSAgICAgIGVycm5vICE9IEVOT0VOVCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5hYmxlIHRvIHJlbmFtZSAnIgotICAgICAgICAgICAgICAgPDwga3BCdFNjaGVkdWxpbmdUcmFjZUxvZ1BhdGggPDwgIicgdG8gJyIKLSAgICAgICAgICAgICAgIDw8IGtwQnRTY2hlZHVsaW5nVHJhY2VMYXN0TG9nUGF0aCA8PCAiJyA6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICB9Ci0KLSAgbW9kZV90IHByZXZtYXNrID0gdW1hc2soMCk7Ci0gIGludCBsb2dmaWxlX2ZkID0KLSAgICAgIG9wZW4oa3BCdFNjaGVkdWxpbmdUcmFjZUxvZ1BhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCi0gICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIKTsKLSAgdW1hc2socHJldm1hc2spOwotICBpZiAobG9nZmlsZV9mZCA9PSBJTlZBTElEX0ZEKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmFibGUgdG8gb3BlbiAnIiA8PCBrcEJ0U2NoZWR1bGluZ1RyYWNlTG9nUGF0aAotICAgICAgICAgICAgICAgPDwgIicgOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfSBlbHNlIHsKLSAgICBCdFNjaGVkdWxpbmdUcmFjZUNvdW50ZXIgPSAwOwotICB9Ci0gIHJldHVybiBsb2dmaWxlX2ZkOwotfQotCi12b2lkIERlYnVnRHVtcChpbnQgZmQpIHsKLSAgZHByaW50ZihmZCwgIlxuQlQgUXVhbGl0eSBSZXBvcnQgRXZlbnRzOiBcbiIpOwotCi0gIGlmIChrcEJxckV2ZW50UXVldWUtPkVtcHR5KCkpIHsKLSAgICBkcHJpbnRmKGZkLCAiRXZlbnQgcXVldWUgaXMgZW1wdHkuXG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB3aGlsZSAoIWtwQnFyRXZlbnRRdWV1ZS0+RW1wdHkoKSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxCcXJWc2VTdWJFdnQ+IHBfZXZlbnQoa3BCcXJFdmVudFF1ZXVlLT5EZXF1ZXVlKCkpOwotCi0gICAgYm9vbCB3YXJuaW5nID0gKHBfZXZlbnQtPmJxcl9saW5rX3F1YWxpdHlfZXZlbnRfLnJzc2kgPCBrQ3JpV2FyblJzc2kgfHwKLSAgICAgICAgICAgICAgICAgICAgcF9ldmVudC0+YnFyX2xpbmtfcXVhbGl0eV9ldmVudF8udW51c2VkX2FmaF9jaGFubmVsX2NvdW50ID4KLSAgICAgICAgICAgICAgICAgICAgICAgIGtDcmlXYXJuVW51c2VkQ2gpOwotCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3NfdGltZXN0YW1wOwotICAgIHNzX3RpbWVzdGFtcCA8PCBzdGQ6OnB1dF90aW1lKCZwX2V2ZW50LT50bV90aW1lc3RhbXBfLCAiJW0tJWQgJUg6JU06JVMiKTsKLQotICAgIGRwcmludGYoZmQsICIlYyAgJXMgJXNcbiIsIHdhcm5pbmcgPyAnKicgOiAnICcsIHNzX3RpbWVzdGFtcC5zdHIoKS5jX3N0cigpLAotICAgICAgICAgICAgcF9ldmVudC0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotCi0gIGRwcmludGYoZmQsICJcbiIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYnFyCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2NvbmZpZy5jYyBiL2J0aWYvc3JjL2J0aWZfY29uZmlnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRiZGIxLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2NvbmZpZyIKLQotI2luY2x1ZGUgImJ0aWZfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjdGltZT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWdfY2FjaGUuaCIKLSNpbmNsdWRlICJidGlmX2NvbmZpZ190cmFuc2NvZGUuaCIKLSNpbmNsdWRlICJidGlmX2tleXN0b3JlLmgiCi0jaW5jbHVkZSAiYnRpZl9tZXRyaWNzX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJjb21tb24vYWRkcmVzc19vYmZ1c2NhdG9yLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY19pZF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vY29uZmlnLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJyYXdfYWRkcmVzcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0KLSNkZWZpbmUgQlRfQ09ORklHX1NPVVJDRV9UQUdfTlVNIDEwMTAwMDEKLSNkZWZpbmUgVEVNUE9SQVJZX1NFQ1RJT05fQ0FQQUNJVFkgMTAwMDAKLQotI2RlZmluZSBJTkZPX1NFQ1RJT04gIkluZm8iCi0jZGVmaW5lIEZJTEVfVElNRVNUQU1QICJUaW1lQ3JlYXRlZCIKLSNkZWZpbmUgRklMRV9TT1VSQ0UgIkZpbGVTb3VyY2UiCi0jZGVmaW5lIFRJTUVfU1RSSU5HX0xFTkdUSCBzaXplb2YoIllZWVktTU0tREQgSEg6TU06U1MiKQotI2RlZmluZSBESVNBQkxFRCAiZGlzYWJsZWQiCi1zdGF0aWMgY29uc3QgY2hhciogVElNRV9TVFJJTkdfRk9STUFUID0gIiVZLSVtLSVkICVIOiVNOiVTIjsKLQotI2RlZmluZSBCVF9DT05GSUdfTUVUUklDU19TRUNUSU9OICJNZXRyaWNzIgotI2RlZmluZSBCVF9DT05GSUdfTUVUUklDU19TQUxUXzI1NkJJVCAiU2FsdDI1NkJpdCIKLSNkZWZpbmUgQlRfQ09ORklHX01FVFJJQ1NfSURfS0VZICJNZXRyaWNzSWQiCi0KLXVzaW5nIGJsdWV0b290aDo6Ymx1ZXRvb3RoX2tleXN0b3JlOjpCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpBZGRyZXNzT2JmdXNjYXRvcjsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpNZXRyaWNJZEFsbG9jYXRvcjsKLQotLy8gVE9ETyhhcm1hbnNpdG8pOiBGaW5kIGEgYmV0dGVyIHdheSB0aGFuIHNlYXJjaGluZyBieSBhIGhhcmRjb2RlZCBwYXRoLgotI2lmIGRlZmluZWQoVEFSR0VUX0ZMT1NTKQotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19GSUxFX1BBVEggPSAiL3Zhci9saWIvYmx1ZXRvb3RoL2J0X2NvbmZpZy5jb25mIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfQkFDS1VQX1BBVEggPSAiL3Zhci9saWIvYmx1ZXRvb3RoL2J0X2NvbmZpZy5iYWsiOwotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19MRUdBQ1lfRklMRV9QQVRIID0gIi92YXIvbGliL2JsdWV0b290aC9idF9jb25maWcueG1sIjsKLSNlbGlmIGRlZmluZWQoT1NfR0VORVJJQykKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfRklMRV9QQVRIID0gImJ0X2NvbmZpZy5jb25mIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfQkFDS1VQX1BBVEggPSAiYnRfY29uZmlnLmJhayI7Ci1zdGF0aWMgY29uc3QgY2hhciogQ09ORklHX0xFR0FDWV9GSUxFX1BBVEggPSAiYnRfY29uZmlnLnhtbCI7Ci0jZWxzZSAgIC8vICFkZWZpbmVkKE9TX0dFTkVSSUMpCi1zdGF0aWMgY29uc3QgY2hhciogQ09ORklHX0ZJTEVfUEFUSCA9ICIvZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuY29uZiI7Ci1zdGF0aWMgY29uc3QgY2hhciogQ09ORklHX0JBQ0tVUF9QQVRIID0gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5iYWsiOwotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19MRUdBQ1lfRklMRV9QQVRIID0KLSAgICAiL2RhdGEvbWlzYy9ibHVlZHJvaWQvYnRfY29uZmlnLnhtbCI7Ci0jZW5kaWYgIC8vIGRlZmluZWQoT1NfR0VORVJJQykKLXN0YXRpYyBjb25zdCB1aW50NjRfdCBDT05GSUdfU0VUVExFX1BFUklPRF9NUyA9IDMwMDA7Ci0KLXN0YXRpYyB2b2lkIHRpbWVyX2NvbmZpZ19zYXZlX2NiKHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRpZl9jb25maWdfd3JpdGUodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pOwotc3RhdGljIGJvb2wgaXNfZmFjdG9yeV9yZXNldCh2b2lkKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV9jb25maWdfZmlsZXModm9pZCk7Ci1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBidGlmX2NvbmZpZ19vcGVuKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotLy8gS2V5IGF0dGVzdGF0aW9uCi1zdGF0aWMgYm9vbCBjb25maWdfY2hlY2tzdW1fcGFzcyhpbnQgY2hlY2tfYml0KSB7Ci0gIHJldHVybiAoKGdldF9jb21tb25fY3JpdGVyaWFfY29uZmlnX2NvbXBhcmVfcmVzdWx0KCkgJiBjaGVja19iaXQpID09Ci0gICAgICAgICAgY2hlY2tfYml0KTsKLX0KLXN0YXRpYyBib29sIGJ0aWZfaW5fZW5jcnlwdF9rZXlfbmFtZV9saXN0KHN0ZDo6c3RyaW5nIGtleSk7Ci0KLXN0YXRpYyBjb25zdCBpbnQgQ09ORklHX0ZJTEVfQ09NUEFSRV9QQVNTID0gMTsKLXN0YXRpYyBjb25zdCBpbnQgQ09ORklHX0JBQ0tVUF9DT01QQVJFX1BBU1MgPSAyOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIEVOQ1JZUFRFRF9TVFIgPSAiZW5jcnlwdGVkIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBDT05GSUdfRklMRV9QUkVGSVggPSAiYnRfY29uZmlnLW9yaWdpbiI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgQ09ORklHX0ZJTEVfSEFTSCA9ICJoYXNoIjsKLXN0YXRpYyBjb25zdCBpbnQgRU5DUllQVF9LRVlfTkFNRV9MSVNUX1NJWkUgPSA3Owotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGVuY3J5cHRfa2V5X25hbWVfbGlzdFtdID0gewotICAgICJMaW5rS2V5IiwgICAgICAiTEVfS0VZX1BFTkMiLCAiTEVfS0VZX1BJRCIsICAiTEVfS0VZX0xJRCIsCi0gICAgIkxFX0tFWV9QQ1NSSyIsICJMRV9LRVlfTEVOQyIsICJMRV9LRVlfTENTUksifTsKLQotc3RhdGljIGVudW0gQ29uZmlnU291cmNlIHsKLSAgTk9UX0xPQURFRCwKLSAgT1JJR0lOQUwsCi0gIEJBQ0tVUCwKLSAgTEVHQUNZLAotICBORVdfRklMRSwKLSAgUkVTRVQKLX0gYnRpZl9jb25maWdfc291cmNlID0gTk9UX0xPQURFRDsKLQotc3RhdGljIGNoYXIgYnRpZl9jb25maWdfdGltZV9jcmVhdGVkW1RJTUVfU1RSSU5HX0xFTkdUSF07Ci0KLXN0YXRpYyBCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSogZ2V0X2JsdWV0b290aF9rZXlzdG9yZV9pbnRlcmZhY2UoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmJsdWV0b290aF9rZXlzdG9yZTo6Z2V0Qmx1ZXRvb3RoS2V5c3RvcmVJbnRlcmZhY2UoKTsKLX0KLQotLy8gVE9ETyh6YWNob3ZlcmZsb3cpOiBNb3ZlIHRoZXNlIHR3byBmdW5jdGlvbnMgb3V0LCBiZWNhdXNlIHRoZXkgYXJlIHRvbwotLy8gc3BlY2lmaWMgZm9yIHRoaXMgZmlsZQotLy8ge2dydW1weS1jYXQvbm8sIG1vbnR5LXB5dGhvbi95b3UtbWFrZS1tZS1zYWR9Ci1ib29sIGJ0aWZfZ2V0X2RldmljZV90eXBlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50KiBwX2RldmljZV90eXBlKSB7Ci0gIGlmIChwX2RldmljZV90eXBlID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OnN0cmluZyBhZGRyc3RyID0gYmRhLlRvU3RyaW5nKCk7Ci0gIGNvbnN0IGNoYXIqIGJkX2FkZHJfc3RyID0gYWRkcnN0ci5jX3N0cigpOwotCi0gIGlmICghYnRpZl9jb25maWdfZ2V0X2ludChiZF9hZGRyX3N0ciwgIkRldlR5cGUiLCBwX2RldmljZV90eXBlKSkgcmV0dXJuIGZhbHNlOwotCi0gIExPR19JTkZPKCJEZXZpY2UgWyVzXSBkZXZpY2UgdHlwZSAlZCIsIGJkX2FkZHJfc3RyLCAqcF9kZXZpY2VfdHlwZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfZ2V0X2FkZHJlc3NfdHlwZShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBpZiAocF9hZGRyX3R5cGUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSBiZGEuVG9TdHJpbmcoKTsKLSAgY29uc3QgY2hhciogYmRfYWRkcl9zdHIgPSBhZGRyc3RyLmNfc3RyKCk7Ci0KLSAgaW50IHZhbCA9IDA7Ci0gIGlmICghYnRpZl9jb25maWdfZ2V0X2ludChiZF9hZGRyX3N0ciwgIkFkZHJUeXBlIiwgJnZhbCkpIHJldHVybiBmYWxzZTsKLSAgKnBfYWRkcl90eXBlID0gc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KHZhbCk7Ci0KLSAgTE9HX0RFQlVHKCJEZXZpY2UgWyVzXSBhZGRyZXNzIHR5cGUgJXMiLCBiZF9hZGRyX3N0ciwKLSAgICAgICAgICAgIEFkZHJlc3NUeXBlVGV4dCgqcF9hZGRyX3R5cGUpLmNfc3RyKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBSZWFkIG1ldHJpY3Mgc2FsdCBmcm9tIGNvbmZpZyBmaWxlLCBpZiBzYWx0IGlzIGludmFsaWQgb3IgZG9lcyBub3QgZXhpc3QsCi0gKiBnZW5lcmF0ZSBuZXcgb25lIGFuZCBzYXZlIGl0IHRvIGNvbmZpZwotICovCi1zdGF0aWMgdm9pZCByZWFkX29yX3NldF9tZXRyaWNzX3NhbHQoKSB7Ci0gIEFkZHJlc3NPYmZ1c2NhdG9yOjpPY3RldDMyIG1ldHJpY3Nfc2FsdCA9IHt9OwotICBzaXplX3QgbWV0cmljc19zYWx0X2xlbmd0aCA9IG1ldHJpY3Nfc2FsdC5zaXplKCk7Ci0gIGlmICghYnRpZl9jb25maWdfZ2V0X2JpbihCVF9DT05GSUdfTUVUUklDU19TRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfQ09ORklHX01FVFJJQ1NfU0FMVF8yNTZCSVQsIG1ldHJpY3Nfc2FsdC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0cmljc19zYWx0X2xlbmd0aCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogRmFpbGVkIHRvIHJlYWQgbWV0cmljcyBzYWx0IGZyb20gY29uZmlnIjsKLSAgICAvLyBJbnZhbGlkYXRlIHNhbHQKLSAgICBtZXRyaWNzX3NhbHQuZmlsbCgwKTsKLSAgfQotICBpZiAobWV0cmljc19zYWx0X2xlbmd0aCAhPSBtZXRyaWNzX3NhbHQuc2l6ZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBNZXRyaWNzIHNhbHQgbGVuZ3RoIGluY29ycmVjdCwgIgotICAgICAgICAgICAgICAgPDwgbWV0cmljc19zYWx0X2xlbmd0aCA8PCAiIGluc3RlYWQgb2YgIiA8PCBtZXRyaWNzX3NhbHQuc2l6ZSgpOwotICAgIC8vIEludmFsaWRhdGUgc2FsdAotICAgIG1ldHJpY3Nfc2FsdC5maWxsKDApOwotICB9Ci0gIGlmICghQWRkcmVzc09iZnVzY2F0b3I6OklzU2FsdFZhbGlkKG1ldHJpY3Nfc2FsdCkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogTWV0cmljcyBzYWx0IGlzIG5vdCBpbnZhbGlkLCBjcmVhdGluZyBuZXcgb25lIjsKLSAgICBpZiAoUkFORF9ieXRlcyhtZXRyaWNzX3NhbHQuZGF0YSgpLCBtZXRyaWNzX3NhbHQuc2l6ZSgpKSAhPSAxKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICJGYWlsZWQgdG8gZ2VuZXJhdGUgc2FsdCBmb3IgbWV0cmljcyI7Ci0gICAgfQotICAgIGlmICghYnRpZl9jb25maWdfc2V0X2JpbihCVF9DT05GSUdfTUVUUklDU19TRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9DT05GSUdfTUVUUklDU19TQUxUXzI1NkJJVCwgbWV0cmljc19zYWx0LmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc19zYWx0LnNpemUoKSkpIHsKLSAgICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIkZhaWxlZCB0byB3cml0ZSBtZXRyaWNzIHNhbHQgdG8gY29uZmlnIjsKLSAgICB9Ci0gIH0KLSAgQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPkluaXRpYWxpemUobWV0cmljc19zYWx0KTsKLX0KLQotLyoqCi0gKiBJbml0aWFsaXplIG1ldHJpYyBpZCBhbGxvY2F0b3IgYnkgcmVhZGluZyBtZXRyaWNfaWQgZnJvbSBjb25maWcgYnkgbWFjCi0gKiBhZGRyZXNzLiBJZiB0aGVyZSBpcyBubyBtZXRyaWMgaWQgZm9yIGEgbWFjIGFkZHJlc3MsIHRoZW4gYWxsb2NhdGUgaXQgYSBuZXcKLSAqIG1ldHJpYyBpZC4KLSAqLwotc3RhdGljIHZvaWQgaW5pdF9tZXRyaWNfaWRfYWxsb2NhdG9yKCkgewotICBzdGQ6OnVub3JkZXJlZF9tYXA8UmF3QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcDsKLQotICAvLyBXaGVuIHVzZXIgdXBkYXRlIHRoZSBzeXN0ZW0sIHRoZXJlIHdpbGwgYmUgZGV2aWNlcyBwYWlyZWQgd2l0aCBvbGRlcgotICAvLyB2ZXJzaW9uIG9mIGFuZHJvaWQgd2l0aG91dCBhIG1ldHJpYyBpZC4KLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYWRkcmVzc2VzX3dpdGhvdXRfaWQ7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBtYWNfYWRkcmVzcyA6IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcygpKSB7Ci0gICAgYXV0byBhZGRyX3N0ciA9IG1hY19hZGRyZXNzLlRvU3RyaW5nKCk7Ci0gICAgLy8gaWYgdGhlIHNlY3Rpb24gbmFtZSBpcyBhIG1hYyBhZGRyZXNzCi0gICAgYm9vbCBpc192YWxpZF9pZF9mb3VuZCA9IGZhbHNlOwotICAgIGlmIChidGlmX2NvbmZpZ19leGlzdChhZGRyX3N0ciwgQlRfQ09ORklHX01FVFJJQ1NfSURfS0VZKSkgewotICAgICAgLy8gdGhlcmUgaXMgb25lIG1ldHJpYyBpZCB1bmRlciB0aGlzIG1hY19hZGRyZXNzCi0gICAgICBpbnQgaWQgPSAwOwotICAgICAgYnRpZl9jb25maWdfZ2V0X2ludChhZGRyX3N0ciwgQlRfQ09ORklHX01FVFJJQ1NfSURfS0VZLCAmaWQpOwotICAgICAgaWYgKGlzX3ZhbGlkX2lkX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihpZCkpIHsKLSAgICAgICAgcGFpcmVkX2RldmljZV9tYXBbbWFjX2FkZHJlc3NdID0gaWQ7Ci0gICAgICAgIGlzX3ZhbGlkX2lkX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc192YWxpZF9pZF9mb3VuZCkgewotICAgICAgYWRkcmVzc2VzX3dpdGhvdXRfaWQucHVzaF9iYWNrKG1hY19hZGRyZXNzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIE1ldHJpY0lkQWxsb2NhdG9yCi0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBzYXZlX2RldmljZV9jYWxsYmFjayA9Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBjb25zdCBpbnQgaWQpIHsKLSAgICAgICAgcmV0dXJuIGJ0aWZfY29uZmlnX3NldF9pbnQoYWRkcmVzcy5Ub1N0cmluZygpLCBCVF9DT05GSUdfTUVUUklDU19JRF9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKLSAgICAgIH07Ci0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrID0KLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGNvbnN0IGludCBpZCkgewotICAgICAgICByZXR1cm4gYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJlc3MuVG9TdHJpbmcoKSwgQlRfQ09ORklHX01FVFJJQ1NfSURfS0VZKTsKLSAgICAgIH07Ci0gIGlmICghaW5pdF9tZXRyaWNfaWRfYWxsb2NhdG9yKHBhaXJlZF9kZXZpY2VfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc2F2ZV9kZXZpY2VfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZm9yZ2V0X2RldmljZV9jYWxsYmFjaykpKSB7Ci0gICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgTWV0cmljSWRBbGxvY2F0b3IiOwotICB9Ci0KLSAgLy8gQWRkIGRldmljZV93aXRob3V0X2lkCi0gIGZvciAoYXV0byYgYWRkcmVzcyA6IGFkZHJlc3Nlc193aXRob3V0X2lkKSB7Ci0gICAgYWxsb2NhdGVfbWV0cmljX2lkX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihhZGRyZXNzKTsKLSAgICBzYXZlX21ldHJpY19pZF9mcm9tX21ldHJpY19pZF9hbGxvY2F0b3IoYWRkcmVzcyk7Ci0gIH0KLX0KLQotc3RhdGljIHN0ZDo6cmVjdXJzaXZlX211dGV4IGNvbmZpZ19sb2NrOyAgLy8gcHJvdGVjdHMgb3BlcmF0aW9ucyBvbiB8Y29uZmlnfC4KLXN0YXRpYyBhbGFybV90KiBjb25maWdfdGltZXI7Ci0KLS8vIGxpbWl0ZWQgYnRpZiBjb25maWcgY2FjaGUgY2FwYWNpdHkKLXN0YXRpYyBCdGlmQ29uZmlnQ2FjaGUgYnRpZl9jb25maWdfY2FjaGUoVEVNUE9SQVJZX1NFQ1RJT05fQ0FQQUNJVFkpOwotCi0vLyBNb2R1bGUgbGlmZWN5Y2xlIGZ1bmN0aW9ucwotCi1zdGF0aWMgZnV0dXJlX3QqIGluaXQodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgQ0hFQ0soYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkpOwotICAgIC8vIFRPRE8gKGIvMTU4MDM1ODg5KSBNaWdyYXRlIG1ldHJpY3MgbW9kdWxlIHRvIEdECi0gICAgcmVhZF9vcl9zZXRfbWV0cmljc19zYWx0KCk7Ci0gICAgaW5pdF9tZXRyaWNfaWRfYWxsb2NhdG9yKCk7Ci0gICAgcmV0dXJuIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKEZVVFVSRV9TVUNDRVNTKTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWc7Ci0KLSAgaWYgKGlzX2ZhY3RvcnlfcmVzZXQoKSkgZGVsZXRlX2NvbmZpZ19maWxlcygpOwotCi0gIHN0ZDo6c3RyaW5nIGZpbGVfc291cmNlOwotCi0gIGlmIChjb25maWdfY2hlY2tzdW1fcGFzcyhDT05GSUdfRklMRV9DT01QQVJFX1BBU1MpKSB7Ci0gICAgY29uZmlnID0gYnRpZl9jb25maWdfb3BlbihDT05GSUdfRklMRV9QQVRIKTsKLSAgICBidGlmX2NvbmZpZ19zb3VyY2UgPSBPUklHSU5BTDsKLSAgfQotICBpZiAoIWNvbmZpZykgewotICAgIExPR19XQVJOKCIlcyB1bmFibGUgdG8gbG9hZCBjb25maWcgZmlsZTogJXM7IHVzaW5nIGJhY2t1cC4iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICBDT05GSUdfRklMRV9QQVRIKTsKLSAgICBpZiAoY29uZmlnX2NoZWNrc3VtX3Bhc3MoQ09ORklHX0JBQ0tVUF9DT01QQVJFX1BBU1MpKSB7Ci0gICAgICBjb25maWcgPSBidGlmX2NvbmZpZ19vcGVuKENPTkZJR19CQUNLVVBfUEFUSCk7Ci0gICAgICBidGlmX2NvbmZpZ19zb3VyY2UgPSBCQUNLVVA7Ci0gICAgICBmaWxlX3NvdXJjZSA9ICJCYWNrdXAiOwotICAgIH0KLSAgfQotICBpZiAoIWNvbmZpZykgewotICAgIExPR19XQVJOKCIlcyB1bmFibGUgdG8gbG9hZCBiYWNrdXA7IGF0dGVtcHRpbmcgdG8gdHJhbnNjb2RlIGxlZ2FjeSBmaWxlLiIsCi0gICAgICAgICAgICAgX19mdW5jX18pOwotICAgIGNvbmZpZyA9IGJ0aWZfY29uZmlnX3RyYW5zY29kZShDT05GSUdfTEVHQUNZX0ZJTEVfUEFUSCk7Ci0gICAgYnRpZl9jb25maWdfc291cmNlID0gTEVHQUNZOwotICAgIGZpbGVfc291cmNlID0gIkxlZ2FjeSI7Ci0gIH0KLSAgaWYgKCFjb25maWcpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byB0cmFuc2NvZGUgbGVnYWN5IGZpbGU7IGNyZWF0aW5nIGVtcHR5IGNvbmZpZy4iLAotICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgY29uZmlnID0gY29uZmlnX25ld19lbXB0eSgpOwotICAgIGJ0aWZfY29uZmlnX3NvdXJjZSA9IE5FV19GSUxFOwotICAgIGZpbGVfc291cmNlID0gIkVtcHR5IjsKLSAgfQotCi0gIC8vIG1vdmUgcGVyc2lzdGVudCBjb25maWcgZGF0YSBmcm9tIGJ0aWZfY29uZmlnIGZpbGUgdG8gYnRpZiBjb25maWcgY2FjaGUKLSAgYnRpZl9jb25maWdfY2FjaGUuSW5pdChzdGQ6Om1vdmUoY29uZmlnKSk7Ci0KLSAgaWYgKCFmaWxlX3NvdXJjZS5lbXB0eSgpKSB7Ci0gICAgYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKElORk9fU0VDVElPTiwgRklMRV9TT1VSQ0UsIGZpbGVfc291cmNlKTsKLSAgfQotCi0gIC8vIENsZWFudXAgdGVtcG9yYXJ5IHBhaXJpbmdzIGlmIHdlIGhhdmUgbGVmdCBndWVzdCBtb2RlCi0gIGlmICghaXNfcmVzdHJpY3RlZF9tb2RlKCkpIHsKLSAgICBidGlmX2NvbmZpZ19jYWNoZS5SZW1vdmVQZXJzaXN0ZW50U2VjdGlvbnNXaXRoS2V5KCJSZXN0cmljdGVkIik7Ci0gIH0KLQotICAvLyBSZWFkIG9yIHNldCBjb25maWcgZmlsZSBjcmVhdGlvbiB0aW1lc3RhbXAKLSAgYXV0byB0aW1lX3N0ciA9IGJ0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhJTkZPX1NFQ1RJT04sIEZJTEVfVElNRVNUQU1QKTsKLSAgaWYgKCF0aW1lX3N0cikgewotICAgIHRpbWVfdCBjdXJyZW50X3RpbWUgPSB0aW1lKE5VTEwpOwotICAgIHN0cnVjdCB0bSogdGltZV9jcmVhdGVkID0gbG9jYWx0aW1lKCZjdXJyZW50X3RpbWUpOwotICAgIHN0cmZ0aW1lKGJ0aWZfY29uZmlnX3RpbWVfY3JlYXRlZCwgVElNRV9TVFJJTkdfTEVOR1RILCBUSU1FX1NUUklOR19GT1JNQVQsCi0gICAgICAgICAgICAgdGltZV9jcmVhdGVkKTsKLSAgICBidGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoSU5GT19TRUNUSU9OLCBGSUxFX1RJTUVTVEFNUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9jb25maWdfdGltZV9jcmVhdGVkKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJsY3B5KGJ0aWZfY29uZmlnX3RpbWVfY3JlYXRlZCwgdGltZV9zdHItPmNfc3RyKCksIFRJTUVfU1RSSU5HX0xFTkdUSCk7Ci0gIH0KLQotICAvLyBSZWFkIG9yIHNldCBtZXRyaWNzIDI1NiBiaXQgaGFzaGluZyBzYWx0Ci0gIHJlYWRfb3Jfc2V0X21ldHJpY3Nfc2FsdCgpOwotCi0gIC8vIEluaXRpYWxpemUgTWV0cmljSWRBbGxvY2F0b3IKLSAgaW5pdF9tZXRyaWNfaWRfYWxsb2NhdG9yKCk7Ci0KLSAgLy8gVE9ETyhzaGFydmlsKTogdXNlIGEgbm9uLXdha2UgYWxhcm0gZm9yIHRoaXMgb25jZSB3ZSBoYXZlCi0gIC8vIEFQSSBzdXBwb3J0IGZvciBpdC4gVGhlcmUncyBubyBuZWVkIHRvIHdha2UgdGhlIHN5c3RlbSB0bwotICAvLyB3cml0ZSBiYWNrIHRvIGRpc2suCi0gIGNvbmZpZ190aW1lciA9IGFsYXJtX25ldygiYnRpZi5jb25maWciKTsKLSAgaWYgKCFjb25maWdfdGltZXIpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBjcmVhdGUgYWxhcm0uIiwgX19mdW5jX18pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBMT0dfRVZFTlRfSU5UKEJUX0NPTkZJR19TT1VSQ0VfVEFHX05VTSwgYnRpZl9jb25maWdfc291cmNlKTsKLQotICByZXR1cm4gZnV0dXJlX25ld19pbW1lZGlhdGUoRlVUVVJFX1NVQ0NFU1MpOwotCi1lcnJvcjoKLSAgYWxhcm1fZnJlZShjb25maWdfdGltZXIpOwotICBjb25maWcucmVzZXQoKTsKLSAgYnRpZl9jb25maWdfY2FjaGUuQ2xlYXIoKTsKLSAgY29uZmlnX3RpbWVyID0gTlVMTDsKLSAgYnRpZl9jb25maWdfc291cmNlID0gTk9UX0xPQURFRDsKLSAgcmV0dXJuIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKEZVVFVSRV9GQUlMKTsKLX0KLQotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gYnRpZl9jb25maWdfb3Blbihjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoZmlsZW5hbWUpOwotICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGxwdHI7Ci0KLSAgaWYgKCFjb25maWdfaGFzX3NlY3Rpb24oKmNvbmZpZywgIkFkYXB0ZXIiKSkgewotICAgIExPR19FUlJPUigiQ29uZmlnIGlzIG1pc3NpbmcgYWRhcHRlciBzZWN0aW9uIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICByZXR1cm4gY29uZmlnOwotfQotCi1zdGF0aWMgZnV0dXJlX3QqIHNodXRfZG93bih2b2lkKSB7Ci0gIGJ0aWZfY29uZmlnX2ZsdXNoKCk7Ci0gIHJldHVybiBmdXR1cmVfbmV3X2ltbWVkaWF0ZShGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyBmdXR1cmVfdCogY2xlYW5fdXAodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgQ0hFQ0soYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkpOwotICAgIC8vIEdEIHN0b3JhZ2UgbW9kdWxlIGNsZWFudXAgYnkgaXRzZWxmCi0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gICAgY2xvc2VfbWV0cmljX2lkX2FsbG9jYXRvcigpOwotICAgIHJldHVybiBmdXR1cmVfbmV3X2ltbWVkaWF0ZShGVVRVUkVfU1VDQ0VTUyk7Ci0gIH0KLSAgYnRpZl9jb25maWdfZmx1c2goKTsKLQotICBhbGFybV9mcmVlKGNvbmZpZ190aW1lcik7Ci0gIGNvbmZpZ190aW1lciA9IE5VTEw7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGdldF9ibHVldG9vdGhfa2V5c3RvcmVfaW50ZXJmYWNlKCktPmNsZWFyX21hcCgpOwotICBjbG9zZV9tZXRyaWNfaWRfYWxsb2NhdG9yKCk7Ci0gIGJ0aWZfY29uZmlnX2NhY2hlLkNsZWFyKCk7Ci0gIHJldHVybiBmdXR1cmVfbmV3X2ltbWVkaWF0ZShGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wgbW9kdWxlX3QgYnRpZl9jb25maWdfbW9kdWxlID0gey5uYW1lID0gQlRJRl9DT05GSUdfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXQgPSBpbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0X3VwID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaHV0X2Rvd24gPSBzaHV0X2Rvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xlYW5fdXAgPSBjbGVhbl91cH07Ci0KLWJvb2wgYnRpZl9jb25maWdfZXhpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIENIRUNLKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKTsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpIYXNQcm9wZXJ0eShzZWN0aW9uLCBrZXkpOwotICB9Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29uZmlnX2xvY2spOwotICByZXR1cm4gYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KHNlY3Rpb24sIGtleSk7Ci19Ci0KLWJvb2wgYnRpZl9jb25maWdfZ2V0X2ludChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBDSEVDSyhibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSk7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0SW50KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotICB9Ci0gIENIRUNLKHZhbHVlICE9IE5VTEwpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgYXV0byByZXQgPSBidGlmX2NvbmZpZ19jYWNoZS5HZXRJbnQoc2VjdGlvbiwga2V5KTsKLSAgaWYgKCFyZXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgKnZhbHVlID0gKnJldDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYnRpZl9jb25maWdfc2V0X2ludChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIENIRUNLKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKTsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpTZXRJbnQoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGJ0aWZfY29uZmlnX2NhY2hlLlNldEludChzZWN0aW9uLCBrZXksIHZhbHVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYnRpZl9jb25maWdfZ2V0X3VpbnQ2NChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogdmFsdWUpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIENIRUNLKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKTsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRVaW50NjQoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH0KLSAgQ0hFQ0sodmFsdWUgIT0gTlVMTCk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29uZmlnX2xvY2spOwotICBhdXRvIHJldCA9IGJ0aWZfY29uZmlnX2NhY2hlLkdldFVpbnQ2NChzZWN0aW9uLCBrZXkpOwotICBpZiAoIXJldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmFsdWUgPSAqcmV0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBidGlmX2NvbmZpZ19zZXRfdWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBDSEVDSyhibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSk7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0VWludDY0KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotICB9Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29uZmlnX2xvY2spOwotICBidGlmX2NvbmZpZ19jYWNoZS5TZXRVaW50NjQoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9jb25maWdfZ2V0X3N0cgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBrZXkuCi0gKgotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDogVGhlIHNlY3Rpb24gbmFtZSAoaS5lICJBZGFwdGVyIikKLSAqICAgICAgICAgICAgICAgICAga2V5IDogVGhlIGtleSBuYW1lIChpLmUgIkFkZHJlc3MiKQotICogICAgICAgICAgICAgICAgICB2YWx1ZSA6IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB3aGVyZSB3ZSB3aWxsIHN0b3JlIHRoZSB2YWx1ZQotICogICAgICAgICAgICAgICAgICBzaXplX2J5dGVzIDogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSBoYXZlIGF2YWlsYWJsZSB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgdGhlIHZhbHVlIGludG8uIFdpbGwgYmUgdXBkYXRlZCB1cG9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgdG8gY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVHJ1ZSBpZiBhIHZhbHVlIHdhcyBmb3VuZCwgRmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgYnRpZl9jb25maWdfZ2V0X3N0cihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiB2YWx1ZSwgaW50KiBzaXplX2J5dGVzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBDSEVDSyhibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSk7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0U3RyKHNlY3Rpb24sIGtleSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfYnl0ZXMpOwotICB9Ci0gIENIRUNLKHZhbHVlICE9IE5VTEwpOwotICBDSEVDSyhzaXplX2J5dGVzICE9IE5VTEwpOwotCi0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgICBhdXRvIHN0b3JlZF92YWx1ZSA9IGJ0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhzZWN0aW9uLCBrZXkpOwotICAgIGlmICghc3RvcmVkX3ZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgc3RybGNweSh2YWx1ZSwgc3RvcmVkX3ZhbHVlLT5jX3N0cigpLCAqc2l6ZV9ieXRlcyk7Ci0gIH0KLSAgKnNpemVfYnl0ZXMgPSBzdHJsZW4odmFsdWUpICsgMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYnRpZl9jb25maWdfc2V0X3N0cihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIENIRUNLKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKTsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpTZXRTdHIoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGJ0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhzZWN0aW9uLCBrZXksIHZhbHVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGJ0aWZfaW5fZW5jcnlwdF9rZXlfbmFtZV9saXN0KHN0ZDo6c3RyaW5nIGtleSkgewotICByZXR1cm4gc3RkOjpmaW5kKGVuY3J5cHRfa2V5X25hbWVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICBlbmNyeXB0X2tleV9uYW1lX2xpc3QgKyBFTkNSWVBUX0tFWV9OQU1FX0xJU1RfU0laRSwKLSAgICAgICAgICAgICAgICAgICBrZXkpICE9IChlbmNyeXB0X2tleV9uYW1lX2xpc3QgKyBFTkNSWVBUX0tFWV9OQU1FX0xJU1RfU0laRSk7Ci19Ci0KLWJvb2wgYnRpZl9jb25maWdfZ2V0X2Jpbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgc2l6ZV90KiBsZW5ndGgpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIENIRUNLKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKTsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRCaW4oc2VjdGlvbiwga2V5LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLSAgfQotICBDSEVDSyh2YWx1ZSAhPSBOVUxMKTsKLSAgQ0hFQ0sobGVuZ3RoICE9IE5VTEwpOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29uZmlnX2xvY2spOwotICBjb25zdCBzdGQ6OnN0cmluZyogdmFsdWVfc3RyOwotICBhdXRvIHZhbHVlX3N0cl9mcm9tX2NvbmZpZyA9IGJ0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhzZWN0aW9uLCBrZXkpOwotCi0gIGlmICghdmFsdWVfc3RyX2Zyb21fY29uZmlnKSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW5ub3QgZmluZCBzdHJpbmcgZm9yIHNlY3Rpb24gIiA8PCBzZWN0aW9uCi0gICAgICAgICAgICA8PCAiLCBrZXkgIiA8PCBrZXk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBpbl9lbmNyeXB0X2tleV9uYW1lX2xpc3QgPSBidGlmX2luX2VuY3J5cHRfa2V5X25hbWVfbGlzdChrZXkpOwotICBib29sIGlzX2tleV9lbmNyeXB0ZWQgPSAqdmFsdWVfc3RyX2Zyb21fY29uZmlnID09IEVOQ1JZUFRFRF9TVFI7Ci0gIHN0ZDo6c3RyaW5nIHN0cmluZzsKLQotICBpZiAoIXZhbHVlX3N0cl9mcm9tX2NvbmZpZy0+ZW1wdHkoKSAmJiBpbl9lbmNyeXB0X2tleV9uYW1lX2xpc3QgJiYKLSAgICAgIGlzX2tleV9lbmNyeXB0ZWQpIHsKLSAgICBzdHJpbmcgPSBnZXRfYmx1ZXRvb3RoX2tleXN0b3JlX2ludGVyZmFjZSgpLT5nZXRfa2V5KHNlY3Rpb24gKyAiLSIgKyBrZXkpOwotICAgIHZhbHVlX3N0ciA9ICZzdHJpbmc7Ci0gIH0gZWxzZSB7Ci0gICAgdmFsdWVfc3RyID0gJnZhbHVlX3N0cl9mcm9tX2NvbmZpZy52YWx1ZSgpOwotICB9Ci0KLSAgc2l6ZV90IHZhbHVlX2xlbiA9IHZhbHVlX3N0ci0+bGVuZ3RoKCk7Ci0gIGlmICgodmFsdWVfbGVuICUgMikgIT0gMCB8fCAqbGVuZ3RoIDwgKHZhbHVlX2xlbiAvIDIpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICI6IHZhbHVlIHNpemUgbm90IGRpdmlzaWJsZSBieSAyLCBzaXplIGlzICIgPDwgdmFsdWVfbGVuOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVfbGVuOyArK2kpCi0gICAgaWYgKCFpc3hkaWdpdCh2YWx1ZV9zdHItPmNfc3RyKClbaV0pKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIjogdmFsdWUgaXMgbm90IGhleCBkaWdpdCI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNvbnN0IGNoYXIqIHB0ciA9IHZhbHVlX3N0ci0+Y19zdHIoKTsKLSAgZm9yICgqbGVuZ3RoID0gMDsgKnB0cjsgcHRyICs9IDIsICpsZW5ndGggKz0gMSkgewotICAgIHNzY2FuZihwdHIsICIlMDJoaHgiLCAmdmFsdWVbKmxlbmd0aF0pOwotICB9Ci0KLSAgaWYgKGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKCkpIHsKLSAgICBpZiAoIXZhbHVlX3N0cl9mcm9tX2NvbmZpZy0+ZW1wdHkoKSAmJiBpbl9lbmNyeXB0X2tleV9uYW1lX2xpc3QgJiYKLSAgICAgICAgIWlzX2tleV9lbmNyeXB0ZWQpIHsKLSAgICAgIGdldF9ibHVldG9vdGhfa2V5c3RvcmVfaW50ZXJmYWNlKCktPnNldF9lbmNyeXB0X2tleV9vcl9yZW1vdmVfa2V5KAotICAgICAgICAgIHNlY3Rpb24gKyAiLSIgKyBrZXksICp2YWx1ZV9zdHJfZnJvbV9jb25maWcpOwotICAgICAgYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKHNlY3Rpb24sIGtleSwgRU5DUllQVEVEX1NUUik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChpbl9lbmNyeXB0X2tleV9uYW1lX2xpc3QgJiYgaXNfa2V5X2VuY3J5cHRlZCkgewotICAgICAgYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKHNlY3Rpb24sIGtleSwgKnZhbHVlX3N0cik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXNpemVfdCBidGlmX2NvbmZpZ19nZXRfYmluX2xlbmd0aChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBDSEVDSyhibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSk7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0QmluTGVuZ3RoKHNlY3Rpb24sIGtleSk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGF1dG8gdmFsdWVfc3RyID0gYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKHNlY3Rpb24sIGtleSk7Ci0gIGlmICghdmFsdWVfc3RyKSByZXR1cm4gMDsKLSAgc2l6ZV90IHZhbHVlX2xlbiA9IHZhbHVlX3N0ci0+bGVuZ3RoKCk7Ci0gIHJldHVybiAoKHZhbHVlX2xlbiAlIDIpICE9IDApID8gMCA6ICh2YWx1ZV9sZW4gLyAyKTsKLX0KLQotYm9vbCBidGlmX2NvbmZpZ19zZXRfYmluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBDSEVDSyhibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSk7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0QmluKHNlY3Rpb24sIGtleSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0gIH0KLSAgY29uc3QgY2hhciogbG9va3VwID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotICBpZiAobGVuZ3RoID4gMCkgQ0hFQ0sodmFsdWUgIT0gTlVMTCk7Ci0KLSAgc2l6ZV90IG1heF92YWx1ZSA9ICgoc2l6ZV90KS0xKTsKLSAgaWYgKCgobWF4X3ZhbHVlIC0gMSkgLyAyKSA8IGxlbmd0aCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogbGVuZ3RoIHRvbyBsb25nIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjaGFyKiBzdHIgPSAoY2hhciopb3NpX2NhbGxvYyhsZW5ndGggKiAyICsgMSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgIHN0clsoaSAqIDIpICsgMF0gPSBsb29rdXBbKHZhbHVlW2ldID4+IDQpICYgMHgwRl07Ci0gICAgc3RyWyhpICogMikgKyAxXSA9IGxvb2t1cFt2YWx1ZVtpXSAmIDB4MEZdOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdmFsdWVfc3RyOwotICBpZiAoKGxlbmd0aCA+IDApICYmIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKCkgJiYKLSAgICAgIGJ0aWZfaW5fZW5jcnlwdF9rZXlfbmFtZV9saXN0KGtleSkpIHsKLSAgICBnZXRfYmx1ZXRvb3RoX2tleXN0b3JlX2ludGVyZmFjZSgpLT5zZXRfZW5jcnlwdF9rZXlfb3JfcmVtb3ZlX2tleSgKLSAgICAgICAgc2VjdGlvbiArICItIiArIGtleSwgc3RyKTsKLSAgICB2YWx1ZV9zdHIgPSBFTkNSWVBURURfU1RSOwotICB9IGVsc2UgewotICAgIHZhbHVlX3N0ciA9IHN0cjsKLSAgfQotCi0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgICBidGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoc2VjdGlvbiwga2V5LCB2YWx1ZV9zdHIpOwotICB9Ci0KLSAgb3NpX2ZyZWUoc3RyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcygpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzOwotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgQ0hFQ0soYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkpOwotICAgIG5hbWVzID0gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRQZXJzaXN0ZW50RGV2aWNlcygpOwotICB9IGVsc2UgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29uZmlnX2xvY2spOwotICAgIG5hbWVzID0gYnRpZl9jb25maWdfY2FjaGUuR2V0UGVyc2lzdGVudFNlY3Rpb25OYW1lcygpOwotICB9Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IHJlc3VsdDsKLSAgcmVzdWx0LnJlc2VydmUobmFtZXMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogbmFtZXMpIHsKLSAgICBSYXdBZGRyZXNzIGFkZHIgPSB7fTsKLSAgICAvLyBHYXRoZXIgdXAga25vd24gZGV2aWNlcyBmcm9tIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lcwotICAgIGlmIChSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKG5hbWUsIGFkZHIpKSB7Ci0gICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKGFkZHIpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIGJ0aWZfY29uZmlnX3JlbW92ZShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgQ0hFQ0soYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkpOwotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6OlJlbW92ZVByb3BlcnR5KHNlY3Rpb24sIGtleSk7Ci0gIH0KLSAgaWYgKGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKCkgJiYgYnRpZl9pbl9lbmNyeXB0X2tleV9uYW1lX2xpc3Qoa2V5KSkgewotICAgIGdldF9ibHVldG9vdGhfa2V5c3RvcmVfaW50ZXJmYWNlKCktPnNldF9lbmNyeXB0X2tleV9vcl9yZW1vdmVfa2V5KAotICAgICAgICBzZWN0aW9uICsgIi0iICsga2V5LCAiIik7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIHJldHVybiBidGlmX2NvbmZpZ19jYWNoZS5SZW1vdmVLZXkoc2VjdGlvbiwga2V5KTsKLX0KLQotdm9pZCBidGlmX2NvbmZpZ19zYXZlKHZvaWQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIENIRUNLKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKTsKLSAgICBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6OlNhdmUoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0hFQ0soY29uZmlnX3RpbWVyICE9IE5VTEwpOwotCi0gIGFsYXJtX3NldChjb25maWdfdGltZXIsIENPTkZJR19TRVRUTEVfUEVSSU9EX01TLCB0aW1lcl9jb25maWdfc2F2ZV9jYiwgTlVMTCk7Ci19Ci0KLXZvaWQgYnRpZl9jb25maWdfZmx1c2godm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgQ0hFQ0soYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkpOwotICAgIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6Rmx1c2goKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0hFQ0soY29uZmlnX3RpbWVyICE9IE5VTEwpOwotCi0gIGFsYXJtX2NhbmNlbChjb25maWdfdGltZXIpOwotICBidGlmX2NvbmZpZ193cml0ZSgwLCBOVUxMKTsKLX0KLQotYm9vbCBidGlmX2NvbmZpZ19jbGVhcih2b2lkKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBDSEVDSyhibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSk7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpDbGVhcigpOwotICAgIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6U2F2ZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIENIRUNLKGNvbmZpZ190aW1lciAhPSBOVUxMKTsKLQotICBhbGFybV9jYW5jZWwoY29uZmlnX3RpbWVyKTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLQotICBidGlmX2NvbmZpZ19jYWNoZS5DbGVhcigpOwotICBib29sIHJldCA9Ci0gICAgICBjb25maWdfc2F2ZShidGlmX2NvbmZpZ19jYWNoZS5QZXJzaXN0ZW50U2VjdGlvbkNvcHkoKSwgQ09ORklHX0ZJTEVfUEFUSCk7Ci0gIGJ0aWZfY29uZmlnX3NvdXJjZSA9IFJFU0VUOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpbWVyX2NvbmZpZ19zYXZlX2NiKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsKLSAgLy8gTW92aW5nIGZpbGUgSS9PIHRvIGJ0aWYgY29udGV4dCBpbnN0ZWFkIG9mIHRpbWVyIGNhbGxiYWNrIGJlY2F1c2UKLSAgLy8gaXQgdXN1YWxseSB0YWtlcyBhIGxvdCBvZiB0aW1lIHRvIGJlIGNvbXBsZXRlZCwgaW50cm9kdWNpbmcKLSAgLy8gZGVsYXlzIGR1cmluZyBBMkRQIHBsYXliYWNrIGNhdXNpbmcgYmxpcHMgb3IgY2hvcHBpbmVzcy4KLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfY29uZmlnX3dyaXRlLCAwLCBOVUxMLCAwLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9jb25maWdfd3JpdGUoVU5VU0VEX0FUVFIgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjaGFyKiBwX3BhcmFtKSB7Ci0gIENIRUNLKGNvbmZpZ190aW1lciAhPSBOVUxMKTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgcmVuYW1lKENPTkZJR19GSUxFX1BBVEgsIENPTkZJR19CQUNLVVBfUEFUSCk7Ci0gIGNvbmZpZ19zYXZlKGJ0aWZfY29uZmlnX2NhY2hlLlBlcnNpc3RlbnRTZWN0aW9uQ29weSgpLCBDT05GSUdfRklMRV9QQVRIKTsKLSAgaWYgKGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKCkpIHsKLSAgICBnZXRfYmx1ZXRvb3RoX2tleXN0b3JlX2ludGVyZmFjZSgpLT5zZXRfZW5jcnlwdF9rZXlfb3JfcmVtb3ZlX2tleSgKLSAgICAgICAgQ09ORklHX0ZJTEVfUFJFRklYLCBDT05GSUdfRklMRV9IQVNIKTsKLSAgfQotfQotCi12b2lkIGJ0aWZfZGVidWdfY29uZmlnX2R1bXAoaW50IGZkKSB7Ci0gIGRwcmludGYoZmQsICJcbkJsdWV0b290aCBDb25maWc6XG4iKTsKLQotICBkcHJpbnRmKGZkLCAiICBDb25maWcgU291cmNlOiAiKTsKLSAgc3dpdGNoIChidGlmX2NvbmZpZ19zb3VyY2UpIHsKLSAgICBjYXNlIE5PVF9MT0FERUQ6Ci0gICAgICBkcHJpbnRmKGZkLCAiTm90IGxvYWRlZFxuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9SSUdJTkFMOgotICAgICAgZHByaW50ZihmZCwgIk9yaWdpbmFsIGZpbGVcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQUNLVVA6Ci0gICAgICBkcHJpbnRmKGZkLCAiQmFja3VwIGZpbGVcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRUdBQ1k6Ci0gICAgICBkcHJpbnRmKGZkLCAiTGVnYWN5IGZpbGVcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBORVdfRklMRToKLSAgICAgIGRwcmludGYoZmQsICJOZXcgZmlsZVxuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU0VUOgotICAgICAgZHByaW50ZihmZCwgIlJlc2V0IGZpbGVcbiIpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBmaWxlX3NvdXJjZTsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpKSB7Ci0gICAgQ0hFQ0soYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKTsKLSAgICBmaWxlX3NvdXJjZSA9Ci0gICAgICAgIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0U3RyKElORk9fU0VDVElPTiwgRklMRV9TT1VSQ0UpOwotICB9IGVsc2UgewotICAgIGZpbGVfc291cmNlID0gYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKElORk9fU0VDVElPTiwgRklMRV9TT1VSQ0UpOwotICB9Ci0gIGlmICghZmlsZV9zb3VyY2UpIHsKLSAgICBmaWxlX3NvdXJjZS5lbXBsYWNlKCJPcmlnaW5hbCIpOwotICB9Ci0gIGF1dG8gZGV2aWNlcyA9IGJ0aWZfY29uZmlnX2NhY2hlLkdldFBlcnNpc3RlbnRTZWN0aW9uTmFtZXMoKTsKLSAgZHByaW50ZihmZCwgIiAgRGV2aWNlcyBsb2FkZWQ6ICV6dVxuIiwgZGV2aWNlcy5zaXplKCkpOwotICBkcHJpbnRmKGZkLCAiICBGaWxlIGNyZWF0ZWQvdGFnZ2VkOiAlc1xuIiwgYnRpZl9jb25maWdfdGltZV9jcmVhdGVkKTsKLSAgZHByaW50ZihmZCwgIiAgRmlsZSBzb3VyY2U6ICVzXG4iLCBmaWxlX3NvdXJjZS0+Y19zdHIoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGlzX2ZhY3RvcnlfcmVzZXQodm9pZCkgewotICBjaGFyIGZhY3RvcnlfcmVzZXRbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0IiwgZmFjdG9yeV9yZXNldCwgImZhbHNlIik7Ci0gIHJldHVybiBzdHJuY21wKGZhY3RvcnlfcmVzZXQsICJ0cnVlIiwgNCkgPT0gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlX2NvbmZpZ19maWxlcyh2b2lkKSB7Ci0gIHJlbW92ZShDT05GSUdfRklMRV9QQVRIKTsKLSAgcmVtb3ZlKENPTkZJR19CQUNLVVBfUEFUSCk7Ci0gIG9zaV9wcm9wZXJ0eV9zZXQoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsICJmYWxzZSIpOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9jb25maWdfY2FjaGUuY2MgYi9idGlmL3NyYy9idGlmX2NvbmZpZ19jYWNoZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0N2Q5NC4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2NvbmZpZ19jYWNoZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRpZl9jb25maWdfY2FjaGUuaCIKLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGtMaW5rS2V5VHlwZXMgPSB7Ci0gICAgIkxpbmtLZXkiLCAgICAgICJMRV9LRVlfUEVOQyIsICJMRV9LRVlfUElEIiwKLSAgICAiTEVfS0VZX1BDU1JLIiwgIkxFX0tFWV9MRU5DIiwgIkxFX0tFWV9MQ1NSSyJ9OwotCi1jb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGtMb2NhbFNlY3Rpb25OYW1lcyA9IHsiSW5mbyIsICJNZXRyaWNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZGFwdGVyIn07Ci0KLWJvb2wgaXNfbGlua19rZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICByZXR1cm4ga0xpbmtLZXlUeXBlcy5maW5kKGtleSkgIT0ga0xpbmtLZXlUeXBlcy5lbmQoKTsKLX0KLQotYm9vbCBoYXNfbGlua19rZXlfaW5fc2VjdGlvbihjb25zdCBzZWN0aW9uX3QmIHNlY3Rpb24pIHsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHNlY3Rpb24uZW50cmllcykgewotICAgIGlmIChpc19saW5rX2tleShlbnRyeS5rZXkpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGlzX2xvY2FsX3NlY3Rpb25faW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICByZXR1cm4ga0xvY2FsU2VjdGlvbk5hbWVzLmZpbmQoc2VjdGlvbikgIT0ga0xvY2FsU2VjdGlvbk5hbWVzLmVuZCgpOwotfQotCi0vLyB0cmltIG5ldyBsaW5lIGluIHBsYWNlLCByZXR1cm4gdHJ1ZSBpZiBuZXdsaW5lIHdhcyBmb3VuZAotYm9vbCB0cmltX25ld19saW5lKHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzaXplX3QgbmV3bGluZV9wb3NpdGlvbiA9IHZhbHVlLmZpbmRfZmlyc3Rfb2YoJ1xuJyk7Ci0gIGlmIChuZXdsaW5lX3Bvc2l0aW9uICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgdmFsdWUuZXJhc2UobmV3bGluZV9wb3NpdGlvbik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQnRpZkNvbmZpZ0NhY2hlOjpCdGlmQ29uZmlnQ2FjaGUoc2l6ZV90IGNhcGFjaXR5KQotICAgIDogdW5wYWlyZWRfZGV2aWNlc19jYWNoZV8oY2FwYWNpdHksICJidF9jb25maWdfY2FjaGUiKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiLCBjYXBhY2l0eTogIiA8PCBjYXBhY2l0eTsKLX0KLQotQnRpZkNvbmZpZ0NhY2hlOjp+QnRpZkNvbmZpZ0NhY2hlKCkgeyBDbGVhcigpOyB9Ci0KLXZvaWQgQnRpZkNvbmZpZ0NhY2hlOjpDbGVhcigpIHsKLSAgdW5wYWlyZWRfZGV2aWNlc19jYWNoZV8uQ2xlYXIoKTsKLSAgcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuY2xlYXIoKTsKLX0KLQotdm9pZCBCdGlmQ29uZmlnQ2FjaGU6OkluaXQoc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBzb3VyY2UpIHsKLSAgLy8gZ2V0IHRoZSBjb25maWcgcGVyc2lzdGVudCBkYXRhIGZyb20gYnRpZl9jb25maWcgZmlsZQotICBwYWlyZWRfZGV2aWNlc19saXN0XyA9IHN0ZDo6bW92ZSgqc291cmNlKTsKLSAgc291cmNlLnJlc2V0KCk7Ci19Ci0KLWJvb2wgQnRpZkNvbmZpZ0NhY2hlOjpIYXNQZXJzaXN0ZW50U2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lKSB7Ci0gIHJldHVybiBwYWlyZWRfZGV2aWNlc19saXN0Xy5GaW5kKHNlY3Rpb25fbmFtZSkgIT0KLSAgICAgICAgIHBhaXJlZF9kZXZpY2VzX2xpc3RfLnNlY3Rpb25zLmVuZCgpOwotfQotCi1ib29sIEJ0aWZDb25maWdDYWNoZTo6SGFzVW5wYWlyZWRTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uX25hbWUpIHsKLSAgcmV0dXJuIHVucGFpcmVkX2RldmljZXNfY2FjaGVfLkhhc0tleShzZWN0aW9uX25hbWUpOwotfQotCi1ib29sIEJ0aWZDb25maWdDYWNoZTo6SGFzU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lKSB7Ci0gIHJldHVybiBIYXNVbnBhaXJlZFNlY3Rpb24oc2VjdGlvbl9uYW1lKSB8fCBIYXNQZXJzaXN0ZW50U2VjdGlvbihzZWN0aW9uX25hbWUpOwotfQotCi1ib29sIEJ0aWZDb25maWdDYWNoZTo6SGFzS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgYXV0byBzZWN0aW9uX2l0ZXIgPSBwYWlyZWRfZGV2aWNlc19saXN0Xy5GaW5kKHNlY3Rpb25fbmFtZSk7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgIT0gcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuZW5kKCkpIHsKLSAgICByZXR1cm4gc2VjdGlvbl9pdGVyLT5IYXMoa2V5KTsKLSAgfQotICBzZWN0aW9uX3QqIHNlY3Rpb24gPSB1bnBhaXJlZF9kZXZpY2VzX2NhY2hlXy5GaW5kKHNlY3Rpb25fbmFtZSk7Ci0gIGlmIChzZWN0aW9uID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHNlY3Rpb24tPkhhcyhrZXkpOwotfQotCi0vLyByZW1vdmUgc2VjdGlvbnMgd2l0aCB0aGUgcmVzdHJpY3RlZCBrZXkKLXZvaWQgQnRpZkNvbmZpZ0NhY2hlOjpSZW1vdmVQZXJzaXN0ZW50U2VjdGlvbnNXaXRoS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgZm9yIChhdXRvIGl0ID0gcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBwYWlyZWRfZGV2aWNlc19saXN0Xy5zZWN0aW9ucy5lbmQoKTspIHsKLSAgICBpZiAoaXQtPkhhcyhrZXkpKSB7Ci0gICAgICBpdCA9IHBhaXJlZF9kZXZpY2VzX2xpc3RfLnNlY3Rpb25zLmVyYXNlKGl0KTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpdCsrOwotICB9Ci19Ci0KLS8qIHJlbW92ZSBhIGtleSBmcm9tIHNlY3Rpb24sIHNlY3Rpb24gaXRzZWxmIGlzIHJlbW92ZWQgd2hlbiBlbXB0eSAqLwotYm9vbCBCdGlmQ29uZmlnQ2FjaGU6OlJlbW92ZUtleShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIHNlY3Rpb25fdCogc2VjdGlvbiA9IHVucGFpcmVkX2RldmljZXNfY2FjaGVfLkZpbmQoc2VjdGlvbl9uYW1lKTsKLSAgaWYgKHNlY3Rpb24gIT0gbnVsbHB0cikgewotICAgIGF1dG8gZW50cnlfaXRlciA9IHNlY3Rpb24tPkZpbmQoa2V5KTsKLSAgICBpZiAoZW50cnlfaXRlciA9PSBzZWN0aW9uLT5lbnRyaWVzLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHNlY3Rpb24tPmVudHJpZXMuZXJhc2UoZW50cnlfaXRlcik7Ci0gICAgaWYgKHNlY3Rpb24tPmVudHJpZXMuZW1wdHkoKSkgewotICAgICAgdW5wYWlyZWRfZGV2aWNlc19jYWNoZV8uUmVtb3ZlKHNlY3Rpb25fbmFtZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGF1dG8gc2VjdGlvbl9pdGVyID0gcGFpcmVkX2RldmljZXNfbGlzdF8uRmluZChzZWN0aW9uX25hbWUpOwotICAgIGlmIChzZWN0aW9uX2l0ZXIgPT0gcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXV0byBlbnRyeV9pdGVyID0gc2VjdGlvbl9pdGVyLT5GaW5kKGtleSk7Ci0gICAgaWYgKGVudHJ5X2l0ZXIgPT0gc2VjdGlvbl9pdGVyLT5lbnRyaWVzLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHNlY3Rpb25faXRlci0+ZW50cmllcy5lcmFzZShlbnRyeV9pdGVyKTsKLSAgICBpZiAoc2VjdGlvbl9pdGVyLT5lbnRyaWVzLmVtcHR5KCkpIHsKLSAgICAgIHBhaXJlZF9kZXZpY2VzX2xpc3RfLnNlY3Rpb25zLmVyYXNlKHNlY3Rpb25faXRlcik7Ci0gICAgfSBlbHNlIGlmICghaGFzX2xpbmtfa2V5X2luX3NlY3Rpb24oKnNlY3Rpb25faXRlcikpIHsKLSAgICAgIC8vIGlmIG5vIGxpbmsga2V5IGluIHNlY3Rpb24gYWZ0ZXIgcmVtb3ZhbCwgbW92ZSBpdCB0byB1bnBhaXJlZCBzZWN0aW9uCi0gICAgICBhdXRvIG1vdmVkX3NlY3Rpb24gPSBzdGQ6Om1vdmUoKnNlY3Rpb25faXRlcik7Ci0gICAgICBwYWlyZWRfZGV2aWNlc19saXN0Xy5zZWN0aW9ucy5lcmFzZShzZWN0aW9uX2l0ZXIpOwotICAgICAgdW5wYWlyZWRfZGV2aWNlc19jYWNoZV8uUHV0KHNlY3Rpb25fbmFtZSwgc3RkOjptb3ZlKG1vdmVkX3NlY3Rpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEJ0aWZDb25maWdDYWNoZTo6R2V0UGVyc2lzdGVudFNlY3Rpb25OYW1lcygpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdDsKLSAgcmVzdWx0LnJlc2VydmUocGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBzZWN0aW9uIDogcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMpIHsKLSAgICByZXN1bHQuZW1wbGFjZV9iYWNrKHNlY3Rpb24ubmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogY2xvbmUgcGVyc2lzdGVudCBzZWN0aW9ucyAoTG9jYWwgQWRhcHRlciBzZWN0aW9ucywgcmVtb3RlIHBhaXJlZCBkZXZpY2VzCi0gKiBzZWN0aW9uLC4uKSAqLwotY29uZmlnX3QgQnRpZkNvbmZpZ0NhY2hlOjpQZXJzaXN0ZW50U2VjdGlvbkNvcHkoKSB7Ci0gIHJldHVybiBwYWlyZWRfZGV2aWNlc19saXN0XzsKLX0KLQotdm9pZCBCdGlmQ29uZmlnQ2FjaGU6OlNldFN0cmluZyhzdGQ6OnN0cmluZyBzZWN0aW9uX25hbWUsIHN0ZDo6c3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUpIHsKLSAgaWYgKHRyaW1fbmV3X2xpbmUoc2VjdGlvbl9uYW1lKSB8fCB0cmltX25ld19saW5lKGtleSkgfHwKLSAgICAgIHRyaW1fbmV3X2xpbmUodmFsdWUpKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDgwODI3MyIpOwotICB9Ci0gIGlmIChzZWN0aW9uX25hbWUuZW1wdHkoKSkgewotICAgIExPRyhGQVRBTCkgPDwgIkVtcHR5IHNlY3Rpb24gbm90IGFsbG93ZWQiOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoa2V5LmVtcHR5KCkpIHsKLSAgICBMT0coRkFUQUwpIDw8ICJFbXB0eSBrZXkgbm90IGFsbG93ZWQiOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBhaXJlZF9kZXZpY2VzX2xpc3RfLkhhcyhzZWN0aW9uX25hbWUpKSB7Ci0gICAgLy8gc2VjdGlvbiBpcyBub3QgaW4gcGFpcmVkX2RldmljZV9saXN0LCBoYW5kbGUgaXQgaW4gdW5wYWlyZWQgZGV2aWNlcyBjYWNoZQotICAgIHNlY3Rpb25fdCBzZWN0aW9uID0ge307Ci0gICAgYm9vbCBpbl91bnBhaXJlZF9jYWNoZSA9IHRydWU7Ci0gICAgaWYgKCF1bnBhaXJlZF9kZXZpY2VzX2NhY2hlXy5HZXQoc2VjdGlvbl9uYW1lLCAmc2VjdGlvbikpIHsKLSAgICAgIC8vIGl0J3MgYSBuZXcgdW5wYWlyZWQgc2VjdGlvbiwgYWRkIGl0IHRvIHVucGFpcmVkIGRldmljZXMgY2FjaGUKLSAgICAgIHNlY3Rpb24ubmFtZSA9IHNlY3Rpb25fbmFtZTsKLSAgICAgIGluX3VucGFpcmVkX2NhY2hlID0gZmFsc2U7Ci0gICAgfQotICAgIC8vIHNldCBrZXkgdG8gdmFsdWUgYW5kIHJlcGxhY2UgZXhpc3Rpbmcga2V5IGlmIGFscmVhZHkgZXhpc3QKLSAgICBzZWN0aW9uLlNldChrZXksIHZhbHVlKTsKLQotICAgIGlmIChpc19sb2NhbF9zZWN0aW9uX2luZm8oc2VjdGlvbl9uYW1lKSB8fAotICAgICAgICAoaXNfbGlua19rZXkoa2V5KSAmJiBSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcyhzZWN0aW9uX25hbWUpKSkgewotICAgICAgLy8gcmVtb3ZlIHRoaXMgc2VjdGlvbiB0aGF0IGhhcyB0aGUgTGlua0tleSBmcm9tIHVucGFpcmVkIGRldmljZXMgY2FjaGUuCi0gICAgICBpZiAoaW5fdW5wYWlyZWRfY2FjaGUpIHsKLSAgICAgICAgdW5wYWlyZWRfZGV2aWNlc19jYWNoZV8uUmVtb3ZlKHNlY3Rpb25fbmFtZSk7Ci0gICAgICB9Ci0gICAgICAvLyB3aGVuIGEgdW5wYWlyZWQgc2VjdGlvbiBnb3QgdGhlIExpbmtLZXksIG1vdmUgdGhpcyBzZWN0aW9uIHRvIHRoZQotICAgICAgLy8gcGFpcmVkIGRldmljZXMgbGlzdAotICAgICAgcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShzZWN0aW9uKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHVwZGF0ZSB0byB0aGUgdW5wYWlyZWQgZGV2aWNlcyBjYWNoZQotICAgICAgdW5wYWlyZWRfZGV2aWNlc19jYWNoZV8uUHV0KHNlY3Rpb25fbmFtZSwgc2VjdGlvbik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIGFscmVhZHkgaGF2ZSBzZWN0aW9uIGluIHBhaXJlZCBkZXZpY2UgbGlzdCwgYWRkIGtleS12YWx1ZSBlbnRyeS4KLSAgICBhdXRvIHNlY3Rpb25fZm91bmQgPSBwYWlyZWRfZGV2aWNlc19saXN0Xy5GaW5kKHNlY3Rpb25fbmFtZSk7Ci0gICAgaWYgKHNlY3Rpb25fZm91bmQgPT0gcGFpcmVkX2RldmljZXNfbGlzdF8uc2VjdGlvbnMuZW5kKCkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiICwgc2VjdGlvbl9mb3VuZCBub3QgZm91bmQhIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2VjdGlvbl9mb3VuZC0+U2V0KGtleSwgdmFsdWUpOwotICB9Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEJ0aWZDb25maWdDYWNoZTo6R2V0U3RyaW5nKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgLy8gQ2hlY2sgcGFpcmVkIHNlY3Rpb25zIGZpcnN0Ci0gIGF1dG8gc2VjdGlvbl9pdGVyID0gcGFpcmVkX2RldmljZXNfbGlzdF8uRmluZChzZWN0aW9uX25hbWUpOwotICBpZiAoc2VjdGlvbl9pdGVyICE9IHBhaXJlZF9kZXZpY2VzX2xpc3RfLnNlY3Rpb25zLmVuZCgpKSB7Ci0gICAgYXV0byBlbnRyeV9pdGVyID0gc2VjdGlvbl9pdGVyLT5GaW5kKGtleSk7Ci0gICAgaWYgKGVudHJ5X2l0ZXIgPT0gc2VjdGlvbl9pdGVyLT5lbnRyaWVzLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICByZXR1cm4gZW50cnlfaXRlci0+dmFsdWU7Ci0gIH0KLSAgLy8gQ2hlY2sgdW5wYWlyZWQgc2VjdGlvbnMgbGF0ZXIKLSAgc2VjdGlvbl90IHNlY3Rpb24gPSB7fTsKLSAgaWYgKCF1bnBhaXJlZF9kZXZpY2VzX2NhY2hlXy5HZXQoc2VjdGlvbl9uYW1lLCAmc2VjdGlvbikpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIGF1dG8gZW50cnlfaXRlciA9IHNlY3Rpb24uRmluZChrZXkpOwotICBpZiAoZW50cnlfaXRlciA9PSBzZWN0aW9uLmVudHJpZXMuZW5kKCkpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiBlbnRyeV9pdGVyLT52YWx1ZTsKLX0KLQotdm9pZCBCdGlmQ29uZmlnQ2FjaGU6OlNldEludChzdGQ6OnN0cmluZyBzZWN0aW9uX25hbWUsIHN0ZDo6c3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSB7Ci0gIFNldFN0cmluZyhzdGQ6Om1vdmUoc2VjdGlvbl9uYW1lKSwgc3RkOjptb3ZlKGtleSksIHN0ZDo6dG9fc3RyaW5nKHZhbHVlKSk7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8aW50PiBCdGlmQ29uZmlnQ2FjaGU6OkdldEludChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgYXV0byB2YWx1ZSA9IEdldFN0cmluZyhzZWN0aW9uX25hbWUsIGtleSk7Ci0gIGlmICghdmFsdWUpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIGNoYXIqIGVuZHB0cjsKLSAgbG9uZyByZXRfbG9uZyA9IHN0cnRvbCh2YWx1ZS0+Y19zdHIoKSwgJmVuZHB0ciwgMCk7Ci0gIGlmICgqZW5kcHRyICE9ICdcMCcpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBwYXJzZSB2YWx1ZSB0byBsb25nIGZvciBzZWN0aW9uICIgPDwgc2VjdGlvbl9uYW1lCi0gICAgICAgICAgICAgICAgIDw8ICIsIGtleSAiIDw8IGtleTsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIGlmIChyZXRfbG9uZyA+PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJJbnRlZ2VyIG92ZXJmbG93IHdoZW4gcGFyc2luZyB2YWx1ZSB0byBpbnQgZm9yIHNlY3Rpb24gIgotICAgICAgICAgICAgICAgICA8PCBzZWN0aW9uX25hbWUgPDwgIiwga2V5ICIgPDwga2V5OwotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocmV0X2xvbmcpOwotfQotCi12b2lkIEJ0aWZDb25maWdDYWNoZTo6U2V0VWludDY0KHN0ZDo6c3RyaW5nIHNlY3Rpb25fbmFtZSwgc3RkOjpzdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSkgewotICBTZXRTdHJpbmcoc3RkOjptb3ZlKHNlY3Rpb25fbmFtZSksIHN0ZDo6bW92ZShrZXkpLCBzdGQ6OnRvX3N0cmluZyh2YWx1ZSkpOwotfQotCi1zdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBCdGlmQ29uZmlnQ2FjaGU6OkdldFVpbnQ2NCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIGF1dG8gdmFsdWUgPSBHZXRTdHJpbmcoc2VjdGlvbl9uYW1lLCBrZXkpOwotICBpZiAoIXZhbHVlKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBjaGFyKiBlbmRwdHI7Ci0gIHVpbnQ2NF90IHJldCA9IHN0cnRvdWxsKHZhbHVlLT5jX3N0cigpLCAmZW5kcHRyLCAwKTsKLSAgaWYgKCplbmRwdHIgIT0gJ1wwJykgewotICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHZhbHVlIHRvIHVpbnQ2NCBmb3Igc2VjdGlvbiAiCi0gICAgICAgICAgICAgICAgIDw8IHNlY3Rpb25fbmFtZSA8PCAiLCBrZXkgIiA8PCBrZXk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi12b2lkIEJ0aWZDb25maWdDYWNoZTo6U2V0Qm9vbChzdGQ6OnN0cmluZyBzZWN0aW9uX25hbWUsIHN0ZDo6c3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsdWUpIHsKLSAgU2V0U3RyaW5nKHN0ZDo6bW92ZShzZWN0aW9uX25hbWUpLCBzdGQ6Om1vdmUoa2V5KSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLX0KLQotc3RkOjpvcHRpb25hbDxib29sPiBCdGlmQ29uZmlnQ2FjaGU6OkdldEJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgYXV0byB2YWx1ZSA9IEdldFN0cmluZyhzZWN0aW9uX25hbWUsIGtleSk7Ci0gIGlmICghdmFsdWUpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIGlmICgqdmFsdWUgPT0gInRydWUiKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKCp2YWx1ZSA9PSAiZmFsc2UiKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHZhbHVlIHRvIGJvb2xlYW4gZm9yIHNlY3Rpb24gIgotICAgICAgICAgICAgICAgPDwgc2VjdGlvbl9uYW1lIDw8ICIsIGtleSAiIDw8IGtleTsKLSAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfY29uZmlnX3RyYW5zY29kZS5jYyBiL2J0aWYvc3JjL2J0aWZfY29uZmlnX3RyYW5zY29kZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmNDJhNi4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2NvbmZpZ190cmFuc2NvZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9jb25maWdfdHJhbnNjb2RlIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29uZmlnLmgiCi0KLSNpZm5kZWYgT1NfQU5EUk9JRAotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBidGlmX2NvbmZpZ190cmFuc2NvZGUoY29uc3QgY2hhciogeG1sX2ZpbGVuYW1lKSB7Ci0gIC8vIExlZ2FjeSBYTUwgY29uZmlnIG5ldmVyIGV4aXN0cyBmb3Igbm9uLUFuZHJvaWQKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0jZWxzZQotI2luY2x1ZGUgPHRpbnl4bWwyLmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHRpbnl4bWwyOwotCi1zdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGJ0aWZfY29uZmlnX3RyYW5zY29kZShjb25zdCBjaGFyKiB4bWxfZmlsZW5hbWUpIHsKLSAgWE1MRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIGludCBlcnJvciA9IGRvY3VtZW50LkxvYWRGaWxlKHhtbF9maWxlbmFtZSk7Ci0gIGlmIChlcnJvciAhPSBYTUxfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGxvYWQgWE1MIGZpbGUgJyVzJzogJWQiLCBfX2Z1bmNfXywgeG1sX2ZpbGVuYW1lLAotICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBYTUxFbGVtZW50KiByb290RWxlbWVudCA9IGRvY3VtZW50LlJvb3RFbGVtZW50KCk7Ci0gIGlmICghcm9vdEVsZW1lbnQpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBmaW5kIHJvb3QgZWxlbWVudDsgYXNzdW1pbmcgY29ycnVwdGVkIGNvbmZpZyBmaWxlLiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnID0gY29uZmlnX25ld19lbXB0eSgpOwotCi0gIGZvciAoWE1MRWxlbWVudCogaSA9IHJvb3RFbGVtZW50LT5GaXJzdENoaWxkRWxlbWVudCgpOyBpICE9IE5VTEw7Ci0gICAgICAgaSA9IGktPk5leHRTaWJsaW5nRWxlbWVudCgpKQotICAgIGZvciAoWE1MRWxlbWVudCogaiA9IGktPkZpcnN0Q2hpbGRFbGVtZW50KCk7IGogIT0gTlVMTDsKLSAgICAgICAgIGogPSBqLT5OZXh0U2libGluZ0VsZW1lbnQoKSkgewotICAgICAgY29uc3QgY2hhciogc2VjdGlvbiA9IGotPkF0dHJpYnV0ZSgiVGFnIik7Ci0gICAgICBmb3IgKFhNTEVsZW1lbnQqIGsgPSBqLT5GaXJzdENoaWxkRWxlbWVudCgpOyBrICE9IE5VTEw7Ci0gICAgICAgICAgIGsgPSBrLT5OZXh0U2libGluZ0VsZW1lbnQoKSkgewotICAgICAgICBjb25zdCBjaGFyKiBrZXkgPSBrLT5BdHRyaWJ1dGUoIlRhZyIpOwotICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSA9IGstPkdldFRleHQoKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gJiYga2V5ICYmIHZhbHVlKQotICAgICAgICAgIGNvbmZpZ19zZXRfc3RyaW5nKGNvbmZpZy5nZXQoKSwgc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIHJldHVybiBjb25maWc7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfY29yZS5jYyBiL2J0aWYvc3JjL2J0aWZfY29yZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4OTk5MC4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2NvcmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfY29yZS5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIENvbnRhaW5zIGNvcmUgZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIGludGVyZmFjaW5nIGJldHdlZW4KLSAqICAgICAgICAgICAgICAgICBCbHVldG9vdGggSEFMIGFuZCBCVEUgY29yZSBzdGFjay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfY29yZSIKLQotI2luY2x1ZGUgPGJhc2UvYXRfZXhpdC5oPgotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZG0uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9wYW4uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9wcm9maWxlX3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc29jay5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2EyZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6UGxhdGZvcm1UaHJlYWQ7Ci11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQ7Ci0KLXN0YXRpYyB2b2lkIGJ0X2puaV9tc2dfcmVhZHkodm9pZCogY29udGV4dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJURV9ESURfQ09ORl9GSUxFCi0vLyBUT0RPKGFybWFuc2l0byk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gc2VhcmNoaW5nIGJ5IGEgaGFyZGNvZGVkIHBhdGguCi0jaWYgZGVmaW5lZChUQVJHRVRfRkxPU1MpCi0jZGVmaW5lIEJURV9ESURfQ09ORl9GSUxFICIvdmFyL2xpYi9ibHVldG9vdGgvYnRfZGlkLmNvbmYiCi0jZWxpZiBkZWZpbmVkKE9TX0dFTkVSSUMpCi0jZGVmaW5lIEJURV9ESURfQ09ORl9GSUxFICJidF9kaWQuY29uZiIKLSNlbHNlICAvLyAhZGVmaW5lZChPU19HRU5FUklDKQotI2RlZmluZSBCVEVfRElEX0NPTkZfRklMRSAiL2V0Yy9ibHVldG9vdGgvYnRfZGlkLmNvbmYiCi0jZW5kaWYgIC8vIGRlZmluZWQoT1NfR0VORVJJQykKLSNlbmRpZiAgLy8gQlRFX0RJRF9DT05GX0ZJTEUKLQotI2RlZmluZSBDT0RFQ19UWVBFX05VTUJFUiAzMgotI2RlZmluZSBERUZBVUxUX0JVRkZFUl9USU1FIChNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDSyAqIDIpCi0jZGVmaW5lIE1BWElNVU1fQlVGRkVSX1RJTUUgKE1BWF9QQ01fRlJBTUVfTlVNX1BFUl9USUNLICogMikKLSNkZWZpbmUgTUlOSU1VTV9CVUZGRVJfVElNRSBNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDSwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB0QlRBX1NFUlZJQ0VfTUFTSyBidGlmX2VuYWJsZWRfc2VydmljZXMgPSAwOwotCi0vKgotICogVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgc2V0IHRvIDEsIGlmIHRoZSBCbHVlZHJvaWQrQlRJRiBsaWJyYXJpZXMgYXJlIHRvCi0gKiBmdW5jdGlvbiBpbiBEVVQgbW9kZS4KLSAqCi0gKiBUbyBzZXQgdGhpcywgdGhlIGJ0aWZfaW5pdF9ibHVldG9vdGggbmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggYXJndW1lbnQgYXMgMQotICovCi1zdGF0aWMgdWludDhfdCBidGlmX2R1dF9tb2RlID0gMDsKLQotc3RhdGljIE1lc3NhZ2VMb29wVGhyZWFkIGpuaV90aHJlYWQoImJ0X2puaV90aHJlYWQiKTsKLXN0YXRpYyBiYXNlOjpBdEV4aXRNYW5hZ2VyKiBleGl0X21hbmFnZXI7Ci1zdGF0aWMgdWlkX3NldF90KiB1aWRfc2V0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fZW5hYmxlX3NlcnZpY2UodEJUQV9TRVJWSUNFX0lEIHNlcnZpY2VfaWQsIGJvb2wgZW5hYmxlKTsKLSNpZmRlZiBCVElGX0RNX09PQl9URVNUCi12b2lkIGJ0aWZfZG1fbG9hZF9sb2NhbF9vb2Iodm9pZCk7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzd2l0Y2hlcyBjb250ZXh0IHRvIGJ0aWYgdGFzawotICoKLSAqICAgICAgICAgICAgICAgICAgcF9jYmFjayAgIDogY2FsbGJhY2sgdXNlZCB0byBwcm9jZXNzIG1lc3NhZ2UgaW4gYnRpZiBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgICAgIGV2ZW50ICAgICA6IGV2ZW50IGlkIG9mIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgcF9wYXJhbXMgIDogcGFyYW1ldGVyIGFyZWEgcGFzc2VkIHRvIGNhbGxiYWNrIChjb3BpZWQpCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtX2xlbiA6IGxlbmd0aCBvZiBwYXJhbWV0ZXIgYXJlYQotICogICAgICAgICAgICAgICAgICBwX2NvcHlfY2JhY2sgOiBJZiBzZXQgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgZm9yIGRlZXAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJ0X3N0YXR1c190IGJ0aWZfdHJhbnNmZXJfY29udGV4dCh0QlRJRl9DQkFDSyogcF9jYmFjaywgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9wYXJhbXMsIGludCBwYXJhbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUSUZfQ09QWV9DQkFDSyogcF9jb3B5X2NiYWNrKSB7Ci0gIHRCVElGX0NPTlRFWFRfU1dJVENIX0NCQUNLKiBwX21zZyA9ICh0QlRJRl9DT05URVhUX1NXSVRDSF9DQkFDSyopb3NpX21hbGxvYygKLSAgICAgIHNpemVvZih0QlRJRl9DT05URVhUX1NXSVRDSF9DQkFDSykgKyBwYXJhbV9sZW4pOwotCi0gIEJUSUZfVFJBQ0VfVkVSQk9TRSgiYnRpZl90cmFuc2Zlcl9jb250ZXh0IGV2ZW50ICVkLCBsZW4gJWQiLCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2xlbik7Ci0KLSAgLyogYWxsb2NhdGUgYW5kIHNlbmQgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gYnRpZiBjb250ZXh0ICovCi0gIHBfbXNnLT5oZHIuZXZlbnQgPSBCVF9FVlRfQ09OVEVYVF9TV0lUQ0hfRVZUOyAvKiBpbnRlcm5hbCBldmVudCAqLwotICBwX21zZy0+cF9jYiA9IHBfY2JhY2s7Ci0KLSAgcF9tc2ctPmV2ZW50ID0gZXZlbnQ7IC8qIGNhbGxiYWNrIGV2ZW50ICovCi0KLSAgLyogY2hlY2sgaWYgY2FsbGVyIGhhcyBwcm92aWRlZCBhIGNvcHkgY2FsbGJhY2sgdG8gZG8gdGhlIGRlZXAgY29weSAqLwotICBpZiAocF9jb3B5X2NiYWNrKSB7Ci0gICAgcF9jb3B5X2NiYWNrKGV2ZW50LCBwX21zZy0+cF9wYXJhbSwgcF9wYXJhbXMpOwotICB9IGVsc2UgaWYgKHBfcGFyYW1zKSB7Ci0gICAgbWVtY3B5KHBfbXNnLT5wX3BhcmFtLCBwX3BhcmFtcywgcGFyYW1fbGVuKTsgLyogY2FsbGJhY2sgcGFyYW1ldGVyIGRhdGEgKi8KLSAgfQotCi0gIGRvX2luX2puaV90aHJlYWQoYmFzZTo6QmluZCgmYnRfam5pX21zZ19yZWFkeSwgcF9tc2cpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gcG9zdHMgYSB0YXNrIGludG8gdGhlIGJ0aWYgbWVzc2FnZSBsb29wLCB0aGF0IGV4ZWN1dGVzIGl0IGluCi0gKiB0aGUgSk5JIG1lc3NhZ2UgbG9vcC4KLSAqKi8KLWJ0X3N0YXR1c190IGRvX2luX2puaV90aHJlYWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaykgewotICBpZiAoIWpuaV90aHJlYWQuRG9JblRocmVhZChmcm9tX2hlcmUsIHN0ZDo6bW92ZSh0YXNrKSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFBvc3QgdGFzayB0byB0YXNrIHJ1bm5lciBmYWlsZWQhIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBkb19pbl9qbmlfdGhyZWFkKGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2spIHsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBzdGQ6Om1vdmUodGFzaykpOwotfQotCi1ib29sIGlzX29uX2puaV90aHJlYWQoKSB7Ci0gIHJldHVybiBqbmlfdGhyZWFkLkdldFRocmVhZElkKCkgPT0gUGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpOwotfQotCi1idGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AqIGdldF9qbmlfbWVzc2FnZV9sb29wKCkgewotICByZXR1cm4gam5pX3RocmVhZC5tZXNzYWdlX2xvb3AoKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fcG9zdF9vbl9idF9qbmkoQnRKbmlDbG9zdXJlIGNsb3N1cmUpIHsgY2xvc3VyZSgpOyB9Ci0KLXZvaWQgcG9zdF9vbl9idF9qbmkoQnRKbmlDbG9zdXJlIGNsb3N1cmUpIHsKLSAgQVNTRVJUKGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGRvX3Bvc3Rfb25fYnRfam5pLCBzdGQ6Om1vdmUoY2xvc3VyZSkpKSA9PQotICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9pc19kdXRfbW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2tzIGlmIEJUSUYgaXMgY3VycmVudGx5IGluIERVVCBtb2RlCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHRlc3QgbW9kZSwgb3RoZXJ3aXNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYm9vbCBidGlmX2lzX2R1dF9tb2RlKCkgeyByZXR1cm4gYnRpZl9kdXRfbW9kZSA9PSAxOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2lzX2VuYWJsZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrcyBpZiBtYWluIGFkYXB0ZXIgaXMgZnVsbHkgZW5hYmxlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgMSBpZiBmdWxseSBlbmFibGVkLCBvdGhlcndpemUgMAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBidGlmX2lzX2VuYWJsZWQodm9pZCkgewotICByZXR1cm4gKCghYnRpZl9pc19kdXRfbW9kZSgpKSAmJgotICAgICAgICAgIChzdGFja19tYW5hZ2VyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X3N0YWNrX2lzX3J1bm5pbmcoKSkpOwotfQotCi12b2lkIGJ0aWZfaW5pdF9vaygpIHsKLSAgYnRpZl9kbV9sb2FkX2JsZV9sb2NhbF9rZXlzKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3Rhc2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgdGFzayBoYW5kbGVyIG1hbmFnaW5nIGFsbCBtZXNzYWdlcyBiZWluZyBwYXNzZWQKLSAqICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoIEhBTCBhbmQgQlRBLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidF9qbmlfbXNnX3JlYWR5KHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUSUZfQ09OVEVYVF9TV0lUQ0hfQ0JBQ0sqIHAgPSAodEJUSUZfQ09OVEVYVF9TV0lUQ0hfQ0JBQ0sqKWNvbnRleHQ7Ci0gIGlmIChwLT5wX2NiKSBwLT5wX2NiKHAtPmV2ZW50LCBwLT5wX3BhcmFtKTsKLSAgb3NpX2ZyZWUocCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2luaXRfYmx1ZXRvb3RoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGVzIEJUSUYgdGFzayBhbmQgcHJlcGFyZXMgQlQgc2NoZWR1bGVyIGZvciBzdGFydHVwCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX2luaXRfYmx1ZXRvb3RoKCkgewotICBMT0dfSU5GTygiJXMgZW50ZXJlZCIsIF9fZnVuY19fKTsKLSAgZXhpdF9tYW5hZ2VyID0gbmV3IGJhc2U6OkF0RXhpdE1hbmFnZXIoKTsKLSAgam5pX3RocmVhZC5TdGFydFVwKCk7Ci0gIGludm9rZV90aHJlYWRfZXZ0X2NiKEFTU09DSUFURV9KVk0pOwotICBMT0dfSU5GTygiJXMgZmluaXNoZWQiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJvb2wgYnRpZl9pc19hMmRwX29mZmxvYWRfZW5hYmxlZCgpIHsKLSAgY2hhciB2YWx1ZV9zdXBbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsnXDAnfTsKLSAgY2hhciB2YWx1ZV9kaXNbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsnXDAnfTsKLSAgYm9vbCBhMmRwX29mZmxvYWRfZW5hYmxlZF87Ci0KLSAgb3NpX3Byb3BlcnR5X2dldCgicm8uYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5zdXBwb3J0ZWQiLCB2YWx1ZV9zdXAsICJmYWxzZSIpOwotICBvc2lfcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuZGlzYWJsZWQiLCB2YWx1ZV9kaXMsCi0gICAgICAgICAgICAgICAgICAgImZhbHNlIik7Ci0gIGEyZHBfb2ZmbG9hZF9lbmFibGVkXyA9Ci0gICAgICAoc3RyY21wKHZhbHVlX3N1cCwgInRydWUiKSA9PSAwKSAmJiAoc3RyY21wKHZhbHVlX2RpcywgImZhbHNlIikgPT0gMCk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoImEyZHBfb2ZmbG9hZC5lbmFibGUgPSAlZCIsIGEyZHBfb2ZmbG9hZF9lbmFibGVkXyk7Ci0KLSAgcmV0dXJuIGEyZHBfb2ZmbG9hZF9lbmFibGVkXzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZW5hYmxlX2JsdWV0b290aF9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV2ZW50IGluZGljYXRpbmcgYmx1ZXRvb3RoIGVuYWJsZSBpcyBjb21wbGV0ZWQKLSAqICAgICAgICAgICAgICAgICAgTm90aWZpZXMgSEFMIHVzZXIgd2l0aCB1cGRhdGVkIGFkYXB0ZXIgc3RhdGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJ0aWZfZW5hYmxlX2JsdWV0b290aF9ldnQoKSB7Ci0gIC8qIEZldGNoIHRoZSBsb2NhbCBCRCBBRERSICovCi0gIFJhd0FkZHJlc3MgbG9jYWxfYmRfYWRkciA9ICpjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FkZHJlc3MoKTsKLQotICBzdGQ6OnN0cmluZyBiZHN0ciA9IGxvY2FsX2JkX2FkZHIuVG9TdHJpbmcoKTsKLQotICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdID0gIiI7Ci0gIGludCB2YWxfc2l6ZSA9IFBST1BFUlRZX1ZBTFVFX01BWDsKLSAgaWYgKCFidGlmX2NvbmZpZ19nZXRfc3RyKCJBZGFwdGVyIiwgIkFkZHJlc3MiLCB2YWwsICZ2YWxfc2l6ZSkgfHwKLSAgICAgIHN0cmNtcChiZHN0ci5jX3N0cigpLCB2YWwpICE9IDApIHsKLSAgICAvLyBXZSBmYWlsZWQgdG8gZ2V0IGFuIGFkZHJlc3Mgb3IgdGhlIG9uZSBpbiB0aGUgY29uZmlnIGZpbGUgZG9lcyBub3QgbWF0Y2gKLSAgICAvLyB0aGUgYWRkcmVzcyBnaXZlbiBieSB0aGUgY29udHJvbGxlciBpbnRlcmZhY2UuIFVwZGF0ZSB0aGUgY29uZmlnIGNhY2hlCi0gICAgTE9HX0lORk8oIiVzOiBTdG9yaW5nICclcycgaW50byB0aGUgY29uZmlnIGZpbGUiLCBfX2Z1bmNfXywgYmRzdHIuY19zdHIoKSk7Ci0gICAgYnRpZl9jb25maWdfc2V0X3N0cigiQWRhcHRlciIsICJBZGRyZXNzIiwgYmRzdHIuY19zdHIoKSk7Ci0gICAgYnRpZl9jb25maWdfc2F2ZSgpOwotCi0gICAgLy8gZmlyZSBIQUwgY2FsbGJhY2sgZm9yIHByb3BlcnR5IGNoYW5nZQotICAgIGJ0X3Byb3BlcnR5X3QgcHJvcDsKLSAgICBwcm9wLnR5cGUgPSBCVF9QUk9QRVJUWV9CREFERFI7Ci0gICAgcHJvcC52YWwgPSAodm9pZCopJmxvY2FsX2JkX2FkZHI7Ci0gICAgcHJvcC5sZW4gPSBzaXplb2YoUmF3QWRkcmVzcyk7Ci0gICAgaW52b2tlX2FkYXB0ZXJfcHJvcGVydGllc19jYihCVF9TVEFUVVNfU1VDQ0VTUywgMSwgJnByb3ApOwotICB9Ci0KLSAgLyogY2FsbGJhY2sgdG8gSEFMICovCi0gIHVpZF9zZXQgPSB1aWRfc2V0X2NyZWF0ZSgpOwotCi0gIGJ0aWZfZG1faW5pdCh1aWRfc2V0KTsKLQotICAvKiBpbml0IHJmY29tbSAmIGwyY2FwIGFwaSAqLwotICBidGlmX3NvY2tfaW5pdCh1aWRfc2V0KTsKLQotICAvKiBpbml0IHBhbiAqLwotICBidGlmX3Bhbl9pbml0KCk7Ci0KLSAgLyogbG9hZCBkaWQgY29uZmlndXJhdGlvbiAqLwotICBidGVfbG9hZF9kaWRfY29uZihCVEVfRElEX0NPTkZfRklMRSk7Ci0KLSNpZmRlZiBCVElGX0RNX09PQl9URVNUCi0gIGJ0aWZfZG1fbG9hZF9sb2NhbF9vb2IoKTsKLSNlbmRpZgotCi0gIGZ1dHVyZV9yZWFkeShzdGFja19tYW5hZ2VyX2dldF9oYWNrX2Z1dHVyZSgpLCBGVVRVUkVfU1VDQ0VTUyk7Ci0gIExPR19JTkZPKCJCbHVldG9vdGggZW5hYmxlIGV2ZW50IGNvbXBsZXRlZCIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9jbGVhbnVwX2JsdWV0b290aAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xlYW51cCBCVElGIHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJ0X3N0YXR1c190IGJ0aWZfY2xlYW51cF9ibHVldG9vdGgoKSB7Ci0gIExPR19JTkZPKCIlcyBlbnRlcmVkIiwgX19mdW5jX18pOwotICBidGlmX2RtX2NsZWFudXAoKTsKLSAgaW52b2tlX3RocmVhZF9ldnRfY2IoRElTQVNTT0NJQVRFX0pWTSk7Ci0gIGJ0aWZfcXVldWVfcmVsZWFzZSgpOwotICBqbmlfdGhyZWFkLlNodXREb3duKCk7Ci0gIGRlbGV0ZSBleGl0X21hbmFnZXI7Ci0gIGV4aXRfbWFuYWdlciA9IG51bGxwdHI7Ci0gIGJ0aWZfZHV0X21vZGUgPSAwOwotICBMT0dfSU5GTygiJXMgZmluaXNoZWQiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZHV0X21vZGVfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgQ2FsbGJhY2sgaW52b2tlZCBvbiBjb21wbGV0aW9uIG9mIHZlbmRvciBzcGVjaWZpYyB0ZXN0IG1vZGUKLSAqICAgICAgICAgICAgICAgICBjb21tYW5kCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfZHV0X21vZGVfY2JhY2soVU5VU0VEX0FUVFIgdEJUTV9WU0NfQ01QTCogcCkgewotICAvKiBGb3Igbm93IG5vdGhpbmcgdG8gYmUgZG9uZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZHV0X21vZGVfY29uZmlndXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb25maWd1cmUgVGVzdCBNb2RlIC0gJ2VuYWJsZScgdG8gMSBwdXRzIHRoZSBkZXZpY2UgaW4gdGVzdAotICogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgYW5kIDAgZXhpdHMgdGVzdCBtb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kdXRfbW9kZV9jb25maWd1cmUodWludDhfdCBlbmFibGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRpZl9kdXRfbW9kZSA9IGVuYWJsZTsKLSAgaWYgKGVuYWJsZSA9PSAxKSB7Ci0gICAgQlRBX0VuYWJsZVRlc3RNb2RlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQ2FuJ3QgZG8gaW4gcHJvY2VzcyByZXNldCBhbnl3YXlzIC0ganVzdCBxdWl0Ci0gICAga2lsbChnZXRwaWQoKSwgU0lHS0lMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZHV0X21vZGVfc2VuZAotICoKLSAqIERlc2NyaXB0aW9uICAgICBTZW5kcyBhIEhDSSBWZW5kb3Igc3BlY2lmaWMgY29tbWFuZCB0byB0aGUgY29udHJvbGxlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZHV0X21vZGVfc2VuZCh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQob3Bjb2RlLCBsZW4sIGJ1ZiwgYnRpZl9kdXRfbW9kZV9jYmFjayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgYnRpZiBhcGkgYWRhcHRlciBwcm9wZXJ0eSBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfaW5fZ2V0X2FkYXB0ZXJfcHJvcGVydGllcyh2b2lkKSB7Ci0gIGNvbnN0IHN0YXRpYyB1aW50MzJfdCBOVU1fQURBUFRFUl9QUk9QRVJUSUVTID0gODsKLSAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0aWVzW05VTV9BREFQVEVSX1BST1BFUlRJRVNdOwotICB1aW50MzJfdCBudW1fcHJvcHMgPSAwOwotCi0gIFJhd0FkZHJlc3MgYWRkcjsKLSAgYnRfYmRuYW1lX3QgbmFtZTsKLSAgYnRfc2Nhbl9tb2RlX3QgbW9kZTsKLSAgdWludDMyX3QgZGlzY190aW1lb3V0OwotICBSYXdBZGRyZXNzIGJvbmRlZF9kZXZpY2VzW0JUTV9TRUNfTUFYX0RFVklDRV9SRUNPUkRTXTsKLSAgVXVpZCBsb2NhbF91dWlkc1tCVF9NQVhfTlVNX1VVSURTXTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotICBidF9pb19jYXBfdCBsb2NhbF9idF9pb19jYXA7Ci0gIGJ0X2lvX2NhcF90IGxvY2FsX2J0X2lvX2NhcF9ibGU7Ci0KLSAgLyogUmF3QWRkcmVzcyAqLwotICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydGllc1tudW1fcHJvcHNdLCBCVF9QUk9QRVJUWV9CREFERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZGRyKSwgJmFkZHIpOwotICBzdGF0dXMgPSBidGlmX3N0b3JhZ2VfZ2V0X2FkYXB0ZXJfcHJvcGVydHkoJnByb3BlcnRpZXNbbnVtX3Byb3BzXSk7Ci0gIC8vIEFkZCBCVF9QUk9QRVJUWV9CREFERFIgcHJvcGVydHkgaW50byBsaXN0IG9ubHkgd2hlbiBzdWNjZXNzZnVsLgotICAvLyBPdGhlcndpc2UsIHNraXAgdGhpcyBwcm9wZXJ0eSBlbnRyeS4KLSAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIG51bV9wcm9wcysrOwotICB9Ci0KLSAgLyogQkRfTkFNRSAqLwotICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydGllc1tudW1fcHJvcHNdLCBCVF9QUk9QRVJUWV9CRE5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuYW1lKSwgJm5hbWUpOwotICBidGlmX3N0b3JhZ2VfZ2V0X2FkYXB0ZXJfcHJvcGVydHkoJnByb3BlcnRpZXNbbnVtX3Byb3BzXSk7Ci0gIG51bV9wcm9wcysrOwotCi0gIC8qIFNDQU5fTU9ERSAqLwotICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydGllc1tudW1fcHJvcHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9BREFQVEVSX1NDQU5fTU9ERSwgc2l6ZW9mKG1vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSk7Ci0gIGJ0aWZfc3RvcmFnZV9nZXRfYWRhcHRlcl9wcm9wZXJ0eSgmcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgbnVtX3Byb3BzKys7Ci0KLSAgLyogRElTQ19USU1FT1VUICovCi0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wZXJ0aWVzW251bV9wcm9wc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX0FEQVBURVJfRElTQ09WRVJZX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNjX3RpbWVvdXQpLCAmZGlzY190aW1lb3V0KTsKLSAgYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wZXJ0aWVzW251bV9wcm9wc10pOwotICBudW1fcHJvcHMrKzsKLQotICAvKiBCT05ERURfREVWSUNFUyAqLwotICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydGllc1tudW1fcHJvcHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9BREFQVEVSX0JPTkRFRF9ERVZJQ0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYm9uZGVkX2RldmljZXMpLCBib25kZWRfZGV2aWNlcyk7Ci0gIGJ0aWZfc3RvcmFnZV9nZXRfYWRhcHRlcl9wcm9wZXJ0eSgmcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgbnVtX3Byb3BzKys7Ci0KLSAgLyogTE9DQUwgVVVJRHMgKi8KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BzXSwgQlRfUFJPUEVSVFlfVVVJRFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb2NhbF91dWlkcyksIGxvY2FsX3V1aWRzKTsKLSAgYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wZXJ0aWVzW251bV9wcm9wc10pOwotICBudW1fcHJvcHMrKzsKLQotICAvKiBMT0NBTCBJTyBDYXBhYmlsaXRpZXMgKi8KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BzXSwgQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0X2lvX2NhcF90KSwgJmxvY2FsX2J0X2lvX2NhcCk7Ci0gIGJ0aWZfc3RvcmFnZV9nZXRfYWRhcHRlcl9wcm9wZXJ0eSgmcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgbnVtX3Byb3BzKys7Ci0KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQU19CTEUsIHNpemVvZihidF9pb19jYXBfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbF9idF9pb19jYXBfYmxlKTsKLSAgYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wZXJ0aWVzW251bV9wcm9wc10pOwotICBudW1fcHJvcHMrKzsKLQotICBpbnZva2VfYWRhcHRlcl9wcm9wZXJ0aWVzX2NiKEJUX1NUQVRVU19TVUNDRVNTLCBudW1fcHJvcHMsIHByb3BlcnRpZXMpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2luX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBidF9wcm9wZXJ0eV90IHJlbW90ZV9wcm9wZXJ0aWVzWzhdOwotICB1aW50MzJfdCBudW1fcHJvcHMgPSAwOwotCi0gIGJ0X2JkbmFtZV90IG5hbWUsIGFsaWFzOwotICB1aW50MzJfdCBjb2QsIGRldnR5cGU7Ci0gIFV1aWQgcmVtb3RlX3V1aWRzW0JUX01BWF9OVU1fVVVJRFNdOwotCi0gIG1lbXNldChyZW1vdGVfcHJvcGVydGllcywgMCwgc2l6ZW9mKHJlbW90ZV9wcm9wZXJ0aWVzKSk7Ci0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZyZW1vdGVfcHJvcGVydGllc1tudW1fcHJvcHNdLCBCVF9QUk9QRVJUWV9CRE5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuYW1lKSwgJm5hbWUpOwotICBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZW1vdGVfcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgbnVtX3Byb3BzKys7Ci0KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnJlbW90ZV9wcm9wZXJ0aWVzW251bV9wcm9wc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX1JFTU9URV9GUklFTkRMWV9OQU1FLCBzaXplb2YoYWxpYXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXMpOwotICBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZW1vdGVfcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgbnVtX3Byb3BzKys7Ci0KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnJlbW90ZV9wcm9wZXJ0aWVzW251bV9wcm9wc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRSwgc2l6ZW9mKGNvZCksICZjb2QpOwotICBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZW1vdGVfcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgbnVtX3Byb3BzKys7Ci0KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnJlbW90ZV9wcm9wZXJ0aWVzW251bV9wcm9wc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFLCBzaXplb2YoZGV2dHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZ0eXBlKTsKLSAgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVtb3RlX3Byb3BlcnRpZXNbbnVtX3Byb3BzXSk7Ci0gIG51bV9wcm9wcysrOwotCi0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZyZW1vdGVfcHJvcGVydGllc1tudW1fcHJvcHNdLCBCVF9QUk9QRVJUWV9VVUlEUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZV91dWlkcyksIHJlbW90ZV91dWlkcyk7Ci0gIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlbW90ZV9wcm9wZXJ0aWVzW251bV9wcm9wc10pOwotICBudW1fcHJvcHMrKzsKLQotICBpbnZva2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiKEJUX1NUQVRVU19TVUNDRVNTLCAqYmRfYWRkciwgbnVtX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9wcm9wZXJ0aWVzKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfY29yZV9zdG9yYWdlX2FkYXB0ZXJfbm90aWZ5X2VtcHR5X3N1Y2Nlc3MoKSB7Ci0gIGludm9rZV9hZGFwdGVyX3Byb3BlcnRpZXNfY2IoQlRfU1RBVFVTX1NVQ0NFU1MsIDAsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2NvcmVfc3RvcmFnZV9hZGFwdGVyX3dyaXRlKGJ0X3Byb3BlcnR5X3QqIHByb3ApIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgidHlwZTogJWQsIGxlbiAlZCwgMHgleCIsIHByb3AtPnR5cGUsIHByb3AtPmxlbiwgcHJvcC0+dmFsKTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gYnRpZl9zdG9yYWdlX3NldF9hZGFwdGVyX3Byb3BlcnR5KHByb3ApOwotICBpbnZva2VfYWRhcHRlcl9wcm9wZXJ0aWVzX2NiKHN0YXR1cywgMSwgcHJvcCk7Ci19Ci0KLXZvaWQgYnRpZl9hZGFwdGVyX3Byb3BlcnRpZXNfZXZ0KGJ0X3N0YXR1c190IHN0YXR1cywgdWludDMyX3QgbnVtX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcF9wcm9wcykgewotICBpbnZva2VfYWRhcHRlcl9wcm9wZXJ0aWVzX2NiKHN0YXR1cywgbnVtX3Byb3BzLCBwX3Byb3BzKTsKLX0KLXZvaWQgYnRpZl9yZW1vdGVfcHJvcGVydGllc19ldnQoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX3Byb3BzLCBidF9wcm9wZXJ0eV90KiBwX3Byb3BzKSB7Ci0gIGludm9rZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2Ioc3RhdHVzLCAqcmVtb3RlX2FkZHIsIG51bV9wcm9wcywgcF9wcm9wcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2dldF9hZGFwdGVyX3Byb3BlcnRpZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZldGNoIGFsbCBhdmFpbGFibGUgcHJvcGVydGllcyAobG9jYWwgJiByZW1vdGUpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBidGlmX2dldF9hZGFwdGVyX3Byb3BlcnRpZXModm9pZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGlmX2luX2dldF9hZGFwdGVyX3Byb3BlcnRpZXMoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZ2V0X2FkYXB0ZXJfcHJvcGVydHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZldGNoZXMgcHJvcGVydHkgdmFsdWUgZnJvbSBsb2NhbCBjYWNoZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYnRpZl9nZXRfYWRhcHRlcl9wcm9wZXJ0eShidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyAlZCIsIF9fZnVuY19fLCB0eXBlKTsKLQotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgY2hhciBidWZbNTEyXTsKLSAgYnRfcHJvcGVydHlfdCBwcm9wOwotICBwcm9wLnR5cGUgPSB0eXBlOwotICBwcm9wLnZhbCA9ICh2b2lkKilidWY7Ci0gIHByb3AubGVuID0gc2l6ZW9mKGJ1Zik7Ci0gIGlmIChwcm9wLnR5cGUgPT0gQlRfUFJPUEVSVFlfTE9DQUxfTEVfRkVBVFVSRVMpIHsKLSAgICB0QlRNX0JMRV9WU0NfQ0IgY21uX3ZzY19jYjsKLSAgICBidF9sb2NhbF9sZV9mZWF0dXJlc190IGxvY2FsX2xlX2ZlYXR1cmVzOwotCi0gICAgLyogTEUgZmVhdHVyZXMgYXJlIG5vdCBzdG9yZWQgaW4gc3RvcmFnZS4gU2hvdWxkIGJlIHJldHJpdmVkIGZyb20gc3RhY2sKLSAgICAgKi8KLSAgICBCVE1fQmxlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCZjbW5fdnNjX2NiKTsKLSAgICBsb2NhbF9sZV9mZWF0dXJlcy5sb2NhbF9wcml2YWN5X2VuYWJsZWQgPSBCVE1fQmxlTG9jYWxQcml2YWN5RW5hYmxlZCgpOwotCi0gICAgcHJvcC5sZW4gPSBzaXplb2YoYnRfbG9jYWxfbGVfZmVhdHVyZXNfdCk7Ci0gICAgaWYgKGNtbl92c2NfY2IuZmlsdGVyX3N1cHBvcnQgPT0gMSkKLSAgICAgIGxvY2FsX2xlX2ZlYXR1cmVzLm1heF9hZHZfZmlsdGVyX3N1cHBvcnRlZCA9IGNtbl92c2NfY2IubWF4X2ZpbHRlcjsKLSAgICBlbHNlCi0gICAgICBsb2NhbF9sZV9mZWF0dXJlcy5tYXhfYWR2X2ZpbHRlcl9zdXBwb3J0ZWQgPSAwOwotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLm1heF9hZHZfaW5zdGFuY2UgPSBjbW5fdnNjX2NiLmFkdl9pbnN0X21heDsKLSAgICBsb2NhbF9sZV9mZWF0dXJlcy5tYXhfaXJrX2xpc3Rfc2l6ZSA9IGNtbl92c2NfY2IubWF4X2lya19saXN0X3N6OwotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLnJwYV9vZmZsb2FkX3N1cHBvcnRlZCA9IGNtbl92c2NfY2IucnBhX29mZmxvYWRpbmc7Ci0gICAgbG9jYWxfbGVfZmVhdHVyZXMuc2Nhbl9yZXN1bHRfc3RvcmFnZV9zaXplID0KLSAgICAgICAgY21uX3ZzY19jYi50b3Rfc2Nhbl9yZXN1bHRzX3N0cmc7Ci0gICAgbG9jYWxfbGVfZmVhdHVyZXMuYWN0aXZpdHlfZW5lcmd5X2luZm9fc3VwcG9ydGVkID0KLSAgICAgICAgY21uX3ZzY19jYi5lbmVyZ3lfc3VwcG9ydDsKLSAgICBsb2NhbF9sZV9mZWF0dXJlcy52ZXJzaW9uX3N1cHBvcnRlZCA9IGNtbl92c2NfY2IudmVyc2lvbl9zdXBwb3J0ZWQ7Ci0gICAgbG9jYWxfbGVfZmVhdHVyZXMudG90YWxfdHJhY2thYmxlX2FkdmVydGlzZXJzID0KLSAgICAgICAgY21uX3ZzY19jYi50b3RhbF90cmFja2FibGVfYWR2ZXJ0aXNlcnM7Ci0KLSAgICBsb2NhbF9sZV9mZWF0dXJlcy5leHRlbmRlZF9zY2FuX3N1cHBvcnQgPQotICAgICAgICBjbW5fdnNjX2NiLmV4dGVuZGVkX3NjYW5fc3VwcG9ydCA+IDA7Ci0gICAgbG9jYWxfbGVfZmVhdHVyZXMuZGVidWdfbG9nZ2luZ19zdXBwb3J0ZWQgPQotICAgICAgICBjbW5fdnNjX2NiLmRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkID4gMDsKLSAgICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLQotICAgIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19ibGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmcoKSkgewotICAgICAgbG9jYWxfbGVfZmVhdHVyZXMubWF4X2Fkdl9pbnN0YW5jZSA9Ci0gICAgICAgICAgY29udHJvbGxlci0+Z2V0X2JsZV9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHMoKTsKLSAgICB9Ci0gICAgbG9jYWxfbGVfZmVhdHVyZXMubGVfMm1fcGh5X3N1cHBvcnRlZCA9IGNvbnRyb2xsZXItPnN1cHBvcnRzX2JsZV8ybV9waHkoKTsKLSAgICBsb2NhbF9sZV9mZWF0dXJlcy5sZV9jb2RlZF9waHlfc3VwcG9ydGVkID0KLSAgICAgICAgY29udHJvbGxlci0+c3VwcG9ydHNfYmxlX2NvZGVkX3BoeSgpOwotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLmxlX2V4dGVuZGVkX2FkdmVydGlzaW5nX3N1cHBvcnRlZCA9Ci0gICAgICAgIGNvbnRyb2xsZXItPnN1cHBvcnRzX2JsZV9leHRlbmRlZF9hZHZlcnRpc2luZygpOwotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N1cHBvcnRlZCA9Ci0gICAgICAgIGNvbnRyb2xsZXItPnN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZygpOwotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGggPQotICAgICAgICBjb250cm9sbGVyLT5nZXRfYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGgoKTsKLQotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLmR5bmFtaWNfYXVkaW9fYnVmZmVyX3N1cHBvcnRlZCA9Ci0gICAgICAgIGNtbl92c2NfY2IuZHluYW1pY19hdWRpb19idWZmZXJfc3VwcG9ydDsKLQotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfc2VuZGVyX3N1cHBvcnRlZCA9Ci0gICAgICAgIGNvbnRyb2xsZXItPnN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlcigpOwotICAgIGxvY2FsX2xlX2ZlYXR1cmVzLmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fY2VudHJhbF9zdXBwb3J0ZWQgPQotICAgICAgICBjb250cm9sbGVyLT5zdXBwb3J0c19ibGVfY29ubmVjdGVkX2lzb2Nocm9ub3VzX3N0cmVhbV9jZW50cmFsKCk7Ci0gICAgbWVtY3B5KHByb3AudmFsLCAmbG9jYWxfbGVfZmVhdHVyZXMsIHByb3AubGVuKTsKLSAgfSBlbHNlIGlmIChwcm9wLnR5cGUgPT0gQlRfUFJPUEVSVFlfRFlOQU1JQ19BVURJT19CVUZGRVIpIHsKLSAgICB0QlRNX0JMRV9WU0NfQ0IgY21uX3ZzY19jYjsKLSAgICBidF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9pdGVtX3QgZHluYW1pY19hdWRpb19idWZmZXJfaXRlbTsKLQotICAgIEJUTV9CbGVHZXRWZW5kb3JDYXBhYmlsaXRpZXMoJmNtbl92c2NfY2IpOwotCi0gICAgcHJvcC5sZW4gPSBzaXplb2YoYnRfZHluYW1pY19hdWRpb19idWZmZXJfaXRlbV90KTsKLSAgICBpZiAoYnRpZl9pc19hMmRwX29mZmxvYWRfZW5hYmxlZCgpID09IGZhbHNlKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBHZXQgYnVmZmVyIG1pbGxpcyBmb3IgQTJEUCBzb2Z0d2FyZSBlbmNvZGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09ERUNfVFlQRV9OVU1CRVI7IGkrKykgewotICAgICAgICBkeW5hbWljX2F1ZGlvX2J1ZmZlcl9pdGVtLmRhYl9pdGVtW2ldID0gewotICAgICAgICAgICAgLmRlZmF1bHRfYnVmZmVyX3RpbWUgPSBERUZBVUxUX0JVRkZFUl9USU1FLAotICAgICAgICAgICAgLm1heGltdW1fYnVmZmVyX3RpbWUgPSBNQVhJTVVNX0JVRkZFUl9USU1FLAotICAgICAgICAgICAgLm1pbmltdW1fYnVmZmVyX3RpbWUgPSBNSU5JTVVNX0JVRkZFUl9USU1FfTsKLSAgICAgIH0KLSAgICAgIG1lbWNweShwcm9wLnZhbCwgJmR5bmFtaWNfYXVkaW9fYnVmZmVyX2l0ZW0sIHByb3AubGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGNtbl92c2NfY2IuZHluYW1pY19hdWRpb19idWZmZXJfc3VwcG9ydCAhPSAwKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIEdldCBidWZmZXIgbWlsbGlzIGZvciBBMkRQIE9mZmxvYWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHRCVE1fQlRfRFlOQU1JQ19BVURJT19CVUZGRVJfQ0IKLSAgICAgICAgICAgIGJ0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX2NiW0NPREVDX1RZUEVfTlVNQkVSXTsKLSAgICAgICAgQlRNX0JsZUdldER5bmFtaWNBdWRpb0J1ZmZlcihidF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9jYik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT0RFQ19UWVBFX05VTUJFUjsgaSsrKSB7Ci0gICAgICAgICAgZHluYW1pY19hdWRpb19idWZmZXJfaXRlbS5kYWJfaXRlbVtpXSA9IHsKLSAgICAgICAgICAgICAgLmRlZmF1bHRfYnVmZmVyX3RpbWUgPQotICAgICAgICAgICAgICAgICAgYnRfZHluYW1pY19hdWRpb19idWZmZXJfY2JbaV0uZGVmYXVsdF9idWZmZXJfdGltZSwKLSAgICAgICAgICAgICAgLm1heGltdW1fYnVmZmVyX3RpbWUgPQotICAgICAgICAgICAgICAgICAgYnRfZHluYW1pY19hdWRpb19idWZmZXJfY2JbaV0ubWF4aW11bV9idWZmZXJfdGltZSwKLSAgICAgICAgICAgICAgLm1pbmltdW1fYnVmZmVyX3RpbWUgPQotICAgICAgICAgICAgICAgICAgYnRfZHluYW1pY19hdWRpb19idWZmZXJfY2JbaV0ubWluaW11bV9idWZmZXJfdGltZX07Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KHByb3AudmFsLCAmZHluYW1pY19hdWRpb19idWZmZXJfaXRlbSwgcHJvcC5sZW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgRG9uJ3Qgc3VwcG9ydCBEeW5hbWljIEF1ZGlvIEJ1ZmZlciIsIF9fZnVuY19fKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdHVzID0gYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wKTsKLSAgfQotICBpbnZva2VfYWRhcHRlcl9wcm9wZXJ0aWVzX2NiKHN0YXR1cywgMSwgJnByb3ApOwotfQotCi1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9kZWVwX2NvcHkoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcCkgewotICBidF9wcm9wZXJ0eV90KiBjb3B5ID0KLSAgICAgIChidF9wcm9wZXJ0eV90Kilvc2lfY2FsbG9jKHNpemVvZihidF9wcm9wZXJ0eV90KSArIHByb3AtPmxlbik7Ci0gIGNvcHktPnR5cGUgPSBwcm9wLT50eXBlOwotICBjb3B5LT5sZW4gPSBwcm9wLT5sZW47Ci0gIGNvcHktPnZhbCA9ICh1aW50OF90KikoY29weSArIDEpOwotICBtZW1jcHkoY29weS0+dmFsLCBwcm9wLT52YWwsIHByb3AtPmxlbik7Ci0gIHJldHVybiBjb3B5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zZXRfYWRhcHRlcl9wcm9wZXJ0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlcyBjb3JlIHN0YWNrIHdpdGggcHJvcGVydHkgdmFsdWUgYW5kIHN0b3JlcyBpdCBpbgotICogICAgICAgICAgICAgICAgICBsb2NhbCBjYWNoZQotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJ0aWZfc2V0X2FkYXB0ZXJfcHJvcGVydHkoYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiYnRpZl9zZXRfYWRhcHRlcl9wcm9wZXJ0eSB0eXBlOiAlZCwgbGVuICVkLCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+dHlwZSwgcHJvcGVydHktPmxlbiwgcHJvcGVydHktPnZhbCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eS0+dHlwZSkgewotICAgIGNhc2UgQlRfUFJPUEVSVFlfQkROQU1FOiB7Ci0gICAgICBjaGFyIGJkX25hbWVbQlRNX01BWF9MT0NfQkRfTkFNRV9MRU4gKyAxXTsKLSAgICAgIHVpbnQxNl90IG5hbWVfbGVuID0gcHJvcGVydHktPmxlbiA+IEJUTV9NQVhfTE9DX0JEX05BTUVfTEVOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJUTV9NQVhfTE9DX0JEX05BTUVfTEVOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByb3BlcnR5LT5sZW47Ci0gICAgICBtZW1jcHkoYmRfbmFtZSwgcHJvcGVydHktPnZhbCwgbmFtZV9sZW4pOwotICAgICAgYmRfbmFtZVtuYW1lX2xlbl0gPSAnXDAnOwotCi0gICAgICBCVElGX1RSQUNFX0VWRU5UKCJzZXQgcHJvcGVydHkgbmFtZSA6ICVzIiwgKGNoYXIqKWJkX25hbWUpOwotCi0gICAgICBCVEFfRG1TZXREZXZpY2VOYW1lKChjaGFyKiliZF9uYW1lKTsKLQotICAgICAgYnRpZl9jb3JlX3N0b3JhZ2VfYWRhcHRlcl93cml0ZShwcm9wZXJ0eSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRfUFJPUEVSVFlfQURBUFRFUl9TQ0FOX01PREU6IHsKLSAgICAgIGJ0X3NjYW5fbW9kZV90IG1vZGUgPSAqKGJ0X3NjYW5fbW9kZV90Kilwcm9wZXJ0eS0+dmFsOwotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgic2V0IHByb3BlcnR5IHNjYW4gbW9kZSA6ICV4IiwgbW9kZSk7Ci0KLSAgICAgIGlmIChCVEFfRG1TZXRWaXNpYmlsaXR5KG1vZGUpKSB7Ci0gICAgICAgIGJ0aWZfY29yZV9zdG9yYWdlX2FkYXB0ZXJfd3JpdGUocHJvcGVydHkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX0RJU0NPVkVSWV9USU1FT1VUOiB7Ci0gICAgICAvKiBOb3RoaW5nIHRvIGRvIGJlc2lkZSBzdG9yZSB0aGUgdmFsdWUgaW4gTlYuICBKYXZhCi0gICAgICAgICB3aWxsIGNoYW5nZSB0aGUgU0NBTl9NT0RFIHByb3BlcnR5IGFmdGVyIHNldHRpbmcgdGltZW91dCwKLSAgICAgICAgIGlmIHJlcXVpcmVkICovCi0gICAgICBidGlmX2NvcmVfc3RvcmFnZV9hZGFwdGVyX3dyaXRlKHByb3BlcnR5KTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFOiB7Ci0gICAgICBERVZfQ0xBU1MgZGV2X2NsYXNzOwotICAgICAgbWVtY3B5KGRldl9jbGFzcywgcHJvcGVydHktPnZhbCwgREVWX0NMQVNTX0xFTik7Ci0KLSAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoInNldCBwcm9wZXJ0eSBkZXZfY2xhc3MgOiAweCUwMnglMDJ4JTAyeCIsIGRldl9jbGFzc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGV2X2NsYXNzWzFdLCBkZXZfY2xhc3NbMl0pOwotCi0gICAgICBCVE1fU2V0RGV2aWNlQ2xhc3MoZGV2X2NsYXNzKTsKLSAgICAgIGJ0aWZfY29yZV9zdG9yYWdlX2FkYXB0ZXJfbm90aWZ5X2VtcHR5X3N1Y2Nlc3MoKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQUzoKLSAgICBjYXNlIEJUX1BST1BFUlRZX0xPQ0FMX0lPX0NBUFNfQkxFOiB7Ci0gICAgICAvLyBDaGFuZ2luZyBJTyBDYXBhYmlsaXR5IG9mIHN0YWNrIGF0IHJ1bi10aW1lIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotICAgICAgLy8gVGhpcyBjYWxsIGNoYW5nZXMgdGhlIHN0b3JlZCB2YWx1ZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgc3RhY2sgbmV4dAotICAgICAgLy8gdGltZSBpdCBzdGFydHMgdXAuCi0gICAgICBidGlmX2NvcmVfc3RvcmFnZV9hZGFwdGVyX3dyaXRlKHByb3BlcnR5KTsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmV0Y2hlcyB0aGUgcmVtb3RlIGRldmljZSBwcm9wZXJ0eSBmcm9tIHRoZSBOVlJBTQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoUmF3QWRkcmVzcyByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICBjaGFyIGJ1ZlsxMDI0XTsKLSAgYnRfcHJvcGVydHlfdCBwcm9wOwotICBwcm9wLnR5cGUgPSB0eXBlOwotICBwcm9wLnZhbCA9ICh2b2lkKilidWY7Ci0gIHByb3AubGVuID0gc2l6ZW9mKGJ1Zik7Ci0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmcmVtb3RlX2FkZHIsICZwcm9wKTsKLSAgaW52b2tlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYihzdGF0dXMsIHJlbW90ZV9hZGRyLCAxLCAmcHJvcCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZldGNoZXMgYWxsIHRoZSByZW1vdGUgZGV2aWNlIHByb3BlcnRpZXMgZnJvbSBOVlJBTQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhSYXdBZGRyZXNzIHJlbW90ZV9hZGRyKSB7Ci0gIGJ0aWZfaW5fZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcygmcmVtb3RlX2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgV3JpdGVzIHRoZSByZW1vdGUgZGV2aWNlIHByb3BlcnR5IHRvIE5WUkFNLgotICogICAgICAgICAgICAgICAgICBDdXJyZW50bHksIEJUX1BST1BFUlRZX1JFTU9URV9GUklFTkRMWV9OQU1FIGlzIHRoZSBvbmx5Ci0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkocmVtb3RlX2FkZHIsIHByb3BlcnR5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZ2V0X2VuYWJsZWRfc2VydmljZXNfbWFzawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmV0Y2hlcyBjdXJyZW50bHkgZW5hYmxlZCBzZXJ2aWNlcwotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9TRVJWSUNFX01BU0sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10QlRBX1NFUlZJQ0VfTUFTSyBidGlmX2dldF9lbmFibGVkX3NlcnZpY2VzX21hc2sodm9pZCkgewotICByZXR1cm4gYnRpZl9lbmFibGVkX3NlcnZpY2VzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9lbmFibGVfc2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlcyB0aGUgc2VydmljZSAnc2VydmljZV9JRCcgdG8gdGhlIHNlcnZpY2VfbWFzay4KLSAqICAgICAgICAgICAgICAgICAgVXBvbiBCVCBlbmFibGUsIEJUSUYgY29yZSBzaGFsbCBpbnZva2UgdGhlIEJUQSBBUElzIHRvCi0gKiAgICAgICAgICAgICAgICAgIGVuYWJsZSB0aGUgcHJvZmlsZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2VuYWJsZV9zZXJ2aWNlKHRCVEFfU0VSVklDRV9JRCBzZXJ2aWNlX2lkKSB7Ci0gIGJ0aWZfZW5hYmxlZF9zZXJ2aWNlcyB8PSAoMSA8PCBzZXJ2aWNlX2lkKTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3VycmVudCBzZXJ2aWNlczoweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYnRpZl9lbmFibGVkX3NlcnZpY2VzKTsKLQotICBpZiAoYnRpZl9pc19lbmFibGVkKCkpIHsKLSAgICBidGlmX2RtX2VuYWJsZV9zZXJ2aWNlKHNlcnZpY2VfaWQsIHRydWUpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kaXNhYmxlX3NlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGVzIHRoZSBzZXJ2aWNlICdzZXJ2aWNlX0lEJyB0byB0aGUgc2VydmljZV9tYXNrLgotICogICAgICAgICAgICAgICAgICBVcG9uIEJUIGRpc2FibGUsIEJUSUYgY29yZSBzaGFsbCBpbnZva2UgdGhlIEJUQSBBUElzIHRvCi0gKiAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIHByb2ZpbGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kaXNhYmxlX3NlcnZpY2UodEJUQV9TRVJWSUNFX0lEIHNlcnZpY2VfaWQpIHsKLSAgYnRpZl9lbmFibGVkX3NlcnZpY2VzICY9ICh0QlRBX1NFUlZJQ0VfTUFTSykofigxIDw8IHNlcnZpY2VfaWQpKTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogQ3VycmVudCBTZXJ2aWNlczoweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYnRpZl9lbmFibGVkX3NlcnZpY2VzKTsKLQotICBpZiAoYnRpZl9pc19lbmFibGVkKCkpIHsKLSAgICBidGlmX2RtX2VuYWJsZV9zZXJ2aWNlKHNlcnZpY2VfaWQsIGZhbHNlKTsKLSAgfQotfQotCi12b2lkIER5bmFtaWNBdWRpb2J1ZmZlclNpemVDb21wbGV0ZUNhbGxiYWNrKHRCVE1fVlNDX0NNUEwqIHBfdnNjX2NtcGxfcGFyYW1zKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAocF92c2NfY21wbF9wYXJhbXMtPnBhcmFtX2xlbiA8IDEpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBUaGUgbGVuZ3RoIG9mIHJldHVybmVkIHBhcmFtZXRlcnMgaXMgbGVzcyB0aGFuIDEiOwotICAgIHJldHVybjsKLSAgfQotICB1aW50OF90KiBwX2V2ZW50X3BhcmFtX2J1ZiA9IHBfdnNjX2NtcGxfcGFyYW1zLT5wX3BhcmFtX2J1ZjsKLSAgdWludDhfdCBzdGF0dXMgPSAweGZmOwotICB1aW50OF90IG9wY29kZSA9IDB4ZmY7Ci0gIHVpbnQxNl90IHJlc3BvbmRfYnVmZmVyX3RpbWUgPSAweGZmZmY7Ci0KLSAgLy8gW1JldHVybiBQYXJhbWV0ZXJdICAgICAgICAgfCBbU2l6ZV0gICB8IFtQdXJwb3NlXQotICAvLyBTdGF0dXMgICAgICAgICAgICAgICAgICAgICB8IDEgb2N0ZXQgIHwgQ29tbWFuZCBjb21wbGV0ZSBzdGF0dXMKLSAgLy8gRHluYW1pY19BdWRpb19CdWZmZXJfb3Bjb2RlfCAxIG9jdGV0ICB8IDB4MDIgLSBTZXQgYnVmZmVyIHRpbWUKLSAgLy8gQXVkaW9fQ29kZWNfQnVmZmVyX1RpbWUgICAgfCAyIG9jdGV0ICB8IEN1cnJlbnQgYnVmZmVyIHRpbWUKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9ldmVudF9wYXJhbV9idWYpOwotICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogRmFpbCB0byBjb25maWd1cmUgREZUQi4gc3RhdHVzOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3ZzY19jbXBsX3BhcmFtcy0+cGFyYW1fbGVuICE9IDQpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBUaGUgbGVuZ3RoIG9mIHJldHVybmVkIHBhcmFtZXRlcnMgaXMgbm90IGVxdWFsIHRvIDQ6ICIKLSAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKHBfdnNjX2NtcGxfcGFyYW1zLT5wYXJhbV9sZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOChvcGNvZGUsIHBfZXZlbnRfcGFyYW1fYnVmKTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG9wY29kZSA9ICIgPDwgbG9naGV4KG9wY29kZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSAweDAyKSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihyZXNwb25kX2J1ZmZlcl90aW1lLCBwX2V2ZW50X3BhcmFtX2J1Zik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgIDw8ICI6IFN1Y2NlZWQgdG8gY29uZmlndXJlIE1lZGlhIFR4IEJ1ZmZlciwgdXNlZF9idWZmZXJfdGltZSA9ICIKLSAgICAgICAgICAgICAgPDwgbG9naGV4KHJlc3BvbmRfYnVmZmVyX3RpbWUpOwotICB9Ci19Ci0KLWJ0X3N0YXR1c190IGJ0aWZfc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUoaW50IGNvZGVjLCBpbnQgc2l6ZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICB0QlRNX0JMRV9WU0NfQ0IgY21uX3ZzY19jYjsKLSAgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcygmY21uX3ZzY19jYik7Ci0KLSAgaWYgKCFidGlmX2F2X2lzX2EyZHBfb2ZmbG9hZF9lbmFibGVkKCkpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBTZXQgYnVmZmVyIHNpemUgKCVkKSBmb3IgQTJEUCBzb2Z0d2FyZSBlbmNvZGluZyIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2l6ZSk7Ci0gICAgYnRpZl9hdl9zZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSgodWludDhfdChzaXplKSkpOwotICB9IGVsc2UgewotICAgIGlmIChjbW5fdnNjX2NiLmR5bmFtaWNfYXVkaW9fYnVmZmVyX3N1cHBvcnQgIT0gMCkgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgU2V0IGJ1ZmZlciBzaXplICglZCkgZm9yIEEyRFAgb2ZmbG9hZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLSAgICAgIHVpbnQxNl90IGZpcm13YXJlX3R4X2J1ZmZlcl9sZW5ndGhfYnl0ZTsKLSAgICAgIHVpbnQ4X3QgcGFyYW1bM10gPSB7MH07Ci0gICAgICB1aW50OF90KiBwX3BhcmFtID0gcGFyYW07Ci0KLSAgICAgIGZpcm13YXJlX3R4X2J1ZmZlcl9sZW5ndGhfYnl0ZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihzaXplKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZmlybXdhcmVfdHhfYnVmZmVyX2xlbmd0aF9ieXRlOiAiCi0gICAgICAgICAgICAgICAgPDwgZmlybXdhcmVfdHhfYnVmZmVyX2xlbmd0aF9ieXRlOwotCi0gICAgICBVSU5UOF9UT19TVFJFQU0ocF9wYXJhbSwgSENJX0NPTlRST0xMRVJfREFCX1NFVF9CVUZGRVJfVElNRSk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBfcGFyYW0sIGZpcm13YXJlX3R4X2J1ZmZlcl9sZW5ndGhfYnl0ZSk7Ci0gICAgICBCVE1fVmVuZG9yU3BlY2lmaWNDb21tYW5kKEhDSV9DT05UUk9MTEVSX0RBQiwgcF9wYXJhbSAtIHBhcmFtLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0F1ZGlvYnVmZmVyU2l6ZUNvbXBsZXRlQ2FsbGJhY2spOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfY3Npc19jbGllbnQuY2MgYi9idGlmL3NyYy9idGlmX2NzaXNfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRmMDgwLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfY3Npc19jbGllbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9jc2lzLmg+Ci0KLSNpbmNsdWRlICJiaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJidGFfY3Npc19hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiCi0KLXVzaW5nIGJhc2U6OkJpbmQ7Ci11c2luZyBiYXNlOjpPd25lZDsKLXVzaW5nIGJhc2U6OlBhc3NlZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBibHVldG9vdGg6OmNzaXM6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudEludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0dyb3VwTG9ja1N0YXR1czsKLQotdXNpbmcgYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50OwotCi1uYW1lc3BhY2Ugewotc3RkOjp1bmlxdWVfcHRyPENzaXNDbGllbnRJbnRlcmZhY2U+IGNzaXNfY2xpZW50X2luc3RhbmNlOwotY2xhc3MgQ3NpcFNldENvb3JkaW5hdG9yU2VydmljZUludGVyZmFjZUltcGwgOiBwdWJsaWMgQ3Npc0NsaWVudEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENzaXNDbGllbnRDYWxsYmFja3MgewotICB+Q3NpcFNldENvb3JkaW5hdG9yU2VydmljZUludGVyZmFjZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBJbml0KENzaXNDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fOwotICAgIHRoaXMtPmNhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0KLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBCaW5kKCZDc2lzQ2xpZW50OjpJbml0aWFsaXplLCB0aGlzLAotICAgICAgICAgICAgIGpuaV90aHJlYWRfd3JhcHBlcihGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJmJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9jc2lzX2RldmljZXMpKSkpOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHI6ICIgPDwgYWRkcjsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkNzaXNDbGllbnQ6OkNvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoQ3Npc0NsaWVudDo6R2V0KCkpLCBhZGRyKSk7Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcjogIiA8PCBhZGRyOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQ3Npc0NsaWVudDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChDc2lzQ2xpZW50OjpHZXQoKSksIGFkZHIpKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHI6ICIgPDwgYWRkcjsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkNzaXNDbGllbnQ6OlJlbW92ZURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChDc2lzQ2xpZW50OjpHZXQoKSksIGFkZHIpKTsKLSAgfQotCi0gIHZvaWQgTG9ja0dyb3VwKGludCBncm91cF9pZCwgYm9vbCBsb2NrKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBncm91cCBpZDogIiA8PCBncm91cF9pZCA8PCAiIGxvY2s6ICIgPDwgbG9jazsKLQotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIEJpbmQoJkNzaXNDbGllbnQ6OkxvY2tHcm91cCwgVW5yZXRhaW5lZChDc2lzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cF9pZCwgbG9jaywgYmFzZTo6RG9Ob3RoaW5nKCkpKTsKLSAgfQotCi0gIHZvaWQgQ2xlYW51cCh2b2lkKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZDc2lzQ2xpZW50OjpDbGVhblVwKSk7Ci0gIH0KLQotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblN0YXRlIHN0YXRlKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyOiAiIDw8IGFkZHI7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkNzaXNDbGllbnRDYWxsYmFja3M6Ok9uQ29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzXyksIGFkZHIsIHN0YXRlKSk7Ci0gIH0KLQotICB2b2lkIE9uRGV2aWNlQXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGludCBncm91cF9pZCwgaW50IGdyb3VwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyOiAiIDw8IGFkZHIgPDwgIiBncm91cF9pZDogIiA8PCBncm91cF9pZDsKLQotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZDc2lzQ2xpZW50Q2FsbGJhY2tzOjpPbkRldmljZUF2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrc18pLCBhZGRyLCBncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9zaXplLCB1dWlkKSk7Ci0gIH0KLQotICB2b2lkIE9uU2V0TWVtYmVyQXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGludCBncm91cF9pZCkgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcjogIiA8PCBhZGRyIDw8ICIgZ3JvdXAgaWQ6ICIgPDwgZ3JvdXBfaWQ7Ci0KLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQ3Npc0NsaWVudENhbGxiYWNrczo6T25TZXRNZW1iZXJBdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3NfKSwgYWRkciwgZ3JvdXBfaWQpKTsKLSAgfQotCi0gIC8qIENhbGxiYWNrIGZvciBsb2NrIGNoYW5nZWQgaW4gdGhlIGdyb3VwICovCi0gIHZpcnR1YWwgdm9pZCBPbkdyb3VwTG9ja0NoYW5nZWQoaW50IGdyb3VwX2lkLCBib29sIGxvY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc2lzR3JvdXBMb2NrU3RhdHVzIHN0YXR1cykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXAgaWQ6ICIgPDwgZ3JvdXBfaWQgPDwgIiBsb2NrOiAiIDw8IGxvY2tlZAotICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IGludChzdGF0dXMpOwotCi0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBCaW5kKCZDc2lzQ2xpZW50Q2FsbGJhY2tzOjpPbkdyb3VwTG9ja0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzXyksIGdyb3VwX2lkLCBsb2NrZWQsIHN0YXR1cykpOwotICB9Ci0KLSBwcml2YXRlOgotICBDc2lzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3NfOwotfTsKLQotfSAvKiBuYW1lc3BhY2UgKi8KLQotQ3Npc0NsaWVudEludGVyZmFjZSogYnRpZl9jc2lzX2NsaWVudF9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgaWYgKCFjc2lzX2NsaWVudF9pbnN0YW5jZSkKLSAgICBjc2lzX2NsaWVudF9pbnN0YW5jZS5yZXNldChuZXcgQ3NpcFNldENvb3JkaW5hdG9yU2VydmljZUludGVyZmFjZUltcGwoKSk7Ci0KLSAgcmV0dXJuIGNzaXNfY2xpZW50X2luc3RhbmNlLmdldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9kZWJ1Zy5jYyBiL2J0aWYvc3JjL2J0aWZfZGVidWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjY0NzQuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9kZWJ1Zy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2RlYnVnLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfYnRzbm9vcC5oIgotI2luY2x1ZGUgImludGVybmFsX2luY2x1ZGUvYnRfdGFyZ2V0LmgiCi0KLXZvaWQgYnRpZl9kZWJ1Z19pbml0KHZvaWQpIHsKLSNpZiAoQlRTTk9PUF9NRU0gPT0gVFJVRSkKLSAgYnRpZl9kZWJ1Z19idHNub29wX2luaXQoKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9kZWJ1Z19idHNub29wLmNjIGIvYnRpZi9zcmMvYnRpZl9kZWJ1Z19idHNub29wLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJmZGFlLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfZGVidWdfYnRzbm9vcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8cmVzb2x2Lmg+Ci0jaW5jbHVkZSA8emxpYi5oPgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZGVidWcuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9kZWJ1Z19idHNub29wLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvYnRzbm9vcF9tZW0uaCIKLSNpbmNsdWRlICJpbnRlcm5hbF9pbmNsdWRlL2J0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JpbmdidWZmZXIuaCIKLQotI2RlZmluZSBSRURVQ0VfSENJX1RZUEVfVE9fU0lHTklGSUNBTlRfQklUUyh0eXBlKSAoKHR5cGUpID4+IDgpCi0KLS8vIFRvdGFsIGJ0c25vb3AgbWVtb3J5IGxvZyBidWZmZXIgc2l6ZQotI2lmbmRlZiBCVFNOT09QX01FTV9CVUZGRVJfU0laRQotc3RhdGljIGNvbnN0IHNpemVfdCBCVFNOT09QX01FTV9CVUZGRVJfU0laRSA9ICgyNTYgKiAxMDI0KTsKLSNlbmRpZgotCi1zdGF0aWMgc3RkOjptdXRleCBidWZmZXJfbXV0ZXg7Ci1zdGF0aWMgcmluZ2J1ZmZlcl90KiBidWZmZXIgPSBOVUxMOwotc3RhdGljIHVpbnQ2NF90IGxhc3RfdGltZXN0YW1wX21zID0gMDsKLQotc3RhdGljIHNpemVfdCBidHNub29wX2NhbGN1bGF0ZV9wYWNrZXRfbGVuZ3RoKHVpbnQxNl90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLQotc3RhdGljIHZvaWQgYnRzbm9vcF9jYihjb25zdCB1aW50MTZfdCB0eXBlLCBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbGVuZ3RoLCBjb25zdCB1aW50NjRfdCB0aW1lc3RhbXBfdXMpIHsKLSAgYnRzbm9vel9oZWFkZXJfdCBoZWFkZXI7Ci0KLSAgc2l6ZV90IGluY2x1ZGVkX2xlbmd0aCA9IGJ0c25vb3BfY2FsY3VsYXRlX3BhY2tldF9sZW5ndGgodHlwZSwgZGF0YSwgbGVuZ3RoKTsKLSAgaWYgKGluY2x1ZGVkX2xlbmd0aCA9PSAwKSByZXR1cm47Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYnVmZmVyX211dGV4KTsKLQotICAvLyBNYWtlIHJvb20gaW4gdGhlIHJpbmcgYnVmZmVyCi0KLSAgd2hpbGUgKHJpbmdidWZmZXJfYXZhaWxhYmxlKGJ1ZmZlcikgPAotICAgICAgICAgKGluY2x1ZGVkX2xlbmd0aCArIHNpemVvZihidHNub296X2hlYWRlcl90KSkpIHsKLSAgICByaW5nYnVmZmVyX3BvcChidWZmZXIsICh1aW50OF90KikmaGVhZGVyLCBzaXplb2YoYnRzbm9vel9oZWFkZXJfdCkpOwotICAgIHJpbmdidWZmZXJfZGVsZXRlKGJ1ZmZlciwgaGVhZGVyLmxlbmd0aCAtIDEpOwotICB9Ci0KLSAgLy8gSW5zZXJ0IGRhdGEKLSAgaGVhZGVyLnR5cGUgPSBSRURVQ0VfSENJX1RZUEVfVE9fU0lHTklGSUNBTlRfQklUUyh0eXBlKTsKLSAgaGVhZGVyLmxlbmd0aCA9IGluY2x1ZGVkX2xlbmd0aCArIDE7ICAvLyArMSBmb3IgdHlwZSBieXRlCi0gIGhlYWRlci5wYWNrZXRfbGVuZ3RoID0gbGVuZ3RoICsgMTsgICAgLy8gKzEgZm9yIHR5cGUgYnl0ZS4KLSAgaGVhZGVyLmRlbHRhX3RpbWVfbXMgPQotICAgICAgbGFzdF90aW1lc3RhbXBfbXMgPyB0aW1lc3RhbXBfdXMgLSBsYXN0X3RpbWVzdGFtcF9tcyA6IDA7Ci0gIGxhc3RfdGltZXN0YW1wX21zID0gdGltZXN0YW1wX3VzOwotCi0gIHJpbmdidWZmZXJfaW5zZXJ0KGJ1ZmZlciwgKHVpbnQ4X3QqKSZoZWFkZXIsIHNpemVvZihidHNub296X2hlYWRlcl90KSk7Ci0gIHJpbmdidWZmZXJfaW5zZXJ0KGJ1ZmZlciwgZGF0YSwgaW5jbHVkZWRfbGVuZ3RoKTsKLX0KLQotc3RhdGljIHNpemVfdCBidHNub29wX2NhbGN1bGF0ZV9wYWNrZXRfbGVuZ3RoKHVpbnQxNl90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgSENJX0FDTF9IRUFERVJfU0laRSA9IDQ7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgTDJDQVBfSEVBREVSX1NJWkUgPSA0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IEwyQ0FQX0NJRF9PRkZTRVQgPSAoSENJX0FDTF9IRUFERVJfU0laRSArIDIpOwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgTDJDQVBfU0lHTkFMSU5HX0NJRCA9IDB4MDAwMTsKLQotICAvLyBNYXhpbXVtIGFtb3VudCBvZiBBQ0wgZGF0YSB0byBsb2cuCi0gIC8vIEVub3VnaCBmb3IgYW4gUkZDT01NIGZyYW1lIHVwIHRvIHRoZSBmcmFtZSBjaGVjazsKLSAgLy8gbm90IGVub3VnaCBmb3IgYSBISUQgcmVwb3J0IG9yIGF1ZGlvIGRhdGEuCi0gIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX0hDSV9BQ0xfTEVOID0gMTQ7Ci0KLSAgLy8gQ2FsY3VsYXRlIHBhY2tldCBsZW5ndGggdG8gYmUgaW5jbHVkZWQKLQotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEJUX0VWVF9UT19MTV9IQ0lfQ01EOgotICAgICAgcmV0dXJuIGxlbmd0aDsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0JUVV9IQ0lfRVZUOgotICAgICAgcmV0dXJuIGxlbmd0aDsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0xNX0hDSV9BQ0w6Ci0gICAgY2FzZSBCVF9FVlRfVE9fQlRVX0hDSV9BQ0w6IHsKLSAgICAgIHNpemVfdCBsZW5faGNpX2FjbCA9IEhDSV9BQ0xfSEVBREVSX1NJWkUgKyBMMkNBUF9IRUFERVJfU0laRTsKLSAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIGFuIEwyQ0FQIGhlYWRlcgotICAgICAgaWYgKGxlbmd0aCA+IGxlbl9oY2lfYWNsKSB7Ci0gICAgICAgIHVpbnQxNl90IGwyY2FwX2NpZCA9Ci0gICAgICAgICAgICBkYXRhW0wyQ0FQX0NJRF9PRkZTRVRdIHwgKGRhdGFbTDJDQVBfQ0lEX09GRlNFVCArIDFdIDw8IDgpOwotICAgICAgICBpZiAobDJjYXBfY2lkID09IEwyQ0FQX1NJR05BTElOR19DSUQpIHsKLSAgICAgICAgICAvLyBGb3IgdGhlIHNpZ25hbGluZyBDSUQsIHRha2UgdGhlIGZ1bGwgcGFja2V0LgotICAgICAgICAgIC8vIFRoYXQgd2F5LCB0aGUgUFNNIHNldHVwIGlzIGNhcHR1cmVkLCBhbGxvd2luZyBkZWNvZGluZyBvZiBQU01zIGRvd24KLSAgICAgICAgICAvLyB0aGUgcm9hZC4KLSAgICAgICAgICByZXR1cm4gbGVuZ3RoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGFzIG11Y2ggYXMgd2UgcmVhc29uYWJseSBjYW4KLSAgICAgICAgICBsZW5faGNpX2FjbCA9IE1BWF9IQ0lfQUNMX0xFTjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGxlbl9oY2lfYWNsIDwgbGVuZ3RoID8gbGVuX2hjaV9hY2wgOiBsZW5ndGg7Ci0gICAgfQotCi0gICAgY2FzZSBCVF9FVlRfVE9fTE1fSENJX0lTTzoKLSAgICBjYXNlIEJUX0VWVF9UT19CVFVfSENJX0lTTzoKLSAgICAgIHJldHVybiBsZW5ndGg7Ci0KLSAgICBjYXNlIEJUX0VWVF9UT19MTV9IQ0lfU0NPOgotICAgIGNhc2UgQlRfRVZUX1RPX0JUVV9IQ0lfU0NPOgotICAgICAgLy8gV2UncmUgbm90IGxvZ2dpbmcgU0NPIHBhY2tldHMgYXQgdGhpcyB0aW1lIHNpbmNlIHRoZXkgYXJlIG5vdCBjdXJyZW50bHkKLSAgICAgIC8vIHVzZWQuCi0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2RlYnVnX2J0c25vb3BfaW5pdCh2b2lkKSB7Ci0gIGlmIChidWZmZXIgPT0gTlVMTCkgYnVmZmVyID0gcmluZ2J1ZmZlcl9pbml0KEJUU05PT1BfTUVNX0JVRkZFUl9TSVpFKTsKLSAgYnRzbm9vcF9tZW1fc2V0X2NhbGxiYWNrKGJ0c25vb3BfY2IpOwotfQotCi0jaWZuZGVmIE9TX0FORFJPSUQKLXZvaWQgYnRpZl9kZWJ1Z19idHNub29wX2R1bXAoaW50IGZkKSB7fQotI2Vsc2UKLQotLy8gQmxvY2sgc2l6ZSBmb3IgY29weWluZyBidWZmZXJzIChmb3IgY29tcHJlc3Npb24vZW5jb2RpbmcgZXRjLikKLXN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEJMT0NLX1NJWkUgPSAxNjM4NDsKLQotc3RhdGljIGJvb2wgYnRzbm9vcF9jb21wcmVzcyhyaW5nYnVmZmVyX3QqIHJiX2RzdCwgcmluZ2J1ZmZlcl90KiByYl9zcmMpIHsKLSAgQ0hFQ0socmJfZHN0ICE9IE5VTEwpOwotICBDSEVDSyhyYl9zcmMgIT0gTlVMTCk7Ci0KLSAgel9zdHJlYW0genM7Ci0gIHpzLnphbGxvYyA9IFpfTlVMTDsKLSAgenMuemZyZWUgPSBaX05VTEw7Ci0gIHpzLm9wYXF1ZSA9IFpfTlVMTDsKLQotICBpZiAoZGVmbGF0ZUluaXQoJnpzLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pICE9IFpfT0spIHJldHVybiBmYWxzZTsKLQotICBib29sIHJjID0gdHJ1ZTsKLSAgdWludDhfdCBibG9ja19zcmNbQkxPQ0tfU0laRV07Ci0gIHVpbnQ4X3QgYmxvY2tfZHN0W0JMT0NLX1NJWkVdOwotCi0gIGNvbnN0IHNpemVfdCBudW1fYmxvY2tzID0KLSAgICAgIChyaW5nYnVmZmVyX3NpemUocmJfc3JjKSArIEJMT0NLX1NJWkUgLSAxKSAvIEJMT0NLX1NJWkU7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgKytpKSB7Ci0gICAgenMuYXZhaWxfaW4gPQotICAgICAgICByaW5nYnVmZmVyX3BlZWsocmJfc3JjLCBpICogQkxPQ0tfU0laRSwgYmxvY2tfc3JjLCBCTE9DS19TSVpFKTsKLSAgICB6cy5uZXh0X2luID0gYmxvY2tfc3JjOwotCi0gICAgZG8gewotICAgICAgenMuYXZhaWxfb3V0ID0gQkxPQ0tfU0laRTsKLSAgICAgIHpzLm5leHRfb3V0ID0gYmxvY2tfZHN0OwotCi0gICAgICBpbnQgZXJyID0gZGVmbGF0ZSgmenMsIChpID09IG51bV9ibG9ja3MgLSAxKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7Ci0gICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VSUk9SKSB7Ci0gICAgICAgIHJjID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjb25zdCBzaXplX3QgbGVuZ3RoID0gQkxPQ0tfU0laRSAtIHpzLmF2YWlsX291dDsKLSAgICAgIHJpbmdidWZmZXJfaW5zZXJ0KHJiX2RzdCwgYmxvY2tfZHN0LCBsZW5ndGgpOwotICAgIH0gd2hpbGUgKHpzLmF2YWlsX291dCA9PSAwKTsKLSAgfQotCi0gIGRlZmxhdGVFbmQoJnpzKTsKLSAgcmV0dXJuIHJjOwotfQotCi12b2lkIGJ0aWZfZGVidWdfYnRzbm9vcF9kdW1wKGludCBmZCkgewotICByaW5nYnVmZmVyX3QqIHJpbmdidWZmZXIgPSByaW5nYnVmZmVyX2luaXQoQlRTTk9PUF9NRU1fQlVGRkVSX1NJWkUpOwotICBpZiAocmluZ2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgZHByaW50ZihmZCwgIiVzIFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbXByZXNzaW9uIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFByZXBlbmQgcHJlYW1ibGUKLQotICBidHNub296X3ByZWFtYmxlX3QgcHJlYW1ibGU7Ci0gIHByZWFtYmxlLnZlcnNpb24gPSBCVFNOT09aX0NVUlJFTlRfVkVSU0lPTjsKLSAgcHJlYW1ibGUubGFzdF90aW1lc3RhbXBfbXMgPSBsYXN0X3RpbWVzdGFtcF9tczsKLSAgcmluZ2J1ZmZlcl9pbnNlcnQocmluZ2J1ZmZlciwgKHVpbnQ4X3QqKSZwcmVhbWJsZSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0c25vb3pfcHJlYW1ibGVfdCkpOwotCi0gIC8vIENvbXByZXNzIGRhdGEKLQotICB1aW50OF90IGI2NF9pblszXSA9IHswfTsKLSAgY2hhciBiNjRfb3V0WzVdID0gezB9OwotCi0gIHNpemVfdCBsaW5lX2xlbmd0aCA9IDA7Ci0KLSAgYm9vbCByYzsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJ1ZmZlcl9tdXRleCk7Ci0gICAgZHByaW50ZihmZCwgIi0tLSBCRUdJTjpCVFNOT09QX0xPR19TVU1NQVJZICglenUgYnl0ZXMgaW4pIC0tLVxuIiwKLSAgICAgICAgICAgIHJpbmdidWZmZXJfc2l6ZShidWZmZXIpKTsKLSAgICByYyA9IGJ0c25vb3BfY29tcHJlc3MocmluZ2J1ZmZlciwgYnVmZmVyKTsKLSAgfQotCi0gIGlmICghcmMpIHsKLSAgICBkcHJpbnRmKGZkLCAiJXMgTG9nIGNvbXByZXNzaW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgLy8gQmFzZTY0IGVuY29kZSAmIG91dHB1dAotCi0gIHdoaWxlIChyaW5nYnVmZmVyX3NpemUocmluZ2J1ZmZlcikgPiAwKSB7Ci0gICAgc2l6ZV90IHJlYWQgPSByaW5nYnVmZmVyX3BvcChyaW5nYnVmZmVyLCBiNjRfaW4sIDMpOwotICAgIC8vIE1heGltdW0gbGluZSBsZW5ndGggaW4gYnVncmVwb3J0IChzaG91bGQgYmUgbXVsdGlwbGUgb2YgNCBmb3IgYmFzZTY0Ci0gICAgLy8gb3V0cHV0KQotICAgIGNvbnN0ZXhwciB1aW50OF90IE1BWF9MSU5FX0xFTkdUSCA9IDEyODsKLSAgICBpZiAobGluZV9sZW5ndGggPj0gTUFYX0xJTkVfTEVOR1RIKSB7Ci0gICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKLSAgICAgIGxpbmVfbGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgbGluZV9sZW5ndGggKz0gYjY0X250b3AoYjY0X2luLCByZWFkLCBiNjRfb3V0LCA1KTsKLSAgICBkcHJpbnRmKGZkLCAiJXMiLCBiNjRfb3V0KTsKLSAgfQotCi0gIGRwcmludGYoZmQsICJcbi0tLSBFTkQ6QlRTTk9PUF9MT0dfU1VNTUFSWSAtLS1cbiIpOwotCi1lcnJvcjoKLSAgcmluZ2J1ZmZlcl9mcmVlKHJpbmdidWZmZXIpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2RlYnVnX2Nvbm4uY2MgYi9idGlmL3NyYy9idGlmX2RlYnVnX2Nvbm4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZmYzODYuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9kZWJ1Z19jb25uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZGVidWdfY29ubi5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJjb21tb24vdGltZV91dGlsLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBOVU1fQ09OTkVDVElPTl9FVkVOVFMgMTYKLSNkZWZpbmUgVEVNUF9CVUZGRVJfU0laRSAzMAotCi10eXBlZGVmIHN0cnVjdCBjb25uX2V2ZW50X3QgewotICB1aW50NjRfdCB0czsKLSAgYnRpZl9kZWJ1Z19jb25uX3N0YXRlX3Qgc3RhdGU7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB0R0FUVF9ESVNDT05OX1JFQVNPTiBkaXNjb25uZWN0X3JlYXNvbjsKLX0gY29ubl9ldmVudF90OwotCi1zdGF0aWMgY29ubl9ldmVudF90IGNvbm5lY3Rpb25fZXZlbnRzW05VTV9DT05ORUNUSU9OX0VWRU5UU107Ci1zdGF0aWMgdWludDhfdCBjdXJyZW50X2V2ZW50ID0gMDsKLQotc3RhdGljIGNoYXIqIGZvcm1hdF90cyhjb25zdCB1aW50NjRfdCB0cywgY2hhciogYnVmZmVyLCBpbnQgbGVuKSB7Ci0gIGNvbnN0IHVpbnQ2NF90IG1zID0gdHMgLyAxMDAwOwotICBjb25zdCB0aW1lX3Qgc2VjcyA9IG1zIC8gMTAwMDsKLSAgc3RydWN0IHRtKiBwdG0gPSBsb2NhbHRpbWUoJnNlY3MpOwotCi0gIGNoYXIgdGVtcGJ1ZmZbMjBdOwotICBzdHJmdGltZSh0ZW1wYnVmZiwgc2l6ZW9mKHRlbXBidWZmKSwgIiVtLSVkICVIOiVNOiVTIiwgcHRtKTsKLSAgc25wcmludGYoYnVmZmVyLCBsZW4sICIlcy4lMDN1IiwgdGVtcGJ1ZmYsICh1aW50MTZfdCkobXMgJSAxMDAwKSk7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGZvcm1hdF9zdGF0ZShjb25zdCBidGlmX2RlYnVnX2Nvbm5fc3RhdGVfdCBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBCVElGX0RFQlVHX0NPTk5FQ1RFRDoKLSAgICAgIHJldHVybiAiQ09OTkVDVEVEICAgIjsKLSAgICBjYXNlIEJUSUZfREVCVUdfRElTQ09OTkVDVEVEOgotICAgICAgcmV0dXJuICJESVNDT05ORUNURUQiOwotICB9Ci0gIHJldHVybiAiVU5LTk9XTiI7Ci19Ci0KLXN0YXRpYyB2b2lkIG5leHRfZXZlbnQoKSB7Ci0gICsrY3VycmVudF9ldmVudDsKLSAgaWYgKGN1cnJlbnRfZXZlbnQgPT0gTlVNX0NPTk5FQ1RJT05fRVZFTlRTKSBjdXJyZW50X2V2ZW50ID0gMDsKLX0KLQotdm9pZCBidGlmX2RlYnVnX2Nvbm5fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRpZl9kZWJ1Z19jb25uX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0R0FUVF9ESVNDT05OX1JFQVNPTiBkaXNjb25uZWN0X3JlYXNvbikgewotICBuZXh0X2V2ZW50KCk7Ci0KLSAgY29ubl9ldmVudF90KiBldnQgPSAmY29ubmVjdGlvbl9ldmVudHNbY3VycmVudF9ldmVudF07Ci0gIGV2dC0+dHMgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXR0aW1lb2ZkYXlfdXMoKTsKLSAgZXZ0LT5zdGF0ZSA9IHN0YXRlOwotICBldnQtPmRpc2Nvbm5lY3RfcmVhc29uID0gZGlzY29ubmVjdF9yZWFzb247Ci0gIGV2dC0+YmRhID0gYmRhOwotfQotCi12b2lkIGJ0aWZfZGVidWdfY29ubl9kdW1wKGludCBmZCkgewotICBjb25zdCB1aW50OF90IGN1cnJlbnRfZXZlbnRfbG9jYWwgPQotICAgICAgY3VycmVudF9ldmVudDsgIC8vIENhY2hlIHRvIGF2b2lkIHRocmVhZGluZyBpc3N1ZXMKLSAgdWludDhfdCBkdW1wX2V2ZW50ID0gY3VycmVudF9ldmVudF9sb2NhbDsKLSAgY2hhciB0c19idWZmZXJbVEVNUF9CVUZGRVJfU0laRV0gPSB7MH07Ci0KLSAgZHByaW50ZihmZCwgIlxuQ29ubmVjdGlvbiBFdmVudHM6XG4iKTsKLSAgaWYgKGNvbm5lY3Rpb25fZXZlbnRzW2R1bXBfZXZlbnRdLnRzID09IDApIGRwcmludGYoZmQsICIgIE5vbmVcbiIpOwotCi0gIHdoaWxlIChjb25uZWN0aW9uX2V2ZW50c1tkdW1wX2V2ZW50XS50cykgewotICAgIGNvbm5fZXZlbnRfdCogZXZ0ID0gJmNvbm5lY3Rpb25fZXZlbnRzW2R1bXBfZXZlbnRdOwotICAgIGRwcmludGYoZmQsICIgICVzICVzICVzIiwgZm9ybWF0X3RzKGV2dC0+dHMsIHRzX2J1ZmZlciwgc2l6ZW9mKHRzX2J1ZmZlcikpLAotICAgICAgICAgICAgZm9ybWF0X3N0YXRlKGV2dC0+c3RhdGUpLCBldnQtPmJkYS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGlmIChldnQtPnN0YXRlID09IEJUSUZfREVCVUdfRElTQ09OTkVDVEVEKQotICAgICAgZHByaW50ZihmZCwgIiByZWFzb249JWQiLCBldnQtPmRpc2Nvbm5lY3RfcmVhc29uKTsKLSAgICBkcHJpbnRmKGZkLCAiXG4iKTsKLQotICAgIC8vIEdvIHRvIHByZXZpb3VzIGV2ZW50OyB3cmFwIGlmIG5lZWRlZAotICAgIGlmIChkdW1wX2V2ZW50ID4gMCkKLSAgICAgIC0tZHVtcF9ldmVudDsKLSAgICBlbHNlCi0gICAgICBkdW1wX2V2ZW50ID0gTlVNX0NPTk5FQ1RJT05fRVZFTlRTIC0gMTsKLQotICAgIC8vIENoZWNrIGlmIHdlIGR1bXBlZCBhbGwgZXZlbnRzCi0gICAgaWYgKGR1bXBfZXZlbnQgPT0gY3VycmVudF9ldmVudF9sb2NhbCkgYnJlYWs7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfZG0uY2MgYi9idGlmL3NyYy9idGlmX2RtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmQ1MDZjLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfZG0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfZG0uYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBDb250YWlucyBEZXZpY2UgTWFuYWdlbWVudCAoRE0pIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfZG0iCi0KLSNpbmNsdWRlICJidGlmX2RtLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2NzaXMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9oZWFyaW5nX2FpZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2xlX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfdmMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiYWR2ZXJ0aXNlX2RhdGFfcGFyc2VyLmgiCi0jaW5jbHVkZSAiYnRhX2NzaXNfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2RtX2ludC5oIgotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIgotI2luY2x1ZGUgImJ0YV9sZV9hdWRpb19hcGkuaCIKLSNpbmNsdWRlICJidGFfdmNfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL3N0YWNrX21hbmFnZXIuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfYXYuaCIKLSNpbmNsdWRlICJidGlmX2Jxci5oIgotI2luY2x1ZGUgImJ0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZl9kbS5oIgotI2luY2x1ZGUgImJ0aWZfZ2F0dC5oIgotI2luY2x1ZGUgImJ0aWZfaGQuaCIKLSNpbmNsdWRlICJidGlmX2hmLmgiCi0jaW5jbHVkZSAiYnRpZl9oaC5oIgotI2luY2x1ZGUgImJ0aWZfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYnRpZl9zZHAuaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWxfaW5jbHVkZS9zdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IFV1aWQgVVVJRF9IRUFSSU5HX0FJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIkZERjAiKTsKLWNvbnN0IFV1aWQgVVVJRF9WQyA9IFV1aWQ6OkZyb21TdHJpbmcoIjE4NDQiKTsKLWNvbnN0IFV1aWQgVVVJRF9DU0lTID0gVXVpZDo6RnJvbVN0cmluZygiMTg0NiIpOwotY29uc3QgVXVpZCBVVUlEX0xFX0FVRElPID0gVXVpZDo6RnJvbVN0cmluZygiMTg0RSIpOwotCi0jZGVmaW5lIENPRF9NQVNLIDB4MDdGRgotCi0jZGVmaW5lIENPRF9VTkNMQVNTSUZJRUQgKCgweDFGKSA8PCA4KQotI2RlZmluZSBDT0RfSElEX0tFWUJPQVJEIDB4MDU0MAotI2RlZmluZSBDT0RfSElEX1BPSU5USU5HIDB4MDU4MAotI2RlZmluZSBDT0RfSElEX0NPTUJPIDB4MDVDMAotI2RlZmluZSBDT0RfSElEX01BSk9SIDB4MDUwMAotI2RlZmluZSBDT0RfSElEX01BU0sgMHgwNzAwCi0jZGVmaW5lIENPRF9BVl9IRUFEU0VUUyAweDA0MDQKLSNkZWZpbmUgQ09EX0FWX0hBTkRTRlJFRSAweDA0MDgKLSNkZWZpbmUgQ09EX0FWX0hFQURQSE9ORVMgMHgwNDE4Ci0jZGVmaW5lIENPRF9BVl9QT1JUQUJMRV9BVURJTyAweDA0MUMKLSNkZWZpbmUgQ09EX0FWX0hJRklfQVVESU8gMHgwNDI4Ci0KLSNkZWZpbmUgQlRJRl9ETV9NQVhfU0RQX0FUVEVNUFRTX0FGVEVSX1BBSVJJTkcgMgotCi0jZGVmaW5lIE5VTV9USU1FT1VUX1JFVFJJRVMgNQotI2lmbmRlZiBQUk9QRVJUWV9QUk9EVUNUX01PREVMCi0jZGVmaW5lIFBST1BFUlRZX1BST0RVQ1RfTU9ERUwgInJvLnByb2R1Y3QubW9kZWwiCi0jZW5kaWYKLSNkZWZpbmUgREVGQVVMVF9MT0NBTF9OQU1FX01BWCAzMQotI2lmIChERUZBVUxUX0xPQ0FMX05BTUVfTUFYID4gQlRNX01BWF9MT0NfQkRfTkFNRV9MRU4pCi0jZXJyb3IgImRlZmF1bHQgYnRpZiBsb2NhbCBuYW1lIHNpemUgZXhjZWVkcyBzdGFjayBzdXBwb3J0ZWQgbGVuZ3RoIgotI2VuZGlmCi0KLSNkZWZpbmUgRU5DUllQVEVEX0JSRURSIDIKLSNkZWZpbmUgRU5DUllQVEVEX0xFIDQKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBidF9ib25kX3N0YXRlX3Qgc3RhdGU7Ci0gIFJhd0FkZHJlc3Mgc3RhdGljX2JkYWRkcjsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB0QlRNX1NFQ19ERVZfUkVDOjp0QlRNX0JPTkRfVFlQRSBib25kX3R5cGU7Ci0gIHVpbnQ4X3QgcGluX2NvZGVfbGVuOwotICB1aW50OF90IGlzX3NzcDsKLSAgdWludDhfdCBhdXRoX3JlcTsKLSAgdWludDhfdCBpb19jYXA7Ci0gIHVpbnQ4X3QgYXV0b3BhaXJfYXR0ZW1wdHM7Ci0gIHVpbnQ4X3QgdGltZW91dF9yZXRyaWVzOwotICB1aW50OF90IGlzX2xvY2FsX2luaXRpYXRlZDsKLSAgdWludDhfdCBzZHBfYXR0ZW1wdHM7Ci0gIGJvb2wgaXNfbGVfb25seTsKLSAgYm9vbCBpc19sZV9uYzsgLyogTEUgTnVtZXJpYyBjb21wYXJpc29uICovCi0gIGJ0aWZfZG1fYmxlX2NiX3QgYmxlOwotICB1aW50OF90IGZhaWxfcmVhc29uOwotfSBidGlmX2RtX3BhaXJpbmdfY2JfdDsKLQotLy8gVE9ETyhqcGF3bG93c2tpKTogdW5pZnkgPwotLy8gYnRpZl9kbV9sb2NhbF9rZXlfaWRfdCA9PSB0QlRNX0JMRV9MT0NBTF9JRF9LRVlTID09IHRCVEFfQkxFX0xPQ0FMX0lEX0tFWVMKLXR5cGVkZWYgc3RydWN0IHsKLSAgT2N0ZXQxNiBpcjsKLSAgT2N0ZXQxNiBpcms7Ci0gIE9jdGV0MTYgZGhrOwotfSBidGlmX2RtX2xvY2FsX2tleV9pZF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaXNfZXJfcmN2ZDsKLSAgT2N0ZXQxNiBlcjsKLSAgYm9vbCBpc19pZF9rZXlzX3JjdmQ7Ci0gIGJ0aWZfZG1fbG9jYWxfa2V5X2lkX3QgaWRfa2V5czsgLyogSUQga3llcyAqLwotCi19IGJ0aWZfZG1fbG9jYWxfa2V5X2NiX3Q7Ci0KLS8qIHRoaXMgc3RydWN0dXJlIGhvbGRzIG9wdGlvbmFsIE9PQiBkYXRhIGZvciByZW1vdGUgZGV2aWNlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyOyAgICAgICAvKiBwZWVyIGJkYWRkciAqLwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsgLyogQlIvRURSIG9yIExFICovCi0gIGludCBkYXRhX3ByZXNlbnQ7ICAgICAgICAvKiBXaGF0IHR5cGUocykgb2YgT09CIERhdGEgcHJlc2VudCAqLwotICBidF9vb2JfZGF0YV90IHAxOTJfZGF0YTsgLyogUDE5MiBEYXRhIG9yIGVtcHR5ICovCi0gIGJ0X29vYl9kYXRhX3QgcDI1Nl9kYXRhOyAvKiBQMjU2IERhdGEgb3IgZW1wdHkgKi8KLX0gYnRpZl9kbV9vb2JfY2JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBpbnQgbWFudWZhY3RfaWQ7IH0gc2tpcF9zZHBfZW50cnlfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRJRl9ETV9GVU5DX0NSRUFURV9CT05ELAotICBCVElGX0RNX0ZVTkNfQ0FOQ0VMX0JPTkQsCi0gIEJUSUZfRE1fRlVOQ19SRU1PVkVfQk9ORCwKLSAgQlRJRl9ETV9GVU5DX0JPTkRfU1RBVEVfQ0hBTkdFRCwKLX0gYnRfYm9uZF9mdW5jdGlvbl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgYnRfYm9uZF9mdW5jdGlvbl90IGZ1bmN0aW9uOwotICBidF9ib25kX3N0YXRlX3Qgc3RhdGU7Ci0gIHN0cnVjdCB0aW1lc3BlYyB0aW1lc3RhbXA7Ci19IGJ0aWZfYm9uZF9ldmVudF90OwotCi0jZGVmaW5lIEJUQV9TRVJWSUNFX0lEX1RPX1NFUlZJQ0VfTUFTSyhpZCkgKDEgPDwgKGlkKSkKLQotI2RlZmluZSBNQVhfQlRJRl9CT05EX0VWRU5UX0VOVFJJRVMgMTUKLQotc3RhdGljIHNraXBfc2RwX2VudHJ5X3Qgc2RwX3JlamVjdGxpc3RbXSA9IHt7NzZ9fTsgIC8vIEFwcGxlIE1vdXNlIGFuZCBLZXlib2FyZAotCi0vKiBUaGlzIGZsYWcgd2lsbCBiZSB0cnVlIGlmIEhDSV9JbnF1aXJ5IGlzIGluIHByb2dyZXNzICovCi1zdGF0aWMgYm9vbCBidGlmX2RtX2lucXVpcnlfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNoYXIgYnRpZl9kZWZhdWx0X2xvY2FsX25hbWVbREVGQVVMVF9MT0NBTF9OQU1FX01BWCArIDFdID0geydcMCd9Owotc3RhdGljIHVpZF9zZXRfdCogdWlkX3NldCA9IE5VTEw7Ci0KLS8qIEEgY2lyY3VsYXIgYXJyYXkgdG8ga2VlcCB0cmFjayBvZiB0aGUgbW9zdCByZWNlbnQgYm9uZCBldmVudHMgKi8KLXN0YXRpYyBidGlmX2JvbmRfZXZlbnRfdCBidGlmX2RtX2JvbmRfZXZlbnRzW01BWF9CVElGX0JPTkRfRVZFTlRfRU5UUklFUyArIDFdOwotCi1zdGF0aWMgc3RkOjptdXRleCBib25kX2V2ZW50X2xvY2s7Ci0KLS8qIHxidGlmX251bV9ib25kX2V2ZW50c3wga2VlcHMgdHJhY2sgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBldmVudHMgYW5kIGNhbiBiZQotICAgZ3JlYXRlciB0aGFuIHxNQVhfQlRJRl9CT05EX0VWRU5UX0VOVFJJRVN8ICovCi1zdGF0aWMgc2l6ZV90IGJ0aWZfbnVtX2JvbmRfZXZlbnRzID0gMDsKLXN0YXRpYyBzaXplX3QgYnRpZl9ldmVudHNfc3RhcnRfaW5kZXggPSAwOwotc3RhdGljIHNpemVfdCBidGlmX2V2ZW50c19lbmRfaW5kZXggPSAwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9kbV9ibGVfc2VjX3JlcV9ldnQodEJUQV9ETV9CTEVfU0VDX1JFUSogcF9ibGVfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jb25zZW50KTsKLXN0YXRpYyB2b2lkIGJ0aWZfZG1fcmVtb3ZlX2JsZV9ib25kaW5nX2tleXModm9pZCk7Ci1zdGF0aWMgdm9pZCBidGlmX2RtX3NhdmVfYmxlX2JvbmRpbmdfa2V5cyhSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLXN0YXRpYyBidGlmX2RtX3BhaXJpbmdfY2JfdCBwYWlyaW5nX2NiOwotc3RhdGljIGJ0aWZfZG1fb29iX2NiX3Qgb29iX2NiOwotc3RhdGljIHZvaWQgYnRpZl9kbV9jYl9jcmVhdGVfYm9uZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLXN0YXRpYyB2b2lkIGJ0aWZfdXBkYXRlX3JlbW90ZV9wcm9wZXJ0aWVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpOwotc3RhdGljIGJ0aWZfZG1fbG9jYWxfa2V5X2NiX3QgYmxlX2xvY2FsX2tleV9jYjsKLXN0YXRpYyB2b2lkIGJ0aWZfZG1fYmxlX2tleV9ub3RpZl9ldnQodEJUQV9ETV9TUF9LRVlfTk9USUYqIHBfc3NwX2tleV9ub3RpZik7Ci1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV9hdXRoX2NtcGxfZXZ0KHRCVEFfRE1fQVVUSF9DTVBMKiBwX2F1dGhfY21wbCk7Ci1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV9wYXNza2V5X3JlcV9ldnQodEJUQV9ETV9QSU5fUkVRKiBwX3Bpbl9yZXEpOwotc3RhdGljIHZvaWQgYnRpZl9kbV9ibGVfa2V5X25jX3JlcV9ldnQodEJUQV9ETV9TUF9LRVlfTk9USUYqIHBfbm90aWZfcmVxKTsKLXN0YXRpYyB2b2lkIGJ0aWZfZG1fYmxlX29vYl9yZXFfZXZ0KHRCVEFfRE1fU1BfUk1UX09PQiogcmVxX29vYl90eXBlKTsKLXN0YXRpYyB2b2lkIGJ0aWZfZG1fYmxlX3NjX29vYl9yZXFfZXZ0KHRCVEFfRE1fU1BfUk1UX09PQiogcmVxX29vYl90eXBlKTsKLQotc3RhdGljIHZvaWQgYnRlX3NjYW5fZmlsdF9wYXJhbV9jZmdfZXZ0KHVpbnQ4X3QgYXZibF9zcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1cyk7Ci0KLXN0YXRpYyBjaGFyKiBidGlmX2dldF9kZWZhdWx0X2xvY2FsX25hbWUoKTsKLQotc3RhdGljIHZvaWQgYnRpZl9zdGF0c19hZGRfYm9uZF9ldmVudChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9ib25kX2Z1bmN0aW9uX3QgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYnRfc3RhdHVzX3QgYnRpZl9hdl9zaW5rX2V4ZWN1dGVfc2VydmljZShib29sIGJfZW5hYmxlKTsKLWV4dGVybiBidF9zdGF0dXNfdCBidGlmX2hoX2V4ZWN1dGVfc2VydmljZShib29sIGJfZW5hYmxlKTsKLWV4dGVybiBidF9zdGF0dXNfdCBidGlmX2hmX2NsaWVudF9leGVjdXRlX3NlcnZpY2UoYm9vbCBiX2VuYWJsZSk7Ci1leHRlcm4gYnRfc3RhdHVzX3QgYnRpZl9zZHBfZXhlY3V0ZV9zZXJ2aWNlKGJvb2wgYl9lbmFibGUpOwotZXh0ZXJuIGJ0X3N0YXR1c190IGJ0aWZfaGhfY29ubmVjdChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLWV4dGVybiBidF9zdGF0dXNfdCBidGlmX2hkX2V4ZWN1dGVfc2VydmljZShib29sIGJfZW5hYmxlKTsKLWV4dGVybiBibHVldG9vdGg6OmhlYXJpbmdfYWlkOjpIZWFyaW5nQWlkSW50ZXJmYWNlKgotYnRpZl9oZWFyaW5nX2FpZF9nZXRfaW50ZXJmYWNlKCk7Ci1leHRlcm4gYmx1ZXRvb3RoOjpjc2lzOjpDc2lzQ2xpZW50SW50ZXJmYWNlKiBidGlmX2NzaXNfY2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLWV4dGVybiBibHVldG9vdGg6OmxlX2F1ZGlvOjpMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKgotYnRpZl9sZV9hdWRpb19nZXRfaW50ZXJmYWNlKCk7Ci1leHRlcm4gYmx1ZXRvb3RoOjp2Yzo6Vm9sdW1lQ29udHJvbEludGVyZmFjZSoKLWJ0aWZfdm9sdW1lX2NvbnRyb2xfZ2V0X2ludGVyZmFjZSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIGlzX2VtcHR5XzEyOGJpdCh1aW50OF90KiBkYXRhKSB7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IHplcm9bMTZdID0gezB9OwotICByZXR1cm4gIW1lbWNtcCh6ZXJvLCBkYXRhLCBzaXplb2YoemVybykpOwotfQotCi1zdGF0aWMgYm9vbCBpc19ib25kaW5nX29yX3NkcCgpIHsKLSAgcmV0dXJuIHBhaXJpbmdfY2Iuc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ESU5HIHx8Ci0gICAgICAgICAocGFpcmluZ19jYi5zdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCAmJiBwYWlyaW5nX2NiLnNkcF9hdHRlbXB0cyk7Ci19Ci0KLXZvaWQgYnRpZl9kbV9pbml0KHVpZF9zZXRfdCogc2V0KSB7Ci0gIHVpZF9zZXQgPSBzZXQ7Ci19Ci0KLXZvaWQgYnRpZl9kbV9jbGVhbnVwKHZvaWQpIHsKLSAgaWYgKHVpZF9zZXQpIHsKLSAgICB1aWRfc2V0X2Rlc3Ryb3kodWlkX3NldCk7Ci0gICAgdWlkX3NldCA9IE5VTEw7Ci0gIH0KLX0KLQotYnRfc3RhdHVzX3QgYnRpZl9pbl9leGVjdXRlX3NlcnZpY2VfcmVxdWVzdCh0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2VuYWJsZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlcyBzZXJ2aWNlX2lkOiAlZCIsIF9fZnVuY19fLCBzZXJ2aWNlX2lkKTsKLSAgLyogQ2hlY2sgdGhlIHNlcnZpY2VfSUQgYW5kIGludm9rZSB0aGUgcHJvZmlsZSdzIEJUIHN0YXRlIGNoYW5nZWQgQVBJICovCi0gIHN3aXRjaCAoc2VydmljZV9pZCkgewotICAgIGNhc2UgQlRBX0hGUF9TRVJWSUNFX0lEOgotICAgIGNhc2UgQlRBX0hTUF9TRVJWSUNFX0lEOiB7Ci0gICAgICBibHVldG9vdGg6OmhlYWRzZXQ6OkV4ZWN1dGVTZXJ2aWNlKGJfZW5hYmxlKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQlRBX0EyRFBfU09VUkNFX1NFUlZJQ0VfSUQ6IHsKLSAgICAgIGJ0aWZfYXZfc291cmNlX2V4ZWN1dGVfc2VydmljZShiX2VuYWJsZSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEJUQV9BMkRQX1NJTktfU0VSVklDRV9JRDogewotICAgICAgYnRpZl9hdl9zaW5rX2V4ZWN1dGVfc2VydmljZShiX2VuYWJsZSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEJUQV9ISURfU0VSVklDRV9JRDogewotICAgICAgYnRpZl9oaF9leGVjdXRlX3NlcnZpY2UoYl9lbmFibGUpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVEFfSEZQX0hTX1NFUlZJQ0VfSUQ6IHsKLSAgICAgIGJ0aWZfaGZfY2xpZW50X2V4ZWN1dGVfc2VydmljZShiX2VuYWJsZSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEJUQV9TRFBfU0VSVklDRV9JRDogewotICAgICAgYnRpZl9zZHBfZXhlY3V0ZV9zZXJ2aWNlKGJfZW5hYmxlKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQlRBX0hJRERfU0VSVklDRV9JRDogewotICAgICAgYnRpZl9oZF9leGVjdXRlX3NlcnZpY2UoYl9lbmFibGUpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVEFfUEJBUF9TRVJWSUNFX0lEOgotICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBCVEFfUENFX1NFUlZJQ0VfSUQ6Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEJUQV9NQVBfU0VSVklDRV9JRDoKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgQlRBX01OX1NFUlZJQ0VfSUQ6IHsKLSAgICAgIC8qKgotICAgICAgICogRG8gbm90aGluZzsgdGhlc2Ugc2VydmljZXMgd2VyZSBzdGFydGVkIGVsc2V3aGVyZS4gSG93ZXZlciwgd2UgbmVlZCB0byBmbG93IHRocm91Z2ggdGhpcwotICAgICAgICogY29kZXBhdGggaW4gb3JkZXIgdG8gcHJvcGVybHkgcmVwb3J0IGJhY2sgdGhlIGxvY2FsIFVVSURzIGJhY2sgdG8gYWRhcHRlciBwcm9wZXJ0aWVzIGluCi0gICAgICAgKiBKYXZhLiBUbyBhY2hpZXZlIHRoaXMsIHdlIG5lZWQgdG8gY2F0Y2ggdGhlc2Ugc2VydmljZSBJRHMgaW4gb3JkZXIgZm9yIHtAbGluawotICAgICAgICogYnRpZl9pbl9leGVjdXRlX3NlcnZpY2VfcmVxdWVzdH0gdG8gcmV0dXJuIHtAY29kZSBCVF9TVEFUVVNfU1VDQ0VTU30sIHNvIHRoYXQgaW4ge0BsaW5rCi0gICAgICAgKiBidGlmX2RtX2VuYWJsZV9zZXJ2aWNlfSB0aGUgY2hlY2sgcGFzc2VzIGFuZCB0aGUgVVVJRHMgYXJlIGFsbG93ZWQgdG8gYmUgcGFzc2VkIHVwIGludG8KLSAgICAgICAqIHRoZSBKYXZhIGxheWVyLgotICAgICAgICovCi0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFVua25vd24gc2VydmljZSAlZCBiZWluZyAlcyIsIF9fZnVuY19fLCBzZXJ2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAoYl9lbmFibGUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY2hlY2tfZWlyX3JlbW90ZV9uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiByZW1vdGUgbmFtZSBpcyBpbiB0aGUgRUlSIGRhdGEKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVtb3RlIG5hbWUgZm91bmQKLSAqICAgICAgICAgICAgICAgICAgUG9wdWxhdGUgcF9yZW1vdGVfbmFtZSwgaWYgcHJvdmlkZWQgYW5kIHJlbW90ZSBuYW1lIGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGNoZWNrX2Vpcl9yZW1vdGVfbmFtZSh0QlRBX0RNX1NFQVJDSCogcF9zZWFyY2hfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlbW90ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVtb3RlX25hbWVfbGVuKSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIHBfZWlyX3JlbW90ZV9uYW1lID0gTlVMTDsKLSAgdWludDhfdCByZW1vdGVfbmFtZV9sZW4gPSAwOwotCi0gIC8qIENoZWNrIEVJUiBmb3IgcmVtb3RlIG5hbWUgYW5kIHNlcnZpY2VzICovCi0gIGlmIChwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLnBfZWlyKSB7Ci0gICAgcF9laXJfcmVtb3RlX25hbWUgPSBBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZSgKLSAgICAgICAgcF9zZWFyY2hfZGF0YS0+aW5xX3Jlcy5wX2VpciwgcF9zZWFyY2hfZGF0YS0+aW5xX3Jlcy5laXJfbGVuLAotICAgICAgICBIQ0lfRUlSX0NPTVBMRVRFX0xPQ0FMX05BTUVfVFlQRSwgJnJlbW90ZV9uYW1lX2xlbik7Ci0gICAgaWYgKCFwX2Vpcl9yZW1vdGVfbmFtZSkgewotICAgICAgcF9laXJfcmVtb3RlX25hbWUgPSBBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZSgKLSAgICAgICAgICBwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLnBfZWlyLCBwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLmVpcl9sZW4sCi0gICAgICAgICAgSENJX0VJUl9TSE9SVEVORURfTE9DQUxfTkFNRV9UWVBFLCAmcmVtb3RlX25hbWVfbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAocF9laXJfcmVtb3RlX25hbWUpIHsKLSAgICAgIGlmIChyZW1vdGVfbmFtZV9sZW4gPiBCRF9OQU1FX0xFTikgcmVtb3RlX25hbWVfbGVuID0gQkRfTkFNRV9MRU47Ci0KLSAgICAgIGlmIChwX3JlbW90ZV9uYW1lICYmIHBfcmVtb3RlX25hbWVfbGVuKSB7Ci0gICAgICAgIG1lbWNweShwX3JlbW90ZV9uYW1lLCBwX2Vpcl9yZW1vdGVfbmFtZSwgcmVtb3RlX25hbWVfbGVuKTsKLSAgICAgICAgKihwX3JlbW90ZV9uYW1lICsgcmVtb3RlX25hbWVfbGVuKSA9IDA7Ci0gICAgICAgICpwX3JlbW90ZV9uYW1lX2xlbiA9IHJlbW90ZV9uYW1lX2xlbjsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY2hlY2tfY2FjaGVkX3JlbW90ZV9uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiByZW1vdGUgbmFtZSBpcyBpbiB0aGUgTlZSQU0gY2FjaGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVtb3RlIG5hbWUgZm91bmQKLSAqICAgICAgICAgICAgICAgICAgUG9wdWxhdGUgcF9yZW1vdGVfbmFtZSwgaWYgcHJvdmlkZWQgYW5kIHJlbW90ZSBuYW1lIGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGNoZWNrX2NhY2hlZF9yZW1vdGVfbmFtZSh0QlRBX0RNX1NFQVJDSCogcF9zZWFyY2hfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlbW90ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVtb3RlX25hbWVfbGVuKSB7Ci0gIGJ0X2JkbmFtZV90IGJkbmFtZTsKLSAgYnRfcHJvcGVydHlfdCBwcm9wX25hbWU7Ci0KLSAgLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBidGlmX3N0b3JhZ2UgY2FjaGUgKi8KLQotICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcF9uYW1lLCBCVF9QUk9QRVJUWV9CRE5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidF9iZG5hbWVfdCksICZiZG5hbWUpOwotICBpZiAoYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgICAgICAgICZwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLmJkX2FkZHIsICZwcm9wX25hbWUpID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgaWYgKHBfcmVtb3RlX25hbWUgJiYgcF9yZW1vdGVfbmFtZV9sZW4pIHsKLSAgICAgIHN0cmNweSgoY2hhciopcF9yZW1vdGVfbmFtZSwgKGNoYXIqKWJkbmFtZS5uYW1lKTsKLSAgICAgICpwX3JlbW90ZV9uYW1lX2xlbiA9IHN0cmxlbigoY2hhciopcF9yZW1vdGVfbmFtZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdWludDMyX3QgZ2V0X2NvZChjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRhZGRyKSB7Ci0gIHVpbnQzMl90IHJlbW90ZV9jb2Q7Ci0gIGJ0X3Byb3BlcnR5X3QgcHJvcF9uYW1lOwotCi0gIC8qIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgYnRpZl9zdG9yYWdlIGNhY2hlICovCi0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wX25hbWUsIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSwgJnJlbW90ZV9jb2QpOwotICBpZiAoYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgICAgICAgIChSYXdBZGRyZXNzKilyZW1vdGVfYmRhZGRyLCAmcHJvcF9uYW1lKSA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19JTkZPKCIlcyByZW1vdGVfY29kID0gMHglMDh4IiwgX19mdW5jX18sIHJlbW90ZV9jb2QpOwotICAgIHJldHVybiByZW1vdGVfY29kICYgQ09EX01BU0s7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotYm9vbCBjaGVja19jb2QoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYWRkciwgdWludDMyX3QgY29kKSB7Ci0gIHJldHVybiBnZXRfY29kKHJlbW90ZV9iZGFkZHIpID09IGNvZDsKLX0KLQotYm9vbCBjaGVja19jb2RfaGlkKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZGFkZHIpIHsKLSAgcmV0dXJuIChnZXRfY29kKHJlbW90ZV9iZGFkZHIpICYgQ09EX0hJRF9NQVNLKSA9PSBDT0RfSElEX01BSk9SOwotfQotCi1ib29sIGNoZWNrX2NvZF9oaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICByZXR1cm4gKGdldF9jb2QoJmJkX2FkZHIpICYgQ09EX0hJRF9NQVNLKSA9PSBDT0RfSElEX01BSk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgY2hlY2tfc2RwX2JsCi0gKgotICogRGVzY3JpcHRpb24gICAgIENoZWNrcyBpZiBhIGdpdmVuIGRldmljZSBpcyByZWplY3RsaXN0ZWQgdG8gc2tpcCBzZHAKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICBza2lwX3NkcF9lbnRyeQotICoKLSAqIFJldHVybnMgICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudCBpbiByZWplY3RsaXN0LCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGNoZWNrX3NkcF9ibChjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRhZGRyKSB7Ci0gIGJ0X3Byb3BlcnR5X3QgcHJvcF9uYW1lOwotICBidF9yZW1vdGVfdmVyc2lvbl90IGluZm87Ci0KLSAgaWYgKHJlbW90ZV9iZGFkZHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGlmIG5vdCBhdmFpbGFibGUgeWV0LCB0cnkgZmV0Y2hpbmcgZnJvbSBjb25maWcgZGF0YWJhc2UgKi8KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BfbmFtZSwgQlRfUFJPUEVSVFlfUkVNT1RFX1ZFUlNJT05fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0X3JlbW90ZV92ZXJzaW9uX3QpLCAmaW5mbyk7Ci0KLSAgaWYgKGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShyZW1vdGVfYmRhZGRyLCAmcHJvcF9uYW1lKSAhPQotICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDE2X3QgbWFudWZhY3R1cmVyID0gaW5mby5tYW51ZmFjdHVyZXI7Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkcF9yZWplY3RsaXN0KTsgaSsrKSB7Ci0gICAgaWYgKG1hbnVmYWN0dXJlciA9PSBzZHBfcmVqZWN0bGlzdFtpXS5tYW51ZmFjdF9pZCkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBib25kX3N0YXRlX2NoYW5nZWQoYnRfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSkgewotICBidGlmX3N0YXRzX2FkZF9ib25kX2V2ZW50KGJkX2FkZHIsIEJUSUZfRE1fRlVOQ19CT05EX1NUQVRFX0NIQU5HRUQsIHN0YXRlKTsKLQotICBpZiAoKHBhaXJpbmdfY2Iuc3RhdGUgPT0gc3RhdGUpICYmIChzdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRJTkcpKSB7Ci0gICAgLy8gQ3Jvc3Mga2V5IHBhaXJpbmcgc28gc2VuZCBjYWxsYmFjayBmb3Igc3RhdGljIGFkZHJlc3MKLSAgICBpZiAoIXBhaXJpbmdfY2Iuc3RhdGljX2JkYWRkci5Jc0VtcHR5KCkpIHsKLSAgICAgIGludm9rZV9ib25kX3N0YXRlX2NoYW5nZWRfY2Ioc3RhdHVzLCBiZF9hZGRyLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcmluZ19jYi5mYWlsX3JlYXNvbik7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwYWlyaW5nX2NiLmJvbmRfdHlwZSA9PSB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVEVNUE9SQVJZKSB7Ci0gICAgc3RhdGUgPSBCVF9CT05EX1NUQVRFX05PTkU7Ci0gIH0KLQotICBMT0dfSU5GTygKLSAgICAgICJCb25kIHN0YXRlIGNoYW5nZWQgdG8gc3RhdGU9JWQgWzA6bm9uZSwgMTpib25kaW5nLCAyOmJvbmRlZF0sIgotICAgICAgIiBwcmV2X3N0YXRlPSVkLCBzZHBfYXR0ZW1wdHMgPSAlZCIsCi0gICAgICBzdGF0ZSwgcGFpcmluZ19jYi5zdGF0ZSwgcGFpcmluZ19jYi5zZHBfYXR0ZW1wdHMpOwotCi0gIGlmIChzdGF0ZSA9PSBCVF9CT05EX1NUQVRFX05PTkUpIHsKLSAgICBmb3JnZXRfZGV2aWNlX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihiZF9hZGRyKTsKLSAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCkgewotICAgIGFsbG9jYXRlX21ldHJpY19pZF9mcm9tX21ldHJpY19pZF9hbGxvY2F0b3IoYmRfYWRkcik7Ci0gICAgaWYgKCFzYXZlX21ldHJpY19pZF9mcm9tX21ldHJpY19pZF9hbGxvY2F0b3IoYmRfYWRkcikpIHsKLSAgICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18gPDwgIjogRmFpbCB0byBzYXZlIG1ldHJpYyBpZCBmb3IgZGV2aWNlICIKLSAgICAgICAgICAgICAgICAgPDwgYmRfYWRkcjsKLSAgICB9Ci0gIH0KLSAgaW52b2tlX2JvbmRfc3RhdGVfY2hhbmdlZF9jYihzdGF0dXMsIGJkX2FkZHIsIHN0YXRlLCBwYWlyaW5nX2NiLmZhaWxfcmVhc29uKTsKLQotICBpbnQgZGV2X3R5cGU7Ci0gIGlmICghYnRpZl9nZXRfZGV2aWNlX3R5cGUoYmRfYWRkciwgJmRldl90eXBlKSkgewotICAgIGRldl90eXBlID0gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci0gIH0KLQotICBpZiAoc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ESU5HIHx8Ci0gICAgICAoc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ERUQgJiYgcGFpcmluZ19jYi5zZHBfYXR0ZW1wdHMgPiAwKSkgewotICAgIC8vIFNhdmUgc3RhdGUgZm9yIHRoZSBkZXZpY2UgaXMgYm9uZGluZyBvciBTRFAuCi0gICAgcGFpcmluZ19jYi5zdGF0ZSA9IHN0YXRlOwotICAgIHBhaXJpbmdfY2IuYmRfYWRkciA9IGJkX2FkZHI7Ci0gIH0gZWxzZSB7Ci0gICAgcGFpcmluZ19jYiA9IHt9OwotICB9Ci19Ci0KLS8qIHN0b3JlIHJlbW90ZSB2ZXJzaW9uIGluIGJ0IGNvbmZpZyB0byBhbHdheXMgaGF2ZSBhY2Nlc3MKLSAgIHRvIGl0IHBvc3QgcGFpcmluZyovCi1zdGF0aWMgdm9pZCBidGlmX3VwZGF0ZV9yZW1vdGVfdmVyc2lvbl9wcm9wZXJ0eShSYXdBZGRyZXNzKiBwX2JkKSB7Ci0gIGJ0X3Byb3BlcnR5X3QgcHJvcGVydHk7Ci0gIHVpbnQ4X3QgbG1wX3ZlciA9IDA7Ci0gIHVpbnQxNl90IGxtcF9zdWJ2ZXIgPSAwOwotICB1aW50MTZfdCBtZmN0X3NldCA9IDA7Ci0gIGJ0X3JlbW90ZV92ZXJzaW9uX3QgaW5mbzsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotCi0gIENIRUNLKHBfYmQgIT0gbnVsbHB0cik7Ci0KLSAgY29uc3QgYm9vbCB2ZXJzaW9uX2luZm9fdmFsaWQgPQotICAgICAgQlRNX1JlYWRSZW1vdGVWZXJzaW9uKCpwX2JkLCAmbG1wX3ZlciwgJm1mY3Rfc2V0LCAmbG1wX3N1YnZlcik7Ci0KLSAgTE9HX0lORk8oIlJlbW90ZSB2ZXJzaW9uIGluZm8gdmFsaWQ6JXMgWyVzXTogJXgsICV4LCAleCIsCi0gICAgICAgICAgIGxvZ2Jvb2wodmVyc2lvbl9pbmZvX3ZhbGlkKS5jX3N0cigpLCBQUklWQVRFX0FERFJFU1MoKCpwX2JkKSksCi0gICAgICAgICAgIGxtcF92ZXIsIG1mY3Rfc2V0LCBsbXBfc3VidmVyKTsKLQotICBpZiAodmVyc2lvbl9pbmZvX3ZhbGlkKSB7Ci0gICAgLy8gQWx3YXlzIHVwZGF0ZSBjYWNoZSB0byBlbnN1cmUgd2UgaGF2ZSBhdmFpbGFiaWxpdHkgd2hlbmV2ZXIgQlRNIEFQSSBpcwotICAgIC8vIG5vdCBwb3B1bGF0ZWQKLSAgICBpbmZvLm1hbnVmYWN0dXJlciA9IG1mY3Rfc2V0OwotICAgIGluZm8uc3ViX3ZlciA9IGxtcF9zdWJ2ZXI7Ci0gICAgaW5mby52ZXJzaW9uID0gbG1wX3ZlcjsKLSAgICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydHksIEJUX1BST1BFUlRZX1JFTU9URV9WRVJTSU9OX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0X3JlbW90ZV92ZXJzaW9uX3QpLCAmaW5mbyk7Ci0gICAgc3RhdHVzID0gYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KHBfYmQsICZwcm9wZXJ0eSk7Ci0gICAgQVNTRVJUQyhzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJmYWlsZWQgdG8gc2F2ZSByZW1vdGUgdmVyc2lvbiIsCi0gICAgICAgICAgICBzdGF0dXMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfdXBkYXRlX3JlbW90ZV9wcm9wZXJ0aWVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICBpbnQgbnVtX3Byb3BlcnRpZXMgPSAwOwotICBidF9wcm9wZXJ0eV90IHByb3BlcnRpZXNbM107Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19VTkhBTkRMRUQ7Ci0gIHVpbnQzMl90IGNvZDsKLSAgYnRfZGV2aWNlX3R5cGVfdCBkZXZfdHlwZTsKLQotICBtZW1zZXQocHJvcGVydGllcywgMCwgc2l6ZW9mKHByb3BlcnRpZXMpKTsKLQotICAvKiByZW1vdGUgbmFtZSAqLwotICBpZiAoc3RybGVuKChjb25zdCBjaGFyKiliZF9uYW1lKSkgewotICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSwgQlRfUFJPUEVSVFlfQkROQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigoY2hhciopYmRfbmFtZSksIGJkX25hbWUpOwotICAgIGlmICghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICAgIHN0YXR1cyA9IGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgKLSAgICAgICAgICAmYmRhZGRyLCAmcHJvcGVydGllc1tudW1fcHJvcGVydGllc10pOwotICAgICAgQVNTRVJUQyhzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJmYWlsZWQgdG8gc2F2ZSByZW1vdGUgZGV2aWNlIG5hbWUiLAotICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIH0KLSAgICBudW1fcHJvcGVydGllcysrOwotICB9Ci0KLSAgLyogY2xhc3Mgb2YgZGV2aWNlICovCi0gIGNvZCA9IGRldmNsYXNzMnVpbnQoZGV2X2NsYXNzKTsKLSAgaWYgKGNvZCA9PSAwKSB7Ci0gICAgLyogVHJ5IHRvIHJldHJpZXZlIGNvZCBmcm9tIHN0b3JhZ2UgKi8KLSAgICBMT0dfVkVSQk9TRSgiY2xhc3Mgb2YgZGV2aWNlIChjb2QpIGlzIHVuY2xhc3NpZmllZCwgY2hlY2tpbmcgc3RvcmFnZSIpOwotICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UsIHNpemVvZihjb2QpLCAmY29kKTsKLSAgICBzdGF0dXMgPSBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgICAgICZiZGFkZHIsICZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSk7Ci0gICAgTE9HX1ZFUkJPU0UoImNvZCByZXRyaWV2ZWQgZnJvbSBzdG9yYWdlIGlzIDB4JTA2eCIsIGNvZCk7Ci0gICAgaWYgKGNvZCA9PSAwKSB7Ci0gICAgICBMT0dfSU5GTygiY29kIGZyb20gc3RvcmFnZSBpcyBhbHNvIHVuY2xhc3NpZmllZCIpOwotICAgICAgY29kID0gQ09EX1VOQ0xBU1NJRklFRDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oImNsYXNzIG9mIGRldmljZSAoY29kKSBpcyAweCUwNngiLCBjb2QpOwotICB9Ci0KLSAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BlcnRpZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UsIHNpemVvZihjb2QpLCAmY29kKTsKLQotICBpZiAoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKSB7Ci0gICAgc3RhdHVzID0gYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgICAgICAmYmRhZGRyLCAmcHJvcGVydGllc1tudW1fcHJvcGVydGllc10pOwotICAgIEFTU0VSVEMoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTLCAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSBjbGFzcyIsCi0gICAgICAgICAgICBzdGF0dXMpOwotICB9Ci0gIG51bV9wcm9wZXJ0aWVzKys7Ci0KLSAgLyogZGV2aWNlIHR5cGUgKi8KLSAgYnRfcHJvcGVydHlfdCBwcm9wX25hbWU7Ci0gIHVpbnQ4X3QgcmVtb3RlX2Rldl90eXBlOwotICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcF9uYW1lLCBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCAmcmVtb3RlX2Rldl90eXBlKTsKLSAgaWYgKGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmYmRhZGRyLCAmcHJvcF9uYW1lKSA9PQotICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBkZXZfdHlwZSA9IChidF9kZXZpY2VfdHlwZV90KShyZW1vdGVfZGV2X3R5cGUgfCBkZXZpY2VfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGV2X3R5cGUgPSAoYnRfZGV2aWNlX3R5cGVfdClkZXZpY2VfdHlwZTsKLSAgfQotCi0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfUFJPUEVSVFlfVFlQRV9PRl9ERVZJQ0UsIHNpemVvZihkZXZfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZfdHlwZSk7Ci0gIGlmICghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICBzdGF0dXMgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgICAgICZiZGFkZHIsICZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSk7Ci0gICAgQVNTRVJUQyhzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJmYWlsZWQgdG8gc2F2ZSByZW1vdGUgZGV2aWNlIHR5cGUiLAotICAgICAgICAgICAgc3RhdHVzKTsKLSAgfQotICBudW1fcHJvcGVydGllcysrOwotCi0gIGludm9rZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2Ioc3RhdHVzLCBiZGFkZHIsIG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9jYl9jcmVhdGVfYm9uZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGJvbmQgaW5pdGlhdGVkIGZyb20gdGhlIEJUSUYgdGhyZWFkIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgU3BlY2lhbCBoYW5kbGluZyBmb3IgSElEIGRldmljZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9kbV9jYl9jcmVhdGVfYm9uZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIGJvb2wgaXNfaGlkID0gY2hlY2tfY29kKCZiZF9hZGRyLCBDT0RfSElEX1BPSU5USU5HKTsKLSAgYm9uZF9zdGF0ZV9jaGFuZ2VkKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX0JPTkRJTkcpOwotCi0gIGludCBkZXZpY2VfdHlwZSA9IDA7Ci0gIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSA9IEJMRV9BRERSX1BVQkxJQzsKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLSAgY29uc3QgY2hhciogYmRzdHIgPSBhZGRyc3RyLmNfc3RyKCk7Ci0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgaWYgKCFidGlmX2NvbmZpZ19nZXRfaW50KGJkc3RyLCAiRGV2VHlwZSIsICZkZXZpY2VfdHlwZSkpIHsKLSAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJEZXZUeXBlIiwgQlRfREVWSUNFX1RZUEVfQkxFKTsKLSAgICB9Ci0gICAgaWYgKGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2FkZHJfdHlwZSgmYmRfYWRkciwgJmFkZHJfdHlwZSkgIT0KLSAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIC8vIFRyeSB0byByZWFkIGFkZHJlc3MgdHlwZS4gT09CIHBhaXJpbmcgbWlnaHQgaGF2ZSBzZXQgaXQgZWFybGllciwgYnV0Ci0gICAgICAvLyBkaWRuJ3Qgc3RvcmUgaXQsIGl0IGRlZmF1bHRzIHRvIEJMRV9BRERSX1BVQkxJQwotICAgICAgdWludDhfdCB0bXBfZGV2X3R5cGU7Ci0gICAgICB0QkxFX0FERFJfVFlQRSB0bXBfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICAgICAgQlRNX1JlYWREZXZJbmZvKGJkX2FkZHIsICZ0bXBfZGV2X3R5cGUsICZ0bXBfYWRkcl90eXBlKTsKLSAgICAgIGFkZHJfdHlwZSA9IHRtcF9hZGRyX3R5cGU7Ci0KLSAgICAgIGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2FkZHJfdHlwZSgmYmRfYWRkciwgYWRkcl90eXBlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKChidGlmX2NvbmZpZ19nZXRfaW50KGJkc3RyLCAiRGV2VHlwZSIsICZkZXZpY2VfdHlwZSkgJiYKLSAgICAgICAoYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfYWRkcl90eXBlKCZiZF9hZGRyLCAmYWRkcl90eXBlKSA9PQotICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUykgJiYKLSAgICAgICAoZGV2aWNlX3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CTEUpID09IEJUX0RFVklDRV9UWVBFX0JMRSkgfHwKLSAgICAgICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSkgewotICAgIEJUQV9EbUFkZEJsZURldmljZShiZF9hZGRyLCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRCVF9ERVZJQ0VfVFlQRT4oZGV2aWNlX3R5cGUpKTsKLSAgfQotCi0gIGlmIChpc19oaWQgJiYgKGRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSA9PSAwKSB7Ci0gICAgY29uc3QgYnRfc3RhdHVzX3Qgc3RhdHVzID0gYnRpZl9oaF9jb25uZWN0KCZiZF9hZGRyKTsKLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKQotICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkKHN0YXR1cywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9OT05FKTsKLSAgfSBlbHNlIHsKLSAgICBCVEFfRG1Cb25kKGJkX2FkZHIsIGFkZHJfdHlwZSwgdHJhbnNwb3J0LCBkZXZpY2VfdHlwZSk7Ci0gIH0KLSAgLyogIFRyYWNrICBvcmlnaW5hdG9yIG9mIGJvbmQgY3JlYXRpb24gICovCi0gIHBhaXJpbmdfY2IuaXNfbG9jYWxfaW5pdGlhdGVkID0gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZG1fZ2V0X2Nvbm5lY3Rpb25fc3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3RlIGRldmljZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIGFuZCB3aGV0aGVyIGVuY3J5cHRpb24gaXMgYWN0aXZlIGZvciB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgMCBpZiBub3QgY29ubmVjdGVkOyAxIGlmIGNvbm5lY3RlZCBhbmQgPiAxIGlmIGNvbm5lY3Rpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IGJ0aWZfZG1fZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICB1aW50MTZfdCByYyA9IEJUQV9EbUdldENvbm5lY3Rpb25TdGF0ZSgqYmRfYWRkcik7Ci0KLSAgaWYgKHJjICE9IDApIHsKLSAgICBpZiAoQlRNX0lzRW5jcnlwdGVkKCpiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKSkgewotICAgICAgcmMgfD0gRU5DUllQVEVEX0JSRURSOwotICAgIH0KLSAgICBpZiAoQlRNX0lzRW5jcnlwdGVkKCpiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgICByYyB8PSBFTkNSWVBURURfTEU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEJUSUYgRE0gY2FsbGJhY2sgZXZlbnRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3Bpbl9yZXFfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFeGVjdXRlcyBwaW4gcmVxdWVzdCBldmVudCBpbiBidGlmIGNvbnRleHQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9kbV9waW5fcmVxX2V2dCh0QlRBX0RNX1BJTl9SRVEqIHBfcGluX3JlcSkgewotICBidF9iZG5hbWVfdCBiZF9uYW1lOwotICB1aW50MzJfdCBjb2Q7Ci0gIGJ0X3Bpbl9jb2RlX3QgcGluX2NvZGU7Ci0gIGludCBkZXZfdHlwZTsKLQotICAvKiBSZW1vdGUgcHJvcGVydGllcyB1cGRhdGUgKi8KLSAgaWYgKEJUTV9HZXRQZWVyRGV2aWNlVHlwZUZyb21GZWF0dXJlcyhwX3Bpbl9yZXEtPmJkX2FkZHIpID09Ci0gICAgICBCVF9ERVZJQ0VfVFlQRV9EVU1PKSB7Ci0gICAgZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9EVU1POwotICB9IGVsc2UgaWYgKCFidGlmX2dldF9kZXZpY2VfdHlwZShwX3Bpbl9yZXEtPmJkX2FkZHIsICZkZXZfdHlwZSkpIHsKLSAgICAvLyBGYWlsZWQgdG8gZ2V0IGRldmljZSB0eXBlLCBkZWZhdWx0aW5nIHRvIEJSL0VEUi4KLSAgICBkZXZfdHlwZSA9IEJUX0RFVklDRV9UWVBFX0JSRURSOwotICB9Ci0gIGJ0aWZfdXBkYXRlX3JlbW90ZV9wcm9wZXJ0aWVzKHBfcGluX3JlcS0+YmRfYWRkciwgcF9waW5fcmVxLT5iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Bpbl9yZXEtPmRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVF9ERVZJQ0VfVFlQRSlkZXZfdHlwZSk7Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciA9IHBfcGluX3JlcS0+YmRfYWRkcjsKLSAgbWVtY3B5KGJkX25hbWUubmFtZSwgcF9waW5fcmVxLT5iZF9uYW1lLCBCRF9OQU1FX0xFTik7Ci0gIGJkX25hbWUubmFtZVtCRF9OQU1FX0xFTl0gPSAnXDAnOwotCi0gIGlmIChwYWlyaW5nX2NiLnN0YXRlID09IEJUX0JPTkRfU1RBVEVfQk9ORElORyAmJgotICAgICAgYmRfYWRkciAhPSBwYWlyaW5nX2NiLmJkX2FkZHIpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzKCk6IGFscmVhZHkgaW4gYm9uZGluZyBzdGF0ZSwgcmVqZWN0IHJlcXVlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ESU5HKTsKLQotICBjb2QgPSBkZXZjbGFzczJ1aW50KHBfcGluX3JlcS0+ZGV2X2NsYXNzKTsKLQotICBpZiAoY29kID09IDApIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBjb2QgaXMgMCwgc2V0IGFzIHVuY2xhc3NpZmllZCIsIF9fZnVuY19fKTsKLSAgICBjb2QgPSBDT0RfVU5DTEFTU0lGSUVEOwotICB9Ci0KLSAgLyogY2hlY2sgZm9yIGF1dG8gcGFpciBwb3NzaWJsaXR5IG9ubHkgaWYgYm9uZCB3YXMgaW5pdGlhdGVkIGJ5IGxvY2FsIGRldmljZQotICAgKi8KLSAgaWYgKHBhaXJpbmdfY2IuaXNfbG9jYWxfaW5pdGlhdGVkICYmICFwX3Bpbl9yZXEtPm1pbl8xNl9kaWdpdCkgewotICAgIGlmIChjaGVja19jb2QoJmJkX2FkZHIsIENPRF9BVl9IRUFEU0VUUykgfHwKLSAgICAgICAgY2hlY2tfY29kKCZiZF9hZGRyLCBDT0RfQVZfSEVBRFBIT05FUykgfHwKLSAgICAgICAgY2hlY2tfY29kKCZiZF9hZGRyLCBDT0RfQVZfUE9SVEFCTEVfQVVESU8pIHx8Ci0gICAgICAgIGNoZWNrX2NvZCgmYmRfYWRkciwgQ09EX0FWX0hJRklfQVVESU8pIHx8Ci0gICAgICAgIGNoZWNrX2NvZCgmYmRfYWRkciwgQ09EX0hJRF9QT0lOVElORykpIHsKLSAgICAgIC8qICBDaGVjayBpZiB0aGlzIGRldmljZSBjYW4gYmUgYXV0byBwYWlyZWQgICovCi0gICAgICBpZiAoIWludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfQVVUT19QQUlSSU5HLCAmYmRfYWRkcikgJiYKLSAgICAgICAgICAhaW50ZXJvcF9tYXRjaF9uYW1lKElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopYmRfbmFtZS5uYW1lKSAmJgotICAgICAgICAgIChwYWlyaW5nX2NiLmF1dG9wYWlyX2F0dGVtcHRzID09IDApKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzKCkgQXR0ZW1wdGluZyBhdXRvIHBhaXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHBpbl9jb2RlLnBpblswXSA9IDB4MzA7Ci0gICAgICAgIHBpbl9jb2RlLnBpblsxXSA9IDB4MzA7Ci0gICAgICAgIHBpbl9jb2RlLnBpblsyXSA9IDB4MzA7Ci0gICAgICAgIHBpbl9jb2RlLnBpblszXSA9IDB4MzA7Ci0KLSAgICAgICAgcGFpcmluZ19jYi5hdXRvcGFpcl9hdHRlbXB0cysrOwotICAgICAgICBCVEFfRG1QaW5SZXBseShiZF9hZGRyLCB0cnVlLCA0LCBwaW5fY29kZS5waW4pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaGVja19jb2QoJmJkX2FkZHIsIENPRF9ISURfS0VZQk9BUkQpIHx8Ci0gICAgICAgICAgICAgICBjaGVja19jb2QoJmJkX2FkZHIsIENPRF9ISURfQ09NQk8pKSB7Ci0gICAgICBpZiAoKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0tFWUJPQVJEX1JFUVVJUkVTX0ZJWEVEX1BJTiwgJmJkX2FkZHIpID09Ci0gICAgICAgICAgIHRydWUpICYmCi0gICAgICAgICAgKHBhaXJpbmdfY2IuYXV0b3BhaXJfYXR0ZW1wdHMgPT0gMCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMoKSBBdHRlbXB0aW5nIGF1dG8gcGFpciIsIF9fZnVuY19fKTsKLSAgICAgICAgcGluX2NvZGUucGluWzBdID0gMHgzMDsKLSAgICAgICAgcGluX2NvZGUucGluWzFdID0gMHgzMDsKLSAgICAgICAgcGluX2NvZGUucGluWzJdID0gMHgzMDsKLSAgICAgICAgcGluX2NvZGUucGluWzNdID0gMHgzMDsKLQotICAgICAgICBwYWlyaW5nX2NiLmF1dG9wYWlyX2F0dGVtcHRzKys7Ci0gICAgICAgIEJUQV9EbVBpblJlcGx5KGJkX2FkZHIsIHRydWUsIDQsIHBpbl9jb2RlLnBpbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW52b2tlX3Bpbl9yZXF1ZXN0X2NiKGJkX2FkZHIsIGJkX25hbWUsIGNvZCwgcF9waW5fcmVxLT5taW5fMTZfZGlnaXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9zc3BfY2ZtX3JlcV9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIFNTUCBjb25maXJtIHJlcXVlc3QgZXZlbnQgaW4gYnRpZiBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfZG1fc3NwX2NmbV9yZXFfZXZ0KHRCVEFfRE1fU1BfQ0ZNX1JFUSogcF9zc3BfY2ZtX3JlcSkgewotICBidF9iZG5hbWVfdCBiZF9uYW1lOwotICBib29sIGlzX2luY29taW5nID0gIShwYWlyaW5nX2NiLnN0YXRlID09IEJUX0JPTkRfU1RBVEVfQk9ORElORyk7Ci0gIHVpbnQzMl90IGNvZDsKLSAgaW50IGRldl90eXBlOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIC8qIFJlbW90ZSBwcm9wZXJ0aWVzIHVwZGF0ZSAqLwotICBpZiAoQlRNX0dldFBlZXJEZXZpY2VUeXBlRnJvbUZlYXR1cmVzKHBfc3NwX2NmbV9yZXEtPmJkX2FkZHIpID09Ci0gICAgICBCVF9ERVZJQ0VfVFlQRV9EVU1PKSB7Ci0gICAgZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9EVU1POwotICB9IGVsc2UgaWYgKCFidGlmX2dldF9kZXZpY2VfdHlwZShwX3NzcF9jZm1fcmVxLT5iZF9hZGRyLCAmZGV2X3R5cGUpKSB7Ci0gICAgLy8gRmFpbGVkIHRvIGdldCBkZXZpY2UgdHlwZSwgZGVmYXVsdGluZyB0byBCUi9FRFIuCi0gICAgZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgfQotICBidGlmX3VwZGF0ZV9yZW1vdGVfcHJvcGVydGllcyhwX3NzcF9jZm1fcmVxLT5iZF9hZGRyLCBwX3NzcF9jZm1fcmVxLT5iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NzcF9jZm1fcmVxLT5kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRfREVWSUNFX1RZUEUpZGV2X3R5cGUpOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IHBfc3NwX2NmbV9yZXEtPmJkX2FkZHI7Ci0gIG1lbWNweShiZF9uYW1lLm5hbWUsIHBfc3NwX2NmbV9yZXEtPmJkX25hbWUsIEJEX05BTUVfTEVOKTsKLQotICBpZiAocGFpcmluZ19jYi5zdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRJTkcgJiYKLSAgICAgIGJkX2FkZHIgIT0gcGFpcmluZ19jYi5iZF9hZGRyKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlcygpOiBhbHJlYWR5IGluIGJvbmRpbmcgc3RhdGUsIHJlamVjdCByZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICBidGlmX2RtX3NzcF9yZXBseShiZF9hZGRyLCBCVF9TU1BfVkFSSUFOVF9QQVNTS0VZX0NPTkZJUk1BVElPTiwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogU2V0IHRoZSBwYWlyaW5nX2NiIGJhc2VkIG9uIHRoZSBsb2NhbCAmIHJlbW90ZSBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudHMKLSAgICovCi0gIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ESU5HKTsKLQotICBCVElGX1RSQUNFX0VWRU5UKCIlczoganVzdF93b3JrczolZCwgbG9jX2F1dGhfcmVxPSVkLCBybXRfYXV0aF9yZXE9JWQiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3NzcF9jZm1fcmVxLT5qdXN0X3dvcmtzLAotICAgICAgICAgICAgICAgICAgIHBfc3NwX2NmbV9yZXEtPmxvY19hdXRoX3JlcSwgcF9zc3BfY2ZtX3JlcS0+cm10X2F1dGhfcmVxKTsKLQotICAvKiBpZiBqdXN0X3dvcmtzIGFuZCBib25kaW5nIGJpdCBpcyBub3Qgc2V0IHRyZWF0IHRoaXMgYXMgdGVtcG9yYXJ5ICovCi0gIGlmIChwX3NzcF9jZm1fcmVxLT5qdXN0X3dvcmtzICYmCi0gICAgICAhKHBfc3NwX2NmbV9yZXEtPmxvY19hdXRoX3JlcSAmIEJUTV9BVVRIX0JPTkRTKSAmJgotICAgICAgIShwX3NzcF9jZm1fcmVxLT5ybXRfYXV0aF9yZXEgJiBCVE1fQVVUSF9CT05EUykgJiYKLSAgICAgICEoY2hlY2tfY29kKChSYXdBZGRyZXNzKikmcF9zc3BfY2ZtX3JlcS0+YmRfYWRkciwgQ09EX0hJRF9QT0lOVElORykpKQotICAgIHBhaXJpbmdfY2IuYm9uZF90eXBlID0gdEJUTV9TRUNfREVWX1JFQzo6Qk9ORF9UWVBFX1RFTVBPUkFSWTsKLSAgZWxzZQotICAgIHBhaXJpbmdfY2IuYm9uZF90eXBlID0gdEJUTV9TRUNfREVWX1JFQzo6Qk9ORF9UWVBFX1BFUlNJU1RFTlQ7Ci0KLSAgYnRtX3NldF9ib25kX3R5cGVfZGV2KHBfc3NwX2NmbV9yZXEtPmJkX2FkZHIsIHBhaXJpbmdfY2IuYm9uZF90eXBlKTsKLQotICBwYWlyaW5nX2NiLmlzX3NzcCA9IHRydWU7Ci0KLSAgLyogSWYgSnVzdFdvcmtzIGF1dG8tYWNjZXB0ICovCi0gIGlmIChwX3NzcF9jZm1fcmVxLT5qdXN0X3dvcmtzKSB7Ci0gICAgLyogUGFpcmluZyBjb25zZW50IGZvciBKdXN0V29ya3MgTk9UIG5lZWRlZCBpZjoKLSAgICAgKiAxLiBJbmNvbWluZyB0ZW1wb3JhcnkgcGFpcmluZyBpcyBkZXRlY3RlZAotICAgICAqLwotICAgIGlmIChpc19pbmNvbWluZyAmJgotICAgICAgICBwYWlyaW5nX2NiLmJvbmRfdHlwZSA9PSB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVEVNUE9SQVJZKSB7Ci0gICAgICBCVElGX1RSQUNFX0VWRU5UKAotICAgICAgICAgICIlczogQXV0by1hY2NlcHQgSnVzdFdvcmtzIHBhaXJpbmcgZm9yIHRlbXBvcmFyeSBpbmNvbWluZyIsIF9fZnVuY19fKTsKLSAgICAgIGJ0aWZfZG1fc3NwX3JlcGx5KGJkX2FkZHIsIEJUX1NTUF9WQVJJQU5UX0NPTlNFTlQsIHRydWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIGNvZCA9IGRldmNsYXNzMnVpbnQocF9zc3BfY2ZtX3JlcS0+ZGV2X2NsYXNzKTsKLQotICBpZiAoY29kID09IDApIHsKLSAgICBMT0dfSU5GTygiJXMgY29kIGlzIDAsIHNldCBhcyB1bmNsYXNzaWZpZWQiLCBfX2Z1bmNfXyk7Ci0gICAgY29kID0gQ09EX1VOQ0xBU1NJRklFRDsKLSAgfQotCi0gIHBhaXJpbmdfY2Iuc2RwX2F0dGVtcHRzID0gMDsKLSAgaW52b2tlX3NzcF9yZXF1ZXN0X2NiKAotICAgICAgYmRfYWRkciwgYmRfbmFtZSwgY29kLAotICAgICAgKHBfc3NwX2NmbV9yZXEtPmp1c3Rfd29ya3MgPyBCVF9TU1BfVkFSSUFOVF9DT05TRU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJUX1NTUF9WQVJJQU5UX1BBU1NLRVlfQ09ORklSTUFUSU9OKSwKLSAgICAgIHBfc3NwX2NmbV9yZXEtPm51bV92YWwpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RtX3NzcF9rZXlfbm90aWZfZXZ0KHRCVEFfRE1fU1BfS0VZX05PVElGKiBwX3NzcF9rZXlfbm90aWYpIHsKLSAgYnRfYmRuYW1lX3QgYmRfbmFtZTsKLSAgdWludDMyX3QgY29kOwotICBpbnQgZGV2X3R5cGU7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogUmVtb3RlIHByb3BlcnRpZXMgdXBkYXRlICovCi0gIGlmIChCVE1fR2V0UGVlckRldmljZVR5cGVGcm9tRmVhdHVyZXMocF9zc3Bfa2V5X25vdGlmLT5iZF9hZGRyKSA9PQotICAgICAgQlRfREVWSUNFX1RZUEVfRFVNTykgewotICAgIGRldl90eXBlID0gQlRfREVWSUNFX1RZUEVfRFVNTzsKLSAgfSBlbHNlIGlmICghYnRpZl9nZXRfZGV2aWNlX3R5cGUocF9zc3Bfa2V5X25vdGlmLT5iZF9hZGRyLCAmZGV2X3R5cGUpKSB7Ci0gICAgLy8gRmFpbGVkIHRvIGdldCBkZXZpY2UgdHlwZSwgZGVmYXVsdGluZyB0byBCUi9FRFIuCi0gICAgZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgfQotICBidGlmX3VwZGF0ZV9yZW1vdGVfcHJvcGVydGllcygKLSAgICAgIHBfc3NwX2tleV9ub3RpZi0+YmRfYWRkciwgcF9zc3Bfa2V5X25vdGlmLT5iZF9uYW1lLAotICAgICAgcF9zc3Bfa2V5X25vdGlmLT5kZXZfY2xhc3MsICh0QlRfREVWSUNFX1RZUEUpZGV2X3R5cGUpOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IHBfc3NwX2tleV9ub3RpZi0+YmRfYWRkcjsKLSAgbWVtY3B5KGJkX25hbWUubmFtZSwgcF9zc3Bfa2V5X25vdGlmLT5iZF9uYW1lLCBCRF9OQU1FX0xFTik7Ci0gIGJkX25hbWUubmFtZVtCRF9OQU1FX0xFTl0gPSAnXDAnOwotCi0gIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ESU5HKTsKLSAgcGFpcmluZ19jYi5pc19zc3AgPSB0cnVlOwotICBjb2QgPSBkZXZjbGFzczJ1aW50KHBfc3NwX2tleV9ub3RpZi0+ZGV2X2NsYXNzKTsKLQotICBpZiAoY29kID09IDApIHsKLSAgICBMT0dfSU5GTygiJXMgY29kIGlzIDAsIHNldCBhcyB1bmNsYXNzaWZpZWQiLCBfX2Z1bmNfXyk7Ci0gICAgY29kID0gQ09EX1VOQ0xBU1NJRklFRDsKLSAgfQotCi0gIGludm9rZV9zc3BfcmVxdWVzdF9jYihiZF9hZGRyLCBiZF9uYW1lLCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVF9TU1BfVkFSSUFOVF9QQVNTS0VZX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfc3NwX2tleV9ub3RpZi0+cGFzc2tleSk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9hdXRoX2NtcGxfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFeGVjdXRlcyBhdXRoZW50aWNhdGlvbiBjb21wbGV0ZSBldmVudCBpbiBidGlmIGNvbnRleHQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9kbV9hdXRoX2NtcGxfZXZ0KHRCVEFfRE1fQVVUSF9DTVBMKiBwX2F1dGhfY21wbCkgewotICAvKiBTYXZlIGxpbmsga2V5LCBpZiBub3QgdGVtcG9yYXJ5ICovCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotICBidF9ib25kX3N0YXRlX3Qgc3RhdGUgPSBCVF9CT05EX1NUQVRFX05PTkU7Ci0gIGJvb2wgc2tpcF9zZHAgPSBmYWxzZTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogYm9uZCBzdGF0ZT0lZCwgc3VjY2Vzcz0lZCwga2V5X3ByZXNlbnQ9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwYWlyaW5nX2NiLnN0YXRlLCBwX2F1dGhfY21wbC0+c3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICBwX2F1dGhfY21wbC0+a2V5X3ByZXNlbnQpOwotCi0gIHBhaXJpbmdfY2IuZmFpbF9yZWFzb24gPSBwX2F1dGhfY21wbC0+ZmFpbF9yZWFzb247Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0gcF9hdXRoX2NtcGwtPmJkX2FkZHI7Ci0gIGlmICghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpIHsKLSAgICBpZiAoKHBfYXV0aF9jbXBsLT5zdWNjZXNzKSAmJiAocF9hdXRoX2NtcGwtPmtleV9wcmVzZW50KSkgewotICAgICAgaWYgKChwX2F1dGhfY21wbC0+a2V5X3R5cGUgPCBIQ0lfTEtFWV9UWVBFX0RFQlVHX0NPTUIpIHx8Ci0gICAgICAgICAgKHBfYXV0aF9jbXBsLT5rZXlfdHlwZSA9PSBIQ0lfTEtFWV9UWVBFX0FVVEhfQ09NQikgfHwKLSAgICAgICAgICAocF9hdXRoX2NtcGwtPmtleV90eXBlID09IEhDSV9MS0VZX1RZUEVfQ0hBTkdFRF9DT01CKSB8fAotICAgICAgICAgIChwX2F1dGhfY21wbC0+a2V5X3R5cGUgPT0gSENJX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTYpIHx8Ci0gICAgICAgICAgcGFpcmluZ19jYi5ib25kX3R5cGUgPT0gdEJUTV9TRUNfREVWX1JFQzo6Qk9ORF9UWVBFX1BFUlNJU1RFTlQpIHsKLSAgICAgICAgYnRfc3RhdHVzX3QgcmV0OwotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogU3RvcmluZyBsaW5rIGtleS4ga2V5X3R5cGU9MHgleCwgYm9uZF90eXBlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9hdXRoX2NtcGwtPmtleV90eXBlLCBwYWlyaW5nX2NiLmJvbmRfdHlwZSk7Ci0gICAgICAgIHJldCA9IGJ0aWZfc3RvcmFnZV9hZGRfYm9uZGVkX2RldmljZSgmYmRfYWRkciwgcF9hdXRoX2NtcGwtPmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYXV0aF9jbXBsLT5rZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJpbmdfY2IucGluX2NvZGVfbGVuKTsKLSAgICAgICAgQVNTRVJUQyhyZXQgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJzdG9yaW5nIGxpbmsga2V5IGZhaWxlZCIsIHJldCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIiVzOiBUZW1wb3Jhcnkga2V5LiBOb3Qgc3RvcmluZy4ga2V5X3R5cGU9MHgleCwgYm9uZF90eXBlPSVkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwX2F1dGhfY21wbC0+a2V5X3R5cGUsIHBhaXJpbmdfY2IuYm9uZF90eXBlKTsKLSAgICAgICAgaWYgKHBhaXJpbmdfY2IuYm9uZF90eXBlID09IHRCVE1fU0VDX0RFVl9SRUM6OkJPTkRfVFlQRV9URU1QT1JBUlkpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VuZGluZyBCVF9CT05EX1NUQVRFX05PTkUgZm9yIFRlbXAgcGFpcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYnRpZl9zdG9yYWdlX3JlbW92ZV9ib25kZWRfZGV2aWNlKCZiZF9hZGRyKTsKLSAgICAgICAgICBib25kX3N0YXRlX2NoYW5nZWQoQlRfU1RBVFVTX1NVQ0NFU1MsIGJkX2FkZHIsIEJUX0JPTkRfU1RBVEVfTk9ORSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBfYXV0aF9jbXBsLT5zdWNjZXNzKSB7Ci0gICAgLy8gV2UgY291bGQgaGF2ZSByZWNlaXZlZCBhIG5ldyBsaW5rIGtleSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHBhaXJpbmcKLSAgICAvLyBmbG93LiAgSWYgc28sIHdlIGRvbid0IHdhbnQgdG8gcGVyZm9ybSBTRFAgb3IgYW55IG90aGVyIG9wZXJhdGlvbnMgb24gdGhlCi0gICAgLy8gYXV0aGVudGljYXRlZCBkZXZpY2UuIEFsc28sIG1ha2Ugc3VyZSB0aGF0IHRoZSBsaW5rIGtleSBpcyBub3QgZGVyaXZlZAotICAgIC8vIGZyb20gc2VjdXJlIExUSywgYmVjYXVzZSB3ZSB3aWxsIG5lZWQgdG8gcGVyZm9ybSBTRFAgaW4gY2FzZSBvZiBsaW5rIGtleQotICAgIC8vIGRlcml2YXRpb24gdG8gYWxsb3cgYm9uZCBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciB0aGUgQlIvRURSCi0gICAgLy8gdHJhbnNwb3J0IHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgQlIvRURSIGNvbm5lY3Rpb25zIHRvIHRoZSByZW1vdGUgY2FuIHVzZQotICAgIC8vIHRoZSBkZXJpdmVkIGxpbmsga2V5LgotICAgIGlmIChwX2F1dGhfY21wbC0+YmRfYWRkciAhPSBwYWlyaW5nX2NiLmJkX2FkZHIgJiYKLSAgICAgICAgKCFwYWlyaW5nX2NiLmJsZS5pc19wZW5jX2tleV9yY3ZkKSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIiBza2lwcGluZyBTRFAgc2luY2Ugd2UgZGlkIG5vdCBpbml0aWF0ZSBwYWlyaW5nIHRvICIKLSAgICAgICAgICAgICAgICA8PCBwX2F1dGhfY21wbC0+YmRfYWRkcjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpKSB7Ci0gICAgICBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9hZGRyX3R5cGUoJmJkX2FkZHIsIHBfYXV0aF9jbXBsLT5hZGRyX3R5cGUpOwotICAgIH0KLQotICAgIGludCBkZXZfdHlwZTsKLSAgICBpZiAoQlRNX0dldFBlZXJEZXZpY2VUeXBlRnJvbUZlYXR1cmVzKGJkX2FkZHIpID09IEJUX0RFVklDRV9UWVBFX0RVTU8pIHsKLSAgICAgIGRldl90eXBlID0gQlRfREVWSUNFX1RZUEVfRFVNTzsKLSAgICB9IGVsc2UgewotICAgICAgZGV2X3R5cGUgPSBwX2F1dGhfY21wbC0+ZGV2X3R5cGU7Ci0gICAgfQotICAgIGJ0aWZfdXBkYXRlX3JlbW90ZV9wcm9wZXJ0aWVzKHBfYXV0aF9jbXBsLT5iZF9hZGRyLCBwX2F1dGhfY21wbC0+YmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkZXZfdHlwZSk7Ci0gICAgcGFpcmluZ19jYi50aW1lb3V0X3JldHJpZXMgPSAwOwotICAgIHN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICAgIHN0YXRlID0gQlRfQk9ORF9TVEFURV9CT05ERUQ7Ci0gICAgYmRfYWRkciA9IHBfYXV0aF9jbXBsLT5iZF9hZGRyOwotCi0gICAgaWYgKGNoZWNrX3NkcF9ibCgmYmRfYWRkcikgJiYgY2hlY2tfY29kX2hpZCgmYmRfYWRkcikpIHsKLSAgICAgIExPR19XQVJOKCIlczpza2lwIFNEUCIsIF9fZnVuY19fKTsKLSAgICAgIHNraXBfc2RwID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKCFwYWlyaW5nX2NiLmlzX2xvY2FsX2luaXRpYXRlZCAmJiBza2lwX3NkcCkgewotICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkKHN0YXR1cywgYmRfYWRkciwgc3RhdGUpOwotCi0gICAgICBMT0dfV0FSTigiJXM6IEluY29taW5nIEhJRCBDb25uZWN0aW9uIiwgX19mdW5jX18pOwotICAgICAgYnRfcHJvcGVydHlfdCBwcm9wOwotICAgICAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0hVTUFOX0lOVEVSRkFDRSk7Ci0KLSAgICAgIHByb3AudHlwZSA9IEJUX1BST1BFUlRZX1VVSURTOwotICAgICAgcHJvcC52YWwgPSAmdXVpZDsKLSAgICAgIHByb3AubGVuID0gVXVpZDo6a051bUJ5dGVzMTI4OwotCi0gICAgICBpbnZva2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCAxLCAmcHJvcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJvb2wgaXNfY3Jvc3NrZXkgPSBmYWxzZTsKLSAgICAgIC8qIElmIGJvbmRlZCBkdWUgdG8gY3Jvc3Mta2V5LCBzYXZlIHRoZSBzdGF0aWMgYWRkcmVzcyB0b28qLwotICAgICAgaWYgKHBhaXJpbmdfY2Iuc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ESU5HICYmCi0gICAgICAgICAgcF9hdXRoX2NtcGwtPmJkX2FkZHIgIT0gcGFpcmluZ19jYi5iZF9hZGRyKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiJXM6IGJvbmRpbmcgaW5pdGlhdGVkIGR1ZSB0byBjcm9zcyBrZXksIGFkZGluZyBzdGF0aWMgYWRkcmVzcyIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIHBhaXJpbmdfY2Iuc3RhdGljX2JkYWRkciA9IGJkX2FkZHI7Ci0gICAgICAgIGlzX2Nyb3Nza2V5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghaXNfY3Jvc3NrZXkgfHwKLSAgICAgICAgICAhKHN0YWNrX2NvbmZpZ19nZXRfaW50ZXJmYWNlKCktPmdldF9wdHNfY3Jvc3NrZXlfc2RwX2Rpc2FibGUoKSkpIHsKLSAgICAgICAgLy8gRW5zdXJlIGlucXVpcnkgaXMgc3RvcHBlZCBiZWZvcmUgYXR0ZW1wdGluZyBzZXJ2aWNlIGRpc2NvdmVyeQotICAgICAgICBidGlmX2RtX2NhbmNlbF9kaXNjb3ZlcnkoKTsKLQotICAgICAgICAvKiBUcmlnZ2VyIFNEUCBvbiB0aGUgZGV2aWNlICovCi0gICAgICAgIHBhaXJpbmdfY2Iuc2RwX2F0dGVtcHRzID0gMTsKLQotICAgICAgICBpZiAoaXNfY3Jvc3NrZXkpIHsKLSAgICAgICAgICAvLyBJZiBib25kaW5nIG9jY3VycmVkIGR1ZSB0byBjcm9zcy1rZXkgcGFpcmluZywgc2VuZCBib25kaW5nIGNhbGxiYWNrCi0gICAgICAgICAgLy8gZm9yIHN0YXRpYyBhZGRyZXNzIG5vdwotICAgICAgICAgIExPR19JTkZPKCIlczogc2VuZCBib25kaW5nIHN0YXRlIHVwZGF0ZSBmb3Igc3RhdGljIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX0JPTkRJTkcpOwotICAgICAgICB9Ci0gICAgICAgIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ERUQpOwotCi0gICAgICAgIGJ0aWZfZG1fZ2V0X3JlbW90ZV9zZXJ2aWNlcyhiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQVVUTyk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIERvIG5vdCBjYWxsIGJvbmRfc3RhdGVfY2hhbmdlZF9jYiB5ZXQuIFdhaXQgdW50aWwgcmVtb3RlIHNlcnZpY2UKLSAgICAvLyBkaXNjb3ZlcnkgaXMgY29tcGxldGUKLSAgfSBlbHNlIHsKLSAgICBib29sIGlzX2JvbmRlZF9kZXZpY2VfcmVtb3ZlZCA9IGZhbHNlOwotICAgIC8vIE1hcCB0aGUgSENJIGZhaWwgcmVhc29uICB0byAgYnQgc3RhdHVzCi0gICAgc3dpdGNoIChwX2F1dGhfY21wbC0+ZmFpbF9yZWFzb24pIHsKLSAgICAgIGNhc2UgSENJX0VSUl9QQUdFX1RJTUVPVVQ6Ci0gICAgICBjYXNlIEhDSV9FUlJfTE1QX1JFU1BPTlNFX1RJTUVPVVQ6Ci0gICAgICAgIGlmIChpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9BVVRPX1JFVFJZX1BBSVJJTkcsICZiZF9hZGRyKSAmJgotICAgICAgICAgICAgcGFpcmluZ19jYi50aW1lb3V0X3JldHJpZXMpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzKCkgLSBQYWlyaW5nIHRpbWVvdXQ7IHJldHJ5aW5nICglZCkgLi4uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhaXJpbmdfY2IudGltZW91dF9yZXRyaWVzKTsKLSAgICAgICAgICAtLXBhaXJpbmdfY2IudGltZW91dF9yZXRyaWVzOwotICAgICAgICAgIGJ0aWZfZG1fY2JfY3JlYXRlX2JvbmQoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0FVVE8pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgIGNhc2UgSENJX0VSUl9DT05ORUNUSU9OX1RPVVQ6Ci0gICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19STVRfREVWX0RPV047Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRDoKLSAgICAgICAgaWYgKCFibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSkgewotICAgICAgICAgIGlzX2JvbmRlZF9kZXZpY2VfcmVtb3ZlZCA9IChidGlmX3N0b3JhZ2VfcmVtb3ZlX2JvbmRlZF9kZXZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmRfYWRkcikgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlzX2JvbmRlZF9kZXZpY2VfcmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0FVVEhfUkVKRUNURUQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBtYXAgdGhlIGF1dGggZmFpbHVyZSBjb2Rlcywgc28gd2UgY2FuIHJldHJ5IHBhaXJpbmcgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBjYXNlIEhDSV9FUlJfQVVUSF9GQUlMVVJFOgotICAgICAgY2FzZSBIQ0lfRVJSX0tFWV9NSVNTSU5HOgotICAgICAgICBpc19ib25kZWRfZGV2aWNlX3JlbW92ZWQgPSAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJ0aWZfc3RvcmFnZV9yZW1vdmVfYm9uZGVkX2RldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmRfYWRkcikgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICBjYXNlIEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFk6Ci0gICAgICBjYXNlIEhDSV9FUlJfRU5DUllfTU9ERV9OT1RfQUNDRVBUQUJMRToKLSAgICAgIGNhc2UgSENJX0VSUl9VTklUX0tFWV9VU0VEOgotICAgICAgY2FzZSBIQ0lfRVJSX1BBSVJJTkdfV0lUSF9VTklUX0tFWV9OT1RfU1VQUE9SVEVEOgotICAgICAgY2FzZSBIQ0lfRVJSX0lOU1VGRkNJRU5UX1NFQ1VSSVRZOgotICAgICAgY2FzZSBIQ0lfRVJSX1BFRVJfVVNFUjoKLSAgICAgIGNhc2UgSENJX0VSUl9VTlNQRUNJRklFRDoKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiICVzKCkgQXV0aGVudGljYXRpb24gZmFpbCByZWFzb24gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2F1dGhfY21wbC0+ZmFpbF9yZWFzb24pOwotICAgICAgICBpZiAocGFpcmluZ19jYi5hdXRvcGFpcl9hdHRlbXB0cyA9PSAxKSB7Ci0gICAgICAgICAgLyogQ3JlYXRlIHRoZSBCb25kIG9uY2UgYWdhaW4gKi8KLSAgICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzKCkgYXV0byBwYWlyIGZhaWxlZC4gUmVpbml0aWF0ZSBCb25kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICAgIGJ0aWZfZG1fY2JfY3JlYXRlX2JvbmQoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0FVVE8pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBpZiBhdXRvcGFpciBhdHRlbXB0cyBhcmUgbW9yZSB0aGFuIDEsIG9yIG5vdCBhdHRlbXB0ZWQgKi8KLSAgICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfQVVUSF9GQUlMVVJFOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICB9Ci0gICAgLyogU3BlY2lhbCBIYW5kbGluZyBmb3IgSElEIERldmljZXMgKi8KLSAgICBpZiAoY2hlY2tfY29kKCZiZF9hZGRyLCBDT0RfSElEX1BPSU5USU5HKSkgewotICAgICAgLyogUmVtb3ZlIERldmljZSBhcyBib25kZWQgaW4gbnZyYW0gYXMgYXV0aGVudGljYXRpb24gZmFpbGVkICovCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcygpOiByZW1vdmluZyBoaWQgcG9pbnRpbmcgZGV2aWNlIGZyb20gbnZyYW0iLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICBpc19ib25kZWRfZGV2aWNlX3JlbW92ZWQgPSAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYnRpZl9zdG9yYWdlX3JlbW92ZV9ib25kZWRfZGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmRfYWRkcikgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgIH0KLSAgICAvLyBSZXBvcnQgYm9uZCBzdGF0ZSBjaGFuZ2UgdG8gamF2YSBvbmx5IGlmIHdlIGFyZSBib25kaW5nIHRvIGEgZGV2aWNlIG9yCi0gICAgLy8gYSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWlyaW5nIGxpc3QuCi0gICAgaWYgKHBhaXJpbmdfY2Iuc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ESU5HIHx8IGlzX2JvbmRlZF9kZXZpY2VfcmVtb3ZlZCkgewotICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkKHN0YXR1cywgYmRfYWRkciwgc3RhdGUpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3NlYXJjaF9kZXZpY2VzX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXhlY3V0ZXMgc2VhcmNoIGRldmljZXMgY2FsbGJhY2sgZXZlbnRzIGluIGJ0aWYgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfZG1fc2VhcmNoX2RldmljZXNfZXZ0KHRCVEFfRE1fU0VBUkNIX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIKiBwX3NlYXJjaF9kYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzIGV2ZW50PSVzIiwgX19mdW5jX18sIGR1bXBfZG1fc2VhcmNoX2V2ZW50KGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0RNX0RJU0NfUkVTX0VWVDogewotICAgICAgLyogUmVtb3RlIG5hbWUgdXBkYXRlICovCi0gICAgICBpZiAoc3RybGVuKChjb25zdCBjaGFyKilwX3NlYXJjaF9kYXRhLT5kaXNjX3Jlcy5iZF9uYW1lKSkgewotICAgICAgICBidF9wcm9wZXJ0eV90IHByb3BlcnRpZXNbMV07Ci0gICAgICAgIGJ0X3N0YXR1c190IHN0YXR1czsKLQotICAgICAgICBwcm9wZXJ0aWVzWzBdLnR5cGUgPSBCVF9QUk9QRVJUWV9CRE5BTUU7Ci0gICAgICAgIHByb3BlcnRpZXNbMF0udmFsID0gcF9zZWFyY2hfZGF0YS0+ZGlzY19yZXMuYmRfbmFtZTsKLSAgICAgICAgcHJvcGVydGllc1swXS5sZW4gPSBzdHJsZW4oKGNoYXIqKXBfc2VhcmNoX2RhdGEtPmRpc2NfcmVzLmJkX25hbWUpOwotICAgICAgICBSYXdBZGRyZXNzJiBiZGFkZHIgPSBwX3NlYXJjaF9kYXRhLT5kaXNjX3Jlcy5iZF9hZGRyOwotCi0gICAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgICBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkYWRkciwgJnByb3BlcnRpZXNbMF0pOwotICAgICAgICBBU1NFUlRDKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSBwcm9wZXJ0eSIsIHN0YXR1cyk7Ci0gICAgICAgIGludm9rZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2Ioc3RhdHVzLCBiZGFkZHIsIDEsIHByb3BlcnRpZXMpOwotICAgICAgfQotICAgICAgLyogVE9ETzogU2VydmljZXM/ICovCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0RNX0lOUV9SRVNfRVZUOiB7Ci0gICAgICAvKiBpbnF1aXJ5IHJlc3VsdCAqLwotICAgICAgYnRfYmRuYW1lX3QgYmRuYW1lOwotICAgICAgdWludDhfdCByZW1vdGVfbmFtZV9sZW47Ci0gICAgICB1aW50OF90IG51bV91dWlkcyA9IDAsIG1heF9udW1fdXVpZCA9IDMyOwotICAgICAgdWludDhfdCB1dWlkX2xpc3RbMzIgKiBVdWlkOjprTnVtQnl0ZXMxNl07Ci0KLSAgICAgIHBfc2VhcmNoX2RhdGEtPmlucV9yZXMucmVtdF9uYW1lX25vdF9yZXF1aXJlZCA9Ci0gICAgICAgICAgY2hlY2tfZWlyX3JlbW90ZV9uYW1lKHBfc2VhcmNoX2RhdGEsIE5VTEwsIE5VTEwpOwotICAgICAgUmF3QWRkcmVzcyYgYmRhZGRyID0gcF9zZWFyY2hfZGF0YS0+aW5xX3Jlcy5iZF9hZGRyOwotCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcygpICVzIGRldmljZV90eXBlID0gMHgleFxuIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJkYWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHBfc2VhcmNoX2RhdGEtPmlucV9yZXMuZGV2aWNlX3R5cGUpOwotICAgICAgYmRuYW1lLm5hbWVbMF0gPSAwOwotCi0gICAgICBpZiAoIWNoZWNrX2Vpcl9yZW1vdGVfbmFtZShwX3NlYXJjaF9kYXRhLCBiZG5hbWUubmFtZSwgJnJlbW90ZV9uYW1lX2xlbikpCi0gICAgICAgIGNoZWNrX2NhY2hlZF9yZW1vdGVfbmFtZShwX3NlYXJjaF9kYXRhLCBiZG5hbWUubmFtZSwgJnJlbW90ZV9uYW1lX2xlbik7Ci0KLSAgICAgIC8qIENoZWNrIEVJUiBmb3Igc2VydmljZXMgKi8KLSAgICAgIGlmIChwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLnBfZWlyKSB7Ci0gICAgICAgIEJUTV9HZXRFaXJVdWlkTGlzdChwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLnBfZWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZWFyY2hfZGF0YS0+aW5xX3Jlcy5laXJfbGVuLCBVdWlkOjprTnVtQnl0ZXMxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1fdXVpZHMsIHV1aWRfbGlzdCwgbWF4X251bV91dWlkKTsKLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBidF9wcm9wZXJ0eV90IHByb3BlcnRpZXNbN107Ci0gICAgICAgIGJ0X2RldmljZV90eXBlX3QgZGV2X3R5cGU7Ci0gICAgICAgIHVpbnQzMl90IG51bV9wcm9wZXJ0aWVzID0gMDsKLSAgICAgICAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0KLSAgICAgICAgbWVtc2V0KHByb3BlcnRpZXMsIDAsIHNpemVvZihwcm9wZXJ0aWVzKSk7Ci0gICAgICAgIC8qIFJhd0FkZHJlc3MgKi8KLSAgICAgICAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BlcnRpZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9CREFERFIsIHNpemVvZihiZGFkZHIpLCAmYmRhZGRyKTsKLSAgICAgICAgbnVtX3Byb3BlcnRpZXMrKzsKLSAgICAgICAgLyogQkRfTkFNRSAqLwotICAgICAgICAvKiBEb24ndCBzZW5kIEJETkFNRSBpZiBpdCBpcyBlbXB0eSAqLwotICAgICAgICBpZiAoYmRuYW1lLm5hbWVbMF0pIHsKLSAgICAgICAgICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydGllc1tudW1fcHJvcGVydGllc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfUFJPUEVSVFlfQkROQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigoY2hhciopYmRuYW1lLm5hbWUpLCAmYmRuYW1lKTsKLSAgICAgICAgICBudW1fcHJvcGVydGllcysrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogREVWX0NMQVNTICovCi0gICAgICAgIHVpbnQzMl90IGNvZCA9IGRldmNsYXNzMnVpbnQocF9zZWFyY2hfZGF0YS0+aW5xX3Jlcy5kZXZfY2xhc3MpOwotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBjb2QgaXMgMHglMDZ4IiwgX19mdW5jX18sIGNvZCk7Ci0gICAgICAgIGlmIChjb2QgIT0gMCkgewotICAgICAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UsIHNpemVvZihjb2QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2QpOwotICAgICAgICAgIG51bV9wcm9wZXJ0aWVzKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBERVZfVFlQRSAqLwotICAgICAgICAvKiBGaXhNZTogQXNzdW1wdGlvbiBpcyB0aGF0IGJsdWV0b290aC5oIGFuZCBCVEUgZW51bXMgbWF0Y2ggKi8KLQotICAgICAgICAvKiBWZXJpZnkgaWYgdGhlIGRldmljZSBpcyBkdWFsIG1vZGUgaW4gTlZSQU0gKi8KLSAgICAgICAgaW50IHN0b3JlZF9kZXZpY2VfdHlwZSA9IDA7Ci0gICAgICAgIGlmIChidGlmX2dldF9kZXZpY2VfdHlwZShiZGFkZHIsICZzdG9yZWRfZGV2aWNlX3R5cGUpICYmCi0gICAgICAgICAgICAoKHN0b3JlZF9kZXZpY2VfdHlwZSAhPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUiAmJgotICAgICAgICAgICAgICBwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLmRldmljZV90eXBlID09IEJUX0RFVklDRV9UWVBFX0JSRURSKSB8fAotICAgICAgICAgICAgIChzdG9yZWRfZGV2aWNlX3R5cGUgIT0gQlRfREVWSUNFX1RZUEVfQkxFICYmCi0gICAgICAgICAgICAgIHBfc2VhcmNoX2RhdGEtPmlucV9yZXMuZGV2aWNlX3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfQkxFKSkpIHsKLSAgICAgICAgICBkZXZfdHlwZSA9IChidF9kZXZpY2VfdHlwZV90KUJUX0RFVklDRV9UWVBFX0RVTU87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGV2X3R5cGUgPSAoYnRfZGV2aWNlX3R5cGVfdClwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLmRldmljZV90eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfc2VhcmNoX2RhdGEtPmlucV9yZXMuZGV2aWNlX3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfQkxFKQotICAgICAgICAgIGFkZHJfdHlwZSA9IHBfc2VhcmNoX2RhdGEtPmlucV9yZXMuYmxlX2FkZHJfdHlwZTsKLSAgICAgICAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BlcnRpZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRSwgc2l6ZW9mKGRldl90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldl90eXBlKTsKLSAgICAgICAgbnVtX3Byb3BlcnRpZXMrKzsKLSAgICAgICAgLyogUlNTSSAqLwotICAgICAgICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydGllc1tudW1fcHJvcGVydGllc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX1JFTU9URV9SU1NJLCBzaXplb2YoaW50OF90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwX3NlYXJjaF9kYXRhLT5pbnFfcmVzLnJzc2kpKTsKLSAgICAgICAgbnVtX3Byb3BlcnRpZXMrKzsKLQotICAgICAgICAvKiBDU0lQIHN1cHBvcnRlZCBkZXZpY2UgKi8KLSAgICAgICAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJnByb3BlcnRpZXNbbnVtX3Byb3BlcnRpZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9SRU1PVEVfSVNfQ09PUkRJTkFURURfU0VUX01FTUJFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJvb2wpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBfc2VhcmNoX2RhdGEtPmlucV9yZXMuaW5jbHVkZV9yc2kpKTsKLSAgICAgICAgbnVtX3Byb3BlcnRpZXMrKzsKLQotICAgICAgICAvKiBFSVIgcXVlcmllZCBzZXJ2aWNlcyAqLwotICAgICAgICBzdGQ6OnZlY3RvcjxVdWlkPiB1dWlkMTI4X2xpc3Q7Ci0gICAgICAgIGlmIChudW1fdXVpZHMgPiAwKSB7Ci0gICAgICAgICAgdWludDE2X3QqIHBfdXVpZDE2ID0gKHVpbnQxNl90Kil1dWlkX2xpc3Q7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdXVpZHM7ICsraSkgewotICAgICAgICAgICAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KHBfdXVpZDE2W2ldKTsKLSAgICAgICAgICAgIHV1aWQxMjhfbGlzdC5wdXNoX2JhY2sodXVpZCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoCi0gICAgICAgICAgICAgICZwcm9wZXJ0aWVzW251bV9wcm9wZXJ0aWVzXSwgQlRfUFJPUEVSVFlfVVVJRFMsCi0gICAgICAgICAgICAgIG51bV91dWlkcyAqIFV1aWQ6OmtOdW1CeXRlczEyOCwgdXVpZDEyOF9saXN0LmRhdGEoKSk7Ci0gICAgICAgICAgbnVtX3Byb3BlcnRpZXMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgICBidGlmX3N0b3JhZ2VfYWRkX3JlbW90ZV9kZXZpY2UoJmJkYWRkciwgbnVtX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMpOwotICAgICAgICBBU1NFUlRDKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSAoaW5xdWlyeSkiLCBzdGF0dXMpOwotICAgICAgICBzdGF0dXMgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9hZGRyX3R5cGUoJmJkYWRkciwgYWRkcl90eXBlKTsKLSAgICAgICAgQVNTRVJUQyhzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgImZhaWxlZCB0byBzYXZlIHJlbW90ZSBhZGRyIHR5cGUgKGlucXVpcnkpIiwgc3RhdHVzKTsKLSAgICAgICAgLyogQ2FsbGJhY2sgdG8gbm90aWZ5IHVwcGVyIGxheWVyIG9mIGRldmljZSAqLwotICAgICAgICBpbnZva2VfZGV2aWNlX2ZvdW5kX2NiKG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfRE1fSU5RX0NNUExfRVZUOiB7Ci0gICAgICBCVE1fQmxlQWR2RmlsdGVyUGFyYW1TZXR1cCgKLSAgICAgICAgICBCVE1fQkxFX1NDQU5fQ09ORF9ERUxFVEUsIHN0YXRpY19jYXN0PHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVg+KDApLAotICAgICAgICAgIG51bGxwdHIsIGJhc2U6OkJpbmQoJmJ0ZV9zY2FuX2ZpbHRfcGFyYW1fY2ZnX2V2dCkpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fRElTQ19DTVBMX0VWVDogewotICAgICAgaW52b2tlX2Rpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiKEJUX0RJU0NPVkVSWV9TVE9QUEVEKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQlRBX0RNX1NFQVJDSF9DQU5DRUxfQ01QTF9FVlQ6IHsKLSAgICAgIC8qIGlmIGlucXVpcnkgaXMgbm90IGluIHByb2dyZXNzIGFuZCB3ZSBnZXQgYSBjYW5jZWwgZXZlbnQsIHRoZW4KLSAgICAgICAqIGl0IG1lYW5zIHdlIGFyZSBkb25lIHdpdGggaW5xdWlyeSwgYnV0IHJlbW90ZV9uYW1lIGZldGNoZXMgYXJlIGluCi0gICAgICAgKiBwcm9ncmVzcwotICAgICAgICoKLSAgICAgICAqIGlmIGlucXVpcnkgIGlzIGluIHByb2dyZXNzLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gYWN0IG9uIHRoaXMKLSAgICAgICAqIGNhbmNlbF9jbXBsX2V2dAotICAgICAgICogYnV0IGluc3RlYWQgd2FpdCBmb3IgdGhlIGNhbmNlbF9jbXBsX2V2dCB2aWEgdGhlIEJ1c3kgTGV2ZWwKLSAgICAgICAqCi0gICAgICAgKi8KLSAgICAgIGlmICghYnRpZl9kbV9pbnF1aXJ5X2luX3Byb2dyZXNzKSB7Ci0gICAgICAgIGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3QgYWR2X2ZpbHRfcGFyYW07Ci0gICAgICAgIG1lbXNldCgmYWR2X2ZpbHRfcGFyYW0sIDAsIHNpemVvZihidGdhdHRfZmlsdF9wYXJhbV9zZXR1cF90KSk7Ci0gICAgICAgIEJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwKEJUTV9CTEVfU0NBTl9DT05EX0RFTEVURSwgMCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRlX3NjYW5fZmlsdF9wYXJhbV9jZmdfZXZ0KSk7Ci0gICAgICAgIGludm9rZV9kaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYihCVF9ESVNDT1ZFUllfU1RPUFBFRCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgfHV1aWR8IHNob3VsZCBiZSBwYXNzZWQgYXMgZGV2aWNlIHByb3BlcnR5ICovCi1zdGF0aWMgYm9vbCBidGlmX2lzX2ludGVyZXN0aW5nX2xlX3NlcnZpY2UoYmx1ZXRvb3RoOjpVdWlkIHV1aWQpIHsKLSAgcmV0dXJuICh1dWlkLkFzMTZCaXQoKSA9PSBVVUlEX1NFUlZDTEFTU19MRV9ISUQgfHwgdXVpZCA9PSBVVUlEX0hFQVJJTkdfQUlEIHx8Ci0gICAgICAgICAgdXVpZCA9PSBVVUlEX1ZDIHx8IHV1aWQgPT0gVVVJRF9DU0lTIHx8IHV1aWQgPT0gVVVJRF9MRV9BVURJTyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3NlYXJjaF9zZXJ2aWNlc19ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIHNlYXJjaCBzZXJ2aWNlcyBldmVudCBpbiBidGlmIGNvbnRleHQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9kbV9zZWFyY2hfc2VydmljZXNfZXZ0KHRCVEFfRE1fU0VBUkNIX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSCogcF9kYXRhKSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9ETV9ESVNDX1JFU19FVlQ6IHsKLSAgICAgIGJ0X3Byb3BlcnR5X3QgcHJvcDsKLSAgICAgIHVpbnQzMl90IGkgPSAwOwotICAgICAgYnRfc3RhdHVzX3QgcmV0OwotCi0gICAgICBSYXdBZGRyZXNzJiBiZF9hZGRyID0gcF9kYXRhLT5kaXNjX3Jlcy5iZF9hZGRyOwotCi0gICAgICBMT0dfVkVSQk9TRSgicmVzdWx0PTB4JXgsIHNlcnZpY2VzIDB4JXgiLCBwX2RhdGEtPmRpc2NfcmVzLnJlc3VsdCwKLSAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZGlzY19yZXMuc2VydmljZXMpOwotICAgICAgaWYgKHBfZGF0YS0+ZGlzY19yZXMucmVzdWx0ICE9IEJUQV9TVUNDRVNTICYmCi0gICAgICAgICAgcGFpcmluZ19jYi5zdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCAmJgotICAgICAgICAgIHBhaXJpbmdfY2Iuc2RwX2F0dGVtcHRzIDwgQlRJRl9ETV9NQVhfU0RQX0FUVEVNUFRTX0FGVEVSX1BBSVJJTkcpIHsKLSAgICAgICAgaWYgKHBhaXJpbmdfY2Iuc2RwX2F0dGVtcHRzKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIlNEUCBmYWlsZWQgYWZ0ZXIgYm9uZGluZyByZS1hdHRlbXB0aW5nIik7Ci0gICAgICAgICAgcGFpcmluZ19jYi5zZHBfYXR0ZW1wdHMrKzsKLSAgICAgICAgICBidGlmX2RtX2dldF9yZW1vdGVfc2VydmljZXMoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0FVVE8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPR19XQVJOKCJTRFAgdHJpZ2dlcmVkIGJ5IHNvbWVvbmUgZmFpbGVkIHdoZW4gYm9uZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHByb3AudHlwZSA9IEJUX1BST1BFUlRZX1VVSURTOwotICAgICAgcHJvcC5sZW4gPSAwOwotICAgICAgaWYgKChwX2RhdGEtPmRpc2NfcmVzLnJlc3VsdCA9PSBCVEFfU1VDQ0VTUykgJiYKLSAgICAgICAgICAocF9kYXRhLT5kaXNjX3Jlcy5udW1fdXVpZHMgPiAwKSkgewotICAgICAgICBwcm9wLnZhbCA9IHBfZGF0YS0+ZGlzY19yZXMucF91dWlkX2xpc3Q7Ci0gICAgICAgIHByb3AubGVuID0gcF9kYXRhLT5kaXNjX3Jlcy5udW1fdXVpZHMgKiBVdWlkOjprTnVtQnl0ZXMxMjg7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwX2RhdGEtPmRpc2NfcmVzLm51bV91dWlkczsgaSsrKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgdGVtcCA9ICgocF9kYXRhLT5kaXNjX3Jlcy5wX3V1aWRfbGlzdCArIGkpKS0+VG9TdHJpbmcoKTsKLSAgICAgICAgICBMT0dfSU5GTygiaW5kZXg6JWQgdXVpZDolcyIsIGksIHRlbXAuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogb25VdWlkQ2hhbmdlZCByZXF1aXJlcyBnZXRCb25kZWREZXZpY2VzIHRvIGJlIHBvcHVsYXRlZC4KLSAgICAgICoqIGJvbmRfc3RhdGVfY2hhbmdlZCBuZWVkcyB0byBiZSBzZW50IHByaW9yIHRvIHJlbW90ZV9kZXZpY2VfcHJvcGVydHkKLSAgICAgICovCi0gICAgICBpZiAocGFpcmluZ19jYi5zdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCAmJiBwYWlyaW5nX2NiLnNkcF9hdHRlbXB0cyAmJgotICAgICAgICAgIChwX2RhdGEtPmRpc2NfcmVzLmJkX2FkZHIgPT0gcGFpcmluZ19jYi5iZF9hZGRyIHx8Ci0gICAgICAgICAgIHBfZGF0YS0+ZGlzY19yZXMuYmRfYWRkciA9PSBwYWlyaW5nX2NiLnN0YXRpY19iZGFkZHIpKSB7Ci0gICAgICAgIExPR19JTkZPKCJTRFAgc2VhcmNoIGRvbmUgZm9yICVzIiwgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBwYWlyaW5nX2NiLnNkcF9hdHRlbXB0cyA9IDA7Ci0KLSAgICAgICAgLy8gQm90aCBTRFAgYW5kIGJvbmRpbmcgYXJlIGRvbmUsIGNsZWFyIHBhaXJpbmcgY29udHJvbCBibG9jayBpbiBjYXNlCi0gICAgICAgIC8vIGl0IGlzIG5vdCBhbHJlYWR5IGNsZWFyZWQKLSAgICAgICAgcGFpcmluZ19jYiA9IHt9OwotCi0gICAgICAgIC8vIFNlbmQgb25lIGVtcHR5IFVVSUQgdG8gSmF2YSB0byB1bmJsb2NrIHBhaXJpbmcgaW50ZW50IHdoZW4gU0RQIGZhaWxlZAotICAgICAgICAvLyBvciBubyBVVUlEIGlzIGRpc2NvdmVyZWQKLSAgICAgICAgaWYgKHBfZGF0YS0+ZGlzY19yZXMucmVzdWx0ICE9IEJUQV9TVUNDRVNTIHx8Ci0gICAgICAgICAgICBwX2RhdGEtPmRpc2NfcmVzLm51bV91dWlkcyA9PSAwKSB7Ci0gICAgICAgICAgTE9HX0lORk8oIlNEUCBmYWlsZWQsIHNlbmQgZW1wdHkgVVVJRCB0byB1bmJsb2NrIGJvbmRpbmcgJXMiLAotICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICBidF9wcm9wZXJ0eV90IHByb3BfdXVpZHM7Ci0gICAgICAgICAgVXVpZCB1dWlkID0ge307Ci0KLSAgICAgICAgICBwcm9wX3V1aWRzLnR5cGUgPSBCVF9QUk9QRVJUWV9VVUlEUzsKLSAgICAgICAgICBwcm9wX3V1aWRzLnZhbCA9ICZ1dWlkOwotICAgICAgICAgIHByb3BfdXVpZHMubGVuID0gVXVpZDo6a051bUJ5dGVzMTI4OwotCi0gICAgICAgICAgLyogU2VuZCB0aGUgZXZlbnQgdG8gdGhlIEJUSUYgKi8KLSAgICAgICAgICBpbnZva2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BfdXVpZHMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX2RhdGEtPmRpc2NfcmVzLm51bV91dWlkcyAhPSAwKSB7Ci0gICAgICAgIC8qIEFsc28gd3JpdGUgdGhpcyB0byB0aGUgTlZSQU0gKi8KLSAgICAgICAgcmV0ID0gYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZiZF9hZGRyLCAmcHJvcCk7Ci0gICAgICAgIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLCAic3RvcmluZyByZW1vdGUgc2VydmljZXMgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICByZXQpOwotICAgICAgICAvKiBTZW5kIHRoZSBldmVudCB0byB0aGUgQlRJRiAqLwotICAgICAgICBpbnZva2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfRE1fRElTQ19DTVBMX0VWVDoKLSAgICAgIC8qIGZpeG1lICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0RNX1NFQVJDSF9DQU5DRUxfQ01QTF9FVlQ6Ci0gICAgICAvKiBuby1vcCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9ESVNDX0JMRV9SRVNfRVZUOiB7Ci0gICAgICBpbnQgbnVtX3Byb3BlcnRpZXMgPSAwOwotICAgICAgYnRfcHJvcGVydHlfdCBwcm9wWzJdOwotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcHJvcGVydHlfdmFsdWU7Ci0gICAgICBpbnQgbnVtX3V1aWRzID0gMDsKLQotICAgICAgZm9yIChVdWlkIHV1aWQgOiAqcF9kYXRhLT5kaXNjX2JsZV9yZXMuc2VydmljZXMpIHsKLSAgICAgICAgTE9HX1ZFUkJPU0UoInNlcnZpY2UgJXMiLCB1dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIGlmIChidGlmX2lzX2ludGVyZXN0aW5nX2xlX3NlcnZpY2UodXVpZCkpIHsKLSAgICAgICAgICBudW1fdXVpZHMrKzsKLSAgICAgICAgICBhdXRvIHZhbEFzQmUgPSB1dWlkLlRvMTI4Qml0QkUoKTsKLSAgICAgICAgICBwcm9wZXJ0eV92YWx1ZS5pbnNlcnQocHJvcGVydHlfdmFsdWUuZW5kKCksIHZhbEFzQmUuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsQXNCZS5lbmQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG51bV91dWlkcyA9PSAwKSB7Ci0gICAgICAgIExPR19JTkZPKCJObyB3ZWxsIGtub3duIEJMRSBzZXJ2aWNlcyBkaXNjb3ZlcmVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgUmF3QWRkcmVzcyYgYmRfYWRkciA9IHBfZGF0YS0+ZGlzY19ibGVfcmVzLmJkX2FkZHI7Ci0gICAgICBwcm9wWzBdLnR5cGUgPSBCVF9QUk9QRVJUWV9VVUlEUzsKLSAgICAgIHByb3BbMF0udmFsID0gKHZvaWQqKXByb3BlcnR5X3ZhbHVlLmRhdGEoKTsKLSAgICAgIHByb3BbMF0ubGVuID0gVXVpZDo6a051bUJ5dGVzMTI4ICogbnVtX3V1aWRzOwotCi0gICAgICAvKiBBbHNvIHdyaXRlIHRoaXMgdG8gdGhlIE5WUkFNICovCi0gICAgICBidF9zdGF0dXNfdCByZXQgPQotICAgICAgICAgIGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmYmRfYWRkciwgJnByb3BbMF0pOwotICAgICAgQVNTRVJUQyhyZXQgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJzdG9yaW5nIHJlbW90ZSBzZXJ2aWNlcyBmYWlsZWQiLCByZXQpOwotICAgICAgbnVtX3Byb3BlcnRpZXMrKzsKLQotICAgICAgLyogUmVtb3RlIG5hbWUgdXBkYXRlICovCi0gICAgICBpZiAoc3RybmxlbigoY29uc3QgY2hhciopcF9kYXRhLT5kaXNjX2JsZV9yZXMuYmRfbmFtZSwgQkRfTkFNRV9MRU4pKSB7Ci0gICAgICAgIHByb3BbMV0udHlwZSA9IEJUX1BST1BFUlRZX0JETkFNRTsKLSAgICAgICAgcHJvcFsxXS52YWwgPSBwX2RhdGEtPmRpc2NfYmxlX3Jlcy5iZF9uYW1lOwotICAgICAgICBwcm9wWzFdLmxlbiA9IHN0cm5sZW4oKGNoYXIqKXBfZGF0YS0+ZGlzY19ibGVfcmVzLmJkX25hbWUsIEJEX05BTUVfTEVOKTsKLQotICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkX2FkZHIsICZwcm9wWzFdKTsKLSAgICAgICAgQVNTRVJUQyhyZXQgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgImZhaWxlZCB0byBzYXZlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkiLCByZXQpOwotICAgICAgICBudW1fcHJvcGVydGllcysrOwotICAgICAgfQotCi0gICAgICAvKiBTZW5kIHRoZSBldmVudCB0byB0aGUgQlRJRiAqLwotICAgICAgaW52b2tlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYihCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Byb3BlcnRpZXMsIHByb3ApOwotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiB7IEFTU0VSVEMoMCwgInVuaGFuZGxlZCBzZWFyY2ggc2VydmljZXMgZXZlbnQiLCBldmVudCk7IH0gYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBCVElGX2RtX3JlcG9ydF9pbnF1aXJ5X3N0YXR1c19jaGFuZ2UodEJUTV9TVEFUVVMgc3RhdHVzKSB7Ci0gIGlmIChzdGF0dXMgPT0gQlRNX0lOUVVJUllfU1RBUlRFRCkgewotICAgIGludm9rZV9kaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYihCVF9ESVNDT1ZFUllfU1RBUlRFRCk7Ci0gICAgYnRpZl9kbV9pbnF1aXJ5X2luX3Byb2dyZXNzID0gdHJ1ZTsKLSAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQlRNX0lOUVVJUllfQ0FOQ0VMTEVEKSB7Ci0gICAgaW52b2tlX2Rpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiKEJUX0RJU0NPVkVSWV9TVE9QUEVEKTsKLSAgICBidGlmX2RtX2lucXVpcnlfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQlRNX0lOUVVJUllfQ09NUExFVEUpIHsKLSAgICBidGlmX2RtX2lucXVpcnlfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgfQotfQotCi12b2lkIEJUSUZfZG1fb25faHdfZXJyb3IoKSB7Ci0gIEJUSUZfVFJBQ0VfRVJST1IoIlJlY2VpdmVkIEgvVyBFcnJvci4gIik7Ci0gIC8qIEZsdXNoIHN0b3JhZ2UgZGF0YSAqLwotICBidGlmX2NvbmZpZ19mbHVzaCgpOwotICB1c2xlZXAoMTAwMDAwKTsgLyogMTAwbWlsbGlzZWNvbmRzICovCi0gIC8qIEtpbGxpbmcgdGhlIHByb2Nlc3MgdG8gZm9yY2UgYSByZXN0YXJ0IGFzIHBhcnQgb2YgZmF1bHQgdG9sZXJhbmNlICovCi0gIGtpbGwoZ2V0cGlkKCksIFNJR0tJTEwpOwotfQotCi12b2lkIEJUSUZfZG1fZW5hYmxlKCkgewotICBCRF9OQU1FIGJkbmFtZTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotICBidF9wcm9wZXJ0eV90IHByb3A7Ci0gIHByb3AudHlwZSA9IEJUX1BST1BFUlRZX0JETkFNRTsKLSAgcHJvcC5sZW4gPSBCRF9OQU1FX0xFTjsKLSAgcHJvcC52YWwgPSAodm9pZCopYmRuYW1lOwotCi0gIHN0YXR1cyA9IGJ0aWZfc3RvcmFnZV9nZXRfYWRhcHRlcl9wcm9wZXJ0eSgmcHJvcCk7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAvKiBBIG5hbWUgZXhpc3RzIGluIHRoZSBzdG9yYWdlLiBNYWtlIHRoaXMgdGhlIGRldmljZSBuYW1lICovCi0gICAgQlRBX0RtU2V0RGV2aWNlTmFtZSgoY2hhciopcHJvcC52YWwpOwotICB9IGVsc2UgewotICAgIC8qIFN0b3JhZ2UgZG9lcyBub3QgaGF2ZSBhIG5hbWUgeWV0LgotICAgICAqIFVzZSB0aGUgZGVmYXVsdCBuYW1lIGFuZCB3cml0ZSBpdCB0byB0aGUgY2hpcAotICAgICAqLwotICAgIEJUQV9EbVNldERldmljZU5hbWUoYnRpZl9nZXRfZGVmYXVsdF9sb2NhbF9uYW1lKCkpOwotICB9Ci0KLSAgLyogRW5hYmxlIGxvY2FsIHByaXZhY3kgKi8KLSAgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5KEJMRV9MT0NBTF9QUklWQUNZX0VOQUJMRUQpOwotCi0gIC8qIGZvciBlYWNoIG9mIHRoZSBlbmFibGVkIHNlcnZpY2VzIGluIHRoZSBtYXNrLCB0cmlnZ2VyIHRoZSBwcm9maWxlCi0gICAqIGVuYWJsZSAqLwotICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlX21hc2sgPSBidGlmX2dldF9lbmFibGVkX3NlcnZpY2VzX21hc2soKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBCVEFfTUFYX1NFUlZJQ0VfSUQ7IGkrKykgewotICAgIGlmIChzZXJ2aWNlX21hc2sgJiAodEJUQV9TRVJWSUNFX01BU0spKEJUQV9TRVJWSUNFX0lEX1RPX1NFUlZJQ0VfTUFTSyhpKSkpIHsKLSAgICAgIGJ0aWZfaW5fZXhlY3V0ZV9zZXJ2aWNlX3JlcXVlc3QoaSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0gIC8qIGNsZWFyIGNvbnRyb2wgYmxvY2tzICovCi0gIG1lbXNldCgmcGFpcmluZ19jYiwgMCwgc2l6ZW9mKGJ0aWZfZG1fcGFpcmluZ19jYl90KSk7Ci0gIHBhaXJpbmdfY2IuYm9uZF90eXBlID0gdEJUTV9TRUNfREVWX1JFQzo6Qk9ORF9UWVBFX1BFUlNJU1RFTlQ7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gdHJpZ2dlciB0aGUgYWRhcHRlcl9wcm9wZXJ0aWVzX2NiCi0gICoqIGFuZCBib25kZWRfZGV2aWNlc19pbmZvX2NiCi0gICovCi0gIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9kZXZpY2VzKCk7Ci0gIGJsdWV0b290aDo6YnFyOjpFbmFibGVCdFF1YWxpdHlSZXBvcnQodHJ1ZSk7Ci0gIGJ0aWZfZW5hYmxlX2JsdWV0b290aF9ldnQoKTsKLX0KLQotdm9pZCBCVElGX2RtX2Rpc2FibGUoKSB7Ci0gIC8qIGZvciBlYWNoIG9mIHRoZSBlbmFibGVkIHNlcnZpY2VzIGluIHRoZSBtYXNrLCB0cmlnZ2VyIHRoZSBwcm9maWxlCi0gICAqIGRpc2FibGUgKi8KLSAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZV9tYXNrID0gYnRpZl9nZXRfZW5hYmxlZF9zZXJ2aWNlc19tYXNrKCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPD0gQlRBX01BWF9TRVJWSUNFX0lEOyBpKyspIHsKLSAgICBpZiAoc2VydmljZV9tYXNrICYgKHRCVEFfU0VSVklDRV9NQVNLKShCVEFfU0VSVklDRV9JRF9UT19TRVJWSUNFX01BU0soaSkpKSB7Ci0gICAgICBidGlmX2luX2V4ZWN1dGVfc2VydmljZV9yZXF1ZXN0KGksIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgYmx1ZXRvb3RoOjpicXI6OkVuYWJsZUJ0UXVhbGl0eVJlcG9ydChmYWxzZSk7Ci0gIExPR19JTkZPKCJTdGFjayBkZXZpY2UgbWFuYWdlciBzaHV0ZG93biBmaW5pc2hlZCIpOwotICBmdXR1cmVfcmVhZHkoc3RhY2tfbWFuYWdlcl9nZXRfaGFja19mdXR1cmUoKSwgRlVUVVJFX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV91cHN0cmVhbXNfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIFVQU1RSRUFNUyBldmVudHMgaW4gYnRpZiBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfZG1fdXBzdHJlYW1zX2V2dCh1aW50MTZfdCBldmVudCwgY2hhciogcF9wYXJhbSkgewotICB0QlRBX0RNX1NFQyogcF9kYXRhID0gKHRCVEFfRE1fU0VDKilwX3BhcmFtOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0KLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGV2OiAlcyIsIF9fZnVuY19fLCBkdW1wX2RtX2V2ZW50KGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0RNX1BJTl9SRVFfRVZUOgotICAgICAgYnRpZl9kbV9waW5fcmVxX2V2dCgmcF9kYXRhLT5waW5fcmVxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfRE1fQVVUSF9DTVBMX0VWVDoKLSAgICAgIGJ0aWZfZG1fYXV0aF9jbXBsX2V2dCgmcF9kYXRhLT5hdXRoX2NtcGwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9CT05EX0NBTkNFTF9DTVBMX0VWVDoKLSAgICAgIGlmIChpc19ib25kaW5nX29yX3NkcCgpKSB7Ci0gICAgICAgIGJkX2FkZHIgPSBwYWlyaW5nX2NiLmJkX2FkZHI7Ci0gICAgICAgIGJ0bV9zZXRfYm9uZF90eXBlX2RldihwYWlyaW5nX2NiLmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVU5LTk9XTik7Ci0gICAgICAgIGJvbmRfc3RhdGVfY2hhbmdlZCgoYnRfc3RhdHVzX3QpcF9kYXRhLT5ib25kX2NhbmNlbF9jbXBsLnJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIsIEJUX0JPTkRfU1RBVEVfTk9ORSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0RNX1NQX0NGTV9SRVFfRVZUOgotICAgICAgYnRpZl9kbV9zc3BfY2ZtX3JlcV9ldnQoJnBfZGF0YS0+Y2ZtX3JlcSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9TUF9LRVlfTk9USUZfRVZUOgotICAgICAgYnRpZl9kbV9zc3Bfa2V5X25vdGlmX2V2dCgmcF9kYXRhLT5rZXlfbm90aWYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9ERVZfVU5QQUlSRURfRVZUOgotICAgICAgYmRfYWRkciA9IHBfZGF0YS0+bGlua19kb3duLmJkX2FkZHI7Ci0gICAgICBidG1fc2V0X2JvbmRfdHlwZV9kZXYocF9kYXRhLT5saW5rX2Rvd24uYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVU5LTk9XTik7Ci0KLS8qc3BlY2lhbCBoYW5kbGluZyBmb3IgSElEIGRldmljZXMgKi8KLSNpZiAoZGVmaW5lZChCVEFfSEhfSU5DTFVERUQpICYmIChCVEFfSEhfSU5DTFVERUQgPT0gVFJVRSkpCi0gICAgICBidGlmX2hoX3JlbW92ZV9kZXZpY2UoYmRfYWRkcik7Ci0jZW5kaWYKLSNpZiAoZGVmaW5lZChCVEFfSERfSU5DTFVERUQpICYmIChCVEFfSERfSU5DTFVERUQgPT0gVFJVRSkpCi0gICAgICBidGlmX2hkX3JlbW92ZV9kZXZpY2UoYmRfYWRkcik7Ci0jZW5kaWYKLSAgICAgIGJ0aWZfaGVhcmluZ19haWRfZ2V0X2ludGVyZmFjZSgpLT5SZW1vdmVEZXZpY2UoYmRfYWRkcik7Ci0KLSAgICAgIGlmIChibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnQ6OklzQ3Npc0NsaWVudFJ1bm5pbmcoKSkKLSAgICAgICAgYnRpZl9jc2lzX2NsaWVudF9nZXRfaW50ZXJmYWNlKCktPlJlbW92ZURldmljZShiZF9hZGRyKTsKLQotICAgICAgaWYgKExlQXVkaW9DbGllbnQ6OklzTGVBdWRpb0NsaWVudFJ1bm5pbmcoKSkKLSAgICAgICAgYnRpZl9sZV9hdWRpb19nZXRfaW50ZXJmYWNlKCktPlJlbW92ZURldmljZShiZF9hZGRyKTsKLQotICAgICAgaWYgKFZvbHVtZUNvbnRyb2w6OklzVm9sdW1lQ29udHJvbFJ1bm5pbmcoKSkgewotICAgICAgICBidGlmX3ZvbHVtZV9jb250cm9sX2dldF9pbnRlcmZhY2UoKS0+UmVtb3ZlRGV2aWNlKGJkX2FkZHIpOwotICAgICAgfQotCi0gICAgICBidGlmX3N0b3JhZ2VfcmVtb3ZlX2JvbmRlZF9kZXZpY2UoJmJkX2FkZHIpOwotICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX05PTkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9MSU5LX1VQX0VWVDoKLSAgICAgIGJkX2FkZHIgPSBwX2RhdGEtPmxpbmtfdXAuYmRfYWRkcjsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ETV9MSU5LX1VQX0VWVC4gU2VuZGluZyBCVF9BQ0xfU1RBVEVfQ09OTkVDVEVEIik7Ci0KLSAgICAgIGJ0aWZfdXBkYXRlX3JlbW90ZV92ZXJzaW9uX3Byb3BlcnR5KCZiZF9hZGRyKTsKLQotICAgICAgaW52b2tlX2FjbF9zdGF0ZV9jaGFuZ2VkX2NiKAotICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9BQ0xfU1RBVEVfQ09OTkVDVEVELAotICAgICAgICAgIChpbnQpcF9kYXRhLT5saW5rX3VwLnRyYW5zcG9ydF9saW5rX3R5cGUsIEhDSV9TVUNDRVNTKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfRE1fTElOS19ET1dOX0VWVDoKLSAgICAgIGJkX2FkZHIgPSBwX2RhdGEtPmxpbmtfZG93bi5iZF9hZGRyOwotICAgICAgYnRtX3NldF9ib25kX3R5cGVfZGV2KHBfZGF0YS0+bGlua19kb3duLmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfREVWX1JFQzo6Qk9ORF9UWVBFX1VOS05PV04pOwotICAgICAgYnRpZl9hdl9hY2xfZGlzY29ubmVjdGVkKGJkX2FkZHIpOwotICAgICAgaW52b2tlX2FjbF9zdGF0ZV9jaGFuZ2VkX2NiKAotICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9BQ0xfU1RBVEVfRElTQ09OTkVDVEVELAotICAgICAgICAgIChpbnQpcF9kYXRhLT5saW5rX2Rvd24udHJhbnNwb3J0X2xpbmtfdHlwZSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxidF9oY2lfZXJyb3JfY29kZV90PihidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlKCkpKTsKLSAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAiU2VudCBCVF9BQ0xfU1RBVEVfRElTQ09OTkVDVEVEIHVwd2FyZCBhcyBBQ0wgbGluayBkb3duIGV2ZW50ICIKLSAgICAgICAgICAiZGV2aWNlOiVzIHJlYXNvbjolcyIsCi0gICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpLAotICAgICAgICAgIGhjaV9yZWFzb25fY29kZV90ZXh0KAotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0SENJX1JFQVNPTj4oYnRtX2dldF9hY2xfZGlzY19yZWFzb25fY29kZSgpKSkKLSAgICAgICAgICAgICAgLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9CTEVfS0VZX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ETV9CTEVfS0VZX0VWVCBrZXlfdHlwZT0weCUwMnggIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5ibGVfa2V5LmtleV90eXBlKTsKLQotICAgICAgLyogSWYgdGhpcyBwYWlyaW5nIGlzIGJ5LXByb2R1Y3Qgb2YgbG9jYWwgaW5pdGlhdGVkIEdBVFQgY2xpZW50IFJlYWQgb3IKLSAgICAgIFdyaXRlLAotICAgICAgQlRBIHdvdWxkIG5vdCBoYXZlIHNlbnQgQlRBX0RNX0JMRV9TRUNfUkVRX0VWVCBldmVudCBhbmQgQm9uZCBzdGF0ZSB3b3VsZAotICAgICAgbm90Ci0gICAgICBoYXZlIHNldHVwIHByb3Blcmx5LiBTZXR1cCBwYWlyaW5nX2NiIGFuZCBub3RpZnkgQXBwIGFib3V0IEJvbmRpbmcgc3RhdGUKLSAgICAgIG5vdyovCi0gICAgICBpZiAocGFpcmluZ19jYi5zdGF0ZSAhPSBCVF9CT05EX1NUQVRFX0JPTkRJTkcpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICJCb25kIHN0YXRlIG5vdCBzZW50IHRvIEFwcCBzbyBmYXIuTm90aWZ5IHRoZSBhcHAgbm93Iik7Ci0gICAgICAgIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgcF9kYXRhLT5ibGVfa2V5LmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9CT05EX1NUQVRFX0JPTkRJTkcpOwotICAgICAgfSBlbHNlIGlmIChwYWlyaW5nX2NiLmJkX2FkZHIgIT0gcF9kYXRhLT5ibGVfa2V5LmJkX2FkZHIpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiQkQgbWlzbWF0Y2ggZGlzY2FyZCBCTEUga2V5X3R5cGU9JWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmJsZV9rZXkua2V5X3R5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChwX2RhdGEtPmJsZV9rZXkua2V5X3R5cGUpIHsKLSAgICAgICAgY2FzZSBCVE1fTEVfS0VZX1BFTkM6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiUmN2IEJUTV9MRV9LRVlfUEVOQyIpOwotICAgICAgICAgIHBhaXJpbmdfY2IuYmxlLmlzX3BlbmNfa2V5X3JjdmQgPSB0cnVlOwotICAgICAgICAgIHBhaXJpbmdfY2IuYmxlLnBlbmNfa2V5ID0gcF9kYXRhLT5ibGVfa2V5LnBfa2V5X3ZhbHVlLT5wZW5jX2tleTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUTV9MRV9LRVlfUElEOgotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIlJjdiBCVE1fTEVfS0VZX1BJRCIpOwotICAgICAgICAgIHBhaXJpbmdfY2IuYmxlLmlzX3BpZF9rZXlfcmN2ZCA9IHRydWU7Ci0gICAgICAgICAgcGFpcmluZ19jYi5ibGUucGlkX2tleSA9IHBfZGF0YS0+YmxlX2tleS5wX2tleV92YWx1ZS0+cGlkX2tleTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUTV9MRV9LRVlfUENTUks6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiUmN2IEJUTV9MRV9LRVlfUENTUksiKTsKLSAgICAgICAgICBwYWlyaW5nX2NiLmJsZS5pc19wY3Nya19rZXlfcmN2ZCA9IHRydWU7Ci0gICAgICAgICAgcGFpcmluZ19jYi5ibGUucGNzcmtfa2V5ID0gcF9kYXRhLT5ibGVfa2V5LnBfa2V5X3ZhbHVlLT5wY3Nya19rZXk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVE1fTEVfS0VZX0xFTkM6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiUmN2IEJUTV9MRV9LRVlfTEVOQyIpOwotICAgICAgICAgIHBhaXJpbmdfY2IuYmxlLmlzX2xlbmNfa2V5X3JjdmQgPSB0cnVlOwotICAgICAgICAgIHBhaXJpbmdfY2IuYmxlLmxlbmNfa2V5ID0gcF9kYXRhLT5ibGVfa2V5LnBfa2V5X3ZhbHVlLT5sZW5jX2tleTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJUTV9MRV9LRVlfTENTUks6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiUmN2IEJUTV9MRV9LRVlfTENTUksiKTsKLSAgICAgICAgICBwYWlyaW5nX2NiLmJsZS5pc19sY3Nya19rZXlfcmN2ZCA9IHRydWU7Ci0gICAgICAgICAgcGFpcmluZ19jYi5ibGUubGNzcmtfa2V5ID0gcF9kYXRhLT5ibGVfa2V5LnBfa2V5X3ZhbHVlLT5sY3Nya19rZXk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVE1fTEVfS0VZX0xJRDoKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCJSY3YgQlRNX0xFX0tFWV9MSUQiKTsKLSAgICAgICAgICBwYWlyaW5nX2NiLmJsZS5pc19saWRrX2tleV9yY3ZkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoInVua25vd24gQkxFIGtleSB0eXBlICgweCUwMngpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+YmxlX2tleS5rZXlfdHlwZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9CTEVfQ09OU0VOVF9SRVFfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0RNX0JMRV9DT05TRU5UX1JFUV9FVlQuICIpOwotICAgICAgYnRpZl9kbV9ibGVfc2VjX3JlcV9ldnQoJnBfZGF0YS0+YmxlX3JlcSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9CTEVfU0VDX1JFUV9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfRE1fQkxFX1NFQ19SRVFfRVZULiAiKTsKLSAgICAgIGJ0aWZfZG1fYmxlX3NlY19yZXFfZXZ0KCZwX2RhdGEtPmJsZV9yZXEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0RNX0JMRV9QQVNTS0VZX05PVElGX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ETV9CTEVfUEFTU0tFWV9OT1RJRl9FVlQuICIpOwotICAgICAgYnRpZl9kbV9ibGVfa2V5X25vdGlmX2V2dCgmcF9kYXRhLT5rZXlfbm90aWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fQkxFX1BBU1NLRVlfUkVRX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ETV9CTEVfUEFTU0tFWV9SRVFfRVZULiAiKTsKLSAgICAgIGJ0aWZfZG1fYmxlX3Bhc3NrZXlfcmVxX2V2dCgmcF9kYXRhLT5waW5fcmVxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0RNX0JMRV9OQ19SRVFfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0RNX0JMRV9QQVNTS0VZX1JFUV9FVlQuICIpOwotICAgICAgYnRpZl9kbV9ibGVfa2V5X25jX3JlcV9ldnQoJnBfZGF0YS0+a2V5X25vdGlmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0RNX0JMRV9PT0JfUkVRX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ETV9CTEVfT09CX1JFUV9FVlQuICIpOwotICAgICAgYnRpZl9kbV9ibGVfb29iX3JlcV9ldnQoJnBfZGF0YS0+cm10X29vYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9CTEVfU0NfT09CX1JFUV9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfRE1fQkxFX1NDX09PQl9SRVFfRVZULiAiKTsKLSAgICAgIGJ0aWZfZG1fYmxlX3NjX29vYl9yZXFfZXZ0KCZwX2RhdGEtPnJtdF9vb2IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfRE1fQkxFX1NDX0NSX0xPQ19PT0JfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0RNX0JMRV9TQ19DUl9MT0NfT09CX0VWVCIpOwotICAgICAgYnRpZl9kbV9wcm9jX2xvY19vb2IoQlRfVFJBTlNQT1JUX0xFLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5sb2NhbF9vb2JfZGF0YS5sb2NhbF9vb2JfYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bG9jYWxfb29iX2RhdGEubG9jYWxfb29iX3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9CTEVfTE9DQUxfSVJfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0RNX0JMRV9MT0NBTF9JUl9FVlQuICIpOwotICAgICAgYmxlX2xvY2FsX2tleV9jYi5pc19pZF9rZXlzX3JjdmQgPSB0cnVlOwotICAgICAgYmxlX2xvY2FsX2tleV9jYi5pZF9rZXlzLmlyayA9IHBfZGF0YS0+YmxlX2lkX2tleXMuaXJrOwotICAgICAgYmxlX2xvY2FsX2tleV9jYi5pZF9rZXlzLmlyID0gcF9kYXRhLT5ibGVfaWRfa2V5cy5pcjsKLSAgICAgIGJsZV9sb2NhbF9rZXlfY2IuaWRfa2V5cy5kaGsgPSBwX2RhdGEtPmJsZV9pZF9rZXlzLmRoazsKLSAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2xvY2FsX2tleShibGVfbG9jYWxfa2V5X2NiLmlkX2tleXMuaXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0lSSyk7Ci0gICAgICBidGlmX3N0b3JhZ2VfYWRkX2JsZV9sb2NhbF9rZXkoYmxlX2xvY2FsX2tleV9jYi5pZF9rZXlzLmlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0lSKTsKLSAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2xvY2FsX2tleShibGVfbG9jYWxfa2V5X2NiLmlkX2tleXMuZGhrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0RISyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ETV9CTEVfTE9DQUxfRVJfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0RNX0JMRV9MT0NBTF9FUl9FVlQuICIpOwotICAgICAgYmxlX2xvY2FsX2tleV9jYi5pc19lcl9yY3ZkID0gdHJ1ZTsKLSAgICAgIGJsZV9sb2NhbF9rZXlfY2IuZXIgPSBwX2RhdGEtPmJsZV9lcjsKLSAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2xvY2FsX2tleShibGVfbG9jYWxfa2V5X2NiLmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0VSKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfRE1fQkxFX0FVVEhfQ01QTF9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfRE1fQkxFX0FVVEhfQ01QTF9FVlQuICIpOwotICAgICAgYnRpZl9kbV9ibGVfYXV0aF9jbXBsX2V2dCgmcF9kYXRhLT5hdXRoX2NtcGwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9MRV9GRUFUVVJFU19SRUFEOgotICAgICAgYnRpZl9nZXRfYWRhcHRlcl9wcm9wZXJ0eShCVF9QUk9QRVJUWV9MT0NBTF9MRV9GRUFUVVJFUyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmhhbmRsZWQgZXZlbnQgKCVkKSIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRlX2RtX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3dpdGNoZXMgY29udGV4dCBmcm9tIEJURSB0byBCVElGIGZvciBhbGwgRE0gZXZlbnRzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBidGVfZG1fZXZ0KHRCVEFfRE1fU0VDX0VWVCBldmVudCwgdEJUQV9ETV9TRUMqIHBfZGF0YSkgewotICBidGlmX2RtX3Vwc3RyZWFtc19ldnQoZXZlbnQsIChjaGFyKilwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2VuZXJneV9pbmZvX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTd2l0Y2hlcyBjb250ZXh0IGZyb20gQlRFIHRvIEJUSUYgZm9yIERNIGVuZXJneSBpbmZvIGV2ZW50Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0YV9lbmVyZ3lfaW5mb19jYih0QlRNX0JMRV9UWF9USU1FX01TIHR4X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUlhfVElNRV9NUyByeF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0lETEVfVElNRV9NUyBpZGxlX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfRU5FUkdZX1VTRUQgZW5lcmd5X3VzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DT05UUkxfU1RBVEUgY3RybF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1NUQVRVUyBzdGF0dXMpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICJlbmVyZ3lfaW5mb19jYi1TdGF0dXM6JWQsc3RhdGU9JWQsdHhfdD0lbGQsIHJ4X3Q9JWxkLCAiCi0gICAgICAiaWRsZV90aW1lPSVsZCx1c2VkPSVsZCIsCi0gICAgICBzdGF0dXMsIGN0cmxfc3RhdGUsIHR4X3RpbWUsIHJ4X3RpbWUsIGlkbGVfdGltZSwgZW5lcmd5X3VzZWQpOwotCi0gIGJ0X2FjdGl2aXR5X2VuZXJneV9pbmZvIGVuZXJneV9pbmZvOwotICBlbmVyZ3lfaW5mby5zdGF0dXMgPSBzdGF0dXM7Ci0gIGVuZXJneV9pbmZvLmN0cmxfc3RhdGUgPSBjdHJsX3N0YXRlOwotICBlbmVyZ3lfaW5mby5yeF90aW1lID0gcnhfdGltZTsKLSAgZW5lcmd5X2luZm8udHhfdGltZSA9IHR4X3RpbWU7Ci0gIGVuZXJneV9pbmZvLmlkbGVfdGltZSA9IGlkbGVfdGltZTsKLSAgZW5lcmd5X2luZm8uZW5lcmd5X3VzZWQgPSBlbmVyZ3lfdXNlZDsKLQotICBidF91aWRfdHJhZmZpY190KiBkYXRhID0gdWlkX3NldF9yZWFkX2FuZF9jbGVhcih1aWRfc2V0KTsKLSAgaW52b2tlX2VuZXJneV9pbmZvX2NiKGVuZXJneV9pbmZvLCBkYXRhKTsKLX0KLQotLyogU2NhbiBmaWx0ZXIgcGFyYW0gY29uZmlnIGV2ZW50ICovCi1zdGF0aWMgdm9pZCBidGVfc2Nhbl9maWx0X3BhcmFtX2NmZ19ldnQodWludDhfdCBhdmJsX3NwYWNlLCB1aW50OF90IGFjdGlvbl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1RBVFVTIGJ0bV9zdGF0dXMpIHsKLSAgLyogVGhpcyBldmVudCBvY2N1cnMgb24gY2FsbGluZyBCVEFfRG1CbGVDZmdGaWx0ZXJDb25kaXRpb24gaW50ZXJuYWxseSwKLSAgKiogYW5kIHRoYXQgaXMgd2h5IHRoZXJlIGlzIG5vIEhBTCBjYWxsYmFjawotICAqLwotICBpZiAoYnRtX3N0YXR1cyAhPSBidG1fc3RhdHVzX3ZhbHVlKEJUTV9TVUNDRVNTKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzLCAlZCIsIF9fZnVuY19fLCBidG1fc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIGJ0aWYgYXBpIGZ1bmN0aW9ucyAobm8gY29udGV4dCBzd2l0Y2gpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3N0YXJ0X2Rpc2NvdmVyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgZGV2aWNlIGRpc2NvdmVyeS9pbnF1aXJ5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kbV9zdGFydF9kaXNjb3Zlcnkodm9pZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoYnRhX2RtX2lzX3NlYXJjaF9yZXF1ZXN0X3F1ZXVlZCgpKSB7Ci0gICAgTE9HX0lORk8oIiVzIHNraXBwaW5nIHN0YXJ0IGRpc2NvdmVyeSBiZWNhdXNlIGEgcmVxdWVzdCBpcyBxdWV1ZWQiLAotICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBDbGVhbnVwIGFueXRoaW5nIHJlbWFpbmluZyBvbiBpbmRleCAwICovCi0gIEJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwKEJUTV9CTEVfU0NBTl9DT05EX0RFTEVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEJUTV9CTEVfUEZfRklMVF9JTkRFWD4oMCksIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0ZV9zY2FuX2ZpbHRfcGFyYW1fY2ZnX2V2dCkpOwotCi0gIGF1dG8gYWR2X2ZpbHRfcGFyYW0gPSBzdGQ6Om1ha2VfdW5pcXVlPGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q+KCk7Ci0gIC8qIEFkZCBhbiBhbGxvdy1hbGwgZmlsdGVyIG9uIGluZGV4IDAqLwotICBhZHZfZmlsdF9wYXJhbS0+ZGVseV9tb2RlID0gSU1NRURJQVRFX0RFTFlfTU9ERTsKLSAgYWR2X2ZpbHRfcGFyYW0tPmZlYXRfc2VsbiA9IEFMTE9XX0FMTF9GSUxURVI7Ci0gIGFkdl9maWx0X3BhcmFtLT5maWx0X2xvZ2ljX3R5cGUgPSBCVEFfRE1fQkxFX1BGX0ZJTFRfTE9HSUNfT1I7Ci0gIGFkdl9maWx0X3BhcmFtLT5saXN0X2xvZ2ljX3R5cGUgPSBCVEFfRE1fQkxFX1BGX0xJU1RfTE9HSUNfT1I7Ci0gIGFkdl9maWx0X3BhcmFtLT5yc3NpX2xvd190aHJlcyA9IExPV0VTVF9SU1NJX1ZBTFVFOwotICBhZHZfZmlsdF9wYXJhbS0+cnNzaV9oaWdoX3RocmVzID0gTE9XRVNUX1JTU0lfVkFMVUU7Ci0gIEJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwKAotICAgICAgQlRNX0JMRV9TQ0FOX0NPTkRfQURELCBzdGF0aWNfY2FzdDx0QlRNX0JMRV9QRl9GSUxUX0lOREVYPigwKSwKLSAgICAgIHN0ZDo6bW92ZShhZHZfZmlsdF9wYXJhbSksIGJhc2U6OkJpbmQoJmJ0ZV9zY2FuX2ZpbHRfcGFyYW1fY2ZnX2V2dCkpOwotCi0gIC8qIFdpbGwgYmUgZW5hYmxlZCB0byB0cnVlIG9uY2UgaW5xdWlyeSBidXN5IGxldmVsIGhhcyBiZWVuIHJlY2VpdmVkICovCi0gIGJ0aWZfZG1faW5xdWlyeV9pbl9wcm9ncmVzcyA9IGZhbHNlOwotICAvKiBmaW5kIG5lYXJieSBkZXZpY2VzICovCi0gIEJUQV9EbVNlYXJjaChidGlmX2RtX3NlYXJjaF9kZXZpY2VzX2V2dCwgaXNfYm9uZGluZ19vcl9zZHAoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2NhbmNlbF9kaXNjb3ZlcnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbmNlbHMgc2VhcmNoCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kbV9jYW5jZWxfZGlzY292ZXJ5KHZvaWQpIHsKLSAgTE9HX0lORk8oIkNhbmNlbCBzZWFyY2giKTsKLSAgQlRBX0RtU2VhcmNoQ2FuY2VsKCk7Ci19Ci0KLWJvb2wgYnRpZl9kbV9wYWlyaW5nX2lzX2J1c3koKSB7Ci0gIHJldHVybiBwYWlyaW5nX2NiLnN0YXRlICE9IEJUX0JPTkRfU1RBVEVfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZG1fY3JlYXRlX2JvbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYXRlIGJvbmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRldmljZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fY3JlYXRlX2JvbmQoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCBpbnQgdHJhbnNwb3J0KSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBiZF9hZGRyPSVzLCB0cmFuc3BvcnQ9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgdHJhbnNwb3J0KTsKLSAgYnRpZl9zdGF0c19hZGRfYm9uZF9ldmVudChiZF9hZGRyLCBCVElGX0RNX0ZVTkNfQ1JFQVRFX0JPTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcmluZ19jYi5zdGF0ZSk7Ci0KLSAgcGFpcmluZ19jYi50aW1lb3V0X3JldHJpZXMgPSBOVU1fVElNRU9VVF9SRVRSSUVTOwotICBidGlmX2RtX2NiX2NyZWF0ZV9ib25kKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2NyZWF0ZV9ib25kX291dF9vZl9iYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWF0ZSBib25kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UgdXNpbmcgb3V0IG9mIGJhbmQKLSAqICAgICAgICAgICAgICAgICAgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fY3JlYXRlX2JvbmRfb3V0X29mX2JhbmQoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X29vYl9kYXRhX3QgcDE5Ml9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X29vYl9kYXRhX3QgcDI1Nl9kYXRhKSB7Ci0gIGJ0X29vYl9kYXRhX3QgZW1wdHlfZGF0YTsKLSAgbWVtc2V0KCZlbXB0eV9kYXRhLCAwLCBzaXplb2YoZW1wdHlfZGF0YSkpOwotCi0gIG9vYl9jYi5iZGFkZHIgPSBiZF9hZGRyOwotICBvb2JfY2IudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICBvb2JfY2IuZGF0YV9wcmVzZW50ID0gKGludClCVE1fT09CX05PTkU7Ci0gIGlmIChtZW1jbXAoJnAxOTJfZGF0YSwgJmVtcHR5X2RhdGEsIHNpemVvZihwMTkyX2RhdGEpKSAhPSAwKSB7Ci0gICAgbWVtY3B5KCZvb2JfY2IucDE5Ml9kYXRhLCAmcDE5Ml9kYXRhLCBzaXplb2YoYnRfb29iX2RhdGFfdCkpOwotICAgIG9vYl9jYi5kYXRhX3ByZXNlbnQgPSAoaW50KUJUTV9PT0JfUFJFU0VOVF8xOTI7Ci0gIH0KLQotICBpZiAobWVtY21wKCZwMjU2X2RhdGEsICZlbXB0eV9kYXRhLCBzaXplb2YocDI1Nl9kYXRhKSkgIT0gMCkgewotICAgIG1lbWNweSgmb29iX2NiLnAyNTZfZGF0YSwgJnAyNTZfZGF0YSwgc2l6ZW9mKGJ0X29vYl9kYXRhX3QpKTsKLSAgICBpZiAob29iX2NiLmRhdGFfcHJlc2VudCA9PSAoaW50KUJUTV9PT0JfUFJFU0VOVF8xOTIpIHsKLSAgICAgIG9vYl9jYi5kYXRhX3ByZXNlbnQgPSAoaW50KUJUTV9PT0JfUFJFU0VOVF8xOTJfQU5EXzI1NjsKLSAgICB9IGVsc2UgewotICAgICAgb29iX2NiLmRhdGFfcHJlc2VudCA9IChpbnQpQlRNX09PQl9QUkVTRU5UXzI1NjsKLSAgICB9Ci0gIH0KLQotICB1aW50OF90IGVtcHR5W10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0gIHN3aXRjaCAodHJhbnNwb3J0KSB7Ci0gICAgY2FzZSBCVF9UUkFOU1BPUlRfQlJfRURSOgotICAgICAgLy8gVE9ETygxODIxNjI1ODkpOiBGbGVzaCBvdXQgY2xhc3NpYyBpbXBsIGluIGxlZ2FjeSBCVE1TZWMKLSAgICAgIC8vIE5vdGhpbmcgdG8gZG8geWV0LCBidXQgbm90IGFuIGVycm9yCi0KLSAgICAgIC8vIFRoZSBjb250cm9sbGVyIG9ubHkgc3VwcG9ydHMgUDE5MgotICAgICAgc3dpdGNoIChvb2JfY2IuZGF0YV9wcmVzZW50KSB7Ci0gICAgICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzE5Ml9BTkRfMjU2OgotICAgICAgICAgIExPR19JTkZPKCJIYXZlIGJvdGggUDE5MiBhbmQgIFAyNTYiKTsKLSAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzE5MjoKLSAgICAgICAgICBMT0dfSU5GTygiVXNpbmcgUDE5MiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUTV9PT0JfUFJFU0VOVF8yNTY6Ci0gICAgICAgICAgTE9HX0lORk8oIlVzaW5nIFAyNTYiKTsKLSAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLy8gVE9ETygxODE4ODkxMTYpOgotICAgICAgICAgIC8vIFVwZ3JhZGUgdG8gc3VwcG9ydCBwMjU2IChmb3Igbm93IHdlIGp1c3QgaWdub3JlIFAyNTYpCi0gICAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29udHJvbGxlcnMgZG8gbm90IHlldCBzdXBwb3J0IGl0LgotICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBkYXRhIHByZXNlbnQgZm9yIGNvbnRyb2xsZXI6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgb29iX2NiLmRhdGFfcHJlc2VudCk7Ci0gICAgICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkKEJUX1NUQVRVU19GQUlMLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX05PTkUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBhaXJpbmdfY2IuaXNfbG9jYWxfaW5pdGlhdGVkID0gdHJ1ZTsKLSAgICAgIExPR19FUlJPUigiQ2xhc3NpYyBub3QgaW1wbGVtZW50ZWQgeWV0Iik7Ci0gICAgICBib25kX3N0YXRlX2NoYW5nZWQoQlRfU1RBVFVTX0ZBSUwsIGJkX2FkZHIsIEJUX0JPTkRfU1RBVEVfTk9ORSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBCVF9UUkFOU1BPUlRfTEU6IHsKLSAgICAgIC8vIEd1ZXNzIGRlZmF1bHQgUkFORE9NIGZvciBhZGRyZXNzIHR5cGUgZm9yIExFCi0gICAgICB0QkxFX0FERFJfVFlQRSBhZGRyZXNzX3R5cGUgPSBCTEVfQUREUl9SQU5ET007Ci0gICAgICBMT0dfSU5GTygiVXNpbmcgTEUgVHJhbnNwb3J0Iik7Ci0gICAgICBzd2l0Y2ggKG9vYl9jYi5kYXRhX3ByZXNlbnQpIHsKLSAgICAgICAgY2FzZSBCVE1fT09CX1BSRVNFTlRfMTkyX0FORF8yNTY6Ci0gICAgICAgICAgTE9HX0lORk8oIkhhdmUgYm90aCBQMTkyIGFuZCAgUDI1NiIpOwotICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgLy8gQWx3YXlzIHByZWZlciAyNTYgZm9yIExFCi0gICAgICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzI1NjoKLSAgICAgICAgICBMT0dfSU5GTygiVXNpbmcgUDI1NiIpOwotICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gYWRkcmVzcywgbGV0cyBnZXQgdGhlIHR5cGUKLSAgICAgICAgICBpZiAobWVtY21wKHAyNTZfZGF0YS5hZGRyZXNzLCBlbXB0eSwgNykgIT0gMCkgewotICAgICAgICAgICAgLyogYnl0ZSBubyA3IGlzIGFkZHJlc3MgdHlwZSBpbiBMRSBCbHVldG9vdGggQWRkcmVzcyBPT0IgZGF0YSAqLwotICAgICAgICAgICAgYWRkcmVzc190eXBlID0gc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KHAyNTZfZGF0YS5hZGRyZXNzWzZdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzE5MjoKLSAgICAgICAgICBMT0dfSU5GTygiVXNpbmcgUDE5MiIpOwotICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gYWRkcmVzcywgbGV0cyBnZXQgdGhlIHR5cGUKLSAgICAgICAgICBpZiAobWVtY21wKHAxOTJfZGF0YS5hZGRyZXNzLCBlbXB0eSwgNykgIT0gMCkgewotICAgICAgICAgICAgLyogYnl0ZSBubyA3IGlzIGFkZHJlc3MgdHlwZSBpbiBMRSBCbHVldG9vdGggQWRkcmVzcyBPT0IgZGF0YSAqLwotICAgICAgICAgICAgYWRkcmVzc190eXBlID0gc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KHAxOTJfZGF0YS5hZGRyZXNzWzZdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwYWlyaW5nX2NiLmlzX2xvY2FsX2luaXRpYXRlZCA9IHRydWU7Ci0gICAgICBCVE1fU2VjQWRkQmxlRGV2aWNlKGJkX2FkZHIsIEJUX0RFVklDRV9UWVBFX0JMRSwgYWRkcmVzc190eXBlKTsKLSAgICAgIEJUQV9EbUJvbmQoYmRfYWRkciwgYWRkcmVzc190eXBlLCB0cmFuc3BvcnQsIEJUX0RFVklDRV9UWVBFX0JMRSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiSW52YWxpZCB0cmFuc3BvcnQ6ICVkIiwgdHJhbnNwb3J0KTsKLSAgICAgIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfRkFJTCwgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9OT05FKTsKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9jYW5jZWxfYm9uZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhdGUgYm9uZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kbV9jYW5jZWxfYm9uZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGJkX2FkZHI9JXMiLCBfX2Z1bmNfXywgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGJ0aWZfc3RhdHNfYWRkX2JvbmRfZXZlbnQoYmRfYWRkciwgQlRJRl9ETV9GVU5DX0NBTkNFTF9CT05ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJpbmdfY2Iuc3RhdGUpOwotCi0gIC8qIFRPRE86Ci0gICoqICAxLiBSZXN0b3JlIHNjYW4gbW9kZXMKLSAgKiogIDIuIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEhJRCBkZXZpY2VzCi0gICovCi0gIGlmIChpc19ib25kaW5nX29yX3NkcCgpKSB7Ci0gICAgaWYgKHBhaXJpbmdfY2IuaXNfc3NwKSB7Ci0gICAgICBpZiAocGFpcmluZ19jYi5pc19sZV9vbmx5KSB7Ci0gICAgICAgIEJUQV9EbUJsZVNlY3VyaXR5R3JhbnQoYmRfYWRkciwgQlRBX0RNX1NFQ19QQUlSX05PVF9TUFQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRBX0RtQ29uZmlybShiZF9hZGRyLCBmYWxzZSk7Ci0gICAgICAgIEJUQV9EbUJvbmRDYW5jZWwoYmRfYWRkcik7Ci0gICAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfYm9uZGVkX2RldmljZSgmYmRfYWRkcik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChwYWlyaW5nX2NiLmlzX2xlX29ubHkpIHsKLSAgICAgICAgQlRBX0RtQm9uZENhbmNlbChiZF9hZGRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUQV9EbVBpblJlcGx5KGJkX2FkZHIsIGZhbHNlLCAwLCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIC8qIENhbmNlbCBib25kaW5nLCBpbiBjYXNlIGl0IGlzIGluIEFDTCBjb25uZWN0aW9uIHNldHVwIHN0YXRlICovCi0gICAgICBCVEFfRG1Cb25kQ2FuY2VsKGJkX2FkZHIpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9oaF9vcGVuX2ZhaWxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaW5mb3JtcyB0aGUgdXBwZXIgbGF5ZXJzIGlmIHRoZSBISCBoYXZlIGZhaWxlZCBkdXJpbmcKLSAqICAgICAgICAgICAgICAgICAgYm9uZGluZwotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYnRpZl9kbV9oaF9vcGVuX2ZhaWxlZChSYXdBZGRyZXNzKiBiZGFkZHIpIHsKLSAgaWYgKHBhaXJpbmdfY2Iuc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ESU5HICYmCi0gICAgICAqYmRhZGRyID09IHBhaXJpbmdfY2IuYmRfYWRkcikgewotICAgIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfRkFJTCwgKmJkYWRkciwgQlRfQk9ORF9TVEFURV9OT05FKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9yZW1vdmVfYm9uZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlcyBib25kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJ0aWZfZG1fcmVtb3ZlX2JvbmQoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBiZF9hZGRyPSVzIiwgX19mdW5jX18sIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBidGlmX3N0YXRzX2FkZF9ib25kX2V2ZW50KGJkX2FkZHIsIEJUSUZfRE1fRlVOQ19SRU1PVkVfQk9ORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyaW5nX2NiLnN0YXRlKTsKLQotICAvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBISUQgZGV2aWNlcwotICAvLyBWVVAgbmVlZHMgdG8gYmUgc2VudCBpZiBpdHMgYSBISUQgRGV2aWNlLiBUaGUgSElEIEhPU1QgbW9kdWxlIHdpbGwgY2hlY2sgaWYKLSAgLy8gdGhlcmUgaXMgYSB2YWxpZCBoaWQgY29ubmVjdGlvbiB3aXRoIHRoaXMgYmRfYWRkci4gSWYgeWVzIFZVUCB3aWxsIGJlCi0gIC8vIGlzc3VlZC4KLSNpZiAoQlRBX0hIX0lOQ0xVREVEID09IFRSVUUpCi0gIGlmIChidGlmX2hoX3ZpcnR1YWxfdW5wbHVnKCZiZF9hZGRyKSAhPSBCVF9TVEFUVVNfU1VDQ0VTUykKLSNlbmRpZgotICB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFJlbW92aW5nIEhIIGRldmljZSIsIF9fZnVuY19fKTsKLSAgICBCVEFfRG1SZW1vdmVEZXZpY2UoYmRfYWRkcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZG1fcGluX3JlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVCBsZWdhY3kgcGFpcmluZyAtIFBJTiBjb2RlIHJlcGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBidGlmX2RtX3Bpbl9yZXBseShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHVpbnQ4X3QgYWNjZXB0LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIGJ0X3Bpbl9jb2RlX3QgcGluX2NvZGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGFjY2VwdD0lZCIsIF9fZnVuY19fLCBhY2NlcHQpOwotCi0gIGlmIChwYWlyaW5nX2NiLmlzX2xlX29ubHkpIHsKLSAgICBpbnQgaTsKLSAgICB1aW50MzJfdCBwYXNza2V5ID0gMDsKLSAgICBpbnQgbXVsdGlbXSA9IHsxMDAwMDAsIDEwMDAwLCAxMDAwLCAxMDAsIDEwLCAxfTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBwYXNza2V5ICs9IChtdWx0aVtpXSAqIChwaW5fY29kZS5waW5baV0gLSAnMCcpKTsKLSAgICB9Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiYnRpZl9kbV9waW5fcmVwbHk6IHBhc3NrZXk6ICVkIiwgcGFzc2tleSk7Ci0gICAgQlRBX0RtQmxlUGFzc2tleVJlcGx5KGJkX2FkZHIsIGFjY2VwdCwgcGFzc2tleSk7Ci0KLSAgfSBlbHNlIHsKLSAgICBCVEFfRG1QaW5SZXBseShiZF9hZGRyLCBhY2NlcHQsIHBpbl9sZW4sIHBpbl9jb2RlLnBpbik7Ci0gICAgaWYgKGFjY2VwdCkgcGFpcmluZ19jYi5waW5fY29kZV9sZW4gPSBwaW5fbGVuOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX3NzcF9yZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlQgU1NQIFJlcGx5IC0gSnVzdCBXb3JrcywgTnVtZXJpYyBDb21wYXJpc29uICYgUGFzc2tleQotICogICAgICAgICAgICAgICAgICBFbnRyeQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fc3NwX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfc3NwX3ZhcmlhbnRfdCB2YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFjY2VwdCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogYWNjZXB0PSVkIiwgX19mdW5jX18sIGFjY2VwdCk7Ci0gIGlmIChwYWlyaW5nX2NiLmlzX2xlX29ubHkpIHsKLSAgICBpZiAocGFpcmluZ19jYi5pc19sZV9uYykgewotICAgICAgQlRBX0RtQmxlQ29uZmlybVJlcGx5KGJkX2FkZHIsIGFjY2VwdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChhY2NlcHQpCi0gICAgICAgIEJUQV9EbUJsZVNlY3VyaXR5R3JhbnQoYmRfYWRkciwgQlRBX0RNX1NFQ19HUkFOVEVEKTsKLSAgICAgIGVsc2UKLSAgICAgICAgQlRBX0RtQmxlU2VjdXJpdHlHcmFudChiZF9hZGRyLCBCVEFfRE1fU0VDX1BBSVJfTk9UX1NQVCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEJUQV9EbUNvbmZpcm0oYmRfYWRkciwgYWNjZXB0KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9nZXRfYWRhcHRlcl9wcm9wZXJ0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICBRdWVyaWVzIHRoZSBCVEEgZm9yIHRoZSBhZGFwdGVyIHByb3BlcnR5Ci0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX2RtX2dldF9hZGFwdGVyX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3QqIHByb3ApIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHR5cGU9MHgleCIsIF9fZnVuY19fLCBwcm9wLT50eXBlKTsKLSAgc3dpdGNoIChwcm9wLT50eXBlKSB7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9CRE5BTUU6IHsKLSAgICAgIGJ0X2JkbmFtZV90KiBiZF9uYW1lID0gKGJ0X2JkbmFtZV90Kilwcm9wLT52YWw7Ci0gICAgICBzdHJuY3B5KChjaGFyKiliZF9uYW1lLT5uYW1lLCAoY2hhciopYnRpZl9nZXRfZGVmYXVsdF9sb2NhbF9uYW1lKCksCi0gICAgICAgICAgICAgIHNpemVvZihiZF9uYW1lLT5uYW1lKSAtIDEpOwotICAgICAgYmRfbmFtZS0+bmFtZVtzaXplb2YoYmRfbmFtZS0+bmFtZSkgLSAxXSA9IDA7Ci0gICAgICBwcm9wLT5sZW4gPSBzdHJsZW4oKGNoYXIqKWJkX25hbWUtPm5hbWUpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFOiB7Ci0gICAgICAvKiBpZiB0aGUgc3RvcmFnZSBkb2VzIG5vdCBoYXZlIGl0LiBNb3N0IGxpa2VseSBhcHAgbmV2ZXIgc2V0IGl0LiBEZWZhdWx0Ci0gICAgICAgKiBpcyBOT05FICovCi0gICAgICBidF9zY2FuX21vZGVfdCogbW9kZSA9IChidF9zY2FuX21vZGVfdCopcHJvcC0+dmFsOwotICAgICAgKm1vZGUgPSBCVF9TQ0FOX01PREVfTk9ORTsKLSAgICAgIHByb3AtPmxlbiA9IHNpemVvZihidF9zY2FuX21vZGVfdCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVDogewotICAgICAgdWludDMyX3QqIHRtdCA9ICh1aW50MzJfdCopcHJvcC0+dmFsOwotICAgICAgKnRtdCA9IDEyMDsgLyogZGVmYXVsdCB0byAxMjBzLCBpZiBub3QgZm91bmQgaW4gTlYgKi8KLSAgICAgIHByb3AtPmxlbiA9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFOiB7Ci0gICAgICBERVZfQ0xBU1MgZGV2X2NsYXNzID0gQlRBX0RNX0NPRDsKLSAgICAgIG1lbWNweShwcm9wLT52YWwsIGRldl9jbGFzcywgc2l6ZW9mKERFVl9DTEFTUykpOwotICAgICAgcHJvcC0+bGVuID0gc2l6ZW9mKERFVl9DTEFTUyk7Ci0gICAgfSBicmVhazsKLQotICAgIC8vIFdoaWxlIGZldGNoaW5nIElPX0NBUCogdmFsdWVzIGZvciB0aGUgbG9jYWwgZGV2aWNlLCB3ZSBtYWludGFpbiBiYWNrd2FyZAotICAgIC8vIGNvbXBhdGliaWxpdHkgYnkgdXNpbmcgdGhlIHZhbHVlIGZyb20gI2RlZmluZSBtYWNyb3MgQlRNX0xPQ0FMX0lPX0NBUFMsCi0gICAgLy8gQlRNX0xPQ0FMX0lPX0NBUFNfQkxFIGlmIHRoZSB2YWx1ZXMgaGF2ZSBuZXZlciBiZWVuIGV4cGxpY2l0bHkgc2V0LgotCi0gICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9JT19DQVBTOiB7Ci0gICAgICAqKGJ0X2lvX2NhcF90Kilwcm9wLT52YWwgPSAoYnRfaW9fY2FwX3QpQlRNX0xPQ0FMX0lPX0NBUFM7Ci0gICAgICBwcm9wLT5sZW4gPSBzaXplb2YoYnRfaW9fY2FwX3QpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUX1BST1BFUlRZX0xPQ0FMX0lPX0NBUFNfQkxFOiB7Ci0gICAgICAqKGJ0X2lvX2NhcF90Kilwcm9wLT52YWwgPSAoYnRfaW9fY2FwX3QpQlRNX0xPQ0FMX0lPX0NBUFNfQkxFOwotICAgICAgcHJvcC0+bGVuID0gc2l6ZW9mKGJ0X2lvX2NhcF90KTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHByb3AtPmxlbiA9IDA7Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9nZXRfcmVtb3RlX3NlcnZpY2VzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBTRFAgdG8gZ2V0IHJlbW90ZSBzZXJ2aWNlcyBieSB0cmFuc3BvcnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9kbV9nZXRfcmVtb3RlX3NlcnZpY2VzKFJhd0FkZHJlc3MgcmVtb3RlX2FkZHIsIGNvbnN0IGludCB0cmFuc3BvcnQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHRyYW5zcG9ydD0lZCwgcmVtb3RlX2FkZHI9JXMiLCBfX2Z1bmNfXywgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgIHJlbW90ZV9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgQlRBX0RtRGlzY292ZXIocmVtb3RlX2FkZHIsIGJ0aWZfZG1fc2VhcmNoX3NlcnZpY2VzX2V2dCwgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICByZW1vdGVfYWRkciAhPSBwYWlyaW5nX2NiLmJkX2FkZHIgJiYKLSAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9hZGRyICE9IHBhaXJpbmdfY2Iuc3RhdGljX2JkYWRkciAmJgotICAgICAgICAgICAgICAgICAgICAgaXNfYm9uZGluZ19vcl9zZHAoKSk7Ci19Ci0KLXZvaWQgYnRpZl9kbV9lbmFibGVfc2VydmljZSh0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCwgYm9vbCBlbmFibGUpIHsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gYnRpZl9pbl9leGVjdXRlX3NlcnZpY2VfcmVxdWVzdChzZXJ2aWNlX2lkLCBlbmFibGUpOwotICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0eTsKLSAgICBVdWlkIGxvY2FsX3V1aWRzW0JUX01BWF9OVU1fVVVJRFNdOwotCi0gICAgLyogTm93IHNlbmQgdGhlIFVVSURfUFJPUEVSVFlfQ0hBTkdFRCBldmVudCB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KLSAgICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcHJvcGVydHksIEJUX1BST1BFUlRZX1VVSURTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb2NhbF91dWlkcyksIGxvY2FsX3V1aWRzKTsKLSAgICBidGlmX3N0b3JhZ2VfZ2V0X2FkYXB0ZXJfcHJvcGVydHkoJnByb3BlcnR5KTsKLSAgICBpbnZva2VfYWRhcHRlcl9wcm9wZXJ0aWVzX2NiKEJUX1NUQVRVU19TVUNDRVNTLCAxLCAmcHJvcGVydHkpOwotICB9Ci0gIHJldHVybjsKLX0KLQotdm9pZCBidGlmX2RtX3Byb2NfaW9fcmVxKHRCVE1fQVVUSF9SRVEqIHBfYXV0aF9yZXEsIGJvb2wgaXNfb3JpZykgewotICB1aW50OF90IHllc19ub19iaXQgPSBCVEFfQVVUSF9TUF9ZRVMgJiAqcF9hdXRoX3JlcTsKLSAgLyogaWYgbG9jYWwgaW5pdGlhdGVkOgotICAqKiAgICAgIDEuIHNldCBERCArIE1JVE0KLSAgKiogaWYgcmVtb3RlIGluaXRpYXRlZDoKLSAgKiogICAgICAxLiBDb3B5IG92ZXIgdGhlIGF1dGhfcmVxIGZyb20gcGVlcidzIGlvX3JzcAotICAqKiAgICAgIDIuIFNldCB0aGUgTUlUTSBpZiBwZWVyIGhhcyBpdCBzZXQgb3IgaWYgcGVlciBoYXMgRGlzcGxheVllc05vCi0gICooaVBob25lKQotICAqKiBhcyBhIGZhbGxiYWNrIHNldCBNSVRNK0dCIGlmIHBlZXIgaGFkIE1JVE0gc2V0Ci0gICovCi0KLSAgQlRJRl9UUkFDRV9ERUJVRygiKyVzOiBwX2F1dGhfcmVxPSVkIiwgX19mdW5jX18sICpwX2F1dGhfcmVxKTsKLSAgaWYgKHBhaXJpbmdfY2IuaXNfbG9jYWxfaW5pdGlhdGVkKSB7Ci0gICAgLyogaWYgaW5pdGluZy9yZXNwb25kaW5nIHRvIGEgZGVkaWNhdGVkIGJvbmRpbmcsIHVzZSBkZWRpY2F0ZSBib25kaW5nIGJpdCAqLwotICAgICpwX2F1dGhfcmVxID0gQlRBX0FVVEhfRERfQk9ORCB8IEJUQV9BVVRIX1NQX1lFUzsKLSAgfSBlbHNlIGlmICghaXNfb3JpZykgewotICAgIC8qIHBlZXIgaW5pdGlhdGVkIHBhcmluZy4gVGhleSBwcm9iYWJseSBrbm93IHdoYXQgdGhleSB3YW50LgotICAgICoqIENvcHkgdGhlIG1pdG0gZnJvbSBwZWVyIGRldmljZS4KLSAgICAqLwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZXR0aW5nIHBfYXV0aF9yZXEgdG8gcGVlcidzOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcGFpcmluZ19jYi5hdXRoX3JlcSk7Ci0gICAgKnBfYXV0aF9yZXEgPSAocGFpcmluZ19jYi5hdXRoX3JlcSAmIEJUQV9BVVRIX0JPTkRTKTsKLQotICAgIC8qIGNvcHkgb3ZlciB0aGUgTUlUTSBiaXQgYXMgd2VsbC4gSW4gYWRkaXRpb24gaWYgdGhlIHBlZXIgaGFzIERpc3BsYXlZZXNObywKLSAgICAgKiBmb3JjZSBNSVRNICovCi0gICAgaWYgKCh5ZXNfbm9fYml0KSB8fCAocGFpcmluZ19jYi5pb19jYXAgJiBCVE1fSU9fQ0FQX0lPKSkKLSAgICAgICpwX2F1dGhfcmVxIHw9IEJUQV9BVVRIX1NQX1lFUzsKLSAgfSBlbHNlIGlmICh5ZXNfbm9fYml0KSB7Ci0gICAgLyogc2V0IHRoZSBnZW5lcmFsIGJvbmRpbmcgYml0IGZvciBzdG9yZWQgZGV2aWNlICovCi0gICAgKnBfYXV0aF9yZXEgPSBCVEFfQVVUSF9HRU5fQk9ORCB8IHllc19ub19iaXQ7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiLSVzOiBwX2F1dGhfcmVxPSVkIiwgX19mdW5jX18sICpwX2F1dGhfcmVxKTsKLX0KLQotdm9pZCBidGlmX2RtX3Byb2NfaW9fcnNwKFVOVVNFRF9BVFRSIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9JT19DQVAgaW9fY2FwLCBVTlVTRURfQVRUUiB0QlRNX09PQl9EQVRBIG9vYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQVVUSF9SRVEgYXV0aF9yZXEpIHsKLSAgaWYgKGF1dGhfcmVxICYgQlRBX0FVVEhfQk9ORFMpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBhdXRoX3JlcTolZCIsIF9fZnVuY19fLCBhdXRoX3JlcSk7Ci0gICAgcGFpcmluZ19jYi5hdXRoX3JlcSA9IGF1dGhfcmVxOwotICAgIHBhaXJpbmdfY2IuaW9fY2FwID0gaW9fY2FwOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9kbV9zZXRfb29iX2Zvcl9pb19yZXEodEJUTV9PT0JfREFUQSogcF9oYXNfb29iX2RhdGEpIHsKLSAgaWYgKGlzX2VtcHR5XzEyOGJpdChvb2JfY2IucDE5Ml9kYXRhLmMpKSB7Ci0gICAgKnBfaGFzX29vYl9kYXRhID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgKnBfaGFzX29vYl9kYXRhID0gdHJ1ZTsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogKnBfaGFzX29vYl9kYXRhPSVkIiwgX19mdW5jX18sICpwX2hhc19vb2JfZGF0YSk7Ci19Ci0KLXZvaWQgYnRpZl9kbV9zZXRfb29iX2Zvcl9sZV9pb19yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9PT0JfREFUQSogcF9oYXNfb29iX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfQVVUSF9SRVEqIHBfYXV0aF9yZXEpIHsKLSAgc3dpdGNoIChvb2JfY2IuZGF0YV9wcmVzZW50KSB7Ci0gICAgY2FzZSBCVE1fT09CX1BSRVNFTlRfMTkyX0FORF8yNTY6Ci0gICAgICBMT0dfSU5GTygiSGF2ZSBib3RoIFAxOTIgYW5kICBQMjU2Iik7Ci0gICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgLy8gQWx3YXlzIHByZWZlciAyNTYgZm9yIExFCi0gICAgY2FzZSBCVE1fT09CX1BSRVNFTlRfMjU2OgotICAgICAgTE9HX0lORk8oIlVzaW5nIFAyNTYiKTsKLSAgICAgIGlmICghaXNfZW1wdHlfMTI4Yml0KG9vYl9jYi5wMjU2X2RhdGEuYykgJiYKLSAgICAgICAgICAhaXNfZW1wdHlfMTI4Yml0KG9vYl9jYi5wMjU2X2RhdGEucikpIHsKLSAgICAgICAgLyogbWFrZSBzdXJlIE9PQiBkYXRhIGlzIGZvciB0aGlzIHBhcnRpY3VsYXIgZGV2aWNlICovCi0gICAgICAgIGlmIChiZF9hZGRyID09IG9vYl9jYi5iZGFkZHIpIHsKLSAgICAgICAgICAqcF9hdXRoX3JlcSA9ICgoKnBfYXV0aF9yZXEpIHwgQlRNX0xFX0FVVEhfUkVRX1NDX09OTFkpOwotICAgICAgICAgICpwX2hhc19vb2JfZGF0YSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKnBfaGFzX29vYl9kYXRhID0gZmFsc2U7Ci0gICAgICAgICAgTE9HX1dBUk4oIlAyNTYtMTogUmVtb3RlIGFkZHJlc3MgZGlkbid0IG1hdGNoIE9PQiBkYXRhIGFkZHJlc3MiKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICghaXNfZW1wdHlfMTI4Yml0KG9vYl9jYi5wMjU2X2RhdGEuc21fdGspKSB7Ci0gICAgICAgIC8qIFdlIGhhdmUgc2VjdXJpdHkgbWFuYWdlciBUSyAqLwotCi0gICAgICAgIC8qIG1ha2Ugc3VyZSBPT0IgZGF0YSBpcyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGRldmljZSAqLwotICAgICAgICBpZiAoYmRfYWRkciA9PSBvb2JfY2IuYmRhZGRyKSB7Ci0gICAgICAgICAgLy8gV2hlbiB1c2luZyBPT0Igd2l0aCBUSywgU0MgU2VjdXJlIENvbm5lY3Rpb25zIGJpdCBtdXN0IGJlIGRpc2FibGVkLgotICAgICAgICAgIHRCVE1fTEVfQVVUSF9SRVEgbWFzayA9IH5CVE1fTEVfQVVUSF9SRVFfU0NfT05MWTsKLSAgICAgICAgICAqcF9hdXRoX3JlcSA9ICgoKnBfYXV0aF9yZXEpICYgbWFzayk7Ci0gICAgICAgICAgKnBfaGFzX29vYl9kYXRhID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqcF9oYXNfb29iX2RhdGEgPSBmYWxzZTsKLSAgICAgICAgICBMT0dfV0FSTigiUDI1Ni0yOiBSZW1vdGUgYWRkcmVzcyBkaWRuJ3QgbWF0Y2ggT09CIGRhdGEgYWRkcmVzcyIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqcF9oYXNfb29iX2RhdGEgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzE5MjoKLSAgICAgIExPR19JTkZPKCJVc2luZyBQMTkyIik7Ci0gICAgICBpZiAoIWlzX2VtcHR5XzEyOGJpdChvb2JfY2IucDE5Ml9kYXRhLmMpICYmCi0gICAgICAgICAgIWlzX2VtcHR5XzEyOGJpdChvb2JfY2IucDE5Ml9kYXRhLnIpKSB7Ci0gICAgICAgIC8qIG1ha2Ugc3VyZSBPT0IgZGF0YSBpcyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGRldmljZSAqLwotICAgICAgICBpZiAoYmRfYWRkciA9PSBvb2JfY2IuYmRhZGRyKSB7Ci0gICAgICAgICAgKnBfYXV0aF9yZXEgPSAoKCpwX2F1dGhfcmVxKSB8IEJUTV9MRV9BVVRIX1JFUV9TQ19PTkxZKTsKLSAgICAgICAgICAqcF9oYXNfb29iX2RhdGEgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICpwX2hhc19vb2JfZGF0YSA9IGZhbHNlOwotICAgICAgICAgIExPR19XQVJOKCJQMTkyLTE6IFJlbW90ZSBhZGRyZXNzIGRpZG4ndCBtYXRjaCBPT0IgZGF0YSBhZGRyZXNzIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoIWlzX2VtcHR5XzEyOGJpdChvb2JfY2IucDE5Ml9kYXRhLnNtX3RrKSkgewotICAgICAgICAvKiBXZSBoYXZlIHNlY3VyaXR5IG1hbmFnZXIgVEsgKi8KLQotICAgICAgICAvKiBtYWtlIHN1cmUgT09CIGRhdGEgaXMgZm9yIHRoaXMgcGFydGljdWxhciBkZXZpY2UgKi8KLSAgICAgICAgaWYgKGJkX2FkZHIgPT0gb29iX2NiLmJkYWRkcikgewotICAgICAgICAgIC8vIFdoZW4gdXNpbmcgT09CIHdpdGggVEssIFNDIFNlY3VyZSBDb25uZWN0aW9ucyBiaXQgbXVzdCBiZSBkaXNhYmxlZC4KLSAgICAgICAgICB0QlRNX0xFX0FVVEhfUkVRIG1hc2sgPSB+QlRNX0xFX0FVVEhfUkVRX1NDX09OTFk7Ci0gICAgICAgICAgKnBfYXV0aF9yZXEgPSAoKCpwX2F1dGhfcmVxKSAmIG1hc2spOwotICAgICAgICAgICpwX2hhc19vb2JfZGF0YSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKnBfaGFzX29vYl9kYXRhID0gZmFsc2U7Ci0gICAgICAgICAgTE9HX1dBUk4oIlAxOTItMjogUmVtb3RlIGFkZHJlc3MgZGlkbid0IG1hdGNoIE9PQiBkYXRhIGFkZHJlc3MiKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKnBfaGFzX29vYl9kYXRhID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCIlcyAqcF9oYXNfb29iX2RhdGE9JWQiLCBfX2Z1bmNfXywgKnBfaGFzX29vYl9kYXRhKTsKLX0KLQotI2lmZGVmIEJUSUZfRE1fT09CX1RFU1QKLXZvaWQgYnRpZl9kbV9sb2FkX2xvY2FsX29vYih2b2lkKSB7Ci0gIGNoYXIgcHJvcF9vb2JbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgb3NpX3Byb3BlcnR5X2dldCgic2VydmljZS5icmNtLmJ0Lm9vYiIsIHByb3Bfb29iLCAiMyIpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcHJvcF9vb2IgPSAlcyIsIF9fZnVuY19fLCBwcm9wX29vYik7Ci0gIGlmIChwcm9wX29vYlswXSAhPSAnMycpIHsKLSAgICBpZiAoaXNfZW1wdHlfMTI4Yml0KG9vYl9jYi5wMTkyX2RhdGEuYykpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWFkIE9PQiwgY2FsbCBCVEFfRG1Mb2NhbE9vYigpIiwgX19mdW5jX18pOwotICAgICAgQlRBX0RtTG9jYWxPb2IoKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgd2FpdGluZ19vbl9vb2JfYWR2ZXJ0aXNlcl9zdGFydCA9IGZhbHNlOwotc3RhdGljIHVpbnQ4X3Qgb29iX2FkdmVydGlzZXJfaWQgPSAwOwotc3RhdGljIHZvaWQgc3RvcF9vb2JfYWR2ZXJ0aXNlcigpIHsKLSAgYXV0byBhZHZlcnRpc2VyID0gZ2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCk7Ci0gIGFkdmVydGlzZXItPlVucmVnaXN0ZXIob29iX2FkdmVydGlzZXJfaWQpOwotICBvb2JfYWR2ZXJ0aXNlcl9pZCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2dlbmVyYXRlX2xvY2FsX29vYl9kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWF0ZSBvb2IgZGF0YSBmZXRjaCBmcm9tIGNvbnRyb2xsZXIKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHRyYW5zcG9ydDsgQ2xhc3NpYyBvciBMRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGEodEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgTE9HX0RFQlVHKCJUcmFuc3BvcnQgJXMiLCBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCkpOwotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICBCVE1fUmVhZExvY2FsT29iRGF0YSgpOwotICB9IGVsc2UgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAvLyBDYWxsIGNyZWF0ZSBkYXRhIGZpcnN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIGhvbGQgb24gdG8gdGhlIGFkZHJlc3MgZm9yCi0gICAgLy8gdGhlIHN0YXRlIG1hY2hpbmUgbGlmZWN5Y2xlLiAgUmF0aGVyLCBsZXRzIGNyZWF0ZSB0aGUgZGF0YSwgdGhlbiBzdGFydAotICAgIC8vIGFkdmVydGlzaW5nIHRoZW4gcmVxdWVzdCB0aGUgYWRkcmVzcy4KLSAgICBpZiAoIXdhaXRpbmdfb25fb29iX2FkdmVydGlzZXJfc3RhcnQpIHsKLSAgICAgIGlmIChvb2JfYWR2ZXJ0aXNlcl9pZCAhPSAwKSB7Ci0gICAgICAgIHN0b3Bfb29iX2FkdmVydGlzZXIoKTsKLSAgICAgIH0KLSAgICAgIHdhaXRpbmdfb25fb29iX2FkdmVydGlzZXJfc3RhcnQgPSB0cnVlOwotICAgICAgU01QX0NyTG9jU2NPb2JEYXRhKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludm9rZV9vb2JfZGF0YV9yZXF1ZXN0X2NiKHRyYW5zcG9ydCwgZmFsc2UsIE9jdGV0MTZ7fSwgT2N0ZXQxNnt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzc3t9LCAweDAwKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gU3RlcCBGb3VyOiBDYWxsQmFjayBmcm9tIFN0ZXAgVGhyZWUKLXN0YXRpYyB2b2lkIGdldF9hZGRyZXNzX2NhbGxiYWNrKHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIGlzX3ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgYywgY29uc3QgT2N0ZXQxNiYgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWRkcmVzc190eXBlLCBSYXdBZGRyZXNzIGFkZHJlc3MpIHsKLSAgaW52b2tlX29vYl9kYXRhX3JlcXVlc3RfY2IodHJhbnNwb3J0LCBpc192YWxpZCwgYywgciwgYWRkcmVzcywgYWRkcmVzc190eXBlKTsKLSAgd2FpdGluZ19vbl9vb2JfYWR2ZXJ0aXNlcl9zdGFydCA9IGZhbHNlOwotfQotCi0vLyBTdGVwIFRocmVlOiBDYWxsQmFjayBmcm9tIFN0ZXAgVHdvLCBhZHZlcnRpc2UgYW5kIGdldCBhZGRyZXNzCi1zdGF0aWMgdm9pZCBzdGFydF9hZHZlcnRpc2luZ19jYWxsYmFjayh1aW50OF90IGlkLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdmFsaWQsIGNvbnN0IE9jdGV0MTYmIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiByLCB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgTE9HX0lORk8oIk9PQiBnZXQgYWR2ZXJ0aXNlciBJRCBmYWlsZWQgd2l0aCBzdGF0dXMgJWhoZCIsIHN0YXR1cyk7Ci0gICAgaW52b2tlX29vYl9kYXRhX3JlcXVlc3RfY2IodHJhbnNwb3J0LCBmYWxzZSwgYywgciwgUmF3QWRkcmVzc3t9LCAweDAwKTsKLSAgICBTTVBfQ2xlYXJMb2NTY09vYkRhdGEoKTsKLSAgICB3YWl0aW5nX29uX29vYl9hZHZlcnRpc2VyX3N0YXJ0ID0gZmFsc2U7Ci0gICAgb29iX2FkdmVydGlzZXJfaWQgPSAwOwotICAgIHJldHVybjsKLSAgfQotICBMT0dfREVCVUcoIk9PQiBhZHZlcnRpc2VyIHdpdGggaWQgJWhoZCIsIGlkKTsKLSAgYXV0byBhZHZlcnRpc2VyID0gZ2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCk7Ci0gIGFkdmVydGlzZXItPkdldE93bkFkZHJlc3MoCi0gICAgICBpZCwgYmFzZTo6QmluZCgmZ2V0X2FkZHJlc3NfY2FsbGJhY2ssIHRyYW5zcG9ydCwgaXNfdmFsaWQsIGMsIHIpKTsKLX0KLQotc3RhdGljIHZvaWQgdGltZW91dF9jYih1aW50OF90IGlkLCB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgTE9HX0lORk8oIk9PQiBhZHZlcnRpc2VyIHdpdGggaWQgJWhoZCB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgJWhoZCIsIGlkLAotICAgICAgICAgICBzdGF0dXMpOwotICBhdXRvIGFkdmVydGlzZXIgPSBnZXRfYmxlX2FkdmVydGlzZXJfaW5zdGFuY2UoKTsKLSAgYWR2ZXJ0aXNlci0+VW5yZWdpc3RlcihpZCk7Ci0gIFNNUF9DbGVhckxvY1NjT29iRGF0YSgpOwotICB3YWl0aW5nX29uX29vYl9hZHZlcnRpc2VyX3N0YXJ0ID0gZmFsc2U7Ci0gIG9vYl9hZHZlcnRpc2VyX2lkID0gMDsKLX0KLQotLy8gU3RlcCBUd286IENhbGxCYWNrIGZyb20gU3RlcCBPbmUsIGFkdmVydGlzZSBhbmQgZ2V0IGFkZHJlc3MKLXN0YXRpYyB2b2lkIGlkX3N0YXR1c19jYWxsYmFjayh0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBpc192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1RBVFVTIHN0YXR1cykgewotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICBMT0dfSU5GTygiT09CIGdldCBhZHZlcnRpc2VyIElEIGZhaWxlZCB3aXRoIHN0YXR1cyAlaGhkIiwgc3RhdHVzKTsKLSAgICBpbnZva2Vfb29iX2RhdGFfcmVxdWVzdF9jYih0cmFuc3BvcnQsIGZhbHNlLCBjLCByLCBSYXdBZGRyZXNze30sIDB4MDApOwotICAgIFNNUF9DbGVhckxvY1NjT29iRGF0YSgpOwotICAgIHdhaXRpbmdfb25fb29iX2FkdmVydGlzZXJfc3RhcnQgPSBmYWxzZTsKLSAgICBvb2JfYWR2ZXJ0aXNlcl9pZCA9IDA7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgb29iX2FkdmVydGlzZXJfaWQgPSBpZDsKLQotICBhdXRvIGFkdmVydGlzZXIgPSBnZXRfYmxlX2FkdmVydGlzZXJfaW5zdGFuY2UoKTsKLSAgQWR2ZXJ0aXNlUGFyYW1ldGVycyBwYXJhbWV0ZXJzOwotICBwYXJhbWV0ZXJzLmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgPSAweDAwNDEgLyogY29ubmVjdGFibGUsIHR4IHBvd2VyICovOwotICBwYXJhbWV0ZXJzLm1pbl9pbnRlcnZhbCA9IDB4YTA7ICAgLy8gMTAwIG1zCi0gIHBhcmFtZXRlcnMubWF4X2ludGVydmFsID0gMHg1MDA7ICAvLyA4MDAgbXMKLSAgcGFyYW1ldGVycy5jaGFubmVsX21hcCA9IDB4NzsgICAgIC8vIFVzZSBhbGwgdGhlIGNoYW5uZWxzCi0gIHBhcmFtZXRlcnMudHhfcG93ZXIgPSAwOyAgICAgICAgICAvLyAwIGRCbQotICBwYXJhbWV0ZXJzLnByaW1hcnlfYWR2ZXJ0aXNpbmdfcGh5ID0gMTsKLSAgcGFyYW1ldGVycy5zZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5ID0gMjsKLSAgcGFyYW1ldGVycy5zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uX2VuYWJsZSA9IDA7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNlbWVudHsweDAyLCAweDAxIC8qIEZsYWdzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgLyogQ29ubmVjdGFibGUgKi99OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX2RhdGF7fTsKLQotICBhZHZlcnRpc2VyLT5TdGFydEFkdmVydGlzaW5nKAotICAgICAgaWQsCi0gICAgICBiYXNlOjpCaW5kKCZzdGFydF9hZHZlcnRpc2luZ19jYWxsYmFjaywgaWQsIHRyYW5zcG9ydCwgaXNfdmFsaWQsIGMsIHIpLAotICAgICAgcGFyYW1ldGVycywgYWR2ZXJ0aXNlbWVudCwgc2Nhbl9kYXRhLCAzNjAwIC8qIHRpbWVvdXRfcyAqLywKLSAgICAgIGJhc2U6OkJpbmQoJnRpbWVvdXRfY2IsIGlkKSk7Ci19Ci0KLS8vIFN0ZXAgT25lOiBTdGFydCB0aGUgYWR2ZXJ0aXNlcgotc3RhdGljIHZvaWQgc3RhcnRfb29iX2FkdmVydGlzZXIodEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgaXNfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKSB7Ci0gIGF1dG8gYWR2ZXJ0aXNlciA9IGdldF9ibGVfYWR2ZXJ0aXNlcl9pbnN0YW5jZSgpOwotICBhZHZlcnRpc2VyLT5SZWdpc3RlckFkdmVydGlzZXIoCi0gICAgICBiYXNlOjpCaW5kKCZpZF9zdGF0dXNfY2FsbGJhY2ssIHRyYW5zcG9ydCwgaXNfdmFsaWQsIGMsIHIpKTsKLX0KLQotdm9pZCBidGlmX2RtX3Byb2NfbG9jX29vYih0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBpc192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgYywgY29uc3QgT2N0ZXQxNiYgcikgewotICAvLyBpc192YWxpZCBpcyBpbXBvcnRhbnQgZm9yIGRlY2lkaW5nIHdoaWNoIE9vYkRhdGFDYWxsYmFjayBmdW5jdGlvbiB0byB1c2UKLSAgaWYgKCFpc192YWxpZCkgewotICAgIGludm9rZV9vb2JfZGF0YV9yZXF1ZXN0X2NiKHRyYW5zcG9ydCwgZmFsc2UsIGMsIHIsIFJhd0FkZHJlc3N7fSwgMHgwMCk7Ci0gICAgd2FpdGluZ19vbl9vb2JfYWR2ZXJ0aXNlcl9zdGFydCA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBkYXRhLCBsZXRzIHN0YXJ0IGFkdmVydGlzaW5nIGFuZCBnZXQgdGhlIGFkZHJlc3MuCi0gIHN0YXJ0X29vYl9hZHZlcnRpc2VyKHRyYW5zcG9ydCwgaXNfdmFsaWQsIGMsIHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9nZXRfc21wX2NvbmZpZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0cmlldmUgdGhlIFNNUCBwYWlyaW5nIG9wdGlvbnMgZnJvbSB0aGUgYnRfc3RhY2suY29uZgotICogICAgICAgICAgICAgICAgICBmaWxlLiBUbyBwcm92aWRlIHNwZWNpZmljIHBhaXJpbmcgb3B0aW9ucyBmb3IgdGhlIGhvc3QKLSAqICAgICAgICAgICAgICAgICAgYWRkIGEgbm9kZSB3aXRoIGxhYmVsICJTbXBPcHRpb25zIiB0byB0aGUgY29uZmlnIGZpbGUKLSAqICAgICAgICAgICAgICAgICAgYW5kIGFzc2lnbiBpdCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIDUgdmFsdWVzIGluIHRoZQotICogICAgICAgICAgICAgICAgICBmb3JtYXQ6IGF1dGgsIGlvLCBpa2V5LCBya2V5LCBrc2l6ZSwgb29iCi0gKiAgICAgICAgICAgICAgICAgIGVnOiBQVFNfU21wT3B0aW9ucz0weEQsMHg0LDB4ZiwweGYsMHgxMAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgdEJURV9BUFBMX0NGRyo6IHBvaW50ZXIgdG8gc3RydWN0IGRlZmluaW5nIHBhaXJpbmcgb3B0aW9ucwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0aGUgb3B0aW9ucyB3ZXJlIHN1Y2Nlc3NmdWxseSByZWFkLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRpZl9kbV9nZXRfc21wX2NvbmZpZyh0QlRFX0FQUExfQ0ZHKiBwX2NmZykgewotICBjb25zdCBzdGQ6OnN0cmluZyogcmVjdiA9IHN0YWNrX2NvbmZpZ19nZXRfaW50ZXJmYWNlKCktPmdldF9wdHNfc21wX29wdGlvbnMoKTsKLSAgaWYgKCFyZWN2KSB7Ci0gICAgTE9HX0RFQlVHKCJTTVAgcGFpcmluZyBvcHRpb25zIG5vdCBmb3VuZCBpbiBzdGFjayBjb25maWd1cmF0aW9uIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY2hhciBjb25mWzY0XTsKLSAgY2hhciogcGNoOwotICBjaGFyKiBlbmRwdHI7Ci0KLSAgc3RybmNweShjb25mLCByZWN2LT5jX3N0cigpLCA2NCk7Ci0gIGNvbmZbNjNdID0gMDsgIC8vIG51bGwgdGVybWluYXRlCi0KLSAgcGNoID0gc3RydG9rKGNvbmYsICIsIik7Ci0gIGlmIChwY2ggIT0gTlVMTCkKLSAgICBwX2NmZy0+YmxlX2F1dGhfcmVxID0gKHVpbnQ4X3Qpc3RydG91bChwY2gsICZlbmRwdHIsIDE2KTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBwY2ggPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgaWYgKHBjaCAhPSBOVUxMKQotICAgIHBfY2ZnLT5ibGVfaW9fY2FwID0gKHVpbnQ4X3Qpc3RydG91bChwY2gsICZlbmRwdHIsIDE2KTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBwY2ggPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgaWYgKHBjaCAhPSBOVUxMKQotICAgIHBfY2ZnLT5ibGVfaW5pdF9rZXkgPSAodWludDhfdClzdHJ0b3VsKHBjaCwgJmVuZHB0ciwgMTYpOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBjaCA9IHN0cnRvayhOVUxMLCAiLCIpOwotICBpZiAocGNoICE9IE5VTEwpCi0gICAgcF9jZmctPmJsZV9yZXNwX2tleSA9ICh1aW50OF90KXN0cnRvdWwocGNoLCAmZW5kcHRyLCAxNik7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcGNoID0gc3RydG9rKE5VTEwsICIsIik7Ci0gIGlmIChwY2ggIT0gTlVMTCkKLSAgICBwX2NmZy0+YmxlX21heF9rZXlfc2l6ZSA9ICh1aW50OF90KXN0cnRvdWwocGNoLCAmZW5kcHRyLCAxNik7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYnRpZl9kbV9wcm9jX3JtdF9vb2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgT2N0ZXQxNiogcF9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPY3RldDE2KiBwX3IpIHsKLSAgY29uc3QgY2hhciogcGF0aF9hID0gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL0xPQ0FML2Eua2V5IjsKLSAgY29uc3QgY2hhciogcGF0aF9iID0gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL0xPQ0FML2Iua2V5IjsKLSAgY29uc3QgY2hhciogcGF0aCA9IE5VTEw7Ci0gIGNoYXIgcHJvcF9vb2JbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgb3NpX3Byb3BlcnR5X2dldCgic2VydmljZS5icmNtLmJ0Lm9vYiIsIHByb3Bfb29iLCAiMyIpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcHJvcF9vb2IgPSAlcyIsIF9fZnVuY19fLCBwcm9wX29vYik7Ci0gIGlmIChwcm9wX29vYlswXSA9PSAnMScpCi0gICAgcGF0aCA9IHBhdGhfYjsKLSAgZWxzZSBpZiAocHJvcF9vb2JbMF0gPT0gJzInKQotICAgIHBhdGggPSBwYXRoX2E7Ci0gIGlmICghcGF0aCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYW4ndCBvcGVuIHBhdGghIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEZJTEUqIGZwID0gZm9wZW4ocGF0aCwgInJiIik7Ci0gIGlmIChmcCA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGZhaWxlZCB0byByZWFkIE9PQiBrZXlzIGZyb20gJXMiLCBfX2Z1bmNfXywgcGF0aCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlYWQgT09CIGRhdGEgZnJvbSAlcyIsIF9fZnVuY19fLCBwYXRoKTsKLSAgKHZvaWQpZnJlYWQocF9jLT5kYXRhKCksIDEsIE9DVEVUMTZfTEVOLCBmcCk7Ci0gICh2b2lkKWZyZWFkKHBfci0+ZGF0YSgpLCAxLCBPQ1RFVDE2X0xFTiwgZnApOwotICBmY2xvc2UoZnApOwotCi0gIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ESU5HKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogIEJUSUZfRE1fT09CX1RFU1QgKi8KLQotc3RhdGljIHZvaWQgYnRpZl9kbV9ibGVfa2V5X25vdGlmX2V2dCh0QlRBX0RNX1NQX0tFWV9OT1RJRiogcF9zc3Bfa2V5X25vdGlmKSB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgYnRfYmRuYW1lX3QgYmRfbmFtZTsKLSAgdWludDMyX3QgY29kOwotICBpbnQgZGV2X3R5cGU7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogUmVtb3RlIG5hbWUgdXBkYXRlICovCi0gIGlmICghYnRpZl9nZXRfZGV2aWNlX3R5cGUocF9zc3Bfa2V5X25vdGlmLT5iZF9hZGRyLCAmZGV2X3R5cGUpKSB7Ci0gICAgZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CTEU7Ci0gIH0KLSAgYnRpZl9kbV91cGRhdGVfYmxlX3JlbW90ZV9wcm9wZXJ0aWVzKHBfc3NwX2tleV9ub3RpZi0+YmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3NwX2tleV9ub3RpZi0+YmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRfREVWSUNFX1RZUEUpZGV2X3R5cGUpOwotICBiZF9hZGRyID0gcF9zc3Bfa2V5X25vdGlmLT5iZF9hZGRyOwotICBtZW1jcHkoYmRfbmFtZS5uYW1lLCBwX3NzcF9rZXlfbm90aWYtPmJkX25hbWUsIEJEX05BTUVfTEVOKTsKLSAgYmRfbmFtZS5uYW1lW0JEX05BTUVfTEVOXSA9ICdcMCc7Ci0KLSAgYm9uZF9zdGF0ZV9jaGFuZ2VkKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX0JPTkRJTkcpOwotICBwYWlyaW5nX2NiLmlzX3NzcCA9IGZhbHNlOwotICBjb2QgPSBDT0RfVU5DTEFTU0lGSUVEOwotCi0gIGludm9rZV9zc3BfcmVxdWVzdF9jYihiZF9hZGRyLCBiZF9uYW1lLCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVF9TU1BfVkFSSUFOVF9QQVNTS0VZX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfc3NwX2tleV9ub3RpZi0+cGFzc2tleSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2JsZV9hdXRoX2NtcGxfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFeGVjdXRlcyBhdXRoZW50aWNhdGlvbiBjb21wbGV0ZSBldmVudCBpbiBidGlmIGNvbnRleHQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9kbV9ibGVfYXV0aF9jbXBsX2V2dCh0QlRBX0RNX0FVVEhfQ01QTCogcF9hdXRoX2NtcGwpIHsKLSAgLyogU2F2ZSBsaW5rIGtleSwgaWYgbm90IHRlbXBvcmFyeSAqLwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlID0gQlRfQk9ORF9TVEFURV9OT05FOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IHBfYXV0aF9jbXBsLT5iZF9hZGRyOwotCi0gIC8qIENsZWFyIE9PQiBkYXRhICovCi0gIG1lbXNldCgmb29iX2NiLCAwLCBzaXplb2Yob29iX2NiKSk7Ci0KLSAgaWYgKChwX2F1dGhfY21wbC0+c3VjY2VzcykgJiYgKHBfYXV0aF9jbXBsLT5rZXlfcHJlc2VudCkpIHsKLSAgICAvKiBzdG9yZSBrZXlzICovCi0gIH0KLSAgaWYgKHBfYXV0aF9jbXBsLT5zdWNjZXNzKSB7Ci0gICAgc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgc3RhdGUgPSBCVF9CT05EX1NUQVRFX0JPTkRFRDsKLSAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGU7Ci0gICAgUmF3QWRkcmVzcyBiZGFkZHIgPSBwX2F1dGhfY21wbC0+YmRfYWRkcjsKLSAgICBpZiAoYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfYWRkcl90eXBlKCZiZGFkZHIsICZhZGRyX3R5cGUpICE9Ci0gICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKQotICAgICAgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfYWRkcl90eXBlKCZiZGFkZHIsIHBfYXV0aF9jbXBsLT5hZGRyX3R5cGUpOwotCi0gICAgLyogVGVzdCBmb3IgdGVtcG9yYXJ5IGJvbmRpbmcgKi8KLSAgICBpZiAoYnRtX2dldF9ib25kX3R5cGVfZGV2KHBfYXV0aF9jbXBsLT5iZF9hZGRyKSA9PQotICAgICAgICB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVEVNUE9SQVJZKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VuZGluZyBCVF9CT05EX1NUQVRFX05PTkUgZm9yIFRlbXAgcGFpcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfYm9uZGVkX2RldmljZSgmYmRhZGRyKTsKLSAgICAgIHN0YXRlID0gQlRfQk9ORF9TVEFURV9OT05FOwotICAgIH0gZWxzZSB7Ci0gICAgICBidGlmX2RtX3NhdmVfYmxlX2JvbmRpbmdfa2V5cyhiZGFkZHIpOwotICAgICAgYnRpZl9kbV9nZXRfcmVtb3RlX3NlcnZpY2VzKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qTWFwIHRoZSBIQ0kgZmFpbCByZWFzb24gIHRvICBidCBzdGF0dXMgICovCi0gICAgLy8gVE9ETyBUaGlzIGlzIG5vdCBhIHByb3BlciB1c2Ugb2YgdGhlIHR5cGUKLSAgICB1aW50OF90IGZhaWxfcmVhc29uID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocF9hdXRoX2NtcGwtPmZhaWxfcmVhc29uKTsKLSAgICBzd2l0Y2ggKGZhaWxfcmVhc29uKSB7Ci0gICAgICBjYXNlIEJUQV9ETV9BVVRIX1NNUF9QQUlSX0FVVEhfRkFJTDoKLSAgICAgIGNhc2UgQlRBX0RNX0FVVEhfU01QX0NPTkZJUk1fVkFMVUVfRkFJTDoKLSAgICAgIGNhc2UgQlRBX0RNX0FVVEhfU01QX1VOS05PV05fRVJSOgotICAgICAgICBidGlmX2RtX3JlbW92ZV9ibGVfYm9uZGluZ19rZXlzKCk7Ci0gICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19BVVRIX0ZBSUxVUkU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUQV9ETV9BVVRIX1NNUF9DT05OX1RPVVQ6IHsKLSAgICAgICAgaWYgKGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KGJkX2FkZHIpKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQm9uZGVkIGRldmljZSBhZGRyPSIgPDwgYmRfYWRkcgotICAgICAgICAgICAgICAgICAgICA8PCAiIHRpbWVkIG91dCAtIHdpbGwgbm90IHJlbW92ZSB0aGUga2V5cyI7Ci0gICAgICAgICAgLy8gRG9uJ3Qgc2VuZCBzdGF0ZSBjaGFuZ2UgdG8gdXBwZXIgbGF5ZXJzIC0gb3RoZXJ3aXNlIEphdmEgdGhpbmsgd2UKLSAgICAgICAgICAvLyB1bmJvbmRlZCwgYW5kIHdpbGwgZGlzY29ubmVjdCBISUQgcHJvZmlsZS4KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBidGlmX2RtX3JlbW92ZV9ibGVfYm9uZGluZ19rZXlzKCk7Ci0gICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19BVVRIX0ZBSUxVUkU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCVEFfRE1fQVVUSF9TTVBfUEFJUl9OT1RfU1VQUE9SVDoKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0FVVEhfUkVKRUNURUQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnRpZl9kbV9yZW1vdmVfYmxlX2JvbmRpbmdfa2V5cygpOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChzdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCAmJiAhcGFpcmluZ19jYi5zdGF0aWNfYmRhZGRyLklzRW1wdHkoKSAmJgotICAgICAgYmRfYWRkciAhPSBwYWlyaW5nX2NiLnN0YXRpY19iZGFkZHIpIHsKLSAgICAvLyBSZXBvcnQgUlBBIGJvbmRpbmcgc3RhdGUgdG8gSmF2YSBpbiBjcm9zc2tleSBwYXJpbmcKLSAgICBib25kX3N0YXRlX2NoYW5nZWQoc3RhdHVzLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX0JPTkRJTkcpOwotICB9Ci0gIGJvbmRfc3RhdGVfY2hhbmdlZChzdGF0dXMsIGJkX2FkZHIsIHN0YXRlKTsKLX0KLQotdm9pZCBidGlmX2RtX2xvYWRfYmxlX2xvY2FsX2tleXModm9pZCkgewotICBtZW1zZXQoJmJsZV9sb2NhbF9rZXlfY2IsIDAsIHNpemVvZihidGlmX2RtX2xvY2FsX2tleV9jYl90KSk7Ci0KLSAgaWYgKGJ0aWZfc3RvcmFnZV9nZXRfYmxlX2xvY2FsX2tleSgKLSAgICAgICAgICBCVElGX0RNX0xFX0xPQ0FMX0tFWV9FUiwgJmJsZV9sb2NhbF9rZXlfY2IuZXIpID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgYmxlX2xvY2FsX2tleV9jYi5pc19lcl9yY3ZkID0gdHJ1ZTsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBCTEUgRVIga2V5IGxvYWRlZCIsIF9fZnVuY19fKTsKLSAgfQotCi0gIGlmICgoYnRpZl9zdG9yYWdlX2dldF9ibGVfbG9jYWxfa2V5KEJUSUZfRE1fTEVfTE9DQUxfS0VZX0lSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlX2xvY2FsX2tleV9jYi5pZF9rZXlzLmlyKSA9PQotICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKSAmJgotICAgICAgKGJ0aWZfc3RvcmFnZV9nZXRfYmxlX2xvY2FsX2tleShCVElGX0RNX0xFX0xPQ0FMX0tFWV9JUkssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVfbG9jYWxfa2V5X2NiLmlkX2tleXMuaXJrKSA9PQotICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKSAmJgotICAgICAgKGJ0aWZfc3RvcmFnZV9nZXRfYmxlX2xvY2FsX2tleShCVElGX0RNX0xFX0xPQ0FMX0tFWV9ESEssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVfbG9jYWxfa2V5X2NiLmlkX2tleXMuZGhrKSA9PQotICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKSkgewotICAgIGJsZV9sb2NhbF9rZXlfY2IuaXNfaWRfa2V5c19yY3ZkID0gdHJ1ZTsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBCTEUgSUQga2V5cyBsb2FkZWQiLCBfX2Z1bmNfXyk7Ci0gIH0KLX0KLXZvaWQgYnRpZl9kbV9nZXRfYmxlX2xvY2FsX2tleXModEJUQV9ETV9CTEVfTE9DQUxfS0VZX01BU0sqIHBfa2V5X21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIHBfZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQkxFX0xPQ0FMX0lEX0tFWVMqIHBfaWRfa2V5cykgewotICBBU1NFUlQocF9rZXlfbWFzayAhPSBudWxscHRyKTsKLSAgaWYgKGJsZV9sb2NhbF9rZXlfY2IuaXNfZXJfcmN2ZCkgewotICAgIEFTU0VSVChwX2VyICE9IG51bGxwdHIpOwotICAgICpwX2VyID0gYmxlX2xvY2FsX2tleV9jYi5lcjsKLSAgICAqcF9rZXlfbWFzayB8PSBCVEFfQkxFX0xPQ0FMX0tFWV9UWVBFX0VSOwotICB9Ci0KLSAgaWYgKGJsZV9sb2NhbF9rZXlfY2IuaXNfaWRfa2V5c19yY3ZkKSB7Ci0gICAgQVNTRVJUKHBfaWRfa2V5cyAhPSBudWxscHRyKTsKLSAgICBwX2lkX2tleXMtPmlyID0gYmxlX2xvY2FsX2tleV9jYi5pZF9rZXlzLmlyOwotICAgIHBfaWRfa2V5cy0+aXJrID0gYmxlX2xvY2FsX2tleV9jYi5pZF9rZXlzLmlyazsKLSAgICBwX2lkX2tleXMtPmRoayA9IGJsZV9sb2NhbF9rZXlfY2IuaWRfa2V5cy5kaGs7Ci0gICAgKnBfa2V5X21hc2sgfD0gQlRBX0JMRV9MT0NBTF9LRVlfVFlQRV9JRDsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCIlcyAgKnBfa2V5X21hc2s9MHglMDJ4IiwgX19mdW5jX18sICpwX2tleV9tYXNrKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9kbV9zYXZlX2JsZV9ib25kaW5nX2tleXMoUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocGFpcmluZ19jYi5ibGUuaXNfcGVuY19rZXlfcmN2ZCkgewotICAgIGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2JvbmRpbmdfa2V5KAotICAgICAgICAmYmRfYWRkciwgKHVpbnQ4X3QqKSZwYWlyaW5nX2NiLmJsZS5wZW5jX2tleSwgQlRNX0xFX0tFWV9QRU5DLAotICAgICAgICBzaXplb2YodEJUTV9MRV9QRU5DX0tFWVMpKTsKLSAgfQotCi0gIGlmIChwYWlyaW5nX2NiLmJsZS5pc19waWRfa2V5X3JjdmQpIHsKLSAgICBidGlmX3N0b3JhZ2VfYWRkX2JsZV9ib25kaW5nX2tleSgmYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopJnBhaXJpbmdfY2IuYmxlLnBpZF9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0xFX0tFWV9QSUQsIHNpemVvZih0QlRNX0xFX1BJRF9LRVlTKSk7Ci0gIH0KLQotICBpZiAocGFpcmluZ19jYi5ibGUuaXNfcGNzcmtfa2V5X3JjdmQpIHsKLSAgICBidGlmX3N0b3JhZ2VfYWRkX2JsZV9ib25kaW5nX2tleSgKLSAgICAgICAgJmJkX2FkZHIsICh1aW50OF90KikmcGFpcmluZ19jYi5ibGUucGNzcmtfa2V5LCBCVE1fTEVfS0VZX1BDU1JLLAotICAgICAgICBzaXplb2YodEJUTV9MRV9QQ1NSS19LRVlTKSk7Ci0gIH0KLQotICBpZiAocGFpcmluZ19jYi5ibGUuaXNfbGVuY19rZXlfcmN2ZCkgewotICAgIGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2JvbmRpbmdfa2V5KAotICAgICAgICAmYmRfYWRkciwgKHVpbnQ4X3QqKSZwYWlyaW5nX2NiLmJsZS5sZW5jX2tleSwgQlRNX0xFX0tFWV9MRU5DLAotICAgICAgICBzaXplb2YodEJUTV9MRV9MRU5DX0tFWVMpKTsKLSAgfQotCi0gIGlmIChwYWlyaW5nX2NiLmJsZS5pc19sY3Nya19rZXlfcmN2ZCkgewotICAgIGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2JvbmRpbmdfa2V5KAotICAgICAgICAmYmRfYWRkciwgKHVpbnQ4X3QqKSZwYWlyaW5nX2NiLmJsZS5sY3Nya19rZXksIEJUTV9MRV9LRVlfTENTUkssCi0gICAgICAgIHNpemVvZih0QlRNX0xFX0xDU1JLX0tFWVMpKTsKLSAgfQotCi0gIGlmIChwYWlyaW5nX2NiLmJsZS5pc19saWRrX2tleV9yY3ZkKSB7Ci0gICAgdWludDhfdCBlbXB0eVtdID0ge307Ci0gICAgYnRpZl9zdG9yYWdlX2FkZF9ibGVfYm9uZGluZ19rZXkoJmJkX2FkZHIsIGVtcHR5LCBCVE1fTEVfS0VZX0xJRCwgMCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9kbV9yZW1vdmVfYmxlX2JvbmRpbmdfa2V5cyh2b2lkKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IHBhaXJpbmdfY2IuYmRfYWRkcjsKLSAgYnRpZl9zdG9yYWdlX3JlbW92ZV9ibGVfYm9uZGluZ19rZXlzKCZiZF9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZG1fYmxlX3NlY19yZXFfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFcHJvY2VzcyBzZWN1cml0eSByZXF1ZXN0IGV2ZW50IGluIGJ0aWYgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV9zZWNfcmVxX2V2dCh0QlRBX0RNX0JMRV9TRUNfUkVRKiBwX2JsZV9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbnNlbnQpIHsKLSAgYnRfYmRuYW1lX3QgYmRfbmFtZTsKLSAgdWludDMyX3QgY29kOwotICBpbnQgZGV2X3R5cGU7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKCFpc19jb25zZW50ICYmIHBhaXJpbmdfY2Iuc3RhdGUgPT0gQlRfQk9ORF9TVEFURV9CT05ESU5HKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgRGlzY2FyZCBzZWN1cml0eSByZXF1ZXN0IiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlbW90ZSBuYW1lIHVwZGF0ZSAqLwotICBpZiAoIWJ0aWZfZ2V0X2RldmljZV90eXBlKHBfYmxlX3JlcS0+YmRfYWRkciwgJmRldl90eXBlKSkgewotICAgIGRldl90eXBlID0gQlRfREVWSUNFX1RZUEVfQkxFOwotICB9Ci0gIGJ0aWZfZG1fdXBkYXRlX2JsZV9yZW1vdGVfcHJvcGVydGllcyhwX2JsZV9yZXEtPmJkX2FkZHIsIHBfYmxlX3JlcS0+YmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRfREVWSUNFX1RZUEUpZGV2X3R5cGUpOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IHBfYmxlX3JlcS0+YmRfYWRkcjsKLSAgbWVtY3B5KGJkX25hbWUubmFtZSwgcF9ibGVfcmVxLT5iZF9uYW1lLCBCRF9OQU1FX0xFTik7Ci0gIGJkX25hbWUubmFtZVtCRF9OQU1FX0xFTl0gPSAnXDAnOwotCi0gIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ESU5HKTsKLQotICBwYWlyaW5nX2NiLmJvbmRfdHlwZSA9IHRCVE1fU0VDX0RFVl9SRUM6OkJPTkRfVFlQRV9QRVJTSVNURU5UOwotICBwYWlyaW5nX2NiLmlzX2xlX29ubHkgPSB0cnVlOwotICBwYWlyaW5nX2NiLmlzX2xlX25jID0gZmFsc2U7Ci0gIHBhaXJpbmdfY2IuaXNfc3NwID0gdHJ1ZTsKLSAgYnRtX3NldF9ib25kX3R5cGVfZGV2KHBfYmxlX3JlcS0+YmRfYWRkciwgcGFpcmluZ19jYi5ib25kX3R5cGUpOwotCi0gIGNvZCA9IENPRF9VTkNMQVNTSUZJRUQ7Ci0KLSAgaW52b2tlX3NzcF9yZXF1ZXN0X2NiKGJkX2FkZHIsIGJkX25hbWUsIGNvZCwgQlRfU1NQX1ZBUklBTlRfQ09OU0VOVCwgMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2RtX2JsZV9wYXNza2V5X3JlcV9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIHBpbiByZXF1ZXN0IGV2ZW50IGluIGJ0aWYgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV9wYXNza2V5X3JlcV9ldnQodEJUQV9ETV9QSU5fUkVRKiBwX3Bpbl9yZXEpIHsKLSAgYnRfYmRuYW1lX3QgYmRfbmFtZTsKLSAgdWludDMyX3QgY29kOwotICBpbnQgZGV2X3R5cGU7Ci0KLSAgLyogUmVtb3RlIG5hbWUgdXBkYXRlICovCi0gIGlmICghYnRpZl9nZXRfZGV2aWNlX3R5cGUocF9waW5fcmVxLT5iZF9hZGRyLCAmZGV2X3R5cGUpKSB7Ci0gICAgZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CTEU7Ci0gIH0KLSAgYnRpZl9kbV91cGRhdGVfYmxlX3JlbW90ZV9wcm9wZXJ0aWVzKHBfcGluX3JlcS0+YmRfYWRkciwgcF9waW5fcmVxLT5iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVF9ERVZJQ0VfVFlQRSlkZXZfdHlwZSk7Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0gcF9waW5fcmVxLT5iZF9hZGRyOwotICBtZW1jcHkoYmRfbmFtZS5uYW1lLCBwX3Bpbl9yZXEtPmJkX25hbWUsIEJEX05BTUVfTEVOKTsKLSAgYmRfbmFtZS5uYW1lW0JEX05BTUVfTEVOXSA9ICdcMCc7Ci0KLSAgYm9uZF9zdGF0ZV9jaGFuZ2VkKEJUX1NUQVRVU19TVUNDRVNTLCBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX0JPTkRJTkcpOwotICBwYWlyaW5nX2NiLmlzX2xlX29ubHkgPSB0cnVlOwotCi0gIGNvZCA9IENPRF9VTkNMQVNTSUZJRUQ7Ci0KLSAgaW52b2tlX3Bpbl9yZXF1ZXN0X2NiKGJkX2FkZHIsIGJkX25hbWUsIGNvZCwgZmFsc2UpOwotfQotc3RhdGljIHZvaWQgYnRpZl9kbV9ibGVfa2V5X25jX3JlcV9ldnQodEJUQV9ETV9TUF9LRVlfTk9USUYqIHBfbm90aWZfcmVxKSB7Ci0gIC8qIFRPRE8gaW1wbGVtZW50IGtleSBub3RpZmljYXRpb24gZm9yIG51bWVyaWMgY29tcGFyaXNvbiAqLwotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAvKiBSZW1vdGUgbmFtZSB1cGRhdGUgKi8KLSAgYnRpZl91cGRhdGVfcmVtb3RlX3Byb3BlcnRpZXMocF9ub3RpZl9yZXEtPmJkX2FkZHIsIHBfbm90aWZfcmVxLT5iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBCVF9ERVZJQ0VfVFlQRV9CTEUpOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IHBfbm90aWZfcmVxLT5iZF9hZGRyOwotCi0gIGJ0X2JkbmFtZV90IGJkX25hbWU7Ci0gIG1lbWNweShiZF9uYW1lLm5hbWUsIHBfbm90aWZfcmVxLT5iZF9uYW1lLCBCRF9OQU1FX0xFTik7Ci0gIGJkX25hbWUubmFtZVtCRF9OQU1FX0xFTl0gPSAnXDAnOwotCi0gIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfU1VDQ0VTUywgYmRfYWRkciwgQlRfQk9ORF9TVEFURV9CT05ESU5HKTsKLSAgcGFpcmluZ19jYi5pc19zc3AgPSBmYWxzZTsKLSAgcGFpcmluZ19jYi5pc19sZV9vbmx5ID0gdHJ1ZTsKLSAgcGFpcmluZ19jYi5pc19sZV9uYyA9IHRydWU7Ci0KLSAgaW52b2tlX3NzcF9yZXF1ZXN0X2NiKGJkX2FkZHIsIGJkX25hbWUsIENPRF9VTkNMQVNTSUZJRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBCVF9TU1BfVkFSSUFOVF9QQVNTS0VZX0NPTkZJUk1BVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbm90aWZfcmVxLT5wYXNza2V5KTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9kbV9ibGVfb29iX3JlcV9ldnQodEJUQV9ETV9TUF9STVRfT09CKiByZXFfb29iX3R5cGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0gcmVxX29vYl90eXBlLT5iZF9hZGRyOwotICAvKiBXZSBhbHJlYWR5IGNoZWNrZWQgaWYgT09CIGRhdGEgaXMgcHJlc2VudCBpbgotICAgKiBidGlmX2RtX3NldF9vb2JfZm9yX2xlX2lvX3JlcSwgYnV0IGNoZWNrIGhlcmUgYWdhaW4uIElmIGl0J3Mgbm90IHByZXNlbnQKLSAgICogZG8gbm90aGluZywgcGFpcmluZyB3aWxsIHRpbWVvdXQuCi0gICAqLwotICBpZiAoaXNfZW1wdHlfMTI4Yml0KG9vYl9jYi5wMTkyX2RhdGEuc21fdGspKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogbWFrZSBzdXJlIE9PQiBkYXRhIGlzIGZvciB0aGlzIHBhcnRpY3VsYXIgZGV2aWNlICovCi0gIGlmIChyZXFfb29iX3R5cGUtPmJkX2FkZHIgIT0gb29iX2NiLmJkYWRkcikgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHJlbW90ZSBhZGRyZXNzIGRpZG4ndCBtYXRjaCBPT0IgZGF0YSBhZGRyZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlbW90ZSBuYW1lIHVwZGF0ZSAqLwotICBidGlmX3VwZGF0ZV9yZW1vdGVfcHJvcGVydGllcyhyZXFfb29iX3R5cGUtPmJkX2FkZHIsIHJlcV9vb2JfdHlwZS0+YmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQlRfREVWSUNFX1RZUEVfQkxFKTsKLQotICBib25kX3N0YXRlX2NoYW5nZWQoQlRfU1RBVFVTX1NVQ0NFU1MsIGJkX2FkZHIsIEJUX0JPTkRfU1RBVEVfQk9ORElORyk7Ci0gIHBhaXJpbmdfY2IuaXNfc3NwID0gZmFsc2U7Ci0gIHBhaXJpbmdfY2IuaXNfbGVfb25seSA9IHRydWU7Ci0gIHBhaXJpbmdfY2IuaXNfbGVfbmMgPSBmYWxzZTsKLQotICBCVE1fQmxlT29iRGF0YVJlcGx5KHJlcV9vb2JfdHlwZS0+YmRfYWRkciwgMCwgMTYsIG9vYl9jYi5wMTkyX2RhdGEuc21fdGspOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV9zY19vb2JfcmVxX2V2dCh0QlRBX0RNX1NQX1JNVF9PT0IqIHJlcV9vb2JfdHlwZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBSYXdBZGRyZXNzIGJkX2FkZHIgPSByZXFfb29iX3R5cGUtPmJkX2FkZHI7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBiZF9hZGRyOiAlcyIsIF9fZnVuY19fLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBvb2JfY2IuYmRhZGRyOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIG9vYl9jYi5iZGFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvKiBtYWtlIHN1cmUgT09CIGRhdGEgaXMgZm9yIHRoaXMgcGFydGljdWxhciBkZXZpY2UgKi8KLSAgaWYgKHJlcV9vb2JfdHlwZS0+YmRfYWRkciAhPSBvb2JfY2IuYmRhZGRyKSB7Ci0gICAgTE9HX0VSUk9SKCJyZW1vdGUgYWRkcmVzcyBkaWRuJ3QgbWF0Y2ggT09CIGRhdGEgYWRkcmVzcyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFdlIGFscmVhZHkgY2hlY2tlZCBpZiBPT0IgZGF0YSBpcyBwcmVzZW50IGluCi0gICAqIGJ0aWZfZG1fc2V0X29vYl9mb3JfbGVfaW9fcmVxLCBidXQgY2hlY2sgaGVyZSBhZ2Fpbi4gSWYgaXQncyBub3QgcHJlc2VudAotICAgKiBkbyBub3RoaW5nLCBwYWlyaW5nIHdpbGwgdGltZW91dC4KLSAgICovCi0gIGJ0X29vYl9kYXRhX3Qgb29iX2RhdGFfdG9fdXNlID0ge307Ci0gIHN3aXRjaCAob29iX2NiLmRhdGFfcHJlc2VudCkgewotICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzE5Ml9BTkRfMjU2OgotICAgICAgTE9HX0lORk8oIkhhdmUgYm90aCBQMTkyIGFuZCAgUDI1NiIpOwotICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgIC8vIEFsd2F5cyBwcmVmZXIgMjU2IGZvciBMRQotICAgIGNhc2UgQlRNX09PQl9QUkVTRU5UXzI1NjoKLSAgICAgIExPR19JTkZPKCJVc2luZyBQMjU2Iik7Ci0gICAgICBpZiAoaXNfZW1wdHlfMTI4Yml0KG9vYl9jYi5wMjU2X2RhdGEuYykgJiYKLSAgICAgICAgICBpc19lbXB0eV8xMjhiaXQob29iX2NiLnAyNTZfZGF0YS5yKSkgewotICAgICAgICBMT0dfV0FSTigiUDI1NiBMRSBTQyBPT0IgZGF0YSBpcyBlbXB0eSIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBvb2JfZGF0YV90b191c2UgPSBvb2JfY2IucDI1Nl9kYXRhOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fT09CX1BSRVNFTlRfMTkyOgotICAgICAgTE9HX0lORk8oIlVzaW5nIFAxOTIiKTsKLSAgICAgIGlmIChpc19lbXB0eV8xMjhiaXQob29iX2NiLnAxOTJfZGF0YS5jKSAmJgotICAgICAgICAgIGlzX2VtcHR5XzEyOGJpdChvb2JfY2IucDE5Ml9kYXRhLnIpKSB7Ci0gICAgICAgIExPR19XQVJOKCJQMTkyIExFIFNDIE9PQiBkYXRhIGlzIGVtcHR5Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG9vYl9kYXRhX3RvX3VzZSA9IG9vYl9jYi5wMTkyX2RhdGE7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIFJlbW90ZSBuYW1lIHVwZGF0ZSAqLwotICBidGlmX3VwZGF0ZV9yZW1vdGVfcHJvcGVydGllcyhyZXFfb29iX3R5cGUtPmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9vYl9kYXRhX3RvX3VzZS5kZXZpY2VfbmFtZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfREVWSUNFX1RZUEVfQkxFKTsKLQotICBib25kX3N0YXRlX2NoYW5nZWQoQlRfU1RBVFVTX1NVQ0NFU1MsIGJkX2FkZHIsIEJUX0JPTkRfU1RBVEVfQk9ORElORyk7Ci0gIHBhaXJpbmdfY2IuaXNfc3NwID0gZmFsc2U7Ci0gIC8vIFRPRE86IHdlIGNhbiBkZXJpdmUgY2xhc3NpYyBwYWlyaW5nIGZyb20gdGhpcyBvbmUKLSAgcGFpcmluZ19jYi5pc19sZV9vbmx5ID0gdHJ1ZTsKLSAgcGFpcmluZ19jYi5pc19sZV9uYyA9IGZhbHNlOwotICBCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseShyZXFfb29iX3R5cGUtPmJkX2FkZHIsIG9vYl9kYXRhX3RvX3VzZS5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb2JfZGF0YV90b191c2Uucik7Ci19Ci0KLXZvaWQgYnRpZl9kbV91cGRhdGVfYmxlX3JlbW90ZV9wcm9wZXJ0aWVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpIHsKLSAgYnRpZl91cGRhdGVfcmVtb3RlX3Byb3BlcnRpZXMoYmRfYWRkciwgYmRfbmFtZSwgTlVMTCwgZGV2X3R5cGUpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV90eF90ZXN0X2NiYWNrKHZvaWQqIHApIHsKLSAgY2hhciogcF9wYXJhbSA9IChjaGFyKilwOwotICB1aW50OF90IHN0YXR1czsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9wYXJhbSk7Ci0gIGludm9rZV9sZV90ZXN0X21vZGVfY2IoKHN0YXR1cyA9PSAwKSA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUwsIDApOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV9yeF90ZXN0X2NiYWNrKHZvaWQqIHApIHsKLSAgY2hhciogcF9wYXJhbSA9IChjaGFyKilwOwotICB1aW50OF90IHN0YXR1czsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9wYXJhbSk7Ci0gIGludm9rZV9sZV90ZXN0X21vZGVfY2IoKHN0YXR1cyA9PSAwKSA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUwsIDApOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RtX2JsZV90ZXN0X2VuZF9jYmFjayh2b2lkKiBwKSB7Ci0gIGNoYXIqIHBfcGFyYW0gPSAoY2hhciopcDsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IGNvdW50ID0gMDsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9wYXJhbSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkgU1RSRUFNX1RPX1VJTlQxNihjb3VudCwgcF9wYXJhbSk7Ci0gIGludm9rZV9sZV90ZXN0X21vZGVfY2IoKHN0YXR1cyA9PSAwKSA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotfQotCi12b2lkIGJ0aWZfYmxlX3RyYW5zbWl0dGVyX3Rlc3QodWludDhfdCB0eF9mcmVxLCB1aW50OF90IHRlc3RfZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYWNrZXRfcGF5bG9hZCkgewotICBCVE1fQmxlVHJhbnNtaXR0ZXJUZXN0KHR4X2ZyZXEsIHRlc3RfZGF0YV9sZW4sIHBhY2tldF9wYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfZG1fYmxlX3R4X3Rlc3RfY2JhY2spOwotfQotCi12b2lkIGJ0aWZfYmxlX3JlY2VpdmVyX3Rlc3QodWludDhfdCByeF9mcmVxKSB7Ci0gIEJUTV9CbGVSZWNlaXZlclRlc3QocnhfZnJlcSwgYnRpZl9kbV9ibGVfcnhfdGVzdF9jYmFjayk7Ci19Ci0KLXZvaWQgYnRpZl9ibGVfdGVzdF9lbmQoKSB7IEJUTV9CbGVUZXN0RW5kKGJ0aWZfZG1fYmxlX3Rlc3RfZW5kX2NiYWNrKTsgfQotCi12b2lkIGJ0aWZfZG1fb25fZGlzYWJsZSgpIHsKLSAgLyogY2FuY2VsIGFueSBwZW5kaW5nIHBhaXJpbmcgcmVxdWVzdHMgKi8KLSAgaWYgKGlzX2JvbmRpbmdfb3Jfc2RwKCkpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQ2FuY2VsIHBlbmRpbmcgcGFpcmluZyByZXF1ZXN0IiwgX19mdW5jX18pOwotICAgIGJ0aWZfZG1fY2FuY2VsX2JvbmQocGFpcmluZ19jYi5iZF9hZGRyKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9yZWFkX2VuZXJneV9pbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgIFJlYWRzIHRoZSBlbmVyZ3kgaW5mbyBmcm9tIGNvbnRyb2xsZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fcmVhZF9lbmVyZ3lfaW5mbygpIHsgQlRBX0RtQmxlR2V0RW5lcmd5SW5mbyhidGFfZW5lcmd5X2luZm9fY2IpOyB9Ci0KLXN0YXRpYyBjaGFyKiBidGlmX2dldF9kZWZhdWx0X2xvY2FsX25hbWUoKSB7Ci0gIGlmIChidGlmX2RlZmF1bHRfbG9jYWxfbmFtZVswXSA9PSAnXDAnKSB7Ci0gICAgaW50IG1heF9sZW4gPSBzaXplb2YoYnRpZl9kZWZhdWx0X2xvY2FsX25hbWUpIC0gMTsKLSAgICBpZiAoQlRNX0RFRl9MT0NBTF9OQU1FWzBdICE9ICdcMCcpIHsKLSAgICAgIHN0cm5jcHkoYnRpZl9kZWZhdWx0X2xvY2FsX25hbWUsIEJUTV9ERUZfTE9DQUxfTkFNRSwgbWF4X2xlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNoYXIgcHJvcF9tb2RlbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgb3NpX3Byb3BlcnR5X2dldChQUk9QRVJUWV9QUk9EVUNUX01PREVMLCBwcm9wX21vZGVsLCAiIik7Ci0gICAgICBzdHJuY3B5KGJ0aWZfZGVmYXVsdF9sb2NhbF9uYW1lLCBwcm9wX21vZGVsLCBtYXhfbGVuKTsKLSAgICB9Ci0gICAgYnRpZl9kZWZhdWx0X2xvY2FsX25hbWVbbWF4X2xlbl0gPSAnXDAnOwotICB9Ci0gIHJldHVybiBidGlmX2RlZmF1bHRfbG9jYWxfbmFtZTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9zdGF0c19hZGRfYm9uZF9ldmVudChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9ib25kX2Z1bmN0aW9uX3QgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soYm9uZF9ldmVudF9sb2NrKTsKLQotICBidGlmX2JvbmRfZXZlbnRfdCogZXZlbnQgPSAmYnRpZl9kbV9ib25kX2V2ZW50c1tidGlmX2V2ZW50c19lbmRfaW5kZXhdOwotICBldmVudC0+YmRfYWRkciA9IGJkX2FkZHI7Ci0gIGV2ZW50LT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwotICBldmVudC0+c3RhdGUgPSBzdGF0ZTsKLSAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmV2ZW50LT50aW1lc3RhbXApOwotCi0gIGJ0aWZfbnVtX2JvbmRfZXZlbnRzKys7Ci0gIGJ0aWZfZXZlbnRzX2VuZF9pbmRleCA9Ci0gICAgICAoYnRpZl9ldmVudHNfZW5kX2luZGV4ICsgMSkgJSAoTUFYX0JUSUZfQk9ORF9FVkVOVF9FTlRSSUVTICsgMSk7Ci0gIGlmIChidGlmX2V2ZW50c19lbmRfaW5kZXggPT0gYnRpZl9ldmVudHNfc3RhcnRfaW5kZXgpIHsKLSAgICBidGlmX2V2ZW50c19zdGFydF9pbmRleCA9Ci0gICAgICAgIChidGlmX2V2ZW50c19zdGFydF9pbmRleCArIDEpICUgKE1BWF9CVElGX0JPTkRfRVZFTlRfRU5UUklFUyArIDEpOwotICB9Ci0KLSAgaW50IHR5cGU7Ci0gIGJ0aWZfZ2V0X2RldmljZV90eXBlKGJkX2FkZHIsICZ0eXBlKTsKLQotICBibHVldG9vdGg6OmNvbW1vbjo6ZGV2aWNlX3R5cGVfdCBkZXZpY2VfdHlwZTsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjoKLSAgICAgIGRldmljZV90eXBlID0gYmx1ZXRvb3RoOjpjb21tb246OkRFVklDRV9UWVBFX0JSRURSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9ERVZJQ0VfVFlQRV9CTEU6Ci0gICAgICBkZXZpY2VfdHlwZSA9IGJsdWV0b290aDo6Y29tbW9uOjpERVZJQ0VfVFlQRV9MRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRfREVWSUNFX1RZUEVfRFVNTzoKLSAgICAgIGRldmljZV90eXBlID0gYmx1ZXRvb3RoOjpjb21tb246OkRFVklDRV9UWVBFX0RVTU87Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZGV2aWNlX3R5cGUgPSBibHVldG9vdGg6OmNvbW1vbjo6REVWSUNFX1RZUEVfVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgdWludDMyX3QgY29kID0gZ2V0X2NvZCgmYmRfYWRkcik7Ci0gIHVpbnQ2NF90IHRzID0KLSAgICAgIGV2ZW50LT50aW1lc3RhbXAudHZfc2VjICogMTAwMCArIGV2ZW50LT50aW1lc3RhbXAudHZfbnNlYyAvIDEwMDAwMDA7Ci0gIGJsdWV0b290aDo6Y29tbW9uOjpCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dQYWlyRXZlbnQoCi0gICAgICAwLCB0cywgY29kLCBkZXZpY2VfdHlwZSk7Ci19Ci0KLXZvaWQgYnRpZl9kZWJ1Z19ib25kX2V2ZW50X2R1bXAoaW50IGZkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhib25kX2V2ZW50X2xvY2spOwotICBkcHJpbnRmKGZkLCAiXG5Cb25kIEV2ZW50czogXG4iKTsKLSAgZHByaW50ZihmZCwgIiAgVG90YWwgTnVtYmVyIG9mIGV2ZW50czogJXp1XG4iLCBidGlmX251bV9ib25kX2V2ZW50cyk7Ci0gIGlmIChidGlmX251bV9ib25kX2V2ZW50cyA+IDApCi0gICAgZHByaW50ZihmZCwKLSAgICAgICAgICAgICIgIFRpbWUgICAgICAgICAgYWRkcmVzcyAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgIFN0YXRlXG4iKTsKLQotICBmb3IgKHNpemVfdCBpID0gYnRpZl9ldmVudHNfc3RhcnRfaW5kZXg7IGkgIT0gYnRpZl9ldmVudHNfZW5kX2luZGV4OwotICAgICAgIGkgPSAoaSArIDEpICUgKE1BWF9CVElGX0JPTkRfRVZFTlRfRU5UUklFUyArIDEpKSB7Ci0gICAgYnRpZl9ib25kX2V2ZW50X3QqIGV2ZW50ID0gJmJ0aWZfZG1fYm9uZF9ldmVudHNbaV07Ci0KLSAgICBjaGFyIGV2ZW50dGltZVsyMF07Ci0gICAgY2hhciB0ZW1wdGltZVsyMF07Ci0gICAgc3RydWN0IHRtKiB0c3RhbXAgPSBsb2NhbHRpbWUoJmV2ZW50LT50aW1lc3RhbXAudHZfc2VjKTsKLSAgICBzdHJmdGltZSh0ZW1wdGltZSwgc2l6ZW9mKHRlbXB0aW1lKSwgIiVIOiVNOiVTIiwgdHN0YW1wKTsKLSAgICBzbnByaW50ZihldmVudHRpbWUsIHNpemVvZihldmVudHRpbWUpLCAiJXMuJTAzbGQiLCB0ZW1wdGltZSwKLSAgICAgICAgICAgICBldmVudC0+dGltZXN0YW1wLnR2X25zZWMgLyAxMDAwMDAwKTsKLQotICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZTsKLSAgICBzd2l0Y2ggKGV2ZW50LT5mdW5jdGlvbikgewotICAgICAgY2FzZSBCVElGX0RNX0ZVTkNfQ1JFQVRFX0JPTkQ6Ci0gICAgICAgIGZ1bmNfbmFtZSA9ICJidGlmX2RtX2NyZWF0ZV9ib25kIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUSUZfRE1fRlVOQ19SRU1PVkVfQk9ORDoKLSAgICAgICAgZnVuY19uYW1lID0gImJ0aWZfZG1fcmVtb3ZlX2JvbmQiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRJRl9ETV9GVU5DX0JPTkRfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgZnVuY19uYW1lID0gImJvbmRfc3RhdGVfY2hhbmdlZCAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZ1bmNfbmFtZSA9ICJJbnZhbGlkIHZhbHVlICAgICAgIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciogYm9uZF9zdGF0ZTsKLSAgICBzd2l0Y2ggKGV2ZW50LT5zdGF0ZSkgewotICAgICAgY2FzZSBCVF9CT05EX1NUQVRFX05PTkU6Ci0gICAgICAgIGJvbmRfc3RhdGUgPSAiQk9ORF9TVEFURV9OT05FIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUX0JPTkRfU1RBVEVfQk9ORElORzoKLSAgICAgICAgYm9uZF9zdGF0ZSA9ICJCT05EX1NUQVRFX0JPTkRJTkciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRfQk9ORF9TVEFURV9CT05ERUQ6Ci0gICAgICAgIGJvbmRfc3RhdGUgPSAiQk9ORF9TVEFURV9CT05ERUQiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJvbmRfc3RhdGUgPSAiSW52YWxpZCBib25kIHN0YXRlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZHByaW50ZihmZCwgIiAgJXMgICVzICAlcyAgJXNcbiIsIGV2ZW50dGltZSwKLSAgICAgICAgICAgIGV2ZW50LT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgZnVuY19uYW1lLCBib25kX3N0YXRlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9nYXR0LmNjIGIvYnRpZi9zcmMvYnRpZl9nYXR0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA3NmIwLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfZ2F0dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX2dhdHQuYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBHQVRUIFByb2ZpbGUgQmx1ZXRvb3RoIEludGVyZmFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9nYXR0IgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9nYXR0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0KLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9nYXR0LmgiCi0jaW5jbHVkZSAiYnRpZl9nYXR0X3V0aWwuaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLQotY29uc3QgYnRnYXR0X2NhbGxiYWNrc190KiBidF9nYXR0X2NhbGxiYWNrcyA9IE5VTEw7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2dhdHRfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZXMgdGhlIEdBVFQgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0X2luaXQoY29uc3QgYnRnYXR0X2NhbGxiYWNrc190KiBjYWxsYmFja3MpIHsKLSAgYnRfZ2F0dF9jYWxsYmFja3MgPSBjYWxsYmFja3M7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZ2F0dF9jbGVhbnVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZXMgdGhlIEdBVFQgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfZ2F0dF9jbGVhbnVwKHZvaWQpIHsKLSAgaWYgKGJ0X2dhdHRfY2FsbGJhY2tzKSBidF9nYXR0X2NhbGxiYWNrcyA9IE5VTEw7Ci0KLSAgQlRBX0dBVFRDX0Rpc2FibGUoKTsKLSAgQlRBX0dBVFRTX0Rpc2FibGUoKTsKLX0KLQotc3RhdGljIGJ0Z2F0dF9pbnRlcmZhY2VfdCBidGdhdHRJbnRlcmZhY2UgPSB7Ci0gICAgLnNpemUgPSBzaXplb2YoYnRnYXR0SW50ZXJmYWNlKSwKLQotICAgIC5pbml0ID0gYnRpZl9nYXR0X2luaXQsCi0gICAgLmNsZWFudXAgPSBidGlmX2dhdHRfY2xlYW51cCwKLQotICAgIC5jbGllbnQgPSAmYnRnYXR0Q2xpZW50SW50ZXJmYWNlLAotICAgIC5zZXJ2ZXIgPSAmYnRnYXR0U2VydmVySW50ZXJmYWNlLAotICAgIC5zY2FubmVyID0gbnVsbHB0ciwgICAgLy8gZmlsbGVkIGluIGJ0aWZfZ2F0dF9nZXRfaW50ZXJmYWNlCi0gICAgLmFkdmVydGlzZXIgPSBudWxscHRyICAvLyBmaWxsZWQgaW4gYnRpZl9nYXR0X2dldF9pbnRlcmZhY2UKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2dhdHRfZ2V0X2ludGVyZmFjZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IHRoZSBnYXR0IGNhbGxiYWNrIGludGVyZmFjZQotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRnYXR0X2ludGVyZmFjZV90Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCogYnRpZl9nYXR0X2dldF9pbnRlcmZhY2UoKSB7Ci0gIC8vIFRPRE8oanBhd2xvd3NraSkgcmlnaHQgbm93IGluaXRpYWxpemluZyBhZHZlcnRpc2VyIGZpZWxkIGluIHN0YXRpYwotICAvLyBzdHJ1Y3R1cmUgY2F1c2UgZXhwbG9zaW9uIG9mIGRlcGVuZGVuY2llcy4gSXQgbXVzdCBiZSBpbml0aWFsaXplZCBoZXJlCi0gIC8vIHVudGlsIHRob3NlIGRlcGVuZGVuY2llcyBhcmUgcHJvcGVybHkgYWJzdHJhY3RlZCBmb3IgdGVzdHMuCi0gIGJ0Z2F0dEludGVyZmFjZS5zY2FubmVyID0gZ2V0X2JsZV9zY2FubmVyX2luc3RhbmNlKCk7Ci0gIGJ0Z2F0dEludGVyZmFjZS5hZHZlcnRpc2VyID0gZ2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCk7Ci0gIHJldHVybiAmYnRnYXR0SW50ZXJmYWNlOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9nYXR0X2NsaWVudC5jYyBiL2J0aWYvc3JjL2J0aWZfZ2F0dF9jbGllbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZGNmNDguLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9nYXR0X2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX2dhdHRfY2xpZW50LmMKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgR0FUVCBjbGllbnQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfZ2F0dGMiCi0KLSNpbmNsdWRlIDxiYXNlL2F0X2V4aXQuaD4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZl9kbS5oIgotI2luY2x1ZGUgImJ0aWZfZ2F0dC5oIgotI2luY2x1ZGUgImJ0aWZfZ2F0dF91dGlsLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotI2luY2x1ZGUgInZlbmRvcl9hcGkuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6Ok93bmVkOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLWV4dGVybiBidF9zdGF0dXNfdCBidGlmX2dhdHRjX3Rlc3RfY29tbWFuZF9pbXBsKAotICAgIGludCBjb21tYW5kLCBjb25zdCBidGdhdHRfdGVzdF9wYXJhbXNfdCogcGFyYW1zKTsKLWV4dGVybiBjb25zdCBidGdhdHRfY2FsbGJhY2tzX3QqIGJ0X2dhdHRfY2FsbGJhY2tzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDTElfQ0JBQ0tfSU5fSk5JKFBfQ0JBQ0ssIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0X2dhdHRfY2FsbGJhY2tzICYmIGJ0X2dhdHRfY2FsbGJhY2tzLT5jbGllbnQtPlBfQ0JBQ0spIHsgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9BUEkoIkhBTCBidF9nYXR0X2NhbGxiYWNrcy0+Y2xpZW50LT4lcyIsICNQX0NCQUNLKTsgICAgICAgICAgIFwKLSAgICAgIGRvX2luX2puaV90aHJlYWQoQmluZChidF9nYXR0X2NhbGxiYWNrcy0+Y2xpZW50LT5QX0NCQUNLLCBfX1ZBX0FSR1NfXykpOyBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQVNTRVJUQygwLCAiQ2FsbGJhY2sgaXMgTlVMTCIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0hFQ0tfQlRHQVRUX0lOSVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0X2dhdHRfY2FsbGJhY2tzID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPR19XQVJOKCIlczogQlRHQVRUIG5vdCBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsgXAotICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPR19WRVJCT1NFKCIlcyIsIF9fZnVuY19fKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLW5hbWVzcGFjZSB7Ci0KLXVpbnQ4X3QgcnNzaV9yZXF1ZXN0X2NsaWVudF9pZjsKLQotc3RkOjpzdHJpbmcgYnRhX2dhdHRjX2V2ZW50X3RleHQoY29uc3QgdEJUQV9HQVRUQ19FVlQmIGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9HQVRUQ19ERVJFR19FVlQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFQgY2xpZW50IGRlcmVnaXN0ZXJlZCIpOwotICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUQyBvcGVuIHJlcXVlc3Qgc3RhdHVzIik7Ci0gICAgY2FzZSBCVEFfR0FUVENfQ0xPU0VfRVZUOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUQyBjbG9zZSByZXF1ZXN0IHN0YXR1cyIpOwotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVCBkaXNjb3ZlcnkgY29tcGxldGUiKTsKLSAgICBjYXNlIEJUQV9HQVRUQ19TRUFSQ0hfUkVTX0VWVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVCBkaXNjb3ZlcnkgcmVzdWx0Iik7Ci0gICAgY2FzZSBCVEFfR0FUVENfU1JWQ19ESVNDX0RPTkVfRVZUOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUIHNlcnZpY2UgZGlzY292ZXJ5IGRvbmUiKTsKLSAgICBjYXNlIEJUQV9HQVRUQ19OT1RJRl9FVlQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFQgYXR0cmlidXRlIG5vdGlmaWNhdGlvbiIpOwotICAgIGNhc2UgQlRBX0dBVFRDX0VYRUNfRVZUOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJleGVjdXRlIHdyaXRlIGNvbXBsZXRlIik7Ci0gICAgY2FzZSBCVEFfR0FUVENfQUNMX0VWVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQUNMIHVwIik7Ci0gICAgY2FzZSBCVEFfR0FUVENfQ0FOQ0VMX09QRU5fRVZUOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJjYW5jZWwgb3BlbiIpOwotICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfQ0hHX0VWVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygic2VydmljZSBjaGFuZ2UiKTsKLSAgICBjYXNlIEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImVuY3J5cHRpb24gY29tcGxldGUgY2FsbGJhY2siKTsKLSAgICBjYXNlIEJUQV9HQVRUQ19DRkdfTVRVX0VWVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiY29uZmlndXJlIE1UVSBjb21wbGV0ZSIpOwotICAgIGNhc2UgQlRBX0dBVFRDX0NPTkdFU1RfRVZUOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJjb25nZXN0aW9uIik7Ci0gICAgY2FzZSBCVEFfR0FUVENfUEhZX1VQREFURV9FVlQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlBIWSBjaGFuZ2UiKTsKLSAgICBjYXNlIEJUQV9HQVRUQ19DT05OX1VQREFURV9FVlQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImNvbm5lY3Rpb24gcGFyYW1ldGVycyB1cGRhdGUiKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2dhdHRjX3Vwc3RyZWFtc19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgTE9HX0RFQlVHKCJFdmVudCAlcyBbJWRdIiwKLSAgICAgICAgICAgIGJ0YV9nYXR0Y19ldmVudF90ZXh0KHN0YXRpY19jYXN0PHRCVEFfR0FUVENfRVZUPihldmVudCkpLmNfc3RyKCksCi0gICAgICAgICAgICBldmVudCk7Ci0KLSAgdEJUQV9HQVRUQyogcF9kYXRhID0gKHRCVEFfR0FUVEMqKXBfcGFyYW07Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9HQVRUQ19FWEVDX0VWVDogewotICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBjbGllbnQtPmV4ZWN1dGVfd3JpdGVfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5leGVjX2NtcGwuY29ubl9pZCwgcF9kYXRhLT5leGVjX2NtcGwuc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDogewotICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBjbGllbnQtPnNlYXJjaF9jb21wbGV0ZV9jYiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLmNvbm5faWQsIHBfZGF0YS0+c2VhcmNoX2NtcGwuc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX05PVElGX0VWVDogewotICAgICAgYnRnYXR0X25vdGlmeV9wYXJhbXNfdCBkYXRhOwotCi0gICAgICBkYXRhLmJkYSA9IHBfZGF0YS0+bm90aWZ5LmJkYTsKLSAgICAgIG1lbWNweShkYXRhLnZhbHVlLCBwX2RhdGEtPm5vdGlmeS52YWx1ZSwgcF9kYXRhLT5ub3RpZnkubGVuKTsKLQotICAgICAgZGF0YS5oYW5kbGUgPSBwX2RhdGEtPm5vdGlmeS5oYW5kbGU7Ci0gICAgICBkYXRhLmlzX25vdGlmeSA9IHBfZGF0YS0+bm90aWZ5LmlzX25vdGlmeTsKLSAgICAgIGRhdGEubGVuID0gcF9kYXRhLT5ub3RpZnkubGVuOwotCi0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIGNsaWVudC0+bm90aWZ5X2NiLCBwX2RhdGEtPm5vdGlmeS5jb25uX2lkLAotICAgICAgICAgICAgICAgIGRhdGEpOwotCi0gICAgICBpZiAoIXBfZGF0YS0+bm90aWZ5LmlzX25vdGlmeSkKLSAgICAgICAgQlRBX0dBVFRDX1NlbmRJbmRDb25maXJtKHBfZGF0YS0+bm90aWZ5LmNvbm5faWQsIHBfZGF0YS0+bm90aWZ5LmNpZCk7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOiB7Ci0gICAgICBEVkxPRygxKSA8PCAiQlRBX0dBVFRDX09QRU5fRVZUICIgPDwgcF9kYXRhLT5vcGVuLnJlbW90ZV9iZGE7Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIGNsaWVudC0+b3Blbl9jYiwgcF9kYXRhLT5vcGVuLmNvbm5faWQsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5vcGVuLnN0YXR1cywgcF9kYXRhLT5vcGVuLmNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPm9wZW4ucmVtb3RlX2JkYSk7Ci0KLSAgICAgIGlmIChHQVRUX0RFRl9CTEVfTVRVX1NJWkUgIT0gcF9kYXRhLT5vcGVuLm10dSAmJiBwX2RhdGEtPm9wZW4ubXR1KSB7Ci0gICAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgY2xpZW50LT5jb25maWd1cmVfbXR1X2NiLAotICAgICAgICAgICAgICAgICAgcF9kYXRhLT5vcGVuLmNvbm5faWQsIHBfZGF0YS0+b3Blbi5zdGF0dXMsIHBfZGF0YS0+b3Blbi5tdHUpOwotICAgICAgfQotCi0gICAgICBpZiAocF9kYXRhLT5vcGVuLnN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpCi0gICAgICAgIGJ0aWZfZ2F0dF9jaGVja19lbmNyeXB0ZWRfbGluayhwX2RhdGEtPm9wZW4ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+b3Blbi50cmFuc3BvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVENfQ0xPU0VfRVZUOiB7Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIGNsaWVudC0+Y2xvc2VfY2IsIHBfZGF0YS0+Y2xvc2UuY29ubl9pZCwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmNsb3NlLnN0YXR1cywgcF9kYXRhLT5jbG9zZS5jbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jbG9zZS5yZW1vdGVfYmRhKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX0FDTF9FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVENfREVSRUdfRVZUOgotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9SRVNfRVZUOgotICAgIGNhc2UgQlRBX0dBVFRDX0NBTkNFTF9PUEVOX0VWVDoKLSAgICBjYXNlIEJUQV9HQVRUQ19TUlZDX0RJU0NfRE9ORV9FVlQ6Ci0gICAgICBMT0dfREVCVUcoIklnbm9yaW5nIGV2ZW50ICglZCkiLCBldmVudCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0NGR19NVFVfRVZUOiB7Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIGNsaWVudC0+Y29uZmlndXJlX210dV9jYiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmNmZ19tdHUuY29ubl9pZCwgcF9kYXRhLT5jZmdfbXR1LnN0YXR1cywKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmNmZ19tdHUubXR1KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX0NPTkdFU1RfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBjbGllbnQtPmNvbmdlc3Rpb25fY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jb25nZXN0LmNvbm5faWQsIHBfZGF0YS0+Y29uZ2VzdC5jb25nZXN0ZWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19QSFlfVVBEQVRFX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgY2xpZW50LT5waHlfdXBkYXRlZF9jYiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnBoeV91cGRhdGUuY29ubl9pZCwgcF9kYXRhLT5waHlfdXBkYXRlLnR4X3BoeSwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnBoeV91cGRhdGUucnhfcGh5LCBwX2RhdGEtPnBoeV91cGRhdGUuc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfQ09OTl9VUERBVEVfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBjbGllbnQtPmNvbm5fdXBkYXRlZF9jYiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm5fdXBkYXRlLmNvbm5faWQsIHBfZGF0YS0+Y29ubl91cGRhdGUuaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jb25uX3VwZGF0ZS5sYXRlbmN5LCBwX2RhdGEtPmNvbm5fdXBkYXRlLnRpbWVvdXQsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jb25uX3VwZGF0ZS5zdGF0dXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TUlZDX0NIR19FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIGNsaWVudC0+c2VydmljZV9jaGFuZ2VkX2NiLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+c2VydmljZV9jaGFuZ2VkLmNvbm5faWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJVbmhhbmRsZWQgZXZlbnQgKCVkKSEiLCBldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFfZ2F0dGNfY2JhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICBMT0dfREVCVUcoIiBnYXR0IGNsaWVudCBjYWxsYmFjayBldmVudDolcyBbJWRdIiwKLSAgICAgICAgICAgIGdhdHRfY2xpZW50X2V2ZW50X3RleHQoZXZlbnQpLmNfc3RyKCksIGV2ZW50KTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2dhdHRjX3Vwc3RyZWFtc19ldnQsICh1aW50MTZfdClldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcF9kYXRhLCBzaXplb2YodEJUQV9HQVRUQyksIE5VTEwpOwotICBBU1NFUlRDKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUywgIkNvbnRleHQgdHJhbnNmZXIgZmFpbGVkISIsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgYnRtX3JlYWRfcnNzaV9jYih2b2lkKiBwX3ZvaWQpIHsKLSAgdEJUTV9SU1NJX1JFU1VMVCogcF9yZXN1bHQgPSAodEJUTV9SU1NJX1JFU1VMVCopcF92b2lkOwotCi0gIGlmICghcF9yZXN1bHQpIHJldHVybjsKLQotICBDTElfQ0JBQ0tfSU5fSk5JKHJlYWRfcmVtb3RlX3Jzc2lfY2IsIHJzc2lfcmVxdWVzdF9jbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgcF9yZXN1bHQtPnJlbV9iZGEsIHBfcmVzdWx0LT5yc3NpLCBwX3Jlc3VsdC0+c3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDbGllbnQgQVBJIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfcmVnaXN0ZXJfYXBwKGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlYXR0X3N1cHBvcnQpIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLQotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKAotICAgICAgW10oY29uc3QgVXVpZCYgdXVpZCwgYm9vbCBlYXR0X3N1cHBvcnQpIHsKLSAgICAgICAgQlRBX0dBVFRDX0FwcFJlZ2lzdGVyKAotICAgICAgICAgICAgYnRhX2dhdHRjX2NiYWNrLAotICAgICAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgICBbXShjb25zdCBVdWlkJiB1dWlkLCB1aW50OF90IGNsaWVudF9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgIGRvX2luX2puaV90aHJlYWQoQmluZCgKLSAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBVdWlkJiB1dWlkLCB1aW50OF90IGNsaWVudF9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgY2xpZW50LT5yZWdpc3Rlcl9jbGllbnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbGllbnRfaWQsIHV1aWQpOwotICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgdXVpZCwgY2xpZW50X2lkLCBzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIHV1aWQpLAotICAgICAgICAgICAgZWF0dF9zdXBwb3J0KTsKLSAgICAgIH0sCi0gICAgICB1dWlkLCBlYXR0X3N1cHBvcnQpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9nYXR0Y191bnJlZ2lzdGVyX2FwcF9pbXBsKGludCBjbGllbnRfaWYpIHsKLSAgQlRBX0dBVFRDX0FwcERlcmVnaXN0ZXIoY2xpZW50X2lmKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfdW5yZWdpc3Rlcl9hcHAoaW50IGNsaWVudF9pZikgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZidGlmX2dhdHRjX3VucmVnaXN0ZXJfYXBwX2ltcGwsIGNsaWVudF9pZikpOwotfQotCi12b2lkIGJ0aWZfZ2F0dGNfb3Blbl9pbXBsKGludCBjbGllbnRfaWYsIFJhd0FkZHJlc3MgYWRkcmVzcywgYm9vbCBpc19kaXJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BvcnRfcCwgYm9vbCBvcHBvcnR1bmlzdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhdGluZ19waHlzKSB7Ci0gIC8vIEVuc3VyZSBkZXZpY2UgaXMgaW4gaW5xdWlyeSBkYXRhYmFzZQotICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gIGludCBkZXZpY2VfdHlwZSA9IDA7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0ID0gKHRCVF9UUkFOU1BPUlQpQlRfVFJBTlNQT1JUX0xFOwotCi0gIGlmIChidGlmX2dldF9hZGRyZXNzX3R5cGUoYWRkcmVzcywgJmFkZHJfdHlwZSkgJiYKLSAgICAgIGJ0aWZfZ2V0X2RldmljZV90eXBlKGFkZHJlc3MsICZkZXZpY2VfdHlwZSkgJiYKLSAgICAgIGRldmljZV90eXBlICE9IEJUX0RFVklDRV9UWVBFX0JSRURSKSB7Ci0gICAgQlRBX0RtQWRkQmxlRGV2aWNlKGFkZHJlc3MsIGFkZHJfdHlwZSwgZGV2aWNlX3R5cGUpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGJhY2tncm91bmQgY29ubmVjdGlvbnMKLSAgaWYgKCFpc19kaXJlY3QpIHsKLSAgICAvLyBDaGVjayBmb3IgcHJpdmFjeSAxLjAgYW5kIDEuMSBjb250cm9sbGVyIGFuZCBkbyBub3Qgc3RhcnQgYmFja2dyb3VuZAotICAgIC8vIGNvbm5lY3Rpb24gaWYgUlBBIG9mZmxvYWRpbmcgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgaXQgd2lsbCBub3QKLSAgICAvLyBjb25uZWN0IGFmdGVyIGNoYW5nZSBvZiByYW5kb20gYWRkcmVzcwotICAgIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9wcml2YWN5KCkgJiYKLSAgICAgICAgKGFkZHJfdHlwZSA9PSBCTEVfQUREUl9SQU5ET00pICYmIEJUTV9CTEVfSVNfUkVTT0xWRV9CREEoYWRkcmVzcykpIHsKLSAgICAgIHRCVE1fQkxFX1ZTQ19DQiB2bmRfY2FwYWJpbGl0aWVzOwotICAgICAgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcygmdm5kX2NhcGFiaWxpdGllcyk7Ci0gICAgICBpZiAoIXZuZF9jYXBhYmlsaXRpZXMucnBhX29mZmxvYWRpbmcpIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBjbGllbnQtPm9wZW5fY2IsIDAsIEJUX1NUQVRVU19VTlNVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIGNsaWVudF9pZiwgYWRkcmVzcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgdHJhbnNwb3J0Ci0gIGlmICh0cmFuc3BvcnRfcCAhPSBCVF9UUkFOU1BPUlRfQVVUTykgewotICAgIHRyYW5zcG9ydCA9IHRyYW5zcG9ydF9wOwotICB9IGVsc2UgewotICAgIHN3aXRjaCAoZGV2aWNlX3R5cGUpIHsKLSAgICAgIGNhc2UgQlRfREVWSUNFX1RZUEVfQlJFRFI6Ci0gICAgICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUX0RFVklDRV9UWVBFX0JMRToKLSAgICAgICAgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0xFOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVF9ERVZJQ0VfVFlQRV9EVU1POgotICAgICAgICBpZiAodHJhbnNwb3J0X3AgPT0gQlRfVFJBTlNQT1JUX0xFKQotICAgICAgICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIENvbm5lY3QhCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIFRyYW5zcG9ydD0lZCwgZGV2aWNlIHR5cGU9JWQsIHBoeT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgZGV2aWNlX3R5cGUsIGluaXRpYXRpbmdfcGh5cyk7Ci0gIEJUQV9HQVRUQ19PcGVuKGNsaWVudF9pZiwgYWRkcmVzcywgaXNfZGlyZWN0LCB0cmFuc3BvcnQsIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICAgICAgIGluaXRpYXRpbmdfcGh5cyk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2dhdHRjX29wZW4oaW50IGNsaWVudF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGludCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3Bwb3J0dW5pc3RpYywgaW50IGluaXRpYXRpbmdfcGh5cykgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICAvLyBDbG9zdXJlIHdpbGwgb3duIHRoaXMgdmFsdWUgYW5kIGZyZWUgaXQuCi0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKEJpbmQoJmJ0aWZfZ2F0dGNfb3Blbl9pbXBsLCBjbGllbnRfaWYsIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZGlyZWN0LCB0cmFuc3BvcnQsIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhdGluZ19waHlzKSk7Ci19Ci0KLXZvaWQgYnRpZl9nYXR0Y19jbG9zZV9pbXBsKGludCBjbGllbnRfaWYsIFJhd0FkZHJlc3MgYWRkcmVzcywgaW50IGNvbm5faWQpIHsKLSAgLy8gRGlzY29ubmVjdCBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucwotICBpZiAoY29ubl9pZCAhPSAwKQotICAgIEJUQV9HQVRUQ19DbG9zZShjb25uX2lkKTsKLSAgZWxzZQotICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKGNsaWVudF9pZiwgYWRkcmVzcywgdHJ1ZSk7Ci0KLSAgLy8gQ2FuY2VsIHBlbmRpbmcgYmFja2dyb3VuZCBjb25uZWN0aW9ucyAocmVtb3ZlIGZyb20gYWNjZXB0bGlzdCkKLSAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oY2xpZW50X2lmLCBhZGRyZXNzLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2dhdHRjX2Nsb3NlKGludCBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCkgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEJpbmQoJmJ0aWZfZ2F0dGNfY2xvc2VfaW1wbCwgY2xpZW50X2lmLCBiZF9hZGRyLCBjb25uX2lkKSk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2dhdHRjX3JlZnJlc2goaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZCVEFfR0FUVENfUmVmcmVzaCwgYmRfYWRkcikpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y19zZWFyY2hfc2VydmljZShpbnQgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQqIGZpbHRlcl91dWlkKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0KLSAgaWYgKGZpbHRlcl91dWlkKSB7Ci0gICAgVXVpZCogdXVpZCA9IG5ldyBVdWlkKCpmaWx0ZXJfdXVpZCk7Ci0gICAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEJpbmQoJkJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdCwgY29ubl9pZCwgYmFzZTo6T3duZWQodXVpZCkpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgQmluZCgmQlRBX0dBVFRDX1NlcnZpY2VTZWFyY2hSZXF1ZXN0LCBjb25uX2lkLCBudWxscHRyKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9nYXR0Y19kaXNjb3Zlcl9zZXJ2aWNlX2J5X3V1aWQoaW50IGNvbm5faWQsIGNvbnN0IFV1aWQmIHV1aWQpIHsKLSAgZG9faW5fam5pX3RocmVhZChCaW5kKCZCVEFfR0FUVENfRGlzY292ZXJTZXJ2aWNlQnlVdWlkLCBjb25uX2lkLCB1dWlkKSk7Ci19Ci0KLXZvaWQgYnRpZl9nYXR0Y19nZXRfZ2F0dF9kYl9pbXBsKGludCBjb25uX2lkKSB7Ci0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGRiID0gTlVMTDsKLSAgaW50IGNvdW50ID0gMDsKLSAgQlRBX0dBVFRDX0dldEdhdHREYihjb25uX2lkLCAweDAwMDAsIDB4RkZGRiwgJmRiLCAmY291bnQpOwotCi0gIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgY2xpZW50LT5nZXRfZ2F0dF9kYl9jYiwgY29ubl9pZCwgZGIsIGNvdW50KTsKLSAgb3NpX2ZyZWUoZGIpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y19nZXRfZ2F0dF9kYihpbnQgY29ubl9pZCkgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZidGlmX2dhdHRjX2dldF9nYXR0X2RiX2ltcGwsIGNvbm5faWQpKTsKLX0KLQotdm9pZCByZWFkX2NoYXJfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICBidGdhdHRfcmVhZF9wYXJhbXNfdCogcGFyYW1zID0gbmV3IGJ0Z2F0dF9yZWFkX3BhcmFtc190OwotICBwYXJhbXMtPnZhbHVlX3R5cGUgPSAweDAwIC8qIEdBVFRDX1JFQURfVkFMVUVfVFlQRV9WQUxVRSAqLzsKLSAgcGFyYW1zLT5zdGF0dXMgPSBzdGF0dXM7Ci0gIHBhcmFtcy0+aGFuZGxlID0gaGFuZGxlOwotICBwYXJhbXMtPnZhbHVlLmxlbiA9IGxlbjsKLSAgQ0hFQ0sobGVuIDw9IEJUR0FUVF9NQVhfQVRUUl9MRU4pOwotICBpZiAobGVuID4gMCkgbWVtY3B5KHBhcmFtcy0+dmFsdWUudmFsdWUsIHZhbHVlLCBsZW4pOwotCi0gIC8vIGNsYW5nLXRpZHkgYW5hbHl6ZXIgY29tcGxhaW5zIGFib3V0IHxwYXJhbXN8IGlzIGxlYWtlZC4gIEl0IGRvZXNuJ3Qga25vdwotICAvLyB0aGF0IHxwYXJhbXwgd2lsbCBiZSBmcmVlZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCi0gIENMSV9DQkFDS19JTl9KTkkocmVhZF9jaGFyYWN0ZXJpc3RpY19jYiwgY29ubl9pZCwgc3RhdHVzLCAvKiBOT0xJTlQgKi8KLSAgICAgICAgICAgICAgICAgICBiYXNlOjpPd25lZChwYXJhbXMpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfcmVhZF9jaGFyKGludCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhfcmVxKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKEJpbmQoJkJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWMsIGNvbm5faWQsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3JlcSwgcmVhZF9jaGFyX2NiLCBudWxscHRyKSk7Ci19Ci0KLXZvaWQgcmVhZF91c2luZ19jaGFyX3V1aWRfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIGJ0Z2F0dF9yZWFkX3BhcmFtc190KiBwYXJhbXMgPSBuZXcgYnRnYXR0X3JlYWRfcGFyYW1zX3Q7Ci0gIHBhcmFtcy0+dmFsdWVfdHlwZSA9IDB4MDAgLyogR0FUVENfUkVBRF9WQUxVRV9UWVBFX1ZBTFVFICovOwotICBwYXJhbXMtPnN0YXR1cyA9IHN0YXR1czsKLSAgcGFyYW1zLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIHBhcmFtcy0+dmFsdWUubGVuID0gbGVuOwotICBDSEVDSyhsZW4gPD0gQlRHQVRUX01BWF9BVFRSX0xFTik7Ci0gIGlmIChsZW4gPiAwKSBtZW1jcHkocGFyYW1zLT52YWx1ZS52YWx1ZSwgdmFsdWUsIGxlbik7Ci0KLSAgLy8gY2xhbmctdGlkeSBhbmFseXplciBjb21wbGFpbnMgYWJvdXQgfHBhcmFtc3wgaXMgbGVha2VkLiAgSXQgZG9lc24ndCBrbm93Ci0gIC8vIHRoYXQgfHBhcmFtfCB3aWxsIGJlIGZyZWVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KLSAgQ0xJX0NCQUNLX0lOX0pOSShyZWFkX2NoYXJhY3RlcmlzdGljX2NiLCBjb25uX2lkLCBzdGF0dXMsIC8qIE5PTElOVCAqLwotICAgICAgICAgICAgICAgICAgIGJhc2U6Ok93bmVkKHBhcmFtcykpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y19yZWFkX3VzaW5nX2NoYXJfdXVpZChpbnQgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhfcmVxKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKEJpbmQoJkJUQV9HQVRUQ19SZWFkVXNpbmdDaGFyVXVpZCwgY29ubl9pZCwgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2hhbmRsZSwgZV9oYW5kbGUsIGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdXNpbmdfY2hhcl91dWlkX2NiLCBudWxscHRyKSk7Ci19Ci0KLXZvaWQgcmVhZF9kZXNjX2NiKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgYnRnYXR0X3JlYWRfcGFyYW1zX3QgcGFyYW1zOwotICBwYXJhbXMudmFsdWVfdHlwZSA9IDB4MDAgLyogR0FUVENfUkVBRF9WQUxVRV9UWVBFX1ZBTFVFICovOwotICBwYXJhbXMuc3RhdHVzID0gc3RhdHVzOwotICBwYXJhbXMuaGFuZGxlID0gaGFuZGxlOwotICBwYXJhbXMudmFsdWUubGVuID0gbGVuOwotICBDSEVDSyhsZW4gPD0gQlRHQVRUX01BWF9BVFRSX0xFTik7Ci0gIGlmIChsZW4gPiAwKSBtZW1jcHkocGFyYW1zLnZhbHVlLnZhbHVlLCB2YWx1ZSwgbGVuKTsKLQotICBDTElfQ0JBQ0tfSU5fSk5JKHJlYWRfZGVzY3JpcHRvcl9jYiwgY29ubl9pZCwgc3RhdHVzLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y19yZWFkX2NoYXJfZGVzY3IoaW50IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aF9yZXEpIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoQmluZCgmQlRBX0dBVFRDX1JlYWRDaGFyRGVzY3IsIGNvbm5faWQsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3JlcSwgcmVhZF9kZXNjX2NiLCBudWxscHRyKSk7Ci19Ci0KLXZvaWQgd3JpdGVfY2hhcl9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBjb25zdCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICBDTElfQ0JBQ0tfSU5fSk5JKHdyaXRlX2NoYXJhY3RlcmlzdGljX2NiLCBjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgbGVuLAotICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfd3JpdGVfY2hhcihpbnQgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfdHlwZSwgaW50IGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWwsIHNpemVfdCBsZW4pIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSh2YWwsIHZhbCArIGxlbik7Ci0KLSAgaWYgKHZhbHVlLnNpemUoKSA+IEJUR0FUVF9NQVhfQVRUUl9MRU4pIHZhbHVlLnJlc2l6ZShCVEdBVFRfTUFYX0FUVFJfTEVOKTsKLQotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUsIGNvbm5faWQsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV90eXBlLCBzdGQ6Om1vdmUodmFsdWUpLCBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9jaGFyX2NiLCBudWxscHRyKSk7Ci19Ci0KLXZvaWQgd3JpdGVfZGVzY3JfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gIENMSV9DQkFDS19JTl9KTkkod3JpdGVfZGVzY3JpcHRvcl9jYiwgY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGxlbiwgdmFsdWUpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y193cml0ZV9jaGFyX2Rlc2NyKGludCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRoX3JlcSwgY29uc3QgdWludDhfdCogdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUodmFsLCB2YWwgKyBsZW4pOwotCi0gIGlmICh2YWx1ZS5zaXplKCkgPiBCVEdBVFRfTUFYX0FUVFJfTEVOKSB2YWx1ZS5yZXNpemUoQlRHQVRUX01BWF9BVFRSX0xFTik7Ci0KLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoQmluZCgmQlRBX0dBVFRDX1dyaXRlQ2hhckRlc2NyLCBjb25uX2lkLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHZhbHVlKSwgYXV0aF9yZXEsIHdyaXRlX2Rlc2NyX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfZXhlY3V0ZV93cml0ZShpbnQgY29ubl9pZCwgaW50IGV4ZWN1dGUpIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBCaW5kKCZCVEFfR0FUVENfRXhlY3V0ZVdyaXRlLCBjb25uX2lkLCAodWludDhfdClleGVjdXRlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfZ2F0dGNfcmVnX2Zvcl9ub3RpZmljYXRpb25faW1wbCh0R0FUVF9JRiBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0KLSAgICAgIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoY2xpZW50X2lmLCBiZGEsIGhhbmRsZSk7Ci0KLSAgLy8gVE9ETyhqcGF3bG93c2tpKTogY29ubl9pZCBpcyBjdXJyZW50bHkgdW51c2VkCi0gIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgY2xpZW50LT5yZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uX2NiLAotICAgICAgICAgICAgLyogY29ubl9pZCAqLyAwLCAxLCBzdGF0dXMsIGhhbmRsZSk7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfcmVnX2Zvcl9ub3RpZmljYXRpb24oaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0KLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBCaW5kKGJhc2U6Oklnbm9yZVJlc3VsdCgmYnRpZl9nYXR0Y19yZWdfZm9yX25vdGlmaWNhdGlvbl9pbXBsKSwgY2xpZW50X2lmLAotICAgICAgICAgICBiZF9hZGRyLCBoYW5kbGUpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9nYXR0Y19kZXJlZ19mb3Jfbm90aWZpY2F0aW9uX2ltcGwodEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGNsaWVudF9pZiwgYmRhLCBoYW5kbGUpOwotCi0gIC8vIFRPRE8oanBhd2xvd3NraSk6IGNvbm5faWQgaXMgY3VycmVudGx5IHVudXNlZAotICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIGNsaWVudC0+cmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbl9jYiwKLSAgICAgICAgICAgIC8qIGNvbm5faWQgKi8gMCwgMCwgc3RhdHVzLCBoYW5kbGUpOwotfQotCi1idF9zdGF0dXNfdCBidGlmX2dhdHRjX2RlcmVnX2Zvcl9ub3RpZmljYXRpb24oaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotCi0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgQmluZChiYXNlOjpJZ25vcmVSZXN1bHQoJmJ0aWZfZ2F0dGNfZGVyZWdfZm9yX25vdGlmaWNhdGlvbl9pbXBsKSwKLSAgICAgICAgICAgY2xpZW50X2lmLCBiZF9hZGRyLCBoYW5kbGUpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfcmVhZF9yZW1vdGVfcnNzaShpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJzc2lfcmVxdWVzdF9jbGllbnRfaWYgPSBjbGllbnRfaWY7Ci0KLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBCaW5kKGJhc2U6Oklnbm9yZVJlc3VsdCgmQlRNX1JlYWRSU1NJKSwgYmRfYWRkciwgYnRtX3JlYWRfcnNzaV9jYikpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y19jb25maWd1cmVfbXR1KGludCBjb25uX2lkLCBpbnQgbXR1KSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgQmluZChiYXNlOjpJZ25vcmVSZXN1bHQoCi0gICAgICAgIHN0YXRpY19jYXN0PHZvaWQgKCopKHVpbnQxNl90LHVpbnQxNl90KT4oJkJUQV9HQVRUQ19Db25maWd1cmVNVFUpKSwKLSAgICAgICAgY29ubl9pZCwgbXR1KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfZ2F0dGNfY29ubl9wYXJhbWV0ZXJfdXBkYXRlX2ltcGwoCi0gICAgUmF3QWRkcmVzcyBhZGRyLCBpbnQgbWluX2ludGVydmFsLCBpbnQgbWF4X2ludGVydmFsLCBpbnQgbGF0ZW5jeSwKLSAgICBpbnQgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwgdWludDE2X3QgbWF4X2NlX2xlbikgewotICBpZiAoQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlKGFkZHIpKQotICAgIEJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXMoYWRkciwgbWluX2ludGVydmFsLCBtYXhfaW50ZXJ2YWwsIGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCBtaW5fY2VfbGVuLCBtYXhfY2VfbGVuKTsKLSAgZWxzZQotICAgIEJUQV9EbVNldEJsZVByZWZDb25uUGFyYW1zKGFkZHIsIG1pbl9pbnRlcnZhbCwgbWF4X2ludGVydmFsLCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOwotfQotCi1idF9zdGF0dXNfdCBidGlmX2dhdHRjX2Nvbm5fcGFyYW1ldGVyX3VwZGF0ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9pbnRlcnZhbCwgaW50IG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXRlbmN5LCBpbnQgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKEJpbmQoCi0gICAgICBiYXNlOjpJZ25vcmVSZXN1bHQoJmJ0aWZfZ2F0dGNfY29ubl9wYXJhbWV0ZXJfdXBkYXRlX2ltcGwpLCBiZF9hZGRyLAotICAgICAgbWluX2ludGVydmFsLCBtYXhfaW50ZXJ2YWwsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfc2V0X3ByZWZlcnJlZF9waHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9vcHRpb25zKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgQmluZCgmQlRNX0JsZVNldFBoeSwgYmRfYWRkciwgdHhfcGh5LCByeF9waHksIHBoeV9vcHRpb25zKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dGNfcmVhZF9waHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwgdWludDhfdCBzdGF0dXMpPiBjYikgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkJUTV9CbGVSZWFkUGh5LCBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam5pX3RocmVhZF93cmFwcGVyKEZST01fSEVSRSwgY2IpKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBidGlmX2dhdHRjX2dldF9kZXZpY2VfdHlwZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGludCBkZXZpY2VfdHlwZSA9IDA7Ci0KLSAgaWYgKGJ0aWZfY29uZmlnX2dldF9pbnQoYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksICJEZXZUeXBlIiwgJmRldmljZV90eXBlKSkKLSAgICByZXR1cm4gZGV2aWNlX3R5cGU7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0Y190ZXN0X2NvbW1hbmQoaW50IGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X3Rlc3RfcGFyYW1zX3QmIHBhcmFtcykgewotICByZXR1cm4gYnRpZl9nYXR0Y190ZXN0X2NvbW1hbmRfaW1wbChjb21tYW5kLCAmcGFyYW1zKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNvbnN0IGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QgYnRnYXR0Q2xpZW50SW50ZXJmYWNlID0gewotICAgIGJ0aWZfZ2F0dGNfcmVnaXN0ZXJfYXBwLAotICAgIGJ0aWZfZ2F0dGNfdW5yZWdpc3Rlcl9hcHAsCi0gICAgYnRpZl9nYXR0Y19vcGVuLAotICAgIGJ0aWZfZ2F0dGNfY2xvc2UsCi0gICAgYnRpZl9nYXR0Y19yZWZyZXNoLAotICAgIGJ0aWZfZ2F0dGNfc2VhcmNoX3NlcnZpY2UsCi0gICAgYnRpZl9nYXR0Y19kaXNjb3Zlcl9zZXJ2aWNlX2J5X3V1aWQsCi0gICAgYnRpZl9nYXR0Y19yZWFkX2NoYXIsCi0gICAgYnRpZl9nYXR0Y19yZWFkX3VzaW5nX2NoYXJfdXVpZCwKLSAgICBidGlmX2dhdHRjX3dyaXRlX2NoYXIsCi0gICAgYnRpZl9nYXR0Y19yZWFkX2NoYXJfZGVzY3IsCi0gICAgYnRpZl9nYXR0Y193cml0ZV9jaGFyX2Rlc2NyLAotICAgIGJ0aWZfZ2F0dGNfZXhlY3V0ZV93cml0ZSwKLSAgICBidGlmX2dhdHRjX3JlZ19mb3Jfbm90aWZpY2F0aW9uLAotICAgIGJ0aWZfZ2F0dGNfZGVyZWdfZm9yX25vdGlmaWNhdGlvbiwKLSAgICBidGlmX2dhdHRjX3JlYWRfcmVtb3RlX3Jzc2ksCi0gICAgYnRpZl9nYXR0Y19nZXRfZGV2aWNlX3R5cGUsCi0gICAgYnRpZl9nYXR0Y19jb25maWd1cmVfbXR1LAotICAgIGJ0aWZfZ2F0dGNfY29ubl9wYXJhbWV0ZXJfdXBkYXRlLAotICAgIGJ0aWZfZ2F0dGNfc2V0X3ByZWZlcnJlZF9waHksCi0gICAgYnRpZl9nYXR0Y19yZWFkX3BoeSwKLSAgICBidGlmX2dhdHRjX3Rlc3RfY29tbWFuZCwKLSAgICBidGlmX2dhdHRjX2dldF9nYXR0X2RifTsKZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfZ2F0dF9zZXJ2ZXIuY2MgYi9idGlmL3NyYy9idGlmX2dhdHRfc2VydmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjIwYTEwLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfZ2F0dF9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9nYXR0X3NlcnZlci5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEdBVFQgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2dhdHQiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmX2RtLmgiCi0jaW5jbHVkZSAiYnRpZl9nYXR0LmgiCi0jaW5jbHVkZSAiYnRpZl9nYXR0X3V0aWwuaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6Ok93bmVkOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIENIRUNLX0JUR0FUVF9JTklUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidF9nYXR0X2NhbGxiYWNrcyA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0dfV0FSTigiJXM6IEJUR0FUVCBub3QgaW5pdGlhbGl6ZWQiLCBfX2Z1bmNfXyk7IFwKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0dfVkVSQk9TRSgiJXMiLCBfX2Z1bmNfXyk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBjb25zdCBidGdhdHRfY2FsbGJhY2tzX3QqIGJ0X2dhdHRfY2FsbGJhY2tzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGJ0YXBwX2dhdHRzX2NvcHlfcmVxX2RhdGEodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9zcmMpIHsKLSAgdEJUQV9HQVRUUyogcF9kZXN0X2RhdGEgPSAodEJUQV9HQVRUUyopcF9kZXN0OwotICB0QlRBX0dBVFRTKiBwX3NyY19kYXRhID0gKHRCVEFfR0FUVFMqKXBfc3JjOwotCi0gIGlmICghcF9zcmNfZGF0YSB8fCAhcF9kZXN0X2RhdGEpIHJldHVybjsKLQotICAvLyBDb3B5IGJhc2ljIHN0cnVjdHVyZSBmaXJzdAotICBtYXliZV9ub25fYWxpZ25lZF9tZW1jcHkocF9kZXN0X2RhdGEsIHBfc3JjX2RhdGEsIHNpemVvZigqcF9zcmNfZGF0YSkpOwotCi0gIC8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgcmVxdWVzdCBkYXRhIGlmIG5lY2Vzc2FyeQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfR0FUVFNfUkVBRF9DSEFSQUNURVJJU1RJQ19FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVFNfUkVBRF9ERVNDUklQVE9SX0VWVDoKLSAgICBjYXNlIEJUQV9HQVRUU19XUklURV9DSEFSQUNURVJJU1RJQ19FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVFNfV1JJVEVfREVTQ1JJUFRPUl9FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVFNfRVhFQ19XUklURV9FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVFNfTVRVX0VWVDoKLSAgICAgIHBfZGVzdF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEgPQotICAgICAgICAgICh0R0FUVFNfREFUQSopb3NpX21hbGxvYyhzaXplb2YodEdBVFRTX0RBVEEpKTsKLSAgICAgIG1lbWNweShwX2Rlc3RfZGF0YS0+cmVxX2RhdGEucF9kYXRhLCBwX3NyY19kYXRhLT5yZXFfZGF0YS5wX2RhdGEsCi0gICAgICAgICAgICAgc2l6ZW9mKHRHQVRUU19EQVRBKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFwcF9nYXR0c19mcmVlX3JlcV9kYXRhKHVpbnQxNl90IGV2ZW50LCB0QlRBX0dBVFRTKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfQ0hBUkFDVEVSSVNUSUNfRVZUOgotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfREVTQ1JJUFRPUl9FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVFNfV1JJVEVfQ0hBUkFDVEVSSVNUSUNfRVZUOgotICAgIGNhc2UgQlRBX0dBVFRTX1dSSVRFX0RFU0NSSVBUT1JfRVZUOgotICAgIGNhc2UgQlRBX0dBVFRTX0VYRUNfV1JJVEVfRVZUOgotICAgIGNhc2UgQlRBX0dBVFRTX01UVV9FVlQ6Ci0gICAgICBpZiAocF9kYXRhICE9IE5VTEwpIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGFwcF9nYXR0c19oYW5kbGVfY2JhY2sodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgTE9HX1ZFUkJPU0UoIiVzOiBFdmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0KLSAgdEJUQV9HQVRUUyogcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBfcGFyYW07Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9HQVRUU19SRUdfRVZUOiB7Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+cmVnaXN0ZXJfc2VydmVyX2NiLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVnX29wZXIuc3RhdHVzLCBwX2RhdGEtPnJlZ19vcGVyLnNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlZ19vcGVyLnV1aWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfREVSRUdfRVZUOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19DT05ORUNUX0VWVDogewotICAgICAgYnRpZl9nYXR0X2NoZWNrX2VuY3J5cHRlZF9saW5rKHBfZGF0YS0+Y29ubi5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+Y29ubi50cmFuc3BvcnQpOwotCi0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+Y29ubmVjdGlvbl9jYiwgcF9kYXRhLT5jb25uLmNvbm5faWQsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jb25uLnNlcnZlcl9pZiwgdHJ1ZSwgcF9kYXRhLT5jb25uLnJlbW90ZV9iZGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfRElTQ09OTkVDVF9FVlQ6IHsKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5jb25uZWN0aW9uX2NiLCBwX2RhdGEtPmNvbm4uY29ubl9pZCwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm4uc2VydmVyX2lmLCBmYWxzZSwgcF9kYXRhLT5jb25uLnJlbW90ZV9iZGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfU1RPUF9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+c2VydmljZV9zdG9wcGVkX2NiLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+c3J2Y19vcGVyLnN0YXR1cywgcF9kYXRhLT5zcnZjX29wZXIuc2VydmVyX2lmLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+c3J2Y19vcGVyLnNlcnZpY2VfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19ERUxFTFRFX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5zZXJ2aWNlX2RlbGV0ZWRfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5zcnZjX29wZXIuc3RhdHVzLCBwX2RhdGEtPnNydmNfb3Blci5zZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5zcnZjX29wZXIuc2VydmljZV9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfQ0hBUkFDVEVSSVNUSUNfRVZUOiB7Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+cmVxdWVzdF9yZWFkX2NoYXJhY3RlcmlzdGljX2NiLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEuY29ubl9pZCwgcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZCwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLnJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEub2Zmc2V0LAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5pc19sb25nKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfREVTQ1JJUFRPUl9FVlQ6IHsKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5yZXF1ZXN0X3JlYWRfZGVzY3JpcHRvcl9jYiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQsIHBfZGF0YS0+cmVxX2RhdGEudHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLm9mZnNldCwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaXNfbG9uZyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19XUklURV9DSEFSQUNURVJJU1RJQ19FVlQ6IHsKLSAgICAgIGNvbnN0IGF1dG8mIHJlcSA9IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT53cml0ZV9yZXE7Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+cmVxdWVzdF93cml0ZV9jaGFyYWN0ZXJpc3RpY19jYiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQsIHBfZGF0YS0+cmVxX2RhdGEudHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5yZW1vdGVfYmRhLCByZXEuaGFuZGxlLCByZXEub2Zmc2V0LAotICAgICAgICAgICAgICAgIHJlcS5uZWVkX3JzcCwgcmVxLmlzX3ByZXAsIHJlcS52YWx1ZSwgcmVxLmxlbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19XUklURV9ERVNDUklQVE9SX0VWVDogewotICAgICAgY29uc3QgYXV0byYgcmVxID0gcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPndyaXRlX3JlcTsKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5yZXF1ZXN0X3dyaXRlX2Rlc2NyaXB0b3JfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkLCBwX2RhdGEtPnJlcV9kYXRhLnRyYW5zX2lkLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEucmVtb3RlX2JkYSwgcmVxLmhhbmRsZSwgcmVxLm9mZnNldCwKLSAgICAgICAgICAgICAgICByZXEubmVlZF9yc3AsIHJlcS5pc19wcmVwLCByZXEudmFsdWUsIHJlcS5sZW4pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfRVhFQ19XUklURV9FVlQ6IHsKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5yZXF1ZXN0X2V4ZWNfd3JpdGVfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkLCBwX2RhdGEtPnJlcV9kYXRhLnRyYW5zX2lkLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+ZXhlY193cml0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19DT05GX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5pbmRpY2F0aW9uX3NlbnRfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkLCBwX2RhdGEtPnJlcV9kYXRhLnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTkdFU1RfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBzZXJ2ZXItPmNvbmdlc3Rpb25fY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jb25nZXN0LmNvbm5faWQsIHBfZGF0YS0+Y29uZ2VzdC5jb25nZXN0ZWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19NVFVfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBzZXJ2ZXItPm10dV9jaGFuZ2VkX2NiLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEuY29ubl9pZCwgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPm10dSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX09QRU5fRVZUOgotICAgIGNhc2UgQlRBX0dBVFRTX0NBTkNFTF9PUEVOX0VWVDoKLSAgICBjYXNlIEJUQV9HQVRUU19DTE9TRV9FVlQ6Ci0gICAgICBMT0dfSU5GTygiJXM6IEVtcHR5IGV2ZW50ICglZCkhIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVFNfUEhZX1VQREFURV9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+cGh5X3VwZGF0ZWRfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5waHlfdXBkYXRlLmNvbm5faWQsIHBfZGF0YS0+cGh5X3VwZGF0ZS50eF9waHksCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5waHlfdXBkYXRlLnJ4X3BoeSwgcF9kYXRhLT5waHlfdXBkYXRlLnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTk5fVVBEQVRFX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9nYXR0X2NhbGxiYWNrcywgc2VydmVyLT5jb25uX3VwZGF0ZWRfY2IsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jb25uX3VwZGF0ZS5jb25uX2lkLCBwX2RhdGEtPmNvbm5fdXBkYXRlLmludGVydmFsLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+Y29ubl91cGRhdGUubGF0ZW5jeSwgcF9kYXRhLT5jb25uX3VwZGF0ZS50aW1lb3V0LAotICAgICAgICAgICAgICAgIHBfZGF0YS0+Y29ubl91cGRhdGUuc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiJXM6IFVuaGFuZGxlZCBldmVudCAoJWQpISIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGJ0YXBwX2dhdHRzX2ZyZWVfcmVxX2RhdGEoZXZlbnQsIHBfZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YXBwX2dhdHRzX2NiYWNrKHRCVEFfR0FUVFNfRVZUIGV2ZW50LCB0QlRBX0dBVFRTKiBwX2RhdGEpIHsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotICBzdGF0dXMgPSBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRhcHBfZ2F0dHNfaGFuZGxlX2NiYWNrLCAodWludDE2X3QpZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcF9kYXRhLCBzaXplb2YodEJUQV9HQVRUUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFwcF9nYXR0c19jb3B5X3JlcV9kYXRhKTsKLSAgQVNTRVJUQyhzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJDb250ZXh0IHRyYW5zZmVyIGZhaWxlZCEiLCBzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFNlcnZlciBBUEkgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dHNfcmVnaXN0ZXJfYXBwKGNvbnN0IFV1aWQmIGJ0X3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlYXR0X3N1cHBvcnQpIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLQotICByZXR1cm4gZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEJpbmQoJkJUQV9HQVRUU19BcHBSZWdpc3RlciwgYnRfdXVpZCwgJmJ0YXBwX2dhdHRzX2NiYWNrLCBlYXR0X3N1cHBvcnQpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dHNfdW5yZWdpc3Rlcl9hcHAoaW50IHNlcnZlcl9pZikgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZCVEFfR0FUVFNfQXBwRGVyZWdpc3Rlciwgc2VydmVyX2lmKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfZ2F0dHNfb3Blbl9pbXBsKGludCBzZXJ2ZXJfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgaW50IHRyYW5zcG9ydF9wYXJhbSkgewotICAvLyBFbnN1cmUgZGV2aWNlIGlzIGluIGlucXVpcnkgZGF0YWJhc2UKLSAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICBpbnQgZGV2aWNlX3R5cGUgPSAwOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLQotICBpZiAoYnRpZl9nZXRfYWRkcmVzc190eXBlKGFkZHJlc3MsICZhZGRyX3R5cGUpICYmCi0gICAgICBidGlmX2dldF9kZXZpY2VfdHlwZShhZGRyZXNzLCAmZGV2aWNlX3R5cGUpICYmCi0gICAgICBkZXZpY2VfdHlwZSAhPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUikgewotICAgIEJUQV9EbUFkZEJsZURldmljZShhZGRyZXNzLCBhZGRyX3R5cGUsIGRldmljZV90eXBlKTsKLSAgfQotCi0gIC8vIERldGVybWluZSB0cmFuc3BvcnQKLSAgaWYgKHRyYW5zcG9ydF9wYXJhbSAhPSBCVF9UUkFOU1BPUlRfQVVUTykgewotICAgIHRyYW5zcG9ydCA9IHRyYW5zcG9ydF9wYXJhbTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGRldmljZV90eXBlKSB7Ci0gICAgICBjYXNlIEJUX0RFVklDRV9UWVBFX0JSRURSOgotICAgICAgICB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfQlJfRURSOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVF9ERVZJQ0VfVFlQRV9CTEU6Ci0gICAgICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRfREVWSUNFX1RZUEVfRFVNTzoKLSAgICAgICAgaWYgKHRyYW5zcG9ydF9wYXJhbSA9PSBCVF9UUkFOU1BPUlRfTEUpCi0gICAgICAgICAgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0xFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29ubmVjdCEKLSAgQlRBX0dBVFRTX09wZW4oc2VydmVyX2lmLCBhZGRyZXNzLCBpc19kaXJlY3QsIHRyYW5zcG9ydCk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2dhdHRzX29wZW4oaW50IHNlcnZlcl9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGludCB0cmFuc3BvcnQpIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBCaW5kKCZidGlmX2dhdHRzX29wZW5faW1wbCwgc2VydmVyX2lmLCBiZF9hZGRyLCBpc19kaXJlY3QsIHRyYW5zcG9ydCkpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2dhdHRzX2Nsb3NlX2ltcGwoaW50IHNlcnZlcl9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCkgewotICAvLyBDbG9zZSBhY3RpdmUgY29ubmVjdGlvbgotICBpZiAoY29ubl9pZCAhPSAwKQotICAgIEJUQV9HQVRUU19DbG9zZShjb25uX2lkKTsKLSAgZWxzZQotICAgIEJUQV9HQVRUU19DYW5jZWxPcGVuKHNlcnZlcl9pZiwgYWRkcmVzcywgdHJ1ZSk7Ci0KLSAgLy8gQ2FuY2VsIHBlbmRpbmcgYmFja2dyb3VuZCBjb25uZWN0aW9ucwotICBCVEFfR0FUVFNfQ2FuY2VsT3BlbihzZXJ2ZXJfaWYsIGFkZHJlc3MsIGZhbHNlKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dHNfY2xvc2UoaW50IHNlcnZlcl9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgQmluZCgmYnRpZl9nYXR0c19jbG9zZV9pbXBsLCBzZXJ2ZXJfaWYsIGJkX2FkZHIsIGNvbm5faWQpKTsKLX0KLQotc3RhdGljIHZvaWQgb25fc2VydmljZV9hZGRlZF9jYih0R0FUVF9TVEFUVVMgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSkgewotICBIQUxfQ0JBQ0soYnRfZ2F0dF9jYWxsYmFja3MsIHNlcnZlci0+c2VydmljZV9hZGRlZF9jYiwgc3RhdHVzLCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICBzZXJ2aWNlLmRhdGEoKSwgc2VydmljZS5zaXplKCkpOwotfQotCi1zdGF0aWMgdm9pZCBhZGRfc2VydmljZV9pbXBsKGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlKSB7Ci0gIC8vIFRPRE8oanBhd2xvd3NraSk6IGJ0aWYgc2hvdWxkIGJlIGEgcGFzcyB0aHJvdWdoIGxheWVyLCBhbmQgbm8gY2hlY2tzIHNob3VsZAotICAvLyBiZSBtYWRlIGhlcmUuIFRoaXMgZXhjZXB0aW9uIGlzIGFkZGVkIG9ubHkgdW50aWwgR0FUVCBzZXJ2ZXIgY29kZSBpcwotICAvLyByZWZhY3RvcmVkLCBhbmQgb25lIGNhbiBkaXN0aW5ndWlzaCBzdGFjay1pbnRlcm5hbCBhcHMgZnJvbSBleHRlcm5hbCBhcHBzCi0gIGlmIChzZXJ2aWNlWzBdLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSKSB8fAotICAgICAgc2VydmljZVswXS51dWlkID09IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVBfU0VSVkVSKSkgewotICAgIExPR19FUlJPUigiJXM6IEF0dGVwdCB0byByZWdpc3RlciByZXN0cmljdGVkIHNlcnZpY2UiLCBfX2Z1bmNfXyk7Ci0gICAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBzZXJ2ZXItPnNlcnZpY2VfYWRkZWRfY2IsIEJUX1NUQVRVU19GQUlMLAotICAgICAgICAgICAgICBzZXJ2ZXJfaWYsIHNlcnZpY2UuZGF0YSgpLCBzZXJ2aWNlLnNpemUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRBX0dBVFRTX0FkZFNlcnZpY2UoCi0gICAgICBzZXJ2ZXJfaWYsIHNlcnZpY2UsCi0gICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZvbl9zZXJ2aWNlX2FkZGVkX2NiKSkpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0c19hZGRfc2VydmljZShpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X2RiX2VsZW1lbnRfdCogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZXJ2aWNlX2NvdW50KSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZCgmYWRkX3NlcnZpY2VfaW1wbCwgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yKHNlcnZpY2UsIHNlcnZpY2UgKyBzZXJ2aWNlX2NvdW50KSkpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0c19zdG9wX3NlcnZpY2UoaW50IHNlcnZlcl9pZiwgaW50IHNlcnZpY2VfaGFuZGxlKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIHJldHVybiBkb19pbl9qbmlfdGhyZWFkKEJpbmQoJkJUQV9HQVRUU19TdG9wU2VydmljZSwgc2VydmljZV9oYW5kbGUpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dHNfZGVsZXRlX3NlcnZpY2UoaW50IHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlX2hhbmRsZSkgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZCVEFfR0FUVFNfRGVsZXRlU2VydmljZSwgc2VydmljZV9oYW5kbGUpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfZ2F0dHNfc2VuZF9pbmRpY2F0aW9uKGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZV9oYW5kbGUsIGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25maXJtLCBjb25zdCB1aW50OF90KiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0KLSAgaWYgKGxlbmd0aCA+IEJUR0FUVF9NQVhfQVRUUl9MRU4pIGxlbmd0aCA9IEJUR0FUVF9NQVhfQVRUUl9MRU47Ci0KLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoQmluZCgmQlRBX0dBVFRTX0hhbmRsZVZhbHVlSW5kaWNhdGlvbiwgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yKHZhbHVlLCB2YWx1ZSArIGxlbmd0aCksIGNvbmZpcm0pKTsKLSAgLy8gVE9ETzogTWlnaHQgbmVlZCB0byBzZW5kIGFuIEFDSyBpZiBoYW5kbGUgdmFsdWUgaW5kaWNhdGlvbiBpcwotICAvLyAgICAgICBpbnZva2VkIHdpdGhvdXQgbmVlZCBmb3IgY29uZmlybWF0aW9uLgotfQotCi1zdGF0aWMgdm9pZCBidGlmX2dhdHRzX3NlbmRfcmVzcG9uc2VfaW1wbChpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRnYXR0X3Jlc3BvbnNlX3QgcmVzcG9uc2UpIHsKLSAgdEdBVFRTX1JTUCByc3Bfc3RydWN0OwotICBidGlmX3RvX2J0YV9yZXNwb25zZSgmcnNwX3N0cnVjdCwgJnJlc3BvbnNlKTsKLQotICBCVEFfR0FUVFNfU2VuZFJzcChjb25uX2lkLCB0cmFuc19pZCwgc3RhdGljX2Nhc3Q8dEdBVFRfU1RBVFVTPihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAmcnNwX3N0cnVjdCk7Ci0KLSAgSEFMX0NCQUNLKGJ0X2dhdHRfY2FsbGJhY2tzLCBzZXJ2ZXItPnJlc3BvbnNlX2NvbmZpcm1hdGlvbl9jYiwgMCwKLSAgICAgICAgICAgIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5oYW5kbGUpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0c19zZW5kX3Jlc3BvbnNlKGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0Z2F0dF9yZXNwb25zZV90JiByZXNwb25zZSkgewotICBDSEVDS19CVEdBVFRfSU5JVCgpOwotICByZXR1cm4gZG9faW5fam5pX3RocmVhZChCaW5kKCZidGlmX2dhdHRzX3NlbmRfcmVzcG9uc2VfaW1wbCwgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc19pZCwgc3RhdHVzLCByZXNwb25zZSkpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0c19zZXRfcHJlZmVycmVkX3BoeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGh5X29wdGlvbnMpIHsKLSAgQ0hFQ0tfQlRHQVRUX0lOSVQoKTsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBCaW5kKCZCVE1fQmxlU2V0UGh5LCBiZF9hZGRyLCB0eF9waHksIHJ4X3BoeSwgcGh5X29wdGlvbnMpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9nYXR0c19yZWFkX3BoeSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+IGNiKSB7Ci0gIENIRUNLX0JUR0FUVF9JTklUKCk7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQlRNX0JsZVJlYWRQaHksIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLCBjYikpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1jb25zdCBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90IGJ0Z2F0dFNlcnZlckludGVyZmFjZSA9IHsKLSAgICBidGlmX2dhdHRzX3JlZ2lzdGVyX2FwcCwgICBidGlmX2dhdHRzX3VucmVnaXN0ZXJfYXBwLAotICAgIGJ0aWZfZ2F0dHNfb3BlbiwgICAgICAgICAgIGJ0aWZfZ2F0dHNfY2xvc2UsCi0gICAgYnRpZl9nYXR0c19hZGRfc2VydmljZSwgICAgYnRpZl9nYXR0c19zdG9wX3NlcnZpY2UsCi0gICAgYnRpZl9nYXR0c19kZWxldGVfc2VydmljZSwgYnRpZl9nYXR0c19zZW5kX2luZGljYXRpb24sCi0gICAgYnRpZl9nYXR0c19zZW5kX3Jlc3BvbnNlLCAgYnRpZl9nYXR0c19zZXRfcHJlZmVycmVkX3BoeSwKLSAgICBidGlmX2dhdHRzX3JlYWRfcGh5fTsKZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfZ2F0dF90ZXN0LmNjIGIvYnRpZi9zcmMvYnRpZl9nYXR0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDM4NDQuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9nYXR0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2dhdHQiCi0KLSNpbmNsdWRlICJidGlmX2dhdHQuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfZ2F0dC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGVfYXBwbC5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9kbS5oIgotI2luY2x1ZGUgImJ0aWZfZ2F0dF91dGlsLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUeXBlZGVmcyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9JRiBnYXR0X2lmOwotICB1aW50MTZfdCBjb25uX2lkOwotfSBidGlmX3Rlc3RfY2JfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjb25zdCBjaGFyKiBkaXNjX25hbWVbR0FUVF9ESVNDX01BWF0gPSB7IlVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FUVF9ESVNDX1NSVkNfQUxMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdBVFRfRElTQ19TUlZDX0JZX1VVSUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FUVF9ESVNDX0lOQ19TUlZDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdBVFRfRElTQ19DSEFSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdBVFRfRElTQ19DSEFSX0RTQ1BUIn07Ci0KLXN0YXRpYyBidGlmX3Rlc3RfY2JfdCB0ZXN0X2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2FsbGJhY2sgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBidGlmX3Rlc3RfY29ubmVjdF9jYmFjayh0R0FUVF9JRiwgY29uc3QgUmF3QWRkcmVzcyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NPTk5fUkVBU09OLCB0QlRfVFJBTlNQT1JUKSB7Ci0gIExPR19JTkZPKCIlczogY29ubl9pZD0lZCwgY29ubmVjdGVkPSVkIiwgX19mdW5jX18sIGNvbm5faWQsIGNvbm5lY3RlZCk7Ci0gIHRlc3RfY2IuY29ubl9pZCA9IGNvbm5lY3RlZCA/IGNvbm5faWQgOiAwOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX3Rlc3RfY29tbWFuZF9jb21wbGV0ZV9jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NMX0NPTVBMRVRFKiBwX2RhdGEpIHsKLSAgTE9HX0lORk8oIiVzOiBvcF9jb2RlPTB4JTAyeCwgY29ubl9pZD0weCV4LiBzdGF0dXM9MHgleCIsIF9fZnVuY19fLCBvcCwKLSAgICAgICAgICAgY29ubl9pZCwgc3RhdHVzKTsKLQotICBzd2l0Y2ggKG9wKSB7Ci0gICAgY2FzZSBHQVRUQ19PUFRZUEVfUkVBRDoKLSAgICBjYXNlIEdBVFRDX09QVFlQRV9XUklURToKLSAgICBjYXNlIEdBVFRDX09QVFlQRV9DT05GSUc6Ci0gICAgY2FzZSBHQVRUQ19PUFRZUEVfRVhFX1dSSVRFOgotICAgIGNhc2UgR0FUVENfT1BUWVBFX05PVElGSUNBVElPTjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUQ19PUFRZUEVfSU5ESUNBVElPTjoKLSAgICAgIEdBVFRDX1NlbmRIYW5kbGVWYWx1ZUNvbmZpcm0oY29ubl9pZCwgcF9kYXRhLT5jaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0lORk8oIiVzOiBVbmtub3duIG9wX2NvZGUgKDB4JTAyeCkiLCBfX2Z1bmNfXywgb3ApOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl90ZXN0X2Rpc2NvdmVyeV9yZXN1bHRfY2JhY2soVU5VU0VEX0FUVFIgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDX1JFUyogcF9kYXRhKSB7Ci0gIExPR19JTkZPKCItLS0tLS0gR0FUVCBEaXNjb3ZlcnkgcmVzdWx0ICUtMjJzIC0tLS0tLS0iLCBkaXNjX25hbWVbZGlzY190eXBlXSk7Ci0gIExPR19JTkZPKCIgICAgICBBdHRyaWJ1dGUgaGFuZGxlOiAweCUwNHggKCVkKSIsIHBfZGF0YS0+aGFuZGxlLAotICAgICAgICAgICBwX2RhdGEtPmhhbmRsZSk7Ci0KLSAgaWYgKGRpc2NfdHlwZSAhPSBHQVRUX0RJU0NfQ0hBUl9EU0NQVCkgewotICAgIExPR19JTkZPKCIgICAgICAgIEF0dHJpYnV0ZSB0eXBlOiAlcyIsIHBfZGF0YS0+dHlwZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci0KLSAgc3dpdGNoIChkaXNjX3R5cGUpIHsKLSAgICBjYXNlIEdBVFRfRElTQ19TUlZDX0FMTDoKLSAgICAgIExPR19JTkZPKCIgICAgICAgICAgSGFuZGxlIHJhbmdlOiAweCUwNHggfiAweCUwNHggKCVkIH4gJWQpIiwKLSAgICAgICAgICAgICAgIHBfZGF0YS0+aGFuZGxlLCBwX2RhdGEtPnZhbHVlLmdyb3VwX3ZhbHVlLmVfaGFuZGxlLAotICAgICAgICAgICAgICAgcF9kYXRhLT5oYW5kbGUsIHBfZGF0YS0+dmFsdWUuZ3JvdXBfdmFsdWUuZV9oYW5kbGUpOwotICAgICAgTE9HX0lORk8oIiAgICAgICAgICBTZXJ2aWNlIFVVSUQ6ICVzIiwKLSAgICAgICAgICAgICAgIHBfZGF0YS0+dmFsdWUuZ3JvdXBfdmFsdWUuc2VydmljZV90eXBlLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9ESVNDX1NSVkNfQllfVVVJRDoKLSAgICAgIExPR19JTkZPKCIgICAgICAgICAgSGFuZGxlIHJhbmdlOiAweCUwNHggfiAweCUwNHggKCVkIH4gJWQpIiwKLSAgICAgICAgICAgICAgIHBfZGF0YS0+aGFuZGxlLCBwX2RhdGEtPnZhbHVlLmhhbmRsZSwgcF9kYXRhLT5oYW5kbGUsCi0gICAgICAgICAgICAgICBwX2RhdGEtPnZhbHVlLmhhbmRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9ESVNDX0lOQ19TUlZDOgotICAgICAgTE9HX0lORk8oIiAgICAgICAgICBIYW5kbGUgcmFuZ2U6IDB4JTA0eCB+IDB4JTA0eCAoJWQgfiAlZCkiLAotICAgICAgICAgICAgICAgcF9kYXRhLT52YWx1ZS5pbmNsX3NlcnZpY2Uuc19oYW5kbGUsCi0gICAgICAgICAgICAgICBwX2RhdGEtPnZhbHVlLmluY2xfc2VydmljZS5lX2hhbmRsZSwKLSAgICAgICAgICAgICAgIHBfZGF0YS0+dmFsdWUuaW5jbF9zZXJ2aWNlLnNfaGFuZGxlLAotICAgICAgICAgICAgICAgcF9kYXRhLT52YWx1ZS5pbmNsX3NlcnZpY2UuZV9oYW5kbGUpOwotICAgICAgTE9HX0lORk8oIiAgICAgICAgICBTZXJ2aWNlIFVVSUQ6ICVzIiwKLSAgICAgICAgICAgICAgIHBfZGF0YS0+dmFsdWUuaW5jbF9zZXJ2aWNlLnNlcnZpY2VfdHlwZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19DSEFSOgotICAgICAgTE9HX0lORk8oIiAgICAgICAgICAgIFByb3BlcnRpZXM6IDB4JTAyeCIsCi0gICAgICAgICAgICAgICBwX2RhdGEtPnZhbHVlLmRjbHJfdmFsdWUuY2hhcl9wcm9wKTsKLSAgICAgIExPR19JTkZPKCIgICBDaGFyYWN0ZXJpc3RpYyBVVUlEOiAlcyIsCi0gICAgICAgICAgICAgICBwX2RhdGEtPnZhbHVlLmRjbHJfdmFsdWUuY2hhcl91dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9ESVNDX0NIQVJfRFNDUFQ6Ci0gICAgICBMT0dfSU5GTygiICAgICAgIERlc2NyaXB0b3IgVVVJRDogJXMiLCBwX2RhdGEtPnR5cGUuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR0FUVF9ESVNDX01BWDoKLSAgICAgIExPR19FUlJPUigiICAgICAgVW5rbm93biBkaXNjb3ZlcnkgaXRlbSIpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfSU5GTygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl90ZXN0X2Rpc2NvdmVyeV9jb21wbGV0ZV9jYmFjaygKLSAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBjb25uX2lkLCBVTlVTRURfQVRUUiB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLAotICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLX0KLQotc3RhdGljIHRHQVRUX0NCQUNLIGJ0aWZfdGVzdF9jYWxsYmFja3MgPSB7YnRpZl90ZXN0X2Nvbm5lY3RfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3Rlc3RfY29tbWFuZF9jb21wbGV0ZV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfdGVzdF9kaXNjb3ZlcnlfcmVzdWx0X2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl90ZXN0X2Rpc2NvdmVyeV9jb21wbGV0ZV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1idF9zdGF0dXNfdCBidGlmX2dhdHRjX3Rlc3RfY29tbWFuZF9pbXBsKGludCBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidGdhdHRfdGVzdF9wYXJhbXNfdCogcGFyYW1zKSB7Ci0gIHN3aXRjaCAoY29tbWFuZCkgewotICAgIGNhc2UgMHgwMTogLyogRW5hYmxlICovCi0gICAgewotICAgICAgTE9HX0lORk8oIiVzOiBFTkFCTEUgLSBlbmFibGU9JWQiLCBfX2Z1bmNfXywgcGFyYW1zLT51MSk7Ci0gICAgICBpZiAocGFyYW1zLT51MSkgewotICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIFV1aWQ6OmtOdW1CeXRlczEyOD4gdG1wOwotICAgICAgICB0bXAuZmlsbCgweEFFKTsKLSAgICAgICAgdGVzdF9jYi5nYXR0X2lmID0KLSAgICAgICAgICAgIEdBVFRfUmVnaXN0ZXIoYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTI4Qml0QkUodG1wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoIkdhdHRUZXN0IiksICZidGlmX3Rlc3RfY2FsbGJhY2tzLCBmYWxzZSk7Ci0gICAgICAgIEdBVFRfU3RhcnRJZih0ZXN0X2NiLmdhdHRfaWYpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR0FUVF9EZXJlZ2lzdGVyKHRlc3RfY2IuZ2F0dF9pZik7Ci0gICAgICAgIHRlc3RfY2IuZ2F0dF9pZiA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIDB4MDI6IC8qIENvbm5lY3QgKi8KLSAgICB7Ci0gICAgICBMT0dfSU5GTygiJXM6IENPTk5FQ1QgLSBkZXZpY2U9JXMgKGRldl90eXBlPSVkLCBhZGRyX3R5cGU9JWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICBwYXJhbXMtPmJkYTEtPlRvU3RyaW5nKCkuY19zdHIoKSwgcGFyYW1zLT51MSwgcGFyYW1zLT51Mik7Ci0KLSAgICAgIGlmIChwYXJhbXMtPnUxID09IEJUX0RFVklDRV9UWVBFX0JMRSkKLSAgICAgICAgQlRNX1NlY0FkZEJsZURldmljZSgqcGFyYW1zLT5iZGExLCBCVF9ERVZJQ0VfVFlQRV9CTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KHBhcmFtcy0+dTIpKTsKLQotICAgICAgaWYgKCFHQVRUX0Nvbm5lY3QodGVzdF9jYi5nYXR0X2lmLCAqcGFyYW1zLT5iZGExLCB0cnVlLCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCIlczogR0FUVF9Db25uZWN0IGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIDB4MDM6IC8qIERpc2Nvbm5lY3QgKi8KLSAgICB7Ci0gICAgICBMT0dfSU5GTygiJXM6IERJU0NPTk5FQ1QgLSBjb25uX2lkPSVkIiwgX19mdW5jX18sIHRlc3RfY2IuY29ubl9pZCk7Ci0gICAgICBHQVRUX0Rpc2Nvbm5lY3QodGVzdF9jYi5jb25uX2lkKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgMHgwNDogLyogRGlzY292ZXIgKi8KLSAgICB7Ci0gICAgICBpZiAocGFyYW1zLT51MSA+PSBHQVRUX0RJU0NfTUFYKSB7Ci0gICAgICAgIExPR19FUlJPUigiJXM6IERJU0NPVkVSIC0gSW52YWxpZCB0eXBlICglZCkhIiwgX19mdW5jX18sIHBhcmFtcy0+dTEpOwotICAgICAgICByZXR1cm4gKGJ0X3N0YXR1c190KTA7Ci0gICAgICB9Ci0KLSAgICAgIExPR19JTkZPKCIlczogRElTQ09WRVIgKCVzKSwgY29ubl9pZD0lZCwgdXVpZD0lcywgaGFuZGxlcz0weCUwNHgtMHglMDR4IiwKLSAgICAgICAgICAgICAgIF9fZnVuY19fLCBkaXNjX25hbWVbcGFyYW1zLT51MV0sIHRlc3RfY2IuY29ubl9pZCwKLSAgICAgICAgICAgICAgIHBhcmFtcy0+dXVpZDEtPlRvU3RyaW5nKCkuY19zdHIoKSwgcGFyYW1zLT51MiwgcGFyYW1zLT51Myk7Ci0gICAgICBHQVRUQ19EaXNjb3Zlcih0ZXN0X2NiLmNvbm5faWQsIHN0YXRpY19jYXN0PHRHQVRUX0RJU0NfVFlQRT4ocGFyYW1zLT51MSksCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnUyLCBwYXJhbXMtPnUzLCAqcGFyYW1zLT51dWlkMSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIDB4RjA6IC8qIFBhaXJpbmcgY29uZmlndXJhdGlvbiAqLwotICAgICAgTE9HX0lORk8oIiVzOiBTZXR0aW5nIHBhaXJpbmcgY29uZmlnIGF1dGg9JWQsIGlvY2Fwcz0lZCwga2V5cz0lZC8lZC8lZCIsCi0gICAgICAgICAgICAgICBfX2Z1bmNfXywgcGFyYW1zLT51MSwgcGFyYW1zLT51MiwgcGFyYW1zLT51MywgcGFyYW1zLT51NCwKLSAgICAgICAgICAgICAgIHBhcmFtcy0+dTUpOwotCi0gICAgICBidGVfYXBwbF9jZmcuYmxlX2F1dGhfcmVxID0gcGFyYW1zLT51MTsKLSAgICAgIGJ0ZV9hcHBsX2NmZy5ibGVfaW9fY2FwID0gcGFyYW1zLT51MjsKLSAgICAgIGJ0ZV9hcHBsX2NmZy5ibGVfaW5pdF9rZXkgPSBwYXJhbXMtPnUzOwotICAgICAgYnRlX2FwcGxfY2ZnLmJsZV9yZXNwX2tleSA9IHBhcmFtcy0+dTQ7Ci0gICAgICBidGVfYXBwbF9jZmcuYmxlX21heF9rZXlfc2l6ZSA9IHBhcmFtcy0+dTU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIiVzOiBVTktOT1dOIFRFU1QgQ09NTUFORCAweCUwMngiLCBfX2Z1bmNfXywgY29tbWFuZCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gKGJ0X3N0YXR1c190KTA7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2dhdHRfdXRpbC5jYyBiL2J0aWYvc3JjL2J0aWZfZ2F0dF91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTBjNDMxLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfZ2F0dF91dGlsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9nYXR0IgotCi0jaW5jbHVkZSAiYnRpZl9nYXR0X3V0aWwuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfZ2F0dC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2p2X2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmX2RtLmgiCi0jaW5jbHVkZSAiYnRpZl9nYXR0LmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJUSUYgLT4gQlRBIGNvbnZlcnNpb24gZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX3RvX2J0YV9yZXNwb25zZSh0R0FUVFNfUlNQKiBwX2Rlc3QsIGJ0Z2F0dF9yZXNwb25zZV90KiBwX3NyYykgewotICBwX2Rlc3QtPmF0dHJfdmFsdWUuYXV0aF9yZXEgPSBwX3NyYy0+YXR0cl92YWx1ZS5hdXRoX3JlcTsKLSAgcF9kZXN0LT5hdHRyX3ZhbHVlLmhhbmRsZSA9IHBfc3JjLT5hdHRyX3ZhbHVlLmhhbmRsZTsKLSAgcF9kZXN0LT5hdHRyX3ZhbHVlLmxlbiA9IHBfc3JjLT5hdHRyX3ZhbHVlLmxlbjsKLSAgcF9kZXN0LT5hdHRyX3ZhbHVlLm9mZnNldCA9IHBfc3JjLT5hdHRyX3ZhbHVlLm9mZnNldDsKLSAgbWVtY3B5KHBfZGVzdC0+YXR0cl92YWx1ZS52YWx1ZSwgcF9zcmMtPmF0dHJfdmFsdWUudmFsdWUsIEdBVFRfTUFYX0FUVFJfTEVOKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVuY3J5cHRlZCBsaW5rIG1hcCBoYW5kbGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgYnRpZl9nYXR0X2lzX2xpbmtfZW5jcnlwdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcmV0dXJuIEJUTV9Jc0VuY3J5cHRlZChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKSB8fAotICAgICAgICAgQlRNX0lzRW5jcnlwdGVkKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfZ2F0dF9zZXRfZW5jcnlwdGlvbl9jYihVTlVTRURfQVRUUiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfU1RBVFVTIHJlc3VsdCkgewotICBpZiAocmVzdWx0ICE9IEJUQV9TVUNDRVNTICYmIHJlc3VsdCAhPSBCVEFfQlVTWSkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXMoKSAtIEVuY3J5cHRpb24gZmFpbGVkICglZCkiLCBfX2Z1bmNfXywgcmVzdWx0KTsKLSAgfQotfQotCi12b2lkIGJ0aWZfZ2F0dF9jaGVja19lbmNyeXB0ZWRfbGluayhSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydF9saW5rKSB7Ci0gIHRCVE1fTEVfUEVOQ19LRVlTIGtleTsKLSAgaWYgKChidGlmX3N0b3JhZ2VfZ2V0X2JsZV9ib25kaW5nX2tleSgKLSAgICAgICAgICAgYmRfYWRkciwgQlRNX0xFX0tFWV9QRU5DLCAodWludDhfdCopJmtleSwKLSAgICAgICAgICAgc2l6ZW9mKHRCVE1fTEVfUEVOQ19LRVlTKSkgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpICYmCi0gICAgICAhYnRpZl9nYXR0X2lzX2xpbmtfZW5jcnlwdGVkKGJkX2FkZHIpKSB7Ci0gICAgTE9HX0RFQlVHKCJDaGVja2luZyBnYXR0IGxpbmsgcGVlcjolcyB0cmFuc3BvcnQ6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksCi0gICAgICAgICAgICAgIGJ0X3RyYW5zcG9ydF90ZXh0KHRyYW5zcG9ydF9saW5rKS5jX3N0cigpKTsKLSAgICBCVEFfRG1TZXRFbmNyeXB0aW9uKGJkX2FkZHIsIHRyYW5zcG9ydF9saW5rLCAmYnRpZl9nYXR0X3NldF9lbmNyeXB0aW9uX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9TRUNfRU5DUllQVCk7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2dhdHRfbW92ZV90cmFja19hZHZfZGF0YShidGdhdHRfdHJhY2tfYWR2X2luZm9fdCogcF9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGdhdHRfdHJhY2tfYWR2X2luZm9fdCogcF9zcmMpIHsKLSAgbWVtc2V0KHBfZGVzdCwgMCwgc2l6ZW9mKGJ0Z2F0dF90cmFja19hZHZfaW5mb190KSk7Ci0KLSAgbWVtY3B5KHBfZGVzdCwgcF9zcmMsIHNpemVvZihidGdhdHRfdHJhY2tfYWR2X2luZm9fdCkpOwotCi0gIGlmIChwX3NyYy0+YWR2X3BrdF9sZW4gPiAwKSB7Ci0gICAgcF9kZXN0LT5wX2Fkdl9wa3RfZGF0YSA9ICh1aW50OF90Kilvc2lfbWFsbG9jKHBfc3JjLT5hZHZfcGt0X2xlbik7Ci0gICAgbWVtY3B5KHBfZGVzdC0+cF9hZHZfcGt0X2RhdGEsIHBfc3JjLT5wX2Fkdl9wa3RfZGF0YSwgcF9zcmMtPmFkdl9wa3RfbGVuKTsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9zcmMtPnBfYWR2X3BrdF9kYXRhKTsKLSAgfQotCi0gIGlmIChwX3NyYy0+c2Nhbl9yc3BfbGVuID4gMCkgewotICAgIHBfZGVzdC0+cF9zY2FuX3JzcF9kYXRhID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MocF9zcmMtPnNjYW5fcnNwX2xlbik7Ci0gICAgbWVtY3B5KHBfZGVzdC0+cF9zY2FuX3JzcF9kYXRhLCBwX3NyYy0+cF9zY2FuX3JzcF9kYXRhLAotICAgICAgICAgICBwX3NyYy0+c2Nhbl9yc3BfbGVuKTsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9zcmMtPnBfc2Nhbl9yc3BfZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfaGQuY2MgYi9idGlmL3NyYy9idGlmX2hkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDNhMmVkLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfaGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9oZC5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEhJRCBEZXZpY2UgUHJvZmlsZSBCbHVldG9vdGggSW50ZXJmYWNlCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTE9HX1RBRyAiQlRJRl9IRCIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIgIC8vIE11c3QgYmUgZmlyc3QgdG8gZGVmaW5lIGJ1aWxkIGNvbmZpZ3VyYXRpb24KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZF9hcGkuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9oZC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9oZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgQlRJRl9IRF9BUFBfTkFNRV9MRU4gNTAKLSNkZWZpbmUgQlRJRl9IRF9BUFBfREVTQ1JJUFRJT05fTEVOIDUwCi0jZGVmaW5lIEJUSUZfSERfQVBQX1BST1ZJREVSX0xFTiA1MAotI2RlZmluZSBCVElGX0hEX0FQUF9ERVNDUklQVE9SX0xFTiAyMDQ4Ci0KLSNkZWZpbmUgQ09EX0hJRF9LRVlCT0FSRCAweDA1NDAKLSNkZWZpbmUgQ09EX0hJRF9QT0lOVElORyAweDA1ODAKLSNkZWZpbmUgQ09EX0hJRF9DT01CTyAweDA1QzAKLSNkZWZpbmUgQ09EX0hJRF9NQUpPUiAweDA1MDAKLQotZXh0ZXJuIGJvb2wgYnRhX2RtX2NoZWNrX2lmX29ubHlfaGRfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci1leHRlcm4gYm9vbCBjaGVja19jb2RfaGlkKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZGFkZHIpOwotZXh0ZXJuIGJvb2wgY2hlY2tfY29kX2hpZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0aWZfaGhfc2VydmljZV9yZWdpc3RyYXRpb24oYm9vbCBlbmFibGUpOwotCi0vKiBIRCByZXF1ZXN0IGV2ZW50cyAqLwotdHlwZWRlZiBlbnVtIHsgQlRJRl9IRF9EVU1NWV9SRVFfRVZUID0gMCB9IGJ0aWZfaGRfcmVxX2V2dF90OwotCi1idGlmX2hkX2NiX3QgYnRpZl9oZF9jYjsKLQotc3RhdGljIGJ0aGRfY2FsbGJhY2tzX3QqIGJ0X2hkX2NhbGxiYWNrcyA9IE5VTEw7Ci1zdGF0aWMgdEJUQV9IRF9BUFBfSU5GTyBhcHBfaW5mbzsKLXN0YXRpYyB0QlRBX0hEX1FPU19JTkZPIGluX3FvczsKLXN0YXRpYyB0QlRBX0hEX1FPU19JTkZPIG91dF9xb3M7Ci0KLXN0YXRpYyB2b2lkIGludHJfZGF0YV9jb3B5X2NiKHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX2RzdCwgY2hhciogcF9zcmMpIHsKLSAgdEJUQV9IRF9JTlRSX0RBVEEqIHBfZHN0X2RhdGEgPSAodEJUQV9IRF9JTlRSX0RBVEEqKXBfZHN0OwotICB0QlRBX0hEX0lOVFJfREFUQSogcF9zcmNfZGF0YSA9ICh0QlRBX0hEX0lOVFJfREFUQSopcF9zcmM7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLQotICBpZiAoIXBfc3JjKSByZXR1cm47Ci0KLSAgaWYgKGV2ZW50ICE9IEJUQV9IRF9JTlRSX0RBVEFfRVZUKSByZXR1cm47Ci0KLSAgbWVtY3B5KHBfZHN0LCBwX3NyYywgc2l6ZW9mKHRCVEFfSERfSU5UUl9EQVRBKSk7Ci0KLSAgcF9kYXRhID0gKCh1aW50OF90KilwX2RzdF9kYXRhKSArIHNpemVvZih0QlRBX0hEX0lOVFJfREFUQSk7Ci0KLSAgbWVtY3B5KHBfZGF0YSwgcF9zcmNfZGF0YS0+cF9kYXRhLCBwX3NyY19kYXRhLT5sZW4pOwotCi0gIHBfZHN0X2RhdGEtPnBfZGF0YSA9IHBfZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3JlcG9ydF9jb3B5X2NiKHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX2RzdCwgY2hhciogcF9zcmMpIHsKLSAgdEJUQV9IRF9TRVRfUkVQT1JUKiBwX2RzdF9kYXRhID0gKHRCVEFfSERfU0VUX1JFUE9SVCopcF9kc3Q7Ci0gIHRCVEFfSERfU0VUX1JFUE9SVCogcF9zcmNfZGF0YSA9ICh0QlRBX0hEX1NFVF9SRVBPUlQqKXBfc3JjOwotICB1aW50OF90KiBwX2RhdGE7Ci0KLSAgaWYgKCFwX3NyYykgcmV0dXJuOwotCi0gIGlmIChldmVudCAhPSBCVEFfSERfU0VUX1JFUE9SVF9FVlQpIHJldHVybjsKLQotICBtZW1jcHkocF9kc3QsIHBfc3JjLCBzaXplb2YodEJUQV9IRF9TRVRfUkVQT1JUKSk7Ci0KLSAgcF9kYXRhID0gKCh1aW50OF90KilwX2RzdF9kYXRhKSArIHNpemVvZih0QlRBX0hEX1NFVF9SRVBPUlQpOwotCi0gIG1lbWNweShwX2RhdGEsIHBfc3JjX2RhdGEtPnBfZGF0YSwgcF9zcmNfZGF0YS0+bGVuKTsKLQotICBwX2RzdF9kYXRhLT5wX2RhdGEgPSBwX2RhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfaGRfZnJlZV9idWYoKSB7Ci0gIGlmIChhcHBfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KSBvc2lfZnJlZShhcHBfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KTsKLSAgaWYgKGFwcF9pbmZvLnBfZGVzY3JpcHRpb24pIG9zaV9mcmVlKGFwcF9pbmZvLnBfZGVzY3JpcHRpb24pOwotICBpZiAoYXBwX2luZm8ucF9uYW1lKSBvc2lfZnJlZShhcHBfaW5mby5wX25hbWUpOwotICBpZiAoYXBwX2luZm8ucF9wcm92aWRlcikgb3NpX2ZyZWUoYXBwX2luZm8ucF9wcm92aWRlcik7Ci0gIGFwcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QgPSBOVUxMOwotICBhcHBfaW5mby5wX2Rlc2NyaXB0aW9uID0gTlVMTDsKLSAgYXBwX2luZm8ucF9uYW1lID0gTlVMTDsKLSAgYXBwX2luZm8ucF9wcm92aWRlciA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hkX3JlbW92ZV9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZXMgcGx1Z2dlZCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2hkX3JlbW92ZV9kZXZpY2UoUmF3QWRkcmVzcyBiZF9hZGRyKSB7Ci0gIEJUQV9IZFJlbW92ZURldmljZShiZF9hZGRyKTsKLSAgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRkKCZiZF9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGRfdXBzdHJlYW1zX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXhlY3V0ZXMgZXZlbnRzIGluIGJ0aWYgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX2hkX3Vwc3RyZWFtc19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgdEJUQV9IRCogcF9kYXRhID0gKHRCVEFfSEQqKXBfcGFyYW07Ci0KLSAgQlRJRl9UUkFDRV9BUEkoIiVzOiBldmVudD0lcyIsIF9fZnVuY19fLCBkdW1wX2hkX2V2ZW50KGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0hEX0VOQUJMRV9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc3RhdHVzPSVkIiwgX19mdW5jX18sIHBfZGF0YS0+c3RhdHVzKTsKLSAgICAgIGlmIChwX2RhdGEtPnN0YXR1cyA9PSBCVEFfSERfT0spIHsKLSAgICAgICAgYnRpZl9zdG9yYWdlX2xvYWRfaGlkZCgpOwotICAgICAgICBidGlmX2hkX2NiLnN0YXR1cyA9IEJUSUZfSERfRU5BQkxFRDsKLSAgICAgICAgLyogUmVnaXN0ZXIgdGhlIGFwcCBpZiBub3QgeWV0IHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgaWYgKCFidGlmX2hkX2NiLmFwcF9yZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgQlRBX0hkUmVnaXN0ZXJBcHAoJmFwcF9pbmZvLCAmaW5fcW9zLCAmb3V0X3Fvcyk7Ci0gICAgICAgICAgYnRpZl9oZF9mcmVlX2J1ZigpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGlmX2hkX2NiLnN0YXR1cyA9IEJUSUZfSERfRElTQUJMRUQ7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiRmFpbGVkIHRvIGVuYWJsZSBCVC1IRCwgc3RhdHVzPSVkIiwgcF9kYXRhLT5zdGF0dXMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9ESVNBQkxFX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgcF9kYXRhLT5zdGF0dXMpOwotICAgICAgYnRpZl9oZF9jYi5zdGF0dXMgPSBCVElGX0hEX0RJU0FCTEVEOwotICAgICAgaWYgKGJ0aWZfaGRfY2Iuc2VydmljZV9kZXJlZ19hY3RpdmUpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJyZWdpc3RlcmluZyBoaWQgaG9zdCBub3ciKTsKLSAgICAgICAgYnRpZl9oaF9zZXJ2aWNlX3JlZ2lzdHJhdGlvbihUUlVFKTsKLSAgICAgICAgYnRpZl9oZF9jYi5zZXJ2aWNlX2RlcmVnX2FjdGl2ZSA9IEZBTFNFOwotICAgICAgfQotICAgICAgYnRpZl9oZF9mcmVlX2J1ZigpOwotICAgICAgaWYgKHBfZGF0YS0+c3RhdHVzID09IEJUQV9IRF9PSykKLSAgICAgICAgbWVtc2V0KCZidGlmX2hkX2NiLCAwLCBzaXplb2YoYnRpZl9oZF9jYikpOwotICAgICAgZWxzZQotICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIkZhaWxlZCB0byBkaXNhYmxlIEJULUhELCBzdGF0dXM9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5zdGF0dXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9SRUdJU1RFUl9BUFBfRVZUOiB7Ci0gICAgICBSYXdBZGRyZXNzKiBhZGRyID0gKFJhd0FkZHJlc3MqKSZwX2RhdGEtPnJlZ19zdGF0dXMuYmRhOwotCi0gICAgICBpZiAoIXBfZGF0YS0+cmVnX3N0YXR1cy5pbl91c2UpIHsKLSAgICAgICAgYWRkciA9IE5VTEw7Ci0gICAgICB9Ci0KLSAgICAgIGJ0aWZfaGRfY2IuYXBwX3JlZ2lzdGVyZWQgPSBUUlVFOwotICAgICAgSEFMX0NCQUNLKGJ0X2hkX2NhbGxiYWNrcywgYXBwbGljYXRpb25fc3RhdGVfY2IsIGFkZHIsCi0gICAgICAgICAgICAgICAgQlRIRF9BUFBfU1RBVEVfUkVHSVNURVJFRCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0hEX1VOUkVHSVNURVJfQVBQX0VWVDoKLSAgICAgIGJ0aWZfaGRfY2IuYXBwX3JlZ2lzdGVyZWQgPSBGQUxTRTsKLSAgICAgIEhBTF9DQkFDSyhidF9oZF9jYWxsYmFja3MsIGFwcGxpY2F0aW9uX3N0YXRlX2NiLCBOVUxMLAotICAgICAgICAgICAgICAgIEJUSERfQVBQX1NUQVRFX05PVF9SRUdJU1RFUkVEKTsKLSAgICAgIGlmIChidGlmX2hkX2NiLnNlcnZpY2VfZGVyZWdfYWN0aXZlKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiZGlzYWJsaW5nIGhpZCBkZXZpY2Ugc2VydmljZSBub3ciKTsKLSAgICAgICAgYnRpZl9oZF9mcmVlX2J1ZigpOwotICAgICAgICBCVEFfSGREaXNhYmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hEX09QRU5fRVZUOiB7Ci0gICAgICBSYXdBZGRyZXNzKiBhZGRyID0gKFJhd0FkZHJlc3MqKSZwX2RhdGEtPmNvbm4uYmRhOwotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJCVEFfSERfT1BFTl9FVlQsIGFkZHJlc3M9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHItPlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAvKiBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBmcm9tIGhpZCBob3N0IGFuZCBub3QgaGlkIGRldmljZSAqLwotICAgICAgaWYgKGNoZWNrX2NvZF9oaWQoYWRkcikpIHsKLSAgICAgICAgLyogSW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGhpZCBkZXZpY2UsIHJlamVjdCBpdCAqLwotICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoInJlbW90ZSBkZXZpY2UgaXMgbm90IGhpZCBob3N0LCBkaXNjb25uZWN0aW5nIik7Ci0gICAgICAgIGJ0aWZfaGRfY2IuZm9yY2VkX2Rpc2MgPSBUUlVFOwotICAgICAgICBCVEFfSGREaXNjb25uZWN0KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnRpZl9zdG9yYWdlX3NldF9oaWRkKHBfZGF0YS0+Y29ubi5iZGEpOwotCi0gICAgICBIQUxfQ0JBQ0soYnRfaGRfY2FsbGJhY2tzLCBjb25uZWN0aW9uX3N0YXRlX2NiLAotICAgICAgICAgICAgICAgIChSYXdBZGRyZXNzKikmcF9kYXRhLT5jb25uLmJkYSwgQlRIRF9DT05OX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0hEX0NMT1NFX0VWVDoKLSAgICAgIGlmIChidGlmX2hkX2NiLmZvcmNlZF9kaXNjKSB7Ci0gICAgICAgIFJhd0FkZHJlc3MqIGFkZHIgPSAoUmF3QWRkcmVzcyopJnBfZGF0YS0+Y29ubi5iZGE7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygicmVtb3RlIGRldmljZSB3YXMgZm9yY2VmdWxseSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgYnRpZl9oZF9yZW1vdmVfZGV2aWNlKCphZGRyKTsKLSAgICAgICAgYnRpZl9oZF9jYi5mb3JjZWRfZGlzYyA9IEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIEhBTF9DQkFDSyhidF9oZF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgKFJhd0FkZHJlc3MqKSZwX2RhdGEtPmNvbm4uYmRhLCBCVEhEX0NPTk5fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSERfR0VUX1JFUE9SVF9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGRfY2FsbGJhY2tzLCBnZXRfcmVwb3J0X2NiLCBwX2RhdGEtPmdldF9yZXBvcnQucmVwb3J0X3R5cGUsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5nZXRfcmVwb3J0LnJlcG9ydF9pZCwgcF9kYXRhLT5nZXRfcmVwb3J0LmJ1ZmZlcl9zaXplKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSERfU0VUX1JFUE9SVF9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGRfY2FsbGJhY2tzLCBzZXRfcmVwb3J0X2NiLCBwX2RhdGEtPnNldF9yZXBvcnQucmVwb3J0X3R5cGUsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5zZXRfcmVwb3J0LnJlcG9ydF9pZCwgcF9kYXRhLT5zZXRfcmVwb3J0LmxlbiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnNldF9yZXBvcnQucF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSERfU0VUX1BST1RPQ09MX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9oZF9jYWxsYmFja3MsIHNldF9wcm90b2NvbF9jYiwgcF9kYXRhLT5zZXRfcHJvdG9jb2wpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9JTlRSX0RBVEFfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2hkX2NhbGxiYWNrcywgaW50cl9kYXRhX2NiLCBwX2RhdGEtPmludHJfZGF0YS5yZXBvcnRfaWQsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5pbnRyX2RhdGEubGVuLCBwX2RhdGEtPmludHJfZGF0YS5wX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9WQ19VTlBMVUdfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2hkX2NhbGxiYWNrcywgY29ubmVjdGlvbl9zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAoUmF3QWRkcmVzcyopJnBfZGF0YS0+Y29ubi5iZGEsIEJUSERfQ09OTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgaWYgKGJ0YV9kbV9jaGVja19pZl9vbmx5X2hkX2Nvbm5lY3RlZChwX2RhdGEtPmNvbm4uYmRhKSkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUmVtb3ZpbmcgYm9uZGluZyBhcyBvbmx5IEhJRCBwcm9maWxlIGNvbm5lY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBCVEFfRG1SZW1vdmVEZXZpY2UocF9kYXRhLT5jb25uLmJkYSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyID0gKFJhd0FkZHJlc3MqKSZwX2RhdGEtPmNvbm4uYmRhOwotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIiVzOiBPbmx5IHJlbW92aW5nIEhJRCBkYXRhIGFzIHNvbWUgb3RoZXIgcHJvZmlsZXMgIgotICAgICAgICAgICAgImNvbm5lY3RlZCIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0aWZfaGRfcmVtb3ZlX2RldmljZSgqYmRfYWRkcik7Ci0gICAgICB9Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGRfY2FsbGJhY2tzLCB2Y191bnBsdWdfY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9DT05OX1NUQVRFX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9oZF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgKFJhd0FkZHJlc3MqKSZwX2RhdGEtPmNvbm4uYmRhLAotICAgICAgICAgICAgICAgIChidGhkX2Nvbm5lY3Rpb25fc3RhdGVfdClwX2RhdGEtPmNvbm4uc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHVua25vd24gZXZlbnQgKCVkKSIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRlX2hkX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3dpdGNoZXMgY29udGV4dCBmcm9tIEJURSB0byBCVElGIGZvciBhbGwgQlQtSEQgZXZlbnRzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYnRlX2hkX2V2dCh0QlRBX0hEX0VWVCBldmVudCwgdEJUQV9IRCogcF9kYXRhKSB7Ci0gIGJ0X3N0YXR1c190IHN0YXR1czsKLSAgaW50IHBhcmFtX2xlbiA9IDA7Ci0gIHRCVElGX0NPUFlfQ0JBQ0sqIHBfY29weV9jYmFjayA9IE5VTEw7Ci0KLSAgQlRJRl9UUkFDRV9BUEkoIiVzIGV2ZW50PSVkIiwgX19mdW5jX18sIGV2ZW50KTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfSERfRU5BQkxFX0VWVDoKLSAgICBjYXNlIEJUQV9IRF9ESVNBQkxFX0VWVDoKLSAgICBjYXNlIEJUQV9IRF9VTlJFR0lTVEVSX0FQUF9FVlQ6Ci0gICAgICBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9IRF9TVEFUVVMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9SRUdJU1RFUl9BUFBfRVZUOgotICAgICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSERfUkVHX1NUQVRVUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hEX09QRU5fRVZUOgotICAgIGNhc2UgQlRBX0hEX0NMT1NFX0VWVDoKLSAgICBjYXNlIEJUQV9IRF9WQ19VTlBMVUdfRVZUOgotICAgIGNhc2UgQlRBX0hEX0NPTk5fU1RBVEVfRVZUOgotICAgICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSERfQ09OTik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hEX0dFVF9SRVBPUlRfRVZUOgotICAgICAgcGFyYW1fbGVuICs9IHNpemVvZih0QlRBX0hEX0dFVF9SRVBPUlQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9TRVRfUkVQT1JUX0VWVDoKLSAgICAgIHBhcmFtX2xlbiA9IHNpemVvZih0QlRBX0hEX1NFVF9SRVBPUlQpICsgcF9kYXRhLT5zZXRfcmVwb3J0LmxlbjsKLSAgICAgIHBfY29weV9jYmFjayA9IHNldF9yZXBvcnRfY29weV9jYjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSERfU0VUX1BST1RPQ09MX0VWVDoKLSAgICAgIHBhcmFtX2xlbiArPSBzaXplb2YocF9kYXRhLT5zZXRfcHJvdG9jb2wpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRF9JTlRSX0RBVEFfRVZUOgotICAgICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSERfSU5UUl9EQVRBKSArIHBfZGF0YS0+aW50cl9kYXRhLmxlbjsKLSAgICAgIHBfY29weV9jYmFjayA9IGludHJfZGF0YV9jb3B5X2NiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzdGF0dXMgPSBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9oZF91cHN0cmVhbXNfZXZ0LCAodWludDE2X3QpZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcF9kYXRhLCBwYXJhbV9sZW4sIHBfY29weV9jYmFjayk7Ci0KLSAgQVNTRVJUQyhzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJjb250ZXh0IHRyYW5zZmVyIGZhaWxlZCIsIHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgIGluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgSW5pdGlhbGl6ZXMgQlQtSEQgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0KGJ0aGRfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcykgewotICBCVElGX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRfaGRfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICBtZW1zZXQoJmJ0aWZfaGRfY2IsIDAsIHNpemVvZihidGlmX2hkX2NiKSk7Ci0KLSAgYnRpZl9lbmFibGVfc2VydmljZShCVEFfSElERF9TRVJWSUNFX0lEKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBjbGVhbnVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbGVhbnMgdXAgQlQtSEQgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNsZWFudXAodm9pZCkgewotICBCVElGX1RSQUNFX0FQSSgiaGQ6JXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKGJ0X2hkX2NhbGxiYWNrcykgewotICAgIC8qIHVwZGF0ZSBmbGFnLCBub3QgdG8gZW5hYmxlIGhpZCBob3N0IHNlcnZpY2Ugbm93IGFzIEJUIGlzIHN3aXRjaGluZyBvZmYgKi8KLSAgICBidGlmX2hkX2NiLnNlcnZpY2VfZGVyZWdfYWN0aXZlID0gRkFMU0U7Ci0gICAgYnRpZl9kaXNhYmxlX3NlcnZpY2UoQlRBX0hJRERfU0VSVklDRV9JRCk7Ci0gICAgYnRfaGRfY2FsbGJhY2tzID0gTlVMTDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmVnaXN0ZXJfYXBwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlcnMgSElEIERldmljZSBhcHBsaWNhdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHJlZ2lzdGVyX2FwcChidGhkX2FwcF9wYXJhbV90KiBwX2FwcF9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZF9xb3NfcGFyYW1fdCogcF9pbl9xb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGRfcW9zX3BhcmFtX3QqIHBfb3V0X3FvcykgewotICBCVElGX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKGJ0aWZfaGRfY2IuYXBwX3JlZ2lzdGVyZWQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBhcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19CVVNZOwotICB9Ci0KLSAgaWYgKHN0cmxlbihwX2FwcF9wYXJhbS0+bmFtZSkgPj0gQlRJRl9IRF9BUFBfTkFNRV9MRU4gfHwKLSAgICAgIHN0cmxlbihwX2FwcF9wYXJhbS0+ZGVzY3JpcHRpb24pID49IEJUSUZfSERfQVBQX0RFU0NSSVBUSU9OX0xFTiB8fAotICAgICAgc3RybGVuKHBfYXBwX3BhcmFtLT5wcm92aWRlcikgPj0gQlRJRl9IRF9BUFBfUFJPVklERVJfTEVOKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTMwMzcyMjAiKTsKLSAgfQotICBhcHBfaW5mby5wX25hbWUgPSAoY2hhciopb3NpX2NhbGxvYyhCVElGX0hEX0FQUF9OQU1FX0xFTik7Ci0gIHN0cmxjcHkoYXBwX2luZm8ucF9uYW1lLCBwX2FwcF9wYXJhbS0+bmFtZSwgQlRJRl9IRF9BUFBfTkFNRV9MRU4pOwotICBhcHBfaW5mby5wX2Rlc2NyaXB0aW9uID0gKGNoYXIqKW9zaV9jYWxsb2MoQlRJRl9IRF9BUFBfREVTQ1JJUFRJT05fTEVOKTsKLSAgc3RybGNweShhcHBfaW5mby5wX2Rlc2NyaXB0aW9uLCBwX2FwcF9wYXJhbS0+ZGVzY3JpcHRpb24sCi0gICAgICAgICAgQlRJRl9IRF9BUFBfREVTQ1JJUFRJT05fTEVOKTsKLSAgYXBwX2luZm8ucF9wcm92aWRlciA9IChjaGFyKilvc2lfY2FsbG9jKEJUSUZfSERfQVBQX1BST1ZJREVSX0xFTik7Ci0gIHN0cmxjcHkoYXBwX2luZm8ucF9wcm92aWRlciwgcF9hcHBfcGFyYW0tPnByb3ZpZGVyLCBCVElGX0hEX0FQUF9QUk9WSURFUl9MRU4pOwotICBhcHBfaW5mby5zdWJjbGFzcyA9IHBfYXBwX3BhcmFtLT5zdWJjbGFzczsKLSAgYXBwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4gPSBwX2FwcF9wYXJhbS0+ZGVzY19saXN0X2xlbjsKLSAgYXBwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCA9Ci0gICAgICAodWludDhfdCopb3NpX21hbGxvYyhhcHBfaW5mby5kZXNjcmlwdG9yLmRsX2xlbik7Ci0gIG1lbWNweShhcHBfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0LCBwX2FwcF9wYXJhbS0+ZGVzY19saXN0LAotICAgICAgICAgcF9hcHBfcGFyYW0tPmRlc2NfbGlzdF9sZW4pOwotCi0gIGluX3Fvcy5zZXJ2aWNlX3R5cGUgPSBwX2luX3Fvcy0+c2VydmljZV90eXBlOwotICBpbl9xb3MudG9rZW5fcmF0ZSA9IHBfaW5fcW9zLT50b2tlbl9yYXRlOwotICBpbl9xb3MudG9rZW5fYnVja2V0X3NpemUgPSBwX2luX3Fvcy0+dG9rZW5fYnVja2V0X3NpemU7Ci0gIGluX3Fvcy5wZWFrX2JhbmR3aWR0aCA9IHBfaW5fcW9zLT5wZWFrX2JhbmR3aWR0aDsKLSAgaW5fcW9zLmFjY2Vzc19sYXRlbmN5ID0gcF9pbl9xb3MtPmFjY2Vzc19sYXRlbmN5OwotICBpbl9xb3MuZGVsYXlfdmFyaWF0aW9uID0gcF9pbl9xb3MtPmRlbGF5X3ZhcmlhdGlvbjsKLQotICBvdXRfcW9zLnNlcnZpY2VfdHlwZSA9IHBfb3V0X3Fvcy0+c2VydmljZV90eXBlOwotICBvdXRfcW9zLnRva2VuX3JhdGUgPSBwX291dF9xb3MtPnRva2VuX3JhdGU7Ci0gIG91dF9xb3MudG9rZW5fYnVja2V0X3NpemUgPSBwX291dF9xb3MtPnRva2VuX2J1Y2tldF9zaXplOwotICBvdXRfcW9zLnBlYWtfYmFuZHdpZHRoID0gcF9vdXRfcW9zLT5wZWFrX2JhbmR3aWR0aDsKLSAgb3V0X3Fvcy5hY2Nlc3NfbGF0ZW5jeSA9IHBfb3V0X3Fvcy0+YWNjZXNzX2xhdGVuY3k7Ci0gIG91dF9xb3MuZGVsYXlfdmFyaWF0aW9uID0gcF9vdXRfcW9zLT5kZWxheV92YXJpYXRpb247Ci0KLSAgLyogcmVnaXN0ZXIgSElEIERldmljZSB3aXRoIEwyQ0FQIGFuZCB1bnJlZ2lzdGVyIEhJRCBIb3N0IHdpdGggTDJDQVAgKi8KLSAgLyogRGlzYWJsZSBISCAqLwotICBidGlmX2hoX3NlcnZpY2VfcmVnaXN0cmF0aW9uKEZBTFNFKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1bnJlZ2lzdGVyX2FwcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVW5yZWdpc3RlcnMgSElEIERldmljZSBhcHBsaWNhdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHVucmVnaXN0ZXJfYXBwKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghYnRpZl9oZF9jYi5hcHBfcmVnaXN0ZXJlZCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGFwcGxpY2F0aW9uIG5vdCB5ZXQgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChidGlmX2hkX2NiLnN0YXR1cyAhPSBCVElGX0hEX0VOQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVC1IRCBub3QgZW5hYmxlZCwgc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfaGRfY2Iuc3RhdHVzKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChidGlmX2hkX2NiLnNlcnZpY2VfZGVyZWdfYWN0aXZlKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogQlQtSEQgZGVyZWdpc3RlcmluZyBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0JVU1k7Ci0gIH0KLQotICBidGlmX2hkX2NiLnNlcnZpY2VfZGVyZWdfYWN0aXZlID0gVFJVRTsKLSAgQlRBX0hkVW5yZWdpc3RlckFwcCgpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbm5lY3RzIHRvIGhvc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBjb25uZWN0KFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQlRJRl9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghYnRpZl9oZF9jYi5hcHBfcmVnaXN0ZXJlZCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGFwcGxpY2F0aW9uIG5vdCB5ZXQgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChidGlmX2hkX2NiLnN0YXR1cyAhPSBCVElGX0hEX0VOQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVC1IRCBub3QgZW5hYmxlZCwgc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfaGRfY2Iuc3RhdHVzKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIEJUQV9IZENvbm5lY3QoKmJkX2FkZHIpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGRpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2Nvbm5lY3RzIGZyb20gaG9zdAotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGRpc2Nvbm5lY3Qodm9pZCkgewotICBCVElGX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKCFidGlmX2hkX2NiLmFwcF9yZWdpc3RlcmVkKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogYXBwbGljYXRpb24gbm90IHlldCByZWdpc3RlcmVkIiwgX19mdW5jX18pOwotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICB9Ci0KLSAgaWYgKGJ0aWZfaGRfY2Iuc3RhdHVzICE9IEJUSUZfSERfRU5BQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IEJULUhEIG5vdCBlbmFibGVkLCBzdGF0dXM9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9oZF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICB9Ci0KLSAgQlRBX0hkRGlzY29ubmVjdCgpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNlbmRfcmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyBSZXBvcnRzIHRvIGhpZCBob3N0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2VuZF9yZXBvcnQoYnRoZF9yZXBvcnRfdHlwZV90IHR5cGUsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgdEJUQV9IRF9SRVBPUlQgcmVwb3J0OwotCi0gIEFQUExfVFJBQ0VfVkVSQk9TRSgiJXM6IHR5cGU9JWQgaWQ9JWQgbGVuPSVkIiwgX19mdW5jX18sIHR5cGUsIGlkLCBsZW4pOwotCi0gIGlmICghYnRpZl9oZF9jYi5hcHBfcmVnaXN0ZXJlZCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGFwcGxpY2F0aW9uIG5vdCB5ZXQgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChidGlmX2hkX2NiLnN0YXR1cyAhPSBCVElGX0hEX0VOQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVC1IRCBub3QgZW5hYmxlZCwgc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfaGRfY2Iuc3RhdHVzKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmICh0eXBlID09IEJUSERfUkVQT1JUX1RZUEVfSU5UUkRBVEEpIHsKLSAgICByZXBvcnQudHlwZSA9IEJUSERfUkVQT1JUX1RZUEVfSU5QVVQ7Ci0gICAgcmVwb3J0LnVzZV9pbnRyID0gVFJVRTsKLSAgfSBlbHNlIHsKLSAgICByZXBvcnQudHlwZSA9ICh0eXBlICYgMHgwMyk7Ci0gICAgcmVwb3J0LnVzZV9pbnRyID0gRkFMU0U7Ci0gIH0KLQotICByZXBvcnQuaWQgPSBpZDsKLSAgcmVwb3J0LmxlbiA9IGxlbjsKLSAgcmVwb3J0LnBfZGF0YSA9IHBfZGF0YTsKLQotICBCVEFfSGRTZW5kUmVwb3J0KCZyZXBvcnQpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJlcG9ydF9lcnJvcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZHMgSEFORFNIQUtFIHdpdGggZXJyb3IgaW5mbyBmb3IgaW52YWxpZCBTRVRfUkVQT1JUCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgcmVwb3J0X2Vycm9yKHVpbnQ4X3QgZXJyb3IpIHsKLSAgQlRJRl9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghYnRpZl9oZF9jYi5hcHBfcmVnaXN0ZXJlZCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGFwcGxpY2F0aW9uIG5vdCB5ZXQgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChidGlmX2hkX2NiLnN0YXR1cyAhPSBCVElGX0hEX0VOQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVC1IRCBub3QgZW5hYmxlZCwgc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfaGRfY2Iuc3RhdHVzKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIEJUQV9IZFJlcG9ydEVycm9yKGVycm9yKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB2aXJ0dWFsX2NhYmxlX3VucGx1ZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZHMgVmlydHVhbCBDYWJsZSBVbnBsdWcgdG8gaG9zdAotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHZpcnR1YWxfY2FibGVfdW5wbHVnKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghYnRpZl9oZF9jYi5hcHBfcmVnaXN0ZXJlZCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGFwcGxpY2F0aW9uIG5vdCB5ZXQgcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChidGlmX2hkX2NiLnN0YXR1cyAhPSBCVElGX0hEX0VOQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVC1IRCBub3QgZW5hYmxlZCwgc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfaGRfY2Iuc3RhdHVzKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIEJUQV9IZFZpcnR1YWxDYWJsZVVucGx1ZygpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGNvbnN0IGJ0aGRfaW50ZXJmYWNlX3QgYnRoZEludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYnRoZEludGVyZmFjZSksCi0gICAgaW5pdCwKLSAgICBjbGVhbnVwLAotICAgIHJlZ2lzdGVyX2FwcCwKLSAgICB1bnJlZ2lzdGVyX2FwcCwKLSAgICBjb25uZWN0LAotICAgIGRpc2Nvbm5lY3QsCi0gICAgc2VuZF9yZXBvcnQsCi0gICAgcmVwb3J0X2Vycm9yLAotICAgIHZpcnR1YWxfY2FibGVfdW5wbHVnLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGRfZXhlY3V0ZV9zZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFbmFibGVkL2Rpc2FibGVzIEJULUhEIHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfaGRfZXhlY3V0ZV9zZXJ2aWNlKGJvb2wgYl9lbmFibGUpIHsKLSAgQlRJRl9UUkFDRV9BUEkoIiVzOiBiX2VuYWJsZT0lZCIsIF9fZnVuY19fLCBiX2VuYWJsZSk7Ci0KLSAgaWYgKCFiX2VuYWJsZSkgQlRBX0hkRGlzYWJsZSgpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGRfZ2V0X2ludGVyZmFjZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0cyBCVC1IRCBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0aGRfaW50ZXJmYWNlX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgYnRoZF9pbnRlcmZhY2VfdCogYnRpZl9oZF9nZXRfaW50ZXJmYWNlKCkgewotICBCVElGX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRoZEludGVyZmFjZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGRfc2VydmljZV9yZWdpc3RyYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVycyBoaWQgZGV2aWNlIHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2hkX3NlcnZpY2VfcmVnaXN0cmF0aW9uKCkgewotICBCVElGX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIC8qIGVuYWJsZSBIRCAqLwotICBpZiAoYnRfaGRfY2FsbGJhY2tzICE9IE5VTEwpIHsKLSAgICBCVEFfSGRFbmFibGUoYnRlX2hkX2V2dCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfaGVhcmluZ19haWQuY2MgYi9idGlmL3NyYy9idGlmX2hlYXJpbmdfYWlkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUxZWRlLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfaGVhcmluZ19haWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSGVhcmluZyBBaWQgUHJvZmlsZSBJbnRlcmZhY2UgKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9oZWFyaW5nX2FpZC5oPgotCi0jaW5jbHVkZSAiYnRhX2hlYXJpbmdfYWlkX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6VW5yZXRhaW5lZDsKLXVzaW5nIGJsdWV0b290aDo6aGVhcmluZ19haWQ6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6aGVhcmluZ19haWQ6OkhlYXJpbmdBaWRDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OmhlYXJpbmdfYWlkOjpIZWFyaW5nQWlkSW50ZXJmYWNlOwotCi0vLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbgotdGVtcGxhdGUgPD4KLWJhc2U6OkNhbGxiYWNrPHZvaWQoKT4gam5pX3RocmVhZF93cmFwcGVyKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IGNiKSB7Ci0gIHJldHVybiBiYXNlOjpCaW5kKAotICAgICAgW10oY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwgYmFzZTo6Q2FsbGJhY2s8dm9pZCgpPiBjYikgewotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKGZyb21faGVyZSwgY2IpOwotICAgICAgfSwKLSAgICAgIGZyb21faGVyZSwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBIZWFyaW5nQWlkSW50ZXJmYWNlSW1wbDsKLXN0ZDo6dW5pcXVlX3B0cjxIZWFyaW5nQWlkSW50ZXJmYWNlPiBoZWFyaW5nQWlkSW5zdGFuY2U7Ci0KLWNsYXNzIEhlYXJpbmdBaWRJbnRlcmZhY2VJbXBsCi0gICAgOiBwdWJsaWMgYmx1ZXRvb3RoOjpoZWFyaW5nX2FpZDo6SGVhcmluZ0FpZEludGVyZmFjZSwKLSAgICAgIHB1YmxpYyBIZWFyaW5nQWlkQ2FsbGJhY2tzIHsKLSAgfkhlYXJpbmdBaWRJbnRlcmZhY2VJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHZvaWQgSW5pdChIZWFyaW5nQWlkQ2FsbGJhY2tzKiBjYWxsYmFja3MpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgICB0aGlzLT5jYWxsYmFja3MgPSBjYWxsYmFja3M7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgQmluZCgmSGVhcmluZ0FpZDo6SW5pdGlhbGl6ZSwgdGhpcywKLSAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfaGVhcmluZ19haWRzKSkpKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmSGVhcmluZ0FpZENhbGxiYWNrczo6T25Db25uZWN0aW9uU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBzdGF0ZSwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBPbkRldmljZUF2YWlsYWJsZSh1aW50OF90IGNhcGFiaWxpdGllcywgdWludDY0X3QgaGlTeW5jSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgPDwgIiwgaGlTeW5jSWQ6ICIgPDwgbG9naGV4KGhpU3luY0lkKQotICAgICAgICAgICAgIDw8ICIsIGNhcGFiaWxpdGllczogIiA8PCBsb2doZXgoY2FwYWJpbGl0aWVzKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmSGVhcmluZ0FpZENhbGxiYWNrczo6T25EZXZpY2VBdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBjYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlTeW5jSWQsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZIZWFyaW5nQWlkOjpDb25uZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKEhlYXJpbmdBaWQ6OkdldCgpKSwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkhlYXJpbmdBaWQ6OkRpc2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoSGVhcmluZ0FpZDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJmJ0aWZfc3RvcmFnZV9zZXRfaGVhcmluZ19haWRfYWNjZXB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBmYWxzZSkpOwotICB9Ci0KLSAgdm9pZCBBZGRUb0FjY2VwdGxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZIZWFyaW5nQWlkOjpBZGRUb0FjY2VwdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoSGVhcmluZ0FpZDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJmJ0aWZfc3RvcmFnZV9zZXRfaGVhcmluZ19haWRfYWNjZXB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCB0cnVlKSk7Ci0gIH0KLQotICB2b2lkIFNldFZvbHVtZShpbnQ4X3Qgdm9sdW1lKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiB2b2x1bWU6ICIgPDwgK3ZvbHVtZTsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkhlYXJpbmdBaWQ6OlNldFZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChIZWFyaW5nQWlkOjpHZXQoKSksIHZvbHVtZSkpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzOwotCi0gICAgLy8gUmVtb3ZlRGV2aWNlIGNhbiBiZSBjYWxsZWQgb24gZGV2aWNlcyB0aGF0IGRvbid0IGhhdmUgSEEgZW5hYmxlZAotICAgIGlmIChIZWFyaW5nQWlkOjpJc0hlYXJpbmdBaWRSdW5uaW5nKCkpIHsKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJkhlYXJpbmdBaWQ6OkRpc2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoSGVhcmluZ0FpZDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gICAgfQotCi0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBCaW5kKCZidGlmX3N0b3JhZ2VfcmVtb3ZlX2hlYXJpbmdfYWlkLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIENsZWFudXAodm9pZCkgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmSGVhcmluZ0FpZDo6Q2xlYW5VcCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBIZWFyaW5nQWlkQ2FsbGJhY2tzKiBjYWxsYmFja3M7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotSGVhcmluZ0FpZEludGVyZmFjZSogYnRpZl9oZWFyaW5nX2FpZF9nZXRfaW50ZXJmYWNlKCkgewotICBpZiAoIWhlYXJpbmdBaWRJbnN0YW5jZSkKLSAgICBoZWFyaW5nQWlkSW5zdGFuY2UucmVzZXQobmV3IEhlYXJpbmdBaWRJbnRlcmZhY2VJbXBsKCkpOwotCi0gIHJldHVybiBoZWFyaW5nQWlkSW5zdGFuY2UuZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX2hmLmNjIGIvYnRpZi9zcmMvYnRpZl9oZi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1YWQzNy4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2hmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX2hmLmMKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgSGFuZHNmcmVlIFByb2ZpbGUgQmx1ZXRvb3RoIEludGVyZmFjZQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfaGYiCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS91dGwuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9wcm9maWxlX3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfdXRpbC5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfaGVhZHNldF9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfaGYuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBjaGFyIGtCdG1Mb2dUYWdbXSA9ICJIRlAiOwotfQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoZWFkc2V0IHsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJUSUZfSFNBR19TRVJWSUNFX05BTUUKLSNkZWZpbmUgQlRJRl9IU0FHX1NFUlZJQ0VfTkFNRSAoIkhlYWRzZXQgR2F0ZXdheSIpCi0jZW5kaWYKLQotI2lmbmRlZiBCVElGX0hGQUdfU0VSVklDRV9OQU1FCi0jZGVmaW5lIEJUSUZfSEZBR19TRVJWSUNFX05BTUUgKCJIYW5kc2ZyZWUgR2F0ZXdheSIpCi0jZW5kaWYKLQotI2lmbmRlZiBCVElGX0hGX1NFUlZJQ0VTCi0jZGVmaW5lIEJUSUZfSEZfU0VSVklDRVMgKEJUQV9IU1BfU0VSVklDRV9NQVNLIHwgQlRBX0hGUF9TRVJWSUNFX01BU0spCi0jZW5kaWYKLQotI2lmbmRlZiBCVElGX0hGX1NFUlZJQ0VfTkFNRVMKLSNkZWZpbmUgQlRJRl9IRl9TRVJWSUNFX05BTUVTIFwKLSAgeyBCVElGX0hTQUdfU0VSVklDRV9OQU1FLCBCVElGX0hGQUdfU0VSVklDRV9OQU1FIH0KLSNlbmRpZgotCi0jaWZuZGVmIEJUSUZfSEZfRkVBVFVSRVMKLSNkZWZpbmUgQlRJRl9IRl9GRUFUVVJFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEJUQV9BR19GRUFUXzNXQVkgfCBCVEFfQUdfRkVBVF9FQ05SIHwgQlRBX0FHX0ZFQVRfUkVKRUNUIHwgICAgIFwKLSAgIEJUQV9BR19GRUFUX0VDUyB8IEJUQV9BR19GRUFUX0VYVEVSUiB8IEJUQV9BR19GRUFUX1ZSRUMgfCAgICAgIFwKLSAgIEJUQV9BR19GRUFUX0NPREVDIHwgQlRBX0FHX0ZFQVRfSEZfSU5EIHwgQlRBX0FHX0ZFQVRfRVNDT19TNCB8IFwKLSAgIEJUQV9BR19GRUFUX1VOQVQpCi0jZW5kaWYKLQotLyogSEYgZmVhdHVyZXMgc3VwcG9ydGVkIGF0IHJ1bnRpbWUgKi8KLXN0YXRpYyB1aW50MzJfdCBidGlmX2hmX2ZlYXR1cmVzID0gQlRJRl9IRl9GRUFUVVJFUzsKLQotI2RlZmluZSBCVElGX0hGX0lOVkFMSURfSURYICgtMSkKLQotLyogTWF4IEhGIGNsaWVudHMgc3VwcG9ydGVkIGZyb20gQXBwICovCi1zdGF0aWMgaW50IGJ0aWZfbWF4X2hmX2NsaWVudHMgPSAxOwotc3RhdGljIFJhd0FkZHJlc3MgYWN0aXZlX2JkYSA9IHt9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQ2FsbGJhY2tzKiBidF9oZl9jYWxsYmFja3MgPSBudWxscHRyOwotCi0jZGVmaW5lIENIRUNLX0JUSEZfSU5JVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWJ0X2hmX2NhbGxiYWNrcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIkJUSEY6ICVzOiBCVEhGIG5vdCBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsgXAotICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVElGX1RSQUNFX0VWRU5UKCJCVEhGOiAlcyIsIF9fZnVuY19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCi0KLS8qIEJUSUYtSEYgY29udHJvbCBibG9jayB0byBtYXAgYmRhZGRyIHRvIEJUQSBoYW5kbGUgKi8KLXN0cnVjdCBidGlmX2hmX2NiX3QgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIGJvb2wgaXNfaW5pdGlhdG9yOwotICBSYXdBZGRyZXNzIGNvbm5lY3RlZF9iZGE7Ci0gIGJ0aGZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlOwotICB0QlRBX0FHX1BFRVJfRkVBVCBwZWVyX2ZlYXQ7Ci0gIGludCBudW1fYWN0aXZlOwotICBpbnQgbnVtX2hlbGQ7Ci0gIGJ0aGZfY2FsbF9zdGF0ZV90IGNhbGxfc2V0dXBfc3RhdGU7Ci19OwotCi1zdGF0aWMgYnRpZl9oZl9jYl90IGJ0aWZfaGZfY2JbQlRBX0FHX01BWF9OVU1fQ0xJRU5UU107Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBkdW1wX2hmX2NhbGxfc3RhdGUoYnRoZl9jYWxsX3N0YXRlX3QgY2FsbF9zdGF0ZSkgewotICBzd2l0Y2ggKGNhbGxfc3RhdGUpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRIRl9DQUxMX1NUQVRFX0lETEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSEZfQ0FMTF9TVEFURV9IRUxEKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEhGX0NBTExfU1RBVEVfRElBTElORykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRIRl9DQUxMX1NUQVRFX0FMRVJUSU5HKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEhGX0NBTExfU1RBVEVfSU5DT01JTkcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSEZfQ0FMTF9TVEFURV9XQUlUSU5HKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEhGX0NBTExfU1RBVEVfQUNUSVZFKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEhGX0NBTExfU1RBVEVfRElTQ09OTkVDVEVEKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04gQ0FMTCBTVEFURSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBDaGVjayBpZiBiZF9hZGRyIGlzIHRoZSBjdXJyZW50IGFjdGl2ZSBkZXZpY2UuCi0gKgotICogQHBhcmFtIGJkX2FkZHIgdGFyZ2V0IGRldmljZSBhZGRyZXNzCi0gKiBAcmV0dXJuIFRydWUgaWYgYmRfYWRkciBpcyB0aGUgY3VycmVudCBhY3RpdmUgZGV2aWNlLCBGYWxzZSBvdGhlcndpc2Ugb3IgaWYKLSAqIG5vIGFjdGl2ZSBkZXZpY2UgaXMgc2V0IChpLmUuIGFjdGl2ZV9kZXZpY2VfYWRkciBpcyBlbXB0eSkKLSAqLwotc3RhdGljIGJvb2wgaXNfYWN0aXZlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiAhYWN0aXZlX2JkYS5Jc0VtcHR5KCkgJiYgYWN0aXZlX2JkYSA9PSBiZF9hZGRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaXNfY29ubmVjdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byBjaGVjayBpZiBIRiBpcyBjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgaXNfY29ubmVjdGVkKG51bGxwdHIpIHJldHVybnMgVFJVRSBpZiBvbmUgb2YgdGhlIGNvbnRyb2wKLSAqICAgICAgICAgICAgICAgICAgYmxvY2tzIGlzIGNvbm5lY3RlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgaXNfY29ubmVjdGVkKFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidGlmX21heF9oZl9jbGllbnRzOyArK2kpIHsKLSAgICBpZiAoKChidGlmX2hmX2NiW2ldLnN0YXRlID09IEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQpIHx8Ci0gICAgICAgICAoYnRpZl9oZl9jYltpXS5zdGF0ZSA9PSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfU0xDX0NPTk5FQ1RFRCkpICYmCi0gICAgICAgICghYmRfYWRkciB8fCAqYmRfYWRkciA9PSBidGlmX2hmX2NiW2ldLmNvbm5lY3RlZF9iZGEpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl9pZHhfYnlfYmRhZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgaWR4IGJ5IGJkYWRkcgotICoKLSAqIFJldHVybnMgICAgICAgICAgaWR4Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgYnRpZl9oZl9pZHhfYnlfYmRhZGRyKFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidGlmX21heF9oZl9jbGllbnRzOyArK2kpIHsKLSAgICBpZiAoKmJkX2FkZHIgPT0gYnRpZl9oZl9jYltpXS5jb25uZWN0ZWRfYmRhKSByZXR1cm4gaTsKLSAgfQotICByZXR1cm4gQlRJRl9IRl9JTlZBTElEX0lEWDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNhbGxzdGF0ZV90b19jYWxsc2V0dXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbnZlcnRzIEhBTCBjYWxsIHN0YXRlIHRvIEJUQSBjYWxsIHNldHVwIGluZGljYXRvciB2YWx1ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRBIGNhbGwgaW5kaWNhdG9yIHZhbHVlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGNhbGxzdGF0ZV90b19jYWxsc2V0dXAoYnRoZl9jYWxsX3N0YXRlX3QgY2FsbF9zdGF0ZSkgewotICBzd2l0Y2ggKGNhbGxfc3RhdGUpIHsKLSAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9JTkNPTUlORzoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0RJQUxJTkc6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9BTEVSVElORzoKLSAgICAgIHJldHVybiAzOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2VuZF9hdF9yZXN1bHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgQVQgcmVzdWx0IGNvZGUgKE9LL0VSUk9SKQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZW5kX2F0X3Jlc3VsdCh1aW50OF90IG9rX2ZsYWcsIHVpbnQxNl90IGVycmNvZGUsIGludCBpZHgpIHsKLSAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgYWdfcmVzLm9rX2ZsYWcgPSBva19mbGFnOwotICBpZiAob2tfZmxhZyA9PSBCVEFfQUdfT0tfRVJST1IpIHsKLSAgICBhZ19yZXMuZXJyY29kZSA9IGVycmNvZGU7Ci0gIH0KLSAgQlRBX0FnUmVzdWx0KGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUsIEJUQV9BR19VTkFUX1JFUywgYWdfcmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNlbmRfaW5kaWNhdG9yX3VwZGF0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBpbmRpY2F0b3IgdXBkYXRlIChDSUVWKQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZW5kX2luZGljYXRvcl91cGRhdGUoY29uc3QgYnRpZl9oZl9jYl90JiBjb250cm9sX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZGljYXRvciwgdWludDE2X3QgdmFsdWUpIHsKLSAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgYWdfcmVzLmluZC5pZCA9IGluZGljYXRvcjsKLSAgYWdfcmVzLmluZC52YWx1ZSA9IHZhbHVlOwotICBCVEFfQWdSZXN1bHQoY29udHJvbF9ibG9jay5oYW5kbGUsIEJUQV9BR19JTkRfUkVTLCBhZ19yZXMpOwotfQotCi1zdGF0aWMgYm9vbCBpc19udGhfYml0X2VuYWJsZWQodWludDMyX3QgdmFsdWUsIGludCBuKSB7Ci0gIHJldHVybiAodmFsdWUgJiAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IG4pKSAhPSAwOwotfQotCi12b2lkIGNsZWFyX3Bob25lX3N0YXRlX211bHRpaGYoYnRpZl9oZl9jYl90KiBoZl9jYikgewotICBoZl9jYi0+Y2FsbF9zZXR1cF9zdGF0ZSA9IEJUSEZfQ0FMTF9TVEFURV9JRExFOwotICBoZl9jYi0+bnVtX2FjdGl2ZSA9IDA7Ci0gIGhmX2NiLT5udW1faGVsZCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2V0X2NvbnRyb2xfYmxvY2soYnRpZl9oZl9jYl90KiBoZl9jYikgewotICBoZl9jYi0+c3RhdGUgPSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOwotICBoZl9jYi0+aXNfaW5pdGlhdG9yID0gZmFsc2U7Ci0gIGhmX2NiLT5jb25uZWN0ZWRfYmRhID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBoZl9jYi0+cGVlcl9mZWF0ID0gMDsKLSAgY2xlYXJfcGhvbmVfc3RhdGVfbXVsdGloZihoZl9jYik7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgU2VydmljZSBMZXZlbCBDb25uZWN0aW9uIChTTEMpIGlzIGVzdGFibGlzaGVkIGZvciBiZF9hZGRyCi0gKgotICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gKiBAcmV0dXJuIHRydWUgaWYgU0xDIGlzIGVzdGFibGlzaGVkIGZvciBiZF9hZGRyCi0gKi8KLXN0YXRpYyBib29sIElzU2xjQ29ubmVjdGVkKFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgaWYgKCFiZF9hZGRyKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGJkX2FkZHIgaXMgbnVsbCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludCBpZHggPSBidGlmX2hmX2lkeF9ieV9iZGFkZHIoYmRfYWRkcik7Ci0gIGlmIChpZHggPCAwIHx8IGlkeCA+IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogaW52YWxpZCBpbmRleCAiIDw8IGlkeCA8PCAiIGZvciAiCi0gICAgICAgICAgICAgICAgIDw8ICpiZF9hZGRyOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gYnRpZl9oZl9jYltpZHhdLnN0YXRlID09IEJUSEZfQ09OTkVDVElPTl9TVEFURV9TTENfQ09OTkVDVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl91cHN0cmVhbXNfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFeGVjdXRlcyBIRiBVUFNUUkVBTVMgZXZlbnRzIGluIGJ0aWYgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX2hmX3Vwc3RyZWFtc19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgaWYgKGV2ZW50ID09IEJUQV9BR19FTkFCTEVfRVZUIHx8IGV2ZW50ID09IEJUQV9BR19ESVNBQkxFX0VWVCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBBRyBlbmFibGUvZGlzYWJsZSBldmVudCAiIDw8IGV2ZW50OwotICAgIHJldHVybjsKLSAgfQotICBpZiAocF9wYXJhbSA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwYXJhbWV0ZXIgaXMgbnVsbCI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHRCVEFfQUcqIHBfZGF0YSA9ICh0QlRBX0FHKilwX3BhcmFtOwotICBpbnQgaWR4ID0gcF9kYXRhLT5oZHIuaGFuZGxlIC0gMTsKLQotICBMT0dfREVCVUcoIkhGIFVwc3RyZWFtIGV2ZW50OiVzIiwgZHVtcF9oZl9ldmVudChldmVudCkpOwotCi0gIGlmICgoaWR4IDwgMCkgfHwgKGlkeCA+PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSkgewotICAgIExPR19FUlJPUigiJXMgSW52YWxpZCBjbGllbnQgaW5kZXg6JWQiLCBkdW1wX2hmX2V2ZW50KGV2ZW50KSwgaWR4KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFidF9oZl9jYWxsYmFja3MpIHsKLSAgICBMT0dfRVJST1IoIiVzIEhlYWRzZXQgY2FsbGJhY2sgaXMgbm90IHNldCIsIGR1bXBfaGZfZXZlbnQoZXZlbnQpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfQUdfUkVHSVNURVJfRVZUOgotICAgICAgYnRpZl9oZl9jYltpZHhdLmhhbmRsZSA9IHBfZGF0YS0+cmVnLmhkci5oYW5kbGU7Ci0gICAgICBMT0dfREVCVUcoIiVzIGlkeDolZCBidGlmX2hmX2NiLmhhbmRsZSA9ICVkIiwgZHVtcF9oZl9ldmVudChldmVudCksIGlkeCwKLSAgICAgICAgICAgICAgICBidGlmX2hmX2NiW2lkeF0uaGFuZGxlKTsKLSAgICAgIGJyZWFrOwotICAgIC8vIFJGQ09NTSBjb25uZWN0ZWQgb3IgZmFpbGVkIHRvIGNvbm5lY3QKLSAgICBjYXNlIEJUQV9BR19PUEVOX0VWVDoKLSAgICAgIC8vIENoZWNrIGlmIGFuIG91dG9naW5nIGNvbm5lY3Rpb24gaXMgcGVuZGluZwotICAgICAgaWYgKGJ0aWZfaGZfY2JbaWR4XS5pc19pbml0aWF0b3IpIHsKLSAgICAgICAgaWYgKChwX2RhdGEtPm9wZW4uc3RhdHVzICE9IEJUQV9BR19TVUNDRVNTKSAmJgotICAgICAgICAgICAgYnRpZl9oZl9jYltpZHhdLnN0YXRlICE9IEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HKSB7Ci0gICAgICAgICAgaWYgKHBfZGF0YS0+b3Blbi5iZF9hZGRyID09IGJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogYnRpZl9oZl9jYiBzdGF0ZVsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgcF9kYXRhLT5vcGVuLnN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdIGlzIG5vdCBleHBlY3RlZCwgcG9zc2libGUgY29ubmVjdGlvbiBjb2xsaXNpb24sICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JpbmcgQUcgb3BlbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmUgZXZlbnQgZm9yIHRoZSBzYW1lIGRldmljZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgcF9kYXRhLT5vcGVuLmJkX2FkZHI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBidGlmX2hmX2NiIHN0YXRlWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwX2RhdGEtPm9wZW4uc3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0gaXMgbm90IGV4cGVjdGVkLCBwb3NzaWJsZSBjb25uZWN0aW9uIGNvbGxpc2lvbiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBBRyBvcGVuIGZhaWx1cmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudCBmb3IgdGhlIGRpZmZlcmVudCBkZXZpY2VzIGJ0aWZfaGZfY2IgYmRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBwX2RhdGEgYmRhOiAiIDw8IHBfZGF0YS0+b3Blbi5iZF9hZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgcmVwb3J0IGRpc2Nvbm5lY3Qgc3RhdGUgZm9yIHBfZGF0YSBiZGEuIjsKLSAgICAgICAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+Q29ubmVjdGlvblN0YXRlQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgQlRIRl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgJihwX2RhdGEtPm9wZW4uYmRfYWRkcikpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLX0VRKGJ0aWZfaGZfY2JbaWR4XS5zdGF0ZSwgQlRIRl9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcpCi0gICAgICAgICAgICA8PCAiQ29udHJvbCBibG9jayBtdXN0IGJlIGluIGNvbm5lY3Rpbmcgc3RhdGUgd2hlbiBpbml0aWF0aW5nIjsKLSAgICAgICAgQ0hFQ0soIWJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhLklzRW1wdHkoKSkKLSAgICAgICAgICAgIDw8ICJSZW1vdGUgZGV2aWNlIGFkZHJlc3MgbXVzdCBub3QgYmUgZW1wdHkgd2hlbiBpbml0aWF0aW5nIjsKLSAgICAgICAgaWYgKGJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhICE9IHBfZGF0YS0+b3Blbi5iZF9hZGRyKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IHBvc3NpYmxlIGNvbm5lY3Rpb24gY29sbGlzaW9uLCBpZ25vcmUgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGdvaW5nIGNvbm5lY3Rpb24gZm9yIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJkaWZmZXJlbnQgZGV2aWNlcyBidGlmX2hmX2NiIGJkYTogIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBwX2RhdGEgYmRhOiAiIDw8IHBfZGF0YS0+b3Blbi5iZF9hZGRyCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHJlcG9ydCBkaXNjb25uZWN0IHN0YXRlIGZvciBidGlmX2hmX2NiIGJkYS4iOwotICAgICAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+Q29ubmVjdGlvblN0YXRlQ2FsbGJhY2soCi0gICAgICAgICAgICAgIEJUSEZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsCi0gICAgICAgICAgICAgICYoYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpKTsKLSAgICAgICAgICByZXNldF9jb250cm9sX2Jsb2NrKCZidGlmX2hmX2NiW2lkeF0pOwotICAgICAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocF9kYXRhLT5vcGVuLnN0YXR1cyA9PSBCVEFfQUdfU1VDQ0VTUykgewotICAgICAgICAvLyBJbiBjYXNlIHRoaXMgaXMgYW4gaW5jb21pbmcgY29ubmVjdGlvbgotICAgICAgICBidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSA9IHBfZGF0YS0+b3Blbi5iZF9hZGRyOwotICAgICAgICBidGlmX2hmX2NiW2lkeF0uc3RhdGUgPSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBidGlmX2hmX2NiW2lkeF0ucGVlcl9mZWF0ID0gMDsKLSAgICAgICAgY2xlYXJfcGhvbmVfc3RhdGVfbXVsdGloZigmYnRpZl9oZl9jYltpZHhdKTsKLSAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCkKLSAgICAgICAgICAgIC0+TG9nSGVhZHNldFByb2ZpbGVSZmNDb25uZWN0aW9uKHBfZGF0YS0+b3Blbi5zZXJ2aWNlX2lkKTsKLSAgICAgICAgYnRfaGZfY2FsbGJhY2tzLT5Db25uZWN0aW9uU3RhdGVDYWxsYmFjaygKLSAgICAgICAgICAgIGJ0aWZfaGZfY2JbaWR4XS5zdGF0ZSwgJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghYnRpZl9oZl9jYltpZHhdLmlzX2luaXRpYXRvcikgewotICAgICAgICAgIC8vIElnbm9yZSByZW1vdGUgaW5pdGlhdGVkIG9wZW4gZmFpbHVyZXMKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogVW5leHBlY3RlZCBBRyBvcGVuIGZhaWx1cmUgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhwX2RhdGEtPm9wZW4uc3RhdHVzKSA8PCAiIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IHBfZGF0YS0+b3Blbi5iZF9hZGRyIDw8ICIgaXMgaWdub3JlZCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZWxmIGluaXRpYXRlZCBBRyBvcGVuIGZhaWxlZCBmb3IgIgotICAgICAgICAgICAgICAgICAgIDw8IGJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhIDw8ICIsIHN0YXR1cyAiCi0gICAgICAgICAgICAgICAgICAgPDwgc3RkOjp0b19zdHJpbmcocF9kYXRhLT5vcGVuLnN0YXR1cyk7Ci0gICAgICAgIFJhd0FkZHJlc3MgY29ubmVjdGVkX2JkYSA9IGJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhOwotICAgICAgICByZXNldF9jb250cm9sX2Jsb2NrKCZidGlmX2hmX2NiW2lkeF0pOwotICAgICAgICBidF9oZl9jYWxsYmFja3MtPkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKGJ0aWZfaGZfY2JbaWR4XS5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubmVjdGVkX2JkYSk7Ci0gICAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQUdfQ0xPU0VfRVZUOiB7Ci0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIlNMQyBhbmQgUkZDT01NIGJvdGggZGlzY29ubmVjdGVkIGV2ZW50OiVzIGlkeDolZCIKLSAgICAgICAgICAiIGJ0aWZfaGZfY2IuaGFuZGxlOiVkIiwKLSAgICAgICAgICBkdW1wX2hmX2V2ZW50KGV2ZW50KSwgaWR4LCBidGlmX2hmX2NiW2lkeF0uaGFuZGxlKTsKLSAgICAgIC8vIElmIEFHX09QRU4gd2FzIHJlY2VpdmVkIGJ1dCBTTEMgd2FzIG5vdCBjb25uZWN0ZWQgaW4gdGltZSwgdGhlbgotICAgICAgLy8gQUdfQ0xPU0UgbWF5IGJlIHJlY2VpdmVkLiBXZSBuZWVkIHRvIGFkdmFuY2UgdGhlIHF1ZXVlIGhlcmUuCi0gICAgICBib29sIGZhaWxlZF90b19zZXR1cF9zbGMgPQotICAgICAgICAgIChidGlmX2hmX2NiW2lkeF0uc3RhdGUgIT0gQlRIRl9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQpICYmCi0gICAgICAgICAgYnRpZl9oZl9jYltpZHhdLmlzX2luaXRpYXRvcjsKLSAgICAgIFJhd0FkZHJlc3MgY29ubmVjdGVkX2JkYSA9IGJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhOwotICAgICAgcmVzZXRfY29udHJvbF9ibG9jaygmYnRpZl9oZl9jYltpZHhdKTsKLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+Q29ubmVjdGlvblN0YXRlQ2FsbGJhY2soYnRpZl9oZl9jYltpZHhdLnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubmVjdGVkX2JkYSk7Ci0gICAgICBpZiAoZmFpbGVkX3RvX3NldHVwX3NsYykgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBzZXR1cCBTTEMgZm9yICIgPDwgY29ubmVjdGVkX2JkYTsKLSAgICAgICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfQUdfQ09OTl9FVlQ6Ci0gICAgICBMT0dfREVCVUcoIlNMQyBjb25uZWN0ZWQgZXZlbnQ6JXMgaWR4OiVkIiwgZHVtcF9oZl9ldmVudChldmVudCksIGlkeCk7Ci0gICAgICBidGlmX2hmX2NiW2lkeF0ucGVlcl9mZWF0ID0gcF9kYXRhLT5jb25uLnBlZXJfZmVhdDsKLSAgICAgIGJ0aWZfaGZfY2JbaWR4XS5zdGF0ZSA9IEJUSEZfQ09OTkVDVElPTl9TVEFURV9TTENfQ09OTkVDVEVEOwotICAgICAgYnRfaGZfY2FsbGJhY2tzLT5Db25uZWN0aW9uU3RhdGVDYWxsYmFjayhidGlmX2hmX2NiW2lkeF0uc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBpZiAoYnRpZl9oZl9jYltpZHhdLmlzX2luaXRpYXRvcikgewotICAgICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVVESU9fT1BFTl9FVlQ6Ci0gICAgICBMT0dfREVCVUcoIkF1ZGlvIG9wZW4gZXZlbnQ6JXMiLCBkdW1wX2hmX2V2ZW50KGV2ZW50KSk7Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPkF1ZGlvU3RhdGVDYWxsYmFjayhCVEhGX0FVRElPX1NUQVRFX0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FVRElPX0NMT1NFX0VWVDoKLSAgICAgIExPR19ERUJVRygiQXVkaW8gY2xvc2UgZXZlbnQ6JXMiLCBkdW1wX2hmX2V2ZW50KGV2ZW50KSk7Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPkF1ZGlvU3RhdGVDYWxsYmFjayhCVEhGX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX1NQS19FVlQ6Ci0gICAgY2FzZSBCVEFfQUdfTUlDX0VWVDoKLSAgICAgIExPR19ERUJVRygiQlRBIGF1dG8tcmVzcG9uZHMsIHNpbGVudGx5IGRpc2NhcmQgZXZlbnQ6JXMiLAotICAgICAgICAgICAgICAgIGR1bXBfaGZfZXZlbnQoZXZlbnQpKTsKLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+Vm9sdW1lQ29udHJvbENhbGxiYWNrKAotICAgICAgICAgIChldmVudCA9PSBCVEFfQUdfU1BLX0VWVCkgPyBCVEhGX1ZPTFVNRV9UWVBFX1NQSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVEhGX1ZPTFVNRV9UWVBFX01JQywKLSAgICAgICAgICBwX2RhdGEtPnZhbC5udW0sICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0FfRVZUOgotICAgICAgYnRfaGZfY2FsbGJhY2tzLT5BbnN3ZXJDYWxsQ2FsbGJhY2soJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogSmF2YSBuZWVkcyB0byBzZW5kIE9LL0VSUk9SIGZvciB0aGVzZSBjb21tYW5kcyAqLwotICAgIGNhc2UgQlRBX0FHX0FUX0JMRE5fRVZUOgotICAgIGNhc2UgQlRBX0FHX0FUX0RfRVZUOgotICAgICAgYnRfaGZfY2FsbGJhY2tzLT5EaWFsQ2FsbENhbGxiYWNrKAotICAgICAgICAgIChldmVudCA9PSBCVEFfQUdfQVRfRF9FVlQpID8gcF9kYXRhLT52YWwuc3RyIDogKGNoYXIqKSIiLAotICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0NIVVBfRVZUOgotICAgICAgYnRfaGZfY2FsbGJhY2tzLT5IYW5ndXBDYWxsQ2FsbGJhY2soJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQ0lORF9FVlQ6Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPkF0Q2luZENhbGxiYWNrKCZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX1ZUU19FVlQ6Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPkR0bWZDbWRDYWxsYmFjayhwX2RhdGEtPnZhbC5zdHJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9CVlJBX0VWVDoKLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+Vm9pY2VSZWNvZ25pdGlvbkNhbGxiYWNrKChwX2RhdGEtPnZhbC5udW0gPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJUSEZfVlJfU1RBVEVfU1RBUlRFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlRIRl9WUl9TVEFURV9TVE9QUEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfTlJFQ19FVlQ6Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPk5vaXNlUmVkdWN0aW9uQ2FsbGJhY2soCi0gICAgICAgICAgKHBfZGF0YS0+dmFsLm51bSA9PSAxKSA/IEJUSEZfTlJFQ19TVEFSVCA6IEJUSEZfTlJFQ19TVE9QLAotICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRPRE86IEFkZCBhIGNhbGxiYWNrIGZvciBDQkMgKi8KLSAgICBjYXNlIEJUQV9BR19BVF9DQkNfRVZUOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9DS1BEX0VWVDoKLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+S2V5UHJlc3NlZENhbGxiYWNrKCZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX1dCU19FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAgICJCVEFfQUdfV0JTX0VWVCBTZXQgY29kZWMgc3RhdHVzICVkIGNvZGVjICVkIDE9Q1ZTRCAyPU1TQkMiLAotICAgICAgICAgIHBfZGF0YS0+dmFsLmhkci5zdGF0dXMsIHBfZGF0YS0+dmFsLm51bSk7Ci0gICAgICBpZiAocF9kYXRhLT52YWwubnVtID09IEJUTV9TQ09fQ09ERUNfQ1ZTRCkgewotICAgICAgICBidF9oZl9jYWxsYmFja3MtPldic0NhbGxiYWNrKEJUSEZfV0JTX05PLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICB9IGVsc2UgaWYgKHBfZGF0YS0+dmFsLm51bSA9PSBCVE1fU0NPX0NPREVDX01TQkMpIHsKLSAgICAgICAgYnRfaGZfY2FsbGJhY2tzLT5XYnNDYWxsYmFjayhCVEhGX1dCU19ZRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+V2JzQ2FsbGJhY2soQlRIRl9XQlNfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBKYXZhIG5lZWRzIHRvIHNlbmQgT0svRVJST1IgZm9yIHRoZXNlIGNvbW1hbmRzICovCi0gICAgY2FzZSBCVEFfQUdfQVRfQ0hMRF9FVlQ6Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPkF0Q2hsZENhbGxiYWNrKChidGhmX2NobGRfdHlwZV90KWF0b2kocF9kYXRhLT52YWwuc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQ0xDQ19FVlQ6Ci0gICAgICBidF9oZl9jYWxsYmFja3MtPkF0Q2xjY0NhbGxiYWNrKCZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FHX0FUX0NPUFNfRVZUOgotICAgICAgYnRfaGZfY2FsbGJhY2tzLT5BdENvcHNDYWxsYmFjaygmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9VTkFUX0VWVDoKLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+VW5rbm93bkF0Q2FsbGJhY2socF9kYXRhLT52YWwuc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9DTlVNX0VWVDoKLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+QXRDbnVtQ2FsbGJhY2soJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogVE9ETzogU29tZSBvZiB0aGVzZSBjb21tYW5kcyBtYXkgbmVlZCB0byBiZSBzZW50IHRvIGFwcC4gRm9yIG5vdyByZXNwb25kCi0gICAgICogd2l0aCBlcnJvciAqLwotICAgIGNhc2UgQlRBX0FHX0FUX0JJTlBfRVZUOgotICAgIGNhc2UgQlRBX0FHX0FUX0JUUkhfRVZUOgotICAgICAgc2VuZF9hdF9yZXN1bHQoQlRBX0FHX09LX0VSUk9SLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQsIGlkeCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BR19BVF9CQUNfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQUcgQml0bWFwIG9mIHBlZXItY29kZWNzICVkIiwgcF9kYXRhLT52YWwubnVtKTsKLSAgICAgIC8qIElmIHRoZSBwZWVyIHN1cHBvcnRzIG1TQkMgYW5kIHRoZSBCVElGIHByZWZlcnJlZCBjb2RlYyBpcyBhbHNvIG1TQkMsCi0gICAgICB0aGVuCi0gICAgICB3ZSBzaG91bGQgc2V0IHRoZSBCVEEgQUcgQ29kZWMgdG8gbVNCQy4gVGhpcyB3b3VsZCB0cmlnZ2VyIGEgK0JDUyB0byBtU0JDCi0gICAgICBhdCB0aGUgdGltZQotICAgICAgb2YgU0NPIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCAqLwotICAgICAgaWYgKHBfZGF0YS0+dmFsLm51bSAmIEJUTV9TQ09fQ09ERUNfTVNCQykgewotICAgICAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogYnRpZl9oZiBvdmVycmlkZS1QcmVmZXJyZWQgQ29kZWMgdG8gTVNCQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBCVEFfQWdTZXRDb2RlYyhidGlmX2hmX2NiW2lkeF0uaGFuZGxlLCBCVE1fU0NPX0NPREVDX01TQkMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXMgYnRpZl9oZiBvdmVycmlkZS1QcmVmZXJyZWQgQ29kZWMgdG8gQ1ZTRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBCVEFfQWdTZXRDb2RlYyhidGlmX2hmX2NiW2lkeF0uaGFuZGxlLCBCVE1fU0NPX0NPREVDX0NWU0QpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfQUdfQVRfQkNTX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBBRyBmaW5hbCBzZWxlY3RlZCBjb2RlYyBpcyAweCUwMnggMT1DVlNEIDI9TVNCQyIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2RhdGEtPnZhbC5udW0pOwotICAgICAgLyogTm8gQlRIRl9XQlNfTk9ORSBjYXNlLCBiZWNhdXNlIEhGMS42IHN1cHBvcnRlZCBkZXZpY2UgY2FuIHNlbmQgQkNTICovCi0gICAgICAvKiBPbmx5IENWU0QgaXMgY29uc2lkZXJlZCBuYXJyb3cgYmFuZCBzcGVlY2ggKi8KLSAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+V2JzQ2FsbGJhY2soCi0gICAgICAgICAgKHBfZGF0YS0+dmFsLm51bSA9PSBCVE1fU0NPX0NPREVDX0NWU0QpID8gQlRIRl9XQlNfTk8gOiBCVEhGX1dCU19ZRVMsCi0gICAgICAgICAgJmJ0aWZfaGZfY2JbaWR4XS5jb25uZWN0ZWRfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUdfQVRfQklORF9FVlQ6Ci0gICAgICBpZiAocF9kYXRhLT52YWwuaGRyLnN0YXR1cyA9PSBCVEFfQUdfU1VDQ0VTUykgewotICAgICAgICBidF9oZl9jYWxsYmFja3MtPkF0QmluZENhbGxiYWNrKHBfZGF0YS0+dmFsLnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BR19BVF9CSUVWX0VWVDoKLSAgICAgIGlmIChwX2RhdGEtPnZhbC5oZHIuc3RhdHVzID09IEJUQV9BR19TVUNDRVNTKSB7Ci0gICAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+QXRCaWV2Q2FsbGJhY2soKGJ0aGZfaGZfaW5kX3R5cGVfdClwX2RhdGEtPnZhbC5saWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcF9kYXRhLT52YWwubnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidGlmX2hmX2NiW2lkeF0uY29ubmVjdGVkX2JkYSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BR19BVF9CSUFfRVZUOgotICAgICAgaWYgKHBfZGF0YS0+dmFsLmhkci5zdGF0dXMgPT0gQlRBX0FHX1NVQ0NFU1MpIHsKLSAgICAgICAgdWludDMyX3QgYmlhX21hc2tfb3V0ID0gcF9kYXRhLT52YWwubnVtOwotICAgICAgICBib29sIHNlcnZpY2UgPSAhaXNfbnRoX2JpdF9lbmFibGVkKGJpYV9tYXNrX291dCwgQlRBX0FHX0lORF9TRVJWSUNFKTsKLSAgICAgICAgYm9vbCByb2FtID0gIWlzX250aF9iaXRfZW5hYmxlZChiaWFfbWFza19vdXQsIEJUQV9BR19JTkRfUk9BTSk7Ci0gICAgICAgIGJvb2wgc2lnbmFsID0gIWlzX250aF9iaXRfZW5hYmxlZChiaWFfbWFza19vdXQsIEJUQV9BR19JTkRfU0lHTkFMKTsKLSAgICAgICAgYm9vbCBiYXR0ZXJ5ID0gIWlzX250aF9iaXRfZW5hYmxlZChiaWFfbWFza19vdXQsIEJUQV9BR19JTkRfQkFUVENIRyk7Ci0gICAgICAgIGJ0X2hmX2NhbGxiYWNrcy0+QXRCaWFDYWxsYmFjayhzZXJ2aWNlLCByb2FtLCBzaWduYWwsIGJhdHRlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmhhbmRsZWQgZXZlbnQgIiA8PCBldmVudDsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGVfaGZfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTd2l0Y2hlcyBjb250ZXh0IGZyb20gQlRFIHRvIEJUSUYgZm9yIGFsbCBIRiBldmVudHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBidGVfaGZfZXZ0KHRCVEFfQUdfRVZUIGV2ZW50LCB0QlRBX0FHKiBwX2RhdGEpIHsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotICBpbnQgcGFyYW1fbGVuID0gMDsKLQotICAvKiBUT0RPOiBCVEEgc2VuZHMgdGhlIHVuaW9uIG1lbWJlcnMgYW5kIG5vdCB0QlRBX0FHLiBJZiB1c2luZwotICAgKiBwYXJhbV9sZW49c2l6ZW9mKHRCVEFfQUcpLCB3ZSBnZXQgYSBjcmFzaCBvbiBtZW1jcHkgKi8KLSAgaWYgKEJUQV9BR19SRUdJU1RFUl9FVlQgPT0gZXZlbnQpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfQUdfUkVHSVNURVIpOwotICBlbHNlIGlmIChCVEFfQUdfT1BFTl9FVlQgPT0gZXZlbnQpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfQUdfT1BFTik7Ci0gIGVsc2UgaWYgKEJUQV9BR19DT05OX0VWVCA9PSBldmVudCkKLSAgICBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9BR19DT05OKTsKLSAgZWxzZSBpZiAoKEJUQV9BR19DTE9TRV9FVlQgPT0gZXZlbnQpIHx8IChCVEFfQUdfQVVESU9fT1BFTl9FVlQgPT0gZXZlbnQpIHx8Ci0gICAgICAgICAgIChCVEFfQUdfQVVESU9fQ0xPU0VfRVZUID09IGV2ZW50KSkKLSAgICBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9BR19IRFIpOwotICBlbHNlIGlmIChwX2RhdGEpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfQUdfVkFMKTsKLQotICAvKiBzd2l0Y2ggY29udGV4dCB0byBidGlmIHRhc2sgY29udGV4dCAoY29weSBmdWxsIHVuaW9uIHNpemUgZm9yIGNvbnZlbmllbmNlKQotICAgKi8KLSAgc3RhdHVzID0gYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfaGZfdXBzdHJlYW1zX2V2dCwgKHVpbnQxNl90KWV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBfZGF0YSwgcGFyYW1fbGVuLCBudWxscHRyKTsKLQotICAvKiBjYXRjaCBhbnkgZmFpbGVkIGNvbnRleHQgdHJhbnNmZXJzICovCi0gIEFTU0VSVEMoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTLCAiY29udGV4dCB0cmFuc2ZlciBmYWlsZWQiLCBzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICBjb25uZWN0IHRvIGhlYWRzZXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGNvbm5lY3RfaW50KFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQxNl90IHV1aWQpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIGlmIChpc19jb25uZWN0ZWQoYmRfYWRkcikpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBkZXZpY2UgJXMgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0JVU1k7Ci0gIH0KLSAgYnRpZl9oZl9jYl90KiBoZl9jYiA9IG51bGxwdHI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYnRpZl9tYXhfaGZfY2xpZW50czsgaSsrKSB7Ci0gICAgaWYgKGJ0aWZfaGZfY2JbaV0uc3RhdGUgPT0gQlRIRl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgaGZfY2IgPSAmYnRpZl9oZl9jYltpXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvLyBEdWUgdG8gYnRpZiBxdWV1ZSBpbXBsZW1lbnRhdGlvbiwgd2hlbiBjb25uZWN0X2ludCBpcyBjYWxsZWQsIG5vIGJ0aWYKLSAgICAvLyBjb250cm9sIGJsb2NrIHNob3VsZCBiZSBpbiBjb25uZWN0aW5nIHN0YXRlCi0gICAgLy8gQ3Jhc2ggaGVyZSB0byBwcmV2ZW50IGZ1dHVyZSBjb2RlIGNoYW5nZXMgZnJvbSBicmVha2luZyB0aGlzIG1lY2hhbmlzbQotICAgIGlmIChidGlmX2hmX2NiW2ldLnN0YXRlID09IEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgYnRpZl9oZl9jYltpXS5jb25uZWN0ZWRfYmRhCi0gICAgICAgICAgICAgICAgIDw8ICIsIGhhbmRsZSAiIDw8IGJ0aWZfaGZfY2JbaV0uaGFuZGxlCi0gICAgICAgICAgICAgICAgIDw8ICIsIGlzIHN0aWxsIGluIGNvbm5lY3Rpbmcgc3RhdGUgIiA8PCBidGlmX2hmX2NiW2ldLnN0YXRlOwotICAgIH0KLSAgfQotICBpZiAoaGZfY2IgPT0gbnVsbHB0cikgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIiVzOiBDYW5ub3QgY29ubmVjdCAlczogbWF4aW11bSAlZCBjbGllbnRzIGFscmVhZHkgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgIGJkX2FkZHItPlRvU3RyaW5nKCkuY19zdHIoKSwgYnRpZl9tYXhfaGZfY2xpZW50cyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19CVVNZOwotICB9Ci0gIGhmX2NiLT5zdGF0ZSA9IEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotICBoZl9jYi0+Y29ubmVjdGVkX2JkYSA9ICpiZF9hZGRyOwotICBoZl9jYi0+aXNfaW5pdGlhdG9yID0gdHJ1ZTsKLSAgaGZfY2ItPnBlZXJfZmVhdCA9IDA7Ci0gIEJUQV9BZ09wZW4oaGZfY2ItPmhhbmRsZSwgaGZfY2ItPmNvbm5lY3RlZF9iZGEpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIFVwZGF0ZUNhbGxTdGF0ZXMoYnRpZl9oZl9jYl90KiBjb250cm9sX2Jsb2NrLCBpbnQgbnVtX2FjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9oZWxkLCBidGhmX2NhbGxfc3RhdGVfdCBjYWxsX3NldHVwX3N0YXRlKSB7Ci0gIGNvbnRyb2xfYmxvY2stPm51bV9hY3RpdmUgPSBudW1fYWN0aXZlOwotICBjb250cm9sX2Jsb2NrLT5udW1faGVsZCA9IG51bV9oZWxkOwotICBjb250cm9sX2Jsb2NrLT5jYWxsX3NldHVwX3N0YXRlID0gY2FsbF9zZXR1cF9zdGF0ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGZfaXNfY2FsbF9pZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICByZXR1cm5zIHRydWUgaWYgbm8gY2FsbCBpcyBpbiBwcm9ncmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBJc0NhbGxJZGxlKCkgewotICBpZiAoIWJ0X2hmX2NhbGxiYWNrcykgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidGlmX21heF9oZl9jbGllbnRzOyArK2kpIHsKLSAgICBpZiAoKGJ0aWZfaGZfY2JbaV0uY2FsbF9zZXR1cF9zdGF0ZSAhPSBCVEhGX0NBTExfU1RBVEVfSURMRSkgfHwKLSAgICAgICAgKChidGlmX2hmX2NiW2ldLm51bV9oZWxkICsgYnRpZl9oZl9jYltpXS5udW1fYWN0aXZlKSA+IDApKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNsYXNzIEhlYWRzZXRJbnRlcmZhY2UgOiBJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEludGVyZmFjZSogR2V0SW5zdGFuY2UoKSB7Ci0gICAgc3RhdGljIEludGVyZmFjZSogaW5zdGFuY2UgPSBuZXcgSGVhZHNldEludGVyZmFjZSgpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICBidF9zdGF0dXNfdCBJbml0KENhbGxiYWNrcyogY2FsbGJhY2tzLCBpbnQgbWF4X2hmX2NsaWVudHMsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgQ29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgRGlzY29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgQ29ubmVjdEF1ZGlvKFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlOwotICBidF9zdGF0dXNfdCBEaXNjb25uZWN0QXVkaW8oUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIGJ0X3N0YXR1c190IGlzTm9pc2VSZWR1Y3Rpb25TdXBwb3J0ZWQoUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIGJ0X3N0YXR1c190IGlzVm9pY2VSZWNvZ25pdGlvblN1cHBvcnRlZChSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgU3RhcnRWb2ljZVJlY29nbml0aW9uKFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlOwotICBidF9zdGF0dXNfdCBTdG9wVm9pY2VSZWNvZ25pdGlvbihSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgVm9sdW1lQ29udHJvbChidGhmX3ZvbHVtZV90eXBlX3QgdHlwZSwgaW50IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgRGV2aWNlU3RhdHVzTm90aWZpY2F0aW9uKGJ0aGZfbmV0d29ya19zdGF0ZV90IG50a19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfc2VydmljZV90eXBlX3Qgc3ZjX3R5cGUsIGludCBzaWduYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmF0dF9jaGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgQ29wc1Jlc3BvbnNlKGNvbnN0IGNoYXIqIGNvcHMsIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlOwotICBidF9zdGF0dXNfdCBDaW5kUmVzcG9uc2UoaW50IHN2YywgaW50IG51bV9hY3RpdmUsIGludCBudW1faGVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2FsbF9zdGF0ZV90IGNhbGxfc2V0dXBfc3RhdGUsIGludCBzaWduYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9hbSwgaW50IGJhdHRfY2hnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIGJ0X3N0YXR1c190IEZvcm1hdHRlZEF0UmVzcG9uc2UoY29uc3QgY2hhciogcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlOwotICBidF9zdGF0dXNfdCBBdFJlc3BvbnNlKGJ0aGZfYXRfcmVzcG9uc2VfdCByZXNwb25zZV9jb2RlLCBpbnQgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgYnRfc3RhdHVzX3QgQ2xjY1Jlc3BvbnNlKGludCBpbmRleCwgYnRoZl9jYWxsX2RpcmVjdGlvbl90IGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2FsbF9zdGF0ZV90IHN0YXRlLCBidGhmX2NhbGxfbW9kZV90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NhbGxfbXB0eV90eXBlX3QgbXB0eSwgY29uc3QgY2hhciogbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jYWxsX2FkZHJ0eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlOwotICBidF9zdGF0dXNfdCBQaG9uZVN0YXRlQ2hhbmdlKGludCBudW1fYWN0aXZlLCBpbnQgbnVtX2hlbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jYWxsX3N0YXRlX3QgY2FsbF9zZXR1cF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBudW1iZXIsIGJ0aGZfY2FsbF9hZGRydHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBDbGVhbnVwKCkgb3ZlcnJpZGU7Ci0gIGJ0X3N0YXR1c190IFNldFNjb0FsbG93ZWQoYm9vbCB2YWx1ZSkgb3ZlcnJpZGU7Ci0gIGJ0X3N0YXR1c190IFNlbmRCc2lyKGJvb2wgdmFsdWUsIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlOwotICBidF9zdGF0dXNfdCBTZXRBY3RpdmVEZXZpY2UoUmF3QWRkcmVzcyogYWN0aXZlX2RldmljZV9hZGRyKSBvdmVycmlkZTsKLX07Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OkluaXQoQ2FsbGJhY2tzKiBjYWxsYmFja3MsIGludCBtYXhfaGZfY2xpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKSB7Ci0gIGlmIChpbmJhbmRfcmluZ2luZ19lbmFibGVkKSB7Ci0gICAgYnRpZl9oZl9mZWF0dXJlcyB8PSBCVEFfQUdfRkVBVF9JTkJBTkQ7Ci0gIH0gZWxzZSB7Ci0gICAgYnRpZl9oZl9mZWF0dXJlcyAmPSB+QlRBX0FHX0ZFQVRfSU5CQU5EOwotICB9Ci0gIENIRUNLX0xFKG1heF9oZl9jbGllbnRzLCBCVEFfQUdfTUFYX05VTV9DTElFTlRTKQotICAgICAgPDwgX19mdW5jX18KLSAgICAgIDw8ICJUb28gbWFueSBIRiBjbGllbnRzLCIKLSAgICAgICAgICIgbWF4aW11bSBpcyAiCi0gICAgICA8PCBCVEFfQUdfTUFYX05VTV9DTElFTlRTIDw8ICIgd2FzIGdpdmVuICIgPDwgbWF4X2hmX2NsaWVudHM7Ci0gIGJ0aWZfbWF4X2hmX2NsaWVudHMgPSBtYXhfaGZfY2xpZW50czsKLSAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICIlczogYnRpZl9oZl9mZWF0dXJlcz0lenUsIG1heF9oZl9jbGllbnRzPSVkLCBpbmJhbmRfcmluZ2luZ19lbmFibGVkPSVkIiwKLSAgICAgIF9fZnVuY19fLCBidGlmX2hmX2ZlYXR1cmVzLCBidGlmX21heF9oZl9jbGllbnRzLCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKTsKLSAgYnRfaGZfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICBmb3IgKGJ0aWZfaGZfY2JfdCYgaGZfY2IgOiBidGlmX2hmX2NiKSB7Ci0gICAgcmVzZXRfY29udHJvbF9ibG9jaygmaGZfY2IpOwotICB9Ci0KLS8vIEludm9rZSB0aGUgZW5hYmxlIHNlcnZpY2UgQVBJIHRvIHRoZSBjb3JlIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgc2VydmljZV9pZAotLy8gSW50ZXJuYWxseSwgdGhlIEhTUF9TRVJWSUNFX0lEIHNoYWxsIGFsc28gYmUgZW5hYmxlZCBpZiBIRlAgaXMgZW5hYmxlZAotLy8gKHBob25lKSBvdGhlcndpc2Ugb25seSBIU1AgaXMgZW5hYmxlZCAodGFibGV0KQotI2lmIChkZWZpbmVkKEJUSUZfSEZfU0VSVklDRVMpICYmIChCVElGX0hGX1NFUlZJQ0VTICYgQlRBX0hGUF9TRVJWSUNFX01BU0spKQotICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9IRlBfU0VSVklDRV9JRCk7Ci0jZWxzZQotICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9IU1BfU0VSVklDRV9JRCk7Ci0jZW5kaWYKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OkNvbm5lY3QoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgcmV0dXJuIGJ0aWZfcXVldWVfY29ubmVjdChVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUsIGJkX2FkZHIsIGNvbm5lY3RfaW50KTsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6RGlzY29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEZfSU5JVCgpOwotICBpbnQgaWR4ID0gYnRpZl9oZl9pZHhfYnlfYmRhZGRyKGJkX2FkZHIpOwotICBpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gQlRBX0FHX01BWF9OVU1fQ0xJRU5UUykpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBpbmRleCAlZCIsIF9fZnVuY19fLCBpZHgpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBCVEFfQWdDbG9zZShidGlmX2hmX2NiW2lkeF0uaGFuZGxlKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBIZWFkc2V0SW50ZXJmYWNlOjpDb25uZWN0QXVkaW8oUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgaW50IGlkeCA9IGJ0aWZfaGZfaWR4X2J5X2JkYWRkcihiZF9hZGRyKTsKLSAgaWYgKChpZHggPCAwKSB8fCAoaWR4ID49IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgaW5kZXggJWQiLCBfX2Z1bmNfXywgaWR4KTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgLyogQ2hlY2sgaWYgU0xDIGlzIGNvbm5lY3RlZCAqLwotICBpZiAoIUlzU2xjQ29ubmVjdGVkKGJkX2FkZHIpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiOiBTTEMgbm90IGNvbm5lY3RlZCBmb3IgIiA8PCAqYmRfYWRkcjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotICBkb19pbl9qbmlfdGhyZWFkKGJhc2U6OkJpbmQoJkNhbGxiYWNrczo6QXVkaW9TdGF0ZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFudWFsIHBvaW50ZXIgbWFuYWdlbWVudCBmb3Igbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGJ0X2hmX2NhbGxiYWNrcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEhGX0FVRElPX1NUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYltpZHhdLmNvbm5lY3RlZF9iZGEpKTsKLSAgQlRBX0FnQXVkaW9PcGVuKGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OkRpc2Nvbm5lY3RBdWRpbyhSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEZfSU5JVCgpOwotICBpbnQgaWR4ID0gYnRpZl9oZl9pZHhfYnlfYmRhZGRyKGJkX2FkZHIpOwotICBpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gQlRBX0FHX01BWF9OVU1fQ0xJRU5UUykpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBpbmRleCAlZCIsIF9fZnVuY19fLCBpZHgpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBCVEFfQWdBdWRpb0Nsb3NlKGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OmlzTm9pc2VSZWR1Y3Rpb25TdXBwb3J0ZWQoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgaW50IGlkeCA9IGJ0aWZfaGZfaWR4X2J5X2JkYWRkcihiZF9hZGRyKTsKLSAgaWYgKChpZHggPCAwKSB8fCAoaWR4ID49IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgaW5kZXggJWQiLCBfX2Z1bmNfXywgaWR4KTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgaWYgKCEoYnRpZl9oZl9jYltpZHhdLnBlZXJfZmVhdCAmIEJUQV9BR19QRUVSX0ZFQVRfRUNOUikpIHsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6aXNWb2ljZVJlY29nbml0aW9uU3VwcG9ydGVkKFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIGludCBpZHggPSBidGlmX2hmX2lkeF9ieV9iZGFkZHIoYmRfYWRkcik7Ci0gIGlmICgoaWR4IDwgMCkgfHwgKGlkeCA+PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIGluZGV4ICVkIiwgX19mdW5jX18sIGlkeCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIGlmICghKGJ0aWZfaGZfY2JbaWR4XS5wZWVyX2ZlYXQgJiBCVEFfQUdfUEVFUl9GRUFUX1ZSRUMpKSB7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OlN0YXJ0Vm9pY2VSZWNvZ25pdGlvbihSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEZfSU5JVCgpOwotICBpbnQgaWR4ID0gYnRpZl9oZl9pZHhfYnlfYmRhZGRyKGJkX2FkZHIpOwotICBpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gQlRBX0FHX01BWF9OVU1fQ0xJRU5UUykpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBpbmRleCAlZCIsIF9fZnVuY19fLCBpZHgpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICB9Ci0gIGlmICghKGJ0aWZfaGZfY2JbaWR4XS5wZWVyX2ZlYXQgJiBCVEFfQUdfUEVFUl9GRUFUX1ZSRUMpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHZvaWNlIHJlY29nbml0aW9uIG5vdCBzdXBwb3J0ZWQsIGZlYXR1cmVzPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ0aWZfaGZfY2JbaWR4XS5wZWVyX2ZlYXQpOwotICAgIHJldHVybiBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci0gIH0KLSAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgYWdfcmVzLnN0YXRlID0gdHJ1ZTsKLSAgQlRBX0FnUmVzdWx0KGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUsIEJUQV9BR19CVlJBX1JFUywgYWdfcmVzKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBIZWFkc2V0SW50ZXJmYWNlOjpTdG9wVm9pY2VSZWNvZ25pdGlvbihSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEZfSU5JVCgpOwotICBpbnQgaWR4ID0gYnRpZl9oZl9pZHhfYnlfYmRhZGRyKGJkX2FkZHIpOwotCi0gIGlmICgoaWR4IDwgMCkgfHwgKGlkeCA+PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIGluZGV4ICVkIiwgX19mdW5jX18sIGlkeCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIGlmICghaXNfY29ubmVjdGVkKGJkX2FkZHIpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6ICVzIGlzIG5vdCBjb25uZWN0ZWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHItPlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLSAgaWYgKCEoYnRpZl9oZl9jYltpZHhdLnBlZXJfZmVhdCAmIEJUQV9BR19QRUVSX0ZFQVRfVlJFQykpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogdm9pY2UgcmVjb2duaXRpb24gbm90IHN1cHBvcnRlZCwgZmVhdHVyZXM9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnRpZl9oZl9jYltpZHhdLnBlZXJfZmVhdCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgfQotICB0QlRBX0FHX1JFU19EQVRBIGFnX3JlcyA9IHt9OwotICBhZ19yZXMuc3RhdGUgPSBmYWxzZTsKLSAgQlRBX0FnUmVzdWx0KGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUsIEJUQV9BR19CVlJBX1JFUywgYWdfcmVzKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBIZWFkc2V0SW50ZXJmYWNlOjpWb2x1bWVDb250cm9sKGJ0aGZfdm9sdW1lX3R5cGVfdCB0eXBlLCBpbnQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEZfSU5JVCgpOwotICBpbnQgaWR4ID0gYnRpZl9oZl9pZHhfYnlfYmRhZGRyKGJkX2FkZHIpOwotICBpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gQlRBX0FHX01BWF9OVU1fQ0xJRU5UUykpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBpbmRleCAlZCIsIF9fZnVuY19fLCBpZHgpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICB0QlRBX0FHX1JFU19EQVRBIGFnX3JlcyA9IHt9OwotICBhZ19yZXMubnVtID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHZvbHVtZSk7Ci0gIEJUQV9BZ1Jlc3VsdChidGlmX2hmX2NiW2lkeF0uaGFuZGxlLAotICAgICAgICAgICAgICAgKHR5cGUgPT0gQlRIRl9WT0xVTUVfVFlQRV9TUEspID8gQlRBX0FHX1NQS19SRVMgOiBCVEFfQUdfTUlDX1JFUywKLSAgICAgICAgICAgICAgIGFnX3Jlcyk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6RGV2aWNlU3RhdHVzTm90aWZpY2F0aW9uKAotICAgIGJ0aGZfbmV0d29ya19zdGF0ZV90IG50a19zdGF0ZSwgYnRoZl9zZXJ2aWNlX3R5cGVfdCBzdmNfdHlwZSwgaW50IHNpZ25hbCwKLSAgICBpbnQgYmF0dF9jaGcsIFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIGlmICghYmRfYWRkcikgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGJkX2FkZHIgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgaW50IGlkeCA9IGJ0aWZfaGZfaWR4X2J5X2JkYWRkcihiZF9hZGRyKTsKLSAgaWYgKGlkeCA8IDAgfHwgaWR4ID4gQlRBX0FHX01BWF9OVU1fQ0xJRU5UUykgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGludmFsaWQgaW5kZXggJWQgZm9yICVzIiwgX19mdW5jX18sIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgY29uc3QgYnRpZl9oZl9jYl90JiBjb250cm9sX2Jsb2NrID0gYnRpZl9oZl9jYltpZHhdOwotICAvLyBvayBpZiBubyBkZXZpY2UgaXMgY29ubmVjdGVkCi0gIGlmIChpc19jb25uZWN0ZWQobnVsbHB0cikpIHsKLSAgICAvLyBzZW5kIGFsbCBpbmRpY2F0b3JzIHRvIEJUQS4KLSAgICAvLyBCVEEgd2lsbCBtYWtlIHN1cmUgbm8gZHVwbGljYXRlcyBhcmUgc2VudCBvdXQKLSAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoY29udHJvbF9ibG9jaywgQlRBX0FHX0lORF9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAobnRrX3N0YXRlID09IEJUSEZfTkVUV09SS19TVEFURV9BVkFJTEFCTEUpID8gMSA6IDApOwotICAgIHNlbmRfaW5kaWNhdG9yX3VwZGF0ZShjb250cm9sX2Jsb2NrLCBCVEFfQUdfSU5EX1JPQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChzdmNfdHlwZSA9PSBCVEhGX1NFUlZJQ0VfVFlQRV9IT01FKSA/IDAgOiAxKTsKLSAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoY29udHJvbF9ibG9jaywgQlRBX0FHX0lORF9TSUdOQUwsIHNpZ25hbCk7Ci0gICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKGNvbnRyb2xfYmxvY2ssIEJUQV9BR19JTkRfQkFUVENIRywgYmF0dF9jaGcpOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6Q29wc1Jlc3BvbnNlKGNvbnN0IGNoYXIqIGNvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgaW50IGlkeCA9IGJ0aWZfaGZfaWR4X2J5X2JkYWRkcihiZF9hZGRyKTsKLSAgaWYgKChpZHggPCAwKSB8fCAoaWR4ID49IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgaW5kZXggJWQiLCBfX2Z1bmNfXywgaWR4KTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgaWYgKCFpc19jb25uZWN0ZWQoYmRfYWRkcikpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogJXMgaXMgbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgLyogRm9ybWF0IHRoZSByZXNwb25zZSAqLwotICBzbnByaW50ZihhZ19yZXMuc3RyLCBzaXplb2YoYWdfcmVzLnN0ciksICIwLDAsXCIlLjE2c1wiIiwgY29wcyk7Ci0gIGFnX3Jlcy5va19mbGFnID0gQlRBX0FHX09LX0RPTkU7Ci0gIEJUQV9BZ1Jlc3VsdChidGlmX2hmX2NiW2lkeF0uaGFuZGxlLCBCVEFfQUdfQ09QU19SRVMsIGFnX3Jlcyk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6Q2luZFJlc3BvbnNlKGludCBzdmMsIGludCBudW1fYWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1faGVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NhbGxfc3RhdGVfdCBjYWxsX3NldHVwX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWduYWwsIGludCByb2FtLCBpbnQgYmF0dF9jaGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgaW50IGlkeCA9IGJ0aWZfaGZfaWR4X2J5X2JkYWRkcihiZF9hZGRyKTsKLSAgaWYgKChpZHggPCAwKSB8fCAoaWR4ID49IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgaW5kZXggJWQiLCBfX2Z1bmNfXywgaWR4KTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgaWYgKCFpc19jb25uZWN0ZWQoYmRfYWRkcikpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogJXMgaXMgbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgLy8gcGVyIHRoZSBlcnJhdGEgMjA0MywgY2FsbD0xIGltcGxpZXMgYXRsZWFzdCBvbmUgY2FsbCBpcyBpbiBwcm9ncmVzcwotICAvLyAoYWN0aXZlL2hlbGQpLCBzZWU6Ci0gIC8vIGh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvZXJyYXRhL2VycmF0YV92aWV3LmNmbT9lcnJhdGFfaWQ9MjA0MwotICBzbnByaW50ZihhZ19yZXMuc3RyLCBzaXplb2YoYWdfcmVzLnN0ciksICIlZCwlZCwlZCwlZCwlZCwlZCwlZCIsCi0gICAgICAgICAgIChudW1fYWN0aXZlICsgbnVtX2hlbGQpID8gMSA6IDAsICAgICAgICAgIC8qIENhbGwgc3RhdGUgKi8KLSAgICAgICAgICAgY2FsbHN0YXRlX3RvX2NhbGxzZXR1cChjYWxsX3NldHVwX3N0YXRlKSwgLyogQ2FsbHNldHVwIHN0YXRlICovCi0gICAgICAgICAgIHN2YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5ldHdvcmsgc2VydmljZSAqLwotICAgICAgICAgICBzaWduYWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaWduYWwgc3RyZW5ndGggKi8KLSAgICAgICAgICAgcm9hbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUm9hbWluZyBpbmRpY2F0b3IgKi8KLSAgICAgICAgICAgYmF0dF9jaGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmF0dGVyeSBsZXZlbCAqLwotICAgICAgICAgICAoKG51bV9oZWxkID09IDApID8gMCA6ICgobnVtX2FjdGl2ZSA9PSAwKSA/IDIgOiAxKSkpOyAvKiBDYWxsIGhlbGQgKi8KLSAgQlRBX0FnUmVzdWx0KGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUsIEJUQV9BR19DSU5EX1JFUywgYWdfcmVzKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBIZWFkc2V0SW50ZXJmYWNlOjpGb3JtYXR0ZWRBdFJlc3BvbnNlKGNvbnN0IGNoYXIqIHJzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgaW50IGlkeCA9IGJ0aWZfaGZfaWR4X2J5X2JkYWRkcihiZF9hZGRyKTsKLSAgaWYgKChpZHggPCAwKSB8fCAoaWR4ID49IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgaW5kZXggJWQiLCBfX2Z1bmNfXywgaWR4KTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgaWYgKCFpc19jb25uZWN0ZWQoYmRfYWRkcikpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogJXMgaXMgbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgLyogRm9ybWF0IHRoZSByZXNwb25zZSBhbmQgc2VuZCAqLwotICBzdHJuY3B5KGFnX3Jlcy5zdHIsIHJzcCwgQlRBX0FHX0FUX01BWF9MRU4pOwotICBCVEFfQWdSZXN1bHQoYnRpZl9oZl9jYltpZHhdLmhhbmRsZSwgQlRBX0FHX1VOQVRfUkVTLCBhZ19yZXMpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OkF0UmVzcG9uc2UoYnRoZl9hdF9yZXNwb25zZV90IHJlc3BvbnNlX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9jb2RlLCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEZfSU5JVCgpOwotICBpbnQgaWR4ID0gYnRpZl9oZl9pZHhfYnlfYmRhZGRyKGJkX2FkZHIpOwotICBpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gQlRBX0FHX01BWF9OVU1fQ0xJRU5UUykpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBpbmRleCAlZCIsIF9fZnVuY19fLCBpZHgpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiAlcyBpcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBzZW5kX2F0X3Jlc3VsdCgKLSAgICAgIChyZXNwb25zZV9jb2RlID09IEJUSEZfQVRfUkVTUE9OU0VfT0spID8gQlRBX0FHX09LX0RPTkUgOiBCVEFfQUdfT0tfRVJST1IsCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZXJyb3JfY29kZSksIGlkeCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6Q2xjY1Jlc3BvbnNlKAotICAgIGludCBpbmRleCwgYnRoZl9jYWxsX2RpcmVjdGlvbl90IGRpciwgYnRoZl9jYWxsX3N0YXRlX3Qgc3RhdGUsCi0gICAgYnRoZl9jYWxsX21vZGVfdCBtb2RlLCBidGhmX2NhbGxfbXB0eV90eXBlX3QgbXB0eSwgY29uc3QgY2hhciogbnVtYmVyLAotICAgIGJ0aGZfY2FsbF9hZGRydHlwZV90IHR5cGUsIFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIGludCBpZHggPSBidGlmX2hmX2lkeF9ieV9iZGFkZHIoYmRfYWRkcik7Ci0gIGlmICgoaWR4IDwgMCkgfHwgKGlkeCA+PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIGluZGV4ICVkIiwgX19mdW5jX18sIGlkeCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIGlmICghaXNfY29ubmVjdGVkKGJkX2FkZHIpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6ICVzIGlzIG5vdCBjb25uZWN0ZWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHItPlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIHRCVEFfQUdfUkVTX0RBVEEgYWdfcmVzID0ge307Ci0gIC8qIEZvcm1hdCB0aGUgcmVzcG9uc2UgKi8KLSAgaWYgKGluZGV4ID09IDApIHsKLSAgICBhZ19yZXMub2tfZmxhZyA9IEJUQV9BR19PS19ET05FOwotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVZFTlQoCi0gICAgICAgICJjbGNjX3Jlc3BvbnNlOiBbJWRdIGRpciAlZCBzdGF0ZSAlZCBtb2RlICVkIG51bWJlciA9ICVzIHR5cGUgPSAlZCIsCi0gICAgICAgIGluZGV4LCBkaXIsIHN0YXRlLCBtb2RlLCBudW1iZXIsIHR5cGUpOwotICAgIGludCByZXNfc3RybGVuID0gc25wcmludGYoYWdfcmVzLnN0ciwgc2l6ZW9mKGFnX3Jlcy5zdHIpLCAiJWQsJWQsJWQsJWQsJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGRpciwgc3RhdGUsIG1vZGUsIG1wdHkpOwotICAgIGlmIChudW1iZXIpIHsKLSAgICAgIHNpemVfdCByZW1fYnl0ZXMgPSBzaXplb2YoYWdfcmVzLnN0cikgLSByZXNfc3RybGVuOwotICAgICAgY2hhciBkaWFsbnVtW3NpemVvZihhZ19yZXMuc3RyKV07Ci0gICAgICBzaXplX3QgbmV3aWR4ID0gMDsKLSAgICAgIGlmICh0eXBlID09IEJUSEZfQ0FMTF9BRERSVFlQRV9JTlRFUk5BVElPTkFMICYmICpudW1iZXIgIT0gJysnKSB7Ci0gICAgICAgIGRpYWxudW1bbmV3aWR4KytdID0gJysnOwotICAgICAgfQotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IG51bWJlcltpXSAhPSAwOyBpKyspIHsKLSAgICAgICAgaWYgKG5ld2lkeCA+PSAoc2l6ZW9mKGRpYWxudW0pIC0gcmVzX3N0cmxlbiAtIDEpKSB7Ci0gICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3OTI2NjM4NiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1dGxfaXNkaWFsY2hhcihudW1iZXJbaV0pKSB7Ci0gICAgICAgICAgZGlhbG51bVtuZXdpZHgrK10gPSBudW1iZXJbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGRpYWxudW1bbmV3aWR4XSA9IDA7Ci0gICAgICAvLyBSZXNlcnZlIDUgYnl0ZXMgZm9yIFsiXVssXVszX2RpZ2l0X3R5cGVdCi0gICAgICBzbnByaW50ZigmYWdfcmVzLnN0cltyZXNfc3RybGVuXSwgcmVtX2J5dGVzIC0gNSwgIixcIiVzIiwgZGlhbG51bSk7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZW1haW5pbmdfc3RyaW5nOwotICAgICAgcmVtYWluaW5nX3N0cmluZyA8PCAiXCIsIiA8PCB0eXBlOwotICAgICAgc3RybmNhdCgmYWdfcmVzLnN0cltyZXNfc3RybGVuXSwgcmVtYWluaW5nX3N0cmluZy5zdHIoKS5jX3N0cigpLCA1KTsKLSAgICB9Ci0gIH0KLSAgQlRBX0FnUmVzdWx0KGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUsIEJUQV9BR19DTENDX1JFUywgYWdfcmVzKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBIZWFkc2V0SW50ZXJmYWNlOjpQaG9uZVN0YXRlQ2hhbmdlKAotICAgIGludCBudW1fYWN0aXZlLCBpbnQgbnVtX2hlbGQsIGJ0aGZfY2FsbF9zdGF0ZV90IGNhbGxfc2V0dXBfc3RhdGUsCi0gICAgY29uc3QgY2hhciogbnVtYmVyLCBidGhmX2NhbGxfYWRkcnR5cGVfdCB0eXBlLCBjb25zdCBjaGFyKiBuYW1lLAotICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIGlmIChiZF9hZGRyID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiYmRfYWRkciBpcyBudWxsIik7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyByYXdfYWRkcmVzcygqYmRfYWRkcik7Ci0gIGludCBpZHggPSBidGlmX2hmX2lkeF9ieV9iZGFkZHIoYmRfYWRkcik7Ci0gIGlmIChpZHggPCAwIHx8IGlkeCA+IEJUQV9BR19NQVhfTlVNX0NMSUVOVFMpIHsKLSAgICBMT0dfV0FSTigiSW52YWxpZCBpbmRleCAlZCBmb3IgJXMiLCBpZHgsIFBSSVZBVEVfQUREUkVTUyhyYXdfYWRkcmVzcykpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBjb25zdCBidGlmX2hmX2NiX3QmIGNvbnRyb2xfYmxvY2sgPSBidGlmX2hmX2NiW2lkeF07Ci0gIGlmICghSXNTbGNDb25uZWN0ZWQoYmRfYWRkcikpIHsKLSAgICBMT0coV0FSTklORykgPDwgIjogU0xDIG5vdCBjb25uZWN0ZWQgZm9yICIgPDwgKmJkX2FkZHI7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLSAgaWYgKGNhbGxfc2V0dXBfc3RhdGUgPT0gQlRIRl9DQUxMX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgIC8vIEhGUCBzcGVjIGRvZXMgbm90IGhhbmRsZSBjYXNlcyB3aGVuIGEgY2FsbCBpcyBiZWluZyBkaXNjb25uZWN0ZWQuCi0gICAgLy8gU2luY2UgRElTQ09OTkVDVEVEIHN0YXRlIG11c3QgbGVhZCB0byBJRExFIHN0YXRlLCBpZ25vcmluZyBpdCBoZXJlLnMKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIjogSWdub3JlIGNhbGwgc3RhdGUgY2hhbmdlIHRvIERJU0NPTk5FQ1RFRCwgaWR4PSIgPDwgaWR4Ci0gICAgICAgICAgICAgIDw8ICIsIGFkZHI9IiA8PCAqYmRfYWRkciA8PCAiLCBudW1fYWN0aXZlPSIgPDwgbnVtX2FjdGl2ZQotICAgICAgICAgICAgICA8PCAiLCBudW1faGVsZD0iIDw8IG51bV9oZWxkOwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotICBMT0dfREVCVUcoCi0gICAgICAiYmRfYWRkcjolcyBhY3RpdmVfYmRhOiVzIG51bV9hY3RpdmU6JXUgcHJldl9udW1fYWN0aXZlOiV1IG51bV9oZWxkOiV1ICIKLSAgICAgICJwcmV2X251bV9oZWxkOiV1IGNhbGxfc3RhdGU6JXMgcHJldl9jYWxsX3N0YXRlOiVzIiwKLSAgICAgIFBSSVZBVEVfQUREUkVTUygoKmJkX2FkZHIpKSwgUFJJVkFURV9BRERSRVNTKGFjdGl2ZV9iZGEpLCBudW1fYWN0aXZlLAotICAgICAgY29udHJvbF9ibG9jay5udW1fYWN0aXZlLCBudW1faGVsZCwgY29udHJvbF9ibG9jay5udW1faGVsZCwKLSAgICAgIGR1bXBfaGZfY2FsbF9zdGF0ZShjYWxsX3NldHVwX3N0YXRlKSwKLSAgICAgIGR1bXBfaGZfY2FsbF9zdGF0ZShjb250cm9sX2Jsb2NrLmNhbGxfc2V0dXBfc3RhdGUpKTsKLSAgdEJUQV9BR19SRVMgcmVzID0gQlRBX0FHX1VOS05PV047Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICBib29sIGFjdGl2ZV9jYWxsX3VwZGF0ZWQgPSBmYWxzZTsKLQotICAvKiBpZiBhbGwgaW5kaWNhdG9ycyBhcmUgMCwgc2VuZCBlbmQgY2FsbCBhbmQgcmV0dXJuICovCi0gIGlmIChudW1fYWN0aXZlID09IDAgJiYgbnVtX2hlbGQgPT0gMCAmJgotICAgICAgY2FsbF9zZXR1cF9zdGF0ZSA9PSBCVEhGX0NBTExfU1RBVEVfSURMRSkgewotICAgIGlmIChjb250cm9sX2Jsb2NrLm51bV9hY3RpdmUgPiAwKSB7Ci0gICAgICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCByYXdfYWRkcmVzcywgIkNhbGwgRW5kZWQiKTsKLSAgICB9Ci0gICAgQlRBX0FnUmVzdWx0KGNvbnRyb2xfYmxvY2suaGFuZGxlLCBCVEFfQUdfRU5EX0NBTExfUkVTLAotICAgICAgICAgICAgICAgICB0QlRBX0FHX1JFU19EQVRBOjprRW1wdHkpOwotICAgIC8qIGlmIGhlbGQgY2FsbCB3YXMgcHJlc2VudCwgcmVzZXQgdGhhdCBhcyB3ZWxsICovCi0gICAgaWYgKGNvbnRyb2xfYmxvY2subnVtX2hlbGQpIHsKLSAgICAgIHNlbmRfaW5kaWNhdG9yX3VwZGF0ZShjb250cm9sX2Jsb2NrLCBCVEFfQUdfSU5EX0NBTExIRUxELCAwKTsKLSAgICB9Ci0gICAgVXBkYXRlQ2FsbFN0YXRlcygmYnRpZl9oZl9jYltpZHhdLCBudW1fYWN0aXZlLCBudW1faGVsZCwgY2FsbF9zZXR1cF9zdGF0ZSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qIGFjdGl2ZSBzdGF0ZSBjYW4gY2hhbmdlIHdoZW46Ci0gICoqIDEuIGFuIG91dGdvaW5nL2luY29taW5nIGNhbGwgd2FzIGFuc3dlcmVkCi0gICoqIDIuIGFuIGhlbGQgd2FzIHJlc3VtZWQKLSAgKiogMy4gd2l0aG91dCBjYWxsc2V0dXAgbm90aWZpY2F0aW9ucywgY2FsbCBiZWNhbWUgYWN0aXZlCi0gICoqICgzKSBjYW4gaGFwcGVuIGlmIGNhbGwgaXMgYWN0aXZlIGFuZCBhIGhlYWRzZXQgY29ubmVjdHMgdG8gdXMKLSAgKioKLSAgKiogSW4gdGhlIGNhc2Ugb2YgKDMpLCB3ZSB3aWxsIGhhdmUgdG8gbm90aWZ5IHRoZSBzdGFjayBvZiBhbiBhY3RpdmUKLSAgKiogY2FsbCwgaW5zdGVhZCBvZiBzZW5kaW5nIGFuIGluZGljYXRvciB1cGRhdGUuIFRoaXMgd2lsbCBhbHNvCi0gICoqIGZvcmNlIHRoZSBTQ08gdG8gYmUgc2V0dXAuIEhhbmRsZSB0aGlzIHNwZWNpYWwgY2FzZSBoZXJlIHByaW9yIHRvCi0gICoqIGNhbGwgc2V0dXAgaGFuZGxpbmcKLSAgKi8KLSAgaWYgKCgobnVtX2FjdGl2ZSArIG51bV9oZWxkKSA+IDApICYmIChjb250cm9sX2Jsb2NrLm51bV9hY3RpdmUgPT0gMCkgJiYKLSAgICAgIChjb250cm9sX2Jsb2NrLm51bV9oZWxkID09IDApICYmCi0gICAgICAoY29udHJvbF9ibG9jay5jYWxsX3NldHVwX3N0YXRlID09IEJUSEZfQ0FMTF9TVEFURV9JRExFKSkgewotICAgIHRCVEFfQUdfUkVTX0RBVEEgYWdfcmVzID0ge307Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBBY3RpdmUvSGVsZCBjYWxsIG5vdGlmaWNhdGlvbiByZWNlaXZlZCB3aXRob3V0IGNhbGwgc2V0dXAgIgotICAgICAgICAidXBkYXRlIiwKLSAgICAgICAgX19mdW5jX18pOwotCi0gICAgYWdfcmVzLmF1ZGlvX2hhbmRsZSA9IEJUQV9BR19IQU5ETEVfU0NPX05PX0NIQU5HRTsKLSAgICAvLyBBZGRpdGlvbiBjYWxsIHNldHVwIHdpdGggdGhlIEFjdGl2ZSBjYWxsCi0gICAgLy8gQ0lORCByZXNwb25zZSBzaG91bGQgaGF2ZSBiZWVuIHVwZGF0ZWQuCi0gICAgLy8ganVzdCBvcGVuIFNDTyBjb25uZWN0aW9uLgotICAgIGlmIChjYWxsX3NldHVwX3N0YXRlICE9IEJUSEZfQ0FMTF9TVEFURV9JRExFKSB7Ci0gICAgICByZXMgPSBCVEFfQUdfTVVMVElfQ0FMTF9SRVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlcyA9IEJUQV9BR19PVVRfQ0FMTF9DT05OX1JFUzsKLSAgICB9Ci0gICAgQlRBX0FnUmVzdWx0KGNvbnRyb2xfYmxvY2suaGFuZGxlLCByZXMsIGFnX3Jlcyk7Ci0gICAgYWN0aXZlX2NhbGxfdXBkYXRlZCA9IHRydWU7Ci0gIH0KLQotICAvKiBSaW5naW5nIGNhbGwgY2hhbmdlZD8gKi8KLSAgaWYgKGNhbGxfc2V0dXBfc3RhdGUgIT0gY29udHJvbF9ibG9jay5jYWxsX3NldHVwX3N0YXRlKSB7Ci0gICAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgICBhZ19yZXMuYXVkaW9faGFuZGxlID0gQlRBX0FHX0hBTkRMRV9TQ09fTk9fQ0hBTkdFOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBDYWxsIHNldHVwIHN0YXRlcyBjaGFuZ2VkLiBvbGQ6ICVzIG5ldzogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGR1bXBfaGZfY2FsbF9zdGF0ZShjb250cm9sX2Jsb2NrLmNhbGxfc2V0dXBfc3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgZHVtcF9oZl9jYWxsX3N0YXRlKGNhbGxfc2V0dXBfc3RhdGUpKTsKLSAgICBzd2l0Y2ggKGNhbGxfc2V0dXBfc3RhdGUpIHsKLSAgICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0lETEU6IHsKLSAgICAgICAgc3dpdGNoIChjb250cm9sX2Jsb2NrLmNhbGxfc2V0dXBfc3RhdGUpIHsKLSAgICAgICAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9JTkNPTUlORzoKLSAgICAgICAgICAgIGlmIChudW1fYWN0aXZlID4gY29udHJvbF9ibG9jay5udW1fYWN0aXZlKSB7Ci0gICAgICAgICAgICAgIHJlcyA9IEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTOwotICAgICAgICAgICAgICBpZiAoaXNfYWN0aXZlX2RldmljZSgqYmRfYWRkcikpIHsKLSAgICAgICAgICAgICAgICBhZ19yZXMuYXVkaW9faGFuZGxlID0gY29udHJvbF9ibG9jay5oYW5kbGU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtX2hlbGQgPiBjb250cm9sX2Jsb2NrLm51bV9oZWxkKQotICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcmVzID0gQlRBX0FHX0NBTExfQ0FOQ0VMX1JFUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0RJQUxJTkc6Ci0gICAgICAgICAgY2FzZSBCVEhGX0NBTExfU1RBVEVfQUxFUlRJTkc6Ci0gICAgICAgICAgICBpZiAobnVtX2FjdGl2ZSA+IGNvbnRyb2xfYmxvY2subnVtX2FjdGl2ZSkgewotICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVM7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgcmVzID0gQlRBX0FHX0NBTExfQ0FOQ0VMX1JFUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW5jb3JyZWN0IGNhbGwgc3RhdGUgcHJldj0lZCwgbm93PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbnRyb2xfYmxvY2suY2FsbF9zZXR1cF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9zZXR1cF9zdGF0ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0lOQ09NSU5HOgotICAgICAgICBpZiAobnVtX2FjdGl2ZSB8fCBudW1faGVsZCkgewotICAgICAgICAgIHJlcyA9IEJUQV9BR19DQUxMX1dBSVRfUkVTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlcyA9IEJUQV9BR19JTl9DQUxMX1JFUzsKLSAgICAgICAgICBpZiAoaXNfYWN0aXZlX2RldmljZSgqYmRfYWRkcikpIHsKLSAgICAgICAgICAgIGFnX3Jlcy5hdWRpb19oYW5kbGUgPSBjb250cm9sX2Jsb2NrLmhhbmRsZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bWJlcikgewotICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjYWxsX251bWJlcl9zdHJlYW07Ci0gICAgICAgICAgaWYgKCh0eXBlID09IEJUSEZfQ0FMTF9BRERSVFlQRV9JTlRFUk5BVElPTkFMKSAmJiAoKm51bWJlciAhPSAnKycpKSB7Ci0gICAgICAgICAgICBjYWxsX251bWJlcl9zdHJlYW0gPDwgIlwiKyI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbGxfbnVtYmVyX3N0cmVhbSA8PCAiXCIiOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWVfc3RyOwotICAgICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICBuYW1lX3N0ci5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0ZDo6c3RyaW5nIG51bWJlcl9zdHIobnVtYmVyKTsKLSAgICAgICAgICAvLyAxMyA9IFsiXVsrXVsiXVssXVszX2RpZ2l0X3R5cGVdWywsLF1bIl1bIl1bbnVsbF90ZXJtaW5hdG9yXQotICAgICAgICAgIGludCBvdmVyZmxvd19zaXplID0KLSAgICAgICAgICAgICAgMTMgKyBzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcl9zdHIubGVuZ3RoKCkgKyBuYW1lX3N0ci5sZW5ndGgoKSkgLQotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihhZ19yZXMuc3RyKSk7Ci0gICAgICAgICAgaWYgKG92ZXJmbG93X3NpemUgPiAwKSB7Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc5NDMxMDMxIik7Ci0gICAgICAgICAgICBpbnQgZXh0cmFfb3ZlcmZsb3dfc2l6ZSA9Ci0gICAgICAgICAgICAgICAgb3ZlcmZsb3dfc2l6ZSAtIHN0YXRpY19jYXN0PGludD4obmFtZV9zdHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgaWYgKGV4dHJhX292ZXJmbG93X3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgIG51bWJlcl9zdHIucmVzaXplKG51bWJlcl9zdHIubGVuZ3RoKCkgLSBleHRyYV9vdmVyZmxvd19zaXplKTsKLSAgICAgICAgICAgICAgbmFtZV9zdHIuY2xlYXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG5hbWVfc3RyLnJlc2l6ZShuYW1lX3N0ci5sZW5ndGgoKSAtIG92ZXJmbG93X3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYWxsX251bWJlcl9zdHJlYW0gPDwgbnVtYmVyX3N0ciA8PCAiXCIiOwotCi0gICAgICAgICAgLy8gU3RvcmUgY2FsbGVyIGlkIHN0cmluZyBhbmQgYXBwZW5kIHR5cGUgaW5mby4KLSAgICAgICAgICAvLyBNYWtlIHN1cmUgdHlwZSBpbmZvIGlzIHZhbGlkLCBvdGhlcndpc2UgYWRkIDEyOSBhcyBkZWZhdWx0IHR5cGUKLSAgICAgICAgICBhZ19yZXMubnVtID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHR5cGUpOwotICAgICAgICAgIGlmICgoYWdfcmVzLm51bSA8IEJUQV9BR19DTElQX1RZUEVfTUlOKSB8fAotICAgICAgICAgICAgICAoYWdfcmVzLm51bSA+IEJUQV9BR19DTElQX1RZUEVfTUFYKSkgewotICAgICAgICAgICAgaWYgKGFnX3Jlcy5udW0gIT0gQlRBX0FHX0NMSVBfVFlQRV9WT0lQKSB7Ci0gICAgICAgICAgICAgIGFnX3Jlcy5udW0gPSBCVEFfQUdfQ0xJUF9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHJlcyA9PSBCVEFfQUdfQ0FMTF9XQUlUX1JFUyB8fCBuYW1lX3N0ci5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBjYWxsX251bWJlcl9zdHJlYW0gPDwgIiwiIDw8IHN0ZDo6dG9fc3RyaW5nKGFnX3Jlcy5udW0pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYWxsX251bWJlcl9zdHJlYW0gPDwgIiwiIDw8IHN0ZDo6dG9fc3RyaW5nKGFnX3Jlcy5udW0pIDw8ICIsLCxcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBuYW1lX3N0ciA8PCAiXCIiOwotICAgICAgICAgIH0KLSAgICAgICAgICBzbnByaW50ZihhZ19yZXMuc3RyLCBzaXplb2YoYWdfcmVzLnN0ciksICIlcyIsCi0gICAgICAgICAgICAgICAgICAgY2FsbF9udW1iZXJfc3RyZWFtLnN0cigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBjZWxsX251bWJlcihudW1iZXIpOwotICAgICAgICAgIEJUTV9Mb2dIaXN0b3J5KAotICAgICAgICAgICAgICBrQnRtTG9nVGFnLCByYXdfYWRkcmVzcywgIkNhbGwgSW5jb21pbmciLAotICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIm51bWJlcjolcyIsIFBSSVZBVEVfQ0VMTChjZWxsX251bWJlcikpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBiYXNlOjpTdHJpbmdQcmludGYoIm51bWJlcjolcyIsIFBSSVZBVEVfQ0VMTChudW1iZXIpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEhGX0NBTExfU1RBVEVfRElBTElORzoKLSAgICAgICAgaWYgKCEobnVtX2FjdGl2ZSArIG51bV9oZWxkKSAmJiBpc19hY3RpdmVfZGV2aWNlKCpiZF9hZGRyKSkgewotICAgICAgICAgIGFnX3Jlcy5hdWRpb19oYW5kbGUgPSBjb250cm9sX2Jsb2NrLmhhbmRsZTsKLSAgICAgICAgfQotICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfT1JJR19SRVM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEhGX0NBTExfU1RBVEVfQUxFUlRJTkc6Ci0gICAgICAgIC8qIGlmIHdlIHdlbnQgZnJvbSBpZGxlLT5hbGVydCwgZm9yY2UgU0NPIHNldHVwIGhlcmUuIGRpYWxpbmcgdXN1YWxseQotICAgICAgICAgKiB0cmlnZ2VycyBpdCAqLwotICAgICAgICBpZiAoKGNvbnRyb2xfYmxvY2suY2FsbF9zZXR1cF9zdGF0ZSA9PSBCVEhGX0NBTExfU1RBVEVfSURMRSkgJiYKLSAgICAgICAgICAgICEobnVtX2FjdGl2ZSArIG51bV9oZWxkKSAmJiBpc19hY3RpdmVfZGV2aWNlKCpiZF9hZGRyKSkgewotICAgICAgICAgIGFnX3Jlcy5hdWRpb19oYW5kbGUgPSBjb250cm9sX2Jsb2NrLmhhbmRsZTsKLSAgICAgICAgfQotICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfQUxFUlRfUkVTOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbmNvcnJlY3QgY2FsbCBzdGF0ZSBwcmV2PSVkLCBub3c9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX2Jsb2NrLmNhbGxfc2V0dXBfc3RhdGUsIGNhbGxfc2V0dXBfc3RhdGUpOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IENhbGwgc2V0dXAgc3RhdGUgY2hhbmdlZC4gcmVzPSVkLCBhdWRpb19oYW5kbGU9JWQiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlcywgYWdfcmVzLmF1ZGlvX2hhbmRsZSk7Ci0KLSAgICBpZiAocmVzICE9IDB4RkYpIHsKLSAgICAgIEJUQV9BZ1Jlc3VsdChjb250cm9sX2Jsb2NrLmhhbmRsZSwgcmVzLCBhZ19yZXMpOwotICAgIH0KLQotICAgIC8qIGlmIGNhbGwgc2V0dXAgaXMgaWRsZSwgd2UgaGF2ZSBhbHJlYWR5IHVwZGF0ZWQgY2FsbCBpbmRpY2F0b3IsIGp1bXAgb3V0Ci0gICAgICovCi0gICAgaWYgKGNhbGxfc2V0dXBfc3RhdGUgPT0gQlRIRl9DQUxMX1NUQVRFX0lETEUpIHsKLSAgICAgIC8qIGNoZWNrICYgdXBkYXRlIGNhbGxoZWxkICovCi0gICAgICBpZiAoKG51bV9oZWxkID4gMCkgJiYgKG51bV9hY3RpdmUgPiAwKSkgewotICAgICAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoY29udHJvbF9ibG9jaywgQlRBX0FHX0lORF9DQUxMSEVMRCwgMSk7Ci0gICAgICB9Ci0gICAgICBVcGRhdGVDYWxsU3RhdGVzKCZidGlmX2hmX2NiW2lkeF0sIG51bV9hY3RpdmUsIG51bV9oZWxkLAotICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NldHVwX3N0YXRlKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSBjYWxsIGluZGljYXRvciBjaGFuZ2UKLSAgICoKLSAgICogUGVyIHRoZSBlcnJhdGEgMjA0MywgY2FsbD0xIGltcGxpZXMgYXQgbGVhc3Qgb25lIGNhbGwgaXMgaW4gcHJvZ3Jlc3MKLSAgICogKGFjdGl2ZSBvciBoZWxkKQotICAgKiBTZWU6IGh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvZXJyYXRhL2VycmF0YV92aWV3LmNmbT9lcnJhdGFfaWQ9MjA0MwotICAgKgotICAgKiovCi0gIGlmICghYWN0aXZlX2NhbGxfdXBkYXRlZCAmJgotICAgICAgKChudW1fYWN0aXZlICsgbnVtX2hlbGQpICE9Ci0gICAgICAgKGNvbnRyb2xfYmxvY2subnVtX2FjdGl2ZSArIGNvbnRyb2xfYmxvY2subnVtX2hlbGQpKSkgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogaW4gcHJvZ3Jlc3MgY2FsbCBzdGF0ZXMgY2hhbmdlZCwgYWN0aXZlPVsiCi0gICAgICAgICAgICA8PCBjb250cm9sX2Jsb2NrLm51bV9hY3RpdmUgPDwgIi0+IiA8PCBudW1fYWN0aXZlIDw8ICJdLCBoZWxkPVsiCi0gICAgICAgICAgICA8PCBjb250cm9sX2Jsb2NrLm51bV9oZWxkIDw8ICItPiIgPDwgbnVtX2hlbGQ7Ci0gICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKGNvbnRyb2xfYmxvY2ssIEJUQV9BR19JTkRfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChudW1fYWN0aXZlICsgbnVtX2hlbGQpID4gMCkgPyBCVEFfQUdfQ0FMTF9BQ1RJVkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVEFfQUdfQ0FMTF9JTkFDVElWRSk7Ci0gIH0KLQotICAvKiBIZWxkIENoYW5nZWQ/ICovCi0gIGlmIChudW1faGVsZCAhPSBjb250cm9sX2Jsb2NrLm51bV9oZWxkIHx8Ci0gICAgICAoKG51bV9hY3RpdmUgPT0gMCkgJiYgKChudW1faGVsZCArIGNvbnRyb2xfYmxvY2subnVtX2hlbGQpID4gMSkpKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEhlbGQgY2FsbCBzdGF0ZXMgY2hhbmdlZC4gb2xkOiAlZCBuZXc6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjb250cm9sX2Jsb2NrLm51bV9oZWxkLCBudW1faGVsZCk7Ci0gICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKGNvbnRyb2xfYmxvY2ssIEJUQV9BR19JTkRfQ0FMTEhFTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgobnVtX2hlbGQgPT0gMCkgPyAwIDogKChudW1fYWN0aXZlID09IDApID8gMiA6IDEpKSk7Ci0gIH0KLQotICAvKiBDYWxscyBTd2FwcGVkPyAqLwotICBpZiAoKGNhbGxfc2V0dXBfc3RhdGUgPT0gY29udHJvbF9ibG9jay5jYWxsX3NldHVwX3N0YXRlKSAmJgotICAgICAgKG51bV9hY3RpdmUgJiYgbnVtX2hlbGQpICYmIChudW1fYWN0aXZlID09IGNvbnRyb2xfYmxvY2subnVtX2FjdGl2ZSkgJiYKLSAgICAgIChudW1faGVsZCA9PSBjb250cm9sX2Jsb2NrLm51bV9oZWxkKSkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBDYWxscyBzd2FwcGVkIiwgX19mdW5jX18pOwotICAgIHNlbmRfaW5kaWNhdG9yX3VwZGF0ZShjb250cm9sX2Jsb2NrLCBCVEFfQUdfSU5EX0NBTExIRUxELCAxKTsKLSAgfQotCi0gIC8qIFdoZW4gY2FsbCBpcyBodW5nIHVwIGFuZCBzdGlsbCB0aGVyZSBpcyBhbm90aGVyIGNhbGwgaXMgaW4gYWN0aXZlLAotICAgKiBzb21lIG9mIHRoZSBIRiBjYW5ub3QgYWNxdWlyZSB0aGUgY2FsbCBzdGF0ZXMgYnkgaXRzIG93bi4gSWYgSEYgdHJ5Ci0gICAqIHRvIHRlcm1pbmF0ZSBhIGNhbGwsIGl0IG1heSBub3Qgc2VuZCB0aGUgY29tbWFuZCBBVCtDSFVQIGJlY2F1c2UgdGhlCi0gICAqIGNhbGwgc3RhdGVzIGFyZSBub3QgdXBkYXRlZCBwcm9wZXJseS4gSEYgc2hvdWxkIGdldCBpbmZvcm1lZCB0aGUgY2FsbAotICAgKiBzdGF0dXMgZm9yY2libHkuCi0gICAqLwotICBpZiAoKGNvbnRyb2xfYmxvY2subnVtX2FjdGl2ZSA9PSBudW1fYWN0aXZlICYmIG51bV9hY3RpdmUgIT0gMCkgJiYKLSAgICAgIChjb250cm9sX2Jsb2NrLm51bV9oZWxkICE9IG51bV9oZWxkICYmIG51bV9oZWxkID09IDApKSB7Ci0gICAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXMgPSB7fTsKLSAgICBhZ19yZXMuaW5kLmlkID0gQlRBX0FHX0lORF9DQUxMOwotICAgIGFnX3Jlcy5pbmQudmFsdWUgPSBudW1fYWN0aXZlOwotICAgIEJUQV9BZ1Jlc3VsdChjb250cm9sX2Jsb2NrLmhhbmRsZSwgQlRBX0FHX0lORF9SRVNfT05fREVNQU5ELCBhZ19yZXMpOwotICB9Ci0KLSAgVXBkYXRlQ2FsbFN0YXRlcygmYnRpZl9oZl9jYltpZHhdLCBudW1fYWN0aXZlLCBudW1faGVsZCwgY2FsbF9zZXR1cF9zdGF0ZSk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgSGVhZHNldEludGVyZmFjZTo6Q2xlYW51cCgpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRpZl9xdWV1ZV9jbGVhbnVwKFVVSURfU0VSVkNMQVNTX0FHX0hBTkRTRlJFRSk7Ci0KLSAgdEJUQV9TRVJWSUNFX01BU0sgbWFzayA9IGJ0aWZfZ2V0X2VuYWJsZWRfc2VydmljZXNfbWFzaygpOwotI2lmIChkZWZpbmVkKEJUSUZfSEZfU0VSVklDRVMpICYmIChCVElGX0hGX1NFUlZJQ0VTICYgQlRBX0hGUF9TRVJWSUNFX01BU0spKQotICBpZiAoKG1hc2sgJiAoMSA8PCBCVEFfSEZQX1NFUlZJQ0VfSUQpKSAhPSAwKSB7Ci0gICAgYnRpZl9kaXNhYmxlX3NlcnZpY2UoQlRBX0hGUF9TRVJWSUNFX0lEKTsKLSAgfQotI2Vsc2UKLSAgaWYgKChtYXNrICYgKDEgPDwgQlRBX0hTUF9TRVJWSUNFX0lEKSkgIT0gMCkgewotICAgIGJ0aWZfZGlzYWJsZV9zZXJ2aWNlKEJUQV9IU1BfU0VSVklDRV9JRCk7Ci0gIH0KLSNlbmRpZgotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChbXSgpIHsgYnRfaGZfY2FsbGJhY2tzID0gbnVsbHB0cjsgfSkpOwotfQotCi1idF9zdGF0dXNfdCBIZWFkc2V0SW50ZXJmYWNlOjpTZXRTY29BbGxvd2VkKGJvb2wgdmFsdWUpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIEJUQV9BZ1NldFNjb0FsbG93ZWQodmFsdWUpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEhlYWRzZXRJbnRlcmZhY2U6OlNlbmRCc2lyKGJvb2wgdmFsdWUsIFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQ0hFQ0tfQlRIRl9JTklUKCk7Ci0gIGludCBpZHggPSBidGlmX2hmX2lkeF9ieV9iZGFkZHIoYmRfYWRkcik7Ci0gIGlmICgoaWR4IDwgMCkgfHwgKGlkeCA+PSBCVEFfQUdfTUFYX05VTV9DTElFTlRTKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIGluZGV4ICVkIGZvciAlcyIsIF9fZnVuY19fLCBpZHgsCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiAlcyBub3QgY29ubmVjdGVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICB0QlRBX0FHX1JFU19EQVRBIGFnX3Jlc3VsdCA9IHt9OwotICBhZ19yZXN1bHQuc3RhdGUgPSB2YWx1ZTsKLSAgQlRBX0FnUmVzdWx0KGJ0aWZfaGZfY2JbaWR4XS5oYW5kbGUsIEJUQV9BR19JTkJBTkRfUklOR19SRVMsIGFnX3Jlc3VsdCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgSGVhZHNldEludGVyZmFjZTo6U2V0QWN0aXZlRGV2aWNlKFJhd0FkZHJlc3MqIGFjdGl2ZV9kZXZpY2VfYWRkcikgewotICBDSEVDS19CVEhGX0lOSVQoKTsKLSAgYWN0aXZlX2JkYSA9ICphY3RpdmVfZGV2aWNlX2FkZHI7Ci0gIEJUQV9BZ1NldEFjdGl2ZURldmljZSgqYWN0aXZlX2RldmljZV9hZGRyKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl9leGVjdXRlX3NlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemVzL1NodXRzIGRvd24gdGhlIHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBFeGVjdXRlU2VydmljZShib29sIGJfZW5hYmxlKSB7Ci0gIGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZXNfcmF3W10gPSBCVElGX0hGX1NFUlZJQ0VfTkFNRVM7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZXJ2aWNlX25hbWVzOwotICBmb3IgKGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZV9yYXcgOiBzZXJ2aWNlX25hbWVzX3JhdykgewotICAgIGlmIChzZXJ2aWNlX25hbWVfcmF3KSB7Ci0gICAgICBzZXJ2aWNlX25hbWVzLmVtcGxhY2VfYmFjayhzZXJ2aWNlX25hbWVfcmF3KTsKLSAgICB9Ci0gIH0KLSAgaWYgKGJfZW5hYmxlKSB7Ci0gICAgLyogRW5hYmxlIGFuZCByZWdpc3RlciB3aXRoIEJUQS1BRyAqLwotICAgIEJUQV9BZ0VuYWJsZShidGVfaGZfZXZ0KTsKLSAgICBmb3IgKHVpbnQ4X3QgYXBwX2lkID0gMDsgYXBwX2lkIDwgYnRpZl9tYXhfaGZfY2xpZW50czsgYXBwX2lkKyspIHsKLSAgICAgIEJUQV9BZ1JlZ2lzdGVyKEJUSUZfSEZfU0VSVklDRVMsIGJ0aWZfaGZfZmVhdHVyZXMsIHNlcnZpY2VfbmFtZXMsIGFwcF9pZCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIERlLXJlZ2lzdGVyIEFHICovCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidGlmX21heF9oZl9jbGllbnRzOyBpKyspIHsKLSAgICAgIEJUQV9BZ0RlcmVnaXN0ZXIoYnRpZl9oZl9jYltpXS5oYW5kbGUpOwotICAgIH0KLSAgICAvKiBEaXNhYmxlIEFHICovCi0gICAgQlRBX0FnRGlzYWJsZSgpOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGZfZ2V0X2ludGVyZmFjZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IHRoZSBoZiBjYWxsYmFjayBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0aGZfaW50ZXJmYWNlX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSW50ZXJmYWNlKiBHZXRJbnRlcmZhY2UoKSB7Ci0gIFZMT0coMCkgPDwgX19mdW5jX187Ci0gIHJldHVybiBIZWFkc2V0SW50ZXJmYWNlOjpHZXRJbnN0YW5jZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGVhZHNldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9oZl9jbGllbnQuY2MgYi9idGlmL3NyYy9idGlmX2hmX2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1ZWIyZS4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2hmX2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX2hmX2NsaWVudC5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEhhbmRzZnJlZSBQcm9maWxlIChIRiByb2xlKSBCbHVldG9vdGggSW50ZXJmYWNlCi0gKgotICogIE5vdGVzOgotICogIGEpIExpZmVjeWNsZSBvZiBhIGNvbnRyb2wgYmxvY2sKLSAqICBDb250cm9sIGJsb2NrIGhhbmRsZXMgdGhlIGxpZmVjeWNsZSBmb3IgYSBwYXJ0aWN1bGFyIHJlbW90ZSBkZXZpY2UncwotICogIGNvbm5lY3Rpb24uIFRoZSBjb25uZWN0aW9uIGNhbiBnbyB2aWEgdGhlIGNsYXNzaWMgcGhhc2VzIGJ1dCBtb3JlCi0gKiAgaW1wb3J0YW50bHkgdGhlcmUncyBvbmx5IHR3byBtZXNzYWdlcyBmcm9tIEJUQSB0aGF0IGFmZmVjdCB0aGlzLgotICogIEJUQV9IRl9DTElFTlRfT1BFTl9FVlQgYW5kIEJUQV9IRl9DTElFTlRfQ0xPU0VfRVZULiBTaW5jZSB0aGUgQVBJIGJldHdlZW4KLSAqICBCVElGIGFuZCBCVEEgaXMgY29udHJvbGxlZCBlbnRpcmVseSBieSBoYW5kbGVzIGl0J3MgaW1wb3J0YW50IHRvIGtub3cgd2hlcmUKLSAqICB0aGUgaGFuZGxlcyBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkLiBIYW5kbGVzIGNhbiBiZSBjcmVhdGVkIGF0IHR3bwotICogIGxvY2F0aW9uczoKLSAqICAtLSBXaGlsZSBjb25uZWN0KCkgaXMgY2FsbGVkIGZyb20gQlRJRi4gVGhpcyBpcyBhbiBvdXRnb2luZyBjb25uZWN0aW9uCi0gKiAgLS0gV2hpbGUgYWNjZXB0aW5nIGFuIGluY29taW5nIGNvbm5lY3Rpb24gKHNlZSBCVEFfSEZfQ0xJRU5UX09QRU5fRVZUCi0gKiAgaGFuZGxpbmcpLgotICoKLSAqICBUaGUgZGVzdHJ1Y3Rpb24gb3IgcmF0aGVyIHJldXNlIG9mIGhhbmRsZXMgY2FuIGJlIGRvbmUgd2hlbgotICogIEJUQV9IRl9DTElFTlRfQ0xPU0VfRVZUIGlzIGNhbGxlZC4gUmVmZXIgdG8gdGhlIGV2ZW50IGhhbmRsaW5nIGZvciBkZXRhaWxzCi0gKiAgb2YgdGhpcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9oZmMiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hmX2NsaWVudC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRhX2hmX2NsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfcHJvZmlsZV9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfSEZfQ0xJRU5UX1NFUlZJQ0VfTkFNRQotI2RlZmluZSBCVElGX0hGX0NMSUVOVF9TRVJWSUNFX05BTUUgKCJIYW5kc2ZyZWUiKQotI2VuZGlmCi0KLSNpZm5kZWYgQlRJRl9IRl9DTElFTlRfRkVBVFVSRVMKLSNkZWZpbmUgQlRJRl9IRl9DTElFTlRfRkVBVFVSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChCVEFfSEZfQ0xJRU5UX0ZFQVRfRUNOUiB8IEJUQV9IRl9DTElFTlRfRkVBVF8zV0FZIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgQlRBX0hGX0NMSUVOVF9GRUFUX0NMSSB8IEJUQV9IRl9DTElFTlRfRkVBVF9WUkVDIHwgQlRBX0hGX0NMSUVOVF9GRUFUX1ZPTCB8IFwKLSAgIEJUQV9IRl9DTElFTlRfRkVBVF9FQ1MgfCBCVEFfSEZfQ0xJRU5UX0ZFQVRfRUNDIHwgQlRBX0hGX0NMSUVOVF9GRUFUX0NPREVDKQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTG9jYWwgdHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEJUSUYtSEYgY29udHJvbCBibG9jayB0byBtYXAgYmRhZGRyIHRvIEJUQSBoYW5kbGUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIG9idGFpbmVkIGZybSB0aGUgQlRBCi0gIFJhd0FkZHJlc3MgcGVlcl9iZGE7ICAgICAgICAgICAgICAgICAgIC8vIERldmljZSBjb3JyZXNwb25kaW5nIHRvIGhhbmRsZQotICBidGhmX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGU7ICAvLyBTdGF0ZSBvZiBjdXJyZW50IGNvbm5lY3Rpb24KLSAgdEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUIHBlZXJfZmVhdDsgICAgLy8gSEYgZmVhdHVyZXMKLSAgdEJUQV9IRl9DTElFTlRfQ0hMRF9GRUFUIGNobGRfZmVhdDsgICAgLy8gQVQrQ0hMRD08PiBjb21tYW5kIGZlYXR1cmVzCi19IGJ0aWZfaGZfY2xpZW50X2NiX3Q7Ci0KLS8qIE1heCBkZXZpY2VzIHN1cHBvcnRlZCBieSBCVElGICh1c2VmdWwgdG8gbWF0Y2ggdGhlIHZhbHVlIGluIEJUQSkgKi8KLSNkZWZpbmUgSEZfQ0xJRU5UX01BWF9ERVZJQ0VTIDEwCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QgY2JbSEZfQ0xJRU5UX01BWF9ERVZJQ0VTXTsKLX0gYnRpZl9oZl9jbGllbnRfY2JfYXJyX3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0aWZfaGZfY2xpZW50X2NiX3QqIGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKTsKLWJ0aWZfaGZfY2xpZW50X2NiX3QqIGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEoY29uc3QgUmF3QWRkcmVzcyYgYWRkcik7Ci1ib29sIGlzX2Nvbm5lY3RlZChjb25zdCBidGlmX2hmX2NsaWVudF9jYl90KiBjYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIHZhcmlhYmxlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidGhmX2NsaWVudF9jYWxsYmFja3NfdCogYnRfaGZfY2xpZW50X2NhbGxiYWNrcyA9IE5VTEw7Ci0KLWNoYXIgYnRpZl9oZl9jbGllbnRfdmVyc2lvbltQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi1zdGF0aWMgY29uc3QgY2hhciogZHVtcF9oZl9jbGllbnRfY29ubl9zdGF0ZSh1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORykKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVTktOT1dOIE1TRyBJRCI7Ci0gIH0KLX0KLQotI2RlZmluZSBDSEVDS19CVEhGX0NMSUVOVF9JTklUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidF9oZl9jbGllbnRfY2FsbGJhY2tzID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJCVEhGIENMSUVOVDogJXM6IG5vdCBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsgXAotICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiQlRIRiBDTElFTlQ6ICVzIiwgX19mdW5jX18pOyAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIENIRUNLX0JUSEZfQ0xJRU5UX1NMQ19DT05ORUNURUQoY2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidF9oZl9jbGllbnRfY2FsbGJhY2tzID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIkJUSEYgQ0xJRU5UOiAlczogbm90IGluaXRpYWxpemVkIiwgX19mdW5jX18pOyAgICAgIFwKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gZWxzZSBpZiAoKGNiKS0+c3RhdGUgIT0gQlRIRl9DTElFTlRfQ09OTkVDVElPTl9TVEFURV9TTENfQ09OTkVDVEVEKSB7ICBcCi0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIkJUSEYgQ0xJRU5UOiAlczogU0xDIGNvbm5lY3Rpb24gbm90IHVwLiBzdGF0ZT0lcyIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZHVtcF9oZl9jbGllbnRfY29ubl9zdGF0ZSgoY2IpLT5zdGF0ZSkpOyAgXAotICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoIkJUSEYgQ0xJRU5UOiAlcyIsIF9fZnVuY19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLXN0YXRpYyBidGlmX2hmX2NsaWVudF9jYl9hcnJfdCBidGlmX2hmX2NsaWVudF9jYl9hcnI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgYnRpZl9pbl9oZl9jbGllbnRfZ2VuZXJpY19ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgUHJvY2Vzc2VzIGdlbmVyaWMgZXZlbnRzIHRvIGJlIHNlbnQgdG8gSk5JIHRoYXQgYXJlIG5vdAotICogICAgICAgICAgICAgICAgIHRyaWdnZXJlZCBmcm9tIHRoZSBCVEEuCi0gKiAgICAgICAgICAgICAgICAgQWx3YXlzIHJ1bnMgaW4gQlRJRiBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfaW5faGZfY2xpZW50X2dlbmVyaWNfZXZ0KHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX3BhcmFtKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBSYXdBZGRyZXNzKiBiZF9hZGRyID0gKFJhd0FkZHJlc3MqKXBfcGFyYW07Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byBmaW5kIGJsb2NrIGZvciBiZGEiLCBfX2Z1bmNfXyk7Ci0gIH0KLQotICBCVElGX1RSQUNFX0VWRU5UKCIlczogZXZlbnQ9JWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0hGX0NMSUVOVF9DQl9BVURJT19DT05ORUNUSU5HOiB7Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgYXVkaW9fc3RhdGVfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgKGJ0aGZfY2xpZW50X2F1ZGlvX3N0YXRlX3QpQlRIRl9DTElFTlRfQVVESU9fU1RBVEVfQ09OTkVDVElORyk7Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OiB7Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiA6IFVua25vd24gZXZlbnQgMHgleCIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgaXNfY29ubmVjdGVkKGNvbnN0IGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiKSB7Ci0gIGlmICgoY2ItPnN0YXRlID09IEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEKSB8fAotICAgICAgKGNiLT5zdGF0ZSA9PSBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBub3QgY29ubmVjdGVkISIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBidGlmX2hmX2NsaWVudF9nZXRfY2JfYnlfaGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgIEdldCBjb250cm9sIGJsb2NrIGJ5IGhhbmRsZQotICoKLSAqIFJldHVybnMgICAgICAgICBidGlmX2hmX2NsaWVudF9jYl90IHBvaW50ZXIgaWYgYXZhaWxhYmxlIE5VTEwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0aWZfaGZfY2xpZW50X2NiX3QqIGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYiBieSBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBIRl9DTElFTlRfTUFYX0RFVklDRVM7IGkrKykgewotICAgIC8vIEJsb2NrIGlzIHZhbGlkIG9ubHkgaWYgaXQgaXMgYWxsb2NhdGVkIGkuZS4gc3RhdGUgaXMgbm90IERJU0NPTk5FQ1RFRAotICAgIGlmIChidGlmX2hmX2NsaWVudF9jYl9hcnIuY2JbaV0uc3RhdGUgIT0KLSAgICAgICAgICAgIEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEICYmCi0gICAgICAgIGJ0aWZfaGZfY2xpZW50X2NiX2Fyci5jYltpXS5oYW5kbGUgPT0gaGFuZGxlKSB7Ci0gICAgICByZXR1cm4gJmJ0aWZfaGZfY2xpZW50X2NiX2Fyci5jYltpXTsKLSAgICB9Ci0gIH0KLSAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGNvdWxkIG5vdCBmaW5kIGJsb2NrIGZvciBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgIGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgR2V0IGNvbnRyb2wgYmxvY2sgYnkgYmRhCi0gKgotICogUmV0dXJucyAgICAgICAgIGJ0aWZfaGZfY2xpZW50X2NiX3QgcG9pbnRlciBpZiBhdmFpbGFibGUgTlVMTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRpZl9oZl9jbGllbnRfY2JfdCogYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBpbmNvbWluZyBhZGRyICIgPDwgYmRfYWRkcjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IEhGX0NMSUVOVF9NQVhfREVWSUNFUzsgaSsrKSB7Ci0gICAgLy8gQmxvY2sgaXMgdmFsaWQgb25seSBpZiBpdCBpcyBhbGxvY2F0ZWQgaS5lLiBzdGF0ZSBpcyBub3QgRElTQ09OTkVDVEVECi0gICAgaWYgKGJ0aWZfaGZfY2xpZW50X2NiX2Fyci5jYltpXS5zdGF0ZSAhPQotICAgICAgICAgICAgQlRIRl9DTElFTlRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgJiYKLSAgICAgICAgYnRpZl9oZl9jbGllbnRfY2JfYXJyLmNiW2ldLnBlZXJfYmRhID09IGJkX2FkZHIpIHsKLSAgICAgIHJldHVybiAmYnRpZl9oZl9jbGllbnRfY2JfYXJyLmNiW2ldOwotICAgIH0KLSAgfQotICBCVElGX1RSQUNFX0VSUk9SKCIlczogY291bGQgbm90IGZpbmQgYmxvY2sgZm9yIGJkYWRkciIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgIGJ0aWZfaGZfY2xpZW50X2FsbG9jYXRlX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgIEdldCBjb250cm9sIGJsb2NrIGJ5IGJkYQotICoKLSAqIFJldHVybnMgICAgICAgICBidGlmX2hmX2NsaWVudF9jYl90IHBvaW50ZXIgaWYgYXZhaWxhYmxlIE5VTEwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0aWZfaGZfY2xpZW50X2NiX3QqIGJ0aWZfaGZfY2xpZW50X2FsbG9jYXRlX2NiKCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IEhGX0NMSUVOVF9NQVhfREVWSUNFUzsgaSsrKSB7Ci0gICAgYnRpZl9oZl9jbGllbnRfY2JfdCogY2IgPSAmYnRpZl9oZl9jbGllbnRfY2JfYXJyLmNiW2ldOwotICAgIGlmIChjYi0+c3RhdGUgPT0gQlRIRl9DTElFTlRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgIHJldHVybiBjYjsKLSAgICB9Ci0gIH0KLSAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBjb250cm9sIGJsb2NrIiwgX19mdW5jX18pOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICBidGlmIGhmIGFwaSBmdW5jdGlvbnMgKG5vIGNvbnRleHQgc3dpdGNoKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl9jbGllbnRfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICBpbml0aWFsaXplcyB0aGUgaGYgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0KGJ0aGZfY2xpZW50X2NhbGxiYWNrc190KiBjYWxsYmFja3MpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRfaGZfY2xpZW50X2NhbGxiYWNrcyA9IGNhbGxiYWNrczsKLQotICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9IRlBfSFNfU0VSVklDRV9JRCk7Ci0KLSAgbWVtc2V0KCZidGlmX2hmX2NsaWVudF9jYl9hcnIsIDAsIHNpemVvZihidGlmX2hmX2NsaWVudF9jYl9hcnJfdCkpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgY29ubmVjdCB0byBhdWRpbyBnYXRld2F5Ci0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBjb25uZWN0X2ludChSYXdBZGRyZXNzKiBiZF9hZGRyLCB1aW50MTZfdCB1dWlkKSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfYWxsb2NhdGVfY2IoKTsKLSAgaWYgKGNiID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogY291bGQgbm90IGFsbG9jYXRlIGJsb2NrISIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0JVU1k7Ci0gIH0KLQotICBjYi0+cGVlcl9iZGEgPSAqYmRfYWRkcjsKLSAgaWYgKGlzX2Nvbm5lY3RlZChjYikpIHJldHVybiBCVF9TVEFUVVNfQlVTWTsKLQotICBjYi0+c3RhdGUgPSBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gIGNiLT5wZWVyX2JkYSA9ICpiZF9hZGRyOwotCi0gIC8qIE9wZW4gSEYgY29ubmVjdGlvbiB0byByZW1vdGUgZGV2aWNlIGFuZCBnZXQgdGhlIHJlbGV2YW50IGhhbmRsZS4KLSAgICogVGhlIGhhbmRsZSBpcyB2YWxpZCB1bnRpbCB3ZSBoYXZlIGNhbGxlZCBCVEFfSGZDbGllbnRDbG9zZSBvciB0aGUgTEwKLSAgICogaGFzIG5vdGlmaWVkIHVzIG9mIGNoYW5uZWwgY2xvc2UgZHVlIHRvIHJlbW90ZSBjbG9zaW5nLCBlcnJvciBldGMuCi0gICAqLwotICBCVEFfSGZDbGllbnRPcGVuKGNiLT5wZWVyX2JkYSwgJmNiLT5oYW5kbGUpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGNvbm5lY3QoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBCVElGX1RSQUNFX0VWRU5UKCJIRlAgQ2xpZW50IHZlcnNpb24gaXMgICVzIiwgYnRpZl9oZl9jbGllbnRfdmVyc2lvbik7Ci0gIENIRUNLX0JUSEZfQ0xJRU5UX0lOSVQoKTsKLSAgcmV0dXJuIGJ0aWZfcXVldWVfY29ubmVjdChVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUsIGJkX2FkZHIsIGNvbm5lY3RfaW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGRpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRpc2Nvbm5lY3QgZnJvbSBhdWRpbyBnYXRld2F5Ci0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBkaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQ0hFQ0tfQlRIRl9DTElFTlRfSU5JVCgpOwotCi0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiAhPSBOVUxMKSB7Ci0gICAgQlRBX0hmQ2xpZW50Q2xvc2UoY2ItPmhhbmRsZSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9IGVsc2UgewotICAgIHJldHVybiBCVF9TVEFUVVNfQlVTWTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY29ubmVjdF9hdWRpbwotICoKLSAqIERlc2NyaXB0aW9uICAgICBjcmVhdGUgYW4gYXVkaW8gY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgY29ubmVjdF9hdWRpbyhjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgQ0hFQ0tfQlRIRl9DTElFTlRfU0xDX0NPTk5FQ1RFRChjYik7Ci0KLSAgaWYgKChCVElGX0hGX0NMSUVOVF9GRUFUVVJFUyAmIEJUQV9IRl9DTElFTlRfRkVBVF9DT0RFQykgJiYKLSAgICAgIChjYi0+cGVlcl9mZWF0ICYgQlRBX0hGX0NMSUVOVF9QRUVSX0NPREVDKSkgewotICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CQ0MsIDAsIDAsIE5VTEwpOwotICB9IGVsc2UgewotICAgIEJUQV9IZkNsaWVudEF1ZGlvT3BlbihjYi0+aGFuZGxlKTsKLSAgfQotCi0gIC8qIEluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUgYXVkaW8gY29ubmVjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQKLSAgICogc3VjY2Vzc2Z1bGx5ICovCi0gIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2luX2hmX2NsaWVudF9nZW5lcmljX2V2dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfSEZfQ0xJRU5UX0NCX0FVRElPX0NPTk5FQ1RJTkcsIChjaGFyKiliZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFJhd0FkZHJlc3MpLCBOVUxMKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZGlzY29ubmVjdF9hdWRpbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2xvc2UgdGhlIGF1ZGlvIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGRpc2Nvbm5lY3RfYXVkaW8oY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBidGlmX2hmX2NsaWVudF9jYl90KiBjYiA9IGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEoKmJkX2FkZHIpOwotICBpZiAoY2IgPT0gTlVMTCB8fCAhaXNfY29ubmVjdGVkKGNiKSkgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIENIRUNLX0JUSEZfQ0xJRU5UX1NMQ19DT05ORUNURUQoY2IpOwotCi0gIEJUQV9IZkNsaWVudEF1ZGlvQ2xvc2UoY2ItPmhhbmRsZSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHN0YXJ0X3ZvaWNlX3JlY29nbml0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzdGFydCB2b2ljZSByZWNvZ25pdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHN0YXJ0X3ZvaWNlX3JlY29nbml0aW9uKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgYnRpZl9oZl9jbGllbnRfY2JfdCogY2IgPSBidGlmX2hmX2NsaWVudF9nZXRfY2JfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgfHwgIWlzX2Nvbm5lY3RlZChjYikpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBDSEVDS19CVEhGX0NMSUVOVF9TTENfQ09OTkVDVEVEKGNiKTsKLQotICBpZiAoY2ItPnBlZXJfZmVhdCAmIEJUQV9IRl9DTElFTlRfUEVFUl9GRUFUX1ZSRUMpIHsKLSAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQlZSQSwgMSwgMCwgTlVMTCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzdG9wX3ZvaWNlX3JlY29nbml0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzdG9wIHZvaWNlIHJlY29nbml0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc3RvcF92b2ljZV9yZWNvZ25pdGlvbihjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgQ0hFQ0tfQlRIRl9DTElFTlRfU0xDX0NPTk5FQ1RFRChjYik7Ci0KLSAgaWYgKGNiLT5wZWVyX2ZlYXQgJiBCVEFfSEZfQ0xJRU5UX1BFRVJfRkVBVF9WUkVDKSB7Ci0gICAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JWUkEsIDAsIDAsIE5VTEwpOwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgdm9sdW1lX2NvbnRyb2wKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHZvbHVtZSBjb250cm9sCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgdm9sdW1lX2NvbnRyb2woY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF92b2x1bWVfdHlwZV90IHR5cGUsIGludCB2b2x1bWUpIHsKLSAgYnRpZl9oZl9jbGllbnRfY2JfdCogY2IgPSBidGlmX2hmX2NsaWVudF9nZXRfY2JfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgfHwgIWlzX2Nvbm5lY3RlZChjYikpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBDSEVDS19CVEhGX0NMSUVOVF9TTENfQ09OTkVDVEVEKGNiKTsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX1ZPTFVNRV9UWVBFX1NQSzoKLSAgICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9WR1MsIHZvbHVtZSwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX1ZPTFVNRV9UWVBFX01JQzoKLSAgICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9WR00sIHZvbHVtZSwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGRpYWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHBsYWNlIGEgY2FsbAotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGRpYWwoVU5VU0VEX0FUVFIgY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG51bWJlcikgewotICBidGlmX2hmX2NsaWVudF9jYl90KiBjYiA9IGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEoKmJkX2FkZHIpOwotICBpZiAoY2IgPT0gTlVMTCB8fCAhaXNfY29ubmVjdGVkKGNiKSkgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIENIRUNLX0JUSEZfQ0xJRU5UX1NMQ19DT05ORUNURUQoY2IpOwotCi0gIGlmIChudW1iZXIpIHsKLSAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQVRELCAwLCAwLCBudW1iZXIpOwotICB9IGVsc2UgewotICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CTEROLCAwLCAwLCBOVUxMKTsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBkaWFsX21lbW9yeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcGxhY2UgYSBjYWxsIHdpdGggbnVtYmVyIHNwZWNpZmllZCBieSBsb2NhdGlvbiAoc3BlZWQgZGlhbCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBkaWFsX21lbW9yeShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBpbnQgbG9jYXRpb24pIHsKLSAgYnRpZl9oZl9jbGllbnRfY2JfdCogY2IgPSBidGlmX2hmX2NsaWVudF9nZXRfY2JfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgfHwgIWlzX2Nvbm5lY3RlZChjYikpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBDSEVDS19CVEhGX0NMSUVOVF9TTENfQ09OTkVDVEVEKGNiKTsKLQotICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQVRELCBsb2NhdGlvbiwgMCwgTlVMTCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9jYWxsX2FjdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaGFuZGxlIHNwZWNpZmllZCBjYWxsIHJlbGF0ZWQgYWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgaGFuZGxlX2NhbGxfYWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxfYWN0aW9uX3QgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4KSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgQ0hFQ0tfQlRIRl9DTElFTlRfU0xDX0NPTk5FQ1RFRChjYik7Ci0KLSAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfMDoKLSAgICAgIGlmIChjYi0+Y2hsZF9mZWF0ICYgQlRBX0hGX0NMSUVOVF9DSExEX1JFTCkgewotICAgICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hMRCwgMCwgMCwgTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmV0dXJuIEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfMToKLSAgICAgIC8vIENITEQgMSBpcyBtYW5kYXRvcnkgZm9yIDMgd2F5IGNhbGxpbmcKLSAgICAgIGlmIChjYi0+cGVlcl9mZWF0ICYgQlRBX0hGX0NMSUVOVF9QRUVSX0ZFQVRfM1dBWSkgewotICAgICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hMRCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmV0dXJuIEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfMjoKLSAgICAgIC8vIENITEQgMiBpcyBtYW5kYXRvcnkgZm9yIDMgd2F5IGNhbGxpbmcKLSAgICAgIGlmIChjYi0+cGVlcl9mZWF0ICYgQlRBX0hGX0NMSUVOVF9QRUVSX0ZFQVRfM1dBWSkgewotICAgICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hMRCwgMiwgMCwgTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmV0dXJuIEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfMzoKLSAgICAgIGlmIChjYi0+Y2hsZF9mZWF0ICYgQlRBX0hGX0NMSUVOVF9DSExEX01FUkdFKSB7Ci0gICAgICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DSExELCAzLCAwLCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICAgIGNhc2UgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQ0hMRF80OgotICAgICAgaWYgKGNiLT5jaGxkX2ZlYXQgJiBCVEFfSEZfQ0xJRU5UX0NITERfTUVSR0VfREVUQUNIKSB7Ci0gICAgICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DSExELCA0LCAwLCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICAgIGNhc2UgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQ0hMRF8xeDoKLSAgICAgIGlmIChjYi0+cGVlcl9mZWF0ICYgQlRBX0hGX0NMSUVOVF9QRUVSX0VDQykgewotICAgICAgICBpZiAoaWR4IDwgMSkgewotICAgICAgICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgfQotICAgICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hMRCwgMSwgaWR4LCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICAgIGNhc2UgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQ0hMRF8yeDoKLSAgICAgIGlmIChjYi0+cGVlcl9mZWF0ICYgQlRBX0hGX0NMSUVOVF9QRUVSX0VDQykgewotICAgICAgICBpZiAoaWR4IDwgMSkgewotICAgICAgICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgfQotICAgICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hMRCwgMiwgaWR4LCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICAgIGNhc2UgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQVRBOgotICAgICAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX0FUQSwgMCwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NIVVA6Ci0gICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQ0hVUCwgMCwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0JUUkhfMDoKLSAgICAgIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9CVFJILCAwLCAwLCBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQlRSSF8xOgotICAgICAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JUUkgsIDEsIDAsIE5VTEwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEhGX0NMSUVOVF9DQUxMX0FDVElPTl9CVFJIXzI6Ci0gICAgICBCVEFfSGZDbGllbnRTZW5kQVQoY2ItPmhhbmRsZSwgQlRBX0hGX0NMSUVOVF9BVF9DTURfQlRSSCwgMiwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcXVlcnlfY3VycmVudF9jYWxscwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcXVlcnkgbGlzdCBvZiBjdXJyZW50IGNhbGxzCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgcXVlcnlfY3VycmVudF9jYWxscyhVTlVTRURfQVRUUiBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgQ0hFQ0tfQlRIRl9DTElFTlRfU0xDX0NPTk5FQ1RFRChjYik7Ci0KLSAgaWYgKGNiLT5wZWVyX2ZlYXQgJiBCVEFfSEZfQ0xJRU5UX1BFRVJfRUNTKSB7Ci0gICAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX0NMQ0MsIDAsIDAsIE5VTEwpOwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBxdWVyeV9jdXJyZW50X29wZXJhdG9yX25hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHF1ZXJ5IGN1cnJlbnQgc2VsZWN0ZWQgb3BlcmF0b3IgbmFtZQotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHF1ZXJ5X2N1cnJlbnRfb3BlcmF0b3JfbmFtZShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgQ0hFQ0tfQlRIRl9DTElFTlRfU0xDX0NPTk5FQ1RFRChjYik7Ci0KLSAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX0NPUFMsIDAsIDAsIE5VTEwpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZXRpZXZlX3N1YnNjcmliZXJfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmV0cmlldmUgc3Vic2NyaWJlciBudW1iZXIgaW5mb3JtYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCByZXRyaWV2ZV9zdWJzY3JpYmVyX2luZm8oY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBidGlmX2hmX2NsaWVudF9jYl90KiBjYiA9IGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEoKmJkX2FkZHIpOwotICBpZiAoY2IgPT0gTlVMTCB8fCAhaXNfY29ubmVjdGVkKGNiKSkgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIENIRUNLX0JUSEZfQ0xJRU5UX1NMQ19DT05ORUNURUQoY2IpOwotCi0gIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBCVEFfSEZfQ0xJRU5UX0FUX0NNRF9DTlVNLCAwLCAwLCBOVUxMKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2VuZF9kdG1mCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIGR0bWYKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBzZW5kX2R0bWYoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgY2hhciBjb2RlKSB7Ci0gIGJ0aWZfaGZfY2xpZW50X2NiX3QqIGNiID0gYnRpZl9oZl9jbGllbnRfZ2V0X2NiX2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChjYiA9PSBOVUxMIHx8ICFpc19jb25uZWN0ZWQoY2IpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgQ0hFQ0tfQlRIRl9DTElFTlRfU0xDX0NPTk5FQ1RFRChjYik7Ci0KLSAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX1ZUUywgY29kZSwgMCwgTlVMTCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJlcXVlc3RfbGFzdF92b2ljZV90YWdfbnVtYmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXF1ZXN0IG51bWJlciBmcm9tIEFHIGZvciBWUiBwdXJwb3NlcwotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHJlcXVlc3RfbGFzdF92b2ljZV90YWdfbnVtYmVyKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgYnRpZl9oZl9jbGllbnRfY2JfdCogY2IgPSBidGlmX2hmX2NsaWVudF9nZXRfY2JfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgfHwgIWlzX2Nvbm5lY3RlZChjYikpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBDSEVDS19CVEhGX0NMSUVOVF9TTENfQ09OTkVDVEVEKGNiKTsKLQotICBpZiAoY2ItPnBlZXJfZmVhdCAmIEJUQV9IRl9DTElFTlRfUEVFUl9WVEFHKSB7Ci0gICAgQlRBX0hmQ2xpZW50U2VuZEFUKGNiLT5oYW5kbGUsIEJUQV9IRl9DTElFTlRfQVRfQ01EX0JJTlAsIDEsIDAsIE5VTEwpOwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY2xlYW51cAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xvc2VzIHRoZSBIRiBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNsZWFudXAodm9pZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGlmX3F1ZXVlX2NsZWFudXAoVVVJRF9TRVJWQ0xBU1NfSEZfSEFORFNGUkVFKTsKLSAgaWYgKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MpIHsKLSAgICBidGlmX2Rpc2FibGVfc2VydmljZShCVEFfSEZQX0hTX1NFUlZJQ0VfSUQpOwotICAgIGJ0X2hmX2NsaWVudF9jYWxsYmFja3MgPSBOVUxMOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZW5kX2F0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCByZXF1ZXN0ZWQgQVQgY29tbWFuZCB0byByZW1wdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHNlbmRfYXRfY21kKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGludCBjbWQsIGludCB2YWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwyLCBjb25zdCBjaGFyKiBhcmcpIHsKLSAgYnRpZl9oZl9jbGllbnRfY2JfdCogY2IgPSBidGlmX2hmX2NsaWVudF9nZXRfY2JfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgfHwgIWlzX2Nvbm5lY3RlZChjYikpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBDSEVDS19CVEhGX0NMSUVOVF9TTENfQ09OTkVDVEVEKGNiKTsKLQotICBCVElGX1RSQUNFX0VWRU5UKCIlczogQ21kICVkIHZhbDEgJWQgdmFsMiAlZCBhcmcgJXMiLCBfX2Z1bmNfXywgY21kLCB2YWwxLAotICAgICAgICAgICAgICAgICAgIHZhbDIsIChhcmcgIT0gTlVMTCkgPyBhcmcgOiAiPG51bGw+Iik7Ci0gIEJUQV9IZkNsaWVudFNlbmRBVChjYi0+aGFuZGxlLCBjbWQsIHZhbDEsIHZhbDIsIGFyZyk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgY29uc3QgYnRoZl9jbGllbnRfaW50ZXJmYWNlX3QgYnRoZkNsaWVudEludGVyZmFjZSA9IHsKLSAgICAuc2l6ZSA9IHNpemVvZihidGhmX2NsaWVudF9pbnRlcmZhY2VfdCksCi0gICAgLmluaXQgPSBpbml0LAotICAgIC5jb25uZWN0ID0gY29ubmVjdCwKLSAgICAuZGlzY29ubmVjdCA9IGRpc2Nvbm5lY3QsCi0gICAgLmNvbm5lY3RfYXVkaW8gPSBjb25uZWN0X2F1ZGlvLAotICAgIC5kaXNjb25uZWN0X2F1ZGlvID0gZGlzY29ubmVjdF9hdWRpbywKLSAgICAuc3RhcnRfdm9pY2VfcmVjb2duaXRpb24gPSBzdGFydF92b2ljZV9yZWNvZ25pdGlvbiwKLSAgICAuc3RvcF92b2ljZV9yZWNvZ25pdGlvbiA9IHN0b3Bfdm9pY2VfcmVjb2duaXRpb24sCi0gICAgLnZvbHVtZV9jb250cm9sID0gdm9sdW1lX2NvbnRyb2wsCi0gICAgLmRpYWwgPSBkaWFsLAotICAgIC5kaWFsX21lbW9yeSA9IGRpYWxfbWVtb3J5LAotICAgIC5oYW5kbGVfY2FsbF9hY3Rpb24gPSBoYW5kbGVfY2FsbF9hY3Rpb24sCi0gICAgLnF1ZXJ5X2N1cnJlbnRfY2FsbHMgPSBxdWVyeV9jdXJyZW50X2NhbGxzLAotICAgIC5xdWVyeV9jdXJyZW50X29wZXJhdG9yX25hbWUgPSBxdWVyeV9jdXJyZW50X29wZXJhdG9yX25hbWUsCi0gICAgLnJldHJpZXZlX3N1YnNjcmliZXJfaW5mbyA9IHJldHJpZXZlX3N1YnNjcmliZXJfaW5mbywKLSAgICAuc2VuZF9kdG1mID0gc2VuZF9kdG1mLAotICAgIC5yZXF1ZXN0X2xhc3Rfdm9pY2VfdGFnX251bWJlciA9IHJlcXVlc3RfbGFzdF92b2ljZV90YWdfbnVtYmVyLAotICAgIC5jbGVhbnVwID0gY2xlYW51cCwKLSAgICAuc2VuZF9hdF9jbWQgPSBzZW5kX2F0X2NtZCwKLX07Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfaW5kX2V2dCh0QlRBX0hGX0NMSUVOVF9JTkQqIGluZCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBidGlmX2hmX2NsaWVudF9jYl90KiBjYiA9IGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEoaW5kLT5iZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgfHwgIWlzX2Nvbm5lY3RlZChjYikpIHJldHVybjsKLQotICBzd2l0Y2ggKGluZC0+dHlwZSkgewotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9JTkRfQ0FMTDoKLSAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCBjYWxsX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgIChidGhmX2NsaWVudF9jYWxsX3QpaW5kLT52YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9JTkRfQ0FMTFNFVFVQOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGNhbGxzZXR1cF9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAoYnRoZl9jbGllbnRfY2FsbHNldHVwX3QpaW5kLT52YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfSU5EX0NBTExIRUxEOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGNhbGxoZWxkX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgIChidGhmX2NsaWVudF9jYWxsaGVsZF90KWluZC0+dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfSU5EX1NFUlZJQ0U6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgbmV0d29ya19zdGF0ZV9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAoYnRoZl9jbGllbnRfbmV0d29ya19zdGF0ZV90KWluZC0+dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfSU5EX1NJR05BTDoKLSAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCBuZXR3b3JrX3NpZ25hbF9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBpbmQtPnZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0lORF9ST0FNOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIG5ldHdvcmtfcm9hbWluZ19jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAoYnRoZl9jbGllbnRfc2VydmljZV90eXBlX3QpaW5kLT52YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9JTkRfQkFUVENIOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGJhdHRlcnlfbGV2ZWxfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgaW5kLT52YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl9jbGllbnRfdXBzdHJlYW1zX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXhlY3V0ZXMgSEYgQ0xJRU5UIFVQU1RSRUFNUyBldmVudHMgaW4gYnRpZiBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfaGZfY2xpZW50X3Vwc3RyZWFtc19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgdEJUQV9IRl9DTElFTlQqIHBfZGF0YSA9ICh0QlRBX0hGX0NMSUVOVCopcF9wYXJhbTsKLQotICBidGlmX2hmX2NsaWVudF9jYl90KiBjYiA9IGJ0aWZfaGZfY2xpZW50X2dldF9jYl9ieV9iZGEocF9kYXRhLT5iZF9hZGRyKTsKLSAgaWYgKGNiID09IE5VTEwgJiYgZXZlbnQgPT0gQlRBX0hGX0NMSUVOVF9PUEVOX0VWVCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBldmVudCBCVEFfSEZfQ0xJRU5UX09QRU5fRVZUIGFsbG9jYXRpbmcgYmxvY2siLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIGNiID0gYnRpZl9oZl9jbGllbnRfYWxsb2NhdGVfY2IoKTsKLSAgICBpZiAoY2IgPT0gTlVMTCkgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGV2ZW50IEJUQV9IRl9DTElFTlRfT1BFTl9FVlQgZmFpbGVkIHRvIGFsbG9jYXRlIGNiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2ItPmhhbmRsZSA9IHBfZGF0YS0+b3Blbi5oYW5kbGU7Ci0gICAgY2ItPnBlZXJfYmRhID0gcF9kYXRhLT5vcGVuLmJkX2FkZHI7Ci0gIH0gZWxzZSBpZiAoY2IgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBldmVudCAlZCBidXQgbm90IGFsbG9jYXRpbmcgYmxvY2s6IGNiIG5vdCBmb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZXZlbnQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBldmVudD0lcyAoJXUpIiwgX19mdW5jX18sIGR1bXBfaGZfY2xpZW50X2V2ZW50KGV2ZW50KSwKLSAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9PUEVOX0VWVDoKLSAgICAgIGlmIChwX2RhdGEtPm9wZW4uc3RhdHVzID09IEJUQV9IRl9DTElFTlRfU1VDQ0VTUykgewotICAgICAgICBjYi0+c3RhdGUgPSBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgY2ItPnBlZXJfZmVhdCA9IDA7Ci0gICAgICAgIGNiLT5jaGxkX2ZlYXQgPSAwOwotICAgICAgfSBlbHNlIGlmIChjYi0+c3RhdGUgPT0gQlRIRl9DTElFTlRfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HKSB7Ci0gICAgICAgIGNiLT5zdGF0ZSA9IEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgIiVzOiBIRiBDTGllbnQgb3BlbiBmYWlsZWQsIGJ1dCBhbm90aGVyIGRldmljZSBjb25uZWN0ZWQuICIKLSAgICAgICAgICAgICJzdGF0dXM9JWQgc3RhdGU9JWQgY29ubmVjdGVkIGRldmljZT0lcyIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgcF9kYXRhLT5vcGVuLnN0YXR1cywgY2ItPnN0YXRlLAotICAgICAgICAgICAgY2ItPnBlZXJfYmRhLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgY29ubmVjdGlvbl9zdGF0ZV9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBjYi0+c3RhdGUsIDAsIC8qIHBlZXIgZmVhdCAqLwotICAgICAgICAgICAgICAgIDAgLyogQVQrQ0hMRCBmZWF0ICovKTsKLQotICAgICAgaWYgKGNiLT5zdGF0ZSA9PSBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCkKLSAgICAgICAgY2ItPnBlZXJfYmRhID0gUmF3QWRkcmVzczo6a0FueTsKLQotICAgICAgaWYgKHBfZGF0YS0+b3Blbi5zdGF0dXMgIT0gQlRBX0hGX0NMSUVOVF9TVUNDRVNTKSBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0NPTk5fRVZUOgotICAgICAgY2ItPnBlZXJfZmVhdCA9IHBfZGF0YS0+Y29ubi5wZWVyX2ZlYXQ7Ci0gICAgICBjYi0+Y2hsZF9mZWF0ID0gcF9kYXRhLT5jb25uLmNobGRfZmVhdDsKLSAgICAgIGNiLT5zdGF0ZSA9IEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfU0xDX0NPTk5FQ1RFRDsKLQotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgY2ItPnN0YXRlLCBjYi0+cGVlcl9mZWF0LCBjYi0+Y2hsZF9mZWF0KTsKLQotICAgICAgLyogSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiBhYm91dCBpbi1iYW5kIHJpbmd0b25lICovCi0gICAgICBpZiAoY2ItPnBlZXJfZmVhdCAmIEJUQV9IRl9DTElFTlRfUEVFUl9JTkJBTkQpIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGluX2JhbmRfcmluZ190b25lX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgICAgQlRIRl9DTElFTlRfSU5fQkFORF9SSU5HVE9ORV9QUk9WSURFRCk7Ci0gICAgICB9Ci0KLSAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZSgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQ0xPU0VfRVZUOgotICAgICAgY2ItPnN0YXRlID0gQlRIRl9DTElFTlRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgY29ubmVjdGlvbl9zdGF0ZV9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBjYi0+c3RhdGUsIDAsIDApOwotICAgICAgY2ItPnBlZXJfYmRhID0gUmF3QWRkcmVzczo6a0FueTsKLSAgICAgIGNiLT5wZWVyX2ZlYXQgPSAwOwotICAgICAgY2ItPmNobGRfZmVhdCA9IDA7Ci0gICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0lORF9FVlQ6Ci0gICAgICBwcm9jZXNzX2luZF9ldnQoJnBfZGF0YS0+aW5kKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX01JQ19FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgdm9sdW1lX2NoYW5nZV9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBCVEhGX0NMSUVOVF9WT0xVTUVfVFlQRV9NSUMsIHBfZGF0YS0+dmFsLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1NQS19FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgdm9sdW1lX2NoYW5nZV9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBCVEhGX0NMSUVOVF9WT0xVTUVfVFlQRV9TUEssIHBfZGF0YS0+dmFsLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX1ZPSUNFX1JFQ19FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgdnJfY21kX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgIChidGhmX2NsaWVudF92cl9zdGF0ZV90KXBfZGF0YS0+dmFsLnZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX09QRVJBVE9SX05BTUVfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGN1cnJlbnRfb3BlcmF0b3JfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5vcGVyYXRvcl9uYW1lLm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQ0xJUF9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgY2xpcF9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPm51bWJlci5udW1iZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQklOUF9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgbGFzdF92b2ljZV90YWdfbnVtYmVyX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICZjYi0+cGVlcl9iZGEsIHBfZGF0YS0+bnVtYmVyLm51bWJlcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9DQ1dBX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCBjYWxsX3dhaXRpbmdfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5udW1iZXIubnVtYmVyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FUX1JFU1VMVF9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgY21kX2NvbXBsZXRlX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgIChidGhmX2NsaWVudF9jbWRfY29tcGxldGVfdClwX2RhdGEtPnJlc3VsdC50eXBlLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVzdWx0LmNtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9DTENDX0VWVDoKLSAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCBjdXJyZW50X2NhbGxzX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+Y2xjYy5pZHgsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jbGNjLmluYyA/IEJUSEZfQ0xJRU5UX0NBTExfRElSRUNUSU9OX0lOQ09NSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJUSEZfQ0xJRU5UX0NBTExfRElSRUNUSU9OX09VVEdPSU5HLAotICAgICAgICAgICAgICAgIChidGhmX2NsaWVudF9jYWxsX3N0YXRlX3QpcF9kYXRhLT5jbGNjLnN0YXR1cywKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmNsY2MubXB0eSA/IEJUSEZfQ0xJRU5UX0NBTExfTVBUWV9UWVBFX01VTFRJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVEhGX0NMSUVOVF9DQUxMX01QVFlfVFlQRV9TSU5HTEUsCi0gICAgICAgICAgICAgICAgcF9kYXRhLT5jbGNjLm51bWJlcl9wcmVzZW50ID8gcF9kYXRhLT5jbGNjLm51bWJlciA6ICIiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0NOVU1fRVZUOgotICAgICAgaWYgKHBfZGF0YS0+Y251bS5zZXJ2aWNlID09IDQpIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIHN1YnNjcmliZXJfaW5mb19jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAgIHBfZGF0YS0+Y251bS5udW1iZXIsIEJUSEZfQ0xJRU5UX1NFUlZJQ0VfVk9JQ0UpOwotICAgICAgfSBlbHNlIGlmIChwX2RhdGEtPmNudW0uc2VydmljZSA9PSA1KSB7Ci0gICAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCBzdWJzY3JpYmVyX2luZm9fY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgICBwX2RhdGEtPmNudW0ubnVtYmVyLCBCVEhGX0NMSUVOVF9TRVJWSUNFX0ZBWCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgc3Vic2NyaWJlcl9pbmZvX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgICAgcF9kYXRhLT5jbnVtLm51bWJlciwgQlRIRl9DTElFTlRfU0VSVklDRV9VTktOT1dOKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0JUUkhfRVZUOgotICAgICAgaWYgKHBfZGF0YS0+dmFsLnZhbHVlIDw9IEJUUkhfQ0xJRU5UX1JFU1BfQU5EX0hPTERfUkVKRUNUKSB7Ci0gICAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCByZXNwX2FuZF9ob2xkX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgICAgKGJ0aGZfY2xpZW50X3Jlc3BfYW5kX2hvbGRfdClwX2RhdGEtPnZhbC52YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hGX0NMSUVOVF9CU0lSX0VWVDoKLSAgICAgIGlmIChwX2RhdGEtPnZhbC52YWx1ZSAhPSAwKSB7Ci0gICAgICAgIEhBTF9DQkFDSyhidF9oZl9jbGllbnRfY2FsbGJhY2tzLCBpbl9iYW5kX3JpbmdfdG9uZV9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAgIEJUSEZfQ0xJRU5UX0lOX0JBTkRfUklOR1RPTkVfUFJPVklERUQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGluX2JhbmRfcmluZ190b25lX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgICAgQlRIRl9DTElFTlRfSU5fQkFORF9SSU5HVE9ORV9OT1RfUFJPVklERUQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVVESU9fT1BFTl9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgYXVkaW9fc3RhdGVfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgQlRIRl9DTElFTlRfQVVESU9fU1RBVEVfQ09OTkVDVEVEKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEZfQ0xJRU5UX0FVRElPX01TQkNfT1BFTl9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgYXVkaW9fc3RhdGVfY2IsICZjYi0+cGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgQlRIRl9DTElFTlRfQVVESU9fU1RBVEVfQ09OTkVDVEVEX01TQkMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfQVVESU9fQ0xPU0VfRVZUOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIGF1ZGlvX3N0YXRlX2NiLCAmY2ItPnBlZXJfYmRhLAotICAgICAgICAgICAgICAgIEJUSEZfQ0xJRU5UX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfUklOR19JTkRJQ0FUSU9OOgotICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NsaWVudF9jYWxsYmFja3MsIHJpbmdfaW5kaWNhdGlvbl9jYiwgJmNiLT5wZWVyX2JkYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9IRl9DTElFTlRfVU5LTk9XTl9FVlQ6Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGZfY2xpZW50X2NhbGxiYWNrcywgdW5rbm93bl9ldmVudF9jYiwgJmNiLT5wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnVua25vd24uZXZlbnRfc3RyaW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBVbmhhbmRsZWQgZXZlbnQ6ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfaGZfY2xpZW50X2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3dpdGNoZXMgY29udGV4dCBmcm9tIEJUQSB0byBCVElGIGZvciBhbGwgSEYgQ2xpZW50IGV2ZW50cwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGJ0YV9oZl9jbGllbnRfZXZ0KHRCVEFfSEZfQ0xJRU5UX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEZfQ0xJRU5UKiBwX2RhdGEpIHsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzOwotCi0gIC8qIHN3aXRjaCBjb250ZXh0IHRvIGJ0aWYgdGFzayBjb250ZXh0IChjb3B5IGZ1bGwgdW5pb24gc2l6ZSBmb3IgY29udmVuaWVuY2UpCi0gICAqLwotICBzdGF0dXMgPSBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9oZl9jbGllbnRfdXBzdHJlYW1zX2V2dCwgKHVpbnQxNl90KWV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBfZGF0YSwgc2l6ZW9mKCpwX2RhdGEpLCBOVUxMKTsKLQotICAvKiBjYXRjaCBhbnkgZmFpbGVkIGNvbnRleHQgdHJhbnNmZXJzICovCi0gIEFTU0VSVEMoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTLCAiY29udGV4dCB0cmFuc2ZlciBmYWlsZWQiLCBzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl9jbGllbnRfZXhlY3V0ZV9zZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplcy9TaHV0cyBkb3duIHRoZSBzZXJ2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9oZl9jbGllbnRfZXhlY3V0ZV9zZXJ2aWNlKGJvb2wgYl9lbmFibGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGVuYWJsZTogJWQiLCBfX2Z1bmNfXywgYl9lbmFibGUpOwotCi0gIHRCVEFfSEZfQ0xJRU5UX0ZFQVQgZmVhdHVyZXMgPSBCVElGX0hGX0NMSUVOVF9GRUFUVVJFUzsKLSAgdWludDE2X3QgaGZwX3ZlcnNpb24gPSBCVEFfSEZQX1ZFUlNJT047Ci0gIGlmIChoZnBfdmVyc2lvbiA+PSBIRlBfVkVSU0lPTl8xXzcpIHsKLSAgICBmZWF0dXJlcyB8PSBCVEFfSEZfQ0xJRU5UX0ZFQVRfRVNDT19TNDsKLSAgfQotCi0gIGlmIChiX2VuYWJsZSkgewotICAgIC8qIEVuYWJsZSBhbmQgcmVnaXN0ZXIgd2l0aCBCVEEtSEZDbGllbnQgKi8KLSAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogc3VwcG9ydCBjb2RlYyBuZWdvdGlhdGlvbiAlZCAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzKTsKLSAgICBCVEFfSGZDbGllbnRFbmFibGUoYnRhX2hmX2NsaWVudF9ldnQsIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICBCVElGX0hGX0NMSUVOVF9TRVJWSUNFX05BTUUpOwotICB9IGVsc2UgewotICAgIEJUQV9IZkNsaWVudERpc2FibGUoKTsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hmX2dldF9pbnRlcmZhY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgaGYgY2FsbGJhY2sgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidGhmX2ludGVyZmFjZV90Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGJ0aGZfY2xpZW50X2ludGVyZmFjZV90KiBidGlmX2hmX2NsaWVudF9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRoZkNsaWVudEludGVyZmFjZTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfaGguY2MgYi9idGlmL3NyYy9idGlmX2hoLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWZiYWJlLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfaGguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfaGguYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBISUQgSG9zdCBQcm9maWxlIEJsdWV0b290aCBJbnRlcmZhY2UKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2hoIgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfaGguaCIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfdXRpbC5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfaGguaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oaWRoX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2RlZmluZSBDT0RfSElEX0tFWUJPQVJEIDB4MDU0MAotI2RlZmluZSBDT0RfSElEX1BPSU5USU5HIDB4MDU4MAotI2RlZmluZSBDT0RfSElEX0NPTUJPIDB4MDVDMAotCi0jZGVmaW5lIEhJRF9SRVBPUlRfQ0FQU0xPQ0sgMHgzOQotI2RlZmluZSBISURfUkVQT1JUX05VTUxPQ0sgMHg1MwotI2RlZmluZSBISURfUkVQT1JUX1NDUk9MTExPQ0sgMHg0NwotCi0vLyBGb3IgQXBwbGUgTWFnaWMgTW91c2UKLSNkZWZpbmUgTUFHSUNNT1VTRV9WRU5ET1JfSUQgMHgwNWFjCi0jZGVmaW5lIE1BR0lDTU9VU0VfUFJPRFVDVF9JRCAweDAzMGQKLQotI2RlZmluZSBMT0dJVEVDSF9LQl9NWDU1MDBfVkVORE9SX0lEIDB4MDQ2RAotI2RlZmluZSBMT0dJVEVDSF9LQl9NWDU1MDBfUFJPRFVDVF9JRCAweEIzMEIKLQotc3RhdGljIGludCBidGlmX2hoX2tleWxvY2tzdGF0ZXMgPSAwOyAgLy8gVGhlIGN1cnJlbnQga2V5IHN0YXRlIG9mIGVhY2gga2V5Ci0KLS8vIFRPRE8gVGhpcyBpcyBkdXBsaWNhdGVkIGluIGhlYWRlciBmaWxlIHdpdGggZGlmZmVyZW50IHZhbHVlCi0jZGVmaW5lIEJUSUZfSEhfREVWX0RJU0NPTk5FQ1RFRCAzCi0KLSNkZWZpbmUgQlRJRl9USU1FT1VUX1ZVUF9NUyAoMyAqIDEwMDApCi0KLS8qIEhIIHJlcXVlc3QgZXZlbnRzICovCi10eXBlZGVmIGVudW0gewotICBCVElGX0hIX0NPTk5FQ1RfUkVRX0VWVCA9IDAsCi0gIEJUSUZfSEhfRElTQ09OTkVDVF9SRVFfRVZULAotICBCVElGX0hIX1ZVUF9SRVFfRVZUCi19IGJ0aWZfaGhfcmVxX2V2dF90OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBMb2NhbCB0eXBlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCBoaWRfa2JfbGlzdCB7Ci0gIHVpbnQxNl90IHByb2R1Y3RfaWQ7Ci0gIHVpbnQxNl90IHZlcnNpb25faWQ7Ci0gIGNvbnN0IGNoYXIqIGtiX25hbWU7Ci19IHRISURfS0JfTElTVDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRpZl9oaF9jYl90IGJ0aWZfaGhfY2I7Ci0KLXN0YXRpYyBidGhoX2NhbGxiYWNrc190KiBidF9oaF9jYWxsYmFja3MgPSBOVUxMOwotCi0vKiBMaXN0IG9mIEhJRCBrZXlib2FyZHMgZm9yIHdoaWNoIHRoZSBOVU1MT0NLIHN0YXRlIG5lZWRzIHRvIGJlCi0gKiB0dXJuZWQgT04gYnkgZGVmYXVsdC4gQWRkIGRldmljZXMgdG8gdGhpcyBsaXN0IHRvIGFwcGx5IHRoZQotICogTlVNTE9DSyBzdGF0ZSB0b2dnbGUgb24gZnByIGZpcnN0IGNvbm5lY3QuKi8KLXN0YXRpYyB0SElEX0tCX0xJU1QgaGlkX2tiX251bWxvY2tfb25fbGlzdFtdID0ge3tMT0dJVEVDSF9LQl9NWDU1MDBfUFJPRFVDVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJVEVDSF9LQl9NWDU1MDBfVkVORE9SX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2dpdGVjaCBNWDU1MDAgS2V5Ym9hcmQifX07Ci0KLSNkZWZpbmUgQ0hFQ0tfQlRISF9JTklUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidF9oaF9jYWxsYmFja3MgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiQlRISDogJXM6IEJUSEggbm90IGluaXRpYWxpemVkIiwgX19mdW5jX18pOyBcCi0gICAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBjaGVja19jb2QoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYWRkciwgdWludDMyX3QgY29kKTsKLWV4dGVybiBib29sIGNoZWNrX2NvZF9oaWQoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfaGhfY29fZGVzdHJveShpbnQgZmQpOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2NvX3NlbmRfaGlkX2luZm8oYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZfbmFtZSwgdWludDE2X3QgdmVuZG9yX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZHVjdF9pZCwgdWludDE2X3QgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY3RyeV9jb2RlLCBpbnQgZHNjcF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RzY3ApOwotZXh0ZXJuIHZvaWQgYnRhX2hoX2NvX3dyaXRlKGludCBmZCwgdWludDhfdCogcnB0LCB1aW50MTZfdCBsZW4pOwotZXh0ZXJuIHZvaWQgYnRlX2hoX2V2dCh0QlRBX0hIX0VWVCBldmVudCwgdEJUQV9ISCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0aWZfZG1faGhfb3Blbl9mYWlsZWQoUmF3QWRkcmVzcyogYmRhZGRyKTsKLWV4dGVybiB2b2lkIGJ0aWZfaGRfc2VydmljZV9yZWdpc3RyYXRpb24oKTsKLWV4dGVybiB2b2lkIGJ0aWZfaGhfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgZ2V0X2tleWxvY2tzdGF0ZXMoKSB7IHJldHVybiBidGlmX2hoX2tleWxvY2tzdGF0ZXM7IH0KLQotc3RhdGljIHZvaWQgc2V0X2tleWxvY2tzdGF0ZShpbnQga2V5bWFzaywgYm9vbCBpc1NldCkgewotICBpZiAoaXNTZXQpIGJ0aWZfaGhfa2V5bG9ja3N0YXRlcyB8PSBrZXltYXNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgdG9nZ2xlX29zX2tleWxvY2tzdGF0ZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZ1bmN0aW9uIHRvIHRvZ2dsZSB0aGUga2V5Ym9hcmQgbG9jayBzdGF0ZXMgbWFuYWdlZCBieSB0aGUKLSBsaW51eC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGJ5IHR3byBjYWxsIHBhdGhzCi0gKiAgICAgICAgICAgICAgICAgICgxKSBpZiB0aGUgbG9jayBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQgZnJvbSBhbiBvbnNjcmVlbgotIGtleWJvYXJkLAotICogICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIGxvY2sgc3RhdGUgbWFpbnRhaW5lZAotICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIEhJRCBrZXlib2FyZChzKQotICogICAgICAgICAgICAgICAgICAoMikgaWYgYSBISUQga2V5Ym9hcmQgaXMgZGlzY29ubmVjdGVkIGFuZCByZWNvbm5lY3RlZCwKLSAqICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSBsb2NrIHN0YXRlIG1haW50YWluZWQKLSAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBISUQga2V5Ym9hcmQocykKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdG9nZ2xlX29zX2tleWxvY2tzdGF0ZXMoaW50IGZkLCBpbnQgY2hhbmdlZGxvY2tzdGF0ZXMpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGZkID0gJWQsIGNoYW5nZWRsb2Nrc3RhdGVzID0gMHgleCIsIF9fZnVuY19fLCBmZCwKLSAgICAgICAgICAgICAgICAgICBjaGFuZ2VkbG9ja3N0YXRlcyk7Ci0gIHVpbnQ4X3QgaGlkcmVwb3J0WzldOwotICBpbnQgcmVwb3J0SW5kZXg7Ci0gIG1lbXNldChoaWRyZXBvcnQsIDAsIDkpOwotICBoaWRyZXBvcnRbMF0gPSAxOwotICByZXBvcnRJbmRleCA9IDQ7Ci0KLSAgaWYgKGNoYW5nZWRsb2Nrc3RhdGVzICYgQlRJRl9ISF9LRVlTVEFURV9NQVNLX0NBUFNMT0NLKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgU2V0dGluZyBDQVBTTE9DSyIsIF9fZnVuY19fKTsKLSAgICBoaWRyZXBvcnRbcmVwb3J0SW5kZXgrK10gPSAodWludDhfdClISURfUkVQT1JUX0NBUFNMT0NLOwotICB9Ci0KLSAgaWYgKGNoYW5nZWRsb2Nrc3RhdGVzICYgQlRJRl9ISF9LRVlTVEFURV9NQVNLX05VTUxPQ0spIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBTZXR0aW5nIE5VTUxPQ0siLCBfX2Z1bmNfXyk7Ci0gICAgaGlkcmVwb3J0W3JlcG9ydEluZGV4KytdID0gKHVpbnQ4X3QpSElEX1JFUE9SVF9OVU1MT0NLOwotICB9Ci0KLSAgaWYgKGNoYW5nZWRsb2Nrc3RhdGVzICYgQlRJRl9ISF9LRVlTVEFURV9NQVNLX1NDUk9MTExPQ0spIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBTZXR0aW5nIFNDUk9MTExPQ0siLCBfX2Z1bmNfXyk7Ci0gICAgaGlkcmVwb3J0W3JlcG9ydEluZGV4KytdID0gKHVpbnQ4X3QpSElEX1JFUE9SVF9TQ1JPTExMT0NLOwotICB9Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICJXcml0aW5nIGhpZHJlcG9ydCAjMSB0byBvczogIgotICAgICAgIiVzOiAgJXggJXggJXgiLAotICAgICAgX19mdW5jX18sIGhpZHJlcG9ydFswXSwgaGlkcmVwb3J0WzFdLCBoaWRyZXBvcnRbMl0pOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogICV4ICV4ICV4IiwgX19mdW5jX18sIGhpZHJlcG9ydFszXSwgaGlkcmVwb3J0WzRdLAotICAgICAgICAgICAgICAgICAgIGhpZHJlcG9ydFs1XSk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAgJXggJXggJXgiLCBfX2Z1bmNfXywgaGlkcmVwb3J0WzZdLCBoaWRyZXBvcnRbN10sCi0gICAgICAgICAgICAgICAgICAgaGlkcmVwb3J0WzhdKTsKLSAgYnRhX2hoX2NvX3dyaXRlKGZkLCBoaWRyZXBvcnQsIHNpemVvZihoaWRyZXBvcnQpKTsKLSAgdXNsZWVwKDIwMDAwMCk7Ci0gIG1lbXNldChoaWRyZXBvcnQsIDAsIDkpOwotICBoaWRyZXBvcnRbMF0gPSAxOwotICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgIldyaXRpbmcgaGlkcmVwb3J0ICMyIHRvIG9zOiAiCi0gICAgICAiJXM6ICAleCAleCAleCIsCi0gICAgICBfX2Z1bmNfXywgaGlkcmVwb3J0WzBdLCBoaWRyZXBvcnRbMV0sIGhpZHJlcG9ydFsyXSk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAgJXggJXggJXgiLCBfX2Z1bmNfXywgaGlkcmVwb3J0WzNdLCBoaWRyZXBvcnRbNF0sCi0gICAgICAgICAgICAgICAgICAgaGlkcmVwb3J0WzVdKTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6ICAleCAleCAleCAiLCBfX2Z1bmNfXywgaGlkcmVwb3J0WzZdLCBoaWRyZXBvcnRbN10sCi0gICAgICAgICAgICAgICAgICAgaGlkcmVwb3J0WzhdKTsKLSAgYnRhX2hoX2NvX3dyaXRlKGZkLCBoaWRyZXBvcnQsIHNpemVvZihoaWRyZXBvcnQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNyZWF0ZV9wYnVmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHBfYnVmIGZvciBzZW5kX2RhdGEgb3Igc2V0X3JlcG9ydAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBjcmVhdGVfcGJ1Zih1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIGRhdGEpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MobGVuICsgQlRBX0hIX01JTl9PRkZTRVQgKyBzaXplb2YoQlRfSERSKSk7Ci0gIHVpbnQ4X3QqIHBidWZfZGF0YTsKLQotICBwX2J1Zi0+bGVuID0gbGVuOwotICBwX2J1Zi0+b2Zmc2V0ID0gQlRBX0hIX01JTl9PRkZTRVQ7Ci0KLSAgcGJ1Zl9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLSAgbWVtY3B5KHBidWZfZGF0YSwgZGF0YSwgbGVuKTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB1cGRhdGVfa2V5Ym9hcmRfbG9ja3N0YXRlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZHMgYSByZXBvcnQgdG8gdGhlIGtleWJvYXJkIHRvIHNldCB0aGUgbG9jayBzdGF0ZXMgb2YKLSAqICAgICAgICAgICAgICAgICAga2V5cy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdXBkYXRlX2tleWJvYXJkX2xvY2tzdGF0ZXMoYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYpIHsKLSAgdWludDhfdCBsZW4gPSAyOyAvKiByZXBvcnRpZCArIDEgYnl0ZSByZXBvcnQqLwotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90IGRhdGFbXSA9IHsweDAxLCAvKiByZXBvcnQgaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oYnRpZl9oaF9rZXlsb2Nrc3RhdGVzKX07IC8qIGtleXN0YXRlICovCi0KLSAgLyogU2V0IHJlcG9ydCBmb3Igb3RoZXIga2V5Ym9hcmRzICovCi0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBzZXR0aW5nIHJlcG9ydCBvbiBkZXZfaGFuZGxlICVkIHRvIDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+ZGV2X2hhbmRsZSwgYnRpZl9oaF9rZXlsb2Nrc3RhdGVzKTsKLQotICAvKiBHZXQgU2V0UmVwb3J0IGJ1ZmZlciAqLwotICBwX2J1ZiA9IGNyZWF0ZV9wYnVmKGxlbiwgZGF0YSk7Ci0gIGlmIChwX2J1ZiAhPSBOVUxMKSB7Ci0gICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gQlRBX0hIX1JQVFRfT1VUUFVUOwotICAgIEJUQV9IaFNlbmREYXRhKHBfZGV2LT5kZXZfaGFuZGxlLCBwX2Rldi0+YmRfYWRkciwgcF9idWYpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzeW5jX2xvY2tzdGF0ZV9vbl9jb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGtleWJvYXJkIGxvY2sgc3RhdGVzIG1hbmFnZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgIE9TIHdoZW4gYSBISUQga2V5Ym9hcmQgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBhbmQKLSAqICAgICAgICAgICAgICAgICAgcmVjb25uZWN0ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzeW5jX2xvY2tzdGF0ZV9vbl9jb25uZWN0KGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2KSB7Ci0gIGludCBrZXlsb2Nrc3RhdGVzOwotCi0gIEJUSUZfVFJBQ0VfRVZFTlQoCi0gICAgICAiJXM6IFN5bmNpbmcga2V5Ym9hcmQgbG9jayBzdGF0ZXMgYWZ0ZXIgIgotICAgICAgInJlY29ubmVjdC4uLiIsCi0gICAgICBfX2Z1bmNfXyk7Ci0gIC8qSWYgdGhlIGRldmljZSBpcyBjb25uZWN0ZWQsIHVwZGF0ZSBrZXlib2FyZCBzdGF0ZSAqLwotICB1cGRhdGVfa2V5Ym9hcmRfbG9ja3N0YXRlcyhwX2Rldik7Ci0KLSAgLypDaGVjayBpZiB0aGUgbG9ja3N0YXRlIG9mIGNhcHMsc2Nyb2xsLG51bSBpcyBzZXQuCi0gICBJZiBzbywgc2VuZCBhIHJlcG9ydCB0byB0aGUga2VybmVsCi0gIHNvIHRoZSBsb2Nrc3RhdGUgaXMgaW4gc3luYyAqLwotICBrZXlsb2Nrc3RhdGVzID0gZ2V0X2tleWxvY2tzdGF0ZXMoKTsKLSAgaWYgKGtleWxvY2tzdGF0ZXMpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAiJXM6IFNlbmRpbmcgaGlkIHJlcG9ydCB0byBrZXJuZWwgIgotICAgICAgICAiaW5kaWNhdGluZyBsb2NrIGtleSBzdGF0ZSAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGtleWxvY2tzdGF0ZXMpOwotICAgIHVzbGVlcCgyMDAwMDApOwotICAgIHRvZ2dsZV9vc19rZXlsb2Nrc3RhdGVzKHBfZGV2LT5mZCwga2V5bG9ja3N0YXRlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBOT1Qgc2VuZGluZyBoaWQgcmVwb3J0IHRvIGtlcm5lbCAiCi0gICAgICAgICJpbmRpY2F0aW5nIGxvY2sga2V5IHN0YXRlIDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywga2V5bG9ja3N0YXRlcyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGhfZmluZF9jb25uZWN0ZWRfZGV2X2J5X2hhbmRsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJuIHRoZSBjb25uZWN0ZWQgZGV2aWNlIHBvaW50ZXIgb2YgdGhlIHNwZWNpZmllZCBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgaGFuZGxlCi0gKgotICogUmV0dXJucyAgICAgICAgICBEZXZpY2UgZW50cnkgcG9pbnRlciBpbiB0aGUgZGV2aWNlIHRhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRpZl9oaF9kZXZpY2VfdCogYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfaGFuZGxlKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIHVpbnQzMl90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgIGlmIChidGlmX2hoX2NiLmRldmljZXNbaV0uZGV2X3N0YXR1cyA9PSBCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVEVEICYmCi0gICAgICAgIGJ0aWZfaGhfY2IuZGV2aWNlc1tpXS5kZXZfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgcmV0dXJuICZidGlmX2hoX2NiLmRldmljZXNbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF9maW5kX2Rldl9ieV9iZGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybiB0aGUgZGV2aWNlIHBvaW50ZXIgb2YgdGhlIHNwZWNpZmllZCBSYXdBZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgRGV2aWNlIGVudHJ5IHBvaW50ZXIgaW4gdGhlIGRldmljZSB0YWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidGlmX2hoX2RldmljZV90KiBidGlmX2hoX2ZpbmRfZGV2X2J5X2JkYShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHVpbnQzMl90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgIGlmIChidGlmX2hoX2NiLmRldmljZXNbaV0uZGV2X3N0YXR1cyAhPSBCVEhIX0NPTk5fU1RBVEVfVU5LTk9XTiAmJgotICAgICAgICBidGlmX2hoX2NiLmRldmljZXNbaV0uYmRfYWRkciA9PSBiZF9hZGRyKSB7Ci0gICAgICByZXR1cm4gJmJ0aWZfaGhfY2IuZGV2aWNlc1tpXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9iZGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybiB0aGUgY29ubmVjdGVkIGRldmljZSBwb2ludGVyIG9mIHRoZSBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIERldmljZSBlbnRyeSBwb2ludGVyIGluIHRoZSBkZXZpY2UgdGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRpZl9oaF9kZXZpY2VfdCogYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdWludDMyX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IEJUSUZfSEhfTUFYX0hJRDsgaSsrKSB7Ci0gICAgaWYgKGJ0aWZfaGhfY2IuZGV2aWNlc1tpXS5kZXZfc3RhdHVzID09IEJUSEhfQ09OTl9TVEFURV9DT05ORUNURUQgJiYKLSAgICAgICAgYnRpZl9oaF9jYi5kZXZpY2VzW2ldLmJkX2FkZHIgPT0gYmRfYWRkcikgewotICAgICAgcmV0dXJuICZidGlmX2hoX2NiLmRldmljZXNbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgYnRpZl9oaF9zdG9wX3Z1cF90aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICBzdG9wIHZpdHVhbCB1bnBsdWcgdGltZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9oaF9zdG9wX3Z1cF90aW1lcihSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLQotICBpZiAocF9kZXYgIT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoInN0b3AgVlVQIHRpbWVyIik7Ci0gICAgYWxhcm1fZnJlZShwX2Rldi0+dnVwX3RpbWVyKTsKLSAgICBwX2Rldi0+dnVwX3RpbWVyID0gTlVMTDsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgIGJ0aWZfaGhfc3RhcnRfdnVwX3RpbWVyCi0gKgotICogRGVzY3JpcHRpb24gIHN0YXJ0IHZpcnR1YWwgdW5wbHVnIHRpbWVyCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfaGhfc3RhcnRfdnVwX3RpbWVyKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9iZGEoKmJkX2FkZHIpOwotICBDSEVDSyhwX2RldiAhPSBOVUxMKTsKLQotICBhbGFybV9mcmVlKHBfZGV2LT52dXBfdGltZXIpOwotICBwX2Rldi0+dnVwX3RpbWVyID0gYWxhcm1fbmV3KCJidGlmX2hoLnZ1cF90aW1lciIpOwotICBhbGFybV9zZXRfb25fbWxvb3AocF9kZXYtPnZ1cF90aW1lciwgQlRJRl9USU1FT1VUX1ZVUF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGJ0aWZfaGhfdGltZXJfdGltZW91dCwgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF9hZGRfYWRkZWRfZGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQgYSBuZXcgZGV2aWNlIHRvIHRoZSBhZGRlZCBkZXZpY2UgbGlzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYWRkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGZhbHNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRpZl9oaF9hZGRfYWRkZWRfZGV2KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJUQV9ISF9BVFRSX01BU0sgYXR0cl9tYXNrKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgQlRJRl9ISF9NQVhfQURERURfREVWOyBpKyspIHsKLSAgICBpZiAoYnRpZl9oaF9jYi5hZGRlZF9kZXZpY2VzW2ldLmJkX2FkZHIgPT0gYmRhKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIiBEZXZpY2UgIiA8PCBiZGEgPDwgIiBhbHJlYWR5IGFkZGVkIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IEJUSUZfSEhfTUFYX0FEREVEX0RFVjsgaSsrKSB7Ci0gICAgaWYgKGJ0aWZfaGhfY2IuYWRkZWRfZGV2aWNlc1tpXS5iZF9hZGRyLklzRW1wdHkoKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICIgQWRkZWQgZGV2aWNlICIgPDwgYmRhOwotICAgICAgYnRpZl9oaF9jYi5hZGRlZF9kZXZpY2VzW2ldLmJkX2FkZHIgPSBiZGE7Ci0gICAgICBidGlmX2hoX2NiLmFkZGVkX2RldmljZXNbaV0uZGV2X2hhbmRsZSA9IEJUQV9ISF9JTlZBTElEX0hBTkRMRTsKLSAgICAgIGJ0aWZfaGhfY2IuYWRkZWRfZGV2aWNlc1tpXS5hdHRyX21hc2sgPSBhdHRyX21hc2s7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBFcnJvciwgb3V0IG9mIHNwYWNlIHRvIGFkZCBkZXZpY2UiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKgotICoqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF9yZW1vdmVfZGV2aWNlCi0gKioKLSAqKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZSBhbiBhZGRlZCBkZXZpY2UgZnJvbSB0aGUgc3RhY2suCi0gKioKLSAqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfaGhfcmVtb3ZlX2RldmljZShSYXdBZGRyZXNzIGJkX2FkZHIpIHsKLSAgaW50IGk7Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2OwotICBidGlmX2hoX2FkZGVkX2RldmljZV90KiBwX2FkZGVkX2RldjsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYmRhID0gIiA8PCBiZF9hZGRyOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9BRERFRF9ERVY7IGkrKykgewotICAgIHBfYWRkZWRfZGV2ID0gJmJ0aWZfaGhfY2IuYWRkZWRfZGV2aWNlc1tpXTsKLSAgICBpZiAocF9hZGRlZF9kZXYtPmJkX2FkZHIgPT0gYmRfYWRkcikgewotICAgICAgQlRBX0hoUmVtb3ZlRGV2KHBfYWRkZWRfZGV2LT5kZXZfaGFuZGxlKTsKLSAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfaGlkX2luZm8ocF9hZGRlZF9kZXYtPmJkX2FkZHIpOwotICAgICAgcF9hZGRlZF9kZXYtPmJkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgICBwX2FkZGVkX2Rldi0+ZGV2X2hhbmRsZSA9IEJUQV9ISF9JTlZBTElEX0hBTkRMRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Rldl9ieV9iZGEoYmRfYWRkcik7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICIgT29wcywgY2FuJ3QgZmluZCBkZXZpY2UgIiA8PCBiZF9hZGRyOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIG5lZWQgdG8gbm90aWZ5IHVwLWxheWVyIGRldmljZSBpcyBkaXNjb25uZWN0ZWQgdG8gYXZvaWQgc3RhdGUgb3V0IG9mIHN5bmMKLSAgICogd2l0aCB1cC1sYXllciAqLwotCi0gIGRvX2luX2puaV90aHJlYWQoYmFzZTo6QmluZCgKLSAgICAgIFtdKFJhd0FkZHJlc3MgYmRfYWRkcikgewotICAgICAgICBIQUxfQ0JBQ0soYnRfaGhfY2FsbGJhY2tzLCBjb25uZWN0aW9uX3N0YXRlX2NiLCAmYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgIEJUSEhfQ09OTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgfSwKLSAgICAgIHBfZGV2LT5iZF9hZGRyKSk7Ci0KLSAgcF9kZXYtPmRldl9zdGF0dXMgPSBCVEhIX0NPTk5fU1RBVEVfVU5LTk9XTjsKLSAgcF9kZXYtPmRldl9oYW5kbGUgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0gIHBfZGV2LT5yZWFkeV9mb3JfZGF0YSA9IGZhbHNlOwotCi0gIGlmIChidGlmX2hoX2NiLmRldmljZV9udW0gPiAwKSB7Ci0gICAgYnRpZl9oaF9jYi5kZXZpY2VfbnVtLS07Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogZGV2aWNlX251bSA9IDAiLCBfX2Z1bmNfXyk7Ci0gIH0KLQotICBwX2Rldi0+aGhfa2VlcF9wb2xsaW5nID0gMDsKLSAgcF9kZXYtPmhoX3BvbGxfdGhyZWFkX2lkID0gLTE7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiB1aGlkIGZkID0gJWQiLCBfX2Z1bmNfXywgcF9kZXYtPmZkKTsKLSAgaWYgKHBfZGV2LT5mZCA+PSAwKSB7Ci0gICAgYnRhX2hoX2NvX2Rlc3Ryb3kocF9kZXYtPmZkKTsKLSAgICBwX2Rldi0+ZmQgPSAtMTsKLSAgfQotfQotCi1ib29sIGJ0aWZfaGhfY29weV9oaWRfaW5mbyh0QlRBX0hIX0RFVl9EU0NQX0lORk8qIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX0RFVl9EU0NQX0lORk8qIHNyYykgewotICBtZW1zZXQoZGVzdCwgMCwgc2l6ZW9mKHRCVEFfSEhfREVWX0RTQ1BfSU5GTykpOwotICBkZXN0LT5kZXNjcmlwdG9yLmRsX2xlbiA9IDA7Ci0gIGlmIChzcmMtPmRlc2NyaXB0b3IuZGxfbGVuID4gMCkgewotICAgIGRlc3QtPmRlc2NyaXB0b3IuZHNjX2xpc3QgPSAodWludDhfdCopb3NpX21hbGxvYyhzcmMtPmRlc2NyaXB0b3IuZGxfbGVuKTsKLSAgfQotICBtZW1jcHkoZGVzdC0+ZGVzY3JpcHRvci5kc2NfbGlzdCwgc3JjLT5kZXNjcmlwdG9yLmRzY19saXN0LAotICAgICAgICAgc3JjLT5kZXNjcmlwdG9yLmRsX2xlbik7Ci0gIGRlc3QtPmRlc2NyaXB0b3IuZGxfbGVuID0gc3JjLT5kZXNjcmlwdG9yLmRsX2xlbjsKLSAgZGVzdC0+dmVuZG9yX2lkID0gc3JjLT52ZW5kb3JfaWQ7Ci0gIGRlc3QtPnByb2R1Y3RfaWQgPSBzcmMtPnByb2R1Y3RfaWQ7Ci0gIGRlc3QtPnZlcnNpb24gPSBzcmMtPnZlcnNpb247Ci0gIGRlc3QtPmN0cnlfY29kZSA9IHNyYy0+Y3RyeV9jb2RlOwotICBkZXN0LT5zc3JfbWF4X2xhdGVuY3kgPSBzcmMtPnNzcl9tYXhfbGF0ZW5jeTsKLSAgZGVzdC0+c3NyX21pbl90b3V0ID0gc3JjLT5zc3JfbWluX3RvdXQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF92aXJ0dWFsX3VucGx1ZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVmlydHVhbCB1bnBsdWcgaW5pdGlhdGVkIGZyb20gdGhlIEJUSUYgdGhyZWFkIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgU3BlY2lhbCBoYW5kbGluZyBmb3IgSElEIG1vdXNlLQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJ0X3N0YXR1c190IGJ0aWZfaGhfdmlydHVhbF91bnBsdWcoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXY7Ci0gIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Rldl9ieV9iZGEoKmJkX2FkZHIpOwotICBpZiAoKHBfZGV2ICE9IE5VTEwpICYmIChwX2Rldi0+ZGV2X3N0YXR1cyA9PSBCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVEVEKSAmJgotICAgICAgKHBfZGV2LT5hdHRyX21hc2sgJiBISURfVklSVFVBTF9DQUJMRSkpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogU2VuZGluZyBCVEFfSEhfQ1RSTF9WSVJUVUFMX0NBQkxFX1VOUExVRyBmb3I6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIC8qIHN0YXJ0IHRoZSB0aW1lciAqLwotICAgIGJ0aWZfaGhfc3RhcnRfdnVwX3RpbWVyKGJkX2FkZHIpOwotICAgIHBfZGV2LT5sb2NhbF92dXAgPSB0cnVlOwotICAgIEJUQV9IaFNlbmRDdHJsKHBfZGV2LT5kZXZfaGFuZGxlLCBCVEFfSEhfQ1RSTF9WSVJUVUFMX0NBQkxFX1VOUExVRyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9IGVsc2UgaWYgKChwX2RldiAhPSBOVUxMKSAmJgotICAgICAgICAgICAgIChwX2Rldi0+ZGV2X3N0YXR1cyA9PSBCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVEVEKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBWaXJ0dWFsIHVucGx1ZyBub3Qgc3Vwb3J0ZWQsIGRpc2Nvbm5lY3RpbmcgZGV2aWNlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAvKiBzdGFydCB0aGUgdGltZXIgKi8KLSAgICBidGlmX2hoX3N0YXJ0X3Z1cF90aW1lcihiZF9hZGRyKTsKLSAgICBwX2Rldi0+bG9jYWxfdnVwID0gdHJ1ZTsKLSAgICBCVEFfSGhDbG9zZShwX2Rldi0+ZGV2X2hhbmRsZSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgZGV2aWNlICVzIG5vdCBvcGVuZWQsIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCksIGJ0aWZfaGhfY2Iuc3RhdHVzKTsKLSAgICBpZiAoKGJ0aWZfaGhfY2IucGVuZGluZ19jb25uX2FkZHJlc3MgPT0gKmJkX2FkZHIpICYmCi0gICAgICAgKGJ0aWZfaGhfY2Iuc3RhdHVzID09IEJUSUZfSEhfREVWX0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgYnRpZl9oaF9jYi5zdGF0dXMgPSAoQlRJRl9ISF9TVEFUVVMpQlRJRl9ISF9ERVZfRElTQ09OTkVDVEVEOwotICAgICAgICAgIGJ0aWZfaGhfY2IucGVuZGluZ19jb25uX2FkZHJlc3MgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgfQotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF9jb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBjb25uZWN0aW9uIGluaXRpYXRlZCBmcm9tIHRoZSBCVElGIHRocmVhZCBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBpbnQgc3RhdHVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYnRfc3RhdHVzX3QgYnRpZl9oaF9jb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgYnRpZl9oaF9hZGRlZF9kZXZpY2VfdCogYWRkZWRfZGV2ID0gTlVMTDsKLSAgQ0hFQ0tfQlRISF9JTklUKCk7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIkJUSEg6ICVzIiwgX19mdW5jX18pOwotICBidGlmX2hoX2RldmljZV90KiBkZXYgPSBidGlmX2hoX2ZpbmRfZGV2X2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmICghZGV2ICYmIGJ0aWZfaGhfY2IuZGV2aWNlX251bSA+PSBCVElGX0hIX01BWF9ISUQpIHsKLSAgICAvLyBObyBzcGFjZSBmb3IgbW9yZSBISUQgZGV2aWNlIG5vdy4KLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICIlczogRXJyb3IsIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBISUQgZGV2aWNlIG51bWJlciAlZCIsCi0gICAgICAgIF9fZnVuY19fLCBCVElGX0hIX01BWF9ISUQpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQlRJRl9ISF9NQVhfQURERURfREVWOyBpKyspIHsKLSAgICBpZiAoYnRpZl9oaF9jYi5hZGRlZF9kZXZpY2VzW2ldLmJkX2FkZHIgPT0gKmJkX2FkZHIpIHsKLSAgICAgIGFkZGVkX2RldiA9ICZidGlmX2hoX2NiLmFkZGVkX2RldmljZXNbaV07Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogRGV2aWNlICIgPDwgKmJkX2FkZHIKLSAgICAgICAgICAgICAgICAgICA8PCAiIGFscmVhZHkgYWRkZWQsIGF0dHJfbWFzayA9IDB4IiA8PCBzdGQ6OmhleAotICAgICAgICAgICAgICAgICAgIDw8IGFkZGVkX2Rldi0+YXR0cl9tYXNrOwotICAgIH0KLSAgfQotCi0gIGlmIChhZGRlZF9kZXYgIT0gTlVMTCkgewotICAgIGlmIChhZGRlZF9kZXYtPmRldl9oYW5kbGUgPT0gQlRBX0hIX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICAvLyBObyBzcGFjZSBmb3IgbW9yZSBISUQgZGV2aWNlIG5vdy4KLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRXJyb3IsIGRldmljZSAiIDw8ICpiZF9hZGRyCi0gICAgICAgICAgICAgICAgIDw8ICIgYWRkZWQgYnV0IGFkZGl0aW9uIGZhaWxlZCI7Ci0gICAgICBhZGRlZF9kZXYtPmJkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgICBhZGRlZF9kZXYtPmRldl9oYW5kbGUgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgfQotICB9Ci0KLSAgLyogTm90IGNoZWNraW5nIHRoZSBOT1JNQUxMWV9Db25uZWN0aWJsZSBmbGFncyBmcm9tIHNkcCByZWNvcmQsIGFuZCBhbnl3YXlzCi0gICBzZW5kaW5nIHRoaXMKLSAgIHJlcXVlc3QgZnJvbSBob3N0LCBmb3Igc3Vic2VxdWVudCB1c2VyIGluaXRpYXRlZCBjb25uZWN0aW9uLiBJZiB0aGUgcmVtb3RlIGlzCi0gICBub3QgaW4KLSAgIHBhZ2VzY2FuIG1vZGUsIHdlIHdpbGwgZG8gMiByZXRyaWVzIHRvIGNvbm5lY3QgYmVmb3JlIGdpdmluZyB1cCAqLwotICBidGlmX2hoX2NiLnN0YXR1cyA9IEJUSUZfSEhfREVWX0NPTk5FQ1RJTkc7Ci0gIGJ0aWZfaGhfY2IucGVuZGluZ19jb25uX2FkZHJlc3MgPSAqYmRfYWRkcjsKLSAgQlRBX0hoT3BlbigqYmRfYWRkcik7Ci0KLSAgLy8gVE9ETyhqcGF3bG93c2tpKTsgbWFrZSBjYmFjayBhY2NlcHQgY29uc3QgYW5kIHJlbW92ZSB0bXAhCi0gIGF1dG8gdG1wID0gKmJkX2FkZHI7Ci0gIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsICZ0bXAsCi0gICAgICAgICAgICBCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVElORyk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGhfZGlzY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZGlzY29ubmVjdGlvbiBpbml0aWF0ZWQgZnJvbSB0aGUgQlRJRiB0aHJlYWQgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfaGhfZGlzY29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLKGJkX2FkZHIgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKHBfZGV2ID09IG51bGxwdHIpIHsKLSAgICBMT0dfREVCVUcoIlVuYWJsZSB0byBkaXNjb25uZWN0IHVua25vd24gSElEIGRldmljZTolcyIsCi0gICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUygoKmJkX2FkZHIpKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPR19ERUJVRygiRGlzY29ubmVjdCBhbmQgY2xvc2UgcmVxdWVzdCBmb3IgSElEIGRldmljZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoKCpiZF9hZGRyKSkpOwotICBCVEFfSGhDbG9zZShwX2Rldi0+ZGV2X2hhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2J0aWZfaGhfc2V0cmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBzZXRyZXBvcnQgaW5pdGlhdGVkIGZyb20gdGhlIEJUSUYgdGhyZWFkIGNvbnRleHQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2hoX3NldHJlcG9ydChidGlmX2hoX2RldmljZV90KiBwX2RldiwgYnRoaF9yZXBvcnRfdHlwZV90IHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2l6ZSwgdWludDhfdCogcmVwb3J0KSB7Ci0gIEJUX0hEUiogcF9idWYgPSBjcmVhdGVfcGJ1ZihzaXplLCByZXBvcnQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgZmFpbGVkIHRvIGFsbG9jYXRlIFJQVCBidWZmZXIsIHNpemUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2l6ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEJUQV9IaFNldFJlcG9ydChwX2Rldi0+ZGV2X2hhbmRsZSwgcl90eXBlLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2J0aWZfaGhfc2VuZGRhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmRkYXRhIGluaXRpYXRlZCBmcm9tIHRoZSBCVElGIHRocmVhZCBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9oaF9zZW5kZGF0YShidGlmX2hoX2RldmljZV90KiBwX2RldiwgdWludDE2X3Qgc2l6ZSwgdWludDhfdCogcmVwb3J0KSB7Ci0gIEJUX0hEUiogcF9idWYgPSBjcmVhdGVfcGJ1ZihzaXplLCByZXBvcnQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgZmFpbGVkIHRvIGFsbG9jYXRlIFJQVCBidWZmZXIsIHNpemUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2l6ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IEJUQV9ISF9SUFRUX09VVFBVVDsKLSAgQlRBX0hoU2VuZERhdGEocF9kZXYtPmRldl9oYW5kbGUsIHBfZGV2LT5iZF9hZGRyLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hoX3NlcnZpY2VfcmVnaXN0cmF0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlcnMgb3IgZGVyaWdpc3RlcnMgdGhlIGhpZCBob3N0IHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX2hoX3NlcnZpY2VfcmVnaXN0cmF0aW9uKGJvb2wgZW5hYmxlKSB7Ci0gIEJUSUZfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBCVElGX1RSQUNFX0FQSSgiZW5hYmxlID0gJWQiLCBlbmFibGUpOwotICBpZiAoYnRfaGhfY2FsbGJhY2tzID09IE5VTEwpIHsKLSAgICAvLyBUaGUgSElEIEhvc3Qgc2VydmljZSB3YXMgbmV2ZXIgaW5pdGlhbGl6ZWQgKGl0IGlzIGVpdGhlciBkaXNhYmxlZCBvciBub3QKLSAgICAvLyBhdmFpbGFibGUgaW4gdGhpcyBidWlsZCkuIFdlIHNob3VsZCBwcm9jZWVkIGRpcmVjdGx5IHRvIGNoYW5naW5nIHRoZSBISUQKLSAgICAvLyBEZXZpY2Ugc2VydmljZSBzdGF0ZSAoaWYgbmVlZGVkKS4KLSAgICBpZiAoIWVuYWJsZSkgewotICAgICAgYnRpZl9oZF9zZXJ2aWNlX3JlZ2lzdHJhdGlvbigpOwotICAgIH0KLSAgfSBlbHNlIGlmIChlbmFibGUpIHsKLSAgICBCVEFfSGhFbmFibGUoYnRlX2hoX2V2dCk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRpZl9oaF9jYi5zZXJ2aWNlX2RlcmVnX2FjdGl2ZSA9IFRSVUU7Ci0gICAgQlRBX0hoRGlzYWJsZSgpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF9nZXRyZXBvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGdldHJlcG9ydCBpbml0aWF0ZWQgZnJvbSB0aGUgQlRJRiB0aHJlYWQgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfaGhfZ2V0cmVwb3J0KGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2LCBidGhoX3JlcG9ydF90eXBlX3Qgcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcG9ydElkLCB1aW50MTZfdCBidWZmZXJTaXplKSB7Ci0gIEJUQV9IaEdldFJlcG9ydChwX2Rldi0+ZGV2X2hhbmRsZSwgcl90eXBlLCByZXBvcnRJZCwgYnVmZmVyU2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBTZWN0aW9uIG5hbWUgKEdyb3VwIG9mIGZ1bmN0aW9ucykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgIGJ0aWYgaGggYXBpIGZ1bmN0aW9ucyAobm8gY29udGV4dCBzd2l0Y2gpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hoX3Vwc3RyZWFtc19ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIEhIIFVQU1RSRUFNUyBldmVudHMgaW4gYnRpZiBjb250ZXh0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfaGhfdXBzdHJlYW1zX2V2dCh1aW50MTZfdCBldmVudCwgY2hhciogcF9wYXJhbSkgewotICB0QlRBX0hIKiBwX2RhdGEgPSAodEJUQV9ISCopcF9wYXJhbTsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYgPSBOVUxMOwotICBpbnQgaTsKLSAgaW50IGxlbiwgdG1wbGVuOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBldmVudD0lcyBkZXJlZyA9ICVkIiwgX19mdW5jX18sIGR1bXBfaGhfZXZlbnQoZXZlbnQpLAotICAgICAgICAgICAgICAgICAgIGJ0aWZfaGhfY2Iuc2VydmljZV9kZXJlZ19hY3RpdmUpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9ISF9FTkFCTEVfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEJUQV9ISF9FTkFCTEVfRVZUOiBzdGF0dXMgPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+c3RhdHVzKTsKLSAgICAgIGlmIChwX2RhdGEtPnN0YXR1cyA9PSBCVEFfSEhfT0spIHsKLSAgICAgICAgYnRpZl9oaF9jYi5zdGF0dXMgPSBCVElGX0hIX0VOQUJMRUQ7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzLS1Mb2FkaW5nIGFkZGVkIGRldmljZXMiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIC8qIEFkZCBoaWQgZGVzY3JpcHRvcnMgZm9yIGFscmVhZHkgYm9uZGVkIGhpZCBkZXZpY2VzKi8KLSAgICAgICAgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2hpZF9pbmZvKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGlmX2hoX2NiLnN0YXR1cyA9IEJUSUZfSEhfRElTQUJMRUQ7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICJCVEFfSEhfRU5BQkxFX0VWVDogRXJyb3IsIEhIIGVuYWJsaW5nIGZhaWxlZCwgc3RhdHVzID0gJWQiLAotICAgICAgICAgICAgcF9kYXRhLT5zdGF0dXMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ISF9ESVNBQkxFX0VWVDoKLSAgICAgIGJ0aWZfaGhfY2Iuc3RhdHVzID0gQlRJRl9ISF9ESVNBQkxFRDsKLSAgICAgIGlmIChidGlmX2hoX2NiLnNlcnZpY2VfZGVyZWdfYWN0aXZlKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ISF9ESVNBQkxFX0VWVDogZW5hYmxpbmcgSElEIERldmljZSBzZXJ2aWNlIik7Ci0gICAgICAgIGJ0aWZfaGRfc2VydmljZV9yZWdpc3RyYXRpb24oKTsKLSAgICAgICAgYnRpZl9oaF9jYi5zZXJ2aWNlX2RlcmVnX2FjdGl2ZSA9IEZBTFNFOwotICAgICAgfQotICAgICAgaWYgKHBfZGF0YS0+c3RhdHVzID09IEJUQV9ISF9PSykgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbnRyb2wgYmxvY2sKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEJUSUZfSEhfTUFYX0hJRDsgaSsrKSB7Ci0gICAgICAgICAgYWxhcm1fZnJlZShidGlmX2hoX2NiLmRldmljZXNbaV0udnVwX3RpbWVyKTsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQoJmJ0aWZfaGhfY2IsIDAsIHNpemVvZihidGlmX2hoX2NiKSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgICAgICAgIGJ0aWZfaGhfY2IuZGV2aWNlc1tpXS5kZXZfc3RhdHVzID0gQlRISF9DT05OX1NUQVRFX1VOS05PV047Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAiQlRBX0hIX0RJU0FCTEVfRVZUOiBFcnJvciwgSEggZGlzYWJsaW5nIGZhaWxlZCwgc3RhdHVzID0gJWQiLAotICAgICAgICAgICAgcF9kYXRhLT5zdGF0dXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ISF9PUEVOX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IEJUQV9ISF9PUE5fRVZUOiBoYW5kbGU9JWQsIHN0YXR1cyA9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm4uaGFuZGxlLCBwX2RhdGEtPmNvbm4uc3RhdHVzKTsKLSAgICAgIGJ0aWZfaGhfY2IucGVuZGluZ19jb25uX2FkZHJlc3MgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgICBpZiAocF9kYXRhLT5jb25uLnN0YXR1cyA9PSBCVEFfSEhfT0spIHsKLSAgICAgICAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9oYW5kbGUocF9kYXRhLT5jb25uLmhhbmRsZSk7Ci0gICAgICAgIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiQlRBX0hIX09QRU5fRVZUOiBFcnJvciwgY2Fubm90IGZpbmQgZGV2aWNlIHdpdGggaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgcF9kYXRhLT5jb25uLmhhbmRsZSk7Ci0gICAgICAgICAgYnRpZl9oaF9jYi5zdGF0dXMgPSAoQlRJRl9ISF9TVEFUVVMpQlRJRl9ISF9ERVZfRElTQ09OTkVDVEVEOwotICAgICAgICAgIC8vIFRoZSBjb25uZWN0IHJlcXVlc3QgbXVzdCBjb21lIGZyb20gZGV2aWNlIHNpZGUgYW5kIGV4Y2VlZGVkIHRoZQotICAgICAgICAgIC8vIGNvbm5lY3RlZAotICAgICAgICAgIC8vIEhJRCBkZXZpY2UgbnVtYmVyLgotICAgICAgICAgIEJUQV9IaENsb3NlKHBfZGF0YS0+Y29ubi5oYW5kbGUpOwotICAgICAgICAgIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgICAgIChSYXdBZGRyZXNzKikmcF9kYXRhLT5jb25uLmJkYSwKLSAgICAgICAgICAgICAgICAgICAgQlRISF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocF9kZXYtPmZkIDwgMCkgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIkJUQV9ISF9PUEVOX0VWVDogRXJyb3IsIGZhaWxlZCB0byBmaW5kIHRoZSB1aGlkIGRyaXZlci4uLiIpOwotICAgICAgICAgIHBfZGV2LT5iZF9hZGRyID0gcF9kYXRhLT5jb25uLmJkYTsKLSAgICAgICAgICAvLyByZW1vdmUgdGhlIGNvbm5lY3Rpb24gIGFuZCB0aGVuIHRyeSBhZ2FpbiB0byByZWNvbm5lY3QgZnJvbSB0aGUKLSAgICAgICAgICAvLyBtb3VzZSBzaWRlIHRvIHJlY292ZXIKLSAgICAgICAgICBidGlmX2hoX2NiLnN0YXR1cyA9IChCVElGX0hIX1NUQVRVUylCVElGX0hIX0RFVl9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgQlRBX0hoQ2xvc2UocF9kYXRhLT5jb25uLmhhbmRsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiQlRBX0hIX09QRU5fRVZUOiBGb3VuZCBkZXZpY2UuLi5HZXR0aW5nIGRzY3AgaW5mbyBmb3IgaGFuZGxlICIKLSAgICAgICAgICAgICAgIi4uLiAlZCIsCi0gICAgICAgICAgICAgIHBfZGF0YS0+Y29ubi5oYW5kbGUpOwotICAgICAgICAgIHBfZGV2LT5iZF9hZGRyID0gcF9kYXRhLT5jb25uLmJkYTsKLSAgICAgICAgICBidGlmX2hoX2NiLnN0YXR1cyA9IChCVElGX0hIX1NUQVRVUylCVElGX0hIX0RFVl9DT05ORUNURUQ7Ci0gICAgICAgICAgLy8gU2VuZCBzZXRfaWRsZSBpZiB0aGUgcGVlcl9kZXZpY2UgaXMgYSBrZXlib2FyZAotICAgICAgICAgIGlmIChjaGVja19jb2QoJnBfZGF0YS0+Y29ubi5iZGEsIENPRF9ISURfS0VZQk9BUkQpIHx8Ci0gICAgICAgICAgICAgIGNoZWNrX2NvZCgmcF9kYXRhLT5jb25uLmJkYSwgQ09EX0hJRF9DT01CTykpCi0gICAgICAgICAgICBCVEFfSGhTZXRJZGxlKHBfZGF0YS0+Y29ubi5oYW5kbGUsIDApOwotICAgICAgICAgIGJ0aWZfaGhfY2IucF9jdXJyX2RldiA9Ci0gICAgICAgICAgICAgIGJ0aWZfaGhfZmluZF9jb25uZWN0ZWRfZGV2X2J5X2hhbmRsZShwX2RhdGEtPmNvbm4uaGFuZGxlKTsKLSAgICAgICAgICBCVEFfSGhHZXREc2NwSW5mbyhwX2RhdGEtPmNvbm4uaGFuZGxlKTsKLSAgICAgICAgICBwX2Rldi0+ZGV2X3N0YXR1cyA9IEJUSEhfQ09OTl9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgY29ubmVjdGlvbl9zdGF0ZV9jYiwgJihwX2Rldi0+YmRfYWRkciksCi0gICAgICAgICAgICAgICAgICAgIHBfZGV2LT5kZXZfc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUmF3QWRkcmVzcyogYmRhZGRyID0gJnBfZGF0YS0+Y29ubi5iZGE7Ci0gICAgICAgIGJ0aWZfZG1faGhfb3Blbl9mYWlsZWQoYmRhZGRyKTsKLSAgICAgICAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfZGV2X2J5X2JkYSgqYmRhZGRyKTsKLSAgICAgICAgaWYgKHBfZGV2ICE9IE5VTEwpIHsKLSAgICAgICAgICBidGlmX2hoX3N0b3BfdnVwX3RpbWVyKCYocF9kZXYtPmJkX2FkZHIpKTsKLSAgICAgICAgICBpZiAocF9kZXYtPmZkID49IDApIHsKLSAgICAgICAgICAgIGJ0YV9oaF9jb19kZXN0cm95KHBfZGV2LT5mZCk7Ci0gICAgICAgICAgICBwX2Rldi0+ZmQgPSAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcF9kZXYtPmRldl9zdGF0dXMgPSBCVEhIX0NPTk5fU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgICAgIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgICAoUmF3QWRkcmVzcyopJnBfZGF0YS0+Y29ubi5iZGEsIEJUSEhfQ09OTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgICBidGlmX2hoX2NiLnN0YXR1cyA9IChCVElGX0hIX1NUQVRVUylCVElGX0hIX0RFVl9ESVNDT05ORUNURUQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hIX0NMT1NFX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ISF9DTE9TRV9FVlQ6IHN0YXR1cyA9ICVkLCBoYW5kbGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZGV2X3N0YXR1cy5zdGF0dXMsIHBfZGF0YS0+ZGV2X3N0YXR1cy5oYW5kbGUpOwotICAgICAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9oYW5kbGUocF9kYXRhLT5kZXZfc3RhdHVzLmhhbmRsZSk7Ci0gICAgICBpZiAocF9kZXYgIT0gTlVMTCkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogdWhpZCBmZD0lZCBsb2NhbF92dXA9JWQiLCBfX2Z1bmNfXywgcF9kZXYtPmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5sb2NhbF92dXApOwotICAgICAgICBidGlmX2hoX3N0b3BfdnVwX3RpbWVyKCYocF9kZXYtPmJkX2FkZHIpKTsKLSAgICAgICAgLyogSWYgdGhpcyBpcyBhIGxvY2FsbHkgaW5pdGlhdGVkIFZVUCwgcmVtb3ZlIHRoZSBib25kIGFzIEFDTCBnb3QKLSAgICAgICAgICogIGRpc2Nvbm5lY3RlZCB3aGlsZSBWVVAgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBfZGV2LT5sb2NhbF92dXApIHsKLSAgICAgICAgICBwX2Rldi0+bG9jYWxfdnVwID0gZmFsc2U7Ci0gICAgICAgICAgQlRBX0RtUmVtb3ZlRGV2aWNlKHBfZGV2LT5iZF9hZGRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ0aWZfaGhfY2Iuc3RhdHVzID0gKEJUSUZfSEhfU1RBVFVTKUJUSUZfSEhfREVWX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgcF9kZXYtPmRldl9zdGF0dXMgPSBCVEhIX0NPTk5fU1RBVEVfRElTQ09OTkVDVEVEOwotCi0gICAgICAgIGlmIChwX2Rldi0+ZmQgPj0gMCkgewotICAgICAgICAgIGJ0YV9oaF9jb19kZXN0cm95KHBfZGV2LT5mZCk7Ci0gICAgICAgICAgcF9kZXYtPmZkID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgY29ubmVjdGlvbl9zdGF0ZV9jYiwgJihwX2Rldi0+YmRfYWRkciksCi0gICAgICAgICAgICAgICAgICBwX2Rldi0+ZGV2X3N0YXR1cyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIkVycm9yOiBjYW5ub3QgZmluZCBkZXZpY2Ugd2l0aCBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kZXZfc3RhdHVzLmhhbmRsZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hIX0dFVF9SUFRfRVZUOiB7Ci0gICAgICBCVF9IRFIqIGhkciA9IHBfZGF0YS0+aHNfZGF0YS5yc3BfZGF0YS5wX3JwdF9kYXRhOwotICAgICAgdWludDhfdCogZGF0YSA9IE5VTEw7Ci0gICAgICB1aW50MTZfdCBsZW4gPSAwOwotCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfSEhfR0VUX1JQVF9FVlQ6IHN0YXR1cyA9ICVkLCBoYW5kbGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+aHNfZGF0YS5zdGF0dXMsIHBfZGF0YS0+aHNfZGF0YS5oYW5kbGUpOwotICAgICAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9oYW5kbGUocF9kYXRhLT5oc19kYXRhLmhhbmRsZSk7Ci0gICAgICBpZiAocF9kZXYpIHsKLSAgICAgICAgLyogcF9ycHRfZGF0YSBpcyBOVUxMIGluIEhBTkRTSEFLRSByZXNwb25zZSBjYXNlICovCi0gICAgICAgIGlmIChoZHIpIHsKLSAgICAgICAgICBkYXRhID0gKHVpbnQ4X3QqKShoZHIgKyAxKSArIGhkci0+b2Zmc2V0OwotICAgICAgICAgIGxlbiA9IGhkci0+bGVuOwotICAgICAgICAgIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGdldF9yZXBvcnRfY2IsCi0gICAgICAgICAgICAgICAgICAgIChSYXdBZGRyZXNzKikmKHBfZGV2LT5iZF9hZGRyKSwKLSAgICAgICAgICAgICAgICAgICAgKGJ0aGhfc3RhdHVzX3QpcF9kYXRhLT5oc19kYXRhLnN0YXR1cywgZGF0YSwgbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGhfY2FsbGJhY2tzLCBoYW5kc2hha2VfY2IsCi0gICAgICAgICAgICAgICAgICAgIChSYXdBZGRyZXNzKikmKHBfZGV2LT5iZF9hZGRyKSwKLSAgICAgICAgICAgICAgICAgICAgKGJ0aGhfc3RhdHVzX3QpcF9kYXRhLT5oc19kYXRhLnN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiRXJyb3I6IGNhbm5vdCBmaW5kIGRldmljZSB3aXRoIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhzX2RhdGEuaGFuZGxlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0hIX1NFVF9SUFRfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0hIX1NFVF9SUFRfRVZUOiBzdGF0dXMgPSAlZCwgaGFuZGxlID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmRldl9zdGF0dXMuc3RhdHVzLCBwX2RhdGEtPmRldl9zdGF0dXMuaGFuZGxlKTsKLSAgICAgIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfaGFuZGxlKHBfZGF0YS0+ZGV2X3N0YXR1cy5oYW5kbGUpOwotICAgICAgaWYgKHBfZGV2ICE9IE5VTEwpIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgaGFuZHNoYWtlX2NiLCAoUmF3QWRkcmVzcyopJihwX2Rldi0+YmRfYWRkciksCi0gICAgICAgICAgICAgICAgICAoYnRoaF9zdGF0dXNfdClwX2RhdGEtPmhzX2RhdGEuc3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEhfR0VUX1BST1RPX0VWVDoKLSAgICAgIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfaGFuZGxlKHBfZGF0YS0+aHNfZGF0YS5oYW5kbGUpOwotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICJCVEFfSEhfR0VUX1BST1RPX0VWVDogc3RhdHVzID0gJWQsIGhhbmRsZSA9ICVkLCBwcm90byA9IFslZF0sICVzIiwKLSAgICAgICAgICBwX2RhdGEtPmhzX2RhdGEuc3RhdHVzLCBwX2RhdGEtPmhzX2RhdGEuaGFuZGxlLAotICAgICAgICAgIHBfZGF0YS0+aHNfZGF0YS5yc3BfZGF0YS5wcm90b19tb2RlLAotICAgICAgICAgIChwX2RhdGEtPmhzX2RhdGEucnNwX2RhdGEucHJvdG9fbW9kZSA9PSBCVEFfSEhfUFJPVE9fUlBUX01PREUpCi0gICAgICAgICAgICAgID8gIlJlcG9ydCBNb2RlIgotICAgICAgICAgICAgICA6IChwX2RhdGEtPmhzX2RhdGEucnNwX2RhdGEucHJvdG9fbW9kZSA9PSBCVEFfSEhfUFJPVE9fQk9PVF9NT0RFKQotICAgICAgICAgICAgICAgICAgICA/ICJCb290IE1vZGUiCi0gICAgICAgICAgICAgICAgICAgIDogIlVuc3VwcG9ydGVkIik7Ci0gICAgICBpZiAocF9kYXRhLT5oc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUgIT0gQlRBX0hIX1BST1RPX1VOS05PV04pIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgcHJvdG9jb2xfbW9kZV9jYiwKLSAgICAgICAgICAgICAgICAgIChSYXdBZGRyZXNzKikmKHBfZGV2LT5iZF9hZGRyKSwKLSAgICAgICAgICAgICAgICAgIChidGhoX3N0YXR1c190KXBfZGF0YS0+aHNfZGF0YS5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAoYnRoaF9wcm90b2NvbF9tb2RlX3QpcF9kYXRhLT5oc19kYXRhLnJzcF9kYXRhLnByb3RvX21vZGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgaGFuZHNoYWtlX2NiLCAoUmF3QWRkcmVzcyopJihwX2Rldi0+YmRfYWRkciksCi0gICAgICAgICAgICAgICAgICAoYnRoaF9zdGF0dXNfdClwX2RhdGEtPmhzX2RhdGEuc3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEhfU0VUX1BST1RPX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ISF9TRVRfUFJPVE9fRVZUOiBzdGF0dXMgPSAlZCwgaGFuZGxlID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmRldl9zdGF0dXMuc3RhdHVzLCBwX2RhdGEtPmRldl9zdGF0dXMuaGFuZGxlKTsKLSAgICAgIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfaGFuZGxlKHBfZGF0YS0+ZGV2X3N0YXR1cy5oYW5kbGUpOwotICAgICAgaWYgKHBfZGV2KSB7Ci0gICAgICAgIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGhhbmRzaGFrZV9jYiwgKFJhd0FkZHJlc3MqKSYocF9kZXYtPmJkX2FkZHIpLAotICAgICAgICAgICAgICAgICAgKGJ0aGhfc3RhdHVzX3QpcF9kYXRhLT5oc19kYXRhLnN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hIX0dFVF9JRExFX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIkJUQV9ISF9HRVRfSURMRV9FVlQ6IGhhbmRsZSA9ICVkLCBzdGF0dXMgPSAlZCwgcmF0ZSA9ICVkIiwKLSAgICAgICAgICBwX2RhdGEtPmhzX2RhdGEuaGFuZGxlLCBwX2RhdGEtPmhzX2RhdGEuc3RhdHVzLAotICAgICAgICAgIHBfZGF0YS0+aHNfZGF0YS5yc3BfZGF0YS5pZGxlX3JhdGUpOwotICAgICAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9oYW5kbGUocF9kYXRhLT5oc19kYXRhLmhhbmRsZSk7Ci0gICAgICBIQUxfQ0JBQ0soYnRfaGhfY2FsbGJhY2tzLCBpZGxlX3RpbWVfY2IsIChSYXdBZGRyZXNzKikmKHBfZGV2LT5iZF9hZGRyKSwKLSAgICAgICAgICAgICAgICAoYnRoaF9zdGF0dXNfdClwX2RhdGEtPmhzX2RhdGEuc3RhdHVzLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+aHNfZGF0YS5yc3BfZGF0YS5pZGxlX3JhdGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ISF9TRVRfSURMRV9FVlQ6Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfSEhfU0VUX0lETEVfRVZUOiBzdGF0dXMgPSAlZCwgaGFuZGxlID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmRldl9zdGF0dXMuc3RhdHVzLCBwX2RhdGEtPmRldl9zdGF0dXMuaGFuZGxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSEhfR0VUX0RTQ1BfRVZUOgotICAgICAgbGVuID0gcF9kYXRhLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW47Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfSEhfR0VUX0RTQ1BfRVZUOiBsZW4gPSAlZCIsIGxlbik7Ci0gICAgICBwX2RldiA9IGJ0aWZfaGhfY2IucF9jdXJyX2RldjsKLSAgICAgIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiQlRBX0hIX0dFVF9EU0NQX0VWVDogTm8gSElEIGRldmljZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChwX2Rldi0+ZmQgPCAwKSB7Ci0gICAgICAgIExPR19FUlJPUigKLQotICAgICAgICAgICAgIkJUQV9ISF9HRVRfRFNDUF9FVlQ6IEVycm9yLCBmYWlsZWQgdG8gZmluZCB0aGUgdWhpZCBkcml2ZXIuLi4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiBjYWNoZWRfbmFtZSA9IE5VTEw7Ci0gICAgICAgIGJ0X2JkbmFtZV90IGJkbmFtZTsKLSAgICAgICAgYnRfcHJvcGVydHlfdCBwcm9wX25hbWU7Ci0gICAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wX25hbWUsIEJUX1BST1BFUlRZX0JETkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0X2JkbmFtZV90KSwgJmJkbmFtZSk7Ci0gICAgICAgIGlmIChidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgICAgICAgICAgICAgJnBfZGV2LT5iZF9hZGRyLCAmcHJvcF9uYW1lKSA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICAgIGNhY2hlZF9uYW1lID0gKGNoYXIqKWJkbmFtZS5uYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNhY2hlZF9uYW1lID0gIkJsdWV0b290aCBISUQiOwotICAgICAgICB9Ci0KLSAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogbmFtZSA9ICVzIiwgX19mdW5jX18sIGNhY2hlZF9uYW1lKTsKLSAgICAgICAgYnRhX2hoX2NvX3NlbmRfaGlkX2luZm8ocF9kZXYsIGNhY2hlZF9uYW1lLCBwX2RhdGEtPmRzY3BfaW5mby52ZW5kb3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZHNjcF9pbmZvLnByb2R1Y3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZHNjcF9pbmZvLnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZHNjcF9pbmZvLmN0cnlfY29kZSwgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KTsKLSAgICAgICAgaWYgKGJ0aWZfaGhfYWRkX2FkZGVkX2RldihwX2Rldi0+YmRfYWRkciwgcF9kZXYtPmF0dHJfbWFzaykpIHsKLSAgICAgICAgICB0QlRBX0hIX0RFVl9EU0NQX0lORk8gZHNjcF9pbmZvOwotICAgICAgICAgIGJ0X3N0YXR1c190IHJldDsKLSAgICAgICAgICBidGlmX2hoX2NvcHlfaGlkX2luZm8oJmRzY3BfaW5mbywgJnBfZGF0YS0+ZHNjcF9pbmZvKTsKLSAgICAgICAgICBWTE9HKDEpIDw8ICJCVEFfSEhfR0VUX0RTQ1BfRVZUOmJkYSA9ICIgPDwgcF9kZXYtPmJkX2FkZHI7Ci0gICAgICAgICAgQlRBX0hoQWRkRGV2KHBfZGV2LT5iZF9hZGRyLCBwX2Rldi0+YXR0cl9tYXNrLCBwX2Rldi0+c3ViX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICBwX2Rldi0+YXBwX2lkLCBkc2NwX2luZm8pOwotICAgICAgICAgIC8vIHdyaXRlIGhpZCBpbmZvIHRvIG52cmFtCi0gICAgICAgICAgcmV0ID0gYnRpZl9zdG9yYWdlX2FkZF9oaWRfZGV2aWNlX2luZm8oCi0gICAgICAgICAgICAgICYocF9kZXYtPmJkX2FkZHIpLCBwX2Rldi0+YXR0cl9tYXNrLCBwX2Rldi0+c3ViX2NsYXNzLAotICAgICAgICAgICAgICBwX2Rldi0+YXBwX2lkLCBwX2RhdGEtPmRzY3BfaW5mby52ZW5kb3JfaWQsCi0gICAgICAgICAgICAgIHBfZGF0YS0+ZHNjcF9pbmZvLnByb2R1Y3RfaWQsIHBfZGF0YS0+ZHNjcF9pbmZvLnZlcnNpb24sCi0gICAgICAgICAgICAgIHBfZGF0YS0+ZHNjcF9pbmZvLmN0cnlfY29kZSwgcF9kYXRhLT5kc2NwX2luZm8uc3NyX21heF9sYXRlbmN5LAotICAgICAgICAgICAgICBwX2RhdGEtPmRzY3BfaW5mby5zc3JfbWluX3RvdXQsIGxlbiwKLSAgICAgICAgICAgICAgcF9kYXRhLT5kc2NwX2luZm8uZGVzY3JpcHRvci5kc2NfbGlzdCk7Ci0KLSAgICAgICAgICBBU1NFUlRDKHJldCA9PSBCVF9TVEFUVVNfU1VDQ0VTUywgInN0b3JpbmcgaGlkIGluZm8gZmFpbGVkIiwgcmV0KTsKLSAgICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIkJUQV9ISF9HRVRfRFNDUF9FVlQ6IENhbGxlZCBhZGQgZGV2aWNlIik7Ci0KLSAgICAgICAgICAvLyBGcmVlIGJ1ZmZlciBjcmVhdGVkIGZvciBkc2NwX2luZm87Ci0gICAgICAgICAgaWYgKGRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbiA+IDAgJiYKLSAgICAgICAgICAgICAgZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QgIT0gTlVMTCkgewotICAgICAgICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KTsKLSAgICAgICAgICAgIGRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbiA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIERldmljZSBhbHJlYWR5IGFkZGVkLgotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IERldmljZSBhbHJlYWR5IGFkZGVkICIsIF9fZnVuY19fKTsKLSAgICAgICAgfQotICAgICAgICAvKlN5bmMgSElEIEtleWJvYXJkIGxvY2tzdGF0ZXMgKi8KLSAgICAgICAgdG1wbGVuID0gc2l6ZW9mKGhpZF9rYl9udW1sb2NrX29uX2xpc3QpIC8gc2l6ZW9mKHRISURfS0JfTElTVCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bXBsZW47IGkrKykgewotICAgICAgICAgIGlmIChwX2RhdGEtPmRzY3BfaW5mby52ZW5kb3JfaWQgPT0KLSAgICAgICAgICAgICAgICAgIGhpZF9rYl9udW1sb2NrX29uX2xpc3RbaV0udmVyc2lvbl9pZCAmJgotICAgICAgICAgICAgICBwX2RhdGEtPmRzY3BfaW5mby5wcm9kdWN0X2lkID09Ci0gICAgICAgICAgICAgICAgICBoaWRfa2JfbnVtbG9ja19vbl9saXN0W2ldLnByb2R1Y3RfaWQpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICAgIiVzKCkgaWR4WyVkXSBFbmFibGluZyAiCi0gICAgICAgICAgICAgICAgIk5VTUxPQ0sgZm9yIGRldmljZSA6OiAlcyIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGksIGhpZF9rYl9udW1sb2NrX29uX2xpc3RbaV0ua2JfbmFtZSk7Ci0gICAgICAgICAgICAvKiBFbmFibGUgTlVNTE9DSyBieSBkZWZhdWx0IHNvIHRoYXQgbnVtZXJpYwotICAgICAgICAgICAgICAgIGtleXMgd29yayBmcm9tIGZpcnN0IGtleWJvYXJkIGNvbm5lY3QgKi8KLSAgICAgICAgICAgIHNldF9rZXlsb2Nrc3RhdGUoQlRJRl9ISF9LRVlTVEFURV9NQVNLX05VTUxPQ0ssIHRydWUpOwotICAgICAgICAgICAgc3luY19sb2Nrc3RhdGVfb25fY29ubmVjdChwX2Rldik7Ci0gICAgICAgICAgICAvKiBFbmQgU3luYyBISUQgS2V5Ym9hcmQgbG9ja3N0YXRlcyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hIX0FERF9ERVZfRVZUOgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJCVEFfSEhfQUREX0RFVl9FVlQ6IHN0YXR1cyA9ICVkLCBoYW5kbGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kZXZfaW5mby5zdGF0dXMsIHBfZGF0YS0+ZGV2X2luZm8uaGFuZGxlKTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IEJUSUZfSEhfTUFYX0FEREVEX0RFVjsgaSsrKSB7Ci0gICAgICAgIGlmIChidGlmX2hoX2NiLmFkZGVkX2RldmljZXNbaV0uYmRfYWRkciA9PSBwX2RhdGEtPmRldl9pbmZvLmJkYSkgewotICAgICAgICAgIGlmIChwX2RhdGEtPmRldl9pbmZvLnN0YXR1cyA9PSBCVEFfSEhfT0spIHsKLSAgICAgICAgICAgIGJ0aWZfaGhfY2IuYWRkZWRfZGV2aWNlc1tpXS5kZXZfaGFuZGxlID0gcF9kYXRhLT5kZXZfaW5mby5oYW5kbGU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ0aWZfaGhfY2IuYWRkZWRfZGV2aWNlc1tpXS5iZF9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICAgICAgICAgICAgYnRpZl9oaF9jYi5hZGRlZF9kZXZpY2VzW2ldLmRldl9oYW5kbGUgPSBCVEFfSEhfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9ISF9STVZfREVWX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9ISF9STVZfREVWX0VWVDogc3RhdHVzID0gJWQsIGhhbmRsZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kZXZfaW5mby5zdGF0dXMsIHBfZGF0YS0+ZGV2X2luZm8uaGFuZGxlKTsKLSAgICAgIFZMT0coMSkgPDwgIkJUQV9ISF9STVZfREVWX0VWVDpiZGEgPSAiIDw8IHBfZGF0YS0+ZGV2X2luZm8uYmRhOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ISF9WQ19VTlBMVUdfRVZUOgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiQlRBX0hIX1ZDX1VOUExVR19FVlQ6IHN0YXR1cyA9ICVkLCBoYW5kbGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZGV2X3N0YXR1cy5zdGF0dXMsIHBfZGF0YS0+ZGV2X3N0YXR1cy5oYW5kbGUpOwotICAgICAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9oYW5kbGUocF9kYXRhLT5kZXZfc3RhdHVzLmhhbmRsZSk7Ci0gICAgICBidGlmX2hoX2NiLnN0YXR1cyA9IChCVElGX0hIX1NUQVRVUylCVElGX0hIX0RFVl9ESVNDT05ORUNURUQ7Ci0gICAgICBpZiAocF9kZXYgIT0gTlVMTCkgewotICAgICAgICBWTE9HKDEpIDw8ICJCVEFfSEhfVkNfVU5QTFVHX0VWVDpiZGEgPSAiIDw8IHBfZGV2LT5iZF9hZGRyOwotCi0gICAgICAgIC8qIFN0b3AgdGhlIFZVUCB0aW1lciAqLwotICAgICAgICBidGlmX2hoX3N0b3BfdnVwX3RpbWVyKCYocF9kZXYtPmJkX2FkZHIpKTsKLSAgICAgICAgcF9kZXYtPmRldl9zdGF0dXMgPSBCVEhIX0NPTk5fU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcy0tLVNlbmRpbmcgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsICYocF9kZXYtPmJkX2FkZHIpLAotICAgICAgICAgICAgICAgICAgcF9kZXYtPmRldl9zdGF0dXMpOwotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcy0tLVJlbW92aW5nIEhJRCBib25kIiwgX19mdW5jX18pOwotICAgICAgICAvKiBJZiBpdCBpcyBsb2NhbGx5IGluaXRpYXRlZCBWVVAgb3IgcmVtb3RlIGRldmljZSBoYXMgaXRzIG1ham9yIENPRCBhcwotICAgICAgICBQZXJpcGhlcmFsIHJlbW92ZWQgdGhlIGJvbmQuKi8KLSAgICAgICAgaWYgKHBfZGV2LT5sb2NhbF92dXAgfHwgY2hlY2tfY29kX2hpZCgmKHBfZGV2LT5iZF9hZGRyKSkpIHsKLSAgICAgICAgICBwX2Rldi0+bG9jYWxfdnVwID0gZmFsc2U7Ci0gICAgICAgICAgQlRBX0RtUmVtb3ZlRGV2aWNlKHBfZGV2LT5iZF9hZGRyKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgYnRpZl9oaF9yZW1vdmVfZGV2aWNlKHBfZGV2LT5iZF9hZGRyKTsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgdmlydHVhbF91bnBsdWdfY2IsICYocF9kZXYtPmJkX2FkZHIpLAotICAgICAgICAgICAgICAgICAgKGJ0aGhfc3RhdHVzX3QpcF9kYXRhLT5kZXZfc3RhdHVzLnN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0hIX0FQSV9FUlJfRVZUOgotICAgICAgTE9HX0lORk8oIkJUQV9ISCBBUElfRVJSIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBVbmhhbmRsZWQgZXZlbnQ6ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGVfaGhfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTd2l0Y2hlcyBjb250ZXh0IGZyb20gQlRFIHRvIEJUSUYgZm9yIGFsbCBISCBldmVudHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJ0ZV9oaF9ldnQodEJUQV9ISF9FVlQgZXZlbnQsIHRCVEFfSEgqIHBfZGF0YSkgewotICBidF9zdGF0dXNfdCBzdGF0dXM7Ci0gIGludCBwYXJhbV9sZW4gPSAwOwotCi0gIGlmIChCVEFfSEhfRU5BQkxFX0VWVCA9PSBldmVudCkKLSAgICBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9ISF9TVEFUVVMpOwotICBlbHNlIGlmIChCVEFfSEhfT1BFTl9FVlQgPT0gZXZlbnQpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSEhfQ09OTik7Ci0gIGVsc2UgaWYgKEJUQV9ISF9ESVNBQkxFX0VWVCA9PSBldmVudCkKLSAgICBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9ISF9TVEFUVVMpOwotICBlbHNlIGlmIChCVEFfSEhfQ0xPU0VfRVZUID09IGV2ZW50KQotICAgIHBhcmFtX2xlbiA9IHNpemVvZih0QlRBX0hIX0NCREFUQSk7Ci0gIGVsc2UgaWYgKEJUQV9ISF9HRVRfRFNDUF9FVlQgPT0gZXZlbnQpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSEhfREVWX0RTQ1BfSU5GTyk7Ci0gIGVsc2UgaWYgKChCVEFfSEhfR0VUX1BST1RPX0VWVCA9PSBldmVudCkgfHwgKEJUQV9ISF9HRVRfUlBUX0VWVCA9PSBldmVudCkgfHwKLSAgICAgICAgICAgKEJUQV9ISF9HRVRfSURMRV9FVlQgPT0gZXZlbnQpKQotICAgIHBhcmFtX2xlbiA9IHNpemVvZih0QlRBX0hIX0hTREFUQSk7Ci0gIGVsc2UgaWYgKChCVEFfSEhfU0VUX1BST1RPX0VWVCA9PSBldmVudCkgfHwgKEJUQV9ISF9TRVRfUlBUX0VWVCA9PSBldmVudCkgfHwKLSAgICAgICAgICAgKEJUQV9ISF9WQ19VTlBMVUdfRVZUID09IGV2ZW50KSB8fCAoQlRBX0hIX1NFVF9JRExFX0VWVCA9PSBldmVudCkpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSEhfQ0JEQVRBKTsKLSAgZWxzZSBpZiAoKEJUQV9ISF9BRERfREVWX0VWVCA9PSBldmVudCkgfHwgKEJUQV9ISF9STVZfREVWX0VWVCA9PSBldmVudCkpCi0gICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfSEhfREVWX0lORk8pOwotICBlbHNlIGlmIChCVEFfSEhfQVBJX0VSUl9FVlQgPT0gZXZlbnQpCi0gICAgcGFyYW1fbGVuID0gMDsKLSAgLyogc3dpdGNoIGNvbnRleHQgdG8gYnRpZiB0YXNrIGNvbnRleHQgKGNvcHkgZnVsbCB1bmlvbiBzaXplIGZvciBjb252ZW5pZW5jZSkKLSAgICovCi0gIHN0YXR1cyA9IGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2hoX3Vwc3RyZWFtc19ldnQsICh1aW50MTZfdClldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwX2RhdGEsIHBhcmFtX2xlbiwgTlVMTCk7Ci0KLSAgLyogY2F0Y2ggYW55IGZhaWxlZCBjb250ZXh0IHRyYW5zZmVycyAqLwotICBBU1NFUlRDKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUywgImNvbnRleHQgdHJhbnNmZXIgZmFpbGVkIiwgc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfaGhfaGFuZGxlX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3dpdGNoZXMgY29udGV4dCBmb3IgaW1tZWRpYXRlIGNhbGxiYWNrCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYnRpZl9oaF9oYW5kbGVfZXZ0KHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX3BhcmFtKSB7Ci0gIENIRUNLKHBfcGFyYW0gIT0gbnVsbHB0cik7Ci0gIFJhd0FkZHJlc3MqIGJkX2FkZHIgPSAoUmF3QWRkcmVzcyopcF9wYXJhbTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRJRl9ISF9DT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIExPR19ERUJVRygiQ29ubmVjdCByZXF1ZXN0IHJlY2VpdmVkIHJlbW90ZTolcyIsCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKCgqYmRfYWRkcikpKTsKLSAgICAgIGlmIChidGlmX2hoX2Nvbm5lY3QoYmRfYWRkcikgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hoX2NhbGxiYWNrcywgY29ubmVjdGlvbl9zdGF0ZV9jYiwgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgIEJUSEhfQ09OTl9TVEFURV9DT05ORUNUSU5HKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBIQUxfQ0JBQ0soYnRfaGhfY2FsbGJhY2tzLCBjb25uZWN0aW9uX3N0YXRlX2NiLCBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgQlRISF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9ISF9ESVNDT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIExPR19ERUJVRygiRGlzY29ubmVjdCByZXF1ZXN0IHJlY2VpdmVkIHJlbW90ZTolcyIsCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKCgqYmRfYWRkcikpKTsKLSAgICAgIGJ0aWZfaGhfZGlzY29ubmVjdChiZF9hZGRyKTsKLSAgICAgIEhBTF9DQkFDSyhidF9oaF9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgQlRISF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkcpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfSEhfVlVQX1JFUV9FVlQ6IHsKLSAgICAgIExPR19ERUJVRygiVmlydHVhbCB1bnBsdWcgcmVxdWVzdCByZWNlaXZlZCByZW1vdGU6JXMiLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUygoKmJkX2FkZHIpKSk7Ci0gICAgICBpZiAoYnRpZl9oaF92aXJ0dWFsX3VucGx1ZyhiZF9hZGRyKSAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHZpcnR1YWwgdW5wbHVnIGRldmljZSByZW1vdGU6JXMiLAotICAgICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoKCpiZF9hZGRyKSkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiB7Ci0gICAgICBMT0dfV0FSTigiVW5rbm93biBldmVudCByZWNlaXZlZDolZCByZW1vdGU6JXMiLCBldmVudCwKLSAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUygoKmJkX2FkZHIpKSk7Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgYnRpZl9oaF90aW1lcl90aW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICBQcm9jZXNzIHRpbWVyIHRpbWVvdXQKLSAqCi0gKiBSZXR1cm5zICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9oaF90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYgPSAoYnRpZl9oaF9kZXZpY2VfdCopZGF0YTsKLSAgdEJUQV9ISF9FVlQgZXZlbnQgPSBCVEFfSEhfVkNfVU5QTFVHX0VWVDsKLSAgdEJUQV9ISCBwX2RhdGE7Ci0gIGludCBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9ISF9DQkRBVEEpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBpZiAocF9kZXYtPmRldl9zdGF0dXMgIT0gQlRISF9DT05OX1NUQVRFX0NPTk5FQ1RFRCkgcmV0dXJuOwotCi0gIG1lbXNldCgmcF9kYXRhLCAwLCBzaXplb2YodEJUQV9ISCkpOwotICBwX2RhdGEuZGV2X3N0YXR1cy5zdGF0dXMgPSBCVEFfSEhfRVJSOyAgLy8gdEJUQV9ISF9TVEFUVVMKLSAgcF9kYXRhLmRldl9zdGF0dXMuaGFuZGxlID0gcF9kZXYtPmRldl9oYW5kbGU7Ci0KLSAgLyogc3dpdGNoIGNvbnRleHQgdG8gYnRpZiB0YXNrIGNvbnRleHQgKi8KLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfaGhfdXBzdHJlYW1zX2V2dCwgKHVpbnQxNl90KWV2ZW50LCAoY2hhciopJnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2xlbiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hoX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgaW5pdGlhbGl6ZXMgdGhlIGhoIGludGVyZmFjZQotICoKLSAqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgaW5pdChidGhoX2NhbGxiYWNrc190KiBjYWxsYmFja3MpIHsKLSAgdWludDMyX3QgaTsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRfaGhfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICBtZW1zZXQoJmJ0aWZfaGhfY2IsIDAsIHNpemVvZihidGlmX2hoX2NiKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgIGJ0aWZfaGhfY2IuZGV2aWNlc1tpXS5kZXZfc3RhdHVzID0gQlRISF9DT05OX1NUQVRFX1VOS05PV047Ci0gIH0KLSAgLyogSW52b2tlIHRoZSBlbmFibGUgc2VydmljZSBBUEkgdG8gdGhlIGNvcmUgdG8gc2V0IHRoZSBhcHByb3ByaWF0ZSBzZXJ2aWNlX2lkCi0gICAqLwotICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9ISURfU0VSVklDRV9JRCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICBjb25uZWN0IHRvIGhpZCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGNvbm5lY3QoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgIT0gQlRJRl9ISF9ERVZfQ09OTkVDVElORykgewotICAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2hoX2hhbmRsZV9ldnQsIEJUSUZfSEhfQ09OTkVDVF9SRVFfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopYmRfYWRkciwgc2l6ZW9mKFJhd0FkZHJlc3MpLCBOVUxMKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0gZWxzZSBpZiAoKGJ0aWZfaGhfY2IucGVuZGluZ19jb25uX2FkZHJlc3MgPT0gKmJkX2FkZHIpICYmCi0gICAgICAgKGJ0aWZfaGhfY2Iuc3RhdHVzID09IEJUSUZfSEhfREVWX0NPTk5FQ1RJTkcpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGFscmVhZHkgY29ubmVjdGluZyAiIDw8ICpiZF9hZGRyOwotICAgIHJldHVybiBCVF9TVEFUVVNfQlVTWTsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBkaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBkaXNjb25uZWN0IGZyb20gaGlkIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZGlzY29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEhfSU5JVCgpOwotICBCVElGX1RSQUNFX0VWRU5UKCJCVEhIOiAlcyIsIF9fZnVuY19fKTsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXY7Ci0KLSAgaWYgKGJ0aWZfaGhfY2Iuc3RhdHVzID09IEJUSUZfSEhfRElTQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBwX2RldiA9IGJ0aWZfaGhfZmluZF9jb25uZWN0ZWRfZGV2X2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChwX2RldiAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2hoX2hhbmRsZV9ldnQsIEJUSUZfSEhfRElTQ09OTkVDVF9SRVFfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWJkX2FkZHIsIHNpemVvZihSYXdBZGRyZXNzKSwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogRXJyb3IsIGRldmljZSAgbm90IG9wZW5lZC4iLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICB2aXJ0dWFsX3VucGx1ZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVmlydHVhbCBVblBsdWcgKFZVUCkgdGhlIHNwZWNpZmllZCBISUQgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgdmlydHVhbF91bnBsdWcoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBDSEVDS19CVEhIX0lOSVQoKTsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiQlRISDogJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2OwotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgPT0gQlRJRl9ISF9ESVNBQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBwX2RldiA9IGJ0aWZfaGhfZmluZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKCFwX2RldikgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgZGV2aWNlICVzIG5vdCBvcGVuZWQuIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9oaF9oYW5kbGVfZXZ0LCBCVElGX0hIX1ZVUF9SRVFfRVZULCAoY2hhciopYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSYXdBZGRyZXNzKSwgTlVMTCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiBGdW5jdGlvbiAgICAgICAgIGdldF9pZGxlX3RpbWUKLSoqCi0qKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgSElEIGlkbGUgdGltZQotKioKLSoqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X2lkbGVfdGltZShSYXdBZGRyZXNzKiBiZF9hZGRyKSB7Ci0gIENIRUNLX0JUSEhfSU5JVCgpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBhZGRyID0gJXMiLCBfX2Z1bmNfXywgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgPT0gQlRJRl9ISF9ESVNBQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBCVEFfSGhHZXRJZGxlKHBfZGV2LT5kZXZfaGFuZGxlKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqIEZ1bmN0aW9uICAgICAgICAgc2V0X2lkbGVfdGltZQotKioKLSoqIERlc2NyaXB0aW9uICAgICAgU2V0IHRoZSBISUQgaWRsZSB0aW1lCi0qKgotKiogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBzZXRfaWRsZV90aW1lKFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQ4X3QgaWRsZV90aW1lKSB7Ci0gIENIRUNLX0JUSEhfSU5JVCgpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBhZGRyID0gJXMsIGlkbGUgdGltZSA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpLCBpZGxlX3RpbWUpOwotCi0gIGlmIChidGlmX2hoX2NiLnN0YXR1cyA9PSBCVElGX0hIX0RJU0FCTEVEKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yLCBISCBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBidGlmX2hoX2NiLnN0YXR1cyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9iZGEoKmJkX2FkZHIpOwotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGFkZHIgPSAlcyBub3Qgb3BlbmVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHItPlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgQlRBX0hoU2V0SWRsZShwX2Rldi0+ZGV2X2hhbmRsZSwgaWRsZV90aW1lKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2V0X2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCB0aGUgSElEIGRldmljZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBzZXRfaW5mbyhSYXdBZGRyZXNzKiBiZF9hZGRyLCBidGhoX2hpZF9pbmZvX3QgaGlkX2luZm8pIHsKLSAgQ0hFQ0tfQlRISF9JTklUKCk7Ci0gIHRCVEFfSEhfREVWX0RTQ1BfSU5GTyBkc2NwX2luZm87Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIEJUSEg6IGFkZHIgPSAiIDw8ICpiZF9hZGRyOwotICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgIkJUSEg6ICVzOiBzdWJfY2xhc3MgPSAweCUwMngsIGFwcF9pZCA9ICVkLCB2ZW5kb3JfaWQgPSAweCUwNHgsICIKLSAgICAgICJwcm9kdWN0X2lkID0gMHglMDR4LCB2ZXJzaW9uPSAweCUwNHgiLAotICAgICAgX19mdW5jX18sIGhpZF9pbmZvLnN1Yl9jbGFzcywgaGlkX2luZm8uYXBwX2lkLCBoaWRfaW5mby52ZW5kb3JfaWQsCi0gICAgICBoaWRfaW5mby5wcm9kdWN0X2lkLCBoaWRfaW5mby52ZXJzaW9uKTsKLQotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgPT0gQlRJRl9ISF9ESVNBQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIG1lbXNldCgmZHNjcF9pbmZvLCAwLCBzaXplb2YoZHNjcF9pbmZvKSk7Ci0gIGRzY3BfaW5mby52ZW5kb3JfaWQgPSBoaWRfaW5mby52ZW5kb3JfaWQ7Ci0gIGRzY3BfaW5mby5wcm9kdWN0X2lkID0gaGlkX2luZm8ucHJvZHVjdF9pZDsKLSAgZHNjcF9pbmZvLnZlcnNpb24gPSBoaWRfaW5mby52ZXJzaW9uOwotICBkc2NwX2luZm8uY3RyeV9jb2RlID0gaGlkX2luZm8uY3RyeV9jb2RlOwotCi0gIGRzY3BfaW5mby5kZXNjcmlwdG9yLmRsX2xlbiA9IGhpZF9pbmZvLmRsX2xlbjsKLSAgZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QgPQotICAgICAgKHVpbnQ4X3QqKW9zaV9tYWxsb2MoZHNjcF9pbmZvLmRlc2NyaXB0b3IuZGxfbGVuKTsKLSAgbWVtY3B5KGRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0LCAmKGhpZF9pbmZvLmRzY19saXN0KSwgaGlkX2luZm8uZGxfbGVuKTsKLQotICBpZiAoYnRpZl9oaF9hZGRfYWRkZWRfZGV2KCpiZF9hZGRyLCBoaWRfaW5mby5hdHRyX21hc2spKSB7Ci0gICAgQlRBX0hoQWRkRGV2KCpiZF9hZGRyLCBoaWRfaW5mby5hdHRyX21hc2ssIGhpZF9pbmZvLnN1Yl9jbGFzcywKLSAgICAgICAgICAgICAgICAgaGlkX2luZm8uYXBwX2lkLCBkc2NwX2luZm8pOwotICB9Ci0KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0KTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfcHJvdG9jb2wKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgSElEIHByb3RvIG1vZGUuCi0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfcHJvdG9jb2woUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYnRoaF9wcm90b2NvbF9tb2RlX3QgcHJvdG9jb2xNb2RlKSB7Ci0gIENIRUNLX0JUSEhfSU5JVCgpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBCVEhIOiBhZGRyID0gIiA8PCAqYmRfYWRkcjsKLQotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgPT0gQlRJRl9ISF9ESVNBQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKCFwX2RldikgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIEJUQV9IaEdldFByb3RvTW9kZShwX2Rldi0+ZGV2X2hhbmRsZSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNldF9wcm90b2NvbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IHRoZSBISUQgcHJvdG8gbW9kZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHNldF9wcm90b2NvbChSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhoX3Byb3RvY29sX21vZGVfdCBwcm90b2NvbE1vZGUpIHsKLSAgQ0hFQ0tfQlRISF9JTklUKCk7Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2OwotICB1aW50OF90IHByb3RvX21vZGUgPSBwcm90b2NvbE1vZGU7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIEJUSEg6IHByb3RvX21vZD0iIDw8IHByb3RvY29sTW9kZQotICAgICAgICAgIDw8ICIgYWRkciA9ICIgPDwgKmJkX2FkZHI7Ci0KLSAgaWYgKGJ0aWZfaGhfY2Iuc3RhdHVzID09IEJUSUZfSEhfRElTQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3IsIEhIIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIGJ0aWZfaGhfY2Iuc3RhdHVzKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLQotICBwX2RldiA9IGJ0aWZfaGhfZmluZF9jb25uZWN0ZWRfZGV2X2J5X2JkYSgqYmRfYWRkcik7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICIgRXJyb3IsIGRldmljZSIgPDwgKmJkX2FkZHIgPDwgIiBub3Qgb3BlbmVkIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0gZWxzZSBpZiAocHJvdG9jb2xNb2RlICE9IEJUQV9ISF9QUk9UT19SUFRfTU9ERSAmJgotICAgICAgICAgICAgIHByb3RvY29sTW9kZSAhPSBCVEFfSEhfUFJPVE9fQk9PVF9NT0RFKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogRXJyb3IsIGRldmljZSBwcm90b19tb2RlID0gJWQuIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3RvX21vZGUpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfSBlbHNlIHsKLSAgICBCVEFfSGhTZXRQcm90b01vZGUocF9kZXYtPmRldl9oYW5kbGUsIHByb3RvY29sTW9kZSk7Ci0gIH0KLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfcmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgR0VUX1JFUE9SVCB0byBISUQgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X3JlcG9ydChSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoaF9yZXBvcnRfdHlwZV90IHJlcG9ydFR5cGUsIHVpbnQ4X3QgcmVwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSkgewotICBDSEVDS19CVEhIX0lOSVQoKTsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXY7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIEJUSEg6IHJfdHlwZSA9ICIgPDwgcmVwb3J0VHlwZQotICAgICAgICAgIDw8ICIsIHJwdF9pZCA9ICIgPDwgcmVwb3J0SWQgPDwgIiwgYnVmX3NpemUgPSAiIDw8IGJ1ZmZlclNpemUKLSAgICAgICAgICA8PCAiIGFkZHIgPSAiIDw8ICpiZF9hZGRyOwotCi0gIGlmIChidGlmX2hoX2NiLnN0YXR1cyA9PSBCVElGX0hIX0RJU0FCTEVEKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yLCBISCBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBidGlmX2hoX2NiLnN0YXR1cyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgcF9kZXYgPSBidGlmX2hoX2ZpbmRfY29ubmVjdGVkX2Rldl9ieV9iZGEoKmJkX2FkZHIpOwotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIExPRyhFUlJPUikgPDwgIiBFcnJvciwgZGV2aWNlIiA8PCAqYmRfYWRkciA8PCAiIG5vdCBvcGVuZWQiOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfSBlbHNlIGlmICgoKGludClyZXBvcnRUeXBlKSA8PSBCVEFfSEhfUlBUVF9SRVNSViB8fAotICAgICAgICAgICAgICgoaW50KXJlcG9ydFR5cGUpID4gQlRBX0hIX1JQVFRfRkVBVFVSRSkgewotICAgIExPRyhFUlJPUikgPDwgIiBFcnJvciwgcmVwb3J0IHR5cGU9IiA8PCArcmVwb3J0VHlwZSA8PCAiIG5vdCBzdXBwb3J0ZWQiOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfSBlbHNlIHsKLSAgICBCVEFfSGhHZXRSZXBvcnQocF9kZXYtPmRldl9oYW5kbGUsIHJlcG9ydFR5cGUsIHJlcG9ydElkLCBidWZmZXJTaXplKTsKLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNldF9yZXBvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBTRVRfUkVQT1JUIHRvIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBzZXRfcmVwb3J0KFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhoX3JlcG9ydF90eXBlX3QgcmVwb3J0VHlwZSwgY2hhciogcmVwb3J0KSB7Ci0gIENIRUNLX0JUSEhfSU5JVCgpOwotICBidGlmX2hoX2RldmljZV90KiBwX2RldjsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQlRISDogcmVwb3J0VHlwZT0iIDw8IHJlcG9ydFR5cGUKLSAgICAgICAgICA8PCAiIGFkZHI9IiA8PCAqYmRfYWRkcjsKLQotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgPT0gQlRJRl9ISF9ESVNBQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBMT0coRVJST1IpIDw8ICIgRXJyb3IsIGRldmljZSIgPDwgKmJkX2FkZHIgPDwgIiBub3Qgb3BlbmVkIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0gZWxzZSBpZiAoKChpbnQpcmVwb3J0VHlwZSkgPD0gQlRBX0hIX1JQVFRfUkVTUlYgfHwKLSAgICAgICAgICAgICAoKGludClyZXBvcnRUeXBlKSA+IEJUQV9ISF9SUFRUX0ZFQVRVUkUpIHsKLSAgICBMT0coRVJST1IpIDw8ICIgRXJyb3IsIHJlcG9ydCB0eXBlPSIgPDwgK3JlcG9ydFR5cGUgPDwgIiBub3Qgc3VwcG9ydGVkIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGhleF9ieXRlc19maWxsZWQ7Ci0gICAgc2l6ZV90IGxlbiA9IChzdHJsZW4ocmVwb3J0KSArIDEpIC8gMjsKLSAgICB1aW50OF90KiBoZXhidWYgPSAodWludDhfdCopb3NpX2NhbGxvYyhsZW4pOwotCi0gICAgLyogQnVpbGQgYSBTZXRSZXBvcnQgZGF0YSBidWZmZXIgKi8KLSAgICAvLyBUT0RPCi0gICAgaGV4X2J5dGVzX2ZpbGxlZCA9IGFzY2lpXzJfaGV4KHJlcG9ydCwgbGVuLCBoZXhidWYpOwotICAgIExPR19JTkZPKCJIZXggYnl0ZXMgZmlsbGVkLCBoZXggdmFsdWU6ICVkIiwgaGV4X2J5dGVzX2ZpbGxlZCk7Ci0gICAgaWYgKGhleF9ieXRlc19maWxsZWQpIHsKLSAgICAgIEJUX0hEUiogcF9idWYgPSBjcmVhdGVfcGJ1ZihoZXhfYnl0ZXNfZmlsbGVkLCBoZXhidWYpOwotICAgICAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yLCBmYWlsZWQgdG8gYWxsb2NhdGUgUlBUIGJ1ZmZlciwgbGVuID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBoZXhfYnl0ZXNfZmlsbGVkKTsKLSAgICAgICAgb3NpX2ZyZWUoaGV4YnVmKTsKLSAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICAgICAgfQotICAgICAgQlRBX0hoU2V0UmVwb3J0KHBfZGV2LT5kZXZfaGFuZGxlLCByZXBvcnRUeXBlLCBwX2J1Zik7Ci0gICAgICBvc2lfZnJlZShoZXhidWYpOwotICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICAgIH0KLSAgICBvc2lfZnJlZShoZXhidWYpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2VuZF9kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgU0VORF9EQVRBIHRvIEhJRCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBzZW5kX2RhdGEoUmF3QWRkcmVzcyogYmRfYWRkciwgY2hhciogZGF0YSkgewotICBDSEVDS19CVEhIX0lOSVQoKTsKLSAgYnRpZl9oaF9kZXZpY2VfdCogcF9kZXY7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHI9IiA8PCAqYmRfYWRkcjsKLQotICBpZiAoYnRpZl9oaF9jYi5zdGF0dXMgPT0gQlRJRl9ISF9ESVNBQkxFRCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgSEggc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIHBfZGV2ID0gYnRpZl9oaF9maW5kX2Nvbm5lY3RlZF9kZXZfYnlfYmRhKCpiZF9hZGRyKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBMT0coRVJST1IpIDw8ICIgRXJyb3IsIGRldmljZSIgPDwgKmJkX2FkZHIgPDwgIiBub3Qgb3BlbmVkIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLQotICBlbHNlIHsKLSAgICBpbnQgaGV4X2J5dGVzX2ZpbGxlZDsKLSAgICBzaXplX3QgbGVuID0gKHN0cmxlbihkYXRhKSArIDEpIC8gMjsKLSAgICB1aW50OF90KiBoZXhidWYgPSAodWludDhfdCopb3NpX2NhbGxvYyhsZW4pOwotCi0gICAgLyogQnVpbGQgYSBTZW5kRGF0YSBkYXRhIGJ1ZmZlciAqLwotICAgIGhleF9ieXRlc19maWxsZWQgPSBhc2NpaV8yX2hleChkYXRhLCBsZW4sIGhleGJ1Zik7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiSGV4IGJ5dGVzIGZpbGxlZCwgaGV4IHZhbHVlOiAlZCwgJWQiLCBoZXhfYnl0ZXNfZmlsbGVkLAotICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLQotICAgIGlmIChoZXhfYnl0ZXNfZmlsbGVkKSB7Ci0gICAgICBCVF9IRFIqIHBfYnVmID0gY3JlYXRlX3BidWYoaGV4X2J5dGVzX2ZpbGxlZCwgaGV4YnVmKTsKLSAgICAgIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciwgZmFpbGVkIHRvIGFsbG9jYXRlIFJQVCBidWZmZXIsIGxlbiA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaGV4X2J5dGVzX2ZpbGxlZCk7Ci0gICAgICAgIG9zaV9mcmVlKGhleGJ1Zik7Ci0gICAgICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgICAgIH0KLSAgICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IEJUQV9ISF9SUFRUX09VVFBVVDsKLSAgICAgIEJUQV9IaFNlbmREYXRhKHBfZGV2LT5kZXZfaGFuZGxlLCAqYmRfYWRkciwgcF9idWYpOwotICAgICAgb3NpX2ZyZWUoaGV4YnVmKTsKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICB9Ci0gICAgb3NpX2ZyZWUoaGV4YnVmKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNsZWFudXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlcyB0aGUgSEggaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjbGVhbnVwKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2OwotICBpbnQgaTsKLSAgaWYgKGJ0aWZfaGhfY2Iuc3RhdHVzID09IEJUSUZfSEhfRElTQUJMRUQpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBISCBkaXNhYmxpbmcgb3IgZGlzYWJsZWQgYWxyZWFkeSwgc3RhdHVzID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnRpZl9oaF9jYi5zdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYnRfaGhfY2FsbGJhY2tzKSB7Ci0gICAgYnRpZl9oaF9jYi5zdGF0dXMgPSBCVElGX0hIX0RJU0FCTElORzsKLSAgICAvKiB1cGRhdGUgZmxhZywgbm90IHRvIGVuYWJsZSBoaWQgZGV2aWNlIHNlcnZpY2Ugbm93IGFzIEJUIGlzIHN3aXRjaGluZyBvZmYKLSAgICAgKi8KLSAgICBidGlmX2hoX2NiLnNlcnZpY2VfZGVyZWdfYWN0aXZlID0gRkFMU0U7Ci0gICAgYnRpZl9kaXNhYmxlX3NlcnZpY2UoQlRBX0hJRF9TRVJWSUNFX0lEKTsKLSAgICBidF9oaF9jYWxsYmFja3MgPSBOVUxMOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgIHBfZGV2ID0gJmJ0aWZfaGhfY2IuZGV2aWNlc1tpXTsKLSAgICBpZiAocF9kZXYtPmRldl9zdGF0dXMgIT0gQlRISF9DT05OX1NUQVRFX1VOS05PV04gJiYgcF9kZXYtPmZkID49IDApIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBDbG9zaW5nIHVoaWQgZmQgPSAlZCIsIF9fZnVuY19fLCBwX2Rldi0+ZmQpOwotICAgICAgaWYgKHBfZGV2LT5mZCA+PSAwKSB7Ci0gICAgICAgIGJ0YV9oaF9jb19kZXN0cm95KHBfZGV2LT5mZCk7Ci0gICAgICAgIHBfZGV2LT5mZCA9IC0xOwotICAgICAgfQotICAgICAgcF9kZXYtPmhoX2tlZXBfcG9sbGluZyA9IDA7Ci0gICAgICBwX2Rldi0+aGhfcG9sbF90aHJlYWRfaWQgPSAtMTsKLSAgICB9Ci0gIH0KLQotfQotCi1zdGF0aWMgY29uc3QgYnRoaF9pbnRlcmZhY2VfdCBidGhoSW50ZXJmYWNlID0gewotICAgIHNpemVvZihidGhoSW50ZXJmYWNlKSwKLSAgICBpbml0LAotICAgIGNvbm5lY3QsCi0gICAgZGlzY29ubmVjdCwKLSAgICB2aXJ0dWFsX3VucGx1ZywKLSAgICBzZXRfaW5mbywKLSAgICBnZXRfcHJvdG9jb2wsCi0gICAgc2V0X3Byb3RvY29sLAotICAgIGdldF9pZGxlX3RpbWUsCi0gICAgc2V0X2lkbGVfdGltZSwKLSAgICBnZXRfcmVwb3J0LAotICAgIHNldF9yZXBvcnQsCi0gICAgc2VuZF9kYXRhLAotICAgIGNsZWFudXAsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oaF9leGVjdXRlX3NlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemVzL1NodXRzIGRvd24gdGhlIHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX2hoX2V4ZWN1dGVfc2VydmljZShib29sIGJfZW5hYmxlKSB7Ci0gIGlmIChiX2VuYWJsZSkgewotICAgIC8qIEVuYWJsZSBhbmQgcmVnaXN0ZXIgd2l0aCBCVEEtSEggKi8KLSAgICBCVEFfSGhFbmFibGUoYnRlX2hoX2V2dCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogRGlzYWJsZSBISCAqLwotICAgIEJUQV9IaERpc2FibGUoKTsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX2hoX2dldF9pbnRlcmZhY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgaGggY2FsbGJhY2sgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidGhoX2ludGVyZmFjZV90Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGJ0aGhfaW50ZXJmYWNlX3QqIGJ0aWZfaGhfZ2V0X2ludGVyZmFjZSgpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRoaEludGVyZmFjZTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfa2V5c3RvcmUuY2MgYi9idGlmL3NyYy9idGlmX2tleXN0b3JlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTYyOGM4Li4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfa2V5c3RvcmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyogQmx1ZXRvb3RoS2V5c3RvcmUgSW50ZXJmYWNlICovCi0KLSNpbmNsdWRlICJidGlmX2tleXN0b3JlLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImdkL29zL3BhcmFtZXRlcl9wcm92aWRlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9jb25maWcuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6VW5yZXRhaW5lZDsKLXVzaW5nIGJsdWV0b290aDo6Ymx1ZXRvb3RoX2tleXN0b3JlOjpCbHVldG9vdGhLZXlzdG9yZUNhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6Ymx1ZXRvb3RoX2tleXN0b3JlOjpCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoX2tleXN0b3JlIHsKLWNsYXNzIEJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlSW1wbDsKLXN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZT4gYmx1ZXRvb3RoS2V5c3RvcmVJbnN0YW5jZTsKLWNvbnN0IGludCBDT05GSUdfQ09NUEFSRV9BTExfUEFTUyA9IDBiMTE7Ci0KLWNsYXNzIEJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlSW1wbAotICAgIDogcHVibGljIGJsdWV0b290aDo6Ymx1ZXRvb3RoX2tleXN0b3JlOjpCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSB7Ci0gIH5CbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBpbml0KEJsdWV0b290aEtleXN0b3JlQ2FsbGJhY2tzKiBjYWxsYmFja3MpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICAgIHRoaXMtPmNhbGxiYWNrcyA9IGNhbGxiYWNrczsKLQotICAgIGJsdWV0b290aDo6b3M6OlBhcmFtZXRlclByb3ZpZGVyOjpTZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoCi0gICAgICAgIENPTkZJR19DT01QQVJFX0FMTF9QQVNTKTsKLSAgICBDb252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCk7Ci0gIH0KLQotICB2b2lkIENvbnZlcnRFbmNyeXB0T3JEZWNyeXB0S2V5SWZOZWVkZWQoKSB7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgICBpZiAoIWNhbGxiYWNrcykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbGJhY2sgaXNuJ3QgcmVhZHkuIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoW10oKSB7Ci0gICAgICAgICAgICBzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpDb252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCk7Ci0gICAgICAgICAgfSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoW10oKSB7IGJ0aWZfc3RvcmFnZV9nZXRfbnVtX2JvbmRlZF9kZXZpY2VzKCk7IH0pKTsKLSAgfQotCi0gIGJvb2wgc2V0X2VuY3J5cHRfa2V5X29yX3JlbW92ZV9rZXkoc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlY3J5cHRlZFN0cmluZykgb3ZlcnJpZGUgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBwcmVmaXg6ICIgPDwgcHJlZml4OwotCi0gICAgaWYgKCFjYWxsYmFja3MpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxiYWNrIGlzbid0IHJlYWR5LiBwcmVmaXg6ICIgPDwgcHJlZml4OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNhdmUgdGhlIHZhbHVlIGludG8gYSBtYXAuCi0gICAga2V5X21hcFtwcmVmaXhdID0gZGVjcnlwdGVkU3RyaW5nOwotCi0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgYmFzZTo6QmluZCgmYmx1ZXRvb3RoOjpibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlQ2FsbGJhY2tzOjoKLSAgICAgICAgICAgICAgICAgICAgICAgc2V0X2VuY3J5cHRfa2V5X29yX3JlbW92ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjYWxsYmFja3MpLCBwcmVmaXgsIGRlY3J5cHRlZFN0cmluZykpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2tleShzdGQ6OnN0cmluZyBwcmVmaXgpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgcHJlZml4OiAiIDw8IHByZWZpeDsKLQotICAgIGlmICghY2FsbGJhY2tzKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBjYWxsYmFjayBpc24ndCByZWFkeS4gcHJlZml4OiAiIDw8IHByZWZpeDsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBkZWNyeXB0ZWRTdHJpbmc7Ci0gICAgLy8gdHJ5IHRvIGZpbmQgdGhlIGtleS4KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyID0ga2V5X21hcC5maW5kKHByZWZpeCk7Ci0gICAgaWYgKGl0ZXIgPT0ga2V5X21hcC5lbmQoKSkgewotICAgICAgZGVjcnlwdGVkU3RyaW5nID0gY2FsbGJhY2tzLT5nZXRfa2V5KHByZWZpeCk7Ci0gICAgICAvLyBTYXZlIHRoZSB2YWx1ZSBpbnRvIGEgbWFwLgotICAgICAga2V5X21hcFtwcmVmaXhdID0gZGVjcnlwdGVkU3RyaW5nOwotICAgICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBnZXQga2V5IGZyb20gYmx1ZXRvb3Roa2V5c3RvcmUuIjsKLSAgICB9IGVsc2UgewotICAgICAgZGVjcnlwdGVkU3RyaW5nID0gaXRlci0+c2Vjb25kOwotICAgIH0KLSAgICByZXR1cm4gZGVjcnlwdGVkU3RyaW5nOwotICB9Ci0KLSAgdm9pZCBjbGVhcl9tYXAoKSBvdmVycmlkZSB7Ci0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gZW1wdHlfbWFwOwotICAgIGtleV9tYXAuc3dhcChlbXB0eV9tYXApOwotICAgIGtleV9tYXAuY2xlYXIoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQmx1ZXRvb3RoS2V5c3RvcmVDYWxsYmFja3MqIGNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4ga2V5X21hcDsKLX07Ci0KLUJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBnZXRCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSgpIHsKLSAgaWYgKCFibHVldG9vdGhLZXlzdG9yZUluc3RhbmNlKSB7Ci0gICAgYmx1ZXRvb3RoS2V5c3RvcmVJbnN0YW5jZS5yZXNldChuZXcgQmx1ZXRvb3RoS2V5c3RvcmVJbnRlcmZhY2VJbXBsKCkpOwotICB9Ci0KLSAgcmV0dXJuIGJsdWV0b290aEtleXN0b3JlSW5zdGFuY2UuZ2V0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGhfa2V5c3RvcmUKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfbGVfYXVkaW8uY2MgYi9idGlmL3NyYy9idGlmX2xlX2F1ZGlvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjgwZmNmLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfbGVfYXVkaW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2xlX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGFfbGVfYXVkaW9fYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6VW5yZXRhaW5lZDsKLXVzaW5nIGJsdWV0b290aDo6bGVfYXVkaW86OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwTm9kZVN0YXR1czsKLXVzaW5nIGJsdWV0b290aDo6bGVfYXVkaW86Okdyb3VwU3RhdHVzOwotdXNpbmcgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6TGVBdWRpb0NsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6bGVfYXVkaW86OkxlQXVkaW9DbGllbnRJbnRlcmZhY2U7Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlSW1wbDsKLXN0ZDo6dW5pcXVlX3B0cjxMZUF1ZGlvQ2xpZW50SW50ZXJmYWNlPiBsZUF1ZGlvSW5zdGFuY2U7Ci0KLWNsYXNzIExlQXVkaW9DbGllbnRJbnRlcmZhY2VJbXBsIDogcHVibGljIExlQXVkaW9DbGllbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBMZUF1ZGlvQ2xpZW50Q2FsbGJhY2tzIHsKLSAgfkxlQXVkaW9DbGllbnRJbnRlcmZhY2VJbXBsKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmTGVBdWRpb0NsaWVudENhbGxiYWNrczo6T25Db25uZWN0aW9uU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBzdGF0ZSwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBPbkdyb3VwU3RhdHVzKGludCBncm91cF9pZCwgR3JvdXBTdGF0dXMgZ3JvdXBfc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBCaW5kKCZMZUF1ZGlvQ2xpZW50Q2FsbGJhY2tzOjpPbkdyb3VwU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIGdyb3VwX2lkLCBncm91cF9zdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgT25Hcm91cE5vZGVTdGF0dXMoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgaW50IGdyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwTm9kZVN0YXR1cyBub2RlX3N0YXR1cykgb3ZlcnJpZGUgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgQmluZCgmTGVBdWRpb0NsaWVudENhbGxiYWNrczo6T25Hcm91cE5vZGVTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzKSwgYWRkciwgZ3JvdXBfaWQsIG5vZGVfc3RhdHVzKSk7Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9Db25mKHVpbnQ4X3QgZGlyZWN0aW9uLCBpbnQgZ3JvdXBfaWQsIHVpbnQzMl90IHNua19hdWRpb19sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfYXVkaW9fbG9jYXRpb24sIHVpbnQxNl90IGF2YWlsX2NvbnQpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIEJpbmQoJkxlQXVkaW9DbGllbnRDYWxsYmFja3M6Ok9uQXVkaW9Db25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIGRpcmVjdGlvbiwgZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNua19hdWRpb19sb2NhdGlvbiwgc3JjX2F1ZGlvX2xvY2F0aW9uLCBhdmFpbF9jb250KSk7Ci0gIH0KLQotICB2b2lkIEluaXRpYWxpemUoTGVBdWRpb0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzKSBvdmVycmlkZSB7Ci0gICAgdGhpcy0+Y2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIEJpbmQoJkxlQXVkaW9DbGllbnQ6OkluaXRpYWxpemUsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmlfdGhyZWFkX3dyYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9IRVJFLCBCaW5kKCZidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfbGVhdWRpbykpLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChbXSgpIC0+IGJvb2wgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTGVBdWRpb0hhbFZlcmlmaWVyOjpTdXBwb3J0c0xlQXVkaW8oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7Ci0gIH0KLQotICB2b2lkIENsZWFudXAodm9pZCkgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgQmluZCgmTGVBdWRpb0NsaWVudDo6Q2xlYW51cCkpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZMZUF1ZGlvQ2xpZW50OjpSZW1vdmVEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKExlQXVkaW9DbGllbnQ6OkdldCgpKSwgYWRkcmVzcykpOwotCi0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJmJ0aWZfc3RvcmFnZV9yZW1vdmVfbGVhdWRpbywgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgQmluZCgmTGVBdWRpb0NsaWVudDo6Q29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoTGVBdWRpb0NsaWVudDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICBCaW5kKCZMZUF1ZGlvQ2xpZW50OjpEaXNjb25uZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChMZUF1ZGlvQ2xpZW50OjpHZXQoKSksIGFkZHJlc3MpKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIEJpbmQoJmJ0aWZfc3RvcmFnZV9zZXRfbGVhdWRpb19hdXRvY29ubmVjdCwgYWRkcmVzcywgZmFsc2UpKTsKLSAgfQotCi0gIHZvaWQgR3JvdXBBZGROb2RlKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICAgICA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLCBCaW5kKCZMZUF1ZGlvQ2xpZW50OjpHcm91cEFkZE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKExlQXVkaW9DbGllbnQ6OkdldCgpKSwgZ3JvdXBfaWQsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgR3JvdXBSZW1vdmVOb2RlKGNvbnN0IGludCBncm91cF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgZ3JvdXBfaWQ6ICIgPDwgZ3JvdXBfaWQKLSAgICAgICAgICAgICA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLCBCaW5kKCZMZUF1ZGlvQ2xpZW50OjpHcm91cFJlbW92ZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKExlQXVkaW9DbGllbnQ6OkdldCgpKSwgZ3JvdXBfaWQsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgR3JvdXBTZXRBY3RpdmUoY29uc3QgaW50IGdyb3VwX2lkKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBncm91cF9pZDogIiA8PCBncm91cF9pZDsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgQmluZCgmTGVBdWRpb0NsaWVudDo6R3JvdXBTZXRBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKExlQXVkaW9DbGllbnQ6OkdldCgpKSwgZ3JvdXBfaWQpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTGVBdWRpb0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzOwotfTsKLQotfSAvKiBuYW1lc3BhY2UgKi8KLQotTGVBdWRpb0NsaWVudEludGVyZmFjZSogYnRpZl9sZV9hdWRpb19nZXRfaW50ZXJmYWNlKCkgewotICBpZiAoIWxlQXVkaW9JbnN0YW5jZSkgewotICAgIGxlQXVkaW9JbnN0YW5jZS5yZXNldChuZXcgTGVBdWRpb0NsaWVudEludGVyZmFjZUltcGwoKSk7Ci0gIH0KLQotICByZXR1cm4gbGVBdWRpb0luc3RhbmNlLmdldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9sZWF1ZGlvX2hhbF92ZXJzaW9uX2hvc3QuY2MgYi9idGlmL3NyYy9idGlmX2xlYXVkaW9faGFsX3ZlcnNpb25faG9zdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5M2Y4MC4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX2xlYXVkaW9faGFsX3ZlcnNpb25faG9zdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJlbWJkcnYvbGMzL0FwaS9MYzNFbmNvZGVyLmhwcCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXVkaW8gewotY2xhc3MgSGFsVmVyc2lvbk1hbmFnZXIgewotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEhhbFZlcnNpb25NYW5hZ2VyPiBpbnN0YW5jZV9wdHI7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLXN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OmF1ZGlvOjpIYWxWZXJzaW9uTWFuYWdlcj4KLSAgICBibHVldG9vdGg6OmF1ZGlvOjpIYWxWZXJzaW9uTWFuYWdlcjo6aW5zdGFuY2VfcHRyOwpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9tZXRyaWNzX2xvZ2dpbmcuY2MgYi9idGlmL3NyYy9idGlmX21ldHJpY3NfbG9nZ2luZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3N2ZkNC4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX21ldHJpY3NfbG9nZ2luZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9tZXRyaWNzX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL21ldHJpY3NfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIGxvZ19hMmRwX2F1ZGlvX3VuZGVycnVuX2V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9taXNzaW5nX3BjbV9ieXRlcykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KAotICAgICAgICBhZGRyZXNzLCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsIG51bV9taXNzaW5nX3BjbV9ieXRlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgYmx1ZXRvb3RoOjpjb21tb246OkxvZ0EyZHBBdWRpb1VuZGVycnVuRXZlbnQoCi0gICAgICAgIGFkZHJlc3MsIGVuY29kaW5nX2ludGVydmFsX21pbGxpcywgbnVtX21pc3NpbmdfcGNtX2J5dGVzKTsKLSAgfQotfQotCi12b2lkIGxvZ19hMmRwX2F1ZGlvX292ZXJydW5fZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudCgKLSAgICAgICAgYWRkcmVzcywgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgYmx1ZXRvb3RoOjpjb21tb246OkxvZ0EyZHBBdWRpb092ZXJydW5FdmVudCgKLSAgICAgICAgYWRkcmVzcywgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyk7Ci0gIH0KLX0KLQotdm9pZCBsb2dfYTJkcF9wbGF5YmFja19ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jb2RpbmdfbW9kZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNBMmRwUGxheWJhY2tFdmVudChhZGRyZXNzLCBwbGF5YmFja19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvZGluZ19tb2RlKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TG9nQTJkcFBsYXliYWNrRXZlbnQoYWRkcmVzcywgcGxheWJhY2tfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvZGluZ19tb2RlKTsKLSAgfQotfQotCi12b2lkIGxvZ19yZWFkX3Jzc2lfcmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywgaW50OF90IHJzc2kpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfYW55X2dkX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TG9nTWV0cmljUmVhZFJzc2lSZXN1bHQoYWRkcmVzcywgaGFuZGxlLCBjbWRfc3RhdHVzLCByc3NpKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TG9nUmVhZFJzc2lSZXN1bHQoYWRkcmVzcywgaGFuZGxlLCBjbWRfc3RhdHVzLCByc3NpKTsKLSAgfQotfQotCi12b2lkIGxvZ19yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfcmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY1JlYWRGYWlsZWRDb250YWN0Q291bnRlclJlc3VsdCgKLSAgICAgICAgYWRkcmVzcywgaGFuZGxlLCBjbWRfc3RhdHVzLCBmYWlsZWRfY29udGFjdF9jb3VudGVyKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TG9nUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KAotICAgICAgICBhZGRyZXNzLCBoYW5kbGUsIGNtZF9zdGF0dXMsIGZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotICB9Ci19Ci0KLXZvaWQgbG9nX3JlYWRfdHhfcG93ZXJfbGV2ZWxfcmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoCi0gICAgICAgIGFkZHJlc3MsIGhhbmRsZSwgY21kX3N0YXR1cywgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpOwotICB9IGVsc2UgewotICAgIGJsdWV0b290aDo6Y29tbW9uOjpMb2dSZWFkVHhQb3dlckxldmVsUmVzdWx0KGFkZHJlc3MsIGhhbmRsZSwgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci0gIH0KLX0KLQotdm9pZCBsb2dfc29ja2V0X2Nvbm5lY3Rpb25fc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHBvcnQsIGludCB0eXBlLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Q29ubmVjdGlvbnN0YXRlRW51bSBjb25uZWN0aW9uX3N0YXRlLAotICAgIGludDY0X3QgdHhfYnl0ZXMsIGludDY0X3QgcnhfYnl0ZXMsIGludCB1aWQsIGludCBzZXJ2ZXJfcG9ydCwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY1NvY2tldENvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgYWRkcmVzcywgcG9ydCwgdHlwZSwgY29ubmVjdGlvbl9zdGF0ZSwgdHhfYnl0ZXMsIHJ4X2J5dGVzLCB1aWQsCi0gICAgICAgIHNlcnZlcl9wb3J0LCBzb2NrZXRfcm9sZSk7Ci0gIH0gZWxzZSB7Ci0gICAgYmx1ZXRvb3RoOjpjb21tb246OkxvZ1NvY2tldENvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgYWRkcmVzcywgcG9ydCwgdHlwZSwgY29ubmVjdGlvbl9zdGF0ZSwgdHhfYnl0ZXMsIHJ4X2J5dGVzLCB1aWQsCi0gICAgICAgIHNlcnZlcl9wb3J0LCBzb2NrZXRfcm9sZSk7Ci0gIH0KLX0KLQotYm9vbCBpbml0X21ldHJpY19pZF9hbGxvY2F0b3IoCi0gICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4mIHBhaXJlZF9kZXZpY2VfbWFwLAotICAgIGJsdWV0b290aDo6c2hpbTo6Q2FsbGJhY2tMZWdhY3kgc2F2ZV9kZXZpY2VfY2FsbGJhY2ssCi0gICAgYmx1ZXRvb3RoOjpzaGltOjpDYWxsYmFja0xlZ2FjeSBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpJbml0TWV0cmljSWRBbGxvY2F0b3IoCi0gICAgICAgIHBhaXJlZF9kZXZpY2VfbWFwLCBzdGQ6Om1vdmUoc2F2ZV9kZXZpY2VfY2FsbGJhY2spLAotICAgICAgICBzdGQ6Om1vdmUoZm9yZ2V0X2RldmljZV9jYWxsYmFjaykpOwotICB9Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuSW5pdCgKLSAgICAgIHBhaXJlZF9kZXZpY2VfbWFwLCBzdGQ6Om1vdmUoc2F2ZV9kZXZpY2VfY2FsbGJhY2spLAotICAgICAgc3RkOjptb3ZlKGZvcmdldF9kZXZpY2VfY2FsbGJhY2spKTsKLX0KLQotYm9vbCBjbG9zZV9tZXRyaWNfaWRfYWxsb2NhdG9yKCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6Q2xvc2VNZXRyaWNJZEFsbG9jYXRvcigpOwotICB9Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuQ2xvc2UoKTsKLX0KLQotaW50IGFsbG9jYXRlX21ldHJpY19pZF9mcm9tX21ldHJpY19pZF9hbGxvY2F0b3IoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QWxsb2NhdGVJZEZyb21NZXRyaWNJZEFsbG9jYXRvcihhZGRyZXNzKTsKLSAgfQotICByZXR1cm4gYmx1ZXRvb3RoOjpjb21tb246Ok1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoCi0gICAgICBhZGRyZXNzKTsKLX0KLQotaW50IHNhdmVfbWV0cmljX2lkX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpTYXZlRGV2aWNlT25NZXRyaWNJZEFsbG9jYXRvcihhZGRyZXNzKTsKLSAgfQotICByZXR1cm4gYmx1ZXRvb3RoOjpjb21tb246Ok1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpLlNhdmVEZXZpY2UoCi0gICAgICBhZGRyZXNzKTsKLX0KLQotdm9pZCBmb3JnZXRfZGV2aWNlX2Zyb21fbWV0cmljX2lkX2FsbG9jYXRvcihjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkZvcmdldERldmljZUZyb21NZXRyaWNJZEFsbG9jYXRvcihhZGRyZXNzKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuRm9yZ2V0RGV2aWNlKGFkZHJlc3MpOwotICB9Ci19Ci0KLWJvb2wgaXNfdmFsaWRfaWRfZnJvbV9tZXRyaWNfaWRfYWxsb2NhdG9yKGNvbnN0IGludCBpZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6SXNWYWxpZElkRnJvbU1ldHJpY0lkQWxsb2NhdG9yKGlkKTsKLSAgfQotICByZXR1cm4gYmx1ZXRvb3RoOjpjb21tb246Ok1ldHJpY0lkQWxsb2NhdG9yOjpJc1ZhbGlkSWQoaWQpOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9wYW4uY2MgYi9idGlmL3NyYy9idGlmX3Bhbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjNjM2Yi4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3Bhbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDc1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX3Bhbi5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIFBBTiBQcm9maWxlIEJsdWV0b290aCBJbnRlcmZhY2UKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX3BhbiIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+Ci0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX3Bhbl9hcGkuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9wYW5faW50ZXJuYWwuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zb2NrX3RocmVhZC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X3Bhbi5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIgIC8vIGRvX2luX21haW5fdGhyZWFkCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wYW5fYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBGT1JXQVJEX0lHTk9SRSAxCi0jZGVmaW5lIEZPUldBUkRfU1VDQ0VTUyAwCi0jZGVmaW5lIEZPUldBUkRfRkFJTFVSRSAoLTEpCi0jZGVmaW5lIEZPUldBUkRfQ09OR0VTVCAoLTIpCi0KLSNkZWZpbmUgYXNydChzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKHMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoImJ0aWZfcGFuOiAjIyAlcyBhc3NlcnQgJXMgZmFpbGVkIGF0IGxpbmU6JWQgIyMiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAjcywgX19MSU5FX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIE1JTih4LCB5KSAoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCi0KLWJ0cGFuX2NiX3QgYnRwYW5fY2I7Ci0KLXN0YXRpYyBib29sIGpuaV9pbml0aWFsaXplZDsKLXN0YXRpYyBib29sIHN0YWNrX2luaXRpYWxpemVkOwotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRwYW5fam5pX2luaXQoY29uc3QgYnRwYW5fY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7Ci1zdGF0aWMgdm9pZCBidHBhbl9qbmlfY2xlYW51cCgpOwotc3RhdGljIGJ0X3N0YXR1c190IGJ0cGFuX2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IGxvY2FsX3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlX3JvbGUpOwotc3RhdGljIGJ0X3N0YXR1c190IGJ0cGFuX2Rpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcik7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgYnRwYW5fZW5hYmxlKGludCBsb2NhbF9yb2xlKTsKLXN0YXRpYyBpbnQgYnRwYW5fZ2V0X2xvY2FsX3JvbGUodm9pZCk7Ci0KLXN0YXRpYyB2b2lkIGJ0cGFuX3RhcF9mZF9zaWduYWxlZChpbnQgZmQsIGludCB0eXBlLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZCk7Ci1zdGF0aWMgdm9pZCBidHBhbl9jbGVhbnVwX2Nvbm4oYnRwYW5fY29ubl90KiBjb25uKTsKLXN0YXRpYyB2b2lkIGJ0YV9wYW5fY2FsbGJhY2sodEJUQV9QQU5fRVZUIGV2ZW50LCB0QlRBX1BBTiogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGJ0dV9leGVjX3RhcF9mZF9yZWFkKGNvbnN0IGludCBmZCk7Ci0KLXN0YXRpYyBidHBhbl9pbnRlcmZhY2VfdCBwYW5faWYgPSB7Ci0gICAgc2l6ZW9mKHBhbl9pZiksIGJ0cGFuX2puaV9pbml0LCAgIG51bGxwdHIsICAgICAgICAgIGJ0cGFuX2dldF9sb2NhbF9yb2xlLAotICAgIGJ0cGFuX2Nvbm5lY3QsICBidHBhbl9kaXNjb25uZWN0LCBidHBhbl9qbmlfY2xlYW51cH07Ci0KLWNvbnN0IGJ0cGFuX2ludGVyZmFjZV90KiBidGlmX3Bhbl9nZXRfaW50ZXJmYWNlKCkgeyByZXR1cm4gJnBhbl9pZjsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqCi0gKiogRnVuY3Rpb24gICAgICAgIGJ0aWZfcGFuX2luaXQKLSAqKgotICoqIERlc2NyaXB0aW9uICAgICBpbml0aWFsaXplcyB0aGUgcGFuIGludGVyZmFjZQotICoqCi0gKiogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190Ci0gKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfcGFuX2luaXQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoImpuaV9pbml0aWFsaXplZCA9ICVkLCBidHBhbl9jYi5lbmFibGVkOiVkIiwgam5pX2luaXRpYWxpemVkLAotICAgICAgICAgICAgICAgICAgIGJ0cGFuX2NiLmVuYWJsZWQpOwotICBzdGFja19pbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgaWYgKGpuaV9pbml0aWFsaXplZCAmJiAhYnRwYW5fY2IuZW5hYmxlZCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIkVuYWJsaW5nIFBBTi4uLi4iKTsKLSAgICBtZW1zZXQoJmJ0cGFuX2NiLCAwLCBzaXplb2YoYnRwYW5fY2IpKTsKLSAgICBidHBhbl9jYi50YXBfZmQgPSBJTlZBTElEX0ZEOwotICAgIGJ0cGFuX2NiLmZsb3cgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrKQotICAgICAgYnRwYW5fY2xlYW51cF9jb25uKCZidHBhbl9jYi5jb25uc1tpXSk7Ci0gICAgQlRBX1BhbkVuYWJsZShidGFfcGFuX2NhbGxiYWNrKTsKLSAgICBidHBhbl9jYi5lbmFibGVkID0gMTsKLQotICAgIGludCByb2xlID0gQlRQQU5fUk9MRV9OT05FOwotI2lmIFBBTl9OQVBfRElTQUJMRUQgPT0gRkFMU0UKLSAgICByb2xlIHw9IEJUUEFOX1JPTEVfUEFOTkFQOwotI2VuZGlmCi0jaWYgUEFOVV9ESVNBQkxFRCA9PSBGQUxTRQotICAgIHJvbGUgfD0gQlRQQU5fUk9MRV9QQU5VOwotI2VuZGlmCi0gICAgYnRwYW5fZW5hYmxlKHJvbGUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbl9kaXNhYmxlKCkgewotICBpZiAoYnRwYW5fY2IuZW5hYmxlZCkgewotICAgIGJ0cGFuX2NiLmVuYWJsZWQgPSAwOwotICAgIEJUQV9QYW5EaXNhYmxlKCk7Ci0gICAgaWYgKGJ0cGFuX2NiLnRhcF9mZCAhPSBJTlZBTElEX0ZEKSB7Ci0gICAgICBidHBhbl90YXBfY2xvc2UoYnRwYW5fY2IudGFwX2ZkKTsKLSAgICAgIGJ0cGFuX2NiLnRhcF9mZCA9IElOVkFMSURfRkQ7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgYnRpZl9wYW5fY2xlYW51cCgpIHsKLSAgaWYgKCFzdGFja19pbml0aWFsaXplZCkgcmV0dXJuOwotCi0gIC8vIEJsdWV0b290aCBpcyBzaHV0aW5nIGRvd24sIGludmFsaWRhdGUgYWxsIEJUQSBQQU4gaGFuZGxlcwotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykKLSAgICBidHBhbl9jbGVhbnVwX2Nvbm4oJmJ0cGFuX2NiLmNvbm5zW2ldKTsKLQotICBwYW5fZGlzYWJsZSgpOwotICBzdGFja19pbml0aWFsaXplZCA9IGZhbHNlOwotfQotCi1zdGF0aWMgYnRwYW5fY2FsbGJhY2tzX3QgY2FsbGJhY2s7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgYnRwYW5fam5pX2luaXQoY29uc3QgYnRwYW5fY2FsbGJhY2tzX3QqIGNhbGxiYWNrcykgewotICBCVElGX1RSQUNFX0RFQlVHKCJzdGFja19pbml0aWFsaXplZCA9ICVkLCBidHBhbl9jYi5lbmFibGVkOiVkIiwKLSAgICAgICAgICAgICAgICAgICBzdGFja19pbml0aWFsaXplZCwgYnRwYW5fY2IuZW5hYmxlZCk7Ci0gIGNhbGxiYWNrID0gKmNhbGxiYWNrczsKLSAgam5pX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgaWYgKHN0YWNrX2luaXRpYWxpemVkICYmICFidHBhbl9jYi5lbmFibGVkKSBidGlmX3Bhbl9pbml0KCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgYnRwYW5fam5pX2NsZWFudXAoKSB7Ci0gIHBhbl9kaXNhYmxlKCk7Ci0gIGpuaV9pbml0aWFsaXplZCA9IGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBidGFfcm9sZV90b19idHBhbih0QlRBX1BBTl9ST0xFIGJ0YV9wYW5fcm9sZSkgewotICBpbnQgYnRwYW5fcm9sZSA9IDA7Ci0gIGlmIChidGFfcGFuX3JvbGUgJiBQQU5fUk9MRV9OQVBfU0VSVkVSKSBidHBhbl9yb2xlIHw9IEJUUEFOX1JPTEVfUEFOTkFQOwotICBpZiAoYnRhX3Bhbl9yb2xlICYgUEFOX1JPTEVfQ0xJRU5UKSBidHBhbl9yb2xlIHw9IEJUUEFOX1JPTEVfUEFOVTsKLSAgcmV0dXJuIGJ0cGFuX3JvbGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdEJUQV9QQU5fUk9MRSBidHBhbl9yb2xlX3RvX2J0YShpbnQgYnRwYW5fcm9sZSkgewotICB0QlRBX1BBTl9ST0xFIGJ0YV9wYW5fcm9sZSA9IFBBTl9ST0xFX0lOQUNUSVZFOwotICBpZiAoYnRwYW5fcm9sZSAmIEJUUEFOX1JPTEVfUEFOTkFQKSBidGFfcGFuX3JvbGUgfD0gUEFOX1JPTEVfTkFQX1NFUlZFUjsKLSAgaWYgKGJ0cGFuX3JvbGUgJiBCVFBBTl9ST0xFX1BBTlUpIGJ0YV9wYW5fcm9sZSB8PSBQQU5fUk9MRV9DTElFTlQ7Ci0gIHJldHVybiBidGFfcGFuX3JvbGU7Ci19Ci0KLXN0YXRpYyB0QlRBX1BBTl9ST0xFIGJ0cGFuX2Rldl9sb2NhbF9yb2xlOwotc3RhdGljIHRCVEFfUEFOX1JPTEVfSU5GTyBidGFfcGFudV9pbmZvID0ge1BBTlVfU0VSVklDRV9OQU1FLCAwfTsKLXN0YXRpYyB0QlRBX1BBTl9ST0xFX0lORk8gYnRhX3Bhbl9uYXBfaW5mbyA9IHtQQU5fTkFQX1NFUlZJQ0VfTkFNRSwgMX07Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidHBhbl9lbmFibGUoaW50IGxvY2FsX3JvbGUpIHsKLSAgY29uc3QgdEJUQV9QQU5fUk9MRSBidGFfcGFuX3JvbGUgPSBidHBhbl9yb2xlX3RvX2J0YShsb2NhbF9yb2xlKTsKLSAgQlRBX1BhblNldFJvbGUoYnRhX3Bhbl9yb2xlLCAmYnRhX3BhbnVfaW5mbywgJmJ0YV9wYW5fbmFwX2luZm8pOwotICBidHBhbl9kZXZfbG9jYWxfcm9sZSA9IGxvY2FsX3JvbGU7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBidHBhbl9nZXRfbG9jYWxfcm9sZSgpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnRwYW5fZGV2X2xvY2FsX3JvbGUpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRwYW5fY29ubmVjdChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBpbnQgbG9jYWxfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW1vdGVfcm9sZSkgewotICB0QlRBX1BBTl9ST0xFIGJ0YV9sb2NhbF9yb2xlID0gYnRwYW5fcm9sZV90b19idGEobG9jYWxfcm9sZSk7Ci0gIHRCVEFfUEFOX1JPTEUgYnRhX3JlbW90ZV9yb2xlID0gYnRwYW5fcm9sZV90b19idGEocmVtb3RlX3JvbGUpOwotICBidHBhbl9uZXdfY29ubigtMSwgKmJkX2FkZHIsIGJ0YV9sb2NhbF9yb2xlLCBidGFfcmVtb3RlX3JvbGUpOwotICBCVEFfUGFuT3BlbigqYmRfYWRkciwgYnRhX2xvY2FsX3JvbGUsIGJ0YV9yZW1vdGVfcm9sZSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9pbl9wYW5fZ2VuZXJpY19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGV2ZW50PSVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRJRl9QQU5fQ0JfRElTQ09OTkVDVElORzogewotICAgICAgUmF3QWRkcmVzcyogYmRfYWRkciA9IChSYXdBZGRyZXNzKilwX3BhcmFtOwotICAgICAgYnRwYW5fY29ubl90KiBjb25uID0gYnRwYW5fZmluZF9jb25uX2FkZHIoKmJkX2FkZHIpOwotICAgICAgaW50IGJ0cGFuX2Nvbm5fbG9jYWxfcm9sZTsKLSAgICAgIGludCBidHBhbl9yZW1vdGVfcm9sZTsKLSAgICAgIGFzcnQoY29ubiAhPSBOVUxMKTsKLSAgICAgIGlmIChjb25uKSB7Ci0gICAgICAgIGJ0cGFuX2Nvbm5fbG9jYWxfcm9sZSA9IGJ0YV9yb2xlX3RvX2J0cGFuKGNvbm4tPmxvY2FsX3JvbGUpOwotICAgICAgICBidHBhbl9yZW1vdGVfcm9sZSA9IGJ0YV9yb2xlX3RvX2J0cGFuKGNvbm4tPnJlbW90ZV9yb2xlKTsKLSAgICAgICAgY2FsbGJhY2suY29ubmVjdGlvbl9zdGF0ZV9jYihCVFBBTl9TVEFURV9ESVNDT05ORUNUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTLCAmY29ubi0+cGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHBhbl9jb25uX2xvY2FsX3JvbGUsIGJ0cGFuX3JlbW90ZV9yb2xlKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXMgOiBVbmtub3duIGV2ZW50IDB4JXgiLCBfX2Z1bmNfXywgZXZlbnQpOwotICAgIH0gYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0cGFuX2Rpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBidHBhbl9jb25uX3QqIGNvbm4gPSBidHBhbl9maW5kX2Nvbm5fYWRkcigqYmRfYWRkcik7Ci0gIGlmIChjb25uICYmIGNvbm4tPmhhbmRsZSA+PSAwKSB7Ci0gICAgLyogSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZSBkaXNjb25uZWN0IGhhcyBiZWVuIGluaXRpYXRlZAotICAgICAqIHN1Y2Nlc3NmdWxseSAqLwotICAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2luX3Bhbl9nZW5lcmljX2V2dCwgQlRJRl9QQU5fQ0JfRElTQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWJkX2FkZHIsIHNpemVvZihSYXdBZGRyZXNzKSwgTlVMTCk7Ci0gICAgQlRBX1BhbkNsb3NlKGNvbm4tPmhhbmRsZSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotc3RhdGljIGludCBwYW5fcHRoID0gLTE7Ci12b2lkIGNyZWF0ZV90YXBfcmVhZF90aHJlYWQoaW50IHRhcF9mZCkgewotICBpZiAocGFuX3B0aCA8IDApIHBhbl9wdGggPSBidHNvY2tfdGhyZWFkX2NyZWF0ZShidHBhbl90YXBfZmRfc2lnbmFsZWQsIE5VTEwpOwotICBpZiAocGFuX3B0aCA+PSAwKQotICAgIGJ0c29ja190aHJlYWRfYWRkX2ZkKHBhbl9wdGgsIHRhcF9mZCwgMCwgU09DS19USFJFQURfRkRfUkQsIDApOwotfQotCi12b2lkIGRlc3Ryb3lfdGFwX3JlYWRfdGhyZWFkKHZvaWQpIHsKLSAgaWYgKHBhbl9wdGggPj0gMCkgewotICAgIGJ0c29ja190aHJlYWRfZXhpdChwYW5fcHRoKTsKLSAgICBwYW5fcHRoID0gLTE7Ci0gIH0KLX0KLQotc3RhdGljIGludCB0YXBfaWZfdXAoY29uc3QgY2hhciogZGV2bmFtZSwgY29uc3QgUmF3QWRkcmVzcyogYWRkcikgewotICBzdHJ1Y3QgaWZyZXEgaWZyOwotICBpbnQgc2ssIGVycjsKLQotICBzayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLSAgaWYgKHNrIDwgMCkgcmV0dXJuIC0xOwotCi0gIC8vIHNldCBtYWMgYWRkcgotICBtZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwotICBzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2bmFtZSwgSUZOQU1TSVopOwotICBlcnIgPSBpb2N0bChzaywgU0lPQ0dJRkhXQUREUiwgJmlmcik7Ci0gIGlmIChlcnIgPCAwKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigKLSAgICAgICAgIkNvdWxkIG5vdCBnZXQgbmV0d29yayBoYXJkd2FyZSBmb3IgaW50ZXJmYWNlOiVzLCBlcnJubzolcyIsIGRldm5hbWUsCi0gICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgY2xvc2Uoc2spOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBkZXZuYW1lLCBJRk5BTVNJWik7Ci0gIG1lbWNweShpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBhZGRyLT5hZGRyZXNzLCA2KTsKLQotICAvKiBUaGUgSUVFRSBoYXMgc3BlY2lmaWVkIHRoYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBtb3N0Ci0gICAqIHNpZ25pZmljYW50IGJ5dGUgaXMgdXNlZCB0bwotICAgKiBkZXRlcm1pbmUgYSBtdWx0aWNhc3QgYWRkcmVzcy4gSWYgaXRzIGEgMSwgdGhhdCBtZWFucyBtdWx0aWNhc3QsIDAgbWVhbnMKLSAgICogdW5pY2FzdC4KLSAgICogS2VybmVsIHJldHVybnMgYW4gZXJyb3IgaWYgd2UgdHJ5IHRvIHNldCBhIG11bHRpY2FzdCBhZGRyZXNzIGZvciB0aGUKLSAgICogdHVuLXRhcCBldGhlcm5ldCBpbnRlcmZhY2UuCi0gICAqIE1hc2sgdGhpcyBiaXQgdG8gYXZvaWQgYW55IGlzc3VlIHdpdGggYXV0byBnZW5lcmF0ZWQgYWRkcmVzcy4KLSAgICovCi0gIGlmIChpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzBdICYgMHgwMSkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIk5vdCBhIHVuaWNhc3QgTUFDIGFkZHJlc3MsIGZvcmNlIG11bHRpY2FzdCBiaXQgZmxpcHBpbmciKTsKLSAgICBpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzBdICY9IH4weDAxOwotICB9Ci0KLSAgZXJyID0gaW9jdGwoc2ssIFNJT0NTSUZIV0FERFIsIChjYWRkcl90KSZpZnIpOwotCi0gIGlmIChlcnIgPCAwKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiQ291bGQgbm90IHNldCBidCBhZGRyZXNzIGZvciBpbnRlcmZhY2U6JXMsIGVycm5vOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgIGRldm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgY2xvc2Uoc2spOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8vIGJyaW5nIGl0IHVwCi0gIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0gIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBkZXZuYW1lLCBJRl9OQU1FU0laRSk7Ci0KLSAgaWZyLmlmcl9mbGFncyB8PSBJRkZfVVA7Ci0gIGlmci5pZnJfZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKLQotICBlcnIgPSBpb2N0bChzaywgU0lPQ1NJRkZMQUdTLCAoY2FkZHJfdCkmaWZyKTsKLQotICBpZiAoZXJyIDwgMCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIkNvdWxkIG5vdCBicmluZyB1cCBuZXR3b3JrIGludGVyZmFjZTolcywgZXJybm86JWQiLAotICAgICAgICAgICAgICAgICAgICAgZGV2bmFtZSwgZXJybm8pOwotICAgIGNsb3NlKHNrKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgY2xvc2Uoc2spOwotICBCVElGX1RSQUNFX0RFQlVHKCJuZXR3b3JrIGludGVyZmFjZTogJXMgaXMgdXAiLCBkZXZuYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFwX2lmX2Rvd24oY29uc3QgY2hhciogZGV2bmFtZSkgewotICBzdHJ1Y3QgaWZyZXEgaWZyOwotICBpbnQgc2s7Ci0KLSAgc2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0gIGlmIChzayA8IDApIHJldHVybiAtMTsKLQotICBtZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwotICBzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2bmFtZSwgSUZfTkFNRVNJWkUpOwotCi0gIGlmci5pZnJfZmxhZ3MgJj0gfklGRl9VUDsKLQotICBpb2N0bChzaywgU0lPQ1NJRkZMQUdTLCAoY2FkZHJfdCkmaWZyKTsKLQotICBjbG9zZShzayk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYnRwYW5fc2V0X2Zsb3dfY29udHJvbChib29sIGVuYWJsZSkgewotICBpZiAoYnRwYW5fY2IudGFwX2ZkID09IC0xKSByZXR1cm47Ci0KLSAgYnRwYW5fY2IuZmxvdyA9IGVuYWJsZTsKLSAgaWYgKGVuYWJsZSkgewotICAgIGJ0c29ja190aHJlYWRfYWRkX2ZkKHBhbl9wdGgsIGJ0cGFuX2NiLnRhcF9mZCwgMCwgU09DS19USFJFQURfRkRfUkQsIDApOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0dV9leGVjX3RhcF9mZF9yZWFkLCBidHBhbl9jYi50YXBfZmQpKTsKLSAgfQotfQotCi1pbnQgYnRwYW5fdGFwX29wZW4oKSB7Ci0gIHN0cnVjdCBpZnJlcSBpZnI7Ci0gIGludCBmZCwgZXJyOwotICBjb25zdCBjaGFyKiBjbG9uZWRldiA9ICIvZGV2L3R1biI7Ci0KLSAgLyogb3BlbiB0aGUgY2xvbmUgZGV2aWNlICovCi0KLSAgZmQgPSBvcGVuKGNsb25lZGV2LCBPX1JEV1IpOwotICBpZiAoZmQgPCAwKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiY291bGQgbm90IG9wZW4gJXMsIGVycjolZCIsIGNsb25lZGV2LCBlcnJubyk7Ci0gICAgcmV0dXJuIGZkOwotICB9Ci0KLSAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKLSAgaWZyLmlmcl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7Ci0KLSAgc3RybGNweShpZnIuaWZyX25hbWUsIFRBUF9JRl9OQU1FLCBJRk5BTVNJWik7Ci0KLSAgLyogdHJ5IHRvIGNyZWF0ZSB0aGUgZGV2aWNlICovCi0gIGVyciA9IGlvY3RsKGZkLCBUVU5TRVRJRkYsICh2b2lkKikmaWZyKTsKLSAgaWYgKGVyciA8IDApIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCJpb2N0bCBlcnJvcjolZCwgZXJybm86JXMiLCBlcnIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgaWYgKHRhcF9pZl91cChUQVBfSUZfTkFNRSwgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9hZGRyZXNzKCkpID09IDApIHsKLSAgICBpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7Ci0gICAgZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7Ci0gICAgcmV0dXJuIGZkOwotICB9Ci0gIEJUSUZfVFJBQ0VfRVJST1IoImNhbiBub3QgYnJpbmcgdXAgdGFwIGludGVyZmFjZTolcyIsIFRBUF9JRl9OQU1FKTsKLSAgY2xvc2UoZmQpOwotICByZXR1cm4gSU5WQUxJRF9GRDsKLX0KLQotaW50IGJ0cGFuX3RhcF9zZW5kKGludCB0YXBfZmQsIGNvbnN0IFJhd0FkZHJlc3MmIHNyYywgY29uc3QgUmF3QWRkcmVzcyYgZHN0LAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvLCBjb25zdCBjaGFyKiBidWYsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGV4dCwgVU5VU0VEX0FUVFIgYm9vbCBmb3J3YXJkKSB7Ci0gIGlmICh0YXBfZmQgIT0gSU5WQUxJRF9GRCkgewotICAgIHRFVEhfSERSIGV0aF9oZHI7Ci0gICAgZXRoX2hkci5oX2Rlc3QgPSBkc3Q7Ci0gICAgZXRoX2hkci5oX3NyYyA9IHNyYzsKLSAgICBldGhfaGRyLmhfcHJvdG8gPSBodG9ucyhwcm90byk7Ci0gICAgY2hhciBwYWNrZXRbVEFQX01BWF9QS1RfV1JJVEVfTEVOICsgc2l6ZW9mKHRFVEhfSERSKV07Ci0gICAgbWVtY3B5KHBhY2tldCwgJmV0aF9oZHIsIHNpemVvZih0RVRIX0hEUikpOwotICAgIGlmIChsZW4gPiBUQVBfTUFYX1BLVF9XUklURV9MRU4pIHsKLSAgICAgIExPR19FUlJPUigiYnRwYW5fdGFwX3NlbmQgZXRoIHBhY2tldCBzaXplOiVkIGlzIGV4Y2VlZGVkIGxpbWl0ISIsIGxlbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG1lbWNweShwYWNrZXQgKyBzaXplb2YodEVUSF9IRFIpLCBidWYsIGxlbik7Ci0KLSAgICAvKiBTZW5kIGRhdGEgdG8gbmV0d29yayBpbnRlcmZhY2UgKi8KLSAgICBzc2l6ZV90IHJldDsKLSAgICBPU0lfTk9fSU5UUihyZXQgPSB3cml0ZSh0YXBfZmQsIHBhY2tldCwgbGVuICsgc2l6ZW9mKHRFVEhfSERSKSkpOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoInJldDolZCIsIHJldCk7Ci0gICAgcmV0dXJuIChpbnQpcmV0OwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotaW50IGJ0cGFuX3RhcF9jbG9zZShpbnQgZmQpIHsKLSAgaWYgKHRhcF9pZl9kb3duKFRBUF9JRl9OQU1FKSA9PSAwKSBjbG9zZShmZCk7Ci0gIGlmIChwYW5fcHRoID49IDApIGJ0c29ja190aHJlYWRfd2FrZXVwKHBhbl9wdGgpOwotICByZXR1cm4gMDsKLX0KLQotYnRwYW5fY29ubl90KiBidHBhbl9maW5kX2Nvbm5faGFuZGxlKHVpbnQxNl90IGhhbmRsZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykgewotICAgIGlmIChidHBhbl9jYi5jb25uc1tpXS5oYW5kbGUgPT0gaGFuZGxlKSByZXR1cm4gJmJ0cGFuX2NiLmNvbm5zW2ldOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1idHBhbl9jb25uX3QqIGJ0cGFuX2ZpbmRfY29ubl9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUEFOX0NPTk5TOyBpKyspIHsKLSAgICBpZiAoYnRwYW5fY2IuY29ubnNbaV0ucGVlciA9PSBhZGRyKSByZXR1cm4gJmJ0cGFuX2NiLmNvbm5zW2ldOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBidHBhbl9vcGVuX2Nvbm4oYnRwYW5fY29ubl90KiBjb25uLCB0QlRBX1BBTiogcF9kYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfQVBJKAotICAgICAgImJ0cGFuX29wZW5fY29ubjogbG9jYWxfcm9sZTolZCwgcGVlcl9yb2xlOiAlZCwgIGhhbmRsZTolZCwgY29ubjogJXAiLAotICAgICAgcF9kYXRhLT5vcGVuLmxvY2FsX3JvbGUsIHBfZGF0YS0+b3Blbi5wZWVyX3JvbGUsIHBfZGF0YS0+b3Blbi5oYW5kbGUsCi0gICAgICBjb25uKTsKLQotICBpZiAoY29ubiA9PSBOVUxMKQotICAgIGNvbm4gPSBidHBhbl9uZXdfY29ubihwX2RhdGEtPm9wZW4uaGFuZGxlLCBwX2RhdGEtPm9wZW4uYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5vcGVuLmxvY2FsX3JvbGUsIHBfZGF0YS0+b3Blbi5wZWVyX3JvbGUpOwotICBpZiAoY29ubikgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICJidHBhbl9vcGVuX2Nvbm46dGFwX2ZkOiVkLCBvcGVuX2NvdW50OiVkLCAiCi0gICAgICAgICJjb25uLT5oYW5kbGU6JWQgc2hvdWxkID0gaGFuZGxlOiVkLCBsb2NhbF9yb2xlOiVkLCByZW1vdGVfcm9sZTolZCIsCi0gICAgICAgIGJ0cGFuX2NiLnRhcF9mZCwgYnRwYW5fY2Iub3Blbl9jb3VudCwgY29ubi0+aGFuZGxlLCBwX2RhdGEtPm9wZW4uaGFuZGxlLAotICAgICAgICBjb25uLT5sb2NhbF9yb2xlLCBjb25uLT5yZW1vdGVfcm9sZSk7Ci0KLSAgICBidHBhbl9jYi5vcGVuX2NvdW50Kys7Ci0gICAgY29ubi0+aGFuZGxlID0gcF9kYXRhLT5vcGVuLmhhbmRsZTsKLSAgICBpZiAoYnRwYW5fY2IudGFwX2ZkIDwgMCkgewotICAgICAgYnRwYW5fY2IudGFwX2ZkID0gYnRwYW5fdGFwX29wZW4oKTsKLSAgICAgIGlmIChidHBhbl9jYi50YXBfZmQgPj0gMCkgY3JlYXRlX3RhcF9yZWFkX3RocmVhZChidHBhbl9jYi50YXBfZmQpOwotICAgIH0KLQotICAgIGlmIChidHBhbl9jYi50YXBfZmQgPj0gMCkgewotICAgICAgYnRwYW5fY2IuZmxvdyA9IDE7Ci0gICAgICBjb25uLT5zdGF0ZSA9IFBBTl9TVEFURV9PUEVOOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidHBhbl9jbG9zZV9jb25uKGJ0cGFuX2Nvbm5fdCogY29ubikgewotICBCVElGX1RSQUNFX0FQSSgiYnRwYW5fY2xvc2VfY29ubjogJXAiLCBjb25uKTsKLQotICBpZiAoY29ubiAmJiBjb25uLT5zdGF0ZSA9PSBQQU5fU1RBVEVfT1BFTikgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoImJ0cGFuX2Nsb3NlX2Nvbm46IFBBTl9TVEFURV9PUEVOIik7Ci0KLSAgICBjb25uLT5zdGF0ZSA9IFBBTl9TVEFURV9DTE9TRTsKLSAgICBidHBhbl9jYi5vcGVuX2NvdW50LS07Ci0KLSAgICBpZiAoYnRwYW5fY2Iub3Blbl9jb3VudCA9PSAwKSB7Ci0gICAgICBkZXN0cm95X3RhcF9yZWFkX3RocmVhZCgpOwotICAgICAgaWYgKGJ0cGFuX2NiLnRhcF9mZCAhPSBJTlZBTElEX0ZEKSB7Ci0gICAgICAgIGJ0cGFuX3RhcF9jbG9zZShidHBhbl9jYi50YXBfZmQpOwotICAgICAgICBidHBhbl9jYi50YXBfZmQgPSBJTlZBTElEX0ZEOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidHBhbl9jbGVhbnVwX2Nvbm4oYnRwYW5fY29ubl90KiBjb25uKSB7Ci0gIGlmIChjb25uKSB7Ci0gICAgY29ubi0+aGFuZGxlID0gLTE7Ci0gICAgY29ubi0+c3RhdGUgPSAtMTsKLSAgICBtZW1zZXQoJmNvbm4tPnBlZXIsIDAsIHNpemVvZihjb25uLT5wZWVyKSk7Ci0gICAgbWVtc2V0KCZjb25uLT5ldGhfYWRkciwgMCwgc2l6ZW9mKGNvbm4tPmV0aF9hZGRyKSk7Ci0gICAgY29ubi0+bG9jYWxfcm9sZSA9IGNvbm4tPnJlbW90ZV9yb2xlID0gMDsKLSAgfQotfQotCi1idHBhbl9jb25uX3QqIGJ0cGFuX25ld19jb25uKGludCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfUEFOX1JPTEUgbG9jYWxfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9QQU5fUk9MRSByZW1vdGVfcm9sZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykgewotICAgIGlmIChidHBhbl9jYi5jb25uc1tpXS5oYW5kbGUgPT0gLTEpIHsKLSAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAiQWxsb2NhdGVkIG5ldyBwYW4gY29ubmVjdGlvbiBoYW5kbGU6JWQgbG9jYWxfcm9sZTolaGh1IgotICAgICAgICAgICIgcmVtb3RlX3JvbGU6JWhodSIsCi0gICAgICAgICAgaGFuZGxlLCBsb2NhbF9yb2xlLCByZW1vdGVfcm9sZSk7Ci0gICAgICBidHBhbl9jYi5jb25uc1tpXS5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICBidHBhbl9jYi5jb25uc1tpXS5wZWVyID0gYWRkcjsKLSAgICAgIGJ0cGFuX2NiLmNvbm5zW2ldLmxvY2FsX3JvbGUgPSBsb2NhbF9yb2xlOwotICAgICAgYnRwYW5fY2IuY29ubnNbaV0ucmVtb3RlX3JvbGUgPSByZW1vdGVfcm9sZTsKLSAgICAgIHJldHVybiAmYnRwYW5fY2IuY29ubnNbaV07Ci0gICAgfQotICB9Ci0gIExPR19XQVJOKCJVbmFibGUgdG8gY3JlYXRlIG5ldyBwYW4gY29ubmVjdGlvbiBtYXg6JWQiLCBNQVhfUEFOX0NPTk5TKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgYnRwYW5fY2xvc2VfaGFuZGxlKGJ0cGFuX2Nvbm5fdCogcCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJidHBhbl9jbG9zZV9oYW5kbGUgOiBjbG9zZSBoYW5kbGUgJWQiLCBwLT5oYW5kbGUpOwotICBwLT5oYW5kbGUgPSAtMTsKLSAgcC0+bG9jYWxfcm9sZSA9IC0xOwotICBwLT5yZW1vdGVfcm9sZSA9IC0xOwotICBtZW1zZXQoJnAtPnBlZXIsIDAsIDYpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX2ZvcndhcmQodEVUSF9IRFIqIGhkcikgewotICB1aW50MTZfdCBwcm90byA9IG50b2hzKGhkci0+aF9wcm90byk7Ci0gIGlmIChwcm90byA9PSBFVEhfUF9JUCB8fCBwcm90byA9PSBFVEhfUF9BUlAgfHwgcHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgQlRJRl9UUkFDRV9ERUJVRygidW5rbm93biBwcm90bzoleCIsIHByb3RvKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IGZvcndhcmRfYm5lcCh0RVRIX0hEUiogZXRoX2hkciwgQlRfSERSKiBoZHIpIHsKLSAgaW50IGJyb2FkY2FzdCA9IGV0aF9oZHItPmhfZGVzdC5hZGRyZXNzWzBdICYgMTsKLQotICAvLyBGaW5kIHRoZSByaWdodCBjb25uZWN0aW9uIHRvIHNlbmQgdGhpcyBmcmFtZSBvdmVyLgotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykgewotICAgIHVpbnQxNl90IGhhbmRsZSA9IGJ0cGFuX2NiLmNvbm5zW2ldLmhhbmRsZTsKLSAgICBpZiAoaGFuZGxlICE9ICh1aW50MTZfdCktMSAmJgotICAgICAgICAoYnJvYWRjYXN0IHx8IGJ0cGFuX2NiLmNvbm5zW2ldLmV0aF9hZGRyID09IGV0aF9oZHItPmhfZGVzdCB8fAotICAgICAgICAgYnRwYW5fY2IuY29ubnNbaV0ucGVlciA9PSBldGhfaGRyLT5oX2Rlc3QpKSB7Ci0gICAgICBpbnQgcmVzdWx0ID0gUEFOX1dyaXRlQnVmKGhhbmRsZSwgZXRoX2hkci0+aF9kZXN0LCBldGhfaGRyLT5oX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoZXRoX2hkci0+aF9wcm90byksIGhkciwgMCk7Ci0gICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFBBTl9RX1NJWkVfRVhDRUVERUQ6Ci0gICAgICAgICAgcmV0dXJuIEZPUldBUkRfQ09OR0VTVDsKLSAgICAgICAgY2FzZSBQQU5fU1VDQ0VTUzoKLSAgICAgICAgICByZXR1cm4gRk9SV0FSRF9TVUNDRVNTOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBGT1JXQVJEX0ZBSUxVUkU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIG9zaV9mcmVlKGhkcik7Ci0gIHJldHVybiBGT1JXQVJEX0lHTk9SRTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX3Bhbl9jYWxsYmFja190cmFuc2Zlcih1aW50MTZfdCBldmVudCwgY2hhciogcF9wYXJhbSkgewotICB0QlRBX1BBTiogcF9kYXRhID0gKHRCVEFfUEFOKilwX3BhcmFtOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9QQU5fRU5BQkxFX0VWVDoKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIkJUQV9QQU5fRU5BQkxFX0VWVCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfUEFOX1NFVF9ST0xFX0VWVDogewotICAgICAgaW50IGJ0cGFuX3JvbGUgPSBidGFfcm9sZV90b19idHBhbihwX2RhdGEtPnNldF9yb2xlLnJvbGUpOwotICAgICAgYnRfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAocF9kYXRhLT5zZXRfcm9sZS5zdGF0dXMpID8gQlRfU1RBVFVTX1NVQ0NFU1MgOiBCVF9TVEFUVVNfRkFJTDsKLSAgICAgIGJ0cGFuX2NvbnRyb2xfc3RhdGVfdCBzdGF0ZSA9Ci0gICAgICAgICAgYnRwYW5fcm9sZSA9PSAwID8gQlRQQU5fU1RBVEVfRElTQUJMRUQgOiBCVFBBTl9TVEFURV9FTkFCTEVEOwotICAgICAgY2FsbGJhY2suY29udHJvbF9zdGF0ZV9jYihzdGF0ZSwgYnRwYW5fcm9sZSwgc3RhdHVzLCBUQVBfSUZfTkFNRSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfUEFOX09QRU5JTkdfRVZUOiB7Ci0gICAgICBidHBhbl9jb25uX3QqIGNvbm47Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJCVEFfUEFOX09QRU5JTkdfRVZUIGhhbmRsZSAlZCwgYWRkcjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm9wZW5pbmcuaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm9wZW5pbmcuYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgY29ubiA9IGJ0cGFuX2ZpbmRfY29ubl9hZGRyKHBfZGF0YS0+b3BlbmluZy5iZF9hZGRyKTsKLQotICAgICAgYXNydChjb25uICE9IE5VTEwpOwotICAgICAgaWYgKGNvbm4pIHsKLSAgICAgICAgY29ubi0+aGFuZGxlID0gcF9kYXRhLT5vcGVuaW5nLmhhbmRsZTsKLSAgICAgICAgaW50IGJ0cGFuX2Nvbm5fbG9jYWxfcm9sZSA9IGJ0YV9yb2xlX3RvX2J0cGFuKGNvbm4tPmxvY2FsX3JvbGUpOwotICAgICAgICBpbnQgYnRwYW5fcmVtb3RlX3JvbGUgPSBidGFfcm9sZV90b19idHBhbihjb25uLT5yZW1vdGVfcm9sZSk7Ci0gICAgICAgIGNhbGxiYWNrLmNvbm5lY3Rpb25fc3RhdGVfY2IoQlRQQU5fU1RBVEVfQ09OTkVDVElORywgQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZGF0YS0+b3BlbmluZy5iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cGFuX2Nvbm5fbG9jYWxfcm9sZSwgYnRwYW5fcmVtb3RlX3JvbGUpOwotICAgICAgfSBlbHNlCi0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoImNvbm5lY3Rpb24gbm90IGZvdW5kIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfUEFOX09QRU5fRVZUOiB7Ci0gICAgICBidHBhbl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGU7Ci0gICAgICBidF9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgICBidHBhbl9jb25uX3QqIGNvbm4gPSBidHBhbl9maW5kX2Nvbm5faGFuZGxlKHBfZGF0YS0+b3Blbi5oYW5kbGUpOwotCi0gICAgICBMT0dfVkVSQk9TRSgiJXMgcGFuIGNvbm5lY3Rpb24gb3BlbiBzdGF0dXM6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2RhdGEtPm9wZW4uc3RhdHVzKTsKLSAgICAgIGlmIChwX2RhdGEtPm9wZW4uc3RhdHVzKSB7Ci0gICAgICAgIHN0YXRlID0gQlRQQU5fU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICAgICAgYnRwYW5fb3Blbl9jb25uKGNvbm4sIHBfZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0ZSA9IEJUUEFOX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIGJ0cGFuX2NsZWFudXBfY29ubihjb25uKTsKLSAgICAgIH0KLSAgICAgIC8qIGRlYnVnKCJCVEFfUEFOX09QRU5fRVZUIGhhbmRsZTolZCwgY29ubjolcCIsICBwX2RhdGEtPm9wZW4uaGFuZGxlLAotICAgICAgICogY29ubik7ICovCi0gICAgICAvKiBkZWJ1ZygiY29ubiBidGEgbG9jYWxfcm9sZTolZCwgYnRhIHJlbW90ZSByb2xlOiVkIiwgY29ubi0+bG9jYWxfcm9sZSwKLSAgICAgICAqIGNvbm4tPnJlbW90ZV9yb2xlKTsgKi8KLSAgICAgIGludCBidHBhbl9jb25uX2xvY2FsX3JvbGUgPSBidGFfcm9sZV90b19idHBhbihwX2RhdGEtPm9wZW4ubG9jYWxfcm9sZSk7Ci0gICAgICBpbnQgYnRwYW5fcmVtb3RlX3JvbGUgPSBidGFfcm9sZV90b19idHBhbihwX2RhdGEtPm9wZW4ucGVlcl9yb2xlKTsKLSAgICAgIGNhbGxiYWNrLmNvbm5lY3Rpb25fc3RhdGVfY2Ioc3RhdGUsIHN0YXR1cywgJnBfZGF0YS0+b3Blbi5iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHBhbl9jb25uX2xvY2FsX3JvbGUsIGJ0cGFuX3JlbW90ZV9yb2xlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9QQU5fQ0xPU0VfRVZUOiB7Ci0gICAgICBMT0dfSU5GTygiJXM6IGV2ZW50ID0gQlRBX1BBTl9DTE9TRV9FVlQgaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICBwX2RhdGEtPmNsb3NlLmhhbmRsZSk7Ci0gICAgICBidHBhbl9jb25uX3QqIGNvbm4gPSBidHBhbl9maW5kX2Nvbm5faGFuZGxlKHBfZGF0YS0+Y2xvc2UuaGFuZGxlKTsKLSAgICAgIGJ0cGFuX2Nsb3NlX2Nvbm4oY29ubik7Ci0KLSAgICAgIGlmIChjb25uICYmIGNvbm4tPmhhbmRsZSA+PSAwKSB7Ci0gICAgICAgIGludCBidHBhbl9jb25uX2xvY2FsX3JvbGUgPSBidGFfcm9sZV90b19idHBhbihjb25uLT5sb2NhbF9yb2xlKTsKLSAgICAgICAgaW50IGJ0cGFuX3JlbW90ZV9yb2xlID0gYnRhX3JvbGVfdG9fYnRwYW4oY29ubi0+cmVtb3RlX3JvbGUpOwotICAgICAgICBjYWxsYmFjay5jb25uZWN0aW9uX3N0YXRlX2NiKEJUUEFOX1NUQVRFX0RJU0NPTk5FQ1RFRCwgKGJ0X3N0YXR1c190KTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm4tPnBlZXIsIGJ0cGFuX2Nvbm5fbG9jYWxfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHBhbl9yZW1vdGVfcm9sZSk7Ci0gICAgICAgIGJ0cGFuX2NsZWFudXBfY29ubihjb25uKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJwYW4gaGFuZGxlIG5vdCBmb3VuZCAoJWQpIiwgcF9kYXRhLT5jbG9zZS5oYW5kbGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIlVua25vd24gcGFuIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRhX3Bhbl9jYWxsYmFjayh0QlRBX1BBTl9FVlQgZXZlbnQsIHRCVEFfUEFOKiBwX2RhdGEpIHsKLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0YV9wYW5fY2FsbGJhY2tfdHJhbnNmZXIsIGV2ZW50LCAoY2hhciopcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRCVEFfUEFOKSwgTlVMTCk7Ci19Ci0KLSNkZWZpbmUgSVNfRVhDRVBUSU9OKGUpICgoZSkgJiAoUE9MTEhVUCB8IFBPTExSREhVUCB8IFBPTExFUlIgfCBQT0xMTlZBTCkpCi1zdGF0aWMgdm9pZCBidHVfZXhlY190YXBfZmRfcmVhZChpbnQgZmQpIHsKLSAgc3RydWN0IHBvbGxmZCB1ZmQ7Ci0KLSAgaWYgKGZkID09IElOVkFMSURfRkQgfHwgZmQgIT0gYnRwYW5fY2IudGFwX2ZkKSByZXR1cm47Ci0KLSAgLy8gRG9uJ3Qgb2NjdXB5IEJUVSBjb250ZXh0IHRvbyBsb25nLCBhdm9pZCBidWZmZXIgb3ZlcnJ1bnMgYW5kCi0gIC8vIGdpdmUgb3RoZXIgcHJvZmlsZXMgYSBjaGFuY2UgdG8gcnVuIGJ5IGxpbWl0aW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5Ci0gIC8vIFBBTiBjYW4gdXNlLgotICBmb3IgKGludCBpID0gMDsgaSA8IFBBTl9CVUZfTUFYICYmIGJ0aWZfaXNfZW5hYmxlZCgpICYmIGJ0cGFuX2NiLmZsb3c7IGkrKykgewotICAgIEJUX0hEUiogYnVmZmVyID0gKEJUX0hEUiopb3NpX21hbGxvYyhQQU5fQlVGX1NJWkUpOwotICAgIGJ1ZmZlci0+b2Zmc2V0ID0gUEFOX01JTklNVU1fT0ZGU0VUOwotICAgIGJ1ZmZlci0+bGVuID0gUEFOX0JVRl9TSVpFIC0gc2l6ZW9mKEJUX0hEUikgLSBidWZmZXItPm9mZnNldDsKLQotICAgIHVpbnQ4X3QqIHBhY2tldCA9ICh1aW50OF90KilidWZmZXIgKyBzaXplb2YoQlRfSERSKSArIGJ1ZmZlci0+b2Zmc2V0OwotCi0gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiB1bmRlbGl2ZXJlZCBwYWNrZXQgbGVmdCBvdmVyLCBwdWxsIG9uZSBmcm9tIHRoZSBUQVAKLSAgICAvLyBkcml2ZXIuCi0gICAgLy8gV2Ugc2F2ZSBpdCBpbiB0aGUgY29uZ2VzdF9wYWNrZXQgcmlnaHQgYXdheSBpbiBjYXNlIHdlIGNhbid0IGRlbGl2ZXIgaXQKLSAgICAvLyBpbiB0aGlzCi0gICAgLy8gYXR0ZW1wdC4KLSAgICBpZiAoIWJ0cGFuX2NiLmNvbmdlc3RfcGFja2V0X3NpemUpIHsKLSAgICAgIHNzaXplX3QgcmV0OwotICAgICAgT1NJX05PX0lOVFIocmV0ID0gcmVhZChmZCwgYnRwYW5fY2IuY29uZ2VzdF9wYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidHBhbl9jYi5jb25nZXN0X3BhY2tldCkpKTsKLSAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXMgdW5hYmxlIHRvIHJlYWQgZnJvbSBkcml2ZXI6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgIG9zaV9mcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgLy8gYWRkIGZkIGJhY2sgdG8gbW9uaXRvciB0aHJlYWQgdG8gdHJ5IGl0IGFnYWluIGxhdGVyCi0gICAgICAgICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocGFuX3B0aCwgZmQsIDAsIFNPQ0tfVEhSRUFEX0ZEX1JELCAwKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzIGVuZCBvZiBmaWxlIHJlYWNoZWQuIiwgX19mdW5jX18pOwotICAgICAgICAgIG9zaV9mcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgLy8gYWRkIGZkIGJhY2sgdG8gbW9uaXRvciB0aHJlYWQgdG8gcHJvY2VzcyB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocGFuX3B0aCwgZmQsIDAsIFNPQ0tfVEhSRUFEX0ZEX1JELCAwKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnRwYW5fY2IuY29uZ2VzdF9wYWNrZXRfc2l6ZSA9IHJldDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBtZW1jcHkocGFja2V0LCBidHBhbl9jYi5jb25nZXN0X3BhY2tldCwKLSAgICAgICAgICAgTUlOKGJ0cGFuX2NiLmNvbmdlc3RfcGFja2V0X3NpemUsIGJ1ZmZlci0+bGVuKSk7Ci0gICAgYnVmZmVyLT5sZW4gPSBNSU4oYnRwYW5fY2IuY29uZ2VzdF9wYWNrZXRfc2l6ZSwgYnVmZmVyLT5sZW4pOwotCi0gICAgaWYgKGJ1ZmZlci0+bGVuID4gc2l6ZW9mKHRFVEhfSERSKSAmJiBzaG91bGRfZm9yd2FyZCgodEVUSF9IRFIqKXBhY2tldCkpIHsKLSAgICAgIC8vIEV4dHJhY3QgdGhlIGV0aGVybmV0IGhlYWRlciBmcm9tIHRoZSBidWZmZXIgc2luY2UgdGhlIFBBTl9Xcml0ZUJ1ZgotICAgICAgLy8gaW5zaWRlCi0gICAgICAvLyBmb3J3YXJkX2JuZXAgY2FuJ3QgaGFuZGxlIHR3byBwb2ludGVycyB0aGF0IHBvaW50IGluc2lkZSB0aGUgc2FtZSBHS0kKLSAgICAgIC8vIGJ1ZmZlci4KLSAgICAgIHRFVEhfSERSIGhkcjsKLSAgICAgIG1lbWNweSgmaGRyLCBwYWNrZXQsIHNpemVvZih0RVRIX0hEUikpOwotCi0gICAgICAvLyBTa2lwIHRoZSBldGhlcm5ldCBoZWFkZXIuCi0gICAgICBidWZmZXItPmxlbiAtPSBzaXplb2YodEVUSF9IRFIpOwotICAgICAgYnVmZmVyLT5vZmZzZXQgKz0gc2l6ZW9mKHRFVEhfSERSKTsKLSAgICAgIGlmIChmb3J3YXJkX2JuZXAoJmhkciwgYnVmZmVyKSAhPSBGT1JXQVJEX0NPTkdFU1QpCi0gICAgICAgIGJ0cGFuX2NiLmNvbmdlc3RfcGFja2V0X3NpemUgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzIGRyb3BwaW5nIHBhY2tldCBvZiBsZW5ndGggJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmxlbik7Ci0gICAgICBidHBhbl9jYi5jb25nZXN0X3BhY2tldF9zaXplID0gMDsKLSAgICAgIG9zaV9mcmVlKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgLy8gQmFpbCBvdXQgb2YgdGhlIGxvb3AgaWYgcmVhZGluZyBmcm9tIHRoZSBUQVAgZmQgd291bGQgYmxvY2suCi0gICAgdWZkLmZkID0gZmQ7Ci0gICAgdWZkLmV2ZW50cyA9IFBPTExJTjsKLSAgICB1ZmQucmV2ZW50cyA9IDA7Ci0KLSAgICBpbnQgcmV0OwotICAgIE9TSV9OT19JTlRSKHJldCA9IHBvbGwoJnVmZCwgMSwgMCkpOwotICAgIGlmIChyZXQgPD0gMCB8fCBJU19FWENFUFRJT04odWZkLnJldmVudHMpKSBicmVhazsKLSAgfQotCi0gIGlmIChidHBhbl9jYi5mbG93KSB7Ci0gICAgLy8gYWRkIGZkIGJhY2sgdG8gbW9uaXRvciB0aHJlYWQgd2hlbiB0aGUgZmxvdyBpcyBvbgotICAgIGJ0c29ja190aHJlYWRfYWRkX2ZkKHBhbl9wdGgsIGZkLCAwLCBTT0NLX1RIUkVBRF9GRF9SRCwgMCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9wYW5fY2xvc2VfYWxsX2Nvbm5zKCkgewotICBpZiAoIXN0YWNrX2luaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUEFOX0NPTk5TOyArK2kpIHsKLSAgICBpZiAoYnRwYW5fY2IuY29ubnNbaV0uaGFuZGxlICE9IC0xKSBCVEFfUGFuQ2xvc2UoYnRwYW5fY2IuY29ubnNbaV0uaGFuZGxlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidHBhbl90YXBfZmRfc2lnbmFsZWQoaW50IGZkLCBpbnQgdHlwZSwgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQpIHsKLSAgQ0hFQ0soYnRwYW5fY2IudGFwX2ZkID09IElOVkFMSURfRkQgfHwgYnRwYW5fY2IudGFwX2ZkID09IGZkKTsKLQotICBpZiAoYnRwYW5fY2IudGFwX2ZkICE9IGZkKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlcyBTaWduYWxlZCBvbiBtaXNtYXRjaGVkIGZkcyBleHA6JWQgYWN0OiVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnRwYW5fY2IudGFwX2ZkLCBmZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGZsYWdzICYgU09DS19USFJFQURfRkRfRVhDRVBUSU9OKSB7Ci0gICAgYnRwYW5fY2IudGFwX2ZkID0gSU5WQUxJRF9GRDsKLSAgICBidHBhbl90YXBfY2xvc2UoZmQpOwotICAgIGJ0aWZfcGFuX2Nsb3NlX2FsbF9jb25ucygpOwotICB9IGVsc2UgaWYgKGZsYWdzICYgU09DS19USFJFQURfRkRfUkQpIHsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnR1X2V4ZWNfdGFwX2ZkX3JlYWQsIGZkKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfcHJvZmlsZV9xdWV1ZS5jYyBiL2J0aWYvc3JjL2J0aWZfcHJvZmlsZV9xdWV1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1N2NhYi4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3Byb2ZpbGVfcXVldWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9wcm9maWxlX3F1ZXVlLmMKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgQmx1ZXRvb3RoIHJlbW90ZSBkZXZpY2UgY29ubmVjdGlvbiBxdWV1aW5nIGltcGxlbWVudGF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9xdWV1ZSIKLQotI2luY2x1ZGUgImJ0aWZfcHJvZmlsZV9xdWV1ZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIENsYXNzIHRvIHN0b3JlIGNvbm5lY3QgaW5mby4KLWNsYXNzIENvbm5lY3ROb2RlIHsKLSBwdWJsaWM6Ci0gIENvbm5lY3ROb2RlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHV1aWQsCi0gICAgICAgICAgICAgIGJ0aWZfY29ubmVjdF9jYl90IGNvbm5lY3RfY2IpCi0gICAgICA6IGFkZHJlc3NfKGFkZHJlc3MpLCB1dWlkXyh1dWlkKSwgYnVzeV8oZmFsc2UpLCBjb25uZWN0X2NiXyhjb25uZWN0X2NiKSB7fQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoImFkZHJlc3M9JXMgVVVJRD0lMDRYIGJ1c3k9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGFkZHJlc3NfKSwgdXVpZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVzeV8pID8gInRydWUiIDogImZhbHNlIik7Ci0gIH0KLQotICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gYWRkcmVzc187IH0KLSAgdWludDE2X3QgdXVpZCgpIGNvbnN0IHsgcmV0dXJuIHV1aWRfOyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlIHRoZSBjb25uZWN0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MsIG90aGV3aXNlIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yCi0gICAqIGNvZGUuIE5vdGU6IGlmIGEgcHJldmlvdXMgY29ubmVjdCByZXF1ZXN0IGhhc24ndCBiZWVuIGNvbXBsZXRlZCwgdGhlCi0gICAqIHJldHVybiB2YWx1ZSBpcyBCVF9TVEFUVVNfU1VDQ0VTUy4KLSAgICovCi0gIGJ0X3N0YXR1c190IGNvbm5lY3QoKSB7Ci0gICAgaWYgKGJ1c3lfKSByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgYnVzeV8gPSB0cnVlOwotICAgIHJldHVybiBjb25uZWN0X2NiXygmYWRkcmVzc18sIHV1aWRfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgUmF3QWRkcmVzcyBhZGRyZXNzXzsKLSAgdWludDE2X3QgdXVpZF87Ci0gIGJvb2wgYnVzeV87Ci0gIGJ0aWZfY29ubmVjdF9jYl90IGNvbm5lY3RfY2JfOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RkOjpsaXN0PENvbm5lY3ROb2RlPiBjb25uZWN0X3F1ZXVlOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9SRUFTT05BQkxFX1JFUVVFU1RTID0gMjA7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUXVldWUgaGVscGVyIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgcXVldWVfaW50X2FkZCh1aW50MTZfdCB1dWlkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29ubmVjdF9jYl90IGNvbm5lY3RfY2IpIHsKLSAgLy8gU2FuaXR5IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QgbGVha2luZyBjb25uZWN0aW9uIHJlcXVlc3RzCi0gIENIRUNLKGNvbm5lY3RfcXVldWUuc2l6ZSgpIDwgTUFYX1JFQVNPTkFCTEVfUkVRVUVTVFMpOwotCi0gIENvbm5lY3ROb2RlIHBhcmFtKGJkYSwgdXVpZCwgY29ubmVjdF9jYik7Ci0gIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IGNvbm5lY3RfcXVldWUpIHsKLSAgICBpZiAobm9kZS51dWlkKCkgPT0gcGFyYW0udXVpZCgpICYmIG5vZGUuYWRkcmVzcygpID09IHBhcmFtLmFkZHJlc3MoKSkgewotICAgICAgTE9HX0VSUk9SKCJEcm9wcGluZyBkdXBsaWNhdGUgcHJvZmlsZSBjb25uZWN0aW9uIHJlcXVlc3Q6JXMiLAotICAgICAgICAgICAgICAgIHBhcmFtLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgTE9HX0lORk8oIlF1ZXVlaW5nIHByb2ZpbGUgY29ubmVjdGlvbiByZXF1ZXN0OiVzIiwgcGFyYW0uVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgY29ubmVjdF9xdWV1ZS5wdXNoX2JhY2socGFyYW0pOwotCi0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2ludF9hZHZhbmNlKCkgewotICBpZiAoY29ubmVjdF9xdWV1ZS5lbXB0eSgpKSByZXR1cm47Ci0KLSAgY29uc3QgQ29ubmVjdE5vZGUmIGhlYWQgPSBjb25uZWN0X3F1ZXVlLmZyb250KCk7Ci0gIExPR19JTkZPKCIlczogcmVtb3ZpbmcgY29ubmVjdGlvbiByZXF1ZXN0OiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICBoZWFkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGNvbm5lY3RfcXVldWUucG9wX2Zyb250KCk7Ci0KLSAgYnRpZl9xdWV1ZV9jb25uZWN0X25leHQoKTsKLX0KLQotc3RhdGljIHZvaWQgcXVldWVfaW50X2NsZWFudXAodWludDE2X3QgdXVpZCkgewotICBMT0dfSU5GTygiJXM6IFVVSUQ9JTA0WCIsIF9fZnVuY19fLCB1dWlkKTsKLQotICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0X3F1ZXVlLmJlZ2luKCk7IGl0ICE9IGNvbm5lY3RfcXVldWUuZW5kKCk7KSB7Ci0gICAgYXV0byBpdF9wcmV2ID0gaXQrKzsKLSAgICBjb25zdCBDb25uZWN0Tm9kZSYgbm9kZSA9ICppdF9wcmV2OwotICAgIGlmIChub2RlLnV1aWQoKSA9PSB1dWlkKSB7Ci0gICAgICBMT0dfSU5GTygiJXM6IHJlbW92aW5nIGNvbm5lY3Rpb24gcmVxdWVzdDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgIG5vZGUuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGNvbm5lY3RfcXVldWUuZXJhc2UoaXRfcHJldik7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2ludF9yZWxlYXNlKCkgeyBjb25uZWN0X3F1ZXVlLmNsZWFyKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfcXVldWVfY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHF1ZXVlIGFuZCB0cmlnZ2VyIHRoZSBuZXh0Ci0gKiAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZCBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3F1ZXVlX2Nvbm5lY3QodWludDE2X3QgdXVpZCwgY29uc3QgUmF3QWRkcmVzcyogYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29ubmVjdF9jYl90IGNvbm5lY3RfY2IpIHsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZxdWV1ZV9pbnRfYWRkLCB1dWlkLCAqYmRhLCBjb25uZWN0X2NiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3F1ZXVlX2NsZWFudXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsZWFuIHVwIGV4aXN0aW5nIGNvbm5lY3Rpb24gcmVxdWVzdHMgZm9yIGEgVVVJRAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZCwgYWx3YXlzIHN1Y2NlZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGlmX3F1ZXVlX2NsZWFudXAodWludDE2X3QgdXVpZCkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmcXVldWVfaW50X2NsZWFudXAsIHV1aWQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xlYXIgdGhlIHF1ZXVlJ3MgYnVzeSBzdGF0dXMgYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQKLSAqICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9xdWV1ZV9hZHZhbmNlKCkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmcXVldWVfaW50X2FkdmFuY2UpKTsKLX0KLQotYnRfc3RhdHVzX3QgYnRpZl9xdWV1ZV9jb25uZWN0X25leHQodm9pZCkgewotICAvLyBUaGUgY2FsbCBtdXN0IGJlIG9uIHRoZSBKTkkgdGhyZWFkLCBvdGhlcndpc2UgdGhlIGFjY2VzcyB0byBjb25uZWN0X3F1ZXVlCi0gIC8vIGlzIG5vdCB0aHJlYWQtc2FmZS4KLSAgQ0hFQ0soaXNfb25fam5pX3RocmVhZCgpKTsKLQotICBpZiAoY29ubmVjdF9xdWV1ZS5lbXB0eSgpKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIGlmICghc3RhY2tfbWFuYWdlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9zdGFja19pc19ydW5uaW5nKCkpCi0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIENvbm5lY3ROb2RlJiBoZWFkID0gY29ubmVjdF9xdWV1ZS5mcm9udCgpOwotCi0gIExPR19JTkZPKCJFeGVjdXRpbmcgcHJvZmlsZSBjb25uZWN0aW9uIHJlcXVlc3Q6JXMiLCBoZWFkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGJ0X3N0YXR1c190IGJfc3RhdHVzID0gaGVhZC5jb25uZWN0KCk7Ci0gIGlmIChiX3N0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19JTkZPKCIlczogY29ubmVjdCAlcyBmYWlsZWQsIGFkdmFuY2UgdG8gbmV4dCBzY2hlZHVsZWQgY29ubmVjdGlvbi4iLAotICAgICAgICAgICAgIF9fZnVuY19fLCBoZWFkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gIH0KLSAgcmV0dXJuIGJfc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9xdWV1ZV9yZWxlYXNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlIHVwIGFsbCB0aGUgcXVldWUgbm9kZXMgYW5kIHNldCB0aGUgcXVldWUgaGVhZCB0byBOVUxMCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRpZl9xdWV1ZV9yZWxlYXNlKCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmcXVldWVfaW50X3JlbGVhc2UpKSAhPQotICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IEZhaWxlZCB0byBzY2hlZHVsZSBvbiBKTkkgdGhyZWFkIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9yYy5jYyBiL2J0aWYvc3JjL2J0aWZfcmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OWIyOWYuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9yYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfcmMuY2MKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgQmx1ZXRvb3RoIEFWUkMgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9hdnJjIgotCi0jaW5jbHVkZSAiYnRpZl9yYy5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3JjLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiYXZyY19kZWZzLmgiCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9hdl9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9saXN0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2RlZmluZSBSQ19JTlZBTElEX1RSQUNLX0lEICgweEZGRkZGRkZGRkZGRkZGRkZVTEwpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBjb2QgdmFsdWUgZm9yIEhlYWRzZXRzICovCi0jZGVmaW5lIENPRF9BVl9IRUFEU0VUUyAweDA0MDQKLS8qIGZvciBBVlJDIDEuNCBuZWVkIHRvIGNoYW5nZSB0aGlzICovCi0jZGVmaW5lIE1BWF9SQ19OT1RJRklDQVRJT05TIEFWUkNfRVZUX1ZPTFVNRV9DSEFOR0UKLQotI2RlZmluZSBJRFhfR0VUX1BMQVlfU1RBVFVTX1JTUCAwCi0jZGVmaW5lIElEWF9MSVNUX0FQUF9BVFRSX1JTUCAxCi0jZGVmaW5lIElEWF9MSVNUX0FQUF9WQUxVRV9SU1AgMgotI2RlZmluZSBJRFhfR0VUX0NVUlJfQVBQX1ZBTF9SU1AgMwotI2RlZmluZSBJRFhfU0VUX0FQUF9WQUxfUlNQIDQKLSNkZWZpbmUgSURYX0dFVF9BUFBfQVRUUl9UWFRfUlNQIDUKLSNkZWZpbmUgSURYX0dFVF9BUFBfVkFMX1RYVF9SU1AgNgotI2RlZmluZSBJRFhfR0VUX0VMRU1FTlRfQVRUUl9SU1AgNwotI2RlZmluZSBJRFhfU0VUX0FERFJfUExBWUVSX1JTUCA4Ci0jZGVmaW5lIElEWF9TRVRfQlJPV1NFRF9QTEFZRVJfUlNQIDkKLSNkZWZpbmUgSURYX0dFVF9GT0xERVJfSVRFTVNfUlNQIDEwCi0jZGVmaW5lIElEWF9DSEdfUEFUSF9SU1AgMTEKLSNkZWZpbmUgSURYX0dFVF9JVEVNX0FUVFJfUlNQIDEyCi0jZGVmaW5lIElEWF9QTEFZX0lURU1fUlNQIDEzCi0jZGVmaW5lIElEWF9HRVRfVE9UQUxfTlVNX09GX0lURU1TX1JTUCAxNAotI2RlZmluZSBJRFhfU0VBUkNIX1JTUCAxNQotI2RlZmluZSBJRFhfQUREX1RPX05PV19QTEFZSU5HX1JTUCAxNgotCi0vKiBVcGRhdGUgTUFYIHZhbHVlIHdoZW5ldmVyIElEWCB3aWxsIGJlIGNoYW5nZWQgKi8KLSNkZWZpbmUgTUFYX0NNRF9RVUVVRV9MRU4gMTcKLQotI2RlZmluZSBNQVhfVk9MVU1FIDEyOAotI2RlZmluZSBNQVhfTEFCRUwgMTYKLSNkZWZpbmUgTUFYX1RSQU5TQUNUSU9OU19QRVJfU0VTU0lPTiAxNgotI2RlZmluZSBQTEFZX1NUQVRVU19QTEFZSU5HIDEKLSNkZWZpbmUgQlRJRl9SQ19OVU1fQ09OTiBCVF9SQ19OVU1fQVBQCi0KLSNkZWZpbmUgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKHBfZGV2KSA9PSBOVUxMIHx8ICEocF9kZXYpLT5yY19jb25uZWN0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IGNhbGxlZCB3aGVuIFJDIGlzIG5vdCBjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7IFwKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDSEVDS19CUl9DT05ORUNURUQocF9kZXYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgocF9kZXYpID09IE5VTEwgfHwgIShwX2RldiktPmJyX2Nvbm5lY3RlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogY2FsbGVkIHdoZW4gQlIgaXMgbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fKTsgXAotICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBMb2NhbCB0eXBlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYk5vdGlmeTsKLSAgdWludDhfdCBsYWJlbDsKLX0gYnRpZl9yY19yZWdfbm90aWZpY2F0aW9uc190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgbGFiZWw7Ci0gIHVpbnQ4X3QgY3R5cGU7Ci0gIGJvb2wgaXNfcnNwX3BlbmRpbmc7Ci19IGJ0aWZfcmNfY21kX2N0eHRfdDsKLQotLyogMiBzZWNvbmQgdGltZW91dCB0byBnZXQgaW50ZXJpbSByZXNwb25zZSAqLwotI2RlZmluZSBCVElGX1RJTUVPVVRfUkNfSU5URVJJTV9SU1BfTVMgKDIgKiAxMDAwKQotI2RlZmluZSBCVElGX1RJTUVPVVRfUkNfU1RBVFVTX0NNRF9NUyAoMiAqIDEwMDApCi0jZGVmaW5lIEJUSUZfVElNRU9VVF9SQ19DT05UUk9MX0NNRF9NUyAoMiAqIDEwMDApCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGVOT1RfUkVHSVNURVJFRCwKLSAgZVJFR0lTVEVSRUQsCi0gIGVJTlRFUklNCi19IGJ0aWZfcmNfbmZuX3JlZ19zdGF0dXNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGV2ZW50X2lkOwotICB1aW50OF90IGxhYmVsOwotICBidGlmX3JjX25mbl9yZWdfc3RhdHVzX3Qgc3RhdHVzOwotfSBidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90OwotCi0jZGVmaW5lIEJUSUZfUkNfU1RTX1RJTUVPVVQgMHhGRQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGxhYmVsOwotICB1aW50OF90IHBkdV9pZDsKLX0gYnRpZl9yY19zdGF0dXNfY21kX3RpbWVyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBsYWJlbDsKLSAgdWludDhfdCBwZHVfaWQ7Ci19IGJ0aWZfcmNfY29udHJvbF9jbWRfdGltZXJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bmlvbiB7Ci0gICAgYnRpZl9yY19zdGF0dXNfY21kX3RpbWVyX3QgcmNfc3RhdHVzX2NtZDsKLSAgICBidGlmX3JjX2NvbnRyb2xfY21kX3RpbWVyX3QgcmNfY29udHJvbF9jbWQ7Ci0gIH07Ci0gIFJhd0FkZHJlc3MgcmNfYWRkcjsKLX0gYnRpZl9yY190aW1lcl9jb250ZXh0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBxdWVyeV9zdGFydGVkOwotICB1aW50OF90IG51bV9hdHRyczsKLSAgdWludDhfdCBudW1fZXh0X2F0dHJzOwotCi0gIHVpbnQ4X3QgYXR0cl9pbmRleDsKLSAgdWludDhfdCBleHRfYXR0cl9pbmRleDsKLSAgdWludDhfdCBleHRfdmFsX2luZGV4OwotICBidHJjX3BsYXllcl9hcHBfYXR0cl90IGF0dHJzW0FWUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotICBidHJjX3BsYXllcl9hcHBfZXh0X2F0dHJfdCBleHRfYXR0cnNbQVZSQ19NQVhfQVBQX0FUVFJfU0laRV07Ci19IGJ0aWZfcmNfcGxheWVyX2FwcF9zZXR0aW5nc190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaW5fdXNlOwotICB1aW50OF90IGxibDsKLSAgdWludDhfdCBoYW5kbGU7Ci0gIGJ0aWZfcmNfdGltZXJfY29udGV4dF90IHR4bl90aW1lcl9jb250ZXh0OwotICBhbGFybV90KiB0eG5fdGltZXI7Ci19IHJjX3RyYW5zYWN0aW9uX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbGJsbG9jazsKLSAgcmNfdHJhbnNhY3Rpb25fdCB0cmFuc2FjdGlvbltNQVhfVFJBTlNBQ1RJT05TX1BFUl9TRVNTSU9OXTsKLX0gcmNfdHJhbnNhY3Rpb25fc2V0X3Q7Ci0KLS8qIFRPRE8gOiBNZXJnZSBidGlmX3JjX3JlZ19ub3RpZmljYXRpb25zX3QgYW5kIGJ0aWZfcmNfY21kX2N0eHRfdCB0byBhIHNpbmdsZQotICogc3RydWN0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgcmNfY29ubmVjdGVkOwotICBib29sIGJyX2Nvbm5lY3RlZDsgIC8vIEJyb3dzaW5nIGNoYW5uZWwuCi0gIHVpbnQ4X3QgcmNfaGFuZGxlOwotICB0QlRBX0FWX0ZFQVQgcmNfZmVhdHVyZXM7Ci0gIHVpbnQxNl90IHJjX2NvdmVyX2FydF9wc207ICAvLyBBVlJDUC1CSVAgcHNtCi0gIGJ0cmNfY29ubmVjdGlvbl9zdGF0ZV90IHJjX3N0YXRlOwotICBSYXdBZGRyZXNzIHJjX2FkZHI7Ci0gIHVpbnQxNl90IHJjX3BlbmRpbmdfcGxheTsKLSAgYnRpZl9yY19jbWRfY3R4dF90IHJjX3BkdV9pbmZvW01BWF9DTURfUVVFVUVfTEVOXTsKLSAgYnRpZl9yY19yZWdfbm90aWZpY2F0aW9uc190IHJjX25vdGlmW01BWF9SQ19OT1RJRklDQVRJT05TXTsKLSAgdW5zaWduZWQgaW50IHJjX3ZvbHVtZTsKLSAgdWludDhfdCByY192b2xfbGFiZWw7Ci0gIGxpc3RfdCogcmNfc3VwcG9ydGVkX2V2ZW50X2xpc3Q7Ci0gIGJ0aWZfcmNfcGxheWVyX2FwcF9zZXR0aW5nc190IHJjX2FwcF9zZXR0aW5nczsKLSAgYWxhcm1fdCogcmNfcGxheV9zdGF0dXNfdGltZXI7Ci0gIGJvb2wgcmNfZmVhdHVyZXNfcHJvY2Vzc2VkOwotICB1aW50NjRfdCByY19wbGF5aW5nX3VpZDsKLSAgYm9vbCByY19wcm9jZWR1cmVfY29tcGxldGU7Ci0gIHJjX3RyYW5zYWN0aW9uX3NldF90IHRyYW5zYWN0aW9uX3NldDsKLX0gYnRpZl9yY19kZXZpY2VfY2JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdGQ6Om11dGV4IGxvY2s7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QgcmNfbXVsdGlfY2JbQlRJRl9SQ19OVU1fQ09OTl07Ci19IHJjX2NiX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBsYWJlbDsKLSAgUmF3QWRkcmVzcyByY19hZGRyOwotfSByY19jb250ZXh0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsgdWludDhfdCBoYW5kbGU7IH0gYnRpZl9yY19oYW5kbGVfdDsKLQotc3RhdGljIHZvaWQgc2xlZXBfbXModWludDY0X3QgdGltZW91dF9tcyk7Ci0KLS8qIFJlc3BvbnNlIHN0YXR1cyBjb2RlIC0gVW5rbm93biBFcnJvciAtIHRoaXMgaXMgY2hhbmdlZCB0byAicmVzZXJ2ZWQiICovCi0jZGVmaW5lIEJUSUZfU1RTX0dFTl9FUlJPUiAweDA2Ci0KLS8qIFV0aWxpdHkgdGFibGUgdG8gbWFwIGhhbCBzdGF0dXMgY29kZXMgdG8gYnRhIHN0YXR1cyBjb2RlcyBmb3IgdGhlIHJlc3BvbnNlCi0gKiBzdGF0dXMgKi8KLXN0YXRpYyBjb25zdCB1aW50OF90IHN0YXR1c19jb2RlX21hcFtdID0gewotICAgIC8qIEJUQV9TdGF0dXMgY29kZXMgICAgICAgIEhBTF9TdGF0dXMgY29kZXMgKi8KLSAgICBBVlJDX1NUU19CQURfQ01ELCAgICAgICAgIC8qIEJUUkNfU1RTX0JBRF9DTUQgKi8KLSAgICBBVlJDX1NUU19CQURfUEFSQU0sICAgICAgIC8qIEJUUkNfU1RTX0JBRF9QQVJBTSAqLwotICAgIEFWUkNfU1RTX05PVF9GT1VORCwgICAgICAgLyogQlRSQ19TVFNfTk9UX0ZPVU5EICovCi0gICAgQVZSQ19TVFNfSU5URVJOQUxfRVJSLCAgICAvKiBCVFJDX1NUU19JTlRFUk5BTF9FUlIgKi8KLSAgICBBVlJDX1NUU19OT19FUlJPUiwgICAgICAgIC8qIEJUUkNfU1RTX05PX0VSUk9SICovCi0gICAgQVZSQ19TVFNfVUlEX0NIQU5HRUQsICAgICAvKiBCVFJDX1NUU19VSURfQ0hBTkdFRCAqLwotICAgIEJUSUZfU1RTX0dFTl9FUlJPUiwgICAgICAgLyogQlRSQ19TVFNfUkVTRVJWRUQgKi8KLSAgICBBVlJDX1NUU19CQURfRElSLCAgICAgICAgIC8qIEJUUkNfU1RTX0lOVl9ESVJOICovCi0gICAgQVZSQ19TVFNfTk9UX0RJUiwgICAgICAgICAvKiBCVFJDX1NUU19JTlZfRElSRUNUT1JZICovCi0gICAgQVZSQ19TVFNfTk9UX0VYSVNULCAgICAgICAvKiBCVFJDX1NUU19JTlZfSVRFTSAqLwotICAgIEFWUkNfU1RTX0JBRF9TQ09QRSwgICAgICAgLyogQlRSQ19TVFNfSU5WX1NDT1BFICovCi0gICAgQVZSQ19TVFNfQkFEX1JBTkdFLCAgICAgICAvKiBCVFJDX1NUU19JTlZfUkFOR0UgKi8KLSAgICBBVlJDX1NUU19VSURfSVNfRElSLCAgICAgIC8qIEJUUkNfU1RTX0RJUkVDVE9SWSAqLwotICAgIEFWUkNfU1RTX0lOX1VTRSwgICAgICAgICAgLyogQlRSQ19TVFNfTUVESUFfSU5fVVNFICovCi0gICAgQVZSQ19TVFNfTk9XX0xJU1RfRlVMTCwgICAvKiBCVFJDX1NUU19QTEFZX0xJU1RfRlVMTCAqLwotICAgIEFWUkNfU1RTX1NFQVJDSF9OT1RfU1VQLCAgLyogQlRSQ19TVFNfU1JDSF9OT1RfU1BSVEQgKi8KLSAgICBBVlJDX1NUU19TRUFSQ0hfQlVTWSwgICAgIC8qIEJUUkNfU1RTX1NSQ0hfSU5fUFJPRyAqLwotICAgIEFWUkNfU1RTX0JBRF9QTEFZRVJfSUQsICAgLyogQlRSQ19TVFNfSU5WX1BMQVlFUiAqLwotICAgIEFWUkNfU1RTX1BMQVlFUl9OX0JSLCAgICAgLyogQlRSQ19TVFNfUExBWV9OT1RfQlJPVyAqLwotICAgIEFWUkNfU1RTX1BMQVlFUl9OX0FERFIsICAgLyogQlRSQ19TVFNfUExBWV9OT1RfQUREUiAqLwotICAgIEFWUkNfU1RTX0JBRF9TRUFSQ0hfUkVTLCAgLyogQlRSQ19TVFNfSU5WX1JFU1VMVFMgKi8KLSAgICBBVlJDX1NUU19OT19BVkFMX1BMQVlFUiwgIC8qIEJUUkNfU1RTX05PX0FWQkxfUExBWSAqLwotICAgIEFWUkNfU1RTX0FERFJfUExBWUVSX0NIRywgLyogQlRSQ19TVFNfQUREUl9QTEFZX0NIR0QgKi8KLX07Ci0KLXZvaWQgaW5pdGlhbGl6ZV9kZXZpY2UoYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIHZvaWQgc2VuZF9yZWplY3RfcmVzcG9uc2UodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgcGR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3Qgb3Bjb2RlKTsKLXN0YXRpYyB1aW50OF90IG9wY29kZV9mcm9tX3BkdSh1aW50OF90IHBkdSk7Ci1zdGF0aWMgdm9pZCBzZW5kX21ldGFtc2dfcnNwKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2LCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SRVNQT05TRSogcG1ldGFtc2dfcmVzcCk7Ci1zdGF0aWMgdm9pZCByZWdpc3Rlcl92b2x1bWVjaGFuZ2UodWludDhfdCBsYWJlbCwgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIHZvaWQgaW5pdF9hbGxfdHJhbnNhY3Rpb25zKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfdHJhbnNhY3Rpb24oYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjX3RyYW5zYWN0aW9uX3QqKiBwdHJhbnNhY3Rpb24pOwotc3RhdGljIHZvaWQgcmVsZWFzZV90cmFuc2FjdGlvbihidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiwgdWludDhfdCBsYWJlbCk7Ci1zdGF0aWMgcmNfdHJhbnNhY3Rpb25fdCogZ2V0X3RyYW5zYWN0aW9uX2J5X2xibChidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGFiZWwpOwotc3RhdGljIHZvaWQgaGFuZGxlX3JjX21ldGFtc2dfcnNwKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3JjX2RldmljZV9jYl90KiBwX2Rldik7Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZV9hdmtfcmNfbWV0YW1zZ19jbWQodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9hdmtfcmNfbWV0YW1zZ19yc3AodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnKTsKLXN0YXRpYyB2b2lkIGJ0aWZfcmNfY3RybF91cHN0cmVhbXNfcnNwX2NtZCh1aW50OF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX0NPTU1BTkQqIHBhdnJjX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXN0YXRpYyB2b2lkIHJjX2N0cmxfcHJvY2VkdXJlX2NvbXBsZXRlKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2Zvcl9ldmVudF9ub3RpZmljYXRpb24oYnRpZl9yY19zdXBwb3J0ZWRfZXZlbnRfdCogcF9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIHZvaWQgaGFuZGxlX2dldF9jYXBhYmlsaXR5X3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19HRVRfQ0FQU19SU1AqIHBfcnNwKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9hcHBfYXR0cl9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTElTVF9BUFBfQVRUUl9SU1AqIHBfcnNwKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9hcHBfdmFsX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX0xJU1RfQVBQX1ZBTFVFU19SU1AqIHBfcnNwKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9hcHBfY3VyX3ZhbF9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfR0VUX0NVUl9BUFBfVkFMVUVfUlNQKiBwX3JzcCk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfYXBwX2F0dHJfdHh0X3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfR0VUX0FQUF9BVFRSX1RYVF9SU1AqIHBfcnNwKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9hcHBfYXR0cl92YWxfdHh0X3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX0dFVF9BUFBfQVRUUl9UWFRfUlNQKiBwX3JzcCk7Ci1zdGF0aWMgdm9pZCBjbGVhbnVwX2FwcF9hdHRyX3ZhbF90eHRfcmVzcG9uc2UoCi0gICAgYnRpZl9yY19wbGF5ZXJfYXBwX3NldHRpbmdzX3QqIHBfYXBwX3NldHRpbmdzKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9nZXRfcGxheXN0YXR1c19yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfR0VUX1BMQVlfU1RBVFVTX1JTUCogcF9yc3ApOwotc3RhdGljIHZvaWQgaGFuZGxlX3NldF9hZGRyZXNzZWRfcGxheWVyX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SU1AqIHBfcnNwKTsKLXN0YXRpYyB2b2lkIGNsZWFudXBfYnRyY19mb2xkZXJfaXRlbXMoYnRyY19mb2xkZXJfaXRlbXNfdCogYnRyY19pdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpdGVtX2NvdW50KTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9nZXRfbWV0YWRhdGFfYXR0cl9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19HRVRfQVRUUlNfUlNQKiBwX3JzcCk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfc2V0X2FwcF9hdHRyX3ZhbF9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SU1AqIHBfcnNwKTsKLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfcGxheV9zdGF0dXNfY21kKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJfdGV4dF9jbWQoCi0gICAgdWludDhfdCogYXR0cnMsIHVpbnQ4X3QgbnVtX2F0dHJzLCBidGlmX3JjX2RldmljZV9jYl90KiBwX2Rldik7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X3BsYXllcl9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X2NtZCgKLSAgICB1aW50OF90KiB2YWxzLCB1aW50OF90IG51bV92YWxzLCBidGlmX3JjX2RldmljZV9jYl90KiBwX2Rldik7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgcmVnaXN0ZXJfbm90aWZpY2F0aW9uX2NtZCh1aW50OF90IGxhYmVsLCB1aW50OF90IGV2ZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXZlbnRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3JjX2RldmljZV9jYl90KiBwX2Rldik7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X21ldGFkYXRhX2F0dHJpYnV0ZV9jbWQodWludDhfdCBudW1fYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwX2F0dHJfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfZWxlbWVudF9hdHRyaWJ1dGVfY21kKHVpbnQ4X3QgbnVtX2F0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwX2F0dHJfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9pdGVtX2F0dHJpYnV0ZV9jbWQodWludDY0X3QgdWlkLCBpbnQgc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwX2F0dHJfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRjYXBhYmlsaXRpZXNfY21kKHVpbnQ4X3QgY2FwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIGJ0X3N0YXR1c190IGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJpYl9jbWQoCi0gICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIGJ0X3N0YXR1c190IGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX3ZhbHVlX2NtZCgKLSAgICB1aW50OF90IGF0dHJpYl9pZCwgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9wbGF5ZXJfYXBwX3NldHRpbmdfY21kKHVpbnQ4X3QgbnVtX2F0dHJpYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhdHRyaWJfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KTsKLXZvaWQgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfbWVkaWEoY29uc3QgdEFWUkNfSVRFTSogYXZyY19pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2ZvbGRlcl9pdGVtc190KiBidHJjX2l0ZW0pOwotdm9pZCBnZXRfZm9sZGVyX2l0ZW1fdHlwZV9mb2xkZXIoY29uc3QgdEFWUkNfSVRFTSogYXZyY19pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19mb2xkZXJfaXRlbXNfdCogYnRyY19pdGVtKTsKLXZvaWQgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfcGxheWVyKGNvbnN0IHRBVlJDX0lURU0qIGF2cmNfaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfZm9sZGVyX2l0ZW1zX3QqIGJ0cmNfaXRlbSk7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X2ZvbGRlcl9pdGVtc19jbWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjb3BlLCB1aW50MzJfdCBzdGFydF9pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuZF9pdGVtKTsKLQotc3RhdGljIHZvaWQgYnRpZl9yY191cHN0cmVhbXNfZXZ0KHVpbnQxNl90IGV2ZW50LCB0QVZSQ19DT01NQU5EKiBwX3BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY3R5cGUsIHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotCi1zdGF0aWMgdm9pZCBidGlmX3JjX3Vwc3RyZWFtc19yc3BfZXZ0KHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SRVNQT05TRSogcGF2cmNfcmVzcCwgdWludDhfdCBjdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpOwotCi1zdGF0aWMgYm9vbCBhYnNvbHV0ZV92b2x1bWVfZGlzYWJsZWQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyByY19jYl90IGJ0aWZfcmNfY2I7Ci1zdGF0aWMgYnRyY19jYWxsYmFja3NfdCogYnRfcmNfY2FsbGJhY2tzID0gTlVMTDsKLXN0YXRpYyBidHJjX2N0cmxfY2FsbGJhY2tzX3QqIGJ0X3JjX2N0cmxfY2FsbGJhY2tzID0gTlVMTDsKLQotLy8gTGlzdCBvZiBkZXNpcmVkIG1lZGlhIGF0dHJpYnV0ZSBrZXlzIHRvIHJlcXVlc3QgYnkgZGVmYXVsdAotc3RhdGljIGNvbnN0IHVpbnQzMl90IG1lZGlhX2F0dHJfbGlzdFtdID0gewotICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX1RJVExFLCAgICAgICBBVlJDX01FRElBX0FUVFJfSURfQVJUSVNULAotICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX0FMQlVNLCAgICAgICBBVlJDX01FRElBX0FUVFJfSURfVFJBQ0tfTlVNLAotICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX05VTV9UUkFDS1MsICBBVlJDX01FRElBX0FUVFJfSURfR0VOUkUsCi0gICAgICBBVlJDX01FRElBX0FUVFJfSURfUExBWUlOR19USU1FLAotICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX0NPVkVSX0FSVFdPUktfSEFORExFfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IG1lZGlhX2F0dHJfbGlzdF9zaXplID0KLSAgICBzaXplb2YobWVkaWFfYXR0cl9saXN0KS9zaXplb2YodWludDMyX3QpOwotCi0vLyBMaXN0IG9mIGRlc2lyZWQgbWVkaWEgYXR0cmlidXRlIGtleXMgdG8gcmVxdWVzdCBpZiBjb3ZlciBhcnR3b3JrIGlzIG5vdCBhCi0vLyBzdXBwb3J0ZWQgZmVhdHVyZQotc3RhdGljIGNvbnN0IHVpbnQzMl90IG1lZGlhX2F0dHJfbGlzdF9ub19jb3Zlcl9hcnRbXSA9IHsKLSAgICAgIEFWUkNfTUVESUFfQVRUUl9JRF9USVRMRSwgICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX0FSVElTVCwKLSAgICAgIEFWUkNfTUVESUFfQVRUUl9JRF9BTEJVTSwgICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX1RSQUNLX05VTSwKLSAgICAgIEFWUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTLCAgQVZSQ19NRURJQV9BVFRSX0lEX0dFTlJFLAotICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX1BMQVlJTkdfVElNRX07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBtZWRpYV9hdHRyX2xpc3Rfbm9fY292ZXJfYXJ0X3NpemUgPQotICAgIHNpemVvZihtZWRpYV9hdHRyX2xpc3Rfbm9fY292ZXJfYXJ0KS9zaXplb2YodWludDMyX3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIGNoZWNrX2NvZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhZGRyLCB1aW50MzJfdCBjb2QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidGlmX3JjX2RldmljZV9jYl90KiBhbGxvY19kZXZpY2UoKSB7Ci0gIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IEJUSUZfUkNfTlVNX0NPTk47IGlkeCsrKSB7Ci0gICAgaWYgKGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XS5yY19zdGF0ZSA9PQotICAgICAgICBCVFJDX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICByZXR1cm4gKCZidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0pOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBpbml0aWFsaXplX2RldmljZShidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICBpZiAocF9kZXYgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIHBfZGV2LT5yY19jb25uZWN0ZWQgPSBmYWxzZTsKLSAgcF9kZXYtPmJyX2Nvbm5lY3RlZCA9IGZhbHNlOwotICBwX2Rldi0+cmNfaGFuZGxlID0gMDsKLSAgcF9kZXYtPnJjX2ZlYXR1cmVzID0gMDsKLSAgcF9kZXYtPnJjX2NvdmVyX2FydF9wc20gPSAwOwotICBwX2Rldi0+cmNfc3RhdGUgPSBCVFJDX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOwotICBwX2Rldi0+cmNfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgcF9kZXYtPnJjX3BlbmRpbmdfcGxheSA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DTURfUVVFVUVfTEVOOyArK2kpIHsKLSAgICBwX2Rldi0+cmNfcGR1X2luZm9baV0uY3R5cGUgPSAwOwotICAgIHBfZGV2LT5yY19wZHVfaW5mb1tpXS5sYWJlbCA9IDA7Ci0gICAgcF9kZXYtPnJjX3BkdV9pbmZvW2ldLmlzX3JzcF9wZW5kaW5nID0gZmFsc2U7Ci0gIH0KLSAgaWYgKHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCAhPSBudWxscHRyKSB7Ci0gICAgbGlzdF9jbGVhcihwX2Rldi0+cmNfc3VwcG9ydGVkX2V2ZW50X2xpc3QpOwotICB9Ci0gIHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCA9IG51bGxwdHI7Ci0gIHBfZGV2LT5yY192b2x1bWUgPSBNQVhfVk9MVU1FOwotICBwX2Rldi0+cmNfdm9sX2xhYmVsID0gTUFYX0xBQkVMOwotICBtZW1zZXQoJnBfZGV2LT5yY19hcHBfc2V0dGluZ3MsIDAsIHNpemVvZihidGlmX3JjX3BsYXllcl9hcHBfc2V0dGluZ3NfdCkpOwotICBwX2Rldi0+cmNfcGxheV9zdGF0dXNfdGltZXIgPSBudWxscHRyOwotICBwX2Rldi0+cmNfZmVhdHVyZXNfcHJvY2Vzc2VkID0gZmFsc2U7Ci0gIHBfZGV2LT5yY19wbGF5aW5nX3VpZCA9IDA7Ci0gIHBfZGV2LT5yY19wcm9jZWR1cmVfY29tcGxldGUgPSBmYWxzZTsKLQotICAvLyBMZWF2aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIGxibGxvY2sgbXV0ZXggaXMgZmluZQotICAvLyBidXQgd2Ugc3RpbGwgbmVlZCB0byBjbGVhciBvdXQgdGhlIHRyYW5zYWN0aW9uIGxhYmVsIHNldAotICBtZW1zZXQoJnBfZGV2LT50cmFuc2FjdGlvbl9zZXQudHJhbnNhY3Rpb24sIDAsCi0gICAgICAgICBzaXplb2YocF9kZXYtPnRyYW5zYWN0aW9uX3NldC50cmFuc2FjdGlvbikpOwotICBpbml0X2FsbF90cmFuc2FjdGlvbnMocF9kZXYpOwotfQotCi1zdGF0aWMgYnRpZl9yY19kZXZpY2VfY2JfdCogZ2V0X2Nvbm5lY3RlZF9kZXZpY2UoaW50IGluZGV4KSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBpbmRleDogJWQiLCBfX2Z1bmNfXywgaW5kZXgpOwotICBpZiAoaW5kZXggPiBCVElGX1JDX05VTV9DT05OKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGNhbid0IHN1cHBvcnQgbW9yZSB0aGFuICVkIGNvbm5lY3Rpb25zIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBCVElGX1JDX05VTV9DT05OKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoYnRpZl9yY19jYi5yY19tdWx0aV9jYltpbmRleF0ucmNfc3RhdGUgIT0KLSAgICAgIEJUUkNfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcmV0dXJuaW5nIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuICgmYnRpZl9yY19jYi5yY19tdWx0aV9jYltpbmRleF0pOwotfQotCi1idGlmX3JjX2RldmljZV9jYl90KiBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBiZF9hZGRyOiAiIDw8IGJkX2FkZHI7Ci0KLSAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgQlRJRl9SQ19OVU1fQ09OTjsgaWR4KyspIHsKLSAgICBpZiAoKGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XS5yY19zdGF0ZSAhPQotICAgICAgICAgQlRSQ19DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCkgJiYKLSAgICAgICAgYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLnJjX2FkZHIgPT0gYmRfYWRkcikgewotICAgICAgcmV0dXJuICgmYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdKTsKLSAgICB9Ci0gIH0KLSAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGRldmljZSBub3QgZm91bmQsIHJldHVybmluZyBOVUxMISIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJ0aWZfcmNfZGV2aWNlX2NiX3QqIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUodWludDhfdCBoYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGhhbmRsZTogMHgleCIsIF9fZnVuY19fLCBoYW5kbGUpOwotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBCVElGX1JDX05VTV9DT05OOyBpZHgrKykgewotICAgIGlmICgoYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLnJjX3N0YXRlICE9Ci0gICAgICAgICBCVFJDX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKSAmJgotICAgICAgICAoYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLnJjX2hhbmRsZSA9PSBoYW5kbGUpKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLnJjX2hhbmRsZTogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0ucmNfaGFuZGxlKTsKLSAgICAgIHJldHVybiAoJmJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XSk7Ci0gICAgfQotICB9Ci0gIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiByZXR1cm5pbmcgTlVMTCIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IHVpbnQzMl90KiBnZXRfcmVxdWVzdGVkX2F0dHJpYnV0ZXNfbGlzdChidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICByZXR1cm4gKHBfZGV2LT5yY19mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0NPVkVSX0FSVFdPUksKLSAgICAgID8gbWVkaWFfYXR0cl9saXN0Ci0gICAgICA6IG1lZGlhX2F0dHJfbGlzdF9ub19jb3Zlcl9hcnQpOwotfQotCi11aW50OF90IGdldF9yZXF1ZXN0ZWRfYXR0cmlidXRlc19saXN0X3NpemUoYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgcmV0dXJuIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9DT1ZFUl9BUlRXT1JLCi0gICAgICA/IG1lZGlhX2F0dHJfbGlzdF9zaXplCi0gICAgICA6IG1lZGlhX2F0dHJfbGlzdF9ub19jb3Zlcl9hcnRfc2l6ZSk7Ci19Ci0KLXZvaWQgZmlsbF9wZHVfcXVldWUoaW50IGluZGV4LCB1aW50OF90IGN0eXBlLCB1aW50OF90IGxhYmVsLCBib29sIHBlbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIHBfZGV2LT5yY19wZHVfaW5mb1tpbmRleF0uY3R5cGUgPSBjdHlwZTsKLSAgcF9kZXYtPnJjX3BkdV9pbmZvW2luZGV4XS5sYWJlbCA9IGxhYmVsOwotICBwX2Rldi0+cmNfcGR1X2luZm9baW5kZXhdLmlzX3JzcF9wZW5kaW5nID0gcGVuZGluZzsKLX0KLQotdm9pZCBmaWxsX2F2cmNfYXR0cl9lbnRyeSh0QVZSQ19BVFRSX0VOVFJZKiBhdHRyX3ZhbHMsIGludCBudW1fYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90KiBwX2F0dHJzKSB7Ci0gIGZvciAoaW50IGF0dHJfY250ID0gMDsgYXR0cl9jbnQgPCBudW1fYXR0cnM7IGF0dHJfY250KyspIHsKLSAgICBhdHRyX3ZhbHNbYXR0cl9jbnRdLmF0dHJfaWQgPSBwX2F0dHJzW2F0dHJfY250XS5hdHRyX2lkOwotICAgIGF0dHJfdmFsc1thdHRyX2NudF0ubmFtZS5jaGFyc2V0X2lkID0gQVZSQ19DSEFSU0VUX0lEX1VURjg7Ci0gICAgYXR0cl92YWxzW2F0dHJfY250XS5uYW1lLnN0cl9sZW4gPQotICAgICAgICAodWludDE2X3Qpc3RybGVuKChjaGFyKilwX2F0dHJzW2F0dHJfY250XS50ZXh0KTsKLSAgICBhdHRyX3ZhbHNbYXR0cl9jbnRdLm5hbWUucF9zdHIgPSBwX2F0dHJzW2F0dHJfY250XS50ZXh0OwotICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICIlczogYXR0cl9pZDogMHgleCwgY2hhcnNldF9pZDogMHgleCwgc3RyX2xlbjogJWQsIHN0cjogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgKHVuc2lnbmVkIGludClhdHRyX3ZhbHNbYXR0cl9jbnRdLmF0dHJfaWQsCi0gICAgICAgIGF0dHJfdmFsc1thdHRyX2NudF0ubmFtZS5jaGFyc2V0X2lkLCBhdHRyX3ZhbHNbYXR0cl9jbnRdLm5hbWUuc3RyX2xlbiwKLSAgICAgICAgYXR0cl92YWxzW2F0dHJfY250XS5uYW1lLnBfc3RyKTsKLSAgfQotfQotCi12b2lkIHJjX2NsZWFudXBfc2VudF9jbWQodm9pZCogcF9kYXRhKSB7IEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAiLCBfX2Z1bmNfXyk7IH0KLQotdm9pZCBoYW5kbGVfcmNfY3RybF9mZWF0dXJlcyhidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICBpZiAoIShwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSAmJgotICAgICAgKCEocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNDVCkgfHwKLSAgICAgICAhKHBfZGV2LT5yY19mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0FEVl9DVFJMKSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQgcmNfZmVhdHVyZXMgPSAwOwotCi0gIGlmICgocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQURWX0NUUkwpICYmCi0gICAgICAocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNDVCkpIHsKLSAgICByY19mZWF0dXJlcyB8PSBCVFJDX0ZFQVRfQUJTT0xVVEVfVk9MVU1FOwotICB9Ci0KLSAgaWYgKHBfZGV2LT5yY19mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX01FVEFEQVRBKSB7Ci0gICAgcmNfZmVhdHVyZXMgfD0gQlRSQ19GRUFUX01FVEFEQVRBOwotICB9Ci0KLSAgaWYgKChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9WRU5ET1IpICYmCi0gICAgICAocF9kZXYtPnJjX2ZlYXR1cmVzX3Byb2Nlc3NlZCAhPSB0cnVlKSkgewotICAgIC8qIE1hcmsgcmMgZmVhdHVyZXMgcHJvY2Vzc2VkIHRvIGF2b2lkIHJlcGVhdGluZwotICAgICAqIHRoZSBBVlJDUCBwcm9jZWR1cmUgZXZlcnkgdGltZSBvbiByZWNlaXZpbmcgdGhpcwotICAgICAqIHVwZGF0ZS4KLSAgICAgKi8KLSAgICBwX2Rldi0+cmNfZmVhdHVyZXNfcHJvY2Vzc2VkID0gdHJ1ZTsKLSAgICBpZiAoYnRpZl9hdl9pc19zaW5rX2VuYWJsZWQoKSkgewotICAgICAgZ2V0Y2FwYWJpbGl0aWVzX2NtZChBVlJDX0NBUF9DT01QQU5ZX0lELCBwX2Rldik7Ci0gICAgfQotICB9Ci0KLSAgLyogQWRkIGJyb3dzaW5nIGZlYXR1cmUgY2FwYWJpbGl0eSAqLwotICBpZiAocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQlJPV1NFKSB7Ci0gICAgcmNfZmVhdHVyZXMgfD0gQlRSQ19GRUFUX0JST1dTRTsKLSAgfQotCi0gIC8qIEFkZCBjb3ZlciBhcnQgZmVhdHVyZSBjYXBhYmlsaXR5ICovCi0gIGlmIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9DT1ZFUl9BUlRXT1JLKSB7Ci0gICAgcmNfZmVhdHVyZXMgfD0gQlRSQ19GRUFUX0NPVkVSX0FSVFdPUks7Ci0gIH0KLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogVXBkYXRlIHJjIGZlYXR1cmVzIHRvIENUUkw6ICVkIiwgX19mdW5jX18sIHJjX2ZlYXR1cmVzKTsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPmdldHJjZmVhdHVyZXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyLCByY19mZWF0dXJlcykpOwotfQotCi12b2lkIGhhbmRsZV9yY19jdHJsX3BzbShidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICB1aW50MTZfdCBjb3Zlcl9hcnRfcHNtID0gcF9kZXYtPnJjX2NvdmVyX2FydF9wc207Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBVcGRhdGUgcmMgY292ZXIgYXJ0IHBzbSB0byBDVFJMOiAlZCIsIF9fZnVuY19fLAotICAgICAgY292ZXJfYXJ0X3BzbSk7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKAotICAgICAgYnRfcmNfY3RybF9jYWxsYmFja3MtPmdldF9jb3Zlcl9hcnRfcHNtX2NiLAotICAgICAgcF9kZXYtPnJjX2FkZHIsIGNvdmVyX2FydF9wc20pKTsKLX0KLQotdm9pZCBoYW5kbGVfcmNfZmVhdHVyZXMoYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLQotICBDSEVDSyhidF9yY19jYWxsYmFja3MpOwotCi0gIGJ0cmNfcmVtb3RlX2ZlYXR1cmVzX3QgcmNfZmVhdHVyZXMgPSBCVFJDX0ZFQVRfTk9ORTsKLSAgUmF3QWRkcmVzcyBhdmR0cF9zb3VyY2VfYWN0aXZlX3BlZXJfYWRkciA9IGJ0aWZfYXZfc291cmNlX2FjdGl2ZV9wZWVyKCk7Ci0gIFJhd0FkZHJlc3MgYXZkdHBfc2lua19hY3RpdmVfcGVlcl9hZGRyID0gYnRpZl9hdl9zaW5rX2FjdGl2ZV9wZWVyKCk7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICIlczogQVZEVFAgU291cmNlIEFjdGl2ZSBQZWVyIEFkZHJlc3M6ICVzICIKLSAgICAgICJBVkRUUCBTaW5rIEFjdGl2ZSBQZWVyIEFkZHJlc3M6ICVzICIKLSAgICAgICJBVkNUUCBhZGRyZXNzOiAlcyIsCi0gICAgICBfX2Z1bmNfXywgYXZkdHBfc291cmNlX2FjdGl2ZV9wZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgYXZkdHBfc2lua19hY3RpdmVfcGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgIHBfZGV2LT5yY19hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FLCAmcF9kZXYtPnJjX2FkZHIpIHx8Ci0gICAgICBhYnNvbHV0ZV92b2x1bWVfZGlzYWJsZWQoKSB8fAotICAgICAgKGF2ZHRwX3NvdXJjZV9hY3RpdmVfcGVlcl9hZGRyICE9IHBfZGV2LT5yY19hZGRyICYmCi0gICAgICAgYXZkdHBfc2lua19hY3RpdmVfcGVlcl9hZGRyICE9IHBfZGV2LT5yY19hZGRyKSkgewotICAgIHBfZGV2LT5yY19mZWF0dXJlcyAmPSB+QlRBX0FWX0ZFQVRfQURWX0NUUkw7Ci0gIH0KLQotICBpZiAocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQlJPV1NFKSB7Ci0gICAgcmNfZmVhdHVyZXMgPSAoYnRyY19yZW1vdGVfZmVhdHVyZXNfdCkocmNfZmVhdHVyZXMgfCBCVFJDX0ZFQVRfQlJPV1NFKTsKLSAgfQotCi0jaWYgKEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkKLSAgaWYgKChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9BRFZfQ1RSTCkgJiYKLSAgICAgIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSkgewotICAgIHJjX2ZlYXR1cmVzID0KLSAgICAgICAgKGJ0cmNfcmVtb3RlX2ZlYXR1cmVzX3QpKHJjX2ZlYXR1cmVzIHwgQlRSQ19GRUFUX0FCU09MVVRFX1ZPTFVNRSk7Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9NRVRBREFUQSkgewotICAgIHJjX2ZlYXR1cmVzID0gKGJ0cmNfcmVtb3RlX2ZlYXR1cmVzX3QpKHJjX2ZlYXR1cmVzIHwgQlRSQ19GRUFUX01FVEFEQVRBKTsKLSAgfQotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByY19mZWF0dXJlczogMHgleCIsIF9fZnVuY19fLCByY19mZWF0dXJlcyk7Ci0gIEhBTF9DQkFDSyhidF9yY19jYWxsYmFja3MsIHJlbW90ZV9mZWF0dXJlc19jYiwgcF9kZXYtPnJjX2FkZHIsIHJjX2ZlYXR1cmVzKTsKLQotI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCi0gIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IENoZWNraW5nIGZvciBmZWF0dXJlIGZsYWdzIGluIGJ0aWZfcmNfaGFuZGxlciB3aXRoIGxhYmVsOiAlZCIsCi0gICAgICBfX2Z1bmNfXywgcF9kZXYtPnJjX3ZvbF9sYWJlbCk7Ci0gIC8vIFJlZ2lzdGVyIGZvciB2b2x1bWUgY2hhbmdlIG9uIGNvbm5lY3QKLSAgaWYgKHBfZGV2LT5yY19mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0FEVl9DVFJMICYmCi0gICAgICBwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSB7Ci0gICAgcmNfdHJhbnNhY3Rpb25fdCogcF90cmFuc2FjdGlvbiA9IE5VTEw7Ci0gICAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgICBpZiAoTUFYX0xBQkVMID09IHBfZGV2LT5yY192b2xfbGFiZWwpIHsKLSAgICAgIHN0YXR1cyA9IGdldF90cmFuc2FjdGlvbihwX2RldiwgJnBfdHJhbnNhY3Rpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICBwX3RyYW5zYWN0aW9uID0gZ2V0X3RyYW5zYWN0aW9uX2J5X2xibChwX2RldiwgcF9kZXYtPnJjX3ZvbF9sYWJlbCk7Ci0gICAgICBpZiAoTlVMTCAhPSBwX3RyYW5zYWN0aW9uKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiJXM6IHJlZ2lzdGVyX3ZvbHVtZWNoYW5nZSBhbHJlYWR5IGluIHByb2dyZXNzIGZvciBsYWJlbDogJWQiLAotICAgICAgICAgICAgX19mdW5jX18sIHBfZGV2LT5yY192b2xfbGFiZWwpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzdGF0dXMgPSBnZXRfdHJhbnNhY3Rpb24ocF9kZXYsICZwX3RyYW5zYWN0aW9uKTsKLSAgICB9Ci0gICAgaWYgKEJUX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cyAmJiBOVUxMICE9IHBfdHJhbnNhY3Rpb24pIHsKLSAgICAgIHBfZGV2LT5yY192b2xfbGFiZWwgPSBwX3RyYW5zYWN0aW9uLT5sYmw7Ci0gICAgICByZWdpc3Rlcl92b2x1bWVjaGFuZ2UocF9kZXYtPnJjX3ZvbF9sYWJlbCwgcF9kZXYpOwotICAgIH0KLSAgfQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiAgICAgICBoYW5kbGVfcmNfY29ubmVjdAotICoKLSAqICAtIEFyZ3VtZW50OiAgICB0QlRBX0FWX1JDX09QRU4gIGJyb3dzZSBSQyBvcGVuIGRhdGEgc3RydWN0dXJlCi0gKgotICogIC0gRGVzY3JpcHRpb246IGJyb3dzZSBSQyBjb25uZWN0aW9uIGV2ZW50IGhhbmRsZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBoYW5kbGVfcmNfYnJvd3NlX2Nvbm5lY3QodEJUQV9BVl9SQ19CUk9XU0VfT1BFTiogcF9yY19icl9vcGVuKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByY19oYW5kbGUgJWQgc3RhdHVzICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9yY19icl9vcGVuLT5yY19oYW5kbGUsIHBfcmNfYnJfb3Blbi0+c3RhdHVzKTsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPQotICAgICAgYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwX3JjX2JyX29wZW4tPnJjX2hhbmRsZSk7Ci0KLSAgaWYgKCFwX2RldikgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzIHBfZGV2IGlzIG51bGwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogY2hlY2sgdGhhdCB3ZSBhcmUgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhpcyBhZGRyZXNzIHNpbmNlIGJlaW5nIGNvbm5lY3RlZAotICAgKiB0byBhIGJyb3dzZSB3aGVuIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGNvbnRyb2wgY2hhbm5lbCBvdmVyIEFWUkNQIGlzCi0gICAqIHByb2JhYmx5IG5vdCBwcmVmZXJyZWQgYW55d2F5cy4gKi8KLSAgaWYgKHBfcmNfYnJfb3Blbi0+c3RhdHVzID09IEJUQV9BVl9TVUNDRVNTKSB7Ci0gICAgcF9kZXYtPmJyX2Nvbm5lY3RlZCA9IHRydWU7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0X3JjX2N0cmxfY2FsbGJhY2tzLT5jb25uZWN0aW9uX3N0YXRlX2NiLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBwX2Rldi0+cmNfYWRkcikpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiAgICAgICBoYW5kbGVfcmNfY29ubmVjdAotICoKLSAqICAtIEFyZ3VtZW50OiAgICB0QlRBX0FWX1JDX09QRU4gIFJDIG9wZW4gZGF0YSBzdHJ1Y3R1cmUKLSAqCi0gKiAgLSBEZXNjcmlwdGlvbjogUkMgY29ubmVjdGlvbiBldmVudCBoYW5kbGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaGFuZGxlX3JjX2Nvbm5lY3QodEJUQV9BVl9SQ19PUEVOKiBwX3JjX29wZW4pIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJjX2hhbmRsZTogJWQiLCBfX2Z1bmNfXywgcF9yY19vcGVuLT5yY19oYW5kbGUpOwotCi0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYWxsb2NfZGV2aWNlKCk7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHBfZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCEocF9yY19vcGVuLT5zdGF0dXMgPT0gQlRBX0FWX1NVQ0NFU1MpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IENvbm5lY3QgZmFpbGVkIHdpdGggZXJyb3IgY29kZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfcmNfb3Blbi0+c3RhdHVzKTsKLSAgICBwX2Rldi0+cmNfY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gY2hlY2sgaWYgYWxyZWFkeSBzb21lIFJDIGlzIGNvbm5lY3RlZAotICBpZiAocF9kZXYtPnJjX2Nvbm5lY3RlZCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogR290IFJDIE9QRU4gaW4gY29ubmVjdGVkIHN0YXRlLCBDb25uZWN0ZWQgUkM6ICVkIFwKLSAgICAgICAgICAgIGFuZCBDdXJyZW50IFJDOiAlZCIsCi0gICAgICAgIF9fZnVuY19fLCBwX2Rldi0+cmNfaGFuZGxlLCBwX3JjX29wZW4tPnJjX2hhbmRsZSk7Ci0gICAgaWYgKHBfZGV2LT5yY19oYW5kbGUgIT0gcF9yY19vcGVuLT5yY19oYW5kbGUgJiYKLSAgICAgICAgcF9kZXYtPnJjX2FkZHIgIT0gcF9yY19vcGVuLT5wZWVyX2FkZHIpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBHb3QgUkMgY29ubmVjdGVkIGZvciBzb21lIG90aGVyIGhhbmRsZSIsIF9fZnVuY19fKTsKLSAgICAgIEJUQV9BdkNsb3NlUmMocF9yY19vcGVuLT5yY19oYW5kbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBwX2Rldi0+cmNfYWRkciA9IHBfcmNfb3Blbi0+cGVlcl9hZGRyOwotICBwX2Rldi0+cmNfZmVhdHVyZXMgPSBwX3JjX29wZW4tPnBlZXJfZmVhdHVyZXM7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBoYW5kbGVfcmNfY29ubmVjdCBpbiBmZWF0dXJlczogMHgleCBvdXQgZmVhdHVyZXMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcmNfb3Blbi0+cGVlcl9mZWF0dXJlcywgcF9kZXYtPnJjX2ZlYXR1cmVzKTsKLSAgcF9kZXYtPnJjX2NvdmVyX2FydF9wc20gPSBwX3JjX29wZW4tPmNvdmVyX2FydF9wc207Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjb3ZlciBhcnQgcHNtOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kZXYtPnJjX2NvdmVyX2FydF9wc20pOwotICBwX2Rldi0+cmNfdm9sX2xhYmVsID0gTUFYX0xBQkVMOwotICBwX2Rldi0+cmNfdm9sdW1lID0gTUFYX1ZPTFVNRTsKLQotICBwX2Rldi0+cmNfY29ubmVjdGVkID0gdHJ1ZTsKLSAgcF9kZXYtPnJjX2hhbmRsZSA9IHBfcmNfb3Blbi0+cmNfaGFuZGxlOwotICBwX2Rldi0+cmNfc3RhdGUgPSBCVFJDX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOwotICAvKiBvbiBsb2NhbGx5IGluaXRpYXRlZCBjb25uZWN0aW9uIHdlIHdpbGwgZ2V0IHJlbW90ZSBmZWF0dXJlcyBhcyBwYXJ0IG9mCi0gICAqIGNvbm5lY3QgKi8KLSAgaWYgKHBfZGV2LT5yY19mZWF0dXJlcyAhPSAwICYmIGJ0X3JjX2NhbGxiYWNrcyAhPSBOVUxMKSB7Ci0gICAgaGFuZGxlX3JjX2ZlYXR1cmVzKHBfZGV2KTsKLSAgfQotCi0gIHBfZGV2LT5yY19wbGF5aW5nX3VpZCA9IFJDX0lOVkFMSURfVFJBQ0tfSUQ7Ci0gIGlmIChidF9yY19jdHJsX2NhbGxiYWNrcyAhPSBOVUxMKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0X3JjX2N0cmxfY2FsbGJhY2tzLT5jb25uZWN0aW9uX3N0YXRlX2NiLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgcF9kZXYtPnJjX2FkZHIpKTsKLSAgfQotICAvKiByZXBvcnQgY29ubmVjdGlvbiBzdGF0ZSBpZiByZW1vdGUgZGV2aWNlIGlzIEFWUkNQIHRhcmdldCAqLwotICBoYW5kbGVfcmNfY3RybF9mZWF0dXJlcyhwX2Rldik7Ci0KLSAgLyogcmVwb3J0IHBzbSBpZiByZW1vdGUgZGV2aWNlIGlzIEFWUkNQIHRhcmdldCAqLwotICBoYW5kbGVfcmNfY3RybF9wc20ocF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb24gICAgICAgaGFuZGxlX3JjX2Rpc2Nvbm5lY3QKLSAqCi0gKiAgLSBBcmd1bWVudDogICAgdEJUQV9BVl9SQ19DTE9TRSAgICAgUkMgY2xvc2UgZGF0YSBzdHJ1Y3R1cmUKLSAqCi0gKiAgLSBEZXNjcmlwdGlvbjogUkMgZGlzY29ubmVjdGlvbiBldmVudCBoYW5kbGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaGFuZGxlX3JjX2Rpc2Nvbm5lY3QodEJUQV9BVl9SQ19DTE9TRSogcF9yY19jbG9zZSkgewotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IE5VTEw7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByY19oYW5kbGU6ICVkIiwgX19mdW5jX18sIHBfcmNfY2xvc2UtPnJjX2hhbmRsZSk7Ci0KLSAgcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBfcmNfY2xvc2UtPnJjX2hhbmRsZSk7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEdvdCBkaXNjb25uZWN0IGZyb20gaW52YWxpZCByYyBoYW5kbGUiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfcmNfY2xvc2UtPnJjX2hhbmRsZSAhPSBwX2Rldi0+cmNfaGFuZGxlICYmCi0gICAgICBwX2Rldi0+cmNfYWRkciAhPSBwX3JjX2Nsb3NlLT5wZWVyX2FkZHIpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCJHb3QgZGlzY29ubmVjdCBvZiB1bmtub3duIGRldmljZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlcG9ydCBjb25uZWN0aW9uIHN0YXRlIGlmIGRldmljZSBpcyBBVlJDUCB0YXJnZXQgKi8KLSAgaWYgKGJ0X3JjX2N0cmxfY2FsbGJhY2tzICE9IE5VTEwpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPmNvbm5lY3Rpb25fc3RhdGVfY2IsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHBfZGV2LT5yY19hZGRyKSk7Ci0gIH0KLQotICAvLyBXZSdsbCByZS1pbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RhdGUgYmFjayB0byB3aGF0IGl0IGxvb2tlZCBsaWtlIGJlZm9yZQotICAvLyB0aGUgY29ubmVjdGlvbgotICBpbml0aWFsaXplX2RldmljZShwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiAgICAgICBoYW5kbGVfcmNfcGFzc3Rocm91Z2hfY21kCi0gKgotICogIC0gQXJndW1lbnQ6ICAgIHRCVEFfQVZfUkMgcmNfaWQgICByZW1vdGUgY29udHJvbCBjb21tYW5kIElECi0gKiAgICAgICAgICAgICAgICAgdEJUQV9BVl9TVEFURSBrZXlfc3RhdGUgc3RhdHVzIG9mIGtleSBwcmVzcwotICoKLSAqICAtIERlc2NyaXB0aW9uOiBSZW1vdGUgY29udHJvbCBjb21tYW5kIGhhbmRsZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBoYW5kbGVfcmNfcGFzc3Rocm91Z2hfY21kKHRCVEFfQVZfUkVNT1RFX0NNRCogcF9yZW1vdGVfY21kKSB7Ci0gIGlmIChwX3JlbW90ZV9jbWQgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBObyByZW1vdGUgY29tbWFuZCEiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPQotICAgICAgYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwX3JlbW90ZV9jbWQtPnJjX2hhbmRsZSk7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEdvdCBwYXNzdGhyb3VnaCBjb21tYW5kIGZyb20gaW52YWxpZCByYyBoYW5kbGUiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHBfcmVtb3RlX2NtZC0+cmNfaWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9yZW1vdGVfY21kLT5yY19pZCk7Ci0KLSAgLyogSWYgQVZSQyBpcyBvcGVuIGFuZCBwZWVyIHNlbmRzIFBMQVkgYnV0IHRoZXJlIGlzIG5vIEFWRFQsIHRoZW4gd2UgcXVldWUtdXAKLSAgICogdGhpcyBQTEFZICovCi0gIGlmICgocF9yZW1vdGVfY21kLT5yY19pZCA9PSBBVlJDX0lEX1BMQVkpICYmICghYnRpZl9hdl9pc19jb25uZWN0ZWQoKSkpIHsKLSAgICBpZiAocF9yZW1vdGVfY21kLT5rZXlfc3RhdGUgPT0gQVZSQ19TVEFURV9QUkVTUykgewotICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogQVZEVCBub3Qgb3BlbiwgcXVldWluZyB0aGUgUExBWSBjb21tYW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICBwX2Rldi0+cmNfcGVuZGluZ19wbGF5ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSWYgd2UgcHJldmlvdXNseSBxdWV1ZWQgYSBwbGF5IGFuZCB3ZSBnZXQgYSBQQVVTRSwgY2xlYXIgaXQuICovCi0gIGlmICgocF9yZW1vdGVfY21kLT5yY19pZCA9PSBBVlJDX0lEX1BBVVNFKSAmJiAocF9kZXYtPnJjX3BlbmRpbmdfcGxheSkpIHsKLSAgICBBUFBMX1RSQUNFX1dBUk5JTkcoIiVzOiBDbGVhciB0aGUgcGVuZGluZyBQTEFZIG9uIFBBVVNFIHJlY2VpdmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHBfZGV2LT5yY19wZW5kaW5nX3BsYXkgPSBmYWxzZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoKHBfcmVtb3RlX2NtZC0+cmNfaWQgPT0gQVZSQ19JRF9TVE9QKSAmJgotICAgICAgKCFidGlmX2F2X3N0cmVhbV9zdGFydGVkX3JlYWR5KCkpKSB7Ci0gICAgQVBQTF9UUkFDRV9XQVJOSU5HKCIlczogU3RyZWFtIHN1c3BlbmRlZCwgaWdub3JlIFNUT1AgY21kIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBwcmVzc2VkID0gKHBfcmVtb3RlX2NtZC0+a2V5X3N0YXRlID09IEFWUkNfU1RBVEVfUFJFU1MpID8gMSA6IDA7Ci0KLSAgLyogcGFzcyBhbGwgY29tbWFuZHMgdXAgKi8KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJjX2ZlYXR1cmVzOiAlZCwgY21kLT5yY19pZDogJWQsIHByZXNzZWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2ZlYXR1cmVzLCBwX3JlbW90ZV9jbWQtPnJjX2lkLCBwcmVzc2VkKTsKLSAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgcGFzc3Rocm91Z2hfY21kX2NiLCBwX3JlbW90ZV9jbWQtPnJjX2lkLCBwcmVzc2VkLAotICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb24gICAgICAgaGFuZGxlX3JjX3Bhc3N0aHJvdWdoX3JzcAotICoKLSAqICAtIEFyZ3VtZW50OiAgICB0QlRBX0FWX1JFTU9URV9SU1AgcGFzc3Rocm91Z2ggY29tbWFuZCByZXNwb25zZQotICoKLSAqICAtIERlc2NyaXB0aW9uOiBSZW1vdGUgY29udHJvbCBwYXNzdGhyb3VnaCByZXNwb25zZSBoYW5kbGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaGFuZGxlX3JjX3Bhc3N0aHJvdWdoX3JzcCh0QlRBX0FWX1JFTU9URV9SU1AqIHBfcmVtb3RlX3JzcCkgewotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IE5VTEw7Ci0KLSAgcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBfcmVtb3RlX3JzcC0+cmNfaGFuZGxlKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcGFzc3Rocm91Z2ggcmVzcG9uc2UgZm9yIEludmFsaWQgcmMgaGFuZGxlIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIGlmICghKHBfZGV2LT5yY19mZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDVEcpKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IERVVCBkb2VzIG5vdCBzdXBwb3J0IEFWUkNQIGNvbnRyb2xsZXIgcm9sZSIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgY2hhciogc3RhdHVzID0gKHBfcmVtb3RlX3JzcC0+a2V5X3N0YXRlID09IDEpID8gInJlbGVhc2VkIiA6ICJwcmVzc2VkIjsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJjX2lkOiAlZCBzdGF0ZTogJXMiLCBfX2Z1bmNfXywgcF9yZW1vdGVfcnNwLT5yY19pZCwKLSAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotCi0gIHJlbGVhc2VfdHJhbnNhY3Rpb24ocF9kZXYsIHBfcmVtb3RlX3JzcC0+bGFiZWwpOwotICBpZiAoYnRfcmNfY3RybF9jYWxsYmFja3MgIT0gTlVMTCkgewotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGFzc3Rocm91Z2hfcnNwX2NiLCBwX2Rldi0+cmNfYWRkciwKLSAgICAgICAgICAgICAgICAgICBwX3JlbW90ZV9yc3AtPnJjX2lkLCBwX3JlbW90ZV9yc3AtPmtleV9zdGF0ZSkpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiAgICAgICBoYW5kbGVfcmNfdmVuZG9ydW5pcXVlX3JzcAotICoKLSAqICAtIEFyZ3VtZW50OiAgICB0QlRBX0FWX1JFTU9URV9SU1AgIGNvbW1hbmQgcmVzcG9uc2UKLSAqCi0gKiAgLSBEZXNjcmlwdGlvbjogUmVtb3RlIGNvbnRyb2wgdmVuZG9yIHVuaXF1ZSByZXNwb25zZSBoYW5kbGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaGFuZGxlX3JjX3ZlbmRvcnVuaXF1ZV9yc3AodEJUQV9BVl9SRU1PVEVfUlNQKiBwX3JlbW90ZV9yc3ApIHsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBOVUxMOwotICBjb25zdCBjaGFyKiBzdGF0dXM7Ci0gIHVpbnQ4X3QgdmVuZG9yX2lkID0gMDsKLQotICBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocF9yZW1vdGVfcnNwLT5yY19oYW5kbGUpOwotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBHb3QgdmVuZG9ydW5pcXVlIHJzcCBmcm9tIGludmFsaWQgcmMgaGFuZGxlIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfUkNURykgewotICAgIGludCBrZXlfc3RhdGU7Ci0gICAgaWYgKHBfcmVtb3RlX3JzcC0+a2V5X3N0YXRlID09IEFWUkNfU1RBVEVfUkVMRUFTRSkgewotICAgICAgc3RhdHVzID0gInJlbGVhc2VkIjsKLSAgICAgIGtleV9zdGF0ZSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXR1cyA9ICJwcmVzc2VkIjsKLSAgICAgIGtleV9zdGF0ZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHBfcmVtb3RlX3JzcC0+bGVuID4gMCkgewotICAgICAgaWYgKHBfcmVtb3RlX3JzcC0+bGVuID49IEFWUkNfUEFTU19USFJVX0dST1VQX0xFTikKLSAgICAgICAgdmVuZG9yX2lkID0gcF9yZW1vdGVfcnNwLT5wX2RhdGFbQVZSQ19QQVNTX1RIUlVfR1JPVVBfTEVOIC0gMV07Ci0gICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9yZW1vdGVfcnNwLT5wX2RhdGEpOwotICAgIH0KLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogdmVuZG9yX2lkOiAlZCBzdGF0dXM6ICVzIiwgX19mdW5jX18sIHZlbmRvcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0KLSAgICByZWxlYXNlX3RyYW5zYWN0aW9uKHBfZGV2LCBwX3JlbW90ZV9yc3AtPmxhYmVsKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPmdyb3VwbmF2aWdhdGlvbl9yc3BfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcl9pZCwga2V5X3N0YXRlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFJlbW90ZSBkb2VzIG5vdCBzdXBwb3J0IEFWUkNQIFRHIHJvbGUiLCBfX2Z1bmNfXyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uICAgICAgIGhhbmRsZV9yY19tZXRhbXNnX2NtZAotICoKLSAqICAtIEFyZ3VtZW50OiAgICB0QlRBX0FWX1ZFTkRPUiBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhbXNnIGNvbW1hbmQKLSAqCi0gKiAgLSBEZXNjcmlwdGlvbjogUmVtb3RlIGNvbnRyb2wgbWV0YW1zZyBjb21tYW5kIGhhbmRsZXIgKEFWUkNQIDEuMykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBoYW5kbGVfcmNfbWV0YW1zZ19jbWQodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnKSB7Ci0gIC8qIFBhcnNlIHRoZSBtZXRhbXNnIGNvbW1hbmQgYW5kIHBhc3MgaXQgb24gdG8gQlRMLUlGUyAqLwotICB1aW50OF90IHNjcmF0Y2hfYnVmWzUxMl0gPSB7MH07Ci0gIHRBVlJDX0NPTU1BTkQgYXZyY19jb21tYW5kID0gezB9OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IE5VTEw7Ci0KLSAgaWYgKE5VTEwgPT0gcG1ldGFfbXNnKSB7Ci0gICAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IEV4aXRpbmcgYXMgcG1ldGFfbXNnIGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKE5VTEwgPT0gcG1ldGFfbXNnLT5wX21zZykgewotICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBFeGl0aW5nIGFzIHBtZXRhX21zZy0+cF9tc2cgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcG1ldGFfbXNnOiBvcGNvZGU6ICV4LCBjb2RlOiAleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBtZXRhX21zZy0+cF9tc2ctPmhkci5vcGNvZGUsIHBtZXRhX21zZy0+Y29kZSk7Ci0KLSAgcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBtZXRhX21zZy0+cmNfaGFuZGxlKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogTWV0YSBtc2cgZXZlbnQgZm9yIEludmFsaWQgcmMgaGFuZGxlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlICE9IEFWUkNfT1BfVkVORE9SICYmCi0gICAgICBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlICE9IEFWUkNfT1BfQlJPV1NFKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJJbnZhbGlkIG9wY29kZTogJXgiLCBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocG1ldGFfbXNnLT5sZW4gPCAzKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogSW52YWxpZCBsZW5ndGguIG9wY29kZTogMHgleCwgbGVuOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBtZXRhX21zZy0+cF9tc2ctPmhkci5vcGNvZGUsIHBtZXRhX21zZy0+bGVuKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocG1ldGFfbXNnLT5jb2RlID49IEFWUkNfUlNQX05PVF9JTVBMKSB7Ci0gICAgewotICAgICAgcmNfdHJhbnNhY3Rpb25fdCogdHJhbnNhY3Rpb24gPSBOVUxMOwotICAgICAgdHJhbnNhY3Rpb24gPSBnZXRfdHJhbnNhY3Rpb25fYnlfbGJsKHBfZGV2LCBwbWV0YV9tc2ctPmxhYmVsKTsKLSAgICAgIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgIGhhbmRsZV9yY19tZXRhbXNnX3JzcChwbWV0YV9tc2csIHBfZGV2KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiJXM6IERpc2NhcmQgdmVuZG9yIGRlcGVuZGVudCByc3AuIGNvZGU6ICVkIGxhYmVsOiAlZC4iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgIHBtZXRhX21zZy0+Y29kZSwgcG1ldGFfbXNnLT5sYWJlbCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgc3RhdHVzID0gQVZSQ19QYXJzQ29tbWFuZChwbWV0YV9tc2ctPnBfbXNnLCAmYXZyY19jb21tYW5kLCBzY3JhdGNoX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NyYXRjaF9idWYpKTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFJlY2VpdmVkIHZlbmRvciBjb21tYW5kLmNvZGUsUERVIGFuZCBsYWJlbDogJWQsICVkLCAlZCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBtZXRhX21zZy0+Y29kZSwgYXZyY19jb21tYW5kLmNtZC5wZHUsCi0gICAgICAgICAgICAgICAgICAgcG1ldGFfbXNnLT5sYWJlbCk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIC8qIHJldHVybiBlcnJvciAqLwotICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIiVzOiBFcnJvciBpbiBwYXJzaW5nIHJlY2VpdmVkIG1ldGFtc2cgY29tbWFuZC4gc3RhdHVzOiAweCUwMngiLAotICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICBzZW5kX3JlamVjdF9yZXNwb25zZShwbWV0YV9tc2ctPnJjX2hhbmRsZSwgcG1ldGFfbXNnLT5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdnJjX2NvbW1hbmQucGR1LCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcG1ldGFfbXNnLT5wX21zZy0+aGRyLm9wY29kZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogaWYgUmVnaXN0ZXJOb3RpZmljYXRpb24sIGFkZCBpdCB0byBvdXIgcmVnaXN0ZXJlZCBxdWV1ZSAqLwotCi0gICAgaWYgKGF2cmNfY29tbWFuZC5jbWQucGR1ID09IEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTikgewotICAgICAgdWludDhfdCBldmVudF9pZCA9IGF2cmNfY29tbWFuZC5yZWdfbm90aWYuZXZlbnRfaWQ7Ci0KLSAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgIiVzOiBOZXcgcmVnaXN0ZXIgbm90aWZpY2F0aW9uIHJlY2VpdmVkLmV2ZW50X2lkOiAlcywgbGFiZWw6IDB4JXgsICIKLSAgICAgICAgICAiY29kZTogJXgiLAotICAgICAgICAgIF9fZnVuY19fLCBkdW1wX3JjX25vdGlmaWNhdGlvbl9ldmVudF9pZChldmVudF9pZCksIHBtZXRhX21zZy0+bGFiZWwsCi0gICAgICAgICAgcG1ldGFfbXNnLT5jb2RlKTsKLSAgICAgIHBfZGV2LT5yY19ub3RpZltldmVudF9pZCAtIDFdLmJOb3RpZnkgPSB0cnVlOwotICAgICAgcF9kZXYtPnJjX25vdGlmW2V2ZW50X2lkIC0gMV0ubGFiZWwgPSBwbWV0YV9tc2ctPmxhYmVsOwotICAgIH0KLQotICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBQYXNzaW5nIHJlY2VpdmVkIG1ldGFtc2cgY29tbWFuZCB0byBhcHAuIHBkdTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGR1bXBfcmNfcGR1KGF2cmNfY29tbWFuZC5jbWQucGR1KSk7Ci0KLSAgICAvKiBTaW5jZSBoYW5kbGVfcmNfbWV0YW1zZ19jbWQoKSBpdHNlbGYgaXMgY2FsbGVkIGZyb20KLSAgICAgICAgKmJ0aWYgY29udGV4dCwgbm8gY29udGV4dCBzd2l0Y2hpbmcgaXMgcmVxdWlyZWQuIEludm9rZQotICAgICAgICAqIGJ0aWZfcmNfdXBzdHJlYW1zX2V2dCBkaXJlY3RseSBmcm9tIGhlcmUuICovCi0gICAgYnRpZl9yY191cHN0cmVhbXNfZXZ0KCh1aW50MTZfdClhdnJjX2NvbW1hbmQuY21kLnBkdSwgJmF2cmNfY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcG1ldGFfbXNnLT5jb2RlLCBwbWV0YV9tc2ctPmxhYmVsLCBwX2Rldik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqCi0gKiogRnVuY3Rpb24gICAgICAgYnRpZl9yY19oYW5kbGVyCi0gKioKLSAqKiBEZXNjcmlwdGlvbiAgICBSQyBldmVudCBoYW5kbGVyCi0gKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfcmNfaGFuZGxlcih0QlRBX0FWX0VWVCBldmVudCwgdEJUQV9BViogcF9kYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBldmVudDogJXMiLCBfX2Z1bmNfXywgZHVtcF9yY19ldmVudChldmVudCkpOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IE5VTEw7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9BVl9SQ19PUEVOX0VWVDogewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXJfZmVhdHVyZXM6IDB4JXggQ292ZXIgQXJ0IFBTTTogMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnJjX29wZW4ucGVlcl9mZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5yY19vcGVuLmNvdmVyX2FydF9wc20pOwotICAgICAgaGFuZGxlX3JjX2Nvbm5lY3QoJihwX2RhdGEtPnJjX29wZW4pKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfUkNfQlJPV1NFX09QRU5fRVZUOiB7Ci0gICAgICAvKiB0ZWxsIHRoZSBVTCB0aGF0IHdlIGhhdmUgY29ubmVjdGlvbiB0byBicm93c2UgY2hhbm5lbCBhbmQgdGhhdAotICAgICAgICogYnJvd3NlIGNvbW1hbmRzIGNhbiBiZSBkaXJlY3RlZCBhY2NvcmRpbmdseS4gKi8KLSAgICAgIGhhbmRsZV9yY19icm93c2VfY29ubmVjdCgmcF9kYXRhLT5yY19icm93c2Vfb3Blbik7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1JDX0NMT1NFX0VWVDogewotICAgICAgaGFuZGxlX3JjX2Rpc2Nvbm5lY3QoJihwX2RhdGEtPnJjX2Nsb3NlKSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1JDX0JST1dTRV9DTE9TRV9FVlQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBCVEFfQVZfUkNfQlJPV1NFX0NMT1NFX0VWVCIsIF9fZnVuY19fKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfUkVNT1RFX0NNRF9FVlQ6IHsKLSAgICAgIGlmIChidF9yY19jYWxsYmFja3MgIT0gTlVMTCkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmNfaWQ6IDB4JXgga2V5X3N0YXRlOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVtb3RlX2NtZC5yY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnJlbW90ZV9jbWQua2V5X3N0YXRlKTsKLSAgICAgICAgaGFuZGxlX3JjX3Bhc3N0aHJvdWdoX2NtZCgoJnBfZGF0YS0+cmVtb3RlX2NtZCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEFWUkNQIFRHIHJvbGUgbm90IHVwLCBkcm9wIHBhc3N0aHJvdWdoIGNvbW1hbmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FWX1JFTU9URV9SU1BfRVZUOiB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUlNQOiByY19pZDogMHgleCBrZXlfc3RhdGU6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+cmVtb3RlX3JzcC5yY19pZCwgcF9kYXRhLT5yZW1vdGVfcnNwLmtleV9zdGF0ZSk7Ci0KLSAgICAgIGlmIChwX2RhdGEtPnJlbW90ZV9yc3AucmNfaWQgPT0gQVZSQ19JRF9WRU5ET1IpIHsKLSAgICAgICAgaGFuZGxlX3JjX3ZlbmRvcnVuaXF1ZV9yc3AoKCZwX2RhdGEtPnJlbW90ZV9yc3ApKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhbmRsZV9yY19wYXNzdGhyb3VnaF9yc3AoKCZwX2RhdGEtPnJlbW90ZV9yc3ApKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfUkNfRkVBVF9FVlQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyX2ZlYXR1cmVzOiAleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnJjX2ZlYXQucGVlcl9mZWF0dXJlcyk7Ci0gICAgICBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocF9kYXRhLT5yY19mZWF0LnJjX2hhbmRsZSk7Ci0gICAgICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogUkMgRmVhdHVyZSBldmVudCBmb3IgSW52YWxpZCByYyBoYW5kbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHBfZGV2LT5yY19mZWF0dXJlcyA9IHBfZGF0YS0+cmNfZmVhdC5wZWVyX2ZlYXR1cmVzOwotICAgICAgaWYgKGJ0X3JjX2NhbGxiYWNrcyAhPSBOVUxMKSB7Ci0gICAgICAgIGhhbmRsZV9yY19mZWF0dXJlcyhwX2Rldik7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgocF9kZXYtPnJjX2Nvbm5lY3RlZCkgJiYgKGJ0X3JjX2N0cmxfY2FsbGJhY2tzICE9IE5VTEwpKSB7Ci0gICAgICAgIGhhbmRsZV9yY19jdHJsX2ZlYXR1cmVzKHBfZGV2KTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQVZfUkNfUFNNX0VWVDogewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgY292ZXIgYXJ0IFBTTTogJXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5yY19jb3Zlcl9hcnRfcHNtLmNvdmVyX2FydF9wc20pOwotICAgICAgcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBfZGF0YS0+cmNfY292ZXJfYXJ0X3BzbS5yY19oYW5kbGUpOwotICAgICAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFJDIFBTTSBldmVudCBmb3IgSW52YWxpZCByYyBoYW5kbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHBfZGV2LT5yY19jb3Zlcl9hcnRfcHNtID0gcF9kYXRhLT5yY19jb3Zlcl9hcnRfcHNtLmNvdmVyX2FydF9wc207Ci0gICAgICBpZiAoKHBfZGV2LT5yY19jb25uZWN0ZWQpICYmIChidF9yY19jdHJsX2NhbGxiYWNrcyAhPSBOVUxMKSkgewotICAgICAgICBoYW5kbGVfcmNfY3RybF9wc20ocF9kZXYpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BVl9NRVRBX01TR19FVlQ6IHsKLSAgICAgIGlmIChidF9yY19jYWxsYmFja3MgIT0gTlVMTCkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQlRBX0FWX01FVEFfTVNHX0VWVCBjb2RlOiAlZCBsYWJlbDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm1ldGFfbXNnLmNvZGUsIHBfZGF0YS0+bWV0YV9tc2cubGFiZWwpOwotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY29tcGFueV9pZDogMHgleCBsZW46ICVkIGhhbmRsZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm1ldGFfbXNnLmNvbXBhbnlfaWQsIHBfZGF0YS0+bWV0YV9tc2cubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bWV0YV9tc2cucmNfaGFuZGxlKTsKLQotICAgICAgICAvKiBoYW5kbGUgdGhlIG1ldGFtc2cgY29tbWFuZCAqLwotICAgICAgICBoYW5kbGVfcmNfbWV0YW1zZ19jbWQoJihwX2RhdGEtPm1ldGFfbXNnKSk7Ci0KLSAgICAgICAgLyogRnJlZSB0aGUgTWVtb3J5IGFsbG9jYXRlZCBmb3IgdEFWUkNfTVNHICovCi0gICAgICB9IGVsc2UgaWYgKGJ0X3JjX2N0cmxfY2FsbGJhY2tzICE9IE5VTEwpIHsKLSAgICAgICAgLyogVGhpcyBpcyBjYXNlIG9mIFNpbmsgKyBDVCArIFRHKGZvciBhYnMgdm9sKSkgKi8KLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICIlcyBCVEFfQVZfTUVUQV9NU0dfRVZUIGNvZGU6JWQgbGFiZWw6JWQgb3Bjb2RlICVkIGN0eXBlICVkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwX2RhdGEtPm1ldGFfbXNnLmNvZGUsIHBfZGF0YS0+bWV0YV9tc2cubGFiZWwsCi0gICAgICAgICAgICBwX2RhdGEtPm1ldGFfbXNnLnBfbXNnLT5oZHIub3Bjb2RlLAotICAgICAgICAgICAgcF9kYXRhLT5tZXRhX21zZy5wX21zZy0+aGRyLmN0eXBlKTsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgY29tcGFueV9pZDoweCV4IGxlbjolZCBoYW5kbGU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm1ldGFfbXNnLmNvbXBhbnlfaWQsIHBfZGF0YS0+bWV0YV9tc2cubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bWV0YV9tc2cucmNfaGFuZGxlKTsKLSAgICAgICAgc3dpdGNoIChwX2RhdGEtPm1ldGFfbXNnLnBfbXNnLT5oZHIub3Bjb2RlKSB7Ci0gICAgICAgICAgY2FzZSBBVlJDX09QX1ZFTkRPUjoKLSAgICAgICAgICAgIGlmICgocF9kYXRhLT5tZXRhX21zZy5jb2RlID49IEFWUkNfUlNQX05PVF9JTVBMKSAmJgotICAgICAgICAgICAgICAgIChwX2RhdGEtPm1ldGFfbXNnLmNvZGUgPD0gQVZSQ19SU1BfSU5URVJJTSkpIHsKLSAgICAgICAgICAgICAgLyogSXRzIGEgcmVzcG9uc2UgKi8KLSAgICAgICAgICAgICAgaGFuZGxlX2F2a19yY19tZXRhbXNnX3JzcCgmKHBfZGF0YS0+bWV0YV9tc2cpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocF9kYXRhLT5tZXRhX21zZy5jb2RlIDw9IEFWUkNfQ01EX0dFTl9JTlEpIHsKLSAgICAgICAgICAgICAgLyogSXRzIGEgY29tbWFuZCAgKi8KLSAgICAgICAgICAgICAgaGFuZGxlX2F2a19yY19tZXRhbXNnX2NtZCgmKHBfZGF0YS0+bWV0YV9tc2cpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBBVlJDX09QX0JST1dTRToKLSAgICAgICAgICAgIGlmIChwX2RhdGEtPm1ldGFfbXNnLnBfbXNnLT5oZHIuY3R5cGUgPT0gQVZSQ19DTUQpIHsKLSAgICAgICAgICAgICAgaGFuZGxlX2F2a19yY19tZXRhbXNnX2NtZCgmKHBfZGF0YS0+bWV0YV9tc2cpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocF9kYXRhLT5tZXRhX21zZy5wX21zZy0+aGRyLmN0eXBlID09IEFWUkNfUlNQKSB7Ci0gICAgICAgICAgICAgIGhhbmRsZV9hdmtfcmNfbWV0YW1zZ19yc3AoJihwX2RhdGEtPm1ldGFfbXNnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiTmVpdGhlciBDVFJMLCBub3IgVEcgaXMgdXAsIGRyb3AgbWV0YSBjb21tYW5kcyIpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFVuaGFuZGxlZCBSQyBldmVudCA6IDB4JXgiLCBfX2Z1bmNfXywgZXZlbnQpOwotICB9Ci19Ci0KLWJvb2wgYnRpZl9yY19pc19jb25uZWN0ZWRfcGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgQlRJRl9SQ19OVU1fQ09OTjsgaWR4KyspIHsKLSAgICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGdldF9jb25uZWN0ZWRfZGV2aWNlKGlkeCk7Ci0gICAgaWYgKHBfZGV2ICE9IE5VTEwgJiYgKHBfZGV2LT5yY19jb25uZWN0ZWQgPT0gVFJVRSkgJiYKLSAgICAgICAgcGVlcl9hZGRyID09IHBfZGV2LT5yY19hZGRyKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioKLSAqKiBGdW5jdGlvbiAgICAgICBidGlmX3JjX2dldF9jb25uZWN0ZWRfcGVlcl9oYW5kbGUKLSAqKgotICoqIERlc2NyaXB0aW9uICAgIEZldGNoZXMgdGhlIGNvbm5lY3RlZCBoZWFkc2V0J3MgaGFuZGxlIGlmIGFueQotICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBidGlmX3JjX2dldF9jb25uZWN0ZWRfcGVlcl9oYW5kbGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gTlVMTDsKLSAgcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKHBlZXJfYWRkcik7Ci0KLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXYgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRSQ19IQU5ETEVfTk9ORTsKLSAgfQotICByZXR1cm4gcF9kZXYtPnJjX2hhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqCi0gKiogRnVuY3Rpb24gICAgICAgYnRpZl9yY19jaGVja19oYW5kbGVfcGVuZGluZ19wbGF5Ci0gKioKLSAqKiBEZXNjcmlwdGlvbiAgICBDbGVhcnMgdGhlIHF1ZXVlZCBQTEFZIGNvbW1hbmQuIGlmIHxiU2VuZFRvQXBwfCBpcyB0cnVlLAotICoqICAgICAgICAgICAgICAgIGZvcndhcmRzIHRvIGFwcAotICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBjbGVhciB0aGUgcXVldWVkIFBMQVkgY29tbWFuZC4gaWYgfGJTZW5kVG9BcHB8IGlzIHRydWUsIGZvcndhcmQgdG8gYXBwICovCi12b2lkIGJ0aWZfcmNfY2hlY2tfaGFuZGxlX3BlbmRpbmdfcGxheShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZW5kVG9BcHApIHsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBOVUxMOwotICBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEocGVlcl9hZGRyKTsKLQotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBwX2RldiBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBiU2VuZFRvQXBwOiAlZCIsIF9fZnVuY19fLCBiU2VuZFRvQXBwKTsKLSAgaWYgKHBfZGV2LT5yY19wZW5kaW5nX3BsYXkpIHsKLSAgICBpZiAoYlNlbmRUb0FwcCkgewotICAgICAgdEJUQV9BVl9SRU1PVEVfQ01EIHJlbW90ZV9jbWQ7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU2VuZGluZyBxdWV1ZWQgUExBWUVEIGV2ZW50IHRvIGFwcCIsIF9fZnVuY19fKTsKLQotICAgICAgbWVtc2V0KCZyZW1vdGVfY21kLCAwLCBzaXplb2YodEJUQV9BVl9SRU1PVEVfQ01EKSk7Ci0gICAgICByZW1vdGVfY21kLnJjX2hhbmRsZSA9IHBfZGV2LT5yY19oYW5kbGU7Ci0gICAgICByZW1vdGVfY21kLnJjX2lkID0gQVZSQ19JRF9QTEFZOwotICAgICAgcmVtb3RlX2NtZC5oZHIuY3R5cGUgPSBBVlJDX0NNRF9DVFJMOwotICAgICAgcmVtb3RlX2NtZC5oZHIub3Bjb2RlID0gQVZSQ19PUF9QQVNTX1RIUlU7Ci0KLSAgICAgIC8qIGRlbGF5IHNlbmRpbmcgdG8gYXBwLCBlbHNlIHRoZXJlIGlzIGEgdGltaW5nIGlzc3VlIGluIHRoZSBmcmFtZXdvcmssCi0gICAgICAgKiogd2hpY2ggY2F1c2VzIHRoZSBhdWRpbyB0byBiZSBvbiB0aCBkZXZpY2UncyBzcGVha2VyLiBEZWxheSBiZXR3ZWVuCi0gICAgICAgKiogT1BFTiAmIFJDX1BMQVlzCi0gICAgICAqLwotICAgICAgc2xlZXBfbXMoMjAwKTsKLSAgICAgIC8qIHNlbmQgdG8gYXBwIC0gYm90aCBQUkVTU0VEICYgUkVMRUFTRUQgKi8KLSAgICAgIHJlbW90ZV9jbWQua2V5X3N0YXRlID0gQVZSQ19TVEFURV9QUkVTUzsKLSAgICAgIGhhbmRsZV9yY19wYXNzdGhyb3VnaF9jbWQoJnJlbW90ZV9jbWQpOwotCi0gICAgICBzbGVlcF9tcygxMDApOwotCi0gICAgICByZW1vdGVfY21kLmtleV9zdGF0ZSA9IEFWUkNfU1RBVEVfUkVMRUFTRTsKLSAgICAgIGhhbmRsZV9yY19wYXNzdGhyb3VnaF9jbWQoJnJlbW90ZV9jbWQpOwotICAgIH0KLSAgICBwX2Rldi0+cmNfcGVuZGluZ19wbGF5ID0gZmFsc2U7Ci0gIH0KLX0KLQotLyogR2VuZXJpYyByZWplY3QgcmVzcG9uc2UgKi8KLXN0YXRpYyB2b2lkIHNlbmRfcmVqZWN0X3Jlc3BvbnNlKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IHBkdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IG9wY29kZSkgewotICB1aW50OF90IGN0eXBlID0gQVZSQ19SU1BfUkVKOwotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgQlRfSERSKiBwX21zZyA9IE5VTEw7Ci0gIG1lbXNldCgmYXZyY19yc3AsIDAsIHNpemVvZih0QVZSQ19SRVNQT05TRSkpOwotCi0gIGF2cmNfcnNwLnJzcC5vcGNvZGUgPSBvcGNvZGU7Ci0gIGF2cmNfcnNwLnJzcC5wZHUgPSBwZHU7Ci0gIGF2cmNfcnNwLnJzcC5zdGF0dXMgPSBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gQVZSQ19CbGRSZXNwb25zZShyY19oYW5kbGUsICZhdnJjX3JzcCwgJnBfbXNnKTsKLQotICBpZiAoc3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHN0YXR1cyBub3QgQVZSQ19TVFNfTk9fRVJST1IiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICIlczogU2VuZGluZyBlcnJvciBub3RpZmljYXRpb24gdG8gaGFuZGxlOiAlZC4gcGR1OiAlcyxzdGF0dXM6IDB4JTAyeCIsCi0gICAgICBfX2Z1bmNfXywgcmNfaGFuZGxlLCBkdW1wX3JjX3BkdShwZHUpLCBzdGF0dXMpOwotICBCVEFfQXZNZXRhUnNwKHJjX2hhbmRsZSwgbGFiZWwsIGN0eXBlLCBwX21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiAgICAgICAgIGdldF9yc3BfdHlwZV9jb2RlCi0gKgotICogIC0gQXJndW1lbnQ6ICAgc3RhdHVzCi0gKiAgLSBEZXNjcmlwdGlvbjogUmV0dXJucyByZXNwb25zZSB0eXBlIGNvZGVzIGZvciBwYXJ0aWN1bGFyIGNvbW1hbmQgY29kZSBhbmQKLSAqICAgICAgICAgICAgICAgICBzdGF0dXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRBX0FWX0NPREUgZ2V0X3JzcF90eXBlX2NvZGUodEFWUkNfU1RTIHN0YXR1cywgdEJUQV9BVl9DT0RFIGNvZGUpIHsKLSAgaWYgKHN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIHJldHVybiBBVlJDX1JTUF9SRUo7Ci0gIH0KLQotICBpZiAoY29kZSA8IEFWUkNfUlNQX05PVF9JTVBMKSB7Ci0gICAgaWYgKGNvZGUgPT0gQVZSQ19DTURfTk9USUYpIHJldHVybiBBVlJDX1JTUF9JTlRFUklNOwotCi0gICAgaWYgKGNvZGUgPT0gQVZSQ19DTURfU1RBVFVTKSByZXR1cm4gQVZSQ19SU1BfSU1QTF9TVEJMOwotCi0gICAgcmV0dXJuIEFWUkNfUlNQX0FDQ0VQVDsKLSAgfQotCi0gIHJldHVybiBjb2RlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb24gICAgICAgc2VuZF9tZXRhbXNnX3JzcAotICoKLSAqICAtIEFyZ3VtZW50OgotICogICAgICAgICAgICAgICAgICBwX2RldiAgICAgICAgICAgRGV2IHBvaW50ZXIKLSAqICAgICAgICAgICAgICAgICAgaW5kZXggICAgICAgICAgIENvbW1hbmQgaW5kZXggKD0gLTEgaWYgbm90IHVzZWQpCi0gKiAgICAgICAgICAgICAgICAgIGxhYmVsICAgICAgICAgICBMYWJlbCBvZiB0aGUgUkMgcmVzcG9uc2UKLSAqICAgICAgICAgICAgICAgICAgY29kZSAgICAgICAgICAgIFJlc3BvbnNlIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgcG1ldGFtc2dfcmVzcCAgIFZlbmRvciByZXNwb25zZQotICoKLSAqICAtIERlc2NyaXB0aW9uOiBSZW1vdGUgY29udHJvbCBtZXRhbXNnIHJlc3BvbnNlIGhhbmRsZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2VuZF9tZXRhbXNnX3JzcChidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfUkVTUE9OU0UqIHBtZXRhbXNnX3Jlc3ApIHsKLSAgdWludDhfdCBjdHlwZTsKLQotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBwX2RldiBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwbWV0YW1zZ19yZXNwID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBJbnZhbGlkIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRJRl9UUkFDRV9FVkVOVCgKLSAgICAgICIlczogcmNfaGFuZGxlOiAlZCwgaW5kZXg6ICVkLCBsYWJlbDogJWQsIGNvZGU6IDB4JTAyeCwgcGR1OiAlcyIsCi0gICAgICBfX2Z1bmNfXywgcF9kZXYtPnJjX2hhbmRsZSwgaW5kZXgsIGxhYmVsLCBjb2RlLAotICAgICAgZHVtcF9yY19wZHUocG1ldGFtc2dfcmVzcC0+cnNwLnBkdSkpOwotCi0gIGlmIChpbmRleCA+PSAwICYmICFwX2Rldi0+cmNfcGR1X2luZm9baW5kZXhdLmlzX3JzcF9wZW5kaW5nKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGlzX3JzcF9wZW5kaW5nIGZhbHNlLCByZXR1cm5pbmciLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY3R5cGUgPSBnZXRfcnNwX3R5cGVfY29kZShwbWV0YW1zZ19yZXNwLT5yc3Auc3RhdHVzLCBjb2RlKTsKLQotICAvKiBpZiByZXNwb25zZSBpcyBmb3IgcmVnaXN0ZXJfbm90aWZpY2F0aW9uLCBtYWtlIHN1cmUgdGhlIHJjIGhhcwotICBhY3R1YWxseSByZWdpc3RlcmVkIGZvciB0aGlzICovCi0gIGlmICgocG1ldGFtc2dfcmVzcC0+cnNwLnBkdSA9PSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT04pICYmCi0gICAgICAoKGNvZGUgPT0gQVZSQ19SU1BfQ0hBTkdFRCkgfHwgKGNvZGUgPT0gQVZSQ19SU1BfSU5URVJJTSkpKSB7Ci0gICAgYm9vbCBiU2VudCA9IGZhbHNlOwotICAgIHVpbnQ4X3QgZXZlbnRfaWQgPSBwbWV0YW1zZ19yZXNwLT5yZWdfbm90aWYuZXZlbnRfaWQ7Ci0gICAgYm9vbCBiTm90aWZ5ID0KLSAgICAgICAgKHBfZGV2LT5yY19jb25uZWN0ZWQpICYmIChwX2Rldi0+cmNfbm90aWZbZXZlbnRfaWQgLSAxXS5iTm90aWZ5KTsKLQotICAgIC8qIGRlLXJlZ2lzdGVyIHRoaXMgbm90aWZpY2F0aW9uIGZvciBhIENIQU5HRUQgcmVzcG9uc2UgKi8KLSAgICBwX2Rldi0+cmNfbm90aWZbZXZlbnRfaWQgLSAxXS5iTm90aWZ5ID0gZmFsc2U7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJjX2hhbmRsZTogJWQuIGV2ZW50X2lkOiAweCUwMmQgYk5vdGlmeTogJXUiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfZGV2LT5yY19oYW5kbGUsIGV2ZW50X2lkLCBiTm90aWZ5KTsKLSAgICBpZiAoYk5vdGlmeSkgewotICAgICAgQlRfSERSKiBwX21zZyA9IE5VTEw7Ci0gICAgICB0QVZSQ19TVFMgc3RhdHVzOwotCi0gICAgICBpZiAoQVZSQ19TVFNfTk9fRVJST1IgPT0gKHN0YXR1cyA9IEFWUkNfQmxkUmVzcG9uc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfaGFuZGxlLCBwbWV0YW1zZ19yZXNwLCAmcF9tc2cpKSkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIiVzOiBTZW5kaW5nIG5vdGlmaWNhdGlvbiB0byByY19oYW5kbGU6ICVkLiBldmVudF9pZDogMHglMDJkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwX2Rldi0+cmNfaGFuZGxlLCBldmVudF9pZCk7Ci0gICAgICAgIGJTZW50ID0gdHJ1ZTsKLSAgICAgICAgQlRBX0F2TWV0YVJzcChwX2Rldi0+cmNfaGFuZGxlLCBwX2Rldi0+cmNfbm90aWZbZXZlbnRfaWQgLSAxXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICBjdHlwZSwgcF9tc2cpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gYnVpbGQgbWV0YW1zZyByZXNwb25zZS4gc3RhdHVzOiAweCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFiU2VudCkgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiJXM6IE5vdGlmaWNhdGlvbiBub3Qgc2VudCwgYXMgdGhlcmUgYXJlIG5vIFJDIGNvbm5lY3Rpb25zIG9yIHRoZSBcCi0gICAgICAgICAgICAgICAgQ1QgaGFzIG5vdCBzdWJzY3JpYmVkIGZvciBldmVudF9pZDogJXMiLAotICAgICAgICAgIF9fZnVuY19fLCBkdW1wX3JjX25vdGlmaWNhdGlvbl9ldmVudF9pZChldmVudF9pZCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBBbGwgb3RoZXIgY29tbWFuZHMgZ28gaGVyZSAqLwotCi0gICAgQlRfSERSKiBwX21zZyA9IE5VTEw7Ci0gICAgdEFWUkNfU1RTIHN0YXR1czsKLQotICAgIHN0YXR1cyA9IEFWUkNfQmxkUmVzcG9uc2UocF9kZXYtPnJjX2hhbmRsZSwgcG1ldGFtc2dfcmVzcCwgJnBfbXNnKTsKLQotICAgIGlmIChzdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICAgIEJUQV9Bdk1ldGFSc3AocF9kZXYtPnJjX2hhbmRsZSwgbGFiZWwsIGN0eXBlLCBwX21zZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBmYWlsZWQgdG8gYnVpbGQgbWV0YW1zZyByZXNwb25zZS4gc3RhdHVzOiAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoaW5kZXggPj0gMCkgewotICAgIHBfZGV2LT5yY19wZHVfaW5mb1tpbmRleF0uY3R5cGUgPSAwOwotICAgIHBfZGV2LT5yY19wZHVfaW5mb1tpbmRleF0ubGFiZWwgPSAwOwotICAgIHBfZGV2LT5yY19wZHVfaW5mb1tpbmRleF0uaXNfcnNwX3BlbmRpbmcgPSBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgdWludDhfdCBvcGNvZGVfZnJvbV9wZHUodWludDhfdCBwZHUpIHsKLSAgdWludDhfdCBvcGNvZGUgPSAwOwotCi0gIHN3aXRjaCAocGR1KSB7Ci0gICAgY2FzZSBBVlJDX1BEVV9TRVRfQlJPV1NFRF9QTEFZRVI6Ci0gICAgY2FzZSBBVlJDX1BEVV9HRVRfRk9MREVSX0lURU1TOgotICAgIGNhc2UgQVZSQ19QRFVfQ0hBTkdFX1BBVEg6Ci0gICAgY2FzZSBBVlJDX1BEVV9HRVRfSVRFTV9BVFRSSUJVVEVTOgotICAgIGNhc2UgQVZSQ19QRFVfQUREX1RPX05PV19QTEFZSU5HOgotICAgIGNhc2UgQVZSQ19QRFVfU0VBUkNIOgotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1RPVEFMX05VTV9PRl9JVEVNUzoKLSAgICBjYXNlIEFWUkNfUERVX0dFTkVSQUxfUkVKRUNUOgotICAgICAgb3Bjb2RlID0gQVZSQ19PUF9CUk9XU0U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfTkVYVF9HUk9VUDoKLSAgICBjYXNlIEFWUkNfUERVX1BSRVZfR1JPVVA6IC8qIHBhc3MgdGhydSAqLwotICAgICAgb3Bjb2RlID0gQVZSQ19PUF9QQVNTX1RIUlU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6IC8qIHZlbmRvciAqLwotICAgICAgb3Bjb2RlID0gQVZSQ19PUF9WRU5ET1I7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBvcGNvZGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uOiAgZmlsbF9hdHRyaWJ1dGVfaWRfYXJyYXkKLSAqCi0gKiAtIEFyZ3VtZW50OgotICogICAgIGNtZF9hdHRyaWJ1dGVfbnVtYmVyICAgICAgICAgaW5wdXQgYXR0cmlidXRlIG51bWJlciBmcm9tIEFWUkNQIGNvbW1hbmQKLSAqICAgICBjbWRfYXR0cmlidXRlX2lkX2FycmF5ICAgICAgIGlucHV0IGF0dHJpYnV0ZSBsaXN0IGZyb20gQVZSQ1AgY29tbWFuZAotICogICAgIG91dF9hcnJheV9zaXplICAgICAgICAgICAgICAgYWxsb2NhdGVkIHNpemUgb2Ygb3V0IGF0dHJpYnV0ZSBpZCBhcnJheQotICogICAgIG91dF9hdHRyaWJ1dGVfaWRfYXJyYXkgICAgICAgb3V0cHV0IGF0dHJpYnV0ZSBsaXN0IHJlc29sdmVkIGhlcmUKLSAqCi0gKiAtIERlc2NyaXB0aW9uOgotICogICAgIFJlc29sdmUgYXR0cmlidXRlIGlkIGFycmF5IGFzIGRlZmluZWQgYnkgdGhlIEFWUkNQIHNwZWNpZmljYXRpb24uCi0gKgotICogLSBSZXR1cm5zOgotICogICAgIFRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBmaWxsZWQgaW4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgZmlsbF9hdHRyaWJ1dGVfaWRfYXJyYXkoCi0gICAgdWludDhfdCBjbWRfYXR0cmlidXRlX251bWJlciwgY29uc3QgdWludDMyX3QqIGNtZF9hdHRyaWJ1dGVfaWRfYXJyYXksCi0gICAgc2l6ZV90IG91dF9hcnJheV9zaXplLCBidHJjX21lZGlhX2F0dHJfdCogb3V0X2F0dHJpYnV0ZV9pZF9hcnJheSkgewotICAvKiBEZWZhdWx0IGNhc2UgZm9yIGNtZF9hdHRyaWJ1dGVfbnVtYmVyID09IDB4RkYsIE5vIGF0dHJpYnV0ZSAqLwotICB1aW50OF90IG91dF9hdHRyaWJ1dGVfbnVtYmVyID0gMDsKLSAgaWYgKGNtZF9hdHRyaWJ1dGVfbnVtYmVyID09IDApIHsKLSAgICAvKiBBbGwgYXR0cmlidXRlcyAqLwotICAgIG91dF9hdHRyaWJ1dGVfbnVtYmVyID0gb3V0X2FycmF5X3NpemUgPCBBVlJDX01BWF9OVU1fTUVESUFfQVRUUl9JRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3V0X2FycmF5X3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWUkNfTUFYX05VTV9NRURJQV9BVFRSX0lEOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0X2F0dHJpYnV0ZV9udW1iZXI7IGkrKykgewotICAgICAgb3V0X2F0dHJpYnV0ZV9pZF9hcnJheVtpXSA9IChidHJjX21lZGlhX2F0dHJfdCkoaSArIDEpOwotICAgIH0KLSAgfSBlbHNlIGlmIChjbWRfYXR0cmlidXRlX251bWJlciAhPSAweEZGKSB7Ci0gICAgLyogQXR0cmlidXRlIExpc3QgKi8KLSAgICBvdXRfYXR0cmlidXRlX251bWJlciA9IDA7Ci0gICAgaW50IGZpbGxlZF9pZF9jb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IChpIDwgY21kX2F0dHJpYnV0ZV9udW1iZXIpICYmCi0gICAgICAgICAgICAgICAgICAgIChvdXRfYXR0cmlidXRlX251bWJlciA8IG91dF9hcnJheV9zaXplKSAmJgotICAgICAgICAgICAgICAgICAgICAob3V0X2F0dHJpYnV0ZV9udW1iZXIgPCBBVlJDX01BWF9OVU1fTUVESUFfQVRUUl9JRCk7Ci0gICAgICAgICBpKyspIHsKLSAgICAgIC8qIEZpbGwgb25seSB2YWxpZCBlbnRyaWVzICovCi0gICAgICBpZiAoQVZSQ19JU19WQUxJRF9NRURJQV9BVFRSSUJVVEUoY21kX2F0dHJpYnV0ZV9pZF9hcnJheVtpXSkpIHsKLSAgICAgICAgLyogU2tpcCB0aGUgZHVwbGljYXRlIGVudHJpZXMgKi8KLSAgICAgICAgZm9yIChmaWxsZWRfaWRfY291bnQgPSAwOyBmaWxsZWRfaWRfY291bnQgPCBvdXRfYXR0cmlidXRlX251bWJlcjsKLSAgICAgICAgICAgICBmaWxsZWRfaWRfY291bnQrKykgewotICAgICAgICAgIGlmIChvdXRfYXR0cmlidXRlX2lkX2FycmF5W2ZpbGxlZF9pZF9jb3VudF0gPT0KLSAgICAgICAgICAgICAgY21kX2F0dHJpYnV0ZV9pZF9hcnJheVtpXSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8qIE5ldyBJRCAqLwotICAgICAgICBpZiAoZmlsbGVkX2lkX2NvdW50ID09IG91dF9hdHRyaWJ1dGVfbnVtYmVyKSB7Ci0gICAgICAgICAgb3V0X2F0dHJpYnV0ZV9pZF9hcnJheVtvdXRfYXR0cmlidXRlX251bWJlcl0gPQotICAgICAgICAgICAgICAoYnRyY19tZWRpYV9hdHRyX3QpY21kX2F0dHJpYnV0ZV9pZF9hcnJheVtpXTsKLSAgICAgICAgICBvdXRfYXR0cmlidXRlX251bWJlcisrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBvdXRfYXR0cmlidXRlX251bWJlcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfcmNfdXBzdHJlYW1zX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXhlY3V0ZXMgQVZSQyBVUFNUUkVBTVMgZXZlbnRzIGluIGJ0aWYgY29udGV4dC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRpZl9yY191cHN0cmVhbXNfZXZ0KHVpbnQxNl90IGV2ZW50LCB0QVZSQ19DT01NQU5EKiBwYXZyY19jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjdHlwZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogcGR1OiAlcyBoYW5kbGU6IDB4JXggY3R5cGU6ICV4IGxhYmVsOiAleCBldmVudCBJRDogJXgiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkdW1wX3JjX3BkdShwYXZyY19jbWQtPnBkdSksIHBfZGV2LT5yY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgY3R5cGUsIGxhYmVsLCBwYXZyY19jbWQtPnJlZ19ub3RpZi5ldmVudF9pZCk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOiB7Ci0gICAgICBmaWxsX3BkdV9xdWV1ZShJRFhfR0VUX1BMQVlfU1RBVFVTX1JTUCwgY3R5cGUsIGxhYmVsLCB0cnVlLCBwX2Rldik7Ci0gICAgICBIQUxfQ0JBQ0soYnRfcmNfY2FsbGJhY2tzLCBnZXRfcGxheV9zdGF0dXNfY2IsIHBfZGV2LT5yY19hZGRyKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX0FUVFI6Ci0gICAgY2FzZSBBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfVkFMVUVTOgotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0NVUl9QTEFZRVJfQVBQX1ZBTFVFOgotICAgIGNhc2UgQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUU6Ci0gICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9BVFRSX1RFWFQ6Ci0gICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9WQUxVRV9URVhUOiB7Ci0gICAgICAvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgQXBwbGljYXRpb24gU2V0dGluZ3MgKi8KLSAgICAgIHNlbmRfcmVqZWN0X3Jlc3BvbnNlKHBfZGV2LT5yY19oYW5kbGUsIGxhYmVsLCBwYXZyY19jbWQtPnBkdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfU1RTX0JBRF9DTUQsIHBhdnJjX2NtZC0+Y21kLm9wY29kZSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9FTEVNRU5UX0FUVFI6IHsKLSAgICAgIGJ0cmNfbWVkaWFfYXR0cl90IGVsZW1lbnRfYXR0cnNbQlRSQ19NQVhfRUxFTV9BVFRSX1NJWkVdID0ge307Ci0gICAgICB1aW50OF90IG51bV9hdHRyID0gZmlsbF9hdHRyaWJ1dGVfaWRfYXJyYXkoCi0gICAgICAgICAgcGF2cmNfY21kLT5nZXRfZWxlbV9hdHRycy5udW1fYXR0ciwgcGF2cmNfY21kLT5nZXRfZWxlbV9hdHRycy5hdHRycywKLSAgICAgICAgICBCVFJDX01BWF9FTEVNX0FUVFJfU0laRSwgZWxlbWVudF9hdHRycyk7Ci0gICAgICBpZiAobnVtX2F0dHIgPT0gMCkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBObyB2YWxpZCBhdHRyaWJ1dGVzIHJlcXVlc3RlZCBpbiBHRVRfRUxFTUVOVF9BVFRSSUJVVEVTIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgc2VuZF9yZWplY3RfcmVzcG9uc2UocF9kZXYtPnJjX2hhbmRsZSwgbGFiZWwsIHBhdnJjX2NtZC0+cGR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX1NUU19CQURfUEFSQU0sIHBhdnJjX2NtZC0+Y21kLm9wY29kZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGZpbGxfcGR1X3F1ZXVlKElEWF9HRVRfRUxFTUVOVF9BVFRSX1JTUCwgY3R5cGUsIGxhYmVsLCB0cnVlLCBwX2Rldik7Ci0gICAgICBIQUxfQ0JBQ0soYnRfcmNfY2FsbGJhY2tzLCBnZXRfZWxlbWVudF9hdHRyX2NiLCBudW1fYXR0ciwgZWxlbWVudF9hdHRycywKLSAgICAgICAgICAgICAgICBwX2Rldi0+cmNfYWRkcik7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjogewotICAgICAgaWYgKHBhdnJjX2NtZC0+cmVnX25vdGlmLmV2ZW50X2lkID09IEJUUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQgJiYKLSAgICAgICAgICBwYXZyY19jbWQtPnJlZ19ub3RpZi5wYXJhbSA9PSAwKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICIlczogRGV2aWNlIHJlZ2lzdGVyaW5nIHBvc2l0aW9uIGNoYW5nZWQgd2l0aCBpbGxlZ2FsIHBhcmFtIDAuIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgc2VuZF9yZWplY3RfcmVzcG9uc2UocF9kZXYtPnJjX2hhbmRsZSwgbGFiZWwsIHBhdnJjX2NtZC0+cGR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX1NUU19CQURfUEFSQU0sIHBhdnJjX2NtZC0+Y21kLm9wY29kZSk7Ci0gICAgICAgIC8qIGRlLXJlZ2lzdGVyIHRoaXMgbm90aWZpY2F0aW9uIGZvciBhIHJlamVjdGVkIHJlc3BvbnNlICovCi0gICAgICAgIHBfZGV2LT5yY19ub3RpZltCVFJDX0VWVF9QTEFZX1BPU19DSEFOR0VEIC0gMV0uYk5vdGlmeSA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBIQUxfQ0JBQ0soYnRfcmNfY2FsbGJhY2tzLCByZWdpc3Rlcl9ub3RpZmljYXRpb25fY2IsCi0gICAgICAgICAgICAgICAgKGJ0cmNfZXZlbnRfaWRfdClwYXZyY19jbWQtPnJlZ19ub3RpZi5ldmVudF9pZCwKLSAgICAgICAgICAgICAgICBwYXZyY19jbWQtPnJlZ19ub3RpZi5wYXJhbSwgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBVlJDX1BEVV9JTkZPUk1fRElTUExBWV9DSEFSU0VUOiB7Ci0gICAgICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBBVlJDX1BEVV9JTkZPUk1fRElTUExBWV9DSEFSU0VUIiwgX19mdW5jX18pOwotICAgICAgaWYgKHBfZGV2LT5yY19jb25uZWN0ZWQpIHsKLSAgICAgICAgbWVtc2V0KCYoYXZyY19yc3AuaW5mb3JtX2NoYXJzZXQpLCAwLCBzaXplb2YodEFWUkNfUlNQKSk7Ci0gICAgICAgIGF2cmNfcnNwLmluZm9ybV9jaGFyc2V0Lm9wY29kZSA9Ci0gICAgICAgICAgICBvcGNvZGVfZnJvbV9wZHUoQVZSQ19QRFVfSU5GT1JNX0RJU1BMQVlfQ0hBUlNFVCk7Ci0gICAgICAgIGF2cmNfcnNwLmluZm9ybV9jaGFyc2V0LnBkdSA9IEFWUkNfUERVX0lORk9STV9ESVNQTEFZX0NIQVJTRVQ7Ci0gICAgICAgIGF2cmNfcnNwLmluZm9ybV9jaGFyc2V0LnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICAgICAgICBzZW5kX21ldGFtc2dfcnNwKHBfZGV2LCAtMSwgbGFiZWwsIGN0eXBlLCAmYXZyY19yc3ApOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVM6IHsKLSAgICAgIHVpbnQzMl90IGF0dHJfaWRzW0JUUkNfTUFYX0VMRU1fQVRUUl9TSVpFXSA9IHswfTsKLSAgICAgIHVpbnQ4X3QgbnVtX2F0dHI7Ci0gICAgICBudW1fYXR0ciA9IHBhdnJjX2NtZC0+Z2V0X2l0ZW1zLmF0dHJfY291bnQ7Ci0KLSAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgIiVzOiBBVlJDX1BEVV9HRVRfRk9MREVSX0lURU1TIG51bV9hdHRyOiAlZCwgc3RhcnRfaXRlbSBbJWRdIFwKLSAgICAgICAgICAgICAgICBlbmRfaXRlbSBbJWRdIiwKLSAgICAgICAgICBfX2Z1bmNfXywgbnVtX2F0dHIsIHBhdnJjX2NtZC0+Z2V0X2l0ZW1zLnN0YXJ0X2l0ZW0sCi0gICAgICAgICAgcGF2cmNfY21kLT5nZXRfaXRlbXMuZW5kX2l0ZW0pOwotCi0gICAgICAvKiBudW1fYXR0ciByZXF1ZXN0ZWQ6Ci0gICAgICAgKiAgICAgMHgwMDogQWxsIGF0dHJpYnV0ZXMgcmVxdWVzdGVkCi0gICAgICAgKiAgICAgMHhGRjogTm8gQXR0cmlidXRlcyByZXF1ZXN0ZWQKLSAgICAgICAqICAgICAweDAxIHRvIDB4MDc6IFNwZWNpZmllZCBudW1iZXIgb2YgYXR0cmlidXRlcwotICAgICAgICovCi0gICAgICBpZiAoKG51bV9hdHRyICE9IDB4RkYgJiYgbnVtX2F0dHIgPiBCVFJDX01BWF9FTEVNX0FUVFJfU0laRSkpIHsKLSAgICAgICAgc2VuZF9yZWplY3RfcmVzcG9uc2UocF9kZXYtPnJjX2hhbmRsZSwgbGFiZWwsIHBhdnJjX2NtZC0+cGR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX1NUU19CQURfUEFSQU0sIHBhdnJjX2NtZC0+Y21kLm9wY29kZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogRXhjZXB0IG51bV9hdHRyIGlzIE5vbmUoMHhmZikgLyBBbGwoMHgwMCksIHJlcXVlc3QgZm9sbG93cyB3aXRoIGFuCi0gICAgICAgKiBBdHRyaWJ1dGUgTGlzdCAqLwotICAgICAgaWYgKChudW1fYXR0ciAhPSAweEZGKSAmJiAobnVtX2F0dHIgIT0gMHgwMCkpIHsKLSAgICAgICAgbWVtY3B5KGF0dHJfaWRzLCBwYXZyY19jbWQtPmdldF9pdGVtcy5wX2F0dHJfbGlzdCwKLSAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKiBudW1fYXR0cik7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGxfcGR1X3F1ZXVlKElEWF9HRVRfRk9MREVSX0lURU1TX1JTUCwgY3R5cGUsIGxhYmVsLCB0cnVlLCBwX2Rldik7Ci0gICAgICBIQUxfQ0JBQ0soYnRfcmNfY2FsbGJhY2tzLCBnZXRfZm9sZGVyX2l0ZW1zX2NiLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+Z2V0X2l0ZW1zLnNjb3BlLCBwYXZyY19jbWQtPmdldF9pdGVtcy5zdGFydF9pdGVtLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+Z2V0X2l0ZW1zLmVuZF9pdGVtLCBudW1fYXR0ciwgYXR0cl9pZHMsCi0gICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9BRERSRVNTRURfUExBWUVSOiB7Ci0gICAgICBmaWxsX3BkdV9xdWV1ZShJRFhfU0VUX0FERFJfUExBWUVSX1JTUCwgY3R5cGUsIGxhYmVsLCB0cnVlLCBwX2Rldik7Ci0gICAgICBIQUxfQ0JBQ0soYnRfcmNfY2FsbGJhY2tzLCBzZXRfYWRkcmVzc2VkX3BsYXllcl9jYiwKLSAgICAgICAgICAgICAgICBwYXZyY19jbWQtPmFkZHJfcGxheWVyLnBsYXllcl9pZCwgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUjogewotICAgICAgZmlsbF9wZHVfcXVldWUoSURYX1NFVF9CUk9XU0VEX1BMQVlFUl9SU1AsIGN0eXBlLCBsYWJlbCwgdHJ1ZSwgcF9kZXYpOwotICAgICAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgc2V0X2Jyb3dzZWRfcGxheWVyX2NiLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+YnJfcGxheWVyLnBsYXllcl9pZCwgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUDogewotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXMoKSBSRVFVRVNUIENPTlRJTlVBVElPTjogdGFyZ2V0X3BkdTogMHglMDJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdnJjX2NtZC0+Y29udGludS50YXJnZXRfcGR1KTsKLSAgICAgIHRBVlJDX1JFU1BPTlNFIGF2cmNfcnNwOwotICAgICAgaWYgKHBfZGV2LT5yY19jb25uZWN0ZWQgPT0gVFJVRSkgewotICAgICAgICBtZW1zZXQoJihhdnJjX3JzcC5jb250aW51KSwgMCwgc2l6ZW9mKHRBVlJDX05FWFRfUlNQKSk7Ci0gICAgICAgIGF2cmNfcnNwLmNvbnRpbnUub3Bjb2RlID0KLSAgICAgICAgICAgIG9wY29kZV9mcm9tX3BkdShBVlJDX1BEVV9SRVFVRVNUX0NPTlRJTlVBVElPTl9SU1ApOwotICAgICAgICBhdnJjX3JzcC5jb250aW51LnBkdSA9IEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUDsKLSAgICAgICAgYXZyY19yc3AuY29udGludS5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgICAgICAgYXZyY19yc3AuY29udGludS50YXJnZXRfcGR1ID0gcGF2cmNfY21kLT5jb250aW51LnRhcmdldF9wZHU7Ci0gICAgICAgIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIC0xLCBsYWJlbCwgY3R5cGUsICZhdnJjX3JzcCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfQUJPUlRfQ09OVElOVUFUSU9OX1JTUDogewotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXMoKSBBQk9SVCBDT05USU5VQVRJT046IHRhcmdldF9wZHU6IDB4JTAyZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwYXZyY19jbWQtPmFib3J0LnRhcmdldF9wZHUpOwotICAgICAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gICAgICBpZiAocF9kZXYtPnJjX2Nvbm5lY3RlZCA9PSBUUlVFKSB7Ci0gICAgICAgIG1lbXNldCgmKGF2cmNfcnNwLmFib3J0KSwgMCwgc2l6ZW9mKHRBVlJDX05FWFRfUlNQKSk7Ci0gICAgICAgIGF2cmNfcnNwLmFib3J0Lm9wY29kZSA9Ci0gICAgICAgICAgICBvcGNvZGVfZnJvbV9wZHUoQVZSQ19QRFVfQUJPUlRfQ09OVElOVUFUSU9OX1JTUCk7Ci0gICAgICAgIGF2cmNfcnNwLmFib3J0LnBkdSA9IEFWUkNfUERVX0FCT1JUX0NPTlRJTlVBVElPTl9SU1A7Ci0gICAgICAgIGF2cmNfcnNwLmFib3J0LnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICAgICAgICBhdnJjX3JzcC5hYm9ydC50YXJnZXRfcGR1ID0gcGF2cmNfY21kLT5jb250aW51LnRhcmdldF9wZHU7Ci0gICAgICAgIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIC0xLCBsYWJlbCwgY3R5cGUsICZhdnJjX3JzcCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfQ0hBTkdFX1BBVEg6IHsKLSAgICAgIGZpbGxfcGR1X3F1ZXVlKElEWF9DSEdfUEFUSF9SU1AsIGN0eXBlLCBsYWJlbCwgdHJ1ZSwgcF9kZXYpOwotICAgICAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgY2hhbmdlX3BhdGhfY2IsIHBhdnJjX2NtZC0+Y2hnX3BhdGguZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+Y2hnX3BhdGguZm9sZGVyX3VpZCwgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFQVJDSDogewotICAgICAgZmlsbF9wZHVfcXVldWUoSURYX1NFQVJDSF9SU1AsIGN0eXBlLCBsYWJlbCwgdHJ1ZSwgcF9kZXYpOwotICAgICAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgc2VhcmNoX2NiLCBwYXZyY19jbWQtPnNlYXJjaC5zdHJpbmcuY2hhcnNldF9pZCwKLSAgICAgICAgICAgICAgICBwYXZyY19jbWQtPnNlYXJjaC5zdHJpbmcuc3RyX2xlbiwKLSAgICAgICAgICAgICAgICBwYXZyY19jbWQtPnNlYXJjaC5zdHJpbmcucF9zdHIsIHBfZGV2LT5yY19hZGRyKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfSVRFTV9BVFRSSUJVVEVTOiB7Ci0gICAgICBidHJjX21lZGlhX2F0dHJfdCBpdGVtX2F0dHJzW0JUUkNfTUFYX0VMRU1fQVRUUl9TSVpFXSA9IHt9OwotICAgICAgdWludDhfdCBudW1fYXR0ciA9IGZpbGxfYXR0cmlidXRlX2lkX2FycmF5KAotICAgICAgICAgIHBhdnJjX2NtZC0+Z2V0X2F0dHJzLmF0dHJfY291bnQsIHBhdnJjX2NtZC0+Z2V0X2F0dHJzLnBfYXR0cl9saXN0LAotICAgICAgICAgIEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFLCBpdGVtX2F0dHJzKTsKLSAgICAgIGlmIChudW1fYXR0ciA9PSAwKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiJXM6IE5vIHZhbGlkIGF0dHJpYnV0ZXMgcmVxdWVzdGVkIGluIEdFVF9JVEVNX0FUVFJJQlVURVMiLAotICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBzZW5kX3JlamVjdF9yZXNwb25zZShwX2Rldi0+cmNfaGFuZGxlLCBsYWJlbCwgcGF2cmNfY21kLT5wZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfU1RTX0JBRF9QQVJBTSwgcGF2cmNfY21kLT5jbWQub3Bjb2RlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZmlsbF9wZHVfcXVldWUoSURYX0dFVF9JVEVNX0FUVFJfUlNQLCBjdHlwZSwgbGFiZWwsIHRydWUsIHBfZGV2KTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBHRVRfSVRFTV9BVFRSSUJVVEVTOiBudW1fYXR0cjogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX2F0dHIpOwotICAgICAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgZ2V0X2l0ZW1fYXR0cl9jYiwgcGF2cmNfY21kLT5nZXRfYXR0cnMuc2NvcGUsCi0gICAgICAgICAgICAgICAgcGF2cmNfY21kLT5nZXRfYXR0cnMudWlkLCBwYXZyY19jbWQtPmdldF9hdHRycy51aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICBudW1fYXR0ciwgaXRlbV9hdHRycywgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVM6IHsKLSAgICAgIGZpbGxfcGR1X3F1ZXVlKElEWF9HRVRfVE9UQUxfTlVNX09GX0lURU1TX1JTUCwgY3R5cGUsIGxhYmVsLCB0cnVlLCBwX2Rldik7Ci0gICAgICBIQUxfQ0JBQ0soYnRfcmNfY2FsbGJhY2tzLCBnZXRfdG90YWxfbnVtX29mX2l0ZW1zX2NiLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+Z2V0X251bV9vZl9pdGVtcy5zY29wZSwgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0FERF9UT19OT1dfUExBWUlORzogewotICAgICAgZmlsbF9wZHVfcXVldWUoSURYX0FERF9UT19OT1dfUExBWUlOR19SU1AsIGN0eXBlLCBsYWJlbCwgdHJ1ZSwgcF9kZXYpOwotICAgICAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgYWRkX3RvX25vd19wbGF5aW5nX2NiLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+YWRkX3RvX3BsYXkuc2NvcGUsIHBhdnJjX2NtZC0+YWRkX3RvX3BsYXkudWlkLAotICAgICAgICAgICAgICAgIHBhdnJjX2NtZC0+YWRkX3RvX3BsYXkudWlkX2NvdW50ZXIsIHBfZGV2LT5yY19hZGRyKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9QTEFZX0lURU06IHsKLSAgICAgIGZpbGxfcGR1X3F1ZXVlKElEWF9QTEFZX0lURU1fUlNQLCBjdHlwZSwgbGFiZWwsIHRydWUsIHBfZGV2KTsKLSAgICAgIEhBTF9DQkFDSyhidF9yY19jYWxsYmFja3MsIHBsYXlfaXRlbV9jYiwgcGF2cmNfY21kLT5wbGF5X2l0ZW0uc2NvcGUsCi0gICAgICAgICAgICAgICAgcGF2cmNfY21kLT5wbGF5X2l0ZW0udWlkX2NvdW50ZXIsIHBhdnJjX2NtZC0+cGxheV9pdGVtLnVpZCwKLSAgICAgICAgICAgICAgICBwX2Rldi0+cmNfYWRkcik7Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIHNlbmRfcmVqZWN0X3Jlc3BvbnNlKHBfZGV2LT5yY19oYW5kbGUsIGxhYmVsLCBwYXZyY19jbWQtPnBkdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfU1RTX0JBRF9DTUQsIHBhdnJjX2NtZC0+Y21kLm9wY29kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9yY19jdHJsX3Vwc3RyZWFtc19yc3BfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBFeGVjdXRlcyBBVlJDIFVQU1RSRUFNUyByZXNwb25zZSBldmVudHMgaW4gYnRpZiBjb250ZXh0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX3JjX2N0cmxfdXBzdHJlYW1zX3JzcF9jbWQodWludDhfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19DT01NQU5EKiBwYXZyY19jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcGR1OiAlczogaGFuZGxlOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgZHVtcF9yY19wZHUocGF2cmNfY21kLT5wZHUpLCBwX2Rldi0+cmNfaGFuZGxlKTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQVZSQ19QRFVfU0VUX0FCU09MVVRFX1ZPTFVNRToKLSAgICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPnNldGFic3ZvbF9jbWRfY2IsIHBfZGV2LT5yY19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgcGF2cmNfY21kLT52b2x1bWUudm9sdW1lLCBsYWJlbCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT046Ci0gICAgICBpZiAocGF2cmNfY21kLT5yZWdfbm90aWYuZXZlbnRfaWQgPT0gQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSkgewotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cmVnaXN0ZXJub3RpZmljYXRpb25fYWJzdm9sX2NiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfYWRkciwgbGFiZWwpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3JjX3Vwc3RyZWFtc19yc3BfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBFeGVjdXRlcyBBVlJDIFVQU1RSRUFNUyByZXNwb25zZSBldmVudHMgaW4gYnRpZiBjb250ZXh0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX3JjX3Vwc3RyZWFtc19yc3BfZXZ0KHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SRVNQT05TRSogcGF2cmNfcmVzcCwgdWludDhfdCBjdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHBkdTogJXM6IGhhbmRsZTogMHgleCBjdHlwZTogJXggbGFiZWw6ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgZHVtcF9yY19wZHUocGF2cmNfcmVzcC0+cGR1KSwgcF9kZXYtPnJjX2hhbmRsZSwgY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgbGFiZWwpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjogewotICAgICAgaWYgKEFWUkNfUlNQX0NIQU5HRUQgPT0gY3R5cGUpCi0gICAgICAgIHBfZGV2LT5yY192b2x1bWUgPSBwYXZyY19yZXNwLT5yZWdfbm90aWYucGFyYW0udm9sdW1lOwotICAgICAgSEFMX0NCQUNLKGJ0X3JjX2NhbGxiYWNrcywgdm9sdW1lX2NoYW5nZV9jYiwKLSAgICAgICAgICAgICAgICBwYXZyY19yZXNwLT5yZWdfbm90aWYucGFyYW0udm9sdW1lLCBjdHlwZSwgcF9kZXYtPnJjX2FkZHIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9BQlNPTFVURV9WT0xVTUU6IHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIiVzOiBTZXQgYWJzb2x1dGUgdm9sdW1lIGNoYW5nZSBldmVudCByZWNlaXZlZDogdm9sdW1lOiAlZCwgY3R5cGU6ICIKLSAgICAgICAgICAiJWQiLAotICAgICAgICAgIF9fZnVuY19fLCBwYXZyY19yZXNwLT52b2x1bWUudm9sdW1lLCBjdHlwZSk7Ci0gICAgICBpZiAoQVZSQ19SU1BfQUNDRVBUID09IGN0eXBlKQotICAgICAgICBwX2Rldi0+cmNfdm9sdW1lID0gcGF2cmNfcmVzcC0+dm9sdW1lLnZvbHVtZTsKLSAgICAgIEhBTF9DQkFDSyhidF9yY19jYWxsYmFja3MsIHZvbHVtZV9jaGFuZ2VfY2IsIHBhdnJjX3Jlc3AtPnZvbHVtZS52b2x1bWUsCi0gICAgICAgICAgICAgICAgY3R5cGUsIHBfZGV2LT5yY19hZGRyKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEFWUkNQIEFQSSBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBpbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplcyB0aGUgQVZSQyBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0KGJ0cmNfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcykgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogIiwgX19mdW5jX18pOwotICBidF9zdGF0dXNfdCByZXN1bHQgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLQotICBpZiAoYnRfcmNfY2FsbGJhY2tzKSByZXR1cm4gQlRfU1RBVFVTX0RPTkU7Ci0KLSAgYnRfcmNfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBCVElGX1JDX05VTV9DT05OOyBpZHgrKykgewotICAgIGluaXRpYWxpemVfZGV2aWNlKCZidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0pOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGluaXRfY3RybAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZXMgdGhlIEFWUkMgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgaW5pdF9jdHJsKGJ0cmNfY3RybF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiAiLCBfX2Z1bmNfXyk7Ci0gIGJ0X3N0YXR1c190IHJlc3VsdCA9IEJUX1NUQVRVU19TVUNDRVNTOwotCi0gIGlmIChidF9yY19jdHJsX2NhbGxiYWNrcykgcmV0dXJuIEJUX1NUQVRVU19ET05FOwotCi0gIGJ0X3JjX2N0cmxfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBCVElGX1JDX05VTV9DT05OOyBpZHgrKykgewotICAgIGluaXRpYWxpemVfZGV2aWNlKCZidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0pOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgcmNfY3RybF9wcm9jZWR1cmVfY29tcGxldGUoYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXYgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9kZXYtPnJjX3Byb2NlZHVyZV9jb21wbGV0ZSkgewotICAgIHJldHVybjsKLSAgfQotICBwX2Rldi0+cmNfcHJvY2VkdXJlX2NvbXBsZXRlID0gdHJ1ZTsKLSAgY29uc3QgdWludDMyX3QqIGF0dHJfbGlzdCA9IGdldF9yZXF1ZXN0ZWRfYXR0cmlidXRlc19saXN0KHBfZGV2KTsKLSAgY29uc3QgdWludDhfdCBhdHRyX2xpc3Rfc2l6ZSA9IGdldF9yZXF1ZXN0ZWRfYXR0cmlidXRlc19saXN0X3NpemUocF9kZXYpOwotICBnZXRfbWV0YWRhdGFfYXR0cmlidXRlX2NtZChhdHRyX2xpc3Rfc2l6ZSwgYXR0cl9saXN0LCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9wbGF5X3N0YXR1c19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgcGxheSBzdGF0dXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gcmVzcG9uc2UgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgIEdldFBsYXlTdGF0dXMgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9wbGF5X3N0YXR1c19yc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcGxheV9zdGF0dXNfdCBwbGF5X3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvbmdfbGVuLCB1aW50MzJfdCBzb25nX3BvcykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGJkX2FkZHIpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzb25nIGxlbiAlZCBzb25nIHBvcyAlZCIsIF9fZnVuY19fLCBzb25nX2xlbiwgc29uZ19wb3MpOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIG1lbXNldCgmKGF2cmNfcnNwLmdldF9wbGF5X3N0YXR1cyksIDAsIHNpemVvZih0QVZSQ19HRVRfUExBWV9TVEFUVVNfUlNQKSk7Ci0KLSAgYXZyY19yc3AuZ2V0X3BsYXlfc3RhdHVzLnNvbmdfbGVuID0gc29uZ19sZW47Ci0gIGF2cmNfcnNwLmdldF9wbGF5X3N0YXR1cy5zb25nX3BvcyA9IHNvbmdfcG9zOwotICBhdnJjX3JzcC5nZXRfcGxheV9zdGF0dXMucGxheV9zdGF0dXMgPSBwbGF5X3N0YXR1czsKLQotICBhdnJjX3JzcC5nZXRfcGxheV9zdGF0dXMucGR1ID0gQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOwotICBhdnJjX3JzcC5nZXRfcGxheV9zdGF0dXMub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX0dFVF9QTEFZX1NUQVRVUyk7Ci0gIGF2cmNfcnNwLmdldF9wbGF5X3N0YXR1cy5zdGF0dXMgPQotICAgICAgKChwbGF5X3N0YXR1cyAhPSBCVFJDX1BMQVlTVEFURV9FUlJPUikgPyBBVlJDX1NUU19OT19FUlJPUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVlJDX1NUU19CQURfUEFSQU0pOwotCi0gIC8qIFNlbmQgdGhlIHJlc3BvbnNlICovCi0gIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIElEWF9HRVRfUExBWV9TVEFUVVNfUlNQLAotICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfR0VUX1BMQVlfU1RBVFVTX1JTUF0ubGFiZWwsCi0gICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9HRVRfUExBWV9TVEFUVVNfUlNQXS5jdHlwZSwKLSAgICAgICAgICAgICAgICAgICAmYXZyY19yc3ApOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X2VsZW1lbnRfYXR0cl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgc29uZ3MnIGVsZW1lbnQgYXR0cmlidXRlcwotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGV4dC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9lbGVtZW50X2F0dHJfcnNwKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCogcF9hdHRycykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgdWludDMyX3QgaTsKLSAgdEFWUkNfQVRUUl9FTlRSWSBlbGVtZW50X2F0dHJzW0JUUkNfTUFYX0VMRU1fQVRUUl9TSVpFXTsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGJkX2FkZHIpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIGlmIChudW1fYXR0ciA+IEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICIgRXhjZWVkZWQgbnVtYmVyIGF0dHJpYnV0ZXM6IiA8PCBzdGF0aWNfY2FzdDxpbnQ+KG51bV9hdHRyKQotICAgICAgICAgICAgICAgICA8PCAiIG1heDoiIDw8IEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFOwotICAgIG51bV9hdHRyID0gQlRSQ19NQVhfRUxFTV9BVFRSX1NJWkU7Ci0gIH0KLSAgbWVtc2V0KGVsZW1lbnRfYXR0cnMsIDAsIHNpemVvZih0QVZSQ19BVFRSX0VOVFJZKSAqIG51bV9hdHRyKTsKLQotICBpZiAobnVtX2F0dHIgPT0gMCkgewotICAgIGF2cmNfcnNwLmdldF9wbGF5X3N0YXR1cy5zdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9hdHRyOyBpKyspIHsKLSAgICAgIGVsZW1lbnRfYXR0cnNbaV0uYXR0cl9pZCA9IHBfYXR0cnNbaV0uYXR0cl9pZDsKLSAgICAgIGVsZW1lbnRfYXR0cnNbaV0ubmFtZS5jaGFyc2V0X2lkID0gQVZSQ19DSEFSU0VUX0lEX1VURjg7Ci0gICAgICBlbGVtZW50X2F0dHJzW2ldLm5hbWUuc3RyX2xlbiA9Ci0gICAgICAgICAgKHVpbnQxNl90KXN0cm5sZW4oKGNoYXIqKXBfYXR0cnNbaV0udGV4dCwgQlRSQ19NQVhfQVRUUl9TVFJfTEVOKTsKLSAgICAgIGVsZW1lbnRfYXR0cnNbaV0ubmFtZS5wX3N0ciA9IHBfYXR0cnNbaV0udGV4dDsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIiVzOiBhdHRyX2lkOiAweCV4LCBjaGFyc2V0X2lkOiAweCV4LCBzdHJfbGVuOiAlZCwgc3RyOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICh1bnNpZ25lZCBpbnQpZWxlbWVudF9hdHRyc1tpXS5hdHRyX2lkLAotICAgICAgICAgIGVsZW1lbnRfYXR0cnNbaV0ubmFtZS5jaGFyc2V0X2lkLCBlbGVtZW50X2F0dHJzW2ldLm5hbWUuc3RyX2xlbiwKLSAgICAgICAgICBlbGVtZW50X2F0dHJzW2ldLm5hbWUucF9zdHIpOwotICAgIH0KLSAgICBhdnJjX3JzcC5nZXRfcGxheV9zdGF0dXMuc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIH0KLSAgYXZyY19yc3AuZ2V0X2F0dHJzLm51bV9hdHRycyA9IG51bV9hdHRyOwotICBhdnJjX3JzcC5nZXRfYXR0cnMucF9hdHRycyA9IGVsZW1lbnRfYXR0cnM7Ci0gIGF2cmNfcnNwLmdldF9hdHRycy5wZHUgPSBBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSOwotICBhdnJjX3JzcC5nZXRfYXR0cnMub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX0dFVF9FTEVNRU5UX0FUVFIpOwotCi0gIC8qIFNlbmQgdGhlIHJlc3BvbnNlICovCi0gIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIElEWF9HRVRfRUxFTUVOVF9BVFRSX1JTUCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9FTEVNRU5UX0FUVFJfUlNQXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9FTEVNRU5UX0FUVFJfUlNQXS5jdHlwZSwKLSAgICAgICAgICAgICAgICAgICAmYXZyY19yc3ApOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzcG9uc2UgdG8gdGhlIHJlZ2lzdGVyIG5vdGlmaWNhdGlvbiByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3JzcCgKLSAgICBidHJjX2V2ZW50X2lkX3QgZXZlbnRfaWQsIGJ0cmNfbm90aWZpY2F0aW9uX3R5cGVfdCB0eXBlLAotICAgIGJ0cmNfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3QqIHBfcGFyYW0pIHsKLSAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBldmVudF9pZDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBkdW1wX3JjX25vdGlmaWNhdGlvbl9ldmVudF9pZChldmVudF9pZCkpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soYnRpZl9yY19jYi5sb2NrKTsKLQotICBtZW1zZXQoJihhdnJjX3JzcC5yZWdfbm90aWYpLCAwLCBzaXplb2YodEFWUkNfUkVHX05PVElGX1JTUCkpOwotCi0gIGF2cmNfcnNwLnJlZ19ub3RpZi5ldmVudF9pZCA9IGV2ZW50X2lkOwotICBhdnJjX3JzcC5yZWdfbm90aWYucGR1ID0gQVZSQ19QRFVfUkVHSVNURVJfTk9USUZJQ0FUSU9OOwotICBhdnJjX3JzcC5yZWdfbm90aWYub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTik7Ci0gIGF2cmNfcnNwLmdldF9wbGF5X3N0YXR1cy5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLQotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBCVElGX1JDX05VTV9DT05OOyBpZHgrKykgewotICAgIG1lbXNldCgmKGF2cmNfcnNwLnJlZ19ub3RpZi5wYXJhbSksIDAsIHNpemVvZih0QVZSQ19OT1RJRl9SU1BfUEFSQU0pKTsKLQotICAgIGlmICghKGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XS5yY19jb25uZWN0ZWQpKSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogQXZyY3AgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQsIGhhbmRsZTogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0ucmNfaGFuZGxlKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICghYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLnJjX25vdGlmW2V2ZW50X2lkIC0gMV0uYk5vdGlmeSkgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICIlczogQXZyY3AgRXZlbnQgaWQgaXMgbm90IHJlZ2lzdGVyZWQ6IGV2ZW50X2lkOiAleCwgaGFuZGxlOiAweCV4IiwKLSAgICAgICAgICBfX2Z1bmNfXywgZXZlbnRfaWQsIGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XS5yY19oYW5kbGUpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBBdnJjcCBFdmVudCBpZCBpcyByZWdpc3RlcmVkOiBldmVudF9pZDogJXggaGFuZGxlOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgIGV2ZW50X2lkLCBidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0ucmNfaGFuZGxlKTsKLQotICAgIHN3aXRjaCAoZXZlbnRfaWQpIHsKLSAgICAgIGNhc2UgQlRSQ19FVlRfUExBWV9TVEFUVVNfQ0hBTkdFRDoKLSAgICAgICAgYXZyY19yc3AucmVnX25vdGlmLnBhcmFtLnBsYXlfc3RhdHVzID0gcF9wYXJhbS0+cGxheV9zdGF0dXM7Ci0gICAgICAgIGlmIChhdnJjX3JzcC5yZWdfbm90aWYucGFyYW0ucGxheV9zdGF0dXMgPT0gUExBWV9TVEFUVVNfUExBWUlORykKLSAgICAgICAgICBidGlmX2F2X2NsZWFyX3JlbW90ZV9zdXNwZW5kX2ZsYWcoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUUkNfRVZUX1RSQUNLX0NIQU5HRToKLSAgICAgICAgbWVtY3B5KCYoYXZyY19yc3AucmVnX25vdGlmLnBhcmFtLnRyYWNrKSwgJihwX3BhcmFtLT50cmFjayksCi0gICAgICAgICAgICAgICBzaXplb2YoYnRyY191aWRfdCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRSQ19FVlRfUExBWV9QT1NfQ0hBTkdFRDoKLSAgICAgICAgYXZyY19yc3AucmVnX25vdGlmLnBhcmFtLnBsYXlfcG9zID0gcF9wYXJhbS0+c29uZ19wb3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVFJDX0VWVF9BVkFMX1BMQVlFUl9DSEFOR0U6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVFJDX0VWVF9BRERSX1BMQVlFUl9DSEFOR0U6Ci0gICAgICAgIGF2cmNfcnNwLnJlZ19ub3RpZi5wYXJhbS5hZGRyX3BsYXllci5wbGF5ZXJfaWQgPQotICAgICAgICAgICAgcF9wYXJhbS0+YWRkcl9wbGF5ZXJfY2hhbmdlZC5wbGF5ZXJfaWQ7Ci0gICAgICAgIGF2cmNfcnNwLnJlZ19ub3RpZi5wYXJhbS5hZGRyX3BsYXllci51aWRfY291bnRlciA9Ci0gICAgICAgICAgICBwX3BhcmFtLT5hZGRyX3BsYXllcl9jaGFuZ2VkLnVpZF9jb3VudGVyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRSQ19FVlRfVUlEU19DSEFOR0VEOgotICAgICAgICBhdnJjX3JzcC5yZWdfbm90aWYucGFyYW0udWlkX2NvdW50ZXIgPQotICAgICAgICAgICAgcF9wYXJhbS0+dWlkc19jaGFuZ2VkLnVpZF9jb3VudGVyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRSQ19FVlRfTk9XX1BMQVlJTkdfQ09OVEVOVF9DSEFOR0VEOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogVW5oYW5kbGVkIGV2ZW50IElEOiAweCV4IiwgX19mdW5jX18sIGV2ZW50X2lkKTsKLSAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19VTkhBTkRMRUQ7Ci0gICAgfQotCi0gICAgLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCi0gICAgc2VuZF9tZXRhbXNnX3JzcCgKLSAgICAgICAgJmJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XSwgLTEsCi0gICAgICAgIGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XS5yY19ub3RpZltldmVudF9pZCAtIDFdLmxhYmVsLAotICAgICAgICAoKHR5cGUgPT0gQlRSQ19OT1RJRklDQVRJT05fVFlQRV9JTlRFUklNKSA/IEFWUkNfQ01EX05PVElGCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZSQ19SU1BfQ0hBTkdFRCksCi0gICAgICAgICZhdnJjX3JzcCk7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfZm9sZGVyX2l0ZW1zX2xpc3RfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIHRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zIGluIGN1cnJlbnQgZm9sZGVyIGFsb25nIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuIFRoaXMgaXMgY2FsbGVkIGluIHJlc3BvbnNlIHRvCi0gKiAgICAgICAgICAgICAgICAgIEdldEZvbGRlckl0ZW1zIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICogICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX05PVF9SRUFEWSAtIHdoZW4gUkMgaXMgbm90IGNvbm5lY3RlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTICAgLSBhbHdheXMgaWYgUkMgaXMgY29ubmVjdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfVU5IQU5ETEVEIC0gd2hlbiByc3AgaXMgbm90IHBlbmRpbmcgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbGRlcl9pdGVtc19saXN0IFBEVQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfZm9sZGVyX2l0ZW1zX2xpc3RfcnNwKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2l0ZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19mb2xkZXJfaXRlbXNfdCogcF9pdGVtcykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgdEFWUkNfSVRFTSBpdGVtOwotICB0QlRBX0FWX0NPREUgY29kZSA9IDAsIGN0eXBlID0gMDsKLSAgQlRfSERSKiBwX21zZyA9IE5VTEw7Ci0gIGludCBpdGVtX2NudDsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0gIGJ0cmNfZm9sZGVyX2l0ZW1zX3QqIGN1cl9pdGVtID0gTlVMTDsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogdWlkX2NvdW50ZXIgJWQgbnVtX2l0ZW1zICVkIiwgX19mdW5jX18sIHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgIG51bV9pdGVtcyk7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgLyogY2hlY2sgaWYgcnNwIHRvIHByZXZpb3VzIGNtZCB3YXMgY29tcGxldGVkICovCi0gIGlmICghcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9HRVRfRk9MREVSX0lURU1TX1JTUF0uaXNfcnNwX3BlbmRpbmcpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBOb3Qgc2VuZGluZyByZXNwb25zZSBhcyBubyBQRFUgd2FzIHJlZ2lzdGVyZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19VTkhBTkRMRUQ7Ci0gIH0KLQotICBtZW1zZXQoJmF2cmNfcnNwLCAwLCBzaXplb2YodEFWUkNfUkVTUE9OU0UpKTsKLSAgbWVtc2V0KCZpdGVtLCAwLCBzaXplb2YodEFWUkNfSVRFTSkpOwotCi0gIGF2cmNfcnNwLmdldF9pdGVtcy5wZHUgPSBBVlJDX1BEVV9HRVRfRk9MREVSX0lURU1TOwotICBhdnJjX3JzcC5nZXRfaXRlbXMub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVMpOwotICBhdnJjX3JzcC5nZXRfaXRlbXMuc3RhdHVzID0gc3RhdHVzX2NvZGVfbWFwW3JzcF9zdGF0dXNdOwotCi0gIGlmIChhdnJjX3JzcC5nZXRfaXRlbXMuc3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiJXM6IEVycm9yIGluIHBhcnNpbmcgdGhlIHJlY2VpdmVkIGdldGZvbGRlcml0ZW1zIGNtZC4gc3RhdHVzOiAweCUwMngiLAotICAgICAgICBfX2Z1bmNfXywgYXZyY19yc3AuZ2V0X2l0ZW1zLnN0YXR1cyk7Ci0gICAgc3RhdHVzID0gYXZyY19yc3AuZ2V0X2l0ZW1zLnN0YXR1czsKLSAgfSBlbHNlIHsKLSAgICBhdnJjX3JzcC5nZXRfaXRlbXMudWlkX2NvdW50ZXIgPSB1aWRfY291bnRlcjsKLSAgICBhdnJjX3JzcC5nZXRfaXRlbXMuaXRlbV9jb3VudCA9IDE7Ci0KLSAgICAvKiBjcmVhdGUgc2luZ2xlIGl0ZW0gYW5kIGJ1aWxkIHJlc3BvbnNlIGl0ZXJhdGl2ZWx5IGZvciBhbGwgbnVtX2l0ZW1zICovCi0gICAgZm9yIChpdGVtX2NudCA9IDA7IGl0ZW1fY250IDwgbnVtX2l0ZW1zOyBpdGVtX2NudCsrKSB7Ci0gICAgICBjdXJfaXRlbSA9ICZwX2l0ZW1zW2l0ZW1fY250XTsKLSAgICAgIGl0ZW0uaXRlbV90eXBlID0gcF9pdGVtcy0+aXRlbV90eXBlOwotICAgICAgLyogYnVpbGQgcmVzcGVjdGl2ZSBpdGVtIGJhc2VkIG9uIGl0ZW1fdHlwZS4gQWxsIGl0ZW1zIHNob3VsZCBiZSBvZiBzYW1lCi0gICAgICAgKiB0eXBlIHdpdGhpbgotICAgICAgICogYSByZXNwb25zZSAqLwotICAgICAgc3dpdGNoIChwX2l0ZW1zLT5pdGVtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBBVlJDX0lURU1fUExBWUVSOiB7Ci0gICAgICAgICAgaXRlbS51LnBsYXllci5uYW1lLmNoYXJzZXRfaWQgPSBjdXJfaXRlbS0+cGxheWVyLmNoYXJzZXRfaWQ7Ci0gICAgICAgICAgbWVtY3B5KCYoaXRlbS51LnBsYXllci5mZWF0dXJlcyksICYoY3VyX2l0ZW0tPnBsYXllci5mZWF0dXJlcyksCi0gICAgICAgICAgICAgICAgIHNpemVvZihjdXJfaXRlbS0+cGxheWVyLmZlYXR1cmVzKSk7Ci0gICAgICAgICAgaXRlbS51LnBsYXllci5tYWpvcl90eXBlID0gY3VyX2l0ZW0tPnBsYXllci5tYWpvcl90eXBlOwotICAgICAgICAgIGl0ZW0udS5wbGF5ZXIuc3ViX3R5cGUgPSBjdXJfaXRlbS0+cGxheWVyLnN1Yl90eXBlOwotICAgICAgICAgIGl0ZW0udS5wbGF5ZXIucGxheV9zdGF0dXMgPSBjdXJfaXRlbS0+cGxheWVyLnBsYXlfc3RhdHVzOwotICAgICAgICAgIGl0ZW0udS5wbGF5ZXIucGxheWVyX2lkID0gY3VyX2l0ZW0tPnBsYXllci5wbGF5ZXJfaWQ7Ci0gICAgICAgICAgaXRlbS51LnBsYXllci5uYW1lLnBfc3RyID0gY3VyX2l0ZW0tPnBsYXllci5uYW1lOwotICAgICAgICAgIGl0ZW0udS5wbGF5ZXIubmFtZS5zdHJfbGVuID0KLSAgICAgICAgICAgICAgKHVpbnQxNl90KXN0cmxlbigoY2hhciopKGN1cl9pdGVtLT5wbGF5ZXIubmFtZSkpOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZSQ19JVEVNX0ZPTERFUjogewotICAgICAgICAgIG1lbWNweShpdGVtLnUuZm9sZGVyLnVpZCwgY3VyX2l0ZW0tPmZvbGRlci51aWQsIHNpemVvZih0QVZSQ19VSUQpKTsKLSAgICAgICAgICBpdGVtLnUuZm9sZGVyLnR5cGUgPSBjdXJfaXRlbS0+Zm9sZGVyLnR5cGU7Ci0gICAgICAgICAgaXRlbS51LmZvbGRlci5wbGF5YWJsZSA9IGN1cl9pdGVtLT5mb2xkZXIucGxheWFibGU7Ci0gICAgICAgICAgaXRlbS51LmZvbGRlci5uYW1lLmNoYXJzZXRfaWQgPSBBVlJDX0NIQVJTRVRfSURfVVRGODsKLSAgICAgICAgICBpdGVtLnUuZm9sZGVyLm5hbWUuc3RyX2xlbiA9IHN0cmxlbigoY2hhciopY3VyX2l0ZW0tPmZvbGRlci5uYW1lKTsKLSAgICAgICAgICBpdGVtLnUuZm9sZGVyLm5hbWUucF9zdHIgPSBjdXJfaXRlbS0+Zm9sZGVyLm5hbWU7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVlJDX0lURU1fTUVESUE6IHsKLSAgICAgICAgICB0QVZSQ19BVFRSX0VOVFJZIGF0dHJfdmFsc1tCVFJDX01BWF9FTEVNX0FUVFJfU0laRV0gPSB7fTsKLQotICAgICAgICAgIG1lbWNweShpdGVtLnUubWVkaWEudWlkLCBjdXJfaXRlbS0+bWVkaWEudWlkLCBzaXplb2YodEFWUkNfVUlEKSk7Ci0gICAgICAgICAgaXRlbS51Lm1lZGlhLnR5cGUgPSBjdXJfaXRlbS0+bWVkaWEudHlwZTsKLSAgICAgICAgICBpdGVtLnUubWVkaWEubmFtZS5jaGFyc2V0X2lkID0gY3VyX2l0ZW0tPm1lZGlhLmNoYXJzZXRfaWQ7Ci0gICAgICAgICAgaXRlbS51Lm1lZGlhLm5hbWUuc3RyX2xlbiA9IHN0cmxlbigoY2hhciopY3VyX2l0ZW0tPm1lZGlhLm5hbWUpOwotICAgICAgICAgIGl0ZW0udS5tZWRpYS5uYW1lLnBfc3RyID0gY3VyX2l0ZW0tPm1lZGlhLm5hbWU7Ci0gICAgICAgICAgaXRlbS51Lm1lZGlhLmF0dHJfY291bnQgPSBjdXJfaXRlbS0+bWVkaWEubnVtX2F0dHJzOwotCi0gICAgICAgICAgLyogSGFuZGxlIGF0dHJpYnV0ZXMgb2YgZ2l2ZW4gaXRlbSAqLwotICAgICAgICAgIGlmIChpdGVtLnUubWVkaWEuYXR0cl9jb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBpdGVtLnUubWVkaWEucF9hdHRyX2xpc3QgPSBOVUxMOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1zZXQoJmF0dHJfdmFscywgMCwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YodEFWUkNfQVRUUl9FTlRSWSkgKiBCVFJDX01BWF9FTEVNX0FUVFJfU0laRSk7Ci0gICAgICAgICAgICBmaWxsX2F2cmNfYXR0cl9lbnRyeShhdHRyX3ZhbHMsIGl0ZW0udS5tZWRpYS5hdHRyX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2l0ZW0tPm1lZGlhLnBfYXR0cnMpOwotICAgICAgICAgICAgaXRlbS51Lm1lZGlhLnBfYXR0cl9saXN0ID0gYXR0cl92YWxzOwotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFVua25vd24gaXRlbV90eXBlOiAlZC4gSW50ZXJuYWwgRXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfaXRlbXMtPml0ZW1fdHlwZSk7Ci0gICAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgICB9IGJyZWFrOwotICAgICAgfQotCi0gICAgICBhdnJjX3JzcC5nZXRfaXRlbXMucF9pdGVtX2xpc3QgPSAmaXRlbTsKLQotICAgICAgLyogQWRkIGN1cnJlbnQgaXRlbSB0byBidWZmZXIgYW5kIGJ1aWxkIHJlc3BvbnNlIGlmIG5vIGVycm9yIGluIGl0ZW0gdHlwZQotICAgICAgICovCi0gICAgICBpZiAoc3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgICAgIC8qIFJlamVjdCByZXNwb25zZSBkdWUgdG8gZXJyb3Igb2NjdXJlZCBmb3IgdW5rbm93biBpdGVtX3R5cGUsIGJyZWFrIHRoZQotICAgICAgICAgKiBsb29wICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpbnQgbGVuX2JlZm9yZSA9IHBfbXNnID8gcF9tc2ctPmxlbiA6IDA7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogaXRlbV9jbnQ6ICVkIGxlbjogJWQiLCBfX2Z1bmNfXywgaXRlbV9jbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbl9iZWZvcmUpOwotICAgICAgc3RhdHVzID0gQVZSQ19CbGRSZXNwb25zZShwX2Rldi0+cmNfaGFuZGxlLCAmYXZyY19yc3AsICZwX21zZyk7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQnVpbGQgcnNwIHN0YXR1czogJWQgbGVuOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgIChwX21zZyA/IHBfbXNnLT5sZW4gOiAwKSk7Ci0gICAgICBpbnQgbGVuX2FmdGVyID0gcF9tc2cgPyBwX21zZy0+bGVuIDogMDsKLSAgICAgIGlmIChzdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IgfHwgbGVuX2JlZm9yZSA9PSBsZW5fYWZ0ZXIpIHsKLSAgICAgICAgLyogRXJyb3Igb2NjdXJlZCBpbiBidWlsZCByZXNwb25zZSBvciB3ZSByYW4gb3V0IG9mIGJ1ZmZlciBzbyBicmVhayB0aGUKLSAgICAgICAgICogbG9vcCAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzZXR0aW5nIHRoZSBlcnJvciBzdGF0dXMgKi8KLSAgICBhdnJjX3JzcC5nZXRfaXRlbXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyogaWYgcGFja2V0IGJ1aWx0IHN1Y2Nlc3NmdWxseSwgc2VuZCB0aGUgYnVpbHQgaXRlbXMgdG8gQlRBIGxheWVyICovCi0gIGlmIChzdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICBjb2RlID0gcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9HRVRfRk9MREVSX0lURU1TX1JTUF0uY3R5cGU7Ci0gICAgY3R5cGUgPSBnZXRfcnNwX3R5cGVfY29kZShhdnJjX3JzcC5nZXRfaXRlbXMuc3RhdHVzLCBjb2RlKTsKLSAgICBCVEFfQXZNZXRhUnNwKHBfZGV2LT5yY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9GT0xERVJfSVRFTVNfUlNQXS5sYWJlbCwgY3R5cGUsCi0gICAgICAgICAgICAgICAgICBwX21zZyk7Ci0gIH0gZWxzZSAvKiBFcnJvciBvY2N1cmVkLCBzZW5kIHJlamVjdCByZXNwb25zZSAqLwotICB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIHN0YXR1czogMHglMDJYLiBTZW5kaW5nIHJlamVjdCByc3AiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGF2cmNfcnNwLnJzcC5zdGF0dXMpOwotICAgIHNlbmRfcmVqZWN0X3Jlc3BvbnNlKAotICAgICAgICBwX2Rldi0+cmNfaGFuZGxlLCBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9GT0xERVJfSVRFTVNfUlNQXS5sYWJlbCwKLSAgICAgICAgYXZyY19yc3AucGR1LCBhdnJjX3JzcC5nZXRfaXRlbXMuc3RhdHVzLCBhdnJjX3JzcC5nZXRfaXRlbXMub3Bjb2RlKTsKLSAgfQotCi0gIC8qIFJlc2V0IHZhbHVlcyBmb3IgY3VycmVudCBwZHUuICovCi0gIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfR0VUX0ZPTERFUl9JVEVNU19SU1BdLmN0eXBlID0gMDsKLSAgcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9HRVRfRk9MREVSX0lURU1TX1JTUF0ubGFiZWwgPSAwOwotICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9GT0xERVJfSVRFTVNfUlNQXS5pc19yc3BfcGVuZGluZyA9IGZhbHNlOwotCi0gIHJldHVybiBzdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZXRfYWRkcmVzc2VkX3BsYXllcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIHRvIHNldCB0aGUgYWRkcmVzc2VkIHBsYXllciBmb3Igc3BlY2lmaWVkIG1lZGlhCi0gKiAgICAgICAgICAgICAgICAgIHBsYXllciBiYXNlZCBvbiBpZCBpbiB0aGUgbWVkaWEgcGxheWVyIGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICogICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX05PVF9SRUFEWSAtIHdoZW4gUkMgaXMgbm90IGNvbm5lY3RlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTICAgLSBhbHdheXMgaWYgUkMgaXMgY29ubmVjdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHNldF9hZGRyZXNzZWRfcGxheWVyX3JzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpIHsKLSAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICBhdnJjX3JzcC5hZGRyX3BsYXllci5wZHUgPSBBVlJDX1BEVV9TRVRfQUREUkVTU0VEX1BMQVlFUjsKLSAgYXZyY19yc3AuYWRkcl9wbGF5ZXIub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX1NFVF9BRERSRVNTRURfUExBWUVSKTsKLSAgYXZyY19yc3AuYWRkcl9wbGF5ZXIuc3RhdHVzID0gc3RhdHVzX2NvZGVfbWFwW3JzcF9zdGF0dXNdOwotCi0gIC8qIFNlbmQgdGhlIHJlc3BvbnNlLiAqLwotICBzZW5kX21ldGFtc2dfcnNwKHBfZGV2LCBJRFhfU0VUX0FERFJfUExBWUVSX1JTUCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX1NFVF9BRERSX1BMQVlFUl9SU1BdLmxhYmVsLAotICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfU0VUX0FERFJfUExBWUVSX1JTUF0uY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgJmF2cmNfcnNwKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNldF9icm93c2VkX3BsYXllcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIHRvIHNldCB0aGUgYnJvd3NlZCBwbGF5ZXIgY29tbWFuZCB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJyb3dzZWQgcGF0aCBvZiB0aGUgbWVkaWEgcGxheWVyLiBCeSBkZWZhdWx0LAotICogICAgICAgICAgICAgICAgICBjdXJyZW50X3BhdGggPSByb290IGFuZCBmb2xkZXJfZGVwdGggPSAwIGZvcgotICogICAgICAgICAgICAgICAgICBldmVyeSBzZXRfYnJvd3NlZF9wbGF5ZXIgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfTk9UX1JFQURZIC0gd2hlbiBSQyBpcyBub3QgY29ubmVjdGVkLgotICogICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgICAtIGlmIFJDIGlzIGNvbm5lY3RlZCBhbmQgcmVwb25zZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfVU5IQU5ETEVEIC0gd2hlbiByc3AgaXMgbm90IHBlbmRpbmcgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2Jyb3dzZWRfcGxheWVyIFBEVQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBzZXRfYnJvd3NlZF9wbGF5ZXJfcnNwKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1faXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaGFyc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmb2xkZXJfZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2JyX2ZvbGRlcl9uYW1lX3QqIHBfZm9sZGVycykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgdEFWUkNfTkFNRSBpdGVtOwotICBCVF9IRFIqIHBfbXNnID0gTlVMTDsKLSAgdEJUQV9BVl9DT0RFIGNvZGUgPSAwOwotICB0QlRBX0FWX0NPREUgY3R5cGUgPSAwOwotICB1bnNpZ25lZCBpbnQgaXRlbV9jbnQ7Ci0gIHRBVlJDX1NUUyBzdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGJkX2FkZHIpOwotCi0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgbWVtc2V0KCZhdnJjX3JzcCwgMCwgc2l6ZW9mKHRBVlJDX1JFU1BPTlNFKSk7Ci0gIG1lbXNldCgmaXRlbSwgMCwgc2l6ZW9mKHRBVlJDX05BTUUpKTsKLQotICBhdnJjX3JzcC5icl9wbGF5ZXIuc3RhdHVzID0gc3RhdHVzX2NvZGVfbWFwW3JzcF9zdGF0dXNdOwotICBhdnJjX3JzcC5icl9wbGF5ZXIucGR1ID0gQVZSQ19QRFVfU0VUX0JST1dTRURfUExBWUVSOwotICBhdnJjX3JzcC5icl9wbGF5ZXIub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUik7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJzcF9zdGF0dXM6IDB4JTAyWCBhdnJjX3JzcC5icl9wbGF5ZXIuc3RhdHVzOiAweCUwMlgiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByc3Bfc3RhdHVzLCBhdnJjX3JzcC5icl9wbGF5ZXIuc3RhdHVzKTsKLQotICAvKiBjaGVjayBpZiByc3AgdG8gcHJldmlvdXMgY21kIHdhcyBjb21wbGV0ZWQgKi8KLSAgaWYgKCFwX2Rldi0+cmNfcGR1X2luZm9bSURYX1NFVF9CUk9XU0VEX1BMQVlFUl9SU1BdLmlzX3JzcF9wZW5kaW5nKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogTm90IHNlbmRpbmcgcmVzcG9uc2UgYXMgbm8gUERVIHdhcyByZWdpc3RlcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBCVF9TVEFUVVNfVU5IQU5ETEVEOwotICB9Ci0KLSAgaWYgKEFWUkNfU1RTX05PX0VSUk9SID09IGF2cmNfcnNwLmdldF9pdGVtcy5zdGF0dXMpIHsKLSAgICBhdnJjX3JzcC5icl9wbGF5ZXIubnVtX2l0ZW1zID0gbnVtX2l0ZW1zOwotICAgIGF2cmNfcnNwLmJyX3BsYXllci5jaGFyc2V0X2lkID0gY2hhcnNldF9pZDsKLSAgICBhdnJjX3JzcC5icl9wbGF5ZXIuZm9sZGVyX2RlcHRoID0gZm9sZGVyX2RlcHRoOwotICAgIGF2cmNfcnNwLmJyX3BsYXllci5wX2ZvbGRlcnMgPSAodEFWUkNfTkFNRSopcF9mb2xkZXJzOwotCi0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGZvbGRlcl9kZXB0aDogMHglMDJYIG51bV9pdGVtczogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGZvbGRlcl9kZXB0aCwgbnVtX2l0ZW1zKTsKLQotICAgIGlmIChmb2xkZXJfZGVwdGggPiAwKSB7Ci0gICAgICAvKiBJdGVyYXRpdmVseSBidWlsZCByZXNwb25zZSBmb3IgYWxsIGZvbGRlcnMgYWNyb3NzIGZvbGRlciBkZXB0aCB1cHRvCi0gICAgICAgKiBjdXJyZW50IHBhdGggKi8KLSAgICAgIGF2cmNfcnNwLmJyX3BsYXllci5mb2xkZXJfZGVwdGggPSAxOwotICAgICAgZm9yIChpdGVtX2NudCA9IDA7IGl0ZW1fY250IDwgZm9sZGVyX2RlcHRoOyBpdGVtX2NudCsrKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBpdGVyYXRpb246ICVkIiwgX19mdW5jX18sIGl0ZW1fY250KTsKLSAgICAgICAgaXRlbS5zdHJfbGVuID0gcF9mb2xkZXJzW2l0ZW1fY250XS5zdHJfbGVuOwotICAgICAgICBpdGVtLnBfc3RyID0gcF9mb2xkZXJzW2l0ZW1fY250XS5wX3N0cjsKLSAgICAgICAgYXZyY19yc3AuYnJfcGxheWVyLnBfZm9sZGVycyA9ICZpdGVtOwotCi0gICAgICAgIC8qIEFkZCBjdXJyZW50IGl0ZW0gdG8gYnVmZmVyIGFuZCBidWlsZCByZXNwb25zZSAqLwotICAgICAgICBzdGF0dXMgPSBBVlJDX0JsZFJlc3BvbnNlKHBfZGV2LT5yY19oYW5kbGUsICZhdnJjX3JzcCwgJnBfbXNnKTsKLSAgICAgICAgaWYgKEFWUkNfU1RTX05PX0VSUk9SICE9IHN0YXR1cykgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IEJ1aWxkIHJzcCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgICAgLyogaWYgdGhlIGJ1aWxkIGZhaWxzLCBpdCBpcyBsaWtlbHkgdGhhdCB3ZSByYW4gb3V0IG9mIGJ1ZmZlci4gc28gaWYKLSAgICAgICAgKiB3ZSBoYXZlCi0gICAgICAgICogc29tZSBpdGVtcyB0byBzZW5kLCByZXNldCB0aGlzIGVycm9yIHRvIG5vIGVycm9yIGZvciBzZW5kaW5nIHdoYXQgd2UKLSAgICAgICAgKiBoYXZlICovCi0gICAgICAgICAgaWYgKGl0ZW1fY250ID4gMCkgc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0KLSAgICAgICAgICAvKiBFcnJvciBvY2N1cmVkIGluIGJ1aWxkIHJlc3BvbnNlIHNvIGJyZWFrIHRoZSBsb29wICovCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgLyogY3VycmVudCBwYXRoIGlzIHJvb3QgZm9sZGVyLCBubyBmb2xkZXJzIG5hdmlnYXRlZCB5ZXQgKi8KLSAgICB7Ci0gICAgICBzdGF0dXMgPSBBVlJDX0JsZFJlc3BvbnNlKHBfZGV2LT5yY19oYW5kbGUsICZhdnJjX3JzcCwgJnBfbXNnKTsKLSAgICB9Ci0KLSAgICAvKiBzZXR0aW5nIHRoZSBlcnJvciBzdGF0dXMgKi8KLSAgICBhdnJjX3JzcC5icl9wbGF5ZXIuc3RhdHVzID0gc3RhdHVzOwotICB9IGVsc2UgLyogZXJyb3IgcmVjZWl2ZWQgZnJvbSBhYm92ZSBsYXllciAqLwotICB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiJXM6IEVycm9yIGluIHBhcnNpbmcgdGhlIHJlY2VpdmVkIHNldGJyb3dzZWQgY29tbWFuZC4gc3RhdHVzOiAweCUwMngiLAotICAgICAgICBfX2Z1bmNfXywgYXZyY19yc3AuYnJfcGxheWVyLnN0YXR1cyk7Ci0gICAgc3RhdHVzID0gYXZyY19yc3AuYnJfcGxheWVyLnN0YXR1czsKLSAgfQotCi0gIC8qIGlmIHBhY2tldCBidWlsdCBzdWNjZXNzZnVsbHksIHNlbmQgdGhlIGJ1aWx0IGl0ZW1zIHRvIEJUQSBsYXllciAqLwotICBpZiAoc3RhdHVzID09IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgY29kZSA9IHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfU0VUX0JST1dTRURfUExBWUVSX1JTUF0uY3R5cGU7Ci0gICAgY3R5cGUgPSBnZXRfcnNwX3R5cGVfY29kZShhdnJjX3JzcC5icl9wbGF5ZXIuc3RhdHVzLCBjb2RlKTsKLSAgICBCVEFfQXZNZXRhUnNwKHBfZGV2LT5yY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX1NFVF9CUk9XU0VEX1BMQVlFUl9SU1BdLmxhYmVsLCBjdHlwZSwKLSAgICAgICAgICAgICAgICAgIHBfbXNnKTsKLSAgfSBlbHNlIC8qIEVycm9yIG9jY3VyZWQsIHNlbmQgcmVqZWN0IHJlc3BvbnNlICovCi0gIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3Igc3RhdHVzOiAweCUwMlguIFNlbmRpbmcgcmVqZWN0IHJzcCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYXZyY19yc3AuYnJfcGxheWVyLnN0YXR1cyk7Ci0gICAgc2VuZF9yZWplY3RfcmVzcG9uc2UoCi0gICAgICAgIHBfZGV2LT5yY19oYW5kbGUsIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfU0VUX0JST1dTRURfUExBWUVSX1JTUF0ubGFiZWwsCi0gICAgICAgIGF2cmNfcnNwLnBkdSwgYXZyY19yc3AuYnJfcGxheWVyLnN0YXR1cywgYXZyY19yc3AuZ2V0X2l0ZW1zLm9wY29kZSk7Ci0gIH0KLQotICAvKiBSZXNldCB2YWx1ZXMgZm9yIHNldF9icm93c2VkX3BsYXllciBwZHUuKi8KLSAgcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9TRVRfQlJPV1NFRF9QTEFZRVJfUlNQXS5jdHlwZSA9IDA7Ci0gIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfU0VUX0JST1dTRURfUExBWUVSX1JTUF0ubGFiZWwgPSAwOwotICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX1NFVF9CUk9XU0VEX1BMQVlFUl9SU1BdLmlzX3JzcF9wZW5kaW5nID0gZmFsc2U7Ci0KLSAgcmV0dXJuIHN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUiA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBjaGFuZ2VfcGF0aF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIHRvIHRoZSBjaGFuZ2UgcGF0aCBjb21tYW5kIHdoaWNoCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY2hhbmdlZCBwYXRoLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19OT1RfUkVBRFkgLSB3aGVuIFJDIGlzIG5vdCBjb25uZWN0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyAgIC0gYWx3YXlzIGlmIFJDIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBjaGFuZ2VfcGF0aF9yc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1faXRlbXMpIHsKLSAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICBhdnJjX3JzcC5jaGdfcGF0aC5wZHUgPSBBVlJDX1BEVV9DSEFOR0VfUEFUSDsKLSAgYXZyY19yc3AuY2hnX3BhdGgub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX0NIQU5HRV9QQVRIKTsKLSAgYXZyY19yc3AuY2hnX3BhdGgubnVtX2l0ZW1zID0gbnVtX2l0ZW1zOwotICBhdnJjX3JzcC5jaGdfcGF0aC5zdGF0dXMgPSBzdGF0dXNfY29kZV9tYXBbcnNwX3N0YXR1c107Ci0KLSAgLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCi0gIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIElEWF9DSEdfUEFUSF9SU1AsCi0gICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9DSEdfUEFUSF9SU1BdLmxhYmVsLAotICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfQ0hHX1BBVEhfUlNQXS5jdHlwZSwgJmF2cmNfcnNwKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNlYXJjaF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIHRvIHNlYXJjaCBhIHN0cmluZyBmcm9tIG1lZGlhIGNvbnRlbnQgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfTk9UX1JFQURZIC0gd2hlbiBSQyBpcyBub3QgY29ubmVjdGVkLgotICogICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgICAtIGFsd2F5cyBpZiBSQyBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2VhcmNoX3JzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLCB1aW50MzJfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9pdGVtcykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGJkX2FkZHIpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIGF2cmNfcnNwLnNlYXJjaC5wZHUgPSBBVlJDX1BEVV9TRUFSQ0g7Ci0gIGF2cmNfcnNwLnNlYXJjaC5vcGNvZGUgPSBvcGNvZGVfZnJvbV9wZHUoQVZSQ19QRFVfU0VBUkNIKTsKLSAgYXZyY19yc3Auc2VhcmNoLm51bV9pdGVtcyA9IG51bV9pdGVtczsKLSAgYXZyY19yc3Auc2VhcmNoLnVpZF9jb3VudGVyID0gdWlkX2NvdW50ZXI7Ci0gIGF2cmNfcnNwLnNlYXJjaC5zdGF0dXMgPSBzdGF0dXNfY29kZV9tYXBbcnNwX3N0YXR1c107Ci0KLSAgLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCi0gIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIElEWF9TRUFSQ0hfUlNQLAotICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfU0VBUkNIX1JTUF0ubGFiZWwsCi0gICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9TRUFSQ0hfUlNQXS5jdHlwZSwgJmF2cmNfcnNwKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfaXRlbV9hdHRyX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzcG9uc2UgdG8gdGhlIGdldCBpdGVtJ3MgYXR0cmlidXRlcyBjb21tYW5kIHdoaWNoCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIG51bWJlciBvZiBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMgbGlzdCBpbiB0ZXh0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19OT1RfUkVBRFkgLSB3aGVuIFJDIGlzIG5vdCBjb25uZWN0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyAgIC0gYWx3YXlzIGlmIFJDIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfaXRlbV9hdHRyX3JzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cywgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCogcF9hdHRycykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgdEFWUkNfQVRUUl9FTlRSWSBpdGVtX2F0dHJzW0JUUkNfTUFYX0VMRU1fQVRUUl9TSVpFXTsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGJkX2FkZHIpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIG1lbXNldChpdGVtX2F0dHJzLCAwLCBzaXplb2YodEFWUkNfQVRUUl9FTlRSWSkgKiBudW1fYXR0cik7Ci0KLSAgYXZyY19yc3AuZ2V0X2F0dHJzLnN0YXR1cyA9IHN0YXR1c19jb2RlX21hcFtyc3Bfc3RhdHVzXTsKLSAgaWYgKHJzcF9zdGF0dXMgPT0gQlRSQ19TVFNfTk9fRVJST1IpIHsKLSAgICBmaWxsX2F2cmNfYXR0cl9lbnRyeShpdGVtX2F0dHJzLCBudW1fYXR0ciwgcF9hdHRycyk7Ci0gIH0KLQotICBhdnJjX3JzcC5nZXRfYXR0cnMubnVtX2F0dHJzID0gbnVtX2F0dHI7Ci0gIGF2cmNfcnNwLmdldF9hdHRycy5wX2F0dHJzID0gaXRlbV9hdHRyczsKLSAgYXZyY19yc3AuZ2V0X2F0dHJzLnBkdSA9IEFWUkNfUERVX0dFVF9JVEVNX0FUVFJJQlVURVM7Ci0gIGF2cmNfcnNwLmdldF9hdHRycy5vcGNvZGUgPSBvcGNvZGVfZnJvbV9wZHUoQVZSQ19QRFVfR0VUX0lURU1fQVRUUklCVVRFUyk7Ci0KLSAgLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCi0gIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIElEWF9HRVRfSVRFTV9BVFRSX1JTUCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9JVEVNX0FUVFJfUlNQXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9JVEVNX0FUVFJfUlNQXS5jdHlwZSwgJmF2cmNfcnNwKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGFkZF90b19ub3dfcGxheWluZ19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIHRvIGNvbW1hbmQgZm9yIGFkZGluZyBzcGVjaWFmaWVkIG1lZGlhIGl0ZW0KLSAqICAgICAgICAgICAgICAgICAgdG8gTm93IFBsYXlpbmcgcXVldWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICogICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX05PVF9SRUFEWSAtIHdoZW4gUkMgaXMgbm90IGNvbm5lY3RlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTICAgLSBhbHdheXMgaWYgUkMgaXMgY29ubmVjdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGFkZF90b19ub3dfcGxheWluZ19yc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3JzcDsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGJkX2FkZHIpOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIGF2cmNfcnNwLmFkZF90b19wbGF5LnBkdSA9IEFWUkNfUERVX0FERF9UT19OT1dfUExBWUlORzsKLSAgYXZyY19yc3AuYWRkX3RvX3BsYXkub3Bjb2RlID0gb3Bjb2RlX2Zyb21fcGR1KEFWUkNfUERVX0FERF9UT19OT1dfUExBWUlORyk7Ci0gIGF2cmNfcnNwLmFkZF90b19wbGF5LnN0YXR1cyA9IHN0YXR1c19jb2RlX21hcFtyc3Bfc3RhdHVzXTsKLQotICAvKiBTZW5kIHRoZSByZXNwb25zZS4gKi8KLSAgc2VuZF9tZXRhbXNnX3JzcChwX2RldiwgSURYX0FERF9UT19OT1dfUExBWUlOR19SU1AsCi0gICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX3BkdV9pbmZvW0lEWF9BRERfVE9fTk9XX1BMQVlJTkdfUlNQXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0FERF9UT19OT1dfUExBWUlOR19SU1BdLmN0eXBlLAotICAgICAgICAgICAgICAgICAgICZhdnJjX3JzcCk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwbGF5X2l0ZW1fcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXNwb25zZSB0byBjb21tYW5kIGZvciBwbGF5aW5nIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfTk9UX1JFQURZIC0gd2hlbiBSQyBpcyBub3QgY29ubmVjdGVkLgotICogICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgICAtIGFsd2F5cyBpZiBSQyBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgcGxheV9pdGVtX3JzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzKSB7Ci0gIHRBVlJDX1JFU1BPTlNFIGF2cmNfcnNwOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgYXZyY19yc3AucGxheV9pdGVtLnBkdSA9IEFWUkNfUERVX1BMQVlfSVRFTTsKLSAgYXZyY19yc3AucGxheV9pdGVtLm9wY29kZSA9IG9wY29kZV9mcm9tX3BkdShBVlJDX1BEVV9QTEFZX0lURU0pOwotICBhdnJjX3JzcC5wbGF5X2l0ZW0uc3RhdHVzID0gc3RhdHVzX2NvZGVfbWFwW3JzcF9zdGF0dXNdOwotCi0gIC8qIFNlbmQgdGhlIHJlc3BvbnNlLiAqLwotICBzZW5kX21ldGFtc2dfcnNwKHBfZGV2LCBJRFhfUExBWV9JVEVNX1JTUCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX1BMQVlfSVRFTV9SU1BdLmxhYmVsLAotICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19wZHVfaW5mb1tJRFhfUExBWV9JVEVNX1JTUF0uY3R5cGUsICZhdnJjX3JzcCk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfdG90YWxfbnVtX29mX2l0ZW1zX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmVzcG9uc2UgdG8gY29tbWFuZCB0byBnZXQgdGhlIE51bWJlciBvZiBJdGVtcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgc2VsZWN0ZWQgZm9sZGVyIGF0IHRoZSBzZWxlY3RlZCBzY29wZQotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqICAgICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19OT1RfUkVBRFkgLSB3aGVuIFJDIGlzIG5vdCBjb25uZWN0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyAgIC0gYWx3YXlzIGlmIFJDIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfdG90YWxfbnVtX29mX2l0ZW1zX3JzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1faXRlbXMpIHsKLSAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICBhdnJjX3JzcC5nZXRfbnVtX29mX2l0ZW1zLnBkdSA9IEFWUkNfUERVX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVM7Ci0gIGF2cmNfcnNwLmdldF9udW1fb2ZfaXRlbXMub3Bjb2RlID0KLSAgICAgIG9wY29kZV9mcm9tX3BkdShBVlJDX1BEVV9HRVRfVE9UQUxfTlVNX09GX0lURU1TKTsKLSAgYXZyY19yc3AuZ2V0X251bV9vZl9pdGVtcy5udW1faXRlbXMgPSBudW1faXRlbXM7Ci0gIGF2cmNfcnNwLmdldF9udW1fb2ZfaXRlbXMudWlkX2NvdW50ZXIgPSB1aWRfY291bnRlcjsKLSAgYXZyY19yc3AuZ2V0X251bV9vZl9pdGVtcy5zdGF0dXMgPSBzdGF0dXNfY29kZV9tYXBbcnNwX3N0YXR1c107Ci0KLSAgLyogU2VuZCB0aGUgcmVzcG9uc2UuICovCi0gIHNlbmRfbWV0YW1zZ19yc3AocF9kZXYsIElEWF9HRVRfVE9UQUxfTlVNX09GX0lURU1TX1JTUCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVNfUlNQXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfcGR1X2luZm9bSURYX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVNfUlNQXS5jdHlwZSwKLSAgICAgICAgICAgICAgICAgICAmYXZyY19yc3ApOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2V0X3ZvbHVtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBjdXJyZW50IHZvbHVtZSBzZXR0aW5nIHRvIHJlbW90ZSBzaWRlLgotICogICAgICAgICAgICAgICAgICBTdXBwb3J0IGxpbWl0ZWQgdG8gU2V0QWJzb2x1dGVWb2x1bWUKLSAqICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc3VwcG9ydCBSZWxhdGl2ZSBWb2x1bWUgKEFWUkNQIDEuMCkuCi0gKiAgICAgICAgICAgICAgICAgIFdpdGggUmVsYXRlVm9sdW1lLCB3ZSB3aWxsIHNlbmQgVk9MVU1FX1VQL1ZPTFVNRV9ET1dOCi0gKiAgICAgICAgICAgICAgICAgIGFzIG9wcG9zZWQgdG8gYWJzb2x1dGUgdm9sdW1lIGxldmVsCi0gKiB2b2x1bWU6IFNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMC0xMjcuIGJpdDcgaXMgcmVzZXZlZCBhbmQgY2Fubm90IGJlIHNldAotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2V0X3ZvbHVtZSh1aW50OF90IHZvbHVtZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogdm9sdW1lOiAlZCIsIF9fZnVuY19fLCB2b2x1bWUpOwotICB0QVZSQ19TVFMgc3RhdHVzID0gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotCi0gIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IEJUSUZfUkNfTlVNX0NPTk47IGlkeCsrKSB7Ci0gICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSAmYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdOwotICAgIGlmICghcF9kZXYtPnJjX2Nvbm5lY3RlZCkgY29udGludWU7Ci0KLSAgICBpZiAocF9kZXYtPnJjX3ZvbHVtZSA9PSB2b2x1bWUpIHsKLSAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19ET05FOwotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHZvbHVtZSB2YWx1ZSBhbHJlYWR5IHNldCBlYXJsaWVyOiAweCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICgocF9kZXYtPnJjX3ZvbHVtZSA9PSB2b2x1bWUpIHx8Ci0gICAgICAgIHBfZGV2LT5yY19zdGF0ZSAhPQotICAgICAgICAgICAgQlRSQ19DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSA9PSAwKSB7Ci0gICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfTk9UX1JFQURZOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKCEocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQURWX0NUUkwpKQotICAgICAgY29udGludWU7Ci0KLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciBzdXBwb3J0cyBhYnNvbHV0ZSB2b2x1bWUuIG5ld1ZvbHVtZTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZvbHVtZSk7Ci0KLSAgICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gey52b2x1bWUgPSB7LnBkdSA9IEFWUkNfUERVX1NFVF9BQlNPTFVURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9wY29kZSA9IEFWUkNfT1BfVkVORE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudm9sdW1lID0gdm9sdW1lfX07Ci0KLSAgICBCVF9IRFIqIHBfbXNnID0gTlVMTDsKLSAgICBpZiAoQVZSQ19CbGRDb21tYW5kKCZhdnJjX2NtZCwgJnBfbXNnKSAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiJXM6IGZhaWxlZCB0byBidWlsZCBhYnNvbHV0ZSB2b2x1bWUgY29tbWFuZC4gc3RhdHVzOiAweCUwMngiLAotICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICByY190cmFuc2FjdGlvbl90KiBwX3RyYW5zYWN0aW9uID0gTlVMTDsKLSAgICBidF9zdGF0dXNfdCB0cmFuX3N0YXR1cyA9IGdldF90cmFuc2FjdGlvbihwX2RldiwgJnBfdHJhbnNhY3Rpb24pOwotCi0gICAgaWYgKHRyYW5fc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTIHx8ICFwX3RyYW5zYWN0aW9uKSB7Ci0gICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9tc2cpOwotICAgICAgQlRJRl9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiJXM6IGZhaWxlZCB0byBvYnRhaW4gdHJhbnNhY3Rpb24gZGV0YWlscy4gc3RhdHVzOiAweCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICB0cmFuX3N0YXR1cyk7Ci0gICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBtc2dyZXEgYmVpbmcgc2VudCBvdXQgd2l0aCBsYWJlbDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfdHJhbnNhY3Rpb24tPmxibCk7Ci0gICAgQlRBX0F2TWV0YUNtZChwX2Rldi0+cmNfaGFuZGxlLCBwX3RyYW5zYWN0aW9uLT5sYmwsIEFWUkNfQ01EX0NUUkwsIHBfbXNnKTsKLSAgICBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotICByZXR1cm4gKGJ0X3N0YXR1c190KXN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmVnaXN0ZXJfdm9sdW1lY2hhbmdlCi0gKgotICogRGVzY3JpcHRpb24gICAgIFJlZ2lzdGVyIGZvciB2b2x1bWUgY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfdm9sdW1lY2hhbmdlKHVpbnQ4X3QgbGJsLCBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBCVF9IRFIqIHBfbXNnID0gTlVMTDsKLSAgdEFWUkNfU1RTIEJsZFJlc3AgPSBBVlJDX1NUU19CQURfQ01EOwotICByY190cmFuc2FjdGlvbl90KiBwX3RyYW5zYWN0aW9uID0gTlVMTDsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogbGFiZWw6ICVkIiwgX19mdW5jX18sIGxibCk7Ci0KLSAgYXZyY19jbWQuY21kLm9wY29kZSA9IDB4MDA7Ci0gIGF2cmNfY21kLnBkdSA9IEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjsKLSAgYXZyY19jbWQucmVnX25vdGlmLmV2ZW50X2lkID0gQVZSQ19FVlRfVk9MVU1FX0NIQU5HRTsKLSAgYXZyY19jbWQucmVnX25vdGlmLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBhdnJjX2NtZC5yZWdfbm90aWYucGFyYW0gPSAwOwotCi0gIEJsZFJlc3AgPSBBVlJDX0JsZENvbW1hbmQoJmF2cmNfY21kLCAmcF9tc2cpOwotICBpZiAoQVZSQ19TVFNfTk9fRVJST1IgPT0gQmxkUmVzcCAmJiBwX21zZykgewotICAgIHBfdHJhbnNhY3Rpb24gPSBnZXRfdHJhbnNhY3Rpb25fYnlfbGJsKHBfZGV2LCBsYmwpOwotICAgIGlmIChwX3RyYW5zYWN0aW9uICE9IE5VTEwpIHsKLSAgICAgIEJUQV9Bdk1ldGFDbWQocF9kZXYtPnJjX2hhbmRsZSwgcF90cmFuc2FjdGlvbi0+bGJsLCBBVlJDX0NNRF9OT1RJRiwKLSAgICAgICAgICAgICAgICAgICAgcF9tc2cpOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEJUQV9Bdk1ldGFDbWQgY2FsbGVkIiwgX19mdW5jX18pOwotICAgIH0gZWxzZSB7Ci0gICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogdHJhbnNhY3Rpb24gbm90IG9idGFpbmVkIHdpdGggbGFiZWw6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGxibCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBmYWlsZWQgdG8gYnVpbGQgY29tbWFuZDogJWQiLCBfX2Z1bmNfXywgQmxkUmVzcCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGFuZGxlX3JjX21ldGFtc2dfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgUkMgbWV0YW1lc3NhZ2UgcmVzcG9uc2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoYW5kbGVfcmNfbWV0YW1zZ19yc3AodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIHRBVlJDX1JFU1BPTlNFIGF2cmNfcmVzcG9uc2UgPSB7MH07Ci0gIHVpbnQ4X3Qgc2NyYXRjaF9idWZbNTEyXSA9IHswfTsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogIiwgX19mdW5jX18pOwotCi0gIGlmIChBVlJDX09QX1ZFTkRPUiA9PSBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlICYmCi0gICAgICAoQVZSQ19SU1BfQ0hBTkdFRCA9PSBwbWV0YV9tc2ctPmNvZGUgfHwKLSAgICAgICBBVlJDX1JTUF9JTlRFUklNID09IHBtZXRhX21zZy0+Y29kZSB8fAotICAgICAgIEFWUkNfUlNQX0FDQ0VQVCA9PSBwbWV0YV9tc2ctPmNvZGUgfHwgQVZSQ19SU1BfUkVKID09IHBtZXRhX21zZy0+Y29kZSB8fAotICAgICAgIEFWUkNfUlNQX05PVF9JTVBMID09IHBtZXRhX21zZy0+Y29kZSkpIHsKLSAgICBzdGF0dXMgPSBBVlJDX1BhcnNSZXNwb25zZShwbWV0YV9tc2ctPnBfbXNnLCAmYXZyY19yZXNwb25zZSwgc2NyYXRjaF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjcmF0Y2hfYnVmKSk7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBjb2RlOiVkLCBldmVudCBJRDogJWQsIFBEVTogJXgsIHBhcnNpbmcgc3RhdHVzOiAlZCwgbGFiZWw6ICVkIiwKLSAgICAgICAgX19mdW5jX18sIHBtZXRhX21zZy0+Y29kZSwgYXZyY19yZXNwb25zZS5yZWdfbm90aWYuZXZlbnRfaWQsCi0gICAgICAgIGF2cmNfcmVzcG9uc2UucmVnX25vdGlmLnBkdSwgc3RhdHVzLCBwbWV0YV9tc2ctPmxhYmVsKTsKLQotICAgIGlmIChzdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICAgIGlmIChBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT04gPT0gYXZyY19yZXNwb25zZS5yc3AucGR1ICYmCi0gICAgICAgICAgQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSA9PSBhdnJjX3Jlc3BvbnNlLnJlZ19ub3RpZi5ldmVudF9pZCAmJgotICAgICAgICAgIHBfZGV2LT5yY192b2xfbGFiZWwgPT0gcG1ldGFfbXNnLT5sYWJlbCkgewotICAgICAgICBwX2Rldi0+cmNfdm9sX2xhYmVsID0gTUFYX0xBQkVMOwotICAgICAgICByZWxlYXNlX3RyYW5zYWN0aW9uKHBfZGV2LCBwX2Rldi0+cmNfdm9sX2xhYmVsKTsKLSAgICAgIH0gZWxzZSBpZiAoQVZSQ19QRFVfU0VUX0FCU09MVVRFX1ZPTFVNRSA9PSBhdnJjX3Jlc3BvbnNlLnJzcC5wZHUpIHsKLSAgICAgICAgcmVsZWFzZV90cmFuc2FjdGlvbihwX2RldiwgcG1ldGFfbXNnLT5sYWJlbCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTiA9PSBhdnJjX3Jlc3BvbnNlLnJzcC5wZHUgJiYKLSAgICAgICAgQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSA9PSBhdnJjX3Jlc3BvbnNlLnJlZ19ub3RpZi5ldmVudF9pZCAmJgotICAgICAgICBwX2Rldi0+cmNfdm9sX2xhYmVsICE9IHBtZXRhX21zZy0+bGFiZWwpIHsKLSAgICAgIC8vIEp1c3QgZGlzY2FyZCB0aGUgbWVzc2FnZSwgaWYgdGhlIGRldmljZSBzZW5kcyBiYWNrIHdpdGggYW4gaW5jb3JyZWN0Ci0gICAgICAvLyBsYWJlbAotICAgICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiJXM6IERpc2NhcmRpbmcgcmVnaXN0ZXIgbm90aWZpY2F0aW9uIGluIHJzcC5jb2RlOiAlZCBhbmQgbGFiZWw6ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgcG1ldGFfbXNnLT5jb2RlLCBwbWV0YV9tc2ctPmxhYmVsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoQVZSQ19QRFVfUkVHSVNURVJfTk9USUZJQ0FUSU9OID09IGF2cmNfcmVzcG9uc2UucnNwLnBkdSAmJgotICAgICAgICBBVlJDX0VWVF9WT0xVTUVfQ0hBTkdFID09IGF2cmNfcmVzcG9uc2UucmVnX25vdGlmLmV2ZW50X2lkICYmCi0gICAgICAgIChBVlJDX1JTUF9SRUogPT0gcG1ldGFfbXNnLT5jb2RlIHx8Ci0gICAgICAgICBBVlJDX1JTUF9OT1RfSU1QTCA9PSBwbWV0YV9tc2ctPmNvZGUpKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyByZW1vdmUgQWJzb2x1dGVWb2x1bWUgZmVhdHVyZSBmbGFnLiIsIF9fZnVuY19fKTsKLSAgICAgIHBfZGV2LT5yY19mZWF0dXJlcyAmPSB+QlRBX0FWX0ZFQVRfQURWX0NUUkw7Ci0gICAgICBoYW5kbGVfcmNfZmVhdHVyZXMocF9kZXYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAiJXM6IFJlY2VpdmVkIHZlbmRvciBkZXBlbmRlbnQgaW4gYWR2IGN0cmwgcnNwLiBjb2RlOiAlZCBsZW46ICVkLiBOb3QgIgotICAgICAgICAicHJvY2Vzc2luZyBpdC4iLAotICAgICAgICBfX2Z1bmNfXywgcG1ldGFfbXNnLT5jb2RlLCBwbWV0YV9tc2ctPmxlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTiA9PSBhdnJjX3Jlc3BvbnNlLnJzcC5wZHUgJiYKLSAgICAgIEFWUkNfRVZUX1ZPTFVNRV9DSEFOR0UgPT0gYXZyY19yZXNwb25zZS5yZWdfbm90aWYuZXZlbnRfaWQgJiYKLSAgICAgIEFWUkNfUlNQX0NIQU5HRUQgPT0gcG1ldGFfbXNnLT5jb2RlKSB7Ci0gICAgLyogcmUtcmVnaXN0ZXIgZm9yIHZvbHVtZSBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCi0gICAgLy8gRG8gbm90IHJlLXJlZ2lzdGVyIGZvciByZWplY3RlZCBjYXNlLCBhcyBpdCBtaWdodCBnZXQgaW50byBlbmRsZXNzIGxvb3AKLSAgICByZWdpc3Rlcl92b2x1bWVjaGFuZ2UocF9kZXYtPnJjX3ZvbF9sYWJlbCwgcF9kZXYpOwotICB9IGVsc2UgaWYgKEFWUkNfUERVX1NFVF9BQlNPTFVURV9WT0xVTUUgPT0gYXZyY19yZXNwb25zZS5yc3AucGR1KSB7Ci0gICAgLyogZnJlZSB1cCB0aGUgbGFiZWwgaGVyZSAqLwotICAgIHJlbGVhc2VfdHJhbnNhY3Rpb24ocF9kZXYsIHBtZXRhX21zZy0+bGFiZWwpOwotICB9Ci0KLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IFBhc3NpbmcgcmVjZWl2ZWQgbWV0YW1zZyByZXNwb25zZSB0byBhcHAuIHBkdTogJXMiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkdW1wX3JjX3BkdShhdnJjX3Jlc3BvbnNlLnBkdSkpOwotICBidGlmX3JjX3Vwc3RyZWFtc19yc3BfZXZ0KCh1aW50MTZfdClhdnJjX3Jlc3BvbnNlLnJzcC5wZHUsICZhdnJjX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZXRhX21zZy0+Y29kZSwgcG1ldGFfbXNnLT5sYWJlbCwgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBpdGVyYXRlX3N1cHBvcnRlZF9ldmVudF9saXN0X2Zvcl9pbnRlcmltX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaXRlcmF0b3IgY2FsbGJhY2sgZnVuY3Rpb24gdG8gbWF0Y2ggdGhlIGV2ZW50IGFuZCBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgdGltZXIgY2xlYW51cAotICogUmV0dXJucyAgICAgICAgICB0cnVlIHRvIGNvbnRpbnVlIGl0ZXJhdGluZywgZmFsc2UgdG8gc3RvcAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgaXRlcmF0ZV9zdXBwb3J0ZWRfZXZlbnRfbGlzdF9mb3JfaW50ZXJpbV9yc3Aodm9pZCogZGF0YSwgdm9pZCogY2JfZGF0YSkgewotICB1aW50OF90KiBwX2V2ZW50X2lkOwotICBidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90KiBwX2V2ZW50ID0gKGJ0aWZfcmNfc3VwcG9ydGVkX2V2ZW50X3QqKWRhdGE7Ci0KLSAgcF9ldmVudF9pZCA9ICh1aW50OF90KiljYl9kYXRhOwotCi0gIGlmIChwX2V2ZW50LT5ldmVudF9pZCA9PSAqcF9ldmVudF9pZCkgewotICAgIHBfZXZlbnQtPnN0YXR1cyA9IGVJTlRFUklNOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaXRlcmF0ZV9zdXBwb3J0ZWRfZXZlbnRfbGlzdF9mb3JfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSXRlcmF0b3IgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRpbWVvdXQgaGFuZGxpbmcuCi0gKiAgICAgICAgICAgICAgICAgIEFzIHBhcnQgb2YgdGhlIGZhaWx1cmUgaGFuZGxpbmcsIGl0IHJlbGVhc2VzIHRoZQotICogICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiBsYWJlbCBhbmQgcmVtb3ZlcyB0aGUgZXZlbnQgZnJvbSBsaXN0LAotICogICAgICAgICAgICAgICAgICB0aGlzIGV2ZW50IHdpbGwgbm90IGJlIHJlcXVlc3RlZCBhZ2FpbiBkdXJpbmcKLSAqICAgICAgICAgICAgICAgICAgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uLgotICogUmV0dXJucyAgICAgICAgICBmYWxzZSB0byBzdG9wIGl0ZXJhdGluZywgdHJ1ZSB0byBjb250aW51ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgaXRlcmF0ZV9zdXBwb3J0ZWRfZXZlbnRfbGlzdF9mb3JfdGltZW91dCh2b2lkKiBkYXRhLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIHJjX2NvbnRleHRfdCogY250eHQgPSAocmNfY29udGV4dF90KiljYl9kYXRhOwotICB1aW50OF90IGxhYmVsID0gY250eHQtPmxhYmVsICYgMHhGRjsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBidGlmX3JjX2dldF9kZXZpY2VfYnlfYmRhKGNudHh0LT5yY19hZGRyKTsKLSAgYnRpZl9yY19zdXBwb3J0ZWRfZXZlbnRfdCogcF9ldmVudCA9IChidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90KilkYXRhOwotCi0gIGlmIChwX2V2ZW50LT5sYWJlbCA9PSBsYWJlbCkgewotICAgIGxpc3RfcmVtb3ZlKHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCwgcF9ldmVudCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByY19ub3RpZmljYXRpb25faW50ZXJpbV90aW1vdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEludGVyaW0gcmVzcG9uc2UgdGltZW91dCBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgICBSdW5zIHRoZSBpdGVyYXRvciB0byBjaGVjayBhbmQgY2xlYXIgdGhlIHRpbWVkIG91dCBldmVudC4KLSAqICAgICAgICAgICAgICAgICAgUHJvY2VlZHMgdG8gcmVnaXN0ZXIgZm9yIHRoZSB1bnJlZ2lzdGVyZWQgZXZlbnRzLgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcmNfbm90aWZpY2F0aW9uX2ludGVyaW1fdGltb3V0KHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgLyogRGV2aWNlIGRpc2Nvbm5lY3Rpb25zIGNsZWFyIHRoZSBldmVudCBsaXN0IGJ1dCBjYW4ndCBmcmVlIHRoZSB0aW1lciAqLwotICBpZiAocF9kZXYgPT0gTlVMTCB8fCBwX2Rldi0+cmNfc3VwcG9ydGVkX2V2ZW50X2xpc3QpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiB0aW1lb3V0IGZvciBudWxsIGRldmljZSBvciBldmVudCBsaXN0IiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxpc3Rfbm9kZV90KiBub2RlOwotICByY19jb250ZXh0X3QgY250eHQ7Ci0gIG1lbXNldCgmY250eHQsIDAsIHNpemVvZihyY19jb250ZXh0X3QpKTsKLSAgY250eHQubGFiZWwgPSBsYWJlbDsKLSAgY250eHQucmNfYWRkciA9IHBfZGV2LT5yY19hZGRyOwotCi0gIGxpc3RfZm9yZWFjaChwX2Rldi0+cmNfc3VwcG9ydGVkX2V2ZW50X2xpc3QsCi0gICAgICAgICAgICAgICBpdGVyYXRlX3N1cHBvcnRlZF9ldmVudF9saXN0X2Zvcl90aW1lb3V0LCAmY250eHQpOwotICAvKiBUaW1lb3V0IGhhcHBlbmVkIGZvciBpbnRlcmltIHJlc3BvbnNlIGZvciB0aGUgcmVnaXN0ZXJlZCBldmVudCwKLSAgICogY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGZvciByZWdpc3RyYXRpb24KLSAgICovCi0gIG5vZGUgPSBsaXN0X2JlZ2luKHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCk7Ci0gIHdoaWxlIChub2RlICE9IE5VTEwpIHsKLSAgICBidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90KiBwX2V2ZW50OwotCi0gICAgcF9ldmVudCA9IChidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90KilsaXN0X25vZGUobm9kZSk7Ci0gICAgaWYgKChwX2V2ZW50ICE9IE5VTEwpICYmIChwX2V2ZW50LT5zdGF0dXMgPT0gZU5PVF9SRUdJU1RFUkVEKSkgewotICAgICAgcmVnaXN0ZXJfZm9yX2V2ZW50X25vdGlmaWNhdGlvbihwX2V2ZW50LCBwX2Rldik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgbm9kZSA9IGxpc3RfbmV4dChub2RlKTsKLSAgfQotICAvKiBUb2RvLiBOZWVkIHRvIGluaXRpYXRlIGFwcGxpY2F0aW9uIHNldHRpbmdzIHF1ZXJ5IGlmIHRoaXMKLSAgICogaXMgdGhlIGxhc3QgZXZlbnQgcmVnaXN0cmF0aW9uLgotICAgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9yY19zdGF0dXNfY21kX3RpbWVvdXRfaGFuZGxlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUkMgc3RhdHVzIGNvbW1hbmQgdGltZW91dCBoYW5kbGVyIChSdW5zIGluIEJUSUYgY29udGV4dCkuCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX3JjX3N0YXR1c19jbWRfdGltZW91dF9oYW5kbGVyKFVOVVNFRF9BVFRSIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkYXRhKSB7Ci0gIGJ0aWZfcmNfdGltZXJfY29udGV4dF90KiBwX2NvbnRleHQ7Ci0gIHRBVlJDX1JFU1BPTlNFIGF2cmNfcmVzcG9uc2UgPSB7MH07Ci0gIHRCVEFfQVZfTUVUQV9NU0cgbWV0YV9tc2c7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gTlVMTDsKLQotICBwX2NvbnRleHQgPSAoYnRpZl9yY190aW1lcl9jb250ZXh0X3QqKWRhdGE7Ci0gIG1lbXNldCgmbWV0YV9tc2csIDAsIHNpemVvZih0QlRBX0FWX01FVEFfTVNHKSk7Ci0gIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShwX2NvbnRleHQtPnJjX2FkZHIpOwotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBwX2RldiBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBtZXRhX21zZy5yY19oYW5kbGUgPSBwX2Rldi0+cmNfaGFuZGxlOwotCi0gIHN3aXRjaCAocF9jb250ZXh0LT5yY19zdGF0dXNfY21kLnBkdV9pZCkgewotICAgIGNhc2UgQVZSQ19QRFVfUkVHSVNURVJfTk9USUZJQ0FUSU9OOgotICAgICAgcmNfbm90aWZpY2F0aW9uX2ludGVyaW1fdGltb3V0KHBfY29udGV4dC0+cmNfc3RhdHVzX2NtZC5sYWJlbCwgcF9kZXYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9DQVBBQklMSVRJRVM6Ci0gICAgICBhdnJjX3Jlc3BvbnNlLmdldF9jYXBzLnN0YXR1cyA9IEJUSUZfUkNfU1RTX1RJTUVPVVQ7Ci0gICAgICBoYW5kbGVfZ2V0X2NhcGFiaWxpdHlfcmVzcG9uc2UoJm1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfY2Fwcyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX0FUVFI6Ci0gICAgICBhdnJjX3Jlc3BvbnNlLmxpc3RfYXBwX2F0dHIuc3RhdHVzID0gQlRJRl9SQ19TVFNfVElNRU9VVDsKLSAgICAgIGhhbmRsZV9hcHBfYXR0cl9yZXNwb25zZSgmbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLmxpc3RfYXBwX2F0dHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0xJU1RfUExBWUVSX0FQUF9WQUxVRVM6Ci0gICAgICBhdnJjX3Jlc3BvbnNlLmxpc3RfYXBwX3ZhbHVlcy5zdGF0dXMgPSBCVElGX1JDX1NUU19USU1FT1VUOwotICAgICAgaGFuZGxlX2FwcF92YWxfcmVzcG9uc2UoJm1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5saXN0X2FwcF92YWx1ZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9DVVJfUExBWUVSX0FQUF9WQUxVRToKLSAgICAgIGF2cmNfcmVzcG9uc2UuZ2V0X2N1cl9hcHBfdmFsLnN0YXR1cyA9IEJUSUZfUkNfU1RTX1RJTUVPVVQ7Ci0gICAgICBoYW5kbGVfYXBwX2N1cl92YWxfcmVzcG9uc2UoJm1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfY3VyX2FwcF92YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZRVJfQVBQX0FUVFJfVEVYVDoKLSAgICAgIGF2cmNfcmVzcG9uc2UuZ2V0X2FwcF9hdHRyX3R4dC5zdGF0dXMgPSBCVElGX1JDX1NUU19USU1FT1VUOwotICAgICAgaGFuZGxlX2FwcF9hdHRyX3R4dF9yZXNwb25zZSgmbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLmdldF9hcHBfYXR0cl90eHQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZRVJfQVBQX1ZBTFVFX1RFWFQ6Ci0gICAgICBhdnJjX3Jlc3BvbnNlLmdldF9hcHBfdmFsX3R4dC5zdGF0dXMgPSBCVElGX1JDX1NUU19USU1FT1VUOwotICAgICAgaGFuZGxlX2FwcF9hdHRyX3R4dF9yZXNwb25zZSgmbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLmdldF9hcHBfdmFsX3R4dCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0VMRU1FTlRfQVRUUjoKLSAgICAgIGF2cmNfcmVzcG9uc2UuZ2V0X2F0dHJzLnN0YXR1cyA9IEJUSUZfUkNfU1RTX1RJTUVPVVQ7Ci0gICAgICBoYW5kbGVfZ2V0X21ldGFkYXRhX2F0dHJfcmVzcG9uc2UoJm1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfYXR0cnMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZX1NUQVRVUzoKLSAgICAgIGF2cmNfcmVzcG9uc2UuZ2V0X3BsYXlfc3RhdHVzLnN0YXR1cyA9IEJUSUZfUkNfU1RTX1RJTUVPVVQ7Ci0gICAgICBoYW5kbGVfZ2V0X3BsYXlzdGF0dXNfcmVzcG9uc2UoJm1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfcGxheV9zdGF0dXMpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmVsZWFzZV90cmFuc2FjdGlvbihwX2RldiwgcF9jb250ZXh0LT5yY19zdGF0dXNfY21kLmxhYmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9yY19zdGF0dXNfY21kX3RpbWVyX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJDIHN0YXR1cyBjb21tYW5kIHRpbWVvdXQgY2FsbGJhY2suCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgaXMgY2FsbGVkIGZyb20gQlRVIGNvbnRleHQgYW5kIHN3aXRjaGVzIHRvIEJUSUYKLSAqICAgICAgICAgICAgICAgICAgY29udGV4dCB0byBoYW5kbGUgdGhlIHRpbWVvdXQgZXZlbnRzCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGlmX3JjX3N0YXR1c19jbWRfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIGJ0aWZfcmNfdGltZXJfY29udGV4dF90KiBwX2RhdGEgPSAoYnRpZl9yY190aW1lcl9jb250ZXh0X3QqKWRhdGE7Ci0KLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfcmNfc3RhdHVzX2NtZF90aW1lb3V0X2hhbmRsZXIsIDAsIChjaGFyKilwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnRpZl9yY190aW1lcl9jb250ZXh0X3QpLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9yY19jb250cm9sX2NtZF90aW1lb3V0X2hhbmRsZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJDIGNvbnRyb2wgY29tbWFuZCB0aW1lb3V0IGhhbmRsZXIgKFJ1bnMgaW4gQlRJRiBjb250ZXh0KS4KLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfcmNfY29udHJvbF9jbWRfdGltZW91dF9oYW5kbGVyKFVOVVNFRF9BVFRSIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZGF0YSkgewotICBidGlmX3JjX3RpbWVyX2NvbnRleHRfdCogcF9jb250ZXh0ID0gKGJ0aWZfcmNfdGltZXJfY29udGV4dF90KilkYXRhOwotICB0QVZSQ19SRVNQT05TRSBhdnJjX3Jlc3BvbnNlID0gezB9OwotICB0QlRBX0FWX01FVEFfTVNHIG1ldGFfbXNnOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEocF9jb250ZXh0LT5yY19hZGRyKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXYgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtZW1zZXQoJm1ldGFfbXNnLCAwLCBzaXplb2YodEJUQV9BVl9NRVRBX01TRykpOwotICBtZXRhX21zZy5yY19oYW5kbGUgPSBwX2Rldi0+cmNfaGFuZGxlOwotCi0gIHN3aXRjaCAocF9jb250ZXh0LT5yY19jb250cm9sX2NtZC5wZHVfaWQpIHsKLSAgICBjYXNlIEFWUkNfUERVX1NFVF9QTEFZRVJfQVBQX1ZBTFVFOgotICAgICAgYXZyY19yZXNwb25zZS5zZXRfYXBwX3ZhbC5zdGF0dXMgPSBCVElGX1JDX1NUU19USU1FT1VUOwotICAgICAgaGFuZGxlX3NldF9hcHBfYXR0cl92YWxfcmVzcG9uc2UoJm1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5zZXRfYXBwX3ZhbCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZWxlYXNlX3RyYW5zYWN0aW9uKHBfZGV2LCBwX2NvbnRleHQtPnJjX2NvbnRyb2xfY21kLmxhYmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9yY19jb250cm9sX2NtZF90aW1lcl90aW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSQyBjb250cm9sIGNvbW1hbmQgdGltZW91dCBjYWxsYmFjay4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgZnJvbSBCVFUgY29udGV4dCBhbmQgc3dpdGNoZXMgdG8gQlRJRgotICogICAgICAgICAgICAgICAgICBjb250ZXh0IHRvIGhhbmRsZSB0aGUgdGltZW91dCBldmVudHMKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfcmNfY29udHJvbF9jbWRfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIGJ0aWZfcmNfdGltZXJfY29udGV4dF90KiBwX2RhdGEgPSAoYnRpZl9yY190aW1lcl9jb250ZXh0X3QqKWRhdGE7Ci0KLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfcmNfY29udHJvbF9jbWRfdGltZW91dF9oYW5kbGVyLCAwLCAoY2hhciopcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ0aWZfcmNfdGltZXJfY29udGV4dF90KSwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJlZ2lzdGVyX2Zvcl9ldmVudF9ub3RpZmljYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhlbHBlciBmdW5jdGlvbiByZWdpc3RlcmluZyBub3RpZmljYXRpb24gZXZlbnRzCi0gKiAgICAgICAgICAgICAgICAgIHNldHMgYW4gaW50ZXJpbSByZXNwb25zZSB0aW1lb3V0IHRvIGhhbmRsZSBpZiB0aGUgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHJlc3BvbmQuCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9mb3JfZXZlbnRfbm90aWZpY2F0aW9uKGJ0aWZfcmNfc3VwcG9ydGVkX2V2ZW50X3QqIHBfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHJhbnNhY3Rpb24gPSBOVUxMOwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBnZXRfdHJhbnNhY3Rpb24ocF9kZXYsICZwX3RyYW5zYWN0aW9uKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBubyBtb3JlIHRyYW5zYWN0aW9uIGxhYmVsczogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gaW50ZXJ2YWwgaXMgb25seSB2YWxpZCBmb3IgQVZSQ19FVlRfUExBWV9QT1NfQ0hBTkdFRAotICB1aW50MzJfdCBpbnRlcnZhbF9pbl9zZWNvbmRzID0gMDsKLSAgaWYgKHBfZXZlbnQtPmV2ZW50X2lkID09IEFWUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQpIHsKLSAgICBpbnRlcnZhbF9pbl9zZWNvbmRzID0gMjsKLSAgfQotICBzdGF0dXMgPSByZWdpc3Rlcl9ub3RpZmljYXRpb25fY21kKHBfdHJhbnNhY3Rpb24tPmxibCwgcF9ldmVudC0+ZXZlbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfaW5fc2Vjb25kcywgcF9kZXYpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIGluIE5vdGlmaWNhdGlvbiByZWdpc3RyYXRpb246ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIHJlbGVhc2VfdHJhbnNhY3Rpb24ocF9kZXYsIHBfdHJhbnNhY3Rpb24tPmxibCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRpZl9yY190aW1lcl9jb250ZXh0X3QqIHBfY29udGV4dCA9ICZwX3RyYW5zYWN0aW9uLT50eG5fdGltZXJfY29udGV4dDsKLSAgcF9ldmVudC0+bGFiZWwgPSBwX3RyYW5zYWN0aW9uLT5sYmw7Ci0gIHBfZXZlbnQtPnN0YXR1cyA9IGVSRUdJU1RFUkVEOwotICBwX2NvbnRleHQtPnJjX3N0YXR1c19jbWQubGFiZWwgPSBwX3RyYW5zYWN0aW9uLT5sYmw7Ci0gIHBfY29udGV4dC0+cmNfc3RhdHVzX2NtZC5wZHVfaWQgPSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT047Ci0gIHBfY29udGV4dC0+cmNfYWRkciA9IHBfZGV2LT5yY19hZGRyOwotCi0gIGFsYXJtX2ZyZWUocF90cmFuc2FjdGlvbi0+dHhuX3RpbWVyKTsKLSAgcF90cmFuc2FjdGlvbi0+dHhuX3RpbWVyID0gYWxhcm1fbmV3KCJidGlmX3JjLnN0YXR1c19jb21tYW5kX3R4bl90aW1lciIpOwotICBhbGFybV9zZXRfb25fbWxvb3AocF90cmFuc2FjdGlvbi0+dHhuX3RpbWVyLCBCVElGX1RJTUVPVVRfUkNfSU5URVJJTV9SU1BfTVMsCi0gICAgICAgICAgICAgICAgICAgICBidGlmX3JjX3N0YXR1c19jbWRfdGltZXJfdGltZW91dCwgcF9jb250ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfc3RhdHVzX2NvbW1hbmRfdGltZXIodWludDhfdCBwZHVfaWQsIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHhuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgYnRpZl9yY190aW1lcl9jb250ZXh0X3QqIHBfY29udGV4dCA9ICZwX3R4bi0+dHhuX3RpbWVyX2NvbnRleHQ7Ci0gIHBfY29udGV4dC0+cmNfc3RhdHVzX2NtZC5sYWJlbCA9IHBfdHhuLT5sYmw7Ci0gIHBfY29udGV4dC0+cmNfc3RhdHVzX2NtZC5wZHVfaWQgPSBwZHVfaWQ7Ci0gIHBfY29udGV4dC0+cmNfYWRkciA9IHBfZGV2LT5yY19hZGRyOwotCi0gIGFsYXJtX2ZyZWUocF90eG4tPnR4bl90aW1lcik7Ci0gIHBfdHhuLT50eG5fdGltZXIgPSBhbGFybV9uZXcoImJ0aWZfcmMuc3RhdHVzX2NvbW1hbmRfdHhuX3RpbWVyIik7Ci0gIGFsYXJtX3NldF9vbl9tbG9vcChwX3R4bi0+dHhuX3RpbWVyLCBCVElGX1RJTUVPVVRfUkNfU1RBVFVTX0NNRF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfc3RhdHVzX2NtZF90aW1lcl90aW1lb3V0LCBwX2NvbnRleHQpOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9jb250cm9sX2NvbW1hbmRfdGltZXIodWludDhfdCBwZHVfaWQsIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHhuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIGJ0aWZfcmNfdGltZXJfY29udGV4dF90KiBwX2NvbnRleHQgPSAmcF90eG4tPnR4bl90aW1lcl9jb250ZXh0OwotICBwX2NvbnRleHQtPnJjX2NvbnRyb2xfY21kLmxhYmVsID0gcF90eG4tPmxibDsKLSAgcF9jb250ZXh0LT5yY19jb250cm9sX2NtZC5wZHVfaWQgPSBwZHVfaWQ7Ci0gIHBfY29udGV4dC0+cmNfYWRkciA9IHBfZGV2LT5yY19hZGRyOwotCi0gIGFsYXJtX2ZyZWUocF90eG4tPnR4bl90aW1lcik7Ci0gIHBfdHhuLT50eG5fdGltZXIgPSBhbGFybV9uZXcoImJ0aWZfcmMuY29udHJvbF9jb21tYW5kX3R4bl90aW1lciIpOwotICBhbGFybV9zZXRfb25fbWxvb3AocF90eG4tPnR4bl90aW1lciwgQlRJRl9USU1FT1VUX1JDX0NPTlRST0xfQ01EX01TLAotICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19jb250cm9sX2NtZF90aW1lcl90aW1lb3V0LCBwX2NvbnRleHQpOwotfQotCi1idF9zdGF0dXNfdCBidWlsZF9hbmRfc2VuZF92ZW5kb3JfY21kKHRBVlJDX0NPTU1BTkQqIGF2cmNfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX0NPREUgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHJhbnNhY3Rpb24gPSBOVUxMOwotICBidF9zdGF0dXNfdCB0cmFuX3N0YXR1cyA9IGdldF90cmFuc2FjdGlvbihwX2RldiwgJnBfdHJhbnNhY3Rpb24pOwotICBpZiAoQlRfU1RBVFVTX1NVQ0NFU1MgIT0gdHJhbl9zdGF0dXMpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBCVF9IRFIqIHBfbXNnID0gTlVMTDsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfQmxkQ29tbWFuZChhdnJjX2NtZCwgJnBfbXNnKTsKLSAgaWYgKHN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUiAmJiBwX21zZyAhPSBOVUxMKSB7Ci0gICAgdWludDhfdCogZGF0YV9zdGFydCA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6ICVzIG1zZ3JlcSBiZWluZyBzZW50IG91dCB3aXRoIGxhYmVsOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgZHVtcF9yY19wZHUoYXZyY19jbWQtPnBkdSksIHBfdHJhbnNhY3Rpb24tPmxibCk7Ci0gICAgQlRBX0F2VmVuZG9yQ21kKHBfZGV2LT5yY19oYW5kbGUsIHBfdHJhbnNhY3Rpb24tPmxibCwgY21kX2NvZGUsIGRhdGFfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgIHBfbXNnLT5sZW4pOwotICAgIHN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICAgIGlmIChjbWRfY29kZSA9PSBBVlJDX0NNRF9TVEFUVVMpIHsKLSAgICAgIHN0YXJ0X3N0YXR1c19jb21tYW5kX3RpbWVyKGF2cmNfY21kLT5wZHUsIHBfdHJhbnNhY3Rpb24sIHBfZGV2KTsKLSAgICB9IGVsc2UgaWYgKGNtZF9jb2RlID09IEFWUkNfQ01EX0NUUkwpIHsKLSAgICAgIHN0YXJ0X2NvbnRyb2xfY29tbWFuZF90aW1lcihhdnJjX2NtZC0+cGR1LCBwX3RyYW5zYWN0aW9uLCBwX2Rldik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBmYWlsZWQgdG8gYnVpbGQgY29tbWFuZC4gc3RhdHVzOiAweCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gIH0KLSAgb3NpX2ZyZWUocF9tc2cpOwotICByZXR1cm4gKGJ0X3N0YXR1c190KXN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2VuZF9icm93c2luZ19jb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgY29tbWFuZCB0byBhIGRldmljZSBvbiB0aGUgYnJvd3NpbmcgY2hhbm5lbAotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYXZyY19jbWQ6IFRoZSBjb21tYW5kIHlvdSdyZSBzZW5kaW5nCi0gKiAgICAgICAgICAgICAgICAgIHBfZGV2OiBEZXZpY2UgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgY29tbWFuZCBpcyBpc3N1ZWQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBCVF9TVEFUVVNfRkFJTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBidWlsZF9hbmRfc2VuZF9icm93c2luZ19jbWQodEFWUkNfQ09NTUFORCogYXZyY19jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIEJUX0hEUiogcF9tc2cgPSBOVUxMOwotICB0QVZSQ19TVFMgc3RhdHVzID0gQVZSQ19CbGRDb21tYW5kKGF2cmNfY21kLCAmcF9tc2cpOwotICBpZiAoc3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byBidWlsZCBjb21tYW5kIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHJhbnNhY3Rpb24gPSBOVUxMOwotICBidF9zdGF0dXNfdCB0cmFuX3N0YXR1cyA9IGdldF90cmFuc2FjdGlvbihwX2RldiwgJnBfdHJhbnNhY3Rpb24pOwotCi0gIGlmICh0cmFuX3N0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUyB8fCBwX3RyYW5zYWN0aW9uID09IE5VTEwpIHsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byBvYnRhaW4gdHhuIGRldGFpbHMuIHN0YXR1czogMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFuX3N0YXR1cyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMgbXNncmVxIGJlaW5nIHNlbnQgb3V0IHdpdGggbGFiZWwgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3RyYW5zYWN0aW9uLT5sYmwpOwotICBCVEFfQXZNZXRhQ21kKHBfZGV2LT5yY19oYW5kbGUsIHBfdHJhbnNhY3Rpb24tPmxibCwgQVZSQ19DTURfQ1RSTCwgcF9tc2cpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9nZXRfY2FwYWJpbGl0eV9yZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlcyB0aGUgZ2V0X2NhcF9yZXNwb25zZSB0byBwb3B1bGF0ZSBjb21wYW55IGlkIGluZm8KLSAqICAgICAgICAgICAgICAgICAgYW5kIHF1ZXJ5IHRoZSBzdXBwb3J0ZWQgZXZlbnRzLgotICogICAgICAgICAgICAgICAgICBJbml0aWF0ZXMgTm90aWZpY2F0aW9uIHJlZ2lzdHJhdGlvbiBmb3IgZXZlbnRzIHN1cHBvcnRlZAotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2dldF9jYXBhYmlsaXR5X3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19HRVRfQ0FQU19SU1AqIHBfcnNwKSB7Ci0gIGludCB4eCA9IDA7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIC8qIFRvZG86IERvIHdlIG5lZWQgdG8gcmV0cnkgb24gY29tbWFuZCB0aW1lb3V0ICovCi0gIGlmIChwX3JzcC0+c3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIGNhcGFiaWxpdHkgcmVzcG9uc2U6IDB4JTAyWCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfcnNwLT5jYXBhYmlsaXR5X2lkID09IEFWUkNfQ0FQX0VWRU5UU19TVVBQT1JURUQpIHsKLSAgICBidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90KiBwX2V2ZW50OwotCi0gICAgLyogVG9kbzogQ2hlY2sgaWYgbGlzdCBjYW4gYmUgYWN0aXZlIHdoZW4gd2UgaGl0IGhlcmUgKi8KLSAgICBwX2Rldi0+cmNfc3VwcG9ydGVkX2V2ZW50X2xpc3QgPSBsaXN0X25ldyhvc2lfZnJlZSk7Ci0gICAgZm9yICh4eCA9IDA7IHh4IDwgcF9yc3AtPmNvdW50OyB4eCsrKSB7Ci0gICAgICAvKiBTa2lwIHJlZ2lzdGVyaW5nIGZvciBQbGF5IHBvc2l0aW9uIGNoYW5nZSBub3RpZmljYXRpb24gKi8KLSAgICAgIGlmICgocF9yc3AtPnBhcmFtLmV2ZW50X2lkW3h4XSA9PSBBVlJDX0VWVF9QTEFZX1NUQVRVU19DSEFOR0UpIHx8Ci0gICAgICAgICAgKHBfcnNwLT5wYXJhbS5ldmVudF9pZFt4eF0gPT0gQVZSQ19FVlRfVFJBQ0tfQ0hBTkdFKSB8fAotICAgICAgICAgIChwX3JzcC0+cGFyYW0uZXZlbnRfaWRbeHhdID09IEFWUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQpIHx8Ci0gICAgICAgICAgKHBfcnNwLT5wYXJhbS5ldmVudF9pZFt4eF0gPT0gQVZSQ19FVlRfQVBQX1NFVFRJTkdfQ0hBTkdFKSB8fAotICAgICAgICAgIChwX3JzcC0+cGFyYW0uZXZlbnRfaWRbeHhdID09IEFWUkNfRVZUX05PV19QTEFZSU5HX0NIQU5HRSkgfHwKLSAgICAgICAgICAocF9yc3AtPnBhcmFtLmV2ZW50X2lkW3h4XSA9PSBBVlJDX0VWVF9BRERSX1BMQVlFUl9DSEFOR0UpIHx8Ci0gICAgICAgICAgKHBfcnNwLT5wYXJhbS5ldmVudF9pZFt4eF0gPT0gQVZSQ19FVlRfVUlEU19DSEFOR0UpIHx8Ci0gICAgICAgICAgKHBfcnNwLT5wYXJhbS5ldmVudF9pZFt4eF0gPT0gQVZSQ19FVlRfQVZBTF9QTEFZRVJTX0NIQU5HRSkpIHsKLSAgICAgICAgcF9ldmVudCA9IChidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90Kilvc2lfbWFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKGJ0aWZfcmNfc3VwcG9ydGVkX2V2ZW50X3QpKTsKLSAgICAgICAgcF9ldmVudC0+ZXZlbnRfaWQgPSBwX3JzcC0+cGFyYW0uZXZlbnRfaWRbeHhdOwotICAgICAgICBwX2V2ZW50LT5zdGF0dXMgPSBlTk9UX1JFR0lTVEVSRUQ7Ci0gICAgICAgIGxpc3RfYXBwZW5kKHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCwgcF9ldmVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT24gb2NjYXNpb24gYSByZW1vdGUgZGV2aWNlIGNhbiBpbnRlcm1pdHRlbnRseSBzZW5kIGEgcG9vcmx5IGNvbmZpZ3VyZWQKLSAgICAvLyBwYWNrZXQgd2l0aCAwIGNhcGFiaWxpdGllcy4gVGhpcyBjaGVjayBlbnN1cmVzIHRoZSBzdGFjayBkb2VzIG5vdCBjcmFzaC4KLSAgICAvLyBUeXBpY2FsbHkgdGhlIHJlbW90ZSBkZXZpY2Ugd2lsbCBzZW5kIGEgcHJvcGVyIHBhY2tldCBpbiB0aGUgZnV0dXJlIGFuZAotICAgIC8vIGNvbnRpbnVlIG9wZXJhdGlvbi4KLSAgICBpZiAobGlzdF9pc19lbXB0eShwX2Rldi0+cmNfc3VwcG9ydGVkX2V2ZW50X2xpc3QpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcF9ldmVudCA9Ci0gICAgICAgIChidGlmX3JjX3N1cHBvcnRlZF9ldmVudF90KilsaXN0X2Zyb250KHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCk7Ci0gICAgaWYgKHBfZXZlbnQgIT0gTlVMTCkgewotICAgICAgcmVnaXN0ZXJfZm9yX2V2ZW50X25vdGlmaWNhdGlvbihwX2V2ZW50LCBwX2Rldik7Ci0gICAgfQotICB9IGVsc2UgaWYgKHBfcnNwLT5jYXBhYmlsaXR5X2lkID09IEFWUkNfQ0FQX0NPTVBBTllfSUQpIHsKLSAgICBnZXRjYXBhYmlsaXRpZXNfY21kKEFWUkNfQ0FQX0VWRU5UU19TVVBQT1JURUQsIHBfZGV2KTsKLSAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogQVZSQ19DQVBfQ09NUEFOWV9JRDogIiwgX19mdW5jX18pOwotICAgIGZvciAoeHggPSAwOyB4eCA8IHBfcnNwLT5jb3VudDsgeHgrKykgewotICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGNvbXBhbnlfaWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcnNwLT5wYXJhbS5jb21wYW55X2lkW3h4XSk7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgcmNfaXNfdHJhY2tfaWRfdmFsaWQodEFWUkNfVUlEIHVpZCkgewotICB0QVZSQ19VSUQgaW52YWxpZF91aWQgPSB7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn07Ci0KLSAgaWYgKG1lbWNtcCh1aWQsIGludmFsaWRfdWlkLCBzaXplb2YodEFWUkNfVUlEKSkgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoYW5kbGVfbm90aWZpY2F0aW9uX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBNYWluIGhhbmRsZXIgZm9yIG5vdGlmaWNhdGlvbiByZXNwb25zZXMgdG8gcmVnaXN0ZXJlZCBldmVudHMKLSAqICAgICAgICAgICAgICAgICAgMS4gUmVnaXN0ZXIgZm9yIHVucmVnaXN0ZXJlZCBldmVudChpbiBpbnRlcmltIHJlc3BvbnNlIHBhdGgpCi0gKiAgICAgICAgICAgICAgICAgIDIuIEFmdGVyIHJlZ2lzdGVyaW5nIGZvciBhbGwgc3VwcG9ydGVkIGV2ZW50cywgc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmluZyBhcHBsaWNhdGlvbiBzZXR0aW5ncyBhbmQgdmFsdWVzCi0gKiAgICAgICAgICAgICAgICAgIDMuIFJlcmVnaXN0ZXIgZm9yIGV2ZW50cyBvbiBnZXR0aW5nIGNoYW5nZWQgcmVzcG9uc2UKLSAqICAgICAgICAgICAgICAgICAgNC4gUnVuIHBsYXkgc3RhdHVzIHRpbWVyIGZvciBnZXR0aW5nIHBvc2l0aW9uIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyBjaGFuZ2VzIHRvIHBsYXlpbmcKLSAqICAgICAgICAgICAgICAgICAgNS4gR2V0IHRoZSBNZWRpYSBkZXRhaWxzIHdoZW4gdGhlIHRyYWNrIGNoYW5nZSBoYXBwZW5zCi0gKiAgICAgICAgICAgICAgICAgICAgIG9yIHRyYWNrIGNoYW5nZSBpbnRlcmltIHJlc3BvbnNlIGlzIHJlY2VpdmVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICAgdmFsaWQgdHJhY2sgaWQKLSAqICAgICAgICAgICAgICAgICAgNi4gSEFMIGNhbGxiYWNrIGZvciBwbGF5IHN0YXR1cyBjaGFuZ2UgYW5kIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgY2hhbmdlCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoYW5kbGVfbm90aWZpY2F0aW9uX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfUkVHX05PVElGX1JTUCogcF9yc3ApIHsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPQotICAgICAgYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwbWV0YV9tc2ctPnJjX2hhbmRsZSk7Ci0KLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXYgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb25zdCB1aW50MzJfdCogYXR0cl9saXN0ID0gZ2V0X3JlcXVlc3RlZF9hdHRyaWJ1dGVzX2xpc3QocF9kZXYpOwotICBjb25zdCB1aW50OF90IGF0dHJfbGlzdF9zaXplID0gZ2V0X3JlcXVlc3RlZF9hdHRyaWJ1dGVzX2xpc3Rfc2l6ZShwX2Rldik7Ci0KLSAgaWYgKHBtZXRhX21zZy0+Y29kZSA9PSBBVlJDX1JTUF9JTlRFUklNKSB7Ci0gICAgYnRpZl9yY19zdXBwb3J0ZWRfZXZlbnRfdCogcF9ldmVudDsKLSAgICBsaXN0X25vZGVfdCogbm9kZTsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBJbnRlcmltIHJlc3BvbnNlOiAweCUyWCAiLCBfX2Z1bmNfXywgcF9yc3AtPmV2ZW50X2lkKTsKLSAgICBzd2l0Y2ggKHBfcnNwLT5ldmVudF9pZCkgewotICAgICAgY2FzZSBBVlJDX0VWVF9QTEFZX1NUQVRVU19DSEFOR0U6Ci0gICAgICAgIGdldF9wbGF5X3N0YXR1c19jbWQocF9kZXYpOwotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheV9zdGF0dXNfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgIChidHJjX3BsYXlfc3RhdHVzX3QpcF9yc3AtPnBhcmFtLnBsYXlfc3RhdHVzKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX1RSQUNLX0NIQU5HRToKLSAgICAgICAgaWYgKHJjX2lzX3RyYWNrX2lkX3ZhbGlkKHBfcnNwLT5wYXJhbS50cmFjaykgIT0gdHJ1ZSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSA9IHBfcnNwLT5wYXJhbS50cmFjazsKLSAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDY0KHBfZGV2LT5yY19wbGF5aW5nX3VpZCwgcF9kYXRhKTsKLSAgICAgICAgICBnZXRfcGxheV9zdGF0dXNfY21kKHBfZGV2KTsKLSAgICAgICAgICBnZXRfbWV0YWRhdGFfYXR0cmlidXRlX2NtZChhdHRyX2xpc3Rfc2l6ZSwgYXR0cl9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX0FQUF9TRVRUSU5HX0NIQU5HRToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfTk9XX1BMQVlJTkdfQ0hBTkdFOgotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+bm93X3BsYXlpbmdfY29udGVudHNfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfQVZBTF9QTEFZRVJTX0NIQU5HRToKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEFWUkNfRVZUX0FWQUxfUExBWUVSU19DSEFOR0UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBiYXNlOjpCaW5kKGJ0X3JjX2N0cmxfY2FsbGJhY2tzLT5hdmFpbGFibGVfcGxheWVyX2NoYW5nZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX0FERFJfUExBWUVSX0NIQU5HRToKLSAgICAgICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPmFkZHJlc3NlZF9wbGF5ZXJfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsIHBfcnNwLT5wYXJhbS5hZGRyX3BsYXllci5wbGF5ZXJfaWQpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfUExBWV9QT1NfQ0hBTkdFRDoKLSAgICAgICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPnBsYXlfcG9zaXRpb25fY2hhbmdlZF9jYiwgcF9kZXYtPnJjX2FkZHIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcnNwLT5wYXJhbS5wbGF5X3BvcykpOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBVlJDX0VWVF9VSURTX0NIQU5HRToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfVFJBQ0tfUkVBQ0hFRF9FTkQ6Ci0gICAgICBjYXNlIEFWUkNfRVZUX1RSQUNLX1JFQUNIRURfU1RBUlQ6Ci0gICAgICBjYXNlIEFWUkNfRVZUX0JBVFRFUllfU1RBVFVTX0NIQU5HRToKLSAgICAgIGNhc2UgQVZSQ19FVlRfU1lTVEVNX1NUQVRVU19DSEFOR0U6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogVW5oYW5kbGVkIGludGVyaW0gcmVzcG9uc2U6IDB4JTJYIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPmV2ZW50X2lkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxpc3RfZm9yZWFjaChwX2Rldi0+cmNfc3VwcG9ydGVkX2V2ZW50X2xpc3QsCi0gICAgICAgICAgICAgICAgIGl0ZXJhdGVfc3VwcG9ydGVkX2V2ZW50X2xpc3RfZm9yX2ludGVyaW1fcnNwLAotICAgICAgICAgICAgICAgICAmcF9yc3AtPmV2ZW50X2lkKTsKLQotICAgIG5vZGUgPSBsaXN0X2JlZ2luKHBfZGV2LT5yY19zdXBwb3J0ZWRfZXZlbnRfbGlzdCk7Ci0KLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICBwX2V2ZW50ID0gKGJ0aWZfcmNfc3VwcG9ydGVkX2V2ZW50X3QqKWxpc3Rfbm9kZShub2RlKTsKLSAgICAgIGlmICgocF9ldmVudCAhPSBOVUxMKSAmJiAocF9ldmVudC0+c3RhdHVzID09IGVOT1RfUkVHSVNURVJFRCkpIHsKLSAgICAgICAgcmVnaXN0ZXJfZm9yX2V2ZW50X25vdGlmaWNhdGlvbihwX2V2ZW50LCBwX2Rldik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbm9kZSA9IGxpc3RfbmV4dChub2RlKTsKLSAgICAgIHBfZXZlbnQgPSBOVUxMOwotICAgIH0KLSAgICAvKiBSZWdpc3RlcmVkIGZvciBhbGwgZXZlbnRzLCB3ZSBjYW4gcmVxdWVzdCBhcHBsaWNhdGlvbiBzZXR0aW5ncyAqLwotICAgIGlmIChwX2V2ZW50ID09IE5VTEwgJiYgIXBfZGV2LT5yY19hcHBfc2V0dGluZ3MucXVlcnlfc3RhcnRlZCkgewotICAgICAgLyogd2UgbmVlZCB0byBkbyB0aGlzIG9ubHkgaWYgcmVtb3RlIFRHIHN1cHBvcnRzCi0gICAgICAgKiBwbGF5ZXIgYXBwbGljYXRpb24gc2V0dGluZ3MKLSAgICAgICAqLwotICAgICAgcF9kZXYtPnJjX2FwcF9zZXR0aW5ncy5xdWVyeV9zdGFydGVkID0gdHJ1ZTsKLSAgICAgIGlmIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9BUFBfU0VUVElORykgewotICAgICAgICBsaXN0X3BsYXllcl9hcHBfc2V0dGluZ19hdHRyaWJfY21kKHBfZGV2KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBBcHAgc2V0dGluZyBub3Qgc3VwcG9ydGVkLCBjb21wbGV0ZSBwcm9jZWR1cmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgcmNfY3RybF9wcm9jZWR1cmVfY29tcGxldGUocF9kZXYpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIChwbWV0YV9tc2ctPmNvZGUgPT0gQVZSQ19SU1BfQ0hBTkdFRCkgewotICAgIGJ0aWZfcmNfc3VwcG9ydGVkX2V2ZW50X3QqIHBfZXZlbnQ7Ci0gICAgbGlzdF9ub2RlX3QqIG5vZGU7Ci0KLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogTm90aWZpY2F0aW9uIGNvbXBsZXRlZDogMHglMlggIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3JzcC0+ZXZlbnRfaWQpOwotCi0gICAgbm9kZSA9IGxpc3RfYmVnaW4ocF9kZXYtPnJjX3N1cHBvcnRlZF9ldmVudF9saXN0KTsKLQotICAgIHdoaWxlIChub2RlICE9IE5VTEwpIHsKLSAgICAgIHBfZXZlbnQgPSAoYnRpZl9yY19zdXBwb3J0ZWRfZXZlbnRfdCopbGlzdF9ub2RlKG5vZGUpOwotICAgICAgaWYgKHBfZXZlbnQgIT0gTlVMTCAmJiBwX2V2ZW50LT5ldmVudF9pZCA9PSBwX3JzcC0+ZXZlbnRfaWQpIHsKLSAgICAgICAgcF9ldmVudC0+c3RhdHVzID0gZU5PVF9SRUdJU1RFUkVEOwotICAgICAgICByZWdpc3Rlcl9mb3JfZXZlbnRfbm90aWZpY2F0aW9uKHBfZXZlbnQsIHBfZGV2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpOwotICAgIH0KLQotICAgIHN3aXRjaCAocF9yc3AtPmV2ZW50X2lkKSB7Ci0gICAgICBjYXNlIEFWUkNfRVZUX1BMQVlfU1RBVFVTX0NIQU5HRToKLSAgICAgICAgLyogU3RhcnQgdGltZXIgdG8gZ2V0IHBsYXkgc3RhdHVzIHBlcmlvZGljYWxseQotICAgICAgICAgKiBpZiB0aGUgcGxheSBzdGF0ZSBpcyBwbGF5aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPnBsYXlfc3RhdHVzX2NoYW5nZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAoYnRyY19wbGF5X3N0YXR1c190KXBfcnNwLT5wYXJhbS5wbGF5X3N0YXR1cykpOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX1RSQUNLX0NIQU5HRToKLSAgICAgICAgaWYgKHJjX2lzX3RyYWNrX2lkX3ZhbGlkKHBfcnNwLT5wYXJhbS50cmFjaykgIT0gdHJ1ZSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGdldF9tZXRhZGF0YV9hdHRyaWJ1dGVfY21kKGF0dHJfbGlzdF9zaXplLCBhdHRyX2xpc3QsIHBfZGV2KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfQVBQX1NFVFRJTkdfQ0hBTkdFOiB7Ci0gICAgICAgIGJ0cmNfcGxheWVyX3NldHRpbmdzX3QgYXBwX3NldHRpbmdzOwotICAgICAgICB1aW50MTZfdCB4eDsKLQotICAgICAgICBhcHBfc2V0dGluZ3MubnVtX2F0dHIgPSBwX3JzcC0+cGFyYW0ucGxheWVyX3NldHRpbmcubnVtX2F0dHI7Ci0gICAgICAgIGZvciAoeHggPSAwOyB4eCA8IGFwcF9zZXR0aW5ncy5udW1fYXR0cjsgeHgrKykgewotICAgICAgICAgIGFwcF9zZXR0aW5ncy5hdHRyX2lkc1t4eF0gPSBwX3JzcC0+cGFyYW0ucGxheWVyX3NldHRpbmcuYXR0cl9pZFt4eF07Ci0gICAgICAgICAgYXBwX3NldHRpbmdzLmF0dHJfdmFsdWVzW3h4XSA9Ci0gICAgICAgICAgICAgIHBfcnNwLT5wYXJhbS5wbGF5ZXJfc2V0dGluZy5hdHRyX3ZhbHVlW3h4XTsKLSAgICAgICAgfQotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgICBidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NoYW5nZWRfY2IsCi0gICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsIGFwcF9zZXR0aW5ncykpOwotICAgICAgfSBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX0VWVF9OT1dfUExBWUlOR19DSEFOR0U6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX0FWQUxfUExBWUVSU19DSEFOR0U6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX0FERFJfUExBWUVSX0NIQU5HRToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfUExBWV9QT1NfQ0hBTkdFRDoKLSAgICAgICAgLy8gaGFuZGxlIG9uIGludGVyaW0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19FVlRfVUlEU19DSEFOR0U6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfRVZUX1RSQUNLX1JFQUNIRURfRU5EOgotICAgICAgY2FzZSBBVlJDX0VWVF9UUkFDS19SRUFDSEVEX1NUQVJUOgotICAgICAgY2FzZSBBVlJDX0VWVF9CQVRURVJZX1NUQVRVU19DSEFOR0U6Ci0gICAgICBjYXNlIEFWUkNfRVZUX1NZU1RFTV9TVEFUVVNfQ0hBTkdFOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IFVuaGFuZGxlZCBjb21wbGV0aW9uIHJlc3BvbnNlOiAweCUyWCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfcnNwLT5ldmVudF9pZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGFuZGxlX2FwcF9hdHRyX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlcyByZXNwb25zZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgaW5pdGlhdGVzIHByb2NlZHVyZSB0byBmZXRjaCB0aGUgYXR0cmlidXRlIHZhbHVlcwotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2FwcF9hdHRyX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19MSVNUX0FQUF9BVFRSX1JTUCogcF9yc3ApIHsKLSAgdWludDhfdCB4eDsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPQotICAgICAgYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwbWV0YV9tc2ctPnJjX2hhbmRsZSk7Ci0KLSAgaWYgKHBfZGV2ID09IE5VTEwgfHwgcF9yc3AtPnN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciBnZXR0aW5nIFBsYXllciBhcHBsaWNhdGlvbiBzZXR0aW5nczogMHglMlgiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcnNwLT5zdGF0dXMpOwotICAgIHJjX2N0cmxfcHJvY2VkdXJlX2NvbXBsZXRlKHBfZGV2KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcF9kZXYtPnJjX2FwcF9zZXR0aW5ncy5udW1fYXR0cnMgPSAwOwotICBwX2Rldi0+cmNfYXBwX3NldHRpbmdzLm51bV9leHRfYXR0cnMgPSAwOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IHBfcnNwLT5udW1fYXR0cjsgeHgrKykgewotICAgIHVpbnQ4X3Qgc3RfaW5kZXg7Ci0KLSAgICBpZiAocF9yc3AtPmF0dHJzW3h4XSA+IEFWUkNfUExBWUVSX1NFVFRJTkdfTE9XX01FTlVfRVhUKSB7Ci0gICAgICBzdF9pbmRleCA9IHBfZGV2LT5yY19hcHBfc2V0dGluZ3MubnVtX2V4dF9hdHRyczsKLSAgICAgIHBfZGV2LT5yY19hcHBfc2V0dGluZ3MuZXh0X2F0dHJzW3N0X2luZGV4XS5hdHRyX2lkID0gcF9yc3AtPmF0dHJzW3h4XTsKLSAgICAgIHBfZGV2LT5yY19hcHBfc2V0dGluZ3MubnVtX2V4dF9hdHRycysrOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdF9pbmRleCA9IHBfZGV2LT5yY19hcHBfc2V0dGluZ3MubnVtX2F0dHJzOwotICAgICAgcF9kZXYtPnJjX2FwcF9zZXR0aW5ncy5hdHRyc1tzdF9pbmRleF0uYXR0cl9pZCA9IHBfcnNwLT5hdHRyc1t4eF07Ci0gICAgICBwX2Rldi0+cmNfYXBwX3NldHRpbmdzLm51bV9hdHRycysrOwotICAgIH0KLSAgfQotICBwX2Rldi0+cmNfYXBwX3NldHRpbmdzLmF0dHJfaW5kZXggPSAwOwotICBwX2Rldi0+cmNfYXBwX3NldHRpbmdzLmV4dF9hdHRyX2luZGV4ID0gMDsKLSAgcF9kZXYtPnJjX2FwcF9zZXR0aW5ncy5leHRfdmFsX2luZGV4ID0gMDsKLSAgaWYgKHBfcnNwLT5udW1fYXR0cikgewotICAgIGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX3ZhbHVlX2NtZChwX2Rldi0+cmNfYXBwX3NldHRpbmdzLmF0dHJzWzBdLmF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2KTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogTm8gUGxheWVyIGFwcGxpY2F0aW9uIHNldHRpbmdzIGZvdW5kIiwgX19mdW5jX18pOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9hcHBfdmFsX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgYXR0cmlidXRlcyB2YWx1ZSByZXNwb25zZSBhbmQgaWYgZXh0ZW5kZWQKLSAqICAgICAgICAgICAgICAgICAgbWVudSBpcyBhdmFpbGFibGUsIGl0IGluaXRpYXRlcyBxdWVyeSBmb3IgdGhlIGF0dHJpYnV0ZQotICogICAgICAgICAgICAgICAgICB0ZXh0LiBJZiBub3QsIGl0IGluaXRpYXRlcyBwcm9jZWR1cmUgdG8gZ2V0IHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGNhbGxzIHRoZSBIQUwgY2FsbGJhY2sgZm9yIHByb3ZkaW5nCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNldHRpbmdzIGluZm9ybWF0aW9uLgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2FwcF92YWxfcmVzcG9uc2UodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTElTVF9BUFBfVkFMVUVTX1JTUCogcF9yc3ApIHsKLSAgdWludDhfdCB4eCwgYXR0cl9pbmRleDsKLSAgdWludDhfdCBhdHRyc1tBVlJDX01BWF9BUFBfQVRUUl9TSVpFXTsKLSAgYnRpZl9yY19wbGF5ZXJfYXBwX3NldHRpbmdzX3QqIHBfYXBwX3NldHRpbmdzOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9Ci0gICAgICBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBtZXRhX21zZy0+cmNfaGFuZGxlKTsKLQotICAvKiBUb2RvOiBEbyB3ZSBuZWVkIHRvIHJldHJ5IG9uIGNvbW1hbmQgdGltZW91dCAqLwotICBpZiAocF9kZXYgPT0gTlVMTCB8fCBwX3JzcC0+c3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIGZldGNoaW5nIGF0dHJpYnV0ZSB2YWx1ZXM6IDB4JTAyWCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9hcHBfc2V0dGluZ3MgPSAmcF9kZXYtPnJjX2FwcF9zZXR0aW5nczsKLQotICBpZiAocF9hcHBfc2V0dGluZ3MtPmF0dHJfaW5kZXggPCBwX2FwcF9zZXR0aW5ncy0+bnVtX2F0dHJzKSB7Ci0gICAgYXR0cl9pbmRleCA9IHBfYXBwX3NldHRpbmdzLT5hdHRyX2luZGV4OwotICAgIHBfYXBwX3NldHRpbmdzLT5hdHRyc1thdHRyX2luZGV4XS5udW1fdmFsID0gcF9yc3AtPm51bV92YWw7Ci0gICAgZm9yICh4eCA9IDA7IHh4IDwgcF9yc3AtPm51bV92YWw7IHh4KyspIHsKLSAgICAgIHBfYXBwX3NldHRpbmdzLT5hdHRyc1thdHRyX2luZGV4XS5hdHRyX3ZhbFt4eF0gPSBwX3JzcC0+dmFsc1t4eF07Ci0gICAgfQotICAgIGF0dHJfaW5kZXgrKzsKLSAgICBwX2FwcF9zZXR0aW5ncy0+YXR0cl9pbmRleCsrOwotICAgIGlmIChhdHRyX2luZGV4IDwgcF9hcHBfc2V0dGluZ3MtPm51bV9hdHRycykgewotICAgICAgbGlzdF9wbGF5ZXJfYXBwX3NldHRpbmdfdmFsdWVfY21kKAotICAgICAgICAgIHBfYXBwX3NldHRpbmdzLT5hdHRyc1twX2FwcF9zZXR0aW5ncy0+YXR0cl9pbmRleF0uYXR0cl9pZCwgcF9kZXYpOwotICAgIH0gZWxzZSBpZiAocF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyX2luZGV4IDwgcF9hcHBfc2V0dGluZ3MtPm51bV9leHRfYXR0cnMpIHsKLSAgICAgIGF0dHJfaW5kZXggPSAwOwotICAgICAgcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyX2luZGV4ID0gMDsKLSAgICAgIGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX3ZhbHVlX2NtZCgKLSAgICAgICAgICBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW2F0dHJfaW5kZXhdLmF0dHJfaWQsIHBfZGV2KTsKLSAgICB9IGVsc2UgewotICAgICAgZm9yICh4eCA9IDA7IHh4IDwgcF9hcHBfc2V0dGluZ3MtPm51bV9hdHRyczsgeHgrKykgewotICAgICAgICBhdHRyc1t4eF0gPSBwX2FwcF9zZXR0aW5ncy0+YXR0cnNbeHhdLmF0dHJfaWQ7Ci0gICAgICB9Ci0gICAgICBnZXRfcGxheWVyX2FwcF9zZXR0aW5nX2NtZChwX2FwcF9zZXR0aW5ncy0+bnVtX2F0dHJzLCBhdHRycywgcF9kZXYpOwotICAgICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NiLAotICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsIHBfYXBwX3NldHRpbmdzLT5udW1fYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICBwX2FwcF9zZXR0aW5ncy0+YXR0cnMsIDAsIG51bGxwdHIpKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyX2luZGV4IDwgcF9hcHBfc2V0dGluZ3MtPm51bV9leHRfYXR0cnMpIHsKLSAgICBhdHRyX2luZGV4ID0gcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyX2luZGV4OwotICAgIHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cnNbYXR0cl9pbmRleF0ubnVtX3ZhbCA9IHBfcnNwLT5udW1fdmFsOwotICAgIGZvciAoeHggPSAwOyB4eCA8IHBfcnNwLT5udW1fdmFsOyB4eCsrKSB7Ci0gICAgICBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW2F0dHJfaW5kZXhdLmV4dF9hdHRyX3ZhbFt4eF0udmFsID0KLSAgICAgICAgICBwX3JzcC0+dmFsc1t4eF07Ci0gICAgfQotICAgIGF0dHJfaW5kZXgrKzsKLSAgICBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJfaW5kZXgrKzsKLSAgICBpZiAoYXR0cl9pbmRleCA8IHBfYXBwX3NldHRpbmdzLT5udW1fZXh0X2F0dHJzKSB7Ci0gICAgICBsaXN0X3BsYXllcl9hcHBfc2V0dGluZ192YWx1ZV9jbWQoCi0gICAgICAgICAgcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyc1twX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJfaW5kZXhdLmF0dHJfaWQsCi0gICAgICAgICAgcF9kZXYpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1aW50OF90IGF0dHJbQVZSQ19NQVhfQVBQX0FUVFJfU0laRV07Ci0KLSAgICAgIGZvciAodWludDhfdCB4eCA9IDA7IHh4IDwgcF9hcHBfc2V0dGluZ3MtPm51bV9leHRfYXR0cnM7IHh4KyspIHsKLSAgICAgICAgYXR0clt4eF0gPSBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3h4XS5hdHRyX2lkOwotICAgICAgfQotICAgICAgZ2V0X3BsYXllcl9hcHBfc2V0dGluZ19hdHRyX3RleHRfY21kKGF0dHIsIHBfYXBwX3NldHRpbmdzLT5udW1fZXh0X2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2KTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGFuZGxlX2FwcF9jdXJfdmFsX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgZ2V0IGF0dHJpYnV0ZXMgdmFsdWUgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2FwcF9jdXJfdmFsX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19HRVRfQ1VSX0FQUF9WQUxVRV9SU1AqIHBfcnNwKSB7Ci0gIGJ0cmNfcGxheWVyX3NldHRpbmdzX3QgYXBwX3NldHRpbmdzOwotICB1aW50MTZfdCB4eDsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPSBOVUxMOwotCi0gIC8qIFRvZG86IERvIHdlIG5lZWQgdG8gcmV0cnkgb24gY29tbWFuZCB0aW1lb3V0ICovCi0gIGlmIChwX3JzcC0+c3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIGZldGNoaW5nIGN1cnJlbnQgc2V0dGluZ3M6IDB4JTAyWCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwbWV0YV9tc2ctPnJjX2hhbmRsZSk7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIGluIGdldHRpbmcgRGV2aWNlIEFkZHJlc3MiLCBfX2Z1bmNfXyk7Ci0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfcnNwLT5wX3ZhbHMpOwotICAgIHJldHVybjsKLSAgfQotCi0KLSAgYXBwX3NldHRpbmdzLm51bV9hdHRyID0gcF9yc3AtPm51bV92YWw7Ci0KLSAgaWYgKGFwcF9zZXR0aW5ncy5udW1fYXR0ciA+IEJUUkNfTUFYX0FQUF9TRVRUSU5HUykgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzM4MjQxNTAiKTsKLSAgICBhcHBfc2V0dGluZ3MubnVtX2F0dHIgPSBCVFJDX01BWF9BUFBfU0VUVElOR1M7Ci0gIH0KLQotICBmb3IgKHh4ID0gMDsgeHggPCBhcHBfc2V0dGluZ3MubnVtX2F0dHI7IHh4KyspIHsKLSAgICBhcHBfc2V0dGluZ3MuYXR0cl9pZHNbeHhdID0gcF9yc3AtPnBfdmFsc1t4eF0uYXR0cl9pZDsKLSAgICBhcHBfc2V0dGluZ3MuYXR0cl92YWx1ZXNbeHhdID0gcF9yc3AtPnBfdmFsc1t4eF0uYXR0cl92YWw7Ci0gIH0KLQotICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NoYW5nZWRfY2IsCi0gICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyLCBhcHBfc2V0dGluZ3MpKTsKLSAgLyogQXBwbGljYXRpb24gc2V0dGluZ3MgYXJlIGZldGNoZWQgb25seSBvbmNlIGZvciBpbml0aWFsIHZhbHVlcwotICAgKiBpbml0aWF0ZSBhbnl0aGluZyB0aGF0IGZvbGxvd3MgYWZ0ZXIgUkMgcHJvY2VkdXJlLgotICAgKiBEZWZlciBpdCBpZiBicm93c2luZyBpcyBzdXBwb3J0ZWQgdGlsbCBwbGF5ZXJzIHF1ZXJ5Ci0gICAqLwotICByY19jdHJsX3Byb2NlZHVyZV9jb21wbGV0ZShwX2Rldik7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3JzcC0+cF92YWxzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGFuZGxlX2FwcF9hdHRyX3R4dF9yZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaGFuZGxlcyB0aGUgdGhlIGdldCBhdHRyaWJ1dGVzIHRleHQgcmVzcG9uc2UsIGlmIGZhaWxzCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxzIEhBTCBjYWxsYmFjayB3aXRoIGp1c3Qgbm9ybWFsIHNldHRpbmdzIGFuZCBpbml0aWF0ZXMKLSAqICAgICAgICAgICAgICAgICAgcXVlcnkgZm9yIGN1cnJlbnQgc2V0dGluZ3MgZWxzZSBpbml0aWF0ZXMgcXVlcnkgZm9yIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgIHRleHQKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9hcHBfYXR0cl90eHRfcmVzcG9uc2UodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19HRVRfQVBQX0FUVFJfVFhUX1JTUCogcF9yc3ApIHsKLSAgdWludDhfdCB4eDsKLSAgdWludDhfdCB2YWxzW0FWUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotICBidGlmX3JjX3BsYXllcl9hcHBfc2V0dGluZ3NfdCogcF9hcHBfc2V0dGluZ3M7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHBfZGV2IE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9hcHBfc2V0dGluZ3MgPSAmcF9kZXYtPnJjX2FwcF9zZXR0aW5nczsKLQotICAvKiBUb2RvOiBEbyB3ZSBuZWVkIHRvIHJldHJ5IG9uIGNvbW1hbmQgdGltZW91dCAqLwotICBpZiAocF9yc3AtPnN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIHVpbnQ4X3QgYXR0cnNbQVZSQ19NQVhfQVBQX0FUVFJfU0laRV07Ci0KLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3IgZmV0Y2hpbmcgYXR0cmlidXRlIHRleHQ6IDB4JTAyWCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnN0YXR1cyk7Ci0gICAgLyogTm90IGFibGUgdG8gZmV0Y2ggVGV4dCBmb3IgZXh0ZW5kZWQgTWVudSwgc2tpcCB0aGUgcHJvY2VzcwotICAgICAqIGFuZCBjbGVhbnVwIHVzZWQgbWVtb3J5LiBQcm9jZWVkIHRvIGdldCB0aGUgY3VycmVudCBzZXR0aW5ncwotICAgICAqIGZvciBzdGFuZGFyZCBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHBfYXBwX3NldHRpbmdzLT5udW1fZXh0X2F0dHJzID0gMDsKLSAgICBmb3IgKHh4ID0gMDsgeHggPCBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJfaW5kZXg7IHh4KyspIHsKLSAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3h4XS5wX3N0cik7Ci0gICAgfQotICAgIHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cl9pbmRleCA9IDA7Ci0KLSAgICBpZiAocF9kZXYpIHsKLSAgICAgIGZvciAoeHggPSAwOyB4eCA8IHBfYXBwX3NldHRpbmdzLT5udW1fYXR0cnM7IHh4KyspIHsKLSAgICAgICAgYXR0cnNbeHhdID0gcF9hcHBfc2V0dGluZ3MtPmF0dHJzW3h4XS5hdHRyX2lkOwotICAgICAgfQotCi0gICAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICBiYXNlOjpCaW5kKGJ0X3JjX2N0cmxfY2FsbGJhY2tzLT5wbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdfY2IsCi0gICAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfYWRkciwgcF9hcHBfc2V0dGluZ3MtPm51bV9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgIHBfYXBwX3NldHRpbmdzLT5hdHRycywgMCwgbnVsbHB0cikpOwotICAgICAgZ2V0X3BsYXllcl9hcHBfc2V0dGluZ19jbWQoeHgsIGF0dHJzLCBwX2Rldik7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoeHggPSAwOyB4eCA8IHBfcnNwLT5udW1fYXR0cjsgeHgrKykgewotICAgIHVpbnQ4X3QgeDsKLSAgICBmb3IgKHggPSAwOyB4IDwgcF9hcHBfc2V0dGluZ3MtPm51bV9leHRfYXR0cnM7IHgrKykgewotICAgICAgaWYgKHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cnNbeF0uYXR0cl9pZCA9PSBwX3JzcC0+cF9hdHRyc1t4eF0uYXR0cl9pZCkgewotICAgICAgICBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3hdLmNoYXJzZXRfaWQgPSBwX3JzcC0+cF9hdHRyc1t4eF0uY2hhcnNldF9pZDsKLSAgICAgICAgcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyc1t4XS5zdHJfbGVuID0gcF9yc3AtPnBfYXR0cnNbeHhdLnN0cl9sZW47Ci0gICAgICAgIHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cnNbeF0ucF9zdHIgPSBwX3JzcC0+cF9hdHRyc1t4eF0ucF9zdHI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZvciAoeHggPSAwOyB4eCA8IHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cnNbMF0ubnVtX3ZhbDsgeHgrKykgewotICAgIHZhbHNbeHhdID0gcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyc1swXS5leHRfYXR0cl92YWxbeHhdLnZhbDsKLSAgfQotICBnZXRfcGxheWVyX2FwcF9zZXR0aW5nX3ZhbHVlX3RleHRfY21kKHZhbHMsIHh4LCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9hcHBfYXR0cl92YWxfdHh0X3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgZ2V0IGF0dHJpYnV0ZXMgdmFsdWUgdGV4dCByZXNwb25zZSwgaWYgZmFpbHMKLSAqICAgICAgICAgICAgICAgICAgY2FsbHMgSEFMIGNhbGxiYWNrIHdpdGgganVzdCBub3JtYWwgc2V0dGluZ3MgYW5kIGluaXRpYXRlcwotICogICAgICAgICAgICAgICAgICBxdWVyeSBmb3IgY3VycmVudCBzZXR0aW5ncwotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2FwcF9hdHRyX3ZhbF90eHRfcmVzcG9uc2UoCi0gICAgdEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnLCB0QVZSQ19HRVRfQVBQX0FUVFJfVFhUX1JTUCogcF9yc3ApIHsKLSAgdWludDhfdCB4eCwgYXR0cl9pbmRleDsKLSAgdWludDhfdCB2YWxzW0FWUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotICB1aW50OF90IGF0dHJzW0FWUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotICBidGlmX3JjX3BsYXllcl9hcHBfc2V0dGluZ3NfdCogcF9hcHBfc2V0dGluZ3M7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHBfZGV2IE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9hcHBfc2V0dGluZ3MgPSAmcF9kZXYtPnJjX2FwcF9zZXR0aW5nczsKLQotICAvKiBUb2RvOiBEbyB3ZSBuZWVkIHRvIHJldHJ5IG9uIGNvbW1hbmQgdGltZW91dCAqLwotICBpZiAocF9yc3AtPnN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIHVpbnQ4X3QgYXR0cnNbQVZSQ19NQVhfQVBQX0FUVFJfU0laRV07Ci0KLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3IgZmV0Y2hpbmcgYXR0cmlidXRlIHZhbHVlIHRleHQ6IDB4JTAyWCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9yc3AtPnN0YXR1cyk7Ci0KLSAgICAvKiBOb3QgYWJsZSB0byBmZXRjaCBUZXh0IGZvciBleHRlbmRlZCBNZW51LCBza2lwIHRoZSBwcm9jZXNzCi0gICAgICogYW5kIGNsZWFudXAgdXNlZCBtZW1vcnkuIFByb2NlZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmdzCi0gICAgICogZm9yIHN0YW5kYXJkIGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcF9hcHBfc2V0dGluZ3MtPm51bV9leHRfYXR0cnMgPSAwOwotICAgIGZvciAoeHggPSAwOyB4eCA8IHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cl9pbmRleDsgeHgrKykgewotICAgICAgaW50IHg7Ci0gICAgICBidHJjX3BsYXllcl9hcHBfZXh0X2F0dHJfdCogcF9leHRfYXR0ciA9ICZwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3h4XTsKLQotICAgICAgZm9yICh4ID0gMDsgeCA8IHBfZXh0X2F0dHItPm51bV92YWw7IHgrKykKLSAgICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZXh0X2F0dHItPmV4dF9hdHRyX3ZhbFt4XS5wX3N0cik7Ci0gICAgICBwX2V4dF9hdHRyLT5udW1fdmFsID0gMDsKLSAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3h4XS5wX3N0cik7Ci0gICAgfQotICAgIHBfYXBwX3NldHRpbmdzLT5leHRfYXR0cl9pbmRleCA9IDA7Ci0KLSAgICBmb3IgKHh4ID0gMDsgeHggPCBwX2FwcF9zZXR0aW5ncy0+bnVtX2F0dHJzOyB4eCsrKSB7Ci0gICAgICBhdHRyc1t4eF0gPSBwX2FwcF9zZXR0aW5ncy0+YXR0cnNbeHhdLmF0dHJfaWQ7Ci0gICAgfQotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsIHBfYXBwX3NldHRpbmdzLT5udW1fYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FwcF9zZXR0aW5ncy0+YXR0cnMsIDAsIG51bGxwdHIpKTsKLQotICAgIGdldF9wbGF5ZXJfYXBwX3NldHRpbmdfY21kKHh4LCBhdHRycywgcF9kZXYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoeHggPSAwOyB4eCA8IHBfcnNwLT5udW1fYXR0cjsgeHgrKykgewotICAgIHVpbnQ4X3QgeDsKLSAgICBidHJjX3BsYXllcl9hcHBfZXh0X2F0dHJfdCogcF9leHRfYXR0cjsKLSAgICBwX2V4dF9hdHRyID0gJnBfYXBwX3NldHRpbmdzLT5leHRfYXR0cnNbcF9hcHBfc2V0dGluZ3MtPmV4dF92YWxfaW5kZXhdOwotICAgIGZvciAoeCA9IDA7IHggPCBwX3JzcC0+bnVtX2F0dHI7IHgrKykgewotICAgICAgaWYgKHBfZXh0X2F0dHItPmV4dF9hdHRyX3ZhbFt4XS52YWwgPT0gcF9yc3AtPnBfYXR0cnNbeHhdLmF0dHJfaWQpIHsKLSAgICAgICAgcF9leHRfYXR0ci0+ZXh0X2F0dHJfdmFsW3hdLmNoYXJzZXRfaWQgPSBwX3JzcC0+cF9hdHRyc1t4eF0uY2hhcnNldF9pZDsKLSAgICAgICAgcF9leHRfYXR0ci0+ZXh0X2F0dHJfdmFsW3hdLnN0cl9sZW4gPSBwX3JzcC0+cF9hdHRyc1t4eF0uc3RyX2xlbjsKLSAgICAgICAgcF9leHRfYXR0ci0+ZXh0X2F0dHJfdmFsW3hdLnBfc3RyID0gcF9yc3AtPnBfYXR0cnNbeHhdLnBfc3RyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcF9hcHBfc2V0dGluZ3MtPmV4dF92YWxfaW5kZXgrKzsKLQotICBpZiAocF9hcHBfc2V0dGluZ3MtPmV4dF92YWxfaW5kZXggPCBwX2FwcF9zZXR0aW5ncy0+bnVtX2V4dF9hdHRycykgewotICAgIGF0dHJfaW5kZXggPSBwX2FwcF9zZXR0aW5ncy0+ZXh0X3ZhbF9pbmRleDsKLSAgICBmb3IgKHh4ID0gMDsgeHggPCBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW2F0dHJfaW5kZXhdLm51bV92YWw7IHh4KyspIHsKLSAgICAgIHZhbHNbeHhdID0gcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyc1thdHRyX2luZGV4XS5leHRfYXR0cl92YWxbeHhdLnZhbDsKLSAgICB9Ci0gICAgZ2V0X3BsYXllcl9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X2NtZCh2YWxzLCB4eCwgcF9kZXYpOwotICB9IGVsc2UgewotICAgIHVpbnQ4X3QgeDsKLQotICAgIGZvciAoeHggPSAwOyB4eCA8IHBfYXBwX3NldHRpbmdzLT5udW1fYXR0cnM7IHh4KyspIHsKLSAgICAgIGF0dHJzW3h4XSA9IHBfYXBwX3NldHRpbmdzLT5hdHRyc1t4eF0uYXR0cl9pZDsKLSAgICB9Ci0gICAgZm9yICh4ID0gMDsgeCA8IHBfYXBwX3NldHRpbmdzLT5udW1fZXh0X2F0dHJzOyB4KyspIHsKLSAgICAgIGF0dHJzW3h4ICsgeF0gPSBwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3hdLmF0dHJfaWQ7Ci0gICAgfQotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NiLAotICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyLCBwX2FwcF9zZXR0aW5ncy0+bnVtX2F0dHJzLAotICAgICAgICAgICAgICAgICAgIHBfYXBwX3NldHRpbmdzLT5hdHRycywgcF9hcHBfc2V0dGluZ3MtPm51bV9leHRfYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRycykpOwotICAgIGdldF9wbGF5ZXJfYXBwX3NldHRpbmdfY21kKHh4ICsgeCwgYXR0cnMsIHBfZGV2KTsKLQotICAgIC8qIEZyZWUgdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzIGluZm9ybWF0aW9uIGFmdGVyIHNlbmRpbmcgdG8KLSAgICAgKiBhcHBsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChjbGVhbnVwX2FwcF9hdHRyX3ZhbF90eHRfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hcHBfc2V0dGluZ3MpKTsKLSAgICBwX2FwcF9zZXR0aW5ncy0+bnVtX2F0dHJzID0gMDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBjbGVhbnVwX2FwcF9hdHRyX3ZhbF90eHRfcmVzcG9uc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZyZWVzIHRoZSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIGZvciByZXBvcnRpbmcgcGxheWVyCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNldHRpbmdzLgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2FwcF9hdHRyX3ZhbF90eHRfcmVzcG9uc2UoCi0gICAgYnRpZl9yY19wbGF5ZXJfYXBwX3NldHRpbmdzX3QqIHBfYXBwX3NldHRpbmdzKSB7Ci0gIGZvciAodWludDhfdCB4eCA9IDA7IHh4IDwgcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyX2luZGV4OyB4eCsrKSB7Ci0gICAgaW50IHg7Ci0gICAgYnRyY19wbGF5ZXJfYXBwX2V4dF9hdHRyX3QqIHBfZXh0X2F0dHIgPSAmcF9hcHBfc2V0dGluZ3MtPmV4dF9hdHRyc1t4eF07Ci0gICAgZm9yICh4ID0gMDsgeCA8IHBfZXh0X2F0dHItPm51bV92YWw7IHgrKykgewotICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZXh0X2F0dHItPmV4dF9hdHRyX3ZhbFt4XS5wX3N0cik7Ci0gICAgfQotICAgIHBfZXh0X2F0dHItPm51bV92YWwgPSAwOwotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2FwcF9zZXR0aW5ncy0+ZXh0X2F0dHJzW3h4XS5wX3N0cik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGFuZGxlX3NldF9hcHBfYXR0cl92YWxfcmVzcG9uc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGhhbmRsZXMgdGhlIHRoZSBzZXQgYXR0cmlidXRlcyB2YWx1ZSByZXNwb25zZSwgaWYgZmFpbHMKLSAqICAgICAgICAgICAgICAgICAgY2FsbHMgSEFMIGNhbGxiYWNrIHRvIGluZGljYXRlIHRoZSBmYWlsdXJlCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoYW5kbGVfc2V0X2FwcF9hdHRyX3ZhbF9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SU1AqIHBfcnNwKSB7Ci0gIHVpbnQ4X3QgYWNjZXB0ZWQgPSAwOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9Ci0gICAgICBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBtZXRhX21zZy0+cmNfaGFuZGxlKTsKLQotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBwX2RldiBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0KLSAgLyogRm9yIHRpbWVvdXQgcG1ldGFfbXNnIHdpbGwgYmUgTlVMTCwgZWxzZSB3ZSBuZWVkIHRvCi0gICAqIGNoZWNrIGlmIHRoaXMgaXMgYWNjZXB0ZWQgYnkgVEcKLSAgICovCi0gIGlmIChwbWV0YV9tc2cgJiYgKHBtZXRhX21zZy0+Y29kZSA9PSBBVlJDX1JTUF9BQ0NFUFQpKSB7Ci0gICAgYWNjZXB0ZWQgPSAxOwotICB9Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPnNldHBsYXllcmFwcHNldHRpbmdfcnNwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsIGFjY2VwdGVkKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9nZXRfbWV0YWRhdGFfYXR0cl9yZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaGFuZGxlcyB0aGUgdGhlIGVsZW1lbnQgYXR0cmlidXRlcyByZXNwb25zZSwgY2FsbHMKLSAqICAgICAgICAgICAgICAgICAgSEFMIGNhbGxiYWNrIHRvIHVwZGF0ZSB0cmFjayBjaGFuZ2UgaW5mb3JtYXRpb24uCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoYW5kbGVfZ2V0X21ldGFkYXRhX2F0dHJfcmVzcG9uc2UodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfR0VUX0FUVFJTX1JTUCogcF9yc3ApIHsKLSAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYgPQotICAgICAgYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwbWV0YV9tc2ctPnJjX2hhbmRsZSk7Ci0KLSAgaWYgKHBfcnNwLT5zdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICBzaXplX3QgYnVmX3NpemUgPSBwX3JzcC0+bnVtX2F0dHJzICogc2l6ZW9mKGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90KTsKLSAgICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCogcF9hdHRyID0KLSAgICAgICAgKGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90Kilvc2lfY2FsbG9jKGJ1Zl9zaXplKTsKLQotICAgIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXYgTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcF9yc3AtPm51bV9hdHRyczsgaSsrKSB7Ci0gICAgICBwX2F0dHJbaV0uYXR0cl9pZCA9IHBfcnNwLT5wX2F0dHJzW2ldLmF0dHJfaWQ7Ci0gICAgICAvKiBUb2RvLiBMZWd0aCBsaW1pdCBjaGVjayB0byBpbmNsdWRlIG51bGwgKi8KLSAgICAgIGlmIChwX3JzcC0+cF9hdHRyc1tpXS5uYW1lLnN0cl9sZW4gJiYgcF9yc3AtPnBfYXR0cnNbaV0ubmFtZS5wX3N0cikgewotICAgICAgICBtZW1jcHkocF9hdHRyW2ldLnRleHQsIHBfcnNwLT5wX2F0dHJzW2ldLm5hbWUucF9zdHIsCi0gICAgICAgICAgICAgICBwX3JzcC0+cF9hdHRyc1tpXS5uYW1lLnN0cl9sZW4pOwotICAgICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9yc3AtPnBfYXR0cnNbaV0ubmFtZS5wX3N0cik7Ci0gICAgICB9Ci0gICAgfQotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+dHJhY2tfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXYtPnJjX2FkZHIsIHBfcnNwLT5udW1fYXR0cnMsIHBfYXR0cikpOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKG9zaV9mcmVlLCBwX2F0dHIpKTsKLSAgfSBlbHNlIGlmIChwX3JzcC0+c3RhdHVzID09IEJUSUZfUkNfU1RTX1RJTUVPVVQpIHsKLSAgICAvKiBSZXRyeSBmb3IgdGltZW91dCBjYXNlLCB0aGlzIGNvdmVycyBlcnJvciBoYW5kbGluZwotICAgICAqIGZvciBjb250aW51YXRpb24gZmFpbHVyZSBhbHNvLgotICAgICAqLwotICAgIGNvbnN0IHVpbnQzMl90KiBhdHRyX2xpc3QgPSBnZXRfcmVxdWVzdGVkX2F0dHJpYnV0ZXNfbGlzdChwX2Rldik7Ci0gICAgY29uc3QgdWludDhfdCBhdHRyX2xpc3Rfc2l6ZSA9IGdldF9yZXF1ZXN0ZWRfYXR0cmlidXRlc19saXN0X3NpemUocF9kZXYpOwotICAgIGdldF9tZXRhZGF0YV9hdHRyaWJ1dGVfY21kKGF0dHJfbGlzdF9zaXplLCBhdHRyX2xpc3QsIHBfZGV2KTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3IgaW4gZ2V0IGVsZW1lbnQgYXR0ciBwcm9jZWR1cmU6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3JzcC0+c3RhdHVzKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoYW5kbGVfZ2V0X3BsYXlzdGF0dXNfcmVzcG9uc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGhhbmRsZXMgdGhlIHRoZSBwbGF5IHN0YXR1cyByZXNwb25zZSwgY2FsbHMKLSAqICAgICAgICAgICAgICAgICAgSEFMIGNhbGxiYWNrIHRvIHVwZGF0ZSBwbGF5IHBvc2l0aW9uLgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2dldF9wbGF5c3RhdHVzX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19HRVRfUExBWV9TVEFUVVNfUlNQKiBwX3JzcCkgewotCi0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHBfZGV2IE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLQotICBpZiAocF9yc3AtPnN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+cGxheV9zdGF0dXNfY2hhbmdlZF9jYiwgcF9kZXYtPnJjX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgKGJ0cmNfcGxheV9zdGF0dXNfdClwX3JzcC0+cGxheV9zdGF0dXMpKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPnBsYXlfcG9zaXRpb25fY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfYWRkciwgcF9yc3AtPnNvbmdfbGVuLCBwX3JzcC0+c29uZ19wb3MpKTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogRXJyb3IgaW4gZ2V0IHBsYXkgc3RhdHVzIHByb2NlZHVyZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfcnNwLT5zdGF0dXMpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9zZXRfYWRkcmVzc2VkX3BsYXllcl9yZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaGFuZGxlcyB0aGUgdGhlIHNldCBhZGRyZXNzZWQgcGxheWVyIHJlc3BvbnNlLCBjYWxscwotICogICAgICAgICAgICAgICAgICBIQUwgY2FsbGJhY2sKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9zZXRfYWRkcmVzc2VkX3BsYXllcl9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfUlNQKiBwX3JzcCkgewotCi0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHBfZGV2IE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLQotICBpZiAocF9yc3AtPnN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+c2V0X2FkZHJlc3NlZF9wbGF5ZXJfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyLCBwX3JzcC0+c3RhdHVzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEVycm9yIGluIGdldCBwbGF5IHN0YXR1cyBwcm9jZWR1cmUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfcnNwLT5zdGF0dXMpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9nZXRfZm9sZGVyX2l0ZW1zX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgZ2V0IGZvbGRlciBpdGVtcyByZXNwb25zZSwgY2FsbHMKLSAqICAgICAgICAgICAgICAgICAgSEFMIGNhbGxiYWNrIHRvIHNlbmQgdGhlIGZvbGRlciBpdGVtcy4KLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9nZXRfZm9sZGVyX2l0ZW1zX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX0dFVF9JVEVNU19SU1AqIHBfcnNwKSB7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIGlmIChwX3JzcC0+c3RhdHVzID09IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgLyogQ29udmVydCB0aGUgaW50ZXJuYWwgZm9sZGVyIGxpc3RpbmcgaW50byBhIHJlc3BvbnNlIHRoYXQgY2FuCi0gICAgICogYmUgcGFzc2VkIG9udG8gSk5JIHZpYSBIQUxfQ0JBQ0sKLSAgICAgKi8KLSAgICB1aW50OF90IGl0ZW1fY291bnQgPSBwX3JzcC0+aXRlbV9jb3VudDsKLSAgICBidHJjX2ZvbGRlcl9pdGVtc190KiBidHJjX2l0ZW1zID0gKGJ0cmNfZm9sZGVyX2l0ZW1zX3QqKW9zaV9tYWxsb2MoCi0gICAgICAgIHNpemVvZihidHJjX2ZvbGRlcl9pdGVtc190KSAqIGl0ZW1fY291bnQpOwotICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGl0ZW1fY291bnQ7IGkrKykgewotICAgICAgY29uc3QgdEFWUkNfSVRFTSogYXZyY19pdGVtID0gJihwX3JzcC0+cF9pdGVtX2xpc3RbaV0pOwotICAgICAgYnRyY19mb2xkZXJfaXRlbXNfdCogYnRyY19pdGVtID0gJihidHJjX2l0ZW1zW2ldKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIGZvbGRlciBpdGVtIHR5cGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgYXZyY19pdGVtLT5pdGVtX3R5cGUpOwotICAgICAgc3dpdGNoIChhdnJjX2l0ZW0tPml0ZW1fdHlwZSkgewotICAgICAgICBjYXNlIEFWUkNfSVRFTV9NRURJQToKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBzZXR0aW5nIHR5cGUgdG8gJWQiLCBfX2Z1bmNfXywgQlRSQ19JVEVNX01FRElBKTsKLSAgICAgICAgICAvKiBBbGxvY2F0ZSBTcGFjZSBmb3IgQXR0cmlidXRlcyAqLwotICAgICAgICAgIGJ0cmNfaXRlbS0+bWVkaWEubnVtX2F0dHJzID0gYXZyY19pdGVtLT51Lm1lZGlhLmF0dHJfY291bnQ7Ci0gICAgICAgICAgYnRyY19pdGVtLT5tZWRpYS5wX2F0dHJzID0gKGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90Kilvc2lfbWFsbG9jKAotICAgICAgICAgICAgICBidHJjX2l0ZW0tPm1lZGlhLm51bV9hdHRycyAqIHNpemVvZihidHJjX2VsZW1lbnRfYXR0cl92YWxfdCkpOwotICAgICAgICAgIGdldF9mb2xkZXJfaXRlbV90eXBlX21lZGlhKGF2cmNfaXRlbSwgYnRyY19pdGVtKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFWUkNfSVRFTV9GT0xERVI6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgc2V0dGluZyB0eXBlIHRvIEJUUkNfSVRFTV9GT0xERVIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfZm9sZGVyKGF2cmNfaXRlbSwgYnRyY19pdGVtKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFWUkNfSVRFTV9QTEFZRVI6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgc2V0dGluZyB0eXBlIHRvIEJUUkNfSVRFTV9QTEFZRVIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfcGxheWVyKGF2cmNfaXRlbSwgYnRyY19pdGVtKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzIGNhbm5vdCB1bmRlcnN0YW5kIGZvbGRlciBpdGVtIHR5cGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cmNfaXRlbS0+aXRlbV90eXBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPmdldF9mb2xkZXJfaXRlbXNfY2IsIHBfZGV2LT5yY19hZGRyLAotICAgICAgICAgICAgICAgICAgIEJUUkNfU1RTX05PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgIC8qIFdlIHdhbnQgdG8gbWFrZSB0aGUgb3duZXJzaGlwIGV4cGxpY2l0IGluIG5hdGl2ZSAqLwotICAgICAgICAgICAgICAgICAgIGJ0cmNfaXRlbXMsIGl0ZW1fY291bnQpKTsKLQotICAgIGlmIChpdGVtX2NvdW50ID4gMCkgewotICAgICAgaWYgKGJ0cmNfaXRlbXNbMF0uaXRlbV90eXBlID09IEFWUkNfSVRFTV9QTEFZRVIgJiYKLSAgICAgICAgICAocF9kZXYtPnJjX2ZlYXR1cmVzICYgQlRBX0FWX0ZFQVRfQVBQX1NFVFRJTkcpKSB7Ci0gICAgICAgIGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJpYl9jbWQocF9kZXYpOwotICAgICAgfQotICAgIH0KLSAgICAvKiBSZWxlYXNlIHRoZSBtZW1vcnkgYmxvY2sgZm9yIGl0ZW1zIGFuZCBhdHRyaWJ1dGVzIGFsbG9jYXRlZCBoZXJlLgotICAgICAqIFNpbmNlIHRoZSBleGVjdXRvciBmb3IgZG9faW5fam5pX3RocmVhZCBpcyBhIFNpbmdsZSBUaHJlYWQgVGFzayBSdW5uZXIgaXQKLSAgICAgKiBpcyBva2F5IHRvIHF1ZXVlIHVwIHRoZSBjbGVhbnVwIG9mIGJ0cmNfaXRlbXMgKi8KLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChjbGVhbnVwX2J0cmNfZm9sZGVyX2l0ZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfaXRlbXMsIGl0ZW1fY291bnQpKTsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIGdldF9mb2xkZXJfaXRlbXNfY2Igc2VudCB0byBKTkkgdGhyZWFkIiwgX19mdW5jX18pOwotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciAlZCIsIF9fZnVuY19fLCBwX3JzcC0+c3RhdHVzKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoYnRfcmNfY3RybF9jYWxsYmFja3MtPmdldF9mb2xkZXJfaXRlbXNfY2IsIHBfZGV2LT5yY19hZGRyLAotICAgICAgICAgICAgICAgICAgIChidHJjX3N0YXR1c190KXBfcnNwLT5zdGF0dXMsIG51bGxwdHIsIDApKTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY2xlYW51cF9idHJjX2ZvbGRlcl9pdGVtcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRnJlZXMgdGhlIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgZm9yIGEgbGlzdCBvZiBmb2xkZXIKLSAqICAgICAgICAgICAgICAgICAgaXRlbXMuCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNsZWFudXBfYnRyY19mb2xkZXJfaXRlbXMoYnRyY19mb2xkZXJfaXRlbXNfdCogYnRyY19pdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpdGVtX2NvdW50KSB7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IGl0ZW1fY291bnQ7IGkrKykgewotICAgIGJ0cmNfZm9sZGVyX2l0ZW1zX3QqIGJ0cmNfaXRlbSA9ICYoYnRyY19pdGVtc1tpXSk7Ci0gICAgc3dpdGNoIChidHJjX2l0ZW0tPml0ZW1fdHlwZSkgewotICAgICAgY2FzZSBCVFJDX0lURU1fTUVESUE6Ci0gICAgICAgIG9zaV9mcmVlKGJ0cmNfaXRlbS0+bWVkaWEucF9hdHRycyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVFJDX0lURU1fUExBWUVSOgotICAgICAgY2FzZSBCVFJDX0lURU1fRk9MREVSOgotICAgICAgICAvKk5vdGhpbmcgdG8gZnJlZSovCi0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlcyBmcmVlIHVuc3BlY2lmaWVkIHR5cGUiLCBfX2Z1bmNfXyk7Ci0gICAgfQotICB9Ci0gIG9zaV9mcmVlKGJ0cmNfaXRlbXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfZm9sZGVyX2l0ZW1fdHlwZV9tZWRpYQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29udmVydHMgdGhlIEFWUkMgcmVwcmVzZW50YXRpb24gb2YgYSBmb2xkZXIgaXRlbSB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIFRZUEUgbWVkaWEgdG8gQlRJRiByZXByZXNlbnRhdGlvbi4KLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfbWVkaWEoY29uc3QgdEFWUkNfSVRFTSogYXZyY19pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2ZvbGRlcl9pdGVtc190KiBidHJjX2l0ZW0pIHsKLSAgYnRyY19pdGVtLT5pdGVtX3R5cGUgPSBCVFJDX0lURU1fTUVESUE7Ci0gIGNvbnN0IHRBVlJDX0lURU1fTUVESUEqIGF2cmNfaXRlbV9tZWRpYSA9ICYoYXZyY19pdGVtLT51Lm1lZGlhKTsKLSAgYnRyY19pdGVtX21lZGlhX3QqIGJ0cmNfaXRlbV9tZWRpYSA9ICYoYnRyY19pdGVtLT5tZWRpYSk7Ci0gIC8qIFVJRCAqLwotICBtZW1zZXQoYnRyY19pdGVtX21lZGlhLT51aWQsIDAsIEJUUkNfVUlEX1NJWkUgKiBzaXplb2YodWludDhfdCkpOwotICBtZW1jcHkoYnRyY19pdGVtX21lZGlhLT51aWQsIGF2cmNfaXRlbV9tZWRpYS0+dWlkLAotICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICogQlRSQ19VSURfU0laRSk7Ci0KLSAgLyogQXVkaW8vVmlkZW8gdHlwZSAqLwotICBzd2l0Y2ggKGF2cmNfaXRlbV9tZWRpYS0+dHlwZSkgewotICAgIGNhc2UgQVZSQ19NRURJQV9UWVBFX0FVRElPOgotICAgICAgYnRyY19pdGVtX21lZGlhLT50eXBlID0gQlRSQ19NRURJQV9UWVBFX0FVRElPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX01FRElBX1RZUEVfVklERU86Ci0gICAgICBidHJjX2l0ZW1fbWVkaWEtPnR5cGUgPSBCVFJDX01FRElBX1RZUEVfVklERU87Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIENoYXJzZXQgSUQgKi8KLSAgYnRyY19pdGVtX21lZGlhLT5jaGFyc2V0X2lkID0gYXZyY19pdGVtX21lZGlhLT5uYW1lLmNoYXJzZXRfaWQ7Ci0KLSAgLyogQ29weSB0aGUgbmFtZSAqLwotICBCVElGX1RSQUNFX0RFQlVHKCIlcyBtYXggbGVuICVkIHN0ciBsZW4gJWQiLCBfX2Z1bmNfXywgQlRSQ19NQVhfQVRUUl9TVFJfTEVOLAotICAgICAgICAgICAgICAgICAgIGF2cmNfaXRlbV9tZWRpYS0+bmFtZS5zdHJfbGVuKTsKLSAgbWVtc2V0KGJ0cmNfaXRlbV9tZWRpYS0+bmFtZSwgMCwgQlRSQ19NQVhfQVRUUl9TVFJfTEVOICogc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgbWVtY3B5KGJ0cmNfaXRlbV9tZWRpYS0+bmFtZSwgYXZyY19pdGVtX21lZGlhLT5uYW1lLnBfc3RyLAotICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICogKGF2cmNfaXRlbV9tZWRpYS0+bmFtZS5zdHJfbGVuKSk7Ci0KLSAgLyogRXh0cmFjdCBlYWNoIGF0dHJpYnV0ZSAqLwotICBmb3IgKGludCBpID0gMDsgaSA8IGF2cmNfaXRlbV9tZWRpYS0+YXR0cl9jb3VudDsgaSsrKSB7Ci0gICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIGJ0cmNfYXR0cl9wYWlyID0gJihidHJjX2l0ZW1fbWVkaWEtPnBfYXR0cnNbaV0pOwotICAgIHRBVlJDX0FUVFJfRU5UUlkqIGF2cmNfYXR0cl9wYWlyID0gJihhdnJjX2l0ZW1fbWVkaWEtPnBfYXR0cl9saXN0W2ldKTsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIG1lZGlhIGF0dHIgaWQgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYXZyY19hdHRyX3BhaXItPmF0dHJfaWQpOwotCi0gICAgc3dpdGNoIChhdnJjX2F0dHJfcGFpci0+YXR0cl9pZCkgewotICAgICAgY2FzZSBBVlJDX01FRElBX0FUVFJfSURfVElUTEU6Ci0gICAgICAgIGJ0cmNfYXR0cl9wYWlyLT5hdHRyX2lkID0gQlRSQ19NRURJQV9BVFRSX0lEX1RJVExFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVZSQ19NRURJQV9BVFRSX0lEX0FSVElTVDoKLSAgICAgICAgYnRyY19hdHRyX3BhaXItPmF0dHJfaWQgPSBCVFJDX01FRElBX0FUVFJfSURfQVJUSVNUOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVZSQ19NRURJQV9BVFRSX0lEX0FMQlVNOgotICAgICAgICBidHJjX2F0dHJfcGFpci0+YXR0cl9pZCA9IEJUUkNfTUVESUFfQVRUUl9JRF9BTEJVTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFWUkNfTUVESUFfQVRUUl9JRF9UUkFDS19OVU06Ci0gICAgICAgIGJ0cmNfYXR0cl9wYWlyLT5hdHRyX2lkID0gQlRSQ19NRURJQV9BVFRSX0lEX1RSQUNLX05VTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFWUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTOgotICAgICAgICBidHJjX2F0dHJfcGFpci0+YXR0cl9pZCA9IEJUUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVZSQ19NRURJQV9BVFRSX0lEX0dFTlJFOgotICAgICAgICBidHJjX2F0dHJfcGFpci0+YXR0cl9pZCA9IEJUUkNfTUVESUFfQVRUUl9JRF9HRU5SRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFWUkNfTUVESUFfQVRUUl9JRF9QTEFZSU5HX1RJTUU6Ci0gICAgICAgIGJ0cmNfYXR0cl9wYWlyLT5hdHRyX2lkID0gQlRSQ19NRURJQV9BVFRSX0lEX1BMQVlJTkdfVElNRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFWUkNfTUVESUFfQVRUUl9JRF9DT1ZFUl9BUlRXT1JLX0hBTkRMRToKLSAgICAgICAgYnRyY19hdHRyX3BhaXItPmF0dHJfaWQgPSBCVFJDX01FRElBX0FUVFJfSURfQ09WRVJfQVJUV09SS19IQU5ETEU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXMgaW52YWxpZCBtZWRpYSBhdHRyIGlkOiAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXZyY19hdHRyX3BhaXItPmF0dHJfaWQpOwotICAgICAgICBidHJjX2F0dHJfcGFpci0+YXR0cl9pZCA9IEJUUkNfTUVESUFfQVRUUl9JRF9JTlZBTElEOwotICAgIH0KLQotICAgIG1lbXNldChidHJjX2F0dHJfcGFpci0+dGV4dCwgMCwgQlRSQ19NQVhfQVRUUl9TVFJfTEVOICogc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICBtZW1jcHkoYnRyY19hdHRyX3BhaXItPnRleHQsIGF2cmNfYXR0cl9wYWlyLT5uYW1lLnBfc3RyLAotICAgICAgICAgICBhdnJjX2F0dHJfcGFpci0+bmFtZS5zdHJfbGVuKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfZm9sZGVyX2l0ZW1fdHlwZV9mb2xkZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbnZlcnRzIHRoZSBBVlJDIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9sZGVyIGl0ZW0gd2l0aAotICogICAgICAgICAgICAgICAgICBUWVBFIGZvbGRlciB0byBCVElGIHJlcHJlc2VudGF0aW9uLgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnZXRfZm9sZGVyX2l0ZW1fdHlwZV9mb2xkZXIoY29uc3QgdEFWUkNfSVRFTSogYXZyY19pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19mb2xkZXJfaXRlbXNfdCogYnRyY19pdGVtKSB7Ci0gIGJ0cmNfaXRlbS0+aXRlbV90eXBlID0gQlRSQ19JVEVNX0ZPTERFUjsKLSAgY29uc3QgdEFWUkNfSVRFTV9GT0xERVIqIGF2cmNfaXRlbV9mb2xkZXIgPSAmKGF2cmNfaXRlbS0+dS5mb2xkZXIpOwotICBidHJjX2l0ZW1fZm9sZGVyX3QqIGJ0cmNfaXRlbV9mb2xkZXIgPSAmKGJ0cmNfaXRlbS0+Zm9sZGVyKTsKLSAgLyogQ29weSB0aGUgVUlEICovCi0gIG1lbXNldChidHJjX2l0ZW1fZm9sZGVyLT51aWQsIDAsIEJUUkNfVUlEX1NJWkUgKiBzaXplb2YodWludDhfdCkpOwotICBtZW1jcHkoYnRyY19pdGVtX2ZvbGRlci0+dWlkLCBhdnJjX2l0ZW1fZm9sZGVyLT51aWQsCi0gICAgICAgICBzaXplb2YodWludDhfdCkgKiBCVFJDX1VJRF9TSVpFKTsKLQotICAvKiBDb3B5IHRoZSB0eXBlICovCi0gIHN3aXRjaCAoYXZyY19pdGVtX2ZvbGRlci0+dHlwZSkgewotICAgIGNhc2UgQVZSQ19GT0xERVJfVFlQRV9NSVhFRDoKLSAgICAgIGJ0cmNfaXRlbV9mb2xkZXItPnR5cGUgPSBCVFJDX0ZPTERFUl9UWVBFX01JWEVEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX0ZPTERFUl9UWVBFX1RJVExFUzoKLSAgICAgIGJ0cmNfaXRlbV9mb2xkZXItPnR5cGUgPSBCVFJDX0ZPTERFUl9UWVBFX1RJVExFUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19GT0xERVJfVFlQRV9BTE5VTVM6Ci0gICAgICBidHJjX2l0ZW1fZm9sZGVyLT50eXBlID0gQlRSQ19GT0xERVJfVFlQRV9BTEJVTVM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfRk9MREVSX1RZUEVfQVJUSVNUUzoKLSAgICAgIGJ0cmNfaXRlbV9mb2xkZXItPnR5cGUgPSBCVFJDX0ZPTERFUl9UWVBFX0FSVElTVFM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfRk9MREVSX1RZUEVfR0VOUkVTOgotICAgICAgYnRyY19pdGVtX2ZvbGRlci0+dHlwZSA9IEJUUkNfRk9MREVSX1RZUEVfR0VOUkVTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX0ZPTERFUl9UWVBFX1BMQVlMSVNUUzoKLSAgICAgIGJ0cmNfaXRlbV9mb2xkZXItPnR5cGUgPSBCVFJDX0ZPTERFUl9UWVBFX1BMQVlMSVNUUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19GT0xERVJfVFlQRV9ZRUFSUzoKLSAgICAgIGJ0cmNfaXRlbV9mb2xkZXItPnR5cGUgPSBCVFJDX0ZPTERFUl9UWVBFX1lFQVJTOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvKiBDb3B5IGlmIHBsYXlhYmxlICovCi0gIGJ0cmNfaXRlbV9mb2xkZXItPnBsYXlhYmxlID0gYXZyY19pdGVtX2ZvbGRlci0+cGxheWFibGU7Ci0KLSAgLyogQ29weSBuYW1lICovCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIG1heCBsZW4gJWQgc3RyIGxlbiAlZCIsIF9fZnVuY19fLCBCVFJDX01BWF9BVFRSX1NUUl9MRU4sCi0gICAgICAgICAgICAgICAgICAgYXZyY19pdGVtX2ZvbGRlci0+bmFtZS5zdHJfbGVuKTsKLSAgbWVtc2V0KGJ0cmNfaXRlbV9mb2xkZXItPm5hbWUsIDAsIEJUUkNfTUFYX0FUVFJfU1RSX0xFTiAqIHNpemVvZih1aW50OF90KSk7Ci0gIG1lbWNweShidHJjX2l0ZW1fZm9sZGVyLT5uYW1lLCBhdnJjX2l0ZW1fZm9sZGVyLT5uYW1lLnBfc3RyLAotICAgICAgICAgYXZyY19pdGVtX2ZvbGRlci0+bmFtZS5zdHJfbGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotICAvKiBDb3B5IGNoYXJzZXQgKi8KLSAgYnRyY19pdGVtX2ZvbGRlci0+Y2hhcnNldF9pZCA9IGF2cmNfaXRlbV9mb2xkZXItPm5hbWUuY2hhcnNldF9pZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfcGxheWVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb252ZXJ0cyB0aGUgQVZSQyByZXByZXNlbnRhdGlvbiBvZiBhIGZvbGRlciBpdGVtIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgVFlQRSBwbGF5ZXIgdG8gQlRJRiByZXByZXNlbnRhdGlvbi4KLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2V0X2ZvbGRlcl9pdGVtX3R5cGVfcGxheWVyKGNvbnN0IHRBVlJDX0lURU0qIGF2cmNfaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfZm9sZGVyX2l0ZW1zX3QqIGJ0cmNfaXRlbSkgewotICBidHJjX2l0ZW0tPml0ZW1fdHlwZSA9IEJUUkNfSVRFTV9QTEFZRVI7Ci0gIGNvbnN0IHRBVlJDX0lURU1fUExBWUVSKiBhdnJjX2l0ZW1fcGxheWVyID0gJihhdnJjX2l0ZW0tPnUucGxheWVyKTsKLSAgYnRyY19pdGVtX3BsYXllcl90KiBidHJjX2l0ZW1fcGxheWVyID0gJihidHJjX2l0ZW0tPnBsYXllcik7Ci0gIC8qIFBsYXllciBJRCAqLwotICBidHJjX2l0ZW1fcGxheWVyLT5wbGF5ZXJfaWQgPSBhdnJjX2l0ZW1fcGxheWVyLT5wbGF5ZXJfaWQ7Ci0gIC8qIE1ham9yIHR5cGUgKi8KLSAgYnRyY19pdGVtX3BsYXllci0+bWFqb3JfdHlwZSA9IGF2cmNfaXRlbV9wbGF5ZXItPm1ham9yX3R5cGU7Ci0gIC8qIFN1YiB0eXBlICovCi0gIGJ0cmNfaXRlbV9wbGF5ZXItPnN1Yl90eXBlID0gYXZyY19pdGVtX3BsYXllci0+c3ViX3R5cGU7Ci0gIC8qIFBsYXkgc3RhdHVzICovCi0gIGJ0cmNfaXRlbV9wbGF5ZXItPnBsYXlfc3RhdHVzID0gYXZyY19pdGVtX3BsYXllci0+cGxheV9zdGF0dXM7Ci0gIC8qIEZlYXR1cmVzICovCi0gIG1lbWNweShidHJjX2l0ZW1fcGxheWVyLT5mZWF0dXJlcywgYXZyY19pdGVtX3BsYXllci0+ZmVhdHVyZXMsCi0gICAgICAgICBCVFJDX0ZFQVRVUkVfQklUX01BU0tfU0laRSk7Ci0KLSAgbWVtc2V0KGJ0cmNfaXRlbV9wbGF5ZXItPm5hbWUsIDAsIEJUUkNfTUFYX0FUVFJfU1RSX0xFTiAqIHNpemVvZih1aW50OF90KSk7Ci0gIG1lbWNweShidHJjX2l0ZW1fcGxheWVyLT5uYW1lLCBhdnJjX2l0ZW1fcGxheWVyLT5uYW1lLnBfc3RyLAotICAgICAgICAgYXZyY19pdGVtX3BsYXllci0+bmFtZS5zdHJfbGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGFuZGxlX2NoYW5nZV9wYXRoX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgY2hhbmdlIHBhdGggcmVzcG9uc2UsIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgIEhBTCBjYWxsYmFjayB0byBzZW5kIHRoZSB1cGRhdGVkIGZvbGRlcgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX2NoYW5nZV9wYXRoX3Jlc3BvbnNlKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19DSEdfUEFUSF9SU1AqIHBfcnNwKSB7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0KLSAgICAgIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9oYW5kbGUocG1ldGFfbXNnLT5yY19oYW5kbGUpOwotCi0gIGlmIChwX2RldiA9PSBOVUxMKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgcmMgaGFuZGxlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3JzcC0+c3RhdHVzID09IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0X3JjX2N0cmxfY2FsbGJhY2tzLT5jaGFuZ2VfZm9sZGVyX3BhdGhfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2LT5yY19hZGRyLCBwX3JzcC0+bnVtX2l0ZW1zKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXMgZXJyb3IgaW4gaGFuZGxlX2NoYW5nZV9wYXRoX3Jlc3BvbnNlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX3JzcC0+c3RhdHVzKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoYW5kbGVfc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBoYW5kbGVzIHRoZSB0aGUgY2hhbmdlIHBhdGggcmVzcG9uc2UsIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgIEhBTCBjYWxsYmFjayB0byBzZW5kIHRoZSB1cGRhdGVkIGZvbGRlcgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGFuZGxlX3NldF9icm93c2VkX3BsYXllcl9yZXNwb25zZSh0QlRBX0FWX01FVEFfTVNHKiBwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1NFVF9CUl9QTEFZRVJfUlNQKiBwX3JzcCkgewotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9Ci0gICAgICBidGlmX3JjX2dldF9kZXZpY2VfYnlfaGFuZGxlKHBtZXRhX21zZy0+cmNfaGFuZGxlKTsKLQotICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIHJjIGhhbmRsZSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9yc3AtPnN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZChidF9yY19jdHJsX2NhbGxiYWNrcy0+c2V0X2Jyb3dzZWRfcGxheWVyX2NiLCBwX2Rldi0+cmNfYWRkciwKLSAgICAgICAgICAgICAgICAgICBwX3JzcC0+bnVtX2l0ZW1zLCBwX3JzcC0+Zm9sZGVyX2RlcHRoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXMgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcF9yc3AtPnN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgY2xlYXJfY21kX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGhlbHBlciBmdW5jdGlvbiB0byBzdG9wIHRoZSBjb21tYW5kIHRpbWVvdXQgdGltZXIKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNsZWFyX2NtZF90aW1lb3V0KGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2LCB1aW50OF90IGxhYmVsKSB7Ci0gIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHhuOwotCi0gIHBfdHhuID0gZ2V0X3RyYW5zYWN0aW9uX2J5X2xibChwX2RldiwgbGFiZWwpOwotICBpZiAocF90eG4gPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciBpbiB0cmFuc2FjdGlvbiBsYWJlbCBsb29rdXAiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfdHhuLT50eG5fdGltZXIgIT0gTlVMTCkgYWxhcm1fY2FuY2VsKHBfdHhuLT50eG5fdGltZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoYW5kbGVfYXZrX3JjX21ldGFtc2dfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgUkMgbWV0YW1lc3NhZ2UgcmVzcG9uc2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoYW5kbGVfYXZrX3JjX21ldGFtc2dfcnNwKHRCVEFfQVZfTUVUQV9NU0cqIHBtZXRhX21zZykgewotICB0QVZSQ19SRVNQT05TRSBhdnJjX3Jlc3BvbnNlID0gezB9OwotICB1aW50OF90IHNjcmF0Y2hfYnVmWzUxMl0gPSB7MH07ICAvLyB0aGlzIHZhcmlhYmxlIGlzIHVudXNlZAotICB1aW50MTZfdCBidWZfbGVuOwotICB0QVZSQ19TVFMgc3RhdHVzOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IE5VTEw7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG9wY29kZTogJWQgcnNwX2NvZGU6ICVkICAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlLCBwbWV0YV9tc2ctPmNvZGUpOwotCi0gIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwbWV0YV9tc2ctPnJjX2hhbmRsZSk7Ci0gIHN0YXR1cyA9IEFWUkNfQ3RybF9QYXJzUmVzcG9uc2UocG1ldGFfbXNnLT5wX21zZywgJmF2cmNfcmVzcG9uc2UsIHNjcmF0Y2hfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfbGVuKTsKLSAgaWYgKChBVlJDX09QX1ZFTkRPUiA9PSBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlKSAmJgotICAgICAgKHBtZXRhX21zZy0+Y29kZSA+PSBBVlJDX1JTUF9OT1RfSU1QTCkgJiYKLSAgICAgIChwbWV0YV9tc2ctPmNvZGUgPD0gQVZSQ19SU1BfSU5URVJJTSkpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBwYXJzZSBzdGF0dXMgJWQgcGR1ID0gJWQgcnNwX3N0YXR1cyA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGF2cmNfcmVzcG9uc2UucGR1LAotICAgICAgICAgICAgICAgICAgICAgcG1ldGFfbXNnLT5wX21zZy0+dmVuZG9yLmhkci5jdHlwZSk7Ci0KLSAgICBzd2l0Y2ggKGF2cmNfcmVzcG9uc2UucGR1KSB7Ci0gICAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjoKLSAgICAgICAgaGFuZGxlX25vdGlmaWNhdGlvbl9yZXNwb25zZShwbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLnJlZ19ub3RpZik7Ci0gICAgICAgIGlmIChwbWV0YV9tc2ctPmNvZGUgPT0gQVZSQ19SU1BfSU5URVJJTSkgewotICAgICAgICAgIC8qIERvbid0IGZyZWUgdGhlIHRyYW5zYWN0aW9uIElkICovCi0gICAgICAgICAgY2xlYXJfY21kX3RpbWVvdXQocF9kZXYsIHBtZXRhX21zZy0+bGFiZWwpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX1BEVV9HRVRfQ0FQQUJJTElUSUVTOgotICAgICAgICBoYW5kbGVfZ2V0X2NhcGFiaWxpdHlfcmVzcG9uc2UocG1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfY2Fwcyk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfUERVX0xJU1RfUExBWUVSX0FQUF9BVFRSOgotICAgICAgICBoYW5kbGVfYXBwX2F0dHJfcmVzcG9uc2UocG1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5saXN0X2FwcF9hdHRyKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX1ZBTFVFUzoKLSAgICAgICAgaGFuZGxlX2FwcF92YWxfcmVzcG9uc2UocG1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5saXN0X2FwcF92YWx1ZXMpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX1BEVV9HRVRfQ1VSX1BMQVlFUl9BUFBfVkFMVUU6Ci0gICAgICAgIGhhbmRsZV9hcHBfY3VyX3ZhbF9yZXNwb25zZShwbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLmdldF9jdXJfYXBwX3ZhbCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZRVJfQVBQX0FUVFJfVEVYVDoKLSAgICAgICAgaGFuZGxlX2FwcF9hdHRyX3R4dF9yZXNwb25zZShwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2cmNfcmVzcG9uc2UuZ2V0X2FwcF9hdHRyX3R4dCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZRVJfQVBQX1ZBTFVFX1RFWFQ6Ci0gICAgICAgIGhhbmRsZV9hcHBfYXR0cl92YWxfdHh0X3Jlc3BvbnNlKHBtZXRhX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2cmNfcmVzcG9uc2UuZ2V0X2FwcF92YWxfdHh0KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUU6Ci0gICAgICAgIGhhbmRsZV9zZXRfYXBwX2F0dHJfdmFsX3Jlc3BvbnNlKHBtZXRhX21zZywgJmF2cmNfcmVzcG9uc2Uuc2V0X2FwcF92YWwpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSOgotICAgICAgICBoYW5kbGVfZ2V0X21ldGFkYXRhX2F0dHJfcmVzcG9uc2UocG1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfYXR0cnMpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWV9TVEFUVVM6Ci0gICAgICAgIGhhbmRsZV9nZXRfcGxheXN0YXR1c19yZXNwb25zZShwbWV0YV9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZyY19yZXNwb25zZS5nZXRfcGxheV9zdGF0dXMpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX1BEVV9TRVRfQUREUkVTU0VEX1BMQVlFUjoKLSAgICAgICAgaGFuZGxlX3NldF9hZGRyZXNzZWRfcGxheWVyX3Jlc3BvbnNlKHBtZXRhX21zZywgJmF2cmNfcmVzcG9uc2UucnNwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgaWYgKEFWUkNfT1BfQlJPV1NFID09IHBtZXRhX21zZy0+cF9tc2ctPmhkci5vcGNvZGUpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBBVlJDX09QX0JST1dTRSBwZHUgJWQiLCBfX2Z1bmNfXywgYXZyY19yZXNwb25zZS5wZHUpOwotICAgIC8qIGNoZWNrIHdoYXQga2luZCBvZiBjb21tYW5kIGl0IGlzIGZvciBicm93c2luZyAqLwotICAgIHN3aXRjaCAoYXZyY19yZXNwb25zZS5wZHUpIHsKLSAgICAgIGNhc2UgQVZSQ19QRFVfR0VUX0ZPTERFUl9JVEVNUzoKLSAgICAgICAgaGFuZGxlX2dldF9mb2xkZXJfaXRlbXNfcmVzcG9uc2UocG1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfaXRlbXMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVZSQ19QRFVfQ0hBTkdFX1BBVEg6Ci0gICAgICAgIGhhbmRsZV9jaGFuZ2VfcGF0aF9yZXNwb25zZShwbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLmNoZ19wYXRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUjoKLSAgICAgICAgaGFuZGxlX3NldF9icm93c2VkX3BsYXllcl9yZXNwb25zZShwbWV0YV9tc2csICZhdnJjX3Jlc3BvbnNlLmJyX3BsYXllcik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBVlJDX1BEVV9HRVRfSVRFTV9BVFRSSUJVVEVTOgotICAgICAgICBoYW5kbGVfZ2V0X21ldGFkYXRhX2F0dHJfcmVzcG9uc2UocG1ldGFfbXNnLCAmYXZyY19yZXNwb25zZS5nZXRfYXR0cnMpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzIGNhbm5vdCBoYW5kbGUgYnJvd3NlIHBkdSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBtZXRhX21zZy0+cF9tc2ctPmhkci5vcGNvZGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAiJXM6IEludmFsaWQgVmVuZG9yIENvbW1hbmQgY29kZTogJWQgbGVuOiAlZC4gTm90IHByb2Nlc3NpbmcgaXQuIiwKLSAgICAgICAgX19mdW5jX18sIHBtZXRhX21zZy0+Y29kZSwgcG1ldGFfbXNnLT5sZW4pOwotICAgIHJldHVybjsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVsZWFzZSB0cmFuc2FjdGlvbiAlZCIsIF9fZnVuY19fLCBwbWV0YV9tc2ctPmxhYmVsKTsKLSAgcmVsZWFzZV90cmFuc2FjdGlvbihwX2RldiwgcG1ldGFfbXNnLT5sYWJlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhhbmRsZV9hdmtfcmNfbWV0YW1zZ19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBSQyBtZXRhbWVzc2FnZSByZXNwb25zZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9hdmtfcmNfbWV0YW1zZ19jbWQodEJUQV9BVl9NRVRBX01TRyogcG1ldGFfbXNnKSB7Ci0gIHRBVlJDX0NPTU1BTkQgYXZyY19jbWQgPSB7MH07Ci0gIHRBVlJDX1NUUyBzdGF0dXMgPSBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gTlVMTDsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogb3Bjb2RlOiAlZCByc3BfY29kZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlLCBwbWV0YV9tc2ctPmNvZGUpOwotICBzdGF0dXMgPSBBVlJDX0N0cmxfUGFyc0NvbW1hbmQocG1ldGFfbXNnLT5wX21zZywgJmF2cmNfY21kKTsKLSAgaWYgKChBVlJDX09QX1ZFTkRPUiA9PSBwbWV0YV9tc2ctPnBfbXNnLT5oZHIub3Bjb2RlKSAmJgotICAgICAgKHBtZXRhX21zZy0+Y29kZSA8PSBBVlJDX0NNRF9HRU5fSU5RKSkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIFJlY2VpdmVkIHZlbmRvciBjb21tYW5kLmNvZGUgJWQsIFBEVSAlZCBsYWJlbCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcG1ldGFfbXNnLT5jb2RlLCBhdnJjX2NtZC5wZHUsIHBtZXRhX21zZy0+bGFiZWwpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgewotICAgICAgLyogcmV0dXJuIGVycm9yICovCi0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgIiVzOiBFcnJvciBpbiBwYXJzaW5nIHJlY2VpdmVkIG1ldGFtc2cgY29tbWFuZC4gc3RhdHVzOiAweCUwMngiLAotICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotICAgICAgc2VuZF9yZWplY3RfcmVzcG9uc2UocG1ldGFfbXNnLT5yY19oYW5kbGUsIHBtZXRhX21zZy0+bGFiZWwsIGF2cmNfY21kLnBkdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcG1ldGFfbXNnLT5wX21zZy0+aGRyLm9wY29kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2hhbmRsZShwbWV0YV9tc2ctPnJjX2hhbmRsZSk7Ci0gICAgICBpZiAocF9kZXYgPT0gTlVMTCkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogYXZrIHJjIG1ldGEgbXNnIGNtZCBmb3IgSW52YWxpZCByYyBoYW5kbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoYXZyY19jbWQucGR1ID09IEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTikgewotICAgICAgICB1aW50OF90IGV2ZW50X2lkID0gYXZyY19jbWQucmVnX25vdGlmLmV2ZW50X2lkOwotICAgICAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogUmVnaXN0ZXIgbm90aWZpY2F0aW9uIGV2ZW50X2lkOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfcmNfbm90aWZpY2F0aW9uX2V2ZW50X2lkKGV2ZW50X2lkKSk7Ci0gICAgICB9IGVsc2UgaWYgKGF2cmNfY21kLnBkdSA9PSBBVlJDX1BEVV9TRVRfQUJTT0xVVEVfVk9MVU1FKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBBYnMgVm9sdW1lIENtZCBSZWN2ZCIsIF9fZnVuY19fKTsKLSAgICAgIH0KLQotICAgICAgYnRpZl9yY19jdHJsX3Vwc3RyZWFtc19yc3BfY21kKGF2cmNfY21kLnBkdSwgJmF2cmNfY21kLCBwbWV0YV9tc2ctPmxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBJbnZhbGlkIFZlbmRvciBDb21tYW5kICBjb2RlOiAlZCBsZW46ICVkLiBOb3QgcHJvY2Vzc2luZyBpdC4iLAotICAgICAgICBfX2Z1bmNfXywgcG1ldGFfbXNnLT5jb2RlLCBwbWV0YV9tc2ctPmxlbik7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNsZWFudXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlcyB0aGUgQVZSQyBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjbGVhbnVwKCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogIiwgX19mdW5jX18pOwotICBpZiAoYnRfcmNfY2FsbGJhY2tzKSB7Ci0gICAgYnRfcmNfY2FsbGJhY2tzID0gTlVMTDsKLSAgfQotCi0gIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IEJUSUZfUkNfTlVNX0NPTk47IGlkeCsrKSB7Ci0gICAgYWxhcm1fZnJlZShidGlmX3JjX2NiLnJjX211bHRpX2NiW2lkeF0ucmNfcGxheV9zdGF0dXNfdGltZXIpOwotICAgIG1lbXNldCgmYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLCAwLAotICAgICAgICAgICBzaXplb2YoYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdKSk7Ci0gIH0KLQotICBCVElGX1RSQUNFX0VWRU5UKCIlczogY29tcGxldGVkIiwgX19mdW5jX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBjbGVhbnVwX2N0cmwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlcyB0aGUgQVZSQyBDb250cm9sbGVyIGludGVyZmFjZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNsZWFudXBfY3RybCgpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6ICIsIF9fZnVuY19fKTsKLQotICBpZiAoYnRfcmNfY3RybF9jYWxsYmFja3MpIHsKLSAgICBidF9yY19jdHJsX2NhbGxiYWNrcyA9IE5VTEw7Ci0gIH0KLQotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBCVElGX1JDX05VTV9DT05OOyBpZHgrKykgewotICAgIGFsYXJtX2ZyZWUoYnRpZl9yY19jYi5yY19tdWx0aV9jYltpZHhdLnJjX3BsYXlfc3RhdHVzX3RpbWVyKTsKLSAgICBtZW1zZXQoJmJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XSwgMCwKLSAgICAgICAgICAgc2l6ZW9mKGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbaWR4XSkpOwotICB9Ci0KLSAgbWVtc2V0KCZidGlmX3JjX2NiLnJjX211bHRpX2NiLCAwLCBzaXplb2YoYnRpZl9yY19jYi5yY19tdWx0aV9jYikpOwotICBCVElGX1RSQUNFX0VWRU5UKCIlczogY29tcGxldGVkIiwgX19mdW5jX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRjYXBhYmlsaXRpZXNfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXRDYXBhYmlsdGllcyBmcm9tIFJlbW90ZShDb21wYW55X0lELCBFdmVudHNfU3VwcG9ydGVkKQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRjYXBhYmlsaXRpZXNfY21kKHVpbnQ4X3QgY2FwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGNhcF9pZDogJWQiLCBfX2Z1bmNfXywgY2FwX2lkKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBhdnJjX2NtZC5nZXRfY2Fwcy5vcGNvZGUgPSBBVlJDX09QX1ZFTkRPUjsKLSAgYXZyY19jbWQuZ2V0X2NhcHMuY2FwYWJpbGl0eV9pZCA9IGNhcF9pZDsKLSAgYXZyY19jbWQuZ2V0X2NhcHMucGR1ID0gQVZSQ19QRFVfR0VUX0NBUEFCSUxJVElFUzsKLSAgYXZyY19jbWQuZ2V0X2NhcHMuc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0KLSAgcmV0dXJuIGJ1aWxkX2FuZF9zZW5kX3ZlbmRvcl9jbWQoJmF2cmNfY21kLCBBVlJDX0NNRF9TVEFUVVMsIHBfZGV2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbGlzdF9wbGF5ZXJfYXBwX3NldHRpbmdfYXR0cmliX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IHN1cHBvcnRlZCBMaXN0IFBsYXllciBBdHRyaWJ1dGVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJpYl9jbWQoCi0gICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgdEFWUkNfQ09NTUFORCBhdnJjX2NtZCA9IHswfTsKLSAgYXZyY19jbWQubGlzdF9hcHBfYXR0ci5vcGNvZGUgPSBBVlJDX09QX1ZFTkRPUjsKLSAgYXZyY19jbWQubGlzdF9hcHBfYXR0ci5wZHUgPSBBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfQVRUUjsKLSAgYXZyY19jbWQubGlzdF9hcHBfYXR0ci5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLQotICByZXR1cm4gYnVpbGRfYW5kX3NlbmRfdmVuZG9yX2NtZCgmYXZyY19jbWQsIEFWUkNfQ01EX1NUQVRVUywgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsaXN0X3BsYXllcl9hcHBfc2V0dGluZ192YWx1ZV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB2YWx1ZXMgb2Ygc3VwcG9ydGVkIFBsYXllciBBdHRyaWJ1dGVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGxpc3RfcGxheWVyX2FwcF9zZXR0aW5nX3ZhbHVlX2NtZCgKLSAgICB1aW50OF90IGF0dHJpYl9pZCwgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGF0dHJpYl9pZDogJWQiLCBfX2Z1bmNfXywgYXR0cmliX2lkKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBhdnJjX2NtZC5saXN0X2FwcF92YWx1ZXMuYXR0cl9pZCA9IGF0dHJpYl9pZDsKLSAgYXZyY19jbWQubGlzdF9hcHBfdmFsdWVzLm9wY29kZSA9IEFWUkNfT1BfVkVORE9SOwotICBhdnJjX2NtZC5saXN0X2FwcF92YWx1ZXMucGR1ID0gQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX1ZBTFVFUzsKLSAgYXZyY19jbWQubGlzdF9hcHBfdmFsdWVzLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF92ZW5kb3JfY21kKCZhdnJjX2NtZCwgQVZSQ19DTURfU1RBVFVTLCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9wbGF5ZXJfYXBwX3NldHRpbmdfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgY3VycmVudCB2YWx1ZXMgb2YgUGxheWVyIEF0dHJpYnV0ZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X3BsYXllcl9hcHBfc2V0dGluZ19jbWQodWludDhfdCBudW1fYXR0cmliLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGF0dHJpYl9pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG51bV9hdHRyaWI6ICVkIiwgX19mdW5jX18sIG51bV9hdHRyaWIpOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIHRBVlJDX0NPTU1BTkQgYXZyY19jbWQgPSB7MH07Ci0gIGF2cmNfY21kLmdldF9jdXJfYXBwX3ZhbC5vcGNvZGUgPSBBVlJDX09QX1ZFTkRPUjsKLSAgYXZyY19jbWQuZ2V0X2N1cl9hcHBfdmFsLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBhdnJjX2NtZC5nZXRfY3VyX2FwcF92YWwubnVtX2F0dHIgPSBudW1fYXR0cmliOwotICBhdnJjX2NtZC5nZXRfY3VyX2FwcF92YWwucGR1ID0gQVZSQ19QRFVfR0VUX0NVUl9QTEFZRVJfQVBQX1ZBTFVFOwotCi0gIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBudW1fYXR0cmliOyBjb3VudCsrKSB7Ci0gICAgYXZyY19jbWQuZ2V0X2N1cl9hcHBfdmFsLmF0dHJzW2NvdW50XSA9IGF0dHJpYl9pZHNbY291bnRdOwotICB9Ci0KLSAgcmV0dXJuIGJ1aWxkX2FuZF9zZW5kX3ZlbmRvcl9jbWQoJmF2cmNfY21kLCBBVlJDX0NNRF9TVEFUVVMsIHBfZGV2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X2N1cnJlbnRfbWV0YWRhdGFfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGZXRjaCB0aGUgY3VycmVudCB0cmFjayBtZXRhZGF0YSBmb3IgdGhlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgY29tbWFuZCBpc3N1ZWQgc3VjY2Vzc2Z1bGx5IG90aGVyd2lzZQotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X2N1cnJlbnRfbWV0YWRhdGFfY21kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLSAgaWYgKHBfZGV2ID09IE5VTEwpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXYgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgY29uc3QgdWludDMyX3QqIGF0dHJfbGlzdCA9IGdldF9yZXF1ZXN0ZWRfYXR0cmlidXRlc19saXN0KHBfZGV2KTsKLSAgY29uc3QgdWludDhfdCBhdHRyX2xpc3Rfc2l6ZSA9IGdldF9yZXF1ZXN0ZWRfYXR0cmlidXRlc19saXN0X3NpemUocF9kZXYpOwotICByZXR1cm4gZ2V0X21ldGFkYXRhX2F0dHJpYnV0ZV9jbWQoYXR0cl9saXN0X3NpemUsIGF0dHJfbGlzdCwgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfcGxheWJhY2tfc3RhdGVfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGZXRjaCB0aGUgY3VycmVudCBwbGF5YmFjayBzdGF0ZSBmb3IgdGhlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgY29tbWFuZCBpc3N1ZWQgc3VjY2Vzc2Z1bGx5IG90aGVyd2lzZQotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X3BsYXliYWNrX3N0YXRlX2NtZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0gIHJldHVybiBnZXRfcGxheV9zdGF0dXNfY21kKHBfZGV2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X25vd19wbGF5aW5nX2xpc3RfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGZXRjaCB0aGUgbm93IHBsYXlpbmcgbGlzdAotICoKLSAqIFBhcmFtdGVycyAgICAgICAgc3RhcnRfaXRlbTogRmlyc3QgaXRlbSB0byBmZXRjaCAoMCB0byBmZXRjaCBmcm9tIGJlZ2FubmluZykKLSAqICAgICAgICAgICAgICAgICAgZW5kX2l0ZW06IExhc3QgaXRlbSB0byBmZXRjaCAoMHhmZmZmZmZmZiB0byBmZXRjaCB1bnRpbCBlbmQpCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiBjb21tYW5kIGlzc3VlZCBzdWNjZXNzZnVsbHkgb3RoZXJ3aXNlCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfbm93X3BsYXlpbmdfbGlzdF9jbWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZW5kX2l0ZW0pIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMgc3RhcnQsIGVuZDogKCVkLCAlZCkiLCBfX2Z1bmNfXywgc3RhcnRfaXRlbSwgZW5kX2l0ZW0pOwotICByZXR1cm4gZ2V0X2ZvbGRlcl9pdGVtc19jbWQoYmRfYWRkciwgQVZSQ19TQ09QRV9OT1dfUExBWUlORywgc3RhcnRfaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pdGVtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X2l0ZW1fYXR0cmlidXRlX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmV0Y2ggdGhlIGl0ZW0gYXR0cmlidXRlcyBmb3IgYSBnaXZlbiB1aWQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICB1aWQ6IFRyYWNrIFVJRCB5b3Ugd2FudCBhdHRyaWJ1dGVzIGZvcgotICogICAgICAgICAgICAgICAgICBzY29wZTogQ29uc3RhbnQgcmVwcmVzZW50aW5nIHdoaWNoIHNjb3BlIHlvdSdyZSBxdWVyeWluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgKGkuZSBBVlJDX1NDT1BFX0ZJTEVfU1lTVEVNKQotICogICAgICAgICAgICAgICAgICBwX2RldjogRGV2aWNlIGNvbnRyb2wgYmxvY2sKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIGNvbW1hbmQgaXMgaXNzdWVkIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQlRfU1RBVFVTX0ZBSUwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X2l0ZW1fYXR0cmlidXRlX2NtZCh1aW50NjRfdCB1aWQsIGludCBzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9hdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBfYXR0cl9pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgdEFWUkNfQ09NTUFORCBhdnJjX2NtZCA9IHswfTsKLSAgYXZyY19jbWQucGR1ID0gQVZSQ19QRFVfR0VUX0lURU1fQVRUUklCVVRFUzsKLSAgYXZyY19jbWQuZ2V0X2F0dHJzLnNjb3BlID0gc2NvcGU7Ci0gIG1lbWNweShhdnJjX2NtZC5nZXRfYXR0cnMudWlkLCAmdWlkLCA4KTsKLSAgYXZyY19jbWQuZ2V0X2F0dHJzLnVpZF9jb3VudGVyID0gMDsKLSAgYXZyY19jbWQuZ2V0X2F0dHJzLmF0dHJfY291bnQgPSAwOwotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF9icm93c2luZ19jbWQoJmF2cmNfY21kLCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9mb2xkZXJfbGlzdF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZldGNoIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9sZGVyIGxpc3QKLSAqCi0gKiBQYXJhbXRlcnMgICAgICAgIHN0YXJ0X2l0ZW06IEZpcnN0IGl0ZW0gdG8gZmV0Y2ggKDAgdG8gZmV0Y2ggZnJvbSBiZWdhbm5pbmcpCi0gKiAgICAgICAgICAgICAgICAgIGVuZF9pdGVtOiBMYXN0IGl0ZW0gdG8gZmV0Y2ggKDB4ZmZmZmZmZmYgdG8gZmV0Y2ggdW50aWwgZW5kKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgY29tbWFuZCBpc3N1ZWQgc3VjY2Vzc2Z1bGx5IG90aGVyd2lzZQotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X2ZvbGRlcl9saXN0X2NtZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfaXRlbSwgdWludDMyX3QgZW5kX2l0ZW0pIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMgc3RhcnQsIGVuZDogKCVkLCAlZCkiLCBfX2Z1bmNfXywgc3RhcnRfaXRlbSwgZW5kX2l0ZW0pOwotICByZXR1cm4gZ2V0X2ZvbGRlcl9pdGVtc19jbWQoYmRfYWRkciwgQVZSQ19TQ09QRV9GSUxFX1NZU1RFTSwgc3RhcnRfaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pdGVtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X3BsYXllcl9saXN0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmV0Y2ggdGhlIHBsYXllciBsaXN0Ci0gKgotICogUGFyYW10ZXJzICAgICAgICBzdGFydF9pdGVtOiBGaXJzdCBpdGVtIHRvIGZldGNoICgwIHRvIGZldGNoIGZyb20gYmVnYW5uaW5nKQotICogICAgICAgICAgICAgICAgICBlbmRfaXRlbTogTGFzdCBpdGVtIHRvIGZldGNoICgweGZmZmZmZmZmIHRvIGZldGNoIHVudGlsIGVuZCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIGNvbW1hbmQgaXNzdWVkIHN1Y2Nlc3NmdWxseSBvdGhlcndpc2UKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9wbGF5ZXJfbGlzdF9jbWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X2l0ZW0sIHVpbnQzMl90IGVuZF9pdGVtKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIHN0YXJ0LCBlbmQ6ICglZCwgJWQpIiwgX19mdW5jX18sIHN0YXJ0X2l0ZW0sIGVuZF9pdGVtKTsKLSAgcmV0dXJuIGdldF9mb2xkZXJfaXRlbXNfY21kKGJkX2FkZHIsIEFWUkNfU0NPUEVfUExBWUVSX0xJU1QsIHN0YXJ0X2l0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaXRlbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNoYW5nZV9mb2xkZXJfcGF0aF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoYW5nZSB0aGUgZm9sZGVyLgotICoKLSAqIFBhcmFtdGVycyAgICAgICAgZGlyZWN0aW9uOiBEaXJlY3Rpb24gKFVwL0Rvd24pIHRvIGNoYW5nZSBmb2xkZXIKLSAqICAgICAgICAgICAgICAgICAgdWlkOiBUaGUgVUlEIG9mIGZvbGRlciB0byBtb3ZlIHRvCi0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0X2l0ZW06IEZpcnN0IGl0ZW0gdG8gZmV0Y2ggKDAgdG8gZmV0Y2ggZnJvbSBiZWdhbm5pbmcpCi0gKiAgICAgICAgICAgICAgICAgIGVuZF9pdGVtOiBMYXN0IGl0ZW0gdG8gZmV0Y2ggKDB4ZmZmZmZmZmYgdG8gZmV0Y2ggdW50aWwgZW5kKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgY29tbWFuZCBpc3N1ZWQgc3VjY2Vzc2Z1bGx5IG90aGVyd2lzZQotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgY2hhbmdlX2ZvbGRlcl9wYXRoX2NtZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaXJlY3Rpb24sIHVpbnQ4X3QqIHVpZCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogZGlyZWN0aW9uICVkIiwgX19mdW5jX18sIGRpcmVjdGlvbik7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLSAgQ0hFQ0tfQlJfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotCi0gIGF2cmNfY21kLmNoZ19wYXRoLnBkdSA9IEFWUkNfUERVX0NIQU5HRV9QQVRIOwotICBhdnJjX2NtZC5jaGdfcGF0aC5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgLy8gVE9ETyhzYW5rZXRhKTogSW1wcm92ZSBmb3IgZGF0YWJhc2UgYXdhcmUgY2xpZW50cy4KLSAgYXZyY19jbWQuY2hnX3BhdGgudWlkX2NvdW50ZXIgPSAwOwotICBhdnJjX2NtZC5jaGdfcGF0aC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0KLSAgbWVtc2V0KGF2cmNfY21kLmNoZ19wYXRoLmZvbGRlcl91aWQsIDAsIEFWUkNfVUlEX1NJWkUgKiBzaXplb2YodWludDhfdCkpOwotICBtZW1jcHkoYXZyY19jbWQuY2hnX3BhdGguZm9sZGVyX3VpZCwgdWlkLCBBVlJDX1VJRF9TSVpFICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotICByZXR1cm4gYnVpbGRfYW5kX3NlbmRfYnJvd3NpbmdfY21kKCZhdnJjX2NtZCwgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZXRfYnJvd3NlZF9wbGF5ZXJfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGFuZ2UgdGhlIGJyb3dzZWQgcGxheWVyLgotICoKLSAqIFBhcmFtdGVycyAgICAgICAgaWQ6IFRoZSBVSUQgb2YgcGxheWVyIHRvIG1vdmUgdG8KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIGNvbW1hbmQgaXNzdWVkIHN1Y2Nlc3NmdWxseSBvdGhlcndpc2UKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHNldF9icm93c2VkX3BsYXllcl9jbWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlkKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBpZCAlZCIsIF9fZnVuY19fLCBpZCk7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLSAgQ0hFQ0tfQlJfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBhdnJjX2NtZC5icl9wbGF5ZXIucGR1ID0gQVZSQ19QRFVfU0VUX0JST1dTRURfUExBWUVSOwotICBhdnJjX2NtZC5icl9wbGF5ZXIuc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIC8vIFRPRE8oc2Fua2V0YSk6IEltcHJvdmUgZm9yIGRhdGFiYXNlIGF3YXJlIGNsaWVudHMuCi0gIGF2cmNfY21kLmJyX3BsYXllci5wbGF5ZXJfaWQgPSBpZDsKLQotICByZXR1cm4gYnVpbGRfYW5kX3NlbmRfYnJvd3NpbmdfY21kKCZhdnJjX2NtZCwgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioKLSAqKiBGdW5jdGlvbiAgICAgICAgIHNldF9hZGRyZXNzZWRfcGxheWVyX2NtZAotICoqCi0gKiogRGVzY3JpcHRpb24gICAgICBDaGFuZ2UgdGhlIGFkZHJlc3NlZCBwbGF5ZXIuCi0gKioKLSAqKiBQYXJhbXRlcnMgICAgICAgIGlkOiBUaGUgVUlEIG9mIHBsYXllciB0byBtb3ZlIHRvCi0gKioKLSAqKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIGNvbW1hbmQgaXNzdWVkIHN1Y2Nlc3NmdWxseSBvdGhlcndpc2UKLSAqKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMLgotICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHNldF9hZGRyZXNzZWRfcGxheWVyX2NtZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpZCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogaWQgJWQiLCBfX2Z1bmNfXywgaWQpOwotCi0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLSAgQ0hFQ0tfQlJfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBhdnJjX2NtZC5hZGRyX3BsYXllci5wZHUgPSBBVlJDX1BEVV9TRVRfQUREUkVTU0VEX1BMQVlFUjsKLSAgYXZyY19jbWQuYWRkcl9wbGF5ZXIuc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIC8vIFRPRE8oc2Fua2V0YSk6IEltcHJvdmUgZm9yIGRhdGFiYXNlIGF3YXJlIGNsaWVudHMuCi0gIGF2cmNfY21kLmFkZHJfcGxheWVyLnBsYXllcl9pZCA9IGlkOwotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF9icm93c2luZ19jbWQoJmF2cmNfY21kLCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9mb2xkZXJfaXRlbXNfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gYnJvd3NlIHRoZSBjb250ZW50IGhpZXJhcmNoeSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgVEcgZGV2aWNlLgotICoKLSAqIFBhcmFtdGVycyAgICAgICAgc2NvcGU6IEFWUkNfU0NPUEVfTk9XX1BMQVlJTkcgKGV0YykgZm9yIHZhcmlvdXMgYnJvd3NlYWJsZQotICogICAgICAgICAgICAgICAgICBjb250ZW50Ci0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0X2l0ZW06IEZpcnN0IGl0ZW0gdG8gZmV0Y2ggKDAgdG8gZmV0Y2ggZnJvbSBiZWdhbm5pbmcpCi0gKiAgICAgICAgICAgICAgICAgIGVuZF9pdGVtOiBMYXN0IGl0ZW0gdG8gZmV0Y2ggKDB4ZmZmZiB0byBmZXRjaCB1bnRpbCBlbmQpCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiBjb21tYW5kIGlzc3VlZCBzdWNjZXNzZnVsbHkgb3RoZXJ3aXNlCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfZm9sZGVyX2l0ZW1zX2NtZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NvcGUsIHVpbnQzMl90IHN0YXJ0X2l0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZW5kX2l0ZW0pIHsKLSAgLyogQ2hlY2sgdGhhdCBib3RoIGF2cmNwIGFuZCBicm93c2UgY2hhbm5lbCBhcmUgY29ubmVjdGVkLiAqLwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotICBDSEVDS19CUl9DT05ORUNURUQocF9kZXYpOwotCi0gIHRBVlJDX0NPTU1BTkQgYXZyY19jbWQgPSB7MH07Ci0KLSAgLyogU2V0IHRoZSBsYXllciBzcGVjaWZpYyB0byBwb2ludCB0byBicm93c2UgYWx0aG91Z2ggdGhpcyBzaG91bGQgcmVhbGx5Ci0gICAqIGJlIGRvbmUgYnkgbG93ZXIgbGF5ZXJzIGFuZCBsb29raW5nIGF0IHRoZSBQRFUKLSAgICovCi0gIGF2cmNfY21kLmdldF9pdGVtcy5wZHUgPSBBVlJDX1BEVV9HRVRfRk9MREVSX0lURU1TOwotICBhdnJjX2NtZC5nZXRfaXRlbXMuc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIGF2cmNfY21kLmdldF9pdGVtcy5zY29wZSA9IHNjb3BlOwotICBhdnJjX2NtZC5nZXRfaXRlbXMuc3RhcnRfaXRlbSA9IHN0YXJ0X2l0ZW07Ci0gIGF2cmNfY21kLmdldF9pdGVtcy5lbmRfaXRlbSA9IGVuZF9pdGVtOwotICBhdnJjX2NtZC5nZXRfaXRlbXMuYXR0cl9jb3VudCA9IDA7IC8qIHBfYXR0cl9saXN0IGRvZXMgbm90IG1hdHRlciBoZW5jZSAqLwotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF9icm93c2luZ19jbWQoJmF2cmNfY21kLCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGNoYW5nZV9wbGF5ZXJfYXBwX3NldHRpbmcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCBjdXJyZW50IHZhbHVlcyBvZiBQbGF5ZXIgQXR0cmlidXRlcwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBjaGFuZ2VfcGxheWVyX2FwcF9zZXR0aW5nKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9hdHRyaWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhdHRyaWJfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYXR0cmliX3ZhbHMpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG51bV9hdHRyaWI6ICVkIiwgX19mdW5jX18sIG51bV9hdHRyaWIpOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgdEFWUkNfQ09NTUFORCBhdnJjX2NtZCA9IHswfTsKLSAgYXZyY19jbWQuc2V0X2FwcF92YWwub3Bjb2RlID0gQVZSQ19PUF9WRU5ET1I7Ci0gIGF2cmNfY21kLnNldF9hcHBfdmFsLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBhdnJjX2NtZC5zZXRfYXBwX3ZhbC5udW1fdmFsID0gbnVtX2F0dHJpYjsKLSAgYXZyY19jbWQuc2V0X2FwcF92YWwucGR1ID0gQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUU7Ci0gIGF2cmNfY21kLnNldF9hcHBfdmFsLnBfdmFscyA9Ci0gICAgICAodEFWUkNfQVBQX1NFVFRJTkcqKW9zaV9tYWxsb2Moc2l6ZW9mKHRBVlJDX0FQUF9TRVRUSU5HKSAqIG51bV9hdHRyaWIpOwotICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgbnVtX2F0dHJpYjsgY291bnQrKykgewotICAgIGF2cmNfY21kLnNldF9hcHBfdmFsLnBfdmFsc1tjb3VudF0uYXR0cl9pZCA9IGF0dHJpYl9pZHNbY291bnRdOwotICAgIGF2cmNfY21kLnNldF9hcHBfdmFsLnBfdmFsc1tjb3VudF0uYXR0cl92YWwgPSBhdHRyaWJfdmFsc1tjb3VudF07Ci0gIH0KLQotICBidF9zdGF0dXNfdCBzdCA9IGJ1aWxkX2FuZF9zZW5kX3ZlbmRvcl9jbWQoJmF2cmNfY21kLCBBVlJDX0NNRF9DVFJMLCBwX2Rldik7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZhdnJjX2NtZC5zZXRfYXBwX3ZhbC5wX3ZhbHMpOwotICByZXR1cm4gc3Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBsYXlfaXRlbV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFBsYXkgdGhlIGl0ZW0gc3BlY2lmaWVkIGJ5IFVJRCAmIHNjb3BlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHBsYXlfaXRlbV9jbWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVpZCwgdWludDE2X3QgdWlkX2NvdW50ZXIpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNjb3BlICVkIHVpZF9jb3VudGVyICVkIiwgX19mdW5jX18sIHNjb3BlLCB1aWRfY291bnRlcik7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLSAgQ0hFQ0tfQlJfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBhdnJjX2NtZC5wZHUgPSBBVlJDX1BEVV9QTEFZX0lURU07Ci0gIGF2cmNfY21kLnBsYXlfaXRlbS5vcGNvZGUgPSBBVlJDX09QX1ZFTkRPUjsKLSAgYXZyY19jbWQucGxheV9pdGVtLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBhdnJjX2NtZC5wbGF5X2l0ZW0uc2NvcGUgPSBzY29wZTsKLSAgbWVtY3B5KGF2cmNfY21kLnBsYXlfaXRlbS51aWQsIHVpZCwgQVZSQ19VSURfU0laRSk7Ci0gIGF2cmNfY21kLnBsYXlfaXRlbS51aWRfY291bnRlciA9IHVpZF9jb3VudGVyOwotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF92ZW5kb3JfY21kKCZhdnJjX2NtZCwgQVZSQ19DTURfQ1RSTCwgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJfdGV4dF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0ZXh0IGRlc2NyaXB0aW9uIGZvciBhcHAgYXR0cmlidXRlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9wbGF5ZXJfYXBwX3NldHRpbmdfYXR0cl90ZXh0X2NtZCgKLSAgICB1aW50OF90KiBhdHRycywgdWludDhfdCBudW1fYXR0cnMsIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBudW0gYXR0cnM6ICVkIiwgX19mdW5jX18sIG51bV9hdHRycyk7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgdEFWUkNfQ09NTUFORCBhdnJjX2NtZCA9IHswfTsKLSAgYXZyY19jbWQucGR1ID0gQVZSQ19QRFVfR0VUX1BMQVlFUl9BUFBfQVRUUl9URVhUOwotICBhdnJjX2NtZC5nZXRfYXBwX2F0dHJfdHh0Lm9wY29kZSA9IEFWUkNfT1BfVkVORE9SOwotICBhdnJjX2NtZC5nZXRfYXBwX2F0dHJfdHh0Lm51bV9hdHRyID0gbnVtX2F0dHJzOwotCi0gIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBudW1fYXR0cnM7IGNvdW50KyspIHsKLSAgICBhdnJjX2NtZC5nZXRfYXBwX2F0dHJfdHh0LmF0dHJzW2NvdW50XSA9IGF0dHJzW2NvdW50XTsKLSAgfQotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF92ZW5kb3JfY21kKCZhdnJjX2NtZCwgQVZSQ19DTURfU1RBVFVTLCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdldF9wbGF5ZXJfYXBwX3NldHRpbmdfdmFsX3RleHRfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGV4dCBkZXNjcmlwdGlvbiBmb3IgYXBwIGF0dHJpYnV0ZSB2YWx1ZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X3BsYXllcl9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X2NtZCgKLSAgICB1aW50OF90KiB2YWxzLCB1aW50OF90IG51bV92YWxzLCBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogbnVtX3ZhbHM6ICVkIiwgX19mdW5jX18sIG51bV92YWxzKTsKLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICB0QVZSQ19DT01NQU5EIGF2cmNfY21kID0gezB9OwotICBhdnJjX2NtZC5wZHUgPSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9WQUxVRV9URVhUOwotICBhdnJjX2NtZC5nZXRfYXBwX3ZhbF90eHQub3Bjb2RlID0gQVZSQ19PUF9WRU5ET1I7Ci0gIGF2cmNfY21kLmdldF9hcHBfdmFsX3R4dC5udW1fdmFsID0gbnVtX3ZhbHM7Ci0KLSAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IG51bV92YWxzOyBjb3VudCsrKSB7Ci0gICAgYXZyY19jbWQuZ2V0X2FwcF92YWxfdHh0LnZhbHNbY291bnRdID0gdmFsc1tjb3VudF07Ci0gIH0KLQotICByZXR1cm4gYnVpbGRfYW5kX3NlbmRfdmVuZG9yX2NtZCgmYXZyY19jbWQsIEFWUkNfQ01EX1NUQVRVUywgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZWdpc3Rlcl9ub3RpZmljYXRpb25fY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIENvbW1hbmQgdG8gcmVnaXN0ZXIgZm9yIGEgTm90aWZpY2F0aW9uIElECi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IHJlZ2lzdGVyX25vdGlmaWNhdGlvbl9jbWQodWludDhfdCBsYWJlbCwgdWludDhfdCBldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV2ZW50X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGV2ZW50X2lkOiAlZCBldmVudF92YWx1ZSAlZCIsIF9fZnVuY19fLCBldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICBldmVudF92YWx1ZSk7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0KLSAgdEFWUkNfQ09NTUFORCBhdnJjX2NtZCA9IHswfTsKLSAgYXZyY19jbWQucmVnX25vdGlmLm9wY29kZSA9IEFWUkNfT1BfVkVORE9SOwotICBhdnJjX2NtZC5yZWdfbm90aWYuc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIGF2cmNfY21kLnJlZ19ub3RpZi5ldmVudF9pZCA9IGV2ZW50X2lkOwotICBhdnJjX2NtZC5yZWdfbm90aWYucGR1ID0gQVZSQ19QRFVfUkVHSVNURVJfTk9USUZJQ0FUSU9OOwotICBhdnJjX2NtZC5yZWdfbm90aWYucGFyYW0gPSBldmVudF92YWx1ZTsKLQotICBCVF9IRFIqIHBfbXNnID0gTlVMTDsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfQmxkQ29tbWFuZCgmYXZyY19jbWQsICZwX21zZyk7Ci0gIGlmIChzdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICB1aW50OF90KiBkYXRhX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX21zZyArIDEpICsgcF9tc2ctPm9mZnNldDsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbXNncmVxIGJlaW5nIHNlbnQgb3V0IHdpdGggbGFiZWw6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBsYWJlbCk7Ci0gICAgaWYgKHBfbXNnICE9IE5VTEwpIHsKLSAgICAgIEJUQV9BdlZlbmRvckNtZChwX2Rldi0+cmNfaGFuZGxlLCBsYWJlbCwgQVZSQ19DTURfTk9USUYsIGRhdGFfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmxlbik7Ci0gICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byBidWlsZCBjb21tYW5kLiBzdGF0dXM6IDB4JTAyeCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgfQotICBvc2lfZnJlZShwX21zZyk7Ci0gIHJldHVybiAoYnRfc3RhdHVzX3Qpc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfbWV0YWRhdGFfYXR0cmlidXRlX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IG1ldGFkYXRhIGF0dHJpYnV0ZXMgZm9yIGF0dHJpYnV0ZUlkcy4gVGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICB3aWxsIG1ha2UgdGhlIHJpZ2h0IGRldGVybWluYXRpb24gb2Ygd2hldGhlciB0byB1c2UgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgb3IgYnJvd3NpbmcgY2hhbm5lbCBmb3IgdGhlIHJlcXVlc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBjb21tYW5kIGlzIHN1Y2Nlc3NmdWxseSBpc3N1ZWQKLSAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIEJUX1NUQVRVU19GQUlMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGdldF9tZXRhZGF0YV9hdHRyaWJ1dGVfY21kKHVpbnQ4X3QgbnVtX2F0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcF9hdHRyX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldikgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogbnVtX2F0dHJpYnV0ZTogJWQgYXR0cmlidXRlX2lkOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIG51bV9hdHRyaWJ1dGUsIHBfYXR0cl9pZHNbMF0pOwotCi0gIC8vIElmIGJyb3dzaW5nIGlzIGNvbm5lY3RlZCB0aGVuIHNlbmQgdGhlIGNvbW1hbmQgb3V0IHRoYXQgY2hhbm5lbAotICBpZiAocF9kZXYtPmJyX2Nvbm5lY3RlZCkgewotICAgIHJldHVybiBnZXRfaXRlbV9hdHRyaWJ1dGVfY21kKHBfZGV2LT5yY19wbGF5aW5nX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSQ19TQ09QRV9OT1dfUExBWUlORywgbnVtX2F0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hdHRyX2lkcywgcF9kZXYpOwotICB9Ci0KLSAgLy8gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHRoZSBjb250cm9sIGNoYW5uZWwKLSAgcmV0dXJuIGdldF9lbGVtZW50X2F0dHJpYnV0ZV9jbWQobnVtX2F0dHJpYnV0ZSwgcF9hdHRyX2lkcywgcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfZWxlbWVudF9hdHRyaWJ1dGVfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgRWxlbWVudCBBdHRyaWJ1dGUgZm9yICBhdHRyaWJ1dGVJZHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X2VsZW1lbnRfYXR0cmlidXRlX2NtZCh1aW50OF90IG51bV9hdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcF9hdHRyX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBudW1fYXR0cmlidXRlOiAlZCBhdHRyaWJ1dGVfaWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgbnVtX2F0dHJpYnV0ZSwgcF9hdHRyX2lkc1swXSk7Ci0gIENIRUNLX1JDX0NPTk5FQ1RFRChwX2Rldik7Ci0gIHRBVlJDX0NPTU1BTkQgYXZyY19jbWQgPSB7MH07Ci0gIGF2cmNfY21kLmdldF9lbGVtX2F0dHJzLm9wY29kZSA9IEFWUkNfT1BfVkVORE9SOwotICBhdnJjX2NtZC5nZXRfZWxlbV9hdHRycy5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgYXZyY19jbWQuZ2V0X2VsZW1fYXR0cnMubnVtX2F0dHIgPSBudW1fYXR0cmlidXRlOwotICBhdnJjX2NtZC5nZXRfZWxlbV9hdHRycy5wZHUgPSBBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSOwotICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgbnVtX2F0dHJpYnV0ZTsgY291bnQrKykgewotICAgIGF2cmNfY21kLmdldF9lbGVtX2F0dHJzLmF0dHJzW2NvdW50XSA9IHBfYXR0cl9pZHNbY291bnRdOwotICB9Ci0KLSAgcmV0dXJuIGJ1aWxkX2FuZF9zZW5kX3ZlbmRvcl9jbWQoJmF2cmNfY21kLCBBVlJDX0NNRF9TVEFUVVMsIHBfZGV2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2V0X3BsYXlfc3RhdHVzX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IFBsYXlpbmcgU3RhdHVzIG9mIGEgRGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBidF9zdGF0dXNfdCBnZXRfcGxheV9zdGF0dXNfY21kKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIHRBVlJDX0NPTU1BTkQgYXZyY19jbWQgPSB7MH07Ci0gIGF2cmNfY21kLmdldF9wbGF5X3N0YXR1cy5vcGNvZGUgPSBBVlJDX09QX1ZFTkRPUjsKLSAgYXZyY19jbWQuZ2V0X3BsYXlfc3RhdHVzLnBkdSA9IEFWUkNfUERVX0dFVF9QTEFZX1NUQVRVUzsKLSAgYXZyY19jbWQuZ2V0X3BsYXlfc3RhdHVzLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotCi0gIHJldHVybiBidWlsZF9hbmRfc2VuZF92ZW5kb3JfY21kKCZhdnJjX2NtZCwgQVZSQ19DTURfU1RBVFVTLCBwX2Rldik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNldF92b2x1bWVfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSc3AgZm9yIFNldEFic29sdXRlVm9sdW1lIENvbW1hbmQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2V0X3ZvbHVtZV9yc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBhYnNfdm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGFiZWwpIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gIEJUX0hEUiogcF9tc2cgPSBOVUxMOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0KLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogYWJzX3ZvbDogJWQiLCBfX2Z1bmNfXywgYWJzX3ZvbCk7Ci0KLSAgYXZyY19yc3Audm9sdW1lLm9wY29kZSA9IEFWUkNfT1BfVkVORE9SOwotICBhdnJjX3JzcC52b2x1bWUucGR1ID0gQVZSQ19QRFVfU0VUX0FCU09MVVRFX1ZPTFVNRTsKLSAgYXZyY19yc3Audm9sdW1lLnN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBhdnJjX3JzcC52b2x1bWUudm9sdW1lID0gYWJzX3ZvbDsKLSAgc3RhdHVzID0gQVZSQ19CbGRSZXNwb25zZShwX2Rldi0+cmNfaGFuZGxlLCAmYXZyY19yc3AsICZwX21zZyk7Ci0gIGlmIChzdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICB1aW50OF90KiBkYXRhX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX21zZyArIDEpICsgcF9tc2ctPm9mZnNldDsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbXNncmVxIGJlaW5nIHNlbnQgb3V0IHdpdGggbGFiZWw6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfdm9sX2xhYmVsKTsKLSAgICBpZiAocF9tc2cgIT0gTlVMTCkgewotICAgICAgQlRBX0F2VmVuZG9yUnNwKHBfZGV2LT5yY19oYW5kbGUsIGxhYmVsLCBBVlJDX1JTUF9BQ0NFUFQsIGRhdGFfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmxlbiwgMCk7Ci0gICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byBidWlsZCBjb21tYW5kLiBzdGF0dXM6IDB4JTAyeCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgfQotICBvc2lfZnJlZShwX21zZyk7Ci0gIHJldHVybiAoYnRfc3RhdHVzX3Qpc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZW5kX3JlZ2lzdGVyX2Fic192b2xfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSc3AgZm9yIE5vdGlmaWNhdGlvbiBvZiBBYnNvbHV0ZSBWb2x1bWUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgdm9sdW1lX2NoYW5nZV9ub3RpZmljYXRpb25fcnNwKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJ0cmNfbm90aWZpY2F0aW9uX3R5cGVfdCByc3BfdHlwZSwKLSAgICB1aW50OF90IGFic192b2wsIHVpbnQ4X3QgbGFiZWwpIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEJUX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgdEFWUkNfUkVTUE9OU0UgYXZyY19yc3A7Ci0gIEJUX0hEUiogcF9tc2cgPSBOVUxMOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcnNwX3R5cGU6ICVkIGFic192b2w6ICVkIiwgX19mdW5jX18sIHJzcF90eXBlLCBhYnNfdm9sKTsKLQotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEoYmRfYWRkcik7Ci0KLSAgQ0hFQ0tfUkNfQ09OTkVDVEVEKHBfZGV2KTsKLQotICBhdnJjX3JzcC5yZWdfbm90aWYub3Bjb2RlID0gQVZSQ19PUF9WRU5ET1I7Ci0gIGF2cmNfcnNwLnJlZ19ub3RpZi5wZHUgPSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT047Ci0gIGF2cmNfcnNwLnJlZ19ub3RpZi5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgYXZyY19yc3AucmVnX25vdGlmLnBhcmFtLnZvbHVtZSA9IGFic192b2w7Ci0gIGF2cmNfcnNwLnJlZ19ub3RpZi5ldmVudF9pZCA9IEFWUkNfRVZUX1ZPTFVNRV9DSEFOR0U7Ci0KLSAgc3RhdHVzID0gQVZSQ19CbGRSZXNwb25zZShwX2Rldi0+cmNfaGFuZGxlLCAmYXZyY19yc3AsICZwX21zZyk7Ci0gIGlmIChzdGF0dXMgPT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbXNncmVxIGJlaW5nIHNlbnQgb3V0IHdpdGggbGFiZWw6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBsYWJlbCk7Ci0gICAgdWludDhfdCogZGF0YV9zdGFydCA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gICAgQlRBX0F2VmVuZG9yUnNwKHBfZGV2LT5yY19oYW5kbGUsIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAocnNwX3R5cGUgPT0gQlRSQ19OT1RJRklDQVRJT05fVFlQRV9JTlRFUklNKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBBVlJDX1JTUF9JTlRFUklNCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEFWUkNfUlNQX0NIQU5HRUQsCi0gICAgICAgICAgICAgICAgICAgIGRhdGFfc3RhcnQsIHBfbXNnLT5sZW4sIDApOwotICAgIHN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBmYWlsZWQgdG8gYnVpbGQgY29tbWFuZC4gc3RhdHVzOiAweCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gIH0KLSAgb3NpX2ZyZWUocF9tc2cpOwotCi0gIHJldHVybiAoYnRfc3RhdHVzX3Qpc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZW5kX2dyb3VwbmF2aWdhdGlvbl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgUGFzcy1UaHJvdWdoIGNvbW1hbmQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2VuZF9ncm91cG5hdmlnYXRpb25fY21kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3N0YXRlKSB7Ci0gIHRBVlJDX1NUUyBzdGF0dXMgPSBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci0gIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHJhbnNhY3Rpb24gPSBOVUxMOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczoga2V5LWNvZGU6ICVkLCBrZXktc3RhdGU6ICVkIiwgX19mdW5jX18sIGtleV9jb2RlLAotICAgICAgICAgICAgICAgICAgIGtleV9zdGF0ZSk7Ci0gIGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLQotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIGlmIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSB7Ci0gICAgYnRfc3RhdHVzX3QgdHJhbl9zdGF0dXMgPSBnZXRfdHJhbnNhY3Rpb24ocF9kZXYsICZwX3RyYW5zYWN0aW9uKTsKLSAgICBpZiAoKEJUX1NUQVRVU19TVUNDRVNTID09IHRyYW5fc3RhdHVzKSAmJiAoTlVMTCAhPSBwX3RyYW5zYWN0aW9uKSkgewotICAgICAgdWludDhfdCBidWZmZXJbQVZSQ19QQVNTX1RIUlVfR1JPVVBfTEVOXSA9IHswfTsKLSAgICAgIHVpbnQ4X3QqIHN0YXJ0ID0gYnVmZmVyOwotICAgICAgVUlOVDI0X1RPX0JFX1NUUkVBTShzdGFydCwgQVZSQ19DT19NRVRBREFUQSk7Ci0gICAgICAqKHN0YXJ0KSsrID0gMDsKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShzdGFydCwga2V5X2NvZGUpOwotICAgICAgQlRBX0F2UmVtb3RlVmVuZG9yVW5pcXVlQ21kKHBfZGV2LT5yY19oYW5kbGUsIHBfdHJhbnNhY3Rpb24tPmxibCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUQV9BVl9TVEFURSlrZXlfc3RhdGUsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX1BBU1NfVEhSVV9HUk9VUF9MRU4pOwotICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc3VjY2VzZnVsbHkgc2VudCBncm91cF9uYXZpZ2F0aW9uIGNvbW1hbmQgdG8gQlRBIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBlcnJvciBpbiBmZXRjaGluZyB0cmFuc2FjdGlvbiIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGZlYXR1cmUgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKLSAgfQotICByZXR1cm4gKGJ0X3N0YXR1c190KXN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2VuZF9wYXNzdGhyb3VnaF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgUGFzcy1UaHJvdWdoIGNvbW1hbmQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2VuZF9wYXNzdGhyb3VnaF9jbWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9jb2RlLCB1aW50OF90IGtleV9zdGF0ZSkgewotICB0QVZSQ19TVFMgc3RhdHVzID0gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICBidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiA9IE5VTEw7Ci0gIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBjYWxsaW5nIGJ0aWZfcmNfZ2V0X2RldmljZV9ieV9iZGEiLCBfX2Z1bmNfXyk7Ci0gIHBfZGV2ID0gYnRpZl9yY19nZXRfZGV2aWNlX2J5X2JkYShiZF9hZGRyKTsKLQotICBDSEVDS19SQ19DT05ORUNURUQocF9kZXYpOwotCi0gIHJjX3RyYW5zYWN0aW9uX3QqIHBfdHJhbnNhY3Rpb24gPSBOVUxMOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczoga2V5LWNvZGU6ICVkLCBrZXktc3RhdGU6ICVkIiwgX19mdW5jX18sIGtleV9jb2RlLAotICAgICAgICAgICAgICAgICAgIGtleV9zdGF0ZSk7Ci0gIGlmIChwX2Rldi0+cmNfZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ1RHKSB7Ci0gICAgYnRfc3RhdHVzX3QgdHJhbl9zdGF0dXMgPSBnZXRfdHJhbnNhY3Rpb24ocF9kZXYsICZwX3RyYW5zYWN0aW9uKTsKLSAgICBpZiAoQlRfU1RBVFVTX1NVQ0NFU1MgPT0gdHJhbl9zdGF0dXMgJiYgTlVMTCAhPSBwX3RyYW5zYWN0aW9uKSB7Ci0gICAgICBCVEFfQXZSZW1vdGVDbWQocF9kZXYtPnJjX2hhbmRsZSwgcF90cmFuc2FjdGlvbi0+bGJsLAotICAgICAgICAgICAgICAgICAgICAgICh0QlRBX0FWX1JDKWtleV9jb2RlLCAodEJUQV9BVl9TVEFURSlrZXlfc3RhdGUpOwotICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc3VjY2VzZnVsbHkgc2VudCBwYXNzdGhyb3VnaCBjb21tYW5kIHRvIEJUQSIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogZXJyb3IgaW4gZmV0Y2hpbmcgdHJhbnNhY3Rpb24iLCBfX2Z1bmNfXyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7Ci0gIH0KLSAgcmV0dXJuIChidF9zdGF0dXNfdClzdGF0dXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBidHJjX2ludGVyZmFjZV90IGJ0X3JjX2ludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYnRfcmNfaW50ZXJmYWNlKSwKLSAgICBpbml0LAotICAgIGdldF9wbGF5X3N0YXR1c19yc3AsCi0gICAgTlVMTCwgLyogbGlzdF9wbGF5ZXJfYXBwX2F0dHJfcnNwICovCi0gICAgTlVMTCwgLyogbGlzdF9wbGF5ZXJfYXBwX3ZhbHVlX3JzcCAqLwotICAgIE5VTEwsIC8qIGdldF9wbGF5ZXJfYXBwX3ZhbHVlX3JzcCAqLwotICAgIE5VTEwsIC8qIGdldF9wbGF5ZXJfYXBwX2F0dHJfdGV4dF9yc3AgKi8KLSAgICBOVUxMLCAvKiBnZXRfcGxheWVyX2FwcF92YWx1ZV90ZXh0X3JzcCAqLwotICAgIGdldF9lbGVtZW50X2F0dHJfcnNwLAotICAgIE5VTEwsIC8qIHNldF9wbGF5ZXJfYXBwX3ZhbHVlX3JzcCAqLwotICAgIHJlZ2lzdGVyX25vdGlmaWNhdGlvbl9yc3AsCi0gICAgc2V0X3ZvbHVtZSwKLSAgICBzZXRfYWRkcmVzc2VkX3BsYXllcl9yc3AsCi0gICAgc2V0X2Jyb3dzZWRfcGxheWVyX3JzcCwKLSAgICBnZXRfZm9sZGVyX2l0ZW1zX2xpc3RfcnNwLAotICAgIGNoYW5nZV9wYXRoX3JzcCwKLSAgICBnZXRfaXRlbV9hdHRyX3JzcCwKLSAgICBwbGF5X2l0ZW1fcnNwLAotICAgIGdldF90b3RhbF9udW1fb2ZfaXRlbXNfcnNwLAotICAgIHNlYXJjaF9yc3AsCi0gICAgYWRkX3RvX25vd19wbGF5aW5nX3JzcCwKLSAgICBjbGVhbnVwLAotfTsKLQotc3RhdGljIGNvbnN0IGJ0cmNfY3RybF9pbnRlcmZhY2VfdCBidF9yY19jdHJsX2ludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYnRfcmNfY3RybF9pbnRlcmZhY2UpLAotICAgIGluaXRfY3RybCwKLSAgICBzZW5kX3Bhc3N0aHJvdWdoX2NtZCwKLSAgICBzZW5kX2dyb3VwbmF2aWdhdGlvbl9jbWQsCi0gICAgY2hhbmdlX3BsYXllcl9hcHBfc2V0dGluZywKLSAgICBwbGF5X2l0ZW1fY21kLAotICAgIGdldF9jdXJyZW50X21ldGFkYXRhX2NtZCwKLSAgICBnZXRfcGxheWJhY2tfc3RhdGVfY21kLAotICAgIGdldF9ub3dfcGxheWluZ19saXN0X2NtZCwKLSAgICBnZXRfZm9sZGVyX2xpc3RfY21kLAotICAgIGdldF9wbGF5ZXJfbGlzdF9jbWQsCi0gICAgY2hhbmdlX2ZvbGRlcl9wYXRoX2NtZCwKLSAgICBzZXRfYnJvd3NlZF9wbGF5ZXJfY21kLAotICAgIHNldF9hZGRyZXNzZWRfcGxheWVyX2NtZCwKLSAgICBzZXRfdm9sdW1lX3JzcCwKLSAgICB2b2x1bWVfY2hhbmdlX25vdGlmaWNhdGlvbl9yc3AsCi0gICAgY2xlYW51cF9jdHJsLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfcmNfZ2V0X2ludGVyZmFjZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IHRoZSBBVlJDUCBUYXJnZXQgY2FsbGJhY2sgaW50ZXJmYWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBidHJjX2ludGVyZmFjZV90Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGJ0cmNfaW50ZXJmYWNlX3QqIGJ0aWZfcmNfZ2V0X2ludGVyZmFjZSh2b2lkKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiAiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRfcmNfaW50ZXJmYWNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9yY19jdHJsX2dldF9pbnRlcmZhY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgQVZSQ1AgQ29udHJvbGxlciBjYWxsYmFjayBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0cmNfY3RybF9pbnRlcmZhY2VfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBidHJjX2N0cmxfaW50ZXJmYWNlX3QqIGJ0aWZfcmNfY3RybF9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6ICIsIF9fZnVuY19fKTsKLSAgcmV0dXJuICZidF9yY19jdHJsX2ludGVyZmFjZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgRnVuY3Rpb24gICAgICAgICBpbml0aWFsaXplX3RyYW5zYWN0aW9uCi0gKgotICogICAgICBEZXNjcmlwdGlvbiAgICBJbml0aWFsaXplcyBmaWVsZHMgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZQotICoKLSAqICAgICAgUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV90cmFuc2FjdGlvbihidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiwgaW50IGxibCkgewotICBpZiAocF9kZXYgPT0gbnVsbHB0cikgcmV0dXJuOwotICByY190cmFuc2FjdGlvbl9zZXRfdCogdHJhbnNhY3Rpb25fc2V0ID0gJihwX2Rldi0+dHJhbnNhY3Rpb25fc2V0KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayh0cmFuc2FjdGlvbl9zZXQtPmxibGxvY2spOwotICBpZiAobGJsIDwgTUFYX1RSQU5TQUNUSU9OU19QRVJfU0VTU0lPTikgewotICAgIGlmIChhbGFybV9pc19zY2hlZHVsZWQodHJhbnNhY3Rpb25fc2V0LT50cmFuc2FjdGlvbltsYmxdLnR4bl90aW1lcikpIHsKLSAgICAgIGNsZWFyX2NtZF90aW1lb3V0KHBfZGV2LCBsYmwpOwotICAgIH0KLSAgICB0cmFuc2FjdGlvbl9zZXQtPnRyYW5zYWN0aW9uW2xibF0ubGJsID0gbGJsOwotICAgIHRyYW5zYWN0aW9uX3NldC0+dHJhbnNhY3Rpb25bbGJsXS5pbl91c2UgPSBmYWxzZTsKLSAgICB0cmFuc2FjdGlvbl9zZXQtPnRyYW5zYWN0aW9uW2xibF0uaGFuZGxlID0gMDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaW5pdF9hbGxfdHJhbnNhY3Rpb25zCi0gKgotICogRGVzY3JpcHRpb24gICAgSW5pdGlhbGl6ZXMgYWxsIHRyYW5zYWN0aW9ucwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaW5pdF9hbGxfdHJhbnNhY3Rpb25zKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2KSB7Ci0gIGlmIChwX2RldiA9PSBudWxscHRyKSByZXR1cm47Ci0gIGZvciAoYXV0byBpID0gMDsgaSA8IE1BWF9UUkFOU0FDVElPTlNfUEVSX1NFU1NJT047ICsraSkgewotICAgIGluaXRpYWxpemVfdHJhbnNhY3Rpb24ocF9kZXYsIGkpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfdHJhbnNhY3Rpb25fYnlfbGJsCi0gKgotICogRGVzY3JpcHRpb24gICAgV2lsbCByZXR1cm4gYSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgbGFiZWwuIElmIG5vdCBpbnVzZQotICogICAgICAgICAgICAgICAgICAgICB3aWxsIHJldHVybiBhbiBlcnJvci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcmNfdHJhbnNhY3Rpb25fdCogZ2V0X3RyYW5zYWN0aW9uX2J5X2xibChidGlmX3JjX2RldmljZV9jYl90KiBwX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYmwpIHsKLSAgaWYgKHBfZGV2ID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOwotCi0gIHJjX3RyYW5zYWN0aW9uX3QqIHRyYW5zYWN0aW9uID0gTlVMTDsKLSAgcmNfdHJhbnNhY3Rpb25fc2V0X3QqIHRyYW5zYWN0aW9uX3NldCA9ICYocF9kZXYtPnRyYW5zYWN0aW9uX3NldCk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sodHJhbnNhY3Rpb25fc2V0LT5sYmxsb2NrKTsKLQotICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHZhbGlkIGxhYmVsICovCi0gIGlmIChsYmwgPCBNQVhfVFJBTlNBQ1RJT05TX1BFUl9TRVNTSU9OKSB7Ci0gICAgaWYgKCF0cmFuc2FjdGlvbl9zZXQtPnRyYW5zYWN0aW9uW2xibF0uaW5fdXNlKSB7Ci0gICAgICB0cmFuc2FjdGlvbiA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRyYW5zYWN0aW9uID0gJih0cmFuc2FjdGlvbl9zZXQtPnRyYW5zYWN0aW9uW2xibF0pOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJhbnNhY3Rpb247Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnZXRfdHJhbnNhY3Rpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICBPYnRhaW5zIHRoZSB0cmFuc2FjdGlvbiBkZXRhaWxzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYnRfc3RhdHVzX3QgZ2V0X3RyYW5zYWN0aW9uKGJ0aWZfcmNfZGV2aWNlX2NiX3QqIHBfZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY190cmFuc2FjdGlvbl90KiogcHRyYW5zYWN0aW9uKSB7Ci0gIGlmIChwX2RldiA9PSBOVUxMKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIHJjX3RyYW5zYWN0aW9uX3NldF90KiB0cmFuc2FjdGlvbl9zZXQgPSAmKHBfZGV2LT50cmFuc2FjdGlvbl9zZXQpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHRyYW5zYWN0aW9uX3NldC0+bGJsbG9jayk7Ci0KLSAgLy8gQ2hlY2sgZm9yIHVudXNlZCB0cmFuc2FjdGlvbnMgaW4gdGhlIGRldmljZSdzIHRyYW5zYWN0aW9uIHNldAotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBNQVhfVFJBTlNBQ1RJT05TX1BFUl9TRVNTSU9OOyBpKyspIHsKLSAgICBpZiAoIXRyYW5zYWN0aW9uX3NldC0+dHJhbnNhY3Rpb25baV0uaW5fdXNlKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcF9kZXY9JXMsIGxhYmVsPSVkLCBnb3QgZnJlZSB0cmFuc2FjdGlvbiEiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kZXYtPnJjX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBpKTsKLSAgICAgIHRyYW5zYWN0aW9uX3NldC0+dHJhbnNhY3Rpb25baV0uaW5fdXNlID0gdHJ1ZTsKLSAgICAgICpwdHJhbnNhY3Rpb24gPSAmKHRyYW5zYWN0aW9uX3NldC0+dHJhbnNhY3Rpb25baV0pOwotICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICAgIH0KLSAgfQotICBCVElGX1RSQUNFX0VSUk9SKCIlczogcF9kZXY9JXMsIGZhaWxlZCB0byBmaW5kIGZyZWUgdHJhbnNhY3Rpb24iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX2Rldi0+cmNfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICByZXR1cm4gQlRfU1RBVFVTX05PTUVNOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmVsZWFzZV90cmFuc2FjdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgIFdpbGwgcmVsZWFzZSBhIHRyYW5zYWN0aW9uIGZvciByZXVzZQotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJlbGVhc2VfdHJhbnNhY3Rpb24oYnRpZl9yY19kZXZpY2VfY2JfdCogcF9kZXYsIHVpbnQ4X3QgbGJsKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwX2Rldj0lcywgbGFiZWw9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX2RldiA9PSBOVUxMID8gIm51bGwiIDogcF9kZXYtPnJjX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxibCk7Ci0gIHJjX3RyYW5zYWN0aW9uX3QqIHRyYW5zYWN0aW9uID0gZ2V0X3RyYW5zYWN0aW9uX2J5X2xibChwX2RldiwgbGJsKTsKLQotICAvKiBJZiB0aGUgdHJhbnNhY3Rpb24gaXMgaW4gdXNlLi4uICovCi0gIGlmICh0cmFuc2FjdGlvbiAhPSBOVUxMKSB7Ci0gICAgaW5pdGlhbGl6ZV90cmFuc2FjdGlvbihwX2RldiwgbGJsKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICBGdW5jdGlvbiAgICAgICBzbGVlcF9tcwotICoKLSAqICAgICAgRGVzY3JpcHRpb24gICAgU2xlZXAgdGhlIGNhbGxpbmcgdGhyZWFkIHVuY29uZGl0aW9uYWxseSBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgfHRpbWVvdXRfbXN8IG1pbGxpc2Vjb25kcy4KLSAqCi0gKiAgICAgIFJldHVybnMgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzbGVlcF9tcyh1aW50NjRfdCB0aW1lb3V0X21zKSB7Ci0gIHN0cnVjdCB0aW1lc3BlYyBkZWxheTsKLSAgZGVsYXkudHZfc2VjID0gdGltZW91dF9tcyAvIDEwMDA7Ci0gIGRlbGF5LnR2X25zZWMgPSAxMDAwICogMTAwMCAqICh0aW1lb3V0X21zICUgMTAwMCk7Ci0KLSAgT1NJX05PX0lOVFIobmFub3NsZWVwKCZkZWxheSwgJmRlbGF5KSk7Ci19Ci0KLXN0YXRpYyBib29sIGFic29sdXRlX3ZvbHVtZV9kaXNhYmxlZCgpIHsKLSAgY2hhciB2b2x1bWVfZGlzYWJsZWRbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC5ibHVldG9vdGguZGlzYWJsZWFic3ZvbCIsIHZvbHVtZV9kaXNhYmxlZCwgImZhbHNlIik7Ci0gIGlmIChzdHJuY21wKHZvbHVtZV9kaXNhYmxlZCwgInRydWUiLCA0KSA9PSAwKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogQWJzb2x1dGUgdm9sdW1lIGRpc2FibGVkIGJ5IHByb3BlcnR5IiwgX19mdW5jX18pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfc2RwLmNjIGIvYnRpZi9zcmMvYnRpZl9zZHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzZhMzYuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9zZHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAyMDE0IFNhbXN1bmcgU3lzdGVtIExTSQotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfc2RwLmMKLSAqICBEZXNjcmlwdGlvbjogICBTRFAgQmx1ZXRvb3RoIEludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgICBJbXBsZW1lbnRzIHRoZSBnZW5lcmljIG1lc3NhZ2UgaGFuZGxpbmcgYW5kIHNlYXJjaAotICogICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkuCi0gKiAgICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBidGlmX3NkcF9zZXJ2ZXIuYyBmb3IgU0RQIHJlY29yZCBjcmVhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfc2RwIgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc2RwLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX3NkcF9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfcHJvZmlsZV9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gc2RwX3NlcnZlci5jCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBzZHBfc2VydmVyX2luaXQoKTsKLXZvaWQgc2RwX3NlcnZlcl9jbGVhbnVwKCk7Ci1idF9zdGF0dXNfdCBjcmVhdGVfc2RwX3JlY29yZChibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVjb3JkX2hhbmRsZXMpOwotYnRfc3RhdHVzX3QgcmVtb3ZlX3NkcF9yZWNvcmQoaW50IHJlY29yZF9oYW5kbGUpOwotdm9pZCBvbl9jcmVhdGVfcmVjb3JkX2V2ZW50KGludCBoYW5kbGUpOwotdm9pZCBvbl9yZW1vdmVfcmVjb3JkX2V2ZW50KGludCBoYW5kbGUpOwotCi0vLyBVdGlsaXR5IGZ1bmN0aW9uczoKLWludCBnZXRfc2RwX3JlY29yZHNfc2l6ZShibHVldG9vdGhfc2RwX3JlY29yZCogaW5fcmVjb3JkLCBpbnQgY291bnQpOwotdm9pZCBjb3B5X3NkcF9yZWNvcmRzKGJsdWV0b290aF9zZHBfcmVjb3JkKiBpbl9yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aF9zZHBfcmVjb3JkKiBvdXRfcmVjb3JkcywgaW50IGNvdW50KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIHZhcmlhYmxlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYnRzZHBfY2FsbGJhY2tzX3QqIGJ0X3NkcF9jYWxsYmFja3MgPSBOVUxMOwotCi1zdGF0aWMgdm9pZCBidGlmX3NkcF9zZWFyY2hfY29tcF9ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgdEJUQV9TRFBfU0VBUkNIX0NPTVAqIGV2dF9kYXRhID0gKHRCVEFfU0RQX1NFQVJDSF9DT01QKilwX3BhcmFtOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogIGV2ZW50ID0gJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0gIGlmIChldmVudCAhPSBCVEFfU0RQX1NFQVJDSF9DT01QX0VWVCkgcmV0dXJuOwotCi0gIEhBTF9DQkFDSyhidF9zZHBfY2FsbGJhY2tzLCBzZHBfc2VhcmNoX2NiLCAoYnRfc3RhdHVzX3QpZXZ0X2RhdGEtPnN0YXR1cywKLSAgICAgICAgICAgIGV2dF9kYXRhLT5yZW1vdGVfYWRkciwgZXZ0X2RhdGEtPnV1aWQsIGV2dF9kYXRhLT5yZWNvcmRfY291bnQsCi0gICAgICAgICAgICBldnRfZGF0YS0+cmVjb3Jkcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNkcF9zZWFyY2hfY29tcF9jb3B5X2NiKHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX2Rlc3QsIGNoYXIqIHBfc3JjKSB7Ci0gIHRCVEFfU0RQX1NFQVJDSF9DT01QKiBwX2Rlc3RfZGF0YSA9ICh0QlRBX1NEUF9TRUFSQ0hfQ09NUCopcF9kZXN0OwotICB0QlRBX1NEUF9TRUFSQ0hfQ09NUCogcF9zcmNfZGF0YSA9ICh0QlRBX1NEUF9TRUFSQ0hfQ09NUCopcF9zcmM7Ci0KLSAgaWYgKCFwX3NyYykgcmV0dXJuOwotCi0gIGlmIChldmVudCAhPSBCVEFfU0RQX1NFQVJDSF9DT01QX0VWVCkgcmV0dXJuOwotCi0gIG1heWJlX25vbl9hbGlnbmVkX21lbWNweShwX2Rlc3RfZGF0YSwgcF9zcmNfZGF0YSwgc2l6ZW9mKCpwX3NyY19kYXRhKSk7Ci0KLSAgY29weV9zZHBfcmVjb3JkcyhwX3NyY19kYXRhLT5yZWNvcmRzLCBwX2Rlc3RfZGF0YS0+cmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICBwX3NyY19kYXRhLT5yZWNvcmRfY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBzZHBfZG1fY2JhY2sodEJUQV9TRFBfRVZUIGV2ZW50LCB0QlRBX1NEUCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfU0RQX1NFQVJDSF9DT01QX0VWVDogewotICAgICAgaW50IHNpemUgPSBzaXplb2YodEJUQV9TRFApOwotICAgICAgc2l6ZSArPSBnZXRfc2RwX3JlY29yZHNfc2l6ZShwX2RhdGEtPnNkcF9zZWFyY2hfY29tcC5yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNkcF9zZWFyY2hfY29tcC5yZWNvcmRfY291bnQpOwotCi0gICAgICAvKiBuZWVkIHRvIGRlZXAgY29weSB0aGUgcmVjb3JkIGNvbnRlbnQgKi8KLSAgICAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX3NkcF9zZWFyY2hfY29tcF9ldnQsIGV2ZW50LCAoY2hhciopcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHNkcF9zZWFyY2hfY29tcF9jb3B5X2NiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9TRFBfQ1JFQVRFX1JFQ09SRF9VU0VSX0VWVDogewotICAgICAgb25fY3JlYXRlX3JlY29yZF9ldmVudChQVFJfVE9fSU5UKHVzZXJfZGF0YSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX1NEUF9SRU1PVkVfUkVDT1JEX1VTRVJfRVZUOiB7Ci0gICAgICBvbl9yZW1vdmVfcmVjb3JkX2V2ZW50KFBUUl9UT19JTlQodXNlcl9kYXRhKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0KGJ0c2RwX2NhbGxiYWNrc190KiBjYWxsYmFja3MpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiU2RwIFNlYXJjaCAlcyIsIF9fZnVuY19fKTsKLQotICBidF9zZHBfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICBzZHBfc2VydmVyX2luaXQoKTsKLQotICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9TRFBfU0VSVklDRV9JRCk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgZGVpbml0KCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJTZHAgU2VhcmNoICVzIiwgX19mdW5jX18pOwotCi0gIGJ0X3NkcF9jYWxsYmFja3MgPSBOVUxMOwotICBzZHBfc2VydmVyX2NsZWFudXAoKTsKLSAgYnRpZl9kaXNhYmxlX3NlcnZpY2UoQlRBX1NEUF9TRVJWSUNFX0lEKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBzZWFyY2goUmF3QWRkcmVzcyogYmRfYWRkciwgY29uc3QgVXVpZCYgdXVpZCkgewotICBCVEFfU2RwU2VhcmNoKCpiZF9hZGRyLCB1dWlkKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgY29uc3QgYnRzZHBfaW50ZXJmYWNlX3Qgc2RwX2lmID0gewotICAgIHNpemVvZihidHNkcF9pbnRlcmZhY2VfdCksIGluaXQsIGRlaW5pdCwgc2VhcmNoLCBjcmVhdGVfc2RwX3JlY29yZCwKLSAgICByZW1vdmVfc2RwX3JlY29yZH07Ci0KLWNvbnN0IGJ0c2RwX2ludGVyZmFjZV90KiBidGlmX3NkcF9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmc2RwX2lmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zZHBfZXhlY3V0ZV9zZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplcy9TaHV0cyBkb3duIHRoZSBzZXJ2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzLCBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zZHBfZXhlY3V0ZV9zZXJ2aWNlKGJvb2wgYl9lbmFibGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXMgZW5hYmxlOiVkIiwgX19mdW5jX18sIGJfZW5hYmxlKTsKLQotICBpZiAoYl9lbmFibGUpIHsKLSAgICBCVEFfU2RwRW5hYmxlKHNkcF9kbV9jYmFjayk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogVGhpcyBpcyBjYWxsZWQgb24gQlQgZGlzYWJsZSBzbyBubyBuZWVkIHRvIGV4dHJhIGNsZWFudXAgKi8KLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX3NkcF9zZXJ2ZXIuY2MgYi9idGlmL3NyYy9idGlmX3NkcF9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTY2YjYuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9zZHBfc2VydmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNCBTYW1zdW5nIFN5c3RlbSBMU0kKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX3NkcF9zZXJ2ZXIuY2MKLSAqICBEZXNjcmlwdGlvbjogICBTRFAgc2VydmVyIEJsdWV0b290aCBJbnRlcmZhY2UgdG8gY3JlYXRlIGFuZCByZW1vdmUgU0RQCi0gKiAgICAgICAgICAgICAgICAgcmVjb3Jkcy4KLSAqICAgICAgICAgICAgICAgICBUbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIFJGQ09NTS9MMkNBUChMRSkgc29ja2V0cy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX3NkcF9zZXJ2ZXIiCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9zZHAuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImJ0YV9zZHBfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX3N5cy5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9zb2NrX3V0aWwuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInV0bC5oIgotCi0vLyBQcm90ZWN0cyB0aGUgc2RwX3Nsb3RzIGFycmF5IGZyb20gY29uY3VycmVudCBhY2Nlc3MuCi1zdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggc2RwX2xvY2s7Ci0KLS8qKgotICogVGhlIG5lZWQgZm9yIGEgc3RhdGUgdmFyaWFibGUgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gdHdvIHN0YXRlcy4KLSAqIFRoZSByZW1haW5pbmcgc3RhdGUgY29udHJvbCBpcyBoYW5kbGVkIGJ5IHByb2dyYW0gZmxvdwotICovCi10eXBlZGVmIGVudW0gewotICBTRFBfUkVDT1JEX0ZSRUUgPSAwLAotICBTRFBfUkVDT1JEX0FMTE9DRUQsCi19IHNkcF9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNkcF9zdGF0ZV90IHN0YXRlOwotICBpbnQgc2RwX2hhbmRsZTsKLSAgYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIHJlY29yZF9kYXRhOwotfSBzZHBfc2xvdF90OwotCi0jZGVmaW5lIE1BWF9TRFBfU0xPVFMgMTI4Ci1zdGF0aWMgc2RwX3Nsb3RfdCBzZHBfc2xvdHNbTUFYX1NEUF9TTE9UU107Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTE9DQUwgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGFkZF9tYXBzX3NkcChjb25zdCBibHVldG9vdGhfc2RwX21hc19yZWNvcmQqIHJlYyk7Ci1zdGF0aWMgaW50IGFkZF9tYXBjX3NkcChjb25zdCBibHVldG9vdGhfc2RwX21uc19yZWNvcmQqIHJlYyk7Ci1zdGF0aWMgaW50IGFkZF9wYmFwY19zZHAoY29uc3QgYmx1ZXRvb3RoX3NkcF9wY2VfcmVjb3JkKiByZWMpOwotc3RhdGljIGludCBhZGRfcGJhcHNfc2RwKGNvbnN0IGJsdWV0b290aF9zZHBfcHNlX3JlY29yZCogcmVjKTsKLXN0YXRpYyBpbnQgYWRkX29wcHNfc2RwKGNvbnN0IGJsdWV0b290aF9zZHBfb3BzX3JlY29yZCogcmVjKTsKLXN0YXRpYyBpbnQgYWRkX3NhcHNfc2RwKGNvbnN0IGJsdWV0b290aF9zZHBfc2FwX3JlY29yZCogcmVjKTsKLWJ0X3N0YXR1c190IHJlbW92ZV9zZHBfcmVjb3JkKGludCByZWNvcmRfaWQpOwotc3RhdGljIGludCBmcmVlX3NkcF9zbG90KGludCBpZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdBUk5JTkc6IEZ1bmN0aW9ucyBiZWxvdyBhcmUgbm90IGNhbGxlZCBpbiBCVFUgY29udGV4dC4KLSAqIEludHJvZHVjZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBjcmVhdGUgU0RQIHJlY29yZHMgZnJvbSBKQVZBIHdpdGggYm90aCBhCi0gKiBSRkNPTU0gY2hhbm5lbCBhbmQgYSBMMkNBUCBQU00uCi0gKiBPdmVyYWxsIGFyY2hpdGVjdHVyZToKLSAqICAxKSBKQVZBIGNhbGxzIGNyZWF0ZVJlY29yZCgpIHdoaWNoIHJldHVybnMgYSBwc2V1ZG8gSUQgd2hpY2ggYXQgYSBsYXRlcgotICogICAgIHBvaW50IHdpbGwgYmUgbGlua2VkIHRvIGEgc3BlY2lmaWMgU0RQIGhhbmRsZS4KLSAqICAyKSBjcmVhdGVSZWNvcmQoKSByZXF1ZXN0cyB0aGUgQlRVIHRhc2sodGhyZWFkKSB0byBjYWxsIGEgY2FsbGJhY2sgaW4gU0RQCi0gKiAgICAgd2hpY2ggY3JlYXRlcyB0aGUgYWN0dWFsIHJlY29yZCwgYW5kIHVwZGF0ZXMgdGhlIElEPC0+U0RQSGFuZGxlIG1hcAotICogICAgIGJhc2VkIG9uIHRoZSBJRCBiZWVpbmcgcGFzc2VkIHRvIEJUQSBhcyB1c2VyX2RhdGEuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGluaXRfc2RwX3Nsb3RzKCkgewotICBpbnQgaTsKLSAgbWVtc2V0KHNkcF9zbG90cywgMCwgc2l6ZW9mKHNkcF9zbG90X3QpICogTUFYX1NEUF9TTE9UUyk7Ci0gIC8qIGlmIFNEUF9SRUNPUkRfRlJFRSBpcyB6ZXJvIC0gbm8gbmVlZCB0byBzZXQgdGhlIHZhbHVlICovCi0gIGlmIChTRFBfUkVDT1JEX0ZSRUUgIT0gMCkgewotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU0RQX1NMT1RTOyBpKyspIHsKLSAgICAgIHNkcF9zbG90c1tpXS5zdGF0ZSA9IFNEUF9SRUNPUkRfRlJFRTsKLSAgICB9Ci0gIH0KLX0KLQotYnRfc3RhdHVzX3Qgc2RwX3NlcnZlcl9pbml0KCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJTZHAgU2VydmVyICVzIiwgX19mdW5jX18pOwotICBpbml0X3NkcF9zbG90cygpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgc2RwX3NlcnZlcl9jbGVhbnVwKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJTZHAgU2VydmVyICVzIiwgX19mdW5jX18pOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHNkcF9sb2NrKTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfU0RQX1NMT1RTOyBpKyspIHsKLSAgICAvKnJlbW92ZV9zZHBfcmVjb3JkKGkpOyB3ZSBjYW5ub3Qgc2VuZCBtZXNzYWdlcyB0byB0aGUgb3RoZXIgdGhyZWFkcywgc2luY2UKLSAgICAqIHRoZXkgbWlnaHQKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gc2h1dCBkb3duIGFscmVhZHkuIEp1c3QgZG8gbG9jYWwgY2xlYW51cC4KLSAgICAqLwotICAgIGZyZWVfc2RwX3Nsb3QoaSk7Ci0gIH0KLX0KLQotaW50IGdldF9zZHBfcmVjb3Jkc19zaXplKGJsdWV0b290aF9zZHBfcmVjb3JkKiBpbl9yZWNvcmQsIGludCBjb3VudCkgewotICBibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkID0gaW5fcmVjb3JkOwotICBpbnQgcmVjb3Jkc19zaXplID0gMDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgcmVjb3JkID0gJmluX3JlY29yZFtpXTsKLSAgICByZWNvcmRzX3NpemUgKz0gc2l6ZW9mKGJsdWV0b290aF9zZHBfcmVjb3JkKTsKLSAgICByZWNvcmRzX3NpemUgKz0gcmVjb3JkLT5oZHIuc2VydmljZV9uYW1lX2xlbmd0aDsKLSAgICBpZiAocmVjb3JkLT5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCA+IDApIHsKLSAgICAgIHJlY29yZHNfc2l6ZSsrOyAvKiArICdcMCcgdGVybWluYXRpb24gb2Ygc3RyaW5nICovCi0gICAgfQotICAgIHJlY29yZHNfc2l6ZSArPSByZWNvcmQtPmhkci51c2VyMV9wdHJfbGVuOwotICAgIHJlY29yZHNfc2l6ZSArPSByZWNvcmQtPmhkci51c2VyMl9wdHJfbGVuOwotICB9Ci0gIHJldHVybiByZWNvcmRzX3NpemU7Ci19Ci0KLS8qIERlZXAgY29weSBhbGwgY29udGVudCBvZiBpbl9yZWNvcmRzIGludG8gb3V0X3JlY29yZHMuCi0gKiBvdXRfcmVjb3JkcyBtdXN0IHBvaW50IHRvIGEgY2h1bmsgb2YgbWVtb3J5IGxhcmdlIGVub3VnaCB0byBjb250YWluIGFsbAotICogdGhlIGRhdGEuIFVzZSBnZXRTZHBSZWNvcmRzU2l6ZSgpIHRvIGNhbGN1bGF0ZSB0aGUgbmVlZGVkIHNpemUuICovCi12b2lkIGNvcHlfc2RwX3JlY29yZHMoYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIGluX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIG91dF9yZWNvcmRzLCBpbnQgY291bnQpIHsKLSAgaW50IGk7Ci0gIGJsdWV0b290aF9zZHBfcmVjb3JkKiBpbl9yZWNvcmQ7Ci0gIGJsdWV0b290aF9zZHBfcmVjb3JkKiBvdXRfcmVjb3JkOwotICBjaGFyKiBmcmVlX3B0ciA9Ci0gICAgICAoY2hhciopKCZvdXRfcmVjb3Jkc1tjb3VudF0pOyAvKiBzZXQgcG9pbnRlciB0byBhZnRlciB0aGUgbGFzdCBlbnRyeSAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgaW5fcmVjb3JkID0gJmluX3JlY29yZHNbaV07Ci0gICAgb3V0X3JlY29yZCA9ICZvdXRfcmVjb3Jkc1tpXTsKLSAgICAqb3V0X3JlY29yZCA9ICppbl9yZWNvcmQ7Ci0KLSAgICBpZiAoaW5fcmVjb3JkLT5oZHIuc2VydmljZV9uYW1lID09IE5VTEwgfHwKLSAgICAgICAgaW5fcmVjb3JkLT5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCA9PSAwKSB7Ci0gICAgICBvdXRfcmVjb3JkLT5oZHIuc2VydmljZV9uYW1lID0gTlVMTDsKLSAgICAgIG91dF9yZWNvcmQtPmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0X3JlY29yZC0+aGRyLnNlcnZpY2VfbmFtZSA9IGZyZWVfcHRyOyAgLy8gVXBkYXRlIHNlcnZpY2VfbmFtZSBwb2ludGVyCi0gICAgICAvLyBDb3B5IHN0cmluZwotICAgICAgbWVtY3B5KGZyZWVfcHRyLCBpbl9yZWNvcmQtPmhkci5zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgaW5fcmVjb3JkLT5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCk7Ci0gICAgICBmcmVlX3B0ciArPSBpbl9yZWNvcmQtPmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoOwotICAgICAgKihmcmVlX3B0cikgPSAnXDAnOyAgLy8gU2V0ICdcMCcgdGVybWluYXRpb24gb2Ygc3RyaW5nCi0gICAgICBmcmVlX3B0cisrOwotICAgIH0KLSAgICBpZiAoaW5fcmVjb3JkLT5oZHIudXNlcjFfcHRyICE9IE5VTEwpIHsKLSAgICAgIG91dF9yZWNvcmQtPmhkci51c2VyMV9wdHIgPSAodWludDhfdCopZnJlZV9wdHI7ICAvLyBVcGRhdGUgcG9pbnRlcgotICAgICAgbWVtY3B5KGZyZWVfcHRyLCBpbl9yZWNvcmQtPmhkci51c2VyMV9wdHIsCi0gICAgICAgICAgICAgaW5fcmVjb3JkLT5oZHIudXNlcjFfcHRyX2xlbik7ICAvLyBDb3B5IGNvbnRlbnQKLSAgICAgIGZyZWVfcHRyICs9IGluX3JlY29yZC0+aGRyLnVzZXIxX3B0cl9sZW47Ci0gICAgfQotICAgIGlmIChpbl9yZWNvcmQtPmhkci51c2VyMl9wdHIgIT0gTlVMTCkgewotICAgICAgb3V0X3JlY29yZC0+aGRyLnVzZXIyX3B0ciA9ICh1aW50OF90KilmcmVlX3B0cjsgIC8vIFVwZGF0ZSBwb2ludGVyCi0gICAgICBtZW1jcHkoZnJlZV9wdHIsIGluX3JlY29yZC0+aGRyLnVzZXIyX3B0ciwKLSAgICAgICAgICAgICBpbl9yZWNvcmQtPmhkci51c2VyMl9wdHJfbGVuKTsgIC8vIENvcHkgY29udGVudAotICAgICAgZnJlZV9wdHIgKz0gaW5fcmVjb3JkLT5oZHIudXNlcjJfcHRyX2xlbjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuOwotfQotCi0vKiBSZXNlcnZlIGEgc2xvdCBpbiBzZHBfc2xvdHMsIGNvcHkgZGF0YSBhbmQgc2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjb3B5LgotICogVGhlIHJlY29yZF9kYXRhIHdpbGwgY29udGFpbiBib3RoIHRoZSByZWNvcmQgYW5kIGFueSBkYXRhIHBvaW50ZWQgdG8gYnkKLSAqIHRoZSByZWNvcmQuCi0gKiBDdXJyZW50bHkgdGhpcyBjb3ZlcnM6Ci0gKiAgIHNlcnZpY2VfbmFtZSBzdHJpbmcsCi0gKiAgIHVzZXIxX3B0ciBhbmQKLSAqICAgdXNlcjJfcHRyLiAqLwotc3RhdGljIGludCBhbGxvY19zZHBfc2xvdChibHVldG9vdGhfc2RwX3JlY29yZCogaW5fcmVjb3JkKSB7Ci0gIGludCByZWNvcmRfc2l6ZSA9IGdldF9zZHBfcmVjb3Jkc19zaXplKGluX3JlY29yZCwgMSk7Ci0gIC8qIFdlIGFyZSBvcHRpbWlzdHMgaGVyZSwgYW5kIHByZWFsbG9jYXRlIHRoZSByZWNvcmQuCi0gICAqIFRoaXMgaXMgdG8gcmVkdWNlIHRoZSB0aW1lIHdlIGhvbGQgdGhlIHNkcF9sb2NrLiAqLwotICBibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkID0gKGJsdWV0b290aF9zZHBfcmVjb3JkKilvc2lfbWFsbG9jKHJlY29yZF9zaXplKTsKLQotICBjb3B5X3NkcF9yZWNvcmRzKGluX3JlY29yZCwgcmVjb3JkLCAxKTsKLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2RwX2xvY2spOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NEUF9TTE9UUzsgaSsrKSB7Ci0gICAgICBpZiAoc2RwX3Nsb3RzW2ldLnN0YXRlID09IFNEUF9SRUNPUkRfRlJFRSkgewotICAgICAgICBzZHBfc2xvdHNbaV0uc3RhdGUgPSBTRFBfUkVDT1JEX0FMTE9DRUQ7Ci0gICAgICAgIHNkcF9zbG90c1tpXS5yZWNvcmRfZGF0YSA9IHJlY29yZDsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgZmFpbGVkIC0gbm8gbW9yZSBmcmVlIHNsb3RzISIsIF9fZnVuY19fKTsKLSAgLyogUmVhcmx5IHRoZSBvcHRpbWlzdCBpcyB0b28gb3B0aW1pc3RpYywgYW5kIGNsZWFudXAgaXMgbmVlZGVkLi4uKi8KLSAgb3NpX2ZyZWUocmVjb3JkKTsKLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGZyZWVfc2RwX3Nsb3QoaW50IGlkKSB7Ci0gIGludCBoYW5kbGUgPSAtMTsKLSAgYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIHJlY29yZCA9IE5VTEw7Ci0gIGlmIChpZCA8IDAgfHwgaWQgPj0gTUFYX1NEUF9TTE9UUykgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1MDI1MTMiKTsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcygpIGZhaWxlZCAtIGlkICVkIGlzIGludmFsaWQiLCBfX2Z1bmNfXywgaWQpOwotICAgIHJldHVybiBoYW5kbGU7Ci0gIH0KLQotICB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzZHBfbG9jayk7Ci0gICAgaGFuZGxlID0gc2RwX3Nsb3RzW2lkXS5zZHBfaGFuZGxlOwotICAgIHNkcF9zbG90c1tpZF0uc2RwX2hhbmRsZSA9IDA7Ci0gICAgaWYgKHNkcF9zbG90c1tpZF0uc3RhdGUgIT0gU0RQX1JFQ09SRF9GUkVFKSB7Ci0gICAgICAvKiBzYWZlIGEgY29weSBvZiB0aGUgcG9pbnRlciwgYW5kIGZyZWUgYWZ0ZXIgdW5sb2NrKCkgKi8KLSAgICAgIHJlY29yZCA9IHNkcF9zbG90c1tpZF0ucmVjb3JkX2RhdGE7Ci0gICAgfQotICAgIHNkcF9zbG90c1tpZF0uc3RhdGUgPSBTRFBfUkVDT1JEX0ZSRUU7Ci0gIH0KLQotICBpZiAocmVjb3JkICE9IE5VTEwpIHsKLSAgICBvc2lfZnJlZShyZWNvcmQpOwotICB9IGVsc2UgewotICAgIC8vIFJlY29yZCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZAotICAgIGhhbmRsZSA9IC0xOwotICB9Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLS8qKioKLSAqIFVzZSB0aGlzIHRvIGdldCBhIHJlZmVyZW5jZSB0byBhIFNEUCBzbG90IEFORCBjaGFuZ2UgdGhlIHN0YXRlIHRvCi0gKiBTRFBfUkVDT1JEX0NSRUFURV9JTklUSUFURUQuCi0gKi8KLXN0YXRpYyBjb25zdCBzZHBfc2xvdF90KiBzdGFydF9jcmVhdGVfc2RwKGludCBpZCkgewotICBpZiAoaWQgPj0gTUFYX1NEUF9TTE9UUykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgZmFpbGVkIC0gaWQgJWQgaXMgaW52YWxpZCIsIF9fZnVuY19fLCBpZCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHNkcF9sb2NrKTsKLSAgaWYgKHNkcF9zbG90c1tpZF0uc3RhdGUgIT0gU0RQX1JFQ09SRF9BTExPQ0VEKSB7Ci0gICAgLyogVGhlIHJlY29yZCBoYXZlIGJlZW4gcmVtb3ZlZCBiZWZvcmUgdGhpcyBldmVudCBvY2N1cnJlZCAtIGUuZy4gZGVpbml0ICovCi0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgIiVzKCkgZmFpbGVkIC0gc3RhdGUgZm9yIGlkICVkIGlzICIKLSAgICAgICAgInNkcF9zbG90c1tpZF0uc3RhdGUgPSAlZCBleHBlY3RlZCAlZCIsCi0gICAgICAgIF9fZnVuY19fLCBpZCwgc2RwX3Nsb3RzW2lkXS5zdGF0ZSwgU0RQX1JFQ09SRF9BTExPQ0VEKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiAmKHNkcF9zbG90c1tpZF0pOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfc2RwX2hhbmRsZShpbnQgaWQsIGludCBoYW5kbGUpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzZHBfbG9jayk7Ci0gIHNkcF9zbG90c1tpZF0uc2RwX2hhbmRsZSA9IGhhbmRsZTsKLX0KLQotYnRfc3RhdHVzX3QgY3JlYXRlX3NkcF9yZWNvcmQoYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVjb3JkX2hhbmRsZSkgewotICBpbnQgaGFuZGxlOwotCi0gIGhhbmRsZSA9IGFsbG9jX3NkcF9zbG90KHJlY29yZCk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzKCkgaGFuZGxlID0gMHglMDh4IiwgX19mdW5jX18sIGhhbmRsZSk7Ci0KLSAgaWYgKGhhbmRsZSA8IDApIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBCVEFfU2RwQ3JlYXRlUmVjb3JkQnlVc2VyKElOVF9UT19QVFIoaGFuZGxlKSk7Ci0KLSAgKnJlY29yZF9oYW5kbGUgPSBoYW5kbGU7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCByZW1vdmVfc2RwX3JlY29yZChpbnQgcmVjb3JkX2lkKSB7Ci0gIGludCBoYW5kbGU7Ci0KLSAgYmx1ZXRvb3RoX3NkcF9yZWNvcmQqIHJlY29yZDsKLSAgYmx1ZXRvb3RoX3NkcF90eXBlcyBzZHBfdHlwZSA9IFNEUF9UWVBFX1JBVzsKLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2RwX2xvY2spOwotICAgIHJlY29yZCA9IHNkcF9zbG90c1tyZWNvcmRfaWRdLnJlY29yZF9kYXRhOwotICAgIGlmIChyZWNvcmQgIT0gTlVMTCkgewotICAgICAgc2RwX3R5cGUgPSByZWNvcmQtPmhkci50eXBlOwotICAgIH0KLSAgfQotICB0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCA9IC0xOwotICBzd2l0Y2ggKHNkcF90eXBlKSB7Ci0gICAgY2FzZSBTRFBfVFlQRV9NQVBfTUFTOgotICAgICAgc2VydmljZV9pZCA9IEJUQV9NQVBfU0VSVklDRV9JRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0RQX1RZUEVfTUFQX01OUzoKLSAgICAgIHNlcnZpY2VfaWQgPSBCVEFfTU5fU0VSVklDRV9JRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0RQX1RZUEVfUEJBUF9QU0U6Ci0gICAgICBzZXJ2aWNlX2lkID0gQlRBX1BCQVBfU0VSVklDRV9JRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0RQX1RZUEVfUEJBUF9QQ0U6Ci0gICAgICBzZXJ2aWNlX2lkID0gQlRBX1BDRV9TRVJWSUNFX0lEOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIG90aGVyIGVudW1lcmF0aW9uIHZhbHVlcyB3ZXJlIG5vdCBlbmFibGVkIGluIHtAbGluayBvbl9jcmVhdGVfcmVjb3JkX2V2ZW50fSAqLwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHNlcnZpY2VfaWQgPiAwKSB7Ci0gICAgLy8ge0BsaW5rIGJ0aWZfZGlzYWJsZV9zZXJ2aWNlfSBzZXRzIHRoZSBtYXNrIHtAbGluayBidGlmX2VuYWJsZWRfc2VydmljZXN9LgotICAgIGJ0aWZfZGlzYWJsZV9zZXJ2aWNlKHNlcnZpY2VfaWQpOwotICB9Ci0KLSAgLyogR2V0IHRoZSBSZWNvcmQgaGFuZGxlLCBhbmQgZnJlZSB0aGUgc2xvdCAqLwotICBoYW5kbGUgPSBmcmVlX3NkcF9zbG90KHJlY29yZF9pZCk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIlNkcCBTZXJ2ZXIgJXMgaWQ9JWQgdG8gaGFuZGxlPTB4JTA4eCIsIF9fZnVuY19fLCByZWNvcmRfaWQsCi0gICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKLQotICAvKiBQYXNzIHRoZSBhY3R1YWwgcmVjb3JkIGhhbmRsZSAqLwotICBpZiAoaGFuZGxlID4gMCkgewotICAgIEJUQV9TZHBSZW1vdmVSZWNvcmRCeVVzZXIoSU5UX1RPX1BUUihoYW5kbGUpKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiU2RwIFNlcnZlciAlcyAtIHJlY29yZCBhbHJlYWR5IHJlbW92ZWQgLSBvciBuZXZlciBjcmVhdGVkIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ0FMTEJBQ0sgRlVOQ1RJT05TCi0gKiBDYWxsZWQgaW4gQlRBIGNvbnRleHQgdG8gY3JlYXRlL3JlbW92ZSBTRFAgcmVjb3Jkcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgb25fY3JlYXRlX3JlY29yZF9ldmVudChpbnQgaWQpIHsKLSAgLyoKLSAgICogMSkgRmV0Y2ggdGhlIHJlY29yZCBwb2ludGVyLCBhbmQgY2hhbmdlIGl0cyBzdGF0ZT8KLSAgICogMikgc3dpdGNoIG9uIHRoZSB0eXBlIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCByZWNvcmQKLSAgICogMykgVXBkYXRlIHN0YXRlIG9uIGNvbXBsZXRpb24KLSAgICogNCkgV2hhdCB0byBkbyBhdCBmYWlsPwotICAgKiAqLwotICBCVElGX1RSQUNFX0RFQlVHKCJTZHAgU2VydmVyICVzIiwgX19mdW5jX18pOwotICBjb25zdCBzZHBfc2xvdF90KiBzZHBfc2xvdCA9IHN0YXJ0X2NyZWF0ZV9zZHAoaWQpOwotICB0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCA9IC0xOwotICAvKiBJbiB0aGUgY2FzZSB3ZSBhcmUgc2h1dHRpbmcgZG93biwgc2RwX3Nsb3QgaXMgTlVMTCAqLwotICBpZiAoc2RwX3Nsb3QgIT0gTlVMTCkgewotICAgIGJsdWV0b290aF9zZHBfcmVjb3JkKiByZWNvcmQgPSBzZHBfc2xvdC0+cmVjb3JkX2RhdGE7Ci0gICAgaW50IGhhbmRsZSA9IC0xOwotICAgIHN3aXRjaCAocmVjb3JkLT5oZHIudHlwZSkgewotICAgICAgY2FzZSBTRFBfVFlQRV9NQVBfTUFTOgotICAgICAgICBoYW5kbGUgPSBhZGRfbWFwc19zZHAoJnJlY29yZC0+bWFzKTsKLSAgICAgICAgc2VydmljZV9pZCA9IEJUQV9NQVBfU0VSVklDRV9JRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNEUF9UWVBFX01BUF9NTlM6Ci0gICAgICAgIGhhbmRsZSA9IGFkZF9tYXBjX3NkcCgmcmVjb3JkLT5tbnMpOwotICAgICAgICBzZXJ2aWNlX2lkID0gQlRBX01OX1NFUlZJQ0VfSUQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRFBfVFlQRV9QQkFQX1BTRToKLSAgICAgICAgaGFuZGxlID0gYWRkX3BiYXBzX3NkcCgmcmVjb3JkLT5wc2UpOwotICAgICAgICBzZXJ2aWNlX2lkID0gQlRBX1BCQVBfU0VSVklDRV9JRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNEUF9UWVBFX09QUF9TRVJWRVI6Ci0gICAgICAgIGhhbmRsZSA9IGFkZF9vcHBzX3NkcCgmcmVjb3JkLT5vcHMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0RQX1RZUEVfU0FQX1NFUlZFUjoKLSAgICAgICAgaGFuZGxlID0gYWRkX3NhcHNfc2RwKCZyZWNvcmQtPnNhcCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTRFBfVFlQRV9QQkFQX1BDRToKLSAgICAgICAgaGFuZGxlID0gYWRkX3BiYXBjX3NkcCgmcmVjb3JkLT5wY2UpOwotICAgICAgICBzZXJ2aWNlX2lkID0gQlRBX1BDRV9TRVJWSUNFX0lEOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIlJlY29yZCB0eXBlICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCByZWNvcmQtPmhkci50eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChoYW5kbGUgIT0gLTEpIHsKLSAgICAgIHNldF9zZHBfaGFuZGxlKGlkLCBoYW5kbGUpOwotICAgICAgaWYgKHNlcnZpY2VfaWQgPiAwKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGxpbmsgYnRpZl9lbmFibGVfc2VydmljZX0gY2FsbHMge0BsaW5rIGJ0aWZfZG1fZW5hYmxlX3NlcnZpY2V9LCB3aGljaCBjYWxscyB7QGxpbmsKLSAgICAgICAgICogYnRpZl9pbl9leGVjdXRlX3NlcnZpY2VfcmVxdWVzdH0uCi0gICAgICAgICAqICAgICAtIHtAbGluayBidGlmX2VuYWJsZV9zZXJ2aWNlfSBzZXRzIHRoZSBtYXNrIHtAbGluayBidGlmX2VuYWJsZWRfc2VydmljZXN9LgotICAgICAgICAgKiAgICAgLSB7QGxpbmsgYnRpZl9kbV9lbmFibGVfc2VydmljZX0gaW52b2tlcyB0aGUgamF2YSBjYWxsYmFjayB0byByZXR1cm4gdXVpZHMgYmFzZWQKLSAgICAgICAgICogICAgICAgb24gdGhlIGVuYWJsZWQgc2VydmljZXMgbWFzay4KLSAgICAgICAgICogICAgIC0ge0BsaW5rIGJ0aWZfaW5fZXhlY3V0ZV9zZXJ2aWNlX3JlcXVlc3R9IGdhdGVzIHRoZSBqYXZhIGNhbGxiYWNrIGluIHtAbGluawotICAgICAgICAgKiAgICAgICBidGlmX2RtX2VuYWJsZV9zZXJ2aWNlfS4KLSAgICAgICAgICovCi0gICAgICAgIGJ0aWZfZW5hYmxlX3NlcnZpY2Uoc2VydmljZV9pZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgb25fcmVtb3ZlX3JlY29yZF9ldmVudChpbnQgaGFuZGxlKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIlNkcCBTZXJ2ZXIgJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLy8gVXNlciBkYXRhIGNhcnJpZXMgdGhlIGFjdHVhbCBTRFAgaGFuZGxlLCBub3QgdGhlIElELgotICBpZiAoaGFuZGxlICE9IC0xICYmIGhhbmRsZSAhPSAwKSB7Ci0gICAgYm9vbCByZXN1bHQ7Ci0gICAgcmVzdWx0ID0gU0RQX0RlbGV0ZVJlY29yZChoYW5kbGUpOwotICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIgIFVuYWJsZSB0byByZW1vdmUgaGFuZGxlIDB4JTA4eCIsIGhhbmRsZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqCi0gKiBCZWxvdyB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBhY2Nlc3NpbmcgQlRBIGNvbnRleHQgZGF0YSAtIGhlbmNlIG9ubHkgY2FsbCBmcm9tCi0gKiBCVEEgY29udGV4dCEKLSAqLwotCi0vKiBDcmVhdGUgYSBNQVAgTUFTIFNEUCByZWNvcmQgYmFzZWQgb24gaW5mb3JtYXRpb24gc3RvcmVkIGluIGEKLSAqIGJsdWV0b290aF9zZHBfbWFzX3JlY29yZCAqLwotc3RhdGljIGludCBhZGRfbWFwc19zZHAoY29uc3QgYmx1ZXRvb3RoX3NkcF9tYXNfcmVjb3JkKiByZWMpIHsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHByb3RvTGlzdFszXTsKLSAgdWludDE2X3Qgc2VydmljZSA9IFVVSURfU0VSVkNMQVNTX01FU1NBR0VfQUNDRVNTOwotICB1aW50MTZfdCBicm93c2UgPSBVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQOwotICBib29sIHN0YXR1cyA9IHRydWU7Ci0gIHVpbnQzMl90IHNkcF9oYW5kbGUgPSAwOwotICB1aW50OF90IHRlbXBbNF07Ci0gIHVpbnQ4X3QqIHBfdGVtcCA9IHRlbXA7Ci0KLSAgc2RwX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgaWYgKHNkcF9oYW5kbGUgPT0gMCkgewotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHJlZ2lzdGVyIE1BUFMgU2VydmljZSIpOwotICAgIHJldHVybiBzZHBfaGFuZGxlOwotICB9Ci0KLSAgLyogYWRkIHNlcnZpY2UgY2xhc3MgKi8KLSAgc3RhdHVzICY9IFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3Qoc2RwX2hhbmRsZSwgMSwgJnNlcnZpY2UpOwotICBtZW1zZXQocHJvdG9MaXN0LCAwLCAzICogc2l6ZW9mKHRTRFBfUFJPVE9DT0xfRUxFTSkpOwotCi0gIC8qIGFkZCBwcm90b2NvbCBsaXN0LCBpbmNsdWRpbmcgUkZDT01NIHNjbiAqLwotICBwcm90b0xpc3RbMF0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfTDJDQVA7Ci0gIHByb3RvTGlzdFswXS5udW1fcGFyYW1zID0gMDsKLSAgcHJvdG9MaXN0WzFdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX1JGQ09NTTsKLSAgcHJvdG9MaXN0WzFdLm51bV9wYXJhbXMgPSAxOwotICBwcm90b0xpc3RbMV0ucGFyYW1zWzBdID0gcmVjLT5oZHIucmZjb21tX2NoYW5uZWxfbnVtYmVyOwotICBwcm90b0xpc3RbMl0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfT0JFWDsKLSAgcHJvdG9MaXN0WzJdLm51bV9wYXJhbXMgPSAwOwotICBzdGF0dXMgJj0gU0RQX0FkZFByb3RvY29sTGlzdChzZHBfaGFuZGxlLCAzLCBwcm90b0xpc3QpOwotCi0gIC8qIEFkZCBhIG5hbWUgZW50cnkgKi8KLSAgc3RhdHVzICY9IFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgKHVpbnQxNl90KUFUVFJfSURfU0VSVklDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdClURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkocmVjLT5oZHIuc2VydmljZV9uYW1lX2xlbmd0aCArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopcmVjLT5oZHIuc2VydmljZV9uYW1lKTsKLQotICAvKiBBZGQgaW4gdGhlIEJsdWV0b290aCBQcm9maWxlIERlc2NyaXB0b3IgTGlzdCAqLwotICBzdGF0dXMgJj0gU0RQX0FkZFByb2ZpbGVEZXNjcmlwdG9yTGlzdChzZHBfaGFuZGxlLCBVVUlEX1NFUlZDTEFTU19NQVBfUFJPRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLT5oZHIucHJvZmlsZV92ZXJzaW9uKTsKLQotICAvKiBBZGQgTUFTIGluc3RhbmNlIElEICovCi0gIHN0YXR1cyAmPQotICAgICAgU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX01BU19JTlNUQU5DRV9JRCwgVUlOVF9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkxLCAodWludDhfdCopJnJlYy0+bWFzX2luc3RhbmNlX2lkKTsKLQotICAvKiBBZGQgc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZXMgKi8KLSAgc3RhdHVzICY9Ci0gICAgICBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfU1VQUE9SVEVEX01TR19UWVBFLCBVSU5UX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KTEsICh1aW50OF90KikmcmVjLT5zdXBwb3J0ZWRfbWVzc2FnZV90eXBlcyk7Ci0KLSAgLyogQWRkIHN1cHBvcnRlZCBmZWF0dXJlICovCi0gIFVJTlQzMl9UT19CRV9TVFJFQU0ocF90ZW1wLCByZWMtPnN1cHBvcnRlZF9mZWF0dXJlcyk7Ci0gIHN0YXR1cyAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfTUFQX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsICh1aW50MzJfdCk0LCB0ZW1wKTsKLQotICAvKiBBZGQgdGhlIEwyQ0FQIFBTTSBpZiBwcmVzZW50ICovCi0gIGlmIChyZWMtPmhkci5sMmNhcF9wc20gIT0gLTEpIHsKLSAgICBwX3RlbXAgPSB0ZW1wOyAgLy8gVGhlIG1hY3JvIG1vZGlmaWVzIHBfdGVtcCwgaGVuY2UgcmV3aW5kLgotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF90ZW1wLCByZWMtPmhkci5sMmNhcF9wc20pOwotICAgIHN0YXR1cyAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfR09FUF9MMkNBUF9QU00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsICh1aW50MzJfdCkyLCB0ZW1wKTsKLSAgfQotCi0gIC8qIE1ha2UgdGhlIHNlcnZpY2UgYnJvd3NlYWJsZSAqLwotICBzdGF0dXMgJj0KLSAgICAgIFNEUF9BZGRVdWlkU2VxdWVuY2Uoc2RwX2hhbmRsZSwgQVRUUl9JRF9CUk9XU0VfR1JPVVBfTElTVCwgMSwgJmJyb3dzZSk7Ci0KLSAgaWYgKCFzdGF0dXMpIHsKLSAgICBTRFBfRGVsZXRlUmVjb3JkKHNkcF9oYW5kbGUpOwotICAgIHNkcF9oYW5kbGUgPSAwOwotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzKCkgRkFJTEVEIiwgX19mdW5jX18pOwotICB9IGVsc2UgewotICAgIGJ0YV9zeXNfYWRkX3V1aWQoc2VydmljZSk7IC8qIFVVSURfU0VSVkNMQVNTX01FU1NBR0VfQUNDRVNTICovCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMoKTogIFNEUCBSZWdpc3RlcmVkIChoYW5kbGUgMHglMDh4KSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgc2RwX2hhbmRsZSk7Ci0gIH0KLSAgcmV0dXJuIHNkcF9oYW5kbGU7Ci19Ci0KLS8qIENyZWF0ZSBhIE1BUCBNTlMgU0RQIHJlY29yZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYQotICogYmx1ZXRvb3RoX3NkcF9tbnNfcmVjb3JkICovCi1zdGF0aWMgaW50IGFkZF9tYXBjX3NkcChjb25zdCBibHVldG9vdGhfc2RwX21uc19yZWNvcmQqIHJlYykgewotICB0U0RQX1BST1RPQ09MX0VMRU0gcHJvdG9MaXN0WzNdOwotICB1aW50MTZfdCBzZXJ2aWNlID0gVVVJRF9TRVJWQ0xBU1NfTUVTU0FHRV9OT1RJRklDQVRJT047Ci0gIHVpbnQxNl90IGJyb3dzZSA9IFVVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVA7Ci0gIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgdWludDMyX3Qgc2RwX2hhbmRsZSA9IDA7Ci0gIHVpbnQ4X3QgdGVtcFs0XTsKLSAgdWludDhfdCogcF90ZW1wID0gdGVtcDsKLQotICBzZHBfaGFuZGxlID0gU0RQX0NyZWF0ZVJlY29yZCgpOwotICBpZiAoc2RwX2hhbmRsZSA9PSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmVnaXN0ZXIgTUFQIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIik7Ci0gICAgcmV0dXJuIHNkcF9oYW5kbGU7Ci0gIH0KLQotICAvKiBhZGQgc2VydmljZSBjbGFzcyAqLwotICBzdGF0dXMgJj0gU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChzZHBfaGFuZGxlLCAxLCAmc2VydmljZSk7Ci0gIG1lbXNldChwcm90b0xpc3QsIDAsIDMgKiBzaXplb2YodFNEUF9QUk9UT0NPTF9FTEVNKSk7Ci0KLSAgLyogYWRkIHByb3RvY29sIGxpc3QsIGluY2x1ZGluZyBSRkNPTU0gc2NuICovCi0gIHByb3RvTGlzdFswXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9MMkNBUDsKLSAgcHJvdG9MaXN0WzBdLm51bV9wYXJhbXMgPSAwOwotICBwcm90b0xpc3RbMV0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfUkZDT01NOwotICBwcm90b0xpc3RbMV0ubnVtX3BhcmFtcyA9IDE7Ci0gIHByb3RvTGlzdFsxXS5wYXJhbXNbMF0gPSByZWMtPmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXI7Ci0gIHByb3RvTGlzdFsyXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9PQkVYOwotICBwcm90b0xpc3RbMl0ubnVtX3BhcmFtcyA9IDA7Ci0gIHN0YXR1cyAmPSBTRFBfQWRkUHJvdG9jb2xMaXN0KHNkcF9oYW5kbGUsIDMsIHByb3RvTGlzdCk7Ci0KLSAgLyogQWRkIGEgbmFtZSBlbnRyeSAqLwotICBzdGF0dXMgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCAodWludDE2X3QpQVRUUl9JRF9TRVJWSUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KVRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShyZWMtPmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilyZWMtPmhkci5zZXJ2aWNlX25hbWUpOwotCi0gIC8qIEFkZCBpbiB0aGUgQmx1ZXRvb3RoIFByb2ZpbGUgRGVzY3JpcHRvciBMaXN0ICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkUHJvZmlsZURlc2NyaXB0b3JMaXN0KHNkcF9oYW5kbGUsIFVVSURfU0VSVkNMQVNTX01BUF9QUk9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWMtPmhkci5wcm9maWxlX3ZlcnNpb24pOwotCi0gIC8qIEFkZCBzdXBwb3J0ZWQgZmVhdHVyZSAqLwotICBVSU5UMzJfVE9fQkVfU1RSRUFNKHBfdGVtcCwgcmVjLT5zdXBwb3J0ZWRfZmVhdHVyZXMpOwotICBzdGF0dXMgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX01BUF9TVVBQT1JURURfRkVBVFVSRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfREVTQ19UWVBFLCAodWludDMyX3QpNCwgdGVtcCk7Ci0KLSAgLyogQWRkIHRoZSBMMkNBUCBQU00gaWYgcHJlc2VudCAqLwotICBpZiAocmVjLT5oZHIubDJjYXBfcHNtICE9IC0xKSB7Ci0gICAgcF90ZW1wID0gdGVtcDsgIC8vIFRoZSBtYWNybyBtb2RpZmllcyBwX3RlbXAsIGhlbmNlIHJld2luZC4KLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfdGVtcCwgcmVjLT5oZHIubDJjYXBfcHNtKTsKLSAgICBzdGF0dXMgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX0dPRVBfTDJDQVBfUFNNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfREVTQ19UWVBFLCAodWludDMyX3QpMiwgdGVtcCk7Ci0gIH0KLQotICAvKiBNYWtlIHRoZSBzZXJ2aWNlIGJyb3dzZWFibGUgKi8KLSAgc3RhdHVzICY9Ci0gICAgICBTRFBfQWRkVXVpZFNlcXVlbmNlKHNkcF9oYW5kbGUsIEFUVFJfSURfQlJPV1NFX0dST1VQX0xJU1QsIDEsICZicm93c2UpOwotCi0gIGlmICghc3RhdHVzKSB7Ci0gICAgU0RQX0RlbGV0ZVJlY29yZChzZHBfaGFuZGxlKTsKLSAgICBzZHBfaGFuZGxlID0gMDsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcygpIEZBSUxFRCIsIF9fZnVuY19fKTsKLSAgfSBlbHNlIHsKLSAgICBidGFfc3lzX2FkZF91dWlkKHNlcnZpY2UpOyAvKiBVVUlEX1NFUlZDTEFTU19NRVNTQUdFX0FDQ0VTUyAqLwotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzKCk6ICBTRFAgUmVnaXN0ZXJlZCAoaGFuZGxlIDB4JTA4eCkiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGUpOwotICB9Ci0gIHJldHVybiBzZHBfaGFuZGxlOwotfQotCi0vKiBDcmVhdGUgYSBQQkFQIENsaWVudCBTRFAgcmVjb3JkIGJhc2VkIG9uIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhCi0gKiBibHVldG9vdGhfc2RwX3BjZV9yZWNvcmQgKi8KLXN0YXRpYyBpbnQgYWRkX3BiYXBjX3NkcChjb25zdCBibHVldG9vdGhfc2RwX3BjZV9yZWNvcmQqIHJlYykgewotICB1aW50MTZfdCBzZXJ2aWNlID0gVVVJRF9TRVJWQ0xBU1NfUEJBUF9QQ0U7Ci0gIHVpbnQxNl90IGJyb3dzZSA9IFVVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVA7Ci0gIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgdWludDMyX3Qgc2RwX2hhbmRsZSA9IDA7Ci0KLSAgc2RwX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgaWYgKHNkcF9oYW5kbGUgPT0gMCkgewotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHJlZ2lzdGVyIFBCQVAgQ2xpZW50IFNlcnZpY2UiKTsKLSAgICByZXR1cm4gc2RwX2hhbmRsZTsKLSAgfQotCi0gIHN0YXR1cyAmPSBTRFBfQWRkU2VydmljZUNsYXNzSWRMaXN0KHNkcF9oYW5kbGUsIDEsICZzZXJ2aWNlKTsKLQotICAvKiBBZGQgYSBuYW1lIGVudHJ5ICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsICh1aW50MTZfdClBVFRSX0lEX1NFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHJlYy0+aGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXJlYy0+aGRyLnNlcnZpY2VfbmFtZSk7Ci0KLSAgLyogQWRkIGluIHRoZSBCbHVldG9vdGggUHJvZmlsZSBEZXNjcmlwdG9yIExpc3QgKi8KLSAgc3RhdHVzICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoCi0gICAgICBzZHBfaGFuZGxlLCBVVUlEX1NFUlZDTEFTU19QSE9ORV9BQ0NFU1MsIHJlYy0+aGRyLnByb2ZpbGVfdmVyc2lvbik7Ci0KLSAgLyogTWFrZSB0aGUgc2VydmljZSBicm93c2VhYmxlICovCi0gIHN0YXR1cyAmPQotICAgICAgU0RQX0FkZFV1aWRTZXF1ZW5jZShzZHBfaGFuZGxlLCBBVFRSX0lEX0JST1dTRV9HUk9VUF9MSVNULCAxLCAmYnJvd3NlKTsKLQotICBpZiAoIXN0YXR1cykgewotICAgIFNEUF9EZWxldGVSZWNvcmQoc2RwX2hhbmRsZSk7Ci0gICAgc2RwX2hhbmRsZSA9IDA7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXMoKSBGQUlMRUQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIHNkcF9oYW5kbGU7Ci0gIH0KLSAgYnRhX3N5c19hZGRfdXVpZChzZXJ2aWNlKTsgLyogVVVJRF9TRVJWQ0xBU1NfUEJBUF9QQ0UgKi8KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMoKTogIFNEUCBSZWdpc3RlcmVkIChoYW5kbGUgMHglMDh4KSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGUpOwotICByZXR1cm4gc2RwX2hhbmRsZTsKLX0KLQotLyogQ3JlYXRlIGEgUEJBUCBTZXJ2ZXIgU0RQIHJlY29yZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gYQotICogYmx1ZXRvb3RoX3NkcF9wc2VfcmVjb3JkICovCi1zdGF0aWMgaW50IGFkZF9wYmFwc19zZHAoY29uc3QgYmx1ZXRvb3RoX3NkcF9wc2VfcmVjb3JkKiByZWMpIHsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHByb3RvTGlzdFszXTsKLSAgdWludDE2X3Qgc2VydmljZSA9IFVVSURfU0VSVkNMQVNTX1BCQVBfUFNFOwotICB1aW50MTZfdCBicm93c2UgPSBVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQOwotICBib29sIHN0YXR1cyA9IHRydWU7Ci0gIHVpbnQzMl90IHNkcF9oYW5kbGUgPSAwOwotICB1aW50OF90IHRlbXBbNF07Ci0gIHVpbnQ4X3QqIHBfdGVtcCA9IHRlbXA7Ci0KLSAgc2RwX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgaWYgKHNkcF9oYW5kbGUgPT0gMCkgewotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHJlZ2lzdGVyIFBCQVAgU2VydmVyIFNlcnZpY2UiKTsKLSAgICByZXR1cm4gc2RwX2hhbmRsZTsKLSAgfQotCi0gIC8qIGFkZCBzZXJ2aWNlIGNsYXNzICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkU2VydmljZUNsYXNzSWRMaXN0KHNkcF9oYW5kbGUsIDEsICZzZXJ2aWNlKTsKLSAgbWVtc2V0KHByb3RvTGlzdCwgMCwgMyAqIHNpemVvZih0U0RQX1BST1RPQ09MX0VMRU0pKTsKLQotICAvKiBhZGQgcHJvdG9jb2wgbGlzdCwgaW5jbHVkaW5nIFJGQ09NTSBzY24gKi8KLSAgcHJvdG9MaXN0WzBdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0wyQ0FQOwotICBwcm90b0xpc3RbMF0ubnVtX3BhcmFtcyA9IDA7Ci0gIHByb3RvTGlzdFsxXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9SRkNPTU07Ci0gIHByb3RvTGlzdFsxXS5udW1fcGFyYW1zID0gMTsKLSAgcHJvdG9MaXN0WzFdLnBhcmFtc1swXSA9IHJlYy0+aGRyLnJmY29tbV9jaGFubmVsX251bWJlcjsKLSAgcHJvdG9MaXN0WzJdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX09CRVg7Ci0gIHByb3RvTGlzdFsyXS5udW1fcGFyYW1zID0gMDsKLSAgc3RhdHVzICY9IFNEUF9BZGRQcm90b2NvbExpc3Qoc2RwX2hhbmRsZSwgMywgcHJvdG9MaXN0KTsKLQotICAvKiBBZGQgYSBuYW1lIGVudHJ5ICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsICh1aW50MTZfdClBVFRSX0lEX1NFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHJlYy0+aGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXJlYy0+aGRyLnNlcnZpY2VfbmFtZSk7Ci0KLSAgLyogQWRkIGluIHRoZSBCbHVldG9vdGggUHJvZmlsZSBEZXNjcmlwdG9yIExpc3QgKi8KLSAgc3RhdHVzICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoCi0gICAgICBzZHBfaGFuZGxlLCBVVUlEX1NFUlZDTEFTU19QSE9ORV9BQ0NFU1MsIHJlYy0+aGRyLnByb2ZpbGVfdmVyc2lvbik7Ci0KLSAgLyogQWRkIHN1cHBvcnRlZCByZXBvc2l0b3JpZXMgMSBieXRlICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfU1VQUE9SVEVEX1JFUE9TSVRPUklFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsICh1aW50MzJfdCkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopJnJlYy0+c3VwcG9ydGVkX3JlcG9zaXRvcmllcyk7Ci0KLSAgLyogQWRkIHN1cHBvcnRlZCBmZWF0dXJlIDQgYnl0ZXMqLwotICBVSU5UMzJfVE9fQkVfU1RSRUFNKHBfdGVtcCwgcmVjLT5zdXBwb3J0ZWRfZmVhdHVyZXMpOwotICBzdGF0dXMgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX1BCQVBfU1VQUE9SVEVEX0ZFQVRVUkVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgKHVpbnQzMl90KTQsIHRlbXApOwotCi0gIC8qIEFkZCB0aGUgTDJDQVAgUFNNIGlmIHByZXNlbnQgKi8KLSAgaWYgKHJlYy0+aGRyLmwyY2FwX3BzbSAhPSAtMSkgewotICAgIHBfdGVtcCA9IHRlbXA7ICAvLyBUaGUgbWFjcm8gbW9kaWZpZXMgcF90ZW1wLCBoZW5jZSByZXdpbmQuCi0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3RlbXAsIHJlYy0+aGRyLmwyY2FwX3BzbSk7Ci0gICAgc3RhdHVzICY9IFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9HT0VQX0wyQ0FQX1BTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgKHVpbnQzMl90KTIsIHRlbXApOwotICB9Ci0KLSAgLyogTWFrZSB0aGUgc2VydmljZSBicm93c2VhYmxlICovCi0gIHN0YXR1cyAmPQotICAgICAgU0RQX0FkZFV1aWRTZXF1ZW5jZShzZHBfaGFuZGxlLCBBVFRSX0lEX0JST1dTRV9HUk9VUF9MSVNULCAxLCAmYnJvd3NlKTsKLQotICBpZiAoIXN0YXR1cykgewotICAgIFNEUF9EZWxldGVSZWNvcmQoc2RwX2hhbmRsZSk7Ci0gICAgc2RwX2hhbmRsZSA9IDA7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXMoKSBGQUlMRUQiLCBfX2Z1bmNfXyk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRhX3N5c19hZGRfdXVpZChzZXJ2aWNlKTsgLyogVVVJRF9TRVJWQ0xBU1NfTUVTU0FHRV9BQ0NFU1MgKi8KLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcygpOiAgU0RQIFJlZ2lzdGVyZWQgKGhhbmRsZSAweCUwOHgpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBzZHBfaGFuZGxlKTsKLSAgfQotICByZXR1cm4gc2RwX2hhbmRsZTsKLX0KLQotLyogQ3JlYXRlIGEgT1BQIFNlcnZlciBTRFAgcmVjb3JkIGJhc2VkIG9uIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhCi0gKiBibHVldG9vdGhfc2RwX29wc19yZWNvcmQgKi8KLXN0YXRpYyBpbnQgYWRkX29wcHNfc2RwKGNvbnN0IGJsdWV0b290aF9zZHBfb3BzX3JlY29yZCogcmVjKSB7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwcm90b0xpc3RbM107Ci0gIHVpbnQxNl90IHNlcnZpY2UgPSBVVUlEX1NFUlZDTEFTU19PQkVYX09CSkVDVF9QVVNIOwotICB1aW50MTZfdCBicm93c2UgPSBVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQOwotICB1aW50OF90IHR5cGVfbGVuW3JlYy0+c3VwcG9ydGVkX2Zvcm1hdHNfbGlzdF9sZW5dOwotICB1aW50OF90IGRlc2NfdHlwZVtyZWMtPnN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuXTsKLSAgdWludDhfdCogdHlwZV92YWx1ZVtyZWMtPnN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuXTsKLSAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICB1aW50MzJfdCBzZHBfaGFuZGxlID0gMDsKLSAgdWludDhfdCB0ZW1wWzRdOwotICB1aW50OF90KiBwX3RlbXAgPSB0ZW1wOwotICB0QlRBX1VUTF9DT0QgY29kOwotICBpbnQgaSwgajsKLQotICBzZHBfaGFuZGxlID0gU0RQX0NyZWF0ZVJlY29yZCgpOwotICBpZiAoc2RwX2hhbmRsZSA9PSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmVnaXN0ZXIgT2JqZWN0IFB1c2ggU2VydmVyIFNlcnZpY2UiKTsKLSAgICByZXR1cm4gc2RwX2hhbmRsZTsKLSAgfQotCi0gIC8qIGFkZCBzZXJ2aWNlIGNsYXNzICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkU2VydmljZUNsYXNzSWRMaXN0KHNkcF9oYW5kbGUsIDEsICZzZXJ2aWNlKTsKLSAgbWVtc2V0KHByb3RvTGlzdCwgMCwgMyAqIHNpemVvZih0U0RQX1BST1RPQ09MX0VMRU0pKTsKLQotICAvKiBhZGQgcHJvdG9jb2wgbGlzdCwgaW5jbHVkaW5nIFJGQ09NTSBzY24gKi8KLSAgcHJvdG9MaXN0WzBdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0wyQ0FQOwotICBwcm90b0xpc3RbMF0ubnVtX3BhcmFtcyA9IDA7Ci0gIHByb3RvTGlzdFsxXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9SRkNPTU07Ci0gIHByb3RvTGlzdFsxXS5udW1fcGFyYW1zID0gMTsKLSAgcHJvdG9MaXN0WzFdLnBhcmFtc1swXSA9IHJlYy0+aGRyLnJmY29tbV9jaGFubmVsX251bWJlcjsKLSAgcHJvdG9MaXN0WzJdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX09CRVg7Ci0gIHByb3RvTGlzdFsyXS5udW1fcGFyYW1zID0gMDsKLSAgc3RhdHVzICY9IFNEUF9BZGRQcm90b2NvbExpc3Qoc2RwX2hhbmRsZSwgMywgcHJvdG9MaXN0KTsKLQotICAvKiBBZGQgYSBuYW1lIGVudHJ5ICovCi0gIHN0YXR1cyAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsICh1aW50MTZfdClBVFRSX0lEX1NFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHJlYy0+aGRyLnNlcnZpY2VfbmFtZV9sZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXJlYy0+aGRyLnNlcnZpY2VfbmFtZSk7Ci0KLSAgLyogQWRkIGluIHRoZSBCbHVldG9vdGggUHJvZmlsZSBEZXNjcmlwdG9yIExpc3QgKi8KLSAgc3RhdHVzICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoCi0gICAgICBzZHBfaGFuZGxlLCBVVUlEX1NFUlZDTEFTU19PQkVYX09CSkVDVF9QVVNILCByZWMtPmhkci5wcm9maWxlX3ZlcnNpb24pOwotCi0gIC8qIGFkZCBzZXF1ZW5jZSBmb3Igc3VwcG9ydGVkIHR5cGVzICovCi0gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcmVjLT5zdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbjsgaSsrKSB7Ci0gICAgdHlwZV92YWx1ZVtqXSA9ICh1aW50OF90KikmcmVjLT5zdXBwb3J0ZWRfZm9ybWF0c19saXN0W2ldOwotICAgIGRlc2NfdHlwZVtqXSA9IFVJTlRfREVTQ19UWVBFOwotICAgIHR5cGVfbGVuW2orK10gPSAxOwotICB9Ci0KLSAgc3RhdHVzICY9Ci0gICAgICBTRFBfQWRkU2VxdWVuY2Uoc2RwX2hhbmRsZSwgKHVpbnQxNl90KUFUVFJfSURfU1VQUE9SVEVEX0ZPUk1BVFNfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAodWludDhfdClyZWMtPnN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuLCBkZXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZV9sZW4sIHR5cGVfdmFsdWUpOwotCi0gIC8qIEFkZCB0aGUgTDJDQVAgUFNNIGlmIHByZXNlbnQgKi8KLSAgaWYgKHJlYy0+aGRyLmwyY2FwX3BzbSAhPSAtMSkgewotICAgIHBfdGVtcCA9IHRlbXA7ICAvLyBUaGUgbWFjcm8gbW9kaWZpZXMgcF90ZW1wLCBoZW5jZSByZXdpbmQuCi0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3RlbXAsIHJlYy0+aGRyLmwyY2FwX3BzbSk7Ci0gICAgc3RhdHVzICY9IFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9HT0VQX0wyQ0FQX1BTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgKHVpbnQzMl90KTIsIHRlbXApOwotICB9Ci0KLSAgLyogTWFrZSB0aGUgc2VydmljZSBicm93c2VhYmxlICovCi0gIHN0YXR1cyAmPQotICAgICAgU0RQX0FkZFV1aWRTZXF1ZW5jZShzZHBfaGFuZGxlLCBBVFRSX0lEX0JST1dTRV9HUk9VUF9MSVNULCAxLCAmYnJvd3NlKTsKLQotICBpZiAoIXN0YXR1cykgewotICAgIFNEUF9EZWxldGVSZWNvcmQoc2RwX2hhbmRsZSk7Ci0gICAgc2RwX2hhbmRsZSA9IDA7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiJXMoKSBGQUlMRUQiLCBfX2Z1bmNfXyk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogc2V0IGNsYXNzIG9mIGRldmljZSAqLwotICAgIGNvZC5zZXJ2aWNlID0gQlRNX0NPRF9TRVJWSUNFX09CSl9UUkFOU0ZFUjsKLSAgICB1dGxfc2V0X2RldmljZV9jbGFzcygmY29kLCBCVEFfVVRMX1NFVF9DT0RfU0VSVklDRV9DTEFTUyk7Ci0KLSAgICBidGFfc3lzX2FkZF91dWlkKHNlcnZpY2UpOyAvKiBVVUlEX1NFUlZDTEFTU19PQkVYX09CSkVDVF9QVVNIICovCi0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMoKTogIFNEUCBSZWdpc3RlcmVkIChoYW5kbGUgMHglMDh4KSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgc2RwX2hhbmRsZSk7Ci0gIH0KLSAgcmV0dXJuIHNkcF9oYW5kbGU7Ci19Ci0KLS8vIENyZWF0ZSBhIFNpbSBBY2Nlc3MgUHJvZmlsZSBTRFAgcmVjb3JkIGJhc2VkIG9uIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhCi0vLyBibHVldG9vdGhfc2RwX3NhcF9yZWNvcmQuCi1zdGF0aWMgaW50IGFkZF9zYXBzX3NkcChjb25zdCBibHVldG9vdGhfc2RwX3NhcF9yZWNvcmQqIHJlYykgewotICB0U0RQX1BST1RPQ09MX0VMRU0gcHJvdG9MaXN0WzJdOwotICB1aW50MTZfdCBzZXJ2aWNlc1syXTsKLSAgdWludDE2X3QgYnJvd3NlID0gVVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUDsKLSAgYm9vbCBzdGF0dXMgPSB0cnVlOwotICB1aW50MzJfdCBzZHBfaGFuZGxlID0gMDsKLQotICBzZHBfaGFuZGxlID0gU0RQX0NyZWF0ZVJlY29yZCgpOwotICBpZiAoc2RwX2hhbmRsZSA9PSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmVnaXN0ZXIgU0FQUyBTZXJ2aWNlIik7Ci0gICAgcmV0dXJuIHNkcF9oYW5kbGU7Ci0gIH0KLQotICBzZXJ2aWNlc1swXSA9IFVVSURfU0VSVkNMQVNTX1NBUDsKLSAgc2VydmljZXNbMV0gPSBVVUlEX1NFUlZDTEFTU19HRU5FUklDX1RFTEVQSE9OWTsKLQotICAvLyBhZGQgc2VydmljZSBjbGFzcwotICBzdGF0dXMgJj0gU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChzZHBfaGFuZGxlLCAyLCBzZXJ2aWNlcyk7Ci0gIG1lbXNldChwcm90b0xpc3QsIDAsIDIgKiBzaXplb2YodFNEUF9QUk9UT0NPTF9FTEVNKSk7Ci0KLSAgLy8gYWRkIHByb3RvY29sIGxpc3QsIGluY2x1ZGluZyBSRkNPTU0gc2NuCi0gIHByb3RvTGlzdFswXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9MMkNBUDsKLSAgcHJvdG9MaXN0WzBdLm51bV9wYXJhbXMgPSAwOwotICBwcm90b0xpc3RbMV0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfUkZDT01NOwotICBwcm90b0xpc3RbMV0ubnVtX3BhcmFtcyA9IDE7Ci0gIHByb3RvTGlzdFsxXS5wYXJhbXNbMF0gPSByZWMtPmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXI7Ci0gIHN0YXR1cyAmPSBTRFBfQWRkUHJvdG9jb2xMaXN0KHNkcF9oYW5kbGUsIDIsIHByb3RvTGlzdCk7Ci0KLSAgLy8gQWRkIGEgbmFtZSBlbnRyeQotICBzdGF0dXMgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCAodWludDE2X3QpQVRUUl9JRF9TRVJWSUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KVRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShyZWMtPmhkci5zZXJ2aWNlX25hbWVfbGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilyZWMtPmhkci5zZXJ2aWNlX25hbWUpOwotCi0gIC8vIEFkZCBpbiB0aGUgQmx1ZXRvb3RoIFByb2ZpbGUgRGVzY3JpcHRvciBMaXN0Ci0gIHN0YXR1cyAmPSBTRFBfQWRkUHJvZmlsZURlc2NyaXB0b3JMaXN0KHNkcF9oYW5kbGUsIFVVSURfU0VSVkNMQVNTX1NBUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLT5oZHIucHJvZmlsZV92ZXJzaW9uKTsKLQotICAvLyBNYWtlIHRoZSBzZXJ2aWNlIGJyb3dzZWFibGUKLSAgc3RhdHVzICY9Ci0gICAgICBTRFBfQWRkVXVpZFNlcXVlbmNlKHNkcF9oYW5kbGUsIEFUVFJfSURfQlJPV1NFX0dST1VQX0xJU1QsIDEsICZicm93c2UpOwotCi0gIGlmICghc3RhdHVzKSB7Ci0gICAgU0RQX0RlbGV0ZVJlY29yZChzZHBfaGFuZGxlKTsKLSAgICBzZHBfaGFuZGxlID0gMDsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcygpOiBGQUlMRUQgZGVsZXRpbmcgcmVjb3JkIiwgX19mdW5jX18pOwotICB9IGVsc2UgewotICAgIGJ0YV9zeXNfYWRkX3V1aWQoVVVJRF9TRVJWQ0xBU1NfU0FQKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcygpOiBTRFAgUmVnaXN0ZXJlZCAoaGFuZGxlIDB4JTA4eCkiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGUpOwotICB9Ci0gIHJldHVybiBzZHBfaGFuZGxlOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9zb2NrLmNjIGIvYnRpZi9zcmMvYnRpZl9zb2NrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM1NDEwLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfc29jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9zb2NrIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3NvY2suaD4KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZl9tZXRyaWNzX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJidGlmX3NvY2tfbDJjYXAuaCIKLSNpbmNsdWRlICJidGlmX3NvY2tfcmZjLmgiCi0jaW5jbHVkZSAiYnRpZl9zb2NrX3Njby5oIgotI2luY2x1ZGUgImJ0aWZfc29ja19zZHAuaCIKLSNpbmNsdWRlICJidGlmX3NvY2tfdGhyZWFkLmgiCi0jaW5jbHVkZSAiYnRpZl91aWQuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0c29ja19saXN0ZW4oYnRzb2NrX3R5cGVfdCB0eXBlLCBjb25zdCBjaGFyKiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVdWlkKiB1dWlkLCBpbnQgY2hhbm5lbCwgaW50KiBzb2NrX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgYXBwX3VpZCk7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgYnRzb2NrX2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgYnRzb2NrX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQqIHV1aWQsIGludCBjaGFubmVsLCBpbnQqIHNvY2tfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgYXBwX3VpZCk7Ci0KLXN0YXRpYyB2b2lkIGJ0c29ja19yZXF1ZXN0X21heF90eF9kYXRhX2xlbmd0aChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotc3RhdGljIHZvaWQgYnRzb2NrX3NpZ25hbGVkKGludCBmZCwgaW50IHR5cGUsIGludCBmbGFncywgdWludDMyX3QgdXNlcl9pZCk7Ci0KLXN0YXRpYyBzdGQ6OmF0b21pY19pbnQgdGhyZWFkX2hhbmRsZXstMX07Ci1zdGF0aWMgdGhyZWFkX3QqIHRocmVhZDsKLQotY29uc3QgYnRzb2NrX2ludGVyZmFjZV90KiBidGlmX3NvY2tfZ2V0X2ludGVyZmFjZSh2b2lkKSB7Ci0gIHN0YXRpYyBidHNvY2tfaW50ZXJmYWNlX3QgaW50ZXJmYWNlID0gewotICAgICAgc2l6ZW9mKGludGVyZmFjZSksIGJ0c29ja19saXN0ZW4sIC8qIGxpc3RlbiAqLwotICAgICAgYnRzb2NrX2Nvbm5lY3QsICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3QgKi8KLSAgICAgIGJ0c29ja19yZXF1ZXN0X21heF90eF9kYXRhX2xlbmd0aCAvKiByZXF1ZXN0X21heF90eF9kYXRhX2xlbmd0aCAqLwotICB9OwotCi0gIHJldHVybiAmaW50ZXJmYWNlOwotfQotCi1idF9zdGF0dXNfdCBidGlmX3NvY2tfaW5pdCh1aWRfc2V0X3QqIHVpZF9zZXQpIHsKLSAgQ0hFQ0sodGhyZWFkX2hhbmRsZSA9PSAtMSk7Ci0gIENIRUNLKHRocmVhZCA9PSBOVUxMKTsKLQotICBidF9zdGF0dXNfdCBzdGF0dXM7Ci0gIGJ0c29ja190aHJlYWRfaW5pdCgpOwotICB0aHJlYWRfaGFuZGxlID0gYnRzb2NrX3RocmVhZF9jcmVhdGUoYnRzb2NrX3NpZ25hbGVkLCBOVUxMKTsKLSAgaWYgKHRocmVhZF9oYW5kbGUgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBjcmVhdGUgYnRzb2NrX3RocmVhZC4iLCBfX2Z1bmNfXyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHN0YXR1cyA9IGJ0c29ja19yZmNfaW5pdCh0aHJlYWRfaGFuZGxlLCB1aWRfc2V0KTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXMgZXJyb3IgaW5pdGlhbGl6aW5nIFJGQ09NTSBzb2NrZXRzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBzdGF0dXMgPSBidHNvY2tfbDJjYXBfaW5pdCh0aHJlYWRfaGFuZGxlLCB1aWRfc2V0KTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXMgZXJyb3IgaW5pdGlhbGl6aW5nIEwyQ0FQIHNvY2tldHM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHRocmVhZCA9IHRocmVhZF9uZXcoImJ0aWZfc29jayIpOwotICBpZiAoIXRocmVhZCkgewotICAgIExPR19FUlJPUigiJXMgZXJyb3IgY3JlYXRpbmcgbmV3IHRocmVhZC4iLCBfX2Z1bmNfXyk7Ci0gICAgYnRzb2NrX3JmY19jbGVhbnVwKCk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHN0YXR1cyA9IGJ0c29ja19zY29faW5pdCh0aHJlYWQpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBlcnJvciBpbml0aWFsaXppbmcgU0NPIHNvY2tldHM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgYnRzb2NrX3JmY19jbGVhbnVwKCk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLQotZXJyb3I6OwotICB0aHJlYWRfZnJlZSh0aHJlYWQpOwotICB0aHJlYWQgPSBOVUxMOwotICBpZiAodGhyZWFkX2hhbmRsZSAhPSAtMSkgYnRzb2NrX3RocmVhZF9leGl0KHRocmVhZF9oYW5kbGUpOwotICB0aHJlYWRfaGFuZGxlID0gLTE7Ci0gIHVpZF9zZXQgPSBOVUxMOwotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLXZvaWQgYnRpZl9zb2NrX2NsZWFudXAodm9pZCkgewotICBpbnQgc2F2ZWRfaGFuZGxlID0gdGhyZWFkX2hhbmRsZTsKLSAgaWYgKHN0ZDo6YXRvbWljX2V4Y2hhbmdlKCZ0aHJlYWRfaGFuZGxlLCAtMSkgPT0gLTEpIHJldHVybjsKLQotICBidHNvY2tfdGhyZWFkX2V4aXQoc2F2ZWRfaGFuZGxlKTsKLSAgYnRzb2NrX3JmY19jbGVhbnVwKCk7Ci0gIGJ0c29ja19zY29fY2xlYW51cCgpOwotICBidHNvY2tfbDJjYXBfY2xlYW51cCgpOwotICB0aHJlYWRfZnJlZSh0aHJlYWQpOwotICB0aHJlYWQgPSBOVUxMOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRzb2NrX2xpc3RlbihidHNvY2tfdHlwZV90IHR5cGUsIGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQqIHNlcnZpY2VfdXVpZCwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNvY2tfZmQsIGludCBmbGFncywgaW50IGFwcF91aWQpIHsKLSAgaWYgKChmbGFncyAmIEJUU09DS19GTEFHX05PX1NEUCkgPT0gMCkgewotICAgIENIRUNLKHNvY2tfZmQgIT0gTlVMTCk7Ci0gIH0KLQotICAqc29ja19mZCA9IElOVkFMSURfRkQ7Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotICBpbnQgb3JpZ2luYWxfY2hhbm5lbCA9IGNoYW5uZWw7Ci0KLSAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKFJhd0FkZHJlc3M6OmtFbXB0eSwgMCwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Q29ubmVjdGlvbnN0YXRlRW51bTo6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09DS0VUX0NPTk5FQ1RJT05fU1RBVEVfTElTVEVOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYXBwX3VpZCwgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfTElTVEVOKTsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCVFNPQ0tfUkZDT01NOgotICAgICAgc3RhdHVzID0gYnRzb2NrX3JmY19saXN0ZW4oc2VydmljZV9uYW1lLCBzZXJ2aWNlX3V1aWQsIGNoYW5uZWwsIHNvY2tfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgYXBwX3VpZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUU09DS19MMkNBUDoKLSAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgYnRzb2NrX2wyY2FwX2xpc3RlbihzZXJ2aWNlX25hbWUsIGNoYW5uZWwsIHNvY2tfZmQsIGZsYWdzLCBhcHBfdWlkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRTT0NLX0wyQ0FQX0xFOgotICAgICAgaWYgKGZsYWdzICYgQlRTT0NLX0ZMQUdfTk9fU0RQKSB7Ci0gICAgICAgIC8qIFNldCBjaGFubmVsIHRvIHplcm8gc28gdGhhdCBpdCB3aWxsIGJlIGFzc2lnbmVkICovCi0gICAgICAgIGNoYW5uZWwgPSAwOwotICAgICAgfSBlbHNlIGlmIChjaGFubmVsIDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCIlczogdHlwZSBCVFNPQ0tfTDJDQVBfTEU6IGludmFsaWQgY2hhbm5lbD0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgY2hhbm5lbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZmxhZ3MgfD0gQlRTT0NLX0ZMQUdfTEVfQ09DOwotICAgICAgTE9HX0lORk8oCi0KLSAgICAgICAgICAiJXM6IHR5cGU9QlRTT0NLX0wyQ0FQX0xFLCBjaGFubmVsPTB4JXgsIG9yaWdpbmFsPTB4JXgsIGZsYWdzPTB4JXgiLAotICAgICAgICAgIF9fZnVuY19fLCBjaGFubmVsLCBvcmlnaW5hbF9jaGFubmVsLCBmbGFncyk7Ci0gICAgICBzdGF0dXMgPQotICAgICAgICAgIGJ0c29ja19sMmNhcF9saXN0ZW4oc2VydmljZV9uYW1lLCBjaGFubmVsLCBzb2NrX2ZkLCBmbGFncywgYXBwX3VpZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUU09DS19TQ086Ci0gICAgICBzdGF0dXMgPSBidHNvY2tfc2NvX2xpc3Rlbihzb2NrX2ZkLCBmbGFncyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIiVzIHVua25vd24vdW5zdXBwb3J0ZWQgc29ja2V0IHR5cGU6ICVkIiwgX19mdW5jX18sIHR5cGUpOwotICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIGxvZ19zb2NrZXRfY29ubmVjdGlvbl9zdGF0ZShSYXdBZGRyZXNzOjprRW1wdHksIDAsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Q29ubmVjdGlvbnN0YXRlRW51bTo6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLRVRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGFwcF91aWQsIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfTElTVEVOKTsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRzb2NrX2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgYnRzb2NrX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQqIHV1aWQsIGludCBjaGFubmVsLCBpbnQqIHNvY2tfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgYXBwX3VpZCkgewotICBDSEVDSyhiZF9hZGRyICE9IE5VTEwpOwotICBDSEVDSyhzb2NrX2ZkICE9IE5VTEwpOwotCi0gICpzb2NrX2ZkID0gSU5WQUxJRF9GRDsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKCpiZF9hZGRyLCAwLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtOjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLRVRfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYXBwX3VpZCwgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfQ09OTkVDVElPTik7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgQlRTT0NLX1JGQ09NTToKLSAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgYnRzb2NrX3JmY19jb25uZWN0KGJkX2FkZHIsIHV1aWQsIGNoYW5uZWwsIHNvY2tfZmQsIGZsYWdzLCBhcHBfdWlkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVFNPQ0tfTDJDQVA6Ci0gICAgICBzdGF0dXMgPSBidHNvY2tfbDJjYXBfY29ubmVjdChiZF9hZGRyLCBjaGFubmVsLCBzb2NrX2ZkLCBmbGFncywgYXBwX3VpZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRTT0NLX0wyQ0FQX0xFOiB7Ci0gICAgICBmbGFncyB8PSBCVFNPQ0tfRkxBR19MRV9DT0M7Ci0KLSAgICAgIC8vIEVuc3VyZSBkZXZpY2UgaXMgaW4gaW5xdWlyeSBkYXRhYmFzZQotICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICAgICAgaW50IGRldmljZV90eXBlID0gMDsKLQotICAgICAgaWYgKGJ0aWZfZ2V0X2FkZHJlc3NfdHlwZSgqYmRfYWRkciwgJmFkZHJfdHlwZSkgJiYKLSAgICAgICAgICBidGlmX2dldF9kZXZpY2VfdHlwZSgqYmRfYWRkciwgJmRldmljZV90eXBlKSAmJgotICAgICAgICAgIGRldmljZV90eXBlICE9IEJUX0RFVklDRV9UWVBFX0JSRURSKSB7Ci0gICAgICAgIEJUQV9EbUFkZEJsZURldmljZSgqYmRfYWRkciwgYWRkcl90eXBlLCBkZXZpY2VfdHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIExPR19JTkZPKCIlczogdHlwZT1CVFNPQ0tfTDJDQVBfTEUsIGNoYW5uZWw9MHgleCwgZmxhZ3M9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgY2hhbm5lbCwgZmxhZ3MpOwotICAgICAgc3RhdHVzID0gYnRzb2NrX2wyY2FwX2Nvbm5lY3QoYmRfYWRkciwgY2hhbm5lbCwgc29ja19mZCwgZmxhZ3MsIGFwcF91aWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVFNPQ0tfU0NPOgotICAgICAgc3RhdHVzID0gYnRzb2NrX3Njb19jb25uZWN0KGJkX2FkZHIsIHNvY2tfZmQsIGZsYWdzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiJXMgdW5rbm93bi91bnN1cHBvcnRlZCBzb2NrZXQgdHlwZTogJWQiLCBfX2Z1bmNfXywgdHlwZSk7Ci0gICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKCpiZF9hZGRyLCAwLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW06OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09DS0VUX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBhcHBfdWlkLCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0NPTk5FQ1RJT04pOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c29ja19yZXF1ZXN0X21heF90eF9kYXRhX2xlbmd0aChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfZGV2aWNlKSB7Ci0gIEJUQV9EbUJsZVJlcXVlc3RNYXhUeERhdGFMZW5ndGgocmVtb3RlX2RldmljZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c29ja19zaWduYWxlZChpbnQgZmQsIGludCB0eXBlLCBpbnQgZmxhZ3MsIHVpbnQzMl90IHVzZXJfaWQpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCVFNPQ0tfUkZDT01NOgotICAgICAgYnRzb2NrX3JmY19zaWduYWxlZChmZCwgZmxhZ3MsIHVzZXJfaWQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVFNPQ0tfTDJDQVA6Ci0gICAgY2FzZSBCVFNPQ0tfTDJDQVBfTEU6Ci0gICAgICAvKiBOb3RlOiBUaGUgY2FsbGVyIG1heSBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBCVFNPQ0tfTDJDQVAgYW5kCi0gICAgICAgKiBCVFNPQ0tfTDJDQVBfTEUgY29ycmVjdGx5ICovCi0gICAgICBidHNvY2tfbDJjYXBfc2lnbmFsZWQoZmQsIGZsYWdzLCB1c2VyX2lkKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRkFUQUwpIDw8ICJJbnZhbGlkIHNvY2tldCB0eXBlISB0eXBlPSIgPDwgdHlwZSA8PCAiIGZkPSIgPDwgZmQKLSAgICAgICAgICAgICAgICAgPDwgIiBmbGFncz0iIDw8IGZsYWdzIDw8ICIgdXNlcl9pZD0iIDw8IHVzZXJfaWQ7Ci0gICAgICBicmVhazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9zb2NrX2wyY2FwLmNjIGIvYnRpZi9zcmMvYnRpZl9zb2NrX2wyY2FwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDVhNWJkLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfc29ja19sMmNhcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgU2Ftc3VuZyBTeXN0ZW0gTFNJCi0gKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfanZfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc29ja190aHJlYWQuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zb2NrX3V0aWwuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl91aWQuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aC5oIgotI2luY2x1ZGUgImludGVybmFsX2luY2x1ZGUvYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL3NlY3VyaXR5X2RldmljZV9yZWNvcmQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLXN0cnVjdCBwYWNrZXQgewotICBzdHJ1Y3QgcGFja2V0ICpuZXh0LCAqcHJldjsKLSAgdWludDMyX3QgbGVuOwotICB1aW50OF90KiBkYXRhOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbDJjYXBfc29ja2V0IHsKLSAgc3RydWN0IGwyY2FwX3NvY2tldCogcHJldjsgIC8vIGxpbmsgdG8gcHJldiBsaXN0IGl0ZW0KLSAgc3RydWN0IGwyY2FwX3NvY2tldCogbmV4dDsgIC8vIGxpbmsgdG8gbmV4dCBsaXN0IGl0ZW0KLSAgUmF3QWRkcmVzcyBhZGRyOyAgICAgICAgICAgIC8vIG90aGVyIHNpZGUncyBhZGRyZXNzCi0gIGNoYXIgbmFtZVsyNTZdOyAgICAgICAgICAgICAvLyB1c2VyLWZyaWVuZGx5IG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgdWludDMyX3QgaWQ7ICAgICAgICAgICAgICAgIC8vIGp1c3QgYSB0YWcgdG8gZmluZCB0aGlzIHN0cnVjdAotICBpbnQgYXBwX3VpZDsgICAgICAgICAgICAgICAgLy8gVGhlIFVJRCBvZiB0aGUgYXBwIHdobyByZXF1ZXN0ZWQgdGhpcyBzb2NrZXQKLSAgaW50IGhhbmRsZTsgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBmcm9tIGxvd2VyIGxheWVycwotICB1bnNpZ25lZCBzZWN1cml0eTsgICAgICAgICAgLy8gc2VjdXJpdHkgZmxhZ3MKLSAgaW50IGNoYW5uZWw7ICAgICAgICAgICAgICAgIC8vIFBTTQotICBpbnQgb3VyX2ZkOyAgICAgICAgICAgICAgICAgLy8gZmQgZnJvbSBvdXIgc2lkZQotICBpbnQgYXBwX2ZkOyAgICAgICAgICAgICAgICAgLy8gZmQgZnJvbSBhcHAncyBzaWRlCi0KLSAgdW5zaWduZWQgYnl0ZXNfYnVmZmVyZWQ7Ci0gIHN0cnVjdCBwYWNrZXQqIGZpcnN0X3BhY2tldDsgIC8vIGZpc3QgcGFja2V0IHRvIGJlIGRlbGl2ZXJlZCB0byBhcHAKLSAgc3RydWN0IHBhY2tldCogbGFzdF9wYWNrZXQ7ICAgLy8gbGFzdCBwYWNrZXQgdG8gYmUgZGVsaXZlcmVkIHRvIGFwcAotCi0gIHVuc2lnbmVkIHNlcnZlciA6IDE7ICAgICAgICAgICAgLy8gaXMgYSBzZXJ2ZXI/IChvciBjb25uZWN0aW5nPykKLSAgdW5zaWduZWQgY29ubmVjdGVkIDogMTsgICAgICAgICAvLyBpcyBjb25uZWN0ZWQ/Ci0gIHVuc2lnbmVkIG91dGdvaW5nX2Nvbmdlc3QgOiAxOyAgLy8gc2hvdWxkIHdlIGhvbGQ/Ci0gIHVuc2lnbmVkIHNlcnZlcl9wc21fc2VudCA6IDE7ICAgLy8gVGhlIHNlcnZlciBzaGFsbCBvbmx5IHNlbmQgUFNNIG9uY2UuCi0gIGJvb2wgaXNfbGVfY29jOyAgICAgICAgICAgICAgICAgLy8gaXMgbGUgY29ubmVjdGlvbiBvcmllbnRlZCBjaGFubmVsPwotICB1aW50MTZfdCByeF9tdHU7Ci0gIHVpbnQxNl90IHR4X210dTsKLSAgLy8gQ3VtdWxhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBzb2NrZXQKLSAgaW50NjRfdCB0eF9ieXRlczsKLSAgLy8gQ3VtdWxhdGl2ZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBzb2NrZXQKLSAgaW50NjRfdCByeF9ieXRlczsKLX0gbDJjYXBfc29ja2V0OwotCi1zdGF0aWMgdm9pZCBidHNvY2tfbDJjYXBfc2VydmVyX2xpc3RlbihsMmNhcF9zb2NrZXQqIHNvY2spOwotCi1zdGF0aWMgc3RkOjptdXRleCBzdGF0ZV9sb2NrOwotCi1sMmNhcF9zb2NrZXQqIHNvY2tzID0gTlVMTDsKLXN0YXRpYyB1aW50MzJfdCBsYXN0X3NvY2tfaWQgPSAwOwotc3RhdGljIHVpZF9zZXRfdCogdWlkX3NldCA9IE5VTEw7Ci1zdGF0aWMgaW50IHB0aCA9IC0xOwotCi1zdGF0aWMgdm9pZCBidHNvY2tfbDJjYXBfY2JrKHRCVEFfSlZfRVZUIGV2ZW50LCB0QlRBX0pWKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCk7Ci0KLS8qIFRPRE86IENvbnNpZGVyIHRvIHJlbW92ZSB0aGlzIGJ1ZmZlciwgYXMgd2UgaGF2ZSBhIGJ1ZmZlciBpbiBsMmNhcCBhcyB3ZWxsLAotICogYW5kIHdlIHJpc2sKLSAqICAgICAgIGEgYnVmZmVyIG92ZXJmbG93IHdpdGggdGhpcyBpbXBsZW1lbnRhdGlvbiBpZiB0aGUgc29ja2V0IGRhdGEgaXMgbm90Ci0gKiByZWFkIGZyb20KLSAqICAgICAgIEpBVkEgZm9yIGEgd2hpbGUuIEluIHN1Y2ggYSBjYXNlIHdlIHNob3VsZCB1c2UgZmxvdyBjb250cm9sIHRvIHRlbGwgdGhlCi0gKiBzZW5kZXIgdG8KLSAqICAgICAgIGJhY2sgb2ZmLgotICogICAgICAgQlVUIHJlbWVtYmVyIHdlIG5lZWQgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIEJUQSB0YXNrIGV4ZWN1dGlvbiAtIGhlbmNlCi0gKiB3ZSBjYW5ub3QKLSAqICAgICAgIGRpcmVjdGx5IHdyaXRlIHRvIHRoZSBzb2NrZXQuCi0gKiAgICAgICB3ZSBzaG91bGQgYmUgYWJsZSB0byBjaGFuZ2UgdG8gc3RvcmUgdGhlIGRhdGEgcG9pbnRlciBoZXJlLCBhbmQganVzdAotICogd2FpdAotICogICAgICAgY29uZmlybWluZyB0aGUgbDJjYXBfaW5kIHVudGlsIHdlIGhhdmUgbW9yZSBzcGFjZSBpbiB0aGUgYnVmZmVyLiAqLwotCi0vKiByZXR1cm5zIGZhbHNlIGlmIG5vbmUgLSBjYWxsZXIgbXVzdCBmcmVlICJkYXRhIiBtZW1vcnkgd2hlbiBkb25lIHdpdGggaXQgKi8KLXN0YXRpYyBjaGFyIHBhY2tldF9nZXRfaGVhZF9sKGwyY2FwX3NvY2tldCogc29jaywgdWludDhfdCoqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGVuKSB7Ci0gIHN0cnVjdCBwYWNrZXQqIHAgPSBzb2NrLT5maXJzdF9wYWNrZXQ7Ci0KLSAgaWYgKCFwKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGRhdGEpICpkYXRhID0gc29jay0+Zmlyc3RfcGFja2V0LT5kYXRhOwotICBpZiAobGVuKSAqbGVuID0gc29jay0+Zmlyc3RfcGFja2V0LT5sZW47Ci0gIHNvY2stPmZpcnN0X3BhY2tldCA9IHAtPm5leHQ7Ci0gIGlmIChzb2NrLT5maXJzdF9wYWNrZXQpCi0gICAgc29jay0+Zmlyc3RfcGFja2V0LT5wcmV2ID0gTlVMTDsKLSAgZWxzZQotICAgIHNvY2stPmxhc3RfcGFja2V0ID0gTlVMTDsKLQotICBpZiAobGVuKSBzb2NrLT5ieXRlc19idWZmZXJlZCAtPSAqbGVuOwotCi0gIG9zaV9mcmVlKHApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc3RydWN0IHBhY2tldCogcGFja2V0X2FsbG9jKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVpbnQzMl90IGxlbikgewotICBzdHJ1Y3QgcGFja2V0KiBwID0gKHN0cnVjdCBwYWNrZXQqKW9zaV9jYWxsb2Moc2l6ZW9mKCpwKSk7Ci0gIHVpbnQ4X3QqIGJ1ZiA9ICh1aW50OF90Kilvc2lfbWFsbG9jKGxlbik7Ci0KLSAgcC0+ZGF0YSA9IGJ1ZjsKLSAgcC0+bGVuID0gbGVuOwotICBtZW1jcHkocC0+ZGF0YSwgZGF0YSwgbGVuKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIG1ha2VzIGEgY29weSBvZiB0aGUgZGF0YSwgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KLXN0YXRpYyBjaGFyIHBhY2tldF9wdXRfaGVhZF9sKGwyY2FwX3NvY2tldCogc29jaywgY29uc3Qgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbikgewotICBzdHJ1Y3QgcGFja2V0KiBwID0gcGFja2V0X2FsbG9jKChjb25zdCB1aW50OF90KilkYXRhLCBsZW4pOwotCi0gIC8qCi0gICAqIFdlIGRvIG5vdCBjaGVjayBzaXplIGxpbWl0cyBoZXJlIHNpbmNlIHRoaXMgaXMgdXNlZCB0byB1bmRvICJnZXR0aW5nIiBhCi0gICAqIHBhY2tldCB0aGF0IHRoZSB1c2VyIHJlYWQgaW5jb21wbGV0ZWx5LiBUaGF0IGlzIHRvIHNheSB0aGUgcGFja2V0IHdhcwotICAgKiBhbHJlYWR5IGluIHRoZSBxdWV1ZS4gV2UgZG8gY2hlY2sgdGhvcyBlbGltaXRzIGluIHBhY2tldF9wdXRfdGFpbF9sKCkgc2luY2UKLSAgICogdGhhdCBmdW5jdGlvbiBpcyB1c2VkIHRvIHB1dCBuZXcgZGF0YSBpbnRvIHRoZSBxdWV1ZS4KLSAgICovCi0KLSAgaWYgKCFwKSByZXR1cm4gZmFsc2U7Ci0KLSAgcC0+cHJldiA9IE5VTEw7Ci0gIHAtPm5leHQgPSBzb2NrLT5maXJzdF9wYWNrZXQ7Ci0gIHNvY2stPmZpcnN0X3BhY2tldCA9IHA7Ci0gIGlmIChwLT5uZXh0KQotICAgIHAtPm5leHQtPnByZXYgPSBwOwotICBlbHNlCi0gICAgc29jay0+bGFzdF9wYWNrZXQgPSBwOwotCi0gIHNvY2stPmJ5dGVzX2J1ZmZlcmVkICs9IGxlbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogbWFrZXMgYSBjb3B5IG9mIHRoZSBkYXRhLCByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLwotc3RhdGljIGNoYXIgcGFja2V0X3B1dF90YWlsX2wobDJjYXBfc29ja2V0KiBzb2NrLCBjb25zdCB2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzb2NrLT5ieXRlc19idWZmZXJlZCA+PSBMMkNBUF9NQVhfUlhfQlVGRkVSKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gYWRkIHRvIGJ1ZmZlciBkdWUgdG8gYnVmZmVyIG92ZXJmbG93IHNvY2tldF9pZDoldSIsCi0gICAgICAgICAgICAgIHNvY2stPmlkKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdHJ1Y3QgcGFja2V0KiBwID0gcGFja2V0X2FsbG9jKChjb25zdCB1aW50OF90KilkYXRhLCBsZW4pOwotICBwLT5uZXh0ID0gTlVMTDsKLSAgcC0+cHJldiA9IHNvY2stPmxhc3RfcGFja2V0OwotICBzb2NrLT5sYXN0X3BhY2tldCA9IHA7Ci0gIGlmIChwLT5wcmV2KQotICAgIHAtPnByZXYtPm5leHQgPSBwOwotICBlbHNlCi0gICAgc29jay0+Zmlyc3RfcGFja2V0ID0gcDsKLQotICBzb2NrLT5ieXRlc19idWZmZXJlZCArPSBsZW47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjaGFyIGlzX2luaXRlZCh2b2lkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhzdGF0ZV9sb2NrKTsKLSAgcmV0dXJuIHB0aCAhPSAtMTsKLX0KLQotLyogb25seSBjYWxsIHdpdGggc3RkOjptdXRleCB0YWtlbiAqLwotc3RhdGljIGwyY2FwX3NvY2tldCogYnRzb2NrX2wyY2FwX2ZpbmRfYnlfaWRfbCh1aW50MzJfdCBpZCkgewotICBsMmNhcF9zb2NrZXQqIHNvY2sgPSBzb2NrczsKLQotICB3aGlsZSAoc29jayAmJiBzb2NrLT5pZCAhPSBpZCkgc29jayA9IHNvY2stPm5leHQ7Ci0KLSAgcmV0dXJuIHNvY2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c29ja19sMmNhcF9mcmVlX2wobDJjYXBfc29ja2V0KiBzb2NrKSB7Ci0gIHVpbnQ4X3QqIGJ1ZjsKLSAgbDJjYXBfc29ja2V0KiB0ID0gc29ja3M7Ci0KLSAgd2hpbGUgKHQgJiYgdCAhPSBzb2NrKSB0ID0gdC0+bmV4dDsKLQotICBpZiAoIXQpIC8qIHByZXZlciBkb3VibGUtZnJlZXMgKi8KLSAgICByZXR1cm47Ci0KLSAgLy8gV2hlbmV2ZXIgYSBzb2NrZXQgaXMgZnJlZWQsIHRoZSBjb25uZWN0aW9uIG11c3QgYmUgZHJvcHBlZAotICBsb2dfc29ja2V0X2Nvbm5lY3Rpb25fc3RhdGUoCi0gICAgICBzb2NrLT5hZGRyLCBzb2NrLT5pZCwgc29jay0+aXNfbGVfY29jID8gQlRTT0NLX0wyQ0FQX0xFIDogQlRTT0NLX0wyQ0FQLAotICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIHNvY2stPnR4X2J5dGVzLAotICAgICAgc29jay0+cnhfYnl0ZXMsIHNvY2stPmFwcF91aWQsIHNvY2stPmNoYW5uZWwsCi0gICAgICBzb2NrLT5zZXJ2ZXIgPyBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0xJU1RFTgotICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9DT05ORUNUSU9OKTsKLQotICBpZiAoc29jay0+bmV4dCkgc29jay0+bmV4dC0+cHJldiA9IHNvY2stPnByZXY7Ci0KLSAgaWYgKHNvY2stPnByZXYpCi0gICAgc29jay0+cHJldi0+bmV4dCA9IHNvY2stPm5leHQ7Ci0gIGVsc2UKLSAgICBzb2NrcyA9IHNvY2stPm5leHQ7Ci0KLSAgc2h1dGRvd24oc29jay0+b3VyX2ZkLCBTSFVUX1JEV1IpOwotICBjbG9zZShzb2NrLT5vdXJfZmQpOwotICBpZiAoc29jay0+YXBwX2ZkICE9IC0xKSB7Ci0gICAgY2xvc2Uoc29jay0+YXBwX2ZkKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiQXBwbGljYXRpb24gaGFzIGFscmVhZHkgY2xvc2VkIGwyY2FwIHNvY2tldCBzb2NrZXRfaWQ6JXUiLAotICAgICAgICAgICAgIHNvY2stPmlkKTsKLSAgfQotCi0gIHdoaWxlIChwYWNrZXRfZ2V0X2hlYWRfbChzb2NrLCAmYnVmLCBOVUxMKSkgb3NpX2ZyZWUoYnVmKTsKLQotICAvLyBsb3dlci1sZXZlbCBjbG9zZSgpIHNob3VsZCBiZSBpZGVtcG90ZW50Li4uIHNvIGxldCdzIGNhbGwgaXQgYW5kIHNlZS4uLgotICBpZiAoc29jay0+aXNfbGVfY29jKSB7Ci0gICAgLy8gT25seSBjYWxsIGlmIHdlIGFyZSBub24gc2VydmVyIGNvbm5lY3Rpb25zCi0gICAgaWYgKHNvY2stPmhhbmRsZSA+PSAwICYmICghc29jay0+c2VydmVyKSkgewotICAgICAgQlRBX0p2TDJjYXBDbG9zZShzb2NrLT5oYW5kbGUpOwotICAgIH0KLSAgICBpZiAoKHNvY2stPmNoYW5uZWwgPj0gMCkgJiYgKHNvY2stPnNlcnZlcikpIHsKLSAgICAgIEJUQV9KdkZyZWVDaGFubmVsKHNvY2stPmNoYW5uZWwsIEJUQV9KVl9DT05OX1RZUEVfTDJDQVBfTEUpOwotICAgICAgTE9HX0lORk8oIlN0b3BwZWQgTDJDQVAgTEUgQ09DIHNlcnZlciBzb2NrZXRfaWQ6JXUgY2hhbm5lbDoldSIsIHNvY2stPmlkLAotICAgICAgICAgICAgICAgc29jay0+Y2hhbm5lbCk7Ci0gICAgICBCVEFfSnZMMmNhcFN0b3BTZXJ2ZXIoc29jay0+Y2hhbm5lbCwgc29jay0+aWQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBPbmx5IGNhbGwgaWYgd2UgYXJlIG5vbiBzZXJ2ZXIgY29ubmVjdGlvbnMKLSAgICBpZiAoKHNvY2stPmhhbmRsZSA+PSAwKSAmJiAoIXNvY2stPnNlcnZlcikpIHsKLSAgICAgIEJUQV9KdkwyY2FwQ2xvc2Uoc29jay0+aGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKChzb2NrLT5jaGFubmVsID49IDApICYmIChzb2NrLT5zZXJ2ZXIpKSB7Ci0gICAgICBCVEFfSnZGcmVlQ2hhbm5lbChzb2NrLT5jaGFubmVsLCBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQKTsKLSAgICAgIEJUQV9KdkwyY2FwU3RvcFNlcnZlcihzb2NrLT5jaGFubmVsLCBzb2NrLT5pZCk7Ci0gICAgfQotICB9Ci0KLSAgb3NpX2ZyZWUoc29jayk7Ci19Ci0KLXN0YXRpYyBsMmNhcF9zb2NrZXQqIGJ0c29ja19sMmNhcF9hbGxvY19sKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBpc19zZXJ2ZXIsIGludCBmbGFncykgewotICB1bnNpZ25lZCBzZWN1cml0eSA9IDA7Ci0gIGludCBmZHNbMl07Ci0gIGwyY2FwX3NvY2tldCogc29jayA9IChsMmNhcF9zb2NrZXQqKW9zaV9jYWxsb2Moc2l6ZW9mKCpzb2NrKSk7Ci0KLSAgaWYgKGZsYWdzICYgQlRTT0NLX0ZMQUdfRU5DUllQVCkKLSAgICBzZWN1cml0eSB8PSBpc19zZXJ2ZXIgPyBCVE1fU0VDX0lOX0VOQ1JZUFQgOiBCVE1fU0VDX09VVF9FTkNSWVBUOwotICBpZiAoZmxhZ3MgJiBCVFNPQ0tfRkxBR19BVVRIKQotICAgIHNlY3VyaXR5IHw9IGlzX3NlcnZlciA/IEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFIDogQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFOwotICBpZiAoZmxhZ3MgJiBCVFNPQ0tfRkxBR19BVVRIX01JVE0pCi0gICAgc2VjdXJpdHkgfD0gaXNfc2VydmVyID8gQlRNX1NFQ19JTl9NSVRNIDogQlRNX1NFQ19PVVRfTUlUTTsKLSAgaWYgKGZsYWdzICYgQlRTT0NLX0ZMQUdfQVVUSF8xNl9ESUdJVCkKLSAgICBzZWN1cml0eSB8PSBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU47Ci0KLSAgaWYgKHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU0VRUEFDS0VULCAwLCBmZHMpKSB7Ci0gICAgTE9HX0VSUk9SKCJzb2NrZXRwYWlyIGZhaWxlZDolcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgZ290byBmYWlsX3NvY2twYWlyOwotICB9Ci0KLSAgc29jay0+b3VyX2ZkID0gZmRzWzBdOwotICBzb2NrLT5hcHBfZmQgPSBmZHNbMV07Ci0gIHNvY2stPnNlY3VyaXR5ID0gc2VjdXJpdHk7Ci0gIHNvY2stPnNlcnZlciA9IGlzX3NlcnZlcjsKLSAgc29jay0+Y29ubmVjdGVkID0gZmFsc2U7Ci0gIHNvY2stPmhhbmRsZSA9IDA7Ci0gIHNvY2stPnNlcnZlcl9wc21fc2VudCA9IGZhbHNlOwotICBzb2NrLT5hcHBfdWlkID0gLTE7Ci0KLSAgaWYgKG5hbWUpIHN0cm5jcHkoc29jay0+bmFtZSwgbmFtZSwgc2l6ZW9mKHNvY2stPm5hbWUpIC0gMSk7Ci0gIGlmIChhZGRyKSBzb2NrLT5hZGRyID0gKmFkZHI7Ci0KLSAgc29jay0+Zmlyc3RfcGFja2V0ID0gTlVMTDsKLSAgc29jay0+bGFzdF9wYWNrZXQgPSBOVUxMOwotCi0gIHNvY2stPnR4X210dSA9IEwyQ0FQX0xFX01JTl9NVFU7Ci0KLSAgc29jay0+bmV4dCA9IHNvY2tzOwotICBzb2NrLT5wcmV2ID0gTlVMTDsKLSAgaWYgKHNvY2tzKSBzb2Nrcy0+cHJldiA9IHNvY2s7Ci0gIHNvY2stPmlkID0gbGFzdF9zb2NrX2lkICsgMTsKLSAgc29jay0+dHhfYnl0ZXMgPSAwOwotICBzb2NrLT5yeF9ieXRlcyA9IDA7Ci0gIHNvY2tzID0gc29jazsKLSAgLyogcGFyYW5vaWEgY2FwIG9uOiB2ZXJpZnkgbm8gSUQgZHVwbGljYXRlcyBkdWUgdG8gb3ZlcmZsb3cgYW5kIGZpeCBhcyBuZWVkZWQKLSAgICovCi0gIHdoaWxlICgxKSB7Ci0gICAgbDJjYXBfc29ja2V0KiB0OwotICAgIHQgPSBzb2Nrcy0+bmV4dDsKLSAgICB3aGlsZSAodCAmJiB0LT5pZCAhPSBzb2NrLT5pZCkgewotICAgICAgdCA9IHQtPm5leHQ7Ci0gICAgfQotICAgIGlmICghdCAmJiBzb2NrLT5pZCkgLyogbm9uLXplb3IgaGFuZGxlIGlzIHVuaXF1ZSAtPiB3ZSdyZSBkb25lICovCi0gICAgICBicmVhazsKLSAgICAvKiBpZiB3ZSdyZSBoZXJlLCB3ZSBmb3VuZCBhIGR1cGxpY2F0ZSAqLwotICAgIGlmICghKytzb2NrLT5pZCkgLyogbm8gemVybyBJRHMgYWxsb3dlZCAqLwotICAgICAgc29jay0+aWQrKzsKLSAgfQotICBsYXN0X3NvY2tfaWQgPSBzb2NrLT5pZDsKLSAgTE9HX0lORk8oIkFsbG9jYXRlZCBsMmNhcCBzb2NrZXQgc3RydWN0dXJlIHNvY2tldF9pZDoldSIsIHNvY2stPmlkKTsKLSAgcmV0dXJuIHNvY2s7Ci0KLWZhaWxfc29ja3BhaXI6Ci0gIG9zaV9mcmVlKHNvY2spOwotICByZXR1cm4gTlVMTDsKLX0KLQotYnRfc3RhdHVzX3QgYnRzb2NrX2wyY2FwX2luaXQoaW50IGhhbmRsZSwgdWlkX3NldF90KiBzZXQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHN0YXRlX2xvY2spOwotICBwdGggPSBoYW5kbGU7Ci0gIHNvY2tzID0gTlVMTDsKLSAgdWlkX3NldCA9IHNldDsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBidHNvY2tfbDJjYXBfY2xlYW51cCgpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHN0YXRlX2xvY2spOwotICBwdGggPSAtMTsKLSAgd2hpbGUgKHNvY2tzKSBidHNvY2tfbDJjYXBfZnJlZV9sKHNvY2tzKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgc2VuZF9hcHBfcHNtX29yX2NoYW5fbChsMmNhcF9zb2NrZXQqIHNvY2spIHsKLSAgTE9HX0lORk8oIlNlbmRpbmcgbDJjYXAgc29ja2V0IHNvY2tldF9pZDoldSBjaGFubmVsOiVkIiwgc29jay0+aWQsCi0gICAgICAgICAgIHNvY2stPmNoYW5uZWwpOwotICByZXR1cm4gc29ja19zZW5kX2FsbChzb2NrLT5vdXJfZmQsIChjb25zdCB1aW50OF90Kikmc29jay0+Y2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNvY2stPmNoYW5uZWwpKSA9PSBzaXplb2Yoc29jay0+Y2hhbm5lbCk7Ci19Ci0KLXN0YXRpYyBib29sIHNlbmRfYXBwX2Nvbm5lY3Rfc2lnbmFsKGludCBmZCwgY29uc3QgUmF3QWRkcmVzcyogYWRkciwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgc2VuZF9mZCwgdWludDE2X3QgcnhfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHhfbXR1KSB7Ci0gIHNvY2tfY29ubmVjdF9zaWduYWxfdCBjczsKLSAgY3Muc2l6ZSA9IHNpemVvZihjcyk7Ci0gIGNzLmJkX2FkZHIgPSAqYWRkcjsKLSAgY3MuY2hhbm5lbCA9IGNoYW5uZWw7Ci0gIGNzLnN0YXR1cyA9IHN0YXR1czsKLSAgY3MubWF4X3J4X3BhY2tldF9zaXplID0gcnhfbXR1OwotICBjcy5tYXhfdHhfcGFja2V0X3NpemUgPSB0eF9tdHU7Ci0gIGlmIChzZW5kX2ZkICE9IC0xKSB7Ci0gICAgaWYgKHNvY2tfc2VuZF9mZChmZCwgKGNvbnN0IHVpbnQ4X3QqKSZjcywgc2l6ZW9mKGNzKSwgc2VuZF9mZCkgPT0KLSAgICAgICAgc2l6ZW9mKGNzKSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHNvY2tfc2VuZF9hbGwoZmQsIChjb25zdCB1aW50OF90KikmY3MsIHNpemVvZihjcykpID09IHNpemVvZihjcykpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIExPR19FUlJPUigiVW5hYmxlIHRvIHNlbmQgZGF0YSB0byBzb2NrZXQgZmQ6JWQgc2VuZF9mZDolZCIsIGZkLCBzZW5kX2ZkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBvbl9zcnZfbDJjYXBfbGlzdGVuX3N0YXJ0ZWQodEJUQV9KVl9MMkNBUF9TVEFSVCogcF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCkgewotICBsMmNhcF9zb2NrZXQqIHNvY2s7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHN0YXRlX2xvY2spOwotICBzb2NrID0gYnRzb2NrX2wyY2FwX2ZpbmRfYnlfaWRfbChpZCk7Ci0gIGlmICghc29jaykgewotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGZpbmQgbDJjYXAgc29ja2V0IHdpdGggc29ja2V0X2lkOiV1IiwgaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3N0YXJ0LT5zdGF0dXMgIT0gQlRBX0pWX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBzdGFydCBsMmNhcCBzZXJ2ZXIgc29ja2V0X2lkOiV1Iiwgc29jay0+aWQpOwotICAgIGJ0c29ja19sMmNhcF9mcmVlX2woc29jayk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc29jay0+aGFuZGxlID0gcF9zdGFydC0+aGFuZGxlOwotCi0gIGxvZ19zb2NrZXRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgIHNvY2stPmFkZHIsIHNvY2stPmlkLCBzb2NrLT5pc19sZV9jb2MgPyBCVFNPQ0tfTDJDQVBfTEUgOiBCVFNPQ0tfTDJDQVAsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW06OgotICAgICAgICAgIFNPQ0tFVF9DT05ORUNUSU9OX1NUQVRFX0xJU1RFTklORywKLSAgICAgIDAsIDAsIHNvY2stPmFwcF91aWQsIHNvY2stPmNoYW5uZWwsCi0gICAgICBzb2NrLT5zZXJ2ZXIgPyBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0xJU1RFTgotICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9DT05ORUNUSU9OKTsKLQotICBpZiAoIXNvY2stPnNlcnZlcl9wc21fc2VudCkgewotICAgIGlmICghc2VuZF9hcHBfcHNtX29yX2NoYW5fbChzb2NrKSkgewotICAgICAgLy8gY2xvc2VkCi0gICAgICBMT0dfSU5GTygiVW5hYmxlIHRvIHNlbmQgc29ja2V0IHRvIGFwcGxpY2F0aW9uIHNvY2tldF9pZDoldSIsIHNvY2stPmlkKTsKLSAgICAgIGJ0c29ja19sMmNhcF9mcmVlX2woc29jayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNvY2stPnNlcnZlcl9wc21fc2VudCA9IHRydWU7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2NsX2wyY2FwX2luaXQodEJUQV9KVl9MMkNBUF9DTF9JTklUKiBwX2luaXQsIHVpbnQzMl90IGlkKSB7Ci0gIGwyY2FwX3NvY2tldCogc29jazsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIHNvY2sgPSBidHNvY2tfbDJjYXBfZmluZF9ieV9pZF9sKGlkKTsKLSAgaWYgKCFzb2NrKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZmluZCBsMmNhcCBzb2NrZXQgd2l0aCBzb2NrZXRfaWQ6JXUiLCBpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfaW5pdC0+c3RhdHVzICE9IEJUQV9KVl9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCJJbml0aWFsaXphdGlvbiBzdGF0dXMgZmFpbGVkIHNvY2tldF9pZDoldSIsIGlkKTsKLSAgICBidHNvY2tfbDJjYXBfZnJlZV9sKHNvY2spOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNvY2stPmhhbmRsZSA9IHBfaW5pdC0+aGFuZGxlOwotfQotCi0vKioKLSAqIEhlcmUgd2UgYWxsb2NhdGUgYSBuZXcgc29jayBpbnN0YW5jZSB0byBtaW1pYyB0aGUgQmx1ZXRvb3RoU29ja2V0LiBUaGUgc29ja2V0Ci0gKiB3aWxsIGJlIGEgY2xvbmUgb2YgdGhlIHNvY2sgcmVwcmVzZW50aW5nIHRoZSBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQuCi0gKiAqLwotc3RhdGljIHZvaWQgb25fc3J2X2wyY2FwX3BzbV9jb25uZWN0X2wodEJUQV9KVl9MMkNBUF9PUEVOKiBwX29wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcF9zb2NrZXQqIHNvY2spIHsKLSAgLy8gc3RkOjptdXRleCBsb2NrZWQgYnkgY2FsbGVyCi0gIGwyY2FwX3NvY2tldCogYWNjZXB0X3JzID0KLSAgICAgIGJ0c29ja19sMmNhcF9hbGxvY19sKHNvY2stPm5hbWUsICZwX29wZW4tPnJlbV9iZGEsIGZhbHNlLCAwKTsKLSAgYWNjZXB0X3JzLT5jb25uZWN0ZWQgPSB0cnVlOwotICBhY2NlcHRfcnMtPnNlY3VyaXR5ID0gc29jay0+c2VjdXJpdHk7Ci0gIGFjY2VwdF9ycy0+Y2hhbm5lbCA9IHNvY2stPmNoYW5uZWw7Ci0gIGFjY2VwdF9ycy0+aGFuZGxlID0gc29jay0+aGFuZGxlOwotICBhY2NlcHRfcnMtPmFwcF91aWQgPSBzb2NrLT5hcHBfdWlkOwotICBzb2NrLT5oYW5kbGUgPQotICAgICAgLTE7IC8qIFdlIHNob3VsZCBubyBsb25nZXIgYXNzb2NpYXRlIHRoaXMgaGFuZGxlIHdpdGggdGhlIHNlcnZlciBzb2NrZXQgKi8KLSAgYWNjZXB0X3JzLT5pc19sZV9jb2MgPSBzb2NrLT5pc19sZV9jb2M7Ci0gIGFjY2VwdF9ycy0+dHhfbXR1ID0gc29jay0+dHhfbXR1ID0gcF9vcGVuLT50eF9tdHU7Ci0KLSAgLyogU3dhcCBJRHMgdG8gaGFuZCBvdmVyIHRoZSBHQVAgY29ubmVjdGlvbiB0byB0aGUgYWNjZXB0ZWQgc29ja2V0LCBhbmQgc3RhcnQKLSAgICAgYSBuZXcgc2VydmVyIG9uIHRoZSBuZXdseSBjcmVhdGUgc29ja2V0IElELiAqLwotICB1aW50MzJfdCBuZXdfbGlzdGVuX2lkID0gYWNjZXB0X3JzLT5pZDsKLSAgYWNjZXB0X3JzLT5pZCA9IHNvY2stPmlkOwotICBzb2NrLT5pZCA9IG5ld19saXN0ZW5faWQ7Ci0KLSAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgYWNjZXB0X3JzLT5hZGRyLCBhY2NlcHRfcnMtPmlkLAotICAgICAgYWNjZXB0X3JzLT5pc19sZV9jb2MgPyBCVFNPQ0tfTDJDQVBfTEUgOiBCVFNPQ0tfTDJDQVAsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCwgMCwgMCwKLSAgICAgIGFjY2VwdF9ycy0+YXBwX3VpZCwgYWNjZXB0X3JzLT5jaGFubmVsLAotICAgICAgYWNjZXB0X3JzLT5zZXJ2ZXIgPyBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0xJU1RFTgotICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0NPTk5FQ1RJT04pOwotCi0gIC8vIHN0YXJ0IG1vbml0b3IgdGhlIHNvY2tldAotICBidHNvY2tfdGhyZWFkX2FkZF9mZChwdGgsIHNvY2stPm91cl9mZCwgQlRTT0NLX0wyQ0FQLAotICAgICAgICAgICAgICAgICAgICAgICBTT0NLX1RIUkVBRF9GRF9FWENFUFRJT04sIHNvY2stPmlkKTsKLSAgYnRzb2NrX3RocmVhZF9hZGRfZmQocHRoLCBhY2NlcHRfcnMtPm91cl9mZCwgQlRTT0NLX0wyQ0FQLCBTT0NLX1RIUkVBRF9GRF9SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3JzLT5pZCk7Ci0gIHNlbmRfYXBwX2Nvbm5lY3Rfc2lnbmFsKHNvY2stPm91cl9mZCwgJmFjY2VwdF9ycy0+YWRkciwgc29jay0+Y2hhbm5lbCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3JzLT5hcHBfZmQsIHNvY2stPnJ4X210dSwgcF9vcGVuLT50eF9tdHUpOwotICBhY2NlcHRfcnMtPmFwcF9mZCA9Ci0gICAgICAtMTsgIC8vIFRoZSBmZCBpcyBjbG9zZWQgYWZ0ZXIgc2VudCB0byBhcHAgaW4gc2VuZF9hcHBfY29ubmVjdF9zaWduYWwoKQotICAvLyBCdXQgZm9yIHNvbWUgcmVhc29uIHdlIHN0aWxsIGxlYWsgYSBGRCAtIGVpdGhlciB0aGUgc2VydmVyIHNvY2tldAotICAvLyBvbmUgb3IgdGhlIGFjY2VwdCBzb2NrZXQgb25lLgotICBidHNvY2tfbDJjYXBfc2VydmVyX2xpc3Rlbihzb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgb25fY2xfbDJjYXBfcHNtX2Nvbm5lY3RfbCh0QlRBX0pWX0wyQ0FQX09QRU4qIHBfb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXBfc29ja2V0KiBzb2NrKSB7Ci0gIHNvY2stPmFkZHIgPSBwX29wZW4tPnJlbV9iZGE7Ci0gIHNvY2stPnR4X210dSA9IHBfb3Blbi0+dHhfbXR1OwotCi0gIGlmICghc2VuZF9hcHBfcHNtX29yX2NoYW5fbChzb2NrKSkgewotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHNlbmQgbDJjYXAgc29ja2V0IHRvIGFwcGxpY2F0aW9uIHNvY2tldF9pZDoldSIsCi0gICAgICAgICAgICAgIHNvY2stPmlkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXNlbmRfYXBwX2Nvbm5lY3Rfc2lnbmFsKHNvY2stPm91cl9mZCwgJnNvY2stPmFkZHIsIHNvY2stPmNoYW5uZWwsIDAsIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2stPnJ4X210dSwgcF9vcGVuLT50eF9tdHUpKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY29ubmVjdCBsMmNhcCBzb2NrZXQgdG8gYXBwbGljYXRpb24gc29ja2V0X2lkOiV1IiwKLSAgICAgICAgICAgICAgc29jay0+aWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxvZ19zb2NrZXRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgIHNvY2stPmFkZHIsIHNvY2stPmlkLCBzb2NrLT5pc19sZV9jb2MgPyBCVFNPQ0tfTDJDQVBfTEUgOiBCVFNPQ0tfTDJDQVAsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCwgMCwgMCwKLSAgICAgIHNvY2stPmFwcF91aWQsIHNvY2stPmNoYW5uZWwsCi0gICAgICBzb2NrLT5zZXJ2ZXIgPyBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0xJU1RFTgotICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9DT05ORUNUSU9OKTsKLQotICAvLyBzdGFydCBtb25pdG9yaW5nIHRoZSBzb2NrZXRwYWlyIHRvIGdldCBjYWxsIGJhY2sgd2hlbiBhcHAgd3JpdGluZyBkYXRhCi0gIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgc29jay0+b3VyX2ZkLCBCVFNPQ0tfTDJDQVAsIFNPQ0tfVEhSRUFEX0ZEX1JELAotICAgICAgICAgICAgICAgICAgICAgICBzb2NrLT5pZCk7Ci0gIExPR19JTkZPKCJDb25uZWN0ZWQgbDJjYXAgc29ja2V0IHNvY2tldF9pZDoldSIsIHNvY2stPmlkKTsKLSAgc29jay0+Y29ubmVjdGVkID0gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgb25fbDJjYXBfY29ubmVjdCh0QlRBX0pWKiBwX2RhdGEsIHVpbnQzMl90IGlkKSB7Ci0gIGwyY2FwX3NvY2tldCogc29jazsKLSAgdEJUQV9KVl9MMkNBUF9PUEVOKiBwc21fb3BlbiA9ICZwX2RhdGEtPmwyY19vcGVuOwotICB0QlRBX0pWX0wyQ0FQX0xFX09QRU4qIGxlX29wZW4gPSAmcF9kYXRhLT5sMmNfbGVfb3BlbjsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIHNvY2sgPSBidHNvY2tfbDJjYXBfZmluZF9ieV9pZF9sKGlkKTsKLSAgaWYgKCFzb2NrKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZmluZCBsMmNhcCBzb2NrZXQgd2l0aCBzb2NrZXRfaWQ6JXUiLCBpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc29jay0+dHhfbXR1ID0gbGVfb3Blbi0+dHhfbXR1OwotICBpZiAocHNtX29wZW4tPnN0YXR1cyA9PSBCVEFfSlZfU1VDQ0VTUykgewotICAgIGlmICghc29jay0+c2VydmVyKSB7Ci0gICAgICBvbl9jbF9sMmNhcF9wc21fY29ubmVjdF9sKHBzbV9vcGVuLCBzb2NrKTsKLSAgICB9IGVsc2UgewotICAgICAgb25fc3J2X2wyY2FwX3BzbV9jb25uZWN0X2wocHNtX29wZW4sIHNvY2spOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBvcGVuIHNvY2tldCBhZnRlciByZWNlaXZpbmcgY29ubmVjdGlvbiBzb2NrZXRfaWQ6JXUiLAotICAgICAgICAgICAgICBzb2NrLT5pZCk7Ci0gICAgYnRzb2NrX2wyY2FwX2ZyZWVfbChzb2NrKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBvbl9sMmNhcF9jbG9zZSh0QlRBX0pWX0wyQ0FQX0NMT1NFKiBwX2Nsb3NlLCB1aW50MzJfdCBpZCkgewotICBsMmNhcF9zb2NrZXQqIHNvY2s7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHN0YXRlX2xvY2spOwotICBzb2NrID0gYnRzb2NrX2wyY2FwX2ZpbmRfYnlfaWRfbChpZCk7Ci0gIGlmICghc29jaykgewotICAgIExPR19JTkZPKAotICAgICAgICAiVW5hYmxlIHRvIGZpbmQgcHJvYmFibHkgYWxyZWFkeSBjbG9zZWQgbDJjYXAgc29ja2V0IHdpdGggc29ja2V0X2lkOiV1IiwKLSAgICAgICAgaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxvZ19zb2NrZXRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgIHNvY2stPmFkZHIsIHNvY2stPmlkLCBzb2NrLT5pc19sZV9jb2MgPyBCVFNPQ0tfTDJDQVBfTEUgOiBCVFNPQ0tfTDJDQVAsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIDAsIDAsCi0gICAgICBzb2NrLT5hcHBfdWlkLCBzb2NrLT5jaGFubmVsLAotICAgICAgc29jay0+c2VydmVyID8gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9MSVNURU4KLSAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfQ09OTkVDVElPTik7Ci0KLSAgLy8gVE9ETzogVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGNhbGxlZC4uLgotICAvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyB3aWxsIGJlIGNhbGxlZCBmb3Igbm9uLXNlcnZlciBzb2NrZXRzPwotICBpZiAoc29jay0+c2VydmVyKSB7Ci0gICAgQlRBX0p2RnJlZUNoYW5uZWwoc29jay0+Y2hhbm5lbCwgQlRBX0pWX0NPTk5fVFlQRV9MMkNBUCk7Ci0gIH0KLSAgYnRzb2NrX2wyY2FwX2ZyZWVfbChzb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgb25fbDJjYXBfb3V0Z29pbmdfY29uZ2VzdCh0QlRBX0pWX0wyQ0FQX0NPTkcqIHAsIHVpbnQzMl90IGlkKSB7Ci0gIGwyY2FwX3NvY2tldCogc29jazsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIHNvY2sgPSBidHNvY2tfbDJjYXBfZmluZF9ieV9pZF9sKGlkKTsKLSAgaWYgKCFzb2NrKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZmluZCBsMmNhcCBzb2NrZXQgd2l0aCBzb2NrZXRfaWQ6JXUiLCBpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc29jay0+b3V0Z29pbmdfY29uZ2VzdCA9IHAtPmNvbmcgPyAxIDogMDsKLQotICBpZiAoIXNvY2stPm91dGdvaW5nX2Nvbmdlc3QpIHsKLSAgICBMT0dfVkVSQk9TRSgiTW9uaXRvcmluZyBsMmNhcCBzb2NrZXQgZm9yIG91dGdvaW5nIGRhdGEgc29ja2V0X2lkOiV1IiwKLSAgICAgICAgICAgICAgICBzb2NrLT5pZCk7Ci0gICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocHRoLCBzb2NrLT5vdXJfZmQsIEJUU09DS19MMkNBUCwgU09DS19USFJFQURfRkRfUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc29jay0+aWQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2wyY2FwX3dyaXRlX2RvbmUodWludDE2X3QgbGVuLCB1aW50MzJfdCBpZCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIGwyY2FwX3NvY2tldCogc29jayA9IGJ0c29ja19sMmNhcF9maW5kX2J5X2lkX2woaWQpOwotICBpZiAoIXNvY2spIHsKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIGwyY2FwIHNvY2tldCB3aXRoIHNvY2tldF9pZDoldSIsIGlkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQgYXBwX3VpZCA9IHNvY2stPmFwcF91aWQ7Ci0gIGlmICghc29jay0+b3V0Z29pbmdfY29uZ2VzdCkgewotICAgIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgc29jay0+b3VyX2ZkLCBCVFNPQ0tfTDJDQVAsIFNPQ0tfVEhSRUFEX0ZEX1JELAotICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2stPmlkKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiU29ja2V0IGNvbmdlc3Rpb24gb24gc29ja2V0X2lkOiV1Iiwgc29jay0+aWQpOwotICB9Ci0KLSAgc29jay0+dHhfYnl0ZXMgKz0gbGVuOwotICB1aWRfc2V0X2FkZF90eCh1aWRfc2V0LCBhcHBfdWlkLCBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBvbl9sMmNhcF9kYXRhX2luZCh0QlRBX0pWKiBldnQsIHVpbnQzMl90IGlkKSB7Ci0gIGwyY2FwX3NvY2tldCogc29jazsKLQotICBpbnQgYXBwX3VpZCA9IC0xOwotICB1aW50MzJfdCBieXRlc19yZWFkID0gMDsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIHNvY2sgPSBidHNvY2tfbDJjYXBfZmluZF9ieV9pZF9sKGlkKTsKLSAgaWYgKCFzb2NrKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZmluZCBsMmNhcCBzb2NrZXQgd2l0aCBzb2NrZXRfaWQ6JXUiLCBpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXBwX3VpZCA9IHNvY2stPmFwcF91aWQ7Ci0KLSAgdWludDMyX3QgY291bnQ7Ci0KLSAgaWYgKEJUQV9KdkwyY2FwUmVhZHkoc29jay0+aGFuZGxlLCAmY291bnQpID09IEJUQV9KVl9TVUNDRVNTKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKGNvdW50KTsKLSAgICBpZiAoQlRBX0p2TDJjYXBSZWFkKHNvY2stPmhhbmRsZSwgc29jay0+aWQsIGJ1ZmZlci5kYXRhKCksIGNvdW50KSA9PQotICAgICAgICBCVEFfSlZfU1VDQ0VTUykgewotICAgICAgaWYgKHBhY2tldF9wdXRfdGFpbF9sKHNvY2ssIGJ1ZmZlci5kYXRhKCksIGNvdW50KSkgewotICAgICAgICBieXRlc19yZWFkID0gY291bnQ7Ci0gICAgICAgIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgc29jay0+b3VyX2ZkLCBCVFNPQ0tfTDJDQVAsIFNPQ0tfVEhSRUFEX0ZEX1dSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrLT5pZCk7Ci0gICAgICB9IGVsc2UgeyAgLy8gY29ubmVjdGlvbiBtdXN0IGJlIGRyb3BwZWQKLSAgICAgICAgTE9HX1dBUk4oIkNsb3Npbmcgc29ja2V0IGFzIHVuYWJsZSB0byBwdXNoIGRhdGEgdG8gc29ja2V0IHNvY2tldF9pZDoldSIsCi0gICAgICAgICAgICAgICAgIHNvY2stPmlkKTsKLSAgICAgICAgQlRBX0p2TDJjYXBDbG9zZShzb2NrLT5oYW5kbGUpOwotICAgICAgICBidHNvY2tfbDJjYXBfZnJlZV9sKHNvY2spOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc29jay0+cnhfYnl0ZXMgKz0gYnl0ZXNfcmVhZDsKLSAgdWlkX3NldF9hZGRfcngodWlkX3NldCwgYXBwX3VpZCwgYnl0ZXNfcmVhZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c29ja19sMmNhcF9jYmsodEJUQV9KVl9FVlQgZXZlbnQsIHRCVEFfSlYqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9KVl9MMkNBUF9TVEFSVF9FVlQ6Ci0gICAgICBvbl9zcnZfbDJjYXBfbGlzdGVuX3N0YXJ0ZWQoJnBfZGF0YS0+bDJjX3N0YXJ0LCBsMmNhcF9zb2NrZXRfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9MMkNBUF9DTF9JTklUX0VWVDoKLSAgICAgIG9uX2NsX2wyY2FwX2luaXQoJnBfZGF0YS0+bDJjX2NsX2luaXQsIGwyY2FwX3NvY2tldF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX0wyQ0FQX09QRU5fRVZUOgotICAgICAgb25fbDJjYXBfY29ubmVjdChwX2RhdGEsIGwyY2FwX3NvY2tldF9pZCk7Ci0gICAgICBCVEFfSnZTZXRQbVByb2ZpbGUocF9kYXRhLT5sMmNfb3Blbi5oYW5kbGUsIEJUQV9KVl9QTV9JRF8xLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9KVl9DT05OX09QRU4pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9MMkNBUF9DTE9TRV9FVlQ6Ci0gICAgICBvbl9sMmNhcF9jbG9zZSgmcF9kYXRhLT5sMmNfY2xvc2UsIGwyY2FwX3NvY2tldF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX0wyQ0FQX0RBVEFfSU5EX0VWVDoKLSAgICAgIG9uX2wyY2FwX2RhdGFfaW5kKHBfZGF0YSwgbDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSlZfTDJDQVBfUkVBRF9FVlQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX0wyQ0FQX1dSSVRFX0VWVDoKLSAgICAgIG9uX2wyY2FwX3dyaXRlX2RvbmUocF9kYXRhLT5sMmNfd3JpdGUubGVuLCBsMmNhcF9zb2NrZXRfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9MMkNBUF9DT05HX0VWVDoKLSAgICAgIG9uX2wyY2FwX291dGdvaW5nX2Nvbmdlc3QoJnBfZGF0YS0+bDJjX2NvbmcsIGwyY2FwX3NvY2tldF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlVuaGFuZGxlZCBldmVudDolaHUgbDJjYXBfc29ja2V0X2lkOiV1IiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgbDJjYXBfc29ja2V0X2lkKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLWNvbnN0IHRMMkNBUF9FUlRNX0lORk8gb2JleF9sMmNfZXRtX29wdCA9IHtMMkNBUF9GQ1JfRVJUTV9NT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hbmRhdG9yeSBmb3IgT0JFWCBvdmVyIGwyY2FwICovfTsKLQotLyoqCi0gKiBXaGVuIHVzaW5nIGEgZHluYW1pYyBQU00sIGEgUFNNIGFsbG9jYXRpb24gaXMgcmVxdWVzdGVkIGZyb20KLSAqIGJ0c29ja19sMmNhcF9saXN0ZW5fb3JfY29ubmVjdCgpLgotICogVGhlIFBTTSBhbGxvY2F0aW9uIGV2ZW50IGlzIHJlZmVpdmVkIGluIHRoZSBKVi1jYWxsYmFjayAtIGN1cnJlbnRseSBsb2NhdGVkCi0gKiBpbiBSRkMtY29kZSAtCi0gKiBhbmQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3bHkgYWxsb2NhdGVkIFBTTS4KLSAqLwotdm9pZCBvbl9sMmNhcF9wc21fYXNzaWduZWQoaW50IGlkLCBpbnQgcHNtKSB7Ci0gIC8qIFNldHVwIEVUTSBzZXR0aW5nczoKLSAgICogIG10dSB3aWxsIGJlIHNldCBiZWxvdyAqLwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIGwyY2FwX3NvY2tldCogc29jayA9IGJ0c29ja19sMmNhcF9maW5kX2J5X2lkX2woaWQpOwotICBpZiAoIXNvY2spIHsKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIGwyY2FwIHNvY2tldCB3aXRoIHNvY2tldF9pZDoldSIsIGlkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzb2NrLT5jaGFubmVsID0gcHNtOwotCi0gIGJ0c29ja19sMmNhcF9zZXJ2ZXJfbGlzdGVuKHNvY2spOwotfQotCi1zdGF0aWMgdm9pZCBidHNvY2tfbDJjYXBfc2VydmVyX2xpc3RlbihsMmNhcF9zb2NrZXQqIHNvY2spIHsKLSAgaW50IGNvbm5lY3Rpb25fdHlwZSA9Ci0gICAgICBzb2NrLT5pc19sZV9jb2MgPyBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQX0xFIDogQlRBX0pWX0NPTk5fVFlQRV9MMkNBUDsKLQotICAvKiBJZiB3ZSBoYXZlIGEgY2hhbm5lbCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QsIGp1c3Qgc3RhcnQgdGhlIHNlcnZlciwKLSAgICogZWxzZSB3ZSByZXF1ZXN0IGEgUFNNIGFuZCBzdGFydCB0aGUgc2VydmVyIGFmdGVyIHdlIHJlY2VpdmUgYSBQU00uICovCi0gIGlmIChzb2NrLT5jaGFubmVsIDw9IDApIHsKLSAgICBCVEFfSnZHZXRDaGFubmVsSWQoY29ubmVjdGlvbl90eXBlLCBzb2NrLT5pZCwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogU2V0dXAgRVRNIHNldHRpbmdzOiBtdHUgd2lsbCBiZSBzZXQgYmVsb3cgKi8KLSAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9DRkdfSU5GTz4gY2ZnID0gc3RkOjptYWtlX3VuaXF1ZTx0TDJDQVBfQ0ZHX0lORk8+KAotICAgICAgdEwyQ0FQX0NGR19JTkZPey5mY3JfcHJlc2VudCA9IHRydWUsIC5mY3IgPSBrRGVmYXVsdEVydG1PcHRpb25zfSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9FUlRNX0lORk8+IGVydG1faW5mbzsKLSAgaWYgKCFzb2NrLT5pc19sZV9jb2MpIHsKLSAgICBlcnRtX2luZm8ucmVzZXQobmV3IHRMMkNBUF9FUlRNX0lORk8ob2JleF9sMmNfZXRtX29wdCkpOwotICB9Ci0KLSAgQlRBX0p2TDJjYXBTdGFydFNlcnZlcihjb25uZWN0aW9uX3R5cGUsIHNvY2stPnNlY3VyaXR5LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShlcnRtX2luZm8pLCBzb2NrLT5jaGFubmVsLCBzb2NrLT5yeF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNmZyksIGJ0c29ja19sMmNhcF9jYmssIHNvY2stPmlkKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGJ0c29ja19sMmNhcF9saXN0ZW5fb3JfY29ubmVjdChjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwgaW50KiBzb2NrX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGNoYXIgbGlzdGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwX3VpZCkgewotICBib29sIGlzX2xlX2NvYyA9IChmbGFncyAmIEJUU09DS19GTEFHX0xFX0NPQykgIT0gMDsKLQotICBpZiAoIXNvY2tfZmQpIHsKLSAgICBMT0dfSU5GTygiSW52YWxpZCBzb2NrZXQgZGVzY3JpcHRvciIpOwotICAgIHJldHVybiBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOwotICB9Ci0KLSAgaWYgKCFpc19pbml0ZWQoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgLy8gVE9ETzogVGhpcyBpcyBraW5kIG9mIGJhZCB0byBsb2NrIGhlcmUsIGJ1dCBpdCBpcyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50Ci0gIC8vIGRlc2lnbi4KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHN0YXRlX2xvY2spOwotICBsMmNhcF9zb2NrZXQqIHNvY2sgPSBidHNvY2tfbDJjYXBfYWxsb2NfbChuYW1lLCBhZGRyLCBsaXN0ZW4sIGZsYWdzKTsKLSAgaWYgKCFzb2NrKSB7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT01FTTsKLSAgfQotCi0gIHNvY2stPmNoYW5uZWwgPSBjaGFubmVsOwotICBzb2NrLT5hcHBfdWlkID0gYXBwX3VpZDsKLSAgc29jay0+aXNfbGVfY29jID0gaXNfbGVfY29jOwotICBzb2NrLT5yeF9tdHUgPSBpc19sZV9jb2MgPyBMMkNBUF9TRFVfTEVOR1RIX0xFX01BWCA6IEwyQ0FQX1NEVV9MRU5HVEhfTUFYOwotCi0gIC8qICJyb2xlIiBpcyBuZXZlciBpbml0aWFsaXplZCBpbiByZmNvbW0gY29kZSAqLwotICBpZiAobGlzdGVuKSB7Ci0gICAgYnRzb2NrX2wyY2FwX3NlcnZlcl9saXN0ZW4oc29jayk7Ci0gIH0gZWxzZSB7Ci0gICAgICBpbnQgY29ubmVjdGlvbl90eXBlID0KLSAgICAgICAgICBzb2NrLT5pc19sZV9jb2MgPyBCVEFfSlZfQ09OTl9UWVBFX0wyQ0FQX0xFIDogQlRBX0pWX0NPTk5fVFlQRV9MMkNBUDsKLQotICAgICAgLyogU2V0dXAgRVRNIHNldHRpbmdzOiBtdHUgd2lsbCBiZSBzZXQgYmVsb3cgKi8KLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0TDJDQVBfQ0ZHX0lORk8+IGNmZyA9IHN0ZDo6bWFrZV91bmlxdWU8dEwyQ0FQX0NGR19JTkZPPigKLSAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk97LmZjcl9wcmVzZW50ID0gdHJ1ZSwgLmZjciA9IGtEZWZhdWx0RXJ0bU9wdGlvbnN9KTsKLQotICAgICAgc3RkOjp1bmlxdWVfcHRyPHRMMkNBUF9FUlRNX0lORk8+IGVydG1faW5mbzsKLSAgICAgIGlmICghc29jay0+aXNfbGVfY29jKSB7Ci0gICAgICAgIGVydG1faW5mby5yZXNldChuZXcgdEwyQ0FQX0VSVE1fSU5GTyhvYmV4X2wyY19ldG1fb3B0KSk7Ci0gICAgICB9Ci0KLSAgICAgIEJUQV9KdkwyY2FwQ29ubmVjdCgKLSAgICAgICAgICBjb25uZWN0aW9uX3R5cGUsIHNvY2stPnNlY3VyaXR5LCAwLCBzdGQ6Om1vdmUoZXJ0bV9pbmZvKSwgY2hhbm5lbCwKLSAgICAgICAgICBzb2NrLT5yeF9tdHUsIHN0ZDo6bW92ZShjZmcpLCBzb2NrLT5hZGRyLCBidHNvY2tfbDJjYXBfY2JrLCBzb2NrLT5pZCk7Ci0gIH0KLQotICAqc29ja19mZCA9IHNvY2stPmFwcF9mZDsKLSAgLyogV2UgcGFzcyB0aGUgRkQgdG8gSkFWQSwgYnV0IHNpbmNlIGl0IHJ1bnMgaW4gYW5vdGhlciBwcm9jZXNzLCB3ZSBuZWVkIHRvCi0gICAqIGFsc28gY2xvc2UgaXQgaW4gbmF0aXZlLCBlaXRoZXIgc3RyYWlnaHQgYXdheSwgYXMgZG9uZSB3aGVuIGFjY2VwdGluZyBhbgotICAgKiBpbmNvbWluZyBjb25uZWN0aW9uLCBvciB3aGVuIGRvaW5nIGNsZWFudXAgYWZ0ZXIgdGhpcyBzb2NrZXQgKi8KLSAgc29jay0+YXBwX2ZkID0gLTE7Ci0gIC8qVGhpcyBsZWFrcyB0aGUgZmlsZSBkZXNjcmlwdG9yLiBUaGUgRkQgc2hvdWxkIGJlIGNsb3NlZCBpbiBKQVZBIGJ1dCBpdAotICAgKiBhcHBhcmVudGx5IGRvIG5vdCB3b3JrICovCi0gIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgc29jay0+b3VyX2ZkLCBCVFNPQ0tfTDJDQVAsCi0gICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfVEhSRUFEX0ZEX0VYQ0VQVElPTiwgc29jay0+aWQpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgYnRzb2NrX2wyY2FwX2xpc3Rlbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgY2hhbm5lbCwgaW50KiBzb2NrX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBhcHBfdWlkKSB7Ci0gIHJldHVybiBidHNvY2tfbDJjYXBfbGlzdGVuX29yX2Nvbm5lY3QobmFtZSwgTlVMTCwgY2hhbm5lbCwgc29ja19mZCwgZmxhZ3MsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX3VpZCk7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0c29ja19sMmNhcF9jb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzb2NrX2ZkLCBpbnQgZmxhZ3MsIGludCBhcHBfdWlkKSB7Ci0gIHJldHVybiBidHNvY2tfbDJjYXBfbGlzdGVuX29yX2Nvbm5lY3QoTlVMTCwgYmRfYWRkciwgY2hhbm5lbCwgc29ja19mZCwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYXBwX3VpZCk7Ci19Ci0KLS8qIHJldHVybiB0cnVlIGlmIHdlIGhhdmUgbW9yZSB0byBzZW5kIGFuZCBzaG91bGQgd2FpdCBmb3IgdXNlciByZWFkaW5lc3MsIGZhbHNlCi0gKiBlbHNlCi0gKiAoZm9yIGV4YW1wbGU6IHVucmVjb3ZlcmFibGUgZXJyb3Igb3Igbm8gZGF0YSkKLSAqLwotc3RhdGljIGJvb2wgZmx1c2hfaW5jb21pbmdfcXVlX29uX3dyX3NpZ25hbF9sKGwyY2FwX3NvY2tldCogc29jaykgewotICB1aW50OF90KiBidWY7Ci0gIHVpbnQzMl90IGxlbjsKLQotICB3aGlsZSAocGFja2V0X2dldF9oZWFkX2woc29jaywgJmJ1ZiwgJmxlbikpIHsKLSAgICBzc2l6ZV90IHNlbnQ7Ci0gICAgT1NJX05PX0lOVFIoc2VudCA9IHNlbmQoc29jay0+b3VyX2ZkLCBidWYsIGxlbiwgTVNHX0RPTlRXQUlUKSk7Ci0gICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0KLSAgICBpZiAoc2VudCA9PSAoc2lnbmVkKWxlbikKLSAgICAgIG9zaV9mcmVlKGJ1Zik7Ci0gICAgZWxzZSBpZiAoc2VudCA+PSAwKSB7Ci0gICAgICBwYWNrZXRfcHV0X2hlYWRfbChzb2NrLCBidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKLSAgICAgIG9zaV9mcmVlKGJ1Zik7Ci0gICAgICBpZiAoIXNlbnQpIC8qIHNwZWNpYWwgY2FzZSBpZiBvdGhlciBlbmQgbm90IGtlZXBpbmcgdXAgKi8KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhY2tldF9wdXRfaGVhZF9sKHNvY2ssIGJ1ZiwgbGVuKTsKLSAgICAgIG9zaV9mcmVlKGJ1Zik7Ci0gICAgICByZXR1cm4gc2F2ZWRfZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgc2F2ZWRfZXJybm8gPT0gRUFHQUlOOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotaW5saW5lIEJUX0hEUiogbWFsbG9jX2wyY2FwX2J1Zih1aW50MTZfdCBsZW4pIHsKLSAgLy8gV2UgbmVlZCBGQ1Mgb25seSBmb3IgTDJDQVBfRkNSX0VSVE1fTU9ERSwgYnV0IGl0J3MganVzdCAyIGJ5dGVzIHNvIGl0J3Mgb2sKLSAgQlRfSERSKiBtc2cgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJUX0hEUl9TSVpFICsgTDJDQVBfTUlOX09GRlNFVCArIGxlbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9GQ1NfTEVOR1RIKTsKLSAgbXNnLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBtc2ctPmxlbiA9IGxlbjsKLSAgcmV0dXJuIG1zZzsKLX0KLQotaW5saW5lIHVpbnQ4X3QqIGdldF9sMmNhcF9zZHVfc3RhcnRfcHRyKEJUX0hEUiogbXNnKSB7Ci0gIHJldHVybiAodWludDhfdCopKG1zZykgKyBCVF9IRFJfU0laRSArIG1zZy0+b2Zmc2V0OwotfQotCi12b2lkIGJ0c29ja19sMmNhcF9zaWduYWxlZChpbnQgZmQsIGludCBmbGFncywgdWludDMyX3QgdXNlcl9pZCkgewotICBjaGFyIGRyb3BfaXQgPSBmYWxzZTsKLQotICAvKiBXZSB1c2UgTVNHX0RPTlRXQUlUIHdoZW4gc2VuZGluZyBkYXRhIHRvIEpBVkEsIGhlbmNlIGl0IGNhbiBiZSBhY2NlcHRlZCB0bwotICAgKiBob2xkIHRoZSBsb2NrLiAqLwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdGVfbG9jayk7Ci0gIGwyY2FwX3NvY2tldCogc29jayA9IGJ0c29ja19sMmNhcF9maW5kX2J5X2lkX2wodXNlcl9pZCk7Ci0gIGlmICghc29jaykgcmV0dXJuOwotCi0gIGlmICgoZmxhZ3MgJiBTT0NLX1RIUkVBRF9GRF9SRCkgJiYgIXNvY2stPnNlcnZlcikgewotICAgIC8vIGFwcCBzZW5kaW5nIGRhdGEKLSAgICBpZiAoc29jay0+Y29ubmVjdGVkKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBib29sIGlvY3RsX3N1Y2Nlc3MgPSBpb2N0bChzb2NrLT5vdXJfZmQsIEZJT05SRUFELCAmc2l6ZSkgPT0gMDsKLSAgICAgIGlmICghKGZsYWdzICYgU09DS19USFJFQURfRkRfRVhDRVBUSU9OKSB8fCAoaW9jdGxfc3VjY2VzcyAmJiBzaXplKSkgewotICAgICAgICAvKiBGSU9OUkVBRCByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBmb3IKLSAgICAgICAgICAgcmVhZGluZywgbWlnaHQgYmUgYmlnZ2VyIHRoYW4gYXdhaXRpbmcgcGFja2V0LgotCi0gICAgICAgICAgIEJsdWV0b290aFNvY2tldC53cml0ZSguLi4pIGd1YXJhbnRlZXMgdGhhdCBhbnkgcGFja2V0IHNlbmQgdG8gdGhpcwotICAgICAgICAgICBzb2NrZXQgaXMgYnJva2VuIGludG8gcGllY2VzIG5vIGJpZ2dlciB0aGFuIE1UVSBieXRlcyAoYXMgcmVxdWVzdGVkCi0gICAgICAgICAgIGJ5IEJUIHNwZWMpLiAqLwotICAgICAgICBzaXplID0gc3RkOjptaW4oc2l6ZSwgKGludClzb2NrLT50eF9tdHUpOwotCi0gICAgICAgIEJUX0hEUiogYnVmZmVyID0gbWFsbG9jX2wyY2FwX2J1ZihzaXplKTsKLSAgICAgICAgLyogVGhlIHNvY2tldCBpcyBjcmVhdGVkIHdpdGggU09DS19TRVFQQUNLRVQsIGhlbmNlIHdlIHJlYWQgb25lIG1lc3NhZ2UKLSAgICAgICAgICogYXQgdGhlIHRpbWUuICovCi0gICAgICAgIHNzaXplX3QgY291bnQ7Ci0gICAgICAgIE9TSV9OT19JTlRSKGNvdW50ID0gcmVjdihmZCwgZ2V0X2wyY2FwX3NkdV9zdGFydF9wdHIoYnVmZmVyKSwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19OT1NJR05BTCB8IE1TR19ET05UV0FJVCB8IE1TR19UUlVOQykpOwotICAgICAgICBpZiAoY291bnQgPiBzb2NrLT50eF9tdHUpIHsKLSAgICAgICAgICAvKiBUaGlzIGNhbid0IGhhcHBlbiB0aGFua3MgdG8gY2hlY2sgaW4gQmx1ZXRvb3RoU29ja2V0LmphdmEgYnV0IGxlYXZlCi0gICAgICAgICAgICogdGhpcyBpbiBjYXNlIHRoaXMgc29ja2V0IGlzIGV2ZXIgdXNlZCBhbnl3aGVyZSBlbHNlKi8KLSAgICAgICAgICBMT0coRVJST1IpIDw8ICJyZWN2IG1vcmUgdGhhbiBNVFUuIERhdGEgd2lsbCBiZSBsb3N0OiAiIDw8IGNvdW50OwotICAgICAgICAgIGNvdW50ID0gc29jay0+dHhfbXR1OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV2hlbiBtdWx0aXBsZSBwYWNrZXRzIHNtYWxsZXIgdGhhbiBNVFUgYXJlIGZsdXNoZWQgdG8gdGhlIHNvY2tldCwgdGhlCi0gICAgICAgICAgIHNpemUgb2YgdGhlIHNpbmdsZSBwYWNrZXQgcmVhZCBjb3VsZCBiZSBzbWFsbGVyIHRoYW4gdGhlIGlvY3RsCi0gICAgICAgICAgIHJlcG9ydGVkIHRvdGFsIHNpemUgb2YgYXdhaXRpbmcgcGFja2V0cy4gSGVuY2UsIHdlIGFkanVzdCB0aGUgYnVmZmVyCi0gICAgICAgICAgIGxlbmd0aC4gKi8KLSAgICAgICAgYnVmZmVyLT5sZW4gPSBjb3VudDsKLSAgICAgICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogYnl0ZXMgcmVjZWl2ZWQgZnJvbSBzb2NrZXQ6ICIgPDwgY291bnQ7Ci0KLSAgICAgICAgLy8gd2lsbCB0YWtlIGNhcmUgb2YgZnJlZWluZyBidWZmZXIKLSAgICAgICAgQlRBX0p2TDJjYXBXcml0ZShzb2NrLT5oYW5kbGUsIFBUUl9UT19VSU5UKGJ1ZmZlciksIGJ1ZmZlciwgdXNlcl9pZCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICBkcm9wX2l0ID0gdHJ1ZTsKLSAgfQotICBpZiAoZmxhZ3MgJiBTT0NLX1RIUkVBRF9GRF9XUikgewotICAgIC8vIGFwcCBpcyByZWFkeSB0byByZWNlaXZlIG1vcmUgZGF0YSwgdGVsbCBzdGFjayB0byBlbmFibGUgdGhlIGRhdGEgZmxvdwotICAgIGlmIChmbHVzaF9pbmNvbWluZ19xdWVfb25fd3Jfc2lnbmFsX2woc29jaykgJiYgc29jay0+Y29ubmVjdGVkKQotICAgICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocHRoLCBzb2NrLT5vdXJfZmQsIEJUU09DS19MMkNBUCwgU09DS19USFJFQURfRkRfV1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrLT5pZCk7Ci0gIH0KLSAgaWYgKGRyb3BfaXQgfHwgKGZsYWdzICYgU09DS19USFJFQURfRkRfRVhDRVBUSU9OKSkgewotICAgIGludCBzaXplID0gMDsKLSAgICBpZiAoZHJvcF9pdCB8fCBpb2N0bChzb2NrLT5vdXJfZmQsIEZJT05SRUFELCAmc2l6ZSkgIT0gMCB8fCBzaXplID09IDApCi0gICAgICBidHNvY2tfbDJjYXBfZnJlZV9sKHNvY2spOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX3NvY2tfcmZjLmNjIGIvYnRpZi9zcmMvYnRpZl9zb2NrX3JmYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0ODU1OC4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3NvY2tfcmZjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9zb2NrX3JmY29tbSIKLQotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvZW51bXMucGIuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2p2X2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX21ldHJpY3NfbG9nZ2luZy5oIgotLyogVGhlIEpWIGludGVyZmFjZSBjYW4gaGF2ZSBvbmx5IG9uZSB1c2VyLCBoZW5jZSB3ZSBuZWVkIHRvIGNhbGwgYSBmZXcKLSAqIEwyQ0FQIGZ1bmN0aW9ucyBmcm9tIHRoaXMgZmlsZS4gKi8KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zb2NrX2wyY2FwLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc29ja19zZHAuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zb2NrX3RocmVhZC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3NvY2tfdXRpbC5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3VpZC5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfc29jay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xpc3QuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIElOVkFMSURfRkQKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotLy8gTWF4aW11bSBudW1iZXIgb2YgUkZDT01NIGNoYW5uZWxzICgxLTMwIGluY2x1c2l2ZSkuCi0jZGVmaW5lIE1BWF9SRkNfQ0hBTk5FTCAzMAotCi0vLyBNYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHdlIGNhbiBoYXZlIGFuIFJGQ09NTSBjb25uZWN0aW9uIHdpdGguCi0jZGVmaW5lIE1BWF9SRkNfU0VTU0lPTiA3Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IG91dGdvaW5nX2Nvbmdlc3QgOiAxOwotICBpbnQgcGVuZGluZ19zZHBfcmVxdWVzdCA6IDE7Ci0gIGludCBkb2luZ19zZHBfcmVxdWVzdCA6IDE7Ci0gIGludCBzZXJ2ZXIgOiAxOwotICBpbnQgY29ubmVjdGVkIDogMTsKLSAgaW50IGNsb3NpbmcgOiAxOwotfSBmbGFnc190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGZsYWdzX3QgZjsKLSAgdWludDMyX3QgaWQ7ICAvLyBOb24temVybyBpbmRpY2F0ZXMgYSB2YWxpZCAoaW4tdXNlKSBzbG90LgotICBpbnQgc2VjdXJpdHk7Ci0gIGludCBzY247ICAvLyBTZXJ2ZXIgY2hhbm5lbCBudW1iZXIKLSAgaW50IHNjbl9ub3RpZmllZDsKLSAgUmF3QWRkcmVzcyBhZGRyOwotICBpbnQgaXNfc2VydmljZV91dWlkX3ZhbGlkOwotICBVdWlkIHNlcnZpY2VfdXVpZDsKLSAgY2hhciBzZXJ2aWNlX25hbWVbMjU2XTsKLSAgaW50IGZkOwotICBpbnQgYXBwX2ZkOyAgIC8vIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUgaGFsZiBvZiB0aGUgc29ja2V0cGFpciB0aGF0J3Mgc2VudAotICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gdXBwZXIgbGF5ZXJzLgotICBpbnQgYXBwX3VpZDsgIC8vIFVJRCBvZiB0aGUgYXBwIGZvciB3aGljaCB0aGlzIHNvY2tldCB3YXMgY3JlYXRlZC4KLSAgaW50IG10dTsKLSAgdWludDhfdCogcGFja2V0OwotICBpbnQgc2RwX2hhbmRsZTsKLSAgaW50IHJmY19oYW5kbGU7Ci0gIGludCByZmNfcG9ydF9oYW5kbGU7Ci0gIGludCByb2xlOwotICBsaXN0X3QqIGluY29taW5nX3F1ZXVlOwotICAvLyBDdW11bGF0aXZlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIHNvY2tldAotICBpbnQ2NF90IHR4X2J5dGVzOwotICAvLyBDdW11bGF0aXZlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiB0aGlzIHNvY2tldAotICBpbnQ2NF90IHJ4X2J5dGVzOwotfSByZmNfc2xvdF90OwotCi1zdGF0aWMgcmZjX3Nsb3RfdCByZmNfc2xvdHNbTUFYX1JGQ19DSEFOTkVMXTsKLXN0YXRpYyB1aW50MzJfdCByZmNfc2xvdF9pZDsKLXN0YXRpYyB2b2xhdGlsZSBpbnQgcHRoID0gLTE7ICAvLyBwb2xsIHRocmVhZCBoYW5kbGUKLXN0YXRpYyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBzbG90X2xvY2s7Ci1zdGF0aWMgdWlkX3NldF90KiB1aWRfc2V0ID0gTlVMTDsKLQotc3RhdGljIHJmY19zbG90X3QqIGZpbmRfZnJlZV9zbG90KHZvaWQpOwotc3RhdGljIHZvaWQgY2xlYW51cF9yZmNfc2xvdChyZmNfc2xvdF90KiBycyk7Ci1zdGF0aWMgdm9pZCBqdl9kbV9jYmFjayh0QlRBX0pWX0VWVCBldmVudCwgdEJUQV9KViogcF9kYXRhLCB1aW50MzJfdCBpZCk7Ci1zdGF0aWMgdWludDMyX3QgcmZjb21tX2NiYWNrKHRCVEFfSlZfRVZUIGV2ZW50LCB0QlRBX0pWKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKTsKLXN0YXRpYyBib29sIHNlbmRfYXBwX3NjbihyZmNfc2xvdF90KiBycyk7Ci0KLXN0YXRpYyBib29sIGlzX2luaXRfZG9uZSh2b2lkKSB7IHJldHVybiBwdGggIT0gLTE7IH0KLQotYnRfc3RhdHVzX3QgYnRzb2NrX3JmY19pbml0KGludCBwb2xsX3RocmVhZF9oYW5kbGUsIHVpZF9zZXRfdCogc2V0KSB7Ci0gIHB0aCA9IHBvbGxfdGhyZWFkX2hhbmRsZTsKLSAgdWlkX3NldCA9IHNldDsKLQotICBtZW1zZXQocmZjX3Nsb3RzLCAwLCBzaXplb2YocmZjX3Nsb3RzKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZmNfc2xvdHMpOyArK2kpIHsKLSAgICByZmNfc2xvdHNbaV0uc2NuID0gLTE7Ci0gICAgcmZjX3Nsb3RzW2ldLnNkcF9oYW5kbGUgPSAwOwotICAgIHJmY19zbG90c1tpXS5mZCA9IElOVkFMSURfRkQ7Ci0gICAgcmZjX3Nsb3RzW2ldLmFwcF9mZCA9IElOVkFMSURfRkQ7Ci0gICAgcmZjX3Nsb3RzW2ldLmluY29taW5nX3F1ZXVlID0gbGlzdF9uZXcob3NpX2ZyZWUpOwotICAgIENIRUNLKHJmY19zbG90c1tpXS5pbmNvbWluZ19xdWV1ZSAhPSBOVUxMKTsKLSAgfQotCi0gIEJUQV9KdkVuYWJsZShqdl9kbV9jYmFjayk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIGJ0c29ja19yZmNfY2xlYW51cCh2b2lkKSB7Ci0gIHB0aCA9IC0xOwotICB1aWRfc2V0ID0gTlVMTDsKLQotICBCVEFfSnZEaXNhYmxlKCk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUocmZjX3Nsb3RzKTsgKytpKSB7Ci0gICAgaWYgKHJmY19zbG90c1tpXS5pZCkgY2xlYW51cF9yZmNfc2xvdCgmcmZjX3Nsb3RzW2ldKTsKLSAgICBsaXN0X2ZyZWUocmZjX3Nsb3RzW2ldLmluY29taW5nX3F1ZXVlKTsKLSAgICByZmNfc2xvdHNbaV0uaW5jb21pbmdfcXVldWUgPSBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyByZmNfc2xvdF90KiBmaW5kX2ZyZWVfc2xvdCh2b2lkKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZmNfc2xvdHMpOyArK2kpCi0gICAgaWYgKHJmY19zbG90c1tpXS5mZCA9PSBJTlZBTElEX0ZEKSByZXR1cm4gJnJmY19zbG90c1tpXTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyByZmNfc2xvdF90KiBmaW5kX3JmY19zbG90X2J5X2lkKHVpbnQzMl90IGlkKSB7Ci0gIENIRUNLKGlkICE9IDApOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZmNfc2xvdHMpOyArK2kpCi0gICAgaWYgKHJmY19zbG90c1tpXS5pZCA9PSBpZCkgcmV0dXJuICZyZmNfc2xvdHNbaV07Ci0KLSAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gZmluZCBSRkNPTU0gc2xvdCBpZDogJXUiLCBfX2Z1bmNfXywgaWQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHJmY19zbG90X3QqIGZpbmRfcmZjX3Nsb3RfYnlfcGVuZGluZ19zZHAodm9pZCkgewotICB1aW50MzJfdCBtaW5faWQgPSBVSU5UMzJfTUFYOwotICBpbnQgc2xvdCA9IC0xOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUocmZjX3Nsb3RzKTsgKytpKQotICAgIGlmIChyZmNfc2xvdHNbaV0uaWQgJiYgcmZjX3Nsb3RzW2ldLmYucGVuZGluZ19zZHBfcmVxdWVzdCAmJgotICAgICAgICByZmNfc2xvdHNbaV0uaWQgPCBtaW5faWQpIHsKLSAgICAgIG1pbl9pZCA9IHJmY19zbG90c1tpXS5pZDsKLSAgICAgIHNsb3QgPSBpOwotICAgIH0KLQotICByZXR1cm4gKHNsb3QgPT0gLTEpID8gTlVMTCA6ICZyZmNfc2xvdHNbc2xvdF07Ci19Ci0KLXN0YXRpYyBib29sIGlzX3JlcXVlc3Rpbmdfc2RwKHZvaWQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJmY19zbG90cyk7ICsraSkKLSAgICBpZiAocmZjX3Nsb3RzW2ldLmlkICYmIHJmY19zbG90c1tpXS5mLmRvaW5nX3NkcF9yZXF1ZXN0KSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgcmZjX3Nsb3RfdCogYWxsb2NfcmZjX3Nsb3QoY29uc3QgUmF3QWRkcmVzcyogYWRkciwgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVdWlkJiB1dWlkLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VydmVyKSB7Ci0gIGludCBzZWN1cml0eSA9IDA7Ci0gIGlmIChmbGFncyAmIEJUU09DS19GTEFHX0VOQ1JZUFQpCi0gICAgc2VjdXJpdHkgfD0gc2VydmVyID8gQlRNX1NFQ19JTl9FTkNSWVBUIDogQlRNX1NFQ19PVVRfRU5DUllQVDsKLSAgaWYgKGZsYWdzICYgQlRTT0NLX0ZMQUdfQVVUSCkKLSAgICBzZWN1cml0eSB8PSBzZXJ2ZXIgPyBCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSA6IEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURTsKLSAgaWYgKGZsYWdzICYgQlRTT0NLX0ZMQUdfQVVUSF9NSVRNKQotICAgIHNlY3VyaXR5IHw9IHNlcnZlciA/IEJUTV9TRUNfSU5fTUlUTSA6IEJUTV9TRUNfT1VUX01JVE07Ci0gIGlmIChmbGFncyAmIEJUU09DS19GTEFHX0FVVEhfMTZfRElHSVQpCi0gICAgc2VjdXJpdHkgfD0gQlRNX1NFQ19JTl9NSU5fMTZfRElHSVRfUElOOwotCi0gIHJmY19zbG90X3QqIHNsb3QgPSBmaW5kX2ZyZWVfc2xvdCgpOwotICBpZiAoIXNsb3QpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBmaW5kIGZyZWUgUkZDT01NIHNsb3QuIiwgX19mdW5jX18pOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaW50IGZkc1syXSA9IHtJTlZBTElEX0ZELCBJTlZBTElEX0ZEfTsKLSAgaWYgKHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBmZHMpID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBlcnJvciBjcmVhdGluZyBzb2NrZXRwYWlyOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gSW5jcmVtZW50IHNsb3QgaWQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgaWQ9MC4KLSAgaWYgKCsrcmZjX3Nsb3RfaWQgPT0gMCkgcmZjX3Nsb3RfaWQgPSAxOwotCi0gIHNsb3QtPmZkID0gZmRzWzBdOwotICBzbG90LT5hcHBfZmQgPSBmZHNbMV07Ci0gIHNsb3QtPnNlY3VyaXR5ID0gc2VjdXJpdHk7Ci0gIHNsb3QtPnNjbiA9IGNoYW5uZWw7Ci0gIHNsb3QtPmFwcF91aWQgPSAtMTsKLQotICBzbG90LT5pc19zZXJ2aWNlX3V1aWRfdmFsaWQgPSAhdXVpZC5Jc0VtcHR5KCk7Ci0gIHNsb3QtPnNlcnZpY2VfdXVpZCA9IHV1aWQ7Ci0KLSAgaWYgKG5hbWUgJiYgKm5hbWUpIHsKLSAgICBzdHJsY3B5KHNsb3QtPnNlcnZpY2VfbmFtZSwgbmFtZSwgc2l6ZW9mKHNsb3QtPnNlcnZpY2VfbmFtZSkpOwotICB9IGVsc2UgewotICAgIG1lbXNldChzbG90LT5zZXJ2aWNlX25hbWUsIDAsIHNpemVvZihzbG90LT5zZXJ2aWNlX25hbWUpKTsKLSAgfQotICBpZiAoYWRkcikgewotICAgIHNsb3QtPmFkZHIgPSAqYWRkcjsKLSAgfSBlbHNlIHsKLSAgICBzbG90LT5hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICB9Ci0gIHNsb3QtPmlkID0gcmZjX3Nsb3RfaWQ7Ci0gIHNsb3QtPmYuc2VydmVyID0gc2VydmVyOwotICBzbG90LT50eF9ieXRlcyA9IDA7Ci0gIHNsb3QtPnJ4X2J5dGVzID0gMDsKLSAgcmV0dXJuIHNsb3Q7Ci19Ci0KLXN0YXRpYyByZmNfc2xvdF90KiBjcmVhdGVfc3J2X2FjY2VwdF9yZmNfc2xvdChyZmNfc2xvdF90KiBzcnZfcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3Blbl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld19saXN0ZW5faGFuZGxlKSB7Ci0gIHJmY19zbG90X3QqIGFjY2VwdF9ycyA9IGFsbG9jX3JmY19zbG90KAotICAgICAgYWRkciwgc3J2X3JzLT5zZXJ2aWNlX25hbWUsIHNydl9ycy0+c2VydmljZV91dWlkLCBzcnZfcnMtPnNjbiwgMCwgZmFsc2UpOwotICBpZiAoIWFjY2VwdF9ycykgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGFsbG9jYXRlIFJGQ09NTSBzbG90LiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGFjY2VwdF9ycy0+Zi5zZXJ2ZXIgPSBmYWxzZTsKLSAgYWNjZXB0X3JzLT5mLmNvbm5lY3RlZCA9IHRydWU7Ci0gIGFjY2VwdF9ycy0+c2VjdXJpdHkgPSBzcnZfcnMtPnNlY3VyaXR5OwotICBhY2NlcHRfcnMtPm10dSA9IHNydl9ycy0+bXR1OwotICBhY2NlcHRfcnMtPnJvbGUgPSBzcnZfcnMtPnJvbGU7Ci0gIGFjY2VwdF9ycy0+cmZjX2hhbmRsZSA9IG9wZW5faGFuZGxlOwotICBhY2NlcHRfcnMtPnJmY19wb3J0X2hhbmRsZSA9IEJUQV9KdlJmY29tbUdldFBvcnRIZGwob3Blbl9oYW5kbGUpOwotICBhY2NlcHRfcnMtPmFwcF91aWQgPSBzcnZfcnMtPmFwcF91aWQ7Ci0KLSAgc3J2X3JzLT5yZmNfaGFuZGxlID0gbmV3X2xpc3Rlbl9oYW5kbGU7Ci0gIHNydl9ycy0+cmZjX3BvcnRfaGFuZGxlID0gQlRBX0p2UmZjb21tR2V0UG9ydEhkbChuZXdfbGlzdGVuX2hhbmRsZSk7Ci0KLSAgQ0hFQ0soYWNjZXB0X3JzLT5yZmNfcG9ydF9oYW5kbGUgIT0gc3J2X3JzLT5yZmNfcG9ydF9oYW5kbGUpOwotCi0gIC8vIG5vdyBzd2FwIHRoZSBzbG90IGlkCi0gIHVpbnQzMl90IG5ld19saXN0ZW5faWQgPSBhY2NlcHRfcnMtPmlkOwotICBhY2NlcHRfcnMtPmlkID0gc3J2X3JzLT5pZDsKLSAgc3J2X3JzLT5pZCA9IG5ld19saXN0ZW5faWQ7Ci0KLSAgcmV0dXJuIGFjY2VwdF9yczsKLX0KLQotYnRfc3RhdHVzX3QgYnRzb2NrX3JmY19saXN0ZW4oY29uc3QgY2hhciogc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCogc2VydmljZV91dWlkLCBpbnQgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc29ja19mZCwgaW50IGZsYWdzLCBpbnQgYXBwX3VpZCkgewotICBDSEVDSyhzb2NrX2ZkICE9IE5VTEwpOwotICBDSEVDSygoc2VydmljZV91dWlkICE9IE5VTEwpIHx8Ci0gICAgICAgIChjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSBNQVhfUkZDX0NIQU5ORUwpIHx8Ci0gICAgICAgICgoZmxhZ3MgJiBCVFNPQ0tfRkxBR19OT19TRFApICE9IDApKTsKLQotICAqc29ja19mZCA9IElOVkFMSURfRkQ7Ci0KLSAgLy8gVE9ETyhzaGFydmlsKTogbm90IHN1cmUgdGhhdCB0aGlzIGNoZWNrIG1ha2VzIHNlbnNlOyBzZWVtcyBsaWtlIGEgbG9naWMKLSAgLy8gZXJyb3IgdG8gY2FsbAotICAvLyBmdW5jdGlvbnMgb24gUkZDT01NIHNvY2tldHMgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgbW9kdWxlLiBQcm9iYWJseSBzaG91bGQKLSAgLy8gYmUgYW4gYXNzZXJ0LgotICBpZiAoIWlzX2luaXRfZG9uZSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBpZiAoKGZsYWdzICYgQlRTT0NLX0ZMQUdfTk9fU0RQKSA9PSAwKSB7Ci0gICAgaWYgKCFzZXJ2aWNlX3V1aWQgfHwgc2VydmljZV91dWlkLT5Jc0VtcHR5KCkpIHsKLSAgICAgIC8vIFVzZSBzZXJpYWwgcG9ydCBwcm9maWxlIHRvIGxpc3RlbiB0byBzcGVjaWZpZWQgY2hhbm5lbAotICAgICAgc2VydmljZV91dWlkID0gJlVVSURfU1BQOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBDaGVjayB0aGUgc2VydmljZV91dWlkLiBvdmVyd3JpdGUgdGhlIGNoYW5uZWwgIyBpZiByZXNlcnZlZAotICAgICAgaW50IHJlc2VydmVkX2NoYW5uZWwgPSBnZXRfcmVzZXJ2ZWRfcmZjX2NoYW5uZWwoKnNlcnZpY2VfdXVpZCk7Ci0gICAgICBpZiAocmVzZXJ2ZWRfY2hhbm5lbCA+IDApIHsKLSAgICAgICAgY2hhbm5lbCA9IHJlc2VydmVkX2NoYW5uZWw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotCi0gIHJmY19zbG90X3QqIHNsb3QgPQotICAgICAgYWxsb2NfcmZjX3Nsb3QoTlVMTCwgc2VydmljZV9uYW1lLCAqc2VydmljZV91dWlkLCBjaGFubmVsLCBmbGFncywgdHJ1ZSk7Ci0gIGlmICghc2xvdCkgewotICAgIExPR19FUlJPUigidW5hYmxlIHRvIGFsbG9jYXRlIFJGQ09NTSBzbG90Iik7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIExPR19JTkZPKCJBZGRpbmcgbGlzdGVuaW5nIHNvY2tldCBzZXJ2aWNlX25hbWU6ICVzIC0gY2hhbm5lbDogJWQiLAotICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGNoYW5uZWwpOwotICBCVEFfSnZHZXRDaGFubmVsSWQoQlRBX0pWX0NPTk5fVFlQRV9SRkNPTU0sIHNsb3QtPmlkLCBjaGFubmVsKTsKLSAgKnNvY2tfZmQgPSBzbG90LT5hcHBfZmQ7ICAvLyBUcmFuc2ZlciBvd25lcnNoaXAgb2YgZmQgdG8gY2FsbGVyLgotICAvKlRPRE86Ci0gICAqIFdlIGFyZSBsZWFraW5nIG9uZSBvZiB0aGUgYXBwX2ZkJ3MgLSBlaXRoZXIgdGhlIGxpc3RlbiBzb2NrZXQsIG9yIHRoZQotICAgY29ubmVjdGlvbiBzb2NrZXQuCi0gICAqIFdFIG5lZWQgdG8gY2xvc2UgdGhpcyBpbiBuYXRpdmUsIGFzIHRoZSBGRCBtaWdodCBiZWxvbmcgdG8gYW5vdGhlciBwcm9jZXNzCi0gICAgLSBUaGlzIGlzIHRoZSBzZXJ2ZXIgc29ja2V0IEZECi0gICAgLSBGb3IgYWNjZXB0ZWQgY29ubmVjdGlvbnMsIHdlIGNsb3NlIHRoZSBGRCBhZnRlciBwYXNzaW5nIGl0IHRvIEpBVkEuCi0gICAgLSBUcnkgdG8gc2ltcGx5IHJlbW92ZSB0aGUgPSAtMSB0byBmcmVlIHRoZSBGRCBhdCBycyBjbGVhbnVwLiovCi0gIC8vICAgICAgICBjbG9zZShycy0+YXBwX2ZkKTsKLSAgc2xvdC0+YXBwX2ZkID0gSU5WQUxJRF9GRDsgIC8vIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgZmQuCi0gIHNsb3QtPmFwcF91aWQgPSBhcHBfdWlkOwotICBidHNvY2tfdGhyZWFkX2FkZF9mZChwdGgsIHNsb3QtPmZkLCBCVFNPQ0tfUkZDT01NLCBTT0NLX1RIUkVBRF9GRF9FWENFUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgIHNsb3QtPmlkKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0c29ja19yZmNfY29ubmVjdChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQqIHNlcnZpY2VfdXVpZCwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzb2NrX2ZkLCBpbnQgZmxhZ3MsIGludCBhcHBfdWlkKSB7Ci0gIENIRUNLKHNvY2tfZmQgIT0gTlVMTCk7Ci0gIENIRUNLKChzZXJ2aWNlX3V1aWQgIT0gTlVMTCkgfHwgKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IE1BWF9SRkNfQ0hBTk5FTCkpOwotCi0gICpzb2NrX2ZkID0gSU5WQUxJRF9GRDsKLQotICAvLyBUT0RPKHNoYXJ2aWwpOiBub3Qgc3VyZSB0aGF0IHRoaXMgY2hlY2sgbWFrZXMgc2Vuc2U7IHNlZW1zIGxpa2UgYSBsb2dpYwotICAvLyBlcnJvciB0byBjYWxsCi0gIC8vIGZ1bmN0aW9ucyBvbiBSRkNPTU0gc29ja2V0cyBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBtb2R1bGUuIFByb2JhYmx5IHNob3VsZAotICAvLyBiZSBhbiBhc3NlcnQuCi0gIGlmICghaXNfaW5pdF9kb25lKCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLQotICByZmNfc2xvdF90KiBzbG90ID0KLSAgICAgIGFsbG9jX3JmY19zbG90KGJkX2FkZHIsIE5VTEwsICpzZXJ2aWNlX3V1aWQsIGNoYW5uZWwsIGZsYWdzLCBmYWxzZSk7Ci0gIGlmICghc2xvdCkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGFsbG9jYXRlIFJGQ09NTSBzbG90LiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLQotICBpZiAoIXNlcnZpY2VfdXVpZCB8fCBzZXJ2aWNlX3V1aWQtPklzRW1wdHkoKSkgewotICAgIHRCVEFfSlZfU1RBVFVTIHJldCA9Ci0gICAgICAgIEJUQV9KdlJmY29tbUNvbm5lY3Qoc2xvdC0+c2VjdXJpdHksIHNsb3QtPnJvbGUsIHNsb3QtPnNjbiwgc2xvdC0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZmNvbW1fY2JhY2ssIHNsb3QtPmlkKTsKLSAgICBpZiAocmV0ICE9IEJUQV9KVl9TVUNDRVNTKSB7Ci0gICAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBpbml0aWF0ZSBSRkNPTU0gY29ubmVjdGlvbjogJWQiLCBfX2Z1bmNfXywgcmV0KTsKLSAgICAgIGNsZWFudXBfcmZjX3Nsb3Qoc2xvdCk7Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgfQotCi0gICAgaWYgKCFzZW5kX2FwcF9zY24oc2xvdCkpIHsKLSAgICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIHNlbmQgY2hhbm5lbCBudW1iZXIuIiwgX19mdW5jX18pOwotICAgICAgY2xlYW51cF9yZmNfc2xvdChzbG90KTsKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFpc19yZXF1ZXN0aW5nX3NkcCgpKSB7Ci0gICAgICBCVEFfSnZTdGFydERpc2NvdmVyeSgqYmRfYWRkciwgMSwgc2VydmljZV91dWlkLCBzbG90LT5pZCk7Ci0gICAgICBzbG90LT5mLnBlbmRpbmdfc2RwX3JlcXVlc3QgPSBmYWxzZTsKLSAgICAgIHNsb3QtPmYuZG9pbmdfc2RwX3JlcXVlc3QgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzbG90LT5mLnBlbmRpbmdfc2RwX3JlcXVlc3QgPSB0cnVlOwotICAgICAgc2xvdC0+Zi5kb2luZ19zZHBfcmVxdWVzdCA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gICpzb2NrX2ZkID0gc2xvdC0+YXBwX2ZkOyAgICAvLyBUcmFuc2ZlciBvd25lcnNoaXAgb2YgZmQgdG8gY2FsbGVyLgotICBzbG90LT5hcHBfZmQgPSBJTlZBTElEX0ZEOyAgLy8gRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBmZC4KLSAgc2xvdC0+YXBwX3VpZCA9IGFwcF91aWQ7Ci0gIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgc2xvdC0+ZmQsIEJUU09DS19SRkNPTU0sIFNPQ0tfVEhSRUFEX0ZEX1JELAotICAgICAgICAgICAgICAgICAgICAgICBzbG90LT5pZCk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGNyZWF0ZV9zZXJ2ZXJfc2RwX3JlY29yZChyZmNfc2xvdF90KiBzbG90KSB7Ci0gIGlmIChzbG90LT5zY24gPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzbG90LT5zZHBfaGFuZGxlID0KLSAgICAgIGFkZF9yZmNfc2RwX3JlYyhzbG90LT5zZXJ2aWNlX25hbWUsIHNsb3QtPnNlcnZpY2VfdXVpZCwgc2xvdC0+c2NuKTsKLSAgcmV0dXJuIChzbG90LT5zZHBfaGFuZGxlID4gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfcmZjX3Nsb3Rfc2NuKHJmY19zbG90X3QqIHNsb3QpIHsKLSAgaWYgKHNsb3QtPnNjbiA8PSAwKSByZXR1cm47Ci0KLSAgaWYgKHNsb3QtPmYuc2VydmVyICYmICFzbG90LT5mLmNsb3NpbmcgJiYgc2xvdC0+cmZjX2hhbmRsZSkgewotICAgIEJUQV9KdlJmY29tbVN0b3BTZXJ2ZXIoc2xvdC0+cmZjX2hhbmRsZSwgc2xvdC0+aWQpOwotICAgIHNsb3QtPnJmY19oYW5kbGUgPSAwOwotICB9Ci0KLSAgaWYgKHNsb3QtPmYuc2VydmVyKSBCVE1fRnJlZVNDTihzbG90LT5zY24pOwotICBzbG90LT5zY24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3JmY19zbG90KHJmY19zbG90X3QqIHNsb3QpIHsKLSAgaWYgKHNsb3QtPmZkICE9IElOVkFMSURfRkQpIHsKLSAgICBzaHV0ZG93bihzbG90LT5mZCwgU0hVVF9SRFdSKTsKLSAgICBjbG9zZShzbG90LT5mZCk7Ci0gICAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgICBzbG90LT5hZGRyLCBzbG90LT5pZCwgQlRTT0NLX1JGQ09NTSwKLSAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsCi0gICAgICAgIHNsb3QtPnR4X2J5dGVzLCBzbG90LT5yeF9ieXRlcywgc2xvdC0+YXBwX3VpZCwgc2xvdC0+c2NuLAotICAgICAgICBzbG90LT5mLnNlcnZlciA/IGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfTElTVEVOCi0gICAgICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9DT05ORUNUSU9OKTsKLSAgICBzbG90LT5mZCA9IElOVkFMSURfRkQ7Ci0gIH0KLQotICBpZiAoc2xvdC0+YXBwX2ZkICE9IElOVkFMSURfRkQpIHsKLSAgICBjbG9zZShzbG90LT5hcHBfZmQpOwotICAgIHNsb3QtPmFwcF9mZCA9IElOVkFMSURfRkQ7Ci0gIH0KLQotICBpZiAoc2xvdC0+c2RwX2hhbmRsZSA+IDApIHsKLSAgICBkZWxfcmZjX3NkcF9yZWMoc2xvdC0+c2RwX2hhbmRsZSk7Ci0gICAgc2xvdC0+c2RwX2hhbmRsZSA9IDA7Ci0gIH0KLQotICBpZiAoc2xvdC0+cmZjX2hhbmRsZSAmJiAhc2xvdC0+Zi5jbG9zaW5nICYmICFzbG90LT5mLnNlcnZlcikgewotICAgIEJUQV9KdlJmY29tbUNsb3NlKHNsb3QtPnJmY19oYW5kbGUsIHNsb3QtPmlkKTsKLSAgICBzbG90LT5yZmNfaGFuZGxlID0gMDsKLSAgfQotCi0gIGZyZWVfcmZjX3Nsb3Rfc2NuKHNsb3QpOwotICBsaXN0X2NsZWFyKHNsb3QtPmluY29taW5nX3F1ZXVlKTsKLQotICBzbG90LT5yZmNfcG9ydF9oYW5kbGUgPSAwOwotICBtZW1zZXQoJnNsb3QtPmYsIDAsIHNpemVvZihzbG90LT5mKSk7Ci0gIHNsb3QtPmlkID0gMDsKLSAgc2xvdC0+c2NuX25vdGlmaWVkID0gZmFsc2U7Ci0gIHNsb3QtPnR4X2J5dGVzID0gMDsKLSAgc2xvdC0+cnhfYnl0ZXMgPSAwOwotfQotCi1zdGF0aWMgYm9vbCBzZW5kX2FwcF9zY24ocmZjX3Nsb3RfdCogc2xvdCkgewotICBpZiAoc2xvdC0+c2NuX25vdGlmaWVkKSB7Ci0gICAgLy8gYWxyZWFkeSBzZW5kLCBqdXN0IHJldHVybiBzdWNjZXNzLgotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHNsb3QtPnNjbl9ub3RpZmllZCA9IHRydWU7Ci0gIHJldHVybiBzb2NrX3NlbmRfYWxsKHNsb3QtPmZkLCAoY29uc3QgdWludDhfdCopJnNsb3QtPnNjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNsb3QtPnNjbikpID09IHNpemVvZihzbG90LT5zY24pOwotfQotCi1zdGF0aWMgYm9vbCBzZW5kX2FwcF9jb25uZWN0X3NpZ25hbChpbnQgZmQsIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgaW50IHNlbmRfZmQpIHsKLSAgc29ja19jb25uZWN0X3NpZ25hbF90IGNzOwotICBjcy5zaXplID0gc2l6ZW9mKGNzKTsKLSAgY3MuYmRfYWRkciA9ICphZGRyOwotICBjcy5jaGFubmVsID0gY2hhbm5lbDsKLSAgY3Muc3RhdHVzID0gc3RhdHVzOwotICBjcy5tYXhfcnhfcGFja2V0X3NpemUgPSAwOyAgLy8gbm90IHVzZWQgZm9yIFJGQ09NTQotICBjcy5tYXhfdHhfcGFja2V0X3NpemUgPSAwOyAgLy8gbm90IHVzZWQgZm9yIFJGQ09NTQotICBpZiAoc2VuZF9mZCA9PSBJTlZBTElEX0ZEKQotICAgIHJldHVybiBzb2NrX3NlbmRfYWxsKGZkLCAoY29uc3QgdWludDhfdCopJmNzLCBzaXplb2YoY3MpKSA9PSBzaXplb2YoY3MpOwotCi0gIHJldHVybiBzb2NrX3NlbmRfZmQoZmQsIChjb25zdCB1aW50OF90KikmY3MsIHNpemVvZihjcyksIHNlbmRfZmQpID09Ci0gICAgICAgICBzaXplb2YoY3MpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9jbF9yZmNfaW5pdCh0QlRBX0pWX1JGQ09NTV9DTF9JTklUKiBwX2luaXQsIHVpbnQzMl90IGlkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLSAgcmZjX3Nsb3RfdCogc2xvdCA9IGZpbmRfcmZjX3Nsb3RfYnlfaWQoaWQpOwotICBpZiAoIXNsb3QpIHJldHVybjsKLQotICBpZiAocF9pbml0LT5zdGF0dXMgPT0gQlRBX0pWX1NVQ0NFU1MpIHsKLSAgICBzbG90LT5yZmNfaGFuZGxlID0gcF9pbml0LT5oYW5kbGU7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYW51cF9yZmNfc2xvdChzbG90KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBvbl9zcnZfcmZjX2xpc3Rlbl9zdGFydGVkKHRCVEFfSlZfUkZDT01NX1NUQVJUKiBwX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHNsb3RfbG9jayk7Ci0gIHJmY19zbG90X3QqIHNsb3QgPSBmaW5kX3JmY19zbG90X2J5X2lkKGlkKTsKLSAgaWYgKCFzbG90KSByZXR1cm47Ci0KLSAgaWYgKHBfc3RhcnQtPnN0YXR1cyA9PSBCVEFfSlZfU1VDQ0VTUykgewotICAgIHNsb3QtPnJmY19oYW5kbGUgPSBwX3N0YXJ0LT5oYW5kbGU7Ci0gICAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgICBzbG90LT5hZGRyLCBzbG90LT5pZCwgQlRTT0NLX1JGQ09NTSwKLSAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtOjoKLSAgICAgICAgICAgIFNPQ0tFVF9DT05ORUNUSU9OX1NUQVRFX0xJU1RFTklORywKLSAgICAgICAgMCwgMCwgc2xvdC0+YXBwX3VpZCwgc2xvdC0+c2NuLAotICAgICAgICBzbG90LT5mLnNlcnZlciA/IGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfTElTVEVOCi0gICAgICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9DT05ORUNUSU9OKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICB9Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBvbl9zcnZfcmZjX2Nvbm5lY3QodEJUQV9KVl9SRkNPTU1fU1JWX09QRU4qIHBfb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotICByZmNfc2xvdF90KiBhY2NlcHRfcnM7Ci0gIHJmY19zbG90X3QqIHNydl9ycyA9IGZpbmRfcmZjX3Nsb3RfYnlfaWQoaWQpOwotICBpZiAoIXNydl9ycykgcmV0dXJuIDA7Ci0KLSAgYWNjZXB0X3JzID0gY3JlYXRlX3Nydl9hY2NlcHRfcmZjX3Nsb3QoCi0gICAgICBzcnZfcnMsICZwX29wZW4tPnJlbV9iZGEsIHBfb3Blbi0+aGFuZGxlLCBwX29wZW4tPm5ld19saXN0ZW5faGFuZGxlKTsKLSAgaWYgKCFhY2NlcHRfcnMpIHJldHVybiAwOwotCi0gIGxvZ19zb2NrZXRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgIGFjY2VwdF9ycy0+YWRkciwgYWNjZXB0X3JzLT5pZCwgQlRTT0NLX1JGQ09NTSwKLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVELCAwLCAwLAotICAgICAgYWNjZXB0X3JzLT5hcHBfdWlkLCBhY2NlcHRfcnMtPnNjbiwKLSAgICAgIGFjY2VwdF9ycy0+Zi5zZXJ2ZXIgPyBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0xJU1RFTgotICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfQ09OTkVDVElPTik7Ci0KLSAgLy8gU3RhcnQgbW9uaXRvcmluZyB0aGUgc29ja2V0LgotICBidHNvY2tfdGhyZWFkX2FkZF9mZChwdGgsIHNydl9ycy0+ZmQsIEJUU09DS19SRkNPTU0sIFNPQ0tfVEhSRUFEX0ZEX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3J2X3JzLT5pZCk7Ci0gIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgYWNjZXB0X3JzLT5mZCwgQlRTT0NLX1JGQ09NTSwgU09DS19USFJFQURfRkRfUkQsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9ycy0+aWQpOwotICBzZW5kX2FwcF9jb25uZWN0X3NpZ25hbChzcnZfcnMtPmZkLCAmYWNjZXB0X3JzLT5hZGRyLCBzcnZfcnMtPnNjbiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3JzLT5hcHBfZmQpOwotICBhY2NlcHRfcnMtPmFwcF9mZCA9Ci0gICAgICBJTlZBTElEX0ZEOyAgLy8gT3duZXJzaGlwIG9mIHRoZSBhcHBsaWNhdGlvbiBmZCBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4KLSAgcmV0dXJuIHNydl9ycy0+aWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2NsaV9yZmNfY29ubmVjdCh0QlRBX0pWX1JGQ09NTV9PUEVOKiBwX29wZW4sIHVpbnQzMl90IGlkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLSAgcmZjX3Nsb3RfdCogc2xvdCA9IGZpbmRfcmZjX3Nsb3RfYnlfaWQoaWQpOwotICBpZiAoIXNsb3QpIHJldHVybjsKLQotICBpZiAocF9vcGVuLT5zdGF0dXMgIT0gQlRBX0pWX1NVQ0NFU1MpIHsKLSAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNsb3QtPnJmY19wb3J0X2hhbmRsZSA9IEJUQV9KdlJmY29tbUdldFBvcnRIZGwocF9vcGVuLT5oYW5kbGUpOwotICBzbG90LT5hZGRyID0gcF9vcGVuLT5yZW1fYmRhOwotCi0gIGxvZ19zb2NrZXRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgIHNsb3QtPmFkZHIsIHNsb3QtPmlkLCBCVFNPQ0tfUkZDT01NLAotICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQsIDAsIDAsCi0gICAgICBzbG90LT5hcHBfdWlkLCBzbG90LT5zY24sCi0gICAgICBzbG90LT5mLnNlcnZlciA/IGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfTElTVEVOCi0gICAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OmJsdWV0b290aDo6U09DS0VUX1JPTEVfQ09OTkVDVElPTik7Ci0KLSAgaWYgKHNlbmRfYXBwX2Nvbm5lY3Rfc2lnbmFsKHNsb3QtPmZkLCAmc2xvdC0+YWRkciwgc2xvdC0+c2NuLCAwLCAtMSkpIHsKLSAgICBzbG90LT5mLmNvbm5lY3RlZCA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gc2VuZCBjb25uZWN0IGNvbXBsZXRpb24gc2lnbmFsIHRvIGNhbGxlci4iLAotICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgb25fcmZjX2Nsb3NlKFVOVVNFRF9BVFRSIHRCVEFfSlZfUkZDT01NX0NMT1NFKiBwX2Nsb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGlkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLQotICAvLyByZmNfaGFuZGxlIGFscmVhZHkgY2xvc2VkIHdoZW4gcmVjZWl2aW5nIHJmY29tbSBjbG9zZSBldmVudCBmcm9tIHN0YWNrLgotICByZmNfc2xvdF90KiBzbG90ID0gZmluZF9yZmNfc2xvdF9ieV9pZChpZCk7Ci0gIGlmIChzbG90KSB7Ci0gICAgbG9nX3NvY2tldF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgICBzbG90LT5hZGRyLCBzbG90LT5pZCwgQlRTT0NLX1JGQ09NTSwKLSAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HLCAwLCAwLAotICAgICAgICBzbG90LT5hcHBfdWlkLCBzbG90LT5zY24sCi0gICAgICAgIHNsb3QtPmYuc2VydmVyID8gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTT0NLRVRfUk9MRV9MSVNURU4KLSAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpibHVldG9vdGg6OlNPQ0tFVF9ST0xFX0NPTk5FQ1RJT04pOwotICAgIGNsZWFudXBfcmZjX3Nsb3Qoc2xvdCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgb25fcmZjX3dyaXRlX2RvbmUodEJUQV9KVl9SRkNPTU1fV1JJVEUqIHAsIHVpbnQzMl90IGlkKSB7Ci0gIGlmIChwLT5zdGF0dXMgIT0gQlRBX0pWX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzIGVycm9yIHdyaXRpbmcgdG8gUkZDT01NIHNvY2tldCB3aXRoIHNsb3QgJXUuIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHAtPnJlcV9pZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50IGFwcF91aWQgPSAtMTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotCi0gIHJmY19zbG90X3QqIHNsb3QgPSBmaW5kX3JmY19zbG90X2J5X2lkKGlkKTsKLSAgaWYgKHNsb3QpIHsKLSAgICBhcHBfdWlkID0gc2xvdC0+YXBwX3VpZDsKLSAgICBpZiAoIXNsb3QtPmYub3V0Z29pbmdfY29uZ2VzdCkgewotICAgICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocHRoLCBzbG90LT5mZCwgQlRTT0NLX1JGQ09NTSwgU09DS19USFJFQURfRkRfUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LT5pZCk7Ci0gICAgfQotICAgIHNsb3QtPnR4X2J5dGVzICs9IHAtPmxlbjsKLSAgfQotCi0gIHVpZF9zZXRfYWRkX3R4KHVpZF9zZXQsIGFwcF91aWQsIHAtPmxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX3JmY19vdXRnb2luZ19jb25nZXN0KHRCVEFfSlZfUkZDT01NX0NPTkcqIHAsIHVpbnQzMl90IGlkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLQotICByZmNfc2xvdF90KiBzbG90ID0gZmluZF9yZmNfc2xvdF9ieV9pZChpZCk7Ci0gIGlmIChzbG90KSB7Ci0gICAgc2xvdC0+Zi5vdXRnb2luZ19jb25nZXN0ID0gcC0+Y29uZyA/IDEgOiAwOwotICAgIGlmICghc2xvdC0+Zi5vdXRnb2luZ19jb25nZXN0KQotICAgICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocHRoLCBzbG90LT5mZCwgQlRTT0NLX1JGQ09NTSwgU09DS19USFJFQURfRkRfUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LT5pZCk7Ci0gIH0KLX0KLQotc3RhdGljIHVpbnQzMl90IHJmY29tbV9jYmFjayh0QlRBX0pWX0VWVCBldmVudCwgdEJUQV9KViogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICB1aW50MzJfdCBpZCA9IDA7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0pWX1JGQ09NTV9TVEFSVF9FVlQ6Ci0gICAgICBvbl9zcnZfcmZjX2xpc3Rlbl9zdGFydGVkKCZwX2RhdGEtPnJmY19zdGFydCwgcmZjb21tX3Nsb3RfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9SRkNPTU1fQ0xfSU5JVF9FVlQ6Ci0gICAgICBvbl9jbF9yZmNfaW5pdCgmcF9kYXRhLT5yZmNfY2xfaW5pdCwgcmZjb21tX3Nsb3RfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9KVl9SRkNPTU1fT1BFTl9FVlQ6Ci0gICAgICBCVEFfSnZTZXRQbVByb2ZpbGUocF9kYXRhLT5yZmNfb3Blbi5oYW5kbGUsIEJUQV9KVl9QTV9JRF8xLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9KVl9DT05OX09QRU4pOwotICAgICAgb25fY2xpX3JmY19jb25uZWN0KCZwX2RhdGEtPnJmY19vcGVuLCByZmNvbW1fc2xvdF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX1JGQ09NTV9TUlZfT1BFTl9FVlQ6Ci0gICAgICBCVEFfSnZTZXRQbVByb2ZpbGUocF9kYXRhLT5yZmNfc3J2X29wZW4uaGFuZGxlLCBCVEFfSlZfUE1fQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9KVl9DT05OX09QRU4pOwotICAgICAgaWQgPSBvbl9zcnZfcmZjX2Nvbm5lY3QoJnBfZGF0YS0+cmZjX3Nydl9vcGVuLCByZmNvbW1fc2xvdF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX1JGQ09NTV9DTE9TRV9FVlQ6Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJCVEFfSlZfUkZDT01NX0NMT1NFX0VWVDogcmZjb21tX3Nsb3RfaWQ6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICByZmNvbW1fc2xvdF9pZCk7Ci0gICAgICBvbl9yZmNfY2xvc2UoJnBfZGF0YS0+cmZjX2Nsb3NlLCByZmNvbW1fc2xvdF9pZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0pWX1JGQ09NTV9XUklURV9FVlQ6Ci0gICAgICBvbl9yZmNfd3JpdGVfZG9uZSgmcF9kYXRhLT5yZmNfd3JpdGUsIHJmY29tbV9zbG90X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSlZfUkZDT01NX0NPTkdfRVZUOgotICAgICAgb25fcmZjX291dGdvaW5nX2Nvbmdlc3QoJnBfZGF0YS0+cmZjX2NvbmcsIHJmY29tbV9zbG90X2lkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfSlZfUkZDT01NX0RBVEFfSU5EX0VWVDoKLSAgICAgIC8vIFVudXNlZC4KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiJXMgdW5oYW5kbGVkIGV2ZW50ICVkLCBzbG90IGlkOiAldSIsIF9fZnVuY19fLCBldmVudCwKLSAgICAgICAgICAgICAgICByZmNvbW1fc2xvdF9pZCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGp2X2RtX2NiYWNrKHRCVEFfSlZfRVZUIGV2ZW50LCB0QlRBX0pWKiBwX2RhdGEsIHVpbnQzMl90IGlkKSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9KVl9HRVRfU0NOX0VWVDogewotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotICAgICAgcmZjX3Nsb3RfdCogcnMgPSBmaW5kX3JmY19zbG90X2J5X2lkKGlkKTsKLSAgICAgIGludCBuZXdfc2NuID0gcF9kYXRhLT5zY247Ci0KLSAgICAgIGlmIChycyAmJiAobmV3X3NjbiAhPSAwKSkgewotICAgICAgICBycy0+c2NuID0gbmV3X3NjbjsKLSAgICAgICAgLyogQlRBX0p2Q3JlYXRlUmVjb3JkQnlVc2VyIHdpbGwgb25seSBjcmVhdGUgYSByZWNvcmQgaWYgYSBVVUlEIGlzCi0gICAgICAgICAqIHNwZWNpZmllZCwKLSAgICAgICAgICogZWxzZSBpdCBqdXN0IGFsbG9jYXRlIGEgUkZDIGNoYW5uZWwgYW5kIHN0YXJ0IHRoZSBSRkNPTU0gdGhyZWFkIC0KLSAgICAgICAgICogbmVlZGVkCi0gICAgICAgICAqIGZvciB0aGUgamF2YQotICAgICAgICAgKiBsYXllciB0byBnZXQgYSBSRkNPTU0gY2hhbm5lbC4KLSAgICAgICAgICogSWYgdXVpZCBpcyBudWxsIHRoZSBjcmVhdGVfc2RwX3JlY29yZCgpIHdpbGwgYmUgY2FsbGVkIGZyb20gSmF2YSB3aGVuCi0gICAgICAgICAqIGl0Ci0gICAgICAgICAqIGhhcyByZWNlaXZlZCB0aGUgUkZDT01NIGFuZCBMMkNBUCBjaGFubmVsIG51bWJlcnMgdGhyb3VnaCB0aGUKLSAgICAgICAgICogc29ja2V0cy4qLwotCi0gICAgICAgIC8vIFNlbmQgY2hhbm5lbCBJRCB0byBqYXZhIGxheWVyCi0gICAgICAgIGlmICghc2VuZF9hcHBfc2NuKHJzKSkgewotICAgICAgICAgIC8vIGNsb3NlZAotICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoInNlbmRfYXBwX3NjbigpIGZhaWxlZCwgY2xvc2UgcnMtPmlkOiVkIiwgcnMtPmlkKTsKLSAgICAgICAgICBjbGVhbnVwX3JmY19zbG90KHJzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAocnMtPmlzX3NlcnZpY2VfdXVpZF92YWxpZCkgewotICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGRhdGEgZm9yIFNEUCByZWNvcmQsIGNyZWF0ZSBpdCAoUkZDLW9ubHkKLSAgICAgICAgICAgIC8vIHByb2ZpbGVzKQotICAgICAgICAgICAgQlRBX0p2Q3JlYXRlUmVjb3JkQnlVc2VyKHJzLT5pZCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICAgImlzX3NlcnZpY2VfdXVpZF92YWxpZD09ZmFsc2UgLSBkb24ndCBzZXQgU0RQLXJlY29yZCwgIgotICAgICAgICAgICAgICAgICJqdXN0IHN0YXJ0IHRoZSBSRkNPTU0gc2VydmVyIiwKLSAgICAgICAgICAgICAgICBycy0+aWQpOwotICAgICAgICAgICAgLy8gbm93IHN0YXJ0IHRoZSByZmNvbW0gc2VydmVyIGFmdGVyIHNkcCAmIGNoYW5uZWwgIyBhc3NpZ25lZAotICAgICAgICAgICAgQlRBX0p2UmZjb21tU3RhcnRTZXJ2ZXIocnMtPnNlY3VyaXR5LCBycy0+cm9sZSwgcnMtPnNjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9SRkNfU0VTU0lPTiwgcmZjb21tX2NiYWNrLCBycy0+aWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChycykgewotICAgICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgImp2X2RtX2NiYWNrOiBFcnJvcjogYWxsb2NhdGUgY2hhbm5lbCAlZCwgc2xvdCBmb3VuZDolcCIsIHJzLT5zY24sCi0gICAgICAgICAgICBycyk7Ci0gICAgICAgIGNsZWFudXBfcmZjX3Nsb3QocnMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0pWX0dFVF9QU01fRVZUOiB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJSZWNlaXZlZCBQU006IDB4JTA0eCIsIHBfZGF0YS0+cHNtKTsKLSAgICAgIG9uX2wyY2FwX3BzbV9hc3NpZ25lZChpZCwgcF9kYXRhLT5wc20pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0pWX0NSRUFURV9SRUNPUkRfRVZUOiB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHNsb3RfbG9jayk7Ci0gICAgICByZmNfc2xvdF90KiBzbG90ID0gZmluZF9yZmNfc2xvdF9ieV9pZChpZCk7Ci0KLSAgICAgIGlmIChzbG90ICYmIGNyZWF0ZV9zZXJ2ZXJfc2RwX3JlY29yZChzbG90KSkgewotICAgICAgICAvLyBTdGFydCB0aGUgcmZjb21tIHNlcnZlciBhZnRlciBzZHAgJiBjaGFubmVsICMgYXNzaWduZWQuCi0gICAgICAgIEJUQV9KdlJmY29tbVN0YXJ0U2VydmVyKHNsb3QtPnNlY3VyaXR5LCBzbG90LT5yb2xlLCBzbG90LT5zY24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9SRkNfU0VTU0lPTiwgcmZjb21tX2NiYWNrLCBzbG90LT5pZCk7Ci0gICAgICB9IGVsc2UgaWYgKHNsb3QpIHsKLSAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigianZfZG1fY2JhY2s6IGNhbm5vdCBzdGFydCBzZXJ2ZXIsIHNsb3QgZm91bmQ6JXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpOwotICAgICAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfSlZfRElTQ09WRVJZX0NPTVBfRVZUOiB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHNsb3RfbG9jayk7Ci0gICAgICByZmNfc2xvdF90KiBzbG90ID0gZmluZF9yZmNfc2xvdF9ieV9pZChpZCk7Ci0gICAgICBpZiAocF9kYXRhLT5kaXNjX2NvbXAuc3RhdHVzID09IEJUQV9KVl9TVUNDRVNTICYmIHBfZGF0YS0+ZGlzY19jb21wLnNjbikgewotICAgICAgICBpZiAoc2xvdCAmJiBzbG90LT5mLmRvaW5nX3NkcF9yZXF1ZXN0KSB7Ci0gICAgICAgICAgLy8gRXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGlmIHdlIHN1Y2Nlc3NmdWxseSBsb29rZWQgdXAgYSBjaGFubmVsCi0gICAgICAgICAgLy8gbnVtYmVyIHRvIGNvbm5lY3QgdG8uCi0gICAgICAgICAgaWYgKEJUQV9KdlJmY29tbUNvbm5lY3Qoc2xvdC0+c2VjdXJpdHksIHNsb3QtPnJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kaXNjX2NvbXAuc2NuLCBzbG90LT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmY29tbV9jYmFjaywgc2xvdC0+aWQpID09IEJUQV9KVl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBzbG90LT5zY24gPSBwX2RhdGEtPmRpc2NfY29tcC5zY247Ci0gICAgICAgICAgICBzbG90LT5mLmRvaW5nX3NkcF9yZXF1ZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIXNlbmRfYXBwX3NjbihzbG90KSkgY2xlYW51cF9yZmNfc2xvdChzbG90KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xlYW51cF9yZmNfc2xvdChzbG90KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc2xvdCkgewotICAgICAgICAgIC8vIFRPRE8oc2hhcnZpbCk6IHRoaXMgaXMgcmVhbGx5IGEgbG9naWMgZXJyb3IgYW5kIHdlIHNob3VsZCBwcm9iYWJseQotICAgICAgICAgIC8vIGFzc2VydC4KLSAgICAgICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgICAgICIlcyBTRFAgcmVzcG9uc2UgcmV0dXJuZWQgYnV0IFJGQ09NTSBzbG90ICVkIGRpZCBub3QgIgotICAgICAgICAgICAgICAicmVxdWVzdCBTRFAgcmVjb3JkLiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBpZCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoc2xvdCkgewotICAgICAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICAgICAgfQotCi0gICAgICAvLyBGaW5kIHRoZSBuZXh0IHNsb3QgdGhhdCBuZWVkcyB0byBwZXJmb3JtIGFuIFNEUCByZXF1ZXN0IGFuZCBzZXJ2aWNlIGl0LgotICAgICAgc2xvdCA9IGZpbmRfcmZjX3Nsb3RfYnlfcGVuZGluZ19zZHAoKTsKLSAgICAgIGlmIChzbG90KSB7Ci0gICAgICAgIEJUQV9KdlN0YXJ0RGlzY292ZXJ5KHNsb3QtPmFkZHIsIDEsICZzbG90LT5zZXJ2aWNlX3V1aWQsIHNsb3QtPmlkKTsKLSAgICAgICAgc2xvdC0+Zi5wZW5kaW5nX3NkcF9yZXF1ZXN0ID0gZmFsc2U7Ci0gICAgICAgIHNsb3QtPmYuZG9pbmdfc2RwX3JlcXVlc3QgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoInVuaGFuZGxlZCBldmVudDolZCwgc2xvdCBpZDolZCIsIGV2ZW50LCBpZCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi10eXBlZGVmIGVudW0gewotICBTRU5UX0ZBSUxFRCwKLSAgU0VOVF9OT05FLAotICBTRU5UX1BBUlRJQUwsCi0gIFNFTlRfQUxMLAotfSBzZW50X3N0YXR1c190OwotCi1zdGF0aWMgc2VudF9zdGF0dXNfdCBzZW5kX2RhdGFfdG9fYXBwKGludCBmZCwgQlRfSERSKiBwX2J1ZikgewotICBpZiAocF9idWYtPmxlbiA9PSAwKSByZXR1cm4gU0VOVF9BTEw7Ci0KLSAgc3NpemVfdCBzZW50OwotICBPU0lfTk9fSU5UUigKLSAgICAgIHNlbnQgPSBzZW5kKGZkLCBwX2J1Zi0+ZGF0YSArIHBfYnVmLT5vZmZzZXQsIHBfYnVmLT5sZW4sIE1TR19ET05UV0FJVCkpOwotCi0gIGlmIChzZW50ID09IC0xKSB7Ci0gICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgcmV0dXJuIFNFTlRfTk9ORTsKLSAgICBMT0dfRVJST1IoIiVzIGVycm9yIHdyaXRpbmcgUkZDT01NIGRhdGEgYmFjayB0byBhcHA6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIFNFTlRfRkFJTEVEOwotICB9Ci0KLSAgaWYgKHNlbnQgPT0gMCkgcmV0dXJuIFNFTlRfRkFJTEVEOwotCi0gIGlmIChzZW50ID09IHBfYnVmLT5sZW4pIHJldHVybiBTRU5UX0FMTDsKLQotICBwX2J1Zi0+b2Zmc2V0ICs9IHNlbnQ7Ci0gIHBfYnVmLT5sZW4gLT0gc2VudDsKLSAgcmV0dXJuIFNFTlRfUEFSVElBTDsKLX0KLQotc3RhdGljIGJvb2wgZmx1c2hfaW5jb21pbmdfcXVlX29uX3dyX3NpZ25hbChyZmNfc2xvdF90KiBzbG90KSB7Ci0gIHdoaWxlICghbGlzdF9pc19lbXB0eShzbG90LT5pbmNvbWluZ19xdWV1ZSkpIHsKLSAgICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopbGlzdF9mcm9udChzbG90LT5pbmNvbWluZ19xdWV1ZSk7Ci0gICAgc3dpdGNoIChzZW5kX2RhdGFfdG9fYXBwKHNsb3QtPmZkLCBwX2J1ZikpIHsKLSAgICAgIGNhc2UgU0VOVF9OT05FOgotICAgICAgY2FzZSBTRU5UX1BBUlRJQUw6Ci0gICAgICAgIC8vIG1vbml0b3IgdGhlIGZkIHRvIGdldCBjYWxsYmFjayB3aGVuIGFwcCBpcyByZWFkeSB0byByZWNlaXZlIGRhdGEKLSAgICAgICAgYnRzb2NrX3RocmVhZF9hZGRfZmQocHRoLCBzbG90LT5mZCwgQlRTT0NLX1JGQ09NTSwgU09DS19USFJFQURfRkRfV1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QtPmlkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIGNhc2UgU0VOVF9BTEw6Ci0gICAgICAgIGxpc3RfcmVtb3ZlKHNsb3QtPmluY29taW5nX3F1ZXVlLCBwX2J1Zik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFNFTlRfRkFJTEVEOgotICAgICAgICBsaXN0X3JlbW92ZShzbG90LT5pbmNvbWluZ19xdWV1ZSwgcF9idWYpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gYXBwIGlzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSwgdGVsbCBzdGFjayB0byBzdGFydCB0aGUgZGF0YSBmbG93Ci0gIC8vIGZpeCBtZTogbmVlZCBhIGp2IGZsb3cgY29udHJvbCBhcGkgdG8gc2VyaWFsaXplIHRoZSBjYWxsIGluIHN0YWNrCi0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiZW5hYmxlIGRhdGEgZmxvdywgcmZjX2hhbmRsZToweCV4LCByZmNfcG9ydF9oYW5kbGU6MHgleCwgdXNlcl9pZDolZCIsCi0gICAgICBzbG90LT5yZmNfaGFuZGxlLCBzbG90LT5yZmNfcG9ydF9oYW5kbGUsIHNsb3QtPmlkKTsKLSAgUE9SVF9GbG93Q29udHJvbF9NYXhDcmVkaXQoc2xvdC0+cmZjX3BvcnRfaGFuZGxlLCB0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgYnRzb2NrX3JmY19zaWduYWxlZChVTlVTRURfQVRUUiBpbnQgZmQsIGludCBmbGFncywgdWludDMyX3QgdXNlcl9pZCkgewotICBib29sIG5lZWRfY2xvc2UgPSBmYWxzZTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotICByZmNfc2xvdF90KiBzbG90ID0gZmluZF9yZmNfc2xvdF9ieV9pZCh1c2VyX2lkKTsKLSAgaWYgKCFzbG90KSByZXR1cm47Ci0KLSAgLy8gRGF0YSBhdmFpbGFibGUgZnJvbSBhcHAsIHRlbGwgc3RhY2sgd2UgaGF2ZSBvdXRnb2luZyBkYXRhLgotICBpZiAoZmxhZ3MgJiBTT0NLX1RIUkVBRF9GRF9SRCAmJiAhc2xvdC0+Zi5zZXJ2ZXIpIHsKLSAgICBpZiAoc2xvdC0+Zi5jb25uZWN0ZWQpIHsKLSAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSdzIGRhdGEgcGVuZGluZyBpbiBjYXNlIHRoZSBwZWVyIGNsb3NlZCB0aGUgc29ja2V0LgotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKCEoZmxhZ3MgJiBTT0NLX1RIUkVBRF9GRF9FWENFUFRJT04pIHx8Ci0gICAgICAgICAgKGlvY3RsKHNsb3QtPmZkLCBGSU9OUkVBRCwgJnNpemUpID09IDAgJiYgc2l6ZSkpIHsKLSAgICAgICAgQlRBX0p2UmZjb21tV3JpdGUoc2xvdC0+cmZjX2hhbmRsZSwgc2xvdC0+aWQpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIiVzIHNvY2tldCBzaWduYWxlZCBmb3IgcmVhZCB3aGlsZSBkaXNjb25uZWN0ZWQsIHNsb3Q6ICVkLCAiCi0gICAgICAgICAgImNoYW5uZWw6ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgc2xvdC0+aWQsIHNsb3QtPnNjbik7Ci0gICAgICBuZWVkX2Nsb3NlID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmxhZ3MgJiBTT0NLX1RIUkVBRF9GRF9XUikgewotICAgIC8vIEFwcCBpcyByZWFkeSB0byByZWNlaXZlIG1vcmUgZGF0YSwgdGVsbCBzdGFjayB0byBlbmFibGUgZGF0YSBmbG93LgotICAgIGlmICghc2xvdC0+Zi5jb25uZWN0ZWQgfHwgIWZsdXNoX2luY29taW5nX3F1ZV9vbl93cl9zaWduYWwoc2xvdCkpIHsKLSAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAiJXMgc29ja2V0IHNpZ25hbGVkIGZvciB3cml0ZSB3aGlsZSBkaXNjb25uZWN0ZWQgKG9yIHdyaXRlICIKLSAgICAgICAgICAiZmFpbHVyZSksIHNsb3Q6ICVkLCBjaGFubmVsOiAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIHNsb3QtPmlkLCBzbG90LT5zY24pOwotICAgICAgbmVlZF9jbG9zZSA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5lZWRfY2xvc2UgfHwgKGZsYWdzICYgU09DS19USFJFQURfRkRfRVhDRVBUSU9OKSkgewotICAgIC8vIENsZWFuIHVwIGlmIHRoZXJlJ3Mgbm8gZGF0YSBwZW5kaW5nLgotICAgIGludCBzaXplID0gMDsKLSAgICBpZiAobmVlZF9jbG9zZSB8fCBpb2N0bChzbG90LT5mZCwgRklPTlJFQUQsICZzaXplKSAhPSAwIHx8ICFzaXplKQotICAgICAgY2xlYW51cF9yZmNfc2xvdChzbG90KTsKLSAgfQotfQotCi1pbnQgYnRhX2NvX3JmY19kYXRhX2luY29taW5nKHVpbnQzMl90IGlkLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIGludCBhcHBfdWlkID0gLTE7Ci0gIHVpbnQ2NF90IGJ5dGVzX3J4ID0gMDsKLSAgaW50IHJldCA9IDA7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLSAgcmZjX3Nsb3RfdCogc2xvdCA9IGZpbmRfcmZjX3Nsb3RfYnlfaWQoaWQpOwotICBpZiAoIXNsb3QpIHJldHVybiAwOwotCi0gIGFwcF91aWQgPSBzbG90LT5hcHBfdWlkOwotICBieXRlc19yeCA9IHBfYnVmLT5sZW47Ci0KLSAgaWYgKGxpc3RfaXNfZW1wdHkoc2xvdC0+aW5jb21pbmdfcXVldWUpKSB7Ci0gICAgc3dpdGNoIChzZW5kX2RhdGFfdG9fYXBwKHNsb3QtPmZkLCBwX2J1ZikpIHsKLSAgICAgIGNhc2UgU0VOVF9OT05FOgotICAgICAgY2FzZSBTRU5UX1BBUlRJQUw6Ci0gICAgICAgIGxpc3RfYXBwZW5kKHNsb3QtPmluY29taW5nX3F1ZXVlLCBwX2J1Zik7Ci0gICAgICAgIGJ0c29ja190aHJlYWRfYWRkX2ZkKHB0aCwgc2xvdC0+ZmQsIEJUU09DS19SRkNPTU0sIFNPQ0tfVEhSRUFEX0ZEX1dSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LT5pZCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFNFTlRfQUxMOgotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICAgIHJldCA9IDE7ICAvLyBFbmFibGUgZGF0YSBmbG93LgotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTRU5UX0ZBSUxFRDoKLSAgICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbGlzdF9hcHBlbmQoc2xvdC0+aW5jb21pbmdfcXVldWUsIHBfYnVmKTsKLSAgfQotCi0gIHNsb3QtPnJ4X2J5dGVzICs9IGJ5dGVzX3J4OwotICB1aWRfc2V0X2FkZF9yeCh1aWRfc2V0LCBhcHBfdWlkLCBieXRlc19yeCk7Ci0KLSAgcmV0dXJuIHJldDsgIC8vIFJldHVybiAwIHRvIGRpc2FibGUgZGF0YSBmbG93LgotfQotCi1pbnQgYnRhX2NvX3JmY19kYXRhX291dGdvaW5nX3NpemUodWludDMyX3QgaWQsIGludCogc2l6ZSkgewotICAqc2l6ZSA9IDA7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc2xvdF9sb2NrKTsKLSAgcmZjX3Nsb3RfdCogc2xvdCA9IGZpbmRfcmZjX3Nsb3RfYnlfaWQoaWQpOwotICBpZiAoIXNsb3QpIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW9jdGwoc2xvdC0+ZmQsIEZJT05SRUFELCBzaXplKSAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gZGV0ZXJtaW5lIGJ5dGVzIHJlbWFpbmluZyB0byBiZSByZWFkIG9uIGZkICVkOiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBzbG90LT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgYnRhX2NvX3JmY19kYXRhX291dGdvaW5nKHVpbnQzMl90IGlkLCB1aW50OF90KiBidWYsIHVpbnQxNl90IHNpemUpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzbG90X2xvY2spOwotICByZmNfc2xvdF90KiBzbG90ID0gZmluZF9yZmNfc2xvdF9ieV9pZChpZCk7Ci0gIGlmICghc2xvdCkgcmV0dXJuIGZhbHNlOwotCi0gIHNzaXplX3QgcmVjZWl2ZWQ7Ci0gIE9TSV9OT19JTlRSKHJlY2VpdmVkID0gcmVjdihzbG90LT5mZCwgYnVmLCBzaXplLCAwKSk7Ci0KLSAgaWYgKHJlY2VpdmVkICE9IHNpemUpIHsKLSAgICBMT0dfRVJST1IoIiVzIGVycm9yIHJlY2VpdmluZyBSRkNPTU0gZGF0YSBmcm9tIGFwcDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBjbGVhbnVwX3JmY19zbG90KHNsb3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9zb2NrX3Njby5jYyBiL2J0aWYvc3JjL2J0aWZfc29ja19zY28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTcyZmEuLjAwMDAwMDAKLS0tIGEvYnRpZi9zcmMvYnRpZl9zb2NrX3Njby5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9zb2NrX3NjbyIKLQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X3NvY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9saXN0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NvY2tldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc29ja2V0IGFic3RyYWN0aW9uIGZvciBTQ08gY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIKLS8vIGxheWVyLiBJdCByZXR1cm5zIGZpbGUgZGVzY3JpcHRvcnMgcmVwcmVzZW50aW5nIHR3byB0eXBlcyBvZiBzb2NrZXRzOgotLy8gbGlzdGVuaW5nIChzZXJ2ZXIpIGFuZCBjb25uZWN0ZWQgKGNsaWVudCkgc29ja2V0cy4gTm8gU0NPIGRhdGEgaXMKLS8vIHRyYW5zZmVycmVkIGFjcm9zcyB0aGVzZSBzb2NrZXRzOyBpbnN0ZWFkLCB0aGV5IGFyZSB1c2VkIHRvIG1hbmFnZSBTQ08KLS8vIGNvbm5lY3Rpb24gbGlmZWN5Y2xlcyB3aGlsZSB0aGUgZGF0YSByb3V0aW5nIHRha2VzIHBsYWNlIG92ZXIgdGhlIEkyUyBidXMuCi0vLwotLy8gVGhpcyBjb2RlIGJyaWRnZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBCVE0gbGF5ZXIsIHdoaWNoIGltcGxlbWVudHMgU0NPCi0vLyBjb25uZWN0aW9ucywgYW5kIHRoZSBBbmRyb2lkIEhBTC4gSXQgYWRhcHRzIHRoZSBCVE0gcmVwcmVzZW50YXRpb24gb2YgU0NPCi0vLyBjb25uZWN0aW9ucyAoaW50ZWdlciBoYW5kbGVzKSB0byBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRhdGlvbiB1c2FibGUgYnkKLS8vIEFuZHJvaWQncyBMb2NhbFNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLS8vCi0vLyBTYW1wbGUgZmxvdyBmb3IgYW4gaW5jb21pbmcgY29ubmVjdGlvbjoKLS8vICAgYnRzb2NrX3Njb19saXN0ZW4oKSAgICAgICAtIGxpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKLS8vICAgY29ubmVjdGlvbl9yZXF1ZXN0X2NiKCkgICAtIGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdCBmcm9tIHJlbW90ZSBob3N0Ci0vLyAgIGNvbm5lY3RfY29tcGxldGVkX2NiKCkgICAgLSBjb25uZWN0aW9uIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZAotLy8gICBzb2NrZXRfcmVhZF9yZWFkeV9jYigpICAgIC0gbG9jYWwgaG9zdCBjbG9zZWQgU0NPIHNvY2tldAotLy8gICBkaXNjb25uZWN0X2NvbXBsZXRlZF9jYigpIC0gY29ubmVjdGlvbiB0ZXJtaW5hdGVkCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3Qgc2NvX2hhbmRsZTsKLSAgc29ja2V0X3QqIHNvY2tldDsKLSAgYm9vbCBjb25uZWN0X2NvbXBsZXRlZDsKLX0gc2NvX3NvY2tldF90OwotCi1zdGF0aWMgc2NvX3NvY2tldF90KiBzY29fc29ja2V0X2VzdGFibGlzaF9sb2NrZWQoYm9vbCBpc19saXN0ZW5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNvY2tfZmQpOwotc3RhdGljIHNjb19zb2NrZXRfdCogc2NvX3NvY2tldF9uZXcodm9pZCk7Ci1zdGF0aWMgdm9pZCBzY29fc29ja2V0X2ZyZWVfbG9ja2VkKHNjb19zb2NrZXRfdCogc29ja2V0KTsKLXN0YXRpYyBzY29fc29ja2V0X3QqIHNjb19zb2NrZXRfZmluZF9sb2NrZWQodWludDE2X3Qgc2NvX2hhbmRsZSk7Ci1zdGF0aWMgdm9pZCBjb25uZWN0aW9uX3JlcXVlc3RfY2IodEJUTV9FU0NPX0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0VTQ09fRVZUX0RBVEEqIGRhdGEpOwotc3RhdGljIHZvaWQgY29ubmVjdF9jb21wbGV0ZWRfY2IodWludDE2X3Qgc2NvX2hhbmRsZSk7Ci1zdGF0aWMgdm9pZCBkaXNjb25uZWN0X2NvbXBsZXRlZF9jYih1aW50MTZfdCBzY29faGFuZGxlKTsKLXN0YXRpYyB2b2lkIHNvY2tldF9yZWFkX3JlYWR5X2NiKHNvY2tldF90KiBzb2NrZXQsIHZvaWQqIGNvbnRleHQpOwotCi0vLyB8c2NvX2xvY2t8IHByb3RlY3RzIGFsbCBvZiB0aGUgc3RhdGljIHZhcmlhYmxlcyBiZWxvdyBhbmQKLS8vIGNhbGxzIGludG8gdGhlIEJUTSBsYXllci4KLXN0YXRpYyBzdGQ6Om11dGV4IHNjb19sb2NrOwotc3RhdGljIGxpc3RfdCogc2NvX3NvY2tldHM7ICAvLyBPd25zIGEgY29sbGVjdGlvbiBvZiBzY29fc29ja2V0X3Qgb2JqZWN0cy4KLXN0YXRpYyBzY29fc29ja2V0X3QqIGxpc3Rlbl9zY29fc29ja2V0OyAgLy8gTm90IG93bmVkLCBkbyBub3QgZnJlZS4KLXN0YXRpYyB0aHJlYWRfdCogdGhyZWFkOyAgICAgICAgICAgICAgICAgLy8gTm90IG93bmVkLCBkbyBub3QgZnJlZS4KLQotYnRfc3RhdHVzX3QgYnRzb2NrX3Njb19pbml0KHRocmVhZF90KiB0aHJlYWRfKSB7Ci0gIENIRUNLKHRocmVhZF8gIT0gTlVMTCk7Ci0KLSAgc2NvX3NvY2tldHMgPSBsaXN0X25ldygobGlzdF9mcmVlX2NiKXNjb19zb2NrZXRfZnJlZV9sb2NrZWQpOwotICBpZiAoIXNjb19zb2NrZXRzKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgdGhyZWFkID0gdGhyZWFkXzsKLSAgZW5oX2VzY29fcGFyYW1zX3QgcGFyYW1zID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhTQ09fQ09ERUNfQ1ZTRF9EMSk7Ci0gIEJUTV9TZXRFU2NvTW9kZSgmcGFyYW1zKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0c29ja19zY29fY2xlYW51cCh2b2lkKSB7Ci0gIGxpc3RfZnJlZShzY29fc29ja2V0cyk7Ci0gIHNjb19zb2NrZXRzID0gTlVMTDsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBidHNvY2tfc2NvX2xpc3RlbihpbnQqIHNvY2tfZmQsIFVOVVNFRF9BVFRSIGludCBmbGFncykgewotICBDSEVDSyhzb2NrX2ZkICE9IE5VTEwpOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhzY29fbG9jayk7Ci0KLSAgc2NvX3NvY2tldF90KiBzY29fc29ja2V0ID0gc2NvX3NvY2tldF9lc3RhYmxpc2hfbG9ja2VkKHRydWUsIE5VTEwsIHNvY2tfZmQpOwotICBpZiAoIXNjb19zb2NrZXQpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICBCVE1fUmVnRm9yRVNjb0V2dHMoc2NvX3NvY2tldC0+c2NvX2hhbmRsZSwgY29ubmVjdGlvbl9yZXF1ZXN0X2NiKTsKLSAgbGlzdGVuX3Njb19zb2NrZXQgPSBzY29fc29ja2V0OwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgYnRzb2NrX3Njb19jb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGludCogc29ja19mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBpbnQgZmxhZ3MpIHsKLSAgQ0hFQ0soYmRfYWRkciAhPSBOVUxMKTsKLSAgQ0hFQ0soc29ja19mZCAhPSBOVUxMKTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc2NvX2xvY2spOwotICBzY29fc29ja2V0X3QqIHNjb19zb2NrZXQgPQotICAgICAgc2NvX3NvY2tldF9lc3RhYmxpc2hfbG9ja2VkKGZhbHNlLCBiZF9hZGRyLCBzb2NrX2ZkKTsKLQotICByZXR1cm4gKHNjb19zb2NrZXQgIT0gTlVMTCkgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi0vLyBNdXN0IGJlIGNhbGxlZCB3aXRoIHxsb2NrfCBoZWxkLgotc3RhdGljIHNjb19zb2NrZXRfdCogc2NvX3NvY2tldF9lc3RhYmxpc2hfbG9ja2VkKGJvb2wgaXNfbGlzdGVuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzb2NrX2ZkKSB7Ci0gIGludCBwYWlyWzJdID0ge0lOVkFMSURfRkQsIElOVkFMSURfRkR9OwotICBzY29fc29ja2V0X3QqIHNjb19zb2NrZXQgPSBOVUxMOwotICBzb2NrZXRfdCogc29ja2V0ID0gTlVMTDsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotICBlbmhfZXNjb19wYXJhbXNfdCBwYXJhbXM7Ci0gIGlmIChzb2NrZXRwYWlyKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgcGFpcikgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBhbGxvY2F0ZSBzb2NrZXQgcGFpcjogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgc2NvX3NvY2tldCA9IHNjb19zb2NrZXRfbmV3KCk7Ci0gIGlmICghc2NvX3NvY2tldCkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBTQ08gc29ja2V0LiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgcGFyYW1zID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhTQ09fQ09ERUNfQ1ZTRF9EMSk7Ci0gIHN0YXR1cyA9IEJUTV9DcmVhdGVTY28oYmRfYWRkciwgIWlzX2xpc3RlbmluZywgcGFyYW1zLnBhY2tldF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAmc2NvX3NvY2tldC0+c2NvX2hhbmRsZSwgY29ubmVjdF9jb21wbGV0ZWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdF9jb21wbGV0ZWRfY2IpOwotICBpZiAoc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGNyZWF0ZSBTQ08gc29ja2V0OiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBzb2NrZXQgPSBzb2NrZXRfbmV3X2Zyb21fZmQocGFpclsxXSk7Ci0gIGlmICghc29ja2V0KSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYWxsb2NhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yICVkLiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBwYWlyWzFdKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgKnNvY2tfZmQgPSBwYWlyWzBdOyAgICAgICAgICAgLy8gVHJhbnNmZXIgb3duZXJzaGlwIG9mIG9uZSBlbmQgdG8gY2FsbGVyLgotICBzY29fc29ja2V0LT5zb2NrZXQgPSBzb2NrZXQ7ICAvLyBIYW5nIG9uIHRvIHRoZSBvdGhlciBlbmQuCi0gIGxpc3RfYXBwZW5kKHNjb19zb2NrZXRzLCBzY29fc29ja2V0KTsKLQotICBzb2NrZXRfcmVnaXN0ZXIoc29ja2V0LCB0aHJlYWRfZ2V0X3JlYWN0b3IodGhyZWFkKSwgc2NvX3NvY2tldCwKLSAgICAgICAgICAgICAgICAgIHNvY2tldF9yZWFkX3JlYWR5X2NiLCBOVUxMKTsKLSAgcmV0dXJuIHNjb19zb2NrZXQ7Ci0KLWVycm9yOjsKLSAgaWYgKHBhaXJbMF0gIT0gSU5WQUxJRF9GRCkgY2xvc2UocGFpclswXSk7Ci0gIGlmIChwYWlyWzFdICE9IElOVkFMSURfRkQpIGNsb3NlKHBhaXJbMV0pOwotCi0gIHNjb19zb2NrZXRfZnJlZV9sb2NrZWQoc2NvX3NvY2tldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc2NvX3NvY2tldF90KiBzY29fc29ja2V0X25ldyh2b2lkKSB7Ci0gIHNjb19zb2NrZXRfdCogc2NvX3NvY2tldCA9IChzY29fc29ja2V0X3QqKW9zaV9jYWxsb2Moc2l6ZW9mKHNjb19zb2NrZXRfdCkpOwotICBzY29fc29ja2V0LT5zY29faGFuZGxlID0gQlRNX0lOVkFMSURfU0NPX0lOREVYOwotICByZXR1cm4gc2NvX3NvY2tldDsKLX0KLQotLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCB8bG9ja3wgaGVsZCBleGNlcHQgZHVyaW5nIHRlYXJkb3duIHdoZW4gd2Uga25vdyB0aGUKLS8vIHNvY2tldCB0aHJlYWQKLS8vIGlzIG5vIGxvbmdlciBhbGl2ZS4KLXN0YXRpYyB2b2lkIHNjb19zb2NrZXRfZnJlZV9sb2NrZWQoc2NvX3NvY2tldF90KiBzY29fc29ja2V0KSB7Ci0gIGlmICghc2NvX3NvY2tldCkgcmV0dXJuOwotCi0gIGlmIChzY29fc29ja2V0LT5zY29faGFuZGxlICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkKLSAgICBCVE1fUmVtb3ZlU2NvKHNjb19zb2NrZXQtPnNjb19oYW5kbGUpOwotICBzb2NrZXRfZnJlZShzY29fc29ja2V0LT5zb2NrZXQpOwotICBvc2lfZnJlZShzY29fc29ja2V0KTsKLX0KLQotLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCB8bG9ja3wgaGVsZC4KLXN0YXRpYyBzY29fc29ja2V0X3QqIHNjb19zb2NrZXRfZmluZF9sb2NrZWQodWludDE2X3Qgc2NvX2hhbmRsZSkgewotICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihzY29fc29ja2V0cyk7Ci0gICAgICAgbm9kZSAhPSBsaXN0X2VuZChzY29fc29ja2V0cyk7IG5vZGUgPSBsaXN0X25leHQobm9kZSkpIHsKLSAgICBzY29fc29ja2V0X3QqIHNjb19zb2NrZXQgPSAoc2NvX3NvY2tldF90KilsaXN0X25vZGUobm9kZSk7Ci0gICAgaWYgKHNjb19zb2NrZXQtPnNjb19oYW5kbGUgPT0gc2NvX2hhbmRsZSkgcmV0dXJuIHNjb19zb2NrZXQ7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rpb25fcmVxdWVzdF9jYih0QlRNX0VTQ09fRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fRVNDT19FVlRfREFUQSogZGF0YSkgewotICBDSEVDSyhkYXRhICE9IE5VTEwpOwotCi0gIC8vIERvbid0IGNhcmUgYWJvdXQgY2hhbmdlIG9mIGxpbmsgcGFyYW1ldGVycywgb25seSBjb25uZWN0aW9uIHJlcXVlc3RzLgotICBpZiAoZXZlbnQgIT0gQlRNX0VTQ09fQ09OTl9SRVFfRVZUKSByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHNjb19sb2NrKTsKLQotICBjb25zdCB0QlRNX0VTQ09fQ09OTl9SRVFfRVZUX0RBVEEqIGNvbm5fZGF0YSA9ICZkYXRhLT5jb25uX2V2dDsKLSAgc2NvX3NvY2tldF90KiBzY29fc29ja2V0ID0gc2NvX3NvY2tldF9maW5kX2xvY2tlZChjb25uX2RhdGEtPnNjb19pbngpOwotICBpbnQgY2xpZW50X2ZkID0gSU5WQUxJRF9GRDsKLQotICB1aW50MTZfdCB0ZW1wOwotICBzY29fc29ja2V0X3QqIG5ld19zY29fc29ja2V0OwotCi0gIGlmICghc2NvX3NvY2tldCkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGZpbmQgc2NvX3NvY2tldCBmb3IgaGFuZGxlOiAlaHUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgY29ubl9kYXRhLT5zY29faW54KTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgaWYgKHNjb19zb2NrZXQgIT0gbGlzdGVuX3Njb19zb2NrZXQpIHsKLSAgICBMT0dfRVJST1IoCi0KLSAgICAgICAgIiVzIHJlY2VpdmVkIGNvbm5lY3Rpb24gcmVxdWVzdCBvbiBub24tbGlzdGVuaW5nIHNvY2tldCBoYW5kbGU6ICVodSIsCi0gICAgICAgIF9fZnVuY19fLCBjb25uX2RhdGEtPnNjb19pbngpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBuZXdfc2NvX3NvY2tldCA9IHNjb19zb2NrZXRfZXN0YWJsaXNoX2xvY2tlZCh0cnVlLCBOVUxMLCAmY2xpZW50X2ZkKTsKLSAgaWYgKCFuZXdfc2NvX3NvY2tldCkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBzY29fc29ja2V0LiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgLy8gU3dhcCBzb2NrZXQtPnNjb19oYW5kbGUgYW5kIG5ld19zb2NrZXQtPnNjb19oYW5kbGUKLSAgdGVtcCA9IHNjb19zb2NrZXQtPnNjb19oYW5kbGU7Ci0gIHNjb19zb2NrZXQtPnNjb19oYW5kbGUgPSBuZXdfc2NvX3NvY2tldC0+c2NvX2hhbmRsZTsKLSAgbmV3X3Njb19zb2NrZXQtPnNjb19oYW5kbGUgPSB0ZW1wOwotCi0gIHNvY2tfY29ubmVjdF9zaWduYWxfdCBjb25uZWN0X3NpZ25hbDsKLSAgY29ubmVjdF9zaWduYWwuc2l6ZSA9IHNpemVvZihjb25uZWN0X3NpZ25hbCk7Ci0gIGNvbm5lY3Rfc2lnbmFsLmJkX2FkZHIgPSBjb25uX2RhdGEtPmJkX2FkZHI7Ci0gIGNvbm5lY3Rfc2lnbmFsLmNoYW5uZWwgPSAwOwotICBjb25uZWN0X3NpZ25hbC5zdGF0dXMgPSAwOwotCi0gIGlmIChzb2NrZXRfd3JpdGVfYW5kX3RyYW5zZmVyX2ZkKHNjb19zb2NrZXQtPnNvY2tldCwgJmNvbm5lY3Rfc2lnbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY29ubmVjdF9zaWduYWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfZmQpICE9IHNpemVvZihjb25uZWN0X3NpZ25hbCkpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBzZW5kIG5ldyBmaWxlIGRlc2NyaXB0b3IgdG8gbGlzdGVuaW5nIHNvY2tldC4iLAotICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIEJUTV9SZWdGb3JFU2NvRXZ0cyhsaXN0ZW5fc2NvX3NvY2tldC0+c2NvX2hhbmRsZSwgY29ubmVjdGlvbl9yZXF1ZXN0X2NiKTsKLSAgQlRNX0VTY29Db25uUnNwKGNvbm5fZGF0YS0+c2NvX2lueCwgSENJX1NVQ0NFU1MsIE5VTEwpOwotCi0gIHJldHVybjsKLQotZXJyb3I6OwotICBpZiAoY2xpZW50X2ZkICE9IElOVkFMSURfRkQpIGNsb3NlKGNsaWVudF9mZCk7Ci0gIEJUTV9FU2NvQ29ublJzcChjb25uX2RhdGEtPnNjb19pbngsIEhDSV9FUlJfSE9TVF9SRUpFQ1RfUkVTT1VSQ0VTLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgY29ubmVjdF9jb21wbGV0ZWRfY2IodWludDE2X3Qgc2NvX2hhbmRsZSkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soc2NvX2xvY2spOwotCi0gIHNjb19zb2NrZXRfdCogc2NvX3NvY2tldCA9IHNjb19zb2NrZXRfZmluZF9sb2NrZWQoc2NvX2hhbmRsZSk7Ci0gIGlmICghc2NvX3NvY2tldCkgewotICAgIExPR19FUlJPUigiJXMgU0NPIHNvY2tldCBub3QgZm91bmQgb24gY29ubmVjdCBmb3IgaGFuZGxlOiAlaHUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc2NvX2hhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgc2NvX3NvY2tldC0+c29ja2V0IHdhcyBjbG9zZWQsIHdlIHNob3VsZCB0ZWFyIGRvd24gYmVjYXVzZSB0aGVyZSBpcyBubwotICAvLyBhcHAtbGV2ZWwKLSAgLy8gaW50ZXJlc3QgaW4gdGhlIFNDTyBzb2NrZXQuCi0gIGlmICghc2NvX3NvY2tldC0+c29ja2V0KSB7Ci0gICAgQlRNX1JlbW92ZVNjbyhzY29fc29ja2V0LT5zY29faGFuZGxlKTsKLSAgICBsaXN0X3JlbW92ZShzY29fc29ja2V0cywgc2NvX3NvY2tldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc2NvX3NvY2tldC0+Y29ubmVjdF9jb21wbGV0ZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBkaXNjb25uZWN0X2NvbXBsZXRlZF9jYih1aW50MTZfdCBzY29faGFuZGxlKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhzY29fbG9jayk7Ci0KLSAgc2NvX3NvY2tldF90KiBzY29fc29ja2V0ID0gc2NvX3NvY2tldF9maW5kX2xvY2tlZChzY29faGFuZGxlKTsKLSAgaWYgKCFzY29fc29ja2V0KSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBTQ08gc29ja2V0IG5vdCBmb3VuZCBvbiBkaXNjb25uZWN0IGZvciBoYW5kbGU6ICVodSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzY29faGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsaXN0X3JlbW92ZShzY29fc29ja2V0cywgc2NvX3NvY2tldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvY2tldF9yZWFkX3JlYWR5X2NiKFVOVVNFRF9BVFRSIHNvY2tldF90KiBzb2NrZXQsIHZvaWQqIGNvbnRleHQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHNjb19sb2NrKTsKLQotICBzY29fc29ja2V0X3QqIHNjb19zb2NrZXQgPSAoc2NvX3NvY2tldF90Kiljb250ZXh0OwotICBzb2NrZXRfZnJlZShzY29fc29ja2V0LT5zb2NrZXQpOwotICBzY29fc29ja2V0LT5zb2NrZXQgPSBOVUxMOwotCi0gIC8vIERlZmVyIHRoZSB1bmRlcmx5aW5nIGRpc2Nvbm5lY3QgdW50aWwgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVzCi0gIC8vIHNpbmNlIHRoZSBCVE0gY29kZSBkb2Vzbid0IGJlaGF2ZSBjb3JyZWN0bHkgd2hlbiBhIGRpc2Nvbm5lY3QKLSAgLy8gcmVxdWVzdCBpcyBpc3N1ZWQgd2hpbGUgYSBjb25uZWN0IGlzIGluIHByb2dyZXNzLiBUaGUgZmFjdCB0aGF0Ci0gIC8vIHNjb19zb2NrZXQtPnNvY2tldCA9PSBOVUxMIGluZGljYXRlcyB0byB0aGUgY29ubmVjdCBjYWxsYmFjawotICAvLyByb3V0aW5lIHRoYXQgdGhlIHNvY2tldCBpcyBubyBsb25nZXIgZGVzaXJlZCBhbmQgc2hvdWxkIGJlIHRvcm4KLSAgLy8gZG93bi4KLSAgaWYgKHNjb19zb2NrZXQtPmNvbm5lY3RfY29tcGxldGVkIHx8IHNjb19zb2NrZXQgPT0gbGlzdGVuX3Njb19zb2NrZXQpIHsKLSAgICBpZiAoQlRNX1JlbW92ZVNjbyhzY29fc29ja2V0LT5zY29faGFuZGxlKSA9PSBCVE1fU1VDQ0VTUykKLSAgICAgIGxpc3RfcmVtb3ZlKHNjb19zb2NrZXRzLCBzY29fc29ja2V0KTsKLSAgICBpZiAoc2NvX3NvY2tldCA9PSBsaXN0ZW5fc2NvX3NvY2tldCkgbGlzdGVuX3Njb19zb2NrZXQgPSBOVUxMOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX3NvY2tfc2RwLmNjIGIvYnRpZi9zcmMvYnRpZl9zb2NrX3NkcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMzZmMC4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3NvY2tfc2RwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX3NvY2tfc2RwIgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfanZfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX29wX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL3V0bC5oIgotI2luY2x1ZGUgImJ0YS9wYi9idGFfcGJzX2ludC5oIgotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3NvY2tfc2RwLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvbiB0b3Agb2YgdGhlIGxvd2VyLWxldmVsIFNEUCBkYXRhYmFzZQotLy8gY29kZSBmb3IgcmVnaXN0cmF0aW9uIGFuZCBkaXNjb3Zlcnkgb2YgdmFyaW91cyBibHVldG9vdGggc29ja2V0cy4KLS8vCi0vLyBUaGlzIGNvZGUgYWxzbyBwcm92aWRlcyBmb3Igb24tZGVtYW5kIHJlZ2lzdHJhdGlvbiBvZiAicHJlLXJlZ2lzdGVyZWQiCi0vLyBzZXJ2aWNlcyBhcyBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9uIHRvIHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucwotLy8gZXhwZWN0aW5nIGEgYmx1ZXogc3RhY2suCi0KLS8vIFJlYWxtIENoYXJhY3RlciBTZXQgLS0gMCBpcyBBU0NJSQotI2RlZmluZSBCVEFfUEJTX1JFQUxNX0NIQVJTRVQgMAotCi0vLyBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgY2xpZW50J3MgdXNlciBpZCBpcyByZXF1aXJlZCBkdXJpbmcgb2JleAotLy8gYXV0aGVudGljYXRpb24KLSNkZWZpbmUgQlRBX1BCU19VU0VSSURfUkVRIEZBTFNFCi0KLXN0YXRpYyBjb25zdCB0QlRBX1BCU19DRkcgYnRhX3Bic19jZmcgPSB7Ci0gICAgQlRBX1BCU19SRUFMTV9DSEFSU0VULCAgLy8gcmVhbG1fY2hhcnNldDogU2VydmVyIG9ubHkKLSAgICBCVEFfUEJTX1VTRVJJRF9SRVEsICAgICAvLyB1c2VyaWRfcmVxOiBTZXJ2ZXIgb25seQotICAgIChCVEFfUEJTX1NVUEZfRE9XTkxPQUQgfCBCVEFfUEJTX1NVUkZfQlJPV1NFKSwgIC8vIHN1cHBvcnRlZF9mZWF0dXJlcwotICAgIEJUQV9QQlNfUkVQT1NJVF9MT0NBTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRlZF9yZXBvc2l0b3JpZXMKLX07Ci0KLS8vIG9iamVjdCBmb3JtYXQgbG9va3VwIHRhYmxlCi0jZGVmaW5lIE9CRVhfUFVTSF9OVU1fRk9STUFUUyA3Ci0KLXN0YXRpYyBjb25zdCB0QlRBX09QX0ZNVCBidGFfb3BzX29ial9mbXRbT0JFWF9QVVNIX05VTV9GT1JNQVRTXSA9IHsKLSAgICBCVEFfT1BfVkNBUkQyMV9GTVQsIEJUQV9PUF9WQ0FSRDMwX0ZNVCwgQlRBX09QX1ZDQUxfRk1ULCBCVEFfT1BfSUNBTF9GTVQsCi0gICAgQlRBX09QX1ZOT1RFX0ZNVCwgICBCVEFfT1BfVk1TR19GTVQsICAgIEJUQV9PUF9PVEhFUl9GTVR9OwotCi0vLyBUT0RPKGp0Z2Fucyk6IEZpZ3VyZSBvdXQgaWYgd2UgYWN0dWFsbHkgbmVlZCB0aGlzIGRlZmluZS4gVGhpcyBpcyBpZm5kZWYKLS8vIGRlZmluZWQgaW4gYnRfdGFyZ2V0LmgsIGJ1dCBub3doZXJlIGVsc2UsIHNvIHJpZ2h0IG5vdywgdW5sZXNzIHNvbWV0aGluZwotLy8gb3ZlcnJpZGVzIHRoaXMgYmVmb3JlIGJ0X3RhcmdldC5oIHNldHMgaXQsIGl0IHdpbGwgYWx3YXlzIGJlIGJ0X3RhcmdldC5oJ3MKLS8vIHZlcnNpb24uCi0jaWZuZGVmIEJUVUlfT1BTX0ZPUk1BVFMKLSNkZWZpbmUgQlRVSV9PUFNfRk9STUFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEJUQV9PUF9WQ0FSRDIxX01BU0sgfCBCVEFfT1BfVkNBUkQzMF9NQVNLIHwgQlRBX09QX1ZDQUxfTUFTSyB8IFwKLSAgIEJUQV9PUF9JQ0FMX01BU0sgfCBCVEFfT1BfVk5PVEVfTUFTSyB8IEJUQV9PUF9WTVNHX01BU0sgfCBCVEFfT1BfQU5ZX01BU0spCi0jZW5kaWYKLQotI2RlZmluZSBSRVNFUlZFRF9TQ05fUEJTIDE5Ci0jZGVmaW5lIFJFU0VSVkVEX1NDTl9PUFMgMTIKLQotI2RlZmluZSBVVUlEX01BWF9MRU5HVEggMTYKLQotI2RlZmluZSBTUFBfUFJPRklMRV9WRVJTSU9OIDB4MDEwMgotCi0vLyBBZGRzIGEgcHJvdG9jb2wgbGlzdCBhbmQgc2VydmljZSBuYW1lIChpZiBwcm92aWRlZCkgdG8gYW4gU0RQIHJlY29yZCBnaXZlbiBieQotLy8gfHNkcF9oYW5kbGV8LCBhbmQgbWFya3MgaXQgYXMgYnJvd3NlYWJsZS4gVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBkZWZpbmluZyBhCi0vLyBzZXQgb2YgcHJvdG9jb2xzIHRoYXQgaW5jbHVkZXMgTDJDQVAsIFJGQ09NTSwgYW5kIG9wdGlvbmFsbHkgT0JFWC4gSWYKLS8vIHx3aXRoX29iZXh8IGlzIHx0cnVlfCwgdGhlbiBhbiBhZGRpdGlvbmFsIE9CRVggcHJvdG9jb2wgVVVJRCB3aWxsIGJlIGluY2x1ZGVkCi0vLyBhdCB0aGUgZW5kIG9mIHRoZSBwcm90b2NvbCBsaXN0LgotLy8KLS8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCi1zdGF0aWMgYm9vbCBjcmVhdGVfYmFzZV9yZWNvcmQoY29uc3QgdWludDMyX3Qgc2RwX2hhbmRsZSwgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBjaGFubmVsLCBjb25zdCBib29sIHdpdGhfb2JleCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCJjcmVhdGVfYmFzZV9yZWNvcmQ6IHNjbjogJWQsIG5hbWU6ICVzLCB3aXRoX29iZXg6ICVkIiwKLSAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBuYW1lLCB3aXRoX29iZXgpOwotCi0gIC8vIFNldHVwIHRoZSBwcm90b2NvbCBsaXN0IGFuZCBhZGQgaXQuCi0gIHRTRFBfUFJPVE9DT0xfRUxFTSBwcm90b19saXN0W1NEUF9NQVhfTElTVF9FTEVNU107Ci0gIGludCBudW1fcHJvdG9fZWxlbWVudHMgPSB3aXRoX29iZXggPyAzIDogMjsKLQotICBtZW1zZXQocHJvdG9fbGlzdCwgMCwgbnVtX3Byb3RvX2VsZW1lbnRzICogc2l6ZW9mKHRTRFBfUFJPVE9DT0xfRUxFTSkpOwotCi0gIHByb3RvX2xpc3RbMF0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfTDJDQVA7Ci0gIHByb3RvX2xpc3RbMF0ubnVtX3BhcmFtcyA9IDA7Ci0gIHByb3RvX2xpc3RbMV0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfUkZDT01NOwotICBwcm90b19saXN0WzFdLm51bV9wYXJhbXMgPSAxOwotICBwcm90b19saXN0WzFdLnBhcmFtc1swXSA9IGNoYW5uZWw7Ci0KLSAgaWYgKHdpdGhfb2JleCkgewotICAgIHByb3RvX2xpc3RbMl0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfT0JFWDsKLSAgICBwcm90b19saXN0WzJdLm51bV9wYXJhbXMgPSAwOwotICB9Ci0KLSAgLy8gTWFyayB0aGUgc2VydmljZSBhcyBicm93c2VhYmxlLgotICB1aW50MTZfdCBsaXN0ID0gVVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUDsKLQotICBjb25zdCBjaGFyKiBzdGFnZSA9ICJwcm90b2NvbF9saXN0IjsKLSAgaWYgKCFTRFBfQWRkUHJvdG9jb2xMaXN0KHNkcF9oYW5kbGUsIG51bV9wcm90b19lbGVtZW50cywgcHJvdG9fbGlzdCkpCi0gICAgZ290byBlcnJvcjsKLQotICAvLyBBZGQgdGhlIG5hbWUgdG8gdGhlIFNEUCByZWNvcmQuCi0gIGlmIChuYW1lWzBdICE9ICdcMCcpIHsKLSAgICBzdGFnZSA9ICJzZXJ2aWNlX25hbWUiOwotICAgIGlmICghU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSwgVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc3RybGVuKG5hbWUpLCAodWludDhfdCopbmFtZSkpCi0gICAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgc3RhZ2UgPSAiYnJvd3NlYWJsZSI7Ci0gIGlmICghU0RQX0FkZFV1aWRTZXF1ZW5jZShzZHBfaGFuZGxlLCBBVFRSX0lEX0JST1dTRV9HUk9VUF9MSVNULCAxLCAmbGlzdCkpCi0gICAgZ290byBlcnJvcjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgImNyZWF0ZV9iYXNlX3JlY29yZDogc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYmFzZSBzZXJ2aWNlICIKLSAgICAgICJyZWNvcmQsIGhhbmRsZTogMHglMDh4LCBzY246ICVkLCBuYW1lOiAlcywgd2l0aF9vYmV4OiAlZCIsCi0gICAgICBzZHBfaGFuZGxlLCBjaGFubmVsLCBuYW1lLCB3aXRoX29iZXgpOwotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3I6Ci0gIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAiY3JlYXRlX2Jhc2VfcmVjb3JkOiBmYWlsZWQgdG8gY3JlYXRlIGJhc2Ugc2VydmljZSAiCi0gICAgICAicmVjb3JkLCBzdGFnZTogJXMsIHNjbjogJWQsIG5hbWU6ICVzLCB3aXRoX29iZXg6ICVkIiwKLSAgICAgIHN0YWdlLCBjaGFubmVsLCBuYW1lLCB3aXRoX29iZXgpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFJlZ2lzdGVycyBhIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gfG5hbWV8LCB8dXVpZHwsIGFuZCB8Y2hhbm5lbHwgaW4gdGhlIFNEUAotLy8gZGF0YWJhc2UgYXMgYSBnZW5lcmljIEwyQ0FQIFJGQ09NTSBwcm90b2NvbCwgc3RvcmluZyBpdHMgfHV1aWR8IGFzIGEgc2VydmljZQotLy8gY2xhc3Mgc2VxdWVuY2UuCi1zdGF0aWMgaW50IGFkZF9zZHBfYnlfdXVpZChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgY2hhbm5lbCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogdXVpZDogJXMsIHNjbjogJWQsIHNlcnZpY2VfbmFtZTogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICB1dWlkLlRvU3RyaW5nKCkuY19zdHIoKSwgY2hhbm5lbCwgbmFtZSk7Ci0KLSAgdWludDMyX3QgaGFuZGxlID0gU0RQX0NyZWF0ZVJlY29yZCgpOwotICBpZiAoaGFuZGxlID09IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IGZhaWxlZCB0byBjcmVhdGUgc2RwIHJlY29yZCwgc2NuOiAlZCwgc2VydmljZV9uYW1lOiAlcyIsIF9fZnVuY19fLAotICAgICAgICBjaGFubmVsLCBuYW1lKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIENvbnZlcnQgdGhlIHx1dWlkfCBpbnRvIGEgYmlnLWVuZGlhbiByZXByZXNlbnRhdGlvbiBhbmQgYWRkIGl0IGFzIGEKLSAgLy8gc2VxdWVuY2UuCi0gIHVpbnQ4X3QgdHlwZSA9IFVVSURfREVTQ19UWVBFOwotICB1aW50OF90IHR5cGVfbGVuID0gVVVJRF9NQVhfTEVOR1RIOwotICB1aW50OF90IHR5cGVfYnVmWzQ4XTsKLSAgLy8gU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdHlwZSBidWYgaW4gYSBwb2ludGVyIG9uIHRoZSBzdGFjaywgc28gd2UgY2FuIHBhc3MKLSAgLy8gYSBkb3VibGUgcG9pbnRlciB0byBTRFBfQWRkU2VxdWVuY2UKLSAgdWludDhfdCogdHlwZV9idWZfcHRyID0gdHlwZV9idWY7Ci0gIHVpbnQ4X3QqIHRtcCA9IHR5cGVfYnVmOwotCi0gIC8vIENyZWF0ZSB0aGUgYmFzZSBTRFAgcmVjb3JkLgotICBjb25zdCBjaGFyKiBzdGFnZSA9ICJjcmVhdGVfYmFzZV9yZWNvcmQiOwotICBpZiAoIWNyZWF0ZV9iYXNlX3JlY29yZChoYW5kbGUsIG5hbWUsIGNoYW5uZWwsIGZhbHNlIC8qIHdpdGhfb2JleCAqLykpCi0gICAgZ290byBlcnJvcjsKLQotICAvLyBEbyB0aGUgY29udmVyc2lvbiB0byBiaWctZW5kaWFuIC0tIHRtcCBpcyBvbmx5IHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZQotICAvLyBVVUlEIGFycmF5IGluIHRoZSBtYWNybyBhbmQgc2VydmVzIG5vIG90aGVyIHB1cnBvc2UgYXMgdGhlIGNvbnZlcnNpb24KLSAgLy8gbWFjcm9zIGFyZSBub3QgaHlnZW5pYy4KLQotICB7IEFSUkFZX1RPX0JFX1NUUkVBTSh0bXAsIHV1aWQuVG8xMjhCaXRCRSgpLmRhdGEoKSwgVVVJRF9NQVhfTEVOR1RIKTsgfQotCi0gIHN0YWdlID0gInNlcnZpY2VfY2xhc3Nfc2VxdWVuY2UiOwotICBpZiAoIVNEUF9BZGRTZXF1ZW5jZShoYW5kbGUsICh1aW50MTZfdClBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnR5cGUsICZ0eXBlX2xlbiwgJnR5cGVfYnVmX3B0cikpCi0gICAgZ290byBlcnJvcjsKLQotICBBUFBMX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBzZXJ2aWNlIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5LCBzZXJ2aWNlX25hbWU6ICVzLCBoYW5kbGU6IDB4JTA4eCIsCi0gICAgICBfX2Z1bmNfXywgbmFtZSwgaGFuZGxlKTsKLQotICB7Ci0gICAgLy8gV3JpdGUgdGhlIGN1c3RvbSAxMjgtYml0IFVVSUQgdG8gRUlSCi0gICAgdEJUQV9DVVNUT01fVVVJRCBjdXJyID0ge3V1aWQsIGhhbmRsZX07Ci0gICAgYnRhX3N5c19hZGRfY3VzdF91dWlkKGN1cnIpOwotICB9Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLQotZXJyb3I6Ci0gIFNEUF9EZWxldGVSZWNvcmQoaGFuZGxlKTsKLSAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBzZXJ2aWNlIHN0YWdlOiAlcywgc2VydmljZV9uYW1lOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YWdlLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFJlZ2lzdGVycyBhIHNlcnZpY2Ugd2l0aCB0aGUgZ2l2ZW4gfG5hbWV8IGFuZCB8Y2hhbm5lbHwgaW4gdGhlIFNEUAotLy8gZGF0YWJhc2UgYXMgYSBQQkFQIHByb3RvY29sLgotc3RhdGljIGludCBhZGRfcGJhcF9zZHAoY29uc3QgY2hhciogbmFtZSwgY29uc3QgaW50IGNoYW5uZWwpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiYWRkX3BiYXBfc2RwOiBzY24gJWQsIHNlcnZpY2VfbmFtZSAlcyIsIGNoYW5uZWwsIG5hbWUpOwotCi0gIHVpbnQzMl90IGhhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgaWYgKGhhbmRsZSA9PSAwKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgImFkZF9wYmFwX3NkcDogZmFpbGVkIHRvIGNyZWF0ZSBzZHAgcmVjb3JkLCAiCi0gICAgICAgICJzZXJ2aWNlX25hbWU6ICVzIiwKLSAgICAgICAgbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB1aW50MTZfdCBzZXJ2aWNlID0gVVVJRF9TRVJWQ0xBU1NfUEJBUF9QU0U7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBiYXNlIFNEUCByZWNvcmQuCi0gIGNvbnN0IGNoYXIqIHN0YWdlID0gImNyZWF0ZV9iYXNlX3JlY29yZCI7Ci0gIGlmICghY3JlYXRlX2Jhc2VfcmVjb3JkKGhhbmRsZSwgbmFtZSwgY2hhbm5lbCwgdHJ1ZSAvKiB3aXRoX29iZXggKi8pKQotICAgIGdvdG8gZXJyb3I7Ci0KLSAgLy8gQWRkIHNlcnZpY2UgY2xhc3MKLSAgc3RhZ2UgPSAic2VydmljZV9jbGFzcyI7Ci0gIGlmICghU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChoYW5kbGUsIDEsICZzZXJ2aWNlKSkgZ290byBlcnJvcjsKLQotICAvLyBBZGQgaW4gdGhlIHBob25lIGFjY2VzcyBkZXNjcmlwdG9yCi0gIHN0YWdlID0gInByb2ZpbGVfZGVzY3JpcHRvcl9saXN0IjsKLSAgaWYgKCFTRFBfQWRkUHJvZmlsZURlc2NyaXB0b3JMaXN0KGhhbmRsZSwgVVVJRF9TRVJWQ0xBU1NfUEhPTkVfQUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX1BCU19ERUZBVUxUX1ZFUlNJT04pKQotICAgIGdvdG8gZXJyb3I7Ci0KLSAgLy8gU2V0IHVwIG91ciBzdXBwb3J0ZWQgcmVwb3NpdG9yaWVzCi0gIHN0YWdlID0gInN1cHBvcnRlZF9yZXBvc2l0b3JpZXMiOwotICBpZiAoIVNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9SRVBPU0lUT1JJRVMsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgMSwgKHVpbnQ4X3QqKSZidGFfcGJzX2NmZy5zdXBwb3J0ZWRfcmVwb3NpdG9yaWVzKSkKLSAgICBnb3RvIGVycm9yOwotCi0gIC8vIE5vdGlmeSB0aGUgc3lzdGVtIHRoYXQgd2UndmUgZ290IGEgbmV3IHNlcnZpY2UgY2xhc3MgVVVJRC4KLSAgYnRhX3N5c19hZGRfdXVpZChVVUlEX1NFUlZDTEFTU19QQkFQX1BTRSk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiYWRkX3BiYXBfc2RwOiBzZXJ2aWNlIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5LCAiCi0gICAgICAic2VydmljZV9uYW1lOiAlcywgaGFuZGxlOiAweCUwOHgiLAotICAgICAgbmFtZSwgaGFuZGxlKTsKLQotICByZXR1cm4gaGFuZGxlOwotCi1lcnJvcjoKLSAgU0RQX0RlbGV0ZVJlY29yZChoYW5kbGUpOwotICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgImFkZF9wYmFwX3NkcDogZmFpbGVkIHRvIHJlZ2lzdGVyIFBCQVAgc2VydmljZSwgc3RhZ2U6ICVzLCAiCi0gICAgICAic2VydmljZV9uYW1lOiAlcyIsCi0gICAgICBzdGFnZSwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQotLy8gUmVnaXN0ZXJzIGEgc2VydmljZSB3aXRoIHRoZSBnaXZlbiB8bmFtZXwgYW5kIHxjaGFubmVsfCBhcyBhbiBPQkVYIFB1c2gKLS8vIHByb3RvY29sLgotc3RhdGljIGludCBhZGRfb3BzX3NkcChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBpbnQgY2hhbm5lbCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCJhZGRfb3BzX3NkcDogc2NuICVkLCBzZXJ2aWNlX25hbWUgJXMiLCBjaGFubmVsLCBuYW1lKTsKLQotICB1aW50MzJfdCBoYW5kbGUgPSBTRFBfQ3JlYXRlUmVjb3JkKCk7Ci0gIGlmIChoYW5kbGUgPT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICJhZGRfb3BzX3NkcDogZmFpbGVkIHRvIGNyZWF0ZSBzZHAgcmVjb3JkLCAiCi0gICAgICAgICJzZXJ2aWNlX25hbWU6ICVzIiwKLSAgICAgICAgbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBBZGQgc2VxdWVuY2UgZm9yIHN1cHBvcnRlZCB0eXBlcy4KLSAgdWludDhfdCBkZXNjX3R5cGVbT0JFWF9QVVNIX05VTV9GT1JNQVRTXTsKLSAgdWludDhfdCB0eXBlX2xlbltPQkVYX1BVU0hfTlVNX0ZPUk1BVFNdOwotICB1aW50OF90KiB0eXBlX3ZhbHVlW09CRVhfUFVTSF9OVU1fRk9STUFUU107Ci0gIHVpbnQ4X3QgaiA9IDA7Ci0KLSAgdWludDE2X3Qgc2VydmljZSA9IFVVSURfU0VSVkNMQVNTX09CRVhfT0JKRUNUX1BVU0g7Ci0gIHRCVEFfVVRMX0NPRCBjb2Q7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBiYXNlIFNEUCByZWNvcmQuCi0gIGNvbnN0IGNoYXIqIHN0YWdlID0gImNyZWF0ZV9iYXNlX3JlY29yZCI7Ci0gIGlmICghY3JlYXRlX2Jhc2VfcmVjb3JkKGhhbmRsZSwgbmFtZSwgY2hhbm5lbCwgdHJ1ZSAvKiB3aXRoX29iZXggKi8pKQotICAgIGdvdG8gZXJyb3I7Ci0KLSAgLy8gQWRkIHNlcnZpY2UgY2xhc3MuCi0gIHN0YWdlID0gInNlcnZpY2VfY2xhc3MiOwotICBpZiAoIVNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QoaGFuZGxlLCAxLCAmc2VydmljZSkpIGdvdG8gZXJyb3I7Ci0KLSAgLy8gQWRkIHRoZSBPQkVYIHB1c2ggcHJvZmlsZSBkZXNjcmlwdG9yLgotICBzdGFnZSA9ICJwcm9maWxlX2Rlc2NyaXB0b3JfbGlzdCI7Ci0gIGlmICghU0RQX0FkZFByb2ZpbGVEZXNjcmlwdG9yTGlzdChoYW5kbGUsIFVVSURfU0VSVkNMQVNTX09CRVhfT0JKRUNUX1BVU0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDApKQotICAgIGdvdG8gZXJyb3I7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBPQkVYX1BVU0hfTlVNX0ZPUk1BVFM7IGkrKykgewotICAgIGlmICgoQlRVSV9PUFNfRk9STUFUUyA+PiBpKSAmIDEpIHsKLSAgICAgIHR5cGVfdmFsdWVbal0gPSAodWludDhfdCopKCZidGFfb3BzX29ial9mbXRbaV0pOwotICAgICAgZGVzY190eXBlW2pdID0gVUlOVF9ERVNDX1RZUEU7Ci0gICAgICB0eXBlX2xlbltqKytdID0gMTsKLSAgICB9Ci0gIH0KLQotICBzdGFnZSA9ICJzdXBwb3J0ZWRfdHlwZXMiOwotICBpZiAoIVNEUF9BZGRTZXF1ZW5jZShoYW5kbGUsICh1aW50MTZfdClBVFRSX0lEX1NVUFBPUlRFRF9GT1JNQVRTX0xJU1QsIGosCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2NfdHlwZSwgdHlwZV9sZW4sIHR5cGVfdmFsdWUpKQotICAgIGdvdG8gZXJyb3I7Ci0KLSAgLy8gU2V0IGNsYXNzIG9mIGRldmljZS4KLSAgY29kLnNlcnZpY2UgPSBCVE1fQ09EX1NFUlZJQ0VfT0JKX1RSQU5TRkVSOwotICBzdGFnZSA9ICJjbGFzc19vZl9kZXZpY2UiOwotICBpZiAoIXV0bF9zZXRfZGV2aWNlX2NsYXNzKCZjb2QsIEJUQV9VVExfU0VUX0NPRF9TRVJWSUNFX0NMQVNTKSkgZ290byBlcnJvcjsKLQotICAvLyBOb3RpZnkgdGhlIHN5c3RlbSB0aGF0IHdlJ3ZlIGdvdCBhIG5ldyBzZXJ2aWNlIGNsYXNzIFVVSUQuCi0gIGJ0YV9zeXNfYWRkX3V1aWQoVVVJRF9TRVJWQ0xBU1NfT0JFWF9PQkpFQ1RfUFVTSCk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoCi0gICAgICAiYWRfbWFwc19zZHA6IHNlcnZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHksICIKLSAgICAgICJzZXJ2aWNlX25hbWU6ICVzLCBoYW5kbGUgMHglMDh4KSIsCi0gICAgICBuYW1lLCBoYW5kbGUpOwotCi0gIHJldHVybiBoYW5kbGU7Ci0KLWVycm9yOgotICBTRFBfRGVsZXRlUmVjb3JkKGhhbmRsZSk7Ci0gIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAiYWRkX29wc19zZHA6IGZhaWxlZCB0byByZWdpc3RlciBPUFMgc2VydmljZSwgIgotICAgICAgInN0YWdlOiAlcywgc2VydmljZV9uYW1lOiAlcyIsCi0gICAgICBzdGFnZSwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQotCi0vLyBSZWdpc3RlcnMgYSBzZXJ2aWNlIHdpdGggdGhlIGdpdmVuIHxuYW1lfCBhbmQgfGNoYW5uZWx8IGFzIGEgc2VyaWFsIHBvcnQKLS8vIHByb2ZpbGUgcHJvdG9jb2wuCi1zdGF0aWMgaW50IGFkZF9zcHBfc2RwKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGludCBjaGFubmVsKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoImFkZF9zcHBfc2RwOiBzY24gJWQsIHNlcnZpY2VfbmFtZSAlcyIsIGNoYW5uZWwsIG5hbWUpOwotCi0gIGludCBoYW5kbGUgPSBTRFBfQ3JlYXRlUmVjb3JkKCk7Ci0gIGlmIChoYW5kbGUgPT0gMCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICJhZGRfc3BwX3NkcDogZmFpbGVkIHRvIGNyZWF0ZSBzZHAgcmVjb3JkLCAiCi0gICAgICAgICJzZXJ2aWNlX25hbWU6ICVzIiwKLSAgICAgICAgbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIGJhc2UgU0RQIHJlY29yZC4KLSAgY29uc3QgY2hhciogc3RhZ2UgPSAiY3JlYXRlX2Jhc2VfcmVjb3JkIjsKLSAgdWludDE2X3Qgc2VydmljZSA9IFVVSURfU0VSVkNMQVNTX1NFUklBTF9QT1JUOwotCi0gIGlmICghY3JlYXRlX2Jhc2VfcmVjb3JkKGhhbmRsZSwgbmFtZSwgY2hhbm5lbCwgZmFsc2UgLyogd2l0aF9vYmV4ICovKSkKLSAgICBnb3RvIGVycm9yOwotCi0gIHN0YWdlID0gInNlcnZpY2VfY2xhc3MiOwotICBpZiAoIVNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QoaGFuZGxlLCAxLCAmc2VydmljZSkpIGdvdG8gZXJyb3I7Ci0KLSAgc3RhZ2UgPSAicHJvZmlsZV9kZXNjcmlwdG9yX2xpc3QiOwotICBpZiAoIVNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoaGFuZGxlLCBVVUlEX1NFUlZDTEFTU19TRVJJQUxfUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQUF9QUk9GSUxFX1ZFUlNJT04pKQotICAgIGdvdG8gZXJyb3I7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygKLSAgICAgICJhZGRfc3BwX3NkcDogc2VydmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseSwgIgotICAgICAgInNlcnZpY2VfbmFtZTogJXMsIGhhbmRsZSAweCUwOHgpIiwKLSAgICAgIG5hbWUsIGhhbmRsZSk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLQotZXJyb3I6Ci0gIFNEUF9EZWxldGVSZWNvcmQoaGFuZGxlKTsKLSAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICJhZGRfc3BwX3NkcDogZmFpbGVkIHRvIHJlZ2lzdGVyIFNQUCBzZXJ2aWNlLCAiCi0gICAgICAic3RhZ2U6ICVzLCBzZXJ2aWNlX25hbWU6ICVzIiwKLSAgICAgIHN0YWdlLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIEFkZHMgYW4gUkZDT01NIFNEUCByZWNvcmQgZm9yIGEgc2VydmljZSB3aXRoIHRoZSBnaXZlbiB8bmFtZXwsIHx1dWlkfCwgYW5kCi0vLyB8Y2hhbm5lbHwuIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UgYmFzZWQKLS8vIHVwb24gaXRzIHx1dWlkfCwgYW5kIHdpbGwgb3ZlcnJpZGUgdGhlIHxjaGFubmVsfCB3aXRoIGEgcmVzZXJ2ZWQgY2hhbm5lbAotLy8gbnVtYmVyIGlmIHRoZSB8dXVpZHwgbWF0Y2hlcyBvbmUgb2YgdGhlIHByZXJlZ2lzdGVyZWQgYmx1ZXogU0RQIHJlY29yZHMuCi1zdGF0aWMgaW50IGFkZF9yZmNfc2RwX2J5X3V1aWQoY29uc3QgY2hhciogbmFtZSwgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogdXVpZDogJXMsIHNlcnZpY2VfbmFtZTogJXMsIGNoYW5uZWw6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgdXVpZC5Ub1N0cmluZygpLmNfc3RyKCksIG5hbWUsIGNoYW5uZWwpOwotCi0gIC8qCi0gICAqIEJsdWV0b290aCBTb2NrZXQgQVBJIHJlbGllcyBvbiBoYXZpbmcgcHJlcmVnaXN0ZXJlZCBibHVleiBzZHAgcmVjb3JkcyBmb3IKLSAgICogSFNBRywgSEZBRywgT1BQICYgUEJBUCB0aGF0IGFyZSBtYXBwZWQgdG8gcmMgY2hhbiAxMCwgMTEsMTIgJiAxOS4gVG9kYXkKLSAgICogSFNBRyBhbmQgSEZBRyBpcyByb3V0ZWQgdG8gQlJDTSBBRyBhbmQgYXJlIG5vdCB1c2luZyBCVCBzb2NrZXQgQVBJIHNvIGZvcgotICAgKiBub3cgd2Ugd2lsbCBuZWVkIHRvIHN1cHBvcnQgT1BQIGFuZCBQQkFQIHRvIGVuYWJsZSAzcmQgcGFydHkgZGV2ZWxvcGVyIGFwcHMKLSAgICogcnVubmluZyBvbiBCUkNNIEFuZHJvaWQuCi0gICAqCi0gICAqIFRvIGRvIHRoaXMgd2Ugd2lsbCBjaGVjayB0aGUgVVVJRCBmb3IgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlIGFuZCBtaW1pYyB0aGUKLSAgICogU0RQIHJlY29yZHMgb2YgYmx1ZXogdXBvbiByZWNlcHRpb24uICBTZWUgZnVuY3Rpb25zIGFkZF9vcHVzaCgpIGFuZAotICAgKiBhZGRfcGJhcCgpIGluIHNkcHRvb2wuYyBmb3IgYWN0dWFsIHJlY29yZHMuCi0gICAqLwotCi0gIGludCBmaW5hbF9jaGFubmVsID0gZ2V0X3Jlc2VydmVkX3JmY19jaGFubmVsKHV1aWQpOwotCi0gIGlmIChmaW5hbF9jaGFubmVsID09IC0xKSB7Ci0gICAgZmluYWxfY2hhbm5lbCA9IGNoYW5uZWw7Ci0gIH0KLQotICBpbnQgaGFuZGxlID0gMDsKLQotICBpZiAodXVpZCA9PSBVVUlEX09CRVhfT0JKRUNUX1BVU0gpIHsKLSAgICBoYW5kbGUgPSBhZGRfb3BzX3NkcChuYW1lLCBmaW5hbF9jaGFubmVsKTsKLSAgfSBlbHNlIGlmICh1dWlkID09IFVVSURfUEJBUF9QU0UpIHsKLSAgICAvLyBQQkFQIFNlcnZlciBpcyBhbHdheXMgY2hhbm5lbCAxOQotICAgIGhhbmRsZSA9IGFkZF9wYmFwX3NkcChuYW1lLCBmaW5hbF9jaGFubmVsKTsKLSAgfSBlbHNlIGlmICh1dWlkID09IFVVSURfU1BQKSB7Ci0gICAgaGFuZGxlID0gYWRkX3NwcF9zZHAobmFtZSwgZmluYWxfY2hhbm5lbCk7Ci0gIH0gZWxzZSBpZiAodXVpZCA9PSBVVUlEX01BUF9NQVMpIHsKLSAgICAvLyBSZWNvcmQgY3JlYXRlZCBieSBuZXcgU0RQIGNyZWF0ZSByZWNvcmQgaW50ZXJmYWNlCi0gICAgaGFuZGxlID0gMHhmZjsKLSAgfSBlbHNlIHsKLSAgICBoYW5kbGUgPSBhZGRfc2RwX2J5X3V1aWQobmFtZSwgdXVpZCwgZmluYWxfY2hhbm5lbCk7Ci0gIH0KLQotICByZXR1cm4gaGFuZGxlOwotfQotCi1ib29sIGlzX3Jlc2VydmVkX3JmY19jaGFubmVsKGNvbnN0IGludCBjaGFubmVsKSB7Ci0gIHN3aXRjaCAoY2hhbm5lbCkgewotICAgIGNhc2UgUkVTRVJWRURfU0NOX1BCUzoKLSAgICBjYXNlIFJFU0VSVkVEX1NDTl9PUFM6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50IGdldF9yZXNlcnZlZF9yZmNfY2hhbm5lbChjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQpIHsKLSAgaWYgKHV1aWQgPT0gVVVJRF9QQkFQX1BTRSkgewotICAgIHJldHVybiBSRVNFUlZFRF9TQ05fUEJTOwotICB9IGVsc2UgaWYgKHV1aWQgPT0gVVVJRF9PQkVYX09CSkVDVF9QVVNIKSB7Ci0gICAgcmV0dXJuIFJFU0VSVkVEX1NDTl9PUFM7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLS8vIEFkZHMgYW4gU0RQIHJlY29yZCB0byB0aGUgU0RQIGRhdGFiYXNlIHVzaW5nIHRoZSBnaXZlbiB8bmFtZXwsIHx1dWlkfCwgYW5kCi0vLyB8Y2hhbm5lbHwuIE5vdGUgdGhhdCBpZiB0aGUgfHV1aWR8IGlzIGVtcHR5LCB0aGUgfHV1aWR8IHdpbGwgYmUgc2V0IGJhc2VkCi0vLyB1cG9uIHRoZSB8Y2hhbm5lbHwgcGFzc2VkIGluLgotaW50IGFkZF9yZmNfc2RwX3JlYyhjb25zdCBjaGFyKiBuYW1lLCBVdWlkIHV1aWQsIGNvbnN0IGludCBjaGFubmVsKSB7Ci0gIGlmICh1dWlkLklzRW1wdHkoKSkgewotICAgIHN3aXRjaCAoY2hhbm5lbCkgewotICAgICAgY2FzZSBSRVNFUlZFRF9TQ05fUEJTOiAgLy8gUEJBUCBSZXNlcnZlZCBwb3J0Ci0gICAgICAgIHV1aWQgPSBVVUlEX1BCQVBfUFNFOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSRVNFUlZFRF9TQ05fT1BTOgotICAgICAgICB1dWlkID0gVVVJRF9PQkVYX09CSkVDVF9QVVNIOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdXVpZCA9IFVVSURfU1BQOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gYWRkX3JmY19zZHBfYnlfdXVpZChuYW1lLCB1dWlkLCBjaGFubmVsKTsKLX0KLQotLy8gRGVsZXRlcyBhbiBTRFAgcmVjb3JkIHdpdGggdGhlIGdpdmVuIHxoYW5kbGV8Lgotdm9pZCBkZWxfcmZjX3NkcF9yZWMoaW50IGhhbmRsZSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCJkZWxfcmZjX3NkcF9yZWM6IGhhbmRsZToweCV4IiwgaGFuZGxlKTsKLQotICBpZiAoKGhhbmRsZSAhPSAtMSkgJiYgKGhhbmRsZSAhPSAwKSkgewotICAgIC8vIFJlbW92ZSB0aGUgY3VzdG9tIDEyOC1iaXQgVVVJRCBmcm9tIEVJUgotICAgIGNvbnN0IHRCVEFfQ1VTVE9NX1VVSUQgY3VyciA9IHtVdWlkOjprRW1wdHksICh1aW50MzJfdCloYW5kbGV9OwotICAgIGJ0YV9zeXNfcmVtb3ZlX2N1c3RfdXVpZChjdXJyKTsKLQotICAgIEJUQV9KdkRlbGV0ZVJlY29yZChoYW5kbGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX3NvY2tfdGhyZWFkLmNjIGIvYnRpZi9zcmMvYnRpZl9zb2NrX3RocmVhZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNDBlNy4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3NvY2tfdGhyZWFkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfc29ja190aHJlYWQuY2MKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgc29ja2V0IHNlbGVjdCB0aHJlYWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfc29jayIKLQotI2luY2x1ZGUgImJ0aWZfc29ja190aHJlYWQuaCIKLQotI2luY2x1ZGUgPGFsbG9jYS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9zb2NrLmgiCi0jaW5jbHVkZSAiYnRpZl9zb2NrX3V0aWwuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zb2NrZXRfdXRpbHMvc29ja2V0cy5oIgotCi0jZGVmaW5lIGFzcnQocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKHMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIjIyAlcyBhc3NlcnQgJXMgZmFpbGVkIGF0IGxpbmU6JWQgIyMiLCBfX2Z1bmNfXywgI3MsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIE1BWF9USFJFQUQgOAotI2RlZmluZSBNQVhfUE9MTCA2NAotI2RlZmluZSBQT0xMX0VYQ0VQVElPTl9FVkVOVFMgKFBPTExIVVAgfCBQT0xMUkRIVVAgfCBQT0xMRVJSIHwgUE9MTE5WQUwpCi0jZGVmaW5lIElTX0VYQ0VQVElPTihlKSAoKGUpJlBPTExfRVhDRVBUSU9OX0VWRU5UUykKLSNkZWZpbmUgSVNfUkVBRChlKSAoKGUpJlBPTExJTikKLSNkZWZpbmUgSVNfV1JJVEUoZSkgKChlKSZQT0xMT1VUKQotLypjbWQgZXhlY3V0ZXMgaW4gc29ja2V0IHBvbGwgdGhyZWFkICovCi0jZGVmaW5lIENNRF9XQUtFVVAgMQotI2RlZmluZSBDTURfRVhJVCAyCi0jZGVmaW5lIENNRF9BRERfRkQgMwotI2RlZmluZSBDTURfUkVNT1ZFX0ZEIDQKLSNkZWZpbmUgQ01EX1VTRVJfUFJJVkFURSA1Ci0KLXN0cnVjdCBwb2xsX3Nsb3RfdCB7Ci0gIHN0cnVjdCBwb2xsZmQgcGZkOwotICB1aW50MzJfdCB1c2VyX2lkOwotICBpbnQgdHlwZTsKLSAgaW50IGZsYWdzOwotfTsKLXN0cnVjdCB0aHJlYWRfc2xvdF90IHsKLSAgaW50IGNtZF9mZHIsIGNtZF9mZHc7Ci0gIGludCBwb2xsX2NvdW50OwotICBwb2xsX3Nsb3RfdCBwc1tNQVhfUE9MTF07Ci0gIGludCBwc2lbTUFYX1BPTExdOyAgLy8gaW5kZXggb2YgcG9sbCBzbG90Ci0gIHN0ZDo6b3B0aW9uYWw8cHRocmVhZF90PiB0aHJlYWRfaWQ7Ci0gIGJ0c29ja19zaWduYWxlZF9jYiBjYWxsYmFjazsKLSAgYnRzb2NrX2NtZF9jYiBjbWRfY2FsbGJhY2s7Ci0gIGludCB1c2VkOwotfTsKLXN0YXRpYyB0aHJlYWRfc2xvdF90IHRzW01BWF9USFJFQURdOwotCi1zdGF0aWMgdm9pZCogc29ja19wb2xsX3RocmVhZCh2b2lkKiBhcmcpOwotc3RhdGljIGlubGluZSB2b2lkIGNsb3NlX2NtZF9mZChpbnQgaCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfcG9sbChpbnQgaCwgaW50IGZkLCBpbnQgdHlwZSwgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQpOwotCi1zdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggdGhyZWFkX3Nsb3RfbG9jazsKLQotc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3RocmVhZCh2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKSwgdm9pZCogYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX3QqIHRocmVhZF9pZCkgewotICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKLSAgcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKLSAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwotICBpbnQgcG9saWN5OwotICBpbnQgbWluX3ByaSA9IDA7Ci0gIGludCByZXQgPSAtMTsKLSAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwotCi0gIHJldCA9IHB0aHJlYWRfY3JlYXRlKHRocmVhZF9pZCwgJnRocmVhZF9hdHRyLCBzdGFydF9yb3V0aW5lLCBhcmcpOwotICBpZiAocmV0ICE9IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJwdGhyZWFkX2NyZWF0ZSA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0gIC8qIFdlIG5lZWQgdG8gbG93ZXIgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGhyZWFkIHRvIGVuc3VyZSB0aGUgc3RhY2sgZ2V0cwotICAgKiBwcmlvcml0eSBvdmVyIHRyYW5zZmVyIHRvIGEgc29ja2V0ICovCi0gIHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSgqdGhyZWFkX2lkLCAmcG9saWN5LCAmcGFyYW0pOwotICBtaW5fcHJpID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwb2xpY3kpOwotICBpZiAocGFyYW0uc2NoZWRfcHJpb3JpdHkgPiBtaW5fcHJpKSB7Ci0gICAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgLT0gMTsKLSAgfQotICBwdGhyZWFkX3NldHNjaGVkcGFyYW0oKnRocmVhZF9pZCwgcG9saWN5LCAmcGFyYW0pOwotICByZXR1cm4gcmV0OwotfQotc3RhdGljIHZvaWQgaW5pdF9wb2xsKGludCBjbWRfZmQpOwotc3RhdGljIGludCBhbGxvY190aHJlYWRfc2xvdCgpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayh0aHJlYWRfc2xvdF9sb2NrKTsKLSAgaW50IGk7Ci0gIC8vIHJldmVyc2VkIG9yZGVyIHRvIHNhdmUgZ3VhcmQgdW5pbml0aWFsaXplZCBhY2Nlc3MgdG8gMCBpbmRleAotICBmb3IgKGkgPSBNQVhfVEhSRUFEIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBpZiAoIXRzW2ldLnVzZWQpIHsKLSAgICAgIHRzW2ldLnVzZWQgPSAxOwotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIEFQUExfVFJBQ0VfRVJST1IoImV4ZWNlZWRlZCBtYXggdGhyZWFkIGNvdW50Iik7Ci0gIHJldHVybiAtMTsKLX0KLXN0YXRpYyB2b2lkIGZyZWVfdGhyZWFkX3Nsb3QoaW50IGgpIHsKLSAgaWYgKDAgPD0gaCAmJiBoIDwgTUFYX1RIUkVBRCkgewotICAgIGNsb3NlX2NtZF9mZChoKTsKLSAgICB0c1toXS51c2VkID0gMDsKLSAgfSBlbHNlCi0gICAgQVBQTF9UUkFDRV9FUlJPUigiaW52YWxpZCB0aHJlYWQgaGFuZGxlOiVkIiwgaCk7Ci19Ci12b2lkIGJ0c29ja190aHJlYWRfaW5pdCgpIHsKLSAgc3RhdGljIGludCBpbml0aWFsaXplZDsKLSAgaWYgKCFpbml0aWFsaXplZCkgewotICAgIGluaXRpYWxpemVkID0gMTsKLSAgICBpbnQgaDsKLSAgICBmb3IgKGggPSAwOyBoIDwgTUFYX1RIUkVBRDsgaCsrKSB7Ci0gICAgICB0c1toXS5jbWRfZmRyID0gdHNbaF0uY21kX2ZkdyA9IC0xOwotICAgICAgdHNbaF0udXNlZCA9IDA7Ci0gICAgICB0c1toXS50aHJlYWRfaWQgPSBzdGQ6Om51bGxvcHQ7Ci0gICAgICB0c1toXS5wb2xsX2NvdW50ID0gMDsKLSAgICAgIHRzW2hdLmNhbGxiYWNrID0gTlVMTDsKLSAgICAgIHRzW2hdLmNtZF9jYWxsYmFjayA9IE5VTEw7Ci0gICAgfQotICB9Ci19Ci1pbnQgYnRzb2NrX3RocmVhZF9jcmVhdGUoYnRzb2NrX3NpZ25hbGVkX2NiIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0c29ja19jbWRfY2IgY21kX2NhbGxiYWNrKSB7Ci0gIGFzcnQoY2FsbGJhY2sgfHwgY21kX2NhbGxiYWNrKTsKLSAgaW50IGggPSBhbGxvY190aHJlYWRfc2xvdCgpOwotICBpZiAoaCA+PSAwKSB7Ci0gICAgaW5pdF9wb2xsKGgpOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgaW50IHN0YXR1cyA9IGNyZWF0ZV90aHJlYWQoc29ja19wb2xsX3RocmVhZCwgKHZvaWQqKSh1aW50cHRyX3QpaCwgJnRocmVhZCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiY3JlYXRlX3RocmVhZCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3Ioc3RhdHVzKSk7Ci0gICAgICBmcmVlX3RocmVhZF9zbG90KGgpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHRzW2hdLnRocmVhZF9pZCA9IHRocmVhZDsKLSAgICB0c1toXS5jYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIHRzW2hdLmNtZF9jYWxsYmFjayA9IGNtZF9jYWxsYmFjazsKLSAgfQotICByZXR1cm4gaDsKLX0KLQotLyogY3JlYXRlIGR1bW15IHNvY2tldCBwYWlyIHVzZWQgdG8gd2FrZSB1cCBzZWxlY3QgbG9vcCAqLwotc3RhdGljIGlubGluZSB2b2lkIGluaXRfY21kX2ZkKGludCBoKSB7Ci0gIGFzcnQodHNbaF0uY21kX2ZkciA9PSAtMSAmJiB0c1toXS5jbWRfZmR3ID09IC0xKTsKLSAgaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsICZ0c1toXS5jbWRfZmRyKSA8IDApIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJzb2NrZXRwYWlyIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBhZGQgdGhlIGNtZCBmZCBmb3IgcmVhZCAmIHdyaXRlCi0gIGFkZF9wb2xsKGgsIHRzW2hdLmNtZF9mZHIsIDAsIFNPQ0tfVEhSRUFEX0ZEX1JELCAwKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbG9zZV9jbWRfZmQoaW50IGgpIHsKLSAgaWYgKHRzW2hdLmNtZF9mZHIgIT0gLTEpIHsKLSAgICBjbG9zZSh0c1toXS5jbWRfZmRyKTsKLSAgICB0c1toXS5jbWRfZmRyID0gLTE7Ci0gIH0KLSAgaWYgKHRzW2hdLmNtZF9mZHcgIT0gLTEpIHsKLSAgICBjbG9zZSh0c1toXS5jbWRfZmR3KTsKLSAgICB0c1toXS5jbWRfZmR3ID0gLTE7Ci0gIH0KLX0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGlkOwotICBpbnQgZmQ7Ci0gIGludCB0eXBlOwotICBpbnQgZmxhZ3M7Ci0gIHVpbnQzMl90IHVzZXJfaWQ7Ci19IHNvY2tfY21kX3Q7Ci1pbnQgYnRzb2NrX3RocmVhZF9hZGRfZmQoaW50IGgsIGludCBmZCwgaW50IHR5cGUsIGludCBmbGFncywgdWludDMyX3QgdXNlcl9pZCkgewotICBpZiAoaCA8IDAgfHwgaCA+PSBNQVhfVEhSRUFEKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiaW52YWxpZCBidCB0aHJlYWQgaGFuZGxlOiVkIiwgaCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh0c1toXS5jbWRfZmR3ID09IC0xKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgImNtZCBzb2NrZXQgaXMgbm90IGNyZWF0ZWQuIHNvY2tldCB0aHJlYWQgbWF5IG5vdCBpbml0aWFsaXplZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZmxhZ3MgJiBTT0NLX1RIUkVBRF9BRERfRkRfU1lOQykgewotICAgIC8vIG11c3QgZXhlY3V0ZWQgaW4gc29ja2V0IHBvbGwgdGhyZWFkCi0gICAgaWYgKHRzW2hdLnRocmVhZF9pZC52YWx1ZSgpID09IHB0aHJlYWRfc2VsZigpKSB7Ci0gICAgICAvLyBjbGVhbnVwIG9uZS10aW1lIGZsYWdzCi0gICAgICBmbGFncyAmPSB+U09DS19USFJFQURfQUREX0ZEX1NZTkM7Ci0gICAgICBhZGRfcG9sbChoLCBmZCwgdHlwZSwgZmxhZ3MsIHVzZXJfaWQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIExPR19XQVJOKAotICAgICAgICAiVEhSRUFEX0FERF9GRF9TWU5DIGlzIG5vdCBjYWxsZWQgaW4gcG9sbCB0aHJlYWQsIGZhbGxiYWNrIHRvIGFzeW5jIik7Ci0gIH0KLSAgc29ja19jbWRfdCBjbWQgPSB7Q01EX0FERF9GRCwgZmQsIHR5cGUsIGZsYWdzLCB1c2VyX2lkfTsKLQotICBzc2l6ZV90IHJldDsKLSAgT1NJX05PX0lOVFIocmV0ID0gc2VuZCh0c1toXS5jbWRfZmR3LCAmY21kLCBzaXplb2YoY21kKSwgMCkpOwotCi0gIHJldHVybiByZXQgPT0gc2l6ZW9mKGNtZCk7Ci19Ci0KLWJvb2wgYnRzb2NrX3RocmVhZF9yZW1vdmVfZmRfYW5kX2Nsb3NlKGludCB0aHJlYWRfaGFuZGxlLCBpbnQgZmQpIHsKLSAgaWYgKHRocmVhZF9oYW5kbGUgPCAwIHx8IHRocmVhZF9oYW5kbGUgPj0gTUFYX1RIUkVBRCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzIGludmFsaWQgdGhyZWFkIGhhbmRsZTogJWQiLCBfX2Z1bmNfXywgdGhyZWFkX2hhbmRsZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChmZCA9PSAtMSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yLiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzb2NrX2NtZF90IGNtZCA9IHtDTURfUkVNT1ZFX0ZELCBmZCwgMCwgMCwgMH07Ci0KLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHNlbmQodHNbdGhyZWFkX2hhbmRsZV0uY21kX2ZkdywgJmNtZCwgc2l6ZW9mKGNtZCksIDApKTsKLQotICByZXR1cm4gcmV0ID09IHNpemVvZihjbWQpOwotfQotCi1pbnQgYnRzb2NrX3RocmVhZF9wb3N0X2NtZChpbnQgaCwgaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZCkgewotICBpZiAoaCA8IDAgfHwgaCA+PSBNQVhfVEhSRUFEKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigiaW52YWxpZCBidCB0aHJlYWQgaGFuZGxlOiVkIiwgaCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh0c1toXS5jbWRfZmR3ID09IC0xKSB7Ci0gICAgQVBQTF9UUkFDRV9FUlJPUigKLSAgICAgICAgImNtZCBzb2NrZXQgaXMgbm90IGNyZWF0ZWQuIHNvY2tldCB0aHJlYWQgbWF5IG5vdCBpbml0aWFsaXplZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzb2NrX2NtZF90IGNtZCA9IHtDTURfVVNFUl9QUklWQVRFLCAwLCB0eXBlLCBzaXplLCB1c2VyX2lkfTsKLSAgc29ja19jbWRfdCogY21kX3NlbmQgPSAmY21kOwotICBpbnQgc2l6ZV9zZW5kID0gc2l6ZW9mKGNtZCk7Ci0gIGlmIChkYXRhICYmIHNpemUpIHsKLSAgICBzaXplX3NlbmQgPSBzaXplb2YoY21kKSArIHNpemU7Ci0gICAgY21kX3NlbmQgPSAoc29ja19jbWRfdCopYWxsb2NhKHNpemVfc2VuZCk7Ci0gICAgaWYgKGNtZF9zZW5kKSB7Ci0gICAgICAqY21kX3NlbmQgPSBjbWQ7Ci0gICAgICBtZW1jcHkoY21kX3NlbmQgKyAxLCBkYXRhLCBzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiYWxsb2NhIGZhaWxlZCBhdCBoOiVkLCBjbWQgdHlwZTolZCwgc2l6ZTolZCIsIGgsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfc2VuZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHNlbmQodHNbaF0uY21kX2ZkdywgY21kX3NlbmQsIHNpemVfc2VuZCwgMCkpOwotCi0gIHJldHVybiByZXQgPT0gc2l6ZV9zZW5kOwotfQotaW50IGJ0c29ja190aHJlYWRfd2FrZXVwKGludCBoKSB7Ci0gIGlmIChoIDwgMCB8fCBoID49IE1BWF9USFJFQUQpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJpbnZhbGlkIGJ0IHRocmVhZCBoYW5kbGU6JWQiLCBoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHRzW2hdLmNtZF9mZHcgPT0gLTEpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJ0aHJlYWQgaGFuZGxlOiVkLCBjbWQgc29ja2V0IGlzIG5vdCBjcmVhdGVkIiwgaCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHNvY2tfY21kX3QgY21kID0ge0NNRF9XQUtFVVAsIDAsIDAsIDAsIDB9OwotCi0gIHNzaXplX3QgcmV0OwotICBPU0lfTk9fSU5UUihyZXQgPSBzZW5kKHRzW2hdLmNtZF9mZHcsICZjbWQsIHNpemVvZihjbWQpLCAwKSk7Ci0KLSAgcmV0dXJuIHJldCA9PSBzaXplb2YoY21kKTsKLX0KLWludCBidHNvY2tfdGhyZWFkX2V4aXQoaW50IGgpIHsKLSAgaWYgKGggPCAwIHx8IGggPj0gTUFYX1RIUkVBRCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoImludmFsaWQgYnQgdGhyZWFkIHNsb3Q6JWQiLCBoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHRzW2hdLmNtZF9mZHcgPT0gLTEpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJjbWQgc29ja2V0IGlzIG5vdCBjcmVhdGVkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHNvY2tfY21kX3QgY21kID0ge0NNRF9FWElULCAwLCAwLCAwLCAwfTsKLQotICBzc2l6ZV90IHJldDsKLSAgT1NJX05PX0lOVFIocmV0ID0gc2VuZCh0c1toXS5jbWRfZmR3LCAmY21kLCBzaXplb2YoY21kKSwgMCkpOwotCi0gIGlmIChyZXQgPT0gc2l6ZW9mKGNtZCkpIHsKLSAgICBpZiAodHNbaF0udGhyZWFkX2lkICE9IHN0ZDo6bnVsbG9wdCkgewotICAgICAgcHRocmVhZF9qb2luKHRzW2hdLnRocmVhZF9pZC52YWx1ZSgpLCAwKTsKLSAgICAgIHRzW2hdLnRocmVhZF9pZCA9IHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgZnJlZV90aHJlYWRfc2xvdChoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci1zdGF0aWMgdm9pZCBpbml0X3BvbGwoaW50IGgpIHsKLSAgaW50IGk7Ci0gIHRzW2hdLnBvbGxfY291bnQgPSAwOwotICB0c1toXS50aHJlYWRfaWQgPSBzdGQ6Om51bGxvcHQ7Ci0gIHRzW2hdLmNhbGxiYWNrID0gTlVMTDsKLSAgdHNbaF0uY21kX2NhbGxiYWNrID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9QT0xMOyBpKyspIHsKLSAgICB0c1toXS5wc1tpXS5wZmQuZmQgPSAtMTsKLSAgICB0c1toXS5wc2lbaV0gPSAtMTsKLSAgfQotICBpbml0X2NtZF9mZChoKTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZsYWdzMnBldmVudHMoaW50IGZsYWdzKSB7Ci0gIHVuc2lnbmVkIGludCBwZXZlbnRzID0gMDsKLSAgaWYgKGZsYWdzICYgU09DS19USFJFQURfRkRfV1IpIHBldmVudHMgfD0gUE9MTE9VVDsKLSAgaWYgKGZsYWdzICYgU09DS19USFJFQURfRkRfUkQpIHBldmVudHMgfD0gUE9MTElOOwotICBwZXZlbnRzIHw9IFBPTExfRVhDRVBUSU9OX0VWRU5UUzsKLSAgcmV0dXJuIHBldmVudHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG9sbChwb2xsX3Nsb3RfdCogcHMsIGludCBmZCwgaW50IHR5cGUsIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2VyX2lkKSB7Ci0gIHBzLT5wZmQuZmQgPSBmZDsKLSAgcHMtPnVzZXJfaWQgPSB1c2VyX2lkOwotICBpZiAocHMtPnR5cGUgIT0gMCAmJiBwcy0+dHlwZSAhPSB0eXBlKQotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICJwb2xsIHNvY2tldCB0eXBlIHNob3VsZCBub3QgY2hhbmdlZCEgdHlwZSB3YXM6JWQsIHR5cGUgbm93OiVkIiwKLSAgICAgICAgcHMtPnR5cGUsIHR5cGUpOwotICBwcy0+dHlwZSA9IHR5cGU7Ci0gIHBzLT5mbGFncyA9IGZsYWdzOwotICBwcy0+cGZkLmV2ZW50cyA9IGZsYWdzMnBldmVudHMoZmxhZ3MpOwotICBwcy0+cGZkLnJldmVudHMgPSAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIGFkZF9wb2xsKGludCBoLCBpbnQgZmQsIGludCB0eXBlLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZCkgewotICBhc3J0KGZkICE9IC0xKTsKLSAgaW50IGk7Ci0gIGludCBlbXB0eSA9IC0xOwotICBwb2xsX3Nsb3RfdCogcHMgPSB0c1toXS5wczsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BPTEw7IGkrKykgewotICAgIGlmIChwc1tpXS5wZmQuZmQgPT0gZmQpIHsKLSAgICAgIGFzcnQodHNbaF0ucG9sbF9jb3VudCA8IE1BWF9QT0xMKTsKLQotICAgICAgc2V0X3BvbGwoJnBzW2ldLCBmZCwgdHlwZSwgZmxhZ3MgfCBwc1tpXS5mbGFncywgdXNlcl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChlbXB0eSA8IDAgJiYgcHNbaV0ucGZkLmZkID09IC0xKQotICAgICAgZW1wdHkgPSBpOwotICB9Ci0gIGlmIChlbXB0eSA+PSAwKSB7Ci0gICAgYXNydCh0c1toXS5wb2xsX2NvdW50IDwgTUFYX1BPTEwpOwotICAgIHNldF9wb2xsKCZwc1tlbXB0eV0sIGZkLCB0eXBlLCBmbGFncywgdXNlcl9pZCk7Ci0gICAgKyt0c1toXS5wb2xsX2NvdW50OwotICAgIHJldHVybjsKLSAgfQotICBBUFBMX1RSQUNFX0VSUk9SKCJleGNlZWRlZCBtYXggcG9sbCBzbG90OiVkISIsIE1BWF9QT0xMKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfcG9sbChpbnQgaCwgcG9sbF9zbG90X3QqIHBzLCBpbnQgZmxhZ3MpIHsKLSAgaWYgKGZsYWdzID09IHBzLT5mbGFncykgewotICAgIC8vIGFsbCBtb25pdG9yZWQgZXZlbnRzIHNpZ25hbGVkLiBUbyByZW1vdmUgaXQsIGp1c3QgY2xlYXIgdGhlIHNsb3QKLSAgICAtLXRzW2hdLnBvbGxfY291bnQ7Ci0gICAgbWVtc2V0KHBzLCAwLCBzaXplb2YoKnBzKSk7Ci0gICAgcHMtPnBmZC5mZCA9IC0xOwotICB9IGVsc2UgewotICAgIC8vIG9uZSByZWFkIG9yIG9uZSB3cml0ZSBtb25pdG9yIGV2ZW50IHNpZ25hbGVkLCByZW1vdmVkIHRoZSBhY2NvcmRkaW5nIGJpdAotICAgIHBzLT5mbGFncyAmPSB+ZmxhZ3M7Ci0gICAgLy8gdXBkYXRlIHRoZSBwb2xsIGV2ZW50cyBtYXNrCi0gICAgcHMtPnBmZC5ldmVudHMgPSBmbGFnczJwZXZlbnRzKHBzLT5mbGFncyk7Ci0gIH0KLX0KLXN0YXRpYyBpbnQgcHJvY2Vzc19jbWRfc29jayhpbnQgaCkgewotICBzb2NrX2NtZF90IGNtZCA9IHstMSwgMCwgMCwgMCwgMH07Ci0gIGludCBmZCA9IHRzW2hdLmNtZF9mZHI7Ci0KLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHJlY3YoZmQsICZjbWQsIHNpemVvZihjbWQpLCBNU0dfV0FJVEFMTCkpOwotCi0gIGlmIChyZXQgIT0gc2l6ZW9mKGNtZCkpIHsKLSAgICBMT0dfRVJST1IoInJlY3YgY21kIGVycm5vOiVkIiwgZXJybm8pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzd2l0Y2ggKGNtZC5pZCkgewotICAgIGNhc2UgQ01EX0FERF9GRDoKLSAgICAgIGFkZF9wb2xsKGgsIGNtZC5mZCwgY21kLnR5cGUsIGNtZC5mbGFncywgY21kLnVzZXJfaWQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDTURfUkVNT1ZFX0ZEOgotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBNQVhfUE9MTDsgKytpKSB7Ci0gICAgICAgIHBvbGxfc2xvdF90KiBwb2xsX3Nsb3QgPSAmdHNbaF0ucHNbaV07Ci0gICAgICAgIGlmIChwb2xsX3Nsb3QtPnBmZC5mZCA9PSBjbWQuZmQpIHsKLSAgICAgICAgICByZW1vdmVfcG9sbChoLCBwb2xsX3Nsb3QsIHBvbGxfc2xvdC0+ZmxhZ3MpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjbG9zZShjbWQuZmQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDTURfV0FLRVVQOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDTURfVVNFUl9QUklWQVRFOgotICAgICAgYXNydCh0c1toXS5jbWRfY2FsbGJhY2spOwotICAgICAgaWYgKHRzW2hdLmNtZF9jYWxsYmFjaykKLSAgICAgICAgdHNbaF0uY21kX2NhbGxiYWNrKGZkLCBjbWQudHlwZSwgY21kLmZsYWdzLCBjbWQudXNlcl9pZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENNRF9FWElUOgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigidW5rbm93biBjbWQ6ICVkIiwgY21kLmlkKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2RhdGFfc29jayhpbnQgaCwgc3RydWN0IHBvbGxmZCogcGZkcywgaW50IGNvdW50KSB7Ci0gIGFzcnQoY291bnQgPD0gdHNbaF0ucG9sbF9jb3VudCk7Ci0gIGludCBpOwotICBmb3IgKGkgPSAxOyBpIDwgdHNbaF0ucG9sbF9jb3VudDsgaSsrKSB7Ci0gICAgaWYgKHBmZHNbaV0ucmV2ZW50cykgewotICAgICAgaW50IHBzX2kgPSB0c1toXS5wc2lbaV07Ci0gICAgICBhc3J0KHBmZHNbaV0uZmQgPT0gdHNbaF0ucHNbcHNfaV0ucGZkLmZkKTsKLSAgICAgIHVpbnQzMl90IHVzZXJfaWQgPSB0c1toXS5wc1twc19pXS51c2VyX2lkOwotICAgICAgaW50IHR5cGUgPSB0c1toXS5wc1twc19pXS50eXBlOwotICAgICAgaW50IGZsYWdzID0gMDsKLSAgICAgIGlmIChJU19SRUFEKHBmZHNbaV0ucmV2ZW50cykpIHsKLSAgICAgICAgZmxhZ3MgfD0gU09DS19USFJFQURfRkRfUkQ7Ci0gICAgICB9Ci0gICAgICBpZiAoSVNfV1JJVEUocGZkc1tpXS5yZXZlbnRzKSkgewotICAgICAgICBmbGFncyB8PSBTT0NLX1RIUkVBRF9GRF9XUjsKLSAgICAgIH0KLSAgICAgIGlmIChJU19FWENFUFRJT04ocGZkc1tpXS5yZXZlbnRzKSkgewotICAgICAgICBmbGFncyB8PSBTT0NLX1RIUkVBRF9GRF9FWENFUFRJT047Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgd2hvbGUgc2xvdCBub3QgZmxhZ3MKLSAgICAgICAgcmVtb3ZlX3BvbGwoaCwgJnRzW2hdLnBzW3BzX2ldLCB0c1toXS5wc1twc19pXS5mbGFncyk7Ci0gICAgICB9IGVsc2UgaWYgKGZsYWdzKQotICAgICAgICByZW1vdmVfcG9sbChoLCAmdHNbaF0ucHNbcHNfaV0sCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzKTsgIC8vIHJlbW92ZSB0aGUgbW9uaXRvciBmbGFncyB0aGF0IGFscmVhZHkgcHJvY2Vzc2VkCi0gICAgICBpZiAoZmxhZ3MpIHRzW2hdLmNhbGxiYWNrKHBmZHNbaV0uZmQsIHR5cGUsIGZsYWdzLCB1c2VyX2lkKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcHJlcGFyZV9wb2xsX2ZkcyhpbnQgaCwgc3RydWN0IHBvbGxmZCogcGZkcykgewotICBpbnQgY291bnQgPSAwOwotICBpbnQgcHNfaSA9IDA7Ci0gIGludCBwZmRfaSA9IDA7Ci0gIGFzcnQodHNbaF0ucG9sbF9jb3VudCA8PSBNQVhfUE9MTCk7Ci0gIG1lbXNldChwZmRzLCAwLCBzaXplb2YocGZkc1swXSkgKiB0c1toXS5wb2xsX2NvdW50KTsKLSAgd2hpbGUgKGNvdW50IDwgdHNbaF0ucG9sbF9jb3VudCkgewotICAgIGlmIChwc19pID49IE1BWF9QT0xMKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJleGNlZWQgbWF4IHBvbGwgcmFuZ2UsIHBzX2k6JWQsIE1BWF9QT0xMOiVkLCBjb3VudDolZCwgIgotICAgICAgICAgICJ0c1toXS5wb2xsX2NvdW50OiVkIiwKLSAgICAgICAgICBwc19pLCBNQVhfUE9MTCwgY291bnQsIHRzW2hdLnBvbGxfY291bnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHNbaF0ucHNbcHNfaV0ucGZkLmZkID49IDApIHsKLSAgICAgIHBmZHNbcGZkX2ldID0gdHNbaF0ucHNbcHNfaV0ucGZkOwotICAgICAgdHNbaF0ucHNpW3BmZF9pXSA9IHBzX2k7Ci0gICAgICBjb3VudCsrOwotICAgICAgcGZkX2krKzsKLSAgICB9Ci0gICAgcHNfaSsrOwotICB9Ci19Ci1zdGF0aWMgdm9pZCogc29ja19wb2xsX3RocmVhZCh2b2lkKiBhcmcpIHsKLSAgc3RydWN0IHBvbGxmZCBwZmRzW01BWF9QT0xMXTsKLSAgbWVtc2V0KHBmZHMsIDAsIHNpemVvZihwZmRzKSk7Ci0gIGludCBoID0gKGludHB0cl90KWFyZzsKLSAgZm9yICg7OykgewotICAgIHByZXBhcmVfcG9sbF9mZHMoaCwgcGZkcyk7Ci0gICAgaW50IHJldDsKLSAgICBPU0lfTk9fSU5UUihyZXQgPSBwb2xsKHBmZHMsIHRzW2hdLnBvbGxfY291bnQsIC0xKSk7Ci0gICAgaWYgKHJldCA9PSAtMSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigicG9sbCByZXQgLTEsIGV4aXQgdGhlIHRocmVhZCwgZXJybm86JWQsIGVycjolcyIsIGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgaW50IG5lZWRfcHJvY2Vzc19kYXRhX2ZkID0gdHJ1ZTsKLSAgICAgIGlmIChwZmRzWzBdLnJldmVudHMpICAvLyBjbWQgZmQgYWx3YXlzIGlzIHRoZSBmaXJzdCBvbmUKLSAgICAgIHsKLSAgICAgICAgYXNydChwZmRzWzBdLmZkID09IHRzW2hdLmNtZF9mZHIpOwotICAgICAgICBpZiAoIXByb2Nlc3NfY21kX3NvY2soaCkpIHsKLSAgICAgICAgICBMT0dfSU5GTygiaDolZCwgcHJvY2Vzc19jbWRfc29jayByZXR1cm4gZmFsc2UsIGV4aXQuLi4iLCBoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IDEpCi0gICAgICAgICAgbmVlZF9wcm9jZXNzX2RhdGFfZmQgPSBmYWxzZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldC0tOyAgLy8gZXhjbHVkZSB0aGUgY21kIGZkCi0gICAgICB9Ci0gICAgICBpZiAobmVlZF9wcm9jZXNzX2RhdGFfZmQpIHByb2Nlc3NfZGF0YV9zb2NrKGgsIHBmZHMsIHJldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19JTkZPKCJubyBkYXRhLCBzZWxlY3QgcmV0OiAlZCIsIHJldCk7Ci0gICAgfTsKLSAgfQotICBMT0dfSU5GTygic29ja2V0IHBvbGwgdGhyZWFkIGV4aXRpbmcsIGg6JWQiLCBoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9idGlmX3NvY2tfdXRpbC5jYyBiL2J0aWYvc3JjL2J0aWZfc29ja191dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgxNTIyLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfc29ja191dGlsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9zb2NrIgotCi0jaW5jbHVkZSAiYnRpZl9zb2NrX3V0aWwuaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9zb2NrLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotI2RlZmluZSBhc3J0KHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIShzKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiIyMgJXMgYXNzZXJ0ICVzIGZhaWxlZCBhdCBsaW5lOiVkICMjIiwgX19mdW5jX18sICNzLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotaW50IHNvY2tfc2VuZF9hbGwoaW50IHNvY2tfZmQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbikgewotICBpbnQgcyA9IGxlbjsKLQotICB3aGlsZSAocykgewotICAgIHNzaXplX3QgcmV0OwotICAgIE9TSV9OT19JTlRSKHJldCA9IHNlbmQoc29ja19mZCwgYnVmLCBzLCAwKSk7Ci0gICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCJzb2NrIGZkOiVkIHNlbmQgZXJybm86JWQsIHJldDolZCIsIHNvY2tfZmQsIGVycm5vLCByZXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBidWYgKz0gcmV0OwotICAgIHMgLT0gcmV0OwotICB9Ci0gIHJldHVybiBsZW47Ci19Ci1pbnQgc29ja19yZWN2X2FsbChpbnQgc29ja19mZCwgdWludDhfdCogYnVmLCBpbnQgbGVuKSB7Ci0gIGludCByID0gbGVuOwotCi0gIHdoaWxlIChyKSB7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgT1NJX05PX0lOVFIocmV0ID0gcmVjdihzb2NrX2ZkLCBidWYsIHIsIE1TR19XQUlUQUxMKSk7Ci0gICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCJzb2NrIGZkOiVkIHJlY3YgZXJybm86JWQsIHJldDolZCIsIHNvY2tfZmQsIGVycm5vLCByZXQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBidWYgKz0gcmV0OwotICAgIHIgLT0gcmV0OwotICB9Ci0gIHJldHVybiBsZW47Ci19Ci0KLWludCBzb2NrX3NlbmRfZmQoaW50IHNvY2tfZmQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgaW50IHNlbmRfZmQpIHsKLSAgc3RydWN0IG1zZ2hkciBtc2c7Ci0gIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilidWY7Ci0gIG1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0KLSAgc3RydWN0IGNtc2doZHIqIGNtc2c7Ci0gIGNoYXIgbXNnYnVmW0NNU0dfU1BBQ0UoMSldOwotICBhc3J0KHNlbmRfZmQgIT0gLTEpOwotICBpZiAoc29ja19mZCA9PSAtMSB8fCBzZW5kX2ZkID09IC0xKSByZXR1cm4gLTE7Ci0gIC8vIEFkZCBhbnkgcGVuZGluZyBvdXRib3VuZCBmaWxlIGRlc2NyaXB0b3JzIHRvIHRoZSBtZXNzYWdlCi0gIC8vIFNlZSAibWFuIGNtc2ciIHJlYWxseQotICBtc2cubXNnX2NvbnRyb2wgPSBtc2didWY7Ci0gIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZiBtc2didWY7Ci0gIGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOwotICBjbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKLSAgY21zZy0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKLSAgY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Ygc2VuZF9mZCk7Ci0gIG1lbWNweShDTVNHX0RBVEEoY21zZyksICZzZW5kX2ZkLCBzaXplb2Ygc2VuZF9mZCk7Ci0KLSAgLy8gV2Ugb25seSB3cml0ZSBvdXIgbXNnX2NvbnRyb2wgZHVyaW5nIHRoZSBmaXJzdCB3cml0ZQotICBpbnQgcmV0X2xlbiA9IGxlbjsKLSAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICBzdHJ1Y3QgaW92ZWMgaXY7Ci0gICAgbWVtc2V0KCZpdiwgMCwgc2l6ZW9mKGl2KSk7Ci0KLSAgICBpdi5pb3ZfYmFzZSA9IGJ1ZmZlcjsKLSAgICBpdi5pb3ZfbGVuID0gbGVuOwotCi0gICAgbXNnLm1zZ19pb3YgPSAmaXY7Ci0gICAgbXNnLm1zZ19pb3ZsZW4gPSAxOwotCi0gICAgc3NpemVfdCByZXQ7Ci0gICAgT1NJX05PX0lOVFIocmV0ID0gc2VuZG1zZyhzb2NrX2ZkLCAmbXNnLCBNU0dfTk9TSUdOQUwpKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiZmQ6JWQsIHNlbmRfZmQ6JWQsIHNlbmRtc2cgcmV0OiVkLCBlcnJubzolZCwgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBzb2NrX2ZkLCBzZW5kX2ZkLCAoaW50KXJldCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICByZXRfbGVuID0gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBidWZmZXIgKz0gcmV0OwotICAgIGxlbiAtPSByZXQ7Ci0KLSAgICAvLyBXaXBlcyBvdXQgYW55IG1zZ19jb250cm9sIHRvbwotICAgIG1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiY2xvc2UgZmQ6JWQgYWZ0ZXIgc2VudCIsIHNlbmRfZmQpOwotICAvLyBUT0RPOiBUaGlzIHNlZW1zIHdyb25nIC0gaWYgdGhlIEZEIGlzIG5vdCBvcGVuZWQgaW4gSkFWQSBiZWZvcmUgdGhpcyBpcwotICAvLyBjYWxsZWQKLSAgLy8gICAgICAgd2UgZ2V0IGEgInNvY2tldCBjbG9zZWQiIGV4Y2VwdGlvbiBpbiBqYXZhLCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUKLSAgLy8gICAgICAgc29ja2V0Li4uCi0gIGNsb3NlKHNlbmRfZmQpOwotICByZXR1cm4gcmV0X2xlbjsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfc3RvcmFnZS5jYyBiL2J0aWYvc3JjL2J0aWZfc3RvcmFnZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4NGEyMi4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3N0b3JhZ2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9zdG9yYWdlLmMKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgU3RvcmVzIHRoZSBsb2NhbCBCVCBhZGFwdGVyIGFuZCByZW1vdGUgZGV2aWNlIHByb3BlcnRpZXMgaW4KLSAqICAgICAgICAgICAgICAgICBOVlJBTSBzdG9yYWdlLCB0eXBpY2FsbHkgYXMgeG1sIGZpbGUgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgbW9iaWxlJ3MgZmlsZXN5c3RlbQotICoKLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX3N0b3JhZ2UiCi0KLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLQotI2luY2x1ZGUgPGFsbG9jYS5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiYnRhX2NzaXNfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dyb3Vwcy5oIgotI2luY2x1ZGUgImJ0YV9oZF9hcGkuaCIKLSNpbmNsdWRlICJidGFfaGVhcmluZ19haWRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2hoX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9sZV9hdWRpb19hcGkuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZl9oZC5oIgotI2luY2x1ZGUgImJ0aWZfaGguaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29uZmlnLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6Z3JvdXBzOjpEZXZpY2VHcm91cHM7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBUT0RPKGFybWFuc2l0byk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdXNpbmcgYSBoYXJkY29kZWQgcGF0aC4KLSNkZWZpbmUgQlRJRl9TVE9SQUdFX1BBVEhfQkxVRURST0lEICIvZGF0YS9taXNjL2JsdWVkcm9pZCIKLQotLy8jZGVmaW5lIEJUSUZfU1RPUkFHRV9QQVRIX0FEQVBURVJfSU5GTyAiYWRhcHRlcl9pbmZvIgotLy8jZGVmaW5lIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9ERVZJQ0VTICJyZW1vdGVfZGV2aWNlcyIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0RFVlRJTUUgIlRpbWVzdGFtcCIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0RFVkNMQVNTICJEZXZDbGFzcyIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0RFVlRZUEUgIkRldlR5cGUiCi0jZGVmaW5lIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9OQU1FICJOYW1lIgotCi0vLyNkZWZpbmUgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0xJTktLRVlTICJyZW1vdGVfbGlua2tleXMiCi0jZGVmaW5lIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9BTElBU0UgIkFsaWFzZSIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX1NFUlZJQ0UgIlNlcnZpY2UiCi0jZGVmaW5lIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9ISURJTkZPICJIaWRJbmZvIgotI2RlZmluZSBCVElGX1NUT1JBR0VfS0VZX0FEQVBURVJfTkFNRSAiTmFtZSIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0tFWV9BREFQVEVSX1NDQU5NT0RFICJTY2FuTW9kZSIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0tFWV9MT0NBTF9JT19DQVBTICJMb2NhbElPQ2FwcyIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0tFWV9MT0NBTF9JT19DQVBTX0JMRSAiTG9jYWxJT0NhcHNCTEUiCi0jZGVmaW5lIEJUSUZfU1RPUkFHRV9LRVlfQURBUFRFUl9ESVNDX1RJTUVPVVQgIkRpc2NvdmVyeVRpbWVvdXQiCi0jZGVmaW5lIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9DTElFTlRfU1VQUE9SVEVEICJHYXR0Q2xpZW50U3VwcG9ydGVkRmVhdHVyZXMiCi0jZGVmaW5lIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9DTElFTlRfREJfSEFTSCAiR2F0dENsaWVudERhdGFiYXNlSGFzaCIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX1NFUlZFUl9TVVBQT1JURUQgIkdhdHRTZXJ2ZXJTdXBwb3J0ZWRGZWF0dXJlcyIKLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0RFVklDRV9HUk9VUF9CSU4gIkRldmljZUdyb3VwQmluIgotI2RlZmluZSBCVElGX1NUT1JBR0VfQ1NJU19BVVRPQ09OTkVDVCAiQ3Npc0F1dG9jb25uZWN0IgotI2RlZmluZSBCVElGX1NUT1JBR0VfQ1NJU19TRVRfSU5GT19CSU4gIkNzaXNTZXRJbmZvQmluIgotI2RlZmluZSBCVElGX1NUT1JBR0VfTEVBVURJT19BVVRPQ09OTkVDVCAiTGVBdWRpb0F1dG9jb25uZWN0IgotCi0vKiBUaGlzIGlzIGEgbG9jYWwgcHJvcGVydHkgdG8gYWRkIGEgZGV2aWNlIGZvdW5kICovCi0jZGVmaW5lIEJUX1BST1BFUlRZX1JFTU9URV9ERVZJQ0VfVElNRVNUQU1QIDB4RkYKLQotLy8gVE9ETzogVGhpcyBtYWNybyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgZnVuY3Rpb24KLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0dFVF9BREFQVEVSX1BST1AocywgdCwgdiwgbCwgcCkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHApLnR5cGUgPSAodCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocCkudmFsID0gKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKS5sZW4gPSAobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHMpID0gYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KCYocCkpOyAgIFwKLSAgfSB3aGlsZSAoMCkKLQotLy8gVE9ETzogVGhpcyBtYWNybyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgZnVuY3Rpb24KLSNkZWZpbmUgQlRJRl9TVE9SQUdFX0dFVF9SRU1PVEVfUFJPUChiLCB0LCB2LCBsLCBwKSAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHApLnR5cGUgPSAodCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocCkudmFsID0gKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKS5sZW4gPSAobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KChiKSwgJihwKSk7IFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVE9SQUdFX0JEQUREUl9TVFJJTkdfU1ogKDE4KSAvKiAwMDoxMToyMjozMzo0NDo1NSAqLwotI2RlZmluZSBTVE9SQUdFX1VVSURfU1RSSU5HX1NJWkUgXAotICAoMzYgKyAxKSAvKiAwMDAwMTIwMC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmI7ICovCi0jZGVmaW5lIFNUT1JBR0VfUElOTEVOX1NUUklOR19NQVhfU0laRSAoMikgIC8qIGFzY2lpIHBpbmxlbiBtYXggY2hhcnMgKi8KLSNkZWZpbmUgU1RPUkFHRV9LRVlUWVBFX1NUUklOR19NQVhfU0laRSAoMSkgLyogYXNjaWkga2V5dHlwZSBtYXggY2hhcnMgKi8KLQotI2RlZmluZSBTVE9SQUdFX0tFWV9UWVBFX01BWCAoMTApCi0KLSNkZWZpbmUgU1RPUkFHRV9ISURfQVRSUl9NQVNLX1NJWkUgKDQpCi0jZGVmaW5lIFNUT1JBR0VfSElEX1NVQl9DTEFTU19TSVpFICgyKQotI2RlZmluZSBTVE9SQUdFX0hJRF9BUFBfSURfU0laRSAoMikKLSNkZWZpbmUgU1RPUkFHRV9ISURfVkVORE9SX0lEX1NJWkUgKDQpCi0jZGVmaW5lIFNUT1JBR0VfSElEX1BST0RVQ1RfSURfU0laRSAoNCkKLSNkZWZpbmUgU1RPUkFHRV9ISURfVkVSU0lPTl9TSVpFICg0KQotI2RlZmluZSBTVE9SQUdFX0hJRF9DVFJZX0NPREVfU0laRSAoMikKLSNkZWZpbmUgU1RPUkFHRV9ISURfREVTQ19MRU5fU0laRSAoNCkKLSNkZWZpbmUgU1RPUkFHRV9ISURfREVTQ19NQVhfU0laRSAoMiAqIDUxMikKLQotLyogPDE4IGNoYXIgYmQgYWRkcj4gPHNwYWNlPiBMSVNUPCA8MzYgY2hhciB1dWlkPiA8Oz4gPiA8a2V5dHlwZSAoZGVjKT4gPHBpbmxlbj4KLSAqLwotI2RlZmluZSBCVElGX1JFTU9URV9TRVJWSUNFU19FTlRSWV9TSVpFX01BWCAgICAgIFwKLSAgKFNUT1JBR0VfQkRBRERSX1NUUklOR19TWiArIDEgKyAgICAgICAgICAgICAgICBcCi0gICBTVE9SQUdFX1VVSURfU1RSSU5HX1NJWkUgKiBCVF9NQVhfTlVNX1VVSURTICsgXAotICAgU1RPUkFHRV9QSU5MRU5fU1RSSU5HX01BWF9TSVpFICsgU1RPUkFHRV9LRVlUWVBFX1NUUklOR19NQVhfU0laRSkKLQotI2RlZmluZSBTVE9SQUdFX1JFTU9URV9MSU5LS0VZU19FTlRSWV9TSVpFIChMSU5LX0tFWV9MRU4gKiAyICsgMSArIDIgKyAxICsgMikKLQotLyogPDE4IGNoYXIgYmQgYWRkcj4gPHNwYWNlPkxJU1QgPGF0dHJfbWFzaz4gPHNwYWNlPiA+IDxzdWJfY2xhc3M+IDxzcGFjZT4KLSAgIDxhcHBfaWQ+IDxzcGFjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlbmRvcl9pZD4gPHNwYWNlPiA+IDxwcm9kdWN0X2lkPiA8c3BhY2U+Ci0gICA8dmVyc2lvbj4gPHNwYWNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y3RyeV9jb2RlPiA8c3BhY2U+ID4gPGRlc2NfbGVuPiA8c3BhY2U+Ci0gICA8ZGVzY19saXN0PiA8c3BhY2U+ICovCi0jZGVmaW5lIEJUSUZfSElEX0lORk9fRU5UUllfU0laRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoU1RPUkFHRV9CREFERFJfU1RSSU5HX1NaICsgMSArIFNUT1JBR0VfSElEX0FUUlJfTUFTS19TSVpFICsgMSArICAgIFwKLSAgIFNUT1JBR0VfSElEX1NVQl9DTEFTU19TSVpFICsgMSArIFNUT1JBR0VfSElEX0FQUF9JRF9TSVpFICsgMSArICAgICBcCi0gICBTVE9SQUdFX0hJRF9WRU5ET1JfSURfU0laRSArIDEgKyBTVE9SQUdFX0hJRF9QUk9EVUNUX0lEX1NJWkUgKyAxICsgXAotICAgU1RPUkFHRV9ISURfVkVSU0lPTl9TSVpFICsgMSArIFNUT1JBR0VfSElEX0NUUllfQ09ERV9TSVpFICsgMSArICAgIFwKLSAgIFNUT1JBR0VfSElEX0RFU0NfTEVOX1NJWkUgKyAxICsgU1RPUkFHRV9ISURfREVTQ19NQVhfU0laRSArIDEpCi0KLS8qIGN1cnJlbnRseSByZW1vdGUgc2VydmljZXMgaXMgdGhlIHBvdGVudGlhbGx5IGxhcmdlc3QgZW50cnkgKi8KLSNkZWZpbmUgQlRJRl9TVE9SQUdFX01BWF9MSU5FX1NaIEJUSUZfUkVNT1RFX1NFUlZJQ0VTX0VOVFJZX1NJWkVfTUFYCi0KLS8qIGNoZWNrIGFnYWluc3QgdW52IG1heCBlbnRyeSBzaXplIGF0IGNvbXBpbGUgdGltZSAqLwotI2lmIChCVElGX1NUT1JBR0VfRU5UUllfTUFYX1NJWkUgPiBVTlZfTUFYTElORV9MRU5HVEgpCi0jZXJyb3IgImJ0aWYgc3RvcmFnZSBlbnRyeSBzaXplIGV4Y2VlZHMgdW52IG1heCBsaW5lIHNpemUiCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBMb2NhbCB0eXBlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBudW1fZGV2aWNlczsKLSAgUmF3QWRkcmVzcyBkZXZpY2VzW0JUTV9TRUNfTUFYX0RFVklDRV9SRUNPUkRTXTsKLX0gYnRpZl9ib25kZWRfZGV2aWNlc190OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIHZvaWQgYnRpZl9nYXR0c19hZGRfYm9uZGVkX2Rldl9mcm9tX252KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgSW50ZXJuYWwgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYnRfc3RhdHVzX3QgYnRpZl9pbl9mZXRjaF9ib25kZWRfYmxlX2RldmljZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVtb3RlX2JkX2FkZHIsIGludCBhZGQsCi0gICAgYnRpZl9ib25kZWRfZGV2aWNlc190KiBwX2JvbmRlZF9kZXZpY2VzKTsKLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2luX2ZldGNoX2JvbmRlZF9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGJkc3RyKTsKLQotc3RhdGljIGJvb2wgYnRpZl9oYXNfYmxlX2tleXMoY29uc3Qgc3RkOjpzdHJpbmcmIGJkc3RyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IHByb3AyY2ZnKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wKSB7Ci0gIHN0ZDo6c3RyaW5nIGJkc3RyOwotICBpZiAocmVtb3RlX2JkX2FkZHIpIHsKLSAgICBiZHN0ciA9IHJlbW90ZV9iZF9hZGRyLT5Ub1N0cmluZygpOwotICB9Ci0KLSAgY2hhciB2YWx1ZVsxMDI0XTsKLSAgaWYgKHByb3AtPmxlbiA8PSAwIHx8IHByb3AtPmxlbiA+IChpbnQpc2l6ZW9mKHZhbHVlKSAtIDEpIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIlVuYWJsZSB0byBzYXZlIHByb3BlcnR5IHRvIGNvbmZpZ3VyYXRpb24gZmlsZSB0eXBlOiVkLCAiCi0gICAgICAgICIgbGVuOiVkIGlzIGludmFsaWQiLAotICAgICAgICBwcm9wLT50eXBlLCBwcm9wLT5sZW4pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzd2l0Y2ggKHByb3AtPnR5cGUpIHsKLSAgICBjYXNlIEJUX1BST1BFUlRZX1JFTU9URV9ERVZJQ0VfVElNRVNUQU1QOgotICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0RFVlRJTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpdGltZShOVUxMKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1BST1BFUlRZX0JETkFNRTogewotICAgICAgaW50IG5hbWVfbGVuZ3RoID0gcHJvcC0+bGVuID4gQlRNX01BWF9MT0NfQkRfTkFNRV9MRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJUTV9NQVhfTE9DX0JEX05BTUVfTEVOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwcm9wLT5sZW47Ci0gICAgICBzdHJuY3B5KHZhbHVlLCAoY2hhciopcHJvcC0+dmFsLCBuYW1lX2xlbmd0aCk7Ci0gICAgICB2YWx1ZVtuYW1lX2xlbmd0aF0gPSAnXDAnOwotICAgICAgaWYgKHJlbW90ZV9iZF9hZGRyKSB7Ci0gICAgICAgIGJ0aWZfY29uZmlnX3NldF9zdHIoYmRzdHIsIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9OQU1FLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGlmX2NvbmZpZ19zZXRfc3RyKCJBZGFwdGVyIiwgQlRJRl9TVE9SQUdFX0tFWV9BREFQVEVSX05BTUUsIHZhbHVlKTsKLSAgICAgICAgYnRpZl9jb25maWdfZmx1c2goKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUX1BST1BFUlRZX1JFTU9URV9GUklFTkRMWV9OQU1FOgotICAgICAgc3RybmNweSh2YWx1ZSwgKGNoYXIqKXByb3AtPnZhbCwgcHJvcC0+bGVuKTsKLSAgICAgIHZhbHVlW3Byb3AtPmxlbl0gPSAnXDAnOwotICAgICAgYnRpZl9jb25maWdfc2V0X3N0cihiZHN0ciwgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0FMSUFTRSwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX1NDQU5fTU9ERToKLSAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoIkFkYXB0ZXIiLCBCVElGX1NUT1JBR0VfS0VZX0FEQVBURVJfU0NBTk1PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9JT19DQVBTOgotICAgICAgYnRpZl9jb25maWdfc2V0X2ludCgiQWRhcHRlciIsIEJUSUZfU1RPUkFHRV9LRVlfTE9DQUxfSU9fQ0FQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQqKXByb3AtPnZhbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1BST1BFUlRZX0xPQ0FMX0lPX0NBUFNfQkxFOgotICAgICAgYnRpZl9jb25maWdfc2V0X2ludCgiQWRhcHRlciIsIEJUSUZfU1RPUkFHRV9LRVlfTE9DQUxfSU9fQ0FQU19CTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX0RJU0NPVkVSWV9USU1FT1VUOgotICAgICAgYnRpZl9jb25maWdfc2V0X2ludCgiQWRhcHRlciIsIEJUSUZfU1RPUkFHRV9LRVlfQURBUFRFUl9ESVNDX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0U6Ci0gICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBCVElGX1NUT1JBR0VfUEFUSF9SRU1PVEVfREVWQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICooaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRToKLSAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9ERVZUWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludCopcHJvcC0+dmFsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRfUFJPUEVSVFlfVVVJRFM6IHsKLSAgICAgIHN0ZDo6c3RyaW5nIHZhbDsKLSAgICAgIHNpemVfdCBjbnQgPSAocHJvcC0+bGVuKSAvIHNpemVvZihVdWlkKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLSAgICAgICAgdmFsICs9IChyZWludGVycHJldF9jYXN0PFV1aWQqPihwcm9wLT52YWwpICsgaSktPlRvU3RyaW5nKCkgKyAiICI7Ci0gICAgICB9Ci0gICAgICBidGlmX2NvbmZpZ19zZXRfc3RyKGJkc3RyLCBCVElGX1NUT1JBR0VfUEFUSF9SRU1PVEVfU0VSVklDRSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUX1BST1BFUlRZX1JFTU9URV9WRVJTSU9OX0lORk86IHsKLSAgICAgIGJ0X3JlbW90ZV92ZXJzaW9uX3QqIGluZm8gPSAoYnRfcmVtb3RlX3ZlcnNpb25fdCopcHJvcC0+dmFsOwotCi0gICAgICBpZiAoIWluZm8pIHJldHVybiBmYWxzZTsKLQotICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgQlRfQ09ORklHX0tFWV9SRU1PVEVfVkVSX01GQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1hbnVmYWN0dXJlcik7Ci0gICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfVkVSLCBpbmZvLT52ZXJzaW9uKTsKLSAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsIEJUX0NPTkZJR19LRVlfUkVNT1RFX1ZFUl9TVUJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1Yl92ZXIpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiVW5rbm93biBwcm9wIHR5cGU6JWQiLCBwcm9wLT50eXBlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIE5vIG5lZWQgdG8gbG9vayBmb3IgYm9uZGVkIGRldmljZSB3aXRoIGFkZHJlc3Mgb2YgTlVMTCAqLwotICBpZiAocmVtb3RlX2JkX2FkZHIgJiYKLSAgICAgIGJ0aWZfaW5fZmV0Y2hfYm9uZGVkX2RldmljZShiZHN0cikgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAvKiBzYXZlIGNoYW5nZXMgaWYgdGhlIGRldmljZSB3YXMgYm9uZGVkICovCi0gICAgYnRpZl9jb25maWdfZmx1c2goKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IGNmZzJwcm9wKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wKSB7Ci0gIHN0ZDo6c3RyaW5nIGJkc3RyOwotICBpZiAocmVtb3RlX2JkX2FkZHIpIHsKLSAgICBiZHN0ciA9IHJlbW90ZV9iZF9hZGRyLT5Ub1N0cmluZygpOwotICB9Ci0gIGlmIChwcm9wLT5sZW4gPD0gMCkgewotICAgIExPR19XQVJOKCJJbnZhbGlkIHByb3BlcnR5IHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUgdHlwZTolZCwgbGVuOiVkIiwKLSAgICAgICAgICAgICBwcm9wLT50eXBlLCBwcm9wLT5sZW4pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgcmV0ID0gZmFsc2U7Ci0gIHN3aXRjaCAocHJvcC0+dHlwZSkgewotICAgIGNhc2UgQlRfUFJPUEVSVFlfUkVNT1RFX0RFVklDRV9USU1FU1RBTVA6Ci0gICAgICBpZiAocHJvcC0+bGVuID49IChpbnQpc2l6ZW9mKGludCkpCi0gICAgICAgIHJldCA9IGJ0aWZfY29uZmlnX2dldF9pbnQoYmRzdHIsIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9ERVZUSU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQqKXByb3AtPnZhbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1BST1BFUlRZX0JETkFNRTogewotICAgICAgaW50IGxlbiA9IHByb3AtPmxlbjsKLSAgICAgIGlmIChyZW1vdGVfYmRfYWRkcikKLSAgICAgICAgcmV0ID0gYnRpZl9jb25maWdfZ2V0X3N0cihiZHN0ciwgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXByb3AtPnZhbCwgJmxlbik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldCA9IGJ0aWZfY29uZmlnX2dldF9zdHIoIkFkYXB0ZXIiLCBCVElGX1NUT1JBR0VfS0VZX0FEQVBURVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcHJvcC0+dmFsLCAmbGVuKTsKLSAgICAgIGlmIChyZXQgJiYgbGVuICYmIGxlbiA8PSBwcm9wLT5sZW4pCi0gICAgICAgIHByb3AtPmxlbiA9IGxlbiAtIDE7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgcHJvcC0+bGVuID0gMDsKLSAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9SRU1PVEVfRlJJRU5ETFlfTkFNRTogewotICAgICAgaW50IGxlbiA9IHByb3AtPmxlbjsKLSAgICAgIHJldCA9IGJ0aWZfY29uZmlnX2dldF9zdHIoYmRzdHIsIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9BTElBU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwcm9wLT52YWwsICZsZW4pOwotICAgICAgaWYgKHJldCAmJiBsZW4gJiYgbGVuIDw9IHByb3AtPmxlbikKLSAgICAgICAgcHJvcC0+bGVuID0gbGVuIC0gMTsKLSAgICAgIGVsc2UgewotICAgICAgICBwcm9wLT5sZW4gPSAwOwotICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFOgotICAgICAgaWYgKHByb3AtPmxlbiA+PSAoaW50KXNpemVvZihpbnQpKQotICAgICAgICByZXQgPSBidGlmX2NvbmZpZ19nZXRfaW50KCJBZGFwdGVyIiwgQlRJRl9TVE9SQUdFX0tFWV9BREFQVEVSX1NDQU5NT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQqKXByb3AtPnZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQUzoKLSAgICAgIGlmIChwcm9wLT5sZW4gPj0gKGludClzaXplb2YoaW50KSkKLSAgICAgICAgcmV0ID0gYnRpZl9jb25maWdfZ2V0X2ludCgiQWRhcHRlciIsIEJUSUZfU1RPUkFHRV9LRVlfTE9DQUxfSU9fQ0FQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9JT19DQVBTX0JMRToKLSAgICAgIGlmIChwcm9wLT5sZW4gPj0gKGludClzaXplb2YoaW50KSkKLSAgICAgICAgcmV0ID0gYnRpZl9jb25maWdfZ2V0X2ludCgiQWRhcHRlciIsIEJUSUZfU1RPUkFHRV9LRVlfTE9DQUxfSU9fQ0FQU19CTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCopcHJvcC0+dmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX0RJU0NPVkVSWV9USU1FT1VUOgotICAgICAgaWYgKHByb3AtPmxlbiA+PSAoaW50KXNpemVvZihpbnQpKQotICAgICAgICByZXQgPSBidGlmX2NvbmZpZ19nZXRfaW50KAotICAgICAgICAgICAgIkFkYXB0ZXIiLCBCVElGX1NUT1JBR0VfS0VZX0FEQVBURVJfRElTQ19USU1FT1VULCAoaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0U6Ci0gICAgICBpZiAocHJvcC0+bGVuID49IChpbnQpc2l6ZW9mKGludCkpCi0gICAgICAgIHJldCA9IGJ0aWZfY29uZmlnX2dldF9pbnQoYmRzdHIsIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9ERVZDTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50Kilwcm9wLT52YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRToKLSAgICAgIGlmIChwcm9wLT5sZW4gPj0gKGludClzaXplb2YoaW50KSkKLSAgICAgICAgcmV0ID0gYnRpZl9jb25maWdfZ2V0X2ludChiZHN0ciwgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0RFVlRZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCopcHJvcC0+dmFsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRfUFJPUEVSVFlfVVVJRFM6IHsKLSAgICAgIGNoYXIgdmFsdWVbMTI4MF07Ci0gICAgICBpbnQgc2l6ZSA9IHNpemVvZih2YWx1ZSk7Ci0gICAgICBpZiAoYnRpZl9jb25maWdfZ2V0X3N0cihiZHN0ciwgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX1NFUlZJQ0UsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKSB7Ci0gICAgICAgIFV1aWQqIHBfdXVpZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXVpZCo+KHByb3AtPnZhbCk7Ci0gICAgICAgIHNpemVfdCBudW1fdXVpZHMgPQotICAgICAgICAgICAgYnRpZl9zcGxpdF91dWlkc19zdHJpbmcodmFsdWUsIHBfdXVpZCwgQlRfTUFYX05VTV9VVUlEUyk7Ci0gICAgICAgIHByb3AtPmxlbiA9IG51bV91dWlkcyAqIHNpemVvZihVdWlkKTsKLSAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByb3AtPnZhbCA9IE5VTEw7Ci0gICAgICAgIHByb3AtPmxlbiA9IDA7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRfUFJPUEVSVFlfUkVNT1RFX1ZFUlNJT05fSU5GTzogewotICAgICAgYnRfcmVtb3RlX3ZlcnNpb25fdCogaW5mbyA9IChidF9yZW1vdGVfdmVyc2lvbl90Kilwcm9wLT52YWw7Ci0KLSAgICAgIGlmIChwcm9wLT5sZW4gPj0gKGludClzaXplb2YoYnRfcmVtb3RlX3ZlcnNpb25fdCkpIHsKLSAgICAgICAgcmV0ID0gYnRpZl9jb25maWdfZ2V0X2ludChiZHN0ciwgQlRfQ09ORklHX0tFWV9SRU1PVEVfVkVSX01GQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPm1hbnVmYWN0dXJlcik7Ci0KLSAgICAgICAgaWYgKHJldCkKLSAgICAgICAgICByZXQgPSBidGlmX2NvbmZpZ19nZXRfaW50KGJkc3RyLCBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPnZlcnNpb24pOwotCi0gICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgcmV0ID0gYnRpZl9jb25maWdfZ2V0X2ludChiZHN0ciwgQlRfQ09ORklHX0tFWV9SRU1PVEVfVkVSX1NVQlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLT5zdWJfdmVyKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIlVua25vdyBwcm9wIHR5cGU6JWQiLCBwcm9wLT50eXBlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9pbl9mZXRjaF9ib25kZWRfZGV2aWNlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGZldGNoIHRoZSBib25kZWQgZGV2aWNlcwotICogICAgICAgICAgICAgICAgICBmcm9tIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfaW5fZmV0Y2hfYm9uZGVkX2RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgYmRzdHIpIHsKLSAgYm9vbCBidF9saW5ra2V5X2ZpbGVfZm91bmQgPSBmYWxzZTsKLQotICBMaW5rS2V5IGxpbmtfa2V5OwotICBzaXplX3Qgc2l6ZSA9IGxpbmtfa2V5LnNpemUoKTsKLSAgaWYgKGJ0aWZfY29uZmlnX2dldF9iaW4oYmRzdHIsICJMaW5rS2V5IiwgbGlua19rZXkuZGF0YSgpLCAmc2l6ZSkpIHsKLSAgICBpbnQgbGlua2tleV90eXBlOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KGJkc3RyLCAiTGlua0tleVR5cGUiLCAmbGlua2tleV90eXBlKSkgewotICAgICAgYnRfbGlua2tleV9maWxlX2ZvdW5kID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgYnRfbGlua2tleV9maWxlX2ZvdW5kID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGlmICgoYnRpZl9pbl9mZXRjaF9ib25kZWRfYmxlX2RldmljZShiZHN0ciwgZmFsc2UsIE5VTEwpICE9Ci0gICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpICYmCi0gICAgICAoIWJ0X2xpbmtrZXlfZmlsZV9mb3VuZCkpIHsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9pbl9mZXRjaF9ib25kZWRfZGV2aWNlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGZldGNoIHRoZSBib25kZWQgZGV2aWNlcwotICogICAgICAgICAgICAgICAgICBmcm9tIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJ0X3N0YXR1c190IGJ0aWZfaW5fZmV0Y2hfYm9uZGVkX2RldmljZXMoCi0gICAgYnRpZl9ib25kZWRfZGV2aWNlc190KiBwX2JvbmRlZF9kZXZpY2VzLCBpbnQgYWRkKSB7Ci0gIG1lbXNldChwX2JvbmRlZF9kZXZpY2VzLCAwLCBzaXplb2YoYnRpZl9ib25kZWRfZGV2aWNlc190KSk7Ci0KLSAgYm9vbCBidF9saW5ra2V5X2ZpbGVfZm91bmQgPSBmYWxzZTsKLSAgaW50IGRldmljZV90eXBlOwotCi0gIGZvciAoY29uc3QgYXV0byYgYmRfYWRkciA6IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcygpKSB7Ci0gICAgYXV0byBuYW1lID0gYmRfYWRkci5Ub1N0cmluZygpOwotCi0gICAgQlRJRl9UUkFDRV9ERUJVRygiUmVtb3RlIGRldmljZTolcyIsIG5hbWUuY19zdHIoKSk7Ci0gICAgTGlua0tleSBsaW5rX2tleTsKLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihsaW5rX2tleSk7Ci0gICAgaWYgKGJ0aWZfY29uZmlnX2dldF9iaW4obmFtZSwgIkxpbmtLZXkiLCBsaW5rX2tleS5kYXRhKCksICZzaXplKSkgewotICAgICAgaW50IGxpbmtrZXlfdHlwZTsKLSAgICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsICJMaW5rS2V5VHlwZSIsICZsaW5ra2V5X3R5cGUpKSB7Ci0gICAgICAgIGlmIChhZGQpIHsKLSAgICAgICAgICBERVZfQ0xBU1MgZGV2X2NsYXNzID0gezAsIDAsIDB9OwotICAgICAgICAgIGludCBjb2Q7Ci0gICAgICAgICAgaW50IHBpbl9sZW5ndGggPSAwOwotICAgICAgICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsICJEZXZDbGFzcyIsICZjb2QpKQotICAgICAgICAgICAgdWludDJkZXZjbGFzcygodWludDMyX3QpY29kLCBkZXZfY2xhc3MpOwotICAgICAgICAgIGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgIlBpbkxlbmd0aCIsICZwaW5fbGVuZ3RoKTsKLSAgICAgICAgICBCVEFfRG1BZGREZXZpY2UoYmRfYWRkciwgZGV2X2NsYXNzLCBsaW5rX2tleSwgKHVpbnQ4X3QpbGlua2tleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5fbGVuZ3RoKTsKLQotICAgICAgICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsICJEZXZUeXBlIiwgJmRldmljZV90eXBlKSAmJgotICAgICAgICAgICAgICAoZGV2aWNlX3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfRFVNTykpIHsKLSAgICAgICAgICAgIGJ0aWZfZ2F0dHNfYWRkX2JvbmRlZF9kZXZfZnJvbV9udihiZF9hZGRyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnRfbGlua2tleV9maWxlX2ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgcF9ib25kZWRfZGV2aWNlcy0+ZGV2aWNlc1twX2JvbmRlZF9kZXZpY2VzLT5udW1fZGV2aWNlcysrXSA9IGJkX2FkZHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidF9saW5ra2V5X2ZpbGVfZm91bmQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFidGlmX2luX2ZldGNoX2JvbmRlZF9ibGVfZGV2aWNlKG5hbWUsIGFkZCwgcF9ib25kZWRfZGV2aWNlcykgJiYgIWJ0X2xpbmtrZXlfZmlsZV9mb3VuZCkgewotICAgICAgTE9HX1ZFUkJPU0UoIk5vIGxpbmsga2V5IG9yIGJsZSBrZXkgZm91bmQgZm9yIGRldmljZTolcyIsIG5hbWUuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9yZWFkX2xlX2tleShjb25zdCB1aW50OF90IGtleV90eXBlLCBjb25zdCBzaXplX3Qga2V5X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyBiZF9hZGRyLCBjb25zdCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYWRkX2tleSwgYm9vbCogZGV2aWNlX2FkZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBrZXlfZm91bmQpIHsKLSAgQ0hFQ0soZGV2aWNlX2FkZGVkKTsKLSAgQ0hFQ0soa2V5X2ZvdW5kKTsKLQotICB0QlRBX0xFX0tFWV9WQUxVRSBrZXk7Ci0gIG1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7Ci0KLSAgaWYgKGJ0aWZfc3RvcmFnZV9nZXRfYmxlX2JvbmRpbmdfa2V5KGJkX2FkZHIsIGtleV90eXBlLCAodWludDhfdCopJmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9sZW4pID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgaWYgKGFkZF9rZXkpIHsKLSAgICAgIGlmICghKmRldmljZV9hZGRlZCkgewotICAgICAgICBCVEFfRG1BZGRCbGVEZXZpY2UoYmRfYWRkciwgYWRkcl90eXBlLCBCVF9ERVZJQ0VfVFlQRV9CTEUpOwotICAgICAgICAqZGV2aWNlX2FkZGVkID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMoKSBBZGRpbmcga2V5IHR5cGUgJWQgZm9yICVzIiwgX19mdW5jX18sIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBCVEFfRG1BZGRCbGVLZXkoYmRfYWRkciwgJmtleSwga2V5X3R5cGUpOwotICAgIH0KLQotICAgICprZXlfZm91bmQgPSB0cnVlOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbnMKLSAqCi0gKiBGdW5jdGlvbnMgYXJlIHN5bmNocm9ub3VzIGFuZCBjYW4gYmUgY2FsbGVkIGJ5IGJvdGggZnJvbSBpbnRlcm5hbCBtb2R1bGVzCi0gKiBzdWNoIGFzIEJUSUZfRE0gYW5kIGJ5IGV4dGVybmFsIGVudGlyaWVzIGZyb20gSEFMIHZpYSBCVElGX2NvbnRleHRfc3dpdGNoLgotICogRm9yIE9VVCBwYXJhbWV0ZXJzLCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHByb3ZpZGUgdGhlIG1lbW9yeS4KLSAqIENhbGxlciBpcyBleHBlY3RlZCB0byBwcm92aWRlIGEgdmFsaWQgcG9pbnRlciB0byAncHJvcGVydHktPnZhbHVlJyBiYXNlZCBvbgotICogdGhlIHByb3BlcnR5LT50eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3BsaXRfdXVpZHNfc3RyaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gc3BsaXQgdGhlIHN0cmluZyBvZiBVVUlEcwotICogICAgICAgICAgICAgICAgICByZWFkIGZyb20gdGhlIE5WUkFNIHRvIGFuIGFycmF5Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOdW1iZXIgb2YgVVVJRHMgcGFyc2VkIGZyb20gdGhlIHN1cHBsaWVkIHN0cmluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zaXplX3QgYnRpZl9zcGxpdF91dWlkc19zdHJpbmcoY29uc3QgY2hhciogc3RyLCBibHVldG9vdGg6OlV1aWQqIHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X3V1aWRzKSB7Ci0gIENIRUNLKHN0cik7Ci0gIENIRUNLKHBfdXVpZCk7Ci0KLSAgc2l6ZV90IG51bV91dWlkcyA9IDA7Ci0gIHdoaWxlIChzdHIgJiYgbnVtX3V1aWRzIDwgbWF4X3V1aWRzKSB7Ci0gICAgYm9vbCBpc192YWxpZDsKLSAgICBibHVldG9vdGg6OlV1aWQgdG1wID0KLSAgICAgICAgVXVpZDo6RnJvbVN0cmluZyhzdGQ6OnN0cmluZyhzdHIsIFV1aWQ6OmtTdHJpbmcxMjhCaXRMZW4pLCAmaXNfdmFsaWQpOwotICAgIGlmICghaXNfdmFsaWQpIGJyZWFrOwotCi0gICAgKnBfdXVpZCA9IHRtcDsKLSAgICBwX3V1aWQrKzsKLQotICAgIG51bV91dWlkcysrOwotICAgIHN0ciA9IHN0cmNocihzdHIsICcgJyk7Ci0gICAgaWYgKHN0cikgc3RyKys7Ci0gIH0KLQotICByZXR1cm4gbnVtX3V1aWRzOwotfQotCi0vKioKLSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZmV0Y2hpbmcgYSBsb2NhbCBJbnB1dC9PdXRwdXQgY2FwYWJpbGl0eSBwcm9wZXJ0eS4gSWYgbm90Ci0gKiBzZXQsIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKi8KLXN0YXRpYyB1aW50OF90IGJ0aWZfc3RvcmFnZV9nZXRfaW9fY2FwX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZWZhdWx0X3ZhbHVlKSB7Ci0gIGNoYXIgYnVmW3NpemVvZihpbnQpXTsKLQotICBidF9wcm9wZXJ0eV90IHByb3BlcnR5OwotICBwcm9wZXJ0eS50eXBlID0gdHlwZTsKLSAgcHJvcGVydHkudmFsID0gKHZvaWQqKWJ1ZjsKLSAgcHJvcGVydHkubGVuID0gc2l6ZW9mKGludCk7Ci0KLSAgYnRfc3RhdHVzX3QgcmV0ID0gYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wZXJ0eSk7Ci0KLSAgcmV0dXJuIChyZXQgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpID8gKHVpbnQ4X3QpKCooaW50Kilwcm9wZXJ0eS52YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRfdmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfZ2V0X2lvX2NhcHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBGZXRjaGVzIHRoZSBsb2NhbCBJbnB1dC9PdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIGxvY2FsIElPIENhcGFiaWxpdHkgb2YgZGV2aWNlLiBJZiBub3Qgc3RvcmVkLAotICogICAgICAgICAgICAgICAgICByZXR1cm5zIEJUTV9MT0NBTF9JT19DQVBTLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGJ0aWZfc3RvcmFnZV9nZXRfbG9jYWxfaW9fY2FwcygpIHsKLSAgcmV0dXJuIGJ0aWZfc3RvcmFnZV9nZXRfaW9fY2FwX3Byb3BlcnR5KEJUX1BST1BFUlRZX0xPQ0FMX0lPX0NBUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fTE9DQUxfSU9fQ0FQUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfZ2V0X2lvX2NhcHNfYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gRmV0Y2hlcyB0aGUgbG9jYWwgSW5wdXQvT3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBvZiB0aGUgQkxFIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgbG9jYWwgSU8gQ2FwYWJpbGl0eSBvZiBCTEUgZGV2aWNlLiBJZiBub3Qgc3RvcmVkLAotICogICAgICAgICAgICAgICAgICByZXR1cm5zIEJUTV9MT0NBTF9JT19DQVBTX0JMRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBidGlmX3N0b3JhZ2VfZ2V0X2xvY2FsX2lvX2NhcHNfYmxlKCkgewotICByZXR1cm4gYnRpZl9zdG9yYWdlX2dldF9pb19jYXBfcHJvcGVydHkoQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQU19CTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fTE9DQUxfSU9fQ0FQU19CTEUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gRmV0Y2hlcyB0aGUgYWRhcHRlciBwcm9wZXJ0eS0+dHlwZQotICogICAgICAgICAgICAgICAgICBmcm9tIE5WUkFNIGFuZCBmaWxscyBwcm9wZXJ0eS0+dmFsLgotICogICAgICAgICAgICAgICAgICBDYWxsZXIgc2hvdWxkIHByb3ZpZGUgbWVtb3J5IGZvciBwcm9wZXJ0eS0+dmFsIGFuZAotICogICAgICAgICAgICAgICAgICBzZXQgdGhlIHByb3BlcnR5LT52YWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBmZXRjaCB3YXMgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9nZXRfYWRhcHRlcl9wcm9wZXJ0eShidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBhZGFwdGVyIGFkZHJlc3MgYW5kIEJPTkRFRF9ERVZJQ0VTICovCi0gIGlmIChwcm9wZXJ0eS0+dHlwZSA9PSBCVF9QUk9QRVJUWV9CREFERFIpIHsKLSAgICBSYXdBZGRyZXNzKiBiZF9hZGRyID0gKFJhd0FkZHJlc3MqKXByb3BlcnR5LT52YWw7Ci0gICAgLyogRmV0Y2ggdGhlIGxvY2FsIEJEIEFERFIgKi8KLSAgICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLSAgICBpZiAoIWNvbnRyb2xsZXItPmdldF9pc19yZWFkeSgpKSB7Ci0gICAgICBMT0dfRVJST1IoIiVzOiBDb250cm9sbGVyIG5vdCByZWFkeSEgVW5hYmxlIHRvIHJldHVybiBCbHVldG9vdGggQWRkcmVzcyIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgKmJkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19FUlJPUigiJXM6IENvbnRyb2xsZXIgcmVhZHkhIiwgX19mdW5jX18pOwotICAgICAgKmJkX2FkZHIgPSAqY29udHJvbGxlci0+Z2V0X2FkZHJlc3MoKTsKLSAgICB9Ci0gICAgcHJvcGVydHktPmxlbiA9IFJhd0FkZHJlc3M6OmtMZW5ndGg7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9IGVsc2UgaWYgKHByb3BlcnR5LT50eXBlID09IEJUX1BST1BFUlRZX0FEQVBURVJfQk9OREVEX0RFVklDRVMpIHsKLSAgICBidGlmX2JvbmRlZF9kZXZpY2VzX3QgYm9uZGVkX2RldmljZXM7Ci0KLSAgICBidGlmX2luX2ZldGNoX2JvbmRlZF9kZXZpY2VzKCZib25kZWRfZGV2aWNlcywgMCk7Ci0KLSAgICBCVElGX1RSQUNFX0RFQlVHKAotICAgICAgICAiJXM6IE51bWJlciBvZiBib25kZWQgZGV2aWNlczogJWQgIgotICAgICAgICAiUHJvcGVydHk6QlRfUFJPUEVSVFlfQURBUFRFUl9CT05ERURfREVWSUNFUyIsCi0gICAgICAgIF9fZnVuY19fLCBib25kZWRfZGV2aWNlcy5udW1fZGV2aWNlcyk7Ci0KLSAgICBpZiAoYm9uZGVkX2RldmljZXMubnVtX2RldmljZXMgPiAwKSB7Ci0gICAgICBwcm9wZXJ0eS0+bGVuID0gYm9uZGVkX2RldmljZXMubnVtX2RldmljZXMgKiBSYXdBZGRyZXNzOjprTGVuZ3RoOwotICAgICAgbWVtY3B5KHByb3BlcnR5LT52YWwsIGJvbmRlZF9kZXZpY2VzLmRldmljZXMsIHByb3BlcnR5LT5sZW4pOwotICAgIH0KLQotICAgIC8qIGlmIHRoZXJlIGFyZSBubyBib25kZWRfZGV2aWNlcywgdGhlbiBsZW5ndGggc2hhbGwgYmUgMCAqLwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfSBlbHNlIGlmIChwcm9wZXJ0eS0+dHlwZSA9PSBCVF9QUk9QRVJUWV9VVUlEUykgewotICAgIC8qIHB1Ymxpc2ggbGlzdCBvZiBsb2NhbCBzdXBwb3J0ZWQgc2VydmljZXMgKi8KLSAgICBVdWlkKiBwX3V1aWQgPSByZWludGVycHJldF9jYXN0PFV1aWQqPihwcm9wZXJ0eS0+dmFsKTsKLSAgICB1aW50MzJfdCBudW1fdXVpZHMgPSAwOwotICAgIHVpbnQzMl90IGk7Ci0KLSAgICB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlX21hc2sgPSBidGlmX2dldF9lbmFibGVkX3NlcnZpY2VzX21hc2soKTsKLSAgICBMT0dfSU5GTygiJXMgc2VydmljZV9tYXNrOjB4JXgiLCBfX2Z1bmNfXywgc2VydmljZV9tYXNrKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX01BWF9TRVJWSUNFX0lEOyBpKyspIHsKLSAgICAgIC8qIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmVjb21lIGEgZnVuY3Rpb24gd2hlbiBtb3JlIHNlcnZpY2VzIGFyZSBlbmFibGVkCi0gICAgICAgKi8KLSAgICAgIGlmIChzZXJ2aWNlX21hc2sgJiAodEJUQV9TRVJWSUNFX01BU0spKDEgPDwgaSkpIHsKLSAgICAgICAgc3dpdGNoIChpKSB7Ci0gICAgICAgICAgY2FzZSBCVEFfSEZQX1NFUlZJQ0VfSUQ6IHsKLSAgICAgICAgICAgICoocF91dWlkICsgbnVtX3V1aWRzKSA9Ci0gICAgICAgICAgICAgICAgVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0FHX0hBTkRTRlJFRSk7Ci0gICAgICAgICAgICBudW1fdXVpZHMrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgICAgICAvKiBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2g6IFNlbmQgYm90aCBCRlAgJiBIU1AgVVVJRHMgaWYgSEZQIGlzCi0gICAgICAgICAgICogZW5hYmxlZCAqLwotICAgICAgICAgIGNhc2UgQlRBX0hTUF9TRVJWSUNFX0lEOiB7Ci0gICAgICAgICAgICAqKHBfdXVpZCArIG51bV91dWlkcykgPQotICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVkpOwotICAgICAgICAgICAgbnVtX3V1aWRzKys7Ci0gICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICBjYXNlIEJUQV9BMkRQX1NPVVJDRV9TRVJWSUNFX0lEOiB7Ci0gICAgICAgICAgICAqKHBfdXVpZCArIG51bV91dWlkcykgPQotICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UpOwotICAgICAgICAgICAgbnVtX3V1aWRzKys7Ci0gICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICBjYXNlIEJUQV9BMkRQX1NJTktfU0VSVklDRV9JRDogewotICAgICAgICAgICAgKihwX3V1aWQgKyBudW1fdXVpZHMpID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspOwotICAgICAgICAgICAgbnVtX3V1aWRzKys7Ci0gICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICBjYXNlIEJUQV9QQkFQX1NFUlZJQ0VfSUQ6IHsKLSAgICAgICAgICAgICoocF91dWlkICsgbnVtX3V1aWRzKSA9IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19QQkFQX1BTRSk7Ci0gICAgICAgICAgICBudW1fdXVpZHMrKzsKLSAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgIGNhc2UgQlRBX0hGUF9IU19TRVJWSUNFX0lEOiB7Ci0gICAgICAgICAgICAqKHBfdXVpZCArIG51bV91dWlkcykgPQotICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUpOwotICAgICAgICAgICAgbnVtX3V1aWRzKys7Ci0gICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICBjYXNlIEJUQV9NQVBfU0VSVklDRV9JRDogewotICAgICAgICAgICAgKihwX3V1aWQgKyBudW1fdXVpZHMpID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX01FU1NBR0VfQUNDRVNTKTsKLSAgICAgICAgICAgIG51bV91dWlkcysrOwotICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgY2FzZSBCVEFfTU5fU0VSVklDRV9JRDogewotICAgICAgICAgICAgKihwX3V1aWQgKyBudW1fdXVpZHMpID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX01FU1NBR0VfTk9USUZJQ0FUSU9OKTsKLSAgICAgICAgICAgIG51bV91dWlkcysrOwotICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgY2FzZSBCVEFfUENFX1NFUlZJQ0VfSUQ6IHsKLSAgICAgICAgICAgICoocF91dWlkICsgbnVtX3V1aWRzKSA9IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19QQkFQX1BDRSk7Ci0gICAgICAgICAgICBudW1fdXVpZHMrKzsKLSAgICAgICAgICB9IGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHByb3BlcnR5LT5sZW4gPSAobnVtX3V1aWRzKSAqIHNpemVvZihVdWlkKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0KLQotICAvKiBmYWxsIHRocm91Z2ggZm9yIG90aGVyIHByb3BlcnRpZXMgKi8KLSAgaWYgKCFjZmcycHJvcChOVUxMLCBwcm9wZXJ0eSkpIHsKLSAgICByZXR1cm4gYnRpZl9kbV9nZXRfYWRhcHRlcl9wcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3NldF9hZGFwdGVyX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gU3RvcmVzIHRoZSBhZGFwdGVyIHByb3BlcnR5Ci0gKiAgICAgICAgICAgICAgICAgIHRvIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X2FkYXB0ZXJfcHJvcGVydHkoYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgcmV0dXJuIHByb3AyY2ZnKE5VTEwsIHByb3BlcnR5KSA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBGZXRjaGVzIHRoZSByZW1vdGUgZGV2aWNlIHByb3BlcnR5LT50eXBlCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gTlZSQU0gYW5kIGZpbGxzIHByb3BlcnR5LT52YWwuCi0gKiAgICAgICAgICAgICAgICAgIENhbGxlciBzaG91bGQgcHJvdmlkZSBtZW1vcnkgZm9yIHByb3BlcnR5LT52YWwgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHNldCB0aGUgcHJvcGVydHktPnZhbAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGZldGNoIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICByZXR1cm4gY2ZnMnByb3AocmVtb3RlX2JkX2FkZHIsIHByb3BlcnR5KSA/IEJUX1NUQVRVU19TVUNDRVNTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gU3RvcmVzIHRoZSByZW1vdGUgZGV2aWNlIHByb3BlcnR5Ci0gKiAgICAgICAgICAgICAgICAgIHRvIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIHJldHVybiBwcm9wMmNmZyhyZW1vdGVfYmRfYWRkciwgcHJvcGVydHkpID8gQlRfU1RBVFVTX1NVQ0NFU1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfcmVtb3RlX2RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIEFkZHMgYSBuZXdseSBkaXNjb3ZlcmVkIGRldmljZSB0byBOVlJBTQotICogICAgICAgICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSB0aW1lc3RhbXAuIEFsc28sIHN0b3JlcyB0aGUgdmFyaW91cwotICogICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIC0gUlNTSSwgQkRBRERSLCBOQU1FIChpZiBmb3VuZCBpbiBFSVIpCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX3JlbW90ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICB1aW50MzJfdCBpID0gMDsKLSAgLyogVE9ETzogSWYgd3JpdGluZyBhIHByb3BlcnR5LCBmYWlscyBkbyB3ZSBnbyBiYWNrIHVuZG8gdGhlIGVhcmxpZXIKLSAgICogd3JpdHRlbiBwcm9wZXJ0aWVzPyAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Byb3BlcnRpZXM7IGkrKykgewotICAgIC8qIElnbm9yZSB0aGUgUlNTSSBhcyB0aGlzIGlzIG5vdCBzdG9yZWQgaW4gREIgKi8KLSAgICBpZiAocHJvcGVydGllc1tpXS50eXBlID09IEJUX1BST1BFUlRZX1JFTU9URV9SU1NJKSBjb250aW51ZTsKLQotICAgIC8qIGFkZHJlc3MgZm9yIHJlbW90ZSBkZXZpY2UgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBhcyB3ZSBhbHNvIHN0b3JlCi0gICAgICogdGltZXN0YW1wICovCi0gICAgaWYgKHByb3BlcnRpZXNbaV0udHlwZSA9PSBCVF9QUk9QRVJUWV9CREFERFIpIHsKLSAgICAgIGJ0X3Byb3BlcnR5X3QgYWRkcl9wcm9wOwotICAgICAgbWVtY3B5KCZhZGRyX3Byb3AsICZwcm9wZXJ0aWVzW2ldLCBzaXplb2YoYnRfcHJvcGVydHlfdCkpOwotICAgICAgYWRkcl9wcm9wLnR5cGUgPSAoYnRfcHJvcGVydHlfdHlwZV90KUJUX1BST1BFUlRZX1JFTU9URV9ERVZJQ0VfVElNRVNUQU1QOwotICAgICAgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KHJlbW90ZV9iZF9hZGRyLCAmYWRkcl9wcm9wKTsKLSAgICB9IGVsc2UgewotICAgICAgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KHJlbW90ZV9iZF9hZGRyLCAmcHJvcGVydGllc1tpXSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9hZGRfYm9uZGVkX2RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIEFkZHMgdGhlIG5ld2x5IGJvbmRlZCBkZXZpY2UgdG8gTlZSQU0KLSAqICAgICAgICAgICAgICAgICAgYWxvbmcgd2l0aCB0aGUgbGluay1rZXksIEtleSB0eXBlIGFuZCBQaW4ga2V5IGxlbmd0aAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIHN0b3JlIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2JvbmRlZF9kZXZpY2UoUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua0tleSBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW5ndGgpIHsKLSAgc3RkOjpzdHJpbmcgYmRzdHIgPSByZW1vdGVfYmRfYWRkci0+VG9TdHJpbmcoKTsKLSAgaW50IHJldCA9IGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJMaW5rS2V5VHlwZSIsIChpbnQpa2V5X3R5cGUpOwotICByZXQgJj0gYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgIlBpbkxlbmd0aCIsIChpbnQpcGluX2xlbmd0aCk7Ci0gIHJldCAmPQotICAgICAgYnRpZl9jb25maWdfc2V0X2JpbihiZHN0ciwgIkxpbmtLZXkiLCBsaW5rX2tleS5kYXRhKCksIGxpbmtfa2V5LnNpemUoKSk7Ci0KLSAgaWYgKGlzX3Jlc3RyaWN0ZWRfbW9kZSgpKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogJyVzJyBwYWlyaW5nIHdpbGwgYmUgcmVtb3ZlZCBpZiB1bnJlc3RyaWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmRzdHIuY19zdHIoKSk7Ci0gICAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgIlJlc3RyaWN0ZWQiLCAxKTsKLSAgfQotCi0gIC8qIHdyaXRlIGJvbmRlZCBpbmZvIGltbWVkaWF0ZWx5ICovCi0gIGJ0aWZfY29uZmlnX2ZsdXNoKCk7Ci0gIHJldHVybiByZXQgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3JlbW92ZV9ib25kZWRfZGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gRGVsZXRlcyB0aGUgYm9uZGVkIGRldmljZSBmcm9tIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgZGVsZXRpb24gd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2JvbmRlZF9kZXZpY2UoCi0gICAgY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIpIHsKLSAgc3RkOjpzdHJpbmcgYmRzdHIgPSByZW1vdGVfYmRfYWRkci0+VG9TdHJpbmcoKTsKLSAgTE9HX0lORk8oIlJlbW92aW5nIGJvbmRlZCBkZXZpY2UgYWRkcjolcyIsIGJkc3RyLmNfc3RyKCkpOwotCi0gIGJ0aWZfc3RvcmFnZV9yZW1vdmVfYmxlX2JvbmRpbmdfa2V5cyhyZW1vdGVfYmRfYWRkcik7Ci0KLSAgaW50IHJldCA9IDE7Ci0gIGlmIChidGlmX2NvbmZpZ19leGlzdChiZHN0ciwgIkxpbmtLZXlUeXBlIikpCi0gICAgcmV0ICY9IGJ0aWZfY29uZmlnX3JlbW92ZShiZHN0ciwgIkxpbmtLZXlUeXBlIik7Ci0gIGlmIChidGlmX2NvbmZpZ19leGlzdChiZHN0ciwgIlBpbkxlbmd0aCIpKQotICAgIHJldCAmPSBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsICJQaW5MZW5ndGgiKTsKLSAgaWYgKGJ0aWZfY29uZmlnX2V4aXN0KGJkc3RyLCAiTGlua0tleSIpKQotICAgIHJldCAmPSBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsICJMaW5rS2V5Iik7Ci0gIGlmIChidGlmX2NvbmZpZ19leGlzdChiZHN0ciwgQlRJRl9TVE9SQUdFX1BBVEhfUkVNT1RFX0FMSUFTRSkpIHsKLSAgICByZXQgJj0gYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCBCVElGX1NUT1JBR0VfUEFUSF9SRU1PVEVfQUxJQVNFKTsKLSAgfQotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9DTElFTlRfU1VQUE9SVEVEKSkgewotICAgIHJldCAmPSBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9DTElFTlRfU1VQUE9SVEVEKTsKLSAgfQotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9DTElFTlRfREJfSEFTSCkpIHsKLSAgICByZXQgJj0gYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCBCVElGX1NUT1JBR0VfS0VZX0dBVFRfQ0xJRU5UX0RCX0hBU0gpOwotICB9Ci0gIGlmIChidGlmX2NvbmZpZ19leGlzdChiZHN0ciwgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX1NFUlZFUl9TVVBQT1JURUQpKSB7Ci0gICAgcmV0ICY9IGJ0aWZfY29uZmlnX3JlbW92ZShiZHN0ciwgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX1NFUlZFUl9TVVBQT1JURUQpOwotICB9Ci0KLSAgLyogd3JpdGUgYm9uZGVkIGluZm8gaW1tZWRpYXRlbHkgKi8KLSAgYnRpZl9jb25maWdfZmx1c2goKTsKLSAgcmV0dXJuIHJldCA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLS8qIFNvbWUgZGV2aWNlcyBoYXJkY29kZSBzYW1wbGUgTFRLIHZhbHVlIGZyb20gc3BlYywgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIG9uZS4KLSAqIFRyZWF0IHN1Y2ggZGV2aWNlcyBhcyBpbnNlY3VyZSwgYW5kIHJlbW92ZSBzdWNoIGJvbmRzIHdoZW4gYmx1ZXRvb3RoCi0gKiByZXN0YXJ0cy4gUmVtb3ZpbmcgdGhlbSBhZnRlciBkaXNjb25uZWN0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseS4KLSAqCi0gKiBXZSBzdGlsbCBhbGxvdyBzdWNoIGRldmljZXMgdG8gYm9uZCBpbiBvcmRlciB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvCi0gKiB1cGRhdGUgZmlybXdhcmUuCi0gKi8KLXN0YXRpYyB2b2lkIHJlbW92ZV9kZXZpY2VzX3dpdGhfc2FtcGxlX2x0aygpIHsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYmFkX2x0azsKLSAgZm9yIChjb25zdCBhdXRvJiBiZF9hZGRyIDogYnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzKCkpIHsKLSAgICBhdXRvIG5hbWUgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0KLSAgICB0QlRBX0xFX0tFWV9WQUxVRSBrZXk7Ci0gICAgbWVtc2V0KCZrZXksIDAsIHNpemVvZihrZXkpKTsKLQotICAgIGlmIChidGlmX3N0b3JhZ2VfZ2V0X2JsZV9ib25kaW5nX2tleSgKLSAgICAgICAgICAgIGJkX2FkZHIsIEJUTV9MRV9LRVlfUEVOQywgKHVpbnQ4X3QqKSZrZXksCi0gICAgICAgICAgICBzaXplb2YodEJUTV9MRV9QRU5DX0tFWVMpKSA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgaWYgKGlzX3NhbXBsZV9sdGsoa2V5LnBlbmNfa2V5Lmx0aykpIHsKLSAgICAgICAgYmFkX2x0ay5wdXNoX2JhY2soYmRfYWRkcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZm9yIChSYXdBZGRyZXNzIGFkZHJlc3MgOiBiYWRfbHRrKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjg0MzcyOTciKTsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiByZW1vdmluZyBib25kIHRvIGRldmljZSB1c2luZyB0ZXN0IFRMSzogIiA8PCBhZGRyZXNzOwotCi0gICAgYnRpZl9zdG9yYWdlX3JlbW92ZV9ib25kZWRfZGV2aWNlKCZhZGRyZXNzKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2RldmljZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBMb2FkcyBhbGwgdGhlIGJvbmRlZCBkZXZpY2VzIGZyb20gTlZSQU0KLSAqICAgICAgICAgICAgICAgICAgYW5kIGFkZHMgdG8gdGhlIEJUQS4KLSAqICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB0aGlzIEFQSSBhbHNvIGludm9rZXMgdGhlIGFkYXBlcl9wcm9wZXJ0aWVzX2NiCi0gKiAgICAgICAgICAgICAgICAgIGFuZCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IgZm9yIGVhY2ggb2YgdGhlIGJvbmRlZAotICogICAgICAgICAgICAgICAgICBkZXZpY2VzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9kZXZpY2VzKHZvaWQpIHsKLSAgYnRpZl9ib25kZWRfZGV2aWNlc190IGJvbmRlZF9kZXZpY2VzOwotICB1aW50MzJfdCBpID0gMDsKLSAgYnRfcHJvcGVydHlfdCBhZGFwdGVyX3Byb3BzWzZdOwotICB1aW50MzJfdCBudW1fcHJvcHMgPSAwOwotICBidF9wcm9wZXJ0eV90IHJlbW90ZV9wcm9wZXJ0aWVzWzhdOwotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGJ0X2JkbmFtZV90IG5hbWUsIGFsaWFzOwotICBidF9zY2FuX21vZGVfdCBtb2RlOwotICB1aW50MzJfdCBkaXNjX3RpbWVvdXQ7Ci0gIFV1aWQgbG9jYWxfdXVpZHNbQlRfTUFYX05VTV9VVUlEU107Ci0gIFV1aWQgcmVtb3RlX3V1aWRzW0JUX01BWF9OVU1fVVVJRFNdOwotICBidF9zdGF0dXNfdCBzdGF0dXM7Ci0KLSAgcmVtb3ZlX2RldmljZXNfd2l0aF9zYW1wbGVfbHRrKCk7Ci0KLSAgYnRpZl9pbl9mZXRjaF9ib25kZWRfZGV2aWNlcygmYm9uZGVkX2RldmljZXMsIDEpOwotCi0gIC8qIE5vdyBzZW5kIHRoZSBhZGFwdGVyX3Byb3BlcnRpZXNfY2Igd2l0aCBhbGwgYWRhcHRlcl9wcm9wZXJ0aWVzICovCi0gIHsKLSAgICBtZW1zZXQoYWRhcHRlcl9wcm9wcywgMCwgc2l6ZW9mKGFkYXB0ZXJfcHJvcHMpKTsKLQotICAgIC8qIGFkZHJlc3MgKi8KLSAgICBCVElGX1NUT1JBR0VfR0VUX0FEQVBURVJfUFJPUChzdGF0dXMsIEJUX1BST1BFUlRZX0JEQUREUiwgJmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkZHIpLCBhZGFwdGVyX3Byb3BzW251bV9wcm9wc10pOwotICAgIC8vIEFkZCBCVF9QUk9QRVJUWV9CREFERFIgcHJvcGVydHkgaW50byBsaXN0IG9ubHkgd2hlbiBzdWNjZXNzZnVsLgotICAgIC8vIE90aGVyd2lzZSwgc2tpcCB0aGlzIHByb3BlcnR5IGVudHJ5LgotICAgIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIG51bV9wcm9wcysrOwotICAgIH0KLQotICAgIC8qIEJEX05BTUUgKi8KLSAgICBCVElGX1NUT1JBR0VfR0VUX0FEQVBURVJfUFJPUChzdGF0dXMsIEJUX1BST1BFUlRZX0JETkFNRSwgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWUpLCBhZGFwdGVyX3Byb3BzW251bV9wcm9wc10pOwotICAgIG51bV9wcm9wcysrOwotCi0gICAgLyogU0NBTl9NT0RFICovCi0gICAgLyogVE9ETzogQXQgdGhlIHRpbWUgb2YgQlQgb24sIGFsd2F5cyByZXBvcnQgdGhlIHNjYW4gbW9kZSBhcyAwIGlycmVzcGVjdGl2ZQotICAgICBvZiB0aGUgc2Nhbl9tb2RlIGR1cmluZyB0aGUgcHJldmlvdXMgZW5hYmxlIGN5Y2xlLgotICAgICBUaGlzIG5lZWRzIHRvIGJlIHJlLXZpc2l0ZWQgYXMgcGFydCBvZiB0aGUgYXBwL3N0YWNrIGVuYWJsZSBzZXF1ZW5jZQotICAgICBzeW5jaHJvbml6YXRpb24gKi8KLSAgICBtb2RlID0gQlRfU0NBTl9NT0RFX05PTkU7Ci0gICAgYWRhcHRlcl9wcm9wc1tudW1fcHJvcHNdLnR5cGUgPSBCVF9QUk9QRVJUWV9BREFQVEVSX1NDQU5fTU9ERTsKLSAgICBhZGFwdGVyX3Byb3BzW251bV9wcm9wc10ubGVuID0gc2l6ZW9mKG1vZGUpOwotICAgIGFkYXB0ZXJfcHJvcHNbbnVtX3Byb3BzXS52YWwgPSAmbW9kZTsKLSAgICBudW1fcHJvcHMrKzsKLQotICAgIC8qIERJU0NfVElNRU9VVCAqLwotICAgIEJUSUZfU1RPUkFHRV9HRVRfQURBUFRFUl9QUk9QKHN0YXR1cywgQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzY190aW1lb3V0LCBzaXplb2YoZGlzY190aW1lb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyX3Byb3BzW251bV9wcm9wc10pOwotICAgIG51bV9wcm9wcysrOwotCi0gICAgLyogQk9OREVEX0RFVklDRVMgKi8KLSAgICBSYXdBZGRyZXNzKiBkZXZpY2VzX2xpc3QgPSAoUmF3QWRkcmVzcyopb3NpX21hbGxvYygKLSAgICAgICAgc2l6ZW9mKFJhd0FkZHJlc3MpICogYm9uZGVkX2RldmljZXMubnVtX2RldmljZXMpOwotICAgIGFkYXB0ZXJfcHJvcHNbbnVtX3Byb3BzXS50eXBlID0gQlRfUFJPUEVSVFlfQURBUFRFUl9CT05ERURfREVWSUNFUzsKLSAgICBhZGFwdGVyX3Byb3BzW251bV9wcm9wc10ubGVuID0KLSAgICAgICAgYm9uZGVkX2RldmljZXMubnVtX2RldmljZXMgKiBzaXplb2YoUmF3QWRkcmVzcyk7Ci0gICAgYWRhcHRlcl9wcm9wc1tudW1fcHJvcHNdLnZhbCA9IGRldmljZXNfbGlzdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYm9uZGVkX2RldmljZXMubnVtX2RldmljZXM7IGkrKykgewotICAgICAgZGV2aWNlc19saXN0W2ldID0gYm9uZGVkX2RldmljZXMuZGV2aWNlc1tpXTsKLSAgICB9Ci0gICAgbnVtX3Byb3BzKys7Ci0KLSAgICAvKiBMT0NBTCBVVUlEcyAqLwotICAgIEJUSUZfU1RPUkFHRV9HRVRfQURBUFRFUl9QUk9QKHN0YXR1cywgQlRfUFJPUEVSVFlfVVVJRFMsIGxvY2FsX3V1aWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb2NhbF91dWlkcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcl9wcm9wc1tudW1fcHJvcHNdKTsKLSAgICBudW1fcHJvcHMrKzsKLQotICAgIGJ0aWZfYWRhcHRlcl9wcm9wZXJ0aWVzX2V2dChCVF9TVEFUVVNfU1VDQ0VTUywgbnVtX3Byb3BzLCBhZGFwdGVyX3Byb3BzKTsKLQotICAgIG9zaV9mcmVlKGRldmljZXNfbGlzdCk7Ci0gIH0KLQotICBCVElGX1RSQUNFX0VWRU5UKCIlczogJWQgYm9uZGVkIGRldmljZXMgZm91bmQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBib25kZWRfZGV2aWNlcy5udW1fZGV2aWNlcyk7Ci0KLSAgewotICAgIGZvciAoaSA9IDA7IGkgPCBib25kZWRfZGV2aWNlcy5udW1fZGV2aWNlczsgaSsrKSB7Ci0gICAgICBSYXdBZGRyZXNzKiBwX3JlbW90ZV9hZGRyOwotCi0gICAgICAvKgotICAgICAgICogVE9ETzogaW1wcm92ZSBoYW5kbGluZyBvZiBtaXNzaW5nIGZpZWxkcyBpbiBOVlJBTS4KLSAgICAgICAqLwotICAgICAgdWludDMyX3QgY29kID0gMDsKLSAgICAgIHVpbnQzMl90IGRldnR5cGUgPSAwOwotCi0gICAgICBudW1fcHJvcHMgPSAwOwotICAgICAgcF9yZW1vdGVfYWRkciA9ICZib25kZWRfZGV2aWNlcy5kZXZpY2VzW2ldOwotICAgICAgbWVtc2V0KHJlbW90ZV9wcm9wZXJ0aWVzLCAwLCBzaXplb2YocmVtb3RlX3Byb3BlcnRpZXMpKTsKLSAgICAgIEJUSUZfU1RPUkFHRV9HRVRfUkVNT1RFX1BST1AocF9yZW1vdGVfYWRkciwgQlRfUFJPUEVSVFlfQkROQU1FLCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWUpLCByZW1vdGVfcHJvcGVydGllc1tudW1fcHJvcHNdKTsKLSAgICAgIG51bV9wcm9wcysrOwotCi0gICAgICBCVElGX1NUT1JBR0VfR0VUX1JFTU9URV9QUk9QKHBfcmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX1JFTU9URV9GUklFTkRMWV9OQU1FLCAmYWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhbGlhcyksIHJlbW90ZV9wcm9wZXJ0aWVzW251bV9wcm9wc10pOwotICAgICAgbnVtX3Byb3BzKys7Ci0KLSAgICAgIEJUSUZfU1RPUkFHRV9HRVRfUkVNT1RFX1BST1AocF9yZW1vdGVfYWRkciwgQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kLCBzaXplb2YoY29kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX3Byb3BlcnRpZXNbbnVtX3Byb3BzXSk7Ci0gICAgICBudW1fcHJvcHMrKzsKLQotICAgICAgQlRJRl9TVE9SQUdFX0dFVF9SRU1PVEVfUFJPUChwX3JlbW90ZV9hZGRyLCBCVF9QUk9QRVJUWV9UWVBFX09GX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldnR5cGUsIHNpemVvZihkZXZ0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX3Byb3BlcnRpZXNbbnVtX3Byb3BzXSk7Ci0gICAgICBudW1fcHJvcHMrKzsKLQotICAgICAgQlRJRl9TVE9SQUdFX0dFVF9SRU1PVEVfUFJPUChwX3JlbW90ZV9hZGRyLCBCVF9QUk9QRVJUWV9VVUlEUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX3V1aWRzLCBzaXplb2YocmVtb3RlX3V1aWRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX3Byb3BlcnRpZXNbbnVtX3Byb3BzXSk7Ci0gICAgICBudW1fcHJvcHMrKzsKLQotICAgICAgYnRpZl9yZW1vdGVfcHJvcGVydGllc19ldnQoQlRfU1RBVFVTX1NVQ0NFU1MsIHBfcmVtb3RlX2FkZHIsIG51bV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9wcm9wZXJ0aWVzKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2FkZF9ibGVfYm9uZGluZ19rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBBZGRzIHRoZSBuZXdseSBib25kZWQgZGV2aWNlIHRvIE5WUkFNCi0gKiAgICAgICAgICAgICAgICAgIGFsb25nIHdpdGggdGhlIGJsZS1rZXksIEtleSB0eXBlIGFuZCBQaW4ga2V5IGxlbmd0aAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIHN0b3JlIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2JsZV9ib25kaW5nX2tleShSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGgpIHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgc3dpdGNoIChrZXlfdHlwZSkgewotICAgIGNhc2UgQlRNX0xFX0tFWV9QRU5DOgotICAgICAgbmFtZSA9ICJMRV9LRVlfUEVOQyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9MRV9LRVlfUElEOgotICAgICAgbmFtZSA9ICJMRV9LRVlfUElEIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0xFX0tFWV9QQ1NSSzoKLSAgICAgIG5hbWUgPSAiTEVfS0VZX1BDU1JLIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0xFX0tFWV9MRU5DOgotICAgICAgbmFtZSA9ICJMRV9LRVlfTEVOQyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9MRV9LRVlfTENTUks6Ci0gICAgICBuYW1lID0gIkxFX0tFWV9MQ1NSSyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9MRV9LRVlfTElEOgotICAgICAgbmFtZSA9ICJMRV9LRVlfTElEIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgaW50IHJldCA9Ci0gICAgICBidGlmX2NvbmZpZ19zZXRfYmluKHJlbW90ZV9iZF9hZGRyLT5Ub1N0cmluZygpLCBuYW1lLCBrZXksIGtleV9sZW5ndGgpOwotICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiByZXQgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2dldF9ibGVfYm9uZGluZ19rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGZldGNoIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9ibGVfYm9uZGluZ19rZXkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW5ndGgpIHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgc3dpdGNoIChrZXlfdHlwZSkgewotICAgIGNhc2UgQlRNX0xFX0tFWV9QRU5DOgotICAgICAgbmFtZSA9ICJMRV9LRVlfUEVOQyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9MRV9LRVlfUElEOgotICAgICAgbmFtZSA9ICJMRV9LRVlfUElEIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0xFX0tFWV9QQ1NSSzoKLSAgICAgIG5hbWUgPSAiTEVfS0VZX1BDU1JLIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0xFX0tFWV9MRU5DOgotICAgICAgbmFtZSA9ICJMRV9LRVlfTEVOQyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9MRV9LRVlfTENTUks6Ci0gICAgICBuYW1lID0gIkxFX0tFWV9MQ1NSSyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9MRV9LRVlfTElEOgotICAgICAgbmFtZSA9ICJMRV9LRVlfTElEIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0KLSAgc2l6ZV90IGxlbmd0aCA9IGtleV9sZW5ndGg7Ci0gIGludCByZXQgPQotICAgICAgYnRpZl9jb25maWdfZ2V0X2JpbihyZW1vdGVfYmRfYWRkci5Ub1N0cmluZygpLCBuYW1lLCBrZXlfdmFsdWUsICZsZW5ndGgpOwotICByZXR1cm4gcmV0ID8gQlRfU1RBVFVTX1NVQ0NFU1MgOiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfYmxlX2tleXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBEZWxldGVzIHRoZSBib25kZWQgZGV2aWNlIGZyb20gTlZSQU0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9yZW1vdmVfYmxlX2JvbmRpbmdfa2V5cygKLSAgICBjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkcikgewotICBzdGQ6OnN0cmluZyBiZHN0ciA9IHJlbW90ZV9iZF9hZGRyLT5Ub1N0cmluZygpOwotICBMT0dfSU5GTygiUmVtb3ZpbmcgYm9uZGluZyBrZXlzIGZvciBiZCBhZGRyOiVzIiwgYmRzdHIuY19zdHIoKSk7Ci0gIGludCByZXQgPSAxOwotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsICJMRV9LRVlfUEVOQyIpKQotICAgIHJldCAmPSBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsICJMRV9LRVlfUEVOQyIpOwotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsICJMRV9LRVlfUElEIikpCi0gICAgcmV0ICY9IGJ0aWZfY29uZmlnX3JlbW92ZShiZHN0ciwgIkxFX0tFWV9QSUQiKTsKLSAgaWYgKGJ0aWZfY29uZmlnX2V4aXN0KGJkc3RyLCAiTEVfS0VZX1BDU1JLIikpCi0gICAgcmV0ICY9IGJ0aWZfY29uZmlnX3JlbW92ZShiZHN0ciwgIkxFX0tFWV9QQ1NSSyIpOwotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsICJMRV9LRVlfTEVOQyIpKQotICAgIHJldCAmPSBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsICJMRV9LRVlfTEVOQyIpOwotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsICJMRV9LRVlfTENTUksiKSkKLSAgICByZXQgJj0gYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiTEVfS0VZX0xDU1JLIik7Ci0gIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgcmV0dXJuIHJldCA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfYWRkX2JsZV9sb2NhbF9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBBZGRzIHRoZSBibGUga2V5IHRvIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2JsZV9sb2NhbF9rZXkoY29uc3QgT2N0ZXQxNiYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUpIHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgc3dpdGNoIChrZXlfdHlwZSkgewotICAgIGNhc2UgQlRJRl9ETV9MRV9MT0NBTF9LRVlfSVI6Ci0gICAgICBuYW1lID0gIkxFX0xPQ0FMX0tFWV9JUiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0lSSzoKLSAgICAgIG5hbWUgPSAiTEVfTE9DQUxfS0VZX0lSSyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0RISzoKLSAgICAgIG5hbWUgPSAiTEVfTE9DQUxfS0VZX0RISyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSUZfRE1fTEVfTE9DQUxfS0VZX0VSOgotICAgICAgbmFtZSA9ICJMRV9MT0NBTF9LRVlfRVIiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICBpbnQgcmV0ID0gYnRpZl9jb25maWdfc2V0X2JpbigiQWRhcHRlciIsIG5hbWUsIGtleS5kYXRhKCksIGtleS5zaXplKCkpOwotICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiByZXQgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi0vKiogU3RvcmVzIGxvY2FsIGtleSBvZiB8a2V5X3R5cGV8IGludG8gfGtleV92YWx1ZXwKLSAqIFJldHVybnMgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGZldGNoIHdhcyBzdWNjZXNzZnVsLCBCVF9TVEFUVVNfRkFJTAotICogb3RoZXJ3aXNlCi0gKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9nZXRfYmxlX2xvY2FsX2tleSh1aW50OF90IGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIGtleV92YWx1ZSkgewotICBjb25zdCBjaGFyKiBuYW1lOwotICBzd2l0Y2ggKGtleV90eXBlKSB7Ci0gICAgY2FzZSBCVElGX0RNX0xFX0xPQ0FMX0tFWV9JUjoKLSAgICAgIG5hbWUgPSAiTEVfTE9DQUxfS0VZX0lSIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9ETV9MRV9MT0NBTF9LRVlfSVJLOgotICAgICAgbmFtZSA9ICJMRV9MT0NBTF9LRVlfSVJLIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9ETV9MRV9MT0NBTF9LRVlfREhLOgotICAgICAgbmFtZSA9ICJMRV9MT0NBTF9LRVlfREhLIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9ETV9MRV9MT0NBTF9LRVlfRVI6Ci0gICAgICBuYW1lID0gIkxFX0xPQ0FMX0tFWV9FUiI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIHNpemVfdCBsZW5ndGggPSBrZXlfdmFsdWUtPnNpemUoKTsKLSAgaW50IHJldCA9IGJ0aWZfY29uZmlnX2dldF9iaW4oIkFkYXB0ZXIiLCBuYW1lLCBrZXlfdmFsdWUtPmRhdGEoKSwgJmxlbmd0aCk7Ci0gIHJldHVybiByZXQgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3JlbW92ZV9ibGVfbG9jYWxfa2V5cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIERlbGV0ZXMgdGhlIGJvbmRlZCBkZXZpY2UgZnJvbSBOVlJBTQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9ibGVfbG9jYWxfa2V5cyh2b2lkKSB7Ci0gIGludCByZXQgPSAxOwotICBpZiAoYnRpZl9jb25maWdfZXhpc3QoIkFkYXB0ZXIiLCAiTEVfTE9DQUxfS0VZX0lSIikpCi0gICAgcmV0ICY9IGJ0aWZfY29uZmlnX3JlbW92ZSgiQWRhcHRlciIsICJMRV9MT0NBTF9LRVlfSVIiKTsKLSAgaWYgKGJ0aWZfY29uZmlnX2V4aXN0KCJBZGFwdGVyIiwgIkxFX0xPQ0FMX0tFWV9JUksiKSkKLSAgICByZXQgJj0gYnRpZl9jb25maWdfcmVtb3ZlKCJBZGFwdGVyIiwgIkxFX0xPQ0FMX0tFWV9JUksiKTsKLSAgaWYgKGJ0aWZfY29uZmlnX2V4aXN0KCJBZGFwdGVyIiwgIkxFX0xPQ0FMX0tFWV9ESEsiKSkKLSAgICByZXQgJj0gYnRpZl9jb25maWdfcmVtb3ZlKCJBZGFwdGVyIiwgIkxFX0xPQ0FMX0tFWV9ESEsiKTsKLSAgaWYgKGJ0aWZfY29uZmlnX2V4aXN0KCJBZGFwdGVyIiwgIkxFX0xPQ0FMX0tFWV9FUiIpKQotICAgIHJldCAmPSBidGlmX2NvbmZpZ19yZW1vdmUoIkFkYXB0ZXIiLCAiTEVfTE9DQUxfS0VZX0VSIik7Ci0gIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgcmV0dXJuIHJldCA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBidGlmX2luX2ZldGNoX2JvbmRlZF9ibGVfZGV2aWNlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZW1vdGVfYmRfYWRkciwgaW50IGFkZCwKLSAgICBidGlmX2JvbmRlZF9kZXZpY2VzX3QqIHBfYm9uZGVkX2RldmljZXMpIHsKLSAgaW50IGRldmljZV90eXBlOwotICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGU7Ci0gIGJvb2wgZGV2aWNlX2FkZGVkID0gZmFsc2U7Ci0gIGJvb2wga2V5X2ZvdW5kID0gZmFsc2U7Ci0KLSAgaWYgKCFidGlmX2NvbmZpZ19nZXRfaW50KHJlbW90ZV9iZF9hZGRyLCAiRGV2VHlwZSIsICZkZXZpY2VfdHlwZSkpCi0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIGlmICgoZGV2aWNlX3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CTEUpID09IEJUX0RFVklDRV9UWVBFX0JMRSB8fAotICAgICAgYnRpZl9oYXNfYmxlX2tleXMocmVtb3RlX2JkX2FkZHIpKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgRm91bmQgYSBMRSBkZXZpY2U6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICByZW1vdGVfYmRfYWRkci5jX3N0cigpKTsKLQotICAgIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKHJlbW90ZV9iZF9hZGRyLCBiZF9hZGRyKTsKLQotICAgIGlmIChidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9hZGRyX3R5cGUoJmJkX2FkZHIsICZhZGRyX3R5cGUpICE9Ci0gICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBhZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gICAgICBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9hZGRyX3R5cGUoJmJkX2FkZHIsIEJMRV9BRERSX1BVQkxJQyk7Ci0gICAgfQotCi0gICAgYnRpZl9yZWFkX2xlX2tleShCVE1fTEVfS0VZX1BFTkMsIHNpemVvZih0QlRNX0xFX1BFTkNfS0VZUyksIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBhZGRyX3R5cGUsIGFkZCwgJmRldmljZV9hZGRlZCwgJmtleV9mb3VuZCk7Ci0KLSAgICBidGlmX3JlYWRfbGVfa2V5KEJUTV9MRV9LRVlfUElELCBzaXplb2YodEJUTV9MRV9QSURfS0VZUyksIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBhZGRyX3R5cGUsIGFkZCwgJmRldmljZV9hZGRlZCwgJmtleV9mb3VuZCk7Ci0KLSAgICBidGlmX3JlYWRfbGVfa2V5KEJUTV9MRV9LRVlfTElELCBzaXplb2YodEJUTV9MRV9QSURfS0VZUyksIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBhZGRyX3R5cGUsIGFkZCwgJmRldmljZV9hZGRlZCwgJmtleV9mb3VuZCk7Ci0KLSAgICBidGlmX3JlYWRfbGVfa2V5KEJUTV9MRV9LRVlfUENTUkssIHNpemVvZih0QlRNX0xFX1BDU1JLX0tFWVMpLCBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgYWRkcl90eXBlLCBhZGQsICZkZXZpY2VfYWRkZWQsICZrZXlfZm91bmQpOwotCi0gICAgYnRpZl9yZWFkX2xlX2tleShCVE1fTEVfS0VZX0xFTkMsIHNpemVvZih0QlRNX0xFX0xFTkNfS0VZUyksIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBhZGRyX3R5cGUsIGFkZCwgJmRldmljZV9hZGRlZCwgJmtleV9mb3VuZCk7Ci0KLSAgICBidGlmX3JlYWRfbGVfa2V5KEJUTV9MRV9LRVlfTENTUkssIHNpemVvZih0QlRNX0xFX0xDU1JLX0tFWVMpLCBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgYWRkcl90eXBlLCBhZGQsICZkZXZpY2VfYWRkZWQsICZrZXlfZm91bmQpOwotCi0gICAgLy8gRmlsbCBpbiB0aGUgYm9uZGVkIGRldmljZXMKLSAgICBpZiAoZGV2aWNlX2FkZGVkKSB7Ci0gICAgICBwX2JvbmRlZF9kZXZpY2VzLT5kZXZpY2VzW3BfYm9uZGVkX2RldmljZXMtPm51bV9kZXZpY2VzKytdID0gYmRfYWRkcjsKLSAgICAgIGJ0aWZfZ2F0dHNfYWRkX2JvbmRlZF9kZXZfZnJvbV9udihiZF9hZGRyKTsKLSAgICB9Ci0KLSAgICBpZiAoa2V5X2ZvdW5kKSByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotfQotCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9hZGRyX3R5cGUoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlKSB7Ci0gIGludCByZXQgPSBidGlmX2NvbmZpZ19zZXRfaW50KHJlbW90ZV9iZF9hZGRyLT5Ub1N0cmluZygpLCAiQWRkclR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWFkZHJfdHlwZSk7Ci0gIHJldHVybiByZXQgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2FkZHJfdHlwZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCTEVfQUREUl9UWVBFJiBhZGRyX3R5cGUpIHsKLSAgaWYgKCFidGlmX2NvbmZpZ19zZXRfaW50KHJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCksICJBZGRyVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFkZHJfdHlwZSkpKQotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHNldCBzdG9yYWdlIHByb3BlcnR5Iik7Ci19Ci0KLXZvaWQgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3R5cGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVF9ERVZJQ0VfVFlQRSYgZGV2aWNlX3R5cGUpIHsKLSAgaWYgKCFidGlmX2NvbmZpZ19zZXRfaW50KHJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCksICJEZXZUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZGV2aWNlX3R5cGUpKSkKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBzZXQgc3RvcmFnZSBwcm9wZXJ0eSIpOwotfQotCi1ib29sIGJ0aWZfaGFzX2JsZV9rZXlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBiZHN0cikgewotICByZXR1cm4gYnRpZl9jb25maWdfZXhpc3QoYmRzdHIsICJMRV9LRVlfUEVOQyIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfYWRkcl90eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCVElGIHN0b3JhZ2UgQVBJIC0gRmV0Y2hlcyB0aGUgcmVtb3RlIGFkZHIgdHlwZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGZldGNoIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfYWRkcl90eXBlKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBhZGRyX3R5cGUpIHsKLSAgaW50IHZhbDsKLSAgaW50IHJldCA9IGJ0aWZfY29uZmlnX2dldF9pbnQocmVtb3RlX2JkX2FkZHItPlRvU3RyaW5nKCksICJBZGRyVHlwZSIsICZ2YWwpOwotICAqYWRkcl90eXBlID0gc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KHZhbCk7Ci0gIHJldHVybiByZXQgPyBCVF9TVEFUVVNfU1VDQ0VTUyA6IEJUX1NUQVRVU19GQUlMOwotfQotCi1ib29sIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2FkZHJfdHlwZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFJiBhZGRyX3R5cGUpIHsKLSAgaW50IHZhbDsKLSAgY29uc3QgaW50IHJldCA9Ci0gICAgICBidGlmX2NvbmZpZ19nZXRfaW50KHJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCksICJBZGRyVHlwZSIsICZ2YWwpOwotICBhZGRyX3R5cGUgPSBzdGF0aWNfY2FzdDx0QkxFX0FERFJfVFlQRT4odmFsKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotYm9vbCBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfdHlwZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFJiBkZXZpY2VfdHlwZSkgewotICBpbnQgdmFsOwotICBjb25zdCBib29sIHJldCA9Ci0gICAgICBidGlmX2NvbmZpZ19nZXRfaW50KHJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCksICJEZXZUeXBlIiwgJnZhbCk7Ci0gIGRldmljZV90eXBlID0gc3RhdGljX2Nhc3Q8dEJUX0RFVklDRV9UWVBFPih2YWwpOwotICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2FkZF9oaWRfZGV2aWNlX2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBBZGRzIHRoZSBoaWQgaW5mb3JtYXRpb24gb2YgYm9uZGVkIGhpZAotICogICAgICAgICAgICAgICAgICBkZXZpY2VzLXRvIE5WUkFNCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyBpZiB0aGUgc3RvcmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9hZGRfaGlkX2RldmljZV9pbmZvKAotICAgIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCB1aW50MTZfdCBhdHRyX21hc2ssIHVpbnQ4X3Qgc3ViX2NsYXNzLAotICAgIHVpbnQ4X3QgYXBwX2lkLCB1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IHByb2R1Y3RfaWQsIHVpbnQxNl90IHZlcnNpb24sCi0gICAgdWludDhfdCBjdHJ5X2NvZGUsIHVpbnQxNl90IHNzcl9tYXhfbGF0ZW5jeSwgdWludDE2X3Qgc3NyX21pbl90b3V0LAotICAgIHVpbnQxNl90IGRsX2xlbiwgdWludDhfdCogZHNjX2xpc3QpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiYnRpZl9zdG9yYWdlX2FkZF9oaWRfZGV2aWNlX2luZm86Iik7Ci0gIHN0ZDo6c3RyaW5nIGJkc3RyID0gcmVtb3RlX2JkX2FkZHItPlRvU3RyaW5nKCk7Ci0gIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJIaWRBdHRyTWFzayIsIGF0dHJfbWFzayk7Ci0gIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJIaWRTdWJDbGFzcyIsIHN1Yl9jbGFzcyk7Ci0gIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJIaWRBcHBJZCIsIGFwcF9pZCk7Ci0gIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJIaWRWZW5kb3JJZCIsIHZlbmRvcl9pZCk7Ci0gIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsICJIaWRQcm9kdWN0SWQiLCBwcm9kdWN0X2lkKTsKLSAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgIkhpZFZlcnNpb24iLCB2ZXJzaW9uKTsKLSAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgIkhpZENvdW50cnlDb2RlIiwgY3RyeV9jb2RlKTsKLSAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgIkhpZFNTUk1heExhdGVuY3kiLCBzc3JfbWF4X2xhdGVuY3kpOwotICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCAiSGlkU1NSTWluVGltZW91dCIsIHNzcl9taW5fdG91dCk7Ci0gIGlmIChkbF9sZW4gPiAwKSBidGlmX2NvbmZpZ19zZXRfYmluKGJkc3RyLCAiSGlkRGVzY3JpcHRvciIsIGRzY19saXN0LCBkbF9sZW4pOwotICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9oaWRfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIExvYWRzIGhpZCBpbmZvIGZvciBhbGwgdGhlIGJvbmRlZCBkZXZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gTlZSQU0gYW5kIGFkZHMgdGhvc2UgZGV2aWNlcyAgdG8gdGhlIEJUQV9ISC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIEJUX1NUQVRVU19GQUlMIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfaGlkX2luZm8odm9pZCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGJkX2FkZHIgOiBidGlmX2NvbmZpZ19nZXRfcGFpcmVkX2RldmljZXMoKSkgewotICAgIGF1dG8gbmFtZSA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIlJlbW90ZSBkZXZpY2U6JXMiLCBuYW1lLmNfc3RyKCkpOwotCi0gICAgaW50IHZhbHVlOwotICAgIGlmICghYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCAiSGlkQXR0ck1hc2siLCAmdmFsdWUpKSBjb250aW51ZTsKLSAgICB1aW50MTZfdCBhdHRyX21hc2sgPSAodWludDE2X3QpdmFsdWU7Ci0KLSAgICBpZiAoYnRpZl9pbl9mZXRjaF9ib25kZWRfZGV2aWNlKG5hbWUpICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBidGlmX3N0b3JhZ2VfcmVtb3ZlX2hpZF9pbmZvKGJkX2FkZHIpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgdEJUQV9ISF9ERVZfRFNDUF9JTkZPIGRzY3BfaW5mbzsKLSAgICBtZW1zZXQoJmRzY3BfaW5mbywgMCwgc2l6ZW9mKGRzY3BfaW5mbykpOwotCi0gICAgYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCAiSGlkU3ViQ2xhc3MiLCAmdmFsdWUpOwotICAgIHVpbnQ4X3Qgc3ViX2NsYXNzID0gKHVpbnQ4X3QpdmFsdWU7Ci0KLSAgICBidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsICJIaWRBcHBJZCIsICZ2YWx1ZSk7Ci0gICAgdWludDhfdCBhcHBfaWQgPSAodWludDhfdCl2YWx1ZTsKLQotICAgIGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgIkhpZFZlbmRvcklkIiwgJnZhbHVlKTsKLSAgICBkc2NwX2luZm8udmVuZG9yX2lkID0gKHVpbnQxNl90KXZhbHVlOwotCi0gICAgYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCAiSGlkUHJvZHVjdElkIiwgJnZhbHVlKTsKLSAgICBkc2NwX2luZm8ucHJvZHVjdF9pZCA9ICh1aW50MTZfdCl2YWx1ZTsKLQotICAgIGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgIkhpZFZlcnNpb24iLCAmdmFsdWUpOwotICAgIGRzY3BfaW5mby52ZXJzaW9uID0gKHVpbnQ4X3QpdmFsdWU7Ci0KLSAgICBidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsICJIaWRDb3VudHJ5Q29kZSIsICZ2YWx1ZSk7Ci0gICAgZHNjcF9pbmZvLmN0cnlfY29kZSA9ICh1aW50OF90KXZhbHVlOwotCi0gICAgdmFsdWUgPSAwOwotICAgIGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgIkhpZFNTUk1heExhdGVuY3kiLCAmdmFsdWUpOwotICAgIGRzY3BfaW5mby5zc3JfbWF4X2xhdGVuY3kgPSAodWludDE2X3QpdmFsdWU7Ci0KLSAgICB2YWx1ZSA9IDA7Ci0gICAgYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCAiSGlkU1NSTWluVGltZW91dCIsICZ2YWx1ZSk7Ci0gICAgZHNjcF9pbmZvLnNzcl9taW5fdG91dCA9ICh1aW50MTZfdCl2YWx1ZTsKLQotICAgIHNpemVfdCBsZW4gPSBidGlmX2NvbmZpZ19nZXRfYmluX2xlbmd0aChuYW1lLCAiSGlkRGVzY3JpcHRvciIpOwotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICBkc2NwX2luZm8uZGVzY3JpcHRvci5kbF9sZW4gPSAodWludDE2X3QpbGVuOwotICAgICAgZHNjcF9pbmZvLmRlc2NyaXB0b3IuZHNjX2xpc3QgPSAodWludDhfdCopYWxsb2NhKGxlbik7Ci0gICAgICBidGlmX2NvbmZpZ19nZXRfYmluKG5hbWUsICJIaWREZXNjcmlwdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRzY3BfaW5mby5kZXNjcmlwdG9yLmRzY19saXN0LCAmbGVuKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgZXh0cmFjdGVkIGluZm9ybWF0aW9uIHRvIEJUQSBISAotICAgIGlmIChidGlmX2hoX2FkZF9hZGRlZF9kZXYoYmRfYWRkciwgYXR0cl9tYXNrKSkgewotICAgICAgQlRBX0hoQWRkRGV2KGJkX2FkZHIsIGF0dHJfbWFzaywgc3ViX2NsYXNzLCBhcHBfaWQsIGRzY3BfaW5mbyk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRfaW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQlRJRiBzdG9yYWdlIEFQSSAtIERlbGV0ZXMgdGhlIGJvbmRlZCBoaWQgZGV2aWNlIGluZm8gZnJvbQotICogICAgICAgICAgICAgICAgICBOVlJBTQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkcikgewotICBzdGQ6OnN0cmluZyBiZHN0ciA9IHJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCk7Ci0KLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkQXR0ck1hc2siKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkU3ViQ2xhc3MiKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkQXBwSWQiKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkVmVuZG9ySWQiKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkUHJvZHVjdElkIik7Ci0gIGJ0aWZfY29uZmlnX3JlbW92ZShiZHN0ciwgIkhpZFZlcnNpb24iKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkQ291bnRyeUNvZGUiKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGJkc3RyLCAiSGlkU1NSTWF4TGF0ZW5jeSIpOwotICBidGlmX2NvbmZpZ19yZW1vdmUoYmRzdHIsICJIaWRTU1JNaW5UaW1lb3V0Iik7Ci0gIGJ0aWZfY29uZmlnX3JlbW92ZShiZHN0ciwgIkhpZERlc2NyaXB0b3IiKTsKLSAgYnRpZl9jb25maWdfc2F2ZSgpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWNvbnN0ZXhwciBjaGFyIEhFQVJJTkdfQUlEX1JFQURfUFNNX0hBTkRMRVtdID0gIkhlYXJpbmdBaWRSZWFkUHNtSGFuZGxlIjsKLWNvbnN0ZXhwciBjaGFyIEhFQVJJTkdfQUlEX0NBUEFCSUxJVElFU1tdID0gIkhlYXJpbmdBaWRDYXBhYmlsaXRpZXMiOwotY29uc3RleHByIGNoYXIgSEVBUklOR19BSURfQ09ERUNTW10gPSAiSGVhcmluZ0FpZENvZGVjcyI7Ci1jb25zdGV4cHIgY2hhciBIRUFSSU5HX0FJRF9BVURJT19DT05UUk9MX1BPSU5UW10gPQotICAgICJIZWFyaW5nQWlkQXVkaW9Db250cm9sUG9pbnQiOwotY29uc3RleHByIGNoYXIgSEVBUklOR19BSURfVk9MVU1FX0hBTkRMRVtdID0gIkhlYXJpbmdBaWRWb2x1bWVIYW5kbGUiOwotY29uc3RleHByIGNoYXIgSEVBUklOR19BSURfQVVESU9fU1RBVFVTX0hBTkRMRVtdID0KLSAgICAiSGVhcmluZ0FpZEF1ZGlvU3RhdHVzSGFuZGxlIjsKLWNvbnN0ZXhwciBjaGFyIEhFQVJJTkdfQUlEX0FVRElPX1NUQVRVU19DQ0NfSEFORExFW10gPQotICAgICJIZWFyaW5nQWlkQXVkaW9TdGF0dXNDY2NIYW5kbGUiOwotY29uc3RleHByIGNoYXIgSEVBUklOR19BSURfU0VSVklDRV9DSEFOR0VEX0NDQ19IQU5ETEVbXSA9Ci0gICAgIkhlYXJpbmdBaWRTZXJ2aWNlQ2hhbmdlZENjY0hhbmRsZSI7Ci1jb25zdGV4cHIgY2hhciBIRUFSSU5HX0FJRF9TWU5DX0lEW10gPSAiSGVhcmluZ0FpZFN5bmNJZCI7Ci1jb25zdGV4cHIgY2hhciBIRUFSSU5HX0FJRF9SRU5ERVJfREVMQVlbXSA9ICJIZWFyaW5nQWlkUmVuZGVyRGVsYXkiOwotY29uc3RleHByIGNoYXIgSEVBUklOR19BSURfUFJFUEFSQVRJT05fREVMQVlbXSA9ICJIZWFyaW5nQWlkUHJlcGFyYXRpb25EZWxheSI7Ci1jb25zdGV4cHIgY2hhciBIRUFSSU5HX0FJRF9JU19BQ0NFUFRMSVNURURbXSA9ICJIZWFyaW5nQWlkSXNBY2NlcHRsaXN0ZWQiOwotCi12b2lkIGJ0aWZfc3RvcmFnZV9hZGRfaGVhcmluZ19haWQoY29uc3QgSGVhcmluZ0RldmljZSYgZGV2X2luZm8pIHsKLSAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIEJpbmQoCi0gICAgICAgICAgW10oY29uc3QgSGVhcmluZ0RldmljZSYgZGV2X2luZm8pIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJkc3RyID0gZGV2X2luZm8uYWRkcmVzcy5Ub1N0cmluZygpOwotICAgICAgICAgICAgVkxPRygyKSA8PCAic2F2aW5nIGhlYXJpbmcgYWlkIGRldmljZTogIiA8PCBiZHN0cjsKLSAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsIEhFQVJJTkdfQUlEX1NFUlZJQ0VfQ0hBTkdFRF9DQ0NfSEFORExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby5zZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZSk7Ci0gICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBIRUFSSU5HX0FJRF9SRUFEX1BTTV9IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLnJlYWRfcHNtX2hhbmRsZSk7Ci0gICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBIRUFSSU5HX0FJRF9DQVBBQklMSVRJRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLmNhcGFiaWxpdGllcyk7Ci0gICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBIRUFSSU5HX0FJRF9DT0RFQ1MsIGRldl9pbmZvLmNvZGVjcyk7Ci0gICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBIRUFSSU5HX0FJRF9BVURJT19DT05UUk9MX1BPSU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby5hdWRpb19jb250cm9sX3BvaW50X2hhbmRsZSk7Ci0gICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkc3RyLCBIRUFSSU5HX0FJRF9WT0xVTUVfSEFORExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby52b2x1bWVfaGFuZGxlKTsKLSAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsIEhFQVJJTkdfQUlEX0FVRElPX1NUQVRVU19IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLmF1ZGlvX3N0YXR1c19oYW5kbGUpOwotICAgICAgICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgSEVBUklOR19BSURfQVVESU9fU1RBVFVTX0NDQ19IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLmF1ZGlvX3N0YXR1c19jY2NfaGFuZGxlKTsKLSAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF91aW50NjQoYmRzdHIsIEhFQVJJTkdfQUlEX1NZTkNfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLmhpX3N5bmNfaWQpOwotICAgICAgICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgSEVBUklOR19BSURfUkVOREVSX0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby5yZW5kZXJfZGVsYXkpOwotICAgICAgICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZHN0ciwgSEVBUklOR19BSURfUFJFUEFSQVRJT05fREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLnByZXBhcmF0aW9uX2RlbGF5KTsKLSAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRzdHIsIEhFQVJJTkdfQUlEX0lTX0FDQ0VQVExJU1RFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBkZXZfaW5mbykpOwotfQotCi0vKiogTG9hZHMgaW5mb3JtYXRpb24gYWJvdXQgYm9uZGVkIGhlYXJpbmcgYWlkIGRldmljZXMgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2hlYXJpbmdfYWlkcygpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBiZF9hZGRyIDogYnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzKCkpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLQotICAgIGludCBzaXplID0gU1RPUkFHRV9VVUlEX1NUUklOR19TSVpFICogSEVBUklOR0FJRF9NQVhfTlVNX1VVSURTOwotICAgIGNoYXIgdXVpZF9zdHJbc2l6ZV07Ci0gICAgYm9vbCBpc0hlYXJpbmdhaWREZXZpY2UgPSBmYWxzZTsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X3N0cihuYW1lLCBCVElGX1NUT1JBR0VfUEFUSF9SRU1PVEVfU0VSVklDRSwgdXVpZF9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKSB7Ci0gICAgICBVdWlkIHBfdXVpZFtIRUFSSU5HQUlEX01BWF9OVU1fVVVJRFNdOwotICAgICAgc2l6ZV90IG51bV91dWlkcyA9Ci0gICAgICAgICAgYnRpZl9zcGxpdF91dWlkc19zdHJpbmcodXVpZF9zdHIsIHBfdXVpZCwgSEVBUklOR0FJRF9NQVhfTlVNX1VVSURTKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX3V1aWRzOyBpKyspIHsKLSAgICAgICAgaWYgKHBfdXVpZFtpXSA9PSBVdWlkOjpGcm9tU3RyaW5nKCJGREYwIikpIHsKLSAgICAgICAgICBpc0hlYXJpbmdhaWREZXZpY2UgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaXNIZWFyaW5nYWlkRGV2aWNlKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBCVElGX1RSQUNFX0RFQlVHKCJSZW1vdGUgZGV2aWNlOiVzIiwgbmFtZS5jX3N0cigpKTsKLQotICAgIGlmIChidGlmX2luX2ZldGNoX2JvbmRlZF9kZXZpY2UobmFtZSkgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfaGVhcmluZ19haWQoYmRfYWRkcik7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpbnQgdmFsdWU7Ci0gICAgdWludDhfdCBjYXBhYmlsaXRpZXMgPSAwOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsIEhFQVJJTkdfQUlEX0NBUEFCSUxJVElFUywgJnZhbHVlKSkKLSAgICAgIGNhcGFiaWxpdGllcyA9IHZhbHVlOwotCi0gICAgdWludDE2X3QgY29kZWNzID0gMDsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCBIRUFSSU5HX0FJRF9DT0RFQ1MsICZ2YWx1ZSkpIGNvZGVjcyA9IHZhbHVlOwotCi0gICAgdWludDE2X3QgYXVkaW9fY29udHJvbF9wb2ludF9oYW5kbGUgPSAwOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsIEhFQVJJTkdfQUlEX0FVRElPX0NPTlRST0xfUE9JTlQsICZ2YWx1ZSkpCi0gICAgICBhdWRpb19jb250cm9sX3BvaW50X2hhbmRsZSA9IHZhbHVlOwotCi0gICAgdWludDE2X3QgYXVkaW9fc3RhdHVzX2hhbmRsZSA9IDA7Ci0gICAgaWYgKGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgSEVBUklOR19BSURfQVVESU9fU1RBVFVTX0hBTkRMRSwgJnZhbHVlKSkKLSAgICAgIGF1ZGlvX3N0YXR1c19oYW5kbGUgPSB2YWx1ZTsKLQotICAgIHVpbnQxNl90IGF1ZGlvX3N0YXR1c19jY2NfaGFuZGxlID0gMDsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCBIRUFSSU5HX0FJRF9BVURJT19TVEFUVVNfQ0NDX0hBTkRMRSwgJnZhbHVlKSkKLSAgICAgIGF1ZGlvX3N0YXR1c19jY2NfaGFuZGxlID0gdmFsdWU7Ci0KLSAgICB1aW50MTZfdCBzZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZSA9IDA7Ci0gICAgaWYgKGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgSEVBUklOR19BSURfU0VSVklDRV9DSEFOR0VEX0NDQ19IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLSAgICAgIHNlcnZpY2VfY2hhbmdlZF9jY2NfaGFuZGxlID0gdmFsdWU7Ci0KLSAgICB1aW50MTZfdCB2b2x1bWVfaGFuZGxlID0gMDsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCBIRUFSSU5HX0FJRF9WT0xVTUVfSEFORExFLCAmdmFsdWUpKQotICAgICAgdm9sdW1lX2hhbmRsZSA9IHZhbHVlOwotCi0gICAgdWludDE2X3QgcmVhZF9wc21faGFuZGxlID0gMDsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCBIRUFSSU5HX0FJRF9SRUFEX1BTTV9IQU5ETEUsICZ2YWx1ZSkpCi0gICAgICByZWFkX3BzbV9oYW5kbGUgPSB2YWx1ZTsKLQotICAgIHVpbnQ2NF90IGx2YWx1ZTsKLSAgICB1aW50NjRfdCBoaV9zeW5jX2lkID0gMDsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X3VpbnQ2NChuYW1lLCBIRUFSSU5HX0FJRF9TWU5DX0lELCAmbHZhbHVlKSkKLSAgICAgIGhpX3N5bmNfaWQgPSBsdmFsdWU7Ci0KLSAgICB1aW50MTZfdCByZW5kZXJfZGVsYXkgPSAwOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsIEhFQVJJTkdfQUlEX1JFTkRFUl9ERUxBWSwgJnZhbHVlKSkKLSAgICAgIHJlbmRlcl9kZWxheSA9IHZhbHVlOwotCi0gICAgdWludDE2X3QgcHJlcGFyYXRpb25fZGVsYXkgPSAwOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsIEhFQVJJTkdfQUlEX1BSRVBBUkFUSU9OX0RFTEFZLCAmdmFsdWUpKQotICAgICAgcHJlcGFyYXRpb25fZGVsYXkgPSB2YWx1ZTsKLQotICAgIHVpbnQxNl90IGlzX2FjY2VwdGxpc3RlZCA9IDA7Ci0gICAgaWYgKGJ0aWZfY29uZmlnX2dldF9pbnQobmFtZSwgSEVBUklOR19BSURfSVNfQUNDRVBUTElTVEVELCAmdmFsdWUpKQotICAgICAgaXNfYWNjZXB0bGlzdGVkID0gdmFsdWU7Ci0KLSAgICAvLyBhZGQgZXh0cmFjdGVkIGluZm9ybWF0aW9uIHRvIEJUQSBIZWFyaW5nIEFpZAotICAgIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIEJpbmQoJkhlYXJpbmdBaWQ6OkFkZEZyb21TdG9yYWdlLAotICAgICAgICAgICAgIEhlYXJpbmdEZXZpY2UoYmRfYWRkciwgY2FwYWJpbGl0aWVzLCBjb2RlY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb250cm9sX3BvaW50X2hhbmRsZSwgYXVkaW9fc3RhdHVzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0YXR1c19jY2NfaGFuZGxlLCBzZXJ2aWNlX2NoYW5nZWRfY2NjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9oYW5kbGUsIHJlYWRfcHNtX2hhbmRsZSwgaGlfc3luY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9kZWxheSwgcHJlcGFyYXRpb25fZGVsYXkpLAotICAgICAgICAgICAgIGlzX2FjY2VwdGxpc3RlZCkpOwotICB9Ci19Ci0KLS8qKiBEZWxldGVzIHRoZSBib25kZWQgaGVhcmluZyBhaWQgZGV2aWNlIGluZm8gZnJvbSBOVlJBTSAqLwotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2hlYXJpbmdfYWlkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGFkZHJlc3MuVG9TdHJpbmcoKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX1JFQURfUFNNX0hBTkRMRSk7Ci0gIGJ0aWZfY29uZmlnX3JlbW92ZShhZGRyc3RyLCBIRUFSSU5HX0FJRF9DQVBBQklMSVRJRVMpOwotICBidGlmX2NvbmZpZ19yZW1vdmUoYWRkcnN0ciwgSEVBUklOR19BSURfQ09ERUNTKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX0FVRElPX0NPTlRST0xfUE9JTlQpOwotICBidGlmX2NvbmZpZ19yZW1vdmUoYWRkcnN0ciwgSEVBUklOR19BSURfVk9MVU1FX0hBTkRMRSk7Ci0gIGJ0aWZfY29uZmlnX3JlbW92ZShhZGRyc3RyLCBIRUFSSU5HX0FJRF9BVURJT19TVEFUVVNfSEFORExFKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX0FVRElPX1NUQVRVU19DQ0NfSEFORExFKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX1NFUlZJQ0VfQ0hBTkdFRF9DQ0NfSEFORExFKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX1NZTkNfSUQpOwotICBidGlmX2NvbmZpZ19yZW1vdmUoYWRkcnN0ciwgSEVBUklOR19BSURfUkVOREVSX0RFTEFZKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX1BSRVBBUkFUSU9OX0RFTEFZKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEhFQVJJTkdfQUlEX0lTX0FDQ0VQVExJU1RFRCk7Ci0gIGJ0aWZfY29uZmlnX3NhdmUoKTsKLX0KLQotLyoqIFNldC9VbnNldCB0aGUgaGVhcmluZyBhaWQgZGV2aWNlIEhFQVJJTkdfQUlEX0lTX0FDQ0VQVExJU1RFRCBmbGFnLiAqLwotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X2hlYXJpbmdfYWlkX2FjY2VwdGxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkX3RvX2FjY2VwdGxpc3QpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGFkZHJlc3MuVG9TdHJpbmcoKTsKLQotICBidGlmX2NvbmZpZ19zZXRfaW50KGFkZHJzdHIsIEhFQVJJTkdfQUlEX0lTX0FDQ0VQVExJU1RFRCwgYWRkX3RvX2FjY2VwdGxpc3QpOwotICBidGlmX2NvbmZpZ19zYXZlKCk7Ci19Ci0KLS8qKiBHZXQgdGhlIGhlYXJpbmcgYWlkIGRldmljZSBwcm9wZXJ0aWVzLiAqLwotYm9vbCBidGlmX3N0b3JhZ2VfZ2V0X2hlYXJpbmdfYWlkX3Byb3AoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCogY2FwYWJpbGl0aWVzLCB1aW50NjRfdCogaGlfc3luY19pZCwKLSAgICB1aW50MTZfdCogcmVuZGVyX2RlbGF5LCB1aW50MTZfdCogcHJlcGFyYXRpb25fZGVsYXksIHVpbnQxNl90KiBjb2RlY3MpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGFkZHJlc3MuVG9TdHJpbmcoKTsKLQotICBpbnQgdmFsdWU7Ci0gIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KGFkZHJzdHIsIEhFQVJJTkdfQUlEX0NBUEFCSUxJVElFUywgJnZhbHVlKSkgewotICAgICpjYXBhYmlsaXRpZXMgPSB2YWx1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChhZGRyc3RyLCBIRUFSSU5HX0FJRF9DT0RFQ1MsICZ2YWx1ZSkpIHsKLSAgICAqY29kZWNzID0gdmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJ0aWZfY29uZmlnX2dldF9pbnQoYWRkcnN0ciwgSEVBUklOR19BSURfUkVOREVSX0RFTEFZLCAmdmFsdWUpKSB7Ci0gICAgKnJlbmRlcl9kZWxheSA9IHZhbHVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KGFkZHJzdHIsIEhFQVJJTkdfQUlEX1BSRVBBUkFUSU9OX0RFTEFZLCAmdmFsdWUpKSB7Ci0gICAgKnByZXBhcmF0aW9uX2RlbGF5ID0gdmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDY0X3QgbHZhbHVlOwotICBpZiAoYnRpZl9jb25maWdfZ2V0X3VpbnQ2NChhZGRyc3RyLCBIRUFSSU5HX0FJRF9TWU5DX0lELCAmbHZhbHVlKSkgewotICAgICpoaV9zeW5jX2lkID0gbHZhbHVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IEdBVFQgc2VydmVyIHN1cHBvcnRlZCBmZWF0dXJlcyAqLwotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X2dhdHRfc3Jfc3VwcF9mZWF0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHVpbnQ4X3QgZmVhdCkgewotICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBCaW5kKAotICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCBmZWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJkc3RyID0gYWRkci5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICBWTE9HKDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR0FUVCBzZXJ2ZXIgc3VwcG9ydGVkIGZlYXR1cmVzIGZvcjogIiA8PCBiZHN0cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmZWF0dXJlczogIiA8PCArZmVhdDsKLSAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9jb25maWdfc2V0X2ludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkc3RyLCBCVElGX1NUT1JBR0VfS0VZX0dBVFRfU0VSVkVSX1NVUFBPUlRFRCwgZmVhdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICBhZGRyLCBmZWF0KSk7Ci19Ci0KLS8qKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IEdBVFQgc2VydmVyIHN1cHBvcnRlZCBmZWF0dXJlcyAqLwotdWludDhfdCBidGlmX3N0b3JhZ2VfZ2V0X3NyX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGF1dG8gbmFtZSA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLQotICBpbnQgdmFsdWUgPSAwOwotICBidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9TRVJWRVJfU1VQUE9SVEVELCAmdmFsdWUpOwotICBCVElGX1RSQUNFX0RFQlVHKCJSZW1vdGUgZGV2aWNlOiAlcyBHQVRUIHNlcnZlciBzdXBwb3J0ZWQgZmVhdHVyZXMgMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHZhbHVlKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKiBTZXQgYXV0b2Nvbm5lY3QgaW5mb3JtYXRpb24gZm9yIExlQXVkaW8gZGV2aWNlICovCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfbGVhdWRpb19hdXRvY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBib29sIGF1dG9jb25uZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBiZHN0ciA9IGFkZHIuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMT0coMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic2F2aW5nIGxlIGF1ZGlvIGRldmljZTogIiA8PCBiZHN0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRzdHIsIEJUSUZfU1RPUkFHRV9MRUFVRElPX0FVVE9DT05ORUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb25uZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIsIGF1dG9jb25uZWN0KSk7Ci19Ci0KLS8qKiBMb2FkcyBpbmZvcm1hdGlvbiBhYm91dCBib25kZWQgTGUgQXVkaW8gZGV2aWNlcyAqLwotdm9pZCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfbGVhdWRpbygpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBiZF9hZGRyIDogYnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzKCkpIHsKLSAgICBhdXRvIG5hbWUgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0KLSAgICBpbnQgc2l6ZSA9IFNUT1JBR0VfVVVJRF9TVFJJTkdfU0laRSAqIEJUX01BWF9OVU1fVVVJRFM7Ci0gICAgY2hhciB1dWlkX3N0cltzaXplXTsKLSAgICBib29sIGlzTGVBdWRpb0RldmljZSA9IGZhbHNlOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfc3RyKG5hbWUsIEJUSUZfU1RPUkFHRV9QQVRIX1JFTU9URV9TRVJWSUNFLCB1dWlkX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpIHsKLSAgICAgIFV1aWQgcF91dWlkW0JUX01BWF9OVU1fVVVJRFNdOwotICAgICAgc2l6ZV90IG51bV91dWlkcyA9Ci0gICAgICAgICAgYnRpZl9zcGxpdF91dWlkc19zdHJpbmcodXVpZF9zdHIsIHBfdXVpZCwgQlRfTUFYX05VTV9VVUlEUyk7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV91dWlkczsgaSsrKSB7Ci0gICAgICAgIGlmIChwX3V1aWRbaV0gPT0gVXVpZDo6RnJvbVN0cmluZygiMTg0RSIpKSB7Ci0gICAgICAgICAgaXNMZUF1ZGlvRGV2aWNlID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWlzTGVBdWRpb0RldmljZSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgQlRJRl9UUkFDRV9ERUJVRygiUmVtb3RlIGRldmljZTolcyIsIG5hbWUuY19zdHIoKSk7Ci0KLSAgICBpbnQgdmFsdWU7Ci0gICAgYm9vbCBhdXRvY29ubmVjdCA9IGZhbHNlOwotICAgIGlmIChidGlmX2NvbmZpZ19nZXRfaW50KG5hbWUsIEJUSUZfU1RPUkFHRV9MRUFVRElPX0FVVE9DT05ORUNULCAmdmFsdWUpKQotICAgICAgYXV0b2Nvbm5lY3QgPSAhIXZhbHVlOwotCi0gICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwgQmluZCgmTGVBdWRpb0NsaWVudDo6QWRkRnJvbVN0b3JhZ2UsIGJkX2FkZHIsIGF1dG9jb25uZWN0KSk7Ci0gIH0KLX0KLQotLyoqIFJlbW92ZSB0aGUgTGUgQXVkaW8gZGV2aWNlIGZyb20gc3RvcmFnZSAqLwotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2xlYXVkaW8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBzdGQ6OnN0cmluZyBhZGRyc3RyID0gYWRkcmVzcy5Ub1N0cmluZygpOwotICBidGlmX2NvbmZpZ19zZXRfaW50KGFkZHJzdHIsIEJUSUZfU1RPUkFHRV9MRUFVRElPX0FVVE9DT05ORUNULCBmYWxzZSk7Ci19Ci0KLS8qKiBBZGRzIHRoZSBib25kZWQgTGUgQXVkaW8gZGV2aWNlIGdyb3VwaW5nIGluZm8gaW50byB0aGUgTlZSQU0gKi8KLXZvaWQgYnRpZl9zdG9yYWdlX2FkZF9ncm91cHMoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBncm91cF9pbmZvOwotICBhdXRvIG5vdF9lbXB0eSA9IERldmljZUdyb3Vwczo6R2V0Rm9yU3RvcmFnZShhZGRyLCBncm91cF9pbmZvKTsKLQotICBpZiAobm90X2VtcHR5KQotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgQmluZCgKLSAgICAgICAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdyb3VwX2luZm8pIHsKLSAgICAgICAgICAgICAgYXV0byBiZHN0ciA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgYnRpZl9jb25maWdfc2V0X2JpbihiZHN0ciwgQlRJRl9TVE9SQUdFX0RFVklDRV9HUk9VUF9CSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaW5mby5kYXRhKCksIGdyb3VwX2luZm8uc2l6ZSgpKTsKLSAgICAgICAgICAgICAgYnRpZl9jb25maWdfc2F2ZSgpOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGFkZHIsIHN0ZDo6bW92ZShncm91cF9pbmZvKSkpOwotfQotCi0vKiogRGVsZXRlcyB0aGUgYm9uZGVkIExlIEF1ZGlvIGRldmljZSBncm91cGluZyBpbmZvIGZyb20gdGhlIE5WUkFNICovCi12b2lkIGJ0aWZfc3RvcmFnZV9yZW1vdmVfZ3JvdXBzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGFkZHJlc3MuVG9TdHJpbmcoKTsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKGFkZHJzdHIsIEJUSUZfU1RPUkFHRV9ERVZJQ0VfR1JPVVBfQklOKTsKLSAgYnRpZl9jb25maWdfc2F2ZSgpOwotfQotCi0vKiogTG9hZHMgaW5mb3JtYXRpb24gYWJvdXQgYm9uZGVkIGdyb3VwIGRldmljZXMgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2dyb3Vwcyh2b2lkKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgYmRfYWRkciA6IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcygpKSB7Ci0gICAgYXV0byBuYW1lID0gYmRfYWRkci5Ub1N0cmluZygpOwotICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9Ci0gICAgICAgIGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoKG5hbWUsIEJUSUZfU1RPUkFHRV9ERVZJQ0VfR1JPVVBfQklOKTsKLSAgICBpZiAoYnVmZmVyX3NpemUgPT0gMCkgY29udGludWU7Ci0KLSAgICBCVElGX1RSQUNFX0RFQlVHKCJHcm91cGVkIGRldmljZTolcyIsIG5hbWUuY19zdHIoKSk7Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbihidWZmZXJfc2l6ZSk7Ci0gICAgaWYgKGJ0aWZfY29uZmlnX2dldF9iaW4obmFtZSwgQlRJRl9TVE9SQUdFX0RFVklDRV9HUk9VUF9CSU4sIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX3NpemUpKSB7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkRldmljZUdyb3Vwczo6QWRkRnJvbVN0b3JhZ2UsIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGluKSkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfY3Npc19hdXRvY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvY29ubmVjdCkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCBib29sIGF1dG9jb25uZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBiZHN0ciA9IGFkZHIuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMT0coMikgPDwgIlN0b3JpbmcgQ1NJUyBkZXZpY2U6ICIgPDwgYmRzdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkc3RyLCBCVElGX1NUT1JBR0VfQ1NJU19BVVRPQ09OTkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29ubmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLCBhdXRvY29ubmVjdCkpOwotfQotCi0vKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib25kZWQgQ1NJUyBkZXZpY2UgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3VwZGF0ZV9jc2lzX2luZm8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXRfaW5mbzsKLSAgYXV0byBub3RfZW1wdHkgPSBDc2lzQ2xpZW50OjpHZXRGb3JTdG9yYWdlKGFkZHIsIHNldF9pbmZvKTsKLQotICBpZiAobm90X2VtcHR5KQotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgQmluZCgKLSAgICAgICAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNldF9pbmZvKSB7Ci0gICAgICAgICAgICAgIGF1dG8gYmRzdHIgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF9iaW4oYmRzdHIsIEJUSUZfU1RPUkFHRV9DU0lTX1NFVF9JTkZPX0JJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfaW5mby5kYXRhKCksIHNldF9pbmZvLnNpemUoKSk7Ci0gICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBhZGRyLCBzdGQ6Om1vdmUoc2V0X2luZm8pKSk7Ci19Ci0KLS8qKiBMb2FkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYm9uZGVkIENTSVMgZGV2aWNlICovCi12b2lkIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9jc2lzX2RldmljZXModm9pZCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGJkX2FkZHIgOiBidGlmX2NvbmZpZ19nZXRfcGFpcmVkX2RldmljZXMoKSkgewotICAgIGF1dG8gbmFtZSA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIkxvYWRpbmcgQ1NJUyBkZXZpY2U6JXMiLCBuYW1lLmNfc3RyKCkpOwotCi0gICAgaW50IHZhbHVlOwotICAgIGJvb2wgYXV0b2Nvbm5lY3QgPSBmYWxzZTsKLSAgICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCBCVElGX1NUT1JBR0VfQ1NJU19BVVRPQ09OTkVDVCwgJnZhbHVlKSkKLSAgICAgIGF1dG9jb25uZWN0ID0gISF2YWx1ZTsKLQotICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9Ci0gICAgICAgIGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoKG5hbWUsIEJUSUZfU1RPUkFHRV9DU0lTX1NFVF9JTkZPX0JJTik7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW4oYnVmZmVyX3NpemUpOwotICAgIGlmIChidWZmZXJfc2l6ZSAhPSAwKQotICAgICAgYnRpZl9jb25maWdfZ2V0X2JpbihuYW1lLCBCVElGX1NUT1JBR0VfQ1NJU19TRVRfSU5GT19CSU4sIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcl9zaXplKTsKLQotICAgIGlmIChidWZmZXJfc2l6ZSAhPSAwIHx8IGF1dG9jb25uZWN0KQotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZDc2lzQ2xpZW50OjpBZGRGcm9tU3RvcmFnZSwgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoaW4pLCBhdXRvY29ubmVjdCkpOwotICB9Ci19Ci0KLS8qKiBSZW1vdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib25kZWQgQ1NJUyBkZXZpY2UgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3JlbW92ZV9jc2lzX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSBhZGRyZXNzLlRvU3RyaW5nKCk7Ci0gIGJ0aWZfY29uZmlnX3JlbW92ZShhZGRyc3RyLCBCVElGX1NUT1JBR0VfQ1NJU19BVVRPQ09OTkVDVCk7Ci0gIGJ0aWZfY29uZmlnX3JlbW92ZShhZGRyc3RyLCBCVElGX1NUT1JBR0VfQ1NJU19TRVRfSU5GT19CSU4pOwotICBidGlmX2NvbmZpZ19zYXZlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3N0b3JhZ2VfaXNfcmVzdHJpY3RlZF9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJUSUYgc3RvcmFnZSBBUEkgLSBjaGVja3MgaWYgdGhpcyBkZXZpY2UgaXMgYSByZXN0cmljdGVkCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSAgaWYgdGhlIGRldmljZSBpcyBsYWJlbGVkIGFzIHJlc3RyaWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRpZl9zdG9yYWdlX2lzX3Jlc3RyaWN0ZWRfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKSB7Ci0gIHJldHVybiBidGlmX2NvbmZpZ19leGlzdChyZW1vdGVfYmRfYWRkci0+VG9TdHJpbmcoKSwgIlJlc3RyaWN0ZWQiKTsKLX0KLQotaW50IGJ0aWZfc3RvcmFnZV9nZXRfbnVtX2JvbmRlZF9kZXZpY2VzKHZvaWQpIHsKLSAgYnRpZl9ib25kZWRfZGV2aWNlc190IGJvbmRlZF9kZXZpY2VzOwotICBidGlmX2luX2ZldGNoX2JvbmRlZF9kZXZpY2VzKCZib25kZWRfZGV2aWNlcywgMCk7Ci0gIHJldHVybiBib25kZWRfZGV2aWNlcy5udW1fZGV2aWNlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9zdG9yYWdlX2xvYWRfaGlkZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9hZHMgaGlkZCBib25kZWQgZGV2aWNlIGFuZCAicGx1Z3MiIGl0IGludG8gaGlkZAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9sb2FkX2hpZGQodm9pZCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGJkX2FkZHIgOiBidGlmX2NvbmZpZ19nZXRfcGFpcmVkX2RldmljZXMoKSkgewotICAgIGF1dG8gbmFtZSA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIlJlbW90ZSBkZXZpY2U6JXMiLCBuYW1lLmNfc3RyKCkpOwotICAgIGludCB2YWx1ZTsKLSAgICBpZiAoYnRpZl9pbl9mZXRjaF9ib25kZWRfZGV2aWNlKG5hbWUpID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBpZiAoYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCAiSGlkRGV2aWNlQ2FibGVkIiwgJnZhbHVlKSkgewotICAgICAgICBCVEFfSGRBZGREZXZpY2UoYmRfYWRkcik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9zZXRfaGlkZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RvcmVzIGN1cnJlbnRseSB1c2VkIEhJREQgZGV2aWNlIGluZm8gaW4gbnZyYW0gYW5kIHJlbW92ZQotICogICAgICAgICAgICAgICAgICB0aGUgIkhpZERldmljZUNhYmxlZCIgZmxhZyBmcm9tIHVudXNlZCBkZXZpY2VzCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X2hpZGQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpIHsKLSAgc3RkOjpzdHJpbmcgcmVtb3RlX2RldmljZV9hZGRyZXNzX3N0cmluZyA9IHJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCk7Ci0gIGZvciAoY29uc3QgYXV0byYgYmRfYWRkciA6IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcygpKSB7Ci0gICAgYXV0byBuYW1lID0gYmRfYWRkci5Ub1N0cmluZygpOwotICAgIGlmIChiZF9hZGRyID09IHJlbW90ZV9iZF9hZGRyKSBjb250aW51ZTsKLSAgICBpZiAoYnRpZl9pbl9mZXRjaF9ib25kZWRfZGV2aWNlKG5hbWUpID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBidGlmX2NvbmZpZ19yZW1vdmUobmFtZSwgIkhpZERldmljZUNhYmxlZCIpOwotICAgIH0KLSAgfQotCi0gIGJ0aWZfY29uZmlnX3NldF9pbnQocmVtb3RlX2RldmljZV9hZGRyZXNzX3N0cmluZywgIkhpZERldmljZUNhYmxlZCIsIDEpOwotICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfaGlkZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlcyBoaWRkIGJvbmRlZCBkZXZpY2UgaW5mbyBmcm9tIG52cmFtCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2hpZGQoUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIpIHsKLSAgYnRpZl9jb25maWdfcmVtb3ZlKHJlbW90ZV9iZF9hZGRyLT5Ub1N0cmluZygpLCAiSGlkRGV2aWNlQ2FibGVkIik7Ci0gIGJ0aWZfY29uZmlnX3NhdmUoKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8vIEdldCB0aGUgbmFtZSBvZiBhIGRldmljZSBmcm9tIGJ0aWYgZm9yIGludGVyb3AgZGF0YWJhc2UgbWF0Y2hpbmcuCi1ib29sIGJ0aWZfc3RvcmFnZV9nZXRfc3RvcmVkX3JlbW90ZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG5hbWUpIHsKLSAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0eTsKLSAgcHJvcGVydHkudHlwZSA9IEJUX1BST1BFUlRZX0JETkFNRTsKLSAgcHJvcGVydHkubGVuID0gQlRNX01BWF9SRU1fQkRfTkFNRV9MRU47Ci0gIHByb3BlcnR5LnZhbCA9IG5hbWU7Ci0KLSAgcmV0dXJuIChidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkX2FkZHIsICZwcm9wZXJ0eSkgPT0KLSAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLS8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgR0FUVCBDbGllbnQgc3VwcG9ydGVkIGZlYXR1cmVzIHN1cHBvcnQgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3NldF9nYXR0X2NsX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmVhdCkgewotICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBCaW5kKAotICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBmZWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJkc3RyID0gYmRfYWRkci5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICBWTE9HKDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic2F2aW5nIGdhdHQgY2xpZW50IHN1cHBvcnRlZCBmZWF0OiAiIDw8IGJkc3RyOwotICAgICAgICAgICAgICAgICAgICAgICBidGlmX2NvbmZpZ19zZXRfaW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRzdHIsIEJUSUZfU1RPUkFHRV9LRVlfR0FUVF9DTElFTlRfU1VQUE9SVEVELCBmZWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9jb25maWdfc2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIsIGZlYXQpKTsKLX0KLQotLyoqIEdldCBjbGllbnQgc3VwcG9ydGVkIGZlYXR1cmVzICovCi11aW50OF90IGJ0aWZfc3RvcmFnZV9nZXRfZ2F0dF9jbF9zdXBwX2ZlYXQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBhdXRvIG5hbWUgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0KLSAgaW50IHZhbHVlID0gMDsKLSAgYnRpZl9jb25maWdfZ2V0X2ludChuYW1lLCBCVElGX1NUT1JBR0VfS0VZX0dBVFRfQ0xJRU5UX1NVUFBPUlRFRCwgJnZhbHVlKTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiUmVtb3RlIGRldmljZTogJXMgR0FUVCBjbGllbnQgc3VwcG9ydGVkIGZlYXR1cmVzIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiogUmVtb3ZlIGNsaWVudCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3JlbW92ZV9nYXR0X2NsX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIEJpbmQoCi0gICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGF1dG8gYmRzdHIgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChidGlmX2NvbmZpZ19leGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHN0ciwgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX0NMSUVOVF9TVVBQT1JURUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9jb25maWdfcmVtb3ZlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHN0ciwgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX0NMSUVOVF9TVVBQT1JURUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NhdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIpKTsKLX0KLQotLyoqIFN0b3JlIGxhc3Qgc2VydmVyIGRhdGFiYXNlIGhhc2ggZm9yIHJlbW90ZSBjbGllbnQgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3NldF9nYXR0X2NsX2RiX2hhc2goY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgT2N0ZXQxNiBoYXNoKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIE9jdGV0MTYgaGFzaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBiZHN0ciA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfY29uZmlnX3NldF9iaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX0NMSUVOVF9EQl9IQVNILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2guZGF0YSgpLCBoYXNoLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2NvbmZpZ19zYXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLCBoYXNoKSk7Ci19Ci0KLS8qKiBHZXQgbGFzdCBzZXJ2ZXIgZGF0YWJhc2UgaGFzaCBmb3IgcmVtb3RlIGNsaWVudCAqLwotT2N0ZXQxNiBidGlmX3N0b3JhZ2VfZ2V0X2dhdHRfY2xfZGJfaGFzaChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGF1dG8gYmRzdHIgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0KLSAgT2N0ZXQxNiBoYXNoOwotICBzaXplX3Qgc2l6ZSA9IGhhc2guc2l6ZSgpOwotICBidGlmX2NvbmZpZ19nZXRfYmluKGJkc3RyLCBCVElGX1NUT1JBR0VfS0VZX0dBVFRfQ0xJRU5UX0RCX0hBU0gsIGhhc2guZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoqIFJlbW92ZSBsYXMgc2VydmVyIGRhdGFiYXNlIGhhc2ggZm9yIHJlbW90ZSBjbGllbnQgKi8KLXZvaWQgYnRpZl9zdG9yYWdlX3JlbW92ZV9nYXR0X2NsX2RiX2hhc2goY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBCaW5kKAotICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBiZHN0ciA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRpZl9jb25maWdfZXhpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHN0ciwgQlRJRl9TVE9SQUdFX0tFWV9HQVRUX0NMSUVOVF9EQl9IQVNIKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9jb25maWdfcmVtb3ZlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkc3RyLCBCVElGX1NUT1JBR0VfS0VZX0dBVFRfQ0xJRU5UX0RCX0hBU0gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9jb25maWdfc2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkcikpOwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl91aWQuY2MgYi9idGlmL3NyYy9idGlmX3VpZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4YTNkYy4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9idGlmX3VpZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGaWxlbmFtZTogICAgICBidGlmX3VpZC5jYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBDb250YWlucyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3Iga2VlcGluZyB0cmFjayBvZgotICogICAgICAgICAgICAgICAgIHNvY2tldCB1c2FnZSBwZXIgYXBwIFVJRC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiYnRpZl91aWQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLQotc3RhdGljIHN0ZDo6bXV0ZXggc2V0X2xvY2s7Ci0KLXR5cGVkZWYgc3RydWN0IHVpZF9zZXRfbm9kZV90IHsKLSAgc3RydWN0IHVpZF9zZXRfbm9kZV90KiBuZXh0OwotICBidF91aWRfdHJhZmZpY190IGRhdGE7Ci19IHVpZF9zZXRfbm9kZV90OwotCi10eXBlZGVmIHN0cnVjdCB1aWRfc2V0X3QgewotICB1aWRfc2V0X25vZGVfdCogaGVhZDsKLX0gdWlkX3NldF90OwotCi11aWRfc2V0X3QqIHVpZF9zZXRfY3JlYXRlKHZvaWQpIHsKLSAgdWlkX3NldF90KiBzZXQgPSAodWlkX3NldF90Kilvc2lfY2FsbG9jKHNpemVvZih1aWRfc2V0X3QpKTsKLSAgcmV0dXJuIHNldDsKLX0KLQotdm9pZCB1aWRfc2V0X2Rlc3Ryb3kodWlkX3NldF90KiBzZXQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChzZXRfbG9jayk7Ci0gIHVpZF9zZXRfbm9kZV90KiBub2RlID0gc2V0LT5oZWFkOwotICB3aGlsZSAobm9kZSkgewotICAgIHVpZF9zZXRfbm9kZV90KiB0ZW1wID0gbm9kZTsKLSAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICBvc2lfZnJlZSh0ZW1wKTsKLSAgfQotICBzZXQtPmhlYWQgPSBOVUxMOwotICBvc2lfZnJlZShzZXQpOwotfQotCi0vLyBMb2NrIGluIHVpZF9zZXRfdCBtdXN0IGJlIGhlbGQuCi1zdGF0aWMgdWlkX3NldF9ub2RlX3QqIHVpZF9zZXRfZmluZF9vcl9jcmVhdGVfbm9kZSh1aWRfc2V0X3QqIHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYXBwX3VpZCkgewotICB1aWRfc2V0X25vZGVfdCogbm9kZSA9IHNldC0+aGVhZDsKLSAgd2hpbGUgKG5vZGUgJiYgbm9kZS0+ZGF0YS5hcHBfdWlkICE9IGFwcF91aWQpIHsKLSAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgfQotCi0gIGlmICghbm9kZSkgewotICAgIG5vZGUgPSAodWlkX3NldF9ub2RlX3QqKW9zaV9jYWxsb2Moc2l6ZW9mKHVpZF9zZXRfbm9kZV90KSk7Ci0gICAgbm9kZS0+ZGF0YS5hcHBfdWlkID0gYXBwX3VpZDsKLSAgICBub2RlLT5uZXh0ID0gc2V0LT5oZWFkOwotICAgIHNldC0+aGVhZCA9IG5vZGU7Ci0gIH0KLSAgcmV0dXJuIG5vZGU7Ci19Ci0KLXZvaWQgdWlkX3NldF9hZGRfdHgodWlkX3NldF90KiBzZXQsIGludDMyX3QgYXBwX3VpZCwgdWludDY0X3QgYnl0ZXMpIHsKLSAgaWYgKGFwcF91aWQgPT0gLTEgfHwgYnl0ZXMgPT0gMCkgcmV0dXJuOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoc2V0X2xvY2spOwotICB1aWRfc2V0X25vZGVfdCogbm9kZSA9IHVpZF9zZXRfZmluZF9vcl9jcmVhdGVfbm9kZShzZXQsIGFwcF91aWQpOwotICBub2RlLT5kYXRhLnR4X2J5dGVzICs9IGJ5dGVzOwotfQotCi12b2lkIHVpZF9zZXRfYWRkX3J4KHVpZF9zZXRfdCogc2V0LCBpbnQzMl90IGFwcF91aWQsIHVpbnQ2NF90IGJ5dGVzKSB7Ci0gIGlmIChhcHBfdWlkID09IC0xIHx8IGJ5dGVzID09IDApIHJldHVybjsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKHNldF9sb2NrKTsKLSAgdWlkX3NldF9ub2RlX3QqIG5vZGUgPSB1aWRfc2V0X2ZpbmRfb3JfY3JlYXRlX25vZGUoc2V0LCBhcHBfdWlkKTsKLSAgbm9kZS0+ZGF0YS5yeF9ieXRlcyArPSBieXRlczsKLX0KLQotYnRfdWlkX3RyYWZmaWNfdCogdWlkX3NldF9yZWFkX2FuZF9jbGVhcih1aWRfc2V0X3QqIHNldCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKHNldF9sb2NrKTsKLQotICAvLyBGaW5kIHRoZSBsZW5ndGgKLSAgc2l6ZV90IGxlbiA9IDA7Ci0gIHVpZF9zZXRfbm9kZV90KiBub2RlID0gc2V0LT5oZWFkOwotICB3aGlsZSAobm9kZSkgewotICAgIGxlbisrOwotICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2YgZWxlbWVudHMgKyAxLCB0byBzaWduaWZ5IHRoZSBlbmQgd2l0aCBhcHBfdWlkIHNldCB0bwotICAvLyAtMS4KLSAgYnRfdWlkX3RyYWZmaWNfdCogcmVzdWx0ID0KLSAgICAgIChidF91aWRfdHJhZmZpY190Kilvc2lfY2FsbG9jKHNpemVvZihidF91aWRfdHJhZmZpY190KSAqIChsZW4gKyAxKSk7Ci0KLSAgYnRfdWlkX3RyYWZmaWNfdCogZGF0YSA9IHJlc3VsdDsKLSAgbm9kZSA9IHNldC0+aGVhZDsKLSAgd2hpbGUgKG5vZGUpIHsKLSAgICAvLyBDb3B5IHRoZSBkYXRhLgotICAgICpkYXRhID0gbm9kZS0+ZGF0YTsKLSAgICBkYXRhKys7Ci0KLSAgICAvLyBDbGVhciB0aGUgY291bnRlcnMuCi0gICAgbm9kZS0+ZGF0YS5yeF9ieXRlcyA9IDA7Ci0gICAgbm9kZS0+ZGF0YS50eF9ieXRlcyA9IDA7Ci0gICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gIH0KLQotICAvLyBNYXJrIHRoZSBsYXN0IGVudHJ5Ci0gIGRhdGEtPmFwcF91aWQgPSAtMTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl91dGlsLmNjIGIvYnRpZi9zcmMvYnRpZl91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWYzMGU5Li4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfdXRpbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfdXRpbC5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIE1pc2NlbGxhbmVvdXMgaGVscGVyIGZ1bmN0aW9ucwotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0aWZfdXRpbCIKLQotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0KLSNpbmNsdWRlICJhdnJjX2RlZnMuaCIKLSNpbmNsdWRlICJidGFfYWdfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9hdl9hcGkuaCIKLSNpbmNsdWRlICJidGFfaGRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2hmX2NsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidGFfaGhfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX2RtLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBJU0RJR0lUKGEpICgoKGEpID49ICcwJykgJiYgKChhKSA8PSAnOScpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgTG9nZ2luZyBoZWxwZXIgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdWludDMyX3QgZGV2Y2xhc3MydWludChERVZfQ0xBU1MgZGV2X2NsYXNzKSB7Ci0gIHVpbnQzMl90IGNvZCA9IDA7Ci0KLSAgaWYgKGRldl9jbGFzcyAhPSBOVUxMKSB7Ci0gICAgLyogaWYgQ09EIGlzIDAsIGlycmVzcGVjdGl2ZSBvZiB0aGUgZGV2aWNlIHR5cGUgc2V0IGl0IHRvIFVuY2xhc3NpZmllZAotICAgICAqIGRldmljZSAqLwotICAgIGNvZCA9IChkZXZfY2xhc3NbMl0pIHwgKGRldl9jbGFzc1sxXSA8PCA4KSB8IChkZXZfY2xhc3NbMF0gPDwgMTYpOwotICB9Ci0gIHJldHVybiBjb2Q7Ci19Ci12b2lkIHVpbnQyZGV2Y2xhc3ModWludDMyX3QgY29kLCBERVZfQ0xBU1MgZGV2X2NsYXNzKSB7Ci0gIGRldl9jbGFzc1syXSA9ICh1aW50OF90KWNvZDsKLSAgZGV2X2NsYXNzWzFdID0gKHVpbnQ4X3QpKGNvZCA+PiA4KTsKLSAgZGV2X2NsYXNzWzBdID0gKHVpbnQ4X3QpKGNvZCA+PiAxNik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9uICAgICAgICBhc2NpaV8yX2hleAotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBBU0NJSSBzdHJpbmcgaW50byBIRVgKLSAqCi0gKiAgUmV0dXJucyAgICAgICAgIHRoZSBudW1iZXIgb2YgaGV4IGJ5dGVzIGZpbGxlZC4KLSAqLwotaW50IGFzY2lpXzJfaGV4KGNvbnN0IGNoYXIqIHBfYXNjaWksIGludCBsZW4sIHVpbnQ4X3QqIHBfaGV4KSB7Ci0gIGludCB4OwotICB1aW50OF90IGM7Ci0KLSAgZm9yICh4ID0gMDsgKHggPCBsZW4pICYmICgqcF9hc2NpaSk7IHgrKykgewotICAgIGlmIChJU0RJR0lUKCpwX2FzY2lpKSkKLSAgICAgIGMgPSAoKnBfYXNjaWkgLSAnMCcpIDw8IDQ7Ci0gICAgZWxzZQotICAgICAgYyA9ICh0b3VwcGVyKCpwX2FzY2lpKSAtICdBJyArIDEwKSA8PCA0OwotCi0gICAgcF9hc2NpaSsrOwotICAgIGlmICgqcF9hc2NpaSkgewotICAgICAgaWYgKElTRElHSVQoKnBfYXNjaWkpKQotICAgICAgICBjIHw9ICgqcF9hc2NpaSAtICcwJyk7Ci0gICAgICBlbHNlCi0gICAgICAgIGMgfD0gKHRvdXBwZXIoKnBfYXNjaWkpIC0gJ0EnICsgMTApOwotCi0gICAgICBwX2FzY2lpKys7Ci0gICAgfQotICAgICpwX2hleCsrID0gYzsKLSAgfQotCi0gIHJldHVybiAoeCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGR1bXBfZG1fc2VhcmNoX2V2ZW50KHVpbnQxNl90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0lOUV9SRVNfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fSU5RX0NNUExfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fRElTQ19SRVNfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fRElTQ19CTEVfUkVTX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0RJU0NfQ01QTF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ETV9TRUFSQ0hfQ0FOQ0VMX0NNUExfRVZUKQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTiBNU0cgSUQiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIGR1bXBfcHJvcGVydHlfdHlwZShidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfUFJPUEVSVFlfQkROQU1FKQotICAgIENBU0VfUkVUVVJOX1NUUihCVF9QUk9QRVJUWV9CREFERFIpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1BST1BFUlRZX1VVSURTKQotICAgIENBU0VfUkVUVVJOX1NUUihCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFKQotICAgIENBU0VfUkVUVVJOX1NUUihCVF9QUk9QRVJUWV9SRU1PVEVfUlNTSSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfUFJPUEVSVFlfQURBUFRFUl9CT05ERURfREVWSUNFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfUFJPUEVSVFlfQURBUFRFUl9TQ0FOX01PREUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1BST1BFUlRZX1JFTU9URV9GUklFTkRMWV9OQU1FKQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTiBQUk9QRVJUWSBJRCI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogZHVtcF9kbV9ldmVudCh1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ETV9QSU5fUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0FVVEhfQ01QTF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ETV9MSU5LX1VQX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0xJTktfRE9XTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ETV9CT05EX0NBTkNFTF9DTVBMX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX1NQX0NGTV9SRVFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fU1BfS0VZX05PVElGX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0JMRV9LRVlfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fQkxFX1NFQ19SRVFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fQkxFX1BBU1NLRVlfTk9USUZfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fQkxFX1BBU1NLRVlfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0JMRV9PT0JfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0JMRV9TQ19PT0JfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0RNX0JMRV9MT0NBTF9JUl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ETV9CTEVfTE9DQUxfRVJfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fQkxFX0FVVEhfQ01QTF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ETV9ERVZfVU5QQUlSRURfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfRE1fRU5FUl9JTkZPX1JFQUQpCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVTktOT1dOIERNIEVWRU5UIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2hmX2V2ZW50KHVpbnQxNl90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0VOQUJMRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19SRUdJU1RFUl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19PUEVOX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0NMT1NFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0NPTk5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVVESU9fT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVURJT19DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19TUEtfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfTUlDX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0NLUERfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfRElTQUJMRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19XQlNfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfQV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9EX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0NITERfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfQ0hVUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9DSU5EX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX1ZUU19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9CSU5QX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0JMRE5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfQlZSQV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9OUkVDX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0NOVU1fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfQlRSSF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9DTENDX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0NPUFNfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfVU5BVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9DQkNfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfQkFDX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0JDU19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BR19BVF9CSU5EX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FHX0FUX0JJRVZfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUdfQVRfQklBX0VWVCkKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04gTVNHIElEIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2hmX2NsaWVudF9ldmVudCh1aW50MTZfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfRU5BQkxFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9SRUdJU1RFUl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0NPTk5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0FVRElPX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX0FVRElPX01TQkNfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQVVESU9fQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX1NQS19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfTUlDX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9ESVNBQkxFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9JTkRfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEZfQ0xJRU5UX1ZPSUNFX1JFQ19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfT1BFUkFUT1JfTkFNRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQ0xJUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQ0NXQV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRl9DTElFTlRfQVRfUkVTVUxUX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9DTENDX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9DTlVNX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9CVFJIX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9CU0lSX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9CSU5QX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hGX0NMSUVOVF9SSU5HX0lORElDQVRJT04pCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTiBNU0cgSUQiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIGR1bXBfaGhfZXZlbnQodWludDE2X3QgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEhfRU5BQkxFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hIX0RJU0FCTEVfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEhfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9HRVRfRFNDUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9HRVRfUFJPVE9fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEhfR0VUX1JQVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9HRVRfSURMRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9TRVRfUFJPVE9fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEhfU0VUX1JQVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9TRVRfSURMRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9WQ19VTlBMVUdfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSEhfQUREX0RFVl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9ISF9STVZfREVWX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hIX0FQSV9FUlJfRVZUKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04gTVNHIElEIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2hkX2V2ZW50KHVpbnQxNl90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hEX0VOQUJMRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRF9ESVNBQkxFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hEX1JFR0lTVEVSX0FQUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRF9VTlJFR0lTVEVSX0FQUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRF9PUEVOX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hEX0NMT1NFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hEX0dFVF9SRVBPUlRfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSERfU0VUX1JFUE9SVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRF9TRVRfUFJPVE9DT0xfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfSERfSU5UUl9EQVRBX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hEX1ZDX1VOUExVR19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9IRF9DT05OX1NUQVRFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0hEX0FQSV9FUlJfRVZUKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04gTVNHIElEIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX3RocmVhZF9ldnQoYnRfY2JfdGhyZWFkX2V2dCBldnQpIHsKLSAgc3dpdGNoIChldnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVNTT0NJQVRFX0pWTSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoRElTQVNTT0NJQVRFX0pWTSkKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gdGhyZWFkIGV2dCI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogZHVtcF9hdl9jb25uX3N0YXRlKHVpbnQxNl90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBVl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBVl9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQVZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04gTVNHIElEIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2F2X2F1ZGlvX3N0YXRlKHVpbnQxNl90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBVl9BVURJT19TVEFURV9SRU1PVEVfU1VTUEVORCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBVl9BVURJT19TVEFURV9TVE9QUEVEKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFWX0FVRElPX1NUQVRFX1NUQVJURUQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTiBNU0cgSUQiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIGR1bXBfYWRhcHRlcl9zY2FuX21vZGUoYnRfc2Nhbl9tb2RlX3QgbW9kZSkgewotICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfU0NBTl9NT0RFX05PTkUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSkKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gc2NhbiBtb2RlIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2J0X3N0YXR1cyhidF9zdGF0dXNfdCBzdGF0dXMpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRfU1RBVFVTX1NVQ0NFU1MpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1NUQVRVU19GQUlMKQotICAgIENBU0VfUkVUVVJOX1NUUihCVF9TVEFUVVNfTk9UX1JFQURZKQotICAgIENBU0VfUkVUVVJOX1NUUihCVF9TVEFUVVNfTk9NRU0pCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1NUQVRVU19CVVNZKQotICAgIENBU0VfUkVUVVJOX1NUUihCVF9TVEFUVVNfVU5TVVBQT1JURUQpCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIHNjYW4gbW9kZSI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogZHVtcF9yY19ldmVudCh1aW50OF90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1JDX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfQlJPV1NFX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfQlJPV1NFX0NMT1NFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1JFTU9URV9DTURfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkVNT1RFX1JTUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9WRU5ET1JfQ01EX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FWX1ZFTkRPUl9SU1BfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfTUVUQV9NU0dfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQVZfUkNfRkVBVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BVl9SQ19QU01fRVZUKQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV05fRVZFTlQiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIGR1bXBfcmNfbm90aWZpY2F0aW9uX2V2ZW50X2lkKHVpbnQ4X3QgZXZlbnRfaWQpIHsKLSAgc3dpdGNoIChldmVudF9pZCkgewotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX0VWVF9QTEFZX1NUQVRVU19DSEFOR0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfRVZUX1RSQUNLX0NIQU5HRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19FVlRfVFJBQ0tfUkVBQ0hFRF9FTkQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfRVZUX1RSQUNLX1JFQUNIRURfU1RBUlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfRVZUX0JBVFRFUllfU1RBVFVTX0NIQU5HRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19FVlRfU1lTVEVNX1NUQVRVU19DSEFOR0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfRVZUX0FQUF9TRVRUSU5HX0NIQU5HRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19FVlRfQUREUl9QTEFZRVJfQ0hBTkdFKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX0VWVF9BVkFMX1BMQVlFUlNfQ0hBTkdFKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX0VWVF9OT1dfUExBWUlOR19DSEFOR0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfRVZUX1VJRFNfQ0hBTkdFKQotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5oYW5kbGVkIEV2ZW50IElEIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX3JjX3BkdSh1aW50OF90IHBkdSkgewotICBzd2l0Y2ggKHBkdSkgewotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfQVRUUikKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX1ZBTFVFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfR0VUX0NVUl9QTEFZRVJfQVBQX1ZBTFVFKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9TRVRfUExBWUVSX0FQUF9WQUxVRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfR0VUX1BMQVlFUl9BUFBfQVRUUl9URVhUKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9WQUxVRV9URVhUKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9JTkZPUk1fRElTUExBWV9DSEFSU0VUKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9JTkZPUk1fQkFUVEVSWV9TVEFUX09GX0NUKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9HRVRfUExBWV9TVEFUVVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTikKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfUkVRVUVTVF9DT05USU5VQVRJT05fUlNQKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9BQk9SVF9DT05USU5VQVRJT05fUlNQKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9TRVRfQUJTT0xVVEVfVk9MVU1FKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9TRVRfQUREUkVTU0VEX1BMQVlFUikKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfQ0hBTkdFX1BBVEgpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfUERVX0dFVF9DQVBBQklMSVRJRVMpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUikKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfR0VUX0ZPTERFUl9JVEVNUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfR0VUX0lURU1fQVRUUklCVVRFUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfUExBWV9JVEVNKQotICAgIENBU0VfUkVUVVJOX1NUUihBVlJDX1BEVV9TRUFSQ0gpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEFWUkNfUERVX0FERF9UT19OT1dfUExBWUlORykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfR0VUX1RPVEFMX05VTV9PRl9JVEVNUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoQVZSQ19QRFVfR0VORVJBTF9SRUpFQ1QpCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIFBEVSI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J0aWYvc3JjL2J0aWZfdmMuY2MgYi9idGlmL3NyYy9idGlmX3ZjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM3NGUyLi4wMDAwMDAwCi0tLSBhL2J0aWYvc3JjL2J0aWZfdmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyogVm9sdW1lIENvbnRyb2wgSW50ZXJmYWNlICovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfdmMuaD4KLQotI2luY2x1ZGUgImJ0YV92Y19hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBibHVldG9vdGg6OnZjOjpDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OnZjOjpWb2x1bWVDb250cm9sQ2FsbGJhY2tzOwotdXNpbmcgYmx1ZXRvb3RoOjp2Yzo6Vm9sdW1lQ29udHJvbEludGVyZmFjZTsKLQotbmFtZXNwYWNlIHsKLXN0ZDo6dW5pcXVlX3B0cjxWb2x1bWVDb250cm9sSW50ZXJmYWNlPiB2Y19pbnN0YW5jZTsKLQotY2xhc3MgVm9sdW1lQ29udHJvbEludGVyZmFjZUltcGwgOiBwdWJsaWMgVm9sdW1lQ29udHJvbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFZvbHVtZUNvbnRyb2xDYWxsYmFja3MgewotICB+Vm9sdW1lQ29udHJvbEludGVyZmFjZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBJbml0KFZvbHVtZUNvbnRyb2xDYWxsYmFja3MqIGNhbGxiYWNrcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fOwotICAgIHRoaXMtPmNhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZWb2x1bWVDb250cm9sOjpJbml0aWFsaXplLCB0aGlzKSk7Ci0gIH0KLQotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlZvbHVtZUNvbnRyb2xDYWxsYmFja3M6Ok9uQ29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzXyksIHN0YXRlLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIE9uVm9sdW1lU3RhdGVDaGFuZ2VkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXV0ZSkgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzIDw8ICJ2b2x1bWU6ICIgPDwgdm9sdW1lCi0gICAgICAgICAgICAgPDwgIm11dGU6ICIgPDwgbXV0ZTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIEJpbmQoJlZvbHVtZUNvbnRyb2xDYWxsYmFja3M6Ok9uVm9sdW1lU3RhdGVDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrc18pLCBhZGRyZXNzLCB2b2x1bWUsIG11dGUpKTsKLSAgfQotCi0gIHZvaWQgT25Hcm91cFZvbHVtZVN0YXRlQ2hhbmdlZChpbnQgZ3JvdXBfaWQsIHVpbnQ4X3Qgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXRlKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgImdyb3VwX2lkOiAiIDw8IGdyb3VwX2lkIDw8ICJ2b2x1bWU6ICIgPDwgdm9sdW1lCi0gICAgICAgICAgICAgPDwgIm11dGU6ICIgPDwgbXV0ZTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIEJpbmQoJlZvbHVtZUNvbnRyb2xDYWxsYmFja3M6Ok9uR3JvdXBWb2x1bWVTdGF0ZUNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzXyksIGdyb3VwX2lkLCB2b2x1bWUsIG11dGUpKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJlZvbHVtZUNvbnRyb2w6OkNvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFZvbHVtZUNvbnRyb2w6OkdldCgpKSwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgQmluZCgmVm9sdW1lQ29udHJvbDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoVm9sdW1lQ29udHJvbDo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIFNldFZvbHVtZShzdGQ6OnZhcmlhbnQ8UmF3QWRkcmVzcywgaW50PiBhZGRyX29yX2dyb3VwX2lkLAotICAgICAgICAgICAgICAgICB1aW50OF90IHZvbHVtZSkgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgdm9sdW1lOiAiIDw8IHZvbHVtZTsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlZvbHVtZUNvbnRyb2w6OlNldFZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChWb2x1bWVDb250cm9sOjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShhZGRyX29yX2dyb3VwX2lkKSwgdm9sdW1lKSk7Ci0gIH0KLQotICB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0KLSAgICAvKiBSZW1vdmVEZXZpY2UgY2FuIGJlIGNhbGxlZCBvbiBkZXZpY2VzIHRoYXQgZG9uJ3QgaGF2ZSBIQSBlbmFibGVkICovCi0gICAgaWYgKFZvbHVtZUNvbnRyb2w6OklzVm9sdW1lQ29udHJvbFJ1bm5pbmcoKSkgewotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgQmluZCgmVm9sdW1lQ29udHJvbDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChWb2x1bWVDb250cm9sOjpHZXQoKSksIGFkZHJlc3MpKTsKLSAgICB9Ci0KLSAgICAvKiBQbGFjZWhvbGRlcjogUmVtb3ZlIHRoaW5ncyBmcm9tIHN0b3JhZ2UgaGVyZSAqLwotICB9Ci0KLSAgdm9pZCBDbGVhbnVwKHZvaWQpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlZvbHVtZUNvbnRyb2w6OkNsZWFuVXApKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVm9sdW1lQ29udHJvbENhbGxiYWNrcyogY2FsbGJhY2tzXzsKLX07Ci0KLX0gLyogbmFtZXNwYWNlICovCi0KLVZvbHVtZUNvbnRyb2xJbnRlcmZhY2UqIGJ0aWZfdm9sdW1lX2NvbnRyb2xfZ2V0X2ludGVyZmFjZSh2b2lkKSB7Ci0gIGlmICghdmNfaW5zdGFuY2UpIHZjX2luc3RhbmNlLnJlc2V0KG5ldyBWb2x1bWVDb250cm9sSW50ZXJmYWNlSW1wbCgpKTsKLQotICByZXR1cm4gdmNfaW5zdGFuY2UuZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idGlmL3NyYy9zdGFja19tYW5hZ2VyLmNjIGIvYnRpZi9zcmMvc3RhY2tfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhNWM2MS4uMDAwMDAwMAotLS0gYS9idGlmL3NyYy9zdGFja19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9zdGFja19tYW5hZ2VyIgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL3N0YWNrX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2lmIGRlZmluZWQoU1RBVElDX0xJQkJMVUVUT09USCkKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL29zaV9tb2R1bGUuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9idHNub29wLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9jbGllbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLQotLy8gVGVtcCBpbmNsdWRlcwotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmX3Byb2ZpbGVfcXVldWUuaCIKLSNpbmNsdWRlICJpbnRlcm5hbF9pbmNsdWRlL2J0X3RhcmdldC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3BvcnRfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2lmIChCTkVQX0lOQ0xVREVEID09IFRSVUUpCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibmVwX2FwaS5oIgotI2VuZGlmCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXBfYXBpLmgiCi0jaWYgKFBBTl9JTkNMVURFRCA9PSBUUlVFKQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcGFuX2FwaS5oIgotI2VuZGlmCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZyY19hcGkuaCIKLSNpZiAoSElEX0hPU1RfSU5DTFVERUQgPT0gVFJVRSkKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hpZGhfYXBpLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NtcF9hcGkuaCIKLSNpbmNsdWRlICJidGFfYXJfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzX2ludC5oIgotI2luY2x1ZGUgImJ0YV9kbV9pbnQuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9wYW4uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zb2NrLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgImludGVybmFsX2luY2x1ZGUvc3RhY2tfY29uZmlnLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLQotLy8gVmFsaWRhdGUgb3IgcmVzcG9uZCB0byB2YXJpb3VzIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZsYWdzCi0KLSNpZiBCTEVfUFJJVkFDWV9TUFQgIT0gVFJVRQotLy8gT25jZSBCTEVfUFJJVkFDWV9TUFQgaXMgbm8gbG9uZ2VyIGV4cG9zZWQgdmlhIGJ0X3RhcmdldC5oCi0vLyB0aGlzIGNoZWNrIGFuZCBlcnJvciBzdGF0ZW1lbnQgbWF5IGJlIHJlbW92ZWQuCi0jd2FybmluZyBcCi0gICAgIiNkZWZpbmUgQkxFX1BSSVZBQ1lfU1BUIEZBTFNFIHByZXByb2Nlc3NvciBjb21waWxhdGlvbiBmbGFnIGlzIHVuc3VwcG9ydGVkIgotI3dhcm5pbmcgXAotICAgICIgIFRvIGRpc2FibGUgTEUgcHJpdmFjeSBmb3IgYSBkZXZpY2UgdXNlOiAjZGVmaW5lIEJMRV9MT0NBTF9QUklWQUNZX0VOQUJMRUQgRkFMU0UiCi0jZXJyb3IgIioqKiBDb25kaXRpb25hbCBDb21waWxhdGlvbiBEaXJlY3RpdmUgZXJyb3IiCi0jZW5kaWYKLQotI2lmIFNEUF9SQVdfREFUQV9JTkNMVURFRCAhPSBUUlVFCi0vLyBPbmNlIFNEUF9SQVdfREFUQV9JTkNMVURFRCBpcyBubyBsb25nZXIgZXhwb3NlZCB2aWEgYnRfdGFyZ2V0LmgKLS8vIHRoaXMgY2hlY2sgYW5kIGVycm9yIHN0YXRlbWVudCBtYXkgYmUgcmVtb3ZlZC4KLSN3YXJuaW5nIFwKLSAgICAiI2RlZmluZSBTRFBfUkFXX0RBVEFfSU5DTFVERUQgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGZsYWcgaXMgdW5zdXBwb3J0ZWQiCi0jZXJyb3IgIioqKiBDb25kaXRpb25hbCBDb21waWxhdGlvbiBEaXJlY3RpdmUgZXJyb3IiCi0jZW5kaWYKLQotLy8gT25jZSBCVEFfUEFOX0lOQ0xVREVEIGlzIG5vIGxvbmdlciBleHBvc2VkIHZpYSBidF90YXJnZXQuaAotLy8gdGhpcyBjaGVjayBhbmQgZXJyb3Igc3RhdGVtZW50IG1heSBiZSByZW1vdmVkLgotc3RhdGljX2Fzc2VydCgKLSAgICBCVEFfUEFOX0lOQ0xVREVELAotICAgICIjZGVmaW5lIEJUQV9QQU5fSU5DTFVERUQgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGZsYWcgaXMgdW5zdXBwb3J0ZWQiCi0gICAgIiAgUGFuIHByb2ZpbGUgaXMgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSBibHVldG9vdGggc3RhY2siCi0gICAgIioqKiBDb25kaXRpb25hbCBDb21waWxhdGlvbiBEaXJlY3RpdmUgZXJyb3IiKTsKLQotLy8gT25jZSBQQU5fU1VQUE9SVFNfUk9MRV9OQVAgaXMgbm8gbG9uZ2VyIGV4cG9zZWQgdmlhIGJ0X3RhcmdldC5oCi0vLyB0aGlzIGNoZWNrIGFuZCBlcnJvciBzdGF0ZW1lbnQgbWF5IGJlIHJlbW92ZWQuCi1zdGF0aWNfYXNzZXJ0KAotICAgIFBBTl9TVVBQT1JUU19ST0xFX05BUCwKLSAgICAiI2RlZmluZSBQQU5fU1VQUE9SVFNfUk9MRV9OQVAgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGZsYWcgaXMgdW5zdXBwb3J0ZWQiCi0gICAgIiAgUGFuIHByb2ZpbGUgYWx3YXlzIHN1cHBvcnRzIG5ldHdvcmsgYWNjZXNzIHBvaW50IGluIHRoZSBibHVldG9vdGggc3RhY2siCi0gICAgIioqKiBDb25kaXRpb25hbCBDb21waWxhdGlvbiBEaXJlY3RpdmUgZXJyb3IiKTsKLQotLy8gT25jZSBQQU5fU1VQUE9SVFNfUk9MRV9QQU5VIGlzIG5vIGxvbmdlciBleHBvc2VkIHZpYSBidF90YXJnZXQuaAotLy8gdGhpcyBjaGVjayBhbmQgZXJyb3Igc3RhdGVtZW50IG1heSBiZSByZW1vdmVkLgotc3RhdGljX2Fzc2VydCgKLSAgICBQQU5fU1VQUE9SVFNfUk9MRV9QQU5VLAotICAgICIjZGVmaW5lIFBBTl9TVVBQT1JUU19ST0xFX1BBTlUgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGZsYWcgaXMgIgotICAgICJ1bnN1cHBvcnRlZCIKLSAgICAiICBQYW4gcHJvZmlsZSBhbHdheXMgc3VwcG9ydHMgdXNlciBhcyBhIGNsaWVudCBpbiB0aGUgYmx1ZXRvb3RoIHN0YWNrIgotICAgICIqKiogQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24gRGlyZWN0aXZlIGVycm9yIik7Ci0KLXZvaWQgbWFpbl90aHJlYWRfc2h1dF9kb3duKCk7Ci12b2lkIG1haW5fdGhyZWFkX3N0YXJ0X3VwKCk7Ci12b2lkIEJUQV9kbV9vbl9od19vbigpOwotdm9pZCBCVEFfZG1fb25faHdfb2ZmKCk7Ci0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZDsKLQotc3RhdGljIE1lc3NhZ2VMb29wVGhyZWFkIG1hbmFnZW1lbnRfdGhyZWFkKCJidF9zdGFja19tYW5hZ2VyX3RocmVhZCIpOwotCi0vLyBJZiBpbml0aWFsaXplZCwgYW55IG9mIHRoZSBibHVldG9vdGggQVBJIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLgotLy8gKGUuZy4gdHVybmluZyBsb2dnaW5nIG9uIGFuZCBvZmYsIGVuYWJsaW5nL2Rpc2FibGluZyB0aGUgc3RhY2ssIGV0YykKLXN0YXRpYyBib29sIHN0YWNrX2lzX2luaXRpYWxpemVkOwotLy8gSWYgcnVubmluZywgdGhlIHN0YWNrIGlzIGZ1bGx5IHVwIGFuZCBhYmxlIHRvIGJsdWV0b290aC4KLXN0YXRpYyBib29sIHN0YWNrX2lzX3J1bm5pbmc7Ci0KLXN0YXRpYyB2b2lkIGV2ZW50X2luaXRfc3RhY2sodm9pZCogY29udGV4dCk7Ci1zdGF0aWMgdm9pZCBldmVudF9zdGFydF91cF9zdGFjayh2b2lkKiBjb250ZXh0KTsKLXN0YXRpYyB2b2lkIGV2ZW50X3NodXRfZG93bl9zdGFjayh2b2lkKiBjb250ZXh0KTsKLXN0YXRpYyB2b2lkIGV2ZW50X2NsZWFuX3VwX3N0YWNrKHZvaWQqIGNvbnRleHQpOwotCi1zdGF0aWMgdm9pZCBldmVudF9zaWduYWxfc3RhY2tfdXAodm9pZCogY29udGV4dCk7Ci1zdGF0aWMgdm9pZCBldmVudF9zaWduYWxfc3RhY2tfZG93bih2b2lkKiBjb250ZXh0KTsKLQotLy8gVW52ZXR0ZWQgaW5jbHVkZXMvaW1wb3J0cywgZXRjIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIG9yIHZldHRlZCBpbiB0aGUKLS8vIGZ1dHVyZQotc3RhdGljIGZ1dHVyZV90KiBoYWNrX2Z1dHVyZTsKLS8vIEVuZCB1bnZldHRlZCBzZWN0aW9uCi0KLS8vIEludGVyZmFjZSBmdW5jdGlvbnMKLQotc3RhdGljIHZvaWQgaW5pdF9zdGFjaygpIHsKLSAgLy8gVGhpcyBpcyBhIHN5bmNocm9ub3VzIHByb2Nlc3MuIFBvc3QgaXQgdG8gdGhlIHRocmVhZCB0aG91Z2gsIHNvCi0gIC8vIHN0YXRlIG1vZGlmaWNhdGlvbiBvbmx5IGhhcHBlbnMgdGhlcmUuIFVzaW5nIHRoZSB0aHJlYWQgdG8gcGVyZm9ybQotICAvLyBhbGwgc3RhY2sgb3BlcmF0aW9ucyBlbnN1cmVzIHRoYXQgdGhlIG9wZXJhdGlvbnMgYXJlIGRvbmUgc2VyaWFsbHkKLSAgLy8gYW5kIGRvIG5vdCBvdmVybGFwLgotICBzZW1hcGhvcmVfdCogc2VtYXBob3JlID0gc2VtYXBob3JlX25ldygwKTsKLSAgbWFuYWdlbWVudF90aHJlYWQuRG9JblRocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChldmVudF9pbml0X3N0YWNrLCBzZW1hcGhvcmUpKTsKLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLSAgc2VtYXBob3JlX2ZyZWUoc2VtYXBob3JlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfdXBfc3RhY2tfYXN5bmMoKSB7Ci0gIG1hbmFnZW1lbnRfdGhyZWFkLkRvSW5UaHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoZXZlbnRfc3RhcnRfdXBfc3RhY2ssIG51bGxwdHIpKTsKLX0KLQotc3RhdGljIHZvaWQgc2h1dF9kb3duX3N0YWNrX2FzeW5jKCkgewotICBtYW5hZ2VtZW50X3RocmVhZC5Eb0luVGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGV2ZW50X3NodXRfZG93bl9zdGFjaywgbnVsbHB0cikpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbl91cF9zdGFjaygpIHsKLSAgLy8gVGhpcyBpcyBhIHN5bmNocm9ub3VzIHByb2Nlc3MuIFBvc3QgaXQgdG8gdGhlIHRocmVhZCB0aG91Z2gsIHNvCi0gIC8vIHN0YXRlIG1vZGlmaWNhdGlvbiBvbmx5IGhhcHBlbnMgdGhlcmUuCi0gIHNlbWFwaG9yZV90KiBzZW1hcGhvcmUgPSBzZW1hcGhvcmVfbmV3KDApOwotICBtYW5hZ2VtZW50X3RocmVhZC5Eb0luVGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGV2ZW50X2NsZWFuX3VwX3N0YWNrLCBzZW1hcGhvcmUpKTsKLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLSAgc2VtYXBob3JlX2ZyZWUoc2VtYXBob3JlKTsKLSAgbWFuYWdlbWVudF90aHJlYWQuU2h1dERvd24oKTsKLX0KLQotc3RhdGljIGJvb2wgZ2V0X3N0YWNrX2lzX3J1bm5pbmcoKSB7IHJldHVybiBzdGFja19pc19ydW5uaW5nOyB9Ci0KLS8vIEludGVybmFsIGZ1bmN0aW9ucwotCi0jaWZkZWYgU1RBVElDX0xJQkJMVUVUT09USAotZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGJ0X3V0aWxzX21vZHVsZTsKLWV4dGVybiBjb25zdCBtb2R1bGVfdCBidGVfbG9nbXNnX21vZHVsZTsKLWV4dGVybiBjb25zdCBtb2R1bGVfdCBidGlmX2NvbmZpZ19tb2R1bGU7Ci1leHRlcm4gY29uc3QgbW9kdWxlX3QgYnRzbm9vcF9tb2R1bGU7Ci1leHRlcm4gY29uc3QgbW9kdWxlX3QgYnRfdXRpbHNfbW9kdWxlOwotZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGdkX2NvbnRyb2xsZXJfbW9kdWxlOwotZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGdkX2lkbGVfbW9kdWxlOwotZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGdkX3NoaW1fbW9kdWxlOwotZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGhjaV9tb2R1bGU7Ci1leHRlcm4gY29uc3QgbW9kdWxlX3QgaW50ZXJvcF9tb2R1bGU7Ci1leHRlcm4gY29uc3QgbW9kdWxlX3Qgb3NpX21vZHVsZTsKLWV4dGVybiBjb25zdCBtb2R1bGVfdCBzdGFja19jb25maWdfbW9kdWxlOwotCi1zdHJ1Y3QgbW9kdWxlX2xvb2t1cCB7Ci0gIGNvbnN0IGNoYXIqIG5hbWU7Ci0gIGNvbnN0IG1vZHVsZV90KiBtb2R1bGU7Ci19OwotCi1jb25zdCBzdHJ1Y3QgbW9kdWxlX2xvb2t1cCBtb2R1bGVfdGFibGVbXSA9IHsKLSAgICB7QlRFX0xPR01TR19NT0RVTEUsICZidGVfbG9nbXNnX21vZHVsZX0sCi0gICAge0JUSUZfQ09ORklHX01PRFVMRSwgJmJ0aWZfY29uZmlnX21vZHVsZX0sCi0gICAge0JUU05PT1BfTU9EVUxFLCAmYnRzbm9vcF9tb2R1bGV9LAotICAgIHtCVF9VVElMU19NT0RVTEUsICZidF91dGlsc19tb2R1bGV9LAotICAgIHtHRF9DT05UUk9MTEVSX01PRFVMRSwgJmdkX2NvbnRyb2xsZXJfbW9kdWxlfSwKLSAgICB7R0RfSURMRV9NT0RVTEUsICZnZF9pZGxlX21vZHVsZX0sCi0gICAge0dEX1NISU1fTU9EVUxFLCAmZ2Rfc2hpbV9tb2R1bGV9LAotICAgIHtJTlRFUk9QX01PRFVMRSwgJmludGVyb3BfbW9kdWxlfSwKLSAgICB7T1NJX01PRFVMRSwgJm9zaV9tb2R1bGV9LAotICAgIHtTVEFDS19DT05GSUdfTU9EVUxFLCAmc3RhY2tfY29uZmlnX21vZHVsZX0sCi0gICAge05VTEwsIE5VTEx9LAotfTsKLQotaW5saW5lIGNvbnN0IG1vZHVsZV90KiBnZXRfbG9jYWxfbW9kdWxlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKLQotICBmb3IgKGNvbnN0IHN0cnVjdCBtb2R1bGVfbG9va3VwKiBsID0gbW9kdWxlX3RhYmxlOyBsLT5tb2R1bGU7IGwrKykgewotICAgIGlmIChzdHJuY21wKGwtPm5hbWUsIG5hbWUsIGxlbikgPT0gMCkgewotICAgICAgcmV0dXJuIGwtPm1vZHVsZTsKLSAgICB9Ci0gIH0KLQotICBMT0dfQUxXQVlTX0ZBVEFMKCJDYW5ub3QgZmluZCBtb2R1bGUgJXMsIGFib3J0aW5nIiwgbmFtZSk7Ci0gIHJldHVybiBudWxscHRyOwotfQotI2Vsc2UKLWlubGluZSBjb25zdCBtb2R1bGVfdCogZ2V0X2xvY2FsX21vZHVsZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHJldHVybiBnZXRfbW9kdWxlKG5hbWUpOwotfQotI2VuZGlmCi0KLS8vIFN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHN0YWNrCi1zdGF0aWMgdm9pZCBldmVudF9pbml0X3N0YWNrKHZvaWQqIGNvbnRleHQpIHsKLSAgc2VtYXBob3JlX3QqIHNlbWFwaG9yZSA9IChzZW1hcGhvcmVfdCopY29udGV4dDsKLQotICBMT0dfSU5GTygiaXMgaW5pdGlhbGl6aW5nIHRoZSBzdGFjayIpOwotCi0gIGlmIChzdGFja19pc19pbml0aWFsaXplZCkgewotICAgIExPR19JTkZPKCJmb3VuZCB0aGUgc3RhY2sgYWxyZWFkeSBpbiBpbml0aWFsaXplZCBzdGF0ZSIpOwotICB9IGVsc2UgewotICAgIG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0KCk7Ci0KLSAgICBtb2R1bGVfaW5pdChnZXRfbG9jYWxfbW9kdWxlKE9TSV9NT0RVTEUpKTsKLSAgICBtb2R1bGVfaW5pdChnZXRfbG9jYWxfbW9kdWxlKEJUX1VUSUxTX01PRFVMRSkpOwotICAgIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICAgIG1vZHVsZV9zdGFydF91cChnZXRfbG9jYWxfbW9kdWxlKEdEX0lETEVfTU9EVUxFKSk7Ci0gICAgfQotICAgIG1vZHVsZV9pbml0KGdldF9sb2NhbF9tb2R1bGUoQlRJRl9DT05GSUdfTU9EVUxFKSk7Ci0gICAgYnRpZl9pbml0X2JsdWV0b290aCgpOwotCi0gICAgbW9kdWxlX2luaXQoZ2V0X2xvY2FsX21vZHVsZShJTlRFUk9QX01PRFVMRSkpOwotICAgIGJ0ZV9tYWluX2luaXQoKTsKLSAgICBtb2R1bGVfaW5pdChnZXRfbG9jYWxfbW9kdWxlKFNUQUNLX0NPTkZJR19NT0RVTEUpKTsKLQotICAgIC8vIHN0YWNrIGluaXQgaXMgc3luY2hyb25vdXMsIHNvIG5vIHdhaXRpbmcgbmVjZXNzYXJ5IGhlcmUKLSAgICBzdGFja19pc19pbml0aWFsaXplZCA9IHRydWU7Ci0gIH0KLQotICBMT0dfSU5GTygiZmluaXNoZWQiKTsKLQotICBpZiAoc2VtYXBob3JlKSBzZW1hcGhvcmVfcG9zdChzZW1hcGhvcmUpOwotfQotCi1zdGF0aWMgdm9pZCBlbnN1cmVfc3RhY2tfaXNfaW5pdGlhbGl6ZWQoKSB7Ci0gIGlmICghc3RhY2tfaXNfaW5pdGlhbGl6ZWQpIHsKLSAgICBMT0dfV0FSTigiJXMgZm91bmQgdGhlIHN0YWNrIHdhcyB1bmluaXRpYWxpemVkLiBJbml0aWFsaXppbmcgbm93LiIsCi0gICAgICAgICAgICAgX19mdW5jX18pOwotICAgIC8vIE5vIHNlbWFwaG9yZSBuZWVkZWQgc2luY2Ugd2UgYXJlIGNhbGxpbmcgaXQgZGlyZWN0bHkKLSAgICBldmVudF9pbml0X3N0YWNrKG51bGxwdHIpOwotICB9Ci19Ci0KLS8vIFN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIHN0YXJ0IHVwIHRoZSBzdGFjawotc3RhdGljIHZvaWQgZXZlbnRfc3RhcnRfdXBfc3RhY2soVU5VU0VEX0FUVFIgdm9pZCogY29udGV4dCkgewotICBpZiAoc3RhY2tfaXNfcnVubmluZykgewotICAgIExPR19JTkZPKCIlcyBzdGFjayBhbHJlYWR5IGJyb3VnaHQgdXAiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZW5zdXJlX3N0YWNrX2lzX2luaXRpYWxpemVkKCk7Ci0KLSAgTE9HX0lORk8oIiVzIGlzIGJyaW5naW5nIHVwIHRoZSBzdGFjayIsIF9fZnVuY19fKTsKLSAgZnV0dXJlX3QqIGxvY2FsX2hhY2tfZnV0dXJlID0gZnV0dXJlX25ldygpOwotICBoYWNrX2Z1dHVyZSA9IGxvY2FsX2hhY2tfZnV0dXJlOwotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBMT0dfSU5GTygiJXMgR2Qgc2hpbSBtb2R1bGUgZW5hYmxlZCIsIF9fZnVuY19fKTsKLSAgICBtb2R1bGVfc2h1dF9kb3duKGdldF9sb2NhbF9tb2R1bGUoR0RfSURMRV9NT0RVTEUpKTsKLSAgICBtb2R1bGVfc3RhcnRfdXAoZ2V0X2xvY2FsX21vZHVsZShHRF9TSElNX01PRFVMRSkpOwotICAgIG1vZHVsZV9zdGFydF91cChnZXRfbG9jYWxfbW9kdWxlKEJUSUZfQ09ORklHX01PRFVMRSkpOwotICB9IGVsc2UgewotICAgIG1vZHVsZV9zdGFydF91cChnZXRfbG9jYWxfbW9kdWxlKEJUSUZfQ09ORklHX01PRFVMRSkpOwotICAgIG1vZHVsZV9zdGFydF91cChnZXRfbG9jYWxfbW9kdWxlKEJUU05PT1BfTU9EVUxFKSk7Ci0gIH0KLQotICBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saWZlY3ljbGUuYnRtX2luaXQoKTsKLSAgbDJjX2luaXQoKTsKLSAgc2RwX2luaXQoKTsKLSAgZ2F0dF9pbml0KCk7Ci0gIFNNUF9Jbml0KCk7Ci0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1fYmxlX2luaXQoKTsKLQotICBSRkNPTU1fSW5pdCgpOwotI2lmIChCTkVQX0lOQ0xVREVEID09IFRSVUUpCi0gIEJORVBfSW5pdCgpOwotI2lmIChQQU5fSU5DTFVERUQgPT0gVFJVRSkKLSAgUEFOX0luaXQoKTsKLSNlbmRpZiAvKiBQQU4gKi8KLSNlbmRpZiAvKiBCTkVQIEluY2x1ZGVkICovCi0gIEEyRFBfSW5pdCgpOwotICBBVlJDX0luaXQoKTsKLSAgR0FQX0luaXQoKTsKLSNpZiAoSElEX0hPU1RfSU5DTFVERUQgPT0gVFJVRSkKLSAgSElEX0hvc3RJbml0KCk7Ci0jZW5kaWYKLQotICBidGFfc3lzX2luaXQoKTsKLSAgYnRhX2FyX2luaXQoKTsKLSAgbW9kdWxlX2luaXQoZ2V0X2xvY2FsX21vZHVsZShCVEVfTE9HTVNHX01PRFVMRSkpOwotCi0gIG1haW5fdGhyZWFkX3N0YXJ0X3VwKCk7Ci0KLSAgYnRpZl9pbml0X29rKCk7Ci0gIEJUQV9kbV9pbml0KCk7Ci0gIGJ0YV9kbV9lbmFibGUoYnRlX2RtX2V2dCk7Ci0KLSAgYnRhX3NldF9mb3J3YXJkX2h3X2ZhaWx1cmVzKHRydWUpOwotICBidG1fYWNsX2RldmljZV9kb3duKCk7Ci0gIENIRUNLKG1vZHVsZV9zdGFydF91cChnZXRfbG9jYWxfbW9kdWxlKEdEX0NPTlRST0xMRVJfTU9EVUxFKSkpOwotICBCVE1fcmVzZXRfY29tcGxldGUoKTsKLQotICBCVEFfZG1fb25faHdfb24oKTsKLQotICBpZiAoZnV0dXJlX2F3YWl0KGxvY2FsX2hhY2tfZnV0dXJlKSAhPSBGVVRVUkVfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXMgZmFpbGVkIHRvIHN0YXJ0IHVwIHRoZSBzdGFjayIsIF9fZnVuY19fKTsKLSAgICBzdGFja19pc19ydW5uaW5nID0gdHJ1ZTsgIC8vIFNvIHN0YWNrIHNodXRkb3duIGFjdHVhbGx5IGhhcHBlbnMKLSAgICBldmVudF9zaHV0X2Rvd25fc3RhY2sobnVsbHB0cik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RhY2tfaXNfcnVubmluZyA9IHRydWU7Ci0gIExPR19JTkZPKCIlcyBmaW5pc2hlZCIsIF9fZnVuY19fKTsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoZXZlbnRfc2lnbmFsX3N0YWNrX3VwLCBudWxscHRyKSk7Ci19Ci0KLS8vIFN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIHNodXQgZG93biB0aGUgc3RhY2sKLXN0YXRpYyB2b2lkIGV2ZW50X3NodXRfZG93bl9zdGFjayhVTlVTRURfQVRUUiB2b2lkKiBjb250ZXh0KSB7Ci0gIGlmICghc3RhY2tfaXNfcnVubmluZykgewotICAgIExPR19JTkZPKCIlcyBzdGFjayBpcyBhbHJlYWR5IGJyb3VnaHQgZG93biIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBMT0dfSU5GTygiJXMgaXMgYnJpbmdpbmcgZG93biB0aGUgc3RhY2siLCBfX2Z1bmNfXyk7Ci0gIGZ1dHVyZV90KiBsb2NhbF9oYWNrX2Z1dHVyZSA9IGZ1dHVyZV9uZXcoKTsKLSAgaGFja19mdXR1cmUgPSBsb2NhbF9oYWNrX2Z1dHVyZTsKLSAgc3RhY2tfaXNfcnVubmluZyA9IGZhbHNlOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRtX2JsZV9tdWx0aV9hZHZfY2xlYW51cCkpOwotCi0gIGJ0aWZfZG1fb25fZGlzYWJsZSgpOwotICBidGlmX3NvY2tfY2xlYW51cCgpOwotICBidGlmX3Bhbl9jbGVhbnVwKCk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0YV9kbV9kaXNhYmxlKSk7Ci0KLSAgZnV0dXJlX2F3YWl0KGxvY2FsX2hhY2tfZnV0dXJlKTsKLSAgbG9jYWxfaGFja19mdXR1cmUgPSBmdXR1cmVfbmV3KCk7Ci0gIGhhY2tfZnV0dXJlID0gbG9jYWxfaGFja19mdXR1cmU7Ci0KLSAgYnRhX3N5c19kaXNhYmxlKCk7Ci0gIGJ0YV9zZXRfZm9yd2FyZF9od19mYWlsdXJlcyhmYWxzZSk7Ci0gIEJUQV9kbV9vbl9od19vZmYoKTsKLQotICBtb2R1bGVfc2h1dF9kb3duKGdldF9sb2NhbF9tb2R1bGUoQlRJRl9DT05GSUdfTU9EVUxFKSk7Ci0KLSAgZnV0dXJlX2F3YWl0KGxvY2FsX2hhY2tfZnV0dXJlKTsKLQotICBtYWluX3RocmVhZF9zaHV0X2Rvd24oKTsKLQotICBtb2R1bGVfY2xlYW5fdXAoZ2V0X2xvY2FsX21vZHVsZShCVEVfTE9HTVNHX01PRFVMRSkpOwotCi0gIGdhdHRfZnJlZSgpOwotICBsMmNfZnJlZSgpOwotICBzZHBfZnJlZSgpOwotICBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saWZlY3ljbGUuYnRtX2JsZV9mcmVlKCk7Ci0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1fZnJlZSgpOwotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBMT0dfSU5GTygiJXMgR2Qgc2hpbSBtb2R1bGUgZGlzYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgbW9kdWxlX3NodXRfZG93bihnZXRfbG9jYWxfbW9kdWxlKEdEX1NISU1fTU9EVUxFKSk7Ci0gICAgbW9kdWxlX3N0YXJ0X3VwKGdldF9sb2NhbF9tb2R1bGUoR0RfSURMRV9NT0RVTEUpKTsKLSAgfSBlbHNlIHsKLSAgICBtb2R1bGVfc2h1dF9kb3duKGdldF9sb2NhbF9tb2R1bGUoQlRTTk9PUF9NT0RVTEUpKTsKLSAgfQotCi0gIGhhY2tfZnV0dXJlID0gZnV0dXJlX25ldygpOwotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChldmVudF9zaWduYWxfc3RhY2tfZG93biwgbnVsbHB0cikpOwotICBmdXR1cmVfYXdhaXQoaGFja19mdXR1cmUpOwotICBMT0dfSU5GTygiJXMgZmluaXNoZWQiLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuc3VyZV9zdGFja19pc19ub3RfcnVubmluZygpIHsKLSAgaWYgKHN0YWNrX2lzX3J1bm5pbmcpIHsKLSAgICBMT0dfV0FSTigiJXMgZm91bmQgdGhlIHN0YWNrIHdhcyBzdGlsbCBydW5uaW5nLiBCcmluZ2luZyBpdCBkb3duIG5vdy4iLAotICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBldmVudF9zaHV0X2Rvd25fc3RhY2sobnVsbHB0cik7Ci0gIH0KLX0KLQotLy8gU3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlIHN0YWNrCi1zdGF0aWMgdm9pZCBldmVudF9jbGVhbl91cF9zdGFjayh2b2lkKiBjb250ZXh0KSB7Ci0gIGlmICghc3RhY2tfaXNfaW5pdGlhbGl6ZWQpIHsKLSAgICBMT0dfSU5GTygiJXMgZm91bmQgdGhlIHN0YWNrIGFscmVhZHkgaW4gYSBjbGVhbiBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGNsZWFudXA7Ci0gIH0KLQotICBlbnN1cmVfc3RhY2tfaXNfbm90X3J1bm5pbmcoKTsKLQotICBMT0dfSU5GTygiJXMgaXMgY2xlYW5pbmcgdXAgdGhlIHN0YWNrIiwgX19mdW5jX18pOwotICBzdGFja19pc19pbml0aWFsaXplZCA9IGZhbHNlOwotCi0gIGJ0aWZfY2xlYW51cF9ibHVldG9vdGgoKTsKLQotICBtb2R1bGVfY2xlYW5fdXAoZ2V0X2xvY2FsX21vZHVsZShTVEFDS19DT05GSUdfTU9EVUxFKSk7Ci0gIG1vZHVsZV9jbGVhbl91cChnZXRfbG9jYWxfbW9kdWxlKElOVEVST1BfTU9EVUxFKSk7Ci0KLSAgbW9kdWxlX2NsZWFuX3VwKGdldF9sb2NhbF9tb2R1bGUoQlRJRl9DT05GSUdfTU9EVUxFKSk7Ci0gIG1vZHVsZV9jbGVhbl91cChnZXRfbG9jYWxfbW9kdWxlKEJUX1VUSUxTX01PRFVMRSkpOwotICBtb2R1bGVfY2xlYW5fdXAoZ2V0X2xvY2FsX21vZHVsZShPU0lfTU9EVUxFKSk7Ci0gIG1vZHVsZV9zaHV0X2Rvd24oZ2V0X2xvY2FsX21vZHVsZShHRF9JRExFX01PRFVMRSkpOwotICBtb2R1bGVfbWFuYWdlbWVudF9zdG9wKCk7Ci0gIExPR19JTkZPKCIlcyBmaW5pc2hlZCIsIF9fZnVuY19fKTsKLQotY2xlYW51cDo7Ci0gIHNlbWFwaG9yZV90KiBzZW1hcGhvcmUgPSAoc2VtYXBob3JlX3QqKWNvbnRleHQ7Ci0gIGlmIChzZW1hcGhvcmUpIHNlbWFwaG9yZV9wb3N0KHNlbWFwaG9yZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV2ZW50X3NpZ25hbF9zdGFja191cChVTlVTRURfQVRUUiB2b2lkKiBjb250ZXh0KSB7Ci0gIC8vIE5vdGlmeSBCVElGIGNvbm5lY3QgcXVldWUgdGhhdCB3ZSd2ZSBicm91Z2h0IHVwIHRoZSBzdGFjay4gSXQncwotICAvLyBub3cgdGltZSB0byBkaXNwYXRjaCBhbGwgdGhlIHBlbmRpbmcgcHJvZmlsZSBjb25uZWN0IHJlcXVlc3RzLgotICBidGlmX3F1ZXVlX2Nvbm5lY3RfbmV4dCgpOwotICBpbnZva2VfYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiKEJUX1NUQVRFX09OKTsKLX0KLQotc3RhdGljIHZvaWQgZXZlbnRfc2lnbmFsX3N0YWNrX2Rvd24oVU5VU0VEX0FUVFIgdm9pZCogY29udGV4dCkgewotICBpbnZva2VfYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiKEJUX1NUQVRFX09GRik7Ci0gIGZ1dHVyZV9yZWFkeShzdGFja19tYW5hZ2VyX2dldF9oYWNrX2Z1dHVyZSgpLCBGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuc3VyZV9tYW5hZ2VyX2luaXRpYWxpemVkKCkgewotICBpZiAobWFuYWdlbWVudF90aHJlYWQuSXNSdW5uaW5nKCkpIHJldHVybjsKLQotICBtYW5hZ2VtZW50X3RocmVhZC5TdGFydFVwKCk7Ci0gIGlmICghbWFuYWdlbWVudF90aHJlYWQuSXNSdW5uaW5nKCkpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBzdGFydCBzdGFjayBtYW5hZ2VtZW50IHRocmVhZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IHN0YWNrX21hbmFnZXJfdCBpbnRlcmZhY2UgPSB7aW5pdF9zdGFjaywgc3RhcnRfdXBfc3RhY2tfYXN5bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0X2Rvd25fc3RhY2tfYXN5bmMsIGNsZWFuX3VwX3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3N0YWNrX2lzX3J1bm5pbmd9OwotCi1jb25zdCBzdGFja19tYW5hZ2VyX3QqIHN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpIHsKLSAgZW5zdXJlX21hbmFnZXJfaW5pdGlhbGl6ZWQoKTsKLSAgcmV0dXJuICZpbnRlcmZhY2U7Ci19Ci0KLWZ1dHVyZV90KiBzdGFja19tYW5hZ2VyX2dldF9oYWNrX2Z1dHVyZSgpIHsgcmV0dXJuIGhhY2tfZnV0dXJlOyB9CmRpZmYgLS1naXQgYS9idGlmL3Rlc3QvYnRpZl9jb25maWdfY2FjaGVfdGVzdC5jYyBiL2J0aWYvdGVzdC9idGlmX2NvbmZpZ19jYWNoZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDMwMzFkLi4wMDAwMDAwCi0tLSBhL2J0aWYvdGVzdC9idGlmX2NvbmZpZ19jYWNoZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWdfY2FjaGUuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGZpbGVzeXN0ZW0+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBpbnQga0NhcGFjaXR5ID0gMzsKLWNvbnN0IGludCBrVGVzdFJlcGVhdENvdW50ID0gMzA7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGRyMSA9ICIxMToyMjozMzo0NDo1NTo2NiI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGRyMiA9ICJBQTpCQjpDQzpERDpFRTpGRiI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGRyMyA9ICJBQjpDRDpFRjoxMjozNDo1NiI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGRyNCA9ICIxMTpBQToyMjpCQjozMzpDQyI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGRyNSA9ICIxMTpBQToyMjpCQjozMzpDRCI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRMb2NhbEFkZHIgPSAiMTI6MzQ6NTY6Nzg6OTA6QUIiOwotY29uc3Qgc3RkOjpzdHJpbmcga0J0SW5mbyA9ICJJbmZvIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCdE1ldHJpY3MgPSAiTWV0cmljcyI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGFwdGVyID0gIkFkYXB0ZXIiOwotY29uc3Qgc3RkOjpzdHJpbmcga0J0QWRkckludmFsaWQxID0gIkFCOkNEOkVGOjEyOjM0IjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCdEFkZHJJbnZhbGlkMiA9ICJBQjpDRDpFRjoxMjozNDo1Njo3OCI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRBZGRySW52YWxpZDMgPSAiQUJDREVGMTIzNDU2IjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCdEFkZHJJbnZhbGlkNCA9ICJBQi1DRC1FRi0xMi0zNC01NiI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQnRTZWN0aW9uSW52YWxpZDEgPSAiSW52YWxpZCBTZWN0aW9uIjsKLWNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCBrVGVzdENvbmZpZ0ZpbGUgPQotICAgIHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpIC8gImNvbmZpZ19jYWNoZV90ZXN0LmNvbmYiOwotY29uc3QgY2hhciogVEVTVF9DT05GSUdfRklMRSA9IGtUZXN0Q29uZmlnRmlsZS5jX3N0cigpOwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vKiBUZXN0IHRvIGJhc2ljIGJ0aWZfY29uZmlnX2NhY2hlIHNldCB1cAotICogMS4gd2hlbiByZWNlaXZlZCBMb2NhbCBkZXZpY2Ugc2VjdGlvbnMgaW5mb3JtYXRpb24sIHRoZSBzZWN0aW9ucyBjYW4gYmUgcHV0Ci0gKiBpbnRvIGJ0aWYgY29uZmlnIGNhY2hlCi0gKiAyLiB0aGUgZGV2aWNlIHNlY3Rpb25zIGFuZCBrZXktdmFsdWUgd2lsbCBiZSBzZXQgdG8gQnRpZiBjb25maWcgY2FjaGUgd2hlbgotICogcmVjZWl2aW5nIGRpZmZlcmVudCBkZXZpY2Ugc2VjdGlvbnMKLSAqIDMuIGxpbWl0IHRoZSBjYXBhY2l0eSBvZiB1bnBhY2lyZSBkZXZpY2VzIGNhY2hlIHRvIDMsIHRlc3QgdGhlIG9sZGVzdCBkZXZpY2UKLSAqIHNlY3Rpb24gd2lsbCBiZSBydWxlZCBvdXQgd2hlbiByZWNlaXZlaW5nIDQgZGlmZmVyZW50IGRldmljZSBzZWN0aW9ucy4KLSAqLwotVEVTVChCdGlmQ29uZmlnQ2FjaGVUZXN0LCB0ZXN0X3NldHVwX2J0aWZfY29uZmlnX2NhY2hlKSB7Ci0gIEJ0aWZDb25maWdDYWNoZSB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlKGtDYXBhY2l0eSk7Ci0gIC8vIEluZm8gc2VjdGlvbgotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRJbmZvLCAiRmlsZVNvdXJjZSIsICIiKTsKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0SW5mbywgIlRpbWVDcmVhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAtMDYtMDUgMTI6MTI6MTIiKTsKLSAgLy8gTWV0cmljcyBzZWN0aW9uCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdE1ldHJpY3MsICJTYWx0MjU2Qml0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkyYTMzMTE3NGQyMGYyYmIiKTsKLSAgLy8gQWRhcHRlciBTZWN0aW9uCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkYXB0ZXIsICJBZGRyZXNzIiwga0J0TG9jYWxBZGRyKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNTZWN0aW9uKGtCdEFkYXB0ZXIpKTsKLQotICAvLyBidF9kZXZpY2VfMQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiLCAiSGVhZHNldF8xIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiTmFtZSIpKTsKLQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldEludChrQnRBZGRyMSwgIlByb3BlcnR5X0ludCIsIDEpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyMSwgIlByb3BlcnR5X0ludCIpKTsKLQotICAvLyBidF9kZXZpY2VfMgotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMiwgIk5hbWUiLCAiSGVhZHNldF8yIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIyLCAiTmFtZSIpKTsKLQotICAvLyBidF9kZXZpY2VfMwotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMywgIk5hbWUiLCAiSGVhZHNldF8zIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIzLCAiTmFtZSIpKTsKLQotICAvLyBidF9kZXZpY2VfNAotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyNCwgIk5hbWUiLCAiSGVhZHNldF80Iik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHI0LCAiTmFtZSIpKTsKLQotICAvLyBvdXQgb3V0IHRoZSBjYXBhY3R5IG9mIHVucGFpciBkZXZpY2VzIGNhY2hlLCB0aGUgYnRfZGV2aWNlXzEgYmUgcnVsZWQgb3V0Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1NlY3Rpb24oa0J0QWRkcjEpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNTZWN0aW9uKGtCdEFkZHIyKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzU2VjdGlvbihrQnRBZGRyMykpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1NlY3Rpb24oa0J0QWRkcjQpKTsKLX0KLQotLyogVGVzdCB0byBzZXQgdXAgYnRpZl9jb25maWdfY2FjaGUgd2l0aCBpbnZhbGlkIGJ0IGFkZHJlc3Mgb3Igc2VjdGlvbiBuYW1lCi0gKiB3aGVuIHJlY2VpdmVkIEludmFsaWQgYnQgYWRkcmVzcyBvciBzZWN0aW9uLCBpdCdzIG5vdCBhbGxvd2VkIHRvIHB1dCBpbnZhbGlkCi0gKiBzZWN0aW9uIHRvIHBhaXJlZCBkZXZpY2VzIGxpc3Qgc2VjdGlvbgotICovCi1URVNUKEJ0aWZDb25maWdDYWNoZVRlc3QsIHRlc3Rfc2V0X3VwX2NvbmZpZ19jYWNoZV93aXRoX2ludmFsaWRfc2VjdGlvbikgewotICBCdGlmQ29uZmlnQ2FjaGUgdGVzdF9idGlmX2NvbmZpZ19jYWNoZShrQ2FwYWNpdHkpOwotCi0gIC8vIGtCdEFkZHJJbnZhbGlkMQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRySW52YWxpZDEsICJOYW1lIiwgIkhlYWRzZXRfMSIpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRySW52YWxpZDEsICJOYW1lIikpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRySW52YWxpZDEpKTsKLSAgLy8gZ2V0IHRoZSBMaW5rS2V5Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHJJbnZhbGlkMSwgIkxpbmtLZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTEyMjMzNDQ1NTY2Nzc4OCIpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRySW52YWxpZDEsICJMaW5rS2V5IikpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRySW52YWxpZDEpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkckludmFsaWQxKSk7Ci0KLSAgLy8ga0J0QWRkckludmFsaWQyCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHJJbnZhbGlkMiwgIk5hbWUiLCAiSGVhZHNldF8xIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHJJbnZhbGlkMiwgIk5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHJJbnZhbGlkMikpOwotICAvLyBnZXQgdGhlIExpbmtLZXkKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkckludmFsaWQyLCAiTGlua0tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMTIyMzM0NDU1NjY3Nzg4Iik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHJJbnZhbGlkMiwgIkxpbmtLZXkiKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHJJbnZhbGlkMikpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRBZGRySW52YWxpZDIpKTsKLQotICAvLyBrQnRBZGRySW52YWxpZDMKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkckludmFsaWQzLCAiTmFtZSIsICJIZWFkc2V0XzEiKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkckludmFsaWQzLCAiTmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNVbnBhaXJlZFNlY3Rpb24oa0J0QWRkckludmFsaWQzKSk7Ci0gIC8vIGdldCB0aGUgTGlua0tleQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRySW52YWxpZDMsICJMaW5rS2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjExMjIzMzQ0NTU2Njc3ODgiKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkckludmFsaWQzLCAiTGlua0tleSIpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNVbnBhaXJlZFNlY3Rpb24oa0J0QWRkckludmFsaWQzKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHJJbnZhbGlkMykpOwotCi0gIC8vIGtCdEFkZHJJbnZhbGlkNAotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRySW52YWxpZDQsICJOYW1lIiwgIkhlYWRzZXRfMSIpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRySW52YWxpZDQsICJOYW1lIikpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRySW52YWxpZDQpKTsKLSAgLy8gZ2V0IHRoZSBMaW5rS2V5Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHJJbnZhbGlkNCwgIkxpbmtLZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTEyMjMzNDQ1NTY2Nzc4OCIpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRySW52YWxpZDQsICJMaW5rS2V5IikpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRySW52YWxpZDQpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkckludmFsaWQ0KSk7Ci0KLSAgLy8ga0J0U2VjdGlvbkludmFsaWQxCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdFNlY3Rpb25JbnZhbGlkMSwgIk5hbWUiLCAiSGVhZHNldF8xIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdFNlY3Rpb25JbnZhbGlkMSwgIk5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdFNlY3Rpb25JbnZhbGlkMSkpOwotICAvLyBnZXQgdGhlIExpbmtLZXkKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0U2VjdGlvbkludmFsaWQxLCAiTGlua0tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMTIyMzM0NDU1NjY3Nzg4Iik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdFNlY3Rpb25JbnZhbGlkMSwgIkxpbmtLZXkiKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdFNlY3Rpb25JbnZhbGlkMSkpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRTZWN0aW9uSW52YWxpZDEpKTsKLX0KLQotLyogU3RyZXNzIHRlc3QgdG8gc2V0IGFuZCBnZXQga2V5IHZhbHVlcwotICogMS4gc3RyZXNzIHRlc3QgdG8gc2V0IGRpZmZlcmVudCB0eXBlIGtleSB2YWx1ZSB0byB1bnBhaXJlZCBkZXZpY2UgY2FjaGUgYW5kCi0gKiBnZXQgdGhlIGRpZmZlcmVudCB0eXBlIGtleSB2YWx1ZXMgaW4gdGhlIHVucGFpcmVkIGNhY2hlIHNlY3Rpb24gdG8gY2hlY2sgaWYKLSAqIHdlIGdldCB0aGUga2V5LXZhbHVlcyB0aGUgc2FtZSB3aXRoIHdlIHNldCBpbiB1bnBhaXJlZCBkZXZpY2UgY2FjaGUuCi0gKiAyLiBzdHJlc3MgdGVzdCB0byBzZXQgZGlmZmVyZW50IHR5cGUga2V5IHZhbHVlIHRvIHBhaXJlZCBkZXZpY2Ugc2VjdGlvbiBhbmQKLSAqIGdldCB0aGUgZGlmZmVyZW50IHR5cGUga2V5IHZhbHVlcyBpbiB0aGUgcGFpcmVkIGNhY2hlIHNlY3Rpb24gdG8gY2hlY2sgaWYgd2UKLSAqIGdldCB0aGUga2V5LXZhbHVlcyB0aGUgc2FtZSB3aXRoIHdlIHNldCBpbiBwYWlyZWQgZGV2aWNlIGNhY2hlLgotICovCi1URVNUKEJ0aWZDb25maWdDYWNoZVRlc3QsIHRlc3RfZ2V0X3NldF9rZXlfdmFsdWVfdGVzdCkgewotICBCdGlmQ29uZmlnQ2FjaGUgdGVzdF9idGlmX2NvbmZpZ19jYWNoZShrQ2FwYWNpdHkpOwotICAvLyB0ZXN0IGluIHVucGFpcmVkIGNhY2hlCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIxLCAiTmFtZSIsICJIZWFkc2V0XzEiKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjEsICJOYW1lIikpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoU3RyRXEoIkhlYWRzZXRfMSIpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRJbnQoa0J0QWRkcjEsICJQcm9wZXJ0eV9JbnQiLCA2NTUzNik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiUHJvcGVydHlfSW50IikpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldEludChrQnRBZGRyMSwgIlByb3BlcnR5X0ludCIpLAotICAgICAgICAgICAgICBPcHRpb25hbChFcSg2NTUzNikpKTsKLQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFVpbnQ2NChrQnRBZGRyMSwgIlByb3BlcnR5XzY0IiwgNDI5NDk2NzI5Nik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiUHJvcGVydHlfNjQiKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0VWludDY0KGtCdEFkZHIxLCAiUHJvcGVydHlfNjQiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoRXEodWludDY0X3QoNDI5NDk2NzI5NikpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRCb29sKGtCdEFkZHIxLCAiUHJvcGVydHlfQm9vbCIsIHRydWUpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyMSwgIlByb3BlcnR5X0Jvb2wiKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0Qm9vbChrQnRBZGRyMSwgIlByb3BlcnR5X0Jvb2wiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoSXNUcnVlKCkpKTsKLQotICAvLyBlbXB0eSB2YWx1ZQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiLCAiIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiTmFtZSIpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCIiKSkpOwotCi0gIC8vIGdldCB0aGUgTGlua0tleQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIkxpbmtLZXkiLCAiMTEyMjMzNDQ1NTY2Nzc4OCIpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyMSwgIkxpbmtLZXkiKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRyMSkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0KLSAgLy8gdGVzdCBpbiB1bnBhaXJlZCBjYWNoZQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiLCAiSGVhZHNldF8xIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiTmFtZSIpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJIZWFkc2V0XzEiKSkpOwotCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0SW50KGtCdEFkZHIxLCAiUHJvcGVydHlfSW50IiwgNjU1MzYpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyMSwgIlByb3BlcnR5X0ludCIpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRJbnQoa0J0QWRkcjEsICJQcm9wZXJ0eV9JbnQiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoRXEoNjU1MzYpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRVaW50NjQoa0J0QWRkcjEsICJQcm9wZXJ0eV82NCIsIDQyOTQ5NjcyOTYpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyMSwgIlByb3BlcnR5XzY0IikpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFVpbnQ2NChrQnRBZGRyMSwgIlByb3BlcnR5XzY0IiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKEVxKHVpbnQ2NF90KDQyOTQ5NjcyOTYpKSkpOwotCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0Qm9vbChrQnRBZGRyMSwgIlByb3BlcnR5X0Jvb2wiLCB0cnVlKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjEsICJQcm9wZXJ0eV9Cb29sIikpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldEJvb2woa0J0QWRkcjEsICJQcm9wZXJ0eV9Cb29sIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKElzVHJ1ZSgpKSk7Ci0KLSAgLy8gZW1wdHkgc2VjdGlvbiBpcyBkaXNhbGxvd2VkCi0gIEVYUEVDVF9ERUFUSCh7IHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKCIiLCAibmFtZSIsICJIZWFkc2V0XzEiKTsgfSwKLSAgICAgICAgICAgICAgICJFbXB0eSBzZWN0aW9uIG5vdCBhbGxvd2VkIik7Ci0gIC8vIGVtcHR5IGtleSBpcyBkaXNhbGxvd2VkCi0gIEVYUEVDVF9ERUFUSCh7IHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIxLCAiIiwgIkhlYWRzZXRfMSIpOyB9LAotICAgICAgICAgICAgICAgIkVtcHR5IGtleSBub3QgYWxsb3dlZCIpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjEsICIiKSk7Ci0gIC8vIGVtcHR5IHZhbHVlIGlzIGFsbG93ZWQKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiwgIiIpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyMSwgIk5hbWUiKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHIxLCAiTmFtZSIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgiIikpKTsKLX0KLQotLyogVGVzdCB0byBzZXQgdmFsdWVzIGluIHRoZSBzYW1lIGtleQotICogUmVjZWl2aW5nIHRoZSBzYW1lIGtleSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgaW4gYSBzZWN0aW9uLCB0aGUgbmV3IGluY29taW5nCi0gKiB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQgYnV0IHRoZSBrZXkgd2lsbCBub3QgYmUgYWRkZWQgcmVwZWF0ZWRseS4gdGVzdCB0aGlzCi0gKiBmZWF0dXJlIGluIGJvdGggdW5wYWlyZWQgZGV2aWMgY2FjaGUgYW5kIHBhaXJlZCBkZXZpY2UgbGlzdCBjYWNoZQotICovCi1URVNUKEJ0aWZDb25maWdDYWNoZVRlc3QsIHRlc3Rfc2V0X3ZhbHVlc19pbl90aGVfc2FtZV9rZXkpIHsKLSAgQnRpZkNvbmZpZ0NhY2hlIHRlc3RfYnRpZl9jb25maWdfY2FjaGUoa0NhcGFjaXR5KTsKLSAgLy8gYWRkIG5ldyBhIGtleSAiTmFtZSIKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiwgIkhlYWRzZXRfMSIpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoU3RyRXEoIkhlYWRzZXRfMSIpKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0KLSAgLy8gYWRkIHRoZSBzYW1lIGtleSAiTmFtZSIgd2l0aCBkaWZmZXJlbnQgdmFsdWUKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiwgIkhlYWRzZXRfMUEiKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJIZWFkc2V0XzFBIikpKTsKLQotICAvLyBhZGQgdGhlIHNhbWUga2V5ICJOYW1lIiB3aXRoIGRpZmZlcmVudCB2YWx1ZQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiLCAiSGVhZHNldF8yQSIpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoU3RyRXEoIkhlYWRzZXRfMkEiKSkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRyMSkpOwotCi0gIC8vIGFkZCBuZXcgYSBrZXkgIlByb3BlcnR5X0ludCIKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRJbnQoa0J0QWRkcjEsICJQcm9wZXJ0eV9JbnQiLCA2NTUzNik7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0SW50KGtCdEFkZHIxLCAiUHJvcGVydHlfSW50IiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKEVxKDY1NTM2KSkpOwotCi0gIC8vIGFkZCB0aGUgc2FtZSBrZXkgIlByb3BlcnR5X0ludCIgd2l0aCBkaWZmZXJlbnQgdmFsdWUKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRJbnQoa0J0QWRkcjEsICJQcm9wZXJ0eV9JbnQiLCAyNTYpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldEludChrQnRBZGRyMSwgIlByb3BlcnR5X0ludCIpLAotICAgICAgICAgICAgICBPcHRpb25hbChFcSgyNTYpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRVaW50NjQoa0J0QWRkcjEsICJQcm9wZXJ0eV82NCIsIDQyOTQ5NjcyOTYpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFVpbnQ2NChrQnRBZGRyMSwgIlByb3BlcnR5XzY0IiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKEVxKHVpbnQ2NF90KDQyOTQ5NjcyOTYpKSkpOwotCi0gIC8vIGdldCB0aGUgTGlua0tleSBhbmQgc2V0IHZhbHVlcyBpbiB0aGUgc2FtZSBrZXkgaW4gcGFpcmVkIGRldmljZSBsaXN0Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIxLCAiTGlua0tleSIsICIxMTIyMzM0NDU1NjY3Nzg4Iik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiTGlua0tleSIpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkcjEpKTsKLQotICAvLyBhZGQgdGhlIHNhbWUga2V5ICJOYW1lIiB3aXRoIHRoZSBkaWZmZXJlbnQgdmFsdWUKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiwgIkhlYWRzZXRfMUEiKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJIZWFkc2V0XzFBIikpKTsKLQotICAvLyBhZGQgdGhlIHNhbWUga2V5ICJOYW1lIiB3aXRoIHRoZSB2YWx1ZSBkaWZmZXJlbnQKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiwgIkhlYWRzZXRfMkEiKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJIZWFkc2V0XzJBIikpKTsKLQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldEludChrQnRBZGRyMSwgIlByb3BlcnR5X0ludCIsIDY0KTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRJbnQoa0J0QWRkcjEsICJQcm9wZXJ0eV9JbnQiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoRXEoNjQpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRVaW50NjQoa0J0QWRkcjEsICJQcm9wZXJ0eV82NCIsIDY1NTM3KTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRVaW50NjQoa0J0QWRkcjEsICJQcm9wZXJ0eV82NCIpLAotICAgICAgICAgICAgICBPcHRpb25hbChFcSh1aW50NjRfdCg2NTUzNykpKSk7Ci0KLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRBZGRyMSkpOwotfQotCi0vKiBTdHJlc3MgdGVzdCB0byBwYWlyIHdpdGggZGV2aWNlIHRoZW4gdW5wYWlyIGRldmljZQotICogMS4gcGFpcmVkIHdpdGggZGV2aWNlIGJ5IGFkZGluZyBhICJMaW5LZXkiIHRvIGRldmljZSBhbmQgY2hlY2sgdGhlIGRldmljZSBiZQotICogbW92ZWQgaW50byBwYWlyZWQgZGV2aWNlcyBsaXN0Ci0gKiAyLiB1bnBhaXJlZCB3aXRoIHRoZSBkZXZpY2UgYnkgcmVtb3ZpbmcgdGhlICJMaW5rS2V5IiBhbmQgY2hlY2sgdGhlIGRldmljZSBiZQotICogbW92ZWQgYmFjayB0byB1bnBhaXJlZCBkZXZpY2VzIGNhY2hlCi0gKiAzLiBsb29wIGZvciAzMCB0aW1lcwotICovCi1URVNUKEJ0aWZDb25maWdDYWNoZVRlc3QsIHRlc3RfcGFpcl91bnBhaXJfZGV2aWNlX3N0cmVzc190ZXN0KSB7Ci0gIEJ0aWZDb25maWdDYWNoZSB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlKGtDYXBhY2l0eSk7Ci0KLSAgLy8gcGFpciB3aXRoIEhlYWRzZXRfMSAxMToyMjozMzo0NDo1NTo2NgotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIk5hbWUiLCAiSGVhZHNldF8xIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGVzdFJlcGVhdENvdW50OyArK2kpIHsKLSAgICAvLyBnZXQgdGhlIExpbmtLZXksIHRoZSBkZXZpY2Ugd2lsbCBiZSBtb3ZlZCBmcm9tIHRoZSB1bnBhaXJlZCBjYWNoZSB0bwotICAgIC8vIHBhaXJlZCBjYWNoZQotICAgIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIxLCAiTGlua0tleSIsICIxMTIyMzM0NDU1NjY3Nzg4Iik7Ci0gICAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjEsICJMaW5rS2V5IikpOwotICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRyMSkpOwotICAgIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkcjEpKTsKLQotICAgIC8vIHJlbW92ZSB0aGUgTGlua0tleSwgdGhlIGRldmljZSB3aWxsIGJlIG1vdmVkIGZyb20gdGhlIHBhaXJlZCBjYWNoZSB0bwotICAgIC8vIHVucGFpcmVkIGNhY2hlCi0gICAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5SZW1vdmVLZXkoa0J0QWRkcjEsICJMaW5rS2V5Iik7Ci0gICAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiTGlua0tleSIpKTsKLSAgICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRyMSkpOwotICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0gIH0KLX0KLQotLyogU3RyZXNzIHRlc3QgdG8gcGFpciB3aXRoIG11bHRpLWRldmljZXMgYW5kIHVucGFpciB3aXRoIG11bHRpLWRldmljZXMKLSAqIDEuIFBpcmVkIHdpdGggNCBkZXZpY2VzIHdpdGggTGluay1LZXkgdHlwZSBrZXkgaW4gb3JkZXIsIHRvIGNoZWNrIHRoZXNlIDQKLSAqIGRldmljZXMgYXJlIGluIHRoZSBwYWlyZWQgZGV2aWNlcyBsaXN0IGNhY2hlCi0gKiAyLiB1bnBhaXIgd2l0aCB0aGVzZSA0IGRldmljZXMgYnkgcmVtb3ZlZCBMaW5rLUtleSB0eXBlIGtleSBpbiBvcmRlciwgdG8KLSAqIGNoZWNrIHRoZSBmaXNydCBkZXZpY2Ugd2FzIHJ1bGVkLW91dCBmcm9tIHVucGFpcmVkIGRldmljZXMgY2FjaGUgZHVlIHRvCi0gKiBjYXBhY2l0eSBsaW1pdGF0aW9uLCBhbmQgb3RoZXIgMyBkZXZpY2VzIGFyZSBiZSBtb3ZlZCB0byB1bnBhaXJlZCBkZXZpY2UKLSAqIGNhY2hlLgotICovCi1URVNUKEJ0aWZDb25maWdDYWNoZVRlc3QsIHRlc3RfbXVsdGlfcGFpcl91bnBhaXJfd2l0aF9kZXZpY2VzKSB7Ci0gIEJ0aWZDb25maWdDYWNoZSB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlKGtDYXBhY2l0eSk7Ci0gIC8vIHBhaXIgd2l0aCA0IGJ0IGFkZHJlc3MgZGV2aWNlcyBieSBhZGQgZGlmZmVyZW50IHR5cGUgbGlua2tleS4KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJuYW1lIiwgImtCdEFkZHIxIik7Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIxLCAiTGlua0tleSIsICIxMTIyMzM0NDU1NjY3Nzg4Iik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIxLCAiTGlua0tleSIpKTsKLQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMiwgIm5hbWUiLCAia0J0QWRkcjIiKTsKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjIsICJMRV9LRVlfUEVOQyIsICJhYWJiY2NkZGVlZmY5OTAwIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIyLCAiTEVfS0VZX1BFTkMiKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjMsICJuYW1lIiwgImtCdEFkZHIzIik7Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIzLCAiTEVfS0VZX1BJRCIsICJhMWIyYzNkNGU1ZmVlZWVlIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIzLCAiTEVfS0VZX1BJRCIpKTsKLQotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyNCwgIkxFX0tFWV9QQ1NSSyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYWFhYmJiYmNjY2NkZGRkIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHI0LCAiTEVfS0VZX1BDU1JLIikpOwotCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHI1LCAibmFtZSIsICJrQnRBZGRyNSIpOwotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyNSwgIkxFX0tFWV9MRU5DIiwgImppbGtqbGtqbGtuIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHI1LCAiTEVfS0VZX0xFTkMiKSk7Ci0KLSAgLy8gY2hlY2tpbmcgdGhlc2UgNCBkZXZpY2VzIGFyZSBpbiBwYWlyZWQgbGlzdCBjYWNoZSBhbmQgdGhlIGNvbnRlbnQgYXJlCi0gIC8vIGNvcnJlY3QuCi0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkcjEpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjEsICJMaW5rS2V5IiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCIxMTIyMzM0NDU1NjY3Nzg4IikpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRBZGRyMikpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhrQnRBZGRyMiwgIkxFX0tFWV9QRU5DIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJhYWJiY2NkZGVlZmY5OTAwIikpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRBZGRyMykpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhrQnRBZGRyMywgIkxFX0tFWV9QSUQiKSwKLSAgICAgICAgICAgICAgT3B0aW9uYWwoU3RyRXEoImExYjJjM2Q0ZTVmZWVlZWUiKSkpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHI0KSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHI0LCAiTEVfS0VZX1BDU1JLIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJhYWFhYmJiYmNjY2NkZGRkIikpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRBZGRyNSkpOwotICBFWFBFQ1RfVEhBVCh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFN0cmluZyhrQnRBZGRyNSwgIkxFX0tFWV9MRU5DIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJqaWxramxramxrbiIpKSk7Ci0KLSAgLy8gdW5wYWlyIHdpdGggdGhlc2UgNCBidCBhZGRyZXNzIGRldmljZXMgYnkgcmVtb3ZlZCB0aGUgbGlua2tleS4KLSAgLy8gdW5wYWlyIGtCdEFkZHIxIDExOjIyOjMzOjQ0OjU1OjY2Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUmVtb3ZlS2V5KGtCdEFkZHIxLCAiTGlua0tleSIpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjEsICJMaW5rS2V5IikpOwotICAvLyBubyBlbXB0eSBzZWN0aW9uIGlzIG1vdmVkIHRvIHVucGFpcmVkCi0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHIxLCAibmFtZSIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgia0J0QWRkcjEiKSkpOwotCi0gIC8vIHVucGFpciB3aXRoIGtCdEFkZHIyIGFhOmJiOmNjOmRkOmVlOmZmCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUmVtb3ZlS2V5KGtCdEFkZHIyLCAiTEVfS0VZX1BFTkMiKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIyLCAiTEVfS0VZX1BFTkMiKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIyKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIyKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHIyLCAibmFtZSIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgia0J0QWRkcjIiKSkpOwotCi0gIC8vIHVucGFpciB3aXRoIGtCdEFkZHIzIEFCOkNEOkVGOjEyOjM0OjU2Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUmVtb3ZlS2V5KGtCdEFkZHIzLCAiTEVfS0VZX1BJRCIpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjMsICJMRV9LRVlfUElEIikpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihrQnRBZGRyMykpOwotICAvLyBubyBlbXB0eSBzZWN0aW9uIGlzIG1vdmVkIHRvIHVucGFpcmVkCi0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIzKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHIzLCAibmFtZSIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgia0J0QWRkcjMiKSkpOwotCi0gIC8vIHVucGFpciB3aXRoIGtCdEFkZHI0IDExOkFBOjIyOkJCOjMzOkNDCi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUmVtb3ZlS2V5KGtCdEFkZHI0LCAiTEVfS0VZX1BDU1JLIik7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc0tleShrQnRBZGRyNCwgIkxFX0tFWV9QQ1NSSyIpKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkcjQpKTsKLSAgLy8gZW1wdHkgc2VjdGlvbiBpcyByZW1vdmVkCi0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1VucGFpcmVkU2VjdGlvbihrQnRBZGRyNCkpOwotCi0gIC8vIHVucGFpciB3aXRoIGtCdEFkZHI1IDExOkFBOjIyOkJCOjMzOkNECi0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUmVtb3ZlS2V5KGtCdEFkZHI1LCAiTEVfS0VZX0xFTkMiKTsKLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHI1LCAiTEVfS0VZX0xFTkMiKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHI1KSk7Ci0gIC8vIG5vIGVtcHR5IHNlY3Rpb24gaXMgbW92ZWQgdG8gdW5wYWlyZWQKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNVbnBhaXJlZFNlY3Rpb24oa0J0QWRkcjUpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjUsICJuYW1lIiksCi0gICAgICAgICAgICAgIE9wdGlvbmFsKFN0ckVxKCJrQnRBZGRyNSIpKSk7Ci0KLSAgLy8gY2hlY2tpbmcgdGhlIG9sZGVzdCB1bnBhaXJlZCBkZXZpY2Uga0J0QWRkcjEgd2FzIHJ1bGVkIG91dCBmcm9tIGNhY2hlIGR1ZQotICAvLyB0byBjYXBhY2l0eSBsaW1pdGF0aW9uICgzKSBpbiB1bnBhaXJlZCBjYWNoZS4KLSAgRVhQRUNUX0ZBTFNFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzVW5wYWlyZWRTZWN0aW9uKGtCdEFkZHIxKSk7Ci19Ci0KLS8qIFRlc3QgdG8gcmVtb3ZlIHNlY3Rpb25zIHdpdGggdGhlIHNwZWNpZmljIGtleQotICogcGFpcmVkIHdpdGggc2VjdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWMgIlJlc3RyaWN0ZWQiIGtleSBhbmQgdGhlbiByZW1vdmVkIHRoZQotICogIlJlc3RyaWN0ZWQiIGtleSwgY2hlY2sgaWYgdGhlIHNlY3Rpb25zIHdpdGggdGhlIHNwZWNpZmljICJSZXN0cmljdGVkIiBrZXkKLSAqIGFyZSByZW1vdmVkLgotICovCi1URVNUKEJ0aWZDb25maWdDYWNoZVRlc3QsIHRlc3RfcmVtb3ZlX3NlY3Rpb25zX3dpdGhfa2V5KSB7Ci0gIEJ0aWZDb25maWdDYWNoZSB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlKGtDYXBhY2l0eSk7Ci0gIC8vIHBhaXIgd2l0aCBIZWFkc2V0XzEgKGtCdEFkZHIxKSwgSGVhZHNldF8yIChrQnRBZGRyMSksIEhlYXNkZXRfMyAoa0J0QWRkcjMpCi0gIC8vICwgYW5kIEhlYWRzZXRfMSAoa0J0QWRkcjEpLCBIZWFkc2V0XzMgKGtCdEFkZHIzKSBoYXZlIHNlcGNpZmljICJSZXN0cmljdGVkIgotICAvLyBrZXkKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJOYW1lIiwgIkhlYWRzZXRfMSIpOwotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIlJlc3RyaWN0ZWQiLCAiMSIpOwotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMSwgIkxpbmtLZXkiLCAiMTEyMjMzNDQ1NTY2Nzc4OCIpOwotICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLlNldFN0cmluZyhrQnRBZGRyMiwgIk5hbWUiLCAiSGVhZHNldF8yIik7Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIyLCAiTGlua0tleSIsICJhYWJiY2NkZGVlZmY5OTAwIik7Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuU2V0U3RyaW5nKGtCdEFkZHIzLCAiTmFtZSIsICJIZWFkc2V0XzMiKTsKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjMsICJMaW5rS2V5IiwgImExYjJjM2Q0ZTVmZWVlZWUiKTsKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjMsICJSZXN0cmljdGVkIiwgIjEiKTsKLQotICAvLyByZW1vdmUgc2VjdGlvbnMgd2l0aCAiUmVzdHJpY3RlZCIga2V5Ci0gIHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUmVtb3ZlUGVyc2lzdGVudFNlY3Rpb25zV2l0aEtleSgiUmVzdHJpY3RlZCIpOwotCi0gIC8vIGNoZWNraW5nIHRoZSBrQnRBZGRyMSBhbmQga0J0QWRkcjMgY2FuIG5vdCBiZSBmb3VuZCBpbiBjb25maWcgY2FjaGUsIG9ubHkKLSAgLy8ga2VlcCBrQnRBZGRyMiBpbiBjb25maWcgY2FjaGUuCi0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1NlY3Rpb24oa0J0QWRkcjEpKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNTZWN0aW9uKGtCdEFkZHIyKSk7Ci0gIEVYUEVDVF9GQUxTRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1NlY3Rpb24oa0J0QWRkcjMpKTsKLX0KLQotLyogVGVzdCBQZXJzaXN0ZW50U2VjdGlvbkNvcHkgYW5kIEluaXQgKi8KLVRFU1QoQnRpZkNvbmZpZ0NhY2hlVGVzdCwgdGVzdF9QZXJzaXN0ZW50U2VjdGlvbkNvcHlfSW5pdCkgewotICBCdGlmQ29uZmlnQ2FjaGUgdGVzdF9idGlmX2NvbmZpZ19jYWNoZShrQ2FwYWNpdHkpOwotICBjb25maWdfdCBjb25maWdfcGFpcmVkID0ge307Ci0gIC8vIHBhaXIgd2l0aCAzIGJ0IGRldmljZXMsIGtCdEFkZHIxLCBrQnRBZGRyMiwga0J0QWRkcjMKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjEsICJMaW5rS2V5IiwgIjExMjIzMzQ0NTU2Njc3ODgiKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjEsICJMaW5rS2V5IikpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIxKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHIxLCAiTGlua0tleSIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgiMTEyMjMzNDQ1NTY2Nzc4OCIpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjIsICJMRV9LRVlfUEVOQyIsICJhYWJiY2NkZGVlZmY5OTAwIik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzS2V5KGtCdEFkZHIyLCAiTEVfS0VZX1BFTkMiKSk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oa0J0QWRkcjIpKTsKLSAgRVhQRUNUX1RIQVQodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5HZXRTdHJpbmcoa0J0QWRkcjIsICJMRV9LRVlfUEVOQyIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgiYWFiYmNjZGRlZWZmOTkwMCIpKSk7Ci0KLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5TZXRTdHJpbmcoa0J0QWRkcjMsICJMRV9LRVlfUElEIiwgImExYjJjM2Q0ZTVmZWVlZWUiKTsKLSAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNLZXkoa0J0QWRkcjMsICJMRV9LRVlfUElEIikpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkhhc1BlcnNpc3RlbnRTZWN0aW9uKGtCdEFkZHIzKSk7Ci0gIEVYUEVDVF9USEFUKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuR2V0U3RyaW5nKGtCdEFkZHIzLCAiTEVfS0VZX1BJRCIpLAotICAgICAgICAgICAgICBPcHRpb25hbChTdHJFcSgiYTFiMmMzZDRlNWZlZWVlZSIpKSk7Ci0KLSAgLy8gY2hlY2sgR2V0UGVyc2lzdGVudFNlY3Rpb25zCi0gIGludCBudW1fb2ZfcGFpcmVkX2RldmljZXMgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8mIHNlY19uYW1lIDoKLSAgICAgICB0ZXN0X2J0aWZfY29uZmlnX2NhY2hlLkdldFBlcnNpc3RlbnRTZWN0aW9uTmFtZXMoKSkgewotICAgIEVYUEVDVF9UUlVFKHRlc3RfYnRpZl9jb25maWdfY2FjaGUuSGFzUGVyc2lzdGVudFNlY3Rpb24oc2VjX25hbWUpKTsKLSAgICBudW1fb2ZfcGFpcmVkX2RldmljZXMrKzsKLSAgfQotICBFWFBFQ1RfRVEobnVtX29mX3BhaXJlZF9kZXZpY2VzLCAzKTsKLQotICAvLyBjb3B5IHBlcnNpc3RlbnQgc2VjdGlvbnMKLSAgaW50IG51bV9vZl9jb3B5X3BhaXJlZF9kZXZpY2VzID0gMDsKLSAgY29uZmlnX3BhaXJlZCA9IHRlc3RfYnRpZl9jb25maWdfY2FjaGUuUGVyc2lzdGVudFNlY3Rpb25Db3B5KCk7Ci0gIGZvciAoY29uc3Qgc2VjdGlvbl90JiBzZWMgOiBjb25maWdfcGFpcmVkLnNlY3Rpb25zKSB7Ci0gICAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihzZWMubmFtZSkpOwotICAgIG51bV9vZl9jb3B5X3BhaXJlZF9kZXZpY2VzKys7Ci0gIH0KLSAgRVhQRUNUX0VRKG51bV9vZl9jb3B5X3BhaXJlZF9kZXZpY2VzLCAzKTsKLQotICAvLyB3cml0ZSBwZXJzaXN0ZW50IHNlY3Rpb25zIHRvIHRlbXAgdGVzdCBjb25maWcgZmlsZQotICBFWFBFQ1RfVFJVRShjb25maWdfc2F2ZShjb25maWdfcGFpcmVkLCBURVNUX0NPTkZJR19GSUxFKSk7Ci0gIC8vIGdldCBwZXJzaXN0ZW50IHNlY3Rpb25zIGZyb20gdGVtcCB0ZXN0IGNvbmZpZyBmaWxlCi0gIGludCBudW1fb2Zfc2F2ZV9wYWlyZWRfZGV2aWNlcyA9IDA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19uZXcoVEVTVF9DT05GSUdfRklMRSk7Ci0gIGZvciAoY29uc3Qgc2VjdGlvbl90JiBzZWMgOiBjb25maWdfcGFpcmVkLnNlY3Rpb25zKSB7Ci0gICAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihzZWMubmFtZSkpOwotICAgIG51bV9vZl9zYXZlX3BhaXJlZF9kZXZpY2VzKys7Ci0gIH0KLSAgRVhQRUNUX0VRKG51bV9vZl9zYXZlX3BhaXJlZF9kZXZpY2VzLCAzKTsKLQotICAvLyBDbGVhciBhbGwgYnRpZiBjb25maWcgY2FjaGUgc2VjdGlvbnMKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5DbGVhcigpOwotCi0gIC8vIG1vdmUgdGhlIHBlcnNpc3RlbnQgc2VjdGlvbnMgdG8gYnRpZiBjb25maWcgcGFpcmVkIGxpc3QKLSAgaW50IG51bV9vZl9pbml0X3BhaXJlZF9kZXZpY2VzID0gMDsKLSAgdGVzdF9idGlmX2NvbmZpZ19jYWNoZS5Jbml0KHN0ZDo6bW92ZShjb25maWdfc291cmNlKSk7Ci0gIGZvciAoY29uc3Qgc2VjdGlvbl90JiBzZWMgOiBjb25maWdfcGFpcmVkLnNlY3Rpb25zKSB7Ci0gICAgRVhQRUNUX1RSVUUodGVzdF9idGlmX2NvbmZpZ19jYWNoZS5IYXNQZXJzaXN0ZW50U2VjdGlvbihzZWMubmFtZSkpOwotICAgIG51bV9vZl9pbml0X3BhaXJlZF9kZXZpY2VzKys7Ci0gIH0KLSAgRVhQRUNUX0VRKG51bV9vZl9pbml0X3BhaXJlZF9kZXZpY2VzLCAzKTsKLQotICBFWFBFQ1RfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZShrVGVzdENvbmZpZ0ZpbGUpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2J0aWYvdGVzdC9idGlmX2NvcmVfdGVzdC5jYyBiL2J0aWYvdGVzdC9idGlmX2NvcmVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxMjgyNy4uMDAwMDAwMAotLS0gYS9idGlmL3Rlc3QvYnRpZl9jb3JlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FnX2FwaS5oIgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXZvaWQgc2V0X2hhbF9jYmFja3MoYnRfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7Ci0KLXVpbnQ4X3QgYXBwbF90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX0RFQlVHOwotdWludDhfdCBidGlmX3RyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfREVCVUc7Ci11aW50OF90IGJ0dV90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX0RFQlVHOwotCi1jb25zdCB0QlRBX0FHX1JFU19EQVRBIHRCVEFfQUdfUkVTX0RBVEE6OmtFbXB0eSA9IHt9OwotCi1tb2R1bGVfdCBidF91dGlsc19tb2R1bGU7Ci1tb2R1bGVfdCBnZF9jb250cm9sbGVyX21vZHVsZTsKLW1vZHVsZV90IGdkX2lkbGVfbW9kdWxlOwotbW9kdWxlX3QgZ2Rfc2hpbV9tb2R1bGU7Ci1tb2R1bGVfdCBvc2lfbW9kdWxlOwotCi1uYW1lc3BhY2UgewotCi1hdXRvIHRpbWVvdXRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDMpOwotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBjYWxsYmFja19tYXBfOwotI2RlZmluZSBURVNUQ0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChjYWxsYmFja19tYXBfLmZpbmQoX19mdW5jX18pICE9IGNhbGxiYWNrX21hcF8uZW5kKCkpIFwKLSAgICBjYWxsYmFja19tYXBfW19fZnVuY19fXSgpOwotCi12b2lkIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFjayhidF9zdGF0ZV90IHN0YXRlKSB7fQotdm9pZCBhZGFwdGVyX3Byb3BlcnRpZXNfY2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLCBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7fQotdm9pZCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykge30KLXZvaWQgZGV2aWNlX2ZvdW5kX2NhbGxiYWNrKGludCBudW1fcHJvcGVydGllcywgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykge30KLXZvaWQgZGlzY292ZXJ5X3N0YXRlX2NoYW5nZWRfY2FsbGJhY2soYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpIHt9Ci12b2lkIHBpbl9yZXF1ZXN0X2NhbGxiYWNrKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9iZG5hbWVfdCogYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kLCBib29sIG1pbl8xNl9kaWdpdCkge30KLXZvaWQgc3NwX3JlcXVlc3RfY2FsbGJhY2soUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIGJ0X2JkbmFtZV90KiBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNzX2tleSkge30KLXZvaWQgYm9uZF9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9ib25kX3N0YXRlX3Qgc3RhdGUsIGludCBmYWlsX3JlYXNvbikge30KLXZvaWQgYWNsX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYWNsX3N0YXRlX3Qgc3RhdGUsIGludCB0cmFuc3BvcnRfbGlua190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9oY2lfZXJyb3JfY29kZV90IGhjaV9yZWFzb24pIHt9Ci12b2lkIGxpbmtfcXVhbGl0eV9yZXBvcnRfY2FsbGJhY2sodWludDY0X3QgdGltZXN0YW1wLCBpbnQgcmVwb3J0X2lkLCBpbnQgcnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc25yLCBpbnQgcmV0cmFuc21pc3Npb25fY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhY2tldHNfbm90X3JlY2VpdmVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lZ2F0aXZlX2Fja25vd2xlZGdlbWVudF9jb3VudCkge30KLXZvaWQgY2FsbGJhY2tfdGhyZWFkX2V2ZW50KGJ0X2NiX3RocmVhZF9ldnQgZXZ0KSB7IFRFU1RDQjsgfQotdm9pZCBkdXRfbW9kZV9yZWN2X2NhbGxiYWNrKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogYnVmLCB1aW50OF90IGxlbikge30KLXZvaWQgbGVfdGVzdF9tb2RlX2NhbGxiYWNrKGJ0X3N0YXR1c190IHN0YXR1cywgdWludDE2X3QgbnVtX3BhY2tldHMpIHt9Ci12b2lkIGVuZXJneV9pbmZvX2NhbGxiYWNrKGJ0X2FjdGl2aXR5X2VuZXJneV9pbmZvKiBlbmVyZ3lfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfdWlkX3RyYWZmaWNfdCogdWlkX2RhdGEpIHt9Ci12b2lkIGdlbmVyYXRlX2xvY2FsX29vYl9kYXRhX2NhbGxiYWNrKHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9vb2JfZGF0YV90IG9vYl9kYXRhKSB7fQotI3VuZGVmIFRFU1RDQgotCi1idF9jYWxsYmFja3NfdCBjYWxsYmFja3MgPSB7Ci0gICAgLnNpemUgPSBzaXplb2YoYnRfY2FsbGJhY2tzX3QpLAotICAgIC5hZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2IgPSBhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2ssCi0gICAgLmFkYXB0ZXJfcHJvcGVydGllc19jYiA9IGFkYXB0ZXJfcHJvcGVydGllc19jYWxsYmFjaywKLSAgICAucmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiID0gcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NhbGxiYWNrLAotICAgIC5kZXZpY2VfZm91bmRfY2IgPSBkZXZpY2VfZm91bmRfY2FsbGJhY2ssCi0gICAgLmRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiID0gZGlzY292ZXJ5X3N0YXRlX2NoYW5nZWRfY2FsbGJhY2ssCi0gICAgLnBpbl9yZXF1ZXN0X2NiID0gcGluX3JlcXVlc3RfY2FsbGJhY2ssCi0gICAgLnNzcF9yZXF1ZXN0X2NiID0gc3NwX3JlcXVlc3RfY2FsbGJhY2ssCi0gICAgLmJvbmRfc3RhdGVfY2hhbmdlZF9jYiA9IGJvbmRfc3RhdGVfY2hhbmdlZF9jYWxsYmFjaywKLSAgICAuYWNsX3N0YXRlX2NoYW5nZWRfY2IgPSBhY2xfc3RhdGVfY2hhbmdlZF9jYWxsYmFjaywKLSAgICAudGhyZWFkX2V2dF9jYiA9IGNhbGxiYWNrX3RocmVhZF9ldmVudCwKLSAgICAuZHV0X21vZGVfcmVjdl9jYiA9IGR1dF9tb2RlX3JlY3ZfY2FsbGJhY2ssCi0gICAgLmxlX3Rlc3RfbW9kZV9jYiA9IGxlX3Rlc3RfbW9kZV9jYWxsYmFjaywKLSAgICAuZW5lcmd5X2luZm9fY2IgPSBlbmVyZ3lfaW5mb19jYWxsYmFjaywKLSAgICAubGlua19xdWFsaXR5X3JlcG9ydF9jYiA9IGxpbmtfcXVhbGl0eV9yZXBvcnRfY2FsbGJhY2ssCi0gICAgLmdlbmVyYXRlX2xvY2FsX29vYl9kYXRhX2NiID0gZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGFfY2FsbGJhY2ssCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotY2xhc3MgQnRpZkNvcmVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGNhbGxiYWNrX21hcF8uY2xlYXIoKTsKLSAgICBzZXRfaGFsX2NiYWNrcygmY2FsbGJhY2tzKTsKLQotICAgIGF1dG8gcHJvbWlzZSA9IHN0ZDo6cHJvbWlzZTx2b2lkPigpOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgY2FsbGJhY2tfbWFwX1siY2FsbGJhY2tfdGhyZWFkX2V2ZW50Il0gPSBbJnByb21pc2VdKCkgewotICAgICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICB9OwotICAgIGJ0aWZfaW5pdF9ibHVldG9vdGgoKTsKLSAgICBBU1NFUlRfRVEoc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwgZnV0dXJlLndhaXRfZm9yKHRpbWVvdXRfdGltZSkpOwotICAgIGNhbGxiYWNrX21hcF8uZXJhc2UoImNhbGxiYWNrX3RocmVhZF9ldmVudCIpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHByb21pc2UgPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGNhbGxiYWNrX21hcF9bImNhbGxiYWNrX3RocmVhZF9ldmVudCJdID0gWyZwcm9taXNlXSgpIHsKLSAgICAgIHByb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgfTsKLSAgICBidGlmX2NsZWFudXBfYmx1ZXRvb3RoKCk7Ci0gICAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIGZ1dHVyZS53YWl0X2Zvcih0aW1lb3V0X3RpbWUpKTsKLSAgICBjYWxsYmFja19tYXBfLmVyYXNlKCJjYWxsYmFja190aHJlYWRfZXZlbnQiKTsKLSAgfQotfTsKLQotc3RkOjpwcm9taXNlPGludD4gcHJvbWlzZTA7Ci12b2lkIGNhbGxiYWNrMChpbnQgdmFsKSB7IHByb21pc2UwLnNldF92YWx1ZSh2YWwpOyB9Ci0KLVRFU1RfRihCdGlmQ29yZVRlc3QsIHRlc3RfcG9zdF9vbl9idF9zaW1wbGUwKSB7Ci0gIGNvbnN0IGludCB2YWwgPSAxMjM7Ci0gIHByb21pc2UwID0gc3RkOjpwcm9taXNlPGludD4oKTsKLSAgc3RkOjpmdXR1cmU8aW50PiBmdXR1cmUwID0gcHJvbWlzZTAuZ2V0X2Z1dHVyZSgpOwotICBwb3N0X29uX2J0X2puaShbPV0oKSB7IGNhbGxiYWNrMCh2YWwpOyB9KTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIGZ1dHVyZTAud2FpdF9mb3IodGltZW91dF90aW1lKSk7Ci0gIEFTU0VSVF9FUSh2YWwsIGZ1dHVyZTAuZ2V0KCkpOwotfQotCi1URVNUX0YoQnRpZkNvcmVUZXN0LCB0ZXN0X3Bvc3Rfb25fYnRfam5pX3NpbXBsZTEpIHsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBwb3N0X29uX2J0X2puaShbPSwgJnByb21pc2VdKCkgeyBwcm9taXNlLnNldF92YWx1ZSgpOyB9KTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIGZ1dHVyZS53YWl0X2Zvcih0aW1lb3V0X3RpbWUpKTsKLX0KLQotVEVTVF9GKEJ0aWZDb3JlVGVzdCwgdGVzdF9wb3N0X29uX2J0X2puaV9zaW1wbGUyKSB7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgQnRKbmlDbG9zdXJlIGNsb3N1cmUgPSBbJnByb21pc2VdKCkgeyBwcm9taXNlLnNldF92YWx1ZSgpOyB9OwotICBwb3N0X29uX2J0X2puaShjbG9zdXJlKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIGZ1dHVyZS53YWl0X2Zvcih0aW1lb3V0X3RpbWUpKTsKLX0KLQotVEVTVF9GKEJ0aWZDb3JlVGVzdCwgdGVzdF9wb3N0X29uX2J0X2puaV9zaW1wbGUzKSB7Ci0gIGNvbnN0IGludCB2YWwgPSA0NTY7Ci0gIHN0ZDo6cHJvbWlzZTxpbnQ+IHByb21pc2U7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIEJ0Sm5pQ2xvc3VyZSBjbG9zdXJlID0gWyZwcm9taXNlLCB2YWxdKCkgeyBwcm9taXNlLnNldF92YWx1ZSh2YWwpOyB9OwotICBwb3N0X29uX2J0X2puaShjbG9zdXJlKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIGZ1dHVyZS53YWl0X2Zvcih0aW1lb3V0X3RpbWUpKTsKLSAgQVNTRVJUX0VRKHZhbCwgZnV0dXJlLmdldCgpKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvdGVzdC9idGlmX2hmX2NsaWVudF9zZXJ2aWNlX3Rlc3QuY2MgYi9idGlmL3Rlc3QvYnRpZl9oZl9jbGllbnRfc2VydmljZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQ4YWYxLi4wMDAwMDAwCi0tLSBhL2J0aWYvdGVzdC9idGlmX2hmX2NsaWVudF9zZXJ2aWNlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlICJidGFfaGZwX2FwaS5oIgotCi0jdW5kZWYgTE9HX1RBRwotI2luY2x1ZGUgImJ0aWYvc3JjL2J0aWZfaGZfY2xpZW50LmNjIgotCi1zdGF0aWMgdEJUQV9IRl9DTElFTlRfRkVBVCBnRmVhdHVyZXM7Ci0KLQotdWludDhfdCBidGlmX3RyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORzsKLXZvaWQgTG9nTXNnKHVpbnQzMl90IHRyYWNlX3NldF9tYXNrLCBjb25zdCBjaGFyKiBmbXRfc3RyLCAuLi4pIHt9Ci10QlRBX1NUQVRVUyBCVEFfSGZDbGllbnRFbmFibGUodEJUQV9IRl9DTElFTlRfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9IRl9DTElFTlRfRkVBVCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX3NlcnZpY2VfbmFtZSkgewotICBnRmVhdHVyZXMgPSBmZWF0dXJlczsKLSAgcmV0dXJuIEJUQV9TVUNDRVNTOwotfQotdm9pZCBCVEFfSGZDbGllbnREaXNhYmxlKHZvaWQpIHsgfQotYnRfc3RhdHVzX3QgYnRpZl90cmFuc2Zlcl9jb250ZXh0KHRCVElGX0NCQUNLKiBwX2NiYWNrLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX3BhcmFtcywgaW50IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRJRl9DT1BZX0NCQUNLKiBwX2NvcHlfY2JhY2spIHsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotdm9pZCBidGlmX3F1ZXVlX2FkdmFuY2UoKSB7fQotY29uc3QgY2hhciogZHVtcF9oZl9jbGllbnRfZXZlbnQodWludDE2X3QgZXZlbnQpIHsKLSAgcmV0dXJuICJVTktOT1dOIE1TRyBJRCI7Ci19Ci0KLWNsYXNzIEJ0aWZIZkNsaWVudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgZ0ZlYXR1cmVzID0gQlRJRl9IRl9DTElFTlRfRkVBVFVSRVM7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUge30KLX07Ci0KLVRFU1RfRihCdGlmSGZDbGllbnRUZXN0LCB0ZXN0X2J0aWZfaGZfY2xlaW50X3NlcnZpY2UpIHsKLSAgYm9vbCBlbmFibGUgPSB0cnVlOwotCi0gIGJ0aWZfaGZfY2xpZW50X2V4ZWN1dGVfc2VydmljZShlbmFibGUpOwotICBBU1NFUlRfRVEoKGdGZWF0dXJlcyAmIEJUQV9IRl9DTElFTlRfRkVBVF9FU0NPX1M0KSA+IDAsCi0gICAgICAgICAgICBCVEFfSEZQX1ZFUlNJT04gPj0gSEZQX1ZFUlNJT05fMV83KTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvdGVzdC9idGlmX2tleXN0b3JlX3Rlc3QuY2MgYi9idGlmL3Rlc3QvYnRpZl9rZXlzdG9yZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FiYmFkLi4wMDAwMDAwCi0tLSBhL2J0aWYvdGVzdC9idGlmX2tleXN0b3JlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfa2V5c3RvcmUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDsKLQotY2xhc3MgQnRpZktleXN0b3JlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgc3RkOjp1bmlxdWVfcHRyPEJ0aWZLZXlzdG9yZT4gYnRpZl9rZXlzdG9yZV87Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotICAgIGJ0aWZfa2V5c3RvcmVfID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdGlmS2V5c3RvcmU+KHN0YXRpY19jYXN0PGtleXN0b3JlOjpLZXlzdG9yZUNsaWVudCo+KAotICAgICAgICAgICAgbmV3IGtleXN0b3JlOjpLZXlzdG9yZUNsaWVudEltcGwpKTsKLSAgfTsKLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgYnRpZl9rZXlzdG9yZV8gPSBudWxscHRyOyB9OwotfTsKLQotVEVTVF9GKEJ0aWZLZXlzdG9yZVRlc3QsIHRlc3RfZW5jcnlwdF9kZWNyeXB0KSB7Ci0gIHN0ZDo6c3RyaW5nIGhhc2ggPSAidGVzdCI7Ci0KLSAgc3RkOjpzdHJpbmcgZW5jcnlwdGVkX2hhc2ggPSBidGlmX2tleXN0b3JlXy0+RW5jcnlwdChoYXNoLCAwKTsKLSAgc3RkOjpzdHJpbmcgZGVjcnlwdGVkX2hhc2ggPSBidGlmX2tleXN0b3JlXy0+RGVjcnlwdChlbmNyeXB0ZWRfaGFzaCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGVuY3J5cHRlZF9oYXNoLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoaGFzaCwgZGVjcnlwdGVkX2hhc2gpOwotfQotCi1URVNUX0YoQnRpZktleXN0b3JlVGVzdCwgdGVzdF9lbmNyeXB0X2VtcHR5X2hhc2gpIHsKLSAgc3RkOjpzdHJpbmcgaGFzaCA9ICIiOwotCi0gIHN0ZDo6c3RyaW5nIGVuY3J5cHRlZF9oYXNoID0gYnRpZl9rZXlzdG9yZV8tPkVuY3J5cHQoaGFzaCwgMCk7Ci0KLSAgRVhQRUNUX1RSVUUoZW5jcnlwdGVkX2hhc2guZW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihCdGlmS2V5c3RvcmVUZXN0LCB0ZXN0X2RlY3J5cHRfZW1wdHlfaGFzaCkgewotICBzdGQ6OnN0cmluZyBoYXNoID0gIiI7Ci0KLSAgc3RkOjpzdHJpbmcgZGVjcnlwdGVkX2hhc2ggPSBidGlmX2tleXN0b3JlXy0+RGVjcnlwdChoYXNoKTsKLQotICBFWFBFQ1RfVFJVRShkZWNyeXB0ZWRfaGFzaC5lbXB0eSgpKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvdGVzdC9idGlmX3Byb2ZpbGVfcXVldWVfdGVzdC5jYyBiL2J0aWYvdGVzdC9idGlmX3Byb2ZpbGVfcXVldWVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmMTMwMC4uMDAwMDAwMAotLS0gYS9idGlmL3Rlc3QvYnRpZl9wcm9maWxlX3F1ZXVlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3Byb2ZpbGVfcXVldWUuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9zdGFja19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi10eXBlZGVmIHZvaWQodEJUSUZfQ0JBQ0spKHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX3BhcmFtKTsKLXR5cGVkZWYgdm9pZCh0QlRJRl9DT1BZX0NCQUNLKSh1aW50MTZfdCBldmVudCwgY2hhciogcF9kZXN0LCBjaGFyKiBwX3NyYyk7Ci0KLS8vIE5PVEU6IExvY2FsIHJlLWltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyB0byBhdm9pZCB0aHJlYWQgY29udGV4dCBzd2l0Y2hpbmcKLXN0YXRpYyBib29sIHNTdGFja1J1bm5pbmc7Ci1ib29sIGdldF9zdGFja19pc19ydW5uaW5nKHZvaWQpIHsgcmV0dXJuIHNTdGFja1J1bm5pbmc7IH0KLXN0YXRpYyBzdGFja19tYW5hZ2VyX3Qgc1N0YWNrTWFuYWdlciA9IHtudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zdGFja19pc19ydW5uaW5nfTsKLWNvbnN0IHN0YWNrX21hbmFnZXJfdCogc3RhY2tfbWFuYWdlcl9nZXRfaW50ZXJmYWNlKCkgeyByZXR1cm4gJnNTdGFja01hbmFnZXI7IH0KLWJ0X3N0YXR1c190IGRvX2luX2puaV90aHJlYWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaykgewotICBzdGQ6Om1vdmUodGFzaykuUnVuKCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJvb2wgaXNfb25fam5pX3RocmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLQotZW51bSBSZXN1bHRUeXBlIHsKLSAgTk9UX1NFVCA9IDAsCi0gIFVOS05PV04sCi0gIFVVSUQxX0FERFIxLAotICBVVUlEMV9BRERSMiwKLSAgVVVJRDJfQUREUjEsCi0gIFVVSUQyX0FERFIyCi19OwotCi1zdGF0aWMgUmVzdWx0VHlwZSBzUmVzdWx0OwotCi1jbGFzcyBCdGlmUHJvZmlsZVF1ZXVlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtUZXN0VXVpZDEgPSAweDk1Mjc7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBrVGVzdFV1aWQyID0gMHg4MTlGOwotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyBrVGVzdEFkZHIxOwotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyBrVGVzdEFkZHIyOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHNTdGFja1J1bm5pbmcgPSB0cnVlOwotICAgIHNSZXN1bHQgPSBOT1RfU0VUOwotICB9OwotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBidGlmX3F1ZXVlX3JlbGVhc2UoKTsgfTsKLX07Ci0KLWNvbnN0IFJhd0FkZHJlc3MgQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0QWRkcjF7Ci0gICAgezB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjZ9fTsKLWNvbnN0IFJhd0FkZHJlc3MgQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0QWRkcjJ7Ci0gICAgezB4QUIsIDB4Q0QsIDB4RUYsIDB4MTIsIDB4MzQsIDB4NTZ9fTsKLQotc3RhdGljIGJ0X3N0YXR1c190IHRlc3RfY29ubmVjdF9jYihSYXdBZGRyZXNzKiBiZGEsIHVpbnQxNl90IHV1aWQpIHsKLSAgc1Jlc3VsdCA9IFVOS05PV047Ci0gIGlmICgqYmRhID09IEJ0aWZQcm9maWxlUXVldWVUZXN0OjprVGVzdEFkZHIxKSB7Ci0gICAgaWYgKHV1aWQgPT0gQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0VXVpZDEpIHsKLSAgICAgIHNSZXN1bHQgPSBVVUlEMV9BRERSMTsKLSAgICB9IGVsc2UgaWYgKHV1aWQgPT0gQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0VXVpZDIpIHsKLSAgICAgIHNSZXN1bHQgPSBVVUlEMl9BRERSMTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoKmJkYSA9PSBCdGlmUHJvZmlsZVF1ZXVlVGVzdDo6a1Rlc3RBZGRyMikgewotICAgIGlmICh1dWlkID09IEJ0aWZQcm9maWxlUXVldWVUZXN0OjprVGVzdFV1aWQxKSB7Ci0gICAgICBzUmVzdWx0ID0gVVVJRDFfQUREUjI7Ci0gICAgfSBlbHNlIGlmICh1dWlkID09IEJ0aWZQcm9maWxlUXVldWVUZXN0OjprVGVzdFV1aWQyKSB7Ci0gICAgICBzUmVzdWx0ID0gVVVJRDJfQUREUjI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotVEVTVF9GKEJ0aWZQcm9maWxlUXVldWVUZXN0LCB0ZXN0X2Nvbm5lY3QpIHsKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIxKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHRlc3RfY29ubmVjdF9jYl9mYWlsKFJhd0FkZHJlc3MqIGJkYSwgdWludDE2X3QgdXVpZCkgewotICBzUmVzdWx0ID0gVU5LTk9XTjsKLSAgaWYgKCpiZGEgPT0gQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0QWRkcjEpIHsKLSAgICBpZiAodXVpZCA9PSBCdGlmUHJvZmlsZVF1ZXVlVGVzdDo6a1Rlc3RVdWlkMSkgewotICAgICAgc1Jlc3VsdCA9IFVVSUQxX0FERFIxOwotICAgIH0gZWxzZSBpZiAodXVpZCA9PSBCdGlmUHJvZmlsZVF1ZXVlVGVzdDo6a1Rlc3RVdWlkMikgewotICAgICAgc1Jlc3VsdCA9IFVVSUQyX0FERFIxOwotICAgIH0KLSAgfSBlbHNlIGlmICgqYmRhID09IEJ0aWZQcm9maWxlUXVldWVUZXN0OjprVGVzdEFkZHIyKSB7Ci0gICAgaWYgKHV1aWQgPT0gQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0VXVpZDEpIHsKLSAgICAgIHNSZXN1bHQgPSBVVUlEMV9BRERSMjsKLSAgICB9IGVsc2UgaWYgKHV1aWQgPT0gQnRpZlByb2ZpbGVRdWV1ZVRlc3Q6OmtUZXN0VXVpZDIpIHsKLSAgICAgIHNSZXN1bHQgPSBVVUlEMl9BRERSMjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19CVVNZOwotfQotCi1URVNUX0YoQnRpZlByb2ZpbGVRdWV1ZVRlc3QsIHRlc3RfY29ubmVjdF9mYWlsX3N0aWxsX2Nhbl9hZHZhbmNlX3RoZV9xdWV1ZSkgewotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgLy8gRmlyc3QgY29ubmVjdC1tZXNzYWdlIGZvciBVVUlEMS1BRERSMSBpcyBleGVjdXRlZCwgYnV0IGRvZXMgbm90IGJlIHJlbW92ZWQKLSAgLy8gZnJvbSBjb25uZWN0LXF1ZXVlIHlldC4KLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDEsICZrVGVzdEFkZHIxLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgVVVJRDFfQUREUjEpOwotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgLy8gU2Vjb25kIGNvbm5lY3QtbWVzc2FnZSBmb3IgVVVJRDItQUREUjEgYmUgcHVzaGVkIGludG8gY29ubmVjdC1xdWV1ZSwgYnV0IGlzCi0gIC8vIG5vdCBleGVjdXRlZAotICBidGlmX3F1ZXVlX2Nvbm5lY3Qoa1Rlc3RVdWlkMiwgJmtUZXN0QWRkcjEsIHRlc3RfY29ubmVjdF9jYl9mYWlsKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIE5PVF9TRVQpOwotICAvLyBUaGlyZCBjb25uZWN0LW1lc3NhZ2UgZm9yIFVVSUQxLUFERFIyIGJlIHB1c2hlZCBpbnRvIGNvbm5lY3QtcXVldWUsIGJ1dCBpcwotICAvLyBub3QgZXhlY3V0ZWQKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDEsICZrVGVzdEFkZHIyLCB0ZXN0X2Nvbm5lY3RfY2JfZmFpbCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLSAgLy8gRm91cnRoIGNvbm5lY3QtbWVzc2FnZSBmb3IgVVVJRDItQUREUjIgYmUgcHVzaGVkIGludG8gY29ubmVjdC1xdWV1ZSwgYnV0IGlzCi0gIC8vIG5vdCBleGVjdXRlZAotICBidGlmX3F1ZXVlX2Nvbm5lY3Qoa1Rlc3RVdWlkMiwgJmtUZXN0QWRkcjIsIHRlc3RfY29ubmVjdF9jYl9mYWlsKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIE5PVF9TRVQpOwotICAvLyByZW1vdmVkIEZpcnN0IGNvbm5lY3QtbWVzc2FnZSBmcm9tIGNvbm5lY3QtcXVldWUsIGNoZWNrIGl0IGNhbiBhZHZhbmNlIHRvCi0gIC8vIHN1YnNlcXVlbnQgY29ubmVjdC1tZXNzYWdlLgotICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQyX0FERFIyKTsKLX0KLQotVEVTVF9GKEJ0aWZQcm9maWxlUXVldWVUZXN0LCB0ZXN0X2Nvbm5lY3Rfc2FtZV91dWlkX2RvX25vdF9yZXBlYXQpIHsKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIxKTsKLSAgLy8gU2Vjb25kIGNvbm5lY3Rpb24gcmVxdWVzdCBvbiB0aGUgc2FtZSBVVUlEIGRvIG5vdCByZXBlYXQKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIE5PVF9TRVQpOwotICAvLyBOb3QgZXZlbiBhZnRlciB3ZSBhZHZhbmNlIHRoZSBxdWV1ZQotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLX0KLQotVEVTVF9GKEJ0aWZQcm9maWxlUXVldWVUZXN0LCB0ZXN0X211bHRpcGxlX2Nvbm5lY3RzKSB7Ci0gIC8vIEZpcnN0IGl0ZW0gaXMgZXhlY3V0ZWQKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIxKTsKLSAgLy8gU2Vjb25kIGl0ZW0gd2l0aCBhZHZhbmNlIGlzIGV4ZWN1dGVkCi0gIHNSZXN1bHQgPSBOT1RfU0VUOwotICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDIsICZrVGVzdEFkZHIxLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgVVVJRDJfQUREUjEpOwotfQotCi1URVNUX0YoQnRpZlByb2ZpbGVRdWV1ZVRlc3QsIHRlc3RfbXVsdGlwbGVfY29ubmVjdHNfd2l0aG91dF9hZHZhbmNlKSB7Ci0gIC8vIEZpcnN0IGl0ZW0gaXMgZXhlY3V0ZWQKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIxKTsKLSAgLy8gU2Vjb25kIGl0ZW0gd2l0aG91dCBhZHZhbmNlIGlzIG5vdCBleGVjdXRlZAotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDIsICZrVGVzdEFkZHIxLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgTk9UX1NFVCk7Ci0gIC8vIFRoaXJkIGl0ZW0gZm9yIHNhbWUgVVVJRDEsIGJ1dCBkaWZmZXJlbnQgYWRkcmVzcyBBRERSMgotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDEsICZrVGVzdEFkZHIyLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgTk9UX1NFVCk7Ci0gIC8vIEZvdXJ0aCBpdGVtIGZvciBzYW1lIFVVSUQyLCBidXQgZGlmZmVyZW50IGFkZHJlc3MgQUREUjIKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQyLCAma1Rlc3RBZGRyMiwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIE5PVF9TRVQpOwotICAvLyBDb25uZWN0IG5leHQgZG9lc24ndCB3b3JrCi0gIHNSZXN1bHQgPSBOT1RfU0VUOwotICBidGlmX3F1ZXVlX2Nvbm5lY3RfbmV4dCgpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgTk9UX1NFVCk7Ci0gIC8vIEFkdmFuY2UgbW92ZXMgcXVldWUgdG8gZXhlY3V0ZSBzZWNvbmQgaXRlbQotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBVVUlEMl9BRERSMSk7Ci0gIC8vIEFkdmFuY2UgbW92ZXMgcXVldWUgdG8gZXhlY3V0ZSB0aGlyZCBpdGVtCi0gIHNSZXN1bHQgPSBOT1RfU0VUOwotICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIyKTsKLSAgLy8gQWR2YW5jZSBtb3ZlcyBxdWV1ZSB0byBleGVjdXRlIGZvdXJ0aCBpdGVtCi0gIHNSZXN1bHQgPSBOT1RfU0VUOwotICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQyX0FERFIyKTsKLX0KLQotVEVTVF9GKEJ0aWZQcm9maWxlUXVldWVUZXN0LCB0ZXN0X2NsZWFudXBfZmlyc3RfYWxsb3dfc2Vjb25kKSB7Ci0gIC8vIEZpcnN0IGl0ZW0gaXMgZXhlY3V0ZWQKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIxKTsKLSAgLy8gU2Vjb25kIGl0ZW0gd2l0aG91dCBhZHZhbmNlIGlzIG5vdCBleGVjdXRlZAotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDIsICZrVGVzdEFkZHIxLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgTk9UX1NFVCk7Ci0gIC8vIENvbm5lY3QgbmV4dCBkb2Vzbid0IHdvcmsKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLSAgLy8gQ2xlYW51cCBVVUlEMSBhbGxvd3MgdGhlIG5leHQgcHJvZmlsZSBjb25uZWN0aW9uIHRvIGJlIGV4ZWN1dGVkCi0gIHNSZXN1bHQgPSBOT1RfU0VUOwotICBidGlmX3F1ZXVlX2NsZWFudXAoa1Rlc3RVdWlkMSk7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBVVUlEMl9BRERSMSk7Ci19Ci0KLVRFU1RfRihCdGlmUHJvZmlsZVF1ZXVlVGVzdCwgdGVzdF9jbGVhbnVwX2JvdGgpIHsKLSAgLy8gRmlyc3QgaXRlbSBpcyBleGVjdXRlZAotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDEsICZrVGVzdEFkZHIxLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgVVVJRDFfQUREUjEpOwotICAvLyBTZWNvbmQgaXRlbSB3aXRob3V0IGFkdmFuY2UgaXMgbm90IGV4ZWN1dGVkCi0gIHNSZXN1bHQgPSBOT1RfU0VUOwotICBidGlmX3F1ZXVlX2Nvbm5lY3Qoa1Rlc3RVdWlkMiwgJmtUZXN0QWRkcjEsIHRlc3RfY29ubmVjdF9jYik7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLSAgLy8gQ29ubmVjdCBuZXh0IGRvZXNuJ3Qgd29yawotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0X25leHQoKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIE5PVF9TRVQpOwotICAvLyBDbGVhbnVwIGJvdGggbGVhdmVzIG5vdGhpbmcgdG8gZXhlY3V0ZQotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jbGVhbnVwKGtUZXN0VXVpZDEpOwotICBidGlmX3F1ZXVlX2NsZWFudXAoa1Rlc3RVdWlkMik7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLX0KLQotVEVTVF9GKEJ0aWZQcm9maWxlUXVldWVUZXN0LCB0ZXN0X2NsZWFudXBfYm90aF9yZXZlcnNlX29yZGVyKSB7Ci0gIC8vIEZpcnN0IGl0ZW0gaXMgZXhlY3V0ZWQKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdChrVGVzdFV1aWQxLCAma1Rlc3RBZGRyMSwgdGVzdF9jb25uZWN0X2NiKTsKLSAgRVhQRUNUX0VRKHNSZXN1bHQsIFVVSUQxX0FERFIxKTsKLSAgLy8gU2Vjb25kIGl0ZW0gd2l0aG91dCBhZHZhbmNlIGlzIG5vdCBleGVjdXRlZAotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jb25uZWN0KGtUZXN0VXVpZDIsICZrVGVzdEFkZHIxLCB0ZXN0X2Nvbm5lY3RfY2IpOwotICBFWFBFQ1RfRVEoc1Jlc3VsdCwgTk9UX1NFVCk7Ci0gIC8vIENvbm5lY3QgbmV4dCBkb2Vzbid0IHdvcmsKLSAgc1Jlc3VsdCA9IE5PVF9TRVQ7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLSAgLy8gQ2xlYW51cCBib3RoIGluIHJldmVyc2Ugb3JkZXIgbGVhdmVzIG5vdGhpbmcgdG8gZXhlY3V0ZQotICBzUmVzdWx0ID0gTk9UX1NFVDsKLSAgYnRpZl9xdWV1ZV9jbGVhbnVwKGtUZXN0VXVpZDIpOwotICBidGlmX3F1ZXVlX2NsZWFudXAoa1Rlc3RVdWlkMSk7Ci0gIGJ0aWZfcXVldWVfY29ubmVjdF9uZXh0KCk7Ci0gIEVYUEVDVF9FUShzUmVzdWx0LCBOT1RfU0VUKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvdGVzdC9idGlmX3JjX3Rlc3QuY2MgYi9idGlmL3Rlc3QvYnRpZl9yY190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTViNTJlLi4wMDAwMDAwCi0tLSBhL2J0aWYvdGVzdC9idGlmX3JjX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXZfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9yYy5oIgotI2luY2x1ZGUgIm9zaS90ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLSN1bmRlZiBMT0dfVEFHCi0jaW5jbHVkZSAiYnRpZi9zcmMvYnRpZl9yYy5jYyIKLQotZXh0ZXJuIHZvaWQgYWxsb2NhdGlvbl90cmFja2VyX3VuaW5pdCh2b2lkKTsKLQotbmFtZXNwYWNlIHsKLWludCBBVlJDX0JsZFJlc3BvbnNlXyA9IDA7Ci19ICAvLyBuYW1lc3BhY2UKLQotdWludDhfdCBhcHBsX3RyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORzsKLXVpbnQ4X3QgYnRpZl90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkc7Ci0KLXRBVlJDX1NUUyBBVlJDX0JsZENvbW1hbmQodEFWUkNfQ09NTUFORCogcF9jbWQsIEJUX0hEUioqIHBwX3BrdCkgeyByZXR1cm4gMDsgfQotdEFWUkNfU1RTIEFWUkNfQmxkUmVzcG9uc2UodWludDhfdCBoYW5kbGUsIHRBVlJDX1JFU1BPTlNFKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUioqIHBwX3BrdCkgewotICBBVlJDX0JsZFJlc3BvbnNlXysrOwotICByZXR1cm4gMDsKLX0KLXRBVlJDX1NUUyBBVlJDX0N0cmxfUGFyc0NvbW1hbmQodEFWUkNfTVNHKiBwX21zZywgdEFWUkNfQ09NTUFORCogcF9yZXN1bHQpIHsKLSAgcmV0dXJuIDA7Ci19Ci10QVZSQ19TVFMgQVZSQ19DdHJsX1BhcnNSZXNwb25zZSh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19SRVNQT05TRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2J1ZiwgdWludDE2X3QqIGJ1Zl9sZW4pIHsKLSAgcmV0dXJuIDA7Ci19Ci10QVZSQ19TVFMgQVZSQ19QYXJzQ29tbWFuZCh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19DT01NQU5EKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYnVmLCB1aW50MTZfdCBidWZfbGVuKSB7Ci0gIHJldHVybiAwOwotfQotdEFWUkNfU1RTIEFWUkNfUGFyc1Jlc3BvbnNlKHRBVlJDX01TRyogcF9tc2csIHRBVlJDX1JFU1BPTlNFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90KiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBidWZfbGVuKSB7Ci0gIHJldHVybiAwOwotfQotdm9pZCBCVEFfQXZDbG9zZVJjKHVpbnQ4X3QgcmNfaGFuZGxlKSB7fQotdm9pZCBCVEFfQXZNZXRhQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NNRCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7fQotdm9pZCBCVEFfQXZNZXRhUnNwKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkge30KLXZvaWQgQlRBX0F2UmVtb3RlQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX1JDIHJjX2lkLAotICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9TVEFURSBrZXlfc3RhdGUpIHt9Ci12b2lkIEJUQV9BdlJlbW90ZVZlbmRvclVuaXF1ZUNtZCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQVZfU1RBVEUga2V5X3N0YXRlLCB1aW50OF90KiBwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX2xlbikge30KLXZvaWQgQlRBX0F2VmVuZG9yQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbikge30KLXZvaWQgQlRBX0F2VmVuZG9yUnNwKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QlRBX0FWX0NPREUgcnNwX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgdWludDMyX3QgY29tcGFueV9pZCkge30KLXZvaWQgYnRpZl9hdl9jbGVhcl9yZW1vdGVfc3VzcGVuZF9mbGFnKHZvaWQpIHt9Ci1ib29sIGJ0aWZfYXZfaXNfY29ubmVjdGVkKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1ib29sIGJ0aWZfYXZfaXNfc2lua19lbmFibGVkKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1SYXdBZGRyZXNzIGJ0aWZfYXZfc2lua19hY3RpdmVfcGVlcih2b2lkKSB7IHJldHVybiBSYXdBZGRyZXNzKCk7IH0KLVJhd0FkZHJlc3MgYnRpZl9hdl9zb3VyY2VfYWN0aXZlX3BlZXIodm9pZCkgeyByZXR1cm4gUmF3QWRkcmVzcygpOyB9Ci1ib29sIGJ0aWZfYXZfc3RyZWFtX3N0YXJ0ZWRfcmVhZHkodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLWJ0X3N0YXR1c190IGJ0aWZfdHJhbnNmZXJfY29udGV4dCh0QlRJRl9DQkFDSyogcF9jYmFjaywgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9wYXJhbXMsIGludCBwYXJhbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUSUZfQ09QWV9DQkFDSyogcF9jb3B5X2NiYWNrKSB7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWNvbnN0IGNoYXIqIGR1bXBfcmNfZXZlbnQodWludDhfdCBldmVudCkgeyByZXR1cm4gbnVsbHB0cjsgfQotY29uc3QgY2hhciogZHVtcF9yY19ub3RpZmljYXRpb25fZXZlbnRfaWQodWludDhfdCBldmVudF9pZCkgeyByZXR1cm4gbnVsbHB0cjsgfQotY29uc3QgY2hhciogZHVtcF9yY19wZHUodWludDhfdCBwZHUpIHsgcmV0dXJuIG51bGxwdHI7IH0KLWJ0X3N0YXR1c190IGRvX2luX2puaV90aHJlYWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaykgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLWJvb2wgaW50ZXJvcF9tYXRjaF9hZGRyKGNvbnN0IGludGVyb3BfZmVhdHVyZV90IGZlYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgTG9nTXNnKHVpbnQzMl90IHRyYWNlX3NldF9tYXNrLCBjb25zdCBjaGFyKiBmbXRfc3RyLCAuLi4pIHt9Ci0KLS8qKgotICogVGVzdCBjbGFzcyB0byB0ZXN0IHNlbGVjdGVkIGZ1bmN0aW9uYWxpdHkgaW4gaGNpL3NyYy9oY2lfbGF5ZXIuY2MKLSAqLwotY2xhc3MgQnRpZlJjVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3MgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlNldFVwKCk7Ci0gICAgLy8gRGlzYWJsZSBvdXIgYWxsb2NhdGlvbiB0cmFja2VyIHRvIGFsbG93IEFTQU4gZnVsbCByYW5nZQotICAgIGFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IEFsbG9jYXRpb25UZXN0SGFybmVzczo6VGVhckRvd24oKTsgfQotfTsKLQotVEVTVF9GKEJ0aWZSY1Rlc3QsIGdldF9lbGVtZW50X2F0dHJfcnNwKSB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLQotICBidGlmX3JjX2NiLnJjX211bHRpX2NiWzBdLnJjX2FkZHIgPSBiZF9hZGRyOwotICBidGlmX3JjX2NiLnJjX211bHRpX2NiWzBdLnJjX2Nvbm5lY3RlZCA9IHRydWU7Ci0gIGJ0aWZfcmNfY2IucmNfbXVsdGlfY2JbMF0KLSAgICAgIC5yY19wZHVfaW5mb1tJRFhfR0VUX0VMRU1FTlRfQVRUUl9SU1BdCi0gICAgICAuaXNfcnNwX3BlbmRpbmcgPSB0cnVlOwotICBidGlmX3JjX2NiLnJjX211bHRpX2NiWzBdLnJjX3N0YXRlID0gQlRSQ19DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLQotICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCBwX2F0dHJzW0JUUkNfTUFYX0VMRU1fQVRUUl9TSVpFXTsKLSAgdWludDhfdCBudW1fYXR0ciA9IEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFICsgMTsKLQotICBDSEVDSyhnZXRfZWxlbWVudF9hdHRyX3JzcChiZF9hZGRyLCBudW1fYXR0ciwgcF9hdHRycykgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBDSEVDSyhBVlJDX0JsZFJlc3BvbnNlXyA9PSAxKTsKLX0KZGlmZiAtLWdpdCBhL2J0aWYvdGVzdC9idGlmX3N0b3JhZ2VfdGVzdC5jYyBiL2J0aWYvdGVzdC9idGlmX3N0b3JhZ2VfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMDc2My4uMDAwMDAwMAotLS0gYS9idGlmL3Rlc3QvYnRpZl9zdG9yYWdlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfdXRpbC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotVEVTVChCdGlmU3RvcmFnZVRlc3QsIHRlc3RfdXVpZF9zcGxpdF9tdWx0aXBsZSkgewotICBjb25zdCBjaGFyKiBzMSA9Ci0gICAgICAiZTM5YzYyODUtODY3Zi00YjFkLTlkYjAtMzVmYmQ5YWViZjIyICIKLSAgICAgICJlMzljNjI4NS04NjdmLTRiMWQtOWRiMC0zNWZiZDlhZWJmMjMiOwotICBjb25zdCB1aW50OF90IHUxW10gPSB7MHhlMywgMHg5YywgMHg2MiwgMHg4NSwgMHg4NiwgMHg3ZiwgMHg0YiwgMHgxZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4OWQsIDB4YjAsIDB4MzUsIDB4ZmIsIDB4ZDksIDB4YWUsIDB4YmYsIDB4MjJ9OwotICBjb25zdCB1aW50OF90IHUyW10gPSB7MHhlMywgMHg5YywgMHg2MiwgMHg4NSwgMHg4NiwgMHg3ZiwgMHg0YiwgMHgxZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4OWQsIDB4YjAsIDB4MzUsIDB4ZmIsIDB4ZDksIDB4YWUsIDB4YmYsIDB4MjN9OwotCi0gIFV1aWQgdXVpZHNbMl07Ci0gIHNpemVfdCBudW1fdXVpZHMgPSBidGlmX3NwbGl0X3V1aWRzX3N0cmluZyhzMSwgdXVpZHMsIDIpOwotICBFWFBFQ1RfRVEobnVtX3V1aWRzLCAydSk7Ci0gIEVYUEVDVF9UUlVFKG1lbWNtcCh1dWlkc1swXS5UbzEyOEJpdEJFKCkuZGF0YSgpLCB1MSwgc2l6ZW9mKHUxKSkgPT0gMCk7Ci0gIEVYUEVDVF9UUlVFKG1lbWNtcCh1dWlkc1sxXS5UbzEyOEJpdEJFKCkuZGF0YSgpLCB1Miwgc2l6ZW9mKHUyKSkgPT0gMCk7Ci19Ci0KLVRFU1QoQnRpZlN0b3JhZ2VUZXN0LCB0ZXN0X3V1aWRfc3BsaXRfcGFydGlhbCkgewotICBjb25zdCBjaGFyKiBzMSA9Ci0gICAgICAiZTM5YzYyODUtODY3Zi00YjFkLTlkYjAtMzVmYmQ5YWViZjIyICIKLSAgICAgICJlMzljNjI4NS04NjdmLTRiMWQtOWRiMC0zNWZiZDlhZWJmMjMiOwotCi0gIFV1aWQgdXVpZHNbMl07Ci0gIHNpemVfdCBudW1fdXVpZHMgPSBidGlmX3NwbGl0X3V1aWRzX3N0cmluZyhzMSwgdXVpZHMsIDEpOwotICBFWFBFQ1RfRVEobnVtX3V1aWRzLCAxdSk7Ci19CmRpZmYgLS1naXQgYS9idWlsZC5weSBiL2J1aWxkLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmNiMmZiLi4wMDAwMDAwCi0tLSBhL2J1aWxkLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzIwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0iIiIgQnVpbGQgQlQgdGFyZ2V0cyBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLUZvciBidWlsZGluZywgeW91IHdpbGwgZmlyc3QgaGF2ZSB0byBzdGFnZSBhIHBsYXRmb3JtIGRpcmVjdG9yeSB0aGF0IGhhcyB0aGUKLWZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci18LWNvbW1vbi1tawotfC1idAotfC1leHRlcm5hbAotfC18LXJ1c3QKLXwtfC18LXZlbmRvcgotCi1UaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY2hlY2sgb3V0IHBsYXRmb3JtMiB0byBhbm90aGVyIGRpcmVjdG9yeSAodGhhdAotaXMgbm90IGEgc3ViZGlyIG9mIHRoaXMgYnQgZGlyZWN0b3J5KSwgc3ltbGluayBidCB0aGVyZSBhbmQgc3ltbGluayB0aGUgcnVzdAotdmVuZG9yIHJlcG9zaXRvcnkgYXMgd2VsbC4KLSIiIgotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgbXVsdGlwcm9jZXNzaW5nCi1pbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaXgKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGltZQotCi0jIFVzZSBmbGFncyByZXF1aXJlZCBieSBjb21tb24tbWsgKGZpbmQgLXR5cGUgZiB8IGdyZXAgLW5FICd1c2VbLl0nIHt9KQotQ09NTU9OX01LX1VTRVMgPSBbCi0gICAgJ2FzYW4nLAotICAgICdjb3ZlcmFnZScsCi0gICAgJ2Nyb3NfaG9zdCcsCi0gICAgJ2Z1enplcicsCi0gICAgJ2Z1enplcicsCi0gICAgJ21zYW4nLAotICAgICdwcm9maWxpbmcnLAotICAgICd0Y21hbGxvYycsCi0gICAgJ3Rlc3QnLAotICAgICd1YnNhbicsCi1dCi0KLSMgRGVmYXVsdCB1c2UgZmxhZ3MuCi1VU0VfREVGQVVMVFMgPSB7Ci0gICAgJ2FuZHJvaWQnOiBGYWxzZSwKLSAgICAnYnRfbm9uc3RhbmRhcmRfY29kZWNzJzogRmFsc2UsCi0gICAgJ3Rlc3QnOiBGYWxzZSwKLX0KLQotVkFMSURfVEFSR0VUUyA9IFsKLSAgICAncHJlcGFyZScsICAjIFByZXBhcmUgdGhlIG91dHB1dCBkaXJlY3RvcnkgKGduIGdlbiArIHJ1c3Qgc2V0dXApCi0gICAgJ3Rvb2xzJywgICMgQnVpbGQgdGhlIGhvc3QgdG9vbHMgKGkuZS4gcGFja2V0Z2VuKQotICAgICdydXN0JywgICMgQnVpbGQgb25seSB0aGUgcnVzdCBjb21wb25lbnRzICsgY29weSBhcnRpZmFjdHMgdG8gb3V0cHV0IGRpcgotICAgICdtYWluJywgICMgQnVpbGQgdGhlIG1haW4gQysrIGNvZGViYXNlCi0gICAgJ3Rlc3QnLCAgIyBSdW4gdGhlIHVuaXQgdGVzdHMKLSAgICAnY2xlYW4nLCAgIyBDbGVhbiB1cCBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgJ2FsbCcsICAjIEFsbCB0YXJnZXRzIGV4Y2VwdCB0ZXN0IGFuZCBjbGVhbgotXQotCi0jIFRPRE8oYi8xOTA3NTAxNjcpIC0gSG9zdCB0ZXN0cyBhcmUgZGlzYWJsZWQgdW50aWwgd2UgYXJlIGZ1bGwgYmF6ZWwgYnVpbGQKLUhPU1RfVEVTVFMgPSBbCi0gICAgIyAnYmx1ZXRvb3RoX3Rlc3RfY29tbW9uJywKLSAgICAjICdibHVldG9vdGh0YmRfdGVzdCcsCi0gICAgIyAnbmV0X3Rlc3RfYXZyY3AnLAotICAgICMgJ25ldF90ZXN0X2J0Y29yZScsCi0gICAgIyAnbmV0X3Rlc3RfdHlwZXMnLAotICAgICMgJ25ldF90ZXN0X2J0bV9pc28nLAotICAgICMgJ25ldF90ZXN0X2J0cGFja2V0cycsCi1dCi0KLUJPT1RTVFJBUF9HSVRfUkVQT1MgPSB7Ci0gICAgJ3BsYXRmb3JtMic6ICdodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW1vcy9wbGF0Zm9ybTInLAotICAgICdydXN0X2NyYXRlcyc6ICdodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW1vcy90aGlyZF9wYXJ0eS9ydXN0X2NyYXRlcycsCi0gICAgJ3Byb3RvX2xvZ2dpbmcnOiAnaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nJwotfQotCi0jIExpc3Qgb2YgcGFja2FnZXMgcmVxdWlyZWQgZm9yIGxpbnV4IGJ1aWxkCi1SRVFVSVJFRF9BUFRfUEFDS0FHRVMgPSBbCi0gICAgJ2Jpc29uJywKLSAgICAnYnVpbGQtZXNzZW50aWFsJywKLSAgICAnY3VybCcsCi0gICAgJ2RlYm1ha2UnLAotICAgICdmbGF0YnVmZmVycy1jb21waWxlcicsCi0gICAgJ2ZsZXgnLAotICAgICdnKystbXVsdGlsaWInLAotICAgICdnY2MtbXVsdGlsaWInLAotICAgICdnZW5lcmF0ZS1uaW5qYScsCi0gICAgJ2dudXBnJywKLSAgICAnZ3BlcmYnLAotICAgICdsaWJjKystZGV2JywKLSAgICAnbGliZGJ1cy0xLWRldicsCi0gICAgJ2xpYmV2ZW50LWRldicsCi0gICAgJ2xpYmV2ZW50LWRldicsCi0gICAgJ2xpYmZsYXRidWZmZXJzLWRldicsCi0gICAgJ2xpYmZsYXRidWZmZXJzMScsCi0gICAgJ2xpYmdsMS1tZXNhLWRldicsCi0gICAgJ2xpYmdsaWIyLjAtZGV2JywKLSAgICAnbGlibHo0LXRvb2wnLAotICAgICdsaWJuY3Vyc2VzNScsCi0gICAgJ2xpYm5zczMtZGV2JywKLSAgICAnbGlicHJvdG9idWYtZGV2JywKLSAgICAnbGlicmUyLTknLAotICAgICdsaWJzc2wtZGV2JywKLSAgICAnbGlidGlueXhtbDItZGV2JywKLSAgICAnbGlieDExLWRldicsCi0gICAgJ2xpYnhtbDItdXRpbHMnLAotICAgICduaW5qYS1idWlsZCcsCi0gICAgJ29wZW5zc2wnLAotICAgICdwcm90b2J1Zi1jb21waWxlcicsCi0gICAgJ3VuemlwJywKLSAgICAneDExcHJvdG8tY29yZS1kZXYnLAotICAgICd4c2x0cHJvYycsCi0gICAgJ3ppcCcsCi0gICAgJ3psaWIxZy1kZXYnLAotXQotCi0jIExpc3Qgb2YgY2FyZ28gcGFja2FnZXMgcmVxdWlyZWQgZm9yIGxpbnV4IGJ1aWxkCi1SRVFVSVJFRF9DQVJHT19QQUNLQUdFUyA9IFsnY3h4YnJpZGdlLWNtZCddCi0KLUFQVF9QS0dfTElTVCA9IFsnYXB0JywgJy1xcScsICdsaXN0J10KLUNBUkdPX1BLR19MSVNUID0gWydjYXJnbycsICdpbnN0YWxsJywgJy0tbGlzdCddCi0KLQotY2xhc3MgVXNlRmxhZ3MoKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VfZmxhZ3MpOgotICAgICAgICAiIiIgQ29uc3RydWN0IHRoZSB1c2UgZmxhZ3MuCi0KLSAgICAgICAgQXJnczoKLSAgICAgICAgICAgIHVzZV9mbGFnczogTGlzdCBvZiB1c2UgZmxhZ3MgcGFyc2VkIGZyb20gdGhlIGNvbW1hbmQuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmZsYWdzID0ge30KLQotICAgICAgICAjIEltcG9ydCB1c2UgZmxhZ3MgcmVxdWlyZWQgYnkgY29tbW9uLW1rCi0gICAgICAgIGZvciB1c2UgaW4gQ09NTU9OX01LX1VTRVM6Ci0gICAgICAgICAgICBzZWxmLnNldF9mbGFnKHVzZSwgRmFsc2UpCi0KLSAgICAgICAgIyBTZXQgb3VyIGRlZmF1bHRzCi0gICAgICAgIGZvciB1c2UsIHZhbHVlIGluIFVTRV9ERUZBVUxUUy5pdGVtcygpOgotICAgICAgICAgICAgc2VsZi5zZXRfZmxhZyh1c2UsIHZhbHVlKQotCi0gICAgICAgICMgU2V0IHVzZSBmbGFncyAtIHZhbHVlIGlzIHNldCB0byBUcnVlIHVubGVzcyB0aGUgdXNlIHN0YXJ0cyB3aXRoIC0KLSAgICAgICAgIyBBbGwgZ2l2ZW4gdXNlIGZsYWdzIGFsd2F5cyBvdmVycmlkZSB0aGUgZGVmYXVsdHMKLSAgICAgICAgZm9yIHVzZSBpbiB1c2VfZmxhZ3M6Ci0gICAgICAgICAgICB2YWx1ZSA9IG5vdCB1c2Uuc3RhcnRzd2l0aCgnLScpCi0gICAgICAgICAgICBzZWxmLnNldF9mbGFnKHVzZSwgdmFsdWUpCi0KLSAgICBkZWYgc2V0X2ZsYWcoc2VsZiwga2V5LCB2YWx1ZT1UcnVlKToKLSAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHZhbHVlKQotICAgICAgICBzZWxmLmZsYWdzW2tleV0gPSB2YWx1ZQotCi0KLWNsYXNzIEhvc3RCdWlsZCgpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiIgQ29uc3RydWN0IHRoZSBidWlsZGVyLgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBhcmdzOiBQYXJzZWQgYXJndW1lbnRzIGZyb20gQXJndW1lbnRQYXJzZXIKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKLQotICAgICAgICAjIFNldCBqb2JzIHRvIG51bWJlciBvZiBjcHVzIHVubGVzcyBleHBsaWNpdGx5IHNldAotICAgICAgICBzZWxmLmpvYnMgPSBzZWxmLmFyZ3Muam9icwotICAgICAgICBpZiBub3Qgc2VsZi5qb2JzOgotICAgICAgICAgICAgc2VsZi5qb2JzID0gbXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpCi0gICAgICAgICAgICBwcmludCgiTnVtYmVyIG9mIGpvYnMgPSB7fSIuZm9ybWF0KHNlbGYuam9icykpCi0KLSAgICAgICAgIyBOb3JtYWxpemUgYm9vdHN0cmFwIGRpciBhbmQgbWFrZSBzdXJlIGl0IGV4aXN0cwotICAgICAgICBzZWxmLmJvb3RzdHJhcF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5hcmdzLmJvb3RzdHJhcF9kaXIpCi0gICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuYm9vdHN0cmFwX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKLQotICAgICAgICAjIE91dHB1dCBhbmQgcGxhdGZvcm0gZGlyZWN0b3JpZXMgYXJlIGJhc2VkIG9uIGJvb3RzdHJhcAotICAgICAgICBzZWxmLm91dHB1dF9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5ib290c3RyYXBfZGlyLCAnb3V0cHV0JykKLSAgICAgICAgc2VsZi5wbGF0Zm9ybV9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5ib290c3RyYXBfZGlyLCAnc3RhZ2luZycpCi0gICAgICAgIHNlbGYuc3lzcm9vdCA9IHNlbGYuYXJncy5zeXNyb290Ci0gICAgICAgIHNlbGYubGliZGlyID0gc2VsZi5hcmdzLmxpYmRpcgotCi0gICAgICAgICMgSWYgZGVmYXVsdCB0YXJnZXQgaXNuJ3Qgc2V0LCBidWlsZCBldmVyeXRoaW5nCi0gICAgICAgIHNlbGYudGFyZ2V0ID0gJ2FsbCcKLSAgICAgICAgaWYgaGFzYXR0cihzZWxmLmFyZ3MsICd0YXJnZXQnKSBhbmQgc2VsZi5hcmdzLnRhcmdldDoKLSAgICAgICAgICAgIHNlbGYudGFyZ2V0ID0gc2VsZi5hcmdzLnRhcmdldAotCi0gICAgICAgIHRhcmdldF91c2UgPSBzZWxmLmFyZ3MudXNlIGlmIHNlbGYuYXJncy51c2UgZWxzZSBbXQotCi0gICAgICAgICMgVW5sZXNzIHNldCwgYWx3YXlzIGJ1aWxkIHRlc3QgY29kZQotICAgICAgICBpZiBub3Qgc2VsZi5hcmdzLm5vdGVzdDoKLSAgICAgICAgICAgIHRhcmdldF91c2UuYXBwZW5kKCd0ZXN0JykKLQotICAgICAgICBzZWxmLnVzZSA9IFVzZUZsYWdzKHRhcmdldF91c2UpCi0KLSAgICAgICAgIyBWYWxpZGF0ZSBwbGF0Zm9ybSBkaXJlY3RvcnkKLSAgICAgICAgYXNzZXJ0IG9zLnBhdGguaXNkaXIoc2VsZi5wbGF0Zm9ybV9kaXIpLCAnUGxhdGZvcm0gZGlyIGRvZXMgbm90IGV4aXN0JwotICAgICAgICBhc3NlcnQgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHNlbGYucGxhdGZvcm1fZGlyLCAnLmduJykpLCAnUGxhdGZvcm0gZGlyIGRvZXMgbm90IGhhdmUgLmduIGF0IHJvb3QnCi0KLSAgICAgICAgIyBNYWtlIHN1cmUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHMgKG9yIGNyZWF0ZSBpdCkKLSAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5vdXRwdXRfZGlyLCBleGlzdF9vaz1UcnVlKQotCi0gICAgICAgICMgU2V0IHNvbWUgZGVmYXVsdCBhdHRyaWJ1dGVzCi0gICAgICAgIHNlbGYubGliYmFzZV92ZXIgPSBOb25lCi0KLSAgICAgICAgc2VsZi5jb25maWd1cmVfZW52aXJvbigpCi0KLSAgICBkZWYgX2dlbmVyYXRlX3J1c3RmbGFncyhzZWxmKToKLSAgICAgICAgIiIiIFJ1c3RmbGFncyB0byBpbmNsdWRlIGZvciB0aGUgYnVpbGQuCi0gICAgICAiIiIKLSAgICAgICAgcnVzdF9mbGFncyA9IFsKLSAgICAgICAgICAgICctTCcsCi0gICAgICAgICAgICAne30vb3V0L0RlZmF1bHQnLmZvcm1hdChzZWxmLm91dHB1dF9kaXIpLAotICAgICAgICAgICAgJy1DJywKLSAgICAgICAgICAgICdsaW5rLWFyZz0tV2wsLS1hbGxvdy1tdWx0aXBsZS1kZWZpbml0aW9uJywKLSAgICAgICAgXQotCi0gICAgICAgIHJldHVybiAnICcuam9pbihydXN0X2ZsYWdzKQotCi0gICAgZGVmIGNvbmZpZ3VyZV9lbnZpcm9uKHNlbGYpOgotICAgICAgICAiIiIgQ29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgR04gYW5kIENhcmdvLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5lbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQotCi0gICAgICAgICMgTWFrZSBzdXJlIGNhcmdvIGhvbWUgZGlyIGV4aXN0cyBhbmQgaGFzIGEgYmluIGRpcmVjdG9yeQotICAgICAgICBjYXJnb19ob21lID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgJ2NhcmdvX2hvbWUnKQotICAgICAgICBvcy5tYWtlZGlycyhjYXJnb19ob21lLCBleGlzdF9vaz1UcnVlKQotICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4oY2FyZ29faG9tZSwgJ2JpbicpLCBleGlzdF9vaz1UcnVlKQotCi0gICAgICAgICMgQ29uZmlndXJlIFJ1c3QgZW52IHZhcmlhYmxlcwotICAgICAgICBzZWxmLmVudlsnQ0FSR09fVEFSR0VUX0RJUiddID0gc2VsZi5vdXRwdXRfZGlyCi0gICAgICAgIHNlbGYuZW52WydDQVJHT19IT01FJ10gPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAnY2FyZ29faG9tZScpCi0gICAgICAgIHNlbGYuZW52WydSVVNURkxBR1MnXSA9IHNlbGYuX2dlbmVyYXRlX3J1c3RmbGFncygpCi0gICAgICAgIHNlbGYuZW52WydDWFhfUk9PVF9QQVRIJ10gPSBvcy5wYXRoLmpvaW4oc2VsZi5wbGF0Zm9ybV9kaXIsICdidCcpCi0KLSAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgdGFyZ2V0LCBhcmdzLCBjd2Q9Tm9uZSwgZW52PU5vbmUpOgotICAgICAgICAiIiIgUnVuIGNvbW1hbmQgYW5kIHN0cmVhbSB0aGUgb3V0cHV0LgotICAgICAgICAiIiIKLSAgICAgICAgIyBTZXQgc29tZSBkZWZhdWx0cwotICAgICAgICBpZiBub3QgY3dkOgotICAgICAgICAgICAgY3dkID0gc2VsZi5wbGF0Zm9ybV9kaXIKLSAgICAgICAgaWYgbm90IGVudjoKLSAgICAgICAgICAgIGVudiA9IHNlbGYuZW52Ci0KLSAgICAgICAgbG9nX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAne30ubG9nJy5mb3JtYXQodGFyZ2V0KSkKLSAgICAgICAgd2l0aCBvcGVuKGxvZ19maWxlLCAnd2InKSBhcyBsZjoKLSAgICAgICAgICAgIHJjID0gMAotICAgICAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywgY3dkPWN3ZCwgZW52PWVudiwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3Muc3Rkb3V0LnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICBwcmludChsaW5lLmRlY29kZSgndXRmLTgnKSwgZW5kPSIiKQotICAgICAgICAgICAgICAgIGxmLndyaXRlKGxpbmUpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gcHJvY2Vzcy5wb2xsKCkKLSAgICAgICAgICAgICAgICAgICAgaWYgcmMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotCi0gICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQotCi0gICAgICAgICAgICBpZiByYyAhPSAwOgotICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiUmV0dXJuIGNvZGUgaXMge30iLmZvcm1hdChyYykpCi0KLSAgICBkZWYgX2dldF9iYXNldmVyKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmxpYmJhc2VfdmVyOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYubGliYmFzZV92ZXIKLQotICAgICAgICBzZWxmLmxpYmJhc2VfdmVyID0gb3MuZW52aXJvbi5nZXQoJ0JBU0VfVkVSJywgJycpCi0gICAgICAgIGlmIG5vdCBzZWxmLmxpYmJhc2VfdmVyOgotICAgICAgICAgICAgYmFzZV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYuc3lzcm9vdCwgJ3Vzci9zaGFyZS9saWJjaHJvbWUvQkFTRV9WRVInKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHdpdGggb3BlbihiYXNlX2ZpbGUsICdyJykgYXMgZjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5saWJiYXNlX3ZlciA9IGYucmVhZCgpLnN0cmlwKCdcbicpCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5saWJiYXNlX3ZlciA9ICdOT1QtSU5TVEFMTEVEJwotCi0gICAgICAgIHJldHVybiBzZWxmLmxpYmJhc2VfdmVyCi0KLSAgICBkZWYgX2duX2RlZmF1bHRfb3V0cHV0KHNlbGYpOgotICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgJ291dC9EZWZhdWx0JykKLQotICAgIGRlZiBfZ25fY29uZmlndXJlKHNlbGYpOgotICAgICAgICAiIiIgQ29uZmlndXJlIGFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzIGZvciBwbGF0Zm9ybTIuCi0KLSAgICAgICAgTW9zdGx5IGNvcGllZCBmcm9tIC8vY29tbW9uLW1rL3BsYXRmb3JtMi5weQotICAgICAgICAiIiIKLSAgICAgICAgY2xhbmcgPSBub3Qgc2VsZi5hcmdzLm5vX2NsYW5nCi0KLSAgICAgICAgZGVmIHRvX2duX3N0cmluZyhzKToKLSAgICAgICAgICAgIHJldHVybiAnIiVzIicgJSBzLnJlcGxhY2UoJyInLCAnXFwiJykKLQotICAgICAgICBkZWYgdG9fZ25fbGlzdChzdHJzKToKLSAgICAgICAgICAgIHJldHVybiAnWyVzXScgJSAnLCcuam9pbihbdG9fZ25fc3RyaW5nKHMpIGZvciBzIGluIHN0cnNdKQotCi0gICAgICAgIGRlZiB0b19nbl9hcmdzX2FyZ3MoZ25fYXJncyk6Ci0gICAgICAgICAgICBmb3IgaywgdiBpbiBnbl9hcmdzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBib29sKToKLSAgICAgICAgICAgICAgICAgICAgdiA9IHN0cih2KS5sb3dlcigpCi0gICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHYsIGxpc3QpOgotICAgICAgICAgICAgICAgICAgICB2ID0gdG9fZ25fbGlzdCh2KQotICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBzaXguc3RyaW5nX3R5cGVzKToKLSAgICAgICAgICAgICAgICAgICAgdiA9IHRvX2duX3N0cmluZyh2KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmV4cGVjdGVkICVzLCAlcj0lcicgJSAodHlwZSh2KSwgaywgdikpCi0gICAgICAgICAgICAgICAgeWllbGQgJyVzPSVzJyAlIChrLnJlcGxhY2UoJy0nLCAnXycpLCB2KQotCi0gICAgICAgIGduX2FyZ3MgPSB7Ci0gICAgICAgICAgICAncGxhdGZvcm1fc3ViZGlyJzogJ2J0JywKLSAgICAgICAgICAgICdjYyc6ICdjbGFuZycgaWYgY2xhbmcgZWxzZSAnZ2NjJywKLSAgICAgICAgICAgICdjeHgnOiAnY2xhbmcrKycgaWYgY2xhbmcgZWxzZSAnZysrJywKLSAgICAgICAgICAgICdhcic6ICdsbHZtLWFyJyBpZiBjbGFuZyBlbHNlICdhcicsCi0gICAgICAgICAgICAncGtnLWNvbmZpZyc6ICdwa2ctY29uZmlnJywKLSAgICAgICAgICAgICdjbGFuZ19jYyc6IGNsYW5nLAotICAgICAgICAgICAgJ2NsYW5nX2N4eCc6IGNsYW5nLAotICAgICAgICAgICAgJ09TJzogJ2xpbnV4JywKLSAgICAgICAgICAgICdzeXNyb290Jzogc2VsZi5zeXNyb290LAotICAgICAgICAgICAgJ2xpYmRpcic6IG9zLnBhdGguam9pbihzZWxmLnN5c3Jvb3QsIHNlbGYubGliZGlyKSwKLSAgICAgICAgICAgICdidWlsZF9yb290Jzogc2VsZi5vdXRwdXRfZGlyLAotICAgICAgICAgICAgJ3BsYXRmb3JtMl9yb290Jzogc2VsZi5wbGF0Zm9ybV9kaXIsCi0gICAgICAgICAgICAnbGliYmFzZV92ZXInOiBzZWxmLl9nZXRfYmFzZXZlcigpLAotICAgICAgICAgICAgJ2VuYWJsZV9leGNlcHRpb25zJzogb3MuZW52aXJvbi5nZXQoJ0NYWEVYQ0VQVElPTlMnLCAwKSA9PSAnMScsCi0gICAgICAgICAgICAnZXh0ZXJuYWxfY2ZsYWdzJzogW10sCi0gICAgICAgICAgICAnZXh0ZXJuYWxfY3h4ZmxhZ3MnOiBbXSwKLSAgICAgICAgICAgICdlbmFibGVfd2Vycm9yJzogRmFsc2UsCi0gICAgICAgIH0KLQotICAgICAgICBpZiBjbGFuZzoKLSAgICAgICAgICAgICMgTWFrZSBzdXJlIHRvIG1hcmsgdGhlIGNsYW5nIHVzZSBmbGFnIGFzIHRydWUKLSAgICAgICAgICAgIHNlbGYudXNlLnNldF9mbGFnKCdjbGFuZycsIFRydWUpCi0gICAgICAgICAgICBnbl9hcmdzWydleHRlcm5hbF9jeHhmbGFncyddICs9IFsnLUkvdXNyL2luY2x1ZGUvJ10KLQotICAgICAgICBnbl9hcmdzX2FyZ3MgPSBsaXN0KHRvX2duX2FyZ3NfYXJncyhnbl9hcmdzKSkKLSAgICAgICAgdXNlX2FyZ3MgPSBbJyVzPSVzJyAlIChrLCBzdHIodikubG93ZXIoKSkgZm9yIGssIHYgaW4gc2VsZi51c2UuZmxhZ3MuaXRlbXMoKV0KLSAgICAgICAgZ25fYXJnc19hcmdzICs9IFsndXNlPXslc30nICUgKCcgJy5qb2luKHVzZV9hcmdzKSldCi0KLSAgICAgICAgZ25fYXJncyA9IFsKLSAgICAgICAgICAgICdnbicsCi0gICAgICAgICAgICAnZ2VuJywKLSAgICAgICAgXQotCi0gICAgICAgIGlmIHNlbGYuYXJncy52ZXJib3NlOgotICAgICAgICAgICAgZ25fYXJncy5hcHBlbmQoJy12JykKLQotICAgICAgICBnbl9hcmdzICs9IFsKLSAgICAgICAgICAgICctLXJvb3Q9JXMnICUgc2VsZi5wbGF0Zm9ybV9kaXIsCi0gICAgICAgICAgICAnLS1hcmdzPSVzJyAlICcgJy5qb2luKGduX2FyZ3NfYXJncyksCi0gICAgICAgICAgICBzZWxmLl9nbl9kZWZhdWx0X291dHB1dCgpLAotICAgICAgICBdCi0KLSAgICAgICAgaWYgJ1BLR19DT05GSUdfUEFUSCcgaW4gc2VsZi5lbnY6Ci0gICAgICAgICAgICBwcmludCgnREVCVUc6IFBLR19DT05GSUdfUEFUSCBpcycsIHNlbGYuZW52WydQS0dfQ09ORklHX1BBVEgnXSkKLQotICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdjb25maWd1cmUnLCBnbl9hcmdzKQotCi0gICAgZGVmIF9nbl9idWlsZChzZWxmLCB0YXJnZXQpOgotICAgICAgICAiIiIgR2VuZXJhdGUgdGhlIG5pbmphIGNvbW1hbmQgZm9yIHRoZSB0YXJnZXQgYW5kIHJ1biBpdC4KLSAgICAgICAgIiIiCi0gICAgICAgIGFyZ3MgPSBbJyVzOiVzJyAlICgnYnQnLCB0YXJnZXQpXQotICAgICAgICBuaW5qYV9hcmdzID0gWyduaW5qYScsICctQycsIHNlbGYuX2duX2RlZmF1bHRfb3V0cHV0KCldCi0gICAgICAgIGlmIHNlbGYuam9iczoKLSAgICAgICAgICAgIG5pbmphX2FyZ3MgKz0gWyctaicsIHN0cihzZWxmLmpvYnMpXQotICAgICAgICBuaW5qYV9hcmdzICs9IGFyZ3MKLQotICAgICAgICBpZiBzZWxmLmFyZ3MudmVyYm9zZToKLSAgICAgICAgICAgIG5pbmphX2FyZ3MuYXBwZW5kKCctdicpCi0KLSAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGQnLCBuaW5qYV9hcmdzKQotCi0gICAgZGVmIF9ydXN0X2NvbmZpZ3VyZShzZWxmKToKLSAgICAgICAgIiIiIEdlbmVyYXRlIGNvbmZpZyBmaWxlIGF0IGNhcmdvX2hvbWUgc28gd2UgdXNlIHZlbmRvcmVkIGNyYXRlcy4KLSAgICAgICAgIiIiCi0gICAgICAgIHRlbXBsYXRlID0gIiIiCi0gICAgICAgIFtzb3VyY2Uuc3lzdGVtYnRdCi0gICAgICAgIGRpcmVjdG9yeSA9ICJ7fS9leHRlcm5hbC9ydXN0L3ZlbmRvciIKLQotICAgICAgICBbc291cmNlLmNyYXRlcy1pb10KLSAgICAgICAgcmVwbGFjZS13aXRoID0gInN5c3RlbWJ0IgotICAgICAgICBsb2NhbC1yZWdpc3RyeSA9ICIvbm9uZXhpc3RlbnQiCi0gICAgICAgICIiIgotCi0gICAgICAgIGlmIG5vdCBzZWxmLmFyZ3Mubm9fdmVuZG9yZWRfcnVzdDoKLSAgICAgICAgICAgIGNvbnRlbnRzID0gdGVtcGxhdGUuZm9ybWF0KHNlbGYucGxhdGZvcm1fZGlyKQotICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzZWxmLmVudlsnQ0FSR09fSE9NRSddLCAnY29uZmlnJyksICd3JykgYXMgZjoKLSAgICAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQotCi0gICAgZGVmIF9ydXN0X2J1aWxkKHNlbGYpOgotICAgICAgICAiIiIgUnVuIGBjYXJnbyBidWlsZGAgZnJvbSBwbGF0Zm9ybTIvYnQgZGlyZWN0b3J5LgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgncnVzdCcsIFsnY2FyZ28nLCAnYnVpbGQnXSwgY3dkPW9zLnBhdGguam9pbihzZWxmLnBsYXRmb3JtX2RpciwgJ2J0JyksIGVudj1zZWxmLmVudikKLQotICAgIGRlZiBfdGFyZ2V0X3ByZXBhcmUoc2VsZik6Ci0gICAgICAgICIiIiBUYXJnZXQgdG8gcHJlcGFyZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgYnVpbGRpbmcuCi0KLSAgICAgICAgVGhpcyBydW5zIGduIGdlbiB0byBnZW5lcmF0ZSBhbGwgcnF1aXJlZCBmaWxlcyBhbmQgc2V0IHVwIHRoZSBSdXN0Ci0gICAgICAgIGNvbmZpZyBwcm9wZXJseS4gVGhpcyB3aWxsIGJlIHJ1bgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZ25fY29uZmlndXJlKCkKLSAgICAgICAgc2VsZi5fcnVzdF9jb25maWd1cmUoKQotCi0gICAgZGVmIF90YXJnZXRfdG9vbHMoc2VsZik6Ci0gICAgICAgICIiIiBCdWlsZCB0aGUgdG9vbHMgdGFyZ2V0IGluIGFuIGFscmVhZHkgcHJlcGFyZWQgZW52aXJvbm1lbnQuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9nbl9idWlsZCgndG9vbHMnKQotCi0gICAgICAgICMgQWxzbyBjb3B5IGJsdWV0b290aF9wYWNrZXRnZW4gdG8gQ0FSR09fSE9NRSBzbyBpdCdzIGF2YWlsYWJsZQotICAgICAgICBzaHV0aWwuY29weSgKLSAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9nbl9kZWZhdWx0X291dHB1dCgpLCAnYmx1ZXRvb3RoX3BhY2tldGdlbicpLCBvcy5wYXRoLmpvaW4oc2VsZi5lbnZbJ0NBUkdPX0hPTUUnXSwgJ2JpbicpKQotCi0gICAgZGVmIF90YXJnZXRfcnVzdChzZWxmKToKLSAgICAgICAgIiIiIEJ1aWxkIHJ1c3QgYXJ0aWZhY3RzIGluIGFuIGFscmVhZHkgcHJlcGFyZWQgZW52aXJvbm1lbnQuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9ydXN0X2J1aWxkKCkKLSAgICAgICAgcnVzdF9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZ25fZGVmYXVsdF9vdXRwdXQoKSwgJ3J1c3QnKQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhydXN0X2Rpcik6Ci0gICAgICAgICAgICBzaHV0aWwucm10cmVlKHJ1c3RfZGlyKQotICAgICAgICBzaHV0aWwuY29weXRyZWUob3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgJ2RlYnVnJyksIHJ1c3RfZGlyKQotCi0gICAgZGVmIF90YXJnZXRfbWFpbihzZWxmKToKLSAgICAgICAgIiIiIEJ1aWxkIHRoZSBtYWluIEdOIGFydGlmYWN0cyBpbiBhbiBhbHJlYWR5IHByZXBhcmVkIGVudmlyb25tZW50LgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZ25fYnVpbGQoJ2FsbCcpCi0KLSAgICBkZWYgX3RhcmdldF90ZXN0KHNlbGYpOgotICAgICAgICAiIiIgUnVucyB0aGUgaG9zdCB0ZXN0cy4KLSAgICAgICAgIiIiCi0gICAgICAgICMgUnVzdCB0ZXN0cyBmaXJzdAotICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCd0ZXN0JywgWydjYXJnbycsICd0ZXN0J10sIGN3ZD1vcy5wYXRoLmpvaW4oc2VsZi5wbGF0Zm9ybV9kaXIsICdidCcpLCBlbnY9c2VsZi5lbnYpCi0KLSAgICAgICAgIyBIb3N0IHRlc3RzIHNlY29uZCBiYXNlZCBvbiBob3N0IHRlc3QgbGlzdAotICAgICAgICBmb3IgdCBpbiBIT1NUX1RFU1RTOgotICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKLSAgICAgICAgICAgICAgICAndGVzdCcsIFtvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAnb3V0L0RlZmF1bHQnLCB0KV0sCi0gICAgICAgICAgICAgICAgY3dkPW9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIpLAotICAgICAgICAgICAgICAgIGVudj1zZWxmLmVudikKLQotICAgIGRlZiBfdGFyZ2V0X2NsZWFuKHNlbGYpOgotICAgICAgICAiIiIgRGVsZXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGVudGlyZWx5LgotICAgICAgICAiIiIKLSAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLm91dHB1dF9kaXIpCi0gICAgICAgICMgUmVtb3ZlIENhcmdvLmxvY2sgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgZ2VuZXJhdGVkCi0gICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4oc2VsZi5wbGF0Zm9ybV9kaXIsICdidCcsICdDYXJnby5sb2NrJykpCi0KLSAgICBkZWYgX3RhcmdldF9hbGwoc2VsZik6Ci0gICAgICAgICIiIiBCdWlsZCBhbGwgY29tbW9uIHRhcmdldHMgKHNraXBwaW5nIHRlc3QgYW5kIGNsZWFuKS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3RhcmdldF9wcmVwYXJlKCkKLSAgICAgICAgc2VsZi5fdGFyZ2V0X3Rvb2xzKCkKLSAgICAgICAgc2VsZi5fdGFyZ2V0X21haW4oKQotICAgICAgICBzZWxmLl90YXJnZXRfcnVzdCgpCi0KLSAgICBkZWYgYnVpbGQoc2VsZik6Ci0gICAgICAgICIiIiBCdWlsZHMgYWNjb3JkaW5nIHRvIHNlbGYudGFyZ2V0Ci0gICAgICAgICIiIgotICAgICAgICBwcmludCgnQnVpbGRpbmcgdGFyZ2V0ICcsIHNlbGYudGFyZ2V0KQotCi0gICAgICAgIGlmIHNlbGYudGFyZ2V0ID09ICdwcmVwYXJlJzoKLSAgICAgICAgICAgIHNlbGYuX3RhcmdldF9wcmVwYXJlKCkKLSAgICAgICAgZWxpZiBzZWxmLnRhcmdldCA9PSAndG9vbHMnOgotICAgICAgICAgICAgc2VsZi5fdGFyZ2V0X3Rvb2xzKCkKLSAgICAgICAgZWxpZiBzZWxmLnRhcmdldCA9PSAncnVzdCc6Ci0gICAgICAgICAgICBzZWxmLl90YXJnZXRfcnVzdCgpCi0gICAgICAgIGVsaWYgc2VsZi50YXJnZXQgPT0gJ21haW4nOgotICAgICAgICAgICAgc2VsZi5fdGFyZ2V0X21haW4oKQotICAgICAgICBlbGlmIHNlbGYudGFyZ2V0ID09ICd0ZXN0JzoKLSAgICAgICAgICAgIHNlbGYuX3RhcmdldF90ZXN0KCkKLSAgICAgICAgZWxpZiBzZWxmLnRhcmdldCA9PSAnY2xlYW4nOgotICAgICAgICAgICAgc2VsZi5fdGFyZ2V0X2NsZWFuKCkKLSAgICAgICAgZWxpZiBzZWxmLnRhcmdldCA9PSAnYWxsJzoKLSAgICAgICAgICAgIHNlbGYuX3RhcmdldF9hbGwoKQotCi0KLWNsYXNzIEJvb3RzdHJhcCgpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2VfZGlyLCBidF9kaXIpOgotICAgICAgICAiIiIgQ29uc3RydWN0IGJvb3RzdHJhcHBlci4KLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgYmFzZV9kaXI6IFdoZXJlIHRvIHN0YWdlIGV2ZXJ5dGhpbmcuCi0gICAgICAgICAgICBidF9kaXI6IFdoZXJlIGJsdWV0b290aCBzb3VyY2UgaXMga2VwdCAod2lsbCBiZSBzeW1saW5rZWQpCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmJhc2VfZGlyID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfZGlyKQotICAgICAgICBzZWxmLmJ0X2RpciA9IG9zLnBhdGguYWJzcGF0aChidF9kaXIpCi0KLSAgICAgICAgIyBDcmVhdGUgYmFzZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0Ci0gICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuYmFzZV9kaXIsIGV4aXN0X29rPVRydWUpCi0KLSAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5idF9kaXIpOgotICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd7fSBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnknLmZvcm1hdChzZWxmLmJ0X2RpcikpCi0KLSAgICAgICAgc2VsZi5naXRfZGlyID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZV9kaXIsICdyZXBvcycpCi0gICAgICAgIHNlbGYuc3RhZ2luZ19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlX2RpciwgJ3N0YWdpbmcnKQotICAgICAgICBzZWxmLm91dHB1dF9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlX2RpciwgJ291dHB1dCcpCi0gICAgICAgIHNlbGYuZXh0ZXJuYWxfZGlyID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZV9kaXIsICdzdGFnaW5nJywgJ2V4dGVybmFsJykKLQotICAgICAgICBzZWxmLmRpcl9zZXR1cF9jb21wbGV0ZSA9IG9zLnBhdGguam9pbihzZWxmLmJhc2VfZGlyLCAnLnNldHVwLWNvbXBsZXRlJykKLQotICAgIGRlZiBfdXBkYXRlX3BsYXRmb3JtMihzZWxmKToKLSAgICAgICAgIiIiVXBkYXRlcyByZXBvc2l0b3JpZXMgdXNlZCBmb3IgYnVpbGQuIiIiCi0gICAgICAgIGZvciByZXBvIGluIEJPT1RTVFJBUF9HSVRfUkVQT1Mua2V5cygpOgotICAgICAgICAgICAgY3dkID0gb3MucGF0aC5qb2luKHNlbGYuZ2l0X2RpciwgcmVwbykKLSAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbJ2dpdCcsICdwdWxsJ10sIGN3ZD1jd2QpCi0KLSAgICBkZWYgX3NldHVwX3BsYXRmb3JtMihzZWxmKToKLSAgICAgICAgIiIiIFNldCB1cCBwbGF0Zm9ybTIuCi0KLSAgICAgICAgVGhpcyB3aWxsIGNoZWNrIG91dCBhbGwgdGhlIGdpdCByZXBvcyBhbmQgc3ltbGluayBldmVyeXRoaW5nIGNvcnJlY3RseS4KLSAgICAgICAgIiIiCi0KLSAgICAgICAgIyBJZiBhbHJlYWR5IHNldCB1cCwgZXhpdCBlYXJseQotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmRpcl9zZXR1cF9jb21wbGV0ZSk6Ci0gICAgICAgICAgICBwcmludCgne30gYWxyZWFkeSBzZXQtdXAuIFVwZGF0aW5nIGluc3RlYWQuJy5mb3JtYXQoc2VsZi5iYXNlX2RpcikpCi0gICAgICAgICAgICBzZWxmLl91cGRhdGVfcGxhdGZvcm0yKCkKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgICMgQ3JlYXRlIGFsbCBkaXJlY3RvcmllcyB3ZSB3aWxsIG5lZWQgdG8gdXNlCi0gICAgICAgIGZvciBkaXJwYXRoIGluIFtzZWxmLmdpdF9kaXIsIHNlbGYuc3RhZ2luZ19kaXIsIHNlbGYub3V0cHV0X2Rpciwgc2VsZi5leHRlcm5hbF9kaXJdOgotICAgICAgICAgICAgb3MubWFrZWRpcnMoZGlycGF0aCkKLQotICAgICAgICAjIENoZWNrIG91dCBhbGwgcmVwb3MgaW4gZ2l0IGRpcmVjdG9yeQotICAgICAgICBmb3IgcmVwbyBpbiBCT09UU1RSQVBfR0lUX1JFUE9TLnZhbHVlcygpOgotICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsnZ2l0JywgJ2Nsb25lJywgcmVwb10sIGN3ZD1zZWxmLmdpdF9kaXIpCi0KLSAgICAgICAgIyBTeW1saW5rIHRoaW5ncwotICAgICAgICBzeW1saW5rcyA9IFsKLSAgICAgICAgICAgIChvcy5wYXRoLmpvaW4oc2VsZi5naXRfZGlyLCAncGxhdGZvcm0yJywgJ2NvbW1vbi1taycpLCBvcy5wYXRoLmpvaW4oc2VsZi5zdGFnaW5nX2RpciwgJ2NvbW1vbi1taycpKSwKLSAgICAgICAgICAgIChvcy5wYXRoLmpvaW4oc2VsZi5naXRfZGlyLCAncGxhdGZvcm0yJywgJy5nbicpLCBvcy5wYXRoLmpvaW4oc2VsZi5zdGFnaW5nX2RpciwgJy5nbicpKSwKLSAgICAgICAgICAgIChvcy5wYXRoLmpvaW4oc2VsZi5idF9kaXIpLCBvcy5wYXRoLmpvaW4oc2VsZi5zdGFnaW5nX2RpciwgJ2J0JykpLAotICAgICAgICAgICAgKG9zLnBhdGguam9pbihzZWxmLmdpdF9kaXIsICdydXN0X2NyYXRlcycpLCBvcy5wYXRoLmpvaW4oc2VsZi5leHRlcm5hbF9kaXIsICdydXN0JykpLAotICAgICAgICAgICAgKG9zLnBhdGguam9pbihzZWxmLmdpdF9kaXIsICdwcm90b19sb2dnaW5nJyksIG9zLnBhdGguam9pbihzZWxmLmV4dGVybmFsX2RpciwgJ3Byb3RvX2xvZ2dpbmcnKSksCi0gICAgICAgIF0KLQotICAgICAgICAjIENyZWF0ZSBzeW1saW5rcwotICAgICAgICBmb3IgcGFpcnMgaW4gc3ltbGlua3M6Ci0gICAgICAgICAgICAoc3JjLCBkc3QpID0gcGFpcnMKLSAgICAgICAgICAgIG9zLnN5bWxpbmsoc3JjLCBkc3QpCi0KLSAgICAgICAgIyBXcml0ZSB0byBzZXR1cCBjb21wbGV0ZSBmaWxlIHNvIHdlIGRvbid0IHJlcGVhdCB0aGlzIHN0ZXAKLSAgICAgICAgd2l0aCBvcGVuKHNlbGYuZGlyX3NldHVwX2NvbXBsZXRlLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCdTZXR1cCBjb21wbGV0ZS4nKQotCi0gICAgZGVmIF9wcmV0dHlfcHJpbnRfaW5zdGFsbChzZWxmLCBpbnN0YWxsX2NtZCwgcGFja2FnZXMsIGxpbmVfbGltaXQ9ODApOgotICAgICAgICAiIiIgUHJldHR5IHByaW50IGFuIGluc3RhbGwgY29tbWFuZC4KLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgaW5zdGFsbF9jbWQ6IFByZWZpeGVkIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICAgICAgIHBhY2thZ2VzOiBFbnVtZXJhdGUgcGFja2FnZXMgYW5kIGFwcGVuZCB0aGVtIHRvIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICAgICAgIGxpbmVfbGltaXQ6IE51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBsaW5lLgotCi0gICAgICAgIFJldHVybjoKLSAgICAgICAgICAgIEFycmF5IG9mIGxpbmVzIHRvIGpvaW4gYW5kIHByaW50LgotICAgICAgICAiIiIKLSAgICAgICAgaW5zdGFsbCA9IFtpbnN0YWxsX2NtZF0KLSAgICAgICAgbGluZSA9ICcgICcKLSAgICAgICAgIyBSZW1haW5kZXIgbmVlZGVkID0gc3BhY2UgKyBsZW4ocGtnKSArIHNwYWNlICsgXAotICAgICAgICAjIEFzc3VtaW5nIDgwIGNoYXJhY3RlciBsaW5lcywgdGhhdCdzIDgwIC0gMyA9IDc3Ci0gICAgICAgIGxpbmVfbGltaXQgPSBsaW5lX2xpbWl0IC0gMwotICAgICAgICBmb3IgcGtnIGluIHBhY2thZ2VzOgotICAgICAgICAgICAgaWYgbGVuKGxpbmUpICsgbGVuKHBrZykgPCBsaW5lX2xpbWl0OgotICAgICAgICAgICAgICAgIGxpbmUgPSAne317fSAnLmZvcm1hdChsaW5lLCBwa2cpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGluc3RhbGwuYXBwZW5kKGxpbmUpCi0gICAgICAgICAgICAgICAgbGluZSA9ICcgIHt9ICcuZm9ybWF0KHBrZykKLQotICAgICAgICBpZiBsZW4obGluZSkgPiAwOgotICAgICAgICAgICAgaW5zdGFsbC5hcHBlbmQobGluZSkKLQotICAgICAgICByZXR1cm4gaW5zdGFsbAotCi0gICAgZGVmIF9jaGVja19wYWNrYWdlX2luc3RhbGxlZChzZWxmLCBwYWNrYWdlLCBjbWQsIHByZWRpY2F0ZSk6Ci0gICAgICAgICIiIkNoZWNrIHRoYXQgdGhlIGdpdmVuIHBhY2thZ2UgaXMgaW5zdGFsbGVkLgotCi0gICAgICAgIEFyZ3M6Ci0gICAgICAgICAgICBwYWNrYWdlOiBDaGVjayB0aGF0IHRoaXMgcGFja2FnZSBpcyBpbnN0YWxsZWQuCi0gICAgICAgICAgICBjbWQ6IENvbW1hbmQgcHJlZml4IHRvIGNoZWNrIGlmIGluc3RhbGxlZCAocGFja2FnZSBhcHBlbmRlZCB0byBlbmQpCi0gICAgICAgICAgICBwcmVkaWNhdGU6IEZ1bmN0aW9uL2xhbWJkYSB0byBjaGVjayBpZiBwYWNrYWdlIGlzIGluc3RhbGxlZCBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICBvbiBvdXRwdXQuIFRha2VzIHN0cmluZyBvdXRwdXQgYW5kIHJldHVybnMgYm9vbGVhbi4KLQotICAgICAgICBSZXR1cm46Ci0gICAgICAgICAgICBUcnVlIGlmIHBhY2thZ2UgaXMgaW5zdGFsbGVkLgotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kICsgW3BhY2thZ2VdLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gICAgICAgICAgICBpc19pbnN0YWxsZWQgPSBwcmVkaWNhdGUob3V0cHV0LmRlY29kZSgndXRmLTgnKSkKLSAgICAgICAgICAgIHByaW50KCcgIHt9IGlzIHt9Jy5mb3JtYXQocGFja2FnZSwgJ2luc3RhbGxlZCcgaWYgaXNfaW5zdGFsbGVkIGVsc2UgJ21pc3NpbmcnKSkKLQotICAgICAgICAgICAgcmV0dXJuIGlzX2luc3RhbGxlZAotICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICBwcmludChlKQotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgX2dldF9jb21tYW5kX291dHB1dChzZWxmLCBjbWQpOgotICAgICAgICAiIiJSdW5zIHRoZSBjb21tYW5kIGFuZCBnZXRzIHRoZSBvdXRwdXQuCi0KLSAgICAgICAgQXJnczoKLSAgICAgICAgICAgIGNtZDogQ29tbWFuZCB0byBydW4uCi0KLSAgICAgICAgUmV0dXJuOgotICAgICAgICAgICAgVHVwbGUgKFN1Y2Nlc3MsIE91dHB1dCkuIFN1Y2Nlc3MgcmVwcmVzZW50cyBpZiB0aGUgY29tbWFuZCByYW4gb2suCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKLSAgICAgICAgICAgIHJldHVybiAoVHJ1ZSwgb3V0cHV0LmRlY29kZSgndXRmLTgnKS5zcGxpdCgnXG4nKSkKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgcHJpbnQoZSkKLSAgICAgICAgICAgIHJldHVybiAoRmFsc2UsICIiKQotCi0gICAgZGVmIF9wcmludF9taXNzaW5nX3BhY2thZ2VzKHNlbGYpOgotICAgICAgICAiIiJQcmludCBhbnkgbWlzc2luZyBwYWNrYWdlcyBmb3VuZCB2aWEgYXB0LgotCi0gICAgICAgIFRoaXMgd2lsbCBmaW5kIGFueSBtaXNzaW5nIHBhY2thZ2VzIG5lY2Vzc2FyeSBmb3IgYnVpbGQgdXNpbmcgYXB0IGFuZAotICAgICAgICBwcmludCBpdCBvdXQgYXMgYW4gYXB0LWdldCBpbnN0YWxsIHByaW50Zi4KLSAgICAgICAgIiIiCi0gICAgICAgIHByaW50KCdDaGVja2luZyBmb3IgYW55IG1pc3NpbmcgcGFja2FnZXMuLi4nKQotCi0gICAgICAgIChzdWNjZXNzLCBvdXRwdXQpID0gc2VsZi5fZ2V0X2NvbW1hbmRfb3V0cHV0KEFQVF9QS0dfTElTVCkKLSAgICAgICAgaWYgbm90IHN1Y2Nlc3M6Ci0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkIG5vdCBxdWVyeSBhcHQgZm9yIHBhY2thZ2VzLiIpCi0KLSAgICAgICAgcGFja2FnZXNfaW5zdGFsbGVkID0ge30KLSAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0OgotICAgICAgICAgICAgaWYgJ2luc3RhbGxlZCcgaW4gbGluZToKLSAgICAgICAgICAgICAgICBzcGxpdCA9IGxpbmUuc3BsaXQoJy8nLCAyKQotICAgICAgICAgICAgICAgIHBhY2thZ2VzX2luc3RhbGxlZFtzcGxpdFswXV0gPSBUcnVlCi0KLSAgICAgICAgbmVlZF9wYWNrYWdlcyA9IFtdCi0gICAgICAgIGZvciBwa2cgaW4gUkVRVUlSRURfQVBUX1BBQ0tBR0VTOgotICAgICAgICAgICAgaWYgcGtnIG5vdCBpbiBwYWNrYWdlc19pbnN0YWxsZWQ6Ci0gICAgICAgICAgICAgICAgbmVlZF9wYWNrYWdlcy5hcHBlbmQocGtnKQotCi0gICAgICAgICMgTm8gcGFja2FnZXMgbmVlZCB0byBiZSBpbnN0YWxsZWQKLSAgICAgICAgaWYgbGVuKG5lZWRfcGFja2FnZXMpID09IDA6Ci0gICAgICAgICAgICBwcmludCgnKyBBbGwgcmVxdWlyZWQgcGFja2FnZXMgYXJlIGluc3RhbGxlZCcpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBpbnN0YWxsID0gc2VsZi5fcHJldHR5X3ByaW50X2luc3RhbGwoJ3N1ZG8gYXB0LWdldCBpbnN0YWxsJywgbmVlZF9wYWNrYWdlcykKLQotICAgICAgICAjIFByaW50IGFsbCBsaW5lcyBzbyB0aGV5IGNhbiBiZSBydW4gaW4gY21kbGluZQotICAgICAgICBwcmludCgnTWlzc2luZyBzeXN0ZW0gcGFja2FnZXMuIFJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6ICcpCi0gICAgICAgIHByaW50KCcgXFxcbicuam9pbihpbnN0YWxsKSkKLQotICAgIGRlZiBfcHJpbnRfbWlzc2luZ19ydXN0X3BhY2thZ2VzKHNlbGYpOgotICAgICAgICAiIiJQcmludCBhbnkgbWlzc2luZyBwYWNrYWdlcyBmb3VuZCB2aWEgY2FyZ28uCi0KLSAgICAgICAgVGhpcyB3aWxsIGZpbmQgYW55IG1pc3NpbmcgcGFja2FnZXMgbmVjZXNzYXJ5IGZvciBidWlsZCB1c2luZyBjYXJnbyBhbmQKLSAgICAgICAgcHJpbnQgaXQgb3V0IGFzIGEgY2FyZ28taW5zdGFsbCBwcmludGYuCi0gICAgICAgICIiIgotICAgICAgICBwcmludCgnQ2hlY2tpbmcgZm9yIGFueSBtaXNzaW5nIGNhcmdvIHBhY2thZ2VzLi4uJykKLQotICAgICAgICAoc3VjY2Vzcywgb3V0cHV0KSA9IHNlbGYuX2dldF9jb21tYW5kX291dHB1dChDQVJHT19QS0dfTElTVCkKLSAgICAgICAgaWYgbm90IHN1Y2Nlc3M6Ci0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkIG5vdCBxdWVyeSBjYXJnbyBmb3IgcGFja2FnZXMuIikKLQotICAgICAgICBwYWNrYWdlc19pbnN0YWxsZWQgPSB7fQotICAgICAgICBmb3IgbGluZSBpbiBvdXRwdXQ6Ci0gICAgICAgICAgICAjIENhcmdvIGluc3RhbGxlZCBwYWNrYWdlcyBoYXZlIHRoaXMgZm9ybWF0Ci0gICAgICAgICAgICAjIDxjcmF0ZSBuYW1lPiA8dmVyc2lvbj46Ci0gICAgICAgICAgICAjICAgPGJpbmFyeSBuYW1lPgotICAgICAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNyYXRlcyB0aGVtc2VsdmVzCi0gICAgICAgICAgICBpZiAnOicgbm90IGluIGxpbmU6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICAgICAgc3BsaXQgPSBsaW5lLnNwbGl0KCcgJywgMikKLSAgICAgICAgICAgIHBhY2thZ2VzX2luc3RhbGxlZFtzcGxpdFswXV0gPSBUcnVlCi0KLSAgICAgICAgbmVlZF9wYWNrYWdlcyA9IFtdCi0gICAgICAgIGZvciBwa2cgaW4gUkVRVUlSRURfQ0FSR09fUEFDS0FHRVM6Ci0gICAgICAgICAgICBpZiBwa2cgbm90IGluIHBhY2thZ2VzX2luc3RhbGxlZDoKLSAgICAgICAgICAgICAgICBuZWVkX3BhY2thZ2VzLmFwcGVuZChwa2cpCi0KLSAgICAgICAgIyBObyBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQKLSAgICAgICAgaWYgbGVuKG5lZWRfcGFja2FnZXMpID09IDA6Ci0gICAgICAgICAgICBwcmludCgnKyBBbGwgcmVxdWlyZWQgY2FyZ28gcGFja2FnZXMgYXJlIGluc3RhbGxlZCcpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBpbnN0YWxsID0gc2VsZi5fcHJldHR5X3ByaW50X2luc3RhbGwoJ2NhcmdvIGluc3RhbGwnLCBuZWVkX3BhY2thZ2VzKQotICAgICAgICBwcmludCgnTWlzc2luZyBjYXJnbyBwYWNrYWdlcy4gUnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogJykKLSAgICAgICAgcHJpbnQoJyBcXFxuJy5qb2luKGluc3RhbGwpKQotCi0gICAgZGVmIGJvb3RzdHJhcChzZWxmKToKLSAgICAgICAgIiIiIEJvb3RzdHJhcCB0aGUgTGludXggYnVpbGQuIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX3BsYXRmb3JtMigpCi0gICAgICAgIHNlbGYuX3ByaW50X21pc3NpbmdfcGFja2FnZXMoKQotICAgICAgICBzZWxmLl9wcmludF9taXNzaW5nX3J1c3RfcGFja2FnZXMoKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J1NpbXBsZSBidWlsZCBmb3IgaG9zdC4nKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICctLWJvb3RzdHJhcC1kaXInLCBoZWxwPSdEaXJlY3RvcnkgdG8gcnVuIGJvb3RzdHJhcCBvbiAob3Igd2FzIHByZXZpb3VzbHkgcnVuIG9uKS4nLCBkZWZhdWx0PSJ+Ly5mbG9zcyIpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICAgJy0tcnVuLWJvb3RzdHJhcCcsCi0gICAgICAgIGhlbHA9J1J1biBib290c3RyYXAgY29kZSB0byB2ZXJpZnkgYnVpbGQgZW52IGlzIG9rIHRvIGJ1aWxkLicsCi0gICAgICAgIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uby1jbGFuZycsIGhlbHA9J1VzZSBjbGFuZyBjb21waWxlci4nLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdXNlJywgaGVscD0nU2V0IGEgc3BlY2lmaWMgdXNlIGZsYWcuJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW5vdGVzdCcsIGhlbHA9IkRvbid0IGNvbXBpbGUgdGVzdCBjb2RlLiIsIGRlZmF1bHQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS10YXJnZXQnLCBoZWxwPSdSdW4gc3BlY2lmaWMgYnVpbGQgdGFyZ2V0JykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXN5c3Jvb3QnLCBoZWxwPSdTZXQgYSBzcGVjaWZpYyBzeXNyb290IHBhdGgnLCBkZWZhdWx0PScvJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxpYmRpcicsIGhlbHA9J0xpYmRpciAtIGRlZmF1bHQgPSB1c3IvbGliJywgZGVmYXVsdD0ndXNyL2xpYicpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1qb2JzJywgaGVscD0nTnVtYmVyIG9mIGpvYnMgdG8gcnVuJywgZGVmYXVsdD0wLCB0eXBlPWludCkKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAnLS1uby12ZW5kb3JlZC1ydXN0JywgaGVscD0nRG8gbm90IHVzZSB2ZW5kb3JlZCBydXN0IGNyYXRlcycsIGRlZmF1bHQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgaGVscD0nVmVyYm9zZSBsb2dzIGZvciBidWlsZC4nKQotICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBnZXQgYWJzb2x1dGUgcGF0aCArIGV4cGFuZGVkIHBhdGggZm9yIGJvb3RzdHJhcCBkaXJlY3RvcnkKLSAgICBhcmdzLmJvb3RzdHJhcF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5leHBhbmR1c2VyKGFyZ3MuYm9vdHN0cmFwX2RpcikpCi0KLSAgICBpZiBhcmdzLnJ1bl9ib290c3RyYXA6Ci0gICAgICAgIGJvb3RzdHJhcCA9IEJvb3RzdHJhcChhcmdzLmJvb3RzdHJhcF9kaXIsIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCi0gICAgICAgIGJvb3RzdHJhcC5ib290c3RyYXAoKQotICAgIGVsc2U6Ci0gICAgICAgIGJ1aWxkID0gSG9zdEJ1aWxkKGFyZ3MpCi0gICAgICAgIGJ1aWxkLmJ1aWxkKCkKZGlmZiAtLWdpdCBhL2J1aWxkL0FuZHJvaWQuYnAgYi9idWlsZC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRjZmExLi4wMDAwMDAwCi0tLSBhL2J1aWxkL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotYm9vdHN0cmFwX2dvX3BhY2thZ2UgewotICAgIG5hbWU6ICJzb29uZy1mbHVvcmlkZSIsCi0gICAgcGtnUGF0aDogImFuZHJvaWQvc29vbmcvZmx1b3JpZGUiLAotICAgIGRlcHM6IFsKLSAgICAgICAgImJsdWVwcmludCIsCi0gICAgICAgICJibHVlcHJpbnQtcGF0aHRvb2xzIiwKLSAgICAgICAgInNvb25nIiwKLSAgICAgICAgInNvb25nLWFuZHJvaWQiLAotICAgICAgICAic29vbmctY2MiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiZmx1b3JpZGUuZ28iLAotICAgIF0sCi0gICAgcGx1Z2luRm9yOiBbInNvb25nX2J1aWxkIl0sCi19Ci0KLWZsdW9yaWRlX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliY2hyb21lX3N1cHBvcnRfZGVmYXVsdHMiLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmNocm9tZSJdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdleHRyYSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KLS8vIEZ1enphYmxlIGRlZmF1bHRzIGFyZSB0aGUgc3Vic2V0IG9mIGRlZmF1bHRzIHRoYXQgYXJlIHVzZWQgaW4gZnV6emluZywgd2hpY2gKLS8vIHJlcXVpcmVzIG5vIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBubyBleHBsaWNpdCBzYW5pdGl6YXRpb24uCi1mbHVvcmlkZV9kZWZhdWx0cyB7Ci0gICAgbmFtZTogImZsdW9yaWRlX3R5cGVzX2RlZmF1bHRzX2Z1enphYmxlIiwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ERVhQT1JUX1NZTUJPTD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKLSAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAvLyBzdHJ1Y3QgQlRfSERSIGlzIGRlZmluZWQgYXMgYSB2YXJpYWJsZS1zaXplIGhlYWRlciBpbiBhIHN0cnVjdC4KLSAgICAgICAgIi1Xbm8tZ251LXZhcmlhYmxlLXNpemVkLXR5cGUtbm90LWF0LWVuZCIsCi0gICAgICAgIC8vIHRoZXJlIGFyZSB0b28gbWFueSB1bnVzZWQgcGFyYW1ldGVycyBpbiBhbGwgdGhlIGNvZGUuCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgICAgICAiLURMT0dfTkRFQlVHPTEiLAotICAgIF0sCi0gICAgY29ubHlmbGFnczogWwotICAgICAgICAiLXN0ZD1jOTkiLAotICAgIF0sCi0gICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgZGVidWdnYWJsZTogewotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1EQkxVRURST0lEX0RFQlVHIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotZmx1b3JpZGVfZGVmYXVsdHMgewotICAgIG5hbWU6ICJmbHVvcmlkZV90eXBlc19kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX3R5cGVzX2RlZmF1bHRzX2Z1enphYmxlIiwKLSAgICAgICAgImxpYmNocm9tZV9zdXBwb3J0X2RlZmF1bHRzIgotICAgIF0sCi19Ci0KLWZsdW9yaWRlX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZmx1b3JpZGVfZGVmYXVsdHNfZnV6emFibGUiLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICB0ZXN0X2NvbmZpZ190ZW1wbGF0ZTogIjpCbHVldG9vdGhUZXN0Q29uZmlnVGVtcGxhdGUiLAotICAgICAgICAgICAgc2FuaXRpemU6IHsKLSAgICAgICAgICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJib3VuZHMiXSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV90eXBlc19kZWZhdWx0c19mdXp6YWJsZSJdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIiwgImxpYmJ0X2NhbGxiYWNrc19jeHhfaGVhZGVycyJdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJidF9zaGltX2JyaWRnZV9oZWFkZXIiLAotICAgICAgICAibGliYnRfbWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiwKLSAgICAgICAgImN4eC1icmlkZ2UtaGVhZGVyIgotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9idC9nZC9ydXN0L3NoaW0iXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYmJ0LXBsYXRmb3JtLXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJsdWV0b290aF9ydXN0X2ludGVyb3AiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgXSwKLSAgICBjcHBfc3RkOiAiYysrMTciLAotfQotCi1mbHVvcmlkZV9kZWZhdWx0cyB7Ci0gICAgbmFtZTogImZsdW9yaWRlX2RlZmF1bHRzIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0c19mdXp6YWJsZSIsICJmbHVvcmlkZV90eXBlc19kZWZhdWx0cyJdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfZ2QiLAotICAgICAgICAibGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgICAgICJsaWJidF9zaGltX2ZmaSIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICAvLyBsaWJzdGF0c2xvZ19idCAtPiBsaWJiaW5kZXIgZG9lc24ndCBidWlsZCBvbiBtYWMKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJncnBjKysiLAotICAgICAgICAgICAgICAgICJsaWJncnBjX3dyYXAiLAotICAgICAgICAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICAgICAgICAgImxpYnN0YXRzbG9nX2J0IiwKLSAgICAgICAgICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICItRE9TX0FORFJPSUQiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIHNhbml0aXplOiB7Ci0gICAgICAgICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgIH0sCi19Ci0KLS8vIEVuYWJsZXMgY29kZSBjb3ZlcmFnZSBmb3IgYSBzZXQgb2Ygc291cmNlIGZpbGVzLiBNdXN0IGJlIGNvbWJpbmVkIHdpdGgKLS8vICJjbGFuZ19jb3ZlcmFnZV9iaW4iIGluIG9yZGVyIHRvIHdvcmsuIFNlZSAvL3Rlc3QvZ2VuX2NvdmVyYWdlLnB5IGZvciBtb3JlIGluZm9ybWF0aW9uCi0vLyBvbiBnZW5lcmF0aW5nIGNvZGUgY292ZXJhZ2UuCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImNsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgIHRhcmdldDogewotICAgICAgICBob3N0OiB7Ci0gICAgICAgICAgICBjbGFuZ19jZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLWZwcm9maWxlLWluc3RyLWdlbmVyYXRlIiwKLSAgICAgICAgICAgICAgICAiLWZjb3ZlcmFnZS1tYXBwaW5nIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotLy8gRW5hYmxlZCBjb2RlIGNvdmVyYWdlIG9uIGEgYmluYXJ5LiBUaGVzZSBmbGFncyBhbGxvdyBsaWJyYXJpZXMgdGhhdCB3ZXJlCi0vLyBjb21waWxlZCB3aXRoICJjbGFuZ19maWxlX2NvdmVyYWdlIiB0byBiZSBwcm9wZXJseSBsaW5rZWQgdG9nZXRoZXIgaW4KLS8vIG9yZGVyIHRvIGNyZWF0ZSBhIGJpbmFyeSB0aGF0IHdpbGwgY3JlYXRlIGEgcHJvZnJhdyBmaWxlIHdoZW4gcmFuLiBOb3RlCi0vLyB0aGVzZSBmbGFncyB0aGVtc2VsdmVzIGRvbid0IGVuYWJsZSBjb2RlIGNvdmVyYWdlIGZvciB0aGUgc291cmNlIGZpbGVzCi0vLyBjb21waWxlZCBpbiB0aGUgYmluYXJ5LiBTZWUgLy90ZXN0L2dlbl9jb3ZlcmFnZS5weSBmb3IgbW9yZSBpbmZvcm1hdGlvbgotLy8gb24gZ2VuZXJhdGluZyBjb2RlIGNvdmVyYWdlLgotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJjbGFuZ19jb3ZlcmFnZV9iaW4iLAotICAgIHRhcmdldDogewotICAgICAgICBob3N0OiB7Ci0gICAgICAgICAgICBsZGZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSIsCi0gICAgICAgICAgICAgICAgIi1mY292ZXJhZ2UtbWFwcGluZyIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9idWlsZC9CVUlMRC5nbiBiL2J1aWxkL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJhM2Y2Li4wMDAwMDAwCi0tLSBhL2J1aWxkL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWNvbmZpZygiZGVmYXVsdF9pbmNsdWRlX2RpcnMiKSB7Ci0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiLy9pbmNsdWRlLyIsCi0gICAgIi8vdHlwZXMvIiwKLSAgXQotfQotCi1jb25maWcoImxpbnV4IikgewotICAjIFRPRE8oa2V5YnVrKTogQW5kcm9pZENvbmZpZy5oIG9yIGVxdWl2YWxlbnQKLQotICBjZmxhZ3MgPSBbCi0gICAgI1RPRE8oanBhd2xvd3NraSk6IHVuY29tbWVudCBvbmNlIHdlIGhhdmUgbm8gd2FybmluZ3Mgb24gbGludXggYnVpbGQKLSAgICAjICAgICItV2FsbCIsCi0gICAgIyAgICAiLVdlcnJvciIsCi0gICAgIi1Xbm8tZ251LXZhcmlhYmxlLXNpemVkLXR5cGUtbm90LWF0LWVuZCIsCi0gICAgIi1nIiwKLSAgICAiLU8wIiwKLSAgICAiLWZwaWMiLAotICAgICItZmRhdGEtc2VjdGlvbnMiLAotICAgICItZmZ1bmN0aW9uLXNlY3Rpb25zIiwKLSAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gIF0KLQotICBjZmxhZ3NfYyA9IFsgIi1zdGQ9Yzk5IiBdCi0KLSAgY2ZsYWdzX2NjID0gWwotI1RPRE8oanBhd2xvd3NraSk6IHdlIHNob3VsZCB1c2Ugc2FtZSBjKysgdmVyc2lvbiBhcyBBbmRyb2lkLCB3aGljaCBpcyBjKysxMSwKLSMgYnV0IHdlIHVzZSBzb21lIGMrKzE0IGZlYXR1cmVzLiBVbmNvbW1lbnQgd2hlbiB0aGlzIGdldCBmaXhlZCBpbiBjb2RlLjoKLSAgICAiLXN0ZD1jKysxNCIsCi0gICAgIi1mbm8tZXhjZXB0aW9ucyIsCi0gICAgIi1mcGVybWlzc2l2ZSIsCi0gIF0KLQotICBkZWZpbmVzID0gWwotICAgICJfRk9SVElGWV9TT1VSQ0U9MiIsCi0gICAgIl9HTlVfU09VUkNFIiwKLSAgICAiSEFTX05PX0JEUk9JRF9CVUlMRENGRyIsCi0gICAgIkxPR19OREVCVUc9MSIsCi0gICAgIkVYUE9SVF9TWU1CT0w9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCi0gICAgIktFUk5FTF9NSVNTSU5HX0NMT0NLX0JPT1RUSU1FX0FMQVJNPVRSVUUiLAotCi0gICAgIyBUaGlzIGlzIGEgbWFjcm8gdG8gdGhhdCBjYW4gYmUgdXNlZCBieSBzb3VyY2UgY29kZSB0byBkZXRlY3QgaWYgdGhlCi0gICAgIyBjdXJyZW50IGJ1aWxkIGlzIGRvbmUgYnkgR04gb3IgdmlhIEFuZHJvaWQubWsuIFRoaXMgaXMgYSB0ZW1wb3JhcnkKLSAgICAjIHdvcmthcm91bmQgdW50aWwgd2UgY2FuIHJlbW92ZSBhbGwgQW5kcm9pZC1zcGVjaWZpYyBkZXBlbmRlbmNpZXMuCi0gICAgIk9TX0dFTkVSSUMiLAotCi0gICAgIkZBTExUSFJPVUdIX0lOVEVOREVEIiwKLSAgXQotfQotCi1jb25maWcoInBpYyIpIHsKLSAgY2ZsYWdzID0gWyAiLWZQSUMiIF0KLX0KLQotY29uZmlnKCJnYyIpIHsKLSAgbGRmbGFncyA9IFsgIi1XbCwtLWdjLXNlY3Rpb25zIiBdCi19CmRpZmYgLS1naXQgYS9idWlsZC9jb25maWcvQlVJTERDT05GSUcuZ24gYi9idWlsZC9jb25maWcvQlVJTERDT05GSUcuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWIyMWUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvY29uZmlnL0JVSUxEQ09ORklHLmduCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXNldF9kZWZhdWx0X3Rvb2xjaGFpbigiLy9idWlsZC90b29sY2hhaW4vY2xhbmciKQotdG9vbGNoYWluX2NvbmZpZz0iLy9idWlsZC90b29sY2hhaW4vY2xhbmc6Y2xhbmdfY29uZmlnIgotCi1zZXRfZGVmYXVsdHMoImV4ZWN1dGFibGUiKSB7Ci0gIGNvbmZpZ3MgPSBbCi0gICAgIi8vYnVpbGQ6bGludXgiLAotICAgICIvL2J1aWxkOmdjIiwKLSAgICAiLy9idWlsZDpkZWZhdWx0X2luY2x1ZGVfZGlycyIsCi0gICAgdG9vbGNoYWluX2NvbmZpZywKLSAgXQotfQotCi1zZXRfZGVmYXVsdHMoInNoYXJlZF9saWJyYXJ5IikgewotICBjb25maWdzID0gWwotICAgICIvL2J1aWxkOmxpbnV4IiwKLSAgICAiLy9idWlsZDpnYyIsCi0gICAgIi8vYnVpbGQ6ZGVmYXVsdF9pbmNsdWRlX2RpcnMiLAotICAgIHRvb2xjaGFpbl9jb25maWcsCi0gIF0KLX0KLQotc2V0X2RlZmF1bHRzKCJzb3VyY2Vfc2V0IikgewotICBjb25maWdzID0gWwotICAgICIvL2J1aWxkOmxpbnV4IiwKLSAgICAiLy9idWlsZDpnYyIsCi0gICAgIi8vYnVpbGQ6ZGVmYXVsdF9pbmNsdWRlX2RpcnMiLAotICAgIHRvb2xjaGFpbl9jb25maWcsCi0gIF0KLX0KLQotc2V0X2RlZmF1bHRzKCJzdGF0aWNfbGlicmFyeSIpIHsKLSAgY29uZmlncyA9IFsKLSAgICAiLy9idWlsZDpsaW51eCIsCi0gICAgIi8vYnVpbGQ6Z2MiLAotICAgICIvL2J1aWxkOmRlZmF1bHRfaW5jbHVkZV9kaXJzIiwKLSAgICB0b29sY2hhaW5fY29uZmlnLAotICBdCi19CmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL1JFQURNRS50eHQgYi9idWlsZC9kcGtnL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTA3OTYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc2NyaXB0cyB0byBidWlsZCBEZWJpYW4gcGFja2FnZXMgYXMgZGVwZW5kZW5jaWVzIGZvcgotYnVpbGRpbmcgRmx1b3JpZGUgb24gTGludXguCi0KLVRvIGdlbmVyYXRlIHRoZSBEZWJpYW4gcGFja2FnZXMsIHlvdSBuZWVkOgotCi0qIERlYmlhbiAxMCAoQnVzdGVyKQotKiBnbiwgZ2V0IGJpbmFyeSBmcm9tIGh0dHBzOi8vY2hyb21lLWluZnJhLXBhY2thZ2VzLmFwcHNwb3QuY29tL2RsL2duL2duL2xpbnV4LWFtZDY0LysvbGF0ZXN0Ci0qIGFwdC1nZXQgaW5zdGFsbCBnaXQgZGVibWFrZQotKiBPdGhlciBidWlsZCBkZXBlbmRlbmNpZXMgYXJlIHBhY2thZ2UgZGVwZW5kZW50LCB5b3Ugd2lsbCBnZXQgZXJyb3IgbWVzc2FnZQotICBtZW50aW9uaW5nIHRoZSBsaXN0IG9mIG1pc3NpbmcgcGFja2FnZXMKLQotU3RlcHMgdG8gYnVpbGQgZGViaWFuIHBhY2thZ2VzIChtb2RwX2I2NCBmaXJzdCk6Ci1gYGAKLSQgY2QgYnVpbGQvZHBrZy9tb2RwX2I2NAotJCAuL2dlbi1zcmMtcGtnIC90bXAvbW9kcF9iNjQKLWBgYAotCi1JZiB0aGUgYWJvdmUgc3VjY2VlZGVkLCB0aGVyZSB3aWxsIGJlIGEgLmRlYiBmaWxlIGluIC90bXAvbW9kcF9iNjQuIFlvdSBjYW4KLWluc3RhbGwgdGhpcyBiaW5hcnkgcGFja2FnZSBsb2NhbGx5IGxpa2U6Ci1gYGAKLSQgc3VkbyBkcGtnIC1pIC90bXAvbW9kcF9iNjQvbW9kcC1iNjRfMC4wLjEtMV9hbWQ2NC5kZWIKLWBgYAotCi1BZnRlciBpbnN0YWxsaW5nIG1vZHBfYjY0LCB5b3UgY2FuIGRvIHRoZSBzYW1lIHN0ZXBzIHdpdGggbGliY2hyb21lIGluCi1idWlsZC9kcGtnL2xpYmNocm9tZS4KZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvZmxvc3MvUkVBRE1FLm1rZG4gYi9idWlsZC9kcGtnL2Zsb3NzL1JFQURNRS5ta2RuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzNjNDIzLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvZmxvc3MvUkVBRE1FLm1rZG4KKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1EZWJpYW4gMTAKLQotYnVpbGQtZHBrZzoKLSAgICAtIEJ1aWxkcyBhIGJpbmFyeSBkZWJpYW4gcGFja2FnZQotCi1wYWNrYWdlOgotICAgIC0gRGViaWFuIHBhY2thZ2UKLQotYC4vYnVpbGQtZHBrZ2Agd2lsbCB2ZXJpZnksIGRvd25sb2FkLCBidWlsZCwgYW5kIGluc3RhbGwgZXZlcnl0aGluZyBuZWVkZWQgdG8gYnVpbGQgdGhlIGZsb3NzIGRwa2cuCi0KLUhvdyB0byB1c2U6Ci0KLVJ1biBgc3VkbyBpbnN0YWxsLWRlcGVuZGVuY2llc2AgZmlyc3QgdGhlbiBydW4gYGJ1aWxkLWRwa2dgCi0KLVRPRE86Ci0gLSBGaWd1cmUgb3V0IHZlcnNpb25pbmcgZm9yIERFQklBTi9jb250cm9sCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2Zsb3NzL2J1aWxkLWRwa2cgYi9idWlsZC9kcGtnL2Zsb3NzL2J1aWxkLWRwa2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5MTdlOWMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9mbG9zcy9idWlsZC1kcGtnCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLURSWV9SVU49IiIKLWlmIFsgJCMgLWd0IDAgXTsgdGhlbgotICAgIGlmIFsgIiQxIiA9PSAiLS1kcnktcnVuIiBdOyB0aGVuCi0gICAgICAgIERSWV9SVU49ImVjaG8gIgotICAgIGZpCi1maQotCi1SRVFVSVJFRD0iZ2l0IGNhcmdvIgotCi1mb3IgbmFtZSBpbiAkKGVjaG8gJHtSRVFVSVJFRH0pOwotZG8KLSAgICB0eXBlIC1QICIkbmFtZSIgJj4vZGV2L251bGwgfHwgeyBlY2hvICJJbnN0YWxsICckbmFtZSciID4mMjsgZXhpdCAxO30KLWRvbmUKLQotRklSU1RfRElSPSIkKHB3ZCkiCi0KLSMgVmFycwotVVJMX0dOPSJodHRwOi8vY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vY2hyb21lb3MtbG9jYWxtaXJyb3IvZGlzdGZpbGVzL2duLTNlNDNmYWMwMzI4MWUyZjVlNWFlNWYyN2M4ZTlhNmJiNDU5NjZlYTkuYmluIgotVVJMX1BMQVRGT1JNMl9HSVQ9Imh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9zL3BsYXRmb3JtMiIKLVVSTF9SVVNUX0NSQVRFU19HSVQ9Imh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9zL3RoaXJkX3BhcnR5L3J1c3RfY3JhdGVzIgotVVJMX1BST1RPX0xPR0dJTkdfR0lUPSJodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmciCi1DSFJPTUlVTV9CUkFOQ0g9InJlbGVhc2UtUjkyLTEzOTgyLkIiCi0KLVNDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJDAiKSIgJiYgcHdkKSIKLVBBUkVOVF9ESVI9IiQoZWNobyAke1NDUklQVF9ESVJ9IHwgcmV2IHwgY3V0IC1kICcvJyAtZiAyLSB8IHJldiApIgotVE1QX0RJUj0kKG1rdGVtcCAtZCkKLQotdHJhcCBjdHJsX2MgSU5UCi0KLWZ1bmN0aW9uIGN0cmxfYygpIHsKLSAgICBybSAtcmYgIiR7VE1QX0RJUn0iCi0gICAgZXhpdCAxCi19Ci0KLWVjaG8gR2VuZXJhdGluZyBzb3VyY2UgcGFja2FnZSBpbiAiJHtUTVBfRElSfSIKLU9VVF9ESVI9IiR7VE1QX0RJUn0vb3V0IgotQklOX0RJUj0iJHtUTVBfRElSfS9iaW4iCi0KLSR7RFJZX1JVTn0gbWtkaXIgLXAgIiR7T1VUX0RJUn0iCi0ke0RSWV9SVU59IG1rZGlyIC1wICIke0JJTl9ESVJ9IgotCi1wdXNoZCAiJHtCSU5fRElSfSIKLXdnZXQgLU8gZ24gIiR7VVJMX0dOfSIKLXBvcGQKLWV4cG9ydCBQQVRIPSIke1BBVEh9OiR7QklOX0RJUn0iCi0KLSMgQ2hlY2sgZGVwZW5kZW5jaWVzCi0jIGxpYmNocm9tZSByZXF1aXJlcyBtb2RwX2I2NAotQVBUX1JFUVVJUkVEPSJtb2RwLWI2NCBsaWJjaHJvbWUgZmxhdGJ1ZmZlcnMtY29tcGlsZXIgZmxleCBnKystbXVsdGlsaWIgZ2NjLW11bHRpbGliIGdlbmVyYXRlLW5pbmphIGdudXBnIGdwZXJmIGxpYmMrKy1kZXYgbGliZGJ1cy0xLWRldiBsaWJldmVudC1kZXYgbGliZXZlbnQtZGV2IGxpYmZsYXRidWZmZXJzLWRldiBsaWJmbGF0YnVmZmVyczEgbGliZ2wxLW1lc2EtZGV2IGxpYmdsaWIyLjAtZGV2IGxpYmx6NC10b29sIGxpYm5jdXJzZXM1IGxpYm5zczMtZGV2IGxpYnByb3RvYnVmLWRldiBsaWJyZTItOSBsaWJzc2wtZGV2IGxpYnRpbnl4bWwyLWRldiBsaWJ4MTEtZGV2IGxpYnhtbDItdXRpbHMgbmluamEtYnVpbGQgb3BlbnNzbCBwcm90b2J1Zi1jb21waWxlciB1bnppcCB4MTFwcm90by1jb3JlLWRldiB4c2x0cHJvYyB6aXAgemxpYjFnLWRldiIKLQotIyBTUEVFRCBVUCBURVNULCBSRU1PVkUgTUUKLUFQVF9SRVFVSVJFRD0ibW9kcC1iNjQgbGliY2hyb21lIGZsYXRidWZmZXJzLWNvbXBpbGVyIgotCi1BUFRfTUlTU0lORz0oKQotZm9yIG5hbWUgaW4gJChlY2hvICR7QVBUX1JFUVVJUkVEfSk7Ci1kbwotICAgIFI9IiQoYXB0IC1xcSBsaXN0ICIke25hbWV9IiAyPi9kZXYvbnVsbCB8IGdyZXAgImluc3RhbGxlZCIpIgotICAgIGlmIFsgIiR7Un0iID09ICIiIF07IHRoZW4KLSAgICAgICAgZWNobyAiTmVlZCB0byBpbnN0YWxsICcke25hbWV9JyIgPiYyOwotICAgICAgICBpZiBbICIke25hbWV9IiA9PSAibW9kcC1iNjQiIF07IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIiR7bmFtZX0gc291cmNlIGlzIGF2YWlsYWJsZSB0byBidWlsZCBpbiB0aGlzIHJlcG9zaXRvcnkiCi0gICAgICAgICAgICBlY2hvIFJ1biB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGFuZCBpbnN0YWxsOgotICAgICAgICAgICAgZWNobyAiICBwdXNoZCAke1BBUkVOVF9ESVJ9LyR7bmFtZX0vIgotICAgICAgICAgICAgZWNobyAiICAuL2dlbi1zcmMtcGtnLnNoICR7T1VUX0RJUn0iCi0gICAgICAgICAgICBlY2hvICIgIHN1ZG8gZHBrZyAtaSAke09VVF9ESVJ9Ii8ke25hbWV9Ki5kZWIgfHwgY3RybF9jCi0gICAgICAgICAgICBlY2hvICIgIHBvcGQiCi0gICAgICAgICAgICAke0RSWV9SVU59IHJtIC1yZiAke1RNUF9ESVJ9Ci0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgZWxpZiBbICIke25hbWV9IiA9PSAibGliY2hyb21lIiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIke25hbWV9IHNvdXJjZSBpcyBhdmFpbGFibGUgdG8gYnVpbGQgaW4gdGhpcyByZXBvc2l0b3J5IgotICAgICAgICAgICAgZWNobyBSdW4gdGhlIGZvbGxvd2luZyB0byBidWlsZCBhbmQgaW5zdGFsbDoKLSAgICAgICAgICAgIGVjaG8gICBwdXNoZCAiJHtQQVJFTlRfRElSfS8ke25hbWV9LyIKLSAgICAgICAgICAgIGVjaG8gICAuL2dlbi1zcmMtcGtnLnNoICIke09VVF9ESVJ9IgotICAgICAgICAgICAgZWNobyAgIHN1ZG8gZHBrZyAtaSAiJHtPVVRfRElSfSIvJHtuYW1lfSouZGViIHx8IGN0cmxfYwotICAgICAgICAgICAgZWNobyAgIHBvcGQKLSAgICAgICAgICAgICR7RFJZX1JVTn0gcm0gLXJmICR7VE1QX0RJUn0KLSAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBUFRfTUlTU0lORys9KCIke25hbWV9IikKLSAgICAgICAgZmkKLSAgICBmaQotZG9uZQotCi1BUFRfTUlTU0lOR19MRU49IiR7I0FQVF9NSVNTSU5HW0BdfSIKLQotaWYgWyAkQVBUX01JU1NJTkdfTEVOIC1ndCAwIF07IHRoZW4KLSAgICBlY2hvICJNaXNzaW5nIFBhY2thZ2VzOiIKLSAgICBlY2hvICIgICAgJHtBUFRfTUlTU0lOR1sqXX0iCi0gICAgZWNobwotICAgIGVjaG8gUnVuIHRoZSBmb2xsb3dpbmcgdG8gYnVpbGQgYW5kIGluc3RhbGw6Ci0gICAgZWNobyAiICBzdWRvIGFwdCBpbnN0YWxsIiAiJHtBUFRfTUlTU0lOR1sqXX0iIHx8IGN0cmxfYwotICAgICR7RFJZX1JVTn0gcm0gLXJmICR7VE1QX0RJUn0KLSAgICBleGl0IDEKLWZpCi0KLSMgQ2hlY2sgY2FyZ28gZm9yIGN4eGJyaWRnZS1jbWQKLUhBU19DWFg9IiQoY2FyZ28gaW5zdGFsbCAtLWxpc3QgfCBncmVwIGN4eGJyaWRnZS1jbWQpIgotaWYgWyAiJEhBU19DWFgiID09ICIiIF07IHRoZW4KLSAgICBlY2hvICJNaXNzaW5nIGN4eGJyaWRnZS1jbWQgY2FyZ28gcGFja2FnZSIKLSAgICBlY2hvIFJ1biB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGFuZCBpbnN0YWxsOgotICAgIGVjaG8gICBjYXJnbyBpbnN0YWxsIGN4eGJyaWRnZS1jbWQgfHwgY3RybF9jCi0gICAgJHtEUllfUlVOfSBybSAtcmYgJHtUTVBfRElSfQotICAgIGV4aXQgMQotZmkKLQotSEFTX0NYWD0iJChjYXJnbyBpbnN0YWxsIC0tbGlzdCB8IGdyZXAgY2FyZ28tcHJvYy1tYWNybykiCi1pZiBbICIkSEFTX0NYWCIgPT0gIiIgXTsgdGhlbgotICAgIGVjaG8gIk1pc3NpbmcgY2FyZ28tcHJvYy1tYWNybyBjYXJnbyBwYWNrYWdlIgotICAgIGVjaG8gUnVuIHRoZSBmb2xsb3dpbmcgdG8gYnVpbGQgYW5kIGluc3RhbGw6Ci0gICAgZWNobyAgIGNhcmdvIGluc3RhbGwgY2FyZ28tcHJvYy1tYWNybyB8fCBjdHJsX2MKLSAgICAke0RSWV9SVU59IHJtIC1yZiAke1RNUF9ESVJ9Ci0gICAgZXhpdCAxCi1maQotCi0jIEdpdAotR0lUX0RJUj0iJHtPVVRfRElSfS9yZXBvcyIKLUdJVF9ESVJfUExBVEZPUk0yPSIke0dJVF9ESVJ9L3BsYXRmb3JtMiIKLUdJVF9ESVJfUExBVEZPUk0yX0NPTU1PTl9NSz0iJHtHSVRfRElSX1BMQVRGT1JNMn0vY29tbW9uLW1rIgotR0lUX0RJUl9QTEFURk9STTJfR049IiR7R0lUX0RJUl9QTEFURk9STTJ9Ly5nbiIKLUdJVF9ESVJfUlVTVF9DUkFURVM9IiR7R0lUX0RJUn0vcnVzdF9jcmF0ZXMiCi1HSVRfRElSX1BST1RPX0xPR0dJTkc9IiR7R0lUX0RJUn0vcHJvdG9fbG9nZ2luZyIKLUdJVF9ESVJfQlQ9IiQoZWNobyAiJHtQQVJFTlRfRElSfSIgfCByZXYgfCBjdXQgLWQgJy8nIC1mIDMtIHwgcmV2KSIKLQotIyBTdGFnaW5nCi1TVEFHSU5HX0RJUj0iJHtPVVRfRElSfS9zdGFnaW5nIgotU1RBR0lOR19ESVJfUExBVEZPUk0yPSIke1NUQUdJTkdfRElSfS9wbGF0Zm9ybTIiCi1TVEFHSU5HX0RJUl9DT01NT05fTUs9IiR7U1RBR0lOR19ESVJ9L2NvbW1vbi1tayIKLVNUQUdJTkdfRElSX0dOPSIke1NUQUdJTkdfRElSfS8uZ24iCi1TVEFHSU5HX0RJUl9CVD0iJHtTVEFHSU5HX0RJUn0vYnQiCi0jIE5vIGl0IGlzbid0IGEgdHlwbywgdXNlICdydXN0JwotU1RBR0lOR19ESVJfUlVTVF9DUkFURVM9IiR7U1RBR0lOR19ESVJ9L3J1c3QiCi1TVEFHSU5HX0RJUl9QUk9UT19MT0dHSU5HPSIke1NUQUdJTkdfRElSfS9wcm90b19sb2dnaW5nIgotCi1PVVRQVVRfRElSPSIke09VVF9ESVJ9L291dHB1dCIKLUVYVEVSTkFMX0RJUj0iJHtTVEFHSU5HX0RJUn0vZXh0ZXJuYWwiCi1FWFRFUk5BTF9ESVJfUlVTVD0iJHtFWFRFUk5BTF9ESVJ9L3J1c3QiCi1FWFRFUk5BTF9ESVJfUFJPVE9fTE9HR0lORz0iJHtFWFRFUk5BTF9ESVJ9L3Byb3RvX2xvZ2dpbmciCi0KLSR7RFJZX1JVTn0gbWtkaXIgLXAgIiR7R0lUX0RJUn0iCi0ke0RSWV9SVU59IG1rZGlyIC1wICIke1NUQUdJTkdfRElSfSIKLSR7RFJZX1JVTn0gbWtkaXIgLXAgIiR7T1VUUFVUX0RJUn0iCi0ke0RSWV9SVU59IG1rZGlyIC1wICIke0VYVEVSTkFMX0RJUn0iCi0KLSR7RFJZX1JVTn0gZ2l0IGNsb25lIC1iICIke0NIUk9NSVVNX0JSQU5DSH0iICIke1VSTF9QTEFURk9STTJfR0lUfSIgIiR7R0lUX0RJUl9QTEFURk9STTJ9IgotCi0ke0RSWV9SVU59IGdpdCBjbG9uZSAiJHtVUkxfUlVTVF9DUkFURVNfR0lUfSIgIiR7R0lUX0RJUl9SVVNUX0NSQVRFU30iCi0ke0RSWV9SVU59IGdpdCBjbG9uZSAiJHtVUkxfUFJPVE9fTE9HR0lOR19HSVR9IiAiJHtHSVRfRElSX1BST1RPX0xPR0dJTkd9IgotCi0ke0RSWV9SVU59IGxuIC1zICIke0dJVF9ESVJfUExBVEZPUk0yX0NPTU1PTl9NS30iICIke1NUQUdJTkdfRElSX0NPTU1PTl9NS30iIHx8IGN0cmxfYwotJHtEUllfUlVOfSBsbiAtcyAiJHtHSVRfRElSX1BMQVRGT1JNMl9HTn0iICIke1NUQUdJTkdfRElSX0dOfSIgfHwgY3RybF9jCi0ke0RSWV9SVU59IGxuIC1zICIke0dJVF9ESVJfQlR9IiAiJHtTVEFHSU5HX0RJUl9CVH0iIHx8IGN0cmxfYwotJHtEUllfUlVOfSBsbiAtcyAiJHtHSVRfRElSX1JVU1RfQ1JBVEVTfSIgIiR7RVhURVJOQUxfRElSX1JVU1R9IiB8fCBjdHJsX2MKLSR7RFJZX1JVTn0gbG4gLXMgIiR7R0lUX0RJUl9QUk9UT19MT0dHSU5HfSIgIiR7RVhURVJOQUxfRElSX1BST1RPX0xPR0dJTkd9IiB8fCBjdHJsX2MKLQotJHtEUllfUlVOfSAiJHtHSVRfRElSX0JUfSIvYnVpbGQucHkgLS1ib290c3RyYXAtZGlyICIkKHJlYWRsaW5rIC1mICIke09VVF9ESVJ9IikiIC0tbGliZGlyIC91c3IvbGliIHx8IGN0cmxfYwotCi1QS0dfRElSPSIke1NDUklQVF9ESVJ9L3BhY2thZ2UiCi1QS0dfVVNSX0RJUj0iJHtQS0dfRElSfS91c3IiCi0KLU9VVF9QS0dfRElSPSIke09VVF9ESVJ9L3BhY2thZ2UiCi1PVVRfUEtHX1VTUl9ESVI9IiR7T1VUX1BLR19ESVJ9L3VzciIKLQotQklOX09VVFBVVD0iJHtPVVRQVVRfRElSfS9kZWJ1ZyIKLQotQlRDTElFTlRfQklOPSIke0JJTl9PVVRQVVR9L2J0Y2xpZW50IgotQlRNQU5BR0VSRF9CSU49IiR7QklOX09VVFBVVH0vYnRtYW5hZ2VyZCIKLUJUQURBUFRFUkRfQklOPSIke0JJTl9PVVRQVVR9L2J0YWRhcHRlcmQiCi0KLSR7RFJZX1JVTn0gY3AgLXIgIiR7UEtHX0RJUn0iICIke09VVF9ESVJ9LyIKLQotJHtEUllfUlVOfSBjcCAiJHtCVENMSUVOVF9CSU59IiAiJHtPVVRfUEtHX1VTUl9ESVJ9L2Jpbi8iCi0ke0RSWV9SVU59IGNwICIke0JUTUFOQUdFUkRfQklOfSIgIiR7T1VUX1BLR19VU1JfRElSfS9saWJleGVjL2JsdWV0b290aC8iCi0ke0RSWV9SVU59IGNwICIke0JUQURBUFRFUkRfQklOfSIgIiR7T1VUX1BLR19VU1JfRElSfS9saWJleGVjL2JsdWV0b290aC8iCi0KLSR7RFJZX1JVTn0gZHBrZy1kZWIgLS1idWlsZCAiJHtPVVRfUEtHX0RJUn0iICIke0ZJUlNUX0RJUn0vZmxvc3MuZGViIgotCi0ke0RSWV9SVU59IHJtIC1yZiAke1RNUF9ESVJ9Ci0KLWVjaG8KLWVjaG8gIk5vdyBydW46IgotZWNobyAiICAgIHN1ZG8gZHBrZyAtaSAiJHtGSVJTVF9ESVJ9Ii9mbG9zcy5kZWIiCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2Zsb3NzL2luc3RhbGwtZGVwZW5kZW5jaWVzIGIvYnVpbGQvZHBrZy9mbG9zcy9pbnN0YWxsLWRlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmUyZmQyMC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2Zsb3NzL2luc3RhbGwtZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotRFJZX1JVTj0iIgotaWYgWyAkIyAtZ3QgMCBdOyB0aGVuCi0gICAgaWYgWyAiJDEiID09ICItLWRyeS1ydW4iIF07IHRoZW4KLSAgICAgICAgRFJZX1JVTj0iZWNobyAiCi0gICAgZmkKLWZpCi0KLWVjaG8gIkNoZWNraW5nIGZvciBkZXBlbmRlbmNpZXMuLi4iCi0KLVJFUVVJUkVEPSJnaXQgY2FyZ28iCi0KLWZvciBuYW1lIGluICQoZWNobyAke1JFUVVJUkVEfSk7Ci1kbwotICAgIHR5cGUgLVAgIiRuYW1lIiAmPi9kZXYvbnVsbCB8fCB7IGVjaG8gIkluc3RhbGwgJyRuYW1lJyIgPiYyOyBleGl0IDE7fQotZG9uZQotCi0KLVNDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJDAiKSIgJiYgcHdkKSIKLVBBUkVOVF9ESVI9IiQoZWNobyAke1NDUklQVF9ESVJ9IHwgcmV2IHwgY3V0IC1kICcvJyAtZiAyLSB8IHJldiApIgotCi1UTVBfRElSPSQobWt0ZW1wIC1kKQotT1VUX0RJUj0iJHtUTVBfRElSfS9vdXQiCi0KLXRyYXAgY3RybF9jIElOVAotCi1mdW5jdGlvbiBjdHJsX2MoKSB7Ci0gICAgcm0gLXJmICIke1RNUF9ESVJ9IgotICAgIGV4aXQgMQotfQotCi0jIENoZWNrIGRlcGVuZGVuY2llcwotIyBsaWJjaHJvbWUgcmVxdWlyZXMgbW9kcF9iNjQKLUFQVF9SRVFVSVJFRD0iZmxhdGJ1ZmZlcnMtY29tcGlsZXIgZmxleCBnKystbXVsdGlsaWIgZ2NjLW11bHRpbGliIGdlbmVyYXRlLW5pbmphIFwKLWdudXBnIGdwZXJmIGxpYmMrKy1kZXYgbGliZGJ1cy0xLWRldiBsaWJldmVudC1kZXYgbGliZXZlbnQtZGV2IGxpYmZsYXRidWZmZXJzLWRldiBsaWJmbGF0YnVmZmVyczEgXAotbGliZ2wxLW1lc2EtZGV2IGxpYmdsaWIyLjAtZGV2IGxpYmx6NC10b29sIGxpYm5jdXJzZXM1IGxpYm5zczMtZGV2IGxpYnByb3RvYnVmLWRldiBsaWJyZTItOSBcCi1saWJzc2wtZGV2IGxpYnRpbnl4bWwyLWRldiBsaWJ4MTEtZGV2IGxpYnhtbDItdXRpbHMgbmluamEtYnVpbGQgb3BlbnNzbCBwcm90b2J1Zi1jb21waWxlciB1bnppcCBcCi14MTFwcm90by1jb3JlLWRldiB4c2x0cHJvYyB6aXAgemxpYjFnLWRldiBkZWJtYWtlIG5pbmphLWJ1aWxkIG1vZHAtYjY0IGxpYmNocm9tZSIKLQotQVBUX01JU1NJTkc9KCkKLWZvciBuYW1lIGluICQoZWNobyAke0FQVF9SRVFVSVJFRH0pOwotZG8KLSAgICBSPSIkKGFwdCAtcXEgbGlzdCAiJHtuYW1lfSIgMj4vZGV2L251bGwgfCBncmVwICJpbnN0YWxsZWQiKSIKLSAgICBpZiBbICIke1J9IiA9PSAiIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIk5lZWQgdG8gaW5zdGFsbCAnJHtuYW1lfSciID4mMjsKLSAgICAgICAgaWYgWyAiJHtuYW1lfSIgPT0gIm1vZHAtYjY0IiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIke25hbWV9IHNvdXJjZSBpcyBhdmFpbGFibGUgdG8gYnVpbGQgaW4gdGhpcyByZXBvc2l0b3J5IgotICAgICAgICAgICAgIyBkaXIgbmFtZSBpcyBkaWZmZXJlbnQgdGhhbiBwYWNrYWdlIG5hbWUgOicoCi0gICAgICAgICAgICAke0RSWV9SVU59IHB1c2hkICIke1BBUkVOVF9ESVJ9L21vZHBfYjY0LyIKLSAgICAgICAgICAgICR7RFJZX1JVTn0gLi9nZW4tc3JjLXBrZy5zaCAiJHtPVVRfRElSfSIKLSAgICAgICAgICAgICR7RFJZX1JVTn0gc3VkbyBkcGtnIC1pICIke09VVF9ESVJ9Ii8ke25hbWV9Ki5kZWIgfHwgY3RybF9jCi0gICAgICAgICAgICAke0RSWV9SVU59IHBvcGQKLSAgICAgICAgZWxpZiBbICIke25hbWV9IiA9PSAibGliY2hyb21lIiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvICIke25hbWV9IHNvdXJjZSBpcyBhdmFpbGFibGUgdG8gYnVpbGQgaW4gdGhpcyByZXBvc2l0b3J5IgotICAgICAgICAgICAgJHtEUllfUlVOfSBwdXNoZCAiJHtQQVJFTlRfRElSfS8ke25hbWV9LyIKLSAgICAgICAgICAgICR7RFJZX1JVTn0gLi9nZW4tc3JjLXBrZy5zaCAiJHtPVVRfRElSfSIKLSAgICAgICAgICAgICR7RFJZX1JVTn0gc3VkbyBkcGtnIC1pICIke09VVF9ESVJ9Ii8ke25hbWV9Ki5kZWIgfHwgY3RybF9jCi0gICAgICAgICAgICAke0RSWV9SVU59IHBvcGQKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQVBUX01JU1NJTkcrPSgiJHtuYW1lfSIpCi0gICAgICAgIGZpCi0gICAgZmkKLWRvbmUKLQotQVBUX01JU1NJTkdfTEVOPSIkeyNBUFRfTUlTU0lOR1tAXX0iCi0KLWlmIFsgJEFQVF9NSVNTSU5HX0xFTiAtZ3QgMCBdOyB0aGVuCi0gICAgZWNobyAiTWlzc2luZyBQYWNrYWdlczoiCi0gICAgZWNobyAiICAgICR7QVBUX01JU1NJTkdbKl19IgotICAgICR7RFJZX1JVTn0gc3VkbyBhcHQgaW5zdGFsbCAiJHtBUFRfTUlTU0lOR1sqXX0iIHx8IGN0cmxfYwotZWxzZQotICAgIHJtIC1yZiAiJHtUTVBfRElSfSIKLSAgICBleGl0IDAKLWZpCi0KLWVjaG8gR2VuZXJhdGluZyBtaXNzaW5nIHBhY2thZ2VzIGluICIke1RNUF9ESVJ9IgotCi0jIENoZWNrIGNhcmdvIGZvciBjeHhicmlkZ2UtY21kCi1IQVNfQ1hYPSIkKGNhcmdvIGluc3RhbGwgLS1saXN0IHwgZ3JlcCBjeHhicmlkZ2UtY21kKSIKLWlmIFsgIiRIQVNfQ1hYIiA9PSAiIiBdOyB0aGVuCi0gICAgZWNobyAiTWlzc2luZyBjeHhicmlkZ2UtY21kIGNhcmdvIHBhY2thZ2UiCi0gICAgZWNobyAiSW5zdGFsbGluZyAnY3h4YnJpZGdlLWNtZCciID4mMgotICAgICR7RFJZX1JVTn0gY2FyZ28gaW5zdGFsbCBjeHhicmlkZ2UtY21kIHx8IGN0cmxfYwotZmkKLQotSEFTX0NYWD0iJChjYXJnbyBpbnN0YWxsIC0tbGlzdCB8IGdyZXAgY2FyZ28tcHJvYy1tYWNybykiCi1pZiBbICIkSEFTX0NYWCIgPT0gIiIgXTsgdGhlbgotICAgIGVjaG8gIk1pc3NpbmcgY2FyZ28tcHJvYy1tYWNybyBjYXJnbyBwYWNrYWdlIgotICAgIGVjaG8gIkluc3RhbGxpbmcgJ2N4eGJyaWRnZS1jbWQnIiA+JjIKLSAgICAke0RSWV9SVU59IGNhcmdvIGluc3RhbGwgY2FyZ28tcHJvYy1tYWNybyB8fCBjdHJsX2MKLWZpCi0KLXJtIC1yZiAiJHtUTVBfRElSfSIKLWVjaG8gIkRPTkUiCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2Zsb3NzL3BhY2thZ2UvREVCSUFOL2NvbnRyb2wgYi9idWlsZC9kcGtnL2Zsb3NzL3BhY2thZ2UvREVCSUFOL2NvbnRyb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjVkMzUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9mbG9zcy9wYWNrYWdlL0RFQklBTi9jb250cm9sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotUGFja2FnZTogZmxvc3MKLVNlY3Rpb246IGN1c3RvbQotUHJpb3JpdHk6IG9wdGlvbmFsCi1NYWludGFpbmVyOiBNYXJ0aW4gQnJhYmhhbSA8b3B0ZWRvYmxpdmlvbkBnb29nbGUuY29tPgotVmVyc2lvbjogMC4xCi1Ib21lcGFnZTogaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbQotRGVwZW5kczogZGVibWFrZSwgbmluamEtYnVpbGQsIGZsYXRidWZmZXJzLWNvbXBpbGVyLCBmbGV4LCBnKystbXVsdGlsaWIsIGdjYy1tdWx0aWxpYiwgZ2VuZXJhdGUtbmluamEsIGdudXBnLCBncGVyZiwgbGliYysrLWRldiwgbGliZGJ1cy0xLWRldiwgbGliZXZlbnQtZGV2LCBsaWJldmVudC1kZXYsIGxpYmZsYXRidWZmZXJzLWRldiwgbGliZmxhdGJ1ZmZlcnMxLCBsaWJnbDEtbWVzYS1kZXYsIGxpYmdsaWIyLjAtZGV2LCBsaWJsejQtdG9vbCwgbGlibmN1cnNlczUsIGxpYm5zczMtZGV2LCBsaWJwcm90b2J1Zi1kZXYsIGxpYnJlMi05LCBsaWJzc2wtZGV2LCBsaWJ0aW55eG1sMi1kZXYsIGxpYngxMS1kZXYsIGxpYnhtbDItdXRpbHMsIG5pbmphLWJ1aWxkLCBvcGVuc3NsLCBwcm90b2J1Zi1jb21waWxlciwgdW56aXAsIHgxMXByb3RvLWNvcmUtZGV2LCB4c2x0cHJvYywgemlwLCB6bGliMWctZGV2LCBtb2RwLWI2NCwgbGliY2hyb21lCi1BcmNoaXRlY3R1cmU6IGFsbAotRXNzZW50aWFsOiBubwotSW5zdGFsbGVkLVNpemU6IDQ5ME1CCi1EZXNjcmlwdGlvbjogVGhlIEZsdW9yaWRlIEJsdWV0b290aCBzdGFjayBvbiBMaW51eApkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9mbG9zcy9wYWNrYWdlL2V0Yy9kYnVzLTEvc3lzdGVtLmQvb3JnLmNocm9taXVtLmJsdWV0b290aC5jb25mIGIvYnVpbGQvZHBrZy9mbG9zcy9wYWNrYWdlL2V0Yy9kYnVzLTEvc3lzdGVtLmQvb3JnLmNocm9taXVtLmJsdWV0b290aC5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTIyNmU3Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvZmxvc3MvcGFja2FnZS9ldGMvZGJ1cy0xL3N5c3RlbS5kL29yZy5jaHJvbWl1bS5ibHVldG9vdGguY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDCi0gICAgICAgICAgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgotPGJ1c2NvbmZpZz4KLQotICA8IS0tIE9ubHkgcm9vdCBvciB1c2VyIGJsdWV0b290aCBjYW4gb3duIHRoZSBidG1hbmFnZXJkIHNlcnZpY2UgLS0+Ci0gIDxwb2xpY3kgdXNlcj0iYmx1ZXRvb3RoIj4KLSAgICA8YWxsb3cgb3duPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoIi8+Ci0gICAgPGFsbG93IG93bj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0gICAgPGFsbG93IG93bj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyQ2FsbGJhY2siLz4KLSAgPC9wb2xpY3k+Ci0gIDxwb2xpY3kgdXNlcj0icm9vdCI+Ci0gICAgPGFsbG93IG93bj0ib3JnLmNocm9taXVtLmJsdWV0b290aCIvPgotICAgIDxhbGxvdyBvd249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlciIvPgotICAgIDxhbGxvdyBvd249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlckNhbGxiYWNrIi8+Ci0gIDwvcG9saWN5PgotCi0gIDwhLS0gQWxsb3cgYW55b25lIHRvIGludm9rZSBtZXRob2RzIG9uIGJ0bWFuYWdlcmQgc2VydmVyLCAgLS0+Ci0gIDwhLS0gV2lsbCBsaWtlbHkgY2hhbmdlIHRoaXMgYXMgdGhlIHByb2plY3QgbWF0dXJlcyAgLS0+Ci0gIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+Ci0gICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGgiLz4KLSAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0gICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlckNhbGxiYWNrIi8+Ci0gIDwvcG9saWN5PgotCi0gIDwhLS0gQWxsb3cgYWNjZXNzIHRvIGV2ZXJ5dGhpbmcgdG8gdGhlIGdyb3VwICJibHVldG9vdGgiIC0tPgotICA8cG9saWN5IGdyb3VwPSJibHVldG9vdGgiPgotICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoIi8+Ci0gICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlciIvPgotICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLk1hbmFnZXJDYWxsYmFjayIvPgotICA8L3BvbGljeT4KLSAgPHBvbGljeSB1c2VyPSJyb290Ij4KLSAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmNocm9taXVtLmJsdWV0b290aCIvPgotICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLk1hbmFnZXIiLz4KLSAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyQ2FsbGJhY2siLz4KLSAgPC9wb2xpY3k+Ci08L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvZmxvc3MvcGFja2FnZS9saWIvc3lzdGVtZC9zeXN0ZW0vYnRhZGFwdGVyZEAuc2VydmljZSBiL2J1aWxkL2Rwa2cvZmxvc3MvcGFja2FnZS9saWIvc3lzdGVtZC9zeXN0ZW0vYnRhZGFwdGVyZEAuc2VydmljZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzYzU2ZC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2Zsb3NzL3BhY2thZ2UvbGliL3N5c3RlbWQvc3lzdGVtL2J0YWRhcHRlcmRALnNlcnZpY2UKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1bVW5pdF0KLURlc2NyaXB0aW9uPUZsb3NzIEJsdWV0b290aCBBZGFwdGVyIHNlcnZpY2UKLURvY3VtZW50YXRpb249bWFuOmJ0YWRhcHRlcmQoOCkKLUNvbmRpdGlvblBhdGhJc0RpcmVjdG9yeT0vc3lzL2NsYXNzL2JsdWV0b290aAotQWZ0ZXI9Ymx1ZXRvb3RoLnRhcmdldCBidG1hbmFnZXJkLnNlcnZpY2UKLQotW1NlcnZpY2VdCi1UeXBlPWRidXMKLUJ1c05hbWU9b3JnLmNocm9taXVtLmJsdWV0b290aAotRXhlY1N0YXJ0PS91c3IvbGliZXhlYy9ibHVldG9vdGgvYnRhZGFwdGVyZCAtLWhjaT0laQotRXhlY1N0YXJ0UG9zdD0vdXNyL2Jpbi9ybSAtZiAvdmFyL3J1bi9ibHVldG9vdGgvYmx1ZXRvb3RoJWkucGlkCi1UaW1lb3V0U3RvcFNlYz0zCi1UaW1lb3V0U3RhcnRTZWM9NQotTm90aWZ5QWNjZXNzPW1haW4KLUNhcGFiaWxpdHlCb3VuZGluZ1NldD1DQVBfTkVUX0FETUlOIENBUF9ORVRfQklORF9TRVJWSUNFCi1MaW1pdE5QUk9DPTEKLVByb3RlY3RIb21lPXRydWUKLVByb3RlY3RTeXN0ZW09ZnVsbAotCi1bSW5zdGFsbF0KLVdhbnRlZEJ5PWJsdWV0b290aC50YXJnZXQgYnRtYW5hZ2VyZC5zZXJ2aWNlCi1BbGlhcz1kYnVzLW9yZy5idGFkYXB0ZXJkLnNlcnZpY2UKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvZmxvc3MvcGFja2FnZS9saWIvc3lzdGVtZC9zeXN0ZW0vYnRtYW5hZ2VyZC5zZXJ2aWNlIGIvYnVpbGQvZHBrZy9mbG9zcy9wYWNrYWdlL2xpYi9zeXN0ZW1kL3N5c3RlbS9idG1hbmFnZXJkLnNlcnZpY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmJhM2IuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9mbG9zcy9wYWNrYWdlL2xpYi9zeXN0ZW1kL3N5c3RlbS9idG1hbmFnZXJkLnNlcnZpY2UKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1bVW5pdF0KLURlc2NyaXB0aW9uPUZsb3NzIEJsdWV0b290aCBzZXJ2aWNlCi1Eb2N1bWVudGF0aW9uPW1hbjpidG1hbmFnZXJkKDgpCi1Db25kaXRpb25QYXRoSXNEaXJlY3Rvcnk9L3N5cy9jbGFzcy9ibHVldG9vdGgKLUFmdGVyPWJsdWV0b290aC50YXJnZXQKLQotW1NlcnZpY2VdCi1UeXBlPWRidXMKLUJ1c05hbWU9b3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyCi1FeGVjU3RhcnQ9L3Vzci9saWJleGVjL2JsdWV0b290aC9idG1hbmFnZXJkIC0tc3lzdGVtZAotTm90aWZ5QWNjZXNzPW1haW4KLUNhcGFiaWxpdHlCb3VuZGluZ1NldD1DQVBfTkVUX0FETUlOIENBUF9ORVRfQklORF9TRVJWSUNFCi1MaW1pdE5QUk9DPTEKLVByb3RlY3RIb21lPXRydWUKLVByb3RlY3RTeXN0ZW09ZnVsbAotVGltZW91dFN0b3BTZWM9MwotVGltZW91dFN0YXJ0U2VjPTUKLQotW0luc3RhbGxdCi1XYW50ZWRCeT1ibHVldG9vdGgudGFyZ2V0Ci1BbGlhcz1kYnVzLW9yZy5idG1hbmFnZXJkLnNlcnZpY2UKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vUkVBRE1FLkRlYmlhbiBiL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vUkVBRE1FLkRlYmlhbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczYmJmMy4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL1JFQURNRS5EZWJpYW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1saWJjaHJvbWUgZm9yIERlYmlhbgpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9jaGFuZ2Vsb2cgYi9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL2NoYW5nZWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzYTVlNy4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL2NoYW5nZWxvZworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotbGliY2hyb21lICg4MjIwNjQtMSkgYnVzdGVyOyB1cmdlbmN5PWxvdwotCi0gICogSW5pdGlhbCByZWxlYXNlLgotCi0gLS0gU29ubnkgU2FzYWthIDxzb25ueXNhc2FrYUBjaHJvbWl1bS5vcmc+ICBGcmksIDMwIEFwciAyMDIxIDE5OjQxOjQwICswMDAwCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL2NvbXBhdCBiL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vY29tcGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk5ZTI4Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vY29tcGF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMTAKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vY29udHJvbCBiL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vY29udHJvbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExYzIzZi4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL2NvbnRyb2wKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1Tb3VyY2U6IGxpYmNocm9tZQotU2VjdGlvbjogbGlicwotUHJpb3JpdHk6IG9wdGlvbmFsCi1NYWludGFpbmVyOiBTb25ueSBTYXNha2EgPHNvbm55c2FzYWthQGNocm9taXVtLm9yZz4KLVN0YW5kYXJkcy1WZXJzaW9uOiA0LjEuNAotSG9tZXBhZ2U6IGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9hb3NwL3BsYXRmb3JtL2V4dGVybmFsL2xpYmNocm9tZS8KLUJ1aWxkLURlcGVuZHM6Ci0gZGViaGVscGVyICg+PTExfiksCi0gY2xhbmcsCi0gcHl0aG9uMywKLSBwa2ctY29uZmlnLAotIG5pbmphLWJ1aWxkLAotIGxpYmdsaWIyLjAtZGV2LAotIGxpYmV2ZW50LWRldiwKLSBsaWJuc3MzLWRldiwKLSBsaWJkYnVzLTEtZGV2LAotIGxpYnByb3RvYnVmLWRldiwKLSBnb29nbGV0ZXN0LAotIGxpYnJlMi1kZXYsCi0gbGliZG91YmxlLWNvbnZlcnNpb24tZGV2LAotIGxpYnNzbC1kZXYsCi0gbGliYWJzbC1kZXYKLQotUGFja2FnZTogbGliY2hyb21lCi1BcmNoaXRlY3R1cmU6IGFueQotTXVsdGktQXJjaDogZm9yZWlnbgotRGVwZW5kczogJHttaXNjOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfQotRGVzY3JpcHRpb246IENocm9taXVtJ3MgYmFzZSBsaWJyYXJ5CmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL2luc3RhbGxfaGVhZGVycy5zaCBiL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vaW5zdGFsbF9oZWFkZXJzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTU3YjE0Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vaW5zdGFsbF9oZWFkZXJzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZGVzdGRpcj0iJDEiCi0KLWhlYWRlcl9kaXJzPSgKLSAgICBiYXNlCi0gICAgYmFzZS9hbGxvY2F0b3IKLSAgICBiYXNlL2NvbnRhaW5lcnMKLSAgICBiYXNlL2RlYnVnCi0gICAgYmFzZS9maWxlcwotICAgIGJhc2UvaGFzaAotICAgIGJhc2UvaTE4bgotICAgIGJhc2UvanNvbgotICAgIGJhc2UvbWVtb3J5Ci0gICAgYmFzZS9tZXNzYWdlX2xvb3AKLSAgICBiYXNlL21ldHJpY3MKLSAgICBiYXNlL251bWVyaWNzCi0gICAgYmFzZS9wb3NpeAotICAgIGJhc2UvcHJvY2VzcwotICAgIGJhc2UvcmFuZ2VzCi0gICAgYmFzZS9zdHJpbmdzCi0gICAgYmFzZS9zeW5jaHJvbml6YXRpb24KLSAgICBiYXNlL3N5c3RlbQotICAgIGJhc2UvdGFzawotICAgIGJhc2UvdGFzay9jb21tb24KLSAgICBiYXNlL3Rhc2svc2VxdWVuY2VfbWFuYWdlcgotICAgIGJhc2UvdGFzay90aHJlYWRfcG9vbAotICAgIGJhc2UvdGVzdAotICAgIGJhc2UvdGhpcmRfcGFydHkvaWN1Ci0gICAgYmFzZS90aGlyZF9wYXJ0eS9uc3ByCi0gICAgYmFzZS90aGlyZF9wYXJ0eS92YWxncmluZAotICAgIGJhc2UvdGhyZWFkaW5nCi0gICAgYmFzZS90aW1lCi0gICAgYmFzZS90aW1lcgotICAgIGJhc2UvdHJhY2VfZXZlbnQKLSAgICBiYXNlL3RyYWNlX2V2ZW50L2NvbW1vbgotICAgIGJ1aWxkCi0gICAgY29tcG9uZW50cy9wb2xpY3kKLSAgICBjb21wb25lbnRzL3BvbGljeS9jb3JlL2NvbW1vbgotICAgIHRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jawotICAgIHRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdAotICAgIGRidXMKLSAgICB0aGlyZF9wYXJ0eS9hYnNlaWwtY3BwL2Fic2wvdHlwZXMKLSAgKQotCi0jIEluc3RhbGwgaGVhZGVyIGZpbGVzLgotZm9yIGQgaW4gIiR7aGVhZGVyX2RpcnNbQF19IiA7IGRvCi0gIG1rZGlyIC1wICIke2Rlc3RkaXJ9L3Vzci9pbmNsdWRlL2xpYmNocm9tZS8ke2R9IgotICBjcCBsaWJjaHJvbWUvIiR7ZH0iLyouaCAiJHtkZXN0ZGlyfS91c3IvaW5jbHVkZS9saWJjaHJvbWUvJHtkfSIKLWRvbmUKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vbGliY2hyb21lLmluc3RhbGwgYi9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL2xpYmNocm9tZS5pbnN0YWxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM4MWMxLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vbGliY2hyb21lLmluc3RhbGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW91dC9SZWxlYXNlL2xpYi9saWJiYXNlKi5zbyAvdXNyL2xpYgotb3V0L1JlbGVhc2UvbGliYmFzZSouYSAvdXNyL2xpYgotb3V0L1JlbGVhc2Uvb2JqL2xpYmNocm9tZS9saWJjaHJvbWUqLnBjIC91c3IvbGliL3BrZ2NvbmZpZwotdXNyL2luY2x1ZGUgL3VzcgpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9wYXRjaGVzLzAwMDEtQWRkLW1pc3NpbmctaW5jbHVkZXMucGF0Y2ggYi9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3BhdGNoZXMvMDAwMS1BZGQtbWlzc2luZy1pbmNsdWRlcy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmMmI0Yi4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3BhdGNoZXMvMDAwMS1BZGQtbWlzc2luZy1pbmNsdWRlcy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUZyb20gNTBhNDYzNjg4NmM5NTg3MTcyMTM4NTYxMzJmY2JiNTdjM2I4ZWEyYSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IFNvbm55IFNhc2FrYSA8c29ubnlzYXNha2FAY2hyb21pdW0ub3JnPgotRGF0ZTogRnJpLCAxOSBNYXIgMjAyMSAxNjoxODowNyAtMDcwMAotU3ViamVjdDogW1BBVENIXSBBZGQgbWlzc2luZyBpbmNsdWRlcwotCi0tLS0KLSBiYXNlL2hhc2gvbWQ1LmNjICAgICB8IDEgKwotIGNyeXB0by9wMjI0X3NwYWtlLmNjIHwgMSArCi0gMiBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKykKLQotZGlmZiAtLWdpdCBhL2xpYmNocm9tZS9iYXNlL2hhc2gvbWQ1LmNjIGIvbGliY2hyb21lL2Jhc2UvaGFzaC9tZDUuY2MKLWluZGV4IGJkYjk5OTBhOS4uZWY4OTU0ZWFmIDEwMDY0NAotLS0tIGEvbGliY2hyb21lL2Jhc2UvaGFzaC9tZDUuY2MKLSsrKyBiL2xpYmNocm9tZS9iYXNlL2hhc2gvbWQ1LmNjCi1AQCAtMjQsNiArMjQsNyBAQAotICNpbmNsdWRlICJiYXNlL2hhc2gvbWQ1LmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGRlZi5oPgotKyNpbmNsdWRlIDxzdHJpbmcuaD4KLSAKLSBuYW1lc3BhY2UgewotIAotZGlmZiAtLWdpdCBhL2xpYmNocm9tZS9jcnlwdG8vcDIyNF9zcGFrZS5jYyBiL2xpYmNocm9tZS9jcnlwdG8vcDIyNF9zcGFrZS5jYwotaW5kZXggMTU3NDEwNTM3Li5kZTBhZjU0NjYgMTAwNjQ0Ci0tLS0gYS9saWJjaHJvbWUvY3J5cHRvL3AyMjRfc3Bha2UuY2MKLSsrKyBiL2xpYmNocm9tZS9jcnlwdG8vcDIyNF9zcGFrZS5jYwotQEAgLTgsNiArOCw3IEBACi0gI2luY2x1ZGUgPGNyeXB0by9wMjI0X3NwYWtlLmg+Ci0gCi0gI2luY2x1ZGUgPGFsZ29yaXRobT4KLSsjaW5jbHVkZSA8c3RyaW5nLmg+Ci0gCi0gI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotICNpbmNsdWRlIDxjcnlwdG8vcDIyNC5oPgotLS0gCi0yLjIwLjEKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9wYXRjaGVzLzAwMDEtUmVtb3ZlLWFic2wtZnJvbS1wa2djb25maWcucGF0Y2ggYi9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3BhdGNoZXMvMDAwMS1SZW1vdmUtYWJzbC1mcm9tLXBrZ2NvbmZpZy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiOGM0OC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3BhdGNoZXMvMDAwMS1SZW1vdmUtYWJzbC1mcm9tLXBrZ2NvbmZpZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUZyb20gOWM5M2RhNTdjYzIwNmNlM2QzMDE3ODZiN2VmNzMzMTk3ZWU5MjkzOSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IFNvbm55IFNhc2FrYSA8c29ubnlzYXNha2FAY2hyb21pdW0ub3JnPgotRGF0ZTogRnJpLCAzMCBBcHIgMjAyMSAxNzo0OToxNCAtMDcwMAotU3ViamVjdDogW1BBVENIXSBSZW1vdmUgYWJzbCBmcm9tIHBrZ2NvbmZpZwotCi1DaGFuZ2UtSWQ6IElhNTRiYjFjNTgwNTZiMWQ3YWRhYjY2OGU3N2VmOThmZmIxNWY0MWM2Ci0tLS0KLSBCVUlMRC5nbiB8IDIgLS0KLSAxIGZpbGUgY2hhbmdlZCwgMiBkZWxldGlvbnMoLSkKLQotZGlmZiAtLWdpdCBhL2xpYmNocm9tZS9CVUlMRC5nbiBiL2xpYmNocm9tZS9CVUlMRC5nbgotaW5kZXggNDAyZWQ0YzcyNS4uNzc3OGFhMDE2MyAxMDA2NDQKLS0tLSBhL2xpYmNocm9tZS9CVUlMRC5nbgotKysrIGIvbGliY2hyb21lL0JVSUxELmduCi1AQCAtOTAsNyArOTAsNiBAQCBsaWJiYXNlX3N1YmxpYnMgPSBbCi0gICAgICAgIm1vZHBfYjY0IiwKLSAgICAgXQotICAgICBwa2dfZGVwcyA9IFsKLS0gICAgICAiYWJzbCIsCi0gICAgICAgImdsaWItMi4wIiwKLSAgICAgICAibGliZXZlbnQiLAotICAgICBdCi1AQCAtNDYwLDcgKzQ1OSw2IEBAIGlmICh1c2UuZGJ1cykgewotICAgICAgIG5hbWUgPSAiYmFzZS1kYnVzIgotICAgICAgIGRlcHMgPSBbICI6YmFzZS1jb3JlIiBdCi0gICAgICAgcGtnX2RlcHMgPSBbCi0tICAgICAgICAiYWJzbCIsCi0gICAgICAgICAiZGJ1cy0xIiwKLSAgICAgICBdCi0gICAgICAgaWYgKHVzZS5mdXp6ZXIpIHsKLS0tIAotMi4zMS4wCi0KZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9kZWJpYW4vcGF0Y2hlcy8wMDAxLXJlYmFzZV9wYXRoLWZvci13cml0ZV9hcmdzLnBhdGNoIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9wYXRjaGVzLzAwMDEtcmViYXNlX3BhdGgtZm9yLXdyaXRlX2FyZ3MucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU5YzAuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9wYXRjaGVzLzAwMDEtcmViYXNlX3BhdGgtZm9yLXdyaXRlX2FyZ3MucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1Gcm9tIDY4NzU0NDk0OTdiYWYwMjZmYjgyMjg2Njg5MzBhNzE1ZmZjYzcwODIgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCi1Gcm9tOiBTb25ueSBTYXNha2EgPHNvbm55c2FzYWthQGNocm9taXVtLm9yZz4KLURhdGU6IEZyaSwgMTkgTWFyIDIwMjEgMTY6NTY6NTkgLTA3MDAKLVN1YmplY3Q6IFtQQVRDSF0gcmViYXNlX3BhdGggZm9yIHdyaXRlX2FyZ3MKLQotLS0tCi0gQlVJTEQuZ24gfCA0ICsrLS0KLSAxIGZpbGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQotCi1kaWZmIC0tZ2l0IGEvbGliY2hyb21lL0JVSUxELmduIGIvbGliY2hyb21lL0JVSUxELmduCi1pbmRleCBhODQ2ZDhmNTIuLjY2YWMxMGE1NSAxMDA2NDQKLS0tLSBhL2xpYmNocm9tZS9CVUlMRC5nbgotKysrIGIvbGliY2hyb21lL0JVSUxELmduCi1AQCAtNTU2LDcgKzU1Niw3IEBAIGFjdGlvbigiYmFzZSIpIHsKLSAKLSAgIHNjcmlwdCA9ICIvL2NvbW1vbi1tay93cml0ZV9hcmdzLnB5IgotICAgb3V0cHV0cyA9IFsgIiR7cm9vdF9vdXRfZGlyfS9saWIvbGliJHt0YXJnZXRfbmFtZX0uc28iIF0KLS0gIGFyZ3MgPSBbICItLW91dHB1dCIgXSArIG91dHB1dHMgKyBbICItLSIgXSArIFsKLSsgIGFyZ3MgPSBbICItLW91dHB1dCIgXSArIHJlYmFzZV9wYXRoKG91dHB1dHMpICsgWyAiLS0iIF0gKyBbCi0gICAgICAgICAgICAiR1JPVVAiLAotICAgICAgICAgICAgIigiLAotICAgICAgICAgICAgIkFTX05FRURFRCIsCi1AQCAtNjE4LDcgKzYxOCw3IEBAIGFjdGlvbigiYmFzZS10ZXN0IikgewotIAotICAgc2NyaXB0ID0gIi8vY29tbW9uLW1rL3dyaXRlX2FyZ3MucHkiCi0gICBvdXRwdXRzID0gWyAiJHtyb290X291dF9kaXJ9L2xpYiR7dGFyZ2V0X25hbWV9LmEiIF0KLS0gIGFyZ3MgPSBbICItLW91dHB1dCIgXSArIG91dHB1dHMgKyBbICItLSIgXSArIFsKLSsgIGFyZ3MgPSBbICItLW91dHB1dCIgXSArIHJlYmFzZV9wYXRoKG91dHB1dHMpICsgWyAiLS0iIF0gKyBbCi0gICAgICAgICAgICAiR1JPVVAiLAotICAgICAgICAgICAgIigiLAotICAgICAgICAgICAgIkFTX05FRURFRCIsCi0tLSAKLTIuMjAuMQotCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3BhdGNoZXMvc2VyaWVzIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9wYXRjaGVzL3NlcmllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyODU4OC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3BhdGNoZXMvc2VyaWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0wMDAxLUFkZC1taXNzaW5nLWluY2x1ZGVzLnBhdGNoCi0wMDAxLXJlYmFzZV9wYXRoLWZvci13cml0ZV9hcmdzLnBhdGNoCi0wMDAxLVJlbW92ZS1hYnNsLWZyb20tcGtnY29uZmlnLnBhdGNoCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3J1bGVzIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2RlYmlhbi9ydWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QyM2E1NC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS04MjIwNjQvZGViaWFuL3J1bGVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyEvdXNyL2Jpbi9tYWtlIC1mCi0KLSMgZ24gYXJncwotZGVmaW5lcyA9Ci1kZWZpbmVzICs9IHBrZ19jb25maWc9XCJwa2ctY29uZmlnXCIKLWRlZmluZXMgKz0gbGliYmFzZV92ZXI9XCI4MjIwNjRcIgotZGVmaW5lcyArPSBwbGF0Zm9ybTJfcm9vdD1cIiQoc2hlbGwgcHdkKS9cIgotZGVmaW5lcyArPSBwbGF0Zm9ybV9zdWJkaXI9XCJsaWJjaHJvbWVcIgotZGVmaW5lcyArPSBjeHg9XCJjbGFuZysrXCIKLWRlZmluZXMgKz0gY2M9XCJjbGFuZ1wiCi1kZWZpbmVzICs9IGFyPVwiYXJcIgotZGVmaW5lcyArPSBleHRlcm5hbF9jeHhmbGFncz1bXCItSS91c3Ivc3JjL2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlXCIsIFwiLUkvdXNyL3NyYy9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZVwiXQotZGVmaW5lcyArPSBleHRlcm5hbF9sZGZsYWdzPVtcIi1sYXRvbWljXCIsIFwiLWxhYnNsX2Jhc2VcIiwgXCItbGFic2xfYmFkX3ZhcmlhbnRfYWNjZXNzXCJdCi1kZWZpbmVzICs9IGVuYWJsZV93ZXJyb3I9ZmFsc2UKLWRlZmluZXMgKz0gbGliZGlyPVwiL3Vzci9saWJcIgotZGVmaW5lcyArPSB1c2U9e21vam89ZmFsc2UgYXNhbj1mYWxzZSBjb3ZlcmFnZT1mYWxzZSBjcnlwdG89dHJ1ZSBkYnVzPXRydWUgZnV6emVyPWZhbHNlIHRpbWVycz10cnVlIGNyb3NfaG9zdD1mYWxzZSBwcm9maWxpbmc9ZmFsc2UgdGNtYWxsb2M9ZmFsc2V9Ci0KLSMgaGFuZGxlIHBhcmFsbGVsIGJ1aWxkIG9wdGlvbnMKLW5qb2JzPTEKLWlmbmVxICgsJChmaWx0ZXIgcGFyYWxsZWw9JSwkKERFQl9CVUlMRF9PUFRJT05TKSkpCi1uam9icz0kKHBhdHN1YnN0IHBhcmFsbGVsPSUsJSwkKGZpbHRlciBwYXJhbGxlbD0lLCQoREVCX0JVSUxEX09QVElPTlMpKSkKLWVuZGlmCi0KLSU6Ci0JZGggJEAgLS1wYXJhbGxlbAotCi1vdmVycmlkZV9kaF9hdXRvX2J1aWxkLWFyY2g6Ci0JZ24gZ2VuIG91dC9SZWxlYXNlIC0tYXJncz0iJChkZWZpbmVzKSIKLQluaW5qYSAtaiQobmpvYnMpIC1DIG91dC9SZWxlYXNlCi0KLW92ZXJyaWRlX2RoX2F1dG9fY2xlYW46Ci0Jcm0gLXJmIG91dAotCWZpbmQgLiAtbmFtZSBcKi5weWMgLWV4ZWNkaXIgcm0gLWYge30gXDsKLQlkaF9hdXRvX2NsZWFuCi0KLW92ZXJyaWRlX2RoX2F1dG9faW5zdGFsbC1hcmNoOgotCWRoX2F1dG9faW5zdGFsbAotCWRlYmlhbi9pbnN0YWxsX2hlYWRlcnMuc2ggZGViaWFuL3RtcApkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2dlbi1zcmMtcGtnLnNoIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUtODIyMDY0L2dlbi1zcmMtcGtnLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmI1ZGNlLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lLTgyMjA2NC9nZW4tc3JjLXBrZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIEdlbmVyYXRlcyBEZWJpYW4gc291cmNlIGFuZCBiaW5hcnkgcGFja2FnZXMgb2YgbGliY2hyb21lLgotCi1pZiBbIC16ICIkMSIgXTsgdGhlbgotICAgICAgICBlY2hvICJVc2FnZTogZ2VuLXNyYy1wa2cuc2ggPG91dHB1dC1kaXI+IgotICAgICAgICBleGl0IDEKLWZpCi0KLW91dGRpcj0iJDEiCi1wa2dkaXI9bGliY2hyb21lLTgyMjA2NAotb3JpZ3Rhcj1saWJjaHJvbWVfODIyMDY0Lm9yaWcudGFyLmd6Ci1zY3JpcHRkaXI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCi1icmFuY2g9cmVsZWFzZS1SOTEtMTM5MDQuQgotCi10bXBkaXI9JChta3RlbXAgLWQpCi1lY2hvIEdlbmVyYXRpbmcgc291cmNlIHBhY2thZ2UgaW4gIiR7dG1wZGlyfSIuCi0KLSMgRG93bmxvYWQgcGxhdGZvcm0yIHNvdXJjZS4KLWNkICIke3RtcGRpcn0iCi1naXQgY2xvbmUgLS1icmFuY2ggIiR7YnJhbmNofSIgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtb3MvcGxhdGZvcm0yIHx8IGV4aXQgMQotbWtkaXIgIiR7cGtnZGlyfSIKLWNkICIke3BrZ2Rpcn0iCi0jIFRyaW0gcGxhdGZvcm0yLCBvbmx5IGNvbW1vbi1tayBpcyBuZWVkZWQuCi1jcCAtYSAuLi9wbGF0Zm9ybTIve2NvbW1vbi1taywuZ259IC4KLQotIyBEb3dubG9hZCBsaWJjaHJvbWUgc291cmNlIGFuZCBhcHBseSBDaHJvbWUgT1MncyBwYXRjaGVzLgotZ2l0IGNsb25lIC0tYnJhbmNoICIke2JyYW5jaH0iIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9hb3NwL3BsYXRmb3JtL2V4dGVybmFsL2xpYmNocm9tZSB8fCBleGl0IDEKLWNkIGxpYmNocm9tZQotcm0gLXJmIC5naXQKLXdoaWxlIHJlYWQgLXIgcGF0Y2g7IGRvCi0gIHBhdGNoIC1wMSA8ICJsaWJjaHJvbWVfdG9vbHMvcGF0Y2hlcy8ke3BhdGNofSIKLWRvbmUgPCA8KGdyZXAgLUUgJ15bXiNdJyAibGliY2hyb21lX3Rvb2xzL3BhdGNoZXMvcGF0Y2hlcyIpCi0KLSMgQ2xlYW4gdXAgdGVtcG9yYXJ5IHBsYXRmb3JtMiBjaGVja291dC4KLWNkIC4uLy4uCi1ybSAtcmYgcGxhdGZvcm0yCi0KLSMgRGViaWFuIHJlcXVpcmVzIGNyZWF0aW5nIC5vcmlnLnRhci5nei4KLXRhciBjemYgIiR7b3JpZ3Rhcn0iICIke3BrZ2Rpcn0iCi0KLSMgRGViaWFuaXplIHRoZSBzb3VyY2UuCi1jZCAiJHtwa2dkaXJ9IgoteWVzIHwgZGVibWFrZSB8fCBleGl0IDEKLWNwIC1hVCAiJHtzY3JpcHRkaXJ9L2RlYmlhbi8iICIke3RtcGRpcn0vJHtwa2dkaXJ9L2RlYmlhbi8iCi0KLSMgQnVpbGQgc291cmNlIHBhY2thZ2UgYW5kIGJpbmFyeSBwYWNrYWdlLgotY2QgIiR7dG1wZGlyfS8ke3BrZ2Rpcn0iCi1kcGtnLWJ1aWxkcGFja2FnZSAtLW5vLXNpZ24gfHwgZXhpdCAxCi0KLSMgQ29weSB0aGUgcmVzdWx0cyB0byBvdXRwdXQgZGlyLgotY2QgIiR7dG1wZGlyfSIKLW1rZGlyIC1wICIke291dGRpcn0vc3JjIgotY3AgKi5kc2MgKi5vcmlnLnRhci5neiAqLmRlYmlhbi50YXIueHogIiR7b3V0ZGlyfS9zcmMiCi1jcCAqLmRlYiAiJHtvdXRkaXJ9IgotY2QgLwotCi1lY2hvIFJlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkgIiR7dG1wZGlyfSIuCi1ybSAtcmYgIiR7dG1wZGlyfSIKLQotZWNobyBEb25lLiBDaGVjayBvdXQgRGViaWFuIHNvdXJjZSBwYWNrYWdlIGluICIke291dGRpcn0iLgpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL1JFQURNRS5EZWJpYW4gYi9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vUkVBRE1FLkRlYmlhbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczYmJmMy4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vUkVBRE1FLkRlYmlhbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWxpYmNocm9tZSBmb3IgRGViaWFuCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vY2hhbmdlbG9nIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL2NoYW5nZWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkZWRmNi4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vY2hhbmdlbG9nCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1saWJjaHJvbWUgKDc4MDY1Mi0xKSBidXN0ZXI7IHVyZ2VuY3k9bG93Ci0KLSAgKiBJbml0aWFsIHJlbGVhc2UuCi0KLSAtLSBTb25ueSBTYXNha2EgPHNvbm55c2FzYWthQGNocm9taXVtLm9yZz4gIEZyaSwgMTkgTWFyIDIwMjEgMTk6NDE6NDAgKzAwMDAKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9jb21wYXQgYi9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vY29tcGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk5ZTI4Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9jb21wYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0xMApkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL2NvbnRyb2wgYi9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vY29udHJvbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwNGI0ZC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vY29udHJvbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLVNvdXJjZTogbGliY2hyb21lCi1TZWN0aW9uOiBsaWJzCi1Qcmlvcml0eTogb3B0aW9uYWwKLU1haW50YWluZXI6IFNvbm55IFNhc2FrYSA8c29ubnlzYXNha2FAY2hyb21pdW0ub3JnPgotU3RhbmRhcmRzLVZlcnNpb246IDQuMS40Ci1Ib21lcGFnZTogaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Fvc3AvcGxhdGZvcm0vZXh0ZXJuYWwvbGliY2hyb21lLwotQnVpbGQtRGVwZW5kczoKLSBkZWJoZWxwZXIgKD49MTF+KSwKLSBjbGFuZywKLSBweXRob24zLAotIHBrZy1jb25maWcsCi0gbmluamEtYnVpbGQsCi0gbGliZ2xpYjIuMC1kZXYsCi0gbGliZXZlbnQtZGV2LAotIGxpYm5zczMtZGV2LAotIGxpYmRidXMtMS1kZXYsCi0gbGlicHJvdG9idWYtZGV2LAotIGdvb2dsZXRlc3QsCi0gbGlicmUyLWRldiwKLSBsaWJkb3VibGUtY29udmVyc2lvbi1kZXYsCi0gbGlic3NsLWRldgotCi1QYWNrYWdlOiBsaWJjaHJvbWUKLUFyY2hpdGVjdHVyZTogYW55Ci1NdWx0aS1BcmNoOiBmb3JlaWduCi1EZXBlbmRzOiAke21pc2M6RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9Ci1EZXNjcmlwdGlvbjogQ2hyb21pdW0ncyBiYXNlIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9pbnN0YWxsX2hlYWRlcnMuc2ggYi9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vaW5zdGFsbF9oZWFkZXJzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOWNiNWVmLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9pbnN0YWxsX2hlYWRlcnMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIS9iaW4vYmFzaAotCi1kZXN0ZGlyPSIkMSIKLQotaGVhZGVyX2RpcnM9KAotICAgIGJhc2UKLSAgICBiYXNlL2FsbG9jYXRvcgotICAgIGJhc2UvY29udGFpbmVycwotICAgIGJhc2UvZGVidWcKLSAgICBiYXNlL2ZpbGVzCi0gICAgYmFzZS9oYXNoCi0gICAgYmFzZS9pMThuCi0gICAgYmFzZS9qc29uCi0gICAgYmFzZS9tZW1vcnkKLSAgICBiYXNlL21lc3NhZ2VfbG9vcAotICAgIGJhc2UvbWV0cmljcwotICAgIGJhc2UvbnVtZXJpY3MKLSAgICBiYXNlL3Bvc2l4Ci0gICAgYmFzZS9wcm9jZXNzCi0gICAgYmFzZS9zdHJpbmdzCi0gICAgYmFzZS9zeW5jaHJvbml6YXRpb24KLSAgICBiYXNlL3N5c3RlbQotICAgIGJhc2UvdGFzawotICAgIGJhc2UvdGFzay9jb21tb24KLSAgICBiYXNlL3Rhc2svc2VxdWVuY2VfbWFuYWdlcgotICAgIGJhc2UvdGFzay90aHJlYWRfcG9vbAotICAgIGJhc2UvdGVzdAotICAgIGJhc2UvdGhpcmRfcGFydHkvaWN1Ci0gICAgYmFzZS90aGlyZF9wYXJ0eS9uc3ByCi0gICAgYmFzZS90aGlyZF9wYXJ0eS92YWxncmluZAotICAgIGJhc2UvdGhyZWFkaW5nCi0gICAgYmFzZS90aW1lCi0gICAgYmFzZS90aW1lcgotICAgIGJhc2UvdHJhY2VfZXZlbnQKLSAgICBiYXNlL3RyYWNlX2V2ZW50L2NvbW1vbgotICAgIGJ1aWxkCi0gICAgY29tcG9uZW50cy9wb2xpY3kKLSAgICBjb21wb25lbnRzL3BvbGljeS9jb3JlL2NvbW1vbgotICAgIHRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jawotICAgIHRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdAotICAgIGRidXMKLSAgKQotCi0jIEluc3RhbGwgaGVhZGVyIGZpbGVzLgotZm9yIGQgaW4gIiR7aGVhZGVyX2RpcnNbQF19IiA7IGRvCi0gIG1rZGlyIC1wICIke2Rlc3RkaXJ9L3Vzci9pbmNsdWRlL2xpYmNocm9tZS8ke2R9IgotICBjcCBsaWJjaHJvbWUvIiR7ZH0iLyouaCAiJHtkZXN0ZGlyfS91c3IvaW5jbHVkZS9saWJjaHJvbWUvJHtkfSIKLWRvbmUKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9saWJjaHJvbWUuaW5zdGFsbCBiL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9saWJjaHJvbWUuaW5zdGFsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzODFjMS4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vbGliY2hyb21lLmluc3RhbGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW91dC9SZWxlYXNlL2xpYi9saWJiYXNlKi5zbyAvdXNyL2xpYgotb3V0L1JlbGVhc2UvbGliYmFzZSouYSAvdXNyL2xpYgotb3V0L1JlbGVhc2Uvb2JqL2xpYmNocm9tZS9saWJjaHJvbWUqLnBjIC91c3IvbGliL3BrZ2NvbmZpZwotdXNyL2luY2x1ZGUgL3VzcgpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvMDAwMS1BZGQtbWlzc2luZy1pbmNsdWRlcy5wYXRjaCBiL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9wYXRjaGVzLzAwMDEtQWRkLW1pc3NpbmctaW5jbHVkZXMucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjJiNGIuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvMDAwMS1BZGQtbWlzc2luZy1pbmNsdWRlcy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUZyb20gNTBhNDYzNjg4NmM5NTg3MTcyMTM4NTYxMzJmY2JiNTdjM2I4ZWEyYSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IFNvbm55IFNhc2FrYSA8c29ubnlzYXNha2FAY2hyb21pdW0ub3JnPgotRGF0ZTogRnJpLCAxOSBNYXIgMjAyMSAxNjoxODowNyAtMDcwMAotU3ViamVjdDogW1BBVENIXSBBZGQgbWlzc2luZyBpbmNsdWRlcwotCi0tLS0KLSBiYXNlL2hhc2gvbWQ1LmNjICAgICB8IDEgKwotIGNyeXB0by9wMjI0X3NwYWtlLmNjIHwgMSArCi0gMiBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKykKLQotZGlmZiAtLWdpdCBhL2xpYmNocm9tZS9iYXNlL2hhc2gvbWQ1LmNjIGIvbGliY2hyb21lL2Jhc2UvaGFzaC9tZDUuY2MKLWluZGV4IGJkYjk5OTBhOS4uZWY4OTU0ZWFmIDEwMDY0NAotLS0tIGEvbGliY2hyb21lL2Jhc2UvaGFzaC9tZDUuY2MKLSsrKyBiL2xpYmNocm9tZS9iYXNlL2hhc2gvbWQ1LmNjCi1AQCAtMjQsNiArMjQsNyBAQAotICNpbmNsdWRlICJiYXNlL2hhc2gvbWQ1LmgiCi0gCi0gI2luY2x1ZGUgPHN0ZGRlZi5oPgotKyNpbmNsdWRlIDxzdHJpbmcuaD4KLSAKLSBuYW1lc3BhY2UgewotIAotZGlmZiAtLWdpdCBhL2xpYmNocm9tZS9jcnlwdG8vcDIyNF9zcGFrZS5jYyBiL2xpYmNocm9tZS9jcnlwdG8vcDIyNF9zcGFrZS5jYwotaW5kZXggMTU3NDEwNTM3Li5kZTBhZjU0NjYgMTAwNjQ0Ci0tLS0gYS9saWJjaHJvbWUvY3J5cHRvL3AyMjRfc3Bha2UuY2MKLSsrKyBiL2xpYmNocm9tZS9jcnlwdG8vcDIyNF9zcGFrZS5jYwotQEAgLTgsNiArOCw3IEBACi0gI2luY2x1ZGUgPGNyeXB0by9wMjI0X3NwYWtlLmg+Ci0gCi0gI2luY2x1ZGUgPGFsZ29yaXRobT4KLSsjaW5jbHVkZSA8c3RyaW5nLmg+Ci0gCi0gI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotICNpbmNsdWRlIDxjcnlwdG8vcDIyNC5oPgotLS0gCi0yLjIwLjEKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvMDAwMS1jb21tb24tbWstcmViYXNlX3BhdGgtb3V0cHV0LWxvY2F0aW9uLW9mLWdlbmVyYXRlLXBjLnBhdGNoIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvMDAwMS1jb21tb24tbWstcmViYXNlX3BhdGgtb3V0cHV0LWxvY2F0aW9uLW9mLWdlbmVyYXRlLXBjLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MThlZmNjLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9wYXRjaGVzLzAwMDEtY29tbW9uLW1rLXJlYmFzZV9wYXRoLW91dHB1dC1sb2NhdGlvbi1vZi1nZW5lcmF0ZS1wYy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLUZyb20gMDRmYTVlMWFkZTA4Njk2YjVhMmNjM2I2NWJmMGZkMjZjNDMyNTFjNyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IFNvbm55IFNhc2FrYSA8c29ubnlzYXNha2FAY2hyb21pdW0ub3JnPgotRGF0ZTogRnJpLCAxOSBNYXIgMjAyMSAxMToxNzo0MyAtMDcwMAotU3ViamVjdDogW1BBVENIXSBjb21tb24tbWs6IHJlYmFzZV9wYXRoIG91dHB1dCBsb2NhdGlvbiBvZiBnZW5lcmF0ZS1wYy5weQotCi1XaXRob3V0IHJlYmFzZV9wYXRoLCB0aGUgZ2VuZXJhdGUtcGMucHkgd291bGQgYmUgY2FsbGVkIGxpa2UKLWBnZW5lcmF0ZS1wYy5weSAtLW91dHB1dCAvL291dC9SZWxlYXNlYCBpZiB0aGUgb3V0cHV0IGlzIGluc2lkZSB0aGUKLXNvdXJjZSBkaXJlY3RvcnkgYW5kIHRoaXMgZ24gcGF0aCBpc24ndCByZWNvZ25pemVkIGFzIGEgZ2VuZXJpYwotZmlsZXN5c3RlbSBwYXRoLgotCi1CVUc9YjoxODMyMTYyMTYKLVRFU1Q9d2l0aCBtb2RwX2I2NCwgY2FsbAotJCBnbiBnZW4gb3V0L1JlbGVhc2UgLS1hcmdzPS4uLgotJCBuaW5qYQotCi1DaGFuZ2UtSWQ6IEljOWQ5YjNkMDFkNTJkNDgzZTNkODFjYTJlOGQ1MTRiNDc5MDBmNWJiCi0tLS0KLSBjb21tb24tbWsvcGtnX2NvbmZpZy5nbmkgfCAyICstCi0gMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pCi0KLWRpZmYgLS1naXQgYS9jb21tb24tbWsvcGtnX2NvbmZpZy5nbmkgYi9jb21tb24tbWsvcGtnX2NvbmZpZy5nbmkKLWluZGV4IDI0ZTJjZjE0MDEuLmIyYzU4ODQ1ZDQgMTAwNjQ0Ci0tLS0gYS9jb21tb24tbWsvcGtnX2NvbmZpZy5nbmkKLSsrKyBiL2NvbW1vbi1tay9wa2dfY29uZmlnLmduaQotQEAgLTg0LDcgKzg0LDcgQEAgdGVtcGxhdGUoImdlbmVyYXRlX3BrZ19jb25maWciKSB7Ci0gICAgIG91dHB1dHMgPSBbICIke3RhcmdldF9vdXRfZGlyfS8ke291dHB1dF9uYW1lfS5wYyIgXQotIAotICAgICBzY3JpcHQgPSAiLy9jb21tb24tbWsvZ2VuZXJhdGUtcGMucHkiCi0tICAgIGFyZ3MgPSBbICItLW91dHB1dCIgXSArIG91dHB1dHMgKyBbICItLW5hbWU9IiArIG5hbWUgXQotKyAgICBhcmdzID0gWyAiLS1vdXRwdXQiIF0gKyByZWJhc2VfcGF0aChvdXRwdXRzKSArIFsgIi0tbmFtZT0iICsgbmFtZSBdCi0gICAgIGlmIChkZWZpbmVkKGRlc2NyaXB0aW9uKSkgewotICAgICAgIGFyZ3MgKz0gWyAiLS1kZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24gXQotICAgICB9Ci0tLSAKLTIuMjkuMgotCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vcGF0Y2hlcy8wMDAxLXJlYmFzZV9wYXRoLWZvci13cml0ZV9hcmdzLnBhdGNoIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvMDAwMS1yZWJhc2VfcGF0aC1mb3Itd3JpdGVfYXJncy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNTljMC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vcGF0Y2hlcy8wMDAxLXJlYmFzZV9wYXRoLWZvci13cml0ZV9hcmdzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotRnJvbSA2ODc1NDQ5NDk3YmFmMDI2ZmI4MjI4NjY4OTMwYTcxNWZmY2M3MDgyIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogU29ubnkgU2FzYWthIDxzb25ueXNhc2FrYUBjaHJvbWl1bS5vcmc+Ci1EYXRlOiBGcmksIDE5IE1hciAyMDIxIDE2OjU2OjU5IC0wNzAwCi1TdWJqZWN0OiBbUEFUQ0hdIHJlYmFzZV9wYXRoIGZvciB3cml0ZV9hcmdzCi0KLS0tLQotIEJVSUxELmduIHwgNCArKy0tCi0gMSBmaWxlIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKLQotZGlmZiAtLWdpdCBhL2xpYmNocm9tZS9CVUlMRC5nbiBiL2xpYmNocm9tZS9CVUlMRC5nbgotaW5kZXggYTg0NmQ4ZjUyLi42NmFjMTBhNTUgMTAwNjQ0Ci0tLS0gYS9saWJjaHJvbWUvQlVJTEQuZ24KLSsrKyBiL2xpYmNocm9tZS9CVUlMRC5nbgotQEAgLTU1Niw3ICs1NTYsNyBAQCBhY3Rpb24oImJhc2UiKSB7Ci0gCi0gICBzY3JpcHQgPSAiLy9jb21tb24tbWsvd3JpdGVfYXJncy5weSIKLSAgIG91dHB1dHMgPSBbICIke3Jvb3Rfb3V0X2Rpcn0vbGliL2xpYiR7dGFyZ2V0X25hbWV9LnNvIiBdCi0tICBhcmdzID0gWyAiLS1vdXRwdXQiIF0gKyBvdXRwdXRzICsgWyAiLS0iIF0gKyBbCi0rICBhcmdzID0gWyAiLS1vdXRwdXQiIF0gKyByZWJhc2VfcGF0aChvdXRwdXRzKSArIFsgIi0tIiBdICsgWwotICAgICAgICAgICAgIkdST1VQIiwKLSAgICAgICAgICAgICIoIiwKLSAgICAgICAgICAgICJBU19ORUVERUQiLAotQEAgLTYxOCw3ICs2MTgsNyBAQCBhY3Rpb24oImJhc2UtdGVzdCIpIHsKLSAKLSAgIHNjcmlwdCA9ICIvL2NvbW1vbi1tay93cml0ZV9hcmdzLnB5IgotICAgb3V0cHV0cyA9IFsgIiR7cm9vdF9vdXRfZGlyfS9saWIke3RhcmdldF9uYW1lfS5hIiBdCi0tICBhcmdzID0gWyAiLS1vdXRwdXQiIF0gKyBvdXRwdXRzICsgWyAiLS0iIF0gKyBbCi0rICBhcmdzID0gWyAiLS1vdXRwdXQiIF0gKyByZWJhc2VfcGF0aChvdXRwdXRzKSArIFsgIi0tIiBdICsgWwotICAgICAgICAgICAgIkdST1VQIiwKLSAgICAgICAgICAgICIoIiwKLSAgICAgICAgICAgICJBU19ORUVERUQiLAotLS0gCi0yLjIwLjEKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvc2VyaWVzIGIvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3BhdGNoZXMvc2VyaWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI2ZjdiLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2Rwa2cvbGliY2hyb21lL2RlYmlhbi9wYXRjaGVzL3NlcmllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotMDAwMS1jb21tb24tbWstcmViYXNlX3BhdGgtb3V0cHV0LWxvY2F0aW9uLW9mLWdlbmVyYXRlLXBjLnBhdGNoCi0wMDAxLUFkZC1taXNzaW5nLWluY2x1ZGVzLnBhdGNoCi0wMDAxLXJlYmFzZV9wYXRoLWZvci13cml0ZV9hcmdzLnBhdGNoCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vcnVsZXMgYi9idWlsZC9kcGtnL2xpYmNocm9tZS9kZWJpYW4vcnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhYzE3ODMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZGViaWFuL3J1bGVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyEvdXNyL2Jpbi9tYWtlIC1mCi0KLSMgZ24gYXJncwotZGVmaW5lcyA9Ci1kZWZpbmVzICs9IHBrZ19jb25maWc9XCJwa2ctY29uZmlnXCIKLWRlZmluZXMgKz0gbGliYmFzZV92ZXI9XCI3ODA2NTJcIgotZGVmaW5lcyArPSBwbGF0Zm9ybTJfcm9vdD1cIiQoc2hlbGwgcHdkKS9cIgotZGVmaW5lcyArPSBwbGF0Zm9ybV9zdWJkaXI9XCJsaWJjaHJvbWVcIgotZGVmaW5lcyArPSBjeHg9XCJjbGFuZysrXCIKLWRlZmluZXMgKz0gY2M9XCJjbGFuZ1wiCi1kZWZpbmVzICs9IGFyPVwiYXJcIgotZGVmaW5lcyArPSBleHRlcm5hbF9jeHhmbGFncz1bXCItSS91c3Ivc3JjL2dvb2dsZXRlc3QvZ29vZ2xldGVzdC9pbmNsdWRlXCIsIFwiLUkvdXNyL3NyYy9nb29nbGV0ZXN0L2dvb2dsZW1vY2svaW5jbHVkZVwiXQotZGVmaW5lcyArPSBleHRlcm5hbF9sZGZsYWdzPVtcIi1sYXRvbWljXCJdCi1kZWZpbmVzICs9IGVuYWJsZV93ZXJyb3I9ZmFsc2UKLWRlZmluZXMgKz0gbGliZGlyPVwiL3Vzci9saWJcIgotZGVmaW5lcyArPSB1c2U9e21vam89ZmFsc2UgYXNhbj1mYWxzZSBjb3ZlcmFnZT1mYWxzZSBjcnlwdG89dHJ1ZSBkYnVzPXRydWUgZnV6emVyPWZhbHNlIHRpbWVycz10cnVlIGNyb3NfaG9zdD1mYWxzZSBwcm9maWxpbmc9ZmFsc2UgdGNtYWxsb2M9ZmFsc2V9Ci0KLSMgaGFuZGxlIHBhcmFsbGVsIGJ1aWxkIG9wdGlvbnMKLW5qb2JzPTEKLWlmbmVxICgsJChmaWx0ZXIgcGFyYWxsZWw9JSwkKERFQl9CVUlMRF9PUFRJT05TKSkpCi1uam9icz0kKHBhdHN1YnN0IHBhcmFsbGVsPSUsJSwkKGZpbHRlciBwYXJhbGxlbD0lLCQoREVCX0JVSUxEX09QVElPTlMpKSkKLWVuZGlmCi0KLSU6Ci0JZGggJEAgLS1wYXJhbGxlbAotCi1vdmVycmlkZV9kaF9hdXRvX2J1aWxkLWFyY2g6Ci0JZ24gZ2VuIG91dC9SZWxlYXNlIC0tYXJncz0iJChkZWZpbmVzKSIKLQluaW5qYSAtaiQobmpvYnMpIC1DIG91dC9SZWxlYXNlCi0KLW92ZXJyaWRlX2RoX2F1dG9fY2xlYW46Ci0Jcm0gLXJmIG91dAotCWZpbmQgLiAtbmFtZSBcKi5weWMgLWV4ZWNkaXIgcm0gLWYge30gXDsKLQlkaF9hdXRvX2NsZWFuCi0KLW92ZXJyaWRlX2RoX2F1dG9faW5zdGFsbC1hcmNoOgotCWRoX2F1dG9faW5zdGFsbAotCWRlYmlhbi9pbnN0YWxsX2hlYWRlcnMuc2ggZGViaWFuL3RtcApkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9saWJjaHJvbWUvZ2VuLXNyYy1wa2cuc2ggYi9idWlsZC9kcGtnL2xpYmNocm9tZS9nZW4tc3JjLXBrZy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NlZTBlNC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL2xpYmNocm9tZS9nZW4tc3JjLXBrZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIEdlbmVyYXRlcyBEZWJpYW4gc291cmNlIGFuZCBiaW5hcnkgcGFja2FnZXMgb2YgbGliY2hyb21lLgotCi1pZiBbIC16ICIkMSIgXTsgdGhlbgotICAgICAgICBlY2hvICJVc2FnZTogZ2VuLXNyYy1wa2cuc2ggPG91dHB1dC1kaXI+IgotICAgICAgICBleGl0IDEKLWZpCi0KLW91dGRpcj0iJDEiCi1wa2dkaXI9bGliY2hyb21lLTc4MDY1Mgotb3JpZ3Rhcj1saWJjaHJvbWVfNzgwNjUyLm9yaWcudGFyLmd6Ci1zY3JpcHRkaXI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCi1icmFuY2g9cmVsZWFzZS1SOTAtMTM4MTYuQgotCi10bXBkaXI9JChta3RlbXAgLWQpCi1lY2hvIEdlbmVyYXRpbmcgc291cmNlIHBhY2thZ2UgaW4gIiR7dG1wZGlyfSIuCi0KLSMgRG93bmxvYWQgcGxhdGZvcm0yIHNvdXJjZS4KLWNkICIke3RtcGRpcn0iCi1naXQgY2xvbmUgLS1icmFuY2ggIiR7YnJhbmNofSIgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtb3MvcGxhdGZvcm0yIHx8IGV4aXQgMQotbWtkaXIgIiR7cGtnZGlyfSIKLWNkICIke3BrZ2Rpcn0iCi0jIFRyaW0gcGxhdGZvcm0yLCBvbmx5IGNvbW1vbi1tayBpcyBuZWVkZWQuCi1jcCAtYSAuLi9wbGF0Zm9ybTIve2NvbW1vbi1taywuZ259IC4KLQotIyBEb3dubG9hZCBsaWJjaHJvbWUgc291cmNlIGFuZCBhcHBseSBDaHJvbWUgT1MncyBwYXRjaGVzLgotZ2l0IGNsb25lIC0tYnJhbmNoICIke2JyYW5jaH0iIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9hb3NwL3BsYXRmb3JtL2V4dGVybmFsL2xpYmNocm9tZSB8fCBleGl0IDEKLWNkIGxpYmNocm9tZQotcm0gLXJmIC5naXQKLXdoaWxlIHJlYWQgLXIgcGF0Y2g7IGRvCi0gIHBhdGNoIC1wMSA8ICJsaWJjaHJvbWVfdG9vbHMvcGF0Y2hlcy8ke3BhdGNofSIKLWRvbmUgPCA8KGdyZXAgLUUgJ15bXiNdJyAibGliY2hyb21lX3Rvb2xzL3BhdGNoZXMvcGF0Y2hlcyIpCi0KLSMgQ2xlYW4gdXAgdGVtcG9yYXJ5IHBsYXRmb3JtMiBjaGVja291dC4KLWNkIC4uLy4uCi1ybSAtcmYgcGxhdGZvcm0yCi0KLSMgRGViaWFuIHJlcXVpcmVzIGNyZWF0aW5nIC5vcmlnLnRhci5nei4KLXRhciBjemYgIiR7b3JpZ3Rhcn0iICIke3BrZ2Rpcn0iCi0KLSMgRGViaWFuaXplIHRoZSBzb3VyY2UuCi1jZCAiJHtwa2dkaXJ9IgoteWVzIHwgZGVibWFrZSB8fCBleGl0IDEKLWNwIC1hVCAiJHtzY3JpcHRkaXJ9L2RlYmlhbi8iICIke3RtcGRpcn0vJHtwa2dkaXJ9L2RlYmlhbi8iCi0KLSMgQnVpbGQgc291cmNlIHBhY2thZ2UgYW5kIGJpbmFyeSBwYWNrYWdlLgotY2QgIiR7dG1wZGlyfS8ke3BrZ2Rpcn0iCi1kcGtnLWJ1aWxkcGFja2FnZSAtLW5vLXNpZ24gfHwgZXhpdCAxCi0KLSMgQ29weSB0aGUgcmVzdWx0cyB0byBvdXRwdXQgZGlyLgotY2QgIiR7dG1wZGlyfSIKLW1rZGlyIC1wICIke291dGRpcn0vc3JjIgotY3AgKi5kc2MgKi5vcmlnLnRhci5neiAqLmRlYmlhbi50YXIueHogIiR7b3V0ZGlyfS9zcmMiCi1jcCAqLmRlYiAiJHtvdXRkaXJ9IgotY2QgLwotCi1lY2hvIFJlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkgIiR7dG1wZGlyfSIuCi1ybSAtcmYgIiR7dG1wZGlyfSIKLQotZWNobyBEb25lLiBDaGVjayBvdXQgRGViaWFuIHNvdXJjZSBwYWNrYWdlIGluICIke291dGRpcn0iLgpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vUkVBRE1FLkRlYmlhbiBiL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL1JFQURNRS5EZWJpYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjk5YmQuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vUkVBRE1FLkRlYmlhbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW1vZHAtYjY0IGZvciBEZWJpYW4KZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL2NoYW5nZWxvZyBiL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL2NoYW5nZWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0YzhlZi4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9jaGFuZ2Vsb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLW1vZHAtYjY0ICgwLjAuMS0xKSBidXN0ZXI7IHVyZ2VuY3k9bG93Ci0KLSAgKiBJbml0aWFsIHJlbGVhc2UuCi0KLSAtLSBTb25ueSBTYXNha2EgPHNvbm55c2FzYWthQGNocm9taXVtLm9yZz4gIEZyaSwgMTkgTWFyIDIwMjEgMTk6NDE6NDAgKzAwMDAKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL2NvbXBhdCBiL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL2NvbXBhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5OWUyOC4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9jb21wYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0xMApkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vY29udHJvbCBiL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL2NvbnRyb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWYwZDkuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vY29udHJvbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLVNvdXJjZTogbW9kcC1iNjQKLVNlY3Rpb246IGxpYnMKLVByaW9yaXR5OiBvcHRpb25hbAotTWFpbnRhaW5lcjogU29ubnkgU2FzYWthIDxzb25ueXNhc2FrYUBjaHJvbWl1bS5vcmc+Ci1TdGFuZGFyZHMtVmVyc2lvbjogNC4xLjQKLUhvbWVwYWdlOiBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vYW9zcC9wbGF0Zm9ybS9leHRlcm5hbC9tb2RwX2I2NC8KLUJ1aWxkLURlcGVuZHM6Ci0gZGViaGVscGVyICg+PTExfiksCi0gY2xhbmcsCi0gcHl0aG9uMywKLSBwa2ctY29uZmlnLAotIG5pbmphLWJ1aWxkLAotCi1QYWNrYWdlOiBtb2RwLWI2NAotQXJjaGl0ZWN0dXJlOiBhbnkKLU11bHRpLUFyY2g6IGZvcmVpZ24KLURlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30KLURlc2NyaXB0aW9uOiBtb2RwIGJhc2U2NCBkZWNvZGVyCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9tb2RwLWI2NC5pbnN0YWxsIGIvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vbW9kcC1iNjQuaW5zdGFsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMjgwMi4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9tb2RwLWI2NC5pbnN0YWxsCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1tb2RwX2I2NC9tb2RwX2I2NCAvdXNyL2luY2x1ZGUKLW91dC9SZWxlYXNlL2xpYm1vZHBfYjY0LmEgL3Vzci9saWIKLW91dC9SZWxlYXNlL29iai9tb2RwX2I2NC9saWJtb2RwX2I2NC5wYyAvdXNyL2xpYi9wa2djb25maWcKZGlmZiAtLWdpdCBhL2J1aWxkL2Rwa2cvbW9kcF9iNjQvZGViaWFuL3BhdGNoZXMvMDAwMS1jb21tb24tbWstcmViYXNlX3BhdGgtb3V0cHV0LWxvY2F0aW9uLW9mLWdlbmVyYXRlLXBjLnBhdGNoIGIvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vcGF0Y2hlcy8wMDAxLWNvbW1vbi1tay1yZWJhc2VfcGF0aC1vdXRwdXQtbG9jYXRpb24tb2YtZ2VuZXJhdGUtcGMucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOGVmY2MuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vcGF0Y2hlcy8wMDAxLWNvbW1vbi1tay1yZWJhc2VfcGF0aC1vdXRwdXQtbG9jYXRpb24tb2YtZ2VuZXJhdGUtcGMucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1Gcm9tIDA0ZmE1ZTFhZGUwODY5NmI1YTJjYzNiNjViZjBmZDI2YzQzMjUxYzcgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCi1Gcm9tOiBTb25ueSBTYXNha2EgPHNvbm55c2FzYWthQGNocm9taXVtLm9yZz4KLURhdGU6IEZyaSwgMTkgTWFyIDIwMjEgMTE6MTc6NDMgLTA3MDAKLVN1YmplY3Q6IFtQQVRDSF0gY29tbW9uLW1rOiByZWJhc2VfcGF0aCBvdXRwdXQgbG9jYXRpb24gb2YgZ2VuZXJhdGUtcGMucHkKLQotV2l0aG91dCByZWJhc2VfcGF0aCwgdGhlIGdlbmVyYXRlLXBjLnB5IHdvdWxkIGJlIGNhbGxlZCBsaWtlCi1gZ2VuZXJhdGUtcGMucHkgLS1vdXRwdXQgLy9vdXQvUmVsZWFzZWAgaWYgdGhlIG91dHB1dCBpcyBpbnNpZGUgdGhlCi1zb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGlzIGduIHBhdGggaXNuJ3QgcmVjb2duaXplZCBhcyBhIGdlbmVyaWMKLWZpbGVzeXN0ZW0gcGF0aC4KLQotQlVHPWI6MTgzMjE2MjE2Ci1URVNUPXdpdGggbW9kcF9iNjQsIGNhbGwKLSQgZ24gZ2VuIG91dC9SZWxlYXNlIC0tYXJncz0uLi4KLSQgbmluamEKLQotQ2hhbmdlLUlkOiBJYzlkOWIzZDAxZDUyZDQ4M2UzZDgxY2EyZThkNTE0YjQ3OTAwZjViYgotLS0tCi0gY29tbW9uLW1rL3BrZ19jb25maWcuZ25pIHwgMiArLQotIDEgZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQotCi1kaWZmIC0tZ2l0IGEvY29tbW9uLW1rL3BrZ19jb25maWcuZ25pIGIvY29tbW9uLW1rL3BrZ19jb25maWcuZ25pCi1pbmRleCAyNGUyY2YxNDAxLi5iMmM1ODg0NWQ0IDEwMDY0NAotLS0tIGEvY29tbW9uLW1rL3BrZ19jb25maWcuZ25pCi0rKysgYi9jb21tb24tbWsvcGtnX2NvbmZpZy5nbmkKLUBAIC04NCw3ICs4NCw3IEBAIHRlbXBsYXRlKCJnZW5lcmF0ZV9wa2dfY29uZmlnIikgewotICAgICBvdXRwdXRzID0gWyAiJHt0YXJnZXRfb3V0X2Rpcn0vJHtvdXRwdXRfbmFtZX0ucGMiIF0KLSAKLSAgICAgc2NyaXB0ID0gIi8vY29tbW9uLW1rL2dlbmVyYXRlLXBjLnB5IgotLSAgICBhcmdzID0gWyAiLS1vdXRwdXQiIF0gKyBvdXRwdXRzICsgWyAiLS1uYW1lPSIgKyBuYW1lIF0KLSsgICAgYXJncyA9IFsgIi0tb3V0cHV0IiBdICsgcmViYXNlX3BhdGgob3V0cHV0cykgKyBbICItLW5hbWU9IiArIG5hbWUgXQotICAgICBpZiAoZGVmaW5lZChkZXNjcmlwdGlvbikpIHsKLSAgICAgICBhcmdzICs9IFsgIi0tZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uIF0KLSAgICAgfQotLS0gCi0yLjI5LjIKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vcGF0Y2hlcy9zZXJpZXMgYi9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9wYXRjaGVzL3NlcmllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwODZmYy4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9wYXRjaGVzL3NlcmllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTAwMDEtY29tbW9uLW1rLXJlYmFzZV9wYXRoLW91dHB1dC1sb2NhdGlvbi1vZi1nZW5lcmF0ZS1wYy5wYXRjaApkaWZmIC0tZ2l0IGEvYnVpbGQvZHBrZy9tb2RwX2I2NC9kZWJpYW4vcnVsZXMgYi9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9ydWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJiOTNhZS4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL21vZHBfYjY0L2RlYmlhbi9ydWxlcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMhL3Vzci9iaW4vbWFrZSAtZgotCi0jIGduIGFyZ3MKLWRlZmluZXMgPQotZGVmaW5lcyArPSBwa2dfY29uZmlnPVwicGtnLWNvbmZpZ1wiCi1kZWZpbmVzICs9IHBsYXRmb3JtMl9yb290PVwiJChzaGVsbCBwd2QpL1wiCi1kZWZpbmVzICs9IHBsYXRmb3JtX3N1YmRpcj1cIm1vZHBfYjY0XCIKLWRlZmluZXMgKz0gY3h4PVwiY2xhbmcrK1wiCi1kZWZpbmVzICs9IGNjPVwiY2xhbmdcIgotZGVmaW5lcyArPSBhcj1cImFyXCIKLWRlZmluZXMgKz0gZW5hYmxlX3dlcnJvcj1mYWxzZQotZGVmaW5lcyArPSBsaWJkaXI9XCIvdXNyL2xpYlwiCi1kZWZpbmVzICs9IHVzZT17bW9qbz1mYWxzZSBhc2FuPWZhbHNlIGNvdmVyYWdlPWZhbHNlIGNyeXB0bz10cnVlIGRidXM9dHJ1ZSBmdXp6ZXI9ZmFsc2UgdGltZXJzPXRydWUgY3Jvc19ob3N0PWZhbHNlIHByb2ZpbGluZz1mYWxzZSB0Y21hbGxvYz1mYWxzZX0KLQotIyBoYW5kbGUgcGFyYWxsZWwgYnVpbGQgb3B0aW9ucwotbmpvYnM9MQotaWZuZXEgKCwkKGZpbHRlciBwYXJhbGxlbD0lLCQoREVCX0JVSUxEX09QVElPTlMpKSkKLW5qb2JzPSQocGF0c3Vic3QgcGFyYWxsZWw9JSwlLCQoZmlsdGVyIHBhcmFsbGVsPSUsJChERUJfQlVJTERfT1BUSU9OUykpKQotZW5kaWYKLQotJToKLQlkaCAkQAotCi1vdmVycmlkZV9kaF9hdXRvX2J1aWxkLWFyY2g6Ci0JZ24gZ2VuIG91dC9SZWxlYXNlIC0tYXJncz0iJChkZWZpbmVzKSIKLQluaW5qYSAtaiQobmpvYnMpIC1DIG91dC9SZWxlYXNlCi0KLW92ZXJyaWRlX2RoX2F1dG9fY2xlYW46Ci0Jcm0gLXJmIG91dAotCWZpbmQgLiAtbmFtZSBcKi5weWMgLWV4ZWNkaXIgcm0gLWYge30gXDsKLQlkaF9hdXRvX2NsZWFuCmRpZmYgLS1naXQgYS9idWlsZC9kcGtnL21vZHBfYjY0L2dlbi1zcmMtcGtnLnNoIGIvYnVpbGQvZHBrZy9tb2RwX2I2NC9nZW4tc3JjLXBrZy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2MyMmY2Ny4uMDAwMDAwMAotLS0gYS9idWlsZC9kcGtnL21vZHBfYjY0L2dlbi1zcmMtcGtnLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgR2VuZXJhdGVzIERlYmlhbiBzb3VyY2UgYW5kIGJpbmFyeSBwYWNrYWdlcyBvZiBtb2RwX2I2NC4KLQotaWYgWyAteiAiJDEiIF07IHRoZW4KLSAgICAgICAgZWNobyAiVXNhZ2U6IGdlbi1zcmMtcGtnLnNoIDxvdXRwdXQtZGlyPiIKLSAgICAgICAgZXhpdCAxCi1maQotCi1vdXRkaXI9IiQxIgotcGtnZGlyPW1vZHAtYjY0LTAuMC4xCi1vcmlndGFyPW1vZHAtYjY0XzAuMC4xLm9yaWcudGFyLmd6Ci1zY3JpcHRkaXI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCi1icmFuY2g9cmVsZWFzZS1SOTAtMTM4MTYuQgotCi10bXBkaXI9JChta3RlbXAgLWQpCi1lY2hvIEdlbmVyYXRpbmcgc291cmNlIHBhY2thZ2UgaW4gIiR7dG1wZGlyfSIuCi0KLSMgRG93bmxvYWQgcGxhdGZvcm0yIHNvdXJjZS4KLWNkICIke3RtcGRpcn0iCi1naXQgY2xvbmUgLS1icmFuY2ggIiR7YnJhbmNofSIgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtb3MvcGxhdGZvcm0yIHx8IGV4aXQgMQotbWtkaXIgIiR7cGtnZGlyfSIKLWNkICIke3BrZ2Rpcn0iCi0jIFRyaW0gcGxhdGZvcm0yLCBvbmx5IGNvbW1vbi1tayBpcyBuZWVkZWQuCi1jcCAtYSAuLi9wbGF0Zm9ybTIve2NvbW1vbi1taywuZ259IC4KLQotIyBEb3dubG9hZCBtb2RwX2I2NCBzb3VyY2UuCi1naXQgY2xvbmUgLS1icmFuY2ggIiR7YnJhbmNofSIgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Fvc3AvcGxhdGZvcm0vZXh0ZXJuYWwvbW9kcF9iNjQgfHwgZXhpdCAxCi1jZCBtb2RwX2I2NAotcm0gLXJmIC5naXQKLQotIyBDbGVhbiB1cCB0ZW1wb3JhcnkgcGxhdGZvcm0yIGNoZWNrb3V0LgotY2QgLi4vLi4KLXJtIC1yZiBwbGF0Zm9ybTIKLQotIyBEZWJpYW4gcmVxdWlyZXMgY3JlYXRpbmcgLm9yaWcudGFyLmd6LgotdGFyIGN6ZiAiJHtvcmlndGFyfSIgIiR7cGtnZGlyfSIKLQotIyBEZWJpYW5pemUgdGhlIHNvdXJjZS4KLWNkICIke3BrZ2Rpcn0iCi15ZXMgfCBkZWJtYWtlIHx8IGV4aXQgMQotY3AgLWFUICIke3NjcmlwdGRpcn0vZGViaWFuLyIgIiR7dG1wZGlyfS8ke3BrZ2Rpcn0vZGViaWFuLyIKLQotIyBCdWlsZCBzb3VyY2UgcGFja2FnZSBhbmQgYmluYXJ5IHBhY2thZ2UuCi1jZCAiJHt0bXBkaXJ9LyR7cGtnZGlyfSIKLWRwa2ctYnVpbGRwYWNrYWdlIC0tbm8tc2lnbiB8fCBleGl0IDEKLQotIyBDb3B5IHRoZSByZXN1bHRzIHRvIG91dHB1dCBkaXIuCi1jZCAiJHt0bXBkaXJ9IgotbWtkaXIgLXAgIiR7b3V0ZGlyfS9zcmMiCi1jcCAqLmRzYyAqLm9yaWcudGFyLmd6ICouZGViaWFuLnRhci54eiAiJHtvdXRkaXJ9L3NyYyIKLWNwICouZGViICIke291dGRpcn0iCi1jZCAvCi0KLWVjaG8gUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeSAiJHt0bXBkaXJ9Ii4KLXJtIC1yZiAiJHt0bXBkaXJ9IgotCi1lY2hvIERvbmUuIENoZWNrIG91dCBEZWJpYW4gc291cmNlIHBhY2thZ2UgaW4gIiR7b3V0ZGlyfSIuCmRpZmYgLS1naXQgYS9idWlsZC9mbHVvcmlkZS5nbyBiL2J1aWxkL2ZsdW9yaWRlLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNlNzFiLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2ZsdW9yaWRlLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotcGFja2FnZSBmbHVvcmlkZQotCi1pbXBvcnQgKAotCSJzdHJpbmdzIgotCi0JImFuZHJvaWQvc29vbmcvYW5kcm9pZCIKLQkiYW5kcm9pZC9zb29uZy9jYyIKLSkKLQotZnVuYyBpbml0KCkgewotCWFuZHJvaWQuUmVnaXN0ZXJNb2R1bGVUeXBlKCJmbHVvcmlkZV9kZWZhdWx0cyIsIGZsdW9yaWRlRGVmYXVsdHNGYWN0b3J5KQotfQotCi1mdW5jIGZsdW9yaWRlRGVmYXVsdHNGYWN0b3J5KCkgYW5kcm9pZC5Nb2R1bGUgewotCW1vZHVsZSA6PSBjYy5EZWZhdWx0c0ZhY3RvcnkoKQotCWFuZHJvaWQuQWRkTG9hZEhvb2sobW9kdWxlLCBmbHVvcmlkZURlZmF1bHRzKQotCi0JcmV0dXJuIG1vZHVsZQotfQotCi1mdW5jIGZsdW9yaWRlRGVmYXVsdHMoY3R4IGFuZHJvaWQuTG9hZEhvb2tDb250ZXh0KSB7Ci0JdHlwZSBwcm9wcyBzdHJ1Y3QgewotCQlJbmNsdWRlX2RpcnMgW11zdHJpbmcKLQkJQ2ZsYWdzICAgICAgIFtdc3RyaW5nCi0JfQotCi0JcCA6PSAmcHJvcHN7fQotCXAuQ2ZsYWdzLCBwLkluY2x1ZGVfZGlycyA9IGdsb2JhbERlZmF1bHRzKGN0eCkKLQotCWN0eC5BcHBlbmRQcm9wZXJ0aWVzKHApCi19Ci0KLWZ1bmMgZ2xvYmFsRGVmYXVsdHMoY3R4IGFuZHJvaWQuTG9hZEhvb2tDb250ZXh0KSAoW11zdHJpbmcsIFtdc3RyaW5nKSB7Ci0JdmFyIGNmbGFncyBbXXN0cmluZwotCXZhciBpbmNsdWRlRGlycyBbXXN0cmluZwotCi0JYm9hcmRfYnRfYnVpbGRjZmdfaW5jbHVkZV9kaXIgOj0gY3R4LkRldmljZUNvbmZpZygpLkJ0Q29uZmlnSW5jbHVkZURpcigpCi0JaWYgbGVuKGJvYXJkX2J0X2J1aWxkY2ZnX2luY2x1ZGVfZGlyKSA+IDAgewotCQljZmxhZ3MgPSBhcHBlbmQoY2ZsYWdzLCAiLURIQVNfQkRST0lEX0JVSUxEQ0ZHIikKLQkJYm9hcmRfYnRfYnVpbGRjZmdfaW5jbHVkZV9kaXJfbGlzdCA6PQotCQkJc3RyaW5ncy5GaWVsZHMoYm9hcmRfYnRfYnVpbGRjZmdfaW5jbHVkZV9kaXIpCi0JCWZvciBfLCBidWlsZGNmZ19kaXIgOj0gcmFuZ2UgYm9hcmRfYnRfYnVpbGRjZmdfaW5jbHVkZV9kaXJfbGlzdCB7Ci0JCQlpbmNsdWRlRGlycyA9IGFwcGVuZChpbmNsdWRlRGlycywgYnVpbGRjZmdfZGlyKQotCQl9Ci0JfSBlbHNlIHsKLQkJY2ZsYWdzID0gYXBwZW5kKGNmbGFncywgIi1ESEFTX05PX0JEUk9JRF9CVUlMRENGRyIpCi0JfQotCi0JcmV0dXJuIGNmbGFncywgaW5jbHVkZURpcnMKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS9hYWMvQlVJTEQuZ24gYi9idWlsZC9zZWNvbmRhcnkvdGhpcmRfcGFydHkvYWFjL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGZjZjkzLi4wMDAwMDAwCi0tLSBhL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS9hYWMvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWNvbmZpZygibGliRnJhdW5ob2ZlckFBQ19jb25maWciKSB7Ci0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAibGliQUFDZGVjL2luY2x1ZGUiLAotICAgICJsaWJBQUNlbmMvaW5jbHVkZSIsCi0gICAgImxpYkFyaXRoQ29kaW5nL2luY2x1ZGUiLAotICAgICJsaWJEUkNkZWMvaW5jbHVkZSIsCi0gICAgImxpYlBDTXV0aWxzL2luY2x1ZGUiLAotICAgICJsaWJGREsvaW5jbHVkZSIsCi0gICAgImxpYlNZUy9pbmNsdWRlIiwKLSAgICAibGliTXBlZ1RQRGVjL2luY2x1ZGUiLAotICAgICJsaWJNcGVnVFBFbmMvaW5jbHVkZSIsCi0gICAgImxpYlNBQ2VuYy9pbmNsdWRlIiwKLSAgICAibGliU0FDZGVjL2luY2x1ZGUiLAotICAgICJsaWJTQlJkZWMvaW5jbHVkZSIsCi0gICAgImxpYlNCUmVuYy9pbmNsdWRlIiwKLSAgXQotfQotCi0jVE9ETyhqcGF3bG93c2tpKTogdGhpcyBmaWxlcyBhcmUgbm90IGJ1aWxkIHJpZ2h0IG5vdywgYnV0IG1pZ2h0IGJlIHVzZWZ1bCB3aGVuCi0jIGFybSBwbGF0Zm9ybSBsaW51eCBjb21waWxhdGlvbiBpcyBpbiB1c2U6Ci0jICAgICJsaWJBQUNkZWMvc3JjL2FybS9ibG9ja19hcm0uY3BwIiwKLSMgICAgImxpYkZESy9zcmMvYXJtL2RjdF9hcm0uY3BwIiwKLSMgICAgImxpYkZESy9zcmMvYXJtL2ZmdF9yYWQyX2FybS5jcHAiLAotIyAgICAibGliRkRLL3NyYy9hcm0vc2NhbGVfYXJtLmNwcCIsCi0jICAgICJsaWJTQlJkZWMvc3JjL2FybS9scHBfdHJhbl9hcm0uY3BwIiwKLSMgICAgImxpYkZESy9zcmMvbWlwcy9mZnRfcmFkMl9taXBzLmNwcCIsCi0jICAgICJsaWJGREsvc3JjL21pcHMvbWlwc19mZnRfdHdpZGRsZXMuY3BwIiwKLSMgICAgImxpYkZESy9zcmMvbWlwcy9zY2FsZV9taXBzLmNwcCIsCi0KLXN0YXRpY19saWJyYXJ5KCJsaWJGcmF1bmhvZmVyQUFDIikgewotICBzb3VyY2VzID0gWwotICAgICJsaWJBQUNkZWMvc3JjL2FhY2RlY19kcmMuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL2FhY2RlY19oY3IuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmNwcCIsCi0gICAgImxpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL2FhY19yb20uY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9ibG9jay5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL2NoYW5uZWwuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL2NvbmNlYWwuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9GREtfZGVsYXkuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy9sZGZpbHRiYW5rLmNwcCIsCi0gICAgImxpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmNwcCIsCi0gICAgImxpYkFBQ2RlYy9zcmMvcnZsY2JpdC5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmNwcCIsCi0gICAgImxpYkFBQ2RlYy9zcmMvcnZsYy5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL3N0ZXJlby5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2Q0dDY0LmNwcCIsCi0gICAgImxpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VscC5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2x0cC5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL3VzYWNkZWNfZmFjLmNwcCIsCi0gICAgImxpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuY3BwIiwKLSAgICAibGliQUFDZGVjL3NyYy91c2FjZGVjX2xwZC5jcHAiLAotICAgICJsaWJBQUNkZWMvc3JjL3VzYWNkZWNfcm9tLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvYWFjZW5jLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvYWFjZW5jX2xpYi5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL2FhY2VuY190bnMuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9iaXRfY250LmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvYml0ZW5jLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9keW5fYml0cy5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL2dycF9kYXRhLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvbGluZV9wZS5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL21ldGFkYXRhX2NvbXByZXNzb3IuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvbXBzX21haW4uY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9tc19zdGVyZW8uY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9ub2lzZWRldC5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvcHN5X21haW4uY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9xY19tYWluLmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwIiwKLSAgICAibGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL3NwcmVhZGluZy5jcHAiLAotICAgICJsaWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcCIsCi0gICAgImxpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmNwcCIsCi0gICAgImxpYkFyaXRoQ29kaW5nL3NyYy9hY19hcml0aF9jb2Rlci5jcHAiLAotICAgICJsaWJEUkNkZWMvc3JjL2RyY0RlY19nYWluRGVjb2Rlci5jcHAiLAotICAgICJsaWJEUkNkZWMvc3JjL2RyY0RlY19yZWFkZXIuY3BwIiwKLSAgICAibGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmNwcCIsCi0gICAgImxpYkRSQ2RlYy9zcmMvZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuY3BwIiwKLSAgICAibGliRFJDZGVjL3NyYy9kcmNEZWNfdG9vbHMuY3BwIiwKLSAgICAibGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX2luaXQuY3BwIiwKLSAgICAibGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3ByZXByb2Nlc3MuY3BwIiwKLSAgICAibGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3Byb2Nlc3MuY3BwIiwKLSAgICAibGliRFJDZGVjL3NyYy9GREtfZHJjRGVjTGliLmNwcCIsCi0gICAgImxpYkZESy9zcmMvYXV0b2NvcnIybmQuY3BwIiwKLSAgICAibGliRkRLL3NyYy9kY3QuY3BwIiwKLSAgICAibGliRkRLL3NyYy9GREtfYml0YnVmZmVyLmNwcCIsCi0gICAgImxpYkZESy9zcmMvRkRLX2NvcmUuY3BwIiwKLSAgICAibGliRkRLL3NyYy9GREtfY3JjLmNwcCIsCi0gICAgImxpYkZESy9zcmMvRkRLX2RlY29ycmVsYXRlLmNwcCIsCi0gICAgImxpYkZESy9zcmMvRkRLX2h5YnJpZC5jcHAiLAotICAgICJsaWJGREsvc3JjL0ZES19scGMuY3BwIiwKLSAgICAibGliRkRLL3NyYy9GREtfbWF0cml4Q2FsbG9jLmNwcCIsCi0gICAgImxpYkZESy9zcmMvRkRLX3FtZl9kb21haW4uY3BwIiwKLSAgICAibGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcCIsCi0gICAgImxpYkZESy9zcmMvRkRLX3RyaWdGY3RzLmNwcCIsCi0gICAgImxpYkZESy9zcmMvZmZ0LmNwcCIsCi0gICAgImxpYkZESy9zcmMvZmZ0X3JhZDIuY3BwIiwKLSAgICAibGliRkRLL3NyYy9maXhwb2ludF9tYXRoLmNwcCIsCi0gICAgImxpYkZESy9zcmMvaHVmZl9ub2Rlcy5jcHAiLAotICAgICJsaWJGREsvc3JjL21kY3QuY3BwIiwKLSAgICAibGliRkRLL3NyYy9ubGNfZGVjLmNwcCIsCi0gICAgImxpYkZESy9zcmMvcW1mLmNwcCIsCi0gICAgImxpYkZESy9zcmMvc2NhbGUuY3BwIiwKLSAgICAibGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmNwcCIsCi0gICAgImxpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5jcHAiLAotICAgICJsaWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAiLAotICAgICJsaWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5jcHAiLAotICAgICJsaWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uY3BwIiwKLSAgICAibGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwIiwKLSAgICAibGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmNwcCIsCi0gICAgImxpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5jcHAiLAotICAgICJsaWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5jcHAiLAotICAgICJsaWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uY3BwIiwKLSAgICAibGliTXBlZ1RQRW5jL3NyYy90cGVuY19saWIuY3BwIiwKLSAgICAibGliUENNdXRpbHMvc3JjL2xpbWl0ZXIuY3BwIiwKLSAgICAibGliUENNdXRpbHMvc3JjL3BjbWRteF9saWIuY3BwIiwKLSAgICAibGliUENNdXRpbHMvc3JjL3BjbV91dGlscy5jcHAiLAotICAgICJsaWJTQUNkZWMvc3JjL3NhY19iaXRkZWMuY3BwIiwKLSAgICAibGliU0FDZGVjL3NyYy9zYWNfY2FsY00xYW5kTTIuY3BwIiwKLSAgICAibGliU0FDZGVjL3NyYy9zYWNfZGVjX2NvbmNlYWwuY3BwIiwKLSAgICAibGliU0FDZGVjL3NyYy9zYWNfZGVjLmNwcCIsCi0gICAgImxpYlNBQ2RlYy9zcmMvc2FjX2RlY19saWIuY3BwIiwKLSAgICAibGliU0FDZGVjL3NyYy9zYWNfcHJvY2Vzcy5jcHAiLAotICAgICJsaWJTQUNkZWMvc3JjL3NhY19xbWYuY3BwIiwKLSAgICAibGliU0FDZGVjL3NyYy9zYWNfcmVzaGFwZUJCRW52LmNwcCIsCi0gICAgImxpYlNBQ2RlYy9zcmMvc2FjX3JvbS5jcHAiLAotICAgICJsaWJTQUNkZWMvc3JjL3NhY19zbW9vdGhpbmcuY3BwIiwKLSAgICAibGliU0FDZGVjL3NyYy9zYWNfc3RwLmNwcCIsCi0gICAgImxpYlNBQ2RlYy9zcmMvc2FjX3RzZC5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uY3BwIiwKLSAgICAibGliU0FDZW5jL3NyYy9zYWNlbmNfZGVsYXkuY3BwIiwKLSAgICAibGliU0FDZW5jL3NyYy9zYWNlbmNfZG14X3Rkb21fZW5oLmNwcCIsCi0gICAgImxpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZpbHRlci5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY19mcmFtZXdpbmRvd2luZy5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY19odWZmX3RhYi5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY19saWIuY3BwIiwKLSAgICAibGliU0FDZW5jL3NyYy9zYWNlbmNfbmxjX2VuYy5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY19vbnNldGRldGVjdC5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY19wYXJhbWV4dHJhY3QuY3BwIiwKLSAgICAibGliU0FDZW5jL3NyYy9zYWNlbmNfc3RhdGljZ2Fpbi5jcHAiLAotICAgICJsaWJTQUNlbmMvc3JjL3NhY2VuY190cmVlLmNwcCIsCi0gICAgImxpYlNBQ2VuYy9zcmMvc2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvZW52X2RlYy5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvaGJlLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvSEZnZW5fcHJlRmxhdC5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwIiwKLSAgICAibGliU0JSZGVjL3NyYy9wc2JpdGRlYy5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL3BzZGVjLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvcHNkZWNyb21fZHJtLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvcHZjX2RlYy5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL3Nicl9jcmMuY3BwIiwKLSAgICAibGliU0JSZGVjL3NyYy9zYnJfZGViLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL3NicmRlY19kcmMuY3BwIiwKLSAgICAibGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuY3BwIiwKLSAgICAibGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcCIsCi0gICAgImxpYlNCUmRlYy9zcmMvc2JyX3JhbS5jcHAiLAotICAgICJsaWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9iaXRfc2JyLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvY29kZV9lbnYuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9lbnZfYml0LmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvZW52X2VzdC5jcHAiLAotICAgICJsaWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvaW52Zl9lc3QuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9taF9kZXQuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9uZl9lc3QuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9wc19iaXRlbmMuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9wc19lbmNvZGUuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9wc19tYWluLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy9zYnJlbmNfcmFtLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvc2JyZW5jX3JvbS5jcHAiLAotICAgICJsaWJTQlJlbmMvc3JjL3Nicl9taXNjLmNwcCIsCi0gICAgImxpYlNCUmVuYy9zcmMvdG9uX2NvcnIuY3BwIiwKLSAgICAibGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAiLAotICAgICJsaWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcCIsCi0gICAgImxpYlNZUy9zcmMvc3lzbGliX2NoYW5uZWxNYXBEZXNjci5jcHAiLAotICBdCi0KLSAgcHVibGljX2NvbmZpZ3MgPSBbICI6bGliRnJhdW5ob2ZlckFBQ19jb25maWciIF0KLQotICBjZmxhZ3MgPSBbCi0gICAgICAgICItV25vLXNlcXVlbmNlLXBvaW50IiwKLSAgICAgICAgIi1Xbm8tZXh0cmEiLAotICAgICAgICAiLVduby0jd2FybmluZ3MiLAotICAgICAgICAiLVduby1jb25zdGFudC1sb2dpY2FsLW9wZXJhbmQiLAotICAgICAgICAiLVduby1zZWxmLWFzc2lnbiIsCi0gIF0KLX0KZGlmZiAtLWdpdCBhL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L0JVSUxELmduIGIvYnVpbGQvc2Vjb25kYXJ5L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YzUzZDcuLjAwMDAwMDAKLS0tIGEvYnVpbGQvc2Vjb25kYXJ5L3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotY29uZmlnKCJndGVzdF9jb25maWciKSB7Ci0gICMgR3Rlc3QgaGVhZGVycyBuZWVkIHRvIGJlIGFibGUgdG8gZmluZCB0aGVtc2VsdmVzLgotICBpbmNsdWRlX2RpcnMgPSBbICJnb29nbGV0ZXN0L2luY2x1ZGUiIF0KLQotICBkZWZpbmVzID0gWyAiR1RFU1RfSEFTX1JUVEk9MCIgXQotfQotCi1jb25maWcoImd0ZXN0X2RpcmVjdF9jb25maWciKSB7Ci0gIHZpc2liaWxpdHkgPSBbICI6KiIgXQotICBkZWZpbmVzID0gWyAiVU5JVF9URVNUIiBdCi19Ci0KLXN0YXRpY19saWJyYXJ5KCJndGVzdCIpIHsKLSAgdGVzdG9ubHkgPSB0cnVlCi0gIHNvdXJjZXMgPSBbCi0gICAgImdvb2dsZXRlc3Qvc3JjL2d0ZXN0LWFsbC5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgImdvb2dsZXRlc3QvIiwKLSAgICAiZ29vZ2xldGVzdC9pbmNsdWRlIiwKLSAgXQotCi0gIGFsbF9kZXBlbmRlbnRfY29uZmlncyA9IFsgIjpndGVzdF9jb25maWciIF0KLSAgcHVibGljX2NvbmZpZ3MgPSBbICI6Z3Rlc3RfZGlyZWN0X2NvbmZpZyIgXQotfQotCi1zb3VyY2Vfc2V0KCJndGVzdF9tYWluIikgewotICB0ZXN0b25seSA9IHRydWUKLSAgc291cmNlcyA9IFsKLSAgICAiZ29vZ2xldGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYyIsCi0gIF0KLSAgZGVwcyA9IFsKLSAgICAiOmd0ZXN0IiwKLSAgXQotfQotCi1jb25maWcoImdtb2NrX2NvbmZpZyIpIHsKLSAgIyBHbW9jayBoZWFkZXJzIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZW1zZWx2ZXMuCi0gIGluY2x1ZGVfZGlycyA9IFsgImdvb2dsZW1vY2svaW5jbHVkZSIgXQotfQotCi1zdGF0aWNfbGlicmFyeSgiZ21vY2siKSB7Ci0gIHRlc3Rvbmx5ID0gdHJ1ZQotICBzb3VyY2VzID0gWwotICAgICJnb29nbGVtb2NrL3NyYy9nbW9jay1hbGwuY2MiLAotICBdCi0KLSAgIyBUaGlzIHByb2plY3QgaW5jbHVkZXMgc29tZSBzdHVmZiBmb3JtIGd0ZXN0J3MgZ3V0cy4KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICJnb29nbGVtb2NrIiwKLSAgICAiZ29vZ2xlbW9jay9pbmNsdWRlIiwKLSAgXQotCi0gIHB1YmxpY19jb25maWdzID0gWwotICAgICI6Z21vY2tfY29uZmlnIiwKLSAgICAiOmd0ZXN0X2NvbmZpZyIsCi0gIF0KLX0KLQotc3RhdGljX2xpYnJhcnkoImdtb2NrX21haW4iKSB7Ci0gIHRlc3Rvbmx5ID0gdHJ1ZQotICBzb3VyY2VzID0gWwotICAgICJnb29nbGVtb2NrL3NyYy9nbW9ja19tYWluLmNjIiwKLSAgXQotICBkZXBzID0gWwotICAgICI6Z21vY2siLAotICAgICI6Z3Rlc3QiLAotICBdCi0KLSAgcHVibGljX2NvbmZpZ3MgPSBbCi0gICAgIjpnbW9ja19jb25maWciLAotICAgICI6Z3Rlc3RfY29uZmlnIiwKLSAgXQotfQpkaWZmIC0tZ2l0IGEvYnVpbGQvc2Vjb25kYXJ5L3RoaXJkX3BhcnR5L2xpYmNocm9tZS9CVUlMRC5nbiBiL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS9saWJjaHJvbWUvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGQyZjAuLjAwMDAwMDAKLS0tIGEvYnVpbGQvc2Vjb25kYXJ5L3RoaXJkX3BhcnR5L2xpYmNocm9tZS9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc291cmNlX3NldCgiYmFzZV9zb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJiYXNlL2F0X2V4aXQuY2MiLAotICAgICJiYXNlL2F0b21pY19yZWZfY291bnQuaCIsCi0gICAgImJhc2UvYXRvbWljX3NlcXVlbmNlX251bS5oIiwKLSAgICAiYmFzZS9hdG9taWNvcHMuaCIsCi0gICAgImJhc2UvYmFzZTY0LmNjIiwKLSAgICAiYmFzZS9iYXNlNjQuaCIsCi0gICAgImJhc2UvYmFzZV9leHBvcnQuaCIsCi0gICAgImJhc2UvYmFzZV9zd2l0Y2hlcy5jYyIsCi0gICAgImJhc2UvYnVpbGRfdGltZS5jYyIsCi0gICAgImJhc2UvY2FsbGJhY2tfaGVscGVycy5jYyIsCi0gICAgImJhc2UvY2FsbGJhY2tfaW50ZXJuYWwuY2MiLAotICAgICJiYXNlL2NvbW1hbmRfbGluZS5jYyIsCi0gICAgImJhc2UvY3B1LmNjIiwKLSAgICAiYmFzZS9kZWJ1Zy9hY3Rpdml0eV90cmFja2VyLmNjIiwKLSAgICAiYmFzZS9kZWJ1Zy9hbGlhcy5jYyIsCi0gICAgImJhc2UvZGVidWcvZHVtcF93aXRob3V0X2NyYXNoaW5nLmNjIiwKLSAgICAiYmFzZS9kZWJ1Zy9kZWJ1Z2dlci5jYyIsCi0gICAgImJhc2UvZGVidWcvZGVidWdnZXJfcG9zaXguY2MiLAotICAgICJiYXNlL2RlYnVnL3N0YWNrX3RyYWNlLmNjIiwKLSAgICAiYmFzZS9kZWJ1Zy9zdGFja190cmFjZV9wb3NpeC5jYyIsCi0gICAgImJhc2UvZGVidWcvdGFza19hbm5vdGF0b3IuY2MiLAotICAgICJiYXNlL2Vudmlyb25tZW50LmNjIiwKLSAgICAiYmFzZS9maWxlcy9maWxlLmNjIiwKLSAgICAiYmFzZS9maWxlcy9maWxlX2Rlc2NyaXB0b3Jfd2F0Y2hlcl9wb3NpeC5jYyIsCi0gICAgImJhc2UvZmlsZXMvZmlsZV9lbnVtZXJhdG9yLmNjIiwKLSAgICAiYmFzZS9maWxlcy9maWxlX2VudW1lcmF0b3JfcG9zaXguY2MiLAotICAgICJiYXNlL2ZpbGVzL2ZpbGVfcGF0aC5jYyIsCi0gICAgImJhc2UvZmlsZXMvZmlsZV9wYXRoX2NvbnN0YW50cy5jYyIsCi0gICAgImJhc2UvZmlsZXMvZmlsZV9wYXRoX3dhdGNoZXIuY2MiLAotICAgICJiYXNlL2ZpbGVzL2ZpbGVfcGF0aF93YXRjaGVyX2xpbnV4LmNjIiwKLSAgICAiYmFzZS9maWxlcy9maWxlX3Bvc2l4LmNjIiwKLSAgICAiYmFzZS9maWxlcy9maWxlX3RyYWNpbmcuY2MiLAotICAgICJiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5jYyIsCi0gICAgImJhc2UvZmlsZXMvZmlsZV91dGlsX2xpbnV4LmNjIiwKLSAgICAiYmFzZS9maWxlcy9maWxlX3V0aWxfcG9zaXguY2MiLAotICAgICJiYXNlL2ZpbGVzL2ltcG9ydGFudF9maWxlX3dyaXRlci5jYyIsCi0gICAgImJhc2UvZmlsZXMvc2NvcGVkX2ZpbGUuY2MiLAotICAgICJiYXNlL2ZpbGVzL3Njb3BlZF90ZW1wX2Rpci5jYyIsCi0gICAgImJhc2UvZ3VpZC5jYyIsCi0gICAgImJhc2UvanNvbi9qc29uX3BhcnNlci5jYyIsCi0gICAgImJhc2UvanNvbi9qc29uX3JlYWRlci5jYyIsCi0gICAgImJhc2UvanNvbi9qc29uX3N0cmluZ192YWx1ZV9zZXJpYWxpemVyLmNjIiwKLSAgICAiYmFzZS9qc29uL2pzb25fd3JpdGVyLmNjIiwKLSAgICAiYmFzZS9qc29uL3N0cmluZ19lc2NhcGUuY2MiLAotICAgICJiYXNlL2xhenlfaW5zdGFuY2VfaGVscGVycy5jYyIsCi0gICAgImJhc2UvbG9jYXRpb24uY2MiLAotICAgICJiYXNlL2xvZ2dpbmcuY2MiLAotICAgICJiYXNlL21kNS5jYyIsCi0gICAgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmNjIiwKLSAgICAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWRfbWVtb3J5LmNjIiwKLSAgICAiYmFzZS9tZW1vcnkvd2Vha19wdHIuY2MiLAotICAgICJiYXNlL21lc3NhZ2VfbG9vcC9pbmNvbWluZ190YXNrX3F1ZXVlLmNjIiwKLSAgICAiYmFzZS9tZXNzYWdlX2xvb3AvbWVzc2FnZV9sb29wLmNjIiwKLSAgICAiYmFzZS9tZXNzYWdlX2xvb3AvbWVzc2FnZV9sb29wX2N1cnJlbnQuY2MiLAotICAgICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3BfdGFza19ydW5uZXIuY2MiLAotICAgICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX3B1bXAuY2MiLAotICAgICJiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX3B1bXBfZGVmYXVsdC5jYyIsCi0gICAgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfcHVtcF9saWJldmVudC5jYyIsCi0gICAgImJhc2UvbWVzc2FnZV9sb29wL3dhdGNoYWJsZV9pb19tZXNzYWdlX3B1bXBfcG9zaXguY2MiLAotCi0gICAgIyB3ZSBkb24ndCB3YW50IGFueSBnbGliIGRlcGVuZGVuY2llcy4KLSAgICAjICAgImJhc2UvbWVzc2FnZV9sb29wL21lc3NhZ2VfcHVtcF9nbGliLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL2J1Y2tldF9yYW5nZXMuY2MiLAotICAgICJiYXNlL21ldHJpY3MvZHVtbXlfaGlzdG9ncmFtLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL2ZpZWxkX3RyaWFsLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL2ZpZWxkX3RyaWFsX3BhcmFtX2Fzc29jaWF0b3IuY2MiLAotICAgICJiYXNlL21ldHJpY3MvaGlzdG9ncmFtLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbV9iYXNlLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL2hpc3RvZ3JhbV9mdW5jdGlvbnMuY2MiLAotICAgICJiYXNlL21ldHJpY3MvaGlzdG9ncmFtX3NhbXBsZXMuY2MiLAotICAgICJiYXNlL21ldHJpY3MvaGlzdG9ncmFtX3NuYXBzaG90X21hbmFnZXIuY2MiLAotICAgICJiYXNlL21ldHJpY3MvbWV0cmljc19oYXNoZXMuY2MiLAotICAgICJiYXNlL21ldHJpY3MvcGVyc2lzdGVudF9oaXN0b2dyYW1fYWxsb2NhdG9yLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL3BlcnNpc3RlbnRfbWVtb3J5X2FsbG9jYXRvci5jYyIsCi0gICAgImJhc2UvbWV0cmljcy9wZXJzaXN0ZW50X3NhbXBsZV9tYXAuY2MiLAotICAgICJiYXNlL21ldHJpY3Mvc2FtcGxlX21hcC5jYyIsCi0gICAgImJhc2UvbWV0cmljcy9zYW1wbGVfdmVjdG9yLmNjIiwKLSAgICAiYmFzZS9tZXRyaWNzL3NwYXJzZV9oaXN0b2dyYW0uY2MiLAotICAgICJiYXNlL21ldHJpY3Mvc3RhdGlzdGljc19yZWNvcmRlci5jYyIsCi0gICAgImJhc2UvbmF0aXZlX2xpYnJhcnkuY2MiLAotICAgICJiYXNlL29ic2VydmVyX2xpc3RfdGhyZWFkc2FmZS5jYyIsCi0gICAgImJhc2UvcGF0aF9zZXJ2aWNlLmNjIiwKLSAgICAiYmFzZS9wZW5kaW5nX3Rhc2suY2MiLAotICAgICJiYXNlL3BpY2tsZS5jYyIsCi0gICAgImJhc2UvcG9zaXgvZmlsZV9kZXNjcmlwdG9yX3NodWZmbGUuY2MiLAotICAgICJiYXNlL3Bvc2l4L2dsb2JhbF9kZXNjcmlwdG9ycy5jYyIsCi0gICAgImJhc2UvcG9zaXgvc2FmZV9zdHJlcnJvci5jYyIsCi0gICAgImJhc2UvcHJvY2Vzcy9pbnRlcm5hbF9saW51eC5jYyIsCi0gICAgImJhc2UvcHJvY2Vzcy9raWxsLmNjIiwKLSAgICAiYmFzZS9wcm9jZXNzL2tpbGxfcG9zaXguY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvbGF1bmNoLmNjIiwKLSAgICAiYmFzZS9wcm9jZXNzL2xhdW5jaF9wb3NpeC5jYyIsCi0gICAgImJhc2UvcHJvY2Vzcy9tZW1vcnkuY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvcHJvY2Vzc19oYW5kbGUuY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvcHJvY2Vzc19oYW5kbGVfbGludXguY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvcHJvY2Vzc19oYW5kbGVfcG9zaXguY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvcHJvY2Vzc19pbmZvX2xpbnV4LmNjIiwKLSAgICAiYmFzZS9wcm9jZXNzL3Byb2Nlc3NfaXRlcmF0b3IuY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvcHJvY2Vzc19pdGVyYXRvcl9saW51eC5jYyIsCi0gICAgImJhc2UvcHJvY2Vzcy9wcm9jZXNzX21ldHJpY3MuY2MiLAotICAgICJiYXNlL3Byb2Nlc3MvcHJvY2Vzc19tZXRyaWNzX2xpbnV4LmNjIiwKLSAgICAiYmFzZS9wcm9jZXNzL3Byb2Nlc3NfbWV0cmljc19wb3NpeC5jYyIsCi0gICAgImJhc2UvcHJvY2Vzcy9wcm9jZXNzX3Bvc2l4LmNjIiwKLSAgICAiYmFzZS9yYW5kX3V0aWwuY2MiLAotICAgICJiYXNlL3JhbmRfdXRpbF9wb3NpeC5jYyIsCi0gICAgImJhc2UvcnVuX2xvb3AuY2MiLAotICAgICJiYXNlL3NlcXVlbmNlX2NoZWNrZXJfaW1wbC5jYyIsCi0gICAgImJhc2Uvc2VxdWVuY2VkX3Rhc2tfcnVubmVyLmNjIiwKLSAgICAiYmFzZS9zZXF1ZW5jZV90b2tlbi5jYyIsCi0gICAgImJhc2Uvc2hhMS5jYyIsCi0gICAgImJhc2Uvc3RyaW5ncy9wYXR0ZXJuLmNjIiwKLSAgICAiYmFzZS9zdHJpbmdzL3NhZmVfc3ByaW50Zi5jYyIsCi0gICAgImJhc2Uvc3RyaW5ncy9zdHJpbmcxNi5jYyIsCi0gICAgImJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmNjIiwKLSAgICAiYmFzZS9zdHJpbmdzL3N0cmluZ19waWVjZS5jYyIsCi0gICAgImJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuY2MiLAotICAgICJiYXNlL3N0cmluZ3Mvc3RyaW5nX3NwbGl0LmNjIiwKLSAgICAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmNjIiwKLSAgICAiYmFzZS9zdHJpbmdzL3N0cmluZ191dGlsX2NvbnN0YW50cy5jYyIsCi0gICAgImJhc2Uvc3RyaW5ncy9zeXNfc3RyaW5nX2NvbnZlcnNpb25zX3Bvc2l4LmNjIiwKLSAgICAiYmFzZS9zdHJpbmdzL3V0Zl9zdHJpbmdfY29udmVyc2lvbnMuY2MiLAotICAgICJiYXNlL3N0cmluZ3MvdXRmX3N0cmluZ19jb252ZXJzaW9uX3V0aWxzLmNjIiwKLSAgICAiYmFzZS9zeW5jaHJvbml6YXRpb24vYXRvbWljX2ZsYWcuY2MiLAotICAgICJiYXNlL3N5bmNocm9uaXphdGlvbi9jb25kaXRpb25fdmFyaWFibGVfcG9zaXguY2MiLAotICAgICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmNjIiwKLSAgICAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9ja19pbXBsX3Bvc2l4LmNjIiwKLSAgICAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnRfcG9zaXguY2MiLAotICAgICJiYXNlL3N5bmNfc29ja2V0X3Bvc2l4LmNjIiwKLSAgICAiYmFzZS9zeXNfaW5mby5jYyIsCi0KLSAgICAjIFRPRE8oYXJtYW5zaXRvKTogRm9yIG91ciBHTiBidWlsZHMgdGhlc2UgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCi0gICAgIyBkb24ndCByZWFsbHkgbWFrZSB0aGF0IG11Y2ggc2Vuc2UgYnV0IGluc3RlYWQgb2YgcmVtb3ZpbmcgdGhlIGxpbmUgSSdtCi0gICAgIyBjb21tZW50aW5nIGl0IG91dCBpbiBjYXNlIHdlIHdhbnQgdG8gcmUtYWRkIGl0IGxhdGVyIChpdCdzIGluY2x1ZGVkIGluIHRoZQotICAgICMgbGliY2hyb21lIEFuZHJvaWQubWspLgotICAgICMic3lzX2luZm9fY2hyb21lb3MuY2MiLAotICAgICJiYXNlL3N5c19pbmZvX2xpbnV4LmNjIiwKLSAgICAiYmFzZS9zeXNfaW5mb19wb3NpeC5jYyIsCi0gICAgImJhc2UvdGFzay9jYW5jZWxhYmxlX3Rhc2tfdHJhY2tlci5jYyIsCi0gICAgImJhc2UvdGFza19ydW5uZXIuY2MiLAotICAgICJiYXNlL3RoaXJkX3BhcnR5L2ljdS9pY3VfdXRmLmNjIiwKLSAgICAiYmFzZS90aGlyZF9wYXJ0eS9uc3ByL3BydGltZS5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZF9pbnRlcm5hbF9wb3NpeC5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZF9saW51eC5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZF9wb3NpeC5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3Bvc3RfdGFza19hbmRfcmVwbHlfaW1wbC5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3Njb3BlZF9ibG9ja2luZ19jYWxsLmNjIiwKLSAgICAiYmFzZS90aHJlYWRpbmcvc2VxdWVuY2VfbG9jYWxfc3RvcmFnZV9tYXAuY2MiLAotICAgICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZV9sb2NhbF9zdG9yYWdlX3Nsb3QuY2MiLAotICAgICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZWRfdGFza19ydW5uZXJfaGFuZGxlLmNjIiwKLSAgICAiYmFzZS90aHJlYWRpbmcvc2ltcGxlX3RocmVhZC5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyX2ltcGwuY2MiLAotICAgICJiYXNlL3RocmVhZGluZy90aHJlYWRfY29sbGlzaW9uX3dhcm5lci5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9pZF9uYW1lX21hbmFnZXIuY2MiLAotICAgICJiYXNlL3RocmVhZGluZy90aHJlYWRfbG9jYWxfc3RvcmFnZS5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9sb2NhbF9zdG9yYWdlX3Bvc2l4LmNjIiwKLSAgICAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX3Jlc3RyaWN0aW9ucy5jYyIsCi0gICAgImJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuY2MiLAotICAgICJiYXNlL3RpbWUvY2xvY2suY2MiLAotICAgICJiYXNlL3RpbWUvZGVmYXVsdF9jbG9jay5jYyIsCi0gICAgImJhc2UvdGltZS9kZWZhdWx0X3RpY2tfY2xvY2suY2MiLAotICAgICJiYXNlL3RpbWUvdGlja19jbG9jay5jYyIsCi0gICAgImJhc2UvdGltZS90aW1lLmNjIiwKLSAgICAiYmFzZS90aW1lL3RpbWVfY29udmVyc2lvbl9wb3NpeC5jYyIsCi0gICAgImJhc2UvdGltZS90aW1lX2V4cGxvZGVkX3Bvc2l4LmNjIiwKLSAgICAiYmFzZS90aW1lL3RpbWVfbm93X3Bvc2l4LmNjIiwKLSAgICAiYmFzZS90aW1lL3RpbWVfb3ZlcnJpZGUuY2MiLAotICAgICJiYXNlL3RpbWVyL2VsYXBzZWRfdGltZXIuY2MiLAotICAgICJiYXNlL3RpbWVyL3RpbWVyLmNjIiwKLSAgICAiYmFzZS91bmd1ZXNzYWJsZV90b2tlbi5jYyIsCi0gICAgImJhc2UvdmFsdWVfaXRlcmF0b3JzLmNjIiwKLSAgICAiYmFzZS92YWx1ZXMuY2MiLAotICAgICJiYXNlL3ZlcnNpb24uY2MiLAotICAgICJiYXNlL3Zsb2cuY2MiLAotCi0gICAgImRidXMvYnVzLmNjIiwKLSAgICAiZGJ1cy9kYnVzX3N0YXRpc3RpY3MuY2MiLAotICAgICJkYnVzL2V4cG9ydGVkX29iamVjdC5jYyIsCi0gICAgImRidXMvbWVzc2FnZS5jYyIsCi0gICAgImRidXMvb2JqZWN0X21hbmFnZXIuY2MiLAotICAgICJkYnVzL29iamVjdF9wYXRoLmNjIiwKLSAgICAiZGJ1cy9vYmplY3RfcHJveHkuY2MiLAotICAgICJkYnVzL3Byb3BlcnR5LmNjIiwKLSAgICAiZGJ1cy9zY29wZWRfZGJ1c19lcnJvci5jYyIsCi0gICAgImRidXMvc3RyaW5nX3V0aWwuY2MiLAotICAgICJkYnVzL3V0aWwuY2MiLAotICAgICJkYnVzL3ZhbHVlc191dGlsLmNjIgotICBdCi0KLSAgZGVmaW5lcyA9IFsKLSAgICAiQkFTRV9JTVBMRU1FTlRBVElPTiIsCi0KLSAgICAjIHRyaWNrIGxpYmNocm9tZSB0byB0aGluayB3ZSdyZSBidWlsZGluZyBob3N0IGNvZGUgd2l0aGluIGFuIEFuZHJvaWQgY2hlY2tvdXQKLSAgICAjIHRoYW5rcyB0byBpdCBubyBnbGliIGRlcGVuZGVuY3kKLSAgICAiX19BTkRST0lEX0hPU1RfXz0xIiwKLSAgICAiT1NfTElOVVg9MSIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vIiwKLSAgICAiLy90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZSIsCi0gICAgIi8vdGhpcmRfcGFydHkvbGliY2hyb21lIiwKLSAgICAiLy90aGlyZF9wYXJ0eS9saWJldmVudCIsCi0gICAgIi8vdGhpcmRfcGFydHkvbGliZXZlbnQvaW5jbHVkZSIsCi0gICAgIi8vdGhpcmRfcGFydHkvbGliY2hyb21lL2Jhc2UiLAotICAgICIvL3RoaXJkX3BhcnR5L2xpYmNocm9tZS9kYnVzIiwKLSAgICAiLy90aGlyZF9wYXJ0eS9tb2RwX2I2NCIsCi0KLSAgICAjIHBhdGhzIHRvIGRidXMgaGVhZGVycywgY2FuIGJlIG9idGFpbmVkIGJ5ICJwa2ctY29uZmlnIC0tY2ZsYWdzIGRidXMtMSIKLSAgICAjVE9ETyhqcGF3bG93c2tpKSB1c2UgcGtnLWNvbmZpZyBzY3JpcHQgbGlrZSBidWlsZC9jb25maWcvbGludXgvcGtnX2NvbmZpZy5nbmkKLSAgICAiL3Vzci9pbmNsdWRlL2RidXMtMS4wLyIsCi0gICAgIi91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZGJ1cy0xLjAvaW5jbHVkZSIsCi0gIF0KLX0KLQotY29uZmlnKCJsaWJjaHJvbWVfY29uZmlnIikgewotICAjIGxpYmNocm9tZSBoZWFkZXJzIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZW1zZWx2ZXMuCi0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiLy90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZSIsCi0gICAgIi8vdGhpcmRfcGFydHkvbGliY2hyb21lIiwKLQotICAgICMgcGF0aHMgdG8gZGJ1cyBoZWFkZXJzLCBjYW4gYmUgb2J0YWluZWQgYnkgInBrZy1jb25maWcgLS1jZmxhZ3MgZGJ1cy0xIgotICAgICNUT0RPKGpwYXdsb3dza2kpIHVzZSBwa2ctY29uZmlnIHNjcmlwdCBsaWtlIGJ1aWxkL2NvbmZpZy9saW51eC9wa2dfY29uZmlnLmduaQotICAgICIvdXNyL2luY2x1ZGUvZGJ1cy0xLjAvIiwKLSAgICAiL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9kYnVzLTEuMC9pbmNsdWRlIiwKLSBdCi19Ci0KLXN0YXRpY19saWJyYXJ5KCJiYXNlIikgewotICBkZXBzID0gWwotICAgICI6YmFzZV9zb3VyY2VzIiwKLSAgXQotCi0gIGNmbGFncyA9IFsKLSAgICAiLVduby1jaGFyLXN1YnNjcmlwdHMiLAotICAgICItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKLSAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAotICAgICItV25vLXVudXNlZF9wYXJhbWV0ZXIiLAotICBdCi0gIGNmbGFnc19jYyA9IFsKLSAgICAiLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyIiwKLSAgICAiLVduby1ub24tdmlydHVhbC1kdG9yIiwKLSAgICAiLVduby1zaWduLXByb21vIiwKLSAgXQotCi0gIGxpYnMgPSBbCi0gICAgIi1sZXZlbnQiLAotICAgICItbGV2ZW50X2NvcmUiLAotICAgICItbHB0aHJlYWQiLAotICAgICItbGRidXMtMSIsCi0gIF0KLQotICBwdWJsaWNfY29uZmlncyA9IFsgIjpsaWJjaHJvbWVfY29uZmlnIiBdCi19CmRpZmYgLS1naXQgYS9idWlsZC9zZWNvbmRhcnkvdGhpcmRfcGFydHkvbGlibGRhYy9CVUlMRC5nbiBiL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS9saWJsZGFjL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IxOTFkLi4wMDAwMDAwCi0tLSBhL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS9saWJsZGFjL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWNvbmZpZygibGlibGRhY0JUX2VuY19jb25maWciKSB7Ci0gIGluY2x1ZGVfZGlycyA9IFsgImluYyIgXQotfQotCi1jb25maWcoImxpYmxkYWNCVF9hYnJfY29uZmlnIikgewotICBpbmNsdWRlX2RpcnMgPSBbICJhYnIvaW5jIiwgImluYyIgXQotfQotCi1zaGFyZWRfbGlicmFyeSgibGlibGRhY0JUX2VuYyIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAic3JjL2xkYWNsaWIuYyIsCi0gICAgInNyYy9sZGFjQlQuYyIsCi0gIF0KLQotICBwdWJsaWNfY29uZmlncyA9IFsgIjpsaWJsZGFjQlRfZW5jX2NvbmZpZyIgXQotCi0gIGNmbGFncyA9IFsgIi1PMiIgXQotCi0gIGRlZmluZXMgPSBbICJFWFBPUlRfU1lNQk9MPSIgXQotfQotCi1zaGFyZWRfbGlicmFyeSgibGlibGRhY0JUX2FiciIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiYWJyL3NyYy9sZGFjQlRfYWJyLmMiLAotICBdCi0KLSAgcHVibGljX2NvbmZpZ3MgPSBbICI6bGlibGRhY0JUX2Ficl9jb25maWciIF0KLQotICBjZmxhZ3MgPSBbICItTzIiIF0KLQotICBkZWZpbmVzID0gWyAiRVhQT1JUX1NZTUJPTD0iIF0KLX0KZGlmZiAtLWdpdCBhL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS90aW55eG1sMi9CVUlMRC5nbiBiL2J1aWxkL3NlY29uZGFyeS90aGlyZF9wYXJ0eS90aW55eG1sMi9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViNjZhMS4uMDAwMDAwMAotLS0gYS9idWlsZC9zZWNvbmRhcnkvdGhpcmRfcGFydHkvdGlueXhtbDIvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc3RhdGljX2xpYnJhcnkoInRpbnl4bWwyIikgewotICBzb3VyY2VzID0gWwotICAgICJ0aW55eG1sMi5jcHAiCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbICIuIiBdCi19CmRpZmYgLS1naXQgYS9idWlsZC90b29sY2hhaW4vY2xhbmcvQlVJTEQuZ24gYi9idWlsZC90b29sY2hhaW4vY2xhbmcvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODZlMjcuLjAwMDAwMDAKLS0tIGEvYnVpbGQvdG9vbGNoYWluL2NsYW5nL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE2IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotY2xhbmdfc3VmZml4ID0gZXhlY19zY3JpcHQoImdldF9jbGFuZ19zdWZmaXgucHkiLCBbXSwgImxpc3QgbGluZXMiKQotY2xhbmdfc3VmZml4ID0gY2xhbmdfc3VmZml4WzBdCi1hc3NlcnQoY2xhbmdfc3VmZml4ICE9ICJOb25lIiwKLSAgICAgICJDYW5ub3QgZmluZCBjbGFuZywgcGxlYXNlIGluc3RhbGwgY2xhbmcgMy41IG9yIGFib3ZlIikKLWlmIChjbGFuZ19zdWZmaXggIT0gIiIpIHsKLSAgY2xhbmdfc3VmZml4ID0gIi0iICsgY2xhbmdfc3VmZml4Ci19Ci1jbGFuZyA9ICJjbGFuZyRjbGFuZ19zdWZmaXgiCi1jbGFuZ3h4ID0gImNsYW5nKyskY2xhbmdfc3VmZml4IgotCi1jb25maWcoImNsYW5nX2NvbmZpZyIpIHsKLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvdXNyL2luY2x1ZGUvbGliY3h4YWJpIiwKLSAgXQotICBjZmxhZ3NfY2MgPSBbCi0gICAgIi1zdGRsaWI9bGliYysrIiwKLSAgXQotICBsZGZsYWdzID0gWwotICAgICItc3RkbGliPWxpYmMrKyIsCi0gIF0KLX0KLQotdG9vbGNoYWluKCJjbGFuZyIpIHsKLSAgdG9vbCgiY2MiKSB7Ci0gICAgZGVwZmlsZSA9ICJ7e291dHB1dH19LmQiCi0gICAgY29tbWFuZCA9ICIkY2xhbmcgLU1NRCAtTUYgJGRlcGZpbGUge3tkZWZpbmVzfX0ge3tpbmNsdWRlX2RpcnN9fSB7e2NmbGFnc319IHt7Y2ZsYWdzX2N9fSAtYyB7e3NvdXJjZX19IC1vIHt7b3V0cHV0fX0iCi0gICAgZGVwc2Zvcm1hdCA9ICJnY2MiCi0gICAgZGVzY3JpcHRpb24gPSAiQ0Mge3tvdXRwdXR9fSIKLSAgICBvdXRwdXRzID0gWwotICAgICAgInt7c291cmNlX291dF9kaXJ9fS97e3RhcmdldF9vdXRwdXRfbmFtZX19Lnt7c291cmNlX25hbWVfcGFydH19Lm8iLAotICAgIF0KLSAgfQotCi0gIHRvb2woImN4eCIpIHsKLSAgICBkZXBmaWxlID0gInt7b3V0cHV0fX0uZCIKLSAgICBjb21tYW5kID0gIiRjbGFuZ3h4IC1NTUQgLU1GICRkZXBmaWxlIHt7ZGVmaW5lc319IHt7aW5jbHVkZV9kaXJzfX0ge3tjZmxhZ3N9fSB7e2NmbGFnc19jY319IC1jIHt7c291cmNlfX0gLW8ge3tvdXRwdXR9fSIKLSAgICBkZXBzZm9ybWF0ID0gImdjYyIKLSAgICBkZXNjcmlwdGlvbiA9ICJDWFgge3tvdXRwdXR9fSIKLSAgICBvdXRwdXRzID0gWwotICAgICAgInt7c291cmNlX291dF9kaXJ9fS97e3RhcmdldF9vdXRwdXRfbmFtZX19Lnt7c291cmNlX25hbWVfcGFydH19Lm8iLAotICAgIF0KLSAgfQotCi0gIHRvb2woImFsaW5rIikgewotICAgIHJzcGZpbGUgPSAie3tvdXRwdXR9fS5yc3AiCi0gICAgY29tbWFuZCA9ICJybSAtZiB7e291dHB1dH19ICYmIGFyIHJjcyB7e291dHB1dH19IEAkcnNwZmlsZSIKLSAgICBkZXNjcmlwdGlvbiA9ICJBUiB7e3RhcmdldF9vdXRwdXRfbmFtZX19e3tvdXRwdXRfZXh0ZW5zaW9ufX0iCi0gICAgcnNwZmlsZV9jb250ZW50ID0gInt7aW5wdXRzfX0iCi0gICAgb3V0cHV0cyA9IFsKLSAgICAgICJ7e3RhcmdldF9vdXRfZGlyfX0ve3t0YXJnZXRfb3V0cHV0X25hbWV9fXt7b3V0cHV0X2V4dGVuc2lvbn19IiwKLSAgICBdCi0gICAgZGVmYXVsdF9vdXRwdXRfZXh0ZW5zaW9uID0gIi5hIgotCi0gICAgb3V0cHV0X3ByZWZpeCA9ICJsaWIiCi0gIH0KLQotICB0b29sKCJzb2xpbmsiKSB7Ci0gICAgc29uYW1lID0gInt7dGFyZ2V0X291dHB1dF9uYW1lfX17e291dHB1dF9leHRlbnNpb259fSIgICMgZS5nLiAibGliZm9vLnNvIi4KLSAgICByc3BmaWxlID0gc29uYW1lICsgIi5yc3AiCi0KLSAgICBjb21tYW5kID0KLSAgICAgICAgIiRjbGFuZ3h4IC1zaGFyZWQge3tsZGZsYWdzfX0gLW8gJHNvbmFtZSAtV2wsLXNvbmFtZT0kc29uYW1lIEAkcnNwZmlsZSIKLSAgICByc3BmaWxlX2NvbnRlbnQgPSAiLVdsLC0td2hvbGUtYXJjaGl2ZSB7e2lucHV0c319IHt7c29saWJzfX0gLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSB7e2xpYnN9fSIKLQotICAgIGRlc2NyaXB0aW9uID0gIlNPTElOSyAkc29uYW1lIgotCi0gICAgIyBVc2UgdGhpcyBmb3Ige3tvdXRwdXRfZXh0ZW5zaW9ufX0gZXhwYW5zaW9ucyB1bmxlc3MgYSB0YXJnZXQgbWFudWFsbHkKLSAgICAjIG92ZXJyaWRlcyBpdCAoaW4gd2hpY2ggY2FzZSB7e291dHB1dF9leHRlbnNpb259fSB3aWxsIGJlIHdoYXQgdGhlIHRhcmdldAotICAgICMgc3BlY2lmaWVzKS4KLSAgICBkZWZhdWx0X291dHB1dF9leHRlbnNpb24gPSAiLnNvIgotCi0gICAgb3V0cHV0cyA9IFsKLSAgICAgIHNvbmFtZSwKLSAgICBdCi0gICAgbGlua19vdXRwdXQgPSBzb25hbWUKLSAgICBkZXBlbmRfb3V0cHV0ID0gc29uYW1lCi0KLSAgICBvdXRwdXRfcHJlZml4ID0gImxpYiIKLSAgfQotCi0gIHRvb2woImxpbmsiKSB7Ci0gICAgb3V0ZmlsZSA9ICJ7e3RhcmdldF9vdXRwdXRfbmFtZX19e3tvdXRwdXRfZXh0ZW5zaW9ufX0iCi0gICAgcnNwZmlsZSA9ICIkb3V0ZmlsZS5yc3AiCi0gICAgY29tbWFuZCA9ICIkY2xhbmd4eCB7e2xkZmxhZ3N9fSAtbyAkb3V0ZmlsZSAtV2wsLS1zdGFydC1ncm91cCBAJHJzcGZpbGUge3tzb2xpYnN9fSAtV2wsLS1lbmQtZ3JvdXAge3tsaWJzfX0iCi0gICAgZGVzY3JpcHRpb24gPSAiTElOSyAkb3V0ZmlsZSIKLSAgICByc3BmaWxlX2NvbnRlbnQgPSAie3tpbnB1dHN9fSIKLSAgICBvdXRwdXRzID0gWwotICAgICAgb3V0ZmlsZSwKLSAgICBdCi0gIH0KLQotICB0b29sKCJzdGFtcCIpIHsKLSAgICBjb21tYW5kID0gInRvdWNoIHt7b3V0cHV0fX0iCi0gICAgZGVzY3JpcHRpb24gPSAiU1RBTVAge3tvdXRwdXR9fSIKLSAgfQotCi0gIHRvb2woImNvcHkiKSB7Ci0gICAgY29tbWFuZCA9ICJjcCAtYWYge3tzb3VyY2V9fSB7e291dHB1dH19IgotICAgIGRlc2NyaXB0aW9uID0gIkNPUFkge3tzb3VyY2V9fSB7e291dHB1dH19IgotICB9Ci19CmRpZmYgLS1naXQgYS9idWlsZC90b29sY2hhaW4vY2xhbmcvZ2V0X2NsYW5nX3N1ZmZpeC5weSBiL2J1aWxkL3Rvb2xjaGFpbi9jbGFuZy9nZXRfY2xhbmdfc3VmZml4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmY3YjljLi4wMDAwMDAwCi0tLSBhL2J1aWxkL3Rvb2xjaGFpbi9jbGFuZy9nZXRfY2xhbmdfc3VmZml4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotaW1wb3J0IG9zCi1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHJlCi1pbXBvcnQgc3lzCi0KLQotZGVmIHdoaWNoKGNtZCk6Ci0gICAgZm9yIHAgaW4gb3MuZW52aXJvblsiUEFUSCJdLnNwbGl0KG9zLnBhdGhzZXApOgotICAgICAgICBjbGFuZ19wYXRoID0gb3MucGF0aC5qb2luKHAsIGNtZCkKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY2xhbmdfcGF0aCk6Ci0gICAgICAgICAgICByZXR1cm4gY2xhbmdfcGF0aAotICAgIHJldHVybiBOb25lCi0KLQotQ0xBTkdfVkVSU0lPTl9SRUdFWCA9ICIuKnZlcnNpb25ccyooWzAtOV0qXC5bMC05XSopXC4qIgotY2xhbmdfcGF0aCA9IHdoaWNoKCJjbGFuZysrIikKLWNsYW5nX3ZlcnNpb25fbWFqb3IgPSAwCi1jbGFuZ192ZXJzaW9uX21pbm9yID0gMAotCi1pZiBjbGFuZ19wYXRoOgotICAgIGNsYW5nX3ZlcnNpb25fb3V0ID0gc3VicHJvY2Vzcy5Qb3BlbihbY2xhbmdfcGF0aCwgIi0tdmVyc2lvbiJdLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCi0gICAgY2xhbmdfdmVyc2lvbl9tYXRjaCA9IHJlLnNlYXJjaChDTEFOR19WRVJTSU9OX1JFR0VYLCBjbGFuZ192ZXJzaW9uX291dCkKLSAgICBjbGFuZ192ZXJzaW9uX3N0ciA9IGNsYW5nX3ZlcnNpb25fbWF0Y2guZ3JvdXAoMSkKLSAgICBjbGFuZ192ZXJzaW9uX2FycmF5ID0gY2xhbmdfdmVyc2lvbl9zdHIuc3BsaXQoJy4nKQotICAgIGNsYW5nX3ZlcnNpb25fbWFqb3IgPSBpbnQoY2xhbmdfdmVyc2lvbl9hcnJheVswXSkKLSAgICBjbGFuZ192ZXJzaW9uX21pbm9yID0gaW50KGNsYW5nX3ZlcnNpb25fYXJyYXlbMV0pCi0KLWlmIGNsYW5nX3ZlcnNpb25fbWFqb3IgPj0gMyBhbmQgY2xhbmdfdmVyc2lvbl9taW5vciA+PSA1OgotICAgIHByaW50ICIiCi1lbHNlOgotICAgICMgTG9vcCBpbiBzdXBwb3J0IGNsYW5nIHZlcnNpb24gb25seQotICAgIGNsYW5nX3ZlcnNpb25fbWFqb3IgPSAzCi0gICAgY2xhbmdfdmVyc2lvbl9taW5vciA9IDkKLSAgICB3aGlsZSBjbGFuZ192ZXJzaW9uX21ham9yID49IDMgYW5kIGNsYW5nX3ZlcnNpb25fbWlub3IgPj0gNToKLSAgICAgICAgY2xhbmdfdmVyc2lvbl9zdHIgPSAiJWQuJWQiICUgKGNsYW5nX3ZlcnNpb25fbWFqb3IsIGNsYW5nX3ZlcnNpb25fbWlub3IpCi0gICAgICAgIGNsYW5nX3BhdGggPSB3aGljaCgiY2xhbmcrKy0iICsgY2xhbmdfdmVyc2lvbl9zdHIpCi0gICAgICAgIGlmIGNsYW5nX3BhdGg6Ci0gICAgICAgICAgICBwcmludCBjbGFuZ192ZXJzaW9uX3N0cgotICAgICAgICAgICAgc3lzLmV4aXQoMCkKLSAgICAgICAgY2xhbmdfdmVyc2lvbl9taW5vciAtPSAxCi0gICAgICAgIGlmIGNsYW5nX3ZlcnNpb25fbWlub3IgPCAwOgotICAgICAgICAgICAgY2xhbmdfdmVyc2lvbl9taW5vciA9IDkKLSAgICAgICAgICAgIGNsYW5nX3ZlcnNpb25fbWFqb3IgLT0gMQotICAgIHByaW50ICJOb25lIgpkaWZmIC0tZ2l0IGEvYnVpbGQvdG9vbGNoYWluL2djYy9CVUlMRC5nbiBiL2J1aWxkL3Rvb2xjaGFpbi9nY2MvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTJkMGEuLjAwMDAwMDAKLS0tIGEvYnVpbGQvdG9vbGNoYWluL2djYy9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotY2MgPSAiZ2NjIgotY3h4ID0gImcrKyIKLQotdG9vbGNoYWluKCJnY2MiKSB7Ci0gIHRvb2woImNjIikgewotICAgIGRlcGZpbGUgPSAie3tvdXRwdXR9fS5kIgotICAgIGNvbW1hbmQgPSAiJGNjIC1NTUQgLU1GICRkZXBmaWxlIHt7ZGVmaW5lc319IHt7aW5jbHVkZV9kaXJzfX0ge3tjZmxhZ3N9fSB7e2NmbGFnc19jfX0gLWMge3tzb3VyY2V9fSAtbyB7e291dHB1dH19IgotICAgIGRlcHNmb3JtYXQgPSAiZ2NjIgotICAgIGRlc2NyaXB0aW9uID0gIkNDIHt7b3V0cHV0fX0iCi0gICAgb3V0cHV0cyA9IFsKLSAgICAgICJ7e3NvdXJjZV9vdXRfZGlyfX0ve3t0YXJnZXRfb3V0cHV0X25hbWV9fS57e3NvdXJjZV9uYW1lX3BhcnR9fS5vIiwKLSAgICBdCi0gIH0KLQotICB0b29sKCJjeHgiKSB7Ci0gICAgZGVwZmlsZSA9ICJ7e291dHB1dH19LmQiCi0gICAgY29tbWFuZCA9ICIkY3h4IC1NTUQgLU1GICRkZXBmaWxlIHt7ZGVmaW5lc319IHt7aW5jbHVkZV9kaXJzfX0ge3tjZmxhZ3N9fSB7e2NmbGFnc19jY319IC1jIHt7c291cmNlfX0gLW8ge3tvdXRwdXR9fSIKLSAgICBkZXBzZm9ybWF0ID0gImdjYyIKLSAgICBkZXNjcmlwdGlvbiA9ICJDWFgge3tvdXRwdXR9fSIKLSAgICBvdXRwdXRzID0gWwotICAgICAgInt7c291cmNlX291dF9kaXJ9fS97e3RhcmdldF9vdXRwdXRfbmFtZX19Lnt7c291cmNlX25hbWVfcGFydH19Lm8iLAotICAgIF0KLSAgfQotCi0gIHRvb2woImFsaW5rIikgewotICAgIHJzcGZpbGUgPSAie3tvdXRwdXR9fS5yc3AiCi0gICAgY29tbWFuZCA9ICJybSAtZiB7e291dHB1dH19ICYmIGFyIHJjcyB7e291dHB1dH19IEAkcnNwZmlsZSIKLSAgICBkZXNjcmlwdGlvbiA9ICJBUiB7e3RhcmdldF9vdXRwdXRfbmFtZX19e3tvdXRwdXRfZXh0ZW5zaW9ufX0iCi0gICAgcnNwZmlsZV9jb250ZW50ID0gInt7aW5wdXRzfX0iCi0gICAgb3V0cHV0cyA9IFsKLSAgICAgICJ7e3RhcmdldF9vdXRfZGlyfX0ve3t0YXJnZXRfb3V0cHV0X25hbWV9fXt7b3V0cHV0X2V4dGVuc2lvbn19IiwKLSAgICBdCi0gICAgZGVmYXVsdF9vdXRwdXRfZXh0ZW5zaW9uID0gIi5hIgotCi0gICAgb3V0cHV0X3ByZWZpeCA9ICJsaWIiCi0gIH0KLQotICB0b29sKCJzb2xpbmsiKSB7Ci0gICAgc29uYW1lID0gInt7dGFyZ2V0X291dHB1dF9uYW1lfX17e291dHB1dF9leHRlbnNpb259fSIgICMgZS5nLiAibGliZm9vLnNvIi4KLSAgICByc3BmaWxlID0gc29uYW1lICsgIi5yc3AiCi0KLSAgICBjb21tYW5kID0KLSAgICAgICAgIiRjeHggLXNoYXJlZCB7e2xkZmxhZ3N9fSAtbyAkc29uYW1lIC1XbCwtc29uYW1lPSRzb25hbWUgQCRyc3BmaWxlIgotICAgIHJzcGZpbGVfY29udGVudCA9ICItV2wsLS13aG9sZS1hcmNoaXZlIHt7aW5wdXRzfX0ge3tzb2xpYnN9fSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIHt7bGlic319IgotCi0gICAgZGVzY3JpcHRpb24gPSAiU09MSU5LICRzb25hbWUiCi0KLSAgICAjIFVzZSB0aGlzIGZvciB7e291dHB1dF9leHRlbnNpb259fSBleHBhbnNpb25zIHVubGVzcyBhIHRhcmdldCBtYW51YWxseQotICAgICMgb3ZlcnJpZGVzIGl0IChpbiB3aGljaCBjYXNlIHt7b3V0cHV0X2V4dGVuc2lvbn19IHdpbGwgYmUgd2hhdCB0aGUgdGFyZ2V0Ci0gICAgIyBzcGVjaWZpZXMpLgotICAgIGRlZmF1bHRfb3V0cHV0X2V4dGVuc2lvbiA9ICIuc28iCi0KLSAgICBvdXRwdXRzID0gWwotICAgICAgc29uYW1lLAotICAgIF0KLSAgICBsaW5rX291dHB1dCA9IHNvbmFtZQotICAgIGRlcGVuZF9vdXRwdXQgPSBzb25hbWUKLQotICAgIG91dHB1dF9wcmVmaXggPSAibGliIgotICB9Ci0KLSAgdG9vbCgibGluayIpIHsKLSAgICBvdXRmaWxlID0gInt7dGFyZ2V0X291dHB1dF9uYW1lfX17e291dHB1dF9leHRlbnNpb259fSIKLSAgICByc3BmaWxlID0gIiRvdXRmaWxlLnJzcCIKLSAgICBjb21tYW5kID0gIiRjeHgge3tsZGZsYWdzfX0gLW8gJG91dGZpbGUgLVdsLC0tc3RhcnQtZ3JvdXAgQCRyc3BmaWxlIHt7c29saWJzfX0gLVdsLC0tZW5kLWdyb3VwIHt7bGlic319IgotICAgIGRlc2NyaXB0aW9uID0gIkxJTksgJG91dGZpbGUiCi0gICAgcnNwZmlsZV9jb250ZW50ID0gInt7aW5wdXRzfX0iCi0gICAgb3V0cHV0cyA9IFsKLSAgICAgIG91dGZpbGUsCi0gICAgXQotICB9Ci0KLSAgdG9vbCgic3RhbXAiKSB7Ci0gICAgY29tbWFuZCA9ICJ0b3VjaCB7e291dHB1dH19IgotICAgIGRlc2NyaXB0aW9uID0gIlNUQU1QIHt7b3V0cHV0fX0iCi0gIH0KLQotICB0b29sKCJjb3B5IikgewotICAgIGNvbW1hbmQgPSAiY3AgLWFmIHt7c291cmNlfX0ge3tvdXRwdXR9fSIKLSAgICBkZXNjcmlwdGlvbiA9ICJDT1BZIHt7c291cmNlfX0ge3tvdXRwdXR9fSIKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL0FuZHJvaWQuYnAgYi9jb21tb24vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwNDdmZS4uMDAwMDAwMAotLS0gYS9jb21tb24vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0LWNvbW1vbiIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9nZC9ydXN0L3NoaW0iLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiYWRkcmVzc19vYmZ1c2NhdG9yLmNjIiwKLSAgICAgICAgIm1lc3NhZ2VfbG9vcF90aHJlYWQuY2MiLAotICAgICAgICAibWV0cmljX2lkX2FsbG9jYXRvci5jYyIsCi0gICAgICAgICJvbmNlX3RpbWVyLmNjIiwKLSAgICAgICAgIm9zX3V0aWxzLmNjIiwKLSAgICAgICAgInJlcGVhdGluZ190aW1lci5jYyIsCi0gICAgICAgICJ0aW1lX3V0aWwuY2MiLAotICAgICAgICAic3RvcF93YXRjaF9sZWdhY3kuY2MiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHNyY3M6IFsibWV0cmljcy5jYyJdLAotICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGlic3RhdHNsb2dfYnQiXSwKLSAgICAgICAgfSwKLSAgICAgICAgaG9zdDogewotICAgICAgICAgICAgc3JjczogWyJtZXRyaWNzX2xpbnV4LmNjIl0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF90ZXN0X2NvbW1vbiIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2NvdmVyYWdlX2JpbiIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9nZC9ydXN0L3NoaW0iLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiYWRkcmVzc19vYmZ1c2NhdG9yX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImJhc2VfYmluZF91bml0dGVzdC5jYyIsCi0gICAgICAgICJsZWFreV9ib25kZWRfcXVldWVfdW5pdHRlc3QuY2MiLAotICAgICAgICAibHJ1X3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgIm1lc3NhZ2VfbG9vcF90aHJlYWRfdW5pdHRlc3QuY2MiLAotICAgICAgICAibWV0cmljX2lkX2FsbG9jYXRvcl91bml0dGVzdC5jYyIsCi0gICAgICAgICJvbmNlX3RpbWVyX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgInJlcGVhdGluZ190aW1lcl91bml0dGVzdC5jYyIsCi0gICAgICAgICJzdGF0ZV9tYWNoaW5lX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgInRpbWVfdXRpbF91bml0dGVzdC5jYyIsCi0gICAgICAgICJpZF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHNyY3M6IFsibWV0cmljc191bml0dGVzdC5jYyJdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogZmFsc2UsCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X3BlcmZvcm1hbmNlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vYnQiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L3RocmVhZF9wZXJmb3JtYW5jZV90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgIF0sCi19Ci0KLWNjX2JlbmNobWFyayB7Ci0gICAgbmFtZTogImJsdWV0b290aF9iZW5jaG1hcmtfdGhyZWFkX3BlcmZvcm1hbmNlIiwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfZGVmYXVsdHMiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9idCJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJlbmNobWFyay90aHJlYWRfcGVyZm9ybWFuY2VfYmVuY2htYXJrLmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICBdLAotfQotCi1jY19iZW5jaG1hcmsgewotICAgIG5hbWU6ICJibHVldG9vdGhfYmVuY2htYXJrX3RpbWVyX3BlcmZvcm1hbmNlIiwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfZGVmYXVsdHMiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vYnQiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJiZW5jaG1hcmsvdGltZXJfcGVyZm9ybWFuY2VfYmVuY2htYXJrLmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9jb21tb24vQlVJTEQuZ24gYi9jb21tb24vQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmZiZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zdGF0aWNfbGlicmFyeSgiY29tbW9uIikgewotICBzb3VyY2VzID0gWwotICAgICJhZGRyZXNzX29iZnVzY2F0b3IuY2MiLAotICAgICJtZXNzYWdlX2xvb3BfdGhyZWFkLmNjIiwKLSAgICAibWV0cmljX2lkX2FsbG9jYXRvci5jYyIsCi0gICAgIm1ldHJpY3NfbGludXguY2MiLAotICAgICJvbmNlX3RpbWVyLmNjIiwKLSAgICAib3NfdXRpbHMuY2MiLAotICAgICJyZXBlYXRpbmdfdGltZXIuY2MiLAotICAgICJzdG9wX3dhdGNoX2xlZ2FjeS5jYyIsCi0gICAgInRpbWVfdXRpbC5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQvIiwKLSAgICAiLy9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAiLy9idC9saW51eF9pbmNsdWRlIiwKLSAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQ6bGliYnQtcGxhdGZvcm0tcHJvdG9zLWxpdGUiLAotICAgICIvL2J0L2dkL3J1c3Qvc2hpbTppbml0X2ZsYWdzX2JyaWRnZV9oZWFkZXIiLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0OnRhcmdldF9kZWZhdWx0cyIgXQotfQotCi1pZiAodXNlLnRlc3QpIHsKLSAgZXhlY3V0YWJsZSgiYmx1ZXRvb3RoX3Rlc3RfY29tbW9uIikgewotICAgIHNvdXJjZXMgPSBbCi0gICAgICAibGVha3lfYm9uZGVkX3F1ZXVlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJzdGF0ZV9tYWNoaW5lX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0aW1lX3V0aWxfdW5pdHRlc3QuY2MiLAotICAgIF0KLQotICAgIGluY2x1ZGVfZGlycyA9IFsKLSAgICAgICIvL2J0LyIsCi0gICAgICAiLy9idC9jb21tb24iLAotICAgIF0KLQotICAgIGRlcHMgPSBbICIvL2J0L2NvbW1vbiIgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9ndGVzdF9tYWluIiwKLSAgICAgICIvL2J0OmV4dGVybmFsX2dtb2NrX21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0KLSAgICBsaWJzID0gWwotICAgICAgInB0aHJlYWQiLAotICAgICAgInJ0IiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3IuY2MgYi9jb21tb24vYWRkcmVzc19vYmZ1c2NhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODAzNTIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJhZGRyZXNzX29iZnVzY2F0b3IuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi1ib29sIEFkZHJlc3NPYmZ1c2NhdG9yOjpJc1NhbHRWYWxpZChjb25zdCBPY3RldDMyJiBzYWx0XzI1NmJpdCkgewotICByZXR1cm4gIXN0ZDo6YWxsX29mKHNhbHRfMjU2Yml0LmJlZ2luKCksIHNhbHRfMjU2Yml0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgIFtdKHVpbnQ4X3QgaSkgeyByZXR1cm4gaSA9PSAwOyB9KTsKLX0KLQotdm9pZCBBZGRyZXNzT2JmdXNjYXRvcjo6SW5pdGlhbGl6ZShjb25zdCBPY3RldDMyJiBzYWx0XzI1NmJpdCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soaW5zdGFuY2VfbXV0ZXhfKTsKLSAgc2FsdF8yNTZiaXRfID0gc2FsdF8yNTZiaXQ7Ci19Ci0KLWJvb2wgQWRkcmVzc09iZnVzY2F0b3I6OklzSW5pdGlhbGl6ZWQoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhpbnN0YW5jZV9tdXRleF8pOwotICByZXR1cm4gSXNTYWx0VmFsaWQoc2FsdF8yNTZiaXRfKTsKLX0KLQotc3RkOjpzdHJpbmcgQWRkcmVzc09iZnVzY2F0b3I6Ok9iZnVzY2F0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhpbnN0YW5jZV9tdXRleF8pOwotICBDSEVDSyhJc0luaXRpYWxpemVkKCkpOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIEVWUF9NQVhfTURfU0laRT4gcmVzdWx0ID0ge307Ci0gIHVuc2lnbmVkIGludCBvdXRfbGVuID0gMDsKLSAgQ0hFQ0soOjpITUFDKEVWUF9zaGEyNTYoKSwgc2FsdF8yNTZiaXRfLmRhdGEoKSwgc2FsdF8yNTZiaXRfLnNpemUoKSwKLSAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcywgYWRkcmVzcy5rTGVuZ3RoLCByZXN1bHQuZGF0YSgpLAotICAgICAgICAgICAgICAgJm91dF9sZW4pICE9IG51bGxwdHIpOwotICBDSEVDS19FUShvdXRfbGVuLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtPY3RldDMyTGVuZ3RoKSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXN1bHQuZGF0YSgpKSwgb3V0X2xlbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2NvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3IuaCBiL2NvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlN2RjMi4uMDAwMDAwMAotLS0gYS9jb21tb24vYWRkcmVzc19vYmZ1c2NhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotY2xhc3MgQWRkcmVzc09iZnVzY2F0b3IgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga09jdGV0MzJMZW5ndGggPSAzMjsKLSAgdXNpbmcgT2N0ZXQzMiA9IHN0ZDo6YXJyYXk8dWludDhfdCwga09jdGV0MzJMZW5ndGg+OwotICBzdGF0aWMgQWRkcmVzc09iZnVzY2F0b3IqIEdldEluc3RhbmNlKCkgewotICAgIHN0YXRpYyBhdXRvIGluc3RhbmNlID0gbmV3IEFkZHJlc3NPYmZ1c2NhdG9yKCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBpbnB1dCBzYWx0IGlzIHZhbGlkCi0gICAqIENyaXRlcmlhOgotICAgKiAtIFNhbHQgbXVzdCBiZSBub24temVybwotICAgKgotICAgKiBAcGFyYW0gc2FsdF8yNTZiaXQKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzYWx0IGlzIHZhbGlkCi0gICAqLwotICBzdGF0aWMgYm9vbCBJc1NhbHRWYWxpZChjb25zdCBPY3RldDMyJiBzYWx0XzI1NmJpdCk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhpcyBvYmZ1c2NhdG9yIHdpdGggbmVjZXNzYXJ5IHBhcmFtZXRlcnMKLSAgICoKLSAgICogQHBhcmFtIHNhbHRfMjU2Yml0IGEgMjU2IGJpdCBzYWx0IHVzZWQgdG8gaGFzaCB0aGUgZml4ZWQgbGVuZ3RoIGFkZHJlc3MKLSAgICovCi0gIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBPY3RldDMyJiBzYWx0XzI1NmJpdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIEluaXRpYWxpemUoKSB3YXMgY2FsbGVkIGVhcmxpZXIKLSAgICovCi0gIGJvb2wgSXNJbml0aWFsaXplZCgpOwotCi0gIC8qKgotICAgKiBPYmZ1c2NhdGUgQmx1ZXRvb3RoIE1BQyBhZGRyZXNzIGludG8gYW4gYW5vbnltb3VzIElEIHN0cmluZwotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBCbHVldG9vdGggTUFDIGFkZHJlc3MgdG8gYmUgb2JmdXNjYXRlZAotICAgKiBAcmV0dXJuIHRoZSBvYmZ1c2NhdGVkIE1BQyBhZGRyZXNzIGluIDI1NiBiaXQKLSAgICovCi0gIHN0ZDo6c3RyaW5nIE9iZnVzY2F0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKTsKLQotIHByaXZhdGU6Ci0gIEFkZHJlc3NPYmZ1c2NhdG9yKCkgOiBzYWx0XzI1NmJpdF8oezB9KSB7fQotICBPY3RldDMyIHNhbHRfMjU2Yml0XzsKLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggaW5zdGFuY2VfbXV0ZXhfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3JfdW5pdHRlc3QuY2MgYi9jb21tb24vYWRkcmVzc19vYmZ1c2NhdG9yX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE1N2RlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3JfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWRkcmVzc19vYmZ1c2NhdG9yLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkFkZHJlc3NPYmZ1c2NhdG9yOwotCi1jb25zdGV4cHIgQWRkcmVzc09iZnVzY2F0b3I6Ok9jdGV0MzIga0VtcHR5S2V5ID0gezB9OwotCi1jb25zdGV4cHIgQWRkcmVzc09iZnVzY2F0b3I6Ok9jdGV0MzIga1Rlc3RLZXkxID0gewotICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCi0gICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKLSAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAotfTsKLXN0YXRpYyBSYXdBZGRyZXNzIGtUZXN0RGF0YTEgPSB7ezB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmZ9fTsKLWNvbnN0ZXhwciBBZGRyZXNzT2JmdXNjYXRvcjo6T2N0ZXQzMiBrVGVzdFJlc3VsdFJhdzEgPSB7Ci0gICAgMHg5YiwgMHg1MiwgMHhiOSwgMHhiOSwgMHhiOSwgMHgzNCwgMHg4MCwgMHgxZCwgMHg5OCwgMHgwYiwgMHgxMCwKLSAgICAweGJlLCAweDQ1LCAweGEyLCAweDZkLCAweGFhLCAweDk5LCAweGMzLCAweDA0LCAweDEwLCAweDA4LCAweDAzLAotICAgIDB4YjcsIDB4YjQsIDB4YTksIDB4ZGUsIDB4Y2YsIDB4ODksIDB4ZTEsIDB4NWQsIDB4ZDQsIDB4YWF9Owotc3RhdGljIHN0ZDo6c3RyaW5nIGtUZXN0UmVzdWx0MSgKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihrVGVzdFJlc3VsdFJhdzEuZGF0YSgpKSwKLSAgICBrVGVzdFJlc3VsdFJhdzEuc2l6ZSgpKTsKLQotY29uc3RleHByIEFkZHJlc3NPYmZ1c2NhdG9yOjpPY3RldDMyIGtUZXN0S2V5MiA9IHsKLSAgICAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAotICAgIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsCi0gICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMH07Ci0KLXN0YXRpYyBSYXdBZGRyZXNzIGtUZXN0RGF0YTJfMSA9IHt7MHg5ZSwgMHhmNSwgMHgzZCwgMHg2YywgMHgyZSwgMHgzM319OwotY29uc3RleHByIEFkZHJlc3NPYmZ1c2NhdG9yOjpPY3RldDMyIGtUZXN0UmVzdWx0UmF3Ml8xID0gewotICAgIDB4YjQsIDB4ZTIsIDB4ZmMsIDB4YjksIDB4NTksIDB4MGQsIDB4MWYsIDB4Y2YsIDB4NjgsIDB4ODAsIDB4YjIsCi0gICAgMHgzZCwgMHgwOCwgMHg1NSwgMHg0ZSwgMHg2NCwgMHhmNSwgMHgzYiwgMHgzMywgMHgwZCwgMHhiNiwgMHgzMSwKLSAgICAweDlhLCAweGJjLCAweDRlLCAweGNlLCAweDYxLCAweGJkLCAweDQ2LCAweDY2LCAweDQ1LCAweDk0fTsKLXN0YXRpYyBzdGQ6OnN0cmluZyBrVGVzdFJlc3VsdDJfMSgKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihrVGVzdFJlc3VsdFJhdzJfMS5kYXRhKCkpLAotICAgIGtUZXN0UmVzdWx0UmF3Ml8xLnNpemUoKSk7Ci0KLXN0YXRpYyBSYXdBZGRyZXNzIGtUZXN0RGF0YTJfMiA9IHt7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH19OwotY29uc3RleHByIEFkZHJlc3NPYmZ1c2NhdG9yOjpPY3RldDMyIGtUZXN0UmVzdWx0UmF3Ml8yID0gewotICAgIDB4ZDQsIDB4ZDgsIDB4MjMsIDB4YzAsIDB4MjQsIDB4YmEsIDB4ZGUsIDB4ZTMsIDB4MWMsIDB4YWQsIDB4ODQsCi0gICAgMHg4YiwgMHgzZCwgMHhjNiwgMHhkYSwgMHg5MywgMHg4OCwgMHhiMiwgMHg1YywgMHg2MCwgMHgxMywgMHhlNSwKLSAgICAweGUyLCAweDNlLCAweDc1LCAweDVmLCAweGQ3LCAweDE1LCAweDU2LCAweGY3LCAweGFmLCAweDI3fTsKLXN0YXRpYyBzdGQ6OnN0cmluZyBrVGVzdFJlc3VsdDJfMigKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihrVGVzdFJlc3VsdFJhdzJfMi5kYXRhKCkpLAotICAgIGtUZXN0UmVzdWx0UmF3Ml8yLnNpemUoKSk7Ci0KLXN0YXRpYyBSYXdBZGRyZXNzIGtUZXN0RGF0YTJfMyA9IHt7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn19OwotY29uc3RleHByIEFkZHJlc3NPYmZ1c2NhdG9yOjpPY3RldDMyIGtUZXN0UmVzdWx0UmF3Ml8zID0gewotICAgIDB4NmYsIDB4N2MsIDB4M2QsIDB4MjMsIDB4Y2MsIDB4N2EsIDB4ZjIsIDB4NjgsIDB4ZWUsIDB4ZTgsIDB4NmMsCi0gICAgMHgwZiwgMHhiNSwgMHhlMCwgMHgwYywgMHg4OCwgMHhmNiwgMHgzOCwgMHg3MSwgMHg0NCwgMHg4OCwgMHgwOSwKLSAgICAweDQ1LCAweDBhLCAweGEyLCAweGQ3LCAweGY2LCAweDcwLCAweGJhLCAweDhjLCAweGU5LCAweDc5fTsKLXN0YXRpYyBzdGQ6OnN0cmluZyBrVGVzdFJlc3VsdDJfMygKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihrVGVzdFJlc3VsdFJhdzJfMy5kYXRhKCkpLAotICAgIGtUZXN0UmVzdWx0UmF3Ml8zLnNpemUoKSk7Ci0KLVRFU1QoQWRkcmVzc09iZnVzY2F0b3JUZXN0LCB0ZXN0X2ludmFsaWRfa2V5KSB7Ci0gIEVYUEVDVF9GQUxTRShBZGRyZXNzT2JmdXNjYXRvcjo6SXNTYWx0VmFsaWQoa0VtcHR5S2V5KSk7Ci19Ci0KLVRFU1QoQWRkcmVzc09iZnVzY2F0b3JUZXN0LCB0ZXN0X3ZhbGlkX2tleSkgewotICBFWFBFQ1RfVFJVRShBZGRyZXNzT2JmdXNjYXRvcjo6SXNTYWx0VmFsaWQoa1Rlc3RLZXkxKSk7Ci19Ci0KLVRFU1QoQWRkcmVzc09iZnVzY2F0b3JUZXN0LCB0ZXN0X2luaXRpYWxpemVfbmVnYXRpdmUpIHsKLSAgQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPkluaXRpYWxpemUoa0VtcHR5S2V5KTsKLSAgRVhQRUNUX0ZBTFNFKEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5Jc0luaXRpYWxpemVkKCkpOwotfQotCi1URVNUKEFkZHJlc3NPYmZ1c2NhdG9yVGVzdCwgdGVzdF9pbml0aWFsaXplX3Bvc2l0aXZlKSB7Ci0gIEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5Jbml0aWFsaXplKGtUZXN0S2V5MSk7Ci0gIEVYUEVDVF9UUlVFKEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5Jc0luaXRpYWxpemVkKCkpOwotfQotCi1URVNUKEFkZHJlc3NPYmZ1c2NhdG9yVGVzdCwgdGVzdF9vYmZ1c2NhdGVfYWRkcmVzc19rZXkxKSB7Ci0gIEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5Jbml0aWFsaXplKGtUZXN0S2V5MSk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoa1Rlc3REYXRhMSk7Ci0gIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCBBZGRyZXNzT2JmdXNjYXRvcjo6a09jdGV0MzJMZW5ndGgpOwotICBFWFBFQ1RfRVEocmVzdWx0LCBrVGVzdFJlc3VsdDEpOwotfQotCi1URVNUKEFkZHJlc3NPYmZ1c2NhdG9yVGVzdCwgdGVzdF9vYmZ1c2NhdGVfYWRkcmVzc19rZXkyKSB7Ci0gIEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5Jbml0aWFsaXplKGtUZXN0S2V5Mik7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9Ci0gICAgICBBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+T2JmdXNjYXRlKGtUZXN0RGF0YTJfMSk7Ci0gIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCBBZGRyZXNzT2JmdXNjYXRvcjo6a09jdGV0MzJMZW5ndGgpOwotICBFWFBFQ1RfRVEocmVzdWx0LCBrVGVzdFJlc3VsdDJfMSk7Ci19Ci0KLVRFU1QoQWRkcmVzc09iZnVzY2F0b3JUZXN0LCB0ZXN0X29iZnVzY2F0ZV9hZGRyZXNzX2tleTJfZW1wdHlfYWRkZHJlc3MpIHsKLSAgQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPkluaXRpYWxpemUoa1Rlc3RLZXkyKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0KLSAgICAgIEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoa1Rlc3REYXRhMl8yKTsKLSAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIEFkZHJlc3NPYmZ1c2NhdG9yOjprT2N0ZXQzMkxlbmd0aCk7Ci0gIEVYUEVDVF9FUShyZXN1bHQsIGtUZXN0UmVzdWx0Ml8yKTsKLX0KLQotVEVTVChBZGRyZXNzT2JmdXNjYXRvclRlc3QsIHRlc3Rfb2JmdXNjYXRlX2FkZHJlc3Nfa2V5Ml9tYXhfYWRkcmVzcykgewotICBBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+SW5pdGlhbGl6ZShrVGVzdEtleTIpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgICAgQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPk9iZnVzY2F0ZShrVGVzdERhdGEyXzMpOwotICBFWFBFQ1RfRVEocmVzdWx0LnNpemUoKSwgQWRkcmVzc09iZnVzY2F0b3I6OmtPY3RldDMyTGVuZ3RoKTsKLSAgRVhQRUNUX0VRKHJlc3VsdCwga1Rlc3RSZXN1bHQyXzMpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2Jhc2VfYmluZF91bml0dGVzdC5jYyBiL2NvbW1vbi9iYXNlX2JpbmRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNGQwNjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2Jhc2VfYmluZF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN5cy9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8c3lzY2FsbC5oPgotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotCi1jbGFzcyBCYXNlQmluZFRocmVhZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gcHJvdGVjdGVkOgotfTsKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBWYXJzIHsKLSAgaW50IGF7MH07Ci0gIGludCBiezB9OwotICBpbnQgY3swfTsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgVmFycyYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIChhID09IHJocy5hICYmIGIgPT0gcmhzLmIgJiYgYyA9PSByaHMuYyk7Ci0gIH0KLQotfSBnX3ZhcnM7Ci0KLXZvaWQgZnVuYygpIHt9Ci12b2lkIGZ1bmNfYShpbnQgYSkgeyBnX3ZhcnMuYSA9IGE7IH0KLXZvaWQgZnVuY19hYihpbnQgYSwgaW50IGIpIHsKLSAgZnVuY19hKGEpOwotICBnX3ZhcnMuYiA9IGI7Ci19Ci12b2lkIGZ1bmNfYWJjKGludCBhLCBpbnQgYiwgaW50IGMpIHsKLSAgZnVuY19hYihhLCBiKTsKLSAgZ192YXJzLmMgPSBjOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1RfRihCYXNlQmluZFRocmVhZFRlc3QsIHNpbXBsZSkgewotICBzdHJ1Y3QgVmFycyB2OwotICBnX3ZhcnMgPSB7fTsKLSAgYmFzZTo6Q2FsbGJhY2s8dm9pZCgpPiBjYjAgPSBiYXNlOjpCaW5kKCZmdW5jKTsKLSAgY2IwLlJ1bigpOwotICBBU1NFUlRfRVEoZ192YXJzLCB2KTsKLQotICB2ID0ge307Ci0gIHYuYSA9IDE7Ci0gIGdfdmFycyA9IHt9OwotICBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IGNiMSA9IGJhc2U6OkJpbmQoJmZ1bmNfYSwgMSk7Ci0gIGNiMS5SdW4oKTsKLSAgQVNTRVJUX0VRKGdfdmFycywgdik7Ci0KLSAgdiA9IHt9OwotICB2LmEgPSAxOwotICB2LmIgPSAyOwotICBnX3ZhcnMgPSB7fTsKLSAgYmFzZTo6Q2FsbGJhY2s8dm9pZCgpPiBjYjIgPSBiYXNlOjpCaW5kKCZmdW5jX2FiLCAxLCAyKTsKLSAgY2IyLlJ1bigpOwotICBBU1NFUlRfRVEoZ192YXJzLCB2KTsKLQotICB2ID0ge307Ci0gIHYuYSA9IDE7Ci0gIHYuYiA9IDI7Ci0gIHYuYyA9IDM7Ci0gIGdfdmFycyA9IHt9OwotICBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IGNiMyA9IGJhc2U6OkJpbmQoJmZ1bmNfYWJjLCAxLCAyLCAzKTsKLSAgY2IzLlJ1bigpOwotICBBU1NFUlRfRVEoZ192YXJzLCB2KTsKLX0KLQotVEVTVF9GKEJhc2VCaW5kVGhyZWFkVGVzdCwgYmluZF9maXJzdF9hcmcpIHsKLSAgc3RydWN0IFZhcnMgdjsKLSAgZ192YXJzID0ge307Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQoKT4gY2IwID0gYmFzZTo6QmluZCgmZnVuYyk7Ci0gIGNiMC5SdW4oKTsKLSAgQVNTRVJUX0VRKGdfdmFycywgdik7Ci0KLSAgdiA9IHt9OwotICB2LmEgPSAxOwotICBnX3ZhcnMgPSB7fTsKLSAgYmFzZTo6Q2FsbGJhY2s8dm9pZCgpPiBjYjEgPSBiYXNlOjpCaW5kKCZmdW5jX2EsIDEpOwotICBjYjEuUnVuKCk7Ci0gIEFTU0VSVF9FUShnX3ZhcnMsIHYpOwotCi0gIHYgPSB7fTsKLSAgdi5hID0gMTsKLSAgdi5iID0gMjsKLSAgZ192YXJzID0ge307Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQoaW50KT4gY2IyID0gYmFzZTo6QmluZCgmZnVuY19hYiwgMSk7Ci0gIGNiMi5SdW4oMik7Ci0gIEFTU0VSVF9FUShnX3ZhcnMsIHYpOwotCi0gIHYgPSB7fTsKLSAgdi5hID0gMTsKLSAgdi5iID0gMjsKLSAgdi5jID0gMzsKLSAgZ192YXJzID0ge307Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQoaW50LCBpbnQpPiBjYjMgPSBiYXNlOjpCaW5kKCZmdW5jX2FiYywgMSk7Ci0gIGNiMy5SdW4oMiwgMyk7Ci0gIEFTU0VSVF9FUShnX3ZhcnMsIHYpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2JlbmNobWFyay90aHJlYWRfcGVyZm9ybWFuY2VfYmVuY2htYXJrLmNjIGIvY29tbW9uL2JlbmNobWFyay90aHJlYWRfcGVyZm9ybWFuY2VfYmVuY2htYXJrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTM4ZGFjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9iZW5jaG1hcmsvdGhyZWFkX3BlcmZvcm1hbmNlX2JlbmNobWFyay5jYworKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9ydW5fbG9vcC5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZC5oPgotI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgImFic3RyYWN0X21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLQotdXNpbmcgOjpiZW5jaG1hcms6OlN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotCi0jZGVmaW5lIE5VTV9NRVNTQUdFU19UT19TRU5EIDEwMDAwMAotCi12b2xhdGlsZSBzdGF0aWMgaW50IGdfY291bnRlciA9IDA7Ci1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gZ19jb3VudGVyX3Byb21pc2UgPSBudWxscHRyOwotCi12b2lkIHB0aHJlYWRfY2FsbGJhY2tfYmF0Y2godm9pZCogY29udGV4dCkgewotICBhdXRvIHF1ZXVlID0gc3RhdGljX2Nhc3Q8Zml4ZWRfcXVldWVfdCo+KGNvbnRleHQpOwotICBDSEVDS19ORShxdWV1ZSwgbnVsbHB0cik7Ci0gIGZpeGVkX3F1ZXVlX2RlcXVldWUocXVldWUpOwotICBnX2NvdW50ZXIrKzsKLSAgaWYgKGdfY291bnRlciA+PSBOVU1fTUVTU0FHRVNfVE9fU0VORCkgewotICAgIGdfY291bnRlcl9wcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgfQotfQotCi12b2lkIGNhbGxiYWNrX3NlcXVlbnRpYWwodm9pZCogY29udGV4dCkgeyBnX2NvdW50ZXJfcHJvbWlzZS0+c2V0X3ZhbHVlKCk7IH0KLQotdm9pZCBjYWxsYmFja19zZXF1ZW50aWFsX3F1ZXVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCB2b2lkKiBjb250ZXh0KSB7Ci0gIENIRUNLX05FKHF1ZXVlLCBudWxscHRyKTsKLSAgZml4ZWRfcXVldWVfZGVxdWV1ZShxdWV1ZSk7Ci0gIGdfY291bnRlcl9wcm9taXNlLT5zZXRfdmFsdWUoKTsKLX0KLQotdm9pZCBjYWxsYmFja19iYXRjaChmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgewotICBDSEVDS19ORShxdWV1ZSwgbnVsbHB0cik7Ci0gIGZpeGVkX3F1ZXVlX2RlcXVldWUocXVldWUpOwotICBnX2NvdW50ZXIrKzsKLSAgaWYgKGdfY291bnRlciA+PSBOVU1fTUVTU0FHRVNfVE9fU0VORCkgewotICAgIGdfY291bnRlcl9wcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgfQotfQotCi1jbGFzcyBCTV9UaHJlYWRQZXJmb3JtYW5jZSA6IHB1YmxpYyA6OmJlbmNobWFyazo6Rml4dHVyZSB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIGJlbmNobWFyazo6Rml4dHVyZTo6U2V0VXAoc3QpOwotICAgIHNldF91cF9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIGdfY291bnRlciA9IDA7Ci0gICAgYnRfbXNnX3F1ZXVlXyA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIH0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBmaXhlZF9xdWV1ZV9mcmVlKGJ0X21zZ19xdWV1ZV8sIG51bGxwdHIpOwotICAgIGJ0X21zZ19xdWV1ZV8gPSBudWxscHRyOwotICAgIHNldF91cF9wcm9taXNlXy5yZXNldChudWxscHRyKTsKLSAgICBnX2NvdW50ZXJfcHJvbWlzZS5yZXNldChudWxscHRyKTsKLSAgICBiZW5jaG1hcms6OkZpeHR1cmU6OlRlYXJEb3duKHN0KTsKLSAgfQotICBmaXhlZF9xdWV1ZV90KiBidF9tc2dfcXVldWVfID0gbnVsbHB0cjsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gc2V0X3VwX3Byb21pc2VfOwotfTsKLQotY2xhc3MgQk1fTWVzc2FnZUxvb3AgOiBwdWJsaWMgQk1fVGhyZWFkUGVyZm9ybWFuY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUnVuVGhyZWFkKHZvaWQqIGNvbnRleHQpIHsKLSAgICBhdXRvIHRlc3QgPSBzdGF0aWNfY2FzdDxCTV9NZXNzYWdlTG9vcCo+KGNvbnRleHQpOwotICAgIHRlc3QtPlJ1bk1lc3NhZ2VMb29wKCk7Ci0gIH0KLSAgc3RhdGljIHZvaWQqIFJ1blBUaHJlYWQodm9pZCogY29udGV4dCkgewotICAgIGF1dG8gdGVzdCA9IHN0YXRpY19jYXN0PEJNX01lc3NhZ2VMb29wKj4oY29udGV4dCk7Ci0gICAgdGVzdC0+UnVuTWVzc2FnZUxvb3AoKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICB2b2lkIFJ1bk1lc3NhZ2VMb29wKCkgewotICAgIG1lc3NhZ2VfbG9vcF8gPSBuZXcgYnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wKCk7Ci0gICAgcnVuX2xvb3BfID0gbmV3IGJhc2U6OlJ1bkxvb3AoKTsKLSAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzZXRfdXBfcHJvbWlzZV8uZ2V0KCkpKSk7Ci0gICAgcnVuX2xvb3BfLT5SdW4oKTsKLSAgICBkZWxldGUgbWVzc2FnZV9sb29wXzsKLSAgICBtZXNzYWdlX2xvb3BfID0gbnVsbHB0cjsKLSAgICBkZWxldGUgcnVuX2xvb3BfOwotICAgIHJ1bl9sb29wXyA9IG51bGxwdHI7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3BfID0gbnVsbHB0cjsKLSAgYmFzZTo6UnVuTG9vcCogcnVuX2xvb3BfID0gbnVsbHB0cjsKLX07Ci0KLWNsYXNzIEJNX01lc3NhZ2VMb29wT3NpVGhyZWFkIDogcHVibGljIEJNX01lc3NhZ2VMb29wIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgQk1fTWVzc2FnZUxvb3A6OlNldFVwKHN0KTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBzZXRfdXBfZnV0dXJlID0gc2V0X3VwX3Byb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gICAgdGhyZWFkXyA9IHRocmVhZF9uZXcoIkJNX01lc3NhZ2VMb29wT25Pc2lUaHJlYWQgdGhyZWFkIik7Ci0gICAgdGhyZWFkX3Bvc3QodGhyZWFkXywgJkJNX01lc3NhZ2VMb29wOjpSdW5UaHJlYWQsIHRoaXMpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2xvb3BfLT5RdWl0V2hlbklkbGVDbG9zdXJlKCkpOwotICAgIHRocmVhZF9mcmVlKHRocmVhZF8pOwotICAgIHRocmVhZF8gPSBudWxscHRyOwotICAgIEJNX01lc3NhZ2VMb29wOjpUZWFyRG93bihzdCk7Ci0gIH0KLQotICB0aHJlYWRfdCogdGhyZWFkXyA9IG51bGxwdHI7Ci19OwotCi1CRU5DSE1BUktfRihCTV9NZXNzYWdlTG9vcE9zaVRocmVhZCwgYmF0Y2hfZW5xdWVfZGVxdWV1ZSkoU3RhdGUmIHN0YXRlKSB7Ci0gIGZvciAoYXV0byBfIDogc3RhdGUpIHsKLSAgICBnX2NvdW50ZXIgPSAwOwotICAgIGdfY291bnRlcl9wcm9taXNlID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX01FU1NBR0VTX1RPX1NFTkQ7IGkrKykgewotICAgICAgZml4ZWRfcXVldWVfZW5xdWV1ZShidF9tc2dfcXVldWVfLCAodm9pZCopJmdfY291bnRlcik7Ci0gICAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZjYWxsYmFja19iYXRjaCwgYnRfbXNnX3F1ZXVlXywgbnVsbHB0cikpOwotICAgIH0KLSAgICBjb3VudGVyX2Z1dHVyZS53YWl0KCk7Ci0gIH0KLX07Ci0KLUJFTkNITUFSS19GKEJNX01lc3NhZ2VMb29wT3NpVGhyZWFkLCBzZXF1ZW50aWFsX2V4ZWN1dGlvbikoU3RhdGUmIHN0YXRlKSB7Ci0gIGZvciAoYXV0byBfIDogc3RhdGUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGdfY291bnRlcl9wcm9taXNlID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGdfY291bnRlcl9wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0gICAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZjYWxsYmFja19zZXF1ZW50aWFsLCBudWxscHRyKSk7Ci0gICAgICBjb3VudGVyX2Z1dHVyZS53YWl0KCk7Ci0gICAgfQotICB9Ci19OwotCi1jbGFzcyBCTV9NZXNzYWdlTG9vcFN0bFRocmVhZCA6IHB1YmxpYyBCTV9NZXNzYWdlTG9vcCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIEJNX01lc3NhZ2VMb29wOjpTZXRVcChzdCk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gc2V0X3VwX2Z1dHVyZSA9IHNldF91cF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIHRocmVhZF8gPSBuZXcgc3RkOjp0aHJlYWQoJkJNX01lc3NhZ2VMb29wOjpSdW5UaHJlYWQsIHRoaXMpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2xvb3BfLT5RdWl0V2hlbklkbGVDbG9zdXJlKCkpOwotICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgICB0aHJlYWRfID0gbnVsbHB0cjsKLSAgICBCTV9NZXNzYWdlTG9vcDo6VGVhckRvd24oc3QpOwotICB9Ci0KLSAgc3RkOjp0aHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotfTsKLQotQkVOQ0hNQVJLX0YoQk1fTWVzc2FnZUxvb3BTdGxUaHJlYWQsIGJhdGNoX2VucXVlX2RlcXVldWUpKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZ19jb3VudGVyID0gMDsKLSAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gZ19jb3VudGVyX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICAgICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmY2FsbGJhY2tfYmF0Y2gsIGJ0X21zZ19xdWV1ZV8sIG51bGxwdHIpKTsKLSAgICB9Ci0gICAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotICB9Ci19OwotCi1CRU5DSE1BUktfRihCTV9NZXNzYWdlTG9vcFN0bFRocmVhZCwgc2VxdWVudGlhbF9leGVjdXRpb24pKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTUVTU0FHRVNfVE9fU0VORDsgaSsrKSB7Ci0gICAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgICAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotICAgICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmY2FsbGJhY2tfc2VxdWVudGlhbCwgbnVsbHB0cikpOwotICAgICAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotICAgIH0KLSAgfQotfTsKLQotY2xhc3MgQk1fTWVzc2FnZUxvb3BQb3NpeFRocmVhZCA6IHB1YmxpYyBCTV9NZXNzYWdlTG9vcCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIEJNX01lc3NhZ2VMb29wOjpTZXRVcChzdCk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gc2V0X3VwX2Z1dHVyZSA9IHNldF91cF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfLCBudWxscHRyLCAmQk1fTWVzc2FnZUxvb3A6OlJ1blBUaHJlYWQsICh2b2lkKil0aGlzKTsKLSAgICBzZXRfdXBfZnV0dXJlLndhaXQoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sb29wXy0+UXVpdFdoZW5JZGxlQ2xvc3VyZSgpKTsKLSAgICBwdGhyZWFkX2pvaW4odGhyZWFkXywgbnVsbHB0cik7Ci0gICAgQk1fTWVzc2FnZUxvb3A6OlRlYXJEb3duKHN0KTsKLSAgfQotCi0gIHB0aHJlYWRfdCB0aHJlYWRfID0gLTE7Ci19OwotCi1CRU5DSE1BUktfRihCTV9NZXNzYWdlTG9vcFBvc2l4VGhyZWFkLCBiYXRjaF9lbnF1ZV9kZXF1ZXVlKShTdGF0ZSYgc3RhdGUpIHsKLSAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgewotICAgIGdfY291bnRlciA9IDA7Ci0gICAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGdfY291bnRlcl9wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTUVTU0FHRVNfVE9fU0VORDsgaSsrKSB7Ci0gICAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGJ0X21zZ19xdWV1ZV8sICh2b2lkKikmZ19jb3VudGVyKTsKLSAgICAgIG1lc3NhZ2VfbG9vcF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJmNhbGxiYWNrX2JhdGNoLCBidF9tc2dfcXVldWVfLCBudWxscHRyKSk7Ci0gICAgfQotICAgIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX0YoQk1fTWVzc2FnZUxvb3BQb3NpeFRocmVhZCwgc2VxdWVudGlhbF9leGVjdXRpb24pKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTUVTU0FHRVNfVE9fU0VORDsgaSsrKSB7Ci0gICAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgICAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotICAgICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmY2FsbGJhY2tfc2VxdWVudGlhbCwgbnVsbHB0cikpOwotICAgICAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotICAgIH0KLSAgfQotfTsKLQotY2xhc3MgQk1fT3NpUmVhY3RvclRocmVhZCA6IHB1YmxpYyBCTV9UaHJlYWRQZXJmb3JtYW5jZSB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIEJNX1RocmVhZFBlcmZvcm1hbmNlOjpTZXRVcChzdCk7Ci0gICAgdGhyZWFkXyA9IHRocmVhZF9uZXcoIkJNX09zaVJlYWN0b3JUaHJlYWQgdGhyZWFkIik7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF9mcmVlKHRocmVhZF8pOwotICAgIHRocmVhZF8gPSBudWxscHRyOwotICAgIEJNX1RocmVhZFBlcmZvcm1hbmNlOjpUZWFyRG93bihzdCk7Ci0gIH0KLQotICB0aHJlYWRfdCogdGhyZWFkXyA9IG51bGxwdHI7Ci19OwotCi1CRU5DSE1BUktfRihCTV9Pc2lSZWFjdG9yVGhyZWFkLCBiYXRjaF9lbnF1ZV9kZXF1ZXVlX3VzaW5nX3RocmVhZF9wb3N0KQotKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZ19jb3VudGVyID0gMDsKLSAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gZ19jb3VudGVyX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICAgICAgdGhyZWFkX3Bvc3QodGhyZWFkXywgcHRocmVhZF9jYWxsYmFja19iYXRjaCwgYnRfbXNnX3F1ZXVlXyk7Ci0gICAgfQotICAgIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX0YoQk1fT3NpUmVhY3RvclRocmVhZCwgc2VxdWVudGlhbF9leGVjdXRpb25fdXNpbmdfdGhyZWFkX3Bvc3QpCi0oU3RhdGUmIHN0YXRlKSB7Ci0gIGZvciAoYXV0byBfIDogc3RhdGUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGdfY291bnRlcl9wcm9taXNlID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGdfY291bnRlcl9wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0gICAgICB0aHJlYWRfcG9zdCh0aHJlYWRfLCBjYWxsYmFja19zZXF1ZW50aWFsLCBudWxscHRyKTsKLSAgICAgIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLUJFTkNITUFSS19GKEJNX09zaVJlYWN0b3JUaHJlYWQsIGJhdGNoX2VucXVlX2RlcXVldWVfdXNpbmdfcmVhY3RvcikKLShTdGF0ZSYgc3RhdGUpIHsKLSAgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZShidF9tc2dfcXVldWVfLCB0aHJlYWRfZ2V0X3JlYWN0b3IodGhyZWFkXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfYmF0Y2gsIG51bGxwdHIpOwotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZ19jb3VudGVyID0gMDsKLSAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gZ19jb3VudGVyX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICAgIH0KLSAgICBjb3VudGVyX2Z1dHVyZS53YWl0KCk7Ci0gIH0KLX07Ci0KLUJFTkNITUFSS19GKEJNX09zaVJlYWN0b3JUaHJlYWQsIHNlcXVlbnRpYWxfZXhlY3V0aW9uX3VzaW5nX3JlYWN0b3IpCi0oU3RhdGUmIHN0YXRlKSB7Ci0gIGZpeGVkX3F1ZXVlX3JlZ2lzdGVyX2RlcXVldWUoYnRfbXNnX3F1ZXVlXywgdGhyZWFkX2dldF9yZWFjdG9yKHRocmVhZF8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3NlcXVlbnRpYWxfcXVldWUsIG51bGxwdHIpOwotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTUVTU0FHRVNfVE9fU0VORDsgaSsrKSB7Ci0gICAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgICAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotICAgICAgZml4ZWRfcXVldWVfZW5xdWV1ZShidF9tc2dfcXVldWVfLCAodm9pZCopJmdfY291bnRlcik7Ci0gICAgICBjb3VudGVyX2Z1dHVyZS53YWl0KCk7Ci0gICAgfQotICB9Ci19OwotCi1jbGFzcyBCTV9NZXNzYWdlTG9vb3BUaHJlYWQgOiBwdWJsaWMgQk1fVGhyZWFkUGVyZm9ybWFuY2UgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBCTV9UaHJlYWRQZXJmb3JtYW5jZTo6U2V0VXAoc3QpOwotICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IHNldF91cF9mdXR1cmUgPSBzZXRfdXBfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXyA9Ci0gICAgICAgIG5ldyBNZXNzYWdlTG9vcFRocmVhZCgiQk1fTWVzc2FnZUxvb29wVGhyZWFkIHRocmVhZCIpOwotICAgIG1lc3NhZ2VfbG9vcF90aHJlYWRfLT5TdGFydFVwKCk7Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8tPkRvSW5UaHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2V0X3VwX3Byb21pc2VfLmdldCgpKSkpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+U2h1dERvd24oKTsKLSAgICBkZWxldGUgbWVzc2FnZV9sb29wX3RocmVhZF87Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8gPSBudWxscHRyOwotICAgIEJNX1RocmVhZFBlcmZvcm1hbmNlOjpUZWFyRG93bihzdCk7Ci0gIH0KLQotICBNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wX3RocmVhZF8gPSBudWxscHRyOwotfTsKLQotQkVOQ0hNQVJLX0YoQk1fTWVzc2FnZUxvb29wVGhyZWFkLCBiYXRjaF9lbnF1ZV9kZXF1ZXVlKShTdGF0ZSYgc3RhdGUpIHsKLSAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgewotICAgIGdfY291bnRlciA9IDA7Ci0gICAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGdfY291bnRlcl9wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTUVTU0FHRVNfVE9fU0VORDsgaSsrKSB7Ci0gICAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGJ0X21zZ19xdWV1ZV8sICh2b2lkKikmZ19jb3VudGVyKTsKLSAgICAgIG1lc3NhZ2VfbG9vcF90aHJlYWRfLT5Eb0luVGhyZWFkKAotICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJmNhbGxiYWNrX2JhdGNoLCBidF9tc2dfcXVldWVfLCBudWxscHRyKSk7Ci0gICAgfQotICAgIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX0YoQk1fTWVzc2FnZUxvb29wVGhyZWFkLCBzZXF1ZW50aWFsX2V4ZWN1dGlvbikoU3RhdGUmIHN0YXRlKSB7Ci0gIGZvciAoYXV0byBfIDogc3RhdGUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGdfY291bnRlcl9wcm9taXNlID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGdfY291bnRlcl9wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0gICAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+RG9JblRocmVhZCgKLSAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZjYWxsYmFja19zZXF1ZW50aWFsLCBudWxscHRyKSk7Ci0gICAgICBjb3VudGVyX2Z1dHVyZS53YWl0KCk7Ci0gICAgfQotICB9Ci19OwotCi1jbGFzcyBCTV9MaWJDaHJvbWVUaHJlYWQgOiBwdWJsaWMgQk1fVGhyZWFkUGVyZm9ybWFuY2UgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBCTV9UaHJlYWRQZXJmb3JtYW5jZTo6U2V0VXAoc3QpOwotICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IHNldF91cF9mdXR1cmUgPSBzZXRfdXBfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgICB0aHJlYWRfID0gbmV3IGJhc2U6OlRocmVhZCgiQk1fTGliQ2hyb21lVGhyZWFkIHRocmVhZCIpOwotICAgIHRocmVhZF8tPlN0YXJ0KCk7Ci0gICAgdGhyZWFkXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2V0X3VwX3Byb21pc2VfLmdldCgpKSkpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfLT5TdG9wKCk7Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gICAgdGhyZWFkXyA9IG51bGxwdHI7Ci0gICAgQk1fVGhyZWFkUGVyZm9ybWFuY2U6OlRlYXJEb3duKHN0KTsKLSAgfQotCi0gIGJhc2U6OlRocmVhZCogdGhyZWFkXyA9IG51bGxwdHI7Ci19OwotCi1CRU5DSE1BUktfRihCTV9MaWJDaHJvbWVUaHJlYWQsIGJhdGNoX2VucXVlX2RlcXVldWUpKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZ19jb3VudGVyID0gMDsKLSAgICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gZ19jb3VudGVyX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICAgICAgdGhyZWFkXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmY2FsbGJhY2tfYmF0Y2gsIGJ0X21zZ19xdWV1ZV8sIG51bGxwdHIpKTsKLSAgICB9Ci0gICAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotICB9Ci19OwotCi1CRU5DSE1BUktfRihCTV9MaWJDaHJvbWVUaHJlYWQsIHNlcXVlbnRpYWxfZXhlY3V0aW9uKShTdGF0ZSYgc3RhdGUpIHsKLSAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX01FU1NBR0VTX1RPX1NFTkQ7IGkrKykgewotICAgICAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gZ19jb3VudGVyX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgICAgIHRocmVhZF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoJmNhbGxiYWNrX3NlcXVlbnRpYWwsIG51bGxwdHIpKTsKLSAgICAgIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAvLyBEaXNhYmxlIExPRygpIG91dHB1dCBmcm9tIGxpYmNocm9tZQotICBsb2dnaW5nOjpMb2dnaW5nU2V0dGluZ3MgbG9nX3NldHRpbmdzOwotICBsb2dfc2V0dGluZ3MubG9nZ2luZ19kZXN0ID0gbG9nZ2luZzo6TG9nZ2luZ0Rlc3RpbmF0aW9uOjpMT0dfTk9ORTsKLSAgQ0hFQ0sobG9nZ2luZzo6SW5pdExvZ2dpbmcobG9nX3NldHRpbmdzKSkgPDwgIkZhaWxlZCB0byBzZXQgdXAgbG9nZ2luZyI7Ci0gIDo6YmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKLSAgaWYgKDo6YmVuY2htYXJrOjpSZXBvcnRVbnJlY29nbml6ZWRBcmd1bWVudHMoYXJnYywgYXJndikpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICA6OmJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2JlbmNobWFyay90aW1lcl9wZXJmb3JtYW5jZV9iZW5jaG1hcmsuY2MgYi9jb21tb24vYmVuY2htYXJrL3RpbWVyX3BlcmZvcm1hbmNlX2JlbmNobWFyay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhYWYwMi4uMDAwMDAwMAotLS0gYS9jb21tb24vYmVuY2htYXJrL3RpbWVyX3BlcmZvcm1hbmNlX2JlbmNobWFyay5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9ydW5fbG9vcC5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZC5oPgotI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgImNvbW1vbi9vbmNlX3RpbWVyLmgiCi0jaW5jbHVkZSAiY29tbW9uL3JlcGVhdGluZ190aW1lci5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotCi11c2luZyA6OmJlbmNobWFyazo6U3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQ7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6T25jZVRpbWVyOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlJlcGVhdGluZ1RpbWVyOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzOwotCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLQotbmFtZXNwYWNlIHsKLXN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIGludD4gZ19tYXA7Ci1zdGQ6OnNoYXJlZF9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBnX3Byb21pc2U7Ci11aW50NjRfdCBnX3N0YXJ0X3RpbWU7Ci1pbnQgZ19zY2hlZHVsZWRfdGFza3M7Ci1pbnQgZ190YXNrX2xlbmd0aDsKLWludCBnX3Rhc2tfaW50ZXJ2YWw7Ci1pbnQgZ190YXNrX2NvdW50ZXI7Ci0KLXZvaWQgVGltZXJGaXJlKHZvaWQqKSB7IGdfcHJvbWlzZS0+c2V0X3ZhbHVlKCk7IH0KLQotdm9pZCBBbGFybVNsZWVwQW5kQ291bnREZWxheWVkVGltZSh2b2lkKikgewotICBhdXRvIGVuZF90aW1lX3VzID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgYXV0byB0aW1lX2FmdGVyX3N0YXJ0X21zID0gKGVuZF90aW1lX3VzIC0gZ19zdGFydF90aW1lKSAvIDEwMDA7Ci0gIGdfdGFza19jb3VudGVyKys7Ci0gIGdfbWFwW3RpbWVfYWZ0ZXJfc3RhcnRfbXMgLSBnX3Rhc2tfY291bnRlciAqIGdfdGFza19pbnRlcnZhbF0rKzsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZ190YXNrX2xlbmd0aCkpOwotICBpZiAoZ190YXNrX2NvdW50ZXIgPj0gZ19zY2hlZHVsZWRfdGFza3MpIHsKLSAgICBnX3Byb21pc2UtPnNldF92YWx1ZSgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBCTV9Pc2lBbGFybVRpbWVyIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgOjpiZW5jaG1hcms6OkZpeHR1cmU6OlNldFVwKHN0KTsKLSAgICBhbGFybV8gPSBhbGFybV9uZXcoIm9zaV9hbGFybV90aW1lcl90ZXN0Iik7Ci0gICAgZ19wcm9taXNlID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIGdfcHJvbWlzZSA9IG51bGxwdHI7Ci0gICAgYWxhcm1fZnJlZShhbGFybV8pOwotICAgIDo6YmVuY2htYXJrOjpGaXh0dXJlOjpUZWFyRG93bihzdCk7Ci0gIH0KLQotICBhbGFybV90KiBhbGFybV8gPSBudWxscHRyOwotfTsKLQotQkVOQ0hNQVJLX0RFRklORV9GKEJNX09zaUFsYXJtVGltZXIsIHRpbWVyX3BlcmZvcm1hbmNlX21zKShTdGF0ZSYgc3RhdGUpIHsKLSAgYXV0byBtaWxsaXNlY29uZHMgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRlLnJhbmdlKDApKTsKLSAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgewotICAgIGF1dG8gc3RhcnRfdGltZV9wb2ludCA9IHRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gICAgYWxhcm1fc2V0KGFsYXJtXywgbWlsbGlzZWNvbmRzLCAmVGltZXJGaXJlLCBudWxscHRyKTsKLSAgICBnX3Byb21pc2UtPmdldF9mdXR1cmUoKS5nZXQoKTsKLSAgICBhdXRvIGVuZF90aW1lX3BvaW50ID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgICBhdXRvIGR1cmF0aW9uID0gZW5kX3RpbWVfcG9pbnQgLSBzdGFydF90aW1lX3BvaW50OwotICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUoZHVyYXRpb24gKiAxZS02KTsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQk1fT3NpQWxhcm1UaW1lciwgdGltZXJfcGVyZm9ybWFuY2VfbXMpCi0gICAgLT5BcmcoMSkKLSAgICAtPkFyZyg1KQotICAgIC0+QXJnKDEwKQotICAgIC0+QXJnKDIwKQotICAgIC0+QXJnKDEwMCkKLSAgICAtPkFyZygxMDAwKQotICAgIC0+QXJnKDIwMDApCi0gICAgLT5JdGVyYXRpb25zKDEpCi0gICAgLT5Vc2VNYW51YWxUaW1lKCk7Ci0KLWNsYXNzIEJNX0FsYXJtVGFza1RpbWVyIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgOjpiZW5jaG1hcms6OkZpeHR1cmU6OlNldFVwKHN0KTsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXyA9IG5ldyBNZXNzYWdlTG9vcFRocmVhZCgidGltZXJfYmVuY2htYXJrIik7Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8tPlN0YXJ0VXAoKTsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+RW5hYmxlUmVhbFRpbWVTY2hlZHVsaW5nKCk7Ci0gICAgb25jZV90aW1lcl8gPSBuZXcgT25jZVRpbWVyKCk7Ci0gICAgcmVwZWF0aW5nX3RpbWVyXyA9IG5ldyBSZXBlYXRpbmdUaW1lcigpOwotICAgIGdfcHJvbWlzZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBnX3Byb21pc2UgPSBudWxscHRyOwotICAgIGRlbGV0ZSBvbmNlX3RpbWVyXzsKLSAgICBvbmNlX3RpbWVyXyA9IG51bGxwdHI7Ci0gICAgZGVsZXRlIHJlcGVhdGluZ190aW1lcl87Ci0gICAgcmVwZWF0aW5nX3RpbWVyXyA9IG51bGxwdHI7Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8tPlNodXREb3duKCk7Ci0gICAgZGVsZXRlIG1lc3NhZ2VfbG9vcF90aHJlYWRfOwotICAgIG1lc3NhZ2VfbG9vcF90aHJlYWRfID0gbnVsbHB0cjsKLSAgICA6OmJlbmNobWFyazo6Rml4dHVyZTo6VGVhckRvd24oc3QpOwotICB9Ci0KLSAgTWVzc2FnZUxvb3BUaHJlYWQqIG1lc3NhZ2VfbG9vcF90aHJlYWRfOwotICBPbmNlVGltZXIqIG9uY2VfdGltZXJfOwotICBSZXBlYXRpbmdUaW1lciogcmVwZWF0aW5nX3RpbWVyXzsKLX07Ci0KLUJFTkNITUFSS19ERUZJTkVfRihCTV9BbGFybVRhc2tUaW1lciwgdGltZXJfcGVyZm9ybWFuY2VfbXMpKFN0YXRlJiBzdGF0ZSkgewotICBhdXRvIG1pbGxpc2Vjb25kcyA9IHN0YXRpY19jYXN0PGludD4oc3RhdGUucmFuZ2UoMCkpOwotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgYXV0byBzdGFydF90aW1lX3BvaW50ID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgICBvbmNlX3RpbWVyXy0+U2NoZWR1bGUobWVzc2FnZV9sb29wX3RocmVhZF8tPkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmVGltZXJGaXJlLCBudWxscHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKG1pbGxpc2Vjb25kcykpOwotICAgIGdfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpLmdldCgpOwotICAgIG9uY2VfdGltZXJfLT5DYW5jZWwoKTsKLSAgICBhdXRvIGVuZF90aW1lX3BvaW50ID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgICBhdXRvIGR1cmF0aW9uID0gZW5kX3RpbWVfcG9pbnQgLSBzdGFydF90aW1lX3BvaW50OwotICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUoZHVyYXRpb24gKiAxZS02KTsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQk1fQWxhcm1UYXNrVGltZXIsIHRpbWVyX3BlcmZvcm1hbmNlX21zKQotICAgIC0+QXJnKDEpCi0gICAgLT5BcmcoNSkKLSAgICAtPkFyZygxMCkKLSAgICAtPkFyZygyMCkKLSAgICAtPkFyZygxMDApCi0gICAgLT5BcmcoMTAwMCkKLSAgICAtPkFyZygyMDAwKQotICAgIC0+SXRlcmF0aW9ucygxKQotICAgIC0+VXNlTWFudWFsVGltZSgpOwotCi1jbGFzcyBCTV9Pc2lQZXJpb2RpY0FsYXJtVGltZXIgOiBwdWJsaWMgOjpiZW5jaG1hcms6OkZpeHR1cmUgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICA6OmJlbmNobWFyazo6Rml4dHVyZTo6U2V0VXAoc3QpOwotICAgIGFsYXJtXyA9IGFsYXJtX25ld19wZXJpb2RpYygib3NpX2FsYXJtX3RpbWVyX3Rlc3QiKTsKLSAgICBnX21hcC5jbGVhcigpOwotICAgIGdfcHJvbWlzZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIGdfc2NoZWR1bGVkX3Rhc2tzID0gMDsKLSAgICBnX3Rhc2tfbGVuZ3RoID0gMDsKLSAgICBnX3Rhc2tfaW50ZXJ2YWwgPSAwOwotICAgIGdfdGFza19jb3VudGVyID0gMDsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgZ19wcm9taXNlID0gbnVsbHB0cjsKLSAgICBhbGFybV9mcmVlKGFsYXJtXyk7Ci0gICAgOjpiZW5jaG1hcms6OkZpeHR1cmU6OlRlYXJEb3duKHN0KTsKLSAgfQotCi0gIGFsYXJtX3QqIGFsYXJtXyA9IG51bGxwdHI7Ci19OwotCi1CRU5DSE1BUktfREVGSU5FX0YoQk1fT3NpUGVyaW9kaWNBbGFybVRpbWVyLCBwZXJpb2RpY19hY2N1cmFjeSkoU3RhdGUmIHN0YXRlKSB7Ci0gIGZvciAoYXV0byBfIDogc3RhdGUpIHsKLSAgICBnX3NjaGVkdWxlZF90YXNrcyA9IHN0YXRlLnJhbmdlKDApOwotICAgIGdfdGFza19sZW5ndGggPSBzdGF0ZS5yYW5nZSgxKTsKLSAgICBnX3Rhc2tfaW50ZXJ2YWwgPSBzdGF0ZS5yYW5nZSgyKTsKLSAgICBnX3N0YXJ0X3RpbWUgPSB0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICAgIGFsYXJtX3NldChhbGFybV8sIGdfdGFza19pbnRlcnZhbCwgJkFsYXJtU2xlZXBBbmRDb3VudERlbGF5ZWRUaW1lLCBudWxscHRyKTsKLSAgICBnX3Byb21pc2UtPmdldF9mdXR1cmUoKS5nZXQoKTsKLSAgICBhbGFybV9jYW5jZWwoYWxhcm1fKTsKLSAgfQotICBmb3IgKGNvbnN0IGF1dG8mIGRlbGF5IDogZ19tYXApIHsKLSAgICBzdGF0ZS5jb3VudGVyc1tzdGQ6OnRvX3N0cmluZyhkZWxheS5maXJzdCldID0gZGVsYXkuc2Vjb25kOwotICB9Ci19OwotCi1CRU5DSE1BUktfUkVHSVNURVJfRihCTV9Pc2lQZXJpb2RpY0FsYXJtVGltZXIsIHBlcmlvZGljX2FjY3VyYWN5KQotICAgIC0+QXJncyh7MjAwMCwgMSwgNX0pCi0gICAgLT5BcmdzKHsyMDAwLCAzLCA1fSkKLSAgICAtPkFyZ3MoezIwMDAsIDEsIDd9KQotICAgIC0+QXJncyh7MjAwMCwgMywgN30pCi0gICAgLT5BcmdzKHsyMDAwLCAxLCAyMH0pCi0gICAgLT5BcmdzKHsyMDAwLCA1LCAyMH0pCi0gICAgLT5BcmdzKHsyMDAwLCAxMCwgMjB9KQotICAgIC0+QXJncyh7MjAwMCwgMTUsIDIwfSkKLSAgICAtPkl0ZXJhdGlvbnMoMSkKLSAgICAtPlVzZVJlYWxUaW1lKCk7Ci0KLWNsYXNzIEJNX0FsYXJtVGFza1BlcmlvZGljVGltZXIgOiBwdWJsaWMgOjpiZW5jaG1hcms6OkZpeHR1cmUgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICA6OmJlbmNobWFyazo6Rml4dHVyZTo6U2V0VXAoc3QpOwotICAgIG1lc3NhZ2VfbG9vcF90aHJlYWRfID0gbmV3IE1lc3NhZ2VMb29wVGhyZWFkKCJ0aW1lcl9iZW5jaG1hcmsiKTsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+U3RhcnRVcCgpOwotICAgIG1lc3NhZ2VfbG9vcF90aHJlYWRfLT5FbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKTsKLSAgICBvbmNlX3RpbWVyXyA9IG5ldyBPbmNlVGltZXIoKTsKLSAgICByZXBlYXRpbmdfdGltZXJfID0gbmV3IFJlcGVhdGluZ1RpbWVyKCk7Ci0gICAgZ19tYXAuY2xlYXIoKTsKLSAgICBnX3Byb21pc2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICBnX3NjaGVkdWxlZF90YXNrcyA9IDA7Ci0gICAgZ190YXNrX2xlbmd0aCA9IDA7Ci0gICAgZ190YXNrX2ludGVydmFsID0gMDsKLSAgICBnX3Rhc2tfY291bnRlciA9IDA7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIGdfcHJvbWlzZSA9IG51bGxwdHI7Ci0gICAgZGVsZXRlIG9uY2VfdGltZXJfOwotICAgIG9uY2VfdGltZXJfID0gbnVsbHB0cjsKLSAgICBkZWxldGUgcmVwZWF0aW5nX3RpbWVyXzsKLSAgICByZXBlYXRpbmdfdGltZXJfID0gbnVsbHB0cjsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+U2h1dERvd24oKTsKLSAgICBkZWxldGUgbWVzc2FnZV9sb29wX3RocmVhZF87Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8gPSBudWxscHRyOwotICAgIDo6YmVuY2htYXJrOjpGaXh0dXJlOjpUZWFyRG93bihzdCk7Ci0gIH0KLQotICBNZXNzYWdlTG9vcFRocmVhZCogbWVzc2FnZV9sb29wX3RocmVhZF87Ci0gIE9uY2VUaW1lciogb25jZV90aW1lcl87Ci0gIFJlcGVhdGluZ1RpbWVyKiByZXBlYXRpbmdfdGltZXJfOwotfTsKLQotQkVOQ0hNQVJLX0RFRklORV9GKEJNX0FsYXJtVGFza1BlcmlvZGljVGltZXIsIHBlcmlvZGljX2FjY3VyYWN5KQotKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgZ19zY2hlZHVsZWRfdGFza3MgPSBzdGF0ZS5yYW5nZSgwKTsKLSAgICBnX3Rhc2tfbGVuZ3RoID0gc3RhdGUucmFuZ2UoMSk7Ci0gICAgZ190YXNrX2ludGVydmFsID0gc3RhdGUucmFuZ2UoMik7Ci0gICAgZ19zdGFydF90aW1lID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgICByZXBlYXRpbmdfdGltZXJfLT5TY2hlZHVsZVBlcmlvZGljKAotICAgICAgICBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+R2V0V2Vha1B0cigpLCBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJkFsYXJtU2xlZXBBbmRDb3VudERlbGF5ZWRUaW1lLCBudWxscHRyKSwKLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGdfdGFza19pbnRlcnZhbCkpOwotICAgIGdfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpLmdldCgpOwotICAgIHJlcGVhdGluZ190aW1lcl8tPkNhbmNlbCgpOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgZGVsYXkgOiBnX21hcCkgewotICAgIHN0YXRlLmNvdW50ZXJzW3N0ZDo6dG9fc3RyaW5nKGRlbGF5LmZpcnN0KV0gPSBkZWxheS5zZWNvbmQ7Ci0gIH0KLX07Ci0KLUJFTkNITUFSS19SRUdJU1RFUl9GKEJNX0FsYXJtVGFza1BlcmlvZGljVGltZXIsIHBlcmlvZGljX2FjY3VyYWN5KQotICAgIC0+QXJncyh7MjAwMCwgMSwgNX0pCi0gICAgLT5BcmdzKHsyMDAwLCAzLCA1fSkKLSAgICAtPkFyZ3MoezIwMDAsIDEsIDd9KQotICAgIC0+QXJncyh7MjAwMCwgMywgN30pCi0gICAgLT5BcmdzKHsyMDAwLCAxLCAyMH0pCi0gICAgLT5BcmdzKHsyMDAwLCA1LCAyMH0pCi0gICAgLT5BcmdzKHsyMDAwLCAxMCwgMjB9KQotICAgIC0+QXJncyh7MjAwMCwgMTUsIDIwfSkKLSAgICAtPkl0ZXJhdGlvbnMoMSkKLSAgICAtPlVzZVJlYWxUaW1lKCk7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAvLyBEaXNhYmxlIExPRygpIG91dHB1dCBmcm9tIGxpYmNocm9tZQotICBsb2dnaW5nOjpMb2dnaW5nU2V0dGluZ3MgbG9nX3NldHRpbmdzOwotICBsb2dfc2V0dGluZ3MubG9nZ2luZ19kZXN0ID0gbG9nZ2luZzo6TG9nZ2luZ0Rlc3RpbmF0aW9uOjpMT0dfTk9ORTsKLSAgQ0hFQ0sobG9nZ2luZzo6SW5pdExvZ2dpbmcobG9nX3NldHRpbmdzKSkgPDwgIkZhaWxlZCB0byBzZXQgdXAgbG9nZ2luZyI7Ci0gIDo6YmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKLSAgaWYgKDo6YmVuY2htYXJrOjpSZXBvcnRVbnJlY29nbml6ZWRBcmd1bWVudHMoYXJnYywgYXJndikpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICA6OmJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2lkX2dlbmVyYXRvci5oIGIvY29tbW9uL2lkX2dlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJkNjQ1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9pZF9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0KLS8qIEhlbHBlciBjbGFzcyBnZW5lcmF0aW5nIE4gdW5pcXVlIGlkcywgZnJvbSAwIHRvIE4tMSAqLwotdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE4+Ci1jbGFzcyBJZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBzdGF0aWMgaW50IEFMTF9VU0VEOwotCi0gIElkR2VuZXJhdG9yKCkgOiBpbl91c2Vfe30ge30KLQotICAvKiBSZXR1cm5zIG5leHQgZnJlZSBpZCwgb3IgQUxMX1VTRUQgaWYgbm8gaWRzIGxlZnQgKi8KLSAgaW50IEdldE5leHQoKSB7Ci0gICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgaWYgKCFpbl91c2VfW2ldKSB7Ci0gICAgICAgIGluX3VzZV9baV0gPSB0cnVlOwotICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEFMTF9VU0VEOwotICB9Ci0KLSAgLyogUmVsZWFzZSBnaXZlbiBJRCAqLwotICB2b2lkIFJlbGVhc2UoaW50IGlkKSB7IGluX3VzZV9baWRdID0gZmFsc2U7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6YXJyYXk8Ym9vbCwgTj4gaW5fdXNlXzsKLX07Ci0KLXRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgotaW50IElkR2VuZXJhdG9yPE4+OjpBTExfVVNFRCA9IC0xOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9pZF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgYi9jb21tb24vaWRfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZlZTE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9pZF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL2lkX2dlbmVyYXRvci5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotVEVTVChJZEdlbmVyYXRvclRlc3QsIHNhbml0eV90ZXN0KSB7Ci0gIElkR2VuZXJhdG9yPDU+IGdlbmVyYXRvcjsKLSAgQVNTRVJUX0VRKDAsIGdlbmVyYXRvci5HZXROZXh0KCkpOwotICBBU1NFUlRfRVEoMSwgZ2VuZXJhdG9yLkdldE5leHQoKSk7Ci0gIEFTU0VSVF9FUSgyLCBnZW5lcmF0b3IuR2V0TmV4dCgpKTsKLSAgQVNTRVJUX0VRKDMsIGdlbmVyYXRvci5HZXROZXh0KCkpOwotICBBU1NFUlRfRVEoNCwgZ2VuZXJhdG9yLkdldE5leHQoKSk7Ci0gIEFTU0VSVF9FUShnZW5lcmF0b3IuQUxMX1VTRUQsIGdlbmVyYXRvci5HZXROZXh0KCkpOwotCi0gIGdlbmVyYXRvci5SZWxlYXNlKDMpOwotICBBU1NFUlRfRVEoMywgZ2VuZXJhdG9yLkdldE5leHQoKSk7Ci0KLSAgZ2VuZXJhdG9yLlJlbGVhc2UoMCk7Ci0gIGdlbmVyYXRvci5SZWxlYXNlKDIpOwotICBBU1NFUlRfRVEoMCwgZ2VuZXJhdG9yLkdldE5leHQoKSk7Ci0gIEFTU0VSVF9FUSgyLCBnZW5lcmF0b3IuR2V0TmV4dCgpKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vbGVha3lfYm9uZGVkX3F1ZXVlLmggYi9jb21tb24vbGVha3lfYm9uZGVkX3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2IxOTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2xlYWt5X2JvbmRlZF9xdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHF1ZXVlPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8qCi0gKiAgIExlYWt5Qm9uZGVkUXVldWU8VD4KLSAqCi0gKiAtIExlYWt5TG9uZGVkUXVldWU8VD4gaXMgYSBmaXhlZCBzaXplIHF1ZXVlIHRoYXQgbGVha3Mgb2xkZXN0IGl0ZW0gd2hlbgotICogICByZWFjaGluZyBpdHMgY2FwYWNpdHkuIFRoaXMgaXMgdXNlZnVsIGluIGNyZWF0aW5nIG1lbW9yeSBib25kZWQgZGF0YQotICogICBzdHJ1Y3R1cmUgd2hlcmUgZnJlc2huZXNzIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gZnVsbCBjb3ZlcmFnZS4KLSAqIC0gVGhlIHF1ZXVlIGlzIHByb3RlY3RlZCBieSBhIHNpbXBsZSBtdXRleCBhbmQgaXMgdGhyZWFkLXNhZmUsIGFsdGhvdWdoCi0gKiAgIGltcHJvdmVtZW50cyBjb3VsZCBiZSBtYWRlIHRvIGxvY2sgZW5xdWV1ZSBhbmQgZGVxdWV1ZSBzZXBhcmF0ZWx5LCBpdAotICogICBpcyBub3QgaW1wbGVtZW50ZWQgYXQgdGhpcyBtb21lbnQgZHVlIHRvIGxhY2sgb2YgZGVtYW5kCi0gKiAtIFRoZSBxdWV1ZSB1c2VzIHVuaXF1ZV9wdHIgdG8gYXV0b21hdGljYWxseSBmcmVlIGl0cyBjb250ZW50IHdoZW4gaXQgaXMKLSAqICAgZGVzdHJ1Y3RlZC4gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBpbXBsZW1lbnQgVCdzIGRlc3RydWN0b3IKLSAqICAgY29ycmVjdGx5LgotICoKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBMZWFreUJvbmRlZFF1ZXVlIHsKLSBwdWJsaWM6Ci0gIExlYWt5Qm9uZGVkUXVldWUoc2l6ZV90IGNhcGFjaXR5KTsKLSAgLyogRGVmYXVsdCBkZXN0cnVjdG9yCi0gICAqCi0gICAqIENhbGwgQ2xlYXIoKSBhbmQgZnJlZSB0aGUgcXVldWUgc3RydWN0dXJlIGl0c2VsZgotICAgKi8KLSAgfkxlYWt5Qm9uZGVkUXVldWUoKTsKLSAgLyoKLSAgICogQWRkIGl0ZW0gTkVXX0lURU0gdG8gdGhlIHVuZGVybGluaW5nIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXMgZnVsbCwgcG9wCi0gICAqIHRoZSBvbGRlc3QgaXRlbQotICAgKi8KLSAgdm9pZCBFbnF1ZXVlKFQqIG5ld19pdGVtKTsKLSAgLyoKLSAgICogQWRkIGl0ZW0gTkVXX0lURU0gdG8gdGhlIHVuZGVybGluaW5nIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXMgZnVsbCwgZGVxdWV1ZQotICAgKiB0aGUgb2xkZXN0IGl0ZW0gYW5kIHJldHVybnMgaXQgdG8gdGhlIGNhbGxlci4gUmV0dXJuIG51bGxwdHIgb3RoZXJ3aXNlLgotICAgKi8KLSAgVCogRW5xdWV1ZVdpdGhQb3AoVCogbmV3X2l0ZW0pOwotICAvKgotICAgKiBEZXF1ZXVlcyB0aGUgb2xkZXN0IGl0ZW0gZnJvbSB0aGUgcXVldWUuIFJldHVybiBudWxscHRyIGlmIHF1ZXVlIGlzIGVtcHR5Ci0gICAqLwotICBUKiBEZXF1ZXVlKCk7Ci0gIC8qCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiBxdWV1ZQotICAgKi8KLSAgc2l6ZV90IExlbmd0aCgpOwotICAvKgotICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIGNhcGFjaXR5IG9mIHRoZSBxdWV1ZQotICAgKi8KLSAgc2l6ZV90IENhcGFjaXR5KCk7Ci0gIC8qCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgcXVldWUgaXMgZW1wdHkKLSAgICovCi0gIGJvb2wgRW1wdHkoKTsKLSAgLyoKLSAgICogUG9wcyBhbGwgaXRlbXMgZnJvbSB0aGUgcXVldWUKLSAgICovCi0gIHZvaWQgQ2xlYXIoKTsKLQotIHByaXZhdGU6Ci0gIC8vIFB1dCBpdGVtIGluIHVuaXF1ZV9wdHIgc28gdGhhdCB0aGV5IGdldCBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gcG9wZWQgb3IKLSAgLy8gd2hlbiBxdWV1ZV8gaXMgZnJlZWQKLSAgc3RkOjpxdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8VD4+IHF1ZXVlXzsKLSAgc3RkOjptdXRleCBsb2NrXzsKLSAgc2l6ZV90IGNhcGFjaXR5XzsKLX07Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBtdXN0IGJlIGluIHRoZSBoZWFkZXIgZm9yIHRlbXBsYXRlIGNsYXNzZXMKLSAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLUxlYWt5Qm9uZGVkUXVldWU8VD46OkxlYWt5Qm9uZGVkUXVldWUoc2l6ZV90IGNhcGFjaXR5KSB7Ci0gIGNhcGFjaXR5XyA9IGNhcGFjaXR5OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLUxlYWt5Qm9uZGVkUXVldWU8VD46On5MZWFreUJvbmRlZFF1ZXVlKCkge30KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIExlYWt5Qm9uZGVkUXVldWU8VD46OkVucXVldWUoVCogbmV3X2l0ZW0pIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICBpZiAoKHF1ZXVlXy5zaXplKCkgKyAxKSA+IGNhcGFjaXR5XykgewotICAgIHF1ZXVlXy5wb3AoKTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8VD4gaXRlbV9wdHIobmV3X2l0ZW0pOwotICBxdWV1ZV8ucHVzaChzdGQ6Om1vdmUoaXRlbV9wdHIpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UKiBMZWFreUJvbmRlZFF1ZXVlPFQ+OjpFbnF1ZXVlV2l0aFBvcChUKiBuZXdfaXRlbSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gIFQqIG9sZF9pdGVtID0gbnVsbHB0cjsKLSAgaWYgKChxdWV1ZV8uc2l6ZSgpICsgMSkgPiBjYXBhY2l0eV8pIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gaXRlbSA9IHN0ZDo6bW92ZShxdWV1ZV8uZnJvbnQoKSk7Ci0gICAgcXVldWVfLnBvcCgpOwotICAgIG9sZF9pdGVtID0gaXRlbS5yZWxlYXNlKCk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfcHRyPFQ+IGl0ZW1fcHRyKG5ld19pdGVtKTsKLSAgcXVldWVfLnB1c2goc3RkOjptb3ZlKGl0ZW1fcHRyKSk7Ci0gIHJldHVybiBvbGRfaXRlbTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UKiBMZWFreUJvbmRlZFF1ZXVlPFQ+OjpEZXF1ZXVlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxUPiBpdGVtID0gc3RkOjptb3ZlKHF1ZXVlXy5mcm9udCgpKTsKLSAgcXVldWVfLnBvcCgpOwotICByZXR1cm4gaXRlbS5yZWxlYXNlKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBMZWFreUJvbmRlZFF1ZXVlPFQ+OjpDbGVhcigpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICB3aGlsZSAoIXF1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgLy8gdW5pcXVlX3B0ciBkb2VzIG5vdCBuZWVkIHRvIGJlIGZyZWVkCi0gICAgcXVldWVfLnBvcCgpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotc2l6ZV90IExlYWt5Qm9uZGVkUXVldWU8VD46Okxlbmd0aCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICByZXR1cm4gcXVldWVfLnNpemUoKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1zaXplX3QgTGVha3lCb25kZWRRdWV1ZTxUPjo6Q2FwYWNpdHkoKSB7Ci0gIHJldHVybiBjYXBhY2l0eV87Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBMZWFreUJvbmRlZFF1ZXVlPFQ+OjpFbXB0eSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICByZXR1cm4gcXVldWVfLmVtcHR5KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvY29tbW9uL2xlYWt5X2JvbmRlZF9xdWV1ZV91bml0dGVzdC5jYyBiL2NvbW1vbi9sZWFreV9ib25kZWRfcXVldWVfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmYzNWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2xlYWt5X2JvbmRlZF9xdWV1ZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJjb21tb24vbGVha3lfYm9uZGVkX3F1ZXVlLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkxlYWt5Qm9uZGVkUXVldWU7Ci0KLSNkZWZpbmUgSVRFTV9FUShhLCBiKSAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFWFBFQ1RfRVEoYSwgYik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBFWFBFQ1RfRVEoKGEpLT5pbmRleCwgKGIpLT5pbmRleCk7IFwKLSAgfSB3aGlsZSAoMCkKLQotY2xhc3MgSXRlbSB7Ci0gcHVibGljOgotICBJdGVtKGludCBpKSB7IGluZGV4ID0gaTsgfQotICB2aXJ0dWFsIH5JdGVtKCkge30KLSAgaW50IGluZGV4OwotfTsKLQotY2xhc3MgTW9ja0l0ZW0gOiBwdWJsaWMgSXRlbSB7Ci0gcHVibGljOgotICBNb2NrSXRlbShpbnQgaSkgOiBJdGVtKGkpIHt9Ci0gIH5Nb2NrSXRlbSgpIG92ZXJyaWRlIHsgRGVzdHJ1Y3QoKTsgfQotICBNT0NLX01FVEhPRDAoRGVzdHJ1Y3QsIHZvaWQoKSk7Ci19OwotCi1URVNUKExlYWt5Qm9uZGVkUXVldWVUZXN0LCBUZXN0RW5xdWV1ZURlcXVldWUpIHsKLSAgTW9ja0l0ZW0qIGl0ZW0xID0gbmV3IE1vY2tJdGVtKDEpOwotICBNb2NrSXRlbSogaXRlbTIgPSBuZXcgTW9ja0l0ZW0oMik7Ci0gIE1vY2tJdGVtKiBpdGVtMyA9IG5ldyBNb2NrSXRlbSgzKTsKLSAgTW9ja0l0ZW0qIGl0ZW00ID0gbmV3IE1vY2tJdGVtKDQpOwotICBMZWFreUJvbmRlZFF1ZXVlPE1vY2tJdGVtPiogcXVldWUgPSBuZXcgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4oMyk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+Q2FwYWNpdHkoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigzKSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMCkpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMSkpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMik7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMikpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMyk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMykpOwotICBFWFBFQ1RfQ0FMTCgqaXRlbTEsIERlc3RydWN0KCkpLlRpbWVzKDEpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtNCk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMykpOwotICBNb2NrSXRlbSogaXRlbTJfMiA9IHF1ZXVlLT5EZXF1ZXVlKCk7Ci0gIE1vY2tJdGVtKiBpdGVtM18zID0gcXVldWUtPkRlcXVldWUoKTsKLSAgTW9ja0l0ZW0qIGl0ZW00XzQgPSBxdWV1ZS0+RGVxdWV1ZSgpOwotICBFWFBFQ1RfVEhBVChpdGVtMl8yLCBOb3ROdWxsKCkpOwotICBJVEVNX0VRKGl0ZW0yXzIsIGl0ZW0yKTsKLSAgRVhQRUNUX1RIQVQoaXRlbTNfMywgTm90TnVsbCgpKTsKLSAgSVRFTV9FUShpdGVtM18zLCBpdGVtMyk7Ci0gIEVYUEVDVF9USEFUKGl0ZW00XzQsIE5vdE51bGwoKSk7Ci0gIElURU1fRVEoaXRlbTRfNCwgaXRlbTQpOwotICBMT0coSU5GTykgPDwgIkFsbCBkb25lIHJlbGVhc2UgaXRlbXMiOwotICBFWFBFQ1RfQ0FMTCgqaXRlbTJfMiwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIGRlbGV0ZSBpdGVtMl8yOwotICBFWFBFQ1RfQ0FMTCgqaXRlbTNfMywgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIGRlbGV0ZSBpdGVtM18zOwotICBFWFBFQ1RfQ0FMTCgqaXRlbTRfNCwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIGRlbGV0ZSBpdGVtNF80OwotICBkZWxldGUgcXVldWU7Ci19Ci0KLVRFU1QoTGVha3lCb25kZWRRdWV1ZVRlc3QsIFRlc3RFbnF1ZXVlRGVxdWV1ZTIpIHsKLSAgTW9ja0l0ZW0qIGl0ZW0xID0gbmV3IE1vY2tJdGVtKDEpOwotICBNb2NrSXRlbSogaXRlbTIgPSBuZXcgTW9ja0l0ZW0oMik7Ci0gIE1vY2tJdGVtKiBpdGVtMyA9IG5ldyBNb2NrSXRlbSgzKTsKLSAgTW9ja0l0ZW0qIGl0ZW00ID0gbmV3IE1vY2tJdGVtKDQpOwotICBMZWFreUJvbmRlZFF1ZXVlPE1vY2tJdGVtPiogcXVldWUgPSBuZXcgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4oMik7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+Q2FwYWNpdHkoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMCkpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMSkpOwotICBNb2NrSXRlbSogaXRlbTFfMSA9IHF1ZXVlLT5EZXF1ZXVlKCk7Ci0gIElURU1fRVEoaXRlbTEsIGl0ZW0xXzEpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTIpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTMpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0yLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTQpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0zLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTEpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgTW9ja0l0ZW0qIGl0ZW00XzRfNCA9IHF1ZXVlLT5EZXF1ZXVlKCk7Ci0gIE1vY2tJdGVtKiBpdGVtMV8xXzEgPSBxdWV1ZS0+RGVxdWV1ZSgpOwotICBJVEVNX0VRKGl0ZW00XzRfNCwgaXRlbTQpOwotICBJVEVNX0VRKGl0ZW0xXzFfMSwgaXRlbTEpOwotICBFWFBFQ1RfQ0FMTCgqaXRlbTFfMV8xLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgZGVsZXRlIGl0ZW0xXzFfMTsKLSAgRVhQRUNUX0NBTEwoKml0ZW00XzRfNCwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIGRlbGV0ZSBpdGVtNF80XzQ7Ci0gIGRlbGV0ZSBxdWV1ZTsKLX0KLQotVEVTVChMZWFreUJvbmRlZFF1ZXVlVGVzdCwgVGVzdEVucXVldWVQb3ApIHsKLSAgTW9ja0l0ZW0qIGl0ZW0xID0gbmV3IE1vY2tJdGVtKDEpOwotICBNb2NrSXRlbSogaXRlbTIgPSBuZXcgTW9ja0l0ZW0oMik7Ci0gIE1vY2tJdGVtKiBpdGVtMyA9IG5ldyBNb2NrSXRlbSgzKTsKLSAgTW9ja0l0ZW0qIGl0ZW00ID0gbmV3IE1vY2tJdGVtKDQpOwotICBMZWFreUJvbmRlZFF1ZXVlPE1vY2tJdGVtPiogcXVldWUgPSBuZXcgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4oMik7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+Q2FwYWNpdHkoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMCkpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMSkpOwotICBNb2NrSXRlbSogaXRlbTFfMSA9IHF1ZXVlLT5EZXF1ZXVlKCk7Ci0gIElURU1fRVEoaXRlbTEsIGl0ZW0xXzEpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTIpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTMpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgTW9ja0l0ZW0qIGl0ZW0yXzIgPSBxdWV1ZS0+RW5xdWV1ZVdpdGhQb3AoaXRlbTQpOwotICBFWFBFQ1RfVEhBVChpdGVtMl8yLCBOb3ROdWxsKCkpOwotICBJVEVNX0VRKGl0ZW0yXzIsIGl0ZW0yKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0yLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgZGVsZXRlIGl0ZW0yXzI7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMikpOwotICBNb2NrSXRlbSogaXRlbTNfMyA9IHF1ZXVlLT5FbnF1ZXVlV2l0aFBvcChpdGVtMSk7Ci0gIEVYUEVDVF9USEFUKGl0ZW0zXzMsIE5vdE51bGwoKSk7Ci0gIElURU1fRVEoaXRlbTNfMywgaXRlbTMpOwotICBFWFBFQ1RfQ0FMTCgqaXRlbTMsIERlc3RydWN0KCkpLlRpbWVzKDEpOwotICBkZWxldGUgaXRlbTNfMzsKLSAgRVhQRUNUX0VRKHF1ZXVlLT5MZW5ndGgoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIE1vY2tJdGVtKiBpdGVtNF80XzQgPSBxdWV1ZS0+RGVxdWV1ZSgpOwotICBNb2NrSXRlbSogaXRlbTFfMV8xID0gcXVldWUtPkRlcXVldWUoKTsKLSAgSVRFTV9FUShpdGVtNF80XzQsIGl0ZW00KTsKLSAgSVRFTV9FUShpdGVtMV8xXzEsIGl0ZW0xKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0xXzFfMSwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIGRlbGV0ZSBpdGVtMV8xXzE7Ci0gIEVYUEVDVF9DQUxMKCppdGVtNF80XzQsIERlc3RydWN0KCkpLlRpbWVzKDEpOwotICBkZWxldGUgaXRlbTRfNF80OwotICBkZWxldGUgcXVldWU7Ci19Ci0KLVRFU1QoTGVha3lCb25kZWRRdWV1ZVRlc3QsIFRlc3RRdWV1ZUNsZWFyKSB7Ci0gIE1vY2tJdGVtKiBpdGVtMSA9IG5ldyBNb2NrSXRlbSgxKTsKLSAgTW9ja0l0ZW0qIGl0ZW0yID0gbmV3IE1vY2tJdGVtKDIpOwotICBNb2NrSXRlbSogaXRlbTMgPSBuZXcgTW9ja0l0ZW0oMyk7Ci0gIE1vY2tJdGVtKiBpdGVtNCA9IG5ldyBNb2NrSXRlbSg0KTsKLSAgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4qIHF1ZXVlID0gbmV3IExlYWt5Qm9uZGVkUXVldWU8TW9ja0l0ZW0+KDIpOwotICBFWFBFQ1RfRVEocXVldWUtPkNhcGFjaXR5KCksIHN0YXRpY19jYXN0PHNpemVfdD4oMikpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTEpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpKTsKLSAgTW9ja0l0ZW0qIGl0ZW0xXzEgPSBxdWV1ZS0+RGVxdWV1ZSgpOwotICBJVEVNX0VRKGl0ZW0xLCBpdGVtMV8xKTsKLSAgRVhQRUNUX0VRKHF1ZXVlLT5MZW5ndGgoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSk7Ci0gIHF1ZXVlLT5FbnF1ZXVlKGl0ZW0yKTsKLSAgRVhQRUNUX0VRKHF1ZXVlLT5MZW5ndGgoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigxKSk7Ci0gIHF1ZXVlLT5FbnF1ZXVlKGl0ZW0zKTsKLSAgRVhQRUNUX0VRKHF1ZXVlLT5MZW5ndGgoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIEVYUEVDVF9DQUxMKCppdGVtMiwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIHF1ZXVlLT5FbnF1ZXVlKGl0ZW00KTsKLSAgRVhQRUNUX0VRKHF1ZXVlLT5MZW5ndGgoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIEVYUEVDVF9DQUxMKCppdGVtMywgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIHF1ZXVlLT5FbnF1ZXVlKGl0ZW0xKTsKLSAgRVhQRUNUX0VRKHF1ZXVlLT5MZW5ndGgoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIEVYUEVDVF9DQUxMKCppdGVtMSwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCppdGVtNCwgRGVzdHJ1Y3QoKSkuVGltZXMoMSk7Ci0gIHF1ZXVlLT5DbGVhcigpOwotICBkZWxldGUgcXVldWU7Ci19Ci0KLVRFU1QoTGVha3lCb25kZWRRdWV1ZVRlc3QsIFRlc3RRdWV1ZUZyZWUpIHsKLSAgTW9ja0l0ZW0qIGl0ZW0xID0gbmV3IE1vY2tJdGVtKDEpOwotICBNb2NrSXRlbSogaXRlbTIgPSBuZXcgTW9ja0l0ZW0oMik7Ci0gIE1vY2tJdGVtKiBpdGVtMyA9IG5ldyBNb2NrSXRlbSgzKTsKLSAgTW9ja0l0ZW0qIGl0ZW00ID0gbmV3IE1vY2tJdGVtKDQpOwotICBMZWFreUJvbmRlZFF1ZXVlPE1vY2tJdGVtPiogcXVldWUgPSBuZXcgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4oMik7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+Q2FwYWNpdHkoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMCkpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMSk7Ci0gIEVYUEVDVF9FUShxdWV1ZS0+TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oMSkpOwotICBNb2NrSXRlbSogaXRlbTFfMSA9IHF1ZXVlLT5EZXF1ZXVlKCk7Ci0gIElURU1fRVEoaXRlbTEsIGl0ZW0xXzEpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDApKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTIpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTMpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0yLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTQpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0zLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTEpOwotICBFWFBFQ1RfRVEocXVldWUtPkxlbmd0aCgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW0xLCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKml0ZW00LCBEZXN0cnVjdCgpKS5UaW1lcygxKTsKLSAgZGVsZXRlIHF1ZXVlOwotfQotCi1URVNUKExlYWt5Qm9uZGVkUXVldWVUZXN0LCBUZXN0UHVzaE51bGwpIHsKLSAgTW9ja0l0ZW0qIGl0ZW0xID0gbnVsbHB0cjsKLSAgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4qIHF1ZXVlID0gbmV3IExlYWt5Qm9uZGVkUXVldWU8TW9ja0l0ZW0+KDIpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMSk7Ci0gIE1vY2tJdGVtKiBpdGVtMV8xID0gcXVldWUtPkRlcXVldWUoKTsKLSAgRVhQRUNUX1RIQVQoaXRlbTFfMSwgSXNOdWxsKCkpOwotfQotCi1URVNUKExlYWt5Qm9uZGVkUXVldWVUZXN0LCBUZXN0UHVzaE51bGxPdmVyZmxvd1F1ZXVlKSB7Ci0gIE1vY2tJdGVtKiBpdGVtMSA9IG51bGxwdHI7Ci0gIE1vY2tJdGVtKiBpdGVtMiA9IG51bGxwdHI7Ci0gIExlYWt5Qm9uZGVkUXVldWU8TW9ja0l0ZW0+KiBxdWV1ZSA9IG5ldyBMZWFreUJvbmRlZFF1ZXVlPE1vY2tJdGVtPigxKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTEpOwotICBxdWV1ZS0+RW5xdWV1ZShpdGVtMik7Ci0gIE1vY2tJdGVtKiBpdGVtMl8yID0gcXVldWUtPkRlcXVldWUoKTsKLSAgRVhQRUNUX1RIQVQoaXRlbTJfMiwgSXNOdWxsKCkpOwotfQotCi1URVNUKExlYWt5Qm9uZGVkUXVldWVUZXN0LCBUZXN0UHVzaE51bGxEZWxldGVRdWV1ZSkgewotICBNb2NrSXRlbSogaXRlbTEgPSBudWxscHRyOwotICBNb2NrSXRlbSogaXRlbTIgPSBudWxscHRyOwotICBMZWFreUJvbmRlZFF1ZXVlPE1vY2tJdGVtPiogcXVldWUgPSBuZXcgTGVha3lCb25kZWRRdWV1ZTxNb2NrSXRlbT4oMik7Ci0gIHF1ZXVlLT5FbnF1ZXVlKGl0ZW0xKTsKLSAgcXVldWUtPkVucXVldWUoaXRlbTIpOwotICBkZWxldGUgcXVldWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvY29tbW9uL2xydS5oIGIvY29tbW9uL2xydS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQ1NjQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9scnUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIwIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotY2xhc3MgTGVnYWN5THJ1Q2FjaGUgewotIHB1YmxpYzoKLSAgdXNpbmcgTm9kZSA9IHN0ZDo6cGFpcjxLLCBWPjsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIG9mIHRoZSBjYWNoZQotICAgKgotICAgKiBAcGFyYW0gY2FwYWNpdHkgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZQotICAgKiBAcGFyYW0gbG9nX3RhZywga2V5d29yZCB0byBwdXQgYXQgdGhlIGhlYWQgb2YgbG9nLgotICAgKi8KLSAgTGVnYWN5THJ1Q2FjaGUoY29uc3Qgc2l6ZV90JiBjYXBhY2l0eSwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvZ190YWcpCi0gICAgICA6IGNhcGFjaXR5XyhjYXBhY2l0eSkgewotICAgIGlmIChjYXBhY2l0eV8gPT0gMCkgewotICAgICAgLy8gZG9uJ3QgYWxsb3cgaW52YWxpZCBjYXBhY2l0eQotICAgICAgTE9HKEZBVEFMKSA8PCBsb2dfdGFnIDw8ICIgdW5hYmxlIHRvIGhhdmUgMCBMUlUgQ2FjaGUgY2FwYWNpdHkiOwotICAgIH0KLSAgfQotCi0gIC8vIGRlbGV0ZSBjb3B5IGNvbnN0cnVjdG9yCi0gIExlZ2FjeUxydUNhY2hlKExlZ2FjeUxydUNhY2hlIGNvbnN0JikgPSBkZWxldGU7Ci0gIExlZ2FjeUxydUNhY2hlJiBvcGVyYXRvcj0oTGVnYWN5THJ1Q2FjaGUgY29uc3QmKSA9IGRlbGV0ZTsKLQotICB+TGVnYWN5THJ1Q2FjaGUoKSB7IENsZWFyKCk7IH0KLQotICAvKioKLSAgICogQ2xlYXIgdGhlIGNhY2hlCi0gICAqLwotICB2b2lkIENsZWFyKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhscnVfbXV0ZXhfKTsKLSAgICBscnVfbWFwXy5jbGVhcigpOwotICAgIG5vZGVfbGlzdF8uY2xlYXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTYW1lIGFzIEdldCwgYnV0IHJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgYWNjZXNzZWQgZWxlbWVudAotICAgKgotICAgKiBNb2RpZnlpbmcgdGhlIHJldHVybmVkIGl0ZXJhdG9yIGRvZXMgbm90IHdhcm0gdXAgdGhlIGNhY2hlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkKLSAgICogQHJldHVybiBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIHRvIGFsbG93IGluLXBsYWNlIG1vZGlmaWNhdGlvbgotICAgKiBudWxscHRyIHdoZW4gbm90IGZvdW5kLCB3aWxsIGJlIGludmFsaWRhdGVkIHdoZW4gdGhlIGtleSBpcyBldmljdGVkCi0gICAqLwotICBWKiBGaW5kKGNvbnN0IEsmIGtleSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhscnVfbXV0ZXhfKTsKLSAgICBhdXRvIG1hcF9pdGVyYXRvciA9IGxydV9tYXBfLmZpbmQoa2V5KTsKLSAgICBpZiAobWFwX2l0ZXJhdG9yID09IGxydV9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgbm9kZV9saXN0Xy5zcGxpY2Uobm9kZV9saXN0Xy5iZWdpbigpLCBub2RlX2xpc3RfLCBtYXBfaXRlcmF0b3ItPnNlY29uZCk7Ci0gICAgcmV0dXJuICYobWFwX2l0ZXJhdG9yLT5zZWNvbmQtPnNlY29uZCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIGtleSwgYW5kIG1vdmUgdGhlIGtleSB0byB0aGUgaGVhZCBvZiBjYWNoZSwgaWYgdGhlcmUgaXMKLSAgICogb25lCi0gICAqCi0gICAqIEBwYXJhbSBrZXkKLSAgICogQHBhcmFtIHZhbHVlLCBvdXRwdXQgcGFyYW1ldGVyIG9mIHZhbHVlIG9mIHRoZSBrZXkKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWNoZSBoYXMgdGhlIGtleQotICAgKi8KLSAgYm9vbCBHZXQoY29uc3QgSyYga2V5LCBWKiB2YWx1ZSkgewotICAgIENIRUNLKHZhbHVlICE9IG51bGxwdHIpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhscnVfbXV0ZXhfKTsKLSAgICBhdXRvIHZhbHVlX3B0ciA9IEZpbmQoa2V5KTsKLSAgICBpZiAodmFsdWVfcHRyID09IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKnZhbHVlID0gKnZhbHVlX3B0cjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGUgY2FjaGUgaGFzIHRoZSBpbnB1dCBrZXksIG1vdmUgdGhlIGtleSB0byB0aGUgaGVhZAotICAgKiBpZiB0aGVyZSBpcyBvbmUKLSAgICoKLSAgICogQHBhcmFtIGtleQotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNhY2hlIGhhcyB0aGUga2V5Ci0gICAqLwotICBib29sIEhhc0tleShjb25zdCBLJiBrZXkpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobHJ1X211dGV4Xyk7Ci0gICAgcmV0dXJuIEZpbmQoa2V5KSAhPSBudWxscHRyOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyIHRvIHRoZSBoZWFkIG9mIGNhY2hlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkKLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gZXZpY3RlZCBub2RlIGlmIHRhaWwgdmFsdWUgaXMgcG9wcGVkLCBzdGQ6Om51bGxvcHQgaWYgbm8gdmFsdWUKLSAgICogaXMgcG9wcGVkLiBzdGQ6Om9wdGlvbmFsIGNhbiBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbiBhcyB3ZWxsCi0gICAqLwotICBzdGQ6Om9wdGlvbmFsPE5vZGU+IFB1dChjb25zdCBLJiBrZXksIFYgdmFsdWUpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobHJ1X211dGV4Xyk7Ci0gICAgYXV0byB2YWx1ZV9wdHIgPSBGaW5kKGtleSk7Ci0gICAgaWYgKHZhbHVlX3B0ciAhPSBudWxscHRyKSB7Ci0gICAgICAvLyBoYXNLZXkoKSBjYWxscyBnZXQoKSwgdGhlcmVmb3JlIGFscmVhZHkgbW92ZSB0aGUgbm9kZSB0byB0aGUgaGVhZAotICAgICAgKnZhbHVlX3B0ciA9IHN0ZDo6bW92ZSh2YWx1ZSk7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLQotICAgIC8vIHJlbW92ZSB0YWlsCi0gICAgc3RkOjpvcHRpb25hbDxOb2RlPiByZXQgPSBzdGQ6Om51bGxvcHQ7Ci0gICAgaWYgKGxydV9tYXBfLnNpemUoKSA9PSBjYXBhY2l0eV8pIHsKLSAgICAgIGxydV9tYXBfLmVyYXNlKG5vZGVfbGlzdF8uYmFjaygpLmZpcnN0KTsKLSAgICAgIHJldCA9IHN0ZDo6bW92ZShub2RlX2xpc3RfLmJhY2soKSk7Ci0gICAgICBub2RlX2xpc3RfLnBvcF9iYWNrKCk7Ci0gICAgfQotICAgIC8vIGluc2VydCB0byBkdW1teSBuZXh0OwotICAgIG5vZGVfbGlzdF8uZW1wbGFjZV9mcm9udChrZXksIHN0ZDo6bW92ZSh2YWx1ZSkpOwotICAgIGxydV9tYXBfLmVtcGxhY2Uoa2V5LCBub2RlX2xpc3RfLmJlZ2luKCkpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlIGEga2V5IGZyb20gY2FjaGUKLSAgICoKLSAgICogQHBhcmFtIGtleQotICAgKiBAcmV0dXJuIHRydWUgaWYgZGVsZXRlZCBzdWNjZXNzZnVsbHkKLSAgICovCi0gIGJvb2wgUmVtb3ZlKGNvbnN0IEsmIGtleSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhscnVfbXV0ZXhfKTsKLSAgICBhdXRvIG1hcF9pdGVyYXRvciA9IGxydV9tYXBfLmZpbmQoa2V5KTsKLSAgICBpZiAobWFwX2l0ZXJhdG9yID09IGxydV9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gcmVtb3ZlIGZyb20gdGhlIGxpc3QKLSAgICBub2RlX2xpc3RfLmVyYXNlKG1hcF9pdGVyYXRvci0+c2Vjb25kKTsKLQotICAgIC8vIGRlbGV0ZSBrZXkgZnJvbSBtYXAKLSAgICBscnVfbWFwXy5lcmFzZShtYXBfaXRlcmF0b3IpOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHNpemUgb2YgdGhlIGNhY2hlCi0gICAqCi0gICAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgY2FjaGUKLSAgICovCi0gIGludCBTaXplKCkgY29uc3QgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhscnVfbXV0ZXhfKTsKLSAgICByZXR1cm4gbHJ1X21hcF8uc2l6ZSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6Omxpc3Q8Tm9kZT4gbm9kZV9saXN0XzsKLSAgc2l6ZV90IGNhcGFjaXR5XzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPEssIHR5cGVuYW1lIHN0ZDo6bGlzdDxOb2RlPjo6aXRlcmF0b3I+IGxydV9tYXBfOwotICBtdXRhYmxlIHN0ZDo6cmVjdXJzaXZlX211dGV4IGxydV9tdXRleF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vbHJ1X3VuaXR0ZXN0LmNjIGIvY29tbW9uL2xydV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4ZjFkZi4uMDAwMDAwMAotLS0gYS9jb21tb24vbHJ1X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAiY29tbW9uL2xydS5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpMZWdhY3lMcnVDYWNoZTsKLQotVEVTVChCbHVldG9vdGhMZWdhY3lMcnVDYWNoZVRlc3QsIExlZ2FjeUxydUNhY2hlTWFpblRlc3QxKSB7Ci0gIGludCogdmFsdWUgPSBuZXcgaW50KDApOwotICBMZWdhY3lMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMywgInRlc3RpbmciKTsgIC8vIGNhcGFjaXR5ID0gMzsKLSAgY2FjaGUuUHV0KDEsIDEwKTsKLSAgRVhQRUNUX0VRKGNhY2hlLlNpemUoKSwgMSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5QdXQoMiwgMjApKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLlB1dCgzLCAzMCkpOwotICBFWFBFQ1RfRVEoY2FjaGUuU2l6ZSgpLCAzKTsKLQotICAvLyAxLCAyLCAzIHNob3VsZCBiZSBpbiBjYWNoZQotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMSwgdmFsdWUpKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgMTApOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMiwgdmFsdWUpKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgMjApOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMywgdmFsdWUpKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgMzApOwotICBFWFBFQ1RfRVEoY2FjaGUuU2l6ZSgpLCAzKTsKLQotICBFWFBFQ1RfVEhBVChjYWNoZS5QdXQoNCwgNDApLCBPcHRpb25hbChQYWlyKDEsIDEwKSkpOwotICAvLyAyLCAzLCA0IHNob3VsZCBiZSBpbiBjYWNoZSwgMSBpcyBldmljdGVkCi0gIEVYUEVDVF9GQUxTRShjYWNoZS5HZXQoMSwgdmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDQsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDQwKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDIsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDIwKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDMsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDMwKTsKLQotICBFWFBFQ1RfVEhBVChjYWNoZS5QdXQoNSwgNTApLCBPcHRpb25hbChQYWlyKDQsIDQwKSkpOwotICBFWFBFQ1RfRVEoY2FjaGUuU2l6ZSgpLCAzKTsKLSAgLy8gMiwgMywgNSBzaG91bGQgYmUgaW4gY2FjaGUsIDQgaXMgZXZpY3RlZAotCi0gIEVYUEVDVF9UUlVFKGNhY2hlLlJlbW92ZSgzKSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5QdXQoNiwgNjApKTsKLSAgLy8gMiwgNSwgNiBzaG91bGQgYmUgaW4gY2FjaGUKLQotICBFWFBFQ1RfRkFMU0UoY2FjaGUuR2V0KDMsIHZhbHVlKSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5HZXQoNCwgdmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDIsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDIwKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDUsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDUwKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDYsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDYwKTsKLX0KLQotVEVTVChCbHVldG9vdGhMZWdhY3lMcnVDYWNoZVRlc3QsIExlZ2FjeUxydUNhY2hlTWFpblRlc3QyKSB7Ci0gIGludCogdmFsdWUgPSBuZXcgaW50KDApOwotICBMZWdhY3lMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMiwgInRlc3RpbmciKTsgIC8vIHNpemUgPSAyOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuUHV0KDEsIDEwKSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5QdXQoMiwgMjApKTsKLSAgRVhQRUNUX1RIQVQoY2FjaGUuUHV0KDMsIDMwKSwgT3B0aW9uYWwoUGFpcigxLCAxMCkpKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLlB1dCgyLCAyMDApKTsKLSAgRVhQRUNUX0VRKGNhY2hlLlNpemUoKSwgMik7Ci0gIC8vIDMsIDIgc2hvdWxkIGJlIGluIGNhY2hlCi0KLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLkhhc0tleSgxKSk7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLkdldCgyLCB2YWx1ZSkpOwotICBFWFBFQ1RfRVEoKnZhbHVlLCAyMDApOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMywgdmFsdWUpKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgMzApOwotCi0gIEVYUEVDVF9USEFUKGNhY2hlLlB1dCg0LCA0MCksIE9wdGlvbmFsKFBhaXIoMiwgMjAwKSkpOwotICAvLyAzLCA0IHNob3VsZCBiZSBpbiBjYWNoZQotCi0gIEVYUEVDVF9GQUxTRShjYWNoZS5IYXNLZXkoMikpOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMywgdmFsdWUpKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgMzApOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoNCwgdmFsdWUpKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgNDApOwotCi0gIEVYUEVDVF9UUlVFKGNhY2hlLlJlbW92ZSg0KSk7Ci0gIEVYUEVDVF9FUShjYWNoZS5TaXplKCksIDEpOwotICBjYWNoZS5QdXQoMiwgMjAwMCk7Ci0gIC8vIDMsIDIgc2hvdWxkIGJlIGluIGNhY2hlCi0KLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLkhhc0tleSg0KSk7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLkdldCgzLCB2YWx1ZSkpOwotICBFWFBFQ1RfRVEoKnZhbHVlLCAzMCk7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLkdldCgyLCB2YWx1ZSkpOwotICBFWFBFQ1RfRVEoKnZhbHVlLCAyMDAwKTsKLQotICBFWFBFQ1RfVFJVRShjYWNoZS5SZW1vdmUoMikpOwotICBFWFBFQ1RfVFJVRShjYWNoZS5SZW1vdmUoMykpOwotICBjYWNoZS5QdXQoNSwgNTApOwotICBjYWNoZS5QdXQoMSwgMTAwKTsKLSAgY2FjaGUuUHV0KDEsIDEwMDApOwotICBFWFBFQ1RfRVEoY2FjaGUuU2l6ZSgpLCAyKTsKLSAgLy8gMSwgNSBzaG91bGQgYmUgaW4gY2FjaGUKLQotICBFWFBFQ1RfRkFMU0UoY2FjaGUuSGFzS2V5KDIpKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLkhhc0tleSgzKSk7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLkdldCgxLCB2YWx1ZSkpOwotICBFWFBFQ1RfRVEoKnZhbHVlLCAxMDAwKTsKLSAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KDUsIHZhbHVlKSk7Ci0gIEVYUEVDVF9FUSgqdmFsdWUsIDUwKTsKLX0KLQotVEVTVChCbHVldG9vdGhMZWdhY3lMcnVDYWNoZVRlc3QsIExlZ2FjeUxydUNhY2hlRmluZFRlc3QpIHsKLSAgTGVnYWN5THJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDEwLCAidGVzdGluZyIpOwotICBjYWNoZS5QdXQoMSwgMTApOwotICBjYWNoZS5QdXQoMiwgMjApOwotICBpbnQgdmFsdWUgPSAwOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMSwgJnZhbHVlKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgMTApOwotICBhdXRvIHZhbHVlX3B0ciA9IGNhY2hlLkZpbmQoMSk7Ci0gIEVYUEVDVF9ORSh2YWx1ZV9wdHIsIG51bGxwdHIpOwotICAqdmFsdWVfcHRyID0gMjA7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLkdldCgxLCAmdmFsdWUpKTsKLSAgRVhQRUNUX0VRKHZhbHVlLCAyMCk7Ci0gIGNhY2hlLlB1dCgxLCA0MCk7Ci0gIEVYUEVDVF9FUSgqdmFsdWVfcHRyLCA0MCk7Ci0gIEVYUEVDVF9FUShjYWNoZS5GaW5kKDEwKSwgbnVsbHB0cik7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTGVnYWN5THJ1Q2FjaGVUZXN0LCBMZWdhY3lMcnVDYWNoZUdldFRlc3QpIHsKLSAgTGVnYWN5THJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDEwLCAidGVzdGluZyIpOwotICBjYWNoZS5QdXQoMSwgMTApOwotICBjYWNoZS5QdXQoMiwgMjApOwotICBpbnQgdmFsdWUgPSAwOwotICBFWFBFQ1RfVFJVRShjYWNoZS5HZXQoMSwgJnZhbHVlKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgMTApOwotICBFWFBFQ1RfVFJVRShjYWNoZS5IYXNLZXkoMSkpOwotICBFWFBFQ1RfVFJVRShjYWNoZS5IYXNLZXkoMikpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuSGFzS2V5KDMpKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLkdldCgzLCAmdmFsdWUpKTsKLSAgRVhQRUNUX0VRKHZhbHVlLCAxMCk7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTGVnYWN5THJ1Q2FjaGVUZXN0LCBMZWdhY3lMcnVDYWNoZVJlbW92ZVRlc3QpIHsKLSAgTGVnYWN5THJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDEwLCAidGVzdGluZyIpOwotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPD0gMzA7IGtleSsrKSB7Ci0gICAgY2FjaGUuUHV0KGtleSwga2V5ICogMTAwKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPD0gMjA7IGtleSsrKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKGNhY2hlLkhhc0tleShrZXkpKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAyMTsga2V5IDw9IDMwOyBrZXkrKykgewotICAgIEVYUEVDVF9UUlVFKGNhY2hlLkhhc0tleShrZXkpKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAyMTsga2V5IDw9IDMwOyBrZXkrKykgewotICAgIEVYUEVDVF9UUlVFKGNhY2hlLlJlbW92ZShrZXkpKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAyMTsga2V5IDw9IDMwOyBrZXkrKykgewotICAgIEVYUEVDVF9GQUxTRShjYWNoZS5IYXNLZXkoa2V5KSk7Ci0gIH0KLX0KLQotVEVTVChCbHVldG9vdGhMZWdhY3lMcnVDYWNoZVRlc3QsIExlZ2FjeUxydUNhY2hlQ2xlYXJUZXN0KSB7Ci0gIExlZ2FjeUxydUNhY2hlPGludCwgaW50PiBjYWNoZSgxMCwgInRlc3RpbmciKTsKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgMTA7IGtleSsrKSB7Ci0gICAgY2FjaGUuUHV0KGtleSwga2V5ICogMTAwKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCAxMDsga2V5KyspIHsKLSAgICBFWFBFQ1RfVFJVRShjYWNoZS5IYXNLZXkoa2V5KSk7Ci0gIH0KLSAgY2FjaGUuQ2xlYXIoKTsKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgMTA7IGtleSsrKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKGNhY2hlLkhhc0tleShrZXkpKTsKLSAgfQotCi0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwOyBrZXkrKykgewotICAgIGNhY2hlLlB1dChrZXksIGtleSAqIDEwMDApOwotICB9Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwOyBrZXkrKykgewotICAgIEVYUEVDVF9UUlVFKGNhY2hlLkhhc0tleShrZXkpKTsKLSAgfQotfQotCi1URVNUKEJsdWV0b290aExlZ2FjeUxydUNhY2hlVGVzdCwgTGVnYWN5THJ1Q2FjaGVQcmVzc3VyZVRlc3QpIHsKLSAgYXV0byBzdGFydGVkID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGludCBtYXhfc2l6ZSA9IDB4RkZGRkY7ICAvLyAyXjIwID0gMU0KLSAgTGVnYWN5THJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKHN0YXRpY19jYXN0PHNpemVfdD4obWF4X3NpemUpLCAidGVzdGluZyIpOwotCi0gIC8vIGZpbGwgdGhlIGNhY2hlCi0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IG1heF9zaXplOyBrZXkrKykgewotICAgIGNhY2hlLlB1dChrZXksIGtleSk7Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGZ1bGwKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgbWF4X3NpemU7IGtleSsrKSB7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuSGFzS2V5KGtleSkpOwotICB9Ci0KLSAgLy8gcmVmcmVzaCB0aGUgZW50aXJlIGNhY2hlCi0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IG1heF9zaXplOyBrZXkrKykgewotICAgIGludCBuZXdfa2V5ID0ga2V5ICsgbWF4X3NpemU7Ci0gICAgY2FjaGUuUHV0KG5ld19rZXksIG5ld19rZXkpOwotICAgIEVYUEVDVF9GQUxTRShjYWNoZS5IYXNLZXkoa2V5KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuSGFzS2V5KG5ld19rZXkpKTsKLSAgfQotCi0gIC8vIGNsZWFyIHRoZSBlbnRpcmUgY2FjaGUKLSAgaW50KiB2YWx1ZSA9IG5ldyBpbnQoMCk7Ci0gIGZvciAoaW50IGtleSA9IG1heF9zaXplOyBrZXkgPCAyICogbWF4X3NpemU7IGtleSsrKSB7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuR2V0KGtleSwgdmFsdWUpKTsKLSAgICBFWFBFQ1RfRVEoKnZhbHVlLCBrZXkpOwotICAgIEVYUEVDVF9UUlVFKGNhY2hlLlJlbW92ZShrZXkpKTsKLSAgfQotICBFWFBFQ1RfRVEoY2FjaGUuU2l6ZSgpLCAwKTsKLQotICAvLyB0ZXN0IGV4ZWN1dGlvbiB0aW1lCi0gIGF1dG8gZG9uZSA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBpbnQgZXhlY3V0aW9uX3RpbWUgPQotICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oZG9uZSAtIHN0YXJ0ZWQpCi0gICAgICAgICAgLmNvdW50KCk7Ci0gIC8vIGFsd2F5cyBhcm91bmQgNzUwbXMgb24gZmxhbWUuIDE0MDAgbXMgb24gY3Jvc3NoYXRjaCwgNjgwMCBtcyBvbiBwcmVzdWJtaXQKLSAgLy8gU2hvdWxkbid0IGJlIG1vcmUgdGhhbiAxMDAwMG1zCi0gIEVYUEVDVF9MVChleGVjdXRpb25fdGltZSwgMTAwMDApOwotfQotCi1URVNUKEJsdWV0b290aExlZ2FjeUxydUNhY2hlVGVzdCwgQmx1ZXRvb3RoTHJ1TXVsdGlUaHJlYWRQcmVzc3VyZVRlc3QpIHsKLSAgTGVnYWN5THJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDEwMCwgInRlc3RpbmciKTsKLSAgYXV0byBwb2ludGVyID0gJmNhY2hlOwotICAvLyBtYWtlIHN1cmUgbm8gZGVhZGxvY2sKLSAgc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHdvcmtlcnM7Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwMDsga2V5KyspIHsKLSAgICB3b3JrZXJzLnB1c2hfYmFjayhzdGQ6OnRocmVhZChba2V5LCBwb2ludGVyXSgpIHsKLSAgICAgIHBvaW50ZXItPlB1dChrZXksIGtleSk7Ci0gICAgICBFWFBFQ1RfVFJVRShwb2ludGVyLT5IYXNLZXkoa2V5KSk7Ci0gICAgICBFWFBFQ1RfVFJVRShwb2ludGVyLT5SZW1vdmUoa2V5KSk7Ci0gICAgfSkpOwotICB9Ci0gIGZvciAoYXV0byYgd29ya2VyIDogd29ya2VycykgewotICAgIHdvcmtlci5qb2luKCk7Ci0gIH0KLSAgRVhQRUNUX0VRKGNhY2hlLlNpemUoKSwgMCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9jb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5jYyBiL2NvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZhMDhhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJtZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLQotI2luY2x1ZGUgImdkL2NvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotc3RhdGljIGNvbnN0ZXhwciBpbnQga1JlYWxUaW1lRmlmb1NjaGVkdWxpbmdQcmlvcml0eSA9IDE7Ci0KLU1lc3NhZ2VMb29wVGhyZWFkOjpNZXNzYWdlTG9vcFRocmVhZChjb25zdCBzdGQ6OnN0cmluZyYgdGhyZWFkX25hbWUpCi0gICAgOiBNZXNzYWdlTG9vcFRocmVhZCh0aHJlYWRfbmFtZSwgZmFsc2UpIHt9Ci0KLU1lc3NhZ2VMb29wVGhyZWFkOjpNZXNzYWdlTG9vcFRocmVhZChjb25zdCBzdGQ6OnN0cmluZyYgdGhyZWFkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tYWluKQotICAgIDogdGhyZWFkX25hbWVfKHRocmVhZF9uYW1lKSwKLSAgICAgIG1lc3NhZ2VfbG9vcF8obnVsbHB0ciksCi0gICAgICBydW5fbG9vcF8obnVsbHB0ciksCi0gICAgICB0aHJlYWRfKG51bGxwdHIpLAotICAgICAgdGhyZWFkX2lkXygtMSksCi0gICAgICBsaW51eF90aWRfKC0xKSwKLSAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfKHRoaXMpLAotICAgICAgc2h1dHRpbmdfZG93bl8oZmFsc2UpLAotICAgICAgaXNfbWFpbl8oaXNfbWFpbiksCi0gICAgICBydXN0X3RocmVhZF8obnVsbHB0cikge30KLQotTWVzc2FnZUxvb3BUaHJlYWQ6On5NZXNzYWdlTG9vcFRocmVhZCgpIHsgU2h1dERvd24oKTsgfQotCi12b2lkIE1lc3NhZ2VMb29wVGhyZWFkOjpTdGFydFVwKCkgewotICBpZiAoaXNfbWFpbl8gJiYgaW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICBydXN0X3RocmVhZF8gPSBuZXcgOjpydXN0OjpCb3g8c2hpbTo6cnVzdDo6TWVzc2FnZUxvb3BUaHJlYWQ+KAotICAgICAgICBzaGltOjpydXN0OjptYWluX21lc3NhZ2VfbG9vcF90aHJlYWRfY3JlYXRlKCkpOwotICAgIGF1dG8gcnVzdF9pZCA9Ci0gICAgICAgIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6bWFpbl9tZXNzYWdlX2xvb3BfdGhyZWFkX3N0YXJ0KCoqcnVzdF90aHJlYWRfKTsKLSAgICB0aHJlYWRfaWRfID0gcnVzdF9pZDsKLSAgICBsaW51eF90aWRfID0gcnVzdF9pZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnByb21pc2U8dm9pZD4gc3RhcnRfdXBfcHJvbWlzZTsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gc3RhcnRfdXBfZnV0dXJlID0gc3RhcnRfdXBfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICAgIGlmICh0aHJlYWRfICE9IG51bGxwdHIpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiB0aHJlYWQgIiA8PCAqdGhpcyA8PCAiIGlzIGFscmVhZHkgc3RhcnRlZCI7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdGhyZWFkXyA9IG5ldyBzdGQ6OnRocmVhZCgmTWVzc2FnZUxvb3BUaHJlYWQ6OlJ1blRocmVhZCwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzdGFydF91cF9wcm9taXNlKSk7Ci0gIH0KLSAgc3RhcnRfdXBfZnV0dXJlLndhaXQoKTsKLX0KLQotYm9vbCBNZXNzYWdlTG9vcFRocmVhZDo6RG9JblRocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrKSB7Ci0gIHJldHVybiBEb0luVGhyZWFkRGVsYXllZChmcm9tX2hlcmUsIHN0ZDo6bW92ZSh0YXNrKSwgYmFzZTo6VGltZURlbHRhKCkpOwotfQotCi1ib29sIE1lc3NhZ2VMb29wVGhyZWFkOjpEb0luVGhyZWFkRGVsYXllZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZGVsYXkpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgaWYgKGlzX21haW5fICYmIGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKSB7Ci0gICAgaWYgKHJ1c3RfdGhyZWFkXyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHJ1c3QgdGhyZWFkIGlzIG51bGwgZm9yIHRocmVhZCAiIDw8ICp0aGlzCi0gICAgICAgICAgICAgICAgIDw8ICIsIGZyb20gIiA8PCBmcm9tX2hlcmUuVG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaGltOjpydXN0OjptYWluX21lc3NhZ2VfbG9vcF90aHJlYWRfZG9fZGVsYXllZCgKLSAgICAgICAgKipydXN0X3RocmVhZF8sCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8c2hpbTo6cnVzdDo6T25jZUNsb3N1cmU+KHN0ZDo6bW92ZSh0YXNrKSksCi0gICAgICAgIGRlbGF5LkluTWlsbGlzZWNvbmRzKCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKG1lc3NhZ2VfbG9vcF8gPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogbWVzc2FnZSBsb29wIGlzIG51bGwgZm9yIHRocmVhZCAiIDw8ICp0aGlzCi0gICAgICAgICAgICAgICA8PCAiLCBmcm9tICIgPDwgZnJvbV9oZXJlLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdERlbGF5ZWRUYXNrKGZyb21faGVyZSwgc3RkOjptb3ZlKHRhc2spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBmYWlsZWQgdG8gcG9zdCB0YXNrIHRvIG1lc3NhZ2UgbG9vcCBmb3IgdGhyZWFkICIgPDwgKnRoaXMKLSAgICAgICAgICAgICAgIDw8ICIsIGZyb20gIiA8PCBmcm9tX2hlcmUuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTWVzc2FnZUxvb3BUaHJlYWQ6OlNodXREb3duKCkgewotICB7Ci0gICAgaWYgKGlzX21haW5fICYmIGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICBkZWxldGUgcnVzdF90aHJlYWRfOwotICAgICAgcnVzdF90aHJlYWRfID0gbnVsbHB0cjsKLSAgICAgIHRocmVhZF9pZF8gPSAtMTsKLSAgICAgIGxpbnV4X3RpZF8gPSAtMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICAgIGlmICh0aHJlYWRfID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB0aHJlYWQgIiA8PCAqdGhpcyA8PCAiIGlzIGFscmVhZHkgc3RvcHBlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtZXNzYWdlX2xvb3BfID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBtZXNzYWdlX2xvb3BfIGlzIG51bGwuIEFscmVhZHkgc3RvcHBpbmciOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc2h1dHRpbmdfZG93bl8pIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB3YWl0aW5nIGZvciB0aHJlYWQgdG8gam9pbiI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHNodXR0aW5nX2Rvd25fID0gdHJ1ZTsKLSAgICBDSEVDS19ORSh0aHJlYWRfaWRfLCBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3VycmVudElkKCkpCi0gICAgICAgIDw8IF9fZnVuY19fIDw8ICIgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gdGhlIHRocmVhZCBpdHNlbGYuICIKLSAgICAgICAgPDwgIk90aGVyd2lzZSwgZGVhZGxvY2sgbWF5IGhhcHBlbi4iOwotICAgIGlmICghbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsIHJ1bl9sb29wXy0+UXVpdFdoZW5JZGxlQ2xvc3VyZSgpKSkgewotICAgICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBmYWlsZWQgdG8gcG9zdCB0YXNrIHRvIG1lc3NhZ2UgbG9vcCBmb3IgdGhyZWFkICIKLSAgICAgICAgICAgICAgICAgPDwgKnRoaXM7Ci0gICAgfQotICB9Ci0gIHRocmVhZF8tPmpvaW4oKTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gICAgdGhyZWFkXyA9IG51bGxwdHI7Ci0gICAgc2h1dHRpbmdfZG93bl8gPSBmYWxzZTsKLSAgfQotfQotCi1iYXNlOjpQbGF0Zm9ybVRocmVhZElkIE1lc3NhZ2VMb29wVGhyZWFkOjpHZXRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgcmV0dXJuIHRocmVhZF9pZF87Ci19Ci0KLXN0ZDo6c3RyaW5nIE1lc3NhZ2VMb29wVGhyZWFkOjpHZXROYW1lKCkgY29uc3QgewotICByZXR1cm4gdGhyZWFkX25hbWVfOwotfQotCi1zdGQ6OnN0cmluZyBNZXNzYWdlTG9vcFRocmVhZDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoIiVzKCVkKSIsIHRocmVhZF9uYW1lXy5jX3N0cigpLCB0aHJlYWRfaWRfKTsKLX0KLQotYm9vbCBNZXNzYWdlTG9vcFRocmVhZDo6SXNSdW5uaW5nKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICByZXR1cm4gdGhyZWFkX2lkXyAhPSAtMTsKLX0KLQotLy8gTm9uIEFQSSBtZXRob2QsIHNob3VsZCBub3QgYmUgcHJvdGVjdGVkIGJ5IEFQSSBtdXRleAotdm9pZCBNZXNzYWdlTG9vcFRocmVhZDo6UnVuVGhyZWFkKE1lc3NhZ2VMb29wVGhyZWFkKiB0aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHN0YXJ0X3VwX3Byb21pc2UpIHsKLSAgdGhyZWFkLT5SdW4oc3RkOjptb3ZlKHN0YXJ0X3VwX3Byb21pc2UpKTsKLX0KLQotYnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wKiBNZXNzYWdlTG9vcFRocmVhZDo6bWVzc2FnZV9sb29wKCkgY29uc3QgewotICBBU1NFUlRfTE9HKCFpc19tYWluXywKLSAgICAgICAgICAgICAieW91IGFyZSBub3QgYWxsb3dlZCB0byBnZXQgdGhlIG1haW4gdGhyZWFkJ3MgbWVzc2FnZSBsb29wIik7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgcmV0dXJuIG1lc3NhZ2VfbG9vcF87Ci19Ci0KLWJvb2wgTWVzc2FnZUxvb3BUaHJlYWQ6OkVuYWJsZVJlYWxUaW1lU2NoZWR1bGluZygpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLQotICBpZiAoIUlzUnVubmluZygpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB0aHJlYWQgIiA8PCAqdGhpcyA8PCAiIGlzIG5vdCBydW5uaW5nIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcnRfcGFyYW1zID0gey5zY2hlZF9wcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZWFsVGltZUZpZm9TY2hlZHVsaW5nUHJpb3JpdHl9OwotICBpbnQgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIobGludXhfdGlkXywgU0NIRURfRklGTywgJnJ0X3BhcmFtcyk7Ci0gIGlmIChyYyAhPSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gc2V0IFNDSEVEX0ZJRk8gcHJpb3JpdHkgIgotICAgICAgICAgICAgICAgPDwga1JlYWxUaW1lRmlmb1NjaGVkdWxpbmdQcmlvcml0eSA8PCAiIGZvciBsaW51eF90aWQgIgotICAgICAgICAgICAgICAgPDwgc3RkOjp0b19zdHJpbmcobGludXhfdGlkXykgPDwgIiwgdGhyZWFkICIgPDwgKnRoaXMKLSAgICAgICAgICAgICAgIDw8ICIsIGVycm9yOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJhc2U6OldlYWtQdHI8TWVzc2FnZUxvb3BUaHJlYWQ+IE1lc3NhZ2VMb29wVGhyZWFkOjpHZXRXZWFrUHRyKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICByZXR1cm4gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOwotfQotCi12b2lkIE1lc3NhZ2VMb29wVGhyZWFkOjpSdW4oc3RkOjpwcm9taXNlPHZvaWQ+IHN0YXJ0X3VwX3Byb21pc2UpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gICAgaWYgKGlzX21haW5fICYmIGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG1lc3NhZ2UgbG9vcCBzdGFydGluZyBmb3IgdGhyZWFkICIKLSAgICAgICAgICAgICAgPDwgdGhyZWFkX25hbWVfOwotICAgIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpTZXROYW1lKHRocmVhZF9uYW1lXyk7Ci0gICAgbWVzc2FnZV9sb29wXyA9IG5ldyBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AoKTsKLSAgICBydW5fbG9vcF8gPSBuZXcgYmFzZTo6UnVuTG9vcCgpOwotICAgIHRocmVhZF9pZF8gPSBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3VycmVudElkKCk7Ci0gICAgbGludXhfdGlkXyA9IHN0YXRpY19jYXN0PHBpZF90PihzeXNjYWxsKFNZU19nZXR0aWQpKTsKLSAgICBzdGFydF91cF9wcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci0KLSAgLy8gQmxvY2tpbmcgdW50aWwgU2h1dERvd24oKSBpcyBjYWxsZWQKLSAgcnVuX2xvb3BfLT5SdW4oKTsKLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgICB0aHJlYWRfaWRfID0gLTE7Ci0gICAgbGludXhfdGlkXyA9IC0xOwotICAgIGRlbGV0ZSBtZXNzYWdlX2xvb3BfOwotICAgIG1lc3NhZ2VfbG9vcF8gPSBudWxscHRyOwotICAgIGRlbGV0ZSBydW5fbG9vcF87Ci0gICAgcnVuX2xvb3BfID0gbnVsbHB0cjsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogbWVzc2FnZSBsb29wIGZpbmlzaGVkIGZvciB0aHJlYWQgIgotICAgICAgICAgICAgICA8PCB0aHJlYWRfbmFtZV87Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIGIvY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMGRiYy4uMDAwMDAwMAotLS0gYS9jb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGJhc2UvcnVuX2xvb3AuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaD4KLSNpbmNsdWRlICJzcmMvbWVzc2FnZV9sb29wX3RocmVhZC5ycy5oIgotCi0jaW5jbHVkZSAiYWJzdHJhY3RfbWVzc2FnZV9sb29wLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gdmFyaW91cyB0aHJlYWQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5Ci0gKi8KLWNsYXNzIE1lc3NhZ2VMb29wVGhyZWFkIGZpbmFsIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBtZXNzYWdlIGxvb3AgdGhyZWFkIHdpdGggbmFtZS4gVGhyZWFkIHdvbid0IGJlIHJ1bm5pbmcgdW50aWwKLSAgICogU3RhcnRVcCBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSB0aHJlYWRfbmFtZSBuYW1lIG9mIHRoaXMgd29ya2VyIHRocmVhZAotICAgKi8KLSAgZXhwbGljaXQgTWVzc2FnZUxvb3BUaHJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHRocmVhZF9uYW1lKTsKLSAgZXhwbGljaXQgTWVzc2FnZUxvb3BUaHJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHRocmVhZF9uYW1lLCBib29sIGlzX21haW4pOwotCi0gIC8qKgotICAgKiBEZXN0cm95cyB0aGUgbWVzc2FnZSBsb29wIHRocmVhZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgZ29lcyBvdXQgb2Ygc2NvcGUKLSAgICovCi0gIH5NZXNzYWdlTG9vcFRocmVhZCgpOwotCi0gIC8qKgotICAgKiBTdGFydCB0aGUgdW5kZXJseWluZyB0aHJlYWQuIEJsb2NrcyB1bnRpbCBhbGwgdGhyZWFkIGluZnJhc3RydWN0dXJlIGlzCi0gICAqIHNldHVwLiBJc1J1bm5pbmcoKSBhbmQgRG9JblRocmVhZCgpIHNob3VsZCByZXR1cm4gdHJ1ZSBhZnRlciB0aGlzIGNhbGwuCi0gICAqIEJsb2NrcyB1bnRpbCB0aGUgdGhyZWFkIGlzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLgotICAgKgotICAgKiBSZXBlYXRlZCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgb25seSBzdGFydCB0aGlzIHRocmVhZCBvbmNlCi0gICAqLwotICB2b2lkIFN0YXJ0VXAoKTsKLQotICAvKioKLSAgICogUG9zdCBhIHRhc2sgdG8gcnVuIG9uIHRoaXMgdGhyZWFkCi0gICAqCi0gICAqIEBwYXJhbSBmcm9tX2hlcmUgbG9jYXRpb24gd2hlcmUgdGhpcyB0YXNrIGlzIG9yaWdpbmF0ZWQKLSAgICogQHBhcmFtIHRhc2sgdGFzayBjcmVhdGVkIHRocm91Z2ggYmFzZTo6QmluZCgpCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0YXNrIGlzIHN1Y2Nlc3NmdWxseSBzY2hlZHVsZWQsIGZhbHNlIGlmIHRhc2sgY2Fubm90IGJlCi0gICAqIHNjaGVkdWxlZAotICAgKi8KLSAgYm9vbCBEb0luVGhyZWFkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2spOwotCi0gIC8qKgotICAgKiBTaHV0ZG93biB0aGUgY3VycmVudCB0aHJlYWQgYXMgaWYgaXQgaXMgbmV2ZXIgc3RhcnRlZC4gSXNSdW5uaW5nKCkgYW5kCi0gICAqIERvSW5UaHJlYWQoKSB3aWxsIHJldHVybiBmYWxzZSBhZnRlciB0aGlzIGNhbGwuIEJsb2NrcyB1bnRpbCB0aGUgdGhyZWFkIGlzCi0gICAqIGpvaW5lZCBhbmQgZnJlZWQuIFRoaXMgdGhyZWFkIGNhbiBiZSByZS1zdGFydGVkIGFnYWluIHVzaW5nIFN0YXJ0VXAoKQotICAgKgotICAgKiBSZXBlYXRlZCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgb25seSBzdG9wIHRoaXMgdGhyZWFkIG9uY2UKLSAgICoKLSAgICogTk9URTogU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBvbiB0aGUgdGhyZWFkIGl0c2VsZiB0byBhdm9pZCBkZWFkbG9jawotICAgKi8KLSAgdm9pZCBTaHV0RG93bigpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgdGhyZWFkIElEIHJldHVybmVkIGJ5IFBsYXRmb3JtVGhyZWFkOjpDdXJyZW50SWQoKQotICAgKgotICAgKiBPbiBBbmRyb2lkIHBsYXRmb3JtLCB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgdGlkIGxvZ2dlZCBieQotICAgKiBsb2djYXQsIHdoaWNoIGlzIHJldHVybmVkIGJ5IGdldHRpZCgpLiBPbiBvdGhlciBwbGF0Zm9ybSwgdGhpcyB0aHJlYWQgaWQKLSAgICogbWF5IGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzLiBUaGVyZWZvcmUsIHRoaXMgSUQgaXMgb25seSBnb29kIGZvciBsb2dnaW5nCi0gICAqIGFuZCB0aHJlYWQgY29tcGFyaXNvbiBwdXJwb3NlCi0gICAqCi0gICAqIEByZXR1cm4gdGhpcyB0aHJlYWQncyBJRAotICAgKi8KLSAgYmFzZTo6UGxhdGZvcm1UaHJlYWRJZCBHZXRUaHJlYWRJZCgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXQgdGhpcyB0aHJlYWQncyBuYW1lIHNldCBpbiBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcmV0dXJuIHRoaXMgdGhyZWFkJ3MgbmFtZSBzZXQgaW4gY29uc3RydWN0b3IKLSAgICovCi0gIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdGhyZWFkCi0gICAqCi0gICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0aHJlYWQKLSAgICovCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoaXMgdGhyZWFkIGlzIHJ1bm5pbmcKLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmZiB0aGlzIHRocmVhZCBpcyBydW5uaW5nIGFuZCBpcyBhYmxlIHRvIGRvIHRhc2sKLSAgICovCi0gIGJvb2wgSXNSdW5uaW5nKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gbWFrZSBzY2hlZHVsaW5nIGZvciB0aGlzIHRocmVhZCByZWFsIHRpbWUKLSAgICoKLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgYm9vbCBFbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB3ZWFrIHBvaW50ZXIgdG8gdGhpcyBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHBvc3RpbmcKLSAgICogZGVsYXllZCB0YXNrcyB0byB0aGlzIE1lc3NhZ2VMb29wVGhyZWFkIHVzaW5nIFRpbWVyLgotICAgKi8KLSAgYmFzZTo6V2Vha1B0cjxNZXNzYWdlTG9vcFRocmVhZD4gR2V0V2Vha1B0cigpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgbG9vcCBmb3IgdGhpcyB0aHJlYWQuIEFjY2Vzc2luZyByYXcgbWVzc2FnZSBsb29wIGlzIG5vdAotICAgKiByZWNvbW1lbmRlZCBhcyBtZXNzYWdlIGxvb3AgY2FuIGJlIGZyZWVkIGludGVybmFsbHkuCi0gICAqCi0gICAqIEByZXR1cm4gbWVzc2FnZSBsb29wIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRocmVhZCwgbnVsbHB0ciBpZiB0aHJlYWQgaXMgbm90Ci0gICAqIHJ1bm5pbmcKLSAgICovCi0gIGJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFBvc3QgYSB0YXNrIHRvIHJ1biBvbiB0aGlzIHRocmVhZCBhZnRlciBhIHNwZWNpZmllZCBkZWxheS4gSWYgdGhlIHRhc2sKLSAgICogbmVlZHMgdG8gYmUgY2FuY2VsYWJsZSBiZWZvcmUgaXQncyBydW4sIHVzZSBiYXNlOjpDYW5jZWxhYmxlQ2xvc3VyZSB0eXBlCi0gICAqIGZvciB0YXNrIGNsb3N1cmUuIEZvciBleGFtcGxlOgotICAgKiA8Y29kZT4KLSAgICogYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmUgY2FuY2VsYWJsZV90YXNrOwotICAgKiBjYW5jZWxhYmxlX3Rhc2suUmVzZXQoYmFzZTo6QmluZCguLi4pKTsgLy8gYmluZCB0aGUgdGFzawotICAgKiBzYW1lX3RocmVhZC0+RG9JblRocmVhZERlbGF5ZWQoRlJPTV9IRVJFLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZV90YXNrLmNhbGxiYWNrKCksIGRlbGF5KTsKLSAgICogLi4uCi0gICAqIC8vIENhbmNlbCB0aGUgdGFzayBjbG9zdXJlCi0gICAqIHNhbWVfdGhyZWFkLT5Eb0luVGhyZWFkKEZST01fSEVSRSwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmU6OkNhbmNlbCwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZjYW5jZWxhYmxlX3Rhc2spKSk7Ci0gICAqIDwvY29kZT4KLSAgICoKLSAgICogV2FybmluZzogYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmUgb2JqZWN0cyBtdXN0IGJlIGNyZWF0ZWQgb24sIHBvc3RlZCB0bywKLSAgICogY2FuY2VsbGVkIG9uLCBhbmQgZGVzdHJveWVkIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICoKLSAgICogQHBhcmFtIGZyb21faGVyZSBsb2NhdGlvbiB3aGVyZSB0aGlzIHRhc2sgaXMgb3JpZ2luYXRlZAotICAgKiBAcGFyYW0gdGFzayB0YXNrIGNyZWF0ZWQgdGhyb3VnaCBiYXNlOjpCaW5kKCkKLSAgICogQHBhcmFtIGRlbGF5IGRlbGF5IGZvciB0aGUgdGFzayB0byBiZSBleGVjdXRlZAotICAgKiBAcmV0dXJuIHRydWUgaWYgdGFzayBpcyBzdWNjZXNzZnVsbHkgc2NoZWR1bGVkLCBmYWxzZSBpZiB0YXNrIGNhbm5vdCBiZQotICAgKiBzY2hlZHVsZWQKLSAgICovCi0gIGJvb2wgRG9JblRocmVhZERlbGF5ZWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrLCBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGRlbGF5KTsKLQotIHByaXZhdGU6Ci0gIC8qKgotICAgKiBTdGF0aWMgbWV0aG9kIHRvIHJ1biB0aGUgdGhyZWFkCi0gICAqCi0gICAqIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgQysrIGxhbWJkYSBiZWNhdXNlIG9mIHRoZSB1c2Ugb2Ygc3RkOjpzaGFyZWRfcHRyCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0IG5lZWRzIHRvIGJlIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlTG9vcFRocmVhZAotICAgKiBAcGFyYW0gc3RhcnRfdXBfcHJvbWlzZSBhIHN0ZDo6cHJvbWlzZSB0aGF0IGlzIHVzZWQgdG8gbm90aWZ5IGNhbGxpbmcKLSAgICogdGhyZWFkIHRoZSBjb21wbGV0aW9uIG9mIG1lc3NhZ2UgbG9vcCBzdGFydC11cAotICAgKi8KLSAgc3RhdGljIHZvaWQgUnVuVGhyZWFkKE1lc3NhZ2VMb29wVGhyZWFkKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHN0YXJ0X3VwX3Byb21pc2UpOwotCi0gIC8qKgotICAgKiBBY3R1YWwgbWV0aG9kIHRvIHJ1biB0aGUgdGhyZWFkLCBibG9ja2luZyB1bnRpbCBTaHV0RG93bigpIGlzIGNhbGxlZAotICAgKgotICAgKiBAcGFyYW0gc3RhcnRfdXBfcHJvbWlzZSBhIHN0ZDo6cHJvbWlzZSB0aGF0IGlzIHVzZWQgdG8gbm90aWZ5IGNhbGxpbmcKLSAgICogdGhyZWFkIHRoZSBjb21wbGV0aW9uIG9mIG1lc3NhZ2UgbG9vcCBzdGFydC11cAotICAgKi8KLSAgdm9pZCBSdW4oc3RkOjpwcm9taXNlPHZvaWQ+IHN0YXJ0X3VwX3Byb21pc2UpOwotCi0gIG11dGFibGUgc3RkOjpyZWN1cnNpdmVfbXV0ZXggYXBpX211dGV4XzsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgdGhyZWFkX25hbWVfOwotICBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcF87Ci0gIGJhc2U6OlJ1bkxvb3AqIHJ1bl9sb29wXzsKLSAgc3RkOjp0aHJlYWQqIHRocmVhZF87Ci0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgdGhyZWFkX2lkXzsKLSAgLy8gTGludXggc3BlY2lmaWMgYWJzdHJhY3Rpb25zCi0gIHBpZF90IGxpbnV4X3RpZF87Ci0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PE1lc3NhZ2VMb29wVGhyZWFkPiB3ZWFrX3B0cl9mYWN0b3J5XzsKLSAgYm9vbCBzaHV0dGluZ19kb3duXzsKLSAgYm9vbCBpc19tYWluXzsKLSAgOjpydXN0OjpCb3g8c2hpbTo6cnVzdDo6TWVzc2FnZUxvb3BUaHJlYWQ+KiBydXN0X3RocmVhZF8gPSBudWxscHRyOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZXNzYWdlTG9vcFRocmVhZCk7Ci19OwotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCYgYSkgewotICBvcyA8PCBhLlRvU3RyaW5nKCk7Ci0gIHJldHVybiBvczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vbWVzc2FnZV9sb29wX3RocmVhZF91bml0dGVzdC5jYyBiL2NvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZThmMGE0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAibWVzc2FnZV9sb29wX3RocmVhZC5oIgotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPHN5c2NhbGwuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgdG8gdmVyaWZ5IE1lc3NhZ2VMb29wVGhyZWFkLiBNdXN0IGhhdmUgQ0FQX1NZU19OSUNFIGNhcGFiaWxpdHkuCi0gKi8KLWNsYXNzIE1lc3NhZ2VMb29wVGhyZWFkVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTaG91bGROb3RIYXBwZW4oKSB7IEZBSUwoKSA8PCAiU2hvdWxkIG5vdCBoYXBwZW4iOyB9Ci0KLSAgdm9pZCBHZXRUaHJlYWRJZChzdGQ6OnByb21pc2U8YmFzZTo6UGxhdGZvcm1UaHJlYWRJZD4gdGhyZWFkX2lkX3Byb21pc2UpIHsKLSAgICB0aHJlYWRfaWRfcHJvbWlzZS5zZXRfdmFsdWUoYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpKTsKLSAgfQotCi0gIHZvaWQgR2V0TGludXhUaWQoc3RkOjpwcm9taXNlPHBpZF90PiB0aWRfcHJvbWlzZSkgewotICAgIHRpZF9wcm9taXNlLnNldF92YWx1ZShzdGF0aWNfY2FzdDxwaWRfdD4oc3lzY2FsbChTWVNfZ2V0dGlkKSkpOwotICB9Ci0KLSAgdm9pZCBHZXROYW1lKHN0ZDo6cHJvbWlzZTxzdGQ6OnN0cmluZz4gbmFtZV9wcm9taXNlKSB7Ci0gICAgY2hhciBteV9uYW1lWzI1Nl07Ci0gICAgcHRocmVhZF9nZXRuYW1lX25wKHB0aHJlYWRfc2VsZigpLCBteV9uYW1lLCBzaXplb2YobXlfbmFtZSkpOwotICAgIG5hbWVfcHJvbWlzZS5zZXRfdmFsdWUobXlfbmFtZSk7Ci0gIH0KLQotICB2b2lkIEdldFNjaGVkdWxpbmdQb2xpY3lBbmRQcmlvcml0eShpbnQqIHNjaGVkdWxpbmdfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNjaGVkdWxlX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gZXhlY3V0aW9uX3Byb21pc2UpIHsKLSAgICAqc2NoZWR1bGluZ19wb2xpY3kgPSBzY2hlZF9nZXRzY2hlZHVsZXIoMCk7Ci0gICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0ge307Ci0gICAgQVNTRVJUX0VRKHNjaGVkX2dldHBhcmFtKDAsICZwYXJhbSksIDApOwotICAgICpzY2hlZHVsZV9wcmlvcml0eSA9IHBhcmFtLnNjaGVkX3ByaW9yaXR5OwotICAgIGV4ZWN1dGlvbl9wcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci0KLSAgdm9pZCBTbGVlcEFuZEdldE5hbWUoc3RkOjpwcm9taXNlPHN0ZDo6c3RyaW5nPiBuYW1lX3Byb21pc2UsIGludCBzbGVlcF9tcykgewotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHNsZWVwX21zKSk7Ci0gICAgR2V0TmFtZShzdGQ6Om1vdmUobmFtZV9wcm9taXNlKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RhdGljIGJvb2wgQ2FuU2V0Q3VycmVudFRocmVhZFByaW9yaXR5KCkgewotICAgIHN0cnVjdCBfX3VzZXJfY2FwX2hlYWRlcl9zdHJ1Y3QgbGludXhfdXNlcl9oZWFkZXIgPSB7Ci0gICAgICAgIC52ZXJzaW9uID0gX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8zfTsKLSAgICBzdHJ1Y3QgX191c2VyX2NhcF9kYXRhX3N0cnVjdCBsaW51eF91c2VyX2RhdGEgPSB7fTsKLSAgICBpZiAoY2FwZ2V0KCZsaW51eF91c2VyX2hlYWRlciwgJmxpbnV4X3VzZXJfZGF0YSkgIT0gMCkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBjYXBhYmlsaXR5IGZvciBjdXJyZW50IHRocmVhZCwgZXJyb3I6ICIKLSAgICAgICAgICAgICAgICAgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgICAgLy8gTG9nIHJlY29yZCBpbiBYTUwKLSAgICAgIFJlY29yZFByb3BlcnR5KCJNZXNzYWdlTG9vcFRocmVhZFRlc3RDYW5ub3RHZXRDYXBhYmlsaXR5UmVhc29uIiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiAoKGxpbnV4X3VzZXJfZGF0YS5wZXJtaXR0ZWQgPj4gQ0FQX1NZU19OSUNFKSAmIDB4MSkgIT0gMDsKLSAgfQotfTsKLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgZ2V0X3dlYWtfcHRyKSB7Ci0gIGJhc2U6OldlYWtQdHI8TWVzc2FnZUxvb3BUaHJlYWQ+IG1lc3NhZ2VfbG9vcF90aHJlYWRfcHRyOwotICB7Ci0gICAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZCgidGVzdF90aHJlYWQiKTsKLSAgICBtZXNzYWdlX2xvb3BfdGhyZWFkX3B0ciA9IG1lc3NhZ2VfbG9vcF90aHJlYWQuR2V0V2Vha1B0cigpOwotICAgIEFTU0VSVF9ORShtZXNzYWdlX2xvb3BfdGhyZWFkX3B0ciwgbnVsbHB0cik7Ci0gIH0KLSAgQVNTRVJUX0VRKG1lc3NhZ2VfbG9vcF90aHJlYWRfcHRyLCBudWxscHRyKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9ydW5uaW5nX3RocmVhZCkgewotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKCJ0ZXN0X3RocmVhZCIpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgQVNTRVJUX0dFKG1lc3NhZ2VfbG9vcF90aHJlYWQuR2V0VGhyZWFkSWQoKSwgMCk7Ci0gIEFTU0VSVF9UUlVFKG1lc3NhZ2VfbG9vcF90aHJlYWQuSXNSdW5uaW5nKCkpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci0gIEFTU0VSVF9MVChtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFRocmVhZElkKCksIDApOwotICBBU1NFUlRfRkFMU0UobWVzc2FnZV9sb29wX3RocmVhZC5Jc1J1bm5pbmcoKSk7Ci19Ci0KLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHRlc3Rfbm90X3NlbGYpIHsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZCgidGVzdF90aHJlYWQiKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIEFTU0VSVF9HRShtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFRocmVhZElkKCksIDApOwotICBBU1NFUlRfTkUobWVzc2FnZV9sb29wX3RocmVhZC5HZXRUaHJlYWRJZCgpLAotICAgICAgICAgICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9zaHV0ZG93bl93aXRob3V0X3N0YXJ0KSB7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQoInRlc3RfdGhyZWFkIik7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU2h1dERvd24oKTsKLSAgQVNTRVJUX0xUKG1lc3NhZ2VfbG9vcF90aHJlYWQuR2V0VGhyZWFkSWQoKSwgMCk7Ci19Ci0KLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHRlc3RfZG9faW5fdGhyZWFkX2JlZm9yZV9zdGFydCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2VfbG9vcF90aHJlYWQuRG9JblRocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmTWVzc2FnZUxvb3BUaHJlYWRUZXN0OjpTaG91bGROb3RIYXBwZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9kb19pbl90aHJlYWRfYWZ0ZXJfc2h1dGRvd24pIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci0gIEFTU0VSVF9GQUxTRShtZXNzYWdlX2xvb3BfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJk1lc3NhZ2VMb29wVGhyZWFkVGVzdDo6U2hvdWxkTm90SGFwcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSk7Ci19Ci0KLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHRlc3RfbmFtZSkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIEFTU0VSVF9HRShtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFRocmVhZElkKCksIDApOwotICBzdGQ6OnByb21pc2U8c3RkOjpzdHJpbmc+IG5hbWVfcHJvbWlzZTsKLSAgc3RkOjpmdXR1cmU8c3RkOjpzdHJpbmc+IG5hbWVfZnV0dXJlID0gbmFtZV9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJk1lc3NhZ2VMb29wVGhyZWFkVGVzdDo6R2V0TmFtZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShuYW1lX3Byb21pc2UpKSk7Ci0gIHN0ZDo6c3RyaW5nIG15X25hbWUgPSBuYW1lX2Z1dHVyZS5nZXQoKTsKLSAgQVNTRVJUX0VRKG5hbWUsIG15X25hbWUpOwotICBBU1NFUlRfRVEobmFtZSwgbWVzc2FnZV9sb29wX3RocmVhZC5HZXROYW1lKCkpOwotfQotCi1URVNUX0YoTWVzc2FnZUxvb3BUaHJlYWRUZXN0LCB0ZXN0X3RocmVhZF9pZCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgdGhyZWFkX2lkID0gbWVzc2FnZV9sb29wX3RocmVhZC5HZXRUaHJlYWRJZCgpOwotICBBU1NFUlRfR0UodGhyZWFkX2lkLCAwKTsKLSAgc3RkOjpwcm9taXNlPGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQ+IHRocmVhZF9pZF9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTxiYXNlOjpQbGF0Zm9ybVRocmVhZElkPiB0aHJlYWRfaWRfZnV0dXJlID0KLSAgICAgIHRocmVhZF9pZF9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJk1lc3NhZ2VMb29wVGhyZWFkVGVzdDo6R2V0VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBzdGQ6Om1vdmUodGhyZWFkX2lkX3Byb21pc2UpKSk7Ci0gIGJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgbXlfdGhyZWFkX2lkID0gdGhyZWFkX2lkX2Z1dHVyZS5nZXQoKTsKLSAgQVNTRVJUX0VRKHRocmVhZF9pZCwgbXlfdGhyZWFkX2lkKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9zZXRfcmVhbHRpbWVfcHJpb3JpdHlfZmFpbF9iZWZvcmVfc3RhcnQpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIEFTU0VSVF9GQUxTRShtZXNzYWdlX2xvb3BfdGhyZWFkLkVuYWJsZVJlYWxUaW1lU2NoZWR1bGluZygpKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9zZXRfcmVhbHRpbWVfcHJpb3JpdHlfc3VjY2VzcykgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIGJvb2wgcmV0ID0gbWVzc2FnZV9sb29wX3RocmVhZC5FbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKTsKLSAgaWYgKCFyZXQpIHsKLSAgICBpZiAoQ2FuU2V0Q3VycmVudFRocmVhZFByaW9yaXR5KCkpIHsKLSAgICAgIEZBSUwoKSA8PCAiQ2Fubm90IHNldCByZWFsIHRpbWUgcHJpb3JpdHkgZXZlbiB0aG91Z2ggd2UgaGF2ZSBwZXJtaXNzaW9uIjsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJBbGxvd2luZyBFbmFibGVSZWFsVGltZVNjaGVkdWxpbmcgdG8gZmFpbCBiZWNhdXNlIHdlIgotICAgICAgICAgICAgICAgICAgICAgICIgZG9uJ3QgaGF2ZSBDQVBfU1lTX05JQ0UgY2FwYWJpbGl0eSI7Ci0gICAgICAvLyBMb2cgcmVjb3JkIGluIFhNTAotICAgICAgUmVjb3JkUHJvcGVydHkoIk1lc3NhZ2VMb29wVGhyZWFkVGVzdENvbmRpdGlvbmFsU3VjY2VzcyIsCi0gICAgICAgICAgICAgICAgICAgICAiTWFyayB0ZXN0IGFzIHN1Y2Nlc3MgZXZlbiB0aG91Z2ggRW5hYmxlUmVhbFRpbWVTY2hlZHVsaW5nIgotICAgICAgICAgICAgICAgICAgICAgIiBmYWlsZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIENBUF9TWVNfTklDRSBjYXBhYmlsaXR5Iik7Ci0gICAgICAvLyBRdWl0IGVhcmx5IHNpbmNlIGZ1cnRoZXIgdmVyaWZpY2F0aW9uIGlzIG5vIGxvbmdlciBuZWVkZWQKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGV4ZWN1dGlvbl9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBleGVjdXRpb25fZnV0dXJlID0gZXhlY3V0aW9uX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBpbnQgc2NoZWR1bGluZ19wb2xpY3kgPSAtMTsKLSAgaW50IHNjaGVkdWxpbmdfcHJpb3JpdHkgPSAtMTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJk1lc3NhZ2VMb29wVGhyZWFkVGVzdDo6R2V0U2NoZWR1bGluZ1BvbGljeUFuZFByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgJnNjaGVkdWxpbmdfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgJnNjaGVkdWxpbmdfcHJpb3JpdHksIHN0ZDo6bW92ZShleGVjdXRpb25fcHJvbWlzZSkpKTsKLSAgZXhlY3V0aW9uX2Z1dHVyZS53YWl0KCk7Ci0gIEFTU0VSVF9FUShzY2hlZHVsaW5nX3BvbGljeSwgU0NIRURfRklGTyk7Ci0gIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIHZlcmlmaWVkIGhlcmUKLSAgQVNTRVJUX0VRKHNjaGVkdWxpbmdfcHJpb3JpdHksIDEpOwotICBzdGQ6OnByb21pc2U8cGlkX3Q+IHRpZF9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTxwaWRfdD4gdGlkX2Z1dHVyZSA9IHRpZF9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJk1lc3NhZ2VMb29wVGhyZWFkVGVzdDo6R2V0TGludXhUaWQsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBzdGQ6Om1vdmUodGlkX3Byb21pc2UpKSk7Ci0gIHBpZF90IGxpbnV4X3RpZCA9IHRpZF9mdXR1cmUuZ2V0KCk7Ci0gIEFTU0VSVF9HVChsaW51eF90aWQsIDApOwotICBBU1NFUlRfRVEoc2NoZWRfZ2V0c2NoZWR1bGVyKGxpbnV4X3RpZCksIFNDSEVEX0ZJRk8pOwotICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7fTsKLSAgQVNTRVJUX0VRKHNjaGVkX2dldHBhcmFtKGxpbnV4X3RpZCwgJnBhcmFtKSwgMCk7Ci0gIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIHZlcmlmaWVkIGhlcmUKLSAgQVNTRVJUX0VRKHBhcmFtLnNjaGVkX3ByaW9yaXR5LCAxKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9tZXNzYWdlX2xvb3BfbnVsbF9iZWZvcmVfc3RhcnQpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIEFTU0VSVF9FUShtZXNzYWdlX2xvb3BfdGhyZWFkLm1lc3NhZ2VfbG9vcCgpLCBudWxscHRyKTsKLX0KLQotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgdGVzdF9tZXNzYWdlX2xvb3Bfbm90X251bGxfc3RhcnQpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICBBU1NFUlRfTkUobWVzc2FnZV9sb29wX3RocmVhZC5tZXNzYWdlX2xvb3AoKSwgbnVsbHB0cik7Ci19Ci0KLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHRlc3RfbWVzc2FnZV9sb29wX251bGxfYWZ0ZXJfc3RvcCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIEFTU0VSVF9ORShtZXNzYWdlX2xvb3BfdGhyZWFkLm1lc3NhZ2VfbG9vcCgpLCBudWxscHRyKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TaHV0RG93bigpOwotICBBU1NFUlRfRVEobWVzc2FnZV9sb29wX3RocmVhZC5tZXNzYWdlX2xvb3AoKSwgbnVsbHB0cik7Ci19Ci0KLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHRlc3RfdG9fc3RyaW5nX21ldGhvZCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgc3RkOjpzdHJpbmcgdGhyZWFkX3N0cmluZ19iZWZvcmVfc3RhcnQgPSBtZXNzYWdlX2xvb3BfdGhyZWFkLlRvU3RyaW5nKCk7Ci0gIEFTU0VSVF9GQUxTRSh0aHJlYWRfc3RyaW5nX2JlZm9yZV9zdGFydC5lbXB0eSgpKTsKLSAgTE9HKElORk8pIDw8ICJCZWZvcmUgc3RhcnQ6ICIgPDwgbWVzc2FnZV9sb29wX3RocmVhZDsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIHN0ZDo6c3RyaW5nIHRocmVhZF9zdHJpbmdfcnVubmluZyA9IG1lc3NhZ2VfbG9vcF90aHJlYWQuVG9TdHJpbmcoKTsKLSAgQVNTRVJUX0ZBTFNFKHRocmVhZF9zdHJpbmdfcnVubmluZy5lbXB0eSgpKTsKLSAgTE9HKElORk8pIDw8ICJSdW5uaW5nOiAiIDw8IG1lc3NhZ2VfbG9vcF90aHJlYWQ7Ci0gIC8vIFN0cmluZyByZXByZXNlbnRhdGlvbiBzaG91bGQgbG9vayBkaWZmZXJlbnQgd2hlbiB0aHJlYWQgaXMgbm90IHJ1bm5pbmcKLSAgQVNTRVJUX1NUUk5FKHRocmVhZF9zdHJpbmdfcnVubmluZy5jX3N0cigpLAotICAgICAgICAgICAgICAgdGhyZWFkX3N0cmluZ19iZWZvcmVfc3RhcnQuY19zdHIoKSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU2h1dERvd24oKTsKLSAgc3RkOjpzdHJpbmcgdGhyZWFkX3N0cmluZ19hZnRlcl9zaHV0ZG93biA9IG1lc3NhZ2VfbG9vcF90aHJlYWQuVG9TdHJpbmcoKTsKLSAgTE9HKElORk8pIDw8ICJBZnRlciBzaHV0ZG93bjogIiA8PCBtZXNzYWdlX2xvb3BfdGhyZWFkOwotICAvLyBTdHJpbmcgcmVwcmVzZW50YXRpb24gc2hvdWxkIGxvb2sgdGhlIHNhbWUgd2hlbiB0aHJlYWQgaXMgbm90IHJ1bm5pbmcKLSAgQVNTRVJUX1NUUkVRKHRocmVhZF9zdHJpbmdfYWZ0ZXJfc2h1dGRvd24uY19zdHIoKSwKLSAgICAgICAgICAgICAgIHRocmVhZF9zdHJpbmdfYmVmb3JlX3N0YXJ0LmNfc3RyKCkpOwotfQotCi0vLyBWZXJpZnkgdGhlIG1lc3NhZ2UgbG9vcCB0aHJlYWQgd2lsbCBzaHV0ZG93biBhZnRlciBjYWxsYmFjayBmaW5pc2hlcwotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgc2h1dF9kb3duX3doaWxlX2luX2NhbGxiYWNrKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAidGVzdF90aHJlYWQiOwotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgc3RkOjpwcm9taXNlPHN0ZDo6c3RyaW5nPiBuYW1lX3Byb21pc2U7Ci0gIHN0ZDo6ZnV0dXJlPHN0ZDo6c3RyaW5nPiBuYW1lX2Z1dHVyZSA9IG5hbWVfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIHVpbnQzMl90IGRlbGF5X21zID0gNTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmTWVzc2FnZUxvb3BUaHJlYWRUZXN0OjpTbGVlcEFuZEdldE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIHN0ZDo6bW92ZShuYW1lX3Byb21pc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcykpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci0gIHN0ZDo6c3RyaW5nIG15X25hbWUgPSBuYW1lX2Z1dHVyZS5nZXQoKTsKLSAgQVNTRVJUX0VRKG5hbWUsIG15X25hbWUpOwotfQotCi0vLyBWZXJpZnkgdGhlIG1lc3NhZ2UgbG9vcCB0aHJlYWQgd2lsbCBzaHV0ZG93biBhZnRlciBjYWxsYmFjayBmaW5pc2hlcwotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgc2h1dF9kb3duX3doaWxlX2luX2NhbGxiYWNrX2NoZWNrX2xvY2spIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZShbXShNZXNzYWdlTG9vcFRocmVhZCogdGhyZWFkKSB7IHRocmVhZC0+SXNSdW5uaW5nKCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV9sb29wX3RocmVhZCkpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci19Ci0KLS8vIFZlcmlmeSBtdWx0aXBsZSB0aHJlYWRzIHRyeSBzaHV0ZG93biwgbm8gZGVhZGxvY2svY3Jhc2gKLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHNodXRfZG93bl9tdWx0aV90aHJlYWQpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICBhdXRvIHRocmVhZCA9IHN0ZDo6dGhyZWFkKCZNZXNzYWdlTG9vcFRocmVhZDo6U2h1dERvd24sICZtZXNzYWdlX2xvb3BfdGhyZWFkKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TaHV0RG93bigpOwotICB0aHJlYWQuam9pbigpOwotfQotCi0vLyBWZXJpZnkgbXVsdGlwbGUgdGhyZWFkcyB0cnkgc3RhcnR1cCwgbm8gZGVhZGxvY2svY3Jhc2gKLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHN0YXJ0X3VwX211bHRpX3RocmVhZCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIGF1dG8gdGhyZWFkID0gc3RkOjp0aHJlYWQoJk1lc3NhZ2VMb29wVGhyZWFkOjpTdGFydFVwLCAmbWVzc2FnZV9sb29wX3RocmVhZCk7Ci0gIHRocmVhZC5qb2luKCk7Ci19Ci0KLS8vIFZlcmlmeSBtdWx0aXBsZSB0aHJlYWRzIHRyeSBzdGFydHVwL3NodXRkb3duLCBubyBkZWFkbG9jay9jcmFzaAotVEVTVF9GKE1lc3NhZ2VMb29wVGhyZWFkVGVzdCwgc3RhcnRfdXBfc2h1dF9kb3duX211bHRpX3RocmVhZCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIGF1dG8gdGhyZWFkID0gc3RkOjp0aHJlYWQoJk1lc3NhZ2VMb29wVGhyZWFkOjpTaHV0RG93biwgJm1lc3NhZ2VfbG9vcF90aHJlYWQpOwotICB0aHJlYWQuam9pbigpOwotfQotCi0vLyBWZXJpZnkgbXVsdGlwbGUgdGhyZWFkcyB0cnkgc2h1dGRvd24vc3RhcnR1cCwgbm8gZGVhZGxvY2svY3Jhc2gKLVRFU1RfRihNZXNzYWdlTG9vcFRocmVhZFRlc3QsIHNodXRfZG93bl9zdGFydF91cF9tdWx0aV90aHJlYWQpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci0gIGF1dG8gdGhyZWFkID0gc3RkOjp0aHJlYWQoJk1lc3NhZ2VMb29wVGhyZWFkOjpTdGFydFVwLCAmbWVzc2FnZV9sb29wX3RocmVhZCk7Ci0gIHRocmVhZC5qb2luKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5jYyBiL2NvbW1vbi9tZXRyaWNfaWRfYWxsb2NhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI5YTI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9tZXRyaWNfaWRfYWxsb2NhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm1ldHJpY19pZF9hbGxvY2F0b3IuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nIE1ldHJpY0lkQWxsb2NhdG9yOjpMT0dHSU5HX1RBRyA9ICJCbHVldG9vdGhNZXRyaWNJZEFsbG9jYXRvciI7Ci1jb25zdCBzaXplX3QgTWV0cmljSWRBbGxvY2F0b3I6OmtNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSA9IDIwMDsKLWNvbnN0IHNpemVfdCBNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSA9IDY1MDAwOwotY29uc3QgaW50IE1ldHJpY0lkQWxsb2NhdG9yOjprTWluSWQgPSAxOwotY29uc3QgaW50IE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4SWQgPSA2NTUzNDsgIC8vIDJeMTYgLSAyCi0KLS8vIGlkIHNwYWNlIHNob3VsZCBhbHdheXMgYmUgbGFyZ2VyIHRoYW4ga01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSArCi0vLyBrTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkKLXN0YXRpY19hc3NlcnQoKE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkgKwotICAgICAgICAgICAgICAgTWV0cmljSWRBbGxvY2F0b3I6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkpIDwKLSAgICAgICAgICAgICAgICAgIChNZXRyaWNJZEFsbG9jYXRvcjo6a01heElkIC0gTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCksCi0gICAgICAgICAgICAgICJpZCBzcGFjZSBzaG91bGQgYWx3YXlzIGJlIGxhcmdlciB0aGFuICIKLSAgICAgICAgICAgICAgImtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkgKyBNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSIpOwotCi1NZXRyaWNJZEFsbG9jYXRvcjo6TWV0cmljSWRBbGxvY2F0b3IoKQotICAgIDogcGFpcmVkX2RldmljZV9jYWNoZV8oa01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSwgTE9HR0lOR19UQUcpLAotICAgICAgdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8oa01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5LCBMT0dHSU5HX1RBRykge30KLQotYm9vbCBNZXRyaWNJZEFsbG9jYXRvcjo6SW5pdCgKLSAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8UmF3QWRkcmVzcywgaW50PiYgcGFpcmVkX2RldmljZV9tYXAsCi0gICAgQ2FsbGJhY2sgc2F2ZV9pZF9jYWxsYmFjaywgQ2FsbGJhY2sgZm9yZ2V0X2RldmljZV9jYWxsYmFjaykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgaWYgKGluaXRpYWxpemVkXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGluaXQgcGFpcmVkX2RldmljZXNfbWFwCi0gIGlmIChwYWlyZWRfZGV2aWNlX21hcC5zaXplKCkgPiBrTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5KSB7Ci0gICAgTE9HKEZBVEFMKQotICAgICAgICA8PCBMT0dHSU5HX1RBRwotICAgICAgICA8PCAiUGFpcmVkIGRldmljZSBtYXAgaXMgYmlnZ2VyIHRoYW4ga01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSI7Ci0gICAgLy8gZmFpbCBsb3VkbHkgdG8gbGV0IGNhbGxlciBrbm93Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbmV4dF9pZF8gPSBrTWluSWQ7Ci0gIGZvciAoY29uc3QgYXV0byYgcCA6IHBhaXJlZF9kZXZpY2VfbWFwKSB7Ci0gICAgaWYgKHAuc2Vjb25kIDwga01pbklkIHx8IHAuc2Vjb25kID4ga01heElkKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8IExPR0dJTkdfVEFHIDw8ICJJbnZhbGlkIEJsdWV0b290aCBNZXRyaWMgSWQgaW4gY29uZmlnIjsKLSAgICB9Ci0gICAgYXV0byBldmljdGVkID0gcGFpcmVkX2RldmljZV9jYWNoZV8uUHV0KHAuZmlyc3QsIHAuc2Vjb25kKTsKLSAgICBpZiAoZXZpY3RlZCkgewotICAgICAgRm9yZ2V0RGV2aWNlUG9zdHByb2Nlc3MoZXZpY3RlZC0+Zmlyc3QsIGV2aWN0ZWQtPnNlY29uZCk7Ci0gICAgfQotICAgIGlkX3NldF8uaW5zZXJ0KHAuc2Vjb25kKTsKLSAgICBuZXh0X2lkXyA9IHN0ZDo6bWF4KG5leHRfaWRfLCBwLnNlY29uZCArIDEpOwotICB9Ci0gIGlmIChuZXh0X2lkXyA+IGtNYXhJZCkgewotICAgIG5leHRfaWRfID0ga01pbklkOwotICB9Ci0KLSAgLy8gaW5pdCBjYWxsYmFja3MKLSAgc2F2ZV9pZF9jYWxsYmFja18gPSBzYXZlX2lkX2NhbGxiYWNrOwotICBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrXyA9IGZvcmdldF9kZXZpY2VfY2FsbGJhY2s7Ci0KLSAgcmV0dXJuIGluaXRpYWxpemVkXyA9IHRydWU7Ci19Ci0KLU1ldHJpY0lkQWxsb2NhdG9yOjp+TWV0cmljSWRBbGxvY2F0b3IoKSB7IENsb3NlKCk7IH0KLQotYm9vbCBNZXRyaWNJZEFsbG9jYXRvcjo6Q2xvc2UoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGlkX2FsbG9jYXRvcl9tdXRleF8pOwotICBpZiAoIWluaXRpYWxpemVkXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwYWlyZWRfZGV2aWNlX2NhY2hlXy5DbGVhcigpOwotICB0ZW1wb3JhcnlfZGV2aWNlX2NhY2hlXy5DbGVhcigpOwotICBpZF9zZXRfLmNsZWFyKCk7Ci0gIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotTWV0cmljSWRBbGxvY2F0b3ImIE1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpIHsKLSAgc3RhdGljIE1ldHJpY0lkQWxsb2NhdG9yIG1ldHJpY19pZF9hbGxvY2F0b3I7Ci0gIHJldHVybiBtZXRyaWNfaWRfYWxsb2NhdG9yOwotfQotCi1ib29sIE1ldHJpY0lkQWxsb2NhdG9yOjpJc0VtcHR5KCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgcmV0dXJuIHBhaXJlZF9kZXZpY2VfY2FjaGVfLlNpemUoKSA9PSAwICYmCi0gICAgICAgICB0ZW1wb3JhcnlfZGV2aWNlX2NhY2hlXy5TaXplKCkgPT0gMDsKLX0KLQotLy8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBuZXcgZGV2aWNlIGlzIHNjYW5uZWQKLWludCBNZXRyaWNJZEFsbG9jYXRvcjo6QWxsb2NhdGVJZChjb25zdCBSYXdBZGRyZXNzJiBtYWNfYWRkcmVzcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgaW50IGlkID0gMDsKLSAgLy8gaWYgYWxyZWFkeSBoYXZlIGFuIGlkLCByZXR1cm4gaXQKLSAgaWYgKHBhaXJlZF9kZXZpY2VfY2FjaGVfLkdldChtYWNfYWRkcmVzcywgJmlkKSkgewotICAgIHJldHVybiBpZDsKLSAgfQotICBpZiAodGVtcG9yYXJ5X2RldmljZV9jYWNoZV8uR2V0KG1hY19hZGRyZXNzLCAmaWQpKSB7Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0KLSAgLy8gZmluZCBuZXh0IGF2YWlsYWJsZSBpZAotICB3aGlsZSAoaWRfc2V0Xy5jb3VudChuZXh0X2lkXykgPiAwKSB7Ci0gICAgbmV4dF9pZF8rKzsKLSAgICBpZiAobmV4dF9pZF8gPiBrTWF4SWQpIHsKLSAgICAgIG5leHRfaWRfID0ga01pbklkOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IExPR0dJTkdfVEFHIDw8ICJCbHVldG9vdGggbWV0cmljIGlkIG92ZXJmbG93LiI7Ci0gICAgfQotICB9Ci0gIGlkID0gbmV4dF9pZF8rKzsKLSAgaWRfc2V0Xy5pbnNlcnQoaWQpOwotICBhdXRvIGV2aWN0ZWQgPSB0ZW1wb3JhcnlfZGV2aWNlX2NhY2hlXy5QdXQobWFjX2FkZHJlc3MsIGlkKTsKLSAgaWYgKGV2aWN0ZWQpIHsKLSAgICB0aGlzLT5pZF9zZXRfLmVyYXNlKGV2aWN0ZWQtPnNlY29uZCk7Ci0gIH0KLQotICBpZiAobmV4dF9pZF8gPiBrTWF4SWQpIHsKLSAgICBuZXh0X2lkXyA9IGtNaW5JZDsKLSAgfQotICByZXR1cm4gaWQ7Ci19Ci0KLS8vIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgZGV2aWNlIGlzIHBhaXJlZAotYm9vbCBNZXRyaWNJZEFsbG9jYXRvcjo6U2F2ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBtYWNfYWRkcmVzcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgaW50IGlkID0gMDsKLSAgaWYgKHBhaXJlZF9kZXZpY2VfY2FjaGVfLkdldChtYWNfYWRkcmVzcywgJmlkKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICghdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8uR2V0KG1hY19hZGRyZXNzLCAmaWQpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBMT0dHSU5HX1RBRwotICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBzYXZlIGRldmljZSBiZWNhdXNlIGRldmljZSBpcyBub3QgaW4gIgotICAgICAgICAgICAgICAgPDwgInRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCF0ZW1wb3JhcnlfZGV2aWNlX2NhY2hlXy5SZW1vdmUobWFjX2FkZHJlc3MpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBMT0dHSU5HX1RBRwotICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZW1vdmUgZGV2aWNlIGZyb20gdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIGV2aWN0ZWQgPSBwYWlyZWRfZGV2aWNlX2NhY2hlXy5QdXQobWFjX2FkZHJlc3MsIGlkKTsKLSAgaWYgKGV2aWN0ZWQpIHsKLSAgICBGb3JnZXREZXZpY2VQb3N0cHJvY2VzcyhldmljdGVkLT5maXJzdCwgZXZpY3RlZC0+c2Vjb25kKTsKLSAgfQotICBpZiAoIXNhdmVfaWRfY2FsbGJhY2tfKG1hY19hZGRyZXNzLCBpZCkpIHsKLSAgICBMT0coRVJST1IpIDw8IExPR0dJTkdfVEFHCi0gICAgICAgICAgICAgICA8PCAiQ2FsbGJhY2sgcmV0dXJuZWQgZmFsc2UgYWZ0ZXIgc2F2aW5nIHRoZSBkZXZpY2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBkZXZpY2UgaXMgZm9yZ290dGVuCi12b2lkIE1ldHJpY0lkQWxsb2NhdG9yOjpGb3JnZXREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgbWFjX2FkZHJlc3MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soaWRfYWxsb2NhdG9yX211dGV4Xyk7Ci0gIGludCBpZCA9IDA7Ci0gIGlmICghcGFpcmVkX2RldmljZV9jYWNoZV8uR2V0KG1hY19hZGRyZXNzLCAmaWQpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBMT0dHSU5HX1RBRwotICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBmb3JnZXQgZGV2aWNlIGJlY2F1c2UgZGV2aWNlIGlzIG5vdCBpbiAiCi0gICAgICAgICAgICAgICA8PCAicGFpcmVkX2RldmljZV9jYWNoZV8iOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBhaXJlZF9kZXZpY2VfY2FjaGVfLlJlbW92ZShtYWNfYWRkcmVzcykpIHsKLSAgICBMT0coRVJST1IpIDw8IExPR0dJTkdfVEFHCi0gICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlbW92ZSBkZXZpY2UgZnJvbSBwYWlyZWRfZGV2aWNlX2NhY2hlXyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEZvcmdldERldmljZVBvc3Rwcm9jZXNzKG1hY19hZGRyZXNzLCBpZCk7Ci19Ci0KLWJvb2wgTWV0cmljSWRBbGxvY2F0b3I6OklzVmFsaWRJZChjb25zdCBpbnQgaWQpIHsKLSAgcmV0dXJuIGlkID49IGtNaW5JZCAmJiBpZCA8PSBrTWF4SWQ7Ci19Ci0KLXZvaWQgTWV0cmljSWRBbGxvY2F0b3I6OkZvcmdldERldmljZVBvc3Rwcm9jZXNzKGNvbnN0IFJhd0FkZHJlc3MmIG1hY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlkKSB7Ci0gIGlkX3NldF8uZXJhc2UoaWQpOwotICBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrXyhtYWNfYWRkcmVzcywgaWQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5oIGIvY29tbW9uL21ldHJpY19pZF9hbGxvY2F0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxOGQ1Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgImxydS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLWNsYXNzIE1ldHJpY0lkQWxsb2NhdG9yIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGNvbnN0IGludCBpZCk+OwotCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnk7Ci0KLSAgc3RhdGljIGNvbnN0IGludCBrTWluSWQ7Ci0gIHN0YXRpYyBjb25zdCBpbnQga01heElkOwotCi0gIH5NZXRyaWNJZEFsbG9jYXRvcigpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHNpbmdsZXRvbgotICAgKgotICAgKiBAcmV0dXJuIE1ldHJpY0lkQWxsb2NhdG9yJgotICAgKi8KLSAgc3RhdGljIE1ldHJpY0lkQWxsb2NhdG9yJiBHZXRJbnN0YW5jZSgpOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBhbGxvY2F0b3IKLSAgICoKLSAgICogQHBhcmFtIHBhaXJlZF9kZXZpY2VfbWFwIG1hcCBmcm9tIG1hY19hZGRyZXNzIHRvIGlkIGFscmVhZHkgc2F2ZWQKLSAgICogaW4gdGhlIGRpc2sgYmVmb3JlIGluaXQKLSAgICogQHBhcmFtIHNhdmVfaWRfY2FsbGJhY2sgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWxseQotICAgKiBzYXZpbmcgaWQgZm9yIGEgcGFpcmVkIGRldmljZQotICAgKiBAcGFyYW0gZm9yZ2V0X2RldmljZV9jYWxsYmFjayBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIKLSAgICogc3VjY2Vzc2Z1bCBpZCBkZWxldGlvbiBmb3IgZm9yZ290dGVuIGRldmljZSwKLSAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZAotICAgKi8KLSAgYm9vbCBJbml0KGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+JiBwYWlyZWRfZGV2aWNlX21hcCwKLSAgICAgICAgICAgIENhbGxiYWNrIHNhdmVfaWRfY2FsbGJhY2ssIENhbGxiYWNrIGZvcmdldF9kZXZpY2VfY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgYWxsb2NhdG9yLiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gQmx1ZXRvb3RoIHByb2Nlc3MgaXMga2lsbGVkCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgY2xvc2UKLSAgICovCi0gIGJvb2wgQ2xvc2UoKTsKLQotICAvKioKLSAgICogQ2hlY2sgaWYgbm8gaWQgc2F2ZWQgaW4gbWVtb3J5Ci0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBubyBpZCBpcyBzYXZlZAotICAgKi8KLSAgYm9vbCBJc0VtcHR5KCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIGFuIGlkIGZvciBhIHNjYW5uZWQgZGV2aWNlLCBvciByZXR1cm4gdGhlIGlkIGlmIHRoZXJlIGlzIGFscmVhZHkKLSAgICogb25lCi0gICAqCi0gICAqIEBwYXJhbSBtYWNfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gICAqIEByZXR1cm4gdGhlIGlkIG9mIGRldmljZQotICAgKi8KLSAgaW50IEFsbG9jYXRlSWQoY29uc3QgUmF3QWRkcmVzcyYgbWFjX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBTYXZlIHRoZSBpZCBmb3IgYSBwYWlyZWQgZGV2aWNlCi0gICAqCi0gICAqIEBwYXJhbSBtYWNfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzYXZlIHN1Y2Nlc3NmdWxseQotICAgKi8KLSAgYm9vbCBTYXZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIG1hY19hZGRyZXNzKTsKLQotICAvKioKLSAgICogRGVsZXRlIHRoZSBpZCBmb3IgYSBkZXZpY2UgdG8gYmUgZm9yZ290dGVuCi0gICAqCi0gICAqIEBwYXJhbSBtYWNfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gICAqLwotICB2b2lkIEZvcmdldERldmljZShjb25zdCBSYXdBZGRyZXNzJiBtYWNfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIGFuIGlkIGlzIHZhbGlkLgotICAgKiBUaGUgaWQgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBrTWF4SWQgYW5kIGJpZ2dlciB0aGFuIG9yIGVxdWFsIHRvCi0gICAqIGtNaW5JZAotICAgKgotICAgKiBAcGFyYW0gbWFjX2FkZHJlc3MgbWFjIGFkZHJlc3Mgb2YgQmx1ZXRvb3RoIGRldmljZQotICAgKiBAcmV0dXJuIHRydWUgaWYgZGVsZXRlIHN1Y2Nlc3NmdWxseQotICAgKi8KLSAgc3RhdGljIGJvb2wgSXNWYWxpZElkKGNvbnN0IGludCBpZCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFNpbmdsZXRvbgotICBNZXRyaWNJZEFsbG9jYXRvcigpOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIExPR0dJTkdfVEFHOwotICBtdXRhYmxlIHN0ZDo6bXV0ZXggaWRfYWxsb2NhdG9yX211dGV4XzsKLQotICBMZWdhY3lMcnVDYWNoZTxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfY2FjaGVfOwotICBMZWdhY3lMcnVDYWNoZTxSYXdBZGRyZXNzLCBpbnQ+IHRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50PiBpZF9zZXRfOwotCi0gIGludCBuZXh0X2lkX3trTWluSWR9OwotICBib29sIGluaXRpYWxpemVkX3tmYWxzZX07Ci0gIENhbGxiYWNrIHNhdmVfaWRfY2FsbGJhY2tfOwotICBDYWxsYmFjayBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrXzsKLQotICB2b2lkIEZvcmdldERldmljZVBvc3Rwcm9jZXNzKGNvbnN0IFJhd0FkZHJlc3MmIG1hY19hZGRyZXNzLCBjb25zdCBpbnQgaWQpOwotCi0gIC8vIGRlbGV0ZSBjb3B5IGNvbnN0cnVjdG9yIGZvciBzaW5nbGV0b24KLSAgTWV0cmljSWRBbGxvY2F0b3IoTWV0cmljSWRBbGxvY2F0b3IgY29uc3QmKSA9IGRlbGV0ZTsKLSAgTWV0cmljSWRBbGxvY2F0b3ImIG9wZXJhdG9yPShNZXRyaWNJZEFsbG9jYXRvciBjb25zdCYpID0gZGVsZXRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvY29tbW9uL21ldHJpY19pZF9hbGxvY2F0b3JfdW5pdHRlc3QuY2MgYi9jb21tb24vbWV0cmljX2lkX2FsbG9jYXRvcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwNDgwMi4uMDAwMDAwMAotLS0gYS9jb21tb24vbWV0cmljX2lkX2FsbG9jYXRvcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIwIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRBbGxvY2F0b3I7Ci0KLVJhd0FkZHJlc3Mga3RoQWRkcmVzcyh1aW50MzJfdCBrKSB7Ci0gIHVpbnQ4X3QgYXJyYXlbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07Ci0gIGZvciAoaW50IGkgPSA1OyBpID49IDI7IGktLSkgewotICAgIGFycmF5W2ldID0gayAlIDI1NjsKLSAgICBrID0gayAvIDI1NjsKLSAgfQotICBSYXdBZGRyZXNzIGFkZHIoYXJyYXkpOwotICByZXR1cm4gYWRkcjsKLX0KLQotc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4gZ2VuZXJhdGVBZGRyZXNzZXMoY29uc3QgdWludDMyX3QgbnVtKSB7Ci0gIC8vIGdlbmVyYXRlIGZpcnN0IG51bSBvZiBtYWMgYWRkcmVzcyAtPiBpZCBwYWlycwotICAvLyBpbnB1dCBtYXkgaXMgYWx3YXlzIHZhbGlkIDI1Nl42ID0gMl40OCA+IDJeMzIKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4gZGV2aWNlX21hcDsKLSAgZm9yIChzaXplX3Qga2V5ID0gMDsga2V5IDwgbnVtOyBrZXkrKykgewotICAgIGRldmljZV9tYXBba3RoQWRkcmVzcyhrZXkpXSA9IGtleSArIE1ldHJpY0lkQWxsb2NhdG9yOjprTWluSWQ7Ci0gIH0KLSAgcmV0dXJuIGRldmljZV9tYXA7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRBbGxvY2F0b3JUZXN0LCBNZXRyaWNJZEFsbG9jYXRvckluaXRDbG9zZVRlc3QpIHsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBNZXRyaWNJZEFsbG9jYXRvcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXShjb25zdCBSYXdBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLSAgRVhQRUNUX0ZBTFNFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkQWxsb2NhdG9yVGVzdCwgTWV0cmljSWRBbGxvY2F0b3JOb3RDbG9zZVRlc3QpIHsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBNZXRyaWNJZEFsbG9jYXRvcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXShjb25zdCBSYXdBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLQotICAvLyBzaG91bGQgZmFpbCBiZWNhdXNlIGl0IGlzbid0IGNsb3NlZAotICBFWFBFQ1RfRkFMU0UoYWxsb2NhdG9yLkluaXQocGFpcmVkX2RldmljZV9tYXAsIGNhbGxiYWNrLCBjYWxsYmFjaykpOwotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuQ2xvc2UoKSk7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRBbGxvY2F0b3JUZXN0LCBNZXRyaWNJZEFsbG9jYXRvclNjYW5EZXZpY2VGcm9tRW1wdHlUZXN0KSB7Ci0gIGF1dG8mIGFsbG9jYXRvciA9IE1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8UmF3QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcDsKLSAgTWV0cmljSWRBbGxvY2F0b3I6OkNhbGxiYWNrIGNhbGxiYWNrID0gW10oY29uc3QgUmF3QWRkcmVzcyYsIGNvbnN0IGludCkgewotICAgIHJldHVybiB0cnVlOwotICB9OwotICAvLyB0ZXN0IGVtcHR5IG1hcCwgbmV4dCBpZCBzaG91bGQgYmUga01pbklkCi0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoMCkpLCBNZXRyaWNJZEFsbG9jYXRvcjo6a01pbklkKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoMSkpLCBNZXRyaWNJZEFsbG9jYXRvcjo6a01pbklkICsgMSk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKDApKSwgTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKDIpKSwgTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCArIDIpOwotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuQ2xvc2UoKSk7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRBbGxvY2F0b3JUZXN0LAotICAgICBNZXRyaWNJZEFsbG9jYXRvclNjYW5EZXZpY2VGcm9tRmlsbGVkVGVzdCkgewotICBhdXRvJiBhbGxvY2F0b3IgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKTsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXA7Ci0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBjYWxsYmFjayA9IFtdKGNvbnN0IFJhd0FkZHJlc3MmLCBjb25zdCBpbnQpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLSAgaW50IGlkID0gc3RhdGljX2Nhc3Q8aW50PihNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSkgKwotICAgICAgICAgICBNZXRyaWNJZEFsbG9jYXRvcjo6a01pbklkOwotICAvLyBuZXh0IGlkIHNob3VsZCBiZSBNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeQotICBwYWlyZWRfZGV2aWNlX21hcCA9Ci0gICAgICBnZW5lcmF0ZUFkZHJlc3NlcyhNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLSAgLy8gdHJ5IG5ldyB2YWx1ZXMgbm90IGluIHRoZSBtYXAsIHNob3VsZCBnZXQgbmV3IGlkLgotICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhJTlRfTUFYKSksIGlkKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoSU5UX01BWCAtIDEpKSwgaWQgKyAxKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoSU5UX01BWCkpLCBpZCk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKElOVF9NQVggLSAyKSksIGlkICsgMik7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5DbG9zZSgpKTsKLX0KLQotVEVTVChCbHVldG9vdGhNZXRyaWNJZEFsbG9jYXRvclRlc3QsIE1ldHJpY0lkQWxsb2NhdG9yQWxsb2NhdGVFeGlzdGluZ1Rlc3QpIHsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwID0KLSAgICAgIGdlbmVyYXRlQWRkcmVzc2VzKE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5KTsKLQotICBNZXRyaWNJZEFsbG9jYXRvcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXShjb25zdCBSYXdBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIGludCBpZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjprTWluSWQ7Ci0gIC8vIG5leHQgaWQgc2hvdWxkIGJlIE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLQotICAvLyB0cnkgdmFsdWVzIGFscmVhZHkgaW4gdGhlIG1hcCwgc2hvdWxkIGdldCBuZXcgaWQuCi0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChSYXdBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAwfSkpLCBpZCk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChSYXdBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAxfSkpLCBpZCArIDEpOwotICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoUmF3QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMH0pKSwgaWQpOwotICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoUmF3QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMn0pKSwgaWQgKyAyKTsKLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkQWxsb2NhdG9yVGVzdCwgTWV0cmljSWRBbGxvY2F0b3JNYWluVGVzdDEpIHsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBpbnQgZHVtbXkgPSAyMjsKLSAgaW50KiBwb2ludGVyID0gJmR1bW15OwotICBNZXRyaWNJZEFsbG9jYXRvcjo6Q2FsbGJhY2sgc2F2ZV9jYWxsYmFjayA9IFtwb2ludGVyXShjb25zdCBSYXdBZGRyZXNzJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAqIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBmb3JnZXRfY2FsbGJhY2sgPSBbcG9pbnRlcl0oY29uc3QgUmF3QWRkcmVzcyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAvIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0KLSAgRVhQRUNUX1RSVUUoCi0gICAgICBhbGxvY2F0b3IuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgc2F2ZV9jYWxsYmFjaywgZm9yZ2V0X2NhbGxiYWNrKSk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChSYXdBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAwfSkpLAotICAgICAgICAgICAgTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCk7Ci0gIC8vIHNhdmUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKFJhd0FkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDB9KSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDQ0KTsKLQotICAvLyBzaG91bGQgZmFpbCwgc2luY2UgaWQgb2YgZGV2aWNlIGlzIG5vdCBhbGxvY2F0ZWQKLSAgRVhQRUNUX0ZBTFNFKGFsbG9jYXRvci5TYXZlRGV2aWNlKFJhd0FkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDF9KSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDQ0KTsKLQotICAvLyBzYXZlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoUmF3QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMn0pKSwKLSAgICAgICAgICAgIE1ldHJpY0lkQWxsb2NhdG9yOjprTWluSWQgKyAxKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKFJhd0FkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDN9KSksCi0gICAgICAgICAgICBNZXRyaWNJZEFsbG9jYXRvcjo6a01pbklkICsgMik7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKFJhd0FkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDJ9KSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDg4KTsKLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLlNhdmVEZXZpY2UoUmF3QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgM30pKSk7Ci0gIEVYUEVDVF9FUShkdW1teSwgMTc2KTsKLQotICAvLyBzaG91bGQgYmUgdHJ1ZSBidXQgY2FsbGJhY2sgd29uJ3QgYmUgY2FsbGVkLCBzaW5jZSBpZCBoYWQgYmVlbiBzYXZlZAotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuU2F2ZURldmljZShSYXdBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAwfSkpKTsKLSAgRVhQRUNUX0VRKGR1bW15LCAxNzYpOwotCi0gIC8vIGZvcmdldAotICBhbGxvY2F0b3IuRm9yZ2V0RGV2aWNlKFJhd0FkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDF9KSk7Ci0gIEVYUEVDVF9FUShkdW1teSwgMTc2KTsKLSAgYWxsb2NhdG9yLkZvcmdldERldmljZShSYXdBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAyfSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDg4KTsKLQotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuQ2xvc2UoKSk7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRBbGxvY2F0b3JUZXN0LCBNZXRyaWNJZEFsbG9jYXRvckZ1bGxQYWlyZWRNYXApIHsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIC8vIHByZXNldCBhIGZ1bGwgbWFwCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwID0KLSAgICAgIGdlbmVyYXRlQWRkcmVzc2VzKE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5KTsKLSAgaW50IGR1bW15ID0gMjQzOwotICBpbnQqIHBvaW50ZXIgPSAmZHVtbXk7Ci0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBzYXZlX2NhbGxiYWNrID0gW3BvaW50ZXJdKGNvbnN0IFJhd0FkZHJlc3MmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQpIHsKLSAgICAqcG9pbnRlciA9ICpwb2ludGVyICogMjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLSAgTWV0cmljSWRBbGxvY2F0b3I6OkNhbGxiYWNrIGZvcmdldF9jYWxsYmFjayA9IFtwb2ludGVyXShjb25zdCBSYXdBZGRyZXNzJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQpIHsKLSAgICAqcG9pbnRlciA9ICpwb2ludGVyIC8gMzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLQotICBFWFBFQ1RfVFJVRSgKLSAgICAgIGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBzYXZlX2NhbGxiYWNrLCBmb3JnZXRfY2FsbGJhY2spKTsKLQotICAvLyBjaGVjayBpZiBhbGwgcHJlc2V0IGlkcyBhcmUgdGhlcmUuCi0gIC8vIGNvbW1lbnRzIGJhc2VkIG9uIGtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkgPSAyMDAuIEl0IGNhbiBjaGFuZ2UuCi0gIGludCBrZXkgPSAwOwotICBmb3IgKGtleSA9IDA7Ci0gICAgICAga2V5IDwgc3RhdGljX2Nhc3Q8aW50PihNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gICAgICAga2V5KyspIHsKLSAgICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkpKSwKLSAgICAgICAgICAgICAga2V5ICsgTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCk7Ci0gIH0KLSAgLy8gcGFpcmVkOiAwLCAxLCAyIC4uLiAxOTksCi0gIC8vIHNjYW5uZWQ6Ci0KLSAgaW50IGlkID0gc3RhdGljX2Nhc3Q8aW50PihNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCk7Ci0gIC8vIG5leHQgaWQgc2hvdWxkIGJlIE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5ICsKLSAgLy8gTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZAotCi0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSkpLCBpZCsrKTsKLSAgLy8gcGFpcmVkOiAwLCAxLCAyIC4uLiAxOTksCi0gIC8vIHNjYW5uZWQ6IDIwMAotCi0gIC8vIHNhdmUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKGt0aEFkZHJlc3Moa2V5KSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDE2Mik7ICAvLyBvbmUga2V5IGlzIGV2aWN0ZWQsIGFub3RoZXIga2V5IGlzIHNhdmVkIHNvICoyLzMKLQotICAvLyBwYWlyZWQ6IDEsIDIgLi4uIDE5OSwgMjAwLAotICAvLyBzY2FubmVkOgotCi0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKDApKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogMSwgMiAuLi4gMTk5LCAyMDAKLSAgLy8gc2Nhbm5lZDogMAotCi0gIC8vIGtleSA9PSAyMDAKLSAgLy8gc2hvdWxkIGZhaWwsIHNpbmNlIGlkIG9mIGRldmljZSBpcyBub3QgYWxsb2NhdGVkCi0gIEVYUEVDVF9GQUxTRShhbGxvY2F0b3IuU2F2ZURldmljZShrdGhBZGRyZXNzKGtleSArIDEpKSk7Ci0gIEVYUEVDVF9FUShkdW1teSwgMTYyKTsKLSAgLy8gcGFpcmVkOiAxLCAyIC4uLiAxOTksIDIwMCwKLSAgLy8gc2Nhbm5lZDogMAotCi0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSArIDEpKSwgaWQrKyk7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKGt0aEFkZHJlc3Moa2V5ICsgMSkpKTsKLSAgRVhQRUNUX0VRKGR1bW15LCAxMDgpOyAgLy8gb25lIGtleSBpcyBldmljdGVkLCBhbm90aGVyIGtleSBpcyBzYXZlZCBzbyAqMi8zLAotICAvLyBwYWlyZWQ6IDIgLi4uIDE5OSwgMjAwLCAyMDEKLSAgLy8gc2Nhbm5lZDogMAotCi0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKDEpKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogMiAuLi4gMTk5LCAyMDAsIDIwMSwKLSAgLy8gc2Nhbm5lZDogMCwgMQotCi0gIC8vIHNhdmUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSArIDIpKSwgaWQrKyk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSArIDMpKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogMiAuLi4gMTk5LCAyMDAsIDIwMSwKLSAgLy8gc2Nhbm5lZDogMCwgMSwgMjAyLCAyMDMKLQotICBkdW1teSA9IDk7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKGt0aEFkZHJlc3Moa2V5ICsgMikpKTsKLSAgRVhQRUNUX0VRKGR1bW15LCA2KTsgIC8vIG9uZSBrZXkgaXMgZXZpY3RlZCwgYW5vdGhlciBrZXkgaXMgc2F2ZWQgc28gKjIvMywKLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAzKSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDQpOyAgLy8gb25lIGtleSBpcyBldmljdGVkLCBhbm90aGVyIGtleSBpcyBzYXZlZCBzbyAqMi8zLAotICAvLyBwYWlyZWQ6IDQgLi4uIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzCi0gIC8vIHNjYW5uZWQ6IDAsIDEKLQotICAvLyBzaG91bGQgYmUgdHJ1ZSBidXQgY2FsbGJhY2sgd29uJ3QgYmUgY2FsbGVkLCBzaW5jZSBpZCBoYWQgYmVlbiBzYXZlZAotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuU2F2ZURldmljZShrdGhBZGRyZXNzKGtleSArIDIpKSk7Ci0gIEVYUEVDVF9FUShkdW1teSwgNCk7Ci0KLSAgZHVtbXkgPSAyNzsKLSAgLy8gZm9yZ2V0Ci0gIGFsbG9jYXRvci5Gb3JnZXREZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAyMDApKTsKLSAgRVhQRUNUX0VRKGR1bW15LCAyNyk7ICAvLyBzaG91bGQgZmFpbCwgbm8gc3VjaCBhIGtleQotICBhbGxvY2F0b3IuRm9yZ2V0RGV2aWNlKGt0aEFkZHJlc3Moa2V5ICsgMikpOwotICBFWFBFQ1RfRVEoZHVtbXksIDkpOwotICAvLyBwYWlyZWQ6IDQgLi4uIDE5OSwgMjAwLCAyMDEsIDIwMwotICAvLyBzY2FubmVkOiAwLCAxCi0KLSAgLy8gc2F2ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3Moa2V5ICsgMikpLCBpZCsrKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3Moa2V5ICsgNCkpLCBpZCsrKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3Moa2V5ICsgNSkpLCBpZCsrKTsKLSAgLy8gcGFpcmVkOiA0IC4uLiAxOTksIDIwMCwgMjAxLCAyMDMKLSAgLy8gc2Nhbm5lZDogMCwgMSwgMjAyLCAyMDQsIDIwNQotCi0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKGt0aEFkZHJlc3Moa2V5ICsgMikpKTsKLSAgRVhQRUNUX0VRKGR1bW15LCAxOCk7ICAvLyBubyBrZXkgaXMgZXZpY3RlZCwgYSBrZXkgaXMgc2F2ZWQgc28gKjIsCi0KLSAgLy8gc2hvdWxkIGJlIHRydWUgYnV0IGNhbGxiYWNrIHdvbid0IGJlIGNhbGxlZCwgc2luY2UgaWQgaGFkIGJlZW4gc2F2ZWQKLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAzKSkpOwotICBFWFBFQ1RfRVEoZHVtbXksIDE4KTsgIC8vIG5vIHN1Y2ggYSBrZXkgaW4gc2Nhbm5lZAotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuU2F2ZURldmljZShrdGhBZGRyZXNzKGtleSArIDQpKSk7Ci0gIEVYUEVDVF9FUShkdW1teSwgMTIpOyAgLy8gb25lIGtleSBpcyBldmljdGVkLCBhbm90aGVyIGtleSBpcyBzYXZlZCBzbyAqMi8zLAotICAvLyBwYWlyZWQ6IDUgNiAuLi4gMTk5LCAyMDAsIDIwMSwgMjAzLCAyMDIsIDIwNAotICAvLyBzY2FubmVkOiAwLCAxLCAyMDUKLQotICAvLyB2ZXJpZnkgcGFpcmVkOgotICBmb3IgKGtleSA9IDU7IGtleSA8PSAxOTk7IGtleSsrKSB7Ci0gICAgZHVtbXkgPSAzOwotICAgIGFsbG9jYXRvci5Gb3JnZXREZXZpY2Uoa3RoQWRkcmVzcyhrZXkpKTsKLSAgICBFWFBFQ1RfRVEoZHVtbXksIDEpOwotICB9Ci0gIGZvciAoc2l6ZV90IGsgPSBNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeTsKLSAgICAgICBrIDw9IE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5ICsgNDsgaysrKSB7Ci0gICAgZHVtbXkgPSAzOwotICAgIGFsbG9jYXRvci5Gb3JnZXREZXZpY2Uoa3RoQWRkcmVzcyhrKSk7Ci0gICAgRVhQRUNUX0VRKGR1bW15LCAxKTsKLSAgfQotCi0gIC8vIHZlcmlmeSBzY2FubmVkCi0gIGR1bW15ID0gNDsKLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcygwKSkpOwotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuU2F2ZURldmljZShrdGhBZGRyZXNzKDEpKSk7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKAotICAgICAga3RoQWRkcmVzcyhNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSArIDUpKSk7Ci0gIEVYUEVDVF9FUShkdW1teSwgMzIpOwotCi0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5DbG9zZSgpKTsKLX0KLQotVEVTVChCbHVldG9vdGhNZXRyaWNJZEFsbG9jYXRvclRlc3QsIE1ldHJpY0lkQWxsb2NhdG9yRnVsbFNjYW5uZWRNYXApIHsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBpbnQgZHVtbXkgPSAyMjsKLSAgaW50KiBwb2ludGVyID0gJmR1bW15OwotICBNZXRyaWNJZEFsbG9jYXRvcjo6Q2FsbGJhY2sgc2F2ZV9jYWxsYmFjayA9IFtwb2ludGVyXShjb25zdCBSYXdBZGRyZXNzJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAqIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBmb3JnZXRfY2FsbGJhY2sgPSBbcG9pbnRlcl0oY29uc3QgUmF3QWRkcmVzcyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAvIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0KLSAgRVhQRUNUX1RSVUUoCi0gICAgICBhbGxvY2F0b3IuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgc2F2ZV9jYWxsYmFjaywgZm9yZ2V0X2NhbGxiYWNrKSk7Ci0KLSAgLy8gYWxsb2NhdGUga01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5IGlkcwotICAvLyBjb21tZW50cyBiYXNlZCBvbiBrTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkgPSAyMDAKLSAgZm9yIChpbnQga2V5ID0gMDsKLSAgICAgICBrZXkgPAotICAgICAgIHN0YXRpY19jYXN0PGludD4oTWV0cmljSWRBbGxvY2F0b3I6OmtNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gICAgICAga2V5KyspIHsKLSAgICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkpKSwKLSAgICAgICAgICAgICAga2V5ICsgTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZCk7Ci0gIH0KLSAgLy8gc2Nhbm5lZDogMCwgMSwgMiAuLi4gMTk5LAotICAvLyBwYWlyZWQ6Ci0KLSAgaW50IGlkID0gTWV0cmljSWRBbGxvY2F0b3I6OmtNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSArCi0gICAgICAgICAgIE1ldHJpY0lkQWxsb2NhdG9yOjprTWluSWQ7Ci0gIFJhd0FkZHJlc3MgYWRkciA9Ci0gICAgICBrdGhBZGRyZXNzKE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkpOwotICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoYWRkciksIGlkKTsKLSAgLy8gc2Nhbm5lZDogMSwgMiAuLi4gMTk5LCAyMDAKLQotICAvLyBzYXZlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuU2F2ZURldmljZShhZGRyKSk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChhZGRyKSwgaWQpOwotICBFWFBFQ1RfRVEoZHVtbXksIDQ0KTsKLSAgLy8gcGFpcmVkOiAyMDAsCi0gIC8vIHNjYW5uZWQ6IDEsIDIgLi4uIDE5OSwKLSAgaWQrKzsKLQotICBhZGRyID0ga3RoQWRkcmVzcyhNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5ICsgMSk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChhZGRyKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogMjAwLAotICAvLyBzY2FubmVkOiAxLCAyIC4uLiAxOTksIDIwMQotCi0gIC8vIHRyeSB0byBhbGxvY2F0ZSBmb3IgZGV2aWNlIDAsIDEsIDIsIDMsIDQuLi4uMTk5Ci0gIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IGlkIGV2ZXJ5IHRpbWUsCi0gIC8vIHNpbmNlIHRoZSBzY2FubmVkIG1hcCBpcyBmdWxsIGF0IHRoaXMgcG9pbnQKLSAgZm9yIChpbnQga2V5ID0gMDsKLSAgICAgICBrZXkgPAotICAgICAgIHN0YXRpY19jYXN0PGludD4oTWV0cmljSWRBbGxvY2F0b3I6OmtNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gICAgICAga2V5KyspIHsKLSAgICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkpKSwgaWQrKyk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkQWxsb2NhdG9yVGVzdCwgTWV0cmljSWRBbGxvY2F0b3JNdWx0aVRocmVhZFByZXNzdXJlVGVzdCkgewotICBzdGQ6OnVub3JkZXJlZF9tYXA8UmF3QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcDsKLSAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gIGludCBkdW1teSA9IDIyOwotICBpbnQqIHBvaW50ZXIgPSAmZHVtbXk7Ci0gIE1ldHJpY0lkQWxsb2NhdG9yOjpDYWxsYmFjayBzYXZlX2NhbGxiYWNrID0gW3BvaW50ZXJdKGNvbnN0IFJhd0FkZHJlc3MmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQpIHsKLSAgICAqcG9pbnRlciA9ICpwb2ludGVyICsgMTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLSAgTWV0cmljSWRBbGxvY2F0b3I6OkNhbGxiYWNrIGZvcmdldF9jYWxsYmFjayA9IFtwb2ludGVyXShjb25zdCBSYXdBZGRyZXNzJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQpIHsKLSAgICAqcG9pbnRlciA9ICpwb2ludGVyIC0gMTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBhbGxvY2F0b3IuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgc2F2ZV9jYWxsYmFjaywgZm9yZ2V0X2NhbGxiYWNrKSk7Ci0KLSAgLy8gbWFrZSBzdXJlIG5vIGRlYWRsb2NrCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiB3b3JrZXJzOwotICBmb3IgKGludCBrZXkgPSAwOwotICAgICAgIGtleSA8Ci0gICAgICAgc3RhdGljX2Nhc3Q8aW50PihNZXRyaWNJZEFsbG9jYXRvcjo6a01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5KTsKLSAgICAgICBrZXkrKykgewotICAgIHdvcmtlcnMucHVzaF9iYWNrKHN0ZDo6dGhyZWFkKFtrZXldKCkgewotICAgICAgYXV0byYgYWxsb2NhdG9yID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCk7Ci0gICAgICBSYXdBZGRyZXNzIGZha2VfbWFjX2FkZHJlc3MgPSBrdGhBZGRyZXNzKGtleSk7Ci0gICAgICBhbGxvY2F0b3IuQWxsb2NhdGVJZChmYWtlX21hY19hZGRyZXNzKTsKLSAgICAgIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5TYXZlRGV2aWNlKGZha2VfbWFjX2FkZHJlc3MpKTsKLSAgICAgIGFsbG9jYXRvci5Gb3JnZXREZXZpY2UoZmFrZV9tYWNfYWRkcmVzcyk7Ci0gICAgfSkpOwotICB9Ci0gIGZvciAoYXV0byYgd29ya2VyIDogd29ya2VycykgewotICAgIHdvcmtlci5qb2luKCk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5DbG9zZSgpKTsKLX0KLQotVEVTVChCbHVldG9vdGhNZXRyaWNJZEFsbG9jYXRvclRlc3QsIE1ldHJpY0lkQWxsb2NhdG9yV3JhcEFyb3VuZFRlc3QxKSB7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBhdXRvJiBhbGxvY2F0b3IgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKTsKLSAgTWV0cmljSWRBbGxvY2F0b3I6OkNhbGxiYWNrIGNhbGxiYWNrID0gW10oY29uc3QgUmF3QWRkcmVzcyYsIGNvbnN0IGludCkgewotICAgIHJldHVybiB0cnVlOwotICB9OwotCi0gIC8vIG1ha2UgYSBzcGFyc2UgcGFpcmVkX2RldmljZV9tYXAKLSAgaW50IG1pbl9pZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjprTWluSWQ7Ci0gIHBhaXJlZF9kZXZpY2VfbWFwW2t0aEFkZHJlc3MobWluX2lkKV0gPSBtaW5faWQ7Ci0gIHBhaXJlZF9kZXZpY2VfbWFwW2t0aEFkZHJlc3MobWluX2lkICsgMSldID0gbWluX2lkICsgMTsKLSAgcGFpcmVkX2RldmljZV9tYXBba3RoQWRkcmVzcyhtaW5faWQgKyAzKV0gPSBtaW5faWQgKyAzOwotICBwYWlyZWRfZGV2aWNlX21hcFtrdGhBZGRyZXNzKG1pbl9pZCArIDQpXSA9IG1pbl9pZCArIDQ7Ci0KLSAgaW50IG1heF9pZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4SWQ7Ci0gIHBhaXJlZF9kZXZpY2VfbWFwW2t0aEFkZHJlc3MobWF4X2lkIC0gMyldID0gbWF4X2lkIC0gMzsKLSAgcGFpcmVkX2RldmljZV9tYXBba3RoQWRkcmVzcyhtYXhfaWQgLSA0KV0gPSBtYXhfaWQgLSA0OwotCi0gIEVYUEVDVF9UUlVFKGFsbG9jYXRvci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLQotICAvLyBuZXh0IGlkIHNob3VsZCBiZSBtYXhfaWQgLSAyLCBtYXhfaWQgLSAxLCBtYXhfaWQsIG1pbl9pZCArIDIsIG1pbl9pZCArIDUKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWF4X2lkIC0gMikpLCBtYXhfaWQgLSAyKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWF4X2lkIC0gMSkpLCBtYXhfaWQgLSAxKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWF4X2lkKSksIG1heF9pZCk7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKG1pbl9pZCArIDIpKSwgbWluX2lkICsgMik7Ci0gIEVYUEVDVF9FUShhbGxvY2F0b3IuQWxsb2NhdGVJZChrdGhBZGRyZXNzKG1pbl9pZCArIDUpKSwgbWluX2lkICsgNSk7Ci0KLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkQWxsb2NhdG9yVGVzdCwgTWV0cmljSWRBbGxvY2F0b3JXcmFwQXJvdW5kVGVzdDIpIHsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXA7Ci0gIGF1dG8mIGFsbG9jYXRvciA9IE1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpOwotICBNZXRyaWNJZEFsbG9jYXRvcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXShjb25zdCBSYXdBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0KLSAgLy8gbWFrZSBhIHNwYXJzZSBwYWlyZWRfZGV2aWNlX21hcAotICBpbnQgbWluX2lkID0gTWV0cmljSWRBbGxvY2F0b3I6OmtNaW5JZDsKLSAgaW50IG1heF9pZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjprTWF4SWQ7Ci0gIHBhaXJlZF9kZXZpY2VfbWFwW2t0aEFkZHJlc3MobWF4X2lkKV0gPSBtYXhfaWQ7Ci0KLSAgRVhQRUNUX1RSVUUoYWxsb2NhdG9yLkluaXQocGFpcmVkX2RldmljZV9tYXAsIGNhbGxiYWNrLCBjYWxsYmFjaykpOwotCi0gIC8vIG5leHQgaWQgc2hvdWxkIGJlIG1pbl9pZCwgbWluX2lkICsgMQotICBFWFBFQ1RfRVEoYWxsb2NhdG9yLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhtaW5faWQpKSwgbWluX2lkKTsKLSAgRVhQRUNUX0VRKGFsbG9jYXRvci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWluX2lkICsgMSkpLCBtaW5faWQgKyAxKTsKLQotICBFWFBFQ1RfVFJVRShhbGxvY2F0b3IuQ2xvc2UoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9jb21tb24vbWV0cmljcy5jYyBiL2NvbW1vbi9tZXRyaWNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg3MGUwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9tZXRyaWNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm1ldHJpY3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9oYXJkd2FyZS9idF9hdi5oPgotI2luY2x1ZGUgPHN0YXRzbG9nX2J0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiYWRkcmVzc19vYmZ1c2NhdG9yLmgiCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL21ldHJpY3MvYmx1ZXRvb3RoLnBiLmgiCi0jaW5jbHVkZSAibGVha3lfYm9uZGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAibWV0cmljX2lkX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInRpbWVfdXRpbC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkEyRFBTZXNzaW9uOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkEyZHBTb3VyY2VDb2RlYzsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpCbHVldG9vdGhMb2c7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6Qmx1ZXRvb3RoU2Vzc2lvbjsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjoKLSAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjoKLSAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkRldmljZUluZm87Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6RGV2aWNlSW5mb19EZXZpY2VUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkhlYWRzZXRQcm9maWxlQ29ubmVjdGlvblN0YXRzOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkhlYWRzZXRQcm9maWxlVHlwZTsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpIZWFkc2V0UHJvZmlsZVR5cGVfQVJSQVlTSVpFOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkhlYWRzZXRQcm9maWxlVHlwZV9Jc1ZhbGlkOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkhlYWRzZXRQcm9maWxlVHlwZV9NQVg7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6SGVhZHNldFByb2ZpbGVUeXBlX01JTjsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpQYWlyRXZlbnQ7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6U2NhbkV2ZW50OwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OlNjYW5FdmVudF9TY2FuRXZlbnRUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OlNjYW5FdmVudF9TY2FuVGVjaG5vbG9neVR5cGU7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6V2FrZUV2ZW50OwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86Oldha2VFdmVudF9XYWtlRXZlbnRUeXBlOwotCi1zdGF0aWMgZmxvYXQgY29tYmluZV9hdmVyYWdlcyhmbG9hdCBhdmdfYSwgaW50NjRfdCBjdF9hLCBmbG9hdCBhdmdfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3RfYikgewotICBpZiAoY3RfYSA+IDAgJiYgY3RfYiA+IDApIHsKLSAgICByZXR1cm4gKGF2Z19hICogY3RfYSArIGF2Z19iICogY3RfYikgLyAoY3RfYSArIGN0X2IpOwotICB9IGVsc2UgaWYgKGN0X2IgPiAwKSB7Ci0gICAgcmV0dXJuIGF2Z19iOwotICB9IGVsc2UgewotICAgIHJldHVybiBhdmdfYTsKLSAgfQotfQotCi1zdGF0aWMgaW50MzJfdCBjb21iaW5lX2F2ZXJhZ2VzKGludDMyX3QgYXZnX2EsIGludDY0X3QgY3RfYSwgaW50MzJfdCBhdmdfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdF9iKSB7Ci0gIGlmIChjdF9hID4gMCAmJiBjdF9iID4gMCkgewotICAgIHJldHVybiAoYXZnX2EgKiBjdF9hICsgYXZnX2IgKiBjdF9iKSAvIChjdF9hICsgY3RfYik7Ci0gIH0gZWxzZSBpZiAoY3RfYiA+IDApIHsKLSAgICByZXR1cm4gYXZnX2I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGF2Z19hOwotICB9Ci19Ci0KLXZvaWQgQTJkcFNlc3Npb25NZXRyaWNzOjpVcGRhdGUoY29uc3QgQTJkcFNlc3Npb25NZXRyaWNzJiBtZXRyaWNzKSB7Ci0gIGlmIChtZXRyaWNzLmF1ZGlvX2R1cmF0aW9uX21zID49IDApIHsKLSAgICBhdWRpb19kdXJhdGlvbl9tcyA9IHN0ZDo6bWF4KHN0YXRpY19jYXN0PGludDY0X3Q+KDApLCBhdWRpb19kdXJhdGlvbl9tcyk7Ci0gICAgYXVkaW9fZHVyYXRpb25fbXMgKz0gbWV0cmljcy5hdWRpb19kdXJhdGlvbl9tczsKLSAgfQotICBpZiAobWV0cmljcy5tZWRpYV90aW1lcl9taW5fbXMgPj0gMCkgewotICAgIGlmIChtZWRpYV90aW1lcl9taW5fbXMgPCAwKSB7Ci0gICAgICBtZWRpYV90aW1lcl9taW5fbXMgPSBtZXRyaWNzLm1lZGlhX3RpbWVyX21pbl9tczsKLSAgICB9IGVsc2UgewotICAgICAgbWVkaWFfdGltZXJfbWluX21zID0KLSAgICAgICAgICBzdGQ6Om1pbihtZWRpYV90aW1lcl9taW5fbXMsIG1ldHJpY3MubWVkaWFfdGltZXJfbWluX21zKTsKLSAgICB9Ci0gIH0KLSAgaWYgKG1ldHJpY3MubWVkaWFfdGltZXJfbWF4X21zID49IDApIHsKLSAgICBtZWRpYV90aW1lcl9tYXhfbXMgPQotICAgICAgICBzdGQ6Om1heChtZWRpYV90aW1lcl9tYXhfbXMsIG1ldHJpY3MubWVkaWFfdGltZXJfbWF4X21zKTsKLSAgfQotICBpZiAobWV0cmljcy5tZWRpYV90aW1lcl9hdmdfbXMgPj0gMCAmJiBtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPj0gMCkgewotICAgIGlmIChtZWRpYV90aW1lcl9hdmdfbXMgPCAwIHx8IHRvdGFsX3NjaGVkdWxpbmdfY291bnQgPCAwKSB7Ci0gICAgICBtZWRpYV90aW1lcl9hdmdfbXMgPSBtZXRyaWNzLm1lZGlhX3RpbWVyX2F2Z19tczsKLSAgICAgIHRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSBtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1lZGlhX3RpbWVyX2F2Z19tcyA9IGNvbWJpbmVfYXZlcmFnZXMoCi0gICAgICAgICAgbWVkaWFfdGltZXJfYXZnX21zLCB0b3RhbF9zY2hlZHVsaW5nX2NvdW50LAotICAgICAgICAgIG1ldHJpY3MubWVkaWFfdGltZXJfYXZnX21zLCBtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQpOwotICAgICAgdG90YWxfc2NoZWR1bGluZ19jb3VudCArPSBtZXRyaWNzLnRvdGFsX3NjaGVkdWxpbmdfY291bnQ7Ci0gICAgfQotICB9Ci0gIGlmIChtZXRyaWNzLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPj0gMCkgewotICAgIGJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPQotICAgICAgICBzdGQ6Om1heChidWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50LCBtZXRyaWNzLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQpOwotICB9Ci0gIGlmIChtZXRyaWNzLmJ1ZmZlcl9vdmVycnVuc190b3RhbCA+PSAwKSB7Ci0gICAgYnVmZmVyX292ZXJydW5zX3RvdGFsID0KLSAgICAgICAgc3RkOjptYXgoc3RhdGljX2Nhc3Q8aW50MzJfdD4oMCksIGJ1ZmZlcl9vdmVycnVuc190b3RhbCk7Ci0gICAgYnVmZmVyX292ZXJydW5zX3RvdGFsICs9IG1ldHJpY3MuYnVmZmVyX292ZXJydW5zX3RvdGFsOwotICB9Ci0gIGlmIChtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA+PSAwICYmCi0gICAgICBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPj0gMCkgewotICAgIGlmIChidWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPCAwIHx8IGJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPCAwKSB7Ci0gICAgICBidWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZTsKLSAgICAgIGJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPSBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IGNvbWJpbmVfYXZlcmFnZXMoCi0gICAgICAgICAgYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlLCBidWZmZXJfdW5kZXJydW5zX2NvdW50LAotICAgICAgICAgIG1ldHJpY3MuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlLCBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQpOwotICAgICAgYnVmZmVyX3VuZGVycnVuc19jb3VudCArPSBtZXRyaWNzLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQ7Ci0gICAgfQotICB9Ci0gIGlmIChjb2RlY19pbmRleCA8IDApIHsKLSAgICBjb2RlY19pbmRleCA9IG1ldHJpY3MuY29kZWNfaW5kZXg7Ci0gIH0KLSAgaWYgKCFpc19hMmRwX29mZmxvYWQpIHsKLSAgICBpc19hMmRwX29mZmxvYWQgPSBtZXRyaWNzLmlzX2EyZHBfb2ZmbG9hZDsKLSAgfQotfQotCi1ib29sIEEyZHBTZXNzaW9uTWV0cmljczo6b3BlcmF0b3I9PShjb25zdCBBMmRwU2Vzc2lvbk1ldHJpY3MmIHJocykgY29uc3QgewotICByZXR1cm4gYXVkaW9fZHVyYXRpb25fbXMgPT0gcmhzLmF1ZGlvX2R1cmF0aW9uX21zICYmCi0gICAgICAgICBtZWRpYV90aW1lcl9taW5fbXMgPT0gcmhzLm1lZGlhX3RpbWVyX21pbl9tcyAmJgotICAgICAgICAgbWVkaWFfdGltZXJfbWF4X21zID09IHJocy5tZWRpYV90aW1lcl9tYXhfbXMgJiYKLSAgICAgICAgIG1lZGlhX3RpbWVyX2F2Z19tcyA9PSByaHMubWVkaWFfdGltZXJfYXZnX21zICYmCi0gICAgICAgICB0b3RhbF9zY2hlZHVsaW5nX2NvdW50ID09IHJocy50b3RhbF9zY2hlZHVsaW5nX2NvdW50ICYmCi0gICAgICAgICBidWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID09IHJocy5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ICYmCi0gICAgICAgICBidWZmZXJfb3ZlcnJ1bnNfdG90YWwgPT0gcmhzLmJ1ZmZlcl9vdmVycnVuc190b3RhbCAmJgotICAgICAgICAgYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID09IHJocy5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgJiYKLSAgICAgICAgIGJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPT0gcmhzLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgJiYKLSAgICAgICAgIGNvZGVjX2luZGV4ID09IHJocy5jb2RlY19pbmRleCAmJgotICAgICAgICAgaXNfYTJkcF9vZmZsb2FkID09IHJocy5pc19hMmRwX29mZmxvYWQ7Ci19Ci0KLXN0YXRpYyBEZXZpY2VJbmZvX0RldmljZVR5cGUgZ2V0X2RldmljZV90eXBlKGRldmljZV90eXBlX3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIERFVklDRV9UWVBFX0JSRURSOgotICAgICAgcmV0dXJuIERldmljZUluZm9fRGV2aWNlVHlwZTo6RGV2aWNlSW5mb19EZXZpY2VUeXBlX0RFVklDRV9UWVBFX0JSRURSOwotICAgIGNhc2UgREVWSUNFX1RZUEVfTEU6Ci0gICAgICByZXR1cm4gRGV2aWNlSW5mb19EZXZpY2VUeXBlOjpEZXZpY2VJbmZvX0RldmljZVR5cGVfREVWSUNFX1RZUEVfTEU7Ci0gICAgY2FzZSBERVZJQ0VfVFlQRV9EVU1POgotICAgICAgcmV0dXJuIERldmljZUluZm9fRGV2aWNlVHlwZTo6RGV2aWNlSW5mb19EZXZpY2VUeXBlX0RFVklDRV9UWVBFX0RVTU87Ci0gICAgY2FzZSBERVZJQ0VfVFlQRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRGV2aWNlSW5mb19EZXZpY2VUeXBlOjpEZXZpY2VJbmZvX0RldmljZVR5cGVfREVWSUNFX1RZUEVfVU5LTk9XTjsKLSAgfQotfQotCi1zdGF0aWMgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGUgZ2V0X2Nvbm5lY3Rpb25fdGVjaF90eXBlKAotICAgIGNvbm5lY3Rpb25fdGVjaF90IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9MRToKLSAgICAgIHJldHVybiBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfTEU7Ci0gICAgY2FzZSBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9CUkVEUjoKLSAgICAgIHJldHVybiBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFI7Ci0gICAgY2FzZSBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGU6OgotICAgICAgICAgIEJsdWV0b290aFNlc3Npb25fQ29ubmVjdGlvblRlY2hub2xvZ3lUeXBlX0NPTk5FQ1RJT05fVEVDSE5PTE9HWV9UWVBFX1VOS05PV047Ci0gIH0KLX0KLQotc3RhdGljIFNjYW5FdmVudF9TY2FuVGVjaG5vbG9neVR5cGUgZ2V0X3NjYW5fdGVjaF90eXBlKHNjYW5fdGVjaF90IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBTQ0FOX1RFQ0hfVFlQRV9MRToKLSAgICAgIHJldHVybiBTY2FuRXZlbnRfU2NhblRlY2hub2xvZ3lUeXBlOjoKLSAgICAgICAgICBTY2FuRXZlbnRfU2NhblRlY2hub2xvZ3lUeXBlX1NDQU5fVEVDSF9UWVBFX0xFOwotICAgIGNhc2UgU0NBTl9URUNIX1RZUEVfQlJFRFI6Ci0gICAgICByZXR1cm4gU2NhbkV2ZW50X1NjYW5UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgU2NhbkV2ZW50X1NjYW5UZWNobm9sb2d5VHlwZV9TQ0FOX1RFQ0hfVFlQRV9CUkVEUjsKLSAgICBjYXNlIFNDQU5fVEVDSF9UWVBFX0JPVEg6Ci0gICAgICByZXR1cm4gU2NhbkV2ZW50X1NjYW5UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgU2NhbkV2ZW50X1NjYW5UZWNobm9sb2d5VHlwZV9TQ0FOX1RFQ0hfVFlQRV9CT1RIOwotICAgIGNhc2UgU0NBTl9UWVBFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBTY2FuRXZlbnRfU2NhblRlY2hub2xvZ3lUeXBlOjoKLSAgICAgICAgICBTY2FuRXZlbnRfU2NhblRlY2hub2xvZ3lUeXBlX1NDQU5fVFlQRV9VTktOT1dOOwotICB9Ci19Ci0KLXN0YXRpYyBXYWtlRXZlbnRfV2FrZUV2ZW50VHlwZSBnZXRfd2FrZV9ldmVudF90eXBlKHdha2VfZXZlbnRfdHlwZV90IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBXQUtFX0VWRU5UX0FDUVVJUkVEOgotICAgICAgcmV0dXJuIFdha2VFdmVudF9XYWtlRXZlbnRUeXBlOjpXYWtlRXZlbnRfV2FrZUV2ZW50VHlwZV9BQ1FVSVJFRDsKLSAgICBjYXNlIFdBS0VfRVZFTlRfUkVMRUFTRUQ6Ci0gICAgICByZXR1cm4gV2FrZUV2ZW50X1dha2VFdmVudFR5cGU6Oldha2VFdmVudF9XYWtlRXZlbnRUeXBlX1JFTEVBU0VEOwotICAgIGNhc2UgV0FLRV9FVkVOVF9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gV2FrZUV2ZW50X1dha2VFdmVudFR5cGU6Oldha2VFdmVudF9XYWtlRXZlbnRUeXBlX1VOS05PV047Ci0gIH0KLX0KLQotc3RhdGljIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGUgZ2V0X2Rpc2Nvbm5lY3RfcmVhc29uX3R5cGUoCi0gICAgZGlzY29ubmVjdF9yZWFzb25fdCB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRElTQ09OTkVDVF9SRUFTT05fTUVUUklDU19EVU1QOgotICAgICAgcmV0dXJuIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGU6OgotICAgICAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGVfTUVUUklDU19EVU1QOwotICAgIGNhc2UgRElTQ09OTkVDVF9SRUFTT05fTkVYVF9TVEFSVF9XSVRIT1VUX0VORF9QUkVWSU9VUzoKLSAgICAgIHJldHVybiBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX05FWFRfU1RBUlRfV0lUSE9VVF9FTkRfUFJFVklPVVM7Ci0gICAgY2FzZSBESVNDT05ORUNUX1JFQVNPTl9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQmx1ZXRvb3RoU2Vzc2lvbl9EaXNjb25uZWN0UmVhc29uVHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9EaXNjb25uZWN0UmVhc29uVHlwZV9VTktOT1dOOwotICB9Ci19Ci0KLXN0YXRpYyBBMmRwU291cmNlQ29kZWMgZ2V0X2EyZHBfc291cmNlX2NvZGVjKGludDY0X3QgY29kZWNfaW5kZXgpIHsKLSAgc3dpdGNoIChjb2RlY19pbmRleCkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkM6Ci0gICAgICByZXR1cm4gQTJkcFNvdXJjZUNvZGVjOjpBMkRQX1NPVVJDRV9DT0RFQ19TQkM7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICAgIHJldHVybiBBMmRwU291cmNlQ29kZWM6OkEyRFBfU09VUkNFX0NPREVDX0FBQzsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWDoKLSAgICAgIHJldHVybiBBMmRwU291cmNlQ29kZWM6OkEyRFBfU09VUkNFX0NPREVDX0FQVFg7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFhfSEQ6Ci0gICAgICByZXR1cm4gQTJkcFNvdXJjZUNvZGVjOjpBMkRQX1NPVVJDRV9DT0RFQ19BUFRYX0hEOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9MREFDOgotICAgICAgcmV0dXJuIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfTERBQzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfVU5LTk9XTjsKLSAgfQotfQotCi1zdHJ1Y3QgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6aW1wbCB7Ci0gIGltcGwoc2l6ZV90IG1heF9ibHVldG9vdGhfc2Vzc2lvbiwgc2l6ZV90IG1heF9wYWlyX2V2ZW50LAotICAgICAgIHNpemVfdCBtYXhfd2FrZV9ldmVudCwgc2l6ZV90IG1heF9zY2FuX2V2ZW50KQotICAgICAgOiBidF9zZXNzaW9uX3F1ZXVlXygKLSAgICAgICAgICAgIG5ldyBMZWFreUJvbmRlZFF1ZXVlPEJsdWV0b290aFNlc3Npb24+KG1heF9ibHVldG9vdGhfc2Vzc2lvbikpLAotICAgICAgICBwYWlyX2V2ZW50X3F1ZXVlXyhuZXcgTGVha3lCb25kZWRRdWV1ZTxQYWlyRXZlbnQ+KG1heF9wYWlyX2V2ZW50KSksCi0gICAgICAgIHdha2VfZXZlbnRfcXVldWVfKG5ldyBMZWFreUJvbmRlZFF1ZXVlPFdha2VFdmVudD4obWF4X3dha2VfZXZlbnQpKSwKLSAgICAgICAgc2Nhbl9ldmVudF9xdWV1ZV8obmV3IExlYWt5Qm9uZGVkUXVldWU8U2NhbkV2ZW50PihtYXhfc2Nhbl9ldmVudCkpIHsKLSAgICBibHVldG9vdGhfbG9nXyA9IEJsdWV0b290aExvZzo6ZGVmYXVsdF9pbnN0YW5jZSgpLk5ldygpOwotICAgIGhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX2NvdW50c18uZmlsbCgwKTsKLSAgICBibHVldG9vdGhfc2Vzc2lvbl8gPSBudWxscHRyOwotICAgIGJsdWV0b290aF9zZXNzaW9uX3N0YXJ0X3RpbWVfbXNfID0gMDsKLSAgICBhMmRwX3Nlc3Npb25fbWV0cmljc18gPSBBMmRwU2Vzc2lvbk1ldHJpY3MoKTsKLSAgfQotCi0gIC8qIEJsdWV0b290aCBsb2cgbG9jayBwcm90ZWN0ZWQgKi8KLSAgQmx1ZXRvb3RoTG9nKiBibHVldG9vdGhfbG9nXzsKLSAgc3RkOjphcnJheTxpbnQsIEhlYWRzZXRQcm9maWxlVHlwZV9BUlJBWVNJWkU+Ci0gICAgICBoZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9jb3VudHNfOwotICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBibHVldG9vdGhfbG9nX2xvY2tfOwotICAvKiBFbmQgQmx1ZXRvb3RoIGxvZyBsb2NrIHByb3RlY3RlZCAqLwotICAvKiBCbHVldG9vdGggc2Vzc2lvbiBsb2NrIHByb3RlY3RlZCAqLwotICBCbHVldG9vdGhTZXNzaW9uKiBibHVldG9vdGhfc2Vzc2lvbl87Ci0gIHVpbnQ2NF90IGJsdWV0b290aF9zZXNzaW9uX3N0YXJ0X3RpbWVfbXNfOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgYTJkcF9zZXNzaW9uX21ldHJpY3NfOwotICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBibHVldG9vdGhfc2Vzc2lvbl9sb2NrXzsKLSAgLyogRW5kIGJsdWV0b290aCBzZXNzaW9uIGxvY2sgcHJvdGVjdGVkICovCi0gIHN0ZDo6dW5pcXVlX3B0cjxMZWFreUJvbmRlZFF1ZXVlPEJsdWV0b290aFNlc3Npb24+PiBidF9zZXNzaW9uX3F1ZXVlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPExlYWt5Qm9uZGVkUXVldWU8UGFpckV2ZW50Pj4gcGFpcl9ldmVudF9xdWV1ZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMZWFreUJvbmRlZFF1ZXVlPFdha2VFdmVudD4+IHdha2VfZXZlbnRfcXVldWVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8TGVha3lCb25kZWRRdWV1ZTxTY2FuRXZlbnQ+PiBzY2FuX2V2ZW50X3F1ZXVlXzsKLX07Ci0KLUJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkJsdWV0b290aE1ldHJpY3NMb2dnZXIoKQotICAgIDogcGltcGxfKG5ldyBpbXBsKGtNYXhOdW1CbHVldG9vdGhTZXNzaW9uLCBrTWF4TnVtUGFpckV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgIGtNYXhOdW1XYWtlRXZlbnQsIGtNYXhOdW1TY2FuRXZlbnQpKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ1BhaXJFdmVudCh1aW50MzJfdCBkaXNjb25uZWN0X3JlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUpIHsKLSAgUGFpckV2ZW50KiBldmVudCA9IG5ldyBQYWlyRXZlbnQoKTsKLSAgRGV2aWNlSW5mbyogaW5mbyA9IGV2ZW50LT5tdXRhYmxlX2RldmljZV9wYWlyZWRfd2l0aCgpOwotICBpbmZvLT5zZXRfZGV2aWNlX2NsYXNzKGRldmljZV9jbGFzcyk7Ci0gIGluZm8tPnNldF9kZXZpY2VfdHlwZShnZXRfZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpKTsKLSAgZXZlbnQtPnNldF9kaXNjb25uZWN0X3JlYXNvbihkaXNjb25uZWN0X3JlYXNvbik7Ci0gIGV2ZW50LT5zZXRfZXZlbnRfdGltZV9taWxsaXModGltZXN0YW1wX21zKTsKLSAgcGltcGxfLT5wYWlyX2V2ZW50X3F1ZXVlXy0+RW5xdWV1ZShldmVudCk7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2socGltcGxfLT5ibHVldG9vdGhfbG9nX2xvY2tfKTsKLSAgICBwaW1wbF8tPmJsdWV0b290aF9sb2dfLT5zZXRfbnVtX3BhaXJfZXZlbnQoCi0gICAgICAgIHBpbXBsXy0+Ymx1ZXRvb3RoX2xvZ18tPm51bV9wYWlyX2V2ZW50KCkgKyAxKTsKLSAgfQotfQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ1dha2VFdmVudCh3YWtlX2V2ZW50X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlcXVlc3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wX21zKSB7Ci0gIFdha2VFdmVudCogZXZlbnQgPSBuZXcgV2FrZUV2ZW50KCk7Ci0gIGV2ZW50LT5zZXRfd2FrZV9ldmVudF90eXBlKGdldF93YWtlX2V2ZW50X3R5cGUodHlwZSkpOwotICBldmVudC0+c2V0X3JlcXVlc3RvcihyZXF1ZXN0b3IpOwotICBldmVudC0+c2V0X25hbWUobmFtZSk7Ci0gIGV2ZW50LT5zZXRfZXZlbnRfdGltZV9taWxsaXModGltZXN0YW1wX21zKTsKLSAgcGltcGxfLT53YWtlX2V2ZW50X3F1ZXVlXy0+RW5xdWV1ZShldmVudCk7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2socGltcGxfLT5ibHVldG9vdGhfbG9nX2xvY2tfKTsKLSAgICBwaW1wbF8tPmJsdWV0b290aF9sb2dfLT5zZXRfbnVtX3dha2VfZXZlbnQoCi0gICAgICAgIHBpbXBsXy0+Ymx1ZXRvb3RoX2xvZ18tPm51bV93YWtlX2V2ZW50KCkgKyAxKTsKLSAgfQotfQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ1NjYW5FdmVudChib29sIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXRhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl90ZWNoX3QgdHlwZSwgdWludDMyX3QgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcF9tcykgewotICBTY2FuRXZlbnQqIGV2ZW50ID0gbmV3IFNjYW5FdmVudCgpOwotICBpZiAoc3RhcnQpIHsKLSAgICBldmVudC0+c2V0X3NjYW5fZXZlbnRfdHlwZShTY2FuRXZlbnQ6OlNDQU5fRVZFTlRfU1RBUlQpOwotICB9IGVsc2UgewotICAgIGV2ZW50LT5zZXRfc2Nhbl9ldmVudF90eXBlKFNjYW5FdmVudDo6U0NBTl9FVkVOVF9TVE9QKTsKLSAgfQotICBldmVudC0+c2V0X2luaXRpYXRvcihpbml0YXRvcik7Ci0gIGV2ZW50LT5zZXRfc2Nhbl90ZWNobm9sb2d5X3R5cGUoZ2V0X3NjYW5fdGVjaF90eXBlKHR5cGUpKTsKLSAgZXZlbnQtPnNldF9udW1iZXJfcmVzdWx0cyhyZXN1bHRzKTsKLSAgZXZlbnQtPnNldF9ldmVudF90aW1lX21pbGxpcyh0aW1lc3RhbXBfbXMpOwotICBwaW1wbF8tPnNjYW5fZXZlbnRfcXVldWVfLT5FbnF1ZXVlKGV2ZW50KTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhwaW1wbF8tPmJsdWV0b290aF9sb2dfbG9ja18pOwotICAgIHBpbXBsXy0+Ymx1ZXRvb3RoX2xvZ18tPnNldF9udW1fc2Nhbl9ldmVudCgKLSAgICAgICAgcGltcGxfLT5ibHVldG9vdGhfbG9nXy0+bnVtX3NjYW5fZXZlbnQoKSArIDEpOwotICB9Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nQmx1ZXRvb3RoU2Vzc2lvblN0YXJ0KAotICAgIGNvbm5lY3Rpb25fdGVjaF90IGNvbm5lY3Rpb25fdGVjaF90eXBlLCB1aW50NjRfdCB0aW1lc3RhbXBfbXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fbG9ja18pOwotICBpZiAocGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl8gIT0gbnVsbHB0cikgewotICAgIExvZ0JsdWV0b290aFNlc3Npb25FbmQoRElTQ09OTkVDVF9SRUFTT05fTkVYVF9TVEFSVF9XSVRIT1VUX0VORF9QUkVWSU9VUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICB9Ci0gIGlmICh0aW1lc3RhbXBfbXMgPT0gMCkgewotICAgIHRpbWVzdGFtcF9tcyA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICB9Ci0gIHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fc3RhcnRfdGltZV9tc18gPSB0aW1lc3RhbXBfbXM7Ci0gIHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fID0gbmV3IEJsdWV0b290aFNlc3Npb24oKTsKLSAgcGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl8tPnNldF9jb25uZWN0aW9uX3RlY2hub2xvZ3lfdHlwZSgKLSAgICAgIGdldF9jb25uZWN0aW9uX3RlY2hfdHlwZShjb25uZWN0aW9uX3RlY2hfdHlwZSkpOwotfQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0JsdWV0b290aFNlc3Npb25FbmQoCi0gICAgZGlzY29ubmVjdF9yZWFzb25fdCBkaXNjb25uZWN0X3JlYXNvbiwgdWludDY0X3QgdGltZXN0YW1wX21zKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhwaW1wbF8tPmJsdWV0b290aF9zZXNzaW9uX2xvY2tfKTsKLSAgaWYgKHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fID09IG51bGxwdHIpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHRpbWVzdGFtcF9tcyA9PSAwKSB7Ci0gICAgdGltZXN0YW1wX21zID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCk7Ci0gIH0KLSAgaW50NjRfdCBzZXNzaW9uX2R1cmF0aW9uX3NlYyA9Ci0gICAgICAodGltZXN0YW1wX21zIC0gcGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl9zdGFydF90aW1lX21zXykgLyAxMDAwOwotICBwaW1wbF8tPmJsdWV0b290aF9zZXNzaW9uXy0+c2V0X3Nlc3Npb25fZHVyYXRpb25fc2VjKHNlc3Npb25fZHVyYXRpb25fc2VjKTsKLSAgcGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl8tPnNldF9kaXNjb25uZWN0X3JlYXNvbl90eXBlKAotICAgICAgZ2V0X2Rpc2Nvbm5lY3RfcmVhc29uX3R5cGUoZGlzY29ubmVjdF9yZWFzb24pKTsKLSAgcGltcGxfLT5idF9zZXNzaW9uX3F1ZXVlXy0+RW5xdWV1ZShwaW1wbF8tPmJsdWV0b290aF9zZXNzaW9uXyk7Ci0gIHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fID0gbnVsbHB0cjsKLSAgcGltcGxfLT5hMmRwX3Nlc3Npb25fbWV0cmljc18gPSBBMmRwU2Vzc2lvbk1ldHJpY3MoKTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9nX2xvY2socGltcGxfLT5ibHVldG9vdGhfbG9nX2xvY2tfKTsKLSAgICBwaW1wbF8tPmJsdWV0b290aF9sb2dfLT5zZXRfbnVtX2JsdWV0b290aF9zZXNzaW9uKAotICAgICAgICBwaW1wbF8tPmJsdWV0b290aF9sb2dfLT5udW1fYmx1ZXRvb3RoX3Nlc3Npb24oKSArIDEpOwotICB9Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nQmx1ZXRvb3RoU2Vzc2lvbkRldmljZUluZm8oCi0gICAgdWludDMyX3QgZGV2aWNlX2NsYXNzLCBkZXZpY2VfdHlwZV90IGRldmljZV90eXBlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhwaW1wbF8tPmJsdWV0b290aF9zZXNzaW9uX2xvY2tfKTsKLSAgaWYgKHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fID09IG51bGxwdHIpIHsKLSAgICBMb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfVU5LTk9XTiwgMCk7Ci0gIH0KLSAgRGV2aWNlSW5mbyogaW5mbyA9IHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fLT5tdXRhYmxlX2RldmljZV9jb25uZWN0ZWRfdG8oKTsKLSAgaW5mby0+c2V0X2RldmljZV9jbGFzcyhkZXZpY2VfY2xhc3MpOwotICBpbmZvLT5zZXRfZGV2aWNlX3R5cGUoRGV2aWNlSW5mbzo6REVWSUNFX1RZUEVfQlJFRFIpOwotfQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0EyZHBTZXNzaW9uKAotICAgIGNvbnN0IEEyZHBTZXNzaW9uTWV0cmljcyYgYTJkcF9zZXNzaW9uX21ldHJpY3MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fbG9ja18pOwotICBpZiAocGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl8gPT0gbnVsbHB0cikgewotICAgIC8vIFdoZW4gbm8gYmx1ZXRvb3RoIHNlc3Npb24gZXhpc3QsIGNyZWF0ZSBvbmUgb24gc3lzdGVtJ3MgYmVoYWxmCi0gICAgLy8gU2V0IGNvbm5lY3Rpb24gdHlwZTogZm9yIEEyRFAgaXQgaXMgYWx3YXlzIEJSL0VEUgotICAgIExvZ0JsdWV0b290aFNlc3Npb25TdGFydChDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9CUkVEUiwgMCk7Ci0gICAgTG9nQmx1ZXRvb3RoU2Vzc2lvbkRldmljZUluZm8oQlRNX0NPRF9NQUpPUl9BVURJTywgREVWSUNFX1RZUEVfQlJFRFIpOwotICB9Ci0gIC8vIEFjY3VtdWxhdGUgbWV0cmljcwotICBwaW1wbF8tPmEyZHBfc2Vzc2lvbl9tZXRyaWNzXy5VcGRhdGUoYTJkcF9zZXNzaW9uX21ldHJpY3MpOwotICAvLyBHZXQgb3IgYWxsb2NhdGUgbmV3IEEyRFAgc2Vzc2lvbiBvYmplY3QKLSAgQTJEUFNlc3Npb24qIGEyZHBfc2Vzc2lvbiA9Ci0gICAgICBwaW1wbF8tPmJsdWV0b290aF9zZXNzaW9uXy0+bXV0YWJsZV9hMmRwX3Nlc3Npb24oKTsKLSAgYTJkcF9zZXNzaW9uLT5zZXRfYXVkaW9fZHVyYXRpb25fbWlsbGlzKAotICAgICAgcGltcGxfLT5hMmRwX3Nlc3Npb25fbWV0cmljc18uYXVkaW9fZHVyYXRpb25fbXMpOwotICBhMmRwX3Nlc3Npb24tPnNldF9tZWRpYV90aW1lcl9taW5fbWlsbGlzKAotICAgICAgcGltcGxfLT5hMmRwX3Nlc3Npb25fbWV0cmljc18ubWVkaWFfdGltZXJfbWluX21zKTsKLSAgYTJkcF9zZXNzaW9uLT5zZXRfbWVkaWFfdGltZXJfbWF4X21pbGxpcygKLSAgICAgIHBpbXBsXy0+YTJkcF9zZXNzaW9uX21ldHJpY3NfLm1lZGlhX3RpbWVyX21heF9tcyk7Ci0gIGEyZHBfc2Vzc2lvbi0+c2V0X21lZGlhX3RpbWVyX2F2Z19taWxsaXMoCi0gICAgICBwaW1wbF8tPmEyZHBfc2Vzc2lvbl9tZXRyaWNzXy5tZWRpYV90aW1lcl9hdmdfbXMpOwotICBhMmRwX3Nlc3Npb24tPnNldF9idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50KAotICAgICAgcGltcGxfLT5hMmRwX3Nlc3Npb25fbWV0cmljc18uYnVmZmVyX292ZXJydW5zX21heF9jb3VudCk7Ci0gIGEyZHBfc2Vzc2lvbi0+c2V0X2J1ZmZlcl9vdmVycnVuc190b3RhbCgKLSAgICAgIHBpbXBsXy0+YTJkcF9zZXNzaW9uX21ldHJpY3NfLmJ1ZmZlcl9vdmVycnVuc190b3RhbCk7Ci0gIGEyZHBfc2Vzc2lvbi0+c2V0X2J1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSgKLSAgICAgIHBpbXBsXy0+YTJkcF9zZXNzaW9uX21ldHJpY3NfLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSk7Ci0gIGEyZHBfc2Vzc2lvbi0+c2V0X2J1ZmZlcl91bmRlcnJ1bnNfY291bnQoCi0gICAgICBwaW1wbF8tPmEyZHBfc2Vzc2lvbl9tZXRyaWNzXy5idWZmZXJfdW5kZXJydW5zX2NvdW50KTsKLSAgYTJkcF9zZXNzaW9uLT5zZXRfc291cmNlX2NvZGVjKAotICAgICAgZ2V0X2EyZHBfc291cmNlX2NvZGVjKHBpbXBsXy0+YTJkcF9zZXNzaW9uX21ldHJpY3NfLmNvZGVjX2luZGV4KSk7Ci0gIGEyZHBfc2Vzc2lvbi0+c2V0X2lzX2EyZHBfb2ZmbG9hZCgKLSAgICAgIHBpbXBsXy0+YTJkcF9zZXNzaW9uX21ldHJpY3NfLmlzX2EyZHBfb2ZmbG9hZCk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nSGVhZHNldFByb2ZpbGVSZmNDb25uZWN0aW9uKAotICAgIHRCVEFfU0VSVklDRV9JRCBzZXJ2aWNlX2lkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhwaW1wbF8tPmJsdWV0b290aF9sb2dfbG9ja18pOwotICBzd2l0Y2ggKHNlcnZpY2VfaWQpIHsKLSAgICBjYXNlIEJUQV9IU1BfU0VSVklDRV9JRDoKLSAgICAgIHBpbXBsXy0+aGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fY291bnRzX1tIZWFkc2V0UHJvZmlsZVR5cGU6OkhTUF0rKzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBX0hGUF9TRVJWSUNFX0lEOgotICAgICAgcGltcGxfLT5oZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9jb3VudHNfW0hlYWRzZXRQcm9maWxlVHlwZTo6SEZQXSsrOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHBpbXBsXy0+aGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fY291bnRzXwotICAgICAgICAgIFtIZWFkc2V0UHJvZmlsZVR5cGU6OkhFQURTRVRfUFJPRklMRV9VTktOT1dOXSsrOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuOwotfQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OldyaXRlU3RyaW5nKHN0ZDo6c3RyaW5nKiBzZXJpYWxpemVkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhwaW1wbF8tPmJsdWV0b290aF9sb2dfbG9ja18pOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYnVpbGRpbmcgbWV0cmljcyI7Ci0gIEJ1aWxkKCk7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJpYWxpemluZyBtZXRyaWNzIjsKLSAgaWYgKCFwaW1wbF8tPmJsdWV0b290aF9sb2dfLT5TZXJpYWxpemVUb1N0cmluZyhzZXJpYWxpemVkKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZXJyb3Igc2VyaWFsaXppbmcgbWV0cmljcyI7Ci0gIH0KLSAgLy8gQWx3YXlzIGNsZWFuIHVwIGxvZyBvYmplY3RzCi0gIHBpbXBsXy0+Ymx1ZXRvb3RoX2xvZ18tPkNsZWFyKCk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6V3JpdGVCYXNlNjRTdHJpbmcoc3RkOjpzdHJpbmcqIHNlcmlhbGl6ZWQpIHsKLSAgdGhpcy0+V3JpdGVTdHJpbmcoc2VyaWFsaXplZCk7Ci0gIGJhc2U6OkJhc2U2NEVuY29kZSgqc2VyaWFsaXplZCwgc2VyaWFsaXplZCk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6V3JpdGVCYXNlNjQoaW50IGZkKSB7Ci0gIHN0ZDo6c3RyaW5nIHByb3RvQmFzZTY0OwotICB0aGlzLT5Xcml0ZUJhc2U2NFN0cmluZygmcHJvdG9CYXNlNjQpOwotICBzc2l6ZV90IHJldDsKLSAgT1NJX05PX0lOVFIocmV0ID0gd3JpdGUoZmQsIHByb3RvQmFzZTY0LmNfc3RyKCksIHByb3RvQmFzZTY0LnNpemUoKSkpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogZXJyb3Igd3JpdGluZyB0byBkdW1wc3lzIGZkOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCAiICgiCi0gICAgICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhlcnJubykgPDwgIikiOwotICB9Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6Q3V0b2ZmU2Vzc2lvbigpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fbG9ja18pOwotICBpZiAocGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl8gIT0gbnVsbHB0cikgewotICAgIEJsdWV0b290aFNlc3Npb24qIG5ld19idF9zZXNzaW9uID0KLSAgICAgICAgbmV3IEJsdWV0b290aFNlc3Npb24oKnBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fKTsKLSAgICBuZXdfYnRfc2Vzc2lvbi0+Y2xlYXJfYTJkcF9zZXNzaW9uKCk7Ci0gICAgbmV3X2J0X3Nlc3Npb24tPmNsZWFyX3JmY29tbV9zZXNzaW9uKCk7Ci0gICAgTG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZChESVNDT05ORUNUX1JFQVNPTl9NRVRSSUNTX0RVTVAsIDApOwotICAgIHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fID0gbmV3X2J0X3Nlc3Npb247Ci0gICAgcGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl9zdGFydF90aW1lX21zXyA9Ci0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICAgIHBpbXBsXy0+YTJkcF9zZXNzaW9uX21ldHJpY3NfID0gQTJkcFNlc3Npb25NZXRyaWNzKCk7Ci0gIH0KLX0KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpCdWlsZCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHBpbXBsXy0+Ymx1ZXRvb3RoX2xvZ19sb2NrXyk7Ci0gIEN1dG9mZlNlc3Npb24oKTsKLSAgQmx1ZXRvb3RoTG9nKiBibHVldG9vdGhfbG9nID0gcGltcGxfLT5ibHVldG9vdGhfbG9nXzsKLSAgd2hpbGUgKCFwaW1wbF8tPmJ0X3Nlc3Npb25fcXVldWVfLT5FbXB0eSgpICYmCi0gICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsdWV0b290aF9sb2ctPnNlc3Npb25fc2l6ZSgpKSA8PQotICAgICAgICAgICAgIHBpbXBsXy0+YnRfc2Vzc2lvbl9xdWV1ZV8tPkNhcGFjaXR5KCkpIHsKLSAgICBibHVldG9vdGhfbG9nLT5tdXRhYmxlX3Nlc3Npb24oKS0+QWRkQWxsb2NhdGVkKAotICAgICAgICBwaW1wbF8tPmJ0X3Nlc3Npb25fcXVldWVfLT5EZXF1ZXVlKCkpOwotICB9Ci0gIHdoaWxlICghcGltcGxfLT5wYWlyX2V2ZW50X3F1ZXVlXy0+RW1wdHkoKSAmJgotICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihibHVldG9vdGhfbG9nLT5wYWlyX2V2ZW50X3NpemUoKSkgPD0KLSAgICAgICAgICAgICBwaW1wbF8tPnBhaXJfZXZlbnRfcXVldWVfLT5DYXBhY2l0eSgpKSB7Ci0gICAgYmx1ZXRvb3RoX2xvZy0+bXV0YWJsZV9wYWlyX2V2ZW50KCktPkFkZEFsbG9jYXRlZCgKLSAgICAgICAgcGltcGxfLT5wYWlyX2V2ZW50X3F1ZXVlXy0+RGVxdWV1ZSgpKTsKLSAgfQotICB3aGlsZSAoIXBpbXBsXy0+c2Nhbl9ldmVudF9xdWV1ZV8tPkVtcHR5KCkgJiYKLSAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oYmx1ZXRvb3RoX2xvZy0+c2Nhbl9ldmVudF9zaXplKCkpIDw9Ci0gICAgICAgICAgICAgcGltcGxfLT5zY2FuX2V2ZW50X3F1ZXVlXy0+Q2FwYWNpdHkoKSkgewotICAgIGJsdWV0b290aF9sb2ctPm11dGFibGVfc2Nhbl9ldmVudCgpLT5BZGRBbGxvY2F0ZWQoCi0gICAgICAgIHBpbXBsXy0+c2Nhbl9ldmVudF9xdWV1ZV8tPkRlcXVldWUoKSk7Ci0gIH0KLSAgd2hpbGUgKCFwaW1wbF8tPndha2VfZXZlbnRfcXVldWVfLT5FbXB0eSgpICYmCi0gICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsdWV0b290aF9sb2ctPndha2VfZXZlbnRfc2l6ZSgpKSA8PQotICAgICAgICAgICAgIHBpbXBsXy0+d2FrZV9ldmVudF9xdWV1ZV8tPkNhcGFjaXR5KCkpIHsKLSAgICBibHVldG9vdGhfbG9nLT5tdXRhYmxlX3dha2VfZXZlbnQoKS0+QWRkQWxsb2NhdGVkKAotICAgICAgICBwaW1wbF8tPndha2VfZXZlbnRfcXVldWVfLT5EZXF1ZXVlKCkpOwotICB9Ci0gIHdoaWxlICghcGltcGxfLT5idF9zZXNzaW9uX3F1ZXVlXy0+RW1wdHkoKSAmJgotICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihibHVldG9vdGhfbG9nLT53YWtlX2V2ZW50X3NpemUoKSkgPD0KLSAgICAgICAgICAgICBwaW1wbF8tPndha2VfZXZlbnRfcXVldWVfLT5DYXBhY2l0eSgpKSB7Ci0gICAgYmx1ZXRvb3RoX2xvZy0+bXV0YWJsZV93YWtlX2V2ZW50KCktPkFkZEFsbG9jYXRlZCgKLSAgICAgICAgcGltcGxfLT53YWtlX2V2ZW50X3F1ZXVlXy0+RGVxdWV1ZSgpKTsKLSAgfQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEhlYWRzZXRQcm9maWxlVHlwZV9BUlJBWVNJWkU7ICsraSkgewotICAgIGludCBudW1fdGltZXNfY29ubmVjdGVkID0gcGltcGxfLT5oZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9jb3VudHNfW2ldOwotICAgIGlmIChIZWFkc2V0UHJvZmlsZVR5cGVfSXNWYWxpZChpKSAmJiBudW1fdGltZXNfY29ubmVjdGVkID4gMCkgewotICAgICAgSGVhZHNldFByb2ZpbGVDb25uZWN0aW9uU3RhdHMqIGhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzID0KLSAgICAgICAgICBibHVldG9vdGhfbG9nLT5hZGRfaGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHMoKTsKLSAgICAgIC8vIEFibGUgdG8gc3RhdGljX2Nhc3QgYmVjYXVzZSBIZWFkc2V0UHJvZmlsZVR5cGVfSXNWYWxpZChpKSBpcyB0cnVlCi0gICAgICBoZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0cy0+c2V0X2hlYWRzZXRfcHJvZmlsZV90eXBlKAotICAgICAgICAgIHN0YXRpY19jYXN0PEhlYWRzZXRQcm9maWxlVHlwZT4oaSkpOwotICAgICAgaGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHMtPnNldF9udW1fdGltZXNfY29ubmVjdGVkKAotICAgICAgICAgIG51bV90aW1lc19jb25uZWN0ZWQpOwotICAgIH0KLSAgfQotICBwaW1wbF8tPmhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX2NvdW50c18uZmlsbCgwKTsKLX0KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpSZXNldFNlc3Npb24oKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhwaW1wbF8tPmJsdWV0b290aF9zZXNzaW9uX2xvY2tfKTsKLSAgaWYgKHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fICE9IG51bGxwdHIpIHsKLSAgICBkZWxldGUgcGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl87Ci0gICAgcGltcGxfLT5ibHVldG9vdGhfc2Vzc2lvbl8gPSBudWxscHRyOwotICB9Ci0gIHBpbXBsXy0+Ymx1ZXRvb3RoX3Nlc3Npb25fc3RhcnRfdGltZV9tc18gPSAwOwotICBwaW1wbF8tPmEyZHBfc2Vzc2lvbl9tZXRyaWNzXyA9IEEyZHBTZXNzaW9uTWV0cmljcygpOwotfQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OlJlc2V0TG9nKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2socGltcGxfLT5ibHVldG9vdGhfbG9nX2xvY2tfKTsKLSAgcGltcGxfLT5ibHVldG9vdGhfbG9nXy0+Q2xlYXIoKTsKLX0KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpSZXNldCgpIHsKLSAgUmVzZXRTZXNzaW9uKCk7Ci0gIFJlc2V0TG9nKCk7Ci0gIHBpbXBsXy0+YnRfc2Vzc2lvbl9xdWV1ZV8tPkNsZWFyKCk7Ci0gIHBpbXBsXy0+cGFpcl9ldmVudF9xdWV1ZV8tPkNsZWFyKCk7Ci0gIHBpbXBsXy0+d2FrZV9ldmVudF9xdWV1ZV8tPkNsZWFyKCk7Ci0gIHBpbXBsXy0+c2Nhbl9ldmVudF9xdWV1ZV8tPkNsZWFyKCk7Ci19Ci0KLXZvaWQgTG9nTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsaW5rX3R5cGUsIHVpbnQzMl90IGhjaV9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSkgewotICBzdGQ6OnN0cmluZyBvYmZ1c2NhdGVkX2lkOwotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKGFkZHJlc3MgIT0gbnVsbHB0cikgewotICAgIG9iZnVzY2F0ZWRfaWQgPSBBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+T2JmdXNjYXRlKCphZGRyZXNzKTsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKCphZGRyZXNzKTsKLSAgfQotICAvLyBudWxscHRyIGFuZCBzaXplIDAgcmVwcmVzZW50IG1pc3NpbmcgdmFsdWUgZm9yIG9iZnVzY2F0ZWRfaWQKLSAgQnl0ZXNGaWVsZCBieXRlc19maWVsZChhZGRyZXNzICE9IG51bGxwdHIgPyBvYmZ1c2NhdGVkX2lkLmNfc3RyKCkgOiBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgIT0gbnVsbHB0ciA/IG9iZnVzY2F0ZWRfaWQuc2l6ZSgpIDogMCk7Ci0gIGludCByZXQgPQotICAgICAgc3RhdHNfd3JpdGUoQkxVRVRPT1RIX0xJTktfTEFZRVJfQ09OTkVDVElPTl9FVkVOVCwgYnl0ZXNfZmllbGQsCi0gICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX2hhbmRsZSwgZGlyZWN0aW9uLCBsaW5rX3R5cGUsIGhjaV9jbWQsIGhjaV9ldmVudCwKLSAgICAgICAgICAgICAgICAgIGhjaV9ibGVfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgdG8gbG9nIHN0YXR1cyAiIDw8IGxvZ2hleChjbWRfc3RhdHVzKQotICAgICAgICAgICAgICAgICA8PCAiLCByZWFzb24gIiA8PCBsb2doZXgocmVhc29uX2NvZGUpIDw8ICIgZnJvbSBjbWQgIgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoaGNpX2NtZCkgPDwgIiwgZXZlbnQgIiA8PCBsb2doZXgoaGNpX2V2ZW50KQotICAgICAgICAgICAgICAgICA8PCAiLCBibGVfZXZlbnQgIiA8PCBsb2doZXgoaGNpX2JsZV9ldmVudCkgPDwgIiBmb3IgIgotICAgICAgICAgICAgICAgICA8PCBhZGRyZXNzIDw8ICIsIGhhbmRsZSAiIDw8IGNvbm5lY3Rpb25faGFuZGxlIDw8ICIsIHR5cGUgIgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgobGlua190eXBlKSA8PCAiLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ0hjaVRpbWVvdXRFdmVudCh1aW50MzJfdCBoY2lfY21kKSB7Ci0gIGludCByZXQgPSBzdGF0c193cml0ZShCTFVFVE9PVEhfSENJX1RJTUVPVVRfUkVQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihoY2lfY21kKSk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCBmb3Igb3Bjb2RlICIgPDwgbG9naGV4KGhjaV9jbWQpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yICIgPDwgcmV0OwotICB9Ci19Ci0KLXZvaWQgTG9nUmVtb3RlVmVyc2lvbkluZm8odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDhfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3VidmVyc2lvbikgewotICBpbnQgcmV0ID0gc3RhdHNfd3JpdGUoQkxVRVRPT1RIX1JFTU9URV9WRVJTSU9OX0lORk9fUkVQT1JURUQsIGhhbmRsZSwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1YnZlcnNpb24pOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yIGhhbmRsZSAiIDw8IGhhbmRsZSA8PCAiLCBzdGF0dXMgIgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoc3RhdHVzKSA8PCAiLCB2ZXJzaW9uICIgPDwgbG9naGV4KHZlcnNpb24pCi0gICAgICAgICAgICAgICAgIDw8ICIsIG1hbnVmYWN0dXJlcl9uYW1lICIgPDwgbG9naGV4KG1hbnVmYWN0dXJlcl9uYW1lKQotICAgICAgICAgICAgICAgICA8PCAiLCBzdWJ2ZXJzaW9uICIgPDwgbG9naGV4KHN1YnZlcnNpb24pIDw8ICIsIGVycm9yICIgPDwgcmV0OwotICB9Ci19Ci0KLXZvaWQgTG9nQTJkcEF1ZGlvVW5kZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX21pc3NpbmdfcGNtX2J5dGVzKSB7Ci0gIHN0ZDo6c3RyaW5nIG9iZnVzY2F0ZWRfaWQ7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgb2JmdXNjYXRlZF9pZCA9IEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoYWRkcmVzcyk7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZChhZGRyZXNzKTsKLSAgfQotICAvLyBudWxscHRyIGFuZCBzaXplIDAgcmVwcmVzZW50IG1pc3NpbmcgdmFsdWUgZm9yIG9iZnVzY2F0ZWRfaWQKLSAgQnl0ZXNGaWVsZCBieXRlc19maWVsZChhZGRyZXNzLklzRW1wdHkoKSA/IG51bGxwdHIgOiBvYmZ1c2NhdGVkX2lkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5Jc0VtcHR5KCkgPyAwIDogb2JmdXNjYXRlZF9pZC5zaXplKCkpOwotICBpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX25hbm9zID0gZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzICogMTAwMDAwMDsKLSAgaW50IHJldCA9Ci0gICAgICBzdGF0c193cml0ZShCTFVFVE9PVEhfQTJEUF9BVURJT19VTkRFUlJVTl9SRVBPUlRFRCwgYnl0ZXNfZmllbGQsCi0gICAgICAgICAgICAgICAgICBlbmNvZGluZ19pbnRlcnZhbF9uYW5vcywgbnVtX21pc3NpbmdfcGNtX2J5dGVzLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICA8PCAiLCBlbmNvZGluZ19pbnRlcnZhbF9uYW5vcyAiIDw8IGVuY29kaW5nX2ludGVydmFsX25hbm9zCi0gICAgICAgICAgICAgICAgIDw8ICIsIG51bV9taXNzaW5nX3BjbV9ieXRlcyAiIDw8IG51bV9taXNzaW5nX3BjbV9ieXRlcwotICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ0EyZHBBdWRpb092ZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcykgewotICBzdGQ6OnN0cmluZyBvYmZ1c2NhdGVkX2lkOwotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG9iZnVzY2F0ZWRfaWQgPSBBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+T2JmdXNjYXRlKGFkZHJlc3MpOwotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgLy8gbnVsbHB0ciBhbmQgc2l6ZSAwIHJlcHJlc2VudCBtaXNzaW5nIHZhbHVlIGZvciBvYmZ1c2NhdGVkX2lkCi0gIEJ5dGVzRmllbGQgYnl0ZXNfZmllbGQoYWRkcmVzcy5Jc0VtcHR5KCkgPyBudWxscHRyIDogb2JmdXNjYXRlZF9pZC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuSXNFbXB0eSgpID8gMCA6IG9iZnVzY2F0ZWRfaWQuc2l6ZSgpKTsKLSAgaW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9uYW5vcyA9IGVuY29kaW5nX2ludGVydmFsX21pbGxpcyAqIDEwMDAwMDA7Ci0gIGludCByZXQgPSBzdGF0c193cml0ZShCTFVFVE9PVEhfQTJEUF9BVURJT19PVkVSUlVOX1JFUE9SVEVELCBieXRlc19maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nX2ludGVydmFsX25hbm9zLCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsIG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgdG8gbG9nIGZvciAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgPDwgIiwgZW5jb2RpbmdfaW50ZXJ2YWxfbmFub3MgIiA8PCBlbmNvZGluZ19pbnRlcnZhbF9uYW5vcwotICAgICAgICAgICAgICAgICA8PCAiLCBudW1fZHJvcHBlZF9idWZmZXJzICIgPDwgbnVtX2Ryb3BwZWRfYnVmZmVycwotICAgICAgICAgICAgICAgICA8PCAiLCBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcyAiCi0gICAgICAgICAgICAgICAgIDw8IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzIDw8ICIsIG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMgIgotICAgICAgICAgICAgICAgICA8PCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzIDw8ICIsIGVycm9yICIgPDwgcmV0OwotICB9Ci19Ci0KLXZvaWQgTG9nQTJkcFBsYXliYWNrRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHBsYXliYWNrX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fY29kaW5nX21vZGUpIHsKLSAgc3RkOjpzdHJpbmcgb2JmdXNjYXRlZF9pZDsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmICghYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBvYmZ1c2NhdGVkX2lkID0gQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPk9iZnVzY2F0ZShhZGRyZXNzKTsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIC8vIG51bGxwdHIgYW5kIHNpemUgMCByZXByZXNlbnQgbWlzc2luZyB2YWx1ZSBmb3Igb2JmdXNjYXRlZF9pZAotICBCeXRlc0ZpZWxkIGJ5dGVzX2ZpZWxkKGFkZHJlc3MuSXNFbXB0eSgpID8gbnVsbHB0ciA6IG9iZnVzY2F0ZWRfaWQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLklzRW1wdHkoKSA/IDAgOiBvYmZ1c2NhdGVkX2lkLnNpemUoKSk7Ci0gIGludCByZXQgPSBzdGF0c193cml0ZShCTFVFVE9PVEhfQTJEUF9QTEFZQkFDS19TVEFURV9DSEFOR0VELCBieXRlc19maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrX3N0YXRlLCBhdWRpb19jb2RpbmdfbW9kZSwgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIHRvIGxvZyBmb3IgIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgIDw8ICIsIHBsYXliYWNrX3N0YXRlICIgPDwgcGxheWJhY2tfc3RhdGUKLSAgICAgICAgICAgICAgICAgPDwgIiwgYXVkaW9fY29kaW5nX21vZGUgIiA8PCBhdWRpb19jb2RpbmdfbW9kZSA8PCAiLCBlcnJvciAiCi0gICAgICAgICAgICAgICAgIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ1JlYWRSc3NpUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywgaW50OF90IHJzc2kpIHsKLSAgc3RkOjpzdHJpbmcgb2JmdXNjYXRlZF9pZDsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmICghYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBvYmZ1c2NhdGVkX2lkID0gQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPk9iZnVzY2F0ZShhZGRyZXNzKTsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIC8vIG51bGxwdHIgYW5kIHNpemUgMCByZXByZXNlbnQgbWlzc2luZyB2YWx1ZSBmb3Igb2JmdXNjYXRlZF9pZAotICBCeXRlc0ZpZWxkIGJ5dGVzX2ZpZWxkKGFkZHJlc3MuSXNFbXB0eSgpID8gbnVsbHB0ciA6IG9iZnVzY2F0ZWRfaWQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLklzRW1wdHkoKSA/IDAgOiBvYmZ1c2NhdGVkX2lkLnNpemUoKSk7Ci0gIGludCByZXQgPSBzdGF0c193cml0ZShCTFVFVE9PVEhfREVWSUNFX1JTU0lfUkVQT1JURUQsIGJ5dGVzX2ZpZWxkLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbWRfc3RhdHVzLCByc3NpLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yICIgPDwgYWRkcmVzcyA8PCAiLCBoYW5kbGUgIgotICAgICAgICAgICAgICAgICA8PCBoYW5kbGUgPDwgIiwgc3RhdHVzICIgPDwgbG9naGV4KGNtZF9zdGF0dXMpIDw8ICIsIHJzc2kgIgotICAgICAgICAgICAgICAgICA8PCByc3NpIDw8ICIgZEJtLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ1JlYWRGYWlsZWRDb250YWN0Q291bnRlclJlc3VsdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSB7Ci0gIHN0ZDo6c3RyaW5nIG9iZnVzY2F0ZWRfaWQ7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgb2JmdXNjYXRlZF9pZCA9IEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoYWRkcmVzcyk7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZChhZGRyZXNzKTsKLSAgfQotICAvLyBudWxscHRyIGFuZCBzaXplIDAgcmVwcmVzZW50IG1pc3NpbmcgdmFsdWUgZm9yIG9iZnVzY2F0ZWRfaWQKLSAgQnl0ZXNGaWVsZCBieXRlc19maWVsZChhZGRyZXNzLklzRW1wdHkoKSA/IG51bGxwdHIgOiBvYmZ1c2NhdGVkX2lkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5Jc0VtcHR5KCkgPyAwIDogb2JmdXNjYXRlZF9pZC5zaXplKCkpOwotICBpbnQgcmV0ID0KLSAgICAgIHN0YXRzX3dyaXRlKEJMVUVUT09USF9ERVZJQ0VfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUl9SRVBPUlRFRCwgYnl0ZXNfZmllbGQsCi0gICAgICAgICAgICAgICAgICBoYW5kbGUsIGNtZF9zdGF0dXMsIGZhaWxlZF9jb250YWN0X2NvdW50ZXIsIG1ldHJpY19pZCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCBmb3IgIiA8PCBhZGRyZXNzIDw8ICIsIGhhbmRsZSAiCi0gICAgICAgICAgICAgICAgIDw8IGhhbmRsZSA8PCAiLCBzdGF0dXMgIiA8PCBsb2doZXgoY21kX3N0YXR1cykKLSAgICAgICAgICAgICAgICAgPDwgIiwgZmFpbGVkX2NvbnRhY3RfY291bnRlciAiIDw8IGZhaWxlZF9jb250YWN0X2NvdW50ZXIKLSAgICAgICAgICAgICAgICAgPDwgIiBwYWNrZXRzLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCkgewotICBzdGQ6OnN0cmluZyBvYmZ1c2NhdGVkX2lkOwotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG9iZnVzY2F0ZWRfaWQgPSBBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+T2JmdXNjYXRlKGFkZHJlc3MpOwotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgLy8gbnVsbHB0ciBhbmQgc2l6ZSAwIHJlcHJlc2VudCBtaXNzaW5nIHZhbHVlIGZvciBvYmZ1c2NhdGVkX2lkCi0gIEJ5dGVzRmllbGQgYnl0ZXNfZmllbGQoYWRkcmVzcy5Jc0VtcHR5KCkgPyBudWxscHRyIDogb2JmdXNjYXRlZF9pZC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuSXNFbXB0eSgpID8gMCA6IG9iZnVzY2F0ZWRfaWQuc2l6ZSgpKTsKLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKEJMVUVUT09USF9ERVZJQ0VfVFhfUE9XRVJfTEVWRUxfUkVQT1JURUQsIGJ5dGVzX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBjbWRfc3RhdHVzLCB0cmFuc21pdF9wb3dlcl9sZXZlbCwgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIGZvciAiIDw8IGFkZHJlc3MgPDwgIiwgaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgPDwgaGFuZGxlIDw8ICIsIHN0YXR1cyAiIDw8IGxvZ2hleChjbWRfc3RhdHVzKQotICAgICAgICAgICAgICAgICA8PCAiLCB0cmFuc21pdF9wb3dlcl9sZXZlbCAiIDw8IHRyYW5zbWl0X3Bvd2VyX2xldmVsCi0gICAgICAgICAgICAgICAgIDw8ICIgcGFja2V0cywgZXJyb3IgIiA8PCByZXQ7Ci0gIH0KLX0KLQotdm9pZCBMb2dTbXBQYWlyaW5nRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzbXBfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc21wX2ZhaWxfcmVhc29uKSB7Ci0gIHN0ZDo6c3RyaW5nIG9iZnVzY2F0ZWRfaWQ7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgb2JmdXNjYXRlZF9pZCA9IEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoYWRkcmVzcyk7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZChhZGRyZXNzKTsKLSAgfQotICAvLyBudWxscHRyIGFuZCBzaXplIDAgcmVwcmVzZW50IG1pc3NpbmcgdmFsdWUgZm9yIG9iZnVzY2F0ZWRfaWQKLSAgQnl0ZXNGaWVsZCBvYmZ1c2NhdGVkX2lkX2ZpZWxkKAotICAgICAgYWRkcmVzcy5Jc0VtcHR5KCkgPyBudWxscHRyIDogb2JmdXNjYXRlZF9pZC5jX3N0cigpLAotICAgICAgYWRkcmVzcy5Jc0VtcHR5KCkgPyAwIDogb2JmdXNjYXRlZF9pZC5zaXplKCkpOwotICBpbnQgcmV0ID0KLSAgICAgIHN0YXRzX3dyaXRlKEJMVUVUT09USF9TTVBfUEFJUklOR19FVkVOVF9SRVBPUlRFRCwgb2JmdXNjYXRlZF9pZF9maWVsZCwKLSAgICAgICAgICAgICAgICAgIHNtcF9jbWQsIGRpcmVjdGlvbiwgc21wX2ZhaWxfcmVhc29uLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yICIgPDwgYWRkcmVzcyA8PCAiLCBzbXBfY21kICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHNtcF9jbWQpIDw8ICIsIGRpcmVjdGlvbiAiIDw8IGRpcmVjdGlvbgotICAgICAgICAgICAgICAgICA8PCAiLCBzbXBfZmFpbF9yZWFzb24gIiA8PCBsb2doZXgoc21wX2ZhaWxfcmVhc29uKQotICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ0NsYXNzaWNQYWlyaW5nRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBoY2lfY21kLCB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUsIGludDY0X3QgZXZlbnRfdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmcgb2JmdXNjYXRlZF9pZDsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmICghYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBvYmZ1c2NhdGVkX2lkID0gQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPk9iZnVzY2F0ZShhZGRyZXNzKTsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIC8vIG51bGxwdHIgYW5kIHNpemUgMCByZXByZXNlbnQgbWlzc2luZyB2YWx1ZSBmb3Igb2JmdXNjYXRlZF9pZAotICBCeXRlc0ZpZWxkIG9iZnVzY2F0ZWRfaWRfZmllbGQoCi0gICAgICBhZGRyZXNzLklzRW1wdHkoKSA/IG51bGxwdHIgOiBvYmZ1c2NhdGVkX2lkLmNfc3RyKCksCi0gICAgICBhZGRyZXNzLklzRW1wdHkoKSA/IDAgOiBvYmZ1c2NhdGVkX2lkLnNpemUoKSk7Ci0gIGludCByZXQgPSBzdGF0c193cml0ZShCTFVFVE9PVEhfQ0xBU1NJQ19QQUlSSU5HX0VWRU5UX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgb2JmdXNjYXRlZF9pZF9maWVsZCwgaGFuZGxlLCBoY2lfY21kLCBoY2lfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbWRfc3RhdHVzLCByZWFzb25fY29kZSwgZXZlbnRfdmFsdWUsIG1ldHJpY19pZCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCBmb3IgIiA8PCBhZGRyZXNzIDw8ICIsIGhhbmRsZSAiIDw8IGhhbmRsZSA8PCAiLCBoY2lfY21kICIgPDwgbG9naGV4KGhjaV9jbWQpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGhjaV9ldmVudCAiIDw8IGxvZ2hleChoY2lfZXZlbnQpIDw8ICIsIGNtZF9zdGF0dXMgIiA8PCBsb2doZXgoY21kX3N0YXR1cykgPDwgIiwgcmVhc29uICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHJlYXNvbl9jb2RlKSA8PCAiLCBldmVudF92YWx1ZSAiIDw8IGV2ZW50X3ZhbHVlIDw8ICIsIGVycm9yICIgPDwgcmV0OwotICB9Ci19Ci0KLXZvaWQgTG9nU2RwQXR0cmlidXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkgewotICBzdGQ6OnN0cmluZyBvYmZ1c2NhdGVkX2lkOwotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG9iZnVzY2F0ZWRfaWQgPSBBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+T2JmdXNjYXRlKGFkZHJlc3MpOwotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkQWxsb2NhdG9yOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgLy8gbnVsbHB0ciBhbmQgc2l6ZSAwIHJlcHJlc2VudCBtaXNzaW5nIHZhbHVlIGZvciBvYmZ1c2NhdGVkX2lkCi0gIEJ5dGVzRmllbGQgb2JmdXNjYXRlZF9pZF9maWVsZCgKLSAgICAgIGFkZHJlc3MuSXNFbXB0eSgpID8gbnVsbHB0ciA6IG9iZnVzY2F0ZWRfaWQuY19zdHIoKSwKLSAgICAgIGFkZHJlc3MuSXNFbXB0eSgpID8gMCA6IG9iZnVzY2F0ZWRfaWQuc2l6ZSgpKTsKLSAgQnl0ZXNGaWVsZCBhdHRyaWJ1dGVfZmllbGQoYXR0cmlidXRlX3ZhbHVlLCBhdHRyaWJ1dGVfc2l6ZSk7Ci0gIGludCByZXQgPQotICAgICAgc3RhdHNfd3JpdGUoQkxVRVRPT1RIX1NEUF9BVFRSSUJVVEVfUkVQT1JURUQsIG9iZnVzY2F0ZWRfaWRfZmllbGQsCi0gICAgICAgICAgICAgICAgICBwcm90b2NvbF91dWlkLCBhdHRyaWJ1dGVfaWQsIGF0dHJpYnV0ZV9maWVsZCwgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIGZvciAiIDw8IGFkZHJlc3MgPDwgIiwgcHJvdG9jb2xfdXVpZCAiCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChwcm90b2NvbF91dWlkKSA8PCAiLCBhdHRyaWJ1dGVfaWQgIgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoYXR0cmlidXRlX2lkKSA8PCAiLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi12b2lkIExvZ1NvY2tldENvbm5lY3Rpb25TdGF0ZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgcG9ydCwgaW50IHR5cGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgaW50NjRfdCB0eF9ieXRlcywgaW50NjRfdCByeF9ieXRlcywgaW50IHVpZCwgaW50IHNlcnZlcl9wb3J0LAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Um9sZUVudW0gc29ja2V0X3JvbGUpIHsKLSAgc3RkOjpzdHJpbmcgb2JmdXNjYXRlZF9pZDsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmICghYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBvYmZ1c2NhdGVkX2lkID0gQWRkcmVzc09iZnVzY2F0b3I6OkdldEluc3RhbmNlKCktPk9iZnVzY2F0ZShhZGRyZXNzKTsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIC8vIG51bGxwdHIgYW5kIHNpemUgMCByZXByZXNlbnQgbWlzc2luZyB2YWx1ZSBmb3Igb2JmdXNjYXRlZF9pZAotICBCeXRlc0ZpZWxkIG9iZnVzY2F0ZWRfaWRfZmllbGQoCi0gICAgICBhZGRyZXNzLklzRW1wdHkoKSA/IG51bGxwdHIgOiBvYmZ1c2NhdGVkX2lkLmNfc3RyKCksCi0gICAgICBhZGRyZXNzLklzRW1wdHkoKSA/IDAgOiBvYmZ1c2NhdGVkX2lkLnNpemUoKSk7Ci0gIGludCByZXQgPQotICAgICAgc3RhdHNfd3JpdGUoQkxVRVRPT1RIX1NPQ0tFVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICAgICAgICBvYmZ1c2NhdGVkX2lkX2ZpZWxkLCBwb3J0LCB0eXBlLCBjb25uZWN0aW9uX3N0YXRlLCB0eF9ieXRlcywKLSAgICAgICAgICAgICAgICAgIHJ4X2J5dGVzLCB1aWQsIHNlcnZlcl9wb3J0LCBzb2NrZXRfcm9sZSwgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIGZvciAiIDw8IGFkZHJlc3MgPDwgIiwgcG9ydCAiIDw8IHBvcnQKLSAgICAgICAgICAgICAgICAgPDwgIiwgdHlwZSAiIDw8IHR5cGUgPDwgIiwgc3RhdGUgIiA8PCBjb25uZWN0aW9uX3N0YXRlCi0gICAgICAgICAgICAgICAgIDw8ICIsIHR4X2J5dGVzICIgPDwgdHhfYnl0ZXMgPDwgIiwgcnhfYnl0ZXMgIiA8PCByeF9ieXRlcwotICAgICAgICAgICAgICAgICA8PCAiLCB1aWQgIiA8PCB1aWQgPDwgIiwgc2VydmVyX3BvcnQgIiA8PCBzZXJ2ZXJfcG9ydAotICAgICAgICAgICAgICAgICA8PCAiLCBzb2NrZXRfcm9sZSAiIDw8IHNvY2tldF9yb2xlIDw8ICIsIGVycm9yICIgPDwgcmV0OwotICB9Ci19Ci0KLXZvaWQgTG9nTWFudWZhY3R1cmVySW5mbyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7Ci0gIHN0ZDo6c3RyaW5nIG9iZnVzY2F0ZWRfaWQ7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgb2JmdXNjYXRlZF9pZCA9IEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoYWRkcmVzcyk7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZChhZGRyZXNzKTsKLSAgfQotICAvLyBudWxscHRyIGFuZCBzaXplIDAgcmVwcmVzZW50IG1pc3NpbmcgdmFsdWUgZm9yIG9iZnVzY2F0ZWRfaWQKLSAgQnl0ZXNGaWVsZCBvYmZ1c2NhdGVkX2lkX2ZpZWxkKAotICAgICAgYWRkcmVzcy5Jc0VtcHR5KCkgPyBudWxscHRyIDogb2JmdXNjYXRlZF9pZC5jX3N0cigpLAotICAgICAgYWRkcmVzcy5Jc0VtcHR5KCkgPyAwIDogb2JmdXNjYXRlZF9pZC5zaXplKCkpOwotICBpbnQgcmV0ID0gc3RhdHNfd3JpdGUoQkxVRVRPT1RIX0RFVklDRV9JTkZPX1JFUE9SVEVELCBvYmZ1c2NhdGVkX2lkX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3R5cGUsIHNvdXJjZV9uYW1lLmNfc3RyKCksIG1hbnVmYWN0dXJlci5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuY19zdHIoKSwgaGFyZHdhcmVfdmVyc2lvbi5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc29mdHdhcmVfdmVyc2lvbi5jX3N0cigpLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yICIgPDwgYWRkcmVzcyA8PCAiLCBzb3VyY2VfdHlwZSAiCi0gICAgICAgICAgICAgICAgIDw8IHNvdXJjZV90eXBlIDw8ICIsIHNvdXJjZV9uYW1lICIgPDwgc291cmNlX25hbWUKLSAgICAgICAgICAgICAgICAgPDwgIiwgbWFudWZhY3R1cmVyICIgPDwgbWFudWZhY3R1cmVyIDw8ICIsIG1vZGVsICIgPDwgbW9kZWwKLSAgICAgICAgICAgICAgICAgPDwgIiwgaGFyZHdhcmVfdmVyc2lvbiAiIDw8IGhhcmR3YXJlX3ZlcnNpb24KLSAgICAgICAgICAgICAgICAgPDwgIiwgc29mdHdhcmVfdmVyc2lvbiAiIDw8IHNvZnR3YXJlX3ZlcnNpb24gPDwgIiwgZXJyb3IgIgotICAgICAgICAgICAgICAgICA8PCByZXQ7Ci0gIH0KLX0KLQotdm9pZCBMb2dCbHVldG9vdGhIYWxDcmFzaFJlYXNvbihjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MzJfdCBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZW5kb3JfZXJyb3JfY29kZSkgewotICBzdGQ6OnN0cmluZyBvYmZ1c2NhdGVkX2lkOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgb2JmdXNjYXRlZF9pZCA9IEFkZHJlc3NPYmZ1c2NhdG9yOjpHZXRJbnN0YW5jZSgpLT5PYmZ1c2NhdGUoYWRkcmVzcyk7Ci0gIH0KLSAgLy8gbnVsbHB0ciBhbmQgc2l6ZSAwIHJlcHJlc2VudCBtaXNzaW5nIHZhbHVlIGZvciBvYmZ1c2NhdGVkX2lkCi0gIEJ5dGVzRmllbGQgb2JmdXNjYXRlZF9pZF9maWVsZCgKLSAgICAgIGFkZHJlc3MuSXNFbXB0eSgpID8gbnVsbHB0ciA6IG9iZnVzY2F0ZWRfaWQuY19zdHIoKSwKLSAgICAgIGFkZHJlc3MuSXNFbXB0eSgpID8gMCA6IG9iZnVzY2F0ZWRfaWQuc2l6ZSgpKTsKLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKEJMVUVUT09USF9IQUxfQ1JBU0hfUkVBU09OX1JFUE9SVEVELCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JmdXNjYXRlZF9pZF9maWVsZCwgZXJyb3JfY29kZSwgdmVuZG9yX2Vycm9yX2NvZGUpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZm9yICIgPDwgYWRkcmVzcyA8PCAiLCBlcnJvcl9jb2RlICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGVycm9yX2NvZGUpIDw8ICIsIHZlbmRvcl9lcnJvcl9jb2RlICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHZlbmRvcl9lcnJvcl9jb2RlKSA8PCAiLCBlcnJvciAiIDw8IHJldDsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2NvbW1vbi9tZXRyaWNzLmggYi9jb21tb24vbWV0cmljcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI0NzM0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9tZXRyaWNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJ0YS9pbmNsdWRlL2J0YV9hcGkuaD4KLSNpbmNsdWRlIDxmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoL2VudW1zLnBiLmg+Ci0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9oY2kvZW51bXMucGIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8vIFR5cGVkZWZzIHRvIGhpZGUgcHJvdG9idWYgZGVmaW5pdGlvbiB0byB0aGUgcmVzdCBvZiBzdGFjawotCi10eXBlZGVmIGVudW0gewotICBERVZJQ0VfVFlQRV9VTktOT1dOLAotICBERVZJQ0VfVFlQRV9CUkVEUiwKLSAgREVWSUNFX1RZUEVfTEUsCi0gIERFVklDRV9UWVBFX0RVTU8sCi19IGRldmljZV90eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFdBS0VfRVZFTlRfVU5LTk9XTiwKLSAgV0FLRV9FVkVOVF9BQ1FVSVJFRCwKLSAgV0FLRV9FVkVOVF9SRUxFQVNFRCwKLX0gd2FrZV9ldmVudF90eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFNDQU5fVFlQRV9VTktOT1dOLAotICBTQ0FOX1RFQ0hfVFlQRV9MRSwKLSAgU0NBTl9URUNIX1RZUEVfQlJFRFIsCi0gIFNDQU5fVEVDSF9UWVBFX0JPVEgsCi19IHNjYW5fdGVjaF90OwotCi10eXBlZGVmIGVudW0gewotICBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9VTktOT1dOLAotICBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9MRSwKLSAgQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi19IGNvbm5lY3Rpb25fdGVjaF90OwotCi10eXBlZGVmIGVudW0gewotICBESVNDT05ORUNUX1JFQVNPTl9VTktOT1dOLAotICBESVNDT05ORUNUX1JFQVNPTl9NRVRSSUNTX0RVTVAsCi0gIERJU0NPTk5FQ1RfUkVBU09OX05FWFRfU1RBUlRfV0lUSE9VVF9FTkRfUFJFVklPVVMsCi19IGRpc2Nvbm5lY3RfcmVhc29uX3Q7Ci0KLS8qIFZhbHVlcyBvZiBBMkRQIG1ldHJpY3MgdGhhdCB3ZSBjYXJlIGFib3V0Ci0gKgotICogICAgYXVkaW9fZHVyYXRpb25fbXMgOiBzdW0gb2YgYXVkaW8gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykuCi0gKiAgICBkZXZpY2VfY2xhc3M6IGRldmljZSBjbGFzcyBvZiB0aGUgcGFpcmVkIGRldmljZS4KLSAqICAgIG1lZGlhX3RpbWVyX21pbl9tcyA6IG1pbmltdW0gc2NoZWR1bGVkIHRpbWUgKGluIG1pbGxpc2Vjb25kcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBtZWRpYSB0aW1lci4KLSAqICAgIG1lZGlhX3RpbWVyX21heF9tczogbWF4aW11bSBzY2hlZHVsZWQgdGltZSAoaW4gbWlsbGlzZWNvbmRzKQotICogICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbWVkaWEgdGltZXIuCi0gKiAgICBtZWRpYV90aW1lcl9hdmdfbXM6IGF2ZXJhZ2Ugc2NoZWR1bGVkIHRpbWUgKGluIG1pbGxpc2Vjb25kcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG1lZGlhIHRpbWVyLgotICogICAgYnVmZmVyX292ZXJydW5zX21heF9jb3VudDogVE9ETyAtIG5vdCBjbGVhciB3aGF0IHRoaXMgaXMuCi0gKiAgICBidWZmZXJfb3ZlcnJ1bnNfdG90YWwgOiBudW1iZXIgb2YgdGltZXMgdGhlIG1lZGlhIGJ1ZmZlciB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBkYXRhIGhhcyBvdmVycnVuCi0gKiAgICBidWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2U6IFRPRE8gLSBub3QgY2xlYXIgd2hhdCB0aGlzIGlzLgotICogICAgYnVmZmVyX3VuZGVycnVuc19jb3VudDogbnVtYmVyIG9mIHRpbWVzIHRoZXJlIHdhcyBubyBlbm91Z2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIGRhdGEgdG8gYWRkIHRvIHRoZSBtZWRpYSBidWZmZXIuCi0gKiBOT1RFOiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGludmFsaWQKLSAqLwotY2xhc3MgQTJkcFNlc3Npb25NZXRyaWNzIHsKLSBwdWJsaWM6Ci0gIEEyZHBTZXNzaW9uTWV0cmljcygpIHt9Ci0KLSAgLyoKLSAgICogVXBkYXRlIHRoZSBtZXRyaWNzIHZhbHVlIGluIHRoZSBjdXJyZW50IG1ldHJpY3Mgb2JqZWN0IHVzaW5nIHRoZSBtZXRyaWNzCi0gICAqIG9iamVjdHMgc3VwcGxpZWQKLSAgICovCi0gIHZvaWQgVXBkYXRlKGNvbnN0IEEyZHBTZXNzaW9uTWV0cmljcyYgbWV0cmljcyk7Ci0KLSAgLyoKLSAgICogQ29tcGFyZSB3aGV0aGVyIHR3byBtZXRyaWNzIG9iamVjdHMgYXJlIGVxdWFsCi0gICAqLwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQTJkcFNlc3Npb25NZXRyaWNzJiByaHMpIGNvbnN0OwotCi0gIC8qCi0gICAqIEluaXRpYWxpemUgYWxsIHZhbHVlcyB0byAtMSB3aGljaCBpcyBpbnZhbGlkIGluIG9yZGVyIHRvIG1ha2UgYSBkaXN0aW5jdGlvbgotICAgKiBiZXR3ZWVuIDAgYW5kIGludmFsaWQgdmFsdWVzCi0gICAqLwotICBpbnQ2NF90IGF1ZGlvX2R1cmF0aW9uX21zID0gLTE7Ci0gIGludDMyX3QgbWVkaWFfdGltZXJfbWluX21zID0gLTE7Ci0gIGludDMyX3QgbWVkaWFfdGltZXJfbWF4X21zID0gLTE7Ci0gIGludDMyX3QgbWVkaWFfdGltZXJfYXZnX21zID0gLTE7Ci0gIGludDY0X3QgdG90YWxfc2NoZWR1bGluZ19jb3VudCA9IC0xOwotICBpbnQzMl90IGJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSAtMTsKLSAgaW50MzJfdCBidWZmZXJfb3ZlcnJ1bnNfdG90YWwgPSAtMTsKLSAgZmxvYXQgYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gLTE7Ci0gIGludDMyX3QgYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IC0xOwotICBpbnQ2NF90IGNvZGVjX2luZGV4ID0gLTE7Ci0gIGJvb2wgaXNfYTJkcF9vZmZsb2FkID0gZmFsc2U7Ci19OwotCi1jbGFzcyBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyKiBHZXRJbnN0YW5jZSgpIHsKLSAgICBzdGF0aWMgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlciogaW5zdGFuY2UgPSBuZXcgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcigpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qCi0gICAqIFJlY29yZCBhIHBhaXJpbmcgZXZlbnQKLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogICAgdGltZXN0YW1wX21zOiBVbml4IGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzCi0gICAqICAgIGRldmljZV9jbGFzczogY2xhc3Mgb2YgcmVtb3RlIGRldmljZQotICAgKiAgICBkZXZpY2VfdHlwZTogdHlwZSBvZiByZW1vdGUgZGV2aWNlCi0gICAqICAgIGRpc2Nvbm5lY3RfcmVhc29uOiBIQ0kgcmVhc29uIGZvciBwYWlyaW5nIGRpc2Nvbm5lY3Rpb24uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBTZWU6IHN0YWNrL2luY2x1ZGUvaGNpZGVmcy5oCi0gICAqLwotICB2b2lkIExvZ1BhaXJFdmVudCh1aW50MzJfdCBkaXNjb25uZWN0X3JlYXNvbiwgdWludDY0X3QgdGltZXN0YW1wX21zLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VfY2xhc3MsIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUpOwotCi0gIC8qCi0gICAqIFJlY29yZCBhIHdha2UgZXZlbnQKLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogICAgdGltZXN0YW1wX21zOiBVbml4IGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzCi0gICAqICAgIHR5cGU6IHdoZXRoZXIgaXQgd2FzIGFjcXVpcmVkIG9yIHJlbGVhc2VkCi0gICAqICAgIHJlcXVlc3RvcjogaWYgcHJvdmlkZWQgaXMgdGhlIHNlcnZpY2UgcmVxdWVzdGluZyB0aGUgd2FrZSBsb2NrCi0gICAqICAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSB3YWtlIGxvY2sgaGVsZAotICAgKi8KLSAgdm9pZCBMb2dXYWtlRXZlbnQod2FrZV9ldmVudF90eXBlX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlcXVlc3RvciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVpbnQ2NF90IHRpbWVzdGFtcF9tcyk7Ci0KLSAgLyoKLSAgICogUmVjb3JkIGEgc2NhbiBldmVudAotICAgKgotICAgKiBQYXJhbWV0ZXJzCi0gICAqICAgIHRpbWVzdGFtcF9tcyA6IFVuaXggZXBvY2ggdGltZSBpbiBtaWxsaXNlY29uZHMKLSAgICogICAgc3RhcnQgOiB0cnVlIGlmIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2NhbgotICAgKiAgICBpbml0aWF0b3I6IGEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBhcHAgc3RhcnRpbmcgdGhlIHNjYW4KLSAgICogICAgdHlwZTogd2hldGhlciB0aGUgc2NhbiByZXBvcnRzIEJSL0VEUiwgTEUsIG9yIGJvdGguCi0gICAqICAgIHJlc3VsdHM6IG51bWJlciBvZiByZXN1bHRzIHRvIGJlIHJlcG9ydGVkLgotICAgKi8KLSAgdm9pZCBMb2dTY2FuRXZlbnQoYm9vbCBzdGFydCwgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXRhdG9yLCBzY2FuX3RlY2hfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXN1bHRzLCB1aW50NjRfdCB0aW1lc3RhbXBfbXMpOwotCi0gIC8qCi0gICAqIFN0YXJ0IGxvZ2dpbmcgYSBCbHVldG9vdGggc2Vzc2lvbgotICAgKgotICAgKiBBIEJsdWV0b290aCBzZXNzaW9uIGlzIGRlZmluZWQgYSBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGlzIGRldmljZSBhbmQKLSAgICogYW5vdGhlciByZW1vdGUgZGV2aWNlIHdoaWNoIG1heSBpbmNsdWRlIG11bHRpcGxlIHByb2ZpbGVzIGFuZCBwcm90b2NvbHMKLSAgICoKLSAgICogT25seSBvbmUgQmx1ZXRvb3RoIHNlc3Npb24gY2FuIGV4aXN0IGF0IG9uZSB0aW1lLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlCi0gICAqIHdpdGhvdXQgTG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZCB3aWxsIHJlc3VsdCBpbiBsb2dnaW5nIGEgcHJlbWF0dXJlIGVuZCBvZgotICAgKiBjdXJyZW50IEJsdWV0b290aCBzZXNzaW9uCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqICAgIGNvbm5lY3Rpb25fdGVjaF90eXBlIDogdHlwZSBvZiBjb25uZWN0aW9uIHRlY2hub2xvZ3kKLSAgICogICAgdGltZXN0YW1wX21zIDogdGhlIHRpbWVzdGFtcCBmb3Igc2Vzc2lvbiBzdGFydCwgMCBtZWFucyBub3cKLSAgICoKLSAgICovCi0gIHZvaWQgTG9nQmx1ZXRvb3RoU2Vzc2lvblN0YXJ0KGNvbm5lY3Rpb25fdGVjaF90IGNvbm5lY3Rpb25fdGVjaF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfbXMpOwotCi0gIC8qCi0gICAqIFN0b3AgbG9nZ2luZyBhIEJsdWV0b290aCBzZXNzaW9uIGFuZCBwdXNoZXMgaXQgdG8gdGhlIGxvZyBxdWV1ZQotICAgKgotICAgKiBJZiBubyBCbHVldG9vdGggc2Vzc2lvbiBleGlzdCwgdGhpcyBtZXRob2QgZXhpdHMgaW1tZWRpYXRlbHkKLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogICAgZGlzY29ubmVjdF9yZWFzb24gOiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkaXNjb25uZWN0IHJlYXNvbgotICAgKiAgICB0aW1lc3RhbXBfbXMgOiB0aGUgdGltZXN0YW1wIG9mIHNlc3Npb24gZW5kLCAwIG1lYW5zIG5vdwotICAgKgotICAgKi8KLSAgdm9pZCBMb2dCbHVldG9vdGhTZXNzaW9uRW5kKGRpc2Nvbm5lY3RfcmVhc29uX3QgZGlzY29ubmVjdF9yZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfbXMpOwotCi0gIC8qCi0gICAqIExvZyBpbmZvcm1hdGlvbiBhYm91dCByZW1vdGUgZGV2aWNlIGluIGEgY3VycmVudCBCbHVldG9vdGggc2Vzc2lvbgotICAgKgotICAgKiBJZiBhIEJsdWV0b290aCBzZXNzaW9uIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgb25lIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXIKLSAgICogYW5kIHRpbWVzdGFtcCBub3cKLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogICAgZGV2aWNlX2NsYXNzIDogZGV2aWNlX2NsYXNzIGRlZmluZWQgaW4gYnRtX2FwaV90eXBlcy5oCi0gICAqICAgIGRldmljZV90eXBlIDogdHlwZSBvZiByZW1vdGUgZGV2aWNlCi0gICAqLwotICB2b2lkIExvZ0JsdWV0b290aFNlc3Npb25EZXZpY2VJbmZvKHVpbnQzMl90IGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfdHlwZV90IGRldmljZV90eXBlKTsKLQotICAvKgotICAgKiBMb2cgQTJEUCBBdWRpbyBTZXNzaW9uIEluZm9ybWF0aW9uCi0gICAqCi0gICAqIC0gUmVwZWF0ZWQgY2FsbHMgdG8gdGhpcyBtZXRob2Qgd2lsbCBvdmVycmlkZSBwcmV2aW91cyBtZXRyaWNzIGlmIGluIHRoZQotICAgKiAgIHNhbWUgQmx1ZXRvb3RoIGNvbm5lY3Rpb24KLSAgICogLSBJZiBhIEJsdWV0b290aCBzZXNzaW9uIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgb25lIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXIKLSAgICogICBhbmQgdGltZXN0YW1wIG5vdwotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAgICBhMmRwX3Nlc3Npb25fbWV0cmljcyAtIHBvaW50ZXIgdG8gc3RydWN0IGhvbGRpbmcgYTJkcCBzdGF0cwotICAgKgotICAgKi8KLSAgdm9pZCBMb2dBMmRwU2Vzc2lvbihjb25zdCBBMmRwU2Vzc2lvbk1ldHJpY3MmIGEyZHBfc2Vzc2lvbl9tZXRyaWNzKTsKLQotICAvKioKLSAgICogTG9nIEhlYWRzZXQgcHJvZmlsZSBSRkNPTU0gY29ubmVjdGlvbiBldmVudAotICAgKgotICAgKiBAcGFyYW0gc2VydmljZV9pZCB0aGUgQlRBIHNlcnZpY2UgSUQgZm9yIHRoaXMgaGVhZHNldCBjb25uZWN0aW9uCi0gICAqLwotICB2b2lkIExvZ0hlYWRzZXRQcm9maWxlUmZjQ29ubmVjdGlvbih0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCk7Ci0KLSAgLyoKLSAgICogV3JpdGVzIHRoZSBtZXRyaWNzLCBpbiBiYXNlNjQgcHJvdG9idWYgZm9ybWF0LCBpbnRvIHRoZSBkZXNjcmlwdG9yIEZELAotICAgKiBtZXRyaWNzIGV2ZW50cyBhcmUgYWx3YXlzIGNsZWFyZWQgYWZ0ZXIgZHVtcAotICAgKi8KLSAgdm9pZCBXcml0ZUJhc2U2NChpbnQgZmQpOwotICB2b2lkIFdyaXRlQmFzZTY0U3RyaW5nKHN0ZDo6c3RyaW5nKiBzZXJpYWxpemVkKTsKLSAgdm9pZCBXcml0ZVN0cmluZyhzdGQ6OnN0cmluZyogc2VyaWFsaXplZCk7Ci0KLSAgLyoKLSAgICogUmVzZXQgdGhlIG1ldHJpY3MgbG9nZ2VyIGJ5IGNsZWFuaW5nIHVwIGl0cyBzdGFnaW5nIHF1ZXVlcyBhbmQgZXhpc3RpbmcKLSAgICogcHJvdG9idWYgb2JqZWN0cy4KLSAgICovCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvKgotICAgKiBNYXhpbXVtIG51bWJlciBvZiBsb2cgZW50cmllcyBmb3IgZWFjaCBzZXNzaW9uIG9yIGV2ZW50Ci0gICAqLwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1CbHVldG9vdGhTZXNzaW9uID0gNTA7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE51bVBhaXJFdmVudCA9IDUwOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1XYWtlRXZlbnQgPSAxMDAwOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TY2FuRXZlbnQgPSA1MDsKLQotIHByaXZhdGU6Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXIoKTsKLQotICAvKgotICAgKiBXaGVuIGEgQmx1ZXRvb3RoIHNlc3Npb24gaXMgb24gYW5kIHRoZSB1c2VyIGluaXRpYXRlcyBhIG1ldHJpY3MgZHVtcCwgd2UKLSAgICogbmVlZCB0byBiZSBhYmxlIHRvIHVwbG9hZCB3aGF0ZXZlciB3ZSBoYXZlIGZpcnN0LiBUaGlzIG1ldGhvZCBicmVha3MgdGhlCi0gICAqIG9uZ29pbmcgQmx1ZXRvb3RoIHNlc3Npb24gaW50byB0d28gc2Vzc2lvbnMgd2l0aCB0aGUgcHJldmlvdXMgb25lIGxhYmVsZWQKLSAgICogYXMgIk1FVFJJQ1NfRFVNUCIgZm9yIHRoZSBkaXNjb25uZWN0IHJlYXNvbi4KLSAgICovCi0gIHZvaWQgQ3V0b2ZmU2Vzc2lvbigpOwotCi0gIC8qCi0gICAqIEJ1aWxkIHRoZSBpbnRlcm5hbCBtZXRyaWNzIG9iamVjdCB1c2luZyBpbmZvcm1hdGlvbiBnYXRoZXJlZAotICAgKi8KLSAgdm9pZCBCdWlsZCgpOwotCi0gIC8qCi0gICAqIFJlc2V0IG9iamVjdHMgcmVsYXRlZCB0byBjdXJyZW50IEJsdWV0b290aCBzZXNzaW9uCi0gICAqLwotICB2b2lkIFJlc2V0U2Vzc2lvbigpOwotCi0gIC8qCi0gICAqIFJlc2V0IHRoZSB1bmRlcmxpbmluZyBCbHVldG9vdGhMb2cgb2JqZWN0Ci0gICAqLwotICB2b2lkIFJlc2V0TG9nKCk7Ci0KLSAgLyoKLSAgICogUElNUEwgc3R5bGUgaW1wbGVtZW50YXRpb24gdG8gaGlkZSBpbnRlcm5hbCBkZXBlbmRlbmNpZXMKLSAgICovCi0gIHN0cnVjdCBpbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW1wbD4gY29uc3QgcGltcGxfOwotfTsKLQotLyoqCi0gKiBVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIGZvciBtZXRyaWNzIHB1cnBvc2UKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSA9IDB4RkZGRjsKLQotLyoqCi0gKiBMb2cgbGluayBsYXllciBjb25uZWN0aW9uIGV2ZW50Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgU3RhY2sgd2lkZSBjb25zaXN0ZW50IEJsdWV0b290aCBhZGRyZXNzIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVua25vd24KLSAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZSBjb25uZWN0aW9uIGhhbmRsZSBvZiB0aGlzIGV2ZW50LAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBkaXJlY3Rpb24gZGlyZWN0aW9uIG9mIHRoaXMgY29ubmVjdGlvbgotICogQHBhcmFtIGxpbmtfdHlwZSB0eXBlIG9mIHRoZSBsaW5rCi0gKiBAcGFyYW0gaGNpX2NtZCBIQ0kgY29tbWFuZCBvcGVjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSBoY2lfZXZlbnQgSENJIGV2ZW50IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQsIGlmIGFueQotICogQHBhcmFtIGhjaV9ibGVfZXZlbnQgSENJIEJMRSBldmVudCBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSBjbWRfc3RhdHVzIENvbW1hbmQgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSByZWFzb25fY29kZSBSZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCwgaWYgYW55Ci0gKi8KLXZvaWQgTG9nTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsaW5rX3R5cGUsIHVpbnQzMl90IGhjaV9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSk7Ci0KLS8qKgotICogTG9ncyB3aGVuIEJsdWV0b290aCBjb250cm9sbGVyIGZhaWxlZCB0byByZXBseSB3aXRoIGNvbW1hbmQgc3RhdHVzIHdpdGhpbgotICogYSB0aW1lb3V0IHBlcmlvZCBhZnRlciByZWNlaXZpbmcgYW4gSENJIGNvbW1hbmQgZnJvbSB0aGUgaG9zdAotICoKLSAqIEBwYXJhbSBoY2lfY21kIG9wY29kZSBvZiBIQ0kgY29tbWFuZCB0aGF0IGNhdXNlZCB0aGlzIHRpbWVvdXQKLSAqLwotdm9pZCBMb2dIY2lUaW1lb3V0RXZlbnQodWludDMyX3QgaGNpX2NtZCk7Ci0KLS8qKgotICogTG9ncyB3aGVuIHdlIHJlY2VpdmUgQmx1ZXRvb3RoIFJlYWQgUmVtb3RlIFZlcnNpb24gSW5mb3JtYXRpb24gQ29tcGxldGUKLSAqIEV2ZW50IGZyb20gdGhlIHJlbW90ZSBkZXZpY2UsIGFzIGRvY3VtZW50ZWQgYnkgdGhlIEJsdWV0b290aCBDb3JlIEhDSQotICogc3BlY2lmaWNhdGlvbgotICoKLSAqIFJlZmVyZW5jZTogNS4wIENvcmUgU3BlY2lmaWNhdGlvbiwgVm9sIDIsIFBhcnQgRSwgUGFnZSAxMTE4Ci0gKgotICogQHBhcmFtIGhhbmRsZSBoYW5kbGUgb2YgYXNzb2NpYXRlZCBBQ0wgY29ubmVjdGlvbgotICogQHBhcmFtIHN0YXR1cyBIQ0kgY29tbWFuZCBzdGF0dXMgb2YgdGhpcyBldmVudAotICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBjb2RlIGZyb20gcmVhZCByZW1vdGUgdmVyc2lvbiBjb21wbGV0ZSBldmVudAotICogQHBhcmFtIG1hbnVmYWN0dXJlcl9uYW1lIG1hbnVmYWN0dXJlciBjb2RlIGZyb20gcmVhZCByZW1vdGUgdmVyc2lvbiBjb21wbGV0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ci0gKiBAcGFyYW0gc3VidmVyc2lvbiBzdWJ2ZXJzaW9uIGNvZGUgZnJvbSByZWFkIHJlbW90ZSB2ZXJzaW9uIGNvbXBsZXRlIGV2ZW50Ci0gKi8KLXZvaWQgTG9nUmVtb3RlVmVyc2lvbkluZm8odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDhfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3VidmVyc2lvbik7Ci0KLS8qKgotICogTG9nIEEyRFAgYXVkaW8gYnVmZmVyIHVuZGVycnVuIGV2ZW50Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgQTJEUCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMgZW5jb2RpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcGFyYW0gbnVtX21pc3NpbmdfcGNtX2J5dGVzIG51bWJlciBvZiBQQ00gYnl0ZXMgdGhhdCBjYW5ub3QgYmUgcmVhZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2UKLSAqLwotdm9pZCBMb2dBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fbWlzc2luZ19wY21fYnl0ZXMpOwotCi0vKioKLSAqIExvZyBBMkRQIGF1ZGlvIGJ1ZmZlciBvdmVycnVuIGV2ZW50Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgQTJEUCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMgZW5jb2RpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcGFyYW0gbnVtX2Ryb3BwZWRfYnVmZmVycyBudW1iZXIgb2YgZW5jb2RlZCBidWZmZXJzIGRyb3BwZWQgZnJvbSBUeCBxdWV1ZQotICogQHBhcmFtIG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzIG51bWJlciBvZiBlbmNvZGVkIGZyYW1lcyBkcm9wcGVkIGZyb20gVHgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZQotICogQHBhcmFtIG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMgbnVtYmVyIG9mIGVuY29kZWQgYnl0ZXMgZHJvcHBlZCBmcm9tIFR4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZQotICovCi12b2lkIExvZ0EyZHBBdWRpb092ZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyk7Ci0KLS8qKgotICogTG9nIEEyRFAgcGxheWJhY2sgc3RhdGUgY2hhbmdlZCBldmVudAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIEEyRFAgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gcGxheWJhY2tfc3RhdGUgYXVkaW8gcGxheWJhY2sgc3RhdGUKLSAqIEBwYXJhbSBhdWRpb19jb2RpbmdfbW9kZSBhdWRpbyBjb2RlYyBlbmNvZGluZyBtb2RlCi0gKi8KLXZvaWQgTG9nQTJkcFBsYXliYWNrRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHBsYXliYWNrX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fY29kaW5nX21vZGUpOwotCi0vKioKLSAqIExvZyByZWFkIFJTU0kgcmVzdWx0Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBjbWRfc3RhdHVzIGNvbW1hbmQgc3RhdHVzIGZyb20gcmVhZCBSU1NJIGNvbW1hbmQKLSAqIEBwYXJhbSByc3NpIHJzc2kgdmFsdWUgaW4gZEJtCi0gKi8KLXZvaWQgTG9nUmVhZFJzc2lSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSk7Ci0KLS8qKgotICogTG9nIGZhaWxlZCBjb250YWN0IGNvdW50ZXIgcmVwb3J0Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBjbWRfc3RhdHVzIGNvbW1hbmQgc3RhdHVzIGZyb20gcmVhZCBmYWlsZWQgY29udGFjdCBjb3VudGVyIGNvbW1hbmQKLSAqIEBwYXJhbSBmYWlsZWRfY29udGFjdF9jb3VudGVyIE51bWJlciBvZiBjb25zZWN1dGl2ZSBmYWlsZWQgY29udGFjdHMgZm9yIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgSGFuZGxlCi0gKi8KLXZvaWQgTG9nUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotCi0vKioKLSAqIExvZyB0cmFuc21pdCBwb3dlciBsZXZlbCBmb3IgYSBwYXJ0aWN1bGFyIGRldmljZSBhZnRlciByZWFkCi0gKgotICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBjbWRfc3RhdHVzIGNvbW1hbmQgc3RhdHVzIGZyb20gcmVhZCBmYWlsZWQgY29udGFjdCBjb3VudGVyIGNvbW1hbmQKLSAqIEBwYXJhbSB0cmFuc21pdF9wb3dlcl9sZXZlbCB0cmFuc21pdCBwb3dlciBsZXZlbCBmb3IgY29ubmVjdGlvbiB0byB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCi0gKi8KLXZvaWQgTG9nUmVhZFR4UG93ZXJMZXZlbFJlc3VsdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKTsKLQotLyoqCi0gKiBMb2dzIHdoZW4gdGhlcmUgaXMgYW4gZXZlbnQgcmVsYXRlZCB0byBCbHVldG9vdGggU2VjdXJpdHkgTWFuYWdlciBQcm90b2NvbAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBkZXZpY2UKLSAqIEBwYXJhbSBzbXBfY21kIFNNUCBjb21tYW5kIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBkaXJlY3Rpb24gZGlyZWN0aW9uIG9mIHRoaXMgU01QIGNvbW1hbmQKLSAqIEBwYXJhbSBzbXBfZmFpbF9yZWFzb24gU01QIHBhaXJpbmcgZmFpbHVyZSByZWFzb24gY29kZSBmcm9tIFNNUCBzcGVjCi0gKi8KLXZvaWQgTG9nU21wUGFpcmluZ0V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNtcF9mYWlsX3JlYXNvbik7Ci0KLS8qKgotICogTG9ncyB0aGVyZSBpcyBhbiBldmVudCByZWxhdGVkIEJsdWV0b290aCBjbGFzc2ljIHBhaXJpbmcKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIGFzc29jaWF0ZWQgZGV2aWNlCi0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBoY2lfY21kIEhDSSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGNpX2V2ZW50IEhDSSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGNtZF9zdGF0dXMgQ29tbWFuZCBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSByZWFzb25fY29kZSBSZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGV2ZW50X3ZhbHVlIEEgc3RhdHVzIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBzcGVjaWZpYyBldmVudAotICovCi12b2lkIExvZ0NsYXNzaWNQYWlyaW5nRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBoY2lfY21kLCB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUsIGludDY0X3QgZXZlbnRfdmFsdWUpOwotCi0vKioKLSAqIExvZ3Mgd2hlbiBjZXJ0YWluIEJsdWV0b290aCBTRFAgYXR0cmlidXRlcyBhcmUgZGlzY292ZXJlZAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBkZXZpY2UKLSAqIEBwYXJhbSBwcm90b2NvbF91dWlkIDE2IGJpdCBwcm90b2NvbCBVVUlEIGZyb20gQmx1ZXRvb3RoIEFzc2lnbmVkIE51bWJlcnMKLSAqIEBwYXJhbSBhdHRyaWJ1dGVfaWQgMTYgYml0IGF0dHJpYnV0ZSBJRCBmcm9tIEJsdWV0b290aCBBc3NpZ25lZCBOdW1iZXJzCi0gKiBAcGFyYW0gYXR0cmlidXRlX3NpemUgc2l6ZSBvZiB0aGlzIGF0dHJpYnV0ZQotICogQHBhcmFtIGF0dHJpYnV0ZV92YWx1ZSBwb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgZGF0YSwgbXVzdCBiZSBsYXJnZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfc2l6ZQotICovCi12b2lkIExvZ1NkcEF0dHJpYnV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBwcm90b2NvbF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cmlidXRlX2lkLCBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdHRyaWJ1dGVfdmFsdWUpOwotCi0vKioKLSAqIExvZ3Mgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBCbHVldG9vdGggc29ja2V0IGNvbm5lY3Rpb24gc3RhdGUKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIGFzc29jaWF0ZWQgZGV2aWNlLCBlbXB0eSBpZiB0aGlzIGlzIGEgc2VydmVyIHBvcnQKLSAqIEBwYXJhbSBwb3J0IHBvcnQgb2YgdGhpcyBzb2NrZXQgY29ubmVjdGlvbgotICogQHBhcmFtIHR5cGUgdHlwZSBvZiBzb2NrZXQKLSAqIEBwYXJhbSBjb25uZWN0aW9uX3N0YXRlIHNvY2tldCBjb25uZWN0aW9uIHN0YXRlCi0gKiBAcGFyYW0gdHhfYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkCi0gKiBAcGFyYW0gcnhfYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkCi0gKiBAcGFyYW0gc2VydmVyX3BvcnQgc2VydmVyIHBvcnQgb2YgdGhpcyBzb2NrZXQsIGlmIGFueS4gV2hlbiBib3RoCi0gKiAgICAgICAgfHNlcnZlcl9wb3J0fCBhbmQgfHBvcnR8IGZpZWxkcyBhcmUgcG9wdWxhdGVkLCB8cG9ydHwgbXVzdCBiZSBzcGF3bmVkCi0gKiAgICAgICAgYnkgfHNlcnZlcl9wb3J0fAotICogQHBhcmFtIHNvY2tldF9yb2xlIHJvbGUgb2YgdGhpcyBzb2NrZXQsIHNlcnZlciBvciBjb25uZWN0aW9uCi0gKiBAcGFyYW0gdWlkIHNvY2tldCBvd25lcidzIHVpZAotICovCi12b2lkIExvZ1NvY2tldENvbm5lY3Rpb25TdGF0ZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgcG9ydCwgaW50IHR5cGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgaW50NjRfdCB0eF9ieXRlcywgaW50NjRfdCByeF9ieXRlcywgaW50IHVpZCwgaW50IHNlcnZlcl9wb3J0LAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Um9sZUVudW0gc29ja2V0X3JvbGUpOwotCi0vKioKLSAqIExvZ3Mgd2hlbiBhIEJsdWV0b290aCBkZXZpY2UncyBtYW51ZmFjdHVyZXIgaW5mb3JtYXRpb24gaXMgbGVhcm50Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgYWRkcmVzcyBvZiBhc3NvY2lhdGVkIGRldmljZQotICogQHBhcmFtIHNvdXJjZV90eXBlIHdoZXJlIGlzIHRoaXMgZGV2aWNlIGluZm8gb2J0YWluZWQgZnJvbQotICogQHBhcmFtIHNvdXJjZV9uYW1lIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLCBpbnRlcm5hbCBvciBleHRlcm5hbAotICogQHBhcmFtIG1hbnVmYWN0dXJlciBuYW1lIG9mIHRoZSBtYW51ZmFjdHVyZXIgb2YgdGhpcyBkZXZpY2UKLSAqIEBwYXJhbSBtb2RlbCBtb2RlbCBvZiB0aGlzIGRldmljZQotICogQHBhcmFtIGhhcmR3YXJlX3ZlcnNpb24gaGFyZHdhcmUgdmVyc2lvbiBvZiB0aGlzIGRldmljZQotICogQHBhcmFtIHNvZnR3YXJlX3ZlcnNpb24gc29mdHdhcmUgdmVyc2lvbiBvZiB0aGlzIGRldmljZQotICovCi12b2lkIExvZ01hbnVmYWN0dXJlckluZm8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaGFyZHdhcmVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbik7Ci0KLS8qKgotICogTG9ncyB3aGVuIHJlY2VpdmVkIEJsdWV0b290aCBIQUwgY3Jhc2ggcmVhc29uIHJlcG9ydC4KLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBjdXJyZW50IGNvbm5lY3RlZCBhZGRyZXNzLgotICogQHBhcmFtIGVycm9yX2NvZGUgdGhlIGNyYXNoIHJlYXNvbiBmcm9tIGJsdWV0b290aCBoYWwKLSAqIEBwYXJhbSB2ZW5kb3JfZXJyb3JfY29kZSB0aGUgdmVuZG9yIGNyYXNoIHJlYXNvbiBmcm9tIGJsdWV0b290aCBGaXJtd2FyZQotICovCi12b2lkIExvZ0JsdWV0b290aEhhbENyYXNoUmVhc29uKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQzMl90IGVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZlbmRvcl9lcnJvcl9jb2RlKTsKLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvY29tbW9uL21ldHJpY3NfbGludXguY2MgYi9jb21tb24vbWV0cmljc19saW51eC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjYWI0OS4uMDAwMDAwMAotLS0gYS9jb21tb24vbWV0cmljc19saW51eC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImxlYWt5X2JvbmRlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm1ldHJpY3MuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXZvaWQgQTJkcFNlc3Npb25NZXRyaWNzOjpVcGRhdGUoY29uc3QgQTJkcFNlc3Npb25NZXRyaWNzJiBtZXRyaWNzKSB7fQotCi1ib29sIEEyZHBTZXNzaW9uTWV0cmljczo6b3BlcmF0b3I9PShjb25zdCBBMmRwU2Vzc2lvbk1ldHJpY3MmIHJocykgY29uc3QgewotICBMT0coSU5GTykgPDwgIlVOSU1QTEVNRU5URUQiOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RydWN0IEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OmltcGwgewotICBpbXBsKHNpemVfdCBtYXhfYmx1ZXRvb3RoX3Nlc3Npb24sIHNpemVfdCBtYXhfcGFpcl9ldmVudCwKLSAgICAgICBzaXplX3QgbWF4X3dha2VfZXZlbnQsIHNpemVfdCBtYXhfc2Nhbl9ldmVudCkge30KLX07Ci0KLUJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkJsdWV0b290aE1ldHJpY3NMb2dnZXIoKQotICAgIDogcGltcGxfKG5ldyBpbXBsKGtNYXhOdW1CbHVldG9vdGhTZXNzaW9uLCBrTWF4TnVtUGFpckV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgIGtNYXhOdW1XYWtlRXZlbnQsIGtNYXhOdW1TY2FuRXZlbnQpKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ1BhaXJFdmVudCh1aW50MzJfdCBkaXNjb25uZWN0X3JlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUpIHt9Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nV2FrZUV2ZW50KHdha2VfZXZlbnRfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfbXMpIHt9Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nU2NhbkV2ZW50KGJvb2wgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3RlY2hfdCB0eXBlLCB1aW50MzJfdCByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wX21zKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0JsdWV0b290aFNlc3Npb25TdGFydCgKLSAgICBjb25uZWN0aW9uX3RlY2hfdCBjb25uZWN0aW9uX3RlY2hfdHlwZSwgdWludDY0X3QgdGltZXN0YW1wX21zKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0JsdWV0b290aFNlc3Npb25FbmQoCi0gICAgZGlzY29ubmVjdF9yZWFzb25fdCBkaXNjb25uZWN0X3JlYXNvbiwgdWludDY0X3QgdGltZXN0YW1wX21zKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0JsdWV0b290aFNlc3Npb25EZXZpY2VJbmZvKAotICAgIHVpbnQzMl90IGRldmljZV9jbGFzcywgZGV2aWNlX3R5cGVfdCBkZXZpY2VfdHlwZSkge30KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpMb2dBMmRwU2Vzc2lvbigKLSAgICBjb25zdCBBMmRwU2Vzc2lvbk1ldHJpY3MmIGEyZHBfc2Vzc2lvbl9tZXRyaWNzKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0hlYWRzZXRQcm9maWxlUmZjQ29ubmVjdGlvbigKLSAgICB0QlRBX1NFUlZJQ0VfSUQgc2VydmljZV9pZCkge30KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpXcml0ZVN0cmluZyhzdGQ6OnN0cmluZyogc2VyaWFsaXplZCkge30KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpXcml0ZUJhc2U2NFN0cmluZyhzdGQ6OnN0cmluZyogc2VyaWFsaXplZCkge30KLQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpXcml0ZUJhc2U2NChpbnQgZmQpIHt9Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6Q3V0b2ZmU2Vzc2lvbigpIHt9Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6QnVpbGQoKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OlJlc2V0U2Vzc2lvbigpIHt9Ci0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6UmVzZXRMb2coKSB7fQotCi12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OlJlc2V0KCkge30KLQotdm9pZCBMb2dDbGFzc2ljUGFpcmluZ0V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoY2lfY21kLCB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBldmVudF92YWx1ZSkge30KLQotdm9pZCBMb2dTb2NrZXRDb25uZWN0aW9uU3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHBvcnQsIGludCB0eXBlLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Q29ubmVjdGlvbnN0YXRlRW51bSBjb25uZWN0aW9uX3N0YXRlLAotICAgIGludDY0X3QgdHhfYnl0ZXMsIGludDY0X3QgcnhfYnl0ZXMsIGludCB1aWQsIGludCBzZXJ2ZXJfcG9ydCwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlKSB7fQotCi12b2lkIExvZ0hjaVRpbWVvdXRFdmVudCh1aW50MzJfdCBoY2lfY21kKSB7fQotCi12b2lkIExvZ0EyZHBBdWRpb1VuZGVycnVuRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9taXNzaW5nX3BjbV9ieXRlcykge30KLQotdm9pZCBMb2dBMmRwQXVkaW9PdmVycnVuRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMpIHt9Ci0KLXZvaWQgTG9nQTJkcFBsYXliYWNrRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHBsYXliYWNrX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fY29kaW5nX21vZGUpIHt9Ci0KLXZvaWQgTG9nQmx1ZXRvb3RoSGFsQ3Jhc2hSZWFzb24oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDMyX3QgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVuZG9yX2Vycm9yX2NvZGUpIHt9Ci0KLXZvaWQgTG9nUmVhZFJzc2lSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSkge30KLQotdm9pZCBMb2dSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcikge30KLQotdm9pZCBMb2dSZWFkVHhQb3dlckxldmVsUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpIHt9Ci0KLXZvaWQgTG9nUmVtb3RlVmVyc2lvbkluZm8odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDhfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3VidmVyc2lvbikge30KLQotdm9pZCBMb2dMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQoY29uc3QgUmF3QWRkcmVzcyogYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxpbmtfdHlwZSwgdWludDMyX3QgaGNpX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlKSB7fQotCi12b2lkIExvZ01hbnVmYWN0dXJlckluZm8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaGFyZHdhcmVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbikge30KLQotdm9pZCBMb2dTZHBBdHRyaWJ1dGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJpYnV0ZV9pZCwgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXR0cmlidXRlX3ZhbHVlKSB7fQotCi12b2lkIExvZ1NtcFBhaXJpbmdFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvY29tbW9uL21ldHJpY3NfdW5pdHRlc3QuY2MgYi9jb21tb24vbWV0cmljc191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2Yzg5Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vbWV0cmljc191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9oYXJkd2FyZS9idF9hdi5oPgotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL21ldHJpY3MvYmx1ZXRvb3RoLnBiLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJjb21tb24vdGltZV91dGlsLmgiCi0KLSNkZWZpbmUgQlRNX0NPRF9NQUpPUl9BVURJT19URVNUIDB4MDQKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6QTJkcFNlc3Npb25NZXRyaWNzOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkJsdWV0b290aE1ldHJpY3NMb2dnZXI7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6QTJEUFNlc3Npb247Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6QTJkcFNvdXJjZUNvZGVjOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OkJsdWV0b290aExvZzsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpCbHVldG9vdGhTZXNzaW9uOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OgotICAgIEJsdWV0b290aFNlc3Npb25fQ29ubmVjdGlvblRlY2hub2xvZ3lUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OgotICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGU7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6RGV2aWNlSW5mbzsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpEZXZpY2VJbmZvX0RldmljZVR5cGU7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6SGVhZHNldFByb2ZpbGVDb25uZWN0aW9uU3RhdHM7Ci11c2luZyBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bzo6SGVhZHNldFByb2ZpbGVUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OlBhaXJFdmVudDsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpSRkNvbW1TZXNzaW9uOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86OlNjYW5FdmVudDsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpTY2FuRXZlbnRfU2NhbkV2ZW50VHlwZTsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpTY2FuRXZlbnRfU2NhblRlY2hub2xvZ3lUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjptZXRyaWNzOjpCbHVldG9vdGhNZXRyaWNzUHJvdG86Oldha2VFdmVudDsKLXVzaW5nIGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvOjpXYWtlRXZlbnRfV2FrZUV2ZW50VHlwZTsKLQotbmFtZXNwYWNlIHsKLWNvbnN0IHNpemVfdCBrTWF4RXZlbnRHZW5lcmF0aW9uTGltaXQgPSA1MDAwOwotfQotCi1zdGF0aWMgdm9pZCBzbGVlcF9tcyhpbnQ2NF90IHQpIHsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModCkpOwotfQotCi1EZXZpY2VJbmZvKiBNYWtlRGV2aWNlSW5mbyhpbnQzMl90IGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUluZm9fRGV2aWNlVHlwZSBkZXZpY2VfdHlwZSkgewotICBEZXZpY2VJbmZvKiBpbmZvID0gbmV3IERldmljZUluZm8oKTsKLSAgaW5mby0+c2V0X2RldmljZV9jbGFzcyhkZXZpY2VfY2xhc3MpOwotICBpbmZvLT5zZXRfZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpOwotICByZXR1cm4gaW5mbzsKLX0KLQotUGFpckV2ZW50KiBNYWtlUGFpckV2ZW50KGludDMyX3QgZGlzY29ubmVjdF9yZWFzb24sIGludDY0X3QgdGltZXN0YW1wX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUluZm8qIGRldmljZV9pbmZvKSB7Ci0gIFBhaXJFdmVudCogZXZlbnQgPSBuZXcgUGFpckV2ZW50KCk7Ci0gIGV2ZW50LT5zZXRfZGlzY29ubmVjdF9yZWFzb24oZGlzY29ubmVjdF9yZWFzb24pOwotICBldmVudC0+c2V0X2V2ZW50X3RpbWVfbWlsbGlzKHRpbWVzdGFtcF9tcyk7Ci0gIGlmIChkZXZpY2VfaW5mbykgZXZlbnQtPnNldF9hbGxvY2F0ZWRfZGV2aWNlX3BhaXJlZF93aXRoKGRldmljZV9pbmZvKTsKLSAgcmV0dXJuIGV2ZW50OwotfQotCi1XYWtlRXZlbnQqIE1ha2VXYWtlRXZlbnQoV2FrZUV2ZW50X1dha2VFdmVudFR5cGUgZXZlbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcF9tcykgewotICBXYWtlRXZlbnQqIGV2ZW50ID0gbmV3IFdha2VFdmVudCgpOwotICBldmVudC0+c2V0X3dha2VfZXZlbnRfdHlwZShldmVudF90eXBlKTsKLSAgZXZlbnQtPnNldF9yZXF1ZXN0b3IocmVxdWVzdG9yKTsKLSAgZXZlbnQtPnNldF9uYW1lKG5hbWUpOwotICBldmVudC0+c2V0X2V2ZW50X3RpbWVfbWlsbGlzKHRpbWVzdGFtcF9tcyk7Ci0gIHJldHVybiBldmVudDsKLX0KLQotU2NhbkV2ZW50KiBNYWtlU2NhbkV2ZW50KFNjYW5FdmVudF9TY2FuRXZlbnRUeXBlIGV2ZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXRpYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTY2FuRXZlbnRfU2NhblRlY2hub2xvZ3lUeXBlIHRlY2hfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bV9yZXN1bHRzLCBpbnQ2NF90IHRpbWVzdGFtcF9tcykgewotICBTY2FuRXZlbnQqIGV2ZW50ID0gbmV3IFNjYW5FdmVudCgpOwotICBldmVudC0+c2V0X3NjYW5fZXZlbnRfdHlwZShldmVudF90eXBlKTsKLSAgZXZlbnQtPnNldF9pbml0aWF0b3IoaW5pdGlhdG9yKTsKLSAgZXZlbnQtPnNldF9zY2FuX3RlY2hub2xvZ3lfdHlwZSh0ZWNoX3R5cGUpOwotICBldmVudC0+c2V0X251bWJlcl9yZXN1bHRzKG51bV9yZXN1bHRzKTsKLSAgZXZlbnQtPnNldF9ldmVudF90aW1lX21pbGxpcyh0aW1lc3RhbXBfbXMpOwotICByZXR1cm4gZXZlbnQ7Ci19Ci0KLUEyRFBTZXNzaW9uKiBNYWtlQTJEUFNlc3Npb24oY29uc3QgQTJkcFNlc3Npb25NZXRyaWNzJiBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwU291cmNlQ29kZWMgc291cmNlX2NvZGVjKSB7Ci0gIEEyRFBTZXNzaW9uKiBzZXNzaW9uID0gbmV3IEEyRFBTZXNzaW9uKCk7Ci0gIHNlc3Npb24tPnNldF9tZWRpYV90aW1lcl9taW5fbWlsbGlzKG1ldHJpY3MubWVkaWFfdGltZXJfbWluX21zKTsKLSAgc2Vzc2lvbi0+c2V0X21lZGlhX3RpbWVyX21heF9taWxsaXMobWV0cmljcy5tZWRpYV90aW1lcl9tYXhfbXMpOwotICBzZXNzaW9uLT5zZXRfbWVkaWFfdGltZXJfYXZnX21pbGxpcyhtZXRyaWNzLm1lZGlhX3RpbWVyX2F2Z19tcyk7Ci0gIHNlc3Npb24tPnNldF9idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50KG1ldHJpY3MuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCk7Ci0gIHNlc3Npb24tPnNldF9idWZmZXJfb3ZlcnJ1bnNfdG90YWwobWV0cmljcy5idWZmZXJfb3ZlcnJ1bnNfdG90YWwpOwotICBzZXNzaW9uLT5zZXRfYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlKG1ldHJpY3MuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlKTsKLSAgc2Vzc2lvbi0+c2V0X2J1ZmZlcl91bmRlcnJ1bnNfY291bnQobWV0cmljcy5idWZmZXJfdW5kZXJydW5zX2NvdW50KTsKLSAgc2Vzc2lvbi0+c2V0X2F1ZGlvX2R1cmF0aW9uX21pbGxpcyhtZXRyaWNzLmF1ZGlvX2R1cmF0aW9uX21zKTsKLSAgc2Vzc2lvbi0+c2V0X3NvdXJjZV9jb2RlYyhzb3VyY2VfY29kZWMpOwotICBzZXNzaW9uLT5zZXRfaXNfYTJkcF9vZmZsb2FkKG1ldHJpY3MuaXNfYTJkcF9vZmZsb2FkKTsKLSAgcmV0dXJuIHNlc3Npb247Ci19Ci0KLUJsdWV0b290aFNlc3Npb24qIE1ha2VCbHVldG9vdGhTZXNzaW9uKAotICAgIGludDY0X3Qgc2Vzc2lvbl9kdXJhdGlvbl9zZWMsCi0gICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGUgY29ubl90eXBlLAotICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGUgZGlzY29ubmVjdF9yZWFzb24sCi0gICAgRGV2aWNlSW5mbyogZGV2aWNlX2luZm8sIFJGQ29tbVNlc3Npb24qIHJmY29tbV9zZXNzaW9uLAotICAgIEEyRFBTZXNzaW9uKiBhMmRwX3Nlc3Npb24pIHsKLSAgQmx1ZXRvb3RoU2Vzc2lvbiogc2Vzc2lvbiA9IG5ldyBCbHVldG9vdGhTZXNzaW9uKCk7Ci0gIGlmIChhMmRwX3Nlc3Npb24pIHNlc3Npb24tPnNldF9hbGxvY2F0ZWRfYTJkcF9zZXNzaW9uKGEyZHBfc2Vzc2lvbik7Ci0gIGlmIChyZmNvbW1fc2Vzc2lvbikgc2Vzc2lvbi0+c2V0X2FsbG9jYXRlZF9yZmNvbW1fc2Vzc2lvbihyZmNvbW1fc2Vzc2lvbik7Ci0gIGlmIChkZXZpY2VfaW5mbykgc2Vzc2lvbi0+c2V0X2FsbG9jYXRlZF9kZXZpY2VfY29ubmVjdGVkX3RvKGRldmljZV9pbmZvKTsKLSAgc2Vzc2lvbi0+c2V0X3Nlc3Npb25fZHVyYXRpb25fc2VjKHNlc3Npb25fZHVyYXRpb25fc2VjKTsKLSAgc2Vzc2lvbi0+c2V0X2Nvbm5lY3Rpb25fdGVjaG5vbG9neV90eXBlKGNvbm5fdHlwZSk7Ci0gIHNlc3Npb24tPnNldF9kaXNjb25uZWN0X3JlYXNvbl90eXBlKGRpc2Nvbm5lY3RfcmVhc29uKTsKLSAgcmV0dXJuIHNlc3Npb247Ci19Ci0KLUJsdWV0b290aExvZyogTWFrZUJsdWV0b290aExvZyhzdGQ6OnZlY3RvcjxCbHVldG9vdGhTZXNzaW9uKj4gYnRfc2Vzc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFpckV2ZW50Kj4gcGFpcl9ldmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8V2FrZUV2ZW50Kj4gd2FrZV9ldmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2NhbkV2ZW50Kj4gc2Nhbl9ldmVudHMpIHsKLSAgQmx1ZXRvb3RoTG9nKiBidF9sb2cgPSBuZXcgQmx1ZXRvb3RoTG9nKCk7Ci0gIGZvciAoQmx1ZXRvb3RoU2Vzc2lvbiogc2Vzc2lvbiA6IGJ0X3Nlc3Npb25zKSB7Ci0gICAgYnRfbG9nLT5tdXRhYmxlX3Nlc3Npb24oKS0+QWRkQWxsb2NhdGVkKHNlc3Npb24pOwotICB9Ci0gIGJ0X3Nlc3Npb25zLmNsZWFyKCk7Ci0gIGZvciAoUGFpckV2ZW50KiBldmVudCA6IHBhaXJfZXZlbnRzKSB7Ci0gICAgYnRfbG9nLT5tdXRhYmxlX3BhaXJfZXZlbnQoKS0+QWRkQWxsb2NhdGVkKGV2ZW50KTsKLSAgfQotICBwYWlyX2V2ZW50cy5jbGVhcigpOwotICBmb3IgKFdha2VFdmVudCogZXZlbnQgOiB3YWtlX2V2ZW50cykgewotICAgIGJ0X2xvZy0+bXV0YWJsZV93YWtlX2V2ZW50KCktPkFkZEFsbG9jYXRlZChldmVudCk7Ci0gIH0KLSAgd2FrZV9ldmVudHMuY2xlYXIoKTsKLSAgZm9yIChTY2FuRXZlbnQqIGV2ZW50IDogc2Nhbl9ldmVudHMpIHsKLSAgICBidF9sb2ctPm11dGFibGVfc2Nhbl9ldmVudCgpLT5BZGRBbGxvY2F0ZWQoZXZlbnQpOwotICB9Ci0gIHNjYW5fZXZlbnRzLmNsZWFyKCk7Ci0gIHJldHVybiBidF9sb2c7Ci19Ci0KLXZvaWQgR2VuZXJhdGVXYWtlRXZlbnRzKHNpemVfdCBzdGFydCwgc2l6ZV90IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFdha2VFdmVudCo+KiB3YWtlX2V2ZW50cykgewotICBmb3IgKHNpemVfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewotICAgIHdha2VfZXZlbnRzLT5wdXNoX2JhY2soTWFrZVdha2VFdmVudCgKLSAgICAgICAgaSAlIDIgPT0gMCA/IFdha2VFdmVudF9XYWtlRXZlbnRUeXBlOjpXYWtlRXZlbnRfV2FrZUV2ZW50VHlwZV9BQ1FVSVJFRAotICAgICAgICAgICAgICAgICAgIDogV2FrZUV2ZW50X1dha2VFdmVudFR5cGU6Oldha2VFdmVudF9XYWtlRXZlbnRUeXBlX1JFTEVBU0VELAotICAgICAgICAiVEVTVF9SRVEiLCAiVEVTVF9OQU1FIiwgaSkpOwotICB9Ci19Ci0KLSNkZWZpbmUgQ09NUEFSRV9BMkRQX01FVFJJQ1MoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRVhQRUNUX0VRKChhKS5hdWRpb19kdXJhdGlvbl9tcywgKGIpLmF1ZGlvX2R1cmF0aW9uX21zKTsgICAgICAgICAgICAgICAgIFwKLSAgICBFWFBFQ1RfRVEoKGEpLm1lZGlhX3RpbWVyX21pbl9tcywgKGIpLm1lZGlhX3RpbWVyX21pbl9tcyk7ICAgICAgICAgICAgICAgXAotICAgIEVYUEVDVF9FUSgoYSkubWVkaWFfdGltZXJfbWF4X21zLCAoYikubWVkaWFfdGltZXJfbWF4X21zKTsgICAgICAgICAgICAgICBcCi0gICAgRVhQRUNUX0VRKChhKS5tZWRpYV90aW1lcl9hdmdfbXMsIChiKS5tZWRpYV90aW1lcl9hdmdfbXMpOyAgICAgICAgICAgICAgIFwKLSAgICBFWFBFQ1RfRVEoKGEpLnRvdGFsX3NjaGVkdWxpbmdfY291bnQsIChiKS50b3RhbF9zY2hlZHVsaW5nX2NvdW50KTsgICAgICAgXAotICAgIEVYUEVDVF9FUSgoYSkuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCwgKGIpLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQpOyBcCi0gICAgRVhQRUNUX0VRKChhKS5idWZmZXJfb3ZlcnJ1bnNfdG90YWwsIChiKS5idWZmZXJfb3ZlcnJ1bnNfdG90YWwpOyAgICAgICAgIFwKLSAgICBFWFBFQ1RfVEhBVCgoYSkuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIEZsb2F0TmVhcigoYikuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlLCAwLjAxKSk7ICAgICAgICAgICAgICBcCi0gICAgKGEpLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IChiKS5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2U7ICAgICAgICAgICAgIFwKLSAgICBFWFBFQ1RfRVEoKGEpLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQsIChiKS5idWZmZXJfdW5kZXJydW5zX2NvdW50KTsgICAgICAgXAotICAgIEVYUEVDVF9FUSgoYSkuY29kZWNfaW5kZXgsIChiKS5jb2RlY19pbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRVhQRUNUX0VRKChhKS5pc19hMmRwX29mZmxvYWQsIChiKS5pc19hMmRwX29mZmxvYWQpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotLyoKLSAqIG1ldHJpY3Nfc3VtID0gbWV0cmljczEgKyBtZXRyaWNzMgotICovCi1URVNUKEJsdWV0b290aEEyRFBTZXNzaW9uTWV0cmljc1Rlc3QsIFRlc3RVcGRhdGVOb3JtYWwpIHsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MxOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczI7Ci0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzX3N1bTsKLSAgbWV0cmljczEuYXVkaW9fZHVyYXRpb25fbXMgPSAxMDsKLSAgbWV0cmljczIuYXVkaW9fZHVyYXRpb25fbXMgPSAyNTsKLSAgbWV0cmljc19zdW0uYXVkaW9fZHVyYXRpb25fbXMgPSAzNTsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfbWluX21zID0gMTA7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX21pbl9tcyA9IDI1OwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9taW5fbXMgPSAxMDsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfbWF4X21zID0gMTAwOwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9tYXhfbXMgPSAyMDA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX21heF9tcyA9IDIwMDsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfYXZnX21zID0gNTA7Ci0gIG1ldHJpY3MxLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSA1MDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfYXZnX21zID0gMTAwOwotICBtZXRyaWNzMi50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gNTA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDc1OwotICBtZXRyaWNzX3N1bS50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gMTAwOwotICBtZXRyaWNzMS5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gNzA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA4MDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDgwOwotICBtZXRyaWNzMS5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSA4MDsKLSAgbWV0cmljczEuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDEyMDA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDEzMDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDI0MDA7Ci0gIG1ldHJpY3Nfc3VtLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDExMy4zMzMzMzMzMzsKLSAgbWV0cmljc19zdW0uYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDM2MDA7Ci0gIG1ldHJpY3MxLmNvZGVjX2luZGV4ID0gLTE7Ci0gIG1ldHJpY3MyLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM7Ci0gIG1ldHJpY3Nfc3VtLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM7Ci0gIG1ldHJpY3MxLmlzX2EyZHBfb2ZmbG9hZCA9IGZhbHNlOwotICBtZXRyaWNzMi5pc19hMmRwX29mZmxvYWQgPSB0cnVlOwotICBtZXRyaWNzX3N1bS5pc19hMmRwX29mZmxvYWQgPSB0cnVlOwotICBtZXRyaWNzMS5VcGRhdGUobWV0cmljczIpOwotICBDT01QQVJFX0EyRFBfTUVUUklDUyhtZXRyaWNzMSwgbWV0cmljc19zdW0pOwotICBFWFBFQ1RfVFJVRShtZXRyaWNzMSA9PSBtZXRyaWNzX3N1bSk7Ci0gIEVYUEVDVF9FUShtZXRyaWNzMSwgbWV0cmljc19zdW0pOwotfQotCi1URVNUKEJsdWV0b290aEEyRFBTZXNzaW9uTWV0cmljc1Rlc3QsIFRlc3RVcGRhdGVOZXcpIHsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MxOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczI7Ci0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzX3N1bTsKLSAgbWV0cmljczIuYXVkaW9fZHVyYXRpb25fbXMgPSAyNTsKLSAgbWV0cmljc19zdW0uYXVkaW9fZHVyYXRpb25fbXMgPSAyNTsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfbWluX21zID0gMjU7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX21pbl9tcyA9IDI1OwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9tYXhfbXMgPSAyMDA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX21heF9tcyA9IDIwMDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfYXZnX21zID0gMTAwOwotICBtZXRyaWNzMi50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gNTA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDEwMDsKLSAgbWV0cmljc19zdW0udG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzMi5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gODA7Ci0gIG1ldHJpY3Nfc3VtLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA4MDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gMTMwOwotICBtZXRyaWNzMi5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMjQwMDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gMTMwOwotICBtZXRyaWNzX3N1bS5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMjQwMDsKLSAgbWV0cmljczIuY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFg7Ci0gIG1ldHJpY3Nfc3VtLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYOwotICBtZXRyaWNzMi5pc19hMmRwX29mZmxvYWQgPSB0cnVlOwotICBtZXRyaWNzX3N1bS5pc19hMmRwX29mZmxvYWQgPSB0cnVlOwotICBtZXRyaWNzMS5VcGRhdGUobWV0cmljczIpOwotICBDT01QQVJFX0EyRFBfTUVUUklDUyhtZXRyaWNzMSwgbWV0cmljc19zdW0pOwotICBFWFBFQ1RfVFJVRShtZXRyaWNzMSA9PSBtZXRyaWNzX3N1bSk7Ci0gIEVYUEVDVF9FUShtZXRyaWNzMSwgbWV0cmljc19zdW0pOwotfQotCi1URVNUKEJsdWV0b290aEEyRFBTZXNzaW9uTWV0cmljc1Rlc3QsIFRlc3ROdWxsVXBkYXRlKSB7Ci0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzMTsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MyOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljc19zdW07Ci0gIG1ldHJpY3MyLmF1ZGlvX2R1cmF0aW9uX21zID0gMjU7Ci0gIG1ldHJpY3Nfc3VtLmF1ZGlvX2R1cmF0aW9uX21zID0gMjU7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX21pbl9tcyA9IDI1OwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9taW5fbXMgPSAyNTsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfbWF4X21zID0gMjAwOwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9tYXhfbXMgPSAyMDA7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDEwMDsKLSAgbWV0cmljczIudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9hdmdfbXMgPSAxMDA7Ci0gIG1ldHJpY3Nfc3VtLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSA1MDsKLSAgbWV0cmljczIuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDgwOwotICBtZXRyaWNzX3N1bS5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gODA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDEzMDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDI0MDA7Ci0gIG1ldHJpY3Nfc3VtLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDEzMDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDI0MDA7Ci0gIG1ldHJpY3MyLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hEOwotICBtZXRyaWNzX3N1bS5jb2RlY19pbmRleCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRDsKLSAgbWV0cmljczIuaXNfYTJkcF9vZmZsb2FkID0gdHJ1ZTsKLSAgbWV0cmljc19zdW0uaXNfYTJkcF9vZmZsb2FkID0gdHJ1ZTsKLSAgbWV0cmljczIuVXBkYXRlKG1ldHJpY3MxKTsKLSAgQ09NUEFSRV9BMkRQX01FVFJJQ1MobWV0cmljczIsIG1ldHJpY3Nfc3VtKTsKLSAgRVhQRUNUX1RSVUUobWV0cmljczIgPT0gbWV0cmljc19zdW0pOwotICBFWFBFQ1RfRVEobWV0cmljczIsIG1ldHJpY3Nfc3VtKTsKLX0KLQotVEVTVChCbHVldG9vdGhBMkRQU2Vzc2lvbk1ldHJpY3NUZXN0LCBUZXN0UGFydGlhbFVwZGF0ZSkgewotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczE7Ci0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzMjsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3Nfc3VtOwotICBtZXRyaWNzMS5hdWRpb19kdXJhdGlvbl9tcyA9IDEwOwotICBtZXRyaWNzMi5hdWRpb19kdXJhdGlvbl9tcyA9IDI1OwotICBtZXRyaWNzX3N1bS5hdWRpb19kdXJhdGlvbl9tcyA9IDM1OwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9taW5fbXMgPSAxMDsKLSAgbWV0cmljc19zdW0ubWVkaWFfdGltZXJfbWluX21zID0gMTA7Ci0gIG1ldHJpY3MxLm1lZGlhX3RpbWVyX21heF9tcyA9IDEwMDsKLSAgbWV0cmljc19zdW0ubWVkaWFfdGltZXJfbWF4X21zID0gMTAwOwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9hdmdfbXMgPSA1MDsKLSAgbWV0cmljczEudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9hdmdfbXMgPSAxMDA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDUwOwotICBtZXRyaWNzX3N1bS50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gNTA7Ci0gIG1ldHJpY3MxLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA3MDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDcwOwotICBtZXRyaWNzMS5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSA4MDsKLSAgbWV0cmljczEuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDEyMDA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPSAyNDAwOwotICBtZXRyaWNzX3N1bS5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSA4MDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDEyMDA7Ci0gIG1ldHJpY3MxLlVwZGF0ZShtZXRyaWNzMik7Ci0gIENPTVBBUkVfQTJEUF9NRVRSSUNTKG1ldHJpY3MxLCBtZXRyaWNzX3N1bSk7Ci0gIEVYUEVDVF9UUlVFKG1ldHJpY3MxID09IG1ldHJpY3Nfc3VtKTsKLSAgRVhQRUNUX0VRKG1ldHJpY3MxLCBtZXRyaWNzX3N1bSk7Ci19Ci0KLWNsYXNzIEJsdWV0b290aE1ldHJpY3NMb2dnZXJUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gVXNlIHRvIGhvbGQgdGVzdCBwcm90b3MKLSAgc3RkOjp2ZWN0b3I8UGFpckV2ZW50Kj4gcGFpcl9ldmVudHNfOwotICBzdGQ6OnZlY3RvcjxXYWtlRXZlbnQqPiB3YWtlX2V2ZW50c187Ci0gIHN0ZDo6dmVjdG9yPFNjYW5FdmVudCo+IHNjYW5fZXZlbnRzXzsKLSAgc3RkOjp2ZWN0b3I8Qmx1ZXRvb3RoU2Vzc2lvbio+IGJ0X3Nlc3Npb25zXzsKLSAgaW50NjRfdCBudW1fcGFpcl9ldmVudF8gPSAwOwotICBpbnQ2NF90IG51bV93YWtlX2V2ZW50XyA9IDA7Ci0gIGludDY0X3QgbnVtX3NjYW5fZXZlbnRfID0gMDsKLSAgaW50NjRfdCBudW1fYnRfc2Vzc2lvbl8gPSAwOwotICBCbHVldG9vdGhMb2cqIGJ0X2xvZ187Ci0gIHN0ZDo6c3RyaW5nIGJ0X2xvZ19zdHJfOwotICBzdGQ6OnN0cmluZyBidF9sb2dfYXNjaWlfc3RyXzsKLQotICB2b2lkIFVwZGF0ZUxvZygpIHsKLSAgICBmb3IgKEJsdWV0b290aFNlc3Npb24qIHNlc3Npb24gOiBidF9zZXNzaW9uc18pIHsKLSAgICAgIGJ0X2xvZ18tPm11dGFibGVfc2Vzc2lvbigpLT5BZGRBbGxvY2F0ZWQoc2Vzc2lvbik7Ci0gICAgfQotICAgIGlmIChudW1fYnRfc2Vzc2lvbl8gPiAwKSB7Ci0gICAgICBidF9sb2dfLT5zZXRfbnVtX2JsdWV0b290aF9zZXNzaW9uKG51bV9idF9zZXNzaW9uXyk7Ci0gICAgfSBlbHNlIGlmIChidF9zZXNzaW9uc18uc2l6ZSgpID4gMCkgewotICAgICAgYnRfbG9nXy0+c2V0X251bV9ibHVldG9vdGhfc2Vzc2lvbihidF9zZXNzaW9uc18uc2l6ZSgpKTsKLSAgICB9Ci0gICAgYnRfc2Vzc2lvbnNfLmNsZWFyKCk7Ci0gICAgZm9yIChQYWlyRXZlbnQqIGV2ZW50IDogcGFpcl9ldmVudHNfKSB7Ci0gICAgICBidF9sb2dfLT5tdXRhYmxlX3BhaXJfZXZlbnQoKS0+QWRkQWxsb2NhdGVkKGV2ZW50KTsKLSAgICB9Ci0gICAgaWYgKG51bV9wYWlyX2V2ZW50XyA+IDApIHsKLSAgICAgIGJ0X2xvZ18tPnNldF9udW1fcGFpcl9ldmVudChudW1fcGFpcl9ldmVudF8pOwotICAgIH0gZWxzZSBpZiAocGFpcl9ldmVudHNfLnNpemUoKSA+IDApIHsKLSAgICAgIGJ0X2xvZ18tPnNldF9udW1fcGFpcl9ldmVudChwYWlyX2V2ZW50c18uc2l6ZSgpKTsKLSAgICB9Ci0gICAgcGFpcl9ldmVudHNfLmNsZWFyKCk7Ci0gICAgZm9yIChXYWtlRXZlbnQqIGV2ZW50IDogd2FrZV9ldmVudHNfKSB7Ci0gICAgICBidF9sb2dfLT5tdXRhYmxlX3dha2VfZXZlbnQoKS0+QWRkQWxsb2NhdGVkKGV2ZW50KTsKLSAgICB9Ci0gICAgaWYgKG51bV93YWtlX2V2ZW50XyA+IDApIHsKLSAgICAgIGJ0X2xvZ18tPnNldF9udW1fd2FrZV9ldmVudChudW1fd2FrZV9ldmVudF8pOwotICAgIH0gZWxzZSBpZiAod2FrZV9ldmVudHNfLnNpemUoKSA+IDApIHsKLSAgICAgIGJ0X2xvZ18tPnNldF9udW1fd2FrZV9ldmVudCh3YWtlX2V2ZW50c18uc2l6ZSgpKTsKLSAgICB9Ci0gICAgd2FrZV9ldmVudHNfLmNsZWFyKCk7Ci0gICAgZm9yIChTY2FuRXZlbnQqIGV2ZW50IDogc2Nhbl9ldmVudHNfKSB7Ci0gICAgICBidF9sb2dfLT5tdXRhYmxlX3NjYW5fZXZlbnQoKS0+QWRkQWxsb2NhdGVkKGV2ZW50KTsKLSAgICB9Ci0gICAgaWYgKG51bV9zY2FuX2V2ZW50XyA+IDApIHsKLSAgICAgIGJ0X2xvZ18tPnNldF9udW1fc2Nhbl9ldmVudChudW1fc2Nhbl9ldmVudF8pOwotICAgIH0gZWxzZSBpZiAoc2Nhbl9ldmVudHNfLnNpemUoKSA+IDApIHsKLSAgICAgIGJ0X2xvZ18tPnNldF9udW1fc2Nhbl9ldmVudChzY2FuX2V2ZW50c18uc2l6ZSgpKTsKLSAgICB9Ci0gICAgc2Nhbl9ldmVudHNfLmNsZWFyKCk7Ci0gICAgYnRfbG9nXy0+U2VyaWFsaXplVG9TdHJpbmcoJmJ0X2xvZ19zdHJfKTsKLSAgfQotCi0gIHZvaWQgQ2xlYXJMb2coKSB7Ci0gICAgZm9yIChCbHVldG9vdGhTZXNzaW9uKiBzZXNzaW9uIDogYnRfc2Vzc2lvbnNfKSB7Ci0gICAgICBzZXNzaW9uLT5DbGVhcigpOwotICAgICAgZGVsZXRlIHNlc3Npb247Ci0gICAgfQotICAgIGJ0X3Nlc3Npb25zXy5jbGVhcigpOwotICAgIGZvciAoUGFpckV2ZW50KiBldmVudCA6IHBhaXJfZXZlbnRzXykgewotICAgICAgZXZlbnQtPkNsZWFyKCk7Ci0gICAgICBkZWxldGUgZXZlbnQ7Ci0gICAgfQotICAgIHBhaXJfZXZlbnRzXy5jbGVhcigpOwotICAgIGZvciAoV2FrZUV2ZW50KiBldmVudCA6IHdha2VfZXZlbnRzXykgewotICAgICAgZXZlbnQtPkNsZWFyKCk7Ci0gICAgICBkZWxldGUgZXZlbnQ7Ci0gICAgfQotICAgIHdha2VfZXZlbnRzXy5jbGVhcigpOwotICAgIGZvciAoU2NhbkV2ZW50KiBldmVudCA6IHNjYW5fZXZlbnRzXykgewotICAgICAgZXZlbnQtPkNsZWFyKCk7Ci0gICAgICBkZWxldGUgZXZlbnQ7Ci0gICAgfQotICAgIHNjYW5fZXZlbnRzXy5jbGVhcigpOwotICAgIGJ0X2xvZ18tPkNsZWFyKCk7Ci0gIH0KLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGJ0X2xvZ18gPSBuZXcgQmx1ZXRvb3RoTG9nKCk7Ci0gICAgLy8gQ2xlYXIgZXhpc3RpbmcgbWV0cmljcyBlbnRyaWVzLCBpZiBhbnkKLSAgICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZXNldCgpOwotICB9Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgLy8gQ2xlYXIgcmVtYWluaW5nIG1ldHJpY3MgZW50cmllcywgaWYgYW55Ci0gICAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+UmVzZXQoKTsKLSAgICBDbGVhckxvZygpOwotICAgIGRlbGV0ZSBidF9sb2dfOwotICB9Ci0KLSBwdWJsaWM6Ci19OwotCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIFBhaXJFdmVudFRlc3QpIHsKLSAgcGFpcl9ldmVudHNfLnB1c2hfYmFjayhNYWtlUGFpckV2ZW50KAotICAgICAgMzUsIDEyMzQ1LAotICAgICAgTWFrZURldmljZUluZm8oCi0gICAgICAgICAgNDIsIERldmljZUluZm9fRGV2aWNlVHlwZTo6RGV2aWNlSW5mb19EZXZpY2VUeXBlX0RFVklDRV9UWVBFX0JSRURSKSkpOwotICBVcGRhdGVMb2coKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nUGFpckV2ZW50KAotICAgICAgMzUsIDEyMzQ1LCA0MiwgYmx1ZXRvb3RoOjpjb21tb246OkRFVklDRV9UWVBFX0JSRURSKTsKLSAgc3RkOjpzdHJpbmcgbXNnX3N0cjsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIFdha2VFdmVudFRlc3QpIHsKLSAgd2FrZV9ldmVudHNfLnB1c2hfYmFjaygKLSAgICAgIE1ha2VXYWtlRXZlbnQoV2FrZUV2ZW50X1dha2VFdmVudFR5cGU6Oldha2VFdmVudF9XYWtlRXZlbnRUeXBlX0FDUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAiVEVTVF9SRVEiLCAiVEVTVF9OQU1FIiwgMTIzNDUpKTsKLSAgVXBkYXRlTG9nKCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ1dha2VFdmVudCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpXQUtFX0VWRU5UX0FDUVVJUkVELCAiVEVTVF9SRVEiLCAiVEVTVF9OQU1FIiwgMTIzNDUpOwotICBzdGQ6OnN0cmluZyBtc2dfc3RyOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIEVYUEVDVF9USEFUKG1zZ19zdHIsIFN0ckVxKGJ0X2xvZ19zdHJfKSk7Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhNZXRyaWNzTG9nZ2VyVGVzdCwgV2FrZUV2ZW50T3ZlcnJ1blRlc3QpIHsKLSAgR2VuZXJhdGVXYWtlRXZlbnRzKAotICAgICAga01heEV2ZW50R2VuZXJhdGlvbkxpbWl0IC0gQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6a01heE51bVdha2VFdmVudCwKLSAgICAgIGtNYXhFdmVudEdlbmVyYXRpb25MaW1pdCwgJndha2VfZXZlbnRzXyk7Ci0gIG51bV93YWtlX2V2ZW50XyA9IGtNYXhFdmVudEdlbmVyYXRpb25MaW1pdDsKLSAgVXBkYXRlTG9nKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heEV2ZW50R2VuZXJhdGlvbkxpbWl0OyArK2kpIHsKLSAgICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dXYWtlRXZlbnQoCi0gICAgICAgIGkgJSAyID09IDAgPyBibHVldG9vdGg6OmNvbW1vbjo6V0FLRV9FVkVOVF9BQ1FVSVJFRAotICAgICAgICAgICAgICAgICAgIDogYmx1ZXRvb3RoOjpjb21tb246OldBS0VfRVZFTlRfUkVMRUFTRUQsCi0gICAgICAgICJURVNUX1JFUSIsICJURVNUX05BTUUiLCBpKTsKLSAgfQotICBzdGQ6OnN0cmluZyBtc2dfc3RyOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIEVYUEVDVF9USEFUKG1zZ19zdHIsIFN0ckVxKGJ0X2xvZ19zdHJfKSk7Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhNZXRyaWNzTG9nZ2VyVGVzdCwgU2NhbkV2ZW50VGVzdCkgewotICBzY2FuX2V2ZW50c18ucHVzaF9iYWNrKE1ha2VTY2FuRXZlbnQoCi0gICAgICBTY2FuRXZlbnRfU2NhbkV2ZW50VHlwZTo6U2NhbkV2ZW50X1NjYW5FdmVudFR5cGVfU0NBTl9FVkVOVF9TVE9QLAotICAgICAgIlRFU1RfSU5JVElBVE9SIiwKLSAgICAgIFNjYW5FdmVudF9TY2FuVGVjaG5vbG9neVR5cGU6OgotICAgICAgICAgIFNjYW5FdmVudF9TY2FuVGVjaG5vbG9neVR5cGVfU0NBTl9URUNIX1RZUEVfQlJFRFIsCi0gICAgICA0MiwgMTIzNDU2KSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dTY2FuRXZlbnQoCi0gICAgICBmYWxzZSwgIlRFU1RfSU5JVElBVE9SIiwgYmx1ZXRvb3RoOjpjb21tb246OlNDQU5fVEVDSF9UWVBFX0JSRURSLCA0MiwKLSAgICAgIDEyMzQ1Nik7Ci0gIHN0ZDo6c3RyaW5nIG1zZ19zdHI7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPldyaXRlU3RyaW5nKCZtc2dfc3RyKTsKLSAgRVhQRUNUX1RIQVQobXNnX3N0ciwgU3RyRXEoYnRfbG9nX3N0cl8pKTsKLX0KLQotVEVTVF9GKEJsdWV0b290aE1ldHJpY3NMb2dnZXJUZXN0LCBCbHVldG9vdGhTZXNzaW9uVGVzdCkgewotICBidF9zZXNzaW9uc18ucHVzaF9iYWNrKE1ha2VCbHVldG9vdGhTZXNzaW9uKAotICAgICAgMTAsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfTEUsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX1VOS05PV04sCi0gICAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyKSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6Q09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfTEUsIDEyMzQ1Nik7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25FbmQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6RElTQ09OTkVDVF9SRUFTT05fVU5LTk9XTiwgMTMzNDU2KTsKLSAgc3RkOjpzdHJpbmcgbXNnX3N0cjsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIEJsdWV0b290aFNlc3Npb25EdW1wQmVmb3JlRW5kVGVzdCkgewotICBidF9zZXNzaW9uc18ucHVzaF9iYWNrKE1ha2VCbHVldG9vdGhTZXNzaW9uKAotICAgICAgMSwKLSAgICAgIEJsdWV0b290aFNlc3Npb25fQ29ubmVjdGlvblRlY2hub2xvZ3lUeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZV9DT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9MRSwKLSAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGU6OgotICAgICAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGVfTUVUUklDU19EVU1QLAotICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpOwotICBVcGRhdGVMb2coKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQmx1ZXRvb3RoU2Vzc2lvblN0YXJ0KAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkNPTk5FQ1RJT05fVEVDSE5PTE9HWV9UWVBFX0xFLAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCkpOwotICBzbGVlcF9tcygxMDAwKTsKLSAgc3RkOjpzdHJpbmcgbXNnX3N0cjsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIEJsdWV0b290aFNlc3Npb25TdGFydEJlZm9yZUVuZFRlc3QpIHsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDEsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfVU5LTk9XTiwKLSAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGU6OgotICAgICAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGVfTkVYVF9TVEFSVF9XSVRIT1VUX0VORF9QUkVWSU9VUywKLSAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfTEUsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX01FVFJJQ1NfRFVNUCwKLSAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKLSAgVXBkYXRlTG9nKCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25TdGFydCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9VTktOT1dOLCAwKTsKLSAgc2xlZXBfbXMoMTAwMCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25TdGFydCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9MRSwgMCk7Ci0gIHNsZWVwX21zKDIwMDApOwotICBzdGQ6OnN0cmluZyBtc2dfc3RyOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIEVYUEVDVF9USEFUKG1zZ19zdHIsIFN0ckVxKGJ0X2xvZ19zdHJfKSk7Ci19Ci0KLS8qCi0gKiBUZXN0IENhc2U6IEEyRFBTZXNzaW9uVHdvVXBkYXRlc1Rlc3QKLSAqCi0gKiAxLiBDcmVhdGUgSW5zdGFuY2UKLSAqIDIuIExvZ0JsdWV0b290aFNlc3Npb25TdGFydAotICogMy4gTG9nQmx1ZXRvb3RoU2Vzc2lvbkRldmljZUluZm8KLSAqIDQuIExvZ0EyZHBTZXNzaW9uCi0gKiA1LiBMb2dBMmRwU2Vzc2lvbgotICogNi4gTG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZAotICogNy4gV3JpdGVTdHJpbmcKLSAqCi0gKi8KLVRFU1RfRihCbHVldG9vdGhNZXRyaWNzTG9nZ2VyVGVzdCwgQTJEUFNlc3Npb25Ud29VcGRhdGVzVGVzdCkgewotICAvKiBTYW1lIG1ldHJpY3MgZnJvbSBCbHVldG9vdGhBMkRQU2Vzc2lvbk1ldHJpY3NUZXN0LlRlc3RVcGRhdGVOb3JtYWwgKi8KLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MxOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczI7Ci0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzX3N1bTsKLSAgbWV0cmljczEuYXVkaW9fZHVyYXRpb25fbXMgPSAxMDsKLSAgbWV0cmljczIuYXVkaW9fZHVyYXRpb25fbXMgPSAyNTsKLSAgbWV0cmljc19zdW0uYXVkaW9fZHVyYXRpb25fbXMgPSAzNTsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfbWluX21zID0gMTA7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX21pbl9tcyA9IDI1OwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9taW5fbXMgPSAxMDsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfbWF4X21zID0gMTAwOwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9tYXhfbXMgPSAyMDA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX21heF9tcyA9IDIwMDsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfYXZnX21zID0gNTA7Ci0gIG1ldHJpY3MxLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSA1MDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfYXZnX21zID0gMTAwOwotICBtZXRyaWNzMi50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gNTA7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDc1OwotICBtZXRyaWNzX3N1bS50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gMTAwOwotICBtZXRyaWNzMS5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gNzA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA4MDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDgwOwotICBtZXRyaWNzMS5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSA4MDsKLSAgbWV0cmljczEuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDEyMDA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDEzMDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDI0MDA7Ci0gIG1ldHJpY3Nfc3VtLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDExMy4zMzMzMzMzMzsKLSAgbWV0cmljc19zdW0uYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDM2MDA7Ci0gIG1ldHJpY3MxLmNvZGVjX2luZGV4ID0gLTE7Ci0gIG1ldHJpY3MyLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM7Ci0gIG1ldHJpY3Nfc3VtLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM7Ci0gIG1ldHJpY3MxLmlzX2EyZHBfb2ZmbG9hZCA9IGZhbHNlOwotICBtZXRyaWNzMi5pc19hMmRwX29mZmxvYWQgPSB0cnVlOwotICBtZXRyaWNzX3N1bS5pc19hMmRwX29mZmxvYWQgPSB0cnVlOwotICBEZXZpY2VJbmZvKiBpbmZvID0gTWFrZURldmljZUluZm8oCi0gICAgICBCVE1fQ09EX01BSk9SX0FVRElPX1RFU1QsCi0gICAgICBEZXZpY2VJbmZvX0RldmljZVR5cGU6OkRldmljZUluZm9fRGV2aWNlVHlwZV9ERVZJQ0VfVFlQRV9CUkVEUik7Ci0gIEEyRFBTZXNzaW9uKiBzZXNzaW9uID0KLSAgICAgIE1ha2VBMkRQU2Vzc2lvbihtZXRyaWNzX3N1bSwgQTJkcFNvdXJjZUNvZGVjOjpBMkRQX1NPVVJDRV9DT0RFQ19BQUMpOwotICBidF9zZXNzaW9uc18ucHVzaF9iYWNrKE1ha2VCbHVldG9vdGhTZXNzaW9uKAotICAgICAgMTAsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX1VOS05PV04sCi0gICAgICBpbmZvLCBudWxscHRyLCBzZXNzaW9uKSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6Q09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsIDEyMzQ1Nik7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25EZXZpY2VJbmZvKAotICAgICAgQlRNX0NPRF9NQUpPUl9BVURJT19URVNULCBibHVldG9vdGg6OmNvbW1vbjo6REVWSUNFX1RZUEVfQlJFRFIpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dBMmRwU2Vzc2lvbihtZXRyaWNzMSk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0EyZHBTZXNzaW9uKG1ldHJpY3MyKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpESVNDT05ORUNUX1JFQVNPTl9VTktOT1dOLCAxMzM0NTYpOwotICBzdGQ6OnN0cmluZyBtc2dfc3RyOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIEVYUEVDVF9USEFUKG1zZ19zdHIsIFN0ckVxKGJ0X2xvZ19zdHJfKSk7Ci19Ci0KLS8qCi0gKiBUZXN0IENhc2U6IEEyRFBTZXNzaW9uVHdvVXBkYXRlc1NlcGFyYXRlZGJ5RHVtcFRlc3QKLSAqCi0gKiAxLiBDcmVhdGUgSW5zdGFuY2UKLSAqIDIuIExvZ0JsdWV0b290aFNlc3Npb25TdGFydAotICogMy4gTG9nQmx1ZXRvb3RoU2Vzc2lvbkRldmljZUluZm8KLSAqIDQuIExvZ0EyZHBTZXNzaW9uCi0gKiA1LiBXcml0ZVN0cmluZwotICogNi4gTG9nQTJkcFNlc3Npb24KLSAqIDcuIExvZ0JsdWV0b290aFNlc3Npb25FbmQKLSAqIDguIFdyaXRlU3RyaW5nCi0gKgotICovCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIEEyRFBTZXNzaW9uVHdvVXBkYXRlc1NlcGFyYXRlZGJ5RHVtcFRlc3QpIHsKLSAgLyogU2FtZSBtZXRyaWNzIGZyb20gQmx1ZXRvb3RoQTJEUFNlc3Npb25NZXRyaWNzVGVzdC5UZXN0VXBkYXRlTm9ybWFsICovCi0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzMTsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MyOwotICBtZXRyaWNzMS5hdWRpb19kdXJhdGlvbl9tcyA9IDEwOwotICBtZXRyaWNzMi5hdWRpb19kdXJhdGlvbl9tcyA9IDI1OwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9taW5fbXMgPSAxMDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfbWluX21zID0gMjU7Ci0gIG1ldHJpY3MxLm1lZGlhX3RpbWVyX21heF9tcyA9IDEwMDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfbWF4X21zID0gMjAwOwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9hdmdfbXMgPSA1MDsKLSAgbWV0cmljczEudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9hdmdfbXMgPSAxMDA7Ci0gIG1ldHJpY3MyLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSA1MDsKLSAgbWV0cmljczEuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDcwOwotICBtZXRyaWNzMi5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gODA7Ci0gIG1ldHJpY3MxLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDgwOwotICBtZXRyaWNzMS5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMTIwMDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gMTMwOwotICBtZXRyaWNzMi5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMjQwMDsKLSAgbWV0cmljczEuY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzsKLSAgbWV0cmljczIuY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzsKLSAgRGV2aWNlSW5mbyogaW5mbyA9IE1ha2VEZXZpY2VJbmZvKAotICAgICAgQlRNX0NPRF9NQUpPUl9BVURJT19URVNULAotICAgICAgRGV2aWNlSW5mb19EZXZpY2VUeXBlOjpEZXZpY2VJbmZvX0RldmljZVR5cGVfREVWSUNFX1RZUEVfQlJFRFIpOwotICBBMkRQU2Vzc2lvbiogc2Vzc2lvbiA9Ci0gICAgICBNYWtlQTJEUFNlc3Npb24obWV0cmljczEsIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfU0JDKTsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDEsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX01FVFJJQ1NfRFVNUCwKLSAgICAgIGluZm8sIG51bGxwdHIsIHNlc3Npb24pKTsKLSAgVXBkYXRlTG9nKCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25TdGFydCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9CUkVEUiwgMCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25EZXZpY2VJbmZvKAotICAgICAgQlRNX0NPRF9NQUpPUl9BVURJT19URVNULCBibHVldG9vdGg6OmNvbW1vbjo6REVWSUNFX1RZUEVfQlJFRFIpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dBMmRwU2Vzc2lvbihtZXRyaWNzMSk7Ci0gIHNsZWVwX21zKDEwMDApOwotICBzdGQ6OnN0cmluZyBtc2dfc3RyOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIEVYUEVDVF9USEFUKG1zZ19zdHIsIFN0ckVxKGJ0X2xvZ19zdHJfKSk7Ci0gIENsZWFyTG9nKCk7Ci0gIGluZm8gPSBNYWtlRGV2aWNlSW5mbygKLSAgICAgIEJUTV9DT0RfTUFKT1JfQVVESU9fVEVTVCwKLSAgICAgIERldmljZUluZm9fRGV2aWNlVHlwZTo6RGV2aWNlSW5mb19EZXZpY2VUeXBlX0RFVklDRV9UWVBFX0JSRURSKTsKLSAgc2Vzc2lvbiA9IE1ha2VBMkRQU2Vzc2lvbihtZXRyaWNzMiwgQTJkcFNvdXJjZUNvZGVjOjpBMkRQX1NPVVJDRV9DT0RFQ19BQUMpOwotICBidF9zZXNzaW9uc18ucHVzaF9iYWNrKE1ha2VCbHVldG9vdGhTZXNzaW9uKAotICAgICAgMSwKLSAgICAgIEJsdWV0b290aFNlc3Npb25fQ29ubmVjdGlvblRlY2hub2xvZ3lUeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZV9DT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9CUkVEUiwKLSAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGU6OgotICAgICAgICAgIEJsdWV0b290aFNlc3Npb25fRGlzY29ubmVjdFJlYXNvblR5cGVfVU5LTk9XTiwKLSAgICAgIGluZm8sIG51bGxwdHIsIHNlc3Npb24pKTsKLSAgVXBkYXRlTG9nKCk7Ci0gIHNsZWVwX21zKDEwMDApOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dBMmRwU2Vzc2lvbihtZXRyaWNzMik7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25FbmQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6RElTQ09OTkVDVF9SRUFTT05fVU5LTk9XTiwgMCk7Ci0gIG1zZ19zdHIuY2xlYXIoKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotfQotCi0vKgotICogVGVzdCBDYXNlOiBBMkRQU2Vzc2lvblR3b1VwZGF0ZXNTZXBhcmF0ZWRieUVuZFRlc3QKLSAqCi0gKiAxLiBDcmVhdGUgSW5zdGFuY2UKLSAqIDIuIExvZ0JsdWV0b290aFNlc3Npb25TdGFydAotICogMy4gTG9nQTJkcFNlc3Npb24KLSAqIDQuIExvZ0JsdWV0b290aFNlc3Npb25FbmQKLSAqIDUuIExvZ0JsdWV0b290aFNlc3Npb25TdGFydAotICogNi4gTG9nQTJkcFNlc3Npb24KLSAqIDcuIExvZ0JsdWV0b290aFNlc3Npb25FbmQKLSAqIDguIFdyaXRlU3RyaW5nCi0gKgotICovCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIEEyRFBTZXNzaW9uVHdvVXBkYXRlc1NlcGFyYXRlZGJ5RW5kVGVzdCkgewotICAvKiBTYW1lIG1ldHJpY3MgZnJvbSBCbHVldG9vdGhBMkRQU2Vzc2lvbk1ldHJpY3NUZXN0LlRlc3RVcGRhdGVOb3JtYWwgKi8KLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MxOwotICBtZXRyaWNzMS5hdWRpb19kdXJhdGlvbl9tcyA9IDEwOwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9taW5fbXMgPSAxMDsKLSAgbWV0cmljczEubWVkaWFfdGltZXJfbWF4X21zID0gMTAwOwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9hdmdfbXMgPSA1MDsKLSAgbWV0cmljczEudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzMS5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gNzA7Ci0gIG1ldHJpY3MxLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDgwOwotICBtZXRyaWNzMS5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMTIwMDsKLSAgbWV0cmljczEuY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzsKLSAgRGV2aWNlSW5mbyogaW5mbyA9IE1ha2VEZXZpY2VJbmZvKAotICAgICAgQlRNX0NPRF9NQUpPUl9BVURJT19URVNULAotICAgICAgRGV2aWNlSW5mb19EZXZpY2VUeXBlOjpEZXZpY2VJbmZvX0RldmljZVR5cGVfREVWSUNFX1RZUEVfQlJFRFIpOwotICBBMkRQU2Vzc2lvbiogc2Vzc2lvbiA9Ci0gICAgICBNYWtlQTJEUFNlc3Npb24obWV0cmljczEsIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfU0JDKTsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDEsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX1VOS05PV04sCi0gICAgICBpbmZvLCBudWxscHRyLCBzZXNzaW9uKSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6Q09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsIDApOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uRGV2aWNlSW5mbygKLSAgICAgIEJUTV9DT0RfTUFKT1JfQVVESU9fVEVTVCwgYmx1ZXRvb3RoOjpjb21tb246OkRFVklDRV9UWVBFX0JSRURSKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQTJkcFNlc3Npb24obWV0cmljczEpOwotICBzbGVlcF9tcygxMDAwKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpESVNDT05ORUNUX1JFQVNPTl9VTktOT1dOLCAwKTsKLSAgc3RkOjpzdHJpbmcgbXNnX3N0cjsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotICBDbGVhckxvZygpOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczI7Ci0gIG1ldHJpY3MyLmF1ZGlvX2R1cmF0aW9uX21zID0gMjU7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX21pbl9tcyA9IDI1OwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9tYXhfbXMgPSAyMDA7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDEwMDsKLSAgbWV0cmljczIudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzMi5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gODA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDEzMDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDI0MDA7Ci0gIG1ldHJpY3MyLmNvZGVjX2luZGV4ID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM7Ci0gIHNlc3Npb24gPSBNYWtlQTJEUFNlc3Npb24obWV0cmljczIsIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfQUFDKTsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDEsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX1VOS05PV04sCi0gICAgICBudWxscHRyLCBudWxscHRyLCBzZXNzaW9uKSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6Q09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsIDApOwotICBzbGVlcF9tcygxMDAwKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQTJkcFNlc3Npb24obWV0cmljczIpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uRW5kKAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkRJU0NPTk5FQ1RfUkVBU09OX1VOS05PV04sIDApOwotICBtc2dfc3RyLmNsZWFyKCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPldyaXRlU3RyaW5nKCZtc2dfc3RyKTsKLSAgRVhQRUNUX1RIQVQobXNnX3N0ciwgU3RyRXEoYnRfbG9nX3N0cl8pKTsKLX0KLQotLyoKLSAqIFRlc3QgQ2FzZSAxOiBBMkRQU2Vzc2lvbk9ubHlUZXN0Ci0gKgotICogMS4gQ3JlYXRlIEluc3RhbmNlCi0gKiA0LiBMb2dBMmRwU2Vzc2lvbgotICogNS4gV3JpdGVTdHJpbmcKLSAqIDYuIExvZ0EyZHBTZXNzaW9uCi0gKiA4LiBXcml0ZVN0cmluZwotICoKLSAqLwotVEVTVF9GKEJsdWV0b290aE1ldHJpY3NMb2dnZXJUZXN0LCBBMkRQU2Vzc2lvbk9ubHlUZXN0KSB7Ci0gIC8qIFNhbWUgbWV0cmljcyBmcm9tIEJsdWV0b290aEEyRFBTZXNzaW9uTWV0cmljc1Rlc3QuVGVzdFVwZGF0ZU5vcm1hbCAqLwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljczE7Ci0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzMjsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3Nfc3VtOwotICBtZXRyaWNzMS5hdWRpb19kdXJhdGlvbl9tcyA9IDEwOwotICBtZXRyaWNzMi5hdWRpb19kdXJhdGlvbl9tcyA9IDI1OwotICBtZXRyaWNzX3N1bS5hdWRpb19kdXJhdGlvbl9tcyA9IDM1OwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9taW5fbXMgPSAxMDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfbWluX21zID0gMjU7Ci0gIG1ldHJpY3Nfc3VtLm1lZGlhX3RpbWVyX21pbl9tcyA9IDEwOwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9tYXhfbXMgPSAxMDA7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX21heF9tcyA9IDIwMDsKLSAgbWV0cmljc19zdW0ubWVkaWFfdGltZXJfbWF4X21zID0gMjAwOwotICBtZXRyaWNzMS5tZWRpYV90aW1lcl9hdmdfbXMgPSA1MDsKLSAgbWV0cmljczEudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9hdmdfbXMgPSAxMDA7Ci0gIG1ldHJpY3MyLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSA1MDsKLSAgbWV0cmljc19zdW0ubWVkaWFfdGltZXJfYXZnX21zID0gNzU7Ci0gIG1ldHJpY3Nfc3VtLnRvdGFsX3NjaGVkdWxpbmdfY291bnQgPSAxMDA7Ci0gIG1ldHJpY3MxLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA3MDsKLSAgbWV0cmljczIuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDgwOwotICBtZXRyaWNzX3N1bS5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gODA7Ci0gIG1ldHJpY3MxLmJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDgwOwotICBtZXRyaWNzMS5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMTIwMDsKLSAgbWV0cmljczIuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gMTMwOwotICBtZXRyaWNzMi5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMjQwMDsKLSAgbWV0cmljc19zdW0uYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gMTEzLjMzMzMzMzMzOwotICBtZXRyaWNzX3N1bS5idWZmZXJfdW5kZXJydW5zX2NvdW50ID0gMzYwMDsKLSAgbWV0cmljczEuY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzsKLSAgbWV0cmljczIuY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzsKLSAgbWV0cmljc19zdW0uY29kZWNfaW5kZXggPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzsKLSAgRGV2aWNlSW5mbyogaW5mbyA9IE1ha2VEZXZpY2VJbmZvKAotICAgICAgQlRNX0NPRF9NQUpPUl9BVURJT19URVNULAotICAgICAgRGV2aWNlSW5mb19EZXZpY2VUeXBlOjpEZXZpY2VJbmZvX0RldmljZVR5cGVfREVWSUNFX1RZUEVfQlJFRFIpOwotICBBMkRQU2Vzc2lvbiogc2Vzc2lvbiA9Ci0gICAgICBNYWtlQTJEUFNlc3Npb24obWV0cmljc19zdW0sIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfU0JDKTsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDEsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX01FVFJJQ1NfRFVNUCwKLSAgICAgIGluZm8sIG51bGxwdHIsIHNlc3Npb24pKTsKLSAgVXBkYXRlTG9nKCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0EyZHBTZXNzaW9uKG1ldHJpY3MxKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nQTJkcFNlc3Npb24obWV0cmljczIpOwotICBzbGVlcF9tcygxMDAwKTsKLSAgc3RkOjpzdHJpbmcgbXNnX3N0cjsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotfQotCi0vKgotICogVGVzdCBDYXNlOiBBMkRQU2Vzc2lvbkR1bXBCZWZvcmVUd29VcGRhdGVzVGVzdAotICoKLSAqIDEuIENyZWF0ZSBJbnN0YW5jZQotICogMi4gTG9nQmx1ZXRvb3RoU2Vzc2lvblN0YXJ0Ci0gKiAzLiBMb2dCbHVldG9vdGhTZXNzaW9uRGV2aWNlSW5mbwotICogNS4gV3JpdGVTdHJpbmcKLSAqIDYuIExvZ0EyZHBTZXNzaW9uCi0gKiA3LiBMb2dBMmRwU2Vzc2lvbgotICogOC4gTG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZAotICogOS4gV3JpdGVTdHJpbmcKLSAqCi0gKi8KLVRFU1RfRihCbHVldG9vdGhNZXRyaWNzTG9nZ2VyVGVzdCwgQTJEUFNlc3Npb25EdW1wQmVmb3JlVHdvVXBkYXRlc1Rlc3QpIHsKLSAgLyogU2FtZSBtZXRyaWNzIGZyb20gQmx1ZXRvb3RoQTJEUFNlc3Npb25NZXRyaWNzVGVzdC5UZXN0VXBkYXRlTm9ybWFsICovCi0gIEEyZHBTZXNzaW9uTWV0cmljcyBtZXRyaWNzMTsKLSAgQTJkcFNlc3Npb25NZXRyaWNzIG1ldHJpY3MyOwotICBBMmRwU2Vzc2lvbk1ldHJpY3MgbWV0cmljc19zdW07Ci0gIG1ldHJpY3MxLmF1ZGlvX2R1cmF0aW9uX21zID0gMTA7Ci0gIG1ldHJpY3MyLmF1ZGlvX2R1cmF0aW9uX21zID0gMjU7Ci0gIG1ldHJpY3Nfc3VtLmF1ZGlvX2R1cmF0aW9uX21zID0gMzU7Ci0gIG1ldHJpY3MxLm1lZGlhX3RpbWVyX21pbl9tcyA9IDEwOwotICBtZXRyaWNzMi5tZWRpYV90aW1lcl9taW5fbXMgPSAyNTsKLSAgbWV0cmljc19zdW0ubWVkaWFfdGltZXJfbWluX21zID0gMTA7Ci0gIG1ldHJpY3MxLm1lZGlhX3RpbWVyX21heF9tcyA9IDEwMDsKLSAgbWV0cmljczIubWVkaWFfdGltZXJfbWF4X21zID0gMjAwOwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9tYXhfbXMgPSAyMDA7Ci0gIG1ldHJpY3MxLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDUwOwotICBtZXRyaWNzMS50b3RhbF9zY2hlZHVsaW5nX2NvdW50ID0gNTA7Ci0gIG1ldHJpY3MyLm1lZGlhX3RpbWVyX2F2Z19tcyA9IDEwMDsKLSAgbWV0cmljczIudG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDUwOwotICBtZXRyaWNzX3N1bS5tZWRpYV90aW1lcl9hdmdfbXMgPSA3NTsKLSAgbWV0cmljc19zdW0udG90YWxfc2NoZWR1bGluZ19jb3VudCA9IDEwMDsKLSAgbWV0cmljczEuYnVmZmVyX292ZXJydW5zX21heF9jb3VudCA9IDcwOwotICBtZXRyaWNzMi5idWZmZXJfb3ZlcnJ1bnNfbWF4X2NvdW50ID0gODA7Ci0gIG1ldHJpY3Nfc3VtLmJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA4MDsKLSAgbWV0cmljczEuYnVmZmVyX3VuZGVycnVuc19hdmVyYWdlID0gODA7Ci0gIG1ldHJpY3MxLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPSAxMjAwOwotICBtZXRyaWNzMi5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSAxMzA7Ci0gIG1ldHJpY3MyLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPSAyNDAwOwotICBtZXRyaWNzX3N1bS5idWZmZXJfdW5kZXJydW5zX2F2ZXJhZ2UgPSAxMTMuMzMzMzMzMzM7Ci0gIG1ldHJpY3Nfc3VtLmJ1ZmZlcl91bmRlcnJ1bnNfY291bnQgPSAzNjAwOwotICBtZXRyaWNzMS5jb2RlY19pbmRleCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDOwotICBtZXRyaWNzMi5jb2RlY19pbmRleCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDOwotICBtZXRyaWNzX3N1bS5jb2RlY19pbmRleCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDOwotICBEZXZpY2VJbmZvKiBpbmZvID0gTWFrZURldmljZUluZm8oCi0gICAgICBCVE1fQ09EX01BSk9SX0FVRElPX1RFU1QsCi0gICAgICBEZXZpY2VJbmZvX0RldmljZVR5cGU6OkRldmljZUluZm9fRGV2aWNlVHlwZV9ERVZJQ0VfVFlQRV9CUkVEUik7Ci0gIGJ0X3Nlc3Npb25zXy5wdXNoX2JhY2soTWFrZUJsdWV0b290aFNlc3Npb24oCi0gICAgICAxLAotICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGU6OgotICAgICAgICAgIEJsdWV0b290aFNlc3Npb25fQ29ubmVjdGlvblRlY2hub2xvZ3lUeXBlX0NPTk5FQ1RJT05fVEVDSE5PTE9HWV9UWVBFX0JSRURSLAotICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9EaXNjb25uZWN0UmVhc29uVHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9EaXNjb25uZWN0UmVhc29uVHlwZV9NRVRSSUNTX0RVTVAsCi0gICAgICBpbmZvLCBudWxscHRyLCBudWxscHRyKSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uU3RhcnQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6Q09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsIDApOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dCbHVldG9vdGhTZXNzaW9uRGV2aWNlSW5mbygKLSAgICAgIEJUTV9DT0RfTUFKT1JfQVVESU9fVEVTVCwgYmx1ZXRvb3RoOjpjb21tb246OkRFVklDRV9UWVBFX0JSRURSKTsKLSAgc2xlZXBfbXMoMTAwMCk7Ci0gIHN0ZDo6c3RyaW5nIG1zZ19zdHI7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPldyaXRlU3RyaW5nKCZtc2dfc3RyKTsKLSAgRVhQRUNUX1RIQVQobXNnX3N0ciwgU3RyRXEoYnRfbG9nX3N0cl8pKTsKLSAgQ2xlYXJMb2coKTsKLSAgaW5mbyA9IE1ha2VEZXZpY2VJbmZvKAotICAgICAgQlRNX0NPRF9NQUpPUl9BVURJT19URVNULAotICAgICAgRGV2aWNlSW5mb19EZXZpY2VUeXBlOjpEZXZpY2VJbmZvX0RldmljZVR5cGVfREVWSUNFX1RZUEVfQlJFRFIpOwotICBBMkRQU2Vzc2lvbiogc2Vzc2lvbiA9Ci0gICAgICBNYWtlQTJEUFNlc3Npb24obWV0cmljc19zdW0sIEEyZHBTb3VyY2VDb2RlYzo6QTJEUF9TT1VSQ0VfQ09ERUNfU0JDKTsKLSAgYnRfc2Vzc2lvbnNfLnB1c2hfYmFjayhNYWtlQmx1ZXRvb3RoU2Vzc2lvbigKLSAgICAgIDEsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Nvbm5lY3Rpb25UZWNobm9sb2d5VHlwZTo6Ci0gICAgICAgICAgQmx1ZXRvb3RoU2Vzc2lvbl9Db25uZWN0aW9uVGVjaG5vbG9neVR5cGVfQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfQlJFRFIsCi0gICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlOjoKLSAgICAgICAgICBCbHVldG9vdGhTZXNzaW9uX0Rpc2Nvbm5lY3RSZWFzb25UeXBlX1VOS05PV04sCi0gICAgICBpbmZvLCBudWxscHRyLCBzZXNzaW9uKSk7Ci0gIFVwZGF0ZUxvZygpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dBMmRwU2Vzc2lvbihtZXRyaWNzMSk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0EyZHBTZXNzaW9uKG1ldHJpY3MyKTsKLSAgc2xlZXBfbXMoMTAwMCk7Ci0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ0JsdWV0b290aFNlc3Npb25FbmQoCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6RElTQ09OTkVDVF9SRUFTT05fVU5LTk9XTiwgMCk7Ci0gIG1zZ19zdHIuY2xlYXIoKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBFWFBFQ1RfVEhBVChtc2dfc3RyLCBTdHJFcShidF9sb2dfc3RyXykpOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIExvZ0hlYWRzZXRQcm9maWxlUmZjQ29ubmVjdGlvblRlc3QpIHsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nSGVhZHNldFByb2ZpbGVSZmNDb25uZWN0aW9uKAotICAgICAgQlRBX0hTUF9TRVJWSUNFX0lEKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nSGVhZHNldFByb2ZpbGVSZmNDb25uZWN0aW9uKAotICAgICAgQlRBX0hGUF9TRVJWSUNFX0lEKTsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+TG9nSGVhZHNldFByb2ZpbGVSZmNDb25uZWN0aW9uKAotICAgICAgQlRBX0hGUF9TRVJWSUNFX0lEKTsKLSAgc3RkOjpzdHJpbmcgbXNnX3N0cjsKLSAgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcoJm1zZ19zdHIpOwotICBCbHVldG9vdGhMb2cqIG1ldHJpY3MgPSBCbHVldG9vdGhMb2c6OmRlZmF1bHRfaW5zdGFuY2UoKS5OZXcoKTsKLSAgbWV0cmljcy0+UGFyc2VGcm9tU3RyaW5nKG1zZ19zdHIpOwotICBFWFBFQ1RfRVEobWV0cmljcy0+aGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHNfc2l6ZSgpLCAyKTsKLSAgYm9vbCBoZnBfY29ycmVjdCA9IGZhbHNlOwotICBib29sIGhzcF9jb3JyZWN0ID0gZmFsc2U7Ci0gIGZvciAoY29uc3QgSGVhZHNldFByb2ZpbGVDb25uZWN0aW9uU3RhdHMmIGhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzIDoKLSAgICAgICBtZXRyaWNzLT5oZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0cygpKSB7Ci0gICAgc3dpdGNoIChoZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0cy5oZWFkc2V0X3Byb2ZpbGVfdHlwZSgpKSB7Ci0gICAgICBjYXNlIEhlYWRzZXRQcm9maWxlVHlwZTo6SEZQOgotICAgICAgICBFWFBFQ1RfRVEoaGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHMubnVtX3RpbWVzX2Nvbm5lY3RlZCgpLCAyKTsKLSAgICAgICAgaGZwX2NvcnJlY3QgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSGVhZHNldFByb2ZpbGVUeXBlOjpIU1A6Ci0gICAgICAgIEVYUEVDVF9FUShoZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0cy5udW1fdGltZXNfY29ubmVjdGVkKCksIDEpOwotICAgICAgICBoc3BfY29ycmVjdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRkFJTCgpOwotICAgIH0KLSAgfQotICBFWFBFQ1RfVFJVRShoZnBfY29ycmVjdCk7Ci0gIEVYUEVDVF9UUlVFKGhzcF9jb3JyZWN0KTsKLSAgbWV0cmljcy0+Y2xlYXJfaGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHMoKTsKLSAgRVhQRUNUX0VRKG1ldHJpY3MtPmhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzX3NpemUoKSwgMCk7Ci0gIG1zZ19zdHIuY2xlYXIoKTsKLSAgLy8gVmVyaWZ5IHRoYXQgZHVtcCBhZnRlciBjbGVhbiB1cCByZXN1bHQgaW4gYW4gZW1wdHkgbGlzdAotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIG1ldHJpY3MtPlBhcnNlRnJvbVN0cmluZyhtc2dfc3RyKTsKLSAgRVhQRUNUX0VRKG1ldHJpY3MtPmhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzX3NpemUoKSwgMCk7Ci0gIGRlbGV0ZSBtZXRyaWNzOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoTWV0cmljc0xvZ2dlclRlc3QsIExvZ0hlYWRzZXRQcm9maWxlUmZjQ29ubmVjdGlvbkVycm9yVGVzdCkgewotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dIZWFkc2V0UHJvZmlsZVJmY0Nvbm5lY3Rpb24oCi0gICAgICBCVEFfSFNQX1NFUlZJQ0VfSUQpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dIZWFkc2V0UHJvZmlsZVJmY0Nvbm5lY3Rpb24oCi0gICAgICBCVEFfSEZQX1NFUlZJQ0VfSUQpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dIZWFkc2V0UHJvZmlsZVJmY0Nvbm5lY3Rpb24oCi0gICAgICBCVEFfQklQX1NFUlZJQ0VfSUQpOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Mb2dIZWFkc2V0UHJvZmlsZVJmY0Nvbm5lY3Rpb24oCi0gICAgICBCVEFfSFNQX1NFUlZJQ0VfSUQpOwotICBzdGQ6OnN0cmluZyBtc2dfc3RyOwotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIEJsdWV0b290aExvZyogbWV0cmljcyA9IEJsdWV0b290aExvZzo6ZGVmYXVsdF9pbnN0YW5jZSgpLk5ldygpOwotICBtZXRyaWNzLT5QYXJzZUZyb21TdHJpbmcobXNnX3N0cik7Ci0gIEVYUEVDVF9FUShtZXRyaWNzLT5oZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0c19zaXplKCksIDMpOwotICBib29sIGhmcF9jb3JyZWN0ID0gZmFsc2U7Ci0gIGJvb2wgaHNwX2NvcnJlY3QgPSBmYWxzZTsKLSAgYm9vbCB1bmtub3duX2NvcnJlY3QgPSBmYWxzZTsKLSAgZm9yIChjb25zdCBIZWFkc2V0UHJvZmlsZUNvbm5lY3Rpb25TdGF0cyYgaGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHMgOgotICAgICAgIG1ldHJpY3MtPmhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzKCkpIHsKLSAgICBzd2l0Y2ggKGhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzLmhlYWRzZXRfcHJvZmlsZV90eXBlKCkpIHsKLSAgICAgIGNhc2UgSGVhZHNldFByb2ZpbGVUeXBlOjpIRlA6Ci0gICAgICAgIEVYUEVDVF9FUShoZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0cy5udW1fdGltZXNfY29ubmVjdGVkKCksIDEpOwotICAgICAgICBoZnBfY29ycmVjdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBIZWFkc2V0UHJvZmlsZVR5cGU6OkhTUDoKLSAgICAgICAgRVhQRUNUX0VRKGhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzLm51bV90aW1lc19jb25uZWN0ZWQoKSwgMik7Ci0gICAgICAgIGhzcF9jb3JyZWN0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBFWFBFQ1RfRVEoaGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHMubnVtX3RpbWVzX2Nvbm5lY3RlZCgpLCAxKTsKLSAgICAgICAgdW5rbm93bl9jb3JyZWN0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIEVYUEVDVF9UUlVFKGhmcF9jb3JyZWN0KTsKLSAgRVhQRUNUX1RSVUUoaHNwX2NvcnJlY3QpOwotICBFWFBFQ1RfVFJVRSh1bmtub3duX2NvcnJlY3QpOwotICBtZXRyaWNzLT5jbGVhcl9oZWFkc2V0X3Byb2ZpbGVfY29ubmVjdGlvbl9zdGF0cygpOwotICBFWFBFQ1RfRVEobWV0cmljcy0+aGVhZHNldF9wcm9maWxlX2Nvbm5lY3Rpb25fc3RhdHNfc2l6ZSgpLCAwKTsKLSAgLy8gVmVyaWZ5IHRoYXQgZHVtcCBhZnRlciBjbGVhbiB1cCByZXN1bHQgaW4gYW4gZW1wdHkgbGlzdAotICBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZVN0cmluZygmbXNnX3N0cik7Ci0gIG1ldHJpY3MtPlBhcnNlRnJvbVN0cmluZyhtc2dfc3RyKTsKLSAgRVhQRUNUX0VRKG1ldHJpY3MtPmhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzX3NpemUoKSwgMCk7Ci0gIGRlbGV0ZSBtZXRyaWNzOwotfQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2NvbW1vbi9vbmNlX3RpbWVyLmNjIGIvY29tbW9uL29uY2VfdGltZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmE0NDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL29uY2VfdGltZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9uY2VfdGltZXIuaCIKLQotI2luY2x1ZGUgIm1lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJ0aW1lX3V0aWwuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8vIFRoaXMgcnVucyBvbiB1c2VyIHRocmVhZAotT25jZVRpbWVyOjp+T25jZVRpbWVyKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICBpZiAobWVzc2FnZV9sb29wX3RocmVhZF8gIT0gbnVsbHB0ciAmJiBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+SXNSdW5uaW5nKCkpIHsKLSAgICBDYW5jZWxBbmRXYWl0KCk7Ci0gIH0KLX0KLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi1ib29sIE9uY2VUaW1lcjo6U2NoZWR1bGUoY29uc3QgYmFzZTo6V2Vha1B0cjxNZXNzYWdlTG9vcFRocmVhZD4mIHRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2ssIGJhc2U6OlRpbWVEZWx0YSBkZWxheSkgewotICB1aW50NjRfdCB0aW1lX25vd191cyA9IHRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIHVpbnQ2NF90IHRpbWVfbmV4dF90YXNrX3VzID0gdGltZV9ub3dfdXMgKyBkZWxheS5Jbk1pY3Jvc2Vjb25kcygpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICBpZiAodGhyZWFkID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHRocmVhZCBtdXN0IGJlIG5vbi1udWxsIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ2FuY2VsQW5kV2FpdCgpOwotICB0YXNrXyA9IHN0ZDo6bW92ZSh0YXNrKTsKLSAgdGFza193cmFwcGVyXy5SZXNldCgKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZPbmNlVGltZXI6OlJ1blRhc2ssIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZF8gPSB0aHJlYWQ7Ci0gIGRlbGF5XyA9IGRlbGF5OwotICB1aW50NjRfdCB0aW1lX3VudGlsX25leHRfdXMgPSB0aW1lX25leHRfdGFza191cyAtIHRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIGlmICghdGhyZWFkLT5Eb0luVGhyZWFkRGVsYXllZCgKLSAgICAgICAgICBmcm9tX2hlcmUsIHRhc2tfd3JhcHBlcl8uY2FsbGJhY2soKSwKLSAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHModGltZV91bnRpbF9uZXh0X3VzKSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBmYWlsZWQgdG8gcG9zdCB0YXNrIHRvIG1lc3NhZ2UgbG9vcCBmb3IgdGhyZWFkICIgPDwgKnRocmVhZAotICAgICAgICAgICAgICAgPDwgIiwgZnJvbSAiIDw8IGZyb21faGVyZS5Ub1N0cmluZygpOwotICAgIHRhc2tfd3JhcHBlcl8uQ2FuY2VsKCk7Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8gPSBudWxscHRyOwotICAgIGRlbGF5XyA9IHt9OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi12b2lkIE9uY2VUaW1lcjo6Q2FuY2VsKCkgewotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgQ2FuY2VsSGVscGVyKHN0ZDo6bW92ZShwcm9taXNlKSk7Ci19Ci0KLS8vIFRoaXMgcnVucyBvbiB1c2VyIHRocmVhZAotdm9pZCBPbmNlVGltZXI6OkNhbmNlbEFuZFdhaXQoKSB7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBDYW5jZWxIZWxwZXIoc3RkOjptb3ZlKHByb21pc2UpKTsKLSAgZnV0dXJlLndhaXQoKTsKLX0KLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi12b2lkIE9uY2VUaW1lcjo6Q2FuY2VsSGVscGVyKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkKiBzY2hlZHVsZWRfdGhyZWFkID0gbWVzc2FnZV9sb29wX3RocmVhZF8uZ2V0KCk7Ci0gIGlmIChzY2hlZHVsZWRfdGhyZWFkID09IG51bGxwdHIpIHsKLSAgICBwcm9taXNlLnNldF92YWx1ZSgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoc2NoZWR1bGVkX3RocmVhZC0+R2V0VGhyZWFkSWQoKSA9PSBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3VycmVudElkKCkpIHsKLSAgICBDYW5jZWxDbG9zdXJlKHN0ZDo6bW92ZShwcm9taXNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNjaGVkdWxlZF90aHJlYWQtPkRvSW5UaHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKCZPbmNlVGltZXI6OkNhbmNlbENsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIHN0ZDo6bW92ZShwcm9taXNlKSkpOwotfQotCi0vLyBUaGlzIHJ1bnMgb24gbWVzc2FnZSBsb29wIHRocmVhZAotdm9pZCBPbmNlVGltZXI6OkNhbmNlbENsb3N1cmUoc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgbWVzc2FnZV9sb29wX3RocmVhZF8gPSBudWxscHRyOwotICB0YXNrX3dyYXBwZXJfLkNhbmNlbCgpOwotICBzdGQ6Om1vdmUodGFza18pOwotICBkZWxheV8gPSBiYXNlOjpUaW1lRGVsdGEoKTsKLSAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLX0KLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi1ib29sIE9uY2VUaW1lcjo6SXNTY2hlZHVsZWQoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gIHJldHVybiBtZXNzYWdlX2xvb3BfdGhyZWFkXyAhPSBudWxscHRyICYmIG1lc3NhZ2VfbG9vcF90aHJlYWRfLT5Jc1J1bm5pbmcoKTsKLX0KLQotLy8gVGhpcyBydW5zIG9uIG1lc3NhZ2UgbG9vcCB0aHJlYWQKLXZvaWQgT25jZVRpbWVyOjpSdW5UYXNrKCkgewotICBpZiAobWVzc2FnZV9sb29wX3RocmVhZF8gPT0gbnVsbHB0ciB8fCAhbWVzc2FnZV9sb29wX3RocmVhZF8tPklzUnVubmluZygpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogbWVzc2FnZV9sb29wX3RocmVhZF8gaXMgbnVsbCBvciBpcyBub3QgcnVubmluZyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENIRUNLX0VRKG1lc3NhZ2VfbG9vcF90aHJlYWRfLT5HZXRUaHJlYWRJZCgpLAotICAgICAgICAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6Q3VycmVudElkKCkpCi0gICAgICA8PCAiOiB0YXNrIG11c3QgcnVuIG9uIG1lc3NhZ2UgbG9vcCB0aHJlYWQiOwotCi0gIHRhc2tfd3JhcHBlcl8uQ2FuY2VsKCk7Ci0gIHN0ZDo6bW92ZSh0YXNrXykuUnVuKCk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWRfID0gbnVsbHB0cjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vb25jZV90aW1lci5oIGIvY29tbW9uL29uY2VfdGltZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2OGJlNS4uMDAwMDAwMAotLS0gYS9jb21tb24vb25jZV90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbmNlbGFibGVfY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLWNsYXNzIE1lc3NhZ2VMb29wVGhyZWFkOwotCi0vKioKLSAqIEFuIGFsYXJtIGNsb2NrIHRoYXQgcG9zdHMgYSBkZWxheWVkIHRhc2sgdG8gYSBzcGVjaWZpZWQgTWVzc2FnZUxvb3BUaHJlYWQKLSAqIG9uY2UuCi0gKgotICogV2FybmluZzogTWVzc2FnZUxvb3BUaHJlYWQgbXVzdCBiZSBydW5uaW5nIHdoZW4gYW55IHRhc2sgaXMgc2NoZWR1bGVkIG9yCi0gKiBiZWluZyBleGVjdXRlZAotICovCi1jbGFzcyBPbmNlVGltZXIgZmluYWwgewotIHB1YmxpYzoKLSAgT25jZVRpbWVyKCkge30KLSAgfk9uY2VUaW1lcigpOwotCi0gIC8qKgotICAgKiBTY2hlZHVsZSBhIGRlbGF5ZWQgdGFzayB0byB0aGUgTWVzc2FnZUxvb3BUaHJlYWQuIE9ubHkgb25lIHRhc2sgY2FuIGJlCi0gICAqIHNjaGVkdWxlZCBhdCBhIHRpbWUuIElmIGFub3RoZXIgdGFzayBpcyBzY2hlZHVsZWQsIGl0IHdpbGwgY2FuY2VsIHRoZQotICAgKiBwcmV2aW91cyB0YXNrIHN5bmNocm9ub3VzbHkgYW5kIHNjaGVkdWxlIHRoZSBuZXcgdGFzazsgdGhpcyBibG9ja3MgdW50aWwKLSAgICogdGhlIHByZXZpb3VzIHRhc2sgaXMgY2FuY2VsbGVkLgotICAgKgotICAgKiBAcGFyYW0gdGhyZWFkIHRocmVhZCB0byBydW4gdGhlIHRhc2sKLSAgICogQHBhcmFtIGZyb21faGVyZSBsb2NhdGlvbiB3aGVyZSB0aGlzIHRhc2sgaXMgb3JpZ2luYXRlZAotICAgKiBAcGFyYW0gdGFzayB0YXNrIGNyZWF0ZWQgdGhyb3VnaCBiYXNlOjpCaW5kKCkKLSAgICogQHBhcmFtIGRlbGF5IGRlbGF5IGZvciB0aGUgdGFzayB0byBiZSBleGVjdXRlZAotICAgKiBAcmV0dXJuIHRydWUgaWZmIHRhc2sgaXMgc2NoZWR1bGVkIHN1Y2Nlc3NmdWxseQotICAgKi8KLSAgYm9vbCBTY2hlZHVsZShjb25zdCBiYXNlOjpXZWFrUHRyPE1lc3NhZ2VMb29wVGhyZWFkPiYgdGhyZWFkLAotICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2ssCi0gICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGRlbGF5KTsKLQotICAvKioKLSAgICogUG9zdCBhbiBldmVudCB3aGljaCBjYW5jZWxzIHRoZSBjdXJyZW50IHRhc2sgYXN5bmNocm9ub3VzbHkKLSAgICovCi0gIHZvaWQgQ2FuY2VsKCk7Ci0KLSAgLyoqCi0gICAqIFBvc3QgYW4gZXZlbnQgd2hpY2ggY2FuY2VscyB0aGUgY3VycmVudCB0YXNrIGFuZCB3YWl0IGZvciB0aGUgY2FuY2VsbGF0aW9uCi0gICAqIHRvIGJlIGNvbXBsZXRlZAotICAgKi8KLSAgdm9pZCBDYW5jZWxBbmRXYWl0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZXJlIGlzIGEgcGVuZGluZyB0YXNrIHNjaGVkdWxlZCBvbiBhIHJ1bm5pbmcgdGhyZWFkLAotICAgKiBvdGhlcndpc2UgZmFsc2UuCi0gICAqLwotICBib29sIElzU2NoZWR1bGVkKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBiYXNlOjpXZWFrUHRyPE1lc3NhZ2VMb29wVGhyZWFkPiBtZXNzYWdlX2xvb3BfdGhyZWFkXzsKLSAgYmFzZTo6Q2FuY2VsYWJsZU9uY2VDbG9zdXJlIHRhc2tfd3JhcHBlcl87Ci0gIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2tfOwotICBiYXNlOjpUaW1lRGVsdGEgZGVsYXlfOwotICBtdXRhYmxlIHN0ZDo6cmVjdXJzaXZlX211dGV4IGFwaV9tdXRleF87Ci0gIHZvaWQgQ2FuY2VsSGVscGVyKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLSAgdm9pZCBDYW5jZWxDbG9zdXJlKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLQotICB2b2lkIFJ1blRhc2soKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oT25jZVRpbWVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvY29tbW9uL29uY2VfdGltZXJfdW5pdHRlc3QuY2MgYi9jb21tb24vb25jZV90aW1lcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNDc0ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vb25jZV90aW1lcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJiaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib25jZV90aW1lci5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQ7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6T25jZVRpbWVyOwotCi0vLyBBbGxvd2VkIGVycm9yIGJldHdlZW4gdGhlIGV4cGVjdGVkIGFuZCBhY3R1YWwgZGVsYXkgZm9yIERvSW5UaHJlYWREZWxheWVkKCkuCi1jb25zdGV4cHIgdWludDMyX3QgZGVsYXlfZXJyb3JfbXMgPSAzOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgdG8gdmVyaWZ5IFRhc2sgU2NoZWR1bGVyLgotICovCi1jbGFzcyBPbmNlVGltZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFNob3VsZE5vdEhhcHBlbigpIHsgRkFJTCgpIDw8ICJTaG91bGQgbm90IGhhcHBlbiI7IH0KLQotICB2b2lkIEluY3JlYXNlVGFza0NvdW50ZXIoaW50IHNjaGVkdWxlZF90YXNrcywgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlKSB7Ci0gICAgY291bnRlcl8rKzsKLSAgICBpZiAoY291bnRlcl8gPT0gc2NoZWR1bGVkX3Rhc2tzKSB7Ci0gICAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEdldE5hbWUoc3RkOjpzdHJpbmcqIG5hbWUsIHN0ZDo6cHJvbWlzZTx2b2lkPiogcHJvbWlzZSkgewotICAgIGNoYXIgbXlfbmFtZVsyNTZdOwotICAgIHB0aHJlYWRfZ2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgbXlfbmFtZSwgc2l6ZW9mKG15X25hbWUpKTsKLSAgICBuYW1lLT5hcHBlbmQobXlfbmFtZSk7Ci0gICAgcHJvbWlzZS0+c2V0X3ZhbHVlKCk7Ci0gIH0KLQotICB2b2lkIFNsZWVwQW5kSW5jcmVhc2VDb3VudGVyKHN0ZDo6cHJvbWlzZTx2b2lkPiogcHJvbWlzZSwgaW50IHNsZWVwX21zKSB7Ci0gICAgcHJvbWlzZS0+c2V0X3ZhbHVlKCk7Ci0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc2xlZXBfbXMpKTsKLSAgICBjb3VudGVyXysrOwotICB9Ci0KLSAgdm9pZCBDYW5jZWxUaW1lckFuZFdhaXQoKSB7IHRpbWVyXy0+Q2FuY2VsQW5kV2FpdCgpOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgOjp0ZXN0aW5nOjpUZXN0OjpTZXRVcCgpOwotICAgIGNvdW50ZXJfID0gMDsKLSAgICB0aW1lcl8gPSBuZXcgT25jZVRpbWVyKCk7Ci0gICAgcHJvbWlzZV8gPSBuZXcgc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGlmIChwcm9taXNlXyAhPSBudWxscHRyKSB7Ci0gICAgICBkZWxldGUgcHJvbWlzZV87Ci0gICAgICBwcm9taXNlXyA9IG51bGxwdHI7Ci0gICAgfQotICAgIGlmICh0aW1lcl8gIT0gbnVsbHB0cikgewotICAgICAgZGVsZXRlIHRpbWVyXzsKLSAgICAgIHRpbWVyXyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgaW50IGNvdW50ZXJfOwotICBPbmNlVGltZXIqIHRpbWVyXzsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlXzsKLX07Ci0KLVRFU1RfRihPbmNlVGltZXJUZXN0LCBpbml0aWFsX2lzX25vdF9zY2hlZHVsZWQpIHsKLSAgQVNTRVJUX0ZBTFNFKHRpbWVyXy0+SXNTY2hlZHVsZWQoKSk7Ci19Ci0KLVRFU1RfRihPbmNlVGltZXJUZXN0LCBzY2hlZHVsZV90YXNrKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAidGVzdF90aHJlYWQiOwotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICBzdGQ6OnN0cmluZyBteV9uYW1lOwotICB1aW50MzJfdCBkZWxheV9tcyA9IDU7Ci0KLSAgdGltZXJfLT5TY2hlZHVsZShtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZPbmNlVGltZXJUZXN0OjpHZXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksICZteV9uYW1lLCBwcm9taXNlXyksCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGRlbGF5X21zKSk7Ci0gIEVYUEVDVF9UUlVFKHRpbWVyXy0+SXNTY2hlZHVsZWQoKSk7Ci0gIGZ1dHVyZS5nZXQoKTsKLSAgQVNTRVJUX0VRKG5hbWUsIG15X25hbWUpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkZWxheV9lcnJvcl9tcykpOwotICBFWFBFQ1RfRkFMU0UodGltZXJfLT5Jc1NjaGVkdWxlZCgpKTsKLX0KLQotVEVTVF9GKE9uY2VUaW1lclRlc3QsIGNhbmNlbF93aXRob3V0X3NjaGVkdWxpbmcpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotCi0gIEVYUEVDVF9GQUxTRSh0aW1lcl8tPklzU2NoZWR1bGVkKCkpOwotICB0aW1lcl8tPkNhbmNlbEFuZFdhaXQoKTsKLSAgRVhQRUNUX0ZBTFNFKHRpbWVyXy0+SXNTY2hlZHVsZWQoKSk7Ci19Ci0KLVRFU1RfRihPbmNlVGltZXJUZXN0LCBjYW5jZWxfaW5fY2FsbGJhY2tfbm9fZGVhZGxvY2spIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICB1aW50MzJfdCBkZWxheV9tcyA9IDU7Ci0KLSAgdGltZXJfLT5TY2hlZHVsZShtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZPbmNlVGltZXJUZXN0OjpDYW5jZWxUaW1lckFuZFdhaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGRlbGF5X21zKSk7Ci19Ci0KLVRFU1RfRihPbmNlVGltZXJUZXN0LCBjYW5jZWxfc2luZ2xlX3Rhc2spIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICB1aW50MzJfdCBkZWxheV9tcyA9IDEwMDAwMDAwMDsKLSAgdGltZXJfLT5TY2hlZHVsZSgKLSAgICAgIG1lc3NhZ2VfbG9vcF90aHJlYWQuR2V0V2Vha1B0cigpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmT25jZVRpbWVyVGVzdDo6U2hvdWxkTm90SGFwcGVuLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhkZWxheV9tcykpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkZWxheV9lcnJvcl9tcykpOwotICB0aW1lcl8tPkNhbmNlbEFuZFdhaXQoKTsKLX0KLQotVEVTVF9GKE9uY2VUaW1lclRlc3QsIG1lc3NhZ2VfbG9vcF90aHJlYWRfZG93bl9jYW5jZWxfdGFzaykgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgewotICAgIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gICAgdWludDMyX3QgZGVsYXlfbXMgPSAxMDAwMDAwMDA7Ci0gICAgdGltZXJfLT5TY2hlZHVsZSgKLSAgICAgICAgbWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJk9uY2VUaW1lclRlc3Q6OlNob3VsZE5vdEhhcHBlbiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhkZWxheV9tcykpOwotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGRlbGF5X2Vycm9yX21zKSk7Ci0gIH0KLX0KLQotLy8gVmVyaWZ5IHRoYXQgaWYgYSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkLCB0aGVuIGNhbmNlbGxpbmcgaXQgaXMgbm8tb3AKLVRFU1RfRihPbmNlVGltZXJUZXN0LCBjYW5jZWxfY3VycmVudF90YXNrX25vX2VmZmVjdCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgdWludDMyX3QgZGVsYXlfbXMgPSA1OwotCi0gIHRpbWVyXy0+U2NoZWR1bGUobWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmT25jZVRpbWVyVGVzdDo6U2xlZXBBbmRJbmNyZWFzZUNvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgcHJvbWlzZV8sIGRlbGF5X21zKSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgRVhQRUNUX1RSVUUodGltZXJfLT5Jc1NjaGVkdWxlZCgpKTsKLSAgZnV0dXJlLmdldCgpOwotICB0aW1lcl8tPkNhbmNlbEFuZFdhaXQoKTsKLSAgQVNTRVJUX0VRKGNvdW50ZXJfLCAxKTsKLSAgRVhQRUNUX0ZBTFNFKHRpbWVyXy0+SXNTY2hlZHVsZWQoKSk7Ci19Ci0KLVRFU1RfRihPbmNlVGltZXJUZXN0LCByZXNjaGVkdWxlX3Rhc2tfZG9udF9pbnZva2VfbmV3X3Rhc2tfZWFybHkpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICB1aW50MzJfdCBkZWxheV9tcyA9IDU7Ci0gIHRpbWVyXy0+U2NoZWR1bGUobWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMgLSAyKSk7Ci0gIHRpbWVyXy0+U2NoZWR1bGUoCi0gICAgICBtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoJk9uY2VUaW1lclRlc3Q6OlNob3VsZE5vdEhhcHBlbiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZGVsYXlfbXMgKyAxMDAwKSk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGRlbGF5X21zKSk7Ci19Ci0KLVRFU1RfRihPbmNlVGltZXJUZXN0LCByZXNjaGVkdWxlX3Rhc2tfd2hlbl9maXJpbmdfZG9udF9pbnZva2VfbmV3X3Rhc2tfZWFybHkpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICB1aW50MzJfdCBkZWxheV9tcyA9IDU7Ci0gIHRpbWVyXy0+U2NoZWR1bGUobWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgdGltZXJfLT5TY2hlZHVsZSgKLSAgICAgIG1lc3NhZ2VfbG9vcF90aHJlYWQuR2V0V2Vha1B0cigpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kT25jZSgmT25jZVRpbWVyVGVzdDo6U2hvdWxkTm90SGFwcGVuLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhkZWxheV9tcyArIDEwMDApKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLX0KLQotVEVTVF9GKE9uY2VUaW1lclRlc3QsIHJlc2NoZWR1bGVfdGFza193aGVuX2ZpcmluZ19tdXN0X3NjaGVkdWxlX25ld190YXNrKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAidGVzdF90aHJlYWQiOwotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgdWludDMyX3QgZGVsYXlfbXMgPSA1OwotICBzdGQ6OnN0cmluZyBteV9uYW1lOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gIHRpbWVyXy0+U2NoZWR1bGUobWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgdGltZXJfLT5TY2hlZHVsZShtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZPbmNlVGltZXJUZXN0OjpHZXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksICZteV9uYW1lLCBwcm9taXNlXyksCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGRlbGF5X21zKSk7Ci0gIGZ1dHVyZS5nZXQoKTsKLSAgQVNTRVJUX0VRKG5hbWUsIG15X25hbWUpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL29zX3V0aWxzLmNjIGIvY29tbW9uL29zX3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEwZjMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9vc191dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZmRlZiBPU19BTkRST0lECi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotYm9vbCBpc19ibHVldG9vdGhfdWlkKCkgewotI2lmZGVmIE9TX0FORFJPSUQKLSAgcmV0dXJuIGdldHVpZCgpID09IEFJRF9CTFVFVE9PVEg7Ci0jZWxzZQotICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9vc191dGlscy5oIGIvY29tbW9uL29zX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOTQyNDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL29zX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1ib29sIGlzX2JsdWV0b290aF91aWQoKTsKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZXBlYXRpbmdfdGltZXIuY2MgYi9jb21tb24vcmVwZWF0aW5nX3RpbWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ4ZGUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9yZXBlYXRpbmdfdGltZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJlcGVhdGluZ190aW1lci5oIgotCi0jaW5jbHVkZSAibWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgInRpbWVfdXRpbC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotY29uc3RleHByIGJhc2U6OlRpbWVEZWx0YSBrTWluaW11bVBlcmlvZCA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxKTsKLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi1SZXBlYXRpbmdUaW1lcjo6flJlcGVhdGluZ1RpbWVyKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICBpZiAobWVzc2FnZV9sb29wX3RocmVhZF8gIT0gbnVsbHB0ciAmJiBtZXNzYWdlX2xvb3BfdGhyZWFkXy0+SXNSdW5uaW5nKCkpIHsKLSAgICBDYW5jZWxBbmRXYWl0KCk7Ci0gIH0KLX0KLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi1ib29sIFJlcGVhdGluZ1RpbWVyOjpTY2hlZHVsZVBlcmlvZGljKAotICAgIGNvbnN0IGJhc2U6OldlYWtQdHI8TWVzc2FnZUxvb3BUaHJlYWQ+JiB0aHJlYWQsCi0gICAgY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwgYmFzZTo6Q2xvc3VyZSB0YXNrLAotICAgIGJhc2U6OlRpbWVEZWx0YSBwZXJpb2QpIHsKLSAgaWYgKHBlcmlvZCA8IGtNaW5pbXVtUGVyaW9kKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAiIDw8IGtNaW5pbXVtUGVyaW9kOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ2NF90IHRpbWVfbm93X3VzID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgdWludDY0X3QgdGltZV9uZXh0X3Rhc2tfdXMgPSB0aW1lX25vd191cyArIHBlcmlvZC5Jbk1pY3Jvc2Vjb25kcygpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICBpZiAodGhyZWFkID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHRocmVhZCBtdXN0IGJlIG5vbi1udWxsIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ2FuY2VsQW5kV2FpdCgpOwotICBleHBlY3RlZF90aW1lX25leHRfdGFza191c18gPSB0aW1lX25leHRfdGFza191czsKLSAgdGFza18gPSBzdGQ6Om1vdmUodGFzayk7Ci0gIHRhc2tfd3JhcHBlcl8uUmVzZXQoCi0gICAgICBiYXNlOjpCaW5kKCZSZXBlYXRpbmdUaW1lcjo6UnVuVGFzaywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkXyA9IHRocmVhZDsKLSAgcGVyaW9kXyA9IHBlcmlvZDsKLSAgdWludDY0X3QgdGltZV91bnRpbF9uZXh0X3VzID0gdGltZV9uZXh0X3Rhc2tfdXMgLSB0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICBpZiAoIXRocmVhZC0+RG9JblRocmVhZERlbGF5ZWQoCi0gICAgICAgICAgZnJvbV9oZXJlLCB0YXNrX3dyYXBwZXJfLmNhbGxiYWNrKCksCi0gICAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKHRpbWVfdW50aWxfbmV4dF91cykpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogZmFpbGVkIHRvIHBvc3QgdGFzayB0byBtZXNzYWdlIGxvb3AgZm9yIHRocmVhZCAiIDw8ICp0aHJlYWQKLSAgICAgICAgICAgICAgIDw8ICIsIGZyb20gIiA8PCBmcm9tX2hlcmUuVG9TdHJpbmcoKTsKLSAgICBleHBlY3RlZF90aW1lX25leHRfdGFza191c18gPSAwOwotICAgIHRhc2tfd3JhcHBlcl8uQ2FuY2VsKCk7Ci0gICAgbWVzc2FnZV9sb29wX3RocmVhZF8gPSBudWxscHRyOwotICAgIHBlcmlvZF8gPSB7fTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRoaXMgcnVucyBvbiB1c2VyIHRocmVhZAotdm9pZCBSZXBlYXRpbmdUaW1lcjo6Q2FuY2VsKCkgewotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgQ2FuY2VsSGVscGVyKHN0ZDo6bW92ZShwcm9taXNlKSk7Ci19Ci0KLS8vIFRoaXMgcnVucyBvbiB1c2VyIHRocmVhZAotdm9pZCBSZXBlYXRpbmdUaW1lcjo6Q2FuY2VsQW5kV2FpdCgpIHsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIENhbmNlbEhlbHBlcihzdGQ6Om1vdmUocHJvbWlzZSkpOwotICBmdXR1cmUud2FpdCgpOwotfQotCi0vLyBUaGlzIHJ1bnMgb24gdXNlciB0aHJlYWQKLXZvaWQgUmVwZWF0aW5nVGltZXI6OkNhbmNlbEhlbHBlcihzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICBNZXNzYWdlTG9vcFRocmVhZCogc2NoZWR1bGVkX3RocmVhZCA9IG1lc3NhZ2VfbG9vcF90aHJlYWRfLmdldCgpOwotICBpZiAoc2NoZWR1bGVkX3RocmVhZCA9PSBudWxscHRyKSB7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHNjaGVkdWxlZF90aHJlYWQtPkdldFRocmVhZElkKCkgPT0gYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpKSB7Ci0gICAgQ2FuY2VsQ2xvc3VyZShzdGQ6Om1vdmUocHJvbWlzZSkpOwotICAgIHJldHVybjsKLSAgfQotICBzY2hlZHVsZWRfdGhyZWFkLT5Eb0luVGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgmUmVwZWF0aW5nVGltZXI6OkNhbmNlbENsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIHN0ZDo6bW92ZShwcm9taXNlKSkpOwotfQotCi0vLyBUaGlzIHJ1bnMgb24gbWVzc2FnZSBsb29wIHRocmVhZAotdm9pZCBSZXBlYXRpbmdUaW1lcjo6Q2FuY2VsQ2xvc3VyZShzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICBtZXNzYWdlX2xvb3BfdGhyZWFkXyA9IG51bGxwdHI7Ci0gIHRhc2tfd3JhcHBlcl8uQ2FuY2VsKCk7Ci0gIHRhc2tfID0ge307Ci0gIHBlcmlvZF8gPSBiYXNlOjpUaW1lRGVsdGEoKTsKLSAgZXhwZWN0ZWRfdGltZV9uZXh0X3Rhc2tfdXNfID0gMDsKLSAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLX0KLQotLy8gVGhpcyBydW5zIG9uIHVzZXIgdGhyZWFkCi1ib29sIFJlcGVhdGluZ1RpbWVyOjpJc1NjaGVkdWxlZCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgcmV0dXJuIG1lc3NhZ2VfbG9vcF90aHJlYWRfICE9IG51bGxwdHIgJiYgbWVzc2FnZV9sb29wX3RocmVhZF8tPklzUnVubmluZygpOwotfQotCi0vLyBUaGlzIHJ1bnMgb24gbWVzc2FnZSBsb29wIHRocmVhZAotdm9pZCBSZXBlYXRpbmdUaW1lcjo6UnVuVGFzaygpIHsKLSAgaWYgKG1lc3NhZ2VfbG9vcF90aHJlYWRfID09IG51bGxwdHIgfHwgIW1lc3NhZ2VfbG9vcF90aHJlYWRfLT5Jc1J1bm5pbmcoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IG1lc3NhZ2VfbG9vcF90aHJlYWRfIGlzIG51bGwgb3IgaXMgbm90IHJ1bm5pbmciOwotICAgIHJldHVybjsKLSAgfQotICBDSEVDS19FUShtZXNzYWdlX2xvb3BfdGhyZWFkXy0+R2V0VGhyZWFkSWQoKSwKLSAgICAgICAgICAgYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpKQotICAgICAgPDwgIjogdGFzayBtdXN0IHJ1biBvbiBtZXNzYWdlIGxvb3AgdGhyZWFkIjsKLQotICBpbnQ2NF90IHBlcmlvZF91cyA9IHBlcmlvZF8uSW5NaWNyb3NlY29uZHMoKTsKLSAgZXhwZWN0ZWRfdGltZV9uZXh0X3Rhc2tfdXNfICs9IHBlcmlvZF91czsKLSAgdWludDY0X3QgdGltZV9ub3dfdXMgPSB0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICBpbnQ2NF90IHJlbWFpbmluZ190aW1lX3VzID0gZXhwZWN0ZWRfdGltZV9uZXh0X3Rhc2tfdXNfIC0gdGltZV9ub3dfdXM7Ci0gIGlmIChyZW1haW5pbmdfdGltZV91cyA8IDApIHsKLSAgICAvLyBpZiByZW1haW5pbmdfdGltZV91cyBpcyBuZWdhdGl2ZSwgc2NoZWR1bGUgdGhlIHRhc2sgdG8gdGhlIG5lYXJlc3QKLSAgICAvLyBtdWx0aXBsZSBvZiBwZXJpb2QKLSAgICByZW1haW5pbmdfdGltZV91cyA9IChyZW1haW5pbmdfdGltZV91cyAlIHBlcmlvZF91cyArIHBlcmlvZF91cykgJSBwZXJpb2RfdXM7Ci0gIH0KLSAgbWVzc2FnZV9sb29wX3RocmVhZF8tPkRvSW5UaHJlYWREZWxheWVkKAotICAgICAgRlJPTV9IRVJFLCB0YXNrX3dyYXBwZXJfLmNhbGxiYWNrKCksCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHMocmVtYWluaW5nX3RpbWVfdXMpKTsKLQotICB1aW50NjRfdCB0aW1lX2JlZm9yZV90YXNrX3VzID0gdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgdGFza18uUnVuKCk7Ci0gIHVpbnQ2NF90IHRpbWVfYWZ0ZXJfdGFza191cyA9IHRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIGF1dG8gdGFza190aW1lX3VzID0KLSAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHRpbWVfYWZ0ZXJfdGFza191cyAtIHRpbWVfYmVmb3JlX3Rhc2tfdXMpOwotICBpZiAodGFza190aW1lX3VzID4gcGVyaW9kXy5Jbk1pY3Jvc2Vjb25kcygpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBQZXJpb2RpYyB0YXNrIGV4ZWN1dGlvbiB0b29rICIgPDwgdGFza190aW1lX3VzCi0gICAgICAgICAgICAgICA8PCAiIG1pY3Jvc2Vjb25kcywgbG9uZ2VyIHRoYW4gaW50ZXJ2YWwgIgotICAgICAgICAgICAgICAgPDwgcGVyaW9kXy5Jbk1pY3Jvc2Vjb25kcygpIDw8ICIgbWljcm9zZWNvbmRzIjsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2NvbW1vbi9yZXBlYXRpbmdfdGltZXIuaCBiL2NvbW1vbi9yZXBlYXRpbmdfdGltZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjNTEwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcmVwZWF0aW5nX3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FuY2VsYWJsZV9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotY2xhc3MgTWVzc2FnZUxvb3BUaHJlYWQ7Ci0KLS8qKgotICogQW4gYWxhcm0gY2xvY2sgdGhhdCBwb3N0cyBhIGRlbGF5ZWQgdGFzayB0byBhIHNwZWNpZmllZCBNZXNzYWdlTG9vcFRocmVhZAotICogcGVyaW9kaWNhbGx5LgotICoKLSAqIFdhcm5pbmc6IE1lc3NhZ2VMb29wVGhyZWFkIG11c3QgYmUgcnVubmluZyB3aGVuIGFueSB0YXNrIGlzIHNjaGVkdWxlZCBvcgotICogYmVpbmcgZXhlY3V0ZWQKLSAqLwotY2xhc3MgUmVwZWF0aW5nVGltZXIgZmluYWwgewotIHB1YmxpYzoKLSAgUmVwZWF0aW5nVGltZXIoKSA6IGV4cGVjdGVkX3RpbWVfbmV4dF90YXNrX3VzXygwKSB7fQotICB+UmVwZWF0aW5nVGltZXIoKTsKLQotICAvKioKLSAgICogU2NoZWR1bGUgYSBkZWxheWVkIHBlcmlvZGljIHRhc2sgdG8gdGhlIE1lc3NhZ2VMb29wVGhyZWFkLiBPbmx5IG9uZSB0YXNrCi0gICAqIGNhbiBiZSBzY2hlZHVsZWQgYXQgYSB0aW1lLiBJZiBhbm90aGVyIHRhc2sgaXMgc2NoZWR1bGVkLCBpdCB3aWxsIGNhbmNlbAotICAgKiB0aGUgcHJldmlvdXMgdGFzayBzeW5jaHJvbm91c2x5IGFuZCBzY2hlZHVsZSB0aGUgbmV3IHBlcmlvZGljIHRhc2s7IHRoaXMKLSAgICogYmxvY2tzIHVudGlsIHRoZSBwcmV2aW91cyB0YXNrIGlzIGNhbmNlbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIHRocmVhZCB0aHJlYWQgdG8gcnVuIHRoZSB0YXNrCi0gICAqIEBwYXJhbSBmcm9tX2hlcmUgbG9jYXRpb24gd2hlcmUgdGhpcyB0YXNrIGlzIG9yaWdpbmF0ZWQKLSAgICogQHBhcmFtIHRhc2sgdGFzayBjcmVhdGVkIHRocm91Z2ggYmFzZTo6QmluZCgpCi0gICAqIEBwYXJhbSBwZXJpb2QgcGVyaW9kIGZvciB0aGUgdGFzayB0byBiZSBleGVjdXRlZAotICAgKiBAcmV0dXJuIHRydWUgaWZmIHRhc2sgaXMgc2NoZWR1bGVkIHN1Y2Nlc3NmdWxseQotICAgKi8KLSAgYm9vbCBTY2hlZHVsZVBlcmlvZGljKGNvbnN0IGJhc2U6OldlYWtQdHI8TWVzc2FnZUxvb3BUaHJlYWQ+JiB0aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6UmVwZWF0aW5nQ2xvc3VyZSB0YXNrLCBiYXNlOjpUaW1lRGVsdGEgcGVyaW9kKTsKLQotICAvKioKLSAgICogUG9zdCBhbiBldmVudCB3aGljaCBjYW5jZWxzIHRoZSBjdXJyZW50IHRhc2sgYXN5bmNocm9ub3VzbHkKLSAgICovCi0gIHZvaWQgQ2FuY2VsKCk7Ci0KLSAgLyoqCi0gICAqIFBvc3QgYW4gZXZlbnQgd2hpY2ggY2FuY2VscyB0aGUgY3VycmVudCB0YXNrIGFuZCB3YWl0IGZvciB0aGUgY2FuY2VsbGF0aW9uCi0gICAqIHRvIGJlIGNvbXBsZXRlZAotICAgKi8KLSAgdm9pZCBDYW5jZWxBbmRXYWl0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZXJlIGlzIGEgcGVuZGluZyB0YXNrIHNjaGVkdWxlZCBvbiBhIHJ1bm5pbmcgdGhyZWFkLAotICAgKiBvdGhlcndpc2UgZmFsc2UuCi0gICAqLwotICBib29sIElzU2NoZWR1bGVkKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBiYXNlOjpXZWFrUHRyPE1lc3NhZ2VMb29wVGhyZWFkPiBtZXNzYWdlX2xvb3BfdGhyZWFkXzsKLSAgYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmUgdGFza193cmFwcGVyXzsKLSAgYmFzZTo6UmVwZWF0aW5nQ2xvc3VyZSB0YXNrXzsKLSAgYmFzZTo6VGltZURlbHRhIHBlcmlvZF87Ci0gIHVpbnQ2NF90IGV4cGVjdGVkX3RpbWVfbmV4dF90YXNrX3VzXzsgIC8vIFVzaW5nIGNsb2NrIGJvb3QgdGltZSBpbiB0aW1lX3V0aWwuaAotICBtdXRhYmxlIHN0ZDo6cmVjdXJzaXZlX211dGV4IGFwaV9tdXRleF87Ci0gIHZvaWQgQ2FuY2VsSGVscGVyKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLSAgdm9pZCBDYW5jZWxDbG9zdXJlKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLQotICB2b2lkIFJ1blRhc2soKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVwZWF0aW5nVGltZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vcmVwZWF0aW5nX3RpbWVyX3VuaXR0ZXN0LmNjIGIvY29tbW9uL3JlcGVhdGluZ190aW1lcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNGJiYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcmVwZWF0aW5nX3RpbWVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgIm1lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJyZXBlYXRpbmdfdGltZXIuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlJlcGVhdGluZ1RpbWVyOwotCi0vLyBBbGxvd2VkIGVycm9yIGJldHdlZW4gdGhlIGV4cGVjdGVkIGFuZCBhY3R1YWwgZGVsYXkgZm9yIERvSW5UaHJlYWREZWxheWVkKCkuCi1jb25zdGV4cHIgdWludDMyX3QgZGVsYXlfZXJyb3JfbXMgPSAxMDA7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyB0byB2ZXJpZnkgVGFzayBTY2hlZHVsZXIuCi0gKi8KLWNsYXNzIFJlcGVhdGluZ1RpbWVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTaG91bGROb3RIYXBwZW4oKSB7IEZBSUwoKSA8PCAiU2hvdWxkIG5vdCBoYXBwZW4iOyB9Ci0KLSAgdm9pZCBJbmNyZWFzZVRhc2tDb3VudGVyKGludCBzY2hlZHVsZWRfdGFza3MsIHN0ZDo6cHJvbWlzZTx2b2lkPiogcHJvbWlzZSkgewotICAgIGNvdW50ZXJfKys7Ci0gICAgaWYgKGNvdW50ZXJfID09IHNjaGVkdWxlZF90YXNrcykgewotICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBHZXROYW1lKHN0ZDo6c3RyaW5nKiBuYW1lLCBzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2UpIHsKLSAgICBjaGFyIG15X25hbWVbMjU2XTsKLSAgICBwdGhyZWFkX2dldG5hbWVfbnAocHRocmVhZF9zZWxmKCksIG15X25hbWUsIHNpemVvZihteV9uYW1lKSk7Ci0gICAgbmFtZS0+YXBwZW5kKG15X25hbWUpOwotICAgIHByb21pc2UtPnNldF92YWx1ZSgpOwotICB9Ci0KLSAgdm9pZCBTbGVlcEFuZEluY3JlYXNlQ291bnRlcihzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2UsIGludCBzbGVlcF9tcykgewotICAgIHByb21pc2UtPnNldF92YWx1ZSgpOwotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHNsZWVwX21zKSk7Ci0gICAgY291bnRlcl8rKzsKLSAgfQotCi0gIHZvaWQgVmVyaWZ5RGVsYXlUaW1lQW5kU2xlZXAoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbF9tcywgaW50IHNjaGVkdWxlZF90YXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFza19sZW5ndGhfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlKSB7Ci0gICAgYXV0byBlbmRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgIGF1dG8gYWN0dWFsX2RlbGF5ID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCi0gICAgICAgIGVuZF90aW1lIC0gc3RhcnRfdGltZSk7Ci0gICAgY291bnRlcl8rKzsKLSAgICBpbnQ2NF90IHNjaGVkdWxlZF9kZWxheV9tcyA9IGludGVydmFsX21zICogY291bnRlcl87Ci0gICAgaWYgKGNvdW50ZXJfID09IHNjaGVkdWxlZF90YXNrcykgewotICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKCk7Ci0gICAgfQotICAgIEFTU0VSVF9ORUFSKHNjaGVkdWxlZF9kZWxheV9tcywgYWN0dWFsX2RlbGF5LmNvdW50KCksIGRlbGF5X2Vycm9yX21zKTsKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyh0YXNrX2xlbmd0aF9tcykpOwotICB9Ci0KLSAgdm9pZCBWZXJpZnlNdWx0aXBsZURlbGF5ZWRUYXNrcyhpbnQgc2NoZWR1bGVkX3Rhc2tzLCBpbnQgdGFza19sZW5ndGhfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVydmFsX2JldHdlZW5fdGFza3NfbXMpIHsKLSAgICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICAgIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICAgIG1lc3NhZ2VfbG9vcF90aHJlYWQuRW5hYmxlUmVhbFRpbWVTY2hlZHVsaW5nKCk7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIGF1dG8gc3RhcnRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgIHRpbWVyXy0+U2NoZWR1bGVQZXJpb2RpYygKLSAgICAgICAgbWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmUmVwZWF0aW5nVGltZXJUZXN0OjpWZXJpZnlEZWxheVRpbWVBbmRTbGVlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBzdGFydF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsX2JldHdlZW5fdGFza3NfbXMsIHNjaGVkdWxlZF90YXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX2xlbmd0aF9tcywgcHJvbWlzZV8pLAotICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoaW50ZXJ2YWxfYmV0d2Vlbl90YXNrc19tcykpOwotICAgIGZ1dHVyZS5nZXQoKTsKLSAgICB0aW1lcl8tPkNhbmNlbEFuZFdhaXQoKTsKLSAgfQotCi0gIHZvaWQgQ2FuY2VsUmVwZWF0aW5nVGltZXJBbmRXYWl0KCkgeyB0aW1lcl8tPkNhbmNlbEFuZFdhaXQoKTsgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIDo6dGVzdGluZzo6VGVzdDo6U2V0VXAoKTsKLSAgICBjb3VudGVyXyA9IDA7Ci0gICAgdGltZXJfID0gbmV3IFJlcGVhdGluZ1RpbWVyKCk7Ci0gICAgcHJvbWlzZV8gPSBuZXcgc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGlmIChwcm9taXNlXyAhPSBudWxscHRyKSB7Ci0gICAgICBkZWxldGUgcHJvbWlzZV87Ci0gICAgICBwcm9taXNlXyA9IG51bGxwdHI7Ci0gICAgfQotICAgIGlmICh0aW1lcl8gIT0gbnVsbHB0cikgewotICAgICAgZGVsZXRlIHRpbWVyXzsKLSAgICAgIHRpbWVyXyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgaW50IGNvdW50ZXJfOwotICBSZXBlYXRpbmdUaW1lciogdGltZXJfOwotICBzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2VfOwotfTsKLQotVEVTVF9GKFJlcGVhdGluZ1RpbWVyVGVzdCwgaW5pdGlhbF9pc19ub3Rfc2NoZWR1bGVkKSB7Ci0gIEFTU0VSVF9GQUxTRSh0aW1lcl8tPklzU2NoZWR1bGVkKCkpOwotfQotCi1URVNUX0YoUmVwZWF0aW5nVGltZXJUZXN0LCBjYW5jZWxfd2l0aG91dF9zY2hlZHVsaW5nKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAidGVzdF90aHJlYWQiOwotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLQotICBFWFBFQ1RfRkFMU0UodGltZXJfLT5Jc1NjaGVkdWxlZCgpKTsKLSAgdGltZXJfLT5DYW5jZWxBbmRXYWl0KCk7Ci0gIEVYUEVDVF9GQUxTRSh0aW1lcl8tPklzU2NoZWR1bGVkKCkpOwotfQotCi1URVNUX0YoUmVwZWF0aW5nVGltZXJUZXN0LCBwZXJpb2RpY19ydW4pIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gIHVpbnQzMl90IGRlbGF5X21zID0gNTsKLSAgaW50IG51bV90YXNrcyA9IDIwMDsKLQotICB0aW1lcl8tPlNjaGVkdWxlUGVyaW9kaWMoCi0gICAgICBtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmUmVwZWF0aW5nVGltZXJUZXN0OjpJbmNyZWFzZVRhc2tDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBudW1fdGFza3MsIHByb21pc2VfKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhkZWxheV9tcykpOwotICBmdXR1cmUuZ2V0KCk7Ci0gIEFTU0VSVF9HRShjb3VudGVyXywgbnVtX3Rhc2tzKTsKLSAgdGltZXJfLT5DYW5jZWxBbmRXYWl0KCk7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdUaW1lclRlc3QsIHNjaGVkdWxlX3BlcmlvZGljX3Rhc2tfemVyb19pbnRlcnZhbCkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIHVpbnQzMl90IGludGVydmFsX21zID0gMDsKLQotICBBU1NFUlRfRkFMU0UodGltZXJfLT5TY2hlZHVsZVBlcmlvZGljKAotICAgICAgbWVzc2FnZV9sb29wX3RocmVhZC5HZXRXZWFrUHRyKCksIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRSZXBlYXRpbmcoJlJlcGVhdGluZ1RpbWVyVGVzdDo6U2hvdWxkTm90SGFwcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhpbnRlcnZhbF9tcykpKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfZXJyb3JfbXMpKTsKLX0KLQotLy8gVmVyaWZ5IHRoYXQgZGVsZXRpbmcgdGhlIHRpbWVyIHdpdGhvdXQgY2FuY2VsbGluZyBpdCB3aWxsIGNhbmNlbCB0aGUgdGFzawotVEVTVF9GKFJlcGVhdGluZ1RpbWVyVGVzdCwgcGVyaW9kaWNfZGVsZXRlX3dpdGhvdXRfY2FuY2VsKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAidGVzdF90aHJlYWQiOwotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgdWludDMyX3QgZGVsYXlfbXMgPSA1OwotICB0aW1lcl8tPlNjaGVkdWxlUGVyaW9kaWMoCi0gICAgICBtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmUmVwZWF0aW5nVGltZXJUZXN0OjpTaG91bGROb3RIYXBwZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGRlbGF5X21zKSk7Ci0gIGRlbGV0ZSB0aW1lcl87Ci0gIHRpbWVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGRlbGF5X2Vycm9yX21zKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdUaW1lclRlc3QsIGNhbmNlbF9zaW5nbGVfdGFza19uZWFyX2ZpcmVfbm9fcmFjZV9jb25kaXRpb24pIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9ICJ0ZXN0X3RocmVhZCI7Ci0gIE1lc3NhZ2VMb29wVGhyZWFkIG1lc3NhZ2VfbG9vcF90aHJlYWQobmFtZSk7Ci0gIG1lc3NhZ2VfbG9vcF90aHJlYWQuU3RhcnRVcCgpOwotICB1aW50MzJfdCBkZWxheV9tcyA9IDU7Ci0gIHRpbWVyXy0+U2NoZWR1bGVQZXJpb2RpYyhtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RG9Ob3RoaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgdGltZXJfLT5DYW5jZWxBbmRXYWl0KCk7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdUaW1lclRlc3QsIGNhbmNlbF9wZXJpb2RpY190YXNrKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAidGVzdF90aHJlYWQiOwotICBNZXNzYWdlTG9vcFRocmVhZCBtZXNzYWdlX2xvb3BfdGhyZWFkKG5hbWUpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgdWludDMyX3QgZGVsYXlfbXMgPSA1OwotICBpbnQgbnVtX3Rhc2tzID0gNTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotCi0gIHRpbWVyXy0+U2NoZWR1bGVQZXJpb2RpYygKLSAgICAgIG1lc3NhZ2VfbG9vcF90aHJlYWQuR2V0V2Vha1B0cigpLCBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kUmVwZWF0aW5nKCZSZXBlYXRpbmdUaW1lclRlc3Q6OkluY3JlYXNlVGFza0NvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIG51bV90YXNrcywgcHJvbWlzZV8pLAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGRlbGF5X21zKSk7Ci0gIGZ1dHVyZS53YWl0KCk7Ci0gIHRpbWVyXy0+Q2FuY2VsQW5kV2FpdCgpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGRlbGF5X21zICsgZGVsYXlfZXJyb3JfbXMpKTsKLSAgaW50IGNvdW50ZXIgPSBjb3VudGVyXzsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkZWxheV9tcyArIGRlbGF5X2Vycm9yX21zKSk7Ci0gIEFTU0VSVF9FUShjb3VudGVyLCBjb3VudGVyXyk7Ci19Ci0KLS8vIFNjaGVkdWxlIDEwIHNob3J0IHBlcmlvZGljIHRhc2tzIHdpdGggaW50ZXJ2YWwgMSBtcyBiZXR3ZWVuIGVhY2g7IHZlcmlmeSB0aGUKLS8vIGZ1bmN0aW9uYWxpdHkKLVRFU1RfRihSZXBlYXRpbmdUaW1lclRlc3QsIHNjaGVkdWxlX211bHRpcGxlX2RlbGF5ZWRfdGFza3MpIHsKLSAgVmVyaWZ5TXVsdGlwbGVEZWxheWVkVGFza3MoMTAsIDAsIDEpOwotfQotCi0vLyBTY2hlZHVsZSAxMCBwZXJpb2RpYyB0YXNrcyB3aXRoIGludGVydmFsIDIgbXMgYmV0d2VlbiBlYWNoIGFuZCBlYWNoIHRha2VzIDEKLS8vIG1zOyB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkKLVRFU1RfRihSZXBlYXRpbmdUaW1lclRlc3QsIHNjaGVkdWxlX211bHRpcGxlX2RlbGF5ZWRfc2xvd190YXNrcykgewotICBWZXJpZnlNdWx0aXBsZURlbGF5ZWRUYXNrcygxMCwgMSwgMik7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdUaW1lclRlc3QsCi0gICAgICAgbWVzc2FnZV9sb29wX3RocmVhZF9kb3duX2NhbmNlbF9zY2hlZHVsZWRfcGVyaW9kaWNfdGFzaykgewotICBzdGQ6OnN0cmluZyBuYW1lID0gInRlc3RfdGhyZWFkIjsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZChuYW1lKTsKLSAgbWVzc2FnZV9sb29wX3RocmVhZC5TdGFydFVwKCk7Ci0gIHN0ZDo6c3RyaW5nIG15X25hbWU7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgdWludDMyX3QgZGVsYXlfbXMgPSA1OwotICBpbnQgbnVtX3Rhc2tzID0gNTsKLQotICB0aW1lcl8tPlNjaGVkdWxlUGVyaW9kaWMoCi0gICAgICBtZXNzYWdlX2xvb3BfdGhyZWFkLkdldFdlYWtQdHIoKSwgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZFJlcGVhdGluZygmUmVwZWF0aW5nVGltZXJUZXN0OjpJbmNyZWFzZVRhc2tDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBudW1fdGFza3MsIHByb21pc2VfKSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhkZWxheV9tcykpOwotICBmdXR1cmUud2FpdCgpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMgKyBkZWxheV9lcnJvcl9tcykpOwotICBpbnQgY291bnRlciA9IGNvdW50ZXJfOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGRlbGF5X21zICsgZGVsYXlfZXJyb3JfbXMpKTsKLSAgQVNTRVJUX0VRKGNvdW50ZXIsIGNvdW50ZXJfKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9zdGF0ZV9tYWNoaW5lLmggYi9jb21tb24vc3RhdGVfbWFjaGluZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ5MmQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9zdGF0ZV9tYWNoaW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8qKgotICogU3RhdGUgbWFjaGluZSB1c2VkIGJ5IEJsdWV0b290aCBuYXRpdmUgc3RhY2suCi0gKi8KLWNsYXNzIFN0YXRlTWFjaGluZSB7Ci0gcHVibGljOgotICBlbnVtIHsga1N0YXRlSW52YWxpZCA9IC0xIH07Ci0KLSAgLyoqCi0gICAqIEEgY2xhc3MgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZSBpbiB0aGUgU3RhdGUgTWFjaGluZS4KLSAgICovCi0gIGNsYXNzIFN0YXRlIHsKLSAgICBmcmllbmQgY2xhc3MgU3RhdGVNYWNoaW5lOwotCi0gICBwdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc20gdGhlIFN0YXRlIE1hY2hpbmUgdG8gdXNlCi0gICAgICogQHBhcmFtIHN0YXRlX2lkIHRoZSB1bmlxdWUgU3RhdGUgSUQuIEl0IHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuCi0gICAgICovCi0gICAgU3RhdGUoU3RhdGVNYWNoaW5lJiBzbSwgaW50IHN0YXRlX2lkKSA6IHNtXyhzbSksIHN0YXRlX2lkXyhzdGF0ZV9pZCkge30KLQotICAgIHZpcnR1YWwgflN0YXRlKCkgPSBkZWZhdWx0OwotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhbiBldmVudC4KLSAgICAgKiBUT0RPOiBUaGUgYXJndW1lbnRzIGFyZSB3cm9uZyAtIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gICAgICogV2lsbCBiZSByZXBsYWNlZCBsYXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdHlwZQotICAgICAqIEBwYXJhbSBwX2RhdGEgdGhlIGV2ZW50IGRhdGEKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2Nlc3Npbmcgd2FzIGNvbXBsZXRlZCwgb3RoZXJ3aXNlIGZhbHNlCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFN0YXRlIElELgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgU3RhdGUgSUQKLSAgICAgKi8KLSAgICBpbnQgU3RhdGVJZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlX2lkXzsgfQotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYSBzdGF0ZSBpcyBlbnRlcmVkLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBPbkVudGVyKCkge30KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGEgc3RhdGUgaXMgZXhpdGVkLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBPbkV4aXQoKSB7fQotCi0gICAgLyoqCi0gICAgICogVHJhbnNpdGlvbiB0aGUgU3RhdGUgTWFjaGluZSB0byBhIG5ldyBzdGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXN0X3N0YXRlX2lkIHRoZSBzdGF0ZSBJRCB0byB0cmFuc2l0aW9uIHRvLiBJdCBtdXN0IGJlIG9uZQotICAgICAqIG9mIHRoZSB1bmlxdWUgc3RhdGUgSURzIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGUgd2FzIGNyZWF0ZWQuCi0gICAgICovCi0gICAgdm9pZCBUcmFuc2l0aW9uVG8oaW50IGRlc3Rfc3RhdGVfaWQpIHsgc21fLlRyYW5zaXRpb25UbyhkZXN0X3N0YXRlX2lkKTsgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNpdGlvbiB0aGUgU3RhdGUgTWFjaGluZSB0byBhIG5ldyBzdGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXN0X3N0YXRlIHRoZSBzdGF0ZSB0byB0cmFuc2l0aW9uIHRvLiBJdCBjYW5ub3QgYmUgbnVsbHB0ci4KLSAgICAgKi8KLSAgICB2b2lkIFRyYW5zaXRpb25UbyhTdGF0ZU1hY2hpbmU6OlN0YXRlKiBkZXN0X3N0YXRlKSB7Ci0gICAgICBzbV8uVHJhbnNpdGlvblRvKGRlc3Rfc3RhdGUpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBTdGF0ZU1hY2hpbmUmIHNtXzsKLSAgICBpbnQgc3RhdGVfaWRfOwotICB9OwotCi0gIFN0YXRlTWFjaGluZSgpCi0gICAgICA6IGluaXRpYWxfc3RhdGVfKG51bGxwdHIpLAotICAgICAgICBwcmV2aW91c19zdGF0ZV8obnVsbHB0ciksCi0gICAgICAgIGN1cnJlbnRfc3RhdGVfKG51bGxwdHIpIHt9Ci0gIH5TdGF0ZU1hY2hpbmUoKSB7Ci0gICAgZm9yIChhdXRvJiBrdiA6IHN0YXRlc18pIGRlbGV0ZSBrdi5zZWNvbmQ7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgdGhlIFN0YXRlIE1hY2hpbmUgb3BlcmF0aW9uLgotICAgKi8KLSAgdm9pZCBTdGFydCgpIHsgVHJhbnNpdGlvblRvKGluaXRpYWxfc3RhdGVfKTsgfQotCi0gIC8qKgotICAgKiBRdWl0IHRoZSBTdGF0ZSBNYWNoaW5lIG9wZXJhdGlvbi4KLSAgICovCi0gIHZvaWQgUXVpdCgpIHsgcHJldmlvdXNfc3RhdGVfID0gY3VycmVudF9zdGF0ZV8gPSBudWxscHRyOyB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBTdGF0ZSBJRC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY3VycmVudCBTdGF0ZSBJRAotICAgKi8KLSAgaW50IFN0YXRlSWQoKSBjb25zdCB7Ci0gICAgaWYgKGN1cnJlbnRfc3RhdGVfICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBjdXJyZW50X3N0YXRlXy0+U3RhdGVJZCgpOwotICAgIH0KLSAgICByZXR1cm4ga1N0YXRlSW52YWxpZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByZXZpb3VzIGN1cnJlbnQgU3RhdGUgSUQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIFN0YXRlIElECi0gICAqLwotICBpbnQgUHJldmlvdXNTdGF0ZUlkKCkgY29uc3QgewotICAgIGlmIChwcmV2aW91c19zdGF0ZV8gIT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuIHByZXZpb3VzX3N0YXRlXy0+U3RhdGVJZCgpOwotICAgIH0KLSAgICByZXR1cm4ga1N0YXRlSW52YWxpZDsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFuIGV2ZW50LgotICAgKiBUT0RPOiBUaGUgYXJndW1lbnRzIGFyZSB3cm9uZyAtIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gICAqIFdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdHlwZQotICAgKiBAcGFyYW0gcF9kYXRhIHRoZSBldmVudCBkYXRhCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvY2Vzc2luZyB3YXMgY29tcGxldGVkLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgICBpZiAoY3VycmVudF9zdGF0ZV8gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjdXJyZW50X3N0YXRlXy0+UHJvY2Vzc0V2ZW50KGV2ZW50LCBwX2RhdGEpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zaXRpb24gdGhlIFN0YXRlIE1hY2hpbmUgdG8gYSBuZXcgc3RhdGUuCi0gICAqCi0gICAqIEBwYXJhbSBkZXN0X3N0YXRlX2lkIHRoZSBzdGF0ZSBJRCB0byB0cmFuc2l0aW9uIHRvLiBJdCBtdXN0IGJlIG9uZQotICAgKiBvZiB0aGUgdW5pcXVlIHN0YXRlIElEcyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRlIHdhcyBjcmVhdGVkLgotICAgKi8KLSAgdm9pZCBUcmFuc2l0aW9uVG8oaW50IGRlc3Rfc3RhdGVfaWQpIHsKLSAgICBhdXRvIGl0ID0gc3RhdGVzXy5maW5kKGRlc3Rfc3RhdGVfaWQpOwotCi0gICAgQ0hFQ0soaXQgIT0gc3RhdGVzXy5lbmQoKSkgPDwgIlVua25vd24gU3RhdGUgSUQ6ICIgPDwgZGVzdF9zdGF0ZV9pZDsKLSAgICBTdGF0ZSogZGVzdF9zdGF0ZSA9IGl0LT5zZWNvbmQ7Ci0gICAgVHJhbnNpdGlvblRvKGRlc3Rfc3RhdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zaXRpb24gdGhlIFN0YXRlIE1hY2hpbmUgdG8gYSBuZXcgc3RhdGUuCi0gICAqCi0gICAqIEBwYXJhbSBkZXN0X3N0YXRlIHRoZSBzdGF0ZSB0byB0cmFuc2l0aW9uIHRvLiBJdCBjYW5ub3QgYmUgbnVsbHB0ci4KLSAgICovCi0gIHZvaWQgVHJhbnNpdGlvblRvKFN0YXRlTWFjaGluZTo6U3RhdGUqIGRlc3Rfc3RhdGUpIHsKLSAgICBpZiAoY3VycmVudF9zdGF0ZV8gIT0gbnVsbHB0cikgewotICAgICAgY3VycmVudF9zdGF0ZV8tPk9uRXhpdCgpOwotICAgIH0KLSAgICBwcmV2aW91c19zdGF0ZV8gPSBjdXJyZW50X3N0YXRlXzsKLSAgICBjdXJyZW50X3N0YXRlXyA9IGRlc3Rfc3RhdGU7Ci0gICAgY3VycmVudF9zdGF0ZV8tPk9uRW50ZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzdGF0ZSB0byB0aGUgU3RhdGUgTWFjaGluZS4KLSAgICogVGhlIHN0YXRlIG1hY2hpbmUgdGFrZXMgb3duZXJzaGlwIG9uIHRoZSBzdGF0ZSAtIGkuZS4sIHRoZSBzdGF0ZSB3aWxsCi0gICAqIGJlIGRlbGV0ZWQgYnkgdGhlIFN0YXRlIE1hY2hpbmUgaXRzZWxmLgotICAgKgotICAgKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIHRvIGFkZAotICAgKi8KLSAgdm9pZCBBZGRTdGF0ZShTdGF0ZSogc3RhdGUpIHsKLSAgICBzdGF0ZXNfLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdGF0ZS0+U3RhdGVJZCgpLCBzdGF0ZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgU3RhdGUgTWFjaGluZS4KLSAgICoKLSAgICogQHBhcmFtIGluaXRpYWxfc3RhdGUgdGhlIGluaXRpYWwgc3RhdGUKLSAgICovCi0gIHZvaWQgU2V0SW5pdGlhbFN0YXRlKFN0YXRlKiBpbml0aWFsX3N0YXRlKSB7IGluaXRpYWxfc3RhdGVfID0gaW5pdGlhbF9zdGF0ZTsgfQotCi0gcHJpdmF0ZToKLSAgU3RhdGUqIGluaXRpYWxfc3RhdGVfOwotICBTdGF0ZSogcHJldmlvdXNfc3RhdGVfOwotICBTdGF0ZSogY3VycmVudF9zdGF0ZV87Ci0gIHN0ZDo6bWFwPGludCwgU3RhdGUqPiBzdGF0ZXNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9jb21tb24vc3RhdGVfbWFjaGluZV91bml0dGVzdC5jYyBiL2NvbW1vbi9zdGF0ZV9tYWNoaW5lX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZlOTgzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9zdGF0ZV9tYWNoaW5lX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL3N0YXRlX21hY2hpbmUuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlN0YXRlTWFjaGluZTsKLQotbmFtZXNwYWNlIHsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0ludmFsaWRFdmVudCA9IDB4ZmZmZmZmZmY7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtFdmVudFplcm8gPSAwOwotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrRXZlbnRPbmUgPSAxOwotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrRXZlbnRUd28gPSAyOwotCi1zdGF0aWMgY2hhciBkYXRhWmVybyA9IDA7Ci1zdGF0aWMgY2hhciBkYXRhT25lID0gMTsKLXN0YXRpYyBjaGFyIGRhdGFUd28gPSAyOwotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIFN0YXRlTWFjaGluZUltcGwgOiBwdWJsaWMgU3RhdGVNYWNoaW5lIHsKLSBwdWJsaWM6Ci0gIGVudW0gewotICAgIGtTdGF0ZVplcm8sCi0gICAga1N0YXRlT25lLAotICAgIGtTdGF0ZVR3bywKLSAgfTsKLQotICBjbGFzcyBTdGF0ZVplcm8gOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlWmVybyhTdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVaZXJvKSwKLSAgICAgICAgICBvbl9lbnRlcl8oZmFsc2UpLAotICAgICAgICAgIG9uX2V4aXRfKGZhbHNlKSwKLSAgICAgICAgICBldmVudF8oa0ludmFsaWRFdmVudCksCi0gICAgICAgICAgZGF0YV8obnVsbHB0cikge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZSB7Ci0gICAgICBvbl9lbnRlcl8gPSB0cnVlOwotICAgICAgb25fZXhpdF8gPSBmYWxzZTsKLSAgICB9Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZSB7Ci0gICAgICBvbl9leGl0XyA9IHRydWU7Ci0gICAgICBvbl9lbnRlcl8gPSBmYWxzZTsKLSAgICB9Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGUgewotICAgICAgZXZlbnRfID0gZXZlbnQ7Ci0gICAgICBkYXRhXyA9IHBfZGF0YTsKLSAgICAgIFRyYW5zaXRpb25UbyhrU3RhdGVPbmUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBvbl9lbnRlcl87Ci0gICAgYm9vbCBvbl9leGl0XzsKLSAgICB1aW50MzJfdCBldmVudF87Ci0gICAgdm9pZCogZGF0YV87Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVPbmUgOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlT25lKFN0YXRlTWFjaGluZSYgc20pCi0gICAgICAgIDogU3RhdGUoc20sIGtTdGF0ZU9uZSksCi0gICAgICAgICAgb25fZW50ZXJfKGZhbHNlKSwKLSAgICAgICAgICBvbl9leGl0XyhmYWxzZSksCi0gICAgICAgICAgZXZlbnRfKGtJbnZhbGlkRXZlbnQpLAotICAgICAgICAgIGRhdGFfKG51bGxwdHIpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGUgewotICAgICAgb25fZW50ZXJfID0gdHJ1ZTsKLSAgICAgIG9uX2V4aXRfID0gZmFsc2U7Ci0gICAgfQotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGUgewotICAgICAgb25fZXhpdF8gPSB0cnVlOwotICAgICAgb25fZW50ZXJfID0gZmFsc2U7Ci0gICAgfQotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlIHsKLSAgICAgIGV2ZW50XyA9IGV2ZW50OwotICAgICAgZGF0YV8gPSBwX2RhdGE7Ci0gICAgICBUcmFuc2l0aW9uVG8oa1N0YXRlVHdvKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgb25fZW50ZXJfOwotICAgIGJvb2wgb25fZXhpdF87Ci0gICAgdWludDMyX3QgZXZlbnRfOwotICAgIHZvaWQqIGRhdGFfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlVHdvIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZVR3byhTdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVUd28pLAotICAgICAgICAgIG9uX2VudGVyXyhmYWxzZSksCi0gICAgICAgICAgb25fZXhpdF8oZmFsc2UpLAotICAgICAgICAgIGV2ZW50XyhrSW52YWxpZEV2ZW50KSwKLSAgICAgICAgICBkYXRhXyhudWxscHRyKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlIHsKLSAgICAgIG9uX2VudGVyXyA9IHRydWU7Ci0gICAgICBvbl9leGl0XyA9IGZhbHNlOwotICAgIH0KLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlIHsKLSAgICAgIG9uX2V4aXRfID0gdHJ1ZTsKLSAgICAgIG9uX2VudGVyXyA9IGZhbHNlOwotICAgIH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZSB7Ci0gICAgICBldmVudF8gPSBldmVudDsKLSAgICAgIGRhdGFfID0gcF9kYXRhOwotICAgICAgVHJhbnNpdGlvblRvKGtTdGF0ZVplcm8pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBvbl9lbnRlcl87Ci0gICAgYm9vbCBvbl9leGl0XzsKLSAgICB1aW50MzJfdCBldmVudF87Ci0gICAgdm9pZCogZGF0YV87Ci0gIH07Ci0KLSAgU3RhdGVNYWNoaW5lSW1wbCgpIHsKLSAgICBzdGF0ZV96ZXJvXyA9IG5ldyBTdGF0ZVplcm8oKnRoaXMpOwotICAgIHN0YXRlX29uZV8gPSBuZXcgU3RhdGVPbmUoKnRoaXMpOwotICAgIHN0YXRlX3R3b18gPSBuZXcgU3RhdGVUd28oKnRoaXMpOwotCi0gICAgQWRkU3RhdGUoc3RhdGVfemVyb18pOwotICAgIEFkZFN0YXRlKHN0YXRlX29uZV8pOwotICAgIEFkZFN0YXRlKHN0YXRlX3R3b18pOwotICAgIFNldEluaXRpYWxTdGF0ZShzdGF0ZV96ZXJvXyk7Ci0gIH0KLQotICBTdGF0ZVplcm8qIHN0YXRlX3plcm9fOwotICBTdGF0ZU9uZSogc3RhdGVfb25lXzsKLSAgU3RhdGVUd28qIHN0YXRlX3R3b187Ci19OwotCi1jbGFzcyBTdGF0ZU1hY2hpbmVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBTdGF0ZU1hY2hpbmVUZXN0KCkge30KLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzbV8uU3RhcnQoKTsgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IHNtXy5RdWl0KCk7IH0KLQotICBTdGF0ZU1hY2hpbmVJbXBsIHNtXzsKLX07Ci0KLVRFU1RfRihTdGF0ZU1hY2hpbmVUZXN0LCB0ZXN0X2luaXRpYWxfc3RhdGUpIHsKLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVaZXJvLCBzbV8uU3RhdGVJZCgpKTsKLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVJbnZhbGlkLCBzbV8uUHJldmlvdXNTdGF0ZUlkKCkpOwotfQotCi1URVNUX0YoU3RhdGVNYWNoaW5lVGVzdCwgdGVzdF9pbnZhbGlkX3N0YXRlKSB7Ci0gIHNtXy5RdWl0KCk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlSW52YWxpZCwgc21fLlN0YXRlSWQoKSk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlSW52YWxpZCwgc21fLlByZXZpb3VzU3RhdGVJZCgpKTsKLSAgc21fLlN0YXJ0KCk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlWmVybywgc21fLlN0YXRlSWQoKSk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlSW52YWxpZCwgc21fLlByZXZpb3VzU3RhdGVJZCgpKTsKLX0KLQotVEVTVF9GKFN0YXRlTWFjaGluZVRlc3QsIHRlc3RfdHJhbnNpdGlvbl90bykgewotICAvLyBJbml0aWFsIHN0YXRlOiBTdGF0ZVplcm8KLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVaZXJvLCBzbV8uU3RhdGVJZCgpKTsKLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVJbnZhbGlkLCBzbV8uUHJldmlvdXNTdGF0ZUlkKCkpOwotICBBU1NFUlRfVFJVRShzbV8uc3RhdGVfemVyb18tPm9uX2VudGVyXyk7Ci0gIEFTU0VSVF9GQUxTRShzbV8uc3RhdGVfemVyb18tPm9uX2V4aXRfKTsKLQotICAvLyBUcmFuc2l0aW9uIHRvIFN0YXRlT25lCi0gIEFTU0VSVF9GQUxTRShzbV8uc3RhdGVfb25lXy0+b25fZW50ZXJfKTsKLSAgQVNTRVJUX0ZBTFNFKHNtXy5zdGF0ZV9vbmVfLT5vbl9leGl0Xyk7Ci0gIHNtXy5UcmFuc2l0aW9uVG8oc21fLmtTdGF0ZU9uZSk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlT25lLCBzbV8uU3RhdGVJZCgpKTsKLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVaZXJvLCBzbV8uUHJldmlvdXNTdGF0ZUlkKCkpOwotICBBU1NFUlRfVFJVRShzbV8uc3RhdGVfemVyb18tPm9uX2V4aXRfKTsKLSAgQVNTRVJUX1RSVUUoc21fLnN0YXRlX29uZV8tPm9uX2VudGVyXyk7Ci0gIEFTU0VSVF9GQUxTRShzbV8uc3RhdGVfb25lXy0+b25fZXhpdF8pOwotCi0gIC8vIFRyYW5zaXRpb24gdG8gU3RhdGVUd28KLSAgQVNTRVJUX0ZBTFNFKHNtXy5zdGF0ZV90d29fLT5vbl9lbnRlcl8pOwotICBBU1NFUlRfRkFMU0Uoc21fLnN0YXRlX3R3b18tPm9uX2V4aXRfKTsKLSAgc21fLlRyYW5zaXRpb25UbyhzbV8ua1N0YXRlVHdvKTsKLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVUd28sIHNtXy5TdGF0ZUlkKCkpOwotICBBU1NFUlRfRVEoc21fLmtTdGF0ZU9uZSwgc21fLlByZXZpb3VzU3RhdGVJZCgpKTsKLSAgQVNTRVJUX1RSVUUoc21fLnN0YXRlX29uZV8tPm9uX2V4aXRfKTsKLSAgQVNTRVJUX1RSVUUoc21fLnN0YXRlX3R3b18tPm9uX2VudGVyXyk7Ci0gIEFTU0VSVF9GQUxTRShzbV8uc3RhdGVfdHdvXy0+b25fZXhpdF8pOwotfQotCi1URVNUX0YoU3RhdGVNYWNoaW5lVGVzdCwgdGVzdF9wcm9jZXNzX2V2ZW50KSB7Ci0gIC8vIEluaXRpYWwgc3RhdGU6IFN0YXRlWmVybwotICBBU1NFUlRfRVEoc21fLmtTdGF0ZVplcm8sIHNtXy5TdGF0ZUlkKCkpOwotICBBU1NFUlRfRVEoc21fLmtTdGF0ZUludmFsaWQsIHNtXy5QcmV2aW91c1N0YXRlSWQoKSk7Ci0gIEFTU0VSVF9UUlVFKHNtXy5zdGF0ZV96ZXJvXy0+b25fZW50ZXJfKTsKLSAgQVNTRVJUX0ZBTFNFKHNtXy5zdGF0ZV96ZXJvXy0+b25fZXhpdF8pOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX3plcm9fLT5ldmVudF8sIGtJbnZhbGlkRXZlbnQpOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX3plcm9fLT5kYXRhXywgbnVsbHB0cik7Ci0KLSAgLy8gUHJvY2VzcyBhbiBldmVudCBhbmQgdHJhbnNpdGlvbiB0byBTdGF0ZU9uZQotICBBU1NFUlRfRkFMU0Uoc21fLnN0YXRlX29uZV8tPm9uX2VudGVyXyk7Ci0gIEFTU0VSVF9GQUxTRShzbV8uc3RhdGVfb25lXy0+b25fZXhpdF8pOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX29uZV8tPmV2ZW50Xywga0ludmFsaWRFdmVudCk7Ci0gIEFTU0VSVF9FUShzbV8uc3RhdGVfb25lXy0+ZGF0YV8sIG51bGxwdHIpOwotICBBU1NFUlRfVFJVRShzbV8uUHJvY2Vzc0V2ZW50KGtFdmVudFplcm8sICZkYXRhWmVybykpOwotICBBU1NFUlRfRVEoc21fLmtTdGF0ZU9uZSwgc21fLlN0YXRlSWQoKSk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlWmVybywgc21fLlByZXZpb3VzU3RhdGVJZCgpKTsKLSAgLy8gQ2hlY2sgU3RhdGVaZXJvCi0gIEFTU0VSVF9FUShzbV8uc3RhdGVfemVyb18tPmV2ZW50Xywga0V2ZW50WmVybyk7Ci0gIEFTU0VSVF9FUShzbV8uc3RhdGVfemVyb18tPmRhdGFfLCAmZGF0YVplcm8pOwotICBBU1NFUlRfVFJVRShzbV8uc3RhdGVfemVyb18tPm9uX2V4aXRfKTsKLSAgLy8gQ2hlY2sgU3RhdGVPbmUKLSAgQVNTRVJUX1RSVUUoc21fLnN0YXRlX29uZV8tPm9uX2VudGVyXyk7Ci0gIEFTU0VSVF9GQUxTRShzbV8uc3RhdGVfb25lXy0+b25fZXhpdF8pOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX29uZV8tPmV2ZW50Xywga0ludmFsaWRFdmVudCk7Ci0gIEFTU0VSVF9FUShzbV8uc3RhdGVfb25lXy0+ZGF0YV8sIG51bGxwdHIpOwotCi0gIC8vIFByb2Nlc3MgYW4gZXZlbnQgYW5kIHRyYW5zaXRpb24gdG8gU3RhdGVUd28KLSAgQVNTRVJUX0ZBTFNFKHNtXy5zdGF0ZV90d29fLT5vbl9lbnRlcl8pOwotICBBU1NFUlRfRkFMU0Uoc21fLnN0YXRlX3R3b18tPm9uX2V4aXRfKTsKLSAgQVNTRVJUX0VRKHNtXy5zdGF0ZV90d29fLT5ldmVudF8sIGtJbnZhbGlkRXZlbnQpOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX3R3b18tPmRhdGFfLCBudWxscHRyKTsKLSAgQVNTRVJUX1RSVUUoc21fLlByb2Nlc3NFdmVudChrRXZlbnRPbmUsICZkYXRhT25lKSk7Ci0gIEFTU0VSVF9FUShzbV8ua1N0YXRlVHdvLCBzbV8uU3RhdGVJZCgpKTsKLSAgQVNTRVJUX0VRKHNtXy5rU3RhdGVPbmUsIHNtXy5QcmV2aW91c1N0YXRlSWQoKSk7Ci0gIC8vIENoZWNrIFN0YXRlT25lCi0gIEFTU0VSVF9FUShzbV8uc3RhdGVfb25lXy0+ZXZlbnRfLCBrRXZlbnRPbmUpOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX29uZV8tPmRhdGFfLCAmZGF0YU9uZSk7Ci0gIEFTU0VSVF9UUlVFKHNtXy5zdGF0ZV9vbmVfLT5vbl9leGl0Xyk7Ci0gIC8vIENoZWNrIFN0YXRlVHdvCi0gIEFTU0VSVF9UUlVFKHNtXy5zdGF0ZV90d29fLT5vbl9lbnRlcl8pOwotICBBU1NFUlRfRkFMU0Uoc21fLnN0YXRlX3R3b18tPm9uX2V4aXRfKTsKLSAgQVNTRVJUX0VRKHNtXy5zdGF0ZV90d29fLT5ldmVudF8sIGtJbnZhbGlkRXZlbnQpOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX3R3b18tPmRhdGFfLCBudWxscHRyKTsKLQotICAvLyBQcm9jZXNzIGFuIGV2ZW50IGFuZCB0cmFuc2l0aW9uIHRvIFN0YXRlWmVybwotICAvLyBOT1RFOiBTdGF0ZVplcm8gd2FzIGV4aXRlZCBiZWZvcmUgYW5kIGhhcyBsb2NhbCBzdGF0ZQotICBBU1NFUlRfRkFMU0Uoc21fLnN0YXRlX3plcm9fLT5vbl9lbnRlcl8pOwotICBBU1NFUlRfVFJVRShzbV8uc3RhdGVfemVyb18tPm9uX2V4aXRfKTsgIC8vIE5PVEU6IGFscmVhZHkgZXhpdGVkIGJlZm9yZQotICBBU1NFUlRfRVEoc21fLnN0YXRlX3plcm9fLT5ldmVudF8sIGtFdmVudFplcm8pOyAgLy8gTk9URTogc3RhdGUgZnJvbSBiZWZvcmUKLSAgQVNTRVJUX0VRKHNtXy5zdGF0ZV96ZXJvXy0+ZGF0YV8sICZkYXRhWmVybyk7ICAgIC8vIE5PVEU6IHN0YXRlIGZyb20gYmVmb3JlCi0gIEFTU0VSVF9UUlVFKHNtXy5Qcm9jZXNzRXZlbnQoa0V2ZW50VHdvLCAmZGF0YVR3bykpOwotICBBU1NFUlRfRVEoc21fLmtTdGF0ZVplcm8sIHNtXy5TdGF0ZUlkKCkpOwotICBBU1NFUlRfRVEoc21fLmtTdGF0ZVR3bywgc21fLlByZXZpb3VzU3RhdGVJZCgpKTsKLSAgLy8gQ2hlY2sgU3RhdGVUd28KLSAgQVNTRVJUX0VRKHNtXy5zdGF0ZV90d29fLT5ldmVudF8sIGtFdmVudFR3byk7Ci0gIEFTU0VSVF9FUShzbV8uc3RhdGVfdHdvXy0+ZGF0YV8sICZkYXRhVHdvKTsKLSAgQVNTRVJUX1RSVUUoc21fLnN0YXRlX3R3b18tPm9uX2V4aXRfKTsKLSAgLy8gQ2hlY2sgU3RhdGVaZXJvCi0gIEFTU0VSVF9UUlVFKHNtXy5zdGF0ZV96ZXJvXy0+b25fZW50ZXJfKTsKLSAgQVNTRVJUX0ZBTFNFKHNtXy5zdGF0ZV96ZXJvXy0+b25fZXhpdF8pOwotICBBU1NFUlRfRVEoc21fLnN0YXRlX3plcm9fLT5ldmVudF8sIGtFdmVudFplcm8pOyAgLy8gTk9URTogc3RhdGUgZnJvbSBiZWZvcmUKLSAgQVNTRVJUX0VRKHNtXy5zdGF0ZV96ZXJvXy0+ZGF0YV8sICZkYXRhWmVybyk7ICAgIC8vIE5PVEU6IHN0YXRlIGZyb20gYmVmb3JlCi19CmRpZmYgLS1naXQgYS9jb21tb24vc3RvcF93YXRjaF9sZWdhY3kuY2MgYi9jb21tb24vc3RvcF93YXRjaF9sZWdhY3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDhiYTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3N0b3Bfd2F0Y2hfbGVnYWN5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQnRTdG9wV2F0Y2hMZWdhY3kiCi0KLSNpbmNsdWRlICJjb21tb24vc3RvcF93YXRjaF9sZWdhY3kuaCIKLQotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXN0YXRpYyBjb25zdCBpbnQgTE9HX0JVRkZFUl9MRU5HVEggPSAxMDsKLXN0YXRpYyBzdGQ6OmFycmF5PFN0b3BXYXRjaExvZywgTE9HX0JVRkZFUl9MRU5HVEg+IHN0b3B3YXRjaF9sb2dzOwotc3RhdGljIGludCBjdXJyZW50X2J1ZmZlcl9pbmRleDsKLXN0YXRpYyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBzdG9wd2F0Y2hfbG9nX211dGV4OwotCi12b2lkIFN0b3BXYXRjaExlZ2FjeTo6UmVjb3JkTG9nKFN0b3BXYXRjaExvZyBsb2cpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzdG9wd2F0Y2hfbG9nX211dGV4LCBzdGQ6OmRlZmVyX2xvY2spOwotICBpZiAoIWxvY2sudHJ5X2xvY2soKSkgewotICAgIExPR19JTkZPKCJ0cnlfbG9jayBmYWlsLiBsb2cgY29udGVudDogJXMsIHRvb2sgJXp1IHVzIiwgbG9nLm1lc3NhZ2UuY19zdHIoKSwKLSAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KAotICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPigKLSAgICAgICAgICAgICAgICAgICAgIHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5lbmRfdGltZXN0YW1wIC0KLSAgICAgICAgICAgICAgICAgICAgIHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5zdGFydF90aW1lc3RhbXApCi0gICAgICAgICAgICAgICAgICAgICAuY291bnQoKSkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoY3VycmVudF9idWZmZXJfaW5kZXggPj0gTE9HX0JVRkZFUl9MRU5HVEgpIHsKLSAgICBjdXJyZW50X2J1ZmZlcl9pbmRleCA9IDA7Ci0gIH0KLSAgc3RvcHdhdGNoX2xvZ3NbY3VycmVudF9idWZmZXJfaW5kZXhdID0gc3RkOjptb3ZlKGxvZyk7Ci0gIGN1cnJlbnRfYnVmZmVyX2luZGV4Kys7Ci0gIGxvY2sudW5sb2NrKCk7Ci19Ci0KLXZvaWQgU3RvcFdhdGNoTGVnYWN5OjpEdW1wU3RvcFdhdGNoTG9nKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc3RvcHdhdGNoX2xvZ19tdXRleCk7Ci0gIExPR19JTkZPKCI9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09Iik7Ci0gIExPR19JTkZPKCJibHVldG9vdGggc3RvcHdhdGNoIGxvZyBoaXN0b3J5OiIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IExPR19CVUZGRVJfTEVOR1RIOyBpKyspIHsKLSAgICBpZiAoY3VycmVudF9idWZmZXJfaW5kZXggPj0gTE9HX0JVRkZFUl9MRU5HVEgpIHsKLSAgICAgIGN1cnJlbnRfYnVmZmVyX2luZGV4ID0gMDsKLSAgICB9Ci0gICAgaWYgKHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5tZXNzYWdlLmVtcHR5KCkpIHsKLSAgICAgIGN1cnJlbnRfYnVmZmVyX2luZGV4Kys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgYXV0byBub3cgPSBzdG9wd2F0Y2hfbG9nc1tjdXJyZW50X2J1ZmZlcl9pbmRleF0udGltZXN0YW1wOwotICAgIGF1dG8gbWlsbGlzID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCi0gICAgICAgICAgICAgICAgICAgICAgbm93LnRpbWVfc2luY2VfZXBvY2goKSkgJQotICAgICAgICAgICAgICAgICAgMTAwMDsKLSAgICBhdXRvIG5vd190aW1lX3QgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3Qobm93KTsKLSAgICBzcyA8PCBzdGQ6OnB1dF90aW1lKHN0ZDo6bG9jYWx0aW1lKCZub3dfdGltZV90KSwgIiVZLSVtLSVkICVIOiVNOiVTIik7Ci0gICAgc3MgPDwgJy4nIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygzKSA8PCBtaWxsaXMuY291bnQoKTsKLSAgICBzdGQ6OnN0cmluZyBzdGFydF90aW1lc3RhbXAgPSBzcy5zdHIoKTsKLSAgICBMT0dfSU5GTygiJXM6ICVzOiB0b29rICV6dSB1cyIsIHN0YXJ0X3RpbWVzdGFtcC5jX3N0cigpLAotICAgICAgICAgICAgIHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5tZXNzYWdlLmNfc3RyKCksCi0gICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PigKLSAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oCi0gICAgICAgICAgICAgICAgICAgICBzdG9wd2F0Y2hfbG9nc1tjdXJyZW50X2J1ZmZlcl9pbmRleF0uZW5kX3RpbWVzdGFtcCAtCi0gICAgICAgICAgICAgICAgICAgICBzdG9wd2F0Y2hfbG9nc1tjdXJyZW50X2J1ZmZlcl9pbmRleF0uc3RhcnRfdGltZXN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgLmNvdW50KCkpKTsKLSAgICBjdXJyZW50X2J1ZmZlcl9pbmRleCsrOwotICB9Ci0gIExPR19JTkZPKCI9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09Iik7Ci19Ci0KLVN0b3BXYXRjaExlZ2FjeTo6U3RvcFdhdGNoTGVnYWN5KHN0ZDo6c3RyaW5nIHRleHQpCi0gICAgOiB0ZXh0XyhzdGQ6Om1vdmUodGV4dCkpLAotICAgICAgdGltZXN0YW1wXyhzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSksCi0gICAgICBzdGFydF90aW1lc3RhbXBfKHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpKSB7fQotCi1TdG9wV2F0Y2hMZWdhY3k6On5TdG9wV2F0Y2hMZWdhY3koKSB7Ci0gIFN0b3BXYXRjaExvZyBzd19sb2c7Ci0gIHN3X2xvZy50aW1lc3RhbXAgPSB0aW1lc3RhbXBfOwotICBzd19sb2cuc3RhcnRfdGltZXN0YW1wID0gc3RhcnRfdGltZXN0YW1wXzsKLSAgc3dfbG9nLmVuZF90aW1lc3RhbXAgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgc3dfbG9nLm1lc3NhZ2UgPSBzdGQ6Om1vdmUodGV4dF8pOwotCi0gIFJlY29yZExvZyhzdGQ6Om1vdmUoc3dfbG9nKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2NvbW1vbi9zdG9wX3dhdGNoX2xlZ2FjeS5oIGIvY29tbW9uL3N0b3Bfd2F0Y2hfbGVnYWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzNkOTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3N0b3Bfd2F0Y2hfbGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0aW1lc3RhbXA7Ci0gIHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZXN0YW1wOwotICBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IGVuZF90aW1lc3RhbXA7Ci0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7Ci19IFN0b3BXYXRjaExvZzsKLQotY2xhc3MgU3RvcFdhdGNoTGVnYWN5IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIER1bXBTdG9wV2F0Y2hMb2codm9pZCk7Ci0gIFN0b3BXYXRjaExlZ2FjeShzdGQ6OnN0cmluZyB0ZXh0KTsKLSAgflN0b3BXYXRjaExlZ2FjeSgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgdGV4dF87Ci0gIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgdGltZXN0YW1wXzsKLSAgc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lc3RhbXBfOwotICB2b2lkIFJlY29yZExvZyhTdG9wV2F0Y2hMb2cgbG9nKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0L3RocmVhZF9wZXJmb3JtYW5jZV90ZXN0LmNjIGIvY29tbW9uL3Rlc3QvdGhyZWFkX3BlcmZvcm1hbmNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWIxMDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3QvdGhyZWFkX3BlcmZvcm1hbmNlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvcnVuX2xvb3AuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZDsKLQotI2RlZmluZSBOVU1fTUVTU0FHRVNfVE9fU0VORCAxMDAwMDAKLQotdm9sYXRpbGUgc3RhdGljIGludCBnX2NvdW50ZXIgPSAwOwotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+IGdfY291bnRlcl9wcm9taXNlID0gbnVsbHB0cjsKLQotdm9pZCBjYWxsYmFja19iYXRjaChmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgewotICBpZiAocXVldWUgIT0gbnVsbHB0cikgewotICAgIGZpeGVkX3F1ZXVlX2RlcXVldWUocXVldWUpOwotICB9Ci0gIGdfY291bnRlcisrOwotICBpZiAoZ19jb3VudGVyID49IE5VTV9NRVNTQUdFU19UT19TRU5EKSB7Ci0gICAgZ19jb3VudGVyX3Byb21pc2UtPnNldF92YWx1ZSgpOwotICB9Ci19Ci0KLWNsYXNzIFBlcmZvcm1hbmNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgc2V0X3VwX3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgZ19jb3VudGVyID0gMDsKLSAgICBidF9tc2dfcXVldWVfID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgfQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGZpeGVkX3F1ZXVlX2ZyZWUoYnRfbXNnX3F1ZXVlXywgbnVsbHB0cik7Ci0gICAgYnRfbXNnX3F1ZXVlXyA9IG51bGxwdHI7Ci0gICAgc2V0X3VwX3Byb21pc2VfLnJlc2V0KG51bGxwdHIpOwotICAgIGdfY291bnRlcl9wcm9taXNlLnJlc2V0KG51bGxwdHIpOwotICB9Ci0gIGZpeGVkX3F1ZXVlX3QqIGJ0X21zZ19xdWV1ZV8gPSBudWxscHRyOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBzZXRfdXBfcHJvbWlzZV8gPSBudWxscHRyOwotfTsKLQotY2xhc3MgTWVzc2FnZUxvb3BQZXJmb3JtYW5jZVRlc3QgOiBwdWJsaWMgUGVyZm9ybWFuY2VUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFJ1blRocmVhZCh2b2lkKiBjb250ZXh0KSB7Ci0gICAgYXV0byB0ZXN0ID0gc3RhdGljX2Nhc3Q8TWVzc2FnZUxvb3BQZXJmb3JtYW5jZVRlc3QqPihjb250ZXh0KTsKLSAgICB0ZXN0LT5SdW5NZXNzYWdlTG9vcCgpOwotICB9Ci0gIHN0YXRpYyB2b2lkKiBSdW5QVGhyZWFkKHZvaWQqIGNvbnRleHQpIHsKLSAgICBhdXRvIHRlc3QgPSBzdGF0aWNfY2FzdDxNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdCo+KGNvbnRleHQpOwotICAgIHRlc3QtPlJ1bk1lc3NhZ2VMb29wKCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgdm9pZCBSdW5NZXNzYWdlTG9vcCgpIHsKLSAgICBtZXNzYWdlX2xvb3BfID0gbmV3IGJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcCgpOwotICAgIHJ1bl9sb29wXyA9IG5ldyBiYXNlOjpSdW5Mb29wKCk7Ci0gICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHNldF91cF9wcm9taXNlXy5nZXQoKSkpKTsKLSAgICBydW5fbG9vcF8tPlJ1bigpOwotICAgIGRlbGV0ZSBtZXNzYWdlX2xvb3BfOwotICAgIG1lc3NhZ2VfbG9vcF8gPSBudWxscHRyOwotICAgIGRlbGV0ZSBydW5fbG9vcF87Ci0gICAgcnVuX2xvb3BfID0gbnVsbHB0cjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcF8gPSBudWxscHRyOwotICBiYXNlOjpSdW5Mb29wKiBydW5fbG9vcF8gPSBudWxscHRyOwotfTsKLQotY2xhc3MgT3NpVGhyZWFkTWVzc2FnZUxvb3BQZXJmb3JtYW5jZVRlc3QgOiBwdWJsaWMgTWVzc2FnZUxvb3BQZXJmb3JtYW5jZVRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdDo6U2V0VXAoKTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBzZXRfdXBfZnV0dXJlID0gc2V0X3VwX3Byb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gICAgdGhyZWFkXyA9IHRocmVhZF9uZXcoIk9zaVRocmVhZE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0IHRocmVhZCIpOwotICAgIHRocmVhZF9wb3N0KHRocmVhZF8sICZNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdDo6UnVuVGhyZWFkLCB0aGlzKTsKLSAgICBzZXRfdXBfZnV0dXJlLndhaXQoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9sb29wXy0+UXVpdFdoZW5JZGxlQ2xvc3VyZSgpKTsKLSAgICB0aHJlYWRfZnJlZSh0aHJlYWRfKTsKLSAgICB0aHJlYWRfID0gbnVsbHB0cjsKLSAgICBNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdDo6VGVhckRvd24oKTsKLSAgfQotCi0gIHRocmVhZF90KiB0aHJlYWRfID0gbnVsbHB0cjsKLX07Ci0KLVRFU1RfRihPc2lUaHJlYWRNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdCwgbWVzc2FnZV9sb29wX3NwZWVkX3Rlc3QpIHsKLSAgZ19jb3VudGVyID0gMDsKLSAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0X3RpbWUgPQotICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTUVTU0FHRVNfVE9fU0VORDsgaSsrKSB7Ci0gICAgZml4ZWRfcXVldWVfZW5xdWV1ZShidF9tc2dfcXVldWVfLCAodm9pZCopJmdfY291bnRlcik7Ci0gICAgbWVzc2FnZV9sb29wXy0+dGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmY2FsbGJhY2tfYmF0Y2gsIGJ0X21zZ19xdWV1ZV8sIG51bGxwdHIpKTsKLSAgfQotICBjb3VudGVyX2Z1dHVyZS53YWl0KCk7Ci0KLSAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBlbmRfdGltZSA9Ci0gICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBkdXJhdGlvbiA9Ci0gICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmRfdGltZSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF90aW1lKTsKLQotICBMT0coSU5GTykgPDwgIk9zaVRocmVhZE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0LCAiIDw8IGR1cmF0aW9uLmNvdW50KCkKLSAgICAgICAgICAgIDw8ICIgbXMsICIgPDwgTlVNX01FU1NBR0VTX1RPX1NFTkQgPDwgIiBtZXNzYWdlcyI7Ci19Ci0KLWNsYXNzIFN0bFRocmVhZE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0IDogcHVibGljIE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgTWVzc2FnZUxvb3BQZXJmb3JtYW5jZVRlc3Q6OlNldFVwKCk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gc2V0X3VwX2Z1dHVyZSA9IHNldF91cF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIHRocmVhZF8gPSBuZXcgc3RkOjp0aHJlYWQoJk1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0OjpSdW5UaHJlYWQsIHRoaXMpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2xvb3BfLT5RdWl0V2hlbklkbGVDbG9zdXJlKCkpOwotICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgICB0aHJlYWRfID0gbnVsbHB0cjsKLSAgICBNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdDo6VGVhckRvd24oKTsKLSAgfQotCi0gIHN0ZDo6dGhyZWFkKiB0aHJlYWRfID0gbnVsbHB0cjsKLX07Ci0KLVRFU1RfRihTdGxUaHJlYWRNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdCwgc3RsX3RocmVhZF9zcGVlZF90ZXN0KSB7Ci0gIGdfY291bnRlciA9IDA7Ci0gIGdfY291bnRlcl9wcm9taXNlID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gZ19jb3VudGVyX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX01FU1NBR0VTX1RPX1NFTkQ7IGkrKykgewotICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICAgIG1lc3NhZ2VfbG9vcF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmNhbGxiYWNrX2JhdGNoLCBidF9tc2dfcXVldWVfLCBudWxscHRyKSk7Ci0gIH0KLSAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotCi0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgZW5kX3RpbWUgPQotICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZHVyYXRpb24gPQotICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oZW5kX3RpbWUgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfdGltZSk7Ci0KLSAgTE9HKElORk8pIDw8ICJTdGxUaHJlYWRNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdCwgIiA8PCBkdXJhdGlvbi5jb3VudCgpCi0gICAgICAgICAgICA8PCAiIG1zLCAiIDw8IE5VTV9NRVNTQUdFU19UT19TRU5EIDw8ICIgbWVzc2FnZXMiOwotfQotCi1jbGFzcyBQb3NpeFRocmVhZE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0Ci0gICAgOiBwdWJsaWMgTWVzc2FnZUxvb3BQZXJmb3JtYW5jZVRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdDo6U2V0VXAoKTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBzZXRfdXBfZnV0dXJlID0gc2V0X3VwX3Byb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF8sIG51bGxwdHIsICZNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdDo6UnVuUFRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAodm9pZCopdGhpcyk7Ci0gICAgc2V0X3VwX2Z1dHVyZS53YWl0KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIG1lc3NhZ2VfbG9vcF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fbG9vcF8tPlF1aXRXaGVuSWRsZUNsb3N1cmUoKSk7Ci0gICAgcHRocmVhZF9qb2luKHRocmVhZF8sIG51bGxwdHIpOwotICAgIE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgcHRocmVhZF90IHRocmVhZF8gPSAtMTsKLX07Ci0KLVRFU1RfRihQb3NpeFRocmVhZE1lc3NhZ2VMb29wUGVyZm9ybWFuY2VUZXN0LCBzdGxfdGhyZWFkX3NwZWVkX3Rlc3QpIHsKLSAgZ19jb3VudGVyID0gMDsKLSAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotCi0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZSA9Ci0gICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGJ0X21zZ19xdWV1ZV8sICh2b2lkKikmZ19jb3VudGVyKTsKLSAgICBtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZjYWxsYmFja19iYXRjaCwgYnRfbXNnX3F1ZXVlXywgbnVsbHB0cikpOwotICB9Ci0gIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLQotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGVuZF90aW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGR1cmF0aW9uID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGVuZF90aW1lIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWUpOwotCi0gIExPRyhJTkZPKSA8PCAiUG9zaXhUaHJlYWRNZXNzYWdlTG9vcFBlcmZvcm1hbmNlVGVzdCwgIiA8PCBkdXJhdGlvbi5jb3VudCgpCi0gICAgICAgICAgICA8PCAiIG1zLCAiIDw8IE5VTV9NRVNTQUdFU19UT19TRU5EIDw8ICIgbWVzc2FnZXMiOwotfQotCi1jbGFzcyBSZWFjdG9yUGVyZm9ybWFuY2VUZXN0IDogcHVibGljIFBlcmZvcm1hbmNlVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIFBlcmZvcm1hbmNlVGVzdDo6U2V0VXAoKTsKLSAgICB0aHJlYWRfID0gdGhyZWFkX25ldygiUmVhY3RvclBlcmZvcm1hbmNlVGVzdCB0aHJlYWQiKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkX2ZyZWUodGhyZWFkXyk7Ci0gICAgdGhyZWFkXyA9IG51bGxwdHI7Ci0gICAgUGVyZm9ybWFuY2VUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgdGhyZWFkX3QqIHRocmVhZF8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKFJlYWN0b3JQZXJmb3JtYW5jZVRlc3QsIHJlYWN0b3JfdGhyZWFkX3NwZWVkX3Rlc3QpIHsKLSAgZ19jb3VudGVyID0gMDsKLSAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotICBmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlKGJ0X21zZ19xdWV1ZV8sIHRocmVhZF9nZXRfcmVhY3Rvcih0aHJlYWRfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19iYXRjaCwgbnVsbHB0cik7Ci0KLSAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX01FU1NBR0VTX1RPX1NFTkQ7IGkrKykgewotICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICB9Ci0gIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLQotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGVuZF90aW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGR1cmF0aW9uID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGVuZF90aW1lIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWUpOwotICBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUoYnRfbXNnX3F1ZXVlXyk7Ci0KLSAgTE9HKElORk8pIDw8ICJSZWFjdG9yUGVyZm9ybWFuY2VUZXN0LCAiIDw8IGR1cmF0aW9uLmNvdW50KCkgPDwgIiBtcywgIgotICAgICAgICAgICAgPDwgTlVNX01FU1NBR0VTX1RPX1NFTkQgPDwgIiBtZXNzYWdlcyI7Ci19Ci0KLWNsYXNzIFdvcmtlclRocmVhZFBlcmZvcm1hbmNlVGVzdCA6IHB1YmxpYyBQZXJmb3JtYW5jZVRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBQZXJmb3JtYW5jZVRlc3Q6OlNldFVwKCk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gc2V0X3VwX2Z1dHVyZSA9IHNldF91cF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIHdvcmtlcl90aHJlYWRfID0KLSAgICAgICAgbmV3IE1lc3NhZ2VMb29wVGhyZWFkKCJXb3JrZXJUaHJlYWRQZXJmb3JtYW5jZVRlc3QgdGhyZWFkIik7Ci0gICAgd29ya2VyX3RocmVhZF8tPlN0YXJ0VXAoKTsKLSAgICB3b3JrZXJfdGhyZWFkXy0+RG9JblRocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2V0X3VwX3Byb21pc2VfLmdldCgpKSkpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICB3b3JrZXJfdGhyZWFkXy0+U2h1dERvd24oKTsKLSAgICBkZWxldGUgd29ya2VyX3RocmVhZF87Ci0gICAgd29ya2VyX3RocmVhZF8gPSBudWxscHRyOwotICAgIFBlcmZvcm1hbmNlVGVzdDo6VGVhckRvd24oKTsKLSAgfQotCi0gIE1lc3NhZ2VMb29wVGhyZWFkKiB3b3JrZXJfdGhyZWFkXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoV29ya2VyVGhyZWFkUGVyZm9ybWFuY2VUZXN0LCB3b3JrZXJfdGhyZWFkX3NwZWVkX3Rlc3QpIHsKLSAgZ19jb3VudGVyID0gMDsKLSAgZ19jb3VudGVyX3Byb21pc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gY291bnRlcl9mdXR1cmUgPSBnX2NvdW50ZXJfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotCi0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZSA9Ci0gICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NRVNTQUdFU19UT19TRU5EOyBpKyspIHsKLSAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGJ0X21zZ19xdWV1ZV8sICh2b2lkKikmZ19jb3VudGVyKTsKLSAgICB3b3JrZXJfdGhyZWFkXy0+RG9JblRocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZjYWxsYmFja19iYXRjaCwgYnRfbXNnX3F1ZXVlXywgbnVsbHB0cikpOwotICB9Ci0gIGNvdW50ZXJfZnV0dXJlLndhaXQoKTsKLQotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGVuZF90aW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGR1cmF0aW9uID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGVuZF90aW1lIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWUpOwotCi0gIExPRyhJTkZPKSA8PCAiV29ya2VyVGhyZWFkUGVyZm9ybWFuY2VUZXN0LCAiIDw8IGR1cmF0aW9uLmNvdW50KCkgPDwgIiBtcywgIgotICAgICAgICAgICAgPDwgTlVNX01FU1NBR0VTX1RPX1NFTkQgPDwgIiBtZXNzYWdlcyI7Ci19Ci0KLWNsYXNzIExpYkNocm9tZVRocmVhZFBlcmZvcm1hbmNlVGVzdCA6IHB1YmxpYyBQZXJmb3JtYW5jZVRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBQZXJmb3JtYW5jZVRlc3Q6OlNldFVwKCk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gc2V0X3VwX2Z1dHVyZSA9IHNldF91cF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIHRocmVhZF8gPSBuZXcgYmFzZTo6VGhyZWFkKCJMaWJDaHJvbWVUaHJlYWRQZXJmb3JtYW5jZVRlc3QgdGhyZWFkIik7Ci0gICAgdGhyZWFkXy0+U3RhcnQoKTsKLSAgICB0aHJlYWRfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2V0X3VwX3Byb21pc2VfLmdldCgpKSkpOwotICAgIHNldF91cF9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfLT5TdG9wKCk7Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gICAgdGhyZWFkXyA9IG51bGxwdHI7Ci0gICAgUGVyZm9ybWFuY2VUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgYmFzZTo6VGhyZWFkKiB0aHJlYWRfID0gbnVsbHB0cjsKLX07Ci0KLVRFU1RfRihMaWJDaHJvbWVUaHJlYWRQZXJmb3JtYW5jZVRlc3QsIHdvcmtlcl90aHJlYWRfc3BlZWRfdGVzdCkgewotICBnX2NvdW50ZXIgPSAwOwotICBnX2NvdW50ZXJfcHJvbWlzZSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGdfY291bnRlcl9wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0KLSAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX01FU1NBR0VTX1RPX1NFTkQ7IGkrKykgewotICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRfbXNnX3F1ZXVlXywgKHZvaWQqKSZnX2NvdW50ZXIpOwotICAgIHRocmVhZF8tPnRhc2tfcnVubmVyKCktPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmNhbGxiYWNrX2JhdGNoLCBidF9tc2dfcXVldWVfLCBudWxscHRyKSk7Ci0gIH0KLSAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotCi0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgZW5kX3RpbWUgPQotICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZHVyYXRpb24gPQotICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oZW5kX3RpbWUgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfdGltZSk7Ci0KLSAgTE9HKElORk8pIDw8ICJMaWJDaHJvbWVUaHJlYWRQZXJmb3JtYW5jZVRlc3QsICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiIG1zLCAiCi0gICAgICAgICAgICA8PCBOVU1fTUVTU0FHRVNfVE9fU0VORCA8PCAiIG1lc3NhZ2VzIjsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90aW1lX3V0aWwuY2MgYi9jb21tb24vdGltZV91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNiZTE4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90aW1lX3V0aWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSBjb21tb24gewotCi11aW50NjRfdCB0aW1lX2dldF9vc19ib290dGltZV9tcygpIHsgcmV0dXJuIHRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCkgLyAxMDAwOyB9Ci0KLXVpbnQ2NF90IHRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCkgewotICBzdHJ1Y3QgdGltZXNwZWMgdHNfbm93ID0ge307Ci0gIGNsb2NrX2dldHRpbWUoQ0xPQ0tfQk9PVFRJTUUsICZ0c19ub3cpOwotCi0gIHJldHVybiAoKHVpbnQ2NF90KXRzX25vdy50dl9zZWMgKiAxMDAwMDAwTCkgKwotICAgICAgICAgKCh1aW50NjRfdCl0c19ub3cudHZfbnNlYyAvIDEwMDApOwotfQotCi11aW50NjRfdCB0aW1lX2dldHRpbWVvZmRheV91cygpIHsKLSAgc3RydWN0IHRpbWV2YWwgdHYgPSB7fTsKLSAgZ2V0dGltZW9mZGF5KCZ0diwgbnVsbHB0cik7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4odHYudHZfc2VjKSAqIDEwMDAwMDBVTEwgKwotICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHR2LnR2X3VzZWMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vdGltZV91dGlsLmggYi9jb21tb24vdGltZV91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTY0ZDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3RpbWVfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotLy8gR2V0IHRoZSBPUyBib290IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgotdWludDY0X3QgdGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKTsKLQotLy8gR2V0IHRoZSBPUyBib290IHRpbWUgaW4gbWljcm9zZWNvbmRzLgotdWludDY0X3QgdGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLQotLy8gR2V0IHRoZSBjdXJyZW50IHdhbGwgY2xvY2sgdGltZSBpbiBtaWNyb3NlY29uZHMuCi11aW50NjRfdCB0aW1lX2dldHRpbWVvZmRheV91cygpOwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2NvbW1vbi90aW1lX3V0aWxfdW5pdHRlc3QuY2MgYi9jb21tb24vdGltZV91dGlsX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UyMDVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90aW1lX3V0aWxfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLQotLy8gR2VuZXJvdXMgdXBwZXIgYm91bmQ6IDEwIHNlY29uZHMKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBURVNUX1RJTUVfREVMVEFfVVBQRVJfQk9VTkRfTVMgPSAxMCAqIDEwMDA7Ci0KLS8vCi0vLyBUZXN0IHRoYXQgdGhlIHJldHVybiB2YWx1ZSBvZiBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKSBpcwotLy8gbm90IHplcm8uCi0vLwotVEVTVChUaW1lVGVzdCwgdGVzdF90aW1lX2dldF9vc19ib290dGltZV9tc19ub3RfemVybykgewotICB1aW50NjRfdCB0MSA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICBBU1NFUlRfR1QodDEsIHVpbnQ2NF90KDApKTsKLX0KLQotLy8KLS8vIFRlc3QgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpIGlzCi0vLyBub3QgemVyby4KLS8vCi1URVNUKFRpbWVUZXN0LCB0ZXN0X3RpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzX25vdF96ZXJvKSB7Ci0gIHVpbnQ2NF90IHQxID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIEFTU0VSVF9HVCh0MSwgdWludDY0X3QoMCkpOwotfQotCi0vLwotLy8gVGVzdCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCkKLS8vIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB3aXRoaW4gcmVhc29uYWJsZSBib3VuZHJpZXMuCi0vLwotVEVTVChUaW1lVGVzdCwgdGVzdF90aW1lX2dldF9vc19ib290dGltZV9tc19pbmNyZWFzZXNfdXBwZXJfYm91bmQpIHsKLSAgdWludDY0X3QgdDEgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKTsKLSAgdWludDY0X3QgdDIgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKTsKLSAgQVNTRVJUX1RSVUUoKHQyIC0gdDEpIDwgVEVTVF9USU1FX0RFTFRBX1VQUEVSX0JPVU5EX01TKTsKLX0KLQotLy8KLS8vIFRlc3QgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpCi0vLyBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgd2l0aGluIHJlYXNvbmFibGUgYm91bmRyaWVzLgotLy8KLVRFU1QoVGltZVRlc3QsIHRlc3RfdGltZV9nZXRfb3NfYm9vdHRpbWVfdXNfaW5jcmVhc2VzX3VwcGVyX2JvdW5kKSB7Ci0gIHVpbnQ2NF90IHQxID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIHVpbnQ2NF90IHQyID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0gIEFTU0VSVF9UUlVFKCh0MiAtIHQxKSA8IFRFU1RfVElNRV9ERUxUQV9VUFBFUl9CT1VORF9NUyAqIDEwMDApOwotfQotCi0vLwotLy8gVGVzdCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCkKLS8vIGlzIGluY3JlYXNpbmcuCi0vLwotVEVTVChUaW1lVGVzdCwgdGVzdF90aW1lX2dldF9vc19ib290dGltZV9tc19pbmNyZWFzZXNfbG93ZXJfYm91bmQpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFRFU1RfVElNRV9TTEVFUF9NUyA9IDEwMDsKLSAgc3RydWN0IHRpbWVzcGVjIGRlbGF5ID0ge307Ci0KLSAgZGVsYXkudHZfc2VjID0gVEVTVF9USU1FX1NMRUVQX01TIC8gMTAwMDsKLSAgZGVsYXkudHZfbnNlYyA9IDEwMDAgKiAxMDAwICogKFRFU1RfVElNRV9TTEVFUF9NUyAlIDEwMDApOwotCi0gIC8vIFRha2UgdHdvIHRpbWVzdGFtcHMgd2l0aCBzbGVlcCBpbi1iZXR3ZWVuCi0gIHVpbnQ2NF90IHQxID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCk7Ci0gIGludCBlcnIgPSBuYW5vc2xlZXAoJmRlbGF5LCAmZGVsYXkpOwotICB1aW50NjRfdCB0MiA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotCi0gIEFTU0VSVF9FUShlcnIsIDApOwotICBBU1NFUlRfVFJVRSgodDIgLSB0MSkgPj0gVEVTVF9USU1FX1NMRUVQX01TKTsKLSAgQVNTRVJUX1RSVUUoKHQyIC0gdDEpIDwgVEVTVF9USU1FX0RFTFRBX1VQUEVSX0JPVU5EX01TKTsKLX0KLQotLy8KLS8vIFRlc3QgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpCi0vLyBpcyBpbmNyZWFzaW5nLgotLy8KLVRFU1QoVGltZVRlc3QsIHRlc3RfdGltZV9nZXRfb3NfYm9vdHRpbWVfdXNfaW5jcmVhc2VzX2xvd2VyX2JvdW5kKSB7Ci0gIHN0YXRpYyBjb25zdCB1aW50NjRfdCBURVNUX1RJTUVfU0xFRVBfVVMgPSAxMDAgKiAxMDAwOwotICBzdHJ1Y3QgdGltZXNwZWMgZGVsYXkgPSB7fTsKLQotICBkZWxheS50dl9zZWMgPSBURVNUX1RJTUVfU0xFRVBfVVMgLyAoMTAwMCAqIDEwMDApOwotICBkZWxheS50dl9uc2VjID0gMTAwMCAqIChURVNUX1RJTUVfU0xFRVBfVVMgJSAoMTAwMCAqIDEwMDApKTsKLQotICAvLyBUYWtlIHR3byB0aW1lc3RhbXBzIHdpdGggc2xlZXAgaW4tYmV0d2VlbgotICB1aW50NjRfdCB0MSA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICBpbnQgZXJyID0gbmFub3NsZWVwKCZkZWxheSwgJmRlbGF5KTsKLSAgdWludDY0X3QgdDIgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLQotICBBU1NFUlRfRVEoZXJyLCAwKTsKLSAgQVNTRVJUX0dUKHQyLCB0MSk7Ci0gIEFTU0VSVF9UUlVFKCh0MiAtIHQxKSA+PSBURVNUX1RJTUVfU0xFRVBfVVMpOwotICBBU1NFUlRfVFJVRSgodDIgLSB0MSkgPCBURVNUX1RJTUVfREVMVEFfVVBQRVJfQk9VTkRfTVMgKiAxMDAwKTsKLX0KLQotLy8KLS8vIFRlc3QgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldHRpbWVvZmRheV91cygpIGlzCi0vLyBub3QgemVyby4KLS8vCi1URVNUKFRpbWVUZXN0LCB0ZXN0X3RpbWVfZ2V0dGltZW9mZGF5X3VzX25vdF96ZXJvKSB7Ci0gIHVpbnQ2NF90IHQxID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0dGltZW9mZGF5X3VzKCk7Ci0gIEFTU0VSVF9HVCh0MSwgdWludDY0X3QoMCkpOwotfQotCi0vLwotLy8gVGVzdCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0dGltZW9mZGF5X3VzKCkKLS8vIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB3aXRoaW4gcmVhc29uYWJsZSBib3VuZGFyaWVzLgotLy8KLVRFU1QoVGltZVRlc3QsIHRlc3RfdGltZV9nZXR0aW1lb2ZkYXlfdXNfaW5jcmVhc2VzX3VwcGVyX2JvdW5kKSB7Ci0gIHVpbnQ2NF90IHQxID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0dGltZW9mZGF5X3VzKCk7Ci0gIHVpbnQ2NF90IHQyID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0dGltZW9mZGF5X3VzKCk7Ci0gIEFTU0VSVF9UUlVFKCh0MiAtIHQxKSA8IFRFU1RfVElNRV9ERUxUQV9VUFBFUl9CT1VORF9NUyAqIDEwMDApOwotfQotCi0vLwotLy8gVGVzdCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0dGltZW9mZGF5X3VzKCkKLS8vIGlzIGluY3JlYXNpbmcuCi0vLwotVEVTVChUaW1lVGVzdCwgdGVzdF90aW1lX2dldHRpbWVvZmRheV91c19pbmNyZWFzZXNfbG93ZXJfYm91bmQpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFRFU1RfVElNRV9TTEVFUF9VUyA9IDEwMCAqIDEwMDA7Ci0gIHN0cnVjdCB0aW1lc3BlYyBkZWxheSA9IHt9OwotCi0gIGRlbGF5LnR2X3NlYyA9IFRFU1RfVElNRV9TTEVFUF9VUyAvICgxMDAwICogMTAwMCk7Ci0gIGRlbGF5LnR2X25zZWMgPSAxMDAwICogKFRFU1RfVElNRV9TTEVFUF9VUyAlICgxMDAwICogMTAwMCkpOwotCi0gIC8vIFRha2UgdHdvIHRpbWVzdGFtcHMgd2l0aCBzbGVlcCBpbi1iZXR3ZWVuCi0gIHVpbnQ2NF90IHQxID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0dGltZW9mZGF5X3VzKCk7Ci0gIGludCBlcnIgPSBuYW5vc2xlZXAoJmRlbGF5LCAmZGVsYXkpOwotICB1aW50NjRfdCB0MiA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldHRpbWVvZmRheV91cygpOwotCi0gIEFTU0VSVF9FUShlcnIsIDApOwotICBBU1NFUlRfR1QodDIsIHQxKTsKLSAgQVNTRVJUX1RSVUUoKHQyIC0gdDEpID49IFRFU1RfVElNRV9TTEVFUF9VUyk7Ci0gIEFTU0VSVF9UUlVFKCh0MiAtIHQxKSA8IFRFU1RfVElNRV9ERUxUQV9VUFBFUl9CT1VORF9NUyAqIDEwMDApOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3V0aWxzLmggYi9jb21tb24vdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlOGYyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0vLyBBIG1hY3JvIHRvIHJlLXRyeSBhIHN5c2NhbGwgd2hlbiBpdCByZWNlaXZlcyBFSU5UUgotI2lmbmRlZiBSVU5fTk9fSU5UUgotI2RlZmluZSBSVU5fTk9fSU5UUihmbikgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgoZm4pID09IC0xICYmIGVycm5vID09IEVJTlRSKQotI2VuZGlmCi0KLS8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPSBmdW5jdGlvbnMKLSNpZm5kZWYgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOCi0jZGVmaW5lIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUeXBlTmFtZSkgXAotICBUeXBlTmFtZShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOyAgICAgIFwKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb25mL0FuZHJvaWQuYnAgYi9jb25mL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDNhOGIuLjAwMDAwMDAKLS0tIGEvY29uZi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQmx1ZXRvb3RoIGJ0X3N0YWNrLmNvbmYgY29uZmlnIGZpbGUKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLXByZWJ1aWx0X2V0YyB7Ci0gICAgbmFtZTogImJ0X3N0YWNrLmNvbmYiLAotICAgIHNyYzogImJ0X3N0YWNrLmNvbmYiLAotICAgIHN1Yl9kaXI6ICJibHVldG9vdGgiLAotfQotCi0vLyBCbHVldG9vdGggYnRfZGlkLmNvbmYgY29uZmlnIGZpbGUKLXByZWJ1aWx0X2V0YyB7Ci0gICAgbmFtZTogImJ0X2RpZC5jb25mIiwKLSAgICBzcmM6ICJidF9kaWQuY29uZiIsCi0gICAgc3ViX2RpcjogImJsdWV0b290aCIsCi19CmRpZmYgLS1naXQgYS9jb25mL2J0X2RpZC5jb25mIGIvY29uZi9idF9kaWQuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxY2M2ZC4uMDAwMDAwMAotLS0gYS9jb25mL2J0X2RpZC5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotIyBEZXZpY2UgSUQgKERJRCkgY29uZmlndXJhdGlvbgotW0RJRDFdCi0KLSMgUHJpbWFyeSBSZWNvcmQgLSB0cnVlIG9yIGZhbHNlIChkZWZhdWx0KQotIyBUaGVyZSBjYW4gYmUgb25seSBvbmUgcHJpbWFyeSByZWNvcmQKLXByaW1hcnlSZWNvcmQgPSB0cnVlCi0KLSMgVmVuZG9yIElEICcweEZGRkYnIGluZGljYXRlcyBubyBEZXZpY2UgSUQgU2VydmljZSBSZWNvcmQgaXMgcHJlc2VudCBpbiB0aGUgZGV2aWNlCi0jIDB4MDAwRiA9IEJyb2FkY29tIENvcnBvcmF0aW9uIChkZWZhdWx0KQotI3ZlbmRvcklkID0gMHgwMDBGCi0KLSMgVmVuZG9yIElEIFNvdXJjZQotIyAweDAwMDEgPSBCbHVldG9vdGggU0lHIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUgKGRlZmF1bHQpCi0jIDB4MDAwMiA9IFVTQiBJbXBsZW1lbnRlcidzIEZvcnVtIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUKLSN2ZW5kb3JJZFNvdXJjZSA9IDB4MDAwMQotCi0jIFByb2R1Y3QgSUQgJiBQcm9kdWN0IFZlcnNpb24KLSMgUGVyIHNwZWMgRElEIHYxLjMgMHhKSk1OIGZvciB2ZXJzaW9uIGlzIGludGVycHJldGVkIGFzIEpKLk0uTgotIyBKSjogbWFqb3IgdmVyc2lvbiBudW1iZXIsIE06IG1pbm9yIHZlcnNpb24gbnVtYmVyLCBOOiBzdWItbWlub3IgdmVyc2lvbiBudW1iZXIKLSMgRm9yIGV4YW1wbGU6IDEyMDAsIHYxNC4zLjYKLXByb2R1Y3RJZCA9IDB4MTIwMAotdmVyc2lvbiA9IDB4MTQzNgotCi0jIE9wdGlvbmFsIGF0dHJpYnV0ZXMKLSNjbGllbnRFeGVjdXRhYmxlVVJMID0KLSNzZXJ2aWNlRGVzY3JpcHRpb24gPQotI2RvY3VtZW50YXRpb25VUkwgPQotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKLSMgRGV2aWNlIElEIChESUQpIGNvbmZpZ3VyYXRpb24KLVtESUQyXQotCi0jIFByaW1hcnkgUmVjb3JkIC0gdHJ1ZSBvciBmYWxzZSAoZGVmYXVsdCkKLSMgVGhlcmUgY2FuIGJlIG9ubHkgb25lIHByaW1hcnkgcmVjb3JkCi0jcHJpbWFyeVJlY29yZCA9IGZhbHNlCi0KLSMgVmVuZG9yIElEICcweEZGRkYnIGluZGljYXRlcyBubyBEZXZpY2UgSUQgU2VydmljZSBSZWNvcmQgaXMgcHJlc2VudCBpbiB0aGUgZGV2aWNlCi0jIDB4MDAwRiA9IEJyb2FkY29tIENvcnBvcmF0aW9uIChkZWZhdWx0KQotI3ZlbmRvcklkID0gMHgwMDBGCi0KLSMgVmVuZG9yIElEIFNvdXJjZQotIyAweDAwMDEgPSBCbHVldG9vdGggU0lHIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUgKGRlZmF1bHQpCi0jIDB4MDAwMiA9IFVTQiBJbXBsZW1lbnRlcidzIEZvcnVtIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUKLSN2ZW5kb3JJZFNvdXJjZSA9IDB4MDAwMQotCi0jIFByb2R1Y3QgSUQgJiBQcm9kdWN0IFZlcnNpb24KLSMgUGVyIHNwZWMgRElEIHYxLjMgMHhKSk1OIGZvciB2ZXJzaW9uIGlzIGludGVycHJldGVkIGFzIEpKLk0uTgotIyBKSjogbWFqb3IgdmVyc2lvbiBudW1iZXIsIE06IG1pbm9yIHZlcnNpb24gbnVtYmVyLCBOOiBzdWItbWlub3IgdmVyc2lvbiBudW1iZXIKLSMgRGVmYXVsdDogMHgwMDAwLCB2MDAuMC4wCi0jcHJvZHVjdElkID0gMHgwMDAwCi0jdmVyc2lvbiA9IDB4MDAwMAotCi0jIE9wdGlvbmFsIGF0dHJpYnV0ZXMKLSNjbGllbnRFeGVjdXRhYmxlVVJMID0KLSNzZXJ2aWNlRGVzY3JpcHRpb24gPQotI2RvY3VtZW50YXRpb25VUkwgPQotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKLSMgRGV2aWNlIElEIChESUQpIGNvbmZpZ3VyYXRpb24KLVtESUQzXQotCi0jIFByaW1hcnkgUmVjb3JkIC0gdHJ1ZSBvciBmYWxzZSAoZGVmYXVsdCkKLSMgVGhlcmUgY2FuIGJlIG9ubHkgb25lIHByaW1hcnkgcmVjb3JkCi0jcHJpbWFyeVJlY29yZCA9IGZhbHNlCi0KLSMgVmVuZG9yIElEICcweEZGRkYnIGluZGljYXRlcyBubyBEZXZpY2UgSUQgU2VydmljZSBSZWNvcmQgaXMgcHJlc2VudCBpbiB0aGUgZGV2aWNlCi0jIDB4MDAwRiA9IEJyb2FkY29tIENvcnBvcmF0aW9uIChkZWZhdWx0KQotI3ZlbmRvcklkID0gMHgwMDBGCi0KLSMgVmVuZG9yIElEIFNvdXJjZQotIyAweDAwMDEgPSBCbHVldG9vdGggU0lHIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUgKGRlZmF1bHQpCi0jIDB4MDAwMiA9IFVTQiBJbXBsZW1lbnRlcidzIEZvcnVtIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUKLSN2ZW5kb3JJZFNvdXJjZSA9IDB4MDAwMQotCi0jIFByb2R1Y3QgSUQgJiBQcm9kdWN0IFZlcnNpb24KLSMgUGVyIHNwZWMgRElEIHYxLjMgMHhKSk1OIGZvciB2ZXJzaW9uIGlzIGludGVycHJldGVkIGFzIEpKLk0uTgotIyBKSjogbWFqb3IgdmVyc2lvbiBudW1iZXIsIE06IG1pbm9yIHZlcnNpb24gbnVtYmVyLCBOOiBzdWItbWlub3IgdmVyc2lvbiBudW1iZXIKLSMgRGVmYXVsdDogMHgwMDAwLCB2MDAuMC4wCi0jcHJvZHVjdElkID0gMHgwMDAwCi0jdmVyc2lvbiA9IDB4MDAwMAotCi0jIE9wdGlvbmFsIGF0dHJpYnV0ZXMKLSNjbGllbnRFeGVjdXRhYmxlVVJMID0KLSNzZXJ2aWNlRGVzY3JpcHRpb24gPQotI2RvY3VtZW50YXRpb25VUkwgPQpkaWZmIC0tZ2l0IGEvY29uZi9idF9zdGFjay5jb25mIGIvY29uZi9idF9zdGFjay5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU3NzU2Li4wMDAwMDAwCi0tLSBhL2NvbmYvYnRfc3RhY2suY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSMgRW5hYmxlIHRyYWNlIGxldmVsIHJlY29uZmlndXJhdGlvbiBmdW5jdGlvbgotIyBNdXN0IGJlIHByZXNlbnQgYmVmb3JlIGFueSBUUkNfIHRyYWNlIGxldmVsIHNldHRpbmdzCi1UcmFjZUNvbmY9dHJ1ZQotCi0jIFRyYWNlIGxldmVsIGNvbmZpZ3VyYXRpb24KLSMgICBCVF9UUkFDRV9MRVZFTF9OT05FICAgIDAgICAgKCBObyB0cmFjZSBtZXNzYWdlcyB0byBiZSBnZW5lcmF0ZWQgKQotIyAgIEJUX1RSQUNFX0xFVkVMX0VSUk9SICAgMSAgICAoIEVycm9yIGNvbmRpdGlvbiB0cmFjZSBtZXNzYWdlcyApCi0jICAgQlRfVFJBQ0VfTEVWRUxfV0FSTklORyAyICAgICggV2FybmluZyBjb25kaXRpb24gdHJhY2UgbWVzc2FnZXMgKQotIyAgIEJUX1RSQUNFX0xFVkVMX0FQSSAgICAgMyAgICAoIEFQSSB0cmFjZXMgKQotIyAgIEJUX1RSQUNFX0xFVkVMX0VWRU5UICAgNCAgICAoIERlYnVnIG1lc3NhZ2VzIGZvciBldmVudHMgKQotIyAgIEJUX1RSQUNFX0xFVkVMX0RFQlVHICAgNSAgICAoIEZ1bGwgZGVidWcgbWVzc2FnZXMgKQotIyAgIEJUX1RSQUNFX0xFVkVMX1ZFUkJPU0UgNiAgICAoIFZlcmJvc2UgbWVzc2FnZXMgKSAtIEN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRSQ19CVEFQUCBvbmx5LgotVFJDX0JUTT0yCi1UUkNfSENJPTIKLVRSQ19MMkNBUD0yCi1UUkNfUkZDT01NPTIKLVRSQ19PQkVYPTIKLVRSQ19BVkNUPTIKLVRSQ19BVkRUPTIKLVRSQ19BVlJDPTIKLVRSQ19BVkRUX1NDQj0yCi1UUkNfQVZEVF9DQ0I9MgotVFJDX0EyRD0yCi1UUkNfU0RQPTIKLVRSQ19TTVA9MgotVFJDX0JUQVBQPTIKLVRSQ19CVElGPTIKLVRSQ19CTkVQPTIKLVRSQ19QQU49MgotVFJDX0hJRF9IT1NUPTIKLVRSQ19ISURfREVWPTIKLQotIyBUaGlzIGlzIExvZyBjb25maWd1cmF0aW9uIGZvciBuZXcgQysrIGNvZGUgdXNpbmcgTE9HKCkgbWFjcm9zLgotIyBTZWUgbGliY2hyb21lL2Jhc2UvbG9nZ2luZy5oIGZvciBkZXNjcmlwdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgbG9ncy4KLSMgc2FtcGxlIGNvbmZpZ3VyYXRpb246Ci0jTG9nZ2luZ1Y9LS12PTAKLSNMb2dnaW5nVk1vZHVsZT0tLXZtb2R1bGU9Ki9idG0vKj0xLGJ0bV9ibGVfbXVsdGkqPTIsYnRpZl8qPTEKLQotIyBQVFMgdGVzdGluZyBoZWxwZXJzCi0KLSMgU2VjdXJlIGNvbm5lY3Rpb25zIG9ubHkgbW9kZS4KLSMgUFRTX1NlY3VyZVBhaXJPbmx5PXRydWUKLQotIyBEaXNhYmxlIExFIENvbm5lY3Rpb24gdXBkYXRlcwotI1BUU19EaXNhYmxlQ29ublVwZGF0ZXM9dHJ1ZQotCi0jIERpc2FibGUgQlIvRURSIGRpc2NvdmVyeSBhZnRlciBMRSBwYWlyaW5nIHRvIGF2b2lkIGNyb3NzIGtleSBkZXJpdmF0aW9uIGVycm9ycwotI1BUU19EaXNhYmxlU0RQT25MRVBhaXI9dHJ1ZQotCi0jIFNNUCBQYWlyIG9wdGlvbnMgKGZvcm1hdHRlZCBhcyBoZXggYnl0ZXMpIGF1dGgsIGlvLCBpa2V5LCBya2V5LCBrc2l6ZQotI1BUU19TbXBPcHRpb25zPTB4RCwweDQsMHhmLDB4ZiwweDEwCi0KLSMgUFRTIEFWUkNQIFRlc3QgbW9kZQotI1BUU19BdnJjcFRlc3Q9dHJ1ZQotCi0jIFNNUCBDZXJ0aWZpY2F0aW9uIEZhaWx1cmUgQ2FzZXMKLSMgU2V0IGFueSBvZiB0aGUgZm9sbG93aW5nIFNNUCBlcnJvciB2YWx1ZXMgKGZyb20gc21wX2FwaV90eXBlcy5oKQotIyB0byBpbmR1Y2UgcGFpcmluZyBmYWlsdWVzIGZvciB2YXJpb3VzIFBUUyBTTVAgdGVzdCBjYXNlcy4KLSMgU2V0dGluZyBQVFNfU21wRmFpbHVyZUNhc2UgdG8gMCBtZWFucyBub3JtYWwgb3BlcmF0aW9uLgotIyBGYWlsdXJlIG1vZGVzOgotIwotIyAgU01QX1BBU1NLRVlfRU5UUllfRkFJTCA9IDEKLSMgIFNNUF9QQUlSX0FVVEhfRkFJTCA9IDMKLSMgIFNNUF9DT05GSVJNX1ZBTFVFX0VSUiA9IDQKLSMgIFNNUF9QQUlSX05PVF9TVVBQT1JUID0gNQotIyAgU01QX1BBSVJfRkFJTF9VTktOT1dOID0gOAotIyAgU01QX1JFUEVBVEVEX0FUVEVNUFRTID0gOQotIyAgU01QX05VTUVSSUNfQ09NUEFSX0ZBSUwgPSAxMgotI1BUU19TbXBGYWlsdXJlQ2FzZT0wCi0KZGlmZiAtLWdpdCBhL2RldmljZS9BbmRyb2lkLmJwIGIvZGV2aWNlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzY2Y2MjguLjAwMDAwMDAKLS0tIGEvZGV2aWNlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBCbHVldG9vdGggZGV2aWNlIHN0YXRpYyBsaWJyYXJ5IGZvciB0YXJnZXQKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnRkZXZpY2UiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9jb250cm9sbGVyLmNjIiwKLSAgICAgICAgInNyYy9lc2NvX3BhcmFtZXRlcnMuY2MiLAotICAgICAgICAic3JjL2ludGVyb3AuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLX0KLQotLy8gQmx1ZXRvb3RoIGRldmljZSB1bml0IHRlc3RzIGZvciB0YXJnZXQKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9kZXZpY2UiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9idCJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3QvaW50ZXJvcF90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliZGwiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmJ0Y29yZSIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlib3NpLUFsbG9jYXRpb25UZXN0SGFybmVzcyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZGV2aWNlL0JVSUxELmduIGIvZGV2aWNlL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FiYWFhLi4wMDAwMDAwCi0tLSBhL2RldmljZS9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zdGF0aWNfbGlicmFyeSgiZGV2aWNlIikgewotICBzb3VyY2VzID0gWwotICAgICJzcmMvY29udHJvbGxlci5jYyIsCi0gICAgInNyYy9lc2NvX3BhcmFtZXRlcnMuY2MiLAotICAgICJzcmMvaW50ZXJvcC5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQvIiwKLSAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgIi8vYnQvaGNpL2luY2x1ZGUiLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICBdCi0KLSAgY29uZmlncyArPSBbCi0gICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmxpYmJsdWV0b290aF9ydXN0X2ludGVyb3AiLAotICAgICIvL2J0L2dkL3J1c3Qvc2hpbTptZXNzYWdlX2xvb3BfdGhyZWFkX2JyaWRnZV9oZWFkZXIiLAotICBdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBleGVjdXRhYmxlKCJuZXRfdGVzdF9kZXZpY2UiKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICIvL2J0L29zaS90ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5jYyIsCi0gICAgXQotCi0gICAgaW5jbHVkZV9kaXJzID0gWyAiLy9idCIgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICIvL2J0L2RldmljZSIsCi0gICAgICAiLy9idC9idGNvcmUiLAotICAgICAgIi8vYnQvb3NpIiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICIvL2J0OmV4dGVybmFsX2d0ZXN0X21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0KLSAgICBsaWJzID0gWwotICAgICAgInB0aHJlYWQiLAotICAgICAgInJ0IiwKLSAgICAgICJkbCIsCi0gICAgXQotICB9Ci19CmRpZmYgLS1naXQgYS9kZXZpY2UvZnV6emVyL0FuZHJvaWQuYnAgYi9kZXZpY2UvZnV6emVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Yzc4MTAuLjAwMDAwMDAKLS0tIGEvZGV2aWNlL2Z1enplci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImJ0ZGV2aWNlX2VzY29fZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJ0ZGV2aWNlX2VzY29fZnV6emVyLmNwcCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmRsIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidGRldmljZSIsCi0gICAgICAgICJsaWJidGNvcmUiLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZGV2aWNlL2luY2x1ZGUiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotICAgIGZ1enpfY29uZmlnOiB7Ci0gICAgICAgIGNjOiBbCi0gICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCi0gICAgICAgIF0sCi0gICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL2RldmljZS9mdXp6ZXIvUkVBRE1FLm1kIGIvZGV2aWNlL2Z1enplci9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmIwYmEuLjAwMDAwMDAKLS0tIGEvZGV2aWNlL2Z1enplci9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIEZ1enplcnMgZm9yIGxpYmJ0ZGV2aWNlCi0KLSMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKLVRoZSBmdXp6ZXIgcGx1Z2luIGZvciBgbGliYnRkZXZpY2VgIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQotc291cmNlIGNvZGUgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKLQotIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQotVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmQtY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCi1pbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXJzLgotCi1GdXp6ZXIgYXNzaWducyB2YWx1ZXMgdG8gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHRvIHBhc3Mgb24gdG8gbGliYnRkZXZpY2U6Ci0xLiBCbHVldG9vdGggSW50ZXJvcCBGZWF0dXJlIChwYXJhbWV0ZXIgbmFtZTogYGludGVyb3BGZWF0dXJlYCkKLTIuIEJsdWV0b290aCBFc2NvIENvZGVjIChwYXJhbWV0ZXIgbmFtZTogYGVzY29Db2RlY2ApCi0KLXwgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Ci18LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAotfCBgaW50ZXJvcEZlYXR1cmVgIHwgMC5gSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OU2AgMS5gSU5URVJPUF9BVVRPX1JFVFJZX1BBSVJJTkdgIDIuYElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUVgIDMuYElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkdgIDQuYElOVEVST1BfS0VZQk9BUkRfUkVRVUlSRVNfRklYRURfUElOYCA1LmBJTlRFUk9QXzJNQlBTX0xJTktfT05MWWAgNi5gSU5URVJPUF9ISURfUFJFRl9DT05OX1NVUF9USU1FT1VUXzNTYCA3LmBJTlRFUk9QX0dBVFRDX05PX1NFUlZJQ0VfQ0hBTkdFRF9JTkRgIDguYElOVEVST1BfRElTQUJMRV9BVkRUUF9SRUNPTkZJR1VSRWAgOS5gSU5URVJPUF9EWU5BTUlDX1JPTEVfU1dJVENIYCAxMC5gSU5URVJPUF9ESVNBQkxFX1JPTEVfU1dJVENIYCAxMS5gSU5URVJPUF9ISURfSE9TVF9MSU1JVF9TTklGRl9JTlRFUlZBTGAgMTIuYElOVEVST1BfRElTQUJMRV9OQU1FX1JFUVVFU1RgIDEzLmBJTlRFUk9QX0FWUkNQXzFfNF9PTkxZYCAxNC5gSU5URVJPUF9ESVNBQkxFX1NOSUZGYCAxNS5gSU5URVJPUF9ESVNBQkxFX0FWRFRQX1NVU1BFTkRgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Ci18IGBlc2NvQ29kZWNgIHwgMC5gU0NPX0NPREVDX0NWU0RfRDFgIDEuYEVTQ09fQ09ERUNfQ1ZTRF9TM2AgMi5gRVNDT19DT0RFQ19DVlNEX1M0YCAzLmBFU0NPX0NPREVDX01TQkNfVDFgIDQuYEVTQ09fQ09ERUNfTVNCQ19UMmB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKLVRoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbnMgYXJlIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCi0KLSMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKLVRoZSBwbHVnaW4gZmVlZCB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIG1vZHVsZS4KLVRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKLW1hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc24ndCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKLWNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCi0KLSMjIEJ1aWxkCi0KLVRoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGJ0ZGV2aWNlX2VzY29fZnV6emVyIGJpbmFyeS4KLQotIyMjIEFuZHJvaWQKLQotIyMjIyBTdGVwcyB0byBidWlsZAotQnVpbGQgdGhlIGZ1enplcgotYGBgCi0gICQgbW0gLWokKG5wcm9jKSBidGRldmljZV9lc2NvX2Z1enplcgotYGBgCi0jIyMgU3RlcHMgdG8gcnVuCi0KLVRvIHJ1biBvbiBkZXZpY2UKLWBgYAotICAkIGFkYiBzeW5jIGRhdGEKLSAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9idGRldmljZV9lc2NvX2Z1enplci9idGRldmljZV9lc2NvX2Z1enplcgotYGBgCi0KLSMjIFJlZmVyZW5jZXM6Ci0gKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAotICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvZGV2aWNlL2Z1enplci9idGRldmljZV9lc2NvX2Z1enplci5jcHAgYi9kZXZpY2UvZnV6emVyL2J0ZGV2aWNlX2VzY29fZnV6emVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxMTZiZi4uMDAwMDAwMAotLS0gYS9kZXZpY2UvZnV6emVyL2J0ZGV2aWNlX2VzY29fZnV6emVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZXNjb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAiaW50ZXJvcC5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotY29uc3RleHByIHNpemVfdCBrTnVtQWRkcmVzc09jdGV0cyA9IDY7Ci1jb25zdGV4cHIgc2l6ZV90IGtNYXhTdHJpbmdMZW5ndGggPSAxMDsKLWNvbnN0ZXhwciBpbnRlcm9wX2ZlYXR1cmVfdCBrSW50ZXJvcEZlYXR1cmVbXSA9IHsKLSAgICBpbnRlcm9wX2ZlYXR1cmVfdDo6SU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OUywKLSAgICBpbnRlcm9wX2ZlYXR1cmVfdDo6SU5URVJPUF9BVVRPX1JFVFJZX1BBSVJJTkcsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUUsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkcsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfS0VZQk9BUkRfUkVRVUlSRVNfRklYRURfUElOLAotICAgIGludGVyb3BfZmVhdHVyZV90OjpJTlRFUk9QXzJNQlBTX0xJTktfT05MWSwKLSAgICBpbnRlcm9wX2ZlYXR1cmVfdDo6SU5URVJPUF9ISURfUFJFRl9DT05OX1NVUF9USU1FT1VUXzNTLAotICAgIGludGVyb3BfZmVhdHVyZV90OjpJTlRFUk9QX0dBVFRDX05PX1NFUlZJQ0VfQ0hBTkdFRF9JTkQsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfRElTQUJMRV9BVkRUUF9SRUNPTkZJR1VSRSwKLSAgICBpbnRlcm9wX2ZlYXR1cmVfdDo6SU5URVJPUF9EWU5BTUlDX1JPTEVfU1dJVENILAotICAgIGludGVyb3BfZmVhdHVyZV90OjpJTlRFUk9QX0RJU0FCTEVfUk9MRV9TV0lUQ0gsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfSElEX0hPU1RfTElNSVRfU05JRkZfSU5URVJWQUwsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfRElTQUJMRV9OQU1FX1JFUVVFU1QsCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfQVZSQ1BfMV80X09OTFksCi0gICAgaW50ZXJvcF9mZWF0dXJlX3Q6OklOVEVST1BfRElTQUJMRV9TTklGRiwKLSAgICBpbnRlcm9wX2ZlYXR1cmVfdDo6SU5URVJPUF9ESVNBQkxFX0FWRFRQX1NVU1BFTkQsCi19OwotY29uc3RleHByIGVzY29fY29kZWNfdCBrRXNjb0NvZGVjW10gPSB7Ci0gICAgZXNjb19jb2RlY190OjpTQ09fQ09ERUNfQ1ZTRF9EMSwgIGVzY29fY29kZWNfdDo6RVNDT19DT0RFQ19DVlNEX1MzLAotICAgIGVzY29fY29kZWNfdDo6RVNDT19DT0RFQ19DVlNEX1M0LCBlc2NvX2NvZGVjX3Q6OkVTQ09fQ09ERUNfTVNCQ19UMSwKLSAgICBlc2NvX2NvZGVjX3Q6OkVTQ09fQ09ERUNfTVNCQ19UMiwKLX07Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgRnV6emVkRGF0YVByb3ZpZGVyIG1GdXp6ZWREYXRhUHJvdmlkZXIgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7Ci0gIFJhd0FkZHJlc3MgZnV6ekFkZHJlc3M7Ci0gIHN0cmluZyBhZGRyZXNzU3RyaW5nOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1BZGRyZXNzT2N0ZXRzOyArK2kpIHsKLSAgICBhZGRyZXNzU3RyaW5nLmFwcGVuZCgKLSAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci5Db25zdW1lQnl0ZXNBc1N0cmluZyhzaXplb2YodWludDhfdCkpKTsKLSAgICBpZiAoaSAhPSBrTnVtQWRkcmVzc09jdGV0cyAtIDEpIHsKLSAgICAgIGFkZHJlc3NTdHJpbmcuYXBwZW5kKCI6Iik7Ci0gICAgfQotICB9Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoYWRkcmVzc1N0cmluZywgZnV6ekFkZHJlc3MpOwotICBpbnRlcm9wX2ZlYXR1cmVfdCBpbnRlcm9wRmVhdHVyZSA9Ci0gICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLlBpY2tWYWx1ZUluQXJyYXkoa0ludGVyb3BGZWF0dXJlKTsKLSAgaW50ZXJvcF9tYXRjaF9hZGRyKGludGVyb3BGZWF0dXJlLCAmZnV6ekFkZHJlc3MpOwotICBpbnRlcm9wX2RhdGFiYXNlX2FkZChpbnRlcm9wRmVhdHVyZSwgJmZ1enpBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBSYXdBZGRyZXNzOjprTGVuZ3RoIC0gMSkpOwotICBpbnRlcm9wX2RhdGFiYXNlX2NsZWFyKCk7Ci0gIGludGVyb3BfbWF0Y2hfbmFtZSgKLSAgICAgIGludGVyb3BGZWF0dXJlLAotICAgICAgbUZ1enplZERhdGFQcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkpOwotICBlc2NvX2NvZGVjX3QgZXNjb0NvZGVjID0gbUZ1enplZERhdGFQcm92aWRlci5QaWNrVmFsdWVJbkFycmF5KGtFc2NvQ29kZWMpOwotICBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKGVzY29Db2RlYyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIGIvZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTg0NjRmLi4wMDAwMDAwCi0tLSBhL2RldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvdmVyc2lvbi5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXR5cGVkZWYgc3RydWN0IGNvbnRyb2xsZXJfdCB7Ci0gIGJvb2wgKCpnZXRfaXNfcmVhZHkpKHZvaWQpOwotCi0gIGNvbnN0IFJhd0FkZHJlc3MqICgqZ2V0X2FkZHJlc3MpKHZvaWQpOwotICBjb25zdCBidF92ZXJzaW9uX3QqICgqZ2V0X2J0X3ZlcnNpb24pKHZvaWQpOwotCi0gIGNvbnN0IHVpbnQ4X3QqICgqZ2V0X2JsZV9zdXBwb3J0ZWRfc3RhdGVzKSh2b2lkKTsKLQotICBib29sICgqc3VwcG9ydHNfc2ltcGxlX3BhaXJpbmcpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfc2VjdXJlX2Nvbm5lY3Rpb25zKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX3NpbXVsdGFuZW91c19sZV9icmVkcikodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19yZWFkaW5nX3JlbW90ZV9leHRlbmRlZF9mZWF0dXJlcykodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19pbnRlcmxhY2VkX2lucXVpcnlfc2Nhbikodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19yc3NpX3dpdGhfaW5xdWlyeV9yZXN1bHRzKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2V4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2UpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfY2VudHJhbF9wZXJpcGhlcmFsX3JvbGVfc3dpdGNoKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2VuaGFuY2VkX3NldHVwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24pKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24pKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfM19zbG90X3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfNV9zbG90X3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfY2xhc3NpY18ybV9waHkpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfY2xhc3NpY18zbV9waHkpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfM19zbG90X2Vkcl9wYWNrZXRzKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzXzVfc2xvdF9lZHJfcGFja2V0cykodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19zY28pKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfaHYyX3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfaHYzX3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfZXYzX3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfZXY0X3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfZXY1X3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfZXNjb18ybV9waHkpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfZXNjb18zbV9waHkpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfM19zbG90X2VzY29fZWRyX3BhY2tldHMpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfcm9sZV9zd2l0Y2gpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfaG9sZF9tb2RlKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX3NuaWZmX21vZGUpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfcGFya19tb2RlKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX25vbl9mbHVzaGFibGVfcGIpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2VuY3J5cHRpb25fcGF1c2UpKHZvaWQpOwotCi0gIGJvb2wgKCpzdXBwb3J0c19ibGUpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfYmxlX3BhY2tldF9leHRlbnNpb24pKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfYmxlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyc19yZXF1ZXN0KSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV9wcml2YWN5KSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV9zZXRfcHJpdmFjeV9tb2RlKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV8ybV9waHkpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfYmxlX2NvZGVkX3BoeSkodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19ibGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmcpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV9wZXJpcGhlcmFsX2luaXRpYXRlZF9mZWF0dXJlX2V4Y2hhbmdlKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcl9yZXF1ZXN0KSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlcikodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9yZWNpcGllbnQpKHZvaWQpOwotICBib29sICgqc3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fY2VudHJhbCkodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19ibGVfY29ubmVjdGVkX2lzb2Nocm9ub3VzX3N0cmVhbV9wZXJpcGhlcmFsKSh2b2lkKTsKLSAgYm9vbCAoKnN1cHBvcnRzX2JsZV9pc29jaHJvbm91c19icm9hZGNhc3Rlcikodm9pZCk7Ci0gIGJvb2wgKCpzdXBwb3J0c19ibGVfc3luY2hyb25pemVkX3JlY2VpdmVyKSh2b2lkKTsKLQotICAvLyBHZXQgdGhlIGNhY2hlZCBhY2wgZGF0YSBzaXplcyBmb3IgdGhlIGNvbnRyb2xsZXIuCi0gIHVpbnQxNl90ICgqZ2V0X2FjbF9kYXRhX3NpemVfY2xhc3NpYykodm9pZCk7Ci0gIHVpbnQxNl90ICgqZ2V0X2FjbF9kYXRhX3NpemVfYmxlKSh2b2lkKTsKLSAgdWludDE2X3QgKCpnZXRfaXNvX2RhdGFfc2l6ZSkodm9pZCk7Ci0KLSAgLy8gR2V0IHRoZSBjYWNoZWQgYWNsIHBhY2tldCBzaXplcyBmb3IgdGhlIGNvbnRyb2xsZXIuCi0gIC8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgdGhlIHJlc3BlY3RpdmUKLSAgLy8gYWNsIGRhdGEgc2l6ZSArIHNpemUgb2YgdGhlIGFjbCBoZWFkZXIuCi0gIHVpbnQxNl90ICgqZ2V0X2FjbF9wYWNrZXRfc2l6ZV9jbGFzc2ljKSh2b2lkKTsKLSAgdWludDE2X3QgKCpnZXRfYWNsX3BhY2tldF9zaXplX2JsZSkodm9pZCk7Ci0gIHVpbnQxNl90ICgqZ2V0X2lzb19wYWNrZXRfc2l6ZSkodm9pZCk7Ci0KLSAgdWludDE2X3QgKCpnZXRfYmxlX2RlZmF1bHRfZGF0YV9wYWNrZXRfbGVuZ3RoKSh2b2lkKTsKLSAgdWludDE2X3QgKCpnZXRfYmxlX21heGltdW1fdHhfZGF0YV9sZW5ndGgpKHZvaWQpOwotICB1aW50MTZfdCAoKmdldF9ibGVfbWF4aW11bV90eF90aW1lKSh2b2lkKTsKLSAgdWludDE2X3QgKCpnZXRfYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGgpKHZvaWQpOwotICB1aW50OF90ICgqZ2V0X2JsZV9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHMpKHZvaWQpOwotICB1aW50OF90ICgqZ2V0X2JsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZSkodm9pZCk7Ci0KLSAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYWNsIHBhY2tldHMgdGhlIGNvbnRyb2xsZXIgY2FuIGJ1ZmZlci4KLSAgdWludDE2X3QgKCpnZXRfYWNsX2J1ZmZlcl9jb3VudF9jbGFzc2ljKSh2b2lkKTsKLSAgdWludDhfdCAoKmdldF9hY2xfYnVmZmVyX2NvdW50X2JsZSkodm9pZCk7Ci0gIHVpbnQ4X3QgKCpnZXRfaXNvX2J1ZmZlcl9jb3VudCkodm9pZCk7Ci0KLSAgdWludDhfdCAoKmdldF9ibGVfYWNjZXB0bGlzdF9zaXplKSh2b2lkKTsKLQotICB1aW50OF90ICgqZ2V0X2JsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZSkodm9pZCk7Ci0gIHZvaWQgKCpzZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKShpbnQgcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUpOwotICB1aW50OF90KiAoKmdldF9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzKSh1aW50OF90KiBudW1iZXJfb2ZfY29kZWNzKTsKLSAgdWludDhfdCAoKmdldF9sZV9hbGxfaW5pdGlhdGluZ19waHlzKSh2b2lkKTsKLQotfSBjb250cm9sbGVyX3Q7Ci0KLWNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7CmRpZmYgLS1naXQgYS9kZXZpY2UvaW5jbHVkZS9lc2NvX3BhcmFtZXRlcnMuaCBiL2RldmljZS9pbmNsdWRlL2VzY29fcGFyYW1ldGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmI1MWYxLi4wMDAwMDAwCi0tLSBhL2RldmljZS9pbmNsdWRlL2VzY29fcGFyYW1ldGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKioqKioqKioqKioqKioqKioqKgotICogU0NPIENvZGVjIFR5cGVzCi0gKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFNDT19DT0RFQ19OT05FID0gMHgwMDAwLAotICBTQ09fQ09ERUNfQ1ZTRCA9IDB4MDAwMSwKLSAgU0NPX0NPREVDX01TQkMgPSAweDAwMDIsCi19IHNjb19jb2RlY190OwotCi10eXBlZGVmIGVudW0gewotICBTQ09fQ09ERUNfQ1ZTRF9EMSA9IDAsCi0gIEVTQ09fQ09ERUNfQ1ZTRF9TMywKLSAgRVNDT19DT0RFQ19DVlNEX1M0LAotICBFU0NPX0NPREVDX01TQkNfVDEsCi0gIEVTQ09fQ09ERUNfTVNCQ19UMiwKLX0gZXNjb19jb2RlY190OwotCi0jZGVmaW5lIEVTQ09fTlVNX0NPREVDUyA1Ci0KLS8vIENvZGluZyBGb3JtYXRzIChCVCA0LjEgb3IgbGF0ZXIgQXNzaWduZWQgbnVtYmVycykKLSNkZWZpbmUgRVNDT19DT0RJTkdfRk9STUFUX1VMQVcgKCh1aW50OF90KTB4MDApICAgICAvKiB1LUxhdyBsb2cgICAgKi8KLSNkZWZpbmUgRVNDT19DT0RJTkdfRk9STUFUX0FMQVcgKCh1aW50OF90KTB4MDEpICAgICAvKiBBLUxhdyBsb2cgICAgKi8KLSNkZWZpbmUgRVNDT19DT0RJTkdfRk9STUFUX0NWU0QgKCh1aW50OF90KTB4MDIpICAgICAvKiBDVlNEICAgICAgICAgKi8KLSNkZWZpbmUgRVNDT19DT0RJTkdfRk9STUFUX1RSQU5TUE5UICgodWludDhfdCkweDAzKSAvKiBUcmFuc3BhcmVudCAgKi8KLSNkZWZpbmUgRVNDT19DT0RJTkdfRk9STUFUX0xJTkVBUiAoKHVpbnQ4X3QpMHgwNCkgICAvKiBMaW5lYXIgUENNICAgKi8KLSNkZWZpbmUgRVNDT19DT0RJTkdfRk9STUFUX01TQkMgKCh1aW50OF90KTB4MDUpICAgICAvKiBNU0JDIFBDTSAgICovCi0jZGVmaW5lIEVTQ09fQ09ESU5HX0ZPUk1BVF9WUyAoKHVpbnQ4X3QpMHhGRikgICAgICAgLyogU3BlY2lmaWVzIFZTQyB1c2VkICovCi10eXBlZGVmIHVpbnQ4X3QgZXNjb19jb2RpbmdfZm9ybWF0X3Q7Ci0KLS8vIFBDTSBEYXRhIEZvcm1hdHMgKEJUIDQuMSBvciBsYXRlciBBc3NpZ25lZCBudW1iZXJzKQotI2RlZmluZSBFU0NPX1BDTV9EQVRBX0ZPUk1BVF9OQSBcCi0gICgodWludDhfdCkweDAwKSAvKiBOL0EgdG8gY29kaW5nIGZvcm1hdCBpbiB1c2UgKi8KLSNkZWZpbmUgRVNDT19QQ01fREFUQV9GT1JNQVRfMV9DT01QICgodWludDhfdCkweDAxKSAvKiAxJ3MgY29tcGxlbWVudCAgICovCi0jZGVmaW5lIEVTQ09fUENNX0RBVEFfRk9STUFUXzJfQ09NUCAoKHVpbnQ4X3QpMHgwMikgLyogMidzIGNvbXBsZW1lbnQgICAqLwotI2RlZmluZSBFU0NPX1BDTV9EQVRBX0ZPUk1BVF9TSUdOICgodWludDhfdCkweDAzKSAgIC8qIFNpZ24tbWFnbml0dWRlICAgKi8KLSNkZWZpbmUgRVNDT19QQ01fREFUQV9GT1JNQVRfVU5TSUdOICgodWludDhfdCkweDA0KSAvKiBVbnNpZ25lZCAgICAgICAgICovCi10eXBlZGVmIHVpbnQ4X3QgZXNjb19wY21fZGF0YV9mb3JtYXRfdDsKLQotLy8gU0NPIERhdGEgUGF0aAotI2RlZmluZSBFU0NPX0RBVEFfUEFUSF9QQ00gMSAgICAgICAgICAgICAgICAvKiAweDAxLTB4RkUgKFBDTSBDaGFuKSAqLwotI2RlZmluZSBFU0NPX0RBVEFfUEFUSF9IQ0kgMCAgICAgICAgICAgICAgICAvKiBIQ0ktMCwgMHgwMS0weEZFIChQQ00gQ2hhbikgKi8KLXR5cGVkZWYgdWludDhfdCBlc2NvX2RhdGFfcGF0aF90OwotCi0vLyBlU0NPIGNvbnN0YW50cwotI2RlZmluZSBUWFJYXzY0S0JJVFNfUkFURSAweDAwMDAxZjQwICAvKiA2NCBrYml0cy9zZWMgZGF0YSByYXRlICovCi0jZGVmaW5lIFRYUlhfMTI4S0JJVFNfUkFURSAweDAwMDAzRTgwIC8qIDEyOCBrYml0cy9zZWMgZGF0YSByYXRlICovCi10eXBlZGVmIHVpbnQzMl90IGVzY29fdHhyeF9iYW5kd2lkdGhfdDsKLQotI2RlZmluZSBJTlBVVF9PVVRQVVRfNjRLX1JBVEUgMHgwMDAwM0U4MCAgLyogMTYwMDAgQnl0ZXMvc2VjIG92ZXIgdHJhbnNwb3J0ICovCi0jZGVmaW5lIElOUFVUX09VVFBVVF8xMjhLX1JBVEUgMHgwMDAwN0QwMCAvKiAzMjAwMCBCeXRlcy9zZWMgb3ZlciB0cmFuc3BvcnQgKi8KLXR5cGVkZWYgdWludDMyX3QgZXNjb19pb19iYW5kd2lkdGhfdDsKLQotLy8gUmV0cmFuc21pc3Npb24gZWZmb3J0Ci0jZGVmaW5lIEVTQ09fUkVUUkFOU01JU1NJT05fT0ZGIDAKLSNkZWZpbmUgRVNDT19SRVRSQU5TTUlTU0lPTl9QT1dFUiAxCi0jZGVmaW5lIEVTQ09fUkVUUkFOU01JU1NJT05fUVVBTElUWSAyCi0jZGVmaW5lIEVTQ09fUkVUUkFOU01JU1NJT05fRE9OVENBUkUgMHhmZgotdHlwZWRlZiB1aW50OF90IGVzY29fcmV0cmFuc21pc3Npb25fZWZmb3J0X3Q7Ci0KLS8vIERlZmluaXRpb25zIGZvciBlU0NPIHBhY2tldCB0eXBlIG1hc2tzIChCVDEuMiBhbmQgQlQyLjAgZGVmaW5pdGlvbnMpCi0jZGVmaW5lIEVTQ09fUEtUX1RZUEVTX01BU0tfSFYxIDB4MDAwMQotI2RlZmluZSBFU0NPX1BLVF9UWVBFU19NQVNLX0hWMiAweDAwMDIKLSNkZWZpbmUgRVNDT19QS1RfVFlQRVNfTUFTS19IVjMgMHgwMDA0Ci0jZGVmaW5lIEVTQ09fUEtUX1RZUEVTX01BU0tfRVYzIDB4MDAwOAotI2RlZmluZSBFU0NPX1BLVF9UWVBFU19NQVNLX0VWNCAweDAwMTAKLSNkZWZpbmUgRVNDT19QS1RfVFlQRVNfTUFTS19FVjUgMHgwMDIwCi0jZGVmaW5lIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjMgMHgwMDQwCi0jZGVmaW5lIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjMgMHgwMDgwCi0jZGVmaW5lIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgMHgwMTAwCi0jZGVmaW5lIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUgMHgwMjAwCi10eXBlZGVmIHVpbnQxNl90IGVzY29fcGFja2V0X3R5cGVzX3Q7Ci0KLS8vIHR5cGUgZGVmaW5pdGlvbgotdHlwZWRlZiBzdHJ1Y3QgewotICBlc2NvX2NvZGluZ19mb3JtYXRfdCBjb2RpbmdfZm9ybWF0OyAvKiBDb2RpbmcgRm9ybWF0Ki8KLSAgdWludDE2X3QgY29tcGFueV9pZDsgLyogQ29tcGFueSBJRCBmcm9tIEJUIFNJRyBBc3NpZ25lZCBOdW1iZXJzICovCi0gIHVpbnQxNl90IHZlbmRvcl9zcGVjaWZpY19jb2RlY19pZDsgLyogVmVuZG9yIFNwZWNpZmljIENvZGVjIElEICovCi19IGVzY29fY29kaW5nX2lkX2Zvcm1hdF90OwotCi0vLyBFbmhhbmNlZCBzZXR1cC9hY2NlcHQgc3luY2hyb25vdXMgY29ubmVjdGlvbiBTZWUgQlQgNC4xIG9yIGxhdGVyIEhDSSBzcGVjIGZvcgotLy8gZGV0YWlscwotdHlwZWRlZiBzdHJ1Y3QgewotICBlc2NvX3R4cnhfYmFuZHdpZHRoX3QKLSAgICAgIHRyYW5zbWl0X2JhbmR3aWR0aDsgLyogVHJhbnNtaXQgQmFuZHdpZHRoIChpbiBvY3RldHMvc2Vjb25kKSAqLwotICBlc2NvX3R4cnhfYmFuZHdpZHRoX3QgcmVjZWl2ZV9iYW5kd2lkdGg7IC8qIFJYIEJXICgjIG9mIG9jdGV0cy9zZWNvbmQpICovCi0gIGVzY29fY29kaW5nX2lkX2Zvcm1hdF90IHRyYW5zbWl0X2NvZGluZ19mb3JtYXQ7IC8qIFRYIGNvZGluZyBmb3JtYXQgKi8KLSAgZXNjb19jb2RpbmdfaWRfZm9ybWF0X3QgcmVjZWl2ZV9jb2RpbmdfZm9ybWF0OyAgLyogUlggY29kaW5nIGZvcm1hdCAqLwotICB1aW50MTZfdCB0cmFuc21pdF9jb2RlY19mcmFtZV9zaXplOyAvKiBUWCBDT0RFQyBmcmFtZSBzaXplIChPVEEgZnJhbWUgc2l6ZSkgKi8KLSAgdWludDE2X3QgcmVjZWl2ZV9jb2RlY19mcmFtZV9zaXplOyAgLyogUlggQ09ERUMgZnJhbWUgc2l6ZSAoT1RBIGZyYW1lIHNpemUpICovCi0gIGVzY29faW9fYmFuZHdpZHRoX3QgaW5wdXRfYmFuZHdpZHRoOyAvKiBJbnB1dCBCVyAobm9taW5hbCByYXRlIG9jdGV0cy9zZWMpICovCi0gIGVzY29faW9fYmFuZHdpZHRoX3QKLSAgICAgIG91dHB1dF9iYW5kd2lkdGg7IC8qIE91dHB1dCBCVyAobm9taW5hbCByYXRlIG9jdGV0cy9zZWMpICovCi0gIGVzY29fY29kaW5nX2lkX2Zvcm1hdF90IGlucHV0X2NvZGluZ19mb3JtYXQ7ICAvKiBJbnB1dCBjb2RpbmcgZm9ybWF0ICovCi0gIGVzY29fY29kaW5nX2lkX2Zvcm1hdF90IG91dHB1dF9jb2RpbmdfZm9ybWF0OyAvKiBPdXRwdXQgY29kaW5nIGZvcm1hdCAqLwotICB1aW50MTZfdCBpbnB1dF9jb2RlZF9kYXRhX3NpemU7ICAvKiBJbnB1dCBjb2RlZCBkYXRhIHNpemUgKGluIGJpdHMpICovCi0gIHVpbnQxNl90IG91dHB1dF9jb2RlZF9kYXRhX3NpemU7IC8qIE91dHB1dCBjb2RlZCBkYXRhIHNpemUgKGluIGJpdHMpICovCi0gIGVzY29fcGNtX2RhdGFfZm9ybWF0X3QKLSAgICAgIGlucHV0X3BjbV9kYXRhX2Zvcm1hdDsgLyogSW5wdXQgUENNIGRhdGEgZm9ybWF0IChzZWUgaGNpZGVmcy5oKSAqLwotICBlc2NvX3BjbV9kYXRhX2Zvcm1hdF90Ci0gICAgICBvdXRwdXRfcGNtX2RhdGFfZm9ybWF0OyAvKiBPdXRwdXQgUENNIGRhdGEgZm9ybWF0IChzZWUgaGNpZGVmcy5oKSAqLwotICB1aW50OF90IGlucHV0X3BjbV9wYXlsb2FkX21zYl9wb3NpdGlvbjsgIC8qIElucHV0IFBDTSBzYW1wbGUgcGF5bG9hZCBNU0IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAqLwotICB1aW50OF90IG91dHB1dF9wY21fcGF5bG9hZF9tc2JfcG9zaXRpb247IC8qIE91dHB1dCBQQ00gc2FtcGxlIHBheWxvYWQgTVNCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gKi8KLSAgZXNjb19kYXRhX3BhdGhfdCBpbnB1dF9kYXRhX3BhdGg7ICAgLyogMHgwMCAtIEhDSSwgb3IgMHgwMS0weEZFIGZvciBWUykgKi8KLSAgZXNjb19kYXRhX3BhdGhfdCBvdXRwdXRfZGF0YV9wYXRoOyAgLyogMHgwMCAtIEhDSSwgb3IgMHgwMS0weEZFIGZvciBWUykgKi8KLSAgdWludDhfdCBpbnB1dF90cmFuc3BvcnRfdW5pdF9zaXplOyAgLyogSW5wdXQgdHJhbnNwb3J0IHVuaXQgc2l6ZSAqLwotICB1aW50OF90IG91dHB1dF90cmFuc3BvcnRfdW5pdF9zaXplOyAvKiBPdXRwdXQgdHJhbnNwb3J0IHVuaXQgc2l6ZSAqLwotICB1aW50MTZfdCBtYXhfbGF0ZW5jeV9tczsgICAgICAgICAgLyogTWF4aW11bSBsYXRlbmN5ICgweDQtMHhGRkZFIGluIG1zZWNzKSAqLwotICBlc2NvX3BhY2tldF90eXBlc190IHBhY2tldF90eXBlczsgLyogUGFja2V0IFR5cGVzICovCi0gIGVzY29fcmV0cmFuc21pc3Npb25fZWZmb3J0X3QKLSAgICAgIHJldHJhbnNtaXNzaW9uX2VmZm9ydDsgLyogMHgwMC0weDAyLCAweEZGIGRvbid0IGNhcmUgKi8KLX0gZW5oX2VzY29fcGFyYW1zX3Q7Ci0KLS8vIEdldCB0aGUgZW5oYW5jZWQgZVNDTyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBwcm92aWRlZCB8Y29kZWN8Ci1lbmhfZXNjb19wYXJhbXNfdCBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKGVzY29fY29kZWNfdCBjb2RlYyk7CmRpZmYgLS1naXQgYS9kZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmggYi9kZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOWEyNjYuLjAwMDAwMDAKLS0tIGEvZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpbmNsdWRlICJyYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgY29uc3QgY2hhciBJTlRFUk9QX01PRFVMRVtdID0gImludGVyb3BfbW9kdWxlIjsKLQotLy8gTk9URToKLS8vIE9ubHkgYWRkIHZhbHVlcyBhdCB0aGUgZW5kIG9mIHRoaXMgZW51bSBhbmQgZG8gTk9UIGRlbGV0ZSB2YWx1ZXMKLS8vIGFzIHRoZXkgbWF5IGJlIHVzZWQgaW4gZHluYW1pYyBkZXZpY2UgY29uZmlndXJhdGlvbi4KLXR5cGVkZWYgZW51bSB7Ci0gIC8vIERpc2FibGUgc2VjdXJlIGNvbm5lY3Rpb25zCi0gIC8vIFRoaXMgaXMgZm9yIHByZSBCVCA0LjEvMiBkZXZpY2VzIHRoYXQgZG8gbm90IGhhbmRsZSBzZWN1cmUgbW9kZQotICAvLyB2ZXJ5IHdlbGwuCi0gIElOVEVST1BfRElTQUJMRV9MRV9TRUNVUkVfQ09OTkVDVElPTlMgPSAwLAotCi0gIC8vIFNvbWUgZGV2aWNlcyBoYXZlIHByb3ZlbiBwcm9ibGVtYXRpYyBkdXJpbmcgdGhlIHBhaXJpbmcgcHJvY2Vzcywgb2Z0ZW4KLSAgLy8gcmVxdWlyaW5nIG11bHRpcGxlIHJldHJpZXMgdG8gY29tcGxldGUgcGFpcmluZy4gVG8gYXZvaWQgZGVncmFkaW5nIHRoZSB1c2VyCi0gIC8vIGV4cGVyaWVuY2UgZm9yIHRob3NlIGRldmljZXMsIGF1dG9tYXRpY2FsbHkgcmUtdHJ5IHBhaXJpbmcgaWYgcGFnZQotICAvLyB0aW1lb3V0cyBhcmUgcmVjZWl2ZWQgZHVyaW5nIHBhaXJpbmcuCi0gIElOVEVST1BfQVVUT19SRVRSWV9QQUlSSU5HLAotCi0gIC8vIERldmljZXMgcmVxdWlyaW5nIHRoaXMgd29ya2Fyb3VuZCBkbyBub3QgaGFuZGxlIEJsdWV0b290aCBBYnNvbHV0ZSBWb2x1bWUKLSAgLy8gY29udHJvbCBjb3JyZWN0bHksIGxlYWRpbmcgdG8gdW5kZXNpcmFibGUgKHBvdGVudGlhbGx5IGhhcm1mdWwpIHZvbHVtZQotICAvLyBsZXZlbHMgb3IgZ2VuZXJhbCBsYWNrIG9mIGNvbnRyb2xhYmlsaXR5LgotICBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FLAotCi0gIC8vIERpc2FibGUgYXV0b21hdGljIHBhaXJpbmcgd2l0aCBoZWFkc2V0cy9jYXIta2l0cwotICAvLyBTb21lIGNhciBraXRzIGRvIG5vdCByZWFjdCBraW5kbHkgdG8gYSBmYWlsZWQgcGFpcmluZyBhdHRlbXB0IGFuZAotICAvLyBkbyBub3QgYWxsb3cgaW1tZWRpYXRlIHJlLXBhaXJpbmcuIFJlamVjdGxpc3QgdGhlc2Ugc28gdGhhdCB0aGUgaW5pdGlhbAotICAvLyBwYWlyaW5nIGF0dGVtcHQgbWFrZXMgaXQgdG8gdGhlIHVzZXIgaW5zdGVhZC4KLSAgSU5URVJPUF9ESVNBQkxFX0FVVE9fUEFJUklORywKLQotICAvLyBVc2UgYSBmaXhlZCBwaW4gZm9yIHNwZWNpZmljIGtleWJvYXJkcwotICAvLyBLZXlib2FyZHMgc2hvdWxkIHVzZSBhIHZhcmlhYmxlIHBpbiBhdCBhbGwgdGltZXMuIEhvd2V2ZXIsIHNvbWUga2V5Ym9hcmRzCi0gIC8vIHJlcXVpcmUgYSBmaXhlZCBwaW4gb2YgYWxsIDAwMDAuIFRoaXMgd29ya2Fyb3VuZCBlbmFibGVzIGF1dG8gcGFpcmluZyBmb3IKLSAgLy8gdGhvc2Uga2V5Ym9hcmRzLgotICBJTlRFUk9QX0tFWUJPQVJEX1JFUVVJUkVTX0ZJWEVEX1BJTiwKLQotICAvLyBTb21lIGhlYWRzZXRzIGhhdmUgYXVkaW8gaml0dGVyIGlzc3VlcyBiZWNhdXNlIG9mIGluY3JlYXNlZAotICAvLyByZS10cmFuc21pc3Npb25zIGFzIHRoZSAzIE1icHMgcGFja2V0cyBoYXZlIGEgbG93ZXIgbGluayBtYXJnaW4sIGFuZCBhcmUKLSAgLy8gbW9yZSBwcm9uZSB0byBpbnRlcmZlcmVuY2UuIFdlIGNhbiBkaXNhYmxlIDNESCBwYWNrZXRzICh1c2Ugb25seSAyREgKLSAgLy8gcGFja2V0cykgZm9yIHRoZSBBQ0wgbGluayB0byBpbXByb3ZlIHNlbnNpdGl2aXR5IHdoZW4gc3RyZWFtaW5nIEEyRFAgYXVkaW8KLSAgLy8gdG8gdGhlIGhlYWRzZXQuIEFpciBzbmlmZmVyIGxvZ3Mgc2hvdyByZWR1Y2VkIHJlLXRyYW5zbWlzc2lvbnMgYWZ0ZXIKLSAgLy8gc3dpdGNoaW5nIHRvIDJESCBwYWNrZXRzLgotCi0gIC8vIERpc2FibGUgM01icHMgcGFja2V0cyBhbmQgdXNlIG9ubHkgMk1icHMgcGFja2V0cyBmb3IgQUNMIGxpbmtzIHdoZW4KLSAgLy8gc3RyZWFtaW5nIGF1ZGlvLgotICBJTlRFUk9QXzJNQlBTX0xJTktfT05MWSwKLQotICAvLyBEbyBub3QgdXNlIHN1cGVydmlzaW9uIHRpbWVvdXQgdmFsdWUgcmVjZWl2ZWQgZnJvbSBwcmVmZXJyZWQgY29ubmVjdGlvbgotICAvLyBwYXJhbWV0ZXJzLCB1c2UgM3MgaW5zdGVhZC4gVXNlIHdpdGggSElEIG9ubHkuCi0gIElOVEVST1BfSElEX1BSRUZfQ09OTl9TVVBfVElNRU9VVF8zUywKLQotICAvLyBEbyBub3Qgc2VuZCBzZXJ2aWNlIGNoYW5nZWQgaW5kaWNhdGlvbnMgKEdBVFQgY2xpZW50KS4KLSAgLy8gVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciB0aGUgY2hhcmFjdGVyaXN0aWMgaXMgaW1wbG1lZW50ZWQgYi82MjA4ODM5NS4KLSAgSU5URVJPUF9HQVRUQ19OT19TRVJWSUNFX0NIQU5HRURfSU5ELAotCi0gIC8vIERvIG5vdCB1c2UgQVZEVFAgUkVDT05GSUdVUkUgd2hlbiByZWNvbmZpZ3VyaW5nIEEyRFAgc3RyZWFtcy4KLSAgLy8gU29tZSBBMkRQIFNpbmsgZGV2aWNlcyByZXBvcnQgU1VDQ0VTUyB0byB0aGUgQVZEVFAgUkVDT05GSUdVUkUgY29tbWFuZCwKLSAgLy8gYnV0IGZhaWwgdG8gcGxheSB0aGUgcmVjb25maWd1cmVkIGF1ZGlvIHN0cmVhbS4KLSAgSU5URVJPUF9ESVNBQkxFX0FWRFRQX1JFQ09ORklHVVJFLAotCi0gIC8vIENyZWF0ZSBkeW5hbWljIHJlamVjdGxpc3QgdG8gZGlzYWJsZSByb2xlIHN3aXRjaC4KLSAgLy8gU29tZSBjYXIga2l0cyBpbmRpY2F0ZSB0aGF0IHJvbGUgc3dpdGNoIGlzIHN1cHBvcnRlZCwgYnV0IHRoZW4gcmVqZWN0Ci0gIC8vIHJvbGUgc3dpdGNoIGF0dGVtcHRzLiBBZnRlciByZWplY3Rpbmcgc2V2ZXJhbCByb2xlIHN3aXRjaCBhdHRlbXB0cywKLSAgLy8gc3VjaCBjYXIga2l0cyB3aWxsIGdvIGludG8gYmFkIHN0YXRlLgotICBJTlRFUk9QX0RZTkFNSUNfUk9MRV9TV0lUQ0gsCi0KLSAgLy8gRGlzYWJsZSByb2xlIHN3aXRjaCBmb3IgaGVhZHNldHMvY2FyLWtpdHMuCi0gIC8vIFNvbWUgY2FyIGtpdHMgYWxsb3cgcm9sZSBzd2l0Y2ggYnV0IHdoZW4gdGhlIFBob25lIGluaXRpYXRlcyByb2xlIHN3aXRjaCwKLSAgLy8gdGhlIFJlbW90ZSBkZXZpY2Ugd2lsbCBnbyBpbnRvIGJhZCBzdGF0ZSB0aGF0IHdpbGwgbGVhZCB0byBMTVAgdGltZSBvdXQuCi0gIElOVEVST1BfRElTQUJMRV9ST0xFX1NXSVRDSCwKLQotICAvLyBTZXQgYSB2ZXJ5IGxvdyBpbml0aWFsIHNuaWZmIHN1YnJhdGluZyBmb3IgSElEIGRldmljZXMgdGhhdCBkbyBub3QKLSAgLy8gc2V0IHRoZWlyIG93biBzbmlmZiBpbnRlcnZhbC4KLSAgSU5URVJPUF9ISURfSE9TVF9MSU1JVF9TTklGRl9JTlRFUlZBTCwKLQotICAvLyBEaXNhYmxlIHJlbW90ZSBuYW1lIHJlcXVzdCBmb3Igc29tZSBkZXZpY2VzLgotICAvLyBUaGUgcHVibGljIGFkZHJlc3Mgb2YgdGhlc2UgZGV2aWNlcyBhcmUgc2FtZSBhcyB0aGUgUmFuZG9tIGFkZHJlc3MgaW4gQURWLgotICAvLyBUaGVuIHdpbGwgZ2V0IG5hbWUgYnkgTEVfQ3JlYXRlX2Nvbm5lY3Rpb24sIGFjdHVhbGx5IGZhaWxzLAotICAvLyBidXQgd2lsbCBibG9jayBwYWlyaW5nLgotICBJTlRFUk9QX0RJU0FCTEVfTkFNRV9SRVFVRVNULAotCi0gIC8vIFJlc3BvbmQgQVZSQ1AgcHJvZmlsZSB2ZXJzaW9uIG9ubHkgMS40IGZvciBzb21lIGRldmljZS4KLSAgSU5URVJPUF9BVlJDUF8xXzRfT05MWSwKLQotICAvLyBEaXNhYmxlIHNuaWZmIG1vZGUgZm9yIGhlYWRzZXRzL2Nhci1raXRzCi0gIC8vIFNvbWUgY2FyIGtpdHMgc3VwcG9ydHMgc25pZmYgbW9kZSBidXQgd2hlbiBEVVQgaW5pdGlhdGVzIHNuaWZmIHJlcQotICAvLyBSZW1vdGUgd2lsbCBnbyB0byBiYWQgc3RhdGUgYW5kIGl0cyBsZWFkcyB0byBMTVAgdGltZSBvdXQuCi0gIElOVEVST1BfRElTQUJMRV9TTklGRiwKLQotICAvLyBEbyBub3Qgc2VuZCBBVkRUUCBTVVNQRU5EIHdoaWxlIHRoZSBwbGF5YmFjayBpcyBwYXVzZWQuCi0gIC8vIFNvbWUgb2xkZXIgQTJEUCBTaW5rIGRldmljZXMgbWlnaHQgbm90IHN1cHBvcnQgdG8gcGF1c2UgdGhlIHN0cmVhbWluZy4KLSAgSU5URVJPUF9ESVNBQkxFX0FWRFRQX1NVU1BFTkQsCi0KLSAgLy8gU29tZSBjYXIga2l0cyBkbyBub3Qgc2VuZCB0aGUgQVQrQklORCBjb21tYW5kIHdoaWxlIGVzdGFibGlzaGluZyB0aGUgU0xDCi0gIC8vIHdoaWNoIGNhdXNlcyBhbiBIRlAgcHJvZmlsZSBjb25uZWN0aW9uIGZhaWx1cmUKLSAgSU5URVJPUF9TTENfU0tJUF9CSU5EX0NPTU1BTkQKLX0gaW50ZXJvcF9mZWF0dXJlX3Q7Ci0KLS8vIENoZWNrIGlmIGEgZ2l2ZW4gfGFkZHJ8IG1hdGNoZXMgYSBrbm93biBpbnRlcm9wZXJhYmlsaXR5IHdvcmthcm91bmQgYXMKLS8vIGlkZW50aWZpZWQgYnkgdGhlIHxpbnRlcm9wX2ZlYXR1cmVfdHwgZW51bS4gVGhpcyBBUEkgaXMgdXNlZCBmb3Igc2ltcGxlCi0vLyBhZGRyZXNzIGJhc2VkIGxvb2t1cHMgd2hlcmUgbW9yZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBObwotLy8gbG9vay11cHMgb3IgcmFuZG9tIGFkZHJlc3MgcmVzb2x1dGlvbiBhcmUgcGVyZm9ybWVkIG9uIHxhZGRyfC4KLWJvb2wgaW50ZXJvcF9tYXRjaF9hZGRyKGNvbnN0IGludGVyb3BfZmVhdHVyZV90IGZlYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyKTsKLQotLy8gQ2hlY2sgaWYgYSBnaXZlbiByZW1vdGUgZGV2aWNlIHxuYW1lfCBtYXRjaGVzIGEga25vd24gd29ya2Fyb3VuZC4KLS8vIE5hbWUgY29tcGFyaXNvbnMgYXJlIGNhc2Ugc2Vuc2l0aXZlIGFuZCBkbyBub3QgYWxsb3cgZm9yIHBhcnRpYWwgbWF0Y2hlcy4KLS8vIElmIHxuYW1lfCBpcyAiVEVTVCIgYW5kIGEgd29ya2Fyb3VuZCBleGlzdHMgZm9yICJURVNUSU5HIiwgdGhlbiB0aGlzIGZ1bmN0aW9uCi0vLyB3aWxsIHJldHVybiBmYWxzZS4gQnV0LCBpZiB8bmFtZXwgaXMgIlRFU1RJTkciIGFuZCBhIHdvcmthcm91bmQgZXhpc3RzIGZvcgotLy8gIlRFU1QiLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUuCi0vLyB8bmFtZXwgY2Fubm90IGJlIG51bGwgYW5kIG11c3QgYmUgbnVsbCB0ZXJtaW5hdGVkLgotYm9vbCBpbnRlcm9wX21hdGNoX25hbWUoY29uc3QgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZSwgY29uc3QgY2hhciogbmFtZSk7Ci0KLS8vIEFkZCBhIGR5bmFtaWMgaW50ZXJvcCBkYXRhYmFzZSBlbnRyeSBmb3IgYSBkZXZpY2UgbWF0Y2hpbmcgdGhlIGZpcnN0IHxsZW5ndGh8Ci0vLyBieXRlcyBvZiB8YWRkcnwsIGltcGxlbWVudGluZyB0aGUgd29ya2Fyb3VuZCBpZGVudGlmaWVkIGJ5IHxmZWF0dXJlfC4KLS8vIHxhZGRyfCBtYXkgbm90IGJlIG51bGwuCi0vLyB8bGVuZ3RofCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gUmF3QWRkcmVzczo6a0xlbmd0aC4KLS8vIEFzIHxpbnRlcm9wX2ZlYXR1cmVfdHwgaXMgbm90IGV4cG9zZWQgaW4gdGhlIHB1YmxpYyBBUEksIGZlYXR1cmUgbXVzdCBiZSBhCi0vLyB2YWxpZCBpbnRlZ2VyIHJlcHJlc2VudGluZyBhbiBvcHRpb24gaW4gdGhlIGVudW0uCi12b2lkIGludGVyb3BfZGF0YWJhc2VfYWRkKHVpbnQxNl90IGZlYXR1cmUsIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0vLyBDbGVhciB0aGUgZHluYW1pYyBwb3J0aW9uIG9mIHRoZSBpbnRlcm9wZXJhYmlsaXR5IHdvcmthcm91bmQgZGF0YWJhc2UuCi12b2lkIGludGVyb3BfZGF0YWJhc2VfY2xlYXIodm9pZCk7CmRpZmYgLS1naXQgYS9kZXZpY2UvaW5jbHVkZS9pbnRlcm9wX2RhdGFiYXNlLmggYi9kZXZpY2UvaW5jbHVkZS9pbnRlcm9wX2RhdGFiYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTFiZDguLjAwMDAwMDAKLS0tIGEvZGV2aWNlL2luY2x1ZGUvaW50ZXJvcF9kYXRhYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGludGVyb3BfZmVhdHVyZV90IGZlYXR1cmU7Ci19IGludGVyb3BfYWRkcl9lbnRyeV90OwotCi1zdGF0aWMgY29uc3QgaW50ZXJvcF9hZGRyX2VudHJ5X3QgaW50ZXJvcF9hZGRyX2RhdGFiYXNlW10gPSB7Ci0gICAgLy8gTmV4dXMgUmVtb3RlIChTcGlrZSkKLSAgICAvLyBOb3RlOiBNYXkgYWZmZWN0IG90aGVyIEFzdXMgYnJhbmQgZGV2aWNlcwotICAgIHt7ezB4MDgsIDB4NjIsIDB4NjYsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OU30sCi0gICAge3t7MHgzOCwgMHgyYywgMHg0YSwgMHhjOSwgMCwgMH19LAotICAgICA0LAotICAgICBJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TfSwKLSAgICB7e3sweDM4LCAweDJjLCAweDRhLCAweGU2LCAwLCAwfX0sCi0gICAgIDQsCi0gICAgIElOVEVST1BfRElTQUJMRV9MRV9TRUNVUkVfQ09OTkVDVElPTlN9LAotICAgIHt7ezB4NTQsIDB4YTAsIDB4NTAsIDB4ZDksIDAsIDB9fSwKLSAgICAgNCwKLSAgICAgSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OU30sCi0gICAge3t7MHhhYywgMHg5ZSwgMHgxNywgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TfSwKLSAgICB7e3sweGYwLCAweDc5LCAweDU5LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9MRV9TRUNVUkVfQ09OTkVDVElPTlN9LAotCi0gICAge3t7MHgwOCwgMHg2MiwgMHg2NiwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0hJRF9QUkVGX0NPTk5fU1VQX1RJTUVPVVRfM1N9LAotICAgIHt7ezB4MzgsIDB4MmMsIDB4NGEsIDB4YzksIDAsIDB9fSwgNCwgSU5URVJPUF9ISURfUFJFRl9DT05OX1NVUF9USU1FT1VUXzNTfSwKLSAgICB7e3sweDM4LCAweDJjLCAweDRhLCAweGU2LCAwLCAwfX0sIDQsIElOVEVST1BfSElEX1BSRUZfQ09OTl9TVVBfVElNRU9VVF8zU30sCi0gICAge3t7MHg1NCwgMHhhMCwgMHg1MCwgMHhkOSwgMCwgMH19LCA0LCBJTlRFUk9QX0hJRF9QUkVGX0NPTk5fU1VQX1RJTUVPVVRfM1N9LAotICAgIHt7ezB4YWMsIDB4OWUsIDB4MTcsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ISURfUFJFRl9DT05OX1NVUF9USU1FT1VUXzNTfSwKLSAgICB7e3sweGYwLCAweDc5LCAweDU5LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfSElEX1BSRUZfQ09OTl9TVVBfVElNRU9VVF8zU30sCi0KLSAgICAvLyBBdXNkb20gTTA1IC0gdW5hY2NlcHRhYmx5IGxvdWQgdm9sdW1lCi0gICAge3t7MHhhMCwgMHhlOSwgMHhkYiwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLQotICAgIC8vIEJNVyBjYXIga2l0cyAoSGFybWFuL0JlY2tlcikKLSAgICB7e3sweDljLCAweGRmLCAweDAzLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfQVVUT19SRVRSWV9QQUlSSU5HfSwKLQotICAgIC8vIEZsaWMgc21hcnQgYnV0dG9uCi0gICAge3t7MHg4MCwgMHhlNCwgMHhkYSwgMHg3MCwgMCwgMH19LAotICAgICA0LAotICAgICBJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TfSwKLQotICAgIC8vIGlLcm9zcyBJS0JUODNCIEhTIC0gdW5hY2NlcHRhYmx5IGxvdWQgdm9sdW1lCi0gICAge3t7MHgwMCwgMHgxNCwgMHgwMiwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLQotICAgIC8vIEpheUJpcmQgQmx1ZUJ1ZHMgWCAtIGxvdyBncmFudWxhcml0eSBvbiB2b2x1bWUgY29udHJvbAotICAgIHt7ezB4NDQsIDB4NWUsIDB4ZjMsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX0FCU09MVVRFX1ZPTFVNRX0sCi0gICAge3t7MHhkNCwgMHg5YywgMHgyOCwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLQotICAgIC8vIEJvc2UgUXVpdGVDb21mb3J0IDM1LCBTb3VuZFNwb3J0IGFuZCBzaW1pbGFyIChiZWNhdXNlIG9mIG9sZGVyIGZpcm13YXJlKQotICAgIHt7ezB4MDQsIDB4NTIsIDB4YzcsIDAsIDAsIDB9fSwgMywgSU5URVJPUF8yTUJQU19MSU5LX09OTFl9LAotCi0gICAgLy8gSmF5QmlyZCBGYW1pbHkKLSAgICB7e3sweDAwLCAweDE4LCAweDkxLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfMk1CUFNfTElOS19PTkxZfSwKLQotICAgIC8vIFNvbnkgTUJILTEwCi0gICAge3t7MHgyMCwgMHgxNSwgMHgwNiwgMCwgMCwgMH19LCAzLCBJTlRFUk9QXzJNQlBTX0xJTktfT05MWX0sCi0KLSAgICAvLyBVY29ubmVjdAotICAgIHt7ezB4MDAsIDB4NTQsIDB4YWYsIDAsIDAsIDB9fSwgMywgSU5URVJPUF8yTUJQU19MSU5LX09OTFl9LAotICAgIHt7ezB4MzAsIDB4MTQsIDB4NGEsIDAsIDAsIDB9fSwgMywgSU5URVJPUF8yTUJQU19MSU5LX09OTFl9LAotCi0gICAgLy8gTEcgVG9uZSBIQlMtNzMwIC0gdW5hY2NlcHRhYmx5IGxvdWQgdm9sdW1lCi0gICAge3t7MHgwMCwgMHgxOCwgMHg2YiwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLSAgICB7e3sweGI4LCAweGFkLCAweDNlLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUV9LAotCi0gICAgLy8gTEcgVG9uZSBIVi04MDAgLSB1bmFjY2VwdGFibHkgbG91ZCB2b2x1bWUKLSAgICB7e3sweGEwLCAweGU5LCAweGRiLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUV9LAotCi0gICAgLy8gTW90b3JvbGEgS2V5IExpbmsKLSAgICB7e3sweDFjLCAweDk2LCAweDVhLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9MRV9TRUNVUkVfQ09OTkVDVElPTlN9LAotCi0gICAgLy8gTW90b3JvbGEgUm9hZHN0ZXIKLSAgICB7e3sweDAwLCAweDI0LCAweDFDLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUV9LAotCi0gICAgLy8gTXBvdyBDaGVldGFoIC0gdW5hY2NlcHRhYmx5IGxvdWQgdm9sdW1lCi0gICAge3t7MHgwMCwgMHgxMSwgMHhiMSwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLQotICAgIC8vIE5pc3NhbiBjYXIga2l0cyAoQUxQUykgLSBhdXRvLXBhaXJpbmcgZmFpbHMgYW5kIHJlamVjdHMgbmV4dCBwYWlyaW5nCi0gICAge3t7MHgzNCwgMHhjNywgMHgzMSwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQVVUT19QQUlSSU5HfSwKLQotICAgIC8vIFNPTCBSRVBVQkxJQyBUcmFja3MgQWlyIC0gdW5hYmxlIHRvIGFkanVzdCB2b2x1bWUgYmFjayBvZmYgZnJvbSBtYXgKLSAgICB7e3sweGE0LCAweDE1LCAweDY2LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUV9LAotCi0gICAgLy8gU3ViYXJ1IGNhciBraXRzIChBTFBTKSAtIGF1dG8tcGFpcmluZyBmYWlscyBhbmQgcmVqZWN0cyBuZXh0IHBhaXJpbmcKLSAgICB7e3sweDAwLCAweDA3LCAweDA0LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkd9LAotICAgIHt7ezB4ZTAsIDB4NzUsIDB4MGEsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX0FVVE9fUEFJUklOR30sCi0KLSAgICAvLyBTd2FnZSBSb2tpdGJvb3N0IEhTIC0gdW5hY2NlcHRhYmx5IGxvdWQgdm9sdW1lCi0gICAge3t7MHgwMCwgMHgxNCwgMHhmMSwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLQotICAgIC8vIFZXIENhciBLaXQgLSBub3QgZW5vdWdoIGdyYW51bGFyaXR5IHdpdGggdm9sdW1lCi0gICAge3t7MHgwMCwgMHgyNiwgMHg3ZSwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLSAgICB7e3sweDkwLCAweDAzLCAweGI3LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUV9LAotCi0gICAgLy8gVW5rbm93biBrZXlib2FyZCAoY2FycmllZCBvdmVyIGZyb20gYXV0b19wYWlyX2Rldmxpc3QuY29uZikKLSAgICB7e3sweDAwLCAweDBGLCAweEY2LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfS0VZQk9BUkRfUkVRVUlSRVNfRklYRURfUElOfSwKLQotICAgIC8vIEtlbndvb2QgS01NLUJUNTE4SEQgLSBubyBhdWRpbyB3aGVuIEEyRFAgY29kZWMgc2FtcGxlIHJhdGUgaXMgY2hhbmdlZAotICAgIHt7ezB4MDAsIDB4MWQsIDB4ODYsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX0FWRFRQX1JFQ09ORklHVVJFfSwKLQotICAgIC8vIE5BQyBGT1JELTIwMTMgLSBMaW5jb2xuCi0gICAge3t7MHgwMCwgMHgyNiwgMHhiNCwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfUk9MRV9TV0lUQ0h9LAotCi0gICAgLy8gVG95b3RhIFByaXVzIC0gMjAxNQotICAgIHt7ezB4ZmMsIDB4YzIsIDB4ZGUsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX1JPTEVfU1dJVENIfSwKLQotICAgIC8vIE9CVSBJSSBCbHVldG9vdGggZG9uZ2xlCi0gICAge3t7MHgwMCwgMHgwNCwgMHgzZSwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfUk9MRV9TV0lUQ0h9LAotCi0gICAgLy8gUm9tYW4gUjkwMjAKLSAgICB7e3sweDAwLCAweDIzLCAweDAxLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9ST0xFX1NXSVRDSH0sCi0KLSAgICAvLyBKYWJyYSBTdG9ybQotICAgIHt7ezB4MWMsIDB4NDgsIDB4ZjksIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX1JPTEVfU1dJVENIfSwKLQotICAgIC8vIEplZXAgVWNvbm5lY3QKLSAgICB7e3sweDAwLCAweDU0LCAweGFmLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9ST0xFX1NXSVRDSH0sCi0KLSAgICAvLyBkZWVwYmx1ZTIgLSBjYW5ub3QgY2hhbmdlIHNtb290aGx5IHRoZSB2b2x1bWU6IGIvMzc4MzQwMzUKLSAgICB7e3sweDBjLCAweGE2LCAweDk0LCAwLCAwLCAwfX0sIDMsIElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUV9LAotCi0gICAgLy8gQWlyUG9kcyAyIC0gdW5hY2NlcHRhYmx5IGxvdWQgdm9sdW1lCi0gICAge3t7MHg5NCwgMHgxNiwgMHgyNSwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfQUJTT0xVVEVfVk9MVU1FfSwKLQotICAgIC8vIEFpclBvZHMgMiAtIHVuYWNjZXB0YWJseSBsb3VkIHZvbHVtZQotICAgIHt7ezB4OWMsIDB4NjQsIDB4OGIsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX0FCU09MVVRFX1ZPTFVNRX0sCi0KLSAgICAvLyBmb3Igc2tpcCBuYW1lIHJlcXVlc3QsCi0gICAgLy8gYmVjYXVzZSBCUi9FRFIgYWRkcmVzcyBhbmQgQURWIHJhbmRvbSBhZGRyZXNzIGFyZSB0aGUgc2FtZQotICAgIHt7ezB4ZDQsIDB4N2EsIDB4ZTIsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9ESVNBQkxFX05BTUVfUkVRVUVTVH0sCi0KLSAgICAvLyBMZXh1cyBDYXJraXQKLSAgICB7e3sweDY0LCAweGQ0LCAweGJkLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfQVZSQ1BfMV80X09OTFl9LAotCi0gICAgLy8gTWF6ZGEgQ2Fya2l0Ci0gICAge3t7MHhmYywgMHgzNSwgMHhlNiwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0FWUkNQXzFfNF9PTkxZfSwKLQotICAgIC8vIFRveW90YSBDYXIgQXVkaW8KLSAgICB7e3sweDAwLCAweDE3LCAweDUzLCAwLCAwLCAwfX0sIDMsIElOVEVST1BfQVZSQ1BfMV80X09OTFl9LAotCi0gICAgLy8gSG9uZGEgSGlnaCBFbmQgQ2Fya2l0Ci0gICAge3t7MHg5YywgMHg4ZCwgMHg3YywgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0FWUkNQXzFfNF9PTkxZfSwKLQotICAgIC8vIEhvbmRhIENpdmljIENhcmtpdAotICAgIHt7ezB4MGMsIDB4ZDksIDB4YzEsIDAsIDAsIDB9fSwgMywgSU5URVJPUF9BVlJDUF8xXzRfT05MWX0sCi0KLSAgICAvLyBCTVcgQ2Fya2l0Ci0gICAge3t7MHg5YywgMHhkZiwgMHgwMywgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0FWUkNQXzFfNF9PTkxZfSwKLQotICAgIC8vIEtEREkgQ2Fya2l0Ci0gICAge3t7MHg0NCwgMHhlYSwgMHhkOCwgMCwgMCwgMH19LCAzLCBJTlRFUk9QX0RJU0FCTEVfU05JRkZ9LAotCi0gICAgLy8gVG95b3RhIENhbXJ5IDIwMTggQ2Fya2l0IEhGUCBBVCtCSU5EIG1pc3NpbmcKLSAgICB7e3sweDk0LCAweGIyLCAweGNjLCAweDMwLCAwLCAwfX0sIDQsIElOVEVST1BfU0xDX1NLSVBfQklORF9DT01NQU5EfSwKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciBuYW1lWzIwXTsKLSAgc2l6ZV90IGxlbmd0aDsKLSAgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZTsKLX0gaW50ZXJvcF9uYW1lX2VudHJ5X3Q7Ci0KLXN0YXRpYyBjb25zdCBpbnRlcm9wX25hbWVfZW50cnlfdCBpbnRlcm9wX25hbWVfZGF0YWJhc2VbXSA9IHsKLSAgICAvLyBDYXJyaWVkIG92ZXIgZnJvbSBhdXRvX3BhaXJfZGV2bGlzdC5jb25mIG1pZ3JhdGlvbgotICAgIHsiQXVkaSIsIDQsIElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkd9LAotICAgIHsiQk1XIiwgMywgSU5URVJPUF9ESVNBQkxFX0FVVE9fUEFJUklOR30sCi0gICAgeyJQYXJyb3QiLCA2LCBJTlRFUk9QX0RJU0FCTEVfQVVUT19QQUlSSU5HfSwKLSAgICB7IkNhciIsIDMsIElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkd9LAotCi0gICAgLy8gTmlzc2FuIFF1ZXN0IHJlamVjdHMgcGFpcmluZyBhZnRlciAiMDAwMCIKLSAgICB7Ik5JU1NBTiIsIDYsIElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkd9LAotCi0gICAgLy8gU3ViYXJ1IGNhciBraXRzICgiQ0FSIE1fTUVESUEiKQotICAgIHsiQ0FSIiwgMywgSU5URVJPUF9ESVNBQkxFX0FVVE9fUEFJUklOR30sCi0KLSAgICAvLyBQaXhlbCBDIEtleWJvYXJkIGRvZXNuJ3QgcmVzcG9uZCB0byBzZXJ2aWNlIGNoYW5nZWQgaW5kaWNhdGlvbnMuCi0gICAgeyJQaXhlbCBDIEtleWJvYXJkIiwgMTYsIElOVEVST1BfR0FUVENfTk9fU0VSVklDRV9DSEFOR0VEX0lORH0sCi0KLSAgICAvLyBLZW53b29kIEtNTS1CVDUxOEhEIC0gbm8gYXVkaW8gd2hlbiBBMkRQIGNvZGVjIHNhbXBsZSByYXRlIGlzIGNoYW5nZWQKLSAgICB7IktNTS1CVDUxKkhEIiwgMTEsIElOVEVST1BfRElTQUJMRV9BVkRUUF9SRUNPTkZJR1VSRX0sCi0KLSAgICAvLyBOaW50ZW5kbyBTd2l0Y2ggUHJvIENvbnRyb2xsZXIgYW5kIEpveSBDb24gLSBkbyBub3Qgc2V0IHNuaWZmIGludGVydmFsCi0gICAgLy8gZHluYW1pY2FsbHkuIFRoZXkgcmVxdWlyZSBjdXN0b20gSElEIHJlcG9ydCBjb21tYW5kIHRvIGNoYW5nZSBtb2RlLgotICAgIHsiUHJvIENvbnRyb2xsZXIiLCAxNCwgSU5URVJPUF9ISURfSE9TVF9MSU1JVF9TTklGRl9JTlRFUlZBTH0sCi0gICAgeyJKb3ktQ29uIiwgNywgSU5URVJPUF9ISURfSE9TVF9MSU1JVF9TTklGRl9JTlRFUlZBTH0sCi19OwpkaWZmIC0tZ2l0IGEvZGV2aWNlL3NyYy9jb250cm9sbGVyLmNjIGIvZGV2aWNlL3NyYy9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY0NjUxLi4wMDAwMDAwCi0tLSBhL2RldmljZS9zcmMvY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9jb250cm9sbGVyLmgiCi0KLWNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkgewotICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2RldmljZS9zcmMvZXNjb19wYXJhbWV0ZXJzLmNjIGIvZGV2aWNlL3NyYy9lc2NvX3BhcmFtZXRlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0M2UyMzAuLjAwMDAwMDAKLS0tIGEvZGV2aWNlL3NyYy9lc2NvX3BhcmFtZXRlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2VzY29fcGFyYW1ldGVycy5oIgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLQotc3RhdGljIGNvbnN0IGVuaF9lc2NvX3BhcmFtc190IGRlZmF1bHRfZXNjb19wYXJhbWV0ZXJzW0VTQ09fTlVNX0NPREVDU10gPSB7Ci0gICAgLy8gQ1ZTRCBEMQotICAgIHsKLSAgICAgICAgLnRyYW5zbWl0X2JhbmR3aWR0aCA9IFRYUlhfNjRLQklUU19SQVRFLAotICAgICAgICAucmVjZWl2ZV9iYW5kd2lkdGggPSBUWFJYXzY0S0JJVFNfUkFURSwKLSAgICAgICAgLnRyYW5zbWl0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfQ1ZTRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAucmVjZWl2ZV9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX0NWU0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCA9IDB4MDAwMH0sCi0gICAgICAgIC50cmFuc21pdF9jb2RlY19mcmFtZV9zaXplID0gNjAsCi0gICAgICAgIC5yZWNlaXZlX2NvZGVjX2ZyYW1lX3NpemUgPSA2MCwKLSAgICAgICAgLmlucHV0X2JhbmR3aWR0aCA9IElOUFVUX09VVFBVVF82NEtfUkFURSwKLSAgICAgICAgLm91dHB1dF9iYW5kd2lkdGggPSBJTlBVVF9PVVRQVVRfNjRLX1JBVEUsCi0gICAgICAgIC5pbnB1dF9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAub3V0cHV0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkID0gMHgwMDAwfSwKLSAgICAgICAgLmlucHV0X2NvZGVkX2RhdGFfc2l6ZSA9IDE2LAotICAgICAgICAub3V0cHV0X2NvZGVkX2RhdGFfc2l6ZSA9IDE2LAotICAgICAgICAuaW5wdXRfcGNtX2RhdGFfZm9ybWF0ID0gRVNDT19QQ01fREFUQV9GT1JNQVRfMl9DT01QLAotICAgICAgICAub3V0cHV0X3BjbV9kYXRhX2Zvcm1hdCA9IEVTQ09fUENNX0RBVEFfRk9STUFUXzJfQ09NUCwKLSAgICAgICAgLmlucHV0X3BjbV9wYXlsb2FkX21zYl9wb3NpdGlvbiA9IDAsCi0gICAgICAgIC5vdXRwdXRfcGNtX3BheWxvYWRfbXNiX3Bvc2l0aW9uID0gMCwKLSAgICAgICAgLmlucHV0X2RhdGFfcGF0aCA9IEVTQ09fREFUQV9QQVRIX1BDTSwKLSAgICAgICAgLm91dHB1dF9kYXRhX3BhdGggPSBFU0NPX0RBVEFfUEFUSF9QQ00sCi0gICAgICAgIC5pbnB1dF90cmFuc3BvcnRfdW5pdF9zaXplID0gMHgwMCwKLSAgICAgICAgLm91dHB1dF90cmFuc3BvcnRfdW5pdF9zaXplID0gMHgwMCwKLSAgICAgICAgLm1heF9sYXRlbmN5X21zID0gMHhGRkZGLCAgLy8gRG9uJ3QgY2FyZQotICAgICAgICAucGFja2V0X3R5cGVzID0gKEVTQ09fUEtUX1RZUEVTX01BU0tfSFYxIHwgRVNDT19QS1RfVFlQRVNfTUFTS19IVjIgfAotICAgICAgICAgICAgICAgICAgICAgICAgIEVTQ09fUEtUX1RZUEVTX01BU0tfSFYzKSwKLSAgICAgICAgLnJldHJhbnNtaXNzaW9uX2VmZm9ydCA9IEVTQ09fUkVUUkFOU01JU1NJT05fT0ZGLAotICAgIH0sCi0gICAgLy8gQ1ZTRCBTMwotICAgIHsKLSAgICAgICAgLnRyYW5zbWl0X2JhbmR3aWR0aCA9IFRYUlhfNjRLQklUU19SQVRFLAotICAgICAgICAucmVjZWl2ZV9iYW5kd2lkdGggPSBUWFJYXzY0S0JJVFNfUkFURSwKLSAgICAgICAgLnRyYW5zbWl0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfQ1ZTRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAucmVjZWl2ZV9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX0NWU0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCA9IDB4MDAwMH0sCi0gICAgICAgIC50cmFuc21pdF9jb2RlY19mcmFtZV9zaXplID0gNjAsCi0gICAgICAgIC5yZWNlaXZlX2NvZGVjX2ZyYW1lX3NpemUgPSA2MCwKLSAgICAgICAgLmlucHV0X2JhbmR3aWR0aCA9IElOUFVUX09VVFBVVF82NEtfUkFURSwKLSAgICAgICAgLm91dHB1dF9iYW5kd2lkdGggPSBJTlBVVF9PVVRQVVRfNjRLX1JBVEUsCi0gICAgICAgIC5pbnB1dF9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAub3V0cHV0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkID0gMHgwMDAwfSwKLSAgICAgICAgLmlucHV0X2NvZGVkX2RhdGFfc2l6ZSA9IDE2LAotICAgICAgICAub3V0cHV0X2NvZGVkX2RhdGFfc2l6ZSA9IDE2LAotICAgICAgICAuaW5wdXRfcGNtX2RhdGFfZm9ybWF0ID0gRVNDT19QQ01fREFUQV9GT1JNQVRfMl9DT01QLAotICAgICAgICAub3V0cHV0X3BjbV9kYXRhX2Zvcm1hdCA9IEVTQ09fUENNX0RBVEFfRk9STUFUXzJfQ09NUCwKLSAgICAgICAgLmlucHV0X3BjbV9wYXlsb2FkX21zYl9wb3NpdGlvbiA9IDAsCi0gICAgICAgIC5vdXRwdXRfcGNtX3BheWxvYWRfbXNiX3Bvc2l0aW9uID0gMCwKLSAgICAgICAgLmlucHV0X2RhdGFfcGF0aCA9IEVTQ09fREFUQV9QQVRIX1BDTSwKLSAgICAgICAgLm91dHB1dF9kYXRhX3BhdGggPSBFU0NPX0RBVEFfUEFUSF9QQ00sCi0gICAgICAgIC5pbnB1dF90cmFuc3BvcnRfdW5pdF9zaXplID0gMHgwMCwKLSAgICAgICAgLm91dHB1dF90cmFuc3BvcnRfdW5pdF9zaXplID0gMHgwMCwKLSAgICAgICAgLm1heF9sYXRlbmN5X21zID0gMTAsCi0gICAgICAgIC5wYWNrZXRfdHlwZXMgPQotICAgICAgICAgICAgKEVTQ09fUEtUX1RZUEVTX01BU0tfSFYxIHwgRVNDT19QS1RfVFlQRVNfTUFTS19IVjIgfAotICAgICAgICAgICAgIEVTQ09fUEtUX1RZUEVTX01BU0tfSFYzIHwgRVNDT19QS1RfVFlQRVNfTUFTS19FVjMgfAotICAgICAgICAgICAgIEVTQ09fUEtUX1RZUEVTX01BU0tfRVY0IHwgRVNDT19QS1RfVFlQRVNfTUFTS19FVjUgfAotICAgICAgICAgICAgIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjMgfCBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzJfRVY1IHwKLSAgICAgICAgICAgICBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVY1KSwKLSAgICAgICAgLnJldHJhbnNtaXNzaW9uX2VmZm9ydCA9IEVTQ09fUkVUUkFOU01JU1NJT05fUE9XRVIsCi0gICAgfSwKLSAgICAvLyBDVlNEIFM0Ci0gICAgewotICAgICAgICAudHJhbnNtaXRfYmFuZHdpZHRoID0gVFhSWF82NEtCSVRTX1JBVEUsCi0gICAgICAgIC5yZWNlaXZlX2JhbmR3aWR0aCA9IFRYUlhfNjRLQklUU19SQVRFLAotICAgICAgICAudHJhbnNtaXRfY29kaW5nX2Zvcm1hdCA9IHsuY29kaW5nX2Zvcm1hdCA9IEVTQ09fQ09ESU5HX0ZPUk1BVF9DVlNELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFueV9pZCA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCA9IDB4MDAwMH0sCi0gICAgICAgIC5yZWNlaXZlX2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfQ1ZTRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFueV9pZCA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkID0gMHgwMDAwfSwKLSAgICAgICAgLnRyYW5zbWl0X2NvZGVjX2ZyYW1lX3NpemUgPSA2MCwKLSAgICAgICAgLnJlY2VpdmVfY29kZWNfZnJhbWVfc2l6ZSA9IDYwLAotICAgICAgICAuaW5wdXRfYmFuZHdpZHRoID0gSU5QVVRfT1VUUFVUXzY0S19SQVRFLAotICAgICAgICAub3V0cHV0X2JhbmR3aWR0aCA9IElOUFVUX09VVFBVVF82NEtfUkFURSwKLSAgICAgICAgLmlucHV0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFueV9pZCA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCA9IDB4MDAwMH0sCi0gICAgICAgIC5vdXRwdXRfY29kaW5nX2Zvcm1hdCA9IHsuY29kaW5nX2Zvcm1hdCA9IEVTQ09fQ09ESU5HX0ZPUk1BVF9MSU5FQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFueV9pZCA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAuaW5wdXRfY29kZWRfZGF0YV9zaXplID0gMTYsCi0gICAgICAgIC5vdXRwdXRfY29kZWRfZGF0YV9zaXplID0gMTYsCi0gICAgICAgIC5pbnB1dF9wY21fZGF0YV9mb3JtYXQgPSBFU0NPX1BDTV9EQVRBX0ZPUk1BVF8yX0NPTVAsCi0gICAgICAgIC5vdXRwdXRfcGNtX2RhdGFfZm9ybWF0ID0gRVNDT19QQ01fREFUQV9GT1JNQVRfMl9DT01QLAotICAgICAgICAuaW5wdXRfcGNtX3BheWxvYWRfbXNiX3Bvc2l0aW9uID0gMCwKLSAgICAgICAgLm91dHB1dF9wY21fcGF5bG9hZF9tc2JfcG9zaXRpb24gPSAwLAotICAgICAgICAuaW5wdXRfZGF0YV9wYXRoID0gRVNDT19EQVRBX1BBVEhfUENNLAotICAgICAgICAub3V0cHV0X2RhdGFfcGF0aCA9IEVTQ09fREFUQV9QQVRIX1BDTSwKLSAgICAgICAgLmlucHV0X3RyYW5zcG9ydF91bml0X3NpemUgPSAweDAwLAotICAgICAgICAub3V0cHV0X3RyYW5zcG9ydF91bml0X3NpemUgPSAweDAwLAotICAgICAgICAubWF4X2xhdGVuY3lfbXMgPSAxMiwKLSAgICAgICAgLnBhY2tldF90eXBlcyA9Ci0gICAgICAgICAgICAoRVNDT19QS1RfVFlQRVNfTUFTS19IVjEgfCBFU0NPX1BLVF9UWVBFU19NQVNLX0hWMiB8Ci0gICAgICAgICAgICAgRVNDT19QS1RfVFlQRVNfTUFTS19IVjMgfCBFU0NPX1BLVF9UWVBFU19NQVNLX0VWMyB8Ci0gICAgICAgICAgICAgRVNDT19QS1RfVFlQRVNfTUFTS19FVjQgfCBFU0NPX1BLVF9UWVBFU19NQVNLX0VWNSB8Ci0gICAgICAgICAgICAgRVNDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWMyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgfAotICAgICAgICAgICAgIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpLAotICAgICAgICAucmV0cmFuc21pc3Npb25fZWZmb3J0ID0gRVNDT19SRVRSQU5TTUlTU0lPTl9RVUFMSVRZLAotICAgIH0sCi0gICAgLy8gbVNCQyBUMQotICAgIHsKLSAgICAgICAgLnRyYW5zbWl0X2JhbmR3aWR0aCA9IFRYUlhfNjRLQklUU19SQVRFLAotICAgICAgICAucmVjZWl2ZV9iYW5kd2lkdGggPSBUWFJYXzY0S0JJVFNfUkFURSwKLSAgICAgICAgLnRyYW5zbWl0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfTVNCQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAucmVjZWl2ZV9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX01TQkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCA9IDB4MDAwMH0sCi0gICAgICAgIC50cmFuc21pdF9jb2RlY19mcmFtZV9zaXplID0gNjAsCi0gICAgICAgIC5yZWNlaXZlX2NvZGVjX2ZyYW1lX3NpemUgPSA2MCwKLSAgICAgICAgLmlucHV0X2JhbmR3aWR0aCA9IElOUFVUX09VVFBVVF8xMjhLX1JBVEUsCi0gICAgICAgIC5vdXRwdXRfYmFuZHdpZHRoID0gSU5QVVRfT1VUUFVUXzEyOEtfUkFURSwKLSAgICAgICAgLmlucHV0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFueV9pZCA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCA9IDB4MDAwMH0sCi0gICAgICAgIC5vdXRwdXRfY29kaW5nX2Zvcm1hdCA9IHsuY29kaW5nX2Zvcm1hdCA9IEVTQ09fQ09ESU5HX0ZPUk1BVF9MSU5FQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFueV9pZCA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAuaW5wdXRfY29kZWRfZGF0YV9zaXplID0gMTYsCi0gICAgICAgIC5vdXRwdXRfY29kZWRfZGF0YV9zaXplID0gMTYsCi0gICAgICAgIC5pbnB1dF9wY21fZGF0YV9mb3JtYXQgPSBFU0NPX1BDTV9EQVRBX0ZPUk1BVF8yX0NPTVAsCi0gICAgICAgIC5vdXRwdXRfcGNtX2RhdGFfZm9ybWF0ID0gRVNDT19QQ01fREFUQV9GT1JNQVRfMl9DT01QLAotICAgICAgICAuaW5wdXRfcGNtX3BheWxvYWRfbXNiX3Bvc2l0aW9uID0gMCwKLSAgICAgICAgLm91dHB1dF9wY21fcGF5bG9hZF9tc2JfcG9zaXRpb24gPSAwLAotICAgICAgICAuaW5wdXRfZGF0YV9wYXRoID0gRVNDT19EQVRBX1BBVEhfUENNLAotICAgICAgICAub3V0cHV0X2RhdGFfcGF0aCA9IEVTQ09fREFUQV9QQVRIX1BDTSwKLSAgICAgICAgLmlucHV0X3RyYW5zcG9ydF91bml0X3NpemUgPSAweDAwLAotICAgICAgICAub3V0cHV0X3RyYW5zcG9ydF91bml0X3NpemUgPSAweDAwLAotICAgICAgICAubWF4X2xhdGVuY3lfbXMgPSA4LAotICAgICAgICAucGFja2V0X3R5cGVzID0KLSAgICAgICAgICAgIChFU0NPX1BLVF9UWVBFU19NQVNLX0VWMyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjMgfAotICAgICAgICAgICAgIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgfCBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVY1IHwKLSAgICAgICAgICAgICBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzJfRVYzKSwKLSAgICAgICAgLnJldHJhbnNtaXNzaW9uX2VmZm9ydCA9IEVTQ09fUkVUUkFOU01JU1NJT05fUVVBTElUWSwKLSAgICB9LAotICAgIC8vIG1TQkMgVDIKLSAgICB7Ci0gICAgICAgIC50cmFuc21pdF9iYW5kd2lkdGggPSBUWFJYXzY0S0JJVFNfUkFURSwKLSAgICAgICAgLnJlY2VpdmVfYmFuZHdpZHRoID0gVFhSWF82NEtCSVRTX1JBVEUsCi0gICAgICAgIC50cmFuc21pdF9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX01TQkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYW55X2lkID0gMHgwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkID0gMHgwMDAwfSwKLSAgICAgICAgLnJlY2VpdmVfY29kaW5nX2Zvcm1hdCA9IHsuY29kaW5nX2Zvcm1hdCA9IEVTQ09fQ09ESU5HX0ZPUk1BVF9NU0JDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYW55X2lkID0gMHgwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAudHJhbnNtaXRfY29kZWNfZnJhbWVfc2l6ZSA9IDYwLAotICAgICAgICAucmVjZWl2ZV9jb2RlY19mcmFtZV9zaXplID0gNjAsCi0gICAgICAgIC5pbnB1dF9iYW5kd2lkdGggPSBJTlBVVF9PVVRQVVRfMTI4S19SQVRFLAotICAgICAgICAub3V0cHV0X2JhbmR3aWR0aCA9IElOUFVUX09VVFBVVF8xMjhLX1JBVEUsCi0gICAgICAgIC5pbnB1dF9jb2RpbmdfZm9ybWF0ID0gey5jb2RpbmdfZm9ybWF0ID0gRVNDT19DT0RJTkdfRk9STUFUX0xJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgPSAweDAwMDB9LAotICAgICAgICAub3V0cHV0X2NvZGluZ19mb3JtYXQgPSB7LmNvZGluZ19mb3JtYXQgPSBFU0NPX0NPRElOR19GT1JNQVRfTElORUFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbnlfaWQgPSAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkID0gMHgwMDAwfSwKLSAgICAgICAgLmlucHV0X2NvZGVkX2RhdGFfc2l6ZSA9IDE2LAotICAgICAgICAub3V0cHV0X2NvZGVkX2RhdGFfc2l6ZSA9IDE2LAotICAgICAgICAuaW5wdXRfcGNtX2RhdGFfZm9ybWF0ID0gRVNDT19QQ01fREFUQV9GT1JNQVRfMl9DT01QLAotICAgICAgICAub3V0cHV0X3BjbV9kYXRhX2Zvcm1hdCA9IEVTQ09fUENNX0RBVEFfRk9STUFUXzJfQ09NUCwKLSAgICAgICAgLmlucHV0X3BjbV9wYXlsb2FkX21zYl9wb3NpdGlvbiA9IDAsCi0gICAgICAgIC5vdXRwdXRfcGNtX3BheWxvYWRfbXNiX3Bvc2l0aW9uID0gMCwKLSAgICAgICAgLmlucHV0X2RhdGFfcGF0aCA9IEVTQ09fREFUQV9QQVRIX1BDTSwKLSAgICAgICAgLm91dHB1dF9kYXRhX3BhdGggPSBFU0NPX0RBVEFfUEFUSF9QQ00sCi0gICAgICAgIC5pbnB1dF90cmFuc3BvcnRfdW5pdF9zaXplID0gMHgwMCwKLSAgICAgICAgLm91dHB1dF90cmFuc3BvcnRfdW5pdF9zaXplID0gMHgwMCwKLSAgICAgICAgLm1heF9sYXRlbmN5X21zID0gMTMsCi0gICAgICAgIC5wYWNrZXRfdHlwZXMgPQotICAgICAgICAgICAgKEVTQ09fUEtUX1RZUEVTX01BU0tfRVYzIHwgRVNDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWMyB8Ci0gICAgICAgICAgICAgRVNDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWNSB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpLAotICAgICAgICAucmV0cmFuc21pc3Npb25fZWZmb3J0ID0gRVNDT19SRVRSQU5TTUlTU0lPTl9RVUFMSVRZLAotICAgIH0sCi19OwotCi1lbmhfZXNjb19wYXJhbXNfdCBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKGVzY29fY29kZWNfdCBjb2RlYykgewotICBDSEVDSyhjb2RlYyA+PSAwKSA8PCAiY29kZWMgaW5kZXggIiA8PCAoaW50KWNvZGVjIDw8ICI8IDAiOwotICBDSEVDSyhjb2RlYyA8IEVTQ09fTlVNX0NPREVDUykgPDwgImNvZGVjIGluZGV4ICIgPDwgKGludCljb2RlYyA8PCAiID4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRVNDT19OVU1fQ09ERUNTOwotICByZXR1cm4gZGVmYXVsdF9lc2NvX3BhcmFtZXRlcnNbY29kZWNdOwotfQpkaWZmIC0tZ2l0IGEvZGV2aWNlL3NyYy9pbnRlcm9wLmNjIGIvZGV2aWNlL3NyYy9pbnRlcm9wLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZjZDNlLi4wMDAwMDAwCi0tLSBhL2RldmljZS9zcmMvaW50ZXJvcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfZGV2aWNlX2ludGVyb3AiCi0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBtZW1jbXAKLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcF9kYXRhYmFzZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xpc3QuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1NUUihjb25zdCkgXAotICBjYXNlIGNvbnN0OiAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvbnN0OwotCi1zdGF0aWMgbGlzdF90KiBpbnRlcm9wX2xpc3QgPSBOVUxMOwotCi1zdGF0aWMgY29uc3QgY2hhciogaW50ZXJvcF9mZWF0dXJlX3N0cmluZ18oY29uc3QgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZSk7Ci1zdGF0aWMgdm9pZCBpbnRlcm9wX2ZyZWVfZW50cnlfKHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgaW50ZXJvcF9sYXp5X2luaXRfKHZvaWQpOwotc3RhdGljIGJvb2wgaW50ZXJvcF9tYXRjaF9maXhlZF8oY29uc3QgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIpOwotc3RhdGljIGJvb2wgaW50ZXJvcF9tYXRjaF9keW5hbWljXyhjb25zdCBpbnRlcm9wX2ZlYXR1cmVfdCBmZWF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyKTsKLQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9ucwotCi1ib29sIGludGVyb3BfbWF0Y2hfYWRkcihjb25zdCBpbnRlcm9wX2ZlYXR1cmVfdCBmZWF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogYWRkcikgewotICBDSEVDSyhhZGRyKTsKLQotICBpZiAoaW50ZXJvcF9tYXRjaF9maXhlZF8oZmVhdHVyZSwgYWRkcikgfHwKLSAgICAgIGludGVyb3BfbWF0Y2hfZHluYW1pY18oZmVhdHVyZSwgYWRkcikpIHsKLSAgICBMT0dfSU5GTygiJXMoKSBEZXZpY2UgJXMgaXMgYSBtYXRjaCBmb3IgaW50ZXJvcCB3b3JrYXJvdW5kICVzLiIsIF9fZnVuY19fLAotICAgICAgICAgICAgIGFkZHItPlRvU3RyaW5nKCkuY19zdHIoKSwgaW50ZXJvcF9mZWF0dXJlX3N0cmluZ18oZmVhdHVyZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGludGVyb3BfbWF0Y2hfbmFtZShjb25zdCBpbnRlcm9wX2ZlYXR1cmVfdCBmZWF0dXJlLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIENIRUNLKG5hbWUpOwotCi0gIGNvbnN0IHNpemVfdCBkYl9zaXplID0KLSAgICAgIHNpemVvZihpbnRlcm9wX25hbWVfZGF0YWJhc2UpIC8gc2l6ZW9mKGludGVyb3BfbmFtZV9lbnRyeV90KTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZGJfc2l6ZTsgKytpKSB7Ci0gICAgaWYgKGZlYXR1cmUgPT0gaW50ZXJvcF9uYW1lX2RhdGFiYXNlW2ldLmZlYXR1cmUgJiYKLSAgICAgICAgc3RybGVuKG5hbWUpID49IGludGVyb3BfbmFtZV9kYXRhYmFzZVtpXS5sZW5ndGggJiYKLSAgICAgICAgc3RybmNtcChuYW1lLCBpbnRlcm9wX25hbWVfZGF0YWJhc2VbaV0ubmFtZSwKLSAgICAgICAgICAgICAgICBpbnRlcm9wX25hbWVfZGF0YWJhc2VbaV0ubGVuZ3RoKSA9PSAwKSB7Ci0gICAgICBMT0dfSU5GTygiJXMoKSBEZXZpY2UgJXMgaXMgYSBtYXRjaCBmb3IgaW50ZXJvcCB3b3JrYXJvdW5kICVzLiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgbmFtZSwgaW50ZXJvcF9mZWF0dXJlX3N0cmluZ18oZmVhdHVyZSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGludGVyb3BfZGF0YWJhc2VfYWRkKHVpbnQxNl90IGZlYXR1cmUsIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgQ0hFQ0soYWRkcik7Ci0gIENIRUNLKGxlbmd0aCA+IDApOwotICBDSEVDSyhsZW5ndGggPCBSYXdBZGRyZXNzOjprTGVuZ3RoKTsKLQotICBpbnRlcm9wX2FkZHJfZW50cnlfdCogZW50cnkgPSBzdGF0aWNfY2FzdDxpbnRlcm9wX2FkZHJfZW50cnlfdCo+KAotICAgICAgb3NpX2NhbGxvYyhzaXplb2YoaW50ZXJvcF9hZGRyX2VudHJ5X3QpKSk7Ci0gIG1lbWNweSgmZW50cnktPmFkZHIsIGFkZHIsIGxlbmd0aCk7Ci0gIGVudHJ5LT5mZWF0dXJlID0gc3RhdGljX2Nhc3Q8aW50ZXJvcF9mZWF0dXJlX3Q+KGZlYXR1cmUpOwotICBlbnRyeS0+bGVuZ3RoID0gbGVuZ3RoOwotCi0gIGludGVyb3BfbGF6eV9pbml0XygpOwotICBsaXN0X2FwcGVuZChpbnRlcm9wX2xpc3QsIGVudHJ5KTsKLX0KLQotdm9pZCBpbnRlcm9wX2RhdGFiYXNlX2NsZWFyKCkgewotICBpZiAoaW50ZXJvcF9saXN0KSBsaXN0X2NsZWFyKGludGVyb3BfbGlzdCk7Ci19Ci0KLS8vIE1vZHVsZSBsaWZlLWN5Y2xlIGZ1bmN0aW9ucwotCi1zdGF0aWMgZnV0dXJlX3QqIGludGVyb3BfY2xlYW5fdXAodm9pZCkgewotICBsaXN0X2ZyZWUoaW50ZXJvcF9saXN0KTsKLSAgaW50ZXJvcF9saXN0ID0gTlVMTDsKLSAgcmV0dXJuIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKEZVVFVSRV9TVUNDRVNTKTsKLX0KLQotRVhQT1JUX1NZTUJPTCBtb2R1bGVfdCBpbnRlcm9wX21vZHVsZSA9IHsKLSAgICAubmFtZSA9IElOVEVST1BfTU9EVUxFLAotICAgIC5pbml0ID0gTlVMTCwKLSAgICAuc3RhcnRfdXAgPSBOVUxMLAotICAgIC5zaHV0X2Rvd24gPSBOVUxMLAotICAgIC5jbGVhbl91cCA9IGludGVyb3BfY2xlYW5fdXAsCi0gICAgLmRlcGVuZGVuY2llcyA9IHtOVUxMfSwKLX07Ci0KLS8vIExvY2FsIGZ1bmN0aW9ucwotCi1zdGF0aWMgY29uc3QgY2hhciogaW50ZXJvcF9mZWF0dXJlX3N0cmluZ18oY29uc3QgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZSkgewotICBzd2l0Y2ggKGZlYXR1cmUpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OUykKLSAgICBDQVNFX1JFVFVSTl9TVFIoSU5URVJPUF9BVVRPX1JFVFJZX1BBSVJJTkcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkcpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfS0VZQk9BUkRfUkVRVUlSRVNfRklYRURfUElOKQotICAgIENBU0VfUkVUVVJOX1NUUihJTlRFUk9QXzJNQlBTX0xJTktfT05MWSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSU5URVJPUF9ISURfUFJFRl9DT05OX1NVUF9USU1FT1VUXzNTKQotICAgIENBU0VfUkVUVVJOX1NUUihJTlRFUk9QX0dBVFRDX05PX1NFUlZJQ0VfQ0hBTkdFRF9JTkQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfRElTQUJMRV9BVkRUUF9SRUNPTkZJR1VSRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoSU5URVJPUF9EWU5BTUlDX1JPTEVfU1dJVENIKQotICAgIENBU0VfUkVUVVJOX1NUUihJTlRFUk9QX0RJU0FCTEVfUk9MRV9TV0lUQ0gpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfSElEX0hPU1RfTElNSVRfU05JRkZfSU5URVJWQUwpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfRElTQUJMRV9OQU1FX1JFUVVFU1QpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfQVZSQ1BfMV80X09OTFkpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfRElTQUJMRV9TTklGRikKLSAgICBDQVNFX1JFVFVSTl9TVFIoSU5URVJPUF9ESVNBQkxFX0FWRFRQX1NVU1BFTkQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKElOVEVST1BfU0xDX1NLSVBfQklORF9DT01NQU5EKTsKLSAgfQotCi0gIHJldHVybiAiVU5LTk9XTiI7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVyb3BfZnJlZV9lbnRyeV8odm9pZCogZGF0YSkgewotICBpbnRlcm9wX2FkZHJfZW50cnlfdCogZW50cnkgPSAoaW50ZXJvcF9hZGRyX2VudHJ5X3QqKWRhdGE7Ci0gIG9zaV9mcmVlKGVudHJ5KTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZXJvcF9sYXp5X2luaXRfKHZvaWQpIHsKLSAgaWYgKGludGVyb3BfbGlzdCA9PSBOVUxMKSB7Ci0gICAgaW50ZXJvcF9saXN0ID0gbGlzdF9uZXcoaW50ZXJvcF9mcmVlX2VudHJ5Xyk7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgaW50ZXJvcF9tYXRjaF9keW5hbWljXyhjb25zdCBpbnRlcm9wX2ZlYXR1cmVfdCBmZWF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyKSB7Ci0gIGlmIChpbnRlcm9wX2xpc3QgPT0gTlVMTCB8fCBsaXN0X2xlbmd0aChpbnRlcm9wX2xpc3QpID09IDApIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBsaXN0X25vZGVfdCogbm9kZSA9IGxpc3RfYmVnaW4oaW50ZXJvcF9saXN0KTsKLSAgd2hpbGUgKG5vZGUgIT0gbGlzdF9lbmQoaW50ZXJvcF9saXN0KSkgewotICAgIGludGVyb3BfYWRkcl9lbnRyeV90KiBlbnRyeSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGludGVyb3BfYWRkcl9lbnRyeV90Kj4obGlzdF9ub2RlKG5vZGUpKTsKLSAgICBDSEVDSyhlbnRyeSk7Ci0KLSAgICBpZiAoZmVhdHVyZSA9PSBlbnRyeS0+ZmVhdHVyZSAmJgotICAgICAgICBtZW1jbXAoYWRkciwgJmVudHJ5LT5hZGRyLCBlbnRyeS0+bGVuZ3RoKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaW50ZXJvcF9tYXRjaF9maXhlZF8oY29uc3QgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIpIHsKLSAgQ0hFQ0soYWRkcik7Ci0KLSAgY29uc3Qgc2l6ZV90IGRiX3NpemUgPQotICAgICAgc2l6ZW9mKGludGVyb3BfYWRkcl9kYXRhYmFzZSkgLyBzaXplb2YoaW50ZXJvcF9hZGRyX2VudHJ5X3QpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBkYl9zaXplOyArK2kpIHsKLSAgICBpZiAoZmVhdHVyZSA9PSBpbnRlcm9wX2FkZHJfZGF0YWJhc2VbaV0uZmVhdHVyZSAmJgotICAgICAgICBtZW1jbXAoYWRkciwgJmludGVyb3BfYWRkcl9kYXRhYmFzZVtpXS5hZGRyLAotICAgICAgICAgICAgICAgaW50ZXJvcF9hZGRyX2RhdGFiYXNlW2ldLmxlbmd0aCkgPT0gMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvZGV2aWNlL3Rlc3QvaW50ZXJvcF90ZXN0LmNjIGIvZGV2aWNlL3Rlc3QvaW50ZXJvcF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTE1OThlLi4wMDAwMDAwCi0tLSBhL2RldmljZS90ZXN0L2ludGVyb3BfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1URVNUKEludGVyb3BUZXN0LCB0ZXN0X2xvb2t1cF9oaXQpIHsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3M7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoIjM4OjJjOjRhOmU2OjY3Ojg5IiwgdGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OUywgJnRlc3RfYWRkcmVzcykpOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCI5YzpkZjowMzoxMjozNDo1NiIsIHRlc3RfYWRkcmVzcyk7Ci0gIEVYUEVDVF9UUlVFKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgJnRlc3RfYWRkcmVzcykpOwotfQotCi1URVNUKEludGVyb3BUZXN0LCB0ZXN0X2xvb2t1cF9taXNzKSB7Ci0gIFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMDowMDowMDowMDowMDowMCIsIHRlc3RfYWRkcmVzcyk7Ci0gIEVYUEVDVF9GQUxTRSgKLSAgICAgIGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TLCAmdGVzdF9hZGRyZXNzKSk7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoImZmOmZmOmZmOmZmOmZmOmZmIiwgdGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0ZBTFNFKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgJnRlc3RfYWRkcmVzcykpOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCI0MjowODoxNTphZTphZTphZSIsIHRlc3RfYWRkcmVzcyk7Ci0gIEVYUEVDVF9GQUxTRSgKLSAgICAgIGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TLCAmdGVzdF9hZGRyZXNzKSk7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoIjM4OjJjOjRhOjU5OjY3Ojg5IiwgdGVzdF9hZGRyZXNzKTsKLSAgRVhQRUNUX0ZBTFNFKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgJnRlc3RfYWRkcmVzcykpOwotfQotCi1URVNUKEludGVyb3BUZXN0LCB0ZXN0X2R5bmFtaWMpIHsKLSAgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3M7Ci0KLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZygiMTE6MjI6MzM6NDQ6NTU6NjYiLCB0ZXN0X2FkZHJlc3MpOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OUywgJnRlc3RfYWRkcmVzcykpOwotCi0gIGludGVyb3BfZGF0YWJhc2VfYWRkKElOVEVST1BfRElTQUJMRV9MRV9TRUNVUkVfQ09OTkVDVElPTlMsICZ0ZXN0X2FkZHJlc3MsIDMpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TLCAmdGVzdF9hZGRyZXNzKSk7Ci0gIEVYUEVDVF9GQUxTRShpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9BVVRPX1JFVFJZX1BBSVJJTkcsICZ0ZXN0X2FkZHJlc3MpKTsKLQotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCI2Njo1NTo0NDozMzoyMjoxMSIsIHRlc3RfYWRkcmVzcyk7Ci0gIEVYUEVDVF9GQUxTRShpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9BVVRPX1JFVFJZX1BBSVJJTkcsICZ0ZXN0X2FkZHJlc3MpKTsKLQotICBpbnRlcm9wX2RhdGFiYXNlX2FkZChJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgJnRlc3RfYWRkcmVzcywgMyk7Ci0gIEVYUEVDVF9UUlVFKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgJnRlc3RfYWRkcmVzcykpOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9ESVNBQkxFX0xFX1NFQ1VSRV9DT05ORUNUSU9OUywgJnRlc3RfYWRkcmVzcykpOwotCi0gIGludGVyb3BfZGF0YWJhc2VfY2xlYXIoKTsKLSAgRVhQRUNUX0ZBTFNFKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgJnRlc3RfYWRkcmVzcykpOwotfQotCi1URVNUKEludGVyb3BUZXN0LCB0ZXN0X25hbWVfaGl0KSB7Ci0gIEVYUEVDVF9UUlVFKGludGVyb3BfbWF0Y2hfbmFtZShJTlRFUk9QX0RJU0FCTEVfQVVUT19QQUlSSU5HLCAiQk1XIE0zIikpOwotICBFWFBFQ1RfVFJVRShpbnRlcm9wX21hdGNoX25hbWUoSU5URVJPUF9ESVNBQkxFX0FVVE9fUEFJUklORywgIkF1ZGkiKSk7Ci0gIEVYUEVDVF9UUlVFKGludGVyb3BfbWF0Y2hfbmFtZShJTlRFUk9QX0RJU0FCTEVfQVVUT19QQUlSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmFtZWwiKSk7ICAvLyBTdGFydHMgd2l0aCAiQ2FyIiA7KQotfQotCi1URVNUKEludGVyb3BUZXN0LCB0ZXN0X25hbWVfbWlzcykgewotICBFWFBFQ1RfRkFMU0UoaW50ZXJvcF9tYXRjaF9uYW1lKElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkcsICJfX0dPT0dMRV9fIikpOwotICBFWFBFQ1RfRkFMU0UoaW50ZXJvcF9tYXRjaF9uYW1lKElOVEVST1BfRElTQUJMRV9BVVRPX1BBSVJJTkcsICJCTSIpKTsKLSAgRVhQRUNUX0ZBTFNFKGludGVyb3BfbWF0Y2hfbmFtZShJTlRFUk9QX0RJU0FCTEVfQVVUT19QQUlSSU5HLCAiYXVkaSIpKTsKLSAgRVhQRUNUX0ZBTFNFKGludGVyb3BfbWF0Y2hfbmFtZShJTlRFUk9QX0FVVE9fUkVUUllfUEFJUklORywgIkJNVyBNMyIpKTsKLX0KZGlmZiAtLWdpdCBhL2RvYy9idHNub29wX25ldC5tZCBiL2RvYy9idHNub29wX25ldC5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2NGE5YS4uMDAwMDAwMAotLS0gYS9kb2MvYnRzbm9vcF9uZXQubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1idHNub29wX25ldAotPT09PQotYnRzbm9vcF9uZXQgZXhwb3NlcyBCbHVldG9vdGggc25vb3AgbG9ncyBvdmVyIGEgbG9jYWwgVENQIHNvY2tldCB3aGljaCBlbmFibGVzCi1yZWFsLXRpbWUgZGVidWdnaW5nIG9mIEhDSSBkYXRhIHdpdGggaGNpZHVtcC4KLQotVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgYnkgIGVuYWJsaW5nICAiRW5hYmxlIEJsdWV0b290aCBIQ0kgc25vb3AgbG9nIiBpbiB0aGUKLURldmVsb3BlciBvcHRpb25zIGFuZCBzZXR0aW5nIEJUX05FVF9ERUJVRyBmbGFnIHRvIFRSVUUgaW4gdGhlIGJ0c25vb3BfbmV0LmNjLgotT25jZSBpdCBoYXMgYmVlbiBlbmFibGVkIGFuZCB0aGUgc3RhY2sgcmVzdGFydGVkLCB0aGUgc3RhY2sgd2lsbCBsaXN0ZW4gZm9yCi1pbmNvbWluZyBUQ1AgY29ubmVjdGlvbnMgb24gcG9ydCA4ODcyLgotCi1UbyB1c2UgdGhpcyBmZWF0dXJlIHdpdGggYnRtb24gb24gYSBMaW51eCBob3N0LCB5b3UgY2FuIHJ1bjoKLQotYGBgCi0gICQgYWRiIGZvcndhcmQgdGNwOjg4NzIgdGNwOjg4NzIKLSAgJCBuYyBsb2NhbGhvc3QgODg3MiB8IGJ0bW9uIC1QIC1yIC9kZXYvc3RkaW4KLWBgYApkaWZmIC0tZ2l0IGEvZG9jL2RpcmVjdG9yeV9sYXlvdXQubWQgYi9kb2MvZGlyZWN0b3J5X2xheW91dC5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiMTdjOC4uMDAwMDAwMAotLS0gYS9kb2MvZGlyZWN0b3J5X2xheW91dC5tZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIERpcmVjdG9yeSBMYXlvdXQKLQotIyMjIEdlbmVyYWwgZGlyZWN0b3J5IGxheW91dAotRWFjaCBkaXJlY3Rvcnkgc2hvdWxkIGJlIGEgc2VsZiBjb250YWluZWQgc3Vic3lzdGVtIGNvbnNpc3RpbmcKLW9mIG9uZSBvciBtb3JlIG1vZHVsZXMuCi0KLSogc3JjLyAtIEFsbCBzb3VyY2UgZmlsZXMgZm9yIHRoZSBzdWJzeXN0ZW0uCi0qIGluY2x1ZGUvIC0gQWxsIGluY2x1ZGUgZmlsZXMgZm9yIHRoZSBzdWJzeXN0ZW0uCi0qIHRlc3QvIC0gQWxsIHVuaXQgdGVzdHMgZm9yIHRoZSBzdWJzeXN0ZW0uCi0KLSMjIyBUb3AgbGV2ZWwgZGlyZWN0b3J5IGxheW91dAotKiBhdWRpb19hMmRwX2h3IC0gQTJEUCBhdWRpbyBIQUwgaW1wbGVtZW50YXRpb24uCi0qIGJ0YSAtICpCbHVldG9vdGggQXBwbGljYXRpb24qIC0gU3RyYW5nZSBjb2xsZWN0aW9uIG9mIGEtbG90IG9mIHRoaW5ncyAqKkRlcHJlY2F0ZT8qKgotKiBidGNvcmUgLSAqQmx1ZXRvb3RoIENvcmUqIC0gQmx1ZXRvb3RoIGRhdGEgdHlwZSBkZWZpbml0aW9ucyBhbmQgb3BlcmF0aW9ucyBvbiB0aG9zZSBkYXRhIHR5cGVzLgotKiBidGlmIC0gKkJsdWV0b290aCBJbnRlcmZhY2UqIC0gSk5JIGludGVyZmFjZSB0byBBbmRyb2lkLgotKiBjb25mIC0gKkNvbmZpZ3VyYXRpb24qIC0gVmFyaW91cyBjb25maWd1cmF0aW9uIHRleHQgZmlsZXMuCi0qIGRvYyAtICpEb2N1bWVudGF0aW9uKiAtIFN0YWNrIGRvY3VtZW50YXRpb24uCi0qIGVtYmRydiAtICoqRGVwcmVjYXRlZCoqIC0gQmx1ZXRvb3RoIFNCQyBDb2RlYy4KLSogaGNpIC0gKkhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UqIC0gQ29tbXVuaWNhdGlvbiBwcm90b2NvbCB3aXRoIEJsdWV0b290aCBjaGlwLgotKiBpbmNsdWRlIC0gKipEZXByZWNhdGVkKiogLSBTeXN0ZW0gZ2xvYmFsIGluY2x1ZGUgZmlsZXMuCi0qIG1haW4gLSAqTWFpbiBzdGFjayBlbnRyeXBvaW50KiAtIFByb3ZpZGVzIEhBTCBmb3Igc3RhY2sgYWNjZXNzLgotKiBvc2kgLSAqT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UqIC0gR2VuZXJhbCByZXNvdXJjZSBzdXBwb3J0IGZvciBzdGFjay4KLSogcHJvZmlsZXMgLSAqQmx1ZXRvb3RoIFByb2ZpbGVzKiAtICoqVEJEKiogQ29sbGVjdGlvbiBvZiBhbGwgcHJvZmlsZXMuCi0qIHN0YWNrIC0gKipEZXByZWNhdGVkKiogLSBUaGUgU3RhY2sgLSBQdXNoIHRvIHByb3BlciBzcG90IGluICouL3Byb2ZpbGVzKgotKiB0ZXN0IC0gKlRlc3Qgc3VpdGUqIC0gU3RhY2sgbGV2ZWwgdmFsaWRpYXRpb24gYW5kIHN0cmVzcyB0ZXN0IHN1aXRlLgotKiB0b29scyAtICpUb29scyogLSBWYXJpb3VzIGVuZ2luZWVyaW5nIHN1cHBvcnQgdG9vbHMuCi0qIHVkcnYgLSAgKipEZXByZWNhdGVkKiogICpVSVBDIGltcGxlbWVudGF0aW9uKgotKiB1dGlscyAtICoqRGVwcmVjYXRlZCoqICpCbHVldG9vdGggdXRpbGl0aWVzKiAtIEVsaW1pbmF0ZS4KLSogdm5kIC0gKlZlbmRvciogLSBWZW5kb3Igc3BlY2lmaWMgQVBJcyAtICp0byBiZSBpbnRlZ3JhdGVkIGludG8gcmVzdCBvZiBzdGFjayA/Ki4KZGlmZiAtLWdpdCBhL2RvYy9sb2dfdGFncy5tZCBiL2RvYy9sb2dfdGFncy5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2YTNlNC4uMDAwMDAwMAotLS0gYS9kb2MvbG9nX3RhZ3MubWQKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1Mb2cgVGFncwotPT09Ci1UaGlzIGRvY3VtZW50IGxpc3RzIGFsbCBvZiB0aGUgbG9nIHRhZ3MgdXNlZCBieSB0aGUgQmx1ZXRvb3RoIHN0YWNrLgotCi0qIGF1ZGlvX2EyZHBfaHcKLSogQlRBX0FHX0NPOgotKiBidGFfc3lzX21haW4KLSogYnRfYnRpZgotKiBidF9idGlmX2NvbmZpZwotKiBidF9idGlmX2NvbmZpZ190cmFuc2NvZGUKLSogYnRfY2xhc3NpY19wZWVyCi0qIGJ0ZV9jb25mCi0qIEJ0R2F0dC5idGlmCi0qIEJ0R2F0dC5idGlmX3Rlc3QKLSogYnRfaGNpCi0qIGJ0X2hjaV9oNAotKiBidF9oY2lfaW5qZWN0Ci0qIGJ0X2hjaV9tY3QKLSogYnRfaGNpX3BhY2tldF9mcmFnbWVudGVyCi0qIEJUSUZfQVYKLSogQlRJRl9DT1JFCi0qIEJUSUZfSEYKLSogQlRJRl9IRl9DTElFTlQKLSogQlRJRl9ISAotKiBCVElGX0hMCi0qIEJUSUYtTUVESUEKLSogQlRJRl9QQU4KLSogQlRJRl9RVUVVRQotKiBCVElGX1JDCi0qIEJUSUZfU00KLSogYnRpZl9zb2NrCi0qIEJUSUZfU09DSwotKiBidGlmX3NvY2tfcmZjb21tCi0qIGJ0aWZfc29ja19zY28KLSogQlRJRl9TT0NLX1NEUAotKiBCVElGX1NUT1JBR0UKLSogQlRJRl9VVElMCi0qIEJUTEQKLSogYnRfbW9kdWxlCi0qIGJ0X29zaV9hbGFybQotKiBidF9vc2lfY29uZmlnCi0qIGJ0X29zaV9kYXRhX2Rpc3BhdGNoZXIKLSogYnRfb3NpX3JlYWN0b3IKLSogYnRfb3NpX3NvY2tldAotKiBidF9wcm9maWxlX21hbmFnZXIKLSogYnRfc2RwX2NsaWVudAotKiBidHNub29wCi0qIGJ0c25vb3BfbmV0Ci0qIGJ0X3N0YWNrX2NvbmZpZwotKiBidF9zdGFja19tYW5hZ2VyCi0qIGJ0X3Rhc2sKLSogYnR1X3Rhc2sKLSogQlRfVVRJTFMKLSogYnRfdmVuZG9yCi0qIG9zaV9mdXR1cmUKLSogb3NpX3NlbWFwaG9yZQotKiBvc2lfdGhyZWFkCmRpZmYgLS1naXQgYS9kb2MvbmV0d29ya19wb3J0cy5tZCBiL2RvYy9uZXR3b3JrX3BvcnRzLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UxMzhlLi4wMDAwMDAwCi0tLSBhL2RvYy9uZXR3b3JrX3BvcnRzLm1kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1OZXR3b3JrIFBvcnRzCi09PT0KLVRoaXMgZG9jdW1lbnQgbGlzdHMgYWxsIG9mIHRoZSBuZXR3b3JrIHBvcnRzIHVzZWQgYnkgdGhlIGJsdWV0b290aCBzdGFjay4KLUl0IHNob3VsZCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGFuZCBhcyBhIG1lY2hhbmlzbSB0byBhdm9pZCBwb3J0Ci1uYW1lc3BhY2UgY29uZmxpY3RzLgotCi0qIFRDUCA4ODcyIChoY2kvc3JjL2J0c25vb3BfbmV0LmNjKSAtIHJlYWQgbGl2ZSBidHNub29wIGxvZ3MKLSogVENQIDg4NzMgKGhjaS9zcmMvaGNpX2luamVjdC5jYykgLSBpbmplY3QgSENJIHBhY2tldHMgaW50byBIQ0kgc3RyZWFtCmRpZmYgLS1naXQgYS9kb2MvcG93ZXJfbWFuYWdlbWVudC5tZCBiL2RvYy9wb3dlcl9tYW5hZ2VtZW50Lm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGEzMWVlLi4wMDAwMDAwCi0tLSBhL2RvYy9wb3dlcl9tYW5hZ2VtZW50Lm1kCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSMjIFBvd2VyIE1hbmFnZW1lbnQKLQotIyMjIE92ZXJ2aWV3Ci0KLVBvd2VyIG1hbmFnZW1lbnQgKFBNKSBpcyBhbiBldmVudC1kcml2ZW4gc3RhdGUgbWFjaGluZSwgdGlja2xlZCBieSB2YXJpb3VzCi1gYnRhL3N5c2AgZXZlbnRzIHZpYSBhIGNhbGxiYWNrLiBUaGUgYWN0dWFsIHN0YXRlIHN3aXRjaGluZyBjYWxscyBhcmUgaGFuZGxlZAotYnkgdGhlIEJUTSBIQ0kgaW50ZXJmYWNpbmcgY29kZSwgd2l0aCByZXN1bHRzIGJlaW5nIHBvc3RlZCBiYWNrIHRvIHRoZSBQTQotY29kZSB2aWEgdGhlIEJUQSB3b3JrcXVldWUgdGhyZWFkLgotCi1Qb3dlciBzdGF0ZXMgYXJlIG1hbmFnZWQgcGVyLWRldmljZSwgcGVyLXByb2ZpbGUsIHNvIGV2ZXJ5IGluY29taW5nIGV2ZW50Ci1pbmNsdWRlcyBhIHByb2ZpbGUgSUQsIGFwcCBJRCwgYW5kIGEgYEJEX0FERFJgLgotCi1UaGUgZXZlbnRzIGZpcmVkIHRvIGRyaXZlIHRoZSBzdGF0ZSBtYWNoaW5lIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyBhcmU6Ci0KLSAgLSBgQlRBX1NZU19DT05OX09QRU5gCi0gIC0gYEJUQV9TWVNfQ09OTl9DTE9TRWAKLSAgLSBgQlRBX1NZU19DT05OX0lETEVgCi0gIC0gYEJUQV9TWVNfQ09OTl9CVVNZYAotICAtIGBCVEFfU1lTX0FQUF9PUEVOYAotICAtIGBCVEFfU1lTX0FQUF9DTE9TRWAKLSAgLSBgQlRBX1NZU19TQ09fT1BFTmAKLSAgLSBgQlRBX1NZU19TQ09fQ0xPU0VgCi0KLUVhY2ggb2YgdGhlc2UgY29ycmVzcG9uZCB0byBhIGZ1bmN0aW9uIG5hbWUgaW4gYGJ0YS9zeXMvYnRhX3N5c19jb25uLmNjYCwgd2hpY2gKLWFyZSBjYWxsZWQgYnkgZWFjaCBwcm9maWxlIGRlZmluaXRpb24gaW4gYGJ0YS8kUFJPRklMRWAuCi0KLVRoZSBQTSBjb2RlIG1ha2VzIGNhbGxzIGludG8gdGhlIEJUTSBtb2R1bGUgdG8gc2V0IHZhcmlvdXMgcG93ZXIKLXN0YXRlcy4gUmVzcG9uc2VzIGFyZSBoYW5kbGVkIGluIGFuIGFzeW5jaHJvbm91cyBmYXNoaW9uLCBwcmltYXJpbHkgdmlhIHRoZQotY2FsbGJhY2tzIGBidGFfZG1fcG1fY2JhY2tgIGFuZCBgYnRhX2RtX3BtX3RpbWVyX2NiYWNrYC4gUmVzcG9uc2VzIGFyZSBoYW5kbGVkCi10aHJvdWdoIHRoZSBCVEEgd29ya3F1ZXVlIHRocmVhZCBhbmQgdGhlIGBidGFfZG1fcG1fYnRtX3N0YXR1c2AgZnVuY3Rpb24uIFNpbmNlCi13ZSBtaWdodCBwb3NzaWJseSBnZXQgaW50byBhIGJhZCBzdGF0ZSB3aGVyZSB3ZSBuZXZlciBoZWFyIGJhY2sgZnJvbSB0aGUKLWNvbnRyb2xsZXIsIHRpbWVycyBhcmUgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIHRvIHRoZSBCVEEgd29ya3F1ZXVlIHRocmVhZCBhcwotd2VsbCwgd2hpY2ggZmlsdGVycyBkb3duIHRocm91Z2ggdGhlIHNhbWUgc3RhdHVzIGZ1bmN0aW9uLgotCi1PdmVyYWxsIHBvd2VyIHN0YXRlcyBhcmUgbWFuYWdlZCAqcGVyIGRldmljZSosIG5vdCBwZXIgY29ubmVjdGlvbiwgYnV0IHRoZSBwb3dlcgotcG9saWN5IGlzIGRldGVybWluZWQgYnkgdGhlIGdyZWF0ZXN0IGFsbG93YWJsZSBwb3dlciBhY3Rpb24gZGVmaW5lZCBhY3Jvc3MgYWxsCi1jdXJyZW50bHkga25vd24gY29ubmVjdGlvbnMgdG8gYSBnaXZlbiBkZXZpY2UuIFRodXMsIGlmIFJGQ09NTSBzcGVjaWZpZXMgdGhhdAotaXQncyB3aWxsaW5nIHRvIGdvIHRvIGludG8gU05JRkYgYW5kIHNwZWNpZmllcyB0aGF0IGFzIGFuIGFjdGlvbiwgYW5kIHNheSwgYSBQQU4KLWNvbm5lY3Rpb24gaXMgdXAgd2hpY2ggc3BlY2lmaWVzIGl0IGlzIHdpbGxpbmcgdG8gZ28gaW50byBTTklGRiwgYnV0IGl0cyBhY3Rpb24KLXN0YXRlcyBpdCB3YW50cyBBQ1RJVkUsIHRoZSBwb3dlciBtYW5hZ2VtZW50IGNvZGUgd2lsbCBjaGFuZ2UgdG8gQUNUSVZFLgotCi0jIyMgUG93ZXIgbWFuYWdlbWVudCB0YWJsZXMKLQotVGhlIHRhYmxlcyB0aGF0IGRldGVybWluZSB3aGljaCBwb3dlciBsZXZlbHMgYXJlIGFjY2VwdGFibGUgZm9yIHdoaWNoIHByb2ZpbGVzCi1hbmQgd2hhdCBhY3Rpb25zIHRvIHRha2UgZm9yIHRoZSBhYm92ZSBldmVudHMgYXJlIGRlZmluZWQgaW4gdGhlCi1gYnRhL2RtL2J0YV9kbV9jZmcuY2NgIGZpbGUsIGFzIGBidGFfZG1fcG1fY2ZnYCwgYGJ0YV9kbV9wbV9zcGVjYCwgYW5kCi1gYnRhX2RtX3Nzcl9zcGVjYC4KLQotRHVyaW5nIGEgbG9va3VwIGF0dGVtcHQsIHRoZSBjb2RlIGl0ZXJhdGVzIG92ZXIgdGhlIGBidGFfZG1fcG1fY2ZnYCBhcnJheSwKLWxvb2tpbmcgZm9yIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcHJvZmlsZSBhbmQgYXBwIElEcy4gV2hlbiBpdCBmaW5kcyBvbmUsIGl0IHVzZXMKLXRoZSBgc3BlY19pZHhgIGZpZWxkIHRvIGluZGV4IGludG8gYGJ0YV9kbV9wbV9zcGVjYCBhcnJheSB0byBkZXRlcm1pbmUgd2hpY2gKLXBvd2VyIG1vZGVzIGFyZSBhY2NlcHRhYmxlIGFuZCB3aGF0IGFjdGlvbnMgdG8gdGFrZSBmb3IgZWFjaCBldmVudC4KLQotVGhlIGFjdGlvbiBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gYGJ0YV9hcGkuaGAgYW5kIGFyZSBkZWZpbmVkIGFzIGEgc2VyaWVzIG9mCi1oZXggYml0ZmllbGRzLiBUaGUgYWN0dWFsIGFjdGlvbnMgdGFrZW4gYXJlIGRldGVybWluZWQgYnkgdGhlCi1gYnRhX2RtX3BtX3NldF9tb2RlYCBmdW5jdGlvbiwgYnV0IGEgZmV3IG9mIHRoZSBhY3Rpb25zIGxpc3RlZCBkZXNlcnZlIHNvbWUKLWFkZGl0aW9uYWwgZGVzY3JpcHRpb246Ci0KLSAgLSBgQlRBX0RNX1BNX05PX0FDVElPTmAgaXMgZWZmZWN0aXZlbHkgYSBuby1vcCBhbmQgaGFzIGEgdmFsdWUgb2YgemVybywgc28gYW55Ci0gICAgb3RoZXIgcHJvZmlsZSB3aWxsIG92ZXJyaWRlIHRoaXMuCi0gIC0gYEJUQV9ETV9QTV9OT19QUkVGYCBvdmVycmlkZXMgYEJUQV9ETV9QTV9OT19BQ1RJT05gIGFuZCBpZiBzZWxlY3RlZCBhcyB0aGUKLSAgICBhY3Rpb24gdGhhdCBgYnRhX2RtX3BtX3NldF9tb2RlYCB3aWxsIHRha2UsIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVtb3ZlZAotICAgIGZyb20gYGJ0YV9kbV9jb25uX3NydmNzYCBhbmQgbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgZm9yIHBvd2VyIG1hbmFnZW1lbnQKLSAgICBkZWNpc2lvbnMuCi0gIC0gYEJUQV9ETV9QTV9TTklGRmAgdGhyb3VnaCBgQlRBX0RNX1BNX1NOSUZGNmAgYXJlIHNwZWNpYWwsIGluIHRoYXQgZWFjaAotICAgIGxldmVsIHNwZWNpZmllcyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgU05JRkYgbW9kZSB3aGljaCByZWxhdGUgdG8gdGhlCi0gICAgbWluIGFuZCBtYXggaW50ZXJ2YWxzLCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIGFuZCB0aGUgdGltZW91dC4gVGhlIG92ZXJhbGwKLSAgICBhY3Rpb24gaXMgc3RpbGwgdGhlIHNhbWUsIGhvd2V2ZXIgLS0gU05JRkYgbW9kZSBpcyBhdHRlbXB0ZWQuIFRoZXJlIGFyZQotICAgIGRlZmluaXRpb25zIGF2YWlsYWJsZSB1cCB0byBTTklGRjcsIGJ1dCBhY3R1YWwgU1NSIHZhbHVlcyBhcmUgb25seSBkZWZpbmVkCi0gICAgdXAgdG8gU05JRkY2LiBQYXJhbXMgYXJlIGRlZmluZWQgaW4gYGJ0YV9kbV9zc3Jfc3BlY2AuCi0gIC0gYEJUQV9ETV9QTV9BQ1RJVkVgIGlzIGZ1bGwtb24gcG93ZXIuCi0gIC0gYEJUQV9ETV9QTV9SRVRSWWAgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBgQlRBX0RNX1BNX05PX0FDVElPTmAsIGV4Y2VwdCBhCi0gICAgdGltZW91dCBpcyBwb3NzaWJsZSB0byBiZSBzZXQsIHdoaWNoIGVmZmVjdGl2ZWx5IGFsbG93cyBhIHBvd2VyIG9wZXJhdGlvbiB0bwotICAgIGJlICJyZXRyaWVkIi4KLQotIyMjIEluaXRpYWxpemF0aW9uCi0KLWBidGFfZG1fcG0uY2NgJ3MgYGJ0YV9kbV9pbml0X3BtYCBmdW5jdGlvbiBjYWxscyBvdXQgdG8gcmVnaXN0ZXIKLWBidGFfZG1fcG1fY2JhY2tgIHdpdGggdGhlIGJ0YSBzeXMgbW9kdWxlIGZvciBpbmNvbWluZyBwb3dlciBtYW5hZ2VtZW50IGV2ZW50cywKLWFuZCBhbHNvIHJlZ2lzdGVycyBgYnRhX2RtX3BtX2J0bV9jYmFja2Agd2l0aCB0aGUgYnRtIG1vZHVsZSB0byBoYW5kbGUgcmVzcG9uc2VzCi1hbmQgdGltZW91dHMgb2YgSENJIHJlcXVlc3RzICh2aWEgYGJ0YV9kbV9wbV9idG1fc3RhdHVzYCkuCi0KLUF0IHRoaXMgcG9pbnQsIHRoZSBwb3dlciBtYW5hZ21lbnQgY29kZSBpcyBiYXNpY2FsbHkgZG9uZSB1bnRpbCB0aGUgZmlyc3Qgc2V0IG9mCi1ldmVudHMgY29tZSBpbiB0aHJvdWdoIGBidGFfZG1fcG1fY2JhY2tgLgotCi1UaHJvdWdob3V0IHRoZSBgYnRhX2RtX3BtLmNjYCBmaWxlLCBjb25uZWN0aW9ucyB3aG9zZSBwb3dlciBtYW5hZ2VtZW50IHN0YXRlcyBhcmUKLW1hbmFnZWQgYXJlIHRyYWNrZWQgaW4gYSBnbG9iYWwgYXJyYXkgY2FsbGVkIGBidGFfZG1fY29ubl9zcnZjc2AuIFVuZm9ydHVuYXRlbHksCi13aGlsZSB0aGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGFzIGFuIGV4dGVybiBpbiB0aGUgYGJ0YV9kbV9pbnQuaGAgZmlsZSwgaXQgb25seQotc2VlbXMgdG8gYmUgdXNlZCBpbiB0aGUgYGJ0YV9kbV9hY3QuY2NgIGZpbGUsIGFuZCBvbmx5IGZvciByZWluaXRpYWxpemF0aW9uLgotCi0jIyMgRXZlbnQgZmxvdwotCi0jIyMjIEV2ZW50cyBmaXJlZCBmcm9tIFNZUwotCi0gIDEuIEFuIGV2ZW50IGlzIGZpcmVkIGZyb20gb25lIG9mIHRoZSBtZXRob2RzIG1lbnRpb25lZCBhYm92ZSBpbgotICAgICBgYnRhL3N5cy9idGFfc3lzX2Nvbm4uY2NgCi0gIDIuIFRoZSBgYnRhX2RtX3BtX2NiYWNrYCBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gICAgIC0gVGhlIHBvd2VyIG1vZGUgY29uZmlnIGlzIGxvb2tlZCB1cCBpbiB0aGUgYGJ0YV9kbV9wbV9jZmdgIHRhYmxlLiBJZiBub25lCi0gICAgICAgYXJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvZmlsZSBJRCBhbmQgYXBwIElELCB0aGUgZnVuY3Rpb24gc2ltcGx5Ci0gICAgICAgcmV0dXJucyB3aXRoIG5vIGFjdGlvbiB0YWtlbi4KLSAgICAgLSBJZiBhbnkgdGltZXJzIHdlcmUgc2V0IGZvciB0aGUgZ2l2ZW4gYEJEX0FERFJgLCB0aGV5IGFyZSBzdG9wcGVkLgotICAgICAtIFRoZSBTU1IgcGFyYW1zIGZvciB0aGUgQ09OTl9PUEVOIGV2ZW50IGFyZSBsb29rZWQgdXAuCi0gICAgIC0gVGhlIHBvd2VyIHNwZWMgc3RhdGUgdGFibGUgKGBidGFfZG1fcG1fc3BlY2ApIGlzIGNoZWNrZWQgdG8gc2VlIGlmCi0gICAgICAgdGhlcmUncyBubyBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIChgQlRBX0RNX1BNX05PX0FDVElPTmApLCBhbmQgaWYgc28sCi0gICAgICAgcmV0dXJucyB3aXRoIG5vIGFjdGlvbiB0YWtlbi4KLSAgICAgLSBgYnRhX2RtX2Nvbm5fc3J2Y3NgIGlzIGNvbnN1bHRlZCB0byBlbnN1cmUgdGhlcmUncyBhbiBlbnRyeSBmb3IgdGhpcwotICAgICAgIGNvbm5lY3Rpb24gaWYgaXQncyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGFjY29yZGluZyB0byB0aGUgcG93ZXIgc3BlYwotICAgICAgIHN0YXRlIHRhYmxlcy4gSWYgdGhlIHNwZWMgc3BlY2lmaWVzIGBCVEFfRE1fUE1fTk9fUFJFRmAsIHRoZW4gYW55Ci0gICAgICAgZXhpc3RpbmcgZW50cnkgaW4gdGhpcyBsaXN0IGlzIHJlbW92ZWQsIG90aGVyd2lzZSBvbmUgaXMgYWRkZWQvdXBkYXRlZAotICAgICAgIHdpdGggdGhlIHN0YXRlIGdpdmVuIHRvIHRoZSBmdW5jdGlvbi4KLSAgMy4gYGJ0YV9kbV9wbV9jYmFja2AgY2hlY2tzIHRvIHNlZSBpZiB0aGUgYGJ0YV9kbV9zc3Jfc3BlY2Agc3BlY2lmaWVzIFNTUgotICAgICBhZGp1c3RtZW50cyBhcmUgdG8gYmUgbWFkZSwgYW5kIGlmIHNvLCBgYnRhX2RtX3BtX3NzcmAgaXMgY2FsbGVkIHdpdGggdGhlCi0gICAgIHBlZXIgYEJEX0FERFJgLgotICAgICAtIGBidGFfZG1fcG1fc3NyYCBpdGVyYXRlcyB0aGUgbWFuYWdlZCBzZXJ2aWNlcyBhcnJheSB0byBmaW5kIGFsbCBjb25uZWN0ZWQKLSAgICAgICBzZXJ2aWNlcyBmb3IgdGhlIGdpdmVuIGBCRF9BRERSYCwgdGhlbiBsb29rcyB1cCB0aGUgc3NyIHZhbHVlcyBmcm9tIHRoZQotICAgICAgIGBidGFfZG1fc3NyX3NwZWNgIHRhYmxlcywgbG9va2luZyBmb3IgdGhlIHNtYWxsZXN0IG1heCBsYXRlbmN5IHRvIHVzZS4KLSAgICAgLSBgYnRhX2RtX3BtX3NzcmAgY2FsbHMgYEJUTV9TZXRTc3JQYXJhbXNgIHRvIGFjdHVhbGx5IHNlbmQgYWxvbmcgdGhlIFNTUgotICAgICAgIHBhcmFtcyB0byB0aGUgYmx1ZXRvb3RoIGNoaXAuCi0gIDQuIGBidGFfZG1fcG1fY2JhY2tgIGNhbGxzIGBidGFfZG1fcG1fc2V0X21vZGVgIHdpdGggdGhlIHBlZXIgYWRkcmVzcyBhbmQgdGhlCi0gICAgIGB0aW1lZF9vdXRgIHBhcmFtZXRlciBzZXQgdG8gYGZhbHNlYC4KLSAgICAgLSBGb3IgZWFjaCBtYW5hZ2VkIGNvbm5lY3Rpb24sIGBidGFfZG1fcG1fc2V0X21vZGVgIGdyYWJzCi0gICAgICAgYm90aCBhY3Rpb25zIHNwZWNpZmllZCBmb3IgdGhlIHByb2ZpbGUgaW4gdGhlIGBidGFfZG1fcG1fc3BlY2AgdGFibGVzLiBJZgotICAgICAgIHRoZSBmaXJzdCBwb3dlciBtYW5hZ2VtZW50IGFjdGlvbiBkaWRuJ3QgdGltZW91dCAob3Igd2FzIG5ldmVyIGF0dGVtcHRlZCwKLSAgICAgICBhY2NvcmRpbmcgdG8gdGhlIGB0QlRBX0RNX1BFRVJfREVWSUNFYCBgcG1fbW9kZV9mYWlsZWRgIGFuZAotICAgICAgIGBwbV9tb2RlX2F0dGVtcHRlZGAgZmllbGRzKSwgaXRzIHRpbWVvdXQgYW5kIG1vZGUgYXJlIHVzZWQuIE90aGVyd2lzZSwKLSAgICAgICB0aGUgc2FtZSBjaGVjayBpcyBkb25lIGFnYWluc3QgdGhlIHNlY29uZCBhY3Rpb24gYW5kIGl0IGlzIHVzZWQKLSAgICAgICBpbnN0ZWFkLiBJZiBib3RoIGFjdGlvbnMgaGF2ZSBiZWVuIGF0dGVtcHRlZCwgdGhlbiB0aGUgYWN0aW9uIGlzIHNldCB0bwotICAgICAgIGBCVEFfRE1fUE1fTk9fQUNUSU9OYC4gT25seSB0aGUgaGlnaGVzdCBwb3dlciBtb2RlIGFjdGlvbiBpcyBjaG9zZW4gZnJvbQotICAgICAgIGFsbCBjb25uZWN0ZWQgcHJvZmlsZXMuCi0gICAgIC0gSWYgdGhlIGNob3NlbiBhY3Rpb24gaXMgYEJUQV9ETV9QTV9QQVJLYCBvciBgQlRBX0RNX1BNX1NOSUZGYCBidXQgdGhlCi0gICAgICAgcHJvZmlsZSBkb2Vzbid0IGFsbG93IGl0LCB0aGlzIGZ1bmN0aW9uIHRha2VzIG5vIGFjdGlvbi4KLSAgICAgLSBJZiBhIHRpbWVvdXQgaXMgc3BlY2lmaWVkIGluIHRoZSBwb3dlciBzcGVjIHRhYmxlLCB0aGVuIGFuIHVudXNlZCB0aW1lcgotICAgICAgIGluIGBidGFfZG1fY2IucG1fdGltZXJgIGlzIHN0YXJ0ZWQuCi0gICAgIC0gSWYgdGhlIGFjdGlvbiBjaG9zZW4gaXMgYEJUQV9ETV9QTV9QQVJLYCwgYGJ0YV9kbV9wbV9wYXJrYCBpcyBjYWxsZWQsCi0gICAgICAgd2hpY2ggY2FsbHMgYEJUTV9SZWFkUG93ZXJNb2RlYCBhbmQgYEJUTV9TZXRQb3dlck1vZGVgIHRvIG1ha2UgYW4gSENJCi0gICAgICAgcmVxdWVzdCB0byBlbmFibGUgUEFSSyBmb3IgdGhlIGdpdmVuIHBlZXIgYW5kIGNvbm5lY3Rpb24uCi0gICAgIC0gSWYgdGhlIGFjdGlvbiBjaG9zZW4gaXMgYEJUQV9ETV9QTV9TTklGRmAsIHRoZSBwZWVyIGRldmljZSdzIGxpbmsgcG9saWN5Ci0gICAgICAgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBhbGxvd2VkLiBJZiBzbywgdGhlbiBgYnRhX2RtX3BtX3NuaWZmYCBpcwotICAgICAgIGNhbGxlZCwgd2hpY2ggbWFrZXMgdmFyaW91cyBjYWxscyB0byB0aGUgbG9jYWwgY29udHJvbGxlciwKLSAgICAgICBgQlRNX1JlYWRSZW1vdGVGZWF0dXJlc2AgYW5kIGBCVE1fU2V0UG93ZXJNb2RlYCB0byBlbnN1cmUgU05JRkYgbW9kZSBpcwotICAgICAgIGVuYWJsZWQuCi0gICAgIC0gSWYgdGhlIGFjdGlvbiBjaG9zZW4gaXMgYEJUQV9ETV9QTV9BQ1RJVkVgLCBhIGNhbGwgdG8gYGJ0YV9kbV9wbV9hY3RpdmVgCi0gICAgICAgaXMgbWFkZSwgd2hpY2ggY2FsbHMgYEJUTV9TZXRQb3dlck1vZGVgIHRvIHNldCB0aGUgbGluayBpbnRvIEFDVElWRQotICAgICAgIG1vZGUuCi0KLUF0IHRoaXMgcG9pbnQsIGlmIG9uZSBvZiB0aGUgdGltZXJzIGluIGBidGFfZG1fY2IucG1fdGltZXJgIHRpbWVzIG91dCwgYSBjYWxsIGlzCi1tYWRlIHRocm91Z2ggdGhlIEJUQSB3b3JrcXVldWUgdGhyZWFkIHRvIGBidGFfZG1fcG1fYnRtX2NiYWNrYCwgd2hpY2ggdGhlbgotdHJpZ2dlcnMgYGJ0YV9kbV9wbV9idG1fc3RhdHVzYCwgd2l0aCB0aGUgdGltZW91dCBmaWVsZCBzZXQgdG8gVFJVRS4gSENJCi1yZXNwb25zZXMgYXJlIGFsc28gZmlyZWQgYXMgbWVzc2FnZXMgdGhyb3VnaCB0aGUgQlRBIHdvcmtxdWV1ZSB0aHJlYWQsIHdoaWNoIGFyZQotaGFuZGxlZCBhZ2FpbiwgdGhyb3VnaCBgYnRhX2RtX3BtX2J0bV9zdGF0dXNgLgotCi0jIyMjIEV2ZW50cyBmaXJlZCB0aHJvdWdoIEJUTQotCi1Fc3NlbnRpYWxseSB0aGVzZSBtZXNzYWdlcyBldmVudHVhbGx5IGdvIHRocm91Z2ggdGhlIHNhbWUgZnVuY3Rpb25zIGFzIGV2ZW50cwotZmlyZWQgZnJvbSB0aGUgU1lTIHNpZGUgb2YgdGhpbmdzLCBleGNlcHQgZnJvbSB0aGUgaW5pdGlhbCBwYXRoIHRoZXkgdGFrZToKLQotICAxLiBBbiBldmVudCBpcyBmaXJlZCBmcm9tIGEgY2FsbGJhY2sgaW4gQlRNIHRvIGBidGFfZG1fcG1fYnRtX2NiYWNrYC4KLSAgMi4gYGJ0YV9kbV9wbV9idG1fY2JhY2tgIHBhY2thZ2VzIHVwIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGludG8gYQotICAgICBgdEJUQV9ETV9QTV9CVE1fU1RBVFVTYCBzdHJ1Y3QgYW5kIHBvc3RzIGl0IHRvIHRoZSBCVEEgd29ya3F1ZXVlIHRocmVhZCB2aWEKLSAgICAgYGJ0YV9zeXNfc2VuZG1zZ2AsIHdpdGggdGhlIGV2ZW50IGhlYWRlciBzZXQgdG8KLSAgICAgYEJUQV9ETV9QTV9CVE1fU1RBVFVTX0VWVGAuCi0gIDMuIFRoaXMgaXMgZXZlbnR1YWxseSByb3V0ZWQgdG8gdGhlIGBidGFfZG1fcG1fYnRtX3N0YXR1c2AgZnVuY3Rpb24uCi0gICAgICoqRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcnVubmluZyBvbiB0aGUgd29ya3F1ZXVlIHRocmVhZCBvciBub3QqKgotICAgICAtIFRoZSBtZXNzYWdlIGBzdGF0dXNgIHBhc3NlZCBpbiBpcyBhY3R1YWxseSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlCi0gICAgICAgZGV2aWNlLgotICAgICAtIElmIHRoZSBzdGF0dXMgaXMgYEJUTV9QTV9TVFNfQUNUSVZFYCAoc3RpbGwgaW4gdGhlIEFDVElWRSBwb3dlciBtb2RlKSwKLSAgICAgICBjaGVja3MgdGhlIEhDSSBzdGF0dXMgY29kZToKLSAgICAgICAtIElmIHRoYXQncyBub24temVybyBhbmQgYSBQQVJLIG9yIFNOSUZGIG1vZGUgY2hhbmdlIHdhcyBhdHRlbXB0ZWQsCi0gICAgICAgICBgYnRhX2RtX3BtX2J0bV9zdGF0dXNgIHN0b3BzIGFueSB0aW1lcnMgc3RhcnRlZCBmb3IgdGhlIGRldmljZSBpbgotICAgICAgICAgYGJ0YV9kbV9wbV9zZXRfbW9kZWAsIGNsZWFycyBzb21lIHN0YXR1cyBiaXRzIGluIHRoZSBwZWVyIGRldmljZQotICAgICAgICAgc3RydWN0dXJlLCBhbmQgdGhlbiBjYWxscyBiYWNrIGludG8gYGJ0YV9kbV9wbV9zZXRfbW9kZWAgd2l0aCB0aGUgcGVlcgotICAgICAgICAgZGV2aWNlIGFkZHJlc3MgYW5kIHRpbWVvdXQgc2V0IHRvIEZBTFNFLgotICAgICAgIC0gSWYgdGhlIHN0YXR1cyBpcyB6ZXJvLCBhbmQgaWYgdGhlIHBlZXIgZGV2aWNlIGB0QlRBX0RNX1BFRVJfREVWSUNFYAotICAgICAgICAgYHByZXZfbG93YCBmaWVsZCBpcyBzZXQsIGNhbGxzIGBidGFfZG1fcG1fc3NyYCB0byByZS1zZW5kIFNTUiBwYXJhbXMsCi0gICAgICAgICBzdG9wcyBhbGwgdGltZXJzIGZvciB0aGUgZGV2aWNlLCBhbmQgdGhlbiByZS1jYWxscyBgYnRhX2RtX3BtX3NldF9tb2RlYAotICAgICAgICAgd2l0aCB0aW1lb3V0IHNldCB0byBGQUxTRSB0byByZS1hdHRlbXB0IHdpdGggYSBzZWNvbmQgYWN0aW9uIChpZiB0aGUKLSAgICAgICAgIHByZXZpb3VzIFBBUksgb3IgU05JRkYgZmFpbGVkLCBvdGhlcndpc2UgaXQnbGwgcmUtYXR0ZW1wdCB0aGUgZmlyc3QKLSAgICAgICAgIGFjdGlvbikuCi0gICAgIC0gSWYgdGhlIHN0YXR1cyBpcyBgQlRNX1BNX1NUU19QQVJLYCBvciBgQlRNX1BNX1NUU19IT0xEYCwgc2F2ZXMgdGhlCi0gICAgICAgcHJldmlvdXMgbG93IHBvd2VyIG1vZGUgaW4gdGhlIHBlZXIgZGV2aWNlJ3MgYHByZXZfbG93YCBmaWVsZC4KLSAgICAgLSBJZiB0aGUgc3RhdHVzIGlzIGBCVE1fUE1fU1RTX1NTUmAsIHNpbXBseSBjbGVhcnMgb3Igc2V0cyB0aGUgZGV2aWNlCi0gICAgICAgYGluZm9gIGZpZWxkJ3MgYEJUQV9ETV9ESV9VU0VfU1NSYCBiaXQsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKLSAgICAgICBgdEJUQV9ETV9NU0cudmFsdWVgLCB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSBkZXZpY2UgY2FuIGhhbmRsZSBTU1IuCi0gICAgIC0gSWYgdGhlIHN0YXR1cyBpcyBgQlRNX1BNX1NUU19TTklGRmAgYW5kIHRoZSBpbmZvIGZpZWxkIGhhcyB0aGUKLSAgICAgICBgQlRBX0RNX0RJX1NFVF9TTklGRmAgYml0IHNldCwgdGhlbiBgQlRBX0RNX0RJX0lOVF9TTklGRmAgaXMgc2V0LAotICAgICAgIG90aGVyd2lzZSBgQlRBX0RNX0RJX0FDUF9TTklGRmAgaXMgc2V0LgotICAgICAtIElmIGBCVEFfUE1fU1RTX0VSUk9SYCwgdGhlIGBCVEFfRE1fRElfU0VUX1NOSUZGYCBiaXQgaXMgY2xlYXJlZCBpbiB0aGUKLSAgICAgICBkZXZpY2UgaW5mbyBmaWVsZC4KLQotQXQgdGhpcyBwb2ludCwgZWl0aGVyIHRoZSBtZXRob2Qgc2ltcGx5IHJldHVybnMsIG9yIGhhcyBjYWxsZWQgYmFjayBpbnRvCi1gYnRhX2RtX3BtX3NldF9tb2RlYCwgaW4gd2hpY2ggY2FzZSB0aGUgdXN1YWwgZmxvdyB0YWtlcyBvdmVyLgotCi0jIyMjIEV2ZW50cyBmaXJlZCBmcm9tIHRpbWVycwotCi1UaW1lcnMgYXJlIHVzZWQgZXhjbHVzaXZlbHkgZm9yIGhhbmRsaW5nIEhDSSBjb21tYW5kIHRpbWVvdXRzLCBhbmQgZmlsdGVyCi10aHJvdWdoIHRvIGEgY2FsbCB0byBgYnRhX2RtX3BtX3NldF9tb2RlYDoKLQotICAxLiBBIHRpbWVyIGV4cGlyZXMsIGFuZCBjYWxscyBgYnRhX2RtX3BtX3RpbWVyX2NiYWNrYC4KLSAgMi4gYGJ0YV9kbV9wbV90aW1lcl9jYmFja2AgY2xlYXJzIHRoZSB1c2UgZmxhZyBvbiB0aGUgdGltZXIgdGhhdCBmaXJlZCwgYW5kCi0gICAgIHNlbmRzIG9mZiBhbiBldmVudCB0byB0aGUgQlRBIHdvcmtxdWV1ZSB0aHJlYWQuCi0gIDMuIFRoZSBldmVudCBldmVudHVhbGx5IGZpcmVzIG9mZiBhIGNhbGwgdG8gYGJ0YV9kbV9wbV90aW1lcmAsIHdoaWNoIGp1c3QKLSAgICAgY2FsbHMgYGJ0YV9kbV9wbV9zZXRfbW9kZWAgd2l0aCB0aW1lb3V0IHNldCB0byBgVFJVRWAuCmRpZmYgLS1naXQgYS9kb2MvcHJvcGVydGllcy5tZCBiL2RvYy9wcm9wZXJ0aWVzLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGFiOTdjLi4wMDAwMDAwCi0tLSBhL2RvYy9wcm9wZXJ0aWVzLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotUHJvcGVydGllcwotPT09Ci1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBhbGwgb2YgdGhlIEFuZHJvaWQgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBCbHVldG9vdGgKLXN0YWNrLgotCi1QbGVhc2Uga2VlcCB0aGUgZm9sbG93aW5nIGxpc3QgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotCi0qIGBgYCBibHVldG9vdGguZW5hYmxlX3RpbWVvdXRfbXMgYGBgICAKLSAgTWF4aW11bSBhbW91bnQgb2YgdGltZSBCbHVldG9vdGggY2FuIHRha2UgdG8gc3RhcnQtdXAsIHVwbG9hZCBmaXJtd2FyZSBldGMuICAKLSAgVXNlZCBpbiBoY2kvc3JjL2hjaV9sYXllci5jYywgZGVmYXVsdCA4MDAwLgotCi0jIyMgVE9ETzogd3JpdGUgZGVzY3JpcHRpb25zIG9mIHdoYXQgZWFjaCBwcm9wZXJ0eSBtZWFucyBhbmQgaG93Ci1pdCdzIHVzZWQuCi0KLSogYGBgIGRlYnVnLnN5cy5ub3NjaGVkZ3JvdXBzIGBgYAotKiBgYGAgcGVyc2lzdC5zZXJ2aWNlLmJkcm9pZC5iZGFkZHIgYGBgCi0qIGBgYCByby5ibHVldG9vdGguaGZwLnZlciBgYGAKLSogYGBgIHJvLmJ0LmJkYWRkcl9wYXRoIGBgYAotKiBgYGAgcm8ucHJvZHVjdC5tb2RlbCBgYGAKLSogYGBgIHNlcnZpY2UuYnJjbS5idC5vb2IgYGBgCmRpZmYgLS1naXQgYS9kb2MvcHRzX2d1aWRlLm1kIGIvZG9jL3B0c19ndWlkZS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxM2I5ZC4uMDAwMDAwMAotLS0gYS9kb2MvcHRzX2d1aWRlLm1kCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBGbHVvcmlkZSBCbHVldG9vdGggUHJvZmlsZSBUdW5pbmcgU3VpdGUgKFBUUykgVGVzdCBNb2RlCi0KLVRoaXMgZG9jdW1lbnQgcHJvdmlkZXMgY29tbWFuZHMgdG8gZW5hYmxlIFBUUyB0ZXN0IG1vZGUgZm9yIEZsdW9yaWRlIHN0YWNrLiBXZQotbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBzb21lIHRlc3QgY2FzZXMgYXMgdGhleSBhcmUgbm90IGFwcGxpY2FibGUgZm9yIHRoZQotRmx1b3JpZGUgc3RhY2suCi0KLSMjIFBUUyBUZXN0IE1vZGUgc3lzdGVtIHByb3BlcnR5Ci0KLVByb2ZpbGUgc2VydmljZXMgaW4gcGFja2FnZXMvYXBwcy9CbHVldG9vdGggdXNlcyBzeXN0ZW0gcHJvcGVydHkKLWBwZXJzaXN0LmJsdWV0b290aC5wdHNgIHRvIGNoZWNrIGlmIHRoZSBQVFMgdGVzdCBtb2RlIGlzIGVuYWJsZWQuIFRvIGVuYWJsZSBpdDoKLQotYGBgc2gKLWFkYiBzaGVsbCBzZXRwcm9wIHBlcnNpc3QuYmx1ZXRvb3RoLnB0cyB0cnVlCi1gYGAKLQotVG8gZGlzYWJsZSBpdDoKLQotYGBgc2gKLWFkYiBzaGVsbCBzZXRwcm9wIHBlcnNpc3QuYmx1ZXRvb3RoLnB0cyBmYWxzZQotYGBgCi0KLSMjIyBDdXJyZW50IHVzZSBjYXNlCi0KLS0gSW4gYG5ld2F2cmNwYCwgd2Ugc2VuZCBhY3RpdmUgcGxheWVyIHVwZGF0ZSB0byByZW1vdGUgZGV2aWNlIG9ubHkgaW4gUFRTIHRlc3QKLSAgbW9kZSAoQVZSQ1AvVEcvTVBTL0JWLTA1LUMgQVZSQ1AvVEcvTVBTL0JWLTA3LUMpLgotCi0jIyBQVFMgSGVscGVycyBpbiBzdGFjayBjb25maWcKLQotTmF0aXZlIHN0YWNrIGFsc28gcmVxdWlyZXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nLCBhbmQgdGhlIGNvbmZpZyBpcyBzdG9yZWQgaW4KLWBjb25mL2J0X3N0YWNrLmNvbmZgLiBUbyBlbmFibGUgYSBmbGFnLCB1bmNvbW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgbGluZSBhbmQKLXB1c2ggdGhlIGNvbmZpZyBmaWxlIHRvIGAvZXRjL2JsdWV0b290aC9gIGluIElVVC4KLQotIyMjIEN1cnJlbnQgdXNlIGNhc2UKLQotLSBgUFRTX1NlY3VyZVBhaXJPbmx5YCBlbmFibGVzIHNlY3VyZSBjb25uZWN0aW9ucyBvbmx5IG1vZGUuCi0tIGBQVFNfRGlzYWJsZUNvbm5VcGRhdGVzYCBkaXNhYmxlcyBMRSBDb25uZWN0aW9uIHVwZGF0ZXMuCi0tIGBQVFNfRGlzYWJsZVNEUE9uTEVQYWlyYCBkaXNhYmxlcyBCUi9FRFIgZGlzY292ZXJ5IGFmdGVyIExFIHBhaXJpbmcgdG8gYXZvaWQKLSAgY3Jvc3Mga2V5IGRlcml2YXRpb24gZXJyb3JzLgotLSBgUFRTX1NtcE9wdGlvbnNgIHNldHMgU01QIFBhaXIgb3B0aW9ucyAoZm9ybWF0dGVkIGFzIGhleCBieXRlcykgYGF1dGgsIGlvLAotICBpa2V5LCBya2V5LCBrc2l6ZWAuCi0tIGBQVFNfQXZyY3BUZXN0YCBlbmFibGVzIEFWUkNQIHRlc3QgbW9kZS4gVGhlIFVJRCBpcyBzZXQgdG8gMHhmZmZmZmZmZmZmZmZmZmZmCi0gIGluIGBUcmFja0NoYW5nZWROb3RpZmljYXRpb25SZXNwb25zZWAgKEFWUkNQL1RHL05GWS9CVi0wNC1DKS4KLS0gYFBUU19TbXBGYWlsdXJlQ2FzZWAgZW5hYmxlcyBoYW5kbGluZyBmb3IgdmFyaW91cyBTTVAgZmFpbHVyZSBjYXNlcy4KZGlmZiAtLWdpdCBhL2RvYy9zdHlsZV9ndWlkZS5tZCBiL2RvYy9zdHlsZV9ndWlkZS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjNzg2ZS4uMDAwMDAwMAotLS0gYS9kb2Mvc3R5bGVfZ3VpZGUubWQKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotIyBGbHVvcmlkZSBTdHlsZSBHdWlkZQotVGhpcyBkb2N1bWVudCBvdXRsaW5lcyB0aGUgY29kaW5nIGNvbnZlbnRpb25zIGFuZCBjb2RlIHN0eWxlIHVzZWQgaW4gRmx1b3JpZGUuCi1JdHMgcHJpbWFyeSBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgZXhwbGljaXQgZ3VpZGFuY2Ugb24gc3R5bGUgc28gdGhhdCBkZXZlbG9wZXJzCi1hcmUgY29uc2lzdGVudCB3aXRoIG9uZSBhbm90aGVyIGFuZCBzcGVuZCBsZXNzIHRpbWUgZGViYXRpbmcgc3R5bGUuCi0KLUFzIGEgcnVsZSwgd2UgZm9sbG93IHRoZSBHb29nbGUgQysrCi1bU3R5bGUgR3VpZGVdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwpLgotRXhjZXB0aW9ucyB3aWxsIGJlIG5vdGVkIGJlbG93LgotCi0jIyBEaXJlY3Rvcnkgc3RydWN0dXJlCi1EaXJlY3RvcmllcyBhdCB0aGUgdG9wLWxldmVsIHNob3VsZCBjb25zaXN0IG9mIG1ham9yIHN1YnN5c3RlbXMgaW4gRmx1b3JpZGUuCi1FYWNoIHN1YnN5c3RlbSdzIHB1cnBvc2Ugc2hvdWxkIGJlIGRvY3VtZW50ZWQgaW4gdGhlIGBkb2MvZGlyZWN0b3J5X2xheW91dC5tZGAKLWZpbGUsIGV2ZW4gaWYgaXQgc2VlbXMgb2J2aW91cyBmcm9tIHRoZSBuYW1lLgotCi1Gb3IgYSBzdWJzeXN0ZW0gdGhhdCBjb250YWlucyBjb2RlLCBpdHMgZGlyZWN0b3J5IHN0cnVjdHVyZSBzaG91bGQgbG9vayBsaWtlOgotYGBgCi0gIEFuZHJvaWQubWsKLSAgaW5jbHVkZS8KLSAgc3JjLwotICB0ZXN0LwotYGBgCi1GdXJ0aGVyLCB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpbnNpZGUgYHNyYy9gIGFuZCBgaW5jbHVkZS9gIHNob3VsZCBiZQotbWlycm9yZWQuIEluIG90aGVyIHdvcmRzLCBpZiBgc3JjL2AgY29udGFpbnMgYSBzdWJkaXJlY3RvcnkgY2FsbGVkIGBmb28vYCwKLWBpbmNsdWRlL2AgbXVzdCBhbHNvIGhhdmUgYSBzdWJkaXJlY3RvcnkgbmFtZWQgYGZvby9gLgotCi0jIyBUYXJnZXQgYXJjaGl0ZWN0dXJlCi1GbHVvcmlkZSB0YXJnZXRzIGEgdmFyaWV0eSBvZiBoYXJkd2FyZSBhbmQgY2Fubm90IG1ha2UgbWFueSBhc3N1bXB0aW9ucyBhYm91dAotbWVtb3J5IGxheW91dCwgc2l6ZXMsIGJ5dGUgb3JkZXIsIGV0Yy4gQXMgYSByZXN1bHQsIHNvbWUgb3BlcmF0aW9ucyBhcmUKLWNvbnNpZGVyZWQgdW5zYWZlIGFuZCB0aGlzIHNlY3Rpb24gb3V0bGluZXMgdGhlIG1vc3QgaW1wb3J0YW50IG9uZXMgdG8gd2F0Y2ggb3V0Ci1mb3IuCi0KLSMjIyBQb2ludGVyIC8gaW50ZWdlciBjYXN0cwotSW4gZ2VuZXJhbCwgZG8gbm90IGNhc3QgcG9pbnRlcnMgdG8gaW50ZWdlcnMgb3IgdmljZSB2ZXJzYS4KLQotVGhlIG9uZSBleGNlcHRpb24gaXMgaWYgYW4gaW50ZWdlciBuZWVkcyB0byBiZSB0ZW1wb3JhcmlseSBjb252ZXJ0ZWQgdG8gYQotcG9pbnRlciBhbmQgdGhlbiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnRlZ2VyLiBUaGlzIHN0eWxlIG9mIGNvZGUgaXMgdHlwaWNhbGx5Ci1uZWVkZWQgd2hlbiBwcm92aWRpbmcgYW4gaW50ZWdyYWwgdmFsdWUgYXMgdGhlIGNvbnRleHQgdG8gYSBjYWxsYmFjaywgYXMgaW4gdGhlCi1mb2xsb3dpbmcgZXhhbXBsZS4KLWBgYAotdm9pZCBteV9jYWxsYmFjayh2b2lkICpjb250ZXh0KSB7Ci0gIHVpbnRwdHJfdCBhcmcgPSBjb250ZXh0OwotfQotCi1zZXRfdXBfY2FsbGJhY2sobXlfY2FsbGJhY2ssICh1aW50cHRyX3QpNSk7Ci1gYGAKLU5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIGludGVncmFsIHZhbHVlIHdhcyB3cml0dGVuIGludG8gdGhlIHBvaW50ZXIgYW5kIHJlYWQKLWZyb20gdGhlIHBvaW50ZXIgYXMgYSBgdWludHB0cl90YCB0byBhdm9pZCBhIGxvc3Mgb2YgcHJlY2lzaW9uIChvciB0byBtYWtlIHRoZQotbG9zcyBleHBsaWNpdCkuCi0KLSMjIyBCeXRlIG9yZGVyCi1JdCBpcyBub3Qgc2FmZSB0byBhc3N1bWUgYW55IHBhcnRpY3VsYXIgYnl0ZSBvcmRlci4gV2hlbiBzZXJpYWxpemluZyBvcgotZGVzZXJpYWxpemluZyBkYXRhLCBpdCBpcyB1bnNhZmUgdG8gbWVtY3B5IHVubGVzcyBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLXBvaW50ZXJzIGhhdmUgdGhlIHNhbWUgdHlwZS4KLQotIyMgTGFuZ3VhZ2UKLUZsdW9yaWRlIGlzIHdyaXR0ZW4gaW4gQzk5IGFuZCBzaG91bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZlYXR1cmVzIG9mZmVyZWQgYnkKLWl0LiBIb3dldmVyLCBub3QgYWxsIGxhbmd1YWdlIGZlYXR1cmVzIGxlbmQgdGhlbXNlbHZlcyB3ZWxsIHRvIHRoZSB0eXBlIG9mCi1kZXZlbG9wbWVudCByZXF1aXJlZCBieSBGbHVvcmlkZS4gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGd1aWRhbmNlIG9uIHNvbWUgb2YgdGhlCi1mZWF0dXJlcyB0byBlbWJyYWNlIG9yIGF2b2lkLgotCi0jIyMgQyBQcmVwcm9jZXNzb3IKLVRoZSB1c2Ugb2YgdGhlIEMgcHJlcHJvY2Vzc29yIHNob3VsZCBiZSBtaW5pbWl6ZWQuIEluIHBhcnRpY3VsYXI6Ci0qIHVzZSBmdW5jdGlvbnMgb3IsIGlmIGFic29sdXRlbHkgbmVjZXNzYXJ5LCBpbmxpbmUgZnVuY3Rpb25zIGluc3RlYWQgb2YgbWFjcm9zCi0qIHVzZSBgc3RhdGljIGNvbnN0YCB2YXJpYWJsZXMgaW5zdGVhZCBvZiBgI2RlZmluZWAKLSogdXNlIGBlbnVtYCBmb3IgZW51bWVyYXRpb25zLCBub3QgYSBjb2xsZWN0aW9uIG9mIGAjZGVmaW5lYHMKLSogbWluaW1pemUgdGhlIHVzZSBvZiBmZWF0dXJlIC8gY29uZGl0aW9uYWwgbWFjcm9zCi0KLVRoZSBsYXN0IHBvaW50IGlzIHBlcmhhcHMgdGhlIG1vc3QgY29udGVudGlvdXMuIEl0J3Mgd2VsbC11bmRlcnN0b29kIHRoYXQKLWZlYXR1cmUgbWFjcm9zIGFyZSB1c2VmdWwgaW4gcmVkdWNpbmcgY29kZSBzaXplIGJ1dCBpdCBsZWFkcyB0byBhbiBleHBvbmVudGlhbAotZXhwbG9zaW9uIGluIGJ1aWxkIGNvbmZpZ3VyYXRpb25zLiBTZXR0aW5nIHVwLCB0ZXN0aW5nLCBhbmQgdmVyaWZ5aW5nIGVhY2ggb2YKLXRoZSBgMl5uYCBidWlsZCBjb25maWd1cmF0aW9ucyBpcyB1bnRlbmFibGUgZm9yIGBuYCBncmVhdGVyIHRoYW4sIHNheSwgNC4KLQotIyMjIEMrKwotQWx0aG91Z2ggQysrIG9mZmVycyBjb25zdHJ1Y3RzIHRoYXQgbWF5IG1ha2UgRmx1b3JpZGUgZGV2ZWxvcG1lbnQgZmFzdGVyLAotc2FmZXIsIG1vcmUgcGxlYXNhbnQsIGV0Yy4gdGhlIGRlY2lzaW9uIF9mb3IgdGhlIHRpbWUgYmVpbmdfIGlzIHRvIHN0aWNrIHdpdGgKLXB1cmUgQzk5LiBUaGUgZXhjZXB0aW9ucyBhcmUgd2hlbiBsaW5raW5nIGFnYWluc3QgbGlicmFyaWVzIHRoYXQgYXJlIHdyaXR0ZW4KLWluIEMrKy4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZyB0aGVzZSBsaWJyYXJpZXMgYXJlIGBndGVzdGAgYW5kIGB0aW55eG1sMmAsCi13aGVyZSB0aGUgbGF0dGVyIGlzIGEgZGVwZW5kZW5jeSB0aGF0IHNob3VsZCBiZSBlbGltaW5hdGVkIGluIGZhdm9yIG9mIHNpbXBsZXIsCi1ub24tWE1MIGZvcm1hdHMuCi0KLSMjIyBWYXJpYWRpYyBmdW5jdGlvbnMKLVZhcmlhZGljIGZ1bmN0aW9ucyBhcmUgZGFuZ2Vyb3VzIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBmb3IgbW9zdCBjb2RlLiBUaGUKLWV4Y2VwdGlvbiBpcyB3aGVuIGltcGxlbWVudGluZyBsb2dnaW5nIHNpbmNlIHRoZSBiZW5lZml0cyBvZiByZWFkYWJpbGl0eQotb3V0d2VpZ2ggdGhlIGNvc3Qgb2Ygc2FmZXR5LgotCi0jIyMgRnVuY3Rpb25zIHdpdGggemVybyBhcmd1bWVudHMKLUZ1bmN0aW9ucyB0aGF0IGRvIG5vdCB0YWtlIGFueSBhcmd1bWVudHMgKDAgYXJpdHkpIHNob3VsZCBiZSBkZWNsYXJlZCBsaWtlIHNvOgotYGBgCi12b2lkIGZ1bmN0aW9uKHZvaWQpOwotYGBgCi1Ob3RlIHRoYXQgdGhlIGZ1bmN0aW9uIGV4cGxpY2l0bHkgaW5jbHVkZXMgYHZvaWRgIGluIGl0cyBwYXJhbWV0ZXIgbGlzdCB0bwotaW5kaWNhdGUgdG8gdGhlIGNvbXBpbGVyIHRoYXQgaXQgdGFrZXMgbm8gYXJndW1lbnRzLgotCi0jIyMgVmFyaWFibGUgZGVjbGFyYXRpb25zCi1WYXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIG9uZSBwZXIgbGluZSBhcyBjbG9zZSB0byBpbml0aWFsaXphdGlvbiBhcyBwb3NzaWJsZS4KLUluIG5lYXJseSBhbGwgY2FzZXMsIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVjbGFyZWQgYW5kIGluaXRpYWxpemVkIG9uIHRoZSBzYW1lIGxpbmUuCi1WYXJpYWJsZSBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdCBpbmNsdWRlIGV4dHJhIHdoaXRlc3BhY2UgdG8gbGluZSB1cCBmaWVsZHMuIEZvcgotZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzdHlsZSBpcyBwcmVmZXJyZWQ6Ci1gYGAKLSAgaW50IG15X2xvbmdfdmFyaWFibGVfbmFtZSA9IDA7Ci0gIGludCB4ID0gNTsKLWBgYAotd2hlcmVhcyB0aGlzIGNvZGUgaXMgbm90IGFjY2VwdGFibGU6Ci1gYGAKLSAgaW50IG15X2xvbmdfdmFyaWFibGVfbmFtZSA9IDA7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgIHggPSA1OwotYGBgCi0KLUFzIGEgcmVzdWx0IG9mIHRoZSBhYm92ZSBydWxlIHRvIGRlY2xhcmUgYW5kIGluaXRpYWxpemUgdmFyaWFibGVzIHRvZ2V0aGVyLAotYGZvcmAgbG9vcHMgc2hvdWxkIGRlY2xhcmUgYW5kIGluaXRpYWxpemUgdGhlaXIgaXRlcmF0b3IgdmFyaWFibGUgaW4gdGhlCi1pbml0aWFsaXplciBzdGF0ZW1lbnQ6Ci1gYGAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgLy8gdXNlIGkKLSAgfQotYGBgCi0KLSMjIyBDb250aWd1b3VzIG1lbW9yeSBzdHJ1Y3RzCi1Vc2UgQzk5IGZsZXhpYmxlIGFycmF5cyBhcyB0aGUgbGFzdCBtZW1iZXIgb2YgYSBzdHJ1Y3QgaWYgdGhlIGFycmF5IG5lZWRzCi10byBiZSBhbGxvY2F0ZWQgaW4gY29udGlndW91cyBtZW1vcnkgd2l0aCBpdHMgY29udGFpbmluZyBzdHJ1Y3QuCi1BIGZsZXhpYmxlIGFycmF5IG1lbWJlciBpcyB3cml0ZW4gYXMgYGFycmF5X25hbWVbXWAgd2l0aG91dCBhIHNwZWNpZmllZCBzaXplLgotRm9yIGV4YW1wbGU6Ci1gYGAKLXR5cGVkZWYgc3RydWN0IHsKLSAgc2l6ZV90IGxlbmd0aDsKLSAgdWludDhfdCBkYXRhW107Ci19IGJ1ZmZlcl90OwotCi0vLyBBbGxvY2F0ZSBhIGJ1ZmZlciB3aXRoIDEyOCBieXRlcyBhdmFpbGFibGUgZm9yIG15X2J1ZmZlci0+ZGF0YS4KLWJ1ZmZlcl90ICpteV9idWZmZXIgPSBtYWxsb2Moc2l6ZW9mKGJ1ZmZlcl90KSArIDEyOCk7Ci11aW50OF90ICpkYXRhID0gbXlfYnVmZmVyLT5kYXRhOwotYGBgCi0KLSMjIyBQb2ludGVyIGFyaXRobWV0aWMKLUF2b2lkIHBvaW50ZXIgYXJpdGhtZXRpYyB3aGVuIHBvc3NpYmxlIGFzIGl0IHJlc3VsdHMgaW4gZGlmZmljdWx0IHRvIHJlYWQgY29kZS4KLVByZWZlciBhcnJheS1pbmRleGluZyBzeW50YXggb3ZlciBwb2ludGVyIGFyaXRobWV0aWMuCi0KLUluIHBhcnRpY3VsYXIsIGRvIG5vdCB3cml0ZSBjb2RlIGxpa2UgdGhpczoKLWBgYAotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3QgbGVuZ3RoOwotfSBidWZmZXJfdDsKLQotYnVmZmVyX3QgKm15X2J1ZmZlciA9IG1hbGxvYyhzaXplb2YoYnVmZmVyX3QpICsgMTI4KTsKLXVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKShteV9idWZmZXIgKyAxKTsKLWBgYAotSW5zdGVhZCwgdXNlIHplcm8tbGVuZ3RoIGFycmF5cyBhcyBkZXNjcmliZWQgYWJvdmUgdG8gYXZvaWQgcG9pbnRlciBhcml0aG1ldGljCi1hbmQgYXJyYXkgaW5kZXhpbmcgZW50aXJlbHkuCi0KLSMjIyBCb29sZWFuIHR5cGUKLVVzZSB0aGUgQzk5IGBib29sYCB0eXBlIHdpdGggdmFsdWVzIGB0cnVlYCBhbmQgYGZhbHNlYCBkZWZpbmVkIGluIGBzdGRib29sLmhgLgotTm90IG9ubHkgaXMgdGhpcyBhIHN0YW5kYXJkaXplZCB0eXBlLCBpdCBpcyBhbHNvIHNhZmVyIGFuZCBwcm92aWRlcyBtb3JlCi1jb21waWxlLXRpbWUgY2hlY2tzLgotCi0jIyMgQm9vbGVhbnMgaW5zdGVhZCBvZiBiaXRmaWVsZHMKLVVzZSBib29sZWFucyB0byByZXByZXNlbnQgYm9vbGVhbiBzdGF0ZSwgaW5zdGVhZCBvZiBhIHNldCBvZiBtYXNrcyBpbnRvIGFuCi1pbnRlZ2VyLiBJdCdzIG1vcmUgdHJhbnNwYXJlbnQgYW5kIHJlYWRhYmxlLCBhbmQgbGVzcyBlcnJvciBwcm9uZS4KLQotIyMjIEZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MKLUM5OSBkZWZpbmVzIGBfX2Z1bmNfX2AgYXMgYW4gaWRlbnRpZmllciB0aGF0IHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uJ3MgbmFtZQotaW4gd2hpY2ggaXQgaXMgdXNlZC4gVGhlIG1hZ2ljIGlkZW50aWZpZXIgYF9fRlVOQ1RJT05fX2Agc2hvdWxkIG5vdCBiZSB1c2VkCi1hcyBpdCBpcyBhIG5vbi1zdGFuZGFyZCBsYW5ndWFnZSBleHRlbnNpb24gYW5kIGFuIGVxdWl2YWxlbnQgc3RhbmRhcmRpemVkCi1tZWNoYW5pc20gZXhpc3RzLiBJbiBvdGhlciB3b3JkcywgdXNlIGBfX2Z1bmNfX2Agb3ZlciBgX19GVU5DVElPTl9fYC4KLQotIyMgRmx1b3JpZGUgY29udmVudGlvbnMKLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgY29kaW5nIGNvbnZlbnRpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIEZsdW9yaWRlLgotV2hlcmVhcyB0aGUgX0xhbmd1YWdlXyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdXNlIG9mIGxhbmd1YWdlIGZlYXR1cmVzLCB0aGlzCi1zZWN0aW9uIGRlc2NyaWJlcyBpZGlvbXMsIGJlc3QgcHJhY3RpY2VzLCBhbmQgY29udmVudGlvbnMgdGhhdCBhcmUgaW5kZXBlbmRlbnQKLW9mIGxhbmd1YWdlIGZlYXR1cmVzLgotCi0jIyMgTWVtb3J5IG1hbmFnZW1lbnQKLVVzZSBgb3NpX21hbGxvY2Agb3IgYG9zaV9jYWxsb2NgIHRvIGFsbG9jYXRlIGJ5dGVzIGluc3RlYWQgb2YgcGxhaW4gYG1hbGxvY2AuCi1MaWtld2lzZSwgdXNlIGBvc2lfZnJlZWAgb3ZlciBgZnJlZWAuIFRoZXNlIHdyYXBwZWQgZnVuY3Rpb25zIHByb3ZpZGUgYWRkaXRpb25hbAotbGlnaHR3ZWlnaHQgbWVtb3J5IGJvdW5kcyBjaGVja3MgdGhhdCBjYW4gaGVscCB0cmFjayBkb3duIG1lbW9yeSBlcnJvcnMuCi0KLUJ5IGNvbnZlbnRpb24sIGZ1bmN0aW9ucyB0aGF0IGNvbnRhaW4gYCpfbmV3YCBpbiB0aGVpciBuYW1lIGFyZSBhbGxvY2F0aW9uCi1yb3V0aW5lcyBhbmQgb2JqZWN0cyByZXR1cm5lZCBmcm9tIHRob3NlIGZ1bmN0aW9ucyBtdXN0IGJlIGZyZWVkIHdpdGggdGhlCi1jb3JyZXNwb25kaW5nIGAqX2ZyZWVgIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgbGlzdCBvYmplY3RzIHJldHVybmVkIGZyb20KLWBsaXN0X25ld2Agc2hvdWxkIGJlIGZyZWVkIHdpdGggYGxpc3RfZnJlZWAgYW5kIG5vIG90aGVyIGZyZWVpbmcgcm91dGluZS4KLQotIyMjIEFzc2VydHMKLVVzZSBgQ0hFQ0tgIGxpYmVyYWxseSB0aHJvdWdob3V0IHRoZSBjb2RlIHRvIGVuZm9yY2UgaW52YXJpYW50cy4gQXNzZXJ0aW9ucwotc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlLWVmZmVjdHMgYW5kIHNob3VsZCBiZSB1c2VkIHRvIGRldGVjdCBwcm9ncmFtbWluZyBsb2dpYwotZXJyb3JzLiBQbGVhc2UgZG8gbm90IHVzZSBgYXNzZXJ0YC4KLQotQXQgbWluaW11bSwgZXZlcnkgZnVuY3Rpb24gc2hvdWxkIGFzc2VydCBleHBlY3RhdGlvbnMgb24gaXRzIGFyZ3VtZW50cy4gVGhlCi1mb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGtpbmRzIG9mIGFzc2VydGlvbnMgb25lIHNob3VsZCBtYWtlIG9uCi1mdW5jdGlvbiBhcmd1bWVudHMuCi1gYGAKLSAgc2l6ZV90IG9wZW5fYW5kX3JlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqdGFyZ2V0X2J1ZmZlciwgc2l6ZV90IG1heF9ieXRlcykgewotICAgIENIRUNLKGZpbGVuYW1lICE9IE5VTEwpOwotICAgIENIRUNLKGZpbGVuYW1lWzBdICE9ICdcMCcpOwotICAgIENIRUNLKHRhcmdldF9idWZmZXIgIT0gTlVMTCk7Ci0gICAgQ0hFQ0sobWF4X2J5dGVzID4gMCk7Ci0KLSAgICAvLyBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBiZWdpbnMgaGVyZQotICB9Ci1gYGAKLQotIyMgSGVhZGVyIGZpbGVzCi1JbiBnZW5lcmFsLCBldmVyeSBzb3VyY2UgZmlsZSAoYC5jYCBvciBgLmNwcGApIGluIGEgYHNyYy9gIGRpcmVjdG9yeSBzaG91bGQKLWhhdmUgYSBjb3JyZXNwb25kaW5nIGhlYWRlciAoYC5oYCkgaW4gdGhlIGBpbmNsdWRlL2AgZGlyZWN0b3J5LgotCi0jIyMgVGVtcGxhdGUgaGVhZGVyIGZpbGUKLWBgYAotW2NvcHlyaWdodCBoZWFkZXJdCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2EuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYi5oPgotCi0jaW5jbHVkZSAic3Vic3lzdGVtL2luY2x1ZGUvYS5oIgotI2luY2x1ZGUgInN1YnN5c3RlbS9pbmNsdWRlL2IuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgYWxhcm1fdCBhbGFybV90OwotdHlwZWRlZiBzdHJ1Y3QgbGlzdF90IGxpc3RfdDsKLQotLy8gVGhpcyBjb21tZW50IGRlc2NyaWJlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLiBJdCBpcyBub3QgYSBzdHJ1Y3R1cmVkCi0vLyBjb21tZW50LCBpdCdzIEVuZ2xpc2ggcHJvc2UuIEZ1bmN0aW9uIGFyZ3VtZW50cyBjYW4gYmUgcmVmZXJyZWQgdG8gYXMKLS8vIHxwYXJhbXwuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgbmV3IG9iamVjdCB3YXMgY3JlYXRlZCwgZmFsc2UKLS8vIG90aGVyd2lzZS4KLWJvb2wgdGVtcGxhdGVfbmV3KGNvbnN0IGxpc3RfdCAqcGFyYW0pOwotCi0vLyBFYWNoIHB1YmxpYyBmdW5jdGlvbiBtdXN0IGhhdmUgYSBjb21tZW50IGRlc2NyaWJpbmcgaXRzIHNlbWFudGljcy4gSW4KLS8vIHBhcnRpY3VsYXIsIGVkZ2UgY2FzZXMsIGFuZCB3aGV0aGVyIGEgcG9pbnRlciBhcmd1bWVudCBtYXkgb3IgbWF5IG5vdCBiZQotLy8gTlVMTC4KLXZvaWQgdGVtcGxhdGVfdXNlX2FsYXJtKGFsYXJtX3QgKmFsYXJtKTsKLWBgYAotCi0jIyMgTGljZW5zZSBoZWFkZXIKLUVhY2ggaGVhZGVyIGZpbGUgbXVzdCBiZWdpbiB3aXRoIHRoZSBmb2xsb3dpbmcgQXBhY2hlIDIuMCBMaWNlbnNlIHdpdGggYDx5ZWFyPmAKLWFuZCBgPG93bmVyPmAgcmVwbGFjZWQgd2l0aCB0aGUgeWVhciBpbiB3aGljaCB0aGUgZmlsZSB3YXMgYXV0aG9yZWQgYW5kIHRoZQotb3duZXIgb2YgdGhlIGNvcHlyaWdodCwgcmVzcGVjdGl2ZWx5LgotYGBgCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCA8eWVhcj4gPG93bmVyPgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1gYGAKLQotIyMjIEluY2x1ZGUgZ3VhcmQKLUFmdGVyIHRoZSBsaWNlbnNlIGhlYWRlciwgZWFjaCBoZWFkZXIgZmlsZSBtdXN0IGNvbnRhaW4gdGhlIGluY2x1ZGUgZ3VhcmQ6Ci1gYGAKLSNwcmFnbWEgb25jZQotYGBgCi1UaGlzIGZvcm0gaXMgdXNlZCBvdmVyIHRyYWRpdGlvbmFsIGAjZGVmaW5lYC1iYXNlZCBpbmNsdWRlIGd1YXJkcyBhcyBpdCBpcyBsZXNzCi1lcnJvci1wcm9uZSwgZG9lc24ndCBwb2xsdXRlIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpcyBtb3JlIGNvbXBhY3QsIGFuZCBjYW4KLXJlc3VsdCBpbiBmYXN0ZXIgY29tcGlsYXRpb24uCi0KLSMjIEZvcm1hdHRpbmcKLUNvZGUgZm9ybWF0dGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgdXNpbmcgY2xhbmctZm9ybWF0LgotCi1UaGUgc3R5bGUgZmlsZSBpcyBsb2NhdGVkIGF0IHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSBpbiAuY2xhbmctZm9ybWF0LiAgVGhlCi0tc3R5bGU9ZmlsZSBvcHRpb24gaW5zdHJ1Y3RzIGNsYW5nLWZvcm1hdCB0byBsb29rIGZvciB0aGlzIGZpbGUuICBZb3UgbWF5IGZpbmQKLWNsYW5nLWZvcm1hdCAtLWhlbHAgdXNlZnVsIGZvciBtb3JlIGFkdmFuY2VkIHVzYWdlLiBUaGUgW09ubGluZSBjbGFuZy1mb3JtYXQKLURvY3VtZW50YXRpb25dKGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0NsYW5nRm9ybWF0Lmh0bWwpIGNhbiBhbHNvIGJlIGhlbHBmdWwuCi0KLWBjbGFuZy1mb3JtYXQgLXN0eWxlPWZpbGUgLWkgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qYAotCi0jIyMgTXkgUGF0Y2ggRG9lc24ndCBBcHBseSBBbnltb3JlIQotQ2hvb3NlIG9uZSBvZiB0aGUgb3B0aW9ucyBiZWxvdy4gIFRoZSBmZXdlciBwYXRjaGVzIHRoYXQgaGF2ZSBiZWVuIGFwcGxpZWQgdG8KLXRoZSB0cmVlIHNpbmNlIHRoZSBmb3JtYXR0aW5nIGNoYW5nZSB3YXMgYXBwbGllZCwgdGhlIGJldHRlci4gIEluIHRoaXMgc2hvcnQKLWd1aWRlLCBjb21tYW5kcyB5b3UgdHlwZSB3aWxsIGJlIG1hcmtlZCBhcyBgY29kZWAsIHdpdGggb3V0cHV0IGluICppdGFsaWNzKi4KLQotIyMjIyBPcHRpb24gMTogVGhlIEJlc3QgQ2FzZQotVXNlIHRoaXMgb3B0aW9uIGlmIHlvdXIgcGF0Y2ggdG91Y2hlcyBvbmx5IGEgZmV3IGZpbGVzIHdpdGggZmV3IGludGVybWVkaWF0ZQotcGF0Y2hlcy4KLQotIyMjIyMgRmluZCB0aGUgZm9ybWF0dGluZyBwYXRjaAotCi1gZ2l0IGxvZyAtLW9uZWxpbmUgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qIHwgZ3JlcCBjbGFuZy1mb3JtYXQgfCBoZWFkIC1uIDVgCi0KLSAqKjE1Y2UxYmQqKiBzdWJ0cmVlOiBBcHBseSAqKmNsYW5nLWZvcm1hdCoqIGZvciB0aGUgZmlyc3QgdGltZSoKLQotIyMjIyMgUmV2ZXJ0IHRoZSBmb3JtYXR0aW5nIHBhdGNoCi0KLWBnaXQgcmV2ZXJ0IEhBU0ggLW5gCi0KLShSZXBsYWNlIEhBU0ggd2l0aCAxNWNlMWJkIGluIHRoaXMgZXhhbXBsZS4pCi0KLSMjIyMjIENoZWNrIGZvciBjb25mbGljdHMgd2l0aCB5b3VyIHBhdGNoCi0KLWBnaXQgc3RhdHVzIHwgZ3JlcCBib3RoLm1vZGlmaWVkYAotCi1JZiB0aGlzIGxpc3QgY29udGFpbnMgZmlsZXMgbW9kaWZpZWQgYnkgeW91ciBwYXRjaCwgeW91IHNob3VsZCBnaXZlIHVwCi0KLWBnaXQgcmV2ZXJ0IC0tYWJvcnRgCi0KLWFuZCB0cnkgYSBkaWZmZXJlbnQgbWV0aG9kLgotCi1JZiB0aGlzIGxpc3QgY29udGFpbnMgZmlsZXMgbm90IG1vZGlmaWVkIGJ5IHlvdXIgcGF0Y2gsIHlvdSBzaG91bGQgdW5zdGFnZSB0aGVtCi0KLWBnaXQgcmVzZXQgSEVBRCBib3RoX21vZGlmaWVkX2ZpbGVgCi0KLWFuZCByZW1vdmUgdGhlaXIgY2hhbmdlcwotCi1gZ2l0IGNoZWNrb3V0IGJvdGhfbW9kaWZpZWRfZmlsZWAKLQotIyMjIyMgQXBwbHkgeW91ciBwYXRjaAotCi1gZ2l0IGNoZXJyeS1waWNrIHlvdXJfcGF0Y2hfdGhhdF91c2VkX3RvX2FwcGx5X2NsZWFubHlgCi0KLSMjIyMjIFJlZm9ybWF0IHRoZSBjb2RlCi0KLWBjbGFuZy1mb3JtYXQgLXN0eWxlPWZpbGUgLWkgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qYAotCi0jIyMjIyBDb21taXQgdGhlIGNvZGUgdGhhdCB5b3VyIHBhdGNoIHRvdWNoZWQKLQotYGdpdCBhZGQgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qYAotCi1gZ2l0IGNvbW1pdCAtLWFtZW5kYAotCi0jIyMjIyBDbGVhbiB1cCBhbnkgb3RoZXIgZmlsZXMKLQotYGdpdCBjaGVja291dCAuYAotCi0jIyMjIyBSZXZpZXcgeW91ciBuZXcgcGF0Y2gKLQotYGdpdCBkaWZmYAotCi0jIyMjIE9wdGlvbiAyOiBSZWZvcm1hdCB5b3VyIHBhdGNoCi0KLSMjIyMjIFN0YXJ0IHdpdGggYSB0cmVlIHdpdGggeW91ciBwYXRjaCBhcHBsaWVkIHRvIHRoZSB0aXAgb2YgdHJlZQotCi1gZ2l0IGxvZyAtLW9uZWxpbmUgfCBoZWFkIC1uIDFgCi0KLSAqKmRjNWYwZTIqKiBVbmZvcm1hdHRlZCBidXQgdml0YWwgcGF0Y2gqCi0KLSgqKlJlbWVtYmVyIHRoZSBIQVNIIGZyb20gdGhpcyBzdGVwKiopCi0KLSMjIyMjIENyZWF0ZSBhIG5ldyBicmFuY2ggc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgdW5yZWxhdGVkIHBhdGNoCi0KLWBnaXQgY2hlY2tvdXQgSEVBRF4gLWIgcmVmb3JtYXRfbXlfcGF0Y2hfYnJhbmNoYAotCi1gZ2l0IGxvZyAtLW9uZWxpbmUgfCBoZWFkIC1uIDFgCi0KLSAqKjE1Y2UxYmQqKiBGaXJzdCBVbnJlbGF0ZWQgcGF0Y2gqCi0KLSMjIyMjIFJlZm9ybWF0IHRoZSBjb2RlCi0KLWBjbGFuZy1mb3JtYXQgLXN0eWxlPWZpbGUgLWkgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qYAotCi0jIyMjIyBDb21taXQgeW91ciB0ZW1wb3JhcnkgZm9ybWF0dGluZyBwYXRjaAotCi1gZ2l0IGFkZCBwYXRoX3RvX2ZpbGVzL2ZpbGVuYW1lX29yXypgCi0KLWBnaXQgY29tbWl0IC1tIHRtcF9mb3JtYXRfcGF0Y2hgCi0KLSMjIyMjIFJldmVydCB5b3VyIHRlbXBvcmFyeSBmb3JtYXR0aW5nIHBhdGNoICgqKkJlYXIgd2l0aCBtZSEqKikKLQotYGdpdCByZXZlcnQgSEVBRCAtLW5vLWVkaXRgCi0KLSMjIyMjIEFwcGx5IHlvdXIgcGF0Y2gKLQotYGdpdCBjaGVycnktcGljayBIQVNIYAotCi0oVGhlIEhBU0ggb2YgeW91ciBwYXRjaCwgZGM1ZjBlMiBpbiB0aGlzIGNhc2UpCi0KLSMjIyMjIFJlZm9ybWF0IHRoZSBjb2RlCi0KLWBjbGFuZy1mb3JtYXQgLXN0eWxlPWZpbGUgLWkgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qYAotCi0jIyMjIyBDb21taXQgeW91ciBzZWNvbmQgdGVtcG9yYXJ5IGZvcm1hdHRpbmcgcGF0Y2gKLQotYGdpdCBhZGQgcGF0aF90b19maWxlcy9maWxlbmFtZV9vcl8qYAotCi1gZ2l0IGNvbW1pdCAtbSB0bXBfZm9ybWF0X3BhdGNoXzJgCi0KLSMjIyMjIENoZWNrIHRvIHNlZSB0aGF0IGV2ZXJ5dGhpbmcgbG9va3MgcmlnaHQKLQotYGdpdCBsb2cgLS1vbmVsaW5lIHwgaGVhZCAtbiA1YAotCi0qMDRjOTdjZiB0bXBfZm9ybWF0X3BhdGNoXzIqCi0KLSpjZjg1NjBjIFVuZm9ybWF0dGVkIGJ1dCB2aXRhbCBwYXRjaCoKLQotKjA0Yzk3Y2YgUmV2ZXJ0ICJ0bXBfZm9ybWF0X3BhdGNoIioKLQotKmQ2NmJiNmYgdG1wX2Zvcm1hdF9wYXRjaCoKLQotKjE1Y2UxYmQgRmlyc3QgVW5yZWxhdGVkIHBhdGNoKgotCi0jIyMjIyBTcXVhc2ggdGhlIGxhc3QgdGhyZWUgcGF0Y2hlcyB3aXRoIGdpdCByZWJhc2UKLQotYGdpdCByZWJhc2UgLWkgSEVBRF5eXmAKLQotKnBpY2sgMDRjOTdjZiB0bXBfZm9ybWF0X3BhdGNoXzIqCi0KLSpzcXVhc2ggY2Y4NTYwYyBVbmZvcm1hdHRlZCBidXQgdml0YWwgcGF0Y2gqCi0KLSpzcXVhc2ggMDRjOTdjZiBSZXZlcnQgInRtcF9mb3JtYXRfcGF0Y2giKgotCi0jIyMjIyBSZW1lbWJlciB0byBlZGl0IHRoZSBjb21taXQgbWVzc2FnZSEKLQotYGNsYW5nLWZvcm1hdCAtc3R5bGU9ZmlsZSAtaSBwYXRoX3RvX2ZpbGVzL2ZpbGVuYW1lX29yXypgCi0KLSMjIyMjIENoZWNrIHRvIHNlZSB0aGF0IGV2ZXJ5dGhpbmcgbG9va3MgcmlnaHQKLQotYGdpdCBsb2cgLS1vbmVsaW5lIHwgaGVhZCAtbiAyYAotCi0qNTIzMDc4ZiBSZWZvcm1hdHRlZCB2aXRhbCBwYXRjaCoKLQotKmQ2NmJiNmYgdG1wX2Zvcm1hdF9wYXRjaCoKLQotIyMjIyMgUmV2aWV3IHlvdXIgbmV3IHBhdGNoCi0KLWBnaXQgc2hvd2AKLQotIyMjIyMgQ2hlY2tvdXQgdGhlIGN1cnJlbnQgdHJlZSBhbmQgY2hlcnJ5IHBpY2sgeW91ciByZWZvcm1hdHRlZCBwYXRjaCEKLQotYGdpdCBjaGVja291dCBhb3NwL21hc3RlcmAKLQotYGdpdCBjaGVycnktcGljayBIQVNIYAotCi0oSEFTSCBpcyA1MjMwNzhmIGluIHRoaXMgZXhhbXBsZSkKZGlmZiAtLWdpdCBhL2RvYy9zdXBwb3J0ZWRfZmVhdHVyZXMubWQgYi9kb2Mvc3VwcG9ydGVkX2ZlYXR1cmVzLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNhODRkLi4wMDAwMDAwCi0tLSBhL2RvYy9zdXBwb3J0ZWRfZmVhdHVyZXMubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIEZsdW9yaWRlIDEuMQotCi1EZWNsYXJhdGlvbiBJRDogW0QwMjQ1MjddKGh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvdHBnL1FMSV92aWV3UURMLmNmbT9xaWQ9MjQ1MjcpCi1RdWFsaWZpZWQgRGVzaWduIElEOiA4Mzk1MwotCi1Qcm90b2NvbCAvIFByb2ZpbGUgfCBWZXJzaW9uIHwgUm9sZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0KLUwyQ0FQICAgICAgICAgICAgICB8IDQuMiAgICAgfCBJbml0aWF0b3IsIEFjY2VwdG9yLCBMRSBDZW50cmFsLCBMRSBQZXJpcGhlcmFsCi1TRFAgICAgICAgICAgICAgICAgfCA0LjIgICAgIHwgU2VydmVyLCBDbGllbnQKLUdBUCAgICAgICAgICAgICAgICB8IDQuMiAgICAgfCBCUi9FRFIsIExFIENlbnRyYWwsIExFIFBlcmlwZXJoYWwsIExFIE9ic2VydmVyLCBMRSBCcm9hZGNhc3RlcgotR0FUVCAgICAgICAgICAgICAgIHwgNC4yICAgICB8IENsaWVudCwgU2VydmVyOyBMRSBhbmQgQlIvRURSCi1BVFQgICAgICAgICAgICAgICAgfCA0LjIgICAgIHwgQ2xpZW50LCBTZXJ2ZXI7IExFIGFuZCBCUi9FRFIKLVNNICAgICAgICAgICAgICAgICB8IDQuMiAgICAgfCBDZW50cmFsIChJbml0aWF0b3IpLCBQZXJpcGhlcmFsIChSZXNwb25kZXIpCi1BVkNUUCAgICAgICAgICAgICAgfCAxLjQgICAgIHwgQ29udHJvbGxlciwgVGFyZ2V0Ci1BVkRUUCAgICAgICAgICAgICAgfCAxLjIgICAgIHwgU291cmNlLCBJbml0aWF0b3IsIEFjY2VwdG9yCi1CTkVQICAgICAgICAgICAgICAgfCAxLjAgICAgIHwKLUdBVkRQICAgICAgICAgICAgICB8IDEuMiAgICAgfCBJbml0aWF0b3IsIEFjY2VwdG9yCi1SRkNPTU0gICAgICAgICAgICAgfCAxLjIgICAgIHwKLVNQUCAgICAgICAgICAgICAgICB8IDEuMiAgICAgfCBBLCBCCmRpZmYgLS1naXQgYS9lbWJkcnYvZzcyMi9BbmRyb2lkLmJwIGIvZW1iZHJ2L2c3MjIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiODEzOS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvZzcyMi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRAotICAgIC8vICAgbGVnYWN5X3VuZW5jdW1iZXJlZAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmc3MjJjb2RlYyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ERzcyMl9TVVBQT1JUX01BTExPQyIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJnNzIyX2RlY29kZS5jYyIsCi0gICAgICAgICJnNzIyX2VuY29kZS5jYyIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9nNzIyL0JVSUxELmduIGIvZW1iZHJ2L2c3MjIvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNWUwNmUuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2c3MjIvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxOCBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc3RhdGljX2xpYnJhcnkoImc3MjIiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImc3MjJfZGVjb2RlLmNjIiwKLSAgICAiZzcyMl9lbmNvZGUuY2MiLAotICBdCi0KLSAgZGVmaW5lcyA9IFsgIkc3MjJfU1VQUE9SVF9NQUxMT0MiIF0KLSAgY29uZmlncyArPSBbICIvL2J0OnRhcmdldF9kZWZhdWx0cyIgXQotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2c3MjIvZnV6emVyL0FuZHJvaWQuYnAgYi9lbWJkcnYvZzcyMi9mdXp6ZXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3ZmFkMC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvZzcyMi9mdXp6ZXIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJnNzIyX2VuY19mdXp6ZXIiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImc3MjJfZW5jX2Z1enplci5jYyIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmc3MjJjb2RlYyIsCi0gICAgXSwKLSAgICBmdXp6X2NvbmZpZzogewotICAgICAgICBjYzogWwotICAgICAgICAgICAgImhzekBnb29nbGUuY29tIiwKLSAgICAgICAgXSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2c3MjIvZnV6emVyL2c3MjJfZW5jX2Z1enplci5jYyBiL2VtYmRydi9nNzIyL2Z1enplci9nNzIyX2VuY19mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZGY0NzIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2c3MjIvZnV6emVyL2c3MjJfZW5jX2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLQotI2luY2x1ZGUgIi4uL2c3MjJfZW5jX2RlYy5oIgotCi11aW50MzJfdCBnZXRfcmF0ZV9mcm9tX2ZkcChGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICB1aW50MzJfdCByYXRlID0gZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigKLSAgICAgIDAsIDMpOyAgLy8gQ3VycmVudGx5IDMgZGlmZmVyZW50IGJpdCByYXRlcyBhcmUgYXZhaWxhYmxlIGluIEcuNzIyIGNvZGVjCi0gIHN3aXRjaCAocmF0ZSkgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiA0ODAwMDsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gNTYwMDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiA2NDAwMDsKLSAgfQotfQotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIEZ1enplZERhdGFQcm92aWRlciBmZHAoZGF0YSwgc2l6ZSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICBidWZmLnB1c2hfYmFjayhkYXRhW2ldKTsKLSAgfQotCi0gIGludCBudW1fc2FtcGxlcyA9Ci0gICAgICBidWZmLnNpemUoKSAvICgyIC8qYnl0ZXNfcGVyX3NhbXBsZSovICogMiAvKm51bWJlciBvZiBjaGFubmVscyovKTsKLQotICAvLyBUaGUgRy43MjIgY29kZWMgYWNjZXB0IG9ubHkgZXZlbiBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgZW5jb2RpbmcKLSAgaWYgKG51bV9zYW1wbGVzICUgMiAhPSAwKSB7Ci0gICAgbnVtX3NhbXBsZXMtLTsKLSAgfQotCi0gIC8vIE1ha2luZyBjaGFubmVsIGRhdGEgZnJvbSBidWZmZXIKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNoYW5uZWxfZGF0YTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpKyspIHsKLSAgICBjb25zdCB1aW50OF90KiBzYW1wbGUgPSBidWZmLmRhdGEoKSArIGkgKiAyOwotICAgIGludDE2X3QgbGVmdCA9IChpbnQxNl90KSgoKihzYW1wbGUgKyAxKSA8PCA4KSArICpzYW1wbGUpID4+IDE7Ci0KLSAgICBzYW1wbGUgKz0gMjsKLSAgICBpbnQxNl90IHJpZ2h0ID0gKGludDE2X3QpKCgqKHNhbXBsZSArIDEpIDw8IDgpICsgKnNhbXBsZSkgPj4gMTsKLQotICAgIHVpbnQxNl90IG1vbm9fZGF0YSA9IChpbnQxNl90KSgoKHVpbnQzMl90KWxlZnQgKyAodWludDMyX3QpcmlnaHQpID4+IDEpOwotICAgIGNoYW5uZWxfZGF0YS5wdXNoX2JhY2sobW9ub19kYXRhKTsKLSAgfQotCi0gIHVpbnQzMl90IHJhdGUgPSBnZXRfcmF0ZV9mcm9tX2ZkcCgmZmRwKTsKLQotICAvLyBFbmNvZGVyIEluaXRpYWxpemF0aW9uCi0gIGc3MjJfZW5jb2RlX3N0YXRlX3QqIGVuY29kZXJfc3RhdGUgPSBudWxscHRyOwotICBlbmNvZGVyX3N0YXRlID0gZzcyMl9lbmNvZGVfaW5pdChudWxscHRyLCByYXRlLCBHNzIyX1BBQ0tFRCk7Ci0KLSAgLy8gRW5jb2RlCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGVuY29kZWRfZGF0YTsKLSAgLy8gTWFnaWMgbnVtYmVyIGlzIHVzZWQgaW4gYXBpLCBJdCBzaG91bGQgYmFzaWNhbGx5IGZpdCB0aGUgbnVtYmVyIGdlbmVyYXRlZAotICAvLyBieSB0aGlzIGZvcm11bGEgOiBudW1fY2hhbm5lbHMgKiBzYW1wbGVfcmF0ZSAqIGRhdGFfaW50ZXJ2YWxfbXMKLSAgLy8gKiAoYml0X3JhdGUgLyA4KSkgLyAxMDAwIGFzIG1lbnRpb25lZCBpbiBoZWFyaW5nX2FpZC5jYyBBbmQgaWYgd2UgZml0IGFsbAotICAvLyB0aGUgdmFsdWVzIGluIHRoZSBhYm92ZSBmb3JtdWxhLCB0aGUgbWF4IHZhbHVlIHdlIGNhbiBnZXQgaXMgMTkyMC4gQW5kIEkKLSAgLy8gdXNlZCAic2l6ZSIgb2YgdGhlIGlucHV0IHRoYXQgbGliZnV6emVyIGdlbmVyYXRlcyBhcyB0aGUgaW5pdGlhbAotICAvLyBwYXJhbWV0ZXIgdG8gcmVzaXplCi0gIGVuY29kZWRfZGF0YS5yZXNpemUoc2l6ZSk7Ci0gIGludCBlbmNvZGVkX3NpemUgPQotICAgICAgZzcyMl9lbmNvZGUoZW5jb2Rlcl9zdGF0ZSwgZW5jb2RlZF9kYXRhLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90KiljaGFubmVsX2RhdGEuZGF0YSgpLCBjaGFubmVsX2RhdGEuc2l6ZSgpKTsKLSAgZW5jb2RlZF9kYXRhLnJlc2l6ZShlbmNvZGVkX3NpemUpOwotCi0gIC8vIEVuY29kZXIgcmVsZWFzZQotICBpZiAoZW5jb2Rlcl9zdGF0ZSAhPSBudWxscHRyKSB7Ci0gICAgZzcyMl9lbmNvZGVfcmVsZWFzZShlbmNvZGVyX3N0YXRlKTsKLSAgICBlbmNvZGVyX3N0YXRlID0gbnVsbHB0cjsKLSAgfQotCi0gIHJldHVybiAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VtYmRydi9nNzIyL2c3MjJfZGVjb2RlLmNjIGIvZW1iZHJ2L2c3MjIvZzcyMl9kZWNvZGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODEyYWMuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2c3MjIvZzcyMl9kZWNvZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoKLSAqIFNwYW5EU1AgLSBhIHNlcmllcyBvZiBEU1AgY29tcG9uZW50cyBmb3IgdGVsZXBob255Ci0gKgotICogZzcyMl9kZWNvZGUuYyAtIFRoZSBJVFUgRy43MjIgY29kZWMsIGRlY29kZSBwYXJ0LgotICoKLSAqIFdyaXR0ZW4gYnkgU3RldmUgVW5kZXJ3b29kIDxzdGV2ZXVAY29wcGljZS5vcmc+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFN0ZXZlIFVuZGVyd29vZAotICoKLSAqICBEZXNwaXRlIG15IGdlbmVyYWwgbGlraW5nIG9mIHRoZSBHUEwsIEkgcGxhY2UgbXkgb3duIGNvbnRyaWJ1dGlvbnMgCi0gKiAgdG8gdGhpcyBjb2RlIGluIHRoZSBwdWJsaWMgZG9tYWluIGZvciB0aGUgYmVuZWZpdCBvZiBhbGwgbWFua2luZCAtCi0gKiAgZXZlbiB0aGUgc2xpbXkgb25lcyB3aG8gbWlnaHQgdHJ5IHRvIHByb3ByaWV0aXplIG15IHdvcmsgYW5kIHVzZSBpdAotICogIHRvIG15IGRldHJpbWVudC4KLSAqCi0gKiBCYXNlZCBpbiBwYXJ0IG9uIGEgc2luZ2xlIGNoYW5uZWwgRy43MjIgY29kZWMgd2hpY2ggaXM6Ci0gKgotICogQ29weXJpZ2h0IChjKSBDTVUgMTk5MwotICogQ29tcHV0ZXIgU2NpZW5jZSwgU3BlZWNoIEdyb3VwCi0gKiBDaGVuZ3hpYW5nIEx1IGFuZCBBbGV4IEhhdXB0bWFubgotICoKLSAqICRJZDogZzcyMl9kZWNvZGUuYyAxOTQ3MjIgMjAwOS0wNS0xNSAxNzo1OTowOFogcnVzc2VsbCAkCi0gKi8KLQotLyohIFxmaWxlICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJnNzIyX3R5cGVkZWZzLmgiCi0jaW5jbHVkZSAiZzcyMl9lbmNfZGVjLmgiCi0KLSNpZiAhZGVmaW5lZChGQUxTRSkKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0jaWYgIWRlZmluZWQoVFJVRSkKLSNkZWZpbmUgVFJVRSAoIUZBTFNFKQotI2VuZGlmCi0KLSNkZWZpbmUgUEFDS0VEX0lOUFVUICAgICgwKQotI2RlZmluZSBCSVRTX1BFUl9TQU1QTEUgKDgpCi0KLSNpZm5kZWYgQlVJTERfRkVBVFVSRV9HNzIyX1VTRV9JTlRSSU5TSUNfU0FUCi1zdGF0aWMgX19pbmxpbmUgaW50MTZfdCBfX3NzYXQxNihpbnQzMl90IGFtcCkKLXsKLSAgICBpbnQxNl90IGFtcDE2OwotCi0gICAgLyogSG9wZWZ1bGx5IHRoaXMgaXMgb3B0aW1pc2VkIGZvciB0aGUgY29tbW9uIGNhc2UgLSBub3QgY2xpcHBpbmcgKi8KLSAgICBhbXAxNiA9IChpbnQxNl90KSBhbXA7Ci0gICAgaWYgKGFtcCA9PSBhbXAxNikKLSAgICAgICAgcmV0dXJuIGFtcDE2OwotICAgIGlmIChhbXAgPiAweDdmZmYpCi0gICAgICAgIHJldHVybiAgMHg3ZmZmOwotICAgIHJldHVybiAgMHg4MDAwOwotfQotLyotIEVuZCBvZiBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZWxzZQotc3RhdGljIF9faW5saW5lIGludDE2X3QgX19zc2F0MTYoIGludDMyX3QgdmFsKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgcmVzOwotICAgIF9fYXNtIHZvbGF0aWxlICgKLSAgICAgICAgIlNTQVQgJTAsICMxNiwgJTFcblx0IgotICAgICAgICA6Ij1yIihyZXMpCi0gICAgICAgIDoiciIodmFsKQotICAgICAgICA6KTsKLSAgICByZXR1cm4gKGludDE2X3QpcmVzOwotfQotI2VuZGlmCi0KLS8qLSBFbmQgb2YgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBibG9jazQoZzcyMl9iYW5kX3QgKmJhbmQsIGludCBkKTsKLQotc3RhdGljIHZvaWQgYmxvY2s0KGc3MjJfYmFuZF90ICpiYW5kLCBpbnQgZCkKLXsKLSAgICBpbnQgd2QxOwotICAgIGludCB3ZDI7Ci0gICAgaW50IHdkMzsKLSAgICBpbnQgaTsKLSAgICBpbnQgc2dbN107Ci0gICAgaW50IGFwMSwgYXAyOwotICAgIGludCBzZzAsIHNnaTsKLSAgICBpbnQgc3o7Ci0KLSAgICAvKiBCbG9jayA0LCBSRUNPTlMgKi8KLSAgICBiYW5kLT5kWzBdID0gZDsKLSAgICBiYW5kLT5yWzBdID0gX19zc2F0MTYoYmFuZC0+cyArIGQpOwotCi0gICAgLyogQmxvY2sgNCwgUEFSUkVDICovCi0gICAgYmFuZC0+cFswXSA9IF9fc3NhdDE2KGJhbmQtPnN6ICsgZCk7Ci0KLSAgICAvKiBCbG9jayA0LCBVUFBPTDIgKi8KLSAgICBmb3IgKGkgPSAwOyAgaSA8IDM7ICBpKyspCi0gICAgewotICAgICAgICBzZ1tpXSA9IGJhbmQtPnBbaV0gPj4gMTU7Ci0gICAgfQotICAgIHdkMSA9IF9fc3NhdDE2KGJhbmQtPmFbMV0gPDwgMik7Ci0KLSAgICB3ZDIgPSAoc2dbMF0gPT0gc2dbMV0pICA/ICAtd2QxICA6ICB3ZDE7Ci0gICAgaWYgKHdkMiA+IDMyNzY3KQotICAgICAgICB3ZDIgPSAzMjc2NzsKLQotICAgIGFwMiA9IChzZ1swXSA9PSBzZ1syXSkgID8gIDEyOCAgOiAgLTEyODsKLSAgICBhcDIgKz0gKHdkMiA+PiA3KTsKLSAgICBhcDIgKz0gKGJhbmQtPmFbMl0qMzI1MTIpID4+IDE1OwotICAgIGlmIChhcDIgPiAxMjI4OCkKLSAgICAgICAgYXAyID0gMTIyODg7Ci0gICAgZWxzZSBpZiAoYXAyIDwgLTEyMjg4KQotICAgICAgICBhcDIgPSAtMTIyODg7Ci0gICAgYmFuZC0+YXBbMl0gPSBhcDI7Ci0KLSAgICAvKiBCbG9jayA0LCBVUFBPTDEgKi8KLSAgICBzZ1swXSA9IGJhbmQtPnBbMF0gPj4gMTU7Ci0gICAgc2dbMV0gPSBiYW5kLT5wWzFdID4+IDE1OwotICAgIHdkMSA9IChzZ1swXSA9PSBzZ1sxXSkgID8gIDE5MiAgOiAgLTE5MjsKLSAgICB3ZDIgPSAoYmFuZC0+YVsxXSozMjY0MCkgPj4gMTU7Ci0KLSAgICBhcDEgPSBfX3NzYXQxNih3ZDEgKyB3ZDIpOwotICAgIHdkMyA9IF9fc3NhdDE2KDE1MzYwIC0gYmFuZC0+YXBbMl0pOwotICAgIGlmIChhcDEgPiB3ZDMpCi0gICAgICAgIGFwMSA9IHdkMzsKLSAgICBlbHNlIGlmIChhcDEgPCAtd2QzKQotICAgICAgICBhcDEgPSAtd2QzOwotICAgIGJhbmQtPmFwWzFdID0gYXAxOwotCi0gICAgLyogQmxvY2sgNCwgVVBaRVJPICovCi0gICAgLyogQmxvY2sgNCwgRklMVEVaICovCi0gICAgd2QxID0gKGQgPT0gMCkgID8gIDAgIDogIDEyODsKLQotICAgIHNnMCA9IHNnWzBdID0gZCA+PiAxNTsKLSAgICBmb3IgKGkgPSAxOyAgaSA8IDc7ICBpKyspCi0gICAgewotCXNnaSA9IGJhbmQtPmRbaV0gPj4gMTU7Ci0gICAgICAgIHdkMiA9IChzZ2kgPT0gc2cwKSAgPyAgd2QxICA6ICAtd2QxOwotICAgICAgICB3ZDMgPSAoYmFuZC0+YltpXSozMjY0MCkgPj4gMTU7Ci0gICAgICAgIGJhbmQtPmJwW2ldID0gX19zc2F0MTYod2QyICsgd2QzKTsKLSAgICB9Ci0KLSAgICAvKiBCbG9jayA0LCBERUxBWUEgKi8KLSAgICBzeiA9IDA7Ci0gICAgZm9yIChpID0gNjsgIGkgPiAwOyAgaS0tKQotICAgIHsKLQlpbnQgYmk7Ci0KLSAgICAgICAgYmFuZC0+ZFtpXSA9IGJhbmQtPmRbaSAtIDFdOwotCWJpID0gYmFuZC0+YltpXSA9IGJhbmQtPmJwW2ldOwotCXdkMSA9IF9fc3NhdDE2KGJhbmQtPmRbaV0gKyBiYW5kLT5kW2ldKTsKLQlzeiArPSAoYmkqd2QxKSA+PiAxNTsKLSAgICB9Ci0gICAgYmFuZC0+c3ogPSBzejsKLSAgICAKLSAgICBmb3IgKGkgPSAyOyAgaSA+IDA7ICBpLS0pCi0gICAgewotICAgICAgICBiYW5kLT5yW2ldID0gYmFuZC0+cltpIC0gMV07Ci0gICAgICAgIGJhbmQtPnBbaV0gPSBiYW5kLT5wW2kgLSAxXTsKLSAgICAgICAgYmFuZC0+YVtpXSA9IGJhbmQtPmFwW2ldOwotICAgIH0KLQotICAgIC8qIEJsb2NrIDQsIEZJTFRFUCAqLwotICAgIHdkMSA9IF9fc3NhdDE2KGJhbmQtPnJbMV0gKyBiYW5kLT5yWzFdKTsKLSAgICB3ZDEgPSAoYmFuZC0+YVsxXSp3ZDEpID4+IDE1OwotICAgIHdkMiA9IF9fc3NhdDE2KGJhbmQtPnJbMl0gKyBiYW5kLT5yWzJdKTsKLSAgICB3ZDIgPSAoYmFuZC0+YVsyXSp3ZDIpID4+IDE1OwotICAgIGJhbmQtPnNwID0gX19zc2F0MTYod2QxICsgd2QyKTsKLQotICAgIC8qIEJsb2NrIDQsIFBSRURJQyAqLwotICAgIGJhbmQtPnMgPSBfX3NzYXQxNihiYW5kLT5zcCArIGJhbmQtPnN6KTsKLX0KLS8qLSBFbmQgb2YgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1nNzIyX2RlY29kZV9zdGF0ZV90ICpnNzIyX2RlY29kZV9pbml0KGc3MjJfZGVjb2RlX3N0YXRlX3QgKnMsIHVuc2lnbmVkIGludCByYXRlLCBpbnQgb3B0aW9ucykKLXsKLSAgICBpZiAocyA9PSBOVUxMKQotICAgIHsKLSNpZmRlZiBHNzIyX1NVUFBPUlRfTUFMTE9DCi0gICAgICAgIGlmICgocyA9IChnNzIyX2RlY29kZV9zdGF0ZV90ICopIG1hbGxvYyhzaXplb2YoKnMpKSkgPT0gTlVMTCkKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIG1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKLSAgICBpZiAocmF0ZSA9PSA0ODAwMCkKLSAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gNjsKLSAgICBlbHNlIGlmIChyYXRlID09IDU2MDAwKQotICAgICAgICBzLT5iaXRzX3Blcl9zYW1wbGUgPSA3OwotICAgIGVsc2UKLSAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gODsKLSAgICBzLT5kYWNfcGNtID0gb3B0aW9ucyAmIEc3MjJfRk9STUFUX0RBQzEyOwotICAgIHMtPmJhbmRbMF0uZGV0ID0gMzI7Ci0gICAgcy0+YmFuZFsxXS5kZXQgPSA4OwotICAgIHJldHVybiBzOwotfQotLyotIEVuZCBvZiBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCBnNzIyX2RlY29kZV9yZWxlYXNlKGc3MjJfZGVjb2RlX3N0YXRlX3QgKnMpCi17Ci0gICAgZnJlZShzKTsKLSAgICByZXR1cm4gMDsKLX0KLS8qLSBFbmQgb2YgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50MTZfdCB3bFs4XSA9IHstNjAsIC0zMCwgNTgsIDE3MiwgMzM0LCA1MzgsIDExOTgsIDMwNDIgfTsKLXN0YXRpYyBpbnQxNl90IHJsNDJbMTZdID0gezAsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDcsIDYsIDUsIDQsIDMsICAyLCAxLCAwIH07Ci1zdGF0aWMgaW50MTZfdCBpbGJbMzJdID0KLXsKLSAgICAyMDQ4LCAyMDkzLCAyMTM5LCAyMTg2LCAyMjMzLCAyMjgyLCAyMzMyLAotICAgIDIzODMsIDI0MzUsIDI0ODksIDI1NDMsIDI1OTksIDI2NTYsIDI3MTQsCi0gICAgMjc3NCwgMjgzNCwgMjg5NiwgMjk2MCwgMzAyNSwgMzA5MSwgMzE1OCwKLSAgICAzMjI4LCAzMjk4LCAzMzcxLCAzNDQ0LCAzNTIwLCAzNTk3LCAzNjc2LAotICAgIDM3NTYsIDM4MzgsIDM5MjIsIDQwMDgKLX07Ci0KLXN0YXRpYyBpbnQxNl90IHdoWzNdID0gezAsIC0yMTQsIDc5OH07Ci1zdGF0aWMgaW50MTZfdCByaDJbNF0gPSB7MiwgMSwgMiwgMX07Ci1zdGF0aWMgaW50MTZfdCBxbTJbNF0gPSB7LTc0MDgsIC0xNjE2LCAgNzQwOCwgICAxNjE2fTsKLXN0YXRpYyBpbnQxNl90IHFtNFsxNl0gPSAKLXsKLSAgICAgICAgMCwgLTIwNDU2LCAtMTI4OTYsICAtODk2OCwgCi0gICAgLTYyODgsICAtNDI0MCwgIC0yNTg0LCAgLTEyMDAsCi0gICAgMjA0NTYsICAxMjg5NiwgICA4OTY4LCAgIDYyODgsCi0gICAgIDQyNDAsICAgMjU4NCwgICAxMjAwLCAgICAgIDAKLX07Ci0jaWYgMAotc3RhdGljIGNvbnN0IGludCBxbTVbMzJdID0KLXsKLSAgICAgIC0yODAsICAgLTI4MCwgLTIzMzUyLCAtMTc1NjAsCi0gICAgLTE0MTIwLCAtMTE2NjQsICAtOTc1MiwgIC04MTg0LAotICAgICAtNjg2NCwgIC01NzEyLCAgLTQ2OTYsICAtMzc4NCwKLSAgICAgLTI5NjAsICAtMjIwOCwgIC0xNTIwLCAgIC04ODAsCi0gICAgIDIzMzUyLCAgMTc1NjAsICAxNDEyMCwgIDExNjY0LAotICAgICAgOTc1MiwgICA4MTg0LCAgIDY4NjQsICAgNTcxMiwKLSAgICAgIDQ2OTYsICAgMzc4NCwgICAyOTYwLCAgIDIyMDgsCi0gICAgICAxNTIwLCAgICA4ODAsICAgIDI4MCwgICAtMjgwCi19OwotI2VuZGlmCi1zdGF0aWMgaW50MTZfdCBxbTZbNjRdID0KLXsKLSAgICAgIC0xMzYsICAgLTEzNiwgICAtMTM2LCAgIC0xMzYsCi0gICAgLTI0ODA4LCAtMjE5MDQsIC0xOTAwOCwgLTE2NzA0LAotICAgIC0xNDk4NCwgLTEzNTEyLCAtMTIyODAsIC0xMTE5MiwKLSAgICAtMTAyMzIsICAtOTM2MCwgIC04NTc2LCAgLTc4NTYsCi0gICAgIC03MTkyLCAgLTY1NzYsICAtNjAwMCwgIC01NDU2LAotICAgICAtNDk0NCwgIC00NDY0LCAgLTQwMDgsICAtMzU3NiwKLSAgICAgLTMxNjgsICAtMjc3NiwgIC0yNDAwLCAgLTIwMzIsCi0gICAgIC0xNjg4LCAgLTEzNjAsICAtMTA0MCwgICAtNzI4LAotICAgICAyNDgwOCwgIDIxOTA0LCAgMTkwMDgsICAxNjcwNCwKLSAgICAgMTQ5ODQsICAxMzUxMiwgIDEyMjgwLCAgMTExOTIsCi0gICAgIDEwMjMyLCAgIDkzNjAsICAgODU3NiwgICA3ODU2LAotICAgICAgNzE5MiwgICA2NTc2LCAgIDYwMDAsICAgNTQ1NiwKLSAgICAgIDQ5NDQsICAgNDQ2NCwgICA0MDA4LCAgIDM1NzYsCi0gICAgICAzMTY4LCAgIDI3NzYsICAgMjQwMCwgICAyMDMyLAotICAgICAgMTY4OCwgICAxMzYwLCAgIDEwNDAsICAgIDcyOCwKLSAgICAgICA0MzIsICAgIDEzNiwgICAtNDMyLCAgIC0xMzYKLX07Ci1zdGF0aWMgaW50MTZfdCBxbWZfY29lZmZzX2V2ZW5bMTJdID0KLXsKLSAgICAgIDMsICAtMTEsICAgMTIsICAgMzIsIC0yMTAsICA5NTEsIDM4NzYsIC04MDUsICAzNjIsIC0xNTYsICAgNTMsICAtMTEsCi19Owotc3RhdGljIGludDE2X3QgcW1mX2NvZWZmc19vZGRbMTJdID0KLXsKLSAgICAtMTEsICAgNTMsIC0xNTYsICAzNjIsIC04MDUsIDM4NzYsIDk1MSwgIC0yMTAsICAgMzIsICAgMTIsICAtMTEsICAgIDMKLX07Ci0KLXVpbnQzMl90IGc3MjJfZGVjb2RlKGc3MjJfZGVjb2RlX3N0YXRlX3QgKnMsIGludDE2X3QgYW1wW10sIGNvbnN0IHVpbnQ4X3QgZzcyMl9kYXRhW10sIGludCBsZW4sIHVpbnQxNl90IGdhaW4pCi17Ci0KLSAgICBpbnQgZGxvd3Q7Ci0gICAgaW50IHJsb3c7Ci0gICAgaW50IGloaWdoOwotICAgIGludCBkaGlnaDsKLSAgICBpbnQgcmhpZ2g7Ci0gICAgaW50IHhvdXQxOwotICAgIGludCB4b3V0MjsKLSAgICBpbnQgd2QxOwotICAgIGludCB3ZDI7Ci0gICAgaW50IHdkMzsKLSAgICBpbnQgY29kZTsKLSAgICB1aW50MzJfdCBvdXRsZW47Ci0gICAgaW50IGk7Ci0gICAgaW50IGo7Ci0KLSAgICBvdXRsZW4gPSAwOwotICAgIHJoaWdoID0gMDsKLQotICAgIGZvciAoaiA9IDA7ICBqIDwgbGVuOyAgKQotICAgIHsKLSNpZiBQQUNLRURfSU5QVVQgPT0gMQotICAgICAgICAvKiBVbnBhY2sgdGhlIGNvZGUgYml0cyAqLwotICAgICAgICBpZiAocy0+aW5fYml0cyA8IHMtPmJpdHNfcGVyX3NhbXBsZSkKLSAgICAgICAgewotICAgICAgICAgICAgcy0+aW5fYnVmZmVyIHw9IChnNzIyX2RhdGFbaisrXSA8PCBzLT5pbl9iaXRzKTsKLSAgICAgICAgICAgIHMtPmluX2JpdHMgKz0gODsKLSAgICAgICAgfQotICAgICAgICBjb2RlID0gcy0+aW5fYnVmZmVyICYgKCgxIDw8IHMtPmJpdHNfcGVyX3NhbXBsZSkgLSAxKTsKLSAgICAgICAgcy0+aW5fYnVmZmVyID4+PSBzLT5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIHMtPmluX2JpdHMgLT0gcy0+Yml0c19wZXJfc2FtcGxlOwotI2Vsc2UKLSAgICAgICAgY29kZSA9IGc3MjJfZGF0YVtqKytdOwotI2VuZGlmCi0KLSNpZiBCSVRTX1BFUl9TQU1QTEUgPT0gOAotICAgICAgICB3ZDEgPSBjb2RlICYgMHgzRjsKLSAgICAgICAgaWhpZ2ggPSAoY29kZSA+PiA2KSAmIDB4MDM7Ci0gICAgICAgIHdkMiA9IHFtNlt3ZDFdOwotICAgICAgICB3ZDEgPj49IDI7Ci0jZWxpZiBCSVRTX1BFUl9TQU1QTEUgPT0gNwotICAgICAgICB3ZDEgPSBjb2RlICYgMHgxRjsKLSAgICAgICAgaWhpZ2ggPSAoY29kZSA+PiA1KSAmIDB4MDM7Ci0gICAgICAgIHdkMiA9IHFtNVt3ZDFdOwotICAgICAgICB3ZDEgPj49IDE7Ci0jZWxpZiBCSVRTX1BFUl9TQU1QTEUgPT0gNgotICAgICAgIHdkMSA9IGNvZGUgJiAweDBGOwotICAgICAgIGloaWdoID0gKGNvZGUgPj4gNCkgJiAweDAzOwotICAgICAgIHdkMiA9IHFtNFt3ZDFdOwotI2VuZGlmCi0gICAgICAgIC8qIEJsb2NrIDVMLCBMT1cgQkFORCBJTlZRQkwgKi8KLSAgICAgICAgd2QyID0gKHMtPmJhbmRbMF0uZGV0KndkMikgPj4gMTU7Ci0gICAgICAgIC8qIEJsb2NrIDVMLCBSRUNPTlMgKi8KLSAgICAgICAgcmxvdyA9IHMtPmJhbmRbMF0ucyArIHdkMjsKLSAgICAgICAgLyogQmxvY2sgNkwsIExJTUlUICovCi0KLSAgICAgICAgLy8gQU5EUkVBCi0gICAgICAgIC8vIHJsb3c9c3NhdChybG93LDI8PDE0KQotICAgICAgICBpZiAocmxvdyA+IDE2MzgzKQotICAgICAgICB7Ci0gICAgICAgICAgICBybG93ID0gMTYzODM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmxvdyA8IC0xNjM4NCkKLSAgICAgICAgewotICAgICAgICAgICAgcmxvdyA9IC0xNjM4NDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEJsb2NrIDJMLCBJTlZRQUwgKi8KLSAgICAgICAgd2QyID0gcW00W3dkMV07Ci0gICAgICAgIGRsb3d0ID0gKHMtPmJhbmRbMF0uZGV0KndkMikgPj4gMTU7Ci0KLSAgICAgICAgLyogQmxvY2sgM0wsIExPR1NDTCAqLwotICAgICAgICB3ZDIgPSBybDQyW3dkMV07Ci0gICAgICAgIHdkMSA9IChzLT5iYW5kWzBdLm5iKjEyNykgPj4gNzsKLSAgICAgICAgd2QxICs9IHdsW3dkMl07Ci0gICAgICAgIGlmICh3ZDEgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB3ZDEgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdkMSA+IDE4NDMyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3ZDEgPSAxODQzMjsKLSAgICAgICAgfQotICAgICAgICBzLT5iYW5kWzBdLm5iID0gd2QxOwotICAgICAgICAgICAgCi0gICAgICAgIC8qIEJsb2NrIDNMLCBTQ0FMRUwgKi8KLSAgICAgICAgd2QxID0gKHMtPmJhbmRbMF0ubmIgPj4gNikgJiAzMTsKLSAgICAgICAgd2QyID0gOCAtIChzLT5iYW5kWzBdLm5iID4+IDExKTsKLSAgICAgICAgd2QzID0gKHdkMiA8IDApICA/ICAoaWxiW3dkMV0gPDwgLXdkMikgIDogIChpbGJbd2QxXSA+PiB3ZDIpOwotICAgICAgICBzLT5iYW5kWzBdLmRldCA9IHdkMyA8PCAyOwotCi0gICAgICAgIGJsb2NrNCgmcy0+YmFuZFswXSwgZGxvd3QpOwotICAgICAgICAKLSAgICAgICAgLyogQmxvY2sgMkgsIElOVlFBSCAqLwotICAgICAgICB3ZDIgPSBxbTJbaWhpZ2hdOwotICAgICAgICBkaGlnaCA9IChzLT5iYW5kWzFdLmRldCp3ZDIpID4+IDE1OwotICAgICAgICAvKiBCbG9jayA1SCwgUkVDT05TICovCi0gICAgICAgIHJoaWdoID0gZGhpZ2ggKyBzLT5iYW5kWzFdLnM7Ci0gICAgICAgIC8qIEJsb2NrIDZILCBMSU1JVCAqLwotCi0gICAgICAgIC8vIEFORFJFQQotICAgICAgICAvLyByaGlnaD1zc2F0KHJoaWdoLDI8PDE0KQotCi0gICAgICAgIGlmIChyaGlnaCA+IDE2MzgzKQotICAgICAgICAgICAgcmhpZ2ggPSAxNjM4MzsKLSAgICAgICAgZWxzZSBpZiAocmhpZ2ggPCAtMTYzODQpCi0gICAgICAgICAgICByaGlnaCA9IC0xNjM4NDsKLQotICAgICAgICAvKiBCbG9jayAySCwgSU5WUUFIICovCi0gICAgICAgIHdkMiA9IHJoMltpaGlnaF07Ci0gICAgICAgIHdkMSA9IChzLT5iYW5kWzFdLm5iKjEyNykgPj4gNzsKLSAgICAgICAgd2QxICs9IHdoW3dkMl07Ci0gICAgICAgIGlmICh3ZDEgPCAwKQotICAgICAgICAgICAgd2QxID0gMDsKLSAgICAgICAgZWxzZSBpZiAod2QxID4gMjI1MjgpCi0gICAgICAgICAgICB3ZDEgPSAyMjUyODsKLSAgICAgICAgcy0+YmFuZFsxXS5uYiA9IHdkMTsKLSAgICAgICAgICAgIAotICAgICAgICAvKiBCbG9jayAzSCwgU0NBTEVIICovCi0gICAgICAgIHdkMSA9IChzLT5iYW5kWzFdLm5iID4+IDYpICYgMzE7Ci0gICAgICAgIHdkMiA9IDEwIC0gKHMtPmJhbmRbMV0ubmIgPj4gMTEpOwotICAgICAgICB3ZDMgPSAod2QyIDwgMCkgID8gIChpbGJbd2QxXSA8PCAtd2QyKSAgOiAgKGlsYlt3ZDFdID4+IHdkMik7Ci0gICAgICAgIHMtPmJhbmRbMV0uZGV0ID0gd2QzIDw8IDI7Ci0KLSAgICAgICAgYmxvY2s0KCZzLT5iYW5kWzFdLCBkaGlnaCk7Ci0KLSAgICAgICAgLyogQXBwbHkgdGhlIHJlY2VpdmUgUU1GICovCi0gICAgICAgIGZvciAoaSA9IDA7ICBpIDwgMjI7ICBpKyspCi0gICAgICAgICAgICBzLT54W2ldID0gcy0+eFtpICsgMl07Ci0gICAgICAgIHMtPnhbMjJdID0gcmxvdyArIHJoaWdoOwotICAgICAgICBzLT54WzIzXSA9IHJsb3cgLSByaGlnaDsKLQotICAgICAgICAvLyB3ZSBzaG91bGQgZ2V0IFBFUkYgbnVtYmVycyBmb3IgdGhlIGZvbGxvd2luZyBsb29wIAotICAgICAgICB4b3V0MSA9IDA7Ci0gICAgICAgIHhvdXQyID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgIGkgPCAxMjsgIGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgeG91dDIgKz0gcy0+eFsyKmldICAgKiBxbWZfY29lZmZzX2V2ZW5baV07Ci0gICAgICAgICAgICB4b3V0MSArPSBzLT54WzIqaSsxXSAqIHFtZl9jb2VmZnNfb2RkW2ldOwotICAgICAgICB9Ci0gICAgICAgIHhvdXQxID0gTkxERUNPTVBSRVNTX1BSRVBST0NFU1NfU0FNUExFX1dJVEhfR0FJTigoaW50MTZfdCkgX19zc2F0MTYoeG91dDEgPj4gMTEpLCBnYWluKTsKLSAgICAgICAgeG91dDIgPSBOTERFQ09NUFJFU1NfUFJFUFJPQ0VTU19TQU1QTEVfV0lUSF9HQUlOKChpbnQxNl90KSBfX3NzYXQxNih4b3V0MiA+PiAxMSksIGdhaW4pOwotICAgICAgICBpZiAocy0+ZGFjX3BjbSkKLSAgICAgICAgewotICAgICAgICAgICAgYW1wW291dGxlbisrXSA9ICgoaW50MTZfdCkgKHhvdXQxID4+IDQpICsgMjA0OCk7Ci0gICAgICAgICAgICBhbXBbb3V0bGVuKytdID0gKChpbnQxNl90KSAoeG91dDIgPj4gNCkgKyAyMDQ4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFtcFtvdXRsZW4rK10gPSB4b3V0MTsKLSAgICAgICAgICAgIGFtcFtvdXRsZW4rK10gPSB4b3V0MjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0bGVuOwotfQotLyotIEVuZCBvZiBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0gRW5kIG9mIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9nNzIyL2c3MjJfZW5jX2RlYy5oIGIvZW1iZHJ2L2c3MjIvZzcyMl9lbmNfZGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNmNkMjAuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2c3MjIvZzcyMl9lbmNfZGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIFNwYW5EU1AgLSBhIHNlcmllcyBvZiBEU1AgY29tcG9uZW50cyBmb3IgdGVsZXBob255Ci0gKgotICogZzcyMi5oIC0gVGhlIElUVSBHLjcyMiBjb2RlYy4KLSAqCi0gKiBXcml0dGVuIGJ5IFN0ZXZlIFVuZGVyd29vZCA8c3RldmV1QGNvcHBpY2Uub3JnPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBTdGV2ZSBVbmRlcndvb2QKLSAqCi0gKiAgRGVzcGl0ZSBteSBnZW5lcmFsIGxpa2luZyBvZiB0aGUgR1BMLCBJIHBsYWNlIG15IG93biBjb250cmlidXRpb25zIAotICogIHRvIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbiBmb3IgdGhlIGJlbmVmaXQgb2YgYWxsIG1hbmtpbmQgLQotICogIGV2ZW4gdGhlIHNsaW15IG9uZXMgd2hvIG1pZ2h0IHRyeSB0byBwcm9wcmlldGl6ZSBteSB3b3JrIGFuZCB1c2UgaXQKLSAqICB0byBteSBkZXRyaW1lbnQuCi0gKgotICogQmFzZWQgb24gYSBzaW5nbGUgY2hhbm5lbCBHLjcyMiBjb2RlYyB3aGljaCBpczoKLSAqCi0gKioqKiogICAgQ29weXJpZ2h0IChjKSBDTVUgICAgMTk5MyAgICAgICoqKioqCi0gKiBDb21wdXRlciBTY2llbmNlLCBTcGVlY2ggR3JvdXAKLSAqIENoZW5neGlhbmcgTHUgYW5kIEFsZXggSGF1cHRtYW5uCi0gKgotICogJElkOiBnNzIyLmggNDg5NTkgMjAwNi0xMi0yNSAwNjo0MjoxNVogcml6em8gJAotICovCi0KLQotLyohIFxmaWxlICovCi0KLSNpZiAhZGVmaW5lZChfRzcyMl9IXykKLSNkZWZpbmUgX0c3MjJfSF8KLQotLyohIFxwYWdlIGc3MjJfcGFnZSBHLjcyMiBlbmNvZGluZyBhbmQgZGVjb2RpbmcKLVxzZWN0aW9uIGc3MjJfcGFnZV9zZWNfMSBXaGF0IGRvZXMgaXQgZG8/Ci1UaGUgRy43MjIgbW9kdWxlIGlzIGEgYml0IGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJVFUgRy43MjIgc3BlY2lmaWNhdGlvbiBmb3IgYWxsIHRocmVlCi1zcGVjaWZpZWQgYml0IHJhdGVzIC0gNjQwMDBicHMsIDU2MDAwYnBzIGFuZCA0ODAwMGJwcy4gSXQgcGFzc2VzIHRoZSBJVFUgdGVzdHMuCi0KLVRvIGFsbG93IGZhc3QgYW5kIGZsZXhpYmxlIGludGVyd29ya2luZyB3aXRoIG5hcnJvdyBiYW5kIHRlbGVwaG9ueSwgdGhlIGVuY29kZXIgYW5kIGRlY29kZXIKLXN1cHBvcnQgYW4gb3B0aW9uIGZvciB0aGUgbGluZWFyIGF1ZGlvIHRvIGJlIGFuIDhrIHNhbXBsZXMvc2Vjb25kIHN0cmVhbS4gSW4gdGhpcyBtb2RlIHRoZQotY29kZWMgaXMgY29uc2lkZXJhYmx5IGZhc3RlciwgYW5kIHN0aWxsIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCB3aWRlYmFuZCB0ZXJtaW5hbHMgdXNpbmcgRy43MjIuCi0KLVxzZWN0aW9uIGc3MjJfcGFnZV9zZWNfMiBIb3cgZG9lcyBpdCB3b3JrPwotPz8/LgotKi8KLQotLyogRm9ybWF0IERBQzEyIGlzIGFkZGVkIHRvIGRlY29kZSBkaXJlY3RseSBpbnRvIHNhbXBsZXMgc3VpdGFibGUgZm9yCi0gICBhIDEyLWJpdCBEQUMgdXNpbmcgb2Zmc2V0IGJpbmFyeSByZXByZXNlbnRhdGlvbi4gKi8KLQotZW51bQotewotICAgIEc3MjJfU0FNUExFX1JBVEVfODAwMCA9IDB4MDAwMSwKLSAgICBHNzIyX1BBQ0tFRCA9IDB4MDAwMiwKLSAgICBHNzIyX0ZPUk1BVF9EQUMxMiA9IDB4MDAwNCwKLX07Ci0KLSNpZmRlZiBCVUlMRF9GRUFUVVJFX0RBQwotI2RlZmluZSBOTERFQ09NUFJFU1NfQVBQTFlfR0FJTihzLGcpICgoKHMpICogKGludDMyX3QpKGcpKSA+PiAxNikKLS8vIEVxdWl2YWxlbnQgdG8gc2hpZnQgMTYsIGFkZCAweDgwMDAsIHNoaWZ0IDQKLSNkZWZpbmUgTkxERUNPTVBSRVNTX0FQUExZX0dBSU5fQ09OVkVSVEVEX0RBQyhzLGcpICh1aW50MTZfdCkoKHVpbnQxNl90KSgoKHMpICogKGludDMyX3QpKGcpKSA+PiAyMCkgKyAweDgwMCkKLSNlbHNlCi0jZGVmaW5lIE5MREVDT01QUkVTU19BUFBMWV9HQUlOKHMsZykgKCgoaW50MzJfdCkocykgKiAoaW50MzJfdCkoZykpID4+IDE2KQotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GRUFUVVJFX0RBQwotI2RlZmluZSBOTERFQ09NUFJFU1NfUFJFUFJPQ0VTU19QQ01fU0FNUExFX1dJVEhfR0FJTihzLGcpIE5MREVDT01QUkVTU19BUFBMWV9HQUlOX0NPTlZFUlRFRF9EQUMoKHMpLChnKSkKLSNkZWZpbmUgTkxERUNPTVBSRVNTX1BSRVBST0NFU1NfU0FNUExFX1dJVEhfR0FJTihzLGcpICgoaW50MTZfdClOTERFQ09NUFJFU1NfQVBQTFlfR0FJTigocyksKGcpKSkKLSNlbHNlCi0jZGVmaW5lIE5MREVDT01QUkVTU19QUkVQUk9DRVNTX1BDTV9TQU1QTEVfV0lUSF9HQUlOIE5MREVDT01QUkVTU19QUkVQUk9DRVNTX1NBTVBMRV9XSVRIX0dBSU4KLSNkZWZpbmUgTkxERUNPTVBSRVNTX1BSRVBST0NFU1NfU0FNUExFX1dJVEhfR0FJTihzLGcpICgoaW50MTZfdCkoTkxERUNPTVBSRVNTX0FQUExZX0dBSU4oKHMpLChnKSkpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgczsKLSAgICBpbnQgc3A7Ci0gICAgaW50IHN6OwotICAgIGludCByWzNdOwotICAgIGludCBhWzNdOwotICAgIGludCBhcFszXTsKLSAgICBpbnQgcFszXTsKLSAgICBpbnQgZFs3XTsKLSAgICBpbnQgYls3XTsKLSAgICBpbnQgYnBbN107Ci0gICAgaW50IG5iOwotICAgIGludCBkZXQ7Ci19IGc3MjJfYmFuZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qISBUUlVFIGlmIHRoZSBvcGVyYXRpbmcgaW4gdGhlIHNwZWNpYWwgSVRVIHRlc3QgbW9kZSwgd2l0aCB0aGUgYmFuZCBzcGxpdCBmaWx0ZXJzCi0gICAgICAgICAgICAgZGlzYWJsZWQuICovCi0gICAgaW50IGl0dV90ZXN0X21vZGU7Ci0gICAgLyohIFRSVUUgaWYgdGhlIEcuNzIyIGRhdGEgaXMgcGFja2VkICovCi0gICAgaW50IHBhY2tlZDsKLSAgICAvKiEgVFJVRSBpZiBlbmNvZGUgZnJvbSA4ayBzYW1wbGVzL3NlY29uZCAqLwotICAgIGludCBlaWdodF9rOwotICAgIC8qISA2IGZvciA0ODAwMGticHMsIDcgZm9yIDU2MDAwa2Jwcywgb3IgOCBmb3IgNjQwMDBrYnBzLiAqLwotICAgIGludCBiaXRzX3Blcl9zYW1wbGU7Ci0KLSAgICAvKiEgU2lnbmFsIGhpc3RvcnkgZm9yIHRoZSBRTUYgKi8KLSAgICBpbnQgeFsyNF07Ci0KLSAgICBnNzIyX2JhbmRfdCBiYW5kWzJdOwotCi0gICAgdW5zaWduZWQgaW50IGluX2J1ZmZlcjsKLSAgICBpbnQgaW5fYml0czsKLSAgICB1bnNpZ25lZCBpbnQgb3V0X2J1ZmZlcjsKLSAgICBpbnQgb3V0X2JpdHM7Ci19IGc3MjJfZW5jb2RlX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyohIFRSVUUgaWYgdGhlIG9wZXJhdGluZyBpbiB0aGUgc3BlY2lhbCBJVFUgdGVzdCBtb2RlLCB3aXRoIHRoZSBiYW5kIHNwbGl0IGZpbHRlcnMKLSAgICAgICAgICAgICBkaXNhYmxlZC4gKi8KLSAgICBpbnQgaXR1X3Rlc3RfbW9kZTsKLSAgICAvKiEgVFJVRSBpZiB0aGUgRy43MjIgZGF0YSBpcyBwYWNrZWQgKi8KLSAgICBpbnQgcGFja2VkOwotICAgIC8qISBUUlVFIGlmIGRlY29kZSB0byA4ayBzYW1wbGVzL3NlY29uZCAqLwotICAgIGludCBlaWdodF9rOwotICAgIC8qISA2IGZvciA0ODAwMGticHMsIDcgZm9yIDU2MDAwa2Jwcywgb3IgOCBmb3IgNjQwMDBrYnBzLiAqLwotICAgIGludCBiaXRzX3Blcl9zYW1wbGU7Ci0gICAgLyohIFRSVUUgaWYgb2Zmc2V0IGJpbmFyeSBmb3IgYSAxMi1iaXQgREFDICovCi0gICAgaW50IGRhY19wY207Ci0KLSAgICAvKiEgU2lnbmFsIGhpc3RvcnkgZm9yIHRoZSBRTUYgKi8KLSAgICBpbnQgeFsyNF07Ci0KLSAgICBnNzIyX2JhbmRfdCBiYW5kWzJdOwotICAgIAotICAgIHVuc2lnbmVkIGludCBpbl9idWZmZXI7Ci0gICAgaW50IGluX2JpdHM7Ci0gICAgdW5zaWduZWQgaW50IG91dF9idWZmZXI7Ci0gICAgaW50IG91dF9iaXRzOwotfSBnNzIyX2RlY29kZV9zdGF0ZV90OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLWc3MjJfZW5jb2RlX3N0YXRlX3QgKmc3MjJfZW5jb2RlX2luaXQoZzcyMl9lbmNvZGVfc3RhdGVfdCAqcywgdW5zaWduZWQgaW50IHJhdGUsIGludCBvcHRpb25zKTsKLWludCBnNzIyX2VuY29kZV9yZWxlYXNlKGc3MjJfZW5jb2RlX3N0YXRlX3QgKnMpOwotaW50IGc3MjJfZW5jb2RlKGc3MjJfZW5jb2RlX3N0YXRlX3QgKnMsIHVpbnQ4X3QgZzcyMl9kYXRhW10sIGNvbnN0IGludDE2X3QgYW1wW10sIGludCBsZW4pOwotCi1nNzIyX2RlY29kZV9zdGF0ZV90ICpnNzIyX2RlY29kZV9pbml0KGc3MjJfZGVjb2RlX3N0YXRlX3QgKnMsIHVuc2lnbmVkIGludCByYXRlLCBpbnQgb3B0aW9ucyk7Ci1pbnQgZzcyMl9kZWNvZGVfcmVsZWFzZShnNzIyX2RlY29kZV9zdGF0ZV90ICpzKTsKLXVpbnQzMl90IGc3MjJfZGVjb2RlKGc3MjJfZGVjb2RlX3N0YXRlX3QgKnMsIGludDE2X3QgYW1wW10sIGNvbnN0IHVpbnQ4X3QgZzcyMl9kYXRhW10sIGludCBsZW4sIHVpbnQxNl90IGFHYWluKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lbWJkcnYvZzcyMi9nNzIyX2VuY29kZS5jYyBiL2VtYmRydi9nNzIyL2c3MjJfZW5jb2RlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTdmNWMwLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9nNzIyL2c3MjJfZW5jb2RlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qCi0gKiBTcGFuRFNQIC0gYSBzZXJpZXMgb2YgRFNQIGNvbXBvbmVudHMgZm9yIHRlbGVwaG9ueQotICoKLSAqIGc3MjJfZW5jb2RlLmMgLSBUaGUgSVRVIEcuNzIyIGNvZGVjLCBlbmNvZGUgcGFydC4KLSAqCi0gKiBXcml0dGVuIGJ5IFN0ZXZlIFVuZGVyd29vZCA8c3RldmV1QGNvcHBpY2Uub3JnPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBTdGV2ZSBVbmRlcndvb2QKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBEZXNwaXRlIG15IGdlbmVyYWwgbGlraW5nIG9mIHRoZSBHUEwsIEkgcGxhY2UgbXkgb3duIGNvbnRyaWJ1dGlvbnMgCi0gKiAgdG8gdGhpcyBjb2RlIGluIHRoZSBwdWJsaWMgZG9tYWluIGZvciB0aGUgYmVuZWZpdCBvZiBhbGwgbWFua2luZCAtCi0gKiAgZXZlbiB0aGUgc2xpbXkgb25lcyB3aG8gbWlnaHQgdHJ5IHRvIHByb3ByaWV0aXplIG15IHdvcmsgYW5kIHVzZSBpdAotICogIHRvIG15IGRldHJpbWVudC4KLSAqCi0gKiBCYXNlZCBvbiBhIHNpbmdsZSBjaGFubmVsIDY0a2JwcyBvbmx5IEcuNzIyIGNvZGVjIHdoaWNoIGlzOgotICoKLSAqKioqKiAgICBDb3B5cmlnaHQgKGMpIENNVSAgICAxOTkzICAgICAgKioqKioKLSAqIENvbXB1dGVyIFNjaWVuY2UsIFNwZWVjaCBHcm91cAotICogQ2hlbmd4aWFuZyBMdSBhbmQgQWxleCBIYXVwdG1hbm4KLSAqCi0gKiAkSWQ6IGc3MjJfZW5jb2RlLmMsdiAxLjE0IDIwMDYvMDcvMDcgMTY6Mzc6NDkgc3RldmV1IEV4cCAkCi0gKi8KLQotLyohIFxmaWxlICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiZzcyMl90eXBlZGVmcy5oIgotI2luY2x1ZGUgImc3MjJfZW5jX2RlYy5oIgotCi0jaWYgIWRlZmluZWQoRkFMU0UpCi0jZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotI2lmICFkZWZpbmVkKFRSVUUpCi0jZGVmaW5lIFRSVUUgKCFGQUxTRSkKLSNlbmRpZgotCi0jZGVmaW5lIFBBQ0tFRF9PVVRQVVQgICAoMCkKLSNkZWZpbmUgQklUU19QRVJfU0FNUExFICg4KQotCi0jaWZuZGVmIEJVSUxEX0ZFQVRVUkVfRzcyMl9VU0VfSU5UUklOU0lDX1NBVAotc3RhdGljIF9faW5saW5lIGludDE2X3Qgc2F0dXJhdGUoaW50MzJfdCBhbXApCi17Ci0gICAgaW50MTZfdCBhbXAxNjsKLQotICAgIC8qIEhvcGVmdWxseSB0aGlzIGlzIG9wdGltaXNlZCBmb3IgdGhlIGNvbW1vbiBjYXNlIC0gbm90IGNsaXBwaW5nICovCi0gICAgYW1wMTYgPSAoaW50MTZfdCkgYW1wOwotICAgIGlmIChhbXAgPT0gYW1wMTYpCi0gICAgICAgIHJldHVybiBhbXAxNjsKLSAgICBpZiAoYW1wID4gMHg3RkZGKQotICAgICAgICByZXR1cm4gIDB4N0ZGRjsKLSAgICByZXR1cm4gIDB4ODAwMDsKLX0KLSNlbHNlCi1zdGF0aWMgX19pbmxpbmUgaW50MTZfdCBzYXR1cmF0ZShpbnQzMl90IHZhbCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90IHJlczsKLSAgICBfX2FzbSB2b2xhdGlsZSAoCi0gICAgICAgICJTU0FUICUwLCAjMTYsICUxXG5cdCIKLSAgICAgICAgOiI9ciIocmVzKQotICAgICAgICA6InIiKHZhbCkKLSAgICAgICAgOik7Ci0gICAgcmV0dXJuIChpbnQxNl90KXJlczsKLX0KLSNlbmRpZgotLyotIEVuZCBvZiBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIGJsb2NrNChnNzIyX2JhbmRfdCAqYmFuZCwgaW50IGQpCi17Ci0gICAgaW50IHdkMTsKLSAgICBpbnQgd2QyOwotICAgIGludCB3ZDM7Ci0gICAgaW50IGk7Ci0gICAgaW50IHNnWzddOwotICAgIGludCBhcDEsIGFwMjsKLSAgICBpbnQgc2cwLCBzZ2k7Ci0gICAgaW50IHN6OwotCi0gICAgLyogQmxvY2sgNCwgUkVDT05TICovCi0gICAgYmFuZC0+ZFswXSA9IGQ7Ci0gICAgYmFuZC0+clswXSA9IHNhdHVyYXRlKGJhbmQtPnMgKyBkKTsKLQotICAgIC8qIEJsb2NrIDQsIFBBUlJFQyAqLwotICAgIGJhbmQtPnBbMF0gPSBzYXR1cmF0ZShiYW5kLT5zeiArIGQpOwotCi0gICAgLyogQmxvY2sgNCwgVVBQT0wyICovCi0gICAgZm9yIChpID0gMDsgIGkgPCAzOyAgaSsrKQotICAgICAgICBzZ1tpXSA9IGJhbmQtPnBbaV0gPj4gMTU7Ci0gICAgd2QxID0gc2F0dXJhdGUoYmFuZC0+YVsxXSA8PCAyKTsKLQotICAgIHdkMiA9IChzZ1swXSA9PSBzZ1sxXSkgID8gIC13ZDEgIDogIHdkMTsKLSAgICBpZiAod2QyID4gMzI3NjcpCi0gICAgICAgIHdkMiA9IDMyNzY3OwotCi0gICAgYXAyID0gKHdkMiA+PiA3KSArICgoc2dbMF0gPT0gc2dbMl0pICA/ICAxMjggIDogIC0xMjgpOwotICAgIGFwMiArPSAoYmFuZC0+YVsyXSozMjUxMikgPj4gMTU7Ci0gICAgaWYgKGFwMiA+IDEyMjg4KQotICAgICAgICBhcDIgPSAxMjI4ODsKLSAgICBlbHNlIGlmIChhcDIgPCAtMTIyODgpCi0gICAgICAgIGFwMiA9IC0xMjI4ODsKLSAgICBiYW5kLT5hcFsyXSA9IGFwMjsKLQotICAgIC8qIEJsb2NrIDQsIFVQUE9MMSAqLwotICAgIHNnWzBdID0gYmFuZC0+cFswXSA+PiAxNTsKLSAgICBzZ1sxXSA9IGJhbmQtPnBbMV0gPj4gMTU7Ci0gICAgd2QxID0gKHNnWzBdID09IHNnWzFdKSAgPyAgMTkyICA6ICAtMTkyOwotICAgIHdkMiA9IChiYW5kLT5hWzFdKjMyNjQwKSA+PiAxNTsKLQotICAgIGFwMSA9IHNhdHVyYXRlKHdkMSArIHdkMik7Ci0gICAgd2QzID0gc2F0dXJhdGUoMTUzNjAgLSBiYW5kLT5hcFsyXSk7Ci0gICAgaWYgKGFwMSA+IHdkMykKLSAgICAgICAgYXAxID0gd2QzOwotICAgIGVsc2UgaWYgKGFwMSA8IC13ZDMpCi0gICAgICAgIGFwMSA9IC13ZDM7Ci0gICAgYmFuZC0+YXBbMV0gPSBhcDE7Ci0KLSAgICAvKiBCbG9jayA0LCBVUFpFUk8gKi8KLSAgICAvKiBCbG9jayA0LCBGSUxURVogKi8KLSAgICB3ZDEgPSAoZCA9PSAwKSAgPyAgMCAgOiAgMTI4OwotCi0gICAgc2cwID0gc2dbMF0gPSBkID4+IDE1OwotICAgIGZvciAoaSA9IDE7ICBpIDwgNzsgIGkrKykKLSAgICB7Ci0Jc2dpID0gYmFuZC0+ZFtpXSA+PiAxNTsKLQl3ZDIgPSAoc2dpID09IHNnMCkgPyB3ZDEgOiAtd2QxOwotICAgICAgICB3ZDMgPSAoYmFuZC0+YltpXSozMjY0MCkgPj4gMTU7Ci0gICAgICAgIGJhbmQtPmJwW2ldID0gc2F0dXJhdGUod2QyICsgd2QzKTsKLSAgICB9Ci0KLSAgICAvKiBCbG9jayA0LCBERUxBWUEgKi8KLSAgICBzeiA9IDA7Ci0gICAgZm9yIChpID0gNjsgIGkgPiAwOyAgaS0tKQotICAgIHsKLQlpbnQgYmk7Ci0KLSAgICAgICAgYmFuZC0+ZFtpXSA9IGJhbmQtPmRbaSAtIDFdOwotICAgICAgICBiaSA9IGJhbmQtPmJbaV0gPSBiYW5kLT5icFtpXTsKLSAgICAgICAgd2QxID0gc2F0dXJhdGUoYmFuZC0+ZFtpXSArIGJhbmQtPmRbaV0pOwotICAgICAgICBzeiArPSAoYmkqd2QxKSA+PiAxNTsKLSAgICB9Ci0gICAgYmFuZC0+c3ogPSBzejsKLSAgICAKLSAgICBmb3IgKGkgPSAyOyAgaSA+IDA7ICBpLS0pCi0gICAgewotICAgICAgICBiYW5kLT5yW2ldID0gYmFuZC0+cltpIC0gMV07Ci0gICAgICAgIGJhbmQtPnBbaV0gPSBiYW5kLT5wW2kgLSAxXTsKLSAgICAgICAgYmFuZC0+YVtpXSA9IGJhbmQtPmFwW2ldOwotICAgIH0KLQotICAgIC8qIEJsb2NrIDQsIEZJTFRFUCAqLwotICAgIHdkMSA9IHNhdHVyYXRlKGJhbmQtPnJbMV0gKyBiYW5kLT5yWzFdKTsKLSAgICB3ZDEgPSAoYmFuZC0+YVsxXSp3ZDEpID4+IDE1OwotICAgIHdkMiA9IHNhdHVyYXRlKGJhbmQtPnJbMl0gKyBiYW5kLT5yWzJdKTsKLSAgICB3ZDIgPSAoYmFuZC0+YVsyXSp3ZDIpID4+IDE1OwotICAgIGJhbmQtPnNwID0gc2F0dXJhdGUod2QxICsgd2QyKTsKLQotICAgIC8qIEJsb2NrIDQsIFBSRURJQyAqLwotICAgIGJhbmQtPnMgPSBzYXR1cmF0ZShiYW5kLT5zcCArIGJhbmQtPnN6KTsKLX0KLS8qLSBFbmQgb2YgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1nNzIyX2VuY29kZV9zdGF0ZV90ICpnNzIyX2VuY29kZV9pbml0KGc3MjJfZW5jb2RlX3N0YXRlX3QgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmF0ZSwgaW50IG9wdGlvbnMpCi17Ci0gICAgaWYgKHMgPT0gTlVMTCkKLSAgICB7Ci0jaWZkZWYgRzcyMl9TVVBQT1JUX01BTExPQwotICAgICAgICBpZiAoKHMgPSAoZzcyMl9lbmNvZGVfc3RhdGVfdCAqKSBtYWxsb2Moc2l6ZW9mKCpzKSkpID09IE5VTEwpCi0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7Ci0gICAgaWYgKHJhdGUgPT0gNDgwMDApCi0gICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSA9IDY7Ci0gICAgZWxzZSBpZiAocmF0ZSA9PSA1NjAwMCkKLSAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gNzsKLSAgICBlbHNlCi0gICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSA9IDg7Ci0gICAgcy0+YmFuZFswXS5kZXQgPSAzMjsKLSAgICBzLT5iYW5kWzFdLmRldCA9IDg7Ci0gICAgcmV0dXJuIHM7Ci19Ci0vKi0gRW5kIG9mIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50IGc3MjJfZW5jb2RlX3JlbGVhc2UoZzcyMl9lbmNvZGVfc3RhdGVfdCAqcykKLXsKLSAgICBmcmVlKHMpOwotICAgIHJldHVybiAwOwotfQotLyotIEVuZCBvZiBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFdlYlJ0YywgdGxlZ3JhbmQ6Ci0gKiBPbmx5IGRlZmluZSB0aGUgZm9sbG93aW5nIGlmIGJpdC1leGFjdG5lc3Mgd2l0aCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24KLSAqIGlzIG5lZWRlZC4gV2lsbCBvbmx5IGhhdmUgYW55IGVmZmVjdCBpZiBpbnB1dCBzaWduYWwgaXMgc2F0dXJhdGVkLgotICovCi0vLyNkZWZpbmUgUlVOX0xJS0VfUkVGRVJFTkNFX0c3MjIKLSNpZmRlZiBSVU5fTElLRV9SRUZFUkVOQ0VfRzcyMgotaW50MTZfdCBsaW1pdFZhbHVlcyAoaW50MTZfdCBybCkKLXsKLQotICAgIGludDE2X3QgeWw7Ci0KLSAgICB5bCA9IChybCA+IDE2MzgzKSA/IDE2MzgzIDogKChybCA8IC0xNjM4NCkgPyAtMTYzODQgOiBybCk7Ci0KLSAgICByZXR1cm4gKHlsKTsKLX0KLS8qLSBFbmQgb2YgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2VuZGlmCi0KLXN0YXRpYyBpbnQxNl90IHE2WzMyXSA9Ci17Ci0gICAgICAgMCwgICAzNSwgICA3MiwgIDExMCwgIDE1MCwgIDE5MCwgIDIzMywgIDI3NiwKLSAgICAgMzIzLCAgMzcwLCAgNDIyLCAgNDczLCAgNTMwLCAgNTg3LCAgNjUwLCAgNzE0LAotICAgICA3ODYsICA4NTgsICA5NDAsIDEwMjMsIDExMjEsIDEyMTksIDEzMzksIDE0NTgsCi0gICAgMTYxMiwgMTc2NSwgMTk4MCwgMjE5NSwgMjU1NywgMjkxOSwgICAgMCwgICAgMAotfTsKLXN0YXRpYyBpbnQxNl90IGlsblszMl0gPQotewotICAgICAwLCA2MywgNjIsIDMxLCAzMCwgMjksIDI4LCAyNywKLSAgICAyNiwgMjUsIDI0LCAyMywgMjIsIDIxLCAyMCwgMTksCi0gICAgMTgsIDE3LCAxNiwgMTUsIDE0LCAxMywgMTIsIDExLAotICAgIDEwLCAgOSwgIDgsICA3LCAgNiwgIDUsICA0LCAgMAotfTsKLXN0YXRpYyBpbnQxNl90IGlscFszMl0gPQotewotICAgICAwLCA2MSwgNjAsIDU5LCA1OCwgNTcsIDU2LCA1NSwKLSAgICA1NCwgNTMsIDUyLCA1MSwgNTAsIDQ5LCA0OCwgNDcsCi0gICAgNDYsIDQ1LCA0NCwgNDMsIDQyLCA0MSwgNDAsIDM5LAotICAgIDM4LCAzNywgMzYsIDM1LCAzNCwgMzMsIDMyLCAgMAotfTsKLXN0YXRpYyBpbnQxNl90IHdsWzhdID0KLXsKLSAgICAtNjAsIC0zMCwgNTgsIDE3MiwgMzM0LCA1MzgsIDExOTgsIDMwNDIKLX07Ci1zdGF0aWMgaW50MTZfdCBybDQyWzE2XSA9Ci17Ci0gICAgMCwgNywgNiwgNSwgNCwgMywgMiwgMSwgNywgNiwgNSwgNCwgMywgMiwgMSwgMAotfTsKLXN0YXRpYyBpbnQxNl90IGlsYlszMl0gPQotewotICAgIDIwNDgsIDIwOTMsIDIxMzksIDIxODYsIDIyMzMsIDIyODIsIDIzMzIsCi0gICAgMjM4MywgMjQzNSwgMjQ4OSwgMjU0MywgMjU5OSwgMjY1NiwgMjcxNCwKLSAgICAyNzc0LCAyODM0LCAyODk2LCAyOTYwLCAzMDI1LCAzMDkxLCAzMTU4LAotICAgIDMyMjgsIDMyOTgsIDMzNzEsIDM0NDQsIDM1MjAsIDM1OTcsIDM2NzYsCi0gICAgMzc1NiwgMzgzOCwgMzkyMiwgNDAwOAotfTsKLXN0YXRpYyBpbnQxNl90IHFtNFsxNl0gPQotewotICAgICAgICAgMCwgLTIwNDU2LCAtMTI4OTYsIC04OTY4LAotICAgICAtNjI4OCwgIC00MjQwLCAgLTI1ODQsIC0xMjAwLAotICAgICAyMDQ1NiwgIDEyODk2LCAgIDg5NjgsICA2Mjg4LAotICAgICAgNDI0MCwgICAyNTg0LCAgIDEyMDAsICAgICAwCi19Owotc3RhdGljIGludDE2X3QgcW0yWzRdID0KLXsKLSAgICAtNzQwOCwgIC0xNjE2LCAgIDc0MDgsICAgMTYxNgotfTsKLXN0YXRpYyBpbnQxNl90IHFtZl9jb2VmZnNbMTJdID0KLXsKLSAgICAgICAzLCAgLTExLCAgIDEyLCAgIDMyLCAtMjEwLCAgOTUxLCAzODc2LCAtODA1LCAgMzYyLCAtMTU2LCAgIDUzLCAgLTExLAotfTsKLXN0YXRpYyBpbnQxNl90IGloblszXSA9IHswLCAxLCAwfTsKLXN0YXRpYyBpbnQxNl90IGlocFszXSA9IHswLCAzLCAyfTsKLXN0YXRpYyBpbnQxNl90IHdoWzNdID0gezAsIC0yMTQsIDc5OH07Ci1zdGF0aWMgaW50MTZfdCByaDJbNF0gPSB7MiwgMSwgMiwgMX07Ci0KLWludCBnNzIyX2VuY29kZShnNzIyX2VuY29kZV9zdGF0ZV90ICpzLCB1aW50OF90IGc3MjJfZGF0YVtdLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGFtcFtdLCBpbnQgbGVuKQotewotICAgIGludCBkbG93OwotICAgIGludCBkaGlnaDsKLSAgICBpbnQgZWw7Ci0gICAgaW50IHdkOwotICAgIGludCB3ZDE7Ci0gICAgaW50IHJpbDsKLSAgICBpbnQgd2QyOwotICAgIGludCBpbDQ7Ci0gICAgaW50IGloMjsKLSAgICBpbnQgd2QzOwotICAgIGludCBlaDsKLSAgICBpbnQgbWloOwotICAgIGludCBpOwotICAgIGludCBqOwotICAgIC8qIExvdyBhbmQgaGlnaCBiYW5kIFBDTSBmcm9tIHRoZSBRTUYgKi8KLSAgICBpbnQgeGxvdzsKLSAgICBpbnQgeGhpZ2g7Ci0gICAgaW50IGc3MjJfYnl0ZXM7Ci0gICAgLyogRXZlbiBhbmQgb2RkIHRhcCBhY2N1bXVsYXRvcnMgKi8KLSAgICBpbnQgc3VtZXZlbjsKLSAgICBpbnQgc3Vtb2RkOwotICAgIGludCBpaGlnaDsKLSAgICBpbnQgaWxvdzsKLSAgICBpbnQgY29kZTsKLQotICAgIGc3MjJfYnl0ZXMgPSAwOwotICAgIHhoaWdoID0gMDsKLSAgICBmb3IgKGogPSAwOyAgaiA8IGxlbjsgICkKLSAgICB7Ci0gICAgICAgIGlmIChzLT5pdHVfdGVzdF9tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICB4bG93ID0KLSAgICAgICAgICAgIHhoaWdoID0gYW1wW2orK10gPj4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBBcHBseSB0aGUgdHJhbnNtaXQgUU1GICovCi0gICAgICAgICAgICAgICAgLyogU2h1ZmZsZSB0aGUgYnVmZmVyIGRvd24gKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IDIyOyAgaSsrKQotICAgICAgICAgICAgICAgICAgICBzLT54W2ldID0gcy0+eFtpICsgMl07Ci0gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiBsZW4gaXMgb2RkLCB0aGVuIHRoaXMgY2FuIGJlIGEgYnVmZmVyIG92ZXJydW4KLSAgICAgICAgICAgICAgICBzLT54WzIyXSA9IGFtcFtqKytdOwotICAgICAgICAgICAgICAgIHMtPnhbMjNdID0gYW1wW2orK107Ci0gICAgCi0gICAgICAgICAgICAgICAgLyogRGlzY2FyZCBldmVyeSBvdGhlciBRTUYgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgc3VtZXZlbiA9IDA7Ci0gICAgICAgICAgICAgICAgc3Vtb2RkID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IDEyOyAgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3Vtb2RkICs9IHMtPnhbMippXSpxbWZfY29lZmZzW2ldOwotICAgICAgICAgICAgICAgICAgICBzdW1ldmVuICs9IHMtPnhbMippICsgMV0qcW1mX2NvZWZmc1sxMSAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBXZSBzaGlmdCBieSAxMiB0byBhbGxvdyBmb3IgdGhlIFFNRiBmaWx0ZXJzIChEQyBnYWluID0gNDA5NiksIHBsdXMgMQotICAgICAgICAgICAgICAgICAgIHRvIGFsbG93IGZvciB1cyBzdW1taW5nIHR3byBmaWx0ZXJzLCBwbHVzIDEgdG8gYWxsb3cgZm9yIHRoZSAxNSBiaXQKLSAgICAgICAgICAgICAgICAgICBpbnB1dCB0byB0aGUgRy43MjIgYWxnb3JpdGhtLiAqLwotICAgICAgICAgICAgICAgIHhsb3cgPSAoc3VtZXZlbiArIHN1bW9kZCkgPj4gMTQ7Ci0gICAgICAgICAgICAgICAgeGhpZ2ggPSAoc3VtZXZlbiAtIHN1bW9kZCkgPj4gMTQ7Ci0KLSNpZmRlZiBSVU5fTElLRV9SRUZFUkVOQ0VfRzcyMgotICAgICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIG9ubHkgdXNlZCB0byB2ZXJpZnkgYml0LWV4YWN0bmVzcwotICAgICAgICAgICAgICAgICAqIHdpdGggcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIEcuNzIyLiBIaWdoZXIgcHJlY2lzaW9uCi0gICAgICAgICAgICAgICAgICogaXMgYWNoaWV2ZWQgd2l0aG91dCBsaW1pdGluZyB0aGUgdmFsdWVzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHhsb3cgPSBsaW1pdFZhbHVlcyh4bG93KTsKLSAgICAgICAgICAgICAgICB4aGlnaCA9IGxpbWl0VmFsdWVzKHhoaWdoKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEJsb2NrIDFMLCBTVUJUUkEgKi8KLSAgICAgICAgZWwgPSBzYXR1cmF0ZSh4bG93IC0gcy0+YmFuZFswXS5zKTsKLQotICAgICAgICAvKiBCbG9jayAxTCwgUVVBTlRMICovCi0gICAgICAgIHdkID0gKGVsID49IDApICA/ICBlbCAgOiAgLShlbCArIDEpOwotCi0gICAgICAgIGZvciAoaSA9IDE7ICBpIDwgMzA7ICBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdkMSA9IChxNltpXSpzLT5iYW5kWzBdLmRldCkgPj4gMTI7Ci0gICAgICAgICAgICBpZiAod2QgPCB3ZDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWxvdyA9IChlbCA8IDApICA/ICBpbG5baV0gIDogIGlscFtpXTsKLQotICAgICAgICAvKiBCbG9jayAyTCwgSU5WUUFMICovCi0gICAgICAgIHJpbCA9IGlsb3cgPj4gMjsKLSAgICAgICAgd2QyID0gcW00W3JpbF07Ci0gICAgICAgIGRsb3cgPSAocy0+YmFuZFswXS5kZXQqd2QyKSA+PiAxNTsKLQotICAgICAgICAvKiBCbG9jayAzTCwgTE9HU0NMICovCi0gICAgICAgIGlsNCA9IHJsNDJbcmlsXTsKLSAgICAgICAgd2QgPSAocy0+YmFuZFswXS5uYioxMjcpID4+IDc7Ci0gICAgICAgIHMtPmJhbmRbMF0ubmIgPSB3ZCArIHdsW2lsNF07Ci0gICAgICAgIGlmIChzLT5iYW5kWzBdLm5iIDwgMCkKLSAgICAgICAgICAgIHMtPmJhbmRbMF0ubmIgPSAwOwotICAgICAgICBlbHNlIGlmIChzLT5iYW5kWzBdLm5iID4gMTg0MzIpCi0gICAgICAgICAgICBzLT5iYW5kWzBdLm5iID0gMTg0MzI7Ci0KLSAgICAgICAgLyogQmxvY2sgM0wsIFNDQUxFTCAqLwotICAgICAgICB3ZDEgPSAocy0+YmFuZFswXS5uYiA+PiA2KSAmIDMxOwotICAgICAgICB3ZDIgPSA4IC0gKHMtPmJhbmRbMF0ubmIgPj4gMTEpOwotICAgICAgICB3ZDMgPSAod2QyIDwgMCkgID8gIChpbGJbd2QxXSA8PCAtd2QyKSAgOiAgKGlsYlt3ZDFdID4+IHdkMik7Ci0gICAgICAgIHMtPmJhbmRbMF0uZGV0ID0gd2QzIDw8IDI7Ci0KLSAgICAgICAgYmxvY2s0KCZzLT5iYW5kWzBdLCBkbG93KTsKLSAgICAgICAgewotCSAgICBpbnQgbmI7Ci0KLSAgICAgICAgICAgIC8qIEJsb2NrIDFILCBTVUJUUkEgKi8KLSAgICAgICAgICAgIGVoID0gc2F0dXJhdGUoeGhpZ2ggLSBzLT5iYW5kWzFdLnMpOwotCi0gICAgICAgICAgICAvKiBCbG9jayAxSCwgUVVBTlRIICovCi0gICAgICAgICAgICB3ZCA9IChlaCA+PSAwKSAgPyAgZWggIDogIC0oZWggKyAxKTsKLSAgICAgICAgICAgIHdkMSA9ICg1NjQqcy0+YmFuZFsxXS5kZXQpID4+IDEyOwotICAgICAgICAgICAgbWloID0gKHdkID49IHdkMSkgID8gIDIgIDogIDE7Ci0gICAgICAgICAgICBpaGlnaCA9IChlaCA8IDApICA/ICBpaG5bbWloXSAgOiAgaWhwW21paF07Ci0KLSAgICAgICAgICAgIC8qIEJsb2NrIDJILCBJTlZRQUggKi8KLSAgICAgICAgICAgIHdkMiA9IHFtMltpaGlnaF07Ci0gICAgICAgICAgICBkaGlnaCA9IChzLT5iYW5kWzFdLmRldCp3ZDIpID4+IDE1OwotCi0gICAgICAgICAgICAvKiBCbG9jayAzSCwgTE9HU0NIICovCi0gICAgICAgICAgICBpaDIgPSByaDJbaWhpZ2hdOwotICAgICAgICAgICAgd2QgPSAocy0+YmFuZFsxXS5uYioxMjcpID4+IDc7Ci0KLSAgICAgICAgICAgIG5iID0gd2QgKyB3aFtpaDJdOwotICAgICAgICAgICAgaWYgKG5iIDwgMCkKLSAgICAgICAgICAgICAgICBuYiA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYiA+IDIyNTI4KQotICAgICAgICAgICAgICAgIG5iID0gMjI1Mjg7Ci0JICAgIHMtPmJhbmRbMV0ubmIgPSBuYjsKLQotICAgICAgICAgICAgLyogQmxvY2sgM0gsIFNDQUxFSCAqLwotICAgICAgICAgICAgd2QxID0gKHMtPmJhbmRbMV0ubmIgPj4gNikgJiAzMTsKLSAgICAgICAgICAgIHdkMiA9IDEwIC0gKHMtPmJhbmRbMV0ubmIgPj4gMTEpOwotICAgICAgICAgICAgd2QzID0gKHdkMiA8IDApICA/ICAoaWxiW3dkMV0gPDwgLXdkMikgIDogIChpbGJbd2QxXSA+PiB3ZDIpOwotICAgICAgICAgICAgcy0+YmFuZFsxXS5kZXQgPSB3ZDMgPDwgMjsKLQotICAgICAgICAgICAgYmxvY2s0KCZzLT5iYW5kWzFdLCBkaGlnaCk7Ci0jaWYgICBCSVRTX1BFUl9TQU1QTEUgPT0gOAotICAgICAgICAgICAgY29kZSA9ICgoaWhpZ2ggPDwgNikgfCBpbG93KTsKLSNlbGlmIEJJVFNfUEVSX1NBTVBMRSA9PSA3Ci0gICAgICAgICAgICBjb2RlID0gKChpaGlnaCA8PCA2KSB8IGlsb3cpID4+IDE7Ci0jZWxpZiBCSVRTX1BFUl9TQU1QTEUgPT0gNgotICAgICAgICAgICAgY29kZSA9ICgoaWhpZ2ggPDwgNikgfCBpbG93KSA+PiAyOwotI2VuZGlmCi0gICAgICAgIH0KLQotI2lmIFBBQ0tFRF9PVVRQVVQgPT0gMQotICAgICAgICAgICAgLyogUGFjayB0aGUgY29kZSBiaXRzICovCi0gICAgICAgICAgICBzLT5vdXRfYnVmZmVyIHw9IChjb2RlIDw8IHMtPm91dF9iaXRzKTsKLSAgICAgICAgICAgIHMtPm91dF9iaXRzICs9IHMtPmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgICAgIGlmIChzLT5vdXRfYml0cyA+PSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGc3MjJfZGF0YVtnNzIyX2J5dGVzKytdID0gKHVpbnQ4X3QpIChzLT5vdXRfYnVmZmVyICYgMHhGRik7Ci0gICAgICAgICAgICAgICAgcy0+b3V0X2JpdHMgLT0gODsKLSAgICAgICAgICAgICAgICBzLT5vdXRfYnVmZmVyID4+PSA4OwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIGc3MjJfZGF0YVtnNzIyX2J5dGVzKytdID0gKHVpbnQ4X3QpIGNvZGU7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIGc3MjJfYnl0ZXM7Ci19Ci0vKi0gRW5kIG9mIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLSBFbmQgb2YgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2c3MjIvZzcyMl90eXBlZGVmcy5oIGIvZW1iZHJ2L2c3MjIvZzcyMl90eXBlZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODk3N2ZmLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9nNzIyL2c3MjJfdHlwZWRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoYykgMjAxMiBUaGUgV2ViUlRDIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotICogIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLSAqICBpbiB0aGUgZmlsZSBQQVRFTlRTLiAgQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0gKiAgYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHBsYXRmb3JtLXNwZWNpZmljIHR5cGVkZWZzIGFuZCBkZWZpbmVzLgotLy8gTXVjaCBvZiBpdCBpcyBkZXJpdmVkIGZyb20gQ2hyb21pdW0ncyBidWlsZC9idWlsZF9jb25maWcuaC4KLQotI2lmbmRlZiBXRUJSVENfVFlQRURFRlNfSF8KLSNkZWZpbmUgV0VCUlRDX1RZUEVERUZTX0hfCi0KLS8vIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLiAgRm9yIG1vcmUgaW5mbyBvbiB3aGF0J3MgZGVmaW5lZCwgc2VlOgotLy8gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjAwODRrYXkuYXNweAotLy8gICBodHRwOi8vd3d3LmFnbmVyLm9yZy9vcHRpbWl6ZS9jYWxsaW5nX2NvbnZlbnRpb25zLnBkZgotLy8gICBvciB3aXRoIGdjYywgcnVuOiAiZWNobyB8IGdjYyAtRSAtZE0gLSIKLSNpZiBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotI2RlZmluZSBXRUJSVENfQVJDSF9YODZfRkFNSUxZCi0jZGVmaW5lIFdFQlJUQ19BUkNIX1g4Nl82NAotI2RlZmluZSBXRUJSVENfQVJDSF82NF9CSVRTCi0jZGVmaW5lIFdFQlJUQ19BUkNIX0xJVFRMRV9FTkRJQU4KLSNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCi0jZGVmaW5lIFdFQlJUQ19BUkNIXzY0X0JJVFMKLSNkZWZpbmUgV0VCUlRDX0FSQ0hfTElUVExFX0VORElBTgotI2VsaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQotI2RlZmluZSBXRUJSVENfQVJDSF9YODZfRkFNSUxZCi0jZGVmaW5lIFdFQlJUQ19BUkNIX1g4NgotI2RlZmluZSBXRUJSVENfQVJDSF8zMl9CSVRTCi0jZGVmaW5lIFdFQlJUQ19BUkNIX0xJVFRMRV9FTkRJQU4KLSNlbGlmIGRlZmluZWQoX19BUk1FTF9fKQotLy8gVE9ETyhham0pOiBXZSdkIHByZWZlciB0byBjb250cm9sIHBsYXRmb3JtIGRlZmluZXMgaGVyZSwgYnV0IHRoaXMgaXMKLS8vIGN1cnJlbnRseSBwcm92aWRlZCBieSB0aGUgQW5kcm9pZCBtYWtlZmlsZXMuIENvbW1lbnRlZCB0byBhdm9pZCBkdXBsaWNhdGUKLS8vIGRlZmluaXRpb24gd2FybmluZ3MuCi0vLyNkZWZpbmUgV0VCUlRDX0FSQ0hfQVJNCi0vLyBUT0RPKGFqbSk6IENocm9taXVtIHVzZXMgdGhlIGZvbGxvd2luZyB0d28gZGVmaW5lcy4gU2hvdWxkIHdlIHN3aXRjaD8KLS8vI2RlZmluZSBXRUJSVENfQVJDSF9BUk1fRkFNSUxZCi0vLyNkZWZpbmUgV0VCUlRDX0FSQ0hfQVJNRUwKLSNkZWZpbmUgV0VCUlRDX0FSQ0hfMzJfQklUUwotI2RlZmluZSBXRUJSVENfQVJDSF9MSVRUTEVfRU5ESUFOCi0jZWxpZiBkZWZpbmVkKF9fTUlQU0VMX18pCi0jZGVmaW5lIFdFQlJUQ19BUkNIXzMyX0JJVFMKLSNkZWZpbmUgV0VCUlRDX0FSQ0hfTElUVExFX0VORElBTgotI2VsaWYgZGVmaW5lZChfX3BuYWNsX18pCi0jZGVmaW5lIFdFQlJUQ19BUkNIXzMyX0JJVFMKLSNkZWZpbmUgV0VCUlRDX0FSQ0hfTElUVExFX0VORElBTgotI2Vsc2UKLSNlcnJvciBQbGVhc2UgYWRkIHN1cHBvcnQgZm9yIHlvdXIgYXJjaGl0ZWN0dXJlIGluIHR5cGVkZWZzLmgKLSNlbmRpZgotCi0jaWYgIShkZWZpbmVkKFdFQlJUQ19BUkNIX0xJVFRMRV9FTkRJQU4pIF4gZGVmaW5lZChXRUJSVENfQVJDSF9CSUdfRU5ESUFOKSkKLSNlcnJvciBEZWZpbmUgZWl0aGVyIFdFQlJUQ19BUkNIX0xJVFRMRV9FTkRJQU4gb3IgV0VCUlRDX0FSQ0hfQklHX0VORElBTgotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChXRUJSVENfQVJDSF9YODZfRkFNSUxZKSAmJiAhZGVmaW5lZChfX1NTRTJfXykpIHx8ICBcCi0gICAgKGRlZmluZWQoV0VCUlRDX0FSQ0hfQVJNX1Y3KSAmJiAhZGVmaW5lZChXRUJSVENfQVJDSF9BUk1fTkVPTikpCi0jZGVmaW5lIFdFQlJUQ19DUFVfREVURUNUSU9OCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2Vsc2UKLS8vIERlZmluZSBDOTkgZXF1aXZhbGVudCB0eXBlcywgc2luY2UgcHJlLTIwMTAgTVNWQyBkb2Vzbid0IHByb3ZpZGUgc3RkaW50LmguCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgICAgaW50OF90OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgICAgIGludDE2X3Q7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICAgICAgICAgaW50MzJfdDsKLXR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdWludDY0X3Q7Ci0jZW5kaWYKLQotLy8gQm9ycm93ZWQgZnJvbSBDaHJvbWl1bSdzIGJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaC4KLS8vIEFubm90YXRlIGEgdmlydHVhbCBtZXRob2QgaW5kaWNhdGluZyBpdCBtdXN0IGJlIG92ZXJyaWRpbmcgYSB2aXJ0dWFsCi0vLyBtZXRob2QgaW4gdGhlIHBhcmVudCBjbGFzcy4KLS8vIFVzZSBsaWtlOgotLy8gICB2aXJ0dWFsIHZvaWQgZm9vKCkgT1ZFUlJJREU7Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgT1ZFUlJJREUgb3ZlcnJpZGUKLSNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotLy8gQ2xhbmcgZGVmYXVsdHMgdG8gQysrMDMgYW5kIHdhcm5zIGFib3V0IHVzaW5nIG92ZXJyaWRlLiBTcXVlbGNoIHRoYXQuCi0vLyBJbnRlbnRpb25hbGx5IG5vIHB1c2gvcG9wIGhlcmUgc28gYWxsIHVzZXJzIG9mIE9WRVJSSURFIGlnbm9yZSB0aGUgd2FybmluZwotLy8gdG9vLiBUaGlzIGlzIGxpa2UgcGFzc2luZyAtV25vLWMrKzExLWV4dGVuc2lvbnMsIGV4Y2VwdCB0aGF0IEdDQyB3b24ndCBkaWUKLS8vIChiZWNhdXNlIGl0IHdvbid0IHNlZSB0aGlzIHByYWdtYSkuCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxMS1leHRlbnNpb25zIgotI2RlZmluZSBPVkVSUklERSBvdmVycmlkZQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzICYmIFwKLSAgICAoX19HTlVDX18gKiAxMDAwMCArIF9fR05VQ19NSU5PUl9fICogMTAwKSA+PSA0MDcwMAotLy8gR0NDIDQuNyBzdXBwb3J0cyBleHBsaWNpdCB2aXJ0dWFsIG92ZXJyaWRlcyB3aGVuIEMrKzExIHN1cHBvcnQgaXMgZW5hYmxlZC4KLSNkZWZpbmUgT1ZFUlJJREUgb3ZlcnJpZGUKLSNlbHNlCi0jZGVmaW5lIE9WRVJSSURFCi0jZW5kaWYKLQotLy8gQW5ub3RhdGUgYSBmdW5jdGlvbiBpbmRpY2F0aW5nIHRoZSBjYWxsZXIgbXVzdCBleGFtaW5lIHRoZSByZXR1cm4gdmFsdWUuCi0vLyBVc2UgbGlrZToKLS8vICAgaW50IGZvbygpIFdBUk5fVU5VU0VEX1JFU1VMVDsKLS8vIFRPRE8oYWptKTogSGFjayB0byBhdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9ucyB1bnRpbCB0aGUgYmFzZS8gb2Ygd2VicnRjIGFuZAotLy8gbGliamluZ2xlIGFyZSBtZXJnZWQuCi0jaWYgIWRlZmluZWQoV0FSTl9VTlVTRURfUkVTVUxUKQotI2lmIGRlZmluZWQoX19HTlVDX18pCi0jZGVmaW5lIFdBUk5fVU5VU0VEX1JFU1VMVCBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKQotI2Vsc2UKLSNkZWZpbmUgV0FSTl9VTlVTRURfUkVTVUxUCi0jZW5kaWYKLSNlbmRpZiAgLy8gV0FSTl9VTlVTRURfUkVTVUxUCi0KLSNlbmRpZiAgLy8gV0VCUlRDX1RZUEVERUZTX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0FuZHJvaWQuYnAgYi9lbWJkcnYvbGMzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTMwMmYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJsYzNjb2RlYyIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgYXBleF9hdmFpbGFibGU6IFsKLQotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIgotICAgIF0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJDb21tb24vKi5jcHAiLAotICAgICAgICAiQ29tbW9uL2ZmdC8qLmMiLAotICAgICAgICAiQ29tbW9uL1RhYmxlcy8qLmNwcCIsCi0gICAgICAgICJFbmNvZGVyLyouY3BwIiwKLSAgICAgICAgIkRlY29kZXIvKi5jcHAiLAotICAgICAgICAiVGVzdFN1cHBvcnQvRGF0YXBvaW50c0FuZHJvaWQuY3BwIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV21pc3NpbmctYnJhY2VzIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgICAgICItV25vLSN3YXJuaW5ncyIsCi0gICAgICAgICItV3VuaW5pdGlhbGl6ZWQiLAotICAgICAgICAiLVduby1zZWxmLWFzc2lnbiIsCi0gICAgICAgICItV25vLWltcGxpY2l0LWZhbGx0aHJvdWdoIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHNhbml0aXplOiB7Ci0gICAgICAgICAgICAgICAgbWlzY191bmRlZmluZWQ6WwotICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgICAgICAgICJib3VuZHMiLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICAgICAgfSwKLSAgICAgICB9LAotICAgIH0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJBcGkiLAotICAgICAgICAiQ29tbW9uIiwKLSAgICAgICAgIkNvbW1vbi9mZnQiLAotICAgICAgICAiQ29tbW9uL1RhYmxlcyIsCi0gICAgICAgICJUZXN0U3VwcG9ydCIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gIG5hbWU6ICJsaWJsYzNjb2RlY19lbmNvZGVyX2Z1enplciIsCi0KLSAgc3JjczogWwotICAgICJmdXp6ZXIvbGlibGMzY29kZWNfZW5jb2Rlcl9mdXp6ZXIuY3BwIiwKLSAgXSwKLQotICBzdGF0aWNfbGliczogWwotICAgICJsaWJsYzNjb2RlYyIsCi0gIF0sCi19Ci0KLWNjX2Z1enogewotICBuYW1lOiAibGlibGMzY29kZWNfZGVjb2Rlcl9mdXp6ZXIiLAotCi0gIHNyY3M6IFsKLSAgICAiZnV6emVyL2xpYmxjM2NvZGVjX2RlY29kZXJfZnV6emVyLmNwcCIsCi0gIF0sCi0KLSAgc3RhdGljX2xpYnM6IFsKLSAgICAibGlibGMzY29kZWMiLAotICBdLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQXBpL0xjM0NvbmZpZy5ocHAgYi9lbWJkcnYvbGMzL0FwaS9MYzNDb25maWcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ2OTA1Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQXBpL0xjM0NvbmZpZy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIExjM0NvbmZpZy5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0xDM19DT05GSUdfSFBQXwotI2RlZmluZSBfX0xDM19DT05GSUdfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotLyoKLSAqIFRoZSBMQzMgZW5jb2RlciBhbmQgZGVjb2RlciBoYXZlIGEgY29tbW9uIHNldCBvZiBlc3NlbnRpYWwgc2Vzc2lvbgotICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIC0gc2VlIExDMyBzcGVjaWZpY2F0aW9uIFNlY3Rpb25zIDIuMiAiRW5jb2RlcgotICogaW50ZXJmYWNlcyIgYW5kIFNlY3Rpb24gMi40ICJEZWNvZGVyIGludGVyZmFjZXMiIChkcjA5cjA3KS4gVGhlIHNldCBvZiBjb21tb24KLSAqIHNlc3Npb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGluc3RhbmNlIG9mIGNsYXNzCi0gKiBMYzNDb25maWcuCi0gKgotICogTGMzQ29uZmlnIGlzIGRlc2lnbmVkIHN1Y2ggdGhhdCBhbGwgcGFyYW1ldGVycyBuZWVkIHRvIGJlCi0gKiBwcm92aWRpbmcgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gaW5zdGFuY2UuIEFmdGVyd2FyZHMsIHN1Y2Nlc3Mgb2YgY3JlYXRpb24sCi0gKiB0aGUgYWN0dWFsIHBhcmFtZXRlciB2YWx1ZXMsIGFuZCBkZXJpdmVkIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHByb3ZpZGVkCi0gKiBieSBjb3JyZXNwb25kaW5nIGNvbnN0IGdldHRlciBtZXRob2RzIG9yIHB1YmxpYyBjb25zdCBmaWVsZHMuCi0gKgotICogV2hlbiBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgY2hhbmdlcywgYSBuZXcgaW5zdGFuY2Ugb2YgTGMzQ29uZmlnIGhhcyB0byBiZQotICogY3JlYXRlZC4KLSAqCi0gKiBJbnN0YW5jZXMgb2YgTGMzQ29uZmlnIGFyZSBwcm92aWRlZCB0byBpbnN0YW5jZXMgb2YgTGMzRW5jb2RlciBhbmQgTGMzRGVjb2RlcgotICogd2hlbiBjb25zdHJ1Y3RpbmcgdGhlbS4KLSAqCi0gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIExjM0NvbmZpZyBpcyB0byB2ZXJpZnkgYW5kIGhhbmRsZSBjb21tb24gTEMzIHNlc3Npb24KLSAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhIGNvbnNpc3RlbnQgd2F5LgotICoKLSAqLwotY2xhc3MgTGMzQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIC8qCi0gICAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBmcmFtZSBkdXJhdGlvbnMgTl9tcyA9IDcuNW1zIGFuZCBOX21zID0gMTBtcy4KLSAgICoKLSAgICogTm90ZTogYWx0aG91Z2ggdGhlIExDMyBzcGVjaWZpY2F0aW9uIGRlc2NyaWJlcyBmcmFtZSBkdXJhdGlvbiBOX21zIGFzCi0gICAqICAgICAgIGEgcGFyYW1ldGVyIHdpdGggZmxvYXRpbmcgcG9pbnQgdmFsdWVzIDcuNSBhbmQgMTAuMCwgd2UgZGVjaWRlZAotICAgKiAgICAgICB0byBtYWtlIHRoaXMgcGFyYW1ldGVyIGEgZGlzY3JldGUgZW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkCi0gICAqICAgICAgIGZyYW1lIGR1cmF0aW9ucy4gVGhlcmUgYXJlIHRvbyBtYW55IGNvZGVjIHBhcnRzIHRoYXQgbmVlZAotICAgKiAgICAgICBzcGVjaWZpY2FsbHkgbGlzdGVkIGNvbnN0YW50cyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyZWQKLSAgICogICAgICAgZnJhbWUgZHVyYXRpb24sIHNvIHRoYXQgaXQgbmV2ZXIgd2lsbCBiZSBwb3NzaWJsZSB0byBjaG9zZSBmcm9tIGEKLSAgICogICAgICAgbGFyZ2VyIHNldCBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgZm9yIE5fbXMuCi0gICAqICAgICAgICAgTWFraW5nIHRoZSBkYXRhIHR5cGUgb2YgTl9tcyBhbiBlbnVtZXJhdGlvbiBzdXBwb3J0cwotICAgKiAgICAgICBzdHJhaWdodCBmb3J3YXJkcyB2ZXJpZmljYXRpb24gdGhhdCBtZWFuaW5nZnVsIHBhcmFtZXRlcnMgYXJlIGdpdmVuLgotICAgKi8KLSAgZW51bSBjbGFzcyBGcmFtZUR1cmF0aW9uIHsgZDEwbXMsIGQ3cDVtcyB9OwotCi0gIC8vIGNvbmZpZ3VyYXRpb24gZXJyb3IgKHNlZSAiZ2V0RXJyb3JTdGF0dXMiKQotICBzdGF0aWMgY29uc3QgdWludDhfdCBFUlJPUl9GUkVFID0gMHgwMDsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgSU5WQUxJRF9TQU1QTElOR19SQVRFID0gMHgwMTsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgSU5WQUxJRF9GUkFNRV9EVVJBVElPTiA9IDB4MDI7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IElOVkFMSURfTlVNQkVSX09GX0NIQU5ORUxTID0gMHgwNDsKLQotICAvKgotICAgKiBDb25zdHJ1Y3RvciBvZiBhbiBpbnN0YW5jZSBvZiBMYzNDb25maWcKLSAgICogUGFyYW1ldGVyczoKLSAgICogICAgIChzZWUgYWxzbyBzZWUgTEMzIHNwZWNpZmljYXRpb24gU2VjdGlvbnMgMi4yICJFbmNvZGVyIGludGVyZmFjZXMiCi0gICAqICAgICAgYW5kIFNlY3Rpb24gMi40ICJEZWNvZGVyIGludGVyZmFjZXMiIChkcjA5cjA3KSApCi0gICAqCi0gICAqICBGc18gOiBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogLT4gZGVmaW5lcyBwdWJsaWMgY29uc3RhbnQgRnMKLSAgICogICAgICAgIFN1cHBvcnRlZCB2YWx1ZXMgYXJlCi0gICAqICAgICAgICAgICA4MDAwIEh6Ci0gICAqICAgICAgICAgIDE2MDAwIEh6Ci0gICAqICAgICAgICAgIDI0MDAwIEh6Ci0gICAqICAgICAgICAgIDMyMDAwIEh6Ci0gICAqICAgICAgICAgIDQ0MTAwIEh6Ci0gICAqICAgICAgICAgIDQ4MDAwIEh6Ci0gICAqCi0gICAqICBOX21zXyA6IEZyYW1lIGR1cmF0aW9uIGdpdmVuIGJ5IHZhbHVlIGZyb20gZW51bWVyYXRpb24gRnJhbWVEdXJhdGlvbiAoc2VlCi0gICAqIGFib3ZlKQotICAgKiAgICAgICAgICAtPiBkZWZpbmVzIHB1YmxpYyBjb25zdGFudCBOX21zCi0gICAqICAgICAgICAgIFN1cHBvcnRlZCB2YWx1ZXMgc2VlIGVudW1lcmF0aW9uIEZyYW1lRHVyYXRpb24uCi0gICAqCi0gICAqICBOY18gOiBOdW1iZXIgb2YgY2hhbm5lbHMgLT4gZGVmaW5lcyBwdWJsaWMgY29uc3RhbnQgTmMKLSAgICogICAgICAgICAgU3VwcG9ydGVkIHZhbHVlcyBhcmUgTmMgPiAwIGFuZCBOYyA8IDI1NiBzdWNoIHRoYXQgZGV2aWNlCi0gICAqIHJlc291cmNlcyBhcmUgbm90IGV4aGF1c3RlZC4gTm90ZXM6Ci0gICAqICAgICAgICAgICAgLSBFeGhhdXN0aW5nIGRldmljZSByZXNvdXJjZXMgY2FuIG1lYW4gdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoCi0gICAqIG1lbW9yeSB0byBpbnN0YW50aWF0ZSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgZW5jb2RlcnMgYW5kL29yIGRlY29kZXJzLAotICAgKiBidXQgYWxzbyB0aGF0IGNvbXB1dGluZyB0aGUgZW5jb2RlcnMgYW5kL29yIGRlY29kZXJzIGluIHJlYWwtdGltZSBpcyBub3QKLSAgICogcG9zc2libGUuCi0gICAqICAgICAgICAgICAgLSBUaGUgcGFyYW1ldGVyIE5fY19tYXggZGVzY3JpYmVkIGluIHRoZSBMQzMgc3BlY2lmY2lhdGlvbiBpcwotICAgKiBub3QgZ2l2ZW4gaGVyZSwgc2luY2UgdGhlcmUgaXMgdG9vIGxpdHRsZSBrbm93bGVkZ2Ugb24gdGhlIHRhcmdldCBkZXZpY2VzCi0gICAqIHdoZXJlIHRoaXMgY29kZSBtYXkgYmUgdXNlZC4KLSAgICoKLSAgICovCi0gIExjM0NvbmZpZyh1aW50MTZfdCBGc18sIEZyYW1lRHVyYXRpb24gTl9tc18sIHVpbnQ4X3QgTmNfKTsKLQotICAvLyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yIHN1cHBvcnRlZAotICBMYzNDb25maWcoKSA9IGRlbGV0ZTsKLQotICAvLyBEZXN0cnVjdG9yCi0gIHZpcnR1YWwgfkxjM0NvbmZpZygpOwotCi0gIC8qCi0gICAqIEdldHRlciAiaXNWYWxpZCIgcHJvdmlkZXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuIGFuCi0gICAqIGluc3RhbmNlIG9mIExjM0NvbmZpZyBjb3VsZCBiZSBjcmVhdGVkIHdpdGhvdXQgZXJyb3IuCi0gICAqLwotICBib29sIGlzVmFsaWQoKSBjb25zdDsKLQotICAvKgotICAgKiBHZXR0ZXIgImdldEVycm9yU3RhdHVzIiBwcm92aWRlcyBkZXRhaWxzIG9uIHRoZSBzdWNjZXNzIG9mIGluc3RhbnRpYXRpbmcKLSAgICogTGMzQ29uZmlnLiBUaGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBhcmUgbGlzdGVkIGFzIGNvbnN0YW50cyBpbiB0aGlzIGNsYXNzCi0gICAqIChzZWUgY29uZmlndXJhdGlvbiBlcnJvciBjb25zdGFudHMgYWJvdmUpCi0gICAqLwotICB1aW50OF90IGdldEVycm9yU3RhdHVzKCkgY29uc3Q7Ci0KLSAgLyoKLSAgICogR2V0dGVyICJnZXRCeXRlQ291bnRGcm9tQml0cmF0ZSIgcHJvdmlkZXMgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4KLSAgICogb25lIGVuY29kZWQgZnJhbWUgb2Ygb25lIGNoYW5uZWwgKHNlZSAibmJ5dGVzIiBhcyBkZXNjcmliZWQgaW4KLSAgICogU2VjdGlvbiAzLjIuNSAiQml0IGJ1ZGdldCBhbmQgYml0cmF0ZSIgKGRyMDlyMDcpICkKLSAgICoKLSAgICogVGhlIG51bWJlciBvZiBieXRlcyAibmJ5dGVzIiB0byB1c2UgZm9yIGVuY29kaW5nIGEgc2luZ2xlIGNoYW5uZWwgaXMgYQotICAgKiByZXF1aXJlZCBleHRlcm5hbCBpbnB1dCB0byBlYWNoIHNpbmdsZSBjaGFubmVsIExDMyBlbmNvZGVyLiBUaGUgc2FtZSBudW1iZXIKLSAgICogb2YgYnl0ZXMgKG5vdyB0byBiZSB1c2VkIGZvciBkZWNvZGluZykgaXMgYWxzbyBhIHJlcXVpcmVkIGV4dGVybmFsIGlucHV0IHRvCi0gICAqIGVhY2ggc2luZ2xlIGNoYW5uZWwgTEMzIGRlY29kZXIuIFRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZQotICAgKiBpbiBvbmUgZnJhbWUgaXMgdGh1cyAibmJpdHMgIDgqbmJ5dGVzIi4gVGhlIGNvZGVjIHdvcmtzIG9uIGEgYnl0ZSBib3VuZGFyeSwKLSAgICogaS5lLiB0aGUgdmFyaWFibGUgIm5ieXRlcyIgc2hhbGwgYmUgYW4gaW50ZWdlciBudW1iZXIuIEEgY2VydGFpbiAiYml0cmF0ZSIKLSAgICogY2FuIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlciBvZiBieXRlcyAibmJ5dGVzIiB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzCi0gICAqIHJvdW5kZWQgdG93YXJkcyB0aGUgbmVhcmVzdCBsb3dlciBpbnRlZ2VyLgotICAgKgotICAgKiBUaGUgYWxnb3JpdGhtIGlzIHZlcmlmaWVkIGZyb20gdGhlIGJpdHJhdGUgY29ycmVzcG9uZGluZyB0bwotICAgKiAgbmJ5dGVzID0gMjAgdXAgdG8gdGhlIGJpdHJhdGUgY29ycmVzcG9uZGluZyB0bwotICAgKiAgbmJ5dGVzID0gNDAwIHBlciBjaGFubmVsIGZvciBhbGwgc2FtcGxpbmcgcmF0ZXMuCi0gICAqIFRoZSBMQzMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IG9yIHJlY29tbWVuZCB3aGF0IGJpdHJhdGUgdG8gdXNlIGZvcgotICAgKiBlbmNvZGluZyBhIGZyYW1lIG9mIGF1ZGlvIHNhbXBsZXMuIFRoaXMgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm9maWxlcyBtYWtpbmcKLSAgICogdXNlIG9mIHRoZSBMQzMuCi0gICAqLwotICB1aW50MTZfdCBnZXRCeXRlQ291bnRGcm9tQml0cmF0ZSgKLSAgICAgIHVpbnQzMl90IGJpdHJhdGUpIGNvbnN0OyAgLy8gbWVhbnQgZm9yIGEgc2luZ2xlIGNoYW5uZWwKLQotICAvKgotICAgKiBHZXR0ZXIgImdldEJpdHJhdGVGcm9tQnl0ZUNvdW50IiBwcm92aWRlcyB0aGUgYml0cmF0ZSBvZiB0aGUgY29kZWMgaW4gYml0cwotICAgKiBwZXIgc2Vjb25kIG9mIG9uZSBjaGFubmVsIChzZWUgU2VjdGlvbiAzLjIuNSAiQml0IGJ1ZGdldCBhbmQgYml0cmF0ZSIKLSAgICogKGRyMS4wcjAzKSApCi0gICAqCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSB1dGlsaXR5IGFuZCBub3QgZGlyZWN0bHkgdXNlZCBieSB0aGUgTEMzCi0gICAqIGltcGxlbWVudGF0aW9uLgotICAgKgotICAgKiBUaGUgYml0cmF0ZSBvZiB0aGUgY29kZWMgaW4gYml0cyBwZXIgc2Vjb25kIGlzCi0gICAqICJiaXRyYXRlID0gY2VpbChuYml0cyAvIGZyYW1lX2R1cmF0aW9uKSA9IGNlaWwobmJpdHMqRnMvTkYpID0KLSAgICogY2VpbCg4Km5ieXRlcypGcy9ORikiLgotICAgKgotICAgKiBUaGUgTEMzIHNwZWNpZmljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBvciByZWNvbW1lbmQgd2hhdCBiaXRyYXRlIHRvIHVzZSBmb3IKLSAgICogZW5jb2RpbmcgYSBmcmFtZSBvZiBhdWRpbyBzYW1wbGVzLiBUaGlzIGlzIHNwZWNpZmllZCBieSB0aGUgcHJvZmlsZXMgbWFraW5nCi0gICAqIHVzZSBvZiB0aGUgTEMzLgotICAgKi8KLSAgdWludDMyX3QgZ2V0Qml0cmF0ZUZyb21CeXRlQ291bnQodWludDE2X3QgbmJ5dGVzKSBjb25zdDsKLQotICAvKgotICAgKiBHZXR0ZXIgImdldEZzY2FsIiBwcm92aWRlcyBhIHV0aWxpdHkgdXNlZCB3aXRoaW4gdGhlIExDMyBpbXBsZW1lbnRhdGlvbgotICAgKiBmb3IgZWFzaWVyIHBhcmFtZXRlciBtYXBwaW5nIHdoZW4gRnMgPT0gNDQxMDAKLSAgICogKHNlZSBTZWN0aW9uIDMuMi4yICJTYW1wbGluZyByYXRlcyIgKGRyMS4wcjAzKSApCi0gICAqLwotICBkb3VibGUgZ2V0RnNjYWwoKSBjb25zdDsKLQotICAvKgotICAgKiBHZXR0ZXIgImdldE5tc1ZhbHVlIiBwcm92aWRlcyBhIHV0aWxpdHkgdXNlZCB3aXRoaW4gdGhlIExDMyBpbXBsZW1lbnRhdGlvbgotICAgKiB0aGF0IGNvbnZlcnRzIEZyYW1lRHVyYXRpb24gTl9tcyBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8gZHVyYXRpb24gdmFsdWVzIGluCi0gICAqIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIGRvdWJsZSBnZXRObXNWYWx1ZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gaW50ZXJuYWwgdXRpbGl0aWVzIHVzZWQgZm9yIHZlcmlmeWluZyB0aGUgZ2l2ZW4gaW5wdXQgcGFyYW1ldGVycyBhbmQKLSAgLy8gY29tcHV0aW5nIGRlcml2ZWQgcGFyYW1ldGVycwotICB1aW50OF90IGdldEZzX2luZCh1aW50MTZfdCBGcyk7Ci0gIHVpbnQxNl90IGdldE5GKHVpbnQxNl90IEZzLCBGcmFtZUR1cmF0aW9uIE5fbXMpOwotICB1aW50MTZfdCBnZXRORSh1aW50MTZfdCBORiwgRnJhbWVEdXJhdGlvbiBOX21zKTsKLQotICAvLyBlcnJvcnMgc3RhdHVzIHNldCBkdXJpbmcgY29uc3RydWN0aW9uIGFuZCByZXR1cm5lZCBieSBnZXRFcnJvclN0YXR1cygpCi0gIHVpbnQ4X3QgZXJyb3JTdGF0dXM7Ci0KLSBwdWJsaWM6Ci0gIC8vIGNvbmZpZ3VyYXRpb24gZGV0YWlscyAtPiBzZWUgYWxzbyBTZWN0aW9uIDMuMS4yICJNYXRoZW1hdGljYWwgc3ltYm9scyIKLSAgLy8gKGRyMDlyMDcpCi0gIGNvbnN0IHVpbnQxNl90IEZzOyAgICAgICAgIC8vIFNhbXBsaW5nIHJhdGUgKGluIEh6KQotICBjb25zdCB1aW50OF90IEZzX2luZDsgICAgICAvLyBTYW1wbGluZyByYXRlIGluZGV4IChzZWUgYWxzbyBTZWN0aW9uIDMuMi4yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJTYW1wbGluZyByYXRlcyIgKGRyMDlyMDcpCi0gIGNvbnN0IEZyYW1lRHVyYXRpb24gTl9tczsgIC8vIEZyYW1lIGR1cmF0aW9uIC0+IHNlZSBMYzNDb25maWcgY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnRhdGlvbiBOb3RlOiB0aGF0IHRoZSBhY3R1YWwgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYXRpb24gaXMgbG9uZ2VyIGJ5IGEgZmFjdG9yIG9mIDQ4MC80NDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgaWYgdGhlIHNhbXBsaW5nIHJhdGUgaXMgNDQxMDAgSHoKLSAgY29uc3QgdWludDE2X3QgTkY7ICAvLyBOdW1iZXIgb2Ygc2FtcGxlcyBwcm9jZXNzZWQgaW4gb25lIGZyYW1lIG9mIG9uZSBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgLy8gKGFsc28ga25vd24gYXMgZnJhbWUgc2l6ZSkKLSAgY29uc3QgdWludDE2X3QKLSAgICAgIE5FOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbmNvZGVkIHNwZWN0cmFsIGxpbmVzIChwZXIgZnJhbWUgYW5kIGNoYW5uZWwpCi0gIGNvbnN0IHVpbnQxNl90IFo7ICAvLyBOdW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiBNRENUIHdpbmRvdwotICBjb25zdCB1aW50OF90IE5jOyAgLy8gTnVtYmVyIG9mIGNoYW5uZWxzCi0gIGNvbnN0IHVpbnQ4X3QgTl9iOyAgLy8gTnVtYmVyIG9mIGJhbmRzCi19OwotCi0jZW5kaWYgIC8vIF9fTEMzX0NPTkZJR19IUFBfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0FwaS9MYzNEZWNvZGVyLmhwcCBiL2VtYmRydi9sYzMvQXBpL0xjM0RlY29kZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM2NGZlLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQXBpL0xjM0RlY29kZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qCi0gKiBMYzNEZWNvZGVyLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFQSV9MQzNERUNPREVSX0hQUF8KLSNkZWZpbmUgQVBJX0xDM0RFQ09ERVJfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJMYzNDb25maWcuaHBwIgotCi0vKgotICogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgImludGVybmFsIiBjbGFzcyBEZWNvZGVyVG9wLCBzbwotICogdGhhdCB0aGUgcHJpdmF0ZSB2ZWN0b3Igb2Ygc2luZ2xlIGNoYW5uZWwgZGVjb2RlcnMgY2FuIGJlIGRlY2xhcmVkIGluCi0gKiBMYzNEZWNvZGVyLgotICovCi1uYW1lc3BhY2UgTGMzRGVjIHsKLWNsYXNzIERlY29kZXJUb3A7Ci19Ci0KLS8qCi0gKiBUaGUgTEMzIGRlY29kZXIgaW50ZXJmYWNlIGlzIHNwZWNpZmllZCBpbgotICogTEMzIHNwZWNpZmljYXRpb24gU2VjdGlvbnMgMi40ICJEZWNvZGVyIGludGVyZmFjZXMiIChkcjA5cjA3KS4KLSAqCi0gKiBMYzNEZWNvZGVyIGlzIGRlc2lnbmVkIHN1Y2ggdGhhdCBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBwcm92aWRlZC4KLSAqCi0gKiBJbiBjb250cmFzdCB0byB0aGUgTGMzRW5jb2RlciwgZXZlbiAyNGJpdCBhbmQgMzJiaXQgZGVjb2RlZCBhdWRpbwotICogZGF0YSBjYW4gYmUgcHJvdmlkZWQgLSBob3dldmVyIGluIG9uZSBmaXggYnl0ZSBhcnJhbmdlbWVudCB3aGljaCB3aWxsCi0gKiBub3QgbWVldCBhbGwgbWVhbmluZ2Z1bCBvcHRpb25zLiBQcm92aWRpbmcgMjRiaXQgYW5kIDMyYml0IGRlY29kZWQgYXVkaW8KLSAqIGRhdGEgbWFrZXMgdGhlIEFQSSBtb3JlIGNvbXBsZXggYnV0IGRvZXMgbm90IGluY3JlYXNlIHRoZSBuZWVkZWQKLSAqIHJlc291cmNlcyB3aGVuIGJhc2ljIDE2Yml0L3NhbXBsZSBhdWRpbyBkYXRhIGlzIGRlc2lyZWQgb25seS4KLSAqCi0gKiBJbnN0YW50aWF0aW5nIExjM0RlY29kZXIgaW1wbGllcyBwcm92aWRpbmcgYSBMYzNDb25maWcgaW5zdGFuY2UuIEEgY29weSBvZgotICogdGhpcyBpbnN0YW5jZSBpcyBhdmFpbGFibGUgYXMgcHVibGljIGNvbnN0IG1lbWJlciBzbyB0aGF0IGFsbCBlc3NlbnRpYWwKLSAqIHNlc3Npb24gcGFyYW1ldGVycyBjYW4gYmUgb2J0YWluZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIExjM0RlY29kZXIKLSAqIGluc3RhbmNlLgotICoKLSAqIFRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIGNoYW5naW5nIExjM0NvbmZpZyB3aXRoaW4gTGMzRGVjb2Rlci4gV2hlbiBzZXNzaW9uCi0gKiBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUgY2hhbmdlZCwgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gaGFzIHRvIGNyZWF0ZSBhIG5ldwotICogaW5zdGFuY2Ugb2YgTGMzRGVjb2Rlci4KLSAqCi0gKiBMYzMgc3VwcG9ydHMgb3BlcmF0aW9uIHdpdGggdmFyaWFibGUgZW5jb2RlZCBiaXRyYXRlLiBJdCBpcyBwb3NzaWJsZSB0bwotICogY2hhbmdlIHRoZSBiaXRyYXRlIGZyb20gZnJhbWUgdG8gZnJhbWUsIHdoZXJlIGZvciBwcmVjaXNlbmVzcyB0aGUgcGFyYW1ldGVyCi0gKiBpcyBub3QgZ2l2ZW4gYXMgYml0cmF0ZSBkaXJlY3RseSBidXQgaW4gdGVybXMgb2YgdGhlIGJ5dGVfY291bnQgcGVyIGZyYW1lLgotICogVGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlIGluIHRoZSByYW5nZSBvZiAyMCB0byA0MDAgKHNlZSBMQzMgc3BlY2lmaWNhdGlvbgotICogU2VjdGlvbiAzLjIuNSAiQml0IGJ1ZGdldCBhbmQgYml0cmF0ZSIpLiBMQzMgc3BlY2lmaWNhdGlvbiBTZWN0aW9ucyAyLjQKLSAqICJEZWNvZGVyIGludGVyZmFjZXMiIHNwZWNpZmllcyAiYnl0ZV9jb3VudF9tYXgiIG9mIHRoZSBkZWNvZGVyIHRvIGFsbG93Ci0gKiBwcmUtYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMuIFRoaXMgcGFyYW1ldGVyIGlzIHByb3ZpZGVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcwotICogYW5kIHVzZWQgZm9yIHZlcmlmeWluZyB0aGUgYnl0ZV9jb3VudCB2YWx1ZSBvZiBpbmRpdmlkdWFsIGZyYW1lcyBvbmx5LiBUaGUKLSAqIG5lZWRlZCBtZW1vcnkgaGFzIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGFueXdheSwgc28gdGhhdAotICogaXQgaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uIHdoZXRoZXIgYSBwcmUtYWxsb2NhdGlvbiBvZiBtZW1vcnkgaXMgdXNlZnVsLgotICoKLSAqLwotCi1jbGFzcyBMYzNEZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIC8qCi0gICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yIG9mIExjM0RlY29kZXIgd2l0aCB0d28gc2ltcGxlIHBhcmFtZXRlciBvbmx5LgotICAgKiBOb3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3RvciBpbnN0YW50aWF0ZWQgTGMzQ29uZmlnIGltcGxpY2l0bHkgd2l0aAotICAgKiAgTGMzRGVjb2RlcihMYzNDb25maWcoRnMsZnJhbWVEdXJhdGlvbiwgMSkpIHRoYXQgbWVhbnMgdGhhdCB0aGlzCi0gICAqIGNvbnN0cnVjdG9yIHByb3ZpZGVzIHByb2Nlc3Npbmcgb2Ygb25lIGNoYW5uZWwgKG1vbm8pIGFuZCAxNmJpdC9zYW1wbGUKLSAgICogUENNIG91dHB1dCBvbmx5LgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAgRnMgOiBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogLT4gc2VlIExjM0NvbmZpZy5ocHAgZm9yIHN1cHBvcnRlZCB2YWx1ZXMKLSAgICoKLSAgICogIGZyYW1lRHVyYXRpb24gOiBmcmFtZSBkdXJhdGlvbiBvZiAxMG1zIChkZWZhdWx0KSBvciA3LjVtcwotICAgKiAgICAgICAgICAgICAgICAgICAgLT4gc2VlIExjM0NvbmZpZy5ocHAgZm9yIG1vcmUgZGV0YWlscwotICAgKi8KLSAgTGMzRGVjb2Rlcih1aW50MTZfdCBGcywgTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uIGZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcyk7Ci0KLSAgLyoKLSAgICogR2VuZXJhbCBjb25zdHJ1Y3RvciBvZiBMYzNEZWNvZGVyLgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAgbGMzQ29uZmlnXyA6IGluc3RhbmNlIG9mIExjM0NvbmZpZy4gU2VlIGRvY3VtZW50YXRpb24gb2YgTGMzQ29uZmlnIGZvcgotICAgKiBtb3JlIGRldGFpbHMuIE5vdGU6IHByb3ZpZGluZyBhbiBpbnZhbGlkIGluc3RhbmNlIG9mIExjM0NvbmZpZyB3aWxsIHJlc3VsdAotICAgKiAgICAgICAgICAgICAgICAgICAgIGluIHNraXBwaW5nIGFueSBwcm9jZXNzaW5nIGxhdGVyLgotICAgKiAgICAgICAgICAgICAgIFRoZSBwcm92aWRlZCBpbnN0YW5jZSBvZiBMYzNDb25maWcgd2lsbCBiZSBjb3BpZWQgdG8gdGhlCi0gICAqICAgICAgICAgICAgICAgcHVibGljIGZpZWxkICJsYzNDb25maWciIChzZWUgYmVsb3cpLgotICAgKgotICAgKiAgYml0c19wZXJfYXVkaW9fc2FtcGxlX2RlY18gOiBCaXRzIHBlciBhdWRpbyBzYW1wbGUgZm9yIHRoZSBvdXRwdXQgUENNCi0gICAqIHNpZ25hbC4gU2VlIExDMyBzcGVjaWZpY2F0aW9uIFNlY3Rpb24gMi40ICJEZWNvZGVyIGludGVyZmFjZXMiIGFuZAotICAgKiBTZWN0aW9uIDMuMi4zICJCaXRzIHBlciBzYW1wbGUiIGZvciB0aGUgZ2VuZXJhbCBMQzMgcmVxdWlyZW1lbnQgdG8gc3VwcG9ydAotICAgKiAxNiwgMjQgYW5kIDMyIGJpdC4gTm90ZTogVGhpcyBwYXJhbWV0ZXIgbWF5IGRpZmZlciBmcm9tIHRoZSBlbmNvZGVyIGlucHV0Ci0gICAqIFBDTSBzZXR0aW5nICJiaXRzX3Blcl9hdWRpb19zYW1wbGVfZW5jIi4KLSAgICoKLSAgICogIGJ5dGVfY291bnRfbWF4X2RlY18gOiBNYXhpbXVtIGFsbG93ZWQgcGF5bG9hZCBieXRlX2NvdW50IGZvciBhIHNpbmdsZQotICAgKiBjaGFubmVsLiBXaGVuIHVzaW5nIGFuZCBhbGxvd2luZyBleHRlcm5hbCByYXRlIGNvbnRyb2wsIHRoZSBtYXhpbXVtIGJ5dGUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCBmb3IgdGhlIHNlc3Npb24gbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZQotICAgKiBzZXNzaW9uIGJ1ZmZlcnMgd2l0aG91dCBhIG5lZWQgdG8gZHluYW1pY2FsbHkgcmVhbGxvY2F0ZSBtZW1vcnkgZHVyaW5nIHRoZQotICAgKiBzZXNzaW9uLgotICAgKgotICAgKiBkYXRhcG9pbnRzIDogcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFsbG93aW5nIHRvIGNvbGxlY3QgaW50ZXJuYWwKLSAgICogZGF0YS4gTm90ZTogdGhpcyBmZWF0dXJlIGlzIHVzZWQgYW5kIHByZXBhcmVkIGZvciB0ZXN0aW5nIG9mIHRoZSBjb2RlYwotICAgKiAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb25seS4gU2VlIGdlbmVyYWwgIlJlYWRtZS50eHQiCi0gICAqLwotICBMYzNEZWNvZGVyKExjM0NvbmZpZyBsYzNDb25maWdfLCB1aW50OF90IGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWNfID0gMTYsCi0gICAgICAgICAgICAgdWludDE2X3QgYnl0ZV9jb3VudF9tYXhfZGVjXyA9IDQwMCwgdm9pZCogZGF0YXBvaW50cyA9IG51bGxwdHIpOwotCi0gIC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3Igc3VwcG9ydGVkCi0gIExjM0RlY29kZXIoKSA9IGRlbGV0ZTsKLQotICAvLyBEZXN0cnVjdG9yCi0gIHZpcnR1YWwgfkxjM0RlY29kZXIoKTsKLQotICAvKgotICAgKiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIGR1cmluZyBpbnN0YW50aWF0aW9uIGFjY2Vzc2libGUgYXMgcHVibGljIGNvbnN0Ci0gICAqIGZpZWxkcy4gTm90ZTogTGMzQ29uZmlnIHByb3ZpZGVzIGEgZ2V0dGVyIHRvIGNoZWNrIHdoZXRoZXIgdGhlCi0gICAqIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQuCi0gICAqLwotICBjb25zdCBMYzNDb25maWcgbGMzQ29uZmlnOwotICBjb25zdCB1aW50OF90IGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWM7Ci0gIGNvbnN0IHVpbnQxNl90IGJ5dGVfY291bnRfbWF4X2RlYzsKLQotICAvLyBlbmNvZGluZyBlcnJvciAoc2VlIHJldHVybiB2YWx1ZXMgb2YgInJ1biIgbWV0aG9kcykKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgRVJST1JfRlJFRSA9IDB4MDA7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IElOVkFMSURfQ09ORklHVVJBVElPTiA9IDB4MDE7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IElOVkFMSURfQllURV9DT1VOVCA9IDB4MDI7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IElOVkFMSURfWF9PVVRfU0laRSA9IDB4MDM7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IElOVkFMSURfQklUU19QRVJfQVVESU9fU0FNUExFID0gMHgwNDsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgREVDT0RFUl9BTExPQ0FUSU9OX0VSUk9SID0gMHgwNTsKLQotICAvKgotICAgKiBEZWNvZGluZyBvbmUgMTYgYml0L3NhbXBsZSBvdXRwdXQgZnJhbWUgZm9yIG9uZSBjaGFubmVsCi0gICAqCi0gICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZHMgcmV0dXJucyB0aGUgZXJyb3IgSU5WQUxJRF9CSVRTX1BFUl9BVURJT19TQU1QTEUKLSAgICogd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBjb25maWd1cmVkIGZvciBhbnkgYml0c19wZXJfYXVkaW9fc2FtcGxlX2RlYwotICAgKiAhPSAxNi4KLSAgICoKLSAgICogRnVydGhlciwgbm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBtdWx0aS1jaGFubmVsIGNvbmZpZ3VyYXRpb25zCi0gICAqIGFzIHdlbGwsIHBhcnRpY3VsYXJseSB3aGVuIHRoZSBwcm92aWRlZCBtdWx0aS1jaGFubmVsICJydW4iIChzZWUgYmVsb3cpIGlzCi0gICAqIG5vdCBzdXBwb3J0aW5nIHRoZSBraW5kIG9mIGJ5dGUgc3RyZWFtIGNvbmNhdGVuYXRpb24gZXhpc3RpbmcgaW4gdGhlCi0gICAqIGNhbGxpbmcgYXBwbGljYXRpb24uCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqICAgYnl0ZXMgOiBwb2ludGVyIHRvIGJ5dGUgYXJyYXkgaG9sZGluZyB0aGUgaW5wdXQgTEMzIGVuY29kZWQgYnl0ZSBzdHJlYW0KLSAgICogICAgICAgICAgIG9mIHRoZSBnaXZlbiBjaGFubmVsLgotICAgKiAgICAgICAgICAgVGhlIHNpemUgb2YgdGhpcyBtZW1vcnkgaXMgZ2l2ZW4gYnkgdGhlIGJ5dGVfY291bnQgcGFyYW1ldGVyLgotICAgKgotICAgKiAgIGJ5dGVfY291bnQgOiBudW1iZXIgb2YgZW5jb2RlZCBieXRlczsgYnl0ZSBjb3VudCB0byBiZSB1c2VkIGZvciBkZWNvZGluZwotICAgKiAgICAgICAgICAgICAgICB0aGUgcmVjZWl2ZWQgZnJhbWUgcGF5bG9hZC4KLSAgICogICAgICAgICAgICAgICAgU3VwcG9ydGVkIHZhbHVlcyBhcmUgMjAgYnl0ZXMgdG8gYnl0ZV9jb3VudF9tYXhfZGVjIGJ5dGVzLgotICAgKgotICAgKiAgIEJGSSA6IEJhZCBGcmFtZSBJbmRpY2F0aW9uIGZsYWdzCi0gICAqICAgICAgICAgIjAiIHNpZ25pZmllcyB0aGF0IG5vIGJpdCBlcnJvcnMgd2hlcmUgZGV0ZWN0ZWQgaW4gZ2l2ZW4gImJ5dGVzIgotICAgKiAgICAgICAgICIxIiBzaWduaWZpZXMgYSBjb3JydXB0IHBheWxvYWQgcGFja2V0IHdhcyBkZXRlY3RlZCBpbiBnaXZlbgotICAgKiAiYnl0ZXMiCi0gICAqCi0gICAqICAgeF9vdXQgOiBwb2ludGVyIHRvIG91dHB1dCBQQ00gZGF0YSAoMTYgYml0L3NhbXBsZSksIHdoZXJlIHRoZSBtZW1vcnkKLSAgICogICAgICAgICAgIGhhcyB0byBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogICB4X291dF9zaXplIDogbnVtYmVyIG9mIDE2IGJpdCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHhfb3V0Ci0gICAqICAgICAgICAgICAgICAgIE5vdGU6IHRoaXMgcGFyYW1ldGVyIGhhcyBiZWVuIGludHJvZHVjZWQgZm9yIGNsYXJpdHkgYW5kCi0gICAqICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBwdXJwb3NlIG9ubHkuIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4KLSAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGVycm9yIElOVkFMSURfWF9PVVRfU0laRSB3aGVuIHhfb3V0X3NpemUgIT0KLSAgICogbGMzQ29uZmlnLk5GLgotICAgKgotICAgKiAgIEJFQ19kZXRlY3QgOiBmbGFnIGluZGljYXRpb24gYml0IGVycm9ycyBkZXRlY3RlZCBkdXJpbmcgZGVjb2Rpbmcgb2YgaW5wdXQKLSAgICogYnl0ZXMgTm90ZTogYSBiYXNpYyBwYWNrZXQgbG9zcyBjb25jZWFsbWVudCAoUExDKSB3aWxsIGJlIGFwcGxpZWQgd2hlbgotICAgKiAgICAgICAgICAgICAgICAgICAgICBCRUNfZGV0ZWN0IT0wLCBzbyB0aGF0IHRoZSByZXR1cm5lZCBhdWRpbyBkYXRhIHN0YXlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgIHNvbWV3aGF0IGFjY2VwdGFibGUuCi0gICAqCi0gICAqICBjaGFubmVsTnIgOiBpbmRleCBvZiBjaGFubmVsIHRvIGJlIHByb2Nlc3NlZCAoZGVmYXVsdD0wKSwgd2hlcmUgY2hhbm5lbE5yCi0gICAqIDwgbGMzQ29uZmlnLk5jCi0gICAqCi0gICAqCi0gICAqIFJldHVybiB2YWx1ZTogZXJyb3IgY29kZSBhcyBsaXN0ZWQgYWJvdmUuCi0gICAqLwotICB1aW50OF90IHJ1bihjb25zdCB1aW50OF90KiBieXRlcywgdWludDE2X3QgYnl0ZV9jb3VudCwgdWludDhfdCBCRkksCi0gICAgICAgICAgICAgIGludDE2X3QqIHhfb3V0LCB1aW50MTZfdCB4X291dF9zaXplLCB1aW50OF90JiBCRUNfZGV0ZWN0LAotICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxOciA9IDApOwotCi0gIC8qCi0gICAqIERlY29kaW5nIG9uZSAxNiwgMjQsIG9yIDMyIGJpdC9zYW1wbGUgb3V0cHV0IGZyYW1lIGZvciBvbmUgY2hhbm5lbAotICAgKgotICAgKiBOb3RlIHRoYXQgZXZlcnkgb3V0cHV0IFBDTSBzYW1wbGUgd2lsbCBuZWVkIG9uZSAzMiBiaXQgbWVtb3J5IHBsYWNlIGluIHRoZQotICAgKiBvdXRwdXQgc3RyZWFtIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgY29uZmlndXJlZCBiaXRzX3Blcl9hdWRpb19zYW1wbGVfZGVjLgotICAgKgotICAgKiBGdXJ0aGVyLCBub3RlIHRoYXQgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIG11bHRpLWNoYW5uZWwgY29uZmlndXJhdGlvbnMKLSAgICogYXMgd2VsbCwgcGFydGljdWxhcmx5IHdoZW4gdGhlIHByb3ZpZGVkIG11bHRpLWNoYW5uZWwgInJ1biIgKHNlZSBiZWxvdykgaXMKLSAgICogbm90IHN1cHBvcnRpbmcgdGhlIGtpbmQgb2YgYnl0ZSBzdHJlYW0gY29uY2F0ZW5hdGlvbiBleGlzdGluZyBpbiB0aGUKLSAgICogY2FsbGluZyBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogICBieXRlcyA6IHBvaW50ZXIgdG8gYnl0ZSBhcnJheSBob2xkaW5nIHRoZSBpbnB1dCBMQzMgZW5jb2RlZCBieXRlIHN0cmVhbQotICAgKiAgICAgICAgICAgb2YgdGhlIGdpdmVuIGNoYW5uZWwuCi0gICAqICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGlzIG1lbW9yeSBpcyBnaXZlbiBieSB0aGUgYnl0ZV9jb3VudCBwYXJhbWV0ZXIuCi0gICAqCi0gICAqICAgYnl0ZV9jb3VudCA6IG51bWJlciBvZiBlbmNvZGVkIGJ5dGVzOyBieXRlIGNvdW50IHRvIGJlIHVzZWQgZm9yIGRlY29kaW5nCi0gICAqICAgICAgICAgICAgICAgIHRoZSByZWNlaXZlZCBmcmFtZSBwYXlsb2FkLgotICAgKiAgICAgICAgICAgICAgICBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAyMCBieXRlcyB0byBieXRlX2NvdW50X21heF9kZWMgYnl0ZXMuCi0gICAqCi0gICAqICAgQkZJIDogQmFkIEZyYW1lIEluZGljYXRpb24gZmxhZ3MKLSAgICogICAgICAgICAiMCIgc2lnbmlmaWVzIHRoYXQgbm8gYml0IGVycm9ycyB3aGVyZSBkZXRlY3RlZCBpbiBnaXZlbiAiYnl0ZXMiCi0gICAqICAgICAgICAgIjEiIHNpZ25pZmllcyBhIGNvcnJ1cHQgcGF5bG9hZCBwYWNrZXQgd2FzIGRldGVjdGVkIGluIGdpdmVuCi0gICAqICJieXRlcyIKLSAgICoKLSAgICogICB4X291dCA6IHBvaW50ZXIgdG8gb3V0cHV0IFBDTSBkYXRhIChtZW1vcnkgMzIgYml0L3NhbXBsZSwgcHJlY2lzaW9uIDE2Ci0gICAqIGJpdC9zYW1wbGUsIDI0IGJpdC9zYW1wbGUgb3IgMzIgYml0L3NhbXBsZSksIHdoZXJlIHRoZSBtZW1vcnkgaGFzIHRvIGJlCi0gICAqIHByb3ZpZGVkIGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgotICAgKgotICAgKiAgIHhfb3V0X3NpemUgOiBudW1iZXIgb2YgMzIgYml0IHZhbHVlcyBzdXBwb3J0ZWQgYnkgeF9vdXQKLSAgICogICAgICAgICAgICAgICAgTm90ZTogdGhpcyBwYXJhbWV0ZXIgaGFzIGJlZW4gaW50cm9kdWNlZCBmb3IgY2xhcml0eSBhbmQKLSAgICogICAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uIHB1cnBvc2Ugb25seS4gVGhlIG1ldGhvZCB3aWxsIHJldHVybgotICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgSU5WQUxJRF9YX09VVF9TSVpFIHdoZW4geF9vdXRfc2l6ZSAhPQotICAgKiBsYzNDb25maWcuTkYuCi0gICAqCi0gICAqICAgQkVDX2RldGVjdCA6IGZsYWcgaW5kaWNhdGlvbiBiaXQgZXJyb3JzIGRldGVjdGVkIGR1cmluZyBkZWNvZGluZyBvZiBpbnB1dAotICAgKiBieXRlcyBOb3RlOiBhIGJhc2ljIHBhY2tldCBsb3NzIGNvbmNlYWxtZW50IChQTEMpIHdpbGwgYmUgYXBwbGllZCB3aGVuCi0gICAqICAgICAgICAgICAgICAgICAgICAgIEJFQ19kZXRlY3QhPTAsIHNvIHRoYXQgdGhlIHJldHVybmVkIGF1ZGlvIGRhdGEgc3RheXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgc29tZXdoYXQgYWNjZXB0YWJsZS4KLSAgICoKLSAgICogIGNoYW5uZWxOciA6IGluZGV4IG9mIGNoYW5uZWwgdG8gYmUgcHJvY2Vzc2VkIChkZWZhdWx0PTApLCB3aGVyZSBjaGFubmVsTnIKLSAgICogPCBsYzNDb25maWcuTmMKLSAgICoKLSAgICoKLSAgICogUmV0dXJuIHZhbHVlOiBlcnJvciBjb2RlIGFzIGxpc3RlZCBhYm92ZS4KLSAgICovCi0gIHVpbnQ4X3QgcnVuKGNvbnN0IHVpbnQ4X3QqIGJ5dGVzLCB1aW50MTZfdCBieXRlX2NvdW50LCB1aW50OF90IEJGSSwKLSAgICAgICAgICAgICAgaW50MzJfdCogeF9vdXQsIHVpbnQxNl90IHhfb3V0X3NpemUsIHVpbnQ4X3QmIEJFQ19kZXRlY3QsCi0gICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbE5yID0gMCk7Ci0KLSAgLyoKLSAgICogRGVjb2Rpbmcgb25lIDE2IGJpdC9zYW1wbGUgb3V0cHV0IGZyYW1lIGZvciBtdWx0aXBsZSBjaGFubmVscy4KLSAgICoKLSAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kcyByZXR1cm5zIHRoZSBlcnJvciBJTlZBTElEX0JJVFNfUEVSX0FVRElPX1NBTVBMRQotICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yIGFueSBiaXRzX3Blcl9hdWRpb19zYW1wbGVfZGVjCi0gICAqICE9IDE2LgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAgIGJ5dGVzIDogcG9pbnRlciB0byBieXRlIGFycmF5IGhvbGRpbmcgdGhlIGlucHV0IExDMyBlbmNvZGVkIGJ5dGUgc3RyZWFtCi0gICAqICAgICAgICAgICBvZiBhbGwgZ2l2ZW4gY2hhbm5lbHMuCi0gICAqICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGlzIG1lbW9yeSBpcyBnaXZlbiBieSB0aGUgc3VtIG9mIGFsbAotICAgKiBieXRlX2NvdW50X3Blcl9jaGFubmVsIHZhbHVlcyAoc2VlIHBhcmFtZXRlciBieXRlX2NvdW50X3Blcl9jaGFubmVsKS4gTm90ZQotICAgKiB0aGF0IHRoZSBlbmNvZGVkIHZhbHVlcyBvZiBhbGwgY2hhbm5lbHMgYXJlIGV4cGVjdGVkIHRvIGJlIGNvbmNhdGVuYXRlZAotICAgKiB3aXRob3V0IGFueSBzdHVmZmluZyBieXRlcyBvZiBtZXRhIGRhdGEgaW4gYmV0d2Vlbi4KLSAgICoKLSAgICogICBieXRlX2NvdW50X3Blcl9jaGFubmVsIDogbnVtYmVyIG9mIGVuY29kZWQgYnl0ZXM7IGJ5dGUgY291bnQgdG8gYmUgdXNlZAotICAgKiBmb3IgZGVjb2RpbmcgdGhlIHJlY2VpdmVkIGZyYW1lIHBheWxvYWQgcGVyIGNoYW5uZWwuIFRodXMsCi0gICAqIGJ5dGVfY291bnRfcGVyX2NoYW5uZWwgaXMgYW4gYXJyYXkgb2YgYnl0ZV9jb3VudCB2YWx1ZXMgd2l0aCBsZW5ndGgKLSAgICogbGMzQ29uaWcuTmMgU3VwcG9ydGVkIHZhbHVlcyBhcmUgMjAgYnl0ZXMgdG8gYnl0ZV9jb3VudF9tYXhfZGVjIGJ5dGVzIHBlcgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLgotICAgKgotICAgKiAgIEJGSV9wZXJfY2hhbm5lbCA6IGxjM0NvbmlnLk5jIGxlbmd0aCBhcnJheSBvZiBCYWQgRnJhbWUgSW5kaWNhdGlvbiBmbGFncwotICAgKiAgICAgICAgICAgICAgICAgICAgICIwIiBzaWduaWZpZXMgdGhhdCBubyBiaXQgZXJyb3JzIHdoZXJlIGRldGVjdGVkIGluCi0gICAqIGdpdmVuICJieXRlcyIgIjEiIHNpZ25pZmllcyBhIGNvcnJ1cHQgcGF5bG9hZCBwYWNrZXQgd2FzIGRldGVjdGVkIGluIGdpdmVuCi0gICAqICJieXRlcyIKLSAgICoKLSAgICogICB4X291dCA6IHBvaW50ZXIgdG8gb3V0cHV0IDE2IGJpdC9zYW1wbGUgUENNIGRhdGEsIHdoZXJlIHRoZSBtZW1vcnkKLSAgICogICAgICAgICAgIGhhcyB0byBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogICB4X291dF9zaXplIDogbnVtYmVyIG9mIDE2IGJpdCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHhfb3V0Ci0gICAqICAgICAgICAgICAgICAgIE5vdGU6IHRoaXMgcGFyYW1ldGVyIGhhcyBiZWVuIGludHJvZHVjZWQgZm9yIGNsYXJpdHkgYW5kCi0gICAqICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBwdXJwb3NlIG9ubHkuIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4KLSAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGVycm9yIElOVkFMSURfWF9PVVRfU0laRSB3aGVuIHhfb3V0X3NpemUgIT0KLSAgICogbGMzQ29uZmlnLk5GICogbGMzQ29uaWcuTmMuCi0gICAqCi0gICAqICAgQkVDX2RldGVjdF9wZXJfY2hhbm5lbCA6IGxjM0NvbmlnLk5jIGxlbmd0aCBhcnJheSBvZiBmbGFncyBpbmRpY2F0aW5nIGJpdAotICAgKiBlcnJvcnMgZGV0ZWN0ZWQgZHVyaW5nIGRlY29kaW5nIG9mIGlucHV0IGJ5dGVzIG9mIGEgY2VydGFpbiBjaGFubmVsLiBOb3RlOgotICAgKiBhIGJhc2ljIHBhY2tldCBsb3NzIGNvbmNlYWxtZW50IChQTEMpIHdpbGwgYmUgYXBwbGllZCB3aGVuIEJFQ19kZXRlY3QhPTAsCi0gICAqIHNvIHRoYXQgdGhlIHJldHVybmVkIGF1ZGlvIGRhdGEgc3RheXMgc29tZXdoYXQgYWNjZXB0YWJsZS4KLSAgICoKLSAgICoKLSAgICogUmV0dXJuIHZhbHVlOiBlcnJvciBjb2RlIHZpYSAib3IiIGNvbmNhdGVuYXRpb24gb2YgdGhlIGVycm9yIGNvZGVzIG9mCi0gICAqIHByb2Nlc3NpbmcgdGhlIGluZGl2aWR1YWwgY2hhbm5lbHMuIE5vdGU6IHRoaXMgIm9yIiBjb25jYXRlbmF0aW9uIG1ha2UKLSAgICogc3BlY2lmaWMgZXJyb3IgZGlhZ25vc2lzIGltcG9zc2libGUuIFRodXMgb25seSBjaGVja2luZyAhPSBFUlJPUl9GUkVFIGlzCi0gICAqIG1lYW5pbmdmdWwuIFdoZW4gbW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQsIHRoZSBzaW5nbGUgY2hhbm5lbAotICAgKiBjYWxsIChzZWUgYWJvdmUpIG5lZWQgdG8gYmUgY2FsbGVkLgotICAgKi8KLSAgdWludDhfdCBydW4oY29uc3QgdWludDhfdCogYnl0ZXMsIGNvbnN0IHVpbnQxNl90KiBieXRlX2NvdW50X3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBCRklfcGVyX2NoYW5uZWwsIGludDE2X3QqIHhfb3V0LAotICAgICAgICAgICAgICB1aW50MzJfdCB4X291dF9zaXplLCB1aW50OF90KiBCRUNfZGV0ZWN0X3Blcl9jaGFubmVsKTsKLQotICAvKgotICAgKiBEZWNvZGluZyBvbmUgMTYsIDI0LCBvciAzMiBiaXQvc2FtcGxlIG91dHB1dCBmcmFtZSBmb3IgbXVsdGlwbGUgY2hhbm5lbHMKLSAgICoKLSAgICogTm90ZSB0aGF0IGV2ZXJ5IG91dHB1dCBQQ00gc2FtcGxlIHdpbGwgbmVlZCBvbmUgMzIgYml0IG1lbW9yeSBwbGFjZSBpbiB0aGUKLSAgICogb3V0cHV0IHN0cmVhbSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIGNvbmZpZ3VyZWQgYml0c19wZXJfYXVkaW9fc2FtcGxlX2RlYy4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogICBieXRlcyA6IHBvaW50ZXIgdG8gYnl0ZSBhcnJheSBob2xkaW5nIHRoZSBpbnB1dCBMQzMgZW5jb2RlZCBieXRlIHN0cmVhbQotICAgKiAgICAgICAgICAgb2YgYWxsIGdpdmVuIGNoYW5uZWxzLgotICAgKiAgICAgICAgICAgVGhlIHNpemUgb2YgdGhpcyBtZW1vcnkgaXMgZ2l2ZW4gYnkgdGhlIHN1bSBvZiBhbGwKLSAgICogYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCB2YWx1ZXMgKHNlZSBwYXJhbWV0ZXIgYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCkuIE5vdGUKLSAgICogdGhhdCB0aGUgZW5jb2RlZCB2YWx1ZXMgb2YgYWxsIGNoYW5uZWxzIGFyZSBleHBlY3RlZCB0byBiZSBjb25jYXRlbmF0ZWQKLSAgICogd2l0aG91dCBhbnkgc3R1ZmZpbmcgYnl0ZXMgb2YgbWV0YSBkYXRhIGluIGJldHdlZW4uCi0gICAqCi0gICAqICAgYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCA6IG51bWJlciBvZiBlbmNvZGVkIGJ5dGVzOyBieXRlIGNvdW50IHRvIGJlIHVzZWQKLSAgICogZm9yIGRlY29kaW5nIHRoZSByZWNlaXZlZCBmcmFtZSBwYXlsb2FkIHBlciBjaGFubmVsLiBUaHVzLAotICAgKiBieXRlX2NvdW50X3Blcl9jaGFubmVsIGlzIGFuIGFycmF5IG9mIGJ5dGVfY291bnQgdmFsdWVzIHdpdGggbGVuZ3RoCi0gICAqIGxjM0NvbmlnLk5jIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIDIwIGJ5dGVzIHRvIGJ5dGVfY291bnRfbWF4X2RlYyBieXRlcyBwZXIKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC4KLSAgICoKLSAgICogICBCRklfcGVyX2NoYW5uZWwgOiBsYzNDb25pZy5OYyBsZW5ndGggYXJyYXkgb2YgQmFkIEZyYW1lIEluZGljYXRpb24gZmxhZ3MKLSAgICogICAgICAgICAgICAgICAgICAgICAiMCIgc2lnbmlmaWVzIHRoYXQgbm8gYml0IGVycm9ycyB3aGVyZSBkZXRlY3RlZCBpbgotICAgKiBnaXZlbiAiYnl0ZXMiICIxIiBzaWduaWZpZXMgYSBjb3JydXB0IHBheWxvYWQgcGFja2V0IHdhcyBkZXRlY3RlZCBpbiBnaXZlbgotICAgKiAiYnl0ZXMiCi0gICAqCi0gICAqICAgeF9vdXQgOiBwb2ludGVyIHRvIG91dHB1dCAxNiwgMjQsIG9yIDMyIGJpdC9zYW1wbGUgUENNIGRhdGEsIHdoZXJlIHRoZQotICAgKiBtZW1vcnkgaGFzIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgotICAgKgotICAgKiAgIHhfb3V0X3NpemUgOiBudW1iZXIgb2YgMzIgYml0IHZhbHVlcyBzdXBwb3J0ZWQgYnkgeF9vdXQKLSAgICogICAgICAgICAgICAgICAgTm90ZTogdGhpcyBwYXJhbWV0ZXIgaGFzIGJlZW4gaW50cm9kdWNlZCBmb3IgY2xhcml0eSBhbmQKLSAgICogICAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uIHB1cnBvc2Ugb25seS4gVGhlIG1ldGhvZCB3aWxsIHJldHVybgotICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgSU5WQUxJRF9YX09VVF9TSVpFIHdoZW4geF9vdXRfc2l6ZSAhPQotICAgKiBsYzNDb25maWcuTkYgKiBsYzNDb25pZy5OYy4KLSAgICoKLSAgICogICBCRUNfZGV0ZWN0X3Blcl9jaGFubmVsIDogbGMzQ29uaWcuTmMgbGVuZ3RoIGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgYml0Ci0gICAqIGVycm9ycyBkZXRlY3RlZCBkdXJpbmcgZGVjb2Rpbmcgb2YgaW5wdXQgYnl0ZXMgb2YgYSBjZXJ0YWluIGNoYW5uZWwuIE5vdGU6Ci0gICAqIGEgYmFzaWMgcGFja2V0IGxvc3MgY29uY2VhbG1lbnQgKFBMQykgd2lsbCBiZSBhcHBsaWVkIHdoZW4gQkVDX2RldGVjdCE9MCwKLSAgICogc28gdGhhdCB0aGUgcmV0dXJuZWQgYXVkaW8gZGF0YSBzdGF5cyBzb21ld2hhdCBhY2NlcHRhYmxlLgotICAgKgotICAgKgotICAgKiBSZXR1cm4gdmFsdWU6IGVycm9yIGNvZGUgdmlhICJvciIgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZXJyb3IgY29kZXMgb2YKLSAgICogcHJvY2Vzc2luZyB0aGUgaW5kaXZpZHVhbCBjaGFubmVscy4gTm90ZTogdGhpcyAib3IiIGNvbmNhdGVuYXRpb24gbWFrZQotICAgKiBzcGVjaWZpYyBlcnJvciBkaWFnbm9zaXMgaW1wb3NzaWJsZS4gVGh1cyBvbmx5IGNoZWNraW5nICE9IEVSUk9SX0ZSRUUgaXMKLSAgICogbWVhbmluZ2Z1bC4gV2hlbiBtb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIG5lZWRlZCwgdGhlIHNpbmdsZSBjaGFubmVsCi0gICAqIGNhbGwgKHNlZSBhYm92ZSkgbmVlZCB0byBiZSBjYWxsZWQuCi0gICAqLwotICB1aW50OF90IHJ1bihjb25zdCB1aW50OF90KiBieXRlcywgY29uc3QgdWludDE2X3QqIGJ5dGVfY291bnRfcGVyX2NoYW5uZWwsCi0gICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIEJGSV9wZXJfY2hhbm5lbCwgaW50MzJfdCogeF9vdXQsCi0gICAgICAgICAgICAgIHVpbnQzMl90IHhfb3V0X3NpemUsIHVpbnQ4X3QqIEJFQ19kZXRlY3RfcGVyX2NoYW5uZWwpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8TGMzRGVjOjpEZWNvZGVyVG9wKj4gZGVjb2Rlckxpc3Q7Ci19OwotCi0jZW5kaWYgLyogQVBJX0xDM0RFQ09ERVJfSFBQXyAqLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9BcGkvTGMzRW5jb2Rlci5ocHAgYi9lbWJkcnYvbGMzL0FwaS9MYzNFbmNvZGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhOGNiMi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0FwaS9MYzNFbmNvZGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogTGMzRW5jb2Rlci5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBUElfTEMzRU5DT0RFUl9IUFBfCi0jZGVmaW5lIEFQSV9MQzNFTkNPREVSX0hQUF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotLyoKLSAqIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlICJpbnRlcm5hbCIgY2xhc3MgRW5jb2RlclRvcCwgc28KLSAqIHRoYXQgdGhlIHByaXZhdGUgdmVjdG9yIG9mIHNpbmdsZSBjaGFubmVsIGVuY29kZXJzIGNhbiBiZSBkZWNsYXJlZCBpbgotICogTGMzRW5jb2Rlci4KLSAqLwotbmFtZXNwYWNlIExjM0VuYyB7Ci1jbGFzcyBFbmNvZGVyVG9wOwotfQotCi0vKgotICogVGhlIExDMyBlbmNvZGVyIGludGVyZmFjZSBpcyBzcGVjaWZpZWQgaW4KLSAqIExDMyBzcGVjaWZpY2F0aW9uIFNlY3Rpb25zIDIuMiAiRW5jb2RlciBpbnRlcmZhY2VzIiAoZHIwOXIwNykuCi0gKgotICogTGMzRW5jb2RlciBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgYWxsIHNwZWNpZmllZCBmZWF0dXJlcyBhcmUgcHJvdmlkZWQKLSAqIHdpdGggdGhlIChjdXJyZW50KSBleGNlcHRpb24gb2Ygbm90IHByb3ZpZGluZyBvdGhlciBpbnB1dCBiaXQgZGVwdGgKLSAqIHRoYW4gMTYgYml0L3NhbXBsZS4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGhlIG1haW4gcHVycG9zZSBvZiB0aGUKLSAqIGltcGxlbWVudGF0aW9uIHdhcyB0byBoYW5kbGUgMTZiaXQgYXVkaW8gZGF0YSBwcm92aWRlZCB3aXRoaW4gYW5kcm9pZAotICogc21hcnRwaG9uZXMuIFByb3ZpZGluZyB0aGUgc3BlY2lmaWVkIDI0Yml0IGFuZCAzMiBiaXQgYXVkaW8gZGF0YSBpbnB1dCwKLSAqIHdvdWxkIG1ha2UgdGhlIEFQSSBtb3JlIGNvbXBsZXguIEhvd2V2ZXIsIHRoZSBtYWluIGFyZ3VtZW50IHRvIG5vdCBzdXBwb3J0Ci0gKiB0aGVzZSBzYW1wbGUgcmF0ZXMgcmlnaHQgbm93LCBpcyB0aGF0IGludGVybmFsIG9wZXJhdGlvbnMgYW5kIG1lbW9yeQotICogY29uc3VtcHRpb24gd291bGQgaGF2ZSB0byBiZSBpbmNyZWFzZWQgbWVhc3VyYWJsZSBvdGhlcndpc2UuCi0gKgotICogSW5zdGFudGlhdGluZyBMYzNFbmNvZGVyIGltcGxpZXMgcHJvdmlkaW5nIGEgTGMzQ29uZmlnIGluc3RhbmNlLiBBIGNvcHkgb2YKLSAqIHRoaXMgaW5zdGFuY2UgaXMgYXZhaWxhYmxlIGFzIHB1YmxpYyBjb25zdCBtZW1iZXIgc28gdGhhdCBhbGwgZXNzZW50aWFsCi0gKiBzZXNzaW9uIHBhcmFtZXRlcnMgY2FuIGJlIG9idGFpbmVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBMYzNFbmNvZGVyCi0gKiBpbnN0YW5jZS4KLSAqCi0gKiBUaGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZiBjaGFuZ2luZyBMYzNDb25maWcgd2l0aGluIExjM0VuY29kZXIuIFdoZW4gc2Vzc2lvbgotICogcGFyYW1ldGVycyBoYXZlIHRvIGJlIGNoYW5nZWQsIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGhhcyB0byBjcmVhdGUgYSBuZXcKLSAqIGluc3RhbmNlIG9mIExjM0VuY29kZXIuCi0gKgotICogTGMzIHN1cHBvcnRzIG9wZXJhdGlvbiB3aXRoIHZhcmlhYmxlIGVuY29kZWQgYml0cmF0ZS4gSXQgaXMgcG9zc2libGUgdG8KLSAqIGNoYW5nZSB0aGUgYml0cmF0ZSBmcm9tIGZyYW1lIHRvIGZyYW1lLCB3aGVyZSBmb3IgcHJlY2lzZW5lc3MgdGhlIHBhcmFtZXRlcgotICogaXMgbm90IGdpdmVuIGFzIGJpdCByYXRlIGRpcmVjdGx5IGJ1dCBpbiB0ZXJtcyBvZiB0aGUgYnl0ZV9jb3VudCBwZXIgZnJhbWUuCi0gKiBUaGlzIHBhcmFtZXRlciBoYXMgdG8gYmUgaW4gdGhlIHJhbmdlIG9mIDIwIHRvIDQwMCAoc2VlIExDMyBzcGVjaWZpY2F0aW9uCi0gKiBTZWN0aW9uIDMuMi41ICJCaXQgYnVkZ2V0IGFuZCBiaXRyYXRlIikKLSAqCi0gKi8KLQotY2xhc3MgTGMzRW5jb2RlciB7Ci0gcHVibGljOgotICAvKgotICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3RvciBvZiBMYzNFbmNvZGVyIHdpdGggb25lIHNpbXBsZSBwYXJhbWV0ZXIgb25seS4KLSAgICogTm90ZSB0aGF0IHRoaXMgY29uc3RydWN0b3IgaW5zdGFudGlhdGVkIExjM0NvbmZpZyBpbXBsaWNpdGx5IHdpdGgKLSAgICogIExjM0NvbmZpZyhGcywgTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcywgMSkgdGhhdCBtZWFucyB0aGF0IHRoaXMKLSAgICogY29uc3RydWN0b3IgcHJvdmlkZXMgcHJvY2Vzc2luZyBvZiBvbmUgY2hhbm5lbCAobW9ubykgd2l0aCAxMG1zIGZyYW1lCi0gICAqIGR1cmF0aW9uLgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAgRnMgOiBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogLT4gc2VlIExjM0NvbmZpZy5ocHAgZm9yIHN1cHBvcnRlZCB2YWx1ZXMKLSAgICovCi0gIExjM0VuY29kZXIodWludDE2X3QgRnMpOwotCi0gIC8qCi0gICAqIEdlbmVyYWwgY29uc3RydWN0b3Igb2YgTGMzRW5jb2Rlci4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogIGxjM0NvbmZpZ18gOiBpbnN0YW5jZSBvZiBMYzNDb25maWcuIFNlZSBkb2N1bWVudGF0aW9uIG9mIExjM0NvbmZpZyBmb3IKLSAgICogbW9yZSBkZXRhaWxzLiBOb3RlOiBwcm92aWRpbmcgYW4gaW52YWxpZCBpbnN0YW5jZSBvZiBMYzNDb25maWcgd2lsbCByZXN1bHQKLSAgICogICAgICAgICAgICAgICAgICAgICBpbiBza2lwcGluZyBhbnkgcHJvY2Vzc2luZyBsYXRlci4KLSAgICogICAgICAgICAgICAgICBUaGUgcHJvdmlkZWQgaW5zdGFuY2Ugb2YgTGMzQ29uZmlnIHdpbGwgYmUgY29waWVkIHRvIHRoZQotICAgKiAgICAgICAgICAgICAgIHB1YmxpYyBmaWVsZCAibGMzQ29uZmlnIiAoc2VlIGJlbG93KS4KLSAgICoKLSAgICogIGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9lbmNfIDogVGhlIGJpdHMgcGVyIGF1ZGlvIHNhbXBsZSBmb3IgdGhlIGlucHV0IFBDTQotICAgKiBzaWduYWwuIFNlZSBMQzMgc3BlY2lmaWNhdGlvbiBTZWN0aW9uIDIuMiAiRW5jb2RlciBpbnRlcmZhY2VzIiBhbmQKLSAgICogU2VjdGlvbiAzLjIuMyAiQml0cyBwZXIgc2FtcGxlIiBmb3IgdGhlIGdlbmVyYWwgTEMzIHJlcXVpcmVtZW50IHRvIHN1cHBvcnQKLSAgICogMTYsIDI0IGFuZCAzMiBiaXQuIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG1heSBkaWZmZXIgZnJvbSB0aGUgZGVjb2RlciBvdXRwdXQKLSAgICogUENNIHNldHRpbmcgImJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWMiLgotICAgKgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWxsb3dzCi0gICAqIDE2IGJpdCBvbmx5IGFuZCB3aWxsIHJldHVybiBhbiBlcnJvciBJTlZBTElEX0JJVFNfUEVSX0FVRElPX1NBTVBMRSBmb3IKLSAgICogcnVuKCkgd2hlbiBjb25maWd1cmVkIHdpdGggYW55IG90aGVyIHZhbHVlLiAoc2VlIHJlYXNvbmluZyBmb3IgdGhpcwotICAgKiBjb25zdHJhaW50IGluIHRoZSBnZW5lcmFsIGNsYXNzIGRlc2NyaXB0b24gYWJvdmUpCi0gICAqCi0gICAqIGRhdGFwb2ludHMgOiBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgYWxsb3dpbmcgdG8gY29sbGVjdCBpbnRlcm5hbAotICAgKiBkYXRhLiBOb3RlOiB0aGlzIGZlYXR1cmUgaXMgdXNlZCBhbmQgcHJlcGFyZWQgZm9yIHRlc3Rpbmcgb2YgdGhlIGNvZGVjCi0gICAqICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvbmx5LiBTZWUgZ2VuZXJhbCAiUmVhZG1lLnR4dCIKLSAgICovCi0gIExjM0VuY29kZXIoTGMzQ29uZmlnIGxjM0NvbmZpZ18sIHVpbnQ4X3QgYml0c19wZXJfYXVkaW9fc2FtcGxlX2VuY18gPSAxNiwKLSAgICAgICAgICAgICB2b2lkKiBkYXRhcG9pbnRzID0gbnVsbHB0cik7Ci0KLSAgLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvciBzdXBwb3J0ZWQKLSAgTGMzRW5jb2RlcigpID0gZGVsZXRlOwotCi0gIC8vIERlc3RydWN0b3IKLSAgdmlydHVhbCB+TGMzRW5jb2RlcigpOwotCi0gIC8qCi0gICAqIENvbmZpZ3VyYXRpb24gcHJvdmlkZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYWNjZXNzaWJsZSBhcyBwdWJsaWMgY29uc3QKLSAgICogZmllbGRzLiBOb3RlOiBMYzNDb25maWcgcHJvdmlkZXMgYSBnZXR0ZXIgdG8gY2hlY2sgd2hldGhlciB0aGUKLSAgICogY29uZmlndXJhdGlvbiBpcyB2YWxpZC4KLSAgICovCi0gIGNvbnN0IExjM0NvbmZpZyBsYzNDb25maWc7Ci0gIGNvbnN0IHVpbnQ4X3QgYml0c19wZXJfYXVkaW9fc2FtcGxlX2VuYzsKLQotICAvLyBlbmNvZGluZyBlcnJvcnMgKHNlZSByZXR1cm4gdmFsdWVzIG9mICJydW4iIG1ldGhvZHMpCi0gIHN0YXRpYyBjb25zdCB1aW50OF90IEVSUk9SX0ZSRUUgPSAweDAwOwotICBzdGF0aWMgY29uc3QgdWludDhfdCBJTlZBTElEX0NPTkZJR1VSQVRJT04gPSAweDAxOwotICBzdGF0aWMgY29uc3QgdWludDhfdCBJTlZBTElEX0JZVEVfQ09VTlQgPSAweDAyOwotICBzdGF0aWMgY29uc3QgdWludDhfdCBJTlZBTElEX0JJVFNfUEVSX0FVRElPX1NBTVBMRSA9IDB4MDM7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IEVOQ09ERVJfQUxMT0NBVElPTl9FUlJPUiA9IDB4MDQ7Ci0KLSAgLyoKLSAgICogRW5jb2Rpbmcgb2Ygb25lIGlucHV0IGZyYW1lIGZvciBvbmUgY2hhbm5lbC4KLSAgICoKLSAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBtdWx0aS1jaGFubmVsIGNvbmZpZ3VyYXRpb25zIGFzIHdlbGwsCi0gICAqIHBhcnRpY3VsYXJseSB3aGVuIHRoZSBwcm92aWRlZCBtdWx0aS1jaGFubmVsICJydW4iIChzZWUgYmVsb3cpIGlzIG5vdAotICAgKiBwcm92aWRpbmcgdGhlIGtpbmQgb2YgYnl0ZSBzdHJlYW0gY29uY2F0ZW5hdGlvbiBkZXNpcmVkIGJ5IGEgc3BlY2lmaWMKLSAgICogYXBwbGljYXRpb24uCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqICB4ICAgICAgICAgIDogcG9pbnRlciB0byBpbnB1dCBzaWduYWwgYXJyYXkgd2l0aCAxNmJpdC9zYW1wbGUuCi0gICAqICAgICAgICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2lnbmFsIHRvIGJlIHByb3ZpZGVkIGRlcGVuZHMgb24gdGhlIGdpdmVuCi0gICAqICAgICAgICAgICAgICAgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGFuZCBjYW4gYmUgb2J0YWluZWQgdmlhCi0gICAqICAgICAgICAgICAgICAgbGMzQ29uZmlnLk5GCi0gICAqCi0gICAqICBieXRlX2NvdW50IDogZGV0ZXJtaW5lcyB0aGUgY29tcHJlc3Npb24gc3RyZW5ndGggKC0+IGJpdHJhdGUpIHRvIGJlIHVzZWQKLSAgICogICAgICAgICAgICAgICBmb3IgdGhpcyBzcGVjaWZpYyBmcmFtZS4gU3VwcG9ydGVkIHZhbHVlcyBhcmUgMjAgYnl0ZXMgdG8gNDAwCi0gICAqIGJ5dGVzLCB3aGVyZSB2YWx1ZXMgd2VsbCBiZWxvdyA0MCBieXRlcyB0eXBpY2FsbHkgZ2l2ZSByYXRoZXIgcG9vciBhdWRpbwotICAgKiBxdWFsaXR5LiBOb3RlOiBpbiBjYXNlIG9mIGhhdmluZyBhbiBhcHBsaWNhdGlvbiB0YXJnZXRpbmcgYSBnaXZlbiBiaXRyYXRlLAotICAgKiB0aGUgaGVscGVyIG1ldGhvZCAibGMzQ29uZmlnLmdldEJ5dGVDb3VudEZyb21CaXRyYXRlKC4pIiBjYW4gYmUgdXNlZCB0bwotICAgKiBjb21wdXRlIHRoZSBwcm9wZXIgc2V0dGluZyBmb3IgdGhpcyBieXRlX2NvdW50IHBhcmFtZXRlci4KLSAgICoKLSAgICogIGJ5dGVzICAgICAgOiBwb2ludGVyIHRvIGJ5dGUgYXJyYXkgKG1lbW9yeSkgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLAotICAgKiB3aGVyZSB0aGUgZW5jb2RlZCBieXRlIHN0cmVhbSB3aWxsIGJlIHBsYWNlZC4gVGhlIHNpemUgb2YgdGhpcyBtZW1vcnkgaXMKLSAgICogZ2l2ZW4gYnkgdGhlIGJ5dGVfY291bnQgcGFyYW1ldGVyLgotICAgKgotICAgKiAgY2hhbm5lbE5yICA6IGluZGV4IG9mIGNoYW5uZWwgdG8gYmUgcHJvY2Vzc2VkIChkZWZhdWx0PTApLCB3aGVyZSBjaGFubmVsTnIKLSAgICogPCBsYzNDb25maWcuTmMKLSAgICoKLSAgICogUmV0dXJuIHZhbHVlOiBlcnJvciBjb2RlIGFzIGxpc3RlZCBhYm92ZS4KLSAgICovCi0gIHVpbnQ4X3QgcnVuKGNvbnN0IGludDE2X3QqIHgsIHVpbnQxNl90IGJ5dGVfY291bnQsIHVpbnQ4X3QqIGJ5dGVzLAotICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxOciA9IDApOwotCi0gIC8qCi0gICAqIEVuY29kaW5nIG9mIG9uZSBtdWx0aS1jaGFubmVsIGZyYW1lLgotICAgKgotICAgKiBOb3RlIHRoYXQgdGhpcyBjYWxsIGFsd2F5cyBwcm9jZXNzZXMgYWxsIGNoYW5uZWxzIGNvbmZpZ3VyZWQgaW4gdGhlIGdpdmVuCi0gICAqIHNlc3Npb24uCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqICB4ICAgICAgICAgIDogcG9pbnRlciB0byBpbnB1dCBzaWduYWwgYXJyYXkgd2l0aCAxNmJpdC9zYW1wbGUuCi0gICAqICAgICAgICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2lnbmFsIHRvIGJlIHByb3ZpZGVkIGRlcGVuZHMgb24gdGhlIGdpdmVuCi0gICAqICAgICAgICAgICAgICAgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGFuZCBjYW4gYmUgb2J0YWluZWQgdmlhCi0gICAqICAgICAgICAgICAgICAgbGMzQ29uZmlnLk5GICogbGMzQ29uZmlnLk5jCi0gICAqCi0gICAqICBieXRlX2NvdW50X3Blcl9jaGFubmVsIDogZGV0ZXJtaW5lcyB0aGUgY29tcHJlc3Npb24gc3RyZW5ndGggKC0+IGJpdHJhdGUpCi0gICAqIHRvIGJlIHVzZWQgZm9yIGVhY2ggY2hhbm5lbCBpbmRpdmlkdWFsbHkgb2YgdGhpcyBzcGVjaWZpYyBmcmFtZS4gVGh1cywKLSAgICogYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCBpcyBhbiBhcnJheSBvZiBieXRlX2NvdW50IHZhbHVlcyB3aXRoIGxlbmd0aAotICAgKiBsYzNDb25pZy5OYyBTdXBwb3J0ZWQgdmFsdWVzIHBlciBjaGFubmVsIGFyZSAyMCBieXRlcyB0byA0MDAgYnl0ZXMuIFNlZQotICAgKiBhbHNvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2luZ2xlIGNoYW5uZWwgInJ1biIgYWJvdmUuCi0gICAqCi0gICAqICBieXRlcyAgICAgIDogcG9pbnRlciB0byBieXRlIGFycmF5IChtZW1vcnkpIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwKLSAgICogd2hlcmUgdGhlIGVuY29kZWQgYnl0ZSBzdHJlYW0gd2lsbCBiZSBwbGFjZWQuIFRoZSBzaXplIG9mIHRoaXMgbWVtb3J5IGlzCi0gICAqIGdpdmVuIGJ5IHRoZSBieXRlX2NvdW50X3Blcl9jaGFubmVsIHBhcmFtZXRlciwgc3BlY2lmaWNhbGx5IGJ5IHRoZSBzdW0gb2YKLSAgICogYWxsIGNoYW5uZWwtd2lzZSBieXRlX2NvdW50IHZhbHVlcyAoYnl0ZV9jb3VudF9wZXJfY2hhbm5lbFswXSArIC4uLiArCi0gICAqIGJ5dGVfY291bnRfcGVyX2NoYW5uZWxbbGMzQ29uZmlnLk5jXSkgVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGVuY29kZWQgYnl0ZXMKLSAgICogZnJvbSB0aGUgaW5kaXZpZHVhbCBjaGFubmVscyBhcmUgY29uY2F0ZW5hdGVkIGRpcmVjdGx5ICh3aXRob3V0IGFueQotICAgKiBzdHVmZmluZyBieXRlcyBvciBtZXRhIGluZm9ybWF0aW9uKS4KLSAgICoKLSAgICogUmV0dXJuIHZhbHVlOiBlcnJvciBjb2RlIGFzIGxpc3RlZCBhYm92ZS4KLSAgICovCi0gIHVpbnQ4X3QgcnVuKGNvbnN0IGludDE2X3QqIHgsIGNvbnN0IHVpbnQxNl90KiBieXRlX2NvdW50X3Blcl9jaGFubmVsLAotICAgICAgICAgICAgICB1aW50OF90KiBieXRlcyk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxMYzNFbmM6OkVuY29kZXJUb3AqPiBlbmNvZGVyTGlzdDsKLX07Ci0KLSNlbmRpZiAvKiBBUElfTEMzRU5DT0RFUl9IUFBfICovCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0NvbW1vbi9EY3RJVi5jcHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9EY3RJVi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODMyMmUuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9Db21tb24vRGN0SVYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBEY3RJVi5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkRjdElWLmhwcCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0vKgotICogTm90ZXMgb24gdGhlIGNob2ljZSBvZiB0aGUgYXBwbGllZCBGRlQgbGlicmFyeToKLSAqICAtIERpZmZlcmVudCBmYXN0IHRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBEQ1QtSVYgY2FuIGJlIHNlbGVjdGVkCi0gKiB2aWEgVVNFX0ZGVFcgVVNFX0ZGVFdfRk9SX0ZGVCAgLy8gYXNzdW1lIE5GIGJlaW5nIDQgdGltZXMgYW4gaW50ZWdlcgotICogICAgICBVU0VfS0lTU0ZGVCAgICAgICAvLyBhc3N1bWUgTkYgYmVpbmcgNCB0aW1lcyBhbiBpbnRlZ2VyCi0gKiAgICAgd2hlcmUgb25seSBvbmUgb2YgdGhlbSBpcyBtZWFuaW5nZnVsIHRvIGJlIGRlZmluZWQKLSAqCi0gKiAgLSBEZWZpbmluZyBub25lIG9mIHRoZSBmYXN0IHRyYW5zZm9ybXMgd2lsbCBsZWFkIHRvIGEgZGlyZWN0IGltcGxlbWVudGF0aW9uCi0gKiAgICAgd2hpY2ggaXMgZ29vZCBmb3IgdGVzdGluZyBidXQgdXN1YWxseSB0byBzbG93IGZvciBwcmFjdGlhbCBhcHBsaWNhdGlvbnMKLSAqCi0gKiAgLSBVU0VfRkZUVzogVGhlIGZyZWUgImZmdHciIGxpYnJhcnkgc2hvdWxkIGJlIGZhc3Rlc3QsIGJ1dCBtYXkgYmUgbW9yZQotICogY29tcGxpY2F0ZWQgdG8gYmUgYnVpbGQgZm9yIGVtYmVkZGVkIHRhcmdldCBkZXZpY2VzLiBJdCBwcm92aWRlcyBkZWRpY2F0ZWQKLSAqIG9wdGltaXphdGlvbiBmb3IgdGhlIERDVC1JViBhbmQgdGh1cyBpcyBwcmVmZXJyZWQgZnJvbSBhIHRlY2huaWNhbAotICogcGVyc3BlY3RpdmUuIEluIHRlcm1zIG9mIGxpY2VuY2VzICJmZnR3IiBpcyBmcmVlIGluIHRoZSBzZW5zZSBvZiBHUEwsIHdoaWNoCi0gKiBpcyBub3QgbGlrZWQgaW4gc29tZSBwcm9kdWN0cy4gVGhlcmUgbWlnaHQgYmUgdGhlIG9wdGlvbiB0byBhc2sgdGhlIGF1dGhvcnMKLSAqIGZvciBvdGhlciBsaWNlbmNlcyAod2hpY2ggdGhleSBwcm9wb3NlKS4gTmV2ZXJ0aGVsZXNzLCB0aGUgImxpY2Vuc2UiIGlzc3VlCi0gKiAgICAgaGFzIGRyaXZlbiB1cyB0byBub3QgYnVuZGxlICJmZnR3IiBkaXJlY3RseSB3aXRoIHRoZSBMQzMgaW1wbGVtZW50YXRpb24sCi0gKiBhbHRob3VnaCB0aGUgQVBJIGZvciB1c2luZyBpdCBpcyBwcm92aWRlZCBhbmQgdGVzdGVkLgotICoKLSAqICAtIFVTRV9GRlRXX0ZPUl9GRlQ6IHRoaXMgaXMgYSBub3QgZnVsbHkgb3B0aW1pemVkIGFsdGVybmF0aXZlIGFwcHJvYWNoIHVzaW5nCi0gKiB0aGUgY29tcGxleCBmZnQgcHJvdmlkZWQgYnkgImZmdHciIGluc3RlYWQgb2YgdGhlIGRlZGljYXRlZCBvcHRpbWl6ZWQgRENULUlWCi0gKiBpbXBsZW1lbnRhdGlvbi4gVGhpcyBvcHRpb24gaXMgbWFpbmx5IHByb3ZpZGVkIHRvIGRlbW9uc3RyYXRlIHRoZSB0cmFuc2l0aW9uCi0gKiBmcm9tIFVTRV9GRlRXIHRvIFVTRV9LSVNTRkZUCi0gKgotICogIC0gVVNFX0tJU1NGRlQ6IHRoZSBmcmVlICJraXNzZmZ0IiBsaWJyYXJ5IGlzIHNsaWd0aGx5IHNsb3dlciB0aGFuICJmZnR3IiwKLSAqIGJ1dCBnaXZlcyBhIG1ham9yaXR5IG9mIHRoZSBwb3NzaWJsZSBwZXJmb3JtYW5jZSBnYWluIG92ZXIgYSAic3R1cGlkIiBkaXJlY3QKLSAqIERDVC1JViBpbXBsZW1lbnRhdGlvbi4gImtpc3NmZnQiIGRvZXMgbm90IHByb3ZpZGUgYSBkZWRpY2F0ZWQgb3B0aW1pemF0aW9uCi0gKiBmb3IgRENULUlWIHNvIHRoYXQgc29tZSBhZGRpdGlvbmFsIGNvZGUgZm9yIGltcGxlbWVudGluZyBhIERDVC1JViBieSBhCi0gKiBjb21wbGV4IGZmdCBoYXMgdG8gYmUgYWRkZWQuIFRoaXMgYWxzbyBpbXBsaWVzIGFkZGl0aW9uYWwgbWVtb3J5IG5lZWRlZC4gVGhlCi0gKiBiaWcgYWR2YW50YWdlIG9mIHRoZSAia2lzc2ZmdCIgaXMgdGhhdCBpdCBpcyBsZXNzIHJlc3RyaWN0aXZlIGluIHRlcm1zIG9mIGl0cwotICogbGljZW5zZS4gRnVydGhlciwgdGhlIHRlbXBsYXRlIGJhc2VkIEMrKyBpbXBsZW1lbnRhdGlvbiByZWR1Y2VzIGl0cyBpbXBhY3Qgb24KLSAqIHRoZSBidWlsZCBzeXN0ZW0gdG8gYSBtaW5pbXVtICh3ZSBqdXN0IG5lZWQgdG8gaW5jbHVkZSB0aGUgcmlnaHQgaGVhZGVyCi0gKiB3aXRob3V0IG5lZWRpbmcgdG8gY29tcGlsZSBhbmQgbGluayBhIHNlcGFyYXRlIGZpbGUpLgotICoKLSAqICAgLSBVU0VfS0lTU0ZGVCBpcyBkZWZpbmVkIGJlbG93IHRvIGJlIHRoZSBkZWZhdWx0IGNob2ljZS4gVGhlIG90aGVyCi0gKiBhbHRlcm5hdGl2ZXMgbWF5IGJlIHNlbGVjdGluZyBieSBwcm92aWRpbmcgaXRzIGRlZmluZSB2aWEgdGhlIGNvbXBpbGVyIHN3aXRjaAotICogLUQ8ZGVmaW5lPgotICoKLSAqICAgLSBUaGUgaW1wYWN0IG9mIHRoZSBkZWZpbmVzIGlzIHJlc3RyaWN0ZWQgdG8gdGhpcyAqLmNwcCBmaWxlIGZvciBjbGFyaXR5Ci0gKiByZWFzb25zLiBPaywgdG8gbWFrZSB0aGlzIHdvcmssIHdlIG5lZWRlZCBhIGZldyAidWdseSIgcG9pbnRlciBjYXN0cywgYnV0IHdlCi0gKiByZWFsbHkgd2FudGVkIHRvIG1ha2Ugc3VyZSwgdGhhdCBubyBvdGhlciBjb2RlIG9yIGJ1aWxkIGltcGFjdCBpcyBnZW5lcmF0ZWQKLSAqIGJ5IHRoZSBvcHRpb25zIGluIHRoaXMgZmlsZS4KLSAqLwotI2RlZmluZSBVU0VfT1dOX0ZGVAotCi0jaWYgZGVmaW5lZCBVU0VfRkZUVyB8fCBkZWZpbmVkIFVTRV9GRlRXX0ZPUl9GRlQKLSNpbmNsdWRlIDxmZnR3My5oPgotCi0jZWxpZiBkZWZpbmVkIFVTRV9LSVNTRkZUCi0jaW5jbHVkZSAia2lzc2ZmdC5oaCIKLQotY2xhc3MgS2lzc2ZmdENvbmZpZyB7Ci0gcHVibGljOgotICBLaXNzZmZ0Q29uZmlnKHVpbnQxNl90IE4pIDogaW5idWYobnVsbHB0ciksIG91dGJ1ZihudWxscHRyKSwgZmZ0KG51bGxwdHIpIHsKLSAgICBpbmJ1ZiA9IG5ldyBzdGQ6OmNvbXBsZXg8ZG91YmxlPltOXTsKLSAgICBvdXRidWYgPSBuZXcgc3RkOjpjb21wbGV4PGRvdWJsZT5bTl07Ci0gICAgdHdpZGRsZSA9IG5ldyBzdGQ6OmNvbXBsZXg8ZG91YmxlPltOXTsKLSAgICBmZnQgPSBuZXcga2lzc2ZmdDxkb3VibGU+KE4sIGZhbHNlKTsKLQotICAgIGNvbnN0IGRvdWJsZSBwaSA9IHN0ZDo6YWNvcygtMSk7Ci0gICAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IE47IG4rKykgewotICAgICAgdHdpZGRsZVtuXSA9Ci0gICAgICAgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4oc3RkOjpjb3MoLXBpICogKDggKiBuICsgMSkgLyAoOC4wICogTiAqIDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpbigtcGkgKiAoOCAqIG4gKyAxKSAvICg4LjAgKiBOICogMikpKTsKLSAgICB9Ci0gIH0KLQotICB+S2lzc2ZmdENvbmZpZygpIHsKLSAgICBpZiAobnVsbHB0ciAhPSBmZnQpIHsKLSAgICAgIGRlbGV0ZSBmZnQ7Ci0gICAgfQotICAgIGlmIChudWxscHRyICE9IGluYnVmKSB7Ci0gICAgICBkZWxldGVbXSBpbmJ1ZjsKLSAgICB9Ci0gICAgaWYgKG51bGxwdHIgIT0gb3V0YnVmKSB7Ci0gICAgICBkZWxldGVbXSBvdXRidWY7Ci0gICAgfQotICAgIGlmIChudWxscHRyICE9IHR3aWRkbGUpIHsKLSAgICAgIGRlbGV0ZVtdIHR3aWRkbGU7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB0cmFuc2Zvcm0oKSB7Ci0gICAgaWYgKG51bGxwdHIgIT0gZmZ0KSB7Ci0gICAgICBmZnQtPnRyYW5zZm9ybShpbmJ1Ziwgb3V0YnVmKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogaW5idWY7Ci0gIHN0ZDo6Y29tcGxleDxkb3VibGU+KiBvdXRidWY7Ci0gIHN0ZDo6Y29tcGxleDxkb3VibGU+KiB0d2lkZGxlOwotICBraXNzZmZ0PGRvdWJsZT4qIGZmdDsKLX07Ci0KLSNlbGlmIGRlZmluZWQgVVNFX09XTl9GRlQKLSNpbmNsdWRlIDxjb21wbGV4PgotCi0jaW5jbHVkZSAiZmZ0LmgiCi0jZW5kaWYKLQotRGN0SVZEYmw6OkRjdElWRGJsKHVpbnQxNl90IE5GXykKLSAgICA6IE5GKE5GXyksIGluKG51bGxwdHIpLCBvdXQobnVsbHB0ciksIGRjdElWY29uZmlnKG51bGxwdHIpIHsKLSAgaW4gPSBuZXcgZG91YmxlW05GXTsKLSAgb3V0ID0gbmV3IGRvdWJsZVtORl07Ci0KLSNpZiBkZWZpbmVkIFVTRV9GRlRXCi0gIGRjdElWY29uZmlnID0gZmZ0d19wbGFuX3Iycl8xZChORiwgaW4sIG91dCwgRkZUV19SRURGVDExLCBGRlRXX0VTVElNQVRFKTsKLQotI2VsaWYgZGVmaW5lZCBVU0VfRkZUV19GT1JfRkZUCi0gIGRjdElWY29uZmlnID0gZmZ0d19wbGFuX2RmdF8xZChORiAvIDIsIHJlaW50ZXJwcmV0X2Nhc3Q8ZmZ0d19jb21wbGV4Kj4oaW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmZnR3X2NvbXBsZXgqPihvdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZUV19GT1JXQVJELCBGRlRXX0VTVElNQVRFKTsKLQotI2VsaWYgZGVmaW5lZCBVU0VfS0lTU0ZGVAotICBkY3RJVmNvbmZpZyA9IG5ldyBLaXNzZmZ0Q29uZmlnKE5GIC8gMik7Ci0KLSNlbGlmIGRlZmluZWQgVVNFX09XTl9GRlQKLQotICBpbnQgTiA9IE5GIC8gMjsKLSAgc3RkOjpjb21wbGV4PGRvdWJsZT4qIHR3aWRkbGUgPSBuZXcgc3RkOjpjb21wbGV4PGRvdWJsZT5bTl07Ci0gIGRjdElWY29uZmlnID0gdHdpZGRsZTsKLSAgY29uc3QgZG91YmxlIHBpID0gc3RkOjphY29zKC0xKTsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IE47IG4rKykgewotICAgIHR3aWRkbGVbbl0gPQotICAgICAgICBzdGQ6OmNvbXBsZXg8ZG91YmxlPihzdGQ6OmNvcygtcGkgKiAoOCAqIG4gKyAxKSAvICg4LjAgKiBOICogMikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpbigtcGkgKiAoOCAqIG4gKyAxKSAvICg4LjAgKiBOICogMikpKTsKLSAgfQotCi0jZW5kaWYKLQotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgTkY7IG4rKykgewotICAgIGluW25dID0gMDsKLSAgICBvdXRbbl0gPSAwOwotICB9Ci19Ci0KLURjdElWRGJsOjp+RGN0SVZEYmwoKSB7Ci0jaWYgZGVmaW5lZCBVU0VfRkZUVyB8fCBkZWZpbmVkIFVTRV9GRlRXX0ZPUl9GRlQKLSAgaWYgKG51bGxwdHIgIT0gZGN0SVZjb25maWcpIHsKLSAgICBmZnR3X2Rlc3Ryb3lfcGxhbihyZWludGVycHJldF9jYXN0PGZmdHdfcGxhbj4oZGN0SVZjb25maWcpKTsKLSAgfQotCi0jZWxpZiBkZWZpbmVkIFVTRV9LSVNTRkZUCi0gIGlmIChudWxscHRyICE9IGRjdElWY29uZmlnKSB7Ci0gICAgS2lzc2ZmdENvbmZpZyoga2lzc2ZmdENvbmZpZyA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8S2lzc2ZmdENvbmZpZyo+KGRjdElWY29uZmlnKTsKLSAgICBkZWxldGUga2lzc2ZmdENvbmZpZzsKLSAgfQotCi0jZWxpZiBkZWZpbmVkIFVTRV9PV05fRkZUCi0gIHN0ZDo6Y29tcGxleDxkb3VibGU+KiB0d2lkZGxlID0gKHN0ZDo6Y29tcGxleDxkb3VibGU+KilkY3RJVmNvbmZpZzsKLSAgZGVsZXRlW10gdHdpZGRsZTsKLQotI2VuZGlmCi0gIGlmIChudWxscHRyICE9IGluKSB7Ci0gICAgZGVsZXRlW10gaW47Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gb3V0KSB7Ci0gICAgZGVsZXRlW10gb3V0OwotICB9Ci19Ci0KLXZvaWQgRGN0SVZEaXJlY3REYmwodWludDE2X3QgTiwgY29uc3QgZG91YmxlKiBjb25zdCB0dywgZG91YmxlKiBjb25zdCBYKSB7Ci0gIGNvbnN0IGRvdWJsZSBwaSA9IHN0ZDo6YWNvcygtMSk7Ci0gIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBOOyBrKyspIHsKLSAgICBYW2tdID0gMDsKLSAgICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgTjsgbisrKSB7Ci0gICAgICBYW2tdICs9IHR3W25dICogc3RkOjpjb3MocGkgLyBOICogKG4gKyAwLjUpICogKGsgKyAwLjUpKTsKLSAgICB9Ci0gICAgWFtrXSAqPSAyOwotICB9Ci19Ci0KLXZvaWQgRGN0SVZEYmw6OnJ1bigpIHsKLSNpZmRlZiBVU0VfRkZUVwotICBmZnR3X2V4ZWN1dGUocmVpbnRlcnByZXRfY2FzdDxmZnR3X3BsYW4+KGRjdElWY29uZmlnKSk7Ci0KLSNlbGlmIGRlZmluZWQgVVNFX0ZGVFdfRk9SX0ZGVAotICBjb25zdCBkb3VibGUgcGkgPSBzdGQ6OmFjb3MoLTEpOwotICAvLyBhc3N1bWUgTkYgYmVpbmcgNCB0aW1lcyBhbiBpbnRlZ2VyCi0gIGZvciAodWludDE2X3QgbiA9IDE7IG4gPCBORiAvIDI7IG4gKz0gMikgewotICAgIGRvdWJsZSBidWZmZXI7Ci0gICAgYnVmZmVyID0gaW5bbl07Ci0gICAgaW5bbl0gPSBpbltORiAtIG5dOwotICAgIGluW05GIC0gbl0gPSBidWZmZXI7Ci0gIH0KLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IE5GOyBuICs9IDIpIHsKLSAgICBkb3VibGUgcmVhbCA9IGluW24gKyAwXTsKLSAgICBkb3VibGUgaW1hZyA9IGluW24gKyAxXTsKLSAgICBpbltuICsgMF0gPSByZWFsICogc3RkOjpjb3MoLXBpICogKDQgKiBuICsgMSkgLyAoOC4wICogTkYpKSAtCi0gICAgICAgICAgICAgICAgaW1hZyAqIHN0ZDo6c2luKC1waSAqICg0ICogbiArIDEpIC8gKDguMCAqIE5GKSk7Ci0gICAgaW5bbiArIDFdID0gcmVhbCAqIHN0ZDo6c2luKC1waSAqICg0ICogbiArIDEpIC8gKDguMCAqIE5GKSkgKwotICAgICAgICAgICAgICAgIGltYWcgKiBzdGQ6OmNvcygtcGkgKiAoNCAqIG4gKyAxKSAvICg4LjAgKiBORikpOwotICB9Ci0KLSAgZmZ0d19leGVjdXRlKHJlaW50ZXJwcmV0X2Nhc3Q8ZmZ0d19wbGFuPihkY3RJVmNvbmZpZykpOwotCi0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBORjsgbiArPSAyKSB7Ci0gICAgZG91YmxlIHJlYWwgPSBvdXRbbiArIDBdOwotICAgIGRvdWJsZSBpbWFnID0gb3V0W24gKyAxXTsKLSAgICBvdXRbbiArIDBdID0gMiAqIChyZWFsICogc3RkOjpjb3MoLXBpICogKDQgKiBuICsgMSkgLyAoOC4wICogTkYpKSAtCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZyAqIHN0ZDo6c2luKC1waSAqICg0ICogbiArIDEpIC8gKDguMCAqIE5GKSkpOwotICAgIG91dFtuICsgMV0gPSAyICogKHJlYWwgKiBzdGQ6OnNpbigtcGkgKiAoNCAqIG4gKyAxKSAvICg4LjAgKiBORikpICsKLSAgICAgICAgICAgICAgICAgICAgICBpbWFnICogc3RkOjpjb3MoLXBpICogKDQgKiBuICsgMSkgLyAoOC4wICogTkYpKSk7Ci0gIH0KLSAgZm9yICh1aW50MTZfdCBuID0gMTsgbiA8IE5GIC8gMjsgbiArPSAyKSB7Ci0gICAgZG91YmxlIGJ1ZmZlcjsKLSAgICBidWZmZXIgPSBvdXRbbl07Ci0gICAgb3V0W25dID0gLW91dFtORiAtIG5dOwotICAgIG91dFtORiAtIG5dID0gLWJ1ZmZlcjsKLSAgfQotCi0jZWxpZiBkZWZpbmVkIFVTRV9LSVNTRkZUCi0gIC8vIGFzc3VtZSBORiBiZWluZyA0IHRpbWVzIGFuIGludGVnZXIKLSAgS2lzc2ZmdENvbmZpZyoga2lzc2ZmdENvbmZpZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8S2lzc2ZmdENvbmZpZyo+KGRjdElWY29uZmlnKTsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IE5GIC8gMjsgbisrKSB7Ci0gICAga2lzc2ZmdENvbmZpZy0+aW5idWZbbl0gPQotICAgICAgICBraXNzZmZ0Q29uZmlnLT50d2lkZGxlW25dICoKLSAgICAgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4oaW5bMiAqIG5dLCBpbltORiAtIDIgKiBuIC0gMV0pOwotICB9Ci0KLSAga2lzc2ZmdENvbmZpZy0+dHJhbnNmb3JtKCk7Ci0KLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IE5GIC8gMjsgbisrKSB7Ci0gICAgc3RkOjpjb21wbGV4PGRvdWJsZT4gY29tcGxleE91dCA9Ci0gICAgICAgIGtpc3NmZnRDb25maWctPnR3aWRkbGVbbl0gKiBraXNzZmZ0Q29uZmlnLT5vdXRidWZbbl07Ci0gICAgb3V0WzIgKiBuXSA9IGNvbXBsZXhPdXQucmVhbCgpICogMjsKLSAgICBvdXRbTkYgLSAyICogbiAtIDFdID0gLWNvbXBsZXhPdXQuaW1hZygpICogMjsKLSAgfQotCi0jZWxpZiBkZWZpbmVkIFVTRV9PV05fRkZUCi0KLSAgZmZ0X2NvbXBsZXggaW5idWZbTkYgLyAyXTsKLSAgZmZ0X2NvbXBsZXggb3V0YnVmW05GIC8gMl07Ci0KLSAgLy8gYXNzdW1lIE5GIGJlaW5nIDQgdGltZXMgYW4gaW50ZWdlcgotICBmb3IgKHVpbnQxNl90IG4gPSAxOyBuIDwgTkYgLyAyOyBuICs9IDIpIHsKLSAgICBkb3VibGUgYnVmZmVyOwotICAgIGJ1ZmZlciA9IGluW25dOwotICAgIGluW25dID0gaW5bTkYgLSBuXTsKLSAgICBpbltORiAtIG5dID0gYnVmZmVyOwotICB9Ci0KLSAgc3RkOjpjb21wbGV4PGRvdWJsZT4qIHR3aWRkbGUgPSAoc3RkOjpjb21wbGV4PGRvdWJsZT4qKWRjdElWY29uZmlnOwotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgTkYgLyAyOyBuKyspIHsKLSAgICBkb3VibGUgcmVhbCA9IGluWzIgKiBuICsgMF07Ci0gICAgZG91YmxlIGltYWcgPSBpblsyICogbiArIDFdOwotICAgIGluWzIgKiBuICsgMF0gPSByZWFsICogdHdpZGRsZVtuXS5yZWFsKCkgLSBpbWFnICogdHdpZGRsZVtuXS5pbWFnKCk7Ci0gICAgaW5bMiAqIG4gKyAxXSA9IHJlYWwgKiB0d2lkZGxlW25dLmltYWcoKSArIGltYWcgKiB0d2lkZGxlW25dLnJlYWwoKTsKLSAgfQotCi0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBORiAvIDI7IG4rKykgewotICAgIGluYnVmW25dLnJlID0gaW5bMiAqIG5dOwotICAgIGluYnVmW25dLmltID0gaW5bMiAqIG4gKyAxXTsKLSAgfQotCi0gIGZmdF9jb21wbGV4KiBhY3RhbF9vdXRwdXQgPSBmZnQoZmFsc2UsIGluYnVmLCBORiAvIDIsIGluYnVmLCBvdXRidWYpOwotCi0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBORiAvIDI7IG4rKykgewotICAgIGRvdWJsZSByZWFsID0gYWN0YWxfb3V0cHV0W25dLnJlOwotICAgIGRvdWJsZSBpbWFnID0gYWN0YWxfb3V0cHV0W25dLmltOwotICAgIG91dFsyICogbiArIDBdID0gMiAqIChyZWFsICogdHdpZGRsZVtuXS5yZWFsKCkgLSBpbWFnICogdHdpZGRsZVtuXS5pbWFnKCkpOwotICAgIG91dFsyICogbiArIDFdID0gMiAqIChyZWFsICogdHdpZGRsZVtuXS5pbWFnKCkgKyBpbWFnICogdHdpZGRsZVtuXS5yZWFsKCkpOwotICB9Ci0KLSAgZm9yICh1aW50MTZfdCBuID0gMTsgbiA8IE5GIC8gMjsgbiArPSAyKSB7Ci0gICAgZG91YmxlIGJ1ZmZlcjsKLSAgICBidWZmZXIgPSBvdXRbbl07Ci0gICAgb3V0W25dID0gLW91dFtORiAtIG5dOwotICAgIG91dFtORiAtIG5dID0gLWJ1ZmZlcjsKLSAgfQotCi0jZWxzZQotICBEY3RJVkRpcmVjdERibChORiwgaW4sIG91dCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL0RjdElWLmhwcCBiL2VtYmRydi9sYzMvQ29tbW9uL0RjdElWLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0MGQyMy4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9EY3RJVi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogRGN0SVYuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRENUX0lWX0hfCi0jZGVmaW5lIERDVF9JVl9IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotY2xhc3MgRGN0SVZEYmwgewotIHB1YmxpYzoKLSAgRGN0SVZEYmwodWludDE2X3QgTkZfKTsKLSAgdmlydHVhbCB+RGN0SVZEYmwoKTsKLQotICB2b2lkIHJ1bigpOwotCi0gIGNvbnN0IHVpbnQxNl90IE5GOwotICBkb3VibGUqIGluOwotICBkb3VibGUqIG91dDsKLSAgdm9pZCogZGN0SVZjb25maWc7Ci19OwotCi0jZW5kaWYgIC8vIERDVF9JVl9IXwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9Db21tb24vTGMzQ29uZmlnLmNwcCBiL2VtYmRydi9sYzMvQ29tbW9uL0xjM0NvbmZpZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNThiMDQuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9Db21tb24vTGMzQ29uZmlnLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogTGMzQ29uZmlnLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi1MYzNDb25maWc6OkxjM0NvbmZpZyh1aW50MTZfdCBGc18sIEZyYW1lRHVyYXRpb24gTl9tc18sIHVpbnQ4X3QgTmNfKQotICAgIDogZXJyb3JTdGF0dXMoRVJST1JfRlJFRSksCi0gICAgICBGcyhGc18pLAotICAgICAgRnNfaW5kKGdldEZzX2luZChGcykpLAotICAgICAgTl9tcyhOX21zXyksCi0gICAgICBORihnZXRORihGcywgTl9tc18pKSwKLSAgICAgIE5FKGdldE5FKE5GLCBOX21zXykpLAotICAgICAgWigoTl9tcyA9PSBGcmFtZUR1cmF0aW9uOjpkMTBtcykgPyAzICogTkYgLyA4IDogNyAqIE5GIC8gMzApLAotICAgICAgTmMoTmNfKSwKLSAgICAgIE5fYigoKE5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkN3A1bXMpICYmIChGcyA9PSA4MDAwKSkgPyA2MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY0KSB7Ci0gIGlmICgwID09IE5jKSAgLy8gd2UgZG8gbm90IHJlc3RyaWN0IHRoZSBtYXhpbXVtIHlldCAobmF0dXJhbGx5IGxpbWl0ZWQgdG8gMjU1Ci0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBvZiB0aGUgY2hvc2VuIGRhdGF0eXBlKQotICB7Ci0gICAgZXJyb3JTdGF0dXMgfD0gSU5WQUxJRF9OVU1CRVJfT0ZfQ0hBTk5FTFM7Ci0gIH0KLX0KLQotTGMzQ29uZmlnOjp+TGMzQ29uZmlnKCkge30KLQotYm9vbCBMYzNDb25maWc6OmlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBFUlJPUl9GUkVFID09IGVycm9yU3RhdHVzOyB9Ci0KLXVpbnQ4X3QgTGMzQ29uZmlnOjpnZXRFcnJvclN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIGVycm9yU3RhdHVzOyB9Ci0KLXVpbnQ4X3QgTGMzQ29uZmlnOjpnZXRGc19pbmQodWludDE2X3QgRnMpIHsKLSAgdWludDhfdCBmc19pbmQgPSAwOwotICBzd2l0Y2ggKEZzKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgZnNfaW5kID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICBmc19pbmQgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDAwMDoKLSAgICAgIGZzX2luZCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgZnNfaW5kID0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDQxMDA6OwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICBmc19pbmQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yU3RhdHVzIHw9IElOVkFMSURfU0FNUExJTkdfUkFURTsKLSAgfQotICByZXR1cm4gZnNfaW5kOwotfQotCi11aW50MTZfdCBMYzNDb25maWc6OmdldE5GKHVpbnQxNl90IEZzLCBGcmFtZUR1cmF0aW9uIE5fbXMpIHsKLSAgdWludDE2X3QgTkYgPSA4MDsKLSAgaWYgKEZyYW1lRHVyYXRpb246OmQxMG1zID09IE5fbXMpIHsKLSAgICBzd2l0Y2ggKEZzKSB7Ci0gICAgICBjYXNlIDgwMDA6Ci0gICAgICAgIE5GID0gODA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgTkYgPSAxNjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgTkYgPSAyNDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgTkYgPSAzMjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0NDEwMDo7Ci0gICAgICBjYXNlIDQ4MDAwOgotICAgICAgICBORiA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnJvclN0YXR1cyB8PSBJTlZBTElEX1NBTVBMSU5HX1JBVEU7Ci0gICAgfQotICB9IGVsc2UgaWYgKEZyYW1lRHVyYXRpb246OmQ3cDVtcyA9PSBOX21zKSB7Ci0gICAgc3dpdGNoIChGcykgewotICAgICAgY2FzZSA4MDAwOgotICAgICAgICBORiA9IDYwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIE5GID0gMTIwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIE5GID0gMTgwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIE5GID0gMjQwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDQxMDA6OwotICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgTkYgPSAzNjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXJyb3JTdGF0dXMgfD0gSU5WQUxJRF9TQU1QTElOR19SQVRFOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBuZXZlciBzaG91bGQgcmVhY2ggdGhpcyBsaW5lIHVubGVzcwotICAgIC8vIHN0cmFuZ2UgdGhpbmdzIGhhcHBlbi4gSG93ZXZlciwgd2Ugd2FudAotICAgIC8vIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgYW5kIHRodXMgaGFuZGxlCi0gICAgLy8gdGhpcyBjYXNlIGV4cGxpY2l0bHkuCi0gICAgZXJyb3JTdGF0dXMgfD0gSU5WQUxJRF9GUkFNRV9EVVJBVElPTjsKLSAgfQotICByZXR1cm4gTkY7Ci19Ci0KLXVpbnQxNl90IExjM0NvbmZpZzo6Z2V0TkUodWludDE2X3QgTkYsIEZyYW1lRHVyYXRpb24gTl9tcykgewotICAvLyAzLjMuNC4zIFRpbWUtRnJlcXVlbmN5IFRyYW5zZm9ybWF0aW9uIChkMDlyMDRfKmltcGxlbWVudG9yQ29tbWVudHMqKQotICBpZiAoRnJhbWVEdXJhdGlvbjo6ZDEwbXMgPT0gTl9tcykgewotICAgIHJldHVybiAoNDgwID09IE5GKSA/IDQwMCA6IE5GOwotICB9IGVsc2UgewotICAgIHJldHVybiAoMzYwID09IE5GKSA/IDMwMCA6IE5GOwotICB9Ci19Ci0KLXVpbnQxNl90IExjM0NvbmZpZzo6Z2V0Qnl0ZUNvdW50RnJvbUJpdHJhdGUodWludDMyX3QgYml0cmF0ZSkgY29uc3QgewotICAvLyBTZWN0aW9uIDMuMi41IEJpdCBidWRnZXQgYW5kIGJpdHJhdGUgKExDM19TcGVjaWZpY2F0aW9uX2QwOXIwNikKLSAgZG91YmxlIGZfc2NhbCA9IGdldEZzY2FsKCk7Ci0gIGRvdWJsZSBOX21zX3ZhbHVlID0gZ2V0Tm1zVmFsdWUoKTsKLSAgcmV0dXJuIGZsb29yKChiaXRyYXRlICogTl9tc192YWx1ZSAqIGZfc2NhbCkgLyA4MDAwLjApOwotfQotCi11aW50MzJfdCBMYzNDb25maWc6OmdldEJpdHJhdGVGcm9tQnl0ZUNvdW50KHVpbnQxNl90IG5ieXRlcykgY29uc3QgewotICAvLyBTZWN0aW9uIDMuMi41IEJpdCBidWRnZXQgYW5kIGJpdHJhdGUgKExDM19TcGVjaWZpY2F0aW9uX2QxLjByMDMpCi0gIC8vIE5vdGVzOgotICAvLyAgLSB0aGlzIGltcGxlbWVudGF0aW9uIGluY2x1ZGVzIEVycmF0YSAxNTA1MQotICAvLyAgLSB0aGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgbm90IHVzZWQgd2l0aGluIHRoZSBMQzMgY29kZSBzbyBmYXIsIGJ1dAotICAvLyAgICBwcm92aWRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MKLSAgZG91YmxlIGZfc2NhbCA9IGdldEZzY2FsKCk7Ci0gIGRvdWJsZSBOX21zX3ZhbHVlID0gZ2V0Tm1zVmFsdWUoKTsKLSAgcmV0dXJuIGNlaWwoKDgwMDAuMCAqIG5ieXRlcykgLyAoTl9tc192YWx1ZSAqIGZfc2NhbCkpOwotfQotCi1kb3VibGUgTGMzQ29uZmlnOjpnZXRGc2NhbCgpIGNvbnN0IHsKLSAgLy8gU2VjdGlvbiAzLjIuMiBTYW1wbGluZyByYXRlcyAoTEMzX1NwZWNpZmljYXRpb25fZDEuMHIwMykKLSAgcmV0dXJuICg0NDEwMCA9PSBGcykgPyA0ODAwMC4wIC8gNDQxMDAuMCA6IDEuMDsKLX0KLQotZG91YmxlIExjM0NvbmZpZzo6Z2V0Tm1zVmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiAoRnJhbWVEdXJhdGlvbjo6ZDEwbXMgPT0gTl9tcykgPyAxMC4wIDogNy41OwotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL0JhbmRJbmRleFRhYmxlcy5jcHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvQmFuZEluZGV4VGFibGVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiYzNiYS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvQmFuZEluZGV4VGFibGVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBCYW5kSW5kZXhUYWJsZXMuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjEgQmFuZCBUYWJsZXMgSW5kZXggSV9mcwotI2luY2x1ZGUgIkJhbmRJbmRleFRhYmxlcy5ocHAiCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgODYgb2YgMTc3Ci0vLyBMQzMgU3BlY2lmaWNhdGlvbiBTZWN0aW9uIDMuNy4yIChkMDlyMDRfKmltcGxlbWVudG9yQ29tbWVudHMqKQotLy8gUGFnZSAxMTUgb2YgMjU2Ci0vLyBCYW5kIHRhYmxlcyBpbmRleCBJX2ZzIGZvciAxMCBtcyBmcmFtZSBkdXJhdGlvbgotaW50IElfODAwMFs2NV0gPSB7MCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsCi0gICAgICAgICAgICAgICAgICAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKLSAgICAgICAgICAgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LAotICAgICAgICAgICAgICAgICAgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MSwgNTMsCi0gICAgICAgICAgICAgICAgICA1NSwgNTcsIDU5LCA2MSwgNjMsIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA4MH07Ci1pbnQgSV8xNjAwMFs2NV0gPSB7MCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLAotICAgICAgICAgICAgICAgICAgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAyMSwKLSAgICAgICAgICAgICAgICAgICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDMwLCAgMzIsICAzNCwgMzYsCi0gICAgICAgICAgICAgICAgICAgMzgsICA0MCwgIDQyLCAgNDQsICA0NiwgIDQ4LCAgNTAsICA1MiwgIDU1LCAgNTgsIDYxLAotICAgICAgICAgICAgICAgICAgIDY0LCAgNjcsICA3MCwgIDczLCAgNzYsICA4MCwgIDg0LCAgODgsICA5MiwgIDk2LCAxMDEsCi0gICAgICAgICAgICAgICAgICAgMTA2LCAxMTEsIDExNiwgMTIxLCAxMjcsIDEzMywgMTM5LCAxNDYsIDE1MywgMTYwfTsKLWludCBJXzI0MDAwWzY1XSA9IHswLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgIDEwLAotICAgICAgICAgICAgICAgICAgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsCi0gICAgICAgICAgICAgICAgICAgMjIsICAyMywgIDI1LCAgMjcsICAyOSwgIDMxLCAgMzMsICAzNSwgIDM3LCAgMzksICA0MSwKLSAgICAgICAgICAgICAgICAgICA0MywgIDQ2LCAgNDksICA1MiwgIDU1LCAgNTgsICA2MSwgIDY0LCAgNjgsICA3MiwgIDc2LAotICAgICAgICAgICAgICAgICAgIDgwLCAgODUsICA5MCwgIDk1LCAgMTAwLCAxMDYsIDExMiwgMTE4LCAxMjUsIDEzMiwgMTM5LAotICAgICAgICAgICAgICAgICAgIDE0NywgMTU1LCAxNjQsIDE3MywgMTgzLCAxOTMsIDIwNCwgMjE1LCAyMjcsIDI0MH07Ci1pbnQgSV8zMjAwMFs2NV0gPSB7MCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgICAxMCwKLSAgICAgICAgICAgICAgICAgICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIyLAotICAgICAgICAgICAgICAgICAgIDI0LCAgMjYsICAyOCwgIDMwLCAgMzIsICAzNCwgIDM2LCAgMzgsICA0MSwgIDQ0LCAgNDcsCi0gICAgICAgICAgICAgICAgICAgNTAsICA1MywgIDU2LCAgNjAsICA2NCwgIDY4LCAgNzIsICA3NiwgIDgxLCAgODYsICA5MSwKLSAgICAgICAgICAgICAgICAgICA5NywgIDEwMywgMTA5LCAxMTYsIDEyMywgMTMxLCAxMzksIDE0OCwgMTU3LCAxNjYsIDE3NiwKLSAgICAgICAgICAgICAgICAgICAxODcsIDE5OSwgMjExLCAyMjQsIDIzOCwgMjUyLCAyNjgsIDI4NCwgMzAyLCAzMjB9OwotaW50IElfNDgwMDBbNjVdID0gezAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAgMTAsCi0gICAgICAgICAgICAgICAgICAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDIwLCAgMjIsICAyNCwKLSAgICAgICAgICAgICAgICAgICAyNiwgIDI4LCAgMzAsICAzMiwgIDM0LCAgMzYsICAzOSwgIDQyLCAgNDUsICA0OCwgIDUxLAotICAgICAgICAgICAgICAgICAgIDU1LCAgNTksICA2MywgIDY3LCAgNzEsICA3NiwgIDgxLCAgODYsICA5MiwgIDk4LCAgMTA1LAotICAgICAgICAgICAgICAgICAgIDExMiwgMTE5LCAxMjcsIDEzNSwgMTQ0LCAxNTQsIDE2NCwgMTc1LCAxODYsIDE5OCwgMjExLAotICAgICAgICAgICAgICAgICAgIDIyNSwgMjQwLCAyNTYsIDI3MywgMjkxLCAzMTAsIDMzMCwgMzUyLCAzNzUsIDQwMH07Ci0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIFNlY3Rpb24gMy43LjIgKGQwOXIwNF8qaW1wbGVtZW50b3JDb21tZW50cyopCi0vLyBQYWdlIDExNS8xMTYgb2YgMjU2Ci0vLyBCYW5kIHRhYmxlcyBpbmRleCBJX2ZzIGZvciA3LjUgbXMgZnJhbWUgZHVyYXRpb24KLWludCBJXzgwMDBfN3A1bXNbNjFdID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLAotICAgICAgICAgICAgICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MH07Ci1pbnQgSV8xNjAwMF83cDVtc1s2NV0gPSB7Ci0gICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgICAxMCwgIDExLCAgMTIsICAxMywgMTQsIDE1LCAxNiwKLSAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAzMSwgMzIsIDMzLAotICAgIDM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTAsIDUyLCAgNTQsICA1NiwgIDU4LCAgNjAsIDYyLCA2NSwgNjgsCi0gICAgNzEsIDc0LCA3NywgODAsIDgzLCA4NiwgOTAsIDk0LCA5OCwgMTAyLCAxMDYsIDExMCwgMTE1LCAxMjB9OwotaW50IElfMjQwMDBfN3A1bXNbNjVdID0gezAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOSwgIDMxLCAgMzMsICAzNSwgIDM3LAotICAgICAgICAgICAgICAgICAgICAgICAgIDM5LCAgNDEsICA0MywgIDQ1LCAgNDcsICA0OSwgIDUyLCAgNTUsICA1OCwgIDYxLCAgNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgNjcsICA3MCwgIDc0LCAgNzgsICA4MiwgIDg2LCAgOTAsICA5NSwgIDEwMCwgMTA1LCAxMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTE1LCAxMjEsIDEyNywgMTM0LCAxNDEsIDE0OCwgMTU1LCAxNjMsIDE3MSwgMTgwfTsKLWludCBJXzMyMDAwXzdwNW1zWzY1XSA9IHswLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgIDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMjIsICAyMywgIDI0LCAgMjYsICAyOCwgIDMwLCAgMzIsICAzNCwgIDM2LCAgMzgsICA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA0MiwgIDQ1LCAgNDgsICA1MSwgIDU0LCAgNTcsICA2MCwgIDYzLCAgNjcsICA3MSwgIDc1LAotICAgICAgICAgICAgICAgICAgICAgICAgIDc5LCAgODQsICA4OSwgIDk0LCAgOTksICAxMDUsIDExMSwgMTE3LCAxMjQsIDEzMSwgMTM4LAotICAgICAgICAgICAgICAgICAgICAgICAgIDE0NiwgMTU0LCAxNjMsIDE3MiwgMTgyLCAxOTIsIDIwMywgMjE1LCAyMjcsIDI0MH07Ci1pbnQgSV80ODAwMF83cDVtc1s2NV0gPSB7MCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgICAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLAotICAgICAgICAgICAgICAgICAgICAgICAgIDIyLCAgMjQsICAyNiwgIDI4LCAgMzAsICAzMiwgIDM0LCAgMzYsICAzOCwgIDQwLCAgNDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgNDYsICA0OSwgIDUyLCAgNTUsICA1OSwgIDYzLCAgNjcsICA3MSwgIDc1LCAgODAsICA4NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICA5MCwgIDk2LCAgMTAyLCAxMDgsIDExNSwgMTIyLCAxMjksIDEzNywgMTQ2LCAxNTUsIDE2NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxNzUsIDE4NiwgMTk3LCAyMDksIDIyMiwgMjM2LCAyNTEsIDI2NiwgMjgzLCAzMDB9OwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL0JhbmRJbmRleFRhYmxlcy5ocHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvQmFuZEluZGV4VGFibGVzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNzczNC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvQmFuZEluZGV4VGFibGVzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBCYW5kSW5kZXhUYWJsZXMuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQkFORF9JTkRFWF9UQUJMRVNfSF8KLSNkZWZpbmUgQkFORF9JTkRFWF9UQUJMRVNfSF8KLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZgotLy8gU2VjdGlvbiA1LjcuMSBCYW5kIFRhYmxlcyBJbmRleCBJX2ZzCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwNF8qaW1wbGVtZW50b3JDb21tZW50cyoKLS8vIFNlY3Rpb24gMy43LjEgQmFuZCB0YWJsZXMgaW5kZXggSV9mcyBmb3IgMTAgbXMgZnJhbWUgZHVyYXRpb24KLQotZXh0ZXJuIGludCBJXzgwMDBbNjVdOwotZXh0ZXJuIGludCBJXzE2MDAwWzY1XTsKLWV4dGVybiBpbnQgSV8yNDAwMFs2NV07Ci1leHRlcm4gaW50IElfMzIwMDBbNjVdOwotZXh0ZXJuIGludCBJXzQ4MDAwWzY1XTsKLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjA0XyppbXBsZW1lbnRvckNvbW1lbnRzKgotLy8gU2VjdGlvbiAzLjcuMiBCYW5kIHRhYmxlcyBpbmRleCBJX2ZzIGZvciA3LjUgbXMgZnJhbWUgZHVyYXRpb24KLQotZXh0ZXJuIGludCBJXzgwMDBfN3A1bXNbNjFdOwotZXh0ZXJuIGludCBJXzE2MDAwXzdwNW1zWzY1XTsKLWV4dGVybiBpbnQgSV8yNDAwMF83cDVtc1s2NV07Ci1leHRlcm4gaW50IElfMzIwMDBfN3A1bXNbNjVdOwotZXh0ZXJuIGludCBJXzQ4MDAwXzdwNW1zWzY1XTsKLQotI2VuZGlmICAvLyBCQU5EX0lOREVYX1RBQkxFU19IXwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL0xvbmdUZXJtUG9zdGZpbHRlckNvZWZmaWNpZW50cy5jcHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTG9uZ1Rlcm1Qb3N0ZmlsdGVyQ29lZmZpY2llbnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQwYWUyMC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTG9uZ1Rlcm1Qb3N0ZmlsdGVyQ29lZmZpY2llbnRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogTG9uZ1Rlcm1Qb3N0ZmlsdGVyQ29lZmZpY2llbnRzLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmCi0vLyBTZWN0aW9uIDUuNy41IExvbmcgVGVybSBQb3N0ZmlsdGVyaW5nCi0jaW5jbHVkZSAiTG9uZ1Rlcm1Qb3N0ZmlsdGVyQ29lZmZpY2llbnRzLmhwcCIKLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMTAgb2YgMTc3Ci1kb3VibGUgdGFiX3Jlc2FtcF9maWx0ZXJbMjM5XSA9IHsKLSAgICAtMi4wNDMwNTU4MzI4NzkxMDhlLTA1LCAtNC40NjM0NTg5MzY3NTcwODFlLTA1LCAtNy4xNjM2NjM5OTQ0ODE0NTllLTA1LAotICAgIC0xLjAwMTAxMTEzMjY1NTkxNGUtMDQsIC0xLjI4MzcyODQ4MDY2MDM5NWUtMDQsIC0xLjU0NTQzODI5NzcwNDY2MmUtMDQsCi0gICAgLTEuNzY1NDQ1NjcxMjU3NjY4ZS0wNCwgLTEuOTIyNTY5NTk5NTg0ODAyZS0wNCwgLTEuOTk2NDM4MTkyNTAwMzgyZS0wNCwKLSAgICAtMS45Njg4ODY4NTY0MDA1NDdlLTA0LCAtMS44MjUzODMzMTg4MzQ2OTBlLTA0LCAtMS41NTYzOTQyNjYwNDY4MDNlLTA0LAotICAgIC0xLjE1ODYwMzY1MTc5MjYzOGUtMDQsIC02LjM1ODkzMDMzNTM0ODk3N2UtMDUsICsyLjgxMDA2NDc5NTA2Nzc4NmUtMTksCi0gICAgKzcuMjkyMTgwMjEzMDAxMzM3ZS0wNSwgKzEuNTIzOTcwNzU3NjQ0MjcyZS0wNCwgKzIuMzQ5MjA3NzY5ODk4OTA2ZS0wNCwKLSAgICArMy4xNjM3ODY0OTYyNjUyNjllLTA0LCArMy45MjIxMTczODA4OTQ3MzZlLTA0LCArNC41NzYyMzg0OTEwNjQzOTJlLTA0LAotICAgICs1LjA3ODI0MjkzNjcwNDg2NGUtMDQsICs1LjM4Mjk1NTIzMTA0NTkxNWUtMDQsICs1LjQ1MDcyOTE3NjE3NTg3NWUtMDQsCi0gICAgKzUuMjUwMjIxNTQ4MjcwOTgyZS0wNCwgKzQuNzYwOTg0MjQyOTQ3MzQ5ZS0wNCwgKzMuOTc1NzEzNzk5MjY0NzkxZS0wNCwKLSAgICArMi45MDIwMDIxNzI5MDcxODBlLTA0LCArMS41NjM0NDY2Njk5NzU2MTVlLTA0LCAtNS44MTg4MDE0MTY5MjM1ODBlLTE5LAotICAgIC0xLjczMjUyNzEyNzg5ODA1MmUtMDQsIC0zLjU2Mzg1OTY1MzMwMDc2MGUtMDQsIC01LjQxMTU1MjMwODgwMTE0N2UtMDQsCi0gICAgLTcuMTg0MTQwMjI5Njc1MDIwZS0wNCwgLTguNzg1MDUyMzE1OTYzODU0ZS0wNCwgLTEuMDExNzE0NTEzNjk3MjgyZS0wMywKLSAgICAtMS4xMDg3NjcwNTU2MzIzMDRlLTAzLCAtMS4xNjEzNDUyMjA0ODM5OTZlLTAzLCAtMS4xNjI2MDE2OTQ0NjQ2MjBlLTAzLAotICAgIC0xLjEwNzY0MDk3NDE0ODIyMWUtMDMsIC05LjkzOTQxNTYzMTU2MzAxNWUtMDQsIC04LjIxNjkyMTg5ODUxMzIyNWUtMDQsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMTEgb2YgMTc3Ci0gICAgLTUuOTQwMTc3NjU3OTI1OTA4ZS0wNCwgLTMuMTcwNzQ2NTM1MzgyNzI4ZS0wNCwgKzkuNzQ2OTUwODE4Nzc5NTM0ZS0xOSwKLSAgICArMy40NTI5Mzc2MDQyMjg5NDdlLTA0LCArNy4wNDQ4MDg3MDU0NTg3MDVlLTA0LCArMS4wNjEzMzQ0NjU2NjI5NjRlLTAzLAotICAgICsxLjM5ODM3NDczNDQ4ODU0OWUtMDMsICsxLjY5NzYzMDc5OTM1MDUyNGUtMDMsICsxLjk0MTQ4Njc0ODczMTY2MGUtMDMsCi0gICAgKzIuMTEzNTc1OTA2NjY5MzU1ZS0wMywgKzIuMTk5NjgyNDUyMTc5OTY0ZS0wMywgKzIuMTg4NjA2MjQ2NTE3NjI5ZS0wMywKLSAgICArMi4wNzI5NDU0NTg5NzMyOTVlLTAzLCArMS44NDk3NTI0OTEzMTM5MDhlLTAzLCArMS41MjEwMjE4NzY5MDg3MzhlLTAzLAotICAgICsxLjA5Mzk3NDI1NTAxNjg0OWUtMDMsICs1LjgxMTA4MDYyNDQyNjE2NGUtMDQsIC0xLjQyMjQ4MjY1NjM5ODk5OWUtMTgsCi0gICAgLTYuMjcxNTM3MzAzMjI4MjA0ZS0wNCwgLTEuMjc0MjUxNDA0OTEzNDQ3ZS0wMywgLTEuOTEyMjM4Mzg5ODUwMTgyZS0wMywKLSAgICAtMi41MTAyNjkyNDkzODA3NjRlLTAzLCAtMy4wMzcwMzgyOTg2Mjk4MjVlLTAzLCAtMy40NjIyMjY4NzExMDE1MzVlLTAzLAotICAgIC0zLjc1ODAwNjcxOTU5NjQ3M2UtMDMsIC0zLjkwMDUzMjQ2Njk0ODQwOWUtMDMsIC0zLjg3MTM1MjMwOTg5NTgzOGUtMDMsCi0gICAgLTMuNjU4NjY1NTgzNjc5NzIyZS0wMywgLTMuMjU4MzU4NTEyNjQ2ODQ2ZS0wMywgLTIuNjc0NzU1NTUxNTA4MzQ5ZS0wMywKLSAgICAtMS45MjEwMzMwNTQzNjg0NTZlLTAzLCAtMS4wMTkyNTQzMjY4Mzg2NDBlLTAzLCArMS44Njk2MjM2OTA4OTU1OTNlLTE4LAotICAgICsxLjA5ODQxNTQ0NjczMjI2M2UtMDMsICsyLjIzMTEzMTk3MzUzMjgyM2UtMDMsICszLjM0ODMwOTI3Mjc2ODgzNWUtMDMsCi0gICAgKzQuMzk3MDIyNzc0Mzg2NTEwZS0wMywgKzUuMzIzNDI2NzIyNjQ0OTAwZS0wMywgKzYuMDc1MTA1MzEwMzY4NzAwZS0wMywKLSAgICArNi42MDM1MjAyNDc1NTIxMTNlLTAzLCArNi44NjY0NTM5ODcxOTMwMjdlLTAzLCArNi44MzAzNDI2OTU5MDY5NDZlLTAzLAotICAgICs2LjQ3MjM5MjM0MzU0OTQyNGUtMDMsICs1Ljc4MjM3NTIxMzk1NjM3NGUtMDMsICs0Ljc2NDAxMjcyNjM4OTczOWUtMDMsCi0gICAgKzMuNDM1ODYzNTE0MTEzNDY3ZS0wMywgKzEuODMxNjUyODM1NDA2NjU3ZS0wMywgLTIuMjUxODk4MzcyODM4NjYzZS0xOCwKLSAgICAtMS45OTY0NzYxODgyNzkzNzBlLTAzLCAtNC4wODI2Njg4NTg5MTkxMDBlLTAzLCAtNi4xNzMwODAzNzQ5Mjk0MjRlLTAzLAotICAgIC04LjE3NDQ0ODk0NTk3NDIwOGUtMDMsIC05Ljk4ODgyMzg2NDMzMjY5MWUtMDMsIC0xLjE1MTY5ODcwNTgxOTk5MGUtMDIsCi0gICAgLTEuMjY2MjEwMDU2MDYzOTYzZS0wMiwgLTEuMzMzMzQ0NTc5NTE4NDgxZS0wMiwgLTEuMzQ1MDExMTk5MzQzOTM0ZS0wMiwKLSAgICAtMS4yOTQ0NDg4MDk2MzkxNTRlLTAyLCAtMS4xNzY1NDE1NDMwMDI5MjRlLTAyLCAtOS44ODA4NjczMjA0MDEyOTRlLTAzLAotICAgIC03LjI4MDAzNjQwMjM5MjA4MmUtMDMsIC0zLjk3NDczMDIwOTE1MTgwN2UtMDMsICsyLjUwOTYxNzc3NzI1MDM5MWUtMTgsCi0gICAgKzQuNTg2MDQ0MjE5NzE3NDY3ZS0wMywgKzkuNzAzMjQ4OTk4MzgzNjc5ZS0wMywgKzEuNTI1MTI0NzcwODE4MDEwZS0wMiwKLSAgICArMi4xMTEyMDU4NTQwMTMwMTdlLTAyLCArMi43MTUzMzcyMzYwOTQxMzdlLTAyLCArMy4zMjMyNDI0NTA4NDMxMTRlLTAyLAotICAgICszLjkyMDAzMjAyOTAyMDEzMGUtMDIsICs0LjQ5MDY2NjQ0MzQyNjc4NmUtMDIsICs1LjAyMDQzMzA4ODAxNzg0NmUtMDIsCi0gICAgKzUuNDk1NDIwMTcyNjgxNTU4ZS0wMiwgKzUuOTAyOTcwMzI0Mzc1OTA4ZS0wMiwgKzYuMjMyMDk3MjcwNjcyOTc2ZS0wMiwKLSAgICArNi40NzM4NTAyMjUyNjA3MzFlLTAyLCArNi42MjE2MTI0NTA4NDA4NThlLTAyLCArNi42NzEzMjI4NzE2MTk2MTJlLTAyLAotICAgICs2LjYyMTYxMjQ1MDg0MDg1OGUtMDIsICs2LjQ3Mzg1MDIyNTI2MDczMWUtMDIsICs2LjIzMjA5NzI3MDY3Mjk3NmUtMDIsCi0gICAgKzUuOTAyOTcwMzI0Mzc1OTA4ZS0wMiwgKzUuNDk1NDIwMTcyNjgxNTU4ZS0wMiwgKzUuMDIwNDMzMDg4MDE3ODQ2ZS0wMiwKLSAgICArNC40OTA2NjY0NDM0MjY3ODZlLTAyLCArMy45MjAwMzIwMjkwMjAxMzBlLTAyLCArMy4zMjMyNDI0NTA4NDMxMTRlLTAyLAotICAgICsyLjcxNTMzNzIzNjA5NDEzN2UtMDIsICsyLjExMTIwNTg1NDAxMzAxN2UtMDIsICsxLjUyNTEyNDc3MDgxODAxMGUtMDIsCi0gICAgKzkuNzAzMjQ4OTk4MzgzNjc5ZS0wMywgKzQuNTg2MDQ0MjE5NzE3NDY3ZS0wMywgKzIuNTA5NjE3Nzc3MjUwMzkxZS0xOCwKLSAgICAtMy45NzQ3MzAyMDkxNTE4MDdlLTAzLCAtNy4yODAwMzY0MDIzOTIwODJlLTAzLCAtOS44ODA4NjczMjA0MDEyOTRlLTAzLAotICAgIC0xLjE3NjU0MTU0MzAwMjkyNGUtMDIsIC0xLjI5NDQ0ODgwOTYzOTE1NGUtMDIsIC0xLjM0NTAxMTE5OTM0MzkzNGUtMDIsCi0gICAgLTEuMzMzMzQ0NTc5NTE4NDgxZS0wMiwgLTEuMjY2MjEwMDU2MDYzOTYzZS0wMiwgLTEuMTUxNjk4NzA1ODE5OTkwZS0wMiwKLSAgICAtOS45ODg4MjM4NjQzMzI2OTFlLTAzLCAtOC4xNzQ0NDg5NDU5NzQyMDhlLTAzLCAtNi4xNzMwODAzNzQ5Mjk0MjRlLTAzLAotICAgIC00LjA4MjY2ODg1ODkxOTEwMGUtMDMsIC0xLjk5NjQ3NjE4ODI3OTM3MGUtMDMsIC0yLjI1MTg5ODM3MjgzODY2M2UtMTgsCi0gICAgKzEuODMxNjUyODM1NDA2NjU3ZS0wMywgKzMuNDM1ODYzNTE0MTEzNDY3ZS0wMywgKzQuNzY0MDEyNzI2Mzg5NzM5ZS0wMywKLSAgICArNS43ODIzNzUyMTM5NTYzNzRlLTAzLCArNi40NzIzOTIzNDM1NDk0MjRlLTAzLCArNi44MzAzNDI2OTU5MDY5NDZlLTAzLAotICAgICs2Ljg2NjQ1Mzk4NzE5MzAyN2UtMDMsICs2LjYwMzUyMDI0NzU1MjExM2UtMDMsICs2LjA3NTEwNTMxMDM2ODcwMGUtMDMsCi0gICAgKzUuMzIzNDI2NzIyNjQ0OTAwZS0wMywgKzQuMzk3MDIyNzc0Mzg2NTEwZS0wMywgKzMuMzQ4MzA5MjcyNzY4ODM1ZS0wMywKLSAgICArMi4yMzExMzE5NzM1MzI4MjNlLTAzLCArMS4wOTg0MTU0NDY3MzIyNjNlLTAzLCArMS44Njk2MjM2OTA4OTU1OTNlLTE4LAotICAgIC0xLjAxOTI1NDMyNjgzODY0MGUtMDMsIC0xLjkyMTAzMzA1NDM2ODQ1NmUtMDMsIC0yLjY3NDc1NTU1MTUwODM0OWUtMDMsCi0gICAgLTMuMjU4MzU4NTEyNjQ2ODQ2ZS0wMywgLTMuNjU4NjY1NTgzNjc5NzIyZS0wMywgLTMuODcxMzUyMzA5ODk1ODM4ZS0wMywKLSAgICAtMy45MDA1MzI0NjY5NDg0MDllLTAzLCAtMy43NTgwMDY3MTk1OTY0NzNlLTAzLCAtMy40NjIyMjY4NzExMDE1MzVlLTAzLAotICAgIC0zLjAzNzAzODI5ODYyOTgyNWUtMDMsIC0yLjUxMDI2OTI0OTM4MDc2NGUtMDMsIC0xLjkxMjIzODM4OTg1MDE4MmUtMDMsCi0gICAgLTEuMjc0MjUxNDA0OTEzNDQ3ZS0wMywgLTYuMjcxNTM3MzAzMjI4MjA0ZS0wNCwgLTEuNDIyNDgyNjU2Mzk4OTk5ZS0xOCwKLSAgICArNS44MTEwODA2MjQ0MjYxNjRlLTA0LCArMS4wOTM5NzQyNTUwMTY4NDllLTAzLCArMS41MjEwMjE4NzY5MDg3MzhlLTAzLAotICAgICsxLjg0OTc1MjQ5MTMxMzkwOGUtMDMsICsyLjA3Mjk0NTQ1ODk3MzI5NWUtMDMsICsyLjE4ODYwNjI0NjUxNzYyOWUtMDMsCi0gICAgKzIuMTk5NjgyNDUyMTc5OTY0ZS0wMywgKzIuMTEzNTc1OTA2NjY5MzU1ZS0wMywgKzEuOTQxNDg2NzQ4NzMxNjYwZS0wMywKLSAgICArMS42OTc2MzA3OTkzNTA1MjRlLTAzLCArMS4zOTgzNzQ3MzQ0ODg1NDllLTAzLCArMS4wNjEzMzQ0NjU2NjI5NjRlLTAzLAotICAgICs3LjA0NDgwODcwNTQ1ODcwNWUtMDQsICszLjQ1MjkzNzYwNDIyODk0N2UtMDQsICs5Ljc0Njk1MDgxODc3OTUzNGUtMTksCi0gICAgLTMuMTcwNzQ2NTM1MzgyNzI4ZS0wNCwgLTUuOTQwMTc3NjU3OTI1OTA4ZS0wNCwgLTguMjE2OTIxODk4NTEzMjI1ZS0wNCwKLSAgICAtOS45Mzk0MTU2MzE1NjMwMTVlLTA0LCAtMS4xMDc2NDA5NzQxNDgyMjFlLTAzLCAtMS4xNjI2MDE2OTQ0NjQ2MjBlLTAzLAotICAgIC0xLjE2MTM0NTIyMDQ4Mzk5NmUtMDMsIC0xLjEwODc2NzA1NTYzMjMwNGUtMDMsIC0xLjAxMTcxNDUxMzY5NzI4MmUtMDMsCi0gICAgLTguNzg1MDUyMzE1OTYzODU0ZS0wNCwgLTcuMTg0MTQwMjI5Njc1MDIwZS0wNCwgLTUuNDExNTUyMzA4ODAxMTQ3ZS0wNCwKLSAgICAtMy41NjM4NTk2NTMzMDA3NjBlLTA0LCAtMS43MzI1MjcxMjc4OTgwNTJlLTA0LCAtNS44MTg4MDE0MTY5MjM1ODBlLTE5LAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTEyIG9mIDE3NwotICAgICsxLjU2MzQ0NjY2OTk3NTYxNWUtMDQsICsyLjkwMjAwMjE3MjkwNzE4MGUtMDQsICszLjk3NTcxMzc5OTI2NDc5MWUtMDQsCi0gICAgKzQuNzYwOTg0MjQyOTQ3MzQ5ZS0wNCwgKzUuMjUwMjIxNTQ4MjcwOTgyZS0wNCwgKzUuNDUwNzI5MTc2MTc1ODc1ZS0wNCwKLSAgICArNS4zODI5NTUyMzEwNDU5MTVlLTA0LCArNS4wNzgyNDI5MzY3MDQ4NjRlLTA0LCArNC41NzYyMzg0OTEwNjQzOTJlLTA0LAotICAgICszLjkyMjExNzM4MDg5NDczNmUtMDQsICszLjE2Mzc4NjQ5NjI2NTI2OWUtMDQsICsyLjM0OTIwNzc2OTg5ODkwNmUtMDQsCi0gICAgKzEuNTIzOTcwNzU3NjQ0MjcyZS0wNCwgKzcuMjkyMTgwMjEzMDAxMzM3ZS0wNSwgKzIuODEwMDY0Nzk1MDY3Nzg2ZS0xOSwKLSAgICAtNi4zNTg5MzAzMzUzNDg5NzdlLTA1LCAtMS4xNTg2MDM2NTE3OTI2MzhlLTA0LCAtMS41NTYzOTQyNjYwNDY4MDNlLTA0LAotICAgIC0xLjgyNTM4MzMxODgzNDY5MGUtMDQsIC0xLjk2ODg4Njg1NjQwMDU0N2UtMDQsIC0xLjk5NjQzODE5MjUwMDM4MmUtMDQsCi0gICAgLTEuOTIyNTY5NTk5NTg0ODAyZS0wNCwgLTEuNzY1NDQ1NjcxMjU3NjY4ZS0wNCwgLTEuNTQ1NDM4Mjk3NzA0NjYyZS0wNCwKLSAgICAtMS4yODM3Mjg0ODA2NjAzOTVlLTA0LCAtMS4wMDEwMTExMzI2NTU5MTRlLTA0LCAtNy4xNjM2NjM5OTQ0ODE0NTllLTA1LAotICAgIC00LjQ2MzQ1ODkzNjc1NzA4MWUtMDUsIC0yLjA0MzA1NTgzMjg3OTEwOGUtMDV9OwotZG91YmxlIHRhYl9sdHBmX2ludGVycF9SWzMxXSA9IHsKLSAgICAtMi44NzQ1NjExNjE1MTk0NDRlLTAzLCAtMy4wMDEyNTEwMjU4NjE0OTllLTAzLCArMi43NDU0NzE2NTQwNTkzMjFlLTAzLAotICAgICsxLjUzNTcyNzY5ODkzNTMyMmUtMDIsICsyLjg2ODIzNDA0NjY2NTY1N2UtMDIsICsyLjk1MDM4NTAyNjU1NzM3N2UtMDIsCi0gICAgKzQuNTk4MzM0NDkxMTM1NDczZS0wMywgLTQuNzI5NjMyNDU5MDQzNDQwZS0wMiwgLTEuMDU4MzU5MTYzMDYyODM3ZS0wMSwKLSAgICAtMS4zMDMwNTAyMTM2MDcxMTJlLTAxLCAtNy41NDQwNDYzNTc1NTUyMDFlLTAyLCArOC4zNTc4ODU3MjUyNTA1MjllLTAyLAotICAgICszLjMwMTgyNTcxMDc2NDQ1OWUtMDEsICs2LjAzMjk3MDA3NjM2NjE1OGUtMDEsICs4LjE3NDg4Njg1NjI0MzE3OGUtMDEsCi0gICAgKzguOTg2MzgyODUxMjczOTgyZS0wMSwgKzguMTc0ODg2ODU2MjQzMTc4ZS0wMSwgKzYuMDMyOTcwMDc2MzY2MTU4ZS0wMSwKLSAgICArMy4zMDE4MjU3MTA3NjQ0NTllLTAxLCArOC4zNTc4ODU3MjUyNTA1MjllLTAyLCAtNy41NDQwNDYzNTc1NTUyMDFlLTAyLAotICAgIC0xLjMwMzA1MDIxMzYwNzExMmUtMDEsIC0xLjA1ODM1OTE2MzA2MjgzN2UtMDEsIC00LjcyOTYzMjQ1OTA0MzQ0MGUtMDIsCi0gICAgKzQuNTk4MzM0NDkxMTM1NDczZS0wMywgKzIuOTUwMzg1MDI2NTU3Mzc3ZS0wMiwgKzIuODY4MjM0MDQ2NjY1NjU3ZS0wMiwKLSAgICArMS41MzU3Mjc2OTg5MzUzMjJlLTAyLCArMi43NDU0NzE2NTQwNTkzMjFlLTAzLCAtMy4wMDEyNTEwMjU4NjE0OTllLTAzLAotICAgIC0yLjg3NDU2MTE2MTUxOTQ0NGUtMDN9OwotZG91YmxlIHRhYl9sdHBmX2ludGVycF94MTJrOFsxNV0gPSB7Ci0gICAgKzYuNjk4ODU4MzY2OTM5NjgwZS0wMywgKzMuOTY3MTE0NzgyMzQ0OTY3ZS0wMiwgKzEuMDY5OTkxODYwODk2Mzg5ZS0wMSwKLSAgICArMi4wOTg4MDQ2MzA2ODE4MDllLTAxLCArMy4zNTY5MDYyNTQxNDc4NDBlLTAxLCArNC41OTIyMDkyOTYwODIzNTBlLTAxLAotICAgICs1LjUwMDc1MDAxOTE3NzExNmUtMDEsICs1LjgzNTI3NTc1NDIyMTIxMWUtMDEsICs1LjUwMDc1MDAxOTE3NzExNmUtMDEsCi0gICAgKzQuNTkyMjA5Mjk2MDgyMzUwZS0wMSwgKzMuMzU2OTA2MjU0MTQ3ODQwZS0wMSwgKzIuMDk4ODA0NjMwNjgxODA5ZS0wMSwKLSAgICArMS4wNjk5OTE4NjA4OTYzODllLTAxLCArMy45NjcxMTQ3ODIzNDQ5NjdlLTAyLCArNi42OTg4NTgzNjY5Mzk2ODBlLTAzfTsKLWRvdWJsZSB0YWJfbHRwZl9udW1fODAwMFs0XVszXSA9IHsKLSAgICB7Ni4wMjM2MTgyMDcwMDk1NzhlLTAxLCA0LjE5NzYwOTI2MTM2MzYxN2UtMDEsIC0xLjg4MzQyNDUyNzg4MzY4N2UtMDJ9LAotICAgIHs1Ljk5NDc2ODU4MjU4NDMxNGUtMDEsIDQuMTk3NjA5MjYxMzYzNjIwZS0wMSwgLTEuNTk0OTI4MjgzNjMxMDQxZS0wMn0sCi0gICAgezUuOTY3NzY0NjYzNzMzNzg3ZS0wMSwgNC4xOTc2MDkyNjEzNjM2MTdlLTAxLCAtMS4zMjQ4ODkwOTUxMjU3ODBlLTAyfSwKLSAgICB7NS45NDI0MTAxMjAwOTg4OTVlLTAxLCA0LjE5NzYwOTI2MTM2MzYxOGUtMDEsIC0xLjA3MTM0MzY1ODc3NjgzMWUtMDJ9fTsKLWRvdWJsZSB0YWJfbHRwZl9udW1fMTYwMDBbNF1bM10gPSB7Ci0gICAgezYuMDIzNjE4MjA3MDA5NTc4ZS0wMSwgNC4xOTc2MDkyNjEzNjM2MTdlLTAxLCAtMS44ODM0MjQ1Mjc4ODM2ODdlLTAyfSwKLSAgICB7NS45OTQ3Njg1ODI1ODQzMTRlLTAxLCA0LjE5NzYwOTI2MTM2MzYyMGUtMDEsIC0xLjU5NDkyODI4MzYzMTA0MWUtMDJ9LAotICAgIHs1Ljk2Nzc2NDY2MzczMzc4N2UtMDEsIDQuMTk3NjA5MjYxMzYzNjE3ZS0wMSwgLTEuMzI0ODg5MDk1MTI1NzgwZS0wMn0sCi0gICAgezUuOTQyNDEwMTIwMDk4ODk1ZS0wMSwgNC4xOTc2MDkyNjEzNjM2MThlLTAxLCAtMS4wNzEzNDM2NTg3NzY4MzFlLTAyfX07Ci1kb3VibGUgdGFiX2x0cGZfbnVtXzI0MDAwWzRdWzVdID0gewotICAgIHszLjk4OTY5NTU4ODk2MzQ5NGUtMDEsIDUuMTQyNTA4NjA3NzA4Mjc1ZS0wMSwgMS4wMDQzODI5NjYxNTc0NTRlLTAxLAotICAgICAtMS4yNzg4OTM5NTY4MTgwNDJlLTAyLCAtMS41NzIyODAwNzU0NjEzODNlLTAzfSwKLSAgICB7My45NDg2MzQ5MTEyODYzMzNlLTAxLCA1LjEyMzgxOTIwODA0ODY4OGUtMDEsIDEuMDQzMTk0OTI2Mzg2MjY3ZS0wMSwKLSAgICAgLTEuMDkxOTk5OTYwMjIyMTY2ZS0wMiwgLTEuMzQ3NDA4MzMwNjI3MzE3ZS0wM30sCi0gICAgezMuOTA5ODQ0NDc1ODg1OTE0ZS0wMSwgNS4xMDYwNTM1MjI2ODgzNTllLTAxLCAxLjA3OTgzMjUyNDY4NTk0NGUtMDEsCi0gICAgIC05LjE0MzQzMTA2NjE4ODg0OGUtMDMsIC0xLjEzMjEyNDYyMDU1MTg5NWUtMDN9LAotICAgIHszLjg3MzA5Mzg4ODE5OTkyOGUtMDEsIDUuMDg5MTIyMDgzMzYzOTc1ZS0wMSwgMS4xMTQ1MTczODAyMTczNzFlLTAxLAotICAgICAtNy40NTAyODcxMzM3NTA3MTdlLTAzLCAtOS4yNTU1MTQwNTA5NjMxMTFlLTA0fX07Ci1kb3VibGUgdGFiX2x0cGZfbnVtXzMyMDAwWzRdWzddID0gewotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTEzIG9mIDE3NwotICAgIHsyLjk4MjM3OTQ0NjcwMjA5NmUtMDEsIDQuNjUyODA5MjAzNzIxMjkwZS0wMSwgMi4xMDU5OTc0Mjg2MTQyNzllLTAxLAotICAgICAzLjc2Njc4MDM4MDgwNjA2M2UtMDIsIC0xLjAxNTY5NjE1NTc5NjU2NGUtMDIsIC0yLjUzNTg4MDk5NjEwMTA5NmUtMDMsCi0gICAgIC0zLjE4Mjk0NjE2ODcxOTk1OGUtMDR9LAotICAgIHsyLjk0MzgzNDE1NDUxMDI0MGUtMDEsIDQuNjE5Mjk0MDAyNzE4Nzk4ZS0wMSwgMi4xMjk0NjU3NzAwOTE4NDRlLTAxLAotICAgICA0LjA2NjE3NTAwMjY4ODg1N2UtMDIsIC04LjY5MzI3MjI5NzAxMDA1MGUtMDMsIC0yLjE3ODMwNzExNDY3OTgyMGUtMDMsCi0gICAgIC0yLjc0Mjg4ODA2Mzk4MzE4OGUtMDR9LAotICAgIHsyLjkwNzQzOTIxMzEyMjY4OGUtMDEsIDQuNTg3NDYxOTEwOTYwMjc5ZS0wMSwgMi4xNTE0NTY5NzQxMDg5NzBlLTAxLAotICAgICA0LjM1MDEwNDc3MjUyOTc3NGUtMDIsIC03LjI5NTQ5NTM0NzcxNjkyNWUtMDMsIC0xLjgzNDM5NTYzNzIzNzA4NmUtMDMsCi0gICAgIC0yLjMxNjkyMDE4NjQ4MjQxNmUtMDR9LAotICAgIHsyLjg3Mjk3NTg1MjU4OTE1OGUtMDEsIDQuNTU3MTQ4ODg2ODYxMzc5ZS0wMSwgMi4xNzIxMjY5NTA5MTE0MDFlLTAxLAotICAgICA0LjYyMDA4ODg3ODIyOTYxNWUtMDIsIC01Ljk1NzQ2MzgwMjEyNTk1MmUtMDMsIC0xLjUwMjkzNDI4NDM0NTE5OGUtMDMsCi0gICAgIC0xLjkwMzg1MTkxMTMwODg2NmUtMDR9fTsKLWRvdWJsZSB0YWJfbHRwZl9udW1fNDgwMDBbNF1bMTFdID0gewotICAgIHsxLjk4MTM2MzczOTg4MzIxN2UtMDEsIDMuNTI0NDk0OTAzOTY0OTA0ZS0wMSwgMi41MTM2OTUyNjk2NDk0MTRlLTAxLAotICAgICAxLjQyNDE0NjIzNzMxNDQ1OGUtMDEsIDUuNzA0NzMxMDIzOTUyNTk5ZS0wMiwgOS4yOTMzNjYyNDE1ODYzODRlLTAzLAotICAgICAtNy4yMjYwMjUzNjg5NTM3NDVlLTAzLCAtMy4xNzI2Nzk4OTAzNTYzNTZlLTAzLCAtMS4xMjE4MzU5NjM1NjcwMTRlLTAzLAotICAgICAtMi45MDI5NTcyMzg0MDAxNDBlLTA0LCAtNC4yNzA4MTU1OTM3NjkyNDBlLTA1fSwKLSAgICB7MS45NTA3MDk0MjY1OTgzNzVlLTAxLCAzLjQ4NDY2MDQwODM0MTYzMmUtMDEsIDIuNTA5OTg4NDU5NDY2NTc0ZS0wMSwKLSAgICAgMS40NDExNjc0MTI0ODIwODhlLTAxLCA1LjkyODk0NzMxNzY3NzI4NWUtMDIsIDEuMTA4OTIzODI3NDUyMjMxZS0wMiwKLSAgICAgLTYuMTkyOTA4MTA4NjUzNTA0ZS0wMywgLTIuNzI2NzA1NTA5MjUxNzM3ZS0wMywgLTkuNjY3MTI1ODI2MjE3MTUxZS0wNCwKLSAgICAgLTIuNTA4MTAwOTIzMTY1MjA0ZS0wNCwgLTMuNjk5OTM4NzY2MTMxODY5ZS0wNX0sCi0gICAgezEuOTIxODEwMDU1MTk2MDE1ZS0wMSwgMy40NDY5NDU1NjEwOTE1MTNlLTAxLCAyLjUwNjIyMDA5NDYyNjAyNGUtMDEsCi0gICAgIDEuNDU3MTAyNDQ3NjY0ODM3ZS0wMSwgNi4xNDExMzIxMzM2NjQ1MjVlLTAyLCAxLjI3OTk0MTM5NjU2Mjc5OGUtMDIsCi0gICAgIC01LjIwMzcyMTA4Nzg4NjMyMWUtMDMsIC0yLjI5NzMyNDUxMTEwOTA4NWUtMDMsIC04LjE2NTYwODEzMzIxNzU1NWUtMDQsCi0gICAgIC0yLjEyMzg1NTc0ODI3NzQwOGUtMDQsIC0zLjE0MTI3MTMzMDk4MTY0OWUtMDV9LAotICAgIHsxLjg5NDQ4NTMxNDE3NTg2OGUtMDEsIDMuNDExMTM5MjUxMTA4MjUyZS0wMSwgMi41MDI0MDY4NzY4OTQzNjFlLTAxLAotICAgICAxLjQ3MjA2NTYzMTA5ODA4MWUtMDEsIDYuMzQyNDc3MjI5NTM5MDUxZS0wMiwgMS40NDMyMDM0MzQxNTAzMTJlLTAyLAotICAgICAtNC4yNTQ0NDkxNDQ2NTcwOThlLTAzLCAtMS44ODMwODE0NzI2MTM0OTNlLTAzLCAtNi43MDk2MTkwNjA3MjIxNDBlLTA0LAotICAgICAtMS43NDkzNjMzNDE5NjY4NzJlLTA0LCAtMi41OTM4NjQ3MzUyODQyODVlLTA1fX07Ci1kb3VibGUgdGFiX2x0cGZfZGVuXzgwMDBbNF1bNV0gPSB7Ci0gICAgezAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMi4wOTg4MDQ2MzA2ODE4MDllLTAxLCA1LjgzNTI3NTc1NDIyMTIxMWUtMDEsCi0gICAgIDIuMDk4ODA0NjMwNjgxODA5ZS0wMSwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAxLjA2OTk5MTg2MDg5NjM4OWUtMDEsIDUuNTAwNzUwMDE5MTc3MTE2ZS0wMSwKLSAgICAgMy4zNTY5MDYyNTQxNDc4NDBlLTAxLCA2LjY5ODg1ODM2NjkzOTY4MGUtMDN9LAotICAgIHswLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDMuOTY3MTE0NzgyMzQ0OTY3ZS0wMiwgNC41OTIyMDkyOTYwODIzNTBlLTAxLAotICAgICA0LjU5MjIwOTI5NjA4MjM1MGUtMDEsIDMuOTY3MTE0NzgyMzQ0OTY3ZS0wMn0sCi0gICAgezAuMDAwMDAwMDAwMDAwMDAwZSswMCwgNi42OTg4NTgzNjY5Mzk2ODBlLTAzLCAzLjM1NjkwNjI1NDE0Nzg0MGUtMDEsCi0gICAgIDUuNTAwNzUwMDE5MTc3MTE2ZS0wMSwgMS4wNjk5OTE4NjA4OTYzODllLTAxfX07Ci1kb3VibGUgdGFiX2x0cGZfZGVuXzE2MDAwWzRdWzVdID0gewotICAgIHswLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDIuMDk4ODA0NjMwNjgxODA5ZS0wMSwgNS44MzUyNzU3NTQyMjEyMTFlLTAxLAotICAgICAyLjA5ODgwNDYzMDY4MTgwOWUtMDEsIDAuMDAwMDAwMDAwMDAwMDAwZSswMH0sCi0gICAgezAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMS4wNjk5OTE4NjA4OTYzODllLTAxLCA1LjUwMDc1MDAxOTE3NzExNmUtMDEsCi0gICAgIDMuMzU2OTA2MjU0MTQ3ODQwZS0wMSwgNi42OTg4NTgzNjY5Mzk2ODBlLTAzfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAzLjk2NzExNDc4MjM0NDk2N2UtMDIsIDQuNTkyMjA5Mjk2MDgyMzUwZS0wMSwKLSAgICAgNC41OTIyMDkyOTYwODIzNTBlLTAxLCAzLjk2NzExNDc4MjM0NDk2N2UtMDJ9LAotICAgIHswLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDYuNjk4ODU4MzY2OTM5NjgwZS0wMywgMy4zNTY5MDYyNTQxNDc4NDBlLTAxLAotICAgICA1LjUwMDc1MDAxOTE3NzExNmUtMDEsIDEuMDY5OTkxODYwODk2Mzg5ZS0wMX19OwotZG91YmxlIHRhYl9sdHBmX2Rlbl8yNDAwMFs0XVs3XSA9IHsKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCA2LjMyMjIzMTYyNzMyMzc5NmUtMDIsIDIuNTA3MzA5NjA2MDEzMjM1ZS0wMSwKLSAgICAgMy43MTM5MDk0Mjg5MDE1NzhlLTAxLCAyLjUwNzMwOTYwNjAxMzIzNWUtMDEsIDYuMzIyMjMxNjI3MzIzNzk2ZS0wMiwKLSAgICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfSwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDExNCBvZiAxNzcKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAzLjQ1OTI3MjE3NDA5OTg1NWUtMDIsIDEuOTg2NTE1NjAyNjQ1MDI4ZS0wMSwKLSAgICAgMy42MjY0MTE3MjY1ODE0NTJlLTAxLCAyLjk4Njc1MDU0ODk5MjE3OWUtMDEsIDEuMDEzMDkyODczNTA1OTI4ZS0wMSwKLSAgICAgNC4yNjM1NDM3MTIzNjk3NTJlLTAzfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAxLjUzNTc0Njc4NDk2MzkwN2UtMDIsIDEuNDc0MzQ0ODc4MDU4MjIyZS0wMSwKLSAgICAgMy4zNzQyNTk1NTM5OTA3MTdlLTAxLCAzLjM3NDI1OTU1Mzk5MDcxN2UtMDEsIDEuNDc0MzQ0ODc4MDU4MjIyZS0wMSwKLSAgICAgMS41MzU3NDY3ODQ5NjM5MDdlLTAyfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCA0LjI2MzU0MzcxMjM2OTc1MmUtMDMsIDEuMDEzMDkyODczNTA1OTI4ZS0wMSwKLSAgICAgMi45ODY3NTA1NDg5OTIxNzllLTAxLCAzLjYyNjQxMTcyNjU4MTQ1MmUtMDEsIDEuOTg2NTE1NjAyNjQ1MDI4ZS0wMSwKLSAgICAgMy40NTkyNzIxNzQwOTk4NTVlLTAyfX07Ci1kb3VibGUgdGFiX2x0cGZfZGVuXzMyMDAwWzRdWzldID0gewotICAgIHswLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDIuOTAwNDAxODc4MjI4NzMwZS0wMiwgMS4xMjk4NTc0MjA1NjA5MjdlLTAxLAotICAgICAyLjIxMjAyNDAyODA5NzU3MGUtMDEsIDIuNzIzOTA5NDcyNDQ2MTQ1ZS0wMSwgMi4yMTIwMjQwMjgwOTc1NzBlLTAxLAotICAgICAxLjEyOTg1NzQyMDU2MDkyN2UtMDEsIDIuOTAwNDAxODc4MjI4NzMwZS0wMiwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAxLjcwMzE1MzQxODM4NTI2MWUtMDIsIDguNzIyNTAzNzg1NTM3Nzg0ZS0wMiwKLSAgICAgMS45NjE0MDc3NjIyMzIxOTllLTAxLCAyLjY4OTIzNzk4MjIzNzI1N2UtMDEsIDIuNDI0OTk5MTAyNzU2Mzg5ZS0wMSwKLSAgICAgMS40MDU3NzMzNjQ2NTAwMzFlLTAxLCA0LjQ3NDg3NzE2OTQ4NTc4OGUtMDIsIDMuMTI3MDMwMjQzMTAwNzI0ZS0wM30sCi0gICAgezAuMDAwMDAwMDAwMDAwMDAwZSswMCwgOC41NjM2NzM3NDg0ODgzNDllLTAzLCA2LjQyNjIyMjk0NDQ5Mzg0NWUtMDIsCi0gICAgIDEuNjg3Njc2NzA1OTE4MDEyZS0wMSwgMi41ODc0NDU5Mzc3OTU1MDVlLTAxLCAyLjU4NzQ0NTkzNzc5NTUwNWUtMDEsCi0gICAgIDEuNjg3Njc2NzA1OTE4MDEyZS0wMSwgNi40MjYyMjI5NDQ0OTM4NDVlLTAyLCA4LjU2MzY3Mzc0ODQ4ODM0OWUtMDN9LAotICAgIHswLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDMuMTI3MDMwMjQzMTAwNzI0ZS0wMywgNC40NzQ4NzcxNjk0ODU3ODhlLTAyLAotICAgICAxLjQwNTc3MzM2NDY1MDAzMWUtMDEsIDIuNDI0OTk5MTAyNzU2Mzg5ZS0wMSwgMi42ODkyMzc5ODIyMzcyNTdlLTAxLAotICAgICAxLjk2MTQwNzc2MjIzMjE5OWUtMDEsIDguNzIyNTAzNzg1NTM3Nzg0ZS0wMiwgMS43MDMxNTM0MTgzODUyNjFlLTAyfX07Ci1kb3VibGUgdGFiX2x0cGZfZGVuXzQ4MDAwWzRdWzEzXSA9IHsKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAxLjA4MjM1OTM4NjY1OTM4N2UtMDIsIDMuNjA4OTY5MjIxMzAzOTc5ZS0wMiwKLSAgICAgNy42NzY0MDE0NjgwOTk5NjRlLTAyLCAxLjI0MTUzMDU3NzUwMTcwM2UtMDEsIDEuNjI3NTk2NDM4MzAwNjk2ZS0wMSwKLSAgICAgMS43NzY3NzE0MTc3NzkxMDllLTAxLCAxLjYyNzU5NjQzODMwMDY5NmUtMDEsIDEuMjQxNTMwNTc3NTAxNzAzZS0wMSwKLSAgICAgNy42NzY0MDE0NjgwOTk5NjRlLTAyLCAzLjYwODk2OTIyMTMwMzk3OWUtMDIsIDEuMDgyMzU5Mzg2NjU5Mzg3ZS0wMiwKLSAgICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCA3LjA0MTQwNDkzMDQ1OTM1OGUtMDMsIDIuODE5NzAyMzE5ODIwNDIwZS0wMiwKLSAgICAgNi41NDcwNDQ5MzUxMjc1NTFlLTAyLCAxLjEyNDY0Nzk4Njc0MzI5OWUtMDEsIDEuNTQ4NDE4OTU2NDg5MDE1ZS0wMSwKLSAgICAgMS43NjcxMjIzODEzNDE4NTdlLTAxLCAxLjY5MTUwNzIxMzA1NzY2M2UtMDEsIDEuMzUyOTAxNTc3OTg5NzY2ZS0wMSwKLSAgICAgOC44NTE0MjUwMTE0Mjc0ODNlLTAyLCA0LjQ5OTM1Mzg0ODU2MjQ0NGUtMDIsIDEuNTU3NjEzNzE0NzMyMDAyZS0wMiwKLSAgICAgMi4wMzk3MjE5NTY1MDIwMTZlLTAzfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCA0LjE0Njk5ODQ2NzQ0NDc4OGUtMDMsIDIuMTM1NzU3MzEwNzQxOTE3ZS0wMiwKLSAgICAgNS40ODI3MzU1ODQ1NTI4MTZlLTAyLCAxLjAwNDk3MTQ0NDY0MzcyMGUtMDEsIDEuNDU2MDYwMzQyODMwMDAyZS0wMSwKLSAgICAgMS43Mzg0Mzk4Mzg1NjU4NjllLTAxLCAxLjczODQzOTgzODU2NTg2OWUtMDEsIDEuNDU2MDYwMzQyODMwMDAyZS0wMSwKLSAgICAgMS4wMDQ5NzE0NDQ2NDM3MjBlLTAxLCA1LjQ4MjczNTU4NDU1MjgxNmUtMDIsIDIuMTM1NzU3MzEwNzQxOTE3ZS0wMiwKLSAgICAgNC4xNDY5OTg0Njc0NDQ3ODhlLTAzfSwKLSAgICB7MC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAyLjAzOTcyMTk1NjUwMjAxNmUtMDMsIDEuNTU3NjEzNzE0NzMyMDAyZS0wMiwKLSAgICAgNC40OTkzNTM4NDg1NjI0NDRlLTAyLCA4Ljg1MTQyNTAxMTQyNzQ4M2UtMDIsIDEuMzUyOTAxNTc3OTg5NzY2ZS0wMSwKLSAgICAgMS42OTE1MDcyMTMwNTc2NjNlLTAxLCAxLjc2NzEyMjM4MTM0MTg1N2UtMDEsIDEuNTQ4NDE4OTU2NDg5MDE1ZS0wMSwKLSAgICAgMS4xMjQ2NDc5ODY3NDMyOTllLTAxLCA2LjU0NzA0NDkzNTEyNzU1MWUtMDIsIDIuODE5NzAyMzE5ODIwNDIwZS0wMiwKLSAgICAgNy4wNDE0MDQ5MzA0NTkzNThlLTAzfX07CmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTG9uZ1Rlcm1Qb3N0ZmlsdGVyQ29lZmZpY2llbnRzLmhwcCBiL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9Mb25nVGVybVBvc3RmaWx0ZXJDb2VmZmljaWVudHMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWI5Nzc1NS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTG9uZ1Rlcm1Qb3N0ZmlsdGVyQ29lZmZpY2llbnRzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMb25nVGVybVBvc3RmaWx0ZXJDb2VmZmljaWVudHMuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjUgTG9uZyBUZXJtIFBvc3RmaWx0ZXJpbmcKLQotI2lmbmRlZiBMT05HX1RFUk1fUE9TVEZJTFRFUl9DT0VGRklDSUVOVFNfSF8KLSNkZWZpbmUgTE9OR19URVJNX1BPU1RGSUxURVJfQ09FRkZJQ0lFTlRTX0hfCi0KLWV4dGVybiBkb3VibGUgdGFiX3Jlc2FtcF9maWx0ZXJbMjM5XTsKLWV4dGVybiBkb3VibGUgdGFiX2x0cGZfaW50ZXJwX1JbMzFdOwotZXh0ZXJuIGRvdWJsZSB0YWJfbHRwZl9pbnRlcnBfeDEyazhbMTVdOwotZXh0ZXJuIGRvdWJsZSB0YWJfbHRwZl9udW1fODAwMFs0XVszXTsKLWV4dGVybiBkb3VibGUgdGFiX2x0cGZfbnVtXzE2MDAwWzRdWzNdOwotZXh0ZXJuIGRvdWJsZSB0YWJfbHRwZl9udW1fMjQwMDBbNF1bNV07Ci1leHRlcm4gZG91YmxlIHRhYl9sdHBmX251bV8zMjAwMFs0XVs3XTsKLWV4dGVybiBkb3VibGUgdGFiX2x0cGZfbnVtXzQ4MDAwWzRdWzExXTsKLWV4dGVybiBkb3VibGUgdGFiX2x0cGZfZGVuXzgwMDBbNF1bNV07Ci1leHRlcm4gZG91YmxlIHRhYl9sdHBmX2Rlbl8xNjAwMFs0XVs1XTsKLWV4dGVybiBkb3VibGUgdGFiX2x0cGZfZGVuXzI0MDAwWzRdWzddOwotZXh0ZXJuIGRvdWJsZSB0YWJfbHRwZl9kZW5fMzIwMDBbNF1bOV07Ci1leHRlcm4gZG91YmxlIHRhYl9sdHBmX2Rlbl80ODAwMFs0XVsxM107Ci0KLSNlbmRpZiAgLy8gTE9OR19URVJNX1BPU1RGSUxURVJfQ09FRkZJQ0lFTlRTX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTWRjdFdpbmRvd3MuY3BwIGIvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL01kY3RXaW5kb3dzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1ZDU3My4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTWRjdFdpbmRvd3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MyArMCwwIEBACi0vKgotICogTWRjdFdpbmRvd3MuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjIKLSNpbmNsdWRlICJNZGN0V2luZG93cy5ocHAiCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgODYgb2YgMTc3Ci0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwNF8qaW1wbGVtZW50b3JDb21tZW50cyoKLS8vIFNlY3Rpb24gMy43LjMgTG93IGRlbGF5IE1EQ1Qgd2luZG93cwotLy8gU2VjdGlvbiAzLjcuMy4xIDEwIG1zIEZyYW1lIER1cmF0aW9uCi0KLS8vIFNlY3Rpb24gNS43LjIuMSB3ODAgKGQwOXIwMS5wZGYpCi1kb3VibGUgd19OODBbMTYwXSA9IHsKLSAgICAtNy4wNzg1NDY3MDY1MTIzOTFlLTA0LCAtMi4wOTgxOTc3Mjc5MDA3MjRlLTAzLCAtNC41MjUxOTgwNzYwMDIzNzBlLTAzLAotICAgIC04LjIzMzk3NjMyNzMwMDYxMmUtMDMsIC0xLjMzNzcxMzA5NjI1NzkzNGUtMDIsIC0xLjk5OTcyMTU1NzQwMTUwMmUtMDIsCi0gICAgLTIuODAwOTA5NDY0Mjc0NzgyZS0wMiwgLTMuNzIxNTAyMDgyMjQ1MDU1ZS0wMiwgLTQuNzMxNzY4MjYxNjA2MTc1ZS0wMiwKLSAgICAtNS43OTQ2NTQ4MzQwMzQwNTVlLTAyLCAtNi44Njc2MDY3NTM1MzE0NDFlLTAyLCAtNy45MDQ2NDc0NDA3ODg2OTJlLTAyLAotICAgIC04Ljg1OTcwNTQ2ODA4NTkyNWUtMDIsIC05LjY4ODMwMzYyMzA0OTE5OWUtMDIsIC0xLjAzNDk2MTI0MTI2MzUyM2UtMDEsCi0gICAgLTEuMDgwNzY2NDU3NjE2ODc4ZS0wMSwgLTEuMTAzMjQyMjYyNjAwOTEzZS0wMSwgLTEuMDk5ODA5ODUxNDI0NTUwZS0wMSwKLSAgICAtMS4wNjgxNzIxNDIyMzA4ODJlLTAxLCAtMS4wMDYxOTA0MTg3OTE2NDhlLTAxLCAtOS4xMTY0NTI1MDY0OTI1MjdlLTAyLAotICAgIC03LjgyMDYxNzQ4MzI1NDczMGUtMDIsIC02LjE0NjY4ODEyNDE2Njk0OGUtMDIsIC00LjA2MzM2Mjg1NTcwMTYyM2UtMDIsCi0gICAgLTEuNTM2MzI5NTIwNzg4NzY2ZS0wMiwgKzEuNDcwMTU1MDY4NzQ2MzAzZS0wMiwgKzQuOTg5NzM2NTA5MDgwNTU4ZS0wMiwKLSAgICArOS4wNTAzNjkyNTcxNTIwNzllLTAyLCArMS4zNjY5MTEwMTk0MTQ0MTdlLTAxLCArMS44ODQ2ODYzODkyMTgzMjJlLTAxLAotICAgICsyLjQ1NjQ1NjgwMzQ2NzA5NWUtMDEsICszLjA3Nzc4OTA3ODg4OTgyMGUtMDEsICszLjc0MTY0MjM3MzA2MDE4OGUtMDEsCi0gICAgKzQuNDM4MTE0Nzk5MjEzNTc2ZS0wMSwgKzUuMTU0NzM1NDU2NTM5NzAwZS0wMSwgKzUuODc2NjYxNzIyNTY0Mjg5ZS0wMSwKLSAgICArNi41ODc2MTk3Njc4MDkwMDBlLTAxLCArNy4yNzA1NzY2OTk4NDEzNTllLTAxLCArNy45MDg3NTI5ODkyOTUzMzVlLTAxLAotICAgICs4LjQ4NjY0MzM2NDk1OTczM2UtMDEsICs4Ljk5MTMyMDIzNTQ4NDM0OWUtMDEsICs5LjQxMzM0ODE0NTI3Mjg0MmUtMDEsCi0gICAgKzkuNzQ3NjM0ODI3OTQxNTc1ZS0wMSwgKzkuOTk0MTE0NzMwNDE1ODU3ZS0wMSwgKzEuMDE1NzYwMzczNzkxNjAzZSswMCwKLSAgICArMS4wMjQ3MzYxNjQwNjk2OTdlKzAwLCArMS4wMjc2MzQyOTQ0NTYyMDVlKzAwLCArMS4wMjU5OTE0OTM5ODM4MzZlKzAwLAotICAgICsxLjAyMTQyNzIxMDYwMzI4NGUrMDAsICsxLjAxNTQzOTg1OTU0OTM1N2UrMDAsICsxLjAwOTM2NjkyNTQ5OTU1MGUrMDAsCi0gICAgKzEuMDAzNTA4MTYyNDE2NDQ5ZSswMCwgKzkuOTg4ODk4MjA2MjU3NTU5ZS0wMSwgKzkuOTUzMTMzOTAyNDI3ODY5ZS0wMSwKLSAgICArOS45MjU5NDM5MTkyMDgxOTBlLTAxLCArOS45MDU3NzE5NTc5MTc3MzFlLTAxLCArOS44OTEzNzE2MTY1NTcwMTRlLTAxLAotICAgICs5Ljg4MTc5MDc0NzIxMjM5MWUtMDEsICs5Ljg3NjI0OTI2OTE3NDU4NmUtMDEsICs5Ljg3NDA1NjI3NTUwOTU4NWUtMDEsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSA4NyBvZiAxNzcKLSAgICArOS44NzQ1MjQ4NDkxOTI0NTZlLTAxLCArOS44NzY5NTExMzQwODQyMTNlLTAxLCArOS44ODA2NDA2MTcwMzA4ODRlLTAxLAotICAgICs5Ljg4NDkyNjg3MzU1MTM3NWUtMDEsICs5Ljg4OTIzMDAzMTAyMjA4OWUtMDEsICs5Ljg5MzA3NDk2NTM4NDY1OWUtMDEsCi0gICAgKzkuODk2MTQ2MzMxODg5MTA3ZS0wMSwgKzkuODk4MzE5MjY5MzQ3MDYwZS0wMSwgKzkuODk5NjkzMTAyMDI1MzQyZS0wMSwKLSAgICArOS45MDA2MDMzNTI2MzIxMjFlLTAxLCArOS45MDE1NzUwMTUxNTU3MjBlLTAxLCArOS45MDMyNTUyODkwNTE2MDVlLTAxLAotICAgICs5LjkwNjMwMzc4NzE1MDMyNmUtMDEsICs5LjkxMTI5ODg5NDcwOTk5MGUtMDEsICs5LjkxODY2NTQ5MTE4MjkyMmUtMDEsCi0gICAgKzkuOTI4NjE5NzI3MTU0MjUyZS0wMSwgKzkuOTQxMTU2MDY5MTM2MjM4ZS0wMSwgKzkuOTU2MDMzNzc1NTM5ODg0ZS0wMSwKLSAgICArOS45NzI3OTMxMDk1NTg1MjFlLTAxLCArOS45OTA3ODQ4NDA3MjkyNDRlLTAxLCArMS4wMDA5MjIzNjU5MDE5NDVlKzAwLAotICAgICsxLjAwMjcyODExMTM4NjkwOWUrMDAsICsxLjAwNDQxNjAzODA5ODIzN2UrMDAsICsxLjAwNTkxOTIyNDEyNzkxMWUrMDAsCi0gICAgKzEuMDA3MTg5MzQ1MDI1NTI1ZSswMCwgKzEuMDA4MjAwMTQ2MzY5NDI2ZSswMCwgKzEuMDA4OTQ5NDkzNTI1NzUzZSswMCwKLSAgICArMS4wMDk0NTgyNDE0MjUxNDNlKzAwLCArMS4wMDk3Njg5ODA4MTczODRlKzAwLCArMS4wMDk5NDAzMzYyMjg2OTRlKzAwLAotICAgICsxLjAxMDAzOTQ1MzUzOTEwN2UrMDAsICsxLjAxMDEzMjMyMzk5NjQwMWUrMDAsICsxLjAxMDI3MjUyNDg0ODUxOWUrMDAsCi0gICAgKzEuMDEwNDk0MzU0NTMyMzUzZSswMCwgKzEuMDEwODA4MDY4Nzc0MzE2ZSswMCwgKzEuMDExMjAxMDcxMTI3OTI3ZSswMCwKLSAgICArMS4wMTE2NDEyNzI0MDYwMjNlKzAwLCArMS4wMTIwODAxMjU5MzQ2ODdlKzAwLCArMS4wMTI0NTgxODMxMjIwMzNlKzAwLAotICAgICsxLjAxMjcwNjk1NTgwMDI4OWUrMDAsICsxLjAxMjc1NTAxMzg0Mzk4NWUrMDAsICsxLjAxMjUzMDEzNDQxMTYxOWUrMDAsCi0gICAgKzEuMDExOTYyMzMxMTAwODY0ZSswMCwgKzEuMDEwOTgyMTM1NTA2OTg2ZSswMCwgKzEuMDA5NTEyNDM4MDQ5NTEwZSswMCwKLSAgICArMS4wMDc0NjA4NjAyODYzOTVlKzAwLCArMS4wMDQ3MDg2Nzc0OTEwODZlKzAwLCArMS4wMDExMTE0MTMyNDIzMDJlKzAwLAotICAgICs5Ljk2NTA0MTAxNzYyMzU5NmUtMDEsICs5LjkwNzE5OTk5NTczMDg0NWUtMDEsICs5LjgyMzc2NTg2NTk4MzI4OGUtMDEsCi0gICAgKzkuNzA4ODIxNzQ3NjA4OTk4ZS0wMSwgKzkuNTQ2NzMyOTc2MDczNzA1ZS0wMSwgKzkuMzIxNTUzODYxNTY0MDA2ZS0wMSwKLSAgICArOS4wMTgwMDM2ODIwODEzNDhlLTAxLCArOC42MjM5ODQwNzc5NTM1NTdlLTAxLCArOC4xMzI4MTczNjUyMzYxNDFlLTAxLAotICAgICs3LjU0NDU1MTk3NDgzNjgzNGUtMDEsICs2Ljg2NjU4MDcxNjI2NzQxOGUtMDEsICs2LjExMzQ4ODAzODc4OTE5MGUtMDEsCi0gICAgKzUuMzA2MTgxNjQ5MzE2NTk3ZS0wMSwgKzQuNDcxMzA5ODUwOTk5NTAyZS0wMSwgKzMuNjM5MTE0NjgxMTU2MjM2ZS0wMSwKLSAgICArMi44NDE2NDcwMzMzOTI0MDhlLTAxLCArMi4xMTAyMDk0NDg3NDc5NjllLTAxLCArMS40NzIyODc5NjgzMjc3MDNlLTAxLAotICAgICs5LjQ4MjY2NTM0OTUwMjI5MWUtMDIsICs1LjQ4MjQzNjYwODMyODQ3N2UtMDIsICsyLjcwMTQ2MTQwNTA1NjI2NGUtMDIsCi0gICAgKzkuOTk2NzQzNTg4MzY3NTE5ZS0wMywgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwfTsKLQotLy8gU2VjdGlvbiA1LjcuMi4yIHcxNjAgKGQwOXIwMS5wZGYpCi1kb3VibGUgd19OMTYwWzMyMF0gPSB7Ci0gICAgLTQuNjE5ODk4NzUyNjI4MTYzZS0wNCwgLTkuNzQ3MTY2NzE4OTI5MDUwZS0wNCwgLTEuNjY0NDczMDk2OTczNzI1ZS0wMywKLSAgICAtMi41OTcxMDY5MTY3Mzc3ODllLTAzLCAtMy44MDYyODUxNjMzNTIyNDFlLTAzLCAtNS4zMjQ2MDg3MjE3MTY3NjNlLTAzLAotICAgIC03LjE3NTg4NTI3Nzc3MTA5OWUtMDMsIC05LjM4MjQ4MDg2MDg5OTEwOGUtMDMsIC0xLjE5NTI3MDMwMDc0MzE5M2UtMDIsCi0gICAgLTEuNDg5NTI4MTU5NTA2Mjk2ZS0wMiwgLTEuODIwNjY2Mzk5OTY1NDY4ZS0wMiwgLTIuMTg3NTcwOTI1Nzg2ODYyZS0wMiwKLSAgICAtMi41ODg0NzE5MzcxNTc2MTllLTAyLCAtMy4wMjA4NjI3MzgyNDUyNjRlLTAyLCAtMy40ODE1OTc3OTM1MzgzNDJlLTAyLAotICAgIC0zLjk2NzA2Nzk5MjY3Mjk3OWUtMDIsIC00LjQ3MjY5ODA0NTkxNDQxN2UtMDIsIC00Ljk5NDIyNTg2MzI1NjUwMGUtMDIsCi0gICAgLTUuNTI2MzM0Nzk0NTkzNTY1ZS0wMiwgLTYuMDYzNzE3MjM1MjQzOTk2ZS0wMiwgLTYuNjAwOTYxNTE5NDQwNjU3ZS0wMiwKLSAgICAtNy4xMzE5NjYyNjY0NDMzOTBlLTAyLCAtNy42NTExNzgyMjU4OTA0OTBlLTAyLCAtOC4xNTI5NjQwMDUzMTk1MzJlLTAyLAotICAgIC04LjYzMTEzNzU0NDkwNTY3N2UtMDIsIC05LjA4MDQxMTI5MTI0NTcyOGUtMDIsIC05LjQ5NTM3Nzc1ODg3MDMzNWUtMDIsCi0gICAgLTkuODcwNzM2NTE0MjE0NDI2ZS0wMiwgLTEuMDIwMjAyNjg0MzYxOTc0ZS0wMSwgLTEuMDQ4NDM4ODI1MDE3Nzk4ZS0wMSwKLSAgICAtMS4wNzEzODIzMTQxMjc3OTllLTAxLCAtMS4wODg2OTAxMzUwMjcyNDhlLTAxLCAtMS4wOTk5Njk2NTU3ODY5MjllLTAxLAotICAgIC0xLjEwNDg5ODQ3NDg4MzMzNmUtMDEsIC0xLjEwMzIyNTgzODU2ODU2M2UtMDEsIC0xLjA5NDYyMTc0NjY1MDc2MGUtMDEsCi0gICAgLTEuMDc4ODM0MjkzMTQxODg2ZS0wMSwgLTEuMDU1NjEyNTA5NzYyMDQxZS0wMSwgLTEuMDI0NjUwMTYyNzAzMzQxZS0wMSwKLSAgICAtOS44NTcwMTQ1NjYxOTQ2MjllLTAyLCAtOS4zODQ2ODQ5MjA3MTU0MjVlLTAyLCAtOC44MjYzMDk5OTMwMDA3ODVlLTAyLAotICAgIC04LjE3ODc5MjcxNjgwOTUxMmUtMDIsIC03LjQzODc4NTYwMDIxMTQ2M2UtMDIsIC02LjYwMjE4OTc5NzcxNTI0MWUtMDIsCi0gICAgLTUuNjY1NjU1NjQxMTMzMTYxZS0wMiwgLTQuNjI0NDU2ODkzNDIwMjI0ZS0wMiwgLTMuNDc0NTg1Nzc2MTQ1OTI5ZS0wMiwKLSAgICAtMi4yMTE1ODE2MDgxMjA1MjhlLTAyLCAtOC4zMTA0MjU2OTYyMDg5MzZlLTAzLCArNi43MTc2OTc2MzUyOTA2NzZlLTAzLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgODggb2YgMTc3Ci0gICAgKzIuMzAwNjQyMDYxMDc3ODIzZS0wMiwgKzQuMDYwMTA2NDYyNjI1MDg1ZS0wMiwgKzUuOTUzMjM5MDkwOTE1NTU3ZS0wMiwKLSAgICArNy45ODMzNTQxODk4MTY1MTFlLTAyLCArMS4wMTUyMzMxNDAyMDM3NDhlLTAxLCArMS4yNDYxNzEzODczMjc1MjVlLTAxLAotICAgICsxLjQ5MTE1MjUxOTI5OTc5N2UtMDEsICsxLjc1MDA2NzM5OTA1OTg2MWUtMDEsICsyLjAyMjY5OTg1NDkwNjI1MWUtMDEsCi0gICAgKzIuMzA4NjU1Mzc5NzY3NjcxZS0wMSwgKzIuNjA3MzY1MTI0OTE4NTgzZS0wMSwgKzIuOTE4MTQ0Njk0NzI5MTY4ZS0wMSwKLSAgICArMy4yNDAwOTU3MDQ2NDUwMjNlLTAxLCArMy41NzIxNzUxODA3ODYwMjFlLTAxLCArMy45MTMxNDY4ODU3NTY4NzVlLTAxLAotICAgICs0LjI2MTU3MTY0MjMyMDQyNGUtMDEsICs0LjYxNTkyNTQ0NTA5MDIxMmUtMDEsICs0Ljk3NDQ3MTU5MjkwMTA4NmUtMDEsCi0gICAgKzUuMzM1MzI2ODE5NjMxNTgzZS0wMSwgKzUuNjk2NTQ2NzMwMDgwMTU0ZS0wMSwgKzYuMDU2MDgzODIzOTI5NjQzZS0wMSwKLSAgICArNi40MTE4MzA4NDI4MjMyNDVlLTAxLCArNi43NjE2NTM0OTk1NTAyNTVlLTAxLCArNy4xMDM0MDA1NDk1NjI5NDRlLTAxLAotICAgICs3LjQzNDk0MzcxODc2NTY2NWUtMDEsICs3Ljc1NDI4MTg5MjkwMTQ3M2UtMDEsICs4LjA1OTQzNzIzMzE1NDYzN2UtMDEsCi0gICAgKzguMzQ4NTg5MzczMzk5OTQ4ZS0wMSwgKzguNjIwMTA4MzM2Mjc2NzMzZS0wMSwgKzguODcyNTk5NzA2ODY1MTIzZS0wMSwKLSAgICArOS4xMDQ4NjMxMjE0NDU2NzllLTAxLCArOS4zMTU5NjI0OTY0MjYyNzhlLTAxLCArOS41MDUyMjA4NjE5MjcyNDhlLTAxLAotICAgICs5LjY3MjM2NjcxMjMyNTQzMWUtMDEsICs5LjgxNzM5NzUwMTMwMzY5NmUtMDEsICs5Ljk0MDU1NzE4MDY2MjcwNGUtMDEsCi0gICAgKzEuMDA0MjQ3NTE0MTAyNDE3ZSswMCwgKzEuMDEyNDA3NDI4MjgyODg0ZSswMCwgKzEuMDE4NjUwOTkwNTYxODQ4ZSswMCwKLSAgICArMS4wMjMxMTg4NDEzODQ0NjBlKzAwLCArMS4wMjU5NzI0NTA5Njk0NDBlKzAwLCArMS4wMjczOTc1MjM5MzkyMTBlKzAwLAotICAgICsxLjAyNzU4NTgzMDY4ODE0M2UrMDAsICsxLjAyNjczODY3MzY0NzQ4MmUrMDAsICsxLjAyNTA2MTc3NzY0ODIzNGUrMDAsCi0gICAgKzEuMDIyNzU2NTE0NjE1MTA2ZSswMCwgKzEuMDIwMDA5MTM5NTQ5Mjc1ZSswMCwgKzEuMDE2OTk2NDk5NTYwODQ1ZSswMCwKLSAgICArMS4wMTM5MTU5NDYxMDA2MjllKzAwLCArMS4wMTEwNDQ4Njk2MzkxNjRlKzAwLCArMS4wMDc3NzM4NTg0NTU0MDBlKzAwLAotICAgICsxLjAwNDg0ODc1Mzk2MjczNGUrMDAsICsxLjAwMjI0NTAwOTEzNTY4NGUrMDAsICs5Ljk5OTM5MzE2OTIzOTAwOWUtMDEsCi0gICAgKzkuOTc5MDU1NDE1NjI3MzMwZS0wMSwgKzkuOTYxMjAzMzc5OTcxMzI2ZS0wMSwgKzkuOTQ1NTk3NTI1NDcxODIyZS0wMSwKLSAgICArOS45MzIwMzE2MDY2MDY3NjJlLTAxLCArOS45MjAyOTcyNzMzMjM4OTFlLTAxLCArOS45MTAyMzA2NTQ0MjQ5MDJlLTAxLAotICAgICs5LjkwMTY2ODk1MzQzNDIyMWUtMDEsICs5Ljg5NDQ4ODM3NDUxMzcxOWUtMDEsICs5Ljg4ODU1NjM1NjAzNzg5MmUtMDEsCi0gICAgKzkuODgzNzc4NTIwNTMxMjY4ZS0wMSwgKzkuODgwMDUxNjI2MzQ1ODA0ZS0wMSwgKzkuODc3Mjk1NDU5NjEwMzQzZS0wMSwKLSAgICArOS44NzU0MTI3Mzk3NjY1NjZlLTAxLCArOS44NzQzMjk4MDk4MDI4OTNlLTAxLCArOS44NzM5NDk5MjEwMzMyOTllLTAxLAotICAgICs5Ljg3NDE5NzA0OTAwMzY3NmUtMDEsICs5Ljg3NDk3MzIwNTg4MjMxOWUtMDEsICs5Ljg3NjIwMTIzODcwMzI0MWUtMDEsCi0gICAgKzkuODc3NzgxOTIwNDMzMDE1ZS0wMSwgKzkuODc5NjM3OTc5OTMzMzM5ZS0wMSwgKzkuODgxNjc4MDA3ODA3MDk1ZS0wMSwKLSAgICArOS44ODM4MzUyMDAxODk2NTNlLTAxLCArOS44ODYwMjIyMTkzOTc4OTJlLTAxLCArOS44ODgxODI3NzEyNjM1MDVlLTAxLAotICAgICs5Ljg5MDI0Nzk3NzYwMjg5NWUtMDEsICs5Ljg5MjE3ODY1ODc0ODIzOWUtMDEsICs5Ljg5MzkyMzY4MDAwNzU3N2UtMDEsCi0gICAgKzkuODk1NDYzMzQyODE1MDA5ZS0wMSwgKzkuODk2NzcyMDExNTQyNjkzZS0wMSwgKzkuODk3ODU5MTk1MjA5MjM1ZS0wMSwKLSAgICArOS44OTg3MjUzNjM4MDk4NDdlLTAxLCArOS44OTk0MTA3ODkyMjM1NTllLTAxLCArOS44OTk5NDU1NTcwNjc5ODBlLTAxLAotICAgICs5LjkwMDM5NDAyMzczNjk3M2UtMDEsICs5LjkwMDgxNDcyMjk0ODg5MGUtMDEsICs5LjkwMTI5Mzc5MDMxMjAwNWUtMDEsCi0gICAgKzkuOTAxOTAyMjY1Njk2NjA5ZS0wMSwgKzkuOTAyNzM0NDQ4ODE1MDA0ZS0wMSwgKzkuOTAzODYyMjgwMDgxMjQ2ZS0wMSwKLSAgICArOS45MDUzNzk4MzA4NzM4MjJlLTAxLCArOS45MDczNDg4MjYzMTI5OTNlLTAxLCArOS45MDk4NDI1OTIzMDEyNzNlLTAxLAotICAgICs5LjkxMjkwNTExODYwNzY0N2UtMDEsICs5LjkxNjU4Njk0MDE2NjUwOWUtMDEsICs5LjkyMDkwNjE1MTIxOTMxMGUtMDEsCi0gICAgKzkuOTI1ODg3MjA4Nzk0MTQ0ZS0wMSwgKzkuOTMxNTE2NTI4NTEzODI0ZS0wMSwgKzkuOTM3NzkwODY2NTY4NzM1ZS0wMSwKLSAgICArOS45NDQ2NjgxODQzNzE2MTdlLTAxLCArOS45NTIxMTY2MzQyOTc1NjZlLTAxLCArOS45NjAwNjg2MTYxODU2NDFlLTAxLAotICAgICs5Ljk2ODQ2MTMyOTgyNTc1M2UtMDEsICs5Ljk3NzIwMzM2OTUxNTU1NmUtMDEsICs5Ljk4NjIxMzUyMDc2OTU5M2UtMDEsCi0gICAgKzkuOTk1MzgyNTgyMjQyOTkwZS0wMSwgKzEuMDAwNDYxOTU1MDc5NjYwZSswMCwgKzEuMDAxMzgwNTUxMjE3MTA5ZSswMCwKLSAgICArMS4wMDIyODQ4NzE3ODYyMjZlKzAwLCArMS4wMDMxNjM4NDUzNjQ5NzBlKzAwLCArMS4wMDQwMDkxNDc0NjIwNDNlKzAwLAotICAgICsxLjAwNDgxMTM3NTA1MzM2NGUrMDAsICsxLjAwNTU2Mzk2ODAwODAzN2UrMDAsICsxLjAwNjI1OTg1NTM2MDg2N2UrMDAsCi0gICAgKzEuMDA2ODk1NTcwNDA4NTYzZSswMCwgKzEuMDA3NDY2NjE2Mjk4MDU3ZSswMCwgKzEuMDA3OTcyNDQxOTkwMTg3ZSswMCwKLSAgICArMS4wMDg0MTE0Njg2MTY4NTJlKzAwLCArMS4wMDg3ODYwMDk3ODcyNjllKzAwLCArMS4wMDkwOTc3NjM4NTAzMzNlKzAwLAotICAgICsxLjAwOTM1MTc2MjU0NjI5NmUrMDAsICsxLjAwOTU1MjQwMTkwMDk2MWUrMDAsICsxLjAwOTcwNzA5Mzc3ODE2MmUrMDAsCi0gICAgKzEuMDA5ODIyMDkwMjIwNDA3ZSswMCwgKzEuMDA5OTA2OTU4NDQ4MDk5ZSswMCwgKzEuMDA5OTY5MDIxNDAwNDc0ZSswMCwKLSAgICArMS4wMTAwMTc4OTA0Mjg4NzdlKzAwLCArMS4wMTAwNjA4MDkyOTk1MzBlKzAwLCArMS4wMTAxMDY1NjQ5NjU5NjVlKzAwLAotICAgICsxLjAxMDE2MTEzMTA5MzM3MmUrMDAsICsxLjAxMDIzMTA3ODQ5NDI0OWUrMDAsICsxLjAxMDMxOTQ4NDUyNDUxMmUrMDAsCi0gICAgKzEuMDEwNDMwNDcwNDk0NTEyZSswMCwgKzEuMDEwNTY0MDk5MjgxMDAwZSswMCwgKzEuMDEwNzIxMzYwMjQzMjM0ZSswMCwKLSAgICArMS4wMTA4OTk2NTU2NzQ1NzhlKzAwLCArMS4wMTEwOTY5OTM5OTMwMzdlKzAwLCArMS4wMTEzMDgxNjc2NzA3NTNlKzAwLAotICAgICsxLjAxMTUyOTE4NTE1MzgwOWUrMDAsICsxLjAxMTc1MzAwODU2OTgwM2UrMDAsICsxLjAxMTk3Mzg3NjUxMTYwM2UrMDAsCi0gICAgKzEuMDEyMTgyODM3MDk0OTU1ZSswMCwgKzEuMDEyMzczMDI4NzM3Nzc0ZSswMCwgKzEuMDEyNTM1MDU4NjAyNDUzZSswMCwKLSAgICArMS4wMTI2NjA5NzU1Mjk4NThlKzAwLCArMS4wMTI3NDA1NzUyOTY2MDNlKzAwLCArMS4wMTI3NjU5MjI0NDk5NjBlKzAwLAotICAgICsxLjAxMjcyNjk1ODk1NDk2MWUrMDAsICsxLjAxMjYxNTkwNDExNjI2NWUrMDAsICsxLjAxMjQyMjg4ODUyMTYwMWUrMDAsCi0gICAgKzEuMDEyMTQwNDYwMjExMTk0ZSswMCwgKzEuMDExNzU4ODEwNTgzMTUwZSswMCwgKzEuMDExMjY5OTYwOTQ3NzQ0ZSswMCwKLSAgICArMS4wMTA2NjM2NzY3MzUyMjhlKzAwLCArMS4wMDk5MzA3NTQ4MDc5MjNlKzAwLCArMS4wMDkwNTgyNDk4NzM4MzNlKzAwLAotICAgICsxLjAwODAzNDMwODI5NTQyMWUrMDAsICsxLjAwNjg0MzM1MjUwNjg1NWUrMDAsICsxLjAwNTQ3MDAwNTYzNzA1MmUrMDAsCi0gICAgKzEuMDAzODk0NzcyNDAzMzcxZSswMCwgKzEuMDAyMDk4ODU0NDAwNTc1ZSswMCwgKzEuMDAwMDYwNjg2NzU4NzU4ZSswMCwKLSAgICArOS45Nzc2MDAxOTY0MDY4NjhlLTAxLCArOS45NTE3NDY0MzAwNjExMjFlLTAxLCArOS45MjI4NjEwODI0NzIyNjRlLTAxLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgODkgb2YgMTc3Ci0gICAgKzkuODkwNzU3ODY4NzA3NTkwZS0wMSwgKzkuODQ3MzYyNDUzNDgwMjY1ZS0wMSwgKzkuNzk4NjEzNTI2MjcxNTYxZS0wMSwKLSAgICArOS43NDEzNzg2MTczMzc3NTllLTAxLCArOS42NzMzMzE5NzU1NTkzMzJlLTAxLCArOS41OTI1Mzk3NTcwNDQ1MTZlLTAxLAotICAgICs5LjQ5Njk4NDA4MTY1MjI4NGUtMDEsICs5LjM4NDYzNDE2MzgyNjcxMWUtMDEsICs5LjI1MzU2Nzk2ODc1MDMyOGUtMDEsCi0gICAgKzkuMTAxOTg2NzkwOTMwNjA1ZS0wMSwgKzguOTI4MzM4MzE2NDk1NzA1ZS0wMSwgKzguNzMxNDM3ODM1OTgzMDQ3ZS0wMSwKLSAgICArOC41MTA0MjA0NDA2ODUwNDllLTAxLCArOC4yNjQ4Mzk5MTEyOTExMzNlLTAxLCArNy45OTQ2ODE0OTI3OTcwODRlLTAxLAotICAgICs3LjcwMDQzMTI3NTIxNjkyOGUtMDEsICs3LjM4MzAyODYwMzA1ODc4M2UtMDEsICs3LjA0MzgxNDM0MDM1NjA4M2UtMDEsCi0gICAgKzYuNjg0NjE2NDc4MjM2NjQ3ZS0wMSwgKzYuMzA3NzU1MzI5MzgyNjEyZS0wMSwgKzUuOTE1Nzk5NTg3MTc2MjE2ZS0wMSwKLSAgICArNS41MTE3MDMxNTU0MDAyNzRlLTAxLCArNS4wOTg5MTU0MjM3MjgxNzllLTAxLCArNC42ODEwMTcxMTAwNDc5NjRlLTAxLAotICAgICs0LjI2MTc3Mjk3MTQ5MzAxMGUtMDEsICszLjg0NTE3MjMzNTUzMTAwOWUtMDEsICszLjQzNTIyODY3MjQ0NTYxM2UtMDEsCi0gICAgKzMuMDM2MDA0NjUxOTczMDk5ZS0wMSwgKzIuNjUxNDM0Njc4MDI4NTMxZS0wMSwgKzIuMjg1MjgzOTY5NDM4MDcyZS0wMSwKLSAgICArMS45NDEwMjE5MDYzMjA5ODRlLTAxLCArMS42MjE3MzU0MTYzODQ4MzBlLTAxLCArMS4zMzAwMTUyNDA5Mzg2MTVlLTAxLAotICAgICsxLjA2Nzg0MDQzMDE5MzcyNGUtMDEsICs4LjM2NTA1NzIzNjYyMzA0MWUtMDIsICs2LjM2NTE4ODExMTM4MTM1NmUtMDIsCi0gICAgKzQuNjc2NTM4NDEyMjU3NjIxZS0wMiwgKzMuMjg4MDcyNzUwNzMyMjE1ZS0wMiwgKzIuMTgzMDU3NTY0NjQ2MjcwZS0wMiwKLSAgICArMS4zMzYzODE0MjU4MDMwMTllLTAyLCArNi43NTgxMjQ4ODk2OTc3ODdlLTAzLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMH07Ci0KLS8vIFNlY3Rpb24gNS43LjIuMyB3MjQwIChkMDlyMDEucGRmKQotZG91YmxlIHdfTjI0MFs0ODBdID0gewotICAgIC0zLjYxMzQ5NjQxODkyODM2OWUtMDQsIC03LjA3ODU0NjcwNjUxMjM5MWUtMDQsIC0xLjA3NDQ0MzYzNzExMDkwM2UtMDMsCi0gICAgLTEuNTMzNDc4NTM3OTY0NTA5ZS0wMywgLTIuMDk4MTk3NzI3OTAwNzI0ZS0wMywgLTIuNzc4NDIwODcxODE1NzQwZS0wMywKLSAgICAtMy41ODQxMjk5MjA2NzMwNDFlLTAzLCAtNC41MjUxOTgwNzYwMDIzNzBlLTAzLCAtNS42MDkzMjcyNDM3MTIwNTVlLTAzLAotICAgIC02Ljg0MzIzNDUzNjEwNTYyNGUtMDMsIC04LjIzMzk3NjMyNzMwMDYxMmUtMDMsIC05Ljc4NTMxNDc1NTU1NzAyM2UtMDMsCi0gICAgLTEuMTQ5ODgwMzAzMDcxNTUxZS0wMiwgLTEuMzM3NzEzMDk2MjU3OTM0ZS0wMiwgLTEuNTQyMTgxNjc5NTExNjE4ZS0wMiwKLSAgICAtMS43NjI5Nzk5MTA5NjE3MjdlLTAyLCAtMS45OTk3MjE1NTc0MDE1MDJlLTAyLCAtMi4yNTIwODA1NjEzOTAxNDllLTAyLAotICAgIC0yLjUxOTQwNjMwMDM4OTAzMGUtMDIsIC0yLjgwMDkwOTQ2NDI3NDc4MmUtMDIsIC0zLjA5NTc2NTA5Mjk1NjcyOGUtMDIsCi0gICAgLTMuNDAyOTk2MjY2OTQ4MzQ5ZS0wMiwgLTMuNzIxNTAyMDgyMjQ1MDU1ZS0wMiwgLTQuMDUwMDUzMjQ3NTY4MzkzZS0wMiwKLSAgICAtNC4zODcyMTkyMTg3MDYxODllLTAyLCAtNC43MzE3NjgyNjE2MDYxNzVlLTAyLCAtNS4wODIzMjUzNDI2NzI2NjdlLTAyLAotICAgIC01LjQzNzE2NjYzNTE1OTUxOGUtMDIsIC01Ljc5NDY1NDgzNDAzNDA1NWUtMDIsIC02LjE1MzQyNjIwMTczMjQ5OWUtMDIsCi0gICAgLTYuNTExNzA4MTYzMTEzNzA5ZS0wMiwgLTYuODY3NjA2NzUzNTMxNDQxZS0wMiwgLTcuMjE5NDQ3ODA1MjUwNzcxZS0wMiwKLSAgICAtNy41NjU2OTU5NzU1OTIxNzBlLTAyLCAtNy45MDQ2NDc0NDA3ODg2OTJlLTAyLCAtOC4yMzQ0NDI1NTczMjIyNTFlLTAyLAotICAgIC04LjU1MzMyNDU3OTkwNTE4NWUtMDIsIC04Ljg1OTcwNTQ2ODA4NTkyNWUtMDIsIC05LjE1MjA5MTEwMDc5ODE5OWUtMDIsCi0gICAgLTkuNDI4ODQ3NDQ2NzU1OTY1ZS0wMiwgLTkuNjg4MzAzNjIzMDQ5MTk4ZS0wMiwgLTkuOTI5MTIzMjU4NTM3ODEzZS0wMiwKLSAgICAtMS4wMTUwMDg0Njc2ODg1NzdlLTAxLCAtMS4wMzQ5NjEyNDEyNjM1MjNlLTAxLCAtMS4wNTI2MzcwMDM1NDQ0NDNlLTAxLAotICAgIC0xLjA2NzkzOTk4NDY4Nzc0NWUtMDEsIC0xLjA4MDc2NjQ1NzYxNjg3OGUtMDEsIC0xLjA5MDk5NzMwMDU5MDUwNmUtMDEsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSA5MCBvZiAxNzcKLSAgICAtMS4wOTg1MjQ0OTE1MTU4MDVlLTAxLCAtMS4xMDMyNDIyNjI2MDA5MTNlLTAxLCAtMS4xMDUwODQ2MTkxNDg3ODllLTAxLAotICAgIC0xLjEwMzk3NzQwODc0MTkzMmUtMDEsIC0xLjA5OTgwOTg1MTQyNDU1MGUtMDEsIC0xLjA5MjQ5Mjc3NDM5MjgyNGUtMDEsCi0gICAgLTEuMDgxOTc0MjI3NDE2NTAyZS0wMSwgLTEuMDY4MTcyMTQyMjMwODgyZS0wMSwgLTEuMDUwOTk1ODAzMjg1NDU1ZS0wMSwKLSAgICAtMS4wMzAzNjAxMTExMTExMDNlLTAxLCAtMS4wMDYxOTA0MTg3OTE2NDhlLTAxLCAtOS43ODQxMjAwMjM0MTE3NzFlLTAyLAotICAgIC05LjQ2OTMwNDIxNjg4MzAyN2UtMDIsIC05LjExNjQ1MjUwNjQ5MjUyN2UtMDIsIC04LjcyNDY0NDUzMjg2Njk5NmUtMDIsCi0gICAgLTguMjkzMDQzOTE0MDQ0NjMyZS0wMiwgLTcuODIwNjE3NDgzMjU0NzMwZS0wMiwgLTcuMzA2MTQyNDI3NDU2ODYyZS0wMiwKLSAgICAtNi43NDg0NjgxODIxMDU5OTFlLTAyLCAtNi4xNDY2ODgxMjQxNjY5NDhlLTAyLCAtNS40OTk0OTcyNTgyMDAzNjJlLTAyLAotICAgIC00LjgwNTQ0NDQyNDQ1NDgyMGUtMDIsIC00LjA2MzM2Mjg1NTcwMTYyM2UtMDIsIC0zLjI3MjA0NTU5MDIyOTMzNWUtMDIsCi0gICAgLTIuNDMwMTIyNTgyNDUxODUzZS0wMiwgLTEuNTM2MzI5NTIwNzg4NzY2ZS0wMiwgLTUuODkxNDM0MjY5ODkwNjU5ZS0wMywKLSAgICArNC4xMjY1OTU4NTg1ODMyOTVlLTAzLCArMS40NzAxNTUwNjg3NDYzMDNlLTAyLCArMi41ODQ3MzgxOTE0NTk4MTRlLTAyLAotICAgICszLjc1NzY1Mjc3MjI0NjgwMWUtMDIsICs0Ljk4OTczNjUwOTA4MDU1OGUtMDIsICs2LjI4MjAzNDAzMDU5MjkwMmUtMDIsCi0gICAgKzcuNjM1Mzk3NzI4NTY2MTIxZS0wMiwgKzkuMDUwMzY5MjU3MTUyMDc5ZS0wMiwgKzEuMDUyNzQ3MTE4NDc4NjYwZS0wMSwKLSAgICArMS4yMDY3MDM0Njc1MTMzMzNlLTAxLCArMS4zNjY5MTEwMTk0MTQ0MTdlLTAxLCArMS41MzMzNDM4OTA2ODEzOTBlLTAxLAotICAgICsxLjcwNTk1NDcwOTE4NDM5OWUtMDEsICsxLjg4NDY4NjM4OTIxODMyMmUtMDEsICsyLjA2OTQ0OTk2MjU3NDA5MmUtMDEsCi0gICAgKzIuMjYwMDkzMDAwMDY3MzkzZS0wMSwgKzIuNDU2NDU2ODAzNDY3MDk1ZS0wMSwgKzIuNjU4MzQ2MDE5MzMyNTg0ZS0wMSwKLSAgICArMi44NjU1NDM4MTQwNDk3NzJlLTAxLCArMy4wNzc3ODkwNzg4ODk4MjBlLTAxLCArMy4yOTQ3Njk0MzcwNzIyOTBlLTAxLAotICAgICszLjUxNjE3MTQ4MTc1MDM1MGUtMDEsICszLjc0MTY0MjM3MzA2MDE4OGUtMDEsICszLjk3MDczOTU5MTIxMTU1MWUtMDEsCi0gICAgKzQuMjAzMDQzMDQ2ODg1MjE5ZS0wMSwgKzQuNDM4MTE0Nzk5MjEzNTc2ZS0wMSwgKzQuNjc1NDQyMjkxNjIzMDEyZS0wMSwKLSAgICArNC45MTQ0OTg2MzEwNDU2MTVlLTAxLCArNS4xNTQ3MzU0NTY1Mzk3MDBlLTAxLCArNS4zOTU1NTc2NDQyOTMyMjJlLTAxLAotICAgICs1LjYzNjM5OTgxNzAzMjUyNWUtMDEsICs1Ljg3NjY2MTcyMjU2NDI4OWUtMDEsICs2LjExNTY5NTMxMDE0MzE1N2UtMDEsCi0gICAgKzYuMzUyODkwNTkyODc0MDk5ZS0wMSwgKzYuNTg3NjE5NzY3ODA5MDAwZS0wMSwgKzYuODE5MjMwOTc0NDIzNTUwZS0wMSwKLSAgICArNy4wNDcwOTI4MTkzMTQ3NzllLTAxLCArNy4yNzA1NzY2OTk4NDEzNTllLTAxLCArNy40ODkwNjg5NjMzODQyNzJlLTAxLAotICAgICs3LjcwMTk5MDE4NzYwNjk5NWUtMDEsICs3LjkwODc1Mjk4OTI5NTMzNWUtMDEsICs4LjEwODc4ODY5MjE1MTgwN2UtMDEsCi0gICAgKzguMzAxNTc5MTM5MTYwNjgxZS0wMSwgKzguNDg2NjQzMzY0OTU5NzMzZS0wMSwgKzguNjYzNTQ4MTY0MzI5MDkzZS0wMSwKLSAgICArOC44MzE4OTY4NTMwNTM2MjdlLTAxLCArOC45OTEzMjAyMzU0ODQzNDllLTAxLCArOS4xNDE1NDA1NjM2NTYwNzVlLTAxLAotICAgICs5LjI4MjI4MjU0NjE1MTgxOWUtMDEsICs5LjQxMzM0ODE0NTI3Mjg0MmUtMDEsICs5LjUzNDYxOTM4ODQwMDQ1OWUtMDEsCi0gICAgKzkuNjQ2MDQ4MjUwNTAxOTEwZS0wMSwgKzkuNzQ3NjM0ODI3OTQxNTc1ZS0wMSwgKzkuODM5NDM1Mzg1MjE5MTkyZS0wMSwKLSAgICArOS45MjE1MjkwOTcxNTQyNDJlLTAxLCArOS45OTQxMTQ3MzA0MTU4NTdlLTAxLCArMS4wMDU3NDYwODQ2NTAyMzZlKzAwLAotICAgICsxLjAxMTE4Mzk3MTM0NzgxNWUrMDAsICsxLjAxNTc2MDM3Mzc5MTYwM2UrMDAsICsxLjAxOTUxNTA3MjQxMjM4N2UrMDAsCi0gICAgKzEuMDIyNDkwOTM3MDM0NjQxZSswMCwgKzEuMDI0NzM2MTY0MDY5Njk3ZSswMCwgKzEuMDI2MzA0MDk1NzAwNjkzZSswMCwKLSAgICArMS4wMjcyNTA5NzgyOTIyMTRlKzAwLCArMS4wMjc2MzQyOTQ0NTYyMDVlKzAwLCArMS4wMjc1MTEwNjM2NDQ4NDNlKzAwLAotICAgICsxLjAyNjk0Mjc5NTExNTU5OGUrMDAsICsxLjAyNTk5MTQ5Mzk4MzgzNmUrMDAsICsxLjAyNDcxNjE0OTk2OTA4NGUrMDAsCi0gICAgKzEuMDIzMTc1OTc2MTYzNDA3ZSswMCwgKzEuMDIxNDI3MjEwNjAzMjg0ZSswMCwgKzEuMDE5NTIxNTY2NjM0MjM5ZSswMCwKLSAgICArMS4wMTc1MTAxMTgzMjc1MDhlKzAwLCArMS4wMTU0Mzk4NTk1NDkzNTdlKzAwLCArMS4wMTM0NjA5MTY4MzkxNzRlKzAwLAotICAgICsxLjAxMTY1NDkwMTA0MDQ3NWUrMDAsICsxLjAwOTM2NjkyNTQ5OTU1MGUrMDAsICsxLjAwNzI2MzE4MjEzMjg5NGUrMDAsCi0gICAgKzEuMDA1MzEzMTkyMzg2ODY2ZSswMCwgKzEuMDAzNTA4MTYyNDE2NDQ5ZSswMCwgKzEuMDAxODQwNzg3MzE5Mzc4ZSswMCwKLSAgICArMS4wMDAzMDM5MjcyMzQzODBlKzAwLCArOS45ODg4OTgyMDYyNTc1NTllLTAxLCArOS45NzU5MTUyODM0ODA2NzBlLTAxLAotICAgICs5Ljk2NDAxNTI4NDc2NTk2OGUtMDEsICs5Ljk1MzEzMzkwMjQyNzg2OWUtMDEsICs5Ljk0MzIwMTA3ODA1MzIxMmUtMDEsCi0gICAgKzkuOTM0MTU4OTU5MTg2MDExZS0wMSwgKzkuOTI1OTQzOTE5MjA4MTkwZS0wMSwgKzkuOTE4NTEwMjc3MzI2MDI2ZS0wMSwKLSAgICArOS45MTE3OTc5ODgzNjM4ODdlLTAxLCArOS45MDU3NzE5NTc5MTc3MzFlLTAxLCArOS45MDAzODEwNDc2NDM4MzhlLTAxLAotICAgICs5Ljg5NTU5NDM5NDE3OTE1MmUtMDEsICs5Ljg5MTM3MTYxNjU1NzAxNGUtMDEsICs5Ljg4NzY4NDM3MzYwNDE1NGUtMDEsCi0gICAgKzkuODg0NDk3OTI0NTcwOTI5ZS0wMSwgKzkuODgxNzkwNzQ3MjEyMzkxZS0wMSwgKzkuODc5NTI4MzU4MjMwNzI2ZS0wMSwKLSAgICArOS44Nzc2OTEzNjg1OTA2ODllLTAxLCArOS44NzYyNDkyNjkxNzQ1ODZlLTAxLCArOS44NzUxNzk5NDczNDY4ODdlLTAxLAotICAgICs5Ljg3NDQ1ODEyNzMxMjkyMWUtMDEsICs5Ljg3NDA1NjI3NTUwOTU4NWUtMDEsICs5Ljg3Mzk1MTExNTg4Njk3OWUtMDEsCi0gICAgKzkuODc0MTE1MzY4MTY4OTQ0ZS0wMSwgKzkuODc0NTI0ODQ5MTkyNDU2ZS0wMSwgKzkuODc1MTQ5ODg4MzQ3MTQ0ZS0wMSwKLSAgICArOS44NzU5Njg4OTQ3NjA4NTdlLTAxLCArOS44NzY5NTExMzQwODQyMTNlLTAxLCArOS44NzgwNzU4MTk0MjQ1NDllLTAxLAotICAgICs5Ljg3OTMxMTk5ODE3NzIzOGUtMDEsICs5Ljg4MDY0MDYxNzAzMDg4NGUtMDEsICs5Ljg4MjAzMjU3MTU2NTkxN2UtMDEsCi0gICAgKzkuODgzNDcxMDg0MDg1NTAzZS0wMSwgKzkuODg0OTI2ODczNTUxMzc1ZS0wMSwgKzkuODg2Mzg2NTkyMTIwNTQ1ZS0wMSwKLSAgICArOS44ODc4MjU1NzgyOTU2MzBlLTAxLCArOS44ODkyMzAwMzEwMjIwODllLTAxLCArOS44OTA1ODE3MTU5MzMzOTVlLTAxLAotICAgICs5Ljg5MTg2NzY3NDI4NDYxMGUtMDEsICs5Ljg5MzA3NDk2NTM4NDY1OWUtMDEsICs5Ljg5NDE5NjM5OTA2MjkyMWUtMDEsCi0gICAgKzkuODk1MjIwNzU3MTc0Mzc4ZS0wMSwgKzkuODk2MTQ2MzMxODg5MTA3ZS0wMSwgKzkuODk2OTcwMzQ2Njc4MjcyZS0wMSwKLSAgICArOS44OTc2OTI1OTY1MzUyODllLTAxLCArOS44OTgzMTkyNjkzNDcwNjBlLTAxLCArOS44OTg4NTI1NzI2NTM2NjdlLTAxLAotICAgICs5Ljg5OTMwNzY0MDM2NTcyN2UtMDEsICs5Ljg5OTY5MzEwMjAyNTM0M2UtMDEsICs5LjkwMDAyNTY5MjUyMjQzNWUtMDEsCi0gICAgKzkuOTAwMzIxNTYyMjYzMDk5ZS0wMSwgKzkuOTAwNjAzMzUyNjMyMTIxZS0wMSwgKzkuOTAwODg5ODEyODk0NDA2ZS0wMSwKLSAgICArOS45MDEyMDY1ODYwMTI5MDdlLTAxLCArOS45MDE1NzUwMTUxNTU3MjBlLTAxLCArOS45MDIwMjM5NDYyMTQyMjBlLTAxLAotICAgICs5LjkwMjU3NTQwNjE0MjIxM2UtMDEsICs5LjkwMzI1NTI4OTA1MTYwNWUtMDEsICs5LjkwNDA4NzkxNDQ2MjY5NGUtMDEsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSA5MSBvZiAxNzcKLSAgICArOS45MDUwOTY0OTE1ODMwNDVlLTAxLCArOS45MDYzMDM3ODcxNTAzMjZlLTAxLCArOS45MDc3MjcxMDg4OTQwMjRlLTAxLAotICAgICs5LjkwOTM4NzQ0NDA3ODkxOWUtMDEsICs5LjkxMTI5ODg5NDcwOTk5MGUtMDEsICs5LjkxMzQ3NjMxODc2MzIxOGUtMDEsCi0gICAgKzkuOTE1OTI4NTYwNDAyNTYzZS0wMSwgKzkuOTE4NjY1NDkxMTgyOTIyZS0wMSwgKzkuOTIxNjkxMzE1MzgwOTg0ZS0wMSwKLSAgICArOS45MjUwMTA4NTE0NjEyMzJlLTAxLCArOS45Mjg2MTk3MjcxNTQyNTJlLTAxLCArOS45MzI1MTkxODE1NjQ2MTNlLTAxLAotICAgICs5LjkzNjcwMDIwNzM3NTE3M2UtMDEsICs5Ljk0MTE1NjA2OTEzNjIzOGUtMDEsICs5Ljk0NTg3MzE0NzkwMzI0NGUtMDEsCi0gICAgKzkuOTUwODM3NDAyMDYzMjc4ZS0wMSwgKzkuOTU2MDMzNzc1NTM5ODg0ZS0wMSwgKzkuOTYxNDM5OTIyNjIxMTY2ZS0wMSwKLSAgICArOS45NjcwMzQ1MzM5MjEzNDBlLTAxLCArOS45NzI3OTMxMDk1NTg1MjFlLTAxLCArOS45Nzg2OTA4NTgzNjcwMjRlLTAxLAotICAgICs5Ljk4NDY5NzA4Nzg5NjI2OGUtMDEsICs5Ljk5MDc4NDg0MDcyOTI0NGUtMDEsICs5Ljk5NjkxOTAxMTIwNjQ5MGUtMDEsCi0gICAgKzEuMDAwMzA4MTkzODMzNTI2ZSswMCwgKzEuMDAwOTIyMzY1OTAxOTQ1ZSswMCwgKzEuMDAxNTMyNjM2NTkwNjc2ZSswMCwKLSAgICArMS4wMDIxMzU0NjQ2NTUxNzdlKzAwLCArMS4wMDI3MjgxMTEzODY5MDllKzAwLCArMS4wMDMzMDc0NDk3NzAxODdlKzAwLAotICAgICsxLjAwMzg3MDkzNDA4OTY4NmUrMDAsICsxLjAwNDQxNjAzODA5ODIzN2UrMDAsICsxLjAwNDk0MDU0ODgxNTE3MWUrMDAsCi0gICAgKzEuMDA1NDQyMTQxODEwMTYwZSswMCwgKzEuMDA1OTE5MjI0MTI3OTExZSswMCwgKzEuMDA2MzcwMzAzMTQ5MzE0ZSswMCwKLSAgICArMS4wMDY3OTM5Mjc4MjQ1MzhlKzAwLCArMS4wMDcxODkzNDUwMjU1MjVlKzAwLCArMS4wMDc1NTU1NzM0NTU4OTVlKzAwLAotICAgICsxLjAwNzg5MjY3NDk2MTMzNmUrMDAsICsxLjAwODIwMDE0NjM2OTQyNmUrMDAsICsxLjAwODQ3ODQyMzI4NDg1MWUrMDAsCi0gICAgKzEuMDA4NzI3ODg0OTk3NjE5ZSswMCwgKzEuMDA4OTQ5NDkzNTI1NzUzZSswMCwgKzEuMDA5MTQ0MTEyNzM0NzYxZSswMCwKLSAgICArMS4wMDkzMTMyMjQ5Mjk1NzVlKzAwLCArMS4wMDk0NTgyNDE0MjUxNDNlKzAwLCArMS4wMDk1ODEyODA1NTU2ODJlKzAwLAotICAgICsxLjAwOTY4NDA5MDY4NzE2NGUrMDAsICsxLjAwOTc2ODk4MDgxNzM4NGUrMDAsICsxLjAwOTgzODMwODcwODc5OWUrMDAsCi0gICAgKzEuMDA5ODk0NTQ4MjU3ODA3ZSswMCwgKzEuMDA5OTQwMzM2MjI4Njk0ZSswMCwgKzEuMDA5OTc3OTE2NjQzNjgwZSswMCwKLSAgICArMS4wMTAwMTAyMzAyOTAyNjNlKzAwLCArMS4wMTAwMzk0NTM1MzkxMDdlKzAwLCArMS4wMTAwNjgyMDIwMzg2OTRlKzAwLAotICAgICsxLjAxMDA5ODM4ODY4OTM0MmUrMDAsICsxLjAxMDEzMjMyMzk5NjQwMWUrMDAsICsxLjAxMDE3MTY1Njc3NTY0MGUrMDAsCi0gICAgKzEuMDEwMjE4MDk2MTQ4NDEyZSswMCwgKzEuMDEwMjcyNTI0ODQ4NTE5ZSswMCwgKzEuMDEwMzM2NDkwMjk0NzcxZSswMCwKLSAgICArMS4wMTA0MTAyMjE0ODMyMTVlKzAwLCArMS4wMTA0OTQzNTQ1MzIzNTNlKzAwLCArMS4wMTA1ODg4NzM2OTk0MjJlKzAwLAotICAgICsxLjAxMDY5MzUwMTE4NjkyOGUrMDAsICsxLjAxMDgwODA2ODc3NDMxNmUrMDAsICsxLjAxMDkzMTQzNjczOTM0MmUrMDAsCi0gICAgKzEuMDExMDYyODc2NTAzMDQxZSswMCwgKzEuMDExMjAxMDcxMTI3OTI3ZSswMCwgKzEuMDExMzQ0NzAwNjk0NDE3ZSswMCwKLSAgICArMS4wMTE0OTE5MDQyMjgxODRlKzAwLCArMS4wMTE2NDEyNzI0MDYwMjNlKzAwLCArMS4wMTE3OTAyODI0NzQ5NjNlKzAwLAotICAgICsxLjAxMTkzNzU2NzI1NDQ4NWUrMDAsICsxLjAxMjA4MDEyNTkzNDY4N2UrMDAsICsxLjAxMjIxNjIzNTQ4NzM1M2UrMDAsCi0gICAgKzEuMDEyMzQyOTA3OTUxMzM0ZSswMCwgKzEuMDEyNDU4MTgzMTIyMDMzZSswMCwgKzEuMDEyNTU4ODc5Njk2ODUxZSswMCwKLSAgICArMS4wMTI2NDI4NTczODA4NDdlKzAwLCArMS4wMTI3MDY5NTU4MDAyODllKzAwLCArMS4wMTI3NDg5NTI5MDc0MDRlKzAwLAotICAgICsxLjAxMjc2NTc5OTg5NDQ1M2UrMDAsICsxLjAxMjc1NTAxMzg0Mzk4NWUrMDAsICsxLjAxMjcxMzc5ODY3ODIxMWUrMDAsCi0gICAgKzEuMDEyNjM5Nzc1MDAzNDU3ZSswMCwgKzEuMDEyNTMwMTM0NDExNjE5ZSswMCwgKzEuMDEyMzgyMzA5NDczNDcwZSswMCwKLSAgICArMS4wMTIxOTQwNjgxMTc1MjRlKzAwLCArMS4wMTE5NjIzMzExMDA4NjRlKzAwLCArMS4wMTE2ODUxNzM3MjQ2MDFlKzAwLAotICAgICsxLjAxMTM1OTE0MzU3MjE0N2UrMDAsICsxLjAxMDk4MjEzNTUwNjk4NmUrMDAsICsxLjAxMDU1MDcxNTk3MTM2OGUrMDAsCi0gICAgKzEuMDEwMDYyMTMzMTUxOTIyZSswMCwgKzEuMDA5NTEyNDM4MDQ5NTEwZSswMCwgKzEuMDA4ODk4Njg5Mzk0MTYwZSswMCwKLSAgICArMS4wMDgyMTU5MjM2MDA5NzNlKzAwLCArMS4wMDc0NjA4NjAyODYzOTVlKzAwLCArMS4wMDY2Mjc3NDE4MjMzODllKzAwLAotICAgICsxLjAwNTcxMjMzNzY1Njc0OWUrMDAsICsxLjAwNDcwODY3NzQ5MTA4NmUrMDAsICsxLjAwMzYxMTQ2NzI4NTU4OGUrMDAsCi0gICAgKzEuMDAyNDE0Mjg2MzkyMjY4ZSswMCwgKzEuMDAxMTExNDEzMjQyMzAyZSswMCwgKzkuOTk2OTYxNjUxMDkzMTgxZS0wMSwKLSAgICArOS45ODE2MjU5NDk1MjUzNDVlLTAxLCArOS45NjUwNDEwMTc2MjM1OTZlLTAxLCArOS45NDcxNDg4ODQyNzcwMzdlLTAxLAotICAgICs5LjkyNzg5MTkxMjg0MTM0NWUtMDEsICs5LjkwNzE5OTk5NTczMDg0NWUtMDEsICs5Ljg4NDc5MzcwNzUzMzE5NGUtMDEsCi0gICAgKzkuODU1MzQ3NjYwMDE2Njk2ZS0wMSwgKzkuODIzNzY1ODY1OTgzMjg2ZS0wMSwgKzkuNzg5NzQ3MzMzNDA0OTMzZS0wMSwKLSAgICArOS43NTE2MjM4MTE0ODYzNzJlLTAxLCArOS43MDg4MjE3NDc2MDg5OThlLTAxLCArOS42NjA4MDU1MjQ2OTU4NzBlLTAxLAotICAgICs5LjYwNjk3NjM5OTE4NDY0NWUtMDEsICs5LjU0NjczMjk3NjA3MzcwNmUtMDEsICs5LjQ3OTQ3OTM0NTI4MjM3NmUtMDEsCi0gICAgKzkuNDA0NjA5MDUyOTMzMzk2ZS0wMSwgKzkuMzIxNTUzODYxNTY0MDA2ZS0wMSwgKzkuMjI5Nzc1NDc4NDQyODg4ZS0wMSwKLSAgICArOS4xMjg3NDUzNTQ1NzA4MjNlLTAxLCArOS4wMTgwMDM2ODIwODEzNDhlLTAxLCArOC44OTcxNjMyNzU2MDUwNDFlLTAxLAotICAgICs4Ljc2NTkwODk3NDk5NjE4NmUtMDEsICs4LjYyMzk4NDA3Nzk1MzU1N2UtMDEsICs4LjQ3MTIwMDgwMTg1NDM4NWUtMDEsCi0gICAgKzguMzA3NDc5NzI3MDIwMjQ1ZS0wMSwgKzguMTMyODE3MzY1MjM2MTQxZS0wMSwgKzcuOTQ3MjkxNDQ3NTg1MjY3ZS0wMSwKLSAgICArNy43NTExMDg4NDE4OTE4MDdlLTAxLCArNy41NDQ1NTE5NzQ4MzY4MzRlLTAxLCArNy4zMjc5NjM1NTI5MjE3MTdlLTAxLAotICAgICs3LjEwMTc5MDg0MzIwOTE0OGUtMDEsICs2Ljg2NjU4MDcxNjI2NzQxOGUtMDEsICs2LjYyMjk2MjQzMjM2ODczMWUtMDEsCi0gICAgKzYuMzcxNjg0MTE5NjA0NzQyZS0wMSwgKzYuMTEzNDg4MDM4Nzg5MTkwZS0wMSwgKzUuODQ5MjA2NjA0OTM0ODE1ZS0wMSwKLSAgICArNS41Nzk3NDc0Mjg2NjM0ODdlLTAxLCArNS4zMDYxODE2NDkzMTY3MTdlLTAxLCArNS4wMjk1MjM5NTcwNTkxMjJlLTAxLAotICAgICs0Ljc1MDg2ODgyNTUxMTYxNGUtMDEsICs0LjQ3MTMwOTg1MDk5OTUzNWUtMDEsICs0LjE5MjA0OTkxNzk0NTI4OGUtMDEsCi0gICAgKzMuOTE0MjUyOTEwOTk4ODIwZS0wMSwgKzMuNjM5MTE0NjgxMTU2MjUyZS0wMSwgKzMuMzY3ODM3NzcyOTU0NDc2ZS0wMSwKLSAgICArMy4xMDE2Mjc4NDMxNjA5NzNlLTAxLCArMi44NDE2NDcwMzMzOTI0MThlLTAxLCArMi41ODkwMzM3MTE4MDg0NTRlLTAxLAotICAgICsyLjM0NDg4MDYwMzcxMDk3NWUtMDEsICsyLjExMDIwOTQ0ODc0Nzk3NGUtMDEsICsxLjg4NTk5NzY0MjI5NjQ4OGUtMDEsCi0gICAgKzEuNjczMTAwODA3OTA0ODM0ZS0wMSwgKzEuNDcyMjg3OTY4MzI3NzA2ZS0wMSwgKzEuMjg0MjIzMDc0MTY3Mzk2ZS0wMSwKLSAgICArMS4xMDk0MjI1NDg3MTAzNDRlLTAxLCArOS40ODI2NjUzNDk1MDIzMDZlLTAyLCArOC4wMDk5MTQzNjY4Mjk1NThlLTAyLAotICAgICs2LjY3Njc2NTg0NzM5ODQwM2UtMDIsICs1LjQ4MjQzNjYwODMyODQ4NWUtMDIsICs0LjQyNDU4ODg1MTU3MTI4MWUtMDIsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSA5MiBvZiAxNzcKLSAgICArMy40OTkzNjEwMDA3MTc2MjFlLTAyLCArMi43MDE0NjE0MDUwNTYyNjdlLTAyLCArMi4wMjQzNzAxODA2NzAxNDVlLTAyLAotICAgICsxLjQ2MDc5Njc1NTEzNzUzOGUtMDIsICs5Ljk5Njc0MzU4ODM2NzUzMWUtMDMsICs1LjMwNTIzNTA5ODg3MTQ0NGUtMDMsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDB9OwotCi0vLyBTZWN0aW9uIDUuNy4yLjQgdzMyMCAoZDA5cjAxLnBkZikKLWRvdWJsZSB3X04zMjBbNjQwXSA9IHsKLSAgICAtMy4wMjExNTM0OTQwNTcxNDNlLTA0LCAtNS44Njc3Mzc0ODc5MzkyOTRlLTA0LCAtOC4zNjY1MDQwMDQxMzk3OTZlLTA0LAotICAgIC0xLjEyNjYzNTM1NTcyNTQ5NGUtMDMsIC0xLjQ3MDQ5Mjk0MTY5NDMzMWUtMDMsIC0xLjg3MzQ3MzM5MTAxODQ5NWUtMDMsCi0gICAgLTIuMzM5MjkyMzYyMDgyMDIxZS0wMywgLTIuODcyMDA4MDY5NDE5MjY0ZS0wMywgLTMuNDc2MjU2Mzg1MDg2NDA3ZS0wMywKLSAgICAtNC4xNTU5NjM4MTY3MDU1MjhlLTAzLCAtNC45MTQ1NjM3ODc2NjU1MDRlLTAzLCAtNS43NTUxNzI1MDM5NTMyNTFlLTAzLAotICAgIC02LjY4MDYyMzM4MDUzMzEyMmUtMDMsIC03LjY5MzgxNjkyNDY1MDU2N2UtMDMsIC04Ljc5Njc2MDc0OTc1MDE5MWUtMDMsCi0gICAgLTkuOTkwNTAzMDczNzA1OTgyZS0wMywgLTEuMTI3NTc0MTE3MTM4NjIxZS0wMiwgLTEuMjY1MzM0MTUyMTI5Njg1ZS0wMiwKLSAgICAtMS40MTI0Mzg5ODY1MjI3MDJlLTAyLCAtMS41Njg4ODk2MjA0MzAyOTBlLTAyLCAtMS43MzQ1MTIwODkzNjYxMTdlLTAyLAotICAgIC0xLjkwOTA5NzM2ODM2Mjc5N2UtMDIsIC0yLjA5MjU0NjcxMTE2ODc1NGUtMDIsIC0yLjI4NDY4NDc5MjgxODg1NmUtMDIsCi0gICAgLTIuNDg1MjA3NzE2MjM0OTUxZS0wMiwgLTIuNjkzNzQ2NzA0MzI4MzQ5ZS0wMiwgLTIuOTA5OTUyNDg2MTkzOTk5ZS0wMiwKLSAgICAtMy4xMzM1MDQ2Mjk0OTM4MzJlLTAyLCAtMy4zNjM5NjA3MjgzNjEzNTJlLTAyLCAtMy42MDA4MjA5NzQ0NTc5NjllLTAyLAotICAgIC0zLjg0MzYwMTc0MTc0Njk3MWUtMDIsIC00LjA5MTc0NjAzNDg1MDE2MWUtMDIsIC00LjM0NDY1NDg5NDk0ODM0NGUtMDIsCi0gICAgLTQuNjAxNzg2NzI0NjI0MDQ4ZS0wMiwgLTQuODYyNTk4NTA5MjgyNDk3ZS0wMiwgLTUuMTI2NDc0MjA0NjU1NjYzZS0wMiwKLSAgICAtNS4zOTI2NDQ3NTM1NTY2MTZlLTAyLCAtNS42NjAzODQzMTEwODEwNDdlLTAyLCAtNS45MjkxMTY3NDcwNzIwODBlLTAyLAotICAgIC02LjE5ODI2ODIwMjUxMTkyNmUtMDIsIC02LjQ2NzAyNTU0ODA3MTE4NGUtMDIsIC02LjczNDU0MjIxNjE4NDUyNmUtMDIsCi0gICAgLTcuMDAwMDk5MDE3MTk4MjgwZS0wMiwgLTcuMjYzMDU3MDExMzU0MzIxZS0wMiwgLTcuNTIyNzg0OTYxMzc3MTUxZS0wMiwKLSAgICAtNy43Nzg1MjU5NDIzNDc3MTRlLTAyLCAtOC4wMjk0ODAyNDc4Mzk4NzhlLTAyLCAtOC4yNzQ5MjQ1MzUzNzM2MTRlLTAyLAotICAgIC04LjUxNDEyNTQ2NDA4NzIxNWUtMDIsIC04Ljc0NjM3OTEyMzIzODI3NWUtMDIsIC04Ljk3MTA2OTM0MTgzNDI2M2UtMDIsCi0gICAgLTkuMTg3NTY0MDg0NjM4MzQ3ZS0wMiwgLTkuMzk1MTc2OTc1MzQ3MTkzZS0wMiwgLTkuNTkzMTM3NzM1ODg2ODg5ZS0wMiwKLSAgICAtOS43ODA4NDMyNTc2NTkyNDNlLTAyLCAtOS45NTc4NTEzMDM4Mjc4ODZlLTAyLCAtMS4wMTIzNjExNjUzMTQ1OTZlLTAxLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgOTMgb2YgMTc3Ci0gICAgLTEuMDI3NzQxMDM2NDk1NjQ0ZS0wMSwgLTEuMDQxODYxMjIyNjQxMTE5ZS0wMSwgLTEuMDU0NjgwMjQ3MDU3MDAwZS0wMSwKLSAgICAtMS4wNjYxNjA4NzU5ODU1MjNlLTAxLCAtMS4wNzYyNTUzODQ4MzU1NjNlLTAxLCAtMS4wODQ5MTIyOTk0NzExOThlLTAxLAotICAgIC0xLjA5MjA4NzQyMjM3OTAwM2UtMDEsIC0xLjA5NzczNjE0NjYxMzMxM2UtMDEsIC0xLjEwMTgwODg2MTY0MDA3MGUtMDEsCi0gICAgLTEuMTA0MjcxODc2MDUyNjc1ZS0wMSwgLTEuMTA1MTA4MzYyMjkwNDYwZS0wMSwgLTEuMTA0MjgxNDY1NDkyNzI2ZS0wMSwKLSAgICAtMS4xMDE3MzkyMTgxODYyMzZlLTAxLCAtMS4wOTc0MzczNjAzMzgzMzZlLTAxLCAtMS4wOTEzNTMxMjU1NzI1MTFlLTAxLAotICAgIC0xLjA4MzQ2NzMzNTcyOTIyOGUtMDEsIC0xLjA3MzczOTkzODMwNjEwN2UtMDEsIC0xLjA2MjEzMDE1NTMyNDM4OGUtMDEsCi0gICAgLTEuMDQ4NjA2MTQ1ODM0Nzg4ZS0wMSwgLTEuMDMzMTMyNDAxNTI1MzQzZS0wMSwgLTEuMDE1NjczMTYzNDY5MzU3ZS0wMSwKLSAgICAtOS45NjIwMDU1MDYxMjYxNTRlLTAyLCAtOS43NDY4MDMyMjk0NjkyNjdlLTAyLCAtOS41MTA3MjM2MjMzMDY2NjZlLTAyLAotICAgIC05LjI1MzMwMzM4MzIzMTUwNmUtMDIsIC04Ljk3NDEyNTIxNjEyODIxMmUtMDIsIC04LjY3Mjg3NzY4OTExOTI1MmUtMDIsCi0gICAgLTguMzQ5MjEzODM5MDgzNzA4ZS0wMiwgLTguMDAyNjM5OTAyMDYxNjg3ZS0wMiwgLTcuNjMyNjc5NTM2NTE2ODU2ZS0wMiwKLSAgICAtNy4yMzg4MDYxNjIxNjY3NDRlLTAyLCAtNi44MjA1NzY3OTYxNDk1MTllLTAyLCAtNi4zNzc2MTE0MjkxNzIyNjBlLTAyLAotICAgIC01LjkwOTM4NjAwMTU1ODE0OWUtMDIsIC01LjQxNTMxNjMyMjQwMjc3NGUtMDIsIC00Ljg5NDgxMjcyNDU5ODY1MGUtMDIsCi0gICAgLTQuMzQ3MzQ3MTEyMTk1MTk3ZS0wMiwgLTMuNzcyNDYxMzAwMjUzMzMyZS0wMiwgLTMuMTY5NTg3NjA5MjQ0NDM2ZS0wMiwKLSAgICAtMi41MzgxNzk4MzA2OTAyNjZlLTAyLCAtMS44Nzc2ODkwOTY1NTU1MTZlLTAyLCAtMS4xODc0NjEzNzg4NTAzODhlLTAyLAotICAgIC00LjY2OTA5OTI0NzQyMzA4MmUtMDMsICsyLjg0NDA5Njc0ODg3MDM4NWUtMDMsICsxLjA2Njk3NjEyNDc5NDM0MmUtMDIsCi0gICAgKzEuODgxMzU1OTUwNTgyOTQ5ZS0wMiwgKzIuNzI4MTU2MDEwNDM3Njk1ZS0wMiwgKzMuNjA3ODEwNDY5ODUxMjcyZS0wMiwKLSAgICArNC41MjA3MDI3NTk4MDM5MTRlLTAyLCArNS40NjcyMzg4MDIyMDQzMjZlLTAyLCArNi40NDc4NjYwNTQ2MTUzNDZlLTAyLAotICAgICs3LjQ2Mjg2MjE5OTQyMjA2MWUtMDIsICs4LjUxMjQ5MDU2ODcyMzg0NmUtMDIsICs5LjU5Njk4Mzk4NzQ5Njk3MGUtMDIsCi0gICAgKzEuMDcxNjUwNzc5MDE0MzM1ZS0wMSwgKzEuMTg3MTE1ODUwMzA1MjQxZS0wMSwgKzEuMzA2MTAxMDY3MjUwMzc1ZS0wMSwKLSAgICArMS40Mjg1OTY0NDc1ODk3MjFlLTAxLCArMS41NTQ1ODQ3MjUzMzkxMDJlLTAxLCArMS42ODQwNDE2MDkzNzE1MjdlLTAxLAotICAgICsxLjgxNjk0Nzg5NDYyMzI2M2UtMDEsICsxLjk1MzI3Mzg4MDg4Njc4M2UtMDEsICsyLjA5Mjk2MzIwNjg1MDIzOWUtMDEsCi0gICAgKzIuMjM1OTQ1NjM1MjU0Njc5ZS0wMSwgKzIuMzgyMTYwMjE5NDYxNTk3ZS0wMSwgKzIuNTMxNTI5NzIxMzM0MDYzZS0wMSwKLSAgICArMi42ODM5NjE1NzA1Njk1ODZlLTAxLCArMi44MzkzNjEzOTI0OTMwNzJlLTAxLCArMi45OTc2MjQyNTUxNzc4MTFlLTAxLAotICAgICszLjE1ODYxOTA3NzkwNjE5NmUtMDEsICszLjMyMjIxMDU1MTA4Njc2OWUtMDEsICszLjQ4ODI2NDY3Njk5MDU5MWUtMDEsCi0gICAgKzMuNjU2NjQwMzc3NDk5NjQ2ZS0wMSwgKzMuODI3MTUyOTY4MTU3MDU5ZS0wMSwgKzMuOTk5NjExODU5NzYwOTQ3ZS0wMSwKLSAgICArNC4xNzM4NDMyNjUwMjU4ODdlLTAxLCArNC4zNDk2Njk2MjQ5MTY0NzNlLTAxLCArNC41MjY4NzYzOTc0MDIxNDRlLTAxLAotICAgICs0LjcwNTI0MjAwODUwMzk1NmUtMDEsICs0Ljg4NDUzOTI1NDgzMTMxNWUtMDEsICs1LjA2NDU0NTU1MDIzNTEzNGUtMDEsCi0gICAgKzUuMjQ1MDA2NzQ4NjYyMTkwZS0wMSwgKzUuNDI1Njc0MzcyODgyMTA3ZS0wMSwgKzUuNjA2MzEyMDQ0NzAxNTI0ZS0wMSwKLSAgICArNS43ODY2NzI2NDYzODY3MDhlLTAxLCArNS45NjY0NzcwMzUwNTA5NDhlLTAxLCArNi4xNDU0NTg5MDQxNjIxODVlLTAxLAotICAgICs2LjMyMzM2MTk0NDY2MjIzNmUtMDEsICs2LjQ5OTkyNjMxOTIxMTc3NGUtMDEsICs2LjY3NDg3NDAzMjI5Mjg1N2UtMDEsCi0gICAgKzYuODQ3OTMyNjY3Mzk5NjEyZS0wMSwgKzcuMDE4ODM1NDYzNTEzNDAwZS0wMSwgKzcuMTg3MzIyNTQ0ODIzMzQ3ZS0wMSwKLSAgICArNy4zNTMxMjgyMTM4OTMzMTBlLTAxLCArNy41MTYwMDE5ODU2NTI2ODRlLTAxLCArNy42NzU2OTkyNTIyNzM5NDhlLTAxLAotICAgICs3LjgzMTk3NDU3MTYyNDkyNGUtMDEsICs3Ljk4NDU4Mzg1OTgxODM5MGUtMDEsICs4LjEzMzI5NTM0NzAzMDI3OGUtMDEsCi0gICAgKzguMjc3ODkyMjcxNTE1OTUwZS0wMSwgKzguNDE4MTc4NTYxMTAxMzYwZS0wMSwgKzguNTUzOTYxMzAwMTM5MzYzZS0wMSwKLSAgICArOC42ODUwNjg5ODA4OTgxMDJlLTAxLCArOC44MTEzMzQ0MzY2NTMwNTJlLTAxLCArOC45MzI1OTY3ODQ3OTkyMzNlLTAxLAotICAgICs5LjA0ODc0ODgzNTk4MDUyOGUtMDEsICs5LjE1OTY1NzYwODEyMDUzNmUtMDEsICs5LjI2NTIxNTI5OTQ1MDAwMGUtMDEsCi0gICAgKzkuMzY1MzM5OTg4NjMzNDE4ZS0wMSwgKzkuNDU5OTc3MDI4NDI5MTE3ZS0wMSwgKzkuNTQ5MDg4NDA4NDM2ODExZS0wMSwKLSAgICArOS42MzI2NTgxMjI1NTczNjhlLTAxLCArOS43MTA2ODg4OTYxMjI4MTBlLTAxLCArOS43ODMyMDQxNTYzNjA3NzNlLTAxLAotICAgICs5Ljg1MDIyNjc2MDEyNzEzMWUtMDEsICs5LjkxMTc5MjA4MjA4MTMzM2UtMDEsICs5Ljk2Nzk4OTk0NDUwMjY4MmUtMDEsCi0gICAgKzEuMDAxODk0MDI0NjE1NjU5ZSswMCwgKzEuMDA2NDc0MzQyMjMxODIzZSswMCwgKzEuMDEwNTUyMDU3MTA5MTk1ZSswMCwKLSAgICArMS4wMTQxNDI1MzgyMDgwMDdlKzAwLCArMS4wMTcyNjI1OTMyNjg5MzBlKzAwLCArMS4wMTk5Mjg4NDI2Njk5MjNlKzAwLAotICAgICsxLjAyMjE1OTg2NzAxMTE3N2UrMDAsICsxLjAyMzk3NjMyMDkyNzE4N2UrMDAsICsxLjAyNTQwMDczNDYwODEyMmUrMDAsCi0gICAgKzEuMDI2NDU1MzQwNDAwMDcyZSswMCwgKzEuMDI3MTY0NTEwNjU0MTYwZSswMCwgKzEuMDI3NTUyNzI5MTgwNzkwZSswMCwKLSAgICArMS4wMjc2NDQ0NjIzODA0MzJlKzAwLCArMS4wMjc0NjMyNDY2NjA3OTdlKzAwLCArMS4wMjcwMzU5MDM0MTA2NTdlKzAwLAotICAgICsxLjAyNjM4OTA2ODAwMDI1OWUrMDAsICsxLjAyNTU0ODIwMTc5OTcyOGUrMDAsICsxLjAyNDUzNzEzNDc0OTcwOWUrMDAsCi0gICAgKzEuMDIzMzgwODAzNzc1Mzc2ZSswMCwgKzEuMDIyMTAzNjk1NjkzMzQxZSswMCwgKzEuMDIwNzI4MzU5NjU3OTU4ZSswMCwKLSAgICArMS4wMTkyNzUzMzQ2ODczMjllKzAwLCArMS4wMTc3NjUxNzg3OTI4MzBlKzAwLCArMS4wMTYyMTczNTU4Njc1MzFlKzAwLAotICAgICsxLjAxNDY2NTMxMTY4Njg0NmUrMDAsICsxLjAxMzI0OTA3MTA5MDY2NGUrMDAsICsxLjAxMTk0ODAwNjk5MjEyN2UrMDAsCi0gICAgKzEuMDEwMTg5MDkwMTc5MjIzZSswMCwgKzEuMDA4NTU3OTYxMTY3ODUwZSswMCwgKzEuMDA3MDExMjg3NjA4NDUxZSswMCwKLSAgICArMS4wMDU1NDg3NjQ1NzU5MTBlKzAwLCArMS4wMDQxNjg0MTcyNjg5NTZlKzAwLCArMS4wMDI4NjcyNjg4OTMwMzVlKzAwLAotICAgICsxLjAwMTY0MTc2OTExNTg5N2UrMDAsICsxLjAwMDQ4OTA2ODk1NDY0MWUrMDAsICs5Ljk5NDA2MDc5OTc0OTM3NGUtMDEsCi0gICAgKzkuOTgzODk4ODY1NDA2ODQxZS0wMSwgKzkuOTc0MzcwODQ5OTcyNzIxZS0wMSwgKzkuOTY1NDQ0ODM2OTExNzA1ZS0wMSwKLSAgICArOS45NTcwOTg1NDU5NDM4NTJlLTAxLCArOS45NDkzMDI0MTMwMzA4OTdlLTAxLCArOS45NDIwMjQwNDU4NjM1NDBlLTAxLAotICAgICs5LjkzNTI0MTYwNDk2OTI1NGUtMDEsICs5LjkyODkzMDQzMDEzMDA0NGUtMDEsICs5LjkyMzA2ODEwMzQ0MzkwOWUtMDEsCi0gICAgKzkuOTE3NjMzNzc4MTkwNDM4ZS0wMSwgKzkuOTEyNTk3NjQyMzc0NDA0ZS0wMSwgKzkuOTA3OTU0NDk4NDg0MDQxZS0wMSwKLSAgICArOS45MDM2Nzc4OTM2NTY1NThlLTAxLCArOS44OTk3NTE2MTEwNjYxNDhlLTAxLCArOS44OTYxNjAzMzczNjk4NjFlLTAxLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgOTQgb2YgMTc3Ci0gICAgKzkuODkyODkwMTYwNDA4OTg5ZS0wMSwgKzkuODg5OTI4NTExMTI5Njc5ZS0wMSwgKzkuODg3MjYwMzMzNDMwNDIzZS0wMSwKLSAgICArOS44ODQ4Njg3MjEwODg5NDVlLTAxLCArOS44ODI3NTEwMzk1Mzc1ODZlLTAxLCArOS44ODA4OTIxNjg3NTE1OTVlLTAxLAotICAgICs5Ljg3OTI3NzExNDcyNDYxMmUtMDEsICs5Ljg3Nzg5ODI2MTIxODUxMGUtMDEsICs5Ljg3Njc0MzQ0MjAzODQ3MWUtMDEsCi0gICAgKzkuODc1ODA3NDk2MDc4NDk3ZS0wMSwgKzkuODc1MDcyMDIxODc2NTYxZS0wMSwgKzkuODc0NTI5NDQ3NTg5OTc5ZS0wMSwKLSAgICArOS44NzQxNjk3NDE1Mjc5MDVlLTAxLCArOS44NzM5ODQ2ODUyMDc4MzRlLTAxLCArOS44NzM5NTgzMDEzMTE4NThlLTAxLAotICAgICs5Ljg3NDA4MDAyNzcxMDMzNmUtMDEsICs5Ljg3NDM0MzQwMTI5MDczOWUtMDEsICs5Ljg3NDczNjIzNTM4NzAxOGUtMDEsCi0gICAgKzkuODc1MjQzMTM3NzE5Mjg1ZS0wMSwgKzkuODc1ODU2MjAxMjIxMTM1ZS0wMSwgKzkuODc2NTYzNzg1MDYzMDMyZS0wMSwKLSAgICArOS44NzczNTg5MjExNTUxNDllLTAxLCArOS44NzgyMjU1NzY3ODc4MDRlLTAxLCArOS44NzkxNTA5Njg0ODE1OTBlLTAxLAotICAgICs5Ljg4MDEzMjczMTU2NTgzMGUtMDEsICs5Ljg4MTE1Njk0NjA4NDYxOWUtMDEsICs5Ljg4MjIxMTMxNDE4ODI3MmUtMDEsCi0gICAgKzkuODgzMjg5MDMyNTE5MzEwZS0wMSwgKzkuODg0Mzc4MzEwMDE4Njg1ZS0wMSwgKzkuODg1NDc2Nzg3ODY4NzEwZS0wMSwKLSAgICArOS44ODY1Njg0MTQ3NDY2MzllLTAxLCArOS44ODc2NDU4Njg0NTk2MzBlLTAxLCArOS44ODg3MDg1NDA0NDUyNDJlLTAxLAotICAgICs5Ljg4OTc0NDMyMDk5MjU5MmUtMDEsICs5Ljg5MDc0NzI2OTQ1NTkxNWUtMDEsICs5Ljg5MTcxMDAzODcwMzgwMWUtMDEsCi0gICAgKzkuODkyNjMxMDI0MDMyMzgwZS0wMSwgKzkuODkzNTA3MjE5NTczNjI0ZS0wMSwgKzkuODk0MzMwNjQ1NDk0MjA0ZS0wMSwKLSAgICArOS44OTUwOTY5MTkzODg1MzRlLTAxLCArOS44OTU4MTA4MTM0MjI0ODBlLTAxLCArOS44OTY0Njc0NjkwNjc2NzZlLTAxLAotICAgICs5Ljg5NzA2NzM2NTAyMDY0MWUtMDEsICs5Ljg5NzYwNjkzMDQwMDY2NmUtMDEsICs5Ljg5ODA5NDQ3ODU2Mzk5OGUtMDEsCi0gICAgKzkuODk4NTMwMTMzMjYxNzA3ZS0wMSwgKzkuODk4OTE0NzA1Njg0OTI0ZS0wMSwgKzkuODk5MjU0MTk0MTAzNTc0ZS0wMSwKLSAgICArOS44OTk1NTQyMDIwMzA2NTBlLTAxLCArOS44OTk4MjQ0OTQ0ODY5NTFlLTAxLCArOS45MDAwNjUxMTY5Mjg5NDhlLTAxLAotICAgICs5LjkwMDI4NDgwNTM1MzY5NWUtMDEsICs5LjkwMDQ5NzQ4NDc4OTI4MWUtMDEsICs5LjkwMDcwOTU2MTYzMjY2MmUtMDEsCi0gICAgKzkuOTAwOTI4MzU4NjExNjAxZS0wMSwgKzkuOTAxMTYzOTIwNjA3MjE5ZS0wMSwgKzkuOTAxNDI3NDc5NzA5NjA2ZS0wMSwKLSAgICArOS45MDE3MzQyNzUzNTA1NzJlLTAxLCArOS45MDIwODczMzIzMjk4NTFlLTAxLCArOS45MDI0OTg2Mzc5ODUyNzVlLTAxLAotICAgICs5LjkwMjk4MzY4NjY5NTU1OGUtMDEsICs5LjkwMzU0ODUwMTQ3MDIzNGUtMDEsICs5LjkwNDIwNTA4NDkzMzMzM2UtMDEsCi0gICAgKzkuOTA0OTU5Mjk3NzI2NzQwZS0wMSwgKzkuOTA1ODI1MTUwMjAyOTA0ZS0wMSwgKzkuOTA2ODEyNTY5ODEwMTMzZS0wMSwKLSAgICArOS45MDc5MjIwODczNDA0MjZlLTAxLCArOS45MDkxNjU0NjQ5ODEzNzhlLTAxLCArOS45MTA1NTA3NDA5NjI4NzFlLTAxLAotICAgICs5LjkxMjA4NDYxNDI5MDg5NmUtMDEsICs5LjkxMzc2ODYxMDk4MDYzOWUtMDEsICs5LjkxNTYwNTgyNjkzNzgzOWUtMDEsCi0gICAgKzkuOTE3NjA0MjE0ODcyOTc2ZS0wMSwgKzkuOTE5NzY3MTc1NTYyNjg0ZS0wMSwgKzkuOTIyMDkxMTAxODE4Nzc5ZS0wMSwKLSAgICArOS45MjQ1NzkxMzU0NjY1MDZlLTAxLCArOS45MjcyMzEyMjUwNTYyNjZlLTAxLCArOS45MzAwNDk1Mzg0Mjc0MDZlLTAxLAotICAgICs5LjkzMzAyNzI4MTQzNzk0M2UtMDEsICs5LjkzNjE2MTA4NDg2OTk0MmUtMDEsICs5LjkzOTQ1MzcxNDQwNDQ0M2UtMDEsCi0gICAgKzkuOTQyODk1MTQ1NjU2MzcxZS0wMSwgKzkuOTQ2NDgxNjc2MjA3NzI3ZS0wMSwgKzkuOTUwMjAzMDMxMDY3OTYxZS0wMSwKLSAgICArOS45NTQwNTgxNzM2NTk1MDdlLTAxLCArOS45NTgwMzg3MTM2OTQzMTdlLTAxLCArOS45NjIxMzAyNzEwMTcxMTdlLTAxLAotICAgICs5Ljk2NjMyNDY4OTk1NzY3NWUtMDEsICs5Ljk3MDYxNTMwNjQ5MDA1OGUtMDEsICs5Ljk3NDk5MDU4MzI5MzA4MWUtMDEsCi0gICAgKzkuOTc5NDM3NDMwMzc1ODU1ZS0wMSwgKzkuOTgzOTQwNTcyMDAyODc0ZS0wMSwgKzkuOTg4NDkzMTE2ODg3ODkzZS0wMSwKLSAgICArOS45OTMwODM0MzAyMTQ5MDllLTAxLCArOS45OTc2ODkyMjEzMzM1MzRlLTAxLCArMS4wMDAyMzExMzEyNzU5NjllKzAwLAotICAgICsxLjAwMDY5MjEzNTY5ODk5NmUrMDAsICsxLjAwMTE1MjAxMzkyMDE2M2UrMDAsICsxLjAwMTYwODUyNjAwMDQ2MWUrMDAsCi0gICAgKzEuMDAyMDYwNDkzODY3Mjc1ZSswMCwgKzEuMDAyNTA3MjEyMDYxODE1ZSswMCwgKzEuMDAyOTQ3MTI5NDAwNDExZSswMCwKLSAgICArMS4wMDMzNzg5MDk1ODcwMjdlKzAwLCArMS4wMDM4MDEzNjg1NzgwNzBlKzAwLCArMS4wMDQyMTM4MTAzMjA2OTllKzAwLAotICAgICsxLjAwNDYxNTM4NjU2Mjg0NmUrMDAsICsxLjAwNTAwNDYxODM3NTc4MWUrMDAsICsxLjAwNTM4MDYyODYwMTU5OGUrMDAsCi0gICAgKzEuMDA1NzQzMjgyMzY0NjUyZSswMCwgKzEuMDA2MDkxNTEwMzkyMzQ4ZSswMCwgKzEuMDA2NDI0OTA3NDI0OTg4ZSswMCwKLSAgICArMS4wMDY3NDI0Mjc3Mjc2NjllKzAwLCArMS4wMDcwNDQzMjE1MTEzNzhlKzAwLCArMS4wMDczMzAyMTg1OTcxMTJlKzAwLAotICAgICsxLjAwNzU5OTQwMTc5ODcwOWUrMDAsICsxLjAwNzg1MjA2NDM4NjYwM2UrMDAsICsxLjAwODA4ODE3NjE2NTU2M2UrMDAsCi0gICAgKzEuMDA4MzA4MDMzMjA0NTc4ZSswMCwgKzEuMDA4NTExMjQ3MjczNzU2ZSswMCwgKzEuMDA4Njk4MTQ0MjA3NjI3ZSswMCwKLSAgICArMS4wMDg4Njk1MTUyNTYzOTJlKzAwLCArMS4wMDkwMjU2NTk3NjE1MTJlKzAwLCArMS4wMDkxNjY3MTg5NjczNjdlKzAwLAotICAgICsxLjAwOTI5MzM2MjYwOTAyMGUrMDAsICsxLjAwOTQwNjM5ODgzMjQ0MGUrMDAsICsxLjAwOTUwNzAxNzE3MTEyMGUrMDAsCi0gICAgKzEuMDA5NTk1MjY0MjkzMDE3ZSswMCwgKzEuMDA5NjcyMTQ1NzQ0Njc5ZSswMCwgKzEuMDA5NzM5MDg0Nzg1MTYwZSswMCwKLSAgICArMS4wMDk3OTY2NzUwNjAxNDJlKzAwLCArMS4wMDk4NDYxMzczODIwMDVlKzAwLCArMS4wMDk4ODgwODM2MzE2NjdlKzAwLAotICAgICsxLjAwOTkyNDA5MjI3Njg1MGUrMDAsICsxLjAwOTk1NTM4NDc2NTcyMWUrMDAsICsxLjAwOTk4MjI2ODc3MDE0N2UrMDAsCi0gICAgKzEuMDEwMDA2Mjk4MTc3MzA1ZSswMCwgKzEuMDEwMDI4NjE4NDI4NzM1ZSswMCwgKzEuMDEwMDUwMjU0MDc2OTg4ZSswMCwKLSAgICArMS4wMTAwNzE5NTIxMzEzNTVlKzAwLCArMS4wMTAwOTQzNjYyMzgwNzNlKzAwLCArMS4wMTAxMTg5MTczMTcwNTNlKzAwLAotICAgICsxLjAxMDE0NjQ5NzA5NjY4MmUrMDAsICsxLjAxMDE3NzExMDcxMTY3N2UrMDAsICsxLjAxMDIxMTc1NTI2MDEwMmUrMDAsCi0gICAgKzEuMDEwMjUxMDAzNDY5NDI3ZSswMCwgKzEuMDEwMjk1NDY4NjUzNzU5ZSswMCwgKzEuMDEwMzQ1MjM0OTk2NjM3ZSswMCwKLSAgICArMS4wMTA0MDAzMTY2OTgxNzJlKzAwLCArMS4wMTA0NjE1NjQzMTYzNTFlKzAwLCArMS4wMTA1Mjg2MTU0NDU2NTllKzAwLAotICAgICsxLjAxMDYwMTUyMTI4NTM0N2UrMDAsICsxLjAxMDY3OTc4ODA4MTg2N2UrMDAsICsxLjAxMDc2MzkwNTg2OTA2MmUrMDAsCi0gICAgKzEuMDEwODUzNDI5NzYwNjc2ZSswMCwgKzEuMDEwOTQ3NTQ3MDc0NTE5ZSswMCwgKzEuMDExMDQ1OTUzMTA4MjYzZSswMCwKLSAgICArMS4wMTExNDg0ODYyOTMzNTllKzAwLCArMS4wMTEyNTQzOTc3OTExMzRlKzAwLCArMS4wMTEzNjMwODIwNzU4NjNlKzAwLAotICAgICsxLjAxMTQ3MzMwMjAwODgzMWUrMDAsICsxLjAxMTU4NDk5NjMxMjE0OWUrMDAsICsxLjAxMTY5NzQxNjUwNDU5OWUrMDAsCi0gICAgKzEuMDExODA4OTE5NzkzNDY5ZSswMCwgKzEuMDExOTE5MjY0MDI1NzE2ZSswMCwgKzEuMDEyMDI3MjQwNzk0MTUzZSswMCwKLSAgICArMS4wMTIxMzIxNTE2MzEwNDFlKzAwLCArMS4wMTIyMzI3MzQ1NjQzMzNlKzAwLCArMS4wMTIzMjc1NjA0Nzc5MDFlKzAwLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgOTUgb2YgMTc3Ci0gICAgKzEuMDEyNDE2MzgzNzU0Mzg0ZSswMCwgKzEuMDEyNDk3ODkwNzI2MjkyZSswMCwgKzEuMDEyNTcwNDM0MDIxMDU0ZSswMCwKLSAgICArMS4wMTI2MzMyOTUyNTU3MDhlKzAwLCArMS4wMTI2ODUyNzcwMTY3MjZlKzAwLCArMS4wMTI3MjU1NjQ5OTIyODRlKzAwLAotICAgICsxLjAxMjc1MjU3NzY1MTQxNWUrMDAsICsxLjAxMjc2NTA2Mjg4OTg2NGUrMDAsICsxLjAxMjc2MjM1NjcxOTE2MmUrMDAsCi0gICAgKzEuMDEyNzQzMzc2MDc3Nzc3ZSswMCwgKzEuMDEyNzA2NDg0MjAwMTgxZSswMCwgKzEuMDEyNjUwODQyMjI2NDM1ZSswMCwKLSAgICArMS4wMTI1NzU0Mjc3Nzg1MjBlKzAwLCArMS4wMTI0Nzk0NzM0OTA5MTllKzAwLCArMS4wMTIzNjExMDUxMjEwMDNlKzAwLAotICAgICsxLjAxMjIxOTgwOTU5NDcxOGUrMDAsICsxLjAxMjA1NDM1OTk5MjQxOWUrMDAsICsxLjAxMTg2NDAwMDIxNTQ2MGUrMDAsCi0gICAgKzEuMDExNjQ3MjIzODY5MDg3ZSswMCwgKzEuMDExNDAyNTE4MjY3NzEzZSswMCwgKzEuMDExMTI5NjU0NjUyODU3ZSswMCwKLSAgICArMS4wMTA4MjY5NTEyNjAzNzdlKzAwLCArMS4wMTA0OTI5MjQ0MzYzNjFlKzAwLCArMS4wMTAxMjYzNTM5NjA0MTZlKzAwLAotICAgICsxLjAwOTcyNTg5MjQ3OTMxMmUrMDAsICsxLjAwOTI5MDA2MDk4MzgzM2UrMDAsICsxLjAwODgxNzMwMTA1MjU0OGUrMDAsCi0gICAgKzEuMDA4MzA1MDI3NTU1MTMwZSswMCwgKzEuMDA3NzUyODMzNjc1NDQzZSswMCwgKzEuMDA3MTU3ODI3MzU4MTUwZSswMCwKLSAgICArMS4wMDY1MTgwNDkzNDQ1MDNlKzAwLCArMS4wMDU4MzE0MDM1MzIwMThlKzAwLCArMS4wMDUwOTU1OTIxMTkzNzNlKzAwLAotICAgICsxLjAwNDMwODYzMDA1NTA1MGUrMDAsICsxLjAwMzQ2NzQ5ODMwNTc3NmUrMDAsICsxLjAwMjU2OTUwMDQxMzg4OGUrMDAsCi0gICAgKzEuMDAxNjEyNzEwMTA1NTYzZSswMCwgKzEuMDAwNTk0MjcyOTc1NjgzZSswMCwgKzkuOTk1MTExNzAxMTY4Nzg2ZS0wMSwKLSAgICArOS45ODM2MDkyMTg3MTk1MjJlLTAxLCArOS45NzE0MDkyODgzMjc4NjBlLTAxLCArOS45NTg0ODg4NjMwNTA1NTZlLTAxLAotICAgICs5Ljk0NDgxODU0MzE1Mzg5M2UtMDEsICs5LjkzMDM3NTI4MjgzMjIxMWUtMDEsICs5LjkxNTE0NjU2MDc1OTQ3OWUtMDEsCi0gICAgKzkuODk5MTM2ODAyNDIzNjM4ZS0wMSwgKzkuODgxOTMwNjIzODEwOTk3ZS0wMSwgKzkuODU5NDIyNTkxMjAzMzExZS0wMSwKLSAgICArOS44MzU2Njc4OTgzNzg5MjRlLTAxLCArOS44MTE0MjMwMzQ4MDgzNjVlLTAxLCArOS43ODUyMTQ0NDEyNTAyMjhlLTAxLAotICAgICs5Ljc1NjYzNjAzNjEwOTgzOGUtMDEsICs5LjcyNTQ1MzQ0MjUzMjU3NGUtMDEsICs5LjY5MTQ1NjYzNDE4NTA5MmUtMDEsCi0gICAgKzkuNjU0NDA2MTc4MzEwMjA5ZS0wMSwgKzkuNjE0MDQzNjE1MDc2MzA4ZS0wMSwgKzkuNTcwMTEzMDY1MTc5MzAwZS0wMSwKLSAgICArOS41MjIzNjc2Njk2OTY2OTBlLTAxLCArOS40NzA1NDg4Mzk1NDQyMTRlLTAxLCArOS40MTQ0MDM3NDAwMDg0OTFlLTAxLAotICAgICs5LjM1MzY5MTYxMjg0NjU0OWUtMDEsICs5LjI4ODE5MDA5Mzk3NzE2NGUtMDEsICs5LjIxNzY2Mjg4NzE2OTExNWUtMDEsCi0gICAgKzkuMTQxODk2MjgzNDY2MDA5ZS0wMSwgKzkuMDYwNjk0NjgxMTEzNDcxZS0wMSwgKzguOTczODkxNjc1NDk3MzU3ZS0wMSwKLSAgICArOC44ODEzMzIwMDA4MDYyNjllLTAxLCArOC43ODI4OTM4ODU4NDE0MjJlLTAxLCArOC42Nzg0Njk1NjUzNDMwMzllLTAxLAotICAgICs4LjU2Nzk3MDY0NDY3MTA2N2UtMDEsICs4LjQ1MTMzNDY1NDAxOTE4MGUtMDEsICs4LjMyODU0MjgwNTc4MDM5OWUtMDEsCi0gICAgKzguMTk5NTk0NzgzODk3MDQxZS0wMSwgKzguMDY0NTExMDA2ODczNDk3ZS0wMSwgKzcuOTIzMzQ2NDc4Njg2MDI1ZS0wMSwKLSAgICArNy43NzYyMDQ0ODgyOTIxNjNlLTAxLCArNy42MjMyMDYxODM1OTU5NzBlLTAxLCArNy40NjQ0ODY0OTEyMjcwNTdlLTAxLAotICAgICs3LjMwMDIwNTcyOTk5Mjk1OGUtMDEsICs3LjEzMDU2NzM4MzIyNjcxN2UtMDEsICs2Ljk1NTgwNTQ0NDc1NTkxNmUtMDEsCi0gICAgKzYuNzc2MTczMjI5ODM2NTY3ZS0wMSwgKzYuNTkxOTU1MzA1MTQ4MTcyZS0wMSwgKzYuNDAzNDg2NDI2ODkyMzIxZS0wMSwKLSAgICArNi4yMTEwNzIxOTc0NDE4MThlLTAxLCArNi4wMTUwNDkyNzUyNDQ3MzBlLTAxLCArNS44MTU3ODc2MDg4NzA0NTJlLTAxLAotICAgICs1LjYxMzY3NDUxMTE1NjMyNGUtMDEsICs1LjQwOTE4ODYyNzM1NDA3NmUtMDEsICs1LjIwMjczNjgzNDk3MTMwM2UtMDEsCi0gICAgKzQuOTk0NzgwNzMzNDU5Mjk0ZS0wMSwgKzQuNzg1Nzc0MTc3OTQ5MDY0ZS0wMSwgKzQuNTc2MTcyNTk5ODc0OTI4ZS0wMSwKLSAgICArNC4zNjY0OTAyMDgyNjU4MDRlLTAxLCArNC4xNTcyMjE0NjA0MTU5OTVlLTAxLCArMy45NDg4NTY1OTA5NTA3NTdlLTAxLAotICAgICszLjc0MTkwMzE4OTIyOTc3MGUtMDEsICszLjUzNjg2ODg5OTU1Mzk3NGUtMDEsICszLjMzNDI2MDAxNzc1NjQ2MmUtMDEsCi0gICAgKzMuMTM0NTg2NDczMjUyMjI5ZS0wMSwgKzIuOTM4MzM3OTA0Mzk1ODcxZS0wMSwgKzIuNzQ1OTkyNjM3NTkwODE3ZS0wMSwKLSAgICArMi41NTgwMzA2MzYxNjgxNzJlLTAxLCArMi4zNzQ5MDIxODg0NjY2OTdlLTAxLCArMi4xOTcwMzYwMzIxODU3ODVlLTAxLAotICAgICsyLjAyNDg1NTQxNTExNTQ1NmUtMDEsICsxLjg1ODc0OTkxNTExNzMxOWUtMDEsICsxLjY5OTA2NzgwMjExNzQxMGUtMDEsCi0gICAgKzEuNTQ2MTMyMjY3NDc4ODczZS0wMSwgKzEuNDAwMjM4MjA2NzQ5Njk1ZS0wMSwgKzEuMjYxNjM3Mzk1NjcyOTEzZS0wMSwKLSAgICArMS4xMzA1MzQ0MzQwNzI3MTllLTAxLCArMS4wMDcwODQ5NzM3NDc5NDBlLTAxLCArOC45MTQwMjQzODk4NzMwODFlLTAyLAotICAgICs3LjgzNTYxMjEwMDE0MTc5MmUtMDIsICs2LjgzNTgyMTIzMzkyMDk4OGUtMDIsICs1LjkxNDIxMTUzNjAyODk3NmUtMDIsCi0gICAgKzUuMDY5ODkzMDEyMzQwODMyZS0wMiwgKzQuMzAxNzE3NzYzNTg1NTUwZS0wMiwgKzMuNjA4MDIwNzI2NjczMzU5ZS0wMiwKLSAgICArMi45ODYzMTYzMzcwMTc2MzBlLTAyLCArMi40MzM3MjI2NTcxMjk4MTJlLTAyLCArMS45NDc2NzUyNDE5NzE3MDBlLTAyLAotICAgICsxLjUyNTcxMDE3MTI1NTg5NWUtMDIsICsxLjE2Mzc4NzQ5MjYzNjI0MGUtMDIsICs4LjQzMzA4Nzc4MjY0MzcxOGUtMDMsCi0gICAgKzQuNDQ5NjY4OTk3MzQ0NzM1ZS0wMywgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgOTYgb2YgMTc3Ci0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDB9OwotCi0vLyBTZWN0aW9uIDUuNy4yLjUgdzQ4MCAoZDA5cjAxLnBkZikKLWRvdWJsZSB3X040ODBbOTYwXSA9IHsKLSAgICAtMi4zNTMwMzIxNTA1MTY3NTRlLTA0LCAtNC42MTk4OTg3NTI2MjgxNjNlLTA0LCAtNi4yNjI5MzE1MzU2MTA4NzllLTA0LAotICAgIC03LjkyOTE4MDQzMjk3NjQ0NWUtMDQsIC05Ljc0NzE2NjcxODkyOTA1MGUtMDQsIC0xLjE4MDI1Njg5NDQ3NDU2MmUtMDMsCi0gICAgLTEuNDA5MjA5MDM5NTk0ODcxZS0wMywgLTEuNjY0NDczMDk2OTczNzI1ZS0wMywgLTEuOTQ2NTkxNjA4MTcwMjMxZS0wMywKLSAgICAtMi4yNTcwODE3MzI1ODg0NzhlLTAzLCAtMi41OTcxMDY5MTY3Mzc3ODllLTAzLCAtMi45Njc2MDc2MjQ4Mzk1MjRlLTAzLAotICAgIC0zLjM3MDQ1NDg3Nzk4ODQ3MmUtMDMsIC0zLjgwNjI4NTE2MzM1MjI0MWUtMDMsIC00LjI3Njg3Mzc2NzYzOTA2NGUtMDMsCi0gICAgLTQuNzgyNDY5OTA0NTAxODEzZS0wMywgLTUuMzI0NjA4NzIxNzE2NzYzZS0wMywgLTUuOTAzNDAzODE0MDk1NDAwZS0wMywKLSAgICAtNi41MjA0MTk3MjY1OTk4MDVlLTAzLCAtNy4xNzU4ODUyNzc3NzEwOTllLTAzLCAtNy44NzE0MjI4MjA2NDIzMDdlLTAzLAotICAgIC04LjYwNjU4NjAzOTc1OTY2N2UtMDMsIC05LjM4MjQ4MDg2MDg5OTEwOGUtMDMsIC0xLjAxOTgyNzE4MjE2MzMwN2UtMDIsCi0gICAgLTEuMTA1NTIwNTQ3NzM5MDY2ZS0wMiwgLTEuMTk1MjcwMzAwNzQzMTkzZS0wMiwgLTEuMjg5MjA1OTEwMzAzODQ2ZS0wMiwKLSAgICAtMS4zODcyNjM0ODQzMjMxNjBlLTAyLCAtMS40ODk1MjgxNTk1MDYyOTZlLTAyLCAtMS41OTU4NTY2MjE5MzM4MDBlLTAyLAotICAgIC0xLjcwNjI4ODU1NjczNTQzM2UtMDIsIC0xLjgyMDY2NjM5OTk2NTQ2OGUtMDIsIC0xLjkzOTA2NTk3NTIzMjcxOGUtMDIsCi0gICAgLTIuMDYxMzU1NDE3NTgyNzE0ZS0wMiwgLTIuMTg3NTcwOTI1Nzg2ODYyZS0wMiwgLTIuMzE3NTI2MzE1MjY2NDExZS0wMiwKLSAgICAtMi40NTEyMjc0NDkwNDE0ODllLTAyLCAtMi41ODg0NzE5MzcxNTc2MTllLTAyLCAtMi43MjkyNjM3MzcwOTA3OTllLTAyLAotICAgIC0yLjg3MzM5MDkwMjcxMzYxNWUtMDIsIC0zLjAyMDg2MjczODI0NTI2NGUtMDIsIC0zLjE3MTQ0MDM3Mjk5NDM4NGUtMDIsCi0gICAgLTMuMzI1MDk4ODU4OTg2MzAzZS0wMiwgLTMuNDgxNTk3NzkzNTM4MzQyZS0wMiwgLTMuNjQwODkyNDA2OTMzMDE5ZS0wMiwKLSAgICAtMy44MDI3NDIzMTgyMDkxNTBlLTAyLCAtMy45NjcwNjc5OTI2NzI5NzllLTAyLCAtNC4xMzM1NzU0MTczNTM4MjZlLTAyLAotICAgIC00LjMwMjIwMzM3MTczNDI3OGUtMDIsIC00LjQ3MjY5ODA0NTkxNDQxN2UtMDIsIC00LjY0NTAyMjI5MjkzNDMyOWUtMDIsCi0gICAgLTQuODE4ODkxNDkwMjY2Njg3ZS0wMiwgLTQuOTk0MjI1ODYzMjU2NTAwZS0wMiwgLTUuMTcwNjkwODAyODI2NjY2ZS0wMiwKLSAgICAtNS4zNDgxNjIwMzYwOTcyMjNlLTAyLCAtNS41MjYzMzQ3OTQ1OTM1NjVlLTAyLCAtNS43MDUxMjMxNTI0MjM4MjJlLTAyLAotICAgIC01Ljg4NDI3MTc0OTc0NTU1OWUtMDIsIC02LjA2MzcxNzIzNTI0Mzk5NmUtMDIsIC02LjI0MzEwNDAyNzgyOTA4OWUtMDIsCi0gICAgLTYuNDIyMzAzNTQ1MDA0MzA0ZS0wMiwgLTYuNjAwOTYxNTE5NDQwNjU3ZS0wMiwgLTYuNzc4OTYyMjY5NjM0NDk1ZS0wMiwKLSAgICAtNi45NTU5OTY4Njg1ODEzNzllLTAyLCAtNy4xMzE5NjYyNjY0NDMzOTBlLTAyLCAtNy4zMDY1ODEyNzMyNzI3MzNlLTAyLAotICAgIC03LjQ3OTc1ODkxMzAwMTQ1OGUtMDIsIC03LjY1MTE3ODIyNTg5MDQ5MGUtMDIsIC03LjgyMDcxMTQyMDc2ODg1NmUtMDIsCi0gICAgLTcuOTg4MDEwNjkzNDExNjQ0ZS0wMiwgLTguMTUyOTY0MDA1MzE5NTMyZS0wMiwgLTguMzE1MjM3MzUzMjY0MDA0ZS0wMiwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDk3IG9mIDE3NwotICAgIC04LjQ3NDcyODk0Njc3MDcxNGUtMDIsIC04LjYzMTEzNzU0NDkwNTY3N2UtMDIsIC04Ljc4NDM3NDQ1Mjk1OTA1OGUtMDIsCi0gICAgLTguOTM0MTY0MzY0MzIxNDE3ZS0wMiwgLTkuMDgwNDExMjkxMjQ1NzI4ZS0wMiwgLTkuMjIyNzk1NzYxNDI4NDMyZS0wMiwKLSAgICAtOS4zNjEyMzI4NjcyMjMzNDBlLTAyLCAtOS40OTUzNzc3NTg4NzAzMzVlLTAyLCAtOS42MjUxNTUzMTMxMzk4NTZlLTAyLAotICAgIC05Ljc1MDI4NDYyMDQzNzU2OWUtMDIsIC05Ljg3MDczNjUxNDIxNDQyNmUtMDIsIC05Ljk4NjI3MTI4ODI3MTAyNmUtMDIsCi0gICAgLTEuMDA5NjgwMjIxNDA2MjE5ZS0wMSwgLTEuMDIwMjAyNjg0MzYxOTc0ZS0wMSwgLTEuMDMwMTgzODA0ODUwNDkxZS0wMSwKLSAgICAtMS4wMzk1OTYzNTY3NTkyOTBlLTAxLCAtMS4wNDg0Mzg4MjUwMTc3OThlLTAxLCAtMS4wNTY2ODY4MzgxOTI3NjZlLTAxLAotICAgIC0xLjA2NDM0MjgyMTY2MDMyM2UtMDEsIC0xLjA3MTM4MjMxNDEyNzc5OWUtMDEsIC0xLjA3Nzc5OTk2MTEyMTUzN2UtMDEsCi0gICAgLTEuMDgzNTcwNjI1ODY1OTMxZS0wMSwgLTEuMDg4NjkwMTM1MDI3MjQ4ZS0wMSwgLTEuMDkzMTM1NTg4Njc3MjM1ZS0wMSwKLSAgICAtMS4wOTY5MDM1NTk0OTgzNDBlLTAxLCAtMS4wOTk5Njk2NTU3ODY5MjllLTAxLCAtMS4xMDIzMzIyNjEyMTk5NzNlLTAxLAotICAgIC0xLjEwMzk3MjgxMjA4NTE4OWUtMDEsIC0xLjEwNDg5ODQ3NDg4MzMzNmUtMDEsIC0xLjEwNTA4NjQxNjUzMjE2N2UtMDEsCi0gICAgLTEuMTA0NTM3NDI2OTk2MDczZS0wMSwgLTEuMTAzMjI1ODM4NTY4NTYzZS0wMSwgLTEuMTAxMTQ1ODI3NzIyMTQzZS0wMSwKLSAgICAtMS4wOTgyNzY5MjgxNzAzNjRlLTAxLCAtMS4wOTQ2MjE3NDY2NTA3NjBlLTAxLCAtMS4wOTAxNjM5NjAwNTU3MzNlLTAxLAotICAgIC0xLjA4NDkwODg1MjU2MTcyMmUtMDEsIC0xLjA3ODgzNDI5MzE0MTg4NmUtMDEsIC0xLjA3MTkzNzE4MDIzMTk3OGUtMDEsCi0gICAgLTEuMDY0MTk2MzU4MDY5NDY1ZS0wMSwgLTEuMDU1NjEyNTA5NzYyMDQxZS0wMSwgLTEuMDQ2MTYyODEyNTE4NjE4ZS0wMSwKLSAgICAtMS4wMzU4NDkwNDM1NTc2MTBlLTAxLCAtMS4wMjQ2NTAxNjI3MDMzNDFlLTAxLCAtMS4wMTI1Njg5OTc1MzIwNDZlLTAxLAotICAgIC05Ljk5NTg2NDU3MTkzMjkyOGUtMDIsIC05Ljg1NzAxNDU2NjE5NDYyN2UtMDIsIC05LjcwODkxMTEzNTg1Nzk2N2UtMDIsCi0gICAgLTkuNTUxNTQ1ODIwNjg5MDg0ZS0wMiwgLTkuMzg0Njg0OTIwNzE1NDI1ZS0wMiwgLTkuMjA4MzAwMDYyODkxNTUwZS0wMiwKLSAgICAtOS4wMjIxNzEwMjE0MDY0NTBlLTAyLCAtOC44MjYzMDk5OTMwMDA3ODVlLTAyLCAtOC42MjA0OTM4MjE4MDM5MzdlLTAyLAotICAgIC04LjQwNDc0MjE1MjgxNTMzMGUtMDIsIC04LjE3ODc5MjcxNjgwOTUxMmUtMDIsIC03Ljk0MjYyNTAyNjcwMzYxN2UtMDIsCi0gICAgLTcuNjk1OTgwNzc1ODE5OTkwZS0wMiwgLTcuNDM4Nzg1NjAwMjExNDYzZS0wMiwgLTcuMTcwNzk3MDAyODczNjA4ZS0wMiwKLSAgICAtNi44OTE5OTQ3ODM4MTU5NjllLTAyLCAtNi42MDIxODk3OTc3MTUyNDFlLTAyLCAtNi4zMDEzNDk0MjA3MjQ0MjRlLTAyLAotICAgIC01Ljk4OTE5MTkxMjY2NzcxMmUtMDIsIC01LjY2NTY1NTY0MTEzMzE2MWUtMDIsIC01LjMzMDQwNjE2NDQ4MjIyMmUtMDIsCi0gICAgLTQuOTgzNDI3MjQxOTc2MjM1ZS0wMiwgLTQuNjI0NDU2ODkzNDIwMjI0ZS0wMiwgLTQuMjUzNDU1Njg2MzM2OTE2ZS0wMiwKLSAgICAtMy44NzAxOTU3NzI1Mzg0NDNlLTAyLCAtMy40NzQ1ODU3NzYxNDU5MjllLTAyLCAtMy4wNjYzNDE1MTg2ODI2ODJlLTAyLAotICAgIC0yLjY0NTQyNTA3NzY0MjEwNWUtMDIsIC0yLjIxMTU4MTYwODEyMDUyOGUtMDIsIC0xLjc2NDc0MDU0MTU5OTEzNmUtMDIsCi0gICAgLTEuMzA0NTgxMzYzODk1ODE4ZS0wMiwgLTguMzEwNDI1Njk2MjA4OTM2ZS0wMywgLTMuNDM4MjY4NjYxMTMzMTcwZS0wMywKLSAgICArMS41NzAzMTU0NzY1NzY5MzNlLTAzLCArNi43MTc2OTc2MzUyOTA2NzZlLTAzLCArMS4yMDA0NzcwMjAyNDQ3NzhlLTAyLAotICAgICsxLjc0MzM5ODMxOTc0Nzg2OWUtMDIsICsyLjMwMDY0MjA2MTA3NzgyM2UtMDIsICsyLjg3MjQ4MTQyMzI3MDU5NWUtMDIsCi0gICAgKzMuNDU4ODk2MzUwNjM0NjcxZS0wMiwgKzQuMDYwMTA2NDYyNjI1MDg1ZS0wMiwgKzQuNjc2MTAyOTE1NzUyODI2ZS0wMiwKLSAgICArNS4zMDcxMzM5MTE4MjE4OTNlLTAyLCArNS45NTMyMzkwOTA5MTU1NTdlLTAyLCArNi42MTQ2NDc4MTI4NjkxNTFlLTAyLAotICAgICs3LjI5MTI5MzE4NDMxMjgwM2UtMDIsICs3Ljk4MzM1NDE4OTgxNjUxMWUtMDIsICs4LjY5MDgwNzQxMjc3MDY5NmUtMDIsCi0gICAgKzkuNDEzODEzNzY1Mjc1MDY0ZS0wMiwgKzEuMDE1MjMzMTQwMjAzNzQ4ZS0wMSwgKzEuMDkwNjUxNTE4MzM2MjAyZS0wMSwKLSAgICArMS4xNjc2MjY1NDYwMTYxOTdlLTAxLCArMS4yNDYxNzEzODczMjc1MjVlLTAxLCArMS4zMjYyNzI5NDg5MzgxMTNlLTAxLAotICAgICsxLjQwNzkzODE5MDYwODY2NGUtMDEsICsxLjQ5MTE1MjUxOTI5OTc5N2UtMDEsICsxLjU3NTkyMTQwODM4ODU5M2UtMDEsCi0gICAgKzEuNjYyMjI0Nzk5MjQ4NTcxZS0wMSwgKzEuNzUwMDY3Mzk5MDU5ODYxZS0wMSwgKzEuODM5NDMxOTM4NjIwMDI0ZS0wMSwKLSAgICArMS45MzAzMTgxODMwNTQ5MDRlLTAxLCArMi4wMjI2OTk4NTQ5MDYyNTFlLTAxLCArMi4xMTY1Njc0MzA5MDYxODRlLTAxLAotICAgICsyLjIxMTg4ODUyMzQxMDY0MmUtMDEsICsyLjMwODY1NTM3OTc2NzY3MWUtMDEsICsyLjQwNjgzNzk5MjM0MTY1NGUtMDEsCi0gICAgKzIuNTA2NDIwNjQwMjkxNjYyZS0wMSwgKzIuNjA3MzY1MTI0OTE4NTgzZS0wMSwgKzIuNzA5NjU5MDczNTAxMTk2ZS0wMSwKLSAgICArMi44MTMyNTkwMjE4MzI1MzJlLTAxLCArMi45MTgxNDQ2OTQ3MjkxNjhlLTAxLCArMy4wMjQyNzAyNzk4NDAwNTFlLTAxLAotICAgICszLjEzMTYwMzQ5OTk5Nzk5NmUtMDEsICszLjI0MDA5NTcwNDY0NTAyM2UtMDEsICszLjM0OTcxOTU5MjM2MTY2NmUtMDEsCi0gICAgKzMuNDYwNDIyOTM1MjA0ODI5ZS0wMSwgKzMuNTcyMTc1MTgwNzg2MDIxZS0wMSwgKzMuNjg0OTE1NjQ5MTIwNTMwZS0wMSwKLSAgICArMy43OTg1OTUxMTk1OTE3MTZlLTAxLCArMy45MTMxNDY4ODU3NTY4NzVlLTAxLCArNC4wMjg1MzI4NzM4NjcwNTJlLTAxLAotICAgICs0LjE0NDY4ODMyODEzNzUyN2UtMDEsICs0LjI2MTU3MTY0MjMyMDQyNGUtMDEsICs0LjM3OTExMzg5NzU2NTcyN2UtMDEsCi0gICAgKzQuNDk3MjU2MzIwNDE3NTAxZS0wMSwgKzQuNjE1OTI1NDQ1MDkwMjEyZS0wMSwgKzQuNzM1MDY3MDMwMDY1MjM5ZS0wMSwKLSAgICArNC44NTQ2MDAxODQ4NjY3MTBlLTAxLCArNC45NzQ0NzE1OTI5MDEwODZlLTAxLCArNS4wOTQ1OTcyMjgzMzM4NTNlLTAxLAotICAgICs1LjIxNDkwOTg0MTcyOTk0N2UtMDEsICs1LjMzNTMyNjgxOTYzMTU4M2UtMDEsICs1LjQ1NTc4OTgxMTYxNTIzOWUtMDEsCi0gICAgKzUuNTc2MjE3MTU3OTU5ODkwZS0wMSwgKzUuNjk2NTQ2NzMwMDgwMTU0ZS0wMSwgKzUuODE2Njg1NTc2MjY4MDM1ZS0wMSwKLSAgICArNS45MzY1NjA2MjQ1MjY0NjhlLTAxLCArNi4wNTYwODM4MjM5Mjk2NDNlLTAxLCArNi4xNzUxOTIwNjAwODUyMDhlLTAxLAotICAgICs2LjI5Mzc5NjYxMTMzNjI4MGUtMDEsICs2LjQxMTgzMDg0MjgyMzI0NWUtMDEsICs2LjUyOTIwMzU0NDg3NjA5N2UtMDEsCi0gICAgKzYuNjQ1ODQwNzg2MzcxNDUxZS0wMSwgKzYuNzYxNjUzNDk5NTUwMjU1ZS0wMSwgKzYuODc2NTczOTUyMTczNjI2ZS0wMSwKLSAgICArNi45OTA1MTE1MzkxMTk5OTZlLTAxLCArNy4xMDM0MDA1NDk1NjI5NDRlLTAxLCArNy4yMTUxNDkzMzE0NTg3MjhlLTAxLAotICAgICs3LjMyNTY5MTc3MjczODk5OWUtMDEsICs3LjQzNDk0MzcxODc2NTY2NWUtMDEsICs3LjU0Mjg0NjMyNzQ0MjA0OGUtMDEsCi0gICAgKzcuNjQ5MzEzNjU0NTQwNjEyZS0wMSwgKzcuNzU0MjgxODkyOTAxNDczZS0wMSwgKzcuODU3NjcwMTcwNzUyMDQ5ZS0wMSwKLSAgICArNy45NTk0MTQ2NTEwNjE2MTJlLTAxLCArOC4wNTk0MzcyMzMxNTQ2MzdlLTAxLCArOC4xNTc2ODcwNzA3MTUxNzZlLTAxLAotICAgICs4LjI1NDA4NjIyMzk3MjEyN2UtMDEsICs4LjM0ODU4OTM3MzM5OTk0OGUtMDEsICs4LjQ0MTEyNTgyNzQxNjYyMGUtMDEsCi0gICAgKzguNTMxNjUxMTk0NTM4NDI1ZS0wMSwgKzguNjIwMTA4MzM2Mjc2NzMzZS0wMSwgKzguNzA2NDU2MzM3NTQyMTUwZS0wMSwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDk4IG9mIDE3NwotICAgICs4Ljc5MDYzMTU2MTA2MTE3MWUtMDEsICs4Ljg3MjU5OTcwNjg2NTEyM2UtMDEsICs4Ljk1MjMxMzI4ODYxOTM2N2UtMDEsCi0gICAgKzkuMDI5NzUxNjgwMzUzNTI0ZS0wMSwgKzkuMTA0ODYzMTIxNDQ1Njc5ZS0wMSwgKzkuMTc3NjI1NTUwNjIwNjM2ZS0wMSwKLSAgICArOS4yNDc5OTc0MjY5NjYwOTNlLTAxLCArOS4zMTU5NjI0OTY0MjYyNzhlLTAxLCArOS4zODE0OTQ4NTg5MjE2NjdlLTAxLAotICAgICs5LjQ0NDU4ODM5MDM1OTM1NGUtMDEsICs5LjUwNTIyMDg2MTkyNzI0OGUtMDEsICs5LjU2MzQwMjkyMTI4NjM2NGUtMDEsCi0gICAgKzkuNjE5MTE0NTIyOTM2NzAxZS0wMSwgKzkuNjcyMzY2NzEyMzI1NDMxZS0wMSwgKzkuNzIzMTU2NjM3ODM0Njg3ZS0wMSwKLSAgICArOS43NzE1MDExODcxMjAxODBlLTAxLCArOS44MTczOTc1MDEzMDM2OTZlLTAxLCArOS44NjA4NjU4NzEzNTMyNDZlLTAxLAotICAgICs5LjkwMTkwNjM4MDE2MzU5NWUtMDEsICs5Ljk0MDU1NzE4MDY2MjcwNGUtMDEsICs5Ljk3Njg0MjM5NTI4NDYzN2UtMDEsCi0gICAgKzEuMDAxMDgwOTYxMjU3MDEwZSswMCwgKzEuMDA0MjQ3NTE0MTAyNDE3ZSswMCwgKzEuMDA3MTg4NTc4NDU4NTA3ZSswMCwKLSAgICArMS4wMDk5MDY2NTQ1NjUxMDhlKzAwLCArMS4wMTI0MDc0MjgyODI4ODRlKzAwLCArMS4wMTQ2OTQ3MDI0MzI2MDBlKzAwLAotICAgICsxLjAxNjc3NDY1OTIwOTQwMGUrMDAsICsxLjAxODY1MDk5MDU2MTg0OGUrMDAsICsxLjAyMDMzMDQ2NDQ2MzExMWUrMDAsCi0gICAgKzEuMDIxODE3MzI4OTExNzkzZSswMCwgKzEuMDIzMTE4ODQxMzg0NDYwZSswMCwgKzEuMDI0MjQwMjYyNDY3MDAwZSswMCwKLSAgICArMS4wMjUxODk3MjE4ODgxMjhlKzAwLCArMS4wMjU5NzI0NTA5Njk0NDBlKzAwLCArMS4wMjY1OTY5Mzg1ODk0NDNlKzAwLAotICAgICsxLjAyNzA2OTE3OTM3NTg0MWUrMDAsICsxLjAyNzM5NzUyMzkzOTIxMGUrMDAsICsxLjAyNzU4NzkwMjIwMzEwOWUrMDAsCi0gICAgKzEuMDI3NjQ4OTUxOTIyNzAxZSswMCwgKzEuMDI3NTg1ODMwNjg4MTQzZSswMCwgKzEuMDI3NDA4NTE5NjYxMDEyZSswMCwKLSAgICArMS4wMjcxMjI5ODY4MjY5ODRlKzAwLCArMS4wMjY3Mzg2NzM2NDc0ODJlKzAwLCArMS4wMjYyNjE2NjM4NzgwOTJlKzAwLAotICAgICsxLjAyNTcwMTAwMjQxNTA2M2UrMDAsICsxLjAyNTA2MTc3NzY0ODIzNGUrMDAsICsxLjAyNDM1Mzk4MDk3NjcwMWUrMDAsCi0gICAgKzEuMDIzNTgyMzg1NjE4Nzc0ZSswMCwgKzEuMDIyNzU2NTE0NjE1MTA2ZSswMCwgKzEuMDIxODgwNjA0MzUwNDIyZSswMCwKLSAgICArMS4wMjA5NjM4NzEzMTc2NjVlKzAwLCArMS4wMjAwMDkxMzk1NDkyNzVlKzAwLCArMS4wMTkwMjcyODU1MDEyNTFlKzAwLAotICAgICsxLjAxODAxOTQ0Mjc4NDIzMWUrMDAsICsxLjAxNjk5NjQ5OTU2MDg0NWUrMDAsICsxLjAxNTk1NzQzMzIwNjMyNGUrMDAsCi0gICAgKzEuMDE0OTIzNDQxMjU5Nzk1ZSswMCwgKzEuMDEzOTE1OTQ2MTAwNjI5ZSswMCwgKzEuMDEzMDQ3NTY1MTQ5MzI3ZSswMCwKLSAgICArMS4wMTIyMTYxMzAzNjU2MTBlKzAwLCArMS4wMTEwNDQ4Njk2MzkxNjRlKzAwLCArMS4wMDk5MTQ1OTIxMzAwNDRlKzAwLAotICAgICsxLjAwODgyNDg4ODA5MjU3M2UrMDAsICsxLjAwNzc3Mzg1ODQ1NTQwMGUrMDAsICsxLjAwNjc2MTcwMDQxMjk5M2UrMDAsCi0gICAgKzEuMDA1Nzg2NjQ4ODEwODU0ZSswMCwgKzEuMDA0ODQ4NzUzOTYyNzM0ZSswMCwgKzEuMDAzOTQ2MDgzNDEzNzMzZSswMCwKLSAgICArMS4wMDMwNzg4NDY1MDY1NDZlKzAwLCArMS4wMDIyNDUwMDkxMzU2ODRlKzAwLCArMS4wMDE0NDQ3MzM5MDU4MTdlKzAwLAotICAgICsxLjAwMDY3NjE4ODQzNjY1MWUrMDAsICs5Ljk5OTM5MzE2OTIzOTAwOWUtMDEsICs5Ljk5MjMyMDg0ODI5ODA1N2UtMDEsCi0gICAgKzkuOTg1NTQ4MTI3MTU1NDI1ZS0wMSwgKzkuOTc5MDU1NDE1NjI3MzMwZS0wMSwgKzkuOTcyODQyNjc5NzU4ODgwZS0wMSwKLSAgICArOS45NjY4OTA5NDg0NDE3NDVlLTAxLCArOS45NjEyMDMzNzk5NzEzMjZlLTAxLCArOS45NTU3NjEyNTYzMTM1ODFlLTAxLAotICAgICs5Ljk1MDU2NTcyNDU2NDU5N2UtMDEsICs5Ljk0NTU5NzUyNTQ3MTgyMmUtMDEsICs5Ljk0MDg2MDM3ODQ4NjYxNWUtMDEsCi0gICAgKzkuOTM2MzM3Nzg4OTcyNDkxZS0wMSwgKzkuOTMyMDMxNjA2NjA2NzU5ZS0wMSwgKzkuOTI3OTIxODcxMjY1NzMyZS0wMSwKLSAgICArOS45MjQwMTUxNzc4ODA3OThlLTAxLCArOS45MjAyOTcyNzMzMjM4OTFlLTAxLCArOS45MTY3Njc3NzUwODgyODFlLTAxLAotICAgICs5LjkxMzQwODc2NzcxOTE0MmUtMDEsICs5LjkxMDIzMDY1NDQyNDkwMmUtMDEsICs5LjkwNzIxNjQyNTg2NTkwMmUtMDEsCi0gICAgKzkuOTA0MzY2Nzk5NTM2MjYzZS0wMSwgKzkuOTAxNjY4OTUzNDM0MjIxZS0wMSwgKzkuODk5MTMxMDExNTgwNzkxZS0wMSwKLSAgICArOS44OTY3MzU2MzczNzQ1OTdlLTAxLCArOS44OTQ0ODgzNzQ1MTM3MTllLTAxLCArOS44OTIzNzQ4MzU0MDQyODNlLTAxLAotICAgICs5Ljg5MDQwMTkyNzc5NjcwNGUtMDEsICs5Ljg4ODU1NjM1NjAzNzg5MmUtMDEsICs5Ljg4Njg0MzQ2NzY5Mjc1M2UtMDEsCi0gICAgKzkuODg1MjQ3NjA2MDUxMDE0ZS0wMSwgKzkuODgzNzc4NTIwNTMxMjY4ZS0wMSwgKzkuODgyNDIzMjcwNTgyNTI0ZS0wMSwKLSAgICArOS44ODExODU2Mzg5MTUzNjNlLTAxLCArOS44ODAwNTE2MjYzNDU4MDRlLTAxLCArOS44NzkwMzIwMjM3NjY0MzJlLTAxLAotICAgICs5Ljg3ODExMTc0NDM0ODk3NmUtMDEsICs5Ljg3NzI5NTQ1OTYxMDM0M2UtMDEsICs5Ljg3NjU3MTk4MzQyOTczNmUtMDEsCi0gICAgKzkuODc1OTQ5ODQzMjQ2MTg3ZS0wMSwgKzkuODc1NDEyNzM5NzY2NTY2ZS0wMSwgKzkuODc0OTY5MDYxMzk5Mzg5ZS0wMSwKLSAgICArOS44NzQ2MDYyNDkxMjc1NTFlLTAxLCArOS44NzQzMjk4MDk4MDI4OTNlLTAxLCArOS44NzQxMjY0MTQ0Mzc2ODFlLTAxLAotICAgICs5Ljg3NDAwNDc1MDQwNDAzM2UtMDEsICs5Ljg3Mzk0OTkyMTAzMzI5OWUtMDEsICs5Ljg3Mzk2OTE2Mjc0NzA3NGUtMDEsCi0gICAgKzkuODc0MDQ5MDYwMzE3NTgxZS0wMSwgKzkuODc0MTk3MDQ5MDAzNjc2ZS0wMSwgKzkuODc0Mzk5NzE3MTEwNTE3ZS0wMSwKLSAgICArOS44NzQ2NjMyODEyMzE3MzdlLTAxLCArOS44NzQ5NzMyMDU4ODIzMTllLTAxLCArOS44NzUzMzg5MjY2OTUzMTVlLTAxLAotICAgICs5Ljg3NTc0NjUzNTQxMDk4M2UtMDEsICs5Ljg3NjIwMTIzODcwMzI0MWUtMDEsICs5Ljg3NjY4OTgwMTkzMjQwMmUtMDEsCi0gICAgKzkuODc3MjIxNTU2MTkzMTgzZS0wMSwgKzkuODc3NzgxOTIwNDMzMDE1ZS0wMSwgKzkuODc4Mzc2NDg5NTkxMzU4ZS0wMSwKLSAgICArOS44Nzg5OTE5OTAyNDU0MzllLTAxLCArOS44Nzk2Mzc5Nzk5MzMzMzllLTAxLCArOS44ODAzMDAzMDM2NTM3NDNlLTAxLAotICAgICs5Ljg4MDk4NDY3NTg1OTg1NWUtMDEsICs5Ljg4MTY3ODAwNzgwNzA5NWUtMDEsICs5Ljg4MjM5MDMwMDA5NzE1NGUtMDEsCi0gICAgKzkuODgzMTA3NjkzOTkyNDU2ZS0wMSwgKzkuODgzODM1MjAwMTg5NjUzZS0wMSwgKzkuODg0NTYwMTU5ODc4OTU1ZS0wMSwKLSAgICArOS44ODUyOTQyMDAzOTIxODVlLTAxLCArOS44ODYwMjIyMTkzOTc4OTJlLTAxLCArOS44ODY3NDk0MDQxNzYwMjhlLTAxLAotICAgICs5Ljg4NzQ2NjI2MTE0MjUwNWUtMDEsICs5Ljg4ODE4Mjc3MTI2MzUwNWUtMDEsICs5Ljg4ODg4MjQ4MDg1MjE0N2UtMDEsCi0gICAgKzkuODg5NTc0Mzg0NzA1ODk2ZS0wMSwgKzkuODkwMjQ3OTc3NjAyODk1ZS0wMSwgKzkuODkwOTExMjQ3NzAxMDI5ZS0wMSwKLSAgICArOS44OTE1NTE3MDE1NTYxOTZlLTAxLCArOS44OTIxNzg2NTg3NDgyMzllLTAxLCArOS44OTI3Nzk1NTU4MTgwODhlLTAxLAotICAgICs5Ljg5MzM2NTE4NjkwMzUzOGUtMDEsICs5Ljg5MzkyMzY4MDAwNzU3N2UtMDEsICs5Ljg5NDQ2MjgzMDg1MjE3NWUtMDEsCi0gICAgKzkuODk0OTcyMTI0OTUyMDAwZS0wMSwgKzkuODk1NDYzMzQyODE1MDA5ZS0wMSwgKzkuODk1OTIzNjE3NTMwMzgyZS0wMSwKLSAgICArOS44OTYzNjI2NTI5NjYyMzllLTAxLCArOS44OTY3NzIwMTE1NDI2OTNlLTAxLCArOS44OTcxNjIxOTUyNjMwNDZlLTAxLAotICAgICs5Ljg5NzUyMDI4NjQ4MDAzOWUtMDEsICs5Ljg5Nzg1OTE5NTIwOTIzNWUtMDEsICs5Ljg5ODE3MDI2NzQxMTMzMGUtMDEsCi0gICAgKzkuODk4NDYyMDY4NzY0OTg2ZS0wMSwgKzkuODk4NzI1MzYzODA5ODQ3ZS0wMSwgKzkuODk4OTc1MTM4Nzg3Nzg3ZS0wMSwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDk5IG9mIDE3NwotICAgICs5Ljg5OTIwMDA1MDIwODQ4NmUtMDEsICs5Ljg5OTQxMDc4OTIyMzU1OWUtMDEsICs5Ljg5OTYwMDYwNTA1NDQxOGUtMDEsCi0gICAgKzkuODk5NzgyMjYxMDM4MDYwZS0wMSwgKzkuODk5OTQ1NTU3MDY3OTgwZS0wMSwgKzkuOTAwMTAzNTAwODA3NTA3ZS0wMSwKLSAgICArOS45MDAyNDgzMjA5OTAxODFlLTAxLCArOS45MDAzOTQwMjM3MzY5NzNlLTAxLCArOS45MDA1MzIxMDU4MjkzNjVlLTAxLAotICAgICs5LjkwMDY3NDc0NjA0NzI1OWUtMDEsICs5LjkwMDgxNDcyMjk0ODg5MGUtMDEsICs5LjkwMDk2NjkyNjA1MTI1N2UtMDEsCi0gICAgKzkuOTAxMTIyNDQ4NzM0NTk1ZS0wMSwgKzkuOTAxMjkzNzkwMzEyMDA1ZS0wMSwgKzkuOTAxNDc0NjQ4OTEyMzA3ZS0wMSwKLSAgICArOS45MDE2ODA1OTg4Njc0NDRlLTAxLCArOS45MDE5MDIyNjU2OTY2MDllLTAxLCArOS45MDIxNTE4OTY1MDEyMDFlLTAxLAotICAgICs5LjkwMjQyNDQxODI5NjQ4NWUtMDEsICs5LjkwMjczNDQ0ODgxNTAwNGUtMDEsICs5LjkwMzA3MTI3MDc2ODk0MmUtMDEsCi0gICAgKzkuOTAzNDQ4OTEzOTUwNjU0ZS0wMSwgKzkuOTAzODYyMjgwMDgxMjQ2ZS0wMSwgKzkuOTA0MzI0NDg0NjY2ODUzZS0wMSwKLSAgICArOS45MDQ4MjU2NTA2MDExMTBlLTAxLCArOS45MDUzNzk4MzA4NzM4MjJlLTAxLCArOS45MDU5ODA2MDIxMzY0NDBlLTAxLAotICAgICs5LjkwNjY0MDM2NjU1NDYzMGUtMDEsICs5LjkwNzM0ODgyNjMxMjk5M2UtMDEsICs5LjkwODEyMDM3NjgyMjIyOGUtMDEsCi0gICAgKzkuOTA4OTQ3ODU4MzExNzIxZS0wMSwgKzkuOTA5ODQyNTkyMzAxMjczZS0wMSwgKzkuOTEwNzk1MjQ3NzcwMTc4ZS0wMSwKLSAgICArOS45MTE4MTkyNDAxMDgxMjRlLTAxLCArOS45MTI5MDUxMTg2MDc2NDdlLTAxLCArOS45MTQwNjQ3MDUzNjE1NjRlLTAxLAotICAgICs5LjkxNTI4ODAxMTU0Mzk2MWUtMDEsICs5LjkxNjU4Njk0MDE2NjUwOWUtMDEsICs5LjkxNzk1MjcyMDY4NTU2MmUtMDEsCi0gICAgKzkuOTE5Mzk2MjE3MjkxMDA5ZS0wMSwgKzkuOTIwOTA2MTUxMjE5MzEwZS0wMSwgKzkuOTIyNDk1MDI4MzEzNDU2ZS0wMSwKLSAgICArOS45MjQxNTIzOTgzNTI3NTFlLTAxLCArOS45MjU4ODcyMDg3OTQxNDRlLTAxLCArOS45Mjc2ODg3MDg0Njg0MjFlLTAxLAotICAgICs5LjkyOTU2OTExMjUzNzk0NGUtMDEsICs5LjkzMTUxNjUyODUxMzgyNGUtMDEsICs5LjkzMzUzOTI0NDE1OTE0MGUtMDEsCi0gICAgKzkuOTM1NjI2ODkzMTMxNjk1ZS0wMSwgKzkuOTM3NzkwODY2NTY4NzM1ZS0wMSwgKzkuOTQwMDE2NDM0MDQ0NDg1ZS0wMSwKLSAgICArOS45NDIzMTIwMjQ4MzM4MTBlLTAxLCArOS45NDQ2NjgxODQzNzE2MTdlLTAxLCArOS45NDcwOTM0NDE2OTQ1MTNlLTAxLAotICAgICs5Ljk0OTU3Mjg1NDU2NTUzM2UtMDEsICs5Ljk1MjExNjYzNDI5NzU2NmUtMDEsICs5Ljk1NDcxMjYzNTMyMTIyN2UtMDEsCi0gICAgKzkuOTU3MzY3OTUxNDc4MDY5ZS0wMSwgKzkuOTYwMDY4NjE2MTg1NjQxZS0wMSwgKzkuOTYyODIzMDI1NjE0MDc5ZS0wMSwKLSAgICArOS45NjU2MTc5ODYzODI2MzBlLTAxLCArOS45Njg0NjEzMjk4MjU3NTNlLTAxLCArOS45NzEzMzgyNzE5MTI3NTJlLTAxLAotICAgICs5Ljk3NDI1NjY5MTIyMjExM2UtMDEsICs5Ljk3NzIwMzM2OTUxNTU1NmUtMDEsICs5Ljk4MDE4NTA4NzA1NTc0NGUtMDEsCi0gICAgKzkuOTgzMTg1ODcxNzYxOTc3ZS0wMSwgKzkuOTg2MjEzNTIwNzY5NTkzZS0wMSwgKzkuOTg5MjU1NDI2NDY2MjY3ZS0wMSwKLSAgICArOS45OTIzMTczMTQxMDA5NzVlLTAxLCArOS45OTUzODI1ODIyNDI5OTBlLTAxLCArOS45OTg0NjExNjA3MTgyNzVlLTAxLAotICAgICsxLjAwMDE1MzkwNzYxMjA4MGUrMDAsICsxLjAwMDQ2MTk1NTA3OTY2MGUrMDAsICsxLjAwMDc2ODg1OTI4MDMzOGUrMDAsCi0gICAgKzEuMDAxMDc1NjEzMDUzNzI4ZSswMCwgKzEuMDAxMzgwNTUxMjE3MTA5ZSswMCwgKzEuMDAxNjg0MjQ0NzM0NDk3ZSswMCwKLSAgICArMS4wMDE5ODU0MjUzOTc1NjdlKzAwLCArMS4wMDIyODQ4NzE3ODYyMjZlKzAwLCArMS4wMDI1ODA5NzUxNjE4NDNlKzAwLAotICAgICsxLjAwMjg3NDQxMTM2ODQzMGUrMDAsICsxLjAwMzE2Mzg0NTM2NDk3MGUrMDAsICsxLjAwMzQ1MDA2MzM3NDMyOWUrMDAsCi0gICAgKzEuMDAzNzMxNTcwMjg3ODkzZSswMCwgKzEuMDA0MDA5MTQ3NDYyMDQzZSswMCwgKzEuMDA0MjgxNDU3NTgyOTM1ZSswMCwKLSAgICArMS4wMDQ1NDkzMzkyMjYzMzZlKzAwLCArMS4wMDQ4MTEzNzUwNTMzNjRlKzAwLCArMS4wMDUwNjgyNzIzOTQzNjBlKzAwLAotICAgICsxLjAwNTMxODc5NTc0ODI4NmUrMDAsICsxLjAwNTU2Mzk2ODAwODAzN2UrMDAsICsxLjAwNTgwMjI2OTYzNTI4MmUrMDAsCi0gICAgKzEuMDA2MDM0NTU0MDAyMzUzZSswMCwgKzEuMDA2MjU5ODU1MzYwODY3ZSswMCwgKzEuMDA2NDc5MDE4MTM5NTQwZSswMCwKLSAgICArMS4wMDY2OTA1NDE0MjgxMTZlKzAwLCArMS4wMDY4OTU1NzA0MDg1NjNlKzAwLCArMS4wMDcwOTMwNDU2OTY1MjdlKzAwLAotICAgICsxLjAwNzI4Mzc5OTI0NjIzM2UrMDAsICsxLjAwNzQ2NjYxNjI5ODA1N2UrMDAsICsxLjAwNzY0MjcyODQyNjg0N2UrMDAsCi0gICAgKzEuMDA3ODExMDM2NTg1NTk1ZSswMCwgKzEuMDA3OTcyNDQxOTkwMTg3ZSswMCwgKzEuMDA4MTI1ODc1OTA0NDcyZSswMCwKLSAgICArMS4wMDgyNzI2MDIzODMyODRlKzAwLCArMS4wMDg0MTE0Njg2MTY4NTJlKzAwLCArMS4wMDg1NDM1NzMxNTI2MzJlKzAwLAotICAgICsxLjAwODY2ODAxODMzNDc5N2UrMDAsICsxLjAwODc4NjAwOTc4NzI2OWUrMDAsICsxLjAwODg5NjUyNjIzMzU1NWUrMDAsCi0gICAgKzEuMDA5MDAwNzY2MzM2MDcxZSswMCwgKzEuMDA5MDk3NzYzODUwMzMzZSswMCwgKzEuMDA5MTg4ODgwODk3MzcwZSswMCwKLSAgICArMS4wMDkyNzMxNjM3OTczMTNlKzAwLCArMS4wMDkzNTE3NjI1NDYyOTZlKzAwLCArMS4wMDk0MjM5NDQ5NDkxNDNlKzAwLAotICAgICsxLjAwOTQ5MTE3NTI0NDUwN2UrMDAsICsxLjAwOTU1MjQwMTkwMDk2MWUrMDAsICsxLjAwOTYwODg4Njg5NTc2NGUrMDAsCi0gICAgKzEuMDA5NjU5OTczODMwNzUxZSswMCwgKzEuMDA5NzA3MDkzNzc4MTYyZSswMCwgKzEuMDA5NzQ5MjM4NTYyMDY3ZSswMCwKLSAgICArMS4wMDk3ODc3NDQyODQ2NjFlKzAwLCArMS4wMDk4MjIwOTAyMjA0MDdlKzAwLCArMS4wMDk4NTM3MDYyODI1OTdlKzAwLAotICAgICsxLjAwOTg4MTQ5ODk0MzAxMGUrMDAsICsxLjAwOTkwNjk1ODQ0ODA5OWUrMDAsICsxLjAwOTkyOTU2NzAyMTU2MmUrMDAsCi0gICAgKzEuMDA5OTUwNTczNDgzMzY2ZSswMCwgKzEuMDA5OTY5MDIxNDAwNDc0ZSswMCwgKzEuMDA5OTg2NDk5MTg1MDU0ZSswMCwKLSAgICArMS4wMTAwMDIzNjM4NzkwNDRlKzAwLCArMS4wMTAwMTc4OTA0Mjg4NzdlKzAwLCArMS4wMTAwMzIxNzAxODAzNjBlKzAwLAotICAgICsxLjAxMDA0NjcyMjA0NTU4M2UrMDAsICsxLjAxMDA2MDgwOTI5OTUzMGUrMDAsICsxLjAxMDA3NTY3NDQ0NTI4OWUrMDAsCi0gICAgKzEuMDEwMDkwNDQ5OTgyMDk4ZSswMCwgKzEuMDEwMTA2NTY0OTY1OTY1ZSswMCwgKzEuMDEwMTIzMjI2NTg0MTIwZSswMCwKLSAgICArMS4wMTAxNDE3NjIxNzMxNDVlKzAwLCArMS4wMTAxNjExMzEwOTMzNzJlKzAwLCArMS4wMTAxODI2MzU4OTc4NzZlKzAwLAotICAgICsxLjAxMDIwNTU4NzkzMTY2MGUrMDAsICsxLjAxMDIzMTA3ODQ5NDI0OWUrMDAsICsxLjAxMDI1Nzk1MDIyNzk4OGUrMDAsCi0gICAgKzEuMDEwMjg3NzMyOTY4NTgwZSswMCwgKzEuMDEwMzE5NDg0NTI0NTEyZSswMCwgKzEuMDEwMzU0MDc5NjYzNzY3ZSswMCwKLSAgICArMS4wMTAzOTA2MzU0ODgwMzdlKzAwLCArMS4wMTA0MzA0NzA0OTQ1MTJlKzAwLCArMS4wMTA0NzIyNjY0OTUwNzRlKzAwLAotICAgICsxLjAxMDUxNzA5NjM4MTUwOWUrMDAsICsxLjAxMDU2NDA5OTI4MTAwMGUrMDAsICsxLjAxMDYxNDI2Njg5NDUxMmUrMDAsCi0gICAgKzEuMDEwNjY2Mjg1ODc2NDU1ZSswMCwgKzEuMDEwNzIxMzYwMjQzMjM0ZSswMCwgKzEuMDEwNzc4NDE2NzU1MjY0ZSswMCwKLSAgICArMS4wMTA4MzgyNTI2NDQ0NjFlKzAwLCArMS4wMTA4OTk2NTU2NzQ1NzhlKzAwLCArMS4wMTA5NjM3Mjk2MjY2NDFlKzAwLAotICAgICsxLjAxMTAyOTE5MTMwMTY5NGUrMDAsICsxLjAxMTA5Njk5Mzk5MzAzN2UrMDAsICsxLjAxMTE2NTg2MTIzOTE3M2UrMDAsCi0gICAgKzEuMDExMjM2NjEwMzQxMjYwZSswMCwgKzEuMDExMzA4MTY3NjcwNzUzZSswMCwgKzEuMDExMzgxNDUzNjM4OTEyZSswMCwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDEwMCBvZiAxNzcKLSAgICArMS4wMTE0NTQ3ODU3MTMxMDJlKzAwLCArMS4wMTE1MjkxODUxNTM4MDllKzAwLCArMS4wMTE2MDM2ODA5MTA1MDVlKzAwLAotICAgICsxLjAxMTY3ODgwMzkzODA0NmUrMDAsICsxLjAxMTc1MzAwODU2OTgwM2UrMDAsICsxLjAxMTgyNzQ4NDc5Nzk4NWUrMDAsCi0gICAgKzEuMDExOTAwOTM2NTQ3ODgxZSswMCwgKzEuMDExOTczODc2NTExNjAzZSswMCwgKzEuMDEyMDQ0ODg1MDAzMzA0ZSswMCwKLSAgICArMS4wMTIxMTQ5ODU2NDQ5MTllKzAwLCArMS4wMTIxODI4MzcwOTQ5NTVlKzAwLCArMS4wMTIyNDkwMjM5NzY3NDJlKzAwLAotICAgICsxLjAxMjMxMjA5NTA2MzA3MGUrMDAsICsxLjAxMjM3MzAyODczNzc3NGUrMDAsICsxLjAxMjQzMDQ2MzY3OTMxNmUrMDAsCi0gICAgKzEuMDEyNDg0OTcyMjQ2ODIyZSswMCwgKzEuMDEyNTM1MDU4NjAyNDUzZSswMCwgKzEuMDEyNTgxNjc4MTY5MTg4ZSswMCwKLSAgICArMS4wMTI2MjM0NzI4OTg1MDRlKzAwLCArMS4wMTI2NjA5NzU1Mjk4NThlKzAwLCArMS4wMTI2OTI3NTg3NTAyMTNlKzAwLAotICAgICsxLjAxMjcxOTc4OTIwMTE0NGUrMDAsICsxLjAxMjc0MDU3NTI5NjYwM2UrMDAsICsxLjAxMjc1NTc1Mzg4NzA4NWUrMDAsCi0gICAgKzEuMDEyNzYzOTQ4ODQxMjA0ZSswMCwgKzEuMDEyNzY1OTIyNDQ5OTYwZSswMCwgKzEuMDEyNzYwMjk4NjYxMDY5ZSswMCwKLSAgICArMS4wMTI3NDc4MTk5MzY1ODRlKzAwLCArMS4wMTI3MjY5NTg5NTQ5NjFlKzAwLCArMS4wMTI2OTg2MDc2OTIxODNlKzAwLAotICAgICsxLjAxMjY2MTQwMDUzOTQwNWUrMDAsICsxLjAxMjYxNTkwNDExNjI2NWUrMDAsICsxLjAxMjU2MDgzMzAwNTcxM2UrMDAsCi0gICAgKzEuMDEyNDk3MDUwMjY5ODA1ZSswMCwgKzEuMDEyNDIyODg4NTIxNjAxZSswMCwgKzEuMDEyMzM5MjI2MjQxMzY3ZSswMCwKLSAgICArMS4wMTIyNDQ5MjE5NjYyOTdlKzAwLCArMS4wMTIxNDA0NjAyMTExOTRlKzAwLCArMS4wMTIwMjQzMDIwODU0NDFlKzAwLAotICAgICsxLjAxMTg5NzU2MDU2NzcwN2UrMDAsICsxLjAxMTc1ODgxMDU4MzE1MGUrMDAsICsxLjAxMTYwODQ0OTEyNzY0MmUrMDAsCi0gICAgKzEuMDExNDQ1MTYyNzIzMjcwZSswMCwgKzEuMDExMjY5OTYwOTQ3NzQ0ZSswMCwgKzEuMDExMDgxMjU1NjQ1OTY5ZSswMCwKLSAgICArMS4wMTA4Nzk2MDg0MjQzMTJlKzAwLCArMS4wMTA2NjM2NzY3MzUyMjhlKzAwLCArMS4wMTA0MzQxODQyMDA2NDBlKzAwLAotICAgICsxLjAxMDE4OTY4MTEyNDY1N2UrMDAsICsxLjAwOTkzMDc1NDgwNzkyM2UrMDAsICsxLjAwOTY1NTY2MDIxNTI3MWUrMDAsCi0gICAgKzEuMDA5MzY1MjUxNTY0Njk0ZSswMCwgKzEuMDA5MDU4MjQ5ODczODMzZSswMCwgKzEuMDA4NzM0NzU4NTc4OTg5ZSswMCwKLSAgICArMS4wMDgzOTMwNzk5NjMwOTFlKzAwLCArMS4wMDgwMzQzMDgyOTU0MjFlKzAwLCArMS4wMDc2NTY2NjEyMTU5NzNlKzAwLAotICAgICsxLjAwNzI2MDE0MjYyMjg4N2UrMDAsICsxLjAwNjg0MzM1MjUwNjg1NWUrMDAsICsxLjAwNjQwNzAwOTU0MjEwM2UrMDAsCi0gICAgKzEuMDA1OTQ5MTQ1MTcwNzExZSswMCwgKzEuMDA1NDcwMDA1NjM3MDUyZSswMCwgKzEuMDA0OTY3OTg2NDI0NDY3ZSswMCwKLSAgICArMS4wMDQ0NDM1MzE5OTU5NDVlKzAwLCArMS4wMDM4OTQ3NzI0MDMzNzFlKzAwLCArMS4wMDMzMjE5MDM2NjM3OTNlKzAwLAotICAgICsxLjAwMjcyMzEyNzMwODE0OGUrMDAsICsxLjAwMjA5ODg1NDQwMDU3NWUrMDAsICsxLjAwMTQ0NzI3ODg3MzQ4M2UrMDAsCi0gICAgKzEuMDAwNzY4NTA1MzE3MDg2ZSswMCwgKzEuMDAwMDYwNjg2NzU4NzU4ZSswMCwgKzkuOTkzMjQyNjg0ODUxODU1ZS0wMSwKLSAgICArOS45ODU1NzM1MDMzOTA2MjdlLTAxLCArOS45Nzc2MDAxOTY0MDY4NjhlLTAxLCArOS45NjkzMDYwMzY5MzU0OTdlLTAxLAotICAgICs5Ljk2MDY5NDI2OTU1MzY0NGUtMDEsICs5Ljk1MTc0NjQzMDA2MTEyMWUtMDEsICs5Ljk0MjQ2NjQzODQwNzIzMGUtMDEsCi0gICAgKzkuOTMyODM3MTMxMDY4NjU3ZS0wMSwgKzkuOTIyODYxMDgyNDcyMjY0ZS0wMSwgKzkuOTEyNTIzMDkyOTg5MzE5ZS0wMSwKLSAgICArOS45MDE4Mjc0MTk3OTA2OTFlLTAxLCArOS44OTA3NTc4Njg3MDc1OTBlLTAxLCArOS44NzkzMTMwMjQxNzQwMjJlLTAxLAotICAgICs5Ljg2MzU1MzIyMDI3MjUyM2UtMDEsICs5Ljg0NzM2MjQ1MzQ4MDI2NWUtMDEsICs5LjgzMTc1MDk0ODc3MjU2NmUtMDEsCi0gICAgKzkuODE1NTgzMzM2MDExMzQ1ZS0wMSwgKzkuNzk4NjEzNTI2MjcxNTYxZS0wMSwgKzkuNzgwNjE3NDg2OTkzNjMwZS0wMSwKLSAgICArOS43NjE1NzQzMTczNzQzMDNlLTAxLCArOS43NDEzNzg2MTczMzc3NTllLTAxLCArOS43MTk5OTAxMTIwNjU3NTJlLTAxLAotICAgICs5LjY5NzMyNzQxMzY1ODE2OGUtMDEsICs5LjY3MzMzMTk3NTU1OTMzMmUtMDEsICs5LjY0NzkxNTEyNDA1NzczMmUtMDEsCi0gICAgKzkuNjIxMDExNDk3NTY2MTQ1ZS0wMSwgKzkuNTkyNTM5NzU3MDQ0NTE2ZS0wMSwgKzkuNTYyNDI3MTc3Mjk1NzMxZS0wMSwKLSAgICArOS41MzA2MDA5MDk3MjYzNDRlLTAxLCArOS40OTY5ODQwODE2NTIyODRlLTAxLCArOS40NjE0OTgxMjAxNzY4NTRlLTAxLAotICAgICs5LjQyNDA3MTYxMzYyNTc0M2UtMDEsICs5LjM4NDYzNDE2MzgyNjcxMWUtMDEsICs5LjM0MzExMjk2NjA5NDA4NWUtMDEsCi0gICAgKzkuMjk5NDQ5ODcyMTk3NDUyZS0wMSwgKzkuMjUzNTY3OTY4NzUwMzI4ZS0wMSwgKzkuMjA1NDA0NjI3MDc2NjI1ZS0wMSwKLSAgICArOS4xNTQ4OTYyODA1NzUzNjBlLTAxLCArOS4xMDE5ODY3OTA5MzA2MDVlLTAxLCArOS4wNDY2MjA1OTc3NDE1MDhlLTAxLAotICAgICs4Ljk4ODc1NTE5NDM3MjQyNGUtMDEsICs4LjkyODMzODMxNjQ5NTcwNWUtMDEsICs4Ljg2NTMzNzE5MDM2ODA1M2UtMDEsCi0gICAgKzguNzk5NzEyNzIyNTY3OTM0ZS0wMSwgKzguNzMxNDM3ODM1OTgzMDQ3ZS0wMSwgKzguNjYwNDc2NTM0NTYzMTMxZS0wMSwKLSAgICArOC41ODY4MTI1MjAxNzQyNTJlLTAxLCArOC41MTA0MjA0NDA2ODUwNDllLTAxLCArOC40MzEyOTcyMjY4ODY1NzRlLTAxLAotICAgICs4LjM0OTQzNTE0MTk4OTcxNGUtMDEsICs4LjI2NDgzOTkxMTI5MTEzM2UtMDEsICs4LjE3NzUwNTM2NjU3MzY5MGUtMDEsCi0gICAgKzguMDg3NDQ5ODE3MTI0MzE1ZS0wMSwgKzcuOTk0NjgxNDkyNzk3MDg0ZS0wMSwgKzcuODk5MjM1MTYyMTk0NzE4ZS0wMSwKLSAgICArNy44MDExMzc3MzE1NjY1MDJlLTAxLCArNy43MDA0MzEyNzUyMTY5MjhlLTAxLCArNy41OTcxNDU3MzY5NzEwNjVlLTAxLAotICAgICs3LjQ5MTMzMDk3MTgyMDgwNGUtMDEsICs3LjM4MzAyODYwMzA1ODc4M2UtMDEsICs3LjI3MjI5ODc1NTgyNDY5M2UtMDEsCi0gICAgKzcuMTU5MjAxOTE5OTYyNjExZS0wMSwgKzcuMDQzODE0MzQwMzU2MDgzZS0wMSwgKzYuOTI2MTk2OTI3Mzc3MTQwZS0wMSwKLSAgICArNi44MDY0Mzg4MzE4NjYwNzdlLTAxLCArNi42ODQ2MTY0NzgyMzY2NDdlLTAxLCArNi41NjA4MzAxMzc5ODY1MTVlLTAxLAotICAgICs2LjQzNTE3OTI2ODU1OTk1N2UtMDEsICs2LjMwNzc1NTMyOTM4MjYxMmUtMDEsICs2LjE3ODY0MTY0Nzc4NjUyNWUtMDEsCi0gICAgKzYuMDQ3OTU0NjI1NzAyNTQxZS0wMSwgKzUuOTE1Nzk5NTg3MTc2MjE2ZS0wMSwgKzUuNzgyMjg5MzY2MDA1ODk0ZS0wMSwKLSAgICArNS42NDc1MzU4ODU3NTIxOTFlLTAxLCArNS41MTE3MDMxNTU0MDAyNzRlLTAxLCArNS4zNzQ5MDUwOTA0MzcwNzFlLTAxLAotICAgICs1LjIzNzI2MzUwMDQ0NTcxNWUtMDEsICs1LjA5ODkxNTQyMzcyODI1NWUtMDEsICs0Ljk2MDAwODA3NDkyNjQyM2UtMDEsCi0gICAgKzQuODIwNjYyOTQzMzM3NDU4ZS0wMSwgKzQuNjgxMDE3MTEwMDQ4MDA3ZS0wMSwgKzQuNTQxMjE2OTk1OTU4NzQ2ZS0wMSwKLSAgICArNC40MDE0MjE4MTU3MjkwNjhlLTAxLCArNC4yNjE3NzI5NzE0OTMwMTBlLTAxLCArNC4xMjI0MTc4ODg1NDI1MTJlLTAxLAotICAgICszLjk4MzQ5OTYxMjUyNjQ5M2UtMDEsICszLjg0NTE3MjMzNTUzMTAwOWUtMDEsICszLjcwNzU4MzcxNzM3NjIzNmUtMDEsCi0gICAgKzMuNTcwODg2Nzg2Nzk1NTA2ZS0wMSwgKzMuNDM1MjI4NjcyNDQ1NjI3ZS0wMSwgKzMuMzAwNzYzNzY0NzAzNjM4ZS0wMSwKLSAgICArMy4xNjc2NDAzMjUwNDM4OTNlLTAxLCArMy4wMzYwMDQ2NTE5NzMxMDllLTAxLCArMi45MDU5OTYxNTg0MzY2ODJlLTAxLAotICAgICsyLjc3Nzc1ODUwMzc0NDg0N2UtMDEsICsyLjY1MTQzNDY3ODAyODUzMWUtMDEsICsyLjUyNzE2MTg4MTE4MTU3N2UtMDEsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMDEgb2YgMTc3Ci0gICAgKzIuNDA1MDY5ODQ5NjUwMDEyZS0wMSwgKzIuMjg1MjgzOTY5NDM4MDcyZS0wMSwgKzIuMTY3OTMzNDMyMTYyODc5ZS0wMSwKLSAgICArMi4wNTMxMzk4OTc4MzMwMjFlLTAxLCArMS45NDEwMjE5MDYzMjA5ODhlLTAxLCArMS44MzE2ODA4NzIwMDg5NDNlLTAxLAotICAgICsxLjcyNTIyMTk0NzIwODkxM2UtMDEsICsxLjYyMTczNTQxNjM4NDgzNGUtMDEsICsxLjUyMTMyMDY4MzQ2Nzg0OWUtMDEsCi0gICAgKzEuNDI0MDUyODAxMTQ5OTg1ZS0wMSwgKzEuMzMwMDE1MjQwOTM4NjE1ZS0wMSwgKzEuMjM5MjYwNjY0ODI4NTI2ZS0wMSwKLSAgICArMS4xNTE4NTgyOTU1MjcyOTNlLTAxLCArMS4wNjc4NDA0MzAxOTM3MjRlLTAxLCArOS44NzI2Mzc1MDUwMDI4NzhlLTAyLAotICAgICs5LjEwMTM3OTAwMDg4ODAzNWUtMDIsICs4LjM2NTA1NzIzNjYyMzA1NWUtMDIsICs3LjY2MzUwODMwNTUzNjE1M2UtMDIsCi0gICAgKzYuOTk3MDMzNDA1NzQ4ODI2ZS0wMiwgKzYuMzY1MTg4MTExMzgxMzY1ZS0wMiwgKzUuNzY4MTc2MDE1ODE0MzkyZS0wMiwKLSAgICArNS4yMDUyNDQyMTY5ODc5NjZlLTAyLCArNC42NzY1Mzg0MTIyNTc2MjFlLTAyLCArNC4xODA5NTA1NDE0MzgzNjJlLTAyLAotICAgICszLjcxODY0MDI1MTM2ODQ2NGUtMDIsICszLjI4ODA3Mjc1MDczMjIxNWUtMDIsICsyLjg4OTU0ODQ5OTU4Mjk1OGUtMDIsCi0gICAgKzIuNTIwOTgwNTY1OTI4ODg0ZS0wMiwgKzIuMTgzMDU3NTY0NjQ2MjcyZS0wMiwgKzEuODcyODk2MTk0MDAyNjM4ZS0wMiwKLSAgICArMS41OTIxMjc4MTUxNTM0MjBlLTAyLCArMS4zMzYzODE0MjU4MDMwMjBlLTAyLCArMS4xMDg1NTg4Nzc4MDcyODJlLTAyLAotICAgICs4Ljk0MzQ3NDE4OTM2NDYzOGUtMDMsICs2Ljc1ODEyNDg4OTY5Nzc4N2UtMDMsICszLjUwNDQzODEzMDYxOTQ5N2UtMDMsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTAyIG9mIDE3NwotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwgKzAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCArMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDAsICswLjAwMDAwMDAwMDAwMDAwMGUrMDB9OwotCi0vLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDRfKmltcGxlbWVudG9yQ29tbWVudHMqCi0vLyBTZWN0aW9uIDMuNy4zIExvdyBkZWxheSBNRENUIHdpbmRvd3MKLS8vIFNlY3Rpb24gMy43LjMuMiA3LjUgbXMgRnJhbWUgRHVyYXRpb24KLQotLy8gU2VjdGlvbiAzLjcuMy4yLjEgd183LjVfNjAgKGQwOXIwNF8qaW1wbGVtZW50b3JDb21tZW50cyopCi1kb3VibGUgd19ONjBfN3A1bXNbMTIwXSA9IHsKLSAgICAyLjk1MDYwODU5MzE4NzMxM2UtMDMsIDcuMTc1NDExMzE2NDM4NTEwZS0wMywgMS4zNzY5NTM3MzUzNzE3NTRlLTAyLAotICAgIDIuMzA5NTM1NTY0ODc3MjY2ZS0wMiwgMy41NDAzNjIyOTgzMjU5OTllLTAyLCA1LjA4Mjg5MzAzNTcxMDE1MmUtMDIsCi0gICAgNi45NDY5NjI5MjU5NTE0NzNlLTAyLCA5LjEzODg0Mjc3ODEzMzQyNmUtMDIsIDEuMTY2MDQ1NzQ4Mjk2MjMxZS0wMSwKLSAgICAxLjQ1MDczNTQ1OTgzOTE5NWUtMDEsIDEuNzY3MTExNzQwNTM0NjA4ZS0wMSwgMi4xMTM0Mjk1Mjk1NTQ4MDBlLTAxLAotICAgIDIuNDg3Njg2MTQ0NTk5MTQ4ZS0wMSwgMi44ODcwMTEwMTc0Njk4NTllLTAxLCAzLjMwODIzODcxMTQ5OTkzOGUtMDEsCi0gICAgMy43NDgxNDU0NDQwNjcyNTFlLTAxLCA0LjIwMzA4MDEzMDQ3MjMwOGUtMDEsIDQuNjY5MDQ5MTc5NjQ4NzM2ZS0wMSwKLSAgICA1LjE0MTg1MzQxMzU3ODMzMmUtMDEsIDUuNjE3MTAwNDA2NjY5NDEzZS0wMSwgNi4wOTAyNjM0NjE1MjQzNDFlLTAxLAotICAgIDYuNTU2NzEwMTYyMTM0MDk3ZS0wMSwgNy4wMTIxODM4NDIyOTgxODllLTAxLCA3LjQ1MjQwNjc4NzYyMjM2MmUtMDEsCi0gICAgNy44NzM2OTIwNjA0ODQzMjZlLTAxLCA4LjI3MjIzODMzNDM2ODAzNmUtMDEsIDguNjQ1MTM2NzUwMTg4Mjc3ZS0wMSwKLSAgICA4Ljk4OTc3NDE0NjEyNjIxNGUtMDEsIDkuMzA0MDc1MTc5ODQ1NTIzZS0wMSwgOS41ODU5OTkzNzM5NzQ4NTJlLTAxLAotICAgIDkuODM0NDc3MTkzNzg0MjI2ZS0wMSwgMS4wMDQ4ODI4MzMyODkwMjFlKzAwLCAxLjAyMjg1MzgwNzI3ODU0MWUrMDAsCi0gICAgMS4wMzc0MDQ5NDc5NjcwNDRlKzAwLCAxLjA0ODU5NzkxNDIwMjU5NmUrMDAsIDEuMDU2NTYxODQzNDI3NDQwZSswMCwKLSAgICAxLjA2MTQ5MzcwNjI0MzU2MmUrMDAsIDEuMDYzNjI1NzgzNzE2OTgwZSswMCwgMS4wNjMyNTk3Mjc5NzM4NzZlKzAwLAotICAgIDEuMDYwNzQ1MDQ4MzUxMTY2ZSswMCwgMS4wNTY0MzU4OTc4OTQ1MDBlKzAwLCAxLjA1MDY5NTAwMTAxMTI2NGUrMDAsCi0gICAgMS4wNDM5MjQzNDUwNjg4MzllKzAwLCAxLjAzNjQ3NzI0NjAyODU4MmUrMDAsIDEuMDI4NzI4NjczNjY2MDAzZSswMCwKLSAgICAxLjAyMTA2NDg1OTkxODAzMGUrMDAsIDEuMDE0MDA2NTgyMjYyMTc1ZSswMCwgMS4wMDcyNzQ1NTAxMDI5MzFlKzAwLAotICAgIDEuMDAxNzIyNDk3NDM3MTQyZSswMCwgOS45NzMwOTU5MTY2NjU4MzFlLTAxLCA5LjkzOTg1MTU4MjYwMTY2OWUtMDEsCi0gICAgOS45MTY4MzMzNDgwODk1OTFlLTAxLCA5LjkwMzI1MzI1MDI0OTEyNmUtMDEsIDkuODk4MjI2MTI1Mzc2MTUyZS0wMSwKLSAgICA5LjkwMDc0NzMzOTg5MzY2N2UtMDEsIDkuOTA5NzUzMTQzNjg5NTkyZS0wMSwgOS45MjQxMjg1MTIyNTY1MjRlLTAxLAotICAgIDkuOTQyNzMxNDkzNTc4NjIzZS0wMSwgOS45NjQzOTE1NzQzMTU5MDBlLTAxLCA5Ljk4NzkxNjE1NzUzNDA4NmUtMDEsCi0gICAgMS4wMDEyMDk4NDYyMDU2ODdlKzAwLCAxLjAwMzU3MzU2NzQ3OTYxMmUrMDAsIDEuMDA1NzU5ODM2MzY0NzIyZSswMCwKLSAgICAxLjAwNzY0NTE1MzY5MjgxOGUrMDAsIDEuMDA5MTA2ODcyMjkwNTQ1ZSswMCwgMS4wMTAwMjQ3NjQ0NjQ2MzllKzAwLAotICAgIDEuMDEwMjgyMDMxNjgyNzIwZSswMCwgMS4wMDk3NjkxODg3MDA1MzVlKzAwLCAxLjAwODM4NjQxMjE3MzI0MGUrMDAsCi0gICAgMS4wMDYwNTEyMzg5ODQ2NTZlKzAwLCAxLjAwMjY5NzY2NjE1NjkyNmUrMDAsIDkuOTgyODA0NjQ0NTg0MjEzZS0wMSwKLSAgICA5LjkyNzc3OTg2NzkzOTc5OGUtMDEsIDkuODYxODY4OTIxNjg5NTcyZS0wMSwgOS43NzYzNDE2NDM5MjI1NTRlLTAxLAotICAgIDkuNjc0NDcyNjk1NzAxMTYyZS0wMSwgOS41NTEyOTcyNTQxNjExNjdlLTAxLCA5LjQwMzg5ODc3NDExNTkyMmUtMDEsCi0gICAgOS4yMjk1OTI3OTk2NDI5NzdlLTAxLCA5LjAyNjA3MzQ5OTM3MjY4NGUtMDEsIDguNzkyMDI2ODg1NjI5NDgwZS0wMSwKLSAgICA4LjUyNjQxNzQ5NzI2NTY2NGUtMDEsIDguMjI4ODEyNzE2MTYzMTA2ZS0wMSwgNy44OTk3MTcxNTE3MTU3NzRlLTAxLAotICAgIDcuNTQwMzAzMjc2NzA2MzU3ZS0wMSwgNy4xNTI1NTc0MTczMjg0NjVlLTAxLCA2LjczOTM2OTExMjQwOTA3M2UtMDEsCi0gICAgNi4zMDQxNDcxNjIyOTI0NDVlLTAxLCA1Ljg1MDc4ODU3OTA4NDY3NGUtMDEsIDUuMzgzOTg1MTgyOTY2MTk4ZS0wMSwKLSAgICA0LjkwODMzNzUzMTczMjgwOWUtMDEsIDQuNDI4ODU4MjMyNTczNzE2ZS0wMSwgMy45NTA5MTAyNDA1Mzc1NTNlLTAxLAotICAgIDMuNDgwMDQzNDMxOTg1MTAyZS0wMSwgMy4wMjE5NjcxMDI0MDk0NjVlLTAxLCAyLjU4MjI3NDMwNTgwNTI4NGUtMDEsCi0gICAgMi4xNjY0MTQxNjQzODkwMTNlLTAxLCAxLjc3OTIyMTIxNTIwMTE0NmUtMDEsIDEuNDI0ODA1NDcxMjg3Njc0ZS0wMSwKLSAgICAxLjEwNjUyMTk0MzM1MzcxN2UtMDEsIDguMjY5OTU5NjY5NTI4Mjg3ZS0wMiwgNS44ODMzNDUxNjIwMTMxMzJlLTAyLAotICAgIDMuOTIwMzA4NDg0NTQ1NjQ2ZS0wMiwgMi4zODYyOTEwNzQ0Nzk0MTVlLTAyLCAxLjI2OTc2MjIzNDI0NjI0OGUtMDIsCi0gICAgNS4zNTY2NTM2MTAyMTU5ODdlLTAzLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfTsKLQotLy8gU2VjdGlvbiAzLjcuMy4yLjIgd183LjVfMTIwIChkMDlyMDRfKmltcGxlbWVudG9yQ29tbWVudHMqKQotZG91YmxlIHdfTjEyMF83cDVtc1syNDBdID0gewotICAgIDIuMjA4MjQ4NzQzMDQ2NjUwZS0wMywgMy44MTAxNDQxOTUwOTAzNTFlLTAzLCA1LjkxNTUyNDczNDI4OTgxM2UtMDMsCi0gICAgOC41ODM2MTQ1NjgwMzAwMzZlLTAzLCAxLjE4NzU5NzIyNjA4MzQ1MmUtMDIsIDEuNTgzMzUzMDE0MDk3MDg5ZS0wMiwKLSAgICAyLjA0OTE4NjUxNTUxNjAwNmUtMDIsIDIuNTg4ODM1OTI4OTIxNTQyZS0wMiwgMy4yMDQxNTg5NDQ4MTc1NDRlLTAyLAotICAgIDMuODk2MTY3MjEyMzk1NDY4ZS0wMiwgNC42Njc0MjE2OTEzOTM0OTBlLTAyLCA1LjUxODQ5MzM3Mjc2MTM1MGUtMDIsCi0gICAgNi40NTAzODM4NDQzODM3NTdlLTAyLCA3LjQ2NDExMDcxNDgwNjczMmUtMDIsIDguNTYwMDAxNjE4ODc4OTkzZS0wMiwKLSAgICA5LjczODQ2NzAyNTA0ODE3MGUtMDIsIDEuMDk5OTM2MDI1Mzg5NzMzZS0wMSwgMS4yMzQxOTI3NzQ3MjI4MTJlLTAxLAotICAgIDEuMzc2NTU0NTY1NDc2MjgzZS0wMSwgMS41MjY5MDQzNzQ2Mzk1NjRlLTAxLCAxLjY4NTEzMzYyNjQwNDk2NWUtMDEsCi0gICAgMS44NTA5MzEwNDYxMzE0MzBlLTAxLCAyLjAyNDEwNDE5NDg3OTg2NGUtMDEsIDIuMjA0NTAzNjUxMzMxODgwZS0wMSwKLSAgICAyLjM5MTY3OTQwNjIwMzA3N2UtMDEsIDIuNTg1MjYxNjgyODgzMzI3ZS0wMSwgMi43ODQ5ODUzODc3MzYzNjJlLTAxLAotICAgIDIuOTkwMzg0MzE1OTk1OTExZS0wMSwgMy4yMDEwNDg2MjM2NTU1MjFlLTAxLCAzLjQxNjU4NjIyMjQzMDM2M2UtMDEsCi0gICAgMy42MzY2MDAzNDAyNTIxMjFlLTAxLCAzLjg2MDYyNjk1MTg5NTAzNWUtMDEsIDQuMDg4MTUyNzI0NTk0NDMyZS0wMSwKLSAgICA0LjMxODcxMDQ1ODQ1ODY2MGUtMDEsIDQuNTUxNzY5ODc3MDQ4MTM5ZS0wMSwgNC43ODY3NjU5MjYzNTI2MzJlLTAxLAotICAgIDUuMDIzMjQ4MTMxMzgxMDM1ZS0wMSwgNS4yNjA2MDkxNjIyNDg0NzNlLTAxLCA1LjQ5ODMxMjgyODg1MDIzM2UtMDEsCi0gICAgNS43MzU3Njg4Mjc3NzAwNTllLTAxLCA1Ljk3MjQxMzM4NDQxMDM0MmUtMDEsIDYuMjA3NzAyNDI0MTkzOTczZS0wMSwKLSAgICA2LjQ0MDk5NjYyNDMzNjEyNGUtMDEsIDYuNjcxNzYzODE2NzYzOTUwZS0wMSwgNi44OTk1ODg1Mzc2NTg2NTRlLTAxLAotICAgIDcuMTIzNzk5ODAwOTMxMzAyZS0wMSwgNy4zNDM5NjM3MTg2OTQ3ODhlLTAxLCA3LjU1OTY2Njg4MDUwNTMyNGUtMDEsCi0gICAgNy43NzAzNjk4MTEwMTUxNjhlLTAxLCA3Ljk3NTU4MTEzNjg5Nzk0MmUtMDEsIDguMTc0OTA4NTU1MzExMTM4ZS0wMSwKLSAgICA4LjM2Nzk2OTQ5NjQwODUzMmUtMDEsIDguNTU0NDczMDk1Njc5MTYzZS0wMSwgOC43MzQwMDc5ODM5OTExNTZlLTAxLAotICAgIDguOTA2MzU3MTg5Njk4MDgzZS0wMSwgOS4wNzEyODc3MDEyMzg3ODJlLTAxLCA5LjIyODQ4NzgzNTcwMjg3N2UtMDEsCi0gICAgOS4zNzc2MzMyMjUzNDE4MjBlLTAxLCA5LjUxODYwMjA2MjUyNzQ2OGUtMDEsIDkuNjUxMzA2MDAxNTM2Mjg5ZS0wMSwKLSAgICA5Ljc3NTU2NTQwNTQ2NzI0OGUtMDEsIDkuODkxMjYyMDg2Nzc5OTU3ZS0wMSwgOS45OTg0NjkxOTE2ODMxNjNlLTAxLAotICAgIDEuMDA5NzAwNzI5NzAzODc0ZSswMCwgMS4wMTg2ODIyODY5MDgzNTJlKzAwLCAxLjAyNjgxNDU1MDg1OTE5MGUrMDAsCi0gICAgMS4wMzQwODk4MTI3NTE3MjBlKzAwLCAxLjA0MDUxMTk1NjYyOTM5N2UrMDAsIDEuMDQ2MTA4MzY4NTIyMzYyZSswMCwKLSAgICAxLjA1MDg4NTY0OTUzNDI3NmUrMDAsIDEuMDU0ODYyODg3NTc4NjU2ZSswMCwgMS4wNTgwNzIyMDU4NDk1NTJlKzAwLAotICAgIDEuMDYwNTM0MTM4NjcwMTExZSswMCwgMS4wNjIyNzY2MTc1MTc2NDJlKzAwLCAxLjA2MzMzODE1MDI2MDE5NGUrMDAsCi0gICAgMS4wNjM3NTU1NjY3NjY5NjJlKzAwLCAxLjA2MzU2NjMyMDYxODA2MWUrMDAsIDEuMDYyODIxNTU3NTMwMTIxZSswMCwKLSAgICAxLjA2MTU1OTk1ODkxNzU3NmUrMDAsIDEuMDU5ODE3MDkxNTgxNDgxZSswMCwgMS4wNTc2NTg3NjAzODQ1MTNlKzAwLAotICAgIDEuMDU1MTIwMDU3MzY1Mzk1ZSswMCwgMS4wNTIyMzk4NTA3MTk1NDZlKzAwLCAxLjA0OTA4Nzc4NTcxMzM4MWUrMDAsCi0gICAgMS4wNDU2OTg1OTUxNDYyMzVlKzAwLCAxLjA0MjEwODMwNjgyNDM4OWUrMDAsIDEuMDM4MzgwOTg1NTg4NjY3ZSswMCwKLSAgICAxLjAzNDU1Mjc2MjUzOTM2MmUrMDAsIDEuMDMwNjcxOTk3MTgxMjgyZSswMCwgMS4wMjY3OTE2NjY5NDI2ODFlKzAwLAotICAgIDEuMDIyOTU1NTg0MDIyMzQ0ZSswMCwgMS4wMTkyMDczMzIxMzc4NTNlKzAwLCAxLjAxNTg3Mjg4NzE5NzIyNWUrMDAsCi0gICAgMS4wMTIyMTAxNzQ1OTM1MzNlKzAwLCAxLjAwODg0NTU5MTAzNjk1OGUrMDAsIDEuMDA1Nzc4NTEyNDg2MjIxZSswMCwKLSAgICAxLjAwMzAwMjYxODQ5ODk2NGUrMDAsIDEuMDAwNTE0NjAxODA5MTQ4ZSswMCwgOS45ODMwOTIyODc1NjA1MjdlLTAxLAotICAgIDkuOTYzNzg2MDEzNzQ1NzE5ZS0wMSwgOS45NDcxODEzMjI3OTczNjdlLTAxLCA5LjkzMzE2MjE1NzExODQ5NmUtMDEsCi0gICAgOS45MjE2Njk1Njk2NDkzODdlLTAxLCA5LjkxMjU4NjAyNzA4ODUwN2UtMDEsIDkuOTA1ODExMDM4NzIzMjU2ZS0wMSwKLSAgICA5LjkwMTIzMTE4MTg2Mzc1NGUtMDEsIDkuODk4NzM3MTE5OTQ3MDAwZS0wMSwgOS44OTgxODcwNjY2NDcyNTNlLTAxLAotICAgIDkuODk5NDY4MDAxNzg3MTkxZS0wMSwgOS45MDI0MzE3NTM2NzcwODJlLTAxLCA5LjkwNjk1NTYzNTUxNDQzNGUtMDEsCi0gICAgOS45MTI4ODU0MDEwMzU5MzRlLTAxLCA5LjkyMDA5NDY5MDYzNTY2OGUtMDEsIDkuOTI4NDI2OTI3NTAxNDA4ZS0wMSwKLSAgICA5LjkzNzc1MDY2NjMwNjYzNWUtMDEsIDkuOTQ3OTAzOTc5ODI4NzE5ZS0wMSwgOS45NTg3NTUzMzYyMjEyNThlLTAxLAotICAgIDkuOTcwMTQzNjcwMTU2NzI2ZS0wMSwgOS45ODE5Mjg3MDY4NDIxMTllLTAxLCA5Ljk5Mzk0NTA2NDc2MjMzM2UtMDEsCi0gICAgMS4wMDA2MDU4NjAzNjgyOTZlKzAwLCAxLjAwMTgxMDQwMDk0NDQwOGUrMDAsIDEuMDAyOTk0NTczNjgyMjg3ZSswMCwKLSAgICAxLjAwNDE0MTU0ODA1MzU3NGUrMDAsIDEuMDA1MjM2ODg0MDk5MDk0ZSswMCwgMS4wMDYyNjM5MjU4OTA2MzZlKzAwLAotICAgIDEuMDA3MjA4OTAzNTg3NzcyZSswMCwgMS4wMDgwNTQ4OTM4MTQ2NDllKzAwLCAxLjAwODc4ODAxNjM0ODM5NGUrMDAsCi0gICAgMS4wMDkzOTE4MjIwNjAwNTBlKzAwLCAxLjAwOTg1Mjk1ODIxNzczMmUrMDAsIDEuMDEwMTU1MjkzMDExMTY2ZSswMCwKLSAgICAxLjAxMDI4NjAxODMwNDg4OWUrMDAsIDEuMDEwMjI5ODc4NzAzMzA5ZSswMCwgMS4wMDk5NzU0MDc3MzY4ODVlKzAwLAotICAgIDEuMDA5NTA4NDU1MjgwMjk0ZSswMCwgMS4wMDg4MTg0ODMxNTU5MjFlKzAwLCAxLjAwNzg5NDg4NDAwMTE5OWUrMDAsCi0gICAgMS4wMDY3Mjg3NTc4NTQxNzVlKzAwLCAxLjAwNTMwOTkxMzk4MzUzMGUrMDAsIDEuMDAzNjM0NTYwODE4OTgyZSswMCwKLSAgICAxLjAwMTY5MzYzNDc5Mjk1M2UrMDAsIDkuOTk0ODU2NjI4Njk2NzAyZS0wMSwgOS45NzAwNjM3MDIyOTE2NTJlLTAxLAotICAgIDkuOTQyNTQ2ODY4NzczOTUyZS0wMSwgOS45MTIzMTk2NzM5MzY3NjdlLTAxLCA5Ljg3OTM3MTE1MzM0MzM2OGUtMDEsCi0gICAgOS44NDM3NTEyNDY4NjEwMzRlLTAxLCA5Ljc5ODkwOTYzMzEyNzY4NGUtMDEsIDkuNzUyNjk4Nzg4NDI4NTg3ZS0wMSwKLSAgICA5LjcwMTgwNDk4MDA0MDI1M2UtMDEsIDkuNjQ1ODAwMjY4MjAzMjc4ZS0wMSwgOS41ODQyNTUzMzUxNTUyNzVlLTAxLAotICAgIDkuNTE2ODQwMTM4NDU1ODMxZS0wMSwgOS40NDMyMDIzMjIzMTUwNTBlLTAxLCA5LjM2MjkwNjI0MTY5ODc2NmUtMDEsCi0gICAgOS4yNzU4MDUwNjk0NDIzMTZlLTAxLCA5LjE4MTUzNDEzNzIzMDM1MWUtMDEsIDkuMDc5NzY1MjQwMTM4MDU3ZS0wMSwKLSAgICA4Ljk3MDUwMDU4NDc5MzEyM2UtMDEsIDguODUzNTEzNjAzODQ4MTc3ZS0wMSwgOC43Mjg1NzkyNjUwNDM5OThlLTAxLAotICAgIDguNTk1Nzk4MTg2NTA0NjIyZS0wMSwgOC40NTUwMjYxNTAzODY1NTBlLTAxLCA4LjMwNjE5OTQzMzAxNDgwMWUtMDEsCi0gICAgOC4xNDk0NjY0ODE1NzUzNDBlLTAxLCA3Ljk4NDg5Mzc3NTI5NDQwN2UtMDEsIDcuODEyNjI0NDk2NjAxNDUxZS0wMSwKLSAgICA3LjYzMjkxNzY5MjU1MDg4MWUtMDEsIDcuNDQ1OTA4NDM0MjAzODgzZS0wMSwgNy4yNTE5OTI4NzA4MDkxNjVlLTAxLAotICAgIDcuMDUxNTM2NjgzNjA4NTQ1ZS0wMSwgNi44NDQ5MDU0NDYwMzgxODVlLTAxLCA2LjYzMjQ1MjA5OTMxMzc4M2UtMDEsCi0gICAgNi40MTQ3NzE2MTY2MTgxODVlLTAxLCA2LjE5MjM1MzMzNjM1NTQxM2UtMDEsIDUuOTY1NTkxMzI1NDI3ODYwZS0wMSwKLSAgICA1LjczNTE5OTg5MzY0ODE0M2UtMDEsIDUuNTAxNzM4NTEwMjM0NTQyZS0wMSwgNS4yNjU2ODUzODIzMDAxMjdlLTAxLAotICAgIDUuMDI3ODExNTg2NjM4MDE4ZS0wMSwgNC43ODg2MDg4OTA1NjE5NzllLTAxLCA0LjU0ODc3ODk0MzQ5MDgwN2UtMDEsCi0gICAgNC4zMDg5ODEyMjg5ODk3NTdlLTAxLCA0LjA2OTkzOTY0MjA1NjI3NGUtMDEsIDMuODMyMzQwMzA1ODI3ODA3ZS0wMSwKLSAgICAzLjU5NjgwMDk4MzM0NDU1OWUtMDEsIDMuMzY0MDgxMDAwOTEzMDQwZS0wMSwgMy4xMzQ5NjQxODE1MjY0NjdlLTAxLAotICAgIDIuOTEwMTA1NjU0OTM4NzA5ZS0wMSwgMi42OTAxOTU4NTEwODc0NjNlLTAxLCAyLjQ3NTg0MzQ3NTYxODY3MmUtMDEsCi0gICAgMi4yNjc4ODQzMzM4NTE5OTJlLTAxLCAyLjA2Njc3NzcwNjUzODQ4OWUtMDEsIDEuODczMTAzNDMyMzg0MTkzZS0wMSwKLSAgICAxLjY4NzM5NjQ0MTI1MDY5MWUtMDEsIDEuNTEwMTIzODIwNTg4OTc5ZS0wMSwgMS4zNDE3MTg0MjI3OTcwODhlLTAxLAotICAgIDEuMTgyNTQ2NjIzMjU2MzUzZS0wMSwgMS4wMzI5MDczMzk3NzQ1OTZlLTAxLCA4LjkzMTE3MzYwMjcyNTUxNmUtMDIsCi0gICAgNy42MzQyOTc4NjYwNDE3NzVlLTAyLCA2LjQ0MDc3MjkxNDU4NTkwM2UtMDIsIDUuMzUyNDM3MTQ3MzkzOTMzZS0wMiwKLSAgICA0LjM3MDg0NDUyODE5OTIzMGUtMDIsIDMuNDk2NjcwOTkxNTM0MDg5ZS0wMiwgMi43Mjk4NDYyOTI2NDgyOTdlLTAyLAotICAgIDIuMDY4OTU4MDgwMzQ4NzgxZS0wMiwgMS41MTEyNTEyNTIzNTI3NTllLTAyLCAxLjA1MjI4NzUzODExODkwMGUtMDIsCi0gICAgNi44NTU0NzMxNDMxMjA3NzllLTAzLCA0LjAyMzUxMTE5MDk0MDk3NGUtMDMsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMH07Ci0KLS8vIFNlY3Rpb24gMy43LjMuMi4zIHdfNy41XzE4MCAoZDA5cjA0XyppbXBsZW1lbnRvckNvbW1lbnRzKikKLWRvdWJsZSB3X04xODBfN3A1bXNbMzYwXSA9IHsKLSAgICAxLjk3MDg0OTA3NjUxMjk5MGUtMDMsIDIuOTUwNjA4NTkzMTg3MzEzZS0wMywgNC4xMjQ0NzcyMTM0Njc5NTBlLTAzLAotICAgIDUuNTI2ODg2NjM5NDM3MzYyZS0wMywgNy4xNzU0MTEzMTY0Mzg1MTBlLTAzLCA5LjA4NzU3NzMwNDI5MTY2OWUtMDMsCi0gICAgMS4xMjgxOTEwNTE3MDM2NTZlLTAyLCAxLjM3Njk1MzczNTM3MTc1NGUtMDIsIDEuNjU2MDAyNjYxNjA1Mjk0ZS0wMiwKLSAgICAxLjk2NjUwODk0NTQ5MjMxN2UtMDIsIDIuMzA5NTM1NTY0ODc3MjY2ZS0wMiwgMi42ODYxMjg5Mzg5ODI5NzZlLTAyLAotICAgIDMuMDk2MzI1NTk3NDMxNzIwZS0wMiwgMy41NDAzNjIyOTgzMjU5OTllLTAyLCA0LjAxOTE1NjEwMTEwMDkwMWUtMDIsCi0gICAgNC41MzMzMTQwMzMzMzczMjBlLTAyLCA1LjA4Mjg5MzAzNTcxMDE1MmUtMDIsIDUuNjY4MTU0NDc4NTM0ODM5ZS0wMiwKLSAgICA2LjI4OTM1MzA0NDY0MDE1NGUtMDIsIDYuOTQ2OTYyOTI1OTUxNDczZS0wMiwgNy42NDEwNjMxMzY4MDkzMjZlLTAyLAotICAgIDguMzcxNjAwMTU2NTE5OTgyZS0wMiwgOS4xMzg4NDI3NzgxMzM0MjZlLTAyLCA5Ljk0Mjk0MDA3Njc5MjM5NWUtMDIsCi0gICAgMS4wNzgzNDcyNDk3MjMwNzRlLTAxLCAxLjE2NjA0NTc0ODI5NjIzMWUtMDEsIDEuMjU3MzY1MDI3ODY0MzQ4ZS0wMSwKLSAgICAxLjM1MjI2ODExMzM5NTk1MWUtMDEsIDEuNDUwNzM1NDU5ODM5MTk1ZS0wMSwgMS41NTI3MzgxODY2NDg3MjFlLTAxLAotICAgIDEuNjU4MjIxOTQyMzQxNDM1ZS0wMSwgMS43NjcxMTE3NDA1MzQ2MDhlLTAxLCAxLjg3OTI4Nzc1ODg0ODgxM2UtMDEsCi0gICAgMS45OTQ3MzE3OTgxODg4MDdlLTAxLCAyLjExMzQyOTUyOTU1NDgwMGUtMDEsIDIuMjM1MjQ1NTQwMzE4MDgyZS0wMSwKLSAgICAyLjM2MDAzMDk5NjUxNzk5N2UtMDEsIDIuNDg3Njg2MTQ0NTk5MTQ4ZS0wMSwgMi42MTgxMzgxMDc0ODk4OTNlLTAxLAotICAgIDIuNzUxMjkxNjA4NTQ0MzE0ZS0wMSwgMi44ODcwMTEwMTc0Njk4NTllLTAxLCAzLjAyNTE0MDMzNjMwOTk0OWUtMDEsCi0gICAgMy4xNjU1ODgwNTIzNjY0NTBlLTAxLCAzLjMwODIzODcxMTQ5OTkzOGUtMDEsIDMuNDUyOTU1NjY2NzMwOTU0ZS0wMSwKLSAgICAzLjU5OTYzOTkxNTY2MjEyN2UtMDEsIDMuNzQ4MTQ1NDQ0MDY3MjUxZS0wMSwgMy44OTgzMTgxNjU1MzIzODhlLTAxLAotICAgIDQuMDUwMDEwMDk2MDE1ODQ2ZS0wMSwgNC4yMDMwODAxMzA0NzIzMDhlLTAxLCA0LjM1NzM5NTE1Mjg1OTk2MGUtMDEsCi0gICAgNC41MTI3NzgxNzM1NDc0OTllLTAxLCA0LjY2OTA0OTE3OTY0ODczNmUtMDEsIDQuODI2MDkwNDA1NjczNDgwZS0wMSwKLSAgICA0Ljk4Mzc1NDY2MjY2NDEyM2UtMDEsIDUuMTQxODUzNDEzNTc4MzMyZS0wMSwgNS4zMDAyMTQ3ODMxMzY4MzFlLTAxLAotICAgIDUuNDU4NjkzNTE3ODg2OTk0ZS0wMSwgNS42MTcxMDA0MDY2Njk0MTNlLTAxLCA1Ljc3NTI4MTUxNDQxNzIwNGUtMDEsCi0gICAgNS45MzMwNDY5NjQyNjI1NzhlLTAxLCA2LjA5MDI2MzQ2MTUyNDM0MWUtMDEsIDYuMjQ2NzQxODg5Mzg2OTE0ZS0wMSwKLSAgICA2LjQwMjI3NTU0NzE0NjMyMmUtMDEsIDYuNTU2NzEwMTYyMTM0MDk3ZS0wMSwgNi43MDk5NTkzNDY0MzkwNzJlLTAxLAotICAgIDYuODYxODQ1NTg3OTcyNDk4ZS0wMSwgNy4wMTIxODM4NDIyOTgxODllLTAxLCA3LjE2MDc4NDQ4NTYyMjE4NGUtMDEsCi0gICAgNy4zMDc1NjA4NDE1NTA1OTFlLTAxLCA3LjQ1MjQwNjc4NzYyMjM2MmUtMDEsIDcuNTk1MTUxMjE1NzM4NzkzZS0wMSwKLSAgICA3LjczNTYxOTU1NDA4NjEyMmUtMDEsIDcuODczNjkyMDYwNDg0MzI2ZS0wMSwgOC4wMDkyMzEzNzczMDc5NzhlLTAxLAotICAgIDguMTQyMTEzODYzMTMxOTMyZS0wMSwgOC4yNzIyMzgzMzQzNjgwMzZlLTAxLCA4LjM5OTUyMzc0MTkzODA2NWUtMDEsCi0gICAgOC41MjM4NjEwMjM2MTAxMzRlLTAxLCA4LjY0NTEzNjc1MDE4ODI3N2UtMDEsIDguNzYzMjQwNzg4MzU1Mzg0ZS0wMSwKLSAgICA4Ljg3ODE0Mjg4MzkyNDc2NGUtMDEsIDguOTg5Nzc0MTQ2MTI2MjE0ZS0wMSwgOS4wOTgwMzMxODkyODEwOTJlLTAxLAotICAgIDkuMjAyODQzMTE5MjUzMDk0ZS0wMSwgOS4zMDQwNzUxNzk4NDU1MjNlLTAxLCA5LjQwMTY5NjUyMjE2NjM1NGUtMDEsCi0gICAgOS40OTU2Nzc5NDkzMDI2NDdlLTAxLCA5LjU4NTk5OTM3Mzk3NDg1MmUtMDEsIDkuNjcyNjAyNjAwMTE3ODMyZS0wMSwKLSAgICA5Ljc1NTQ1MTY1OTQxNzI1MmUtMDEsIDkuODM0NDc3MTkzNzg0MjI2ZS0wMSwgOS45MDk3MTk1NzI2MDY2MTFlLTAxLAotICAgIDkuOTgxMTkyNjg2NDQwMzg3ZS0wMSwgMS4wMDQ4ODI4MzMyODkwMjFlKzAwLCAxLjAxMTI1NzczMTE0MDEzNmUrMDAsCi0gICAgMS4wMTcyNDQzNjIxODkzODJlKzAwLCAxLjAyMjg1MzgwNzI3ODU0MWUrMDAsIDEuMDI4MDg3MzM4NzA5MTI1ZSswMCwKLSAgICAxLjAzMjkzNzA2MzI1ODgwMGUrMDAsIDEuMDM3NDA0OTQ3OTY3MDQ0ZSswMCwgMS4wNDE1MDE2NDExOTg5ODBlKzAwLAotICAgIDEuMDQ1MjMyMzU1NzMwOTQ2ZSswMCwgMS4wNDg1OTc5MTQyMDI1OTZlKzAwLCAxLjA1MTYwMzM5NTAwMjg3NGUrMDAsCi0gICAgMS4wNTQyNTUwNTAyNjg0NzhlKzAwLCAxLjA1NjU2MTg0MzQyNzQ0MGUrMDAsIDEuMDU4NTM0MDAyODIyNTA2ZSswMCwKLSAgICAxLjA2MDE3NDEzNTQwNzg3MmUrMDAsIDEuMDYxNDkzNzA2MjQzNTYyZSswMCwgMS4wNjI0OTk0MzAzMzAyMzhlKzAwLAotICAgIDEuMDYzMjA1NzcxNDcyMzM3ZSswMCwgMS4wNjM2MjU3ODM3MTY5ODBlKzAwLCAxLjA2Mzc2NDg2NTM0NDQzN2UrMDAsCi0gICAgMS4wNjM2Mzc3NzgzMzQ0NzdlKzAwLCAxLjA2MzI1OTcyNzk3Mzg3NmUrMDAsIDEuMDYyNjQ2OTUzMjQ1MDYzZSswMCwKLSAgICAxLjA2MTgwNDk2MjY5OTUxM2UrMDAsIDEuMDYwNzQ1MDQ4MzUxMTY2ZSswMCwgMS4wNTk0ODQ5MTU3Mzk1OTBlKzAwLAotICAgIDEuMDU4MDQ1MzMyNzc3NTc1ZSswMCwgMS4wNTY0MzU4OTc4OTQ1MDBlKzAwLCAxLjA1NDY2MjE3ODcxNzM4NGUrMDAsCi0gICAgMS4wNTI3NDA0NzQ0NTkyNTVlKzAwLCAxLjA1MDY5NTAwMTAxMTI2NGUrMDAsIDEuMDQ4NTM4OTM1MzU0MzEzZSswMCwKLSAgICAxLjA0NjI3ODk4MjY0ODkxN2UrMDAsIDEuMDQzOTI0MzQ1MDY4ODM5ZSswMCwgMS4wNDE0OTUzOTczODQxMzJlKzAwLAotICAgIDEuMDM5MDEwMDI2ODgwNTIyZSswMCwgMS4wMzY0NzcyNDYwMjg1ODJlKzAwLCAxLjAzMzkwNzkyODM2MTY3MmUrMDAsCi0gICAgMS4wMzEzMTk4OTM3NTQyMTVlKzAwLCAxLjAyODcyODY3MzY2NjAwM2UrMDAsIDEuMDI2MTQ4MzE5MzYyNjY1ZSswMCwKLSAgICAxLjAyMzU4OTg4MDg0MDI2OWUrMDAsIDEuMDIxMDY0ODU5OTE4MDMwZSswMCwgMS4wMTg1NjI2MTkzNzY1NTNlKzAwLAotICAgIDEuMDE2NTU3NzAzMzc1OTcyZSswMCwgMS4wMTQwMDY1ODIyNjIxNzVlKzAwLCAxLjAxMTYyOTUyNTg2MzA3OGUrMDAsCi0gICAgMS4wMDkzODU5MDE4MDA2NDVlKzAwLCAxLjAwNzI3NDU1MDEwMjkzMWUrMDAsIDEuMDA1Mjk2MTY0NTgyMjM5ZSswMCwKLSAgICAxLjAwMzQ0NTI1OTg4NzMwMmUrMDAsIDEuMDAxNzIyNDk3NDM3MTQyZSswMCwgMS4wMDAxMjc5MjQ0NjM1MzdlKzAwLAotICAgIDkuOTg2NTc1MzM0NjY5MDYyZS0wMSwgOS45NzMwOTU5MTY2NjU4MzFlLTAxLCA5Ljk2MDgzNTcxMDkyOTIxOGUtMDEsCi0gICAgOS45NDk3NjU2ODk4MTQyODVlLTAxLCA5LjkzOTg1MTU4MjYwMTY2OWUtMDEsIDkuOTMxMDc1MzAwNTIyMjE5ZS0wMSwKLSAgICA5LjkyMzQxMzA1MjMxMDUzNmUtMDEsIDkuOTE2ODMzMzQ4MDg5NTkxZS0wMSwgOS45MTEzMDA2OTYzMTQyNTllLTAxLAotICAgIDkuOTA2NzgzMjUxNjQxNzIzZS0wMSwgOS45MDMyNTMyNTAyNDkxMjZlLTAxLCA5LjkwMDY3NTYyMTgxNjAwNmUtMDEsCi0gICAgOS44OTkwMTI4MTg3MjI4OTdlLTAxLCA5Ljg5ODIyNjEyNTM3NjE1MmUtMDEsIDkuODk4Mjc4NDU0MDE2MDczZS0wMSwKLSAgICA5Ljg5OTEzMjQxMTI1OTM2OGUtMDEsIDkuOTAwNzQ3MzM5ODkzNjY3ZS0wMSwgOS45MDMwODI1NTgzODczMTRlLTAxLAotICAgIDkuOTA2MDk4NTE3ODgxMTM4ZS0wMSwgOS45MDk3NTMxNDM2ODk1OTJlLTAxLCA5LjkxNDAwMzMwNDQ2MTgyNWUtMDEsCi0gICAgOS45MTg4MDk2NjE3MDEwNzJlLTAxLCA5LjkyNDEyODUxMjI1NjUyNGUtMDEsIDkuOTI5OTE3NzkwNzU4MTE1ZS0wMSwKLSAgICA5LjkzNjEzMzgxMzg1ODExNmUtMDEsIDkuOTQyNzMxNDkzNTc4NjIzZS0wMSwgOS45NDk2Njk1Nzc4NTgwNzVlLTAxLAotICAgIDkuOTU2OTAzNzAxMTEzNjU1ZS0wMSwgOS45NjQzOTE1NzQzMTU5MDBlLTAxLCA5Ljk3MjA4NTcyMTk0ODM1NWUtMDEsCi0gICAgOS45Nzk5NDI3NDk2NzY3OTJlLTAxLCA5Ljk4NzkxNjE1NzUzNDA4NmUtMDEsIDkuOTk1OTYwNjE5NzU5ODU2ZS0wMSwKLSAgICAxLjAwMDQwNDEwMTI1NTg3N2UrMDAsIDEuMDAxMjA5ODQ2MjA1Njg3ZSswMCwgMS4wMDIwMDk3NTYwNTAzNDBlKzAwLAotICAgIDEuMDAyNzk5MjQxNjg2MjQxZSswMCwgMS4wMDM1NzM1Njc0Nzk2MTJlKzAwLCAxLjAwNDMyODI4MzE4NzIyNWUrMDAsCi0gICAgMS4wMDUwNTg1MDE4Njc2MzNlKzAwLCAxLjAwNTc1OTgzNjM2NDcyMmUrMDAsIDEuMDA2NDI3NjY5Njg5MDcxZSswMCwKLSAgICAxLjAwNzA1NzY4MjcyMzkzMWUrMDAsIDEuMDA3NjQ1MTUzNjkyODE4ZSswMCwgMS4wMDgxODU0OTIxMTczMDdlKzAwLAotICAgIDEuMDA4Njc0MjY1MzY5NjE4ZSswMCwgMS4wMDkxMDY4NzIyOTA1NDVlKzAwLCAxLjAwOTQ3OTE1ODkxOTA2MGUrMDAsCi0gICAgMS4wMDk3ODY1OTMzMTk5MzZlKzAwLCAxLjAxMDAyNDc2NDQ2NDYzOWUrMDAsIDEuMDEwMTg5NTM4Mjg5ODMxZSswMCwKLSAgICAxLjAxMDI3NjY5MDY4NDc5OGUrMDAsIDEuMDEwMjgyMDMxNjgyNzIwZSswMCwgMS4wMTAyMDE3NDI2NTExNTZlKzAwLAotICAgIDEuMDEwMDMyMDgwODM3NTA3ZSswMCwgMS4wMDk3NjkxODg3MDA1MzVlKzAwLCAxLjAwOTQwOTM4NjA3MzIwN2UrMDAsCi0gICAgMS4wMDg5NDkzMTAxMjYyNDFlKzAwLCAxLjAwODM4NjQxMjE3MzI0MGUrMDAsIDEuMDA3NzE3ODAzMDY2OTIzZSswMCwKLSAgICAxLjAwNjk0MDMwNTc5NjkxMmUrMDAsIDEuMDA2MDUxMjM4OTg0NjU2ZSswMCwgMS4wMDUwNDg3OTMyODMzNTdlKzAwLAotICAgIDEuMDAzOTMxODI3NjMwNDY4ZSswMCwgMS4wMDI2OTc2NjYxNTY5MjZlKzAwLCAxLjAwMTM0NDI3MTE3MjE1NGUrMDAsCi0gICAgOS45OTg3MjA5MTg5OTAzNzllLTAxLCA5Ljk4MjgwNDY0NDU4NDIxM2UtMDEsIDkuOTY1NjY1NjkxNzQxOTgyZS0wMSwKLSAgICA5Ljk0NzMxNzM3MDA1NjQxNWUtMDEsIDkuOTI3Nzc5ODY3OTM5Nzk4ZS0wMSwgOS45MDcwMTM3NDE4ODEwNjZlLTAxLAotICAgIDkuODg1MDQxNjUyNDQ1MjgzZS0wMSwgOS44NjE4Njg5MjE2ODk1NzJlLTAxLCA5LjgzNzExOTg4NjgzOTgzNWUtMDEsCi0gICAgOS44MDU4NDY0MzEwOTUwMTBlLTAxLCA5Ljc3NjM0MTY0MzkyMjU1NGUtMDEsIDkuNzQ0NTUwMzMxNTA3MzYzZS0wMSwKLSAgICA5LjcxMDYyOTE1NTYxMzA5MmUtMDEsIDkuNjc0NDcyNjk1NzAxMTYyZS0wMSwgOS42MzU5MzkyNjI4NzQwNzRlLTAxLAotICAgIDkuNTk0OTEzOTgzNDczMjIzZS0wMSwgOS41NTEyOTcyNTQxNjExNjdlLTAxLCA5LjUwNTAxMzI1OTEyMDc1NWUtMDEsCi0gICAgOS40NTU5MjgxMDMxNDQwMTZlLTAxLCA5LjQwMzg5ODc3NDExNTkyMmUtMDEsIDkuMzQ4ODY3NjA0MTQxMzE1ZS0wMSwKLSAgICA5LjI5MDgwNTU4NzEwNjM1MGUtMDEsIDkuMjI5NTkyNzk5NjQyOTc2ZS0wMSwgOS4xNjUwOTU3OTE5Mjg2NjdlLTAxLAotICAgIDkuMDk3MjQ0NTYwNzMzNzAyZS0wMSwgOS4wMjYwNzM0OTkzNzI2ODRlLTAxLCA4Ljk1MTU1MDgzNzU3NzE5M2UtMDEsCi0gICAgOC44NzM1NjE1NDIwODI1MDBlLTAxLCA4Ljc5MjAyNjg4NTYyOTQ4MGUtMDEsIDguNzA2OTk2OTc4NDE2Mjk0ZS0wMSwKLSAgICA4LjYxODQ3NDI0NDU3OTM1M2UtMDEsIDguNTI2NDE3NDk3MjY1NjY0ZS0wMSwgOC40MzA3NzgzMzI0MTUwMzRlLTAxLAotICAgIDguMzMxNTQ5MDQ2ODA1MzE1ZS0wMSwgOC4yMjg4MTI3MTYxNjMxMDZlLTAxLCA4LjEyMjU3NTk2OTE5NzA5MWUtMDEsCi0gICAgOC4wMTI4NTQzOTI0MzQ3MTBlLTAxLCA3Ljg5OTcxNzE1MTcxNTc3NGUtMDEsIDcuNzgzMTgxNzcxNzI0NjQ0ZS0wMSwKLSAgICA3LjY2MzM3NzEwNDExNjM4NWUtMDEsIDcuNTQwMzAzMjc2NzA2MzU3ZS0wMSwgNy40MTQwNzk5MDk0NTc1NjdlLTAxLAotICAgIDcuMjg0Nzc1MDA4MDM1MzkwZS0wMSwgNy4xNTI1NTc0MTczMjg0NjVlLTAxLCA3LjAxNzUxNzM5NDU3MTU5MmUtMDEsCi0gICAgNi44Nzk3NTYzMTgxMTgxMTNlLTAxLCA2LjczOTM2OTExMjQwOTA3M2UtMDEsIDYuNTk2NTI1NzMyMDEzMDk1ZS0wMSwKLSAgICA2LjQ1MTM5NDg5MDY2ODM5MmUtMDEsIDYuMzA0MTQ3MTYyMjkyNDQ1ZS0wMSwgNi4xNTQ4MzYyMTkyNzE2NTRlLTAxLAotICAgIDYuMDAzNjU4NTE5NDEzOTg0ZS0wMSwgNS44NTA3ODg1NzkwODQ2NzRlLTAxLCA1LjY5NjQ5NTM2NDU2NDA0OWUtMDEsCi0gICAgNS41NDA4NDgwOTgzMTIzNDNlLTAxLCA1LjM4Mzk4NTE4Mjk2NjE5OGUtMDEsIDUuMjI2MTQ3Mzc3NTM3NTExZS0wMSwKLSAgICA1LjA2NzU2ODA0OTY2Mjk1NGUtMDEsIDQuOTA4MzM3NTMxNzMyNzI2ZS0wMSwgNC43NDg2NjAzMjY1MjUyNzBlLTAxLAotICAgIDQuNTg4NzY1NjU4MTA4MTMwZS0wMSwgNC40Mjg4NTgyMzI1NzM3MTZlLTAxLCA0LjI2OTA2NTM5MjMwMDMzMGUtMDEsCi0gICAgNC4xMDk3MDk3MzM5MTQ4NzJlLTAxLCAzLjk1MDkxMDI0MDUzNzU0MGUtMDEsIDMuNzkyOTEzMjcwMTcwODI4ZS0wMSwKLSAgICAzLjYzNTg3NDE2OTg1ODYzMWUtMDEsIDMuNDgwMDQzNDMxOTg1MDk0ZS0wMSwgMy4zMjU2MzIwMDYxNzU0NTdlLTAxLAotICAgIDMuMTcyODc0ODQ4ODIzNDEyZS0wMSwgMy4wMjE5NjcxMDI0MDk0NjVlLTAxLCAyLjg3MzA5NDAyNTc1NDcxMWUtMDEsCi0gICAgMi43MjY0Mzk5MTYwMDM4NjBlLTAxLCAyLjU4MjI3NDMwNTgwNTI3N2UtMDEsIDIuNDQwNzI4NTYxNzQwMTI5ZS0wMSwKLSAgICAyLjMwMjA4OTc3MzgyMzQ2OWUtMDEsIDIuMTY2NDE0MTY0Mzg5MDEwZS0wMSwgMi4wMzM5ODQ4MDY4OTcwNTJlLTAxLAotICAgIDEuOTA0ODYxNjE1NDYzOTQxZS0wMSwgMS43NzkyMjEyMTUyMDExNDZlLTAxLCAxLjY1NzI2Njc0NDgzNTg4N2UtMDEsCi0gICAgMS41MzkwNjM5NjY3OTk4NTVlLTAxLCAxLjQyNDgwNTQ3MTI4NzY3MWUtMDEsIDEuMzE0NTM5ODAxMDExNTgzZS0wMSwKLSAgICAxLjIwODQxNzc4MjM4MDk0OWUtMDEsIDEuMTA2NTIxOTQzMzUzNzE2ZS0wMSwgMS4wMDg5MTczNDE5MzYyMjJlLTAxLAotICAgIDkuMTU3MTg4NTA4NjQ3NTQyZS0wMiwgOC4yNjk5NTk2Njk1MjgyODdlLTAyLCA3LjQyODE1NTI4ODg2MjY3N2UtMDIsCi0gICAgNi42MzI0MjM4MTUzMzE3MjBlLTAyLCA1Ljg4MzM0NTE2MjAxMzEyM2UtMDIsIDUuMTgxNDA2NzYyMzc3OTUzZS0wMiwKLSAgICA0LjUyNjk4MzQ1NTY1MTA3NmUtMDIsIDMuOTIwMzA4NDg0NTQ1NjQzZS0wMiwgMy4zNjE0NDE1OTQyMTQxMTBlLTAyLAotICAgIDIuODUwMjMzMDgxNTYyODU5ZS0wMiwgMi4zODYyOTEwNzQ0Nzk0MTVlLTAyLCAxLjk2ODk0MjI2NTUzMTc4M2UtMDIsCi0gICAgMS41OTcyMDUyNzAyNDA4NjBlLTAyLCAxLjI2OTc2MjIzNDI0NjI0N2UtMDIsIDkuODQ5Mzc3Mzk0NDY0NTUyZS0wMywKLSAgICA3LjQwNzI0NDYzMjk5ODM1NWUtMDMsIDUuMzU2NjUzNjEwMjE1OTg1ZS0wMywgMy44MzIyNjU1MTg3NDY5MTRlLTAzLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMH07Ci0KLS8vIFNlY3Rpb24gMy43LjMuMi40IHdfNy41XzI0MCAoZDA5cjA0XyppbXBsZW1lbnRvckNvbW1lbnRzKikKLWRvdWJsZSB3X04yNDBfN3A1bXNbNDgwXSA9IHsKLSAgICAxLjg0ODMzMDM3MDYwMTg5MGUtMDMsIDIuNTY0ODE4Mzk0NDMwNTQxZS0wMywgMy4zNjc2MjExNzUyNTU3NjJlLTAzLAotICAgIDQuMjg3MzY2MTcyOTQ3MDIwZS0wMywgNS4zMzgzMDE0MjkxMzE0NzllLTAzLCA2LjUyNjc5MjIyOTgwNDQ0NmUtMDMsCi0gICAgNy44NjExMjU4NzI3NDQ5NjNlLTAzLCA5LjM0NjI4MTc5MzI5NDE2OGUtMDMsIDEuMDk5MTY4Njc3MDczMDIzZS0wMiwKLSAgICAxLjI4MDExMTcyNDMyNzU4N2UtMDIsIDEuNDc4MDU5MTA1MjYyNTg4ZS0wMiwgMS42OTMwNzA0MzA3NTA3NDdlLTAyLAotICAgIDEuOTI1OTIzMDcwNDA5MDE3ZS0wMiwgMi4xNzY5NjkzNzIxMDEwOTJlLTAyLCAyLjQ0Njg1OTgyNjE0NDY1MWUtMDIsCi0gICAgMi43MzU1NjU0MjczODU4OTZlLTAyLCAzLjA0MzE5MjMwMjU3NjM3OGUtMDIsIDMuMzY5ODA0NjM5MDA2NjMyZS0wMiwKLSAgICAzLjcxNTgzNTc3MjU1MTU3NGUtMDIsIDQuMDgxNDgxNzk1MjA3NTQ2ZS0wMiwgNC40NjcwODA2ODQyMzQ3MzllLTAyLAotICAgIDQuODcyNjI5OTUyNjI1NjE5ZS0wMiwgNS4yOTgyMDYzMjU0NDE1NTFlLTAyLCA1Ljc0MzgyNDY5NjY2NDg0OGUtMDIsCi0gICAgNi4yMDk2ODU3OTg3NTIyMzVlLTAyLCA2LjY5NjA5NzY2NjA4NTI5M2UtMDIsIDcuMjAyOTgzNjM2Nzg5ODE4ZS0wMiwKLSAgICA3LjczMDM5MTQ2NDc3MTM2NmUtMDIsIDguMjc4MjU1NzQwOTUzNjIwZS0wMiwgOC44NDY4MjEwMTU5MzE3MzFlLTAyLAotICAgIDkuNDM2MDc1NjY0NTE4NDQ5ZS0wMiwgMS4wMDQ2MDI3MjAwMzYwMDJlLTAxLCAxLjA2NzYzODIzNzUwNDUxNWUtMDEsCi0gICAgMS4xMzI3MzY3OTQ0MDYxMDNlLTAxLCAxLjE5OTg2NDIwMjczMDEwMWUtMDEsIDEuMjY5MDM1MjA2ODA1ODU2ZS0wMSwKLSAgICAxLjM0MDIwODUzMTI3Nzc3NGUtMDEsIDEuNDEzMzk1NTY4NzAxMjc3ZS0wMSwgMS40ODg1NzIxMTI4ODk3MjBlLTAxLAotICAgIDEuNTY1NzM2ODUzMzgxMjU1ZS0wMSwgMS42NDQ4NDYyMjA1NjM1NzFlLTAxLCAxLjcyNTg5MDc2NTM4MTQzM2UtMDEsCi0gICAgMS44MDg3OTA4OTgyMDQ3MTNlLTAxLCAxLjg5MzU0MzE5NjAwNjg0NmUtMDEsIDEuOTgwMTIyNDM1Mjg0MDE4ZS0wMSwKLSAgICAyLjA2ODU0MTQwOTk0NjQyMGUtMDEsIDIuMTU4NzUzMTg3NTcwNTM4ZS0wMSwgMi4yNTA2ODY3MjM3MDgxMzBlLTAxLAotICAgIDIuMzQ0Mjc0MDcyNDk5NjkwZS0wMSwgMi40Mzk0ODMxMzcxMDUxNTNlLTAxLCAyLjUzNjI3OTkyODM3ODA1NmUtMDEsCi0gICAgMi42MzQ2NDA2MDk4NzkzMzNlLTAxLCAyLjczNDUwNDk0NDc4MTM3MGUtMDEsIDIuODM1ODIxODg5ODY1MDk4ZS0wMSwKLSAgICAyLjkzODUzNDY5NDc4NjU3MmUtMDEsIDMuMDQyNTczNzM0NjE1NjMyZS0wMSwgMy4xNDc5MDkxNDAxMTMzMTBlLTAxLAotICAgIDMuMjU0NDkxMjM0MjY5NTA0ZS0wMSwgMy4zNjIyNzQwOTY2MTgwMjZlLTAxLCAzLjQ3MTE4NzYwMjkwNzA2NWUtMDEsCi0gICAgMy41ODEyMDE3Njk2MDQ0OTVlLTAxLCAzLjY5MjI0NjYzMzc4MzM3MWUtMDEsIDMuODA0Mjc3OTI4NzEyNzk2ZS0wMSwKLSAgICAzLjkxNzIwMDIyNzQxNjE3OWUtMDEsIDQuMDMwOTcwMjIxNTQ4MzY1ZS0wMSwgNC4xNDU1MTk1NTIxNjg2ODdlLTAxLAotICAgIDQuMjYwODE3MTg2MTI0MjM5ZS0wMSwgNC4zNzY3NjMxODQ4MTY4MjNlLTAxLCA0LjQ5MzMwMTk1NjU3MjM1MGUtMDEsCi0gICAgNC42MTAzNDg1NTAzOTMwNjdlLTAxLCA0LjcyNzg2MDQzMjgyODI4OWUtMDEsIDQuODQ1NzY3NzcxNzg3MzY4ZS0wMSwKLSAgICA0Ljk2NDAxNzA2NzY2NTE5NmUtMDEsIDUuMDgyNTI0NTc1NTY0OTQ3ZS0wMSwgNS4yMDEyMjA3ODQ4Mzk2NTFlLTAxLAotICAgIDUuMzIwMDIwNzcwMDA1NDE3ZS0wMSwgNS40Mzg4ODA4OTc0NDE1NThlLTAxLCA1LjU1NzcxNjAxMTgxMTM1N2UtMDEsCi0gICAgNS42NzY0NTczODc3NDY4MjllLTAxLCA1Ljc5NTAyNzg2MzE1MDEyMWUtMDEsIDUuOTEzMzUwMzQ1OTI3ODU2ZS0wMSwKLSAgICA2LjAzMTM4MzY3NDczNDQwMGUtMDEsIDYuMTQ5MDQxNzE2ODU5ODA4ZS0wMSwgNi4yNjYyMzk0MTEwNTYwMTRlLTAxLAotICAgIDYuMzgyODg4MzQ0MjUyMDIxZS0wMSwgNi40OTg5MzM3NDc3Njc3MTllLTAxLCA2LjYxNDMyMzYwMTUwMTczMWUtMDEsCi0gICAgNi43MjkwMjUxMzkwNjM0NzhlLTAxLCA2Ljg0MjkzNzQ5ODMzNDQ5MWUtMDEsIDYuOTU2MDA0NTk1MzU4ODI2ZS0wMSwKLSAgICA3LjA2ODExNzgzNjQ4OTc1NmUtMDEsIDcuMTc5MjM0MjQ1MTkyMzMwZS0wMSwgNy4yODkzMTM4NTcyNzI4OTBlLTAxLAotICAgIDcuMzk4MzI3NzI3OTczNTk2ZS0wMSwgNy41MDYxODk4MjM3MTkzMjhlLTAxLCA3LjYxMjg0MDUzNDE3NzU1MmUtMDEsCi0gICAgNy43MTgxODkxODcwMTYyNDRlLTAxLCA3LjgyMjIwOTkxOTYzOTkyMmUtMDEsIDcuOTI0ODEzMzA0NTUxMjAzZS0wMSwKLSAgICA4LjAyNTk5NDQ3NzIzMDQ2M2UtMDEsIDguMTI1NjUyMjk1MDE5MDgzZS0wMSwgOC4yMjM3NzEyODkyMDA4ODVlLTAxLAotICAgIDguMzIwMzA1MTgzNzQ5MTk5ZS0wMSwgOC40MTUyMzIwNzY3NDUxMzNlLTAxLCA4LjUwODQ4MzEyOTQ4MzEzOGUtMDEsCi0gICAgOC42MDAwMjQxMTc4MTk1MjJlLTAxLCA4LjY4OTc5ODgwODI1MTA1NGUtMDEsIDguNzc3NzgzNDY3Mjk0ODcwZS0wMSwKLSAgICA4Ljg2Mzk1OTAzOTU1ODM0NWUtMDEsIDguOTQ4Mjk0MjA3OTEwODA3ZS0wMSwgOS4wMzA3NzYyNTY2MDI4OTJlLTAxLAotICAgIDkuMTExMzI2NTIxNTU2MTgwZS0wMSwgOS4xODk5MzU4NTM2NDkzNzFlLTAxLCA5LjI2NjUyOTM2OTMzNjU2N2UtMDEsCi0gICAgOS4zNDExMTQyMDQxNjUxNjhlLTAxLCA5LjQxMzY0MzQ0MjkyODk5M2UtMDEsIDkuNDg0MTI5NjczNzA5ODg5ZS0wMSwKLSAgICA5LjU1MjU1NjI5NTk3MzkzNmUtMDEsIDkuNjE4OTIwMTMxMzc4Njc4ZS0wMSwgOS42ODMxNjM2MjkwODY3NzJlLTAxLAotICAgIDkuNzQ1MzAxNTYzNjIxMTkxZS0wMSwgOS44MDUyODMzODE0MTcyNTZlLTAxLCA5Ljg2MzEzOTI3NzY3MjkzOGUtMDEsCi0gICAgOS45MTg4NjA0ODYxOTg5MjhlLTAxLCA5Ljk3MjQ2MzQ0NzY2NDAxNGUtMDEsIDEuMDAyMzkxODk2NjQ0NTc4ZSswMCwKLSAgICAxLjAwNzMxOTQ2NDM3NTgyN2UrMDAsIDEuMDEyMDI3MDczNDM1ODUwZSswMCwgMS4wMTY1MTY1NDE1MTIzOTNlKzAwLAotICAgIDEuMDIwNzk0MzAyNjg4Njk5ZSswMCwgMS4wMjQ4NjA4MTU3OTQ0OTBlKzAwLCAxLjAyODcxNDcwNTgwOTc0OWUrMDAsCi0gICAgMS4wMzIzNTE3MDI3MTkxNzRlKzAwLCAxLjAzNTc3Mzc1MDQ3MjgyMmUrMDAsIDEuMDM4OTg0MzE1MDc0MDA2ZSswMCwKLSAgICAxLjA0MTk4Nzg1NTM5ODkxMWUrMDAsIDEuMDQ0Nzg1NjQzNTczMzU2ZSswMCwgMS4wNDczNzgxODQxMjE5OTdlKzAwLAotICAgIDEuMDQ5NzY3NDMxNDk1MjExZSswMCwgMS4wNTE5NTQwNDU1NDMxNDNlKzAwLCAxLjA1Mzk0Mjg5ODU2MjE2MGUrMDAsCi0gICAgMS4wNTU3MzQ2MzE0NzM3OTZlKzAwLCAxLjA1NzM0MTc2NzMyMzk4M2UrMDAsIDEuMDU4NzU3MjY0OTM4NzE2ZSswMCwKLSAgICAxLjA1OTk4Njc0NDQ3MzcxNGUrMDAsIDEuMDYxMDM2NzE2ODcwNjg3ZSswMCwgMS4wNjE5MDY1MTA4NDQ0OTZlKzAwLAotICAgIDEuMDYyNjAzNjk0OTA2Mzc3ZSswMCwgMS4wNjMxMzI4OTMyOTI1NzJlKzAwLCAxLjA2MzUwMjM3Mzk0MTA1M2UrMDAsCi0gICAgMS4wNjM3MDk4MDgwNjE4OTFlKzAwLCAxLjA2Mzc2MzIyMzQ2MTg5M2UrMDAsIDEuMDYzNjY3NjQ2MDQ2MTcyZSswMCwKLSAgICAxLjA2MzQzMDExODE4NzAyMWUrMDAsIDEuMDYzMDU2NTY0Mzg1NjY2ZSswMCwgMS4wNjI1NTQyMTAzNjg4OThlKzAwLAotICAgIDEuMDYxOTIyMzQ2NjY0MzY0ZSswMCwgMS4wNjExNjcwMTc3ODMyMzFlKzAwLCAxLjA2MDI5NDY4OTIzNDU3M2UrMDAsCi0gICAgMS4wNTkzMTQ2ODk0OTM3NDVlKzAwLCAxLjA1ODIzNDY0NzMwMzc2OGUrMDAsIDEuMDU3MDU4OTA3NTI3NTM1ZSswMCwKLSAgICAxLjA1NTc4OTQ4MjQ3MzY1NmUrMDAsIDEuMDU0NDI5Nzg2ODY2NTYwZSswMCwgMS4wNTI5ODc5MjU5MDI3MTRlKzAwLAotICAgIDEuMDUxNDc1MDUxNjQ1MzQ0ZSswMCwgMS4wNDk4OTkzMDA1MzMyMjhlKzAwLCAxLjA0ODI2MjEyOTQ5NTc3NmUrMDAsCi0gICAgMS4wNDY1NjY5MDYwMTU1NzhlKzAwLCAxLjA0NDgxNjk5MjY0MjM5MWUrMDAsIDEuMDQzMDIxMjQ5MTk2MjAwZSswMCwKLSAgICAxLjA0MTE4NzY4MDkwNzQ4OGUrMDAsIDEuMDM5MzIzMzkxMDI1NDc2ZSswMCwgMS4wMzc0MzE2ODQxNjUwODNlKzAwLAotICAgIDEuMDM1NTE3NTczMzExMjY1ZSswMCwgMS4wMzM1ODUxMDU5ODk3MTJlKzAwLCAxLjAzMTY0MzcwODU0MzAyOGUrMDAsCi0gICAgMS4wMjk2OTk1NDU5NzcyNzllKzAwLCAxLjAyNzc1OTQzODUxNzg1NmUrMDAsIDEuMDI1ODI3MTg3MDM3MTEyZSswMCwKLSAgICAxLjAyMzkwNzkxMDg4NjYyNmUrMDAsIDEuMDIyMDA4MDUwNjg1NTI5ZSswMCwgMS4wMjAxMzkxMDEyMDcwMTZlKzAwLAotICAgIDEuMDE4MjYzMTAwODEzMzgwZSswMCwgMS4wMTY4NzkwMTA4NDk5ODFlKzAwLCAxLjAxNDkyMTk0ODE4NzU5M2UrMDAsCi0gICAgMS4wMTMwOTY2MjMzNjk0NThlKzAwLCAxLjAxMTM0MjA1MjQ0MDgxOGUrMDAsIDEuMDA5NjU5MTIyOTYwNTM0ZSswMCwKLSAgICAxLjAwODA1MDM2Mzg4NjcxN2UrMDAsIDEuMDA2NTE3NTQwMjUwOTg4ZSswMCwgMS4wMDUwNTc5OTI1MTczMDZlKzAwLAotICAgIDEuMDAzNjY5NTYwOTA0MjkzZSswMCwgMS4wMDIzNTMyNzMwOTI1NjJlKzAwLCAxLjAwMTEwOTgwODQ0NzExNGUrMDAsCi0gICAgOS45OTkzNzUyMzA2NDAyMDRlLTAxLCA5Ljk4ODM0NTIzNzc4MzUzNmUtMDEsIDkuOTc4MDA2MDU5MjY4NTkyZS0wMSwKLSAgICA5Ljk2ODM1NzU1ODQ3MzcwNmUtMDEsIDkuOTU5Mzg4ODExNTY4NjQwZS0wMSwgOS45NTEwODQ1ODk1NTU1MDFlLTAxLAotICAgIDkuOTQzNDM0MTEwOTAzMzE1ZS0wMSwgOS45MzY0MjkyMTE5ODE5ODNlLTAxLCA5LjkzMDA1ODMyNDI3MDkwNGUtMDEsCi0gICAgOS45MjQzMDk4Mzc3NzAzODZlLTAxLCA5LjkxOTE3NDkyNjQwMzI4MmUtMDEsIDkuOTE0NjM4OTgwMTQ3Mjk4ZS0wMSwKLSAgICA5LjkxMDY4MjEzOTU3Mjk2N2UtMDEsIDkuOTA3MjkyMTg0NDg4MDA5ZS0wMSwgOS45MDQ0NjIyNDU2NDQyMTNlLTAxLAotICAgIDkuOTAyMTc4MTg1NTE4NTAzZS0wMSwgOS45MDA0MTk2MzA2NjcxMThlLTAxLCA5Ljg5OTE3MDg1MjYwMDAwNGUtMDEsCi0gICAgOS44OTg0MTk3NDY5ODk0OTFlLTAxLCA5Ljg5ODE1MDQ4MjkzNzg0N2UtMDEsIDkuODk4MzQzMjkxMzcxNjAwZS0wMSwKLSAgICA5Ljg5ODk4MjEwNzI0NzIyNGUtMDEsIDkuOTAwMDU0MDMwNjA1NzQ2ZS0wMSwgOS45MDE1NDE4OTI2Mzg2NzNlLTAxLAotICAgIDkuOTAzNDI0MjY5MTk1MzAyZS0wMSwgOS45MDU2ODQ1ODk5MTA4NDRlLTAxLCA5LjkwODMwOTUyNzQxMzQ3OWUtMDEsCi0gICAgOS45MTEyODAzNzkyNzE5MDFlLTAxLCA5LjkxNDU3NTY1Njg0MjkwNGUtMDEsIDkuOTE4MTc4ODA5Mjc0Njc1ZS0wMSwKLSAgICA5LjkyMjA3NTU4OTcxOTc5M2UtMDEsIDkuOTI2MjQ3NTcyOTkyODAxZS0wMSwgOS45MzA2NzM1ODQxMjM2NDdlLTAxLAotICAgIDkuOTM1MzMzOTgyNzk1NDc1ZS0wMSwgOS45NDAyMTQxMDA2NjAwMzllLTAxLCA5Ljk0NTI5Njg1MTMzNzcxN2UtMDEsCi0gICAgOS45NTA1NTk2MzYxODExNzhlLTAxLCA5Ljk1NTk4MzUwNTQzNDczNmUtMDEsIDkuOTYxNTU1ODAxMDQyMTg2ZS0wMSwKLSAgICA5Ljk2NzI1NjI2Nzc2OTIyM2UtMDEsIDkuOTczMDYwOTIyMDgzMzE5ZS0wMSwgOS45Nzg5NTIxMzg1NDI4NzZlLTAxLAotICAgIDkuOTg0OTE0NDA2MzE5MjA5ZS0wMSwgOS45OTA5Mjg4OTk4Nzc3OTJlLTAxLCA5Ljk5Njk3MDYyNTc1NjgyOGUtMDEsCi0gICAgMS4wMDAzMDMwMjkyMjMyMTBlKzAwLCAxLjAwMDkwNzkzMzYwNzg4N2UrMDAsIDEuMDAxNTEwODM4NTU3NzM5ZSswMCwKLSAgICAxLjAwMjEwOTIyNTYxNDU2NGUrMDAsIDEuMDAyNzAxMTg0NTMzNzMwZSswMCwgMS4wMDMyODUxMjk5NjQ2NjhlKzAwLAotICAgIDEuMDAzODU5MjU2NDk4MjQ2ZSswMCwgMS4wMDQ0MjExMDk2MzEzMzJlKzAwLCAxLjAwNDk2ODYwMTMyNzYxM2UrMDAsCi0gICAgMS4wMDU1MDA0MDM4MDY5NDRlKzAwLCAxLjAwNjAxNDU0ODQ1MjgzNGUrMDAsIDEuMDA2NTA4NjkwODMxNzgzZSswMCwKLSAgICAxLjAwNjk4MTAzODYyNjM0MWUrMDAsIDEuMDA3NDMwMDQxMDU2NzkwZSswMCwgMS4wMDc4NTM2NDAwNTUwMDVlKzAwLAotICAgIDEuMDA4MjQ5NjE4NDMyODUzZSswMCwgMS4wMDg2MTYwMzYyMzkzNDZlKzAwLCAxLjAwODk1MTM3ODM2MjEzOGUrMDAsCi0gICAgMS4wMDkyNTM4OTY2NzQ1ODhlKzAwLCAxLjAwOTUyMTM0MTkzNTg0NGUrMDAsIDEuMDA5NzUxNzUxMzMxNjE3ZSswMCwKLSAgICAxLjAwOTk0MzcxNDY2ODc3NmUrMDAsIDEuMDEwMDk1NDk3MzY2NTA3ZSswMCwgMS4wMTAyMDQ4NzY3OTAxOTJlKzAwLAotICAgIDEuMDEwMjcwMDczMDQ1MTU0ZSswMCwgMS4wMTAyODk3NTIzMzY4MzVlKzAwLCAxLjAxMDI2MjI2OTY5NjI3MmUrMDAsCi0gICAgMS4wMTAxODU2MTU0MzE5NzVlKzAwLCAxLjAxMDA1ODE5NjgyODc5MmUrMDAsIDEuMDA5ODc4ODE3ODM2NzIyZSswMCwKLSAgICAxLjAwOTY0NTkzMDQ4OTM0MWUrMDAsIDEuMDA5MzU3NTMzMTk3MzMwZSswMCwgMS4wMDkwMTIyODE4MTU2MzdlKzAwLAotICAgIDEuMDA4NjA5NTk0MzYwNzg2ZSswMCwgMS4wMDgxNDgzNjY1OTI2MjZlKzAwLCAxLjAwNzYyNjc0MzE2NTcxMWUrMDAsCi0gICAgMS4wMDcwNDM0MzA1MDYxNThlKzAwLCAxLjAwNjM5Nzc0OTgwMTQ0NGUrMDAsIDEuMDA1Njg4NzY3OTMxMjU4ZSswMCwKLSAgICAxLjAwNDkxNTU4NTgzNDMxNmUrMDAsIDEuMDA0MDc3Njc4NzgxMjcxZSswMCwgMS4wMDMxNzQyODgzNzYwNjJlKzAwLAotICAgIDEuMDAyMjA0MjQyMDcwMDg2ZSswMCwgMS4wMDExNjY4MzYxNDE0MjRlKzAwLCAxLjAwMDA2MjQ4MDgzOTU5MWUrMDAsCi0gICAgOS45ODg5MTQyMTg2MjI2NzJlLTAxLCA5Ljk3NjUyMjUxODAwMTA0OGUtMDEsIDkuOTYzNDM4NTU1NDA0NzYyZS0wMSwKLSAgICA5Ljk0OTY3NDYyMDIyMTI5NmUtMDEsIDkuOTM1MjQ2NjMwMTg0MjgyZS0wMSwgOS45MjAxMzkyNjkwNzcwMTZlLTAxLAotICAgIDkuOTA0MzMyODMxMzQwMDMwZS0wMSwgOS44ODc4NTE0NzAwOTkxMTZlLTAxLCA5Ljg3MDcyNjgwODYwNDg5NGUtMDEsCi0gICAgOS44NTI5NzQ0MjYxMTk3NjRlLTAxLCA5LjgzNDAxMTYxMTMxMzc5NWUtMDEsIDkuODA5NDk0MTc3NjU1NTA4ZS0wMSwKLSAgICA5Ljc4NzgyNzI5MDQ0NjM1M2UtMDEsIDkuNzY0NjgyMzgzNDkwNDQxZS0wMSwgOS43NDA0Mjg1MDIwMDcxMDZlLTAxLAotICAgIDkuNzE0OTg4NDgyNzk3ODY5ZS0wMSwgOS42ODgyOTk2NzkwMTc1NzhlLTAxLCA5LjY2MDMwOTczOTI3ODkzOGUtMDEsCi0gICAgOS42MzA5NTEwMzg2NTExNDRlLTAxLCA5LjYwMDE4MTk3Njg5ODgxMmUtMDEsIDkuNTY3OTU3Mzg0MDQ2Nzg2ZS0wMSwKLSAgICA5LjUzNDI2MjY2Njk2MjM1M2UtMDEsIDkuNDk5MDM0ODIzMDM5NjMyZS0wMSwgOS40NjIyMjExNTE2ODQxMzllLTAxLAotICAgIDkuNDIzNzU4MTk1MDI2MzkwZS0wMSwgOS4zODM2MTcwMTUxNDM0NTJlLTAxLCA5LjM0MTc3Nzk3ODYzMTE5NGUtMDEsCi0gICAgOS4yOTgyMzEyMzkwODg3NjJlLTAxLCA5LjI1MjkyMzE5NTA0NjcyMWUtMDEsIDkuMjA1ODAxMjAwNjYxMTA3ZS0wMSwKLSAgICA5LjE1Njc5NzkyOTY4MjAwMWUtMDEsIDkuMTA1OTA2MDQyOTM4MjY3ZS0wMSwgOS4wNTMxNTAzMDE1ODcwOTFlLTAxLAotICAgIDguOTk4NTI3NTYxMDcxOTU0ZS0wMSwgOC45NDE5OTQ5NzExODQ5MzFlLTAxLCA4Ljg4MzUwMTUyNDI3OTMzMmUtMDEsCi0gICAgOC44MjMwMTYzMTMzNzQ5ODFlLTAxLCA4Ljc2MDU0ODc0MTUyNTI0OWUtMDEsIDguNjk2MTIzODQ5NDA3MDU1ZS0wMSwKLSAgICA4LjYyOTcyNzk5MzI5Njk3M2UtMDEsIDguNTYxMzUxOTc1NzQ5MTk4ZS0wMSwgOC40OTA5ODE3ODYwNzMxMjBlLTAxLAotICAgIDguNDE4NTcwMjQzNDIxMTE2ZS0wMSwgOC4zNDQxNDA1NTAxOTExMDVlLTAxLCA4LjI2Nzc0NjE2ODc1MjM5M2UtMDEsCi0gICAgOC4xODkzOTI0NDAyNjg2MTFlLTAxLCA4LjEwOTA0ODkxNDg3MjkzNmUtMDEsIDguMDI2NzUzMTg0NTA2MTkxZS0wMSwKLSAgICA3Ljk0MjUzNzUwNTI1ODI5NWUtMDEsIDcuODU2NDE2NjE1OTIwNTE2ZS0wMSwgNy43NjgzODYwODY2MTc0MjFlLTAxLAotICAgIDcuNjc4NTMxOTMyNTYwNzEzZS0wMSwgNy41ODY4NTE4MDY3MDU3MzhlLTAxLCA3LjQ5MzMwNjU3NzEzMzYyMGUtMDEsCi0gICAgNy4zOTgwOTE3MTE1NTA1MDNlLTAxLCA3LjMwMTA5OTQ0MzU3Nzc0N2UtMDEsIDcuMjAyNDc3ODA2MjAxMDE0ZS0wMSwKLSAgICA3LjEwMjI0MTYwOTkwMTYzOGUtMDEsIDcuMDAwNDQzMjU4NDYxNTA2ZS0wMSwgNi44OTcxMTg4OTU0MDQ5MjllLTAxLAotICAgIDYuNzkyMzExNTQxMDQ2NjI4ZS0wMSwgNi42ODYwODE3ODkyNDczOTFlLTAxLCA2LjU3ODUwOTk2Nzg0MjQ5NmUtMDEsCi0gICAgNi40Njk2NTcxODIzMzY1MTZlLTAxLCA2LjM1OTU5NjE2NjIyNzQ0NGUtMDEsIDYuMjQ4NDAzMzU4OTkxNjA3ZS0wMSwKLSAgICA2LjEzNjAzNTAyNjc5MTAwMmUtMDEsIDYuMDIyNjUwOTA2NDIxODg0ZS0wMSwgNS45MDgyOTA4MzM3MzI4MjNlLTAxLAotICAgIDUuNzkzMDk0MDc5NDMwNTYxZS0wMSwgNS42NzcxMTEyNDAwMjA5MDdlLTAxLCA1LjU2MDM3NDE1Njc1MTQyOWUtMDEsCi0gICAgNS40NDI5MzY2NDM0OTI2MjBlLTAxLCA1LjMyNDg5NzY4MDUzNjQ4MGUtMDEsIDUuMjA2MzYwODQxMTM2MjU1ZS0wMSwKLSAgICA1LjA4NzQzMjcyNzY4MDQwMGUtMDEsIDQuOTY4MTExNjYwNDEzNjUzZS0wMSwgNC44NDg0OTg4MDcwODkzNjRlLTAxLAotICAgIDQuNzI4NjgxMDczNjUwMzEwZS0wMSwgNC42MDg3NTkxODM3OTQ4ODVlLTAxLCA0LjQ4ODgxMDgwNjMyNzAxOGUtMDEsCi0gICAgNC4zNjg5MTAzODc3Mjc1MTJlLTAxLCA0LjI0OTEyMDIyMzUwNzgyNmUtMDEsIDQuMTI5NjA2MDMxNjQxNjg3ZS0wMSwKLSAgICA0LjAxMDM1ODk2Mjg3NzA0NGUtMDEsIDMuODkxNTc4NjY3NDQ5Mzc1ZS0wMSwgMy43NzMyMjE5ODgxMTY3MzVlLTAxLAotICAgIDMuNjU1NDM3NjY4NjMwMDEyZS0wMSwgMy41MzgzMjM1NjQyNTA2NjdlLTAxLCAzLjQyMTk2MTE1NDMzOTgzN2UtMDEsCi0gICAgMy4zMDY0NDgyMDEwODY4MzRlLTAxLCAzLjE5MTg3NTU4OTg5ODcxMmUtMDEsIDMuMDc4MzMzMDkzMzkxOTAxZS0wMSwKLSAgICAyLjk2NTg4MTgxNjUxNjQ1NGUtMDEsIDIuODU0NjM3MTY1MzYwMjIxZS0wMSwgMi43NDQ2MjQwODg1Nzc2MzRlLTAxLAotICAgIDIuNjM2MDk1ODQ0NzY4ODk5ZS0wMSwgMi41Mjg4MzEwMTE0MzMyMjZlLTAxLCAyLjQyMzIzNDg4OTcxMTgyMWUtMDEsCi0gICAgMi4zMTkyNTc0NjI4NDE2OTdlLTAxLCAyLjIxNjkwODM3MzY5NTgzM2UtMDEsIDIuMTE2MzgwNTc2OTUwMzA3ZS0wMSwKLSAgICAyLjAxNzY2OTIwMjk0NTMwNGUtMDEsIDEuOTIwODIyMzU4MTgzNDE3ZS0wMSwgMS44MjU4OTE2MDAxMzI2MjZlLTAxLAotICAgIDEuNzMzMDU5OTY3NDA3NTg4ZS0wMSwgMS42NDIyOTIwMDA0NTAzMDNlLTAxLCAxLjU1MzYyNjU0MjQ3OTI0NmUtMDEsCi0gICAgMS40NjcxNzA3ODU5Nzc0MTFlLTAxLCAxLjM4Mjk5MzkxNDE1MTQ1NmUtMDEsIDEuMzAxMDUwNzgwNzY3MzA1ZS0wMSwKLSAgICAxLjIyMTQ1MzA5OTI5MTU0N2UtMDEsIDEuMTQ0MjM0NTgxOTIxNjkxZS0wMSwgMS4wNjk0MTA3NTk5MjMwMzNlLTAxLAotICAgIDkuOTcwMjU4OTM0NDYwNjIzZS0wMiwgOS4yNzEyNDI4MzM3NDg2OTNlLTAyLCA4LjU5NzM3NDI3MDYyMDI2N2UtMDIsCi0gICAgNy45NDg5MzMxMTE5NTIxNDNlLTAyLCA3LjMyNjE2NTc5NDYwNTM0NWUtMDIsIDYuNzI5MzQxMDIzMTA4ODkxZS0wMiwKLSAgICA2LjE1ODc0MDgxMDA3NjMyN2UtMDIsIDUuNjE0NTgwMDI1OTMyMjIyZS0wMiwgNS4wOTcwMDc0NzAzNTY1MTllLTAyLAotICAgIDQuNjA2MTcwNDcxNDU3Nzc1ZS0wMiwgNC4xNDIyMDExNjkyNjU0MTBlLTAyLCAzLjcwNTE0MTg4NzUwNjIyOGUtMDIsCi0gICAgMy4yOTQ5NDY2NjIyNzkzOTJlLTAyLCAyLjkxMTUzMzI2OTQxMzEyMGUtMDIsIDIuNTU0NzY0MDEzMjM4MjM1ZS0wMiwKLSAgICAyLjIyNDM3NzExMjgyODYwM2UtMDIsIDEuOTIwMDA2NTg5Nzk3OTA4ZS0wMiwgMS42NDEyMjIwNDUyNjY5NzdlLTAyLAotICAgIDEuMzg3NDc2MTExMjAxMzA2ZS0wMiwgMS4xNTgwNjM1Mjk5MDk4NzVlLTAyLCA5LjUyMjEzNjY0MjIxNTkyMGUtMDMsCi0gICAgNy42OTEzNzM3OTU4MTQ2ODdlLTAzLCA2LjA3MjA3ODMzMTE5MzA5OWUtMDMsIDQuNjI1ODEyMTY4NzQyNjc2ZS0wMywKLSAgICAzLjYwNjg1MTY0MTYyNTk2OGUtMDMsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfTsKLQotLy8gU2VjdGlvbiAzLjcuMy4yLjUgd183LjVfMzYwIChkMDlyMDRfKmltcGxlbWVudG9yQ29tbWVudHMqKQotZG91YmxlIHdfTjM2MF83cDVtc1s3MjBdID0gewotICAgIDEuNzIxNTI2NjgxNjExOTY2ZS0wMywgMi4yMDgyNDg3NDMwNDY2NTBlLTAzLCAyLjY4OTAxNzUyMjU5NTM0NWUtMDMsCi0gICAgMy4yMjYxMzM0MTc3MDY1NzdlLTAzLCAzLjgxMDE0NDE5NTA5MDM1MWUtMDMsIDQuNDUzNzE5MzE3MTg0MTgyZS0wMywKLSAgICA1LjE1MzY5MjM5OTY4MTMxN2UtMDMsIDUuOTE1NTI0NzM0Mjg5ODEzZS0wMywgNi43Mzg2OTE1ODQ0MTA4NzVlLTAzLAotICAgIDcuNjI4NjE4NDA2OTA3NTUyZS0wMywgOC41ODM2MTQ1NjgwMzAwMzZlLTAzLCA5LjYwOTM4NDM3NDYxMzc1OWUtMDMsCi0gICAgMS4wNzA2MDc1MzIxNjAxMjBlLTAyLCAxLjE4NzU5NzIyNjA4MzQ1MmUtMDIsIDEuMzExOTAxMjk3MzE1OTQ0ZS0wMiwKLSAgICAxLjQ0MzkwMTA3ODU4ODY3M2UtMDIsIDEuNTgzMzUzMDE0MDk3MDg5ZS0wMiwgMS43MzA2MzA4MTA3NTg2NDdlLTAyLAotICAgIDEuODg1ODQ3MTEyMTczMzEzZS0wMiwgMi4wNDkxODY1MTU1MTYwMDZlLTAyLCAyLjIyMDYxNDc2NDE0MDE3NGUtMDIsCi0gICAgMi40MDA1NzE2NjI0MTk5NDZlLTAyLCAyLjU4ODgzNTkyODkyMTU0MmUtMDIsIDIuNzg1NTIzMjU5MTUwMDY4ZS0wMiwKLSAgICAyLjk5MDU5MTQ1NDAxNjM4NmUtMDIsIDMuMjA0MTU4OTQ0ODE3NTQ0ZS0wMiwgMy40MjYxMDAxMzI5ODU5MTdlLTAyLAotICAgIDMuNjU2ODA5NzI3MzIxMTY1ZS0wMiwgMy44OTYxNjcyMTIzOTU0NjhlLTAyLCA0LjE0NDM1ODIzNTU2NzAyOGUtMDIsCi0gICAgNC40MDE0MDc5NTUxNTY1MTdlLTAyLCA0LjY2NzQyMTY5MTM5MzQ5MGUtMDIsIDQuOTQyMTQ2MjQ5ODk2MDg3ZS0wMiwKLSAgICA1LjIyNTg4NDg4OTkxNDMyN2UtMDIsIDUuNTE4NDkzMzcyNzYxMzUwZS0wMiwgNS44MjAwNTE0Mjg0NDk5MTRlLTAyLAotICAgIDYuMTMwNTk4NDQ4NzY5MTc4ZS0wMiwgNi40NTAzODM4NDQzODM3NTdlLTAyLCA2Ljc3OTEzOTIyNzgwNzE1M2UtMDIsCi0gICAgNy4xMTcwNzgzMjg5NDcxMzRlLTAyLCA3LjQ2NDExMDcxNDgwNjczMmUtMDIsIDcuODIwMjgwNTMwOTMzOTEyZS0wMiwKLSAgICA4LjE4NTQ5NTIwNzkzNzMyOWUtMDIsIDguNTYwMDAxNjE4ODc4OTkzZS0wMiwgOC45NDM1NzYxNzQ2NjIzMDdlLTAyLAotICAgIDkuMzM2NDI1ODkxNjc5MTU4ZS0wMiwgOS43Mzg0NjcwMjUwNDgxNzBlLTAyLCAxLjAxNDk2NzE3ODQyMjE0OGUtMDEsCi0gICAgMS4wNTY5ODc2MDEzNzkxNDZlLTAxLCAxLjA5OTkzNjAyNTM4OTczM2UtMDEsIDEuMTQzNzgyODcwMDA2ODgwZS0wMSwKLSAgICAxLjE4ODUzNTA3NjQ0NjkxMGUtMDEsIDEuMjM0MTkyNzc0NzIyODEyZS0wMSwgMS4yODA3NTk5NjY4NjE4MThlLTAxLAotICAgIDEuMzI4MjA1ODA1OTIxNjIxZS0wMSwgMS4zNzY1NTQ1NjU0NzYyODNlLTAxLCAxLjQyNTc4NjQ3ODY0OTgzNGUtMDEsCi0gICAgMS40NzU5MDUyMTY4OTQ5OTZlLTAxLCAxLjUyNjkwNDM3NDYzOTU2NGUtMDEsIDEuNTc4Nzg4NTI3MjkzMjcxZS0wMSwKLSAgICAxLjYzMTUyNTI4NTE2NjM4NGUtMDEsIDEuNjg1MTMzNjI2NDA0OTY1ZS0wMSwgMS43Mzk1Nzk2ODk2NTU1MzFlLTAxLAotICAgIDEuNzk0ODQ3MzY1NDEwODQzZS0wMSwgMS44NTA5MzEwNDYxMzE0MzBlLTAxLCAxLjkwNzg0ODM1MDgwMTQwNWUtMDEsCi0gICAgMS45NjU1NjQ5NzI3Nzk1NjNlLTAxLCAyLjAyNDEwNDE5NDg3OTg2NGUtMDEsIDIuMDgzNDU0MzM0Mjc1OTQ5ZS0wMSwKLSAgICAyLjE0MzU5ODI0ODMyMjMwOWUtMDEsIDIuMjA0NTAzNjUxMzMxODgwZS0wMSwgMi4yNjYxNzI5NjM3OTYzMzVlLTAxLAotICAgIDIuMzI4NTYyNzkyNzkzMzE1ZS0wMSwgMi4zOTE2Nzk0MDYyMDMwNzdlLTAxLCAyLjQ1NTUwNjQxNzM0NzI2NGUtMDEsCi0gICAgMi41MjAwMzk1MDgwMTY1NjBlLTAxLCAyLjU4NTI2MTY4Mjg4MzMyN2UtMDEsIDIuNjUxMTg0MDc2MjYzNTkyZS0wMSwKLSAgICAyLjcxNzc1OTExMzIwMzc4NmUtMDEsIDIuNzg0OTg1Mzg3NzM2MzYyZS0wMSwgMi44NTI4NDYwNjIyODg5MTdlLTAxLAotICAgIDIuOTIxMzI0NTkxMjYzOTMwZS0wMSwgMi45OTAzODQzMTU5OTU5MTFlLTAxLCAzLjA2MDA0MjU1OTY4NjQ3MmUtMDEsCi0gICAgMy4xMzAyNjUyOTA0NDMxMTFlLTAxLCAzLjIwMTA0ODYyMzY1NTUyMWUtMDEsIDMuMjcyMzczMjQzNzE5MTA3ZS0wMSwKLSAgICAzLjM0NDIzMjA5NTQ0MTY4N2UtMDEsIDMuNDE2NTg2MjIyNDMwMzYzZS0wMSwgMy40ODk0NDk3NjE2NDUxOTFlLTAxLAotICAgIDMuNTYyNzkyNTE5MTE2MDAzZS0wMSwgMy42MzY2MDAzNDAyNTIxMjFlLTAxLCAzLjcxMDg1MTQ2MzYwMDMxOWUtMDEsCi0gICAgMy43ODU1NDMyNjcxNjQ4MDVlLTAxLCAzLjg2MDYyNjk1MTg5NTAzNWUtMDEsIDMuOTM2MTA1NTM2MTQwNDM4ZS0wMSwKLSAgICA0LjAxMTk1MjI0NzUzMjgxNWUtMDEsIDQuMDg4MTUyNzI0NTk0NDMyZS0wMSwgNC4xNjQ2ODQ2MDM0OTQ1ODVlLTAxLAotICAgIDQuMjQxNTU0MTEzOTU1MDkzZS0wMSwgNC4zMTg3MTA0NTg0NTg2NjBlLTAxLCA0LjM5NjE0NzQzOTE0NDQ4MWUtMDEsCi0gICAgNC40NzM4NDAxOTQ5MDM1MjllLTAxLCA0LjU1MTc2OTg3NzA0ODEzOWUtMDEsIDQuNjI5OTAxMzc1MDE5Njc3ZS0wMSwKLSAgICA0LjcwODI0NjE4Nzg4NTM4OWUtMDEsIDQuNzg2NzY1OTI2MzUyNjMyZS0wMSwgNC44NjU0NTQzMzExMzU3NjhlLTAxLAotICAgIDQuOTQ0Mjg3MTQ0MDAzMjIyZS0wMSwgNS4wMjMyNDgxMzEzODEwMzVlLTAxLCA1LjEwMjI5NDcxNDY0NTg4N2UtMDEsCi0gICAgNS4xODE0MjkyNjU1NTgxNDZlLTAxLCA1LjI2MDYwOTE2MjI0ODQ3M2UtMDEsIDUuMzM5ODI4MTc2NTQ0ODY5ZS0wMSwKLSAgICA1LjQxOTA2ODE2Nzg1NDk0NWUtMDEsIDUuNDk4MzEyODI4ODUwMjMzZS0wMSwgNS41Nzc1MTIzMzc0Nzk5NTBlLTAxLAotICAgIDUuNjU2Njc2MzYyMzM4NTYzZS0wMSwgNS43MzU3Njg4Mjc3NzAwNTllLTAxLCA1LjgxNDc2NjY1NTQ3NzY4MmUtMDEsCi0gICAgNS44OTM2NDY2MTA5MDgwMjNlLTAxLCA1Ljk3MjQxMzM4NDQxMDM0MmUtMDEsIDYuMDUxMDIwMTMxOTQ1MzI3ZS0wMSwKLSAgICA2LjEyOTQ2MTcwMjk2NTI2NmUtMDEsIDYuMjA3NzAyNDI0MTkzOTczZS0wMSwgNi4yODU3MjA5MzgwMDAwNzRlLTAxLAotICAgIDYuMzYzNDg1MjYxODIxMjkyZS0wMSwgNi40NDA5OTY2MjQzMzYxMjRlLTAxLCA2LjUxODIwOTczMzAxMjE2NGUtMDEsCi0gICAgNi41OTUxMzgyMTcwNTc4NzJlLTAxLCA2LjY3MTc2MzgxNjc2Mzk1MGUtMDEsIDYuNzQ4MDY3OTUxNzAzOTE4ZS0wMSwKLSAgICA2LjgyNDAwNzEwODQ1OTAyM2UtMDEsIDYuODk5NTg4NTM3NjU4NjU0ZS0wMSwgNi45NzQ3NTcyMjM0ODg4ODhlLTAxLAotICAgIDcuMDQ5NTAxNDQ3NTUzMDI2ZS0wMSwgNy4xMjM3OTk4MDA5MzEzMDJlLTAxLCA3LjE5NzY1NDM0MDU0MjMzMWUtMDEsCi0gICAgNy4yNzEwMzgzMjkyNDMyNDFlLTAxLCA3LjM0Mzk2MzcxODY5NDc4OGUtMDEsIDcuNDE2Mzg1NjA2NjYxMjAwZS0wMSwKLSAgICA3LjQ4ODI5NjM5NDI3NzgxNmUtMDEsIDcuNTU5NjY2ODgwNTA1MzI0ZS0wMSwgNy42MzA0OTI1OTQ0MTgyMThlLTAxLAotICAgIDcuNzAwNzIyNzM0NTY2Nzg3ZS0wMSwgNy43NzAzNjk4MTEwMTUxNjhlLTAxLCA3LjgzOTQxMTA3OTU1NTYxNGUtMDEsCi0gICAgNy45MDc4MTI1NjU3MDQxMDRlLTAxLCA3Ljk3NTU4MTEzNjg5Nzk0MmUtMDEsIDguMDQyNzEzODA5NjUzMTczZS0wMSwKLSAgICA4LjEwOTE0OTAwNTkyOTg3NWUtMDEsIDguMTc0OTA4NTU1MzExMTM4ZS0wMSwgOC4yMzk5NzA5Mzc3MTE5NzJlLTAxLAotICAgIDguMzA0MzI3ODUwMTg0OTM4ZS0wMSwgOC4zNjc5Njk0OTY0MDg1MzJlLTAxLCA4LjQzMDg5Mjk3OTcyNjI3OWUtMDEsCi0gICAgOC40OTMwNTg0NzE0MjIzMjhlLTAxLCA4LjU1NDQ3MzA5NTY3OTE2M2UtMDEsIDguNjE1MTEwMzY1MTMzMjg5ZS0wMSwKLSAgICA4LjY3NDk2MjgwNjgzNjc3M2UtMDEsIDguNzM0MDA3OTgzOTkxMTU2ZS0wMSwgOC43OTIyNzUxODM0NDI5NzVlLTAxLAotICAgIDguODQ5NzI0MzgzMDQ2OTUyZS0wMSwgOC45MDYzNTcxODk2OTgwODNlLTAxLCA4Ljk2MjE3MTcyNzA5NzUxM2UtMDEsCi0gICAgOS4wMTcxNjQxMzg2ODExMTNlLTAxLCA5LjA3MTI4NzcwMTIzODc4MmUtMDEsIDkuMTI0NTY1NzgxNjEwMTc0ZS0wMSwKLSAgICA5LjE3Njk3MjYwODM5NjgyMWUtMDEsIDkuMjI4NDg3ODM1NzAyODc3ZS0wMSwgOS4yNzkwOTkxNzI1NzA3OTdlLTAxLAotICAgIDkuMzI4ODI1OTY0NzY4NjIzZS0wMSwgOS4zNzc2MzMyMjUzNDE4MjBlLTAxLCA5LjQyNTUzMzU1OTQ5MTQ3NWUtMDEsCi0gICAgOS40NzI1MjQyODE3NjM5ODRlLTAxLCA5LjUxODYwMjA2MjUyNzQ2OGUtMDEsIDkuNTYzNzYwNTk5MzA3MTQ2ZS0wMSwKLSAgICA5LjYwODAwNjAxNjUzNjQyNmUtMDEsIDkuNjUxMzA2MDAxNTM2Mjg5ZS0wMSwgOS42OTM2NjY4ODg1Njc5MjNlLTAxLAotICAgIDkuNzM1MDg4MTIxOTEyODM5ZS0wMSwgOS43NzU1NjU0MDU0NjcyNDhlLTAxLCA5LjgxNTA3MjI2MDc2MjAxNmUtMDEsCi0gICAgOS44NTM2NDU4MDI5MDA2MDVlLTAxLCA5Ljg5MTI2MjA4Njc3OTk1N2UtMDEsIDkuOTI3OTQyMDA2ODA2MDEyZS0wMSwKLSAgICA5Ljk2MzY3NTQ1MDg0OTc3NWUtMDEsIDkuOTk4NDY5MTkxNjgzMTYzZS0wMSwgMS4wMDMyMjgxMjQ4NDUxNDZlKzAwLAotICAgIDEuMDA2NTEzNDExODIxOTExZSswMCwgMS4wMDk3MDA3Mjk3MDM4NzRlKzAwLCAxLjAxMjc5MDI4OTYwNjM0MmUrMDAsCi0gICAgMS4wMTU3ODI5MzQzNjA4ODdlKzAwLCAxLjAxODY4MjI4NjkwODM1MmUrMDAsIDEuMDIxNDg2NTcwNDEwMTk4ZSswMCwKLSAgICAxLjAyNDE5NzcxODQyODgxM2UrMDAsIDEuMDI2ODE0NTUwODU5MTkwZSswMCwgMS4wMjkzMzU5ODEwOTk5NzRlKzAwLAotICAgIDEuMDMxNzYwNDI5OTM2MzQ0ZSswMCwgMS4wMzQwODk4MTI3NTE3MjBlKzAwLCAxLjAzNjMyMzI1ODUxNTc4MGUrMDAsCi0gICAgMS4wMzg0NjM2MDc2NTM2MjllKzAwLCAxLjA0MDUxMTk1NjYyOTM5N2UrMDAsIDEuMDQyNDY4MzE0Njk1NTQ0ZSswMCwKLSAgICAxLjA0NDMzMzMxMDE1NDU4MGUrMDAsIDEuMDQ2MTA4MzY4NTIyMzYyZSswMCwgMS4wNDc3OTAxODMxNTY1NjdlKzAwLAotICAgIDEuMDQ5MzgzMzM1NTU5MTI2ZSswMCwgMS4wNTA4ODU2NDk1MzQyNzZlKzAwLCAxLjA1MjI5OTIzNDYxNjIyM2UrMDAsCi0gICAgMS4wNTM2MjUyMTg0OTA2MzVlKzAwLCAxLjA1NDg2Mjg4NzU3ODY1NmUrMDAsIDEuMDU2MDE1MjA2NTAyMjc1ZSswMCwKLSAgICAxLjA1NzA4NzQ1OTI5OTA2NWUrMDAsIDEuMDU4MDcyMjA1ODQ5NTUyZSswMCwgMS4wNTg5NzUyNDE3MTkyMDNlKzAwLAotICAgIDEuMDU5Nzk0NDY3MjMwNjYxZSswMCwgMS4wNjA1MzQxMzg2NzAxMTFlKzAwLCAxLjA2MTE5NDExODYzMjYzOGUrMDAsCi0gICAgMS4wNjE3NzM2NTU1NjQ4MjFlKzAwLCAxLjA2MjI3NjYxNzUxNzY0MmUrMDAsIDEuMDYyNzAzMjM3MjU1MTUxZSswMCwKLSAgICAxLjA2MzA1NTY4NTUwODczNWUrMDAsIDEuMDYzMzM4MTUwMjYwMTk0ZSswMCwgMS4wNjM1NDc5OTcxODQwNjZlKzAwLAotICAgIDEuMDYzNjg2MDY3OTAwNDI2ZSswMCwgMS4wNjM3NTU1NjY3NjY5NjJlKzAwLCAxLjA2Mzc1NzQzNDk1MzE0MWUrMDAsCi0gICAgMS4wNjM2OTM1ODM1MjA2MDFlKzAwLCAxLjA2MzU2NjMyMDYxODA2MWUrMDAsIDEuMDYzMzc3MDczODkxNDkyZSswMCwKLSAgICAxLjA2MzEyNzgxOTY5OTE4OWUrMDAsIDEuMDYyODIxNTU3NTMwMTIxZSswMCwgMS4wNjI0NTc4MTUzOTI0MjdlKzAwLAotICAgIDEuMDYyMDM2MzQyODE5OTgzZSswMCwgMS4wNjE1NTk5NTg5MTc1NzZlKzAwLCAxLjA2MTAyOTUxMDE4NDY2MWUrMDAsCi0gICAgMS4wNjA0NDc5NjUwODM1NDllKzAwLCAxLjA1OTgxNzA5MTU4MTQ4MWUrMDAsIDEuMDU5MTQxNjI4MTE4NDExZSswMCwKLSAgICAxLjA1ODQyMTM1ODg3NTM2NGUrMDAsIDEuMDU3NjU4NzYwMzg0NTEzZSswMCwgMS4wNTY4NTM3NzQwNzcwMzRlKzAwLAotICAgIDEuMDU2MDA3NjE0MzYwOTk4ZSswMCwgMS4wNTUxMjAwNTczNjUzOTVlKzAwLCAxLjA1NDE5NTA0NTQzODI0OGUrMDAsCi0gICAgMS4wNTMyMzM0NTU1NTEzMzNlKzAwLCAxLjA1MjIzOTg1MDcxOTU0NmUrMDAsIDEuMDUxMjE2Njc1NTE3NTM4ZSswMCwKLSAgICAxLjA1MDE2NjM2OTI4NzAzOGUrMDAsIDEuMDQ5MDg3Nzg1NzEzMzgxZSswMCwgMS4wNDc5ODM2NjQxODExOTBlKzAwLAotICAgIDEuMDQ2ODUzMzM3NjQ3OTg1ZSswMCwgMS4wNDU2OTg1OTUxNDYyMzVlKzAwLCAxLjA0NDUyMDU2NDczMDMwNWUrMDAsCi0gICAgMS4wNDMzMjM0ODE2ODE2MzVlKzAwLCAxLjA0MjEwODMwNjgyNDM4OWUrMDAsIDEuMDQwODc5MDczNDc2NTgyZSswMCwKLSAgICAxLjAzOTYzNjAzMjk4Nzc5M2UrMDAsIDEuMDM4MzgwOTg1NTg4NjY3ZSswMCwgMS4wMzcxMTQwMjk2MDM2ODJlKzAwLAotICAgIDEuMDM1ODM4MTM0NTMzMTYyZSswMCwgMS4wMzQ1NTI3NjI1MzkzNjJlKzAwLCAxLjAzMzI2MjAwMDYyMTQ5MGUrMDAsCi0gICAgMS4wMzE5Njc0OTc1NjcyNjFlKzAwLCAxLjAzMDY3MTk5NzE4MTI4MmUrMDAsIDEuMDI5Mzc1NjM5MzEyNTAyZSswMCwKLSAgICAxLjAyODA4MjQzNzM2NTA0N2UrMDAsIDEuMDI2NzkxNjY2OTQyNjgxZSswMCwgMS4wMjU1MDYzNTI0OTM0NjRlKzAwLAotICAgIDEuMDI0MjI2NTUwMzA2MjU4ZSswMCwgMS4wMjI5NTU1ODQwMjIzNDRlKzAwLCAxLjAyMTY5Mjk4OTU2MzI0N2UrMDAsCi0gICAgMS4wMjA0NDQ3NDg0NjAxNTRlKzAwLCAxLjAxOTIwNzMzMjEzNzg1M2UrMDAsIDEuMDE3OTk5OTE5MTU2NDIwZSswMCwKLSAgICAxLjAxNzE2MDIxNzE5Mzk2MWUrMDAsIDEuMDE1ODcyODg3MTk3MjI1ZSswMCwgMS4wMTQ2MTc4MjkyOTk0OThlKzAwLAotICAgIDEuMDEzMzk3MzgwODAxMzQ0ZSswMCwgMS4wMTIyMTAxNzQ1OTM1MzNlKzAwLCAxLjAxMTA1NjUxNjE4NzcyMWUrMDAsCi0gICAgMS4wMDk5MzQ0MzY0OTQ3OTRlKzAwLCAxLjAwODg0NTU5MTAzNjk1OGUrMDAsIDEuMDA3Nzg5NTU3NjA5NTc4ZSswMCwKLSAgICAxLjAwNjc2NzkwMTQ3MjczNGUrMDAsIDEuMDA1Nzc4NTEyNDg2MjIxZSswMCwgMS4wMDQ4MjE3MzM2OTY3NjNlKzAwLAotICAgIDEuMDAzODk1OTIwMTYxMjM2ZSswMCwgMS4wMDMwMDI2MTg0OTg5NjRlKzAwLCAxLjAwMjE0MDkwNzI1ODY2MmUrMDAsCi0gICAgMS4wMDEzMTIxMjcwMzE1NTdlKzAwLCAxLjAwMDUxNDYwMTgwOTE0OGUrMDAsIDkuOTk3NDg5ODc1NjYzODc1ZS0wMSwKLSAgICA5Ljk5MDEzNDg2MDY1MTczNmUtMDEsIDkuOTgzMDkyMjg3NTYwNTI3ZS0wMSwgOS45NzYzNDkzMzU3MzgwMThlLTAxLAotICAgIDkuOTY5OTE4ODUxMTgxMDk1ZS0wMSwgOS45NjM3ODYwMTM3NDU3MTllLTAxLCA5Ljk1Nzk1OTgyMzI0MjU1N2UtMDEsCi0gICAgOS45NTI0MjIxNzQzMTU1MjllLTAxLCA5Ljk0NzE4MTMyMjc5NzM2N2UtMDEsIDkuOTQyMjIxMjE2MDM1MjA1ZS0wMSwKLSAgICA5LjkzNzU1MzEzMjcwMDk2OWUtMDEsIDkuOTMzMTYyMTU3MTE4NDk2ZS0wMSwgOS45MjkwNTgwOTI2NDgwNDBlLTAxLAotICAgIDkuOTI1MjI0MjE1NjgwNTY0ZS0wMSwgOS45MjE2Njk1Njk2NDkzODdlLTAxLCA5LjkxODM3NzAzODQ3NDgwN2UtMDEsCi0gICAgOS45MTUzNTUwODQwOTg1MjhlLTAxLCA5LjkxMjU4NjAyNzA4ODUwN2UtMDEsIDkuOTEwMDc4Nzg0MjUwNDIxZS0wMSwKLSAgICA5LjkwNzgxNzIyNjY2NDc2NWUtMDEsIDkuOTA1ODExMDM4NzIzMjU2ZS0wMSwgOS45MDQwNDMzNjAxMDY0MzVlLTAxLAotICAgIDkuOTAyNTIyNjY1MTUwNjA3ZS0wMSwgOS45MDEyMzExODE4NjM3NTRlLTAxLCA5LjkwMDE3NzI1OTQyMDgwMmUtMDEsCi0gICAgOS44OTkzNDMyNTI1MTY3NTJlLTAxLCA5Ljg5ODczNzExOTk0NzAwMGUtMDEsIDkuODk4MzQxMTAwNjM2MDg3ZS0wMSwKLSAgICA5Ljg5ODE2MzU4NTE2MzMzMGUtMDEsIDkuODk4MTg3MDY2NjQ3MjUzZS0wMSwgOS44OTg0MTk5NzYzMzU1OTZlLTAxLAotICAgIDkuODk4ODQ0Mzc2MDgzNzQ5ZS0wMSwgOS44OTk0NjgwMDE3ODcxOTFlLTAxLCA5LjkwMDI3Mjg3MTc5NDY2NmUtMDEsCi0gICAgOS45MDEyNjY4MDQzMzAyNzNlLTAxLCA5LjkwMjQzMTc1MzY3NzA4MmUtMDEsIDkuOTAzNzc1OTM1NjczNTkxZS0wMSwKLSAgICA5LjkwNTI4MTMzNzMyMDAzOWUtMDEsIDkuOTA2OTU1NjM1NTE0NDM0ZS0wMSwgOS45MDg3ODA0MzI1Mzg2NDllLTAxLAotICAgIDkuOTEwNzYzMDE2OTYyMjA2ZS0wMSwgOS45MTI4ODU0MDEwMzU5MzRlLTAxLCA5LjkxNTE1NjAxOTc5MDM2NGUtMDEsCi0gICAgOS45MTc1NTY2NTg2Mzg1NjllLTAxLCA5LjkyMDA5NDY5MDYzNTY2OGUtMDEsIDkuOTIyNzUxNTU0MzI1MzMxZS0wMSwKLSAgICA5LjkyNTUzNDg2NDY0MDY1NmUtMDEsIDkuOTI4NDI2OTI3NTAxNDA4ZS0wMSwgOS45MzE0MzUzMzMzODcxNDBlLTAxLAotICAgIDkuOTM0NTQwNzk2NjExODM1ZS0wMSwgOS45Mzc3NTA2NjYzMDY2MzVlLTAxLCA5Ljk0MTA0Njg5MDcxMzA3NmUtMDEsCi0gICAgOS45NDQ0Mzc0MTU2MzUzODhlLTAxLCA5Ljk0NzkwMzk3OTgyODcxOWUtMDEsIDkuOTUxNDUzNjExNDM1NzAxZS0wMSwKLSAgICA5Ljk1NTA2Nzk5NTc1ODMwNWUtMDEsIDkuOTU4NzU1MzM2MjIxMjU4ZS0wMSwgOS45NjI0OTY4MTQ5Njg0NTZlLTAxLAotICAgIDkuOTY2Mjk5MTg1NzY1MTg2ZS0wMSwgOS45NzAxNDM2NzAxNTY3MjZlLTAxLCA5Ljk3NDAzNzk5NDA2MzAyMGUtMDEsCi0gICAgOS45Nzc5NjQwNDQ3MDEwMTZlLTAxLCA5Ljk4MTkyODcwNjg0MjExOWUtMDEsIDkuOTg1OTEyODU1NjEzNjc5ZS0wMSwKLSAgICA5Ljk4OTkyNDM2Mjk3ODI2M2UtMDEsIDkuOTkzOTQ1MDY0NzYyMzMzZS0wMSwgOS45OTc5ODI0NzA3NDE4NzZlLTAxLAotICAgIDEuMDAwMjAxNzkzNjM4MjY5ZSswMCwgMS4wMDA2MDU4NjAzNjgyOTZlKzAwLCAxLjAwMTAwODU3OTkxMDY4MmUrMDAsCi0gICAgMS4wMDE0MTA3MDE3MTQ1MDZlKzAwLCAxLjAwMTgxMDQwMDk0NDQwOGUrMDAsIDEuMDAyMjA4NDYyMDg3MDgxZSswMCwKLSAgICAxLjAwMjYwMjk1ODM5NTgzMWUrMDAsIDEuMDAyOTk0NTczNjgyMjg3ZSswMCwgMS4wMDMzODE0NzcyNzcyMzdlKzAwLAotICAgIDEuMDAzNzY0NDM2MzM4NDA4ZSswMCwgMS4wMDQxNDE1NDgwNTM1NzRlKzAwLCAxLjAwNDUxMzQ4MDM5NjIwMGUrMDAsCi0gICAgMS4wMDQ4NzgzMjEzNDQ3ODRlKzAwLCAxLjAwNTIzNjg4NDA5OTA5NGUrMDAsIDEuMDA1NTg3MzAyOTM1NTM0ZSswMCwKLSAgICAxLjAwNTkzMDI3MTcyNDM5OWUrMDAsIDEuMDA2MjYzOTI1ODkwNjM2ZSswMCwgMS4wMDY1ODkwNTE3NDY2NThlKzAwLAotICAgIDEuMDA2OTAzODAyMzUxOTQ4ZSswMCwgMS4wMDcyMDg5MDM1ODc3NzJlKzAwLCAxLjAwNzUwMjM4MDExMDk4M2UrMDAsCi0gICAgMS4wMDc3ODQ5ODIzNDYwNTFlKzAwLCAxLjAwODA1NDg5MzgxNDY0OWUrMDAsIDEuMDA4MzEyODY4MTk5MjA3ZSswMCwKLSAgICAxLjAwODU1Njk5OTAwNjM5OWUrMDAsIDEuMDA4Nzg4MDE2MzQ4Mzk0ZSswMCwgMS4wMDkwMDQwNDc3MDkwNDhlKzAwLAotICAgIDEuMDA5MjA1OTMyODY3NTYxZSswMCwgMS4wMDkzOTE4MjIwNjAwNTBlKzAwLCAxLjAwOTU2MjQ0MDQyNDg5NmUrMDAsCi0gICAgMS4wMDk3MTU4OTY3Mzk5MzBlKzAwLCAxLjAwOTg1Mjk1ODIxNzczMmUrMDAsIDEuMDA5OTcxNzc0MDc5MTA1ZSswMCwKLSAgICAxLjAxMDA3MzE2OTY0ODYzMmUrMDAsIDEuMDEwMTU1MjkzMDExMTY2ZSswMCwgMS4wMTAyMTg5MzI2NDIzNDVlKzAwLAotICAgIDEuMDEwMjYyMjQ2Mjg4NTI0ZSswMCwgMS4wMTAyODYwMTgzMDQ4ODllKzAwLCAxLjAxMDI4ODQxNTAxMzYwMWUrMDAsCi0gICAgMS4wMTAyNzAyOTY2NDE2NjVlKzAwLCAxLjAxMDIyOTg3ODcwMzMwOWUrMDAsIDEuMDEwMTY4MDIyNzU4MjQzZSswMCwKLSAgICAxLjAxMDA4MjkyNDU3NDMyNmUrMDAsIDEuMDA5OTc1NDA3NzM2ODg1ZSswMCwgMS4wMDk4NDM2ODcxMjM1MjllKzAwLAotICAgIDEuMDA5Njg4NjMyODU0NzQ3ZSswMCwgMS4wMDk1MDg0NTUyODAyOTRlKzAwLCAxLjAwOTMwNDA0NDU5Njk0MmUrMDAsCi0gICAgMS4wMDkwNzM3MTM1MDk5NzZlKzAwLCAxLjAwODgxODQ4MzE1NTkyMWUrMDAsIDEuMDA4NTM2NzUwODQ1ODg5ZSswMCwKLSAgICAxLjAwODIyOTQ2NzUwMzQ2MGUrMDAsIDEuMDA3ODk0ODg0MDAxMTk5ZSswMCwgMS4wMDc1MzM5MTM4NjM3NTllKzAwLAotICAgIDEuMDA3MTQ0ODc3ODYxNTI1ZSswMCwgMS4wMDY3Mjg3NTc4NTQxNzVlKzAwLCAxLjAwNjI4MzkyNzg5MTAxNmUrMDAsCi0gICAgMS4wMDU4MTE0NTYyODQxOTZlKzAwLCAxLjAwNTMwOTkxMzk4MzUzMGUrMDAsIDEuMDA0NzgwNTI3Mjc3Nzk3ZSswMCwKLSAgICAxLjAwNDIyMTc2NjA1NDg2MmUrMDAsIDEuMDAzNjM0NTYwODE4OTgyZSswMCwgMS4wMDMwMTcxOTA5Mzg4NTVlKzAwLAotICAgIDEuMDAyMzcwNjczMjI1ODUyZSswMCwgMS4wMDE2OTM2MzQ3OTI5NTNlKzAwLCAxLjAwMDk4NzQ4ODEwNTYwM2UrMDAsCi0gICAgMS4wMDAyNTEwNzU0NTY2NzRlKzAwLCA5Ljk5NDg1NjYyODY5NjcwMmUtMDEsIDkuOTg2ODk1OTIzODk2OTA0ZS0wMSwKLSAgICA5Ljk3ODYzNjY2NDMzMzc3NGUtMDEsIDkuOTcwMDYzNzAyMjkxNjUyZS0wMSwgOS45NjExOTE5OTEyOTExODNlLTAxLAotICAgIDkuOTUyMDE0MDM4NTU5NjIyZS0wMSwgOS45NDI1NDY4Njg3NzM5NTJlLTAxLCA5LjkzMjc3NTk1MTAxMjgwNmUtMDEsCi0gICAgOS45MjI3MDY1MDYwMjgzNTllLTAxLCA5LjkxMjMxOTY3MzkzNjc2N2UtMDEsIDkuOTAxNjMyODU3MTg1NTI1ZS0wMSwKLSAgICA5Ljg5MDY0MzkzNTIyMzIxNmUtMDEsIDkuODc5MzcxMTUzMzQzMzY4ZS0wMSwgOS44Njc3OTczNjEwODMwNzZlLTAxLAotICAgIDkuODU1OTI3NzMwODQyMzU4ZS0wMSwgOS44NDM3NTEyNDY4NjEwMzRlLTAxLCA5LjgzMTI5Mjg3ODkwMDYyM2UtMDEsCi0gICAgOS44MTM0ODQ2MjkxMTMyNzZlLTAxLCA5Ljc5ODkwOTYzMzEyNzY4NGUtMDEsIDkuNzg0MDA0NTg5ODQ5MDY0ZS0wMSwKLSAgICA5Ljc2ODYwNDM1NDExNTcyNGUtMDEsIDkuNzUyNjk4Nzg4NDI4NTg3ZS0wMSwgOS43MzYyNzM1MzI0MTYxMThlLTAxLAotICAgIDkuNzE5MzEzNDA5ODMyMjI4ZS0wMSwgOS43MDE4MDQ5ODAwNDAyNTNlLTAxLCA5LjY4MzcyNjUxOTY1MjU2N2UtMDEsCi0gICAgOS42NjUwNjk1MjI1OTcwNjhlLTAxLCA5LjY0NTgwMDI2ODIwMzI3N2UtMDEsIDkuNjI1OTIzMTc1ODgzMTIzZS0wMSwKLSAgICA5LjYwNTQwOTg2MzQzMjczMGUtMDEsIDkuNTg0MjU1MzM1MTU1Mjc1ZS0wMSwgOS41NjI0NDM5MzI3NTAxOTNlLTAxLAotICAgIDkuNTM5OTg0MTU5MDI4OTMxZS0wMSwgOS41MTY4NDAxMzg0NTU4MzFlLTAxLCA5LjQ5MzAxMTg1MzYzNzc5MWUtMDEsCi0gICAgOS40Njg0Njg4NDMyOTgzMjNlLTAxLCA5LjQ0MzIwMjMyMjMxNTA1MGUtMDEsIDkuNDE3MTg0MDQzMjMzMjY4ZS0wMSwKLSAgICA5LjM5MDQyNTc5NjQ2NzA5NmUtMDEsIDkuMzYyOTA2MjQxNjk4NzY2ZS0wMSwgOS4zMzQ2NDA0OTczNjMxMDFlLTAxLAotICAgIDkuMzA1NjA4NTM4NzY4ODA4ZS0wMSwgOS4yNzU4MDUwNjk0NDIzMTZlLTAxLCA5LjI0NTE5NTkxNzE5NTE2NGUtMDEsCi0gICAgOS4yMTM3ODQ3MTQ0MTM4NDhlLTAxLCA5LjE4MTUzNDEzNzIzMDM0OWUtMDEsIDkuMTQ4NDQ2OTU2MTMwMjIwZS0wMSwKLSAgICA5LjExNDUxNjUxNjAxNzEyNGUtMDEsIDkuMDc5NzY1MjQwMTM4MDU3ZS0wMSwgOS4wNDQxNzU0NTA4MzE4NTllLTAxLAotICAgIDkuMDA3NzYzMDc3Mjc4NjE3ZS0wMSwgOC45NzA1MDA1ODQ3OTMxMjNlLTAxLCA4LjkzMjM4Mzk3ODU0OTMxNGUtMDEsCi0gICAgOC44OTMzODY4MDU2NDc3NzhlLTAxLCA4Ljg1MzUxMzYwMzg0ODE3N2UtMDEsIDguODEyNzQwMjI5NTY2NzY3ZS0wMSwKLSAgICA4Ljc3MTA5NjM3OTEzOTY2MWUtMDEsIDguNzI4NTc5MjY1MDQzOTk4ZS0wMSwgOC42ODUxOTUwNTA5MjY1NTFlLTAxLAotICAgIDguNjQwOTI3OTY0NDkwNDI1ZS0wMSwgOC41OTU3OTgxODY1MDQ2MjJlLTAxLCA4LjU0OTc2MDA2NTU5NTc2MGUtMDEsCi0gICAgOC41MDI4NTIyMDEyNjM0NDZlLTAxLCA4LjQ1NTAyNjE1MDM4NjU1MGUtMDEsIDguNDA2MzA0NzAzMjA0MDUxZS0wMSwKLSAgICA4LjM1NjY3OTI1NDkyNzgzM2UtMDEsIDguMzA2MTk5NDMzMDE0ODAxZS0wMSwgOC4yNTQ4MjAwNjk5MDU1ODdlLTAxLAotICAgIDguMjAyNTg5MDg3MDU5MTY0ZS0wMSwgOC4xNDk0NjY0ODE1NzUzNDBlLTAxLCA4LjA5NTQ2Njk1OTIxMzkwOWUtMDEsCi0gICAgOC4wNDA1OTk3Nzg1ODE3NTdlLTAxLCA3Ljk4NDg5Mzc3NTI5NDQwNmUtMDEsIDcuOTI4MzE0MTczMTgwNzgzZS0wMSwKLSAgICA3Ljg3MDkwNjY4MTEyMDEwMWUtMDEsIDcuODEyNjI0NDk2NjAxNDUxZS0wMSwgNy43NTM1Mzk0Njg5NjUzMTNlLTAxLAotICAgIDcuNjkzNjM2MTI5NzM4MDc1ZS0wMSwgNy42MzI5MTc2OTI1NTA4ODFlLTAxLCA3LjU3MTM5MDE2NDM4NTM3NWUtMDEsCi0gICAgNy41MDkwMTcxMTE3OTc0MzZlLTAxLCA3LjQ0NTkwODQzNDIwMzg4M2UtMDEsIDcuMzgyMDUxMzU5ODMyMjE3ZS0wMSwKLSAgICA3LjMxNzM4MDc1MDE5OTc1N2UtMDEsIDcuMjUxOTkyODcwODA5MTY1ZS0wMSwgNy4xODU4ODIyNTI4OTU5MjdlLTAxLAotICAgIDcuMTE5MDU2ODY2ODkyNTk5ZS0wMSwgNy4wNTE1MzY2ODM2MDg1NDVlLTAxLCA2Ljk4MzMyNjM0MTU1MTM2NmUtMDEsCi0gICAgNi45MTQ0NDEwMTIyMzg2NjdlLTAxLCA2Ljg0NDkwNTQ0NjAzODE4NWUtMDEsIDYuNzc0NzAxMTkyNzY4NzE3ZS0wMSwKLSAgICA2LjcwMzg4Mzc1Mzc1MjU1M2UtMDEsIDYuNjMyNDUyMDk5MzEzNzgzZS0wMSwgNi41NjA0NTc4MDA3NTM5MzdlLTAxLAotICAgIDYuNDg3ODg2MjY5MTA5MDgzZS0wMSwgNi40MTQ3NzE2MTY2MTgxODVlLTAxLCA2LjM0MTE0MzIyNjk3NDQyOGUtMDEsCi0gICAgNi4yNjcwMjAwMDI4ODU5OTllLTAxLCA2LjE5MjM1MzMzNjM1NTQxM2UtMDEsIDYuMTE3MjA1OTU3NjY4MTI4ZS0wMSwKLSAgICA2LjA0MTYxNjEyMDA4MzcxOWUtMDEsIDUuOTY1NTkxMzI1NDI3ODYwZS0wMSwgNS44ODkxNDQwMDc0MjUyNzBlLTAxLAotICAgIDUuODEyMzQ3ODM0MTQxOTQyZS0wMSwgNS43MzUxOTk4OTM2NDgxNDNlLTAxLCA1LjY1NzcwNjE1ODM4MzQxMWUtMDEsCi0gICAgNS41Nzk4ODA2NzE1Njc5NzhlLTAxLCA1LjUwMTczODUxMDIzNDU0MmUtMDEsIDUuNDIzMzAxOTM5Mzg2MzI1ZS0wMSwKLSAgICA1LjM0NDYwNzk4MDU1NzgyNWUtMDEsIDUuMjY1Njg1MzgyMzAwMTI3ZS0wMSwgNS4xODY1NjMyNDEwNjAxNzRlLTAxLAotICAgIDUuMTA3Mjg4MTI2MTA1MzAyZS0wMSwgNS4wMjc4MTE1ODY2MzgwMThlLTAxLCA0Ljk0ODE5NDkwOTkwNjg3MmUtMDEsCi0gICAgNC44Njg0NTEzOTI0ODY0MTdlLTAxLCA0Ljc4ODYwODg5MDU2MTg3MWUtMDEsIDQuNzA4Njk5MjgyMzcwMTE1ZS0wMSwKLSAgICA0LjYyODc1MTQ0MDU2NTQxM2UtMDEsIDQuNTQ4Nzc4OTQzNDkwODA3ZS0wMSwgNC40Njg4MjUxMjAyNzgwNjBlLTAxLAotICAgIDQuMzg4ODkzMjQ5OTExODA5ZS0wMSwgNC4zMDg5ODEyMjg5ODk3NTdlLTAxLCA0LjIyOTE4MzIyMzc3Nzg1NmUtMDEsCi0gICAgNC4xNDk1MDg3Nzk3NjExNzBlLTAxLCA0LjA2OTkzOTY0MjA1NjI0M2UtMDEsIDMuOTkwNTI2NDgzOTU3NDk4ZS0wMSwKLSAgICAzLjkxMTM0NjEzNTExNTU1N2UtMDEsIDMuODMyMzQwMzA1ODI3ODA3ZS0wMSwgMy43NTM1NDY1MjY1ODQ0MzZlLTAxLAotICAgIDMuNjc1MDIwNTk2NDg4NjIxZS0wMSwgMy41OTY4MDA5ODMzNDQ1NTllLTAxLCAzLjUxODg3MzExOTc3MjIxMWUtMDEsCi0gICAgMy40NDEzMDE2NTgyODI1NzJlLTAxLCAzLjM2NDA4MTAwMDkxMzAyNWUtMDEsIDMuMjg3Mjg5NjYxNjczODQ2ZS0wMSwKLSAgICAzLjIxMDkwNTA1MTYzMjk1OGUtMDEsIDMuMTM0OTY0MTgxNTI2NDY3ZS0wMSwgMy4wNTk1MTU2NDkzOTcyMDFlLTAxLAotICAgIDIuOTg0NTQzMTg3MjQwNjc4ZS0wMSwgMi45MTAxMDU2NTQ5Mzg3MDNlLTAxLCAyLjgzNjIxMTA5Mzc3NTA0MmUtMDEsCi0gICAgMi43NjI4NTQxNTA1NzM3MzFlLTAxLCAyLjY5MDE5NTg1MTA4NzQ1NGUtMDEsIDIuNjE4MTI0NDUyMDU3OTYyZS0wMSwKLSAgICAyLjU0NjU5MjMyMzcxOTY4M2UtMDEsIDIuNDc1ODQzNDc1NjE4NjcyZS0wMSwgMi40MDU3ODY5NDE5MTI2MDJlLTAxLAotICAgIDIuMzM2NDcwMDg2NjYyNzc2ZS0wMSwgMi4yNjc4ODQzMzM4NTE5ODllLTAxLCAyLjIwMDAxOTkxNzY3ODM0N2UtMDEsCi0gICAgMi4xMzMwMTMyNTE3MDM5MjdlLTAxLCAyLjA2Njc3NzcwNjUzODQ4NGUtMDEsIDIuMDAxNDA0MDkxMDQzNDUzZS0wMSwKLSAgICAxLjkzNjgzNjMwMjc3NTk2N2UtMDEsIDEuODczMTAzNDMyMzg0MTkzZS0wMSwgMS44MTAyNzM4Mzg4MzYyNDhlLTAxLAotICAgIDEuNzQ4Mzk0NzYwNjIzMDk0ZS0wMSwgMS42ODczOTY0NDEyNTA2OTBlLTAxLCAxLjYyNzM3MjczNDgxOTE3NGUtMDEsCi0gICAgMS41NjgyNTI3NzA1MDY4MjZlLTAxLCAxLjUxMDEyMzgyMDU4ODk3NmUtMDEsIDEuNDUyOTgyMjk1MzY3NDczZS0wMSwKLSAgICAxLjM5Njg3NDY5MzgyOTgwOWUtMDEsIDEuMzQxNzE4NDIyNzk3MDg4ZS0wMSwgMS4yODc2MjU0NDEzNjAxOTRlLTAxLAotICAgIDEuMjM0NTU1NjIwNzMxNDc3ZS0wMSwgMS4xODI1NDY2MjMyNTYzNTJlLTAxLCAxLjEzMTU5Njc2NzY2MzA0NWUtMDEsCi0gICAgMS4wODE3MTQzOTI3MzU4OTllLTAxLCAxLjAzMjkwNzMzOTc3NDU5NGUtMDEsIDkuODUyMDI5Nzc5MDYzNDI2ZS0wMiwKLSAgICA5LjM4NjAwMDIyNjA0ODE0MGUtMDIsIDguOTMxMTczNjAyNzI1NTE2ZS0wMiwgOC40ODc1MjEwMjg4Mjk5MzFlLTAyLAotICAgIDguMDU1MjM3MzczMjIxODgxZS0wMiwgNy42MzQyOTc4NjYwNDE3NzBlLTAyLCA3LjIyNDg5MjQ1NjA4ODgwOWUtMDIsCi0gICAgNi44MjY5OTExOTU0ODc4NThlLTAyLCA2LjQ0MDc3MjkxNDU4NTg5NWUtMDIsIDYuMDY2MjAwMDI4NDE0NDcyZS0wMiwKLSAgICA1LjcwMzQzNzExMTQ3MjQzMmUtMDIsIDUuMzUyNDM3MTQ3MzkzOTMzZS0wMiwgNS4wMTMzNDY4OTY4NTEwNzdlLTAyLAotICAgIDQuNjg2MTA3ODk2MDc3Mjk4ZS0wMiwgNC4zNzA4NDQ1MjgxOTkyMjZlLTAyLCA0LjA2NzQ4MzY1MjU5NDk3NGUtMDIsCi0gICAgMy43NzYxMjI2OTA2NTYzMTZlLTAyLCAzLjQ5NjY3MDk5MTUzNDA4NGUtMDIsIDMuMjI5MTkyNzQ4MzMxMjQxZS0wMiwKLSAgICAyLjk3MzU3NjY4NzAzMTAyNGUtMDIsIDIuNzI5ODQ2MjkyNjQ4Mjk3ZS0wMiwgMi40OTc4NzE4NTYxMTEyNjRlLTAyLAotICAgIDIuMjc3NjI1NDE4MzIwNzEyZS0wMiwgMi4wNjg5NTgwODAzNDg3ODBlLTAyLCAxLjg3MTc4MTY5MzQ3MDY0OWUtMDIsCi0gICAgMS42ODU5MzQxNzUyODc4MDVlLTAyLCAxLjUxMTI1MTI1MjM1Mjc1OGUtMDIsIDEuMzQ3NTcwOTQ0OTUxMTc3ZS0wMiwKLSAgICAxLjE5NDYyNzA5MTIxODQ4MmUtMDIsIDEuMDUyMjg3NTM4MTE4OTAwZS0wMiwgOS4yMDEzMDk0MTI4NDAwMjZlLTAzLAotICAgIDcuOTgxMjQzMTYzNzMyNzA3ZS0wMywgNi44NTU0NzMxNDMxMjA3NzVlLTAzLCA1LjgyNjU3MzM0Mzg1MTY0MGUtMDMsCi0gICAgNC44NzgzODUyNTQyMjY1NTVlLTAzLCA0LjAyMzUxMTE5MDk0MDk3MGUtMDMsIDMuMTU0MTg2NjI3NTg2OTYwZS0wMywKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLAotICAgIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsCi0gICAgMC4wMDAwMDAwMDAwMDAwMDBlKzAwLCAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwKLSAgICAwLjAwMDAwMDAwMDAwMDAwMGUrMDAsIDAuMDAwMDAwMDAwMDAwMDAwZSswMCwgMC4wMDAwMDAwMDAwMDAwMDBlKzAwfTsKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9NZGN0V2luZG93cy5ocHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvTWRjdFdpbmRvd3MuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZiY2M2Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9NZGN0V2luZG93cy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTWRjdFdpbmRvd3MuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTURDVF9XSU5ET1dTX0hfCi0jZGVmaW5lIE1EQ1RfV0lORE9XU19IXwotCi0vLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmCi0vLyBTZWN0aW9uIDUuNy4yCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwNF8qaW1wbGVtZW50b3JDb21tZW50cyoKLS8vIFNlY3Rpb24gMy43LjMgTG93IGRlbGF5IE1EQ1Qgd2luZG93cwotLy8gU2VjdGlvbiAzLjcuMy4xIDEwIG1zIEZyYW1lIER1cmF0aW9uCi0KLWV4dGVybiBkb3VibGUgd19OODBbMTYwXTsKLWV4dGVybiBkb3VibGUgd19OMTYwWzMyMF07Ci1leHRlcm4gZG91YmxlIHdfTjI0MFs0ODBdOwotZXh0ZXJuIGRvdWJsZSB3X04zMjBbNjQwXTsKLWV4dGVybiBkb3VibGUgd19ONDgwWzk2MF07Ci0KLS8vIFNlY3Rpb24gMy43LjMuMiA3LjUgbXMgRnJhbWUgRHVyYXRpb24KLQotZXh0ZXJuIGRvdWJsZSB3X042MF83cDVtc1sxMjBdOwotZXh0ZXJuIGRvdWJsZSB3X04xMjBfN3A1bXNbMjQwXTsKLWV4dGVybiBkb3VibGUgd19OMTgwXzdwNW1zWzM2MF07Ci1leHRlcm4gZG91YmxlIHdfTjI0MF83cDVtc1s0ODBdOwotZXh0ZXJuIGRvdWJsZSB3X04zNjBfN3A1bXNbNzIwXTsKLQotI2VuZGlmICAvLyBNRENUX1dJTkRPV1NfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9TbnNRdWFudGl6YXRpb25UYWJsZXMuY3BwIGIvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL1Nuc1F1YW50aXphdGlvblRhYmxlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjM0NjIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL1Nuc1F1YW50aXphdGlvblRhYmxlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoKLSAqIFNuc1F1YW50aXphdGlvblRhYmxlcy5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZgotLy8gU2VjdGlvbiA1LjcuMyBTTlMgUXVhbnRpemF0aW9uCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwNF8qaW1wbGVtZW50b3JDb21tZW50cyoKLS8vIFNlY3Rpb24gMy43LjQgU05TIFF1YW50aXphdGlvbgotCi0jaW5jbHVkZSAiU25zUXVhbnRpemF0aW9uVGFibGVzLmhwcCIKLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMDIgb2YgMTc3Ci1kb3VibGUgTEZDQlszMl1bOF0gPSB7Ci0gICAgeysyLjI2MjgzMzY1NTkyNjc4MGUrMDAsICs4LjEzMzExMjY5MDYxMzM4NWUtMDEsIC01LjMwMTkzNDk0ODcxNDM1OWUtMDEsCi0gICAgIC0xLjM1NjY0ODM1OTAzNDQxOGUrMDAsIC0xLjU5OTUyMTc2NTYzMTk1OWUrMDAsIC0xLjQ0MDk4NzY4NDMwMDk1MGUrMDAsCi0gICAgIC0xLjE0MzgxNjQ4MzA1ODIxMGUrMDAsIC03LjU1MjAzNzY3OTA5MDY0MWUtMDF9LCAgLy8gMAotICAgIHsrMi45NDUxNjQ3OTE5MTM3NjRlKzAwLCArMi40MTE0MzMxNzk1NjY3ODhlKzAwLCArOS42MDQ1NTEwNjQwMDcyNzRlLTAxLAotICAgICAtNC40MzIyNjQ4ODA3NjkxNzJlLTAxLCAtMS4yMjkxMzYxMjQyNTU4OTZlKzAwLCAtMS41NTU5MDAzOTExODE2OTllKzAwLAotICAgICAtMS40OTY4ODY1NTk1MjM3NTllKzAwLCAtMS4xMTY4OTk4NjUwMTQ2OTJlKzAwfSwgIC8vIDEKLSAgICB7LTIuMTg2MTA3MDcwMDk5NzkwZSswMCwgLTEuOTcxNTIxMzU2NzUyMjc2ZSswMCwgLTEuNzg3MTg2MTk2ODEwMDU5ZSswMCwKLSAgICAgLTEuOTE4NjU4OTU2ODU1NzY4ZSswMCwgLTEuNzkzOTkxMjE4MzY1OTYzZSswMCwgLTEuMzU3Mzg0MDQyNTcyODg0ZSswMCwKLSAgICAgLTcuMDU0NDQyNzkzNTM4Njk0ZS0wMSwgLTQuNzgxNzI5NDQ3Nzc3MTE0ZS0wMn0sICAvLyAyCi0gICAgeys2LjkzNjg4MjM2NTI4OTE5NWUtMDEsICs5LjU1NjA5ODU3MTU4MjE5N2UtMDEsICs1Ljc1MjMwNzg3MDM4NzMzM2UtMDEsCi0gICAgIC0xLjE0NjAzNDE5NDYyODg4NmUtMDEsIC02LjQ2MDUwNjM3NDM2MDI5MGUtMDEsIC05LjUyMzUxMzcwNDQ5NjI0N2UtMDEsCi0gICAgIC0xLjA3NDA1MjQ3MjI2MTUwNGUrMDAsIC03LjU4MDg3NzA3MDk0OTA0NWUtMDF9LCAgLy8gMwotICAgIHstMS4yOTc1MjEzMjMxNTI5NTZlKzAwLCAtNy40MDM2OTA1NzE3Nzg1MjZlLTAxLCAtMy40NTM3MjQ4MzY0MjEwNjRlLTAxLAotICAgICAtMy4xMzI4NTY5NjI0Nzk0MDFlLTAxLCAtNC4wMjk3NzI0MjgyNDQ3NjZlLTAxLCAtMy43MjAyMDg1MzQ2NTIyNzJlLTAxLAotICAgICAtNy44MzQxNDE3NzMyMzczODFlLTAyLCArOS43MDQ0MTMwMzk5MjI5NDllLTAyfSwgIC8vIDQKLSAgICB7KzkuMTQ2NTIwMzc4MzA2NzE2ZS0wMSwgKzEuNzQyOTMwNDM0MzUyNTczZSswMCwgKzEuOTA5MDY2MjY4NTk5ODYxZSswMCwKLSAgICAgKzEuNTQ0MDg0ODM4NDI2NjUxZSswMCwgKzEuMDkzNDQ5NjA3NjE0NTUwZSswMCwgKzYuNDc0Nzk1NDk1MTgyNzc2ZS0wMSwKLSAgICAgKzMuNjE3OTA3NTI0NDk2NDIxZS0wMiwgLTIuOTcwOTI4MDcxNzg4ODg5ZS0wMX0sICAvLyA1Ci0gICAgey0yLjUxNDI4ODEyNTc4OTYyMWUrMDAsIC0yLjg5MTc1MjcxMzg0MzcyOGUrMDAsIC0yLjAwNDUwNjY2NzU5NDMzOGUrMDAsCi0gICAgIC03LjUwOTEyMjczOTAzMTI2OWUtMDEsICs0LjQxMjAyMTA0OTA0NjkxNGUtMDEsICsxLjIwMTkwOTg3NjAxMDA4N2UrMDAsCi0gICAgICsxLjMyNzQyODU3MjU3MjkwNGUrMDAsICsxLjIyMDQ5MDgxMTQwOTgzOWUrMDB9LCAgLy8gNgotICAgIHstOS4yMjE4ODQwNDgxMjM4NTFlLTAxLCArNi4zMjQ5NTE0MTQ0MDU1MjBlLTAxLCArMS4wODczNjQzMTI1NDY0MTFlKzAwLAotICAgICArNi4wODYyODYyNDUzNTgxOTdlLTAxLCArMS4zMTE3NDU2NzU0NzM0ODJlLTAxLCAtMi45NjE0OTE1Nzc0Mzc1MjFlLTAxLAotICAgICAtMi4wNzAxMzUxNjUyNTYyODdlLTAxLCArMS4zNDkyNDkxNjY0MjA3OTVlLTAxfSwgIC8vIDcKLSAgICB7KzcuOTAzMjIyODgzNjkyNjY0ZS0wMSwgKzYuMjg0MDEyNjE4NzYxOTg4ZS0wMSwgKzMuOTMxMTc5MjM1NDA0NDk5ZS0wMSwKLSAgICAgKzQuODAwMDc3MTA4NjY5MDA3ZS0wMSwgKzQuNDc4MTUxMzgwNTAxNDI3ZS0wMSwgKzIuMDk3MzQyMTQ1NTIyMzQzZS0wMSwKLSAgICAgKzYuNTY2OTE5OTY0MjgwMjA1ZS0wMywgLTguNjEyNDIzNDIwNjE4NTczZS0wMn0sICAvLyA4Ci0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMDMgb2YgMTc3Ci0gICAgeysxLjQ0Nzc1NTgwMTc4NzIzOGUrMDAsICsyLjcyMzk5OTUxNjc0OTUyM2UrMDAsICsyLjMxMDgzMjY4NzM3NTI3OGUrMDAsCi0gICAgICs5LjM1MDUxMjY5NTY2NTI5NGUtMDEsIC0yLjc0NzQzOTExMzgzNjg3N2UtMDEsIC05LjAyMDc3Njk2ODI4NjAxOWUtMDEsCi0gICAgIC05LjQwNjgxNTExOTQ1NDA0NGUtMDEsIC02LjMzNjk3MDM4OTc0MzEwMmUtMDF9LCAgLy8gOQotICAgIHsrNy45MzM1NDUyNjQxNzQ3NDRlLTAxLCArMS40MzkzMTE4NTUyMzQ1MzVlLTAyLCAtNS42NzgzNDg0NDcyOTY3ODllLTAxLAotICAgICAtNi41NDc2MDQ2NzkxNjc0NDllLTAxLCAtNC43OTQ1ODk5ODQ3NTc0MzBlLTAxLCAtMS43Mzg5NDY2MTkwMjg4ODVlLTAxLAotICAgICArNi44MDE2MjcwNTUxNTQzODFlLTAyLCArMi45NTEyNTk0ODM2OTc5MzhlLTAxfSwgIC8vIDEwCi0gICAgeysyLjcyNDI1MzQ3Mzg1MDMzNmUrMDAsICsyLjk1OTQ3NTcyNDA0ODI0M2UrMDAsICsxLjg0OTUzNTU5MjY4NDYwOGUrMDAsCi0gICAgICs1LjYzMjg0OTIyMzIyMzY0M2UtMDEsICsxLjM5OTE3MDg4MTI1MDcyNGUtMDEsICszLjU5NjQxMDkzMzY2MjIyMWUtMDEsCi0gICAgICs2Ljg5NDYxMzU0Nzc0NTg4N2UtMDEsICs2LjM5NzkwMTc2ODMzMTA0NmUtMDF9LCAgLy8gMTEKLSAgICB7LTUuMzA4MzAxOTgzNzU0MDAwZS0wMSwgLTIuMTI2OTA2ODI4MTIxNjM4ZS0wMSwgKzUuNzY2MTM2MjgzNzcwOTY2ZS0wMywKLSAgICAgKzQuMjQ4NzE0ODQzODM3NDU0ZS0wMSwgKzQuNzMxMjg5NTIxNTg2Njc1ZS0wMSwgKzguNTg4OTQxOTkzMjEyODA2ZS0wMSwKLSAgICAgKzEuMTkxMTExNjA4NTQ0MzUyZSswMCwgKzkuOTYxODk2Njk2MzgzNTgxZS0wMX0sICAvLyAxMgotICAgIHsrMS42ODcyODQxMDg0NTAwNjJlKzAwLCArMi40MzYxNDUwOTIzNzY1NThlKzAwLCArMi4zMzAxOTQyOTA3ODIyNTBlKzAwLAotICAgICArMS43Nzk4Mzc3NzgzNTA5MDVlKzAwLCArMS40NDQxMTI5NTM5MDA4MThlKzAwLCArMS41MTk5NTE3NzAwOTczMDFlKzAwLAotICAgICArMS40NzE5OTM5Mzc1MDQyNDllKzAwLCArOS43NzY4MjQ3Mzg5MTc2MTNlLTAxfSwgIC8vIDEzCi0gICAgey0yLjk1MTgzMjcyODAxODU4MGUrMDAsIC0xLjU5MzkzNDk2NzczMzQ1NGUrMDAsIC0xLjA5OTE4NzcyODc4MDIyNGUtMDEsCi0gICAgICszLjg4NjA5MDcyOTE5MjU3NGUtMDEsICs1LjEyOTMyNjQ5NTE3NTgzN2UtMDEsICs2LjI4MTEyNTk3MDYzNDk2NmUtMDEsCi0gICAgICs4LjIyNjIxNzk2NDMwNjMzOWUtMDEsICs4Ljc1ODkxNDI0NjU1MDgwNWUtMDF9LCAgLy8gMTQKLSAgICB7KzEuMDE4NzgzNDI3ODU2MjgxZS0wMSwgKzUuODk4NTczMjQyMjg5MTY1ZS0wMSwgKzYuMTkwNDc2NDY3OTM0NjU2ZS0wMSwKLSAgICAgKzEuMjY3MzEzMTM4NTE3OTYzZSswMCwgKzIuNDE5NjEwNDc3Njk4MDM4ZSswMCwgKzIuMjUxNzQyNTI1NzIxODY1ZSswMCwKLSAgICAgKzUuMjY1MzcwMzA5OTEyMDA1ZS0wMSwgLTMuOTY1OTE1MTMyMjc5OTg5ZS0wMX0sICAvLyAxNQotICAgIHsrMi42ODI1NDU3NTQ5ODQyNTllKzAwLCArMS4zMjczODAxMDg5OTQxOTllKzAwLCArMS4zMDE4NTI3MzgwNDA0ODJlLTAxLAotICAgICAtMy4zODUzMzA4ODUxMTM0NzFlLTAxLCAtMy42ODIxOTIzNTg5OTY2NjVlLTAxLCAtMS45MTY4OTk0NjcxNTk2MDdlLTAxLAotICAgICAtMS41NDc4MjM3NzE1MzkwNzllLTAxLCAtMi4zNDIwNzE3Nzc3NDM5MjNlLTAxfSwgIC8vIDE2Ci0gICAgeys0LjgyNjk3OTIzNjgwNDAzMGUrMDAsICszLjExOTQ3ODA0NDkyNDg4MGUrMDAsICsxLjM5NTEzNjcxMzg1MTc4NGUrMDAsCi0gICAgICsyLjUwMjk1MzE1OTE4NzIxNWUtMDEsIC0zLjkzNjEzODM5Mzc5NzkzMWUtMDEsIC02LjQzNDU4MTczMDU0NzAwN2UtMDEsCi0gICAgIC02LjQyNTcwNzM2ODU2OTQzM2UtMDEsIC03LjIzMTkzMjIzNDQ0MDcyMGUtMDF9LCAgLy8gMTcKLSAgICB7KzguNzg0MTk5MzY0NzAzMzQ5ZS0wMiwgLTUuNjk1ODY4NDAyMzg1MDEwZS0wMSwgLTEuMTQ1MDYwMTU2Njg4MTEwZSswMCwKLSAgICAgLTEuNjY5Njg0ODgxNzI1OTc1ZSswMCwgLTEuODQ1MzQ0MTc2MDM2ODE3ZSswMCwgLTEuNTY0NjgwMjczMjg4MDE5ZSswMCwKLSAgICAgLTEuMTE3NDY3NTkwNzY0MTk4ZSswMCwgLTUuMzM5ODE2NjMzNjY3ODYyZS0wMX0sICAvLyAxOAotICAgIHsrMS4zOTEwMjMwODIwNDMyNTllKzAwLCArMS45ODE0NjQ3OTE5OTQ2NTVlKzAwLCArMS4xMTI2NTc5NjM4ODc3MDFlKzAwLAotICAgICAtMi4yMDEwNzUwOTQyMDc0MzRlLTAxLCAtNy43NDk2NTYxMTU1MjM2NTVlLTAxLCAtNS45NDA2Mzg3NDE0OTExNzNlLTAxLAotICAgICArMS4zNjkzNzY4MDYyODkyMzFlLTAxLCArOC4xODI0Mjg5MTI2NDMzODFlLTAxfSwgIC8vIDE5Ci0gICAgeyszLjg0NTg1ODkzODg5MTgyMGUtMDEsIC0xLjYwNTg4Nzg1NTM2NTEwMGUtMDEsIC01LjM5MzY2ODA5NTU3NzA5NWUtMDEsCi0gICAgIC01LjI5MzA5MDc4Nzg5ODU3MWUtMDEsICsxLjkwNDMzNTQ3NDM3OTMyNGUtMDEsICsyLjU2MDYyOTE4MTA2NTIxNWUrMDAsCi0gICAgICsyLjgxODk2Mzk4MjQ1MjQ4NGUrMDAsICs2LjU2NjcwODc1Njk2MTYxMWUtMDF9LCAgLy8gMjAKLSAgICB7KzEuOTMyMjczOTk0NDE3MTkxZSswMCwgKzMuMDEwMzAxODA0MTIwNTY5ZSswMCwgKzMuMDY1NDM4OTM4MjYyMDM2ZSswMCwKLSAgICAgKzIuNTAxMTAxNjA4NzAwMDc5ZSswMCwgKzEuOTMwODk1OTI5Nzg5MzQ0ZSswMCwgKzUuNzIxNTM4MTA5NjE4MzY3ZS0wMSwKLSAgICAgLTguMTE3NDE3OTQwODEwOTA3ZS0wMSwgLTEuMTc2NDE4MTA4NjE5MDI1ZSswMH0sICAvLyAyMQotICAgIHsrMS43NTA4MDQ2Mjg5OTg4MzdlLTAxLCAtNy41MDUyMjgzMjI0ODk4NDZlLTAxLCAtMS4wMzk0Mzg5MzM0MjIzMDllKzAwLAotICAgICAtMS4xMzU3NzUwODkzNzY0ODRlKzAwLCAtMS4wNDE5NzkwMzgzNzQ5MzhlKzAwLCAtMS41MjA2MDA5ODk5MzM4MTZlLTAyLAotICAgICArMi4wNzA0ODM5MTcxNjcwNjZlKzAwLCArMy40Mjk0ODkxODA4MTY4OTFlKzAwfSwgIC8vIDIyCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMDQgb2YgMTc3Ci0gICAgey0xLjE4ODE3MDIwMjUwNTU1NWUrMDAsICszLjY2NzkyODczNjYyNjM2NGUtMDEsICsxLjMwOTU3ODMwNDA5MDk1OWUrMDAsCi0gICAgICsxLjY4MzMwNjg3MjgwNDkxNGUrMDAsICsxLjI1MTAwOTI0MjI1MTI2OGUrMDAsICs5LjQyMzc1NzUxNjI4NjE0NmUtMDEsCi0gICAgICs4LjI2MjUwNDgzMzc0MTMzMGUtMDEsICs0LjM5OTUyNzQxMTIwOTU2M2UtMDF9LCAgLy8gMjMKLSAgICB7KzIuNTMzMjIyMDMzMjcwNjEyZSswMCwgKzIuMTEyNzQ2NDI2OTU5MDgxZSswMCwgKzEuMjYyODg0MTE1MDIwNjQ0ZSswMCwKLSAgICAgKzcuNjE1MTM1MTI0MzA0Mjc0ZS0wMSwgKzUuMjIxMTc5Mzc5NzYxNjk5ZS0wMSwgKzEuMTg2ODAwNjk3NTcxMjEzZS0wMSwKLSAgICAgLTQuNTIzNDY4Mjc1MDczNzAzZS0wMSwgLTcuMDAzNTI0MjYxNjExMDMyZS0wMX0sICAvLyAyNAotICAgIHsrMy45OTg4OTgzNzQ4NTYwNjNlKzAwLCArNC4wNzkwMTc1MTQ1MTk1NjBlKzAwLCArMi44MjI4NTY2MTEwMjQ5NjRlKzAwLAotICAgICArMS43MjYwNzIxMjg0OTU4MDBlKzAwLCArNi40NzE0NDM3NzM0ODYxOTJlLTAxLCAtMy4zMTE0ODUyMTIxNzIzODBlLTAxLAotICAgICAtOC44NDA0MjU3MDg0ODc0OTNlLTAxLCAtMS4xMjY5NzM0MDY0NTQ3ODFlKzAwfSwgIC8vIDI1Ci0gICAgeys1LjA3OTAyNTkzMTg2MzgxM2UtMDEsICsxLjU4ODM4NDQ5Nzg5NTI2NWUrMDAsICsxLjcyODk5MDIzODY5MjA5NGUrMDAsCi0gICAgICsxLjAwNjkyMjMwMjQxNzI1NmUrMDAsICszLjc3MTIxMjMxODE2MzgxNmUtMDEsICs0Ljc2MzcwNzY2ODk5NDk3NmUtMDEsCi0gICAgICsxLjA4NzU0NzQwMzcyMTY5OWUrMDAsICsxLjA4NzU2MjY2MDk5MjIwOWUrMDB9LCAgLy8gMjYKLSAgICB7KzMuMTY4NTY4MjUxMDc1Njg5ZSswMCwgKzMuMjU4NTM0NTgxNTk0MDY1ZSswMCwgKzIuNDIyMzA1OTEzMjg1OTg4ZSswMCwKLSAgICAgKzEuNzk0NDYwNzc2NDMyNjEyZSswMCwgKzEuNTIxNzc5MTA2NTMwODg2ZSswMCwgKzEuMTcxOTY3MDY1Mzc2MDIxZSswMCwKLSAgICAgKzQuODkzOTQ1OTY5ODA2OTUyZS0wMSwgLTYuMjI3OTU3MTU3MTg3Njg1ZS0wMn0sICAvLyAyNwotICAgIHsrMS44OTQxNDc2NjczMTc2MzZlKzAwLCArMS4yNTEwODY5NDYwOTIzMjBlKzAwLCArNS45MDQ1MTIxMDcyMDYyNzVlLTAxLAotICAgICArNi4wODM1ODU4MzI5MzcxMzZlLTAxLCArOC43ODE3MTAxMDAxMTA4MTZlLTAxLCArMS4xMTkxMjUxMDk1MDk0OTZlKzAwLAotICAgICArMS4wMTg1NzY2MTU1MDM0MjFlKzAwLCArNi4yMDQ1Mzg5MTAxMTcyNDFlLTAxfSwgIC8vIDI4Ci0gICAgeys5LjQ4ODgwNjA0NTE3MTg4MWUtMDEsICsyLjEzMjM5NDM5MjQ5OTgyM2UrMDAsICsyLjcyMzQ1MzUwMzQ0Mjc4MGUrMDAsCi0gICAgICsyLjc2OTg2MDc2ODY2NTg3N2UrMDAsICsyLjU0Mjg2OTczMjU0OTQ1NmUrMDAsICsyLjAyMDQ2MjYzODI1MDE5NGUrMDAsCi0gICAgICs4LjMwMDQ1ODU5NDAwOTEwMmUtMDEsIC0yLjc1NTY5MTczODg4MjYzNGUtMDJ9LCAgLy8gMjkKLSAgICB7LTEuODgwMjY3NTcwNDU2Mjc1ZSswMCwgLTEuMjY0MzEwNzI3NTg3MDQ5ZSswMCwgKzMuMTE0MjQ5NzY5Njg2OTg2ZS0wMSwKLSAgICAgKzEuODM2NzAyMTAzMDY0MzAwZSswMCwgKzIuMjU2MzQxOTE4Mzk4NzM4ZSswMCwgKzIuMDQ4MTg5OTg0NjM0NzM1ZSswMCwKLSAgICAgKzIuMTk1MjY4Mzc0NTg1Njc3ZSswMCwgKzIuMDI2NTk2MTM4MzY2MTkzZSswMH0sICAvLyAzMAotICAgIHsrMi40NjM3NTc0NjI3NzEyODllLTAxLCArOS41NTYyMTc3MzM5MzA5OTNlLTAxLCArMS41MjA0Njc3Njc0MTc2NjNlKzAwLAotICAgICArMS45NzY0NzQwMDQxOTQ1NzFlKzAwLCArMS45NDA0Mzg2NzE3NzQ2MTdlKzAwLCArMi4yMzM3NTg0NzI4MjY4NjJlKzAwLAotICAgICArMS45ODgzNTk3Nzc1ODQwNzJlKzAwLCArMS4yNzIzMjY3MjU1NDcwMTBlKzAwfX07ICAvLyAzMQotZG91YmxlIEhGQ0JbMzJdWzhdID0gewotICAgIHsrMi4zMjAyODQxOTEyNDQ2NTBlLTAxLCAtMS4wMDg5MDI3MDYwNDQ1NDdlKzAwLCAtMi4xNDIyMzUwMjc4OTQ3MTRlKzAwLAotICAgICAtMi4zNzUzMzgxMzU3MDY2NDFlKzAwLCAtMi4yMzA0MTkzMzA0OTY1NTFlKzAwLCAtMi4xNzU5NTg4MTIyMzY5NjBlKzAwLAotICAgICAtMi4yOTA2NTkxMzU0MDk5OTllKzAwLCAtMi41MzI4NjM5Nzk3OTg0NTVlKzAwfSwgIC8vIDAKLSAgICB7LTEuMjk1MDM5MzY2NzM2MTc1ZSswMCwgLTEuNzk5Mjk5NjUzODQzMzg1ZSswMCwgLTEuODg3MDMxNDc1MzE1MTg4ZSswMCwKLSAgICAgLTEuODA5OTE2NTk2ODczMzIzZSswMCwgLTEuNzYzNDAwMzg0NzkyMDYxZSswMCwgLTEuODM0MTg0Mjg0Njc5NTAwZSswMCwKLSAgICAgLTEuODA0ODA5ODA2ODc0MDUxZSswMCwgLTEuNzM2Nzk1NDUzMTc0MDEwZSswMH0sICAvLyAxCi0gICAgeysxLjM5Mjg1NzE2MDQ1ODAyN2UtMDEsIC0yLjU4MTg1MTI2MTcxNzUxOWUtMDEsIC02LjUwODA0NTcyNjcwMTEwM2UtMDEsCi0gICAgIC0xLjA2ODE1NzMxNzgxOTY5MmUrMDAsIC0xLjYxOTI4NzQxNTI0MzAyM2UrMDAsIC0yLjE4NzYyNTY2NDQxNzU2NGUrMDAsCi0gICAgIC0yLjYzNzU3NTg2OTM5MDUzN2UrMDAsIC0yLjk3ODk3NzQ5NTc1MDk2M2UrMDB9LCAgLy8gMgotICAgIHstMy4xNjUxMzEwMjE4NTcyNDhlLTAxLCAtNC43Nzc0NzY1NzIwOTgwNTBlLTAxLCAtNS41MTE2MjA3NTg3OTc1NDVlLTAxLAotICAgICAtNC44NDc4ODI4MzM4MTE5NzBlLTAxLCAtMi4zODM4ODM5NDQ1NTgxNDJlLTAxLCAtMS40MzAyNDUwNzI4NTUwMzhlLTAxLAotICAgICArNi44MzE4NjY3MzY0OTA3MzVlLTAyLCArOC44MzA2MTcxNzI4ODA2NjBlLTAyfSwgIC8vIDMKLSAgICB7KzguNzk1MTg0MDUyMjY0OTYyZS0wMSwgKzIuOTgzNDAwOTYwMDcxODg2ZS0wMSwgLTkuMTUzODYzOTY0MDU3MTAxZS0wMSwKLSAgICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMDUgb2YgMTc3Ci0gICAgIC0yLjIwNjQ1OTc0NzM5NzYyMGUrMDAsIC0yLjc0MTQyMTgwOTU5OTUwOWUrMDAsIC0yLjg2MTM5MDc0Mjc2ODkxM2UrMDAsCi0gICAgIC0yLjg4ODQxNTk3MTA1MjcxNGUrMDAsIC0yLjk1MTgyNjA4MjYyNTIwN2UrMDB9LCAgLy8gNAotICAgIHstMi45NjcwMTkyMjQ1NTM3NTFlLTAxLCAtOS43NTAwNDkxOTE3NDU1MjVlLTAxLCAtMS4zNTg1NzUwMDI0Njk5MjZlKzAwLAotICAgICAtOS44MzcyMTEwNTgzNzQ0NDJlLTAxLCAtNi41Mjk1NjkzOTEwMDgwOTBlLTAxLCAtOS44OTk4Njk5MjkyMTgxMDVlLTAxLAotICAgICAtMS42MTQ2NzIyNDU5ODg5OTllKzAwLCAtMi40MDcxMjMwMjM4NTExNjNlKzAwfSwgIC8vIDUKLSAgICB7KzMuNDA5ODExMDA0Njk2OTcxZS0wMSwgKzIuNjg4OTk3ODg5NDYwNTQ1ZS0wMSwgKzUuNjMzMzU2ODQ4MjgwMzI2ZS0wMiwKLSAgICAgKzQuOTkxMTQwNDY4MjY2ODUzZS0wMiwgLTkuNTQxMzA3Mjc0MTQzNjkxZS0wMiwgLTcuNjAxNjYxNDYwODM4ODU0ZS0wMSwKLSAgICAgLTIuMzI3NTgxMjAxNzcwMDY4ZSswMCwgLTMuNzcxNTU0ODUzODU2NTYyZSswMH0sICAvLyA2Ci0gICAgey0xLjQxMjI5NzU5MDc3NTk2OGUrMDAsIC0xLjQ4NTIyMTE5MzQ5ODUxOGUrMDAsIC0xLjE4NjAzNTc5ODM0NzAwMWUrMDAsCi0gICAgIC02LjI1MDAxNjM0NDQxMzUxNmUtMDEsICsxLjUzOTAyNDk3NDY4MzAzNmUtMDEsICs1Ljc2Mzg2NDk3ODEwNzU1M2UtMDEsCi0gICAgICs3Ljk1MDkyNjAzNzk4ODcxNGUtMDEsICs1Ljk2NTY0NjMyMTQ0OTEyNmUtMDF9LCAgLy8gNwotICAgIHstMi4yODgzOTUxMTgyNzM3OTRlLTAxLCAtMy4zMzcxOTA2OTc4NDY2MTZlLTAxLCAtOC4wOTMyMTM1OTMyNDY1NjBlLTAxLAotICAgICAtMS42MzU4Nzg3NjkyMzc5NzNlKzAwLCAtMS44ODQ4NjM5NzMzMDk4MTllKzAwLCAtMS42NDQ5NjY5MTMxNjM1NjJlKzAwLAotICAgICAtMS40MDUxNTc3ODA0NjYxMTZlKzAwLCAtMS40NjY2NjQ3MTMyNjE0NTdlKzAwfSwgIC8vIDgKLSAgICB7LTEuMDcxNDg2Mjg1NDQ0NDg2ZSswMCwgLTEuNDE3NjcwMTU0NTYyNjA2ZSswMCwgLTEuNTQ4OTE3NjIyNjU0NDA3ZSswMCwKLSAgICAgLTEuNDUyOTYwNjI0NzU1MzAzZSswMCwgLTEuMDMxODI5NzAwNjIyNzAxZSswMCwgLTYuOTA2NDI2NDAyNzI1ODQyZS0wMSwKLSAgICAgLTQuMjg4NDM4MDQ1MzIxNzA2ZS0wMSwgLTQuOTQ5NjAyMTU0MDg4NzM2ZS0wMX0sICAvLyA5Ci0gICAgey01LjkwOTg4NTExMTg4MDUxMWUtMDEsIC03LjExNzM3NzU4NTM3NjI4MmUtMDIsICszLjQ1NzE5NTIyOTQ3MzEyN2UtMDEsCi0gICAgICszLjAwNTQ5NDYwOTk2MjUwN2UtMDEsIC0xLjExODY1MjE4Mjk1ODU2OGUrMDAsIC0yLjQ0MDg5MTUxMTQ4MDQ5MGUrMDAsCi0gICAgIC0yLjIyODU0NzMyNDUwNzM0OWUrMDAsIC0xLjg5NTA5MjI4MjEwODUzM2UrMDB9LCAgLy8gMTAKLSAgICB7LTguNDg0MzQwOTg4MzYxNjM5ZS0wMSwgLTUuODMyMjY4MTA3MDg4ODg4ZS0wMSwgKzkuMDA0MjM2ODgxNDI4NzM0ZS0wMiwKLSAgICAgKzguNDUwMjUwMDc1NTY4ODY0ZS0wMSwgKzEuMDY1NzIzODQ1MDE3MTYxZSswMCwgKzcuMzc1ODI5OTkzNzc3NTU1ZS0wMSwKLSAgICAgKzIuNTY1OTA0NTI0NTk5MTIxZS0wMSwgLTQuOTE5NjMzNTk3NjIzNzg0ZS0wMX0sICAvLyAxMQotICAgIHsrMS4xNDA2OTE0NTU2MjM4MjRlKzAwLCArOS42NDAxNjg5MjM5ODI5MjllLTAxLCArMy44MTQ2MTIwNTk4NDc5NzVlLTAxLAotICAgICAtNC44Mjg0OTM0MDYwODk5ODNlLTAxLCAtMS44MTYzMjcyMTI2MDU4ODdlKzAwLCAtMi44MDI3OTUxMjcyODU1NDhlKzAwLAotICAgICAtMy4yMzM4NTcyNDgzMzg2MzhlKzAwLCAtMy40NTkwODcxNDQ5MTQ3MjllKzAwfSwgIC8vIDEyCi0gICAgey0zLjc2MjgzMjM3OTY3NDY0M2UtMDEsICs0LjI1Njc1NDYyMDk2MTA1MmUtMDIsICs1LjE2NTQ3Njk2NTkyMzA1NWUtMDEsCi0gICAgICsyLjUxNzE2ODgxODY0NjI5OGUtMDEsIC0yLjE2MTc5OTY3NTI0MzAzMmUtMDEsIC01LjM0MDc0MDkxMTI0NTA0MmUtMDEsCi0gICAgIC02LjQwNzg2MDk2MjYyMTk1N2UtMDEsIC04LjY5NzQ1MDMyMzc0MTM1MGUtMDF9LCAgLy8gMTMKLSAgICB7KzYuNjUwMDQxMjA1OTg0MDIwZS0wMSwgKzEuMDk3OTA3NjQ2OTA3OTQ1ZSswMCwgKzEuMzgzNDI2NjcxMTIwNzkyZSswMCwKLSAgICAgKzEuMzQzMjczNTg2MjgyODU0ZSswMCwgKzguMjI5Nzg4MzY4NTU5MjIzZS0wMSwgKzIuMTU4NzY3OTg1MTU2Nzg5ZS0wMSwKLSAgICAgLTQuMDQ5MjU3NTMwODAyOTI1ZS0wMSwgLTEuMDcwMjU2MDU4NzA1MjI5ZSswMH0sICAvLyAxNAotICAgIHstOC4yNjI2NTk1Mzk4MjY3OTNlLTAxLCAtNi43MTE4MTIzMjc2NjYwMzRlLTAxLCAtMi4yODQ5NTU5Mjc3OTQ3MTVlLTAxLAotICAgICArNS4xODk4MDg1MjU1MTkzNzNlLTAxLCArMS4zNjcyMTg5NjM0MDI3ODRlKzAwLCArMi4xODAyMzAzODI1MzA5MjJlKzAwLAotICAgICArMi41MzU5NjA5Mjc1MDEwNzFlKzAwLCArMi4yMDEyMTA5ODg2MDAzNjFlKzAwfSwgIC8vIDE1Ci0gICAgeysxLjQxMDA4MzI2ODMyMTcyOWUrMDAsICs3LjU0NDQxOTA3ODM1NDY4NGUtMDEsIC0xLjMwNTUwNTg0OTU4NjMxMGUrMDAsCi0gICAgIC0xLjg3MTMzNzExMzUwOTcwN2UrMDAsIC0xLjI0MDA4Njg1MTU2MzA1NGUrMDAsIC0xLjI2NzEyOTI0ODY2MjczN2UrMDAsCi0gICAgIC0yLjAzNjcwODEzMDAzOTA3MGUrMDAsIC0yLjg5Njg1MTYyMjQyMzgwN2UrMDB9LCAgLy8gMTYKLSAgICB7KzMuNjEzODY4MTc1NzQzNDc2ZS0wMSwgLTIuMTk5OTE3MDU0Mjc4MjU4ZS0wMiwgLTUuNzkzNjg4MzM2MzM4MjQyZS0wMSwKLSAgICAgLTguNzk0Mjc5NjA5NDEwNzAxZS0wMSwgLTguNTA2ODUwMjM0MDgxMTg4ZS0wMSwgLTcuNzkzOTcwNTAxNTU4MTU3ZS0wMSwKLSAgICAgLTcuMzIxODI5MjcyOTE4MjU1ZS0wMSwgLTguODgzNDg1MTQ4MjEyNTQ4ZS0wMX0sICAvLyAxNwotICAgIHsrNC4zNzQ2OTIzOTMzMDMyODdlLTAxLCArMy4wNTQ0MDQxOTYwNTk2MDdlLTAxLCAtNy4zODc4NjU2NjQ3ODM3MzllLTAzLAotICAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDEwNiBvZiAxNzcKLSAgICAgLTQuOTU2NDk4NTQ3MTAyNTIwZS0wMSwgLTguMDY2NTEyNzExMTgzOTI5ZS0wMSwgLTEuMjI0MzE4OTE5ODQ0MDA1ZSswMCwKLSAgICAgLTEuNzAxNTc3NzAwNDMxODEwZSswMCwgLTIuMjQ0OTE5MTM3NTU2MTA4ZSswMH0sICAvLyAxOAotICAgIHsrNi40ODEwMDMxODk5NjUwMjllLTAxLCArNi44MjI5OTEzMzY0MDY3OTVlLTAxLCArMi41MzI0NzQ2NDMzMjk3NTZlLTAxLAotICAgICArNy4zNTg0MjE0Mzc4ODQ2ODhlLTAyLCArMy4xNDIxNjcwOTM4OTAxMDNlLTAxLCArMi4zNDcyOTg4MDkyMzY3OTBlLTAxLAotICAgICArMS40NDYwMDEzNDQ3OTgzNjhlLTAxLCAtNi44MjEyMDE3ODg4MDE3NDRlLTAyfSwgIC8vIDE5Ci0gICAgeysxLjExOTE5ODMzMDkxMzA0MWUrMDAsICsxLjIzNDY1NTMyNTM2MDA0NmUrMDAsICs1Ljg5MTcwMjM4MDg1MzE4MWUtMDEsCi0gICAgIC0xLjM3MTkyNDU5NjUzMTY2NGUrMDAsIC0yLjM3MDk1NzA3MjQxNTc2N2UrMDAsIC0yLjAwNzc5NzgyNjgyMzU5OWUrMDAsCi0gICAgIC0xLjY2Njg4NTQwMjI0Mzk0NmUrMDAsIC0xLjkyNjMxODQ2MjU4NDA1OGUrMDB9LCAgLy8gMjAKLSAgICB7KzEuNDE4NDc0OTcwODcxNzU5ZS0wMSwgLTEuMTA2NjAwNzA2MzMxNTA5ZS0wMSwgLTIuODI4MjQ1OTI1NDM2Mjg3ZS0wMSwKLSAgICAgLTYuNTk4MTM0NzQ2MTQxOTM2ZS0wMywgKzIuODU5MjkyNzk2MjcyMTU4ZS0wMSwgKzQuNjA0NDU1Mjk5NTI5NzEwZS0wMiwKLSAgICAgLTYuMDI1OTY0MTU1Nzc4ODU4ZS0wMSwgLTIuMjY1Njg3Mjg2MzI1NzQ4ZSswMH0sICAvLyAyMQotICAgIHsrNS4wNDA0Njk1NTM5MDI1MTllLTAxLCArOC4yNjk4MjE2Mjk1OTA5NzJlLTAxLCArMS4xMTk4MTIzNjI5MTgyODJlKzAwLAotICAgICArMS4xNzkxNDA0NDMzMjczMzZlKzAwLCArMS4wNzk4NzQyOTE5NzI1OTdlKzAwLCArNi45NzUzNjIzOTA2NzUwMDBlLTAxLAotICAgICAtOS4xMjU0ODgxNzM3MTA4MDhlLTAxLCAtMy41NzY4NDc0NzA2Mjc3MjZlKzAwfSwgIC8vIDIyCi0gICAgey01LjAxMDc2MDUwNDc5MzU2N2UtMDEsIC0zLjI1Njc4MDA2MDgxNDE3MGUtMDEsICsyLjgwNzk4MTk0OTQ3MDc2OGUtMDIsCi0gICAgICsyLjYyMDU0NTU0NzYzMTMyNmUtMDEsICszLjYwNTkwODA2MDg1NzY2OGUtMDEsICs2LjM1NjIzNzIyMDUzNjk5NWUtMDEsCi0gICAgICs5LjU5MDEyNDY3MTc4MTU0NGUtMDEsICsxLjMwNzQ1MTU2Njg4NjUzM2UrMDB9LCAgLy8gMjMKLSAgICB7KzMuNzQ5NzA5ODI3MDk2NDIwZSswMCwgKzEuNTIzNDI2MTE4NDcwNDUyZSswMCwgLTQuNTc3MTU2NjE4OTc4NTQ3ZS0wMSwKLSAgICAgLTcuOTg3MTEwMDgyNDMxOTIzZS0wMSwgLTMuODY4MTkzMjkzMDkxMDAzZS0wMSwgLTMuNzU5MDEwNjIyMzEyMDMyZS0wMSwKLSAgICAgLTYuNTc4MzY4OTk5MzA1Mzc3ZS0wMSwgLTEuMjgxNjM5NjQyNDM2MDI3ZSswMH0sICAvLyAyNAotICAgIHstMS4xNTI1ODk5MDk4MDU0OTFlKzAwLCAtMS4xMDgwMDg4NTkwNjI0MTJlKzAwLCAtNS42MjYxNTExNjUxMjQ3MThlLTAxLAotICAgICAtMi4yMDU2MjEyMzc2NTY3NDZlLTAxLCAtMy40OTg0Mjg4MDMzNjY0MzdlLTAxLCAtNy41MzQzMjc3MDI1MDQ5NTBlLTAxLAotICAgICAtOS44ODU5NjU5MzM5NjM4MzdlLTAxLCAtMS4yODc5MDQ3MTc5MTQ3MTFlKzAwfSwgIC8vIDI1Ci0gICAgeysxLjAyODI3MjQ2NDIyMTM5OGUrMDAsICsxLjA5NzcwNTE5Mzg5ODI4MmUrMDAsICs3LjY4NjQ1NTQ1NzY0Nzc2MGUtMDEsCi0gICAgICsyLjA2MDgxOTc3NzQwNzY1NmUtMDEsIC0zLjQyODA1NzM1MDkxOTk4MmUtMDEsIC03LjU0OTM5NDA0NjI1MzM5N2UtMDEsCi0gICAgIC0xLjA0MTk2MTc3NjMxOTk5OGUrMDAsIC0xLjUwMzM1NjUyOTU1NTI4N2UrMDB9LCAgLy8gMjYKLSAgICB7KzEuMjg4MzE5NzE3MDc4MTc0ZS0wMSwgKzYuODk0MzkzOTUyNjQ4NzgzZS0wMSwgKzEuMTIzNDY5MDUwMDk1NzQ5ZSswMCwKLSAgICAgKzEuMzA5MzQ1MjMxMDY1OTM2ZSswMCwgKzEuMzU1MTE5NjQ3MTM5MzQ1ZSswMCwgKzEuNDIzMTEzODE0NzA3OTkwZSswMCwKLSAgICAgKzEuMTU3MDY0NDkxOTA5MDQ1ZSswMCwgKzQuMDYzMTk0Mzc1MTY4MzgzZS0wMX0sICAvLyAyNwotICAgIHsrMS4zNDAzMzAzMDMzNDc1NjVlKzAwLCArMS4zODk5NjgyNTA2Nzc4OTNlKzAwLCArMS4wNDQ2NzkyMTcwODg4MzNlKzAwLAotICAgICArNi4zNTgyMjc0NjI0NDM2NjZlLTAxLCAtMi43NDczMzc1NTUxODQ4MjNlLTAxLCAtMS41NDkyMzM3MjQzMDY5NTBlKzAwLAotICAgICAtMi40NDIzOTcxMDI3ODAwNjllKzAwLCAtMy4wMjQ1NzYwNjk0NDU1MDJlKzAwfSwgIC8vIDI4Ci0gICAgeysyLjEzODQzMTA1NDE5MzEyNWUrMDAsICs0LjI0NzExMjY3MzAzMTA0MWUrMDAsICsyLjg5NzM0MTA5ODMwNDM5M2UrMDAsCi0gICAgICs5LjMyNzMwNjU4MDI2ODE0OGUtMDEsIC0yLjkyODIyMjQ5NzI5ODA5NmUtMDEsIC04LjEwNDA0Mjk2ODUzMTgyM2UtMDEsCi0gICAgIC03Ljg4ODY4MDk4NzU2NDgyOGUtMDEsIC05LjM1MzUzMTQ4NzYxMzM3N2UtMDF9LCAgLy8gMjkKLSAgICB7KzUuNjQ4MzA0ODczNTUzOTYxZS0wMSwgKzEuNTkxODQ5Nzc5NTg3NDMyZSswMCwgKzIuMzk3NzE2OTkwMTUxNDYyZSswMCwKLSAgICAgKzMuMDM2OTczNDM2MDA3MDQwZSswMCwgKzIuNjY0MjQzNTAzMzcxNTA4ZSswMCwgKzEuMzkzMDQ0ODUwMzI2MDYwZSswMCwKLSAgICAgKzQuMDM4MzQwMjM1OTU3NDU0ZS0wMSwgLTYuNTYyNzA5NzEzMjgxMTM1ZS0wMX0sICAvLyAzMAotICAgIHstNC4yMjQ2MDU0NzU4NjA4NjVlLTAxLCArMy4yNjE0OTYyNTA0OTgwMTFlLTAxLCArMS4zOTE3MTMxMzM0MjI2MTJlKzAwLAotICAgICArMi4yMzE0NjYxNDYzNjQ3MzVlKzAwLCArMi42MTE3OTQ0MjE2OTY4ODFlKzAwLCArMi42NjU0MDM0MDE5NjU3MDJlKzAwLAotICAgICArMi40MDEwMzU1NDEwNTcwNjdlKzAwLCArMS43NTkyMDM3OTY3MDg4MTBlKzAwfSAgLy8gMzEKLX07Ci0vLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDEwNyBvZiAxNzcKLWRvdWJsZSBzbnNfdnFfcmVnX2Fkal9nYWluc1syXSA9IHs4OTE1LjAgLyA0MDk2LjAsIDEyMDU0LjAgLyA0MDk2LjB9OwotZG91YmxlIHNuc192cV9yZWdfbGZfYWRqX2dhaW5zWzRdID0gezYyNDUuMCAvIDQwOTYuMCwgMTUwNDMuMCAvIDQwOTYuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg2MS4wIC8gNDA5Ni4wLCAyMTAxNC4wIC8gNDA5Ni4wfTsKLWRvdWJsZSBzbnNfdnFfbmVhcl9hZGpfZ2FpbnNbNF0gPSB7NzA5OS4wIC8gNDA5Ni4wLCA5MTMyLjAgLyA0MDk2LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMjUzLjAgLyA0MDk2LjAsIDE0ODA4LjAgLyA0MDk2LjB9OwotZG91YmxlIHNuc192cV9mYXJfYWRqX2dhaW5zWzhdID0gewotICAgIDQzMzYuMCAvIDQwOTYuMCwgIDUwNjcuMCAvIDQwOTYuMCwgIDU4OTUuMCAvIDQwOTYuMCwgIDgxNDkuMCAvIDQwOTYuMCwKLSAgICAxMDIzNS4wIC8gNDA5Ni4wLCAxMjgyNS4wIC8gNDA5Ni4wLCAxNjg2OC4wIC8gNDA5Ni4wLCAxOTg4Mi4wIC8gNDA5Ni4wfTsKLWludCBzbnNfZ2Fpbk1TQmJpdHNbNF0gPSB7MSwgMSwgMiwgMn07Ci1pbnQgc25zX2dhaW5MU0JiaXRzWzRdID0gezAsIDEsIDAsIDF9OwotdW5zaWduZWQgaW50IE1QVlFfb2Zmc2V0c1sxNl1bMSArIDEwXSA9IHsKLSAgICAvKiBrPTAsIGs9MSwgaz0yLC4uLiAsIGs9MTAgKi8KLSAgICB7MCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sICAgICAgLyogbj0wKi8KLSAgICB7MCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSwgMTcsIDE5fSwgLyogbj0xKi8KLSAgICB7MCwgMSwgNSwgMTMsIDI1LCA0MSwgNjEsIDg1LCAxMTMsIDE0NSwgMTgxfSwKLSAgICB7MCwgMSwgNywgMjUsIDYzLCAxMjksIDIzMSwgMzc3LCA1NzUsIDgzMywgMTE1OX0sCi0gICAgezAsIDEsIDksIDQxLCAxMjksIDMyMSwgNjgxLCAxMjg5LCAyMjQxLCAzNjQ5LCA1NjQxfSwKLSAgICB7MCwgMSwgMTEsIDYxLCAyMzEsIDY4MSwgMTY4MywgMzY1MywgNzE4MywgMTMwNzMsIDIyMzYzfSwKLSAgICB7MCwgMSwgMTMsIDg1LCAzNzcsIDEyODksIDM2NTMsIDg5ODksIDE5ODI1LCA0MDA4MSwgNzU1MTd9LAotICAgIHswLCAxLCAxNSwgMTEzLCA1NzUsIDIyNDEsIDcxODMsIDE5ODI1LCA0ODYzOSwgMTA4NTQ1LCAyMjQxNDN9LAotICAgIHswLCAxLCAxNywgMTQ1LCA4MzMsIDM2NDksIDEzMDczLCA0MDA4MSwgMTA4NTQ1LCAyNjU3MjksIDU5ODQxN30sCi0gICAgezAsIDEsIDE5LCAxODEsIDExNTksIDU2NDEsIDIyMzYzLCA3NTUxNywgMjI0MTQzLCA1OTg0MTcsIDE0NjI1NjN9LAotICAgIHswLCAxLCAyMSwgMjIxLCAxNTYxLCA4MzYxLCAzNjM2NSwgMTM0MjQ1LCA0MzM5MDUsIDEyNTY0NjUsIDMzMTc0NDV9LAotICAgIHswLCAxLCAyMywgMjY1LCAyMDQ3LCAxMTk2OSwgNTY2OTUsIDIyNzMwNSwgNzk1NDU1LCAyNDg1ODI1LCA3MDU5NzM1fSwKLSAgICB7MCwgMSwgMjUsIDMxMywgMjYyNSwgMTY2NDEsIDg1MzA1LCAzNjkzMDUsIDEzOTIwNjUsIDQ2NzMzNDUsIDE0MjE4OTA1fSwKLSAgICB7MCwgMSwgMjcsIDM2NSwgMzMwMywgMjI1NjksIDEyNDUxNSwgNTc5MTI1LCAyMzQwNDk1LCA4NDA1OTA1LCAyNzI5ODE1NX0sCi0gICAgezAsIDEsIDI5LCA0MjEsIDQwODksIDI5OTYxLCAxNzcwNDUsIDg4MDY4NSwgMzgwMDMwNSwgMTQ1NDY3MDUsCi0gICAgIDUwMjUwNzY1fSwgLyogbj0xNCovCi0gICAgezAsIDEsIDMxLCA0ODEsIDQ5OTEsIDM5MDQxLCAyNDYwNDcsIDEzMDM3NzcsIDU5ODQ3NjcsIDI0MzMxNzc3LAotICAgICA4OTEyOTI0N30sIC8qIG49MTUqLwotfTsKLWRvdWJsZSBEWzE2XVsxNl0gPSB7Ci0gICAgLyogRCBjb25zaXN0cyBvZiB0aGUgYmFzZSB2ZWN0b3JzIG9mIHRoZSBEQ1QgKG9ydGhvZ29uYWxpemVkIERDVC1JSSkqLwotICAgIC8qICh0aGUgRENUIGJhc2UgdmVjdG9yIGFyZSBzdG9yZWQgaW4gY29sdW1uLXdpc2UgaW4gdGhpcyB0YWJsZSkqLwotICAgIC8qIGZpcnN0IHJvdyByZXN1bHRzIGluIHRoZSBmaXJzdCBjb2VmZiBpbiBmd2Qgc3ludGhlc2lzIChkZWMrKGVuYykpKi8KLSAgICAvKiBmaXJzdCBjb2x1bW4gcmVzdWx0cyBpbiB0aGUgZmlyc3QgY29lZmYgaW4gdGhlIGFuYWx5c2lzKGVuY29kZXIpICovCi0gICAgeysyLjUwMDAwMDAwMDAwMDAwMGUtMDEsICszLjUxODUwOTM0MzgxNTk1N2UtMDEsICszLjQ2NzU5OTYxMzMwNTM2OWUtMDEsCi0gICAgICszLjM4MzI5NTAwMjkzNTg4MmUtMDEsICszLjI2NjQwNzQxMjE5MDk0MWUtMDEsICszLjExODA2MjUzMjQ2NjY3OGUtMDEsCi0gICAgICsyLjkzOTY4OTAwNjA0ODM5N2UtMDEsICsyLjczMzAwNDY2NzUwNDM5NGUtMDEsICsyLjUwMDAwMDAwMDAwMDAwMWUtMDEsCi0gICAgICsyLjI0MjkxODk2NTg1NjU5MWUtMDEsICsxLjk2NDIzNzM5NTk2Nzc1NmUtMDEsICsxLjY2NjYzOTE0NjE5NDM2N2UtMDEsCi0gICAgICsxLjM1Mjk5MDI1MDM2NTQ5M2UtMDEsICsxLjAyNjMxMTMxODgwNTg5M2UtMDEsICs2Ljg5NzQ4NDQ4MjA3MzU3OGUtMDIsCi0gICAgICszLjQ2NTQyOTIyOTk3NzI5M2UtMDJ9LCAgLy8gMCBOb3RlOiBuZWVkZWQgYSAnLCcgYXMgY29ycmVjdGlvbiBjb21wYXJlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGQwOXIwMSAoYWxyZWFkeSBmaXhlZCBpbiBkMDlyMDJfRjJGKQotICAgIHsrMi41MDAwMDAwMDAwMDAwMDBlLTAxLCArMy4zODMyOTUwMDI5MzU4ODJlLTAxLCArMi45Mzk2ODkwMDYwNDgzOTdlLTAxLAotICAgICArMi4yNDI5MTg5NjU4NTY1OTFlLTAxLCArMS4zNTI5OTAyNTAzNjU0OTNlLTAxLCArMy40NjU0MjkyMjk5NzcyODZlLTAyLAotICAgICAtNi44OTc0ODQ0ODIwNzM1NzllLTAyLCAtMS42NjY2MzkxNDYxOTQzNjZlLTAxLCAtMi41MDAwMDAwMDAwMDAwMDFlLTAxLAotICAgICAtMy4xMTgwNjI1MzI0NjY2NzhlLTAxLCAtMy40Njc1OTk2MTMzMDUzNjllLTAxLCAtMy41MTg1MDkzNDM4MTU5NTZlLTAxLAotICAgICAtMy4yNjY0MDc0MTIxOTA5NDFlLTAxLCAtMi43MzMwMDQ2Njc1MDQzOTRlLTAxLCAtMS45NjQyMzczOTU5Njc3NTZlLTAxLAotICAgICAtMS4wMjYzMTEzMTg4MDU4OTNlLTAxfSwgIC8vIDEKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDEwOCBvZiAxNzcKLSAgICB7KzIuNTAwMDAwMDAwMDAwMDAwZS0wMSwgKzMuMTE4MDYyNTMyNDY2Njc4ZS0wMSwgKzEuOTY0MjM3Mzk1OTY3NzU2ZS0wMSwKLSAgICAgKzMuNDY1NDI5MjI5OTc3Mjg2ZS0wMiwgLTEuMzUyOTkwMjUwMzY1NDkzZS0wMSwgLTIuNzMzMDA0NjY3NTA0Mzk0ZS0wMSwKLSAgICAgLTMuNDY3NTk5NjEzMzA1MzY5ZS0wMSwgLTMuMzgzMjk1MDAyOTM1ODgyZS0wMSwgLTIuNTAwMDAwMDAwMDAwMDAxZS0wMSwKLSAgICAgLTEuMDI2MzExMzE4ODA1ODk0ZS0wMSwgKzYuODk3NDg0NDgyMDczNTc0ZS0wMiwgKzIuMjQyOTE4OTY1ODU2NTkwZS0wMSwKLSAgICAgKzMuMjY2NDA3NDEyMTkwOTQxZS0wMSwgKzMuNTE4NTA5MzQzODE1OTU3ZS0wMSwgKzIuOTM5Njg5MDA2MDQ4Mzk3ZS0wMSwKLSAgICAgKzEuNjY2NjM5MTQ2MTk0MzY3ZS0wMX0sICAvLyAyCi0gICAgeysyLjUwMDAwMDAwMDAwMDAwMGUtMDEsICsyLjczMzAwNDY2NzUwNDM5NGUtMDEsICs2Ljg5NzQ4NDQ4MjA3MzU3NWUtMDIsCi0gICAgIC0xLjY2NjYzOTE0NjE5NDM2NmUtMDEsIC0zLjI2NjQwNzQxMjE5MDk0MWUtMDEsIC0zLjM4MzI5NTAwMjkzNTg4MmUtMDEsCi0gICAgIC0xLjk2NDIzNzM5NTk2Nzc1NWUtMDEsICszLjQ2NTQyOTIyOTk3NzI4OGUtMDIsICsyLjUwMDAwMDAwMDAwMDAwMWUtMDEsCi0gICAgICszLjUxODUwOTM0MzgxNTk1N2UtMDEsICsyLjkzOTY4OTAwNjA0ODM5N2UtMDEsICsxLjAyNjMxMTMxODgwNTg5M2UtMDEsCi0gICAgIC0xLjM1Mjk5MDI1MDM2NTQ5M2UtMDEsIC0zLjExODA2MjUzMjQ2NjY3OWUtMDEsIC0zLjQ2NzU5OTYxMzMwNTM2OWUtMDEsCi0gICAgIC0yLjI0MjkxODk2NTg1NjU5MGUtMDF9LCAgLy8gMwotICAgIHsrMi41MDAwMDAwMDAwMDAwMDBlLTAxLCArMi4yNDI5MTg5NjU4NTY1OTFlLTAxLCAtNi44OTc0ODQ0ODIwNzM1NzVlLTAyLAotICAgICAtMy4xMTgwNjI1MzI0NjY2NzhlLTAxLCAtMy4yNjY0MDc0MTIxOTA5NDFlLTAxLCAtMS4wMjYzMTEzMTg4MDU4OTRlLTAxLAotICAgICArMS45NjQyMzczOTU5Njc3NTVlLTAxLCArMy41MTg1MDkzNDM4MTU5NTdlLTAxLCArMi41MDAwMDAwMDAwMDAwMDFlLTAxLAotICAgICAtMy40NjU0MjkyMjk5NzcyODJlLTAyLCAtMi45Mzk2ODkwMDYwNDgzOTdlLTAxLCAtMy4zODMyOTUwMDI5MzU4ODJlLTAxLAotICAgICAtMS4zNTI5OTAyNTAzNjU0OTNlLTAxLCArMS42NjY2MzkxNDYxOTQzNjdlLTAxLCArMy40Njc1OTk2MTMzMDUzNjllLTAxLAotICAgICArMi43MzMwMDQ2Njc1MDQzOTRlLTAxfSwgIC8vIDQKLSAgICB7KzIuNTAwMDAwMDAwMDAwMDAwZS0wMSwgKzEuNjY2NjM5MTQ2MTk0MzY2ZS0wMSwgLTEuOTY0MjM3Mzk1OTY3NzU2ZS0wMSwKLSAgICAgLTMuNTE4NTA5MzQzODE1OTU2ZS0wMSwgLTEuMzUyOTkwMjUwMzY1NDkzZS0wMSwgKzIuMjQyOTE4OTY1ODU2NTkxZS0wMSwKLSAgICAgKzMuNDY3NTk5NjEzMzA1MzY5ZS0wMSwgKzEuMDI2MzExMzE4ODA1ODk0ZS0wMSwgLTIuNTAwMDAwMDAwMDAwMDAxZS0wMSwKLSAgICAgLTMuMzgzMjk1MDAyOTM1ODgyZS0wMSwgLTYuODk3NDg0NDgyMDczNTc0ZS0wMiwgKzIuNzMzMDA0NjY3NTA0Mzk0ZS0wMSwKLSAgICAgKzMuMjY2NDA3NDEyMTkwOTQxZS0wMSwgKzMuNDY1NDI5MjI5OTc3Mjg5ZS0wMiwgLTIuOTM5Njg5MDA2MDQ4Mzk3ZS0wMSwKLSAgICAgLTMuMTE4MDYyNTMyNDY2Njc3ZS0wMX0sICAvLyA1Ci0gICAgeysyLjUwMDAwMDAwMDAwMDAwMGUtMDEsICsxLjAyNjMxMTMxODgwNTg5NGUtMDEsIC0yLjkzOTY4OTAwNjA0ODM5N2UtMDEsCi0gICAgIC0yLjczMzAwNDY2NzUwNDM5M2UtMDEsICsxLjM1Mjk5MDI1MDM2NTQ5M2UtMDEsICszLjUxODUwOTM0MzgxNTk1N2UtMDEsCi0gICAgICs2Ljg5NzQ4NDQ4MjA3MzU3OWUtMDIsIC0zLjExODA2MjUzMjQ2NjY3OGUtMDEsIC0yLjUwMDAwMDAwMDAwMDAwMWUtMDEsCi0gICAgICsxLjY2NjYzOTE0NjE5NDM2NmUtMDEsICszLjQ2NzU5OTYxMzMwNTM2OWUtMDEsICszLjQ2NTQyOTIyOTk3NzI5M2UtMDIsCi0gICAgIC0zLjI2NjQwNzQxMjE5MDk0MWUtMDEsIC0yLjI0MjkxODk2NTg1NjU5MWUtMDEsICsxLjk2NDIzNzM5NTk2Nzc1NmUtMDEsCi0gICAgICszLjM4MzI5NTAwMjkzNTg4MmUtMDF9LCAgLy8gNgotICAgIHsrMi41MDAwMDAwMDAwMDAwMDBlLTAxLCArMy40NjU0MjkyMjk5NzcyODdlLTAyLCAtMy40Njc1OTk2MTMzMDUzNjllLTAxLAotICAgICAtMS4wMjYzMTEzMTg4MDU4OTNlLTAxLCArMy4yNjY0MDc0MTIxOTA5NDFlLTAxLCArMS42NjY2MzkxNDYxOTQzNjZlLTAxLAotICAgICAtMi45Mzk2ODkwMDYwNDgzOTdlLTAxLCAtMi4yNDI5MTg5NjU4NTY1OTFlLTAxLCArMi41MDAwMDAwMDAwMDAwMDFlLTAxLAotICAgICArMi43MzMwMDQ2Njc1MDQzOTNlLTAxLCAtMS45NjQyMzczOTU5Njc3NTZlLTAxLCAtMy4xMTgwNjI1MzI0NjY2NzhlLTAxLAotICAgICArMS4zNTI5OTAyNTAzNjU0OTNlLTAxLCArMy4zODMyOTUwMDI5MzU4ODJlLTAxLCAtNi44OTc0ODQ0ODIwNzM1NzhlLTAyLAotICAgICAtMy41MTg1MDkzNDM4MTU5NTZlLTAxfSwgIC8vIDcKLSAgICB7KzIuNTAwMDAwMDAwMDAwMDAwZS0wMSwgLTMuNDY1NDI5MjI5OTc3Mjg3ZS0wMiwgLTMuNDY3NTk5NjEzMzA1MzY5ZS0wMSwKLSAgICAgKzEuMDI2MzExMzE4ODA1ODkzZS0wMSwgKzMuMjY2NDA3NDEyMTkwOTQxZS0wMSwgLTEuNjY2NjM5MTQ2MTk0MzY2ZS0wMSwKLSAgICAgLTIuOTM5Njg5MDA2MDQ4Mzk3ZS0wMSwgKzIuMjQyOTE4OTY1ODU2NTkxZS0wMSwgKzIuNTAwMDAwMDAwMDAwMDAxZS0wMSwKLSAgICAgLTIuNzMzMDA0NjY3NTA0MzkzZS0wMSwgLTEuOTY0MjM3Mzk1OTY3NzU2ZS0wMSwgKzMuMTE4MDYyNTMyNDY2Njc4ZS0wMSwKLSAgICAgKzEuMzUyOTkwMjUwMzY1NDkzZS0wMSwgLTMuMzgzMjk1MDAyOTM1ODgyZS0wMSwgLTYuODk3NDg0NDgyMDczNTc4ZS0wMiwKLSAgICAgKzMuNTE4NTA5MzQzODE1OTU2ZS0wMX0sICAvLyA4Ci0gICAgeysyLjUwMDAwMDAwMDAwMDAwMGUtMDEsIC0xLjAyNjMxMTMxODgwNTg5NGUtMDEsIC0yLjkzOTY4OTAwNjA0ODM5N2UtMDEsCi0gICAgICsyLjczMzAwNDY2NzUwNDM5M2UtMDEsICsxLjM1Mjk5MDI1MDM2NTQ5M2UtMDEsIC0zLjUxODUwOTM0MzgxNTk1N2UtMDEsCi0gICAgICs2Ljg5NzQ4NDQ4MjA3MzU3OWUtMDIsICszLjExODA2MjUzMjQ2NjY3OGUtMDEsIC0yLjUwMDAwMDAwMDAwMDAwMWUtMDEsCi0gICAgIC0xLjY2NjYzOTE0NjE5NDM2NmUtMDEsICszLjQ2NzU5OTYxMzMwNTM2OWUtMDEsIC0zLjQ2NTQyOTIyOTk3NzI5M2UtMDIsCi0gICAgIC0zLjI2NjQwNzQxMjE5MDk0MWUtMDEsICsyLjI0MjkxODk2NTg1NjU5MWUtMDEsICsxLjk2NDIzNzM5NTk2Nzc1NmUtMDEsCi0gICAgIC0zLjM4MzI5NTAwMjkzNTg4MmUtMDF9LCAgLy8gOQotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTA5IG9mIDE3NwotICAgIHsrMi41MDAwMDAwMDAwMDAwMDBlLTAxLCAtMS42NjY2MzkxNDYxOTQzNjZlLTAxLCAtMS45NjQyMzczOTU5Njc3NTZlLTAxLAotICAgICArMy41MTg1MDkzNDM4MTU5NTZlLTAxLCAtMS4zNTI5OTAyNTAzNjU0OTNlLTAxLCAtMi4yNDI5MTg5NjU4NTY1OTFlLTAxLAotICAgICArMy40Njc1OTk2MTMzMDUzNjllLTAxLCAtMS4wMjYzMTEzMTg4MDU4OTRlLTAxLCAtMi41MDAwMDAwMDAwMDAwMDFlLTAxLAotICAgICArMy4zODMyOTUwMDI5MzU4ODJlLTAxLCAtNi44OTc0ODQ0ODIwNzM1NzRlLTAyLCAtMi43MzMwMDQ2Njc1MDQzOTRlLTAxLAotICAgICArMy4yNjY0MDc0MTIxOTA5NDFlLTAxLCAtMy40NjU0MjkyMjk5NzcyODllLTAyLCAtMi45Mzk2ODkwMDYwNDgzOTdlLTAxLAotICAgICArMy4xMTgwNjI1MzI0NjY2NzdlLTAxfSwgIC8vIDEwCi0gICAgeysyLjUwMDAwMDAwMDAwMDAwMGUtMDEsIC0yLjI0MjkxODk2NTg1NjU5MWUtMDEsIC02Ljg5NzQ4NDQ4MjA3MzU3NWUtMDIsCi0gICAgICszLjExODA2MjUzMjQ2NjY3OGUtMDEsIC0zLjI2NjQwNzQxMjE5MDk0MWUtMDEsICsxLjAyNjMxMTMxODgwNTg5NGUtMDEsCi0gICAgICsxLjk2NDIzNzM5NTk2Nzc1NWUtMDEsIC0zLjUxODUwOTM0MzgxNTk1N2UtMDEsICsyLjUwMDAwMDAwMDAwMDAwMWUtMDEsCi0gICAgICszLjQ2NTQyOTIyOTk3NzI4MmUtMDIsIC0yLjkzOTY4OTAwNjA0ODM5N2UtMDEsICszLjM4MzI5NTAwMjkzNTg4MmUtMDEsCi0gICAgIC0xLjM1Mjk5MDI1MDM2NTQ5M2UtMDEsIC0xLjY2NjYzOTE0NjE5NDM2N2UtMDEsICszLjQ2NzU5OTYxMzMwNTM2OWUtMDEsCi0gICAgIC0yLjczMzAwNDY2NzUwNDM5NGUtMDF9LCAgLy8gMTEKLSAgICB7KzIuNTAwMDAwMDAwMDAwMDAwZS0wMSwgLTIuNzMzMDA0NjY3NTA0Mzk0ZS0wMSwgKzYuODk3NDg0NDgyMDczNTc1ZS0wMiwKLSAgICAgKzEuNjY2NjM5MTQ2MTk0MzY2ZS0wMSwgLTMuMjY2NDA3NDEyMTkwOTQxZS0wMSwgKzMuMzgzMjk1MDAyOTM1ODgyZS0wMSwKLSAgICAgLTEuOTY0MjM3Mzk1OTY3NzU1ZS0wMSwgLTMuNDY1NDI5MjI5OTc3Mjg4ZS0wMiwgKzIuNTAwMDAwMDAwMDAwMDAxZS0wMSwKLSAgICAgLTMuNTE4NTA5MzQzODE1OTU3ZS0wMSwgKzIuOTM5Njg5MDA2MDQ4Mzk3ZS0wMSwgLTEuMDI2MzExMzE4ODA1ODkzZS0wMSwKLSAgICAgLTEuMzUyOTkwMjUwMzY1NDkzZS0wMSwgKzMuMTE4MDYyNTMyNDY2Njc5ZS0wMSwgLTMuNDY3NTk5NjEzMzA1MzY5ZS0wMSwKLSAgICAgKzIuMjQyOTE4OTY1ODU2NTkwZS0wMX0sICAvLyAxMgotICAgIHsrMi41MDAwMDAwMDAwMDAwMDBlLTAxLCAtMy4xMTgwNjI1MzI0NjY2NzhlLTAxLCArMS45NjQyMzczOTU5Njc3NTZlLTAxLAotICAgICAtMy40NjU0MjkyMjk5NzcyODZlLTAyLCAtMS4zNTI5OTAyNTAzNjU0OTNlLTAxLCArMi43MzMwMDQ2Njc1MDQzOTRlLTAxLAotICAgICAtMy40Njc1OTk2MTMzMDUzNjllLTAxLCArMy4zODMyOTUwMDI5MzU4ODJlLTAxLCAtMi41MDAwMDAwMDAwMDAwMDFlLTAxLAotICAgICArMS4wMjYzMTEzMTg4MDU4OTRlLTAxLCArNi44OTc0ODQ0ODIwNzM1NzRlLTAyLCAtMi4yNDI5MTg5NjU4NTY1OTBlLTAxLAotICAgICArMy4yNjY0MDc0MTIxOTA5NDFlLTAxLCAtMy41MTg1MDkzNDM4MTU5NTdlLTAxLCArMi45Mzk2ODkwMDYwNDgzOTdlLTAxLAotICAgICAtMS42NjY2MzkxNDYxOTQzNjdlLTAxfSwgIC8vIDEzCi0gICAgeysyLjUwMDAwMDAwMDAwMDAwMGUtMDEsIC0zLjM4MzI5NTAwMjkzNTg4MmUtMDEsICsyLjkzOTY4OTAwNjA0ODM5N2UtMDEsCi0gICAgIC0yLjI0MjkxODk2NTg1NjU5MWUtMDEsICsxLjM1Mjk5MDI1MDM2NTQ5M2UtMDEsIC0zLjQ2NTQyOTIyOTk3NzI4NmUtMDIsCi0gICAgIC02Ljg5NzQ4NDQ4MjA3MzU3OWUtMDIsICsxLjY2NjYzOTE0NjE5NDM2NmUtMDEsIC0yLjUwMDAwMDAwMDAwMDAwMWUtMDEsCi0gICAgICszLjExODA2MjUzMjQ2NjY3OGUtMDEsIC0zLjQ2NzU5OTYxMzMwNTM2OWUtMDEsICszLjUxODUwOTM0MzgxNTk1NmUtMDEsCi0gICAgIC0zLjI2NjQwNzQxMjE5MDk0MWUtMDEsICsyLjczMzAwNDY2NzUwNDM5NGUtMDEsIC0xLjk2NDIzNzM5NTk2Nzc1NmUtMDEsCi0gICAgICsxLjAyNjMxMTMxODgwNTg5M2UtMDF9LCAgLy8gMTQKLSAgICB7KzIuNTAwMDAwMDAwMDAwMDAwZS0wMSwgLTMuNTE4NTA5MzQzODE1OTU3ZS0wMSwgKzMuNDY3NTk5NjEzMzA1MzY5ZS0wMSwKLSAgICAgLTMuMzgzMjk1MDAyOTM1ODgyZS0wMSwgKzMuMjY2NDA3NDEyMTkwOTQxZS0wMSwgLTMuMTE4MDYyNTMyNDY2Njc4ZS0wMSwKLSAgICAgKzIuOTM5Njg5MDA2MDQ4Mzk3ZS0wMSwgLTIuNzMzMDA0NjY3NTA0Mzk0ZS0wMSwgKzIuNTAwMDAwMDAwMDAwMDAxZS0wMSwKLSAgICAgLTIuMjQyOTE4OTY1ODU2NTkxZS0wMSwgKzEuOTY0MjM3Mzk1OTY3NzU2ZS0wMSwgLTEuNjY2NjM5MTQ2MTk0MzY3ZS0wMSwKLSAgICAgKzEuMzUyOTkwMjUwMzY1NDkzZS0wMSwgLTEuMDI2MzExMzE4ODA1ODkzZS0wMSwgKzYuODk3NDg0NDgyMDczNTc4ZS0wMiwKLSAgICAgLTMuNDY1NDI5MjI5OTc3MjkzZS0wMn19OyAgLy8gMTUKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9TbnNRdWFudGl6YXRpb25UYWJsZXMuaHBwIGIvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL1Nuc1F1YW50aXphdGlvblRhYmxlcy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDQ3MzkuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9Db21tb24vVGFibGVzL1Nuc1F1YW50aXphdGlvblRhYmxlcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogU25zUXVhbnRpemF0aW9uVGFibGVzLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNOU19RVUFOVElaQVRJT05fVEFCTEVTX0hfCi0jZGVmaW5lIFNOU19RVUFOVElaQVRJT05fVEFCTEVTX0hfCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjMgU05TIFF1YW50aXphdGlvbgotCi0vLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDRfKmltcGxlbWVudG9yQ29tbWVudHMqCi0vLyBTZWN0aW9uIDMuNy40IFNOUyBRdWFudGl6YXRpb24KLQotZXh0ZXJuIGRvdWJsZSBMRkNCWzMyXVs4XTsKLWV4dGVybiBkb3VibGUgSEZDQlszMl1bOF07Ci1leHRlcm4gZG91YmxlIHNuc192cV9yZWdfYWRqX2dhaW5zWzJdOwotZXh0ZXJuIGRvdWJsZSBzbnNfdnFfcmVnX2xmX2Fkal9nYWluc1s0XTsKLWV4dGVybiBkb3VibGUgc25zX3ZxX25lYXJfYWRqX2dhaW5zWzRdOwotZXh0ZXJuIGRvdWJsZSBzbnNfdnFfZmFyX2Fkal9nYWluc1s4XTsKLWV4dGVybiBpbnQgc25zX2dhaW5NU0JiaXRzWzRdOwotZXh0ZXJuIGludCBzbnNfZ2FpbkxTQmJpdHNbNF07Ci1leHRlcm4gdW5zaWduZWQgaW50IE1QVlFfb2Zmc2V0c1sxNl1bMSArIDEwXTsKLWV4dGVybiBkb3VibGUgRFsxNl1bMTZdOwotCi0jZW5kaWYgIC8vIFNOU19RVUFOVElaQVRJT05fVEFCTEVTX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvU3BlY3RyYWxEYXRhVGFibGVzLmNwcCBiL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9TcGVjdHJhbERhdGFUYWJsZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ2YjE1Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9TcGVjdHJhbERhdGFUYWJsZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzA2ICswLDAgQEAKLS8qCi0gKiBTcGVjdHJhbERhdGFUYWJsZXMuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjYgU3BlY3RyYWwgZGF0YQotI2luY2x1ZGUgIlNwZWN0cmFsRGF0YVRhYmxlcy5ocHAiCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTE0IG9mIDE3NwotdW5zaWduZWQgY2hhciBhY19zcGVjX2xvb2t1cFs0MDk2XSA9IHsKLSAgICAweDAxLCAweDI3LCAweDA3LCAweDE5LCAweDE2LCAweDE2LCAweDFDLCAweDE2LCAweDE2LCAweDE2LCAweDE2LCAweDFDLAotICAgIDB4MUMsIDB4MUMsIDB4MjIsIDB4MUYsIDB4MUYsIDB4MjgsIDB4MkIsIDB4MkUsIDB4MzEsIDB4MzQsIDB4MEUsIDB4MTEsCi0gICAgMHgyNCwgMHgyNCwgMHgyNCwgMHgyNiwgMHgwMCwgMHgzOSwgMHgyNiwgMHgxNiwgMHgwMCwgMHgwOCwgMHgwOSwgMHgwQiwKLSAgICAweDJGLCAweDBFLCAweDBFLCAweDExLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTE1IG9mIDE3NwotICAgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MjYsIDB4M0IsIDB4M0IsIDB4MjYsIDB4MTYsIDB4MTYsIDB4MUEsIDB4MkUsIDB4MUQsCi0gICAgMHgxRSwgMHgyMCwgMHgyMSwgMHgyMywgMHgyNCwgMHgyNCwgMHgyNCwgMHgyNiwgMHgwMCwgMHgzQiwgMHgxNywgMHgxNiwKLSAgICAweDJFLCAweDJFLCAweDJELCAweDJGLCAweDMwLCAweDMyLCAweDMyLCAweDEyLCAweDM2LCAweDM2LCAweDM2LCAweDI2LAotICAgIDB4M0IsIDB4M0IsIDB4M0IsIDB4MTYsIDB4MDAsIDB4M0UsIDB4M0YsIDB4MDMsIDB4MjEsIDB4MDIsIDB4MDIsIDB4M0QsCi0gICAgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNSwgMHgzQiwgMHgzQiwgMHgyNywgMHgxQywgMHgxQywgMHgzRiwgMHgzRiwgMHgwMywKLSAgICAweDIxLCAweDAyLCAweDAyLCAweDNELCAweDI2LCAweDI2LCAweDI2LCAweDE1LCAweDNCLCAweDNCLCAweDI3LCAweDFDLAotICAgIDB4MUMsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDIsIDB4MTIsIDB4M0QsIDB4MTQsIDB4MTUsIDB4MTUsIDB4MTUsIDB4M0IsCi0gICAgMHgyNywgMHgyNywgMHgwNywgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMiwKLSAgICAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDMzLCAweDMzLCAweDMzLAotICAgIDB4MzUsIDB4MzYsIDB4MTQsIDB4MjYsIDB4MjYsIDB4MzksIDB4MjcsIDB4MjcsIDB4MjcsIDB4MDcsIDB4MTgsIDB4MjIsCi0gICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKLSAgICAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDM4LCAweDI2LCAweDM5LAotICAgIDB4MzksIDB4M0IsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MkEsIDB4MkEsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDA1LCAweDA0LCAweDA0LCAweDA1LCAweDE1LCAweDE1LCAweDNCLCAweDA3LCAweDA3LCAweDA3LCAweDA3LAotICAgIDB4MTksIDB4MTksIDB4MTksIDB4MjIsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MTcsIDB4MTcsIDB4MjcsCi0gICAgMHgwNywgMHgwNywgMHgwNywgMHgyQSwgMHgxOSwgMHgxOSwgMHgxNiwgMHgxRiwgMHgxRiwgMHgyNywgMHgyNywgMHgyNywKLSAgICAweDI3LCAweDA3LCAweDA3LCAweDJBLCAweDAwLCAweDE5LCAweDE2LCAweDE2LCAweDE2LCAweDFDLCAweDIyLCAweDFGLAotICAgIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzcsCi0gICAgMHgzNywgMHgzNywgMHgzNywgMHgzNywgMHgzNywgMHgzNywgMHgyOCwgMHgwOCwgMHgwOSwgMHgzMSwgMHgzMSwgMHgzNCwKLSAgICAweDExLCAweDExLCAweDExLCAweDA0LCAweDAwLCAweDE0LCAweDExLCAweDNDLCAweDI4LCAweDI4LCAweDA4LCAweDJCLAotICAgIDB4MUIsIDB4MzEsIDB4MzEsIDB4MEUsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MjQsIDB4MkEsIDB4MkEsIDB4MTEsIDB4MzksCi0gICAgMHgzOSwgMHgyOCwgMHgwOCwgMHgxQSwgMHgxQiwgMHgzMSwgMHgwQywgMHgwRSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgyNCwKLSAgICAweDAwLCAweDI2LCAweDI0LCAweDAxLCAweDA4LCAweDA4LCAweDJCLCAweDA5LCAweDBCLCAweDMxLCAweDBDLCAweDBFLAotICAgIDB4MEUsIDB4MjEsIDB4MzIsIDB4MzIsIDB4MzIsIDB4M0QsIDB4MjQsIDB4MjcsIDB4MDgsIDB4MDgsIDB4MkIsIDB4MkUsCi0gICAgMHgzMSwgMHgzNCwgMHgxRSwgMHgwRSwgMHgwRSwgMHgyMSwgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwgMHgxMiwgMHgxOSwKLSAgICAweDA4LCAweDA4LCAweDJCLCAweDJFLCAweDMxLCAweDM0LCAweDFFLCAweDBFLCAweDBFLCAweDEyLCAweDA1LCAweDA1LAotICAgIDB4MDUsIDB4M0QsIDB4MTIsIDB4MTcsIDB4MkIsIDB4MkIsIDB4MkIsIDB4MDksIDB4MzEsIDB4MzQsIDB4MDMsIDB4MEUsCi0gICAgMHgwRSwgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwgMHgzRCwgMHgxMSwgMHgxOCwgMHgyQiwgMHgyQiwgMHgyQiwgMHgyQiwKLSAgICAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLCAweDJCLAotICAgIDB4MkIsIDB4MkIsIDB4MkIsIDB4MDksIDB4MEIsIDB4MzQsIDB4MzQsIDB4MEUsIDB4MEUsIDB4MTEsIDB4M0QsIDB4M0QsCi0gICAgMHgzRCwgMHgzNiwgMHgxMSwgMHgyNywgMHgyRCwgMHgyRCwgMHgyRCwgMHgyRCwgMHgyRCwgMHgyRCwgMHgyRCwgMHgyRCwKLSAgICAweDJELCAweDJELCAweDJELCAweDJELCAweDJELCAweDJELCAweDJELCAweDJELCAweDJELCAweDJELCAweDJDLCAweDFCLAotICAgIDB4MUQsIDB4MzQsIDB4MzAsIDB4MzQsIDB4MzQsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MDIsIDB4MTEsIDB4MDcsCi0gICAgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwgMHgxQiwKLSAgICAweDFCLCAweDFCLCAweDFCLCAweDFCLCAweDFCLCAweDFCLCAweDA5LCAweDFCLCAweDFCLCAweDBDLCAweDM0LCAweDBFLAotICAgIDB4MEUsIDB4M0EsIDB4MjksIDB4MjksIDB4MjksIDB4MDYsIDB4MTEsIDB4MjUsIDB4MDksIDB4MDksIDB4MDksIDB4MUIsCi0gICAgMHgwQiwgMHgzMSwgMHgwQywgMHgzNCwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDExNiBvZiAxNzcKLSAgICAweDBFLCAweDBFLCAweDBFLCAweDMyLCAweDAwLCAweDM1LCAweDExLCAweDFDLCAweDM0LCAweDM0LCAweDMxLCAweDM0LAotICAgIDB4MEMsIDB4MzQsIDB4MUUsIDB4MEUsIDB4MEUsIDB4MTEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MjYsIDB4MjYsIDB4MjIsCi0gICAgMHgxRiwgMHgyMiwgMHgyMiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKLSAgICAweDEzLCAweDEzLCAweDFGLCAweDEzLCAweDJDLCAweDJDLCAweDNFLCAweDFFLCAweDIwLCAweDNBLCAweDIzLCAweDI0LAotICAgIDB4MjQsIDB4MjYsIDB4MDAsIDB4M0IsIDB4MDcsIDB4MDcsIDB4MjcsIDB4MjIsIDB4MjIsIDB4MkQsIDB4MkYsIDB4MzAsCi0gICAgMHgyMSwgMHgyMywgMHgyMywgMHgyNCwgMHgyNiwgMHgyNiwgMHgyNiwgMHgzQiwgMHgwNywgMHgwNywgMHgyNywgMHgyMiwKLSAgICAweDIyLCAweDNFLCAweDFFLCAweDBGLCAweDMyLCAweDM1LCAweDM1LCAweDM2LCAweDE1LCAweDE1LCAweDE1LCAweDNCLAotICAgIDB4MDcsIDB4MDcsIDB4MDcsIDB4MjIsIDB4MUUsIDB4MUUsIDB4MzAsIDB4MjEsIDB4M0EsIDB4MTIsIDB4MTIsIDB4MzgsCi0gICAgMHgxNywgMHgxNywgMHgxNywgMHgzQiwgMHgwNywgMHgwNywgMHgxOCwgMHgyMiwgMHgyMiwgMHgwNiwgMHgwNiwgMHgzQSwKLSAgICAweDM1LCAweDM2LCAweDM2LCAweDE1LCAweDNCLCAweDNCLCAweDNCLCAweDI3LCAweDA3LCAweDA3LCAweDJBLCAweDIyLAotICAgIDB4MDYsIDB4MDYsIDB4MjEsIDB4M0EsIDB4MzUsIDB4MzYsIDB4M0QsIDB4MTUsIDB4M0IsIDB4M0IsIDB4M0IsIDB4MjcsCi0gICAgMHgwNywgMHgwNywgMHgyQSwgMHgyMiwgMHgyMiwgMHgzMywgMHgzMywgMHgzNSwgMHgzNiwgMHgzOCwgMHgzOCwgMHgzOSwKLSAgICAweDI3LCAweDI3LCAweDI3LCAweDA3LCAweDJBLCAweDJBLCAweDE5LCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLAotICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsCi0gICAgMHgxRiwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNSwgMHgxNywgMHgxNywgMHgyNywgMHgwNywgMHgwNywgMHgwNywgMHgyQSwKLSAgICAweDE5LCAweDE5LCAweDE2LCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLAotICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MDUsIDB4MDUsIDB4MDUsCi0gICAgMHgwNSwgMHgzOSwgMHgzOSwgMHgyNywgMHgxOCwgMHgxOCwgMHgxOCwgMHgyQSwgMHgxNiwgMHgxNiwgMHgxQywgMHgxRiwKLSAgICAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLAotICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjcsIDB4MjcsIDB4MDcsCi0gICAgMHgyQSwgMHgyQSwgMHgyQSwgMHgxOSwgMHgxQywgMHgxQywgMHgxQywgMHgxRiwgMHgxRiwgMHgyOSwgMHgyOSwgMHgyOSwKLSAgICAweDI5LCAweDI3LCAweDI3LCAweDE4LCAweDE5LCAweDE5LCAweDE5LCAweDE2LCAweDFDLCAweDFDLCAweDIyLCAweDFGLAotICAgIDB4MUYsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MUMsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsCi0gICAgMHgyMiwgMHgyMiwgMHgxRiwgMHgxMywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKLSAgICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDBCLAotICAgIDB4MkYsIDB4MjAsIDB4MzIsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MjcsIDB4M0IsIDB4MjIsCi0gICAgMHgxQSwgMHgxQSwgMHgxQiwgMHgxRCwgMHgxRSwgMHgyMSwgMHgzMiwgMHgxMiwgMHgxMiwgMHgxNCwgMHgzOSwgMHgzOSwKLSAgICAweDM5LCAweDNCLCAweDNCLCAweDIyLCAweDFCLCAweDFCLCAweDBCLCAweDBDLCAweDMwLCAweDMyLCAweDNBLCAweDNELAotICAgIDB4M0QsIDB4MzgsIDB4MzksIDB4MzksIDB4MzksIDB4M0IsIDB4MjcsIDB4MjIsIDB4MkQsIDB4MkQsIDB4MEMsIDB4MUUsCi0gICAgMHgyMCwgMHgwMiwgMHgwMiwgMHgzRCwgMHgyNiwgMHgyNiwgMHgyNiwgMHgzOSwgMHgwMCwgMHgzQiwgMHgyNywgMHgyMiwKLSAgICAweDNGLCAweDNGLCAweDAzLCAweDIwLCAweDNBLCAweDEyLCAweDEyLCAweDE0LCAweDE1LCAweDE1LCAweDE1LCAweDNCLAotICAgIDB4MjcsIDB4MjcsIDB4MDcsIDB4MUYsIDB4MUYsIDB4MDMsIDB4MDMsIDB4MjEsIDB4M0EsIDB4MTIsIDB4MTIsIDB4MTQsCi0gICAgMHgxNSwgMHgxNSwgMHgxNSwgMHgzQiwgMHgwNywgMHgwNywgMHgwNywgMHgxRiwgMHgwNiwgMHgwNiwgMHgzMywgMHgzMywKLSAgICAweDM1LCAweDM2LCAweDM2LCAweDI2LCAweDM5LCAweDM5LCAweDM5LCAweDI3LCAweDA3LCAweDA3LCAweDJBLCAweDFGLAotICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsCi0gICAgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgzMywgMHgzNSwgMHgzNSwgMHgzNiwgMHgzOCwgMHgzOCwgMHgzOSwKLSAgICAweDNCLCAweDNCLCAweDNCLCAweDA3LCAweDE4LCAweDE4LCAweDE5LCAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDFGLAotICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMTcgb2YgMTc3Ci0gICAgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgwNCwgMHgwNCwgMHgwNCwKLSAgICAweDM2LCAweDE1LCAweDE1LCAweDM5LCAweDI3LCAweDI3LCAweDI3LCAweDA3LCAweDJBLCAweDJBLCAweDE2LCAweDFGLAotICAgIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsCi0gICAgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgxRiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgxNywgMHgxNywgMHgzQiwKLSAgICAweDA3LCAweDA3LCAweDA3LCAweDJBLCAweDE2LCAweDE2LCAweDFDLCAweDFGLCAweDFGLCAweDA0LCAweDA0LCAweDA0LAotICAgIDB4MDUsIDB4MTcsIDB4MTcsIDB4MjcsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTksIDB4MUMsIDB4MUMsIDB4MjIsIDB4MUYsCi0gICAgMHgxRiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgxQywgMHgyMiwgMHgyMiwgMHgyMiwgMHgxRiwKLSAgICAweDFGLCAweDFGLCAweDFGLCAweDEzLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgzQywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MEQsIDB4M0MsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDNDLAotICAgIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDNDLCAweDNDLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsCi0gICAgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywKLSAgICAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsCi0gICAgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywKLSAgICAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsCi0gICAgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDNDLAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywKLSAgICAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgzQywKLSAgICAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MEQsIDB4M0MsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTE4IG9mIDE3NwotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwRCwgMHgzQywKLSAgICAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLAotICAgIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsIDB4MDAsCi0gICAgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCi0gICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyNSwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDNDLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDNDLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsIDB4MTAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDNDLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgxMCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywgMHgzQywgMHgxMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgzQywgMHgzQywgMHgxMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDNDLCAweDEwLCAweDNDLCAweDNDLCAweDNDLCAweDNDLAotICAgIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjUsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDExOSBvZiAxNzcKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MTAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgxMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4M0MsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDNDLCAweDEwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDNDLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAotICAgIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCi0gICAgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDNDLCAweDNDLCAweDNDLCAweDEwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCi0gICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgyNSwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMjAgb2YgMTc3Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsCi0gICAgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDBELCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNDLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MEQsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsCi0gICAgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELAotICAgIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsCi0gICAgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTIxIG9mIDE3NwotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgzQywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDNDLAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgzQywgMHgzQywgMHgzQywgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKLSAgICAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MEQsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDNDLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDBELCAweDBELCAweDBELCAweDNDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgzQywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4M0MsIDB4M0MsIDB4M0MsCi0gICAgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAvLyBMQzMgU3BlY2lmaWNhdGlvbiBkMDlyMDEucGRmOyBQYWdlIDEyMiBvZiAxNzcKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDBELCAweDBELCAweDAwLCAweDAwLAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsCi0gICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwKLSAgICAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELCAweDBELAotICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwRCwgMHgzQywgMHgzQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMjMgb2YgMTc3Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDBELCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTI0IG9mIDE3NwotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci1zaG9ydCBhY19zcGVjX2N1bWZyZXFbNjRdWzE3XSA9IHsKLSAgICB7MCwgMSwgMiwgMTc3LCAyMjUsIDIyNiwgMjI3LCAzMzYsIDM3MiwgNTQzLCA2NTIsIDY5OSwgNzE5LCA3NjgsIDgwNCwgODI0LAotICAgICA4MzR9LAotICAgIHswLCAxOCwgNDQsIDYxLCA3MSwgOTgsIDEzNSwgMTU5LCAxNzUsIDE5NywgMjI5LCAyNTEsIDI2NSwgMjgyLCAzMDgsIDMyOCwKLSAgICAgMzQxfSwKLSAgICB7MCwgNzEsIDE2MywgMjEyLCAyMzcsIDMxOCwgNDIwLCA0ODEsIDUxNCwgNTU2LCA2MTMsIDY1MiwgNjc1LCA2OTcsIDcyNywKLSAgICAgNzQ5LCA3NjR9LAotICAgIHswLCAxNjAsIDI5MCwgMzM2LCAzNTQsIDQ3NSwgNTk4LCA2NTMsIDY3NywgNzIyLCA3NzcsIDgwOCwgODIzLCA4NDIsIDg2NiwKLSAgICAgODgxLCA4OTB9LAotICAgIHswLCA3MSwgMTQ0LCAxNzcsIDE5NSwgMjY2LCAzNDIsIDM4NSwgNDExLCA0NDUsIDQ4OSwgNTE5LCA1MzksIDU1OSwgNTg2LAotICAgICA2MDcsIDYyMn0sCi0gICAgezAsIDQ4LCAxMDgsIDE0MCwgMTU5LCAyMTcsIDI4NSwgMzI3LCAzNTQsIDM4NSwgNDI3LCA0NTcsIDQ3OCwgNDk3LCA1MjQsCi0gICAgIDU0NSwgNTYxfSwKLSAgICB7MCwgMTM4LCAyNDcsIDI5MCwgMzA4LCA0MTksIDUzMSwgNTg0LCA2MDksIDY1NSwgNzEwLCA3NDIsIDc1OSwgNzgwLCA4MDcsCi0gICAgIDgyNSwgODM2fSwKLSAgICB7MCwgMTYsIDQwLCA2MiwgNzksIDEwMywgMTM5LCAxNzAsIDE5NSwgMjE1LCAyNDUsIDI3MCwgMjkwLCAzMDUsIDMyNywgMzQ2LAotICAgICAzNjJ9LAotICAgIHswLCA1NzksIDcyOSwgNzQxLCA3NDMsIDg5NywgOTcwLCA5ODAsIDk4MiwgOTk2LCAxMDA3LCAxMDEwLCAxMDExLCAxMDE0LAotICAgICAxMDE3LCAxMDE4LCAxMDE5fSwKLSAgICB7MCwgMzk4LCA1ODIsIDYwNywgNjEyLCA3ODgsIDkwMiwgOTI1LCA5MzEsIDk1NiwgOTc5LCA5ODcsIDk5MCwgOTk2LCAxMDAyLAotICAgICAxMDA1LCAxMDA3fSwKLSAgICB7MCwgMTMsIDM0LCA1MiwgNjMsIDgzLCAxMTIsIDEzNCwgMTQ5LCAxNjMsIDE4MywgMTk5LCAyMTEsIDIyMSwgMjM1LCAyNDcsCi0gICAgIDI1N30sCi0gICAgezAsIDI4MSwgNDY0LCA1MDEsIDUxMCwgNjgxLCA4MjAsIDg1NywgODY3LCA5MDIsIDkzOCwgOTUzLCA5NTksIDk2OCwgOTc4LAotICAgICA5ODQsIDk4N30sCi0gICAgezAsIDE5OCwgMzYyLCA0MDgsIDQyMSwgNTc1LCA3MjIsIDc3MywgNzg5LCA4MzIsIDg4MSwgOTA1LCA5MTUsIDkyOCwgOTQ0LAotICAgICA5NTQsIDk1OX0sCi0gICAgezAsIDEsIDIsIDk1LCAxMzksIDE0MCwgMTQxLCAyMTMsIDI1MSwgMzM3LCA0MDcsIDQ1MCwgNDc1LCA1MTUsIDU1MSwgNTc2LAotICAgICA1OTJ9LAotICAgIHswLCAxMzMsIDI3NCwgMzM4LCAzNjYsIDQ4MywgNjA1LCA2NjQsIDY5MSwgNzMwLCA3NzgsIDgwNywgODIyLCA4MzcsIDg1NywKLSAgICAgODcwLCA4Nzh9LAotICAgIHswLCAxMjgsIDI1MywgMzAyLCAzMjAsIDQ0MywgNTc3LCA2MzYsIDY1OSwgNzA4LCA3NjcsIDc5OSwgODE0LCA4MzMsIDg1NywKLSAgICAgODcyLCA4ODF9LAotICAgIHswLCAxLCAyLCAyNSwgNDIsIDQzLCA0NCwgNjcsIDg1LCAxMDUsIDEyNiwgMTQ0LCAxNTksIDE3NCwgMTkxLCAyMDUsIDIxN30sCi0gICAgezAsIDcwLCAxNjYsIDIyOSwgMjY3LCAzNTYsIDQ2OCwgNTMzLCA1NjksIDYwNiwgNjUzLCA2ODUsIDcwNSwgNzIyLCA3NDUsCi0gICAgIDc2MiwgNzc0fSwKLSAgICB7MCwgNTUsIDEzMCwgMTc1LCAyMDAsIDI2OCwgMzU4LCA0MTYsIDQ0OSwgNDg4LCA1NDIsIDU4MSwgNjA2LCA2MjgsIDY1OSwKLSAgICAgNjgzLCA2OTl9LAotICAgIHswLCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMjUsIDI3LCAyOSwgMzF9LAotICAgIHswLCAzNCwgODUsIDEyMywgMTQ3LCAxOTYsIDI2NSwgMzE3LCAzNTIsIDM4NiwgNDMzLCA0NzAsIDQ5NywgNTE4LCA1NDksIDU3NCwKLSAgICAgNTkzfSwKLSAgICB7MCwgMzAsIDczLCAxMDUsIDEyNywgMTcwLCAyMjksIDI3NCwgMzA1LCAzMzUsIDM3NywgNDExLCA0MzYsIDQ1NSwgNDgzLCA1MDYsCi0gICAgIDUyNH0sCi0gICAgezAsIDksIDI0LCAzOCwgNTEsIDY1LCA4NywgMTA4LCAxMjYsIDEzOSwgMTU5LCAxNzcsIDE5MywgMjA0LCAyMjEsIDIzNiwKLSAgICAgMjUwfSwKLSAgICB7MCwgMzAsIDc0LCAxMDUsIDEyNSwgMTY2LCAyMjQsIDI2NiwgMjk0LCAzMjIsIDM2MSwgMzkxLCA0MTMsIDQzMSwgNDU3LCA0NzgsCi0gICAgIDQ5NH0sCi0gICAgezAsIDE1LCAzOCwgNTgsIDczLCA5NSwgMTI4LCAxNTYsIDE3OCwgMTk2LCAyMjIsIDI0NSwgMjYzLCAyNzYsIDI5NiwgMzE0LAotICAgICAzMjl9LAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTI1IG9mIDE3NwotICAgIHswLCAxMSwgMjgsIDQ0LCA1NywgNzQsIDEwMCwgMTIzLCAxNDIsIDE1NywgMTc5LCAxOTksIDIxNiwgMjI4LCAyNDYsIDI2MiwKLSAgICAgMjc2fSwKLSAgICB7MCwgNDQ4LCA2MTksIDYzOSwgNjQzLCA4MjEsIDkyNiwgOTQ0LCA5NDgsIDk3MSwgOTkxLCA5OTgsIDEwMDAsIDEwMDUsIDEwMTAsCi0gICAgIDEwMTIsIDEwMTN9LAotICAgIHswLCAzMzIsIDUyMCwgNTQ5LCA1NTUsIDc0MSwgODc0LCA5MDMsIDkxMCwgOTQwLCA5NzAsIDk4MSwgOTg1LCA5OTEsIDk5OCwKLSAgICAgMTAwMiwgMTAwNH0sCi0gICAgezAsIDgsIDIxLCAzNCwgNDUsIDU4LCA3OCwgOTYsIDExMiwgMTI0LCAxNDEsIDE1NywgMTcwLCAxODAsIDE5NCwgMjA3LCAyMTl9LAotICAgIHswLCAyMzksIDQxNSwgNDU3LCA0NjgsIDYzMSwgNzc2LCA4MjAsIDgzMywgODcyLCA5MTQsIDkzMywgOTQwLCA5NTEsIDk2NCwKLSAgICAgOTcxLCA5NzV9LAotICAgIHswLCAxNjUsIDMxMCwgMzU5LCAzNzUsIDUxMywgNjUyLCA3MDcsIDcyNywgNzc0LCA4MjgsIDg1NiwgODY4LCA4ODQsIDkwNCwKLSAgICAgOTE2LCA5MjN9LAotICAgIHswLCAzLCA4LCAxMywgMTgsIDIzLCAzMCwgMzcsIDQ0LCA0OCwgNTUsIDYyLCA2OCwgNzIsIDc4LCA4NCwgOTB9LAotICAgIHswLCAxMTUsIDIzNywgMjg5LCAzMTEsIDQyMiwgNTQ3LCA2MDgsIDYzNSwgNjgwLCA3MzcsIDc3MSwgNzg4LCA4MDcsIDgzMiwKLSAgICAgODQ5LCA4NTl9LAotICAgIHswLCAxMDcsIDIyMSwgMjcyLCAyOTMsIDM5OSwgNTIxLCA1ODIsIDYxMCwgNjU2LCA3MTQsIDc0OSwgNzY3LCA3ODcsIDgxMywKLSAgICAgODMxLCA4NDJ9LAotICAgIHswLCA2LCAxNiwgMjYsIDM1LCA0NSwgNjAsIDc1LCA4OSwgOTgsIDExMiwgMTI1LCAxMzcsIDE0NSwgMTU3LCAxNjgsIDE3OH0sCi0gICAgezAsIDcyLCAxNjAsIDIxMCwgMjM2LCAzMjAsIDQyMiwgNDgyLCA1MTQsIDU1NSwgNjA4LCA2NDQsIDY2NSwgNjg1LCA3MTIsCi0gICAgIDczMiwgNzQ1fSwKLSAgICB7MCwgNDUsIDEwOCwgMTUzLCAxODMsIDI0NCwgMzI3LCAzODUsIDQyMSwgNDU1LCA1MDIsIDUzNiwgNTU5LCA1NzgsIDYwNSwKLSAgICAgNjI2LCA2NDF9LAotICAgIHswLCAxLCAyLCA5LCAxNiwgMTcsIDE4LCAyNiwgMzQsIDQwLCA0OCwgNTUsIDYyLCA2OCwgNzUsIDgyLCA4OH0sCi0gICAgezAsIDI5LCA3MywgMTA4LCAxMzIsIDE3NCwgMjM2LCAyODQsIDMxOCwgMzQ4LCAzOTEsIDQyNiwgNDUyLCA0NzEsIDUwMCwgNTI0LAotICAgICA1NDN9LAotICAgIHswLCAyMCwgNTEsIDc2LCA5MywgMTIzLCAxNjYsIDIwMCwgMjI1LCAyNDcsIDI3OSwgMzA1LCAzMjYsIDM0MiwgMzY1LCAzODUsCi0gICAgIDQwMX0sCi0gICAgezAsIDc0MiwgODQ1LCA4NTAsIDg1MSwgOTU5LCA5OTcsIDEwMDEsIDEwMDIsIDEwMDksIDEwMTQsIDEwMTYsIDEwMTcsIDEwMTksCi0gICAgIDEwMjAsIDEwMjEsIDEwMjJ9LAotICAgIHswLCA0MiwgOTQsIDEyMSwgMTM3LCAxODYsIDI0NCwgMjgwLCAzMDMsIDMzMCwgMzY2LCAzOTIsIDQxMCwgNDI3LCA0NTEsIDQ3MCwKLSAgICAgNDg0fSwKLSAgICB7MCwgMTMsIDMzLCA1MSwgNjYsIDg1LCAxMTQsIDE0MCwgMTYxLCAxNzgsIDIwMywgMjI1LCAyNDMsIDI1NiwgMjc1LCAyOTIsCi0gICAgIDMwN30sCi0gICAgezAsIDUwMSwgNjcwLCA2ODksIDY5MywgODQ4LCA5MzYsIDk1MiwgOTU2LCA5NzUsIDk5MSwgOTk3LCA5OTksIDEwMDQsIDEwMDgsCi0gICAgIDEwMTAsIDEwMTF9LAotICAgIHswLCA0NDUsIDU4MSwgNjAzLCA2MDksIDc2NywgODY1LCA4ODgsIDg5NSwgOTI2LCA5NTQsIDk2NCwgOTY4LCA5NzcsIDk4NiwKLSAgICAgOTkxLCA5OTN9LAotICAgIHswLCAyODUsIDQ0MiwgNDc5LCA0ODksIDY1MCwgNzc5LCA4MTgsIDgzMCwgODcwLCA5MTIsIDkzMCwgOTM3LCA5NDksIDk2MywKLSAgICAgOTcxLCA5NzV9LAotICAgIHswLCAzNDksIDUyOCwgNTYxLCA1NjksIDczMSwgODUyLCA4ODMsIDg5MiwgOTIzLCA5NTMsIDk2NSwgOTcwLCA5NzgsIDk4NywKLSAgICAgOTkyLCA5OTR9LAotICAgIHswLCAxOTksIDM1NSwgNDAyLCA0MTcsIDU2MywgNzAwLCA3NTAsIDc2NywgODExLCA4NjAsIDg4NCwgODk0LCA5MDksIDkyNiwKLSAgICAgOTM2LCA5NDJ9LAotICAgIHswLCAxNDEsIDI3NSwgMzI1LCAzNDMsIDQ3MSwgNjA2LCA2NjQsIDY4NiwgNzM0LCA3OTEsIDgyMiwgODM2LCA4NTQsIDg3NywKLSAgICAgODkxLCA4OTl9LAotICAgIHswLCAyNDMsIDQzNywgNDkzLCA1MTAsIDY0OSwgNzc1LCA4MjAsIDgzNiwgODY5LCA5MDUsIDkyMywgOTMxLCA5NDEsIDk1MywKLSAgICAgOTYwLCA5NjR9LAotICAgIHswLCA5MSwgMTk3LCAyNDgsIDI3MSwgMzcwLCA0ODcsIDU1MCwgNTgwLCA2MjUsIDY4NCwgNzIxLCA3NDEsIDc2MSwgNzg4LAotICAgICA4MDcsIDgxOX0sCi0gICAgezAsIDEwNywgMjAxLCAyNDIsIDI2MiwgMzU0LCA0NTEsIDUwMywgNTMxLCA1NzMsIDYyNiwgNjYwLCA2ODAsIDcwMSwgNzMwLAotICAgICA3NTEsIDc2NX0sCi0gICAgezAsIDE2OCwgMzM5LCA0MDcsIDQzMiwgNTUzLCA2NzYsIDczMSwgNzU1LCA3ODksIDgzMCwgODU0LCA4NjYsIDg3OSwgODk1LAotICAgICA5MDYsIDkxMn0sCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMjYgb2YgMTc3Ci0gICAgezAsIDY3LCAxNDcsIDE5MSwgMjE0LCAyOTAsIDM4NCwgNDQxLCA0NzIsIDUxMywgNTY3LCA2MDQsIDYyNywgNjQ4LCA2NzgsCi0gICAgIDcwMCwgNzE1fSwKLSAgICB7MCwgNDYsIDEwOSwgMTQ4LCAxNzEsIDIyOSwgMzA3LCAzNTksIDM5MSwgNDI3LCA0NzYsIDUxMywgNTM3LCA1NTgsIDU4OCwKLSAgICAgNjEyLCA2Mjl9LAotICAgIHswLCA4NDgsIDkxOCwgOTIwLCA5MjEsIDk5NiwgMTAxMiwgMTAxMywgMTAxNCwgMTAxNiwgMTAxNywgMTAxOCwgMTAxOSwgMTAyMCwKLSAgICAgMTAyMSwgMTAyMiwgMTAyM30sCi0gICAgezAsIDM2LCA4OCwgMTIzLCAxNDUsIDE5MywgMjYwLCAzMDgsIDM0MCwgMzcyLCA0MTcsIDQ1MiwgNDc2LCA0OTYsIDUyNSwgNTQ4LAotICAgICA1NjV9LAotICAgIHswLCAyNCwgNjEsIDkwLCAxMTAsIDE0NSwgMTk2LCAyMzcsIDI2NiwgMjkyLCAzMzAsIDM2MSwgMzg1LCA0MDMsIDQzMCwgNDUzLAotICAgICA0NzF9LAotICAgIHswLCA4NSwgMTgyLCAyMzAsIDI1MywgMzQ0LCA0NTQsIDUxNSwgNTQ1LCA1OTAsIDY0OCwgNjg1LCA3MDYsIDcyNywgNzU2LAotICAgICA3NzYsIDc4OX0sCi0gICAgezAsIDIyLCA1NSwgODIsIDEwMiwgMTM1LCAxODMsIDIyMiwgMjUyLCAyNzgsIDMxNSwgMzQ1LCAzNjgsIDM4NSwgNDEwLCA0MzEsCi0gICAgIDQ0OH0sCi0gICAgezAsIDEsIDIsIDU2LCA4OSwgOTAsIDkxLCAxNDAsIDE3MiwgMjIxLCAyNjgsIDMwMywgMzI4LCAzNTgsIDM4OCwgNDEyLCA0MzB9LAotICAgIHswLCA0NSwgMTA5LCAxNTIsIDE3NywgMjM5LCAzMjAsIDM3NiwgNDExLCA0NDgsIDQ5OSwgNTM3LCA1NjMsIDU4NSwgNjE2LAotICAgICA2NDAsIDY1OH0sCi0gICAgezAsIDI0NywgMzk1LCA0MzMsIDQ0NSwgNTk5LCA3MjksIDc3MSwgNzg1LCA4MjksIDg3NSwgODk2LCA5MDUsIDkyMCwgOTM3LAotICAgICA5NDYsIDk1MX0sCi0gICAgezAsIDIzMSwgMzY3LCA0MDgsIDQyMywgNTU3LCA2NzYsIDcyMywgNzQyLCA3ODYsIDgzNSwgODYwLCA4NzIsIDg4OSwgOTA5LAotICAgICA5MjEsIDkyOH19Owotc2hvcnQgYWNfc3BlY19mcmVxWzY0XVsxN10gPSB7Ci0gICAgezEsIDEsIDE3NSwgNDgsIDEsIDEsIDEwOSwgMzYsIDE3MSwgMTA5LCA0NywgMjAsIDQ5LCAzNiwgMjAsIDEwLCAxOTB9LAotICAgIHsxOCwgMjYsIDE3LCAxMCwgMjcsIDM3LCAyNCwgMTYsIDIyLCAzMiwgMjIsIDE0LCAxNywgMjYsIDIwLCAxMywgNjgzfSwKLSAgICB7NzEsIDkyLCA0OSwgMjUsIDgxLCAxMDIsIDYxLCAzMywgNDIsIDU3LCAzOSwgMjMsIDIyLCAzMCwgMjIsIDE1LCAyNjB9LAotICAgIHsxNjAsIDEzMCwgNDYsIDE4LCAxMjEsIDEyMywgNTUsIDI0LCA0NSwgNTUsIDMxLCAxNSwgMTksIDI0LCAxNSwgOSwgMTM0fSwKLSAgICB7NzEsIDczLCAzMywgMTgsIDcxLCA3NiwgNDMsIDI2LCAzNCwgNDQsIDMwLCAyMCwgMjAsIDI3LCAyMSwgMTUsIDQwMn0sCi0gICAgezQ4LCA2MCwgMzIsIDE5LCA1OCwgNjgsIDQyLCAyNywgMzEsIDQyLCAzMCwgMjEsIDE5LCAyNywgMjEsIDE2LCA0NjN9LAotICAgIHsxMzgsIDEwOSwgNDMsIDE4LCAxMTEsIDExMiwgNTMsIDI1LCA0NiwgNTUsIDMyLCAxNywgMjEsIDI3LCAxOCwgMTEsIDE4OH0sCi0gICAgezE2LCAyNCwgMjIsIDE3LCAyNCwgMzYsIDMxLCAyNSwgMjAsIDMwLCAyNSwgMjAsIDE1LCAyMiwgMTksIDE2LCA2NjJ9LAotICAgIHs1NzksIDE1MCwgMTIsIDIsIDE1NCwgNzMsIDEwLCAyLCAxNCwgMTEsIDMsIDEsIDMsIDMsIDEsIDEsIDV9LAotICAgIHszOTgsIDE4NCwgMjUsIDUsIDE3NiwgMTE0LCAyMywgNiwgMjUsIDIzLCA4LCAzLCA2LCA2LCAzLCAyLCAxN30sCi0gICAgezEzLCAyMSwgMTgsIDExLCAyMCwgMjksIDIyLCAxNSwgMTQsIDIwLCAxNiwgMTIsIDEwLCAxNCwgMTIsIDEwLCA3Njd9LAotICAgIHsyODEsIDE4MywgMzcsIDksIDE3MSwgMTM5LCAzNywgMTAsIDM1LCAzNiwgMTUsIDYsIDksIDEwLCA2LCAzLCAzN30sCi0gICAgezE5OCwgMTY0LCA0NiwgMTMsIDE1NCwgMTQ3LCA1MSwgMTYsIDQzLCA0OSwgMjQsIDEwLCAxMywgMTYsIDEwLCA1LCA2NX0sCi0gICAgezEsIDEsIDkzLCA0NCwgMSwgMSwgNzIsIDM4LCA4NiwgNzAsIDQzLCAyNSwgNDAsIDM2LCAyNSwgMTYsIDQzMn0sCi0gICAgezEzMywgMTQxLCA2NCwgMjgsIDExNywgMTIyLCA1OSwgMjcsIDM5LCA0OCwgMjksIDE1LCAxNSwgMjAsIDEzLCA4LCAxNDZ9LAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTI3IG9mIDE3NwotICAgIHsxMjgsIDEyNSwgNDksIDE4LCAxMjMsIDEzNCwgNTksIDIzLCA0OSwgNTksIDMyLCAxNSwgMTksIDI0LCAxNSwgOSwgMTQzfSwKLSAgICB7MSwgMSwgMjMsIDE3LCAxLCAxLCAyMywgMTgsIDIwLCAyMSwgMTgsIDE1LCAxNSwgMTcsIDE0LCAxMiwgODA3fSwKLSAgICB7NzAsIDk2LCA2MywgMzgsIDg5LCAxMTIsIDY1LCAzNiwgMzcsIDQ3LCAzMiwgMjAsIDE3LCAyMywgMTcsIDEyLCAyNTB9LAotICAgIHs1NSwgNzUsIDQ1LCAyNSwgNjgsIDkwLCA1OCwgMzMsIDM5LCA1NCwgMzksIDI1LCAyMiwgMzEsIDI0LCAxNiwgMzI1fSwKLSAgICB7MSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgOTkzfSwKLSAgICB7MzQsIDUxLCAzOCwgMjQsIDQ5LCA2OSwgNTIsIDM1LCAzNCwgNDcsIDM3LCAyNywgMjEsIDMxLCAyNSwgMTksIDQzMX0sCi0gICAgezMwLCA0MywgMzIsIDIyLCA0MywgNTksIDQ1LCAzMSwgMzAsIDQyLCAzNCwgMjUsIDE5LCAyOCwgMjMsIDE4LCA1MDB9LAotICAgIHs5LCAxNSwgMTQsIDEzLCAxNCwgMjIsIDIxLCAxOCwgMTMsIDIwLCAxOCwgMTYsIDExLCAxNywgMTUsIDE0LCA3NzR9LAotICAgIHszMCwgNDQsIDMxLCAyMCwgNDEsIDU4LCA0MiwgMjgsIDI4LCAzOSwgMzAsIDIyLCAxOCwgMjYsIDIxLCAxNiwgNTMwfSwKLSAgICB7MTUsIDIzLCAyMCwgMTUsIDIyLCAzMywgMjgsIDIyLCAxOCwgMjYsIDIzLCAxOCwgMTMsIDIwLCAxOCwgMTUsIDY5NX0sCi0gICAgezExLCAxNywgMTYsIDEzLCAxNywgMjYsIDIzLCAxOSwgMTUsIDIyLCAyMCwgMTcsIDEyLCAxOCwgMTYsIDE0LCA3NDh9LAotICAgIHs0NDgsIDE3MSwgMjAsIDQsIDE3OCwgMTA1LCAxOCwgNCwgMjMsIDIwLCA3LCAyLCA1LCA1LCAyLCAxLCAxMX0sCi0gICAgezMzMiwgMTg4LCAyOSwgNiwgMTg2LCAxMzMsIDI5LCA3LCAzMCwgMzAsIDExLCA0LCA2LCA3LCA0LCAyLCAyMH0sCi0gICAgezgsIDEzLCAxMywgMTEsIDEzLCAyMCwgMTgsIDE2LCAxMiwgMTcsIDE2LCAxMywgMTAsIDE0LCAxMywgMTIsIDgwNX0sCi0gICAgezIzOSwgMTc2LCA0MiwgMTEsIDE2MywgMTQ1LCA0NCwgMTMsIDM5LCA0MiwgMTksIDcsIDExLCAxMywgNywgNCwgNDl9LAotICAgIHsxNjUsIDE0NSwgNDksIDE2LCAxMzgsIDEzOSwgNTUsIDIwLCA0NywgNTQsIDI4LCAxMiwgMTYsIDIwLCAxMiwgNywgMTAxfSwKLSAgICB7MywgNSwgNSwgNSwgNSwgNywgNywgNywgNCwgNywgNywgNiwgNCwgNiwgNiwgNiwgOTM0fSwKLSAgICB7MTE1LCAxMjIsIDUyLCAyMiwgMTExLCAxMjUsIDYxLCAyNywgNDUsIDU3LCAzNCwgMTcsIDE5LCAyNSwgMTcsIDEwLCAxNjV9LAotICAgIHsxMDcsIDExNCwgNTEsIDIxLCAxMDYsIDEyMiwgNjEsIDI4LCA0NiwgNTgsIDM1LCAxOCwgMjAsIDI2LCAxOCwgMTEsIDE4Mn0sCi0gICAgezYsIDEwLCAxMCwgOSwgMTAsIDE1LCAxNSwgMTQsIDksIDE0LCAxMywgMTIsIDgsIDEyLCAxMSwgMTAsIDg0Nn0sCi0gICAgezcyLCA4OCwgNTAsIDI2LCA4NCwgMTAyLCA2MCwgMzIsIDQxLCA1MywgMzYsIDIxLCAyMCwgMjcsIDIwLCAxMywgMjc5fSwKLSAgICB7NDUsIDYzLCA0NSwgMzAsIDYxLCA4MywgNTgsIDM2LCAzNCwgNDcsIDM0LCAyMywgMTksIDI3LCAyMSwgMTUsIDM4M30sCi0gICAgezEsIDEsIDcsIDcsIDEsIDEsIDgsIDgsIDYsIDgsIDcsIDcsIDYsIDcsIDcsIDYsIDkzNn0sCi0gICAgezI5LCA0NCwgMzUsIDI0LCA0MiwgNjIsIDQ4LCAzNCwgMzAsIDQzLCAzNSwgMjYsIDE5LCAyOSwgMjQsIDE5LCA0ODF9LAotICAgIHsyMCwgMzEsIDI1LCAxNywgMzAsIDQzLCAzNCwgMjUsIDIyLCAzMiwgMjYsIDIxLCAxNiwgMjMsIDIwLCAxNiwgNjIzfSwKLSAgICB7NzQyLCAxMDMsIDUsIDEsIDEwOCwgMzgsIDQsIDEsIDcsIDUsIDIsIDEsIDIsIDEsIDEsIDEsIDJ9LAotICAgIHs0MiwgNTIsIDI3LCAxNiwgNDksIDU4LCAzNiwgMjMsIDI3LCAzNiwgMjYsIDE4LCAxNywgMjQsIDE5LCAxNCwgNTQwfSwKLSAgICB7MTMsIDIwLCAxOCwgMTUsIDE5LCAyOSwgMjYsIDIxLCAxNywgMjUsIDIyLCAxOCwgMTMsIDE5LCAxNywgMTUsIDcxN30sCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMjggb2YgMTc3Ci0gICAgezUwMSwgMTY5LCAxOSwgNCwgMTU1LCA4OCwgMTYsIDQsIDE5LCAxNiwgNiwgMiwgNSwgNCwgMiwgMSwgMTN9LAotICAgIHs0NDUsIDEzNiwgMjIsIDYsIDE1OCwgOTgsIDIzLCA3LCAzMSwgMjgsIDEwLCA0LCA5LCA5LCA1LCAyLCAzMX0sCi0gICAgezI4NSwgMTU3LCAzNywgMTAsIDE2MSwgMTI5LCAzOSwgMTIsIDQwLCA0MiwgMTgsIDcsIDEyLCAxNCwgOCwgNCwgNDl9LAotICAgIHszNDksIDE3OSwgMzMsIDgsIDE2MiwgMTIxLCAzMSwgOSwgMzEsIDMwLCAxMiwgNSwgOCwgOSwgNSwgMiwgMzB9LAotICAgIHsxOTksIDE1NiwgNDcsIDE1LCAxNDYsIDEzNywgNTAsIDE3LCA0NCwgNDksIDI0LCAxMCwgMTUsIDE3LCAxMCwgNiwgODJ9LAotICAgIHsxNDEsIDEzNCwgNTAsIDE4LCAxMjgsIDEzNSwgNTgsIDIyLCA0OCwgNTcsIDMxLCAxNCwgMTgsIDIzLCAxNCwgOCwgMTI1fSwKLSAgICB7MjQzLCAxOTQsIDU2LCAxNywgMTM5LCAxMjYsIDQ1LCAxNiwgMzMsIDM2LCAxOCwgOCwgMTAsIDEyLCA3LCA0LCA2MH0sCi0gICAgezkxLCAxMDYsIDUxLCAyMywgOTksIDExNywgNjMsIDMwLCA0NSwgNTksIDM3LCAyMCwgMjAsIDI3LCAxOSwgMTIsIDIwNX0sCi0gICAgezEwNywgOTQsIDQxLCAyMCwgOTIsIDk3LCA1MiwgMjgsIDQyLCA1MywgMzQsIDIwLCAyMSwgMjksIDIxLCAxNCwgMjU5fSwKLSAgICB7MTY4LCAxNzEsIDY4LCAyNSwgMTIxLCAxMjMsIDU1LCAyNCwgMzQsIDQxLCAyNCwgMTIsIDEzLCAxNiwgMTEsIDYsIDExMn0sCi0gICAgezY3LCA4MCwgNDQsIDIzLCA3NiwgOTQsIDU3LCAzMSwgNDEsIDU0LCAzNywgMjMsIDIxLCAzMCwgMjIsIDE1LCAzMDl9LAotICAgIHs0NiwgNjMsIDM5LCAyMywgNTgsIDc4LCA1MiwgMzIsIDM2LCA0OSwgMzcsIDI0LCAyMSwgMzAsIDI0LCAxNywgMzk1fSwKLSAgICB7ODQ4LCA3MCwgMiwgMSwgNzUsIDE2LCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKLSAgICB7MzYsIDUyLCAzNSwgMjIsIDQ4LCA2NywgNDgsIDMyLCAzMiwgNDUsIDM1LCAyNCwgMjAsIDI5LCAyMywgMTcsIDQ1OX0sCi0gICAgezI0LCAzNywgMjksIDIwLCAzNSwgNTEsIDQxLCAyOSwgMjYsIDM4LCAzMSwgMjQsIDE4LCAyNywgMjMsIDE4LCA1NTN9LAotICAgIHs4NSwgOTcsIDQ4LCAyMywgOTEsIDExMCwgNjEsIDMwLCA0NSwgNTgsIDM3LCAyMSwgMjEsIDI5LCAyMCwgMTMsIDIzNX0sCi0gICAgezIyLCAzMywgMjcsIDIwLCAzMywgNDgsIDM5LCAzMCwgMjYsIDM3LCAzMCwgMjMsIDE3LCAyNSwgMjEsIDE3LCA1NzZ9LAotICAgIHsxLCAxLCA1NCwgMzMsIDEsIDEsIDQ5LCAzMiwgNDksIDQ3LCAzNSwgMjUsIDMwLCAzMCwgMjQsIDE4LCA1OTR9LAotICAgIHs0NSwgNjQsIDQzLCAyNSwgNjIsIDgxLCA1NiwgMzUsIDM3LCA1MSwgMzgsIDI2LCAyMiwgMzEsIDI0LCAxOCwgMzY2fSwKLSAgICB7MjQ3LCAxNDgsIDM4LCAxMiwgMTU0LCAxMzAsIDQyLCAxNCwgNDQsIDQ2LCAyMSwgOSwgMTUsIDE3LCA5LCA1LCA3M30sCi0gICAgezIzMSwgMTM2LCA0MSwgMTUsIDEzNCwgMTE5LCA0NywgMTksIDQ0LCA0OSwgMjUsIDEyLCAxNywgMjAsIDEyLCA3LCA5Nn19Owotc2hvcnQgYWNfc3BlY19iaXRzWzY0XVsxN10gPSB7Ci0gICAgezIwNDgwLCAyMDQ4MCwgNTIyMCwgOTA0MiwgMjA0ODAsIDIwNDgwLCA2NjE5LCA5ODkyLCA1Mjg5LCA2NjE5LCA5MTA1LAotICAgICAxMTYyOSwgODk4MiwgOTg5MiwgMTE2MjksIDEzNjc3LCA0OTc3fSwKLSAgICB7MTE5NDAsIDEwODU0LCAxMjEwOSwgMTM2NzcsIDEwNzQyLCA5ODEyLCAxMTA5MCwgMTIyODgsIDExMzQ4LCAxMDI0MCwgMTEzNDgsCi0gICAgIDEyNjgzLCAxMjEwOSwgMTA4NTQsIDExNjI5LCAxMjkwMiwgMTE5N30sCi0gICAgezc4ODYsIDcxMjAsIDg5ODIsIDEwOTcwLCA3NDk2LCA2ODE1LCA4MzM0LCAxMDE1MCwgOTQzNywgODUzNSwgOTY1NiwgMTEyMTYsCi0gICAgIDExMzQ4LCAxMDQzMSwgMTEzNDgsIDEyNDc5LCA0MDUxfSwKLSAgICB7NTQ4NSwgNjA5OSwgOTE2OCwgMTE5NDAsIDYzMTEsIDYyNjIsIDg2NDAsIDExMDkwLCA5MjMzLCA4NjQwLCAxMDMzNCwgMTI0NzksCi0gICAgIDExNzgxLCAxMTA5MCwgMTI0NzksIDEzOTg4LCA2MDA5fSwKLSAgICB7Nzg4NiwgNzgwNCwgMTAxNTAsIDExOTQwLCA3ODg2LCA3Njg1LCA5MzY4LCAxMDg1NCwgMTAwNjEsIDkzMDAsIDEwNDMxLAotICAgICAxMTYyOSwgMTE2MjksIDEwNzQyLCAxMTQ4NSwgMTI0NzksIDI3NjN9LAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTI5IG9mIDE3NwotICAgIHs5MDQyLCA4MzgzLCAxMDI0MCwgMTE3ODEsIDg0ODMsIDgwMTMsIDk0MzcsIDEwNzQyLCAxMDMzNCwgOTQzNywgMTA0MzEsCi0gICAgIDExNDg1LCAxMTc4MSwgMTA3NDIsIDExNDg1LCAxMjI4OCwgMjM0Nn0sCi0gICAgezU5MjIsIDY2MTksIDkzNjgsIDExOTQwLCA2NTY2LCA2NTM5LCA4NzUwLCAxMDk3MCwgOTE2OCwgODY0MCwgMTAyNDAsIDEyMTA5LAotICAgICAxMTQ4NSwgMTA3NDIsIDExOTQwLCAxMzM5NiwgNTAwOX0sCi0gICAgezEyMjg4LCAxMTA5MCwgMTEzNDgsIDEyMTA5LCAxMTA5MCwgOTg5MiwgMTAzMzQsIDEwOTcwLCAxMTYyOSwgMTA0MzEsIDEwOTcwLAotICAgICAxMTYyOSwgMTI0NzksIDExMzQ4LCAxMTc4MSwgMTIyODgsIDEyODl9LAotICAgIHsxNjg1LCA1Njc2LCAxMzEzOCwgMTg0MzIsIDU1OTgsIDc4MDQsIDEzNjc3LCAxODQzMiwgMTI2ODMsIDEzMzk2LCAxNzIzNCwKLSAgICAgMjA0ODAsIDE3MjM0LCAxNzIzNCwgMjA0ODAsIDIwNDgwLCAxNTcyNX0sCi0gICAgezI3OTMsIDUwNzIsIDEwOTcwLCAxNTcyNSwgNTIwNCwgNjQ4NywgMTEyMTYsIDE1MTg2LCAxMDk3MCwgMTEyMTYsIDE0MzM2LAotICAgICAxNzIzNCwgMTUxODYsIDE1MTg2LCAxNzIzNCwgMTg0MzIsIDEyMTA5fSwKLSAgICB7MTI5MDIsIDExNDg1LCAxMTk0MCwgMTMzOTYsIDExNjI5LCAxMDUzMSwgMTEzNDgsIDEyNDc5LCAxMjY4MywgMTE2MjksCi0gICAgIDEyMjg4LCAxMzEzOCwgMTM2NzcsIDEyNjgzLCAxMzEzOCwgMTM2NzcsIDg1NH0sCi0gICAgezM4MjEsIDUwODgsIDk4MTIsIDEzOTg4LCA1Mjg5LCA1OTAxLCA5ODEyLCAxMzY3NywgOTk3NiwgOTg5MiwgMTI0NzksIDE1MTg2LAotICAgICAxMzk4OCwgMTM2NzcsIDE1MTg2LCAxNzIzNCwgOTgxMn0sCi0gICAgezQ4NTYsIDU0MTIsIDkxNjgsIDEyOTAyLCA1NTk4LCA1NzM2LCA4ODYzLCAxMjI4OCwgOTM2OCwgODk4MiwgMTEwOTAsIDEzNjc3LAotICAgICAxMjkwMiwgMTIyODgsIDEzNjc3LCAxNTcyNSwgODE0N30sCi0gICAgezIwNDgwLCAyMDQ4MCwgNzA4OCwgOTMwMCwgMjA0ODAsIDIwNDgwLCA3ODQ0LCA5NzMzLCA3MzIwLCA3OTI4LCA5MzY4LAotICAgICAxMDk3MCwgOTU4MSwgOTg5MiwgMTA5NzAsIDEyMjg4LCAyNTUwfSwKLSAgICB7NjAzMSwgNTg1OSwgODE5MiwgMTA2MzUsIDY0MTAsIDYyODYsIDg0MzMsIDEwNzQyLCA5NjU2LCA5MDQyLCAxMDUzMSwgMTI0NzksCi0gICAgIDEyNDc5LCAxMTYyOSwgMTI5MDIsIDE0MzM2LCA1NzU2fSwKLSAgICB7NjE0NCwgNjIxNSwgODk4MiwgMTE5NDAsIDYyNjIsIDYwMDksIDg0MzMsIDExMjE2LCA4OTgyLCA4NDMzLCAxMDI0MCwgMTI0NzksCi0gICAgIDExNzgxLCAxMTA5MCwgMTI0NzksIDEzOTg4LCA1ODE3fSwKLSAgICB7MjA0ODAsIDIwNDgwLCAxMTIxNiwgMTIxMDksIDIwNDgwLCAyMDQ4MCwgMTEyMTYsIDExOTQwLCAxMTYyOSwgMTE0ODUsCi0gICAgIDExOTQwLCAxMjQ3OSwgMTI0NzksIDEyMTA5LCAxMjY4MywgMTMxMzgsIDcwNH0sCi0gICAgezc5MjgsIDY5OTQsIDgyMzksIDk3MzMsIDcyMTgsIDY1MzksIDgxNDcsIDk4OTIsIDk4MTIsIDkxMDUsIDEwMjQwLCAxMTYyOSwKLSAgICAgMTIxMDksIDExMjE2LCAxMjEwOSwgMTMxMzgsIDQxNjd9LAotICAgIHs4NjQwLCA3NzI0LCA5MjMzLCAxMDk3MCwgODAxMywgNzE4NSwgODQ4MywgMTAxNTAsIDk2NTYsIDg2OTQsIDk2NTYsIDEwOTcwLAotICAgICAxMTM0OCwgMTAzMzQsIDExMDkwLCAxMjI4OCwgMzM5MX0sCi0gICAgezIwNDgwLCAxODQzMiwgMTg0MzIsIDE4NDMyLCAxODQzMiwgMTg0MzIsIDE4NDMyLCAxODQzMiwgMTg0MzIsIDE4NDMyLAotICAgICAxODQzMiwgMTg0MzIsIDE4NDMyLCAxODQzMiwgMTg0MzIsIDE4NDMyLCA5MX0sCi0gICAgezEwMDYxLCA4ODYzLCA5NzMzLCAxMTA5MCwgODk4MiwgNzk3MCwgODgwNiwgOTk3NiwgMTAwNjEsIDkxMDUsIDk4MTIsIDEwNzQyLAotICAgICAxMTQ4NSwgMTAzMzQsIDEwOTcwLCAxMTc4MSwgMjU1N30sCi0gICAgezEwNDMxLCA5MzY4LCAxMDI0MCwgMTEzNDgsIDkzNjgsIDg0MzMsIDkyMzMsIDEwMzM0LCAxMDQzMSwgOTQzNywgMTAwNjEsCi0gICAgIDEwOTcwLCAxMTc4MSwgMTA2MzUsIDExMjE2LCAxMTk0MCwgMjExOX0sCi0gICAgezEzOTg4LCAxMjQ3OSwgMTI2ODMsIDEyOTAyLCAxMjY4MywgMTEzNDgsIDExNDg1LCAxMTk0MCwgMTI5MDIsIDExNjI5LAotICAgICAxMTk0MCwgMTIyODgsIDEzMzk2LCAxMjEwOSwgMTI0NzksIDEyNjgzLCA4Mjh9LAotICAgIHsxMDQzMSwgOTMwMCwgMTAzMzQsIDExNjI5LCA5NTA4LCA4NDgzLCA5NDM3LCAxMDYzNSwgMTA2MzUsIDk2NTYsIDEwNDMxLAotICAgICAxMTM0OCwgMTE5NDAsIDEwODU0LCAxMTQ4NSwgMTIyODgsIDE5NDZ9LAotICAgIHsxMjQ3OSwgMTEyMTYsIDExNjI5LCAxMjQ3OSwgMTEzNDgsIDEwMTUwLCAxMDYzNSwgMTEzNDgsIDExOTQwLCAxMDg1NCwKLSAgICAgMTEyMTYsIDExOTQwLCAxMjkwMiwgMTE2MjksIDExOTQwLCAxMjQ3OSwgMTE0Nn0sCi0gICAgezEzMzk2LCAxMjEwOSwgMTIyODgsIDEyOTAyLCAxMjEwOSwgMTA4NTQsIDExMjE2LCAxMTc4MSwgMTI0NzksIDExMzQ4LAotICAgICAxMTYyOSwgMTIxMDksIDEzMTM4LCAxMTk0MCwgMTIyODgsIDEyNjgzLCA5Mjh9LAotICAgIHsyNDQzLCA1Mjg5LCAxMTYyOSwgMTYzODQsIDUxNzAsIDY3MzAsIDExOTQwLCAxNjM4NCwgMTEyMTYsIDExNjI5LCAxNDczMSwKLSAgICAgMTg0MzIsIDE1NzI1LCAxNTcyNSwgMTg0MzIsIDIwNDgwLCAxMzM5Nn0sCi0gICAgezMzMjgsIDUwMDksIDEwNTMxLCAxNTE4NiwgNTA0MCwgNjAzMSwgMTA1MzEsIDE0NzMxLCAxMDQzMSwgMTA0MzEsIDEzMzk2LAotICAgICAxNjM4NCwgMTUxODYsIDE0NzMxLCAxNjM4NCwgMTg0MzIsIDExNjI5fSwKLSAgICB7MTQzMzYsIDEyOTAyLCAxMjkwMiwgMTMzOTYsIDEyOTAyLCAxMTYyOSwgMTE5NDAsIDEyMjg4LCAxMzEzOCwgMTIxMDksCi0gICAgIDEyMjg4LCAxMjkwMiwgMTM2NzcsIDEyNjgzLCAxMjkwMiwgMTMxMzgsIDcxMX0sCi0gICAgLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMzAgb2YgMTc3Ci0gICAgezQzMDAsIDUyMDQsIDk0MzcsIDEzMzk2LCA1NDMwLCA1Nzc2LCA5MzAwLCAxMjkwMiwgOTY1NiwgOTQzNywgMTE3ODEsIDE0NzMxLAotICAgICAxMzM5NiwgMTI5MDIsIDE0NzMxLCAxNjM4NCwgODk4Mn0sCi0gICAgezUzOTQsIDU3NzYsIDg5ODIsIDEyMjg4LCA1OTIyLCA1OTAxLCA4NjQwLCAxMTYyOSwgOTEwNSwgODY5NCwgMTA2MzUsIDEzMTM4LAotICAgICAxMjI4OCwgMTE2MjksIDEzMTM4LCAxNDczMSwgNjg0NH0sCi0gICAgezE3MjM0LCAxNTcyNSwgMTU3MjUsIDE1NzI1LCAxNTcyNSwgMTQ3MzEsIDE0NzMxLCAxNDczMSwgMTYzODQsIDE0NzMxLAotICAgICAxNDczMSwgMTUxODYsIDE2Mzg0LCAxNTE4NiwgMTUxODYsIDE1MTg2LCAyNzJ9LAotICAgIHs2NDYxLCA2Mjg2LCA4ODA2LCAxMTM0OCwgNjU2NiwgNjIxNSwgODMzNCwgMTA3NDIsIDkyMzMsIDg1MzUsIDEwMDYxLCAxMjEwOSwKLSAgICAgMTE3ODEsIDEwOTcwLCAxMjEwOSwgMTM2NzcsIDUzOTR9LAotICAgIHs2Njc0LCA2NDg3LCA4ODYzLCAxMTQ4NSwgNjcwMiwgNjI4NiwgODMzNCwgMTA2MzUsIDkxNjgsIDg0ODMsIDk5NzYsIDExOTQwLAotICAgICAxMTYyOSwgMTA4NTQsIDExOTQwLCAxMzM5NiwgNTEwNX0sCi0gICAgezE1MTg2LCAxMzY3NywgMTM2NzcsIDEzOTg4LCAxMzY3NywgMTI0NzksIDEyNDc5LCAxMjY4MywgMTM5ODgsIDEyNjgzLAotICAgICAxMjkwMiwgMTMxMzgsIDE0MzM2LCAxMzEzOCwgMTMzOTYsIDEzNjc3LCA1NjV9LAotICAgIHs3ODQ0LCA3MjUyLCA4OTIyLCAxMDg1NCwgNzM4OSwgNjgxNSwgODM4MywgMTAyNDAsIDk1MDgsIDg3NTAsIDk4OTIsIDExNDg1LAotICAgICAxMTYyOSwgMTA3NDIsIDExNjI5LCAxMjkwMiwgMzg0Mn0sCi0gICAgezkyMzMsIDgyMzksIDkyMzMsIDEwNDMxLCA4MzM0LCA3NDI0LCA4NDgzLCA5ODkyLCAxMDA2MSwgOTEwNSwgMTAwNjEsIDExMjE2LAotICAgICAxMTc4MSwgMTA3NDIsIDExNDg1LCAxMjQ3OSwgMjkwNn0sCi0gICAgezIwNDgwLCAyMDQ4MCwgMTQ3MzEsIDE0NzMxLCAyMDQ4MCwgMjA0ODAsIDE0MzM2LCAxNDMzNiwgMTUxODYsIDE0MzM2LAotICAgICAxNDczMSwgMTQ3MzEsIDE1MTg2LCAxNDczMSwgMTQ3MzEsIDE1MTg2LCAyNjZ9LAotICAgIHsxMDUzMSwgOTMwMCwgOTk3NiwgMTEwOTAsIDk0MzcsIDgyODYsIDkwNDIsIDEwMDYxLCAxMDQzMSwgOTM2OCwgOTk3NiwKLSAgICAgMTA4NTQsIDExNzgxLCAxMDUzMSwgMTEwOTAsIDExNzgxLCAyMjMzfSwKLSAgICB7MTE2MjksIDEwMzM0LCAxMDk3MCwgMTIxMDksIDEwNDMxLCA5MzY4LCAxMDA2MSwgMTA5NzAsIDExMzQ4LCAxMDI0MCwgMTA4NTQsCi0gICAgIDExNDg1LCAxMjI4OCwgMTEyMTYsIDExNjI5LCAxMjI4OCwgMTQ2OX0sCi0gICAgezk1MiwgNjc4NywgMTU3MjUsIDIwNDgwLCA2NjQ2LCA5NzMzLCAxNjM4NCwgMjA0ODAsIDE0NzMxLCAxNTcyNSwgMTg0MzIsCi0gICAgIDIwNDgwLCAxODQzMiwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMTg0MzJ9LAotICAgIHs5NDM3LCA4ODA2LCAxMDc0MiwgMTIyODgsIDg5ODIsIDg0ODMsIDk4OTIsIDExMjE2LCAxMDc0MiwgOTg5MiwgMTA4NTQsCi0gICAgIDExOTQwLCAxMjEwOSwgMTEwOTAsIDExNzgxLCAxMjY4MywgMTg5MX0sCi0gICAgezEyOTAyLCAxMTYyOSwgMTE5NDAsIDEyNDc5LCAxMTc4MSwgMTA1MzEsIDEwODU0LCAxMTQ4NSwgMTIxMDksIDEwOTcwLAotICAgICAxMTM0OCwgMTE5NDAsIDEyOTAyLCAxMTc4MSwgMTIxMDksIDEyNDc5LCAxMDU0fSwKLSAgICB7MjExMywgNTMyMywgMTE3ODEsIDE2Mzg0LCA1NTc5LCA3MjUyLCAxMjI4OCwgMTYzODQsIDExNzgxLCAxMjI4OCwgMTUxODYsCi0gICAgIDE4NDMyLCAxNTcyNSwgMTYzODQsIDE4NDMyLCAyMDQ4MCwgMTI5MDJ9LAotICAgIHsyNDYzLCA1OTY1LCAxMTM0OCwgMTUxODYsIDU1MjIsIDY5MzQsIDExMjE2LCAxNDczMSwgMTAzMzQsIDEwNjM1LCAxMzY3NywKLSAgICAgMTYzODQsIDEzOTg4LCAxMzk4OCwgMTU3MjUsIDE4NDMyLCAxMDMzNH0sCi0gICAgezM3NzksIDU1NDEsIDk4MTIsIDEzNjc3LCA1NDY3LCA2MTIyLCA5NjU2LCAxMzEzOCwgOTU4MSwgOTQzNywgMTE5NDAsIDE0NzMxLAotICAgICAxMzEzOCwgMTI2ODMsIDE0MzM2LCAxNjM4NCwgODk4Mn0sCi0gICAgezMxODEsIDUxNTQsIDEwMTUwLCAxNDMzNiwgNTQ0OCwgNjMxMSwgMTAzMzQsIDEzOTg4LCAxMDMzNCwgMTA0MzEsIDEzMTM4LAotICAgICAxNTcyNSwgMTQzMzYsIDEzOTg4LCAxNTcyNSwgMTg0MzIsIDEwNDMxfSwKLSAgICB7NDg0MSwgNTU2MCwgOTEwNSwgMTI0NzksIDU3NTYsIDU5NDQsIDg5MjIsIDEyMTA5LCA5MzAwLCA4OTgyLCAxMTA5MCwgMTM2NzcsCi0gICAgIDEyNDc5LCAxMjEwOSwgMTM2NzcsIDE1MTg2LCA3NDYwfSwKLSAgICB7NTg1OSwgNjAwOSwgODkyMiwgMTE5NDAsIDYxNDQsIDU5ODcsIDg0ODMsIDExMzQ4LCA5MDQyLCA4NTM1LCAxMDMzNCwgMTI2ODMsCi0gICAgIDExOTQwLCAxMTIxNiwgMTI2ODMsIDE0MzM2LCA2MjE1fSwKLSAgICB7NDI1MCwgNDkxNiwgODU4NywgMTIxMDksIDU5MDEsIDYxOTEsIDkyMzMsIDEyMjg4LCAxMDE1MCwgOTg5MiwgMTE5NDAsCi0gICAgIDE0MzM2LCAxMzY3NywgMTMxMzgsIDE0NzMxLCAxNjM4NCwgODM4M30sCi0gICAgezcxNTMsIDY3MDIsIDg4NjMsIDExMjE2LCA2OTA0LCA2NDEwLCA4MjM5LCAxMDQzMSwgOTIzMywgODQzMywgOTgxMiwgMTE2MjksCi0gICAgIDExNjI5LCAxMDc0MiwgMTE3ODEsIDEzMTM4LCA0NzUzfSwKLSAgICB7NjY3NCwgNzA1NywgOTUwOCwgMTE2MjksIDcxMjAsIDY5NjQsIDg4MDYsIDEwNjM1LCA5NDM3LCA4NzUwLCAxMDA2MSwgMTE2MjksCi0gICAgIDExNDg1LCAxMDUzMSwgMTE0ODUsIDEyNjgzLCA0MDYyfSwKLSAgICB7NTM0MSwgNTI4OSwgODAxMywgMTA5NzAsIDYzMTEsIDYyNjIsIDg2NDAsIDExMDkwLCAxMDA2MSwgOTUwOCwgMTEwOTAsCi0gICAgIDEzMTM4LCAxMjkwMiwgMTIyODgsIDEzMzk2LCAxNTE4NiwgNjUzOX0sCi0gICAgezgwNTcsIDc1MzMsIDkzMDAsIDExMjE2LCA3Njg1LCA3MDU3LCA4NTM1LCAxMDMzNCwgOTUwOCwgODY5NCwgOTgxMiwgMTEyMTYsCi0gICAgIDExNDg1LCAxMDQzMSwgMTEzNDgsIDEyNDc5LCAzNTQxfSwKLSAgICB7OTE2OCwgODIzOSwgOTY1NiwgMTEyMTYsIDg0ODMsIDc2MDgsIDg4MDYsIDEwMjQwLCA5ODkyLCA4OTgyLCA5ODEyLCAxMTA5MCwKLSAgICAgMTE0ODUsIDEwNDMxLCAxMTA5MCwgMTIxMDksIDI4MTV9LAotICAgIC8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTMxIG9mIDE3NwotICAgIHs1NTgsIDc5MjgsIDE4NDMyLCAyMDQ4MCwgNzcyNCwgMTIyODgsIDIwNDgwLCAyMDQ4MCwgMTg0MzIsIDIwNDgwLCAyMDQ4MCwKLSAgICAgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MH0sCi0gICAgezk4OTIsIDg4MDYsIDk5NzYsIDExMzQ4LCA5MDQyLCA4MDU3LCA5MDQyLCAxMDI0MCwgMTAyNDAsIDkyMzMsIDk5NzYsIDExMDkwLAotICAgICAxMTYyOSwgMTA1MzEsIDExMjE2LCAxMjEwOSwgMjM3MX0sCi0gICAgezExMDkwLCA5ODEyLCAxMDUzMSwgMTE2MjksIDk5NzYsIDg4NjMsIDk1MDgsIDEwNTMxLCAxMDg1NCwgOTczMywgMTAzMzQsCi0gICAgIDExMDkwLCAxMTk0MCwgMTA3NDIsIDExMjE2LCAxMTk0MCwgMTgyMX0sCi0gICAgezczNTQsIDY5NjQsIDkwNDIsIDExMjE2LCA3MTUzLCA2NTkyLCA4MzM0LCAxMDQzMSwgOTIzMywgODQ4MywgOTgxMiwgMTE0ODUsCi0gICAgIDExNDg1LCAxMDUzMSwgMTE2MjksIDEyOTAyLCA0MzQ5fSwKLSAgICB7MTEzNDgsIDEwMTUwLCAxMDc0MiwgMTE2MjksIDEwMTUwLCA5MDQyLCA5NjU2LCAxMDQzMSwgMTA4NTQsIDk4MTIsIDEwNDMxLAotICAgICAxMTIxNiwgMTIxMDksIDEwOTcwLCAxMTQ4NSwgMTIxMDksIDE3MDB9LAotICAgIHsyMDQ4MCwgMjA0ODAsIDg2OTQsIDEwMTUwLCAyMDQ4MCwgMjA0ODAsIDg5ODIsIDEwMjQwLCA4OTgyLCA5MTA1LCA5OTc2LAotICAgICAxMDk3MCwgMTA0MzEsIDEwNDMxLCAxMTA5MCwgMTE5NDAsIDE2MTB9LAotICAgIHs5MjMzLCA4MTkyLCA5MzY4LCAxMDk3MCwgODI4NiwgNzQ5NiwgODU4NywgOTk3NiwgOTgxMiwgODg2MywgOTczMywgMTA4NTQsCi0gICAgIDExMzQ4LCAxMDMzNCwgMTEwOTAsIDExOTQwLCAzMDQwfSwKLSAgICB7NDIwMiwgNTcxNiwgOTczMywgMTMxMzgsIDU1OTgsIDYwOTksIDk0MzcsIDEyNjgzLCA5MzAwLCA5MTY4LCAxMTQ4NSwgMTM5ODgsCi0gICAgIDEyNDc5LCAxMjEwOSwgMTM5ODgsIDE1NzI1LCA3ODA0fSwKLSAgICB7NDQwMCwgNTk2NSwgOTUwOCwgMTI0NzksIDYwMDksIDYzNjAsIDkxMDUsIDExNzgxLCA5MzAwLCA4OTgyLCAxMDk3MCwgMTMxMzgsCi0gICAgIDEyMTA5LCAxMTYyOSwgMTMxMzgsIDE0NzMxLCA2OTk0fX07CmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvU3BlY3RyYWxEYXRhVGFibGVzLmhwcCBiL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9TcGVjdHJhbERhdGFUYWJsZXMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzAzMWI2Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9TcGVjdHJhbERhdGFUYWJsZXMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIFNwZWN0cmFsRGF0YVRhYmxlcy5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZgotLy8gU2VjdGlvbiA1LjcuNiBTcGVjdHJhbCBkYXRhCi0KLSNpZm5kZWYgU1BFQ1RSQUxfREFUQV9UQUJMRVNfSF8KLSNkZWZpbmUgU1BFQ1RSQUxfREFUQV9UQUJMRVNfSF8KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYWNfc3BlY19sb29rdXBbNDA5Nl07Ci1leHRlcm4gc2hvcnQgYWNfc3BlY19jdW1mcmVxWzY0XVsxN107Ci1leHRlcm4gc2hvcnQgYWNfc3BlY19mcmVxWzY0XVsxN107Ci1leHRlcm4gc2hvcnQgYWNfc3BlY19iaXRzWzY0XVsxN107Ci0KLSNlbmRpZiAgLy8gU1BFQ1RSQUxfREFUQV9UQUJMRVNfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9UZW1wb3JhbE5vaXNlU2hhcGluZ1RhYmxlcy5jcHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvVGVtcG9yYWxOb2lzZVNoYXBpbmdUYWJsZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjYwNjYzLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9UZW1wb3JhbE5vaXNlU2hhcGluZ1RhYmxlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogVGVtcG9yYWxOb2lzZVNoYXBpbmdUYWJsZXMuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjQgVGVtcG9yYWwgTm9pc2UgU2hhcGluZwotI2luY2x1ZGUgIlRlbXBvcmFsTm9pc2VTaGFwaW5nVGFibGVzLmhwcCIKLQotLy8gTEMzIFNwZWNpZmljYXRpb24gZDA5cjAxLnBkZjsgUGFnZSAxMDkgb2YgMTc3Ci1zaG9ydCBhY190bnNfb3JkZXJfYml0c1syXVs4XSA9IHsKLSAgICB7MTcyMzQsIDEzOTg4LCAxMTIxNiwgODY5NCwgNjU2NiwgNDk3NywgMzk2MSwgMzA0MH0sCi0gICAgezEyNjgzLCA5NDM3LCA2ODc0LCA1NTQxLCA1MTIxLCA1MTcwLCA1MzU5LCA1MDU2fX07Ci1zaG9ydCBhY190bnNfb3JkZXJfZnJlcVsyXVs4XSA9IHt7MywgOSwgMjMsIDU0LCAxMTEsIDE5MCwgMjY4LCAzNjZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE0LCA0MiwgMTAwLCAxNTcsIDE4MSwgMTc4LCAxNjcsIDE4NX19Owotc2hvcnQgYWNfdG5zX29yZGVyX2N1bWZyZXFbMl1bOF0gPSB7ezAsIDMsIDEyLCAzNSwgODksIDIwMCwgMzkwLCA2NTh9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDE0LCA1NiwgMTU2LCAzMTMsIDQ5NCwgNjcyLCA4Mzl9fTsKLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTEwIG9mIDE3Nwotc2hvcnQgYWNfdG5zX2NvZWZfYml0c1s4XVsxN10gPSB7Ci0gICAgezIwNDgwLCAxNTcyNSwgMTI0NzksIDEwMzM0LCA4Njk0LCA3MzIwLCA2OTY0LCA2MzM1LCA1NTA0LCA1NjM3LCA2NTY2LCA2NzU4LAotICAgICA4NDMzLCAxMTM0OCwgMTUxODYsIDIwNDgwLCAyMDQ4MH0sCi0gICAgezIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAxMjkwMiwgOTM2OCwgNzA1NywgNTkwMSwgNTI1NCwgNTQ4NSwgNTU5OCwKLSAgICAgNjA3NiwgNzYwOCwgMTA3NDIsIDE1MTg2LCAyMDQ4MCwgMjA0ODB9LAotICAgIHsyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMTM5ODgsIDkzNjgsIDY3MDIsIDQ4NDEsIDQ1ODUsIDQ2ODIsIDU4NTksCi0gICAgIDc3NjQsIDEyMTA5LCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MH0sCi0gICAgezIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAxODQzMiwgMTMzOTYsIDg5ODIsIDQ3NjcsIDM3NzksIDM2NTgsIDYzMzUsCi0gICAgIDk2NTYsIDEzOTg4LCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MH0sCi0gICAgezIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMTQ3MzEsIDk0MzcsIDQyNzUsIDMyNDksIDM0OTMsIDg0ODMsCi0gICAgIDEzOTg4LCAxNzIzNCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODB9LAotICAgIHsyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAxMjkwMiwgNDc1MywgMzA0MCwgMjk1MywgOTEwNSwKLSAgICAgMTU3MjUsIDIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MH0sCi0gICAgezIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODAsIDEyOTAyLCAzODIxLCAzMzQ2LCAzMDAwLCAxMjEwOSwKLSAgICAgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MH0sCi0gICAgezIwNDgwLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODAsIDE1NzI1LCAzNjU4LCAyMDQ4MCwgMTIwMSwgMTA4NTQsCi0gICAgIDE4NDMyLCAyMDQ4MCwgMjA0ODAsIDIwNDgwLCAyMDQ4MCwgMjA0ODB9fTsKLXNob3J0IGFjX3Ruc19jb2VmX2ZyZXFbOF1bMTddID0gewotICAgIHsxLCA1LCAxNSwgMzEsIDU0LCA4NiwgOTcsIDEyMCwgMTU5LCAxNTIsIDExMSwgMTA0LCA1OSwgMjIsIDYsIDEsIDF9LAotICAgIHsxLCAxLCAxLCAxLCAxMywgNDMsIDk0LCAxMzksIDE3MywgMTYwLCAxNTQsIDEzMSwgNzgsIDI3LCA2LCAxLCAxfSwKLSAgICB7MSwgMSwgMSwgMSwgOSwgNDMsIDEwNiwgMTk5LCAyMTcsIDIxMCwgMTQxLCA3NCwgMTcsIDEsIDEsIDEsIDF9LAotICAgIHsxLCAxLCAxLCAxLCAyLCAxMSwgNDksIDIwNCwgMjg1LCAyOTcsIDEyMCwgMzksIDksIDEsIDEsIDEsIDF9LAotICAgIHsxLCAxLCAxLCAxLCAxLCA3LCA0MiwgMjQxLCAzNDEsIDMxNCwgNTgsIDksIDMsIDEsIDEsIDEsIDF9LAotICAgIHsxLCAxLCAxLCAxLCAxLCAxLCAxMywgMjA1LCAzNjYsIDM3NywgNDcsIDUsIDEsIDEsIDEsIDEsIDF9LAotICAgIHsxLCAxLCAxLCAxLCAxLCAxLCAxMywgMjgxLCAzMzAsIDM3MSwgMTcsIDEsIDEsIDEsIDEsIDEsIDF9LAotICAgIHsxLCAxLCAxLCAxLCAxLCAxLCA1LCAyOTcsIDEsIDY4MiwgMjYsIDIsIDEsIDEsIDEsIDEsIDF9fTsKLXNob3J0IGFjX3Ruc19jb2VmX2N1bWZyZXFbOF1bMTddID0ge3swLCAxLCA2LCAyMSwgNTIsIDEwNiwgMTkyLCAyODksIDQwOSwgNTY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMCwgODMxLCA5MzUsIDk5NCwgMTAxNiwgMTAyMiwgMTAyM30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMiwgMywgNCwgMTcsIDYwLCAxNTQsIDI5MywgNDY2LCA2MjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzgwLCA5MTEsIDk4OSwgMTAxNiwgMTAyMiwgMTAyM30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMiwgMywgNCwgMTMsIDU2LCAxNjIsIDM2MSwgNTc4LCA3ODgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTI5LCAxMDAzLCAxMDIwLCAxMDIxLCAxMDIyLCAxMDIzfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAxLCAyLCAzLCA0LCA2LCAxNywgNjYsIDI3MCwgNTU1LCA4NTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTcyLCAxMDExLCAxMDIwLCAxMDIxLCAxMDIyLCAxMDIzfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAxLCAyLCAzLCA0LCA1LCAxMiwgNTQsIDI5NSwgNjM2LCA5NTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwOCwgMTAxNywgMTAyMCwgMTAyMSwgMTAyMiwgMTAyM30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMiwgMywgNCwgNSwgNiwgMTksIDIyNCwgNTkwLCA5NjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNCwgMTAxOSwgMTAyMCwgMTAyMSwgMTAyMiwgMTAyM30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMiwgMywgNCwgNSwgNiwgMTksIDMwMCwgNjMwLCAxMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTgsIDEwMTksIDEwMjAsIDEwMjEsIDEwMjIsIDEwMjN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDEsIDIsIDMsIDQsIDUsIDYsIDExLCAzMDgsIDMwOSwgOTkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTcsIDEwMTksIDEwMjAsIDEwMjEsIDEwMjIsIDEwMjN9fTsKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9UZW1wb3JhbE5vaXNlU2hhcGluZ1RhYmxlcy5ocHAgYi9lbWJkcnYvbGMzL0NvbW1vbi9UYWJsZXMvVGVtcG9yYWxOb2lzZVNoYXBpbmdUYWJsZXMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTI5OGI2Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQ29tbW9uL1RhYmxlcy9UZW1wb3JhbE5vaXNlU2hhcGluZ1RhYmxlcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogVGVtcG9yYWxOb2lzZVNoYXBpbmdUYWJsZXMuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGYKLS8vIFNlY3Rpb24gNS43LjQgVGVtcG9yYWwgTm9pc2UgU2hhcGluZwotCi0jaWZuZGVmIFRFTVBPUkFMX05PSVNFX1NIQVBJTkdfVEFCTEVTX0hfCi0jZGVmaW5lIFRFTVBPUkFMX05PSVNFX1NIQVBJTkdfVEFCTEVTX0hfCi0KLS8vIExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMS5wZGY7IFBhZ2UgMTA5IG9mIDE3NwotZXh0ZXJuIHNob3J0IGFjX3Ruc19vcmRlcl9iaXRzWzJdWzhdOwotZXh0ZXJuIHNob3J0IGFjX3Ruc19vcmRlcl9mcmVxWzJdWzhdOwotZXh0ZXJuIHNob3J0IGFjX3Ruc19vcmRlcl9jdW1mcmVxWzJdWzhdOwotCi1leHRlcm4gc2hvcnQgYWNfdG5zX2NvZWZfYml0c1s4XVsxN107Ci1leHRlcm4gc2hvcnQgYWNfdG5zX2NvZWZfZnJlcVs4XVsxN107Ci1leHRlcm4gc2hvcnQgYWNfdG5zX2NvZWZfY3VtZnJlcVs4XVsxN107Ci0KLSNlbmRpZiAgLy8gVEVNUE9SQUxfTk9JU0VfU0hBUElOR19UQUJMRVNfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvQ29tbW9uL2ZmdC9mZnQuYyBiL2VtYmRydi9sYzMvQ29tbW9uL2ZmdC9mZnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4NDMwMi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0NvbW1vbi9mZnQvZmZ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImZmdC5oIgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgRkZUIHByb2Nlc3NpbmcKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKgotICogVGFibGVzCi0gKgotICogICBUX05bMC4uTi0xXSA9Ci0gKiAgICAgeyBjb3MoLTJQaSAgaS9OKSArIGogc2luKC0yUGkgIGkvTiksCi0gKiAgICAgICBjb3MoLTJQaSAyaS9OKSArIGogc2luKC0yUGkgMmkvTikgfSAsIE49MTUsIDQ1LCA5MAotICoKLSAqICAgVF9OWzAuLk4vMi0xXSA9Ci0gKiAgICAgY29zKC0yUGkgIGkvTikgKyBqIHNpbigtMlBpICBpL04pICwgTj0xMCwgMjAsIC4uLgotICovCi0KLXN0cnVjdCBmZnRfYmYyX3R3aWRkbGVzIHsKLSAgaW50IG4yOwotICBjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHQ7Ci19Owotc3RydWN0IGZmdF9iZjNfdHdpZGRsZXMgewotICBpbnQgbjM7Ci0gIGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleCAoKnQpWzJdOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmZnRfYmYyX3R3aWRkbGVzIHR3aWRkbGVzXzEwID0gewotICAgIC5uMiA9IDEwIC8gMiwKLSAgICAudCA9IChjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXhbXSl7Ci0gICAgICAgIHsxLjAwMDAwMDBlKzAwLCAtMC4wMDAwMDAwZSswMH0sCi0gICAgICAgIHs4LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sCi0gICAgICAgIHszLjA5MDE2OTllLTAxLCAtOS41MTA1NjUyZS0wMX0sCi0gICAgICAgIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LAotICAgICAgICB7LTguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwKLSAgICB9fTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmZnRfYmYyX3R3aWRkbGVzIHR3aWRkbGVzXzIwID0gewotICAgIC5uMiA9IDIwIC8gMiwKLSAgICAudCA9IChjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXhbXSl7Ci0gICAgICAgIHsxLjAwMDAwMDBlKzAwLCAtMC4wMDAwMDAwZSswMH0sCi0gICAgICAgIHs5LjUxMDU2NTJlLTAxLCAtMy4wOTAxNjk5ZS0wMX0sCi0gICAgICAgIHs4LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sCi0gICAgICAgIHs1Ljg3Nzg1MjVlLTAxLCAtOC4wOTAxNjk5ZS0wMX0sCi0gICAgICAgIHszLjA5MDE2OTllLTAxLCAtOS41MTA1NjUyZS0wMX0sCi0gICAgICAgIHs2LjEyMzIzNDBlLTE3LCAtMS4wMDAwMDAwZSswMH0sCi0gICAgICAgIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LAotICAgICAgICB7LTUuODc3ODUyNWUtMDEsIC04LjA5MDE2OTllLTAxfSwKLSAgICAgICAgey04LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sCi0gICAgICAgIHstOS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LAotICAgIH19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjJfdHdpZGRsZXMgdHdpZGRsZXNfMzAgPSB7Ci0gICAgLm4yID0gMzAgLyAyLAotICAgIC50ID0gKGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleFtdKXsKLSAgICAgICAgezEuMDAwMDAwMGUrMDAsIC0wLjAwMDAwMDBlKzAwfSwKLSAgICAgICAgezkuNzgxNDc2MGUtMDEsIC0yLjA3OTExNjllLTAxfSwKLSAgICAgICAgezkuMTM1NDU0NmUtMDEsIC00LjA2NzM2NjRlLTAxfSwKLSAgICAgICAgezguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwKLSAgICAgICAgezYuNjkxMzA2MWUtMDEsIC03LjQzMTQ0ODNlLTAxfSwKLSAgICAgICAgezUuMDAwMDAwMGUtMDEsIC04LjY2MDI1NDBlLTAxfSwKLSAgICAgICAgezMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwKLSAgICAgICAgezEuMDQ1Mjg0NmUtMDEsIC05Ljk0NTIxOTBlLTAxfSwKLSAgICAgICAgey0xLjA0NTI4NDZlLTAxLCAtOS45NDUyMTkwZS0wMX0sCi0gICAgICAgIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LAotICAgICAgICB7LTUuMDAwMDAwMGUtMDEsIC04LjY2MDI1NDBlLTAxfSwKLSAgICAgICAgey02LjY5MTMwNjFlLTAxLCAtNy40MzE0NDgzZS0wMX0sCi0gICAgICAgIHstOC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LAotICAgICAgICB7LTkuMTM1NDU0NmUtMDEsIC00LjA2NzM2NjRlLTAxfSwKLSAgICAgICAgey05Ljc4MTQ3NjBlLTAxLCAtMi4wNzkxMTY5ZS0wMX0sCi0gICAgfX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyB0d2lkZGxlc180MCA9IHsKLSAgICAubjIgPSA0MCAvIDIsCi0gICAgLnQgPSAoY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4W10pewotICAgICAgICB7MS4wMDAwMDAwZSswMCwgLTAuMDAwMDAwMGUrMDB9LCAgezkuODc2ODgzNGUtMDEsIC0xLjU2NDM0NDdlLTAxfSwKLSAgICAgICAgezkuNTEwNTY1MmUtMDEsIC0zLjA5MDE2OTllLTAxfSwgIHs4LjkxMDA2NTJlLTAxLCAtNC41Mzk5MDUwZS0wMX0sCi0gICAgICAgIHs4LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sICB7Ny4wNzEwNjc4ZS0wMSwgLTcuMDcxMDY3OGUtMDF9LAotICAgICAgICB7NS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LCAgezQuNTM5OTA1MGUtMDEsIC04LjkxMDA2NTJlLTAxfSwKLSAgICAgICAgezMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwgIHsxLjU2NDM0NDdlLTAxLCAtOS44NzY4ODM0ZS0wMX0sCi0gICAgICAgIHs2LjEyMzIzNDBlLTE3LCAtMS4wMDAwMDAwZSswMH0sICB7LTEuNTY0MzQ0N2UtMDEsIC05Ljg3Njg4MzRlLTAxfSwKLSAgICAgICAgey0zLjA5MDE2OTllLTAxLCAtOS41MTA1NjUyZS0wMX0sIHstNC41Mzk5MDUwZS0wMSwgLTguOTEwMDY1MmUtMDF9LAotICAgICAgICB7LTUuODc3ODUyNWUtMDEsIC04LjA5MDE2OTllLTAxfSwgey03LjA3MTA2NzhlLTAxLCAtNy4wNzEwNjc4ZS0wMX0sCi0gICAgICAgIHstOC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LCB7LTguOTEwMDY1MmUtMDEsIC00LjUzOTkwNTBlLTAxfSwKLSAgICAgICAgey05LjUxMDU2NTJlLTAxLCAtMy4wOTAxNjk5ZS0wMX0sIHstOS44NzY4ODM0ZS0wMSwgLTEuNTY0MzQ0N2UtMDF9LAotICAgIH19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjJfdHdpZGRsZXMgdHdpZGRsZXNfNjAgPSB7Ci0gICAgLm4yID0gNjAgLyAyLAotICAgIC50ID0gKGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleFtdKXsKLSAgICAgICAgezEuMDAwMDAwMGUrMDAsIC0wLjAwMDAwMDBlKzAwfSwgIHs5Ljk0NTIxOTBlLTAxLCAtMS4wNDUyODQ2ZS0wMX0sCi0gICAgICAgIHs5Ljc4MTQ3NjBlLTAxLCAtMi4wNzkxMTY5ZS0wMX0sICB7OS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LAotICAgICAgICB7OS4xMzU0NTQ2ZS0wMSwgLTQuMDY3MzY2NGUtMDF9LCAgezguNjYwMjU0MGUtMDEsIC01LjAwMDAwMDBlLTAxfSwKLSAgICAgICAgezguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwgIHs3LjQzMTQ0ODNlLTAxLCAtNi42OTEzMDYxZS0wMX0sCi0gICAgICAgIHs2LjY5MTMwNjFlLTAxLCAtNy40MzE0NDgzZS0wMX0sICB7NS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LAotICAgICAgICB7NS4wMDAwMDAwZS0wMSwgLTguNjYwMjU0MGUtMDF9LCAgezQuMDY3MzY2NGUtMDEsIC05LjEzNTQ1NDZlLTAxfSwKLSAgICAgICAgezMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwgIHsyLjA3OTExNjllLTAxLCAtOS43ODE0NzYwZS0wMX0sCi0gICAgICAgIHsxLjA0NTI4NDZlLTAxLCAtOS45NDUyMTkwZS0wMX0sICB7Mi44MzI3Njk0ZS0xNiwgLTEuMDAwMDAwMGUrMDB9LAotICAgICAgICB7LTEuMDQ1Mjg0NmUtMDEsIC05Ljk0NTIxOTBlLTAxfSwgey0yLjA3OTExNjllLTAxLCAtOS43ODE0NzYwZS0wMX0sCi0gICAgICAgIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LCB7LTQuMDY3MzY2NGUtMDEsIC05LjEzNTQ1NDZlLTAxfSwKLSAgICAgICAgey01LjAwMDAwMDBlLTAxLCAtOC42NjAyNTQwZS0wMX0sIHstNS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LAotICAgICAgICB7LTYuNjkxMzA2MWUtMDEsIC03LjQzMTQ0ODNlLTAxfSwgey03LjQzMTQ0ODNlLTAxLCAtNi42OTEzMDYxZS0wMX0sCi0gICAgICAgIHstOC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LCB7LTguNjYwMjU0MGUtMDEsIC01LjAwMDAwMDBlLTAxfSwKLSAgICAgICAgey05LjEzNTQ1NDZlLTAxLCAtNC4wNjczNjY0ZS0wMX0sIHstOS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LAotICAgICAgICB7LTkuNzgxNDc2MGUtMDEsIC0yLjA3OTExNjllLTAxfSwgey05Ljk0NTIxOTBlLTAxLCAtMS4wNDUyODQ2ZS0wMX0sCi0gICAgfX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyB0d2lkZGxlc184MCA9IHsKLSAgICAubjIgPSA4MCAvIDIsCi0gICAgLnQgPSAoY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4W10pewotICAgICAgICB7MS4wMDAwMDAwZSswMCwgLTAuMDAwMDAwMGUrMDB9LCAgezkuOTY5MTczM2UtMDEsIC03Ljg0NTkwOTZlLTAyfSwKLSAgICAgICAgezkuODc2ODgzNGUtMDEsIC0xLjU2NDM0NDdlLTAxfSwgIHs5LjcyMzY5OTJlLTAxLCAtMi4zMzQ0NTM2ZS0wMX0sCi0gICAgICAgIHs5LjUxMDU2NTJlLTAxLCAtMy4wOTAxNjk5ZS0wMX0sICB7OS4yMzg3OTUzZS0wMSwgLTMuODI2ODM0M2UtMDF9LAotICAgICAgICB7OC45MTAwNjUyZS0wMSwgLTQuNTM5OTA1MGUtMDF9LCAgezguNTI2NDAxNmUtMDEsIC01LjIyNDk4NTZlLTAxfSwKLSAgICAgICAgezguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwgIHs3LjYwNDA1OTdlLTAxLCAtNi40OTQ0ODA1ZS0wMX0sCi0gICAgICAgIHs3LjA3MTA2NzhlLTAxLCAtNy4wNzEwNjc4ZS0wMX0sICB7Ni40OTQ0ODA1ZS0wMSwgLTcuNjA0MDU5N2UtMDF9LAotICAgICAgICB7NS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LCAgezUuMjI0OTg1NmUtMDEsIC04LjUyNjQwMTZlLTAxfSwKLSAgICAgICAgezQuNTM5OTA1MGUtMDEsIC04LjkxMDA2NTJlLTAxfSwgIHszLjgyNjgzNDNlLTAxLCAtOS4yMzg3OTUzZS0wMX0sCi0gICAgICAgIHszLjA5MDE2OTllLTAxLCAtOS41MTA1NjUyZS0wMX0sICB7Mi4zMzQ0NTM2ZS0wMSwgLTkuNzIzNjk5MmUtMDF9LAotICAgICAgICB7MS41NjQzNDQ3ZS0wMSwgLTkuODc2ODgzNGUtMDF9LCAgezcuODQ1OTA5NmUtMDIsIC05Ljk2OTE3MzNlLTAxfSwKLSAgICAgICAgezYuMTIzMjM0MGUtMTcsIC0xLjAwMDAwMDBlKzAwfSwgIHstNy44NDU5MDk2ZS0wMiwgLTkuOTY5MTczM2UtMDF9LAotICAgICAgICB7LTEuNTY0MzQ0N2UtMDEsIC05Ljg3Njg4MzRlLTAxfSwgey0yLjMzNDQ1MzZlLTAxLCAtOS43MjM2OTkyZS0wMX0sCi0gICAgICAgIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LCB7LTMuODI2ODM0M2UtMDEsIC05LjIzODc5NTNlLTAxfSwKLSAgICAgICAgey00LjUzOTkwNTBlLTAxLCAtOC45MTAwNjUyZS0wMX0sIHstNS4yMjQ5ODU2ZS0wMSwgLTguNTI2NDAxNmUtMDF9LAotICAgICAgICB7LTUuODc3ODUyNWUtMDEsIC04LjA5MDE2OTllLTAxfSwgey02LjQ5NDQ4MDVlLTAxLCAtNy42MDQwNTk3ZS0wMX0sCi0gICAgICAgIHstNy4wNzEwNjc4ZS0wMSwgLTcuMDcxMDY3OGUtMDF9LCB7LTcuNjA0MDU5N2UtMDEsIC02LjQ5NDQ4MDVlLTAxfSwKLSAgICAgICAgey04LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sIHstOC41MjY0MDE2ZS0wMSwgLTUuMjI0OTg1NmUtMDF9LAotICAgICAgICB7LTguOTEwMDY1MmUtMDEsIC00LjUzOTkwNTBlLTAxfSwgey05LjIzODc5NTNlLTAxLCAtMy44MjY4MzQzZS0wMX0sCi0gICAgICAgIHstOS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LCB7LTkuNzIzNjk5MmUtMDEsIC0yLjMzNDQ1MzZlLTAxfSwKLSAgICAgICAgey05Ljg3Njg4MzRlLTAxLCAtMS41NjQzNDQ3ZS0wMX0sIHstOS45NjkxNzMzZS0wMSwgLTcuODQ1OTA5NmUtMDJ9LAotICAgIH19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjJfdHdpZGRsZXMgdHdpZGRsZXNfOTAgPSB7Ci0gICAgLm4yID0gOTAgLyAyLAotICAgIC50ID0gKGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleFtdKXsKLSAgICAgICAgezEuMDAwMDAwMGUrMDAsIC0wLjAwMDAwMDBlKzAwfSwgIHs5Ljk3NTY0MDVlLTAxLCAtNi45NzU2NDc0ZS0wMn0sCi0gICAgICAgIHs5LjkwMjY4MDdlLTAxLCAtMS4zOTE3MzEwZS0wMX0sICB7OS43ODE0NzYwZS0wMSwgLTIuMDc5MTE2OWUtMDF9LAotICAgICAgICB7OS42MTI2MTcwZS0wMSwgLTIuNzU2MzczNmUtMDF9LCAgezkuMzk2OTI2MmUtMDEsIC0zLjQyMDIwMTRlLTAxfSwKLSAgICAgICAgezkuMTM1NDU0NmUtMDEsIC00LjA2NzM2NjRlLTAxfSwgIHs4LjgyOTQ3NTllLTAxLCAtNC42OTQ3MTU2ZS0wMX0sCi0gICAgICAgIHs4LjQ4MDQ4MTBlLTAxLCAtNS4yOTkxOTI2ZS0wMX0sICB7OC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LAotICAgICAgICB7Ny42NjA0NDQ0ZS0wMSwgLTYuNDI3ODc2MWUtMDF9LCAgezcuMTkzMzk4MGUtMDEsIC02Ljk0NjU4MzdlLTAxfSwKLSAgICAgICAgezYuNjkxMzA2MWUtMDEsIC03LjQzMTQ0ODNlLTAxfSwgIHs2LjE1NjYxNDhlLTAxLCAtNy44ODAxMDc1ZS0wMX0sCi0gICAgICAgIHs1LjU5MTkyOTBlLTAxLCAtOC4yOTAzNzU3ZS0wMX0sICB7NS4wMDAwMDAwZS0wMSwgLTguNjYwMjU0MGUtMDF9LAotICAgICAgICB7NC4zODM3MTE1ZS0wMSwgLTguOTg3OTQwNWUtMDF9LCAgezMuNzQ2MDY1OWUtMDEsIC05LjI3MTgzODVlLTAxfSwKLSAgICAgICAgezMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwgIHsyLjQxOTIxOTBlLTAxLCAtOS43MDI5NTczZS0wMX0sCi0gICAgICAgIHsxLjczNjQ4MThlLTAxLCAtOS44NDgwNzc1ZS0wMX0sICB7MS4wNDUyODQ2ZS0wMSwgLTkuOTQ1MjE5MGUtMDF9LAotICAgICAgICB7My40ODk5NDk3ZS0wMiwgLTkuOTkzOTA4M2UtMDF9LCAgey0zLjQ4OTk0OTdlLTAyLCAtOS45OTM5MDgzZS0wMX0sCi0gICAgICAgIHstMS4wNDUyODQ2ZS0wMSwgLTkuOTQ1MjE5MGUtMDF9LCB7LTEuNzM2NDgxOGUtMDEsIC05Ljg0ODA3NzVlLTAxfSwKLSAgICAgICAgey0yLjQxOTIxOTBlLTAxLCAtOS43MDI5NTczZS0wMX0sIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LAotICAgICAgICB7LTMuNzQ2MDY1OWUtMDEsIC05LjI3MTgzODVlLTAxfSwgey00LjM4MzcxMTVlLTAxLCAtOC45ODc5NDA1ZS0wMX0sCi0gICAgICAgIHstNS4wMDAwMDAwZS0wMSwgLTguNjYwMjU0MGUtMDF9LCB7LTUuNTkxOTI5MGUtMDEsIC04LjI5MDM3NTdlLTAxfSwKLSAgICAgICAgey02LjE1NjYxNDhlLTAxLCAtNy44ODAxMDc1ZS0wMX0sIHstNi42OTEzMDYxZS0wMSwgLTcuNDMxNDQ4M2UtMDF9LAotICAgICAgICB7LTcuMTkzMzk4MGUtMDEsIC02Ljk0NjU4MzdlLTAxfSwgey03LjY2MDQ0NDRlLTAxLCAtNi40Mjc4NzYxZS0wMX0sCi0gICAgICAgIHstOC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LCB7LTguNDgwNDgxMGUtMDEsIC01LjI5OTE5MjZlLTAxfSwKLSAgICAgICAgey04LjgyOTQ3NTllLTAxLCAtNC42OTQ3MTU2ZS0wMX0sIHstOS4xMzU0NTQ2ZS0wMSwgLTQuMDY3MzY2NGUtMDF9LAotICAgICAgICB7LTkuMzk2OTI2MmUtMDEsIC0zLjQyMDIwMTRlLTAxfSwgey05LjYxMjYxNzBlLTAxLCAtMi43NTYzNzM2ZS0wMX0sCi0gICAgICAgIHstOS43ODE0NzYwZS0wMSwgLTIuMDc5MTE2OWUtMDF9LCB7LTkuOTAyNjgwN2UtMDEsIC0xLjM5MTczMTBlLTAxfSwKLSAgICAgICAgey05Ljk3NTY0MDVlLTAxLCAtNi45NzU2NDc0ZS0wMn0sCi0gICAgfX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyB0d2lkZGxlc18xMjAgPSB7Ci0gICAgLm4yID0gMTIwIC8gMiwKLSAgICAudCA9IChjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXhbXSl7Ci0gICAgICAgIHsxLjAwMDAwMDBlKzAwLCAtMC4wMDAwMDAwZSswMH0sICB7OS45ODYyOTUzZS0wMSwgLTUuMjMzNTk1NmUtMDJ9LAotICAgICAgICB7OS45NDUyMTkwZS0wMSwgLTEuMDQ1Mjg0NmUtMDF9LCAgezkuODc2ODgzNGUtMDEsIC0xLjU2NDM0NDdlLTAxfSwKLSAgICAgICAgezkuNzgxNDc2MGUtMDEsIC0yLjA3OTExNjllLTAxfSwgIHs5LjY1OTI1ODNlLTAxLCAtMi41ODgxOTA1ZS0wMX0sCi0gICAgICAgIHs5LjUxMDU2NTJlLTAxLCAtMy4wOTAxNjk5ZS0wMX0sICB7OS4zMzU4MDQzZS0wMSwgLTMuNTgzNjc5NWUtMDF9LAotICAgICAgICB7OS4xMzU0NTQ2ZS0wMSwgLTQuMDY3MzY2NGUtMDF9LCAgezguOTEwMDY1MmUtMDEsIC00LjUzOTkwNTBlLTAxfSwKLSAgICAgICAgezguNjYwMjU0MGUtMDEsIC01LjAwMDAwMDBlLTAxfSwgIHs4LjM4NjcwNTdlLTAxLCAtNS40NDYzOTA0ZS0wMX0sCi0gICAgICAgIHs4LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sICB7Ny43NzE0NTk2ZS0wMSwgLTYuMjkzMjAzOWUtMDF9LAotICAgICAgICB7Ny40MzE0NDgzZS0wMSwgLTYuNjkxMzA2MWUtMDF9LCAgezcuMDcxMDY3OGUtMDEsIC03LjA3MTA2NzhlLTAxfSwKLSAgICAgICAgezYuNjkxMzA2MWUtMDEsIC03LjQzMTQ0ODNlLTAxfSwgIHs2LjI5MzIwMzllLTAxLCAtNy43NzE0NTk2ZS0wMX0sCi0gICAgICAgIHs1Ljg3Nzg1MjVlLTAxLCAtOC4wOTAxNjk5ZS0wMX0sICB7NS40NDYzOTA0ZS0wMSwgLTguMzg2NzA1N2UtMDF9LAotICAgICAgICB7NS4wMDAwMDAwZS0wMSwgLTguNjYwMjU0MGUtMDF9LCAgezQuNTM5OTA1MGUtMDEsIC04LjkxMDA2NTJlLTAxfSwKLSAgICAgICAgezQuMDY3MzY2NGUtMDEsIC05LjEzNTQ1NDZlLTAxfSwgIHszLjU4MzY3OTVlLTAxLCAtOS4zMzU4MDQzZS0wMX0sCi0gICAgICAgIHszLjA5MDE2OTllLTAxLCAtOS41MTA1NjUyZS0wMX0sICB7Mi41ODgxOTA1ZS0wMSwgLTkuNjU5MjU4M2UtMDF9LAotICAgICAgICB7Mi4wNzkxMTY5ZS0wMSwgLTkuNzgxNDc2MGUtMDF9LCAgezEuNTY0MzQ0N2UtMDEsIC05Ljg3Njg4MzRlLTAxfSwKLSAgICAgICAgezEuMDQ1Mjg0NmUtMDEsIC05Ljk0NTIxOTBlLTAxfSwgIHs1LjIzMzU5NTZlLTAyLCAtOS45ODYyOTUzZS0wMX0sCi0gICAgICAgIHsyLjgzMjc2OTRlLTE2LCAtMS4wMDAwMDAwZSswMH0sICB7LTUuMjMzNTk1NmUtMDIsIC05Ljk4NjI5NTNlLTAxfSwKLSAgICAgICAgey0xLjA0NTI4NDZlLTAxLCAtOS45NDUyMTkwZS0wMX0sIHstMS41NjQzNDQ3ZS0wMSwgLTkuODc2ODgzNGUtMDF9LAotICAgICAgICB7LTIuMDc5MTE2OWUtMDEsIC05Ljc4MTQ3NjBlLTAxfSwgey0yLjU4ODE5MDVlLTAxLCAtOS42NTkyNTgzZS0wMX0sCi0gICAgICAgIHstMy4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LCB7LTMuNTgzNjc5NWUtMDEsIC05LjMzNTgwNDNlLTAxfSwKLSAgICAgICAgey00LjA2NzM2NjRlLTAxLCAtOS4xMzU0NTQ2ZS0wMX0sIHstNC41Mzk5MDUwZS0wMSwgLTguOTEwMDY1MmUtMDF9LAotICAgICAgICB7LTUuMDAwMDAwMGUtMDEsIC04LjY2MDI1NDBlLTAxfSwgey01LjQ0NjM5MDRlLTAxLCAtOC4zODY3MDU3ZS0wMX0sCi0gICAgICAgIHstNS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LCB7LTYuMjkzMjAzOWUtMDEsIC03Ljc3MTQ1OTZlLTAxfSwKLSAgICAgICAgey02LjY5MTMwNjFlLTAxLCAtNy40MzE0NDgzZS0wMX0sIHstNy4wNzEwNjc4ZS0wMSwgLTcuMDcxMDY3OGUtMDF9LAotICAgICAgICB7LTcuNDMxNDQ4M2UtMDEsIC02LjY5MTMwNjFlLTAxfSwgey03Ljc3MTQ1OTZlLTAxLCAtNi4yOTMyMDM5ZS0wMX0sCi0gICAgICAgIHstOC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LCB7LTguMzg2NzA1N2UtMDEsIC01LjQ0NjM5MDRlLTAxfSwKLSAgICAgICAgey04LjY2MDI1NDBlLTAxLCAtNS4wMDAwMDAwZS0wMX0sIHstOC45MTAwNjUyZS0wMSwgLTQuNTM5OTA1MGUtMDF9LAotICAgICAgICB7LTkuMTM1NDU0NmUtMDEsIC00LjA2NzM2NjRlLTAxfSwgey05LjMzNTgwNDNlLTAxLCAtMy41ODM2Nzk1ZS0wMX0sCi0gICAgICAgIHstOS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LCB7LTkuNjU5MjU4M2UtMDEsIC0yLjU4ODE5MDVlLTAxfSwKLSAgICAgICAgey05Ljc4MTQ3NjBlLTAxLCAtMi4wNzkxMTY5ZS0wMX0sIHstOS44NzY4ODM0ZS0wMSwgLTEuNTY0MzQ0N2UtMDF9LAotICAgICAgICB7LTkuOTQ1MjE5MGUtMDEsIC0xLjA0NTI4NDZlLTAxfSwgey05Ljk4NjI5NTNlLTAxLCAtNS4yMzM1OTU2ZS0wMn0sCi0gICAgfX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyB0d2lkZGxlc18xNjAgPSB7Ci0gICAgLm4yID0gMTYwIC8gMiwKLSAgICAudCA9IChjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXhbXSl7Ci0gICAgICAgIHsxLjAwMDAwMDBlKzAwLCAtMC4wMDAwMDAwZSswMH0sICB7OS45OTIyOTA0ZS0wMSwgLTMuOTI1OTgxNmUtMDJ9LAotICAgICAgICB7OS45NjkxNzMzZS0wMSwgLTcuODQ1OTA5NmUtMDJ9LCAgezkuOTMwNjg0NmUtMDEsIC0xLjE3NTM3NDBlLTAxfSwKLSAgICAgICAgezkuODc2ODgzNGUtMDEsIC0xLjU2NDM0NDdlLTAxfSwgIHs5LjgwNzg1MjhlLTAxLCAtMS45NTA5MDMyZS0wMX0sCi0gICAgICAgIHs5LjcyMzY5OTJlLTAxLCAtMi4zMzQ0NTM2ZS0wMX0sICB7OS42MjQ1NTI0ZS0wMSwgLTIuNzE0NDA0NWUtMDF9LAotICAgICAgICB7OS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LCAgezkuMzgxOTEzNGUtMDEsIC0zLjQ2MTE3MDZlLTAxfSwKLSAgICAgICAgezkuMjM4Nzk1M2UtMDEsIC0zLjgyNjgzNDNlLTAxfSwgIHs5LjA4MTQzMTdlLTAxLCAtNC4xODY1OTc0ZS0wMX0sCi0gICAgICAgIHs4LjkxMDA2NTJlLTAxLCAtNC41Mzk5MDUwZS0wMX0sICB7OC43MjQ5NjAxZS0wMSwgLTQuODg2MjEyNGUtMDF9LAotICAgICAgICB7OC41MjY0MDE2ZS0wMSwgLTUuMjI0OTg1NmUtMDF9LCAgezguMzE0Njk2MWUtMDEsIC01LjU1NTcwMjNlLTAxfSwKLSAgICAgICAgezguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwgIHs3Ljg1MzE2OTNlLTAxLCAtNi4xOTA5Mzk1ZS0wMX0sCi0gICAgICAgIHs3LjYwNDA1OTdlLTAxLCAtNi40OTQ0ODA1ZS0wMX0sICB7Ny4zNDMyMjUxZS0wMSwgLTYuNzg4MDA3NWUtMDF9LAotICAgICAgICB7Ny4wNzEwNjc4ZS0wMSwgLTcuMDcxMDY3OGUtMDF9LCAgezYuNzg4MDA3NWUtMDEsIC03LjM0MzIyNTFlLTAxfSwKLSAgICAgICAgezYuNDk0NDgwNWUtMDEsIC03LjYwNDA1OTdlLTAxfSwgIHs2LjE5MDkzOTVlLTAxLCAtNy44NTMxNjkzZS0wMX0sCi0gICAgICAgIHs1Ljg3Nzg1MjVlLTAxLCAtOC4wOTAxNjk5ZS0wMX0sICB7NS41NTU3MDIzZS0wMSwgLTguMzE0Njk2MWUtMDF9LAotICAgICAgICB7NS4yMjQ5ODU2ZS0wMSwgLTguNTI2NDAxNmUtMDF9LCAgezQuODg2MjEyNGUtMDEsIC04LjcyNDk2MDFlLTAxfSwKLSAgICAgICAgezQuNTM5OTA1MGUtMDEsIC04LjkxMDA2NTJlLTAxfSwgIHs0LjE4NjU5NzRlLTAxLCAtOS4wODE0MzE3ZS0wMX0sCi0gICAgICAgIHszLjgyNjgzNDNlLTAxLCAtOS4yMzg3OTUzZS0wMX0sICB7My40NjExNzA2ZS0wMSwgLTkuMzgxOTEzNGUtMDF9LAotICAgICAgICB7My4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LCAgezIuNzE0NDA0NWUtMDEsIC05LjYyNDU1MjRlLTAxfSwKLSAgICAgICAgezIuMzM0NDUzNmUtMDEsIC05LjcyMzY5OTJlLTAxfSwgIHsxLjk1MDkwMzJlLTAxLCAtOS44MDc4NTI4ZS0wMX0sCi0gICAgICAgIHsxLjU2NDM0NDdlLTAxLCAtOS44NzY4ODM0ZS0wMX0sICB7MS4xNzUzNzQwZS0wMSwgLTkuOTMwNjg0NmUtMDF9LAotICAgICAgICB7Ny44NDU5MDk2ZS0wMiwgLTkuOTY5MTczM2UtMDF9LCAgezMuOTI1OTgxNmUtMDIsIC05Ljk5MjI5MDRlLTAxfSwKLSAgICAgICAgezYuMTIzMjM0MGUtMTcsIC0xLjAwMDAwMDBlKzAwfSwgIHstMy45MjU5ODE2ZS0wMiwgLTkuOTkyMjkwNGUtMDF9LAotICAgICAgICB7LTcuODQ1OTA5NmUtMDIsIC05Ljk2OTE3MzNlLTAxfSwgey0xLjE3NTM3NDBlLTAxLCAtOS45MzA2ODQ2ZS0wMX0sCi0gICAgICAgIHstMS41NjQzNDQ3ZS0wMSwgLTkuODc2ODgzNGUtMDF9LCB7LTEuOTUwOTAzMmUtMDEsIC05LjgwNzg1MjhlLTAxfSwKLSAgICAgICAgey0yLjMzNDQ1MzZlLTAxLCAtOS43MjM2OTkyZS0wMX0sIHstMi43MTQ0MDQ1ZS0wMSwgLTkuNjI0NTUyNGUtMDF9LAotICAgICAgICB7LTMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwgey0zLjQ2MTE3MDZlLTAxLCAtOS4zODE5MTM0ZS0wMX0sCi0gICAgICAgIHstMy44MjY4MzQzZS0wMSwgLTkuMjM4Nzk1M2UtMDF9LCB7LTQuMTg2NTk3NGUtMDEsIC05LjA4MTQzMTdlLTAxfSwKLSAgICAgICAgey00LjUzOTkwNTBlLTAxLCAtOC45MTAwNjUyZS0wMX0sIHstNC44ODYyMTI0ZS0wMSwgLTguNzI0OTYwMWUtMDF9LAotICAgICAgICB7LTUuMjI0OTg1NmUtMDEsIC04LjUyNjQwMTZlLTAxfSwgey01LjU1NTcwMjNlLTAxLCAtOC4zMTQ2OTYxZS0wMX0sCi0gICAgICAgIHstNS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LCB7LTYuMTkwOTM5NWUtMDEsIC03Ljg1MzE2OTNlLTAxfSwKLSAgICAgICAgey02LjQ5NDQ4MDVlLTAxLCAtNy42MDQwNTk3ZS0wMX0sIHstNi43ODgwMDc1ZS0wMSwgLTcuMzQzMjI1MWUtMDF9LAotICAgICAgICB7LTcuMDcxMDY3OGUtMDEsIC03LjA3MTA2NzhlLTAxfSwgey03LjM0MzIyNTFlLTAxLCAtNi43ODgwMDc1ZS0wMX0sCi0gICAgICAgIHstNy42MDQwNTk3ZS0wMSwgLTYuNDk0NDgwNWUtMDF9LCB7LTcuODUzMTY5M2UtMDEsIC02LjE5MDkzOTVlLTAxfSwKLSAgICAgICAgey04LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sIHstOC4zMTQ2OTYxZS0wMSwgLTUuNTU1NzAyM2UtMDF9LAotICAgICAgICB7LTguNTI2NDAxNmUtMDEsIC01LjIyNDk4NTZlLTAxfSwgey04LjcyNDk2MDFlLTAxLCAtNC44ODYyMTI0ZS0wMX0sCi0gICAgICAgIHstOC45MTAwNjUyZS0wMSwgLTQuNTM5OTA1MGUtMDF9LCB7LTkuMDgxNDMxN2UtMDEsIC00LjE4NjU5NzRlLTAxfSwKLSAgICAgICAgey05LjIzODc5NTNlLTAxLCAtMy44MjY4MzQzZS0wMX0sIHstOS4zODE5MTM0ZS0wMSwgLTMuNDYxMTcwNmUtMDF9LAotICAgICAgICB7LTkuNTEwNTY1MmUtMDEsIC0zLjA5MDE2OTllLTAxfSwgey05LjYyNDU1MjRlLTAxLCAtMi43MTQ0MDQ1ZS0wMX0sCi0gICAgICAgIHstOS43MjM2OTkyZS0wMSwgLTIuMzM0NDUzNmUtMDF9LCB7LTkuODA3ODUyOGUtMDEsIC0xLjk1MDkwMzJlLTAxfSwKLSAgICAgICAgey05Ljg3Njg4MzRlLTAxLCAtMS41NjQzNDQ3ZS0wMX0sIHstOS45MzA2ODQ2ZS0wMSwgLTEuMTc1Mzc0MGUtMDF9LAotICAgICAgICB7LTkuOTY5MTczM2UtMDEsIC03Ljg0NTkwOTZlLTAyfSwgey05Ljk5MjI5MDRlLTAxLCAtMy45MjU5ODE2ZS0wMn0sCi0gICAgfX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyB0d2lkZGxlc18xODAgPSB7Ci0gICAgLm4yID0gMTgwIC8gMiwKLSAgICAudCA9IChjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXhbXSl7Ci0gICAgICAgIHsxLjAwMDAwMDBlKzAwLCAtMC4wMDAwMDAwZSswMH0sICB7OS45OTM5MDgzZS0wMSwgLTMuNDg5OTQ5N2UtMDJ9LAotICAgICAgICB7OS45NzU2NDA1ZS0wMSwgLTYuOTc1NjQ3NGUtMDJ9LCAgezkuOTQ1MjE5MGUtMDEsIC0xLjA0NTI4NDZlLTAxfSwKLSAgICAgICAgezkuOTAyNjgwN2UtMDEsIC0xLjM5MTczMTBlLTAxfSwgIHs5Ljg0ODA3NzVlLTAxLCAtMS43MzY0ODE4ZS0wMX0sCi0gICAgICAgIHs5Ljc4MTQ3NjBlLTAxLCAtMi4wNzkxMTY5ZS0wMX0sICB7OS43MDI5NTczZS0wMSwgLTIuNDE5MjE5MGUtMDF9LAotICAgICAgICB7OS42MTI2MTcwZS0wMSwgLTIuNzU2MzczNmUtMDF9LCAgezkuNTEwNTY1MmUtMDEsIC0zLjA5MDE2OTllLTAxfSwKLSAgICAgICAgezkuMzk2OTI2MmUtMDEsIC0zLjQyMDIwMTRlLTAxfSwgIHs5LjI3MTgzODVlLTAxLCAtMy43NDYwNjU5ZS0wMX0sCi0gICAgICAgIHs5LjEzNTQ1NDZlLTAxLCAtNC4wNjczNjY0ZS0wMX0sICB7OC45ODc5NDA1ZS0wMSwgLTQuMzgzNzExNWUtMDF9LAotICAgICAgICB7OC44Mjk0NzU5ZS0wMSwgLTQuNjk0NzE1NmUtMDF9LCAgezguNjYwMjU0MGUtMDEsIC01LjAwMDAwMDBlLTAxfSwKLSAgICAgICAgezguNDgwNDgxMGUtMDEsIC01LjI5OTE5MjZlLTAxfSwgIHs4LjI5MDM3NTdlLTAxLCAtNS41OTE5MjkwZS0wMX0sCi0gICAgICAgIHs4LjA5MDE2OTllLTAxLCAtNS44Nzc4NTI1ZS0wMX0sICB7Ny44ODAxMDc1ZS0wMSwgLTYuMTU2NjE0OGUtMDF9LAotICAgICAgICB7Ny42NjA0NDQ0ZS0wMSwgLTYuNDI3ODc2MWUtMDF9LCAgezcuNDMxNDQ4M2UtMDEsIC02LjY5MTMwNjFlLTAxfSwKLSAgICAgICAgezcuMTkzMzk4MGUtMDEsIC02Ljk0NjU4MzdlLTAxfSwgIHs2Ljk0NjU4MzdlLTAxLCAtNy4xOTMzOTgwZS0wMX0sCi0gICAgICAgIHs2LjY5MTMwNjFlLTAxLCAtNy40MzE0NDgzZS0wMX0sICB7Ni40Mjc4NzYxZS0wMSwgLTcuNjYwNDQ0NGUtMDF9LAotICAgICAgICB7Ni4xNTY2MTQ4ZS0wMSwgLTcuODgwMTA3NWUtMDF9LCAgezUuODc3ODUyNWUtMDEsIC04LjA5MDE2OTllLTAxfSwKLSAgICAgICAgezUuNTkxOTI5MGUtMDEsIC04LjI5MDM3NTdlLTAxfSwgIHs1LjI5OTE5MjZlLTAxLCAtOC40ODA0ODEwZS0wMX0sCi0gICAgICAgIHs1LjAwMDAwMDBlLTAxLCAtOC42NjAyNTQwZS0wMX0sICB7NC42OTQ3MTU2ZS0wMSwgLTguODI5NDc1OWUtMDF9LAotICAgICAgICB7NC4zODM3MTE1ZS0wMSwgLTguOTg3OTQwNWUtMDF9LCAgezQuMDY3MzY2NGUtMDEsIC05LjEzNTQ1NDZlLTAxfSwKLSAgICAgICAgezMuNzQ2MDY1OWUtMDEsIC05LjI3MTgzODVlLTAxfSwgIHszLjQyMDIwMTRlLTAxLCAtOS4zOTY5MjYyZS0wMX0sCi0gICAgICAgIHszLjA5MDE2OTllLTAxLCAtOS41MTA1NjUyZS0wMX0sICB7Mi43NTYzNzM2ZS0wMSwgLTkuNjEyNjE3MGUtMDF9LAotICAgICAgICB7Mi40MTkyMTkwZS0wMSwgLTkuNzAyOTU3M2UtMDF9LCAgezIuMDc5MTE2OWUtMDEsIC05Ljc4MTQ3NjBlLTAxfSwKLSAgICAgICAgezEuNzM2NDgxOGUtMDEsIC05Ljg0ODA3NzVlLTAxfSwgIHsxLjM5MTczMTBlLTAxLCAtOS45MDI2ODA3ZS0wMX0sCi0gICAgICAgIHsxLjA0NTI4NDZlLTAxLCAtOS45NDUyMTkwZS0wMX0sICB7Ni45NzU2NDc0ZS0wMiwgLTkuOTc1NjQwNWUtMDF9LAotICAgICAgICB7My40ODk5NDk3ZS0wMiwgLTkuOTkzOTA4M2UtMDF9LCAgezYuMTIzMjM0MGUtMTcsIC0xLjAwMDAwMDBlKzAwfSwKLSAgICAgICAgey0zLjQ4OTk0OTdlLTAyLCAtOS45OTM5MDgzZS0wMX0sIHstNi45NzU2NDc0ZS0wMiwgLTkuOTc1NjQwNWUtMDF9LAotICAgICAgICB7LTEuMDQ1Mjg0NmUtMDEsIC05Ljk0NTIxOTBlLTAxfSwgey0xLjM5MTczMTBlLTAxLCAtOS45MDI2ODA3ZS0wMX0sCi0gICAgICAgIHstMS43MzY0ODE4ZS0wMSwgLTkuODQ4MDc3NWUtMDF9LCB7LTIuMDc5MTE2OWUtMDEsIC05Ljc4MTQ3NjBlLTAxfSwKLSAgICAgICAgey0yLjQxOTIxOTBlLTAxLCAtOS43MDI5NTczZS0wMX0sIHstMi43NTYzNzM2ZS0wMSwgLTkuNjEyNjE3MGUtMDF9LAotICAgICAgICB7LTMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwgey0zLjQyMDIwMTRlLTAxLCAtOS4zOTY5MjYyZS0wMX0sCi0gICAgICAgIHstMy43NDYwNjU5ZS0wMSwgLTkuMjcxODM4NWUtMDF9LCB7LTQuMDY3MzY2NGUtMDEsIC05LjEzNTQ1NDZlLTAxfSwKLSAgICAgICAgey00LjM4MzcxMTVlLTAxLCAtOC45ODc5NDA1ZS0wMX0sIHstNC42OTQ3MTU2ZS0wMSwgLTguODI5NDc1OWUtMDF9LAotICAgICAgICB7LTUuMDAwMDAwMGUtMDEsIC04LjY2MDI1NDBlLTAxfSwgey01LjI5OTE5MjZlLTAxLCAtOC40ODA0ODEwZS0wMX0sCi0gICAgICAgIHstNS41OTE5MjkwZS0wMSwgLTguMjkwMzc1N2UtMDF9LCB7LTUuODc3ODUyNWUtMDEsIC04LjA5MDE2OTllLTAxfSwKLSAgICAgICAgey02LjE1NjYxNDhlLTAxLCAtNy44ODAxMDc1ZS0wMX0sIHstNi40Mjc4NzYxZS0wMSwgLTcuNjYwNDQ0NGUtMDF9LAotICAgICAgICB7LTYuNjkxMzA2MWUtMDEsIC03LjQzMTQ0ODNlLTAxfSwgey02Ljk0NjU4MzdlLTAxLCAtNy4xOTMzOTgwZS0wMX0sCi0gICAgICAgIHstNy4xOTMzOTgwZS0wMSwgLTYuOTQ2NTgzN2UtMDF9LCB7LTcuNDMxNDQ4M2UtMDEsIC02LjY5MTMwNjFlLTAxfSwKLSAgICAgICAgey03LjY2MDQ0NDRlLTAxLCAtNi40Mjc4NzYxZS0wMX0sIHstNy44ODAxMDc1ZS0wMSwgLTYuMTU2NjE0OGUtMDF9LAotICAgICAgICB7LTguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwgey04LjI5MDM3NTdlLTAxLCAtNS41OTE5MjkwZS0wMX0sCi0gICAgICAgIHstOC40ODA0ODEwZS0wMSwgLTUuMjk5MTkyNmUtMDF9LCB7LTguNjYwMjU0MGUtMDEsIC01LjAwMDAwMDBlLTAxfSwKLSAgICAgICAgey04LjgyOTQ3NTllLTAxLCAtNC42OTQ3MTU2ZS0wMX0sIHstOC45ODc5NDA1ZS0wMSwgLTQuMzgzNzExNWUtMDF9LAotICAgICAgICB7LTkuMTM1NDU0NmUtMDEsIC00LjA2NzM2NjRlLTAxfSwgey05LjI3MTgzODVlLTAxLCAtMy43NDYwNjU5ZS0wMX0sCi0gICAgICAgIHstOS4zOTY5MjYyZS0wMSwgLTMuNDIwMjAxNGUtMDF9LCB7LTkuNTEwNTY1MmUtMDEsIC0zLjA5MDE2OTllLTAxfSwKLSAgICAgICAgey05LjYxMjYxNzBlLTAxLCAtMi43NTYzNzM2ZS0wMX0sIHstOS43MDI5NTczZS0wMSwgLTIuNDE5MjE5MGUtMDF9LAotICAgICAgICB7LTkuNzgxNDc2MGUtMDEsIC0yLjA3OTExNjllLTAxfSwgey05Ljg0ODA3NzVlLTAxLCAtMS43MzY0ODE4ZS0wMX0sCi0gICAgICAgIHstOS45MDI2ODA3ZS0wMSwgLTEuMzkxNzMxMGUtMDF9LCB7LTkuOTQ1MjE5MGUtMDEsIC0xLjA0NTI4NDZlLTAxfSwKLSAgICAgICAgey05Ljk3NTY0MDVlLTAxLCAtNi45NzU2NDc0ZS0wMn0sIHstOS45OTM5MDgzZS0wMSwgLTMuNDg5OTQ5N2UtMDJ9LAotICAgIH19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjJfdHdpZGRsZXMgdHdpZGRsZXNfMjQwID0gewotICAgIC5uMiA9IDI0MCAvIDIsCi0gICAgLnQgPSAoY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4W10pewotICAgICAgICB7MS4wMDAwMDAwZSswMCwgLTAuMDAwMDAwMGUrMDB9LCAgezkuOTk2NTczMmUtMDEsIC0yLjYxNzY5NDhlLTAyfSwKLSAgICAgICAgezkuOTg2Mjk1M2UtMDEsIC01LjIzMzU5NTZlLTAyfSwgIHs5Ljk2OTE3MzNlLTAxLCAtNy44NDU5MDk2ZS0wMn0sCi0gICAgICAgIHs5Ljk0NTIxOTBlLTAxLCAtMS4wNDUyODQ2ZS0wMX0sICB7OS45MTQ0NDg2ZS0wMSwgLTEuMzA1MjYxOWUtMDF9LAotICAgICAgICB7OS44NzY4ODM0ZS0wMSwgLTEuNTY0MzQ0N2UtMDF9LCAgezkuODMyNTQ5MWUtMDEsIC0xLjgyMjM1NTNlLTAxfSwKLSAgICAgICAgezkuNzgxNDc2MGUtMDEsIC0yLjA3OTExNjllLTAxfSwgIHs5LjcyMzY5OTJlLTAxLCAtMi4zMzQ0NTM2ZS0wMX0sCi0gICAgICAgIHs5LjY1OTI1ODNlLTAxLCAtMi41ODgxOTA1ZS0wMX0sICB7OS41ODgxOTczZS0wMSwgLTIuODQwMTUzNGUtMDF9LAotICAgICAgICB7OS41MTA1NjUyZS0wMSwgLTMuMDkwMTY5OWUtMDF9LCAgezkuNDI2NDE0OWUtMDEsIC0zLjMzODA2ODZlLTAxfSwKLSAgICAgICAgezkuMzM1ODA0M2UtMDEsIC0zLjU4MzY3OTVlLTAxfSwgIHs5LjIzODc5NTNlLTAxLCAtMy44MjY4MzQzZS0wMX0sCi0gICAgICAgIHs5LjEzNTQ1NDZlLTAxLCAtNC4wNjczNjY0ZS0wMX0sICB7OS4wMjU4NTI4ZS0wMSwgLTQuMzA1MTExMGUtMDF9LAotICAgICAgICB7OC45MTAwNjUyZS0wMSwgLTQuNTM5OTA1MGUtMDF9LCAgezguNzg4MTcxMWUtMDEsIC00Ljc3MTU4NzZlLTAxfSwKLSAgICAgICAgezguNjYwMjU0MGUtMDEsIC01LjAwMDAwMDBlLTAxfSwgIHs4LjUyNjQwMTZlLTAxLCAtNS4yMjQ5ODU2ZS0wMX0sCi0gICAgICAgIHs4LjM4NjcwNTdlLTAxLCAtNS40NDYzOTA0ZS0wMX0sICB7OC4yNDEyNjE5ZS0wMSwgLTUuNjY0MDYyNGUtMDF9LAotICAgICAgICB7OC4wOTAxNjk5ZS0wMSwgLTUuODc3ODUyNWUtMDF9LCAgezcuOTMzNTMzNGUtMDEsIC02LjA4NzYxNDNlLTAxfSwKLSAgICAgICAgezcuNzcxNDU5NmUtMDEsIC02LjI5MzIwMzllLTAxfSwgIHs3LjYwNDA1OTdlLTAxLCAtNi40OTQ0ODA1ZS0wMX0sCi0gICAgICAgIHs3LjQzMTQ0ODNlLTAxLCAtNi42OTEzMDYxZS0wMX0sICB7Ny4yNTM3NDM3ZS0wMSwgLTYuODgzNTQ1OGUtMDF9LAotICAgICAgICB7Ny4wNzEwNjc4ZS0wMSwgLTcuMDcxMDY3OGUtMDF9LCAgezYuODgzNTQ1OGUtMDEsIC03LjI1Mzc0MzdlLTAxfSwKLSAgICAgICAgezYuNjkxMzA2MWUtMDEsIC03LjQzMTQ0ODNlLTAxfSwgIHs2LjQ5NDQ4MDVlLTAxLCAtNy42MDQwNTk3ZS0wMX0sCi0gICAgICAgIHs2LjI5MzIwMzllLTAxLCAtNy43NzE0NTk2ZS0wMX0sICB7Ni4wODc2MTQzZS0wMSwgLTcuOTMzNTMzNGUtMDF9LAotICAgICAgICB7NS44Nzc4NTI1ZS0wMSwgLTguMDkwMTY5OWUtMDF9LCAgezUuNjY0MDYyNGUtMDEsIC04LjI0MTI2MTllLTAxfSwKLSAgICAgICAgezUuNDQ2MzkwNGUtMDEsIC04LjM4NjcwNTdlLTAxfSwgIHs1LjIyNDk4NTZlLTAxLCAtOC41MjY0MDE2ZS0wMX0sCi0gICAgICAgIHs1LjAwMDAwMDBlLTAxLCAtOC42NjAyNTQwZS0wMX0sICB7NC43NzE1ODc2ZS0wMSwgLTguNzg4MTcxMWUtMDF9LAotICAgICAgICB7NC41Mzk5MDUwZS0wMSwgLTguOTEwMDY1MmUtMDF9LCAgezQuMzA1MTExMGUtMDEsIC05LjAyNTg1MjhlLTAxfSwKLSAgICAgICAgezQuMDY3MzY2NGUtMDEsIC05LjEzNTQ1NDZlLTAxfSwgIHszLjgyNjgzNDNlLTAxLCAtOS4yMzg3OTUzZS0wMX0sCi0gICAgICAgIHszLjU4MzY3OTVlLTAxLCAtOS4zMzU4MDQzZS0wMX0sICB7My4zMzgwNjg2ZS0wMSwgLTkuNDI2NDE0OWUtMDF9LAotICAgICAgICB7My4wOTAxNjk5ZS0wMSwgLTkuNTEwNTY1MmUtMDF9LCAgezIuODQwMTUzNGUtMDEsIC05LjU4ODE5NzNlLTAxfSwKLSAgICAgICAgezIuNTg4MTkwNWUtMDEsIC05LjY1OTI1ODNlLTAxfSwgIHsyLjMzNDQ1MzZlLTAxLCAtOS43MjM2OTkyZS0wMX0sCi0gICAgICAgIHsyLjA3OTExNjllLTAxLCAtOS43ODE0NzYwZS0wMX0sICB7MS44MjIzNTUzZS0wMSwgLTkuODMyNTQ5MWUtMDF9LAotICAgICAgICB7MS41NjQzNDQ3ZS0wMSwgLTkuODc2ODgzNGUtMDF9LCAgezEuMzA1MjYxOWUtMDEsIC05LjkxNDQ0ODZlLTAxfSwKLSAgICAgICAgezEuMDQ1Mjg0NmUtMDEsIC05Ljk0NTIxOTBlLTAxfSwgIHs3Ljg0NTkwOTZlLTAyLCAtOS45NjkxNzMzZS0wMX0sCi0gICAgICAgIHs1LjIzMzU5NTZlLTAyLCAtOS45ODYyOTUzZS0wMX0sICB7Mi42MTc2OTQ4ZS0wMiwgLTkuOTk2NTczMmUtMDF9LAotICAgICAgICB7Mi44MzI3Njk0ZS0xNiwgLTEuMDAwMDAwMGUrMDB9LCAgey0yLjYxNzY5NDhlLTAyLCAtOS45OTY1NzMyZS0wMX0sCi0gICAgICAgIHstNS4yMzM1OTU2ZS0wMiwgLTkuOTg2Mjk1M2UtMDF9LCB7LTcuODQ1OTA5NmUtMDIsIC05Ljk2OTE3MzNlLTAxfSwKLSAgICAgICAgey0xLjA0NTI4NDZlLTAxLCAtOS45NDUyMTkwZS0wMX0sIHstMS4zMDUyNjE5ZS0wMSwgLTkuOTE0NDQ4NmUtMDF9LAotICAgICAgICB7LTEuNTY0MzQ0N2UtMDEsIC05Ljg3Njg4MzRlLTAxfSwgey0xLjgyMjM1NTNlLTAxLCAtOS44MzI1NDkxZS0wMX0sCi0gICAgICAgIHstMi4wNzkxMTY5ZS0wMSwgLTkuNzgxNDc2MGUtMDF9LCB7LTIuMzM0NDUzNmUtMDEsIC05LjcyMzY5OTJlLTAxfSwKLSAgICAgICAgey0yLjU4ODE5MDVlLTAxLCAtOS42NTkyNTgzZS0wMX0sIHstMi44NDAxNTM0ZS0wMSwgLTkuNTg4MTk3M2UtMDF9LAotICAgICAgICB7LTMuMDkwMTY5OWUtMDEsIC05LjUxMDU2NTJlLTAxfSwgey0zLjMzODA2ODZlLTAxLCAtOS40MjY0MTQ5ZS0wMX0sCi0gICAgICAgIHstMy41ODM2Nzk1ZS0wMSwgLTkuMzM1ODA0M2UtMDF9LCB7LTMuODI2ODM0M2UtMDEsIC05LjIzODc5NTNlLTAxfSwKLSAgICAgICAgey00LjA2NzM2NjRlLTAxLCAtOS4xMzU0NTQ2ZS0wMX0sIHstNC4zMDUxMTEwZS0wMSwgLTkuMDI1ODUyOGUtMDF9LAotICAgICAgICB7LTQuNTM5OTA1MGUtMDEsIC04LjkxMDA2NTJlLTAxfSwgey00Ljc3MTU4NzZlLTAxLCAtOC43ODgxNzExZS0wMX0sCi0gICAgICAgIHstNS4wMDAwMDAwZS0wMSwgLTguNjYwMjU0MGUtMDF9LCB7LTUuMjI0OTg1NmUtMDEsIC04LjUyNjQwMTZlLTAxfSwKLSAgICAgICAgey01LjQ0NjM5MDRlLTAxLCAtOC4zODY3MDU3ZS0wMX0sIHstNS42NjQwNjI0ZS0wMSwgLTguMjQxMjYxOWUtMDF9LAotICAgICAgICB7LTUuODc3ODUyNWUtMDEsIC04LjA5MDE2OTllLTAxfSwgey02LjA4NzYxNDNlLTAxLCAtNy45MzM1MzM0ZS0wMX0sCi0gICAgICAgIHstNi4yOTMyMDM5ZS0wMSwgLTcuNzcxNDU5NmUtMDF9LCB7LTYuNDk0NDgwNWUtMDEsIC03LjYwNDA1OTdlLTAxfSwKLSAgICAgICAgey02LjY5MTMwNjFlLTAxLCAtNy40MzE0NDgzZS0wMX0sIHstNi44ODM1NDU4ZS0wMSwgLTcuMjUzNzQzN2UtMDF9LAotICAgICAgICB7LTcuMDcxMDY3OGUtMDEsIC03LjA3MTA2NzhlLTAxfSwgey03LjI1Mzc0MzdlLTAxLCAtNi44ODM1NDU4ZS0wMX0sCi0gICAgICAgIHstNy40MzE0NDgzZS0wMSwgLTYuNjkxMzA2MWUtMDF9LCB7LTcuNjA0MDU5N2UtMDEsIC02LjQ5NDQ4MDVlLTAxfSwKLSAgICAgICAgey03Ljc3MTQ1OTZlLTAxLCAtNi4yOTMyMDM5ZS0wMX0sIHstNy45MzM1MzM0ZS0wMSwgLTYuMDg3NjE0M2UtMDF9LAotICAgICAgICB7LTguMDkwMTY5OWUtMDEsIC01Ljg3Nzg1MjVlLTAxfSwgey04LjI0MTI2MTllLTAxLCAtNS42NjQwNjI0ZS0wMX0sCi0gICAgICAgIHstOC4zODY3MDU3ZS0wMSwgLTUuNDQ2MzkwNGUtMDF9LCB7LTguNTI2NDAxNmUtMDEsIC01LjIyNDk4NTZlLTAxfSwKLSAgICAgICAgey04LjY2MDI1NDBlLTAxLCAtNS4wMDAwMDAwZS0wMX0sIHstOC43ODgxNzExZS0wMSwgLTQuNzcxNTg3NmUtMDF9LAotICAgICAgICB7LTguOTEwMDY1MmUtMDEsIC00LjUzOTkwNTBlLTAxfSwgey05LjAyNTg1MjhlLTAxLCAtNC4zMDUxMTEwZS0wMX0sCi0gICAgICAgIHstOS4xMzU0NTQ2ZS0wMSwgLTQuMDY3MzY2NGUtMDF9LCB7LTkuMjM4Nzk1M2UtMDEsIC0zLjgyNjgzNDNlLTAxfSwKLSAgICAgICAgey05LjMzNTgwNDNlLTAxLCAtMy41ODM2Nzk1ZS0wMX0sIHstOS40MjY0MTQ5ZS0wMSwgLTMuMzM4MDY4NmUtMDF9LAotICAgICAgICB7LTkuNTEwNTY1MmUtMDEsIC0zLjA5MDE2OTllLTAxfSwgey05LjU4ODE5NzNlLTAxLCAtMi44NDAxNTM0ZS0wMX0sCi0gICAgICAgIHstOS42NTkyNTgzZS0wMSwgLTIuNTg4MTkwNWUtMDF9LCB7LTkuNzIzNjk5MmUtMDEsIC0yLjMzNDQ1MzZlLTAxfSwKLSAgICAgICAgey05Ljc4MTQ3NjBlLTAxLCAtMi4wNzkxMTY5ZS0wMX0sIHstOS44MzI1NDkxZS0wMSwgLTEuODIyMzU1M2UtMDF9LAotICAgICAgICB7LTkuODc2ODgzNGUtMDEsIC0xLjU2NDM0NDdlLTAxfSwgey05LjkxNDQ0ODZlLTAxLCAtMS4zMDUyNjE5ZS0wMX0sCi0gICAgICAgIHstOS45NDUyMTkwZS0wMSwgLTEuMDQ1Mjg0NmUtMDF9LCB7LTkuOTY5MTczM2UtMDEsIC03Ljg0NTkwOTZlLTAyfSwKLSAgICAgICAgey05Ljk4NjI5NTNlLTAxLCAtNS4yMzM1OTU2ZS0wMn0sIHstOS45OTY1NzMyZS0wMSwgLTIuNjE3Njk0OGUtMDJ9LAotICAgIH19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjNfdHdpZGRsZXMgdHdpZGRsZXNfMTUgPSB7Ci0gICAgLm4zID0gMTUgLyAzLAotICAgIC50ID0gKGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleFtdWzJdKXsKLSAgICAgICAge3sxLjAwMDAwMDBlKzAsIC0wLjAwMDAwMDBlKzB9LCB7MS4wMDAwMDAwZSswLCAtMC4wMDAwMDAwZSswfX0sCi0gICAgICAgIHt7OS4xMzU0NTQ2ZS0xLCAtNC4wNjczNjY0ZS0xfSwgezYuNjkxMzA2MWUtMSwgLTcuNDMxNDQ4M2UtMX19LAotICAgICAgICB7ezYuNjkxMzA2MWUtMSwgLTcuNDMxNDQ4M2UtMX0sIHstMS4wNDUyODQ2ZS0xLCAtOS45NDUyMTkwZS0xfX0sCi0gICAgICAgIHt7My4wOTAxNjk5ZS0xLCAtOS41MTA1NjUyZS0xfSwgey04LjA5MDE2OTllLTEsIC01Ljg3Nzg1MjVlLTF9fSwKLSAgICAgICAge3stMS4wNDUyODQ2ZS0xLCAtOS45NDUyMTkwZS0xfSwgey05Ljc4MTQ3NjBlLTEsIDIuMDc5MTE2OWUtMX19LAotICAgICAgICB7ey01LjAwMDAwMDBlLTEsIC04LjY2MDI1NDBlLTF9LCB7LTUuMDAwMDAwMGUtMSwgOC42NjAyNTQwZS0xfX0sCi0gICAgICAgIHt7LTguMDkwMTY5OWUtMSwgLTUuODc3ODUyNWUtMX0sIHszLjA5MDE2OTllLTEsIDkuNTEwNTY1MmUtMX19LAotICAgICAgICB7ey05Ljc4MTQ3NjBlLTEsIC0yLjA3OTExNjllLTF9LCB7OS4xMzU0NTQ2ZS0xLCA0LjA2NzM2NjRlLTF9fSwKLSAgICAgICAge3stOS43ODE0NzYwZS0xLCAyLjA3OTExNjllLTF9LCB7OS4xMzU0NTQ2ZS0xLCAtNC4wNjczNjY0ZS0xfX0sCi0gICAgICAgIHt7LTguMDkwMTY5OWUtMSwgNS44Nzc4NTI1ZS0xfSwgezMuMDkwMTY5OWUtMSwgLTkuNTEwNTY1MmUtMX19LAotICAgICAgICB7ey01LjAwMDAwMDBlLTEsIDguNjYwMjU0MGUtMX0sIHstNS4wMDAwMDAwZS0xLCAtOC42NjAyNTQwZS0xfX0sCi0gICAgICAgIHt7LTEuMDQ1Mjg0NmUtMSwgOS45NDUyMTkwZS0xfSwgey05Ljc4MTQ3NjBlLTEsIC0yLjA3OTExNjllLTF9fSwKLSAgICAgICAge3szLjA5MDE2OTllLTEsIDkuNTEwNTY1MmUtMX0sIHstOC4wOTAxNjk5ZS0xLCA1Ljg3Nzg1MjVlLTF9fSwKLSAgICAgICAge3s2LjY5MTMwNjFlLTEsIDcuNDMxNDQ4M2UtMX0sIHstMS4wNDUyODQ2ZS0xLCA5Ljk0NTIxOTBlLTF9fSwKLSAgICAgICAge3s5LjEzNTQ1NDZlLTEsIDQuMDY3MzY2NGUtMX0sIHs2LjY5MTMwNjFlLTEsIDcuNDMxNDQ4M2UtMX19LAotICAgIH19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjNfdHdpZGRsZXMgdHdpZGRsZXNfNDUgPSB7Ci0gICAgLm4zID0gNDUgLyAzLAotICAgIC50ID0gKGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleFtdWzJdKXsKLSAgICAgICAge3sxLjAwMDAwMDBlKzAsIC0wLjAwMDAwMDBlKzB9LCB7MS4wMDAwMDAwZSswLCAtMC4wMDAwMDAwZSswfX0sCi0gICAgICAgIHt7OS45MDI2ODA3ZS0xLCAtMS4zOTE3MzEwZS0xfSwgezkuNjEyNjE3MGUtMSwgLTIuNzU2MzczNmUtMX19LAotICAgICAgICB7ezkuNjEyNjE3MGUtMSwgLTIuNzU2MzczNmUtMX0sIHs4LjQ4MDQ4MTBlLTEsIC01LjI5OTE5MjZlLTF9fSwKLSAgICAgICAge3s5LjEzNTQ1NDZlLTEsIC00LjA2NzM2NjRlLTF9LCB7Ni42OTEzMDYxZS0xLCAtNy40MzE0NDgzZS0xfX0sCi0gICAgICAgIHt7OC40ODA0ODEwZS0xLCAtNS4yOTkxOTI2ZS0xfSwgezQuMzgzNzExNWUtMSwgLTguOTg3OTQwNWUtMX19LAotICAgICAgICB7ezcuNjYwNDQ0NGUtMSwgLTYuNDI3ODc2MWUtMX0sIHsxLjczNjQ4MThlLTEsIC05Ljg0ODA3NzVlLTF9fSwKLSAgICAgICAge3s2LjY5MTMwNjFlLTEsIC03LjQzMTQ0ODNlLTF9LCB7LTEuMDQ1Mjg0NmUtMSwgLTkuOTQ1MjE5MGUtMX19LAotICAgICAgICB7ezUuNTkxOTI5MGUtMSwgLTguMjkwMzc1N2UtMX0sIHstMy43NDYwNjU5ZS0xLCAtOS4yNzE4Mzg1ZS0xfX0sCi0gICAgICAgIHt7NC4zODM3MTE1ZS0xLCAtOC45ODc5NDA1ZS0xfSwgey02LjE1NjYxNDhlLTEsIC03Ljg4MDEwNzVlLTF9fSwKLSAgICAgICAge3szLjA5MDE2OTllLTEsIC05LjUxMDU2NTJlLTF9LCB7LTguMDkwMTY5OWUtMSwgLTUuODc3ODUyNWUtMX19LAotICAgICAgICB7ezEuNzM2NDgxOGUtMSwgLTkuODQ4MDc3NWUtMX0sIHstOS4zOTY5MjYyZS0xLCAtMy40MjAyMDE0ZS0xfX0sCi0gICAgICAgIHt7My40ODk5NDk3ZS0yLCAtOS45OTM5MDgzZS0xfSwgey05Ljk3NTY0MDVlLTEsIC02Ljk3NTY0NzRlLTJ9fSwKLSAgICAgICAge3stMS4wNDUyODQ2ZS0xLCAtOS45NDUyMTkwZS0xfSwgey05Ljc4MTQ3NjBlLTEsIDIuMDc5MTE2OWUtMX19LAotICAgICAgICB7ey0yLjQxOTIxOTBlLTEsIC05LjcwMjk1NzNlLTF9LCB7LTguODI5NDc1OWUtMSwgNC42OTQ3MTU2ZS0xfX0sCi0gICAgICAgIHt7LTMuNzQ2MDY1OWUtMSwgLTkuMjcxODM4NWUtMX0sIHstNy4xOTMzOTgwZS0xLCA2Ljk0NjU4MzdlLTF9fSwKLSAgICAgICAge3stNS4wMDAwMDAwZS0xLCAtOC42NjAyNTQwZS0xfSwgey01LjAwMDAwMDBlLTEsIDguNjYwMjU0MGUtMX19LAotICAgICAgICB7ey02LjE1NjYxNDhlLTEsIC03Ljg4MDEwNzVlLTF9LCB7LTIuNDE5MjE5MGUtMSwgOS43MDI5NTczZS0xfX0sCi0gICAgICAgIHt7LTcuMTkzMzk4MGUtMSwgLTYuOTQ2NTgzN2UtMX0sIHszLjQ4OTk0OTdlLTIsIDkuOTkzOTA4M2UtMX19LAotICAgICAgICB7ey04LjA5MDE2OTllLTEsIC01Ljg3Nzg1MjVlLTF9LCB7My4wOTAxNjk5ZS0xLCA5LjUxMDU2NTJlLTF9fSwKLSAgICAgICAge3stOC44Mjk0NzU5ZS0xLCAtNC42OTQ3MTU2ZS0xfSwgezUuNTkxOTI5MGUtMSwgOC4yOTAzNzU3ZS0xfX0sCi0gICAgICAgIHt7LTkuMzk2OTI2MmUtMSwgLTMuNDIwMjAxNGUtMX0sIHs3LjY2MDQ0NDRlLTEsIDYuNDI3ODc2MWUtMX19LAotICAgICAgICB7ey05Ljc4MTQ3NjBlLTEsIC0yLjA3OTExNjllLTF9LCB7OS4xMzU0NTQ2ZS0xLCA0LjA2NzM2NjRlLTF9fSwKLSAgICAgICAge3stOS45NzU2NDA1ZS0xLCAtNi45NzU2NDc0ZS0yfSwgezkuOTAyNjgwN2UtMSwgMS4zOTE3MzEwZS0xfX0sCi0gICAgICAgIHt7LTkuOTc1NjQwNWUtMSwgNi45NzU2NDc0ZS0yfSwgezkuOTAyNjgwN2UtMSwgLTEuMzkxNzMxMGUtMX19LAotICAgICAgICB7ey05Ljc4MTQ3NjBlLTEsIDIuMDc5MTE2OWUtMX0sIHs5LjEzNTQ1NDZlLTEsIC00LjA2NzM2NjRlLTF9fSwKLSAgICAgICAge3stOS4zOTY5MjYyZS0xLCAzLjQyMDIwMTRlLTF9LCB7Ny42NjA0NDQ0ZS0xLCAtNi40Mjc4NzYxZS0xfX0sCi0gICAgICAgIHt7LTguODI5NDc1OWUtMSwgNC42OTQ3MTU2ZS0xfSwgezUuNTkxOTI5MGUtMSwgLTguMjkwMzc1N2UtMX19LAotICAgICAgICB7ey04LjA5MDE2OTllLTEsIDUuODc3ODUyNWUtMX0sIHszLjA5MDE2OTllLTEsIC05LjUxMDU2NTJlLTF9fSwKLSAgICAgICAge3stNy4xOTMzOTgwZS0xLCA2Ljk0NjU4MzdlLTF9LCB7My40ODk5NDk3ZS0yLCAtOS45OTM5MDgzZS0xfX0sCi0gICAgICAgIHt7LTYuMTU2NjE0OGUtMSwgNy44ODAxMDc1ZS0xfSwgey0yLjQxOTIxOTBlLTEsIC05LjcwMjk1NzNlLTF9fSwKLSAgICAgICAge3stNS4wMDAwMDAwZS0xLCA4LjY2MDI1NDBlLTF9LCB7LTUuMDAwMDAwMGUtMSwgLTguNjYwMjU0MGUtMX19LAotICAgICAgICB7ey0zLjc0NjA2NTllLTEsIDkuMjcxODM4NWUtMX0sIHstNy4xOTMzOTgwZS0xLCAtNi45NDY1ODM3ZS0xfX0sCi0gICAgICAgIHt7LTIuNDE5MjE5MGUtMSwgOS43MDI5NTczZS0xfSwgey04LjgyOTQ3NTllLTEsIC00LjY5NDcxNTZlLTF9fSwKLSAgICAgICAge3stMS4wNDUyODQ2ZS0xLCA5Ljk0NTIxOTBlLTF9LCB7LTkuNzgxNDc2MGUtMSwgLTIuMDc5MTE2OWUtMX19LAotICAgICAgICB7ezMuNDg5OTQ5N2UtMiwgOS45OTM5MDgzZS0xfSwgey05Ljk3NTY0MDVlLTEsIDYuOTc1NjQ3NGUtMn19LAotICAgICAgICB7ezEuNzM2NDgxOGUtMSwgOS44NDgwNzc1ZS0xfSwgey05LjM5NjkyNjJlLTEsIDMuNDIwMjAxNGUtMX19LAotICAgICAgICB7ezMuMDkwMTY5OWUtMSwgOS41MTA1NjUyZS0xfSwgey04LjA5MDE2OTllLTEsIDUuODc3ODUyNWUtMX19LAotICAgICAgICB7ezQuMzgzNzExNWUtMSwgOC45ODc5NDA1ZS0xfSwgey02LjE1NjYxNDhlLTEsIDcuODgwMTA3NWUtMX19LAotICAgICAgICB7ezUuNTkxOTI5MGUtMSwgOC4yOTAzNzU3ZS0xfSwgey0zLjc0NjA2NTllLTEsIDkuMjcxODM4NWUtMX19LAotICAgICAgICB7ezYuNjkxMzA2MWUtMSwgNy40MzE0NDgzZS0xfSwgey0xLjA0NTI4NDZlLTEsIDkuOTQ1MjE5MGUtMX19LAotICAgICAgICB7ezcuNjYwNDQ0NGUtMSwgNi40Mjc4NzYxZS0xfSwgezEuNzM2NDgxOGUtMSwgOS44NDgwNzc1ZS0xfX0sCi0gICAgICAgIHt7OC40ODA0ODEwZS0xLCA1LjI5OTE5MjZlLTF9LCB7NC4zODM3MTE1ZS0xLCA4Ljk4Nzk0MDVlLTF9fSwKLSAgICAgICAge3s5LjEzNTQ1NDZlLTEsIDQuMDY3MzY2NGUtMX0sIHs2LjY5MTMwNjFlLTEsIDcuNDMxNDQ4M2UtMX19LAotICAgICAgICB7ezkuNjEyNjE3MGUtMSwgMi43NTYzNzM2ZS0xfSwgezguNDgwNDgxMGUtMSwgNS4yOTkxOTI2ZS0xfX0sCi0gICAgICAgIHt7OS45MDI2ODA3ZS0xLCAxLjM5MTczMTBlLTF9LCB7OS42MTI2MTcwZS0xLCAyLjc1NjM3MzZlLTF9fSwKLSAgICB9fTsKLQotLyoqCi0gKiBGRlQgNSBQb2ludHMgdGVtcGxhdGUKLSAqIHMgICAgICAgICAgICAgICBTaWduIC0xOiBGb3J3YXJkIDE6IEludmVyc2UKLSAqIHgsIHkgICAgICAgICAgICBJbnB1dCBhbmQgb3V0cHV0IGNvZWZmaWNpZW50cywgb2Ygc2l6ZSA1eG4KLSAqIG4gICAgICAgICAgICAgICBOdW1iZXIgb2YgaW50ZXJsZWF2ZWQgdHJhbnNmb3JtIHRvIHBlcmZvcm0KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHhmZnRfNShjb25zdCBmbG9hdCBzLCBjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmZnRfY29tcGxleCogeSwgaW50IG4pIHsKLSAgc3RhdGljIGNvbnN0IGZsb2F0IGNvczEgPSAwLjMwOTAxNjk5NDQ7ICAvKiBjb3MoLTJQaSAxLzUpICovCi0gIHN0YXRpYyBjb25zdCBmbG9hdCBjb3MyID0gLTAuODA5MDE2OTk0NDsgLyogY29zKC0yUGkgMi81KSAqLwotCi0gIHN0YXRpYyBjb25zdCBmbG9hdCBzaW4xID0gLTAuOTUxMDU2NTE2MzsgLyogc2luKC0yUGkgMS81KSAqLwotICBzdGF0aWMgY29uc3QgZmxvYXQgc2luMiA9IC0wLjU4Nzc4NTI1MjM7IC8qIHNpbigtMlBpIDIvNSkgKi8KLQotICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKywgeCsrLCB5ICs9IDUpIHsKLSAgICBzdHJ1Y3QgZmZ0X2NvbXBsZXggczE0ID0ge3hbMSAqIG5dLnJlICsgeFs0ICogbl0ucmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4WzEgKiBuXS5pbSArIHhbNCAqIG5dLmltfTsKLSAgICBzdHJ1Y3QgZmZ0X2NvbXBsZXggZDE0ID0ge3hbMSAqIG5dLnJlIC0geFs0ICogbl0ucmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4WzEgKiBuXS5pbSAtIHhbNCAqIG5dLmltfTsKLQotICAgIHN0cnVjdCBmZnRfY29tcGxleCBzMjMgPSB7eFsyICogbl0ucmUgKyB4WzMgKiBuXS5yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbMiAqIG5dLmltICsgeFszICogbl0uaW19OwotICAgIHN0cnVjdCBmZnRfY29tcGxleCBkMjMgPSB7eFsyICogbl0ucmUgLSB4WzMgKiBuXS5yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbMiAqIG5dLmltIC0geFszICogbl0uaW19OwotCi0gICAgeVswXS5yZSA9IHhbMF0ucmUgKyBzMTQucmUgKyBzMjMucmU7Ci0gICAgeVswXS5pbSA9IHhbMF0uaW0gKyBzMTQuaW0gKyBzMjMuaW07Ci0KLSAgICB5WzFdLnJlID0geFswXS5yZSArIHMxNC5yZSAqIGNvczEgKyBzICogZDE0LmltICogc2luMSArIHMyMy5yZSAqIGNvczIgKwotICAgICAgICAgICAgICBzICogZDIzLmltICogc2luMjsKLQotICAgIHlbMV0uaW0gPSB4WzBdLmltICsgczE0LmltICogY29zMSAtIHMgKiBkMTQucmUgKiBzaW4xICsgczIzLmltICogY29zMiAtCi0gICAgICAgICAgICAgIHMgKiBkMjMucmUgKiBzaW4yOwotCi0gICAgeVsyXS5yZSA9IHhbMF0ucmUgKyBzMTQucmUgKiBjb3MyICsgcyAqIGQxNC5pbSAqIHNpbjIgKyBzMjMucmUgKiBjb3MxIC0KLSAgICAgICAgICAgICAgcyAqIGQyMy5pbSAqIHNpbjE7Ci0KLSAgICB5WzJdLmltID0geFswXS5pbSArIHMxNC5pbSAqIGNvczIgLSBzICogZDE0LnJlICogc2luMiArIHMyMy5pbSAqIGNvczEgKwotICAgICAgICAgICAgICBzICogZDIzLnJlICogc2luMTsKLQotICAgIHlbM10ucmUgPSB4WzBdLnJlICsgczE0LnJlICogY29zMiAtIHMgKiBkMTQuaW0gKiBzaW4yICsgczIzLnJlICogY29zMSArCi0gICAgICAgICAgICAgIHMgKiBkMjMuaW0gKiBzaW4xOwotCi0gICAgeVszXS5pbSA9IHhbMF0uaW0gKyBzMTQuaW0gKiBjb3MyICsgcyAqIGQxNC5yZSAqIHNpbjIgKyBzMjMuaW0gKiBjb3MxIC0KLSAgICAgICAgICAgICAgcyAqIGQyMy5yZSAqIHNpbjE7Ci0KLSAgICB5WzRdLnJlID0geFswXS5yZSArIHMxNC5yZSAqIGNvczEgLSBzICogZDE0LmltICogc2luMSArIHMyMy5yZSAqIGNvczIgLQotICAgICAgICAgICAgICBzICogZDIzLmltICogc2luMjsKLQotICAgIHlbNF0uaW0gPSB4WzBdLmltICsgczE0LmltICogY29zMSArIHMgKiBkMTQucmUgKiBzaW4xICsgczIzLmltICogY29zMiArCi0gICAgICAgICAgICAgIHMgKiBkMjMucmUgKiBzaW4yOwotICB9Ci19Ci0KLS8qKgotICogRkZUIEJ1dHRlcmZseSAzIFBvaW50cyB0ZW1wbGF0ZQotICogcyAgICAgICAgICAgICAgIFNpZ24gLTE6IEZvcndhcmQgMTogSW52ZXJzZQotICogeCwgeSAgICAgICAgICAgIElucHV0IGFuZCBvdXRwdXQgY29lZmZpY2llbnRzCi0gKiB0d2lkZGxlcyAgICAgICAgVHdpZGRsZXMgZmFjdG9ycywgZGV0ZXJtaW5lIHNpemUgb2YgdHJhbnNmb3JtCi0gKiBuICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVybGVhdmVkIHRyYW5zZm9ybXMKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHhmZnRfYmYzKGNvbnN0IGZsb2F0IHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZmdF9iZjNfdHdpZGRsZXMqIHR3aWRkbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleCogeCwgc3RydWN0IGZmdF9jb21wbGV4KiB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKSB7Ci0gIGludCBuMyA9IHR3aWRkbGVzLT5uMzsKLSAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4KCp3MClbMl0gPSB0d2lkZGxlcy0+dDsKLSAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4KCp3MSlbMl0gPSB3MCArIG4zLCAoKncyKVsyXSA9IHcxICsgbjM7Ci0KLSAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4ICp4MCA9IHgsICp4MSA9IHgwICsgbiAqIG4zLCAqeDIgPSB4MSArIG4gKiBuMzsKLSAgc3RydWN0IGZmdF9jb21wbGV4ICp5MCA9IHksICp5MSA9IHkwICsgbjMsICp5MiA9IHkxICsgbjM7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyssIHkwICs9IDMgKiBuMywgeTEgKz0gMyAqIG4zLCB5MiArPSAzICogbjMpIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG4zOyBqKyssIHgwKyssIHgxKyssIHgyKyspIHsKLSAgICAgIHkwW2pdLnJlID0geDAtPnJlICsgeDEtPnJlICogdzBbal1bMF0ucmUgKyBzICogeDEtPmltICogdzBbal1bMF0uaW0gKwotICAgICAgICAgICAgICAgICB4Mi0+cmUgKiB3MFtqXVsxXS5yZSArIHMgKiB4Mi0+aW0gKiB3MFtqXVsxXS5pbTsKLQotICAgICAgeTBbal0uaW0gPSB4MC0+aW0gKyB4MS0+aW0gKiB3MFtqXVswXS5yZSAtIHMgKiB4MS0+cmUgKiB3MFtqXVswXS5pbSArCi0gICAgICAgICAgICAgICAgIHgyLT5pbSAqIHcwW2pdWzFdLnJlIC0gcyAqIHgyLT5yZSAqIHcwW2pdWzFdLmltOwotCi0gICAgICB5MVtqXS5yZSA9IHgwLT5yZSArIHgxLT5yZSAqIHcxW2pdWzBdLnJlICsgcyAqIHgxLT5pbSAqIHcxW2pdWzBdLmltICsKLSAgICAgICAgICAgICAgICAgeDItPnJlICogdzFbal1bMV0ucmUgKyBzICogeDItPmltICogdzFbal1bMV0uaW07Ci0KLSAgICAgIHkxW2pdLmltID0geDAtPmltICsgeDEtPmltICogdzFbal1bMF0ucmUgLSBzICogeDEtPnJlICogdzFbal1bMF0uaW0gKwotICAgICAgICAgICAgICAgICB4Mi0+aW0gKiB3MVtqXVsxXS5yZSAtIHMgKiB4Mi0+cmUgKiB3MVtqXVsxXS5pbTsKLQotICAgICAgeTJbal0ucmUgPSB4MC0+cmUgKyB4MS0+cmUgKiB3MltqXVswXS5yZSArIHMgKiB4MS0+aW0gKiB3MltqXVswXS5pbSArCi0gICAgICAgICAgICAgICAgIHgyLT5yZSAqIHcyW2pdWzFdLnJlICsgcyAqIHgyLT5pbSAqIHcyW2pdWzFdLmltOwotCi0gICAgICB5MltqXS5pbSA9IHgwLT5pbSArIHgxLT5pbSAqIHcyW2pdWzBdLnJlIC0gcyAqIHgxLT5yZSAqIHcyW2pdWzBdLmltICsKLSAgICAgICAgICAgICAgICAgeDItPmltICogdzJbal1bMV0ucmUgLSBzICogeDItPnJlICogdzJbal1bMV0uaW07Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogRkZUIEJ1dHRlcmZseSAyIFBvaW50cyB0ZW1wbGF0ZQotICogcyAgICAgICAgICAgICAgIFNpZ24gLTE6IEZvcndhcmQgMTogSW52ZXJzZQotICogdHdpZGRsZXMgICAgICAgIFR3aWRkbGVzIGZhY3RvcnMsIGRldGVybWluZSBzaXplIG9mIHRyYW5zZm9ybQotICogeCwgeSAgICAgICAgICAgIElucHV0IGFuZCBvdXRwdXQgY29lZmZpY2llbnRzCi0gKiBuICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVybGVhdmVkIHRyYW5zZm9ybXMKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHhmZnRfYmYyKGNvbnN0IGZsb2F0IHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZmdF9iZjJfdHdpZGRsZXMqIHR3aWRkbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleCogeCwgc3RydWN0IGZmdF9jb21wbGV4KiB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKSB7Ci0gIGludCBuMiA9IHR3aWRkbGVzLT5uMjsKLSAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4KiB3ID0gdHdpZGRsZXMtPnQ7Ci0KLSAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4ICp4MCA9IHgsICp4MSA9IHgwICsgbiAqIG4yOwotICBzdHJ1Y3QgZmZ0X2NvbXBsZXggKnkwID0geSwgKnkxID0geTAgKyBuMjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKywgeTAgKz0gMiAqIG4yLCB5MSArPSAyICogbjIpIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG4yOyBqKyssIHgwKyssIHgxKyspIHsKLSAgICAgIHkwW2pdLnJlID0geDAtPnJlICsgeDEtPnJlICogd1tqXS5yZSArIHMgKiB4MS0+aW0gKiB3W2pdLmltOwotICAgICAgeTBbal0uaW0gPSB4MC0+aW0gKyB4MS0+aW0gKiB3W2pdLnJlIC0gcyAqIHgxLT5yZSAqIHdbal0uaW07Ci0KLSAgICAgIHkxW2pdLnJlID0geDAtPnJlIC0geDEtPnJlICogd1tqXS5yZSAtIHMgKiB4MS0+aW0gKiB3W2pdLmltOwotICAgICAgeTFbal0uaW0gPSB4MC0+aW0gLSB4MS0+aW0gKiB3W2pdLnJlICsgcyAqIHgxLT5yZSAqIHdbal0uaW07Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogRm9yd2FyZCBGRlQgNSBQb2ludHMKLSAqIHgsIHkgICAgICAgICAgICBJbnB1dCBhbmQgb3V0cHV0IGNvZWZmaWNpZW50cywgb2Ygc2l6ZSA1eG4KLSAqIG4gICAgICAgICAgICAgICBOdW1iZXIgb2YgaW50ZXJsZWF2ZWQgdHJhbnNmb3JtIHRvIHBlcmZvcm0KLSAqLwotc3RhdGljIHZvaWQgZmZmdF81KGNvbnN0IHN0cnVjdCBmZnRfY29tcGxleCogeCwgc3RydWN0IGZmdF9jb21wbGV4KiB5LCBpbnQgbikgewotICB4ZmZ0XzUoLTEsIHgsIHksIG4pOwotfQotCi0vKioKLSAqIEludmVyc2UgRkZUIDUgUG9pbnRzCi0gKiB4LCB5ICAgICAgICAgICAgSW5wdXQgYW5kIG91dHB1dCBjb2VmZmljaWVudHMsIG9mIHNpemUgNXhuCi0gKiBuICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVybGVhdmVkIHRyYW5zZm9ybSB0byBwZXJmb3JtCi0gKi8KLXN0YXRpYyB2b2lkIGlmZnRfNShjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHgsIHN0cnVjdCBmZnRfY29tcGxleCogeSwgaW50IG4pIHsKLSAgeGZmdF81KDEsIHgsIHksIG4pOwotfQotCi0vKioKLSAqIEZvcndhcmQgRkZUIEJ1dHRlcmZseSAzIFBvaW50cwotICogdHdpZGRsZXMgICAgICAgIFR3aWRkbGVzIGZhY3RvcnMsIGRldGVybWluZSBzaXplIG9mIHRyYW5zZm9ybQotICogeCwgeSAgICAgICAgICAgIElucHV0IGFuZCBvdXRwdXQgY29lZmZpY2llbnRzCi0gKiBuICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVybGVhdmVkIHRyYW5zZm9ybXMKLSAqLwotc3RhdGljIHZvaWQgZmZmdF9iZjMoY29uc3Qgc3RydWN0IGZmdF9iZjNfdHdpZGRsZXMqIHR3aWRkbGVzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4KiB4LCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbikgewotICB4ZmZ0X2JmMygtMSwgdHdpZGRsZXMsIHgsIHksIG4pOwotfQotCi0vKioKLSAqIEludmVyc2UgRkZUIEJ1dHRlcmZseSAzIFBvaW50cwotICogdHdpZGRsZXMgICAgICAgIFR3aWRkbGVzIGZhY3RvcnMsIGRldGVybWluZSBzaXplIG9mIHRyYW5zZm9ybQotICogeCwgeSAgICAgICAgICAgIElucHV0IGFuZCBvdXRwdXQgY29lZmZpY2llbnRzCi0gKiBuICAgICAgICAgICAgICAgTnVtYmVyIG9mIGludGVybGVhdmVkIHRyYW5zZm9ybXMKLSAqLwotc3RhdGljIHZvaWQgaWZmdF9iZjMoY29uc3Qgc3RydWN0IGZmdF9iZjNfdHdpZGRsZXMqIHR3aWRkbGVzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4KiB4LCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbikgewotICB4ZmZ0X2JmMygxLCB0d2lkZGxlcywgeCwgeSwgbik7Ci19Ci0KLS8qKgotICogRm9yd2FyZCBGRlQgQnV0dGVyZmx5IDIgUG9pbnRzCi0gKiB0d2lkZGxlcyAgICAgICAgVHdpZGRsZXMgZmFjdG9ycywgZGV0ZXJtaW5lIHNpemUgb2YgdHJhbnNmb3JtCi0gKiB4LCB5ICAgICAgICAgICAgSW5wdXQgYW5kIG91dHB1dCBjb2VmZmljaWVudHMKLSAqIG4gICAgICAgICAgICAgICBOdW1iZXIgb2YgaW50ZXJsZWF2ZWQgdHJhbnNmb3JtcwotICovCi1zdGF0aWMgdm9pZCBmZmZ0X2JmMihjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyogdHdpZGRsZXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHgsIHN0cnVjdCBmZnRfY29tcGxleCogeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBuKSB7Ci0gIHhmZnRfYmYyKC0xLCB0d2lkZGxlcywgeCwgeSwgbik7Ci19Ci0KLS8qKgotICogSW52ZXJzZUlGRlQgQnV0dGVyZmx5IDIgUG9pbnRzCi0gKiB0d2lkZGxlcyAgICAgICAgVHdpZGRsZXMgZmFjdG9ycywgZGV0ZXJtaW5lIHNpemUgb2YgdHJhbnNmb3JtCi0gKiB4LCB5ICAgICAgICAgICAgSW5wdXQgYW5kIG91dHB1dCBjb2VmZmljaWVudHMKLSAqIG4gICAgICAgICAgICAgICBOdW1iZXIgb2YgaW50ZXJsZWF2ZWQgdHJhbnNmb3JtcwotICovCi1zdGF0aWMgdm9pZCBpZmZ0X2JmMihjb25zdCBzdHJ1Y3QgZmZ0X2JmMl90d2lkZGxlcyogdHdpZGRsZXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHgsIHN0cnVjdCBmZnRfY29tcGxleCogeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBuKSB7Ci0gIHhmZnRfYmYyKDEsIHR3aWRkbGVzLCB4LCB5LCBuKTsKLX0KLQotLyoqCi0gKiBQZXJmb3JtIEZGVAotICogaW52ZXJzZSAgICAgICAgIFRydWUgb24gaW52ZXJzZSB0cmFuc2Zvcm0gZWxzZSBmb3J3YXJkCi0gKiB4LCB5MCwgeTEgICAgICAgSW5wdXQsIGFuZCAyIHNjcmF0Y2ggYnVmZmVycyBvZiBzaXplIGBuYAotICogbiAgICAgICAgICAgICAgIE51bWJlciBvZiBwb2ludHMgMzAsIDQwLCA2MCwgODAsIDkwLCAxMjAsIDE2MCwgMTgwLCAyNDAKLSAqIHJldHVybiAgICAgICAgICBUaGUgYnVmZmVyIGB5MGAgb3IgYHkxYCB0aGF0IGhvbGQgdGhlIHJlc3VsdAotICoKLSAqIElucHV0IGB4YCBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIGB5MGAgc2Vjb25kIHNjcmF0Y2ggYnVmZmVyCi0gKi8KLXN0cnVjdCBmZnRfY29tcGxleCogZmZ0KGJvb2wgaW52ZXJzZSwgY29uc3Qgc3RydWN0IGZmdF9jb21wbGV4KiB4LCBpbnQgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmZnRfY29tcGxleCogeTAsIHN0cnVjdCBmZnRfY29tcGxleCogeTEpIHsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBmZnRfYmYzX3R3aWRkbGVzKiB0d2lkZGxlc19iZjNbXSA9IHsmdHdpZGRsZXNfMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR3aWRkbGVzXzQ1fTsKLQotICBzdGF0aWMgY29uc3Qgc3RydWN0IGZmdF9iZjJfdHdpZGRsZXMqIHR3aWRkbGVzX2JmMltdWzNdID0gewotICAgICAgeyZ0d2lkZGxlc18xMCwgJnR3aWRkbGVzXzMwLCAmdHdpZGRsZXNfOTB9LAotICAgICAgeyZ0d2lkZGxlc18yMCwgJnR3aWRkbGVzXzYwLCAmdHdpZGRsZXNfMTgwfSwKLSAgICAgIHsmdHdpZGRsZXNfNDAsICZ0d2lkZGxlc18xMjB9LAotICAgICAgeyZ0d2lkZGxlc184MCwgJnR3aWRkbGVzXzI0MH0sCi0gICAgICB7JnR3aWRkbGVzXzE2MH19OwotCi0gIHN0cnVjdCBmZnRfY29tcGxleCogeVsyXSA9IHt5MSwgeTB9OwotICBpbnQgaTIsIGkzLCBpcyA9IDA7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBwb2ludHMgYG5gIGNhbiBiZSBkZWNvbXBvc2VkIGFzIDoKLSAgICoKLSAgICogICBuID0gNV4xICogM15uMyAqIDJebjIKLSAgICoKLSAgICogICBmb3IgbiA9IDQwLCA4MCwgMTYwICAgICAgICBuMyA9IDAsIG4yID0gWzMuLjVdCi0gICAqICAgICAgIG4gPSAzMCwgNjAsIDEyMCwgMjQwICAgbjMgPSAxLCBuMiA9IFsxLi40XQotICAgKiAgICAgICBuID0gOTAsIDE4MCAgICAgICAgICAgIG4zID0gMiwgbjIgPSBbMS4uMl0KLSAgICoKLSAgICogTm90ZSB0aGF0IHRoZSBleHByZXNzaW9uIGBuICYgKG4tMSkgPT0gMGAgaXMgZXF1aXZhbGVudAotICAgKiB0byB0aGUgY2hlY2sgdGhhdCBgbmAgaXMgYSBwb3dlciBvZiAyLiAqLwotCi0gIChpbnZlcnNlID8gaWZmdF81IDogZmZmdF81KSh4LCB5W2lzXSwgbiAvPSA1KTsKLQotICBmb3IgKGkzID0gMDsgbiAmIChuIC0gMSk7IGkzKyssIGlzIF49IDEpCi0gICAgKGludmVyc2UgPyBpZmZ0X2JmMyA6IGZmZnRfYmYzKSh0d2lkZGxlc19iZjNbaTNdLCB5W2lzXSwgeVtpcyBeIDFdLCBuIC89IDMpOwotCi0gIGZvciAoaTIgPSAwOyBuID4gMTsgaTIrKywgaXMgXj0gMSkKLSAgICAoaW52ZXJzZSA/IGlmZnRfYmYyIDogZmZmdF9iZjIpKHR3aWRkbGVzX2JmMltpMl1baTNdLCB5W2lzXSwgeVtpcyBeIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA+Pj0gMSk7Ci0KLSAgcmV0dXJuIHlbaXNdOwotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9Db21tb24vZmZ0L2ZmdC5oIGIvZW1iZHJ2L2xjMy9Db21tb24vZmZ0L2ZmdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM1ZTExLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvQ29tbW9uL2ZmdC9mZnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19MQzNfT1dOX0ZGVF9ICi0jZGVmaW5lIF9fTEMzX09XTl9GRlRfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotCi0vKioKLSAqIENvbXBsZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi0gKi8KLQotc3RydWN0IGZmdF9jb21wbGV4IHsKLSAgZmxvYXQgcmUsIGltOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqIFBlcmZvcm0gRkZUCi0gKiBpbnZlcnNlICAgICAgICAgVHJ1ZSBvbiBpbnZlcnNlIHRyYW5zZm9ybSBlbHNlIGZvcndhcmQKLSAqIHgsIHkwLCB5MSAgICAgICBJbnB1dCwgYW5kIDIgc2NyYXRjaCBidWZmZXJzIG9mIHNpemUgYG5gCi0gKiBuICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBvaW50cyAzMCwgNDAsIDYwLCA4MCwgOTAsIDEyMCwgMTYwLCAxODAsIDI0MAotICogcmV0dXJuICAgICAgICAgIFRoZSBidWZmZXIgYHkwYCBvciBgeTFgIHRoYXQgaG9sZCB0aGUgcmVzdWx0Ci0gKgotICogSW5wdXQgYHhgIGNhbiBiZSB0aGUgc2FtZSBhcyB0aGUgYHkwYCBzZWNvbmQgc2NyYXRjaCBidWZmZXIKLSAqLwotc3RydWN0IGZmdF9jb21wbGV4KiBmZnQoYm9vbCBpbnZlcnNlLCBjb25zdCBzdHJ1Y3QgZmZ0X2NvbXBsZXgqIHgsIGludCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZmdF9jb21wbGV4KiB5MCwgc3RydWN0IGZmdF9jb21wbGV4KiB5MSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0xDM19PV05fRkZUX0ggKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvQXJpdGhtZXRpY0RlYy5jcHAgYi9lbWJkcnYvbGMzL0RlY29kZXIvQXJpdGhtZXRpY0RlYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWEyMTQuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0FyaXRobWV0aWNEZWMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBBcml0aG1ldGljRGVjLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQXJpdGhtZXRpY0RlYy5ocHAiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+ICAvLyBzdGQ6Om1pbgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJCaXRSZWFkZXIuaHBwIgotI2luY2x1ZGUgIlNwZWN0cmFsRGF0YVRhYmxlcy5ocHAiCi0jaW5jbHVkZSAiVGVtcG9yYWxOb2lzZVNoYXBpbmdUYWJsZXMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotQXJpdGhtZXRpY0RlYzo6QXJpdGhtZXRpY0RlYyh1aW50MTZfdCBORl8sIHVpbnQxNl90IE5FXywgdWludDE2X3QgcmF0ZUZsYWdfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRuc19scGNfd2VpZ2h0aW5nXykKLSAgICA6IE5GKE5GXyksCi0gICAgICBORShORV8pLAotICAgICAgcmF0ZUZsYWcocmF0ZUZsYWdfKSwKLSAgICAgIHRuc19scGNfd2VpZ2h0aW5nKHRuc19scGNfd2VpZ2h0aW5nXyksCi0gICAgICBYX2hhdF9xX2FyaShudWxscHRyKSwKLSAgICAgIHNhdmVfbGV2KG51bGxwdHIpLAotICAgICAgbmZfc2VlZCgwKSwKLSAgICAgIG5iaXRzX3Jlc2lkdWFsKDApIHsKLSAgWF9oYXRfcV9hcmkgPSBuZXcgaW50MTZfdFtORV07Ci0gIHNhdmVfbGV2ID0gbmV3IHVpbnQ4X3RbTkVdOwotfQotCi1Bcml0aG1ldGljRGVjOjp+QXJpdGhtZXRpY0RlYygpIHsKLSAgZGVsZXRlW10gWF9oYXRfcV9hcmk7Ci0gIGRlbGV0ZVtdIHNhdmVfbGV2OwotfQotCi12b2lkIGFjX2RlY19pbml0KGNvbnN0IHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLCBzdHJ1Y3QgYWNfZGVjX3N0YXRlKiBzdCkgewotICBzdC0+bG93ID0gMDsKLSAgc3QtPnJhbmdlID0gMHgwMGZmZmZmZjsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgc3QtPmxvdyA8PD0gODsKLSAgICBzdC0+bG93ICs9IGJ5dGVzWygqYnApKytdOwotICB9Ci19Ci0KLXVpbnQ4X3QgYWNfZGVjb2RlKGNvbnN0IHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLCBzdHJ1Y3QgYWNfZGVjX3N0YXRlKiBzdCwKLSAgICAgICAgICAgICAgICAgIGludDE2X3QgY3VtX2ZyZXFbXSwgaW50MTZfdCBzeW1fZnJlcVtdLCB1aW50OF90IG51bXN5bSwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEJFQ19kZXRlY3QpIHsKLSAgdWludDMyX3QgdG1wID0gc3QtPnJhbmdlID4+IDEwOwotICBpZiAoc3QtPmxvdyA+PSAodG1wIDw8IDEwKSkgewotICAgIEJFQ19kZXRlY3QgPSAxOwotICAgIHJldHVybiAwOwotICB9Ci0gIHVpbnQ4X3QgdmFsID0gbnVtc3ltIC0gMTsKLSAgd2hpbGUgKHN0LT5sb3cgPCB0bXAgKiBjdW1fZnJlcVt2YWxdKSB7Ci0gICAgdmFsLS07Ci0gIH0KLSAgc3QtPmxvdyAtPSB0bXAgKiBjdW1fZnJlcVt2YWxdOwotICBzdC0+cmFuZ2UgPSB0bXAgKiBzeW1fZnJlcVt2YWxdOwotICB3aGlsZSAoc3QtPnJhbmdlIDwgMHgxMDAwMCkgewotICAgIHN0LT5sb3cgPDw9IDg7Ci0gICAgc3QtPmxvdyAmPSAweDAwZmZmZmZmOwotICAgIHN0LT5sb3cgKz0gYnl0ZXNbKCpicCkrK107Ci0gICAgc3QtPnJhbmdlIDw8PSA4OwotICB9Ci0gIHJldHVybiB2YWw7Ci19Ci0KLWRvdWJsZSBBcml0aG1ldGljRGVjOjpyY19xKHVpbnQ4X3QgaywgdWludDhfdCBmKSB7Ci0gIC8vIHdpdGggzpQgPc+ALzE3Ci0gIGNvbnN0IGRvdWJsZSBwaSA9IHN0ZDo6YWNvcygtMSk7Ci0gIGRvdWJsZSBxdWFudGl6ZXJfc3RlcHNpemUgPSBwaSAvIDE3LjA7Ci0gIHJldHVybiBzaW4ocXVhbnRpemVyX3N0ZXBzaXplICogKHJjX2lbayArIDggKiBmXSAtIDgpKTsKLX0KLQotdm9pZCBBcml0aG1ldGljRGVjOjpydW4oY29uc3QgdWludDhfdCogYnl0ZXMsIHVpbnQxNl90JiBicCwgdWludDE2X3QmIGJwX3NpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBtYXNrX3NpZGUsIGludDE2X3QmIG51bV90bnNfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgcmNfb3JkZXJbXSwgY29uc3QgdWludDhfdCYgbHNiTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QmIGxhc3RueiwgdWludDE2X3QgbmJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCRUNfZGV0ZWN0KSB7Ci0gIGludDE2X3QgYyA9IDA7Ci0KLSAgLy8gbWFrZSBsb2NhbCBjb3B5IG9mIHJjX29yZGVyIChpcyB0aGlzIHJlYWxseSB3aGF0IHdlIHdhbnQpCi0gIHJjX29yZGVyX2FyaVswXSA9IHJjX29yZGVyWzBdOwotICByY19vcmRlcl9hcmlbMV0gPSByY19vcmRlclsxXTsKLQotICAvKiBBcml0aG1ldGljIERlY29kZXIgSW5pdGlhbGl6YXRpb24gKi8KLSAgYWNfZGVjX2luaXQoYnl0ZXMsICZicCwgJnN0KTsKLQotICAvKiBUTlMgZGF0YSAqLwotICAvLyBOb3RlOiBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgbGlrZSB0aGF0IGJlbG93IGNhbiBiZSBmb3VuZCBpbiBkMDlyMDIsCi0gIC8vICAgICAgIGJ1dCB0aGVyZSBoYXMgYmVlbiBub25lIGluIGQwOXIwMS4gSG93ZXZlciwgdGhlIGNvbXBsZXRlCi0gIC8vICAgICAgIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGFkZGVkIGhlcmUsIGluIG9yZGVyIHRvIGdldCBhIHByb3BlciBtYXRjaCB0bwotICAvLyAgICAgICB0aGUgcmVmZXJlbmNlIG91dHB1dCBkYXRhCi0gIGZvciAodWludDhfdCBmID0gMDsgZiA8IDI7IGYrKykgewotICAgIGZvciAodWludDhfdCBrID0gMDsgayA8IDg7IGsrKykgewotICAgICAgcmNfaVtrICsgOCAqIGZdID0gODsKLSAgICB9Ci0gIH0KLSAgZm9yICh1aW50OF90IGYgPSAwOyBmIDwgbnVtX3Ruc19maWx0ZXJzOyBmKyspIHsKLSAgICAvLyBpZiAo8J2Rn/CdkZDwnZGc8J2Rn/CdkZHwnZGS8J2RnyjwnZGTKSA+IDApCi0gICAgaWYgKHJjX29yZGVyW2ZdID4gMCkgewotICAgICAgLy/wnZGf8J2RkPCdkZzwnZGf8J2RkfCdkZLwnZGfKPCdkZMpID0gYWNfZGVjb2RlKGJ5dGVzLCAmYnAsICZzdCwKLSAgICAgIHJjX29yZGVyX2FyaVtmXSA9Ci0gICAgICAgICAgYWNfZGVjb2RlKGJ5dGVzLCAmYnAsICZzdCwgYWNfdG5zX29yZGVyX2N1bWZyZXFbdG5zX2xwY193ZWlnaHRpbmddLAotICAgICAgICAgICAgICAgICAgICBhY190bnNfb3JkZXJfZnJlcVt0bnNfbHBjX3dlaWdodGluZ10sIDgsIEJFQ19kZXRlY3QpOwotICAgICAgaWYgKEJFQ19kZXRlY3QpIHsKLSAgICAgICAgLy8gZWFybHkgZXhpdCB0byBhdm9pZCB1bnByZWRpY3RhYmxlIHNpZGUtZWZmZWN0cwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHJjX29yZGVyX2FyaVtmXSA9IHJjX29yZGVyX2FyaVtmXSArIDE7Ci0gICAgICAvLyBzcGVjaWZpY2F0aW9uIChkMDlyMDJfRjJGKSBwcm9wb3NlcyBpbml0aWFsaXphdGlvbgotICAgICAgLy8gb2YgcmNfaSBhdCB0aGlzIHBsYWNlOyBoZXJlIGltcGxlbWVudGVkIGFib3ZlIGluIG9yZGVyCi0gICAgICAvLyB0byBiZSBwZXJmb3JtZWQgaW5kZXBlbmRldCBmcm9tIG51bV90bnNfZmlsdGVycwotICAgICAgZm9yICh1aW50OF90IGsgPSAwOyBrIDwgcmNfb3JkZXJfYXJpW2ZdOyBrKyspIHsKLSAgICAgICAgLy/wnZGf8J2RkPCdkZYo8J2RmCzwnZGTKSA9IGFjX2RlY29kZShieXRlcywgJmJwLCAmc3QsIGFjX3Ruc19jb2VmX2N1bWZyZXFba10sCi0gICAgICAgIC8vIHJjX2lba11bZl0gPSBhY19kZWNvZGUoYnl0ZXMsICZicCwgJnN0LCBhY190bnNfY29lZl9jdW1mcmVxW2tdLAotICAgICAgICByY19pW2sgKyA4ICogZl0gPSBhY19kZWNvZGUoYnl0ZXMsICZicCwgJnN0LCBhY190bnNfY29lZl9jdW1mcmVxW2tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNfdG5zX2NvZWZfZnJlcVtrXSwgMTcsIEJFQ19kZXRlY3QpOwotICAgICAgICBpZiAoQkVDX2RldGVjdCkgewotICAgICAgICAgIC8vIGVhcmx5IGV4aXQgdG8gYXZvaWQgdW5wcmVkaWN0YWJsZSBzaWRlLWVmZmVjdHMKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBTcGVjdHJhbCBkYXRhICovCi0gIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBsYXN0bno7IGsgKz0gMikgewotICAgIHVpbnQxNl90IHQgPSBjICsgcmF0ZUZsYWc7Ci0gICAgLy8gaWYgKGsgPiDwnZGB8J2QuC8yKQotICAgIGlmIChrID4gTkUgLyAyKSB7Ci0gICAgICB0ICs9IDI1NjsKLSAgICB9Ci0gICAgLy/wnZGL8J2RnsyCW2tdID0g8J2Ri/CdkZ7MgltrKzFdID0gMDsKLSAgICBYX2hhdF9xX2FyaVtrXSA9IFhfaGF0X3FfYXJpW2sgKyAxXSA9IDA7Ci0gICAgdWludDhfdCBsZXY7Ci0gICAgdWludDhfdCBzeW07Ci0gICAgZm9yIChsZXYgPSAwOyBsZXYgPCAxNDsgbGV2KyspIHsKLSAgICAgIHVpbnQ4X3QgcGtpID0KLSAgICAgICAgICBhY19zcGVjX2xvb2t1cFt0ICsgc3RkOjptaW4obGV2LCBzdGF0aWNfY2FzdDx1aW50OF90PigzVSkpICogMTAyNF07Ci0gICAgICBzeW0gPSBhY19kZWNvZGUoYnl0ZXMsICZicCwgJnN0LCBhY19zcGVjX2N1bWZyZXFbcGtpXSwgYWNfc3BlY19mcmVxW3BraV0sCi0gICAgICAgICAgICAgICAgICAgICAgMTcsIEJFQ19kZXRlY3QpOwotICAgICAgaWYgKEJFQ19kZXRlY3QpIHsKLSAgICAgICAgLy8gZWFybHkgZXhpdCB0byBhdm9pZCB1bnByZWRpY3RhYmxlIHNpZGUtZWZmZWN0cwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoc3ltIDwgMTYpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAobHNiTW9kZSA9PSAwIHx8IGxldiA+IDApIHsKLSAgICAgICAgdWludDhfdCBiaXQgPSByZWFkX2JpdChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUpOwotICAgICAgICAvL/CdkYvwnZGezIJba10gKz0gYml0IDw8IGxldjsKLSAgICAgICAgWF9oYXRfcV9hcmlba10gKz0gYml0IDw8IGxldjsKLSAgICAgICAgYml0ID0gcmVhZF9iaXQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlKTsKLSAgICAgICAgLy/wnZGL8J2RnsyCW2srMV0gKz0gYml0IDw8IGxldjsKLSAgICAgICAgWF9oYXRfcV9hcmlbayArIDFdICs9IGJpdCA8PCBsZXY7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChsZXYgPT0gMTQpIHsKLSAgICAgIEJFQ19kZXRlY3QgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobHNiTW9kZSA9PSAxKSB7Ci0gICAgICBzYXZlX2xldltrXSA9IGxldjsKLSAgICB9Ci0gICAgdWludDhfdCBhID0gc3ltICYgMHgzOwotICAgIHVpbnQ4X3QgYiA9IHN5bSA+PiAyOwotICAgIC8v8J2Ri/CdkZ7MgltrXSArPSBhIDw8IGxldjsKLSAgICAvL/CdkYvwnZGezIJbaysxXSArPSBiIDw8IGxldjsKLSAgICAvLyBpZiAo8J2Ri/CdkZ7MgltrXSA+IDApCi0gICAgWF9oYXRfcV9hcmlba10gKz0gYSA8PCBsZXY7Ci0gICAgWF9oYXRfcV9hcmlbayArIDFdICs9IGIgPDwgbGV2OwotICAgIGlmIChYX2hhdF9xX2FyaVtrXSA+IDApIHsKLSAgICAgIHVpbnQ4X3QgYml0ID0gcmVhZF9iaXQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlKTsKLSAgICAgIGlmIChiaXQgPT0gMSkgewotICAgICAgICAvL/CdkYvwnZGezIJba10gPSAt8J2Ri/CdkZ7MgltrXTsKLSAgICAgICAgWF9oYXRfcV9hcmlba10gPSAtWF9oYXRfcV9hcmlba107Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmICjwnZGL8J2RnsyCW2srMV0gPiAwKQotICAgIGlmIChYX2hhdF9xX2FyaVtrICsgMV0gPiAwKSB7Ci0gICAgICB1aW50OF90IGJpdCA9IHJlYWRfYml0KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSk7Ci0gICAgICBpZiAoYml0ID09IDEpIHsKLSAgICAgICAgLy/wnZGL8J2RnsyCW2srMV0gPSAt8J2Ri/CdkZ7MgltrKzFdOwotICAgICAgICBYX2hhdF9xX2FyaVtrICsgMV0gPSAtWF9oYXRfcV9hcmlbayArIDFdOwotICAgICAgfQotICAgIH0KLSAgICBsZXYgPSBzdGQ6Om1pbihsZXYsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDMpKTsKLSAgICBpZiAobGV2IDw9IDEpIHsKLSAgICAgIHQgPSAxICsgKGEgKyBiKSAqIChsZXYgKyAxKTsKLSAgICB9IGVsc2UgewotICAgICAgdCA9IDEyICsgbGV2OwotICAgIH0KLSAgICBjID0gKGMgJiAxNSkgKiAxNiArIHQ7Ci0gICAgLy8gTm90ZTogc3BlY2lmaWNhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxpbmUgaGFzZSBiZWVuIGNoYW5nZWQgZnJvbSBkMDlyMDEKLSAgICAvLyB0byBkMDlyMDJfRjJGCi0gICAgaWYgKGJwIC0gYnBfc2lkZSA+IDMpIHsKLSAgICAgIEJFQ19kZXRlY3QgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvLyByZXNldCByZW1haW5pbmcgZmllbGRzIGluIGFycmF5IFhfaGF0X3FfYXJpIHRvIHNpbXBsaWZ5IHRlc3RpbmcKLSAgZm9yIChpbnQxNl90IGsgPSBsYXN0bno7IGsgPCBORTsgaysrKSB7Ci0gICAgWF9oYXRfcV9hcmlba10gPSAwOwotICB9Ci0KLSAgLy8gMy40LjIuNiBSZXNpZHVhbCBkYXRhIGFuZCBmaW5hbGl6YXRpb24gKGQwOXIwMl9GMkYpCi0gIC8qIE51bWJlciBvZiByZXNpZHVhbCBiaXRzICovCi0gIGludDE2X3QgbmJpdHNfc2lkZSA9IG5iaXRzIC0gKDggKiBicF9zaWRlICsgOCAtIGxvZzIobWFza19zaWRlKSk7Ci0gIGludDE2X3QgbmJpdHNfYXJpID0gKGJwIC0gMykgKiA4OwotICBuYml0c19hcmkgKz0gMjUgLSBmbG9vcihsb2cyKHN0LnJhbmdlKSk7Ci0gIGludDE2X3QgbmJpdHNfcmVzaWR1YWxfdG1wID0gbmJpdHMgLSAobmJpdHNfc2lkZSArIG5iaXRzX2FyaSk7Ci0gIGlmIChuYml0c19yZXNpZHVhbF90bXAgPCAwKSB7Ci0gICAgQkVDX2RldGVjdCA9IDE7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG5iaXRzX3Jlc2lkdWFsID0gbmJpdHNfcmVzaWR1YWxfdG1wOwotfQotCi12b2lkIEFyaXRobWV0aWNEZWM6OnJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpIHsKLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicmF0ZUZsYWciLCAmcmF0ZUZsYWcsIHNpemVvZihyYXRlRmxhZykpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgidG5zX2xwY193ZWlnaHRpbmciLCAmdG5zX2xwY193ZWlnaHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bnNfbHBjX3dlaWdodGluZykpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicmNfb3JkZXJfYXJpIiwgJnJjX29yZGVyX2FyaVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJjX29yZGVyX2FyaSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicmNfaSIsICZyY19pWzBdLCBzaXplb2YocmNfaSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiWF9oYXRfcV9hcmkiLCAmWF9oYXRfcV9hcmlbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIE5FKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIm5iaXRzX3Jlc2lkdWFsIiwgJm5iaXRzX3Jlc2lkdWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmJpdHNfcmVzaWR1YWwpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvQXJpdGhtZXRpY0RlYy5ocHAgYi9lbWJkcnYvbGMzL0RlY29kZXIvQXJpdGhtZXRpY0RlYy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNWRkN2QuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0FyaXRobWV0aWNEZWMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIEFyaXRobWV0aWNEZWMuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19BUklUSE1FVElDX0RFQ19IUFBfCi0jZGVmaW5lIF9fQVJJVEhNRVRJQ19ERUNfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotc3RydWN0IGFjX2RlY19zdGF0ZSB7Ci0gIHVpbnQzMl90IGxvdzsKLSAgdWludDMyX3QgcmFuZ2U7Ci19OwotCi1jbGFzcyBBcml0aG1ldGljRGVjIHsKLSBwdWJsaWM6Ci0gIEFyaXRobWV0aWNEZWModWludDE2X3QgTkZfLCB1aW50MTZfdCBORV8sIHVpbnQxNl90IHJhdGVGbGFnXywKLSAgICAgICAgICAgICAgICB1aW50OF90IHRuc19scGNfd2VpZ2h0aW5nXyk7Ci0gIHZpcnR1YWwgfkFyaXRobWV0aWNEZWMoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpOwotCi0gIGRvdWJsZSByY19xKHVpbnQ4X3QgaywgdWludDhfdCBmKTsKLQotICB2b2lkIHJ1bihjb25zdCB1aW50OF90KiBieXRlcywgdWludDE2X3QmIGJwLCB1aW50MTZfdCYgYnBfc2lkZSwKLSAgICAgICAgICAgdWludDhfdCYgbWFza19zaWRlLCBpbnQxNl90JiBudW1fdG5zX2ZpbHRlcnMsIGludDE2X3QgcmNfb3JkZXJbXSwKLSAgICAgICAgICAgY29uc3QgdWludDhfdCYgbHNiTW9kZSwgY29uc3QgaW50MTZfdCYgbGFzdG56LCB1aW50MTZfdCBuYml0cywKLSAgICAgICAgICAgdWludDhfdCYgQkVDX2RldGVjdCk7Ci0KLSAgY29uc3QgdWludDE2X3QgTkY7Ci0gIGNvbnN0IHVpbnQxNl90IE5FOwotICBjb25zdCB1aW50MTZfdCByYXRlRmxhZzsKLSAgY29uc3QgdWludDhfdCB0bnNfbHBjX3dlaWdodGluZzsKLQotICAvLyBzdGF0ZXMgJiBvdXRwdXRzCi0gIGludDE2X3QqIFhfaGF0X3FfYXJpOwotICB1aW50OF90KiBzYXZlX2xldjsKLSAgaW50MTZfdCBuZl9zZWVkOwotICBpbnQxNl90IHJjX29yZGVyX2FyaVsyXTsKLSAgaW50MTZfdCByY19pWzIgKiA4XTsgIC8vIFttYXgocmNfb3JkZXJbZl0pPThdW21heChudW1fdG5zX2ZpbHRlcnMpPTJdCi0gIHVpbnQxNl90IG5iaXRzX3Jlc2lkdWFsOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGFjX2RlY19zdGF0ZSBzdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKLQotI2VuZGlmICAvLyBfX0FSSVRITUVUSUNfREVDX0hQUF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9CaXRSZWFkZXIuY3BwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL0JpdFJlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWRmYjAuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0JpdFJlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQml0UmVhZGVyLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQml0UmVhZGVyLmhwcCIKLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLXVpbnQ4X3QgcmVhZF9iaXQoY29uc3QgdWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsIHVpbnQ4X3QqIG1hc2spIHsKLSAgdWludDhfdCBiaXQ7Ci0gIGlmIChieXRlc1sqYnBdICYgKm1hc2spIHsKLSAgICBiaXQgPSAxOwotICB9IGVsc2UgewotICAgIGJpdCA9IDA7Ci0gIH0KLSAgaWYgKCptYXNrID09IDB4ODApIHsKLSAgICAqbWFzayA9IDE7Ci0gICAgKmJwIC09IDE7Ci0gIH0gZWxzZSB7Ci0gICAgKm1hc2sgPDw9IDE7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotdWludDE2X3QgcmVhZF91aW50KGNvbnN0IHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLCB1aW50OF90KiBtYXNrLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYml0cykgewotICB1aW50MTZfdCB2YWx1ZSA9IHJlYWRfYml0KGJ5dGVzLCBicCwgbWFzayk7Ci0gIGZvciAodWludDhfdCBpID0gMTsgaSA8IG51bWJpdHM7IGkrKykgewotICAgIHVpbnQxNl90IGJpdCA9IHJlYWRfYml0KGJ5dGVzLCBicCwgbWFzayk7Ci0gICAgdmFsdWUgKz0gYml0IDw8IGk7Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvQml0UmVhZGVyLmhwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9CaXRSZWFkZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmRlZjY2Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9CaXRSZWFkZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIEJpdFJlYWRlci5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0JJVF9SRUFERVJfSFBQXwotI2RlZmluZSBfX0JJVF9SRUFERVJfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLXVpbnQ4X3QgcmVhZF9iaXQoY29uc3QgdWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsIHVpbnQ4X3QqIG1hc2spOwotdWludDE2X3QgcmVhZF91aW50KGNvbnN0IHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLCB1aW50OF90KiBtYXNrLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYml0cyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKLQotI2VuZGlmICAvLyBfX0JJVF9SRUFERVJfSFBQXwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0RlY29kZXJGcmFtZS5jcHAgYi9lbWJkcnYvbGMzL0RlY29kZXIvRGVjb2RlckZyYW1lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlOGZmOC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0RlY29kZXIvRGVjb2RlckZyYW1lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKgotICogRGVjb2RlckZyYW1lLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiRGVjb2RlckZyYW1lLmhwcCIKLQotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJCaXRSZWFkZXIuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotRGVjb2RlckZyYW1lOjpEZWNvZGVyRnJhbWUoUmVzaWR1YWxTcGVjdHJ1bSYgcmVzaWR1YWxTcGVjdHJ1bV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdHJhbE5vaXNlU2hhcGluZyYgc3BlY3RyYWxOb2lzZVNoYXBpbmdfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0TG9zc0NvbmNlYWxtZW50JiBwYWNrZXRMb3NzQ29uY2VhbG1lbnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWRjdERlYyYgbWRjdERlY18sIGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5ieXRlc18pCi0gICAgOiBuYnl0ZXMobmJ5dGVzXyksCi0gICAgICBuYml0cyhuYnl0ZXNfICogOCksCi0gICAgICBsYzNDb25maWcobGMzQ29uZmlnXyksCi0gICAgICB0bnNfbHBjX3dlaWdodGluZygKLSAgICAgICAgICAobmJpdHMgPAotICAgICAgICAgICAoKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpID8gNDgwIDogMzYwKSkKLSAgICAgICAgICAgICAgPyAxCi0gICAgICAgICAgICAgIDogMCksCi0gICAgICBzaWRlSW5mb3JtYXRpb24obGMzQ29uZmlnLk5GLCBsYzNDb25maWcuTkUsIGxjM0NvbmZpZy5Gc19pbmQpLAotICAgICAgYXJpdGhtZXRpY0RlYyhsYzNDb25maWcuTkYsIGxjM0NvbmZpZy5ORSwKLSAgICAgICAgICAgICAgICAgICAgKG5iaXRzID4gKDE2MCArIGxjM0NvbmZpZy5Gc19pbmQgKiAxNjApKSA/IDUxMiA6IDAsCi0gICAgICAgICAgICAgICAgICAgIHRuc19scGNfd2VpZ2h0aW5nKSwKLSAgICAgIHJlc2lkdWFsU3BlY3RydW0ocmVzaWR1YWxTcGVjdHJ1bV8pLAotICAgICAgc3BlY3RyYWxOb2lzZVNoYXBpbmcoc3BlY3RyYWxOb2lzZVNoYXBpbmdfKSwKLSAgICAgIHBhY2tldExvc3NDb25jZWFsbWVudChwYWNrZXRMb3NzQ29uY2VhbG1lbnRfKSwKLSAgICAgIG1kY3REZWMobWRjdERlY18pLAotICAgICAgbG9uZ1Rlcm1Qb3N0ZmlsdGVyKGxjM0NvbmZpZywgbmJpdHMpLAotCi0gICAgICBkYXRhcG9pbnRzKG51bGxwdHIpLAotCi0gICAgICBmcmFtZU4oMCksCi0gICAgICBsYXN0bnooMCksCi0gICAgICBQX0JXKDApLAotICAgICAgbHNiTW9kZSgwKSwKLSAgICAgIGdnX2luZCgwKSwKLSAgICAgIG51bV90bnNfZmlsdGVycygwKSwKLSAgICAgIHBpdGNoX3ByZXNlbnQoMCksCi0gICAgICBwaXRjaF9pbmRleCgwKSwKLSAgICAgIGx0cGZfYWN0aXZlKDApLAotICAgICAgRl9ORigwKSwKLSAgICAgIGluZF9MRigwKSwKLSAgICAgIGluZF9IRigwKSwKLSAgICAgIEdpbmQoMCksCi0gICAgICBMU19pbmRBKDApLAotICAgICAgTFNfaW5kQigwKSwKLSAgICAgIGlkeEEoMCksCi0gICAgICBpZHhCKDApLAotICAgICAgbmZfc2VlZCgwKSwKLSAgICAgIHplcm9GcmFtZSgwKSwKLSAgICAgIGdnX29mZigwKSwKLSAgICAgIFhfaGF0X3FfbmYobnVsbHB0ciksCi0gICAgICBYX2hhdF9mKG51bGxwdHIpLAotICAgICAgWF9zX3RucyhudWxscHRyKSwKLSAgICAgIFhfaGF0X3NzKG51bGxwdHIpLAotICAgICAgeF9oYXRfY2xpcChudWxscHRyKSB7Ci0gIHJjX29yZGVyWzBdID0gMDsKLSAgcmNfb3JkZXJbMV0gPSAwOwotCi0gIFhfaGF0X3FfbmYgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORV07Ci0gIFhfaGF0X2YgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORV07Ci0gIFhfc190bnMgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORV07Ci0gIFhfaGF0X3NzID0gbmV3IGRvdWJsZVtsYzNDb25maWcuTkVdOwotfQotCi1EZWNvZGVyRnJhbWU6On5EZWNvZGVyRnJhbWUoKSB7Ci0gIGlmIChudWxscHRyICE9IFhfaGF0X3FfbmYpIHsKLSAgICBkZWxldGVbXSBYX2hhdF9xX25mOwotICB9Ci0gIGlmIChudWxscHRyICE9IFhfaGF0X2YpIHsKLSAgICBkZWxldGVbXSBYX2hhdF9mOwotICB9Ci0gIGlmIChudWxscHRyICE9IFhfc190bnMpIHsKLSAgICBkZWxldGVbXSBYX3NfdG5zOwotICB9Ci0gIGlmIChudWxscHRyICE9IFhfaGF0X3NzKSB7Ci0gICAgZGVsZXRlW10gWF9oYXRfc3M7Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0geF9oYXRfY2xpcCkgewotICAgIGRlbGV0ZVtdIHhfaGF0X2NsaXA7Ci0gIH0KLX0KLQotdm9pZCBEZWNvZGVyRnJhbWU6OmxpbmtQcmV2aW91c0ZyYW1lKERlY29kZXJGcmFtZSogcHJldmlvdXNGcmFtZSkgewotICBpZiAobnVsbHB0ciAhPSBwcmV2aW91c0ZyYW1lKSB7Ci0gICAgbG9uZ1Rlcm1Qb3N0ZmlsdGVyID0gcHJldmlvdXNGcmFtZS0+bG9uZ1Rlcm1Qb3N0ZmlsdGVyOwotICAgIGZyYW1lTiA9IHByZXZpb3VzRnJhbWUtPmZyYW1lTjsKLSAgfQotfQotCi12b2lkIERlY29kZXJGcmFtZTo6bm9pc2VGaWxsaW5nKCkgewotICAvLyAzLjQuNCBOb2lzZSBmaWxsaW5nIChkMDlyMDJfRjJGKQotICAvLyBpbmNsdWRpbmcgZXh0ZW5zaW9ucyBhY2NvcmRpbmcgdG86Ci0gIC8vIHNlY3Rpb24gMy40LjQuIE5vaXNlIGZpbGxpbmcgKGQwOXIwNCkKLSAgLy8gTm9pc2UgZmlsbGluZyBpcyBwZXJmb3JtZWQgb25seSB3aGVuIHplcm9GcmFtZSBpcyAwLgotICBmb3IgKGludDE2X3QgayA9IDA7IGsgPCBsYzNDb25maWcuTkU7IGsrKykgewotICAgIFhfaGF0X3FfbmZba10gPSByZXNpZHVhbFNwZWN0cnVtLlhfaGF0X3FfcmVzaWR1YWxba107Ci0gIH0KLSAgaWYgKDAgPT0gemVyb0ZyYW1lKSB7Ci0gICAgLy8gYmFuZHdpZHRoKPCdkYPwnZGP8J2RpCkKLSAgICAvLyAgICAgICBOQiAgIFdCICBTU1dCICAgU1dCICAgRkIKLSAgICAvL/CdkY/wnZGkX/CdkaDwnZGh8J2RnPCdkZ0gODAgIDE2MCAgMjQwICAgIDMyMCAgNDAwCi0gICAgdWludDE2X3QgYndfc3RvcF90YWJsZVs1XSA9IHs4MCwgMTYwLCAyNDAsIDMyMCwgNDAwfTsKLSAgICB1aW50MTZfdCBid19zdG9wID0gYndfc3RvcF90YWJsZVtQX0JXXTsKLSAgICBpZiAobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkN3A1bXMpIHsKLSAgICAgIGJ3X3N0b3AgKj0gMzsKLSAgICAgIGJ3X3N0b3AgLz0gNDsKLSAgICB9Ci0KLSAgICB1aW50MTZfdCBORnN0YXJ0ID0KLSAgICAgICAgKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpID8gMjQgOiAxODsKLSAgICB1aW50MTZfdCBORndpZHRoID0KLSAgICAgICAgKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpID8gMyA6IDI7Ci0KLSAgICAvKgotICAgIPCdkL/wnZGB8J2QuSDMgiA9ICg4LfCdkLnwnZGB8J2QuSkvMTY7Ci0gICAgZm9yIGs9MC4uYndfc3RvcC0xCi0gICAgICAgIGlmIPCdkLzwnZGB8J2QuShrKT09MQotICAgICAgICAgICAgbmZfc2VlZCA9ICgxMzg0OStuZl9zZWVkKjMxODIxKSAmIDB4RkZGRjsKLSAgICAgICAgaWYgbmZfc2VlZDwweDgwMDAKLSAgICAgICAgICAgIPCdkYvwnZGeIMyCKPCdkZgpID0g8J2Qv/CdkYHwnZC5IMyCIDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg8J2Ri/CdkZ4gzIIo8J2RmCkgPSDiiJLwnZC/8J2RgfCdkLkgzIIgOwotICAgICovCi0gICAgdWludDE2X3QgbmZfc3RhdGUgPSBuZl9zZWVkOwotICAgIGRvdWJsZSBMX05GX2hhdCA9ICg4IC0gRl9ORikgLyAxNi4wOwotICAgIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBid19zdG9wOyBrKyspIHsKLSAgICAgIC8qCi0gICAgICBUaGUgaW5kaWNlcyBmb3IgdGhlIHJlbGV2YW50IHNwZWN0cmFsIGNvZWZmaWNpZW50cyBhcmUgZ2l2ZW4gYnk6Ci0gICAgICDwnZC88J2RgfCdkLkgKPCdkZgpID0gewotICAgICAgICAgIDEgaWYgMjQg4omkIPCdkZggPCDwnZGP8J2RpF/wnZGg8J2RofCdkZzwnZGdIPCdkY7wnZGb8J2RkSDwnZGL8J2RniDMgijwnZGWKSA9PSAwIPCdkZPwnZGc8J2RnyDwnZGO8J2RmfCdkZkg8J2RliA9IPCdkZgg4oiSIDMuIC4gbWluKPCdkY/wnZGk8J2RoPCdkaHwnZGc8J2RnQotICAgICAg4oiSIDEsIPCdkZggKyAzKSAwIG90aGVyd2lzZSAjICgxMDkpIHdoZXJlIPCdkY/wnZGkX/CdkaDwnZGh8J2RnPCdkZ0gZGVwZW5kcyBvbiB0aGUgYmFuZHdpZHRoCi0gICAgICBpbmZvcm1hdGlvbiAoc2VlIFNlY3Rpb24gMy40LjIuNCkgYXMgZGVmaW5lZCBpbiBUYWJsZSAzLjE3LgotICAgICAgKi8KLSAgICAgIHVpbnQ4X3QgSV9ORl9rID0gMDsKLSAgICAgIGlmICgoTkZzdGFydCA8PSBrKSAmJiAoayA8IGJ3X3N0b3ApKSB7Ci0gICAgICAgIHVpbnQxNl90IGxpbWl0ID0KLSAgICAgICAgICAgICgoYndfc3RvcCAtIDEpIDwgKGsgKyBORndpZHRoKSkgPyAoYndfc3RvcCAtIDEpIDogKGsgKyBORndpZHRoKTsKLSAgICAgICAgSV9ORl9rID0gMTsKLSAgICAgICAgZm9yICh1aW50MTZfdCBpID0gayAtIE5Gd2lkdGg7IGkgPD0gbGltaXQ7IGkrKykgewotICAgICAgICAgIGlmICgwICE9IHJlc2lkdWFsU3BlY3RydW0uWF9oYXRfcV9yZXNpZHVhbFtpXSkgewotICAgICAgICAgICAgSV9ORl9rID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoMSA9PSBJX05GX2spIHsKLSAgICAgICAgbmZfc3RhdGUgPSAoMTM4NDkgKyBuZl9zdGF0ZSAqIDMxODIxKSAmIDB4RkZGRjsKLSAgICAgICAgaWYgKG5mX3N0YXRlIDwgMHg4MDAwKSB7Ci0gICAgICAgICAgWF9oYXRfcV9uZltrXSA9IExfTkZfaGF0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFhfaGF0X3FfbmZba10gPSAtTF9ORl9oYXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBEZWNvZGVyRnJhbWU6OmFwcGx5R2xvYmFsR2FpbigpIHsKLSAgLy8gMy40LjUgR2xvYmFsIGdhaW4gKGQwOXIwMl9GMkYpCi0gIC8vIFRoZSBnbG9iYWwgZ2FpbiBpcyBhcHBsaWVkIHRvIHRoZSBzcGVjdHJ1bSBhZnRlciBub2lzZSBmaWxsaW5nIGhhcyBiZWVuCi0gIC8vIGFwcGxpZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhICgxMTApICYgKDExMSkKLSAgaW50MTZfdCB2MSA9IG5iaXRzIC8gKDEwICogKGxjM0NvbmZpZy5Gc19pbmQgKyAxKSk7Ci0gIGlmICh2MSA+IDExNSkgewotICAgIGdnX29mZiA9IC0xMTU7Ci0gIH0gZWxzZSB7Ci0gICAgZ2dfb2ZmID0gLXYxOwotICB9Ci0gIGdnX29mZiAtPSAxMDU7Ci0gIGdnX29mZiAtPSA1ICogKGxjM0NvbmZpZy5Gc19pbmQgKyAxKTsKLQotICBkb3VibGUgZXhwb25lbnQgPSAoZ2dfaW5kICsgZ2dfb2ZmKSAvIDI4LjA7Ci0gIGRvdWJsZSBnZyA9IHBvdygxMC4wLCBleHBvbmVudCk7Ci0gIGZvciAoaW50MTZfdCBrID0gMDsgayA8IGxjM0NvbmZpZy5ORTsgaysrKSB7Ci0gICAgWF9oYXRfZltrXSA9IGdnICogWF9oYXRfcV9uZltrXTsKLSAgfQotfQotCi12b2lkIERlY29kZXJGcmFtZTo6dGVtcG9yYWxOb2lzZVNoYXBpbmcoKSB7Ci0gIC8vIDMuNC42IFROUyBEZWNvZGVyRnJhbWUgKGQwOXIwMl9GMkYpCi0gIC8qCi0gIGZvciDwnZGYID0gMCB0byDwnZGB8J2QuCDiiJIgMSBkbyB7Ci0gICAgICDwnZGL8J2RoCDMgijwnZGbKSA9IPCdkYvwnZGTIMyCKPCdkZspCi0gIH0KLSAgczAgPSBzMSA9IHMyID0gczMgPSBzNCA9IHM1ID0gczYgPSBzNyA9IDAKLSAgZm9yIPCdkZMgPSAwIHRvIG51bV90bnNfZmlsdGVycy0xIGRvIHsKLSAgICAgIGlmICjwnZGf8J2RkPCdkZzwnZGf8J2RkfCdkZLwnZGfICjwnZGTKSA+IDApCi0gICAgICB7Ci0gICAgICAgICAgZm9yIPCdkZsgPSBzdGFydF9mcmVxKPCdkZMpIHRvIHN0b3BfZnJlcShmKSDiiJIgMSBkbyB7Ci0gICAgICAgICAgICAgIHQgPSDwnZGL8J2RkyDMgiAo8J2Rmykg4oiSIPCdkZ/wnZGQ8J2RniAo8J2Rn/CdkZDwnZGc8J2Rn/CdkZHwnZGS8J2RnyAo8J2Rkykg4oiSIDEgLCDwnZGTKSDiiJkg8J2RoPCdkZ/wnZGQ8J2RnPCdkZ/wnZGR8J2RkvCdkZ8o8J2RkyniiJIxCi0gICAgICAgICAgICAgIGZvciDwnZGYID0g8J2Rn/CdkZDwnZGc8J2Rn/CdkZHwnZGS8J2RnyAo8J2Rkykg4oiSIDIgdG8gMCBkbyB7Ci0gICAgICAgICAgICAgICAgICDwnZGhID0g8J2RoSDiiJIg8J2Rn/CdkZDwnZGeICjwnZGYLCDwnZGTKSDiiJkg8J2RoPCdkZgKLSAgICAgICAgICAgICAgICAgIPCdkaDwnZGYKzEgPSDwnZGf8J2RkPCdkZ4gKPCdkZgsIPCdkZMpIOKImSDwnZGhICsg8J2RoPCdkZgKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICDwnZGL8J2RhiDMgijwnZGbKSA9IPCdkaEKLSAgICAgICAgICAgICAg8J2RoDAgPSDwnZGhCi0gICAgICAgICAgfQotICAgICAgfQotICB9Ci0gICovCi0gIHVpbnQxNl90IHN0YXJ0X2ZyZXFbMl0gPSB7MTIsIDE2MH07Ci0gIHVpbnQxNl90IHN0b3BfZnJlcVsyXTsKLSAgaWYgKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpIHsKLSAgICBpZiAoNCA9PSBQX0JXKSBzdGFydF9mcmVxWzFdID0gMjAwOwotICAgIHN3aXRjaCAoUF9CVykgewotICAgICAgY2FzZSAwOgotICAgICAgICBzdG9wX2ZyZXFbMF0gPSA4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIHN0b3BfZnJlcVswXSA9IDE2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHN0b3BfZnJlcVswXSA9IDI0MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIHN0b3BfZnJlcVswXSA9IDE2MDsKLSAgICAgICAgc3RvcF9mcmVxWzFdID0gMzIwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gMjAwOwotICAgICAgICBzdG9wX2ZyZXFbMV0gPSA0MDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGFydF9mcmVxWzBdID0gOTsKLSAgICBpZiAoMyA9PSBQX0JXKSBzdGFydF9mcmVxWzFdID0gMTIwOyAgLy8gRXJyYXRhIDE1MDk4IGltcGxlbWVudGVkCi0gICAgaWYgKDQgPT0gUF9CVykgc3RhcnRfZnJlcVsxXSA9IDE1MDsKLSAgICBzd2l0Y2ggKFBfQlcpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gNjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBzdG9wX2ZyZXFbMF0gPSAxMjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBzdG9wX2ZyZXFbMF0gPSAxODA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzOgotICAgICAgICAvLyBzdG9wX2ZyZXFbMF0gPSAxMTk7IC8vIHRoaXMgdmFsdWUgaXMgc3BlY2lmaWVkIGluIFRhYmxlIDMuMTkKLSAgICAgICAgLy8gKGQwOXIwNl9LTEdfQVlfTkhfRmhHLCAyMDE5LTEyLTIwKSwgYnV0IGdpdmVzIHBvb3IgbWF0Y2ggdG8gMzJrSHoKLSAgICAgICAgLy8gZGVjb2RlciB0ZXN0cyBjb21wYXJlZCB0byByZWZlcmVuY2UgZGVjb2RlcgotICAgICAgICBzdG9wX2ZyZXFbMF0gPSAxMjA7ICAvLyB0aGlzIHZhbHVlIGdpdmVzIGdvb2QgbWF0Y2ggdG8gcmVmZXJlbmNlIGRlY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlzIG1vcmUgY29uc2lzdGVudCB0byAxMG1zIGNhc2UKLSAgICAgICAgc3RvcF9mcmVxWzFdID0gMjQwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gMTUwOwotICAgICAgICBzdG9wX2ZyZXFbMV0gPSAzMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50MTZfdCBrID0gMDsgayA8IGxjM0NvbmZpZy5ORTsgaysrKSB7Ci0gICAgWF9zX3Ruc1trXSA9IFhfaGF0X2Zba107Ci0gIH0KLSAgZG91YmxlIHNbOF07Ci0gIGZvciAodWludDhfdCBrID0gMDsgayA8IDg7IGsrKykgewotICAgIHNba10gPSAwLjA7Ci0gIH0KLSAgZm9yICh1aW50OF90IGYgPSAwOyBmIDwgbnVtX3Ruc19maWx0ZXJzOyBmKyspIHsKLSAgICBpZiAoYXJpdGhtZXRpY0RlYy5yY19vcmRlcl9hcmlbZl0gPiAwKSB7Ci0gICAgICBmb3IgKHVpbnQxNl90IG4gPSBzdGFydF9mcmVxW2ZdOyBuIDwgc3RvcF9mcmVxW2ZdOyBuKyspIHsKLSAgICAgICAgZG91YmxlIHQgPSBYX2hhdF9mW25dIC0KLSAgICAgICAgICAgICAgICAgICBhcml0aG1ldGljRGVjLnJjX3EoYXJpdGhtZXRpY0RlYy5yY19vcmRlcl9hcmlbZl0gLSAxLCBmKSAqCi0gICAgICAgICAgICAgICAgICAgICAgIHNbYXJpdGhtZXRpY0RlYy5yY19vcmRlcl9hcmlbZl0gLSAxXTsKLSAgICAgICAgZm9yIChpbnQ4X3QgayA9IGFyaXRobWV0aWNEZWMucmNfb3JkZXJfYXJpW2ZdIC0gMjsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICB0ID0gdCAtIGFyaXRobWV0aWNEZWMucmNfcShrLCBmKSAqIHNba107Ci0gICAgICAgICAgc1trICsgMV0gPSBhcml0aG1ldGljRGVjLnJjX3EoaywgZikgKiB0ICsgc1trXTsKLSAgICAgICAgfQotICAgICAgICBYX3NfdG5zW25dID0gdDsKLSAgICAgICAgc1swXSA9IHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRGVjb2RlckZyYW1lOjpydW5GbG9hdChjb25zdCB1aW50OF90KiBieXRlcywgdWludDhfdCBCRkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgQkVDX2RldGVjdCkgewotICAvLyBpbmNyZW1lbnQgZnJhbWUgY291bnRlcgotICBmcmFtZU4rKzsKLQotICAvLyA1LjQuMi4yIEluaXRpYWxpemF0aW9uCi0gIHVpbnQxNl90IGJwID0gMDsKLSAgdWludDE2X3QgYnBfc2lkZSA9IG5ieXRlcyAtIDE7Ci0gIHVpbnQ4X3QgbWFza19zaWRlID0gMTsKLSAgQkVDX2RldGVjdCA9IEJGSTsgIC8vIE5vdGU6IHRoZSBiYXNlIHNwZWNpZmljYXRpb24gaW5pdGlhbGl6ZXMgQkVDX2RldGVjdCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvLCBidXQgaW5pdGlhbGl6YXRpb24gd2l0aCBCRkkgaXMgbW9yZSBtZWFuaW5nZnVsCi0KLSAgLy8gNS40LjIuMyBTaWRlIGluZm9ybWF0aW9uCi0gIGlmICghQkVDX2RldGVjdCkgewotICAgIHNpZGVJbmZvcm1hdGlvbi5ydW4oYnl0ZXMsIGJwX3NpZGUsIG1hc2tfc2lkZSwgUF9CVywgbGFzdG56LCBsc2JNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2dfaW5kLCBudW1fdG5zX2ZpbHRlcnMsIHJjX29yZGVyLCBwaXRjaF9wcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfaW5kZXgsIGx0cGZfYWN0aXZlLCBGX05GLCBpbmRfTEYsIGluZF9IRiwgR2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExTX2luZEEsIExTX2luZEIsIGlkeEEsIGlkeEIsIEJFQ19kZXRlY3QpOwotICB9Ci0KLSAgLy8gMy40LjIuNCBCYW5kd2lkdGggaW50ZXJwcmV0YXRpb24gKGQwOXIwMl9GMkYpCi0gIC8vIC4uLmluY2x1ZGVkIHNvbWV3aGVyZSBlbHNlPwotCi0gIC8vIDMuNC4yLjUgQXJpdGhtZXRpYyBkZWNvZGluZyAoZDA5cjAyX0YyRikKLSAgaWYgKCFCRUNfZGV0ZWN0KSB7Ci0gICAgYXJpdGhtZXRpY0RlYy5ydW4oYnl0ZXMsIGJwLCBicF9zaWRlLCBtYXNrX3NpZGUsIG51bV90bnNfZmlsdGVycywgcmNfb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgbHNiTW9kZSwgbGFzdG56LCBuYml0cywgQkVDX2RldGVjdCk7Ci0gIH0KLQotICBpZiAoIUJFQ19kZXRlY3QpIHsKLSAgICAvKiBEZWNvZGUgcmVzaWR1YWwgYml0cyAqLwotICAgIC8vIGFuZCAzLjQuMyBSZXNpZHVhbCBkZWNvZGluZyAgKGQwOXIwMl9GMkYpCi0gICAgcmVzaWR1YWxTcGVjdHJ1bS5ydW4oYnl0ZXMsIGJwX3NpZGUsIG1hc2tfc2lkZSwgbGFzdG56LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyaXRobWV0aWNEZWMuWF9oYXRfcV9hcmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJpdGhtZXRpY0RlYy5uYml0c19yZXNpZHVhbCwgYXJpdGhtZXRpY0RlYy5zYXZlX2xldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsc2JNb2RlLCBuZl9zZWVkLCB6ZXJvRnJhbWUsIGdnX2luZCwgRl9ORik7Ci0KLSAgICAvLyAzLjQuNCBOb2lzZSBmaWxsaW5nIChkMDlyMDJfRjJGKQotICAgIG5vaXNlRmlsbGluZygpOwotCi0gICAgLy8gMy40LjUgR2xvYmFsIGdhaW4gKGQwOXIwMl9GMkYpCi0gICAgYXBwbHlHbG9iYWxHYWluKCk7Ci0KLSAgICAvLyAzLjQuNiBUTlMgZGVjb2RlciAoZDA5cjAyX0YyRikKLSAgICB0ZW1wb3JhbE5vaXNlU2hhcGluZygpOwotCi0gICAgLy8gMy40LjcgU05TIGRlY29kZXIgKGQwOXIwMl9GMkYpCi0gICAgc3BlY3RyYWxOb2lzZVNoYXBpbmcucnVuKAotICAgICAgICBYX3NfdG5zLCBYX2hhdF9zcywgaW5kX0xGLCBpbmRfSEYsIHNpZGVJbmZvcm1hdGlvbi5zdWJtb2RlTVNCLAotICAgICAgICBzaWRlSW5mb3JtYXRpb24uc3VibW9kZUxTQiwgR2luZCwgTFNfaW5kQSwgTFNfaW5kQiwgaWR4QSwgaWR4Qik7Ci0gIH0KLQotICAvLyBBcHBlbmRpeCBCLiBQYWNrZXQgTG9zcyBDb25jZWFsbWVudCAgIChkMDlyMDJfRjJGKQotICBwYWNrZXRMb3NzQ29uY2VhbG1lbnQucnVuKEJFQ19kZXRlY3QsIFhfaGF0X3NzLCBsdHBmX2FjdGl2ZSk7Ci0KLSAgLy8gMy40LjggTG93IGRlbGF5IE1EQ1Qgc3ludGhlc2lzICAgKGQwOXIwMl9GMkYpCi0gIG1kY3REZWMucnVuKFhfaGF0X3NzKTsKLQotICAvLyAzLjQuOSBMb25nIFRlcm0gUG9zdGZpbHRlciAgIChkMDlyMDJfRjJGKQotICBpZiAoMCA9PSBwaXRjaF9wcmVzZW50KSB7Ci0gICAgcGl0Y2hfaW5kZXggPSAwOwotICAgIGx0cGZfYWN0aXZlID0gMDsKLSAgfQotICBsb25nVGVybVBvc3RmaWx0ZXIuc2V0SW5wdXRYKG1kY3REZWMueF9oYXRfbWRjdCk7Ci0gIGxvbmdUZXJtUG9zdGZpbHRlci5ydW4obHRwZl9hY3RpdmUsIHBpdGNoX2luZGV4KTsKLX0KLQotdm9pZCBEZWNvZGVyRnJhbWU6OnJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfKSB7Ci0gIGRhdGFwb2ludHMgPSBkYXRhcG9pbnRzXzsKLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiZnNfaWR4IiwgJmxjM0NvbmZpZy5Gc19pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYzNDb25maWcuRnNfaW5kKSk7Ci0KLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoImZyYW1lTiIsICZmcmFtZU4sIHNpemVvZihmcmFtZU4pKTsKLQotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibGFzdG56IiwgJmxhc3Rueiwgc2l6ZW9mKGxhc3RueikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiUF9CVyIsICZQX0JXLCBzaXplb2YoUF9CVykpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibHNiTW9kZSIsICZsc2JNb2RlLCBzaXplb2YobHNiTW9kZSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiZ2dfaW5kIiwgJmdnX2luZCwgc2l6ZW9mKGdnX2luZCkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibnVtX3Ruc19maWx0ZXJzIiwgJm51bV90bnNfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bV90bnNfZmlsdGVycykpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicmNfb3JkZXIiLCAmcmNfb3JkZXJbMF0sIHNpemVvZihyY19vcmRlcikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicGl0Y2hfaW5kZXgiLCAmcGl0Y2hfaW5kZXgsIHNpemVvZihwaXRjaF9pbmRleCkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicGl0Y2hfcHJlc2VudCIsICZwaXRjaF9wcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGl0Y2hfcHJlc2VudCkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibHRwZl9hY3RpdmUiLCAmbHRwZl9hY3RpdmUsIHNpemVvZihsdHBmX2FjdGl2ZSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiRl9ORiIsICZGX05GLCBzaXplb2YoRl9ORikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaW5kX0xGIiwgJmluZF9MRiwgc2l6ZW9mKGluZF9MRikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaW5kX0hGIiwgJmluZF9IRiwgc2l6ZW9mKGluZF9IRikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiR2luZCIsICZHaW5kLCBzaXplb2YoR2luZCkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiTFNfaW5kQSIsICZMU19pbmRBLCBzaXplb2YoTFNfaW5kQSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaWR4QSIsICZpZHhBLCBzaXplb2YoaWR4QSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaWR4QiIsICZpZHhCLCBzaXplb2YoaWR4QikpOwotCi0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJuZl9zZWVkIiwgJm5mX3NlZWQsIHNpemVvZihuZl9zZWVkKSk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJ6ZXJvRnJhbWUiLCAmemVyb0ZyYW1lLCBzaXplb2YoemVyb0ZyYW1lKSk7Ci0KLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoImdnX29mZiIsICZnZ19vZmYsIHNpemVvZihnZ19vZmYpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInJjX2lfdG5zIiwgJmFyaXRobWV0aWNEZWMucmNfaVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFyaXRobWV0aWNEZWMucmNfaVswXSkgKiA4KTsKLQotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiWF9oYXRfcV9uZiIsICZYX2hhdF9xX25mWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZG91YmxlKSAqIGxjM0NvbmZpZy5ORSk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJYX3NfdG5zIiwgJlhfc190bnNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogbGMzQ29uZmlnLk5FKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIlhfaGF0X3NzIiwgJlhfaGF0X3NzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZG91YmxlKSAqIGxjM0NvbmZpZy5ORSk7Ci0KLSAgICBpZiAobnVsbHB0ciA9PSB4X2hhdF9jbGlwKSB7Ci0gICAgICB4X2hhdF9jbGlwID0gbmV3IGRvdWJsZVtsYzNDb25maWcuTkZdOwotICAgIH0KLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfaGF0X2NsaXAiLCAmeF9oYXRfY2xpcFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiBsYzNDb25maWcuTkYpOwotCi0gICAgc2lkZUluZm9ybWF0aW9uLnJlZ2lzdGVyRGF0YXBvaW50cyhkYXRhcG9pbnRzKTsKLSAgICBhcml0aG1ldGljRGVjLnJlZ2lzdGVyRGF0YXBvaW50cyhkYXRhcG9pbnRzKTsKLSAgICBsb25nVGVybVBvc3RmaWx0ZXIucmVnaXN0ZXJEYXRhcG9pbnRzKGRhdGFwb2ludHMpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9EZWNvZGVyRnJhbWUuaHBwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL0RlY29kZXJGcmFtZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTFjODYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0RlY29kZXJGcmFtZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIERlY29kZXJGcmFtZS5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0RFQ09ERVJfRlJBTUVfSFBQXwotI2RlZmluZSBfX0RFQ09ERVJfRlJBTUVfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkFyaXRobWV0aWNEZWMuaHBwIgotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotI2luY2x1ZGUgIkxjM0NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmhwcCIKLSNpbmNsdWRlICJNZGN0RGVjLmhwcCIKLSNpbmNsdWRlICJQYWNrZXRMb3NzQ29uY2VhbG1lbnQuaHBwIgotI2luY2x1ZGUgIlJlc2lkdWFsU3BlY3RydW0uaHBwIgotI2luY2x1ZGUgIlNpZGVJbmZvcm1hdGlvbi5ocHAiCi0jaW5jbHVkZSAiU3BlY3RyYWxOb2lzZVNoYXBpbmcuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotY2xhc3MgRGVjb2RlckZyYW1lIHsKLSBwdWJsaWM6Ci0gIERlY29kZXJGcmFtZShSZXNpZHVhbFNwZWN0cnVtJiByZXNpZHVhbFNwZWN0cnVtXywKLSAgICAgICAgICAgICAgIFNwZWN0cmFsTm9pc2VTaGFwaW5nJiBzcGVjdHJhbE5vaXNlU2hhcGluZ18sCi0gICAgICAgICAgICAgICBQYWNrZXRMb3NzQ29uY2VhbG1lbnQmIHBhY2tldExvc3NDb25jZWFsbWVudF8sIE1kY3REZWMmIG1kY3REZWNfLAotICAgICAgICAgICAgICAgY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWdfLCB1aW50MTZfdCBuYnl0ZXNfKTsKLSAgdmlydHVhbCB+RGVjb2RlckZyYW1lKCk7Ci0KLSAgdm9pZCByZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzXyk7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgcnVuKGNvbnN0IHVpbnQ4X3QqIGJ5dGVzLCB1aW50OF90IEJGSSwKLSAgICAgICAgICAgdWludDE2X3QgYml0c19wZXJfYXVkaW9fc2FtcGxlX2RlYywgVCogeF9vdXQsIHVpbnQ4X3QmIEJFQ19kZXRlY3QpIHsKLSAgICBpZiAoIWxjM0NvbmZpZy5pc1ZhbGlkKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBtYWluIGRlY29kZXIgaW1wbGVtZW50YXRpb246IDMuNC4xIHVudGlsIDMuNC45IChkMDlyMDYpCi0gICAgcnVuRmxvYXQoYnl0ZXMsIEJGSSwgQkVDX2RldGVjdCk7Ci0KLSAgICAvLyAzLjQuMTAgT3V0cHV0IHNpZ25hbCBzY2FsaW5nIGFuZCByb3VuZGluZyAgIChkMDlyMDYpCi0gICAgY29uc3QgdWludDMyX3Qgb3V0cHV0U2NhbGUgPSAxVUwgPDwgKC0xNSArIGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWMgLSAxKTsKLSAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbGMzQ29uZmlnLk5GOyBrKyspIHsKLSAgICAgIGRvdWJsZSB4X2hhdF9jbGlwX2xvY2FsOwotICAgICAgaWYgKGxvbmdUZXJtUG9zdGZpbHRlci54X2hhdF9sdHBmW2tdID4gMzI3NjcpIHsKLSAgICAgICAgeF9oYXRfY2xpcF9sb2NhbCA9IDMyNzY3OwotICAgICAgfSBlbHNlIGlmIChsb25nVGVybVBvc3RmaWx0ZXIueF9oYXRfbHRwZltrXSA8IC0zMjc2OCkgewotICAgICAgICB4X2hhdF9jbGlwX2xvY2FsID0gLTMyNzY4OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgeF9oYXRfY2xpcF9sb2NhbCA9IGxvbmdUZXJtUG9zdGZpbHRlci54X2hhdF9sdHBmW2tdOwotICAgICAgfQotCi0gICAgICAvLyBkYXRhcG9pbnQgYnVmZmVyIGZvciB4X2hhdF9jbGlwIG9ubHkgcHJlcGFyZWQgd2hlbiBkYXRhcG9pbnRzIGFyZQotICAgICAgLy8gYXZhaWxhYmxlCi0gICAgICBpZiAobnVsbHB0ciAhPSB4X2hhdF9jbGlwKSB7Ci0gICAgICAgIHhfaGF0X2NsaXBba10gPSB4X2hhdF9jbGlwX2xvY2FsOwotICAgICAgfQotCi0gICAgICAvLyBSb3VuZCDwnZGlIHRvIG5lYXJlc3QgaW50ZWdlciwgZS5nLiwg4oyK4oiSNC414oyJID0g4oiSNSwg4oyK4oiSMy4y4oyJID0g4oiSMywg4oyKMy4y4oyJID0gMywKLSAgICAgIC8vIOKMijQuNeKMiSA9IDUsCi0gICAgICBpZiAoeF9oYXRfY2xpcF9sb2NhbCA+IDApIHsKLSAgICAgICAgeF9vdXRba10gPSBvdXRwdXRTY2FsZSAqIHhfaGF0X2NsaXBfbG9jYWwgKyAwLjU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB4X291dFtrXSA9IG91dHB1dFNjYWxlICogeF9oYXRfY2xpcF9sb2NhbCAtIDAuNTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgICBkYXRhcG9pbnRzLT5sb2coInhfb3V0IiwgJnhfb3V0WzBdLCBzaXplb2YoVCkgKiBsYzNDb25maWcuTkYpOwotICAgICAgZGF0YXBvaW50cy0+bG9nKCJCRVJfZGV0ZWN0IiwgJkJFQ19kZXRlY3QsIHNpemVvZihCRUNfZGV0ZWN0KSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsaW5rUHJldmlvdXNGcmFtZShEZWNvZGVyRnJhbWUqIHByZXZpb3VzRnJhbWUpOwotCi0gIC8vIHBlciBpbnN0YW5jZSBjb25zdGFudCBwYXJhbWV0ZXIKLSAgY29uc3QgdWludDE2X3QgbmJ5dGVzOwotICBjb25zdCB1aW50MTZfdCBuYml0czsKLSAgY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWc7Ci0gIGNvbnN0IHVpbnQ4X3QgdG5zX2xwY193ZWlnaHRpbmc7Ci0KLSBwcml2YXRlOgotICB2b2lkIHJ1bkZsb2F0KGNvbnN0IHVpbnQ4X3QqIGJ5dGVzLCB1aW50OF90IEJGSSwgdWludDhfdCYgQkVDX2RldGVjdCk7Ci0KLSAgdm9pZCBub2lzZUZpbGxpbmcoKTsKLSAgdm9pZCBhcHBseUdsb2JhbEdhaW4oKTsKLSAgdm9pZCB0ZW1wb3JhbE5vaXNlU2hhcGluZygpOwotCi0gIFNpZGVJbmZvcm1hdGlvbiBzaWRlSW5mb3JtYXRpb247Ci0gIEFyaXRobWV0aWNEZWMgYXJpdGhtZXRpY0RlYzsKLSAgUmVzaWR1YWxTcGVjdHJ1bSYgcmVzaWR1YWxTcGVjdHJ1bTsKLSAgU3BlY3RyYWxOb2lzZVNoYXBpbmcmIHNwZWN0cmFsTm9pc2VTaGFwaW5nOwotICBQYWNrZXRMb3NzQ29uY2VhbG1lbnQmIHBhY2tldExvc3NDb25jZWFsbWVudDsKLSAgTWRjdERlYyYgbWRjdERlYzsKLSAgTG9uZ1Rlcm1Qb3N0ZmlsdGVyIGxvbmdUZXJtUG9zdGZpbHRlcjsKLQotICBEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHM7Ci0KLSAgLy8gc3RhdGVzICYgb3V0cHV0cwotICBpbnQxNl90IGZyYW1lTjsKLQotICBpbnQxNl90IGxhc3RuejsKLSAgaW50MTZfdCBQX0JXOwotICB1aW50OF90IGxzYk1vZGU7Ci0gIGludDE2X3QgZ2dfaW5kOwotICBpbnQxNl90IG51bV90bnNfZmlsdGVyczsKLSAgaW50MTZfdCByY19vcmRlclsyXTsKLSAgdWludDhfdCBwaXRjaF9wcmVzZW50OwotICBpbnQxNl90IHBpdGNoX2luZGV4OwotICBpbnQxNl90IGx0cGZfYWN0aXZlOwotICBpbnQxNl90IEZfTkY7Ci0gIGludDE2X3QgaW5kX0xGOwotICBpbnQxNl90IGluZF9IRjsKLSAgaW50MTZfdCBHaW5kOwotICBpbnQxNl90IExTX2luZEE7Ci0gIGludDE2X3QgTFNfaW5kQjsKLSAgaW50MzJfdCBpZHhBOwotICBpbnQxNl90IGlkeEI7Ci0gIHVpbnQxNl90IG5mX3NlZWQ7Ci0gIHVpbnQxNl90IHplcm9GcmFtZTsKLSAgaW50MTZfdCBnZ19vZmY7Ci0gIGRvdWJsZSogWF9oYXRfcV9uZjsKLSAgZG91YmxlKiBYX2hhdF9mOwotICBkb3VibGUqIFhfc190bnM7Ci0gIGRvdWJsZSogWF9oYXRfc3M7Ci0gIGRvdWJsZSogeF9oYXRfY2xpcDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKLQotI2VuZGlmICAvLyBfX0RFQ09ERVJfRlJBTUVfSFBQXwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0RlY29kZXJUb3AuY3BwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL0RlY29kZXJUb3AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdmNmFjYi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0RlY29kZXIvRGVjb2RlclRvcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogRGVjb2RlclRvcC5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkRlY29kZXJUb3AuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotRGVjb2RlclRvcDo6RGVjb2RlclRvcCh1aW50MTZfdCBmc18sIERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pCi0gICAgOiBEZWNvZGVyVG9wKExjM0NvbmZpZyhmc18sIExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMsIDEpLAotICAgICAgICAgICAgICAgICBkYXRhcG9pbnRzXykge30KLQotRGVjb2RlclRvcDo6RGVjb2RlclRvcChMYzNDb25maWcgbGMzQ29uZmlnXywgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzXykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIGRhdGFwb2ludHMoZGF0YXBvaW50c18pLAotICAgICAgZGVjb2RlckN1cnJlbnRGcmFtZShudWxscHRyKSwKLSAgICAgIGRlY29kZXJQcmV2aW91c0ZyYW1lKG51bGxwdHIpLAotICAgICAgcmVzaWR1YWxTcGVjdHJ1bShsYzNDb25maWdfLk5FKSwKLSAgICAgIHNwZWN0cmFsTm9pc2VTaGFwaW5nKGxjM0NvbmZpZyksCi0gICAgICBwYWNrZXRMb3NzQ29uY2VhbG1lbnQobGMzQ29uZmlnXy5ORSksCi0gICAgICBtZGN0RGVjKGxjM0NvbmZpZykgewotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgcmVzaWR1YWxTcGVjdHJ1bS5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gICAgc3BlY3RyYWxOb2lzZVNoYXBpbmcucmVnaXN0ZXJEYXRhcG9pbnRzKGRhdGFwb2ludHMpOwotICAgIHBhY2tldExvc3NDb25jZWFsbWVudC5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gICAgbWRjdERlYy5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gIH0KLX0KLQotRGVjb2RlclRvcDo6fkRlY29kZXJUb3AoKSB7Ci0gIGlmIChudWxscHRyICE9IGRlY29kZXJQcmV2aW91c0ZyYW1lKSB7Ci0gICAgZGVsZXRlIGRlY29kZXJQcmV2aW91c0ZyYW1lOwotICB9Ci0gIGlmIChudWxscHRyICE9IGRlY29kZXJDdXJyZW50RnJhbWUpIHsKLSAgICBkZWxldGUgZGVjb2RlckN1cnJlbnRGcmFtZTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvRGVjb2RlclRvcC5ocHAgYi9lbWJkcnYvbGMzL0RlY29kZXIvRGVjb2RlclRvcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OGE1NzQuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0RlY29kZXJUb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIERlY29kZXJUb3AuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19ERUNPREVSX1RPUF9IUFBfCi0jZGVmaW5lIF9fREVDT0RFUl9UT1BfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotI2luY2x1ZGUgIkRlY29kZXJGcmFtZS5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLSNpbmNsdWRlICJNZGN0RGVjLmhwcCIKLSNpbmNsdWRlICJQYWNrZXRMb3NzQ29uY2VhbG1lbnQuaHBwIgotI2luY2x1ZGUgIlJlc2lkdWFsU3BlY3RydW0uaHBwIgotI2luY2x1ZGUgIlNwZWN0cmFsTm9pc2VTaGFwaW5nLmhwcCIKLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLWNsYXNzIERlY29kZXJUb3AgewotIHB1YmxpYzoKLSAgRGVjb2RlclRvcCh1aW50MTZfdCBmc18sIERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18gPSBudWxscHRyKTsKLSAgRGVjb2RlclRvcChMYzNDb25maWcgbGMzQ29uZmlnXywgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzXyA9IG51bGxwdHIpOwotICB2aXJ0dWFsIH5EZWNvZGVyVG9wKCk7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgcnVuKGNvbnN0IHVpbnQ4X3QqIGJ5dGVzLCB1aW50MTZfdCBuYnl0ZXMsIHVpbnQ4X3QgQkZJLAotICAgICAgICAgICB1aW50OF90IGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWMsIFQqIHhfb3V0LCB1aW50OF90JiBCRUNfZGV0ZWN0KSB7Ci0gICAgaWYgKChudWxscHRyID09IGRlY29kZXJDdXJyZW50RnJhbWUpIHx8Ci0gICAgICAgIChkZWNvZGVyQ3VycmVudEZyYW1lLT5uYnl0ZXMgIT0gbmJ5dGVzKSkgewotICAgICAgLy8gV2UgbmVlZCB0byBpbnN0YW50aWF0ZSBhIG5ldyBEZWNvZGVyRnJhbWUgb25seQotICAgICAgLy8gd2hlbiBieXRlX2NvdW50IGhhcyBiZWVuIGNoYW5nZWQuIFRodXMsIGZyZXF1ZW50Ci0gICAgICAvLyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGNhbiBiZSBjb25zdHJhaW5lZCB0bwotICAgICAgLy8gcmF0ZSBvcHRpbWl6ZWQgb3BlcmF0aW9uLgotICAgICAgaWYgKG51bGxwdHIgIT0gZGVjb2RlclByZXZpb3VzRnJhbWUpIHsKLSAgICAgICAgZGVsZXRlIGRlY29kZXJQcmV2aW91c0ZyYW1lOwotICAgICAgfQotICAgICAgZGVjb2RlclByZXZpb3VzRnJhbWUgPSBkZWNvZGVyQ3VycmVudEZyYW1lOwotICAgICAgZGVjb2RlckN1cnJlbnRGcmFtZSA9Ci0gICAgICAgICAgbmV3IERlY29kZXJGcmFtZShyZXNpZHVhbFNwZWN0cnVtLCBzcGVjdHJhbE5vaXNlU2hhcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldExvc3NDb25jZWFsbWVudCwgbWRjdERlYywgbGMzQ29uZmlnLCBuYnl0ZXMpOwotICAgICAgZGVjb2RlckN1cnJlbnRGcmFtZS0+bGlua1ByZXZpb3VzRnJhbWUoZGVjb2RlclByZXZpb3VzRnJhbWUpOwotICAgICAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgICAgICAvLyBBbm90aGVyIHdheSB0byBtYWtlIHRvIGNhbGwgb3B0aW9uYWwgd291bGQgYmUgdG8gc3BsaXQgcnVuKCkgaW50bwotICAgICAgICAvLyAgaW5pdCgpLCByZWdpc3RlckRhdGFwb2ludHMoKSAmIHJlbWFpbmluZyBydW4oKSAtPiB3ZSBwcmVmZXJyZWQgdGhlCi0gICAgICAgIC8vICBzaW1wbGVyCi0gICAgICAgIC8vIEFQSSBhbmQgdGh1cyBkZXNpZ25lZCB0aGlzIHJlZ2lzdHJhdGlvbiBiZWluZyBkZXBlbmRlbnQgb24gdGhlCi0gICAgICAgIC8vIGF2YWlsYWJpbGl0eSBvZiBkYXRhcG9pbnRzLgotICAgICAgICBkZWNvZGVyQ3VycmVudEZyYW1lLT5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGRlY29kZXJDdXJyZW50RnJhbWUtPnJ1bjxUPihieXRlcywgQkZJLCBiaXRzX3Blcl9hdWRpb19zYW1wbGVfZGVjLCB4X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVDX2RldGVjdCk7Ci0gIH0KLQotICBjb25zdCBMYzNDb25maWcgbGMzQ29uZmlnOwotCi0gcHJpdmF0ZToKLSAgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzOwotICBEZWNvZGVyRnJhbWUqIGRlY29kZXJDdXJyZW50RnJhbWU7Ci0gIERlY29kZXJGcmFtZSogZGVjb2RlclByZXZpb3VzRnJhbWU7Ci0gIFJlc2lkdWFsU3BlY3RydW0gcmVzaWR1YWxTcGVjdHJ1bTsKLSAgU3BlY3RyYWxOb2lzZVNoYXBpbmcgc3BlY3RyYWxOb2lzZVNoYXBpbmc7Ci0gIFBhY2tldExvc3NDb25jZWFsbWVudCBwYWNrZXRMb3NzQ29uY2VhbG1lbnQ7Ci0gIE1kY3REZWMgbWRjdERlYzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKLQotI2VuZGlmICAvLyBfX0RFQ09ERVJfVE9QX0hQUF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9MYzNEZWNvZGVyLmNwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9MYzNEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjN2NmNC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0RlY29kZXIvTGMzRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExjM0RlY29kZXIuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMYzNEZWNvZGVyLmhwcCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJEZWNvZGVyVG9wLmhwcCIKLQotdXNpbmcgbmFtZXNwYWNlIExjM0RlYzsKLQotTGMzRGVjb2Rlcjo6TGMzRGVjb2Rlcih1aW50MTZfdCBGcywgTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uIGZyYW1lRHVyYXRpb24pCi0gICAgOiBMYzNEZWNvZGVyKExjM0NvbmZpZyhGcywgZnJhbWVEdXJhdGlvbiwgMSkpIHt9Ci0KLUxjM0RlY29kZXI6OkxjM0RlY29kZXIoTGMzQ29uZmlnIGxjM0NvbmZpZ18sIHVpbnQ4X3QgYml0c19wZXJfYXVkaW9fc2FtcGxlX2RlY18sCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJ5dGVfY291bnRfbWF4X2RlY18sIHZvaWQqIGRhdGFwb2ludHMpCi0gICAgOiBsYzNDb25maWcobGMzQ29uZmlnXyksCi0gICAgICBiaXRzX3Blcl9hdWRpb19zYW1wbGVfZGVjKGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWNfKSwKLSAgICAgIGJ5dGVfY291bnRfbWF4X2RlYygoYnl0ZV9jb3VudF9tYXhfZGVjXyA8IDQwMCkgPyBieXRlX2NvdW50X21heF9kZWNfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNDAwKSwKLSAgICAgIGRlY29kZXJMaXN0KGxjM0NvbmZpZy5OYykgewotICAvLyBwcm9jZWVkIG9ubHkgd2l0aCB2YWxpZCBjb25maWd1cmF0aW9uCi0gIGlmIChsYzNDb25maWcuaXNWYWxpZCgpKSB7Ci0gICAgZm9yICh1aW50OF90IGNoYW5uZWxOciA9IDA7IGNoYW5uZWxOciA8IGxjM0NvbmZpZy5OYzsgY2hhbm5lbE5yKyspIHsKLSAgICAgIGRlY29kZXJMaXN0W2NoYW5uZWxOcl0gPSBuZXcgRGVjb2RlclRvcCgKLSAgICAgICAgICBsYzNDb25maWcsIHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YXBvaW50Q29udGFpbmVyKj4oZGF0YXBvaW50cykpOwotICAgIH0KLSAgfQotfQotCi1MYzNEZWNvZGVyOjp+TGMzRGVjb2RlcigpIHsKLSAgZm9yICh1aW50OF90IGNoYW5uZWxOciA9IDA7IGNoYW5uZWxOciA8IGxjM0NvbmZpZy5OYzsgY2hhbm5lbE5yKyspIHsKLSAgICBEZWNvZGVyVG9wKiBkZWNvZGVyVG9wID0gZGVjb2Rlckxpc3RbY2hhbm5lbE5yXTsKLSAgICBpZiAobnVsbHB0ciAhPSBkZWNvZGVyVG9wKSB7Ci0gICAgICBkZWxldGUgZGVjb2RlclRvcDsKLSAgICB9Ci0gIH0KLX0KLQotdWludDhfdCBMYzNEZWNvZGVyOjpydW4oY29uc3QgdWludDhfdCogYnl0ZXMsIHVpbnQxNl90IGJ5dGVfY291bnQsIHVpbnQ4X3QgQkZJLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogeF9vdXQsIHVpbnQxNl90IHhfb3V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCRUNfZGV0ZWN0LCB1aW50OF90IGNoYW5uZWxOcikgewotICBpZiAoIWxjM0NvbmZpZy5pc1ZhbGlkKCkpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICB9Ci0gIGlmICgoYnl0ZV9jb3VudCA8IDIwKSB8fCAoYnl0ZV9jb3VudCA+IGJ5dGVfY291bnRfbWF4X2RlYykpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9CWVRFX0NPVU5UOwotICB9Ci0gIGlmIChsYzNDb25maWcuTkYgIT0geF9vdXRfc2l6ZSkgewotICAgIHJldHVybiBJTlZBTElEX1hfT1VUX1NJWkU7Ci0gIH0KLSAgaWYgKGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWMgIT0gMTYpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9CSVRTX1BFUl9BVURJT19TQU1QTEU7Ci0gIH0KLSAgaWYgKG51bGxwdHIgPT0gZGVjb2Rlckxpc3RbY2hhbm5lbE5yXSkgewotICAgIHJldHVybiBERUNPREVSX0FMTE9DQVRJT05fRVJST1I7Ci0gIH0KLQotICBkZWNvZGVyTGlzdFtjaGFubmVsTnJdLT5ydW48aW50MTZfdD4oCi0gICAgICBieXRlcywgYnl0ZV9jb3VudCwgQkZJLCBiaXRzX3Blcl9hdWRpb19zYW1wbGVfZGVjLCB4X291dCwgQkVDX2RldGVjdCk7Ci0gIHJldHVybiBFUlJPUl9GUkVFOwotfQotCi11aW50OF90IExjM0RlY29kZXI6OnJ1bihjb25zdCB1aW50OF90KiBieXRlcywgdWludDE2X3QgYnl0ZV9jb3VudCwgdWludDhfdCBCRkksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiB4X291dCwgdWludDE2X3QgeF9vdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEJFQ19kZXRlY3QsIHVpbnQ4X3QgY2hhbm5lbE5yKSB7Ci0gIGlmICghbGMzQ29uZmlnLmlzVmFsaWQoKSkgewotICAgIHJldHVybiBJTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gIH0KLSAgaWYgKChieXRlX2NvdW50IDwgMjApIHx8IChieXRlX2NvdW50ID4gYnl0ZV9jb3VudF9tYXhfZGVjKSkgewotICAgIHJldHVybiBJTlZBTElEX0JZVEVfQ09VTlQ7Ci0gIH0KLSAgaWYgKGxjM0NvbmZpZy5ORiAhPSB4X291dF9zaXplKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfWF9PVVRfU0laRTsKLSAgfQotICBpZiAoKGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWMgIT0gMTYpICYmIChiaXRzX3Blcl9hdWRpb19zYW1wbGVfZGVjICE9IDI0KSAmJgotICAgICAgKGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9kZWMgIT0gMzIpKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfQklUU19QRVJfQVVESU9fU0FNUExFOwotICB9Ci0gIGlmIChudWxscHRyID09IGRlY29kZXJMaXN0W2NoYW5uZWxOcl0pIHsKLSAgICByZXR1cm4gREVDT0RFUl9BTExPQ0FUSU9OX0VSUk9SOwotICB9Ci0KLSAgZGVjb2Rlckxpc3RbY2hhbm5lbE5yXS0+cnVuPGludDMyX3Q+KAotICAgICAgYnl0ZXMsIGJ5dGVfY291bnQsIEJGSSwgYml0c19wZXJfYXVkaW9fc2FtcGxlX2RlYywgeF9vdXQsIEJFQ19kZXRlY3QpOwotICByZXR1cm4gRVJST1JfRlJFRTsKLX0KLQotdWludDhfdCBMYzNEZWNvZGVyOjpydW4oY29uc3QgdWludDhfdCogYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIEJGSV9wZXJfY2hhbm5lbCwgaW50MTZfdCogeF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4X291dF9zaXplLCB1aW50OF90KiBCRUNfZGV0ZWN0X3Blcl9jaGFubmVsKSB7Ci0gIGlmICghbGMzQ29uZmlnLmlzVmFsaWQoKSkgewotICAgIHJldHVybiBJTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gIH0KLSAgaWYgKGxjM0NvbmZpZy5ORiAqIGxjM0NvbmZpZy5OYyAhPSB4X291dF9zaXplKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfWF9PVVRfU0laRTsKLSAgfQotCi0gIHVpbnQ4X3QgcmV0dXJuQ29kZSA9IEVSUk9SX0ZSRUU7Ci0gIHVpbnQzMl90IGJ5dGVPZmZzZXQgPSAwOwotICBmb3IgKHVpbnQ4X3QgY2hhbm5lbE5yID0gMDsgY2hhbm5lbE5yIDwgbGMzQ29uZmlnLk5jOyBjaGFubmVsTnIrKykgewotICAgIC8vIE5vdGU6IGJpdHdpc2Ugb3Igb2YgdGhlIHNpbmdsZSBjaGFubmVsIHJldHVybiBjb2RlIHdpbGwgbm90IGFsbG93Ci0gICAgLy8gdW5pcXVlbHkgdG8gZGVjb2RlCi0gICAgLy8gICAgICAgdGhlIGdpdmVuIGVycm9yLiBUaGUgaWRlYSBpcyB0byBjYXRjaCBhbnkgZXJyb3IuIFRoaXMgZGVjaXNpb24KLSAgICAvLyAgICAgICBtYWtlcyB0aGUgQVBJIG1vcmUgc2ltcGxlLiBIb3dldmVyLCB3aGVuIHRoZSBwcmVjaXNlIGVycm9yIGNvZGUgaXMKLSAgICAvLyAgICAgICBuZWVkZWQsIHRoZSBzaW5nbGUgY2hhbm5lbCBjYWxsIGhhcyB0byBiZSBtYWRlIHNlcGFyYXRlbHkuCi0gICAgcmV0dXJuQ29kZSB8PQotICAgICAgICBydW4oJmJ5dGVzW2J5dGVPZmZzZXRdLCBieXRlX2NvdW50X3Blcl9jaGFubmVsW2NoYW5uZWxOcl0sCi0gICAgICAgICAgICBCRklfcGVyX2NoYW5uZWxbY2hhbm5lbE5yXSwgJnhfb3V0W2NoYW5uZWxOciAqIGxjM0NvbmZpZy5ORl0sCi0gICAgICAgICAgICBsYzNDb25maWcuTkYsIEJFQ19kZXRlY3RfcGVyX2NoYW5uZWxbY2hhbm5lbE5yXSwgY2hhbm5lbE5yKTsKLSAgICBieXRlT2Zmc2V0ICs9IGJ5dGVfY291bnRfcGVyX2NoYW5uZWxbY2hhbm5lbE5yXTsKLSAgfQotICByZXR1cm4gcmV0dXJuQ29kZTsKLX0KLQotdWludDhfdCBMYzNEZWNvZGVyOjpydW4oY29uc3QgdWludDhfdCogYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIEJGSV9wZXJfY2hhbm5lbCwgaW50MzJfdCogeF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4X291dF9zaXplLCB1aW50OF90KiBCRUNfZGV0ZWN0X3Blcl9jaGFubmVsKSB7Ci0gIGlmICghbGMzQ29uZmlnLmlzVmFsaWQoKSkgewotICAgIHJldHVybiBJTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gIH0KLSAgaWYgKGxjM0NvbmZpZy5ORiAqIGxjM0NvbmZpZy5OYyAhPSB4X291dF9zaXplKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfWF9PVVRfU0laRTsKLSAgfQotCi0gIHVpbnQ4X3QgcmV0dXJuQ29kZSA9IEVSUk9SX0ZSRUU7Ci0gIHVpbnQzMl90IGJ5dGVPZmZzZXQgPSAwOwotICBmb3IgKHVpbnQ4X3QgY2hhbm5lbE5yID0gMDsgY2hhbm5lbE5yIDwgbGMzQ29uZmlnLk5jOyBjaGFubmVsTnIrKykgewotICAgIC8vIE5vdGU6IGJpdHdpc2Ugb3Igb2YgdGhlIHNpbmdsZSBjaGFubmVsIHJldHVybiBjb2RlIHdpbGwgbm90IGFsbG93Ci0gICAgLy8gdW5pcXVlbHkgdG8gZGVjb2RlCi0gICAgLy8gICAgICAgdGhlIGdpdmVuIGVycm9yLiBUaGUgaWRlYSBpcyB0byBjYXRjaCBhbnkgZXJyb3IuIFRoaXMgZGVjaXNpb24KLSAgICAvLyAgICAgICBtYWtlcyB0aGUgQVBJIG1vcmUgc2ltcGxlLiBIb3dldmVyLCB3aGVuIHRoZSBwcmVjaXNlIGVycm9yIGNvZGUgaXMKLSAgICAvLyAgICAgICBuZWVkZWQsIHRoZSBzaW5nbGUgY2hhbm5lbCBjYWxsIGhhcyB0byBiZSBtYWRlIHNlcGFyYXRlbHkuCi0gICAgcmV0dXJuQ29kZSB8PQotICAgICAgICBydW4oJmJ5dGVzW2J5dGVPZmZzZXRdLCBieXRlX2NvdW50X3Blcl9jaGFubmVsW2NoYW5uZWxOcl0sCi0gICAgICAgICAgICBCRklfcGVyX2NoYW5uZWxbY2hhbm5lbE5yXSwgJnhfb3V0W2NoYW5uZWxOciAqIGxjM0NvbmZpZy5ORl0sCi0gICAgICAgICAgICBsYzNDb25maWcuTkYsIEJFQ19kZXRlY3RfcGVyX2NoYW5uZWxbY2hhbm5lbE5yXSwgY2hhbm5lbE5yKTsKLSAgICBieXRlT2Zmc2V0ICs9IGJ5dGVfY291bnRfcGVyX2NoYW5uZWxbY2hhbm5lbE5yXTsKLSAgfQotICByZXR1cm4gcmV0dXJuQ29kZTsKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9Mb25nVGVybVBvc3RmaWx0ZXIuY3BwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL0xvbmdUZXJtUG9zdGZpbHRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzhjN2YuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0xvbmdUZXJtUG9zdGZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoKLSAqIExvbmdUZXJtUG9zdGZpbHRlci5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxvbmdUZXJtUG9zdGZpbHRlci5ocHAiCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIkxvbmdUZXJtUG9zdGZpbHRlckNvZWZmaWNpZW50cy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNEZWMgewotCi1Mb25nVGVybVBvc3RmaWx0ZXI6OkxvbmdUZXJtUG9zdGZpbHRlcihjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuYml0cykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIG51bU1lbUJsb2NrcygobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcykgPyAyIDogMyksCi0gICAgICB4X2hhdF9sdHBmKG51bGxwdHIpLAotICAgICAgbHRwZl9hY3RpdmVfcHJldigwKSwKLSAgICAgIGJsb2NrU3RhcnRJbmRleCgwKSwKLSAgICAgIGNfbnVtKG51bGxwdHIpLAotICAgICAgY19kZW4obnVsbHB0ciksCi0gICAgICBjX251bV9tZW0obnVsbHB0ciksCi0gICAgICBjX2Rlbl9tZW0obnVsbHB0ciksCi0gICAgICB4X2hhdF9sdHBmaW4obnVsbHB0ciksCi0gICAgICB4X2hhdF9tZW0obnVsbHB0ciksCi0gICAgICB4X2hhdF9sdHBmX21lbShudWxscHRyKSwKLSAgICAgIHBfaW50KDApLAotICAgICAgcF9mcigwKSwKLSAgICAgIHBfaW50X21lbSgwKSwKLSAgICAgIHBfZnJfbWVtKDApIHsKLSAgeF9oYXRfbHRwZmluID0gbmV3IGRvdWJsZVtsYzNDb25maWcuTkZdOwotICB4X2hhdF9tZW0gPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORiAqIG51bU1lbUJsb2Nrc107Ci0gIHhfaGF0X2x0cGYgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORl07Ci0gIHhfaGF0X2x0cGZfbWVtID0gbmV3IGRvdWJsZVtsYzNDb25maWcuTkYgKiBudW1NZW1CbG9ja3NdOwotCi0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBsYzNDb25maWcuTkYgKiBudW1NZW1CbG9ja3M7IG4rKykgewotICAgIHhfaGF0X21lbVtuXSA9IDAuMDsKLSAgICB4X2hhdF9sdHBmX21lbVtuXSA9IDAuMDsKLSAgfQotCi0gIHNldEdhaW5QYXJhbXMobmJpdHMpOwotCi0gIExfZGVuID0gY2VpbChsYzNDb25maWcuRnMgLyA0MDAwLjApOwotICBpZiAoTF9kZW4gPCA0KSBMX2RlbiA9IDQ7Ci0gIExfbnVtID0gTF9kZW4gLSAyOwotCi0gIGNfbnVtID0gbmV3IGRvdWJsZVtMX251bSArIDFdOwotICBjX2RlbiA9IG5ldyBkb3VibGVbTF9kZW4gKyAxXTsKLSAgY19udW1fbWVtID0gbmV3IGRvdWJsZVtMX251bSArIDFdOwotICBjX2Rlbl9tZW0gPSBuZXcgZG91YmxlW0xfZGVuICsgMV07Ci19Ci0KLUxvbmdUZXJtUG9zdGZpbHRlcjo6fkxvbmdUZXJtUG9zdGZpbHRlcigpIHsKLSAgaWYgKG51bGxwdHIgIT0geF9oYXRfbHRwZmluKSB7Ci0gICAgZGVsZXRlW10geF9oYXRfbHRwZmluOwotICB9Ci0gIGlmIChudWxscHRyICE9IHhfaGF0X21lbSkgewotICAgIGRlbGV0ZVtdIHhfaGF0X21lbTsKLSAgfQotICBpZiAobnVsbHB0ciAhPSB4X2hhdF9sdHBmKSB7Ci0gICAgZGVsZXRlW10geF9oYXRfbHRwZjsKLSAgfQotICBpZiAobnVsbHB0ciAhPSB4X2hhdF9sdHBmX21lbSkgewotICAgIGRlbGV0ZVtdIHhfaGF0X2x0cGZfbWVtOwotICB9Ci0gIGlmIChudWxscHRyICE9IGNfbnVtKSB7Ci0gICAgZGVsZXRlW10gY19udW07Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gY19kZW4pIHsKLSAgICBkZWxldGVbXSBjX2RlbjsKLSAgfQotICBpZiAobnVsbHB0ciAhPSBjX251bV9tZW0pIHsKLSAgICBkZWxldGVbXSBjX251bV9tZW07Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gY19kZW5fbWVtKSB7Ci0gICAgZGVsZXRlW10gY19kZW5fbWVtOwotICB9Ci19Ci0KLUxvbmdUZXJtUG9zdGZpbHRlciYgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpvcGVyYXRvcj0oCi0gICAgY29uc3QgTG9uZ1Rlcm1Qb3N0ZmlsdGVyJiBzcmMpIHsKLSAgLy8gVE9ETyB3ZSBzaG91bGQgYXNzZXJ0LCB0aGF0IE5GIGlzIGVxdWFsIGluIHNyYyBhbmQgKnRoaXMhCi0KLSAgbHRwZl9hY3RpdmVfcHJldiA9IHNyYy5sdHBmX2FjdGl2ZV9wcmV2OwotICBibG9ja1N0YXJ0SW5kZXggPSBzcmMuYmxvY2tTdGFydEluZGV4OwotICBwX2ludCA9IHNyYy5wX2ludDsKLSAgcF9mciA9IHNyYy5wX2ZyOwotICBwX2ludF9tZW0gPSBzcmMucF9pbnRfbWVtOwotICBwX2ZyX21lbSA9IHNyYy5wX2ZyX21lbTsKLQotICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbGMzQ29uZmlnLk5GOyBrKyspIHsKLSAgICB4X2hhdF9sdHBmaW5ba10gPSBzcmMueF9oYXRfbHRwZmluW2tdOwotICAgIHhfaGF0X21lbVtrXSA9IHNyYy54X2hhdF9tZW1ba107Ci0gICAgeF9oYXRfbWVtW2sgKyBsYzNDb25maWcuTkZdID0gc3JjLnhfaGF0X21lbVtrICsgbGMzQ29uZmlnLk5GXTsKLSAgICBpZiAobnVtTWVtQmxvY2tzID4gMikgewotICAgICAgeF9oYXRfbWVtW2sgKyBsYzNDb25maWcuTkYgKiAyXSA9IHNyYy54X2hhdF9tZW1bayArIGxjM0NvbmZpZy5ORiAqIDJdOwotICAgIH0KLSAgICB4X2hhdF9sdHBmW2tdID0gc3JjLnhfaGF0X2x0cGZba107Ci0gICAgeF9oYXRfbHRwZl9tZW1ba10gPSBzcmMueF9oYXRfbHRwZl9tZW1ba107Ci0gICAgeF9oYXRfbHRwZl9tZW1bayArIGxjM0NvbmZpZy5ORl0gPSBzcmMueF9oYXRfbHRwZl9tZW1bayArIGxjM0NvbmZpZy5ORl07Ci0gICAgaWYgKG51bU1lbUJsb2NrcyA+IDIpIHsKLSAgICAgIHhfaGF0X2x0cGZfbWVtW2sgKyBsYzNDb25maWcuTkYgKiAyXSA9Ci0gICAgICAgICAgc3JjLnhfaGF0X2x0cGZfbWVtW2sgKyBsYzNDb25maWcuTkYgKiAyXTsKLSAgICB9Ci0gIH0KLSAgZm9yICh1aW50OF90IGsgPSAwOyBrIDwgTF9udW0gKyAxOyBrKyspIHsKLSAgICBjX251bVtrXSA9IHNyYy5jX251bVtrXTsKLSAgICBjX251bV9tZW1ba10gPSBzcmMuY19udW1fbWVtW2tdOwotICB9Ci0gIGZvciAodWludDhfdCBrID0gMDsgayA8IExfZGVuICsgMTsgaysrKSB7Ci0gICAgY19kZW5ba10gPSBzcmMuY19kZW5ba107Ci0gICAgY19kZW5fbWVtW2tdID0gc3JjLmNfZGVuX21lbVtrXTsKLSAgfQotCi0gIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCBMb25nVGVybVBvc3RmaWx0ZXI6OnNldEdhaW5QYXJhbXModWludDE2X3QgbmJpdHMpIHsKLSAgdWludDE2X3QgdF9uYml0cyA9IChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQ3cDVtcykKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IHJvdW5kKG5iaXRzICogMTAgLyA3LjUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBuYml0czsKLQotICBpZiAodF9uYml0cyA8IDMyMCArIGxjM0NvbmZpZy5Gc19pbmQgKiA4MCkgewotICAgIGdhaW5fbHRwZiA9IDAuNDsKLSAgICBnYWluX2luZCA9IDA7Ci0gIH0gZWxzZSBpZiAodF9uYml0cyA8IDQwMCArIGxjM0NvbmZpZy5Gc19pbmQgKiA4MCkgewotICAgIGdhaW5fbHRwZiA9IDAuMzU7Ci0gICAgZ2Fpbl9pbmQgPSAxOwotICB9IGVsc2UgaWYgKHRfbmJpdHMgPCA0ODAgKyBsYzNDb25maWcuRnNfaW5kICogODApIHsKLSAgICBnYWluX2x0cGYgPSAwLjM7Ci0gICAgZ2Fpbl9pbmQgPSAyOwotICB9IGVsc2UgaWYgKHRfbmJpdHMgPCA1NjAgKyBsYzNDb25maWcuRnNfaW5kICogODApIHsKLSAgICBnYWluX2x0cGYgPSAwLjI1OwotICAgIGdhaW5faW5kID0gMzsKLSAgfSBlbHNlIHsKLSAgICBnYWluX2x0cGYgPSAwOwotICAgIGdhaW5faW5kID0gNDsgIC8vIGp1c3QgYSBndWVzcyBzbyBmYXIhCi0gIH0KLX0KLQotdm9pZCBMb25nVGVybVBvc3RmaWx0ZXI6OmNvbXB1dGVGaWx0ZXJDb2VmZnModWludDE2X3QgcGl0Y2hfaW5kZXgpIHsKLSAgdWludDE2X3QgcGl0Y2hfaW50OwotICBkb3VibGUgcGl0Y2hfZnI7Ci0gIGlmIChwaXRjaF9pbmRleCA+PSA0NDApIHsKLSAgICBwaXRjaF9pbnQgPSBwaXRjaF9pbmRleCAtIDI4MzsKLSAgICBwaXRjaF9mciA9IDAuMDsKLSAgfSBlbHNlIGlmIChwaXRjaF9pbmRleCA+PSAzODApIHsKLSAgICBwaXRjaF9pbnQgPSBwaXRjaF9pbmRleCAvIDIgLSA2MzsKLSAgICBwaXRjaF9mciA9IDIgKiBwaXRjaF9pbmRleCAtIDQgKiBwaXRjaF9pbnQgLSAyNTI7Ci0gIH0gZWxzZSB7Ci0gICAgcGl0Y2hfaW50ID0gcGl0Y2hfaW5kZXggLyA0ICsgMzI7Ci0gICAgcGl0Y2hfZnIgPSBwaXRjaF9pbmRleCAtIDQgKiBwaXRjaF9pbnQgKyAxMjg7Ci0gIH0KLSAgZG91YmxlIHBpdGNoID0gcGl0Y2hfaW50ICsgcGl0Y2hfZnIgLyA0OwotCi0gIGRvdWJsZSBwaXRjaF9mcyA9IHBpdGNoICogKDgwMDAgKiBjZWlsKGxjM0NvbmZpZy5GcyAvIDgwMDAuMCkgLyAxMjgwMC4wKTsKLSAgdWludDE2X3QgcF91cCA9IChwaXRjaF9mcyAqIDQpICsgMC41OwotCi0gIC8vIHVwZGF0ZSBpbmRleCBwYXJhbWV0ZXJzIGZvciBjdXJyZW50IGZyYW1lCi0gIHBfaW50ID0gcF91cCAvIDQ7Ci0gIHBfZnIgPSBwX3VwIC0gNCAqIHBfaW50OwotCi0gIGRvdWJsZSogdGFiX2x0cGZfbnVtX2ZzID0KLSAgICAgIHRhYl9sdHBmX251bV84MDAwW2dhaW5faW5kXTsgIC8vIGRlZmF1bHQgdG8gYXZvaWQgd2FybmluZ3MKLSAgZG91YmxlKiB0YWJfbHRwZl9kZW5fZnMgPQotICAgICAgdGFiX2x0cGZfZGVuXzgwMDBbcF9mcl07ICAvLyBkZWZhdWx0IHRvIGF2b2lkIHdhcm5pbmdzCi0gIHN3aXRjaCAobGMzQ29uZmlnLkZzKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgdGFiX2x0cGZfbnVtX2ZzID0gdGFiX2x0cGZfbnVtXzgwMDBbZ2Fpbl9pbmRdOwotICAgICAgdGFiX2x0cGZfZGVuX2ZzID0gdGFiX2x0cGZfZGVuXzgwMDBbcF9mcl07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgdGFiX2x0cGZfbnVtX2ZzID0gdGFiX2x0cGZfbnVtXzE2MDAwW2dhaW5faW5kXTsKLSAgICAgIHRhYl9sdHBmX2Rlbl9mcyA9IHRhYl9sdHBmX2Rlbl8xNjAwMFtwX2ZyXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQwMDA6Ci0gICAgICB0YWJfbHRwZl9udW1fZnMgPSB0YWJfbHRwZl9udW1fMjQwMDBbZ2Fpbl9pbmRdOwotICAgICAgdGFiX2x0cGZfZGVuX2ZzID0gdGFiX2x0cGZfZGVuXzI0MDAwW3BfZnJdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgIHRhYl9sdHBmX251bV9mcyA9IHRhYl9sdHBmX251bV8zMjAwMFtnYWluX2luZF07Ci0gICAgICB0YWJfbHRwZl9kZW5fZnMgPSB0YWJfbHRwZl9kZW5fMzIwMDBbcF9mcl07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ0MTAwOgotICAgIGNhc2UgNDgwMDA6Ci0gICAgICB0YWJfbHRwZl9udW1fZnMgPSB0YWJfbHRwZl9udW1fNDgwMDBbZ2Fpbl9pbmRdOwotICAgICAgdGFiX2x0cGZfZGVuX2ZzID0gdGFiX2x0cGZfZGVuXzQ4MDAwW3BfZnJdOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPD0gTF9udW07IGsrKykgewotICAgIGNfbnVtW2tdID0gMC44NSAqIGdhaW5fbHRwZiAqIHRhYl9sdHBmX251bV9mc1trXTsKLSAgfQotICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPD0gTF9kZW47IGsrKykgewotICAgIGNfZGVuW2tdID0gZ2Fpbl9sdHBmICogdGFiX2x0cGZfZGVuX2ZzW2tdOwotICB9Ci19Ci0KLXZvaWQgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpzZXRJbnB1dFgoY29uc3QgZG91YmxlKiBjb25zdCB4X2hhdCkgewotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICB4X2hhdF9sdHBmaW5bbl0gPSB4X2hhdFtuXTsKLSAgfQotfQotCi12b2lkIExvbmdUZXJtUG9zdGZpbHRlcjo6cnVuKGludDE2X3QgbHRwZl9hY3RpdmUsIGludDE2X3QgcGl0Y2hfaW5kZXgpIHsKLSAgLy8gZnVydGhlciByZWdpc3RlciB1cGRhdGVzIChtYXliZSBtb3ZlIHRvIGV4cGxpY2l0IHJlZ2lzdGVyVXBkYXRlIG1ldGhvZCkKLSAgcF9pbnRfbWVtID0gcF9pbnQ7Ci0gIHBfZnJfbWVtID0gcF9mcjsKLSAgZm9yICh1aW50OF90IGsgPSAwOyBrIDw9IExfbnVtOyBrKyspIHsKLSAgICBjX251bV9tZW1ba10gPSBjX251bVtrXTsKLSAgfQotICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPD0gTF9kZW47IGsrKykgewotICAgIGNfZGVuX21lbVtrXSA9IGNfZGVuW2tdOwotICB9Ci0KLSAgLy8gY29tcHV0ZSBuZXcgY29lZmZpY2llbnRzCi0gIGlmICgxID09IGx0cGZfYWN0aXZlKSB7Ci0gICAgY29tcHV0ZUZpbHRlckNvZWZmcyhwaXRjaF9pbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgcF9pbnQgPSAwOwotICAgIHBfZnIgPSAwOwotICAgIGZvciAodWludDhfdCBrID0gMDsgayA8PSBMX251bTsgaysrKSB7Ci0gICAgICBjX251bVtrXSA9IDA7Ci0gICAgfQotICAgIGZvciAodWludDhfdCBrID0gMDsgayA8PSBMX2RlbjsgaysrKSB7Ci0gICAgICBjX2RlbltrXSA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLy8gc3RhcnQgcHJvY2Vzc2luZyBvZiBpbnB1dCBzaWduYWwKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxjM0NvbmZpZy5ORjsgbisrKSB7Ci0gICAgeF9oYXRfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dID0geF9oYXRfbHRwZmluW25dOwotICB9Ci0gIGRvdWJsZSBub3JtID0gKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpCi0gICAgICAgICAgICAgICAgICAgID8gbGMzQ29uZmlnLk5GIC8gNAotICAgICAgICAgICAgICAgICAgICA6IGxjM0NvbmZpZy5ORiAvIDM7Ci0gIHVpbnQxNl90IHNhbXBsZTJwNW1zID0KLSAgICAgIChsYzNDb25maWcuRnMgPT0gNDQxMDApID8gNDgwMDAgLyA0MDAgOiBsYzNDb25maWcuRnMgLyA0MDA7Ci0KLSAgaWYgKCgwID09IGx0cGZfYWN0aXZlKSAmJiAoMCA9PSBsdHBmX2FjdGl2ZV9wcmV2KSkgewotICAgIC8vKioqIHRyYW5zaXRpb24gY2FzZSAxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dID0geF9oYXRfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dOwotICAgIH0KLSAgfSBlbHNlIGlmICgoMSA9PSBsdHBmX2FjdGl2ZSkgJiYgKDAgPT0gbHRwZl9hY3RpdmVfcHJldikpIHsKLSAgICAvLyoqKiB0cmFuc2l0aW9uIGNhc2UgMiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IHNhbXBsZTJwNW1zOyBuKyspIHsKLSAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dID0geF9oYXRfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dOwotICAgICAgZG91YmxlIGZpbHRPdXQgPSAwLjA7Ci0gICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfbnVtOyBrKyspIHsKLSAgICAgICAgaW50MTZfdCB4X2hhdF9pbmRleCA9IGJsb2NrU3RhcnRJbmRleCArIG4gLSBrOwotICAgICAgICBpZiAoeF9oYXRfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgeF9oYXRfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICB9Ci0gICAgICAgIGZpbHRPdXQgKz0gY19udW1ba10gKiB4X2hhdF9tZW1beF9oYXRfaW5kZXhdOwotICAgICAgfQotICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8PSBMX2RlbjsgaysrKSB7Ci0gICAgICAgIGludDE2X3QgeF9oYXRfbHRwZl9pbmRleCA9IGJsb2NrU3RhcnRJbmRleCArIG4gLSBwX2ludCArIExfZGVuIC8gMiAtIGs7Ci0gICAgICAgIGlmICh4X2hhdF9sdHBmX2luZGV4IDwgMCkgewotICAgICAgICAgIHhfaGF0X2x0cGZfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICB9Ci0gICAgICAgIGZpbHRPdXQgLT0gY19kZW5ba10gKiB4X2hhdF9sdHBmX21lbVt4X2hhdF9sdHBmX2luZGV4XTsKLSAgICAgIH0KLSAgICAgIGZpbHRPdXQgKj0gbiAvIG5vcm07Ci0gICAgICB4X2hhdF9sdHBmX21lbVtibG9ja1N0YXJ0SW5kZXggKyBuXSAtPSBmaWx0T3V0OwotICAgIH0KLQotICAgIGZvciAodWludDE2X3QgbiA9IHNhbXBsZTJwNW1zOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dID0geF9oYXRfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dOwotICAgICAgZG91YmxlIGZpbHRPdXQgPSAwLjA7Ci0gICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfbnVtOyBrKyspIHsKLSAgICAgICAgaW50MTZfdCB4X2hhdF9pbmRleCA9IGJsb2NrU3RhcnRJbmRleCArIG4gLSBrOwotICAgICAgICBpZiAoeF9oYXRfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgeF9oYXRfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICB9Ci0gICAgICAgIGZpbHRPdXQgKz0gY19udW1ba10gKiB4X2hhdF9tZW1beF9oYXRfaW5kZXhdOwotICAgICAgfQotICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8PSBMX2RlbjsgaysrKSB7Ci0gICAgICAgIGludDE2X3QgeF9oYXRfbHRwZl9pbmRleCA9Ci0gICAgICAgICAgICBibG9ja1N0YXJ0SW5kZXggKyBuIC0gcF9pbnQgKyBMX2RlbiAvIDIuMCAtIGs7Ci0gICAgICAgIGlmICh4X2hhdF9sdHBmX2luZGV4IDwgMCkgewotICAgICAgICAgIHhfaGF0X2x0cGZfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICB9Ci0gICAgICAgIGZpbHRPdXQgLT0gY19kZW5ba10gKiB4X2hhdF9sdHBmX21lbVt4X2hhdF9sdHBmX2luZGV4XTsKLSAgICAgIH0KLSAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dIC09IGZpbHRPdXQ7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAoKDAgPT0gbHRwZl9hY3RpdmUpICYmICgxID09IGx0cGZfYWN0aXZlX3ByZXYpKSB7Ci0gICAgLy8qKiogdHJhbnNpdGlvbiBjYXNlIDMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBzYW1wbGUycDVtczsgbisrKSB7Ci0gICAgICB4X2hhdF9sdHBmX21lbVtibG9ja1N0YXJ0SW5kZXggKyBuXSA9IHhfaGF0X21lbVtibG9ja1N0YXJ0SW5kZXggKyBuXTsKLSAgICAgIGRvdWJsZSBmaWx0T3V0ID0gMC4wOwotICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8PSBMX251bTsgaysrKSB7Ci0gICAgICAgIGludDE2X3QgeF9oYXRfaW5kZXggPSBibG9ja1N0YXJ0SW5kZXggKyBuIC0gazsKLSAgICAgICAgaWYgKHhfaGF0X2luZGV4IDwgMCkgewotICAgICAgICAgIHhfaGF0X2luZGV4ICs9IG51bU1lbUJsb2NrcyAqIGxjM0NvbmZpZy5ORjsKLSAgICAgICAgfQotICAgICAgICBmaWx0T3V0ICs9IGNfbnVtX21lbVtrXSAqIHhfaGF0X21lbVt4X2hhdF9pbmRleF07Ci0gICAgICB9Ci0gICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfZGVuOyBrKyspIHsKLSAgICAgICAgaW50MTZfdCB4X2hhdF9sdHBmX2luZGV4ID0KLSAgICAgICAgICAgIGJsb2NrU3RhcnRJbmRleCArIG4gLSBwX2ludF9tZW0gKyBMX2RlbiAvIDIgLSBrOwotICAgICAgICBpZiAoeF9oYXRfbHRwZl9pbmRleCA8IDApIHsKLSAgICAgICAgICB4X2hhdF9sdHBmX2luZGV4ICs9IG51bU1lbUJsb2NrcyAqIGxjM0NvbmZpZy5ORjsKLSAgICAgICAgfQotICAgICAgICBmaWx0T3V0IC09IGNfZGVuX21lbVtrXSAqIHhfaGF0X2x0cGZfbWVtW3hfaGF0X2x0cGZfaW5kZXhdOwotICAgICAgfQotICAgICAgZmlsdE91dCAqPSAxIC0gKG4gLyBub3JtKTsKLSAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dIC09IGZpbHRPdXQ7Ci0gICAgfQotCi0gICAgZm9yICh1aW50MTZfdCBuID0gc2FtcGxlMnA1bXM7IG4gPCBsYzNDb25maWcuTkY7IG4rKykgewotICAgICAgeF9oYXRfbHRwZl9tZW1bYmxvY2tTdGFydEluZGV4ICsgbl0gPSB4X2hhdF9tZW1bYmxvY2tTdGFydEluZGV4ICsgbl07Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgaWYgKChwX2ludCA9PSBwX2ludF9tZW0pICYmIChwX2ZyID09IHBfZnJfbWVtKSkgewotICAgICAgLy8qKiogdHJhbnNpdGlvbiBjYXNlIDQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxjM0NvbmZpZy5ORjsgbisrKSB7Ci0gICAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dID0geF9oYXRfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dOwotICAgICAgICBkb3VibGUgZmlsdE91dCA9IDAuMDsKLSAgICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8PSBMX251bTsgaysrKSB7Ci0gICAgICAgICAgaW50MTZfdCB4X2hhdF9pbmRleCA9IGJsb2NrU3RhcnRJbmRleCArIG4gLSBrOwotICAgICAgICAgIGlmICh4X2hhdF9pbmRleCA8IDApIHsKLSAgICAgICAgICAgIHhfaGF0X2luZGV4ICs9IG51bU1lbUJsb2NrcyAqIGxjM0NvbmZpZy5ORjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmlsdE91dCArPSBjX251bVtrXSAqIHhfaGF0X21lbVt4X2hhdF9pbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8PSBMX2RlbjsgaysrKSB7Ci0gICAgICAgICAgaW50MTZfdCB4X2hhdF9sdHBmX2luZGV4ID0KLSAgICAgICAgICAgICAgYmxvY2tTdGFydEluZGV4ICsgbiAtIHBfaW50ICsgTF9kZW4gLyAyIC0gazsKLSAgICAgICAgICBpZiAoeF9oYXRfbHRwZl9pbmRleCA8IDApIHsKLSAgICAgICAgICAgIHhfaGF0X2x0cGZfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWx0T3V0IC09IGNfZGVuW2tdICogeF9oYXRfbHRwZl9tZW1beF9oYXRfbHRwZl9pbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgeF9oYXRfbHRwZl9tZW1bYmxvY2tTdGFydEluZGV4ICsgbl0gLT0gZmlsdE91dDsKLSAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyoqKiB0cmFuc2l0aW9uIGNhc2UgNSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgc2FtcGxlMnA1bXM7IG4rKykgewotICAgICAgICB4X2hhdF9sdHBmX21lbVtibG9ja1N0YXJ0SW5kZXggKyBuXSA9IHhfaGF0X21lbVtibG9ja1N0YXJ0SW5kZXggKyBuXTsKLSAgICAgICAgZG91YmxlIGZpbHRPdXQgPSAwLjA7Ci0gICAgICAgIGZvciAodWludDE2X3QgayA9IDA7IGsgPD0gTF9udW07IGsrKykgewotICAgICAgICAgIGludDE2X3QgeF9oYXRfaW5kZXggPSBibG9ja1N0YXJ0SW5kZXggKyBuIC0gazsKLSAgICAgICAgICBpZiAoeF9oYXRfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB4X2hhdF9pbmRleCArPSBudW1NZW1CbG9ja3MgKiBsYzNDb25maWcuTkY7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpbHRPdXQgKz0gY19udW1fbWVtW2tdICogeF9oYXRfbWVtW3hfaGF0X2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfZGVuOyBrKyspIHsKLSAgICAgICAgICBpbnQxNl90IHhfaGF0X2x0cGZfaW5kZXggPQotICAgICAgICAgICAgICBibG9ja1N0YXJ0SW5kZXggKyBuIC0gcF9pbnRfbWVtICsgTF9kZW4gLyAyIC0gazsKLSAgICAgICAgICBpZiAoeF9oYXRfbHRwZl9pbmRleCA8IDApIHsKLSAgICAgICAgICAgIHhfaGF0X2x0cGZfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWx0T3V0IC09IGNfZGVuX21lbVtrXSAqIHhfaGF0X2x0cGZfbWVtW3hfaGF0X2x0cGZfaW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIGZpbHRPdXQgKj0gMSAtIChuIC8gbm9ybSk7Ci0gICAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dIC09IGZpbHRPdXQ7Ci0gICAgICB9Ci0KLSAgICAgIGRvdWJsZSB4X2hhdF9sdHBmX3RlbXBbbnVtTWVtQmxvY2tzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMzQ29uZmlnLk5GXTsgIC8vIGlzIGl0IGdvb2QgdG8gcGxhY2Ugc3VjaCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgb24gdGhlIHN0YWNrPwotICAgICAgZm9yIChpbnQxNl90IG0gPSAtTF9udW07IG0gPCBub3JtOyBtKyspIHsKLSAgICAgICAgaW50MTZfdCBpZHggPSBibG9ja1N0YXJ0SW5kZXggKyBtOwotICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgIGlkeCArPSBudW1NZW1CbG9ja3MgKiBsYzNDb25maWcuTkY7Ci0gICAgICAgIH0KLSAgICAgICAgeF9oYXRfbHRwZl90ZW1wW2lkeF0gPSB4X2hhdF9sdHBmX21lbVtpZHhdOwotICAgICAgfQotCi0gICAgICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgc2FtcGxlMnA1bXM7IG4rKykgewotICAgICAgICB4X2hhdF9sdHBmX21lbVtibG9ja1N0YXJ0SW5kZXggKyBuXSA9Ci0gICAgICAgICAgICB4X2hhdF9sdHBmX3RlbXBbYmxvY2tTdGFydEluZGV4ICsgbl07Ci0gICAgICAgIGRvdWJsZSBmaWx0T3V0ID0gMC4wOwotICAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfbnVtOyBrKyspIHsKLSAgICAgICAgICBpbnQxNl90IHhfaGF0X2luZGV4ID0gYmxvY2tTdGFydEluZGV4ICsgbiAtIGs7Ci0gICAgICAgICAgaWYgKHhfaGF0X2luZGV4IDwgMCkgewotICAgICAgICAgICAgeF9oYXRfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWx0T3V0ICs9IGNfbnVtW2tdICogeF9oYXRfbHRwZl90ZW1wW3hfaGF0X2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfZGVuOyBrKyspIHsKLSAgICAgICAgICBpbnQxNl90IHhfaGF0X2x0cGZfaW5kZXggPQotICAgICAgICAgICAgICBibG9ja1N0YXJ0SW5kZXggKyBuIC0gcF9pbnQgKyBMX2RlbiAvIDIgLSBrOwotICAgICAgICAgIGlmICh4X2hhdF9sdHBmX2luZGV4IDwgMCkgewotICAgICAgICAgICAgeF9oYXRfbHRwZl9pbmRleCArPSBudW1NZW1CbG9ja3MgKiBsYzNDb25maWcuTkY7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpbHRPdXQgLT0gY19kZW5ba10gKiB4X2hhdF9sdHBmX21lbVt4X2hhdF9sdHBmX2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBmaWx0T3V0ICo9IChuIC8gbm9ybSk7Ci0gICAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dIC09IGZpbHRPdXQ7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAodWludDE2X3QgbiA9IHNhbXBsZTJwNW1zOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICAgICAgeF9oYXRfbHRwZl9tZW1bYmxvY2tTdGFydEluZGV4ICsgbl0gPSB4X2hhdF9tZW1bYmxvY2tTdGFydEluZGV4ICsgbl07Ci0gICAgICAgIGRvdWJsZSBmaWx0T3V0ID0gMC4wOwotICAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfbnVtOyBrKyspIHsKLSAgICAgICAgICBpbnQxNl90IHhfaGF0X2luZGV4ID0gYmxvY2tTdGFydEluZGV4ICsgbiAtIGs7Ci0gICAgICAgICAgaWYgKHhfaGF0X2luZGV4IDwgMCkgewotICAgICAgICAgICAgeF9oYXRfaW5kZXggKz0gbnVtTWVtQmxvY2tzICogbGMzQ29uZmlnLk5GOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWx0T3V0ICs9IGNfbnVtW2tdICogeF9oYXRfbWVtW3hfaGF0X2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDw9IExfZGVuOyBrKyspIHsKLSAgICAgICAgICBpbnQxNl90IHhfaGF0X2x0cGZfaW5kZXggPQotICAgICAgICAgICAgICBibG9ja1N0YXJ0SW5kZXggKyBuIC0gcF9pbnQgKyBMX2RlbiAvIDIuMCAtIGs7Ci0gICAgICAgICAgaWYgKHhfaGF0X2x0cGZfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB4X2hhdF9sdHBmX2luZGV4ICs9IG51bU1lbUJsb2NrcyAqIGxjM0NvbmZpZy5ORjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmlsdE91dCAtPSBjX2RlbltrXSAqIHhfaGF0X2x0cGZfbWVtW3hfaGF0X2x0cGZfaW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIHhfaGF0X2x0cGZfbWVtW2Jsb2NrU3RhcnRJbmRleCArIG5dIC09IGZpbHRPdXQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gY29weSB0byBvdXRwdXQgeF9oYXRfbHRwZgotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICB4X2hhdF9sdHBmW25dID0geF9oYXRfbHRwZl9tZW1bYmxvY2tTdGFydEluZGV4ICsgbl07Ci0gIH0KLQotICAvLyBpbmNyZW1lbnQgY3VycmVudCBibG9jayBpbiBibG9jay1yaW5nYnVmZmVyCi0gIGJsb2NrU3RhcnRJbmRleCArPSBsYzNDb25maWcuTkY7Ci0gIGlmIChibG9ja1N0YXJ0SW5kZXggPiAobnVtTWVtQmxvY2tzIC0gMSkgKiBsYzNDb25maWcuTkYpIHsKLSAgICBibG9ja1N0YXJ0SW5kZXggPSAwOwotICB9Ci0KLSAgLy8gcmVnaXN0ZXIgdXBkYXRlcwotICBsdHBmX2FjdGl2ZV9wcmV2ID0gbHRwZl9hY3RpdmU7Ci19Ci0KLXZvaWQgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKSB7Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfaGF0X2x0cGZpbiIsIHhfaGF0X2x0cGZpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiBsYzNDb25maWcuTkYpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgieF9oYXRfbHRwZiIsIHhfaGF0X2x0cGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogbGMzQ29uZmlnLk5GKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfaGF0X2x0cGZfbWVtIiwgeF9oYXRfbHRwZl9tZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogbGMzQ29uZmlnLk5GICogbnVtTWVtQmxvY2tzKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfaGF0X21lbSIsIHhfaGF0X21lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiBsYzNDb25maWcuTkYgKiBudW1NZW1CbG9ja3MpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiY19udW0iLCBjX251bSwgc2l6ZW9mKGRvdWJsZSkgKiAoTF9udW0gKyAxKSk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJjX2RlbiIsIGNfZGVuLCBzaXplb2YoZG91YmxlKSAqIChMX2RlbiArIDEpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoImNfbnVtX21lbSIsIGNfbnVtX21lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiAoTF9udW0gKyAxKSk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJjX2Rlbl9tZW0iLCBjX2Rlbl9tZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogKExfZGVuICsgMSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgicF9pbnQiLCAmcF9pbnQsIHNpemVvZihwX2ludCkpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9Mb25nVGVybVBvc3RmaWx0ZXIuaHBwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL0xvbmdUZXJtUG9zdGZpbHRlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWIzMWEuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL0xvbmdUZXJtUG9zdGZpbHRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIExPTkdfVEVSTV9QT1NURklMVEVSX0hfCi0jZGVmaW5lIExPTkdfVEVSTV9QT1NURklMVEVSX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLWNsYXNzIExvbmdUZXJtUG9zdGZpbHRlciB7Ci0gcHVibGljOgotICBMb25nVGVybVBvc3RmaWx0ZXIoY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWdfLCB1aW50MTZfdCBuYml0cyk7Ci0gIH5Mb25nVGVybVBvc3RmaWx0ZXIoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpOwotCi0gIExvbmdUZXJtUG9zdGZpbHRlciYgb3BlcmF0b3I9KGNvbnN0IExvbmdUZXJtUG9zdGZpbHRlciYpOwotCi0gIHZvaWQgc2V0SW5wdXRYKGNvbnN0IGRvdWJsZSogY29uc3QgeF9oYXQpOwotICB2b2lkIHJ1bihpbnQxNl90IGx0cGZfYWN0aXZlLCBpbnQxNl90IHBpdGNoX2luZGV4KTsKLQotICBjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZzsKLSAgY29uc3QgdWludDhfdCBudW1NZW1CbG9ja3M7Ci0gIGRvdWJsZSogeF9oYXRfbHRwZjsKLQotIHByaXZhdGU6Ci0gIHZvaWQgc2V0R2FpblBhcmFtcyh1aW50MTZfdCBuYml0cyk7Ci0gIHZvaWQgY29tcHV0ZUZpbHRlckNvZWZmcyh1aW50MTZfdCBwaXRjaF9pbmRleCk7Ci0KLSAgaW50MTZfdCBsdHBmX2FjdGl2ZV9wcmV2OwotICB1aW50MTZfdCBibG9ja1N0YXJ0SW5kZXg7Ci0gIGRvdWJsZSogY19udW07Ci0gIGRvdWJsZSogY19kZW47Ci0gIGRvdWJsZSogY19udW1fbWVtOwotICBkb3VibGUqIGNfZGVuX21lbTsKLSAgZG91YmxlKiB4X2hhdF9sdHBmaW47Ci0gIGRvdWJsZSogeF9oYXRfbWVtOwotICBkb3VibGUqIHhfaGF0X2x0cGZfbWVtOwotCi0gIHVpbnQ4X3QgTF9udW07Ci0gIHVpbnQ4X3QgTF9kZW47Ci0KLSAgZG91YmxlIGdhaW5fbHRwZjsKLSAgdWludDhfdCBnYWluX2luZDsKLQotICB1aW50MTZfdCBwX2ludDsKLSAgdWludDE2X3QgcF9mcjsKLSAgdWludDE2X3QgcF9pbnRfbWVtOwotICB1aW50MTZfdCBwX2ZyX21lbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKLQotI2VuZGlmICAvLyBMT05HX1RFUk1fUE9TVEZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9EZWNvZGVyL01QVlEuY3BwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL01QVlEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTNkNGQ2Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9NUFZRLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogTVBWUS5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIk1QVlEuaHBwIgotCi0jaW5jbHVkZSA8Y3N0ZGJvb2w+Ci0KLSNpbmNsdWRlICJTbnNRdWFudGl6YXRpb25UYWJsZXMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotLy8gZGVjbGFyZSBsb2NhbCBoZWxwZXIgZnVuY3Rpb25zCi12b2lkIG1pbmQydmVjX3RhYihzaG9ydCBkaW1faW4sICAgICAgICAgICAgICAgICAgIC8qIGk6IGRpbWVuc2lvbiAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQga19tYXhfbG9jYWwsICAgICAgICAgICAgICAvKiBpOiBuYiB1bml0IHB1bHNlcyAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQgbGVhZGluZ19zaWduLCAgICAgICAgICAgICAvKiBpOiBsZWFkaW5nIHNpZ24gKi8KLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmQsICAgICAgICAgICAgICAgLyogaTogTVBWUS1pbmRleCAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQqIHZlY19vdXQsICAgICAgICAgICAgICAgICAvKiBvOiBwdWxzZSB0cmFpbiAqLwotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IE1QVlFfb2Zmc2V0c1tdWzExXSAvKiBpOiBvZmZzZXQgbWF0cml4ICovCi0pOwotCi12b2lkIG1pbmQydmVjX29uZShzaG9ydCBrX3ZhbF9pbiwgICAgIC8qIGk6IG5iIHVuaXQgcHVsc2VzICovCi0gICAgICAgICAgICAgICAgICBzaG9ydCBsZWFkaW5nX3NpZ24sIC8qIGk6IGxlYWRpbmcgc2lnbiAtMSwgMSAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQqIHZlY19vdXQgICAgICAvKiBvOiB1cGRhdGVkIHB1bHNlIHRyYWluICovCi0pOwotCi1zaG9ydCBzZXR2YWxfdXBkYXRlX3NpZ24oc2hvcnQga19kZWx0YSwgICAgICAgIC8qIGkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBrX21heF9sb2NhbF9pbiwgLyogaSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0KiBsZWFkaW5nX3NpZ24sICAvKiBpL28gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIGluZF9pbiwgLyogaS9vICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQqIHZlY19vdXQgICAgICAgIC8qIGkvbyAqLwotKTsKLQotc2hvcnQgZ2V0X2xlYWRfc2lnbih1bnNpZ25lZCBpbnQqIGluZF9pbik7Ci0KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbgotLy8KLQotdm9pZCBNUFZRZGVlbnVtKHVpbnQ4X3QgZGltX2luLCAgIC8qIGkgOiBkaW1lbnNpb24gb2YgdmVjX291dCAqLwotICAgICAgICAgICAgICAgIHVpbnQ4X3Qga192YWxfaW4sIC8qIGkgOiBudW1iZXIgb2YgdW5pdCBwdWxzZXMgKi8KLSAgICAgICAgICAgICAgICBpbnQxNl90IExTX2luZCwgICAvKiBpIDogbGVhZGluZyBzaWduIGluZGV4ICovCi0gICAgICAgICAgICAgICAgaW50MzJfdCBNUFZRX2luZCwgLyogaSA6IE1QVlEgc2hhcGUgaW5kZXggKi8KLSAgICAgICAgICAgICAgICBpbnQxNl90KiB2ZWNfb3V0ICAvKiBvIDogUFZRIGludGVnZXIgcHVsc2UgdHJhaW4gKi8KLSkgewotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBkaW1faW47IGkrKykgewotICAgIHZlY19vdXRbaV0gPSAwOwotICB9Ci0gIHNob3J0IGxlYWRpbmdfc2lnbiA9IDE7Ci0gIGlmIChMU19pbmQgIT0gMCkgewotICAgIGxlYWRpbmdfc2lnbiA9IC0xOwotICB9Ci0gIG1pbmQydmVjX3RhYihkaW1faW4sIGtfdmFsX2luLCBsZWFkaW5nX3NpZ24sIE1QVlFfaW5kLCB2ZWNfb3V0LCBNUFZRX29mZnNldHMpOwotfQotCi12b2lkIG1pbmQydmVjX3RhYihzaG9ydCBkaW1faW4sICAgICAgICAgICAgICAgICAgIC8qIGk6IGRpbWVuc2lvbiAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQga19tYXhfbG9jYWwsICAgICAgICAgICAgICAvKiBpOiBuYiB1bml0IHB1bHNlcyAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQgbGVhZGluZ19zaWduLCAgICAgICAgICAgICAvKiBpOiBsZWFkaW5nIHNpZ24gKi8KLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmQsICAgICAgICAgICAgICAgLyogaTogTVBWUS1pbmRleCAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQqIHZlY19vdXQsICAgICAgICAgICAgICAgICAvKiBvOiBwdWxzZSB0cmFpbiAqLwotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IE1QVlFfb2Zmc2V0c1tdWzExXSAvKiBpOiBvZmZzZXQgbWF0cml4ICovCi0pIHsKLSAgLyogaW5pdCAqLwotICB1bnNpZ25lZCBpbnQqIGhfcm93X3B0ciA9ICYoTVBWUV9vZmZzZXRzWyhkaW1faW4gLSAxKV1bMF0pOwotICBzaG9ydCBrX2FjYyA9IGtfbWF4X2xvY2FsOwotICAvKiBsb29wIG92ZXIgcG9zaXRpb25zICovCi0gIGZvciAodWludDhfdCBwb3MgPSAwOyBwb3MgPCBkaW1faW47IHBvcysrKSB7Ci0gICAgc2hvcnQga19kZWx0YTsKLSAgICBpZiAoaW5kICE9IDApIHsKLSAgICAgIGtfYWNjID0ga19tYXhfbG9jYWw7Ci0gICAgICA7Ci0gICAgICB1bnNpZ25lZCBpbnQgVUxfdG1wX29mZnNldCA9IGhfcm93X3B0cltrX2FjY107Ci0gICAgICBib29sIHdyYXBfZmxhZyA9IChpbmQgPCBVTF90bXBfb2Zmc2V0KTsKLSAgICAgIHVuc2lnbmVkIGludCBVTF9kaWZmID0gMDsKLSAgICAgIGlmICghd3JhcF9mbGFnKSB7Ci0gICAgICAgIC8vIE5vdGU6IGR1ZSB0byBhbmRyb2lkIGJ1aWxkIHVzaW5nIGEgaW50ZWdlci1vdmVyZmxvdyBzYW5pdGl6ZXIsIHdlCi0gICAgICAgIC8vIGhhdmUgdG8gYXZvaWQKLSAgICAgICAgLy8gICAgICAgY29tcHV0aW5nIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZSB3aGVuIGluZCA8IFVMX3RtcF9vZmZzZXQKLSAgICAgICAgVUxfZGlmZiA9IGluZCAtIFVMX3RtcF9vZmZzZXQ7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAod3JhcF9mbGFnKSB7Ci0gICAgICAgIGtfYWNjLS07Ci0gICAgICAgIHdyYXBfZmxhZyA9IChpbmQgPCBoX3Jvd19wdHJba19hY2NdKTsKLSAgICAgICAgaWYgKCF3cmFwX2ZsYWcpIHsKLSAgICAgICAgICAvLyBOb3RlOiBkdWUgdG8gYW5kcm9pZCBidWlsZCB1c2luZyBhIGludGVnZXItb3ZlcmZsb3cgc2FuaXRpemVyLCB3ZQotICAgICAgICAgIC8vIGhhdmUgdG8gYXZvaWQKLSAgICAgICAgICAvLyAgICAgICBjb21wdXRpbmcgdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlIHdoZW4gaW5kIDwgVUxfdG1wX29mZnNldAotICAgICAgICAgIFVMX2RpZmYgPSBpbmQgLSBoX3Jvd19wdHJba19hY2NdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmQgPSBVTF9kaWZmOwotICAgICAga19kZWx0YSA9IGtfbWF4X2xvY2FsIC0ga19hY2M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1pbmQydmVjX29uZShrX21heF9sb2NhbCwgbGVhZGluZ19zaWduLCAmdmVjX291dFtwb3NdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBrX21heF9sb2NhbCA9IHNldHZhbF91cGRhdGVfc2lnbihrX2RlbHRhLCBrX21heF9sb2NhbCwgJmxlYWRpbmdfc2lnbiwgJmluZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVjX291dFtwb3NdKTsKLSAgICBoX3Jvd19wdHIgLT0gMTE7IC8qIHJlZHVjZSBkaW1lbnNpb24gaW4gTVBWUV9vZmZzZXRzIHRhYmxlICovCi0gIH0KLX0KLQotdm9pZCBtaW5kMnZlY19vbmUoc2hvcnQga192YWxfaW4sICAgICAvKiBpOiBuYiB1bml0IHB1bHNlcyAqLwotICAgICAgICAgICAgICAgICAgc2hvcnQgbGVhZGluZ19zaWduLCAvKiBpOiBsZWFkaW5nIHNpZ24gLTEsIDEgKi8KLSAgICAgICAgICAgICAgICAgIHNob3J0KiB2ZWNfb3V0ICAgICAgLyogbzogdXBkYXRlZCBwdWxzZSB0cmFpbiAqLwotKSB7Ci0gIHNob3J0IGFtcCA9IGtfdmFsX2luOwotICBpZiAobGVhZGluZ19zaWduIDwgMCkgewotICAgIGFtcCA9IC1rX3ZhbF9pbjsKLSAgfQotICAqdmVjX291dCA9IGFtcDsKLX0KLQotc2hvcnQgc2V0dmFsX3VwZGF0ZV9zaWduKAotICAgIHNob3J0IGtfZGVsdGEsICAgICAgICAvKiBpICovCi0gICAgc2hvcnQga19tYXhfbG9jYWxfaW4sIC8qIGkgKi8KLSAgICBzaG9ydCogbGVhZGluZ19zaWduLCAgLyogaS9vICovCi0gICAgdW5zaWduZWQgaW50KiBpbmRfaW4sIC8qIGkvbzsgbmVlZGVkIHRvIGNoYW5nZSB0eXBlIGNvbXBhcmVkIHRvIHNwZWMgKi8KLSAgICBzaG9ydCogdmVjX291dCAgICAgICAgLyogaS9vICovCi0pIHsKLSAgc2hvcnQga19tYXhfbG9jYWxfb3V0ID0ga19tYXhfbG9jYWxfaW47Ci0gIGlmIChrX2RlbHRhICE9IDApIHsKLSAgICBtaW5kMnZlY19vbmUoa19kZWx0YSwgKmxlYWRpbmdfc2lnbiwgdmVjX291dCk7Ci0gICAgKmxlYWRpbmdfc2lnbiA9IGdldF9sZWFkX3NpZ24oaW5kX2luKTsKLSAgICBrX21heF9sb2NhbF9vdXQgLT0ga19kZWx0YTsKLSAgfQotICByZXR1cm4ga19tYXhfbG9jYWxfb3V0OwotfQotCi1zaG9ydCBnZXRfbGVhZF9zaWduKAotICAgIHVuc2lnbmVkIGludCogaW5kKSAgLy8gcmVuYW1lZCAiaW5kX2luIiBmcm9tIHNwZWMgdG8ganVzdCAiaW5kIiAoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYnkgeWFvLndhbmcgMjguMDYuMjAxOSkKLXsKLSAgc2hvcnQgbGVhZGluZ19zaWduID0gKzE7Ci0gIGlmICgoKCppbmQpICYgMHgxKSAhPSAwKSB7Ci0gICAgbGVhZGluZ19zaWduID0gLTE7Ci0gIH0KLSAgKCppbmQpID0gKCppbmQgPj4gMSk7Ci0gIHJldHVybiBsZWFkaW5nX3NpZ247Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9NUFZRLmhwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9NUFZRLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxNWQ2NS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0RlY29kZXIvTVBWUS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTVBWUS5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX01QVlFfSFBQXwotI2RlZmluZSBfX01QVlFfSFBQXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLXZvaWQgTVBWUWRlZW51bSh1aW50OF90IGRpbV9pbiwgICAvKiBpIDogZGltZW5zaW9uIG9mIHZlY19vdXQgKi8KLSAgICAgICAgICAgICAgICB1aW50OF90IGtfdmFsX2luLCAvKiBpIDogbnVtYmVyIG9mIHVuaXQgcHVsc2VzICovCi0gICAgICAgICAgICAgICAgaW50MTZfdCBMU19pbmQsICAgLyogaSA6IGxlYWRpbmcgc2lnbiBpbmRleCAqLwotICAgICAgICAgICAgICAgIGludDMyX3QgTVBWUV9pbmQsIC8qIGkgOiBNUFZRIHNoYXBlIGluZGV4ICovCi0gICAgICAgICAgICAgICAgaW50MTZfdCogdmVjX291dCAgLyogbyA6IFBWUSBpbnRlZ2VyIHB1bHNlIHRyYWluICovCi0pOwotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCi0KLSNlbmRpZiAgLy8gX19NUFZRX0hQUF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9NZGN0RGVjLmNwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9NZGN0RGVjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1NmI1ZC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0RlY29kZXIvTWRjdERlYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIE1kY3REZWMuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNZGN0RGVjLmhwcCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiTWRjdFdpbmRvd3MuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotTWRjdERlYzo6TWRjdERlYyhjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18pCi0gICAgOiBsYzNDb25maWcobGMzQ29uZmlnXyksCi0gICAgICB4X2hhdF9tZGN0KG51bGxwdHIpLAotICAgICAgZGN0SVZEYmwobGMzQ29uZmlnLk5GKSwKLSAgICAgIG1lbV9vbGFfYWRkKG51bGxwdHIpLAotICAgICAgdF9oYXRfbWRjdChudWxscHRyKSwKLSAgICAgIHdOKG51bGxwdHIpIHsKLSAgbWVtX29sYV9hZGQgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORiAtIGxjM0NvbmZpZy5aXTsKLSAgdF9oYXRfbWRjdCA9IG5ldyBkb3VibGVbMiAqIGxjM0NvbmZpZy5ORl07Ci0gIHhfaGF0X21kY3QgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORl07Ci0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCAobGMzQ29uZmlnLk5GIC0gbGMzQ29uZmlnLlopOyBuKyspIHsKLSAgICBtZW1fb2xhX2FkZFtuXSA9IDA7Ci0gIH0KLQotICAvLyBOb3RlOiB3ZSBkbyBub3QgYWRkIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBlcnJvciBjaGVja2luZyBhdCB0aGlzIGxldmVsLgotICAvLyAgIFdlIGFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm9yIHByb2Nlc3Npbmcgd2l0aCBpbnZhbGlkIGNvbmZpZ3VyYXRpb24sCi0gIC8vICAgdGh1cyBub25zZW5zZSByZXN1bHRzIGZvciBpbnZhbGlkIGxjM0NvbmZpZy5OX21zIGFuZC9vciBsYzNDb25maWcuRnNfaW5kCi0gIC8vICAgYXJlIGFjY2VwdGVkIGhlcmUuCi0gIHdOID0gd19OODA7ICAvLyBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIHdhcm5pbmdzCi0gIGlmIChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQ3cDVtcykgewotICAgIHN3aXRjaCAobGMzQ29uZmlnLk5GKSB7Ci0gICAgICBjYXNlIDYwOgotICAgICAgICB3TiA9IHdfTjYwXzdwNW1zOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTIwOgotICAgICAgICB3TiA9IHdfTjEyMF83cDVtczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE4MDoKLSAgICAgICAgd04gPSB3X04xODBfN3A1bXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyNDA6Ci0gICAgICAgIHdOID0gd19OMjQwXzdwNW1zOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzYwOgotICAgICAgICB3TiA9IHdfTjM2MF83cDVtczsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMgKGFuZCBvdGhlciBhcyBmYWxsYmFjaykKLSAgICBzd2l0Y2ggKGxjM0NvbmZpZy5ORikgewotICAgICAgY2FzZSA4MDoKLSAgICAgICAgd04gPSB3X044MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE2MDoKLSAgICAgICAgd04gPSB3X04xNjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyNDA6Ci0gICAgICAgIHdOID0gd19OMjQwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzIwOgotICAgICAgICB3TiA9IHdfTjMyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ4MDoKLSAgICAgICAgd04gPSB3X040ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1NZGN0RGVjOjp+TWRjdERlYygpIHsKLSAgaWYgKG51bGxwdHIgIT0gbWVtX29sYV9hZGQpIHsKLSAgICBkZWxldGVbXSBtZW1fb2xhX2FkZDsKLSAgfQotICBpZiAobnVsbHB0ciAhPSB0X2hhdF9tZGN0KSB7Ci0gICAgZGVsZXRlW10gdF9oYXRfbWRjdDsKLSAgfQotICBpZiAobnVsbHB0ciAhPSB4X2hhdF9tZGN0KSB7Ci0gICAgZGVsZXRlW10geF9oYXRfbWRjdDsKLSAgfQotfQotCi12b2lkIE1kY3REZWM6Ok1kY3RJbnZGYXN0RGJsKCkgewotICBkY3RJVkRibC5ydW4oKTsKLQotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICB0X2hhdF9tZGN0W25dID0gZGN0SVZEYmwub3V0W25dOwotICB9Ci0gIGZvciAodWludDE2X3QgbiA9IGxjM0NvbmZpZy5ORjsgbiA8IDIgKiBsYzNDb25maWcuTkY7IG4rKykgewotICAgIHRfaGF0X21kY3Rbbl0gPSAtZGN0SVZEYmwub3V0WzIgKiBsYzNDb25maWcuTkYgLSAxIC0gbl07Ci0gIH0KLQotICAvLyBUT0RPIHRyeSB0byBvcHRpbWl6ZSBvdXQgdGhlIG1lbS1idWZmZXIKLSAgZG91YmxlIG1lbVtsYzNDb25maWcuTkYgLyAyXTsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxjM0NvbmZpZy5ORiAvIDI7IG4rKykgewotICAgIG1lbVtuXSA9IHRfaGF0X21kY3Rbbl07Ci0gIH0KLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IDMgKiBsYzNDb25maWcuTkYgLyAyOyBuKyspIHsKLSAgICB0X2hhdF9tZGN0W25dID0gdF9oYXRfbWRjdFtuICsgbGMzQ29uZmlnLk5GIC8gMl07Ci0gIH0KLSAgZm9yICh1aW50MTZfdCBuID0gMyAqIGxjM0NvbmZpZy5ORiAvIDI7IG4gPCAyICogbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICB0X2hhdF9tZGN0W25dID0gLW1lbVtuIC0gMyAqIGxjM0NvbmZpZy5ORiAvIDJdOwotICB9Ci0KLSAgZG91YmxlIGdhaW4gPSAxLjAgLyBzcXJ0KDIuMCAqIGxjM0NvbmZpZy5ORik7Ci0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCAyICogbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICB0X2hhdF9tZGN0W25dICo9IGdhaW47Ci0gIH0KLX0KLQotdm9pZCBNZGN0RGVjOjpydW4oY29uc3QgZG91YmxlKiBjb25zdCBYX2hhdCkgewotICBpZiAoIWxjM0NvbmZpZy5pc1ZhbGlkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbGMzQ29uZmlnLk5FOyBrKyspIHsKLSAgICBkY3RJVkRibC5pbltrXSA9IFhfaGF0W2tdOwotICB9Ci0gIGZvciAodWludDE2X3QgayA9IGxjM0NvbmZpZy5ORTsgayA8IGxjM0NvbmZpZy5ORjsgaysrKSB7Ci0gICAgZGN0SVZEYmwuaW5ba10gPSAwOwotICB9Ci0KLSAgLy8gMS4gR2VuZXJhdGlvbiBvZiB0aW1lIGRvbWFpbiBhbGlhc2luZyBidWZmZXIKLSAgTWRjdEludkZhc3REYmwoKTsKLQotICAvLyAyLiBXaW5kb3dpbmcgb2YgdGltZS1hbGlhc2VkIGJ1ZmZlcgotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgMiAqIGxjM0NvbmZpZy5ORjsgbisrKSB7Ci0gICAgdF9oYXRfbWRjdFtuXSAqPSB3TlsyICogbGMzQ29uZmlnLk5GIC0gMSAtIG5dOwotICB9Ci0KLSAgLy8gMy4gQ29uZHVjdCBvdmVybGFwcC1hZGQgb3BlcmF0aW9uCi0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBsYzNDb25maWcuTkYgLSBsYzNDb25maWcuWjsgbisrKSB7Ci0gICAgeF9oYXRfbWRjdFtuXSA9IG1lbV9vbGFfYWRkW25dICsgdF9oYXRfbWRjdFtsYzNDb25maWcuWiArIG5dOwotICAgIG1lbV9vbGFfYWRkW25dID0gdF9oYXRfbWRjdFtsYzNDb25maWcuTkYgKyBsYzNDb25maWcuWiArIG5dOwotICB9Ci0gIGZvciAodWludDE2X3QgbiA9IGxjM0NvbmZpZy5ORiAtIGxjM0NvbmZpZy5aOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICB4X2hhdF9tZGN0W25dID0gdF9oYXRfbWRjdFtsYzNDb25maWcuWiArIG5dOwotICB9Ci19Ci0KLXZvaWQgTWRjdERlYzo6cmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50cykgewotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJYX2hhdF9tZGN0IiwgZGN0SVZEYmwuaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogbGMzQ29uZmlnLk5GKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInRfaGF0X21kY3QiLCB0X2hhdF9tZGN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZG91YmxlKSAqIDIgKiBsYzNDb25maWcuTkYpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibWVtX29sYV9hZGQiLCBtZW1fb2xhX2FkZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiAobGMzQ29uZmlnLk5GIC0gbGMzQ29uZmlnLlopKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfaGF0X21kY3QiLCB4X2hhdF9tZGN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZG91YmxlKSAqIGxjM0NvbmZpZy5ORik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0RlYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9EZWNvZGVyL01kY3REZWMuaHBwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL01kY3REZWMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUzYWI2Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9NZGN0RGVjLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBNZGN0RGVjLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1EQ1RfREVDX0hfCi0jZGVmaW5lIE1EQ1RfREVDX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0jaW5jbHVkZSAiRGN0SVYuaHBwIgotI2luY2x1ZGUgIkxjM0NvbmZpZy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNEZWMgewotCi1jbGFzcyBNZGN0RGVjIHsKLSBwdWJsaWM6Ci0gIE1kY3REZWMoY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWdfKTsKLSAgdmlydHVhbCB+TWRjdERlYygpOwotCi0gIHZvaWQgcmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50cyk7Ci0KLSAgdm9pZCBydW4oY29uc3QgZG91YmxlKiBjb25zdCBYX2hhdCk7Ci0KLSAgY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWc7Ci0gIGRvdWJsZSogeF9oYXRfbWRjdDsKLQotIHByaXZhdGU6Ci0gIHZvaWQgTWRjdEludkZhc3REYmwoKTsKLQotICBEY3RJVkRibCBkY3RJVkRibDsKLSAgZG91YmxlKiBtZW1fb2xhX2FkZDsKLSAgZG91YmxlKiB0X2hhdF9tZGN0OwotICBkb3VibGUqIHdOOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0RlYwotCi0jZW5kaWYgIC8vIE1EQ1RfREVDX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvUGFja2V0TG9zc0NvbmNlYWxtZW50LmNwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9QYWNrZXRMb3NzQ29uY2VhbG1lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDAzODgwLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9QYWNrZXRMb3NzQ29uY2VhbG1lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIFBhY2tldExvc3NDb25jZWFsbWVudC5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBhY2tldExvc3NDb25jZWFsbWVudC5ocHAiCi0KLW5hbWVzcGFjZSBMYzNEZWMgewotCi1QYWNrZXRMb3NzQ29uY2VhbG1lbnQ6OlBhY2tldExvc3NDb25jZWFsbWVudCh1aW50MTZfdCBORV8pCi0gICAgOiBORShORV8pLAotICAgICAgcGxjX3NlZWQoMjQ2MDcpLCAgLy8gdGhpcyBpbml0aWFsaXphdGlvbiBuZWVkIG5vdCBiZSBkb25lIGV2ZXJ5IGZyYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFyaWZpZWQgYnkgRXJyYXRhIDE1MTE0Ci0gICAgICBuYkxvc3RDbXB0KDApLAotICAgICAgYWxwaGEoMSksCi0gICAgICBYX2hhdF9sYXN0R29vZChudWxscHRyKSB7Ci0gIFhfaGF0X2xhc3RHb29kID0gbmV3IGRvdWJsZVtORV07Ci0gIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBORTsgaysrKSB7Ci0gICAgWF9oYXRfbGFzdEdvb2Rba10gPSAwLjA7Ci0gIH0KLX0KLQotUGFja2V0TG9zc0NvbmNlYWxtZW50Ojp+UGFja2V0TG9zc0NvbmNlYWxtZW50KCkgeyBkZWxldGVbXSBYX2hhdF9sYXN0R29vZDsgfQotCi12b2lkIFBhY2tldExvc3NDb25jZWFsbWVudDo6cnVuKHVpbnQ4X3QgQkVDX2RldGVjdCwgZG91YmxlKiBYX2hhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgbHRwZl9hY3RpdmUpIHsKLSAgLy8gQXBwZW5kaXggQi4gUGFja2V0IExvc3MgQ29uY2VhbG1lbnQgICAoZDA5cjAyX0YyRikKLSAgaWYgKDAgPT0gQkVDX2RldGVjdCkgewotICAgIG5iTG9zdENtcHQgPSAwOwotICAgIGFscGhhID0gMTsKLSAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgTkU7IGsrKykgewotICAgICAgWF9oYXRfbGFzdEdvb2Rba10gPSBYX2hhdFtrXTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbHRwZl9hY3RpdmUgPSAwOyAgLy8gZXJyYXRhIDE1MDk3IGltcGxlbWVudGVkCi0KLSAgICBpZiAobmJMb3N0Q21wdCA8IDB4RkYpIHsKLSAgICAgIG5iTG9zdENtcHQrKzsKLSAgICB9Ci0KLSAgICAvLyBOb3RlOiBmcm9tIChkMDlyMDJfRjJGKSBpdHMgaXMgbm90IHBlcmZlY3RseSBjbGVhciwKLSAgICAvLyAgIHdoZXRoZXIgYWxwaGEgaXMgbW9kaWZpZWQgYmVmb3JlIG9yIGFmdGVyIGFwcGx5aW5nCi0gICAgLy8gICBpdCB0byB0aGUgc3BlY3RydW0gLT4gd2UgbWF5IGhhdmUgdG8gY2hlY2sgdGhlCi0gICAgLy8gICBnaXZlbiBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBMQzMuZXhlIHJlZmVyZW5jZQotICAgIGlmIChuYkxvc3RDbXB0ID49IDgpIHsKLSAgICAgIGFscGhhID0gMC44NSAqIGFscGhhOwotICAgIH0gZWxzZSBpZiAobmJMb3N0Q21wdCA+PSA0KSB7Ci0gICAgICBhbHBoYSA9IDAuOSAqIGFscGhhOwotICAgIH0KLQotICAgIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBORTsgaysrKSB7Ci0gICAgICBwbGNfc2VlZCA9ICgxNjgzMSArIHBsY19zZWVkICogMTI4MjEpICYgMHhGRkZGOwotICAgICAgaWYgKHBsY19zZWVkIDwgMHg4MDAwKSB7Ci0gICAgICAgIFhfaGF0W2tdID0gYWxwaGEgKiBYX2hhdF9sYXN0R29vZFtrXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFhfaGF0W2tdID0gLWFscGhhICogWF9oYXRfbGFzdEdvb2Rba107Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUGFja2V0TG9zc0NvbmNlYWxtZW50OjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKSB7Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIlhfaGF0X2xhc3RHb29kIiwgJlhfaGF0X2xhc3RHb29kWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZG91YmxlKSAqIE5FKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvUGFja2V0TG9zc0NvbmNlYWxtZW50LmhwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9QYWNrZXRMb3NzQ29uY2VhbG1lbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ViMDY3Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9QYWNrZXRMb3NzQ29uY2VhbG1lbnQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIFBhY2tldExvc3NDb25jZWFsbWVudC5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQQUNLRVRfTE9TU19DT05DRUFMTUVOVF9IXwotI2RlZmluZSBQQUNLRVRfTE9TU19DT05DRUFMTUVOVF9IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotY2xhc3MgUGFja2V0TG9zc0NvbmNlYWxtZW50IHsKLSBwdWJsaWM6Ci0gIFBhY2tldExvc3NDb25jZWFsbWVudCh1aW50MTZfdCBORV8pOwotICB2aXJ0dWFsIH5QYWNrZXRMb3NzQ29uY2VhbG1lbnQoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpOwotCi0gIHZvaWQgcnVuKHVpbnQ4X3QgQkVSX0RFVEVDVCwgZG91YmxlKiBYX2hhdCwgaW50MTZfdCYgbHRwZl9hY3RpdmUpOwotCi0gIGNvbnN0IHVpbnQxNl90IE5FOwotCi0gcHJpdmF0ZToKLSAgdWludDE2X3QgcGxjX3NlZWQ7Ci0gIHVpbnQ4X3QgbmJMb3N0Q21wdDsKLSAgZG91YmxlIGFscGhhOwotICBkb3VibGUqIFhfaGF0X2xhc3RHb29kOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0RlYwotCi0jZW5kaWYgIC8vIFBBQ0tFVF9MT1NTX0NPTkNFQUxNRU5UX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvUmVzaWR1YWxTcGVjdHJ1bS5jcHAgYi9lbWJkcnYvbGMzL0RlY29kZXIvUmVzaWR1YWxTcGVjdHJ1bS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDUzYWQuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL1Jlc2lkdWFsU3BlY3RydW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBSZXNpZHVhbFNwZWN0cnVtLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUmVzaWR1YWxTcGVjdHJ1bS5ocHAiCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIkJpdFJlYWRlci5ocHAiCi0KLW5hbWVzcGFjZSBMYzNEZWMgewotCi1SZXNpZHVhbFNwZWN0cnVtOjpSZXNpZHVhbFNwZWN0cnVtKHVpbnQxNl90IE5FXykKLSAgICA6IE5FKE5FXyksIFhfaGF0X3FfcmVzaWR1YWwobnVsbHB0ciksIG5SZXNCaXRzKDApIHsKLSAgWF9oYXRfcV9yZXNpZHVhbCA9IG5ldyBkb3VibGVbTkVdOwotfQotCi1SZXNpZHVhbFNwZWN0cnVtOjp+UmVzaWR1YWxTcGVjdHJ1bSgpIHsgZGVsZXRlW10gWF9oYXRfcV9yZXNpZHVhbDsgfQotCi12b2lkIFJlc2lkdWFsU3BlY3RydW06OnJ1bigKLSAgICBjb25zdCB1aW50OF90KiBieXRlcywgdWludDE2X3QmIGJwX3NpZGUsIHVpbnQ4X3QmIG1hc2tfc2lkZSwKLSAgICBjb25zdCB1aW50MTZfdCBsYXN0bnosIGNvbnN0IGludDE2X3QqIGNvbnN0IFhfaGF0X3FfYXJpLAotICAgIHVpbnQxNl90IGNvbnN0IG5iaXRzX3Jlc2lkdWFsLCAgLy8gdGhlIGNvbnN0IGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRodXMgbm90IHJlcGVhdGVkIGluIGhlYWRlciBkZWNsYXJhdGlvbgotICAgIHVpbnQ4X3QqIHNhdmVfbGV2LCBjb25zdCB1aW50OF90JiBsc2JNb2RlLCB1aW50MTZfdCYgbmZfc2VlZCwKLSAgICB1aW50MTZfdCYgemVyb0ZyYW1lLCBjb25zdCBpbnQxNl90IGdnX2luZCwgaW50MTZfdCBGX05GKSB7Ci0gIC8vIDMuNC4yLjYgUmVzaWR1YWwgZGF0YSBhbmQgZmluYWxpemF0aW9uIChkMDlyMDJfRjJGKQotICAvKiBEZWNvZGUgcmVzaWR1YWwgYml0cyAqLwotICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbGFzdG56OyBrKyspIHsKLSAgICBYX2hhdF9xX3Jlc2lkdWFsW2tdID0gWF9oYXRfcV9hcmlba107Ci0gIH0KLSAgLy8gZm9yIChrID0gbGFzdG56OyBrIDwg8J2RgfCdkLg7IGsrKykKLSAgZm9yICh1aW50MTZfdCBrID0gbGFzdG56OyBrIDwgTkU7IGsrKykgewotICAgIC8v8J2Ri/CdkZ4gzIJba10gPSAwOwotICAgIFhfaGF0X3FfcmVzaWR1YWxba10gPSAwOwotICB9Ci0gIHVpbnQ4X3QgcmVzQml0c1tuYml0c19yZXNpZHVhbF07Ci0gIHVpbnQxNl90IHJlbWFpbmluZ19uYml0c19yZXNpZHVhbCA9Ci0gICAgICBuYml0c19yZXNpZHVhbDsgIC8vIGNoYW5nZWQgcmVsYXRpdmUgdG8gc3BlY2lmaWNhdGlvbiB0byBlbnN1cmUgY29uc3QKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgaW50byBhcnJheSBhbGxvY2F0aW9uCi0gIG5SZXNCaXRzID0gMDsKLSAgaWYgKGxzYk1vZGUgPT0gMCkgewotICAgIC8vIGZvciAoayA9IDA7IGsgPCDwnZGB8J2QuDsgaysrKQotICAgIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBORTsgaysrKSB7Ci0gICAgICAvLyBpZiAo8J2Ri/CdkZ4gzIJba10gIT0gMCkKLSAgICAgIGlmIChYX2hhdF9xX3Jlc2lkdWFsW2tdICE9IDApIHsKLSAgICAgICAgaWYgKG5SZXNCaXRzID09IHJlbWFpbmluZ19uYml0c19yZXNpZHVhbCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJlc0JpdHNbblJlc0JpdHMrK10gPSByZWFkX2JpdChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbGFzdG56OyBrICs9IDIpIHsKLSAgICAgIGlmIChzYXZlX2xldltrXSA+IDApIHsKLSAgICAgICAgaWYgKHJlbWFpbmluZ19uYml0c19yZXNpZHVhbCA9PSAwKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBiaXQgPSByZWFkX2JpdChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUpOwotICAgICAgICByZW1haW5pbmdfbmJpdHNfcmVzaWR1YWwtLTsKLSAgICAgICAgaWYgKGJpdCA9PSAxKSB7Ci0gICAgICAgICAgLy8gaWYgKPCdkYvwnZGeIMyCW2tdID4gMCkKLSAgICAgICAgICBpZiAoWF9oYXRfcV9yZXNpZHVhbFtrXSA+IDApIHsKLSAgICAgICAgICAgIC8v8J2Ri/CdkZ4gzIJba10gKz0gMTsKLSAgICAgICAgICAgIFhfaGF0X3FfcmVzaWR1YWxba10gKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZWxzZSBpZiAo8J2Ri/CdkZ4gzIJba10gPCAwKQotICAgICAgICAgIGVsc2UgaWYgKFhfaGF0X3FfcmVzaWR1YWxba10gPCAwKSB7Ci0gICAgICAgICAgICAvL/CdkYvwnZGeIMyCW2tdIC09IDE7Ci0gICAgICAgICAgICBYX2hhdF9xX3Jlc2lkdWFsW2tdIC09IDE7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZW1haW5pbmdfbmJpdHNfcmVzaWR1YWwgPT0gMCkgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpdCA9IHJlYWRfYml0KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSk7Ci0gICAgICAgICAgICByZW1haW5pbmdfbmJpdHNfcmVzaWR1YWwtLTsKLSAgICAgICAgICAgIGlmIChiaXQgPT0gMCkgewotICAgICAgICAgICAgICAvL/CdkYvwnZGeIMyCW2tdID0gMTsKLSAgICAgICAgICAgICAgWF9oYXRfcV9yZXNpZHVhbFtrXSA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvL/CdkYvwnZGeIMyCW2tdID0gLTE7Ci0gICAgICAgICAgICAgIFhfaGF0X3FfcmVzaWR1YWxba10gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbWFpbmluZ19uYml0c19yZXNpZHVhbCA9PSAwKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYml0ID0gcmVhZF9iaXQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlKTsKLSAgICAgICAgcmVtYWluaW5nX25iaXRzX3Jlc2lkdWFsLS07Ci0gICAgICAgIGlmIChiaXQgPT0gMSkgewotICAgICAgICAgIC8vIGlmICjwnZGL8J2RniDMgltrKzFdID4gMCkKLSAgICAgICAgICBpZiAoWF9oYXRfcV9yZXNpZHVhbFtrICsgMV0gPiAwKSB7Ci0gICAgICAgICAgICAvL/CdkYvwnZGeIMyCW2srMV0gKz0gMTsKLSAgICAgICAgICAgIFhfaGF0X3FfcmVzaWR1YWxbayArIDFdICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGVsc2UgaWYgKPCdkYvwnZGeIMyCW2srMV0gPCAwKQotICAgICAgICAgIGVsc2UgaWYgKFhfaGF0X3FfcmVzaWR1YWxbayArIDFdIDwgMCkgewotICAgICAgICAgICAgLy/wnZGL8J2RniDMgltrKzFdIC09IDE7Ci0gICAgICAgICAgICBYX2hhdF9xX3Jlc2lkdWFsW2sgKyAxXSAtPSAxOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocmVtYWluaW5nX25iaXRzX3Jlc2lkdWFsID09IDApIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaXQgPSByZWFkX2JpdChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUpOwotICAgICAgICAgICAgcmVtYWluaW5nX25iaXRzX3Jlc2lkdWFsLS07Ci0gICAgICAgICAgICBpZiAoYml0ID09IDApIHsKLSAgICAgICAgICAgICAgLy/wnZGL8J2RniDMgltrKzFdID0gMTsKLSAgICAgICAgICAgICAgWF9oYXRfcV9yZXNpZHVhbFtrICsgMV0gPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgLy/wnZGL8J2RniDMgltrKzFdID0gLTE7Ci0gICAgICAgICAgICAgIFhfaGF0X3FfcmVzaWR1YWxbayArIDFdID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTm9pc2UgRmlsbGluZyBTZWVkICovCi0gIGludDE2X3QgdG1wID0gMDsKLSAgLy8gZm9yIChrID0gMDsgayA8IPCdkYHwnZC4OyBrKyspCi0gIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBORTsgaysrKSB7Ci0gICAgLy8gdG1wICs9IGFicyjwnZGL8J2RniDMgltrXSkgKiBrOwotICAgIHRtcCArPSBhYnMoWF9oYXRfcV9yZXNpZHVhbFtrXSkgKiBrOwotICB9Ci0gIG5mX3NlZWQgPSB0bXAgJiAweEZGRkY7IC8qIE5vdGUgdGhhdCBib3RoIHRtcCBhbmQgbmZfc2VlZCBhcmUgMzItYml0IGludCovCi0gIC8qIFplcm8gZnJhbWUgZmxhZyAqLwotICAvLyBpZiAobGFzdG56ID09IDIgJiYg8J2Ri/CdkZ4gzIJbMF0gPT0gMCAmJiDwnZGL8J2RniDMglsxXSA9PSAwICYmIPCdkZTwnZGU8J2RlvCdkZvwnZGRID09IDAgJiYg8J2QufCdkYHwnZC5ID09IDcpCi0gIGlmICgobGFzdG56ID09IDIpICYmIChYX2hhdF9xX3Jlc2lkdWFsWzBdID09IDAuMCkgJiYKLSAgICAgIChYX2hhdF9xX3Jlc2lkdWFsWzFdID09IDAuMCkgJiYgKGdnX2luZCA9PSAwKSAmJiAoRl9ORiA9PSA3KSkgewotICAgIHplcm9GcmFtZSA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgemVyb0ZyYW1lID0gMDsKLSAgfQotCi0gIC8vIDMuNC4zIFJlc2lkdWFsIGRlY29kaW5nICAoZDA5cjAyX0YyRikKLSAgLy8gUmVzaWR1YWwgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIG9ubHkgd2hlbiBsc2JNb2RlIGlzIDAuCi0gIGlmIChsc2JNb2RlID09IDApIHsKLSAgICB1aW50MTZfdCBrLCBuOwotICAgIGsgPSBuID0gMDsKLSAgICAvLyB3aGlsZSAoayA8IPCdkYHwnZC4ICYmIG4gPCBuUmVzQml0cykKLSAgICB3aGlsZSAoayA8IE5FICYmIG4gPCBuUmVzQml0cykgewotICAgICAgLy8gaWYgKPCdkYvwnZGeIMyCW2tdICE9IDApCi0gICAgICBpZiAoWF9oYXRfcV9yZXNpZHVhbFtrXSAhPSAwKSB7Ci0gICAgICAgIGlmIChyZXNCaXRzW24rK10gPT0gMCkgewotICAgICAgICAgIC8vIGlmICjwnZGL8J2RniDMgltrXSA+IDApCi0gICAgICAgICAgaWYgKFhfaGF0X3FfcmVzaWR1YWxba10gPiAwKSB7Ci0gICAgICAgICAgICAvL/CdkYvwnZGeIMyCW2tdIC09IDAuMTg3NTsKLSAgICAgICAgICAgIFhfaGF0X3FfcmVzaWR1YWxba10gLT0gMC4xODc1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL/CdkYvwnZGeIMyCW2tdIC09IDAuMzEyNTsKLSAgICAgICAgICAgIFhfaGF0X3FfcmVzaWR1YWxba10gLT0gMC4zMTI1OwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBpZiAo8J2Ri/CdkZ4gzIJba10gPiAwKQotICAgICAgICAgIGlmIChYX2hhdF9xX3Jlc2lkdWFsW2tdID4gMCkgewotICAgICAgICAgICAgLy/wnZGL8J2RniDMgltrXSArPSAwLjMxMjU7Ci0gICAgICAgICAgICBYX2hhdF9xX3Jlc2lkdWFsW2tdICs9IDAuMzEyNTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy/wnZGL8J2RniDMgltrXSArPSAwLjE4NzU7Ci0gICAgICAgICAgICBYX2hhdF9xX3Jlc2lkdWFsW2tdICs9IDAuMTg3NTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGsrKzsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBSZXNpZHVhbFNwZWN0cnVtOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKSB7Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIlhfaGF0X3FfcmVzaWR1YWwiLCAmWF9oYXRfcV9yZXNpZHVhbFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiBORSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0RlYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9EZWNvZGVyL1Jlc2lkdWFsU3BlY3RydW0uaHBwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL1Jlc2lkdWFsU3BlY3RydW0uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjEzYTU3Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9SZXNpZHVhbFNwZWN0cnVtLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBSZXNpZHVhbFNwZWN0cnVtLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFJFU0lEVUFMX1NQRUNUUlVNX0hfCi0jZGVmaW5lIFJFU0lEVUFMX1NQRUNUUlVNX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNEZWMgewotCi1jbGFzcyBSZXNpZHVhbFNwZWN0cnVtIHsKLSBwdWJsaWM6Ci0gIFJlc2lkdWFsU3BlY3RydW0odWludDE2X3QgTkVfKTsKLQotICB2aXJ0dWFsIH5SZXNpZHVhbFNwZWN0cnVtKCk7Ci0KLSAgdm9pZCByZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKTsKLQotICB2b2lkIHJ1bihjb25zdCB1aW50OF90KiBieXRlcywgdWludDE2X3QmIGJwX3NpZGUsIHVpbnQ4X3QmIG1hc2tfc2lkZSwKLSAgICAgICAgICAgY29uc3QgdWludDE2X3QgbGFzdG56LCBjb25zdCBpbnQxNl90KiBjb25zdCBYX2hhdF9xX2FyaSwKLSAgICAgICAgICAgdWludDE2X3QgbmJpdHNfcmVzaWR1YWwsIHVpbnQ4X3QqIHNhdmVfbGV2LCBjb25zdCB1aW50OF90JiBsc2JNb2RlLAotICAgICAgICAgICB1aW50MTZfdCYgbmZfc2VlZCwgdWludDE2X3QmIHplcm9GcmFtZSwgY29uc3QgaW50MTZfdCBnZ19pbmQsCi0gICAgICAgICAgIGludDE2X3QgRl9ORik7Ci0KLSAgY29uc3QgdWludDE2X3QgTkU7Ci0KLSAgZG91YmxlKiBYX2hhdF9xX3Jlc2lkdWFsOwotICB1aW50MTZfdCBuUmVzQml0czsKLQotIHByaXZhdGU6Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCi0KLSNlbmRpZiAgLy8gUkVTSURVQUxfU1BFQ1RSVU1fSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9TaWRlSW5mb3JtYXRpb24uY3BwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL1NpZGVJbmZvcm1hdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTZhYWIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9EZWNvZGVyL1NpZGVJbmZvcm1hdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIFNpZGVJbmZvcm1hdGlvbi5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlNpZGVJbmZvcm1hdGlvbi5ocHAiCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIkJpdFJlYWRlci5ocHAiCi0KLW5hbWVzcGFjZSBMYzNEZWMgewotCi1zdGF0aWMgY29uc3QgdWludDhfdCBuYml0c19id190YWJsZVs1XSA9IHsKLSAgICAwLCAxLCAyLCAyLCAzfTsgIC8vIHNlZSAzLjQuMi40IEJhbmR3aWR0aCBpbnRlcnByZXRhdGlvbiAoZDA5cjAyX0YyRikKLQotU2lkZUluZm9ybWF0aW9uOjpTaWRlSW5mb3JtYXRpb24odWludDE2X3QgTkZfLCB1aW50MTZfdCBORV8sIHVpbnQ4X3QgZnNfaW5kXykKLSAgICA6IE5GKE5GXyksCi0gICAgICBORShORV8pLAotICAgICAgZnNfaW5kKGZzX2luZF8pLAotICAgICAgbmJpdHNfYncobmJpdHNfYndfdGFibGVbZnNfaW5kXSksCi0gICAgICBzdWJtb2RlTVNCKDApLAotICAgICAgc3VibW9kZUxTQigwKSB7fQotCi1TaWRlSW5mb3JtYXRpb246On5TaWRlSW5mb3JtYXRpb24oKSB7fQotCi12b2lkIFNpZGVJbmZvcm1hdGlvbjo6ZGVjX3NwbGl0X3N0MlZRX0NXKHVpbnQzMl90IGN3UngsIHVpbnQzMl90IHN6QSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3pCLCB1aW50OF90JiBCRUNfZGV0ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBzdWJtb2RlTFNCLCBpbnQzMl90JiBpZHhBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpZHhCb3JHYWluTFNCKSB7Ci0gIGlmIChjd1J4ID49IHN6QiAqIHN6QSkgewotICAgIGlkeEEgPSAwOwotICAgIGlkeEJvckdhaW5MU0IgPSAwOwotICAgIHN1Ym1vZGVMU0IgPSAwOwotICAgIEJFQ19kZXRlY3QgPSAxOwotICAgIHJldHVybjsKLSAgfQotICBpZHhCb3JHYWluTFNCID0gZmxvb3IoY3dSeCAvIHN6QSk7Ci0gIGlkeEEgPSBjd1J4IC0gaWR4Qm9yR2FpbkxTQiAqIHN6QTsKLSAgc3VibW9kZUxTQiA9IDA7Ci0gIGlkeEJvckdhaW5MU0IgPSBpZHhCb3JHYWluTFNCIC0gMjsKLSAgaWYgKGlkeEJvckdhaW5MU0IgPCAwKSB7Ci0gICAgc3VibW9kZUxTQiA9IDE7Ci0gIH0KLQotICBpZHhCb3JHYWluTFNCID0gaWR4Qm9yR2FpbkxTQiArIDIgKiBzdWJtb2RlTFNCOwotICAvLyBCRUNfZGV0ZWN0ID0gMDsgLy8gY2hhbmdlZCBpbiBjb21wYXJpc2lvbiB0byBzcGVjaWZpY2F0aW9uIC0+IHZhcmlhYmxlIGlzCi0gIC8vIGhhbmRsZXMgYXMgcmVmZXJlbmNlIHRvIG92ZXJhbGwgQkVDX2RldGVjdAotfQotCi12b2lkIFNpZGVJbmZvcm1hdGlvbjo6cnVuKGNvbnN0IHVpbnQ4X3QqIGJ5dGVzLCB1aW50MTZfdCYgYnBfc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgbWFza19zaWRlLCBpbnQxNl90JiBQX0JXLCBpbnQxNl90JiBsYXN0bnosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIGxzYk1vZGUsIGludDE2X3QmIGdnX2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgbnVtX3Ruc19maWx0ZXJzLCBpbnQxNl90KiByY19vcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgcGl0Y2hfcHJlc2VudCwgaW50MTZfdCYgcGl0Y2hfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGx0cGZfYWN0aXZlLCBpbnQxNl90JiBGX05GLCBpbnQxNl90JiBpbmRfTEYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGluZF9IRiwgaW50MTZfdCYgR2luZCwgaW50MTZfdCYgTFNfaW5kQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgTFNfaW5kQiwgaW50MzJfdCYgaWR4QSwgaW50MTZfdCYgaWR4QiwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCRUNfZGV0ZWN0KSB7Ci0gIC8vIDUuNC4yLjMgU2lkZSBpbmZvcm1hdGlvbgotICAvKiBCYW5kd2lkdGggKi8KLSAgaWYgKG5iaXRzX2J3ID4gMCkgewotICAgIFBfQlcgPSByZWFkX3VpbnQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBuYml0c19idyk7Ci0gICAgaWYgKGZzX2luZCA8IFBfQlcpIHsKLSAgICAgIEJFQ19kZXRlY3QgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBQX0JXID0gMDsKLSAgfQotICAvKiBMYXN0IG5vbi16ZXJvIHR1cGxlICovCi0gIG5iaXRzX2xhc3RueiA9IGNlaWwobG9nMihORSAvIDIpKTsKLSAgaW50MTZfdCB0bXBfbGFzdG56ID0gcmVhZF91aW50KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgbmJpdHNfbGFzdG56KTsKLSAgbGFzdG56ID0gKHRtcF9sYXN0bnogKyAxKSA8PCAxOwotICBpZiAobGFzdG56ID4gTkUpIHsKLSAgICAvKiBjb25zaWRlciB0aGlzIGFzIGJpdCBlcnJvciAoQkVDKSAqLwotICAgIEJFQ19kZXRlY3QgPSAxOwotICAgIHJldHVybjsKLSAgfQotICAvKiBMU0IgbW9kZSBiaXQgKi8KLSAgbHNiTW9kZSA9IHJlYWRfYml0KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSk7Ci0gIC8qIEdsb2JhbCBHYWluICovCi0gIGdnX2luZCA9IHJlYWRfdWludChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIDgpOwotICAvKiBUTlMgYWN0aXZhdGlvbiBmbGFnICovCi0gIGlmIChQX0JXIDwgMykgewotICAgIG51bV90bnNfZmlsdGVycyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgbnVtX3Ruc19maWx0ZXJzID0gMjsKLSAgfQotICByY19vcmRlclswXSA9IDA7ICAvLyBub3Qgc3BlY2lmaWVkLCBidXQgb24gdGhlIHNhZmUgc2lkZQotICByY19vcmRlclsxXSA9IDA7ICAvLyBub3Qgc3BlY2lmaWVkLCBidXQgb24gdGhlIHNhZmUgc2lkZQotICBmb3IgKHVpbnQ4X3QgZiA9IDA7IGYgPCBudW1fdG5zX2ZpbHRlcnM7IGYrKykgewotICAgIHJjX29yZGVyW2ZdID0gcmVhZF9iaXQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlKTsKLSAgfQotICAvKiBQaXRjaCBwcmVzZW50IGZsYWcgKi8KLSAgcGl0Y2hfcHJlc2VudCA9IHJlYWRfYml0KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSk7Ci0gIC8qIFNOUy1WUSBpbnRlZ2VyIGJpdHMgKi8KLSAgLyogUmVhZCA1KzUgYml0cyBvZiBTTlEgVlEgZGVjb2Rpbmcgc3RhZ2UgMSBhY2NvcmRpbmcgdG8gU2VjdGlvbiA1LjQuNy4yLjEKLSAgICogKGQwOXIwMSkgKi8KLSAgLyogUmVhZCA1KzUgYml0cyBvZiBTTlEgVlEgZGVjb2Rpbmcgc3RhZ2UgMSBhY2NvcmRpbmcgdG8gU2VjdGlvbiAzLjQuNy4yLjEKLSAgICogKGQwOXIwMikoZDA5cjAyX0YyRikgKi8KLSAgaW5kX0xGID0gcmVhZF91aW50KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgNSk7IC8qIHN0YWdlMSBMRiAqLwotICBpbmRfSEYgPSByZWFkX3VpbnQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCA1KTsgLyogc3RhZ2UxIEhGICovCi0KLSAgLyogUmVhZCAyOCBiaXRzIG9mIFNOUyBWUSBkZWNvZGluZyBzdGFnZSAyIGFjY29yZGluZyB0byBzZWN0aW9uIDUuNC43LjIuMgotICAgKiAoZDA5cjAxKSAqLwotICAvLyAzLjQuNy4yLjIgU3RhZ2UgMiBTTlMgVlEgZGVjb2RpbmcgICAoZDA5cjAyX0YyRikKLSAgc3VibW9kZU1TQiA9IHJlYWRfYml0KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSk7Ci0gIGlmIChzdWJtb2RlTVNCID09IDApIHsKLSAgICBHaW5kID0gcmVhZF91aW50KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgMSk7Ci0gIH0gZWxzZSB7Ci0gICAgR2luZCA9IHJlYWRfdWludChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIDIpOwotICB9Ci0gIExTX2luZEEgPSByZWFkX2JpdChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUpOyAvKiBMU19pbmRBIDEgYml0ICovCi0gIGlmIChzdWJtb2RlTVNCID09IDApIHsKLSAgICAvKiDigJhyZWd1bGFy4oCZL+KAmXJlZ3VsYXJfbGbigJkgZGVtdWx0aXBsZXhpbmcsIGVzdGFibGlzaCBpZiBzaGFwZV9qIGlzIDAgb3IgMSAqLwotICAgIHVpbnQzMl90IHRtcCA9IHJlYWRfdWludChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIDEzKTsKLSAgICB0bXAgfD0gKHJlYWRfdWludChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIDEyKSA8PCAxMyk7Ci0gICAgaW50MzJfdCBpZHhCb3JHYWluTFNCOwotICAgIC8vWyBCRUNfZGV0ZWN0LCBzdWJtb2RlTFNCLCBpZHhBLCBpZHhCb3JHYWluTFNCIF0gPSBkZWNfc3BsaXRfc3QyVlFfQ1codG1wLAotICAgIC8vIDQ3ODAwMDhVPj4xLCAxNCApOwotICAgIGRlY19zcGxpdF9zdDJWUV9DVyh0bXAsIDQ3ODAwMDhVID4+IDEsIDE0LCBCRUNfZGV0ZWN0LCBzdWJtb2RlTFNCLCBpZHhBLAotICAgICAgICAgICAgICAgICAgICAgICBpZHhCb3JHYWluTFNCKTsKLSAgICBpZiAoQkVDX2RldGVjdCkgewotICAgICAgLy8gZWFybHkgZXhpdCB0byBhdm9pZCB1bnByZWRpY3RhYmxlIHNpZGUtZWZmZWN0cwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3VibW9kZUxTQiAhPSAwKSB7Ci0gICAgICBHaW5kID0gKEdpbmQgPDwgMSkgKyBpZHhCb3JHYWluTFNCOyAvKiBmb3IgcmVndWxhcl9sZiAqLwotICAgICAgLy8ganVzdCBzZXQgc29tZSBkZWZpbmVkIHZhbHVlcyAoYWx0aG91Z2ggbm90aGluZyBpcyBzcGVjaWZpZWQgZm9yIHRoaXMKLSAgICAgIC8vIGNhc2UpCi0gICAgICBpZHhCID0gMDsKLSAgICAgIExTX2luZEIgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZHhCID0gaWR4Qm9yR2FpbkxTQiA+PiAxOyAvKiBmb3IgcmVndWxhciAqLwotICAgICAgTFNfaW5kQiA9IGlkeEJvckdhaW5MU0IgJiAweDE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEF0dGVudGlvbjogdGhlIGdpdmVuIHJlZmVyZW5jZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBkbyBub3QgY292ZXIKLSAgICAvLyB0aGlzIGNhc2UgLT4gdGVzdGVkIHdpdGggY29uZm9ybWFuY2UgdGVzdHMgb25seSEgKHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCi0gICAgLy8gb2JzZXJ2ZWQgYWxyZWFkeSkKLSAgICAvKiBvdXRsaWVyXyogZGVtdWx0aXBsZXhpbmcsIGVzdGFibGlzaCBpZiBzaGFwZV9qIGlzIDIgb3IgMyAqLwotICAgIGludDMyX3QgdG1wID0gcmVhZF91aW50KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgMTIpOwotICAgIHRtcCB8PQotICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWFkX3VpbnQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCAxMikgPDwgMTIpOwotICAgIGlkeEEgPSB0bXA7Ci0gICAgLy8gaWR4QiA9IC0xOyAvLyByZW1vdmVkIGluIHBzZXVkby1jb2RlIG9mIGQwOXIwMl9GMkYKLSAgICBzdWJtb2RlTFNCID0gMDsKLSAgICAvLyB0aGlzIGludGlhbGl6YXRpb24gZG9lcyBub3Qgc2VlbSB0byBiZSBjb3JyZWN0IGhlcmUKLSAgICAvLyAoanVzdCBmcm9tIGNvZGUgcmVhZGluZzsgY29udGV4dCBvZiBwc2V1ZG8tY29kZSBpbiBzcGVjaWZpY2F0aW9uIGlzIG5vdAotICAgIC8vIGNsZWFyKQotICAgIC8vIEJFQ19kZXRlY3QgPSAwOwotICAgIGlmICh0bXAgPj0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oKDMwMzE2NTQ0VSA+PiAxKSArIDE1NDk4MjRVKSkgewotICAgICAgQkVDX2RldGVjdCA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRtcCAtPSBzdGF0aWNfY2FzdDxpbnQzMl90PigzMDMxNjU0NFUgPj4gMSk7Ci0gICAgICBpZiAodG1wID49IDApIHsKLSAgICAgICAgc3VibW9kZUxTQiA9IDE7Ci0gICAgICAgIEdpbmQgPSAoR2luZCA8PCAxKSArICh0bXAgJiAweDEpOwotICAgICAgICBpZHhBID0gdG1wID4+IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTFRQRiBkYXRhICovCi0gIGlmIChwaXRjaF9wcmVzZW50ICE9IDApIHsKLSAgICBsdHBmX2FjdGl2ZSA9IHJlYWRfdWludChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIDEpOwotICAgIHBpdGNoX2luZGV4ID0gcmVhZF91aW50KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgOSk7Ci0gIH0KLQotICAvKiBOb2lzZSBMZXZlbCAqLwotICBGX05GID0gcmVhZF91aW50KGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgMyk7Ci19Ci0KLXZvaWQgU2lkZUluZm9ybWF0aW9uOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKSB7Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIm5iaXRzX2xhc3RueiIsICZuYml0c19sYXN0bnosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuYml0c19sYXN0bnopKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInN1Ym1vZGVNU0IiLCAmc3VibW9kZU1TQiwgc2l6ZW9mKHN1Ym1vZGVNU0IpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRGVjCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvU2lkZUluZm9ybWF0aW9uLmhwcCBiL2VtYmRydi9sYzMvRGVjb2Rlci9TaWRlSW5mb3JtYXRpb24uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRmN2U0Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9TaWRlSW5mb3JtYXRpb24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIFNpZGVJbmZvcm1hdGlvbi5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTSURFX0lORk9STUFUSU9OX0hfCi0jZGVmaW5lIFNJREVfSU5GT1JNQVRJT05fSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLWNsYXNzIFNpZGVJbmZvcm1hdGlvbiB7Ci0gcHVibGljOgotICBTaWRlSW5mb3JtYXRpb24odWludDE2X3QgTkZfLCB1aW50MTZfdCBORV8sIHVpbnQ4X3QgZnNfaW5kXyk7Ci0KLSAgdmlydHVhbCB+U2lkZUluZm9ybWF0aW9uKCk7Ci0KLSAgdm9pZCByZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKTsKLQotICB2b2lkIHJ1bihjb25zdCB1aW50OF90KiBieXRlcywgdWludDE2X3QmIGJwX3NpZGUsIHVpbnQ4X3QmIG1hc2tfc2lkZSwKLSAgICAgICAgICAgaW50MTZfdCYgUF9CVywgaW50MTZfdCYgbGFzdG56LCB1aW50OF90JiBsc2JNb2RlLCBpbnQxNl90JiBnZ19pbmQsCi0gICAgICAgICAgIGludDE2X3QmIG51bV90bnNfZmlsdGVycywgaW50MTZfdCogcmNfb3JkZXIsIHVpbnQ4X3QmIHBpdGNoX3ByZXNlbnQsCi0gICAgICAgICAgIGludDE2X3QmIHBpdGNoX2luZGV4LCBpbnQxNl90JiBsdHBmX2FjdGl2ZSwgaW50MTZfdCYgRl9ORiwKLSAgICAgICAgICAgaW50MTZfdCYgaW5kX0xGLCBpbnQxNl90JiBpbmRfSEYsIGludDE2X3QmIEdpbmQsIGludDE2X3QmIExTX2luZEEsCi0gICAgICAgICAgIGludDE2X3QmIExTX2luZEIsIGludDMyX3QmIGlkeEEsIGludDE2X3QmIGlkeEIsCi0KLSAgICAgICAgICAgdWludDhfdCYgQkVDX2RldGVjdCk7Ci0KLSAgY29uc3QgdWludDE2X3QgTkY7Ci0gIGNvbnN0IHVpbnQxNl90IE5FOwotICBjb25zdCB1aW50OF90IGZzX2luZDsKLSAgY29uc3QgdWludDhfdCBuYml0c19idzsKLQotICBpbnQxNl90IHN1Ym1vZGVNU0I7Ci0gIGludDE2X3Qgc3VibW9kZUxTQjsKLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3QgbmJpdHNfbGFzdG56OwotCi0gIHZvaWQgZGVjX3NwbGl0X3N0MlZRX0NXKHVpbnQzMl90IGN3UngsIHVpbnQzMl90IHN6QSwgdWludDMyX3Qgc3pCLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCRUNfZGV0ZWN0LCBpbnQxNl90JiBzdWJtb2RlTFNCLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpZHhBLCBpbnQzMl90JiBpZHhCb3JHYWluTFNCKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKLQotI2VuZGlmICAvLyBTSURFX0lORk9STUFUSU9OX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0RlY29kZXIvU3BlY3RyYWxOb2lzZVNoYXBpbmcuY3BwIGIvZW1iZHJ2L2xjMy9EZWNvZGVyL1NwZWN0cmFsTm9pc2VTaGFwaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZGU5ZC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0RlY29kZXIvU3BlY3RyYWxOb2lzZVNoYXBpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBTcGVjdHJhbE5vaXNlU2hhcGluZy5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlNwZWN0cmFsTm9pc2VTaGFwaW5nLmhwcCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiQmFuZEluZGV4VGFibGVzLmhwcCIKLSNpbmNsdWRlICJNUFZRLmhwcCIKLSNpbmNsdWRlICJTbnNRdWFudGl6YXRpb25UYWJsZXMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRGVjIHsKLQotU3BlY3RyYWxOb2lzZVNoYXBpbmc6OlNwZWN0cmFsTm9pc2VTaGFwaW5nKGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwgSV9mcyhudWxscHRyKSB7Ci0gIC8vIE5vdGU6IHdlIGRvIG5vdCBhZGQgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGVycm9yIGNoZWNraW5nIGF0IHRoaXMgbGV2ZWwuCi0gIC8vICAgV2UgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBiZSBub3IgcHJvY2Vzc2luZyB3aXRoIGludmFsaWQgY29uZmlndXJhdGlvbiwKLSAgLy8gICB0aHVzIG5vbnNlbnNlIHJlc3VsdHMgZm9yIGludmFsaWQgbGMzQ29uZmlnLk5fbXMgYW5kL29yIGxjM0NvbmZpZy5Gc19pbmQKLSAgLy8gICBhcmUgYWNjZXB0ZWQgaGVyZS4KLSAgaWYgKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDdwNW1zKSB7Ci0gICAgc3dpdGNoIChsYzNDb25maWcuRnNfaW5kKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIElfZnMgPSAmSV84MDAwXzdwNW1zWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgSV9mcyA9ICZJXzE2MDAwXzdwNW1zWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgSV9mcyA9ICZJXzI0MDAwXzdwNW1zWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgSV9mcyA9ICZJXzMyMDAwXzdwNW1zWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgSV9mcyA9ICZJXzQ4MDAwXzdwNW1zWzBdOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcyAoYW5kIG90aGVyIGFzIGZhbGxiYWNrKQotICAgIHN3aXRjaCAobGMzQ29uZmlnLkZzX2luZCkgewotICAgICAgY2FzZSAwOgotICAgICAgICBJX2ZzID0gJklfODAwMFswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIElfZnMgPSAmSV8xNjAwMFswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIElfZnMgPSAmSV8yNDAwMFswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIElfZnMgPSAmSV8zMjAwMFswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgIElfZnMgPSAmSV80ODAwMFswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLVNwZWN0cmFsTm9pc2VTaGFwaW5nOjp+U3BlY3RyYWxOb2lzZVNoYXBpbmcoKSB7fQotCi12b2lkIFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpydW4oY29uc3QgZG91YmxlKiBjb25zdCBYX3NfdG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29uc3QgWF9oYXRfc3MsIGludDE2X3QgaW5kX0xGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgaW5kX0hGLCBpbnQxNl90IHN1Ym1vZGVNU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBzdWJtb2RlTFNCLCBpbnQxNl90IEdpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBMU19pbmRBLCBpbnQxNl90IExTX2luZEIsIGludDMyX3QgaWR4QSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGlkeEIpIHsKLSAgaWYgKCFsYzNDb25maWcuaXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gMy40LjcgU05TIGRlY29kZXIgKGQwOXIwMl9GMkYpCi0gIC8vIDMuNC43LjIgU05TIHNjYWxlIGZhY3RvciBkZWNvZGluZyAgKGQwOXIwMl9GMkYpCi0gIC8vIDMuNC43LjIuMSBTdGFnZSAxIFNOUyBWUSBkZWNvZGluZyAgKGQwOXIwMl9GMkYpCi0gIC8vIGFscmVhZHkgZG9uZSBlYXJsaWVyIChzZWUgU2lkZUluZm9ybWF0aW9uKQotCi0gIC8vIFRoZSBmaXJzdCBzdGFnZSB2ZWN0b3IgaXMgY29tcG9zZWQgYXM6Ci0gIC8v8J2RoPCdkaExKPCdkZspID0g8J2Qv/CdkLnwnZC28J2QtfCdkZbwnZGb8J2RkV/wnZC/8J2QuSAo8J2RmyksIPCdkZPwnZGc8J2RnyDwnZGbID0gWzAg4oCmIDddLCAjICgzMykKLSAgLy/wnZGg8J2RoTEo8J2RmyArIDgpID0g8J2Qu/CdkLnwnZC28J2QtfCdkZbwnZGb8J2RkV/wnZC78J2QuSjwnZGbKSwg8J2Rk/CdkZzwnZGfIPCdkZsgPSBbMCDigKYgN10sICMgKDM0KQotICBkb3VibGUgc3QxWzE2XTsKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgODsgbisrKSB7Ci0gICAgc3QxW25dID0gTEZDQltpbmRfTEZdW25dOwotICAgIHN0MVtuICsgOF0gPSBIRkNCW2luZF9IRl1bbl07Ci0gIH0KLQotICAvLyAzLjQuNy4yLjIgU3RhZ2UgMiBTTlMgVlEgZGVjb2RpbmcgICAoZDA5cjAyX0YyRikKLSAgLy8gYWxyZWFkeSBkb25lIGVhcmxpZXIgLT4gc3VibW9kZU1TQiwgR2luZCwgTFNfaW5kQSwgTFNfaW5kQiwgaWR4QSwgaWR4QgotICBpbnQxNl90IHNoYXBlX2ogPSAoc3VibW9kZU1TQiA8PCAxKSArIHN1Ym1vZGVMU0I7Ci0gIGludDE2X3QgZ2Fpbl9pID0gR2luZDsKLQotICBpbnQxNl90IHlbMTZdOwotICBpbnQxNl90IHpbMTZdOwotCi0gIHN3aXRjaCAoc2hhcGVfaikgewotICAgIGNhc2UgMDoKLSAgICAgIE1QVlFkZWVudW0oMTAsIDEwLCBMU19pbmRBLCBpZHhBLCB5KTsKLSAgICAgIE1QVlFkZWVudW0oNiwgMSwgTFNfaW5kQiwgaWR4Qiwgeik7Ci0gICAgICBmb3IgKHVpbnQ4X3QgbiA9IDEwOyBuIDw9IDE1OyBuKyspIHsKLSAgICAgICAgeVtuXSA9IHpbbiAtIDEwXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIE1QVlFkZWVudW0oMTAsIDEwLCBMU19pbmRBLCBpZHhBLCB5KTsKLSAgICAgIGZvciAodWludDhfdCBuID0gMTA7IG4gPD0gMTU7IG4rKykgewotICAgICAgICB5W25dID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIE1QVlFkZWVudW0oMTYsIDgsIExTX2luZEEsIGlkeEEsIHkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgTVBWUWRlZW51bSgxNiwgNiwgTFNfaW5kQSwgaWR4QSwgeSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGRvdWJsZSB5Tm9ybSA9IDA7Ci0gIGZvciAodWludDhfdCBuID0gMDsgbiA8IDE2OyBuKyspIHsKLSAgICAvLyB5Tm9ybSArPSB5W25dKih5W25dKjEuMCk7Ci0gICAgeU5vcm0gKz0geVtuXSAqIHlbbl07Ci0gIH0KLSAgeU5vcm0gPSBzdGQ6OnNxcnQoeU5vcm0pOwotICAvLyBOb3RlOiB3ZSBza2lwcGVkIGludGVybWVkaWF0ZSBzaWduYWwgeHFfc2hhcGVfaiBhbmQgYXBwbGllZCB5Tm9ybQotICAvLyAgZGlyZWN0bHkgdG9nZXRoZXIgd2l0aCBHX2dhaW5faV9zaGFwZV9qCi0KLSAgZG91YmxlIEdfZ2Fpbl9pX3NoYXBlX2ogPQotICAgICAgc25zX3ZxX2Zhcl9hZGpfZ2FpbnNbZ2Fpbl9pXTsgIC8vIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQgd2FybmluZ3MKLSAgc3dpdGNoIChzaGFwZV9qKSB7Ci0gICAgY2FzZSAwOgotICAgICAgR19nYWluX2lfc2hhcGVfaiA9IHNuc192cV9yZWdfYWRqX2dhaW5zW2dhaW5faV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBHX2dhaW5faV9zaGFwZV9qID0gc25zX3ZxX3JlZ19sZl9hZGpfZ2FpbnNbZ2Fpbl9pXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIEdfZ2Fpbl9pX3NoYXBlX2ogPSBzbnNfdnFfbmVhcl9hZGpfZ2FpbnNbZ2Fpbl9pXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIEdfZ2Fpbl9pX3NoYXBlX2ogPSBzbnNfdnFfZmFyX2Fkal9nYWluc1tnYWluX2ldOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKDAuMCAhPSB5Tm9ybSkgIC8vIGRvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGV2ZW4gbW9yZSByb2J1c3Q/Pz8KLSAgewotICAgIEdfZ2Fpbl9pX3NoYXBlX2ogLz0geU5vcm07Ci0gIH0KLQotICAvLyBTeW50aGVzaXMgb2YgdGhlIFF1YW50aXplZCBTTlMgc2NhbGUgZmFjdG9yIHZlY3RvcgotICBkb3VibGUgc2NmUVsxNl07Ci0gIGZvciAodWludDhfdCBuID0gMDsgbiA8IDE2OyBuKyspIHsKLSAgICBkb3VibGUgZmFjdG9yID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgY29sID0gMDsgY29sIDwgMTY7IGNvbCsrKSB7Ci0gICAgICBmYWN0b3IgKz0geVtjb2xdICogRFtuXVtjb2xdOwotICAgIH0KLSAgICBzY2ZRW25dID0gc3QxW25dICsgR19nYWluX2lfc2hhcGVfaiAqIGZhY3RvcjsKLSAgfQotCi0gIC8vIDMuNC43LjMgU05TIHNjYWxlIGZhY3RvcnMgaW50ZXJwb2xhdGlvbiAgKGQwOXIwMl9GMkYpCi0gIGRvdWJsZSBzY2ZRaW50WzY0XTsKLSAgc2NmUWludFswXSA9IHNjZlFbMF07Ci0gIHNjZlFpbnRbMV0gPSBzY2ZRWzBdOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPD0gMTQ7IG4rKykgewotICAgIHNjZlFpbnRbNCAqIG4gKyAyXSA9IHNjZlFbbl0gKyAoMS4wIC8gOC4wICogKHNjZlFbbiArIDFdIC0gc2NmUVtuXSkpOwotICAgIHNjZlFpbnRbNCAqIG4gKyAzXSA9IHNjZlFbbl0gKyAoMy4wIC8gOC4wICogKHNjZlFbbiArIDFdIC0gc2NmUVtuXSkpOwotICAgIHNjZlFpbnRbNCAqIG4gKyA0XSA9IHNjZlFbbl0gKyAoNS4wIC8gOC4wICogKHNjZlFbbiArIDFdIC0gc2NmUVtuXSkpOwotICAgIHNjZlFpbnRbNCAqIG4gKyA1XSA9IHNjZlFbbl0gKyAoNy4wIC8gOC4wICogKHNjZlFbbiArIDFdIC0gc2NmUVtuXSkpOwotICB9Ci0gIHNjZlFpbnRbNjJdID0gc2NmUVsxNV0gKyAxIC8gOC4wICogKHNjZlFbMTVdIC0gc2NmUVsxNF0pOwotICBzY2ZRaW50WzYzXSA9IHNjZlFbMTVdICsgMyAvIDguMCAqIChzY2ZRWzE1XSAtIHNjZlFbMTRdKTsKLQotICAvLyBhZGQgc3BlY2lhbCBoYW5kbGluZyBmb3IgbGMzQ29uZmlnLk5fYj02MCAoaGFwcGVucyBmb3IgNy41bXMgYW5kIGZzPThrSHopCi0gIC8vIHNlZSBzZWN0aW9uIDMuNC43LjMgU05TIHNjYWxlIGZhY3RvcnMgaW50ZXJwb2xhdGlvbiAoZDEuMHIwMyBpbmNsdWRpbmcKLSAgLy8gRXJyYXRhIDE1MDM2KQotICBjb25zdCB1aW50OF90IG4yID0gNjQgLSBsYzNDb25maWcuTl9iOwotICBpZiAobjIgIT0gMCkgewotICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IG4yOyBpKyspIHsKLSAgICAgIHNjZlFpbnRbaV0gPSAoc2NmUWludFsyICogaV0gKyBzY2ZRaW50WzIgKiBpICsgMV0pIC8gMjsKLSAgICB9Ci0gICAgZm9yICh1aW50OF90IGkgPSBuMjsgaSA8IGxjM0NvbmZpZy5OX2I7IGkrKykgewotICAgICAgc2NmUWludFtpXSA9IHNjZlFpbnRbaSArIG4yXTsKLSAgICB9Ci0gIH0KLQotICBkb3VibGUgZ19TTlNbNjRdOwotICBmb3IgKHVpbnQ4X3QgYiA9IDA7IGIgPCBsYzNDb25maWcuTl9iOyBiKyspIHsKLSAgICBnX1NOU1tiXSA9IGV4cDIoc2NmUWludFtiXSk7Ci0gIH0KLQotICAvLyAzLjQuNy40IFNwZWN0cmFsIFNoYXBpbmcgICAoZDA5cjAyX0YyRikKLSAgLy8gZm9yIChiPTA7IGI88J2RgfCdkY87IGIrKykKLSAgZm9yICh1aW50OF90IGIgPSAwOyBiIDwgbGMzQ29uZmlnLk5fYjsgYisrKSB7Ci0gICAgLy8gZm9yIChrPfCdkLzwnZGT8J2RoCAo8J2Rjyk7IGs8IPCdkLzwnZGT8J2RoCAo8J2RjyArIDEpOyBrKyspCi0gICAgZm9yICh1aW50MTZfdCBrID0gSV9mc1tiXTsgayA8IElfZnNbYiArIDFdOyBrKyspIHsKLSAgICAgIC8v8J2RiyDMgijwnZGYKSA9IPCdkYvwnZGGIMyCKPCdkZgpIOKImSDwnZGU8J2RhvCdkYHwnZGGICjwnZGPKQotICAgICAgWF9oYXRfc3Nba10gPSBYX3NfdG5zW2tdICogZ19TTlNbYl07Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgU3BlY3RyYWxOb2lzZVNoYXBpbmc6OnJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNEZWMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRGVjb2Rlci9TcGVjdHJhbE5vaXNlU2hhcGluZy5ocHAgYi9lbWJkcnYvbGMzL0RlY29kZXIvU3BlY3RyYWxOb2lzZVNoYXBpbmcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzllNTAzLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRGVjb2Rlci9TcGVjdHJhbE5vaXNlU2hhcGluZy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogU3BlY3RyYWxOb2lzZVNoYXBpbmcuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1BFQ1RSQUxfTk9JU0VfU0hBUElOR19IXwotI2RlZmluZSBTUEVDVFJBTF9OT0lTRV9TSEFQSU5HX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIExjM0RlYyB7Ci0KLWNsYXNzIFNwZWN0cmFsTm9pc2VTaGFwaW5nIHsKLSBwdWJsaWM6Ci0gIFNwZWN0cmFsTm9pc2VTaGFwaW5nKGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXyk7Ci0KLSAgdmlydHVhbCB+U3BlY3RyYWxOb2lzZVNoYXBpbmcoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpOwotCi0gIHZvaWQgcnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWF9zX3RucywgZG91YmxlKiBjb25zdCBYX2hhdF9zcywgaW50MTZfdCBpbmRfTEYsCi0gICAgICAgICAgIGludDE2X3QgaW5kX0hGLCBpbnQxNl90IHN1Ym1vZGVNU0IsIGludDE2X3Qgc3VibW9kZUxTQiwgaW50MTZfdCBHaW5kLAotICAgICAgICAgICBpbnQxNl90IExTX2luZEEsIGludDE2X3QgTFNfaW5kQiwgaW50MzJfdCBpZHhBLCBpbnQxNl90IGlkeEIpOwotCi0gIGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnOwotCi0gcHJpdmF0ZToKLSAgaW50KiBJX2ZzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0RlYwotCi0jZW5kaWYgIC8vIFNQRUNUUkFMX05PSVNFX1NIQVBJTkdfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9BdHRhY2tEZXRlY3Rvci5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvQXR0YWNrRGV0ZWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRiZDI4Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9BdHRhY2tEZXRlY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIEF0dGFja0RldGVjdG9yLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQXR0YWNrRGV0ZWN0b3IuaHBwIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1BdHRhY2tEZXRlY3Rvcjo6QXR0YWNrRGV0ZWN0b3IoY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWdfKQotICAgIDogbGMzQ29uZmlnKGxjM0NvbmZpZ18pLAotICAgICAgTV9GKChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zKQotICAgICAgICAgICAgICA/IDE2MAotICAgICAgICAgICAgICA6IDEyMCksICAvLyAxNipOX21zCi0gICAgICBGX2F0dCgwKSwKLSAgICAgIEVfYXR0X2xhc3QoMCksCi0gICAgICBBX2F0dF9sYXN0KDApLAotICAgICAgUF9hdHRfbGFzdCgtMSkgewotICAvLyBtYWtlIHN1cmUgdGhlc2Ugc3RhdGVzIGFyZSBpbml0aWFsbHkgemVybyBhcyBkZW1hbmRlZCBieSB0aGUgc3BlY2lmaWNhdGlvbgotICB4X2F0dF9sYXN0WzBdID0gMDsKLSAgeF9hdHRfbGFzdFsxXSA9IDA7Ci19Ci0KLUF0dGFja0RldGVjdG9yOjp+QXR0YWNrRGV0ZWN0b3IoKSB7fQotCi12b2lkIEF0dGFja0RldGVjdG9yOjpydW4oY29uc3QgaW50MTZfdCogY29uc3QgeF9zLCB1aW50MTZfdCBuYnl0ZXMpIHsKLSAgLy8gMy4zLjYuMSBPdmVydmlldyAoZDA5cjA2X0ZoRykKLSAgLy8gLT4gYXR0YWNrIGRldGVjdGlvbiBhY3RpdmUgb25seSBmb3IgaGlnaGVyIGJpdHJhdGVzIGFuZCBmcz49MzIwMDA7Ci0gIC8vIG90aGVyd2lzZSBkZWZhdWx0cyBhcmUgc2V0Ci0gIEZfYXR0ID0gMDsKLSAgaWYgKGxjM0NvbmZpZy5GcyA8IDMyMDAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJvb2wgaXNBY3RpdmUgPQotICAgICAgKChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zKSAmJgotICAgICAgIChsYzNDb25maWcuRnMgPT0gMzIwMDApICYmIChuYnl0ZXMgPiA4MCkpIHx8Ci0gICAgICAoKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpICYmCi0gICAgICAgKGxjM0NvbmZpZy5GcyA+PSA0NDEwMCkgJiYgKG5ieXRlcyA+PSAxMDApKSB8fAotICAgICAgKChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQ3cDVtcykgJiYKLSAgICAgICAobGMzQ29uZmlnLkZzID09IDMyMDAwKSAmJiAobmJ5dGVzID49IDYxKSAmJiAobmJ5dGVzIDwgMTUwKSkgfHwKLSAgICAgICgobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkN3A1bXMpICYmCi0gICAgICAgKGxjM0NvbmZpZy5GcyA+PSA0NDEwMCkgJiYgKG5ieXRlcyA+PSA3NSkgJiYgKG5ieXRlcyA8IDE1MCkpOwotICBpZiAoIWlzQWN0aXZlKSB7Ci0gICAgLy8gTm90ZTogaW4gYml0cmF0ZSBzd2l0Y2hpbmcgc2l0dWF0aW9ucyB3ZSBoYXZlIHRvIHNldCBwcm9wZXIgc3RhdGVzCi0gICAgRV9hdHRfbGFzdCA9IDA7Ci0gICAgQV9hdHRfbGFzdCA9IDA7Ci0gICAgUF9hdHRfbGFzdCA9IC0xOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIDMuMy42LjIgRG93bnNhbXBsaW5nIGFuZCBmaWx0ZXJpbmcgb2YgaW5wdXQgc2lnbmFsIChkMDlyMDJfRjJGKQotICAvLyBOb3RlOiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gbWlnaHQgYmUgY29udmVydGVkIHRvIGludDMyIGluc3RlYWQKLSAgLy8gICAgICAgb2YgZG91YmxlIGNvbXB1dGF0aW9uIChtYXliZSBzb21ldGhpbmcgZm9yIG9wdGltaXphdGlvbikKLSAgZG91YmxlIHhfYXR0X2V4dGVuZGVkW01fRiArIDJdOwotICB4X2F0dF9leHRlbmRlZFswXSA9IHhfYXR0X2xhc3RbMF07Ci0gIHhfYXR0X2V4dGVuZGVkWzFdID0geF9hdHRfbGFzdFsxXTsKLSAgZG91YmxlKiB4X2F0dCA9ICZ4X2F0dF9leHRlbmRlZFsyXTsKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgTV9GOyBuKyspICAvLyBkb3duc2FtcGxpbmcKLSAgewotICAgIHhfYXR0W25dID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgbSA9IDA7IG0gPCBsYzNDb25maWcuTkYgLyBNX0Y7IG0rKykgewotICAgICAgeF9hdHRbbl0gKz0geF9zW2xjM0NvbmZpZy5ORiAvIE1fRiAqIG4gKyBtXTsKLSAgICB9Ci0gIH0KLSAgeF9hdHRfbGFzdFswXSA9IHhfYXR0W01fRiAtIDJdOwotICB4X2F0dF9sYXN0WzFdID0geF9hdHRbTV9GIC0gMV07Ci0gIGRvdWJsZSogeF9ocCA9IHhfYXR0X2V4dGVuZGVkOyAgICAgLy8ganVzdCBmb3IgaW1wcm92ZSByZWFkYWJpbGl0eQotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBNX0Y7IG4rKykgIC8vIGhpZ2hwYXNzLWZpbHRlcmluZyAoaW4tcGxhY2UhKQotICB7Ci0gICAgeF9ocFtuXSA9IDAuMzc1ICogeF9hdHRbbl0gLSAwLjUgKiB4X2F0dFtuIC0gMV0gKyAwLjEyNSAqIHhfYXR0W24gLSAyXTsKLSAgfQotCi0gIC8vIDMuMy42LjMgRW5lcmd5IGNhbGN1bGF0aW9uICYgMy4zLjYuNCBBdHRhY2sgZGV0ZWN0aW9uIChkMDlyMDZfRmhHKQotICBpbnQ4X3QgUF9hdHQgPSAtMTsKLSAgY29uc3QgdWludDhfdCBOX2Jsb2NrcyA9Ci0gICAgICAobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcykgPyA0IDogMzsgIC8vIE5fbXMvMi41Ci0gIGZvciAodWludDhfdCBuID0gMDsgbiA8IE5fYmxvY2tzOyBuKyspIHsKLSAgICBkb3VibGUgRV9hdHQgPSAwOwotICAgIGZvciAodWludDhfdCBsID0gNDAgKiBuOyBsIDw9ICg0MCAqIG4gKyAzOSk7IGwrKykgewotICAgICAgRV9hdHQgKz0geF9ocFtsXSAqIHhfaHBbbF07Ci0gICAgfQotICAgIGRvdWJsZSBBX2F0dCA9Ci0gICAgICAgICgwLjI1ICogQV9hdHRfbGFzdCA+IEVfYXR0X2xhc3QpID8gMC4yNSAqIEFfYXR0X2xhc3QgOiBFX2F0dF9sYXN0OwotICAgIGlmIChFX2F0dCA+IDguNSAqIEFfYXR0KSB7Ci0gICAgICAvLyBhdHRhY2sgZGV0ZWN0ZWQKLSAgICAgIFBfYXR0ID0gbjsKLSAgICB9Ci0gICAgRV9hdHRfbGFzdCA9IEVfYXR0OwotICAgIEFfYXR0X2xhc3QgPSBBX2F0dDsKLSAgfQotICBjb25zdCB1aW50OF90IFRfYXR0ID0gKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOyAgLy8gZmxvb3IoTl9ibG9ja3MvMikKLSAgRl9hdHQgPSAoUF9hdHQgPj0gMCkgfHwgKFBfYXR0X2xhc3QgPj0gVF9hdHQpOwotICBQX2F0dF9sYXN0ID0gUF9hdHQ7ICAvLyBwcmVwYXJlIG5leHQgZnJhbWUKLX0KLQotdm9pZCBBdHRhY2tEZXRlY3Rvcjo6cmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50cykgewotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJGX2F0dCIsICZGX2F0dCwgc2l6ZW9mKEZfYXR0KSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0F0dGFja0RldGVjdG9yLmhwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9BdHRhY2tEZXRlY3Rvci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmRjODYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0F0dGFja0RldGVjdG9yLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBBdHRhY2tEZXRlY3Rvci5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBVFRBQ0tfREVURUNUT1JfSF8KLSNkZWZpbmUgQVRUQUNLX0RFVEVDVE9SX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIExjM0VuYyB7Ci0KLWNsYXNzIEF0dGFja0RldGVjdG9yIHsKLSBwdWJsaWM6Ci0gIEF0dGFja0RldGVjdG9yKGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXyk7Ci0gIHZpcnR1YWwgfkF0dGFja0RldGVjdG9yKCk7Ci0KLSAgdm9pZCByZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKTsKLQotICB2b2lkIHJ1bihjb25zdCBpbnQxNl90KiBjb25zdCB4X3MsIHVpbnQxNl90IG5ieXRlcyk7Ci0KLSAgY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWc7Ci0gIGNvbnN0IHVpbnQ4X3QgTV9GOwotCi0gIHVpbnQ4X3QgRl9hdHQ7Ci0KLSBwcml2YXRlOgotICBkb3VibGUgeF9hdHRfbGFzdFsyXTsKLSAgZG91YmxlIEVfYXR0X2xhc3Q7Ci0gIGRvdWJsZSBBX2F0dF9sYXN0OwotICBpbnQ4X3QgUF9hdHRfbGFzdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKLQotI2VuZGlmICAvLyBBVFRBQ0tfREVURUNUT1JfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9CYW5kd2lkdGhEZXRlY3Rvci5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvQmFuZHdpZHRoRGV0ZWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWI0NjQ0Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9CYW5kd2lkdGhEZXRlY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIEJhbmR3aWR0aERldGVjdG9yLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQmFuZHdpZHRoRGV0ZWN0b3IuaHBwIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1zdGF0aWMgY29uc3QgdWludDhfdCBJX2J3X3N0YXJ0X3RhYmxlWzVdWzRdID0gewotICAgIHs1MywgMCwgMCwgMH0sICAgIC8vIE5fYnc9MQotICAgIHs0NywgNTksIDAsIDB9LCAgIC8vIE5fYnc9MgotICAgIHs0NCwgNTQsIDYwLCAwfSwgIC8vIE5fYnc9MwotICAgIHs0MSwgNTEsIDU3LCA2MX0gIC8vIE5fYnc9NAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgSV9id19zdG9wX3RhYmxlWzVdWzRdID0gewotICAgIHs2MywgMCwgMCwgMH0sICAgIC8vIE5fYnc9MQotICAgIHs1NiwgNjMsIDAsIDB9LCAgIC8vIE5fYnc9MgotICAgIHs1MiwgNTksIDYzLCAwfSwgIC8vIE5fYnc9MwotICAgIHs0OSwgNTUsIDYwLCA2M30gIC8vIE5fYnc9NAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgSV9id19zdGFydF90YWJsZV83cDVtc1s1XVs0XSA9IHsKLSAgICB7NTEsIDAsIDAsIDB9LCAgICAvLyBOX2J3PTEKLSAgICB7NDUsIDU4LCAwLCAwfSwgICAvLyBOX2J3PTIKLSAgICB7NDIsIDUzLCA2MCwgMH0sICAvLyBOX2J3PTMKLSAgICB7NDAsIDUxLCA1NywgNjF9ICAvLyBOX2J3PTQKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IElfYndfc3RvcF90YWJsZV83cDVtc1s1XVs0XSA9IHsKLSAgICB7NjMsIDAsIDAsIDB9LCAgICAvLyBOX2J3PTEKLSAgICB7NTUsIDYzLCAwLCAwfSwgICAvLyBOX2J3PTIKLSAgICB7NTEsIDU4LCA2MywgMH0sICAvLyBOX2J3PTMKLSAgICB7NDgsIDU1LCA2MCwgNjN9ICAvLyBOX2J3PTQKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IG5iaXRzX2J3X3RhYmxlWzVdID0gewotICAgIDAsIDEsIDIsIDIsIDN9OyAgLy8gc2VlIDMuNC4yLjQgQmFuZHdpZHRoIGludGVycHJldGF0aW9uIChkMDlyMDJfRjJGKQotCi1zdGF0aWMgY29uc3QgdWludDhfdCBUX1FbNF0gPSB7MjAsIDEwLCAxMCwgMTB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3QgVF9DWzRdID0gezE1LCAyMywgMjAsIDIwfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IExfMTBtc1s0XSA9IHs0LCA0LCAzLCAxfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IExfN3A1bXNbNF0gPSB7NCwgNCwgMywgMn07Ci0KLUJhbmR3aWR0aERldGVjdG9yOjpCYW5kd2lkdGhEZXRlY3Rvcihjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18pCi0gICAgOiBsYzNDb25maWcobGMzQ29uZmlnXyksCi0gICAgICBOX2J3KGNhbGNfTl9idyhsYzNDb25maWcuRnNfaW5kKSksCi0gICAgICBuYml0c19idyhuYml0c19id190YWJsZVtjYWxjX05fYncobGMzQ29uZmlnLkZzX2luZCldKSwKLSAgICAgIFBfYncoMCkgewotICBpZiAoTl9idyAhPSAwKSB7Ci0gICAgSV9id19zdGFydCA9IChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zKQotICAgICAgICAgICAgICAgICAgICAgPyBJX2J3X3N0YXJ0X3RhYmxlW05fYncgLSAxXQotICAgICAgICAgICAgICAgICAgICAgOiBJX2J3X3N0YXJ0X3RhYmxlXzdwNW1zW05fYncgLSAxXTsKLSAgICBJX2J3X3N0b3AgPSAobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcykKLSAgICAgICAgICAgICAgICAgICAgPyBJX2J3X3N0b3BfdGFibGVbTl9idyAtIDFdCi0gICAgICAgICAgICAgICAgICAgIDogSV9id19zdG9wX3RhYmxlXzdwNW1zW05fYncgLSAxXTsKLSAgfQotICBMID0gKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpID8gTF8xMG1zIDogTF83cDVtczsKLX0KLQotQmFuZHdpZHRoRGV0ZWN0b3I6On5CYW5kd2lkdGhEZXRlY3RvcigpIHt9Ci0KLXVpbnQ4X3QgQmFuZHdpZHRoRGV0ZWN0b3I6OmNhbGNfTl9idyh1aW50OF90IGZzX2luZCkgewotICAvLyBzZWUgVGFibGUgMy41OiBQYXJhbWV0ZXIgdGFibGUgYmFuZHdpZHRoIGRldGVjdG9yCi0gIC8vIDMuMy41LjIgUGFyYW1ldGVycyAoZDA5cjAyX0YyRikKLSAgcmV0dXJuIGZzX2luZDsKLX0KLQotdm9pZCBCYW5kd2lkdGhEZXRlY3Rvcjo6cnVuKGNvbnN0IGRvdWJsZSogY29uc3QgRV9CKSB7Ci0gIGlmICgwID09IE5fYncpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyAzLjMuNS4xIEFsZ29yaXRobSAoZmlyc3Qgc3RhZ2UpICAoZDA5cjAyX0YyRikKLSAgLy8gTm90ZTogaXQgc2VlbXMgbGlrZSB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbXB1dGUKLSAgLy8gICB0aGUgZW50aXJlIHNwZWNpZmllZCBzZXF1ZW5jZSBvZiBmbGFocyBGX1Fba10KLSAgLy8gICB3aGVuIHdlIHN0YXJ0IHNlYXJjaGluZyBmb3IgYW4gYWN0aXZlIGJhbmQKLSAgLy8gICBmcm9tIHRoZSBoaWdoZXN0IGZlcXVlbmN5IGJhbmQgdG8gbG93ZXIgYmFuZHMKLSAgdWludDhfdCBid18wID0gMDsKLSAgZm9yICh1aW50OF90IGsgPSBOX2J3IC0gMTsgayA8IE5fYnc7IGstLSkgIC8vIHN0b3BzIHdoZW4gMC0tIGdvZXMgdG8gMjU1Ci0gIHsKLSAgICB1aW50OF90IHdpZHRoID0gSV9id19zdG9wW2tdIC0gSV9id19zdGFydFtrXSArIDE7Ci0gICAgZG91YmxlIFEgPSAwLjA7Ci0gICAgZm9yICh1aW50OF90IG4gPSBJX2J3X3N0YXJ0W2tdOyBuIDw9IElfYndfc3RvcFtrXTsgbisrKSB7Ci0gICAgICBRICs9IEVfQltuXSAvIHdpZHRoOwotICAgIH0KLSAgICBpZiAoUSA+PSBUX1Fba10pIHsKLSAgICAgIC8vIGFjdGl2aXR5IGRldGVjdGVkIChub3QgcXVpZXQpIC0+IHRoaXMgaXMgdGhlIGJhbmQgaW5kZXggdG8gYmUgc2VsZWN0ZWQKLSAgICAgIGJ3XzAgPSBrICsgMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIDMuMy41LjEgQWxnb3JpdGhtIChzZWNvbmQgc3RhZ2UpICAoZDA5cjAyX0YyRikKLSAgaWYgKE5fYncgPT0gYndfMCkgewotICAgIFBfYncgPSBid18wOwotICB9IGVsc2UgewotICAgIGRvdWJsZSBDbWF4ID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgbiA9IElfYndfc3RhcnRbYndfMF0gLSBMW2J3XzBdICsgMTsgbiA8PSBJX2J3X3N0YXJ0W2J3XzBdICsgMTsKLSAgICAgICAgIG4rKykgewotICAgICAgZG91YmxlIEMgPSAxMCAqIGxvZzEwKEVfQltuIC0gTFtid18wXV0gLyBFX0Jbbl0pOwotICAgICAgaWYgKEMgPiBDbWF4KSB7Ci0gICAgICAgIENtYXggPSBDOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoQ21heCA+IFRfQ1tid18wXSkgewotICAgICAgUF9idyA9IGJ3XzA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFBfYncgPSBOX2J3OwotICAgIH0KLSAgfQotfQotCi12b2lkIEJhbmR3aWR0aERldGVjdG9yOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKSB7Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIlBfYnciLCAmUF9idywgc2l6ZW9mKFBfYncpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvQmFuZHdpZHRoRGV0ZWN0b3IuaHBwIGIvZW1iZHJ2L2xjMy9FbmNvZGVyL0JhbmR3aWR0aERldGVjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmMmI5Ni4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvQmFuZHdpZHRoRGV0ZWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIEJhbmR3aWR0aERldGVjdG9yLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJBTkRXSURUSF9ERVRFQ1RPUl9IXwotI2RlZmluZSBCQU5EV0lEVEhfREVURUNUT1JfSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLSNpbmNsdWRlICJMYzNDb25maWcuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotY2xhc3MgQmFuZHdpZHRoRGV0ZWN0b3IgewotIHB1YmxpYzoKLSAgQmFuZHdpZHRoRGV0ZWN0b3IoY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWdfKTsKLSAgdmlydHVhbCB+QmFuZHdpZHRoRGV0ZWN0b3IoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpOwotCi0gIHZvaWQgcnVuKGNvbnN0IGRvdWJsZSogY29uc3QgRV9CKTsgIC8vIE5vdGU6IGZzLWRlcGVuZGVudCBOX2Igbm90IG5lZWRlZCBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIG9jY3VycyBvbmx5IGZvciBmcz44MDAwCi0KLSAgc3RhdGljIHVpbnQ4X3QgY2FsY19OX2J3KHVpbnQ4X3QgZnNfaW5kKTsKLQotICBjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZzsKLSAgY29uc3QgdWludDhfdCBOX2J3OwotCi0gIHVpbnQ4X3QgbmJpdHNfYnc7Ci0gIHVpbnQ4X3QgUF9idzsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IHVpbnQ4X3QqIElfYndfc3RhcnQ7Ci0gIGNvbnN0IHVpbnQ4X3QqIElfYndfc3RvcDsKLSAgY29uc3QgdWludDhfdCogTDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKLQotI2VuZGlmICAvLyBCQU5EV0lEVEhfREVURUNUT1JfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9CaXRzdHJlYW1FbmNvZGluZy5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvQml0c3RyZWFtRW5jb2RpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg3NWMxLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9CaXRzdHJlYW1FbmNvZGluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoKLSAqIEJpdHN0cmVhbUVuY29kaW5nLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQml0c3RyZWFtRW5jb2RpbmcuaHBwIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiU25zUXVhbnRpemF0aW9uVGFibGVzLmhwcCIKLSNpbmNsdWRlICJTcGVjdHJhbERhdGFUYWJsZXMuaHBwIgotI2luY2x1ZGUgIlRlbXBvcmFsTm9pc2VTaGFwaW5nVGFibGVzLmhwcCIKLQotbmFtZXNwYWNlIExjM0VuYyB7Ci0KLUJpdHN0cmVhbUVuY29kaW5nOjpCaXRzdHJlYW1FbmNvZGluZyh1aW50MTZfdCBORV8sIHVpbnQxNl90IG5ieXRlc18pCi0gICAgOiBORShORV8pLAotICAgICAgbmJ5dGVzKG5ieXRlc18pLAotICAgICAgbmJpdHMobmJ5dGVzXyAqIDgpLAotICAgICAgYnl0ZXMobnVsbHB0ciksCi0gICAgICBicCgwKSwKLSAgICAgIGJwX3NpZGUoMCksCi0gICAgICBtYXNrX3NpZGUoMCksCi0gICAgICBuYml0c19zaWRlX2luaXRpYWwoMCksCi0gICAgICBubHNicygwKSwKLSAgICAgIGxzYnMobnVsbHB0cikge30KLQotQml0c3RyZWFtRW5jb2Rpbmc6On5CaXRzdHJlYW1FbmNvZGluZygpIHt9Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OndyaXRlX2JpdF9iYWNrd2FyZCh1aW50OF90IGJ5dGVzW10sIHVpbnQxNl90KiBicCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBtYXNrLCB1aW50OF90IGJpdCkgewotICBpZiAoYml0ID09IDApIHsKLSAgICBieXRlc1sqYnBdICY9IH4qbWFzazsKLSAgfSBlbHNlIHsKLSAgICBieXRlc1sqYnBdIHw9ICptYXNrOwotICB9Ci0gIGlmICgqbWFzayA9PSAweDgwKSB7Ci0gICAgKm1hc2sgPSAxOwotICAgICpicCAtPSAxOwotICB9IGVsc2UgewotICAgICptYXNrIDw8PSAxOwotICB9Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OndyaXRlX3VpbnRfYmFja3dhcmQodWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG1hc2ssIHVpbnQxNl90IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1iaXRzKSB7Ci0gIGZvciAodWludDhfdCBrID0gMDsgayA8IG51bWJpdHM7IGsrKykgewotICAgIHVpbnQ4X3QgYml0ID0gdmFsICYgMTsKLSAgICB3cml0ZV9iaXRfYmFja3dhcmQoYnl0ZXMsIGJwLCBtYXNrLCBiaXQpOwotICAgIHZhbCA+Pj0gMTsKLSAgfQotfQotCi12b2lkIEJpdHN0cmVhbUVuY29kaW5nOjp3cml0ZV91aW50X2ZvcndhcmQodWludDhfdCBieXRlc1tdLCB1aW50MTZfdCBicCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWwsIHVpbnQ4X3QgbnVtYml0cykgewotICB1aW50OF90IG1hc2sgPSAweDgwOwotICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPCBudW1iaXRzOyBrKyspIHsKLSAgICB1aW50OF90IGJpdCA9IHZhbCAmIG1hc2s7Ci0gICAgaWYgKGJpdCA9PSAwKSB7Ci0gICAgICBieXRlc1ticF0gJj0gfm1hc2s7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ5dGVzW2JwXSB8PSBtYXNrOwotICAgIH0KLSAgICBtYXNrID4+PSAxOwotICB9Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OmluaXQodWludDhfdCogYnl0ZXNfKSB7Ci0gIC8vIHN0b3JlIHBvaW50ZXIgdG8gY3VycmVudCBvdXRwdXQgYnVmZmVyCi0gIGJ5dGVzID0gYnl0ZXNfOwotICAvLyBhZGRlZCBpbml0aWFsaXphdGlvbiBvZiBieXRlcwotICAvLyBUaGlzIG1pZ2h0IGJlIG5lZWRlZCBmb3IgdGVzdCBwdXJwb3NlIG9ubHksIGJ1dCBpcyBhZGRlZCB0byBiZSBvbiB0aGUgc2FmZQotICAvLyBzaWRlLgotICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbmJ5dGVzOyBrKyspIHsKLSAgICBieXRlc1trXSA9IDA7Ci0gIH0KLQotICAvLyAzLjMuMTMgQml0c3RyZWFtIGVuY29kaW5nICAoZDA5cjAyX0YyRikKLSAgLy8gMy4zLjEzLjIgSW5pdGlhbGl6YXRpb24gIChkMDlyMDJfRjJGKQotICBicCA9IDA7Ci0gIGJwX3NpZGUgPSBuYnl0ZXMgLSAxOwotICBtYXNrX3NpZGUgPSAxOwotICBubHNicyA9IDA7Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OmJhbmR3aWR0aCh1aW50OF90IFBfYncsIHVpbnQ4X3QgbmJpdHNfYncpIHsKLSAgLyogQmFuZHdpZHRoICovCi0gIC8vIGlmICjwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkY/wnZGkID4gMCkKLSAgaWYgKG5iaXRzX2J3ID4gMCkgewotICAgIC8vIHdyaXRlX3VpbnRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCDwnZGD8J2Rj/CdkaQsIPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2Rj/CdkaQpOwotICAgIHdyaXRlX3VpbnRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBQX2J3LCBuYml0c19idyk7Ci0gIH0KLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6bGFzdE5vbnplcm9UdXBsZSh1aW50MTZfdCBsYXN0bnpfdHJ1bmMpIHsKLSAgLyogTGFzdCBub24temVybyB0dXBsZSAqLwotICB3cml0ZV91aW50X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgKGxhc3Ruel90cnVuYyA+PiAxKSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgLy8gY2VpbChsb2cyKPCdkYHwnZC4LzIpKQotICAgICAgICAgICAgICAgICAgICAgIGNlaWwobG9nMihORSAvIDIpKSk7Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OmxzYk1vZGVCaXQodWludDhfdCBsc2JNb2RlKSB7Ci0gIC8qIExTQiBtb2RlIGJpdCAqLwotICB3cml0ZV9iaXRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBsc2JNb2RlKTsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6Z2xvYmFsR2Fpbih1aW50OF90IGdnX2luZCkgewotICAvKiBHbG9iYWwgR2FpbiAqLwotICB3cml0ZV91aW50X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgZ2dfaW5kLCA4KTsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6dG5zQWN0aXZhdGlvbkZsYWcodWludDhfdCBudW1fdG5zX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJjX29yZGVyW10pIHsKLSAgLyogVE5TIGFjdGl2YXRpb24gZmxhZyAqLwotICBmb3IgKHVpbnQ4X3QgZiA9IDA7IGYgPCBudW1fdG5zX2ZpbHRlcnM7IGYrKykgewotICAgIHdyaXRlX2JpdF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKHJjX29yZGVyW2ZdLCBzdGF0aWNfY2FzdDx1aW50OF90PigxKSkpOwotICB9Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OnBpdGNoUHJlc2VudEZsYWcodWludDhfdCBwaXRjaF9wcmVzZW50KSB7Ci0gIC8qIFBpdGNoIHByZXNlbnQgZmxhZyAqLwotICB3cml0ZV9iaXRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBwaXRjaF9wcmVzZW50KTsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6ZW5jb2RlU2NmVnExc3RTdGFnZSh1aW50OF90IGluZF9MRiwgdWludDhfdCBpbmRfSEYpIHsKLSAgLyogRW5jb2RlIFNDRiBWUSBwYXJhbWV0ZXJzIC0gMXN0IHN0YWdlICgxMCBiaXRzKSAqLwotICB3cml0ZV91aW50X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgaW5kX0xGLCA1KTsKLSAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIGluZF9IRiwgNSk7Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OmVuY29kZVNjZlZxMm5kU3RhZ2UoCi0gICAgdWludDhfdCBzaGFwZV9qLCB1aW50OF90IGdhaW5faSwKLSAgICB1aW50OF90IExTX2luZEEsICAvLyB0aGUgdHlwZSBvZiB0aGlzIGlzIHN0cmFuZ2Ugb3ZlciBhbGwgY29kZSBwbGFjZXMgLT4KLSAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IG9ubHkgb25lIGJpdCBpcyBzdG9yZWQhCi0gICAgdWludDMyX3QgaW5kZXhfam9pbnRfaikgewotICAvKiBFbmNvZGUgU0NGIFZRIHBhcmFtZXRlcnMgLSAybmQgc3RhZ2Ugc2lkZS1pbmZvICgzLTQgYml0cykgKi8KLSAgd3JpdGVfYml0X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgc2hhcGVfaiA+PiAxKTsKLSAgLy8gdWludDhfdCBzdWJtb2RlX0xTQiA9IChzaGFwZV9qICYgMHgxKTsgLyogc2hhcGVfaiBpcyB0aGUgc3RhZ2UyIHNoYXBlX2luZGV4Ci0gIC8vIFsw4oCmM10gKi8KLSAgdWludDhfdCBzdWJtb2RlX01TQiA9IChzaGFwZV9qID4+IDEpOwotICB1aW50OF90IGdhaW5fTVNCcyA9Ci0gICAgICBnYWluX2k7IC8qIHdoZXJlIGdhaW5faSBpcyB0aGUgU05TLVZRIHN0YWdlIDIgZ2Fpbl9pbmRleCAqLwotICBnYWluX01TQnMgPSAoZ2Fpbl9NU0JzID4+IHNuc19nYWluTFNCYml0c1tzaGFwZV9qXSk7Ci0gIHdyaXRlX3VpbnRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBnYWluX01TQnMsCi0gICAgICAgICAgICAgICAgICAgICAgc25zX2dhaW5NU0JiaXRzW3NoYXBlX2pdKTsKLSAgd3JpdGVfYml0X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgTFNfaW5kQSk7Ci0KLSAgLyogRW5jb2RlIFNDRiBWUSBwYXJhbWV0ZXJzIC0gMm5kIHN0YWdlIE1QVlEgZGF0YSAqLwotICBpZiAoc3VibW9kZV9NU0IgPT0gMCkgewotICAgIC8qCi0gICAgaWYgKHN1Ym1vZGVfTFNCID09IDApCi0gICAgewotICAgICAgICB0bXAgPSBpbmRleF9qb2ludF8wOyAvLyBFcS4gNTIKLSAgICB9IGVsc2UgewotICAgICAgICB0bXAgPSBpbmRleF9qb2ludF8xOyAvLyBFcS4gNTMKLSAgICB9Ci0gICAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIHRtcCwgMTMpCi0gICAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIHRtcD4+MTMsIDEyKTsKLSAgICAqLwotICAgIHdyaXRlX3VpbnRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBpbmRleF9qb2ludF9qLCAxMyk7Ci0gICAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIGluZGV4X2pvaW50X2ogPj4gMTMsIDEyKTsKLSAgfSBlbHNlIHsKLSAgICAvKgotICAgIGlmIChzdWJtb2RlX0xTQiA9PSAwKQotICAgIHsKLSAgICAgICAgdG1wID0gaW5kZXhfam9pbnRfMjsgLy8gRXEuIDU0Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdG1wID0gaW5kZXhfam9pbnRfMzsgLy8gRXEuIDU1Ci0gICAgfQotICAgIHdyaXRlX3VpbnRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCB0bXAsIDEyKTsKLSAgICB3cml0ZV91aW50X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgdG1wPj4gMTIsIDEyKTsKLSAgICAqLwotICAgIHdyaXRlX3VpbnRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBpbmRleF9qb2ludF9qLCAxMik7Ci0gICAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIGluZGV4X2pvaW50X2ogPj4gMTIsIDEyKTsKLSAgfQotfQotCi12b2lkIEJpdHN0cmVhbUVuY29kaW5nOjpsdHBmRGF0YSh1aW50OF90IGx0cGZfYWN0aXZlLCB1aW50MTZfdCBwaXRjaF9pbmRleCkgewotICAvKiBMVFBGIGRhdGEgKi8KLSAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIGx0cGZfYWN0aXZlLCAxKTsKLSAgd3JpdGVfdWludF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIHBpdGNoX2luZGV4LCA5KTsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6bm9pc2VGYWN0b3IodWludDhfdCBGX05GKSB7Ci0gIC8qIE5vaXNlIEZhY3RvciAqLwotICB3cml0ZV91aW50X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgRl9ORiwgMyk7Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OmFjX2VuY19pbml0KCkgewotICBzdC5sb3cgPSAwOwotICBzdC5yYW5nZSA9IDB4MDBmZmZmZmY7Ci0gIHN0LmNhY2hlID0gLTE7Ci0gIHN0LmNhcnJ5ID0gMDsKLSAgc3QuY2FycnlfY291bnQgPSAwOwotfQotCi12b2lkIEJpdHN0cmVhbUVuY29kaW5nOjphY19zaGlmdCh1aW50OF90IGJ5dGVzW10sIHVpbnQxNl90KiBicCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY19lbmNfc3RhdGUqIHN0KSB7Ci0gIGlmIChzdC0+bG93IDwgMHgwMGZmMDAwMCB8fCBzdC0+Y2FycnkgPT0gMSkgewotICAgIGlmIChzdC0+Y2FjaGUgPj0gMCkgewotICAgICAgYnl0ZXNbKCpicCkrK10gPSAoc3QtPmNhY2hlICsgc3QtPmNhcnJ5KSAmIDB4ZmY7Ci0gICAgfQotICAgIHdoaWxlIChzdC0+Y2FycnlfY291bnQgPiAwKSB7Ci0gICAgICBieXRlc1soKmJwKSsrXSA9IChzdC0+Y2FycnkgKyAweGZmKSAmIDB4ZmY7Ci0gICAgICBzdC0+Y2FycnlfY291bnQgLT0gMTsKLSAgICB9Ci0gICAgc3QtPmNhY2hlID0gc3QtPmxvdyA+PiAxNjsKLSAgICBzdC0+Y2FycnkgPSAwOwotICB9IGVsc2UgewotICAgIHN0LT5jYXJyeV9jb3VudCArPSAxOwotICB9Ci0gIHN0LT5sb3cgPDw9IDg7Ci0gIHN0LT5sb3cgJj0gMHgwMGZmZmZmZjsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6YWNfZW5jb2RlKHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY19lbmNfc3RhdGUqIHN0LCBzaG9ydCBjdW1fZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzeW1fZnJlcSkgewotICB1aW50MzJfdCByID0gc3QtPnJhbmdlID4+IDEwOwotICBzdC0+bG93ICs9IHIgKiBjdW1fZnJlcTsKLSAgaWYgKHN0LT5sb3cgPj4gMjQpIHsKLSAgICBzdC0+Y2FycnkgPSAxOwotICB9Ci0gIHN0LT5sb3cgJj0gMHgwMGZmZmZmZjsKLSAgc3QtPnJhbmdlID0gciAqIHN5bV9mcmVxOwotICB3aGlsZSAoc3QtPnJhbmdlIDwgMHgxMDAwMCkgewotICAgIHN0LT5yYW5nZSA8PD0gODsKLSAgICBhY19zaGlmdChieXRlcywgYnAsIHN0KTsKLSAgfQotfQotCi12b2lkIEJpdHN0cmVhbUVuY29kaW5nOjphY19lbmNfZmluaXNoKHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNfZW5jX3N0YXRlKiBzdCkgewotICBpbnQ4X3QgYml0cyA9IDE7Ci0gIHdoaWxlICgoc3QtPnJhbmdlID4+ICgyNCAtIGJpdHMpKSA9PSAwKSB7Ci0gICAgYml0cysrOwotICB9Ci0gIHVpbnQzMl90IG1hc2sgPSAweDAwZmZmZmZmID4+IGJpdHM7Ci0gIHVpbnQzMl90IHZhbCA9IHN0LT5sb3cgKyBtYXNrOwotICB1aW50OF90IG92ZXIxID0gdmFsID4+IDI0OwotICB2YWwgJj0gMHgwMGZmZmZmZjsKLSAgdWludDMyX3QgaGlnaCA9IHN0LT5sb3cgKyBzdC0+cmFuZ2U7Ci0gIHVpbnQ4X3Qgb3ZlcjIgPSBoaWdoID4+IDI0OwotICBoaWdoICY9IDB4MDBmZmZmZmY7Ci0gIHZhbCA9IHZhbCAmIH5tYXNrOwotICBpZiAob3ZlcjEgPT0gb3ZlcjIpIHsKLSAgICBpZiAodmFsICsgbWFzayA+PSBoaWdoKSB7Ci0gICAgICBiaXRzICs9IDE7Ci0gICAgICBtYXNrID4+PSAxOwotICAgICAgdmFsID0gKChzdC0+bG93ICsgbWFzaykgJiAweDAwZmZmZmZmKSAmIH5tYXNrOwotICAgIH0KLSAgICBpZiAodmFsIDwgc3QtPmxvdykgewotICAgICAgc3QtPmNhcnJ5ID0gMTsKLSAgICB9Ci0gIH0KLSAgc3QtPmxvdyA9IHZhbDsKLSAgZm9yICg7IGJpdHMgPiAwOyBiaXRzIC09IDgpIHsKLSAgICBhY19zaGlmdChieXRlcywgYnAsIHN0KTsKLSAgfQotICBiaXRzICs9IDg7Ci0gIGlmIChzdC0+Y2FycnlfY291bnQgPiAwKSB7Ci0gICAgYnl0ZXNbKCpicCkrK10gPSBzdC0+Y2FjaGU7Ci0gICAgZm9yICg7IHN0LT5jYXJyeV9jb3VudCA+IDE7IHN0LT5jYXJyeV9jb3VudC0tKSB7Ci0gICAgICBieXRlc1soKmJwKSsrXSA9IDB4ZmY7Ci0gICAgfQotICAgIHdyaXRlX3VpbnRfZm9yd2FyZChieXRlcywgKmJwLCAweGZmID4+ICg4IC0gYml0cyksIGJpdHMpOwotICB9IGVsc2UgewotICAgIHdyaXRlX3VpbnRfZm9yd2FyZChieXRlcywgKmJwLCBzdC0+Y2FjaGUsIGJpdHMpOwotICB9Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OnRuc0RhdGEodWludDhfdCB0bnNfbHBjX3dlaWdodGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fdG5zX2ZpbHRlcnMsIHVpbnQ4X3QgcmNfb3JkZXJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByY19pW10pIHsKLSAgLyogVE5TIGRhdGEgKi8KLSAgZm9yICh1aW50OF90IGYgPSAwOyBmIDwgbnVtX3Ruc19maWx0ZXJzOyBmKyspIHsKLSAgICAvLyBpZiAo8J2Rn/CdkZDwnZGc8J2Rn/CdkZHwnZGS8J2RnyAo8J2RkykgPiAwKQotICAgIGlmIChyY19vcmRlcltmXSA+IDApIHsKLSAgICAgIGFjX2VuY29kZShieXRlcywgJmJwLCAmc3QsCi0gICAgICAgICAgICAgICAgLy8gYWNfdG5zX29yZGVyX2N1bWZyZXFbdG5zX2xwY193ZWlnaHRpbmddWyDwnZGf8J2RkPCdkZzwnZGf8J2RkfCdkZLwnZGfICjwnZGTKS0xXSwKLSAgICAgICAgICAgICAgICBhY190bnNfb3JkZXJfY3VtZnJlcVt0bnNfbHBjX3dlaWdodGluZ11bcmNfb3JkZXJbZl0gLSAxXSwKLSAgICAgICAgICAgICAgICAvLyBhY190bnNfb3JkZXJfZnJlcVt0bnNfbHBjX3dlaWdodGluZ11bIPCdkZ/wnZGQ8J2RnPCdkZ/wnZGR8J2RkvCdkZ8gKPCdkZMpLTFdCi0gICAgICAgICAgICAgICAgYWNfdG5zX29yZGVyX2ZyZXFbdG5zX2xwY193ZWlnaHRpbmddW3JjX29yZGVyW2ZdIC0gMV0pOwotICAgICAgLy8gZm9yIChrID0gMDsgayA8IPCdkZ/wnZGQ8J2RnPCdkZ/wnZGR8J2RkvCdkZ8gKPCdkZMpOyBrKyspCi0gICAgICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPCByY19vcmRlcltmXTsgaysrKSB7Ci0gICAgICAgIGFjX2VuY29kZShieXRlcywgJmJwLCAmc3QsCi0gICAgICAgICAgICAgICAgICAvLyBhY190bnNfY29lZl9jdW1mcmVxW2tdW/CdkZ/wnZGQ8J2RliAo8J2RmCwg8J2RkyldLAotICAgICAgICAgICAgICAgICAgYWNfdG5zX2NvZWZfY3VtZnJlcVtrXVtyY19pW2sgKyA4ICogZl1dLAotICAgICAgICAgICAgICAgICAgLy8gYWNfdG5zX2NvZWZfZnJlcVtrXVvwnZGf8J2RkPCdkZYgKPCdkZgsIPCdkZMpXQotICAgICAgICAgICAgICAgICAgYWNfdG5zX2NvZWZfZnJlcVtrXVtyY19pW2sgKyA4ICogZl1dKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdWludDE2X3QgQml0c3RyZWFtRW5jb2Rpbmc6Om5iaXRzX3NpZGVfd3JpdHRlbigpIHsKLSAgcmV0dXJuIG5iaXRzIC0gKDggKiBicF9zaWRlICsgOCAtIGxvZzIobWFza19zaWRlKSk7Ci19Ci0KLXZvaWQgQml0c3RyZWFtRW5jb2Rpbmc6OnNwZWN0cmFsRGF0YSh1aW50MTZfdCBsYXN0bnpfdHJ1bmMsIHVpbnQxNl90IHJhdGVGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbHNiTW9kZSwgaW50MTZfdCogWF9xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5iaXRzX2xzYiwgdWludDhfdCogbHNic18pIHsKLSAgbmJpdHNfc2lkZV9pbml0aWFsID0gbmJpdHNfc2lkZV93cml0dGVuKCk7Ci0gIGxzYnMgPSBsc2JzXzsgIC8vIHN0b3JlIHRoaXMgcG9pbnRlciBmb3Igc3Vic2VxdWVudCB1c2UgaW4KLSAgICAgICAgICAgICAgICAgLy8gcmVzaWR1YWxEYXRhQW5kRmluYWxpemF0aW9uCi0gIC8qIFNwZWN0cmFsIGRhdGEgKi8KLSAgdWludDE2X3QgYyA9IDA7Ci0gIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBsYXN0bnpfdHJ1bmM7IGsgKz0gMikgewotICAgIHVpbnQxNl90IHQgPSBjICsgcmF0ZUZsYWc7Ci0gICAgLy8gaWYgKGsgPiDwnZGB8J2QuC8yKQotICAgIGlmIChrID4gTkUgLyAyKSB7Ci0gICAgICB0ICs9IDI1NjsKLSAgICB9Ci0gICAgLy8gYSA9IGFicyjwnZGL8J2RnltrXSk7Ci0gICAgdWludDE2X3QgYSA9IGFicyhYX3Fba10pOwotICAgIHVpbnQxNl90IGFfbHNiID0gYTsKLSAgICAvLyBiID0gYWJzKPCdkYvwnZGeW2srMV0pOwotICAgIHVpbnQxNl90IGIgPSBhYnMoWF9xW2sgKyAxXSk7Ci0gICAgdWludDE2X3QgYl9sc2IgPSBiOwotICAgIHVpbnQ4X3QgbGV2ID0gMDsKLSAgICB1aW50OF90IGxzYjAgPSAwOwotICAgIHVpbnQ4X3QgbHNiMSA9IDA7Ci0gICAgLy8gd2hpbGUgKG1heChhLGIpID49IDQpCi0gICAgdWludDhfdCBwa2k7Ci0gICAgd2hpbGUgKHN0ZDo6bWF4KGEsIGIpID49IDQpIHsKLSAgICAgIC8vIHBraSA9IGFjX3NwZWNfbG9va3VwW3QrbWluKGxldiwzKSoxMDI0XTsKLSAgICAgIHBraSA9IGFjX3NwZWNfbG9va3VwW3QgKyBzdGQ6Om1pbihsZXYsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDMpKSAqIDEwMjRdOwotICAgICAgYWNfZW5jb2RlKGJ5dGVzLCAmYnAsICZzdCwgYWNfc3BlY19jdW1mcmVxW3BraV1bMTZdLAotICAgICAgICAgICAgICAgIGFjX3NwZWNfZnJlcVtwa2ldWzE2XSk7Ci0gICAgICBpZiAoKGxzYk1vZGUgPT0gMSkgJiYgKGxldiA9PSAwKSkgewotICAgICAgICBsc2IwID0gYSAmIDE7Ci0gICAgICAgIGxzYjEgPSBiICYgMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdyaXRlX2JpdF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIGEgJiAxKTsKLSAgICAgICAgd3JpdGVfYml0X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgYiAmIDEpOwotICAgICAgfQotICAgICAgYSA+Pj0gMTsKLSAgICAgIGIgPj49IDE7Ci0gICAgICBsZXYrKzsKLSAgICB9Ci0gICAgcGtpID0gYWNfc3BlY19sb29rdXBbdCArIHN0ZDo6bWluKGxldiwgc3RhdGljX2Nhc3Q8dWludDhfdD4oMykpICogMTAyNF07Ci0gICAgdWludDE2X3Qgc3ltID0gYSArIDQgKiBiOwotICAgIGFjX2VuY29kZShieXRlcywgJmJwLCAmc3QsIGFjX3NwZWNfY3VtZnJlcVtwa2ldW3N5bV0sCi0gICAgICAgICAgICAgIGFjX3NwZWNfZnJlcVtwa2ldW3N5bV0pOwotICAgIC8vIGFfbHNiID0gYWJzKPCdkYvwnZGeW2tdKTsgLT4gaW1wbGVtZW50ZWQgZWFybGllcgotICAgIC8vIGJfbHNiID0gYWJzKPCdkYvwnZGeW2srMV0pOyAtPiBpbXBsZW1lbnRlZCBlYXJsaWVyCi0gICAgaWYgKChsc2JNb2RlID09IDEpICYmIChsZXYgPiAwKSkgewotICAgICAgYV9sc2IgPj49IDE7Ci0gICAgICBiX2xzYiA+Pj0gMTsKLSAgICAgIGxzYnNbbmxzYnMrK10gPSBsc2IwOwotICAgICAgLy8gaWYgKGFfbHNiID09IDAgJiYg8J2Ri/CdkZ5ba10gIT0gMCkKLSAgICAgIGlmIChhX2xzYiA9PSAwICYmIFhfcVtrXSAhPSAwKSB7Ci0gICAgICAgIC8vIGxzYnNbbmxzYnMrK10gPSDwnZGL8J2RnltrXT4wPzA6MTsKLSAgICAgICAgbHNic1tubHNicysrXSA9IFhfcVtrXSA+IDAgPyAwIDogMTsKLSAgICAgIH0KLSAgICAgIGxzYnNbbmxzYnMrK10gPSBsc2IxOwotICAgICAgLy8gaWYgKGJfbHNiID09IDAgJiYg8J2Ri/CdkZ5baysxXSAhPSAwKQotICAgICAgaWYgKGJfbHNiID09IDAgJiYgWF9xW2sgKyAxXSAhPSAwKSB7Ci0gICAgICAgIC8vIGxzYnNbbmxzYnMrK10gPSDwnZGL8J2RnltrKzFdPjA/MDoxOwotICAgICAgICBsc2JzW25sc2JzKytdID0gWF9xW2sgKyAxXSA+IDAgPyAwIDogMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGFfbHNiID4gMCkgewotICAgICAgLy8gd3JpdGVfYml0X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwg8J2Ri/CdkZ5ba10+MD8wOjEpOwotICAgICAgd3JpdGVfYml0X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwgWF9xW2tdID4gMCA/IDAgOiAxKTsKLSAgICB9Ci0gICAgaWYgKGJfbHNiID4gMCkgewotICAgICAgLy8gd3JpdGVfYml0X2JhY2t3YXJkKGJ5dGVzLCAmYnBfc2lkZSwgJm1hc2tfc2lkZSwg8J2Ri/CdkZ5baysxXT4wPzA6MSk7Ci0gICAgICB3cml0ZV9iaXRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBYX3FbayArIDFdID4gMCA/IDAgOiAxKTsKLSAgICB9Ci0gICAgLy8gbGV2ID0gbWluKGxldiwzKTsKLSAgICBsZXYgPSBzdGQ6Om1pbihsZXYsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDMpKTsKLSAgICBpZiAobGV2IDw9IDEpIHsKLSAgICAgIHQgPSAxICsgKGEgKyBiKSAqIChsZXYgKyAxKTsKLSAgICB9IGVsc2UgewotICAgICAgdCA9IDEyICsgbGV2OwotICAgIH0KLSAgICBjID0gKGMgJiAxNSkgKiAxNiArIHQ7Ci0gIH0KLX0KLQotLy8gbmJpdHNfYXJpIGZvcmVjYXN0IHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgb25seSBmaW5hbGl6YXRpb24gd2lsbCBiZSBhZGRlZAotdWludDE2X3QgQml0c3RyZWFtRW5jb2Rpbmc6Om5iaXRzX2FyaV9mb3JlY2FzdCgpIHsKLSAgdWludDE2X3QgbmJpdHNfYXJpID0gYnAgKiA4OwotICBuYml0c19hcmkgKz0gMjUgLSBmbG9vcihsb2cyKHN0LnJhbmdlKSk7Ci0gIGlmIChzdC5jYWNoZSA+PSAwKSB7Ci0gICAgbmJpdHNfYXJpICs9IDg7Ci0gIH0KLSAgaWYgKHN0LmNhcnJ5X2NvdW50ID4gMCkgewotICAgIG5iaXRzX2FyaSArPSBzdC5jYXJyeV9jb3VudCAqIDg7Ci0gIH0KLSAgcmV0dXJuIG5iaXRzX2FyaTsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6cmVzaWR1YWxEYXRhQW5kRmluYWxpemF0aW9uKHVpbnQ4X3QgbHNiTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuYml0c19yZXNpZHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZXNfYml0cykgewotICAvKiBSZXNpZHVhbCBiaXRzICovCi0gIC8vIHVpbnQxNl90IG5iaXRzX3NpZGUgPSBuYml0cyAtICg4ICogYnBfc2lkZSArIDggLSBsb2cyKG1hc2tfc2lkZSkpOwotICB1aW50MTZfdCBuYml0c19zaWRlID0gbmJpdHNfc2lkZV93cml0dGVuKCk7Ci0gIHVpbnQxNl90IG5iaXRzX2FyaSA9IG5iaXRzX2FyaV9mb3JlY2FzdCgpOwotICB1aW50MTZfdCBuYml0c19yZXNpZHVhbF9lbmMgPSBuYml0cyAtIChuYml0c19zaWRlICsgbmJpdHNfYXJpKTsKLSAgaWYgKCpyZWludGVycHJldF9jYXN0PGludDE2X3QqPigmbmJpdHNfcmVzaWR1YWxfZW5jKSA8IDApIHsKLSAgICBuYml0c19yZXNpZHVhbF9lbmMgPSAwOwotICB9Ci0gIGlmIChsc2JNb2RlID09IDApIHsKLSAgICBuYml0c19yZXNpZHVhbF9lbmMgPSBzdGQ6Om1pbihuYml0c19yZXNpZHVhbF9lbmMsIG5iaXRzX3Jlc2lkdWFsKTsKLSAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbmJpdHNfcmVzaWR1YWxfZW5jOyBrKyspIHsKLSAgICAgIHdyaXRlX2JpdF9iYWNrd2FyZChieXRlcywgJmJwX3NpZGUsICZtYXNrX3NpZGUsIHJlc19iaXRzW2tdKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbmJpdHNfcmVzaWR1YWxfZW5jID0gc3RkOjptaW4obmJpdHNfcmVzaWR1YWxfZW5jLCBubHNicyk7Ci0gICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8IG5iaXRzX3Jlc2lkdWFsX2VuYzsgaysrKSB7Ci0gICAgICB3cml0ZV9iaXRfYmFja3dhcmQoYnl0ZXMsICZicF9zaWRlLCAmbWFza19zaWRlLCBsc2JzW2tdKTsKLSAgICB9Ci0gIH0KLQotICAvKiBBcml0aG1ldGljIEVuY29kZXIgRmluYWxpemF0aW9uICovCi0gIGFjX2VuY19maW5pc2goYnl0ZXMsICZicCwgJnN0KTsKLX0KLQotdm9pZCBCaXRzdHJlYW1FbmNvZGluZzo6cmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50cykgewotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJuYnl0ZXMiLCAmbmJ5dGVzLCBzaXplb2YobmJ5dGVzKSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0JpdHN0cmVhbUVuY29kaW5nLmhwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9CaXRzdHJlYW1FbmNvZGluZy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmU5NzIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0JpdHN0cmVhbUVuY29kaW5nLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQml0c3RyZWFtRW5jb2RpbmcuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQklUU1RSRUFNX0VOQ09ESU5HX0hfCi0jZGVmaW5lIEJJVFNUUkVBTV9FTkNPRElOR19IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotY2xhc3MgQml0c3RyZWFtRW5jb2RpbmcgewotIHB1YmxpYzoKLSAgQml0c3RyZWFtRW5jb2RpbmcodWludDE2X3QgTkVfLCB1aW50MTZfdCBuYnl0ZXNfKTsKLSAgdmlydHVhbCB+Qml0c3RyZWFtRW5jb2RpbmcoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHMpOwotCi0gIHZvaWQgaW5pdCh1aW50OF90KiBieXRlc18pOwotICB2b2lkIGJhbmR3aWR0aCh1aW50OF90IFBfYncsIHVpbnQ4X3QgbmJpdHNfYncpOwotICB2b2lkIGxhc3ROb256ZXJvVHVwbGUodWludDE2X3QgbGFzdG56X3RydW5jKTsKLSAgdm9pZCBsc2JNb2RlQml0KHVpbnQ4X3QgbHNiTW9kZSk7Ci0gIHZvaWQgZ2xvYmFsR2Fpbih1aW50OF90IGdnX2luZCk7Ci0gIHZvaWQgdG5zQWN0aXZhdGlvbkZsYWcodWludDhfdCBudW1fdG5zX2ZpbHRlcnMsIHVpbnQ4X3QgcmNfb3JkZXJbXSk7Ci0gIHZvaWQgcGl0Y2hQcmVzZW50RmxhZyh1aW50OF90IHBpdGNoX3ByZXNlbnQpOwotICB2b2lkIGVuY29kZVNjZlZxMXN0U3RhZ2UodWludDhfdCBpbmRfTEYsIHVpbnQ4X3QgaW5kX0hGKTsKLSAgdm9pZCBlbmNvZGVTY2ZWcTJuZFN0YWdlKHVpbnQ4X3Qgc2hhcGVfaiwgdWludDhfdCBnYWluX2ksIHVpbnQ4X3QgTFNfaW5kQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4X2pvaW50X2opOwotICB2b2lkIGx0cGZEYXRhKHVpbnQ4X3QgbHRwZl9hY3RpdmUsIHVpbnQxNl90IHBpdGNoX2luZGV4KTsKLSAgdm9pZCBub2lzZUZhY3Rvcih1aW50OF90IEZfTkYpOwotCi0gIHZvaWQgYWNfZW5jX2luaXQoKTsKLSAgdm9pZCB0bnNEYXRhKHVpbnQ4X3QgdG5zX2xwY193ZWlnaHRpbmcsIHVpbnQ4X3QgbnVtX3Ruc19maWx0ZXJzLAotICAgICAgICAgICAgICAgdWludDhfdCByY19vcmRlcltdLCB1aW50OF90IHJjX2lbXSk7Ci0gIHZvaWQgc3BlY3RyYWxEYXRhKHVpbnQxNl90IGxhc3Ruel90cnVuYywgdWludDE2X3QgcmF0ZUZsYWcsIHVpbnQ4X3QgbHNiTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogWF9xLCB1aW50MTZfdCBuYml0c19sc2IsIHVpbnQ4X3QqIGxzYnNfKTsKLSAgdm9pZCByZXNpZHVhbERhdGFBbmRGaW5hbGl6YXRpb24odWludDhfdCBsc2JNb2RlLCB1aW50MTZfdCBuYml0c19yZXNpZHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmVzX2JpdHMpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCB3cml0ZV9iaXRfYmFja3dhcmQodWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsIHVpbnQ4X3QqIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0KTsKLSAgdm9pZCB3cml0ZV91aW50X2JhY2t3YXJkKHVpbnQ4X3QgYnl0ZXNbXSwgdWludDE2X3QqIGJwLCB1aW50OF90KiBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmFsLCB1aW50OF90IG51bWJpdHMpOwotICB2b2lkIHdyaXRlX3VpbnRfZm9yd2FyZCh1aW50OF90IGJ5dGVzW10sIHVpbnQxNl90IGJwLCB1aW50MTZfdCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYml0cyk7Ci0KLSAgc3RydWN0IGFjX2VuY19zdGF0ZSB7Ci0gICAgdWludDMyX3QgbG93OwotICAgIHVpbnQzMl90IHJhbmdlOwotICAgIGludDMyX3QgY2FjaGU7Ci0gICAgaW50MzJfdCBjYXJyeTsKLSAgICBpbnQzMl90IGNhcnJ5X2NvdW50OwotICB9OwotCi0gIHZvaWQgYWNfc2hpZnQodWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsIHN0cnVjdCBhY19lbmNfc3RhdGUqIHN0KTsKLSAgdm9pZCBhY19lbmNvZGUodWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsIHN0cnVjdCBhY19lbmNfc3RhdGUqIHN0LAotICAgICAgICAgICAgICAgICBzaG9ydCBjdW1fZnJlcSwgc2hvcnQgc3ltX2ZyZXEpOwotICB2b2lkIGFjX2VuY19maW5pc2godWludDhfdCBieXRlc1tdLCB1aW50MTZfdCogYnAsIHN0cnVjdCBhY19lbmNfc3RhdGUqIHN0KTsKLQotICB1aW50MTZfdCBuYml0c19zaWRlX3dyaXR0ZW4oKTsKLSAgdWludDE2X3QgbmJpdHNfYXJpX2ZvcmVjYXN0KCk7Ci0gIHVpbnQxNl90IG5iaXRzX3NwZWNfd3JpdHRlbigpOwotCi0gcHVibGljOgotICBjb25zdCB1aW50MTZfdCBORTsKLSAgY29uc3QgdWludDE2X3QgbmJ5dGVzOwotICBjb25zdCB1aW50MTZfdCBuYml0czsKLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3QqIGJ5dGVzOwotICB1aW50MTZfdCBicDsKLSAgdWludDE2X3QgYnBfc2lkZTsKLSAgdWludDhfdCBtYXNrX3NpZGU7Ci0gIHVpbnQxNl90IG5iaXRzX3NpZGVfaW5pdGlhbDsKLSAgdWludDE2X3QgbmxzYnM7Ci0gIHVpbnQ4X3QqIGxzYnM7Ci0gIHN0cnVjdCBhY19lbmNfc3RhdGUgc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCi0KLSNlbmRpZiAgLy8gQklUU1RSRUFNX0VOQ09ESU5HX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvRW5jb2RlckZyYW1lLmNwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9FbmNvZGVyRnJhbWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcwMjA4Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9FbmNvZGVyRnJhbWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBFbmNvZGVyRnJhbWUuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJFbmNvZGVyRnJhbWUuaHBwIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotbmFtZXNwYWNlIExjM0VuYyB7Ci0KLUVuY29kZXJGcmFtZTo6RW5jb2RlckZyYW1lKE1kY3RFbmMmIG1kY3RFbmNfLCBBdHRhY2tEZXRlY3RvciYgYXR0YWNrRGV0ZWN0b3JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3RyYWxOb2lzZVNoYXBpbmcmIHNwZWN0cmFsTm9pc2VTaGFwaW5nXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBvcmFsTm9pc2VTaGFwaW5nJiB0ZW1wb3JhbE5vaXNlU2hhcGluZ18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdHJhbFF1YW50aXphdGlvbiYgc3BlY3RyYWxRdWFudGl6YXRpb25fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9pc2VMZXZlbEVzdGltYXRpb24mIG5vaXNlTGV2ZWxFc3RpbWF0aW9uXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXywgdWludDE2X3QgbmJ5dGVzXykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIG5ieXRlcyhuYnl0ZXNfKSwKLSAgICAgIGRhdGFwb2ludHMobnVsbHB0ciksCi0gICAgICBtZGN0RW5jKG1kY3RFbmNfKSwKLSAgICAgIGJhbmR3aWR0aERldGVjdG9yKGxjM0NvbmZpZyksCi0gICAgICBhdHRhY2tEZXRlY3RvcihhdHRhY2tEZXRlY3Rvcl8pLAotICAgICAgc3BlY3RyYWxOb2lzZVNoYXBpbmcoc3BlY3RyYWxOb2lzZVNoYXBpbmdfKSwKLSAgICAgIHRlbXBvcmFsTm9pc2VTaGFwaW5nKHRlbXBvcmFsTm9pc2VTaGFwaW5nXyksCi0gICAgICBsb25nVGVybVBvc3RmaWx0ZXIobGMzQ29uZmlnLCBuYnl0ZXNfICogOCksCi0gICAgICBzcGVjdHJhbFF1YW50aXphdGlvbihzcGVjdHJhbFF1YW50aXphdGlvbl8pLAotICAgICAgbm9pc2VMZXZlbEVzdGltYXRpb24obm9pc2VMZXZlbEVzdGltYXRpb25fKSwKLSAgICAgIGJpdHN0cmVhbUVuY29kaW5nKGxjM0NvbmZpZy5ORSwgbmJ5dGVzKSwKLSAgICAgIGZyYW1lTigwKSB7fQotCi1FbmNvZGVyRnJhbWU6On5FbmNvZGVyRnJhbWUoKSB7fQotCi12b2lkIEVuY29kZXJGcmFtZTo6bGlua1ByZXZpb3VzRnJhbWUoRW5jb2RlckZyYW1lKiBwcmV2aW91c0ZyYW1lKSB7Ci0gIGlmIChOVUxMICE9IHByZXZpb3VzRnJhbWUpIHsKLSAgICBsb25nVGVybVBvc3RmaWx0ZXIgPSBwcmV2aW91c0ZyYW1lLT5sb25nVGVybVBvc3RmaWx0ZXI7Ci0gICAgdGhpcy0+ZnJhbWVOID0gcHJldmlvdXNGcmFtZS0+ZnJhbWVOOwotICB9Ci19Ci0KLXZvaWQgRW5jb2RlckZyYW1lOjpydW4oY29uc3QgaW50MTZfdCogeF9zLCB1aW50OF90KiBieXRlcykgewotICAvLyBpbmNyZW1lbnQgZnJhbWUgY291bnRlcgotICBmcmFtZU4rKzsKLQotICAvLyAzLjMuMyBJbnB1dCBzaWduYWwgc2NhbGluZyAoZDA5cjAyX0YyRikKLSAgLy8gLT4gc2hvdWxkIGJlIG1hZGUgaW4gY2FsbGluZyBjb2RlIGR1ZSB0byBkaWZmZXJlbnQgZGF0YSB0eXBlcyBiZWluZyBuZWVkZWQKLQotICAvLyAzLjMuNCBMb3cgZGVsYXkgTURDVCBhbmFseXNpcyAgIChkMDlyMDJfRjJGKQotICBtZGN0RW5jLnJ1bih4X3MpOwotCi0gIC8vIDMuMy41IEJhbmR3aWR0aCBkZXRlY3RvciAgIChkMDlyMDJfRjJGKQotICBiYW5kd2lkdGhEZXRlY3Rvci5ydW4obWRjdEVuYy5FX0IpOwotCi0gIC8vIDMuMy42IFRpbWUgZG9tYWluIGF0dGFjayBkZXRlY3RvciAgIChkMDlyMDJfRjJGKQotICBhdHRhY2tEZXRlY3Rvci5ydW4oeF9zLCBuYnl0ZXMpOwotCi0gIC8vIDMuMy43IFNwZWN0cmFsIE5vaXNlIFNoYXBpbmcgKFNOUykgICAoZDA5cjAyX0YyRikKLSAgc3BlY3RyYWxOb2lzZVNoYXBpbmcucnVuKG1kY3RFbmMuWCwgbWRjdEVuYy5FX0IsIGF0dGFja0RldGVjdG9yLkZfYXR0KTsKLQotICAvLyAzLjMuOCBUZW1wb3JhbCBOb2lzZSBTaGFwaW5nIChUTlMpICAgKGQwOXIwMl9GMkYpCi0gIGNvbnN0IHVpbnQxNl90IG5iaXRzID0gbmJ5dGVzICogODsKLSAgdGVtcG9yYWxOb2lzZVNoYXBpbmcucnVuKHNwZWN0cmFsTm9pc2VTaGFwaW5nLlhfUywgYmFuZHdpZHRoRGV0ZWN0b3IuUF9idywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iaXRzLCBtZGN0RW5jLm5lYXJfbnlxdWlzdF9mbGFnKTsKLQotICAvLyAzLjMuOSBMb25nIFRlcm0gUG9zdGZpbHRlciAgKGQwOXIwMl9GMkYpCi0gIGxvbmdUZXJtUG9zdGZpbHRlci5ydW4oeF9zLCBtZGN0RW5jLm5lYXJfbnlxdWlzdF9mbGFnKTsKLQotICAvLyAzLjMuMTAgU3BlY3RyYWwgcXVhbnRpemF0aW9uICAoZDA5cjAyX0YyRikKLSAgLy8gMy4zLjEwLjEgQml0IGJ1ZGdldCAgKGQwOXIwMl9GMkYpCi0gIHVpbnQxNl90IG5iaXRzX2FyaSA9IGNlaWwobG9nMihsYzNDb25maWcuTkUgLyAyKSk7Ci0gIGlmIChuYml0cyA8PSAxMjgwKSB7Ci0gICAgbmJpdHNfYXJpICs9IDM7Ci0gIH0gZWxzZSBpZiAobmJpdHMgPD0gMjU2MCkgewotICAgIG5iaXRzX2FyaSArPSA0OwotICB9IGVsc2UgewotICAgIG5iaXRzX2FyaSArPSA1OwotICB9Ci0KLSAgY29uc3QgdWludDhfdCBuYml0c19nYWluID0gODsKLSAgY29uc3QgdWludDhfdCBuYml0c19uZiA9IDM7Ci0gIHVpbnQxNl90IG5iaXRzX3NwZWMgPQotICAgICAgbmJpdHMgLSAoYmFuZHdpZHRoRGV0ZWN0b3IubmJpdHNfYncgKyB0ZW1wb3JhbE5vaXNlU2hhcGluZy5uYml0c19UTlMgKwotICAgICAgICAgICAgICAgbG9uZ1Rlcm1Qb3N0ZmlsdGVyLm5iaXRzX0xUUEYgKyBzcGVjdHJhbE5vaXNlU2hhcGluZy5uYml0c19TTlMgKwotICAgICAgICAgICAgICAgbmJpdHNfZ2FpbiArIG5iaXRzX25mICsgbmJpdHNfYXJpKTsKLSAgc3BlY3RyYWxRdWFudGl6YXRpb24ucnVuKHRlbXBvcmFsTm9pc2VTaGFwaW5nLlhfZiwgbmJpdHMsIG5iaXRzX3NwZWMpOwotCi0gIC8vIDMuMy4xMSBSZXNpZHVhbCBjb2RpbmcgIChkMDlyMDJfRjJGKQotICAvLyBuYml0c19yZXNpZHVhbF9tYXggPSDwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkaDwnZGd8J2RkvCdkZAgLSDwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkaHwnZGf8J2RovCdkZvwnZGQICsgNDsKLSAgaW50MTZfdCBuYml0c19yZXNpZHVhbF9tYXggPQotICAgICAgbmJpdHNfc3BlYyAtIHNwZWN0cmFsUXVhbnRpemF0aW9uLm5iaXRzX3RydW5jICsgNDsKLSAgaWYgKG5iaXRzX3Jlc2lkdWFsX21heCA8IDApIHsKLSAgICBuYml0c19yZXNpZHVhbF9tYXggPSAwOwotICB9Ci0gIHVpbnQxNl90IG5iaXRzX3Jlc2lkdWFsID0gMDsKLSAgdWludDhfdAotICAgICAgcmVzX2JpdHNbbmJpdHNfcmVzaWR1YWxfbWF4XTsgIC8vIFRPRE8gY2hlY2sgd2hldGhlciB0aGUgZGVnZW5lcmF0ZWQgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggbmJpdHNfcmVzaWR1YWxfbWF4PT0wIHdvcmtzCi0gIGlmIChuYml0c19yZXNpZHVhbF9tYXggPgotICAgICAgMCkgeyAgLy8gY29udmVydGVkIHBzZXVkby1jb2RlIGZyb20gcGFnZSA1NCAgKGQwOXIwMl9GMkYpCi0gICAgdWludDE2X3QgayA9IDA7Ci0gICAgd2hpbGUgKChrIDwgc3BlY3RyYWxRdWFudGl6YXRpb24uTkUpICYmCi0gICAgICAgICAgIChuYml0c19yZXNpZHVhbCA8IG5iaXRzX3Jlc2lkdWFsX21heCkpIHsKLSAgICAgIC8vIGlmICjwnZGL8J2RnltrXSE9IDApCi0gICAgICBpZiAoc3BlY3RyYWxRdWFudGl6YXRpb24uWF9xW2tdICE9IDApIHsKLSAgICAgICAgLy8gaWYgKPCdkYvwnZGTW2tdID49IPCdkYvwnZGeW2tdKmdnKQotICAgICAgICBpZiAodGVtcG9yYWxOb2lzZVNoYXBpbmcuWF9mW2tdID49Ci0gICAgICAgICAgICBzcGVjdHJhbFF1YW50aXphdGlvbi5YX3Fba10gKiBzcGVjdHJhbFF1YW50aXphdGlvbi5nZykgewotICAgICAgICAgIHJlc19iaXRzW25iaXRzX3Jlc2lkdWFsXSA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzX2JpdHNbbmJpdHNfcmVzaWR1YWxdID0gMDsKLSAgICAgICAgfQotICAgICAgICBuYml0c19yZXNpZHVhbCsrOwotICAgICAgfQotICAgICAgaysrOwotICAgIH0KLSAgfQotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJyZXNfYml0cyIsICZyZXNfYml0cywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICogbmJpdHNfcmVzaWR1YWxfbWF4KTsKLSAgfQotCi0gIC8vIDMuMy4xMiBOb2lzZSBsZXZlbCBlc3RpbWF0aW9uICAoZDA5cjAyX0YyRikKLSAgbm9pc2VMZXZlbEVzdGltYXRpb24ucnVuKHRlbXBvcmFsTm9pc2VTaGFwaW5nLlhfZiwgc3BlY3RyYWxRdWFudGl6YXRpb24uWF9xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoRGV0ZWN0b3IuUF9idywgc3BlY3RyYWxRdWFudGl6YXRpb24uZ2cpOwotCi0gIC8vIDMuMy4xMyBCaXRzdHJlYW0gZW5jb2RpbmcgIChkMDlyMDJfRjJGKQotICAvLyAzLjMuMTMuMiBJbml0aWFsaXphdGlvbiAgKGQwOXIwMl9GMkYpCi0gIGJpdHN0cmVhbUVuY29kaW5nLmluaXQoYnl0ZXMpOwotICAvLyAzLjMuMTMuMyBTaWRlIGluZm9ybWF0aW9uICAoZDA5cjAyX0YyRikKLSAgLyogQmFuZHdpZHRoICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLmJhbmR3aWR0aChiYW5kd2lkdGhEZXRlY3Rvci5QX2J3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoRGV0ZWN0b3IubmJpdHNfYncpOwotICAvKiBMYXN0IG5vbi16ZXJvIHR1cGxlICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLmxhc3ROb256ZXJvVHVwbGUoc3BlY3RyYWxRdWFudGl6YXRpb24ubGFzdG56X3RydW5jKTsKLSAgLyogTFNCIG1vZGUgYml0ICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLmxzYk1vZGVCaXQoc3BlY3RyYWxRdWFudGl6YXRpb24ubHNiTW9kZSk7Ci0gIC8qIEdsb2JhbCBHYWluICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLmdsb2JhbEdhaW4oc3BlY3RyYWxRdWFudGl6YXRpb24uZ2dfaW5kKTsKLSAgLyogVE5TIGFjdGl2YXRpb24gZmxhZyAqLwotICBiaXRzdHJlYW1FbmNvZGluZy50bnNBY3RpdmF0aW9uRmxhZyh0ZW1wb3JhbE5vaXNlU2hhcGluZy5udW1fdG5zX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsTm9pc2VTaGFwaW5nLnJjX29yZGVyKTsKLSAgLyogUGl0Y2ggcHJlc2VudCBmbGFnICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLnBpdGNoUHJlc2VudEZsYWcobG9uZ1Rlcm1Qb3N0ZmlsdGVyLnBpdGNoX3ByZXNlbnQpOwotICAvKiBFbmNvZGUgU0NGIFZRIHBhcmFtZXRlcnMgLSAxc3Qgc3RhZ2UgKDEwIGJpdHMpICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLmVuY29kZVNjZlZxMXN0U3RhZ2Uoc3BlY3RyYWxOb2lzZVNoYXBpbmcuZ2V0X2luZF9MRigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cmFsTm9pc2VTaGFwaW5nLmdldF9pbmRfSEYoKSk7Ci0gIC8qIEVuY29kZSBTQ0YgVlEgcGFyYW1ldGVycyAtIDJuZCBzdGFnZSBzaWRlLWluZm8gKDMtNCBiaXRzKSAqLwotICAvKiBFbmNvZGUgU0NGIFZRIHBhcmFtZXRlcnMgLSAybmQgc3RhZ2UgTVBWUSBkYXRhICovCi0gIGJpdHN0cmVhbUVuY29kaW5nLmVuY29kZVNjZlZxMm5kU3RhZ2UoCi0gICAgICBzcGVjdHJhbE5vaXNlU2hhcGluZy5nZXRfc2hhcGVfaigpLCBzcGVjdHJhbE5vaXNlU2hhcGluZy5nZXRfR2luZCgpLAotICAgICAgc3BlY3RyYWxOb2lzZVNoYXBpbmcuZ2V0X0xTX2luZEEoKSwKLSAgICAgIHNwZWN0cmFsTm9pc2VTaGFwaW5nLmdldF9pbmRleF9qb2ludF9qKCkpOwotICAvKiBMVFBGIGRhdGEgKi8KLSAgaWYgKGxvbmdUZXJtUG9zdGZpbHRlci5waXRjaF9wcmVzZW50ICE9IDApIHsKLSAgICBiaXRzdHJlYW1FbmNvZGluZy5sdHBmRGF0YShsb25nVGVybVBvc3RmaWx0ZXIubHRwZl9hY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1Qb3N0ZmlsdGVyLnBpdGNoX2luZGV4KTsKLSAgfQotICAvKiBOb2lzZSBGYWN0b3IgKi8KLSAgYml0c3RyZWFtRW5jb2Rpbmcubm9pc2VGYWN0b3Iobm9pc2VMZXZlbEVzdGltYXRpb24uRl9ORik7Ci0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygiYnl0ZXNfc2lkZV9pbmZvIiwgJmJ5dGVzWzBdLCBzaXplb2YodWludDhfdCkgKiBuYnl0ZXMpOwotICB9Ci0KLSAgLy8gMy4zLjEzLjQgQXJpdGhtZXRpYyBlbmNvZGluZyAgKGQwOXIwMl9GMkYpCi0gIC8qIEFyaXRobWV0aWMgRW5jb2RlciBJbml0aWFsaXphdGlvbiAqLwotICBiaXRzdHJlYW1FbmNvZGluZy5hY19lbmNfaW5pdCgpOwotICAvKiBUTlMgZGF0YSAqLwotICBiaXRzdHJlYW1FbmNvZGluZy50bnNEYXRhKHRlbXBvcmFsTm9pc2VTaGFwaW5nLnRuc19scGNfd2VpZ2h0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsTm9pc2VTaGFwaW5nLm51bV90bnNfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbE5vaXNlU2hhcGluZy5yY19vcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbE5vaXNlU2hhcGluZy5yY19pKTsKLSAgLyogU3BlY3RyYWwgZGF0YSAqLwotICB1aW50OF90IGxzYnNbc3BlY3RyYWxRdWFudGl6YXRpb24ubmJpdHNfbHNiXTsgIC8vIFRPRE8gY2hlY2sgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWdlbmVyYXRlZCBjYXNlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubHNicz09MCB3b3JrcwotICBiaXRzdHJlYW1FbmNvZGluZy5zcGVjdHJhbERhdGEoCi0gICAgICBzcGVjdHJhbFF1YW50aXphdGlvbi5sYXN0bnpfdHJ1bmMsIHNwZWN0cmFsUXVhbnRpemF0aW9uLnJhdGVGbGFnLAotICAgICAgc3BlY3RyYWxRdWFudGl6YXRpb24ubHNiTW9kZSwgc3BlY3RyYWxRdWFudGl6YXRpb24uWF9xLAotICAgICAgc3BlY3RyYWxRdWFudGl6YXRpb24ubmJpdHNfbHNiLCBsc2JzKTsKLQotICAvLyAzLjMuMTMuNSBSZXNpZHVhbCBkYXRhIGFuZCBmaW5hbGl6YXRpb24gIChkMDlyMDJfRjJGKQotICBiaXRzdHJlYW1FbmNvZGluZy5yZXNpZHVhbERhdGFBbmRGaW5hbGl6YXRpb24oc3BlY3RyYWxRdWFudGl6YXRpb24ubHNiTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iaXRzX3Jlc2lkdWFsLCByZXNfYml0cyk7Ci0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygibmJpdHNfc3BlYyIsICZuYml0c19zcGVjLCBzaXplb2YobmJpdHNfc3BlYykpOwotICAgIGRhdGFwb2ludHMtPmxvZygiYnl0ZXNfYXJpIiwgJmJ5dGVzWzBdLCBzaXplb2YodWludDhfdCkgKiBuYnl0ZXMpOwotICB9Ci19Ci0KLXZvaWQgRW5jb2RlckZyYW1lOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzXykgewotICBkYXRhcG9pbnRzID0gZGF0YXBvaW50c187Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBiYW5kd2lkdGhEZXRlY3Rvci5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gICAgbG9uZ1Rlcm1Qb3N0ZmlsdGVyLnJlZ2lzdGVyRGF0YXBvaW50cyhkYXRhcG9pbnRzKTsKLSAgICBiaXRzdHJlYW1FbmNvZGluZy5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0VuY29kZXJGcmFtZS5ocHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvRW5jb2RlckZyYW1lLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5Y2RmYy4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvRW5jb2RlckZyYW1lLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBFbmNvZGVyRnJhbWUuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19FTkNPREVSX0ZSQU1FX0hQUF8KLSNkZWZpbmUgX19FTkNPREVSX0ZSQU1FX0hQUF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJBdHRhY2tEZXRlY3Rvci5ocHAiCi0jaW5jbHVkZSAiQmFuZHdpZHRoRGV0ZWN0b3IuaHBwIgotI2luY2x1ZGUgIkJpdHN0cmVhbUVuY29kaW5nLmhwcCIKLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLSNpbmNsdWRlICJMYzNDb25maWcuaHBwIgotI2luY2x1ZGUgIkxvbmdUZXJtUG9zdGZpbHRlci5ocHAiCi0jaW5jbHVkZSAiTWRjdEVuYy5ocHAiCi0jaW5jbHVkZSAiTm9pc2VMZXZlbEVzdGltYXRpb24uaHBwIgotI2luY2x1ZGUgIlNwZWN0cmFsTm9pc2VTaGFwaW5nLmhwcCIKLSNpbmNsdWRlICJTcGVjdHJhbFF1YW50aXphdGlvbi5ocHAiCi0jaW5jbHVkZSAiVGVtcG9yYWxOb2lzZVNoYXBpbmcuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotY2xhc3MgRW5jb2RlckZyYW1lIHsKLSBwdWJsaWM6Ci0gIEVuY29kZXJGcmFtZShNZGN0RW5jJiBtZGN0RW5jXywgQXR0YWNrRGV0ZWN0b3ImIGF0dGFja0RldGVjdG9yXywKLSAgICAgICAgICAgICAgIFNwZWN0cmFsTm9pc2VTaGFwaW5nJiBzcGVjdHJhbE5vaXNlU2hhcGluZ18sCi0gICAgICAgICAgICAgICBUZW1wb3JhbE5vaXNlU2hhcGluZyYgdGVtcG9yYWxOb2lzZVNoYXBpbmdfLAotICAgICAgICAgICAgICAgU3BlY3RyYWxRdWFudGl6YXRpb24mIHNwZWN0cmFsUXVhbnRpemF0aW9uXywKLSAgICAgICAgICAgICAgIE5vaXNlTGV2ZWxFc3RpbWF0aW9uJiBub2lzZUxldmVsRXN0aW1hdGlvbl8sCi0gICAgICAgICAgICAgICBjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18sIHVpbnQxNl90IG5ieXRlc18pOwotICB2aXJ0dWFsIH5FbmNvZGVyRnJhbWUoKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfKTsKLQotICB2b2lkIHJ1bihjb25zdCBpbnQxNl90KiB4X3MsIHVpbnQ4X3QqIGJ5dGVzKTsKLQotICB2b2lkIGxpbmtQcmV2aW91c0ZyYW1lKEVuY29kZXJGcmFtZSogcHJldmlvdXNGcmFtZSk7Ci0KLSAgLy8gaW5wdXQgcGFyYW1ldGVyCi0gIGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnOwotICBjb25zdCB1aW50MTZfdCBuYnl0ZXM7Ci0KLSBwcml2YXRlOgotICBEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHM7Ci0gIE1kY3RFbmMmIG1kY3RFbmM7Ci0gIEJhbmR3aWR0aERldGVjdG9yIGJhbmR3aWR0aERldGVjdG9yOwotICBBdHRhY2tEZXRlY3RvciYgYXR0YWNrRGV0ZWN0b3I7Ci0gIFNwZWN0cmFsTm9pc2VTaGFwaW5nJiBzcGVjdHJhbE5vaXNlU2hhcGluZzsKLSAgVGVtcG9yYWxOb2lzZVNoYXBpbmcmIHRlbXBvcmFsTm9pc2VTaGFwaW5nOwotICBMb25nVGVybVBvc3RmaWx0ZXIgbG9uZ1Rlcm1Qb3N0ZmlsdGVyOwotICBTcGVjdHJhbFF1YW50aXphdGlvbiYgc3BlY3RyYWxRdWFudGl6YXRpb247Ci0gIE5vaXNlTGV2ZWxFc3RpbWF0aW9uJiBub2lzZUxldmVsRXN0aW1hdGlvbjsKLSAgQml0c3RyZWFtRW5jb2RpbmcgYml0c3RyZWFtRW5jb2Rpbmc7Ci0KLSBwcml2YXRlOgotICAvLyBzdGF0ZXMgJiBvdXRwdXRzCi0gIGludDE2X3QgZnJhbWVOOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwotCi0jZW5kaWYgIC8vIF9fRU5DT0RFUl9GUkFNRV9IUFBfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvRW5jb2RlclRvcC5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvRW5jb2RlclRvcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGE5MTcuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0VuY29kZXJUb3AuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIEVuY29kZXJUb3AuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJFbmNvZGVyVG9wLmhwcCIKLQotbmFtZXNwYWNlIExjM0VuYyB7Ci0KLUVuY29kZXJUb3A6OkVuY29kZXJUb3AodWludDE2X3QgZnNfLCBEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfKQotICAgIDogRW5jb2RlclRvcChMYzNDb25maWcoZnNfLCBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zLCAxKSwKLSAgICAgICAgICAgICAgICAgZGF0YXBvaW50c18pIHt9Ci0KLUVuY29kZXJUb3A6OkVuY29kZXJUb3AoTGMzQ29uZmlnIGxjM0NvbmZpZ18sIERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pCi0gICAgOiBsYzNDb25maWcobGMzQ29uZmlnXyksCi0gICAgICBkYXRhcG9pbnRzKGRhdGFwb2ludHNfKSwKLSAgICAgIGVuY29kZXJDdXJyZW50RnJhbWUobnVsbHB0ciksCi0gICAgICBlbmNvZGVyUHJldmlvdXNGcmFtZShudWxscHRyKSwKLSAgICAgIG1kY3RFbmMobGMzQ29uZmlnKSwKLSAgICAgIGF0dGFja0RldGVjdG9yKGxjM0NvbmZpZyksCi0gICAgICBzcGVjdHJhbE5vaXNlU2hhcGluZyhsYzNDb25maWcsIG1kY3RFbmMuZ2V0X0lfZnMoKSksCi0gICAgICB0ZW1wb3JhbE5vaXNlU2hhcGluZyhsYzNDb25maWcpLAotICAgICAgc3BlY3RyYWxRdWFudGl6YXRpb24obGMzQ29uZmlnXy5ORSwgbGMzQ29uZmlnXy5Gc19pbmQpLAotICAgICAgbm9pc2VMZXZlbEVzdGltYXRpb24obGMzQ29uZmlnKSwKLSAgICAgIGZyYW1lQ291bnQoMCkgewotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJORiIsICZsYzNDb25maWcuTkYsIHNpemVvZihsYzNDb25maWcuTkYpKTsKLSAgICBtZGN0RW5jLnJlZ2lzdGVyRGF0YXBvaW50cyhkYXRhcG9pbnRzKTsKLSAgICBhdHRhY2tEZXRlY3Rvci5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gICAgc3BlY3RyYWxOb2lzZVNoYXBpbmcucmVnaXN0ZXJEYXRhcG9pbnRzKGRhdGFwb2ludHMpOwotICAgIHRlbXBvcmFsTm9pc2VTaGFwaW5nLnJlZ2lzdGVyRGF0YXBvaW50cyhkYXRhcG9pbnRzKTsKLSAgICBzcGVjdHJhbFF1YW50aXphdGlvbi5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gICAgbm9pc2VMZXZlbEVzdGltYXRpb24ucmVnaXN0ZXJEYXRhcG9pbnRzKGRhdGFwb2ludHMpOwotICB9Ci19Ci0KLUVuY29kZXJUb3A6On5FbmNvZGVyVG9wKCkgewotICBpZiAobnVsbHB0ciAhPSBlbmNvZGVyUHJldmlvdXNGcmFtZSkgewotICAgIGRlbGV0ZSBlbmNvZGVyUHJldmlvdXNGcmFtZTsKLSAgICBlbmNvZGVyUHJldmlvdXNGcmFtZSA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gZW5jb2RlckN1cnJlbnRGcmFtZSkgewotICAgIGRlbGV0ZSBlbmNvZGVyQ3VycmVudEZyYW1lOwotICAgIGVuY29kZXJDdXJyZW50RnJhbWUgPSBudWxscHRyOwotICB9Ci19Ci0KLXZvaWQgRW5jb2RlclRvcDo6cnVuKGNvbnN0IGludDE2X3QqIHhfcywgdWludDE2X3QgYnl0ZV9jb3VudCwgdWludDhfdCogYnl0ZXMpIHsKLSAgZnJhbWVDb3VudCsrOwotICBpZiAoKG51bGxwdHIgPT0gZW5jb2RlckN1cnJlbnRGcmFtZSkgfHwKLSAgICAgIChlbmNvZGVyQ3VycmVudEZyYW1lLT5uYnl0ZXMgIT0gYnl0ZV9jb3VudCkpIHsKLSAgICAvLyBXZSBuZWVkIHRvIGluc3RhbnRpYXRlIGEgbmV3IEVuY29kZXJGcmFtZSBvbmx5Ci0gICAgLy8gd2hlbiBieXRlX2NvdW50IGhhcyBiZWVuIGNoYW5nZWQuIFRodXMsIGZyZXF1ZW50Ci0gICAgLy8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBjYW4gYmUgY29uc3RyYWluZWQgdG8KLSAgICAvLyByYXRlIG9wdGltaXplZCBvcGVyYXRpb24uCi0gICAgaWYgKG51bGxwdHIgIT0gZW5jb2RlclByZXZpb3VzRnJhbWUpIHsKLSAgICAgIGRlbGV0ZSBlbmNvZGVyUHJldmlvdXNGcmFtZTsKLSAgICB9Ci0gICAgZW5jb2RlclByZXZpb3VzRnJhbWUgPSBlbmNvZGVyQ3VycmVudEZyYW1lOwotICAgIGVuY29kZXJDdXJyZW50RnJhbWUgPSBuZXcgRW5jb2RlckZyYW1lKAotICAgICAgICBtZGN0RW5jLCBhdHRhY2tEZXRlY3Rvciwgc3BlY3RyYWxOb2lzZVNoYXBpbmcsIHRlbXBvcmFsTm9pc2VTaGFwaW5nLAotICAgICAgICBzcGVjdHJhbFF1YW50aXphdGlvbiwgbm9pc2VMZXZlbEVzdGltYXRpb24sIGxjM0NvbmZpZywgYnl0ZV9jb3VudCk7Ci0gICAgZW5jb2RlckN1cnJlbnRGcmFtZS0+bGlua1ByZXZpb3VzRnJhbWUoZW5jb2RlclByZXZpb3VzRnJhbWUpOwotICAgIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICAgIC8vIEFub3RoZXIgd2F5IHRvIG1ha2UgdG8gY2FsbCBvcHRpb25hbCB3b3VsZCBiZSB0byBzcGxpdCBydW4oKSBpbnRvCi0gICAgICAvLyAgaW5pdCgpLCByZWdpc3RlckRhdGFwb2ludHMoKSAmIHJlbWFpbmluZyBydW4oKSAtPiB3ZSBwcmVmZXJyZWQgdGhlCi0gICAgICAvLyAgc2ltcGxlcgotICAgICAgLy8gQVBJIGFuZCB0aHVzIGRlc2lnbmVkIHRoaXMgcmVnaXN0cmF0aW9uIGJlaW5nIGRlcGVuZGVudCBvbiB0aGUKLSAgICAgIC8vIGF2YWlsYWJpbGl0eSBvZiBkYXRhcG9pbnRzLgotICAgICAgZW5jb2RlckN1cnJlbnRGcmFtZS0+cmVnaXN0ZXJEYXRhcG9pbnRzKGRhdGFwb2ludHMpOwotICAgIH0KLSAgfQotICBlbmNvZGVyQ3VycmVudEZyYW1lLT5ydW4oeF9zLCBieXRlcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9FbmNvZGVyVG9wLmhwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9FbmNvZGVyVG9wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkYmY1ZC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvRW5jb2RlclRvcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogRW5jb2RlclRvcC5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0VOQ09ERVJfVE9QX0hQUF8KLSNkZWZpbmUgX19FTkNPREVSX1RPUF9IUFBfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiQXR0YWNrRGV0ZWN0b3IuaHBwIgotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotI2luY2x1ZGUgIkVuY29kZXJGcmFtZS5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLSNpbmNsdWRlICJNZGN0RW5jLmhwcCIKLSNpbmNsdWRlICJOb2lzZUxldmVsRXN0aW1hdGlvbi5ocHAiCi0jaW5jbHVkZSAiU3BlY3RyYWxOb2lzZVNoYXBpbmcuaHBwIgotI2luY2x1ZGUgIlNwZWN0cmFsUXVhbnRpemF0aW9uLmhwcCIKLSNpbmNsdWRlICJUZW1wb3JhbE5vaXNlU2hhcGluZy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1jbGFzcyBFbmNvZGVyVG9wIHsKLSBwdWJsaWM6Ci0gIEVuY29kZXJUb3AodWludDE2X3QgZnNfLCBEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfID0gbnVsbHB0cik7Ci0gIEVuY29kZXJUb3AoTGMzQ29uZmlnIGxjM0NvbmZpZ18sIERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18gPSBudWxscHRyKTsKLSAgdmlydHVhbCB+RW5jb2RlclRvcCgpOwotCi0gIHZvaWQgcnVuKGNvbnN0IGludDE2X3QqIHhfcywgdWludDE2X3QgYnl0ZV9jb3VudCwgdWludDhfdCogYnl0ZXMpOwotCi0gIGNvbnN0IExjM0NvbmZpZyBsYzNDb25maWc7Ci0KLSBwcml2YXRlOgotICBEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHM7Ci0gIEVuY29kZXJGcmFtZSogZW5jb2RlckN1cnJlbnRGcmFtZTsKLSAgRW5jb2RlckZyYW1lKiBlbmNvZGVyUHJldmlvdXNGcmFtZTsKLSAgTWRjdEVuYyBtZGN0RW5jOwotICBBdHRhY2tEZXRlY3RvciBhdHRhY2tEZXRlY3RvcjsKLSAgU3BlY3RyYWxOb2lzZVNoYXBpbmcgc3BlY3RyYWxOb2lzZVNoYXBpbmc7Ci0gIFRlbXBvcmFsTm9pc2VTaGFwaW5nIHRlbXBvcmFsTm9pc2VTaGFwaW5nOwotICBTcGVjdHJhbFF1YW50aXphdGlvbiBzcGVjdHJhbFF1YW50aXphdGlvbjsKLSAgTm9pc2VMZXZlbEVzdGltYXRpb24gbm9pc2VMZXZlbEVzdGltYXRpb247Ci0gIHVpbnQzMl90IGZyYW1lQ291bnQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCi0KLSNlbmRpZiAgLy8gX19FTkNPREVSX1RPUF9IUFBfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvTGMzRW5jb2Rlci5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvTGMzRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmU3OTYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0xjM0VuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExjM0VuY29kZXIuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMYzNFbmNvZGVyLmhwcCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJFbmNvZGVyVG9wLmhwcCIKLQotdXNpbmcgbmFtZXNwYWNlIExjM0VuYzsKLQotTGMzRW5jb2Rlcjo6TGMzRW5jb2Rlcih1aW50MTZfdCBGcykKLSAgICA6IExjM0VuY29kZXIoTGMzQ29uZmlnKEZzLCBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zLCAxKSkge30KLQotTGMzRW5jb2Rlcjo6TGMzRW5jb2RlcihMYzNDb25maWcgbGMzQ29uZmlnXywgdWludDhfdCBiaXRzX3Blcl9hdWRpb19zYW1wbGVfZW5jXywKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YXBvaW50cykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9lbmMoYml0c19wZXJfYXVkaW9fc2FtcGxlX2VuY18pLAotICAgICAgZW5jb2Rlckxpc3QobGMzQ29uZmlnLk5jKSB7Ci0gIC8vIHByb2NlZWQgb25seSB3aXRoIHZhbGlkIGNvbmZpZ3VyYXRpb24KLSAgaWYgKGxjM0NvbmZpZy5pc1ZhbGlkKCkgJiYgKDE2ID09IGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9lbmMpKSB7Ci0gICAgZm9yICh1aW50OF90IGNoYW5uZWxOciA9IDA7IGNoYW5uZWxOciA8IGxjM0NvbmZpZy5OYzsgY2hhbm5lbE5yKyspIHsKLSAgICAgIGVuY29kZXJMaXN0W2NoYW5uZWxOcl0gPSBuZXcgRW5jb2RlclRvcCgKLSAgICAgICAgICBsYzNDb25maWcsIHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YXBvaW50Q29udGFpbmVyKj4oZGF0YXBvaW50cykpOwotICAgIH0KLSAgfQotfQotCi1MYzNFbmNvZGVyOjp+TGMzRW5jb2RlcigpIHsKLSAgZm9yICh1aW50OF90IGNoYW5uZWxOciA9IDA7IGNoYW5uZWxOciA8IGxjM0NvbmZpZy5OYzsgY2hhbm5lbE5yKyspIHsKLSAgICBFbmNvZGVyVG9wKiBlbmNvZGVyVG9wID0gZW5jb2Rlckxpc3RbY2hhbm5lbE5yXTsKLSAgICBpZiAobnVsbHB0ciAhPSBlbmNvZGVyVG9wKSB7Ci0gICAgICBkZWxldGUgZW5jb2RlclRvcDsKLSAgICB9Ci0gIH0KLX0KLQotdWludDhfdCBMYzNFbmNvZGVyOjpydW4oY29uc3QgaW50MTZfdCogeF9zLCB1aW50MTZfdCBieXRlX2NvdW50LCB1aW50OF90KiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbE5yKSB7Ci0gIGlmICghbGMzQ29uZmlnLmlzVmFsaWQoKSkgewotICAgIHJldHVybiBJTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gIH0KLSAgaWYgKChieXRlX2NvdW50IDwgMjApIHx8IChieXRlX2NvdW50ID4gNDAwKSkgewotICAgIHJldHVybiBJTlZBTElEX0JZVEVfQ09VTlQ7Ci0gIH0KLSAgaWYgKGJpdHNfcGVyX2F1ZGlvX3NhbXBsZV9lbmMgIT0gMTYpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9CSVRTX1BFUl9BVURJT19TQU1QTEU7Ci0gIH0KLSAgaWYgKG51bGxwdHIgPT0gZW5jb2Rlckxpc3RbY2hhbm5lbE5yXSkgewotICAgIHJldHVybiBFTkNPREVSX0FMTE9DQVRJT05fRVJST1I7Ci0gIH0KLQotICBlbmNvZGVyTGlzdFtjaGFubmVsTnJdLT5ydW4oeF9zLCBieXRlX2NvdW50LCBieXRlcyk7Ci0gIHJldHVybiBFUlJPUl9GUkVFOwotfQotCi11aW50OF90IExjM0VuY29kZXI6OnJ1bihjb25zdCBpbnQxNl90KiB4X3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYnl0ZV9jb3VudF9wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ5dGVzKSB7Ci0gIGlmICghbGMzQ29uZmlnLmlzVmFsaWQoKSkgewotICAgIHJldHVybiBJTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gIH0KLQotICB1aW50OF90IHJldHVybkNvZGUgPSBFUlJPUl9GUkVFOwotICB1aW50MzJfdCBieXRlT2Zmc2V0ID0gMDsKLSAgZm9yICh1aW50OF90IGNoYW5uZWxOciA9IDA7IGNoYW5uZWxOciA8IGxjM0NvbmZpZy5OYzsgY2hhbm5lbE5yKyspIHsKLSAgICAvLyBOb3RlOiBiaXR3aXNlIG9yIG9mIHRoZSBzaW5nbGUgY2hhbm5lbCByZXR1cm4gY29kZSB3aWxsIG5vdCBhbGxvdwotICAgIC8vIHVuaXF1ZWx5IHRvIGRlY29kZQotICAgIC8vICAgICAgIHRoZSBnaXZlbiBlcnJvci4gVGhlIGlkZWEgaXMgdG8gY2F0Y2ggYW55IGVycm9yLiBUaGlzIGRlY2lzaW9uCi0gICAgLy8gICAgICAgbWFrZXMgdGhlIEFQSSBtb3JlIHNpbXBsZS4gSG93ZXZlciwgd2hlbiB0aGUgcHJlY2lzZSBlcnJvciBjb2RlIGlzCi0gICAgLy8gICAgICAgbmVlZGVkLCB0aGUgc2luZ2xlIGNoYW5uZWwgY2FsbCBoYXMgdG8gYmUgbWFkZSBzZXBhcmF0ZWx5LgotICAgIHJldHVybkNvZGUgfD0KLSAgICAgICAgcnVuKCZ4X3NbY2hhbm5lbE5yICogbGMzQ29uZmlnLk5GXSwgYnl0ZV9jb3VudF9wZXJfY2hhbm5lbFtjaGFubmVsTnJdLAotICAgICAgICAgICAgJmJ5dGVzW2J5dGVPZmZzZXRdLCBjaGFubmVsTnIpOwotICAgIGJ5dGVPZmZzZXQgKz0gYnl0ZV9jb3VudF9wZXJfY2hhbm5lbFtjaGFubmVsTnJdOwotICB9Ci0gIHJldHVybiByZXR1cm5Db2RlOwotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL0xvbmdUZXJtUG9zdGZpbHRlci5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5MzY3YS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKgotICogTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmhwcCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIkxvbmdUZXJtUG9zdGZpbHRlckNvZWZmaWNpZW50cy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1Mb25nVGVybVBvc3RmaWx0ZXI6OkxvbmdUZXJtUG9zdGZpbHRlcihjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuYml0cykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIGxlbjEycDgoKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpID8gMTI4IDogOTYpLAotICAgICAgbGVuNnA0KChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zKSA/IDY0IDogNDgpLAotICAgICAgRF9MVFBGKChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zKSA/IDI0IDogNDQpLAotICAgICAgUChnZXRQKGxjM0NvbmZpZy5GcykpLAotICAgICAgUF90aW1lc19yZXNfZmFjKChsYzNDb25maWcuRnMgPT0gODAwMCkgPyAxOTIwMDAgLyA4MDAwIC8gMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRQKGxjM0NvbmZpZy5GcykpLAotICAgICAgZ2Fpbl9sdHBmX29uKGdldEdhaW5MdHBmT24obmJpdHMsIGxjM0NvbmZpZ18pKSwKLSAgICAgIHBpdGNoX2luZGV4KDApLAotICAgICAgcGl0Y2hfcHJlc2VudCgwKSwKLSAgICAgIGx0cGZfYWN0aXZlKDApLAotICAgICAgbmJpdHNfTFRQRigwKSwKLSAgICAgIFRfcHJldihrX21pbiksCi0gICAgICBtZW1fcGl0Y2goMCksCi0gICAgICBtZW1fbHRwZl9hY3RpdmUoMCksCi0gICAgICBtZW1fbmMoMCksCi0gICAgICBtZW1fbWVtX25jKDApLAotICAgICAgeF9zX2V4dGVuZGVkKG51bGxwdHIpLAotICAgICAgeF90aWxkZV8xMnA4RF9leHRlbmRlZChudWxscHRyKSwKLSAgICAgIGRhdGFwb2ludHMobnVsbHB0cikgewotICB4X3NfZXh0ZW5kZWQgPSBuZXcgZG91YmxlWzI0MCAvIFAgKyBsYzNDb25maWcuTkZdOwotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgMjQwIC8gUCArIGxjM0NvbmZpZy5ORjsgbisrKSB7Ci0gICAgeF9zX2V4dGVuZGVkW25dID0gMDsKLSAgfQotICB4X3RpbGRlXzEycDhEX2V4dGVuZGVkID0gbmV3IGRvdWJsZVtsZW4xMnA4ICsgRF9MVFBGICsgTm1lbTEycDhEXTsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxlbjEycDggKyBEX0xUUEYgKyBObWVtMTJwOEQ7IG4rKykgewotICAgIHhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbbl0gPSAwOwotICB9Ci0gIGg1MF9tZW1bMF0gPSAwLjA7Ci0gIGg1MF9tZW1bMV0gPSAwLjA7Ci0gIGZvciAodWludDhfdCBuID0gMDsgbiA8IDY0ICsga19tYXg7IG4rKykgewotICAgIHhfNnA0X2V4dGVuZGVkW25dID0gMDsKLSAgfQotfQotCi1Mb25nVGVybVBvc3RmaWx0ZXI6On5Mb25nVGVybVBvc3RmaWx0ZXIoKSB7Ci0gIGlmIChudWxscHRyICE9IHhfc19leHRlbmRlZCkgewotICAgIGRlbGV0ZVtdIHhfc19leHRlbmRlZDsKLSAgfQotICBpZiAobnVsbHB0ciAhPSB4X3RpbGRlXzEycDhEX2V4dGVuZGVkKSB7Ci0gICAgZGVsZXRlW10geF90aWxkZV8xMnA4RF9leHRlbmRlZDsKLSAgfQotfQotCi11aW50OF90IExvbmdUZXJtUG9zdGZpbHRlcjo6Z2V0UCh1aW50MTZfdCBmcykgewotICAvLyBOb3RlOiB3ZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGluZyBjb2RlIGVuc3VyZXMgdGhhdAotICAvLyAgICAgICBvbmx5IHZhbGlkIGZzIHZhbHVlcyBhcmUgcHJvdmlkZWQKLSAgaWYgKGZzID09IDQ0MTAwKSB7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDE5MjAwMCAvIGZzOwotICB9Ci19Ci0KLXVpbnQ4X3QgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpnZXRHYWluTHRwZk9uKHVpbnQxNl90IG5iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWcpIHsKLSAgLy8gdGhpcyBpcyBkZXJpdmVkIGZyb20gcHNldWRvLWNvZGUgaW4gc2VjdGlvbiAzLjQuOS40IChkMS4wcjAzKSByZWZlcmVuY2VkCi0gIC8vIGJ5IEVycmF0YSAxNTAxMzsgc2luY2UgdGhlIGVuY29kZSBqdXN0IG5lZWRzIHRvIGNoZWNrIGdhaW5fbHRwZiAhPSAwLAotICAvLyB0aGUgZnVsbCBjb2RlIG5lZWRlZCBpbiB0aGUgZGVjb2RlciBpcyByZWR1Y2VkIHRvIHRoZSBzaW1wbGUgY29tcHV0YXRpb24gb2YKLSAgLy8gZ2Fpbl9sdHBmX29uIGluc3RlYWQgb2YgZ2Fpbl9sdHBmCi0gIHsKLSAgICB1aW50MTZfdCB0X25iaXRzID0gKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDdwNW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByb3VuZChuYml0cyAqIDEwIC8gNy41KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuYml0czsKLQotICAgIGlmICh0X25iaXRzIDwgNTYwICsgbGMzQ29uZmlnLkZzX2luZCAqIDgwKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci19Ci0KLUxvbmdUZXJtUG9zdGZpbHRlciYgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpvcGVyYXRvcj0oCi0gICAgY29uc3QgTG9uZ1Rlcm1Qb3N0ZmlsdGVyJiBzcmMpIHsKLSAgLy8gVE9ETyB3ZSBzaG91bGQgYXNzZXJ0LCB0aGF0IE5GIGlzIGVxdWFsIGluIHNyYyBhbmQgKnRoaXMhCi0gIFRfcHJldiA9IHNyYy5UX3ByZXY7Ci0gIG1lbV9waXRjaCA9IHNyYy5tZW1fcGl0Y2g7Ci0gIG1lbV9sdHBmX2FjdGl2ZSA9IHNyYy5tZW1fbHRwZl9hY3RpdmU7Ci0gIG1lbV9uYyA9IHNyYy5tZW1fbmM7Ci0gIG1lbV9tZW1fbmMgPSBzcmMubWVtX21lbV9uYzsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IDI0MCAvIFAgKyBsYzNDb25maWcuTkY7IG4rKykgewotICAgIHhfc19leHRlbmRlZFtuXSA9IHNyYy54X3NfZXh0ZW5kZWRbbl07Ci0gIH0KLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxlbjEycDggKyBEX0xUUEYgKyBObWVtMTJwOEQ7IG4rKykgewotICAgIHhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbbl0gPSBzcmMueF90aWxkZV8xMnA4RF9leHRlbmRlZFtuXTsKLSAgfQotICBoNTBfbWVtWzBdID0gc3JjLmg1MF9tZW1bMF07Ci0gIGg1MF9tZW1bMV0gPSBzcmMuaDUwX21lbVsxXTsKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgNjQgKyBrX21heDsgbisrKSB7Ci0gICAgeF82cDRfZXh0ZW5kZWRbbl0gPSBzcmMueF82cDRfZXh0ZW5kZWRbbl07Ci0gIH0KLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXVpbnQ4X3QgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpwaXRjaERldGVjdGlvbihmbG9hdCYgbm9ybWNvcnIpIHsKLSAgLy8gMy4zLjkuNSBQaXRjaCBkZXRlY3Rpb24gYWxnb3JpdGhtICAoZDA5cjAyX0YyRikKLSAgY29uc3QgZG91YmxlKiB4X3RpbGRlXzEycDhEID0gJnhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbTm1lbTEycDhEXTsKLSAgY29uc3QgZG91YmxlIGhfMls1XSA9IHswLjEyMzY3OTY0MTExODA1MzcsIDAuMjM1MzUxMjEyODM2NDg4OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MTkzODI5MjA5MDkxNDgsIDAuMjM1MzUxMjEyODM2NDg4OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyMzY3OTY0MTExODA1Mzd9OwotCi0gIGRvdWJsZSogeF82cDQgPSAmeF82cDRfZXh0ZW5kZWRba19tYXhdOyAgLy8gZGVmaW5lIGN1cnJlbnQgdmlldyBvbiB0aGlzIHNpZ25hbAotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBsZW42cDQ7IG4rKykgewotICAgIHhfNnA0W25dID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPCA1OyBrKyspIHsKLSAgICAgIHhfNnA0W25dICs9IHhfdGlsZGVfMTJwOERbMiAqIG4gKyBrIC0gM10gKiBoXzJba107Ci0gICAgfQotICB9Ci0gIGRvdWJsZSBSXzZwNFtrX21heCAtIGtfbWluICsgMV07Ci0gIGRvdWJsZSBSX3dfNnA0W2tfbWF4IC0ga19taW4gKyAxXTsKLSAgZm9yICh1aW50OF90IGsgPSBrX21pbjsgayA8PSBrX21heDsgaysrKSB7Ci0gICAgUl82cDRbayAtIGtfbWluXSA9IDA7Ci0gICAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgbGVuNnA0OyBuKyspIHsKLSAgICAgIFJfNnA0W2sgLSBrX21pbl0gKz0geF82cDRbbl0gKiB4XzZwNFtuIC0ga107Ci0gICAgfQotICAgIGRvdWJsZSB3ID0gMSAtIDAuNSAqIChrIC0ga19taW4pIC8gKDEuMCAqIChrX21heCAtIGtfbWluKSk7Ci0gICAgUl93XzZwNFtrIC0ga19taW5dID0gdyAqIFJfNnA0W2sgLSBrX21pbl07Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygiUl82cDQiLCAmUl82cDRbMF0sIHNpemVvZihkb3VibGUpICogKGtfbWF4IC0ga19taW4gKyAxKSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJSX3dfNnA0IiwgJlJfd182cDRbMF0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogKGtfbWF4IC0ga19taW4gKyAxKSk7Ci0gIH0KLSAgdWludDhfdCBUMSA9IGtfbWluOwotICBkb3VibGUgUl93XzZwNF9tYXggPSBSX3dfNnA0WzBdOwotICBmb3IgKHVpbnQ4X3QgayA9IGtfbWluICsgMTsgayA8PSBrX21heDsgaysrKSB7Ci0gICAgaWYgKFJfd182cDRbayAtIGtfbWluXSA+IFJfd182cDRfbWF4KSB7Ci0gICAgICBSX3dfNnA0X21heCA9IFJfd182cDRbayAtIGtfbWluXTsKLSAgICAgIFQxID0gazsKLSAgICB9Ci0gIH0KLSAgLy8gdGhlIGZvbGxvd2luZyBpcyBub3Qgd29ya2luZyB3aXRoIHRoZSBzdGF0aWMgY29uc3QgbWVtYmVycwotICAvLyBjb25zdCB1aW50OF90IGtfc19taW4gPSBzdGQ6Om1heCgga19taW4sIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFRfcHJldi00KSk7Ci0gIC8vIGNvbnN0IHVpbnQ4X3Qga19zX21heCA9IHN0ZDo6bWluKCBrX21heCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oVF9wcmV2KzQpICk7Ci0gIHVpbnQ4X3Qga19zX21pbiA9IChrX21pbiA8IChUX3ByZXYgLSA0KSkgPyAoVF9wcmV2IC0gNCkgOiBrX21pbjsKLSAgdWludDhfdCBrX3NfbWF4ID0gKGtfbWF4ID4gKFRfcHJldiArIDQpKSA/IChUX3ByZXYgKyA0KSA6IGtfbWF4OwotICB1aW50OF90IFQyID0ga19zX21pbjsKLSAgZG91YmxlIFJfNnA0X21heCA9IFJfNnA0W2tfc19taW4gLSBrX21pbl07Ci0gIGZvciAodWludDhfdCBrID0ga19zX21pbiArIDE7IGsgPD0ga19zX21heDsgaysrKSB7Ci0gICAgaWYgKFJfNnA0W2sgLSBrX21pbl0gPiBSXzZwNF9tYXgpIHsKLSAgICAgIFJfNnA0X21heCA9IFJfNnA0W2sgLSBrX21pbl07Ci0gICAgICBUMiA9IGs7Ci0gICAgfQotICB9Ci0KLSAgLy8gY29tcHV0ZSBub3JtYWxpemVkIGNvcnJlbGF0aW9uCi0gIGNvbnN0IHVpbnQ4X3QgY29ycl9sZW4gPSBsZW42cDQ7Ci0gIGZsb2F0IG5vcm12YWx1ZTAgPSBjb21wdXRlX25vcm12YWx1ZSh4XzZwNCwgY29ycl9sZW4sIDApOwotICBmbG9hdCBub3JtdmFsdWUxID0gY29tcHV0ZV9ub3JtdmFsdWUoeF82cDQsIGNvcnJfbGVuLCBUMSk7Ci0gIGZsb2F0IG5vcm12YWx1ZSA9IHNxcnQobm9ybXZhbHVlMCAqIG5vcm12YWx1ZTEpOwotICBmbG9hdCBub3JtY29ycjEgPSAwOyAgLy8gaXMgdGhpcyBhIHByb3BlciBpbml0aWFsaXphdGlvbj8KLSAgaWYgKG5vcm12YWx1ZSA+IDApIHsKLSAgICBub3JtY29ycjEgPSBSXzZwNFtUMSAtIGtfbWluXSAvIG5vcm12YWx1ZTsKLSAgfQotICBpZiAobm9ybWNvcnIxIDwgMCkgIC8vIGltcGxlbWVudHMgbWF4KDAsbm9ybWNvcnIxKSBmcm9tIGVxLiAoOTApIGluCi0gICAgICAgICAgICAgICAgICAgICAgLy8gKGQwOXIwNl9LTEdfQVlfTkhfRmhHLCAyMDE5LTEyLTIwKQotICB7Ci0gICAgbm9ybWNvcnIxID0gMDsKLSAgfQotICBmbG9hdCBub3JtY29ycjIgPSBub3JtY29ycjE7Ci0gIGlmIChUMSAhPSBUMikgewotICAgIGZsb2F0IG5vcm12YWx1ZTIgPSBjb21wdXRlX25vcm12YWx1ZSh4XzZwNCwgY29ycl9sZW4sIFQyKTsKLSAgICBub3JtdmFsdWUgPSBzcXJ0KG5vcm12YWx1ZTAgKiBub3JtdmFsdWUyKTsKLSAgICBpZiAobm9ybXZhbHVlID4gMCkgewotICAgICAgbm9ybWNvcnIyID0gUl82cDRbVDIgLSBrX21pbl0gLyBub3JtdmFsdWU7Ci0gICAgfQotICAgIGlmIChub3JtY29ycjIgPCAwKSAgLy8gaW1wbGVtZW50cyBtYXgoMCxub3JtY29ycjIpIGZyb20gZXEuICg5MCkgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkMDlyMDZfS0xHX0FZX05IX0ZoRywgMjAxOS0xMi0yMCkKLSAgICB7Ci0gICAgICBub3JtY29ycjIgPSAwOwotICAgIH0KLSAgfQotICB1aW50OF90IFRfY3VyciA9IFQxOwotICBub3JtY29yciA9IG5vcm1jb3JyMTsKLSAgaWYgKG5vcm1jb3JyMiA+IDAuODUgKiBub3JtY29ycjEpIHsKLSAgICBUX2N1cnIgPSBUMjsKLSAgICBub3JtY29yciA9IG5vcm1jb3JyMjsKLSAgfQotCi0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5sb2coIlQxIiwgJlQxLCBzaXplb2YoVDEpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIlQyIiwgJlQyLCBzaXplb2YoVDIpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIlRfY3VyciIsICZUX2N1cnIsIHNpemVvZihUX2N1cnIpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIlRfcHJldiIsICZUX3ByZXYsIHNpemVvZihUX3ByZXYpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm5vcm1jb3JyMSIsICZub3JtY29ycjEsIHNpemVvZihub3JtY29ycjEpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm5vcm1jb3JyMiIsICZub3JtY29ycjIsIHNpemVvZihub3JtY29ycjIpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm5vcm1jb3JyIiwgJm5vcm1jb3JyLCBzaXplb2Yobm9ybWNvcnIpKTsKLSAgfQotCi0gIHJldHVybiBUX2N1cnI7Ci19Ci0KLWZsb2F0IExvbmdUZXJtUG9zdGZpbHRlcjo6aW50ZXJwKGNvbnN0IGZsb2F0KiBSXzEycDgsIHVpbnQ4X3QgcGl0Y2hfaW50X3JlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBkKSB7Ci0gIGZsb2F0IGludGVycF9kID0gMDsKLSAgZm9yIChpbnQ4X3QgbSA9IC00OyBtIDw9IDQ7IG0rKykgewotICAgIGludDhfdCBuID0gNCAqIG0gLSBkOwotICAgIGlmICgoLTE2IDwgbikgJiYgKG4gPCAxNikpIHsKLSAgICAgIGludGVycF9kICs9IFJfMTJwOFtwaXRjaF9pbnRfcmVsICsgbV0gKiB0YWJfbHRwZl9pbnRlcnBfUltuICsgMTVdOwotICAgIH0KLSAgfQotICByZXR1cm4gaW50ZXJwX2Q7Ci19Ci0KLXZvaWQgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpwaXRjaExhZ1BhcmFtZXRlcih1aW50OF90IFRfY3VyciwgdWludDhfdCYgcGl0Y2hfaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCYgcGl0Y2hfZnIpIHsKLSAgLy8gMy4zLjkuNyBMVFBGIHBpdGNoLWxhZyBwYXJhbWV0ZXIgICAgKGQwOXIwMl9GMkYpCi0gIHVpbnQ4X3Qga19zc19taW4gPSAoMzIgPiAoMiAqIFRfY3VyciAtIDQpKSA/IDMyIDogKDIgKiBUX2N1cnIgLSA0KTsKLSAgdWludDhfdCBrX3NzX21heCA9ICgyMjggPCAoMiAqIFRfY3VyciArIDQpKSA/IDIyOCA6ICgyICogVF9jdXJyICsgNCk7Ci0KLSAgY29uc3QgZG91YmxlKiB4X3RpbGRlXzEycDhEID0gJnhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbTm1lbTEycDhEXTsKLSAgZmxvYXQgUl8xMnA4W2tfc3NfbWF4ICsgNCAtIChrX3NzX21pbiAtIDQpICsgMV07Ci0gIGZsb2F0IFJfMTJwOF9tYXggPSAwOwotICBwaXRjaF9pbnQgPSBrX3NzX21pbjsKLSAgZm9yICh1aW50OF90IGsgPSAoa19zc19taW4gLSA0KTsgayA8PSBrX3NzX21heCArIDQ7IGsrKykgewotICAgIGZsb2F0IGNvcnJ2ID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBsZW4xMnA4OyBuKyspIHsKLSAgICAgIGNvcnJ2ICs9IHhfdGlsZGVfMTJwOERbbl0gKiB4X3RpbGRlXzEycDhEW24gLSBrXTsKLSAgICB9Ci0gICAgUl8xMnA4W2sgLSAoa19zc19taW4gLSA0KV0gPSBjb3JydjsKLSAgICBpZiAoKGNvcnJ2ID4gUl8xMnA4X21heCkgJiYgKGsgPj0ga19zc19taW4pICYmIChrIDw9IGtfc3NfbWF4KSkgewotICAgICAgUl8xMnA4X21heCA9IGNvcnJ2OwotICAgICAgcGl0Y2hfaW50ID0gazsKLSAgICB9Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygKLSAgICAgICAgIlIxMi44IiwgJlJfMTJwOFswXSwKLSAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIDE3KTsgIC8vIE5vdGU6IHNvbWV0aW1lcyBsZXNzIHRoYW4gMTcgdmFsdWVzIGFyZSBnaXZlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZQotICB9Ci0KLSAgdWludDhfdCBwaXRjaF9pbnRfcmVsID0gcGl0Y2hfaW50IC0gKGtfc3NfbWluIC0gNCk7Ci0gIHBpdGNoX2ZyID0gMDsKLSAgaWYgKDMyID09IHBpdGNoX2ludCkgewotICAgIGZsb2F0IGludGVycF9kX21heCA9IDA7Ci0gICAgZm9yIChpbnQ4X3QgZCA9IDA7IGQgPD0gMzsgZCsrKSB7Ci0gICAgICBmbG9hdCBpbnRlcnBfZCA9IGludGVycChSXzEycDgsIHBpdGNoX2ludF9yZWwsIGQpOwotICAgICAgaWYgKGludGVycF9kID4gaW50ZXJwX2RfbWF4KSB7Ci0gICAgICAgIGludGVycF9kX21heCA9IGludGVycF9kOwotICAgICAgICBwaXRjaF9mciA9IGQ7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKCgxMjcgPiBwaXRjaF9pbnQpICYmIChwaXRjaF9pbnQgPiAzMikpIHsKLSAgICBmbG9hdCBpbnRlcnBfZF9tYXggPSAwOwotICAgIGZvciAoaW50OF90IGQgPSAtMzsgZCA8PSAzOyBkKyspIHsKLSAgICAgIGZsb2F0IGludGVycF9kID0gaW50ZXJwKFJfMTJwOCwgcGl0Y2hfaW50X3JlbCwgZCk7Ci0gICAgICBpZiAoaW50ZXJwX2QgPiBpbnRlcnBfZF9tYXgpIHsKLSAgICAgICAgaW50ZXJwX2RfbWF4ID0gaW50ZXJwX2Q7Ci0gICAgICAgIHBpdGNoX2ZyID0gZDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoKDE1NyA+IHBpdGNoX2ludCkgJiYgKHBpdGNoX2ludCA+PSAxMjcpKSB7Ci0gICAgZmxvYXQgaW50ZXJwX2RfbWF4ID0gMDsKLSAgICBmb3IgKGludDhfdCBkID0gLTI7IGQgPD0gMjsgZCArPSAyKSB7Ci0gICAgICBmbG9hdCBpbnRlcnBfZCA9IGludGVycChSXzEycDgsIHBpdGNoX2ludF9yZWwsIGQpOwotICAgICAgaWYgKGludGVycF9kID4gaW50ZXJwX2RfbWF4KSB7Ci0gICAgICAgIGludGVycF9kX21heCA9IGludGVycF9kOwotICAgICAgICBwaXRjaF9mciA9IGQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBpdGNoX2ZyIDwgMCkgewotICAgIHBpdGNoX2ludC0tOwotICAgIHBpdGNoX2ZyICs9IDQ7Ci0gIH0KLQotICBpZiAoMTI3ID4gcGl0Y2hfaW50KSB7Ci0gICAgcGl0Y2hfaW5kZXggPSA0ICogc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHBpdGNoX2ludCkgKyBwaXRjaF9mciAtIDEyODsKLSAgfSBlbHNlIGlmICgoMTU3ID4gcGl0Y2hfaW50KSAmJiAocGl0Y2hfaW50ID49IDEyNykpIHsKLSAgICBwaXRjaF9pbmRleCA9IDIgKiBzdGF0aWNfY2FzdDx1aW50MTZfdD4ocGl0Y2hfaW50KSArIHBpdGNoX2ZyIC8gMiArIDEyNjsKLSAgfSBlbHNlIHsKLSAgICBwaXRjaF9pbmRleCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihwaXRjaF9pbnQpICsgMjgzOwotICB9Ci19Ci0KLWZsb2F0IExvbmdUZXJtUG9zdGZpbHRlcjo6eF9pX25fZChpbnQxNl90IG4sIGludDhfdCBkKSB7Ci0gIGNvbnN0IGRvdWJsZSogeF90aWxkZV8xMnA4RCA9ICZ4X3RpbGRlXzEycDhEX2V4dGVuZGVkW05tZW0xMnA4RF07Ci0gIGZsb2F0IHJlc3VsdCA9IDA7Ci0gIGZvciAoaW50OF90IGsgPSAtMjsgayA8PSAyOyBrKyspIHsKLSAgICBpbnQ4X3QgaF9pX2luZGV4ID0gNCAqIGsgLSBkOwotICAgIGlmICgoLTggPCBoX2lfaW5kZXgpICYmIChoX2lfaW5kZXggPCA4KSkgewotICAgICAgcmVzdWx0ICs9IHhfdGlsZGVfMTJwOERbbiAtIGtdICogdGFiX2x0cGZfaW50ZXJwX3gxMms4W2hfaV9pbmRleCArIDddOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIExvbmdUZXJtUG9zdGZpbHRlcjo6YWN0aXZhdGlvbkJpdCh1aW50OF90IHBpdGNoX2ludCwgdWludDhfdCBwaXRjaF9mciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbmVhcl9ueXF1aXN0X2ZsYWcsIGZsb2F0JiBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBwaXRjaCkgewotICAvLyBOb3RlOiBnaXZlbiB0ZXN0cyBjb25maXJtIHRoYXQgZmxvYXQgaXMgc3VmZmljaWVudCAoYXQgbGVhc3QgZm9yIDE2IGJpdCBQQ00KLSAgLy8gaW5wdXQpCi0gIGZsb2F0IG5jX251bWVyYXRvciA9IDA7Ci0gIGZsb2F0IG5jX25vcm0xID0gMDsKLSAgZmxvYXQgbmNfbm9ybTIgPSAwOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBsZW4xMnA4OyBuKyspIHsKLSAgICBmbG9hdCB4X2lfbl8wID0geF9pX25fZChuLCAwKTsKLSAgICBmbG9hdCB4X2lfbl9zaGlmdGVkID0KLSAgICAgICAgeF9pX25fZChzdGF0aWNfY2FzdDxpbnQxNl90PihuKSAtIHN0YXRpY19jYXN0PGludDE2X3Q+KHBpdGNoX2ludCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90PihwaXRjaF9mcikpOwotCi0gICAgbmNfbnVtZXJhdG9yICs9IHhfaV9uXzAgKiB4X2lfbl9zaGlmdGVkOwotICAgIG5jX25vcm0xICs9IHhfaV9uXzAgKiB4X2lfbl8wOwotICAgIG5jX25vcm0yICs9IHhfaV9uX3NoaWZ0ZWQgKiB4X2lfbl9zaGlmdGVkOwotICB9Ci0gIGZsb2F0IG5jX2Rlbm9taW5hdG9yID0gc3FydChuY19ub3JtMSAqIG5jX25vcm0yKTsKLSAgbmMgPSAwOyAgLy8gSXMgdGhpcyBvaz8gT3Igc2hvdWxkIHdlIHNldCBvdGhlciB2YWx1ZXMgZm9yIG5jX2Rlbm9taW5hdG9yPT0wCi0gIGlmIChuY19kZW5vbWluYXRvciA+IDApIHsKLSAgICBuYyA9IG5jX251bWVyYXRvciAvIG5jX2Rlbm9taW5hdG9yOwotICB9Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm5jX251bSIsICZuY19udW1lcmF0b3IsIHNpemVvZihuY19udW1lcmF0b3IpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm5jX2RlbiIsICZuY19kZW5vbWluYXRvciwgc2l6ZW9mKG5jX2Rlbm9taW5hdG9yKSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJuYyIsICZuYywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5jKSk7ICAvLyBzb21ld2hhdCByZWR1bmRhbnQgdG8gIm5jX2x0cGYiLCBidXQgbmV2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvZWQgZHVlIHRvIHBpdGNoX3ByZXNlbnQKLSAgfQotCi0gIHBpdGNoID0gcGl0Y2hfaW50ICsgcGl0Y2hfZnIgLyA0LjA7Ci0KLSAgLy8gcGFydCBvZiAzLjMuOS44IExUUEYgYWN0aXZhdGlvbiBiaXQgaW5jbHVkaW5nIEVycmF0YSAxNTAxMyAoc2VlIGQxLjByMDMpCi0gIC8vIGFuZCBFcnJhdGUgMTUyNTAKLSAgaWYgKChnYWluX2x0cGZfb24gIT0gMCkgJiYgKG5lYXJfbnlxdWlzdF9mbGFnID09IDApKSB7Ci0gICAgaWYgKCgobWVtX2x0cGZfYWN0aXZlID09IDApICYmCi0gICAgICAgICAoKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpIHx8Ci0gICAgICAgICAgKG1lbV9tZW1fbmMgPiAwLjk0KSkgJiYKLSAgICAgICAgIChtZW1fbmMgPiAwLjk0KSAmJiAobmMgPiAwLjk0KSkgfHwKLSAgICAgICAgKChtZW1fbHRwZl9hY3RpdmUgPT0gMSkgJiYgKG5jID4gMC45KSkgfHwKLSAgICAgICAgKChtZW1fbHRwZl9hY3RpdmUgPT0gMSkgJiYgKGZhYnMocGl0Y2ggLSBtZW1fcGl0Y2gpIDwgMikgJiYKLSAgICAgICAgICgobmMgLSBtZW1fbmMpID4gLTAuMSkgJiYgKG5jID4gMC44NCkpKSB7Ci0gICAgICBsdHBmX2FjdGl2ZSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGx0cGZfYWN0aXZlID0gMDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbHRwZl9hY3RpdmUgPSAwOwotICB9Ci19Ci0KLXZvaWQgTG9uZ1Rlcm1Qb3N0ZmlsdGVyOjpydW4oY29uc3QgaW50MTZfdCogY29uc3QgeF9zXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuZWFyX255cXVpc3RfZmxhZykgewotICAvLyAzLjMuOS4yIFRpbWUtZG9tYWluIHNpZ25hbHMgIChkMDlyMDJfRjJGKQotICAvLyAuLi5qdXN0IHNvbWUgTm90ZXMgb24gZGVwZW5kZW5jaWVzIG9uIHNhbXBsZXMgaW4gdGhlIHByZXZpb3VzIGJsb2NrCi0KLSAgLy8gc2hpZnQgeF9zX2V4dGVuZGVkIGJ5IG9uZSBmcmFtZSBhbmQgYXBwZW5kIG5ldyBpbnB1dCAieF9zXyIKLSAgZm9yICh1aW50MTZfdCBtID0gMDsgbSA8IDI0MCAvIFA7IG0rKykgewotICAgIHhfc19leHRlbmRlZFttXSA9IHhfc19leHRlbmRlZFtsYzNDb25maWcuTkYgKyBtXTsKLSAgfQotICBmb3IgKHVpbnQxNl90IG0gPSAyNDAgLyBQOyBtIDwgKDI0MCAvIFAgKyBsYzNDb25maWcuTkYpOyBtKyspIHsKLSAgICB4X3NfZXh0ZW5kZWRbbV0gPSB4X3NfW20gLSAyNDAgLyBQXTsKLSAgfQotICBkb3VibGUqIHhfcyA9ICZ4X3NfZXh0ZW5kZWRbMjQwIC8gUF07Ci0gIC8vIHNoaWZ0IHhfdGlsZGVfMTJwOERfZXh0ZW5kZWQgYnkgb25lIGZyYW1lCi0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBEX0xUUEYgKyBObWVtMTJwOEQ7IG4rKykgewotICAgIHhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbbl0gPSB4X3RpbGRlXzEycDhEX2V4dGVuZGVkW24gKyBsZW4xMnA4XTsKLSAgfQotICAvLyBzaGlmdCB4XzZwNF9leHRlbmRlZCBieSBvbmUgZnJhbWUKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwga19tYXg7IG4rKykgewotICAgIHhfNnA0X2V4dGVuZGVkW25dID0geF82cDRfZXh0ZW5kZWRbbiArIGxlbjZwNF07Ci0gIH0KLQotICAvLyAzLjMuOS4zIFJlc2FtcGxpbmcgIChkMDlyMDJfRjJGKQotICBkb3VibGUqIGhfMTJwOCA9ICZ0YWJfcmVzYW1wX2ZpbHRlclsxMTldOwotICBkb3VibGUqIHhfMTJwOCA9ICZ4X3RpbGRlXzEycDhEX2V4dGVuZGVkW0RfTFRQRiArIE5tZW0xMnA4RF07Ci0gIGZvciAoaW50MTZfdCBuID0gMDsgbiA8IGxlbjEycDg7IG4rKykgewotICAgIHhfMTJwOFtuXSA9IDA7Ci0gICAgZm9yIChpbnQxNl90IGsgPSAtMTIwIC8gUDsgayA8PSAxMjAgLyBQOyBrKyspIHsKLSAgICAgIGNvbnN0IGludDE2X3QgaW5kZXhfeF9zID0gKDE1ICogbikgLyBQICsgayAtIDEyMCAvIFA7Ci0gICAgICBjb25zdCBpbnQxNl90IGluZGV4X2ggPSBQICogayAtICgoMTUgKiBuKSAlIFApOwotICAgICAgaWYgKCgtMTIwIDwgaW5kZXhfaCkgJiYgKGluZGV4X2ggPCAxMjApKSB7Ci0gICAgICAgIHhfMTJwOFtuXSArPSB4X3NbaW5kZXhfeF9zXSAqIGhfMTJwOFtpbmRleF9oXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgeF8xMnA4W25dICo9IFBfdGltZXNfcmVzX2ZhYzsgIC8vIFAgeCByZXNfZmFjIGFjY29yZGluZyB0byBFcnJhdGEgMTUyMTcKLSAgfQotCi0gIC8vIDMuMy45LjQgSGlnaC1wYXNzIGZpbHRlcmluZyAgKGQwOXIwMl9GMkYpCi0gIGZpbHRlckg1MCh4XzEycDgpOyAgLy8gaW4tcGxhY2UKLQotICAvLyAzLjMuOS41IFBpdGNoIGRldGVjdGlvbiBhbGdvcml0aG0gIChkMDlyMDZfRmhHKQotICBmbG9hdCBub3JtY29yciA9IDA7Ci0gIHVpbnQ4X3QgVF9jdXJyID0gcGl0Y2hEZXRlY3Rpb24obm9ybWNvcnIpOwotCi0gIC8vIDMuMy45LjcgTFRQRiBwaXRjaC1sYWcgcGFyYW1ldGVyICAgIChkMDlyMDJfRjJGKQotICB1aW50OF90IHBpdGNoX2ludDsKLSAgaW50OF90IHBpdGNoX2ZyOwotICBwaXRjaExhZ1BhcmFtZXRlcihUX2N1cnIsIHBpdGNoX2ludCwgcGl0Y2hfZnIpOwotCi0gIC8vIDMuMy45LjggTFRQRiBhY3RpdmF0aW9uIGJpdCAgIChkMDlyMDZfRmhHKQotICBmbG9hdCBuYyA9IDA7Ci0gIGZsb2F0IHBpdGNoID0gMDsKLSAgYWN0aXZhdGlvbkJpdChwaXRjaF9pbnQsIHBpdGNoX2ZyLCBuZWFyX255cXVpc3RfZmxhZywgbmMsIHBpdGNoKTsKLQotICAvLyAzLjMuOS42IExUUEYgQml0c3RyZWFtICAoZDA5cjA2X0tMR19BWV9OSF9GaEcsIDIwMTktMTItMjApCi0gIHBpdGNoX3ByZXNlbnQgPSAobm9ybWNvcnIgPiAwLjYpID8gMSA6IDA7Ci0KLSAgbmJpdHNfTFRQRiA9ICgwID09IHBpdGNoX3ByZXNlbnQpID8gMSA6IDExOwotCi0gIGlmICgwID09IHBpdGNoX3ByZXNlbnQpIHsKLSAgICAvLyByZXNldHRpbmcgb2YgdGhlc2UgdmFyaWFibGVzIG5vdCBmb3VuZCBleHBsaWNpdGx5IHdpdGhpbiB0aGUKLSAgICAvLyBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIHNwZWNpZmllZCBpbnRlcm1lZGlhdGUgZW5jb2RlciByZXN1bHRzIHN1Z2dlc3QKLSAgICAvLyB0aGF0IHRoZSByZXNldCBpcyBuZWVkZWQgaGVyZQotICAgIHBpdGNoX2luZGV4ID0gMDsKLSAgICBuYyA9IDA7Ci0gIH0KLQotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJwaXRjaF9pbnQiLCAmcGl0Y2hfaW50LCBzaXplb2YocGl0Y2hfaW50KSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJwaXRjaF9mciIsICZwaXRjaF9mciwgc2l6ZW9mKHBpdGNoX2ZyKSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJuY19sdHBmIiwgJm5jLCBzaXplb2YobmMpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm1lbV9sdHBmX2FjdGl2ZSIsICZtZW1fbHRwZl9hY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihtZW1fbHRwZl9hY3RpdmUpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm1lbV9uY19sdHBmIiwgJm1lbV9uYywgc2l6ZW9mKG1lbV9uYykpOwotICB9Ci0KLSAgLy8gcHJlcGFyZSBzdGF0ZXMgZm9yIG5leHQgcnVuCi0gIFRfcHJldiA9IFRfY3VycjsKLSAgbWVtX21lbV9uYyA9IG1lbV9uYzsKLSAgaWYgKDAgPT0gcGl0Y2hfcHJlc2VudCkgewotICAgIG1lbV9waXRjaCA9IDA7Ci0gICAgbWVtX2x0cGZfYWN0aXZlID0gMDsKLSAgICBtZW1fbmMgPSAwOwotICB9IGVsc2UgewotICAgIG1lbV9waXRjaCA9IHBpdGNoOwotICAgIG1lbV9sdHBmX2FjdGl2ZSA9IGx0cGZfYWN0aXZlOyAgLy8gaXMgaXQgb2sgdG8gc2V0IHRoaXMgaGVyZT8KLSAgICBtZW1fbmMgPSBuYzsKLSAgfQotfQotCi1mbG9hdCBMb25nVGVybVBvc3RmaWx0ZXI6OmNvbXB1dGVfbm9ybXZhbHVlKGNvbnN0IGRvdWJsZSogY29uc3QgeCwgdWludDhfdCBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IFQpIHsKLSAgZmxvYXQgbm9ybXZhbHVlID0gMDsKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgTDsgbisrKSB7Ci0gICAgbm9ybXZhbHVlICs9IHhbbiAtIFRdICogeFtuIC0gVF07Ci0gIH0KLSAgcmV0dXJuIG5vcm12YWx1ZTsKLX0KLQotdm9pZCBMb25nVGVybVBvc3RmaWx0ZXI6OmZpbHRlckg1MChkb3VibGUqIHh5KSAgLy8gb3BlcmF0ZSBpbi1wbGFjZQotewotICAvLyBUT0RPOiBjaGVjayB3aGV0aGVyIHRoaXMgaW1wbGVtZW50YXRpb24gaW4gRGlyZWN0LUZvcm1fSUkKLSAgLy8gICAgICAgaXMgYXBwcm9wcmlhdGUgaGVyZSAobWFpbmx5IGluIHRlcm1zIG9mIHJvYnVzdG5lc3MpCi0gIGNvbnN0IGRvdWJsZSBiMCA9IDAuOTgyNzk0NzA4Mjk3ODc3MTsKLSAgY29uc3QgZG91YmxlIGIxID0gLTEuOTY1NTg5NDE2NTk1NzU0OwotICBjb25zdCBkb3VibGUgYjIgPSAwLjk4Mjc5NDcwODI5Nzg3NzE7Ci0gIGNvbnN0IGRvdWJsZSBhMSA9IC0xLjk2NTI5MzM3MjYyMjY5MDQ7Ci0gIGNvbnN0IGRvdWJsZSBhMiA9IDAuOTY1ODg1NDYwNTY4ODE3NzsKLSAgZG91YmxlKiB4ID0geHk7Ci0gIGRvdWJsZSogeSA9IHh5OwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBsZW4xMnA4OyBuKyspIHsKLSAgICBkb3VibGUgdiA9IHhbbl0gLSBhMSAqIGg1MF9tZW1bMF0gLSBhMiAqIGg1MF9tZW1bMV07Ci0gICAgeVtuXSA9IGIwICogdiArIGIxICogaDUwX21lbVswXSArIGIyICogaDUwX21lbVsxXTsKLSAgICBoNTBfbWVtWzFdID0gaDUwX21lbVswXTsKLSAgICBoNTBfbWVtWzBdID0gdjsKLSAgfQotfQotCi12b2lkIExvbmdUZXJtUG9zdGZpbHRlcjo6cmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pIHsKLSAgZGF0YXBvaW50cyA9IGRhdGFwb2ludHNfOwotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJ4X3RpbGRlXzEyLjhEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbTm1lbTEycDhEXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiAobGVuMTJwOCArIDEpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfdGlsZGVfMTIuOERfZXh0IiwgJnhfdGlsZGVfMTJwOERfZXh0ZW5kZWRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkb3VibGUpICogKGxlbjEycDggKyBEX0xUUEYgKyBObWVtMTJwOEQpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInhfNnA0IiwgJnhfNnA0X2V4dGVuZGVkW2tfbWF4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRvdWJsZSkgKiA2NCk7Ci0KLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInBpdGNoX2luZGV4IiwgJnBpdGNoX2luZGV4LCBzaXplb2YocGl0Y2hfaW5kZXgpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInBpdGNoX3ByZXNlbnQiLCAmcGl0Y2hfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpdGNoX3ByZXNlbnQpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoImx0cGZfYWN0aXZlIiwgJmx0cGZfYWN0aXZlLCBzaXplb2YobHRwZl9hY3RpdmUpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIm5iaXRzX0xUUEYiLCAmbmJpdHNfTFRQRiwgc2l6ZW9mKG5iaXRzX0xUUEYpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvTG9uZ1Rlcm1Qb3N0ZmlsdGVyLmhwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9Mb25nVGVybVBvc3RmaWx0ZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU0ODEyLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9Mb25nVGVybVBvc3RmaWx0ZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIExvbmdUZXJtUG9zdGZpbHRlci5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBMT05HX1RFUk1fUE9TVEZJTEVSX0hfCi0jZGVmaW5lIExPTkdfVEVSTV9QT1NURklMRVJfSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLSNpbmNsdWRlICJMYzNDb25maWcuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotY2xhc3MgTG9uZ1Rlcm1Qb3N0ZmlsdGVyIHsKLSBwdWJsaWM6Ci0gIExvbmdUZXJtUG9zdGZpbHRlcihjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18sIHVpbnQxNl90IG5iaXRzKTsKLSAgdmlydHVhbCB+TG9uZ1Rlcm1Qb3N0ZmlsdGVyKCk7Ci0KLSAgTG9uZ1Rlcm1Qb3N0ZmlsdGVyJiBvcGVyYXRvcj0oY29uc3QgTG9uZ1Rlcm1Qb3N0ZmlsdGVyJik7Ci0KLSAgc3RhdGljIHVpbnQ4X3QgZ2V0UCh1aW50MTZfdCBmcyk7Ci0gIHN0YXRpYyB1aW50OF90IGdldEdhaW5MdHBmT24odWludDE2X3QgbmJpdHMsIGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnKTsKLQotICB2b2lkIHJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfKTsKLQotICB2b2lkIHJ1bihjb25zdCBpbnQxNl90KiBjb25zdCB4X3NfLCB1aW50OF90IG5lYXJfbnlxdWlzdF9mbGFnKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgZmlsdGVySDUwKGRvdWJsZSogeHkpOwotICBmbG9hdCBjb21wdXRlX25vcm12YWx1ZShjb25zdCBkb3VibGUqIGNvbnN0IHgsIHVpbnQ4X3QgTCwgdWludDhfdCBUKTsKLSAgdWludDhfdCBwaXRjaERldGVjdGlvbihmbG9hdCYgbm9ybWNvcnIpOwotICBmbG9hdCBpbnRlcnAoY29uc3QgZmxvYXQqIFJfMTJwOCwgdWludDhfdCBwaXRjaF9pbnRfcmVsLCBpbnQ4X3QgZCk7Ci0gIHZvaWQgcGl0Y2hMYWdQYXJhbWV0ZXIodWludDhfdCBUX2N1cnIsIHVpbnQ4X3QmIHBpdGNoX2ludCwgaW50OF90JiBwaXRjaF9mcik7Ci0gIGZsb2F0IHhfaV9uX2QoaW50MTZfdCBuLCBpbnQ4X3QgZCk7Ci0gIHZvaWQgYWN0aXZhdGlvbkJpdCh1aW50OF90IHBpdGNoX2ludCwgdWludDhfdCBwaXRjaF9mciwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbmVhcl9ueXF1aXN0X2ZsYWcsIGZsb2F0JiBuYywgZmxvYXQmIHBpdGNoKTsKLQotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgTm1lbTEycDhEID0gMjMyOwotICBzdGF0aWMgY29uc3QgdWludDhfdCBrX21pbiA9IDE3OwotICBzdGF0aWMgY29uc3QgdWludDhfdCBrX21heCA9IDExNDsKLQotICBjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZzsKLSAgY29uc3QgdWludDhfdCBsZW4xMnA4OwotICBjb25zdCB1aW50OF90IGxlbjZwNDsKLSAgY29uc3QgdWludDhfdCBEX0xUUEY7Ci0gIGNvbnN0IHVpbnQ4X3QgUDsKLSAgY29uc3QgdWludDhfdCBQX3RpbWVzX3Jlc19mYWM7Ci0gIGNvbnN0IHVpbnQ4X3QgZ2Fpbl9sdHBmX29uOwotCi0gIHVpbnQxNl90IHBpdGNoX2luZGV4OwotICB1aW50OF90IHBpdGNoX3ByZXNlbnQ7Ci0gIHVpbnQ4X3QgbHRwZl9hY3RpdmU7Ci0gIHVpbnQ4X3QgbmJpdHNfTFRQRjsKLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3QgVF9wcmV2OwotICBmbG9hdCBtZW1fcGl0Y2g7Ci0gIHVpbnQ4X3QgbWVtX2x0cGZfYWN0aXZlOwotICBmbG9hdCBtZW1fbmM7Ci0gIGZsb2F0IG1lbV9tZW1fbmM7Ci0gIGRvdWJsZSogeF9zX2V4dGVuZGVkOwotICBkb3VibGUqIHhfdGlsZGVfMTJwOERfZXh0ZW5kZWQ7Ci0gIGRvdWJsZSBoNTBfbWVtWzJdOwotICBkb3VibGUgeF82cDRfZXh0ZW5kZWRbNjQgKyBrX21heF07Ci0KLSAgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwotCi0jZW5kaWYgIC8vIExPTkdfVEVSTV9QT1NURklMRVJfSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9NZGN0RW5jLmNwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9NZGN0RW5jLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0YzQ1Yi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvTWRjdEVuYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIE1kY3RFbmMuY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNZGN0RW5jLmhwcCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiQmFuZEluZGV4VGFibGVzLmhwcCIKLSNpbmNsdWRlICJNZGN0V2luZG93cy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1NZGN0RW5jOjpNZGN0RW5jKGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIFgobnVsbHB0ciksCi0gICAgICBFX0IobnVsbHB0ciksCi0gICAgICBuZWFyX255cXVpc3RfZmxhZygwKSwKLSAgICAgIGRjdElWRGJsKGxjM0NvbmZpZy5ORiksCi0gICAgICBza2lwTWRjdCgwKSwKLSAgICAgIHQobnVsbHB0ciksCi0gICAgICB3TihudWxscHRyKSwKLSAgICAgIElfZnMobnVsbHB0cikgewotICBYID0gZGN0SVZEYmwub3V0OwotCi0gIEVfQiA9IG5ldyBkb3VibGVbbGMzQ29uZmlnLk5fYl07Ci0gIC8vIGluaXRpYWxpemF0aW9uIG9mIEVfQiBza2lwcGVkIHNpbmNlIHRoaXMgd2lsbCBiZSBmdWxseSByZS1jb21wdXRlZCBvbiBhbnkKLSAgLy8gcnVuIGFueXdheQotCi0gIHQgPSBuZXcgaW50MTZfdFsyICogbGMzQ29uZmlnLk5GXTsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IDIgKiBsYzNDb25maWcuTkY7IG4rKykgewotICAgIHRbbl0gPSAwOwotICB9Ci0KLSAgLy8gTm90ZTogd2UgZG8gbm90IGFkZCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZXJyb3IgY2hlY2tpbmcgYXQgdGhpcyBsZXZlbC4KLSAgLy8gICBXZSBhc3N1bWUgdGhhdCB0aGVyZSB3aWxsIGJlIG5vciBwcm9jZXNzaW5nIHdpdGggaW52YWxpZCBjb25maWd1cmF0aW9uLAotICAvLyAgIHRodXMgbm9uc2Vuc2UgcmVzdWx0cyBmb3IgaW52YWxpZCBsYzNDb25maWcuTl9tcyBhbmQvb3IgbGMzQ29uZmlnLkZzX2luZAotICAvLyAgIGFyZSBhY2NlcHRlZCBoZXJlLgotICBJX2ZzID0gJklfODAwMFswXTsgIC8vIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQgd2FybmluZ3MKLSAgd04gPSB3X044MDsgICAgICAgICAvLyBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIHdhcm5pbmdzCi0KLSAgLy8gTm90ZTogd2UgZG8gbm90IGFkZCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZXJyb3IgY2hlY2tpbmcgYXQgdGhpcyBsZXZlbC4KLSAgLy8gICBXZSBhc3N1bWUgdGhhdCB0aGVyZSB3aWxsIGJlIG5vciBwcm9jZXNzaW5nIHdpdGggaW52YWxpZCBjb25maWd1cmF0aW9uLAotICAvLyAgIHRodXMgbm9uc2Vuc2UgcmVzdWx0cyBmb3IgaW52YWxpZCBsYzNDb25maWcuTl9tcyBhbmQvb3IgbGMzQ29uZmlnLkZzX2luZAotICAvLyAgIGFyZSBhY2NlcHRlZCBoZXJlLgotICBpZiAobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkN3A1bXMpIHsKLSAgICBzd2l0Y2ggKGxjM0NvbmZpZy5Gc19pbmQpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgSV9mcyA9ICZJXzgwMDBfN3A1bXNbMF07Ci0gICAgICAgIHdOID0gd19ONjBfN3A1bXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBJX2ZzID0gJklfMTYwMDBfN3A1bXNbMF07Ci0gICAgICAgIHdOID0gd19OMTIwXzdwNW1zOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgSV9mcyA9ICZJXzI0MDAwXzdwNW1zWzBdOwotICAgICAgICB3TiA9IHdfTjE4MF83cDVtczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIElfZnMgPSAmSV8zMjAwMF83cDVtc1swXTsKLSAgICAgICAgd04gPSB3X04yNDBfN3A1bXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0OgotICAgICAgICBJX2ZzID0gJklfNDgwMDBfN3A1bXNbMF07Ci0gICAgICAgIHdOID0gd19OMzYwXzdwNW1zOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcyAoYW5kIG90aGVyIGFzIGZhbGxiYWNrKQotICAgIHN3aXRjaCAobGMzQ29uZmlnLkZzX2luZCkgewotICAgICAgY2FzZSAwOgotICAgICAgICBJX2ZzID0gJklfODAwMFswXTsKLSAgICAgICAgd04gPSB3X044MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIElfZnMgPSAmSV8xNjAwMFswXTsKLSAgICAgICAgd04gPSB3X04xNjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBJX2ZzID0gJklfMjQwMDBbMF07Ci0gICAgICAgIHdOID0gd19OMjQwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgSV9mcyA9ICZJXzMyMDAwWzBdOwotICAgICAgICB3TiA9IHdfTjMyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgIElfZnMgPSAmSV80ODAwMFswXTsKLSAgICAgICAgd04gPSB3X040ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1NZGN0RW5jOjp+TWRjdEVuYygpIHsgZGVsZXRlW10gdDsgfQotCi1jb25zdCBpbnQqIE1kY3RFbmM6OmdldF9JX2ZzKCkgY29uc3QgeyByZXR1cm4gSV9mczsgfQotCi12b2lkIE1kY3RFbmM6Ok1kY3RGYXN0RGJsKGNvbnN0IGRvdWJsZSogY29uc3QgdHcpIHsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxjM0NvbmZpZy5ORiAvIDI7IG4rKykgewotICAgIGRjdElWRGJsLmluW25dID0KLSAgICAgICAgLXR3WzMgKiBsYzNDb25maWcuTkYgLyAyIC0gMSAtIG5dIC0gdHdbMyAqIGxjM0NvbmZpZy5ORiAvIDIgKyBuXTsKLSAgfQotICBmb3IgKHVpbnQxNl90IG4gPSBsYzNDb25maWcuTkYgLyAyOyBuIDwgbGMzQ29uZmlnLk5GOyBuKyspIHsKLSAgICBkY3RJVkRibC5pbltuXSA9Ci0gICAgICAgIHR3W24gLSBsYzNDb25maWcuTkYgLyAyXSAtIHR3WzMgKiBsYzNDb25maWcuTkYgLyAyIC0gMSAtIG5dOwotICB9Ci0KLSAgZGN0SVZEYmwucnVuKCk7Ci0KLSAgZG91YmxlIGdhaW4gPSAxLjAgLyBzcXJ0KDIuMCAqIGxjM0NvbmZpZy5ORik7Ci0gIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBsYzNDb25maWcuTkY7IGsrKykgewotICAgIGRjdElWRGJsLm91dFtrXSAqPSBnYWluOwotICB9Ci19Ci0KLXZvaWQgTWRjdEVuYzo6cnVuKGNvbnN0IGludDE2X3QqIGNvbnN0IHhfcykgewotICBpZiAoc2tpcE1kY3QpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyAzLjMuNC4yIFVwZGF0ZSB0aW1lIGJ1ZmZlciAoTEMzIFNwZWNpZmljYXRpb24gZDA5cjAyX0YyRikKLSAgLy8gTm90ZTogc3BlY2lmaWNhdGlvbiBoYXMgc3RyYW5nZSBsb29wIGluZGljZXMKLSAgLy8gIC0+IGNvcnJlY3RlZCBzdGFydCBpbmRleCBhcHByb3ByaWF0ZWx5Ci0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCAobGMzQ29uZmlnLk5GIC0gbGMzQ29uZmlnLlopOyBuKyspIHsKLSAgICB0W25dID0gdFtsYzNDb25maWcuTkYgKyBuXTsKLSAgfQotICBmb3IgKHVpbnQxNl90IG4gPSBsYzNDb25maWcuTkYgLSBsYzNDb25maWcuWjsKLSAgICAgICBuIDwgKDIgKiBsYzNDb25maWcuTkYgLSBsYzNDb25maWcuWik7IG4rKykgewotICAgIHRbbl0gPSB4X3NbbGMzQ29uZmlnLlogLSBsYzNDb25maWcuTkYgKyBuXTsKLSAgfQotCi0gIC8vIDMuMy40LjMgVGltZS1GcmVxdWVuY3kgVHJhbnNmb3JtYXRpb24gKExDMyBTcGVjaWZpY2F0aW9uIGQwOXIwMl9GMkYpCi0gIGRvdWJsZSB0d1syICogbGMzQ29uZmlnLk5GXTsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IDIgKiBsYzNDb25maWcuTkY7IG4rKykgewotICAgIHR3W25dID0gd05bbl0gKiB0W25dOwotICB9Ci0gIE1kY3RGYXN0RGJsKHR3KTsKLQotICAvLyAzLjMuNC40IEVuZXJneSBlc3RpbWF0aW9uIHBlciBiYW5kICAgKGQwOXIwMl9GMkYpCi0gIGZvciAodWludDhfdCBiID0gMDsgYiA8IGxjM0NvbmZpZy5OX2I7IGIrKykgewotICAgIEVfQltiXSA9IDAuMDsKLSAgICB1aW50MTZfdCB3aWR0aCA9IElfZnNbYiArIDFdIC0gSV9mc1tiXTsKLSAgICBmb3IgKHVpbnQxNl90IGsgPSBJX2ZzW2JdOyBrIDwgSV9mc1tiICsgMV07IGsrKykgewotICAgICAgRV9CW2JdICs9IChYW2tdICogWFtrXSkgLyB3aWR0aDsKLSAgICB9Ci0gIH0KLQotICAvLyAzLjMuNC41IE5lYXIgTnlxdWlzdCBEZXRlY3RvciAoTEMzIFNwZWNpZmljYXRpb24gZDEuMHIwMzsgRXJyYXRhIDE1MDQxKQotICBpZiAobGMzQ29uZmlnLkZzIDw9IDMyMDAwKSB7Ci0gICAgY29uc3QgdWludDE2X3Qgbm5faWR4ID0gKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDdwNW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxjM0NvbmZpZy5OX2IgLSA0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGMzQ29uZmlnLk5fYiAtIDI7Ci0gICAgZG91YmxlIHVwcGVyQmFuZHNFbmVyZ3kgPSAwOwotICAgIGRvdWJsZSBsb3dlckJhbmRzRW5lcmd5ID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBsYzNDb25maWcuTl9iOyBuKyspIHsKLSAgICAgIGlmIChuIDwgbm5faWR4KSB7Ci0gICAgICAgIGxvd2VyQmFuZHNFbmVyZ3kgKz0gRV9CW25dOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXBwZXJCYW5kc0VuZXJneSArPSBFX0Jbbl07Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbnN0IGRvdWJsZSBOTl90aHJlc2ggPSAzMDsKLSAgICBuZWFyX255cXVpc3RfZmxhZyA9Ci0gICAgICAgICh1cHBlckJhbmRzRW5lcmd5ID4gTk5fdGhyZXNoICogbG93ZXJCYW5kc0VuZXJneSkgPyAxIDogMDsKLSAgfSBlbHNlIHsKLSAgICBuZWFyX255cXVpc3RfZmxhZyA9IDA7Ci0gIH0KLX0KLQotdm9pZCBNZGN0RW5jOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKSB7Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInNraXBNZGN0IiwgJnNraXBNZGN0LCBzaXplb2Yoc2tpcE1kY3QpKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIlgiLCAmWFswXSwgc2l6ZW9mKGRvdWJsZSkgKiBsYzNDb25maWcuTkYpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiRV9CIiwgJkVfQlswXSwgc2l6ZW9mKGRvdWJsZSkgKiBsYzNDb25maWcuTl9iKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIm5lYXJfbnlxdWlzdF9mbGFnIiwgJm5lYXJfbnlxdWlzdF9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmVhcl9ueXF1aXN0X2ZsYWcpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvTWRjdEVuYy5ocHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvTWRjdEVuYy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjIwYjEuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL01kY3RFbmMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIE1kY3RFbmMuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTURDVF9FTkNfSF8KLSNkZWZpbmUgTURDVF9FTkNfSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLSNpbmNsdWRlICJEY3RJVi5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIExjM0VuYyB7Ci0KLWNsYXNzIE1kY3RFbmMgewotIHB1YmxpYzoKLSAgTWRjdEVuYyhjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18pOwotICB2aXJ0dWFsIH5NZGN0RW5jKCk7Ci0KLSAgdm9pZCByZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzKTsKLQotICB2b2lkIHJ1bihjb25zdCBpbnQxNl90KiBjb25zdCB4X3MpOwotCi0gIGNvbnN0IGludCogZ2V0X0lfZnMoKSBjb25zdDsKLQotICBjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZzsKLQotICBkb3VibGUqIFg7Ci0gIGRvdWJsZSogRV9COwotICB1aW50OF90IG5lYXJfbnlxdWlzdF9mbGFnOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBNZGN0RmFzdERibChjb25zdCBkb3VibGUqIGNvbnN0IHR3KTsKLQotICBEY3RJVkRibCBkY3RJVkRibDsKLQotICB1aW50OF90IHNraXBNZGN0OyAgLy8ganVzdCBmb3IgdGVzdGluZzsgZmluZCBhIGJldHRlciBzb2x1dGlvbj8KLSAgaW50MTZfdCogdDsKLSAgZG91YmxlKiB3TjsKLSAgY29uc3QgaW50KiBJX2ZzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwotCi0jZW5kaWYgIC8vIE1EQ1RfRU5DX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvTm9pc2VMZXZlbEVzdGltYXRpb24uY3BwIGIvZW1iZHJ2L2xjMy9FbmNvZGVyL05vaXNlTGV2ZWxFc3RpbWF0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhYTVkYi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvTm9pc2VMZXZlbEVzdGltYXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIE5vaXNlTGV2ZWxFc3RpbWF0aW9uLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTm9pc2VMZXZlbEVzdGltYXRpb24uaHBwIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNtYXRoPgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotTm9pc2VMZXZlbEVzdGltYXRpb246Ok5vaXNlTGV2ZWxFc3RpbWF0aW9uKGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwgRl9ORigwKSwgZGF0YXBvaW50cyhudWxscHRyKSB7fQotCi1Ob2lzZUxldmVsRXN0aW1hdGlvbjo6fk5vaXNlTGV2ZWxFc3RpbWF0aW9uKCkge30KLQotdm9pZCBOb2lzZUxldmVsRXN0aW1hdGlvbjo6cnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnN0IFhfcSwgdWludDhfdCBQX2J3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBnZykgewotICBjb25zdCB1aW50MTZfdCBid19zdG9wX3RhYmxlXzEwbXNbNV0gPSB7ODAsIDE2MCwgMjQwLCAzMjAsIDQwMH07Ci0gIGNvbnN0IHVpbnQxNl90IGJ3X3N0b3BfdGFibGVfN3A1bXNbNV0gPSB7NjAsIDEyMCwgMTgwLCAyNDAsIDMwMH07Ci0gIGNvbnN0IHVpbnQxNl90IGJ3X3N0b3AgPSAoTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcyA9PSBsYzNDb25maWcuTl9tcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJ3X3N0b3BfdGFibGVfMTBtc1tQX2J3XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYndfc3RvcF90YWJsZV83cDVtc1tQX2J3XTsKLSAgdWludDE2X3QgTkZfc3RhcnQgPQotICAgICAgKExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMgPT0gbGMzQ29uZmlnLk5fbXMpID8gMjQgOiAxODsKLSAgdWludDE2X3QgTkZfd2lkdGggPQotICAgICAgKExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMgPT0gbGMzQ29uZmlnLk5fbXMpID8gMyA6IDI7Ci0KLSAgZG91YmxlIExfTkZfbnVtZXJhdG9yID0gMDsKLSAgdWludDE2X3QgTF9ORl9kZW5vbWluYXRvciA9IDA7Ci0gIGZvciAodWludDE2X3QgayA9IE5GX3N0YXJ0OyAoayA8IGxjM0NvbmZpZy5ORSkgJiYgKGsgPCBid19zdG9wKTsgaysrKSB7Ci0gICAgYm9vbCBJX05GX2sgPSB0cnVlOwotICAgIGZvciAodWludDE2X3QgaSA9IGsgLSBORl93aWR0aDsgKGkgPCBid19zdG9wKSAmJiAoaSA8PSBrICsgTkZfd2lkdGgpOyBpKyspIHsKLSAgICAgIGlmIChYX3FbaV0gIT0gMCkgewotICAgICAgICAvLyAtPiBJX05GW2tdID0gMDsKLSAgICAgICAgSV9ORl9rID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoSV9ORl9rKSB7Ci0gICAgICAvLyBMX05GX251bWVyYXRvciArPSBmYWJzKFhfZltrXSk7Ci0gICAgICBMX05GX251bWVyYXRvciArPSAoWF9mW2tdID4gMCkgPyBYX2Zba10gOiAtWF9mW2tdOwotICAgICAgTF9ORl9kZW5vbWluYXRvcisrOwotICAgIH0KLSAgfQotICBkb3VibGUgTF9ORiA9IDA7Ci0gIGlmICgoTF9ORl9kZW5vbWluYXRvciA+IDApICYmIChnZyA+IDApKSB7Ci0gICAgLy8gTF9ORl9udW1lcmF0b3IgLz0gZ2c7Ci0gICAgTF9ORiA9IExfTkZfbnVtZXJhdG9yIC8gZ2cgLyBMX05GX2Rlbm9taW5hdG9yOwotICB9Ci0KLSAgZG91YmxlIGRpZmYgPSA4IC0gMTYgKiBMX05GOwotICBpZiAoZGlmZiA+PSAwKSB7Ci0gICAgRl9ORiA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PGludD4oZGlmZiArIDAuNSksCi0gICAgICAgICAgICAgICAgICAgIDcpOyAgLy8gc3BlY2lmaWNhdGlvbiBzYXlzIHJvdW5kaW5nLAotICAgIC8vIEZfTkYgPSBzdGQ6Om1pbiggc3RhdGljX2Nhc3Q8aW50PihjZWlsKGRpZmYpKSwgNyApOyAgLy8gYnV0IHNvbWV0aW1lcyBpdAotICAgIC8vIHNlZW1zIGxpa2UgdGhlIHJlZmVyZW5jZSBlbmNvZGVyIGNvbXB1dGVzIGNlaWwoLikKLSAgfSBlbHNlIHsKLSAgICBGX05GID0gMDsKLSAgfQotCi0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5sb2coIkxfTkYiLCAmTF9ORiwgc2l6ZW9mKExfTkYpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIkxfTkZfbnVtZXJhdG9yIiwgJkxfTkZfbnVtZXJhdG9yLCBzaXplb2YoTF9ORl9udW1lcmF0b3IpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIkxfTkZfZGVub21pbmF0b3IiLCAmTF9ORl9kZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExfTkZfZGVub21pbmF0b3IpKTsKLSAgfQotfQotCi12b2lkIE5vaXNlTGV2ZWxFc3RpbWF0aW9uOjpyZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzXykgewotICBkYXRhcG9pbnRzID0gZGF0YXBvaW50c187Ci0gIGlmIChudWxscHRyICE9IGRhdGFwb2ludHMpIHsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIkZfTkYiLCAmRl9ORiwgc2l6ZW9mKEZfTkYpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL0VuY29kZXIvTm9pc2VMZXZlbEVzdGltYXRpb24uaHBwIGIvZW1iZHJ2L2xjMy9FbmNvZGVyL05vaXNlTGV2ZWxFc3RpbWF0aW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyM2FkZC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvTm9pc2VMZXZlbEVzdGltYXRpb24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIE5vaXNlTGV2ZWxFc3RpbWF0aW9uLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5PSVNFX0xFVkVMX0VTVElNQVRJT05fSF8KLSNkZWZpbmUgTk9JU0VfTEVWRUxfRVNUSU1BVElPTl9IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotI2luY2x1ZGUgIkxjM0NvbmZpZy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1jbGFzcyBOb2lzZUxldmVsRXN0aW1hdGlvbiB7Ci0gcHVibGljOgotICBOb2lzZUxldmVsRXN0aW1hdGlvbihjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18pOwotICB2aXJ0dWFsIH5Ob2lzZUxldmVsRXN0aW1hdGlvbigpOwotCi0gIHZvaWQgcmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pOwotCi0gIHZvaWQgcnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWF9mLCBjb25zdCBpbnQxNl90KiBjb25zdCBYX3EsIHVpbnQ4X3QgUF9idywKLSAgICAgICAgICAgZG91YmxlIGdnKTsKLQotICBjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZzsKLSAgdWludDhfdCBGX05GOwotCi0gcHJpdmF0ZToKLSAgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwotCi0jZW5kaWYgIC8vIE5PSVNFX0xFVkVMX0VTVElNQVRJT05fSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9TbnNRdWFudGl6YXRpb24uY3BwIGIvZW1iZHJ2L2xjMy9FbmNvZGVyL1Nuc1F1YW50aXphdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2IwZjguLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL1Nuc1F1YW50aXphdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoKLSAqIFNuc1F1YW50aXphdGlvbi5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlNuc1F1YW50aXphdGlvbi5ocHAiCi0KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJTbnNRdWFudGl6YXRpb25UYWJsZXMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotU25zUXVhbnRpemF0aW9uOjpTbnNRdWFudGl6YXRpb24oKQotICAgIDogaW5kX0xGKDApLAotICAgICAgaW5kX0hGKDApLAotICAgICAgc2hhcGVfaigwKSwKLSAgICAgIEdpbmQoMCksCi0gICAgICBMU19pbmRBKDApLAotICAgICAgTFNfaW5kQigwKSwKLSAgICAgIGluZGV4X2pvaW50X2ooMCksCi0gICAgICBpZHhBKDApLAotICAgICAgaWR4QigwKSwKLSAgICAgIGRhdGFwb2ludHMobnVsbHB0cikge30KLQotU25zUXVhbnRpemF0aW9uOjp+U25zUXVhbnRpemF0aW9uKCkge30KLQotdm9pZCBTbnNRdWFudGl6YXRpb246OnJ1bihjb25zdCBkb3VibGUqIGNvbnN0IHNjZikgewotICAvLyAzLjMuNy4zLjIgU3RhZ2UgMSAgKGQwOXIwMl9GMkYpCi0gIGlmICghc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpoYXNfaW5maW5pdHkpIHsKLSAgICAvLyB3ZSBuZXZlciBzaG91bGQgcmVhY2ggdGhpcyBsaW5lLCBidXQgcmVhbGx5IHdhbnQgdG8gbWFrZSBzdXJlIHRvCi0gICAgLy8gZ28gZnVydGhlciB3aGVuIHRoZSBhc3N1bWVkIGluZmluaXR5KCkgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkCi0gICAgcmV0dXJuOwotICB9Ci0gIGRvdWJsZSBkTVNFX0xGX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLSAgZG91YmxlIGRNU0VfSEZfbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgZG91YmxlIGRNU0VfTEZfaSA9IDA7Ci0gICAgZG91YmxlIGRNU0VfSEZfaSA9IDA7Ci0gICAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgODsgbisrKSB7Ci0gICAgICBkTVNFX0xGX2kgKz0gKHNjZltuXSAtIExGQ0JbaV1bbl0pICogKHNjZltuXSAtIExGQ0JbaV1bbl0pOwotICAgICAgZE1TRV9IRl9pICs9IChzY2ZbbiArIDhdIC0gSEZDQltpXVtuXSkgKiAoc2NmW24gKyA4XSAtIEhGQ0JbaV1bbl0pOwotICAgIH0KLSAgICBpZiAoZE1TRV9MRl9pIDwgZE1TRV9MRl9taW4pIHsKLSAgICAgIGluZF9MRiA9IGk7Ci0gICAgICBkTVNFX0xGX21pbiA9IGRNU0VfTEZfaTsKLSAgICB9Ci0gICAgaWYgKGRNU0VfSEZfaSA8IGRNU0VfSEZfbWluKSB7Ci0gICAgICBpbmRfSEYgPSBpOwotICAgICAgZE1TRV9IRl9taW4gPSBkTVNFX0hGX2k7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlIGZpcnN0IHN0YWdlIHZlY3RvciBpcyBjb21wb3NlZCBhczoKLSAgLy/wnZGg8J2RoTEo8J2RmykgPSDwnZC/8J2QufCdkLbwnZC18J2RlvCdkZvwnZGRX/CdkL/wnZC5ICjwnZGbKSwg8J2Rk/CdkZzwnZGfIPCdkZsgPSBbMCDigKYgN10sICMgKDMzKQotICAvL/CdkaDwnZGhMSjwnZGbICsgOCkgPSDwnZC78J2QufCdkLbwnZC18J2RlvCdkZvwnZGRX/CdkLvwnZC5KPCdkZspLCDwnZGT8J2RnPCdkZ8g8J2RmyA9IFswIOKApiA3XSwgIyAoMzQpCi0gIGRvdWJsZSBzdDFbMTZdOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCA4OyBuKyspIHsKLSAgICBzdDFbbl0gPSBMRkNCW2luZF9MRl1bbl07Ci0gICAgc3QxW24gKyA4XSA9IEhGQ0JbaW5kX0hGXVtuXTsKLSAgfQotICBkb3VibGUgcjFbMTZdOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCAxNjsgbisrKSB7Ci0gICAgcjFbbl0gPSBzY2Zbbl0gLSBzdDFbbl07Ci0gIH0KLQotICAvLyAzLjMuNy4zLjMgU3RhZ2UgMiAgKGQwOXIwMl9GMkYpCi0gIC8vIDMuMy43LjMuMy4zIFN0YWdlIDIgdGFyZ2V0IHByZXBhcmF0aW9uICAoZDA5cjAyX0YyRikKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgMTY7IG4rKykgewotICAgIHQycm90W25dID0gMDsKLSAgICBmb3IgKHVpbnQ4X3Qgcm93ID0gMDsgcm93IDwgMTY7IHJvdysrKSB7Ci0gICAgICB0MnJvdFtuXSArPSByMVtyb3ddICogRFtyb3ddW25dOwotICAgIH0KLSAgfQotCi0gIC8vIDMuMy43LjMuMy40IFNoYXBlIGNhbmRpZGF0ZXMgIChkMDlyMDJfRjJGKQotICAvLyAzLjMuNy4zLjMuNSBTdGFnZSAyIHNoYXBlIHNlYXJjaCAoZDA5cjAyX0YyRikKLQotICAvLyAgICgzKSBTaGFwZSBuYW1lOiDigJhvdXRsaWVyX2ZhcuKAmQotICAvLyAgIFNjYWxlIGZhY3RvciBzZXQgQTogezAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTV9Ci0gIC8vICAgU2NhbGUgZmFjdG9yIHNldCBCOiBFbXB0eSBzZXQKLSAgLy8gICBQdWxzZSBjb25maWd1cmF0aW9uLCBTZXQgQSwgUFZRKE5BLCBLQSk6IFBWUSgxNiwgNikKLSAgLy8gICBQdWxzZSBjb25maWd1cmF0aW9uLCBTZXQgQiwgUFZRKE5CLCBLQik6IEVtcHR5Ci0KLSAgLy8gc3RlcCAxICAtPiB5MyxzdGFydAotICAvLyAgIFByb2plY3QgdG8gb3IgYmVsb3cgcHlyYW1pZCBOPTE2LCBLPTYsCi0gIC8vICAgKGFuZCB1cGRhdGUgZW5lcmd5IGVuZXJneXkgYW5kIGNvcnJlbGF0aW9uIGNvcnJ4eSB0ZXJtcyB0byByZWZsZWN0Ci0gIC8vICAgdGhlIHB1bHNlcyBwcmVzZW50IGluIHkzLCBzdGFydCApCi0gIHVpbnQ4X3QgSyA9IDY7Ci0gIHVpbnQ4X3QgTiA9IDE2OwotICBkb3VibGUgcHJval9mYWMgPSAwOwotICBkb3VibGUgYWJzX3hbTl07Ci0gIGZvciAodWludDhfdCBuID0gMDsgbiA8IE47IG4rKykgewotICAgIGFic194W25dID0gZmFicyh0MnJvdFtuXSk7Ci0gICAgcHJval9mYWMgKz0gYWJzX3hbbl07Ci0gIH0KLSAgcHJval9mYWMgPSAoSyAtIDEpIC8gcHJval9mYWM7Ci0KLSAgdWludDhfdCBrID0gMDsKLSAgZG91YmxlIGNvcnJfeHkgPSAwOwotICBkb3VibGUgZW5lcmd5X3kgPSAwOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBOOyBuKyspIHsKLSAgICBzbnNfWTNbbl0gPSBmbG9vcihhYnNfeFtuXSAqIHByb2pfZmFjKTsKLSAgICBpZiAoc25zX1kzW25dICE9IDApIHsKLSAgICAgIGsgKz0gc25zX1kzW25dOwotICAgICAgY29ycl94eSArPSBzbnNfWTNbbl0gKiBhYnNfeFtuXTsKLSAgICAgIGVuZXJneV95ICs9IHNuc19ZM1tuXSAqIHNuc19ZM1tuXTsKLSAgICB9Ci0gIH0KLQotICAvLyBzdGVwIDIgLT4geTMgLT4geTIsc3RhcnQKLSAgLy8gICBBZGQgdW5pdCBwdWxzZXMgdW50aWwgeW91IHJlYWNoIEs9NiBvdmVyIE49MTYgc2FtcGxlcywgc2F2ZSB5MwotICBkb3VibGUgY29ycl94eV9sYXN0ID0gY29ycl94eTsKLSAgZG91YmxlIGVuZXJneV95X2xhc3QgPSBlbmVyZ3lfeTsKLSAgZm9yICgvKnN0YXJ0IHdpdGggZXhpc3RpbmcgayBpbnRlbnRpb25hbGx5Ki87IGsgPCBLOyBrKyspIHsKLSAgICB1aW50OF90IG5fYyA9IDA7Ci0gICAgdWludDhfdCBuX2Jlc3QgPSAwOwotICAgIGNvcnJfeHkgPSBjb3JyX3h5X2xhc3QgKyAxICogYWJzX3hbbl9jXTsKLSAgICBkb3VibGUgYmVzdENvcnJTcSA9IGNvcnJfeHkgKiBjb3JyX3h5OwotICAgIGRvdWJsZSBiZXN0RW4gPSBlbmVyZ3lfeV9sYXN0ICsgMiAqIDEgKiBzbnNfWTNbbl9jXSArIDEgKiAxOwotICAgIGZvciAobl9jID0gMTsgbl9jIDwgTjsgbl9jKyspIHsKLSAgICAgIGNvcnJfeHkgPSBjb3JyX3h5X2xhc3QgKyAxICogYWJzX3hbbl9jXTsKLSAgICAgIGVuZXJneV95ID0gZW5lcmd5X3lfbGFzdCArIDIgKiAxICogc25zX1kzW25fY10gKyAxICogMTsKLSAgICAgIGlmIChjb3JyX3h5ICogY29ycl94eSAqIGJlc3RFbiA+IGJlc3RDb3JyU3EgKiBlbmVyZ3lfeSkgewotICAgICAgICBuX2Jlc3QgPSBuX2M7Ci0gICAgICAgIGJlc3RDb3JyU3EgPSBjb3JyX3h5ICogY29ycl94eTsKLSAgICAgICAgYmVzdEVuID0gZW5lcmd5X3k7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvcnJfeHlfbGFzdCArPSAxICogYWJzX3hbbl9iZXN0XTsKLSAgICBlbmVyZ3lfeV9sYXN0ICs9IDIgKiAxICogc25zX1kzW25fYmVzdF0gKyAxICogMTsKLSAgICBzbnNfWTNbbl9iZXN0XSsrOwotICB9Ci0KLSAgLy8gICAoMikgU2hhcGUgbmFtZTog4oCYb3V0bGllcl9uZWFy4oCZCi0gIC8vICAgU2NhbGUgZmFjdG9yIHNldCBBOiB7MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNX0KLSAgLy8gICBTY2FsZSBmYWN0b3Igc2V0IEI6IEVtcHR5IHNldAotICAvLyAgIFB1bHNlIGNvbmZpZ3VyYXRpb24sIFNldCBBLCBQVlEoTkEsIEtBKTogUFZRKDE2LCA4KQotICAvLyAgIFB1bHNlIGNvbmZpZ3VyYXRpb24sIFNldCBCLCBQVlEoTkIsIEtCKTogRW1wdHkKLQotICAvLyBzdGVwIDMgLT4geTIgLT4geTEscHJlLXN0YXJ0Ci0gIC8vICAgQWRkIHVuaXQgcHVsc2VzIHVudGlsIHlvdSByZWFjaCBLPTggb3ZlciBOPTE2IHNhbXBsZXMsIHNhdmUgeTIKLSAgTiA9IDE2OwotICBLID0gODsKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgTjsgbisrKSB7Ci0gICAgc25zX1kyW25dID0gc25zX1kzW25dOwotICB9Ci0gIGZvciAoLypzdGFydCB3aXRoIGV4aXN0aW5nIGsgaW50ZW50aW9uYWxseSovOyBrIDwgSzsgaysrKSB7Ci0gICAgdWludDhfdCBuX2MgPSAwOwotICAgIHVpbnQ4X3Qgbl9iZXN0ID0gMDsKLSAgICBjb3JyX3h5ID0gY29ycl94eV9sYXN0ICsgMSAqIGFic194W25fY107Ci0gICAgZG91YmxlIGJlc3RDb3JyU3EgPSBjb3JyX3h5ICogY29ycl94eTsKLSAgICBkb3VibGUgYmVzdEVuID0gZW5lcmd5X3lfbGFzdCArIDIgKiAxICogc25zX1kyW25fY10gKyAxICogMTsKLSAgICBmb3IgKG5fYyA9IDE7IG5fYyA8IE47IG5fYysrKSB7Ci0gICAgICBjb3JyX3h5ID0gY29ycl94eV9sYXN0ICsgMSAqIGFic194W25fY107Ci0gICAgICBlbmVyZ3lfeSA9IGVuZXJneV95X2xhc3QgKyAyICogMSAqIHNuc19ZMltuX2NdICsgMSAqIDE7Ci0gICAgICBpZiAoY29ycl94eSAqIGNvcnJfeHkgKiBiZXN0RW4gPiBiZXN0Q29yclNxICogZW5lcmd5X3kpIHsKLSAgICAgICAgbl9iZXN0ID0gbl9jOwotICAgICAgICBiZXN0Q29yclNxID0gY29ycl94eSAqIGNvcnJfeHk7Ci0gICAgICAgIGJlc3RFbiA9IGVuZXJneV95OwotICAgICAgfQotICAgIH0KLSAgICBjb3JyX3h5X2xhc3QgKz0gMSAqIGFic194W25fYmVzdF07Ci0gICAgZW5lcmd5X3lfbGFzdCArPSAyICogMSAqIHNuc19ZMltuX2Jlc3RdICsgMSAqIDE7Ci0gICAgc25zX1kyW25fYmVzdF0rKzsKLSAgfQotCi0gIC8vICAgKDEpIFNoYXBlIG5hbWU6IOKAmHJlZ3VsYXJfbGbigJkKLSAgLy8gICBTY2FsZSBmYWN0b3Igc2V0IEE6IHswLDEsMiwzLDQsNSw2LDcsOCw5fQotICAvLyAgIFNjYWxlIGZhY3RvciBzZXQgQjogezEwLDExLDEyLDEzLDE0LDE1fQotICAvLyAgIFB1bHNlIGNvbmZpZ3VyYXRpb24sIFNldCBBLCBQVlEoTkEsIEtBKTogUFZRKDEwLCAxMCkKLSAgLy8gICBQdWxzZSBjb25maWd1cmF0aW9uLCBTZXQgQiwgUFZRKE5CLCBLQik6IFplcm9lZAotCi0gIC8vIHN0ZXAgNCAtPiB5MSxzdGFydAotICAvLyAgIFJlbW92ZSBhbnkgdW5pdCBwdWxzZXMgaW4geTEscHJlLXN0YXJ0IHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHNldCBBIHRvCi0gIC8vICAgeWllbGQgeTEsIHN0YXJ0Ci0gIE4gPSAxMDsKLSAgSyA9IDEwOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBOOyBuKyspIHsKLSAgICBzbnNfWTFbbl0gPSBzbnNfWTJbbl07Ci0gIH0KLQotICAvLyBzdGVwIDUKLSAgLy8gICBVcGRhdGUgZW5lcmd5IGVuZXJneXkgYW5kIGNvcnJlbGF0aW9uIGNvcnJ4eSB0ZXJtcyB0byByZWZsZWN0IHRoZQotICAvLyAgIHB1bHNlcyBwcmVzZW50IGluIHkxLCBzdGFydAotICBmb3IgKHVpbnQ4X3QgbiA9IE47IG4gPCAxNjsgbisrKSB7Ci0gICAgaWYgKHNuc19ZMltuXSAhPSAwKSB7Ci0gICAgICBrIC09IHNuc19ZMltuXTsKLSAgICAgIGNvcnJfeHlfbGFzdCAtPSBzbnNfWTJbbl0gKiBhYnNfeFtuXTsKLSAgICAgIGVuZXJneV95X2xhc3QgLT0gc25zX1kyW25dICogc25zX1kyW25dOwotICAgIH0KLSAgfQotCi0gIC8vIHN0ZXAgNiAtPiAgeTEgLT4geTAsc3RhcnQKLSAgLy8gICBBZGQgdW5pdCBwdWxzZXMgdW50aWwgeW91IHJlYWNoIEs9MTAgb3ZlciBOPTEwIHNhbXBsZXMgKGluIHNldCBBKSwKLSAgLy8gICBzYXZlIHkxCi0gIGZvciAoLypzdGFydCB3aXRoIGV4aXN0aW5nIGsgaW50ZW50aW9uYWxseSovOyBrIDwgSzsgaysrKSB7Ci0gICAgdWludDhfdCBuX2MgPSAwOwotICAgIHVpbnQ4X3Qgbl9iZXN0ID0gMDsKLSAgICBjb3JyX3h5ID0gY29ycl94eV9sYXN0ICsgMSAqIGFic194W25fY107Ci0gICAgZG91YmxlIGJlc3RDb3JyU3EgPSBjb3JyX3h5ICogY29ycl94eTsKLSAgICBkb3VibGUgYmVzdEVuID0gZW5lcmd5X3lfbGFzdCArIDIgKiAxICogc25zX1kxW25fY10gKyAxICogMTsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGspIDw8ICIgbl9jOiAiIDw8Ci0gICAgLy8gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG5fYykgPDwgIiAtPiAiIDw8ICAoYmVzdENvcnJTcS9iZXN0RW4pIDw8ICIgeDogIiA8PAotICAgIC8vIGFic194W25fY10gPDwgc3RkOjplbmRsOwotICAgIGZvciAobl9jID0gMTsgbl9jIDwgTjsgbl9jKyspIHsKLSAgICAgIGNvcnJfeHkgPSBjb3JyX3h5X2xhc3QgKyAxICogYWJzX3hbbl9jXTsKLSAgICAgIGVuZXJneV95ID0gZW5lcmd5X3lfbGFzdCArIDIgKiAxICogc25zX1kxW25fY10gKyAxICogMTsKLSAgICAgIC8vIHN0ZDo6Y291dCA8PCBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaykgPDwgIiBuX2M6ICIgPDwKLSAgICAgIC8vIHN0YXRpY19jYXN0PHVpbnQxNl90PihuX2MpIDw8ICIgLT4gIiA8PCAgKGNvcnJfeHkqY29ycl94eS9lbmVyZ3lfeSkgPDwKLSAgICAgIC8vICIgeDogIiA8PCBhYnNfeFtuX2NdIDw8ICBzdGQ6OmVuZGw7Ci0gICAgICBpZiAoY29ycl94eSAqIGNvcnJfeHkgKiBiZXN0RW4gPiBiZXN0Q29yclNxICogZW5lcmd5X3kpIHsKLSAgICAgICAgbl9iZXN0ID0gbl9jOwotICAgICAgICBiZXN0Q29yclNxID0gY29ycl94eSAqIGNvcnJfeHk7Ci0gICAgICAgIGJlc3RFbiA9IGVuZXJneV95OwotICAgICAgfQotICAgIH0KLSAgICBjb3JyX3h5X2xhc3QgKz0gMSAqIGFic194W25fYmVzdF07Ci0gICAgZW5lcmd5X3lfbGFzdCArPSAyICogMSAqIHNuc19ZMVtuX2Jlc3RdICsgMSAqIDE7Ci0gICAgc25zX1kxW25fYmVzdF0rKzsKLSAgICAvLyBzdGQ6OmNvdXQgPDwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGspIDw8ICIgbl9iZXN0OiAiIDw8Ci0gICAgLy8gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG5fYmVzdCkgPDwgIiAtPiAiIDw8Ci0gICAgLy8gKGNvcnJfeHlfbGFzdCpjb3JyX3h5X2xhc3QvZW5lcmd5X3lfbGFzdCkgPDwgc3RkOjplbmRsOwotICB9Ci0KLSAgLy8gICAoMCkgU2hhcGUgbmFtZTog4oCYcmVndWxhcuKAmQotICAvLyAgIFNjYWxlIGZhY3RvciBzZXQgQTogezAsMSwyLDMsNCw1LDYsNyw4LDl9Ci0gIC8vICAgU2NhbGUgZmFjdG9yIHNldCBCOiB7MTAsMTEsMTIsMTMsMTQsMTV9Ci0gIC8vICAgUHVsc2UgY29uZmlndXJhdGlvbiwgU2V0IEEsIFBWUShOQSwgS0EpOiBQVlEoMTAsIDEwKQotICAvLyAgIFB1bHNlIGNvbmZpZ3VyYXRpb24sIFNldCBCLCBQVlEoTkIsIEtCKTogUFZRKDYsIDEpCi0KLSAgLy8gc3RlcCA3IC0+IHkwCi0gIC8vICAgQWRkIHVuaXQgcHVsc2VzIHRvIHkwLHN0YXJ0IHVudGlsIHlvdSByZWFjaCBLPTEgb3ZlciBOPTYgc2FtcGxlcwotICAvLyAgKGluIHNldCBCKSwgc2F2ZSB5MAotICAvLyBBCi0gIE4gPSAxMDsKLSAgSyA9IDEwOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBOOyBuKyspIHsKLSAgICBzbnNfWTBbbl0gPSBzbnNfWTFbbl07Ci0gIH0KLSAgLy8gQgotICBOID0gNjsKLSAgSyA9IDE7Ci0gIGRvdWJsZSBtYXhfYWJzX3ggPSAwOwotICB1aW50OF90IG5fYmVzdCA9IDA7Ci0gIGZvciAodWludDhfdCBuX2MgPSAxMDsgbl9jIDwgTiArIDEwOyBuX2MrKykgewotICAgIHNuc19ZMFtuX2NdID0gMDsKLSAgICBpZiAoYWJzX3hbbl9jXSA+IG1heF9hYnNfeCkgewotICAgICAgbWF4X2Fic194ID0gYWJzX3hbbl9jXTsKLSAgICAgIG5fYmVzdCA9IG5fYzsKLSAgICB9Ci0gIH0KLSAgc25zX1kwW25fYmVzdF0gPSAxOwotCi0gIC8vIHN0ZXAgOCAtPiB5MywgeTIsIHkxLCB5MAotICAvLyAgIEFkZCBzaWducyB0byBub24temVybyBwb3NpdGlvbnMgb2YgZWFjaCB5aiB2ZWN0b3IgZnJvbSB0aGUgdGFyZ2V0Ci0gIC8vICAgdmVjdG9yIHgsIHNhdmUgeTMsIHkyLCB5MSwgeTAgYXMgc2hhcGUgdmVjdG9yIGNhbmRpZGF0ZXMgKGFuZCBmb3IKLSAgLy8gICBzdWJzZXF1ZW50IGluZGV4aW5nIG9mIG9uZSBvZiB0aGVtKQotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCAxMDsgbisrKSB7Ci0gICAgaWYgKHQycm90W25dIDwgMCkgewotICAgICAgc25zX1kwW25dICo9IC0xOwotICAgICAgc25zX1kxW25dICo9IC0xOwotICAgICAgc25zX1kyW25dICo9IC0xOwotICAgICAgc25zX1kzW25dICo9IC0xOwotICAgIH0KLSAgfQotICBmb3IgKHVpbnQ4X3QgbiA9IDEwOyBuIDwgMTY7IG4rKykgewotICAgIGlmICh0MnJvdFtuXSA8IDApIHsKLSAgICAgIHNuc19ZMFtuXSAqPSAtMTsKLSAgICAgIHNuc19ZMltuXSAqPSAtMTsKLSAgICAgIHNuc19ZM1tuXSAqPSAtMTsKLSAgICB9Ci0gIH0KLQotICAvLyBzdGVwIDkKLSAgLy8gVW5pdCBlbmVyZ3kgbm9ybWFsaXplIGVhY2ggeWogdmVjdG9yIHRvIGNhbmRpZGF0ZSB2ZWN0b3IgeHFfagotICBub3JtYWxpemVDYW5kaWRhdGUoc25zX1kwLCBzbnNfWFEwLCAxNik7Ci0gIG5vcm1hbGl6ZUNhbmRpZGF0ZShzbnNfWTEsIHNuc19YUTEsIDEwKTsKLSAgbm9ybWFsaXplQ2FuZGlkYXRlKHNuc19ZMiwgc25zX1hRMiwgMTYpOwotICBub3JtYWxpemVDYW5kaWRhdGUoc25zX1kzLCBzbnNfWFEzLCAxNik7Ci0KLSAgLy8gMy4zLjcuMy4zLjYgQWRqdXN0bWVudCBnYWluIGNhbmRpZGF0ZXMgKGQwOXIwMl9GMkYpCi0gIC8vIDMuMy43LjMuMy43IFNoYXBlIGFuZCBnYWluIGNvbWJpbmF0aW9uIGRldGVybWluYXRpb24gKGQwOXIwMl9GMkYpCi0gIHNoYXBlX2ogPSAwOwotICBHaW5kID0gMDsKLSAgZG91YmxlIEdfZ2Fpbl9pX3NoYXBlX2ogPSAwOwotICBkb3VibGUqIHNuc19YUV9zaGFwZV9qID0gbnVsbHB0cjsKLSAgZG91YmxlIGRNU0VfbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotICBmb3IgKHVpbnQ4X3QgaiA9IDA7IGogPCA0OyBqKyspIHsKLSAgICB1aW50OF90IEdtYXhpbmRfajsKLSAgICBkb3VibGUqIHNuc192cV9nYWluczsKLSAgICBkb3VibGUqIHNuc19YUTsKLSAgICBzd2l0Y2ggKGopIHsKLSAgICAgIGRlZmF1bHQ6OyAgLy8gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggdG8gY2FzZSAwOyBqdXN0IHRvIGF2b2lkIGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgIC8vIHdhcm5pbmcKLSAgICAgIGNhc2UgMDogewotICAgICAgICBHbWF4aW5kX2ogPSAxOwotICAgICAgICBzbnNfdnFfZ2FpbnMgPSBzbnNfdnFfcmVnX2Fkal9nYWluczsKLSAgICAgICAgc25zX1hRID0gc25zX1hRMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgR21heGluZF9qID0gMzsKLSAgICAgICAgc25zX3ZxX2dhaW5zID0gc25zX3ZxX3JlZ19sZl9hZGpfZ2FpbnM7Ci0gICAgICAgIHNuc19YUSA9IHNuc19YUTE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIEdtYXhpbmRfaiA9IDM7Ci0gICAgICAgIHNuc192cV9nYWlucyA9IHNuc192cV9uZWFyX2Fkal9nYWluczsKLSAgICAgICAgc25zX1hRID0gc25zX1hRMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgR21heGluZF9qID0gNzsKLSAgICAgICAgc25zX3ZxX2dhaW5zID0gc25zX3ZxX2Zhcl9hZGpfZ2FpbnM7Ci0gICAgICAgIHNuc19YUSA9IHNuc19YUTM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPD0gR21heGluZF9qOyBpKyspIHsKLSAgICAgIGRvdWJsZSBkTVNFID0gMDsKLSAgICAgIGZvciAodWludDhfdCBuID0gMDsgbiA8IE5zY2FsZXM7IG4rKykgewotICAgICAgICBkb3VibGUgZGlmZiA9IHQycm90W25dIC0gc25zX3ZxX2dhaW5zW2ldICogc25zX1hRW25dOwotICAgICAgICBkTVNFICs9IGRpZmYgKiBkaWZmOwotICAgICAgfQotICAgICAgaWYgKGRNU0UgPCBkTVNFX21pbikgewotICAgICAgICBzaGFwZV9qID0gajsKLSAgICAgICAgR2luZCA9IGk7Ci0gICAgICAgIGRNU0VfbWluID0gZE1TRTsKLSAgICAgICAgR19nYWluX2lfc2hhcGVfaiA9IHNuc192cV9nYWluc1tHaW5kXTsKLSAgICAgICAgc25zX1hRX3NoYXBlX2ogPSBzbnNfWFE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHVpbnQ4X3QgTFNCX2dhaW4gPSBHaW5kICYgMTsKLQotICAvLyAzLjMuNy4zLjMuOCBFbnVtZXJhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgUFZRIHB1bHNlIGNvbmZpZ3VyYXRpb25zCi0gIC8vIChkMDlyMDJfRjJGKQotICBzd2l0Y2ggKHNoYXBlX2opIHsKLSAgICBjYXNlIDA6IHsKLSAgICAgIE1QVlFlbnVtKGlkeEEsIExTX2luZEEsIDEwLCAvKiBpIDogZGltZW5zaW9uIG9mIHZlY19pbiAqLwotICAgICAgICAgICAgICAgc25zX1kwICAgICAgICAgICAgIC8qIGkgOiBQVlEgaW50ZWdlciBwdWxzZSB0cmFpbiAqLwotICAgICAgKTsKLSAgICAgIE1QVlFlbnVtKGlkeEIsIExTX2luZEIsIDYsIC8qIGkgOiBkaW1lbnNpb24gb2YgdmVjX2luICovCi0gICAgICAgICAgICAgICAmc25zX1kwWzEwXSAgICAgICAvKiBpIDogUFZRIGludGVnZXIgcHVsc2UgdHJhaW4gKi8KLSAgICAgICk7Ci0gICAgICBjb25zdCB1aW50MzJfdCBTWl9zaGFwZUFfMCA9IDIzOTAwMDQ7Ci0gICAgICBpbmRleF9qb2ludF9qID0gKDIgKiBpZHhCICsgTFNfaW5kQiArIDIpICogU1pfc2hhcGVBXzAgKyBpZHhBOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgMTogewotICAgICAgTVBWUWVudW0oaWR4QSwgTFNfaW5kQSwgMTAsIC8qIGkgOiBkaW1lbnNpb24gb2YgdmVjX2luICovCi0gICAgICAgICAgICAgICBzbnNfWTEgICAgICAgICAgICAgLyogaSA6IFBWUSBpbnRlZ2VyIHB1bHNlIHRyYWluICovCi0gICAgICApOwotICAgICAgY29uc3QgdWludDMyX3QgU1pfc2hhcGVBXzEgPSAyMzkwMDA0OwotICAgICAgaW5kZXhfam9pbnRfaiA9IExTQl9nYWluICogU1pfc2hhcGVBXzEgKyBpZHhBOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgMjogewotICAgICAgTVBWUWVudW0oaWR4QSwgTFNfaW5kQSwgMTYsIC8qIGkgOiBkaW1lbnNpb24gb2YgdmVjX2luICovCi0gICAgICAgICAgICAgICBzbnNfWTIgICAgICAgICAgICAgLyogaSA6IFBWUSBpbnRlZ2VyIHB1bHNlIHRyYWluICovCi0gICAgICApOwotICAgICAgaW5kZXhfam9pbnRfaiA9IGlkeEE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSAzOiB7Ci0gICAgICBNUFZRZW51bShpZHhBLCBMU19pbmRBLCAxNiwgLyogaSA6IGRpbWVuc2lvbiBvZiB2ZWNfaW4gKi8KLSAgICAgICAgICAgICAgIHNuc19ZMyAgICAgICAgICAgICAvKiBpIDogUFZRIGludGVnZXIgcHVsc2UgdHJhaW4gKi8KLSAgICAgICk7Ci0gICAgICBjb25zdCB1aW50MzJfdCBTWl9zaGFwZUFfMiA9IDE1MTU4MjcyOwotICAgICAgaW5kZXhfam9pbnRfaiA9IFNaX3NoYXBlQV8yICsgTFNCX2dhaW4gKyAoMiAqIGlkeEEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gMy4zLjcuMy40IE11bHRpcGxleGluZyBvZiBTTlMgVlEgY29kZXdvcmRzIChkMDlyMDJfRjJGKQotICAvLyAqKiogZmluYWwgbXVsdGlwbGV4aW5nIHNraXBwZWQgZm9yIG5vdyAqKioqCi0gIC8vICBjb21wdXRhdGlvbiBvZiBpbmRleF9qb2ludF9qIGFscmVhZHkgZG9uZSBhYm92ZQotCi0gIC8vIDUuMy43LjMuNSBTeW50aGVzaXMgb2YgdGhlIFF1YW50aXplZCBTTlMgc2NhbGUgZmFjdG9yIHZlY3RvciAoZDA5cjAxKQotICAvLyBbMy4zLjcuMy40IGdvdCBsb3N0XSBTeW50aGVzaXMgb2YgdGhlIFF1YW50aXplZCBTTlMgc2NhbGUgZmFjdG9yIHZlY3RvcgotICAvLyAoZDA5cjAyX0YyRikKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgTnNjYWxlczsgbisrKSB7Ci0gICAgZG91YmxlIGZhY3RvciA9IDA7Ci0gICAgZm9yICh1aW50OF90IGNvbCA9IDA7IGNvbCA8IDE2OyBjb2wrKykgewotICAgICAgZmFjdG9yICs9IHNuc19YUV9zaGFwZV9qW2NvbF0gKiBEW25dW2NvbF07Ci0gICAgfQotICAgIHNjZlFbbl0gPSBzdDFbbl0gKyBHX2dhaW5faV9zaGFwZV9qICogZmFjdG9yOwotICB9Ci19Ci0KLXZvaWQgU25zUXVhbnRpemF0aW9uOjpub3JtYWxpemVDYW5kaWRhdGUoaW50OF90KiB5LCBkb3VibGUqIFhRLCB1aW50OF90IE4pIHsKLSAgZG91YmxlIG5vcm1WYWx1ZSA9IDA7Ci0gIGZvciAodWludDhfdCBuID0gMDsgbiA8IE47IG4rKykgewotICAgIGlmICh5W25dICE9IDApICAvLyB0cnkgdG8gc2F2ZSBzb21lIGNvbXB1dGF0aW9ucwotICAgIHsKLSAgICAgIG5vcm1WYWx1ZSArPSB5W25dICogeVtuXTsKLSAgICB9Ci0gIH0KLSAgbm9ybVZhbHVlID0gc3FydChub3JtVmFsdWUpOwotICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBOOyBuKyspIHsKLSAgICBYUVtuXSA9IHlbbl07Ci0gICAgaWYgKHlbbl0gIT0gMCkgIC8vIHRyeSB0byBzYXZlIHNvbWUgY29tcHV0YXRpb25zCi0gICAgewotICAgICAgWFFbbl0gLz0gbm9ybVZhbHVlOwotICAgIH0KLSAgfQotICAvLyBlbnN1cmUgdHJhaWxpbmcgemVybyB2YWx1ZXMgZm9yIE48TnNjYWxlcyAoZS5nLiBmb3IgWFExKQotICBmb3IgKHVpbnQ4X3QgbiA9IE47IG4gPCBOc2NhbGVzOyBuKyspIHsKLSAgICBYUVtuXSA9IDA7Ci0gIH0KLX0KLQotdm9pZCBTbnNRdWFudGl6YXRpb246Ok1QVlFlbnVtKGludDMyX3QmIGluZGV4LCBpbnQzMl90JiBsZWFkX3NpZ25faW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGltX2luLCAvKiBpIDogZGltZW5zaW9uIG9mIHZlY19pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCB2ZWNfaW5bXSAvKiBpIDogUFZRIGludGVnZXIgcHVsc2UgdHJhaW4gKi8KLSkgewotICAvKiBpbml0ICovCi0gIGludDMyX3QgbmV4dF9zaWduX2luZCA9IDB4ODAwMDAwMDBVOyAvKiBzZW50aW5lbCBmb3IgZmlyc3Qgc2lnbiAqLwotICBpbnQzMl90IGtfdmFsX2FjYyA9IDA7Ci0gIGludDhfdCBwb3MgPSBkaW1faW47Ci0gIGluZGV4ID0gMDsKLSAgdWludDhfdCBuID0gMDsKLSAgdW5zaWduZWQgaW50KiByb3dfcHRyID0gJihNUFZRX29mZnNldHNbbl1bMF0pOwotICAvKiBNUFZRLWluZGV4IGNvbXBvc2l0aW9uIGxvb3AgKi8KLSAgdW5zaWduZWQgaW50IHRtcF9oX3JvdyA9IHJvd19wdHJbMF07Ci0gIGZvciAocG9zLS07IHBvcyA+PSAwOyBwb3MtLSkgewotICAgIGludDhfdCB0bXBfdmFsID0gdmVjX2luW3Bvc107Ci0KLSAgICAvL1tpbmRleCwgbmV4dF9zaWduX2luZF0gPSBlbmNQdXNoU2lnbih0bXBfdmFsLCBuZXh0X3NpZ25faW5kLCBpbmRleCk7Ci0gICAgaW5kZXggPSBlbmNQdXNoU2lnbih0bXBfdmFsLCBuZXh0X3NpZ25faW5kLCBpbmRleCk7Ci0gICAgaW5kZXggKz0gdG1wX2hfcm93OwotICAgIGtfdmFsX2FjYyArPSAodG1wX3ZhbCA8IDApID8gLXRtcF92YWwgOiB0bXBfdmFsOwotICAgIGlmIChwb3MgIT0gMCkgewotICAgICAgbiArPSAxOyAvKiBzd2l0Y2ggcm93IGluIG9mZnNldCB0YWJsZSBNUFZRX29mZnNldHMobiwgaykgKi8KLSAgICB9Ci0gICAgcm93X3B0ciA9ICYoTVBWUV9vZmZzZXRzW25dWzBdKTsKLSAgICB0bXBfaF9yb3cgPSByb3dfcHRyW2tfdmFsX2FjY107Ci0gIH0KLSAgbGVhZF9zaWduX2luZCA9IG5leHRfc2lnbl9pbmQ7Ci0gIC8vIHJldHVybiBbIGluZGV4LCBsZWFkX3NpZ25faW5kIF0gOwotfQotCi0vL1sgaW5kZXgsIG5leHRfc2lnbl9pbmQgXSA9Ci0vLyBlbmNQdXNoU2lnbiggdmFsLCBuZXh0X3NpZ25faW5kX2luLCBpbmRleF9pbikKLXVpbnQzMl90IFNuc1F1YW50aXphdGlvbjo6ZW5jUHVzaFNpZ24oaW50OF90IHZhbCwgaW50MzJfdCYgbmV4dF9zaWduX2luZF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleF9pbikgewotICBpbnQzMl90IGluZGV4ID0gaW5kZXhfaW47Ci0gIGlmICgoKG5leHRfc2lnbl9pbmRfaW4gJiAweDgwMDAwMDAwVSkgPT0gMCkgJiYgKHZhbCAhPSAwKSkgewotICAgIGluZGV4ID0gMiAqIGluZGV4X2luICsgbmV4dF9zaWduX2luZF9pbjsKLSAgfQotICAvLyBuZXh0X3NpZ25faW5kID0gbmV4dF9zaWduX2luZF9pbjsKLSAgaWYgKHZhbCA8IDApIHsKLSAgICBuZXh0X3NpZ25faW5kX2luID0gMTsKLSAgfQotICBpZiAodmFsID4gMCkgewotICAgIG5leHRfc2lnbl9pbmRfaW4gPSAwOwotICB9Ci0gIC8qIGlmIHZhbD09MCwgdGhlcmUgaXMgbm8gbmV3IHNpZ24gaW5mb3JtYXRpb24gdG8g4oCccHVzaOKAnSwKLSAgaS5lLiBuZXh0X3NpZ25faW5kIGlzIG5vdCBjaGFuZ2VkICovCi0gIC8vIHJldHVybiBbIGluZGV4LCBuZXh0X3NpZ25faW5kIF07Ci0gIHJldHVybiBpbmRleDsKLX0KLQotdm9pZCBTbnNRdWFudGl6YXRpb246OnJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfKSB7Ci0gIGRhdGFwb2ludHMgPSBkYXRhcG9pbnRzXzsKLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaW5kX0xGIiwgJmluZF9MRiwgc2l6ZW9mKGluZF9MRikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaW5kX0hGIiwgJmluZF9IRiwgc2l6ZW9mKGluZF9IRikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgic2hhcGVfaiIsICZzaGFwZV9qLCBzaXplb2Yoc2hhcGVfaikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiR2luZCIsICZHaW5kLCBzaXplb2YoR2luZCkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiTFNfaW5kQSIsICZMU19pbmRBLCBzaXplb2YoTFNfaW5kQSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiTFNfaW5kQiIsICZMU19pbmRCLCBzaXplb2YoTFNfaW5kQikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaWR4QSIsICZpZHhBLCBzaXplb2YoaWR4QSkpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiaWR4QiIsICZpZHhCLCBzaXplb2YoaWR4QikpOwotCi0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJ0MnJvdCIsICZ0MnJvdFswXSwgc2l6ZW9mKGRvdWJsZSkgKiBOc2NhbGVzKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInNjZlEiLCAmc2NmUVswXSwgc2l6ZW9mKGRvdWJsZSkgKiBOc2NhbGVzKTsKLQotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgic25zX1kwIiwgJnNuc19ZMFswXSwgc2l6ZW9mKGludDhfdCkgKiAxNik7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJzbnNfWTEiLCAmc25zX1kxWzBdLCBzaXplb2YoaW50OF90KSAqIDEwKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInNuc19ZMiIsICZzbnNfWTJbMF0sIHNpemVvZihpbnQ4X3QpICogMTYpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgic25zX1kzIiwgJnNuc19ZM1swXSwgc2l6ZW9mKGludDhfdCkgKiAxNik7Ci0KLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInNuc19YUTAiLCAmc25zX1hRMFswXSwgc2l6ZW9mKGRvdWJsZSkgKiAxNik7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJzbnNfWFExIiwgJnNuc19YUTFbMF0sIHNpemVvZihkb3VibGUpICogMTApOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgic25zX1hRMiIsICZzbnNfWFEyWzBdLCBzaXplb2YoZG91YmxlKSAqIDE2KTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInNuc19YUTMiLCAmc25zX1hRM1swXSwgc2l6ZW9mKGRvdWJsZSkgKiAxNik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL1Nuc1F1YW50aXphdGlvbi5ocHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvU25zUXVhbnRpemF0aW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzMTViNS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL0VuY29kZXIvU25zUXVhbnRpemF0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBTbnNRdWFudGl6YXRpb24uaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU05TX1FVQU5USVpBVElPTl9IXwotI2RlZmluZSBTTlNfUVVBTlRJWkFUSU9OX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1jbGFzcyBTbnNRdWFudGl6YXRpb24gewotIHB1YmxpYzogIC8vIG1ldGhvZHMKLSAgU25zUXVhbnRpemF0aW9uKCk7Ci0gIHZpcnR1YWwgflNuc1F1YW50aXphdGlvbigpOwotCi0gIHZvaWQgcmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50cyk7Ci0KLSAgdm9pZCBydW4oY29uc3QgZG91YmxlKiBjb25zdCBzY2YpOwotCi0gcHJpdmF0ZTogIC8vIG1ldGhvZHMKLSAgdm9pZCBub3JtYWxpemVDYW5kaWRhdGUoaW50OF90KiB5LCBkb3VibGUqIFhRLCB1aW50OF90IE4pOwotICB2b2lkIE1QVlFlbnVtKGludDMyX3QmIGluZGV4LCBpbnQzMl90JiBsZWFkX3NpZ25faW5kLAotICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGltX2luLCAvKiBpIDogZGltZW5zaW9uIG9mIHZlY19pbiAqLwotICAgICAgICAgICAgICAgIGludDhfdCB2ZWNfaW5bXSAvKiBpIDogUFZRIGludGVnZXIgcHVsc2UgdHJhaW4gKi8KLSAgKTsKLSAgdWludDMyX3QgZW5jUHVzaFNpZ24oaW50OF90IHZhbCwgaW50MzJfdCYgbmV4dF9zaWduX2luZF9pbiwgaW50MzJfdCBpbmRleF9pbik7Ci0KLSBwdWJsaWM6ICAvLyBtZW1iZXJzCi0gIHN0YXRpYyBjb25zdCB1aW50OF90IE5zY2FsZXMgPSAxNjsKLQotICBkb3VibGUgc2NmUVtOc2NhbGVzXTsKLSAgdWludDhfdCBpbmRfTEY7Ci0gIHVpbnQ4X3QgaW5kX0hGOwotICB1aW50OF90IHNoYXBlX2o7Ci0gIHVpbnQ4X3QgR2luZDsKLSAgaW50MzJfdCBMU19pbmRBOwotICBpbnQzMl90IExTX2luZEI7Ci0gIHVpbnQzMl90IGluZGV4X2pvaW50X2o7Ci0KLSBwcml2YXRlOiAgLy8gbWVtYmVycwotICBpbnQzMl90IGlkeEE7Ci0gIGludDMyX3QgaWR4QjsKLSAgZG91YmxlIHQycm90W05zY2FsZXNdOwotICBpbnQ4X3Qgc25zX1kwWzE2XTsKLSAgaW50OF90IHNuc19ZMVsxMF07Ci0gIGludDhfdCBzbnNfWTJbMTZdOwotICBpbnQ4X3Qgc25zX1kzWzE2XTsKLSAgZG91YmxlIHNuc19YUTBbTnNjYWxlc107Ci0gIGRvdWJsZQotICAgICAgc25zX1hRMVtOc2NhbGVzXTsgIC8vIGRvIG5vdCBtaW5pbWl6ZSB0byAxMCAtPiBsYXN0IDYgdmFsdWVzIGFyZSBhbGwgemVyb3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIHRoZSBpbnZlcnNlIEQtdHJhbnNmb3JtCi0gIGRvdWJsZSBzbnNfWFEyW05zY2FsZXNdOwotICBkb3VibGUgc25zX1hRM1tOc2NhbGVzXTsKLSAgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwotCi0jZW5kaWYgIC8vIFNOU19RVUFOVElaQVRJT05fSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9TcGVjdHJhbE5vaXNlU2hhcGluZy5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvU3BlY3RyYWxOb2lzZVNoYXBpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ1OTBiLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9TcGVjdHJhbE5vaXNlU2hhcGluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIFNwZWN0cmFsTm9pc2VTaGFwaW5nLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiU3BlY3RyYWxOb2lzZVNoYXBpbmcuaHBwIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJCYW5kSW5kZXhUYWJsZXMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ190aWx0X3RhYmxlWzVdID0gewotICAgIDE0LCAgLy8gZnM9IDgwMDAKLSAgICAxOCwgIC8vIGZzPTE2MDAwCi0gICAgMjIsICAvLyBmcz0yNDAwMAotICAgIDI2LCAgLy8gZnM9MzIwMDAKLSAgICAzMCAgIC8vIGZzPTQ0MTAwLCA0ODAwMAotfTsKLQotc3RhdGljIGNvbnN0IGRvdWJsZSB3WzZdID0gezEuMCAvIDEyLCAyLjAgLyAxMiwgMy4wIC8gMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wIC8gMTIsIDIuMCAvIDEyLCAxLjAgLyAxMn07Ci0KLVNwZWN0cmFsTm9pc2VTaGFwaW5nOjpTcGVjdHJhbE5vaXNlU2hhcGluZyhjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBJX2ZzXykKLSAgICA6IGxjM0NvbmZpZyhsYzNDb25maWdfKSwKLSAgICAgIGdfdGlsdChnX3RpbHRfdGFibGVbbGMzQ29uZmlnLkZzX2luZF0pLAotICAgICAgWF9TKG51bGxwdHIpLAotICAgICAgSV9mcyhJX2ZzXyksCi0gICAgICBzbnNRdWFudGl6YXRpb24oKSwKLSAgICAgIGRhdGFwb2ludHMobnVsbHB0cikgewotICBYX1MgPSBuZXcgZG91YmxlW2xjM0NvbmZpZy5ORV07Ci19Ci0KLVNwZWN0cmFsTm9pc2VTaGFwaW5nOjp+U3BlY3RyYWxOb2lzZVNoYXBpbmcoKSB7Ci0gIGlmIChudWxscHRyICE9IFhfUykgewotICAgIGRlbGV0ZVtdIFhfUzsKLSAgfQotfQotCi11aW50OF90IFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpnZXRfaW5kX0xGKCkgeyByZXR1cm4gc25zUXVhbnRpemF0aW9uLmluZF9MRjsgfQotCi11aW50OF90IFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpnZXRfaW5kX0hGKCkgeyByZXR1cm4gc25zUXVhbnRpemF0aW9uLmluZF9IRjsgfQotCi11aW50OF90IFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpnZXRfc2hhcGVfaigpIHsgcmV0dXJuIHNuc1F1YW50aXphdGlvbi5zaGFwZV9qOyB9Ci0KLXVpbnQ4X3QgU3BlY3RyYWxOb2lzZVNoYXBpbmc6OmdldF9HaW5kKCkgeyByZXR1cm4gc25zUXVhbnRpemF0aW9uLkdpbmQ7IH0KLQotaW50MzJfdCBTcGVjdHJhbE5vaXNlU2hhcGluZzo6Z2V0X0xTX2luZEEoKSB7IHJldHVybiBzbnNRdWFudGl6YXRpb24uTFNfaW5kQTsgfQotCi1pbnQzMl90IFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpnZXRfTFNfaW5kQigpIHsgcmV0dXJuIHNuc1F1YW50aXphdGlvbi5MU19pbmRCOyB9Ci0KLXVpbnQzMl90IFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpnZXRfaW5kZXhfam9pbnRfaigpIHsKLSAgcmV0dXJuIHNuc1F1YW50aXphdGlvbi5pbmRleF9qb2ludF9qOwotfQotCi12b2lkIFNwZWN0cmFsTm9pc2VTaGFwaW5nOjpydW4oY29uc3QgZG91YmxlKiBjb25zdCBYLCBjb25zdCBkb3VibGUqIEVfQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZfYXR0KSB7Ci0gIC8vIDMuMy43LjIgU05TIGFuYWx5c2lzICAoZDA5cjA2X0ZoRykKLSAgLy8gMy4zLjcuMi4xIFBhZGRpbmcgIChkMDlyMDZfRmhHKQotICBjb25zdCB1aW50OF90IG4yID0gTl9iIC0gbGMzQ29uZmlnLk5fYjsKLSAgZG91YmxlIEVfQl9wYXRjaGVkW05fYl07ICAvLyBUT0RPOiBjYW4gd2Ugb3B0aW1pemUgb3V0IHRoaXMgYnVmZmVyIHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQgZm9yIGEgcmFyZSBjYXNlIG9ubHk/Ci0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbjI7IGkrKykgewotICAgIC8vIE5vdGU6IGF0IHRoZSBpbnZlcnNlIG9wZXJhdGlvbiAoc2VlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uKSB0aGVyZSBpcyBhCi0gICAgLy8gZmFjdG9yIDAuNS4KLSAgICAvLyAgICAgICBJcyB0aGlzIGRlZmluaXRpb24gY29uc2lzdGVudD8KLSAgICBFX0JfcGF0Y2hlZFtpICogMiArIDBdID0gRV9CW2ldOwotICAgIEVfQl9wYXRjaGVkW2kgKiAyICsgMV0gPSBFX0JbaV07Ci0gIH0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbGMzQ29uZmlnLk5fYiAtIG4yOyBpKyspIHsKLSAgICBFX0JfcGF0Y2hlZFsyICogbjIgKyBpXSA9IEVfQltuMiArIGldOwotICB9Ci0KLSAgLy8gMy4zLjcuMi4xIFNtb290aGluZyAgKGQwOXIwMl9GMkYpCi0gIGRvdWJsZSBFX2xvY2FsW05fYl07ICAvLyBOb3RlOiBtZW1vcnkgd2lsbCBiZSByZS11c2VkIHN0ZXAtYnktc3RlcAotICBkb3VibGUqIEVfUyA9IEVfbG9jYWw7Ci0gIEVfU1swXSA9IDAuNzUgKiBFX0JfcGF0Y2hlZFswXSArIDAuMjUgKiBFX0JfcGF0Y2hlZFsxXTsKLSAgZm9yICh1aW50OF90IGIgPSAxOyBiIDwgTl9iIC0gMTsgYisrKSB7Ci0gICAgRV9TW2JdID0gMC4yNSAqIEVfQl9wYXRjaGVkW2IgLSAxXSArIDAuNSAqIEVfQl9wYXRjaGVkW2JdICsKLSAgICAgICAgICAgICAwLjI1ICogRV9CX3BhdGNoZWRbYiArIDFdOwotICB9Ci0gIEVfU1tOX2IgLSAxXSA9IDAuMjUgKiBFX0JfcGF0Y2hlZFtOX2IgLSAyXSArIDAuNzUgKiBFX0JfcGF0Y2hlZFtOX2IgLSAxXTsKLQotICAvLyAzLjMuNy4yLjIgUHJlLWVtcGhhc2lzIChkMDlyMDJfRjJGKQotICBkb3VibGUqIEVfUCA9IEVfbG9jYWw7Ci0gIGNvbnN0IGRvdWJsZSBmaXhfZXhwb25lbnRfcGFydCA9IGdfdGlsdCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oMTAgKiA2Myk7Ci0gIGZvciAodWludDhfdCBiID0gMDsgYiA8IE5fYjsgYisrKSB7Ci0gICAgRV9QW2JdID0gRV9TW2JdICogcG93KDEwLjAsIGIgKiBmaXhfZXhwb25lbnRfcGFydCk7Ci0gIH0KLQotICAvLyAzLjMuNy4yLjMgTm9pc2UgZmxvb3IgKGQwOXIwMl9GMkYpCi0gIGRvdWJsZSBFX3RvdGFsID0gMDsKLSAgZm9yICh1aW50OF90IGIgPSAwOyBiIDwgTl9iOyBiKyspIHsKLSAgICBFX3RvdGFsICs9IEVfUFtiXTsKLSAgfQotICBFX3RvdGFsIC89IDY0OwotICBFX3RvdGFsICo9IHBvdygxMC4wLCAtNDAgLyAxMCk7Ci0gIGRvdWJsZSBub2lzZUZsb29yID0gcG93KDIuMCwgLTMyKTsKLSAgaWYgKEVfdG90YWwgPiBub2lzZUZsb29yKSB7Ci0gICAgbm9pc2VGbG9vciA9IEVfdG90YWw7Ci0gIH0KLSAgZG91YmxlKiBFX1AyID0gRV9sb2NhbDsKLSAgZm9yICh1aW50OF90IGIgPSAwOyBiIDwgTl9iOyBiKyspIHsKLSAgICBFX1AyW2JdID0gKEVfUFtiXSA+IG5vaXNlRmxvb3IpID8gRV9QW2JdIDogbm9pc2VGbG9vcjsKLSAgfQotCi0gIC8vIDMuMy43LjIuNCBMb2dhcml0aG0gKGQwOXIwMl9GMkYpCi0gIGRvdWJsZSogRV9MID0gRV9sb2NhbDsKLSAgZm9yICh1aW50OF90IGIgPSAwOyBiIDwgTl9iOyBiKyspIHsKLSAgICBFX0xbYl0gPSBsb2cyKDFlLTMxICsgRV9QMltiXSkgLyAyOwotICB9Ci0KLSAgLy8gMy4zLjcuMi41IEJhbmQgZW5lcmd5IGdyb3VwaW5nIChkMDlyMDJfRjJGKQotICBkb3VibGUgRV9MNFtOc2NhbGVzXTsKLSAgdWludDhfdCBiMiA9IDA7Ci0gIEVfTDRbYjJdID0gd1swXSAqIEVfTFswXTsKLSAgZm9yICh1aW50OF90IGsgPSAxOyBrIDw9IDU7IGsrKykgewotICAgIEVfTDRbYjJdICs9IHdba10gKiBFX0xbNCAqIGIyICsgayAtIDFdOwotICB9Ci0gIGZvciAoYjIgPSAxOyBiMiA8IDE1OyBiMisrKSB7Ci0gICAgRV9MNFtiMl0gPSAwOwotICAgIGZvciAodWludDhfdCBrID0gMDsgayA8PSA1OyBrKyspIHsKLSAgICAgIEVfTDRbYjJdICs9IHdba10gKiBFX0xbNCAqIGIyICsgayAtIDFdOwotICAgIH0KLSAgfQotICBiMiA9IDE1OwotICBFX0w0W2IyXSA9IHdbNV0gKiBFX0xbNjNdOwotICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPD0gNDsgaysrKSB7Ci0gICAgRV9MNFtiMl0gKz0gd1trXSAqIEVfTFs0ICogYjIgKyBrIC0gMV07Ci0gIH0KLQotICAvLyAzLjMuNy4yLjcgTWVhbiByZW1vdmFsIGFuZCBzY2FsaW5nLCBhdHRhY2sgaGFuZGxpbmcgKGQwOXIwNl9GaEcpCi0gIGRvdWJsZSBFNF90b3RhbCA9IDA7Ci0gIGZvciAodWludDhfdCBiMiA9IDA7IGIyIDwgTnNjYWxlczsgYjIrKykgewotICAgIEU0X3RvdGFsICs9IEVfTDRbYjJdOwotICB9Ci0gIEU0X3RvdGFsIC89IE5zY2FsZXM7Ci0gIGRvdWJsZSBzY2ZfYnVmZmVyW05zY2FsZXNdOwotICBkb3VibGUqIHNjZl8wID0gc2NmOwotICBpZiAoRl9hdHQpIHsKLSAgICBzY2ZfMCA9IHNjZl9idWZmZXI7Ci0gIH0KLSAgZm9yICh1aW50OF90IGIyID0gMDsgYjIgPCBOc2NhbGVzOyBiMisrKSB7Ci0gICAgc2NmXzBbYjJdID0gMC44NSAqIChFX0w0W2IyXSAtIEU0X3RvdGFsKTsKLSAgfQotICBpZiAoRl9hdHQpIHsKLSAgICAvLyBOb3RlOgotICAgIC8vICBUaGlzIHNlY3Rpb24gaXMgbm90IGNvdmVyZWQgYnkgaW50ZXJtZWRpYXRlIGVuY29kZXIgb3V0cHV0Ci0gICAgLy8gIGluIHNlY3Rpb24gQy4zLiAiRW5jb2RlciBpbnRlcm1lZGlhdGUgb3V0cHV0IiAgKGQwOXIwMl9GMkYpCi0gICAgZG91YmxlKiBzY2ZfMSA9IHNjZjsKLSAgICBzY2ZfMVswXSA9IChzY2ZfMFswXSArIHNjZl8wWzFdICsgc2NmXzBbMl0pIC8gMzsKLSAgICBzY2ZfMVsxXSA9IChzY2ZfMFswXSArIHNjZl8wWzFdICsgc2NmXzBbMl0gKyBzY2ZfMFszXSkgLyA0OwotICAgIGZvciAodWludDhfdCBuID0gMjsgbiA8PSAxMzsgbisrKSB7Ci0gICAgICBzY2ZfMVtuXSA9IDA7Ci0gICAgICBmb3IgKGludDhfdCBtID0gLTI7IG0gPD0gMjsgbSsrKSB7Ci0gICAgICAgIHNjZl8xW25dICs9IHNjZl8wW24gKyBtXTsKLSAgICAgIH0KLSAgICAgIHNjZl8xW25dIC89IDU7Ci0gICAgfQotICAgIHNjZl8xWzE0XSA9IChzY2ZfMFsxMl0gKyBzY2ZfMFsxM10gKyBzY2ZfMFsxNF0gKyBzY2ZfMFsxNV0pIC8gNDsKLSAgICBzY2ZfMVsxNV0gPSAoc2NmXzBbMTNdICsgc2NmXzBbMTRdICsgc2NmXzBbMTVdKSAvIDM7Ci0KLSAgICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgICBkYXRhcG9pbnRzLT5sb2coInNjZl8wIiwgc2NmXzAsIHNpemVvZihkb3VibGUpICogTnNjYWxlcyk7Ci0gICAgICBkYXRhcG9pbnRzLT5sb2coInNjZl8xIiwgc2NmXzEsIHNpemVvZihkb3VibGUpICogTnNjYWxlcyk7Ci0gICAgfQotCi0gICAgZG91YmxlIHNjZl8xX3RvdGFsID0gMDsKLSAgICBmb3IgKHVpbnQ4X3QgYiA9IDA7IGIgPCBOc2NhbGVzOyBiKyspIHsKLSAgICAgIHNjZl8xX3RvdGFsICs9IHNjZl8xW2JdOwotICAgIH0KLSAgICBzY2ZfMV90b3RhbCAvPSBOc2NhbGVzOwotICAgIGNvbnN0IGRvdWJsZSBmX2F0dCA9Ci0gICAgICAgIChsYzNDb25maWcuTl9tcyA9PSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb246OmQxMG1zKSA/IDAuNSA6IDAuMzsKLSAgICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCBOc2NhbGVzOyBuKyspIHsKLSAgICAgIHNjZltuXSA9IGZfYXR0ICogKHNjZl8xW25dIC0gc2NmXzFfdG90YWwpOwotICAgIH0KLSAgfQotCi0gIC8vIDMuMy43LjMgU05TIHF1YW50aXphdGlvbiAoZDA5cjAyX0YyRikKLSAgc25zUXVhbnRpemF0aW9uLnJ1bihzY2YpOwotCi0gIC8vIDMuMy43LjQgU05TIHNjYWxlIGZhY3RvcnMgaW50ZXJwb2xhdGlvbiAoZDA5cjAyX0YyRikKLSAgY29uc3QgZG91YmxlKiBzY2ZRID0gc25zUXVhbnRpemF0aW9uLnNjZlE7Ci0gIGRvdWJsZSBzY2ZRaW50W05fYl07Ci0gIHNjZlFpbnRbMF0gPSBzY2ZRWzBdOwotICBzY2ZRaW50WzFdID0gc2NmUVswXTsKLSAgZm9yICh1aW50OF90IG4gPSAwOyBuIDw9IDE0OyBuKyspIHsKLSAgICBzY2ZRaW50WzQgKiBuICsgMl0gPSBzY2ZRW25dICsgKDEuMCAvIDguMCAqIChzY2ZRW24gKyAxXSAtIHNjZlFbbl0pKTsKLSAgICBzY2ZRaW50WzQgKiBuICsgM10gPSBzY2ZRW25dICsgKDMuMCAvIDguMCAqIChzY2ZRW24gKyAxXSAtIHNjZlFbbl0pKTsKLSAgICBzY2ZRaW50WzQgKiBuICsgNF0gPSBzY2ZRW25dICsgKDUuMCAvIDguMCAqIChzY2ZRW24gKyAxXSAtIHNjZlFbbl0pKTsKLSAgICBzY2ZRaW50WzQgKiBuICsgNV0gPSBzY2ZRW25dICsgKDcuMCAvIDguMCAqIChzY2ZRW24gKyAxXSAtIHNjZlFbbl0pKTsKLSAgfQotICBzY2ZRaW50WzYyXSA9IHNjZlFbMTVdICsgMSAvIDguMCAqIChzY2ZRWzE1XSAtIHNjZlFbMTRdKTsKLSAgc2NmUWludFs2M10gPSBzY2ZRWzE1XSArIDMgLyA4LjAgKiAoc2NmUVsxNV0gLSBzY2ZRWzE0XSk7Ci0KLSAgLy8gYWRkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIE5fYl9pbj02MCAoaGFwcGVucyBmb3IgNy41bXMgYW5kIGZzPThrSHopCi0gIC8vIChzZWUgZW5kIG9mIHNlY3Rpb24gMy4zLjcuNCBTTlMgc2NhbGUgZmFjdG9ycyBpbnRlcnBvbGF0aW9uIChkMDlyMDZfRmhHKQotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBuMjsgaSsrKSB7Ci0gICAgc2NmUWludFtpXSA9IChzY2ZRaW50WzIgKiBpXSArIHNjZlFpbnRbMiAqIGkgKyAxXSkgLyAyOwotICB9Ci0gIGlmIChuMiAhPSAwKSB7Ci0gICAgLy8gY29kZSBpcyBjb25zaXN0ZW50IHdpdGggRXJyYXRhIDE1MDEyIChzZWUgZDEuMHIwMykKLSAgICBmb3IgKHVpbnQ4X3QgaSA9IG4yOyBpIDwgbGMzQ29uZmlnLk5fYjsgaSsrKSB7Ci0gICAgICBzY2ZRaW50W2ldID0gc2NmUWludFtpICsgbjJdOwotICAgIH0KLSAgfQotCi0gIC8vIFRoZSBzY2FsZSBmYWN0b3JzIGFyZSB0cmFuc2Zvcm1lZCBiYWNrIGludG8gdGhlIGxpbmVhciBkb21haW4KLSAgZm9yICh1aW50OF90IGIgPSAwOyBiIDwgbGMzQ29uZmlnLk5fYjsgYisrKSB7Ci0gICAgZ19TTlNbYl0gPSBleHAyKC1zY2ZRaW50W2JdKTsKLSAgfQotCi0gIC8vIDMuMy43LjUgU3BlY3RyYWwgc2hhcGluZyAoZDA5cjAyX0YyRikKLSAgZm9yICh1aW50OF90IGIgPSAwOyBiIDwgbGMzQ29uZmlnLk5fYjsgYisrKSB7Ci0gICAgZm9yICh1aW50MTZfdCBrID0gSV9mc1tiXTsgayA8IElfZnNbYiArIDFdOyBrKyspIHsKLSAgICAgIFhfU1trXSA9IFhba10gKiBnX1NOU1tiXTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTcGVjdHJhbE5vaXNlU2hhcGluZzo6cmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pIHsKLSAgZGF0YXBvaW50cyA9IGRhdGFwb2ludHNfOwotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJzY2YiLCAmc2NmWzBdLCBzaXplb2YoZG91YmxlKSAqIE5zY2FsZXMpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiZ19zbnMiLCAmZ19TTlNbMF0sIHNpemVvZihkb3VibGUpICogTl9iKTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoIlhfUyIsICZYX1NbMF0sIHNpemVvZihkb3VibGUpICogbGMzQ29uZmlnLk5FKTsKLQotICAgIHNuc1F1YW50aXphdGlvbi5yZWdpc3RlckRhdGFwb2ludHMoZGF0YXBvaW50cyk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIExjM0VuYwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL1NwZWN0cmFsTm9pc2VTaGFwaW5nLmhwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9TcGVjdHJhbE5vaXNlU2hhcGluZy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWZlOTcuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL1NwZWN0cmFsTm9pc2VTaGFwaW5nLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBTcGVjdHJhbE5vaXNlU2hhcGluZy5ocHAKLSAqCi0gKiBDb3B5cmlnaHQgMjAyMSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTUEVDVFJBTF9OT0lTRV9TSEFQSU5HX0hfCi0jZGVmaW5lIFNQRUNUUkFMX05PSVNFX1NIQVBJTkdfSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLSNpbmNsdWRlICJMYzNDb25maWcuaHBwIgotI2luY2x1ZGUgIlNuc1F1YW50aXphdGlvbi5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1jbGFzcyBTcGVjdHJhbE5vaXNlU2hhcGluZyB7Ci0gcHVibGljOgotICBTcGVjdHJhbE5vaXNlU2hhcGluZyhjb25zdCBMYzNDb25maWcmIGxjM0NvbmZpZ18sIGNvbnN0IGludCogY29uc3QgSV9mc18pOwotICB2aXJ0dWFsIH5TcGVjdHJhbE5vaXNlU2hhcGluZygpOwotCi0gIHZvaWQgcmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pOwotCi0gIHZvaWQgcnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWCwgY29uc3QgZG91YmxlKiBFX0IsIGJvb2wgRl9hdHQpOwotCi0gIHVpbnQ4X3QgZ2V0X2luZF9MRigpOwotICB1aW50OF90IGdldF9pbmRfSEYoKTsKLSAgdWludDhfdCBnZXRfc2hhcGVfaigpOwotICB1aW50OF90IGdldF9HaW5kKCk7Ci0gIGludDMyX3QgZ2V0X0xTX2luZEEoKTsKLSAgaW50MzJfdCBnZXRfTFNfaW5kQigpOwotICB1aW50MzJfdCBnZXRfaW5kZXhfam9pbnRfaigpOwotCi0gIHN0YXRpYyBjb25zdCB1aW50OF90IE5fYiA9IDY0OwotICBzdGF0aWMgY29uc3QgdWludDhfdCBOc2NhbGVzID0gMTY7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IG5iaXRzX1NOUyA9IDM4OwotCi0gIGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnOwotICBjb25zdCB1aW50OF90IGdfdGlsdDsKLSAgZG91YmxlKiBYX1M7Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnQqIGNvbnN0IElfZnM7Ci0gIFNuc1F1YW50aXphdGlvbiBzbnNRdWFudGl6YXRpb247Ci0gIGRvdWJsZSBzY2ZbTnNjYWxlc107Ci0gIGRvdWJsZSBnX1NOU1tOX2JdOwotICBEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHM7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgTGMzRW5jCi0KLSNlbmRpZiAgLy8gU1BFQ1RSQUxfTk9JU0VfU0hBUElOR19IXwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9FbmNvZGVyL1NwZWN0cmFsUXVhbnRpemF0aW9uLmNwcCBiL2VtYmRydi9sYzMvRW5jb2Rlci9TcGVjdHJhbFF1YW50aXphdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjU1MmQuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9FbmNvZGVyL1NwZWN0cmFsUXVhbnRpemF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKgotICogU3BlY3RyYWxRdWFudGl6YXRpb24uY3BwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJTcGVjdHJhbFF1YW50aXphdGlvbi5ocHAiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJTcGVjdHJhbERhdGFUYWJsZXMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotU3BlY3RyYWxRdWFudGl6YXRpb246OlNwZWN0cmFsUXVhbnRpemF0aW9uKHVpbnQxNl90IE5FXywgdWludDhfdCBmc19pbmRfKQotICAgIDogTkUoTkVfKSwKLSAgICAgIGZzX2luZChmc19pbmRfKSwKLSAgICAgIFhfcShudWxscHRyKSwKLSAgICAgIGxhc3RueigwKSwKLSAgICAgIG5iaXRzX3RydW5jKDApLAotICAgICAgcmF0ZUZsYWcoMCksCi0gICAgICBsc2JNb2RlKDApLAotICAgICAgZ2coMCksCi0gICAgICBsYXN0bnpfdHJ1bmMoMCksCi0gICAgICBnZ19pbmQoMCksCi0gICAgICBkYXRhcG9pbnRzKG51bGxwdHIpLAotICAgICAgZ2dfb2ZmKDApLAotICAgICAgZ2dfbWluKDApLAotICAgICAgbmJpdHNfb2Zmc2V0KDApLAotICAgICAgbmJpdHNfc3BlYygwKSwKLSAgICAgIG5iaXRzX3NwZWNfYWRqKDApLAotICAgICAgbmJpdHNfZXN0KDApLAotICAgICAgcmVzZXRfb2Zmc2V0X29sZChmYWxzZSksCi0gICAgICBuYml0c19vZmZzZXRfb2xkKDApLAotICAgICAgbmJpdHNfc3BlY19vbGQoMCksCi0gICAgICBuYml0c19lc3Rfb2xkKDApCi0KLXsKLSAgWF9xID0gbmV3IGludDE2X3RbTkVdOwotfQotCi1TcGVjdHJhbFF1YW50aXphdGlvbjo6flNwZWN0cmFsUXVhbnRpemF0aW9uKCkgeyBkZWxldGVbXSBYX3E7IH0KLQotdm9pZCBTcGVjdHJhbFF1YW50aXphdGlvbjo6dXBkYXRlR2xvYmFsR2FpbkVzdGltYXRpb25QYXJhbWV0ZXIoCi0gICAgdWludDE2X3QgbmJpdHMsIHVpbnQxNl90IG5iaXRzX3NwZWNfbG9jYWwpIHsKLSAgaWYgKHJlc2V0X29mZnNldF9vbGQpIHsKLSAgICBuYml0c19vZmZzZXQgPSAwOwotICB9IGVsc2UgewotICAgIG5iaXRzX29mZnNldCA9Ci0gICAgICAgIDAuOCAqIG5iaXRzX29mZnNldF9vbGQgKwotICAgICAgICAwLjIgKiBzdGQ6Om1pbig0MC5mLCBzdGQ6Om1heCgtNDAuZiwgbmJpdHNfb2Zmc2V0X29sZCArIG5iaXRzX3NwZWNfb2xkIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYml0c19lc3Rfb2xkKSk7Ci0gIH0KLQotICBuYml0c19zcGVjX2FkaiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihuYml0c19zcGVjX2xvY2FsICsgbmJpdHNfb2Zmc2V0ICsgMC41KTsKLQotICBnZ19vZmYgPSAtc3RkOjptaW4oMTE1LCBuYml0cyAvICgxMCAqIChmc19pbmQgKyAxKSkpIC0gMTA1IC0gNSAqIChmc19pbmQgKyAxKTsKLX0KLQotdm9pZCBTcGVjdHJhbFF1YW50aXphdGlvbjo6Y29tcHV0ZVNwZWN0cmFsRW5lcmd5KGRvdWJsZSogRSwgY29uc3QgZG91YmxlKiBYX2YpIHsKLSAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8IE5FIC8gNDsgaysrKSB7Ci0gICAgRVtrXSA9IHBvdygyLCAtMzEpOwotICAgIGZvciAodWludDhfdCBuID0gMDsgbiA8PSAzOyBuKyspIHsKLSAgICAgIEVba10gKz0gWF9mWzQgKiBrICsgbl0gKiBYX2ZbNCAqIGsgKyBuXTsKLSAgICB9Ci0gICAgRVtrXSA9IDEwICogbG9nMTAoRVtrXSk7Ci0gIH0KLX0KLQotdm9pZCBTcGVjdHJhbFF1YW50aXphdGlvbjo6Z2xvYmFsR2FpbkVzdGltYXRpb24oY29uc3QgZG91YmxlKiBFKSB7Ci0gIC8vIGNvbnZlcnRlZCBwc2V1ZG8tY29kZSBmcm9tIHBhZ2UgNDkvNTAgIChkMDlyMDJfRjJGKQotICBpbnQxNl90IGZhYyA9IDI1NjsKLSAgLy/wnZGU8J2RlPCdkZbwnZGb8J2RkSA9IDI1NTsKLSAgZ2dfaW5kID0gMjU1OwotICBmb3IgKHVpbnQ4X3QgaXRlciA9IDA7IGl0ZXIgPCA4OyBpdGVyKyspIHsKLSAgICBmYWMgPj49IDE7Ci0gICAgLy/wnZGU8J2RlPCdkZbwnZGb8J2RkSAtPSBmYWM7Ci0gICAgZ2dfaW5kIC09IGZhYzsKLSAgICBkb3VibGUgdG1wID0gMDsKLSAgICB1aW50OF90IGlzemVybyA9IDE7Ci0gICAgLy8gZm9yIChpID0g8J2RgfCdkLgvNC0xOyBpID49IDA7IGktLSkKLSAgICBmb3IgKGludDhfdCBpID0gTkUgLyA0IC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIC8vIGlmIChFW2ldKjI4LzIwIDwgKPCdkZTwnZGU8J2RlvCdkZvwnZGRK/CdkZTwnZGU8J2RnPCdkZPwnZGTKSkKLSAgICAgIGlmIChFW2ldICogMjggLyAyMC4wIDwgKGdnX2luZCArIGdnX29mZikpIHsKLSAgICAgICAgaWYgKGlzemVybyA9PSAwKSB7Ci0gICAgICAgICAgdG1wICs9IDIuNyAqIDI4IC8gMjAuMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gaWYgKCjwnZGU8J2RlPCdkZbwnZGb8J2RkSvwnZGU8J2RlPCdkZzwnZGT8J2RkykgPCBFW2ldKjI4LzIwIC0gNDMqMjgvMjApCi0gICAgICAgIGlmICgoZ2dfaW5kICsgZ2dfb2ZmKSA8IEVbaV0gKiAyOCAvIDIwLjAgLSA0MyAqIDI4IC8gMjAuMCkgewotICAgICAgICAgIC8vIHRtcCArPSAyKkVbaV0qMjgvMjAg4oCTIDIqKPCdkZTwnZGU8J2RlvCdkZvwnZGRK/CdkZTwnZGU8J2RnPCdkZPwnZGTKSAtIDM2KjI4LzIwOwotICAgICAgICAgIHRtcCArPSAyICogRVtpXSAqIDI4IC8gMjAuMCAtIDIgKiAoZ2dfaW5kICsgZ2dfb2ZmKSAtIDM2ICogMjggLyAyMC4wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIHRtcCArPSBFW2ldKjI4LzIwIOKAkyAo8J2RlPCdkZTwnZGW8J2Rm/CdkZEr8J2RlPCdkZTwnZGc8J2Rk/CdkZMpICsgNyoyOC8yMDsKLSAgICAgICAgICB0bXAgKz0gRVtpXSAqIDI4IC8gMjAuMCAtIChnZ19pbmQgKyBnZ19vZmYpICsgNyAqIDI4IC8gMjAuMDsKLSAgICAgICAgfQotICAgICAgICBpc3plcm8gPSAwOwotICAgICAgfQotICAgIH0KLSAgICAvLyBpZiAodG1wID4g8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGg8J2RnfCdkZLwnZGQ4oCyICoxLjQqMjgvMjAgJiYgaXN6ZXJvID09IDApCi0gICAgaWYgKCh0bXAgPiBuYml0c19zcGVjX2FkaiAqIDEuNCAqIDI4IC8gMjAuMCkgJiYgKGlzemVybyA9PSAwKSkgewotICAgICAgLy/wnZGU8J2RlPCdkZbwnZGb8J2RkSArPSBmYWM7Ci0gICAgICBnZ19pbmQgKz0gZmFjOwotICAgIH0KLSAgfQotfQotCi1ib29sIFNwZWN0cmFsUXVhbnRpemF0aW9uOjpnbG9iYWxHYWluTGltaXRhdGlvbihjb25zdCBkb3VibGUqIGNvbnN0IFhfZikgewotICAvLyAtPiBub3QgcHJlY2lzZWx5IGNsZWFyIHdoZXJlIHRoaXMgbGltaXRhdGlvbiBzaG91bGQgb2NjdXIKLSAgLy8gLT4gSXMgdGhlIGZvbGxvd2luZyBjb252ZXJ0ZWQgcHNldWRvIGNvZGUgbWVhbnQ/Ci0gIC8vIC0+IEFyZSB0aGUgY2hvc2VuIGRhdGF0eXBlcyBhcHByb3ByaWF0ZT8KLSAgZG91YmxlIFhfZl9tYXggPSAwOwotICBmb3IgKHVpbnQxNl90IG4gPSAwOyBuIDwgTkU7IG4rKykgewotICAgIFhfZl9tYXggPSBzdGQ6Om1heChYX2ZfbWF4LCBmYWJzKFhfZltuXSkpOwotICB9Ci0gIGlmIChYX2ZfbWF4ID4gMCkgewotICAgIGdnX21pbiA9IGNlaWwoMjggKiBsb2cxMChYX2ZfbWF4IC8gKDMyNzY4IC0gMC4zNzUpKSkgLSBnZ19vZmY7Ci0gIH0gZWxzZSB7Ci0gICAgZ2dfbWluID0gMDsKLSAgfQotICBib29sIHJlc2V0X29mZnNldCA9IGZhbHNlOwotICAvLyBpZiAo8J2RlPCdkZTwnZGW8J2Rm/CdkZEgPCDwnZGU8J2RlPCdkZrwnZGW8J2RmyB8fCDwnZGL8J2Rk/CdkZrwnZGO8J2RpSA9PSAwKQotICBpZiAoKGdnX2luZCA8IGdnX21pbikgfHwgWF9mX21heCA9PSAwKSB7Ci0gICAgLy/wnZGU8J2RlPCdkZbwnZGb8J2RkSA9IPCdkZTwnZGU8J2RmvCdkZbwnZGbOwotICAgIC8v8J2Rn/CdkZLwnZGg8J2RkvCdkaHwnZGc8J2Rk/CdkZPwnZGg8J2RkvCdkaEgPSAxOwotICAgIGdnX2luZCA9IGdnX21pbjsKLSAgICByZXNldF9vZmZzZXQgPSB0cnVlOwotICB9IGVsc2UgewotICAgIC8v8J2Rn/CdkZLwnZGg8J2RkvCdkaHwnZGc8J2Rk/CdkZPwnZGg8J2RkvCdkaEgPSAwOwotICAgIHJlc2V0X29mZnNldCA9IGZhbHNlOwotICB9Ci0gIHJldHVybiByZXNldF9vZmZzZXQ7Ci19Ci0KLXZvaWQgU3BlY3RyYWxRdWFudGl6YXRpb246OnF1YW50aXplU3BlY3RydW0oY29uc3QgZG91YmxlKiBjb25zdCBYX2YpIHsKLSAgZ2cgPSBwb3coMTAuZiwgKGdnX2luZCArIGdnX29mZikgLyAyOC4wZik7Ci0gIGZvciAodWludDE2X3QgbiA9IDA7IG4gPCBORTsgbisrKSB7Ci0gICAgaWYgKFhfZltuXSA+PSAwKSB7Ci0gICAgICBYX3Fbbl0gPSBYX2Zbbl0gLyBnZyArIDAuMzc1OwotICAgIH0gZWxzZSB7Ci0gICAgICBYX3Fbbl0gPSBYX2Zbbl0gLyBnZyAtIDAuMzc1OwotICAgIH0KLSAgfQotfQotCi12b2lkIFNwZWN0cmFsUXVhbnRpemF0aW9uOjpjb21wdXRlQml0Q29uc3VtcHRpb24odWludDE2X3QgbmJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgbW9kZUZsYWcpIHsKLSAgLy8gaWYgKG5iaXRzID4gKDE2MCArIPCdkZPwnZGg8J2RlvCdkZvwnZGRICogMTYwKSkKLSAgaWYgKG5iaXRzID4gKDE2MCArIGZzX2luZCAqIDE2MCkpIHsKLSAgICByYXRlRmxhZyA9IDUxMjsKLSAgfSBlbHNlIHsKLSAgICByYXRlRmxhZyA9IDA7Ci0gIH0KLSAgLy8gaWYgKG5iaXRzID49ICg0ODAgKyDwnZGT8J2RoPCdkZbwnZGb8J2RkSAqIDE2MCkpCi0gIGlmIChuYml0cyA+PSAoNDgwICsgZnNfaW5kICogMTYwKSkgewotICAgIG1vZGVGbGFnID0gMTsKLSAgfSBlbHNlIHsKLSAgICBtb2RlRmxhZyA9IDA7Ci0gIH0KLQotICAvLyBsYXN0bnogPSDwnZGB8J2QuDsKLSAgbGFzdG56ID0gTkU7Ci0gIC8vIHdoaWxlIChsYXN0bno+MiAmJiDwnZGL8J2RnltsYXN0bnotMV0gPT0gMCAmJiDwnZGL8J2RnltsYXN0bnotMl0gPT0gMCkKLSAgd2hpbGUgKChsYXN0bnogPiAyKSAmJiAoWF9xW2xhc3RueiAtIDFdID09IDApICYmIChYX3FbbGFzdG56IC0gMl0gPT0gMCkpIHsKLSAgICBsYXN0bnogLT0gMjsKLSAgfQotCi0gIC8v8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGS8J2RoPCdkaEgPSAwOwotICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RofCdkZ/wnZGi8J2Rm/CdkZAgPSAwOwotICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RmfCdkaDwnZGPID0gMDsKLSAgdWludDMyX3QgbmJpdHNfZXN0X2xvY2FsID0gMDsKLSAgdWludDMyX3QgbmJpdHNfdHJ1bmNfbG9jYWwgPSAwOwotICBuYml0c19sc2IgPSAwOwotICBsYXN0bnpfdHJ1bmMgPSAyOwotICB1aW50MTZfdCBjID0gMDsKLSAgZm9yICh1aW50MTZfdCBuID0gMDsgbiA8IGxhc3RuejsgbiA9IG4gKyAyKSB7Ci0gICAgdWludDE2X3QgdCA9IGMgKyByYXRlRmxhZzsKLSAgICAvLyBpZiAobiA+IPCdkYHwnZC4LzIpCi0gICAgaWYgKG4gPiBORSAvIDIpIHsKLSAgICAgIHQgKz0gMjU2OwotICAgIH0KLSAgICAvLyBhID0gYWJzKPCdkYvwnZGeW25dKTsKLSAgICB1aW50MTZfdCBhID0gYWJzKFhfcVtuXSk7Ci0gICAgdWludDE2X3QgYV9sc2IgPSBhOwotICAgIC8vIGIgPSBhYnMo8J2Ri/CdkZ5bbisxXSk7Ci0gICAgdWludDE2X3QgYiA9IGFicyhYX3FbbiArIDFdKTsKLSAgICB1aW50MTZfdCBiX2xzYiA9IGI7Ci0gICAgdWludDE2X3QgbGV2ID0gMDsKLSAgICAvLyB3aGlsZSAobWF4KGEsYikgPj0gNCkKLSAgICB1aW50OF90IHBraTsKLSAgICB3aGlsZSAoc3RkOjptYXgoYSwgYikgPj0gNCkgewotICAgICAgcGtpID0gYWNfc3BlY19sb29rdXBbdCArIGxldiAqIDEwMjRdOwotICAgICAgLy/wnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZLwnZGg8J2RoSArPSBhY19zcGVjX2JpdHNbcGtpXVsxNl07Ci0gICAgICBuYml0c19lc3RfbG9jYWwgKz0gYWNfc3BlY19iaXRzW3BraV1bMTZdOwotICAgICAgaWYgKChsZXYgPT0gMCkgJiYgKG1vZGVGbGFnID09IDEpKSB7Ci0gICAgICAgIC8v8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGZ8J2RoPCdkY8gKz0gMjsKLSAgICAgICAgbmJpdHNfbHNiICs9IDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhICs9IDIqMjA0ODsKLSAgICAgICAgbmJpdHNfZXN0X2xvY2FsICs9IDIgKiAyMDQ4OwotICAgICAgfQotICAgICAgYSA+Pj0gMTsKLSAgICAgIGIgPj49IDE7Ci0gICAgICBsZXYgPSBzdGQ6Om1pbihsZXYgKyAxLCAzKTsKLSAgICB9Ci0gICAgcGtpID0gYWNfc3BlY19sb29rdXBbdCArIGxldiAqIDEwMjRdOwotICAgIHVpbnQxNl90IHN5bSA9IGEgKyA0ICogYjsKLSAgICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhICs9IGFjX3NwZWNfYml0c1twa2ldW3N5bV07Ci0gICAgbmJpdHNfZXN0X2xvY2FsICs9IGFjX3NwZWNfYml0c1twa2ldW3N5bV07Ci0gICAgLy8gYV9sc2IgPSBhYnMo8J2Ri/CdkZ5bbl0pOyAtPiBpbXBsZW1lbnRlZCBlYXJsaWVyCi0gICAgLy8gYl9sc2IgPSBhYnMo8J2Ri/CdkZ5bbisxXSk7IC0+IGltcGxlbWVudGVkIGVhcmxpZXIKLSAgICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhICs9IChtaW4oYV9sc2IsMSkgKyBtaW4oYl9sc2IsMSkpICogMjA0ODsKLSAgICAvLyBuYml0c19lc3RfbG9jYWwgKz0gKHN0ZDo6bWluKGFfbHNiLHN0YXRpY19jYXN0PHVpbnQxNl90PigxKSkKLSAgICAvLyAgICAgICAgICAgICAgKyBzdGQ6Om1pbihiX2xzYixzdGF0aWNfY2FzdDx1aW50MTZfdD4oMSkpKSAqIDIwNDg7Ci0gICAgLy8gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gKG1vcmUgY2xlYXIsIG1vcmUgcGVyZm9ybWFudD8pCi0gICAgaWYgKGFfbHNiID4gMCkgbmJpdHNfZXN0X2xvY2FsICs9IDIwNDg7Ci0gICAgaWYgKGJfbHNiID4gMCkgbmJpdHNfZXN0X2xvY2FsICs9IDIwNDg7Ci0gICAgaWYgKChsZXYgPiAwKSAmJiAobW9kZUZsYWcgPT0gMSkpIHsKLSAgICAgIGFfbHNiID4+PSAxOwotICAgICAgYl9sc2IgPj49IDE7Ci0gICAgICAvLyBpZiAoYV9sc2IgPT0gMCAmJiDwnZGL8J2RnltuXSAhPSAwKQotICAgICAgaWYgKGFfbHNiID09IDAgJiYgWF9xW25dICE9IDApIHsKLSAgICAgICAgLy/wnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZnwnZGg8J2RjysrOwotICAgICAgICBuYml0c19sc2IrKzsKLSAgICAgIH0KLSAgICAgIC8vIGlmIChiX2xzYiA9PSAwICYmIPCdkYvwnZGeW24rMV0gIT0gMCkKLSAgICAgIGlmIChiX2xzYiA9PSAwICYmIFhfcVtuICsgMV0gIT0gMCkgewotICAgICAgICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RmfCdkaDwnZGPKys7Ci0gICAgICAgIG5iaXRzX2xzYisrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGlmICgo8J2Ri/CdkZ5bbl0gIT0gMCB8fCDwnZGL8J2RnltuKzFdICE9IDApICYmICjwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZLwnZGg8J2RoSA8PSDwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkaDwnZGd8J2RkvCdkZAqMjA0OCkpCi0gICAgLy8gaWYgKCgoWF9xW25dICE9IDApIHx8IChYX3FbbisxXSAhPSAwKSkgJiYgKG5iaXRzX2VzdF9sb2NhbCA8PQotICAgIC8vIG5iaXRzX3NwZWMqMjA0OCkpCi0gICAgaWYgKCgoWF9xW25dICE9IDApIHx8IChYX3FbbiArIDFdICE9IDApKSAmJgotICAgICAgICAoY2VpbChuYml0c19lc3RfbG9jYWwgLyAyMDQ4LjApIDw9IG5iaXRzX3NwZWMpKSB7Ci0gICAgICBsYXN0bnpfdHJ1bmMgPSBuICsgMjsKLSAgICAgIC8v8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGh8J2Rn/CdkaLwnZGb8J2RkCA9IPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhOwotICAgICAgbmJpdHNfdHJ1bmNfbG9jYWwgPSBuYml0c19lc3RfbG9jYWw7Ci0gICAgfQotICAgIGlmIChsZXYgPD0gMSkgewotICAgICAgdCA9IDEgKyAoYSArIGIpICogKGxldiArIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0ID0gMTIgKyBsZXY7Ci0gICAgfQotICAgIGMgPSAoYyAmIDE1KSAqIDE2ICsgdDsKLSAgfQotICAvL/CdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhID0gY2VpbCjwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZLwnZGg8J2RoS8yMDQ4KSArIPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RmfCdkaDwnZGPOwotICBuYml0c19lc3QgPSBjZWlsKG5iaXRzX2VzdF9sb2NhbCAvIDIwNDguMCkgKyBuYml0c19sc2I7Ci0gIC8v8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGh8J2Rn/CdkaLwnZGb8J2RkCA9IGNlaWwo8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGh8J2Rn/CdkaLwnZGb8J2RkC8yMDQ4KTsKLSAgbmJpdHNfdHJ1bmMgPSBjZWlsKG5iaXRzX3RydW5jX2xvY2FsIC8gMjA0OC4wKTsKLX0KLQotYm9vbCBTcGVjdHJhbFF1YW50aXphdGlvbjo6Z2xvYmFsR2FpbkFkanVzdG1lbnQoKSB7Ci0gIHVpbnQxNl90IHQxWzVdID0gezgwLCAyMzAsIDM4MCwgNTMwLCA2ODB9OwotICB1aW50MTZfdCB0Mls1XSA9IHs1MDAsIDEwMjUsIDE1NTAsIDIwNzUsIDI2MDB9OwotICB1aW50MTZfdCB0M1s1XSA9IHs4NTAsIDE3MDAsIDI1NTAsIDM0MDAsIDQyNTB9OwotCi0gIGRvdWJsZSBkZWx0YTsKLSAgZG91YmxlIGRlbHRhMjsKLSAgLy8gaWYgKPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhIDwgdDFb8J2Rk/CdkaDwnZGW8J2Rm/CdkZFdKQotICBpZiAobmJpdHNfZXN0IDwgdDFbZnNfaW5kXSkgewotICAgIC8vIGRlbHRhID0gKPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhKzQ4KS8xNjsKLSAgICBkZWx0YSA9IChuYml0c19lc3QgKyA0OCkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KDE2KTsKLSAgfQotICAvLyBlbHNlIGlmICjwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZLwnZGg8J2RoSA8IHQyW/CdkZPwnZGg8J2RlvCdkZvwnZGRXSkKLSAgZWxzZSBpZiAobmJpdHNfZXN0IDwgdDJbZnNfaW5kXSkgewotICAgIC8vIHRtcDEgPSB0MVvwnZGT8J2RoPCdkZbwnZGb8J2RkV0vMTYrMzsKLSAgICAvLyB0bXAyID0gdDJb8J2Rk/CdkaDwnZGW8J2Rm/CdkZFdLzQ4OwotICAgIC8vIGRlbHRhID0gKPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhLXQxW/CdkZPwnZGg8J2RlvCdkZvwnZGRXSkqKHRtcDItdG1wMSkvKHQyW/CdkZPwnZGg8J2RlvCdkZvwnZGRXS10MVvwnZGT8J2RoPCdkZbwnZGb8J2RkV0pICsgdG1wMTsKLSAgICBkb3VibGUgdG1wMSA9IHQxW2ZzX2luZF0gLyBzdGF0aWNfY2FzdDxkb3VibGU+KDE2KSArIDM7Ci0gICAgZG91YmxlIHRtcDIgPSB0Mltmc19pbmRdIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPig0OCk7Ci0gICAgZGVsdGEgPQotICAgICAgICAobmJpdHNfZXN0IC0gdDFbZnNfaW5kXSkgKiAodG1wMiAtIHRtcDEpIC8gKHQyW2ZzX2luZF0gLSB0MVtmc19pbmRdKSArCi0gICAgICAgIHRtcDE7Ci0gIH0KLSAgLy8gZWxzZSBpZiAo8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGS8J2RoPCdkaEgPCB0M1vwnZGT8J2RoPCdkZbwnZGb8J2RkV0pCi0gIGVsc2UgaWYgKG5iaXRzX2VzdCA8IHQzW2ZzX2luZF0pIHsKLSAgICAvLyBkZWx0YSA9IPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhLzQ4OwotICAgIGRlbHRhID0gbmJpdHNfZXN0IC8gc3RhdGljX2Nhc3Q8ZG91YmxlPig0OCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gZGVsdGEgPSB0M1vwnZGT8J2RoPCdkZbwnZGb8J2RkV0vNDg7Ci0gICAgZGVsdGEgPSB0M1tmc19pbmRdIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPig0OCk7Ci0gIH0KLSAgLy8gZGVsdGEgPSBuaW50KGRlbHRhKTsgLy8gdGhpcyBsb29rcyBsaWtlIHdlIG5lZWQgZmxvYXRpbmcgcG9pbnQKLSAgLy8gbmludCguKSBpcyB0aGUgcm91bmRpbmctdG8tbmVhcmVzdC1pbnRlZ2VyIGZ1bmN0aW9uLgotICBkZWx0YSA9IHN0YXRpY19jYXN0PGludDE2X3Q+KGRlbHRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUpOyAgLy8gdGhpcyBsb29rcyBsaWtlIHdlIG5lZWQgZmxvYXRpbmcgcG9pbnQKLSAgZGVsdGEyID0gZGVsdGEgKyAyOwotCi0gIHVpbnQxNl90IGdnX2luZF9vcmlnaW4gPSBnZ19pbmQ7Ci0KLSAgLyoKLSAgaWYgKCjwnZGU8J2RlPCdkZbwnZGb8J2RkSA8IDI1NSAmJiDwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZLwnZGg8J2RoSA+IPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RoPCdkZ3wnZGS8J2RkCkgfHwKLSAgICAgICjwnZGU8J2RlPCdkZbwnZGb8J2RkSA+IDAgJiYg8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGS8J2RoPCdkaEgPCDwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkaDwnZGd8J2RkvCdkZAg4oCTIGRlbHRhMikpCi0gIHsKLSAgICAgIGlmICjwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkZLwnZGg8J2RoSA8IPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RoPCdkZ3wnZGS8J2RkCDigJMgZGVsdGEyKQotICAgICAgewotICAgICAgICAgIPCdkZTwnZGU8J2RlvCdkZvwnZGRIC09IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICjwnZGU8J2RlPCdkZbwnZGb8J2RkSA9PSAyNTQgfHwg8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGS8J2RoPCdkaEgPCDwnZGb8J2Rj/CdkZbwnZGh8J2RoPCdkaDwnZGd8J2RkvCdkZAgKyBkZWx0YSkKLSAgICAgIHsKLSAgICAgICAgICDwnZGU8J2RlPCdkZbwnZGb8J2RkSArPSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgIPCdkZTwnZGU8J2RlvCdkZvwnZGRICs9IDI7Ci0gICAgICB9Ci0gICAgICAgICAg8J2RlPCdkZTwnZGW8J2Rm/CdkZEgPSBtYXgo8J2RlPCdkZTwnZGW8J2Rm/CdkZEsIPCdkZTwnZGU8J2RmvCdkZbwnZGbKTsKLSAgfQotICAqLwotICBpZiAoKChnZ19pbmQgPCAyNTUpICYmIChuYml0c19lc3QgPiBuYml0c19zcGVjKSkgfHwKLSAgICAgICgoZ2dfaW5kID4gMCkgJiYgKG5iaXRzX2VzdCA8IG5iaXRzX3NwZWMgLSBkZWx0YTIpKSkgewotICAgIGlmIChuYml0c19lc3QgPCBuYml0c19zcGVjIC0gZGVsdGEyKSB7Ci0gICAgICBnZ19pbmQgLT0gMTsKLSAgICB9IGVsc2UgaWYgKChnZ19pbmQgPT0gMjU0KSB8fCAobmJpdHNfZXN0IDwgbmJpdHNfc3BlYyArIGRlbHRhKSkgewotICAgICAgZ2dfaW5kICs9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdnX2luZCArPSAyOwotICAgIH0KLSAgICBnZ19pbmQgPSBzdGQ6Om1heChnZ19pbmQsIGdnX21pbik7Ci0gIH0KLQotICByZXR1cm4gKGdnX2luZF9vcmlnaW4gIT0gZ2dfaW5kKTsKLX0KLQotdm9pZCBTcGVjdHJhbFF1YW50aXphdGlvbjo6cnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWF9mLCB1aW50MTZfdCBuYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuYml0c19zcGVjX2xvY2FsKSB7Ci0gIG5iaXRzX3NwZWMgPSBuYml0c19zcGVjX2xvY2FsOwotCi0gIC8vIDMuMy4xMC4yIEZpcnN0IGdsb2JhbCBnYWluIGVzdGltYXRpb24gIChkMDlyMDJfRjJGKQotICB1cGRhdGVHbG9iYWxHYWluRXN0aW1hdGlvblBhcmFtZXRlcihuYml0cywgbmJpdHNfc3BlY19sb2NhbCk7Ci0KLSAgZG91YmxlIEVbTkUgLyA0XTsKLSAgY29tcHV0ZVNwZWN0cmFsRW5lcmd5KEUsIFhfZik7Ci0gIGdsb2JhbEdhaW5Fc3RpbWF0aW9uKEUpOwotICAvLyBGaW5hbGx5LCB0aGUgcXVhbnRpemVkIGdhaW4gaW5kZXggaXMgbGltaXRlZCBzdWNoIHRoYXQKLSAgLy8gdGhlIHF1YW50aXplZCBzcGVjdHJ1bSBzdGF5cyB3aXRoaW4gdGhlIHJhbmdlIFstMzI3NjgsMzI3NjddCi0gIGJvb2wgcmVzZXRfb2Zmc2V0ID0gZ2xvYmFsR2FpbkxpbWl0YXRpb24oWF9mKTsKLQotICAvLyAzLjMuMTAuMyBRdWFudGl6YXRpb24gICAoZDA5cjAyX0YyRikKLSAgcXVhbnRpemVTcGVjdHJ1bShYX2YpOwotCi0gIC8vIDMuMy4xMC40IEJpdCBjb25zdW1wdGlvbiAgICAoZDA5cjAyX0YyRikKLSAgdWludDhfdCBtb2RlRmxhZzsKLSAgY29tcHV0ZUJpdENvbnN1bXB0aW9uKG5iaXRzLCBtb2RlRmxhZyk7Ci0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygiZ2dfaW5kIiwgJmdnX2luZCwgc2l6ZW9mKGdnX2luZCkpOwotICAgIGRhdGFwb2ludHMtPmxvZygiZ2ciLCAmZ2csIHNpemVvZihnZykpOwotICAgIGRhdGFwb2ludHMtPmxvZygiWF9xIiwgWF9xLCBzaXplb2YoaW50MTZfdCkgKiBORSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJsYXN0bnoiLCAmbGFzdG56LCBzaXplb2YobGFzdG56KSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJsYXN0bnpfdHJ1bmMiLCAmbGFzdG56X3RydW5jLCBzaXplb2YobGFzdG56X3RydW5jKSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJuYml0c19lc3QiLCAmbmJpdHNfZXN0LCBzaXplb2YobmJpdHNfZXN0KSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJuYml0c190cnVuYyIsICZuYml0c190cnVuYywgc2l6ZW9mKG5iaXRzX3RydW5jKSk7Ci0gIH0KLQotICAvLyAzLjMuMTAuNSBUcnVuY2F0aW9uICAgKGQwOXIwMl9GMkYpCi0gIGZvciAodWludDE2X3QgayA9IGxhc3Ruel90cnVuYzsgayA8IGxhc3RuejsgaysrKSB7Ci0gICAgLy/wnZGL8J2RnltrXSA9IDA7Ci0gICAgWF9xW2tdID0gMDsKLSAgfQotCi0gIC8vIGlmIChtb2RlRmxhZyA9PSAxICYmIPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhID4g8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGg8J2RnfCdkZLwnZGQKQotICBpZiAoKG1vZGVGbGFnID09IDEpICYmIChuYml0c19lc3QgPiBuYml0c19zcGVjKSkgewotICAgIGxzYk1vZGUgPSAxOwotICB9IGVsc2UgewotICAgIGxzYk1vZGUgPSAwOwotICB9Ci0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygibHNiTW9kZSIsICZsc2JNb2RlLCBzaXplb2YobHNiTW9kZSkpOwotICB9Ci0KLSAgLy8gTm90ZTogc3RhdGVzIG5lZWRzIHRvIGJlIHRyYW5zZmVycmVkIHByaW9yCi0gIC8vIHRvIHNwZWN0cnVtIHJlLXF1YW50aXphdGlvbiEKLSAgbmJpdHNfc3BlY19vbGQgPSBuYml0c19zcGVjOwotICBuYml0c19lc3Rfb2xkID0gbmJpdHNfZXN0OwotICByZXNldF9vZmZzZXRfb2xkID0gcmVzZXRfb2Zmc2V0OwotICBuYml0c19vZmZzZXRfb2xkID0gbmJpdHNfb2Zmc2V0OwotCi0gIC8vIDMuMy4xMC42IEdsb2JhbCBnYWluIGFkanVzdG1lbnQgICAgICAgIChkMDlyMDJfRjJGKQotICBib29sIGlzQWRqdXN0ZWQgPSBnbG9iYWxHYWluQWRqdXN0bWVudCgpOwotICBpZiAoaXNBZGp1c3RlZCkgewotICAgIHF1YW50aXplU3BlY3RydW0oWF9mKTsKLSAgICBjb21wdXRlQml0Q29uc3VtcHRpb24obmJpdHMsIG1vZGVGbGFnKTsKLQotICAgIC8vIDMuMy4xMC41IFRydW5jYXRpb24gICAoZDA5cjAyX0YyRikKLSAgICBmb3IgKHVpbnQxNl90IGsgPSBsYXN0bnpfdHJ1bmM7IGsgPCBsYXN0bno7IGsrKykgewotICAgICAgLy/wnZGL8J2RnltrXSA9IDA7Ci0gICAgICBYX3Fba10gPSAwOwotICAgIH0KLQotICAgIC8vIGlmIChtb2RlRmxhZyA9PSAxICYmIPCdkZvwnZGP8J2RlvCdkaHwnZGg8J2RkvCdkaDwnZGhID4g8J2Rm/CdkY/wnZGW8J2RofCdkaDwnZGg8J2RnfCdkZLwnZGQKQotICAgIGlmIChtb2RlRmxhZyA9PSAxICYmIG5iaXRzX2VzdCA+IG5iaXRzX3NwZWMpIHsKLSAgICAgIGxzYk1vZGUgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBsc2JNb2RlID0gMDsKLSAgICB9Ci0gIH0KLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmxvZygiaXNBZGp1c3RlZCIsICZpc0FkanVzdGVkLCBzaXplb2YoaXNBZGp1c3RlZCkpOwotICAgIGRhdGFwb2ludHMtPmxvZygiZ2dfaW5kX2FkaiIsICZnZ19pbmQsIHNpemVvZihnZ19pbmQpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coImdnX2FkaiIsICZnZywgc2l6ZW9mKGdnKSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJYX3FfcmVxIiwgWF9xLCBzaXplb2YoaW50MTZfdCkgKiBORSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJsYXN0bnpfcmVxIiwgJmxhc3Ruel90cnVuYywgc2l6ZW9mKGxhc3Ruel90cnVuYykpOwotICAgIGRhdGFwb2ludHMtPmxvZygibmJpdHNfZXN0X3JlcSIsICZuYml0c19lc3QsIHNpemVvZihuYml0c19lc3QpKTsKLSAgICBkYXRhcG9pbnRzLT5sb2coIm5iaXRzX3RydW5jX3JlcSIsICZuYml0c190cnVuYywgc2l6ZW9mKG5iaXRzX3RydW5jKSk7Ci0gICAgZGF0YXBvaW50cy0+bG9nKCJsc2JNb2RlX3JlcSIsICZsc2JNb2RlLCBzaXplb2YobHNiTW9kZSkpOwotICB9Ci19Ci0KLXZvaWQgU3BlY3RyYWxRdWFudGl6YXRpb246OnJlZ2lzdGVyRGF0YXBvaW50cyhEYXRhcG9pbnRDb250YWluZXIqIGRhdGFwb2ludHNfKSB7Ci0gIGRhdGFwb2ludHMgPSBkYXRhcG9pbnRzXzsKLSAgaWYgKG51bGxwdHIgIT0gZGF0YXBvaW50cykgewotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiZ2dfb2ZmIiwgJmdnX29mZiwgc2l6ZW9mKGdnX29mZikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgiZ2dfbWluIiwgJmdnX21pbiwgc2l6ZW9mKGdnX21pbikpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibmJpdHNfb2Zmc2V0IiwgJm5iaXRzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5iaXRzX29mZnNldCkpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9TcGVjdHJhbFF1YW50aXphdGlvbi5ocHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvU3BlY3RyYWxRdWFudGl6YXRpb24uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODA4ZTYzLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9TcGVjdHJhbFF1YW50aXphdGlvbi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogU3BlY3RyYWxRdWFudGl6YXRpb24uaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1BFQ1RSQUxfUVVBTlRJWkFUSU9OX0hfCi0jZGVmaW5lIFNQRUNUUkFMX1FVQU5USVpBVElPTl9IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIkRhdGFwb2ludHMuaHBwIgotCi1uYW1lc3BhY2UgTGMzRW5jIHsKLQotY2xhc3MgU3BlY3RyYWxRdWFudGl6YXRpb24gewotIHB1YmxpYzoKLSAgU3BlY3RyYWxRdWFudGl6YXRpb24odWludDE2X3QgTkVfLCB1aW50OF90IGZzX2luZF8pOwotICB2aXJ0dWFsIH5TcGVjdHJhbFF1YW50aXphdGlvbigpOwotCi0gIHZvaWQgcmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pOwotCi0gIHZvaWQgcnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWF9mLCB1aW50MTZfdCBuYml0cywgdWludDE2X3QgbmJpdHNfc3BlY19sb2NhbCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIHVwZGF0ZUdsb2JhbEdhaW5Fc3RpbWF0aW9uUGFyYW1ldGVyKHVpbnQxNl90IG5iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5iaXRzX3NwZWNfbG9jYWwpOwotICB2b2lkIGNvbXB1dGVTcGVjdHJhbEVuZXJneShkb3VibGUqIEUsIGNvbnN0IGRvdWJsZSogWF9mKTsKLSAgdm9pZCBnbG9iYWxHYWluRXN0aW1hdGlvbihjb25zdCBkb3VibGUqIEUpOwotICBib29sIGdsb2JhbEdhaW5MaW1pdGF0aW9uKGNvbnN0IGRvdWJsZSogY29uc3QgWF9mKTsKLSAgdm9pZCBxdWFudGl6ZVNwZWN0cnVtKGNvbnN0IGRvdWJsZSogY29uc3QgWF9mKTsKLSAgdm9pZCBjb21wdXRlQml0Q29uc3VtcHRpb24odWludDE2X3QgbmJpdHMsIHVpbnQ4X3QmIG1vZGVGbGFnKTsKLSAgYm9vbCBnbG9iYWxHYWluQWRqdXN0bWVudCgpOwotCi0gcHVibGljOgotICBzdGF0aWMgY29uc3QgdWludDhfdCBOX2IgPSA2NDsKLQotICBjb25zdCB1aW50MTZfdCBORTsKLSAgY29uc3QgdWludDhfdCBmc19pbmQ7Ci0KLSAgaW50MTZfdCogWF9xOwotICB1aW50MTZfdCBsYXN0bno7Ci0gIHVpbnQxNl90IG5iaXRzX2xzYjsKLSAgdWludDE2X3QgbmJpdHNfdHJ1bmM7Ci0gIHVpbnQxNl90IHJhdGVGbGFnOwotICB1aW50OF90IGxzYk1vZGU7Ci0gIGZsb2F0IGdnOwotICB1aW50MTZfdCBsYXN0bnpfdHJ1bmM7Ci0gIGludDE2X3QgZ2dfaW5kOwotCi0gcHJpdmF0ZToKLSAgRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzOwotICBpbnQxNl90IGdnX29mZjsKLSAgaW50MTZfdCBnZ19taW47Ci0gIGZsb2F0IG5iaXRzX29mZnNldDsKLSAgdWludDE2X3QgbmJpdHNfc3BlYzsKLSAgdWludDE2X3QgbmJpdHNfc3BlY19hZGo7Ci0gIHVpbnQxNl90IG5iaXRzX2VzdDsKLQotICAvLyBzdGF0ZXMKLSAgYm9vbCByZXNldF9vZmZzZXRfb2xkOwotICBmbG9hdCBuYml0c19vZmZzZXRfb2xkOwotICB1aW50MTZfdCBuYml0c19zcGVjX29sZDsKLSAgdWludDE2X3QgbmJpdHNfZXN0X29sZDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKLQotI2VuZGlmICAvLyBTUEVDVFJBTF9RVUFOVElaQVRJT05fSF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9UZW1wb3JhbE5vaXNlU2hhcGluZy5jcHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvVGVtcG9yYWxOb2lzZVNoYXBpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M5ODE1Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9UZW1wb3JhbE5vaXNlU2hhcGluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoKLSAqIFRlbXBvcmFsTm9pc2VTaGFwaW5nLmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVGVtcG9yYWxOb2lzZVNoYXBpbmcuaHBwIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJUZW1wb3JhbE5vaXNlU2hhcGluZ1RhYmxlcy5ocHAiCi0KLW5hbWVzcGFjZSBMYzNFbmMgewotCi1UZW1wb3JhbE5vaXNlU2hhcGluZzo6VGVtcG9yYWxOb2lzZVNoYXBpbmcoY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWdfKQotICAgIDogbGMzQ29uZmlnKGxjM0NvbmZpZ18pLAotICAgICAgbmJpdHNfVE5TKDApLAotICAgICAgWF9mKG51bGxwdHIpLAotICAgICAgdG5zX2xwY193ZWlnaHRpbmcoMCksCi0gICAgICBudW1fdG5zX2ZpbHRlcnMoMCksCi0gICAgICBkYXRhcG9pbnRzKG51bGxwdHIpIHsKLSAgWF9mID0gbmV3IGRvdWJsZVtsYzNDb25maWcuTkVdOwotfQotCi1UZW1wb3JhbE5vaXNlU2hhcGluZzo6flRlbXBvcmFsTm9pc2VTaGFwaW5nKCkgewotICBpZiAobnVsbHB0ciAhPSBYX2YpIHsKLSAgICBkZWxldGVbXSBYX2Y7Ci0gIH0KLX0KLQotdm9pZCBUZW1wb3JhbE5vaXNlU2hhcGluZzo6cnVuKGNvbnN0IGRvdWJsZSogY29uc3QgWF9zLCB1aW50OF90IFBfQlcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbmJpdHMsIHVpbnQ4X3QgbmVhcl9ueXF1aXN0X2ZsYWcpIHsKLSAgLy8gMy4zLjguMSBPdmVydmlldyAvIFRhYmxlIDMuMTQ6IFROUyBlbmNvZGVyIHBhcmFtZXRlcnMgIChkMDlyMDZfRmhHKQotICB1aW50MTZfdCBzdGFydF9mcmVxWzJdOwotICB1aW50MTZfdCBzdG9wX2ZyZXFbMl07Ci0gIHVpbnQxNl90IHN1Yl9zdGFydFsyXVszXTsKLSAgdWludDE2X3Qgc3ViX3N0b3BbMl1bM107Ci0KLSAgaWYgKGxjM0NvbmZpZy5OX21zID09IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjo6ZDEwbXMpIHsKLSAgICBzdGFydF9mcmVxWzBdID0gMTI7Ci0gICAgaWYgKDQgIT0gUF9CVykgewotICAgICAgc3RhcnRfZnJlcVsxXSA9IDE2MDsKLSAgICB9IGVsc2UgewotICAgICAgc3RhcnRfZnJlcVsxXSA9IDIwMDsKLSAgICB9Ci0gICAgc3dpdGNoIChQX0JXKSB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBOb3RlOiB0aGlzIGRlZmF1bHQgc2V0dGluZyBhdm9pZHMgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGJ1dCBpbgotICAgICAgICAvLyAgICAgICBwcmFjdGljZSB0aGUgY2FsbGluZyBjb2RlIGhhcyB0aGUgcmVzcG9uc2libGl0eSB0bwotICAgICAgICAvLyAgICAgICBlbnN1cmUgcHJvcGVyIHZhbHVlcyBvZiBQX0JXCi0gICAgICBjYXNlIDA6Ci0gICAgICAgIG51bV90bnNfZmlsdGVycyA9IDE7Ci0gICAgICAgIHN0b3BfZnJlcVswXSA9IDgwOwotICAgICAgICBzdWJfc3RhcnRbMF1bMF0gPSAxMjsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzFdID0gMzQ7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsyXSA9IDU3OwotICAgICAgICBzdWJfc3RvcFswXVswXSA9IDM0OwotICAgICAgICBzdWJfc3RvcFswXVsxXSA9IDU3OwotICAgICAgICBzdWJfc3RvcFswXVsyXSA9IDgwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgbnVtX3Ruc19maWx0ZXJzID0gMTsKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gMTYwOwotICAgICAgICBzdWJfc3RhcnRbMF1bMF0gPSAxMjsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzFdID0gNjE7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsyXSA9IDExMDsKLSAgICAgICAgc3ViX3N0b3BbMF1bMF0gPSA2MTsKLSAgICAgICAgc3ViX3N0b3BbMF1bMV0gPSAxMTA7Ci0gICAgICAgIHN1Yl9zdG9wWzBdWzJdID0gMTYwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgbnVtX3Ruc19maWx0ZXJzID0gMTsKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gMjQwOwotICAgICAgICBzdWJfc3RhcnRbMF1bMF0gPSAxMjsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzFdID0gODg7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsyXSA9IDE2NDsKLSAgICAgICAgc3ViX3N0b3BbMF1bMF0gPSA4ODsKLSAgICAgICAgc3ViX3N0b3BbMF1bMV0gPSAxNjQ7Ci0gICAgICAgIHN1Yl9zdG9wWzBdWzJdID0gMjQwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgbnVtX3Ruc19maWx0ZXJzID0gMjsKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gMTYwOwotICAgICAgICBzdG9wX2ZyZXFbMV0gPSAzMjA7Ci0gICAgICAgIHN1Yl9zdGFydFswXVswXSA9IDEyOwotICAgICAgICBzdWJfc3RhcnRbMF1bMV0gPSA2MTsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzJdID0gMTEwOwotICAgICAgICBzdWJfc3RhcnRbMV1bMF0gPSAxNjA7Ci0gICAgICAgIHN1Yl9zdGFydFsxXVsxXSA9IDIxMzsKLSAgICAgICAgc3ViX3N0YXJ0WzFdWzJdID0gMjY2OwotICAgICAgICBzdWJfc3RvcFswXVswXSA9IDYxOwotICAgICAgICBzdWJfc3RvcFswXVsxXSA9IDExMDsKLSAgICAgICAgc3ViX3N0b3BbMF1bMl0gPSAxNjA7Ci0gICAgICAgIHN1Yl9zdG9wWzFdWzBdID0gMjEzOwotICAgICAgICBzdWJfc3RvcFsxXVsxXSA9IDI2NjsKLSAgICAgICAgc3ViX3N0b3BbMV1bMl0gPSAzMjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0OgotICAgICAgICBudW1fdG5zX2ZpbHRlcnMgPSAyOwotICAgICAgICBzdG9wX2ZyZXFbMF0gPSAyMDA7Ci0gICAgICAgIHN0b3BfZnJlcVsxXSA9IDQwMDsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzBdID0gMTI7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsxXSA9IDc0OwotICAgICAgICBzdWJfc3RhcnRbMF1bMl0gPSAxMzc7Ci0gICAgICAgIHN1Yl9zdGFydFsxXVswXSA9IDIwMDsKLSAgICAgICAgc3ViX3N0YXJ0WzFdWzFdID0gMjY2OwotICAgICAgICBzdWJfc3RhcnRbMV1bMl0gPSAzMzM7Ci0gICAgICAgIHN1Yl9zdG9wWzBdWzBdID0gNzQ7Ci0gICAgICAgIHN1Yl9zdG9wWzBdWzFdID0gMTM3OwotICAgICAgICBzdWJfc3RvcFswXVsyXSA9IDIwMDsKLSAgICAgICAgc3ViX3N0b3BbMV1bMF0gPSAyNjY7Ci0gICAgICAgIHN1Yl9zdG9wWzFdWzFdID0gMzMzOwotICAgICAgICBzdWJfc3RvcFsxXVsyXSA9IDQwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgeyAgLy8gNy41bXMgZnJhbWUgZHVyYXRpb24KLSAgICBzdGFydF9mcmVxWzBdID0gOTsKLSAgICBpZiAoNCAhPSBQX0JXKSB7Ci0gICAgICBzdGFydF9mcmVxWzFdID0gMTIwOyAgLy8gRXJyYXRhIDE1MDk4IGltcGxlbWVudGVkCi0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXJ0X2ZyZXFbMV0gPSAxNTA7Ci0gICAgfQotICAgIHN3aXRjaCAoUF9CVykgewotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gTm90ZTogdGhpcyBkZWZhdWx0IHNldHRpbmcgYXZvaWRzIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBidXQgaW4KLSAgICAgICAgLy8gICAgICAgcHJhY3RpY2UgdGhlIGNhbGxpbmcgY29kZSBoYXMgdGhlIHJlc3BvbnNpYmxpdHkgdG8KLSAgICAgICAgLy8gICAgICAgZW5zdXJlIHByb3BlciB2YWx1ZXMgb2YgUF9CVwotICAgICAgY2FzZSAwOgotICAgICAgICBudW1fdG5zX2ZpbHRlcnMgPSAxOwotICAgICAgICBzdG9wX2ZyZXFbMF0gPSA2MDsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzBdID0gOTsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzFdID0gMjY7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsyXSA9IDQzOwotICAgICAgICBzdWJfc3RvcFswXVswXSA9IDI2OwotICAgICAgICBzdWJfc3RvcFswXVsxXSA9IDQzOwotICAgICAgICBzdWJfc3RvcFswXVsyXSA9IDYwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgbnVtX3Ruc19maWx0ZXJzID0gMTsKLSAgICAgICAgc3RvcF9mcmVxWzBdID0gMTIwOyAgLy8gRXJyYXRhIDE1MDk4IGltcGxlbWVudGVkCi0gICAgICAgIHN1Yl9zdGFydFswXVswXSA9IDk7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsxXSA9IDQ2OwotICAgICAgICBzdWJfc3RhcnRbMF1bMl0gPSA4MzsKLSAgICAgICAgc3ViX3N0b3BbMF1bMF0gPSA0NjsKLSAgICAgICAgc3ViX3N0b3BbMF1bMV0gPSA4MzsKLSAgICAgICAgc3ViX3N0b3BbMF1bMl0gPSAxMjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBudW1fdG5zX2ZpbHRlcnMgPSAxOwotICAgICAgICBzdG9wX2ZyZXFbMF0gPSAxODA7Ci0gICAgICAgIHN1Yl9zdGFydFswXVswXSA9IDk7Ci0gICAgICAgIHN1Yl9zdGFydFswXVsxXSA9IDY2OwotICAgICAgICBzdWJfc3RhcnRbMF1bMl0gPSAxMjM7Ci0gICAgICAgIHN1Yl9zdG9wWzBdWzBdID0gNjY7Ci0gICAgICAgIHN1Yl9zdG9wWzBdWzFdID0gMTIzOwotICAgICAgICBzdWJfc3RvcFswXVsyXSA9IDE4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIG51bV90bnNfZmlsdGVycyA9IDI7Ci0gICAgICAgIHN0b3BfZnJlcVswXSA9IDEyMDsKLSAgICAgICAgc3RvcF9mcmVxWzFdID0gMjQwOwotICAgICAgICBzdWJfc3RhcnRbMF1bMF0gPSA5OwotICAgICAgICBzdWJfc3RhcnRbMF1bMV0gPSA0NjsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzJdID0gODI7Ci0gICAgICAgIHN1Yl9zdGFydFsxXVswXSA9IDEyMDsgIC8vIEVycmF0YSAxNTA5OCBpbXBsZW1lbnRlZAotICAgICAgICBzdWJfc3RhcnRbMV1bMV0gPSAxNTk7Ci0gICAgICAgIHN1Yl9zdGFydFsxXVsyXSA9IDIwMDsKLSAgICAgICAgc3ViX3N0b3BbMF1bMF0gPSA0NjsKLSAgICAgICAgc3ViX3N0b3BbMF1bMV0gPSA4MjsKLSAgICAgICAgc3ViX3N0b3BbMF1bMl0gPSAxMjA7ICAvLyBFcnJhdGEgMTUwOTggaW1wbGVtZW50ZWQKLSAgICAgICAgc3ViX3N0b3BbMV1bMF0gPSAxNTk7Ci0gICAgICAgIHN1Yl9zdG9wWzFdWzFdID0gMjAwOwotICAgICAgICBzdWJfc3RvcFsxXVsyXSA9IDI0MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgIG51bV90bnNfZmlsdGVycyA9IDI7Ci0gICAgICAgIHN0b3BfZnJlcVswXSA9IDE1MDsKLSAgICAgICAgc3RvcF9mcmVxWzFdID0gMzAwOwotICAgICAgICBzdWJfc3RhcnRbMF1bMF0gPSA5OwotICAgICAgICBzdWJfc3RhcnRbMF1bMV0gPSA1NjsKLSAgICAgICAgc3ViX3N0YXJ0WzBdWzJdID0gMTAzOwotICAgICAgICBzdWJfc3RhcnRbMV1bMF0gPSAxNTA7Ci0gICAgICAgIHN1Yl9zdGFydFsxXVsxXSA9IDIwMDsKLSAgICAgICAgc3ViX3N0YXJ0WzFdWzJdID0gMjUwOwotICAgICAgICBzdWJfc3RvcFswXVswXSA9IDU2OwotICAgICAgICBzdWJfc3RvcFswXVsxXSA9IDEwMzsKLSAgICAgICAgc3ViX3N0b3BbMF1bMl0gPSAxNTA7Ci0gICAgICAgIHN1Yl9zdG9wWzFdWzBdID0gMjAwOwotICAgICAgICBzdWJfc3RvcFsxXVsxXSA9IDI1MDsKLSAgICAgICAgc3ViX3N0b3BbMV1bMl0gPSAzMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIDMuMy44LjIgVE5TIGFuYWx5c2lzICAoZDA5cjAyX0YyRiwgZDA5cjA4KQotICB0bnNfbHBjX3dlaWdodGluZyA9Ci0gICAgICAobmJpdHMgPAotICAgICAgICgobGMzQ29uZmlnLk5fbXMgPT0gTGMzQ29uZmlnOjpGcmFtZUR1cmF0aW9uOjpkMTBtcykgPyA0ODAgOiAzNjApKQotICAgICAgICAgID8gMQotICAgICAgICAgIDogMDsKLSAgY29uc3QgZG91YmxlIHBpID0gc3RkOjphY29zKC0xKTsKLSAgY29uc3QgZG91YmxlIGV4cEZhY3RvciA9IC0wLjUgKiAoMC4wMiAqIHBpKSAqICgwLjAyICogcGkpOwotICBmb3IgKHVpbnQ4X3QgZiA9IDA7IGYgPCBudW1fdG5zX2ZpbHRlcnM7IGYrKykgewotICAgIGRvdWJsZSByWzldOwotICAgIGRvdWJsZSogcncgPSByOwotICAgIGZvciAodWludDhfdCBrID0gMDsgayA8PSA4OyBrKyspIHsKLSAgICAgIGRvdWJsZSByMCA9ICgwID09IGspID8gMyA6IDA7Ci0gICAgICBkb3VibGUgcmsgPSAwOwotICAgICAgZG91YmxlIGVQcm9kID0gMTsKLSAgICAgIGZvciAodWludDhfdCBzID0gMDsgcyA8IDM7IHMrKykgewotICAgICAgICBkb3VibGUgZXMgPSAwOwotICAgICAgICBkb3VibGUgYWMgPSAwOwotICAgICAgICBmb3IgKGludDE2X3QgbiA9IHN1Yl9zdGFydFtmXVtzXTsgbiA8IHN1Yl9zdG9wW2ZdW3NdOyBuKyspIHsKLSAgICAgICAgICBlcyArPSBYX3Nbbl0gKiBYX3Nbbl07Ci0gICAgICAgICAgaWYgKG4gPCAoc3ViX3N0b3BbZl1bc10gLSBrKSkgewotICAgICAgICAgICAgYWMgKz0gWF9zW25dICogWF9zW24gKyBrXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZVByb2QgKj0gZXM7Ci0gICAgICAgIHJrICs9IGFjIC8gZXM7Ci0gICAgICB9Ci0gICAgICBpZiAoMCA9PQotICAgICAgICAgIGVQcm9kKSAgLy8gaXMgdGhpcyBmbG9hdGluZy1wb2ludCBjb21wYXJpc2lvbiB3aXRoIDAgc3RhYmxlIGVub3VnaD8KLSAgICAgIHsKLSAgICAgICAgcltrXSA9IHIwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcltrXSA9IHJrOwotICAgICAgfQotCi0gICAgICAvLyBsYWctd2luZG93aW5nIChOb3RlOiBpbi1wbGFjZSkKLSAgICAgIHJ3W2tdID0gcltrXSAqIGV4cChleHBGYWN0b3IgKiBrICogayk7Ci0gICAgfQotCi0gICAgLy8gVGhlIExldmluc29uLUR1cmJpbiByZWN1cnNpb24gaXMgdXNlZCB0byBvYnRhaW4gTFBDIGNvZWZmaWNpZW50cwotICAgIC8vIGFuZCBhIHByZWRpY3RvciBlcnJvcgotICAgIGRvdWJsZSBhX21lbW9yeVsyXVs5XTsKLSAgICBkb3VibGUqIGEgPSBhX21lbW9yeVswXTsKLSAgICBkb3VibGUqIGFfbGFzdCA9IGFfbWVtb3J5WzFdOwotICAgIGRvdWJsZSBlID0gcndbMF07Ci0gICAgYVswXSA9IDE7Ci0gICAgZm9yICh1aW50OF90IGsgPSAxOyBrIDw9IDg7IGsrKykgewotICAgICAgLy8gc3dhcCBidWZmZXIgZm9yIGEgYW5kIGFfbGFzdAotICAgICAgZG91YmxlKiB0bXAgPSBhX2xhc3Q7Ci0gICAgICBhX2xhc3QgPSBhOwotICAgICAgYSA9IHRtcDsKLSAgICAgIC8vIGE6PWFeazsgYV9sYXN0Oj1hXihrLTEpCi0gICAgICBkb3VibGUgcmMgPSAwOwotICAgICAgZm9yICh1aW50OF90IG4gPSAwOyBuIDwgazsgbisrKSB7Ci0gICAgICAgIHJjIC09IGFfbGFzdFtuXSAqIHJ3W2sgLSBuXTsKLSAgICAgIH0KLSAgICAgIGlmICgwID09IGUpIHsKLSAgICAgICAgLy8gaXMgdGhpcyBoYW5kbGluZyB0byBhdm9pZCBkaXZpc2lvbiBieSAwIG9rPwotICAgICAgICBlID0gMTsKLSAgICAgIH0KLSAgICAgIHJjIC89IGU7Ci0gICAgICBhWzBdID0gMTsKLSAgICAgIGZvciAodWludDhfdCBuID0gMTsgbiA8IGs7IG4rKykgewotICAgICAgICBhW25dID0gYV9sYXN0W25dICsgcmMgKiBhX2xhc3RbayAtIG5dOwotICAgICAgfQotICAgICAgYVtrXSA9IHJjOwotICAgICAgZSA9ICgxIC0gcmMgKiByYykgKiBlOwotICAgIH0KLSAgICBkb3VibGUgcHJlZEdhaW4gPSByd1swXSAvIGU7ICAvLyBhZ2FpbiBhIHN1c3BpY2lvdXMgcG9zc2libGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXZpc2lvbi1ieS16ZXJvISAoc2hvdWxkIGJlIGhhbmRsZWQgYWJvdmUpCi0gICAgY29uc3QgZG91YmxlIHRocmVzaCA9IDEuNTsKLSAgICBpZiAoKHByZWRHYWluIDw9IHRocmVzaCkgfHwgKG5lYXJfbnlxdWlzdF9mbGFnID4gMCkpIHsKLSAgICAgIC8vIHR1cm4gVE5TIGZpbHRlciBmIG9mZgotICAgICAgZG91YmxlKiByYyA9ICZyY19xW2YgKiA4ICsgMF07Ci0gICAgICBmb3IgKHVpbnQ4X3QgbiA9IDA7IG4gPCA4OyBuKyspIHsKLSAgICAgICAgcmNbbl0gPSAwOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyB0dXJuIFROUyBmaWx0ZXIgZiBvbgotICAgICAgLy8gLT4gd2UgbmVlZCB0byBjb21wdXRlIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0gICAgICBkb3VibGUgZ2FtbWEgPSAxOwotICAgICAgY29uc3QgZG91YmxlIHRocmVzaDIgPSAyOwotICAgICAgaWYgKCh0bnNfbHBjX3dlaWdodGluZyA+IDApICYmIChwcmVkR2FpbiA8IHRocmVzaDIpKSB7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSBnYW1tYV9taW4gPSAwLjg1OwotICAgICAgICBnYW1tYSAtPSAoMSAtIGdhbW1hX21pbikgKiAodGhyZXNoMiAtIHByZWRHYWluKSAvICh0aHJlc2gyIC0gdGhyZXNoKTsKLSAgICAgIH0KLSAgICAgIGRvdWJsZSogYXcgPSBhOyAgLy8gY29tcHV0ZSBpbi1wbGFjZQotICAgICAgZm9yICh1aW50OF90IGsgPSAwOyBrIDwgOTsgaysrKSB7Ci0gICAgICAgIGF3W2tdID0gcG93KGdhbW1hLCBrKSAqIGFba107Ci0gICAgICB9Ci0gICAgICBkb3VibGUqIHJjID0gJnJjX3FbZiAqIDggKyAwXTsKLSAgICAgIGRvdWJsZSogYV9rID0gYXc7Ci0gICAgICBkb3VibGUqIGFfa20xID0gYV9sYXN0OwotICAgICAgZm9yICh1aW50OF90IGsgPSA4OyBrID4gMDsgay0tKSB7Ci0gICAgICAgIHJjW2sgLSAxXSA9IGFfa1trXTsKLSAgICAgICAgZG91YmxlIGUgPSAoMSAtIHJjW2sgLSAxXSAqIHJjW2sgLSAxXSk7Ci0gICAgICAgIGZvciAodWludDhfdCBuID0gMTsgbiA8IGs7IG4rKykgewotICAgICAgICAgIGFfa20xW25dID0gYV9rW25dIC0gcmNbayAtIDFdICogYV9rW2sgLSBuXTsKLSAgICAgICAgICBhX2ttMVtuXSAvPSBlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHN3YXAgYnVmZmVyIGZvciBhX2sgYW5kIGFfa20xCi0gICAgICAgIGRvdWJsZSogdG1wID0gYV9rOwotICAgICAgICBhX2sgPSBhX2ttMTsKLSAgICAgICAgYV9rbTEgPSB0bXA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gMy4zLjguMyBRdWFudGl6YXRpb24gIChkMDlyMDJfRjJGKQotICAvLyB3aXRoIM6UID3PgC8xNwotICBjb25zdCBkb3VibGUgcXVhbnRpemVyX3N0ZXBzaXplID0gcGkgLyAxNzsKLSAgZm9yICh1aW50OF90IGYgPSAwOyBmIDwgbnVtX3Ruc19maWx0ZXJzOyBmKyspIHsKLSAgICBkb3VibGUqIHJjID0gJnJjX3FbZiAqIDggKyAwXTsgIC8vIHNvdXJjZSAoc2VlIGFib3ZlKQotCi0gICAgZm9yICh1aW50OF90IGsgPSAwOyBrIDwgODsgaysrKSB7Ci0gICAgICAvLyBhdHRlbnRpb246IHJjIGluIHBsYWNlIG9mIHJjX3EhCi0gICAgICByY19pW2YgKiA4ICsga10gPSBuaW50KGFzaW4ocmNba10pIC8gcXVhbnRpemVyX3N0ZXBzaXplKSArIDg7Ci0gICAgICByY19xW2YgKiA4ICsga10gPSBzaW4ocXVhbnRpemVyX3N0ZXBzaXplICogKHJjX2lbZiAqIDggKyBrXSAtIDgpKTsKLSAgICB9Ci0KLSAgICAvLyBkZXRlcm1pbmUgb3JkZXIgb2YgcXVhbnRpemVkIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0gICAgaW50OF90IGsgPSA3OyAgLy8gbmVlZCBzaWduZWQgdG8gc3RvcCB3aGlsZSBwcm9wZXJseQotICAgIC8vIHdoaWxlKCAoaz49MCkgJiYgKDA9PXJjX3FbZio4K2tdKSApIC8vIHNwZWNpZmljYXRpb24KLSAgICB3aGlsZSAoKGsgPj0gMCkgJiYKLSAgICAgICAgICAgKDggPT0gcmNfaVtmICogOCArIGtdKSkgIC8vIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRoYXQgc2hvdWxkIGJlIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvYnVzdCAoYW5kIGZhc3RlcikKLSAgICB7Ci0gICAgICBrLS07Ci0gICAgfQotICAgIHJjX29yZGVyW2ZdID0gayArIDE7Ci0gIH0KLSAgZm9yICh1aW50OF90IGYgPSBudW1fdG5zX2ZpbHRlcnM7IGYgPCAyOyBmKyspIHsKLSAgICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPCA4OyBrKyspIHsKLSAgICAgIHJjX2lbZiAqIDggKyBrXSA9IDg7Ci0gICAgICByY19xW2YgKiA4ICsga10gPSAwOwotICAgIH0KLSAgICByY19vcmRlcltmXSA9IDA7Ci0gIH0KLQotICAvLyBiaXQgYnVkZ2V0Ci0gIG5iaXRzX1ROUyA9IDA7Ci0gIGZvciAodWludDhfdCBmID0gMDsgZiA8IG51bV90bnNfZmlsdGVyczsgZisrKSB7Ci0gICAgdWludDMyX3QgbmJpdHNfVE5TX29yZGVyID0gMDsKLSAgICBpZiAocmNfb3JkZXJbZl0gPiAwKSB7Ci0gICAgICBuYml0c19UTlNfb3JkZXIgPSBhY190bnNfb3JkZXJfYml0c1t0bnNfbHBjX3dlaWdodGluZ11bcmNfb3JkZXJbZl0gLSAxXTsKLSAgICB9Ci0gICAgdWludDMyX3QgbmJpdHNfVE5TX2NvZWYgPSAwOwotICAgIGZvciAodWludDhfdCBrID0gMDsgayA8IHJjX29yZGVyW2ZdOyBrKyspIHsKLSAgICAgIG5iaXRzX1ROU19jb2VmICs9IGFjX3Ruc19jb2VmX2JpdHNba11bcmNfaVtmICogOCArIGtdXTsKLSAgICB9Ci0KLSAgICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgICBpZiAoZiA9PSAwKSB7Ci0gICAgICAgIGRhdGFwb2ludHMtPmxvZygibmJpdHNfVE5TX29yZGVyXzAiLCAmbmJpdHNfVE5TX29yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICAgIGRhdGFwb2ludHMtPmxvZygibmJpdHNfVE5TX2NvZWZfMCIsICZuYml0c19UTlNfY29lZiwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkYXRhcG9pbnRzLT5sb2coIm5iaXRzX1ROU19vcmRlcl8xIiwgJm5iaXRzX1ROU19vcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOwotICAgICAgICBkYXRhcG9pbnRzLT5sb2coIm5iaXRzX1ROU19jb2VmXzEiLCAmbmJpdHNfVE5TX2NvZWYsIHNpemVvZih1aW50MzJfdCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHVpbnQzMl90IG5iaXRzX1ROU19sb2NhbCA9IDIwNDggKyBuYml0c19UTlNfb3JkZXIgKyBuYml0c19UTlNfY29lZjsKLSAgICBuYml0c19UTlMgKz0KLSAgICAgICAgY2VpbChuYml0c19UTlNfbG9jYWwgLwotICAgICAgICAgICAgIDIwNDguMCk7ICAvLyB0aGlzIGNvZGUgaW50ZWdyYXRlcyBFcnJhdGEgMTUwMjggKHNlZSBkMS4wcjAzKQotICB9Ci0KLSAgLy8gMy4zLjguNCBGaWx0ZXJpbmcgIChkMDlyMDJfRjJGKQotICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbGMzQ29uZmlnLk5FOyBrKyspIHsKLSAgICBYX2Zba10gPSBYX3Nba107Ci0gIH0KLSAgZG91YmxlIHN0WzhdOwotICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPCA4OyBrKyspIHsKLSAgICBzdFtrXSA9IDA7Ci0gIH0KLSAgZm9yICh1aW50OF90IGYgPSAwOyBmIDwgbnVtX3Ruc19maWx0ZXJzOyBmKyspIHsKLSAgICBpZiAocmNfb3JkZXJbZl0gPiAwKSB7Ci0gICAgICBmb3IgKHVpbnQxNl90IG4gPSBzdGFydF9mcmVxW2ZdOyBuIDwgc3RvcF9mcmVxW2ZdOyBuKyspIHsKLSAgICAgICAgZG91YmxlIHQgPSBYX3Nbbl07Ci0gICAgICAgIGRvdWJsZSBzdF9zYXZlID0gdDsKLSAgICAgICAgZm9yICh1aW50OF90IGsgPSAwOyBrIDwgcmNfb3JkZXJbZl0gLSAxOyBrKyspIHsKLSAgICAgICAgICBkb3VibGUgc3RfdG1wID0gcmNfcVtmICogOCArIGtdICogdCArIHN0W2tdOwotICAgICAgICAgIHQgKz0gcmNfcVtmICogOCArIGtdICogc3Rba107Ci0gICAgICAgICAgc3Rba10gPSBzdF9zYXZlOwotICAgICAgICAgIHN0X3NhdmUgPSBzdF90bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdCArPSByY19xW2YgKiA4ICsgcmNfb3JkZXJbZl0gLSAxXSAqIHN0W3JjX29yZGVyW2ZdIC0gMV07Ci0gICAgICAgIHN0W3JjX29yZGVyW2ZdIC0gMV0gPSBzdF9zYXZlOwotICAgICAgICBYX2Zbbl0gPSB0OwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1pbnQ4X3QgVGVtcG9yYWxOb2lzZVNoYXBpbmc6Om5pbnQoZG91YmxlIHgpIHsKLSAgaWYgKHggPj0gMCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHggKyAwLjUpOwotICB9IGVsc2UgewotICAgIHJldHVybiAtc3RhdGljX2Nhc3Q8aW50OF90PigteCArIDAuNSk7Ci0gIH0KLX0KLQotdm9pZCBUZW1wb3JhbE5vaXNlU2hhcGluZzo6cmVnaXN0ZXJEYXRhcG9pbnRzKERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50c18pIHsKLSAgZGF0YXBvaW50cyA9IGRhdGFwb2ludHNfOwotICBpZiAobnVsbHB0ciAhPSBkYXRhcG9pbnRzKSB7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJYX2YiLCAmWF9mWzBdLCBzaXplb2YoZG91YmxlKSAqIGxjM0NvbmZpZy5ORSk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJudW1fdG5zX2ZpbHRlcnMiLCAmbnVtX3Ruc19maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtX3Ruc19maWx0ZXJzKSk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJyY19vcmRlciIsICZyY19vcmRlclswXSwgc2l6ZW9mKHVpbnQ4X3QpICogMik7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJyY19pXzEiLCAmcmNfaVswXSwgc2l6ZW9mKHVpbnQ4X3QpICogOCk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJyY19pXzIiLCAmcmNfaVs4XSwgc2l6ZW9mKHVpbnQ4X3QpICogOCk7Ci0gICAgZGF0YXBvaW50cy0+YWRkRGF0YXBvaW50KCJyY19xXzEiLCAmcmNfcVswXSwgc2l6ZW9mKGRvdWJsZSkgKiA4KTsKLSAgICBkYXRhcG9pbnRzLT5hZGREYXRhcG9pbnQoInJjX3FfMiIsICZyY19xWzhdLCBzaXplb2YoZG91YmxlKSAqIDgpOwotICAgIGRhdGFwb2ludHMtPmFkZERhdGFwb2ludCgibmJpdHNfVE5TIiwgJm5iaXRzX1ROUywgc2l6ZW9mKG5iaXRzX1ROUykpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvRW5jb2Rlci9UZW1wb3JhbE5vaXNlU2hhcGluZy5ocHAgYi9lbWJkcnYvbGMzL0VuY29kZXIvVGVtcG9yYWxOb2lzZVNoYXBpbmcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWE3NjExLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvRW5jb2Rlci9UZW1wb3JhbE5vaXNlU2hhcGluZy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogVGVtcG9yYWxOb2lzZVNoYXBpbmcuaHBwCi0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVEVNUE9SQUxfTk9JU0VfU0hBUElOR19IXwotI2RlZmluZSBURU1QT1JBTF9OT0lTRV9TSEFQSU5HX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiRGF0YXBvaW50cy5ocHAiCi0jaW5jbHVkZSAiTGMzQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIExjM0VuYyB7Ci0KLWNsYXNzIFRlbXBvcmFsTm9pc2VTaGFwaW5nIHsKLSBwdWJsaWM6Ci0gIFRlbXBvcmFsTm9pc2VTaGFwaW5nKGNvbnN0IExjM0NvbmZpZyYgbGMzQ29uZmlnXyk7Ci0gIHZpcnR1YWwgflRlbXBvcmFsTm9pc2VTaGFwaW5nKCk7Ci0KLSAgdm9pZCByZWdpc3RlckRhdGFwb2ludHMoRGF0YXBvaW50Q29udGFpbmVyKiBkYXRhcG9pbnRzXyk7Ci0KLSAgdm9pZCBydW4oY29uc3QgZG91YmxlKiBjb25zdCBYX1MsIHVpbnQ4X3QgUF9CVywgdWludDE2X3QgbmJpdHMsCi0gICAgICAgICAgIHVpbnQ4X3QgbmVhcl9ueXF1aXN0X2ZsYWcpOwotCi0gIHN0YXRpYyBpbnQ4X3QgbmludChkb3VibGUgeCk7Ci0KLSAgY29uc3QgTGMzQ29uZmlnJiBsYzNDb25maWc7Ci0KLSAgdWludDE2X3QgbmJpdHNfVE5TOwotICBkb3VibGUqIFhfZjsKLSAgdWludDhfdCB0bnNfbHBjX3dlaWdodGluZzsKLSAgdWludDhfdCBudW1fdG5zX2ZpbHRlcnM7Ci0gIHVpbnQ4X3QgcmNfb3JkZXJbMl07Ci0gIHVpbnQ4X3QgcmNfaVsyICogOF07Ci0KLSBwcml2YXRlOgotICBkb3VibGUgcmNfcVsyICogOF07Ci0gIERhdGFwb2ludENvbnRhaW5lciogZGF0YXBvaW50czsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBMYzNFbmMKLQotI2VuZGlmICAvLyBURU1QT1JBTF9OT0lTRV9TSEFQSU5HX0hfCmRpZmYgLS1naXQgYS9lbWJkcnYvbGMzL1JlYWRtZS50eHQgYi9lbWJkcnYvbGMzL1JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OWQ5YmIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9SZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBSZWFkbWUudHh0Ci0gKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotQ29udGVudHMKLT09PT09PT09Ci0gKDEpIEludHJvZHVjdGlvbgotICgyKSBEaXJlY3RvcnkgU3RydWN0dXJlCi0gKDMpIE5hbWluZyBDb252ZW50aW9ucwotICg0KSBHZW5lcmFsIENvZGUgU3RydWN0dXJlCi0gKDUpIFRlc3QgYW5kIERlYnVnIFN1cHBvcnQKLQotKDEpIEludHJvZHVjdGlvbgotPT09PT09PT09PT09PT09PQotKGRlcml2ZWQgZnJvbSBCbHVldG9vdGggU0lHIExDMyBzcGVjaWZpY2F0aW9uIGRyMDlyMDYpCi1UaGUgTG93IENvbXBsZXhpdHkgQ29tbXVuaWNhdGlvbiBDb2RlYyAoTEMzKSBpcyBhbiBlZmZpY2llbnQgQmx1ZXRvb3RoIEF1ZGlvIENvZGVjIGZvciB1c2UgaW4KLWF1ZGlvIHByb2ZpbGVzLiBUaGlzIGNvZGVjIGNhbiBlbmNvZGUgc3BlZWNoIGFuZCBtdXNpYyBhdCBhIHZhcmlldHkgb2YgYml0cmF0ZXMuIFRoZSBMQzMgY2FuCi1iZSBpbmNvcnBvcmF0ZWQgaW4gYW55IEJsdWV0b290aCBhdWRpbyBwcm9maWxlLgotCi1UaGUgTEMzIHNwZWNpZmljYXRpb24gYWxsb3dzIGZsb2F0aW5nIHBvaW50IGFuZCBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbnMgYXMgbG9uZyBhcyB0aGUKLXJlc3VsdGluZyBkZWNvZGVkIGF1ZGlvIHNpZ25hbHMgYXJlIHN1ZmZpY2llbnRseSBjbG9zZSBpbiBxdWFsaXR5LiBUaGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24KLWV4cGxvaXRzIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbiBpbiB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvZGUuCi0KLVRvIGRlbGl2ZXIgc2F0aXNmYWN0b3J5IGF1ZGlvIHF1YWxpdHkgdW5kZXIgYWxsIGNoYW5uZWwgY29uZGl0aW9ucywgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKLXRoYXQgc29tZSBmb3JtIG9mIFBhY2tldCBMb3NzIENvbmNlYWxtZW50IChQTEMpIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBvbiB0aGUgcmVjZWl2aW5nIGVuZHMgb2YKLWF1ZGlvIGNvbm5lY3Rpb25zLiBUaGUgcHVycG9zZSBvZiBwYWNrZXQgbG9zcyBjb25jZWFsbWVudCBpcyB0byBjb25jZWFsIHRoZSBlZmZlY3Qgb2YgdW5hdmFpbGFibGUKLW9yIGNvcnJ1cHRlZCBmcmFtZSBkYXRhIGZvciBkZWNvZGluZy4gVGhlIGdpdmVuIGNvZGUgaW1wbGVtZW50cyB0aGUgZXhhbXBsZSBQTEMgYWxnb3JpdGhtIHByb3ZpZGVkCi1pbiB0aGUgaW5mb3JtYXRpdmUgQXBwZW5kaXggQiBvZiB0aGUgTEMzIHNwZWNpZmljYXRpb24uIEFsdGVybmF0aXZlIFBMQyBzY2hlbWVzIGFyZSBwb3NzaWJsZSwgYnV0IGhhdmUKLXRvIG1lZXQgb3IgZXhjZWVkIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24uCi0KLVRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY29kZWMgaGFzIGJlZW4gbWFkZSBpbiB5ZWFyIDIwMTkgaW4gcGFyYWxsZWwgdG8gZmluYWwKLWltcHJvdmVtZW50cyBhbmQgZXh0ZW5zaW9ucyB0byB0aGUgTEMzIHNwZWNpZmljYXRpb24uIFRoZSBmaW5hbCBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBtYXRjaGVkCi10byB0aGUgc3BlY2lmaWNhdGlvbiwgaG93ZXZlciwgcmVmZXJlbmNlcyBpbiB0aGUgY29kZSB0byB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgbm90IGFkYXB0ZWQgdG8KLXRoZSBsYXRlc3QgZm9ybWFsIGNoYW5nZXMgaW4gdGhlIHNwZWNpZmljYXRpb24uIFRodXMsIHRoZSByZXZpc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiByZWZlcmVuY2VkCi1pcyBnaXZlbiB3aXRoIGVhY2ggcmVmZXJlbmNlLCBzbyB0aGF0IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB0cmFjayB0aGUgbGlua3MgdG8gdGhlIHNwZWNpZmljYXRpb24uCi0KLSgyKSBEaXJlY3RvcnkgU3RydWN0dXJlCi09PT09PT09PT09PT09PT09PT09PT09PQotICB8LSBBcGkgIC0+IGluY2x1ZGUgZmlsZXMgbmVlZGVkIGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gY29kZQotICB8LSBDb21tb24gfCAtPiBpbXBsZW1lbnRhdGlvbiBuZWVkZWQgYnkgTEMzIGVuY29kZXIgYW5kIGRlY29kZXIKLSAgfCAgICAgICAgIHwtLSBLaXNzRmZ0IC0+IHNvdXJjZSBjb2RlIG9mIGtpc3NmZnQgbGlicmFyeSB1c2VkIGZvciBmYXN0IHRyYW5zZm9ybXMKLSAgfCAgICAgICAgIHwtLSBUYWJsZXMgLT4gdGFibGVzIGFzIGdpdmVuIGluIFNlY3Rpb24gMy43ICJUYWJsZXMgYW5kIGNvbnN0YW50cyIgKGRyMDlyMDYpCi0gIHwtIERlY29kZXIgLT4gaW1wbGVtZW50YXRpb24gb2YgTEMzIGRlY29kZXIgKCouaHBwIGFuZCAqLmNwcCkKLSAgfC0gRW5jb2RlciAtPiBpbXBsZW1lbnRhdGlvbiBvZiBMQzMgZW5jb2RlciAoKi5ocHAgYW5kICouY3BwKQotICB8LSBUZXN0U3VwcG9ydCAtPiBpbnRlcmZhY2UgYW5kIGR1bW15L2RlbW8gaW1wbGVtZW50YXRpb24gb2YgImRhdGFwb2ludCIgYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgIGZvciB0ZXN0IGFuZCBkZWJ1ZyBzdXBwb3J0Ci0KLSgzKSBOYW1pbmcgQ29udmVudGlvbnMgYW5kIENvZGluZyBTdHlsZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gTmFtZXMgb2YgdmFyaWFibGVzL29iamVjdHMgaGF2ZSBiZWVuIGNob3NlbiB0byBiZSBhcyBjbG9zZSBhcyBwb3NzaWJsZQotdG8gdGhlIG5hbWluZyB3aXRoaW4gdGhlIExDMyBzcGVjaWZpY2F0aW9uLiBUaGlzIGFwcGxpZXMgbm90IG9ubHkgdG8gdGhlCi1zZWxlY3RlZCB3b3JkaW5nLCBidXQgYWxzbyB0byB0aGUgY2hvc2VuIGNhc2UgYW5kIGNvbmNhdGVuYXRpb24gb2Ygd29yZHMuCi0gVGh1cywgdmFyaWFibGUgbmFtaW5nIG1heSBhcHBlYXIgc29tZXdoYXQgdW5vcnRob2RveCB0byBhIHN0YW5kYXJkIEMvQysrIGRldmVsb3BlcgotYW5kIGlzIG5vdCBhbHdheXMgY29uc2lzdGVudCBpbiBzdHlsZS4gTmV2ZXJ0aGVsZXNzLCB0aGUgY2xvc2UgbGluayB0byB0aGUgc3BlY2lmaWNhdGlvbgotZG9jdW1lbnQgaXMgY29uc2lkZXJlZCBtb3N0IHZhbHVhYmxlIHNvIHRoYXQgdGhpcyBhcHByb2FjaCBoYXMgYmVlbiBmb2xsb3dlZC4KLSBUaGUgTEMzIHNwZWNpZmljYXRpb24gY29udGFpbnMgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGVxdWF0aW9ucywgcHNldWRvLWNvZGUsIHRhYmxlcwotYW5kIHJlZmVyZW5jZSBpbnRlcm1lZGlhdGUgb3V0cHV0cy4gVGhlIG5hbWluZyBvZiB2YXJpYWJsZXMgaXMgbm90IHBlcmZlY3RseSBjb25zaXN0ZW50LAotcGFydGljdWxhcmx5IGluIHRoZSBjYXNlIG9mIG5hbWVzIGZvciBpbnRlcm1lZGlhdGUgb3V0cHV0cyBpbiByZWxhdGlvbiB0byB0aGUKLXNwZWNpZmljYXRpb24gdGV4dC4gVGh1cywgdGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgd2UgaGFkIHRvIHNlbGVjdCBvbmUgbmFtZSBvdXQgb2YKLWRpZmZlcmVudCBvcHRpb25zIG9yIGhhZCB0byBjaG9vc2UgZGlmZmVyZW50IG5hbWVzIGZvciBpbnRlcm5hbCB2YXJpYWJsZXMgYW5kCi0iZGF0YXBvaW50cyIgcHJvdmlkZWQgZm9yIHRlc3QgYW5kIGRlYnVnIHN1cHBvcnQuCi0KLSBTb21lIHBhcnRzIG9mIHRoZSBjb2RlIGFyZSBkaXJlY3RseSBjb252ZXJ0ZWQgZnJvbSBwc2V1ZG8tY29kZSBnaXZlbiBpbgotdGhlIHNwZWNpZmljYXRpb24gZG9jdW1lbnQuIENoYW5nZXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmljYXRpb24gYXJlIG1hZGUgb25seQotd2hlbiBzdXBwb3J0ZWQgYnkgdGVjaG5pY2FsIGFyZ3VtZW50cy4gQWdhaW4sIHRoZSBjbG9zZSBsaW5rIHRvIHRoZSBzcGVjaWZpY2F0aW9uCi1pcyBjb25zaWRlcmVkIG1vc3QgdmFsdWFibGUuIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgaW4gc29tZSBzaXR1YXRpb25zIHRoYXQgY29kZQotaXMgbm90IG9wdGltaXplZCBpbiB0ZXJtcyBvZiBjb21wdXRhdGlvbiBlZmZvcnQsIG1lbW9yeSB1c2FnZSBhbmQvb3IgY2xhcml0eSBvZiBpdHMgc3RydWN0dXJlLgotCi1GdXJ0aGVyIENvbnZlbnRpb25zOgotIC0gaW5kZW50YXRpb24gdXNpbmcgNCBzcGFjZXM7IG5vIFRBQlMgYXQgYWxsCi0gLSBkaXJlY3RvcnksIGZpbGUgYW5kIGNsYXNzIG5hbWVzIGFyZSBjYW1lbC1jYXNlIHN0YXJ0aW5nIHdpdGggYSBjYXBpdGFsIGxldHRlcgotCi0KLSg0KSBHZW5lcmFsIENvZGUgU3RydWN0dXJlCi09PT09PT09PT09PT09PT09PT09PT09PT09PQotIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBDKysgd2hlcmUgb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIGlzIG1haW5seSB1c2VkIHRvCi0gZm9ybXVsYXRlIHRoZSByZWxhdGlvbnMgb2YgaGlnaGVyIGxldmVsIG1vZHVsZXMvY2xhc3Nlcy4gVGhlIGNvZGUgb2YgdGhlIGxvd2VyIGxldmVsCi0gbW9kdWxlcyBpcyBzeW50YWN0aWNhbGx5IEMrKywgYnV0IHRoZSBzdHlsZSBpcyBtb3JlIGxpa2UgcGxhaW4gb2xkIHByb2NlZHVyYWwKLSBwcm9ncmFtbWluZy4gVGhlIGxhdHRlciBpcyBtYWlubHkgZHVlIHRvIHRoZSBnb2FsIG9mIGZvcm11bGF0aW5nIHRoZSBjb2RlIHZlcnkgY2xvc2UKLSB0byB0aGUgc3BlY2lmaWNhdGlvbiAtIG5vdCBvbmx5IHdpdGggcmVzcGVjdCB0byBpdHMgb3ZlcmFsbCBiZWhhdmlvdXIgYnV0IGFsc28gd2l0aAotIHJlc3BlY3QgdG8gdGhlIG9yZ2FuaXphdGlvbi4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdHJ1ZSBmb3IgdGhlIG1vZHVsZXMgZGVwZW5kaW5nCi0gaGVhdmlseSBvbiBjb252ZXJ0ZWQgcHNldWRvLWNvZGUgZnJvbSB0aGUgTEMzIHNwZWNpZmljYXRpb24uCi0KLSBBIGJyaWVmIG92ZXJ2aWV3IG9uIHRoZSBtYWluIGNsYXNzIHJlbGF0aW9uc2hpcHMgaXMgc3VtbWFyaXplZCBpbiB0aGUgZm9sbG93aW5nCi0gYmFzaWMgZGlhZ3JhbXMuCi0KLSBFbmNvZGVyOgotIC0tLS0tLS0tCi0gTGMzRW5jb2RlciA6IG1haW4gQVBJIGFuZCBoYW5kbGluZyBvZiBtdWx0aS1jaGFubmVsIHNlc3Npb25zCi0gICB8ICAgIHwoMSktLS0tLS0oMSkgTGMzQ29uZmlnIDogY29uZmlndXJhdGlvbiBpbnN0YW5jZQotICAgfAotICAgfCgxKS0tLS0tLS0obGMzQ29uZmlnLk5jKSBFbmNvZGVyVG9wIDogdG9wbGV2ZWwgY2xhc3MgZm9yIHNpbmdsZSBjaGFubmVsIHNlc3Npb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICBkeW5hbWljYWxseSByZWFsbG9jYXRlcyBFbmNvZGVyRnJhbWUgaW5zdGFuY2UgaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgb2YgYml0cmF0ZSBjaGFuZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8LS0tICBob2xkcyBhbGwgc3ViLW1vZHVsZXMgZGlyZWN0bHkgdGhhdCBhcmUgbm90IGRlcGVuZGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgb24gdmFyaWFibGUgYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KDEpLS0tLS0oMSkgRW5jb2RlckZyYW1lIDogdG9wbGV2ZWwgcHJvY2Vzc2luZyBwZXIgZnJhbWUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbG9jYXRpb24gb2Ygc3ViLW1vZHVsZXMgaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYml0cmF0ZSBjaGFuZ2VzCi0KLSBEZWNvZGVyOgotIC0tLS0tLS0tCi0gTGMzRGVjb2RlciA6IG1haW4gQVBJIGFuZCBoYW5kbGluZyBvZiBtdWx0aS1jaGFubmVsIHNlc3Npb25zCi0gICB8ICAgIHwoMSktLS0tLS0oMSkgTGMzQ29uZmlnIDogY29uZmlndXJhdGlvbiBpbnN0YW5jZQotICAgfAotICAgfCgxKS0tLS0tLS0obGMzQ29uZmlnLk5jKSBEZWNvZGVyVG9wIDogdG9wbGV2ZWwgY2xhc3MgZm9yIHNpbmdsZSBjaGFubmVsIHNlc3Npb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICBkeW5hbWljYWxseSByZWFsbG9jYXRlcyBEZWNvZGVyRnJhbWUgaW5zdGFuY2UgaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgb2YgYml0cmF0ZSBjaGFuZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8LS0tICBob2xkcyBhbGwgc3ViLW1vZHVsZXMgZGlyZWN0bHkgdGhhdCBhcmUgbm90IGRlcGVuZGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgb24gdmFyaWFibGUgYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KDEpLS0tLS0oMSkgRGVjb2RlckZyYW1lIDogdG9wbGV2ZWwgcHJvY2Vzc2luZyBwZXIgZnJhbWUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbG9jYXRpb24gb2Ygc3ViLW1vZHVsZXMgaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYml0cmF0ZSBjaGFuZ2VzCi0KLQotKDUpIFRlc3QgYW5kIERlYnVnIFN1cHBvcnQKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGNvZGVjIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIHN0cm9uZ2x5IGJhc2VkIG9uIGNsb3NlIG1hdGNoIG9mCi1pbnRlcm1lZGlhdGUgdmFsdWVzIHdpdGggc3BlY2lmaWVkIHJlZmVyZW5jZSB2YWx1ZXMuIFRvIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBwcm9wZXIKLXZhbHVlcyBpbiBhIHN0YW5kYXJkaXplZCBtYW5uZXIgYSBzaW1wbGUgImRhdGFwb2ludCIgQVBJIGhhcyBiZWVuIGNyZWF0ZWQuCi0gTm90ZTogdGhpcyBBUEkgaXMgbm90IGZ1bGx5IG9wdGltaXplZCBmb3IgdXNhZ2Ugd2l0aGluIGluIGFuZHJvaWQgYnV0IG1heSBiZSBleHRlbmRlZAotZm9yIHRoaXMgcHVycG9zZSBpbiBmdXR1cmUuCi0gVGhlIGdpdmVuIEFQSSBjYW4gYmUgZm91bmQgaW4gIlRlc3RTdXBwb3J0L0RhdGFwb2ludHMuaHBwIiB3aXRoIGEgYmFzaWMgKG1haW5seSBkdW1teSkgaW1wbGVtZW50YXRpb24KLWdpdmVuIGluICJUZXN0U3VwcG9ydC9EYXRhcG9pbnRzQW5kcm9pZC5jcHAiLgotIFRvIHVzZSB0aGlzIEFQSSBhbiBpbnN0YW5jZSBvZiAiRGF0YXBvaW50Q29udGFpbmVyIiBoYXMgdG8gYmUgY3JlYXRlZCBhbmQgcHJvdmlkZWQgdG8gdGhlCi1MYzNFbmNvZGVyIGFuZCBMYzNEZWNvZGVyIGNvbnN0cnVjdG9ycyB3aGVuIG5lZWRlZC4gTm90ZTogdGhhdCB0aGlzIGlzIG5vdCBpbnRlbmRlZCBmb3IgZmluYWwgcmVsZWFzZXMKLWR1ZSB0byB0aGUgYWRkaXRpb25hbCByZXNvdXJjZXMgbmVlZGVkLgpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9UZXN0U3VwcG9ydC9EYXRhcG9pbnRzLmhwcCBiL2VtYmRydi9sYzMvVGVzdFN1cHBvcnQvRGF0YXBvaW50cy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTdjOTYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9UZXN0U3VwcG9ydC9EYXRhcG9pbnRzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBEYXRhcG9pbnRzLmhwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fREFUQVBPSU5UU19IUFBfCi0jZGVmaW5lIF9fREFUQVBPSU5UU19IUFBfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1jbGFzcyBEYXRhcG9pbnQ7Ci1jbGFzcyBDb250YWluZXJSZWFsaXphdGlvbjsKLQotY2xhc3MgRGF0YXBvaW50Q29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIERhdGFwb2ludENvbnRhaW5lcigpOwotICB2aXJ0dWFsIH5EYXRhcG9pbnRDb250YWluZXIoKTsKLQotICB2b2lkIGFkZERhdGFwb2ludChjb25zdCBjaGFyKiBsYWJlbCwgdm9pZCogcERhdGEsIHVpbnQxNl90IHNpemVJbkJ5dGVzKTsKLSAgdm9pZCBhZGREYXRhcG9pbnQoY29uc3QgY2hhciogbGFiZWwsIGNvbnN0IHZvaWQqIHBEYXRhLCB1aW50MTZfdCBzaXplSW5CeXRlcyk7Ci0gIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGxhYmVsLCBjb25zdCB2b2lkKiBwRGF0YSwgdWludDE2X3Qgc2l6ZUluQnl0ZXMpOwotCi0gIHVpbnQxNl90IGdldERhdGFwb2ludFNpemUoY29uc3QgY2hhciogbGFiZWwpOwotICBib29sIGdldERhdGFwb2ludFZhbHVlKGNvbnN0IGNoYXIqIGxhYmVsLCB2b2lkKiBwRGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBidWZmZXJTaXplKTsKLSAgYm9vbCBzZXREYXRhcG9pbnRWYWx1ZShjb25zdCBjaGFyKiBsYWJlbCwgY29uc3Qgdm9pZCogcERhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnVmZmVyU2l6ZSk7Ci0KLSBwcml2YXRlOgotICB2b2lkIGFkZERhdGFwb2ludChjb25zdCBjaGFyKiBsYWJlbCwgRGF0YXBvaW50KiBwRGF0YXBvaW50KTsKLSAgQ29udGFpbmVyUmVhbGl6YXRpb24qIG1fcENvbnRhaW5lcjsKLX07Ci0KLSNlbmRpZiAgLy8gX19EQVRBUE9JTlRTX0hQUF8KZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvVGVzdFN1cHBvcnQvRGF0YXBvaW50c0FuZHJvaWQuY3BwIGIvZW1iZHJ2L2xjMy9UZXN0U3VwcG9ydC9EYXRhcG9pbnRzQW5kcm9pZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYWE5NjIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L2xjMy9UZXN0U3VwcG9ydC9EYXRhcG9pbnRzQW5kcm9pZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogRGF0YXBvaW50c0R1bW15LmNwcAotICoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0KLSAqIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJEYXRhcG9pbnRzLmhwcCIKLQotY2xhc3MgQ29udGFpbmVyUmVhbGl6YXRpb24ge307Ci0KLURhdGFwb2ludENvbnRhaW5lcjo6RGF0YXBvaW50Q29udGFpbmVyKCkgOiBtX3BDb250YWluZXIobnVsbHB0cikgewotICAvLyBub3RoaW5nIHN0b3JlZCB5ZXQ7IHdlIG1heSBpbnRlZ3JhdGUgYSBjb21wbGV0ZSBkYXRhcG9pbnQgY29udGFpbmVyIHdoZW4KLSAgLy8gbW9yZSBkZWJ1Z2dpbmcgaXMgbmVlZGVkIGluIHRoZSBhbmRyb2lkIGNvbnRleHQKLSAgKHZvaWQpbV9wQ29udGFpbmVyOwotfQotCi1EYXRhcG9pbnRDb250YWluZXI6On5EYXRhcG9pbnRDb250YWluZXIoKSB7fQotCi12b2lkIERhdGFwb2ludENvbnRhaW5lcjo6YWRkRGF0YXBvaW50KGNvbnN0IGNoYXIqIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhcG9pbnQqIHBEYXRhcG9pbnQpIHt9Ci0KLXZvaWQgRGF0YXBvaW50Q29udGFpbmVyOjphZGREYXRhcG9pbnQoY29uc3QgY2hhciogbGFiZWwsIHZvaWQqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXplSW5CeXRlcykge30KLQotdm9pZCBEYXRhcG9pbnRDb250YWluZXI6OmFkZERhdGFwb2ludChjb25zdCBjaGFyKiBsYWJlbCwgY29uc3Qgdm9pZCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNpemVJbkJ5dGVzKSB7fQotCi12b2lkIERhdGFwb2ludENvbnRhaW5lcjo6bG9nKGNvbnN0IGNoYXIqIGxhYmVsLCBjb25zdCB2b2lkKiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2l6ZUluQnl0ZXMpIHsKLSAgLy8gTm90ZTogdGhpcyBpcyBqdXN0IGEgZmlyc3Qgc2ltcGxlIHN0ZXAgdG8gZGVtb25zdHJhdGUgdGhlIHBvc3NpYmlsaXRpZXMgd2UKLSAgLy8gaGF2ZS4KLSAgLy8gICBJbiB0aGlzIGNhc2UgdGhlIGRhdGFwb2ludCBsYWJlbCBpdHMgc2l6ZSBpbiBieXRlcyBhbmQgaXRzIGNvbnRlbnQgYXMKLSAgLy8gICBoZXgtYnl0ZS1zdHJlYW0gaXMgc2VuZCB0byB0aGUgYW5kcm9pZCBMT0cuCi0gIGNvbnN0IHVpbnQ4X3QqIHBCeXRlRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBEYXRhKTsKLSAgc3RkOjpzdHJpbmcgdmFsdWVBc0hleFN0cmluZygiMHgiKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHZTdHJlYW07Ci0gIHZTdHJlYW0gPDwgIjB4IjsKLSAgZm9yICh1aW50MTZfdCBieXRlTnIgPSAwOyBieXRlTnIgPCBzaXplSW5CeXRlczsgYnl0ZU5yKyspIHsKLSAgICB2U3RyZWFtIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4Ci0gICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KHBCeXRlRGF0YVtieXRlTnJdKTsKLSAgfQotICAvLyBUT0RPOiB1bmNvbW1lbnQgZm9yIHRlc3RpbmcKLSAgLy8gIExPRyhJTkZPKSA8PCBsYWJlbCA8PCAiWyIgPDwgc2l6ZUluQnl0ZXMgPDwgIl06IiA8PCB2U3RyZWFtLnN0cigpOwotfQotCi11aW50MTZfdCBEYXRhcG9pbnRDb250YWluZXI6OmdldERhdGFwb2ludFNpemUoY29uc3QgY2hhciogbGFiZWwpIHsgcmV0dXJuIDA7IH0KLQotYm9vbCBEYXRhcG9pbnRDb250YWluZXI6OmdldERhdGFwb2ludFZhbHVlKGNvbnN0IGNoYXIqIGxhYmVsLCB2b2lkKiBwRGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBidWZmZXJTaXplKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBEYXRhcG9pbnRDb250YWluZXI6OnNldERhdGFwb2ludFZhbHVlKGNvbnN0IGNoYXIqIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBEYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJ1ZmZlclNpemUpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L2xjMy9mdXp6ZXIvbGlibGMzY29kZWNfZGVjb2Rlcl9mdXp6ZXIuY3BwIGIvZW1iZHJ2L2xjMy9mdXp6ZXIvbGlibGMzY29kZWNfZGVjb2Rlcl9mdXp6ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDUzZTZlLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9sYzMvZnV6emVyL2xpYmxjM2NvZGVjX2RlY29kZXJfZnV6emVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLQotI2luY2x1ZGUgIi4uL0FwaS9MYzNEZWNvZGVyLmhwcCIKLQotdXNpbmcgRnJhbWVEdXJhdGlvbiA9IExjM0NvbmZpZzo6RnJhbWVEdXJhdGlvbjsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwKGRhdGEsIHNpemUpOwotCi0gIHVpbnQxNl90IGZzID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoezgwMDAsIDE2MDAwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMH0pOwotICBGcmFtZUR1cmF0aW9uIGZkID0KLSAgICAgIGZkcC5QaWNrVmFsdWVJbkFycmF5KHtGcmFtZUR1cmF0aW9uOjpkMTBtcywgRnJhbWVEdXJhdGlvbjo6ZDdwNW1zfSk7Ci0gIHVpbnQ4X3QgYmZpID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2UoMCwgMSk7Ci0gIHVpbnQ4X3QgYmVjX2RldGVjdCA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDEpOwotCi0gIHVpbnQxNl90IGlucHV0X2J5dGVfY291bnQgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZSgyMCwgNDAwKTsKLQotICBpZiAoZmRwLnJlbWFpbmluZ19ieXRlcygpIDwgaW5wdXRfYnl0ZV9jb3VudCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZW5jb2RlZF9ieXRlcyhpbnB1dF9ieXRlX2NvdW50KTsKLQotICBmZHAuQ29uc3VtZURhdGEoZW5jb2RlZF9ieXRlcy5kYXRhKCksIGVuY29kZWRfYnl0ZXMuc2l6ZSgpKTsKLQotICB1aW50MTZfdCBvdXRwdXRfZnJhbWVfY291bnQgPSBMYzNDb25maWcoZnMsIGZkLCAxKS5ORjsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGRlY29kZWRfZGF0YShvdXRwdXRfZnJhbWVfY291bnQgKiAyKTsKLQotICBMYzNEZWNvZGVyIGRlY29kZXIoZnMsIGZkKTsKLSAgZGVjb2Rlci5ydW4oZW5jb2RlZF9ieXRlcy5kYXRhKCksIGVuY29kZWRfYnl0ZXMuc2l6ZSgpLCBiZmksCi0gICAgICAgICAgICAgIChpbnQxNl90KilkZWNvZGVkX2RhdGEuZGF0YSgpLCBvdXRwdXRfZnJhbWVfY291bnQsIGJlY19kZXRlY3QsIDApOwotCi0gIHJldHVybiAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VtYmRydi9sYzMvZnV6emVyL2xpYmxjM2NvZGVjX2VuY29kZXJfZnV6emVyLmNwcCBiL2VtYmRydi9sYzMvZnV6emVyL2xpYmxjM2NvZGVjX2VuY29kZXJfZnV6emVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwMTRmNy4uMDAwMDAwMAotLS0gYS9lbWJkcnYvbGMzL2Z1enplci9saWJsYzNjb2RlY19lbmNvZGVyX2Z1enplci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0KLSNpbmNsdWRlICIuLi9BcGkvTGMzRW5jb2Rlci5ocHAiCi0KLXVzaW5nIEZyYW1lRHVyYXRpb24gPSBMYzNDb25maWc6OkZyYW1lRHVyYXRpb247Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKLQotICB1aW50MTZfdCBmcyA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KHs4MDAwLCAxNjAwMCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDB9KTsKLSAgRnJhbWVEdXJhdGlvbiBmZCA9Ci0gICAgICBmZHAuUGlja1ZhbHVlSW5BcnJheSh7RnJhbWVEdXJhdGlvbjo6ZDEwbXMsIEZyYW1lRHVyYXRpb246OmQ3cDVtc30pOwotICB1aW50MTZfdCBvdXRwdXRfYnl0ZV9jb3VudCA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDIwLCA0MDApOwotCi0gIExjM0NvbmZpZyBjb25maWcoZnMsIGZkLCAxKTsKLSAgaWYgKGNvbmZpZy5nZXRFcnJvclN0YXR1cygpICE9IExjM0NvbmZpZzo6RVJST1JfRlJFRSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWludDE2X3QgbnVtX2ZyYW1lcyA9IGNvbmZpZy5ORiAqIGNvbmZpZy5OYzsKLQotICBpZiAoZmRwLnJlbWFpbmluZ19ieXRlcygpIDwgbnVtX2ZyYW1lcyAqIDIpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBpbnB1dF9mcmFtZXMobnVtX2ZyYW1lcyk7Ci0KLSAgZmRwLkNvbnN1bWVEYXRhKGlucHV0X2ZyYW1lcy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICBpbnB1dF9mcmFtZXMuc2l6ZSgpICogMiAvKiBlYWNoIGZyYW1lIGlzIDIgYnl0ZXMgKi8pOwotCi0gIExjM0VuY29kZXIgZW5jb2Rlcihjb25maWcpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dHB1dChvdXRwdXRfYnl0ZV9jb3VudCk7Ci0gIGVuY29kZXIucnVuKChjb25zdCBpbnQxNl90KilpbnB1dF9mcmFtZXMuZGF0YSgpLCBvdXRwdXRfYnl0ZV9jb3VudCwKLSAgICAgICAgICAgICAgb3V0cHV0LmRhdGEoKSk7Ci0gIHJldHVybiAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvQW5kcm9pZC5icCBiL2VtYmRydi9zYmMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiZjQ0My4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1zdWJkaXJzID0gWwotICAgICJkZWNvZGVyIiwKLSAgICAiZW5jb2RlciIsCi1dCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL0JVSUxELmduIGIvZW1iZHJ2L3NiYy9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4NTI0NS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXNvdXJjZV9zZXQoInNiY19kZWNvZGVyIikgewotICBzb3VyY2VzID0gWwotICAgICJkZWNvZGVyL3NyY2UvYWxsb2MuYyIsCi0gICAgImRlY29kZXIvc3JjZS9iaXRhbGxvYy5jIiwKLSAgICAiZGVjb2Rlci9zcmNlL2JpdGFsbG9jLXNiYy5jIiwKLSAgICAiZGVjb2Rlci9zcmNlL2JpdHN0cmVhbS1kZWNvZGUuYyIsCi0gICAgImRlY29kZXIvc3JjZS9kZWNvZGVyLW9pbmEuYyIsCi0gICAgImRlY29kZXIvc3JjZS9kZWNvZGVyLXByaXZhdGUuYyIsCi0gICAgImRlY29kZXIvc3JjZS9kZWNvZGVyLXNiYy5jIiwKLSAgICAiZGVjb2Rlci9zcmNlL2RlcXVhbnQuYyIsCi0gICAgImRlY29kZXIvc3JjZS9mcmFtaW5nLmMiLAotICAgICJkZWNvZGVyL3NyY2UvZnJhbWluZy1zYmMuYyIsCi0gICAgImRlY29kZXIvc3JjZS9vaV9jb2RlY192ZXJzaW9uLmMiLAotICAgICJkZWNvZGVyL3NyY2Uvc3ludGhlc2lzLTgtZ2VuZXJhdGVkLmMiLAotICAgICJkZWNvZGVyL3NyY2Uvc3ludGhlc2lzLWRjdDguYyIsCi0gICAgImRlY29kZXIvc3JjZS9zeW50aGVzaXMtc2JjLmMiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWyAiZGVjb2Rlci9pbmNsdWRlIiBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0OnRhcmdldF9kZWZhdWx0cyIgXQotfQotCi1zb3VyY2Vfc2V0KCJzYmNfZW5jb2RlciIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiZW5jb2Rlci9zcmNlL3NiY19hbmFseXNpcy5jIiwKLSAgICAiZW5jb2Rlci9zcmNlL3NiY19kY3QuYyIsCi0gICAgImVuY29kZXIvc3JjZS9zYmNfZGN0X2NvZWZmcy5jIiwKLSAgICAiZW5jb2Rlci9zcmNlL3NiY19lbmNfYml0X2FsbG9jX21vbm8uYyIsCi0gICAgImVuY29kZXIvc3JjZS9zYmNfZW5jX2JpdF9hbGxvY19zdGUuYyIsCi0gICAgImVuY29kZXIvc3JjZS9zYmNfZW5jX2NvZWZmcy5jIiwKLSAgICAiZW5jb2Rlci9zcmNlL3NiY19lbmNvZGVyLmMiLAotICAgICJlbmNvZGVyL3NyY2Uvc2JjX3BhY2tpbmcuYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgImVuY29kZXIvaW5jbHVkZSIsCi0gICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgIi8vYnQvc3RhY2svaW5jbHVkZSIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiBdCi19Ci0KLXN0YXRpY19saWJyYXJ5KCJzYmMiKSB7Ci0gIGRlcHMgPSBbCi0gICAgIjpzYmNfZGVjb2RlciIsCi0gICAgIjpzYmNfZW5jb2RlciIsCi0gIF0KLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9BbmRyb2lkLmJwIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWIyZTkuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyBCbHVldG9vdGggU0JDIGRlY29kZXIgc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidC1zYmMtZGVjb2RlciIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmNlL2FsbG9jLmMiLAotICAgICAgICAic3JjZS9iaXRhbGxvYy5jIiwKLSAgICAgICAgInNyY2UvYml0YWxsb2Mtc2JjLmMiLAotICAgICAgICAic3JjZS9iaXRzdHJlYW0tZGVjb2RlLmMiLAotICAgICAgICAic3JjZS9kZWNvZGVyLW9pbmEuYyIsCi0gICAgICAgICJzcmNlL2RlY29kZXItcHJpdmF0ZS5jIiwKLSAgICAgICAgInNyY2UvZGVjb2Rlci1zYmMuYyIsCi0gICAgICAgICJzcmNlL2RlcXVhbnQuYyIsCi0gICAgICAgICJzcmNlL2ZyYW1pbmcuYyIsCi0gICAgICAgICJzcmNlL2ZyYW1pbmctc2JjLmMiLAotICAgICAgICAic3JjZS9vaV9jb2RlY192ZXJzaW9uLmMiLAotICAgICAgICAic3JjZS9zeW50aGVzaXMtc2JjLmMiLAotICAgICAgICAic3JjZS9zeW50aGVzaXMtZGN0OC5jIiwKLSAgICAgICAgInNyY2Uvc3ludGhlc2lzLTgtZ2VuZXJhdGVkLmMiLAotICAgIF0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICAgICAgInNyY2UiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJzYmNkZWNvZGVyX2Z1enplciIsCi0gICAgc3JjczogWwotICAgICAgICAic2JjZGVjb2Rlcl9mdXp6ZXIuYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtc2JjLWRlY29kZXIiLAotICAgIF0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX2Fzc2VydC5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfYXNzZXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDI5ZTEuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfYXNzZXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMiAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9PSV9BU1NFUlRfSAotI2RlZmluZSBfT0lfQVNTRVJUX0gKLS8qKiBAZmlsZQotICBUaGlzIGZpbGUgcHJvdmlkZXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUKLSAgYXNzZXJ0aW9ucy4KLQotICBXaGVuIHRoZSBPSV9ERUJVRyBwcmVwcm9jZXNzb3IgdmFsdWUgaXMgZGVmaW5lZCwgdGhlIG1hY3JvIE9JX0FTU0VSVCBpcwotICBjb21waWxlZCBpbnRvCi0gIHRoZSBwcm9ncmFtLCBwcm92aWRpbmcgZm9yIGEgcnVudGltZSBhc3NlcnRpb24gZmFpbHVyZSBjaGVjay4KLSAgQ19BU1NFUlQgaXMgYSBtYWNybyB0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gY29tcGlsZSB0aW1lIGNoZWNrcy4KLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiBcYWRkdG9ncm91cCBEZWJ1Z2dpbmcgRGVidWdnaW5nIEFQSXMgKi8KLS8qKkB7Ki8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZkZWYgT0lfREVCVUcKLQotLyoqIFRoZSBtYWNybyBPSV9BU1NFUlQgdGFrZXMgYSBjb25kaXRpb24gYXJndW1lbnQuIElmIHRoZSBhc3NlcnRlZCBjb25kaXRpb24KLSAgICBkb2VzIG5vdCBldmFsdWF0ZSB0byB0cnVlLCB0aGUgT0lfQVNTRVJUIG1hY3JvIGNhbGxzIHRoZSBob3N0LWRlcGVuZGVudAotICAgZnVuY3Rpb24sCi0gICAgT0lfQXNzZXJ0RmFpbCgpLCB3aGljaCByZXBvcnRzIHRoZSBmYWlsdXJlIGFuZCBnZW5lcmF0ZXMgYSBydW50aW1lIGVycm9yLgotKi8KLXZvaWQgT0lfQXNzZXJ0RmFpbChjaGFyKiBmaWxlLCBpbnQgbGluZSwgY2hhciogcmVhc29uKTsKLQotI2RlZmluZSBPSV9BU1NFUlQoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmRpdGlvbikpIE9JX0Fzc2VydEZhaWwoX19GSUxFX18sIF9fTElORV9fLCAjY29uZGl0aW9uKTsgXAotICB9Ci0KLSNkZWZpbmUgT0lfQVNTRVJUX0ZBSUwobXNnKSBcCi0gIHsgT0lfQXNzZXJ0RmFpbChfX0ZJTEVfXywgX19MSU5FX18sIG1zZyk7IH0KLQotI2Vsc2UKLQotI2RlZmluZSBPSV9BU1NFUlQoY29uZGl0aW9uKQotI2RlZmluZSBPSV9BU1NFUlRfRkFJTChtc2cpCi0KLSNlbmRpZgotCi0vKioKLSAgIENfQVNTRVJUKCkgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBtYW55IGNvbXBpbGUtdGltZSBhc3NlcnRpb25zOiB0eXBlIHNpemVzLAotICAgZmllbGQgb2Zmc2V0cywgZXRjLgotICAgQW4gYXNzZXJ0aW9uIGZhaWx1cmUgcmVzdWx0cyBpbiBjb21waWxlIHRpbWUgZXJyb3IgQzIxMTg6IG5lZ2F0aXZlIHN1YnNjcmlwdC4KLSAgIFVuZm9ydHVuYXRlbHksIHRoaXMgZWxlZ2FudCBtYWNybyBkb2Vzbid0IHdvcmsgd2l0aCBHQ0MsIHNvIGl0J3MgYWxsCi0gICBjb21tZW50ZWQgb3V0Ci0gICBmb3Igbm93LiBQZXJoYXBzIGxhdGVyLi4uLi4KLSovCi0KLSNpZm5kZWYgQ19BU1NFUlQKLS8vICNkZWZpbmUgQ19BU1NFUlQoZSkgdHlwZWRlZiBjaGFyIF9fQ19BU1NFUlRfX1soZSk/MTotMV0KLS8vICNkZWZpbmUgQ19BU1NFUlQoZSkKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKipAfSovCi0KLSNlbmRpZiAvKiBfT0lfQVNTRVJUX0ggKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX2JpdHN0cmVhbS5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfYml0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwM2NmYTMuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfYml0c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfT0lfQklUU1RSRUFNX0gKLSNkZWZpbmUgX09JX0JJVFNUUkVBTV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi1AZmlsZQotRnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBpbnB1dCBhbmQgb3V0cHV0Ci1iaXRzdHJlYW1zLgotCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLSNpbmNsdWRlICJvaV9jb2RlY19zYmNfcHJpdmF0ZS5oIgotI2luY2x1ZGUgIm9pX3N0ZGRlZnMuaCIKLQotSU5MSU5FIHZvaWQgT0lfQklUU1RSRUFNX1JlYWRJbml0KE9JX0JJVFNUUkVBTSogYnMsIGNvbnN0IE9JX0JZVEUqIGJ1ZmZlcik7Ci0KLUlOTElORSB2b2lkIE9JX0JJVFNUUkVBTV9Xcml0ZUluaXQoT0lfQklUU1RSRUFNKiBicywgT0lfQllURSogYnVmZmVyKTsKLQotSU5MSU5FIHVpbnQzMl90IE9JX0JJVFNUUkVBTV9SZWFkVUlOVChPSV9CSVRTVFJFQU0qIGJzLCBPSV9VSU5UIGJpdHMpOwotCi1JTkxJTkUgdWludDhfdCBPSV9CSVRTVFJFQU1fUmVhZFVJTlQ0QWxpZ25lZChPSV9CSVRTVFJFQU0qIGJzKTsKLQotSU5MSU5FIHVpbnQ4X3QgT0lfQklUU1RSRUFNX1JlYWRVSU5UOEFsaWduZWQoT0lfQklUU1RSRUFNKiBicyk7Ci0KLUlOTElORSB2b2lkIE9JX0JJVFNUUkVBTV9Xcml0ZVVJTlQoT0lfQklUU1RSRUFNKiBicywgdWludDE2X3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgYml0cyk7Ci0KLS8qCi0gKiBVc2Uga25vd2xlZGdlIHRoYXQgdGhlIGJpdHN0cmVhbSBpcyBhbGlnbmVkIHRvIG9wdGltaXplIHRoZSB3cml0ZSBvZiBhIGJ5dGUKLSAqLwotUFJJVkFURSB2b2lkIE9JX0JJVFNUUkVBTV9Xcml0ZVVJTlQ4QWxpZ25lZChPSV9CSVRTVFJFQU0qIGJzLCB1aW50OF90IGRhdHVtKTsKLQotLyoKLSAqIFVzZSBrbm93bGVkZ2UgdGhhdCB0aGUgYml0c3RyZWFtIGlzIGFsaWduZWQgdG8gb3B0aW1pemUgdGhlIHdyaXRpbmcgb2YgYQotICogcGFpciBvZiBuaWJibGVzLgotICovCi1QUklWQVRFIHZvaWQgT0lfQklUU1RSRUFNX1dyaXRlMnhVSU5UNEFsaWduZWQoT0lfQklUU1RSRUFNKiBicywgdWludDhfdCBkYXR1bTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXR1bTIpOwotCi0vKiogSW50ZXJuYWxseSB0aGUgYml0c3RyZWFtIGxvb2tzIGFoZWFkIGluIHRoZSBzdHJlYW0uIFdoZW4KLSAqIE9JX1NCQ19SZWFkU2NhbGVmYWN0b3JzKCkgZ29lcyB0byB0ZW1wb3JhcmlseSBicmVhayB0aGUgYWJzdHJhY3Rpb24sIGl0IHdpbGwKLSAqIG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgImxvZ2ljYWwiIHBvaW50ZXIgaXMgaW4gdGhlIHN0cmVhbS4KLSAqLwotI2RlZmluZSBPSV9CSVRTVFJFQU1fR2V0V3JpdGVQdHIoYnMpICgoYnMpLT5wdHIudyAtIDMpCi0jZGVmaW5lIE9JX0JJVFNUUkVBTV9HZXRSZWFkUHRyKGJzKSAoKGJzKS0+cHRyLnIgLSAzKQotCi0vKiogVGhpcyBpcyBkZWNsYXJlZCBoZXJlIGFzIGEgbWFjcm8gYmVjYXVzZSBkZWNvZGVyLmMgYnJlYWtzIHRoZSBiaXRzcmVhbQotICogZW5jYXBzdWxhdGlvbiBmb3IgZWZmaWNpZW5jeSByZWFzb25zLgotICovCi0jZGVmaW5lIE9JX0JJVFNUUkVBTV9SRUFEVUlOVChyZXN1bHQsIGJpdHMsIHB0ciwgdmFsdWUsIGJpdFB0cikgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBPSV9BU1NFUlQoKGJpdHMpIDw9IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgT0lfQVNTRVJUKChiaXRQdHIpIDwgMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE9JX0FTU0VSVCgoYml0UHRyKSA+PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKChiaXRQdHIgKyBiaXRzKSA+IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHZhbHVlKSA9ICgodmFsdWUpIDw8IDgpIHwgKihwdHIpKys7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChiaXRQdHIpIC09IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocmVzdWx0KSA9ICh2YWx1ZSkgPDwgKGJpdFB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHJlc3VsdCkgPj49IDMyIC0gKGJpdHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYml0UHRyKSArPSAoYml0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgT0lfQVNTRVJUKCgoYml0cykgPT0gMCkgfHwgKChyZXN1bHQpIDwgKDF1IDw8IChiaXRzKSkpKTsgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIE9JX0JJVFNUUkVBTV9XUklURVVJTlQocHRyLCB2YWx1ZSwgYml0UHRyLCBkYXR1bSwgYml0cykgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYml0UHRyKSAtPSAoYml0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHZhbHVlKSB8PSAoZGF0dW0pIDw8IChiaXRQdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoKGJpdFB0cikgPD0gMTYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoYml0UHRyKSArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKihwdHIpKysgPSAodWludDhfdCkoKHZhbHVlKSA+PiAyNCk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICh2YWx1ZSkgPDw9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIE9JX0JJVFNUUkVBTV9XUklURUZMVVNIKHB0ciwgdmFsdWUsIGJpdFB0cikgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoKGJpdFB0cikgPCAzMikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoYml0UHRyKSArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKihwdHIpKysgPSAodWludDhfdCkoKHZhbHVlKSA+PiAyNCk7ICAgICAgICAgIFwKLSAgICAgICh2YWx1ZSkgPDw9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0vKioKLUB9Ci0qLwotCi0jZW5kaWYgLyogX09JX0JJVFNUUkVBTV9IICovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9idF9zcGVjLmggYi9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9idF9zcGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTMwOGYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfYnRfc3BlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX09JX0JUX1NQRUNfSAotI2RlZmluZSBfT0lfQlRfU1BFQ19ICi0vKioKLSAqIEBmaWxlCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWZpbml0aW9ucyBmcm9tIHRoZSBCbHVldG9vdGggc3BlY2lmaWNhdGlvbi4KLSAqCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgJFJldmlzaW9uOiAjMSAkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2lfc3RkZGVmcy5oIgotCi0vKiogXGFkZHRvZ3JvdXAgTWlzYyBNaXNjZWxsYW5lb3VzIEFQSXMgKi8KLS8qKkB7Ki8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBwZXJpcGhlcmFscyBpbiBhIHBpY29uZXQuICovCi0jZGVmaW5lIE9JX0JUX01BWF9BQ1RJVkVfUEVSSVBIRVJBTFMgNwotCi0vKioKLSAqIEBuYW1lIERhdGEgdHlwZXMgZm9yIHdvcmtpbmcgd2l0aCBVVUlEcwotICogVVVJRHMgYXJlIDE2IGJ5dGVzICgxMjggYml0cykuCi0gKgotICogVG8gYXZvaWQgaGF2aW5nIHRvIHBhc3MgYXJvdW5kIDEyOC1iaXQgdmFsdWVzIGFsbCB0aGUgdGltZSwgMzItYml0IGFuZCAxNi1iaXQKLSAqIFVVSURzIGFyZSBkZWZpbmVkLCBhbG9uZyB3aXRoIGEgbWFwcGluZyBmcm9tIHRoZSBzaG9ydGVyIHZlcnNpb25zIHRvIHRoZSBmdWxsCi0gKiB2ZXJzaW9uLgotICoKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiAxNi1iaXQgcmVwcmVzZW50YXRpb24gb2YgYSAxMjgtYml0IFVVSUQKLSAqLwotdHlwZWRlZiB1aW50MTZfdCBPSV9VVUlEMTY7Ci0KLS8qKgotICogMzItYml0IHJlcHJlc2VudGF0aW9uIG9mIGEgMTI4LWJpdCBVVUlECi0gKi8KLXR5cGVkZWYgdWludDMyX3QgT0lfVVVJRDMyOwotCi0vKioKLSAqIG51bWJlciBvZiBieXRlcyBpbiBhIDEyOCBiaXQgVVVJRAotICovCi0jZGVmaW5lIE9JX0JUX1VVSUQxMjhfU0laRSAxNgotCi0vKioKLSAqIG51bWJlciBvZiBieXRlcyBpbiBJUHY2IHN0eWxlIGFkZHJlc3NlcwotICovCi0jZGVmaW5lIE9JX0JUX0lQVjZBRERSX1NJWkUgMTYKLQotLyoqCi0gKiB0eXBlIGRlZmluaXRpb24gZm9yIGEgMTI4LWJpdCBVVUlECi0gKgotICogVG8gc2ltcGxpZnkgY29udmVyc2lvbiBiZXR3ZWVuIDEyOC1iaXQgVVVJRHMgYW5kIDE2LWJpdCBhbmQgMzItYml0IFVVSURzLAotICogdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBhcmUgc3RvcmVkIHdpdGggdGhlIHNhbWUgZW5kaWFuLW5lc3MgYXMgaXMKLSAqIG5hdGl2ZSBvbiB0aGUgdGFyZ2V0IChsb2NhbCkgZGV2aWNlLiBUaGUgcmVtYWluZGVyIG9mIHRoZSAxMjgtYml0IFVVSUQgaXMKLSAqIHN0b3JlZCBhcyBieXRlcyBpbiBiaWctZW5kaWFuIG9yZGVyLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiAxMjgtYml0IFVVSUQgKi8KLSAgdWludDMyX3QgbXMzMmJpdHM7Ci0gIC8qIHJlbWFpbmRlciBvZiAxMjgtYml0IFVVSUQsIGFycmF5IG9mIDgtYml0IHZhbHVlcyAqLwotICB1aW50OF90IGJhc2VbT0lfQlRfVVVJRDEyOF9TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KV07Ci19IE9JX1VVSUQxMjg7Ci0KLS8qKiBAfSAqLwotCi0vKiogbnVtYmVyIG9mIGJ5dGVzIGluIGEgbGluayBrZXkgKi8KLSNkZWZpbmUgT0lfQlRfTElOS19LRVlfU0laRSAxNgotCi0vKioKLSAqIHR5cGUgZGVmaW5pdGlvbiBmb3IgYSBiYXNlYmFuZCBsaW5rIGtleQotICoKLSAqIEJlY2F1c2UgMTI4LWJpdCBpbnRlZ2VycyBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCB3ZSBkZWZpbmUKLSAqIGxpbmsga2V5cyBhcyBhbiBhcnJheSBvZiBieXRlcy4gVW5saWtlIHRoZSBCbHVldG9vdGggZGV2aWNlIGFkZHJlc3MsCi0gKiB0aGUgbGluayBrZXkgaXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIsIG1lYW5pbmcgdGhhdAotICogIC0gYXJyYXlbMF0gIGNvbnRhaW5zIGJpdHMgMCAgLSA3LAotICogIC0gYXJyYXlbMV0gIGNvbnRhaW5zIGJpdHMgOCAgLSAxNSwKLSAqICAtIGFycmF5WzJdICBjb250YWlucyBiaXRzIDE2IC0gMjMsCi0gKiAgLSBhcnJheVszXSAgY29udGFpbnMgYml0cyAyNCAtIDMxLAotICogIC0gYXJyYXlbNF0gIGNvbnRhaW5zIGJpdHMgMzIgLSAzOSwKLSAqICAtIGFycmF5WzVdICBjb250YWlucyBiaXRzIDQwIC0gNDcsCi0gKiAgLSBhcnJheVs2XSAgY29udGFpbnMgYml0cyA0OCAtIDU1LAotICogIC0gYXJyYXlbN10gIGNvbnRhaW5zIGJpdHMgNTYgLSA2MywKLSAqICAtIGFycmF5WzhdICBjb250YWlucyBiaXRzIDY0IC0gNzEsCi0gKiAgLSBhcnJheVs5XSAgY29udGFpbnMgYml0cyA3MiAtIDc5LAotICogIC0gYXJyYXlbMTBdIGNvbnRhaW5zIGJpdHMgODAgLSA4NywKLSAqICAtIGFycmF5WzExXSBjb250YWlucyBiaXRzIDg4IC0gOTUsCi0gKiAgLSBhcnJheVsxMl0gY29udGFpbnMgYml0cyA5NiAtIDEwMywKLSAqICAtIGFycmF5WzEzXSBjb250YWlucyBiaXRzIDEwNC0gMTExLAotICogIC0gYXJyYXlbMTRdIGNvbnRhaW5zIGJpdHMgMTEyLSAxMTksIGFuZAotICogIC0gYXJyYXlbMTVdIGNvbnRhaW5zIGJpdHMgMTIwLSAxMjcuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogbGluayBrZXkgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2YgOC1iaXQgdmFsdWVzICovCi0gIHVpbnQ4X3Qga2V5W09JX0JUX0xJTktfS0VZX1NJWkVdOwotfSBPSV9MSU5LX0tFWTsKLQotLyoqIE91dC1vZi1iYW5kIGRhdGEgc2l6ZSAtIEMgYW5kIFIgdmFsdWVzIGFyZSAxNi1ieXRlcyBlYWNoICovCi0jZGVmaW5lIE9JX0JUX09PQl9OVU1fQllURVMgMTYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBzYW1lIHN0cnVjdCB1c2VkIGZvciBDIGFuZCBSIHZhbHVlcyAqLwotICB1aW50OF90IHZhbHVlW09JX0JUX09PQl9OVU1fQllURVNdOwotfSBPSV9PT0JfREFUQTsKLQotLyoqCi0gKiBsaW5rIGtleSB0eXBlcwotICovCi10eXBlZGVmIGVudW0gewotICBPSV9MSU5LX0tFWV9UWVBFX0NPTUJPID0gMCwgICAgICAgICAgIC8qIGNvbWJpbmF0aW9uIGtleSAqLwotICBPSV9MSU5LX0tFWV9UWVBFX0xPQ0FMX1VOSVQgPSAxLCAgICAgIC8qIGxvY2FsIHVuaXQga2V5ICovCi0gIE9JX0xJTktfS0VZX1RZUEVfUkVNT1RFX1VOSVQgPSAyLCAgICAgLyogcmVtb3RlIHVuaXQga2V5ICovCi0gIE9JX0xJTktfS0VZX1RZUEVfREVCVUdfQ09NQk8gPSAzLCAgICAgLyogZGVidWcgY29tYmluYXRpb24ga2V5ICovCi0gIE9JX0xJTktfS0VZX1RZUEVfVU5BVVRIRU5USUNBVEVEID0gNCwgLyogVW5hdXRoZW50aWNhdGVkICovCi0gIE9JX0xJTktfS0VZX1RZUEVfQVVUSEVOVElDQVRFRCA9IDUsICAgLyogQXV0aGVudGljYXRlZCAqLwotICBPSV9MSU5LX0tFWV9UWVBFX0NIQU5HRURfQ09NQk8gPSA2ICAgIC8qIENoYW5nZWQgKi8KLQotfSBPSV9CVF9MSU5LX0tFWV9UWVBFOwotCi0vKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciBhIFBJTiAocGVyc29uYWwgaW5kZW50aWZpY2F0aW9uIG51bWJlcikgKi8KLSNkZWZpbmUgT0lfQlRfUElOX0NPREVfU0laRSAxNgotCi0vKiBkYXRhIHR5cGUgZm9yIGEgUElOIChQSU5zIGFyZSB0cmVhdGVkIGFzIHN0cmluZ3MuKSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBQSU4gcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2YgOC1iaXQgdmFsdWVzICovCi0gIHVpbnQ4X3QgcGluW09JX0JUX1BJTl9DT0RFX1NJWkVdOwotfSBPSV9QSU5fQ09ERTsKLQotLyogbWF4aW11bSBudW1iZXIgb2YgU0NPIGNvbm5lY3Rpb25zIHBlciBkZXZpY2U6IDMgYXMgb2YgdmVyc2lvbiAyLjArRURSCi0gICAgb2YgdGhlIEJsdWV0b290aCBzcGVjaWZpY2F0aW9uIChzZWUgc2VjIDQuMyBvZiB2b2wgMiBwYXJ0IEIpICovCi0jZGVmaW5lIE9JX0JUX01BWF9TQ09fQ09OTkVDVElPTlMgMwotCi0vKiogZGF0YSB0eXBlIGZvciBjbG9jayBvZmZzZXQgKi8KLXR5cGVkZWYgdWludDE2X3QgT0lfQlRfQ0xPQ0tfT0ZGU0VUOwotCi0vKiogZGF0YSB0eXBlIGZvciBhIExNIGhhbmRsZSAqLwotdHlwZWRlZiB1aW50MTZfdCBPSV9IQ0lfTE1fSEFORExFOwotCi0vKiogb3BhcXVlIGRhdGEgdHlwZSBmb3IgYSBTQ08gb3IgQUNMIGNvbm5lY3Rpb24gaGFuZGxlICovCi10eXBlZGVmIHN0cnVjdCBfT0lfSENJX0NPTk5FQ1RJT04qIE9JX0hDSV9DT05ORUNUSU9OX0hBTkRMRTsKLQotLyoqIGRhdGEgdHlwZSBmb3IgSENJIEVycm9yIENvZGUsIGFzIGRlZmluZWQgaW4gb2lfaGNpc3BlYy5oICovCi10eXBlZGVmIHVpbnQ4X3QgT0lfSENJX0VSUk9SX0NPREU7Ci0KLS8qKgotICogVGhlIEJsdWV0b290aCBkZXZpY2UgdHlwZSBpcyBpbmRpY2F0ZWQgYnkgYSAyNC1iaXQgYml0ZmllbGQsIHJlcHJlc2VudGVkIGFzIGEKLSAqIDMyLWJpdCBudW1iZXIgaW4gdGhlIHN0YWNrLiBUaGUgYml0IGxheW91dCBhbmQgdmFsdWVzIGZvciBkZXZpY2UgY2xhc3MgYXJlCi0gKiBzcGVjaWZpZWQgaW4gdGhlIGZpbGUgb2lfYnRfYXNzaWduZWRfbm9zLmggYW5kIGluIHRoZSBCbHVldG9vdGggIkFzc2lnbmVkCi0gKiBOdW1iZXJzIiBzcGVjaWZpY2F0aW9uIGF0IGh0dHA6Ly93d3cuYmx1ZXRvb3RoLm9yZy9hc3NpZ25lZC1udW1iZXJzLy4KLSAqLwotdHlwZWRlZiB1aW50MzJfdCBPSV9CVF9ERVZJQ0VfQ0xBU1M7Ci0vKiBCaXRzIDAtMSBjb250YWluIGZvcm1hdCB0eXBlLiAqLwotI2RlZmluZSBPSV9CVF9ERVZfQ0xBU1NfRk9STUFUX01BU0sgMHgwMDAwMDMKLS8qIEJpdHMgMi03IGNvbnRhaW4gbWlub3IgZGV2aWNlIGNsYXNzIHZhbHVlLiAqLwotI2RlZmluZSBPSV9CVF9ERVZfQ0xBU1NfTUlOT1JfREVWSUNFX01BU0sgMHgwMDAwRkMKLS8qIEJpdHMgOC0xMiBjb250YWluIG1ham9yIGRldmljZSBjbGFzcyB2YWx1ZS4gKi8KLSNkZWZpbmUgT0lfQlRfREVWX0NMQVNTX01BSk9SX0RFVklDRV9NQVNLIDB4MDAxRjAwCi0vKiBCaXRzIDEzLTIzIGNvbnRhaW4gbWFqb3Igc2VydmljZSBjbGFzcyB2YWx1ZS4gKi8KLSNkZWZpbmUgT0lfQlRfREVWX0NMQVNTX01BSk9SX1NFUlZJQ0VfTUFTSyAweEZGRTAwMAotCi0vKiogVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIGRldmljZSBjbGFzcyBmb3JtYXQgZGVmaW5lZCwgdHlwZSAwMC4gKi8KLSNkZWZpbmUgT0lfQlRfREVWX0NMQVNTX0ZPUk1BVF9UWVBFIDAwCi0KLS8qIEJpdCAxMyBpbiBkZXZpY2UgY2xhc3MgaW5kaWNhdGVzIGxpbWl0ZWQgZGlzY292ZXJhYmlsaXR5IG1vZGUgKEdBUCB2Mi4wK0VEUiwKLSAqIHNlY3Rpb24gNC4xLjIuMikKLSAqLwotI2RlZmluZSBPSV9CVF9ERVZfQ0xBU1NfTElNSVRFRF9ESVNDT19CSVQgQklUMTMKLQotLyoqIG1hY3JvIHRvIHRlc3QgdmFsaWRpdHkgb2YgdGhlIERldmljZSBDbGFzcyBGb3JtYXQgKi8KLSNkZWZpbmUgT0lfQlRfVkFMSURfREVWSUNFX0NMQVNTX0ZPUk1BVChjbGFzcykgXAotICAoT0lfQlRfREVWX0NMQVNTX0ZPUk1BVF9UWVBFID09ICgoY2xhc3MpICYgT0lfQlRfREVWX0NMQVNTX0ZPUk1BVF9NQVNLKSkKLQotLyogdGhlIHRpbWUgYmV0d2VlbiBiYXNlYmFuZCBjbG9jayB0aWNrcywgY3VycmVudGx5IDYyNSBtaWNyb3NlY29uZHMgKG9uZSBzbG90KQotICovCi0jZGVmaW5lIE9JX0JUX1RJQ0sgNjI1Ci0vKiBzb21lIG1hY3JvcyB0byBjb252ZXJ0IHRvL2Zyb20gYmFzZWJhbmQgY2xvY2sgdGlja3MgLSBubyBmbG9hdGluZyBwb2ludCEgKi8KLSNkZWZpbmUgT0lfU0VDT05EU19UT19CVF9USUNLUyhzZWNzKSAoKHNlY3MpKjE2MDApCi0jZGVmaW5lIE9JX0JUX1RJQ0tTX1RPX1NFQ09ORFModGlja3MpICgodGlja3MpIC8gMTYwMCkKLSNkZWZpbmUgT0lfTVNFQ1NfVE9fQlRfVElDS1MobXNlY3MpICgoKG1zZWNzKSo4KSAvIDUpCi0jZGVmaW5lIE9JX0JUX1RJQ0tTX1RPX01TRUNTKHRpY2tzKSAoKCh0aWNrcykqNSkgLyA4KQotCi0vKiogRUlSIGJ5dGUgb3JkZXIgKi8KLSNkZWZpbmUgT0lfRUlSX0JZVEVfT1JERVIgT0lfTElUVExFX0VORElBTl9CWVRFX09SREVSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qKkB9Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIF9PSV9CVF9TUEVDX0ggKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX2NvZGVjX3NiYy5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfY29kZWNfc2JjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzYxZGIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfY29kZWNfc2JjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX09JX0NPREVDX1NCQ19DT1JFX0gKLSNkZWZpbmUgX09JX0NPREVDX1NCQ19DT1JFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLUBmaWxlCi1EZWNsYXJhdGlvbnMgb2YgY29kZWMgZnVuY3Rpb25zLCBkYXRhIHR5cGVzLCBhbmQgbWFjcm9zLgotCi1AaW5ncm91cCBjb2RlY19saWIKLSovCi0KLS8qKgotQGFkZHRvZ3JvdXAgY29kZWNfbGliCi1AewotKi8KLQotLyogTm9uLUJNMyB1c2VycyBvZiBvZiB0aGUgY29kZWMgbXVzdCBpbmNsdWRlIG9pX2NvZGVjX3NiY19ibTNkZWZzLmggcHJpb3IgdG8KLSAqIGluY2x1ZGluZyB0aGlzIGZpbGUsIG9yIGVsc2UgdGhlc2UgaW5jbHVkZXMgd2lsbCBmYWlsIGJlY2F1c2UgdGhlIEJNMyBTREsgaXMKLSAqIG5vdCBpbiB0aGUgaW5jbHVkZSBwYXRoICovCi0jaWZuZGVmIF9PSV9DT0RFQ19TQkNfQk0zREVGU19ICi0jaW5jbHVkZSAib2lfc3RhdHVzLmgiCi0jaW5jbHVkZSAib2lfc3RkZGVmcy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBTQkNfTUFYX0NIQU5ORUxTIDIKLSNkZWZpbmUgU0JDX01BWF9CQU5EUyA4Ci0jZGVmaW5lIFNCQ19NQVhfQkxPQ0tTIDE2Ci0vKiBNaW5pbXVtIHNpemUgb2YgdGhlIGJpdCBhbGxvY2F0aW9uIHBvb2wgdXNlZCB0byBlbmNvZGUgdGhlIHN0cmVhbSAqLwotI2RlZmluZSBTQkNfTUlOX0JJVFBPT0wgMgotLyogTWF4aW11bSBzaXplIG9mIHRoZSBiaXQgYWxsb2NhdGlvbiBwb29sIHVzZWQgdG8gZW5jb2RlIHRoZSBzdHJlYW0gKi8KLSNkZWZpbmUgU0JDX01BWF9CSVRQT09MIDI1MAotI2RlZmluZSBTQkNfTUFYX09ORV9DSEFOTkVMX0JQUyAzMjAwMDAKLSNkZWZpbmUgU0JDX01BWF9UV09fQ0hBTk5FTF9CUFMgNTEyMDAwCi0KLSNkZWZpbmUgU0JDX1dCU19CSVRSQVRFIDYyMDAwCi0jZGVmaW5lIFNCQ19XQlNfQklUUE9PTCAyNwotI2RlZmluZSBTQkNfV0JTX05ST0ZfQkxPQ0tTIDE2Ci0jZGVmaW5lIFNCQ19XQlNfRlJBTUVfTEVOIDYyCi0jZGVmaW5lIFNCQ19XQlNfU0FNUExFU19QRVJfRlJBTUUgMTI4Ci0KLSNkZWZpbmUgU0JDX0hFQURFUl9MRU4gNAotI2RlZmluZSBTQkNfTUFYX0ZSQU1FX0xFTiAgICAgICAgICAgICAgICAgICAgXAotICAoU0JDX0hFQURFUl9MRU4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgKChTQkNfTUFYX0JBTkRTICogU0JDX01BWF9DSEFOTkVMUyAvIDIpICsgXAotICAgIChTQkNfTUFYX0JBTkRTICsgU0JDX01BWF9CTE9DS1MgKiBTQkNfTUFYX0JJVFBPT0wgKyA3KSAvIDgpKQotI2RlZmluZSBTQkNfTUFYX1NBTVBMRVNfUEVSX0ZSQU1FIChTQkNfTUFYX0JBTkRTICogU0JDX01BWF9CTE9DS1MpCi0KLSNkZWZpbmUgU0JDX01BWF9TQ0FMRUZBQ1RPUl9CWVRFUyBcCi0gICgoNCAqIChTQkNfTUFYX0NIQU5ORUxTICogU0JDX01BWF9CQU5EUykgKyA3KSAvIDgpCi0KLSNkZWZpbmUgT0lfU0JDX1NZTkNXT1JEIDB4OWMKLSNkZWZpbmUgT0lfU0JDX0VOSEFOQ0VEX1NZTkNXT1JEIDB4OWQKLQotLyoqQG5hbWUgU2FtcGxpbmcgZnJlcXVlbmNpZXMgKi8KLS8qKkB7Ki8KLS8qKjwgVGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpcyAxNiBrSHouIE9uZSBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIEBhIGZyZXF1ZW5jeQotICogcGFyYW1ldGVyIG9mIE9JX0NPREVDX1NCQ19FbmNvZGVyQ29uZmlndXJlKCkgKi8KLSNkZWZpbmUgU0JDX0ZSRVFfMTYwMDAgMAotLyoqPCBUaGUgc2FtcGxpbmcgZnJlcXVlbmN5IGlzIDMyIGtIei4gT25lIHBvc3NpYmxlIHZhbHVlIGZvciB0aGUgQGEgZnJlcXVlbmN5Ci0gKiBwYXJhbWV0ZXIgb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfRlJFUV8zMjAwMCAxCi0vKio8IFRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaXMgNDQuMSBrSHouIE9uZSBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIEBhIGZyZXF1ZW5jeQotICogcGFyYW1ldGVyIG9mIE9JX0NPREVDX1NCQ19FbmNvZGVyQ29uZmlndXJlKCkgKi8KLSNkZWZpbmUgU0JDX0ZSRVFfNDQxMDAgMgotLyoqPCBUaGUgc2FtcGxpbmcgZnJlcXVlbmN5IGlzIDQ4IGtIei4gT25lIHBvc3NpYmxlIHZhbHVlIGZvciB0aGUgQGEgZnJlcXVlbmN5Ci0gKiBwYXJhbWV0ZXIgb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfRlJFUV80ODAwMCAzCi0vKipAfSovCi0KLS8qKkBuYW1lIENoYW5uZWwgbW9kZXMgKi8KLS8qKkB7Ki8KLS8qKjwgVGhlIG1vZGUgb2YgdGhlIGVuY29kZWQgY2hhbm5lbCBpcyBtb25vLiBPbmUgcG9zc2libGUgdmFsdWUgZm9yIHRoZSBAYSBtb2RlCi0gKiBwYXJhbWV0ZXIgb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfTU9OTyAwCi0vKio8IFRoZSBtb2RlIG9mIHRoZSBlbmNvZGVkIGNoYW5uZWwgaXMgZHVhbC1jaGFubmVsLiBPbmUgcG9zc2libGUgdmFsdWUgZm9yIHRoZQotICogQGEgbW9kZSBwYXJhbWV0ZXIgb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfRFVBTF9DSEFOTkVMIDEKLS8qKjwgVGhlIG1vZGUgb2YgdGhlIGVuY29kZWQgY2hhbm5lbCBpcyBzdGVyZW8uIE9uZSBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIEBhCi0gKiBtb2RlIHBhcmFtZXRlciBvZiBPSV9DT0RFQ19TQkNfRW5jb2RlckNvbmZpZ3VyZSgpICovCi0jZGVmaW5lIFNCQ19TVEVSRU8gMgotLyoqPCBUaGUgbW9kZSBvZiB0aGUgZW5jb2RlZCBjaGFubmVsIGlzIGpvaW50IHN0ZXJlby4gT25lIHBvc3NpYmxlIHZhbHVlIGZvciB0aGUKLSAqIEBhIG1vZGUgcGFyYW1ldGVyIG9mIE9JX0NPREVDX1NCQ19FbmNvZGVyQ29uZmlndXJlKCkgKi8KLSNkZWZpbmUgU0JDX0pPSU5UX1NURVJFTyAzCi0vKipAfSovCi0KLS8qKkBuYW1lIFN1YmJhbmRzICovCi0vKipAeyovCi0vKio8IFRoZSBlbmNvZGVkIHN0cmVhbSBoYXMgNCBzdWJiYW5kcy4gT25lIHBvc3NpYmxlIHZhbHVlIGZvciB0aGUgQGEgc3ViYmFuZHMKLSAqIHBhcmFtZXRlciBvZiBPSV9DT0RFQ19TQkNfRW5jb2RlckNvbmZpZ3VyZSgpKi8KLSNkZWZpbmUgU0JDX1NVQkJBTkRTXzQgMAotLyoqPCBUaGUgZW5jb2RlZCBzdHJlYW0gaGFzIDggc3ViYmFuZHMuIE9uZSBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIEBhIHN1YmJhbmRzCi0gKiBwYXJhbWV0ZXIgb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfU1VCQkFORFNfOCAxCi0vKipAfSovCi0KLS8qKkBuYW1lIEJsb2NrIGxlbmd0aHMgKi8KLS8qKkB7Ki8KLS8qKjwgQSBibG9jayBzaXplIG9mIDQgYmxvY2tzIHdhcyB1c2VkIHRvIGVuY29kZSB0aGUgc3RyZWFtLiBPbmUgcG9zc2libGUgdmFsdWUKLSAqIGZvciB0aGUgQGEgYmxvY2tzIHBhcmFtZXRlciBvZiBPSV9DT0RFQ19TQkNfRW5jb2RlckNvbmZpZ3VyZSgpICovCi0jZGVmaW5lIFNCQ19CTE9DS1NfNCAwCi0vKio8IEEgYmxvY2sgc2l6ZSBvZiA4IGJsb2NrcyB3YXMgdXNlZCB0byBlbmNvZGUgdGhlIHN0cmVhbSBpcy4gT25lIHBvc3NpYmxlCi0gKiB2YWx1ZSBmb3IgdGhlIEBhIGJsb2NrcyBwYXJhbWV0ZXIgb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfQkxPQ0tTXzggMQotLyoqPCBBIGJsb2NrIHNpemUgb2YgMTIgYmxvY2tzIHdhcyB1c2VkIHRvIGVuY29kZSB0aGUgc3RyZWFtLiBPbmUgcG9zc2libGUgdmFsdWUKLSAqIGZvciB0aGUgQGEgYmxvY2tzIHBhcmFtZXRlciBvZiBPSV9DT0RFQ19TQkNfRW5jb2RlckNvbmZpZ3VyZSgpICovCi0jZGVmaW5lIFNCQ19CTE9DS1NfMTIgMgotLyoqPCBBIGJsb2NrIHNpemUgb2YgMTYgYmxvY2tzIHdhcyB1c2VkIHRvIGVuY29kZSB0aGUgc3RyZWFtLiBPbmUgcG9zc2libGUgdmFsdWUKLSAqIGZvciB0aGUgQGEgYmxvY2tzIHBhcmFtZXRlciBvZiBPSV9DT0RFQ19TQkNfRW5jb2RlckNvbmZpZ3VyZSgpICovCi0jZGVmaW5lIFNCQ19CTE9DS1NfMTYgMwotLyoqQH0qLwotCi0vKipAbmFtZSBCaXQgYWxsb2NhdGlvbiBtZXRob2RzICovCi0vKipAeyovCi0vKio8IFRoZSBiaXQgYWxsb2NhdGlvbiBtZXRob2QuIE9uZSBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIEBhIGxvdWRuZXNzIHBhcmFtZXRlcgotICogb2YgT0lfQ09ERUNfU0JDX0VuY29kZXJDb25maWd1cmUoKSAqLwotI2RlZmluZSBTQkNfTE9VRE5FU1MgMAotLyoqPCBUaGUgYml0IGFsbG9jYXRpb24gbWV0aG9kLiBPbmUgcG9zc2libGUgdmFsdWUgZm9yIHRoZSBAYSBsb3VkbmVzcyBwYXJhbWV0ZXIKLSAqIG9mIE9JX0NPREVDX1NCQ19FbmNvZGVyQ29uZmlndXJlKCkgKi8KLSNkZWZpbmUgU0JDX1NOUiAxCi0vKipAfSovCi0KLS8qKgotQH0KLQotQGFkZHRvZ3JvdXAgY29kZWNfaW50ZXJuYWwKLUB7Ci0qLwotCi10eXBlZGVmIGludDE2X3QgU0JDX0JVRkZFUl9UOwotCi0vKiogVXNlZCBpbnRlcm5hbGx5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBmcmVxdWVuY3k7IC8qKjwgVGhlIHNhbXBsaW5nIGZyZXF1ZW5jeS4gSW5wdXQgcGFyYW1ldGVyLiAqLwotICB1aW50OF90IGZyZXFJbmRleDsKLQotICB1aW50OF90IG5yb2ZfYmxvY2tzOyAvKio8IFRoZSBibG9jayBzaXplIHVzZWQgdG8gZW5jb2RlIHRoZSBzdHJlYW0uIElucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gKi8KLSAgdWludDhfdCBibG9ja3M7Ci0KLSAgdWludDhfdCBucm9mX3N1YmJhbmRzOyAvKio8IFRoZSBudW1iZXIgb2Ygc3ViYmFuZHMgb2YgdGhlIGVuY29kZWQgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0IHBhcmFtZXRlci4gKi8KLSAgdWludDhfdCBzdWJiYW5kczsKLQotICB1aW50OF90IG1vZGU7IC8qKjwgVGhlIG1vZGUgb2YgdGhlIGVuY29kZWQgY2hhbm5lbC4gSW5wdXQgcGFyYW1ldGVyLiAqLwotICB1aW50OF90IG5yb2ZfY2hhbm5lbHM7IC8qKjwgVGhlIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgZW5jb2RlZCBzdHJlYW0uICovCi0KLSAgdWludDhfdCBhbGxvYzsgICAvKio8IFRoZSBiaXQgYWxsb2NhdGlvbiBtZXRob2QuIElucHV0IHBhcmFtZXRlci4gKi8KLSAgdWludDhfdCBiaXRwb29sOyAvKio8IFNpemUgb2YgdGhlIGJpdCBhbGxvY2F0aW9uIHBvb2wgdXNlZCB0byBlbmNvZGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLiBJbnB1dCBwYXJhbWV0ZXIuICovCi0gIHVpbnQ4X3QgY3JjOyAgICAgLyoqPCBQYXJpdHkgY2hlY2sgYnl0ZSB1c2VkIGZvciBlcnJvciBkZXRlY3Rpb24uICovCi0gIHVpbnQ4X3Qgam9pbjsgICAgLyoqPCBXaGV0aGVyIGpvaW50IHN0ZXJlbyBoYXMgYmVlbiB1c2VkLiAqLwotICB1aW50OF90IGVuaGFuY2VkOwotICB1aW50OF90IG1pbl9iaXRwb29sOyAvKio8IFRoaXMgdmFsdWUgaXMgb25seSB1c2VkIHdoZW4gZW5jb2RpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNCQ19NQVhfQklUUE9PTCBpZiB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRwb29scyBhcmUgZGlzYWxsb3dlZCwgb3RoZXJ3aXNlIHRoZSBtaW5pbXVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHBvb2wgc2l6ZSB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgYml0IGFsbG9jYXRvci4gICovCi0KLSAgdWludDhfdCBjYWNoZWRJbmZvOyAvKio8IEluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyBmcmFtZSAqLwotfSBPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTzsKLQotLyoqIFVzZWQgaW50ZXJuYWxseS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgT0lfQ0hBUiogY29kZWNJbmZvOwotICBPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyBmcmFtZUluZm87Ci0gIGludDhfdCBzY2FsZV9mYWN0b3JbU0JDX01BWF9DSEFOTkVMUyAqIFNCQ19NQVhfQkFORFNdOwotICB1aW50MzJfdCBmcmFtZUNvdW50OwotICBpbnQzMl90KiBzdWJkYXRhOwotCi0gIFNCQ19CVUZGRVJfVCogZmlsdGVyQnVmZmVyW1NCQ19NQVhfQ0hBTk5FTFNdOwotICBpbnQzMl90IGZpbHRlckJ1ZmZlckxlbjsKLSAgT0lfVUlOVCBmaWx0ZXJCdWZmZXJPZmZzZXQ7Ci0KLSAgdW5pb24gewotICAgIHVpbnQ4X3QgdWludDhbU0JDX01BWF9DSEFOTkVMUyAqIFNCQ19NQVhfQkFORFNdOwotICAgIHVpbnQzMl90IHVpbnQzMltTQkNfTUFYX0NIQU5ORUxTICogU0JDX01BWF9CQU5EUyAvIDRdOwotICB9IGJpdHM7Ci0gIHVpbnQ4X3QgbWF4Qml0bmVlZDsgLyoqPCBSdW5uaW5nIG1heGltdW0gYml0bmVlZCAqLwotICBPSV9CWVRFIGZvcm1hdEJ5dGU7Ci0gIHVpbnQ4X3QgcGNtU3RyaWRlOwotICB1aW50OF90IG1heENoYW5uZWxzOwotfSBPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQ7Ci0KLS8qCi0gKiBBIHNtYWxsZXIgdmFsdWUgcmVkdWNlcyBSQU0gdXNhZ2UgYXQgdGhlIGV4cGVuc2Ugb2YgaW5jcmVhc2VkIENQVSB1c2FnZS4KLSAqIFZhbHVlcyBpbiB0aGUgcmFuZ2UgMjcuLjUwIGFyZSByZWNvbW1lbmRlZC4gQmV5b25kIDUwIHRoZXJlIGlzIGEgZGltaW5pc2hpbmcKLSAqIHJldHVybiBvbiByZWR1Y2VkIENQVSB1c2FnZS4KLSAqLwotI2RlZmluZSBTQkNfQ09ERUNfTUlOX0ZJTFRFUl9CVUZGRVJTIDE2Ci0jZGVmaW5lIFNCQ19DT0RFQ19GQVNUX0ZJTFRFUl9CVUZGRVJTIDI3Ci0KLS8qIEV4cGFuZHMgdG8gdGhlIG51bWJlciBvZiB1aW50MzJfdHMgbmVlZGVkIHRvIGVuc3VyZSBlbm91Z2ggbWVtb3J5IHRvIGVuY29kZQotICogb3IgZGVjb2RlIHN0cmVhbXMgb2YgbnVtQ2hhbm5lbHMgY2hhbm5lbHMsIHVzaW5nIG51bUJ1ZmZlcnMgYnVmZmVycy4KLSAqIEV4YW1wbGU6Ci0gKiB1aW50MzJfdCBkZWNvZGVyRGF0YVtDT0RFQ19EQVRBX1dPUkRTKFNCQ19NQVhfQ0hBTk5FTFMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCQ19ERUNPREVSX0ZBU1RfU1lOVEhFU0lTX0JVRkZFUlMpXTsKLSAqICovCi0jZGVmaW5lIENPREVDX0RBVEFfV09SRFMobnVtQ2hhbm5lbHMsIG51bUJ1ZmZlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKChzaXplb2YoaW50MzJfdCkgKiBTQkNfTUFYX0JMT0NLUyAqIChudW1DaGFubmVscykqU0JDX01BWF9CQU5EUykgKyAgICAgICAgIFwKLSAgICAoc2l6ZW9mKFNCQ19CVUZGRVJfVCkgKiBTQkNfTUFYX0NIQU5ORUxTICogU0JDX01BWF9CQU5EUyAqIChudW1CdWZmZXJzKSkgKyBcCi0gICAgKHNpemVvZih1aW50MzJfdCkgLSAxKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgc2l6ZW9mKHVpbnQzMl90KSkKLQotLyoqIE9wYXF1ZSBwYXJhbWV0ZXIgdG8gZGVjb2RpbmcgZnVuY3Rpb25zOyBtYWludGFpbnMgZGVjb2RlciBjb250ZXh0LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQgY29tbW9uOwotICAvKiBCb29sZWFuLCBzZXQgYnkgT0lfQ09ERUNfU0JDX0RlY29kZXJMaW1pdCgpICovCi0gIHVpbnQ4X3QgbGltaXRGcmFtZUZvcm1hdDsKLSAgdWludDhfdCByZXN0cmljdFN1YmJhbmRzOwotICB1aW50OF90IGVuaGFuY2VkRW5hYmxlZDsKLSAgdWludDhfdCBidWZmZXJlZEJsb2NrczsKLX0gT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBkYXRhW0NPREVDX0RBVEFfV09SRFMoMSwgU0JDX0NPREVDX0ZBU1RfRklMVEVSX0JVRkZFUlMpXTsKLX0gT0lfQ09ERUNfU0JDX0NPREVDX0RBVEFfTU9OTzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBkYXRhW0NPREVDX0RBVEFfV09SRFMoMiwgU0JDX0NPREVDX0ZBU1RfRklMVEVSX0JVRkZFUlMpXTsKLX0gT0lfQ09ERUNfU0JDX0NPREVDX0RBVEFfU1RFUkVPOwotCi0vKioKLUB9Ci0KLUBhZGR0b2dyb3VwIGNvZGVjX2xpYgotQHsKLSovCi0KLS8qKgotICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGRlY29kZXIuIFRoZSBjb250ZXh0IG11c3QgYmUgcmVzZXQgd2hlbgotICogY2hhbmdpbmcgc3RyZWFtcywgb3IgaWYgdGhlIGZvbGxvd2luZyBzdHJlYW0gcGFyYW1ldGVycyBjaGFuZ2U6Ci0gKiBudW1iZXIgb2Ygc3ViYmFuZHMsIHN0ZXJlbyBtb2RlLCBvciBmcmVxdWVuY3kuCi0gKgotICogQHBhcmFtIGNvbnRleHQgICBQb2ludGVyIHRvIHRoZSBkZWNvZGVyIGNvbnRleHQgc3RydWN0dXJlIHRvIGJlIHJlc2V0LgotICoKLSAqIEBwYXJhbSBlbmhhbmNlZCAgSWYgdHJ1ZSwgZW5oYW5jZWQgU0JDIG9wZXJhdGlvbiBpcyBlbmFibGVkLiBJZiBlbmFibGVkLAotICogICAgICAgICAgICAgICAgICB0aGUgY29kZWMgd2lsbCByZWNvZ25pemUgdGhlIGFsdGVybmF0aXZlIHN5bmN3b3JkIGZvcgotICogICAgICAgICAgICAgICAgICBkZWNvZGluZyBhbiBlbmhhbmNlZCBTQkMgc3RyZWFtLiBFbmhhbmNlbWVudHMgc2hvdWxkIG5vdAotICogICAgICAgICAgICAgICAgICBiZSBlbmFibGVkIHVubGVzcyB0aGUgc3RyZWFtIGlzIGtub3duIHRvIGJlIGdlbmVyYXRlZAotICogICAgICAgICAgICAgICAgICBieSBhbiBlbmhhbmNlZCBlbmNvZGVyLCBvciB0aGVyZSBpcyBhIHNtYWxsIHBvc3NpYmlsaXR5Ci0gKiAgICAgICAgICAgICAgICAgIGZvciBkZWNvZGluZyBnbGl0Y2hlcyBpZiBzeW5jaHJvbml6YXRpb24gd2VyZSB0byBiZSBsb3N0LgotICovCi1PSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0RlY29kZXJSZXNldChPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlY29kZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVjb2RlckRhdGFCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4Q2hhbm5lbHMsIHVpbnQ4X3QgcGNtU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfQk9PTCBlbmhhbmNlZCk7Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiByZXN0cmljdHMgdGhlIGtpbmQgb2YgU0JDIGZyYW1lcyB0aGF0IHRoZSBEZWNvZGVyIHdpbGwKLSAqIHByb2Nlc3MuICBJdHMgdXNlIGlzIG9wdGlvbmFsLiAgSWYgdXNlZCwgaXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAqIGNhbGxpbmcgT0lfQ09ERUNfU0JDX0RlY29kZXJSZXNldCgpLiBBZnRlciBpdCBpcyBjYWxsZWQsIGFueSBjYWxscwotICogdG8gT0lfQ09ERUNfU0JDX0RlY29kZUZyYW1lKCkgd2l0aCBTQkMgZnJhbWVzIHRoYXQgZG8gbm90IGNvbmZvcm0KLSAqIHRvIHRoZSBTdWJiYW5kIGFuZCBFbmhhbmNlZCBTQkMgc2V0dGluZyB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4KLSAqIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlMgcmV0dXJuLgotICoKLSAqIEBwYXJhbSBjb250ZXh0ICAgUG9pbnRlciB0byB0aGUgZGVjb2RlciBjb250ZXh0IHN0cnVjdHVyZSB0byBiZSBsaW1pdGVkLgotICoKLSAqIEBwYXJhbSBlbmhhbmNlZCAgSWYgdHJ1ZSwgYWxsIGZyYW1lcyBwYXNzZWQgdG8gdGhlIGRlY29kZXIgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICBFbmhhbmNlZCBTQkMgZnJhbWVzLiBJZiBmYWxzZSwgYWxsIGZyYW1lcyBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIFNCQyBmcmFtZXMuCi0gKgotICogQHBhcmFtIHN1YmJhbmRzICBNYXkgYmUgc2V0IHRvIFNCQ19TVUJCQU5EU180IG9yIFNCQ19TVUJCQU5EU184LiBBbGwKLSAqICAgICAgICAgICAgICAgICAgZnJhbWVzIHBhc3NlZCB0byB0aGUgZGVjb2RlciBtdXN0IGJlIGVuY29kZWQgd2l0aAotICogICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBzdWJiYW5kcy4KLSAqCi0gKi8KLU9JX1NUQVRVUyBPSV9DT0RFQ19TQkNfRGVjb2RlckxpbWl0KE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9CT09MIGVuaGFuY2VkLCB1aW50OF90IHN1YmJhbmRzKTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRlY29kZXIgcGFyYW1ldGVycyBmb3IgYSByYXcgZGVjb2RlIHdoZXJlIHRoZSBkZWNvZGVyCi0gKiBwYXJhbWV0ZXJzIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSBzYmMgZGF0YSBzdHJlYW0uCi0gKiBPSV9DT0RFQ19TQkNfRGVjb2RlclJlc2V0IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gY29udGV4dCAgICAgICAgRGVjb2RlciBjb250ZXh0IHN0cnVjdHVyZS4gVGhpcyBtdXN0IGJlIHRoZSBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB1c2VkIGVhY2ggdGltZSBhIGZyYW1lIGlzIGRlY29kZWQuCi0gKgotICogQHBhcmFtIGVuaGFuY2VkICAgICAgIFNldCB0byB0cnVlIHRvIGVuYWJsZSBRdWFsY29tbSBwcm9wcmlldGFyeQotICogICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgZW5oYW5jZW1lbnRzLgotICoKLSAqIEBwYXJhbSBmcmVxdWVuY3kgICAgICBPbmUgb2YgU0JDX0ZSRVFfMTYwMDAsIFNCQ19GUkVRXzMyMDAwLCBTQkNfRlJFUV80NDEwMCwKLSAqICAgICAgICAgICAgICAgICAgICAgICBTQkNfRlJFUV80ODAwMAotICoKLSAqIEBwYXJhbSBtb2RlICAgICAgICAgICBPbmUgb2YgU0JDX01PTk8sIFNCQ19EVUFMX0NIQU5ORUwsIFNCQ19TVEVSRU8sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgU0JDX0pPSU5UX1NURVJFTwotICoKLSAqIEBwYXJhbSBzdWJiYW5kcyAgICAgICBPbmUgb2YgU0JDX1NVQkJBTkRTXzQsIFNCQ19TVUJCQU5EU184Ci0gKgotICogQHBhcmFtIGJsb2NrcyAgICAgICAgIE9uZSBvZiBTQkNfQkxPQ0tTXzQsIFNCQ19CTE9DS1NfOCwgU0JDX0JMT0NLU18xMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICBTQkNfQkxPQ0tTXzE2Ci0gKgotICogQHBhcmFtIGFsbG9jICAgICAgICAgIE9uZSBvZiBTQkNfTE9VRE5FU1MsIFNCQ19TTlIKLSAqCi0gKiBAcGFyYW0gbWF4Qml0cG9vbCAgICAgVGhlIG1heGltdW0gYml0cG9vbCBzaXplIGZvciB0aGlzIGNvbnRleHQKLSAqLwotT0lfU1RBVFVTIE9JX0NPREVDX1NCQ19EZWNvZGVyQ29uZmlndXJlUmF3KAotICAgIE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsIE9JX0JPT0wgZW5oYW5jZWQsIHVpbnQ4X3QgZnJlcXVlbmN5LAotICAgIHVpbnQ4X3QgbW9kZSwgdWludDhfdCBzdWJiYW5kcywgdWludDhfdCBibG9ja3MsIHVpbnQ4X3QgYWxsb2MsCi0gICAgdWludDhfdCBtYXhCaXRwb29sKTsKLQotLyoqCi0gKiBEZWNvZGUgb25lIFNCQyBmcmFtZS4gVGhlIGZyYW1lIGhhcyBubyBoZWFkZXIgYnl0ZXMuIFRoZSBjb250ZXh0IG11c3QgaGF2ZQotICogYmVlbiBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgIE9JX0NPREVDX1NCQ19EZWNvZGVyQ29uZmlndXJlUmF3KCkuCi0gKgotICogQHBhcmFtIGNvbnRleHQgICAgICAgUG9pbnRlciB0byBhIGRlY29kZXIgY29udGV4dCBzdHJ1Y3R1cmUuIFRoZSBzYW1lIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdXNlZCBlYWNoIHRpbWUgd2hlbiBkZWNvZGluZyBmcm9tIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uCi0gKgotICogQHBhcmFtIGJpdHBvb2wgICAgICAgVGhlIGFjdHVhbCBiaXRwb29sIHNpemUgZm9yIHRoaXMgZnJhbWUuIE11c3QgYmUgPD0gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBtYXhiaXRwb29sIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0bwotICogICAgICAgICAgICAgICAgICAgICAgT0lfQ09ERUNfU0JDX0RlY29kZXJDb25maWd1cmVSYXcoKS4KLSAqCi0gKiBAcGFyYW0gZnJhbWVEYXRhICAgICBBZGRyZXNzIG9mIGEgcG9pbnRlciB0byB0aGUgU0JDIGRhdGEgdG8gZGVjb2RlLiBUaGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgZnJhbWUgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgZGVjb2RpbmcuCi0gKgotICogQHBhcmFtIGZyYW1lQnl0ZXMgICAgUG9pbnRlciB0byBhIHVpbnQzMl90IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIGZyYW1lIGRhdGEuIFRoaXMgdmFsdWUgd2lsbCBiZSB1cGRhdGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGFmdGVyIGEgZGVjb2RpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4KLSAqCi0gKiBAcGFyYW0gcGNtRGF0YSAgICAgICBBZGRyZXNzIG9mIGFuIGFycmF5IG9mIGludDE2X3QgcGFpcnMsIHdoaWNoIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlZCB3aXRoIHRoZSBkZWNvZGVkIGF1ZGlvIGRhdGEuIFRoaXMgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHVwZGF0ZWQuCi0gKgotICogQHBhcmFtIHBjbUJ5dGVzICAgICAgUG9pbnRlciB0byBhIHVpbnQzMl90IGluL291dCBwYXJhbWV0ZXIuIE9uIGlucHV0LCBpdAotICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHBjbQotICogICAgICAgICAgICAgICAgICAgICAgZGF0YS4gT24gb3V0cHV0LCBpdCB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4gTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIHRoZSBzZW1hbnRpY3Mgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQnl0ZXMuCi0gKi8KLU9JX1NUQVRVUyBPSV9DT0RFQ19TQkNfRGVjb2RlUmF3KE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHBvb2wsIGNvbnN0IE9JX0JZVEUqKiBmcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZnJhbWVCeXRlcywgaW50MTZfdCogcGNtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwY21CeXRlcyk7Ci0KLS8qKgotICogRGVjb2RlIG9uZSBTQkMgZnJhbWUuCi0gKgotICogQHBhcmFtIGNvbnRleHQgICAgICAgUG9pbnRlciB0byBhIGRlY29kZXIgY29udGV4dCBzdHJ1Y3R1cmUuIFRoZSBzYW1lIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdXNlZCBlYWNoIHRpbWUgd2hlbiBkZWNvZGluZyBmcm9tIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uCi0gKgotICogQHBhcmFtIGZyYW1lRGF0YSAgICAgQWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gdGhlIFNCQyBkYXRhIHRvIGRlY29kZS4gVGhpcwotICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IGZyYW1lIGFmdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsIGRlY29kaW5nLgotICoKLSAqIEBwYXJhbSBmcmFtZUJ5dGVzICAgIFBvaW50ZXIgdG8gYSB1aW50MzJfdCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCi0gKiAgICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBmcmFtZSBkYXRhLiBUaGlzIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBhZnRlciBhIGRlY29kaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uCi0gKgotICogQHBhcmFtIHBjbURhdGEgICAgICAgQWRkcmVzcyBvZiBhbiBhcnJheSBvZiBpbnQxNl90IHBhaXJzLCB3aGljaCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZWQgd2l0aCB0aGUgZGVjb2RlZCBhdWRpbyBkYXRhLiBUaGlzIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB1cGRhdGVkLgotICoKLSAqIEBwYXJhbSBwY21CeXRlcyAgICAgIFBvaW50ZXIgdG8gYSB1aW50MzJfdCBpbi9vdXQgcGFyYW1ldGVyLiBPbiBpbnB1dCwgaXQKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciBwY20KLSAqICAgICAgICAgICAgICAgICAgICAgIGRhdGEuIE9uIG91dHB1dCwgaXQgd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4uIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgc2VtYW50aWNzIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICBmcmFtZUJ5dGVzLgotICovCi1PSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0RlY29kZUZyYW1lKE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9JX0JZVEUqKiBmcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBmcmFtZUJ5dGVzLCBpbnQxNl90KiBwY21EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcGNtQnl0ZXMpOwotCi0vKioKLSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIFNCQyBmcmFtZXMgYnV0IGRvbid0IGRlY29kZS4gQ1JDJ3MgYXJlIG5vdCBjaGVja2VkLAotICogYnV0IHRoZSBTeW5jIHdvcmQgaXMgZm91bmQgcHJpb3IgdG8gY291bnQgY2FsY3VsYXRpb24uCi0gKgotICogQHBhcmFtIGZyYW1lRGF0YSAgICAgUG9pbnRlciB0byB0aGUgU0JDIGRhdGEuCi0gKgotICogQHBhcmFtIGZyYW1lQnl0ZXMgICAgTnVtYmVyIG9mIGJ5dGVzIGF2YWlhYmxlIGluIHRoZSBmcmFtZURhdGEgYnVmZmVyCi0gKgotICovCi11aW50OF90IE9JX0NPREVDX1NCQ19GcmFtZUNvdW50KE9JX0JZVEUqIGZyYW1lRGF0YSwgdWludDMyX3QgZnJhbWVCeXRlcyk7Ci0KLS8qKgotICogQW5hbHl6ZSBhbiBTQkMgZnJhbWUgYnV0IGRvbid0IGRvIHRoZSBkZWNvZGUuCi0gKgotICogQHBhcmFtIGNvbnRleHQgICAgICAgUG9pbnRlciB0byBhIGRlY29kZXIgY29udGV4dCBzdHJ1Y3R1cmUuIFRoZSBzYW1lIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdXNlZCBlYWNoIHRpbWUgd2hlbiBkZWNvZGluZyBmcm9tIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uCi0gKgotICogQHBhcmFtIGZyYW1lRGF0YSAgICAgQWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gdGhlIFNCQyBkYXRhIHRvIGRlY29kZS4gVGhpcwotICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IGZyYW1lIGFmdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsIGRlY29kaW5nLgotICoKLSAqIEBwYXJhbSBmcmFtZUJ5dGVzICAgIFBvaW50ZXIgdG8gYSB1aW50MzJfdCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCi0gKiAgICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBmcmFtZSBkYXRhLiBUaGlzIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBhZnRlciBhIGRlY29kaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uCi0gKgotICovCi1PSV9TVEFUVVMgT0lfQ09ERUNfU0JDX1NraXBGcmFtZShPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfQllURSoqIGZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBmcmFtZUJ5dGVzKTsKLQotLyogQ29tbW9uIGZ1bmN0aW9ucyAqLwotCi0vKioKLSAgQ2FsY3VsYXRlIHRoZSBmcmFtZSBsZW5ndGguCi0KLSAgQHBhcmFtIGZyYW1lIFRoZSBmcmFtZSB3aG9zZSBsZW5ndGggdG8gY2FsY3VsYXRlCi0KLSAgQHJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGluZGl2aWR1YWwgZW5jb2RlZCBmcmFtZSBpbgotICBieXRlcwotICAqLwotdWludDE2X3QgT0lfQ09ERUNfU0JDX0NhbGN1bGF0ZUZyYW1lbGVuKE9JX0NPREVDX1NCQ19GUkFNRV9JTkZPKiBmcmFtZSk7Ci0KLS8qKgotICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGJpdHBvb2wgc2l6ZSB0aGF0IGZpdHMgd2l0aGluIGEgZ2l2ZW4gZnJhbWUgbGVuZ3RoLgotICoKLSAqIEBwYXJhbSBmcmFtZSAgICAgVGhlIGZyYW1lIHRvIGNhbGN1bGF0ZSB0aGUgYml0cG9vbCBzaXplIGZvcgotICogQHBhcmFtIGZyYW1lTGVuICBUaGUgZnJhbWUgbGVuZ3RoIHRvIGZpdCB0aGUgYml0cG9vbCB0bwotICoKLSAqIEByZXR1cm4gdGhlIG1heGltdW0gYml0cG9vbCB0aGF0IHdpbGwgZml0IGluIHRoZSBzcGVjaWZpZWQgZnJhbWUgbGVuZ3RoCi0gKi8KLXVpbnQxNl90IE9JX0NPREVDX1NCQ19DYWxjdWxhdGVCaXRwb29sKE9JX0NPREVDX1NCQ19GUkFNRV9JTkZPKiBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lTGVuKTsKLQotLyoqCi0gIENhbGN1bGF0ZSB0aGUgYml0IHJhdGUuCi0KLSAgQHBhcmFtIGZyYW1lIFRoZSBmcmFtZSB3aG9zZSBiaXQgcmF0ZSB0byBjYWxjdWxhdGUKLQotICBAcmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBiaXQgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQsCi0gIGFzc3VtaW5nIHRoYXQgc3RyZWFtIHBhcmFtZXRlcnMgYXJlIGNvbnN0YW50Ci0gICovCi11aW50MzJfdCBPSV9DT0RFQ19TQkNfQ2FsY3VsYXRlQml0cmF0ZShPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpOwotCi0vKioKLSAgQ2FsY3VsYXRlIGRlY29kZWQgYXVkaW8gZGF0YSBsZW5ndGggZm9yIG9uZSBmcmFtZS4KLQotICBAcGFyYW0gZnJhbWUgVGhlIGZyYW1lIHdob3NlIGF1ZGlvIGRhdGEgbGVuZ3RoIHRvIGNhbGN1bGF0ZQotCi0gIEByZXR1cm4gbGVuZ3RoIG9mIGRlY29kZWQgYXVkaW8gZGF0YSBmb3IgYQotICBzaW5nbGUgZnJhbWUsIGluIGJ5dGVzCi0gICovCi11aW50MTZfdCBPSV9DT0RFQ19TQkNfQ2FsY3VsYXRlUGNtQnl0ZXMoT0lfQ09ERUNfU0JDX0NPTU1PTl9DT05URVhUKiBjb21tb24pOwotCi0vKioKLSAqIEdldCB0aGUgY29kZWMgdmVyc2lvbiB0ZXh0LgotICoKLSAqIEByZXR1cm4gIHBvaW50ZXIgdG8gdGV4dCBzdHJpbmcgY29udGFpbmluZyBjb2RlYyB2ZXJzaW9uIHRleHQKLSAqCi0gKi8KLU9JX0NIQVIqIE9JX0NPREVDX1ZlcnNpb24odm9pZCk7Ci0KLS8qKgotQH0KLQotQGFkZHRvZ3JvdXAgY29kZWNfaW50ZXJuYWwKLUB7Ci0qLwotCi1leHRlcm4gY29uc3QgT0lfQ0hBUiogY29uc3QgT0lfQ09ERUNfU0JDX0ZyZXFUZXh0W107Ci1leHRlcm4gY29uc3QgT0lfQ0hBUiogY29uc3QgT0lfQ09ERUNfU0JDX01vZGVUZXh0W107Ci1leHRlcm4gY29uc3QgT0lfQ0hBUiogY29uc3QgT0lfQ09ERUNfU0JDX1N1YmJhbmRzVGV4dFtdOwotZXh0ZXJuIGNvbnN0IE9JX0NIQVIqIGNvbnN0IE9JX0NPREVDX1NCQ19CbG9ja3NUZXh0W107Ci1leHRlcm4gY29uc3QgT0lfQ0hBUiogY29uc3QgT0lfQ09ERUNfU0JDX0FsbG9jVGV4dFtdOwotCi0vKioKLUB9Ci0KLUBhZGR0b2dyb3VwIGNvZGVjX2xpYgotQHsKLSovCi0KLSNpZmRlZiBPSV9ERUJVRwotdm9pZCBPSV9DT0RFQ19TQkNfRHVtcENvbmZpZyhPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWVJbmZvKTsKLSNlbHNlCi0jZGVmaW5lIE9JX0NPREVDX1NCQ19EdW1wQ29uZmlnKGYpCi0jZW5kaWYKLQotLyoqCi1AfQotKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9PSV9DT0RFQ19TQkNfQ09SRV9IICovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9jb2RlY19zYmNfcHJpdmF0ZS5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfY29kZWNfc2JjX3ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwZmU1ZC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9jb2RlY19zYmNfcHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAzIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX09JX0NPREVDX1NCQ19QUklWQVRFX0gKLSNkZWZpbmUgX09JX0NPREVDX1NCQ19QUklWQVRFX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgJFJldmlzaW9uOiAjMSAkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLUBmaWxlCi1GdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBtYWNybyBkZWZpbml0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvZGVjLgotCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLSNpZmRlZiBVU0VfUkVTVFJJQ1RfS0VZV09SRAotI2RlZmluZSBSRVNUUklDVCByZXN0cmljdAotI2Vsc2UKLSNkZWZpbmUgUkVTVFJJQ1QKLSNlbmRpZgotCi0jaWZkZWYgQ09ERUNfREVCVUcKLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBFUlJPUih4KSAgXAotICBkbyB7ICAgICAgICAgICAgXAotICAgIHByaW50ZiB4OyAgICAgXAotICAgIHByaW50ZigiXG4iKTsgXAotICB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgRVJST1IoeCkKLSNlbmRpZgotCi0jaWZkZWYgVFJBQ0VfRVhFQ1VUSU9OCi0jZGVmaW5lIFRSQUNFKHgpICBcCi0gIGRvIHsgICAgICAgICAgICBcCi0gICAgcHJpbnRmIHg7ICAgICBcCi0gICAgcHJpbnRmKCJcbiIpOyBcCi0gIH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBUUkFDRSh4KQotI2VuZGlmCi0KLSNpZm5kZWYgUFJJVkFURQotI2RlZmluZSBQUklWQVRFCi0jZW5kaWYKLQotI2lmbmRlZiBJTkxJTkUKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLQotI2luY2x1ZGUgIm9pX2Fzc2VydC5oIgotI2luY2x1ZGUgIm9pX2NvZGVjX3NiYy5oIgotCi0jaWZuZGVmIE9JX1NCQ19TWU5DV09SRAotI2RlZmluZSBPSV9TQkNfU1lOQ1dPUkQgMHg5YwotI2VuZGlmCi0KLSNpZm5kZWYgRElWSURFCi0jZGVmaW5lIERJVklERShhLCBiKSAoKGEpIC8gKGIpKQotI2VuZGlmCi0KLXR5cGVkZWYgdW5pb24gewotICB1aW50OF90IHVpbnQ4W1NCQ19NQVhfQkFORFNdOwotICB1aW50MzJfdCB1aW50MzJbU0JDX01BWF9CQU5EUyAvIDRdOwotfSBCSVRORUVEX1VOSU9OMTsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnQ4X3QgdWludDhbMiAqIFNCQ19NQVhfQkFORFNdOwotICB1aW50MzJfdCB1aW50MzJbMiAqIFNCQ19NQVhfQkFORFMgLyA0XTsKLX0gQklUTkVFRF9VTklPTjI7Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBmcmVxX3ZhbHVlc1tdID0gezE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGJsb2NrX3ZhbHVlc1tdID0gezQsIDgsIDEyLCAxNn07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBjaGFubmVsX3ZhbHVlc1tdID0gezEsIDIsIDIsIDJ9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmFuZF92YWx1ZXNbXSA9IHs0LCA4fTsKLQotI2RlZmluZSBURVNUX01PREVfU0VOVElORUwgIk9JTkEiCi0jZGVmaW5lIFRFU1RfTU9ERV9TRU5USU5FTF9MRU5HVEggNAotCi0vKiogVXNlZCBpbnRlcm5hbGx5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bmlvbiB7Ci0gICAgY29uc3QgdWludDhfdCogcjsKLSAgICB1aW50OF90KiB3OwotICB9IHB0cjsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIE9JX1VJTlQgYml0UHRyOwotfSBPSV9CSVRTVFJFQU07Ci0KLSNkZWZpbmUgVkFMSURfSU5UMTYoeCkgKCgoeCkgPj0gT0lfSU5UMTZfTUlOKSAmJiAoKHgpIDw9IE9JX0lOVDE2X01BWCkpCi0jZGVmaW5lIFZBTElEX0lOVDMyKHgpICgoKHgpID49IE9JX0lOVDMyX01JTikgJiYgKCh4KSA8PSBPSV9JTlQzMl9NQVgpKQotCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfSU4gMAotI2RlZmluZSBEQ1RJSV84X1NISUZUX09VVCAoMTYgLSBEQ1RJSV84X1NISUZUX0lOKQotCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfMCAoRENUSUlfOF9TSElGVF9PVVQpCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfMSAoRENUSUlfOF9TSElGVF9PVVQpCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfMiAoRENUSUlfOF9TSElGVF9PVVQpCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfMyAoRENUSUlfOF9TSElGVF9PVVQpCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfNCAoRENUSUlfOF9TSElGVF9PVVQpCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfNSAoRENUSUlfOF9TSElGVF9PVVQpCi0jZGVmaW5lIERDVElJXzhfU0hJRlRfNiAoRENUSUlfOF9TSElGVF9PVVQgLSAxKQotI2RlZmluZSBEQ1RJSV84X1NISUZUXzcgKERDVElJXzhfU0hJRlRfT1VUIC0gMikKLQotI2RlZmluZSBEQ1RfU0hJRlQgMTUKLQotI2RlZmluZSBEQ1RJSUlfNF9TSElGVF9JTiAyCi0jZGVmaW5lIERDVElJSV80X1NISUZUX09VVCAxNQotCi0jZGVmaW5lIERDVElJSV84X1NISUZUX0lOIDMKLSNkZWZpbmUgRENUSUlJXzhfU0hJRlRfT1VUIDE0Ci0KLU9JX1VJTlQgY29tcHV0ZUJpdG5lZWQoT0lfQ09ERUNfU0JDX0NPTU1PTl9DT05URVhUKiBjb21tb24sIHVpbnQ4X3QqIGJpdG5lZWRzLAotICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGNoLCBPSV9VSU5UKiBwcmVmZXJyZWRCaXRwb29sKTsKLQotdm9pZCBvbmVDaGFubmVsQml0QWxsb2NhdGlvbihPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTkVFRF9VTklPTjEqIGJpdG5lZWRzLCBPSV9VSU5UIGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGJpdGNvdW50KTsKLQotT0lfSU5UIGFkanVzdFRvRml0Qml0cG9vbChjb25zdCBPSV9VSU5UIGJpdHBvb2wsIHVpbnQzMl90KiBiaXRuZWVkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfVUlOVCBzdWJiYW5kcywgT0lfVUlOVCBiaXRjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfVUlOVCogZXhjZXNzKTsKLQotSU5MSU5FIE9JX0lOVCBhbGxvY0FkanVzdGVkQml0cyh1aW50OF90KiBkZXN0LCBPSV9JTlQgYml0cywgT0lfSU5UIGV4Y2Vzcyk7Ci0KLUlOTElORSBPSV9JTlQgYWxsb2NFeGNlc3NCaXRzKHVpbnQ4X3QqIGRlc3QsIE9JX0lOVCBleGNlc3MpOwotCi1QUklWQVRFIHVpbnQzMl90IGludGVybmFsX0NhbGN1bGF0ZUJpdHJhdGUoT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lKTsKLQotUFJJVkFURSB1aW50MTZfdCBpbnRlcm5hbF9DYWxjdWxhdGVGcmFtZWxlbihPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpOwotCi12b2lkIG1vbm9CaXRBbGxvY2F0aW9uKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogY29tbW9uKTsKLQotdHlwZWRlZiB2b2lkICgqQklUX0FMTE9DKShPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbik7Ci0KLVBSSVZBVEUgT0lfU1RBVFVTIGludGVybmFsX0RlY29kZVJhdyhPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0cG9vbCwgY29uc3QgT0lfQllURSoqIGZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZnJhbWVCeXRlcywgaW50MTZfdCogcGNtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcGNtQnl0ZXMpOwotCi1JTkxJTkUgT0lfU1RBVFVTIGludGVybmFsX0RlY29kZXJSZXNldChPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlY29kZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVjb2RlckRhdGFCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JZVEUgbWF4Q2hhbm5lbHMsIE9JX0JZVEUgcGNtU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfQk9PTCBlbmhhbmNlZCk7Ci0KLUlOTElORSB1aW50MTZfdCBPSV9TQkNfQ2FsY3VsYXRlRnJhbWVBbmRIZWFkZXJsZW4oCi0gICAgT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lLCBPSV9VSU5UKiBoZWFkZXJMZW5fKTsKLQotUFJJVkFURSB1aW50MzJfdCBPSV9TQkNfTWF4Qml0cG9vbChPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpOwotCi1QUklWQVRFIHZvaWQgT0lfU0JDX0NvbXB1dGVCaXRBbGxvY2F0aW9uKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogZnJhbWUpOwotUFJJVkFURSB1aW50OF90IE9JX1NCQ19DYWxjdWxhdGVDaGVja3N1bShPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JZVEUgY29uc3QqIGRhdGEpOwotCi0vKiBUcmFuc2Zvcm0gZnVuY3Rpb25zICovCi1QUklWQVRFIHZvaWQgc2hpZnRfYnVmZmVyKFNCQ19CVUZGRVJfVCogZGVzdCwgU0JDX0JVRkZFUl9UKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgd29yZENvdW50KTsKLVBSSVZBVEUgdm9pZCBjb3NpbmVNb2R1bGF0ZVN5bnRoNChTQkNfQlVGRkVSX1QqIFJFU1RSSUNUIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnN0KiBSRVNUUklDVCBpbik7Ci1QUklWQVRFIHZvaWQgU3ludGhXaW5kb3c0MF9pbnQzMl9pbnQzMl9zeW1tZXRyeV93aXRoX3N1bSgKLSAgICBpbnQxNl90KiBwY20sIFNCQ19CVUZGRVJfVCBidWZmZXJbODBdLCBPSV9VSU5UIHN0cmlkZVNoaWZ0KTsKLQotSU5MSU5FIHZvaWQgZGN0M180KGludDMyX3QqIFJFU1RSSUNUIG91dCwgaW50MzJfdCBjb25zdCogUkVTVFJJQ1QgaW4pOwotUFJJVkFURSB2b2lkIGFuYWx5emU0X2dlbmVyYXRlZChTQkNfQlVGRkVSX1QgYW5hbHlzaXNCdWZmZXJbUkVTVFJJQ1QgNDBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBwY20sIE9JX1VJTlQgc3RyaWRlU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3ViYmFuZFs0XSk7Ci0KLUlOTElORSB2b2lkIGRjdDNfOChpbnQzMl90KiBSRVNUUklDVCBvdXQsIGludDMyX3QgY29uc3QqIFJFU1RSSUNUIGluKTsKLQotUFJJVkFURSB2b2lkIGFuYWx5emU4X2dlbmVyYXRlZChTQkNfQlVGRkVSX1QgYW5hbHlzaXNCdWZmZXJbUkVTVFJJQ1QgODBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBwY20sIE9JX1VJTlQgc3RyaWRlU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3ViYmFuZFs4XSk7Ci0KLSNpZmRlZiBTQkNfRU5IQU5DRUQKLVBSSVZBVEUgdm9pZCBhbmFseXplOF9lbmhhbmNlZF9nZW5lcmF0ZWQoCi0gICAgU0JDX0JVRkZFUl9UIGFuYWx5c2lzQnVmZmVyW1JFU1RSSUNUIDExMl0sIGludDE2X3QqIHBjbSwKLSAgICBPSV9VSU5UIHN0cmlkZVNoaWZ0LCBpbnQzMl90IHN1YmJhbmRbOF0pOwotI2VuZGlmCi0KLS8qIERlY29kZXIgZnVuY3Rpb25zICovCi0KLUlOTElORSB2b2lkIE9JX1NCQ19SZWFkSGVhZGVyKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfQllURSogZGF0YSk7Ci1QUklWQVRFIHZvaWQgT0lfU0JDX1JlYWRTY2FsZWZhY3RvcnMoT0lfQ09ERUNfU0JDX0NPTU1PTl9DT05URVhUKiBjb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfQllURSogYiwgT0lfQklUU1RSRUFNKiBicyk7Ci1QUklWQVRFIHZvaWQgT0lfU0JDX1JlYWRTYW1wbGVzKE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfQklUU1RSRUFNKiBvYik7Ci1QUklWQVRFIHZvaWQgT0lfU0JDX1JlYWRTYW1wbGVzSm9pbnQoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JJVFNUUkVBTSogZ2xvYmFsX2JzKTsKLVBSSVZBVEUgdm9pZCBPSV9TQkNfU3ludGhGcmFtZShPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIHBjbSwgT0lfVUlOVCBzdGFydF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIG5yb2ZfYmxvY2tzKTsKLUlOTElORSBpbnQzMl90IE9JX1NCQ19EZXF1YW50KHVpbnQzMl90IHJhdywgT0lfVUlOVCBzY2FsZV9mYWN0b3IsIE9JX1VJTlQgYml0cyk7Ci1QUklWQVRFIE9JX0JPT0wgT0lfU0JDX0V4YW1pbmVDb21tYW5kUGFja2V0KAotICAgIE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsIGNvbnN0IE9JX0JZVEUqIGRhdGEsIHVpbnQzMl90IGxlbik7Ci1QUklWQVRFIHZvaWQgT0lfU0JDX0dlbmVyYXRlVGVzdFNpZ25hbChpbnQxNl90IHBjbURhdGFbXVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50KTsKLQotUFJJVkFURSB2b2lkIE9JX1NCQ19FeHBhbmRGcmFtZUZpZWxkcyhPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpOwotUFJJVkFURSBPSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0FsbG9jKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb2RlY0RhdGFBbGlnbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGVjRGF0YUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4Q2hhbm5lbHMsIHVpbnQ4X3QgcGNtU3RyaWRlKTsKLS8qKgotQH0KLSovCi0KLSNlbmRpZiAvKiBfT0lfQ09ERUNfU0JDX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfY29tbW9uLmggYi9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhNjlhNS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX09JX0NPTU1PTl9ICi0jZGVmaW5lIF9PSV9DT01NT05fSAotLyoqCi0gKiBAZmlsZQotICoKLSAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGdyb3VwIGNvbW1vbmx5IHVzZWQgQkxVRW1hZ2ljIDMuMCBzb2Z0d2FyZQotICogaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYXBwbGljYXRpb24gc291cmNlIGNvZGUgYWxvbmcgd2l0aCB0aGUgaGVhZGVyCi0gKiBmaWxlcyBmb3IgdGhlIHNwZWNpZmljIG1vZHVsZXMgb2YgdGhlIHByb3RvY29sIHN0YWNrIGJlaW5nIHVzZWQuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgJFJldmlzaW9uOiAjMSAkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2lfYnRfc3BlYy5oIgotI2luY2x1ZGUgIm9pX29zaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAib2lfc3RhdHVzLmgiCi0jaW5jbHVkZSAib2lfc3RkZGVmcy5oIgotI2luY2x1ZGUgIm9pX3RpbWUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIF9PSV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfY3B1X2RlcC5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfY3B1X2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjI4YjRhLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX2NwdV9kZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMiAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9PSV9DUFVfREVQX0gKLSNkZWZpbmUgX09JX0NQVV9ERVBfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qKgotICogQGZpbGUKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB0YXJnZXQgQ1BVIGFuZAotICogY29tcGlsZXIsIGluY2x1ZGluZyBwcmltaXRpdmUgZGF0YSB0eXBlcyBhbmQgZW5kaWFubmVzcy4KLSAqCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYnl0ZSBvcmRlciBhbmQgcHJpbWl0aXZlIGRhdGEgdHlwZXMgZm9yIHZhcmlvdXMKLSAqIENQVSBmYW1pbGllcy4gVGhlIHByZXByb2Nlc3NvciBzeW1ib2wgJ0NQVScgbXVzdCBiZSBkZWZpbmVkIHRvIGJlIGFuCi0gKiBhcHByb3ByaWF0ZSB2YWx1ZSBvciB0aGlzIGhlYWRlciB3aWxsIGdlbmVyYXRlIGEgY29tcGlsZS10aW1lIGVycm9yLgotICoKLSAqIEBub3RlIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGhlYWRlciBmaWxlIHVzZXMgdGhlIHg4NiBmYW1pbHkgb2YKLSAqIHByb2Nlc3NvcnMgYXMgYW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgZm9yIENQVS9jb21waWxlci1kZXBlbmRlbnQgZGF0YSB0eXBlCi0gKiBkZWZpbml0aW9ucy4gR28gdG8gdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgaGVhZGVyIGZpbGUgdG8gc2VlIHRoZSBkZXRhaWxzIG9mCi0gKiBwcmltaXRpdmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgZWFjaCBwbGF0Zm9ybS4KLSAqCi0gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgQHJlZiBkYXRhX3R5cGVzX2RvY3BhZ2Ugc2VjdGlvbi4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqIFxhZGR0b2dyb3VwIE1pc2MgTWlzY2VsbGFuZW91cyBBUElzICovCi0vKipAeyovCi0KLS8qKiBAbmFtZSBEZWZpbml0aW9ucyBpbmRpY2F0aW5nIGZhbWlseSBvZiB0YXJnZXQgT0lfQ1BVX1RZUEUKLSAqICBAewotICovCi0KLSNkZWZpbmUgT0lfQ1BVX1g4NiAxIC8qKjwgeDg2IHByb2Nlc3NvciBmYW1pbHkgKi8KLSNkZWZpbmUgT0lfQ1BVX0FSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDIgLyoqPCBBUk0gcHJvY2Vzc29yIGZhbWlseS4gICAgICAgICAgICAgICAgXAotICAgICAgICAgQGRlcHJlY2F0ZWQgVXNlICNPSV9DUFVfQVJNN19MRU5EIG9yIFwKLSAgICAgICAgICNPSV9DUFVfQVJNN19CRU5ELiAqLwotI2RlZmluZSBPSV9DUFVfQVJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDMgICAgICAgICAgICAgICAgICAgICAvKio8IEFSQyBwcm9jZXNzb3IgZmFtaWx5LiAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGRlcHJlY2F0ZWQgVXNlICNPSV9DUFVfQVJDX0xFTkQgb3IgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjT0lfQ1BVX0FSQ19CRU5ELiAqLwotI2RlZmluZSBPSV9DUFVfU0gzIDQgICAgLyoqPCBIaXRhY2hpIFNILTMgcHJvY2Vzc29yIGZhbWlseSAqLwotI2RlZmluZSBPSV9DUFVfSDggNSAgICAgLyoqPCBIaXRhY2hpIEg4IHByb2Nlc3NvciBmYW1pbHkgKi8KLSNkZWZpbmUgT0lfQ1BVX01JUFMgNiAgIC8qKjwgTUlQUyBwcm9jZXNzb3IgZmFtaWx5ICovCi0jZGVmaW5lIE9JX0NQVV9TUEFSQyA3ICAvKio8IFNQQVJDIHByb2Nlc3NvciBmYW1pbHkgKi8KLSNkZWZpbmUgT0lfQ1BVX002ODAwMCA4IC8qKjwgTW90b3JvbGEgTTY4MDAwIHByb2Nlc3NvciBmYW1pbHkgKi8KLSNkZWZpbmUgT0lfQ1BVX1BQQyA5ICAgIC8qKjwgUG93ZXJQQyAoUFBDKSBwcm9jZXNzb3IgZmFtaWx5ICovCi0jZGVmaW5lIE9JX0NQVV9TSDRfNzc1MCBcCi0gIDEwICAgICAgICAgICAgICAgICAgLyoqPCBIaXRhY2hpIFNINzc1MCBzZXJpZXMgaW4gU0gtNCBwcm9jZXNzb3IgZmFtaWx5ICovCi0jZGVmaW5lIE9JX0NQVV9TSDIgMTEgLyoqPCBIaXRhY2hpIFNILTIgcHJvY2Vzc29yIGZhbWlseSAqLwotI2RlZmluZSBPSV9DUFVfQVJNN19MRU5EIDEyIC8qKjwgQVJNNywgbGl0dGxlLWVuZGlhbiAqLwotI2RlZmluZSBPSV9DUFVfQVJNN19CRU5EIDEzIC8qKjwgQVJNNywgYmlnLWVuZGlhbiAqLwotI2RlZmluZSBPSV9DUFVfR0RNMTIwMiAxNCAgIC8qKjwgR0NUIEdETTEyMDIgKi8KLSNkZWZpbmUgT0lfQ1BVX0FSQ19MRU5EIDE1ICAvKio8IEFSQyBwcm9jZXNzb3IgZmFtaWx5LCBsaXR0bGUtZW5kaWFuICovCi0jZGVmaW5lIE9JX0NQVV9BUkNfQkVORCAxNiAgLyoqPCBBUkMgcHJvY2Vzc29yIGZhbWlseSwgYmlnLWVuZGlhbiAqLwotI2RlZmluZSBPSV9DUFVfTTMwODMzRiAxNyAgIC8qKjwgTWl0c3ViaXNoaSBNMzA4IHByb2Nlc3NvciBmYW1pbHkgKi8KLSNkZWZpbmUgT0lfQ1BVX0NSMTZDIDE4ICAvKio8IE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMTYgYml0IHByb2Nlc3NvciBmYW1pbHkgKi8KLSNkZWZpbmUgT0lfQ1BVX002NDExMSAxOSAvKio8IFJlbmVzYXMgTTY0MTExIHByb2Nlc3NvciAoTTMyUiBmYW1pbHkpICovCi0jZGVmaW5lIE9JX0NQVV9BUk1WNV9MRU5EIDIwICAvLyo8IEFSTTUsIGxpdHRsZS1lbmRpYW4gKi8KLQotI2RlZmluZSBPSV9DUFVfVFlQRSAxMgotCi0jaWZuZGVmIE9JX0NQVV9UWVBFCi0jZXJyb3IgIk9JX0NQVV9UWVBFIHR5cGUgbm90IGRlZmluZWQiCi0jZW5kaWYKLQotLyoqQH0qLwotCi0vKiogQG5hbWUgRGVmaW5pdGlvbnMgaW5kaWNhdGluZyBieXRlLXdpc2UgZW5kaWFubmVzcyBvZiB0YXJnZXQgQ1BVCi0gKiAgQHsKLSAqLwotCi0jZGVmaW5lIE9JX0JJR19FTkRJQU5fQllURV9PUkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDAgLyoqPCBNdWx0aXBsZS1ieXRlIHZhbHVlcyBhcmUgc3RvcmVkIGluIG1lbW9yeSBiZWdpbm5pbmcgd2l0aCB0aGUgbW9zdCBcCi0gICAgICAgc2lnbmlmaWNhbnQgYnl0ZSBhdCB0aGUgbG93ZXN0IGFkZHJlc3MuICAqLwotI2RlZmluZSBPSV9MSVRUTEVfRU5ESUFOX0JZVEVfT1JERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMSAvKio8IE11bHRpcGxlLWJ5dGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gbWVtb3J5IGJlZ2lubmluZyB3aXRoIHRoZSBsZWFzdCBcCi0gICAgICAgc2lnbmlmaWNhbnQgYnl0ZSBhdCB0aGUgbG93ZXN0IGFkZHJlc3MuICovCi0KLS8qKkB9Ki8KLQotLyoqIEBuYW1lICBDUFUvY29tcGlsZXItaW5kZXBlbmRlbnQgcHJpbWl0aXZlIGRhdGEgdHlwZSBkZWZpbml0aW9ucwotICogIEB7Ci0gKi8KLQotdHlwZWRlZiBpbnQKLSAgICBPSV9CT09MOyAvKio8IEJvb2xlYW4gdmFsdWVzIHVzZSBuYXRpdmUgaW50ZWdlciBkYXRhIHR5cGUgZm9yIHRhcmdldCBDUFUuICovCi10eXBlZGVmIGludAotICAgIE9JX0lOVDsgLyoqPCBJbnRlZ2VyIHZhbHVlcyB1c2UgbmF0aXZlIGludGVnZXIgZGF0YSB0eXBlIGZvciB0YXJnZXQgQ1BVLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT0lfVUlOVDsgIC8qKjwgVW5zaWduZWQgaW50ZWdlciB2YWx1ZXMgdXNlIG5hdGl2ZSB1bnNpZ25lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgZGF0YSB0eXBlIGZvciB0YXJnZXQgQ1BVLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9JX0JZVEU7IC8qKjwgUmF3IGJ5dGVzIHR5cGUgdXNlcyBuYXRpdmUgY2hhcmFjdGVyIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZvciB0YXJnZXQgQ1BVLiAqLwotdHlwZWRlZiB1aW50MzJfdCBPSV9FTEVNRU5UX1VOSU9OOyAvKio8IFR5cGUgZm9yIGZpcnN0IGVsZW1lbnQgb2YgYSB1bmlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGFsbCBkYXRhIHR5cGVzIHVwIHRvIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGguICovCi0KLS8qKkB9Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9YODYKLQotI2RlZmluZSBPSV9DUFVfQllURV9PUkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgT0lfTElUVExFX0VORElBTl9CWVRFX09SREVSIC8qKjwgeDg2IHBsYXRmb3JtIGJ5dGUgb3JkZXJpbmcgaXMgbGl0dGxlLWVuZGlhbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9BUk0KLS8qIFRoaXMgQ1BVIHR5cGUgaXMgZGVwcmVjYXRlZCAocmVtb3ZlZCBmcm9tIHVzZSkuIEluc3RlYWQsIHVzZSBPSV9DUFVfQVJNN19MRU5ECi0gKiBvciBPSV9DUFVfQVJNN19CRU5EIGZvciBsaXR0bGUtZW5kaWFuIG9yIGJpZy1lbmRpYW4gY29uZmlndXJhdGlvbnMgb2YgdGhlCi0gKiBBUk03LCByZXNwZWN0aXZlbHkuICovCi0jZXJyb3IgT0lfQ1BVX0FSTSBpcyBkZXByZWNhdGVkCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9BUkMKLS8qIFRoaXMgQ1BVIHR5cGUgaXMgZGVwcmVjYXRlZCAocmVtb3ZlZCBmcm9tIHVzZSkuIEluc3RlYWQsIHVzZSBPSV9DUFVfQVJDX0xFTkQKLSAqIG9yIE9JX0NQVV9BUkNfQkVORCBmb3IgbGl0dGxlLWVuZGlhbiBvciBiaWctZW5kaWFuIGNvbmZpZ3VyYXRpb25zIG9mIHRoZQotICogQVJDLCByZXNwZWN0aXZlbHkuICovCi0jZXJyb3IgT0lfQ1BVX0FSQyBpcyBkZXByZWNhdGVkCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9TSDMKLS8qIFRoZSBIaXRhY2hpIFNIIEMgY29tcGlsZXIgZGVmaW5lcyBfTElUIG9yIF9CSUcsIGRlcGVuZGluZyBvbiB0aGUgZW5kaWFubmVzcwotICAgIHNwZWNpZmllZCB0byB0aGUgY29tcGlsZXIgb24gdGhlIGNvbW1hbmQgbGluZS4gKi8KLSNpZiBkZWZpbmVkKF9MSVQpCi0jZGVmaW5lIE9JX0NQVV9CWVRFX09SREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgT0lfTElUVExFX0VORElBTl9CWVRFX09SREVSIC8qKjwgSWYgX0xJVCBpcyBkZWZpbmVkLCBTSC0zIHBsYXRmb3JtIGJ5dGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJpbmcgaXMgbGl0dGxlLWVuZGlhbi4gKi8KLSNlbGlmIGRlZmluZWQoX0JJRykKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBPSV9CSUdfRU5ESUFOX0JZVEVfT1JERVIgLyoqPCBJZiBfQklHIGlzIGRlZmluZWQsIFNILTMgcGxhdGZvcm0gYnl0ZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmluZyBpcyBiaWctZW5kaWFuLiAqLwotI2Vsc2UKLSNlcnJvciBTSCBjb21waWxlciBlbmRpYW5uZXNzIHVuZGVmaW5lZAotI2VuZGlmCi0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9TSDIKLQotI2RlZmluZSBPSV9DUFVfQllURV9PUkRFUiBcCi0gIE9JX0JJR19FTkRJQU5fQllURV9PUkRFUiAvKio8IFNILTIgcGxhdGZvcm0gYnl0ZSBvcmRlcmluZyBpcyBiaWctZW5kaWFuLiAqLwotCi0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBPSV9DUFVfVFlQRSA9PSBPSV9DUFVfSDgKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgT0lfQklHX0VORElBTl9CWVRFX09SREVSCi0jZXJyb3IgYmFzaWMgdHlwZXMgbm90IGRlZmluZWQKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgT0lfQ1BVX1RZUEUgPT0gT0lfQ1BVX01JUFMKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgT0lfTElUVExFX0VORElBTl9CWVRFX09SREVSCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9TUEFSQwotI2RlZmluZSBPSV9DUFVfQllURV9PUkRFUiBPSV9MSVRUTEVfRU5ESUFOX0JZVEVfT1JERVIKLSNlcnJvciBiYXNpYyB0eXBlcyBub3QgZGVmaW5lZAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBPSV9DUFVfVFlQRSA9PSBPSV9DUFVfTTY4MDAwCi0jZGVmaW5lIE9JX0NQVV9CWVRFX09SREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgT0lfQklHX0VORElBTl9CWVRFX09SREVSIC8qKjwgTTY4MDAwIHBsYXRmb3JtIGJ5dGUgb3JkZXJpbmcgaXMgYmlnLWVuZGlhbi4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgT0lfQ1BVX1RZUEUgPT0gT0lfQ1BVX1BQQwotI2RlZmluZSBPSV9DUFVfQllURV9PUkRFUiBPSV9CSUdfRU5ESUFOX0JZVEVfT1JERVIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgT0lfQ1BVX1RZUEUgPT0gT0lfQ1BVX1NINF83NzUwCi0jZGVmaW5lIE9JX0NQVV9CWVRFX09SREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgT0lfQklHX0VORElBTl9CWVRFX09SREVSIC8qKjwgU0g3NzUwIHBsYXRmb3JtIGJ5dGUgb3JkZXJpbmcgaXMgYmlnLWVuZGlhbi4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgT0lfQ1BVX1RZUEUgPT0gT0lfQ1BVX0FSTTdfTEVORAotI2RlZmluZSBPSV9DUFVfQllURV9PUkRFUiBPSV9MSVRUTEVfRU5ESUFOX0JZVEVfT1JERVIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgT0lfQ1BVX1RZUEUgPT0gT0lfQ1BVX0FSTTdfQkVORAotI2RlZmluZSBPSV9DUFVfQllURV9PUkRFUiBPSV9CSUdfRU5ESUFOX0JZVEVfT1JERVIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgT0lfQ1BVX1RZUEUgPT0gT0lfQ1BVX0dETTEyMDIKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgT0lfQklHX0VORElBTl9CWVRFX09SREVSCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9BUkNfTEVORAotCi0jZGVmaW5lIE9JX0NQVV9CWVRFX09SREVSIE9JX0xJVFRMRV9FTkRJQU5fQllURV9PUkRFUgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBPSV9DUFVfVFlQRSA9PSBPSV9DUFVfQVJDX0JFTkQKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgT0lfQklHX0VORElBTl9CWVRFX09SREVSCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9NMzA4MzNGCi0jZGVmaW5lIE9JX0NQVV9CWVRFX09SREVSIE9JX0xJVFRMRV9FTkRJQU5fQllURV9PUkRFUgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBPSV9DUFVfVFlQRSA9PSBPSV9DUFVfQ1IxNkMKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgT0lfTElUVExFX0VORElBTl9CWVRFX09SREVSCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9NNjQxMTEKLSNkZWZpbmUgT0lfQ1BVX0JZVEVfT1JERVIgT0lfQklHX0VORElBTl9CWVRFX09SREVSCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIE9JX0NQVV9UWVBFID09IE9JX0NQVV9BUk1WNV9MRU5ECi0jZGVmaW5lIE9JX0NQVV9CWVRFX09SREVSIE9JX0xJVFRMRV9FTkRJQU5fQllURV9PUkRFUgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgT0lfQ1BVX0JZVEVfT1JERVIKLSNlcnJvciAiQnl0ZSBvcmRlciAoZW5kaWFuLW5lc3MpIG5vdCBkZWZpbmVkIgotI2VuZGlmCi0KLS8qKkB9Ki8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNlbmRpZiAvKiBfT0lfQ1BVX0RFUF9IICovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9tb2R1bGVzLmggYi9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9tb2R1bGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmEzMWEuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfbW9kdWxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX09JX01PRFVMRVNfSAotI2RlZmluZSBfT0lfTU9EVUxFU19ICi0vKioKLSAqIEBmaWxlCi0gKgotICogRW51bWVyYXRpb24gdHlwZSBkZWZpbmluZyB0aGUgaW5pZGl2dWFsIHN0YWNrIGNvbXBvbmVudHMuCi0gKgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqIFxhZGR0b2dyb3VwIE1pc2MgTWlzY2VsbGFuZW91cyBBUElzICovCi0vKipAeyovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBUaGlzIGVudW1lcmF0aW9uIGxpc3RzIGNvbnN0YW50cyBmb3IgcmVmZXJlbmNpbmcgdGhlIGNvbXBvbmVudHMgb2YKLSAqIHRoZSBCTFVFbWFnaWMgMy4wIHByb3RvY29sIHN0YWNrLCBwcm9maWxlcywgYW5kIG90aGVyIGZ1bmN0aW9uYWxpdGllcy4KLSAqCi0gKiBJbiBvcmRlciB0byBkaXN0aW5ndWlzaCB0eXBlcyBvZiBtb2R1bGVzLCBpdGVtcyBhcmUgZ3JvdXBlZCB3aXRoIG1hcmtlcnMgdG8KLSAqIGRlbGluZWF0ZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBncm91cHMKLSAqCi0gKiBUaGUgbW9kdWxlIHR5cGUgaXMgdXNlZCBmb3IgdmFyaW91cyBwdXJwb3NlczoKLSAqICAgICAgaWRlbnRpZmljYXRpb24gaW4gZGVidWcgcHJpbnQgc3RhdGVtZW50cwotICogICAgICBhY2Nlc3MgdG8gaW5pdGlhbGl6YXRpb24gZmxhZ3MKLSAqICAgICAgYWNjZXNzIHRvIHRoZSBjb25maWd1cmF0aW9uIHRhYmxlCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgLyogcHJvZmlsZXMgYW5kIHByb3RvY29scyAgLS0+IFVwZGF0ZXMgdG8gb2lfZGVidWcuYyBhbmQgb2lfY29uZmlnX3RhYmxlLmMgKi8KLQotICAvKiAgIFhYIC0tPiBLZWVwIEVudW0gdmFsdWVzIHVwLXRvLWRhdGUhICovCi0gIE9JX01PRFVMRV9BVCwgICAgICAgICAgIC8qKjwgMDAgQVQgY29tbWFuZCBwcm9jZXNzaW5nICovCi0gIE9JX01PRFVMRV9BMkRQLCAgICAgICAgIC8qKjwgMDEgQWR2YW5jZWQgQXVkaW8gRGlzdHJpYnV0aW9uIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX0FWQ1RQLCAgICAgICAgLyoqPCAwMiBBdWRpby1WaXN1YWwgQ29udHJvbCBUcmFuc3BvcnQgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfQVZEVFAsICAgICAgICAvKio8IDAzIEF1ZGlvLVZpc3VhbCBEaXN0cmlidXRpb24gUHJvdG9jb2wgKi8KLSAgT0lfTU9EVUxFX0FWUkNQLCAgICAgICAgLyoqPCAwNCBBdWRpby1WaXN1YWwgUmVtb3RlIENvbnRyb2wgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfQklQX0NMSSwgICAgICAvKio8IDA1IEJhc2ljIEltYWdpbmcgUHJvZmlsZSBwcm90b2NvbCBjbGllbnQgKi8KLSAgT0lfTU9EVUxFX0JJUF9TUlYsICAgICAgLyoqPCAwNiBCYXNpYyBJbWFnaW5nIFByb2ZpbGUgcHJvdG9jb2wgc2VydmVyICovCi0gIE9JX01PRFVMRV9CTkVQLCAgICAgICAgIC8qKjwgMDcgQmx1ZXRvb3RoIE5ldHdvcmsgRW5jYXBzdWxhdGlvbiBQcm90b2NvbCAqLwotICBPSV9NT0RVTEVfQlBQX1NFTkRFUiwgICAvKio8IDA4IEJhc2ljIFByaW50aW5nIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX0JQUF9QUklOVEVSLCAgLyoqPCAwOSBCYXNpYyBQcmludGluZyBQcm9maWxlICovCi0gIE9JX01PRFVMRV9DVFAsICAgICAgICAgIC8qKjwgMTAgQ29yZGxlc3MgVGVsZXBob255IFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX0RVTiwgICAgICAgICAgLyoqPCAxMSBEaWFsLVVwIE5ldHdvcmtpbmcgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfRkFYLCAgICAgICAgICAvKio8IDEyIEZheCBQcm9maWxlICovCi0gIE9JX01PRFVMRV9GVFBfQ0xJLCAgICAgIC8qKjwgMTMgRmlsZSBUcmFuc2ZlciBQcm9maWxlIHByb3RvY29sIGNsaWVudCAqLwotICBPSV9NT0RVTEVfRlRQX1NSViwgICAgICAvKio8IDE0IEZpbGUgVHJhbnNmZXIgUHJvZmlsZSBwcm90b2NvbCBzZXJ2ZXIgKi8KLSAgT0lfTU9EVUxFX0hBTkRTRlJFRSwgICAgLyoqPCAxNSBIYW5kcy1GcmVlIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX0hBTkRTRlJFRV9BRywgLyoqPCAxNiBIYW5kcy1GcmVlIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX0hDUlBfQ0xJLCAgICAgLyoqPCAxNyBIYXJkY29weSBDYWJsZSBSZXBsYWNlbWVudCBQcm9maWxlICovCi0gIE9JX01PRFVMRV9IQ1JQX1NSViwgICAgIC8qKjwgMTggSGFyZGNvcHkgQ2FibGUgUmVwbGFjZW1lbnQgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfSEVBRFNFVCwgICAgICAvKio8IDE5IEhlYWRzZXQgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfSEVBRFNFVF9BRywgICAvKio8IDIwIEhlYWRzZXQgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfSElELCAgICAgICAgICAvKio8IDIxIEh1bWFuIEludGVyZmFjZSBEZXZpY2UgcHJvZmlsZSAqLwotICBPSV9NT0RVTEVfSU5URVJDT00sICAgICAvKio8IDIyIEludGVyY29tIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX09CRVhfQ0xJLCAgICAgLyoqPCAyMyBPQkVYIHByb3RvY29sIGNsaWVudCwgR2VuZXJpYyBPYmplY3QgRXhjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfT0JFWF9TUlYsICAgICAvKio8IDI0IE9CRVggcHJvdG9jb2wgc2VydmVyLCBHZW5lcmljIE9iamVjdCBFeGNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlICovCi0gIE9JX01PRFVMRV9PUFBfQ0xJLCAgICAgIC8qKjwgMjUgT2JqZWN0IFB1c2ggUHJvZmlsZSBwcm90b2NvbCBjbGllbnQgKi8KLSAgT0lfTU9EVUxFX09QUF9TUlYsICAgICAgLyoqPCAyNiBPYmplY3QgUHVzaCBQcm9maWxlIHByb3RvY29sIHNlcnZlciAqLwotICBPSV9NT0RVTEVfUEFOLCAgICAgICAgICAvKio8IDI3IFBBTiBwcm9maWxlICovCi0gIE9JX01PRFVMRV9QQkFQX0NMSSwgICAgIC8qKjwgMjggUGhvbmVib29rIEFjY2VzcyBQcm9maWxlIGNsaWVudCAqLwotICBPSV9NT0RVTEVfUEJBUF9TUlYsICAgICAvKio8IDI5IFBob25lYm9vayBBY2Nlc3MgUHJvZmlsZSBzZXJ2ZXIgKi8KLSAgT0lfTU9EVUxFX1NBUF9DTEksICAgICAgLyoqPCAzMCBTSU0gQWNjZXNzIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX1NBUF9TUlYsICAgICAgLyoqPCAzMSBTSU0gQWNjZXNzIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX1NQUCwgICAgICAgICAgLyoqPCAzMiBTZXJpYWwgUG9ydCBQcm9maWxlICovCi0gIE9JX01PRFVMRV9TWU5DX0NMSSwgICAgIC8qKjwgMzMgU3luY2hyb25pemF0aW9uIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX1NZTkNfU1JWLCAgICAgLyoqPCAzNCBTeW5jaHJvbml6YXRpb24gUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfU1lOQ19DTURfQ0xJLCAvKio8IDM1IFN5bmNocm9uaXphdGlvbiBQcm9maWxlICovCi0gIE9JX01PRFVMRV9TWU5DX0NNRF9TUlYsIC8qKjwgMzYgU3luY2hyb25pemF0aW9uIFByb2ZpbGUgKi8KLSAgT0lfTU9EVUxFX1NZTkNNTCwgICAgICAgLyoqPCAzNyBTeW5jTUwgUHJvZmlsZSAqLwotICBPSV9NT0RVTEVfVENTLCAgICAgICAgICAvKio8IDM4IFRDUyBCaW5hcnkgKi8KLSAgT0lfTU9EVUxFX1ZEUCwgICAgICAgICAgLyoqPCAzOSBWaWRlbyBEaXN0cmlidXRpb24gUHJvZmlsZSAqLwotCi0gIC8qIGNvcmVzdGFjayBjb21wb25lbnRzICAgLS0+IFVwZGF0ZXMgdG8gb2lfZGVidWcuYyBhbmQgb2lfY29uZmlnX3RhYmxlLmMgKi8KLQotICBPSV9NT0RVTEVfQ09NTU9OX0NPTkZJRywgLyoqPCA0MCBDb21tb24gY29uZmlndXJhdGlvbiwgbW9kdWxlIGhhcyBubyBtZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciB0aGFuIGZvciBjb25maWcgc3RydWN0ICovCi0gIE9JX01PRFVMRV9DTURDSEFJTiwgICAgICAvKio8IDQxIENvbW1hbmQgY2hhaW5pbmcgdXRpbGl0eSAqLwotICBPSV9NT0RVTEVfRElTUEFUQ0gsICAgICAgLyoqPCA0MiBEaXNwYXRjaGVyICovCi0gIE9JX01PRFVMRV9EQVRBRUxFTSwgICAgICAvKio8IDQzIERhdGEgRWxlbWVudHMsIG1hcnNoYWxsZXIgKi8KLSAgT0lfTU9EVUxFX0RFVk1HUiwgICAgICAgIC8qKjwgNDQgRGV2aWNlIE1hbmFnZXIgKi8KLSAgT0lfTU9EVUxFX0RFVk1HUl9NT0RFUywgIC8qKjwgNDUgRGV2aWNlIE1hbmFnZXIgY29ubmVjdGFiaWxpdHkvZGlzY292ZXJhYmlsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlcyAqLwotICBPSV9NT0RVTEVfSENJLCAgICAgICAgICAgLyoqPCA0NiBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGNvbW1hbmQgbGF5ZXIgKi8KLSAgT0lfTU9EVUxFX0wyQ0FQLCAgICAgICAgIC8qKjwgNDcgTDJDQVAgKi8KLSAgT0lfTU9EVUxFX01FTU1HUiwgICAgICAgIC8qKjwgNDggbW9kdWxlcyB0aGF0IGRvIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0gIE9JX01PRFVMRV9QT0xJQ1lNR1IsICAgICAvKio8IDQ5IFBvbGljeSBNYW5hZ2VyICovCi0gIE9JX01PRFVMRV9SRkNPTU0sICAgICAgICAvKio8IDUwIFJGQ09NTSAqLwotICBPSV9NT0RVTEVfUkZDT01NX1NELCAgICAgLyoqPCA1MSBSRkNPTU0gU2VydmljZSBkaXNjb3ZlcnkgKi8KLSAgT0lfTU9EVUxFX1NEUF9DTEksICAgICAgIC8qKjwgNTIgU2VydmljZSBEaXNjb3ZlcnkgUHJvdG9jb2wgY2xpZW50ICovCi0gIE9JX01PRFVMRV9TRFBfU1JWLCAgICAgICAvKio8IDUzIFNlcnZpY2UgRGlzY292ZXJ5IFByb3RvY29sIHNlcnZlciAqLwotICBPSV9NT0RVTEVfU0RQREIsICAgICAgICAgLyoqPCA1NCBTZXJ2aWNlIERpc2NvdmVyeSBQcm90b2NvbCBkYXRhYmFzZSAqLwotICBPSV9NT0RVTEVfU0VDTUdSLCAgICAgICAgLyoqPCA1NSBTZWN1cml0eSBNYW5hZ2VyICovCi0gIE9JX01PRFVMRV9TTklGRkxPRywgICAgICAvKio8IDU2IHNuaWZmIGxvZyAqLwotICBPSV9NT0RVTEVfU1VQUE9SVCwgLyoqPCA1NyBzdXBwb3J0IGZ1bmN0aW9ucywgaW5jbHVkaW5nIENUaHJ1IERpc3BhdGNoZXIsIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucywgYW5kIHN0YWNrIGluaXRpYWxpemF0aW9uICovCi0gIE9JX01PRFVMRV9UUkFOU1BPUlQsIC8qKjwgNTggdHJhbnNwb3J0IGxheWVyIGJldHdlZW4gSENJIGNvbW1hbmQgbGF5ZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciAqLwotICBPSV9NT0RVTEVfVEVTVCwgLyoqPCA1OSB1c2VkIHRvIGRlYnVnIG91dHB1dCBmcm9tIGludGVybmFsIHRlc3QgcHJvZ3JhbXMgKi8KLSAgT0lfTU9EVUxFX1hNTCwgIC8qKjwgNjAgWE1ML0NTUyBwYXJzZXIgKi8KLQotICBPSV9NT0RVTEVfREksIC8qKjwgNjEgRGV2aWNlIElkZW50aWZpY2F0aW9uIFByb2ZpbGUgKi8KLQotICAvLyBiaGFwaSBjb21wb25lbnRzICAtLT4gVXBkYXRlcyB0byBvaV9kZWJ1Zy5jCi0KLSAgT0lfTU9EVUxFX0JIQVBJLCAgICAgICAgICAgLyoqPCA2MiBCTFVFbWFnaWMgSG9zdCBBUEkgZ2VuZXJpYyAqLwotICBPSV9NT0RVTEVfQkhDTEksICAgICAgICAgICAvKio8IDYzIEJMVUVtYWdpYyBIb3N0IEFQSSBjbGllbnQgc2lkZSAqLwotICBPSV9NT0RVTEVfQkhTUlYsICAgICAgICAgICAvKio8IDY0IEJMVUVtYWdpYyBIb3N0IEFQSSBzZXJ2ZXIgc2lkZSAqLwotICBPSV9NT0RVTEVfTVNHUSwgICAgICAgICAgICAvKio8IDY1IG1vZHVsZSB0aGF0IGhhbmRsZXMgbWVzc2FnZSBxdWV1aW5nICovCi0gIE9JX01PRFVMRV9CSEFQSV9UUkFOU1BPUlQsIC8qKjwgNjYgbW9kdWxlIHRoYXQgaGFuZGxlcyBtZXNzYWdlIHF1ZXVpbmcgKi8KLSAgT0lfTU9EVUxFX0JMU1RfU1JWLCAvKio8IDY3IG1vZHVsZSB0aGF0IHByb3ZpZGVzIHNlcnZlciBzaWRlIEJIQVBJIExpZ2h0d2VpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsIFRyYW5zcG9ydCAqLwotICBPSV9NT0RVTEVfQkxTVF9DTEksIC8qKjwgNjggbW9kdWxlIHRoYXQgcHJvdmlkZXMgY2xpZW50IHNpZGUgQkhBUEkgTGlnaHR3ZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWwgVHJhbnNwb3J0ICovCi0KLSAgLy8gT0VNIGZpbGVzIC0tPiBVcGRhdGVzIHRvIG9pX2RlYnVnLmMKLSAgT0lfTU9EVUxFX09FTSwgLyoqPCA2OSBBcHBsaWNhdGlvbiBNZW1vcnkgYWxsb2NhdGlvbiAqLwotCi0gIC8vIEFwcGxpY2F0aW9uIGdsdWUgLS0+IFVwZGF0ZXMgdG8gb2lfZGVidWcuYwotICBPSV9NT0RVTEVfQVBQLCAvKio8IDcwIEFwcGxpY2F0aW9uIE1lbW9yeSBhbGxvY2F0aW9uICovCi0KLSAgLyogdmFyaW91cyBwaWVjZXMgb2YgY29kZSBkZXBlbmQgb24gdGhlc2UgbGFzdCAyIGVsZW1lbnRzIG9jY3VyaW5nIGluIGEKLSAgICAgc3BlY2lmaWMgb3JkZXI6Ci0gICAgIE9JX01PRFVMRV9BTEwgbXVzdCBiZSB0aGUgMm5kIHRvIGxhc3QgZWxlbWVudAotICAgICBPSV9NT0RVTEVfVU5LTk9XTiBtdXN0IGJlIHRoZSBsYXN0IGVsZW1lbnQKLSAgICAgKi8KLSAgT0lfTU9EVUxFX0FMTCwgICAgLyoqPCA3MSBzcGVjaWFsIHZhbHVlIGlkZW50aWZ5aW5nIGFsbCBtb2R1bGVzIC0gdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBvZiBkZWJ1ZyBwcmludCBzdGF0ZW1lbnRzICovCi0gIE9JX01PRFVMRV9VTktOT1dOIC8qKjwgNzIgc3BlY2lhbCB2YWx1ZSAtIHVzZWQgZm9yIGRlYnVnIHByaW50IHN0YXRlbWVudHMgKi8KLX0gT0lfTU9EVUxFOwotCi0vKioKLSAqIFRoaXMgY29uc3RhbnQgaXMgdGhlIG51bWJlciBvZiBhY3R1YWwgbW9kdWxlcyBpbiB0aGUgbGlzdC4gIEFMTCBhbmQgVU5LTk9XTgotICogYXJlIHNwZWNpYWwgdmFsdWVzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSBtb2R1bGVzLgotICogVXNlZCBmb3IgZGVidWcgcHJpbnQgYW5kIG1lbW1nciBwcm9maWxpbmcKLSAqLwotI2RlZmluZSBPSV9OVU1fTU9EVUxFUyBPSV9NT0RVTEVfQUxMCi0KLS8qKgotICogVGhpcyBjb25zdGFudCBpcyB0aGUgbnVtYmVyIG9mIHByb2ZpbGUgYW5kIGNvcmUgY29tcG9uZW50cy4gIEl0IGlzIHVzZWQgdG8KLSAqIHNpemUgdGhlIGluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uIHRhYmxlcy4KLSAqLwotI2RlZmluZSBPSV9OVU1fU1RBQ0tfTU9EVUxFUyBPSV9NT0RVTEVfQkhBUEkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyoqQH0qLwotCi0jZW5kaWYgLyogX09JX01PRFVMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfb3NpbnRlcmZhY2UuaCBiL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX29zaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjBjYTcuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfb3NpbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMiAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9PSV9PU0lOVEVSRkFDRV9ICi0jZGVmaW5lIF9PSV9PU0lOVEVSRkFDRV9ICi0vKioKLSBAZmlsZQotICogVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBpbnRlcmZhY2UgZm9yIGZ1bmN0aW9ucyBmb3Igd2hpY2gKLSAqIGltcGxlbWVudGF0aW9uIGlzIHBsYXRmb3JtLXNwZWNpZmljLgotICoKLSAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBoZWFkZXIgZmlsZSBkZWZpbmUgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb3IgaGFyZHdhcmUKLSAqIHNlcnZpY2VzIG5lZWRlZCBieSB0aGUgQkxVRW1hZ2ljIDMuMCBwcm90b2NvbCBzdGFjay4gVGhlCi0gKiBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlc2Ugc2VydmljZXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50LgotICoKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvaV9tb2R1bGVzLmgiCi0jaW5jbHVkZSAib2lfc3RhdHVzLmgiCi0jaW5jbHVkZSAib2lfc3RkZGVmcy5oIgotI2luY2x1ZGUgIm9pX3RpbWUuaCIKLQotLyoqIFxhZGR0b2dyb3VwIE1pc2MgTWlzY2VsbGFuZW91cyBBUElzICovCi0vKipAeyovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBUZXJtaW5hdGVzIGV4ZWN1dGlvbi4KLSAqCi0gKiBAcGFyYW0gcmVhc29uICBSZWFzb24gZm9yIHRlcm1pbmF0aW9uCi0gKi8KLXZvaWQgT0lfRmF0YWxFcnJvcihPSV9TVEFUVVMgcmVhc29uKTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGxvZ3MgYW4gZXJyb3IuCi0gKgotICogV2hlbiBidWlsdCBmb3IgcmVsZWFzZSBtb2RlLCBCTFVFbWFnaWMgMyBlcnJvcnMgYXJlIGxvZ2dlZCB0bwotICogdGhpcyBmdW5jdGlvbi4gKGluIGRlYnVnIG1vZGUsIGVycm9ycyBhcmUgbG9nZ2VkIHZpYQotICogT0lfUHJpbnQoKSkuCi0gKgotICogQHBhcmFtIG1vZHVsZSBNb2R1bGUgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZCAoc2VlCi0gKiAgICAgICAgICAgICAgICBvaV9tb2R1bGVzLmgpCi0gKiBAcGFyYW0gbGluZW5vIExpbmUgbnVtYmVyIG9mIHRoZSBDIGZpbGUgT0lfU0xPR19FUlJPUiBjYWxsZWQKLSAqIEBwYXJhbSBzdGF0dXMgU3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvciBldmVudAotICovCi12b2lkIE9JX0xvZ0Vycm9yKE9JX01PRFVMRSBtb2R1bGUsIE9JX0lOVCBsaW5lbm8sIE9JX1NUQVRVUyBzdGF0dXMpOwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGRlYnVnIGNvZGUgaGFuZGxpbmcuCi0gKgotICogV2hlbiBidWlsdCBmb3IgZGVidWcgbW9kZSwgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBwbGF0Zm9ybQotICogZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIHRvIGhhbmRsZSBtZXNzYWdlIGNvZGVzIHBhc3NlZCBpbgotICogdmlhIE9JX1NldE1zZ0NvZGUoKS4KLSAqLwotdm9pZCBPSV9Jbml0RGVidWdDb2RlSGFuZGxlcih2b2lkKTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSB0aW1lIGZyb20gdGhlIHJlYWwgdGltZSBjbG9jay4KLSAqCi0gKiBBbGwgdGltaW5nIGluIEJNMyBpcyByZWxhdGl2ZSwgdHlwaWNhbGx5IGEgZ3JhbnVsYXJpdHkKLSAqIG9mIDUgb3IgMTAgbXNlY3MgaXMgYWRlcXVhdGUuCi0gKgotICogQHBhcmFtW291dF0gbm93ICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd2hpY2ggdGhlIGN1cnJlbnQKLSAqICAgICAgIHRpbWUgd2lsbCBiZSByZXR1cm5lZAotICovCi12b2lkIE9JX1RpbWVfTm93KE9JX1RJTUUqIG5vdyk7Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBjYXVzZXMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHNsZWVwIGZvciB0aGUKLSAqIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAotICogd2l0aG91dCB0aGUgc3RhY2sgYWNjZXNzIHRva2VuLgotICoKLSAqIEBub3RlIEJNMyBjb3Jlc3RhY2sgYW5kIHByb2ZpbGVzIG5ldmVyIHN1c3BlbmQgYW5kIG5ldmVyIGNhbGwKLSAqIE9JX1NsZWVwLiBUaGUgdXNlIG9mIE9JX1NsZWVwIGlzIGxpbWl0ZWQgdG8gYXBwbGljYXRpb25zIGFuZAotICogcGxhdGZvcm0tc3BlY2lmaWMgY29kZS4KLSAqCi0gKiBJZiB5b3VyIHBvcnQgYW5kIGFwcGxpY2F0aW9ucyBuZXZlciB1c2UgT0lfU2xlZXAsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGxlZnQKLSAqIHVuaW1wbGVtZW50ZWQuCi0gKgotICogQHBhcmFtIG1pbGxpc2Vjb25kcyAgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcAotICovCi12b2lkIE9JX1NsZWVwKHVpbnQzMl90IG1pbGxpc2Vjb25kcyk7Ci0KLS8qKgotICogRGVmaW5lcyBmb3IgbWVzc2FnZSB0eXBlIGNvZGVzLgotICovCi0jZGVmaW5lIE9JX01TR19DT0RFX0FQUExJQ0FUSU9OIDAgLyoqPCBBcHBsaWNhdGlvbiBvdXRwdXQgKi8KLSNkZWZpbmUgT0lfTVNHX0NPREVfRVJST1IgMSAgICAgICAvKio8IEVycm9yIG1lc3NhZ2Ugb3V0cHV0ICovCi0jZGVmaW5lIE9JX01TR19DT0RFX1dBUk5JTkcgMiAgICAgLyoqPCBXYXJuaW5nIG1lc3NhZ2Ugb3V0cHV0ICovCi0jZGVmaW5lIE9JX01TR19DT0RFX1RSQUNFIDMgICAgICAgLyoqPCBVc2VyIEFQSSBmdW5jdGlvbiB0cmFjZSBvdXRwdXQgKi8KLSNkZWZpbmUgT0lfTVNHX0NPREVfUFJJTlQxIDQgICAgICAvKio8IENhdGFnb3J5IDEgZGVidWcgcHJpbnQgb3V0cHV0ICovCi0jZGVmaW5lIE9JX01TR19DT0RFX1BSSU5UMiA1ICAgICAgLyoqPCBDYXRhZ29yeSAyIGRlYnVnIHByaW50IG91dHB1dCAqLwotI2RlZmluZSBPSV9NU0dfQ09ERV9IRUFERVIgNiAgICAgIC8qKjwgRXJyb3IvRGVidWcgb3V0cHV0IGhlYWRlciAqLwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0ZXh0IGJlaW5nIG91dHB1dCB3aXRoCi0gKiBPSV9QcmludCgpLiBGb3IgdGhlIExpbnV4IGFuZCBXaW4zMiBwbGF0Zm9ybXMsIGl0IHdpbGwgc2V0Ci0gKiB0aGUgY29sb3Igb2YgdGhlIHRleHQuIE90aGVyIHBvc3NpYmxlIHVzZXMgY291bGQgYmUgdG8gaW5zZXJ0Ci0gKiBIVE1MIHN0eWxlIHRhZ3MsIGFkZCBzb21lIG90aGVyIG1lc3NhZ2UgdHlwZSBpbmRpY2F0aW9uLCBvcgotICogYmUgY29tcGxldGVseSBpZ25vcmVkIGFsdG9nZXRoZXIuCi0gKgotICogQHBhcmFtIGNvZGUgIE9JX01TR19DT0RFXyogaW5kaWNhdGluZyBzZXR0aW5nIHRoZSBtZXNzYWdlIHR5cGUuCi0gKi8KLXZvaWQgT0lfU2V0TXNnQ29kZSh1aW50OF90IGNvZGUpOwotCi0vKioKLSAqIEFsbCBvdXRwdXQgZnJvbSBPSV9QcmludGYoKSBhbmQgYWxsIGRlYnVnIG91dHB1dCBpcyBzZW50IHRvIE9JX1ByaW50LgotICogVHlwaWNhbGx5LCBpZiB0aGUgcGxhdGZvcm0gaGFzIGEgY29uc29sZSwgT0lfUHJpbnQoKSBpcyBzZW50IHRvIHN0ZG91dC4KLSAqIEVtYmVkZGVkIHBsYXRmb3JtcyB0eXBpY2FsbHkgc2VuZCBPSV9QcmludCgpIG91dHB1dCB0byBhIHNlcmlhbCBwb3J0LgotICoKLSAqIEBwYXJhbSBzdHIgIFN0cmluZyB0byBwcmludAotICovCi12b2lkIE9JX1ByaW50KE9JX0NIQVIgY29uc3QqIHN0cik7Ci0KLS8qKgotICogIEluIGNhc2VzIHdoZXJlIE9JX1ByaW50KCkgaXMgc2VuZGluZyBvdXRwdXQgdG8gYSBsb2dmaWxlIGluIGFkZGl0aW9uIHRvCi0gKiAgY29uc29sZSwgaXQgaXMgZGVzaXJhYmxlIHRvIGFsc28gcHV0IGNvbnNvbGUgaW5wdXQgaW50byB0aGUgbG9nZmlsZS4KLSAqICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGNvbnNvbGUgaW5wdXQgcHJvY2Vzcy4KLSAqCi0gKiAgQG5vdGUgVGhpcyBpcyBhbiBvcHRpb25hbCBBUEkgd2hpY2ggaXMgc3RyaWN0bHkKLSAqICBiZXR3ZWVuIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBzdGFja19jb25zb2xlIGFuZCBvc2ludGVyZmFjZQotICogIG1vZHVsZXMuIFRoaXMgQVBJIG5lZWQgb25seSBiZSBpbXBsZW1lbnRlZCBvbiB0aG9zZQotICogIHBsYXRmb3JtcyB3aGVyZSBpcyBzZXJ2ZXMgYSB1c2VmdWwgcHVycG9zZSwgZS5nLiwgd2luMzIuCi0gKgotICogQHBhcmFtIHN0ciAgQ29uc29sZSBpbnB1dCBzdHJpbmcKLSAqLwotCi12b2lkIE9JX1ByaW50X0NvbnNvbGVJbnB1dChPSV9DSEFSIGNvbnN0KiBzdHIpOwotCi0vKioKLSAqICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBDUkMxNiBvZiB0aGUgcHJvZ3JhbSBpbWFnZS4KLSAqLwotdWludDE2X3QgT0lfUHJvZ3JhbUltYWdlQ1JDMTYodm9pZCk7Ci0KLS8qKgotICogV3JpdGVzIGFuIGludGVnZXIgdG8gc3Rkb3V0IGluIGhleC4gVGhpcyBtYWNybyBpcyBpbnRlbmRlZAotICogZm9yIHNlbGVjdGl2ZSB1c2Ugd2hlbiBkZWJ1Z2dpbmcgaW4gc21hbGwgbWVtb3J5Ci0gKiBjb25maWd1cmF0aW9ucyBvciBvdGhlciB0aW1lcyB3aGVuIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UKLSAqIE9JX0RCR1BSSU5ULgotICoKLSAqIEBwYXJhbSBuICB0aGUgaW50ZWdlciB0byBwcmludAotICovCi0KLSNkZWZpbmUgT0lfUHJpbnRfSW50KG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgY29uc3QgT0lfQ0hBUiBfZGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7IFwKLSAgICBPSV9DSEFSIF9idWZbOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBPSV9DSEFSKiBfc3RyID0gJl9idWZbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50MzJfdCBfaSA9IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqX3N0ciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICooLS1fc3RyKSA9IF9kaWdpdHNbKF9pICYgMHhGKV07ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIF9pID4+PSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlIChfaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBPSV9QcmludChfc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0vKioKLSAqICBBcHBsaWNhdGlvbiBEeW5hbWljIE1lbW9yeSBhbGxvY2F0aW9uLgotICoKLSAqICBUaGVzZSBBUElzIGFyZSBwcm92aWRlZCBmb3IgYXBwbGljYXRpb24gdXNlIG9uIHRob3NlCi0gKiAgcGxhdGZvcm1zIHdoaWNoIGhhdmUgbm8gZHluYW1pYyBtZW1vcnkgc3VwcG9ydC4gTWVtb3J5IGlzCi0gKiAgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wtYmFzZWQgaGVhcCBtYW5hZ2VkIGJ5IHRoZSBzdGFjaydzCi0gKiAgaW50ZXJuYWwgbWVtb3J5IG1hbmFnZXIuCi0gKi8KLXZvaWQqIE9JX0FQUF9NYWxsb2MoaW50MzJfdCBzaXplKTsKLXZvaWQgT0lfQVBQX0ZyZWUodm9pZCogcHRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyoqQH0qLwotCi0jZW5kaWYgLyogX09JX09TSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX3N0YXR1cy5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfc3RhdHVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTA3NTguLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfc3RhdHVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDIgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfT0lfU1RBVFVTX0gKLSNkZWZpbmUgX09JX1NUQVRVU19ICi0vKioKLSAqIEBmaWxlCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc3RhdHVzIGNvZGVzIGZvciBCTFVFbWFnaWMgMy4wIHNvZnR3YXJlLgotICovCi0KLSNpbmNsdWRlICJvaV9zdGRkZWZzLmgiCi0KLS8qKiBcYWRkdG9ncm91cCBNaXNjIE1pc2NlbGxhbmVvdXMgQVBJcyAqLwotLyoqQHsqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKiB0ZXN0IGl0ICoqLwotCi0vKioKLSAqIE9JX1NUQVRVUyBpcyAxNiBiaXRzLCBzbyBzdGF0dXMgY29kZXMgY2FuIHJhbmdlIGZyb20gMCB0byA2NjUzNSwgaW5jbHVzaXZlLgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIE9JX1NUQVRVU19TVUNDRVNTID0gMCwgLyoqPCBmdW5jdGlvbiBjYWxsIHN1Y2NlZWRlZCBhbGlhcyBmb3IgI09JX09LICovCi0gIE9JX09LID0gMCwgLyoqPCBmdW5jdGlvbiBjYWxsIHN1Y2NlZWRlZCBhbGlhcyBmb3IgI09JX1NUQVRVU19TVUNDRVNTICovCi0gIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlMgPSAxMDEsIC8qKjwgaW52YWxpZCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzICovCi0gIE9JX1NUQVRVU19OT1RfSU1QTEVNRU5URUQgPQotICAgICAgMTAyLCAvKio8IGF0dGVtcHQgdG8gdXNlIGFuIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gKi8KLSAgT0lfU1RBVFVTX05PVF9JTklUSUFMSVpFRCA9IDEwMywgLyoqPCBkYXRhIG5vdCBpbml0aWFsaXplZCAqLwotICBPSV9TVEFUVVNfTk9fUkVTT1VSQ0VTID0KLSAgICAgIDEwNCwgLyoqPCBnZW5lcmljIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHVyZSBzdGF0dXMgKi8KLSAgT0lfU1RBVFVTX0lOVEVSTkFMX0VSUk9SID0gMTA1LCAvKio8IGludGVybmFsIGluY29uc2lzdGVuY3kgKi8KLSAgT0lfU1RBVFVTX09VVF9PRl9NRU1PUlkgPSAxMDYsICAvKio8IGdlbmVyYWxseSwgT0lfTWFsbG9jIGZhaWxlZCAqLwotICBPSV9JTExFR0FMX1JFRU5UUkFOVF9DQUxMID0KLSAgICAgIDEwNywgLyoqPCB2aW9sYXRpb24gb2Ygbm9uLXJlZW50cmFudCBtb2R1bGUgcG9saWN5ICovCi0gIE9JX1NUQVRVU19JTklUSUFMSVpBVElPTl9GQUlMRUQgPSAxMDgsIC8qKjwgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotICBPSV9TVEFUVVNfSU5JVElBTElaQVRJT05fUEVORElORyA9Ci0gICAgICAxMDksIC8qKjwgaW5pdGl0aWFsaXphdGlvbiBub3QgeWV0IGNvbXBsZXRlICovCi0gIE9JX1NUQVRVU19OT19TQ09fU1VQUE9SVCA9Ci0gICAgICAxMTAsIC8qKjwgU0NPIG9wZXJhdGlvbiByZWplY3RlZDsgc3lzdGVtIG5vdCBjb25maWd1cmVkIGZvciBTQ08gKi8KLSAgT0lfU1RBVFVTX09VVF9PRl9TVEFUSUNfTUVNT1JZID0gMTExLCAvKio8IHN0YXRpYyBtYWxsb2MgZmFpbGVkICovCi0gIE9JX1RJTUVPVVQgPSAxMTIsICAgICAgICAgICAgICAgICAgICAgLyoqPCBnZW5lcmljIHRpbWVvdXQgKi8KLSAgT0lfT1NfRVJST1IgPSAxMTMsICAgICAgICAgICAgICAgICAgICAvKio8IHNvbWUgb3BlcmF0aW5nIHN5c3RlbSBlcnJvciAqLwotICBPSV9GQUlMID0gMTE0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgZ2VuZXJpYyBmYWlsdXJlICovCi0gIE9JX1NUUklOR19GT1JNQVRfRVJST1IgPSAxMTUsICAgIC8qKjwgZXJyb3IgaW4gVmFyU3RyaW5nIGZvcm1hdHRpbmcgc3RyaW5nICovCi0gIE9JX1NUQVRVU19QRU5ESU5HID0gMTE2LCAgICAgICAgIC8qKjwgVGhlIG9wZXJhdGlvbiBpcyBwZW5kaW5nLiAqLwotICBPSV9TVEFUVVNfSU5WQUxJRF9DT01NQU5EID0gMTE3LCAvKio8IFRoZSBjb21tYW5kIHdhcyBpbnZhbGlkLiAqLwotICBPSV9CVVNZX0ZBSUwgPSAxMTgsICAgICAgICAgICAgICAvKio8IGNvbW1hbmQgcmVqZWN0ZWQgZHVlIHRvIGJ1c3kgKi8KLSAgT0lfU1RBVFVTX0FMUkVBRFlfUkVHSVNURVJFRCA9Ci0gICAgICAxMTksIC8qKjwgVGhlIHJlZ2lzdHJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZC4gKi8KLSAgT0lfU1RBVFVTX05PVF9GT1VORCA9IDEyMCwgICAgICAvKio8IFRoZSByZWZlcmVuY2VkIHJlc291cmNlIHdhcyBub3QgZm91bmQuICovCi0gIE9JX1NUQVRVU19OT1RfUkVHSVNURVJFRCA9IDEyMSwgLyoqPCBub3QgcmVnaXN0ZXJlZCAqLwotICBPSV9TVEFUVVNfTk9UX0NPTk5FQ1RFRCA9IDEyMiwgIC8qKjwgbm90IGNvbm5lY3RlZCAqLwotICBPSV9DQUxMQkFDS19GVU5DVElPTl9SRVFVSVJFRCA9Ci0gICAgICAxMjMsIC8qKjwgQSBjYWxsYmFjayBmdW5jdGlvbiBwYXJhbWV0ZXIgd2FzIHJlcXVpcmVkLiAqLwotICBPSV9TVEFUVVNfTUJVRl9PVkVSRkxPVyA9Ci0gICAgICAxMjQsIC8qKjwgVGhlcmUgaXMgbm8gcm9vbSB0byBhZGQgYW5vdGhlciBidWZmZXIgdG8gYW4gbWJ1Zi4gKi8KLSAgT0lfU1RBVFVTX01CVUZfVU5ERVJGTE9XID0KLSAgICAgIDEyNSwgLyoqPCBUaGVyZSB3YXMgYW4gYXR0ZW1wdCB0byBwdWxsIHRvbyBtYW55IGJ5dGVzIGZyb20gYW4gbWJ1Zi4gKi8KLSAgT0lfU1RBVFVTX0NPTk5FQ1RJT05fRVhJU1RTID0gMTI2LCAvKio8IGNvbm5lY3Rpb24gZXhpc3RzICovCi0gIE9JX1NUQVRVU19OT1RfQ09ORklHVVJFRCA9IDEyNywgICAgLyoqPCBtb2R1bGUgbm90IGNvbmZpZ3VyZWQgKi8KLSAgT0lfTE9XRVJfU1RBQ0tfRVJST1IgPSAxMjgsIC8qKjwgQW4gZXJyb3Igd2FzIHJlcG9ydGVkIGJ5IGxvd2VyIHN0YWNrIEFQSS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCBmb3IgZW1iZWRkZWQgcGxhdGZvcm1zLiAqLwotICBPSV9TVEFUVVNfUkVTRVRfSU5fUFJPR1JFU1MgPQotICAgICAgMTI5LCAvKio8IFJlcXVlc3QgZmFpbGVkL3JlamVjdGVkIGJlY2F1c2Ugd2UncmUgYnVzeSByZXNldHRpbmcuICovCi0gIE9JX1NUQVRVU19BQ0NFU1NfREVOSUVEID0gMTMwLCAvKio8IEdlbmVyaWMgYWNjZXNzIGRlbmllZCBlcnJvci4gKi8KLSAgT0lfU1RBVFVTX0RBVEFfRVJST1IgPSAxMzEsICAgIC8qKjwgR2VuZXJpYyBkYXRhIGVycm9yLiAqLwotICBPSV9TVEFUVVNfSU5WQUxJRF9ST0xFID0gMTMyLCAgLyoqPCBUaGUgcmVxdWVzdGVkIHJvbGUgd2FzIGludmFsaWQuICovCi0gIE9JX1NUQVRVU19BTFJFQURZX0NPTk5FQ1RFRCA9Ci0gICAgICAxMzMsIC8qKjwgVGhlIHJlcXVlc3RlZCBjb25uZWN0aW9uIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQuICovCi0gIE9JX1NUQVRVU19QQVJTRV9FUlJPUiA9IDEzNCwgICAgICAgICAvKio8IFBhcnNlIGVycm9yICovCi0gIE9JX1NUQVRVU19FTkRfT0ZfRklMRSA9IDEzNSwgICAgICAgICAvKio8IEVuZCBvZiBmaWxlICovCi0gIE9JX1NUQVRVU19SRUFEX0VSUk9SID0gMTM2LCAgICAgICAgICAvKio8IEdlbmVyaWMgcmVhZCBlcnJvciAqLwotICBPSV9TVEFUVVNfV1JJVEVfRVJST1IgPSAxMzcsICAgICAgICAgLyoqPCBHZW5lcmljIHdyaXRlIGVycm9yICovCi0gIE9JX1NUQVRVU19ORUdPVElBVElPTl9GQUlMVVJFID0gMTM4LCAvKio8IEVycm9yIGluIG5lZ290aWF0aW9uICovCi0gIE9JX1NUQVRVU19SRUFEX0lOX1BST0dSRVNTID0gMTM5LCAgICAvKio8IEEgcmVhZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzICovCi0gIE9JX1NUQVRVU19BTFJFQURZX0lOSVRJQUxJWkVEID0KLSAgICAgIDE0MCwgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgKi8KLSAgT0lfU1RBVFVTX1NUSUxMX0NPTk5FQ1RFRCA9IDE0MSwgLyoqPCBUaGUgc2VydmljZSBjYW5ub3QgYmUgc2h1dGRvd24gYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIGNvbm5lY3Rpb25zLiAqLwotICBPSV9TVEFUVVNfTVRVX0VYQ0VFREVEID0gMTQyLCAgICAvKio8IFRoZSBwYWNrZXQgaXMgdG9vIGJpZyAqLwotICBPSV9TVEFUVVNfTElOS19URVJNSU5BVEVEID0gMTQzLCAvKio8IFRoZSBsaW5rIHdhcyB0ZXJtaW5hdGVkICovCi0gIE9JX1NUQVRVU19QSU5fQ09ERV9UT09fTE9ORyA9Ci0gICAgICAxNDQsIC8qKjwgQXBwbGljYXRpb24gZ2F2ZSB1cyBhIHBpbiBjb2RlIHRoYXQgaXMgdG9vIGxvbmcgKi8KLSAgT0lfU1RBVFVTX1NUSUxMX1JFR0lTVEVSRUQgPSAxNDUsIC8qKjwgVGhlIHNlcnZpY2UgY2Fubm90IGJlIHNodXRkb3duIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgcmVnaXN0cmF0aW9ucy4gKi8KLSAgT0lfU1RBVFVTX1NQRUNfVklPTEFUSU9OID0KLSAgICAgIDE0NiwgLyoqPCBTb21lIGFwcGxpY2F0aW9uIGJlaGF2aW9yIGNvbnRyYXJ5IHRvIEJUIHNwZWNpZmljYXRpb25zICovCi0KLSAgT0lfU1RBVFVTX1BTTV9BTFJFQURZX1JFR0lTVEVSRUQgPQotICAgICAgNDAyLCAvKio8IEwyQ0FQOiBUaGUgc3BlY2lmaWVkIFBTTSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuICovCi0gIE9JX1NUQVRVU19JTlZBTElEX0NJRCA9IDQwMywgLyoqPCBMMkNBUDogQ0lEIGlzIGludmFsaWQgb3Igbm8gbG9uZ2VyIHZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbm5lY3Rpb24gdGVybWluYXRlZCkgKi8KLSAgT0lfU1RBVFVTX0NJRF9OT1RfRk9VTkQgPQotICAgICAgNDA0LCAvKio8IEwyQ0FQOiBDSUQgZG9lcyBub3QgcmVwcmVzZW50IGEgY3VycmVudCBjb25uZWN0aW9uICovCi0gIE9JX1NUQVRVU19DSEFOTkVMX05PVF9GT1VORCA9Ci0gICAgICA0MDYsIC8qKjwgTDJDQVA6IENJRCBkb2VzIG5vdCByZXByZXNlbnQgYSBjdXJyZW50IGNvbm5lY3Rpb24gKi8KLSAgT0lfU1RBVFVTX1BTTV9OT1RfRk9VTkQgPSA0MDcsICAgICAvKio8IEwyQ0FQOiBQU00gbm90IGZvdW5kICovCi0gIE9JX1NUQVRVU19JTlZBTElEX1NUQVRFID0gNDA4LCAgICAgLyoqPCBMMkNBUDogaW52YWxpZCBzdGF0ZSAqLwotICBPSV9TVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1MgPSA0MTAsIC8qKjwgTDJDQVA6IHdyaXRlIGluIHByb2dyZXNzICovCi0gIE9JX1NUQVRVU19JTlZBTElEX1BBQ0tFVCA9IDQxMSwgICAgLyoqPCBMMkNBUDogaW52YWxpZCBwYWNrZXQgKi8KLSAgT0lfU1RBVFVTX1NFTkRfQ09NUExFVEUgPSA0MTIsICAgICAvKio8IEwyQ0FQOiBzZW5kIGlzIGNvbXBsZXRlICovCi0gIE9JX1NUQVRVU19JTlZBTElEX0hBTkRMRSA9IDQxNCwgICAgLyoqPCBMMkNBUDogaGFuZGxlIGlzIGludmFsaWQgKi8KLSAgT0lfU1RBVFVTX0dST1VQX0ZVTEwgPQotICAgICAgNDE4LCAvKio8IEwyQ0FQOiBObyBtb3JlIG1lbWJlcnMgY2FuIGJlIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAuICovCi0gIE9JX1NUQVRVU19ERVZJQ0VfQUxSRUFEWV9JTl9HUk9VUCA9Ci0gICAgICA0MjMsIC8qKjwgTDJDQVA6IFRoZSBkZXZpY2UgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGdyb3VwLiAqLwotICBPSV9TVEFUVVNfRFVQTElDQVRFX0dST1VQID0KLSAgICAgIDQyNSwgICAgICAgICAgICAgICAgICAgICAvKio8IEwyQ0FQOiBhdHRlbXB0IHRvIGFkZCBtb3JlIHRoYW4gb25lIGdyb3VwICovCi0gIE9JX1NUQVRVU19FTVBUWV9HUk9VUCA9IDQyNiwgLyoqPCBMMkNBUDogZ3JvdXAgaXMgZW1wdHkgKi8KLSAgT0lfU1RBVFVTX1BBQ0tFVF9OT1RfRk9VTkQgPSA0MjcsIC8qKjwgTDJDQVA6IHBhY2tldCBub3QgZm91bmQgKi8KLSAgT0lfU1RBVFVTX0JVRkZFUl9UT09fU01BTEwgPSA0MjgsIC8qKjwgTDJDQVA6IFRoZSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwuICovCi0gIE9JX1NUQVRVU19JREVOVElGSUVSX05PVF9GT1VORCA9IDQyOSwgLyoqPCBMMkNBUDogaWRlbnRpZmllciBub3QgZm91bmQgKi8KLQotICBPSV9MMkNBUF9ESVNDT05ORUNUX0xPV0VSX0xBWUVSID0KLSAgICAgIDQzMCwgLyoqPCBMMkNBUDogVGhlIGxvd2VyIGxldmVsIGZvcmNlZCBhIGRpc2Nvbm5lY3QuICovCi0gIE9JX0wyQ0FQX0RJU0NPTk5FQ1RfUkVNT1RFX1JFUVVFU1QgPQotICAgICAgNDMxLCAvKio8IEwyQ0FQOiBUaGUgcmVtb3RlIGRldmljZSByZXF1ZXN0ZWQgYSBkaXNjb25uZWN0LiAqLwotICBPSV9MMkNBUF9HUk9VUF9BRERfQ09OTkVDVF9GQUlMID0gNDMzLCAvKio8IEwyQ0FQOiBHcm91cCBhZGQgY29ubmVjdCBmYWlMICovCi0gIE9JX0wyQ0FQX0dST1VQX1JFTU9WRV9GQUlMVVJFID0gNDM0LCAgIC8qKjwgTDJDQVA6IEdyb3VwIHJlbW92ZSBmYWlsdXJlICovCi0gIE9JX0wyQ0FQX0RBVEFfV1JJVEVfRVJST1JfTElOS19URVJNID0KLSAgICAgIDQzNSwgLyoqPCBMMkNBUDogRGF0YSB3cml0ZSBlcnJvciBMSU5LX1RFUk0gKi8KLSAgT0lfTDJDQVBfRElTQ09OTkVDVF9MT0NBTF9SRVFVRVNUID0KLSAgICAgIDQzNiwgLyoqPCBMMkNBUDogRGlzY29ubmVjdCBsb2NhbCByZXF1ZXN0ICovCi0KLSAgT0lfTDJDQVBfQ09OTkVDVF9USU1FT1VUID0gNDM3LCAgICAvKio8IEwyQ0FQOiBDb25uZWN0IHRpbWVvdXQgKi8KLSAgT0lfTDJDQVBfRElTQ09OTkVDVF9USU1FT1VUID0gNDM5LCAvKio8IEwyQ0FQOiBEaXNjb25uZWN0IHRpbWVvdXQgKi8KLSAgT0lfTDJDQVBfUElOR19USU1FT1VUID0gNDQwLCAgICAgICAvKio8IEwyQ0FQOiBQaW5nIHRpbWVvdXQgKi8KLSAgT0lfTDJDQVBfR0VUX0lORk9fVElNRU9VVCA9IDQ0MSwgICAvKio8IEwyQ0FQOiBHZXQgaW5mbyB0aW1lb3V0ICovCi0gIE9JX0wyQ0FQX0lOVkFMSURfQUREUkVTUyA9IDQ0NCwgICAgLyoqPCBMMkNBUDogSW52YWxpZCBhZGRyZXNzICovCi0gIE9JX0wyQ0FQX0NNRF9SRUpFQ1RfUkNWRCA9Ci0gICAgICA0NDUsIC8qKjwgTDJDQVA6IHJlbW90ZSBzZW50IHVzICdjb21tYW5kIHJlamVjdCcgcmVzcG9uc2UgKi8KLQotICBPSV9MMkNBUF9DT05ORUNUX0JBU0UgPSA0NTAsICAgIC8qKjwgTDJDQVA6IENvbm5lY3QgYmFzZSAqLwotICBPSV9MMkNBUF9DT05ORUNUX1BFTkRJTkcgPSA0NTEsIC8qKjwgTDJDQVA6IENvbm5lY3QgcGVuZGluZyAqLwotICBPSV9MMkNBUF9DT05ORUNUX1JFRlVTRURfSU5WQUxJRF9QU00gPQotICAgICAgNDUyLCAvKio8IEwyQ0FQOiBDb25uZWN0IHJlZnVzZWQgaW52YWxpZCBQU00gKi8KLSAgT0lfTDJDQVBfQ09OTkVDVF9SRUZVU0VEX1NFQ1VSSVRZID0KLSAgICAgIDQ1MywgLyoqPCBMMkNBUDogQ29ubmVjdCByZWZ1c2VkIHNlY3VyaXR5ICovCi0gIE9JX0wyQ0FQX0NPTk5FQ1RfUkVGVVNFRF9OT19SRVNPVVJDRVMgPQotICAgICAgNDU0LCAvKio8IEwyQ0FQOiBDb25uZWN0IHJlZnVzZWQgbm8gcmVzb3VyY2VzICovCi0KLSAgT0lfTDJDQVBfQ09ORklHX0JBU0UgPSA0NjAsIC8qKjwgTDJDQVA6IENvbmZpZyBiYXNlICovCi0gIE9JX0wyQ0FQX0NPTkZJR19GQUlMX0lOVkFMSURfUEFSQU1FVEVSUyA9Ci0gICAgICA0NjEsIC8qKjwgTDJDQVA6IENvbmZpZyBmYWlsIGludmFsaWQgcGFyYW1ldGVycyAqLwotICBPSV9MMkNBUF9DT05GSUdfRkFJTF9OT19SRUFTT04gPSA0NjIsIC8qKjwgTDJDQVA6IENvbmZpZyBmYWlsIG5vIHJlYXNvbiAqLwotICBPSV9MMkNBUF9DT05GSUdfRkFJTF9VTktOT1dOX09QVElPTlMgPQotICAgICAgNDYzLCAvKio8IEwyQ0FQOiBDb25maWcgZmFpbCB1bmtub3duIG9wdGlvbnMgKi8KLQotICBPSV9MMkNBUF9HRVRfSU5GT19CQVNFID0gNDcwLCAgICAgICAgICAvKio8IEwyQ0FQOiBHZXQgaW5mbyBiYXNlICovCi0gIE9JX0wyQ0FQX0dFVF9JTkZPX05PVF9TVVBQT1JURUQgPSA0NzEsIC8qKjwgTDJDQVA6IEdldCBpbmZvIG5vdCBzdXBwb3J0ZWQgKi8KLSAgT0lfTDJDQVBfTVRVX0VYQ0VFREVEID0KLSAgICAgIDQ3MiwgICAgICAgICAgICAgICAgICAgIC8qKjwgTDJDQVA6IFRoZSBNVFUgb2YgdGhlIGNoYW5uZWwgd2FzIGV4Y2VlZGVkICovCi0gIE9JX0wyQ0FQX0lOVkFMSURfUFNNID0gNDgyLCAvKio8IEwyQ0FQOiBJbnZhbGlkIFBTTSAqLwotICBPSV9MMkNBUF9JTlZBTElEX01UVSA9IDQ4MywgLyoqPCBMMkNBUDogSW52YWxpZCBNVFUgKi8KLSAgT0lfTDJDQVBfSU5WQUxJRF9GTFVTSFRPID0gNDg0LCAvKio8IEwyQ0FQOiBJbnZhbGlkIGZsdXNoIHRpbWVvdXQgKi8KLQotICBPSV9IQ0lfTk9fU1VDSF9DT05ORUNUSU9OID0KLSAgICAgIDYwMSwgLyoqPCBIQ0k6IGNhbGxlciBzcGVjaWZpZWQgYSBub24tZXhpc3RlbnQgY29ubmVjdGlvbiBoYW5kbGUgKi8KLSAgT0lfSENJX0NCX0xJU1RfRlVMTCA9Ci0gICAgICA2MDMsIC8qKjwgSENJOiBjYWxsYmFjayBsaXN0IGlzIGZ1bGwsIGNhbm5vdCBhdHRlbXB0IHRvIHNlbmQgY29tbWFuZCAqLwotICBPSV9IQ0lfRVZFTlRfVU5ERVJSVU4gPQotICAgICAgNjA1LCAvKio8IEhDSTogcGFyc2luZyBldmVudCBwYWNrZXQsIHByZW1hdHVyZSBlbmQtb2YtcGFyYW1ldGVycyAqLwotICBPSV9IQ0lfVU5LTk9XTl9FVkVOVF9DT0RFID0KLSAgICAgIDYwNywgLyoqPCBIQ0k6IGV2ZW50IHJlY2VpdmVkIC0gZXZlbnQgY29kZSBpcyB1bmtub3duICovCi0gIE9JX0hDSV9CQURfRVZFTlRfUEFSTV9MRU4gPQotICAgICAgNjA4LCAvKio8IEhDSTogZXZlbnQgLSBwYXJhbWV0ZXIgbGVuZ3RoIGlzIGluY29ycmVjdCAqLwotICBPSV9IQ0lfQ01EX1FVRVVFX0ZVTEwgPSA2MTEsIC8qKjwgSENJOiBjb21tYW5kIHF1ZXVlIGlzIGZ1bGwgKi8KLSAgT0lfSENJX1NIT1JUX0VWRU5UID0KLSAgICAgIDYxMiwgLyoqPCBIQ0k6IGV2ZW50IHJlY2VpdmVkLCBtaXNzaW5nIGV2ZW50IGNvZGUgYW5kL29yIHBhcm0gbGVuICovCi0gIE9JX0hDSV9UUkFOU01JVF9OT1RfUkVBRFkgPSA2MTMsIC8qKjwgSENJOiBBQ0wvU0NPIHRyYW5zbWl0IHJlcXVlc3QgZmFpbGVkIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzeSBvciBubyBidWZmZXJzIGF2YWlsYWJsZSAqLwotICBPSV9IQ0lfT1JQSEFOX1NFTlRfRVZFTlQgPQotICAgICAgNjE0LCAvKio8IEhDSTogZ290IHNwdXJpb3VzICdzZW50JyBldmVudCBmcm9tIHRyYW5zcG9ydCBsYXllciAqLwotICBPSV9IQ0lfQ01EX1RBQkxFX0VSUk9SID0KLSAgICAgIDYxNSwgLyoqPCBIQ0k6IGluY29uc2lzdGVuY3kgaW4gdGhlIGludGVybmFsIGNvbW1hbmQgdGFibGUgKi8KLSAgT0lfSENJX1VOS05PV05fQ01EX0lEID0gNjE2LCAvKio8IEhDSTogSGNpQXBpIENvbW1hbmQgLSB1bmtub3duIGNvbW1hbmQgaWQgKi8KLSAgT0lfSENJX1VORVhQRUNURURfRVZFTlQgPQotICAgICAgNjE5LCAvKio8IEhDSTogZXZlbnQgcmVjZWl2ZWQgd2hpY2ggb25seSBvY2N1cnMgaW4gcmVzcG9uc2UgdG8gb3VyIGNtZCAqLwotICBPSV9IQ0lfRVZFTlRfVEFCTEVfRVJST1IgPQotICAgICAgNjIwLCAvKio8IEhDSTogaW5jb25zaXN0ZW5jeSBpbiB0aGUgaW50ZXJuYWwgZXZlbnQgdGFibGUgKi8KLSAgT0lfSENJX0VYUEVDVEVEX0VWRU5UX1RJTU9VVCA9Ci0gICAgICA2MjEsIC8qKjwgSENJOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgYW4gZXhwZWN0ZWQgZXZlbnQgKi8KLSAgT0lfSENJX05PX0NNRF9ERVNDX0ZPUl9PUENPREUgPSA2MjIsIC8qKjwgSENJOiBldmVudCBvcGNvZGUgaXMgbm90IGtub3duICovCi0gIE9JX0hDSV9JTlZBTElEX09QQ09ERV9FUlJPUiA9IDYyMywgICAvKio8IEhDSTogY29tbWFuZCBvcGNvZGUgaXMgaW52YWxpZCAqLwotICBPSV9IQ0lfRkxPV19DT05UUk9MX0RJU0FCTEVEID0gNjI0LCAgLyoqPCBIQ0k6IGNhbiBub3QgdXNlIGhvc3QgZmxvdyBjb250cm9sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUElzIGlmIGRpc2FibGVkIGluIGNvbmZpZ3VyYXRpb24gKi8KLSAgT0lfSENJX1RYX0NPTVBMRVRFID0KLSAgICAgIDYyNSwgICAgICAgICAgICAgICAvKio8IEhDSTogcGFja2V0IGRlbGl2ZXJ5IHRvIEhvc3QgQ29udHJvbGVyIGNvbXBsZXRlICovCi0gIE9JX0hDSV9UWF9FUlJPUiA9IDYyNiwgLyoqPCBIQ0k6IGZhaWxlZCB0byBkZWxpdmVyIHBhY2tldCB0byBIb3N0IENvbnRyb2xlciAqLwotICBPSV9IQ0lfREVWSUNFX05PVF9JTklUSUFMSVpFRCA9IDYyNywgLyoqPCBIQ0k6IGNvbW1hbmRzIGZyb20gdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkIHVudGlsIGRldmljZSBpcyB1cCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgKi8KLSAgT0lfSENJX1VOU1VQUE9SVEVEX0NPTU1BTkQgPQotICAgICAgNjI4LCAvKio8IEhDSTogY29tbWFuZCByZXF1ZXN0ZWQgaXMgbm90IHN1cHBvcnRlZCBieSBsb2NhbCBkZXZpY2UgKi8KLSAgT0lfSENJX1BBU1NUSFJPVUdIX0VSUk9SID0KLSAgICAgIDYyOSwgLyoqPCBIQ0k6IEVycm9yIHByb2Nlc3NpbmcgcGFzc3Rocm91Z2ggY29tbWFuZCAqLwotICBPSV9IQ0lfUEFTU1RIUk9VR0hfQUxSRUFEWV9TRVQgPQotICAgICAgNjMwLCAgICAgICAgICAgICAgICAgICAgICAvKio8IEhDSTogUGFzc3Rocm91Z2ggbW9kZSBhbHJlYWR5IGVuYWJsZWQgKi8KLSAgT0lfSENJX1JFU0VUX0ZBSUxVUkUgPSA2MzEsICAgLyoqPCBIQ0k6IGZhaWxlZCB0byByZXNldCB0aGUgZGV2aWNlL2Jhc2ViYW5kICovCi0gIE9JX0hDSV9UUkFOU1BPUlRfUkVTRVQgPSA2MzIsIC8qKjwgSENJOiBzb21lIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSBvZiBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IGluIHRoZSB0cmFuc3BvcnQgKi8KLSAgT0lfSENJRVJSX0hDSUlGQ19JTklUX0ZBSUxVUkUgPQotICAgICAgNjMzLCAvKio8IEhDSTogZmFpbGVkIHRvIGluaXRpYWxpemUgdHJhbnNwb3J0IGxheWVyIGludGVyZmFjZSAqLwotCi0gIE9JX0hDSUVSUl9GSVJTVF9FUlJPUl9WQUxVRSA9IDcwMSwgLyoqPCBtYXJrZXIgZm9yIGZpcnN0IEhDSSBwcm90b2NvbCBlcnJvciAqLwotICBPSV9IQ0lFUlJfVU5LTk9XTl9IQ0lfQ09NTUFORCA9IDcwMSwgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDAxICovCi0gIE9JX0hDSUVSUl9OT19DT05ORUNUSU9OID0gNzAyLCAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MDIgKi8KLSAgT0lfSENJRVJSX0hBUkRXQVJFX0ZBSUxVUkUgPSA3MDMsICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgwMyAqLwotICBPSV9IQ0lFUlJfUEFHRV9USU1FT1VUID0gNzA0LCAgICAgICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDA0ICovCi0gIE9JX0hDSUVSUl9BVVRIRU5USUNBVElPTl9GQUlMVVJFID0gNzA1LCAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MDUgKi8KLSAgT0lfSENJRVJSX0tFWV9NSVNTSU5HID0gNzA2LCAgICAgICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgwNiAqLwotICBPSV9IQ0lFUlJfTUVNT1JZX0ZVTEwgPSA3MDcsICAgICAgICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDA3ICovCi0gIE9JX0hDSUVSUl9DT05ORUNUSU9OX1RJTUVPVVQgPSA3MDgsICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MDggKi8KLSAgT0lfSENJRVJSX01BWF9OVU1fT0ZfQ09OTkVDVElPTlMgPSA3MDksICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgwOSAqLwotICBPSV9IQ0lFUlJfTUFYX05VTV9PRl9TQ09fQ09OTkVDVElPTlMgPSA3MTAsIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDBBICovCi0gIE9JX0hDSUVSUl9BQ0xfQ09OTkVDVElPTl9BTFJFQURZX0VYSVNUUyA9Ci0gICAgICA3MTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MEIgKi8KLSAgT0lfSENJRVJSX0NPTU1BTkRfRElTQUxMT1dFRCA9IDcxMiwgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgwQyAqLwotICBPSV9IQ0lFUlJfSE9TVF9SRUpFQ1RFRF9SRVNPVVJDRVMgPSA3MTMsIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDBEICovCi0gIE9JX0hDSUVSUl9IT1NUX1JFSkVDVEVEX1NFQ1VSSVRZID0gNzE0LCAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MEUgKi8KLSAgT0lfSENJRVJSX0hPU1RfUkVKRUNURURfUEVSU09OQUxfREVWSUNFID0KLSAgICAgIDcxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDBGICovCi0gIE9JX0hDSUVSUl9IT1NUX1RJTUVPVVQgPSA3MTYsICAgICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgxMCAqLwotICBPSV9IQ0lFUlJfVU5TVVBQT1JURUQgPSA3MTcsICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MTEgKi8KLSAgT0lfSENJRVJSX0lOVkFMSURfUEFSQU1FVEVSUyA9IDcxOCwgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDEyICovCi0gIE9JX0hDSUVSUl9PVEhFUl9FTkRfVVNFUl9ESVNDT05ORUNUID0gNzE5LCAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgxMyAqLwotICBPSV9IQ0lFUlJfT1RIRVJfRU5EX0xPV19SRVNPVVJDRVMgPSA3MjAsICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MTQgKi8KLSAgT0lfSENJRVJSX09USEVSX0VORF9QT1dFUklOR19PRkYgPSA3MjEsICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDE1ICovCi0gIE9JX0hDSUVSUl9DT05ORUNUSU9OX1RFUk1JTkFURURfTE9DQUxMWSA9Ci0gICAgICA3MjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MTYgKi8KLSAgT0lfSENJRVJSX1JFUEVBVEVEX0FUVEVNUFRTID0gNzIzLCAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgxNyAqLwotICBPSV9IQ0lFUlJfUEFJUklOR19OT1RfQUxMT1dFRCA9IDcyNCwgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDE4ICovCi0gIE9JX0hDSUVSUl9VTktOT1dOX0xNUF9QRFUgPSA3MjUsICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MTkgKi8KLSAgT0lfSENJRVJSX1VOU1VQUE9SVEVEX1JFTU9URV9GRUFUVVJFID0gNzI2LCAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgxQSAqLwotICBPSV9IQ0lFUlJfU0NPX09GRlNFVF9SRUpFQ1RFRCA9IDcyNywgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDFCICovCi0gIE9JX0hDSUVSUl9TQ09fSU5URVJWQUxfUkVKRUNURUQgPSA3MjgsICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MUMgKi8KLSAgT0lfSENJRVJSX1NDT19BSVJfTU9ERV9SRUpFQ1RFRCA9IDcyOSwgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgxRCAqLwotICBPSV9IQ0lFUlJfSU5WQUxJRF9MTVBfUEFSTVMgPSA3MzAsICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDFFICovCi0gIE9JX0hDSUVSUl9VTlNQRUNJRklFRF9FUlJPUiA9IDczMSwgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MUYgKi8KLSAgT0lfSENJRVJSX1VOU1VQUE9SVEVEX0xNUF9QQVJBTUVURVJTID0gNzMyLCAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgyMCAqLwotICBPSV9IQ0lFUlJfUk9MRV9DSEFOR0VfTk9UX0FMTE9XRUQgPSA3MzMsICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDIxICovCi0gIE9JX0hDSUVSUl9MTVBfUkVTUE9OU0VfVElNRU9VVCA9IDczNCwgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MjIgKi8KLSAgT0lfSENJRVJSX0xNUF9FUlJPUl9UUkFOU19DT0xMSVNJT04gPSA3MzUsICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgyMyAqLwotICBPSV9IQ0lFUlJfTE1QX1BEVV9OT1RfQUxMT1dFRCA9IDczNiwgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDI0ICovCi0gIE9JX0hDSUVSUl9FTkNSWVBUSU9OX01PREVfTk9UX0FDQ0VQVEFCTEUgPQotICAgICAgNzM3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MjUgKi8KLSAgT0lfSENJRVJSX1VOSVRfS0VZX1VTRUQgPSA3MzgsICAgICAgICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDI2ICovCi0gIE9JX0hDSUVSUl9RT1NfTk9UX1NVUFBPUlRFRCA9IDczOSwgICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgyNyAqLwotICBPSV9IQ0lFUlJfSU5TVEFOVF9QQVNTRUQgPSA3NDAsICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MjggKi8KLSAgT0lfSENJRVJSX1VOSVRfS0VZX1BBSVJJTkdfVU5TVVBQT1JURUQgPSA3NDEsIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDI5ICovCi0gIE9JX0hDSUVSUl9ESUZGRVJFTlRfVFJBTlNfQ09MTElTSU9OID0gNzQyLCAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgyQSAqLwotICBPSV9IQ0lFUlJfUkVTRVJWRURfMkIgPSA3NDMsICAgICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MkIgKi8KLSAgT0lfSENJRVJSX1FPU19VTkFDQ0VQVEFCTEVfUEFSQU1FVEVSID0gNzQ0LCAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDJDICovCi0gIE9JX0hDSUVSUl9RT1NfUkVKRUNURUQgPSA3NDUsICAgICAgICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgyRCAqLwotICBPSV9IQ0lFUlJfQ0hBTk5FTF9DTEFTU0lGSUNBVElPTl9OUyA9IDc0NiwgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MkUgKi8KLSAgT0lfSENJRVJSX0lOU1VGRklDSUVOVF9TRUNVUklUWSA9IDc0NywgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDJGICovCi0gIE9JX0hDSUVSUl9QQVJNX09VVF9PRl9NQU5EQVRPUllfUkFOR0UgPSA3NDgsICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgzMCAqLwotICBPSV9IQ0lFUlJfUkVTRVJWRURfMzEgPSA3NDksICAgICAgICAgICAgICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MzEgKi8KLSAgT0lfSENJRVJSX1JPTEVfU1dJVENIX1BFTkRJTkcgPSA3NTAsICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDMyICovCi0gIE9JX0hDSUVSUl9SRVNFUlZFRF8zMyA9IDc1MSwgICAgICAgICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgzMyAqLwotICBPSV9IQ0lFUlJfUkVTRVJWRURfU0xPVF9WSU9MQVRJT04gPSA3NTIsICAgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MzQgKi8KLSAgT0lfSENJRVJSX1JPTEVfU1dJVENIX0ZBSUxFRCA9IDc1MywgICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDM1ICovCi0gIE9JX0hDSUVSUl9FSVJfVE9PX0xBUkdFID0gNzU0LCAgICAgICAgICAgICAgICAvKio8IEhDSTogcHJvdG9jb2wgZXJyb3IgMHgzNiAqLwotICBPSV9IQ0lFUlJfU1NQX05PVF9TVVBQT1JURURfQllfSE9TVCA9IDc1NSwgICAgLyoqPCBIQ0k6IHByb3RvY29sIGVycm9yIDB4MzcgKi8KLSAgT0lfSENJRVJSX0hPU1RfQlVTWV9QQUlSSU5HID0gNzU2LCAgICAgICAgICAgIC8qKjwgSENJOiBwcm90b2NvbCBlcnJvciAweDM4ICovCi0KLSAgT0lfSENJRVJSX1VOS05PV05fRVJST1IgPSA3NTcsICAgIC8qKjwgSENJOiB1bmtub3duIGVycm9yIGNvZGUgKi8KLSAgT0lfSENJRVJSX0xBU1RfRVJST1JfVkFMVUUgPSA3NTcsIC8qKjwgbWFya2VyIGZvciBsYXN0IEhDSSBwcm90b2NvbCBlcnJvciAqLwotCi0gIE9JX1NEUF9TUEVDX0VSUk9SID0gODAwLCAvKio8IFNEUDogQmFzZSBlcnJvciBzdGF0dXMgZm9yIG1hcHBpbmcgT0lfU1RBVFVTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcyB0byBTRFAgZXJyb3JzICovCi0gIE9JX1NEUF9JTlZBTElEX1NFUlZJQ0VfUkVDT1JEX0hBTkRMRSA9Ci0gICAgICAoT0lfU0RQX1NQRUNfRVJST1IgKwotICAgICAgIDIpLCAvKio8IFNEUDogcHJvdG9jb2wgZXJyb3IgSW52YWxpZCBTZXJ2aWNlIFJlY29yZCBIYW5kbGUgKi8KLSAgT0lfU0RQX0lOVkFMSURfUkVRVUVTVF9TWU5UQVggPQotICAgICAgKE9JX1NEUF9TUEVDX0VSUk9SICsKLSAgICAgICAzKSwgLyoqPCBTRFA6IHByb3RvY29sIGVycm9yIEludmFsaWQgUmVxdWVzdCBTeW50YXggKi8KLSAgT0lfU0RQX0lOVkFMSURfUERVX1NJWkUgPQotICAgICAgKE9JX1NEUF9TUEVDX0VSUk9SICsgNCksIC8qKjwgU0RQOiBwcm90b2NvbCBlcnJvciBJbnZhbGlkIFBEVSBTaXplICovCi0gIE9JX1NEUF9JTlZBTElEX0NPTlRJTlVBVElPTl9TVEFURSA9Ci0gICAgICAoT0lfU0RQX1NQRUNfRVJST1IgKwotICAgICAgIDUpLCAvKio8IFNEUDogcHJvdG9jb2wgZXJyb3IgSW52YWxpZCBDb250aW51YXRpb24gU3RhdGUgKi8KLSAgT0lfU0RQX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgPQotICAgICAgKE9JX1NEUF9TUEVDX0VSUk9SICsKLSAgICAgICA2KSwgICAgICAgICAgICAvKio8IFNEUDogcHJvdG9jb2wgZXJyb3IgSW5zdWZmaWNpZW50IFJlc291cmNlcyAqLwotICBPSV9TRFBfRVJST1IgPSA4MDcsIC8qKjwgU0RQOiBzZXJ2ZXIgcmV0dXJuZWQgYW4gZXJyb3IgY29kZSAqLwotICBPSV9TRFBfQ09SUlVQVF9EQVRBX0VMRU1FTlQgPQotICAgICAgODA4LCAvKio8IFNEUDogSW52YWxpZCBvciBjb3JydXB0IGRhdGEgZWxlbWVudCByZXByZXNlbnRhdGlvbiAqLwotICBPSV9TRFBfU0VSVkVSX05PVF9DT05ORUNURUQgPQotICAgICAgODEwLCAvKio8IFNEUDogQXR0ZW1wdCB0byBkaXNjb25uZWN0IGZyb20gYW4gdW5jb25uZWN0ZWQgc2VydmVyICovCi0gIE9JX1NEUF9BQ0NFU1NfREVOSUVEID0gODExLCAvKio8IFNEUDogU2VydmVyIGRlbmllZCBhY2Nlc3MgdG8gc2VydmVyICovCi0gIE9JX1NEUF9BVFRSSUJVVEVTX09VVF9PRl9PUkRFUiA9Ci0gICAgICA4MTIsIC8qKjwgU0RQOiBBdHRyaWJ1dGVzIGluIGF0dHJpYnV0ZSBsaXN0IG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KLSAgT0lfU0RQX0RFVklDRV9ET0VTX05PVF9TVVBQT1JUX1NEUCA9Ci0gICAgICA4MTMsIC8qKjwgU0RQOiBUcmllZCB0byBjb25uZWN0IHRvIGEgZGV2aWNlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBTRFAgKi8KLSAgT0lfU0RQX05PX01PUkVfREFUQSA9Ci0gICAgICA4MTUsIC8qKjwgU0RQOiBTZXJ2ZXIgZG9lcyBub3QgaGF2ZSBtb3JlIGNvbnRpbnVhdGlvbiBkYXRhICovCi0gIE9JX1NEUF9SRVFVRVNUX1BBUkFNU19UT09fTE9ORyA9Ci0gICAgICA4MTYsIC8qKjwgU0RQOiBQYXJhbWV0ZXJzIGZvciBhIHJlcXVlc3QgZXhjZWVkIHRoZSBMMkNBUCBidWZmZXIgc2l6ZSAqLwotICBPSV9TRFBfUkVRVUVTVF9QRU5ESU5HID0gODE3LCAvKio8IFNEUDogQ2Fubm90IG1ha2UgYSByZXF1ZXN0IHdoZW4gYW5vdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICBPSV9TRFBfU0VSVkVSX0NPTk5FQ1RfRkFJTEVEID0KLSAgICAgIDgxOSwgLyoqPCBTRFA6IEZhaWxlZCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYW4gU0RQIHNlcnZlciAqLwotICBPSV9TRFBfU0VSVkVSX1RPT19NQU5ZX0NPTk5FQ1RJT05TID0KLSAgICAgIDgyMSwgLyoqPCBTRFA6IEV4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBzZXJ2ZXIgY29ubmVjdGlvbnMKLSAgICAgICAgICAgICovCi0gIE9JX1NEUF9OT19NQVRDSElOR19TRVJWSUNFX1JFQ09SRCA9Ci0gICAgICA4MjMsIC8qKjwgU0RQOiBObyBzZXJ2aWNlIHJlY29yZCBtYXRjaGVkIHRoZSBVVUlEIGxpc3QgKi8KLSAgT0lfU0RQX1BBUlRJQUxfUkVTUE9OU0UgPSA4MjQsIC8qKjwgU0RQOiBJbnRlcm5hbCB1c2Ugb25seSAqLwotICBPSV9TRFBfSUxMRUdBTF9BUkdVTUVOVCA9Ci0gICAgICA4MjUsIC8qKjwgU0RQOiBJbGxlZ2FsIGFyZ3VtZW50IHBhc3NlZCB0byBhbiBTRFAgZnVuY3Rpb24gKi8KLSAgT0lfU0RQX0FUVFJJQlVURV9OT1RfRk9VTkQgPQotICAgICAgODI2LCAvKio8IFNEUDogQSByZXF1ZXN0ZWQgYXR0cmlidXRlIHdhcyBub3QgZm91bmQgaW4gYSBzZXJ2aWNlIHJlY29yZCAqLwotICBPSV9TRFBfREFUQUJBU0VfT1VUX09GX1JFU09VUkNFUyA9Ci0gICAgICA4MjcsICAgICAgICAgICAgICAgIC8qKjwgU0RQOiBzZXJ2ZXIgZGF0YWJhc2UgaXMgb3V0IG9mIG1lbW9yeSAqLwotICBPSV9TRFBfU0hPUlRfUERVID0gODI5LCAvKio8IFNEUDogTm90IGVub3VnaCBieXRlcyBpbiB0aGUgcGFja2V0ICovCi0gIE9JX1NEUF9UUkFOU0FDVElPTl9JRF9NSVNNQVRDSCA9Ci0gICAgICA4MzAsIC8qKjwgU0RQOiBUcmFuc2FjdGlvbiBJZCB3YXMgbm90IGFzIGV4cGVjdGVkICovCi0gIE9JX1NEUF9VTkVYUEVDVEVEX1JFU1BPTlNFX1BEVV9JRCA9Ci0gICAgICA4MzEsIC8qKjwgU0RQOiBEaWQgbm90IGV4cGVjdCB0aGlzIHJlc3BvbnNlIFBEVSAqLwotICBPSV9TRFBfUkVRVUVTVF9USU1FT1VUID0KLSAgICAgIDgzMiwgLyoqPCBTRFA6IERpZCBub3QgZ2V0IGEgcmVzcG9uc2Ugd2l0aGluIHRoZSB0aW1lb3V0IHBlcmlvZCAqLwotICBPSV9TRFBfSU5WQUxJRF9SRVNQT05TRV9TWU5UQVggPQotICAgICAgODMzLCAvKio8IFNEUDogUmVzcG9uc2UgaXMgbm90IGNvcnJlY3RseSBmb3JtYXR0ZWQgKi8KLSAgT0lfU0RQX0NPTk5FQ1RJT05fVElNRU9VVCA9Ci0gICAgICA4MzQsIC8qKjwgU0RQOiBDb25uZWN0aW9uIGF0dGVtcHQgdGltZWQgb3V0IGF0IGEgbG93ZXIgbGF5ZXIgKi8KLSAgT0lfU0RQX1JFU1BPTlNFX0RBVEFfRVJST1IgPQotICAgICAgODM1LCAvKio8IFNEUDogUmVzcG9uc2UgdG8gYSBzZXJ2aWNlIHJlcXVlc3QgYXBwZWFycyB0byBiZSBjb3JydXB0ICovCi0gIE9JX1NEUF9UT09fTUFOWV9BVFRSSUJVVEVfQllURVMgPQotICAgICAgODM2LCAvKio8IFNEUDogUmVzcG9uc2UgY29udGFpbmVkIG1vcmUgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQuICovCi0gIE9JX1NEUF9UT09fTUFOWV9TRVJWSUNFX1JFQ09SRFMgPQotICAgICAgODM3LCAvKio8IFNEUDogUmVzcG9uc2UgY29udGFpbmVkIG1vcmUgc2VydmljZSByZWNvcmRzIHRoYW4gcmVxdWVzdGVkLiAqLwotICBPSV9TRFBfSU5WQUxJRF9DT05ORUNUSU9OX0lEID0KLSAgICAgIDgzOCwgLyoqPCBTRFA6IEludmFsaWQgY29ubmVjdGlvbiBJRCBpbiBhbiBTRFAgcmVxdWVzdCAqLwotICBPSV9TRFBfQ0FOTk9UX1NFVF9BVFRSSUJVVEUgPQotICAgICAgODM5LCAvKio8IFNEUDogQXR0ZW1wdCB0byBzZXQgYSBkeW5hbWljIGF0dHJpYnV0ZSB2YWx1ZSBmYWlsZWQgKi8KLSAgT0lfU0RQX0JBRExZX0ZPUk1FRF9BVFRSSUJVVEVfVkFMVUUgPQotICAgICAgODQwLCAvKio8IFNEUDogQW4gYXR0cmlidXRlIHZhbHVlIGhhcyB0aGUgd3JvbmcgdHlwZSBvciBzdHJ1Y3R1cmUgKi8KLSAgT0lfU0RQX05PX0FUVFJJQlVURV9MSVNUX1RPX1JFTU9WRSA9Ci0gICAgICA4NDEsIC8qKjwgU0RQOiBBdHRlbXB0IHRvIHJlbW92ZSBhIG5vbi1leGlzdGVudCBhdHRyaWJ1dGUgbGlzdCBmcm9tIGEKLSAgICAgICAgICAgICAgc2VydmljZSByZWNvcmQgKi8KLSAgT0lfU0RQX0FUVFJJQlVURV9MSVNUX0FMUkVBRFlfQURERUQgPSA4NDIsIC8qKjwgU0RQOiBBbiBhdHRyaWJ1dGUgbGlzdCBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgcmVjb3JkICovCi0gIE9JX1NEUF9EQVRBX0VMRU1FTlRfVFJVTkNBVEVEID0KLSAgICAgIDg0MywgLyoqPCBTRFA6IERhdGEgZWxlbWVudCB0cnVuY2F0ZWQgKHRvbyBmZXcgYnl0ZXMpICovCi0KLSAgT0lfUkZDT01NX1dSSVRFX0lOX1BST0dSRVNTID0gOTAxLCAgICAgLyoqPCBSRkNPTU06IFdyaXRlIGluIHByb2dyZXNzICovCi0gIE9JX1JGQ09NTV9JTlZBTElEX0JBVURSQVRFID0gOTAzLCAgICAgIC8qKjwgUkZDT01NOiBJbnZhbGlkIGJhdWRyYXRlICovCi0gIE9JX1JGQ09NTV9JTlZBTElEX0RBVEFCSVQgPSA5MDQsICAgICAgIC8qKjwgUkZDT01NOiBJbnZhbGlkIGRhdGFiaXQgKi8KLSAgT0lfUkZDT01NX0lOVkFMSURfU1RPUEJJVCA9IDkwNSwgICAgICAgLyoqPCBSRkNPTU06IEludmFsaWQgc3RvcGJpdCAqLwotICBPSV9SRkNPTU1fSU5WQUxJRF9QQVJJVFkgPSA5MDYsICAgICAgICAvKio8IFJGQ09NTTogSW52YWxpZCBwYXJpdHkgKi8KLSAgT0lfUkZDT01NX0lOVkFMSURfUEFSSVRZVFlQRSA9IDkwNywgICAgLyoqPCBSRkNPTU06IEludmFsaWQgcGFyaXR5dHlwZSAqLwotICBPSV9SRkNPTU1fSU5WQUxJRF9GTE9XQ09OVFJPTCA9IDkwOCwgICAvKio8IFJGQ09NTTogSW52YWxpZCBmbG93Y29udHJvbCAqLwotICBPSV9SRkNPTU1fU0VTU0lPTl9FWElTVFMgPSA5MDksICAgICAgICAvKio8IFJGQ09NTTogU2Vzc2lvbiBleGlzdHMgKi8KLSAgT0lfUkZDT01NX0lOVkFMSURfQ0hBTk5FTCA9IDkxMCwgICAgICAgLyoqPCBSRkNPTU06IEludmFsaWQgY2hhbm5lbCAqLwotICBPSV9SRkNPTU1fRExDSV9FWElTVFMgPSA5MTEsICAgICAgICAgICAvKio8IFJGQ09NTTogRExDSSBleGlzdHMgKi8KLSAgT0lfUkZDT01NX0xJTktfTk9UX0ZPVU5EID0gOTEyLCAgICAgICAgLyoqPCBSRkNPTU06IExpbmsgbm90IGZvdW5kICovCi0gIE9JX1JGQ09NTV9SRU1PVEVfUkVKRUNUID0gOTEzLCAgICAgICAgIC8qKjwgUkZDT01NOiBSZW1vdGUgcmVqZWN0ICovCi0gIE9JX1JGQ09NTV9URVNUX0lOX1BST0dSRVNTID0gOTE1LCAgICAgIC8qKjwgUkZDT01NOiBUZXN0IGluIHByb2dyZXNzICovCi0gIE9JX1JGQ09NTV9TRVNTSU9OX05PVF9GT1VORCA9IDkxNiwgICAgIC8qKjwgUkZDT01NOiBTZXNzaW9uIG5vdCBmb3VuZCAqLwotICBPSV9SRkNPTU1fSU5WQUxJRF9QQUNLRVQgPSA5MTcsICAgICAgICAvKio8IFJGQ09NTTogSW52YWxpZCBwYWNrZXQgKi8KLSAgT0lfUkZDT01NX0ZSQU1FU0laRV9FWENFRURFRCA9IDkxOCwgICAgLyoqPCBSRkNPTU06IEZyYW1lc2l6ZSBleGNlZWRlZCAqLwotICBPSV9SRkNPTU1fSU5WQUxJRF9ETENJID0gOTIwLCAgICAgICAgICAvKio8IFJGQ09NTTogSW52YWxpZCBkbGNpICovCi0gIE9JX1JGQ09NTV9TRVJWRVJfTk9UX1JFR0lTVEVSRUQgPSA5MjEsIC8qKjwgUkZDT01NOiBTZXJ2ZXIgbm90IHJlZ2lzdGVyZWQgKi8KLSAgT0lfUkZDT01NX0NSRURJVF9FUlJPUiA9IDkyMiwgICAgICAgICAgLyoqPCBSRkNPTU06IENyZWRpdCBlcnJvciAqLwotICBPSV9SRkNPTU1fTk9fQ0hBTk5FTF9OVU1CRVIgPSA5MjMsICAgICAvKio8IFJGQ09NTTogTm8gY2hhbm5lbCBudW1iZXIgKi8KLSAgT0lfUkZDT01NX1FVRVJZX0lOX1BST0dSRVNTID0gOTI0LCAgICAgLyoqPCBSRkNPTU06IFF1ZXJ5IGluIHByb2dyZXNzICovCi0gIE9JX1JGQ09NTV9TRVNTSU9OX1NIVVRET1dOID0gOTI1LCAgICAgIC8qKjwgUkZDT01NOiBTZXNzaW9uIHNodXRkb3duICovCi0gIE9JX1JGQ09NTV9MT0NBTF9ERVZJQ0VfRElTQ09OTkVDVEVEID0KLSAgICAgIDkyNiwgLyoqPCBSRkNPTU06IExvY2FsIGRldmljZSBkaXNjb25uZWN0ZWQgKi8KLSAgT0lfUkZDT01NX1JFTU9URV9ERVZJQ0VfRElTQ09OTkVDVEVEID0KLSAgICAgIDkyNywgLyoqPCBSRkNPTU06IFJlbW90ZSBkZXZpY2UgZGlzY29ubmVjdGVkICovCi0gIE9JX1JGQ09NTV9PVVRfT0ZfU0VSVkVSX0NIQU5ORUxTID0gOTI4LCAvKio8IFJGQ09NTTogT3V0IG9mIHNlcnZlciBjaGFubmVscyAqLwotCi0gIE9JX0RJU1BBVENIX0lOVkFMSURfQ0JfSEFORExFID0KLSAgICAgIDEwMDEsIC8qKjwgRGlzcGF0Y2hlciB3YXMgaGFuZGVkIGFuIGludmFsaWQgY2FsbGJhY2sgaGFuZGxlICovCi0gIE9JX0RJU1BBVENIX1RBQkxFX09WRVJGTE9XID0gMTAwMiwgLyoqPCBEaXNwYXRjaGVyIHRhYmxlIGlzIGZ1bGwgKi8KLQotICBPSV9URVNUX1VOS05PV05fVEVTVCA9IDExMDEsIC8qKjwgVEVTVDogVW5rbm93biB0ZXN0ICovCi0gIE9JX1RFU1RfRkFJTCA9IDExMDIsICAgICAgICAgLyoqPCBURVNUOiBGYWlsICovCi0KLSAgT0lfSENJVFJBTlNfQ0FOTk9UX0NPTk5FQ1RfVE9fREVWSUNFID0KLSAgICAgIDEyMDEsIC8qKjwgVFJBTlNQT1JUOiBDYW5ub3QgY29ubmVjdCB0byBkZXZpY2UgKi8KLSAgT0lfSENJVFJBTlNfQlVGRkVSX1RPT19TTUFMTCA9IDEyMDMsICAgLyoqPCBUUkFOU1BPUlQ6IEJ1ZmZlciB0b28gc21hbGwgKi8KLSAgT0lfSENJVFJBTlNfTlVMTF9ERVZJQ0VfSEFORExFID0gMTIwNCwgLyoqPCBUUkFOU1BPUlQ6IE51bGwgZGV2aWNlIGhhbmRsZSAqLwotICBPSV9IQ0lUUkFOU19JT19FUlJPUiA9IDEyMDUsICAgICAgICAgICAvKio8IFRSQU5TUE9SVDogSU8gZXJyb3IgKi8KLSAgT0lfSENJVFJBTlNfREVWSUNFX05PVF9SRUFEWSA9IDEyMDYsICAgLyoqPCBUUkFOU1BPUlQ6IERldmljZSBub3QgcmVhZHkgKi8KLSAgT0lfSENJVFJBTlNfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRCA9Ci0gICAgICAxMjA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRSQU5TUE9SVDogRnVuY3Rpb24gbm90IHN1cHBvcnRlRCAqLwotICBPSV9IQ0lUUkFOU19BQ0NFU1NfREVOSUVEID0gMTIwOSwgICAgLyoqPCBUUkFOU1BPUlQ6IHdpbjMyICovCi0gIE9JX0hDSVRSQU5TX0FDTF9EQVRBX0VSUk9SID0gMTIxMCwgICAvKio8IFRSQU5TUE9SVDogQUNMIGRhdGEgZXJyb3IgKi8KLSAgT0lfSENJVFJBTlNfU0NPX0RBVEFfRVJST1IgPSAxMjExLCAgIC8qKjwgVFJBTlNQT1JUOiBTQ08gZGF0YSBlcnJvciAqLwotICBPSV9IQ0lUUkFOU19FVkVOVF9EQVRBX0VSUk9SID0gMTIxMiwgLyoqPCBUUkFOU1BPUlQ6IEhDSSBldmVudCBkYXRhIGVycm9yICovCi0gIE9JX0hDSVRSQU5TX0lOVEVSTkFMX0VSUk9SID0KLSAgICAgIDEyMTQsIC8qKjwgVFJBTlNQT1JUOiBJbnRlcm5hbCBlcnJvciBpbiB0aGUgdHJhbnNwb3J0ICovCi0gIE9JX0hDSVRSQU5TX0xJTktfTk9UX0FDVElWRSA9Ci0gICAgICAxMjE1LCAvKio8IFRSQU5TUE9SVDogTGluayB0byB0aGUgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlICovCi0gIE9JX0hDSVRSQU5TX0lOSVRJQUxJWklORyA9IDEyMTYsIC8qKjwgVFJBTlNQT1JUOiBUcmFuc3BvcnQgaXMgaW5pdGlhbGl6aW5nICovCi0KLSAgT0lfREVWTUdSX05PX0NPTk5FQ1RJT04gPSAxMzAxLCAgLyoqPCBERVZNR1I6IE5vIGNvbm5lY3Rpb24gKi8KLSAgT0lfREVWTUdSX0hBUkRXQVJFX0VSUk9SID0gMTMwNSwgLyoqPCBERVZNR1I6IGVycm9yIHJlcG9ydGVkIGJ5IEhDSSAqLwotICBPSV9ERVZNR1JfUEVORElOR19DT05ORUNUX0xJU1RfRlVMTCA9Ci0gICAgICAxMzA3LCAvKio8IERFVk1HUjogUGVuZGluZyBjb25uZWN0IGxpc3QgZnVsbCAqLwotICBPSV9ERVZNR1JfQ09OTkVDVElPTl9MSVNUX0ZVTEwgPSAxMzA5LCAvKio8IERFVk1HUjogQ29ubmVjdGlvbiBsaXN0IGZ1bGwgKi8KLSAgT0lfREVWTUdSX05PX1NVQ0hfQ09OTkVDVElPTiA9IDEzMTAsICAgLyoqPCBERVZNR1I6IE5vIHN1Y2ggY29ubmVjdGlvbiAqLwotICBPSV9ERVZNR1JfSU5RVUlSWV9JTl9QUk9HUkVTUyA9IDEzMTEsICAvKio8IERFVk1HUjogSW5xdWlyeSBpbiBwcm9ncmVzcyAqLwotICBPSV9ERVZNR1JfUEVSSU9ESUNfSU5RVUlSWV9BQ1RJVkUgPQotICAgICAgMTMxMiwgLyoqPCBERVZNR1I6IFBlcmlvZGljIGlucXVpcnkgYWN0aXZlICovCi0gIE9JX0RFVk1HUl9OT19JTlFVSVJJRVNfQUNUSVZFID0KLSAgICAgIDEzMTMsIC8qKjwgREVWTUdSOiBjYW4gbm90IGNhbmNlbC9leGl0IGlmIG5vdCBhY3RpdmUgKi8KLSAgT0lfREVWTUdSX0RVUExJQ0FURV9DT05ORUNUSU9OID0gMTMxNCwgLyoqPCBERVZNR1I6IGludGVybmFsIGVycm9yICovCi0gIE9JX0RFVk1HUl9EVVBMSUNBVEVfRVZFTlRfQ0FMTEJBQ0sgPQotICAgICAgMTMxNiwgLyoqPCBERVZNR1I6IGF0dGVtcHQgdG8gcmVnaXN0ZXIgc2FtZSBjYWxsYmFjayB0d2ljZSAqLwotICBPSV9ERVZNR1JfRVZFTlRfQ0FMTEJBQ0tfTElTVF9GVUxMID0KLSAgICAgIDEzMTcsIC8qKjwgREVWTUdSOiBjYW4gbm90IHJlZ2lzdGVyIGV2ZW50IGNhbGxiYWNrLCBsaXN0IGlzIGZ1bGwgKi8KLSAgT0lfREVWTUdSX0VWRU5UX0NBTExCQUNLX05PVF9GT1VORCA9Ci0gICAgICAxMzE4LCAvKio8IERFVk1HUjogYXR0ZW1wdCB0byB1bnJlZ2lzdGVyIGNhbGxiYWNrIGZhaWxlZCAqLwotICBPSV9ERVZNR1JfQlVTWSA9Ci0gICAgICAxMzE5LCAvKio8IERFVk1HUjogc29tZSBvcGVyYXRpb25zIGNhbiBvbmx5IGV4ZWN1dGUgb25lIGF0IGEgdGltZSAqLwotICBPSV9ERVZNR1JfRU5VTV9VTkVYUEVDVEVEX0lOUV9DT01QTEVURSA9IDEzMjAsIC8qKjwgREVWTUdSOiBpbnF1aXJ5IGNvbXBsZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaW4gaW5hcHByb3ByaWF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uIHN0YXRlICovCi0gIE9JX0RFVk1HUl9FTlVNX1VORVhQRUNURURfSU5RX1JFU1VMVCA9IDEzMjEsIC8qKjwgREVWTUdSOiBpbnF1aXJ5IHJlc3VsdCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbmFwcHJvcHJpYXRlIGVudW1lcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlICovCi0gIE9JX0RFVk1HUl9FTlVNX0RBVEFCQVNFX0ZVTEwgPSAxMzIyLCAvKio8IERFVk1HUjogZGV2aWNlIGVudW1lcmF0aW9uLCBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZnVsbCwgY291bGRuJ3QgYWRkIGEgbmV3IGRldmljZSAqLwotICBPSV9ERVZNR1JfRU5VTV9JTlFVSVJJRVNfT1ZFUkxBUCA9IDEzMjMsIC8qKjwgREVWTUdSOiBkZXZpY2UgZW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMgaW5xdWlyaWVzIG9jY3VycmluZyB0b28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSB0b2dldGhlciAqLwotICBPSV9ERVZNR1JfVU5LTk9XTl9MSU5LX1RZUEUgPQotICAgICAgMTMyNCwgLyoqPCBERVZNR1I6IEhDSSBjb25uZWN0IHJlcXVlc3Qgd2l0aCB1bmtvd24gbGluayB0eXBlICovCi0gIE9JX0RFVk1HUl9QQVJBTV9JT19BQ1RJVkUgPSAxMzI1LCAvKio8IERFVk1HUjogcmVxdWVzdCBmb3IgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXRlIHdoaWxlIHBhcmFtIHJlYWQvd3JpdGUgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBPSV9ERVZNR1JfVU5LTk9XTl9JQUNfTEFQID0gMTMyNiwgLyoqPCBERVZNR1I6IHVucmVjb2duaXplZCBJQUMgTEFQICovCi0gIE9JX0RFVk1HUl9TQ09fQUxSRUFEWV9SRUdJU1RFUkVEID0KLSAgICAgIDEzMjcsIC8qKjwgREVWTUdSOiBvbmx5IG9uZSBhcHBsaWNhdGlvbiBjYW4gdXNlIFNDTyAqLwotICBPSV9ERVZNR1JfU0NPX05PVF9SRUdJU1RFUkVEID0KLSAgICAgIDEzMjgsIC8qKjwgREVWTUdSOiBTQ08gYXBwbGljYXRpb25zIG11c3QgcmVnaXN0ZXIgYmVmb3JlIHVzaW5nIHRoZSBBUEkgKi8KLSAgT0lfREVWTUdSX1NDT19XSVRIT1VUX0FDTCA9IDEzMjksIC8qKjwgREVWTUdSOiBHb3QgU0NPIGNvbm5lY3Rpb24gYnV0IHRoZXJlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyB1bmRlcmx5aW5nIEFDTCBjb25uZWN0aW9uICovCi0gIE9JX0RFVk1HUl9OT19TVVBQT1JUID0KLSAgICAgIDEzMzAsIC8qKjwgREVWTUdSOiBSZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSAqLwotICBPSV9ERVZNR1JfV1JJVEVfUE9MSUNZX0ZBSUxFRCA9IDEzMzEsIC8qKjwgREVWTUdSOiBjb25uZWN0aW9uIGF0dGVtcHQgZmFpbGVkIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gd3JpdGUgbGluayBwb2xpY3kgKi8KLSAgT0lfREVWTUdSX05PVF9JTl9NQVNURVJfTU9ERSA9IDEzMzIsICAvKio8IERFVk1HUjogT0lfREVWTUdSIEVuZE1hc3Rlck1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHByaW9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfREVWTUdSX0JlZ2luTWFzdGVyTW9kZSAqLwotICBPSV9ERVZNR1JfUE9MSUNZX1ZJT0xBVElPTiA9IDEzMzMsIC8qKjwgREVWTUdSOiBsb3ctcG93ZXIgcmVxdWVzdCBpcyByZWplY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGluayBwb2xpY3kgZG9lcyBub3QgYWxsb3cgaXQgKi8KLSAgT0lfREVWTUdSX0JVU1lfVElNRU9VVCA9IDEzMzQsIC8qKjwgREVWTUdSOiBxdWV1ZWQgb3BlcmF0aW9uIHRpbWVkIG91dCB3aGlsZQotaW4gdGhlIHF1ZXVlOyBcbgotdGltZW91dCBjb25maWd1cmFibGUgdmlhIEByZWYgT0lfQ09ORklHX0RFVk1HUjo6Y29ubmVjdFF1ZXVlVGltZW91dFNlY3MKLSJjb25uZWN0UXVldWVUaW1lb3V0U2VjcyIgKi8KLSAgT0lfREVWTUdSX1JFRU5DUllQVF9GQUlMRUQgPQotICAgICAgMTMzNSwgLyoqPCBERVZNR1I6IGZhaWxlZCB0byByZS1lbmNyeXB0IGxpbmsgYWZ0ZXIgcm9sZSBzd2l0Y2ggKi8KLSAgT0lfREVWTUdSX1JPTEVfUE9MSUNZX0NPTkZMSUNUID0KLSAgICAgIDEzMzYsIC8qKjwgREVWTUdSOiByZXF1ZXN0ZWQgcm9sZSBjb25mbGljdHMgd2l0aCBjdXJyZW50IHBvbGljeSAqLwotICBPSV9ERVZNR1JfQkFEX0lOVEVSVkFMID0gMTMzNywgLyoqPCBERVZNR1I6IGN1cnJlbnQgbGlua1RPIG91dHNpZGUgcmFuZ2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBtaW4vbWF4IGludGVydmFsICovCi0gIE9JX0RFVk1HUl9JTlZBTElEX1NDT19IQU5ETEUgPQotICAgICAgMTMzOCwgLyoqPCBERVZNR1I6IEhDSSBTQ08gZXZlbnQsIGludmFsaWQgaGFuZGxlICovCi0gIE9JX0RFVk1HUl9DT05ORUNUSU9OX09WRVJMQVAgPSAxMzM5LCAvKio8IERFVk1HUjogQ29ubmVjdGlvbiBmYWlsZWQgZHVlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWNlIGNvbmRpdGlvbiB3aXRoIHJlbW90ZSBzaWRlICovCi0gIE9JX0RFVk1HUl9PUlBIQU5fU1VCUkFURV9DT01QTEVURSA9Ci0gICAgICAxMzQwLCAvKio8IERFVk1HUjogc25pZmYgc3VicmF0ZSBjb21wbGV0ZSwgYnV0IG5vIGNhbGxiYWNrICovCi0gIE9JX0RFVk1HUl9FSVJfUkVTUE9OU0VfMl9MQVJHRSA9Ci0gICAgICAxMzQxLCAvKio8IERFVk1HUjogZWlyIGJ1aWxkZXIsIHJlc3BvbnNlIGxlbmd0aCB3b3VsZCBleGNlZWQgc3BlYyBtYXggKi8KLQotICBPSV9TRUNNR1JfTk9fUE9MSUNZID0KLSAgICAgIDE0MDEsIC8qKjwgU0VDTUdSOiBubyBzZWN1cml0eSBwb2xpY3kgaGFzIGJlZW4gZXN0YWJsaXNoZWQgKi8KLSAgT0lfU0VDTUdSX0lOVEVSTkFMX0VSUk9SID0gMTQwMiwgLyoqPCBTRUNNR1I6IGludGVybmFsIGluY29uc2lzdGVuY3kgKi8KLSAgT0lfU0VDTUdSX09SUEhBTkVEX0NBTExCQUNLID0KLSAgICAgIDE0MDMsIC8qKjwgU0VDTUdSOiB3ZSd2ZSBiZWVuIGNhbGxlZCBiYWNrLCBidXQgQ0IgY29udGV4dCBpcyBnb25lICovCi0gIE9JX1NFQ01HUl9CVVNZID0KLSAgICAgIDE0MDQsIC8qKjwgU0VDTUdSOiBjb25maWd1cmUgYW5kIGFjY2VzcyByZXF1ZXN0IGNhbm5vdCBiZSBjb25jdXJyZW50ICovCi0gIE9JX1NFQ01HUl9ERVZJQ0VfTk9UX1RSVVNURUQgPQotICAgICAgMTQwNSwgLyoqPCBTRUNNR1I6IGwyY2FwIGFjY2VzcyBkZW5pZWQgLSBkZXZpY2UgaXMgbm90IHRydXN0ZWQgKi8KLSAgT0lfU0VDTUdSX0RFVklDRV9FTkNSWVBUX0ZBSUwgPQotICAgICAgMTQwNywgLyoqPCBTRUNNR1I6IGwyY2FwIGFjY2VzcyBkZW5pZWQgLSBmYWlsZWQgdG8gc3RhcnQgZW5jcnlwdGlvbiAqLwotICBPSV9TRUNNR1JfRElTQ09OTkVDVEVEX0ZBSUwgPQotICAgICAgMTQwOCwgLyoqPCBTRUNNR1I6IGwyY2FwIGFjY2VzcyBkZW5pZWQgLSBkaXNjb25uZWN0ZWQgKi8KLSAgT0lfU0VDTUdSX0FDQ0VTU19QRU5ESU5HID0KLSAgICAgIDE0MDksIC8qKjwgU0VDTUdSOiBsMmNhcCBhY2Nlc3MgcmVxdWVzdCBpcyBzdGlsbCBwZW5kaW5nICAqLwotICBPSV9TRUNNR1JfUElOX0NPREVfVE9PX1NIT1JUID0gMTQxMCwgLyoqPCBTRUNNR1I6IEhpZ2hlci1sYXllciBwcm9jZXNzIGdhdmUgdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcGluIGNvZGUgdGhhdCBpcyB0b28gc2hvcnQgKi8KLSAgT0lfU0VDTUdSX1VOS05PV05fRU5DUllQVF9WQUxVRSA9IDE0MTEsIC8qKjwgU0VDTUdSOiBnb3QgRW5jcnlwdGlvbkNoYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIHVua25vd24gZW5jcnlwdGlvbiBlbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICovCi0gIE9JX1NFQ01HUl9JTlZBTElEX1BPTElDWSA9IDE0MTIsIC8qKjwgU0VDTUdSOiB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IHBvbGljeSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdmFsaWQgZm9yIHNlY3VyaXR5IG1vZGUgKi8KLSAgT0lfU0VDTUdSX0FVVEhPUklaQVRJT05fRkFJTEVEID0KLSAgICAgIDE0MTMsIC8qKjwgU0VDTUdSOiBkZXZpY2UgYXV0aG9yaXphdGlvbiBmYWlsZWQgKi8KLSAgT0lfU0VDTUdSX0VOQ1JZUFRJT05fRkFJTEVEID0gMTQxNCwgLyoqPCBTRUNNR1I6IGRldmljZSBlbmNyeXB0aW9uIGZhaWxlZCAqLwotICBPSV9TRUNNR1JfVU5JVF9LRVlfVU5TVVBQT1JURUQgPQotICAgICAgMTQxNSwgLyoqPCBTRUNNR1I6IGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBkdWUgdG8gbm9uLXN1cHBvcnQgb2YgdW5pdCBrZXlzCi0gICAgICAgICAgICAgKi8KLSAgT0lfU0VDTUdSX05PVF9SRUdJU1RFUkVEID0KLSAgICAgIDE0MTYsIC8qKjwgU0VDTUdSOiByZXF1aXJlZCByZWdpc3RyYXRpb25zIGhhdmUgbm90IHlldCBvY2N1cnJlZCAqLwotICBPSV9TRUNNR1JfSUxMRUdBTF9XUklURV9TU1BfTU9ERSA9Ci0gICAgICAxNDE3LCAvKio8IFNFQ01HUjogMi4xIEhDSSBzcGVjIGRvZXMgbm90IGFsbG93IFNTUCBtb2RlIHRvIGJlIGRpc2FibGVkICovCi0gIE9JX1NFQ01HUl9JTlZBTElEX1NFQ19MRVZFTCA9Ci0gICAgICAxNDE4LCAvKio8IFNFQ01HUjogc2VjdXJpdHkgbGV2ZWwgZm9yIGEgc2VydmljZSBpcyBub3QgYSB2YWxpZCB2YWx1ZSAqLwotICBPSV9TRUNNR1JfSU5TVUZGSUNJRU5UX0xJTktfS0VZID0gMTQxOSwgLyoqPCBTRUNNR1I6IGxpbmsga2V5IHR5cGUgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNpZW50IHRvIG1lZXQgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzICovCi0gIE9JX1NFQ01HUl9JTlZBTElEX0tFWV9UWVBFID0KLSAgICAgIDE0MjAsIC8qKjwgU0VDTUdSOiBsaW5rIGtleSB0eXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlICovCi0gIE9JX1NFQ01HUl9TU1BfTk9UX0VOQ1JZUFRFRCA9Ci0gICAgICAxNDIxLCAvKio8IFNFQ01HUjogc3NwIHJlcXVpcmVkIGVuY3J5cHRpb24gb24gaW5jb21pbmcgbGluayAqLwotICBPSV9TRUNNR1JfT1JQSEFOX0VWRU5UID0gMTQyMiwgLyoqPCBTRUNNR1I6IHNvbWUgSENJIHNlY3VyaXR5IGV2ZW50IHVucmVsYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3VycmVudCBwcm9jZXNzZXMgKi8KLSAgT0lfU0VDTUdSX05PVF9CT05EQUJMRSA9IDE0MjMsIC8qKjwgU0VDTUdSOiBub3QgaW4gYm9uZGFibGUgbW9kZSAqLwotCi0gIE9JX1RDU19JTlZBTElEX0VMRU1FTlRfVFlQRSA9IDE2MDIsIC8qKjwgVENTOiBlbGVtZW50IHR5cGUgaXMgaW52YWxpZCAqLwotICBPSV9UQ1NfSU5WQUxJRF9QQUNLRVQgPSAxNjAzLCAgICAgICAvKio8IFRDUzogcGFja2V0IGlzIGludmFsaWRlICovCi0gIE9JX1RDU19DQUxMX0lOX1BST0dSRVNTID0gMTYwNCwgICAgIC8qKjwgVENTOiBjYWxsIGlzIGluIHByb2dyZXNzICovCi0gIE9JX1RDU19OT19DQUxMX0lOX1BST0dSRVNTID0gMTYwNSwgIC8qKjwgVENTOiBubyBjYWxsIGluIHByb2dyZXNzICovCi0KLSAgT0lfT0JFWF9DT05USU5VRSA9IDE3MDEsIC8qKjwgT0JFWDogQ29udGludWUgcHJvY2Vzc2luZyBPQkVYIHJlcXVlc3QgKi8KLSAgT0lfT0JFWF9DT01NQU5EX0VSUk9SID0KLSAgICAgIDE3MDIsIC8qKjwgT0JFWDogQW4gdW5yZWNvZ25pemVkIE9CRVggY29tbWFuZCBvcGNvZGUgKi8KLSAgT0lfT0JFWF9DT05ORUNUSU9OX1RJTUVPVVQgPQotICAgICAgMTcwMywgLyoqPCBPQkVYOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdG8gYSByZXF1ZXN0ICovCi0gIE9JX09CRVhfQ09OTkVDVF9GQUlMRUQgPQotICAgICAgMTcwNCwgLyoqPCBPQkVYOiBBbiBPQkVYIGNvbm5lY3Rpb24gcmVxdWVzdCBkaWQgbm90IHN1Y2NlZWQgKi8KLSAgT0lfT0JFWF9ESVNDT05ORUNUX0ZBSUxFRCA9IDE3MDUsIC8qKjwgT0JFWDogQSBkaXNjb25uZWN0IGZhaWxlZCBwcm9iYWJseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgY29ubmVjdGlvbiBkaWQgbm90IGV4aXN0ICovCi0gIE9JX09CRVhfRVJST1IgPSAxNzA2LCAgICAgICAgICAgICAvKio8IE9CRVg6IFVuc3BlY2lmaWVkIE9CRVggZXJyb3IgKi8KLSAgT0lfT0JFWF9JTkNPTVBMRVRFX1BBQ0tFVCA9IDE3MDcsIC8qKjwgT0JFWDogUGFja2V0IHRvbyBzaG9ydCBvciBjb3JydXB0ICovCi0gIE9JX09CRVhfTEVOR1RIX1JFUVVJUkVEID0KLSAgICAgIDE3MDgsIC8qKjwgT0JFWDogTGVuZ3RoIGhlYWRlciByZXF1aXJlZCBpbiBPQkVYIGNvbW1hbmQgKi8KLSAgT0lfT0JFWF9OT1RfQ09OTkVDVEVEID0gMTcwOSwgLyoqPCBPQkVYOiBObyBjb25uZWN0aW9uIHRvIE9CRVggc2VydmVyICovCi0gIE9JX09CRVhfTk9fTU9SRV9DT05ORUNUSU9OUyA9Ci0gICAgICAxNzEwLCAvKio8IE9CRVg6IFJlYWNoZWQgbWF4IGNvbm5lY3Rpb25zIGxpbWl0ICovCi0gIE9JX09CRVhfT1BFUkFUSU9OX0lOX1BST0dSRVNTID0KLSAgICAgIDE3MTEsIC8qKjwgT0JFWDogQW5vdGhlciBvcGVyYXRpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3Mgb24gYSBjb25uZWN0aW9uICovCi0gIE9JX09CRVhfUFVUX1JFU1BPTlNFX0VSUk9SID0KLSAgICAgIDE3MTIsIC8qKjwgT0JFWDogQW4gZXJyb3IgaW4gdGhlIHJlc3BvbnNlIHRvIGEgUFVUIGNvbW1hbmQgKi8KLSAgT0lfT0JFWF9HRVRfUkVTUE9OU0VfRVJST1IgPQotICAgICAgMTcxMywgLyoqPCBPQkVYOiBBbiBlcnJvciBpbiB0aGUgcmVzcG9uc2UgdG8gYSBHRVQgY29tbWFuZCAqLwotICBPSV9PQkVYX1JFUVVJUkVEX0hFQURFUl9OT1RfRk9VTkQgPQotICAgICAgMTcxNCwgLyoqPCBPQkVYOiBwYWNrZXQgd2FzIG1pc3NpbmcgYSByZXF1aXJlZCBoZWFkZXIgKi8KLSAgT0lfT0JFWF9TRVJWSUNFX1VOQVZBSUxBQkxFID0KLSAgICAgIDE3MTUsIC8qKjwgT0JFWDogVW5vd24gT0JFWCB0YXJnZXQgb3IgcmVxdWlyZWQgc2VydmljZSAqLwotICBPSV9PQkVYX1RPT19NQU5ZX0hFQURFUl9CWVRFUyA9Ci0gICAgICAxNzE2LCAvKio8IE9CRVg6IEhlYWRlcnMgd2lsbCBub3QgZml0IGluIHNpbmdsZSBPQkVYIHBhY2tldCAqLwotICBPSV9PQkVYX1VOS05PV05fQ09NTUFORCA9IDE3MTcsICAgICAvKio8IE9CRVg6IFVucmVjb2duaXplZCBPQkVYIGNvbW1hbmQgKi8KLSAgT0lfT0JFWF9VTlNVUFBPUlRFRF9WRVJTSU9OID0gMTcxOCwgLyoqPCBPQkVYOiBWZXJzaW9uIG1pc21hdGNoICovCi0gIE9JX09CRVhfQ0xJRU5UX0FCT1JURURfQ09NTUFORCA9Ci0gICAgICAxNzE5LCAgICAgICAgICAgICAgICAgIC8qKjwgT0JFWDogc2VydmVyIHJlY2VpdmVkIGFib3J0IGNvbW1hbmQgKi8KLSAgT0lfT0JFWF9CQURfUEFDS0VUID0gMTcyMCwgLyoqPCBPQkVYOiBBbnkgbWFsZm9ybWVkIE9CRVggcGFja2V0ICovCi0gIE9JX09CRVhfQkFEX1JFUVVFU1QgPQotICAgICAgMTcyMSwgLyoqPCBPQkVYOiBNYXBzIHRvIE9CRVggcmVzcG9uc2Ugb2YgdGhlIHNhbWUgbmFtZSAqLwotICBPSV9PQkVYX09CSkVDVF9PVkVSRkxPVyA9IDE3MjMsIC8qKjwgT0JFWDogVG9vIG1hbnkgYnl0ZXMgcmVjZWl2ZWQuICovCi0gIE9JX09CRVhfTk9UX0ZPVU5EID0gMTcyNCwgLyoqPCBPQkVYOiBNYXBzIHRvIG9iZXggcmVzcG9uc2Ugb2Ygc2FtZSBuYW1lICovCi0gIE9JX09CRVhfQUNDRVNTX0RFTklFRCA9Ci0gICAgICAxNzM1LCAvKio8IE9CRVg6IE9iamVjdCBjb3VsZCBub3QgYmUgcmVhZCBvciB3cml0dGVuLiAqLwotICBPSV9PQkVYX1ZBTFVFX05PVF9BQ0NFUFRBQkxFID0KLSAgICAgIDE3MzYsIC8qKjwgT0JFWDogVmFsdWUgaW4gYSBjb21tYW5kIHdhcyBub3QgaW4gdGhlIGFjY2VwdGFibGUgcmFuZ2UuICovCi0gIE9JX09CRVhfUEFDS0VUX09WRVJGTE9XID0KLSAgICAgIDE3MzcsIC8qKjwgT0JFWDogQnVmZmVyIHdpbGwgbm90IGZpdCBpbiBhIHNpbmdsZSBPQkVYIHBhY2tldC4gKi8KLSAgT0lfT0JFWF9OT19TVUNIX0ZPTERFUiA9Ci0gICAgICAxNzM4LCAvKio8IE9CRVg6IEVycm9yIHJldHVybmVkIGJ5IGEgc2V0cGF0aCBvcGVyYXRpb24uICovCi0gIE9JX09CRVhfTkFNRV9SRVFVSVJFRCA9Ci0gICAgICAxNzM5LCAvKio8IE9CRVg6IE5hbWUgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLWVtcHR5LiAqLwotICBPSV9PQkVYX1BBU1NXT1JEX1RPT19MT05HID0KLSAgICAgIDE3NDAsIC8qKjwgT0JFWDogUGFzc3dvcmQgZXhjZWVkcyBpbXBsZW1lbnRhdGlvbiBpbXBvc2VkIGxlbmd0aCBsaW1pdC4gKi8KLSAgT0lfT0JFWF9QUkVDT05ESVRJT05fRkFJTEVEID0gMTc0MSwgLyoqPCBPQkVYOiByZXNwb25zZSBQcmVjb25kaXRpb24gRmFpbGVkICovCi0gIE9JX09CRVhfVU5BVVRIT1JJWkVEID0gMTc0MiwgLyoqPCBPQkVYOiBhdXRoZW50aWNhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwuICovCi0gIE9JX09CRVhfTk9UX0lNUExFTUVOVEVEID0gMTc0MywgLyoqPCBPQkVYOiBVbmltcGxlbWVudGVkIGZlYXR1cmUuICovCi0gIE9JX09CRVhfSU5WQUxJRF9BVVRIX0RJR0VTVCA9Ci0gICAgICAxNzQ0LCAvKio8IE9CRVg6IEFuIGF1dGhlbnRpY2F0aW9uIGRpZ2VzdCB3YXMgYmFkLiAqLwotICBPSV9PQkVYX0lOVkFMSURfT1BFUkFUSU9OID0KLSAgICAgIDE3NDUsIC8qKjwgT0JFWDogT3BlcmF0aW9uIG5vdCBhbGxvd2VkIGF0IHRoaXMgdGltZS4gKi8KLSAgT0lfT0JFWF9EQVRBQkFTRV9GVUxMID0gMTc0NiwgICAvKio8IE9CRVg6IFN5bmMgZGF0YWJhc2UgZnVsbC4gKi8KLSAgT0lfT0JFWF9EQVRBQkFTRV9MT0NLRUQgPSAxNzQ3LCAvKio8IE9CRVg6IFN5bmMgZGF0YWJhc2UgbG9ja2VkLiAqLwotICBPSV9PQkVYX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiA9Ci0gICAgICAxNzQ4LCAvKio8IE9CRVg6IHJlc3BvbnNlIEludGVybmFsIFNlcnZlciBFcnJvciAqLwotICBPSV9PQkVYX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgPQotICAgICAgMTc0OSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT0JFWDogcmVzcG9uc2UgVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSAqLwotICBPSV9PQkVYX1BBUlRJQUxfQ09OVEVOVCA9IDE3NTAsIC8qKjwgT0JFWDogcmVzcG9uc2UgUGFydGlhbCBDb250ZW50ICovCi0gIE9JX09CRVhfTUVUSE9EX05PVF9BTExPV0VEID0gMTc1MSwgLyoqPCBPQkVYOiByZXNwb25zZSBNZXRob2QgTm90IEFsbG93ZWQgKi8KLSAgT0lfT0JFWFNSVl9JTkNPTVBMRVRFX0dFVCA9IDE3NTIsICAvKio8IE9CRVg6IEluZGljYXRlcyB0byBhIEdFVCBoYW5kbGVyIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdCBwaGFzZSBpcyBzdGlsbCBpbiBwcm9ncmVzcyAqLwotICBPSV9PQkVYX0ZPTERFUl9CUk9XU0lOR19OT1RfQUxMT1dFRCA9IDE3NTMsIC8qKjwgT0JFWDogSW5kaWNhdGVzIHRoYXQgYW4gRlRQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIGRvZXMgbm90IGFsbG93IGZvbGRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzaW5nICovCi0gIE9JX09CRVhfU0VSVkVSX0ZPUkNFRF9ESVNDT05ORUNUID0KLSAgICAgIDE3NTQsIC8qKjwgT0JFWDogY29ubmVjdGlvbiB3YXMgZm9yY2libHkgdGVybWluYXRlZCBieSB0aGUgc2VydmVyICovCi0gIE9JX09CRVhfT0ZTX0VSUk9SID0gMTc1NSwgLyoqPCBPQkVYOiBPUFAgb2JqZWN0IGZpbGUgc3lzdGVtIGVycm9yIG9jY3VycmVkICovCi0gIE9JX09CRVhfRklMRU9QX0VSUk9SID0KLSAgICAgIDE3NTYsIC8qKjwgT0JFWDogRlRQL1BCQVAgZmlsZSBvcGVyYXRpb24gc3lzdGVtIGVycm9yIG9jY3VycmVkICovCi0gIE9JX09CRVhfVVNFUklEX1RPT19MT05HID0KLSAgICAgIDE3NTcsIC8qKjwgT0JFWDogVXNlciBJZCBleGNlZWRzIHNwZWMgbGltaXRlZCBsZW5ndGggbGltaXQuICovCi0KLSAgT0lfSEFORFNGUkVFX0VWRU5UX1JFUE9SVElOR19ESVNBQkxFRCA9Ci0gICAgICAxODAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIQU5EU0ZSRUU6IEV2ZW50IHJlcG9ydGluZyBkaXNhYmxlZCAqLwotICBPSV9IQU5EU0ZSRUVfTk9UX0NPTk5FQ1RFRCA9IDE4MDIsIC8qKjwgSEFORFNGUkVFOiBOb3QgY29ubmVjdGVkICovCi0gIE9JX0hBTkRTRlJFRV9TRVJWSUNFX05PVF9TVEFSVEVEID0gMTgwMywgLyoqPCBIQU5EU0ZSRUU6IENhbm5vdCBjb25uZWN0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNmcmVlIEFHIGlmIGhhbmRzZnJlZSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN0YXJ0ZWQgKi8KLSAgT0lfSEFORFNGUkVFX0FHX1NFUlZJQ0VfTk9UX1NUQVJURUQgPQotICAgICAgMTgwNCwgLyoqPCBIQU5EU0ZSRUU6IENhbm5vdCBjb25uZWN0IHRvIGhhbmRzZnJlZSBkZXZpY2UgaWYgaGFuZHNmcmVlIEFHCi0gICAgICAgICAgICAgICBzZXJ2aWNlIG5vdCBzdGFydGVkICovCi0gIE9JX0hBTkRTRlJFRV9DT01NQU5EX0lOX1BST0dSRVNTID0KLSAgICAgIDE4MDUsIC8qKjwgSEFORFNGUkVFOiBDYW5ub3QgYWNjZXB0IGEgY29tbWFuZCBhdCB0aGlzIHRpbWUgKi8KLSAgT0lfSEFORFNGUkVFX0FVRElPX0FMUkVBRFlfQ09OTkVDVEVEID0KLSAgICAgIDE4MDYsIC8qKjwgSEFORFNGUkVFOiBBdWRpbyBpcyBhbHJlYWR5IGNvbm5lY3RlZCAqLwotICBPSV9IQU5EU0ZSRUVfQVVESU9fTk9UX0NPTk5FQ1RFRCA9Ci0gICAgICAxODA3LCAvKio8IEhBTkRTRlJFRTogQXVkaW8gaXMgbm90IGNvbm5lY3RlZCAqLwotICBPSV9IQU5EU0ZSRUVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEID0gMTgwOCwgLyoqPCBIQU5EU0ZSRUU6IExvY2FsIG9yIHJlbW90ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSBub3Qgc3VwcG9ydGVkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIGNvbW1hbmQgKi8KLQotICBPSV9IRUFEU0VUX1NFUlZJQ0VfTk9UX1NUQVJURUQgPSAxOTAxLCAvKio8IEhFQURTRVQ6IENhbm5vdCBjb25uZWN0IHRvIGhlYWRzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUcgaWYgaGVhZHNldCBzZXJ2aWNlIG5vdCBzdGFydGVkICovCi0gIE9JX0hFQURTRVRfQUdfU0VSVklDRV9OT1RfU1RBUlRFRCA9IDE5MDIsIC8qKjwgSEVBRFNFVDogQ2Fubm90IGNvbm5lY3QgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZHNldCBkZXZpY2UgaWYgaGVhZHNldCBBRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIG5vdCBzdGFydGVkICovCi0gIE9JX0hFQURTRVRfQ09NTUFORF9JTl9QUk9HUkVTUyA9Ci0gICAgICAxOTAzLCAvKio8IEhFQURTRVQ6IENhbm5vdCBhY2NlcHQgYSBjb21tYW5kIGF0IHRoaXMgdGltZSAqLwotCi0gIE9JX0JORVBfSU5WQUxJRF9NVFUgPQotICAgICAgMjAwMSwgLyoqPCBCTkVQOiBUaGUgcmVtb3RlIGRldmljZSBjYW5ub3Qgc3VwcG9ydCB0aGUgbWluaW11bSBCTkVQIE1UVSAqLwotICBPSV9CTkVQX1NFVFVQX1RJTUVPVVQgPSAyMDAyLCAvKio8IEJORVA6IFRoZSBzZXR1cCByZXF1ZXN0IHRpbWVkIG91dC4gKi8KLSAgT0lfQk5FUF9TRVJWSUNFX05PVF9SRUdJU1RFUkVEID0KLSAgICAgIDIwMDMsIC8qKjwgQk5FUDogVGhlIHJlcXVlc3RlZCBzZXJ2aWNlIHdhcyBub3QgZm91bmQuICovCi0gIE9JX0JORVBfSU5WQUxJRF9IQU5ETEUgPQotICAgICAgMjAwNCwgLyoqPCBCTkVQOiBUaGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG5vdCB2YWxpZC4gKi8KLSAgT0lfQk5FUF9SRVNQT05TRV9USU1FT1VUID0KLSAgICAgIDIwMDUsIC8qKjwgQk5FUDogVGhlIHRpbWVyIGZvciByZWNlaXZpbmcgYSByZXNwb25zZSBoYXMgZXhwaXJlZC4gKi8KLSAgT0lfQk5FUF9JTlZBTElEX0NPTk5FQ1RJT04gPSAyMDA2LCAvKio8IEJORVA6IEludmFsaWQgY29ubmVjdGlvbiAqLwotICBPSV9CTkVQX0lOVkFMSURfRklMVEVSID0gMjAwNywgLyoqPCBCTkVQOiBUaGUgc3VwcGxpZWQgZmlsdGVyIHdhcyBpbnZhbGlkLiAqLwotICBPSV9CTkVQX0NPTk5FQ1RJT05fRVhJU1RTID0KLSAgICAgIDIwMDgsIC8qKjwgQk5FUDogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBjcmVhdGUgYSBkdXBsaWNhdGUgY29ubmVjdGlvbi4gKi8KLSAgT0lfQk5FUF9OT1RfSU5JVElBTElaRUQgPSAyMDA5LCAvKio8IEJORVA6IEluaXQgaGFzIG5vdCBiZWVuIGNhbGxlZCAqLwotICBPSV9CTkVQX0NPTk5FQ1RfQkFTRSA9IDIwMTAsICAgIC8qKjwgQk5FUDogY29ubmVjdGlvbiByZXNwb25zZSBjb2RlcyAqLwotICBPSV9CTkVQX0NPTk5FQ1RfRkFJTEVEX0lOVkFMSURfREVTVF9VVUlEID0KLSAgICAgIDIwMTEsIC8qKjwgQk5FUDogY29ubmVjdCByZXNwb25zZSBjb2RlIEludmFsaWQgRGVzdCBVVUlEICovCi0gIE9JX0JORVBfQ09OTkVDVF9GQUlMRURfSU5WQUxJRF9TT1VSQ0VfVVVJRCA9Ci0gICAgICAyMDEyLCAvKio8IEJORVA6IGNvbm5lY3QgcmVzcG9uc2UgY29kZSBJbnZhbGlkIFNvdXJjZSBVVUlEICovCi0gIE9JX0JORVBfQ09OTkVDVF9GQUlMRURfSU5WQUxJRF9VVUlEX1NJWkUgPQotICAgICAgMjAxMywgLyoqPCBCTkVQOiBjb25uZWN0IHJlc3BvbnNlIGNvZGUgSW52YWxpZCBVVUlEIFNpemUgKi8KLSAgT0lfQk5FUF9DT05ORUNUX0ZBSUxFRF9OT1RfQUxMT1dFRCA9Ci0gICAgICAyMDE0LCAvKio8IEJORVA6IGNvbm5lY3QgcmVzcG9uc2UgY29kZSBOb3QgQWxsb3dlZCAqLwotICBPSV9CTkVQX0ZJTFRFUl9ORVRfQkFTRSA9IDIwMjAsIC8qKjwgQk5FUDogZmlsdGVyIHJlc3BvbnNlIGNvZGVzICovCi0gIE9JX0JORVBfRklMVEVSX05FVF9VTlNVUFBPUlRFRF9SRVFVRVNUID0KLSAgICAgIDIwMjEsIC8qKjwgQk5FUDogZmlsdGVyIHJlc3BvbnNlIGNvZGUgVW5zdXBwb3J0ZWQgUmVxdWVzdCAqLwotICBPSV9CTkVQX0ZJTFRFUl9ORVRfRkFJTEVEX0lOVkFMSURfUFJPVE9DT0xfVFlQRSA9Ci0gICAgICAyMDIyLCAvKio8IEJORVA6IGZpbHRlciByZXNwb25zZSBjb2RlIEludmFsaWQgUHJvdG9jb2wgVHlwZSAqLwotICBPSV9CTkVQX0ZJTFRFUl9ORVRfRkFJTEVEX01BWF9MSU1JVF9SRUFDSEVEID0KLSAgICAgIDIwMjMsIC8qKjwgQk5FUDogZmlsdGVyIHJlc3BvbnNlIGNvZGUgTWF4IExpbWl0IFJlYWNoZWQgKi8KLSAgT0lfQk5FUF9GSUxURVJfTkVUX0ZBSUxFRF9TRUNVUklUWSA9Ci0gICAgICAyMDI0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJORVA6IGZpbHRlciByZXNwb25zZSBjb2RlIFNlY3VyaXR5ICovCi0gIE9JX0JORVBfRklMVEVSX01VTFRJX0JBU0UgPSAyMDMwLCAvKio8IEJORVA6IG11bHRpY2FzdCByZXNwb25zZSBjb2RlcyAqLwotICBPSV9CTkVQX0ZJTFRFUl9NVUxUSV9VTlNVUFBPUlRFRF9SRVFVRVNUID0KLSAgICAgIDIwMzEsIC8qKjwgQk5FUDogbXVsdGljYXN0IHJlc3BvbnNlIGNvZGUgVW5zdXBwb3J0ZWQgUmVxdWVzdCAqLwotICBPSV9CTkVQX0ZJTFRFUl9NVUxUSV9GQUlMRURfSU5WQUxJRF9BRERSRVNTID0KLSAgICAgIDIwMzIsIC8qKjwgQk5FUDogbXVsdGljYXN0IHJlc3BvbnNlIGNvZGUgSW52YWxpZCBBZGRyZXNzICovCi0gIE9JX0JORVBfRklMVEVSX01VTFRJX0ZBSUxFRF9NQVhfTElNSVRfUkVBQ0hFRCA9Ci0gICAgICAyMDMzLCAvKio8IEJORVA6IG11bHRpY2FzdCByZXNwb25zZSBjb2RlIE1heCBMaW1pdCBSZWFjaGVkICovCi0gIE9JX0JORVBfRklMVEVSX01VTFRJX0ZBSUxFRF9TRUNVUklUWSA9Ci0gICAgICAyMDM0LCAvKio8IEJORVA6IG11bHRpY2FzdCByZXNwb25zZSBjb2RlIFNlY3VyaXR5ICovCi0gIE9JX0JORVBfTE9DQUxfREVWSUNFX01VU1RfQkVfQ0VOVFJBTCA9Ci0gICAgICAyMDQwLCAvKio8IEJORVA6IERldmljZSBtdXN0IGJlIGNlbnRyYWwgb2YgdGhlIHBpY29uZXQgZm9yIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICAgICAqLwotICBPSV9CTkVQX1BBQ0tFVF9GSUxURVJFRF9PVVQgPQotICAgICAgMjA0MSwgLyoqPCBCTkVQOiBQYWNrZXQgZGlkIG5vdCBwYXNzIGN1cnJlbnQgZmlsdGVycyAqLwotCi0gIE9JX05FVElGQ19VUF9GQUlMRUQgPQotICAgICAgMjEwMSwgLyoqPCBORVRJRkM6IENvdWxkIG5vdCBicmluZyB1cCBuZXR3b3JrIGludGVyZmFjZSAqLwotICBPSV9ORVRJRkNfQ09VTERfTk9UX0NSRUFURV9USFJFQUQgPQotICAgICAgMjEwMiwgLyoqPCBORVRJRkM6IE5ldHdvcmsgaW50ZXJmYWNlIGNvdWxkIG5vdCBjcmVhdGUgYSByZWFkIHRocmVhZCAqLwotICBPSV9ORVRJRkNfSU5JVElBTElaQVRJT05fRkFJTEVEID0KLSAgICAgIDIxMDMsIC8qKjwgTkVUSUZDOiBFcnJvciBpbiBuZXR3b3JrIGludGVyZmFjZSBpbml0aWFsaXphdGlvbiAqLwotICBPSV9ORVRJRkNfSU5URVJGQUNFX0FMUkVBRFlfVVAgPQotICAgICAgMjEwNCwgLyoqPCBORVRJRkM6IE5ldHdvcmsgaW50ZXJmYWNlIGlzIGFscmVhZHkgdXAgKi8KLSAgT0lfTkVUSUZDX0lOVEVSRkFDRV9OT1RfVVAgPSAyMTA1LCAvKio8IE5FVElGQzogTmV0d29yayBpbnRlcmZhY2UgaXMgbm90IHVwICovCi0gIE9JX05FVElGQ19QQUNLRVRfVE9PX0JJRyA9IDIxMDYsICAgLyoqPCBORVRJRkM6IFRoZSBwYWNrZXQgaXMgdG9vIGJpZyAqLwotCi0gIE9JX1BBTl9ST0xFX0FMUkVBRFlfUkVHSVNURVJFRCA9Ci0gICAgICAyMjAxLCAvKio8IFBBTjogVGhpcyBQQU4gcm9sZSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkICovCi0gIE9JX1BBTl9ST0xFX05PVF9BTExPV0VEID0KLSAgICAgIDIyMDIsIC8qKjwgUEFOOiBUaGUgUEFOIHJvbGUgaXMgbm90IGN1cnJlbnRseSBhbGxvd2VkICovCi0gIE9JX1BBTl9JTkNPTVBBVElCTEVfUk9MRVMgPSAyMjAzLCAvKio8IFBBTjogT25seSBjZXJ0YWluIGxvY2FsIGFuZCByZW1vdGUgcm9sZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb25zIGFyZSBwZXJtaXR0ZWQgKi8KLSAgT0lfUEFOX0lOVkFMSURfUk9MRSA9Ci0gICAgICAyMjA0LCAvKio8IFBBTjogUm9sZSBzcGVjaWZpZWQgaXMgbm90IG9uZSB0aGUgZGVmaW5lZCBQQU4gcm9sZXMgKi8KLSAgT0lfUEFOX0NPTk5FQ1RJT05fSU5fUFJPR1JFU1MgPQotICAgICAgMjIwNSwgLyoqPCBQQU46IEEgUEFOIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGJlaW5nIGVzdGFibGlzaGVkICovCi0gIE9JX1BBTl9VU0VSX0FMUkVBRFlfQ09OTkVDVEVEID0KLSAgICAgIDIyMDYsIC8qKjwgUEFOOiBQQU4gdXNlciByb2xlIG9ubHkgYWxsb3dzIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KLSAgT0lfUEFOX0RFVklDRV9DT05ORUNURUQgPQotICAgICAgMjIwNywgLyoqPCBQQU46IEEgUEFOIGNvbm5lY3Rpb24gYWxyZWFkeSBleGlzdHMgdG8gc3BlY2lmaWVkIGRldmljZSAqLwotCi0gIE9JX0NPREVDX1NCQ19OT19TWU5DV09SRCA9IDIzMDEsIC8qKjwgQ09ERUM6IENvdWxkbid0IGZpbmQgYW4gU0JDIFNZTkNXT1JEICovCi0gIE9JX0NPREVDX1NCQ19OT1RfRU5PVUdIX0hFQURFUl9EQVRBID0KLSAgICAgIDIzMDIsIC8qKjwgQ09ERUM6IE5vdCBlbm91Z2ggZGF0YSBwcm92aWRlZCB0byBkZWNvZGUgYW4gU0JDIGhlYWRlciAqLwotICBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9CT0RZX0RBVEEgPQotICAgICAgMjMwMywgLyoqPCBDT0RFQzogRGVjb2RlZCB0aGUgaGVhZGVyLCBidXQgbm90IGVub3VnaCBkYXRhIHRvIGNvbnRhaW4gdGhlCi0gICAgICAgICAgICAgICByZXN0IG9mIHRoZSBmcmFtZSAqLwotICBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9BVURJT19EQVRBID0KLSAgICAgIDIzMDQsIC8qKjwgQ09ERUM6IE5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhpcyBmcmFtZSAqLwotICBPSV9DT0RFQ19TQkNfQ0hFQ0tTVU1fTUlTTUFUQ0ggPQotICAgICAgMjMwNSwgLyoqPCBDT0RFQzogVGhlIGZyYW1lIGhlYWRlciBkaWRuJ3QgbWF0Y2ggdGhlIGNoZWNrc3VtICovCi0gIE9JX0NPREVDX1NCQ19QQVJUSUFMX0RFQ09ERSA9Ci0gICAgICAyMzA2LCAvKio8IENPREVDOiBEZWNvZGluZyB3YXMgc3VjY2Vzc2Z1bCwgYnV0IGZyYW1lIGRhdGEgc3RpbGwgcmVtYWlucy4KLSAgICAgICAgICAgICAgIE5leHQgY2FsbCB3aWxsIHByb3ZpZGUgYXVkaW8gd2l0aG91dCBjb25zdW1pbmcgaW5wdXQgZGF0YS4gKi8KLQotICBPSV9GSUZPUV9RVUVVRV9OT1RfQUxJR05FRCA9IDI0MDEsIC8qKjwgRklGT1E6IHF1ZXVlIG11c3QgYmUgMzItYml0IGFsaWduZWQgKi8KLSAgT0lfRklGT1FfSU5WQUxJRF9RID0gMjQwMiwgLyoqPCBGSUZPUTogcXVldWUgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIHF1ZXVlICovCi0gIE9JX0ZJRk9RX0JVRl9UT09fTEFSR0UgPQotICAgICAgMjQwMywgLyoqPCBGSUZPUTogYXR0ZW1wdCB0byBxdWV1ZSBhIGJ1ZmZlciB3aGljaCBpcyB0b28gbGFyZ2UgKi8KLSAgT0lfRklGT1FfRlVMTCA9IDI0MDQsIC8qKjwgRklGT1E6IGVucXVldWUoKSBmYWlsZWQsIHF1ZXVlIGlzIGZ1bGwgKi8KLSAgT0lfRklGT1FfTk9UX0FMTE9DQVRFRCA9Ci0gICAgICAyNDA1LCAvKio8IEZJRk9ROiBFbnF1ZXVlIFFCdWYoKSBmYWlsZWQsIGJ1ZmZlciBub3QgYWxsb2NhdGVkICovCi0gIE9JX0ZJRk9RX0lOVkFMSURfREFUQV9QVFIgPQotICAgICAgMjQwNiwgLyoqPCBGSUZPUTogRW5xdWV1ZSBRQnVmKCkgZmFpbGVkLCBkYXRhIHBvaW50ZXIgZG9lcyBub3QgbWF0Y2ggKi8KLQotICBPSV9ISURfSE9TVF9TRVJWSUNFX05PVF9TVEFSVEVEID0gMjYwMSwgLyoqPCBISUQ6IENhbm5vdCBjb25uZWN0IHRvIGEgSElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgdW5sZXNzIEhJRCBob3N0IGlzIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIE9JX0hJRF9ERVZJQ0VfU0VSVklDRV9OT1RfU1RBUlRFRCA9Ci0gICAgICAyNjAyLCAvKio8IEhJRDogQ2Fubm90IGNvbm5lY3QgdG8gYSBISUQgaG9zdCB1bmxlc3MgSElEIGRldmljZSBpcyBzdGFydGVkCi0gICAgICAgICAgICAgKi8KLQotICBPSV9BVF9FUlJPUiA9IDI3MDEsICAgICAgICAvKio8IEFUOiBFUlJPUiByZXNwb25zZSAqLwotICBPSV9BVF9OT19DQVJSSUVSID0gMjcwMiwgICAvKio8IEFUOiBOTyBDQVJSSUVSIHJlc3BvbnNlICovCi0gIE9JX0FUX0JVU1kgPSAyNzAzLCAgICAgICAgIC8qKjwgQVQ6IEJVU1kgcmVzcG9uc2UgKi8KLSAgT0lfQVRfTk9fQU5TV0VSID0gMjcwNCwgICAgLyoqPCBBVDogTk8gQU5TV0VSIHJlc3BvbnNlICovCi0gIE9JX0FUX0RFTEFZRUQgPSAyNzA1LCAgICAgIC8qKjwgQVQ6IERFTEFZRUQgcmVzcG9uc2UgKi8KLSAgT0lfQVRfUkVKRUNUTElTVEVEID0gMjcwNiwgLyoqPCBBVDogUkVKRUNUTElTVEVEIHJlc3BvbnNlICovCi0gIE9JX0FUX0NNRV9FUlJPUiA9IDI3MDcsICAgIC8qKjwgQVQ6ICtDTUUgRVJST1IgcmVzcG9uc2UgKi8KLSAgT0lfQVRfQ01TX0VSUk9SID0gMjcwOCwgICAgLyoqPCBBVDogK0NNUyBFUlJPUiByZXNwb25zZSAqLwotCi0gIE9JX0JMU1RfQ0hBUkFDVEVSX1RJTUVPVVQgPSAyODAxLCAvKio8IEJMU1Q6IFRpbWVvdXQgZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY2xpZW50LiAqLwotICBPSV9CTFNUX0FDS05PV0xER0VfVElNRU9VVCA9Ci0gICAgICAyODAyLCAvKio8IEJMU1Q6IFRpbWVvdXQgZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvciBldmVudCBhY2tub3dsZWRnbWVudAotICAgICAgICAgICAgICAgZnJvbSB0aGUgY2xpZW50ICovCi0gIE9JX0JMU1RfVFhfTk9UX1JFQURZID0gMjgwMywgLyoqPCBCTFNUOiBCTFNUIGlzIG5vdCByZWFkeSB0byBzZW5kIGEgQkhBUEkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHRvIHRoZSBjbGllbnQuICovCi0gIE9JX0JMU1RfVFhfQlVTWSA9IDI4MDQsICAgICAgLyoqPCBCTFNUOiBCTFNUIHRyYW5zbWl0IGJ1ZmZlciBpcyBpbiB1c2UuICovCi0KLSAgT0lfQVZEVFBfQ09OTkVDVElPTl9TRVFfRVJST1IgPQotICAgICAgMjkwMSwgLyoqPCBBVkRUUDogc2VxdWVuY2luZyBvZiBzaWduYWxsaW5nL21lZGlhIGNoYW5uZWwgY29ubmVjdGlvbnMKLSAgICAgICAgICAgICAgIGJyb2tlbi4gKi8KLSAgT0lfQVZEVFBfT1VUX09GX1JFU09VUkNFUyA9IDI5MDIsIC8qKjwgQVZEVFA6IFRyaWVkIHRvIGFsbG9jYXRlIHRvbyBtYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludHMgb3Igc2lnbmFsbGluZyBjaGFubmVscy4gKi8KLQotICBPSV9QQkFQX1JFUE9TSVRPUllfTk9UX1NFVCA9IDMwMDEsIC8qKjwgUEJBUDogUGhvbmVib29rIHJlcG9zaXRvcnkgbXVzdCBiZSBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiAqLwotICBPSV9QQkFQX1BIT05FQk9PS19OT1RfU0VUID0KLSAgICAgIDMwMDIsIC8qKjwgUEJBUDogUGhvbmVib29rIGJlIHNldCBmb3Igb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiAqLwotCi0gIE9JX0FBRFBfQkFEX0VORFBPSU5UID0gMzEwMSwgLyoqPCBBQURQOiBJbnZhbGlkIGxvY2FsIGVuZHBvaW50IHNwZWNpZmllZCAqLwotICBPSV9BQURQX0JBRF9TVEFURSA9Ci0gICAgICAzMTAyLCAvKio8IEFBRFA6IEFBRFAgU3RhdGUgaXMgbm90IGNvcnJlY3QgZm9yIHRoaXMgb3BlcmF0aW9uLiAqLwotCi0gIE9JX1VOSUNPREVfSU5WQUxJRF9TT1VSQ0UgPSAzMjAwLCAgIC8qKjwgVW5pY29kZSBDb252ZXJzaW9uOiBTb3VyY2Ugc3RyaW5nIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGNoYXJhY3RlciBlbmNvZGluZy4gKi8KLSAgT0lfVU5JQ09ERV9TT1VSQ0VfRVhIQVVTVEVEID0gMzIwMSwgLyoqPCBVbmljb2RlIENvbnZlcnNpb246IEluY29tcGxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZSBjaGFyYWN0ZXIgYXQgZW5kIG9mIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuICovCi0gIE9JX1VOSUNPREVfREVTVElOQVRJT05fRVhIQVVTVEVEID0gMzIwMiwgLyoqPCBVbmljb2RlIENvbnZlcnNpb246IERlc3RpbmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4gKi8KLQotICBPSV9BVlJDUF9UT09fTUFOWV9DT05ORUNUSU9OUyA9IDMzMDAsIC8qKjwgQVZSQ1A6IEV4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltdWx0YW5lb3VzIEFWQ1RQIGNvbm5lY3Rpb25zLiAqLwotICBPSV9BVlJDUF9OT1RfSU1QTEVNRU5URUQgPQotICAgICAgMzMwMSwgLyoqPCBBVlJDUDogVGhlIHRhcmdldCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICAgICB0aGUgb3Bjb2RlIGFuZCBvcGVyYW5kLiAqLwotICBPSV9BVlJDUF9SRUpFQ1RFRCA9IDMzMDIsIC8qKjwgQVZSQ1A6IFRoZSB0YXJnZXQgY2Fubm90IHJlc3BvbmQgYmVjYXVzZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgb3BlcmFuZHMgaW4gY29tbWFuZCBwYWNrZXQuICovCi0gIE9JX0FWUkNQX0lOVkFMSURfUkVTUE9OU0UgPSAzMzAzLCAvKio8IEFWUkNQOiBUaGUgY29udHJvbGxlciByZWNlaXZlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzICovCi0gIE9JX0FWUkNQX1JFU1BPTlNFX1BBQ0tFVF9PVkVSRkxPVyA9Ci0gICAgICAzMzA0LCAvKio8IEFWUkNQOiBUaGUgcmVzcG9uc2UgbWVzc2FnZSBkb2VzIG5vdCBmaXIgaW4gb25lIEFWUkNQIHBhY2tldAotICAgICAgICAgICAgICAgKDUxMiBieXRlcyksIGhhcyB0byBiZSBmcmFnbWVudGVkLiAqLwotICBPSV9BVlJDUF9SRVNQT05TRV9JTlZBTElEX1BEVSA9IDMzMDUsIC8qKjwgQVZSQ1A6IENvbW1hbmQgcmVqZWN0ZWQ6IHRhcmdldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIGEgUERVIHRoYXQgaXQgZGlkIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc3RhbmQuICovCi0gIE9JX0FWUkNQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSID0gMzMwNiwgLyoqPCBBVlJDUDogQ29tbWFuZCByZWplY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgcmVjZWl2ZWQgYSBQRFUgd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIElEIHRoYXQgaXQgZGlkIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc3RhbmQuICovCi0gIE9JX0FWUkNQX1JFU1BPTlNFX1BBUkFNRVRFUl9OT1RfRk9VTkQgPQotICAgICAgMzMwNywgLyoqPCBBVlJDUDogQ29tbWFuZCByZWplY3RlZDogc3BlY2lmaWVkIHBhcmFtZXRlciBub3QgZm91bmQsIHNlbnQgaWYKLSAgICAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgSUQgaXMgdW5kZXJzdG9vZCwgYnV0IGNvbnRlbnQgaXMgd3Jvbmcgb3IKLSAgICAgICAgICAgICAgIGNvcnJ1cHRlZC4qLwotICBPSV9BVlJDUF9SRVNQT05TRV9JTlRFUk5BTF9FUlJPUiA9Ci0gICAgICAzMzA4LCAvKio8IEFWUkNQOiBDb21tYW5kIHJlamVjdGVkOiB0YXJnZXQgZGV0ZWN0ZWQgb3RoZXIgZXJyb3IKLSAgICAgICAgICAgICAgIGNvbmRpdGlvbnMuICovCi0gIE9JX01BWF9CTTNfU1RBVFVTX1ZBTCwgLyogTWF4aW11bSBCTTMgc3RhdHVzIGNvZGUgKi8KLQotICAvKiBTdGF0dXMgY29kZSB2YWx1ZXMgcmVzZXJ2ZWQgZm9yIEJNMyBTREsgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCi0gICAqLwotICBPSV9TVEFUVVNfUkVTRVJWRURfRk9SX0JDT1QgPSA5MDAwLAotCi0gIC8qIFN0YXR1cyBjb2RlIHZhbHVlcyByZXNlcnZlZCBmb3IgQkhBUEkgcHJvZHVjdHMgKi8KLSAgT0lfU1RBVFVTX1JFU0VSVkVEX0ZPUl9CSEFQSSA9IDkyMDAsCi0KLSAgLyogU3RhdHVzIGNvZGUgdmFsdWVzIHJlc2VydmVkIGZvciBTb3VuZGFib3V0IHByb2R1Y3RzICovCi0gIE9JX1NUQVRVU19SRVNFUlZFRF9GT1JfU09VTkRBQk9VVCA9IDk0MDAsCi0KLSAgLyoKLSAgICogU3RhdHVzIGNvZGUgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHZhbHVlIGFyZSByZXNlcnZlZCBmb3IgdXNlCi0gICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICogSG93ZXZlciwgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbXBpbGVycywgYW5kIGRpZmZlcmVuY2VzIGJldHdlZW4KLSAgICogMTYtYml0IGFuZCAzMi1iaXQKLSAgICogcGxhdGZvcm1zIGN1c3RvbSBzdGF0dXMgY29kZXMgc2hvdWxkIGJlIGluIHRoZSAxNi1iaXQgcmFuZ2UsIHNvIHN0YXR1cwotICAgKiBjb2RlcyBjYW4gcmFuZ2UgZnJvbSAwCi0gICAqIHRvIDY1NTM0LCBpbmNsdXNpdmUgKDY1NTM1IGlzIHJlc2VydmVkKQotICAgKi8KLSAgT0lfU1RBVFVTX1JFU0VSVkVEX0ZPUl9BUFBTID0gMTAwMDAsCi0KLSAgT0lfU1RBVFVTX05PTkUgPSAweGZmZmYgLyoqPCBTcGVjaWFsIHN0YXR1cyBjb2RlIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLiAoT25seSB0byBiZSB1c2VkIGZvciBzcGVjaWFsIGNhc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9sdmluZyBPSV9TTE9HX0VSUk9SKCkgYW5kIE9JX1NMT0dfV0FSTklORygpLikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotfSBPSV9TVEFUVVM7Ci0KLS8qIFJlbWViZXIgdG8gdXBkYXRlIHRoZSAjZGVmaW5lIGJlbG93IHdoZW4gbmV3IHJlc2VydmVkIGJsb2NrcyBhcmUgYWRkZWQgdG8KLSAqIHRoZSBsaXN0IGFib3ZlLiAqLwotI2RlZmluZSBPSV9OVU1fUkVTRVJWRURfU1RBVFVTX0JMT0NLUyBcCi0gIDQgLyoqPCBOdW1iZXIgb2Ygc3RhdHVzIGNvZGUgYmxvY2tzIHJlc2VydmVkLCBpbmNsdWRpbmcgdXNlciBhcHBzICovCi0KLS8qKgotICogVGVzdCBmb3Igc3VjY2VzcwotICovCi0jZGVmaW5lIE9JX1NVQ0NFU1MoeCkgKCh4KSA9PSBPSV9PSykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyoqQH0qLwotCi0jZW5kaWYgLyogX09JX1NUQVRVU19IICovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9zdGRkZWZzLmggYi9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV9zdGRkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MTk2MzUuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfc3RkZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgT0lfU1REREVGU19ICi0jZGVmaW5lIE9JX1NURERFRlNfSAotLyoqCi0gKiBAZmlsZQotICogVGhpcyBmaWxlIGNvbnRhaW5zIEJNMyBzdGFuZGFyZCB0eXBlIGRlZmluaXRpb25zLgotICoKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvaV9jcHVfZGVwLmgiCi0KLS8qKiBcYWRkdG9ncm91cCBNaXNjIE1pc2NlbGxhbmVvdXMgQVBJcyAqLwotLyoqQHsqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgXAotICAwIC8qKjwgVGhpcyBkZWZpbmUgc3RhdGVtZW50IHNldHMgRkFMU0UgYXMgYSBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDAuICovCi0jZW5kaWYKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoIUZBTFNFKSAvKio8IFRoaXMgZGVmaW5lIHN0YXRlbWVudCBzZXRzIFRSVUUgYXMgYSBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIFwKLSAgICAgICAgICAgICAgIUZBTFNFLiAqLwotI2VuZGlmCi0KLSNpZmRlZiBIRVdfVE9PTENIQUlOCi0jaWZkZWYgTlVMTAotI3VuZGVmIE5VTEwgLyoqPCBPdmVycmlkZSBIRVcgdG9vbGNoYWluIE5VTEwgZGVmaW5pdGlvbiAqLwotI2VuZGlmCi0jZGVmaW5lIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMCAvKio8IEhFVyB0b29sY2hhaW4gZG9lcyBub3QgYWxsb3cgdXMgdG8gY29tcGFyZSAodm9pZCopIHR5cGUgdG8gZnVuY3Rpb24gXAotICAgICAgIHBvaW50ZXIgKi8KLSNlbHNlCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKHZvaWQqKTApIC8qKjwgVGhpcyBkZWZpbmUgc3RhdGVtZW50IHNldHMgTlVMTCBhcyBhIHByZXByb2Nlc3NvciBhbGlhcyBcCi0gICAgICAgICAgICAgICAgZm9yICh2b2lkKikwICovCi0jZW5kaWYKLSNlbmRpZgotCi0vKioKLSAqIEBuYW1lICBNYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcyBmb3IgYmFzaWMgdHlwZXMKLSAqIEB7Ci0gKi8KLSNkZWZpbmUgT0lfSU5UOF9NSU4gKChpbnQ4X3QpMHg4MCkgICAgIC8qKjwgZGVjaW1hbCB2YWx1ZTogLTEyOCAqLwotI2RlZmluZSBPSV9JTlQ4X01BWCAoKGludDhfdCkweDdGKSAgICAgLyoqPCBkZWNpbWFsIHZhbHVlOiAxMjcgKi8KLSNkZWZpbmUgT0lfSU5UMTZfTUlOICgoaW50MTZfdCkweDgwMDApIC8qKjwgZGVjaW1hbCB2YWx1ZTogLTMyNzY4ICovCi0jZGVmaW5lIE9JX0lOVDE2X01BWCAoKGludDE2X3QpMHg3RkZGKSAvKio8IGRlY2ltYWwgdmFsdWU6IDMyNzY3ICovCi0jZGVmaW5lIE9JX0lOVDMyX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChpbnQzMl90KTB4ODAwMDAwMDApIC8qKjwgZGVjaW1hbCB2YWx1ZTogLTIsMTQ3LDQ4Myw2NDggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0lfSU5UMzJfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChpbnQzMl90KTB4N0ZGRkZGRkYpICAgICAgICAgICAgICAgICAgLyoqPCBkZWNpbWFsIHZhbHVlOiAyLDE0Nyw0ODMsNjQ3IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0lfVUlOVDhfTUlOICgodWludDhfdCkwKSAgICAgICAgLyoqPCBkZWNpbWFsIHZhbHVlOiAwICovCi0jZGVmaW5lIE9JX1VJTlQ4X01BWCAoKHVpbnQ4X3QpMHhGRikgICAgIC8qKjwgZGVjaW1hbCB2YWx1ZTogMjU1ICovCi0jZGVmaW5lIE9JX1VJTlQxNl9NSU4gKCh1aW50MTZfdCkwKSAgICAgIC8qKjwgZGVjaW1hbCB2YWx1ZTogMCAqLwotI2RlZmluZSBPSV9VSU5UMTZfTUFYICgodWludDE2X3QpMHhGRkZGKSAvKio8IGRlY2ltYWwgdmFsdWU6IDY1NTM1ICovCi0jZGVmaW5lIE9JX1VJTlQzMl9NSU4gKCh1aW50MzJfdCkwKSAgICAgIC8qKjwgZGVjaW1hbCB2YWx1ZTogMCAqLwotI2RlZmluZSBPSV9VSU5UMzJfTUFYIFwKLSAgKCh1aW50MzJfdCkweEZGRkZGRkZGKSAvKio8IGRlY2ltYWwgdmFsdWU6IDQsMjk0LDk2NywyOTUgKi8KLQotLyoqCi0gKiBAfQotICovCi0KLS8qKgotICogQG5hbWUgIEludGVnZXIgdHlwZXMgcmVxdWlyZWQgYnkgdGhlIFNlcnZpY2UgRGlzY292ZXJ5IFByb3RvY29sCi0gKiBAewotICovCi0KLS8qKiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBhcyBhIHN0cnVjdHVyZSBvZiB0d28gdW5zaWduZWQgMzItYml0IGludGVnZXJzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IEkxOyAvKio8IG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyAqLwotICB1aW50MzJfdCBJMjsgLyoqPCBsZWFzdCBzaWduaWZpY2FudCAzMiBiaXRzICovCi19IE9JX1VJTlQ2NDsKLQotI2RlZmluZSBPSV9VSU5UNjRfTUlOIFwKLSAgeyAodWludDMyX3QpMHgwMDAwMDAwMCwgKHVpbnQzMl90KTB4MDAwMDAwMDAgfQotI2RlZmluZSBPSV9VSU5UNjRfTUFYIFwKLSAgeyAodWludDMyX3QpMFhGRkZGRkZGRiwgKHVpbnQzMl90KTBYRkZGRkZGRkYgfQotCi0vKiBzaWduZWQgNjQtYml0IGludGVnZXIgYXMgYSBzdHJ1Y3R1cmUgb2Ygb25lIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGFuZCBvbmUKLSAqIHNpZ25lZCAzMi1iaXQgaW50ZWdlcgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludDMyX3QgSTE7ICAvKio8IG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyAgYXMgYSBzaWduZWQgaW50ZWdlciAqLwotICB1aW50MzJfdCBJMjsgLyoqPCBsZWFzdCBzaWduaWZpY2FudCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgKi8KLX0gT0lfSU5UNjQ7Ci0KLSNkZWZpbmUgT0lfSU5UNjRfTUlOIFwKLSAgeyAoaW50MzJfdCkweDgwMDAwMDAwLCAodWludDMyX3QpMHgwMDAwMDAwMCB9Ci0jZGVmaW5lIE9JX0lOVDY0X01BWCBcCi0gIHsgKGludDMyX3QpMFg3RkZGRkZGRiwgKHVpbnQzMl90KTBYRkZGRkZGRkYgfQotCi0vKiogdW5zaWduZWQgMTI4LWJpdCBpbnRlZ2VyIGFzIGEgc3RydWN0dXJlIG9mIGZvdXIgdW5zaWduZWQgMzItYml0IGludGVnZXJzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IEkxOyAvKio8IG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyAqLwotICB1aW50MzJfdCBJMjsgLyoqPCBzZWNvbmQtbW9zdCBzaWduaWZpY2FudCAzMiBiaXRzICovCi0gIHVpbnQzMl90IEkzOyAvKio8IHRoaXJkLW1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyAqLwotICB1aW50MzJfdCBJNDsgLyoqPCBsZWFzdCBzaWduaWZpY2FudCAzMiBiaXRzICovCi19IE9JX1VJTlQxMjg7Ci0KLSNkZWZpbmUgT0lfVUlOVDEyOF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1aW50MzJfdCkweDAwMDAwMDAwLCAodWludDMyX3QpMHgwMDAwMDAwMCwgKHVpbnQzMl90KTB4MDAwMDAwMDAsIFwKLSAgICAgICAgKHVpbnQzMl90KTB4MDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgT0lfVUlOVDEyOF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1aW50MzJfdCkwWEZGRkZGRkZGLCAodWludDMyX3QpMFhGRkZGRkZGRiwgKHVpbnQzMl90KTBYRkZGRkZGRkYsIFwKLSAgICAgICAgKHVpbnQzMl90KTBYRkZGRkZGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotLyogc2lnbmVkIDEyOC1iaXQgaW50ZWdlciBhcyBhIHN0cnVjdHVyZSBvZiB0aHJlZSB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgYW5kCi0gKiBvbmUgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludDMyX3QgSTE7ICAvKio8IG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyICovCi0gIHVpbnQzMl90IEkyOyAvKio8IHNlY29uZC1tb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlciAqLwotICB1aW50MzJfdCBJMzsgLyoqPCB0aGlyZC1tb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlciAqLwotICB1aW50MzJfdCBJNDsgLyoqPCBsZWFzdCBzaWduaWZpY2FudCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgKi8KLX0gT0lfSU5UMTI4OwotCi0jZGVmaW5lIE9JX0lOVDEyOF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodWludDMyX3QpMHg4MDAwMDAwMCwgKHVpbnQzMl90KTB4MDAwMDAwMDAsICh1aW50MzJfdCkweDAwMDAwMDAwLCBcCi0gICAgICAgICh1aW50MzJfdCkweDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIE9JX0lOVDEyOF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodWludDMyX3QpMFg3RkZGRkZGRiwgKHVpbnQzMl90KTBYRkZGRkZGRkYsICh1aW50MzJfdCkwWEZGRkZGRkZGLCBcCi0gICAgICAgICh1aW50MzJfdCkwWEZGRkZGRkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8qKgotICogQH0KLSAqLwotCi0vKioKLSAqIHR5cGUgZm9yIEFTQ0lJIGNoYXJhY3RlciBkYXRhIGl0ZW1zCi0gKi8KLXR5cGVkZWYgY2hhciBPSV9DSEFSOwotCi0vKioKLSAqIHR5cGUgZm9yIGRvdWJsZS1ieXRlIGNoYXJhY3RlciBkYXRhIGl0ZW1zCi0gKi8KLXR5cGVkZWYgdWludDE2X3QgT0lfQ0hBUjE2OwotCi0vKioKLSAqIHR5cGVzIGZvciBVVEYgZW5jb2RlZCBzdHJpbmdzLgotICovCi10eXBlZGVmIHVpbnQ4X3QgT0lfVVRGODsKLXR5cGVkZWYgdWludDE2X3QgT0lfVVRGMTY7Ci10eXBlZGVmIHVpbnQzMl90IE9JX1VURjMyOwotCi0vKioKLSAqIEBuYW1lIFNpbmdsZS1iaXQgb3BlcmF0aW9uIG1hY3JvcwotICogQHsKLSAqIEluIHRoZXNlIG1hY3JvcywgeCBpcyB0aGUgZGF0YSBpdGVtIGZvciB3aGljaCBhIGJpdCBpcyB0byBiZSB0ZXN0ZWQgb3Igc2V0Ci0gKiBhbmQgeSBzcGVjaWZpZXMgd2hpY2ggYml0IGlzIHRvIGJlIHRlc3RlZCBvciBzZXQuCi0gKi8KLQotLyogVGhpcyBtYWNybydzIHZhbHVlIGlzIHRydWUgaWYgdGhlIGJpdCBzcGVjaWZpZWQgYnkgeSBpcyBzZXQgaW4gZGF0YSBpdGVtIHguCi0gKi8KLSNkZWZpbmUgT0lfQklUX1RFU1QoeCwgeSkgKCh4KSAmICh5KSkKLQotLyogVGhpcyBtYWNybydzIHZhbHVlIGlzIHRydWUgaWYgdGhlIGJpdCBzcGVjaWZpZWQgYnkgeSBpcyBub3Qgc2V0IGluIGRhdGEgaXRlbQotICogeC4KLSAqLwotI2RlZmluZSBPSV9CSVRfQ0xFQVJfVEVTVCh4LCB5KSAoKCh4KSAmICh5KSkgPT0gMCkKLQotLyoqIFRoaXMgbWFjcm8gc2V0cyB0aGUgYml0IHNwZWNpZmllZCBieSB5IGluIGRhdGEgaXRlbSB4LiAqLwotI2RlZmluZSBPSV9CSVRfU0VUKHgsIHkpICgoeCkgfD0gKHkpKQotCi0vKiogVGhpcyBtYWNybyBjbGVhcnMgdGhlIGJpdCBzcGVjaWZpZWQgYnkgeSBpbiBkYXRhIGl0ZW0geC4gKi8KLSNkZWZpbmUgT0lfQklUX0NMRUFSKHgsIHkpICgoeCkgJj0gfih5KSkKLQotLyoqIEB9ICovCi0KLS8qKgotICogVGhlIE9JX0FSUkFZU0laRSBtYWNybyBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheQotICogKGluc3RlYWQgb2YgdGhlIG51bWJlciBvZiBieXRlcywgd2hpY2ggaXMgcmV0dXJuZWQgYnkgc2l6ZW9mKCkpLgotICovCi0KLSNpZm5kZWYgT0lfQVJSQVlTSVpFCi0jZGVmaW5lIE9JX0FSUkFZU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0jZW5kaWYKLQotLyoqCi0gKiBAbmFtZSBQcmVwcm9jZXNzb3IgYWxpYXNlcyBmb3IgaW5kaXZpZHVhbCBiaXQgcG9zaXRpb25zCi0gKiAgICAgIEJpdHMgYXJlIGRlZmluZWQgaGVyZSBvbmx5IGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0gKiBAewotICovCi0KLSNpZm5kZWYgQklUMAotCi0jZGVmaW5lIEJJVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDAwMDEgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAwIHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDAwMDAwMiAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDEgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDAwMDA0IC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMiBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDAwMDggLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAzIHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDAwMDAxMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDQgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDAwMDIwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgNSBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDAwNDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCA2IHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDAwMDA4MCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDcgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDAwMTAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgOCBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDAyMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCA5IHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDA0MDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAxMCBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDAwODAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMTEgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDAwMTAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDEyIHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMDIwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAxMyBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDA0MDAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMTQgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDAwODAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDE1IHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwMTAwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAxNiBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDIwMDAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMTcgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDA0MDAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDE4IHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDAwODAwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAxOSBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMTAwMDAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMjAgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDIwMDAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDIxIHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDA0MDAwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAyMiBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDAwODAwMDAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMjMgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMTAwMDAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDI0IHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MDIwMDAwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAyNSBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDA0MDAwMDAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMjYgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwODAwMDAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDI3IHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4MTAwMDAwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAyOCBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0jZGVmaW5lIEJJVDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAweDIwMDAwMDAwIC8qKjwgcHJlcHJvY2Vzc29yIGFsaWFzIGZvciAzMi1iaXQgdmFsdWUgd2l0aCBiaXQgMjkgc2V0LCB1c2VkIHRvIFwKLSAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgc2luZ2xlIGJpdCAqLwotI2RlZmluZSBCSVQzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMHg0MDAwMDAwMCAvKio8IHByZXByb2Nlc3NvciBhbGlhcyBmb3IgMzItYml0IHZhbHVlIHdpdGggYml0IDMwIHNldCwgdXNlZCB0byBcCi0gICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgQklUMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDB4ODAwMDAwMDAgLyoqPCBwcmVwcm9jZXNzb3IgYWxpYXMgZm9yIDMyLWJpdCB2YWx1ZSB3aXRoIGJpdCAzMSBzZXQsIHVzZWQgdG8gXAotICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBzaW5nbGUgYml0ICovCi0KLSNlbmRpZiAvKiBCSVQwIGV0IGFsICovCi0KLS8qKiBAfSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKipAfSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNlbmRpZiAvKiBPSV9TVERERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX3N0cmluZy5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTM3NjEuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDIgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBPSV9TVFJJTkdfSAotI2RlZmluZSBPSV9TVFJJTkdfSAotLyoqCi0gKiBAZmlsZQotICogVGhpcyBmaWxlIGNvbnRhaW5zIEJNMyBzdXBwbGllZCBwb3J0YWJsZSBzdHJpbmcuaCBmdW5jdGlvbnMKLSAqCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgJFJldmlzaW9uOiAjMSAkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2lfY3B1X2RlcC5oIgotI2luY2x1ZGUgIm9pX3N0ZGRlZnMuaCIKLQotI2lmIGRlZmluZWQoVVNFX05BVElWRV9NRU1DUFkpIHx8IGRlZmluZWQoVVNFX05BVElWRV9NQUxMT0MpCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyoqIFxhZGR0b2dyb3VwIE1pc2MgTWlzY2VsbGFuZW91cyBBUElzICovCi0vKipAeyovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIElmIHdlIGFyZSB1c2luZyBOYXRpdmUgbWFsbG9jKCksIHdlIG11c3QgYWxzbyB1c2UKLSAqIG5hdGl2ZSBBbnNpIHN0cmluZy5oIGZ1bmN0aW9ucyBmb3IgbWVtb3J5IG1hbmlwdWxhdGlvbi4KLSAqLwotI2lmZGVmIFVTRV9OQVRJVkVfTUFMTE9DCi0jaWZuZGVmIFVTRV9OQVRJVkVfTUVNQ1BZCi0jZGVmaW5lIFVTRV9OQVRJVkVfTUVNQ1BZCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVVNFX05BVElWRV9NRU1DUFkKLQotI2RlZmluZSBPSV9NZW1Db3B5KHRvLCBmcm9tLCBzaXplKSBtZW1jcHkoKHRvKSwgKGZyb20pLCAoc2l6ZSkpCi0jZGVmaW5lIE9JX01lbVNldChibG9jaywgdmFsLCBzaXplKSBtZW1zZXQoKGJsb2NrKSwgKHZhbCksIChzaXplKSkKLSNkZWZpbmUgT0lfTWVtWmVybyhibG9jaywgc2l6ZSkgbWVtc2V0KChibG9jayksIDAsIChzaXplKSkKLSNkZWZpbmUgT0lfTWVtQ21wKHMxLCBzMiwgbikgbWVtY21wKChzMSksIChzMiksIChuKSkKLSNkZWZpbmUgT0lfU3RyY3B5KGRlc3QsIHNyYykgc3RyY3B5KChkZXN0KSwgKHNyYykpCi0jZGVmaW5lIE9JX1N0cmNhdChkZXN0LCBzcmMpIHN0cmNhdCgoZGVzdCksIChzcmMpKQotI2RlZmluZSBPSV9TdHJMZW4oc3RyKSBzdHJsZW4oKHN0cikpCi0jZGVmaW5lIE9JX1N0cmNtcChzMSwgczIpIHN0cmNtcCgoczEpLCAoczIpKQotI2RlZmluZSBPSV9TdHJuY21wKHMxLCBzMiwgbikgc3RybmNtcCgoczEpLCAoczIpLCAobikpCi0KLSNlbHNlCi0KLS8qCi0gKiBPSV9NZW1Db3B5Ci0gKgotICogQ29weSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJ5dGVzIGZyb20gb25lIG1lbW9yeSBhZGRyZXNzIHRvIGFub3RoZXIuCi0gKiBUaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgQU5TSSBtZW1tb3ZlKCkgb3IgZXF1aXZhbGFudCwgc28KLSAqIG92ZXJsYXBwaW5nIG1lbW9yeSBjb3BpZXMgd2lsbCB3b3JrIGNvcnJlY3RseS4KLSAqLwotdm9pZCBPSV9NZW1Db3B5KHZvaWQqIFRvLCB2b2lkIGNvbnN0KiBGcm9tLCB1aW50MzJfdCBTaXplKTsKLQotLyoKLSAqIE9JX01lbVNldAotICoKLSAqIFNldHMgYWxsIGJ5dGVzIGluIGEgYmxvY2sgb2YgbWVtb3J5IHRvIHRoZSBzYW1lIHZhbHVlCi0gKi8KLXZvaWQgT0lfTWVtU2V0KHZvaWQqIEJsb2NrLCB1aW50OF90IFZhbCwgdWludDMyX3QgU2l6ZSk7Ci0KLS8qCi0gKiBPSV9NZW1aZXJvCi0gKgotICogU2V0cyBhbGwgYnl0ZXMgaW4gYSBibG9jayBvZiBtZW1vcnkgdG8gemVybwotICovCi12b2lkIE9JX01lbVplcm8odm9pZCogQmxvY2ssIHVpbnQzMl90IFNpemUpOwotCi0vKgotICogT0lfTWVtQ21wCi0gKgotICogQ29tcGFyZSB0d28gYmxvY2tzIG9mIG1lbW9yeQotICoKLSAqIFJldHVybnM6Ci0gKiAgICAgICAgMCwgaWYgczEgPT0gczIKLSAqICAgICAgPCAwLCBpZiBzMSA8IHMyCi0gKiAgICAgID4gMCwgaWYgczIgPiBzMgotICovCi1PSV9JTlQgT0lfTWVtQ21wKHZvaWQgY29uc3QqIHMxLCB2b2lkIGNvbnN0KiBzMiwgdWludDMyX3Qgbik7Ci0KLS8qCi0gKiBPSV9TdHJjcHkKLSAqCi0gKiBDb3BpZXMgdGhlIE51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSBwU3RyIHRvIHBEZXN0LCBhbmQKLSAqIHJldHVybnMgcERlc3QuCi0gKi8KLQotT0lfQ0hBUiogT0lfU3RyY3B5KE9JX0NIQVIqIHBEZXN0LCBPSV9DSEFSIGNvbnN0KiBwU3RyKTsKLQotLyoKLSAqIE9JX1N0cmNhdAotICoKLSAqIENvbmNhdG9uYXRlcyB0aGUgcFN0ciBzdHJpbmcgdG8gdGhlIGVuZCBvZiBwRGVzdCwgYW5kCi0gKiByZXR1cm5zIHBEZXN0LgotICovCi0KLU9JX0NIQVIqIE9JX1N0cmNhdChPSV9DSEFSKiBwRGVzdCwgT0lfQ0hBUiBjb25zdCogcFN0cik7Ci0KLS8qCi0gKiBPSV9TdHJMZW4KLSAqCi0gKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgT0lfQ0hBUnMgaW4gcFN0ciAobm90IGluY2x1ZGluZwotICogdGhlIE51bGwgdGVybWluYXRvcikgYW5kIHJldHVybnMgdGhlIHZhbHVlLgotICovCi1PSV9VSU5UIE9JX1N0ckxlbihPSV9DSEFSIGNvbnN0KiBwU3RyKTsKLQotLyoKLSAqIE9JX1N0cmNtcAotICoKLSAqIENvbXBhcmVzIHR3byBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5ncwotICoKLSAqIFJldHVybnM6Ci0gKiAgICAgICAgMCwgaWYgczEgPT0gczIKLSAqICAgICAgPCAwLCBpZiBzMSA8IHMyCi0gKiAgICAgID4gMCwgaWYgczIgPiBzMgotICovCi1PSV9JTlQgT0lfU3RyY21wKE9JX0NIQVIgY29uc3QqIHMxLCBPSV9DSEFSIGNvbnN0KiBzMik7Ci0KLS8qCi0gKiBPSV9TdHJuY21wCi0gKgotICogQ29tcGFyZXMgdGhlIGZpcnN0ICJsZW4iIE9JX0NIQVJzIG9mIHN0cmluZ3MgczEgYW5kIHMyLgotICoKLSAqIFJldHVybnM6Ci0gKiAgICAgICAgMCwgaWYgczEgPT0gczIKLSAqICAgICAgPCAwLCBpZiBzMSA8IHMyCi0gKiAgICAgID4gMCwgaWYgczIgPiBzMgotICovCi1PSV9JTlQgT0lfU3RybmNtcChPSV9DSEFSIGNvbnN0KiBzMSwgT0lfQ0hBUiBjb25zdCogczIsIHVpbnQzMl90IGxlbik7Ci0KLSNlbmRpZiAvKiBVU0VfTkFUSVZFX01FTUNQWSAqLwotCi0vKgotICogT0lfU3RyY21wSW5zZW5zaXRpdmUKLSAqCi0gKiBDb21wYXJlcyB0d28gTnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHRyZWF0aW5nCi0gKiB0aGUgVXBwZXIgYW5kIExvd2VyIGNhc2Ugb2YgJ0EnIHRocm91Z2ggJ1onIGFzCi0gKiBlcXVpdmlsZW50LgotICoKLSAqIFJldHVybnM6Ci0gKiAgICAgICAgMCwgaWYgczEgPT0gczIKLSAqICAgICAgPCAwLCBpZiBzMSA8IHMyCi0gKiAgICAgID4gMCwgaWYgczIgPiBzMgotICovCi1PSV9JTlQgT0lfU3RyY21wSW5zZW5zaXRpdmUoT0lfQ0hBUiBjb25zdCogczEsIE9JX0NIQVIgY29uc3QqIHMyKTsKLQotLyoKLSAqIE9JX1N0cm5jbXBJbnNlbnNpdGl2ZQotICoKLSAqIENvbXBhcmVzIHRoZSBmaXJzdCAibGVuIiBPSV9DSEFScyBvZiBzdHJpbmdzIHMxIGFuZCBzMiwKLSAqIHRyZWF0aW5nIHRoZSBVcHBlciBhbmQgTG93ZXIgY2FzZSBvZiAnQScgdGhyb3VnaCAnWicgYXMKLSAqIGVxdWl2aWxlbnQuCi0gKgotICoKLSAqIFJldHVybnM6Ci0gKiAgICAgICAgMCwgaWYgczEgPT0gczIKLSAqICAgICAgPCAwLCBpZiBzMSA8IHMyCi0gKiAgICAgID4gMCwgaWYgczIgPiBzMgotICovCi1PSV9JTlQgT0lfU3RybmNtcEluc2Vuc2l0aXZlKE9JX0NIQVIgY29uc3QqIHMxLCBPSV9DSEFSIGNvbnN0KiBzMiwgT0lfVUlOVCBsZW4pOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKiogQH0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIE9JX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV90aW1lLmggYi9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV90aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODNjY2IuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX09JX1RJTUVfSAotI2RlZmluZSBfT0lfVElNRV9ICi0vKiogQGZpbGUKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGltZSB0eXBlIGRlZmluaXRpb25zIGFuZCB0aW1lLXJlbGF0ZWQgZnVuY3Rpb25zLgotICoKLSAqIFRoZSBzdGFjayBtYWludGFpbnMgYSA2NC1iaXQgcmVhbC10aW1lIG1pbGxpc2Vjb25kIGNsb2NrLiBUaGUgY2hvaWNlIG9mCi0gKiBtaWxsaXNlY29uZHMgaXMgZm9yIGNvbnZlbmllbmNlLCBub3QgYWNjdXJhY3kuCi0gKgotICogVGltZW91dHMgYXJlIHNwZWNpZmllZCBhcyB0ZW50aHMgb2Ygc2Vjb25kcyBpbiBhIDMyLWJpdCB2YWx1ZS4gVGltZW91dCB2YWx1ZXMKLSAqIHNwZWNpZmllZCBieSB0aGUgQmx1ZXRvb3RoIHNwZWNpZmljYXRpb24gYXJlIHVzdWFsbHkgbXVsaXBsZSBzZWNvbmRzLCBzbwotICogYWNjdXJhY3kgdG8gYSB0ZW50aCBvZiBhIHNlY29uZCBpcyBtb3JlIHRoYW4gYWRlcXVhdGUuCi0gKgotICogVGhpcyBmaWxlIGFsc28gY29udGFpbnMgbWFjcm9zIHRvIGNvbnZlcnQgYmV0d2VlbiBzZWNvbmRzIGFuZCB0aGUgTGluawotICogTWFuYWdlcidzIDEuMjgtc2Vjb25kIHVuaXRzLgotICoKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvaV9zdGRkZWZzLmgiCi0KLS8qKiBcYWRkdG9ncm91cCBNaXNjIE1pc2NlbGxhbmVvdXMgQVBJcyAqLwotLyoqQHsqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogV2l0aGluIHRoZSBjb3JlIHN0YWNrLCB0aW1lb3V0cyBhcmUgc3BlY2lmaWVkIGluIGludGVydmFscyBvZiB0ZW50aHMgb2YKLSAqIHNlY29uZHMuCi0gKi8KLQotdHlwZWRlZiB1aW50MTZfdCBPSV9JTlRFUlZBTDsKLSNkZWZpbmUgT0lfSU5URVJWQUxTX1BFUl9TRUNPTkQgMTAKLSNkZWZpbmUgTVNFQ1NfUEVSX09JX0lOVEVSVkFMICgxMDAwIC8gT0lfSU5URVJWQUxTX1BFUl9TRUNPTkQpCi0KLS8qKiBtYXhpbXVtIGludGVydmFsICg1NCBtaW4gMzYuNyBzZWMpICovCi0jZGVmaW5lIE9JX01BWF9JTlRFUlZBTCAweDdmZmYKLQotLyoqCi0gKiBNYWNybyB0byBjb252ZXJ0IHNlY29uZHMgdG8gT0lfSU5URVJWQUwgdGltZSB1bml0cwotICovCi0KLSNkZWZpbmUgT0lfU0VDT05EUyhuKSAoKE9JX0lOVEVSVkFMKSgobikqT0lfSU5URVJWQUxTX1BFUl9TRUNPTkQpKQotCi0vKioKLSAqIE1hY3JvIHRvIGNvbnZlcnQgbWlsbGlzZWNvbmRzIHRvIE9JX0lOVEVSVkFMIHRpbWUgdW5pdHMgKFJvdW5kZWQgVXApCi0gKi8KLQotI2RlZmluZSBPSV9NU0VDT05EUyhuKSBcCi0gICgoT0lfSU5URVJWQUwpKCgobikgKyBNU0VDU19QRVJfT0lfSU5URVJWQUwgLSAxKSAvIE1TRUNTX1BFUl9PSV9JTlRFUlZBTCkpCi0KLS8qKgotICogTWFjcm8gdG8gY29udmVydCBtaW51dGVzIHRvIE9JX0lOVEVSVkFMIHRpbWUgdW5pdHMKLSAqLwotCi0jZGVmaW5lIE9JX01JTlVURVMobikgKChPSV9JTlRFUlZBTCkoKG4pKk9JX1NFQ09ORFMoNjApKSkKLQotLyoqIENvbnZlcnQgYW4gT0lfSU5URVJWQUwgdG8gbWlsbGlzZWNvbmRzLiAqLwotI2RlZmluZSBPSV9JTlRFUlZBTF9UT19NSUxMSVNFQ09ORFMoaSkgKChpKSpNU0VDU19QRVJfT0lfSU5URVJWQUwpCi0KLS8qKgotICogVGhlIHN0YWNrIGRlcGVuZHMgb24gcmVsYXRpdmUgbm90IGFic29sdXRlIHRpbWUuIEFueSBtYXBwaW5nIGJldHdlZW4gdGhlCi0gKiBzdGFjaydzIHJlYWwtdGltZSBjbG9jayBhbmQgYWJzb2x1dGUgdGltZSBhbmQgZGF0ZSBpcwotICogaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50MzJfdCBzZWNvbmRzOwotICBpbnQxNl90IG1zZWNvbmRzOwotfSBPSV9USU1FOwotCi0vKioKLSAqIENvbnZlcnQgYW4gT0lfVElNRSB0byBtaWxsaXNlY29uZHMuCi0gKgotICogQHBhcmFtIHQgIHRoZSB0aW1lIHRvIGNvbnZlcnQKLSAqCi0gKiBAcmV0dXJuIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcwotICovCi11aW50MzJfdCBPSV9UaW1lX1RvTVMoT0lfVElNRSogdCk7Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0d28gdGltZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIFQxIGZpcnN0IHRpbWUgdG8gY29tcGFyZS4KLSAqCi0gKiBAcGFyYW0gVDIgc2Vjb25kIHRpbWUgdG8gY29tcGFyZS4KLSAqCi0gKiBAcmV0dXJuCi0gQHZlcmJhdGltCi0gICAgIC0xIGlmIHQxIDwgdDIKLSAgICAgIDAgaWYgdDEgPSB0MgotICAgICArMSBpZiB0MSA+IHQyCi0gQGVuZHZlcmJhdGltCi0gKi8KLQotaW50MTZfdCBPSV9UaW1lX0NvbXBhcmUoT0lfVElNRSogVDEsIE9JX1RJTUUqIFQyKTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIHRpbWVzIHRvIGEgZ3JhbnVsYXJpdHkgb2YgMC4xCi0gKiBzZWNvbmRzLgotICoKLSAqIEBwYXJhbSBTb29uZXIgYSB0aW1lIHZhbHVlIG1vcmUgcmVjZW50IHRoYXQgTGF0ZXIKLSAqCi0gKiBAcGFyYW0gTGF0ZXIgYSB0aW1lIHZhbHVlIGxhdGVyIHRoYW4gU29vbmVyCi0gKgotICogQG5vdGUgVGhlIHJlc3VsdCBpcyBhbiBPSV9JTlRFUlZBTCB2YWx1ZSBzbyB0aGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIHRpbWUKLSAqIGludGVydmFscyB0aGF0IGFyZSBsZXNzIHRoYW4gYWJvdXQgNzEgbWludXRlcy4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gdGhlIHR3byB0aW1lcyA9IChMYXRlciAtIFNvb25lcikKLSAqLwotCi1PSV9JTlRFUlZBTCBPSV9UaW1lX0ludGVydmFsKE9JX1RJTUUqIFNvb25lciwgT0lfVElNRSogTGF0ZXIpOwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gdGltZXMgdG8gYSBncmFudWxhcml0eSBvZgotICogbWlsbGlzZWNvbmRzLgotICoKLSAqIEBwYXJhbSBTb29uZXIgYSB0aW1lIHZhbHVlIG1vcmUgcmVjZW50IHRoYXQgTGF0ZXIKLSAqCi0gKiBAcGFyYW0gTGF0ZXIgYSB0aW1lIHZhbHVlIGxhdGVyIHRoYW4gU29vbmVyCi0gKgotICogQG5vdGUgVGhlIHJlc3VsdCBpcyBhbiB1aW50MzJfdCB2YWx1ZSBzbyB0aGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIHRpbWUKLSAqIGludGVydmFscyB0aGF0IGFyZSBsZXNzIHRoYW4gYWJvdXQgNTAgZGF5cy4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gdGhlIHR3byB0aW1lcyA9IChMYXRlciAtIFNvb25lcikKLSAqLwotCi11aW50MzJfdCBPSV9UaW1lX0ludGVydmFsTXNlY3MoT0lfVElNRSogU29vbmVyLCBPSV9USU1FKiBMYXRlcik7Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBhbnN3ZXJzIHRoaXMgcXVlc3Rpb246Ci0gKiAgICJIYXZlIHdlIHJlYWNoZWQgb3IgZ29uZSBwYXN0IHRoZSB0YXJnZXQgdGltZT8iCi0gKgotICogQHBhcmFtIHBUYXJnZXRUaW1lICAgdGFyZ2V0IHRpbWUKLSAqCi0gKiBAcmV0dXJuICB0cnVlIG1lYW5zIHRpbWUgbm93IGlzIGF0IG9yIHBhc3QgdGFyZ2V0IHRpbWUKLSAqICAgICAgICAgIGZhbHNlIG1lYW5zIHRhcmdldCB0aW1lIGlzIHN0aWxsIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlCi0gKi8KLQotT0lfQk9PTCBPSV9UaW1lX05vd1JlYWNoZWRUaW1lKE9JX1RJTUUqIHBUYXJnZXRUaW1lKTsKLQotLyoqCi0gKiAgQ29udmVydCBzZWNvbmRzIHRvIHRoZSBMaW5rIE1hbmFnZXIgMS4yOC1zZWNvbmQgdW5pdHMKLSAqICBBcHByb3hpbWF0ZSBieSB1c2luZyAxLjI1IGNvbnZlcnNpb24gZmFjdG9yLgotICovCi0KLSNkZWZpbmUgT0lfU0VDT05EU19UT19MTV9USU1FX1VOSVRTKGxtVW5pdHMpIFwKLSAgKChsbVVuaXRzKSA8IDQgPyAobG1Vbml0cykgOiAobG1Vbml0cykgLSAoKGxtVW5pdHMpID4+IDIpKQotCi0vKioKLSAqICBDb252ZXJ0IExpbmsgTWFuYWdlciAxLjI4LXNlY29uZCB1bml0cyB0byBzZWNvbmRzLgotICogIEFwcHJveGltYXRlIGJ5IHVzaW5nIDEuMjUgY29udmVyc2lvbiBmYWN0b3IuCi0gKi8KLQotI2RlZmluZSBPSV9MTV9USU1FX1VOSVRTX1RPX1NFQ09ORFMobG1Vbml0cykgKChsbVVuaXRzKSArICgobG1Vbml0cykgPj4gMikpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qKkB9Ki8KLQotLyogSW5jbHVkZSBmb3IgT0lfVGltZV9Ob3coKSBwcm90b3R5cGUKLSAqIE11c3QgYmUgaW5jbHVkZWQgYXQgZW5kIHRvIG9idGFpbiBPSV9USU1FIHR5cGVkZWYKLSAqLwotI2luY2x1ZGUgIm9pX29zaW50ZXJmYWNlLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNlbmRpZiAvKiBfT0lfVElNRV9IICovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV91dGlscy5oIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUvb2lfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5MTE0Zi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZS9vaV91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX09JX1VUSUxTX0gKLSNkZWZpbmUgX09JX1VUSUxTX0gKLS8qKgotICogQGZpbGUKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdXRpbGl0eSBmdW5jdGlvbnMuCi0gKiBBbW9uZyB0aGUgdXRpbGl0aWVzIGFyZSBzdHJsZW4gKHN0cmluZyBsZW5ndGgpLCBzdHJjbXAgKHN0cmluZyBjb21wYXJlKSwgYW5kCi0gKiBvdGhlciBzdHJpbmcgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4gVGhlc2UgYXJlIHByb3ZpZGVkIGZvciB0aG9zZSBwbGFmb3JtcwotICogd2hlcmUgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhdmFpbGFibGUgaW4gc3RkbGliLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgIm9pX2J0X3NwZWMuaCIKLSNpbmNsdWRlICJvaV9jb21tb24uaCIKLSNpbmNsdWRlICJvaV9zdHJpbmcuaCIKLQotLyoqIFxhZGR0b2dyb3VwIE1pc2MgTWlzY2VsbGFuZW91cyBBUElzICovCi0vKipAeyovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBPcGFxdWUgdHlwZSBmb3IgYSBjYWxsYmFjayBmdW5jdGlvbiBoYW5kbGUuIFNlZSBPSV9TY2hlZHVsZUNhbGxiYWNrRnVuY3Rpb24oKQotICovCi10eXBlZGVmIHVpbnQzMl90IE9JX0NBTExCQUNLX0hBTkRMRTsKLQotLyoqCi0gKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIGEgdGltZWQgcHJvY2VkdXJlIGNhbGxiYWNrLgotICoKLSAqIEBwYXJhbSBhcmcgICBWYWx1ZSB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgT0lfU2NoZWR1bGVDYWxsYmFjaygpIGZ1bmN0aW9uCi0gKgotICovCi10eXBlZGVmIHZvaWQgKCpPSV9TQ0hFRFVMRURfQ0FMTEJBQ0spKHZvaWQqIGFyZyk7Ci0KLS8qKgotICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSB0aW1lb3V0IGV4cGlyZXMuIFRoaXMgQVBJIHVzZXMKLSAqIEJMVUVtYWdpYydzIGludGVybmFsIGZ1bmN0aW9uIGRpc3BhdGNoIG1lY2hhbmlzbSwgc28gYXBwbGljYXRpb25zIHRoYXQgbWFrZQotICogZXh0ZW5zaXZlIHVzZSBvZiB0aGlzIGZhY2lsaXR5IG1heSBuZWVkIHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZgotICogRGlzcGF0Y2hUYWJsZVNpemUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2sgZm9yIHRoZSBkaXNwYXRjaGVyIChzZWUKLSAqIG9pX2J0X3N0YWNrX2NvbmZpZy5oKS4KLSAqCi0gKiBAcGFyYW0gY2FsbGJhY2tGdW5jdGlvbiAgICBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzCi0gKgotICogQHBhcmFtIGFyZyAgICAgICAgICAgICAgICAgVmFsdWUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBwYXJhbWV0ZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGltZW91dCAgICAgICAgICAgICBBIHRpbWVvdXQgZXhwcmVzc2VkIGluIE9JX0lOVEVSVkFMcyAodGVudGhzIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzKS4gVGhpcyBjYW4gYmUgemVybyBpbiB3aGljaCBjYXNlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUuCi0gKgotICogQHBhcmFtIGhhbmRsZSAgICAgICAgICAgICAgTlVMTCBvciBhIHBvaW50ZXIgcmVjZWl2ZSB0aGUgY2FsbGJhY2sgaGFuZGxlLgotICoKLSAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgIE9JX09LIGlmIHRoZSBmdW5jdGlvbiB3YXMgcmVnaXN0ZXJlZCwgb3IgYW4gZXJyb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy4KLSAqLwotT0lfU1RBVFVTIE9JX1NjaGVkdWxlQ2FsbGJhY2tGdW5jdGlvbihPSV9TQ0hFRFVMRURfQ0FMTEJBQ0sgY2FsbGJhY2tGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJnLCBPSV9JTlRFUlZBTCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9DQUxMQkFDS19IQU5ETEUqIGhhbmRsZSk7Ci0KLS8qKgotICogQ2FuY2VscyBhIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCBPSV9TY2hlZHVsZUNhbGxiYWNrRnVuY3Rpb24oKSBiZWZvcmUgaXRzCi0gKiB0aW1lciBleHBpcmVzLgotICoKLSAqIEBwYXJhbSBoYW5kbGUgICAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSAgT0lfU2NoZWR1bGVDYWxsYmFja0Z1bmN0aW9uKCkuCi0gKgotICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgT0lfT0sgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjYW5jZWxsZWQsIG9yIGFuIGVycm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuCi0gKi8KLU9JX1NUQVRVUyBPSV9DYW5jZWxDYWxsYmFja0Z1bmN0aW9uKE9JX0NBTExCQUNLX0hBTkRMRSBoYW5kbGUpOwotCi0vKioKLSAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgdGltZW91dCBleHBpcmVzLiBUaGlzIHZlcnNpb24gZG9lcwotICogbm90IHJldHVybiBhIGhhbmRsZSBzbyBjYW4gb25seSBiZSBjYW5jZWxlZCBieSBjYWxsaW5nIE9JX0NhbmNlbENhbGxiYWNrKCkuCi0gKgotICogQHBhcmFtIGNhbGxiYWNrRnVuY3Rpb24gICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZW91dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcwotICoKLSAqIEBwYXJhbSBhcmcgICAgICAgICAgICAgICAgIFZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgcGFyYW1ldGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRpbWVvdXQgICAgICAgICAgICAgQSB0aW1lb3V0IGV4cHJlc3NlZCBpbiBPSV9JTlRFUlZBTHMgKHRlbnRocyBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcykuIFRoaXMgY2FuIGJlIHplcm8gaW4gd2hpY2ggY2FzZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIHNvb24gYXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlLgotICoKLSAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgIE9JX09LIGlmIHRoZSBmdW5jdGlvbiB3YXMgcmVxaXN0ZXJlZCwgb3IgYW4gZXJyb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy4KLSAqLwotI2RlZmluZSBPSV9TY2hlZHVsZUNhbGxiYWNrKGYsIGEsIHQpIE9JX1NjaGVkdWxlQ2FsbGJhY2tGdW5jdGlvbihmLCBhLCB0LCBOVUxMKTsKLQotLyoqCi0gKiBDYW5jZWxzIGEgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIE9JX1NjaGVkdWxlQ2FsbGJhY2soKSBiZWZvcmUgaXRzIHRpbWVyCi0gKiBleHBpcmVzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FuY2VsIHRoZSBmaXJzdCBlbnRyeSBtYXRjaGVzIHRoZSBpbmRpY2F0ZWQKLSAqIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIuCi0gKgotICogQHBhcmFtIGNhbGxiYWNrRnVuY3Rpb24gICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2FzIG9yaWdpbmFsbHkgcmVnaXN0ZXJlZAotICoKLSAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgIE9JX09LIGlmIHRoZSBmdW5jdGlvbiB3YXMgY2FuY2VsbGVkLCBvciBhbiBlcnJvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLgotICovCi1PSV9TVEFUVVMgT0lfQ2FuY2VsQ2FsbGJhY2soT0lfU0NIRURVTEVEX0NBTExCQUNLIGNhbGxiYWNrRnVuY3Rpb24pOwotCi0vKioKLSAqIFByaW50ZiBmdW5jdGlvbiBmb3IgcGxhdGZvcm1zIHdoaWNoIGhhdmUgbm8gc3RkaW8gb3IgcHJpbnRmIGF2YWlsYWJsZS4KLSAqIE9JX1ByaW50ZiBzdXBwb3J0cyB0aGUgYmFzaWMgZm9ybWF0dGluZyB0eXBlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0gKiBmbG9hdGluZyBwb2ludCB0eXBlcy4gQWRkaXRpb25hbGx5LCBPSV9QcmludGYgc3VwcG9ydHMgc2V2ZXJhbCBmb3JtYXRzCi0gKiBzcGVjaWZpYyB0byBCTFVFbWFnaWMgMy4wIHNvZnR3YXJlOgotICoKLSAqIFwlISAgIHByaW50cyB0aGUgc3RyaW5nIGZvciBhbiAjT0lfU1RBVFVTIHZhbHVlLgotICogICAgICAgQGNvZGUgT0lfUHJpbnRmKCJUaGVyZSB3YXMgYW4gZXJyb3IgJSEiLCBzdGF0dXMpOyBAZW5kY29kZQotICoKLSAqIFwlQCAgIHByaW50cyBhIGhleCBkdW1wIG9mIGEgYnVmZmVyLgotICogICAgICAgUmVxdWlyZXMgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgYW5kIGEgc2lnbmVkIGludGVnZXIgbGVuZ3RoCi0gKiAgICAgICAoMCBmb3IgZGVmYXVsdCBsZW5ndGgpLiBJZiB0aGUgYnVmZmVyIGlzIGxhcmdlLCBvbmx5IGFuIGV4Y2VycHQgd2lsbAotICogICAgICAgYmUgcHJpbnRlZC4KLSAqICAgICAgIEBjb2RlIE9JX1ByaW50ZigiQ29udGVudHMgb2YgYnVmZmVyICVAIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gKiAgICAgICBAZW5kY29kZQotICoKLSAqIFwlXiAgIGRlY29kZXMgYW5kIHByaW50cyBhIGRhdGEgZWxlbWVudCBhcyBmb3JtYXR0ZWQgWE1MLgotICogICAgICAgUmVxdWlyZXMgYSBwb2ludGVyIHRvIGFuICNPSV9EQVRBRUxFTS4KLSAqICAgICAgIEBjb2RlIE9JX1ByaW50ZigiU2VydmljZSBhdHRyaWJ1dGUgbGlzdCBpczpcbiVeIiwgJmF0dHJpYnV0ZXMpOwotICogICAgICAgQGVuZGNvZGUKLSAqCi0gKiBcJS8gICBwcmludHMgdGhlIGJhc2UgZmlsZSBuYW1lIG9mIGEgcGF0aCwgdGhhdCBpcywgdGhlIGZpbmFsIHN1YnN0cmluZwotICogICAgICAgZm9sbG93aW5nIGEgJy8nIG9yICdcXCcgY2hhcmFjdGVyLiBSZXF1aXJlcyBhIHBvaW50ZXIgdG8gYSBudWxsCi0gKiAgICAgICB0ZXJtaW5hdGVkIHN0cmluZy4KLSAqICAgICAgIEBjb2RlIE9JX1ByaW50ZigiRmlsZSAlLyIsICJjOlxcZGlyMVxcZGlyMlxcZmlsZS50eHQiKTsgQGVuZGNvZGUKLSAqCi0gKiBcJX4gICBwcmludHMgYSBzdHJpbmcsIGVzY2FwaW5nIGNoYXJhY3RlcnMgYXMgbmVlZGVkIHRvIGRpc3BsYXkgaXQgaW4KLSAqICAgICAgIEFTQ0lJLiBSZXF1aXJlcyBhIHBvaW50ZXIgdG8gYW4gI09JX1BTVFIgYW5kIGFuICNPSV9VTklDT0RFX0VOQ09ESU5HCi0gKiAgICAgICBwYXJhbWV0ZXIuCi0gKiAgICAgICBAY29kZSBPSV9QcmludGYoIklkZW50aWZpZXIgJX4iLCAmaWQsIE9JX1VOSUNPREVfVVRGMTZfQkUpOyBAZW5kY29kZQotICoKLSAqIFwlWyAgIGluc2VydHMgYW4gQU5TSSBjb2xvciBlc2NhcGUgc2VxdWVuY2UuIFJlcXVpcmVzIGEgc2luZ2xlIGNoYXJhY3RlcgotICogICAgICAgaWRlbnRpZnlpbmcgdGhlIGNvbG9yIHRvIHNlbGVjdC4gQ29sb3JzIGFyZSByZWQgKHIvUiksIGdyZWVuIChnL0cpLAotICogICAgICAgYmx1ZSAoYi9CKSwgeWVsbG93ICh5L1kpLCBjeWFuIChjL0MpLCBtYWdlbnRhIChtL00pLCB3aGl0ZSAoVyksCi0gKiAgICAgICBsaWdodC1ncmF5IChsL0wpLCBkYXJrLWdyYXkgKGQvRCksIGFuZCBibGFjayAoMCkuIFRoZSBsb3dlciBjYXNlIGlzCi0gKiAgICAgICBkaW0sIHRoZSB1cHBlciBjYXNlIGlzIGJyaWdodCAoZXhjZXB0IGluIHRoZSBjYXNlIG9mIGxpZ2h0LWdyYXkgYW5kCi0gKiAgICAgICBkYXJrLWdyYXksIHdoZXJlIGJyaWdodCBhbmQgZGltIGFyZSBpZGVudGljYWwpLiBBbnkgb3RoZXIgdmFsdWUgd2lsbAotICogICAgICAgc2VsZWN0IHRoZSBkZWZhdWx0IGNvbG9yLgotICogICAgICAgQGNvZGUgT0lfUHJpbnRmKCIlW3JlZCB0ZXh0ICVbYmxhY2sgJVtub3JtYWxcbiIsICdyJywgJzAnLCAwKTsgQGVuZGNvZGUKLSAqCi0gKiBcJWEgICBzYW1lIGFzIFwlcywgZXhjZXB0ICdcXHInIGFuZCAnXFxuJyBhcmUgb3V0cHV0IGFzICI8Y3I+IiBhbmQgIjxsZj4iLgotICogICAgICAgXCU/YSBpcyB2YWxpZCwgYnV0IFwlbGEgaXMgbm90LgotICoKLSAqIFwlYiAgIHByaW50cyBhbiBpbnRlZ2VyIGluIGJhc2UgMi4KLSAqICAgICAgIEBjb2RlIE9JX1ByaW50ZigiQml0cyBhcmUgJWIiLCBJKTsgQGVuZGNvZGUKLSAqCi0gKiBcJWxiICBwcmludHMgYSBsb25nIGludGVnZXIgaW4gYmFzZSAyLgotICoKLSAqIFwlP2IgIHByaW50cyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgTiBiaXRzIG9mIGFuIGludGVnZXIgKG9yIGxvbmcgaW50ZWdlcikKLSAqICAgICAgIGluIGJhc2UgMi4gUmVxdWlyZXMgdGhlIGludGVnZXIgYW5kIGEgbGVuZ3RoIE4uCi0gKiAgICAgICBAY29kZSBPSV9QcmludGYoIkJvdHRvbSA0IGJpdHMgYXJlOiAlP2IiLCBJLCA0KTsgQGVuZGNvZGUKLSAqCi0gKiBcJUIgICBwcmludHMgYW4gaW50ZWdlciBhcyBib29sZWFuIHRleHQsICJUUlVFIiBvciAiRkFMU0UiLgotICogICAgICAgQGNvZGUgT0lfUHJpbnRmKCJUaGUgdmFsdWUgMCBpcyAlQiwgdGhlIHZhbHVlIDEgaXMgJUIiLCAwLCAxKTsgQGVuZGNvZGUKLSAqCi0gKiBcJT9zICBwcmludHMgYSBzdWJzdHJpbmcgdXAgdG8gYSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0gKiAgICAgICBSZXF1aXJlcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgYW5kIGEgbGVuZ3RoIHBhcmFtZXRlci4KLSAqICAgICAgIEBjb2RlIE9JX1ByaW50ZigiU3RyaW5nIHByZWZpeCBpcyAlP3MiLCBzdHIsIDMpOyBAZW5kY29kZQotICoKLSAqIFwlbHMgIHNhbWUgYXMgXCVTLgotICoKLSAqIFwlUyAgIHByaW50cyBhIFVURjE2IHN0cmluZyBhcyBVVEY4IChwbGFpbiBBU0NJSSwgcGx1cyA4LWJpdCBjaGFyIHNlcXVlbmNlcwotICogICAgICAgd2hlcmUgbmVlZGVkKS4gUmVxdWlyZXMgYSBwb2ludGVyIHRvICNPSV9DSEFSMTYuIFwlP1MgaXMgdmFsaWQuIFRoZQotICogICAgICAgbGVuZ3RoIHBhcmFtZXRlciBpcyBpbiBPSV9DSEFSMTYgY2hhcmFjdGVycy4KLSAqCi0gKiBcJVQgICBwcmludHMgdGltZSwgZm9ybWF0dGVkIGFzICJzZWNzLm1zZWNzIi4KLSAqICAgICAgIFJlcXVpcmVzIHBvaW50ZXIgdG8gI09JX1RJTUUgc3RydWN0LCBOVUxMIHBvaW50ZXIgcHJpbnRzIGN1cnJlbnQgdGltZS4KLSAqICAgICAgIEBjb2RlIE9JX1ByaW50ZigiVGhlIHRpbWUgbm93IGlzICVUIiwgTlVMTCk7IEBlbmRjb2RlCi0gKgotICogIEBwYXJhbSBmb3JtYXQgICBUaGUgZm9ybWF0IHN0cmluZwotICoKLSAqLwotdm9pZCBPSV9QcmludGYoY29uc3QgT0lfQ0hBUiogZm9ybWF0LCAuLi4pOwotCi0vKioKLSAqIFZhci1hcmdzIHZlcnNpb24gT0lfUHJpbnRmCi0gKgotICogQHBhcmFtIGZvcm1hdCAgIFNhbWUgYXMgZm9yIE9JX1ByaW50Zi4KLSAqCi0gKiBAcGFyYW0gYXJncCAgICAgVmFyLWFyZ3MgbGlzdC4KLSAqLwotdm9pZCBPSV9WUHJpbnRmKGNvbnN0IE9JX0NIQVIqIGZvcm1hdCwgdmFfbGlzdCBhcmdwKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGEgYnVmZmVyLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBzYW1lIGZvcm1hdAotICogc3BlY2lmaWVycyBhcyBPSV9QcmludGYoKS4KLSAqCi0gKiBAcGFyYW0gYnVmZmVyICAgRGVzdGluYXRpb24gYnVmZmVyIGZvciB0aGUgZm9ybWF0dGVkIHN0cmluZy4KLSAqCi0gKiBAcGFyYW0gYnVmTGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgotICoKLSAqIEBwYXJhbSBmb3JtYXQgICBUaGUgZm9ybWF0IHN0cmluZwotICoKLSAqIEByZXR1cm4gICBOdW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIG9yIC0xIGluIHRoZSBjYXNlIG9mIGFuIGVycm9yLgotICovCi1pbnQzMl90IE9JX1NOUHJpbnRmKE9JX0NIQVIqIGJ1ZmZlciwgdWludDE2X3QgYnVmTGVuLCBjb25zdCBPSV9DSEFSKiBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIC4uLik7Ci0KLS8qKgotICogVmFyLWFyZ3MgdmVyc2lvbiBPSV9TTlByaW50ZgotICoKLSAqIEBwYXJhbSBidWZmZXIgICBEZXN0aW5hdGlvbiBidWZmZXIgZm9yIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgotICoKLSAqIEBwYXJhbSBidWZMZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCi0gKgotICogQHBhcmFtIGZvcm1hdCAgIFRoZSBmb3JtYXQgc3RyaW5nCi0gKgotICogQHBhcmFtIGFyZ3AgICAgIFZhci1hcmdzIGxpc3QuCi0gKgotICogQHJldHVybiAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gb3IgLTEgaW4gdGhlIGNhc2Ugb2YgYW4gZXJyb3IuCi0gKi8KLWludDMyX3QgT0lfVlNOUHJpbnRmKE9JX0NIQVIqIGJ1ZmZlciwgdWludDE2X3QgYnVmTGVuLCBjb25zdCBPSV9DSEFSKiBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3ApOwotCi0vKioKLSAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gaW50ZWdlci4KLSAqCi0gKiBAcGFyYW0gc3RyICB0aGUgc3RyaW5nIHRvIHBhcnNlCi0gKgotICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgc3RyaW5nIG9yIDAgaWYgdGhlIHN0cmluZyBjb3VsZCBub3QgYmUKLSAqICAgICAgICAgcGFyc2VkCi0gKi8KLU9JX0lOVCBPSV9hdG9pKGNvbnN0IE9JX0NIQVIqIHN0cik7Ci0KLS8qKgotICogUGFyc2UgYSBzaWduZWQgaW50ZWdlciBpbiBhIHN0cmluZy4KLSAqCi0gKiBTa2lwcyBsZWFkaW5nIHdoaXRlc3BhY2UgKHNwYWNlIGFuZCB0YWJzIG9ubHkpIGFuZCBwYXJzZXMgYSBkZWNpbWFsIG9yIGhleAotICogc3RyaW5nLiBIZXggc3RyaW5nIG11c3QgYmUgcHJlZml4ZWQgYnkgIjB4Ii4gUmV0dXJucyBwb2ludGVyIHRvIGZpcnN0Ci0gKiBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBpbnRlZ2VyLiBSZXR1cm5zIHRoZSBwb2ludGVyIHBhc3NlZCBpbiBpZiB0aGUgc3RyaW5nCi0gKiBkb2VzIG5vdCBkZXNjcmliZSBhbiBpbnRlZ2VyLgotICoKLSAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIHBhcnNlLgotICoKLSAqIEBwYXJhbSB2YWwgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBwYXJzZWQgaW50ZWdlciB2YWx1ZS4KLSAqCi0gKiBAcmV0dXJuICAgICAgIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgaW50ZWdlciBvciB0aGUKLSAqICAgICAgICAgICAgICAgcG9pbnRlciBwYXNzZWQgaW4uCi0gKi8KLWNvbnN0IE9JX0NIQVIqIE9JX1NjYW5JbnQoY29uc3QgT0lfQ0hBUiogc3RyLCBpbnQzMl90KiB2YWwpOwotCi0vKioKLSAqIFBhcnNlIGFuIHVuc2lnbmVkIGludGVnZXIgaW4gYSBzdHJpbmcuCi0gKgotICogU2tpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIChzcGFjZSBhbmQgdGFicyBvbmx5KSBhbmQgcGFyc2VzIGEgZGVjaW1hbCBvciBoZXgKLSAqIHN0cmluZy4gSGV4IHN0cmluZyBtdXN0IGJlIHByZWZpeGVkIGJ5ICIweCIuIFJldHVybnMgcG9pbnRlciB0byBmaXJzdAotICogY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgaW50ZWdlci4gUmV0dXJucyB0aGUgcG9pbnRlciBwYXNzZWQgaW4gaWYgdGhlCi0gKiBzdHJpbmcgZG9lcyBub3QgZGVzY3JpYmUgYW4gaW50ZWdlci4KLSAqCi0gKiBAcGFyYW0gc3RyICAgIFN0cmluZyB0byBwYXJzZS4KLSAqCi0gKiBAcGFyYW0gdmFsICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgcGFyc2VkIHVuc2lnbmVkIGludGVnZXIgdmFsdWUuCi0gKgotICogQHJldHVybiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIHVuc2lnbmVkCi0gKiAgICAgICAgICAgICAgIGludGVnZXIgb3IgdGhlIHBvaW50ZXIgcGFzc2VkIGluLgotICovCi1jb25zdCBPSV9DSEFSKiBPSV9TY2FuVUludChjb25zdCBPSV9DSEFSKiBzdHIsIHVpbnQzMl90KiB2YWwpOwotCi0vKioKLSAqIFBhcnNlIGEgd2hpdGVzcGFjZSBkZWxpbWl0ZWQgc3Vic3RyaW5nIG91dCBvZiBhIHN0cmluZy4KLSAqCi0gKiBAcGFyYW0gc3RyICAgICBJbnB1dCBzdHJpbmcgdG8gcGFyc2UuCi0gKiBAcGFyYW0gb3V0U3RyICBCdWZmZXIgdG8gcmV0dXJuIHRoZSBzdWJzdHJpbmcKLSAqIEBwYXJhbSBsZW4gICAgIExlbmd0aCBvZiBvdXRTdHIKLSAqCi0gKgotICogQHJldHVybiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIHN1YnN0cmluZyBvcgotICogICAgICAgICAgICAgICB0aGUgcG9pbnRlciBwYXNzZWQgaW4uCi0gKi8KLWNvbnN0IE9JX0NIQVIqIE9JX1NjYW5TdHIoY29uc3QgT0lfQ0hBUiogc3RyLCBPSV9DSEFSKiBvdXRTdHIsIHVpbnQxNl90IGxlbik7Ci0KLS8qKgotICogUGFyc2UgYSBzdHJpbmcgZm9yIG9uZSBvZiBhIHNldCBvZiBhbHRlcm5hdGl2ZSB2YWx1ZS4gU2tpcHMgbGVhZGluZwotICogd2hpdGVzcGFjZSAoc3BhY2UgYW5kIHRhYnMgb25seSkgYW5kIHBhcnNlcyB0ZXh0IG1hdGNoaW5nIG9uZSBvZiB0aGUKLSAqIGFsdGVybmF0aXZlIHN0cmluZ3MuIFJldHVybnMgcG9pbnRlciB0byBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZQotICogbWF0Y2hlZCB0ZXh0LgotICoKLSAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIHBhcnNlLgotICoKLSAqIEBwYXJhbSBhbHRzICAgQWx0ZXJuYXRpdmUgbWF0Y2hpbmcgc3RyaW5ncyBzZXBhcmF0ZWQgYnkgJ3wnCi0gKgotICogQHBhcmFtIGluZGV4ICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGluZyBhbHRlcm5hdGl2ZSwKLSAqICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGlzIC0xIGlmIHRoZXJlIGlzIG5vIG1hdGNoLgotICoKLSAqIEByZXR1cm4gICAgICAgQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBtYXRjaGVkIHZhbHVlIG9yCi0gKiAgICAgICAgICAgICAgIHRoZSBwb2ludGVyIHBhc3NlZCBpbiBpZiB0aGVyZSB3YXMgbm8gbWF0Y2hpbmcgdGV4dC4KLSAqLwotY29uc3QgT0lfQ0hBUiogT0lfU2NhbkFsdChjb25zdCBPSV9DSEFSKiBzdHIsIGNvbnN0IE9JX0NIQVIqIGFsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0lOVCogaW5kZXgpOwotCi0vKiogR2V0IGEgY2hhcmFjdGVyIGZyb20gYSBkaWdpdCBpbnRlZ2VyIHZhbHVlICgwIC0gOSkuICovCi0jZGVmaW5lIE9JX0RpZ2l0VG9DaGFyKGQpICgoZCkgKyAnMCcpCi0KLS8qKgotICogRGV0ZXJtaW5lIE1heGltdW0gYW5kIE1pbmltdW0gYmV0d2VlbiB0d28gYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBhICAxc3QgdmFsdWUKLSAqIEBwYXJhbSBiICAybmQgdmFsdWUKLSAqCi0gKiBAcmV0dXJuIHRoZSBtYXggb3IgbWluIHZhbHVlIGJldHdlZW4gYSAmIGIKLSAqLwotI2RlZmluZSBPSV9NQVgoYSwgYikgKCgoYSkgPCAoYikpID8gKGIpIDogKGEpKQotI2RlZmluZSBPSV9NSU4oYSwgYikgKCgoYSkgPiAoYikpID8gKGIpIDogKGEpKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKipAfSovCi0KLSNlbmRpZiAvKiBfT0lfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NiY2RlY29kZXJfZnV6emVyLmMgYi9lbWJkcnYvc2JjL2RlY29kZXIvc2JjZGVjb2Rlcl9mdXp6ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyM2NjYy4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvc2JjZGVjb2Rlcl9mdXp6ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9pX2NvZGVjX3NiYy5oIgotCi0jZGVmaW5lIENPREVDX0RBVEFfV09SRFMobnVtQ2hhbm5lbHMsIG51bUJ1ZmZlcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKChzaXplb2YoaW50MzJfdCkgKiBTQkNfTUFYX0JMT0NLUyAqIChudW1DaGFubmVscykqU0JDX01BWF9CQU5EUykgKyAgICAgICAgIFwKLSAgICAoc2l6ZW9mKFNCQ19CVUZGRVJfVCkgKiBTQkNfTUFYX0NIQU5ORUxTICogU0JDX01BWF9CQU5EUyAqIChudW1CdWZmZXJzKSkgKyBcCi0gICAgKHNpemVvZih1aW50MzJfdCkgLSAxKSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgc2l6ZW9mKHVpbnQzMl90KSkKLQotI2RlZmluZSBTQkNfQ09ERUNfRkFTVF9GSUxURVJfQlVGRkVSUyAyNwotCi0jZGVmaW5lIFNCQ19NQVhfQ0hBTk5FTFMgMgotI2RlZmluZSBTQkNfTUFYX0JBTkRTIDgKLSNkZWZpbmUgU0JDX01BWF9CTE9DS1MgMTYKLS8qIE1pbmltdW0gc2l6ZSBvZiB0aGUgYml0IGFsbG9jYXRpb24gcG9vbCB1c2VkIHRvIGVuY29kZSB0aGUgc3RyZWFtICovCi0jZGVmaW5lIFNCQ19NSU5fQklUUE9PTCAyCi0vKiBNYXhpbXVtIHNpemUgb2YgdGhlIGJpdCBhbGxvY2F0aW9uIHBvb2wgdXNlZCB0byBlbmNvZGUgdGhlIHN0cmVhbSAqLwotI2RlZmluZSBTQkNfTUFYX0JJVFBPT0wgMjUwCi0jZGVmaW5lIFNCQ19NQVhfT05FX0NIQU5ORUxfQlBTIDMyMDAwMAotI2RlZmluZSBTQkNfTUFYX1RXT19DSEFOTkVMX0JQUyA1MTIwMDAKLQotI2RlZmluZSBTQkNfV0JTX0JJVFJBVEUgNjIwMDAKLSNkZWZpbmUgU0JDX1dCU19CSVRQT09MIDI3Ci0jZGVmaW5lIFNCQ19XQlNfTlJPRl9CTE9DS1MgMTYKLSNkZWZpbmUgU0JDX1dCU19GUkFNRV9MRU4gNjIKLSNkZWZpbmUgU0JDX1dCU19TQU1QTEVTX1BFUl9GUkFNRSAxMjgKLQotI2RlZmluZSBTQkNfSEVBREVSX0xFTiA0Ci0jZGVmaW5lIFNCQ19NQVhfU0FNUExFU19QRVJfRlJBTUUgKFNCQ19NQVhfQkFORFMgKiBTQkNfTUFYX0JMT0NLUykKLQotc3RhdGljIE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQgYnRpZl9hMmRwX3NpbmtfY29udGV4dDsKLXN0YXRpYyB1aW50MzJfdCBidGlmX2EyZHBfc2lua19jb250ZXh0X2RhdGFbQ09ERUNfREFUQV9XT1JEUygKLSAgICAyLCBTQkNfQ09ERUNfRkFTVF9GSUxURVJfQlVGRkVSUyldOwotCi1zdGF0aWMgaW50MTZfdAotICAgIGJ0aWZfYTJkcF9zaW5rX3BjbV9kYXRhWzE1ICogU0JDX01BWF9TQU1QTEVTX1BFUl9GUkFNRSAqIFNCQ19NQVhfQ0hBTk5FTFNdOwotCi1pbnQgTExWTUZ1enplckluaXRpYWxpemUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICh2b2lkKWFyZ2M7Ci0gICh2b2lkKWFyZ3Y7Ci0gIE9JX0NPREVDX1NCQ19EZWNvZGVyUmVzZXQoJmJ0aWZfYTJkcF9zaW5rX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hMmRwX3NpbmtfY29udGV4dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidGlmX2EyZHBfc2lua19jb250ZXh0X2RhdGEpLCAyLCAyLCAwKTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3QgbGVuKSB7Ci0gIHVpbnQzMl90IHBjbUJ5dGVzLCBhdmFpbFBjbUJ5dGVzOwotICBpbnQxNl90KiBwY21EYXRhUG9pbnRlciA9Ci0gICAgICBidGlmX2EyZHBfc2lua19wY21fZGF0YTsgLyogV2lsbCBiZSBvdmVyd3JpdHRlbiBvbiBuZXh0IHBhY2tldCByZWNlaXB0ICovCi0gIGF2YWlsUGNtQnl0ZXMgPSBzaXplb2YoYnRpZl9hMmRwX3NpbmtfcGNtX2RhdGEpOwotCi0gIHBjbUJ5dGVzID0gYXZhaWxQY21CeXRlczsKLSAgT0lfQ09ERUNfU0JDX0RlY29kZUZyYW1lKCZidGlmX2EyZHBfc2lua19jb250ZXh0LCAoY29uc3QgT0lfQllURSoqKSZidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QqKSZsZW4sIChpbnQxNl90KilwY21EYXRhUG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCopJnBjbUJ5dGVzKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2FsbG9jLmMgYi9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZlNTQzLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2FsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMyAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgIm9pX2NvZGVjX3NiY19wcml2YXRlLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotUFJJVkFURSBPSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0FsbG9jKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb2RlY0RhdGFBbGlnbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGVjRGF0YUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4Q2hhbm5lbHMsIHVpbnQ4X3QgcGNtU3RyaWRlKSB7Ci0gIGludCBpOwotICBzaXplX3QgZmlsdGVyQnVmZmVyQ291bnQ7Ci0gIHNpemVfdCBzdWJkYXRhU2l6ZTsKLSAgT0lfQllURSogY29kZWNEYXRhID0gKE9JX0JZVEUqKWNvZGVjRGF0YUFsaWduZWQ7Ci0KLSAgaWYgKG1heENoYW5uZWxzIDwgMSB8fCBtYXhDaGFubmVscyA+IDIpIHsKLSAgICByZXR1cm4gT0lfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgfQotCi0gIGlmIChwY21TdHJpZGUgPCAxIHx8IHBjbVN0cmlkZSA+IG1heENoYW5uZWxzKSB7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLQotICBjb21tb24tPm1heENoYW5uZWxzID0gbWF4Q2hhbm5lbHM7Ci0gIGNvbW1vbi0+cGNtU3RyaWRlID0gcGNtU3RyaWRlOwotCi0gIC8qIENvbXB1dGUgc2l6ZXMgbmVlZGVkIGZvciB0aGUgbWVtb3J5IHJlZ2lvbnMsIGFuZCBiYWlsIGlmIHdlIGRvbid0IGhhdmUKLSAgICogZW5vdWdoIG1lbW9yeSBmb3IgdGhlbS4gKi8KLSAgc3ViZGF0YVNpemUgPQotICAgICAgbWF4Q2hhbm5lbHMgKiBzaXplb2YoY29tbW9uLT5zdWJkYXRhWzBdKSAqIFNCQ19NQVhfQkFORFMgKiBTQkNfTUFYX0JMT0NLUzsKLSAgaWYgKHN1YmRhdGFTaXplID4gY29kZWNEYXRhQnl0ZXMpIHsKLSAgICByZXR1cm4gT0lfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gIH0KLQotICBmaWx0ZXJCdWZmZXJDb3VudCA9Ci0gICAgICAoY29kZWNEYXRhQnl0ZXMgLSBzdWJkYXRhU2l6ZSkgLwotICAgICAgKHNpemVvZihjb21tb24tPmZpbHRlckJ1ZmZlclswXVswXSkgKiBTQkNfTUFYX0JBTkRTICogbWF4Q2hhbm5lbHMpOwotICBpZiAoZmlsdGVyQnVmZmVyQ291bnQgPCBTQkNfQ09ERUNfTUlOX0ZJTFRFUl9CVUZGRVJTKSB7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICB9Ci0gIGNvbW1vbi0+ZmlsdGVyQnVmZmVyTGVuID0gZmlsdGVyQnVmZmVyQ291bnQgKiBTQkNfTUFYX0JBTkRTOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN1YmJhbmQgZGF0YSAqLwotICBjb21tb24tPnN1YmRhdGEgPSAoaW50MzJfdCopY29kZWNEYXRhOwotICBjb2RlY0RhdGEgKz0gc3ViZGF0YVNpemU7Ci0gIE9JX0FTU0VSVChjb2RlY0RhdGFCeXRlcyA+PSBzdWJkYXRhU2l6ZSk7Ci0gIGNvZGVjRGF0YUJ5dGVzIC09IHN1YmRhdGFTaXplOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN5bnRoZXNpcyBidWZmZXJzICovCi0gIGZvciAoaSA9IDA7IGkgPCBtYXhDaGFubmVsczsgKytpKSB7Ci0gICAgc2l6ZV90IGFsbG9jU2l6ZSA9Ci0gICAgICAgIGNvbW1vbi0+ZmlsdGVyQnVmZmVyTGVuICogc2l6ZW9mKGNvbW1vbi0+ZmlsdGVyQnVmZmVyWzBdWzBdKTsKLSAgICBjb21tb24tPmZpbHRlckJ1ZmZlcltpXSA9IChTQkNfQlVGRkVSX1QqKWNvZGVjRGF0YTsKLSAgICBPSV9BU1NFUlQoY29kZWNEYXRhQnl0ZXMgPj0gYWxsb2NTaXplKTsKLSAgICBjb2RlY0RhdGEgKz0gYWxsb2NTaXplOwotICAgIGNvZGVjRGF0YUJ5dGVzIC09IGFsbG9jU2l6ZTsKLSAgfQotCi0gIHJldHVybiBPSV9PSzsKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2JpdGFsbG9jLXNiYy5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvYml0YWxsb2Mtc2JjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjZiZGYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvYml0YWxsb2Mtc2JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiBAZmlsZQotQGluZ3JvdXAgY29kZWNfaW50ZXJuYWwKLSovCi0KLS8qKkBhZGRncm91cCBjb2RlY19pbnRlcm5hbCovCi0vKipAeyovCi0KLSNpbmNsdWRlIDxvaV9jb2RlY19zYmNfcHJpdmF0ZS5oPgotCi1zdGF0aWMgdm9pZCBkdWFsQml0QWxsb2NhdGlvbihPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbikgewotICBPSV9VSU5UIGJpdGNvdW50TDsKLSAgT0lfVUlOVCBiaXRjb3VudFI7Ci0gIE9JX1VJTlQgYml0cG9vbFByZWZlcmVuY2VMID0gMDsKLSAgT0lfVUlOVCBiaXRwb29sUHJlZmVyZW5jZVIgPSAwOwotICBCSVRORUVEX1VOSU9OMSBiaXRuZWVkc0w7Ci0gIEJJVE5FRURfVU5JT04xIGJpdG5lZWRzUjsKLQotICBiaXRjb3VudEwgPSBjb21wdXRlQml0bmVlZChjb21tb24sIGJpdG5lZWRzTC51aW50OCwgMCwgJmJpdHBvb2xQcmVmZXJlbmNlTCk7Ci0gIGJpdGNvdW50UiA9IGNvbXB1dGVCaXRuZWVkKGNvbW1vbiwgYml0bmVlZHNSLnVpbnQ4LCAxLCAmYml0cG9vbFByZWZlcmVuY2VSKTsKLQotICBvbmVDaGFubmVsQml0QWxsb2NhdGlvbihjb21tb24sICZiaXRuZWVkc0wsIDAsIGJpdGNvdW50TCk7Ci0gIG9uZUNoYW5uZWxCaXRBbGxvY2F0aW9uKGNvbW1vbiwgJmJpdG5lZWRzUiwgMSwgYml0Y291bnRSKTsKLX0KLQotc3RhdGljIHZvaWQgc3RlcmVvQml0QWxsb2NhdGlvbihPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbikgewotICBjb25zdCBPSV9VSU5UIG5yb2Zfc3ViYmFuZHMgPSBjb21tb24tPmZyYW1lSW5mby5ucm9mX3N1YmJhbmRzOwotICBCSVRORUVEX1VOSU9OMiBiaXRuZWVkczsKLSAgT0lfVUlOVCBleGNlc3M7Ci0gIE9JX0lOVCBiaXRhZGp1c3Q7Ci0gIE9JX1VJTlQgYml0Y291bnQ7Ci0gIE9JX1VJTlQgc2JMOwotICBPSV9VSU5UIHNiUjsKLSAgT0lfVUlOVCBiaXRwb29sUHJlZmVyZW5jZSA9IDA7Ci0KLSAgYml0Y291bnQgPSBjb21wdXRlQml0bmVlZChjb21tb24sICZiaXRuZWVkcy51aW50OFswXSwgMCwgJmJpdHBvb2xQcmVmZXJlbmNlKTsKLSAgYml0Y291bnQgKz0gY29tcHV0ZUJpdG5lZWQoY29tbW9uLCAmYml0bmVlZHMudWludDhbbnJvZl9zdWJiYW5kc10sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiaXRwb29sUHJlZmVyZW5jZSk7Ci0KLSAgewotICAgIE9JX1VJTlQgZXg7Ci0gICAgYml0YWRqdXN0ID0gYWRqdXN0VG9GaXRCaXRwb29sKGNvbW1vbi0+ZnJhbWVJbmZvLmJpdHBvb2wsIGJpdG5lZWRzLnVpbnQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIG5yb2Zfc3ViYmFuZHMsIGJpdGNvdW50LCAmZXgpOwotICAgIC8qIFdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIHB1dCBleGNlc3MgaW50byBhIHJlZ2lzdGVyICovCi0gICAgZXhjZXNzID0gZXg7Ci0gIH0KLSAgc2JMID0gMDsKLSAgc2JSID0gbnJvZl9zdWJiYW5kczsKLSAgd2hpbGUgKHNiTCA8IG5yb2Zfc3ViYmFuZHMpIHsKLSAgICBleGNlc3MgPSBhbGxvY0FkanVzdGVkQml0cygmY29tbW9uLT5iaXRzLnVpbnQ4W3NiTF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bmVlZHMudWludDhbc2JMXSArIGJpdGFkanVzdCwgZXhjZXNzKTsKLSAgICArK3NiTDsKLSAgICBleGNlc3MgPSBhbGxvY0FkanVzdGVkQml0cygmY29tbW9uLT5iaXRzLnVpbnQ4W3NiUl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bmVlZHMudWludDhbc2JSXSArIGJpdGFkanVzdCwgZXhjZXNzKTsKLSAgICArK3NiUjsKLSAgfQotICBzYkwgPSAwOwotICBzYlIgPSBucm9mX3N1YmJhbmRzOwotICB3aGlsZSAoZXhjZXNzKSB7Ci0gICAgZXhjZXNzID0gYWxsb2NFeGNlc3NCaXRzKCZjb21tb24tPmJpdHMudWludDhbc2JMXSwgZXhjZXNzKTsKLSAgICArK3NiTDsKLSAgICBpZiAoIWV4Y2VzcykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGV4Y2VzcyA9IGFsbG9jRXhjZXNzQml0cygmY29tbW9uLT5iaXRzLnVpbnQ4W3NiUl0sIGV4Y2Vzcyk7Ci0gICAgKytzYlI7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IEJJVF9BTExPQyBiYWxsb2NbXSA9IHsKLSAgICBtb25vQml0QWxsb2NhdGlvbiwgICAvKiBTQkNfTU9OTyAqLwotICAgIGR1YWxCaXRBbGxvY2F0aW9uLCAgIC8qIFNCQ19EVUFMX0NIQU5ORUwgKi8KLSAgICBzdGVyZW9CaXRBbGxvY2F0aW9uLCAvKiBTQkNfU1RFUkVPICovCi0gICAgc3RlcmVvQml0QWxsb2NhdGlvbiAgLyogU0JDX0pPSU5UX1NURVJFTyAqLwotfTsKLQotUFJJVkFURSB2b2lkIE9JX1NCQ19Db21wdXRlQml0QWxsb2NhdGlvbihPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbikgewotICBPSV9BU1NFUlQoY29tbW9uLT5mcmFtZUluZm8uYml0cG9vbCA8PSBPSV9TQkNfTWF4Qml0cG9vbCgmY29tbW9uLT5mcmFtZUluZm8pKTsKLSAgT0lfQVNTRVJUKGNvbW1vbi0+ZnJhbWVJbmZvLm1vZGUgPCBPSV9BUlJBWVNJWkUoYmFsbG9jKSk7Ci0KLSAgLyoKLSAgICogVXNpbmcgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb20gY3JlYXRpbmcgYQotICAgKiBzdWJvcHRpbWFsCi0gICAqIG1vbm9saXRoaWMgaW5saW5lZCBiaXQgYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICovCi0gIGJhbGxvY1tjb21tb24tPmZyYW1lSW5mby5tb2RlXShjb21tb24pOwotfQotCi11aW50MzJfdCBPSV9DT0RFQ19TQkNfQ2FsY3VsYXRlQml0cmF0ZShPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpIHsKLSAgcmV0dXJuIGludGVybmFsX0NhbGN1bGF0ZUJpdHJhdGUoZnJhbWUpOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBjdXJyZW50IG1heGltdW0gYml0bmVlZCBhbmQgY2xlYXIgaXQuCi0gKi8KLXVpbnQ4X3QgT0lfQ09ERUNfU0JDX0dldE1heEJpdG5lZWQoT0lfQ09ERUNfU0JDX0NPTU1PTl9DT05URVhUKiBjb21tb24pIHsKLSAgdWludDhfdCBtYXggPSBjb21tb24tPm1heEJpdG5lZWQ7Ci0KLSAgY29tbW9uLT5tYXhCaXRuZWVkID0gMDsKLSAgcmV0dXJuIG1heDsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZXMgdGhlIGJpdHBvb2wgc2l6ZSBmb3IgYSBnaXZlbiBmcmFtZSBsZW5ndGgKLSAqLwotdWludDE2X3QgT0lfQ09ERUNfU0JDX0NhbGN1bGF0ZUJpdHBvb2woT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnJhbWVMZW4pIHsKLSAgdWludDE2X3QgbnJvZl9zdWJiYW5kcyA9IGZyYW1lLT5ucm9mX3N1YmJhbmRzOwotICB1aW50MTZfdCBucm9mX2Jsb2NrcyA9IGZyYW1lLT5ucm9mX2Jsb2NrczsKLSAgdWludDE2X3QgaGRyOwotICB1aW50MTZfdCBiaXRzOwotCi0gIGlmIChmcmFtZS0+bW9kZSA9PSBTQkNfSk9JTlRfU1RFUkVPKSB7Ci0gICAgaGRyID0gOSAqIG5yb2Zfc3ViYmFuZHM7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZyYW1lLT5tb2RlID09IFNCQ19NT05PKSB7Ci0gICAgICBoZHIgPSA0ICogbnJvZl9zdWJiYW5kczsKLSAgICB9IGVsc2UgewotICAgICAgaGRyID0gOCAqIG5yb2Zfc3ViYmFuZHM7Ci0gICAgfQotICAgIGlmIChmcmFtZS0+bW9kZSA9PSBTQkNfRFVBTF9DSEFOTkVMKSB7Ci0gICAgICBucm9mX2Jsb2NrcyAqPSAyOwotICAgIH0KLSAgfQotICBiaXRzID0gOCAqIChmcmFtZUxlbiAtIFNCQ19IRUFERVJfTEVOKSAtIGhkcjsKLSAgcmV0dXJuIERJVklERShiaXRzLCBucm9mX2Jsb2Nrcyk7Ci19Ci0KLXVpbnQxNl90IE9JX0NPREVDX1NCQ19DYWxjdWxhdGVQY21CeXRlcyhPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbikgewotICByZXR1cm4gc2l6ZW9mKGludDE2X3QpICogY29tbW9uLT5wY21TdHJpZGUgKiBjb21tb24tPmZyYW1lSW5mby5ucm9mX3N1YmJhbmRzICoKLSAgICAgICAgIGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2ZfYmxvY2tzOwotfQotCi11aW50MTZfdCBPSV9DT0RFQ19TQkNfQ2FsY3VsYXRlRnJhbWVsZW4oT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lKSB7Ci0gIHJldHVybiBpbnRlcm5hbF9DYWxjdWxhdGVGcmFtZWxlbihmcmFtZSk7Ci19Ci0KLS8qKkB9Ki8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2JpdGFsbG9jLmMgYi9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9iaXRhbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjhhM2I1Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2JpdGFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotQGZpbGUKLQotVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgcmVsYXRlIHRvIHRoZSBhbGxvY2F0aW9uIG9mIGF2YWlsYWJsZSBiaXRzIHRvCi1zdWJiYW5kcyB3aXRoaW4gdGhlIFNCQy9lU0JDIGZyYW1lLCBhbG9uZyB3aXRoIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBjb21wdXRpbmcKLWZyYW1lIGxlbmd0aCBhbmQgYml0cmF0ZS4KLQotQGluZ3JvdXAgY29kZWNfaW50ZXJuYWwKLSovCi0KLS8qKgotQGFkZHRvZ3JvdXAgY29kZWNfaW50ZXJuYWwKLUB7Ci0qLwotCi0jaW5jbHVkZSA8b2lfY29kZWNfc2JjX3ByaXZhdGUuaD4KLSNpbmNsdWRlICJvaV91dGlscy5oIgotCi11aW50MzJfdCBPSV9TQkNfTWF4Qml0cG9vbChPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpIHsKLSAgc3dpdGNoIChmcmFtZS0+bW9kZSkgewotICAgIGNhc2UgU0JDX01PTk86Ci0gICAgY2FzZSBTQkNfRFVBTF9DSEFOTkVMOgotICAgICAgcmV0dXJuIDE2ICogZnJhbWUtPm5yb2Zfc3ViYmFuZHM7Ci0gICAgY2FzZSBTQkNfU1RFUkVPOgotICAgIGNhc2UgU0JDX0pPSU5UX1NURVJFTzoKLSAgICAgIHJldHVybiAzMiAqIGZyYW1lLT5ucm9mX3N1YmJhbmRzOwotICB9Ci0KLSAgRVJST1IoKCJJbnZhbGlkIGZyYW1lIG1vZGUgJWQiLCBmcmFtZS0+bW9kZSkpOwotICBPSV9BU1NFUlQoZmFsc2UpOwotICByZXR1cm4gMDsgLyogU2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQgKi8KLX0KLQotUFJJVkFURSB1aW50MTZfdCBpbnRlcm5hbF9DYWxjdWxhdGVGcmFtZWxlbihPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUpIHsKLSAgdWludDE2X3QgbmJpdHMgPSBmcmFtZS0+bnJvZl9ibG9ja3MgKiBmcmFtZS0+Yml0cG9vbDsKLSAgdWludDE2X3QgbnJvZl9zdWJiYW5kcyA9IGZyYW1lLT5ucm9mX3N1YmJhbmRzOwotICB1aW50MTZfdCByZXN1bHQgPSBuYml0czsKLQotICBpZiAoZnJhbWUtPm1vZGUgPT0gU0JDX0pPSU5UX1NURVJFTykgewotICAgIHJlc3VsdCArPSBucm9mX3N1YmJhbmRzICsgKDggKiBucm9mX3N1YmJhbmRzKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZnJhbWUtPm1vZGUgPT0gU0JDX0RVQUxfQ0hBTk5FTCkgewotICAgICAgcmVzdWx0ICs9IG5iaXRzOwotICAgIH0KLSAgICBpZiAoZnJhbWUtPm1vZGUgPT0gU0JDX01PTk8pIHsKLSAgICAgIHJlc3VsdCArPSA0ICogbnJvZl9zdWJiYW5kczsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9IDggKiBucm9mX3N1YmJhbmRzOwotICAgIH0KLSAgfQotICByZXR1cm4gU0JDX0hFQURFUl9MRU4gKyAocmVzdWx0ICsgNykgLyA4OwotfQotCi1QUklWQVRFIHVpbnQzMl90IGludGVybmFsX0NhbGN1bGF0ZUJpdHJhdGUoT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lKSB7Ci0gIE9JX1VJTlQgYmxvY2tzYmFuZHM7Ci0gIGJsb2Nrc2JhbmRzID0gZnJhbWUtPm5yb2Zfc3ViYmFuZHMgKiBmcmFtZS0+bnJvZl9ibG9ja3M7Ci0KLSAgcmV0dXJuIERJVklERSg4ICogaW50ZXJuYWxfQ2FsY3VsYXRlRnJhbWVsZW4oZnJhbWUpICogZnJhbWUtPmZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICBibG9ja3NiYW5kcyk7Ci19Ci0KLUlOTElORSB1aW50MTZfdCBPSV9TQkNfQ2FsY3VsYXRlRnJhbWVBbmRIZWFkZXJsZW4oCi0gICAgT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lLCBPSV9VSU5UKiBoZWFkZXJMZW5fKSB7Ci0gIE9JX1VJTlQgaGVhZGVyTGVuID0KLSAgICAgIFNCQ19IRUFERVJfTEVOICsgZnJhbWUtPm5yb2Zfc3ViYmFuZHMgKiBmcmFtZS0+bnJvZl9jaGFubmVscyAvIDI7Ci0KLSAgaWYgKGZyYW1lLT5tb2RlID09IFNCQ19KT0lOVF9TVEVSRU8pIHsKLSAgICBoZWFkZXJMZW4rKzsKLSAgfQotCi0gICpoZWFkZXJMZW5fID0gaGVhZGVyTGVuOwotICByZXR1cm4gaW50ZXJuYWxfQ2FsY3VsYXRlRnJhbWVsZW4oZnJhbWUpOwotfQotCi0jZGVmaW5lIE1JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQotCi0vKgotICogQ29tcHV0ZXMgdGhlIGJpdCBuZWVkIGZvciBlYWNoIHNhbXBsZSBhbmQgYXMgYWxzbyByZXR1cm5zIGEgY291bnRzIG9mIGJpdAotICogbmVlZHMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIG9uZS4gVGhpcyBjb3VudCBpcyB1c2VkIGluIHRoZSBmaXJzdCBwaGFzZSBvZiBiaXQKLSAqIGFsbG9jYXRpb24uCi0gKgotICogV2UgYWxzbyBjb21wdXRlIGEgcHJlZmVycmVkIGJpdHBvb2wgdmFsdWUgdGhhdCB0aGlzIGlzIHRoZSBtaW5pbXVtIGJpdHBvb2wKLSAqIG5lZWRlZCB0byBndWFyYW50ZWUgbG9zc2xlc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIGF1ZGlvIGRhdGEuIFRoZSBwcmVmZXJyZWQKLSAqIGJpdHBvb2wgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBiaXRzIGFjdHVhbGx5IHJlcXVpcmVkIGJ1dCB0aGUgb25seSBpbnB1dCB3ZQotICogaGF2ZSBhcmUgdGhlIHNjYWxlIGZhY3RvcnMuIEZvciBleGFtcGxlLCBpdCB0YWtlcyAyIGJpdHMgdG8gcmVwcmVzZW50IHZhbHVlcwotICogaW4gdGhlIHJhbmdlIC0xIC4uICsxIGJ1dCB0aGUgc2NhbGUgZmFjdG9yIGlzIDAuIFRvIGd1YXJhbnRlZSBsb3NzbGVzcwotICogcmVwcmVzZW50YXRpb24gd2UgYWRkIDIgdG8gZWFjaCBzY2FsZSBmYWN0b3IgYW5kIHN1bSB0aGVtIHRvIGNvbWUgdXAgd2l0aCB0aGUKLSAqIHByZWZlcnJlZCBiaXRwb29sLiBUaGlzIGlzIG5vdCBpZGVhbCBiZWNhdXNlIDAgcmVxdWlyZXMgMCBiaXRzIGJ1dCB3ZQotICogY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgdGhpcy4KLSAqCi0gKiBAcGFyYW0gYml0bmVlZCAgICAgICBBcnJheSB0byByZXR1cm4gYml0bmVlZHMgZm9yIGVhY2ggc3ViYmFuZAotICoKLSAqIEBwYXJhbSBjaCAgICAgICAgICAgIENoYW5uZWwgMCBvciAxCi0gKgotICogQHBhcmFtIHByZWZlcnJlZEJpdHBvb2wgIFJldHVybnMgdGhlIG51bWJlciBvZiByZXNlcnZlZCBiaXRzCi0gKgotICogQHJldHVybiAgICAgICAgICAgICAgVGhlIFNCQyBiaXQgbmVlZAotICoKLSAqLwotT0lfVUlOVCBjb21wdXRlQml0bmVlZChPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbiwgdWludDhfdCogYml0bmVlZHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgY2gsIE9JX1VJTlQqIHByZWZlcnJlZEJpdHBvb2wpIHsKLSAgc3RhdGljIGNvbnN0IGludDhfdCBvZmZzZXQ0WzRdWzRdID0gewotICAgICAgey0xLCAwLCAwLCAwfSwgey0yLCAwLCAwLCAxfSwgey0yLCAwLCAwLCAxfSwgey0yLCAwLCAwLCAxfX07Ci0KLSAgc3RhdGljIGNvbnN0IGludDhfdCBvZmZzZXQ4WzRdWzhdID0ge3stMiwgMCwgMCwgMCwgMCwgMCwgMCwgMX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTMsIDAsIDAsIDAsIDAsIDAsIDEsIDJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCAwLCAwLCAwLCAwLCAwLCAxLCAyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNCwgMCwgMCwgMCwgMCwgMCwgMSwgMn19OwotCi0gIGNvbnN0IE9JX1VJTlQgbnJvZl9zdWJiYW5kcyA9IGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHM7Ci0gIE9JX1VJTlQgc2I7Ci0gIGludDhfdCogc2NhbGVfZmFjdG9yID0gJmNvbW1vbi0+c2NhbGVfZmFjdG9yW2NoID8gbnJvZl9zdWJiYW5kcyA6IDBdOwotICBPSV9VSU5UIGJpdGNvdW50ID0gMDsKLSAgdWludDhfdCBtYXhCaXRzID0gMDsKLSAgdWludDhfdCBwcmVmQml0cyA9IDA7Ci0KLSAgaWYgKGNvbW1vbi0+ZnJhbWVJbmZvLmFsbG9jID09IFNCQ19TTlIpIHsKLSAgICBmb3IgKHNiID0gMDsgc2IgPCBucm9mX3N1YmJhbmRzOyBzYisrKSB7Ci0gICAgICBPSV9JTlQgYml0cyA9IHNjYWxlX2ZhY3RvcltzYl07Ci0gICAgICBpZiAoYml0cyA+IG1heEJpdHMpIHsKLSAgICAgICAgbWF4Qml0cyA9IGJpdHM7Ci0gICAgICB9Ci0gICAgICBiaXRuZWVkc1tzYl0gPSBiaXRzOwotICAgICAgaWYgKGJpdG5lZWRzW3NiXSA+IDEpIHsKLSAgICAgICAgYml0Y291bnQgKz0gYml0czsKLSAgICAgIH0KLSAgICAgIHByZWZCaXRzICs9IDIgKyBiaXRzOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb25zdCBpbnQ4X3QqIG9mZnNldDsKLSAgICBpZiAobnJvZl9zdWJiYW5kcyA9PSA0KSB7Ci0gICAgICBvZmZzZXQgPSBvZmZzZXQ0W2NvbW1vbi0+ZnJhbWVJbmZvLmZyZXFJbmRleF07Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9mZnNldCA9IG9mZnNldDhbY29tbW9uLT5mcmFtZUluZm8uZnJlcUluZGV4XTsKLSAgICB9Ci0gICAgZm9yIChzYiA9IDA7IHNiIDwgbnJvZl9zdWJiYW5kczsgc2IrKykgewotICAgICAgT0lfSU5UIGJpdHMgPSBzY2FsZV9mYWN0b3Jbc2JdOwotICAgICAgaWYgKGJpdHMgPiBtYXhCaXRzKSB7Ci0gICAgICAgIG1heEJpdHMgPSBiaXRzOwotICAgICAgfQotICAgICAgcHJlZkJpdHMgKz0gMiArIGJpdHM7Ci0gICAgICBpZiAoYml0cykgewotICAgICAgICBiaXRzIC09IG9mZnNldFtzYl07Ci0gICAgICAgIGlmIChiaXRzID4gMCkgewotICAgICAgICAgIGJpdHMgLz0gMjsKLSAgICAgICAgfQotICAgICAgICBiaXRzICs9IDU7Ci0gICAgICB9Ci0gICAgICBiaXRuZWVkc1tzYl0gPSBiaXRzOwotICAgICAgaWYgKGJpdG5lZWRzW3NiXSA+IDEpIHsKLSAgICAgICAgYml0Y291bnQgKz0gYml0czsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgY29tbW9uLT5tYXhCaXRuZWVkID0gT0lfTUFYKG1heEJpdHMsIGNvbW1vbi0+bWF4Qml0bmVlZCk7Ci0gICpwcmVmZXJyZWRCaXRwb29sICs9IHByZWZCaXRzOwotICByZXR1cm4gYml0Y291bnQ7Ci19Ci0KLS8qCi0gKiBFeHBsYW5hdGlvbiBvZiB0aGUgYWRqdXN0VG9GaXRCaXRwb29sIGlubmVyIGxvb3AuCi0gKgotICogVGhlIGlubmVyIGxvb3AgY29tcHV0ZXMgdGhlIGVmZmVjdCBvZiBhZGp1c3RpbmcgdGhlIGJpdCBhbGxvY2F0aW9uIHVwIG9yCi0gKiBkb3duLiBBbGxvY2F0aW9ucyBtdXN0IGJlIDAgb3IgaW4gdGhlIHJhbmdlIDIuLjE2LiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQotICogdGhlIGZvbGxvd2luZyBjb2RlOgotICoKLSAqICAgICAgICAgICBmb3IgKHMgPSBiYW5kcyAtIDE7IHMgPj0gMDsgLS1zKSB7Ci0gKiAgICAgICAgICAgICAgT0lfSU5UIGJpdHMgPSBiaXRhZGp1c3QgKyBiaXRuZWVkc1tzXTsKLSAqICAgICAgICAgICAgICBiaXRzID0gYml0cyA8IDIgPyAwIDogYml0czsKLSAqICAgICAgICAgICAgICBiaXRzID0gYml0cyA+IDE2ID8gMTYgOiBiaXRzOwotICogICAgICAgICAgICAgIGNvdW50ICs9IGJpdHM7Ci0gKiAgICAgICAgICB9Ci0gKgotICogVGhpcyBsb29wIGNhbiBiZSBvcHRpbWl6ZWQgdG8gcGVyZm9ybSA0IG9wZXJhdGlvbnMgYXQgYSB0aW1lIGFzIGZvbGxvd3M6Ci0gKgotICogQWRqdXN0bWVudCBpcyBjb21wdXRlZCBhcyBhIDcgYml0IHNpZ25lZCB2YWx1ZSBhbmQgYWRkZWQgdG8gdGhlIGJpdG5lZWQuCi0gKgotICogTmVnYXRpdmUgYWxsb2NhdGlvbnMgYXJlIHplcm9lZCBieSBtYXNraW5nLiAobiAmIDB4NDApID4+IDYgcHV0cyB0aGUKLSAqIHNpZ24gYml0IGludG8gYml0IDAsIGFkZGluZyB0aGlzIHRvIDB4N0YgZ2l2ZSB1cyBhIG1hc2sgb2YgMHg4MAotICogZm9yIC12ZSB2YWx1ZXMgYW5kIDB4N0YgZm9yICt2ZSB2YWx1ZXMuCi0gKgotICogbiAmPSAweDdGICsgKG4gJiAweDQwKSA+PiA2KQotICoKLSAqIEFsbG9jYXRpb25zIGdyZWF0ZXIgdGhhbiAxNiBhcmUgdHJ1bmNhdGVkIHRvIDE2LiBBZGp1c3RlZCBhbGxvY2F0aW9ucyBhcmUgaW4KLSAqIHRoZSByYW5nZSAwLi4zMSBzbyB3ZSBrbm93IHRoYXQgYml0IDQgaW5kaWNhdGVzIHZhbHVlcyA+PSAxNi4gV2UgdXNlIHRoaXMgYml0Ci0gKiB0byBjcmVhdGUgYSBtYXNrIHRoYXQgemVyb2VzIGJpdHMgMCAuLiAzIGlmIGJpdCA0IGlzIHNldC4KLSAqCi0gKiBuICY9ICgxNSArIChuID4+IDQpKQotICoKLSAqIEFsbG9jYXRpb25zIG9mIDEgYXJlIGRpc2FsbG93ZWQuIEFkZCBhbmQgc2hpZnQgY3JlYXRlcyBhIG1hc2sgdGhhdAotICogZWxpbWluYXRlcyB0aGUgaWxsZWdhbCB2YWx1ZQotICoKLSAqIG4gJj0gKChuICsgMTQpID4+IDQpIHwgMHgxRQotICoKLSAqIFRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBpbiA4IGJpdHMgd2l0aG91dCBvdmVyZmxvd2luZyBzbyB3ZSBjYW4KLSAqIG9wZXJhdGUgb24gNCB2YWx1ZXMgYXQgb25jZS4KLSAqLwotCi0vKgotICogRW5jb2Rlci9EZWNvZGVyCi0gKgotICogQ29tcHV0ZXMgYWRqdXN0bWVudCArLy0gb2YgYml0bmVlZHMgdG8gZmlsbCBiaXRwb29sIGFuZCByZXR1cm5zIG92ZXJhbGwKLSAqIGFkanVzdG1lbnQgYW5kIGV4Y2VzcyBiaXRzLgotICoKLSAqIEBwYXJhbSBiaXRwb29sICAgVGhlIGJpdHBvb2wgd2UgaGF2ZSB0byB3b3JrIHdpdGhpbgotICoKLSAqIEBwYXJhbSBiaXRuZWVkcyAgQW4gYXJyYXkgb2YgYml0IG5lZWRzIChtb3JlIGFjdHVyYXRlbHkgYWxsb2NhdGlvbgotICogICAgICAgICAgICAgICAgICBwcmlvcml0aXRpZXMpIGZvciBlYWNoIHN1YmJhbmQgYWNyb3NzIGFsbCBibG9ja3MgaW4gdGhlIFNCQwotICogICAgICAgICAgICAgICAgICBmcmFtZQotICoKLSAqIEBwYXJhbSBzdWJiYW5kcyAgVGhlIG51bWJlciBvZiBzdWJiYW5kcyBvdmVyIHdoaWNoIHRoZSBhZGt1c3RtZW50IGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWQuIEZvciBtb25vIGFuZCBkdWFsIG1vZGUgdGhpcyBpcyA0IG9yIDgsIGZvcgotICogICAgICAgICAgICAgICAgICBzdGVyZW8gb3Igam9pbnQgc3RlcmVvIHRoaXMgaXMgOCBvciAxNi4KLSAqCi0gKiBAcGFyYW0gYml0Y291bnQgIEEgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBhZGp1c3RtZW50Ci0gKgotICogQHBhcmFtIGV4Y2VzcyAgICBSZXR1cm5zIHRoZSBleGNlc3MgYml0cyBhZnRlciB0aGUgYWRqdXN0bWVudAotICoKLSAqIEByZXR1cm4gICBUaGUgYWRqdXN0bWVudC4KLSAqLwotT0lfSU5UIGFkanVzdFRvRml0Qml0cG9vbChjb25zdCBPSV9VSU5UIGJpdHBvb2wsIHVpbnQzMl90KiBiaXRuZWVkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfVUlOVCBzdWJiYW5kcywgT0lfVUlOVCBiaXRjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfVUlOVCogZXhjZXNzKSB7Ci0gIE9JX0lOVCBtYXhCaXRhZGp1c3QgPSAwOwotICBPSV9JTlQgYml0YWRqdXN0ID0gKGJpdGNvdW50ID4gYml0cG9vbCkgPyAtOCA6IDg7Ci0gIE9JX0lOVCBjaG9wID0gODsKLQotICAvKgotICAgKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIG9wdGltYWwgYWRqdXN0bWVudCB2YWx1ZS4KLSAgICovCi0gIHdoaWxlICgoYml0Y291bnQgIT0gYml0cG9vbCkgJiYgY2hvcCkgewotICAgIHVpbnQzMl90IHRvdGFsID0gMDsKLSAgICBPSV9VSU5UIGNvdW50OwotICAgIHVpbnQzMl90IGFkanVzdDQ7Ci0gICAgT0lfSU5UIGk7Ci0KLSAgICBhZGp1c3Q0ID0gYml0YWRqdXN0ICYgMHg3RjsKLSAgICBhZGp1c3Q0IHw9IChhZGp1c3Q0IDw8IDgpOwotICAgIGFkanVzdDQgfD0gKGFkanVzdDQgPDwgMTYpOwotCi0gICAgZm9yIChpID0gKHN1YmJhbmRzIC8gNCAtIDEpOyBpID49IDA7IC0taSkgewotICAgICAgdWludDMyX3QgbWFzazsKLSAgICAgIHVpbnQzMl90IG4gPSBiaXRuZWVkc1tpXSArIGFkanVzdDQ7Ci0gICAgICBtYXNrID0gMHg3RjdGN0Y3RiArICgobiAmIDB4NDA0MDQwNDApID4+IDYpOwotICAgICAgbiAmPSBtYXNrOwotICAgICAgbWFzayA9IDB4MEYwRjBGMEYgKyAoKG4gJiAweDEwMTAxMDEwKSA+PiA0KTsKLSAgICAgIG4gJj0gbWFzazsKLSAgICAgIG1hc2sgPSAoKChuICsgMHgwRTBFMEUwRSkgPj4gNCkgfCAweDFFMUUxRTFFKTsKLSAgICAgIG4gJj0gbWFzazsKLSAgICAgIHRvdGFsICs9IG47Ci0gICAgfQotCi0gICAgY291bnQgPSAodG90YWwgJiAweEZGRkYpICsgKHRvdGFsID4+IDE2KTsKLSAgICBjb3VudCA9IChjb3VudCAmIDB4RkYpICsgKGNvdW50ID4+IDgpOwotCi0gICAgY2hvcCA+Pj0gMTsKLSAgICBpZiAoY291bnQgPiBiaXRwb29sKSB7Ci0gICAgICBiaXRhZGp1c3QgLT0gY2hvcDsKLSAgICB9IGVsc2UgewotICAgICAgbWF4Qml0YWRqdXN0ID0gYml0YWRqdXN0OwotICAgICAgYml0Y291bnQgPSBjb3VudDsKLSAgICAgIGJpdGFkanVzdCArPSBjaG9wOwotICAgIH0KLSAgfQotCi0gICpleGNlc3MgPSBiaXRwb29sIC0gYml0Y291bnQ7Ci0KLSAgcmV0dXJuIG1heEJpdGFkanVzdDsKLX0KLQotLyoKLSAqIFRoZSBiaXQgYWxsb2NhdG9yIHRyeXMgdG8gYXZvaWQgc2luZ2xlIGJpdCBhbGxvY2F0aW9ucyBleGNlcHQgYXMgYSBsYXN0Ci0gKiByZXNvcnQuIFNvIGluIHRoZSBjYXNlIHdoZXJlIGEgYml0bmVlZCBvZiAxIHdhcyBwYXNzZWQgb3ZlciBkdXJpbmcgdGhlCi0gKiBhZHNqdXN0bWVudCBwaGFzZSAyIGJpdHMgYXJlIG5vdyBhbGxvY2F0ZWQuCi0gKi8KLUlOTElORSBPSV9JTlQgYWxsb2NBZGp1c3RlZEJpdHModWludDhfdCogZGVzdCwgT0lfSU5UIGJpdHMsIE9JX0lOVCBleGNlc3MpIHsKLSAgaWYgKGJpdHMgPCAxNikgewotICAgIGlmIChiaXRzID4gMSkgewotICAgICAgaWYgKGV4Y2VzcykgewotICAgICAgICArK2JpdHM7Ci0gICAgICAgIC0tZXhjZXNzOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoKGJpdHMgPT0gMSkgJiYgKGV4Y2VzcyA+IDEpKSB7Ci0gICAgICBiaXRzID0gMjsKLSAgICAgIGV4Y2VzcyAtPSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICBiaXRzID0gMDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYml0cyA9IDE2OwotICB9Ci0gICpkZXN0ID0gKHVpbnQ4X3QpYml0czsKLSAgcmV0dXJuIGV4Y2VzczsKLX0KLQotLyoKLSAqIEV4Y2VzcyBiaXRzIG5vdCBhbGxvY2F0ZWQgYnkgYWxsb2NhQWRqdXN0ZWRCaXRzIGFyZSBhbGxvY2F0ZWQgcm91bmQtcm9iaW4uCi0gKi8KLUlOTElORSBPSV9JTlQgYWxsb2NFeGNlc3NCaXRzKHVpbnQ4X3QqIGRlc3QsIE9JX0lOVCBleGNlc3MpIHsKLSAgaWYgKCpkZXN0IDwgMTYpIHsKLSAgICAqZGVzdCArPSAxOwotICAgIHJldHVybiBleGNlc3MgLSAxOwotICB9IGVsc2UgewotICAgIHJldHVybiBleGNlc3M7Ci0gIH0KLX0KLQotdm9pZCBvbmVDaGFubmVsQml0QWxsb2NhdGlvbihPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTkVFRF9VTklPTjEqIGJpdG5lZWRzLCBPSV9VSU5UIGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGJpdGNvdW50KSB7Ci0gIGNvbnN0IHVpbnQ4X3QgbnJvZl9zdWJiYW5kcyA9IGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHM7Ci0gIE9JX1VJTlQgZXhjZXNzOwotICBPSV9VSU5UIHNiOwotICBPSV9JTlQgYml0YWRqdXN0OwotICB1aW50OF90IFJFU1RSSUNUKiBhbGxvY0JpdHM7Ci0KLSAgewotICAgIE9JX1VJTlQgZXg7Ci0gICAgYml0YWRqdXN0ID0gYWRqdXN0VG9GaXRCaXRwb29sKGNvbW1vbi0+ZnJhbWVJbmZvLmJpdHBvb2wsIGJpdG5lZWRzLT51aW50MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb2Zfc3ViYmFuZHMsIGJpdGNvdW50LCAmZXgpOwotICAgIC8qIFdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIHB1dCBleGNlc3MgaW50byBhIHJlZ2lzdGVyICovCi0gICAgZXhjZXNzID0gZXg7Ci0gIH0KLQotICAvKgotICAgKiBBbGxvY2F0ZSBhZGp1c3RlZCBiaXRzCi0gICAqLwotICBhbGxvY0JpdHMgPSAmY29tbW9uLT5iaXRzLnVpbnQ4W2NoID8gbnJvZl9zdWJiYW5kcyA6IDBdOwotCi0gIHNiID0gMDsKLSAgd2hpbGUgKHNiIDwgbnJvZl9zdWJiYW5kcykgewotICAgIGV4Y2VzcyA9IGFsbG9jQWRqdXN0ZWRCaXRzKCZhbGxvY0JpdHNbc2JdLCBiaXRuZWVkcy0+dWludDhbc2JdICsgYml0YWRqdXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2Vzcyk7Ci0gICAgKytzYjsKLSAgfQotICBzYiA9IDA7Ci0gIHdoaWxlIChleGNlc3MpIHsKLSAgICBleGNlc3MgPSBhbGxvY0V4Y2Vzc0JpdHMoJmFsbG9jQml0c1tzYl0sIGV4Y2Vzcyk7Ci0gICAgKytzYjsKLSAgfQotfQotCi12b2lkIG1vbm9CaXRBbGxvY2F0aW9uKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogY29tbW9uKSB7Ci0gIEJJVE5FRURfVU5JT04xIGJpdG5lZWRzOwotICBPSV9VSU5UIGJpdGNvdW50OwotICBPSV9VSU5UIGJpdHBvb2xQcmVmZXJlbmNlID0gMDsKLQotICBiaXRjb3VudCA9IGNvbXB1dGVCaXRuZWVkKGNvbW1vbiwgYml0bmVlZHMudWludDgsIDAsICZiaXRwb29sUHJlZmVyZW5jZSk7Ci0KLSAgb25lQ2hhbm5lbEJpdEFsbG9jYXRpb24oY29tbW9uLCAmYml0bmVlZHMsIDAsIGJpdGNvdW50KTsKLX0KLQotLyoqCi1AfQotKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2JpdHN0cmVhbS1kZWNvZGUuYyBiL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2JpdHN0cmVhbS1kZWNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZWNkMi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9iaXRzdHJlYW0tZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMyAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi1AZmlsZQotRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgaW5wdXQgYml0c3RyZWFtcy4KLQotQGluZ3JvdXAgY29kZWNfaW50ZXJuYWwKLSovCi0KLS8qKgotQGFkZHRvZ3JvdXAgY29kZWNfaW50ZXJuYWwKLUB7Ci0qLwotCi0jaW5jbHVkZSAib2lfYXNzZXJ0LmgiCi0jaW5jbHVkZSAib2lfYml0c3RyZWFtLmgiCi0jaW5jbHVkZSAib2lfc3RkZGVmcy5oIgotCi1QUklWQVRFIHZvaWQgT0lfQklUU1RSRUFNX1JlYWRJbml0KE9JX0JJVFNUUkVBTSogYnMsIGNvbnN0IE9JX0JZVEUqIGJ1ZmZlcikgewotICBicy0+dmFsdWUgPSAwOwotICBicy0+cHRyLnIgPSBidWZmZXI7Ci0gIGJzLT5iaXRQdHIgPSAzMjsKLX0KLQotUFJJVkFURSB1aW50MzJfdCBPSV9CSVRTVFJFQU1fUmVhZFVJTlQoT0lfQklUU1RSRUFNKiBicywgT0lfVUlOVCBiaXRzKSB7Ci0gIHVpbnQzMl90IHJlc3VsdDsKLQotICBPSV9CSVRTVFJFQU1fUkVBRFVJTlQocmVzdWx0LCBiaXRzLCBicy0+cHRyLnIsIGJzLT52YWx1ZSwgYnMtPmJpdFB0cik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotUFJJVkFURSB1aW50OF90IE9JX0JJVFNUUkVBTV9SZWFkVUlOVDRBbGlnbmVkKE9JX0JJVFNUUkVBTSogYnMpIHsKLSAgdWludDMyX3QgcmVzdWx0OwotCi0gIE9JX0FTU0VSVChicy0+Yml0UHRyIDwgMTYpOwotICBPSV9BU1NFUlQoYnMtPmJpdFB0ciAlIDQgPT0gMCk7Ci0KLSAgaWYgKGJzLT5iaXRQdHIgPT0gOCkgewotICAgIHJlc3VsdCA9IGJzLT52YWx1ZSA8PCA4OwotICAgIGJzLT5iaXRQdHIgPSAxMjsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPSBicy0+dmFsdWUgPDwgMTI7Ci0gICAgYnMtPnZhbHVlID0gKGJzLT52YWx1ZSA8PCA4KSB8ICpicy0+cHRyLnIrKzsKLSAgICBicy0+Yml0UHRyID0gODsKLSAgfQotICByZXN1bHQgPj49IDI4OwotICBPSV9BU1NFUlQocmVzdWx0IDwgKDF1IDw8IDQpKTsKLSAgcmV0dXJuICh1aW50OF90KXJlc3VsdDsKLX0KLQotUFJJVkFURSB1aW50OF90IE9JX0JJVFNUUkVBTV9SZWFkVUlOVDhBbGlnbmVkKE9JX0JJVFNUUkVBTSogYnMpIHsKLSAgdWludDMyX3QgcmVzdWx0OwotICBPSV9BU1NFUlQoYnMtPmJpdFB0ciA9PSA4KTsKLQotICByZXN1bHQgPSBicy0+dmFsdWUgPj4gMTY7Ci0gIGJzLT52YWx1ZSA9IChicy0+dmFsdWUgPDwgOCkgfCAqYnMtPnB0ci5yKys7Ci0KLSAgcmV0dXJuICh1aW50OF90KXJlc3VsdDsKLX0KLQotLyoqCi1AfQotKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2RlY29kZXItb2luYS5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZGVjb2Rlci1vaW5hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTNkMDYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZGVjb2Rlci1vaW5hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDYgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi1AZmlsZQotVGhpcyBmaWxlIGV4cG9zZXMgT0lOQS1zcGVjaWZpYyBpbnRlcmZhY2VzIHRvIGRlY29kZXIgZnVuY3Rpb25zLgotCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLSNpbmNsdWRlIDxvaV9jb2RlY19zYmNfcHJpdmF0ZS5oPgotCi1PSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0RlY29kZXJDb25maWd1cmVSYXcoCi0gICAgT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwgT0lfQk9PTCBlbmhhbmNlZCwgdWludDhfdCBmcmVxdWVuY3ksCi0gICAgdWludDhfdCBtb2RlLCB1aW50OF90IHN1YmJhbmRzLCB1aW50OF90IGJsb2NrcywgdWludDhfdCBhbGxvYywKLSAgICB1aW50OF90IG1heEJpdHBvb2wpIHsKLSAgaWYgKGZyZXF1ZW5jeSA+IFNCQ19GUkVRXzQ4MDAwKSB7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLQotICBpZiAoZW5oYW5jZWQpIHsKLSNpZmRlZiBTQkNfRU5IQU5DRUQKLSAgICBpZiAoc3ViYmFuZHMgIT0gU0JDX1NVQkJBTkRTXzgpIHsKLSAgICAgIHJldHVybiBPSV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgIH0KLSNlbHNlCi0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0jZW5kaWYKLSAgfQotCi0gIGlmIChtb2RlID4gU0JDX0pPSU5UX1NURVJFTykgewotICAgIHJldHVybiBPSV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTOwotICB9Ci0KLSAgaWYgKHN1YmJhbmRzID4gU0JDX1NVQkJBTkRTXzgpIHsKLSAgICByZXR1cm4gT0lfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgfQotCi0gIGlmIChibG9ja3MgPiBTQkNfQkxPQ0tTXzE2KSB7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLQotICBpZiAoYWxsb2MgPiBTQkNfU05SKSB7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLQotI2lmZGVmIFNCQ19FTkhBTkNFRAotICBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmVuaGFuY2VkID0gZW5oYW5jZWQ7Ci0jZWxzZQotICBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmVuaGFuY2VkID0gRkFMU0U7Ci0jZW5kaWYKLSAgY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5mcmVxSW5kZXggPSBmcmVxdWVuY3k7Ci0gIGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8ubW9kZSA9IG1vZGU7Ci0gIGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8uc3ViYmFuZHMgPSBzdWJiYW5kczsKLSAgY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5ibG9ja3MgPSBibG9ja3M7Ci0gIGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8uYWxsb2MgPSBhbGxvYzsKLSAgY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5iaXRwb29sID0gbWF4Qml0cG9vbDsKLQotICBPSV9TQkNfRXhwYW5kRnJhbWVGaWVsZHMoJmNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8pOwotCi0gIGlmIChjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2ZfY2hhbm5lbHMgPj0gY29udGV4dC0+Y29tbW9uLnBjbVN0cmlkZSkgewotICAgIHJldHVybiBPSV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTOwotICB9Ci0KLSAgcmV0dXJuIE9JX09LOwotfQotCi1PSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0RlY29kZVJhdyhPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRwb29sLCBjb25zdCBPSV9CWVRFKiogZnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZyYW1lQnl0ZXMsIGludDE2X3QqIHBjbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcGNtQnl0ZXMpIHsKLSAgcmV0dXJuIGludGVybmFsX0RlY29kZVJhdyhjb250ZXh0LCBiaXRwb29sLCBmcmFtZURhdGEsIGZyYW1lQnl0ZXMsIHBjbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtQnl0ZXMpOwotfQotCi1PSV9TVEFUVVMgT0lfQ09ERUNfU0JDX0RlY29kZXJMaW1pdChPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfQk9PTCBlbmhhbmNlZCwgdWludDhfdCBzdWJiYW5kcykgewotICBpZiAoZW5oYW5jZWQpIHsKLSNpZmRlZiBTQkNfRU5IQU5DRUQKLSAgICBjb250ZXh0LT5lbmhhbmNlZEVuYWJsZWQgPSBUUlVFOwotI2Vsc2UKLSAgICBjb250ZXh0LT5lbmhhbmNlZEVuYWJsZWQgPSBGQUxTRTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGNvbnRleHQtPmVuaGFuY2VkRW5hYmxlZCA9IEZBTFNFOwotICB9Ci0gIGNvbnRleHQtPnJlc3RyaWN0U3ViYmFuZHMgPSBzdWJiYW5kczsKLSAgY29udGV4dC0+bGltaXRGcmFtZUZvcm1hdCA9IFRSVUU7Ci0gIHJldHVybiBPSV9PSzsKLX0KLQotLyoqCi1AfQotKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2RlY29kZXItcHJpdmF0ZS5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZGVjb2Rlci1wcml2YXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYThlOTYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZGVjb2Rlci1wcml2YXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotQGZpbGUKLVRoaXMgZmlsZSBkcml2ZXMgU0JDIGRlY29kaW5nLgotCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9pX2JpdHN0cmVhbS5oIgotI2luY2x1ZGUgIm9pX2NvZGVjX3NiY19wcml2YXRlLmgiCi0KLU9JX0NIQVIqIGNvbnN0IE9JX0NvZGVjX0NvcHlyaWdodCA9Ci0gICAgIkNvcHlyaWdodCAyMDAyLTIwMDcgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzICIKLSAgICAicmVzZXJ2ZWQiOwotCi1JTkxJTkUgT0lfU1RBVFVTIGludGVybmFsX0RlY29kZXJSZXNldChPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlY29kZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVjb2RlckRhdGFCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JZVEUgbWF4Q2hhbm5lbHMsIE9JX0JZVEUgcGNtU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfQk9PTCBlbmhhbmNlZCkgewotICBPSV9VSU5UIGk7Ci0gIE9JX1NUQVRVUyBzdGF0dXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZigqY29udGV4dCk7IGkrKykgewotICAgICgoY2hhciopY29udGV4dClbaV0gPSAwOwotICB9Ci0KLSNpZmRlZiBTQkNfRU5IQU5DRUQKLSAgY29udGV4dC0+ZW5oYW5jZWRFbmFibGVkID0gZW5oYW5jZWQgPyBUUlVFIDogRkFMU0U7Ci0jZWxzZQotICBjb250ZXh0LT5lbmhhbmNlZEVuYWJsZWQgPSBGQUxTRTsKLSAgaWYgKGVuaGFuY2VkKSB7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLSNlbmRpZgotCi0gIHN0YXR1cyA9IE9JX0NPREVDX1NCQ19BbGxvYygmY29udGV4dC0+Y29tbW9uLCBkZWNvZGVyRGF0YSwgZGVjb2RlckRhdGFCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENoYW5uZWxzLCBwY21TdHJpZGUpOwotCi0gIGlmICghT0lfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIGNvbnRleHQtPmNvbW1vbi5jb2RlY0luZm8gPSBPSV9Db2RlY19Db3B5cmlnaHQ7Ci0gIGNvbnRleHQtPmNvbW1vbi5tYXhCaXRuZWVkID0gMDsKLSAgY29udGV4dC0+bGltaXRGcmFtZUZvcm1hdCA9IEZBTFNFOwotICBPSV9TQkNfRXhwYW5kRnJhbWVGaWVsZHMoJmNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8pOwotCi0gIC8qUExBVEZPUk1fREVDT0RFUl9SRVNFVChjb250ZXh0KTsqLwotCi0gIHJldHVybiBPSV9PSzsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBTQkMgaGVhZGVyIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBqb2ludCBzdGVyZW8gbWFzay4gVGhlCi0gKiBzeW5jd29yZCBoYXMgYWxyZWFkeSBiZWVuIGV4YW1pbmVkLCBhbmQgdGhlIGVuaGFuY2VkIG1vZGUgZmxhZyBzZXQsIGJ5Ci0gKiBGaW5kU3luY3dvcmQuCi0gKi8KLUlOTElORSB2b2lkIE9JX1NCQ19SZWFkSGVhZGVyKE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCogY29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfQllURSogZGF0YSkgewotICBPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUgPSAmY29tbW9uLT5mcmFtZUluZm87Ci0gIHVpbnQ4X3QgZDE7Ci0KLSAgT0lfQVNTRVJUKGRhdGFbMF0gPT0gT0lfU0JDX1NZTkNXT1JEIHx8IGRhdGFbMF0gPT0gT0lfU0JDX0VOSEFOQ0VEX1NZTkNXT1JEKTsKLQotICAvKiBBdm9pZCBmaWxsaW5nIG91dCBhbGwgdGhlc2Ugc3RydWN1dHVyZXMgaWYgd2UgYWxyZWFkeSByZW1lbWJlciB0aGUgdmFsdWVzCi0gICAqIGZyb20gbGFzdCB0aW1lLiBKdXN0IGluIGNhc2Ugd2UgZ2V0IGEgc3RyZWFtIGNvcnJlc3BvbmRpbmcgdG8gZGF0YVsxXSA9PQotICAgKiAwLCBEZWNvZGVyUmVzZXQgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoZSBsb29rdXAgdGFibGUgZW50cmllcyBoYXZlCi0gICAqIGFscmVhZHkgYmVlbiBwb3B1bGF0ZWQKLSAgICovCi0gIGQxID0gZGF0YVsxXTsKLSAgaWYgKGQxICE9IGZyYW1lLT5jYWNoZWRJbmZvKSB7Ci0gICAgZnJhbWUtPmZyZXFJbmRleCA9IChkMSAmIChCSVQ3IHwgQklUNikpID4+IDY7Ci0gICAgZnJhbWUtPmZyZXF1ZW5jeSA9IGZyZXFfdmFsdWVzW2ZyYW1lLT5mcmVxSW5kZXhdOwotCi0gICAgZnJhbWUtPmJsb2NrcyA9IChkMSAmIChCSVQ1IHwgQklUNCkpID4+IDQ7Ci0gICAgZnJhbWUtPm5yb2ZfYmxvY2tzID0gYmxvY2tfdmFsdWVzW2ZyYW1lLT5ibG9ja3NdOwotCi0gICAgZnJhbWUtPm1vZGUgPSAoZDEgJiAoQklUMyB8IEJJVDIpKSA+PiAyOwotICAgIGZyYW1lLT5ucm9mX2NoYW5uZWxzID0gY2hhbm5lbF92YWx1ZXNbZnJhbWUtPm1vZGVdOwotCi0gICAgZnJhbWUtPmFsbG9jID0gKGQxICYgQklUMSkgPj4gMTsKLQotICAgIGZyYW1lLT5zdWJiYW5kcyA9IChkMSAmIEJJVDApOwotICAgIGZyYW1lLT5ucm9mX3N1YmJhbmRzID0gYmFuZF92YWx1ZXNbZnJhbWUtPnN1YmJhbmRzXTsKLQotICAgIGZyYW1lLT5jYWNoZWRJbmZvID0gZDE7Ci0gIH0KLSAgLyoKLSAgICogRm9yIGRlY29kZSwgdGhlIGJpdCBhbGxvY2F0b3IgbmVlZHMgdG8ga25vdyB0aGUgYml0cG9vbCB2YWx1ZQotICAgKi8KLSAgZnJhbWUtPmJpdHBvb2wgPSBkYXRhWzJdOwotICBmcmFtZS0+Y3JjID0gZGF0YVszXTsKLX0KLQotI2RlZmluZSBMT1coeCkgKCh4KSYweGYpCi0jZGVmaW5lIEhJR0goeCkgKCh4KSA+PiA0KQotCi0vKgotICogUmVhZCBzY2FsZWZhY3RvciB2YWx1ZXMgYW5kIHByZXBhcmUgdGhlIGJpdHN0cmVhbSBmb3IgT0lfU0JDX1JlYWRTYW1wbGVzCi0gKi8KLVBSSVZBVEUgdm9pZCBPSV9TQkNfUmVhZFNjYWxlZmFjdG9ycyhPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPSV9CWVRFKiBiLCBPSV9CSVRTVFJFQU0qIGJzKSB7Ci0gIE9JX1VJTlQgaSA9IGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHMgKiBjb21tb24tPmZyYW1lSW5mby5ucm9mX2NoYW5uZWxzOwotICBpbnQ4X3QqIHNjYWxlX2ZhY3RvciA9IGNvbW1vbi0+c2NhbGVfZmFjdG9yOwotICBPSV9VSU5UIGY7Ci0KLSAgaWYgKGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHMgPT0gOCB8fAotICAgICAgY29tbW9uLT5mcmFtZUluZm8ubW9kZSAhPSBTQkNfSk9JTlRfU1RFUkVPKSB7Ci0gICAgaWYgKGNvbW1vbi0+ZnJhbWVJbmZvLm1vZGUgPT0gU0JDX0pPSU5UX1NURVJFTykgewotICAgICAgY29tbW9uLT5mcmFtZUluZm8uam9pbiA9ICpiKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbW1vbi0+ZnJhbWVJbmZvLmpvaW4gPSAwOwotICAgIH0KLSAgICBpIC89IDI7Ci0gICAgZG8gewotICAgICAgKnNjYWxlX2ZhY3RvcisrID0gSElHSChmID0gKmIrKyk7Ci0gICAgICAqc2NhbGVfZmFjdG9yKysgPSBMT1coZik7Ci0gICAgfSB3aGlsZSAoLS1pKTsKLSAgICAvKgotICAgICAqIEluIHRoaXMgY2FzZSB3ZSBrbm93IHRoYXQgdGhlIHNjYWxlIGZhY3RvcnMgZW5kIG9uIGEgYnl0ZSBib3VuZGFyeSBzbyBhbGwKLSAgICAgKiB3ZSBuZWVkIHRvIGRvCi0gICAgICogaXMgaW5pdGlhbGl6ZSB0aGUgYml0c3RyZWFtLgotICAgICAqLwotICAgIE9JX0JJVFNUUkVBTV9SZWFkSW5pdChicywgYik7Ci0gIH0gZWxzZSB7Ci0gICAgT0lfQVNTRVJUKGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHMgPT0gNCAmJgotICAgICAgICAgICAgICBjb21tb24tPmZyYW1lSW5mby5tb2RlID09IFNCQ19KT0lOVF9TVEVSRU8pOwotICAgIGNvbW1vbi0+ZnJhbWVJbmZvLmpvaW4gPSBISUdIKGYgPSAqYisrKTsKLSAgICBpID0gKGkgLSAxKSAvIDI7Ci0gICAgZG8gewotICAgICAgKnNjYWxlX2ZhY3RvcisrID0gTE9XKGYpOwotICAgICAgKnNjYWxlX2ZhY3RvcisrID0gSElHSChmID0gKmIrKyk7Ci0gICAgfSB3aGlsZSAoLS1pKTsKLSAgICAqc2NhbGVfZmFjdG9yKysgPSBMT1coZik7Ci0gICAgLyoKLSAgICAgKiBJbiA0LXN1YmJhbmQgam9pbnQgc3RlcmVvIG1vZGUsIHRoZSBqb2ludCBzdGVyZW8gaW5mb3JtYXRpb24gZW5kcyBvbiBhCi0gICAgICogaGFsZi1ieXRlCi0gICAgICogYm91bmRhcnksIHNvIGl0J3MgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgYml0c3RyZWFtIGFic3RyYWN0aW9uIHRvIHJlYWQgaXQsCi0gICAgICogc2luY2UKLSAgICAgKiBPSV9TQkNfUmVhZFNhbXBsZXMgd2lsbCBuZWVkIHRvIHBpY2sgdXAgaW4gbWlkLWJ5dGUuCi0gICAgICovCi0gICAgT0lfQklUU1RSRUFNX1JlYWRJbml0KGJzLCBiKTsKLSAgICAqc2NhbGVfZmFjdG9yKysgPSBPSV9CSVRTVFJFQU1fUmVhZFVJTlQ0QWxpZ25lZChicyk7Ci0gIH0KLX0KLQotLyoqIFJlYWQgcXVhbnRpemVkIHN1YmJhbmQgc2FtcGxlcyBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0gYW5kIGV4cGFuZCB0aGVtLiAqLwotUFJJVkFURSB2b2lkIE9JX1NCQ19SZWFkU2FtcGxlcyhPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9CSVRTVFJFQU0qIGdsb2JhbF9icykgewotICBPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbiA9ICZjb250ZXh0LT5jb21tb247Ci0gIE9JX1VJTlQgbnJvZl9ibG9ja3MgPSBjb21tb24tPmZyYW1lSW5mby5ucm9mX2Jsb2NrczsKLSAgaW50MzJfdCogUkVTVFJJQ1QgcyA9IGNvbW1vbi0+c3ViZGF0YTsKLSAgY29uc3QgdWludDhfdCogcHRyID0gZ2xvYmFsX2JzLT5wdHIucjsKLSAgdWludDMyX3QgdmFsdWUgPSBnbG9iYWxfYnMtPnZhbHVlOwotICBPSV9VSU5UIGJpdFB0ciA9IGdsb2JhbF9icy0+Yml0UHRyOwotICBjb25zdCBPSV9VSU5UIGl0ZXJfY291bnQgPQotICAgICAgY29tbW9uLT5mcmFtZUluZm8ubnJvZl9jaGFubmVscyAqIGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHM7Ci0gIGRvIHsKLSAgICBPSV9VSU5UIG47Ci0gICAgZm9yIChuID0gMDsgbiA8IGl0ZXJfY291bnQ7ICsrbikgewotICAgICAgaW50MzJfdCBkZXF1YW50OwotICAgICAgT0lfVUlOVCBiaXRzID0gY29tbW9uLT5iaXRzLnVpbnQ4W25dOwotICAgICAgT0lfSU5UIHNmID0gY29tbW9uLT5zY2FsZV9mYWN0b3Jbbl07Ci0gICAgICBpZiAoYml0cykgewotICAgICAgICB1aW50MzJfdCByYXc7Ci0gICAgICAgIE9JX0JJVFNUUkVBTV9SRUFEVUlOVChyYXcsIGJpdHMsIHB0ciwgdmFsdWUsIGJpdFB0cik7Ci0gICAgICAgIGRlcXVhbnQgPSBPSV9TQkNfRGVxdWFudChyYXcsIHNmLCBiaXRzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlcXVhbnQgPSAwOwotICAgICAgfQotICAgICAgKnMrKyA9IGRlcXVhbnQ7Ci0gICAgfQotICB9IHdoaWxlICgtLW5yb2ZfYmxvY2tzKTsKLX0KLQotLyoqCi1AfQotKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2RlY29kZXItc2JjLmMgYi9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9kZWNvZGVyLXNiYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWM1OWQ5Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2RlY29kZXItc2JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDYgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqIEBmaWxlCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqQGFkZHRvZ3JvdXAgY29kZWNfaW50ZXJuYWwgKi8KLS8qKkB7Ki8KLQotI2luY2x1ZGUgIm9pX2JpdHN0cmVhbS5oIgotI2luY2x1ZGUgIm9pX2NvZGVjX3NiY19wcml2YXRlLmgiCi0KLSNkZWZpbmUgU1BFQ0lBTElaRV9SRUFEX1NBTVBMRVNfSk9JTlQKLQotI2lmIF9faGFzX2F0dHJpYnV0ZShmYWxsdGhyb3VnaCkKLSNkZWZpbmUgX19mYWxsdGhyb3VnaCBfX2F0dHJpYnV0ZV9fKChfX2ZhbGx0aHJvdWdoX18pKQotI2Vsc2UKLSNkZWZpbmUgX19mYWxsdGhyb3VnaAotI2VuZGlmCi0KLS8qKgotICogU2NhbnMgdGhyb3VnaCBhIGJ1ZmZlciBsb29raW5nIGZvciBhIGNvZGVjIHN5bmN3b3JkLiBJZiB0aGUgZGVjb2RlciBoYXMgYmVlbgotICogc2V0IGZvciBlbmhhbmNlZCBvcGVyYXRpb24gdXNpbmcgT0lfQ09ERUNfU0JDX0RlY29kZXJSZXNldCgpLCBpdCB3aWxsIHNlYXJjaAotICogZm9yIGJvdGggYSBzdGFuZGFyZCBhbmQgYW4gZW5oYW5jZWQgc3luY3dvcmQuCi0gKi8KLVBSSVZBVEUgT0lfU1RBVFVTIEZpbmRTeW5jd29yZChPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9JX0JZVEUqKiBmcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZyYW1lQnl0ZXMpIHsKLSNpZmRlZiBTQkNfRU5IQU5DRUQKLSAgT0lfQllURSBzZWFyY2gxID0gT0lfU0JDX1NZTkNXT1JEOwotICBPSV9CWVRFIHNlYXJjaDIgPSBPSV9TQkNfRU5IQU5DRURfU1lOQ1dPUkQ7Ci0jZW5kaWYgIC8vIFNCQ19FTkhBTkNFRAotCi0gIGlmICgqZnJhbWVCeXRlcyA9PSAwKSB7Ci0gICAgcmV0dXJuIE9JX0NPREVDX1NCQ19OT1RfRU5PVUdIX0hFQURFUl9EQVRBOwotICB9Ci0KLSNpZmRlZiBTQkNfRU5IQU5DRUQKLSAgaWYgKGNvbnRleHQtPmxpbWl0RnJhbWVGb3JtYXQgJiYgY29udGV4dC0+ZW5oYW5jZWRFbmFibGVkKSB7Ci0gICAgLyogSWYgdGhlIGNvbnRleHQgaXMgcmVzdHJpY3RlZCwgb25seSBzZWFyY2ggZm9yIHNwZWNpZmllZCBTWU5DV09SRCAqLwotICAgIHNlYXJjaDEgPSBzZWFyY2gyOwotICB9IGVsc2UgaWYgKGNvbnRleHQtPmVuaGFuY2VkRW5hYmxlZCA9PSBGQUxTRSkgewotICAgIC8qIElmIGVuaGFuY2VkIGlzIG5vdCBlbmFibGVkLCBvbmx5IHNlYXJjaCBmb3IgY2xhc3NpYyBTQkMgU1lOQ1dPUkQqLwotICAgIHNlYXJjaDIgPSBzZWFyY2gxOwotICB9Ci0gIHdoaWxlICgqZnJhbWVCeXRlcyAmJiAoKipmcmFtZURhdGEgIT0gc2VhcmNoMSkgJiYgKCoqZnJhbWVEYXRhICE9IHNlYXJjaDIpKSB7Ci0gICAgKCpmcmFtZUJ5dGVzKS0tOwotICAgICgqZnJhbWVEYXRhKSsrOwotICB9Ci0gIGlmICgqZnJhbWVCeXRlcykgewotICAgIC8qIFN5bmN3b3JkIGZvdW5kLCAqZnJhbWVEYXRhIHBvaW50cyB0byBpdCwgYW5kICpmcmFtZUJ5dGVzIGNvcnJlY3RseQotICAgICAqIHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIHJlYWQsIGluY2x1ZGluZyB0aGUKLSAgICAgKiBzeW5jd29yZC4gKi8KLSAgICBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmVuaGFuY2VkID0KLSAgICAgICAgKCoqZnJhbWVEYXRhID09IE9JX1NCQ19FTkhBTkNFRF9TWU5DV09SRCk7Ci0gICAgcmV0dXJuIE9JX09LOwotICB9IGVsc2UgewotICAgIC8qIE5vIHN5bmN3b3JkIHdhcyBmb3VuZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4KLSAgICAgKiAqZnJhbWVEYXRhIHBvaW50cyBwYXN0IHRoZSBlbmQgb2YgdGhlIG9yaWdpbmFsIGlucHV0LCBhbmQKLSAgICAgKiAqZnJhbWVCeXRlcyBpcyAwLiAqLwotICAgIHJldHVybiBPSV9DT0RFQ19TQkNfTk9fU1lOQ1dPUkQ7Ci0gIH0KLSNlbHNlICAgLy8gU0JDX0VOSEFOQ0VECi0gIHdoaWxlICgqZnJhbWVCeXRlcyAmJiAoKipmcmFtZURhdGEgIT0gT0lfU0JDX1NZTkNXT1JEKSkgewotICAgICgqZnJhbWVCeXRlcyktLTsKLSAgICAoKmZyYW1lRGF0YSkrKzsKLSAgfQotICBpZiAoKmZyYW1lQnl0ZXMpIHsKLSAgICAvKiBTeW5jd29yZCBmb3VuZCwgKmZyYW1lRGF0YSBwb2ludHMgdG8gaXQsIGFuZCAqZnJhbWVCeXRlcyBjb3JyZWN0bHkKLSAgICAgKiByZWZsZWN0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byByZWFkLCBpbmNsdWRpbmcgdGhlCi0gICAgICogc3luY3dvcmQuICovCi0gICAgY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5lbmhhbmNlZCA9IEZBTFNFOwotICAgIHJldHVybiBPSV9PSzsKLSAgfSBlbHNlIHsKLSAgICAvKiBObyBzeW5jd29yZCB3YXMgZm91bmQgYW55d2hlcmUgaW4gdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuCi0gICAgICogKmZyYW1lRGF0YSBwb2ludHMgcGFzdCB0aGUgZW5kIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgYW5kCi0gICAgICogKmZyYW1lQnl0ZXMgaXMgMC4gKi8KLSAgICByZXR1cm4gT0lfQ09ERUNfU0JDX05PX1NZTkNXT1JEOwotICB9Ci0jZW5kaWYgIC8vIFNCQ19FTkhBTkNFRAotfQotCi1zdGF0aWMgT0lfU1RBVFVTIERlY29kZUJvZHkoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPSV9CWVRFKiBib2R5RGF0YSwgaW50MTZfdCogcGNtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcGNtQnl0ZXMsIE9JX0JPT0wgYWxsb3dQYXJ0aWFsKSB7Ci0gIE9JX0JJVFNUUkVBTSBiczsKLSAgT0lfVUlOVCBmcmFtZVNhbXBsZXMgPSBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2ZfYmxvY2tzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHM7Ci0gIE9JX1VJTlQgZGVjb2RlX2Jsb2NrX2NvdW50OwotCi0gIC8qCi0gICAqIEJhc2VkIG9uIHRoZSBoZWFkZXIgZGF0YSwgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gd3JpdGUgdGhlCi0gICAqIG91dHB1dCBzYW1wbGVzLgotICAgKi8KLSAgaWYgKCpwY21CeXRlcyA8Ci0gICAgICAgICAgKHNpemVvZihpbnQxNl90KSAqIGZyYW1lU2FtcGxlcyAqIGNvbnRleHQtPmNvbW1vbi5wY21TdHJpZGUpICYmCi0gICAgICAhYWxsb3dQYXJ0aWFsKSB7Ci0gICAgLyogSWYgd2UncmUgbm90IGFsbG93aW5nIHBhcnRpYWwgZGVjb2Rlcywgd2UgbmVlZCByb29tIGZvciB0aGUgZW50aXJlCi0gICAgICogY29kZWMgZnJhbWUgKi8KLSAgICBUUkFDRSgoIi1PSV9DT0RFQ19TQkNfRGVjb2RlOiBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9BVURJT19EQVRBIikpOwotICAgIHJldHVybiBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9BVURJT19EQVRBOwotICB9IGVsc2UgaWYgKCpwY21CeXRlcyA8IHNpemVvZihpbnQxNl90KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8ubnJvZl9zdWJiYW5kcyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5wY21TdHJpZGUpIHsKLSAgICAvKiBFdmVuIGlmIHdlJ3JlIGFsbG93aW5nIHBhcnRpYWxzLCB3ZSBjYW4gc3RpbGwgb25seSBkZWNvZGUgb24gYSBmcmFtZQotICAgICAqIGJvdW5kYXJ5ICovCi0gICAgcmV0dXJuIE9JX0NPREVDX1NCQ19OT1RfRU5PVUdIX0FVRElPX0RBVEE7Ci0gIH0KLQotICBpZiAoY29udGV4dC0+YnVmZmVyZWRCbG9ja3MgPT0gMCkgewotICAgIFRSQUNFKCgiUmVhZGluZyBzY2FsZWZhY3RvcnMiKSk7Ci0gICAgT0lfU0JDX1JlYWRTY2FsZWZhY3RvcnMoJmNvbnRleHQtPmNvbW1vbiwgYm9keURhdGEsICZicyk7Ci0KLSAgICBUUkFDRSgoIkNvbXB1dGluZyBiaXQgYWxsb2NhdGlvbiIpKTsKLSAgICBPSV9TQkNfQ29tcHV0ZUJpdEFsbG9jYXRpb24oJmNvbnRleHQtPmNvbW1vbik7Ci0KLSAgICBUUkFDRSgoIlJlYWRpbmcgc2FtcGxlcyIpKTsKLSAgICBpZiAoY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5tb2RlID09IFNCQ19KT0lOVF9TVEVSRU8pIHsKLSAgICAgIE9JX1NCQ19SZWFkU2FtcGxlc0pvaW50KGNvbnRleHQsICZicyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIE9JX1NCQ19SZWFkU2FtcGxlcyhjb250ZXh0LCAmYnMpOwotICAgIH0KLQotICAgIGNvbnRleHQtPmJ1ZmZlcmVkQmxvY2tzID0gY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5ucm9mX2Jsb2NrczsKLSAgfQotCi0gIGlmIChhbGxvd1BhcnRpYWwpIHsKLSAgICBkZWNvZGVfYmxvY2tfY291bnQgPSAqcGNtQnl0ZXMgLyBzaXplb2YoaW50MTZfdCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5wY21TdHJpZGUgLwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8ubnJvZl9zdWJiYW5kczsKLQotICAgIGlmIChkZWNvZGVfYmxvY2tfY291bnQgPiBjb250ZXh0LT5idWZmZXJlZEJsb2NrcykgewotICAgICAgZGVjb2RlX2Jsb2NrX2NvdW50ID0gY29udGV4dC0+YnVmZmVyZWRCbG9ja3M7Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgZGVjb2RlX2Jsb2NrX2NvdW50ID0gY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5ucm9mX2Jsb2NrczsKLSAgfQotCi0gIFRSQUNFKCgiU3ludGhlc2l6aW5nIGZyYW1lIikpOwotICB7Ci0gICAgT0lfVUlOVCBzdGFydF9ibG9jayA9Ci0gICAgICAgIGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8ubnJvZl9ibG9ja3MgLSBjb250ZXh0LT5idWZmZXJlZEJsb2NrczsKLSAgICBPSV9TQkNfU3ludGhGcmFtZShjb250ZXh0LCBwY21EYXRhLCBzdGFydF9ibG9jaywgZGVjb2RlX2Jsb2NrX2NvdW50KTsKLSAgfQotCi0gIE9JX0FTU0VSVChjb250ZXh0LT5idWZmZXJlZEJsb2NrcyA+PSBkZWNvZGVfYmxvY2tfY291bnQpOwotICBjb250ZXh0LT5idWZmZXJlZEJsb2NrcyAtPSBkZWNvZGVfYmxvY2tfY291bnQ7Ci0KLSAgZnJhbWVTYW1wbGVzID0gZGVjb2RlX2Jsb2NrX2NvdW50ICogY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5ucm9mX3N1YmJhbmRzOwotCi0gIC8qCi0gICAqIFdoZW4gZGVjb2RpbmcgbW9ubyBpbnRvIGEgc3RyaWRlLTIgYXJyYXksIGNvcHkgcGNtIGRhdGEgdG8gc2Vjb25kIGNoYW5uZWwKLSAgICovCi0gIGlmIChjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2ZfY2hhbm5lbHMgPT0gMSAmJgotICAgICAgY29udGV4dC0+Y29tbW9uLnBjbVN0cmlkZSA9PSAyKSB7Ci0gICAgT0lfVUlOVCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZVNhbXBsZXM7ICsraSkgewotICAgICAgcGNtRGF0YVsyICogaSArIDFdID0gcGNtRGF0YVsyICogaV07Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJuIG51bWJlciBvZiBwY20gYnl0ZXMgZ2VuZXJhdGVkIGJ5IHRoZSBkZWNvZGUgb3BlcmF0aW9uLgotICAgKi8KLSAgKnBjbUJ5dGVzID0gZnJhbWVTYW1wbGVzICogc2l6ZW9mKGludDE2X3QpICogY29udGV4dC0+Y29tbW9uLnBjbVN0cmlkZTsKLSAgaWYgKGNvbnRleHQtPmJ1ZmZlcmVkQmxvY2tzID4gMCkgewotICAgIHJldHVybiBPSV9DT0RFQ19TQkNfUEFSVElBTF9ERUNPREU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE9JX09LOwotICB9Ci19Ci0KLVBSSVZBVEUgT0lfU1RBVFVTIGludGVybmFsX0RlY29kZVJhdyhPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0cG9vbCwgY29uc3QgT0lfQllURSoqIGZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZnJhbWVCeXRlcywgaW50MTZfdCogcGNtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcGNtQnl0ZXMpIHsKLSAgT0lfU1RBVFVTIHN0YXR1czsKLSAgT0lfVUlOVCBib2R5TGVuOwotCi0gIFRSQUNFKCgiK09JX0NPREVDX1NCQ19EZWNvZGVSYXciKSk7Ci0KLSAgaWYgKGNvbnRleHQtPmJ1ZmZlcmVkQmxvY2tzID09IDApIHsKLSAgICAvKgotICAgICAqIFRoZSBiaXRhbGxvY2F0b3IgbmVlZHMgdG8ga25vdyB0aGUgYml0cG9vbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmJpdHBvb2wgPSBiaXRwb29sOwotICAgIC8qCi0gICAgICogQ29tcHV0ZSB0aGUgZnJhbWUgbGVuZ3RoIGFuZCBjaGVjayB3ZSBoYXZlIGVub3VnaCBmcmFtZSBkYXRhIHRvIHByb2NlZWQKLSAgICAgKi8KLSAgICBib2R5TGVuID0gT0lfQ09ERUNfU0JDX0NhbGN1bGF0ZUZyYW1lbGVuKCZjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvKSAtCi0gICAgICAgICAgICAgIFNCQ19IRUFERVJfTEVOOwotICAgIGlmICgqZnJhbWVCeXRlcyA8IGJvZHlMZW4pIHsKLSAgICAgIFRSQUNFKCgiLU9JX0NPREVDX1NCQ19EZWNvZGU6IE9JX0NPREVDX1NCQ19OT1RfRU5PVUdIX0JPRFlfREFUQSIpKTsKLSAgICAgIHJldHVybiBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9CT0RZX0RBVEE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGJvZHlMZW4gPSAwOwotICB9Ci0gIC8qCi0gICAqIERlY29kZSB0aGUgU0JDIGRhdGEuIFBhc3MgVFJVRSB0byBEZWNvZGVCb2R5IHRvIGFsbG93IHBhcnRpYWwgZGVjb2Rpbmcgb2YKLSAgICogdG9uZXMuCi0gICAqLwotICBzdGF0dXMgPSBEZWNvZGVCb2R5KGNvbnRleHQsICpmcmFtZURhdGEsIHBjbURhdGEsIHBjbUJ5dGVzLCBUUlVFKTsKLSAgaWYgKE9JX1NVQ0NFU1Moc3RhdHVzKSB8fCBzdGF0dXMgPT0gT0lfQ09ERUNfU0JDX1BBUlRJQUxfREVDT0RFKSB7Ci0gICAgKmZyYW1lRGF0YSArPSBib2R5TGVuOwotICAgICpmcmFtZUJ5dGVzIC09IGJvZHlMZW47Ci0gIH0KLSAgVFJBQ0UoKCItT0lfQ09ERUNfU0JDX0RlY29kZVJhdzogJWQiLCBzdGF0dXMpKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotT0lfU1RBVFVTIE9JX0NPREVDX1NCQ19EZWNvZGVyUmVzZXQoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZWNvZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlY29kZXJEYXRhQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heENoYW5uZWxzLCB1aW50OF90IHBjbVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JPT0wgZW5oYW5jZWQpIHsKLSAgcmV0dXJuIGludGVybmFsX0RlY29kZXJSZXNldChjb250ZXh0LCBkZWNvZGVyRGF0YSwgZGVjb2RlckRhdGFCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaGFubmVscywgcGNtU3RyaWRlLCBlbmhhbmNlZCk7Ci19Ci0KLU9JX1NUQVRVUyBPSV9DT0RFQ19TQkNfRGVjb2RlRnJhbWUoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT0lfQllURSoqIGZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZyYW1lQnl0ZXMsIGludDE2X3QqIHBjbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwY21CeXRlcykgewotICBPSV9TVEFUVVMgc3RhdHVzOwotICBPSV9VSU5UIGZyYW1lbGVuOwotICB1aW50OF90IGNyYzsKLQotICBUUkFDRSgoIitPSV9DT0RFQ19TQkNfRGVjb2RlRnJhbWUiKSk7Ci0KLSAgVFJBQ0UoKCJGaW5kaW5nIHN5bmN3b3JkIikpOwotICBzdGF0dXMgPSBGaW5kU3luY3dvcmQoY29udGV4dCwgZnJhbWVEYXRhLCBmcmFtZUJ5dGVzKTsKLSAgaWYgKCFPSV9TVUNDRVNTKHN0YXR1cykpIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyogTWFrZSBzdXJlIGVub3VnaCBkYXRhIHJlbWFpbnMgdG8gcmVhZCB0aGUgaGVhZGVyLiAqLwotICBpZiAoKmZyYW1lQnl0ZXMgPCBTQkNfSEVBREVSX0xFTikgewotICAgIFRSQUNFKCgiLU9JX0NPREVDX1NCQ19EZWNvZGVGcmFtZTogT0lfQ09ERUNfU0JDX05PVF9FTk9VR0hfSEVBREVSX0RBVEEiKSk7Ci0gICAgcmV0dXJuIE9JX0NPREVDX1NCQ19OT1RfRU5PVUdIX0hFQURFUl9EQVRBOwotICB9Ci0KLSAgVFJBQ0UoKCJSZWFkaW5nIEhlYWRlciIpKTsKLSAgT0lfU0JDX1JlYWRIZWFkZXIoJmNvbnRleHQtPmNvbW1vbiwgKmZyYW1lRGF0YSk7Ci0KLSAgLyoKLSAgICogU29tZSBpbXBsZW1lbnRhdGlvbnMgbG9hZCB0aGUgZGVjb2RlciBpbnRvIFJBTSBhbmQgdXNlIG92ZXJsYXlzIGZvciA0IHZzIDgKLSAgICogc3ViYmFuZHMuIFdlIG5lZWQKLSAgICogdG8gZW5zdXJlIHRoYXQgdGhlIFNCQyBwYXJhbWV0ZXJzIGZvciB0aGlzIGZyYW1lIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlCi0gICAqIHJlc3RyaWN0aW9ucyBpbXBvc2VkCi0gICAqIGJ5IHRoZSBsb2FkZWQgb3ZlcmxheXMuCi0gICAqLwotICBpZiAoY29udGV4dC0+bGltaXRGcmFtZUZvcm1hdCAmJgotICAgICAgKGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8uc3ViYmFuZHMgIT0gY29udGV4dC0+cmVzdHJpY3RTdWJiYW5kcykpIHsKLSAgICBFUlJPUigoIlNCQyBwYXJhbWV0ZXJzIGluY29tcGF0aWJsZSB3aXRoIGxvYWRlZCBvdmVybGF5IikpOwotICAgIHJldHVybiBPSV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJTOwotICB9Ci0KLSAgaWYgKGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8ubnJvZl9jaGFubmVscyA+IGNvbnRleHQtPmNvbW1vbi5tYXhDaGFubmVscykgewotICAgIEVSUk9SKAotICAgICAgICAoIlNCQyBwYXJhbWV0ZXJzIGluY29tcGF0aWJsZSB3aXRoIG51bWJlciBvZiBjaGFubmVscyBzcGVjaWZpZWQgZHVyaW5nICIKLSAgICAgICAgICJyZXNldCIpKTsKLSAgICByZXR1cm4gT0lfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgfQotCi0gIGlmIChjb250ZXh0LT5jb21tb24ucGNtU3RyaWRlIDwgMSB8fCBjb250ZXh0LT5jb21tb24ucGNtU3RyaWRlID4gMikgewotICAgIEVSUk9SKCgiUENNIHN0cmlkZSBub3Qgc2V0IGNvcnJlY3RseSBkdXJpbmcgcmVzZXQiKSk7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLQotICAvKgotICAgKiBBdCB0aGlzIHBvaW50IGEgaGVhZGVyIGhhcyBiZWVuIHJlYWQuIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCB3ZSBmb3VuZAotICAgKiBhIGZhbHNlIHN5bmN3b3JkLAotICAgKiBzbyB0aGUgaGVhZGVyIGRhdGEgbWlnaHQgYmUgaW52YWxpZC4gTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGJ5dGVzIHRvIHJlYWQKLSAgICogaW4gdGhlCi0gICAqIENSQy1wcm90ZWN0ZWQgaGVhZGVyLCBidXQgZG9uJ3QgcmVxdWlyZSB3ZSBoYXZlIHRoZSB3aG9sZSBmcmFtZS4gVGhhdCB3YXksCi0gICAqIGlmIGl0IHR1cm5zIG91dAotICAgKiB0aGF0IHdlJ3JlIGFjdGluZyBvbiBib2d1cyBoZWFkZXIgZGF0YSwgd2UgZG9uJ3Qgc3RhbGwgdGhlIGRlY29kaW5nIHByb2Nlc3MKLSAgICogYnkgd2FpdGluZyBmb3IKLSAgICogZGF0YSB0aGF0IHdlIGRvbid0IGFjdHVhbGx5IG5lZWQuCi0gICAqLwotICBmcmFtZWxlbiA9IE9JX0NPREVDX1NCQ19DYWxjdWxhdGVGcmFtZWxlbigmY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mbyk7Ci0gIGlmICgqZnJhbWVCeXRlcyA8IGZyYW1lbGVuKSB7Ci0gICAgVFJBQ0UoKCItT0lfQ09ERUNfU0JDX0RlY29kZUZyYW1lOiBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9CT0RZX0RBVEEiKSk7Ci0gICAgcmV0dXJuIE9JX0NPREVDX1NCQ19OT1RfRU5PVUdIX0JPRFlfREFUQTsKLSAgfQotCi0gIFRSQUNFKCgiQ2FsY3VsYXRpbmcgY2hlY2tzdW0iKSk7Ci0KLSAgY3JjID0gT0lfU0JDX0NhbGN1bGF0ZUNoZWNrc3VtKCZjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLCAqZnJhbWVEYXRhKTsKLSAgaWYgKGNyYyAhPSBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmNyYykgewotICAgIFRSQUNFKCgiQ1JDIE1pc21hdGNoOiAgY2FsYz0lMDJ4IHJlYWQ9JTAyeFxuIiwgY3JjLAotICAgICAgICAgICBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmNyYykpOwotICAgIFRSQUNFKCgiLU9JX0NPREVDX1NCQ19EZWNvZGVGcmFtZTogT0lfQ09ERUNfU0JDX0NIRUNLU1VNX01JU01BVENIIikpOwotICAgIHJldHVybiBPSV9DT0RFQ19TQkNfQ0hFQ0tTVU1fTUlTTUFUQ0g7Ci0gIH0KLQotICAvKgotICAgKiBNYWtlIHN1cmUgdGhlIGJpdHBvb2wgdmFsdWVzIGFyZSBzYW5lLgotICAgKi8KLSAgaWYgKChjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLmJpdHBvb2wgPCBTQkNfTUlOX0JJVFBPT0wpICYmCi0gICAgICAhY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5lbmhhbmNlZCkgewotICAgIEVSUk9SKCgiQml0cG9vbCB0b28gc21hbGw6ICVkIChtdXN0IGJlID49IDIpIiwKLSAgICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5iaXRwb29sKSk7Ci0gICAgcmV0dXJuIE9JX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUlM7Ci0gIH0KLSAgaWYgKGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8uYml0cG9vbCA+Ci0gICAgICBPSV9TQkNfTWF4Qml0cG9vbCgmY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mbykpIHsKLSAgICBFUlJPUigoIkJpdHBvb2wgdG9vIGxhcmdlOiAlZCAobXVzdCBiZSA8PSAlbGQpIiwKLSAgICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5iaXRwb29sLAotICAgICAgICAgICBPSV9TQkNfTWF4Qml0cG9vbCgmY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mbykpKTsKLSAgICByZXR1cm4gT0lfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgfQotCi0gIC8qCi0gICAqIE5vdyBkZWNvZGUgdGhlIFNCQyBkYXRhLiBQYXJ0aWFsIGRlY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGZvciBhbiBTQkMKLSAgICogc3RyZWFtLCBzbyBwYXNzIEZBTFNFIHRvIGRlY29kZSBib2R5IHRvIGhhdmUgaXQgZW5mb3JjZSB0aGUgb2xkIHJ1bGUgdGhhdAotICAgKiB5b3UgaGF2ZSB0byBkZWNvZGUgYSB3aG9sZSBwYWNrZXQgYXQgYSB0aW1lLgotICAgKi8KLSAgc3RhdHVzID0gRGVjb2RlQm9keShjb250ZXh0LCAqZnJhbWVEYXRhICsgU0JDX0hFQURFUl9MRU4sIHBjbURhdGEsIHBjbUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKLSAgaWYgKE9JX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgICpmcmFtZURhdGEgKz0gZnJhbWVsZW47Ci0gICAgKmZyYW1lQnl0ZXMgLT0gZnJhbWVsZW47Ci0gIH0KLSAgVFJBQ0UoKCItT0lfQ09ERUNfU0JDX0RlY29kZUZyYW1lOiAlZCIsIHN0YXR1cykpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLU9JX1NUQVRVUyBPSV9DT0RFQ19TQkNfU2tpcEZyYW1lKE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPSV9CWVRFKiogZnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZyYW1lQnl0ZXMpIHsKLSAgT0lfU1RBVFVTIHN0YXR1czsKLSAgT0lfVUlOVCBmcmFtZWxlbjsKLSAgT0lfVUlOVCBoZWFkZXJsZW47Ci0gIHVpbnQ4X3QgY3JjOwotCi0gIHN0YXR1cyA9IEZpbmRTeW5jd29yZChjb250ZXh0LCBmcmFtZURhdGEsIGZyYW1lQnl0ZXMpOwotICBpZiAoIU9JX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgaWYgKCpmcmFtZUJ5dGVzIDwgU0JDX0hFQURFUl9MRU4pIHsKLSAgICByZXR1cm4gT0lfQ09ERUNfU0JDX05PVF9FTk9VR0hfSEVBREVSX0RBVEE7Ci0gIH0KLSAgT0lfU0JDX1JlYWRIZWFkZXIoJmNvbnRleHQtPmNvbW1vbiwgKmZyYW1lRGF0YSk7Ci0gIGZyYW1lbGVuID0KLSAgICAgIE9JX1NCQ19DYWxjdWxhdGVGcmFtZUFuZEhlYWRlcmxlbigmY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mbywgJmhlYWRlcmxlbik7Ci0gIGlmICgqZnJhbWVCeXRlcyA8IGhlYWRlcmxlbikgewotICAgIHJldHVybiBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9IRUFERVJfREFUQTsKLSAgfQotICBjcmMgPSBPSV9TQkNfQ2FsY3VsYXRlQ2hlY2tzdW0oJmNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8sICpmcmFtZURhdGEpOwotICBpZiAoY3JjICE9IGNvbnRleHQtPmNvbW1vbi5mcmFtZUluZm8uY3JjKSB7Ci0gICAgcmV0dXJuIE9JX0NPREVDX1NCQ19DSEVDS1NVTV9NSVNNQVRDSDsKLSAgfQotICBpZiAoKmZyYW1lQnl0ZXMgPCBmcmFtZWxlbikgewotICAgIHJldHVybiBPSV9DT0RFQ19TQkNfTk9UX0VOT1VHSF9CT0RZX0RBVEE7Ci0gIH0KLSAgY29udGV4dC0+YnVmZmVyZWRCbG9ja3MgPSAwOwotICAqZnJhbWVEYXRhICs9IGZyYW1lbGVuOwotICAqZnJhbWVCeXRlcyAtPSBmcmFtZWxlbjsKLSAgcmV0dXJuIE9JX09LOwotfQotCi11aW50OF90IE9JX0NPREVDX1NCQ19GcmFtZUNvdW50KE9JX0JZVEUqIGZyYW1lRGF0YSwgdWludDMyX3QgZnJhbWVCeXRlcykgewotICB1aW50OF90IG1vZGU7Ci0gIHVpbnQ4X3QgYmxvY2tzOwotICB1aW50OF90IHN1YmJhbmRzOwotICB1aW50OF90IGZyYW1lQ291bnQgPSAwOwotICBPSV9VSU5UIGZyYW1lTGVuOwotCi0gIHdoaWxlIChmcmFtZUJ5dGVzKSB7Ci0gICAgd2hpbGUgKGZyYW1lQnl0ZXMgJiYgKChmcmFtZURhdGFbMF0gJiAweEZFKSAhPSAweDlDKSkgewotICAgICAgZnJhbWVEYXRhKys7Ci0gICAgICBmcmFtZUJ5dGVzLS07Ci0gICAgfQotCi0gICAgaWYgKGZyYW1lQnl0ZXMgPCBTQkNfSEVBREVSX0xFTikgewotICAgICAgcmV0dXJuIGZyYW1lQ291bnQ7Ci0gICAgfQotCi0gICAgLyogRXh0cmFjdCBhbmQgdHJhbnNsYXRlIHJlcXVpcmVkIGZpZWxkcyBmcm9tIEhlYWRlciAqLwotICAgIHN1YmJhbmRzID0gbW9kZSA9IGJsb2NrcyA9IGZyYW1lRGF0YVsxXTsKLSAgICA7Ci0gICAgbW9kZSA9IChtb2RlICYgKEJJVDMgfCBCSVQyKSkgPj4gMjsKLSAgICBibG9ja3MgPSBibG9ja192YWx1ZXNbKGJsb2NrcyAmIChCSVQ1IHwgQklUNCkpID4+IDRdOwotICAgIHN1YmJhbmRzID0gYmFuZF92YWx1ZXNbKHN1YmJhbmRzICYgQklUMCldOwotCi0gICAgLyogSW5saW5lIGxvZ2ljIHRvIGF2b2lkIGNvcnJ1cHRpbmcgY29udGV4dCAqLwotICAgIGZyYW1lTGVuID0gYmxvY2tzICogZnJhbWVEYXRhWzJdOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgY2FzZSBTQkNfSk9JTlRfU1RFUkVPOgotICAgICAgICBmcmFtZUxlbiArPSBzdWJiYW5kcyArICg4ICogc3ViYmFuZHMpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTQkNfRFVBTF9DSEFOTkVMOgotICAgICAgICBmcmFtZUxlbiAqPSAyOwotICAgICAgICBfX2ZhbGx0aHJvdWdoOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAobW9kZSA9PSBTQkNfTU9OTykgewotICAgICAgICAgIGZyYW1lTGVuICs9IDQgKiBzdWJiYW5kczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmcmFtZUxlbiArPSA4ICogc3ViYmFuZHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmcmFtZUNvdW50Kys7Ci0gICAgZnJhbWVMZW4gPSBTQkNfSEVBREVSX0xFTiArIChmcmFtZUxlbiArIDcpIC8gODsKLSAgICBpZiAoZnJhbWVCeXRlcyA+IGZyYW1lTGVuKSB7Ci0gICAgICBmcmFtZUJ5dGVzIC09IGZyYW1lTGVuOwotICAgICAgZnJhbWVEYXRhICs9IGZyYW1lTGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcmFtZUJ5dGVzID0gMDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZyYW1lQ291bnQ7Ci19Ci0KLS8qKiBSZWFkIHF1YW50aXplZCBzdWJiYW5kIHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYml0c3RyZWFtIGFuZCBleHBhbmQgdGhlbS4gKi8KLQotI2lmZGVmIFNQRUNJQUxJWkVfUkVBRF9TQU1QTEVTX0pPSU5UCi0KLVBSSVZBVEUgdm9pZCBPSV9TQkNfUmVhZFNhbXBsZXNKb2ludDQoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfQklUU1RSRUFNKiBnbG9iYWxfYnMpIHsKLSNkZWZpbmUgTlJPRl9TVUJCQU5EUyA0Ci0jaW5jbHVkZSAicmVhZHNhbXBsZXNqb2ludC5pbmMiCi0jdW5kZWYgTlJPRl9TVUJCQU5EUwotfQotCi1QUklWQVRFIHZvaWQgT0lfU0JDX1JlYWRTYW1wbGVzSm9pbnQ4KE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JJVFNUUkVBTSogZ2xvYmFsX2JzKSB7Ci0jZGVmaW5lIE5ST0ZfU1VCQkFORFMgOAotI2luY2x1ZGUgInJlYWRzYW1wbGVzam9pbnQuaW5jIgotI3VuZGVmIE5ST0ZfU1VCQkFORFMKLX0KLQotdHlwZWRlZiB2b2lkICgqUkVBRF9TQU1QTEVTKShPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9CSVRTVFJFQU0qIGdsb2JhbF9icyk7Ci0KLXN0YXRpYyBjb25zdCBSRUFEX1NBTVBMRVMgU3BlY2lhbGl6ZWRSZWFkU2FtcGxlc1tdID0ge09JX1NCQ19SZWFkU2FtcGxlc0pvaW50NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1NCQ19SZWFkU2FtcGxlc0pvaW50OH07Ci0KLSNlbmRpZiAvKiBTUEVDSUFMSVpFX1JFQURfU0FNUExFU19KT0lOVCAqLwotCi1QUklWQVRFIHZvaWQgT0lfU0JDX1JlYWRTYW1wbGVzSm9pbnQoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9CSVRTVFJFQU0qIGdsb2JhbF9icykgewotICBPSV9DT0RFQ19TQkNfQ09NTU9OX0NPTlRFWFQqIGNvbW1vbiA9ICZjb250ZXh0LT5jb21tb247Ci0gIE9JX1VJTlQgbnJvZl9zdWJiYW5kcyA9IGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHM7Ci0jaWZkZWYgU1BFQ0lBTElaRV9SRUFEX1NBTVBMRVNfSk9JTlQKLSAgT0lfQVNTRVJUKChucm9mX3N1YmJhbmRzID4+IDN1KSA8PSAxdSk7Ci0gIFNwZWNpYWxpemVkUmVhZFNhbXBsZXNbbnJvZl9zdWJiYW5kcyA+PiAzXShjb250ZXh0LCBnbG9iYWxfYnMpOwotI2Vsc2UKLQotI2RlZmluZSBOUk9GX1NVQkJBTkRTIG5yb2Zfc3ViYmFuZHMKLSNpbmNsdWRlICJyZWFkc2FtcGxlc2pvaW50LmluYyIKLSN1bmRlZiBOUk9GX1NVQkJBTkRTCi0jZW5kaWYgLyogU1BFQ0lBTElaRV9SRUFEX1NBTVBMRVNfSk9JTlQgKi8KLX0KLQotLyoqQH0qLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZGVxdWFudC5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZGVxdWFudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJjZTllLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2RlcXVhbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMyAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gQGZpbGUKLQotIERlcXVhbnRpemVyIGZvciBTQkMgZGVjb2RlcjsgcmVjb25zdHJ1Y3RzIHF1YW50aXplZCByZXByZXNlbnRhdGlvbiBvZiBzdWJiYW5kCi0gc2FtcGxlcy4KLQotIEBpbmdyb3VwIGNvZGVjX2ludGVybmFsCi0gKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLS8qKgotIFRoaXMgZnVuY3Rpb24gaXMgYSBmaXhlZC1wb2ludCBhcHByb3hpbWF0aW9uIG9mIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBmb2xsb3dpbmcKLSBkZXF1YW50aXphdGlvbiBvcGVyYXRpb24gZGVmaW5lZCBpbiB0aGUgc3BlYywgYXMgaW5mZXJyZWQgZnJvbSBzZWN0aW9uIDEyLjYuNDoKLQotIEBjb2RlCi0gZGVxdWFudCA9IDJeKHNjYWxlX2ZhY3RvcisxKSAqICgocmF3ICogMi4wICsgMS4wKSAvICgoMl5iaXRzKSAtIDEpIC0gMSkKLQotIDIgPD0gYml0cyA8PSAxNgotIDAgPD0gcmF3IDwgKDJeYml0cyktMSAgICh0aGUgLTEgaXMgYmVjYXVzZSBxdWFudGl6ZWQgdmFsdWVzIHdpdGggYWxsIDEncyBhcmUKLSBmb3JiaWRkZW4pCi0KLSAtNjU1MzUgPCBkZXF1YW50IDwgNjU1MzUKLSBAZW5kY29kZQotCi0gVGhlIGNvZGUgYmVsb3cgY29tcHV0ZXMgdGhlIGRlcXVhbnRpemVkIHZhbHVlIGRpdmlkZWQgYnkgYSBzY2FsaW5nIGNvbnN0YW50Ci0gZXF1YWwgdG8gYWJvdXQgMS4zOC4gVGhpcyBjb25zdGFudCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoYXQgdGhlIGVudHJ5IGluIHRoZQotIGRlcXVhbnRfbG9uZ19zY2FsZWQgdGFibGUgZm9yIDE2IGJpdHMgaXMgYXMgYWNjdXJhdGUgYXMgcG9zc2libGUsIHNpbmNlIGl0IGhhcwotIHRoZSBsZWFzdCByZWxhdGl2ZSBwcmVjaXNpb24gYXZhaWxhYmxlIHRvIGl0IGR1ZSB0byBpdHMgc21hbGwgbWFnbml0dWRlLgotCi0gVGhpcyByb3V0aW5lIG91dHB1dHMgaW4gUTE2LjE1IGZvcm1hdC4KLQotIFRoZSBoZWxwZXIgYXJyYXkgZGVxdWFudF9sb25nIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLQotIEBjb2RlCi0gZGVxdWFudF9sb25nX2xvbmdbYml0c10gPSByb3VuZCgyXjMxICogMS8oKDJeYml0cyAtIDEpIC8gMS4zOC4uLikgIGZvciAyIDw9Ci0gYml0cyA8PSAxNgotIEBlbmRjb2RlCi0KLQotIEFkZGl0aW9uYWxseSwgdGhlIHRhYmxlIGVudHJpZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnR5OgotCi0gQGNvZGUKLSBkZXF1YW50X2xvbmdfc2NhbGVkW2JpdHNdIDw9IDJeMzEgLyAoKDJeYml0cyAtIDEpKSAgZm9yIDIgPD0gYml0cyA8PSAxNgotIEBlbmRjb2RlCi0KLSBUaGVyZWZvcmUKLQotIEBjb2RlCi0gZCA9IDIgKiByYXcgKyAxICAgICAgICAgICAgICAxIDw9IGQgPD0gMl5iaXRzIC0gMgotCi0gZCcgPSBkICogZGVxdWFudF9sb25nW2JpdHNdCi0KLSAgICAgICAgICAgICAgICAgIGQgKiBkZXF1YW50X2xvbmdfc2NhbGVkW2JpdHNdIDw9ICgyXmJpdHMgLSAyKSAqICgyXjMxIC8KLSAoMl5iaXRzIC0gMSkpCi0gICAgICAgICAgICAgICAgICBkICogZGVxdWFudF9sb25nX3NjYWxlZFtiaXRzXSA8PSAyXjMxICogKDJeYml0cyAtIDIpLygyXmJpdHMgLQotIDEpIDwgMl4zMQotIEBlbmRjb2RlCi0KLSBUaGVyZWZvcmUsIGQnIGRvZXNuJ3Qgb3ZlcmZsb3cgYSBzaWduZWQgMzItYml0IHZhbHVlLgotCi0gQGNvZGUKLQotIGQnID1+IDJeMzEgKiAocmF3ICogMi4wICsgMS4wKSAvICgyXmJpdHMgLSAxKSAvIDEuMzguLi4KLQotIHJlc3VsdCA9IGQnIC0gMl4zMS8xLjM4Li4uID1+IDJeMzEgKiAoKHJhdyAqIDIuMCArIDEuMCkgLyAoMl5iaXRzIC0gMSkgLSAxKSAvCi0gMS4zOC4uLgotCi0gcmVzdWx0IGlzIHRoZXJlZm9yZSBhIHNjYWxlZCBhcHByb3hpbWF0aW9uIHRvIGRlcXVhbnQuIEl0IHJlbWFpbnMgb25seSB0bwotIHR1cm4gMl4zMSBpbnRvIDJeKHNjYWxlX2ZhY3RvcisxKS4gU2luY2Ugd2UncmUgYWltaW5nIGZvciBRMTYuMTUgZm9ybWF0LAotIHRoaXMgaXMgYWNoaWV2ZWQgYnkgc2hpZnRpbmcgcmlnaHQgYnkgKDE1LXNjYWxlX2ZhY3Rvcik6Ci0KLSAgKDJeMzEgKiB4KSA+PiAoMTUtc2NhbGVfZmFjdG9yKSA9fiAyXigzMS0xNStzY2FsZV9mYWN0b3IpICogeCA9IDJeMTUgKgotIDJeKDErc2NhbGVfZmFjdG9yKSAqIHgKLSBAZW5kY29kZQotCi0gKi8KLQotI2luY2x1ZGUgPG9pX2NvZGVjX3NiY19wcml2YXRlLmg+Ci0KLSNpZm5kZWYgU0JDX0RFUVVBTlRfTE9OR19TQ0FMRURfT0ZGU0VUCi0jZGVmaW5lIFNCQ19ERVFVQU5UX0xPTkdfU0NBTEVEX09GRlNFVCAxNTU1OTMxOTcwCi0jZW5kaWYKLQotI2lmbmRlZiBTQkNfREVRVUFOVF9MT05HX1VOU0NBTEVEX09GRlNFVAotI2RlZmluZSBTQkNfREVRVUFOVF9MT05HX1VOU0NBTEVEX09GRlNFVCAyMTQ3NDgzNjQ4Ci0jZW5kaWYKLQotI2lmbmRlZiBTQkNfREVRVUFOVF9TQ0FMSU5HX0ZBQ1RPUgotI2RlZmluZSBTQkNfREVRVUFOVF9TQ0FMSU5HX0ZBQ1RPUiAxLjM4MDE5MTIyMjYyNzgxZgotI2VuZGlmCi0KLWNvbnN0IHVpbnQzMl90IGRlcXVhbnRfbG9uZ19zY2FsZWRbMTddOwotY29uc3QgdWludDMyX3QgZGVxdWFudF9sb25nX3Vuc2NhbGVkWzE3XTsKLQotLyoqIFNjYWxlcyB4IGJ5IHkgYml0cyB0byB0aGUgcmlnaHQsIGFkZGluZyBhIHJvdW5kaW5nIGZhY3Rvci4KLSAqLwotI2lmbmRlZiBTQ0FMRQotI2RlZmluZSBTQ0FMRSh4LCB5KSAoKCh4KSArICgxIDw8ICgoeSktMSkpKSA+PiAoeSkpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX0RFUVVBTlRJWkFUSU9OCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLUlOTElORSBmbG9hdCBkZXF1YW50X2Zsb2F0KHVpbnQzMl90IHJhdywgT0lfVUlOVCBzY2FsZV9mYWN0b3IsIE9JX1VJTlQgYml0cykgewotICBmbG9hdCByZXN1bHQgPSAoMSA8PCAoc2NhbGVfZmFjdG9yICsgMSkpICoKLSAgICAgICAgICAgICAgICAgKChyYXcgKiAyLjBmICsgMS4wZikgLyAoKDEgPDwgYml0cykgLSAxLjBmKSAtIDEuMGYpOwotCi0gIHJlc3VsdCAvPSBTQkNfREVRVUFOVF9TQ0FMSU5HX0ZBQ1RPUjsKLQotICAvKiBVbmxlc3MgdGhlIGVuY29kZXIgc2NyZXdlZCB1cCwgYWxsIGNvcnJlY3QgZGVxdWFudGl6ZWQgdmFsdWVzIHNob3VsZAotICAgKiBzYXRpc2Z5IHRoaXMgaW5lcXVhbGl0eS4gTm9uLWNvbXBsaWFudCBlbmNvZGVycyB3aGljaCBnZW5lcmF0ZSBxdWFudGl6ZWQKLSAgICogdmFsdWVzIHdpdGggYWxsIDEtYml0cyBzZXQgY2FuLCB0aGVvcmV0aWNhbGx5LCB0cmlnZ2VyIHRoaXMgYXNzZXJ0LiBUaGlzCi0gICAqIGlzIHVubGlrZWx5LCBob3dldmVyLCBhbmQgb25seSBhbiBpc3N1ZSBpbiBkZWJ1ZyBtb2RlLgotICAgKi8KLSAgT0lfQVNTRVJUKGZhYnMocmVzdWx0KSA8IDMyNzY4ICogMS42KTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0jZW5kaWYKLQotSU5MSU5FIGludDMyX3QgT0lfU0JDX0RlcXVhbnQodWludDMyX3QgcmF3LCBPSV9VSU5UIHNjYWxlX2ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgYml0cykgewotICB1aW50MzJfdCBkOwotICBpbnQzMl90IHJlc3VsdDsKLQotICBPSV9BU1NFUlQoc2NhbGVfZmFjdG9yIDw9IDE1KTsKLSAgT0lfQVNTRVJUKGJpdHMgPD0gMTYpOwotCi0gIGlmIChiaXRzIDw9IDEpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGQgPSAocmF3ICogMikgKyAxOwotICBkICo9IGRlcXVhbnRfbG9uZ19zY2FsZWRbYml0c107Ci0gIHJlc3VsdCA9IGQgLSBTQkNfREVRVUFOVF9MT05HX1NDQUxFRF9PRkZTRVQ7Ci0KLSNpZmRlZiBERUJVR19ERVFVQU5USVpBVElPTgotICB7Ci0gICAgaW50MzJfdCBpbnRlZ2VyaXplZF9mbG9hdF9yZXN1bHQ7Ci0gICAgZmxvYXQgZmxvYXRfcmVzdWx0OwotCi0gICAgZmxvYXRfcmVzdWx0ID0gZGVxdWFudF9mbG9hdChyYXcsIHNjYWxlX2ZhY3RvciwgYml0cyk7Ci0gICAgaW50ZWdlcml6ZWRfZmxvYXRfcmVzdWx0ID0gKGludDMyX3QpZmxvb3IoMC41ZiArIGZsb2F0X3Jlc3VsdCAqICgxIDw8IDE1KSk7Ci0KLSAgICAvKiBUaGlzIGRldGVjdHMgb3ZlcmZsb3cgKi8KLSAgICBPSV9BU1NFUlQoKChyZXN1bHQgPj0gMCkgJiYgKGludGVnZXJpemVkX2Zsb2F0X3Jlc3VsdCA+PSAwKSkgfHwKLSAgICAgICAgICAgICAgKChyZXN1bHQgPD0gMCkgJiYgKGludGVnZXJpemVkX2Zsb2F0X3Jlc3VsdCA8PSAwKSkpOwotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIHJlc3VsdCA+PiAoMTUgLSBzY2FsZV9mYWN0b3IpOwotfQotCi0vKiBUaGlzIHZlcnNpb24gb2YgRGVxdWFudCBkb2VzIG5vdCBpbmNvcnBvcmF0ZSB0aGUgc2NhbGluZyBmYWN0b3Igb2YgMS4zOC4gSXQKLSAqIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZpbHRlcmJhbmsgd2hpY2ggYXJlCi0gKiBoYXJkLWNvZGVkIGludG8gYSBEU1AuIE91dHB1dCBpcyBRMTYuNCBmb3JtYXQsIHNvIHRoYXQgYWZ0ZXIgam9pbnQgc3RlcmVvCi0gKiBwcm9jZXNzaW5nICh3aGljaCBsZWF2ZXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGVxdWFsIHRvIHRoZSBzaWduIGJpdCBpZgotICogdGhlIGVuY29kZXIgaXMgY29uZm9ybWFudCkgdGhlIHJlc3VsdCB3aWxsIGZpdCBhIDI0IGJpdCBmaXhlZCBwb2ludCBzaWduZWQKLSAqIHZhbHVlLiovCi0KLUlOTElORSBpbnQzMl90IE9JX1NCQ19EZXF1YW50X1Vuc2NhbGVkKHVpbnQzMl90IHJhdywgT0lfVUlOVCBzY2FsZV9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGJpdHMpIHsKLSAgdWludDMyX3QgZDsKLSAgaW50MzJfdCByZXN1bHQ7Ci0KLSAgT0lfQVNTRVJUKHNjYWxlX2ZhY3RvciA8PSAxNSk7Ci0gIE9JX0FTU0VSVChiaXRzIDw9IDE2KTsKLQotICBpZiAoYml0cyA8PSAxKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGJpdHMgPT0gMTYpIHsKLSAgICByZXN1bHQgPSAocmF3IDw8IDE2KSArIHJhdyAtIDB4N2ZmZjdmZmY7Ci0gICAgcmV0dXJuIFNDQUxFKHJlc3VsdCwgMjQgLSBzY2FsZV9mYWN0b3IpOwotICB9Ci0KLSAgZCA9IChyYXcgKiAyKSArIDE7Ci0gIGQgKj0gZGVxdWFudF9sb25nX3Vuc2NhbGVkW2JpdHNdOwotICByZXN1bHQgPSBkIC0gMHg4MDAwMDAwMDsKLQotICByZXR1cm4gU0NBTEUocmVzdWx0LCAyNCAtIHNjYWxlX2ZhY3Rvcik7Ci19Ci0KLS8qKgotQH0KLSovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9mcmFtaW5nLXNiYy5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZnJhbWluZy1zYmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlYTQ2MS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9mcmFtaW5nLXNiYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiBAZmlsZQotQGluZ3JvdXAgY29kZWNfaW50ZXJuYWwKLSovCi0KLS8qKkBhZGRncm91cCBjb2RlY19pbnRlcm5hbCovCi0vKipAeyovCi0KLSNpbmNsdWRlICJvaV9jb2RlY19zYmNfcHJpdmF0ZS5oIgotCi1jb25zdCBPSV9DSEFSKiBjb25zdCBPSV9DT0RFQ19TQkNfRnJlcVRleHRbXSA9IHsKLSAgICAiU0JDX0ZSRVFfMTYwMDAiLCAiU0JDX0ZSRVFfMzIwMDAiLCAiU0JDX0ZSRVFfNDQxMDAiLCAiU0JDX0ZSRVFfNDgwMDAifTsKLWNvbnN0IE9JX0NIQVIqIGNvbnN0IE9JX0NPREVDX1NCQ19Nb2RlVGV4dFtdID0gewotICAgICJTQkNfTU9OTyIsICJTQkNfRFVBTF9DSEFOTkVMIiwgIlNCQ19TVEVSRU8iLCAiU0JDX0pPSU5UX1NURVJFTyJ9OwotY29uc3QgT0lfQ0hBUiogY29uc3QgT0lfQ09ERUNfU0JDX1N1YmJhbmRzVGV4dFtdID0geyJTQkNfU1VCQkFORFNfNCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQ19TVUJCQU5EU184In07Ci1jb25zdCBPSV9DSEFSKiBjb25zdCBPSV9DT0RFQ19TQkNfQmxvY2tzVGV4dFtdID0gewotICAgICJTQkNfQkxPQ0tTXzQiLCAiU0JDX0JMT0NLU184IiwgIlNCQ19CTE9DS1NfMTIiLCAiU0JDX0JMT0NLU18xNiJ9OwotY29uc3QgT0lfQ0hBUiogY29uc3QgT0lfQ09ERUNfU0JDX0FsbG9jVGV4dFtdID0geyJTQkNfTE9VRE5FU1MiLCAiU0JDX1NOUiJ9OwotCi0jaWZkZWYgT0lfREVCVUcKLXZvaWQgT0lfQ09ERUNfU0JDX0R1bXBDb25maWcoT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lSW5mbykgewotICBwcmludGYoIlNCQyBjb25maWd1cmF0aW9uXG4iKTsKLSAgcHJpbnRmKCIgIGVuaGFuY2VkOiAgJXNcbiIsIGZyYW1lSW5mby0+ZW5oYW5jZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgcHJpbnRmKCIgIGZyZXF1ZW5jeTogJWRcbiIsIGZyYW1lSW5mby0+ZnJlcXVlbmN5KTsKLSAgcHJpbnRmKCIgIHN1YmJhbmRzOiAgJWRcbiIsIGZyYW1lSW5mby0+bnJvZl9zdWJiYW5kcyk7Ci0gIHByaW50ZigiICBibG9ja3M6ICAgICVkXG4iLCBmcmFtZUluZm8tPm5yb2ZfYmxvY2tzKTsKLSAgcHJpbnRmKCIgIGNoYW5uZWxzOiAgJWRcbiIsIGZyYW1lSW5mby0+bnJvZl9jaGFubmVscyk7Ci0gIHByaW50ZigiICBtb2RlOiAgICAgICVzXG4iLCBPSV9DT0RFQ19TQkNfTW9kZVRleHRbZnJhbWVJbmZvLT5tb2RlXSk7Ci0gIHByaW50ZigiICBhbGxvYzogICAgICVzXG4iLCBPSV9DT0RFQ19TQkNfQWxsb2NUZXh0W2ZyYW1lSW5mby0+YWxsb2NdKTsKLSAgcHJpbnRmKCIgIGJpdHBvb2w6ICAgJWRcbiIsIGZyYW1lSW5mby0+Yml0cG9vbCk7Ci19Ci0jZW5kaWYgLyogT0lfREVCVUcgKi8KLQotLyoqQH0qLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZnJhbWluZy5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2UvZnJhbWluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODM1YjUyLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL2ZyYW1pbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMyAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi1AZmlsZQotQ2hlY2tzdW0gYW5kIGhlYWRlci1yZWxhdGVkIGZ1bmN0aW9ucy4KLQotQGluZ3JvdXAgY29kZWNfaW50ZXJuYWwKLSovCi0KLS8qKgotQGFkZHRvZ3JvdXAgY29kZWNfaW50ZXJuYWwKLUB7Ci0qLwotCi0jaW5jbHVkZSAib2lfYXNzZXJ0LmgiCi0jaW5jbHVkZSAib2lfY29kZWNfc2JjX3ByaXZhdGUuaCIKLQotLyogYXNkYXNkICovCi0KLSNkZWZpbmUgVVNFX05JQkJMRVdJU0VfQ1JDCi0KLS8qICNkZWZpbmUgUFJJTlRfU0FNUExFUyAqLwotLyogI2RlZmluZSBQUklOVF9TQ0FMRUZBQ1RPUlMgKi8KLS8qICNkZWZpbmUgREVCVUdfQ1JDICovCi0KLS8qCi0gKiBDUkMtOCB0YWJsZSBmb3IgWF44ICsgWF40ICsgWF4zICsgWF4yICsgMTsgYnl0ZS13aXNlIGxvb2t1cAotICovCi0jaWZkZWYgVVNFX1dJREVfQ1JDCi0vKiBTYXZlIHNwYWNlIGlmIGEgY2hhciBpcyAxNiBiaXRzLCBzdWNoIGFzIG9uIHRoZSBDNTR4ICovCi1jb25zdCBPSV9CWVRFIGNyYzhfd2lkZVsxMjhdID0gewotICAgIDB4MDAxZCwgMHgzYTI3LCAweDc0NjksIDB4NGU1MywgMHhlOGY1LCAweGQyY2YsIDB4OWM4MSwgMHhhNmJiLCAweGNkZDAsCi0gICAgMHhmN2VhLCAweGI5YTQsIDB4ODM5ZSwgMHgyNTM4LCAweDFmMDIsIDB4NTE0YywgMHg2Yjc2LCAweDg3OWEsIDB4YmRhMCwKLSAgICAweGYzZWUsIDB4YzlkNCwgMHg2ZjcyLCAweDU1NDgsIDB4MWIwNiwgMHgyMTNjLCAweDRhNTcsIDB4NzA2ZCwgMHgzZTIzLAotICAgIDB4MDQxOSwgMHhhMmJmLCAweDk4ODUsIDB4ZDZjYiwgMHhlY2YxLCAweDEzMGUsIDB4MjkzNCwgMHg2NzdhLCAweDVkNDAsCi0gICAgMHhmYmU2LCAweGMxZGMsIDB4OGY5MiwgMHhiNWE4LCAweGRlYzMsIDB4ZTRmOSwgMHhhYWI3LCAweDkwOGQsIDB4MzYyYiwKLSAgICAweDBjMTEsIDB4NDI1ZiwgMHg3ODY1LCAweDk0ODksIDB4YWViMywgMHhlMGZkLCAweGRhYzcsIDB4N2M2MSwgMHg0NjViLAotICAgIDB4MDgxNSwgMHgzMjJmLCAweDU5NDQsIDB4NjM3ZSwgMHgyZDMwLCAweDE3MGEsIDB4YjFhYywgMHg4Yjk2LCAweGM1ZDgsCi0gICAgMHhmZmUyLCAweDI2M2IsIDB4MWMwMSwgMHg1MjRmLCAweDY4NzUsIDB4Y2VkMywgMHhmNGU5LCAweGJhYTcsIDB4ODA5ZCwKLSAgICAweGViZjYsIDB4ZDFjYywgMHg5ZjgyLCAweGE1YjgsIDB4MDMxZSwgMHgzOTI0LCAweDc3NmEsIDB4NGQ1MCwgMHhhMWJjLAotICAgIDB4OWI4NiwgMHhkNWM4LCAweGVmZjIsIDB4NDk1NCwgMHg3MzZlLCAweDNkMjAsIDB4MDcxYSwgMHg2YzcxLCAweDU2NGIsCi0gICAgMHgxODA1LCAweDIyM2YsIDB4ODQ5OSwgMHhiZWEzLCAweGYwZWQsIDB4Y2FkNywgMHgzNTI4LCAweDBmMTIsIDB4NDE1YywKLSAgICAweDdiNjYsIDB4ZGRjMCwgMHhlN2ZhLCAweGE5YjQsIDB4OTM4ZSwgMHhmOGU1LCAweGMyZGYsIDB4OGM5MSwgMHhiNmFiLAotICAgIDB4MTAwZCwgMHgyYTM3LCAweDY0NzksIDB4NWU0MywgMHhiMmFmLCAweDg4OTUsIDB4YzZkYiwgMHhmY2UxLCAweDVhNDcsCi0gICAgMHg2MDdkLCAweDJlMzMsIDB4MTQwOSwgMHg3ZjYyLCAweDQ1NTgsIDB4MGIxNiwgMHgzMTJjLCAweDk3OGEsIDB4YWRiMCwKLSAgICAweGUzZmUsIDB4ZDljNCwKLX07Ci0jZWxpZiBkZWZpbmVkKFVTRV9OSUJCTEVXSVNFX0NSQykKLWNvbnN0IE9JX0JZVEUgY3JjOF9uYXJyb3dbMTZdID0gezB4MDAsIDB4MWQsIDB4M2EsIDB4MjcsIDB4NzQsIDB4NjksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRlLCAweDUzLCAweGU4LCAweGY1LCAweGQyLCAweGNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YywgMHg4MSwgMHhhNiwgMHhiYn07Ci0jZWxzZQotY29uc3QgT0lfQllURSBjcmM4X25hcnJvd1syNTZdID0gewotICAgIDB4MDAsIDB4MWQsIDB4M2EsIDB4MjcsIDB4NzQsIDB4NjksIDB4NGUsIDB4NTMsIDB4ZTgsIDB4ZjUsIDB4ZDIsIDB4Y2YsCi0gICAgMHg5YywgMHg4MSwgMHhhNiwgMHhiYiwgMHhjZCwgMHhkMCwgMHhmNywgMHhlYSwgMHhiOSwgMHhhNCwgMHg4MywgMHg5ZSwKLSAgICAweDI1LCAweDM4LCAweDFmLCAweDAyLCAweDUxLCAweDRjLCAweDZiLCAweDc2LCAweDg3LCAweDlhLCAweGJkLCAweGEwLAotICAgIDB4ZjMsIDB4ZWUsIDB4YzksIDB4ZDQsIDB4NmYsIDB4NzIsIDB4NTUsIDB4NDgsIDB4MWIsIDB4MDYsIDB4MjEsIDB4M2MsCi0gICAgMHg0YSwgMHg1NywgMHg3MCwgMHg2ZCwgMHgzZSwgMHgyMywgMHgwNCwgMHgxOSwgMHhhMiwgMHhiZiwgMHg5OCwgMHg4NSwKLSAgICAweGQ2LCAweGNiLCAweGVjLCAweGYxLCAweDEzLCAweDBlLCAweDI5LCAweDM0LCAweDY3LCAweDdhLCAweDVkLCAweDQwLAotICAgIDB4ZmIsIDB4ZTYsIDB4YzEsIDB4ZGMsIDB4OGYsIDB4OTIsIDB4YjUsIDB4YTgsIDB4ZGUsIDB4YzMsIDB4ZTQsIDB4ZjksCi0gICAgMHhhYSwgMHhiNywgMHg5MCwgMHg4ZCwgMHgzNiwgMHgyYiwgMHgwYywgMHgxMSwgMHg0MiwgMHg1ZiwgMHg3OCwgMHg2NSwKLSAgICAweDk0LCAweDg5LCAweGFlLCAweGIzLCAweGUwLCAweGZkLCAweGRhLCAweGM3LCAweDdjLCAweDYxLCAweDQ2LCAweDViLAotICAgIDB4MDgsIDB4MTUsIDB4MzIsIDB4MmYsIDB4NTksIDB4NDQsIDB4NjMsIDB4N2UsIDB4MmQsIDB4MzAsIDB4MTcsIDB4MGEsCi0gICAgMHhiMSwgMHhhYywgMHg4YiwgMHg5NiwgMHhjNSwgMHhkOCwgMHhmZiwgMHhlMiwgMHgyNiwgMHgzYiwgMHgxYywgMHgwMSwKLSAgICAweDUyLCAweDRmLCAweDY4LCAweDc1LCAweGNlLCAweGQzLCAweGY0LCAweGU5LCAweGJhLCAweGE3LCAweDgwLCAweDlkLAotICAgIDB4ZWIsIDB4ZjYsIDB4ZDEsIDB4Y2MsIDB4OWYsIDB4ODIsIDB4YTUsIDB4YjgsIDB4MDMsIDB4MWUsIDB4MzksIDB4MjQsCi0gICAgMHg3NywgMHg2YSwgMHg0ZCwgMHg1MCwgMHhhMSwgMHhiYywgMHg5YiwgMHg4NiwgMHhkNSwgMHhjOCwgMHhlZiwgMHhmMiwKLSAgICAweDQ5LCAweDU0LCAweDczLCAweDZlLCAweDNkLCAweDIwLCAweDA3LCAweDFhLCAweDZjLCAweDcxLCAweDU2LCAweDRiLAotICAgIDB4MTgsIDB4MDUsIDB4MjIsIDB4M2YsIDB4ODQsIDB4OTksIDB4YmUsIDB4YTMsIDB4ZjAsIDB4ZWQsIDB4Y2EsIDB4ZDcsCi0gICAgMHgzNSwgMHgyOCwgMHgwZiwgMHgxMiwgMHg0MSwgMHg1YywgMHg3YiwgMHg2NiwgMHhkZCwgMHhjMCwgMHhlNywgMHhmYSwKLSAgICAweGE5LCAweGI0LCAweDkzLCAweDhlLCAweGY4LCAweGU1LCAweGMyLCAweGRmLCAweDhjLCAweDkxLCAweGI2LCAweGFiLAotICAgIDB4MTAsIDB4MGQsIDB4MmEsIDB4MzcsIDB4NjQsIDB4NzksIDB4NWUsIDB4NDMsIDB4YjIsIDB4YWYsIDB4ODgsIDB4OTUsCi0gICAgMHhjNiwgMHhkYiwgMHhmYywgMHhlMSwgMHg1YSwgMHg0NywgMHg2MCwgMHg3ZCwgMHgyZSwgMHgzMywgMHgxNCwgMHgwOSwKLSAgICAweDdmLCAweDYyLCAweDQ1LCAweDU4LCAweDBiLCAweDE2LCAweDMxLCAweDJjLCAweDk3LCAweDhhLCAweGFkLCAweGIwLAotICAgIDB4ZTMsIDB4ZmUsIDB4ZDksIDB4YzR9OwotI2VuZGlmCi1jb25zdCB1aW50MzJfdCBkZXF1YW50X2xvbmdfc2NhbGVkWzE3XSA9IHsKLSAgICAwLCAgICAgICAgICAwLAotICAgIDB4MWVlOWUxMTYsIC8qIGJpdHM9MiAgMC4yNDE1MTI0MyAgMS8zICAgICAgKiAoMS8xLjM4MDE5MTIyMjYyNzgxKQotICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4KSovCi0gICAgMHgwZDNmYTk5YywgLyogYml0cz0zICAwLjEwMzUwNTMzICAxLzcgICAgICAqICgxLzEuMzgwMTkxMjIyNjI3ODEpCi0gICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTMpKi8KLSAgICAweDA2MmVjNjllLCAvKiBiaXRzPTQgIDAuMDQ4MzAyNDkgIDEvMTUgICAgICogKDEvMS4zODAxOTEyMjI2Mjc4MSkKLSAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAyOSkqLwotICAgIDB4MDJmZGRiZmEsIC8qIGJpdHM9NSAgMC4wMjMzNzIxNyAgMS8zMSAgICAgKiAoMS8xLjM4MDE5MTIyMjYyNzgxKQotICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDU1KSovCi0gICAgMHgwMTc4ZDlmNSwgLyogYml0cz02ICAwLjAxMTUwMDU5ICAxLzYzICAgICAqICgxLzEuMzgwMTkxMjIyNjI3ODEpCi0gICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwYWQpKi8KLSAgICAweDAwYmFmMTI5LCAvKiBiaXRzPTcgIDAuMDA1NzA1MDIgIDEvMTI3ICAgICogKDEvMS4zODAxOTEyMjI2Mjc4MSkKLSAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDE1ZSkqLwotICAgIDB4MDA1ZDFhYmUsIC8qIGJpdHM9OCAgMC4wMDI4NDEzMiAgMS8yNTUgICAgKiAoMS8xLjM4MDE5MTIyMjYyNzgxKQotICAgICAgICAgICAgICAgICAgICgweDAwMDAwMmJmKSovCi0gICAgMHgwMDJlNzYwZCwgLyogYml0cz05ICAwLjAwMTQxNzg4ICAxLzUxMSAgICAqICgxLzEuMzgwMTkxMjIyNjI3ODEpCi0gICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1ODIpKi8KLSAgICAweDAwMTczNTM2LCAvKiBiaXRzPTEwIDAuMDAwNzA4MjUgIDEvMTAyMyAgICogKDEvMS4zODAxOTEyMjI2Mjc4MSkKLSAgICAgICAgICAgICAgICAgICAoMHgwMDAwMGIwNykqLwotICAgIDB4MDAwYjk5MjgsIC8qIGJpdHM9MTEgMC4wMDAzNTM5NSAgMS8yMDQ3ICAgKiAoMS8xLjM4MDE5MTIyMjYyNzgxKQotICAgICAgICAgICAgICAgICAgICgweDAwMDAxNjEyKSovCi0gICAgMHgwMDA1Y2MzNywgLyogYml0cz0xMiAwLjAwMDE3NjkzICAxLzQwOTUgICAqICgxLzEuMzgwMTkxMjIyNjI3ODEpCi0gICAgICAgICAgICAgICAgICAgKDB4MDAwMDJjMjcpKi8KLSAgICAweDAwMDJlNjA0LCAvKiBiaXRzPTEzIDAuMDAwMDg4NDYgIDEvODE5MSAgICogKDEvMS4zODAxOTEyMjI2Mjc4MSkKLSAgICAgICAgICAgICAgICAgICAoMHgwMDAwNTg1MikqLwotICAgIDB4MDAwMTcyZmMsIC8qIGJpdHM9MTQgMC4wMDAwNDQyMiAgMS8xNjM4MyAgKiAoMS8xLjM4MDE5MTIyMjYyNzgxKQotICAgICAgICAgICAgICAgICAgICgweDAwMDBiMGE3KSovCi0gICAgMHgwMDAwYjk3ZCwgLyogYml0cz0xNSAwLjAwMDAyMjExICAxLzMyNzY3ICAqICgxLzEuMzgwMTkxMjIyNjI3ODEpCi0gICAgICAgICAgICAgICAgICAgKDB4MDAwMTYxNTApKi8KLSAgICAweDAwMDA1Y2JlLCAvKiBiaXRzPTE2IDAuMDAwMDExMDYgIDEvNjU1MzUgICogKDEvMS4zODAxOTEyMjI2Mjc4MSkKLSAgICAgICAgICAgICAgICAgICAoMHgwMDAyYzJhNSkqLwotfTsKLQotY29uc3QgdWludDMyX3QgZGVxdWFudF9sb25nX3Vuc2NhbGVkWzE3XSA9IHsKLSAgICAwLCAgICAgICAgICAwLCAweDJhYWFhYWFiLCAvKiBiaXRzPTIgIDAuMzMzMzMzMzMgIDEvMyAgICAgICgweDAwMDAwMDA1KSovCi0gICAgMHgxMjQ5MjQ5MiwgICAgICAgICAgICAgICAgLyogYml0cz0zICAwLjE0Mjg1NzE0ICAxLzcgICAgICAoMHgwMDAwMDAwZSkqLwotICAgIDB4MDg4ODg4ODksICAgICAgICAgICAgICAgIC8qIGJpdHM9NCAgMC4wNjY2NjY2NyAgMS8xNSAgICAgKDB4MDAwMDAwMWQpKi8KLSAgICAweDA0MjEwODQyLCAgICAgICAgICAgICAgICAvKiBiaXRzPTUgIDAuMDMyMjU4MDYgIDEvMzEgICAgICgweDAwMDAwMDNlKSovCi0gICAgMHgwMjA4MjA4MiwgICAgICAgICAgICAgICAgLyogYml0cz02ICAwLjAxNTg3MzAyICAxLzYzICAgICAoMHgwMDAwMDA3ZSkqLwotICAgIDB4MDEwMjA0MDgsICAgICAgICAgICAgICAgIC8qIGJpdHM9NyAgMC4wMDc4NzQwMiAgMS8xMjcgICAgKDB4MDAwMDAwZmUpKi8KLSAgICAweDAwODA4MDgxLCAgICAgICAgICAgICAgICAvKiBiaXRzPTggIDAuMDAzOTIxNTcgIDEvMjU1ICAgICgweDAwMDAwMWZkKSovCi0gICAgMHgwMDQwMjAxMCwgICAgICAgICAgICAgICAgLyogYml0cz05ICAwLjAwMTk1Njk1ICAxLzUxMSAgICAoMHgwMDAwMDNmZSkqLwotICAgIDB4MDAyMDA4MDIsICAgICAgICAgICAgICAgIC8qIGJpdHM9MTAgMC4wMDA5Nzc1MiAgMS8xMDIzICAgKDB4MDAwMDA3ZmUpKi8KLSAgICAweDAwMTAwMjAwLCAgICAgICAgICAgICAgICAvKiBiaXRzPTExIDAuMDAwNDg4NTIgIDEvMjA0NyAgICgweDAwMDAwZmZlKSovCi0gICAgMHgwMDA4MDA4MCwgICAgICAgICAgICAgICAgLyogYml0cz0xMiAwLjAwMDI0NDIwICAxLzQwOTUgICAoMHgwMDAwMWZmZSkqLwotICAgIDB4MDAwNDAwMjAsICAgICAgICAgICAgICAgIC8qIGJpdHM9MTMgMC4wMDAxMjIwOSAgMS84MTkxICAgKDB4MDAwMDNmZmUpKi8KLSAgICAweDAwMDIwMDA4LCAgICAgICAgICAgICAgICAvKiBiaXRzPTE0IDAuMDAwMDYxMDQgIDEvMTYzODMgICgweDAwMDA3ZmZlKSovCi0gICAgMHgwMDAxMDAwMiwgICAgICAgICAgICAgICAgLyogYml0cz0xNSAwLjAwMDAzMDUyICAxLzMyNzY3ICAoMHgwMDAwZmZmZSkqLwotICAgIDB4MDAwMDgwMDEsICAgICAgICAgICAgICAgIC8qIGJpdHM9MTYgMC4wMDAwMTUyNiAgMS82NTUzNSAgKDB4MDAwMWZmZmMpKi8KLX07Ci0KLSNpZiBkZWZpbmVkKE9JX0RFQlVHKSB8fCBkZWZpbmVkKFBSSU5UX1NBTVBMRVMpIHx8IGRlZmluZWQoUFJJTlRfU0NBTEVGQUNUT1JTKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9XSURFX0NSQwotSU5MSU5FIE9JX0NIQVIgY3JjX2l0ZXJhdGUodWludDhfdCBvbGRjcmMsIHVpbnQ4X3QgbmV4dCkgewotICBPSV9VSU5UIGNyYzsKLSAgT0lfVUlOVCBpZHg7Ci0gIGlkeCA9IG9sZGNyYyBeIG5leHQ7Ci0gIGNyYyA9IGNyYzhfd2lkZVtpZHggPj4gMV07Ci0gIGlmIChpZHggJSAyKSB7Ci0gICAgY3JjICY9IDB4ZmY7Ci0gIH0gZWxzZSB7Ci0gICAgY3JjID4+PSA4OwotICB9Ci0KLSAgcmV0dXJuIGNyYzsKLX0KLQotSU5MSU5FIE9JX0NIQVIgY3JjX2l0ZXJhdGVfdG9wNCh1aW50OF90IG9sZGNyYywgdWludDhfdCBuZXh0KSB7Ci0gIE9JX1VJTlQgY3JjOwotICBPSV9VSU5UIGlkeDsKLSAgaWR4ID0gKG9sZGNyYyBeIG5leHQpID4+IDQ7Ci0gIGNyYyA9IGNyYzhfd2lkZVtpZHggPj4gMV07Ci0gIGlmIChpZHggJSAyKSB7Ci0gICAgY3JjICY9IDB4ZmY7Ci0gIH0gZWxzZSB7Ci0gICAgY3JjID4+PSA4OwotICB9Ci0KLSAgcmV0dXJuIChvbGRjcmMgPDwgNCkgXiBjcmM7Ci19Ci0KLSNlbHNlICAvLyBVU0VfV0lERV9DUkMKLQotSU5MSU5FIHVpbnQ4X3QgY3JjX2l0ZXJhdGVfdG9wNCh1aW50OF90IG9sZGNyYywgdWludDhfdCBuZXh0KSB7Ci0gIHJldHVybiAob2xkY3JjIDw8IDQpIF4gY3JjOF9uYXJyb3dbKG9sZGNyYyBeIG5leHQpID4+IDRdOwotfQotCi0jaWZkZWYgVVNFX05JQkJMRVdJU0VfQ1JDCi1JTkxJTkUgdWludDhfdCBjcmNfaXRlcmF0ZSh1aW50OF90IGNyYywgdWludDhfdCBuZXh0KSB7Ci0gIGNyYyA9IChjcmMgPDwgNCkgXiBjcmM4X25hcnJvd1soY3JjIF4gbmV4dCkgPj4gNF07Ci0gIGNyYyA9IChjcmMgPDwgNCkgXiBjcmM4X25hcnJvd1soKGNyYyA+PiA0KSBeIG5leHQpICYgMHhmXTsKLQotICByZXR1cm4gY3JjOwotfQotCi0jZWxzZSAgLy8gVVNFX05JQkJMRVdJU0VfQ1JDCi1JTkxJTkUgdWludDhfdCBjcmNfaXRlcmF0ZSh1aW50OF90IGNyYywgdWludDhfdCBuZXh0KSB7Ci0gIHJldHVybiBjcmM4X25hcnJvd1tjcmMgXiBuZXh0XTsKLX0KLQotI2VuZGlmICAvLyBVU0VfTklCQkxFV0lTRV9DUkMKLQotI2VuZGlmICAvLyBVU0VfV0lERV9DUkMKLQotUFJJVkFURSB1aW50OF90IE9JX1NCQ19DYWxjdWxhdGVDaGVja3N1bShPSV9DT0RFQ19TQkNfRlJBTUVfSU5GTyogZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX0JZVEUgY29uc3QqIGRhdGEpIHsKLSAgT0lfVUlOVCBpOwotICB1aW50OF90IGNyYyA9IDB4MGY7Ci0gIC8qIENvdW50IGlzIHRoZSBudW1iZXIgb2Ygd2hvbGUgYnl0ZXMgc3ViamVjdCB0byBDUkMuIEFjdHVhbGx5LCBpdCdzIG9uZQotICAgKiBtb3JlIHRoYW4gdGhpcyBudW1iZXIsIGJlY2F1c2UgZGF0YVszXSBpcyB0aGUgQ1JDIGZpZWxkIGl0c2VsZiwgd2hpY2ggaXMKLSAgICogZXhwbGljaXRseSBza2lwcGVkLiBTaW5jZSBjcmNfaXRlcmF0ZSAoc2hvdWxkIGJlKSBpbmxpbmVkLCBpdCdzIGNoZWFwZXIKLSAgICogc3BhY2V3aXNlIHRvIGluY2x1ZGUgdGhlIGNoZWNrIGluIHRoZSBsb29wLiBUaGlzIHNob3VsZG4ndCBiZSBtdWNoIG9mIGEKLSAgICogYm90dGxlbmVjayByb3V0aW5lIGluIHRoZSBmaXJzdCBwbGFjZS4gKi8KLSAgT0lfVUlOVCBjb3VudCA9IChmcmFtZS0+bnJvZl9zdWJiYW5kcyAqIGZyYW1lLT5ucm9mX2NoYW5uZWxzIC8gMnUpICsgNDsKLQotICBpZiAoZnJhbWUtPm1vZGUgPT0gU0JDX0pPSU5UX1NURVJFTyAmJiBmcmFtZS0+bnJvZl9zdWJiYW5kcyA9PSA4KSB7Ci0gICAgY291bnQrKzsKLSAgfQotCi0gIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgaWYgKGkgIT0gMykgewotICAgICAgY3JjID0gY3JjX2l0ZXJhdGUoY3JjLCBkYXRhW2ldKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZnJhbWUtPm1vZGUgPT0gU0JDX0pPSU5UX1NURVJFTyAmJiBmcmFtZS0+bnJvZl9zdWJiYW5kcyA9PSA0KSB7Ci0gICAgY3JjID0gY3JjX2l0ZXJhdGVfdG9wNChjcmMsIGRhdGFbaV0pOwotICB9Ci0KLSAgcmV0dXJuIGNyYzsKLX0KLQotdm9pZCBPSV9TQkNfRXhwYW5kRnJhbWVGaWVsZHMoT0lfQ09ERUNfU0JDX0ZSQU1FX0lORk8qIGZyYW1lKSB7Ci0gIGZyYW1lLT5ucm9mX2Jsb2NrcyA9IGJsb2NrX3ZhbHVlc1tmcmFtZS0+YmxvY2tzXTsKLSAgZnJhbWUtPm5yb2Zfc3ViYmFuZHMgPSBiYW5kX3ZhbHVlc1tmcmFtZS0+c3ViYmFuZHNdOwotCi0gIGZyYW1lLT5mcmVxdWVuY3kgPSBmcmVxX3ZhbHVlc1tmcmFtZS0+ZnJlcUluZGV4XTsKLSAgZnJhbWUtPm5yb2ZfY2hhbm5lbHMgPSBjaGFubmVsX3ZhbHVlc1tmcmFtZS0+bW9kZV07Ci19Ci0KLS8qKgotICogVW5yb2xsZWQgbWFjcm8gdG8gY29weSA0IDMyLWJpdCBhbGlnbmVkIDMyLWJpdCB2YWx1ZXMgYmFja3dhcmQgaW4gbWVtb3J5Ci0gKi8KLSNkZWZpbmUgQ09QWTRXT1JEU19CQUNLKF9kZXN0LCBfc3JjKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludDMyX3QgX2EsIF9iLCBfYywgX2Q7ICAgICAgICAgIFwKLSAgICBfYSA9ICotLShfc3JjKTsgICAgICAgICAgICAgICAgICBcCi0gICAgX2IgPSAqLS0oX3NyYyk7ICAgICAgICAgICAgICAgICAgXAotICAgIF9jID0gKi0tKF9zcmMpOyAgICAgICAgICAgICAgICAgIFwKLSAgICBfZCA9ICotLShfc3JjKTsgICAgICAgICAgICAgICAgICBcCi0gICAgKi0tKF9kZXN0KSA9IF9hOyAgICAgICAgICAgICAgICAgXAotICAgICotLShfZGVzdCkgPSBfYjsgICAgICAgICAgICAgICAgIFwKLSAgICAqLS0oX2Rlc3QpID0gX2M7ICAgICAgICAgICAgICAgICBcCi0gICAgKi0tKF9kZXN0KSA9IF9kOyAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jaWYgZGVmaW5lZChVU0VfUExBVEZPUk1fTUVNTU9WRSkgfHwgZGVmaW5lZChVU0VfUExBVEZPUk1fTUVNQ1BZKQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi1QUklWQVRFIHZvaWQgc2hpZnRfYnVmZmVyKFNCQ19CVUZGRVJfVCogZGVzdCwgU0JDX0JVRkZFUl9UKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgd29yZENvdW50KSB7Ci0jaWZkZWYgVVNFX1BMQVRGT1JNX01FTU1PVkUKLSAgbWVtbW92ZShkZXN0LCBzcmMsIHdvcmRDb3VudCAqIHNpemVvZihTQkNfQlVGRkVSX1QpKTsKLSNlbGlmIGRlZmluZWQoVVNFX1BMQVRGT1JNX01FTUNQWSkKLSAgT0lfQVNTRVJUKCgoT0lfQ0hBUiopKGRlc3QpIC0gKE9JX0NIQVIqKShzcmMpKSA+PSB3b3JkQ291bnQgKiBzaXplb2YoKmRlc3QpKTsKLSAgbWVtY3B5KGRlc3QsIHNyYywgd29yZENvdW50ICogc2l6ZW9mKFNCQ19CVUZGRVJfVCkpOwotI2Vsc2UKLSAgT0lfVUlOVCBuOwotICBpbnQzMl90KiBkOwotICBpbnQzMl90KiBzOwotICBuID0gd29yZENvdW50IC8gNCAvIChzaXplb2YoaW50MzJfdCkgLyBzaXplb2YoKmRlc3QpKTsKLSAgT0lfQVNTRVJUKChuICogNCAqIChzaXplb2YoaW50MzJfdCkgLyBzaXplb2YoKmRlc3QpKSkgPT0gd29yZENvdW50KTsKLQotICBkID0gKHZvaWQqKShkZXN0ICsgd29yZENvdW50KTsKLSAgcyA9ICh2b2lkKikoc3JjICsgd29yZENvdW50KTsKLQotICBkbyB7Ci0gICAgQ09QWTRXT1JEU19CQUNLKGQsIHMpOwotICB9IHdoaWxlICgtLW4pOwotI2VuZGlmCi19Ci0vKioKLUB9Ci0qLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2Uvb2lfY29kZWNfdmVyc2lvbi5jIGIvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2Uvb2lfY29kZWNfdmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGMwMDVmLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL29pX2NvZGVjX3ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi1AZmlsZQotVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlCi12ZXJzaW9uIG51bWJlciBvZiB0aGUgZVNCQyBjb2RlYwotCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9pX2NvZGVjX3NiY19wcml2YXRlLmgiCi0jaW5jbHVkZSAib2lfc3RkZGVmcy5oIgotCi0vKiogVmVyc2lvbiBzdHJpbmcgZm9yIHRoZSBCTFVFbWFnaWMgMy4wIHByb3RvY29sIHN0YWNrIGFuZCBwcm9maWxlcyAqLwotUFJJVkFURSBPSV9DSEFSKiBjb25zdCBjb2RlY1ZlcnNpb24gPQotICAgICJ2MS41IgotI2lmZGVmIE9JX1NCQ19FVkFMCi0gICAgIiAoRXZhbHVhdGlvbiB2ZXJzaW9uKSIKLSNlbmRpZgotICAgIDsKLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgdGhlIEJMVUVtYWdpYyAzLjAgcHJvdG9jb2wgc3RhY2sKLSAgICBhbmQgcHJvZmlsZXMgKi8KLU9JX0NIQVIqIE9JX0NPREVDX1ZlcnNpb24odm9pZCkgeyByZXR1cm4gY29kZWNWZXJzaW9uOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotQH0KLSovCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9yZWFkc2FtcGxlc2pvaW50LmluYyBiL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3JlYWRzYW1wbGVzam9pbnQuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzk2MTNlLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3JlYWRzYW1wbGVzam9pbnQuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAzIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlIHJlYWRzYW1wbGVzam9pbnQuaW5jCi0gKgotICogVGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIE9JX1NCQ19SZWFkU2FtcGxlc0pvaW50KCkuCi0gKiBJdCBpcyBkZXNpZ25lZCB0byBiZSBcI2luY2x1ZGVkIGludG8gYSBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgIFxjb2RlCi0gICAgdm9pZCBPSV9TQkNfUmVhZFNhbXBsZXNKb2ludDQoT0lfQ09ERUNfU0JDX0NPTU1PTl9DT05URVhUICpjb21tb24sIE9JX0JJVFNUUkVBTSAqZ2xvYmFsX2JzKQotICAgIHsKLSAgICAgICAgI2RlZmluZSBOUk9GX1NVQkJBTkRTIDQKLSAgICAgICAgI2luY2x1ZGUgInJlYWRzYW1wbGVzam9pbnQuaW5jIgotICAgICAgICAjdW5kZWYgTlJPRl9TVUJCQU5EUwotICAgIH0KLQotICAgIHZvaWQgT0lfU0JDX1JlYWRTYW1wbGVzSm9pbnQ4KE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCAqY29tbW9uLCBPSV9CSVRTVFJFQU0gKmdsb2JhbF9icykKLSAgICB7Ci0gICAgICAgICNkZWZpbmUgTlJPRl9TVUJCQU5EUyA4Ci0gICAgICAgICNpbmNsdWRlICJyZWFkc2FtcGxlc2pvaW50LmluYyIKLSAgICAgICAgI3VuZGVmIE5ST0ZfU1VCQkFORFMKLSAgICB9Ci0gICAgXGVuZGNvZGUKLSAqIE9yIHRvIG1ha2UgYSBnZW5lcmljIHZlcnNpb246Ci0gICAgXGNvZGUKLSAgICB2b2lkIE9JX1NCQ19SZWFkU2FtcGxlc0pvaW50KE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCAqY29tbW9uLCBPSV9CSVRTVFJFQU0gKmdsb2JhbF9icykKLSAgICB7Ci0gICAgICAgIE9JX1VJTlQgbnJvZl9zdWJiYW5kcyA9IGNvbW1vbi0+ZnJhbWVJbmZvLm5yb2Zfc3ViYmFuZHM7Ci0KLSAgICAgICAgI2RlZmluZSBOUk9GX1NVQkJBTkRTIG5yb2Zfc3ViYmFuZHMKLSAgICAgICAgI2luY2x1ZGUgInJlYWRzYW1wbGVzam9pbnQuaW5jIgotICAgICAgICAjdW5kZWYgTlJPRl9TVUJCQU5EUwotICAgIH0KLSAgICBcZW5kY29kZQotICogQGluZ3JvdXAgY29kZWNfaW50ZXJuYWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotewotICAgIE9JX0NPREVDX1NCQ19DT01NT05fQ09OVEVYVCAqY29tbW9uID0gJmNvbnRleHQtPmNvbW1vbjsKLSAgICBPSV9VSU5UIGJsID0gY29tbW9uLT5mcmFtZUluZm8ubnJvZl9ibG9ja3M7Ci0gICAgaW50MzJfdCAqIFJFU1RSSUNUIHMgPSBjb21tb24tPnN1YmRhdGE7Ci0gICAgdWludDhfdCAqcHRyID0gZ2xvYmFsX2JzLT5wdHIudzsKLSAgICB1aW50MzJfdCB2YWx1ZSA9IGdsb2JhbF9icy0+dmFsdWU7Ci0gICAgT0lfVUlOVCBiaXRQdHIgPSBnbG9iYWxfYnMtPmJpdFB0cjsKLSAgICB1aW50OF90IGptYXNrID0gY29tbW9uLT5mcmFtZUluZm8uam9pbiA8PCAoOCAtIE5ST0ZfU1VCQkFORFMpOwotCi0gICAgZG8gewotICAgICAgICBpbnQ4X3QgKnNmX2FycmF5ID0gJmNvbW1vbi0+c2NhbGVfZmFjdG9yWzBdOwotICAgICAgICB1aW50OF90ICpiaXRzX2FycmF5ID0gJmNvbW1vbi0+Yml0cy51aW50OFswXTsKLSAgICAgICAgdWludDhfdCBqb2ludCA9IGptYXNrOwotICAgICAgICBPSV9VSU5UIHNiOwotICAgICAgICAvKgotICAgICAgICAgKiBMZWZ0IGNoYW5uZWwKLSAgICAgICAgICovCi0gICAgICAgIHNiID0gTlJPRl9TVUJCQU5EUzsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgdWludDMyX3QgcmF3OwotICAgICAgICAgICAgaW50MzJfdCBkZXF1YW50OwotICAgICAgICAgICAgdWludDhfdCBiaXRzID0gKmJpdHNfYXJyYXkrKzsKLSAgICAgICAgICAgIE9JX0lOVCBzZiA9ICpzZl9hcnJheSsrOwotCi0gICAgICAgICAgICBPSV9CSVRTVFJFQU1fUkVBRFVJTlQocmF3LCBiaXRzLCBwdHIsIHZhbHVlLCBiaXRQdHIpOwotICAgICAgICAgICAgZGVxdWFudCA9IE9JX1NCQ19EZXF1YW50KHJhdywgc2YsIGJpdHMpOwotICAgICAgICAgICAgKnMrKyA9IGRlcXVhbnQ7Ci0gICAgICAgIH0gd2hpbGUgKC0tc2IpOwotICAgICAgICAvKgotICAgICAgICAgKiBSaWdodCBjaGFubmVsCi0gICAgICAgICAqLwotICAgICAgICBzYiA9IE5ST0ZfU1VCQkFORFM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJhdzsKLSAgICAgICAgICAgIGludDMyX3QgZGVxdWFudDsKLSAgICAgICAgICAgIHVpbnQ4X3QgYml0cyA9ICpiaXRzX2FycmF5Kys7Ci0gICAgICAgICAgICBPSV9JTlQgc2YgPSAqc2ZfYXJyYXkrKzsKLQotICAgICAgICAgICAgT0lfQklUU1RSRUFNX1JFQURVSU5UKHJhdywgYml0cywgcHRyLCB2YWx1ZSwgYml0UHRyKTsKLSAgICAgICAgICAgIGRlcXVhbnQgPSBPSV9TQkNfRGVxdWFudChyYXcsIHNmLCBiaXRzKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGRvIG1pZC9zaWRlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChqb2ludCAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IG1pZCA9ICoocyAtIE5ST0ZfU1VCQkFORFMpOwotICAgICAgICAgICAgICAgIGludDMyX3Qgc2lkZSA9IGRlcXVhbnQ7Ci0gICAgICAgICAgICAgICAgKihzIC0gTlJPRl9TVUJCQU5EUykgPSBtaWQgKyBzaWRlOwotICAgICAgICAgICAgICAgIGRlcXVhbnQgPSBtaWQgLSBzaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgam9pbnQgPDw9IDE7Ci0gICAgICAgICAgICAqcysrID0gZGVxdWFudDsKLSAgICAgICAgfSB3aGlsZSAoLS1zYik7Ci0gICAgfSB3aGlsZSAoLS1ibCk7Ci19CmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9zeW50aGVzaXMtOC1nZW5lcmF0ZWQuYyBiL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3N5bnRoZXNpcy04LWdlbmVyYXRlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjU2ZGM0Li4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3N5bnRoZXNpcy04LWdlbmVyYXRlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAzIC0gMjAwNCBPcGVuIEludGVyZmFjZSBOb3J0aCBBbWVyaWNhLCBJbmMuIEFsbCByaWdodHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gQGZpbGUKLQotIERPIE5PVCBFRElUIFRISVMgRklMRSBESVJFQ1RMWQotCi0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSAic3ludGhlc2lzLWdlbi5wbCIgc2NyaXB0LgotIEFueSBjaGFuZ2VzIHRvIHRoaXMgZ2VuZXJhdGVkIGZpbGUgd2lsbCBiZSBsb3N0IHdoZW4gdGhlIHNjcmlwdCBpcyByZS1ydW4uCi0KLSBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSBmdW5jdGlvbnMgaW4gc3ludGhlc2lzLmMgdG8gcGVyZm9ybSB0aGUgc3ludGhlc2lzCi0gZmlsdGVyYmFuayBjb21wdXRhdGlvbnMgZm9yIHRoZSBTQkMgZGVjb2Rlci4KLQotCi0gKi8KLQotI2luY2x1ZGUgPG9pX2NvZGVjX3NiY19wcml2YXRlLmg+Ci0KLSNpZm5kZWYgQ0xJUF9JTlQxNgotI2RlZmluZSBDTElQX0lOVDE2KHgpICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCh4KSA+IE9JX0lOVDE2X01BWCkgeyAgICAgICAgXAotICAgICAgKHgpID0gT0lfSU5UMTZfTUFYOyAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgaWYgKCh4KSA8IE9JX0lOVDE2X01JTikgeyBcCi0gICAgICAoeCkgPSBPSV9JTlQxNl9NSU47ICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIE1VTF8xNlNfMTZTKF94LCBfeSkgKChfeCkgKiAoX3kpKQotCi1QUklWQVRFIHZvaWQgU3ludGhXaW5kb3c4MF9nZW5lcmF0ZWQoaW50MTZfdCogcGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCQ19CVUZGRVJfVCBjb25zdCogUkVTVFJJQ1QgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgc3RyaWRlU2hpZnQpIHsKLSAgaW50MzJfdCBwY21fYSwgcGNtX2I7Ci0gIC8qIDEgLSBzdGFnZSAwICovIHBjbV9iID0gMDsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDgyMzUsIGJ1ZmZlclsxMl0pKSA+PiAzOwotICAvKiAxIC0gc3RhZ2UgMCAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoLTIzMTY3LCBidWZmZXJbMjBdKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDI2NDc5LCBidWZmZXJbMjhdKSkgPj4gMjsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKC0xNzM5NywgYnVmZmVyWzM2XSkpIDw8IDE7Ci0gIC8qIDEgLSBzdGFnZSAwICovIHBjbV9iICs9IChNVUxfMTZTXzE2Uyg5Mzk5LCBidWZmZXJbNDRdKSkgPDwgMzsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDE3Mzk3LCBidWZmZXJbNTJdKSkgPDwgMTsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDI2NDc5LCBidWZmZXJbNjBdKSkgPj4gMjsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDIzMTY3LCBidWZmZXJbNjhdKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDAgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDgyMzUsIGJ1ZmZlcls3Nl0pKSA+PiAzOwotICAvKiAxIC0gc3RhZ2UgMCAqLyBwY21fYiAvPSAzMjc2ODsKLSAgQ0xJUF9JTlQxNihwY21fYik7Ci0gIHBjbVswIDw8IHN0cmlkZVNoaWZ0XSA9IChpbnQxNl90KXBjbV9iOwotICAvKiAxIC0gc3RhZ2UgMSAqLyBwY21fYSA9IDA7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9iID0gMDsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKC0zMjYzLCBidWZmZXJbNV0pKSA+PiA1OwotICAvKiAxIC0gc3RhZ2UgMSAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoOTI5MywgYnVmZmVyWzVdKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDI5MjkzLCBidWZmZXJbMTFdKSkgPj4gNTsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKC02MDg3LCBidWZmZXJbMTFdKSkgPj4gMjsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKC01MjI5LCBidWZmZXJbMjFdKSk7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9iICs9IChNVUxfMTZTXzE2UygxMjQ3LCBidWZmZXJbMjFdKSkgPDwgMzsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDMwODM1LCBidWZmZXJbMjddKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKC0yODkzLCBidWZmZXJbMjddKSkgPDwgMzsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKC0yNzAyMSwgYnVmZmVyWzM3XSkpIDw8IDE7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9iICs9IChNVUxfMTZTXzE2UygyMzY3MSwgYnVmZmVyWzM3XSkpIDw8IDI7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygzMTYzMywgYnVmZmVyWzQzXSkpIDw8IDE7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9iICs9IChNVUxfMTZTXzE2UygxODA1NSwgYnVmZmVyWzQzXSkpIDw8IDE7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygxNzMxOSwgYnVmZmVyWzUzXSkpIDw8IDE7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9iICs9IChNVUxfMTZTXzE2UygxMTUzNywgYnVmZmVyWzUzXSkpID4+IDE7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygyNjY2MywgYnVmZmVyWzU5XSkpID4+IDI7Ci0gIC8qIDEgLSBzdGFnZSAxICovIHBjbV9iICs9IChNVUxfMTZTXzE2UygxNzQ3LCBidWZmZXJbNTldKSkgPDwgMTsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDQ1NTUsIGJ1ZmZlcls2OV0pKSA+PiAxOwotICAvKiAxIC0gc3RhZ2UgMSAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoNjg1LCBidWZmZXJbNjldKSkgPDwgMTsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDEyNDE5LCBidWZmZXJbNzVdKSkgPj4gNDsKLSAgLyogMSAtIHN0YWdlIDEgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDg3MjEsIGJ1ZmZlcls3NV0pKSA+PiA3OwotICAvKiAxIC0gc3RhZ2UgMSAqLyBwY21fYSAvPSAzMjc2ODsKLSAgQ0xJUF9JTlQxNihwY21fYSk7Ci0gIHBjbVsxIDw8IHN0cmlkZVNoaWZ0XSA9IChpbnQxNl90KXBjbV9hOwotICAvKiAxIC0gc3RhZ2UgMSAqLyBwY21fYiAvPSAzMjc2ODsKLSAgQ0xJUF9JTlQxNihwY21fYik7Ci0gIHBjbVs3IDw8IHN0cmlkZVNoaWZ0XSA9IChpbnQxNl90KXBjbV9iOwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYSA9IDA7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9iID0gMDsKLSAgLyogMSAtIHN0YWdlIDIgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKC0xMDM4NSwgYnVmZmVyWzZdKSkgPj4gNjsKLSAgLyogMSAtIHN0YWdlIDIgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDExMTY3LCBidWZmZXJbNl0pKSA+PiA0OwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoMjQ5OTUsIGJ1ZmZlclsxMF0pKSA+PiA1OwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoLTEwMzM3LCBidWZmZXJbMTBdKSkgPj4gNDsKLSAgLyogMSAtIHN0YWdlIDIgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKC0zMDksIGJ1ZmZlclsyMl0pKSA8PCA0OwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoMTkxNywgYnVmZmVyWzIyXSkpIDw8IDI7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9hICs9IChNVUxfMTZTXzE2Uyg5MTYxLCBidWZmZXJbMjZdKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDIgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKC0zMDYwNSwgYnVmZmVyWzI2XSkpID4+IDE7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygtMjMwNjMsIGJ1ZmZlclszOF0pKSA8PCAxOwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoODMxNywgYnVmZmVyWzM4XSkpIDw8IDM7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygyNzU2MSwgYnVmZmVyWzQyXSkpIDw8IDE7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9iICs9IChNVUxfMTZTXzE2Uyg5NTUzLCBidWZmZXJbNDJdKSkgPDwgMjsKLSAgLyogMSAtIHN0YWdlIDIgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDIzMDksIGJ1ZmZlcls1NF0pKSA8PCAzOwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoMjIxMTcsIGJ1ZmZlcls1NF0pKSA+PiA0OwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoMTI3MDUsIGJ1ZmZlcls1OF0pKSA+PiAxOwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoMTYzODMsIGJ1ZmZlcls1OF0pKSA+PiAyOwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoNjIzOSwgYnVmZmVyWzcwXSkpID4+IDM7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9iICs9IChNVUxfMTZTXzE2Uyg3NTQzLCBidWZmZXJbNzBdKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDIgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDkyNTEsIGJ1ZmZlcls3NF0pKSA+PiA0OwotICAvKiAxIC0gc3RhZ2UgMiAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoODYwMywgYnVmZmVyWzc0XSkpID4+IDY7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9hIC89IDMyNzY4OwotICBDTElQX0lOVDE2KHBjbV9hKTsKLSAgcGNtWzIgPDwgc3RyaWRlU2hpZnRdID0gKGludDE2X3QpcGNtX2E7Ci0gIC8qIDEgLSBzdGFnZSAyICovIHBjbV9iIC89IDMyNzY4OwotICBDTElQX0lOVDE2KHBjbV9iKTsKLSAgcGNtWzYgPDwgc3RyaWRlU2hpZnRdID0gKGludDE2X3QpcGNtX2I7Ci0gIC8qIDEgLSBzdGFnZSAzICovIHBjbV9hID0gMDsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2IgPSAwOwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoLTE2NDU3LCBidWZmZXJbN10pKSA+PiA2OwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoMTY5MTMsIGJ1ZmZlcls3XSkpID4+IDU7Ci0gIC8qIDEgLSBzdGFnZSAzICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygxOTA4MywgYnVmZmVyWzldKSkgPj4gNTsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKC04NDQzLCBidWZmZXJbOV0pKSA+PiA3OwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoLTIzNjQxLCBidWZmZXJbMjNdKSkgPj4gMjsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDM2ODcsIGJ1ZmZlclsyM10pKSA8PCAxOwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoLTI5MDE1LCBidWZmZXJbMjVdKSkgPj4gNDsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKC0zMDEsIGJ1ZmZlclsyNV0pKSA8PCA1OwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoLTEyODg5LCBidWZmZXJbMzldKSkgPDwgMjsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDE1NDQ3LCBidWZmZXJbMzldKSkgPDwgMjsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDYxNDUsIGJ1ZmZlcls0MV0pKSA8PCAzOwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoMTAyNTUsIGJ1ZmZlcls0MV0pKSA8PCAyOwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoMjQyMTEsIGJ1ZmZlcls1NV0pKSA+PiAxOwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoLTE4MjMzLCBidWZmZXJbNTVdKSkgPj4gMzsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDIzNDY5LCBidWZmZXJbNTddKSkgPj4gMjsKLSAgLyogMSAtIHN0YWdlIDMgKi8gcGNtX2IgKz0gKE1VTF8xNlNfMTZTKDk0MDUsIGJ1ZmZlcls1N10pKSA+PiAxOwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoMjEyMjMsIGJ1ZmZlcls3MV0pKSA+PiA4OwotICAvKiAxIC0gc3RhZ2UgMyAqLyBwY21fYiArPSAoTVVMXzE2U18xNlMoMTQ5OSwgYnVmZmVyWzcxXSkpID4+IDE7Ci0gIC8qIDEgLSBzdGFnZSAzICovIHBjbV9hICs9IChNVUxfMTZTXzE2UygyNjkxMywgYnVmZmVyWzczXSkpID4+IDY7Ci0gIC8qIDEgLSBzdGFnZSAzICovIHBjbV9iICs9IChNVUxfMTZTXzE2UygyNjE4OSwgYnVmZmVyWzczXSkpID4+IDc7Ci0gIC8qIDEgLSBzdGFnZSAzICovIHBjbV9hIC89IDMyNzY4OwotICBDTElQX0lOVDE2KHBjbV9hKTsKLSAgcGNtWzMgPDwgc3RyaWRlU2hpZnRdID0gKGludDE2X3QpcGNtX2E7Ci0gIC8qIDEgLSBzdGFnZSAzICovIHBjbV9iIC89IDMyNzY4OwotICBDTElQX0lOVDE2KHBjbV9iKTsKLSAgcGNtWzUgPDwgc3RyaWRlU2hpZnRdID0gKGludDE2X3QpcGNtX2I7Ci0gIC8qIDEgLSBzdGFnZSA0ICovIHBjbV9hID0gMDsKLSAgLyogMSAtIHN0YWdlIDQgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDEwNDQ1LCBidWZmZXJbOF0pKSA+PiA0OwotICAvKiAxIC0gc3RhZ2UgNCAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoLTUyOTcsIGJ1ZmZlclsyNF0pKSA8PCAxOwotICAvKiAxIC0gc3RhZ2UgNCAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoMjIyOTksIGJ1ZmZlcls0MF0pKSA8PCAyOwotICAvKiAxIC0gc3RhZ2UgNCAqLyBwY21fYSArPSAoTVVMXzE2U18xNlMoMTA2MDMsIGJ1ZmZlcls1Nl0pKTsKLSAgLyogMSAtIHN0YWdlIDQgKi8gcGNtX2EgKz0gKE1VTF8xNlNfMTZTKDk1MzksIGJ1ZmZlcls3Ml0pKSA+PiA0OwotICAvKiAxIC0gc3RhZ2UgNCAqLyBwY21fYSAvPSAzMjc2ODsKLSAgQ0xJUF9JTlQxNihwY21fYSk7Ci0gIHBjbVs0IDw8IHN0cmlkZVNoaWZ0XSA9IChpbnQxNl90KXBjbV9hOwotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2Uvc3ludGhlc2lzLWRjdDguYyBiL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3N5bnRoZXNpcy1kY3Q4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZmU3NTMuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9kZWNvZGVyL3NyY2Uvc3ludGhlc2lzLWRjdDguYworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMyAtIDIwMDQgT3BlbiBJbnRlcmZhY2UgTm9ydGggQW1lcmljYSwgSW5jLiBBbGwgcmlnaHRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICRSZXZpc2lvbjogIzEgJAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqIEBmaWxlCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqQGFkZGdyb3VwIGNvZGVjX2ludGVybmFsKi8KLS8qKkB7Ki8KLQotLyoKLSAqIFBlcmZvcm1zIGFuIDgtcG9pbnQgVHlwZS1JSSBzY2FsZWQgRENUIHVzaW5nIHRoZSBBcmFpLUFndWktTmFrYWppbWEKLSAqIGZhY3Rvcml6YXRpb24uIFRoZSBzY2FsaW5nIGZhY3RvcnMgYXJlIGZvbGRlZCBpbnRvIHRoZSB3aW5kb3dpbmcKLSAqIGNvbnN0YW50cy4gMjkgYWRkcyBhbmQgNSAxNngzMiBtdWx0aXBsaWVzIHBlciA4IHNhbXBsZXMuCi0gKi8KLQotI2luY2x1ZGUgIm9pX2NvZGVjX3NiY19wcml2YXRlLmgiCi0KLSNkZWZpbmUgQUFOX0M0X0ZJWCAoNzU5MjUwMTI1KSAvKiBTMS4zMCAgNzU5MjUwMTI1ICAgMC43MDcxMDcqLwotCi0jZGVmaW5lIEFBTl9DNl9GSVggKDQxMDkwMzIwNykgLyogUzEuMzAgIDQxMDkwMzIwNyAgIDAuMzgyNjgzKi8KLQotI2RlZmluZSBBQU5fUTBfRklYICg1ODExMDQ4ODgpIC8qIFMxLjMwICA1ODExMDQ4ODggICAwLjU0MTE5NiovCi0KLSNkZWZpbmUgQUFOX1ExX0ZJWCAoMTQwMjkxMTMwMSkgLyogUzEuMzAgMTQwMjkxMTMwMSAgIDEuMzA2NTYzKi8KLQotLyoqIFNjYWxlcyB4IGJ5IHkgYml0cyB0byB0aGUgcmlnaHQsIGFkZGluZyBhIHJvdW5kaW5nIGZhY3Rvci4KLSAqLwotI2lmbmRlZiBTQ0FMRQotI2RlZmluZSBTQ0FMRSh4LCB5KSAoKCh4KSArICgxIDw8ICgoeSktMSkpKSA+PiAoeSkpCi0jZW5kaWYKLQotLyoqCi0gKiBEZWZhdWx0IEMgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gb2YgYSAzMngzMi0+MzIgbXVsdGlwbHkuIFRoaXMgZnVuY3Rpb24gbWF5Ci0gKiBiZSByZXBsYWNlZCBieSBhIHBsYXRmb3JtLXNwZWNpZmljIHZlcnNpb24gZm9yIHNwZWVkLgotICoKLSAqIEBwYXJhbSB1IEEgc2lnbmVkIDMyLWJpdCBtdWx0aXBsaWNhbmQKLSAqIEBwYXJhbSB2IEEgc2lnbmVkIDMyLWJpdCBtdWx0aXBsaWVyCi0KLSAqIEByZXR1cm4gIEEgc2lnbmVkIDMyLWJpdCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMiBtb3N0IHNpZ25pZmljYW50IGJpdHMKLSAqIG9mIHRoZSA2NC1iaXQgcHJvZHVjdCBvZiB1IGFuZCB2LgotICovCi1JTkxJTkUgaW50MzJfdCBkZWZhdWx0X211bF8zMnNfMzJzX2hpKGludDMyX3QgdSwgaW50MzJfdCB2KSB7Ci0gIHVpbnQzMl90IHUwLCB2MDsKLSAgaW50MzJfdCB1MSwgdjEsIHcxLCB3MiwgdDsKLQotICB1MCA9IHUgJiAweEZGRkY7Ci0gIHUxID0gdSA+PiAxNjsKLSAgdjAgPSB2ICYgMHhGRkZGOwotICB2MSA9IHYgPj4gMTY7Ci0gIHQgPSB1MCAqIHYwOwotICB0ID0gdTEgKiB2MCArICgodWludDMyX3QpdCA+PiAxNik7Ci0gIHcxID0gdCAmIDB4RkZGRjsKLSAgdzIgPSB0ID4+IDE2OwotICB3MSA9IHUwICogdjEgKyB3MTsKLSAgcmV0dXJuIHUxICogdjEgKyB3MiArICh3MSA+PiAxNik7Ci19Ci0KLSNkZWZpbmUgTVVMXzMyU18zMlNfSEkoX3gsIF95KSBkZWZhdWx0X211bF8zMnNfMzJzX2hpKF94LCBfeSkKLQotI2lmZGVmIERFQlVHX0RDVAotUFJJVkFURSB2b2lkIGZsb2F0X2RjdDJfOChmbG9hdCogUkVTVFJJQ1Qgb3V0LCBpbnQzMl90IGNvbnN0KiBSRVNUUklDVCBpbikgewotI2RlZmluZSBGSVgoeCwgYml0cykgXAotICAoKChpbnQpZmxvb3IoMC41ZiArICgoeCkgKiAoKGZsb2F0KSgxIDw8IGJpdHMpKSkpKSAvICgoZmxvYXQpKDEgPDwgYml0cykpKQotI2RlZmluZSBGTE9BVF9CVVRURVJGTFkoeCwgeSkgXAotICB4ICs9IHk7ICAgICAgICAgICAgICAgICAgICAgXAotICB5ID0geCAtICh5ICogMik7ICAgICAgICAgICAgXAotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoeCkpOyAgXAotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoeSkpOwotI2RlZmluZSBGTE9BVF9NVUxUX0RDVChLLCBzYW1wbGUpIChGSVgoSywgMjApICogc2FtcGxlKQotI2RlZmluZSBGTE9BVF9TQ0FMRSh4LCB5KSAoKCh4KSAvIChkb3VibGUpKDEgPDwgKHkpKSkpCi0KLSAgZG91YmxlIEwwMCwgTDAxLCBMMDIsIEwwMywgTDA0LCBMMDUsIEwwNiwgTDA3OwotICBkb3VibGUgTDI1OwotCi0gIGRvdWJsZSBpbjAsIGluMSwgaW4yLCBpbjM7Ci0gIGRvdWJsZSBpbjQsIGluNSwgaW42LCBpbjc7Ci0KLSAgaW4wID0gRkxPQVRfU0NBTEUoaW5bMF0sIERDVElJXzhfU0hJRlRfSU4pOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoaW4wKSk7Ci0gIGluMSA9IEZMT0FUX1NDQUxFKGluWzFdLCBEQ1RJSV84X1NISUZUX0lOKTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDMyKGluMSkpOwotICBpbjIgPSBGTE9BVF9TQ0FMRShpblsyXSwgRENUSUlfOF9TSElGVF9JTik7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihpbjIpKTsKLSAgaW4zID0gRkxPQVRfU0NBTEUoaW5bM10sIERDVElJXzhfU0hJRlRfSU4pOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoaW4zKSk7Ci0gIGluNCA9IEZMT0FUX1NDQUxFKGluWzRdLCBEQ1RJSV84X1NISUZUX0lOKTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDMyKGluNCkpOwotICBpbjUgPSBGTE9BVF9TQ0FMRShpbls1XSwgRENUSUlfOF9TSElGVF9JTik7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihpbjUpKTsKLSAgaW42ID0gRkxPQVRfU0NBTEUoaW5bNl0sIERDVElJXzhfU0hJRlRfSU4pOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoaW42KSk7Ci0gIGluNyA9IEZMT0FUX1NDQUxFKGluWzddLCBEQ1RJSV84X1NISUZUX0lOKTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDMyKGluNykpOwotCi0gIEwwMCA9IChpbjAgKyBpbjcpOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDAwKSk7Ci0gIEwwMSA9IChpbjEgKyBpbjYpOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDAxKSk7Ci0gIEwwMiA9IChpbjIgKyBpbjUpOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDAyKSk7Ci0gIEwwMyA9IChpbjMgKyBpbjQpOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDAzKSk7Ci0KLSAgTDA0ID0gKGluMyAtIGluNCk7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDQpKTsKLSAgTDA1ID0gKGluMiAtIGluNSk7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDUpKTsKLSAgTDA2ID0gKGluMSAtIGluNik7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDYpKTsKLSAgTDA3ID0gKGluMCAtIGluNyk7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDcpKTsKLQotICBGTE9BVF9CVVRURVJGTFkoTDAwLCBMMDMpOwotICBGTE9BVF9CVVRURVJGTFkoTDAxLCBMMDIpOwotCi0gIEwwMiArPSBMMDM7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDIpKTsKLQotICBMMDIgPSBGTE9BVF9NVUxUX0RDVChBQU5fQzRfRkxPQVQsIEwwMik7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDIpKTsKLQotICBGTE9BVF9CVVRURVJGTFkoTDAwLCBMMDEpOwotCi0gIG91dFswXSA9IChmbG9hdClGTE9BVF9TQ0FMRShMMDAsIERDVElJXzhfU0hJRlRfMCk7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQxNihvdXRbMF0pKTsKLSAgb3V0WzRdID0gKGZsb2F0KUZMT0FUX1NDQUxFKEwwMSwgRENUSUlfOF9TSElGVF80KTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDE2KG91dFs0XSkpOwotCi0gIEZMT0FUX0JVVFRFUkZMWShMMDMsIEwwMik7Ci0gIG91dFs2XSA9IChmbG9hdClGTE9BVF9TQ0FMRShMMDIsIERDVElJXzhfU0hJRlRfNik7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQxNihvdXRbNl0pKTsKLSAgb3V0WzJdID0gKGZsb2F0KUZMT0FUX1NDQUxFKEwwMywgRENUSUlfOF9TSElGVF8yKTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDE2KG91dFsyXSkpOwotCi0gIEwwNCArPSBMMDU7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMDQpKTsKLSAgTDA1ICs9IEwwNjsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDMyKEwwNSkpOwotICBMMDYgKz0gTDA3OwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDA2KSk7Ci0KLSAgTDA0IC89IDI7Ci0gIEwwNSAvPSAyOwotICBMMDYgLz0gMjsKLSAgTDA3IC89IDI7Ci0KLSAgTDA1ID0gRkxPQVRfTVVMVF9EQ1QoQUFOX0M0X0ZMT0FULCBMMDUpOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDA1KSk7Ci0KLSAgTDI1ID0gTDA2IC0gTDA0OwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDI1KSk7Ci0gIEwyNSA9IEZMT0FUX01VTFRfRENUKEFBTl9DNl9GTE9BVCwgTDI1KTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDMyKEwyNSkpOwotCi0gIEwwNCA9IEZMT0FUX01VTFRfRENUKEFBTl9RMF9GTE9BVCwgTDA0KTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDMyKEwwNCkpOwotICBMMDQgLT0gTDI1OwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDA0KSk7Ci0KLSAgTDA2ID0gRkxPQVRfTVVMVF9EQ1QoQUFOX1ExX0ZMT0FULCBMMDYpOwotICBPSV9BU1NFUlQoVkFMSURfSU5UMzIoTDA2KSk7Ci0gIEwwNiAtPSBMMjU7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQzMihMMjUpKTsKLQotICBGTE9BVF9CVVRURVJGTFkoTDA3LCBMMDUpOwotCi0gIEZMT0FUX0JVVFRFUkZMWShMMDUsIEwwNCk7Ci0gIG91dFszXSA9IChmbG9hdCkoRkxPQVRfU0NBTEUoTDA0LCBEQ1RJSV84X1NISUZUXzMgLSAxKSk7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQxNihvdXRbM10pKTsKLSAgb3V0WzVdID0gKGZsb2F0KShGTE9BVF9TQ0FMRShMMDUsIERDVElJXzhfU0hJRlRfNSAtIDEpKTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDE2KG91dFs1XSkpOwotCi0gIEZMT0FUX0JVVFRFUkZMWShMMDcsIEwwNik7Ci0gIG91dFs3XSA9IChmbG9hdCkoRkxPQVRfU0NBTEUoTDA2LCBEQ1RJSV84X1NISUZUXzcgLSAxKSk7Ci0gIE9JX0FTU0VSVChWQUxJRF9JTlQxNihvdXRbN10pKTsKLSAgb3V0WzFdID0gKGZsb2F0KShGTE9BVF9TQ0FMRShMMDcsIERDVElJXzhfU0hJRlRfMSAtIDEpKTsKLSAgT0lfQVNTRVJUKFZBTElEX0lOVDE2KG91dFsxXSkpOwotfQotI3VuZGVmIEJVVFRFUkZMWQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIEFBTiBEQ1QuIEl0cyBpbnB1dHMgYXJlIGluIFMxNi4xNSBmb3JtYXQsIGFzCi0gKiByZXR1cm5lZCBieSBPSV9TQkNfRGVxdWFudC4gSW4gcHJhY3RpY2UsIGFicyhpblt4XSkgPCA1MjQyOS4wIC8gMS4zOAotICogKDEyNDQ5MTgwNTcgaW50ZWdlcikuIFRoZSBmdW5jdGlvbiBpdCBjb21wdXRlcyBpcyBhbiBhcHByb3hpbWF0aW9uIHRvIHRoZQotICogYXJyYXkgZGVmaW5lZCBieToKLSAqCi0gKiBkaWFnKGFhbl9zKSAqIEFBTj0gQzIKLSAqCi0gKiAgIG9yCi0gKgotICogQUFOID0gZGlhZygxL2Fhbl9zKSAqIEMyCi0gKgotICogd2hlcmUgQzIgaXMgYXMgaXQgaXMgZGVmaW5lZCBpbiB0aGUgY29tbWVudCBhdCB0aGUgaGVhZCBvZiB0aGlzIGZpbGUsIGFuZAotICoKLSAqIGFhbl9zW2ldID0gYWFuX3MgPSAxLygyKmNvcyhpKnBpLzE2KSkgd2l0aCBpID0gMS4uNywgYWFuX3NbMF0gPSAxOwotICoKLSAqIGFhbl9zW2ldID0gWyAxLjAwMCAgMC41MTAgIDAuNTQxICAwLjYwMSAgMC43MDcgIDAuOTAwICAxLjMwNyAgMi41NjMgXQotICoKLSAqIFRoZSBvdXRwdXQgcmFuZ2VzIGFyZSBzaG93biBhcyBmb2xsb3dzOgotICoKLSAqIExldCBZWzAuLjddID0gQUFOICogWFswLi43XQotICoKLSAqIFdpdGhvdXQgbG9zcyBvZiBnZW5lcmFsaXR5LCBhc3N1bWUgdGhlIGlucHV0IHZlY3RvciBYIGNvbnNpc3RzIG9mIGVsZW1lbnRzCi0gKiBiZXR3ZWVuIC0xIGFuZCAxLiBUaGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBvZiBhIGdpdmVuIG91dHB1dCBlbGVtZW50IG9jY3VycwotICogd2l0aCBzb21lIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2YgaW5wdXQgdmVjdG9yIGVsZW1lbnRzIGVhY2ggb2Ygd2hpY2ggaXMgLTEKLSAqIG9yIDEuIENvbnNpZGVyIHRoZSBjb21wdXRhdGlvbiBvZiBZW2ldLiBZW2ldID0gc3VtIHQ9MC4uNyBvZiBBQU5bdCxpXSpYW2ldLiBZCi0gKiBpcyBtYXhpbWl6ZWQgaWYgdGhlIHNpZ24gb2YgWFtpXSBtYXRjaGVzIHRoZSBzaWduIG9mIEFBTlt0LGldLCBlbnN1cmluZyBhCi0gKiBwb3NpdGl2ZSBjb250cmlidXRpb24gdG8gdGhlIHN1bS4gRXF1aXZhbGVudGx5LCBvbmUgbWF5IHNpbXBseSBzdW0KLSAqIGFicyhBQU4pW3QsaV0gb3ZlciB0IHRvIGdldCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBvZiBZW2ldLgotICoKLSAqIFRoaXMgeWllbGRzIGFwcHJveGltYXRlbHk6Ci0gKiAgWzguMDAgIDEwLjA1ICAgOS42NiAgIDguNTIgICA4LjAwICAgNS43MCAgIDQuMDAgICAyLjAwXQotICoKLSAqIEdpdmVuIHRoZSBtYXhpbXVtIG1hZ25pdHVkZSBzZW5zaWJsZSBpbnB1dCB2YWx1ZSBvZiArLy0zNzk5MiwgdGhpcyB5aWVsZHMgdGhlCi0gKiBmb2xsb3dpbmcgdmVjdG9yIG9mIG1heGltdW0gb3V0cHV0IG1hZ25pdHVkZXM6Ci0gKgotICogWyAzMDM5MzYgIDM4MTgyMCAgMzY3MDAzICAzMjM2OTIgIDMwMzkzNiAgMjE2NTU1ICAxNTE5NjggICA3NTk4NCBdCi0gKgotICogVWx0aW1hdGVseSwgdGhlc2UgdmFsdWVzIG11c3QgZml0IGludG8gMTYgYml0IHNpZ25lZCBpbnRlZ2Vycywgc28gdGhleSBtdXN0Ci0gKiBiZSBzY2FsZWQuIEEgbm9uLXVuaWZvcm0gc2NhbGluZyBoZWxwcyBtYXhpbWl6ZSB0aGUga2VwdCBwcmVjaXNpb24uIFRoZQotICogcmVsYXRpdmUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgb2YgcHJlY2lzaW9uIG1haW50YWluYWJsZSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gKiBsYXJnZXN0IHZhbHVlIGlzIGdpdmVuIGhlcmU6Ci0gKgotICogWyAwICAwICAwICAwICAwICAwICAxICAyIF0KLSAqCi0gKi8KLVBSSVZBVEUgdm9pZCBkY3QyXzgoU0JDX0JVRkZFUl9UKiBSRVNUUklDVCBvdXQsIGludDMyX3QgY29uc3QqIFJFU1RSSUNUIGluKSB7Ci0jZGVmaW5lIEJVVFRFUkZMWSh4LCB5KSBcCi0gIHggKz0gKHkpOyAgICAgICAgICAgICBcCi0gICh5KSA9ICh4KSAtICgoeSkgPDwgMSk7Ci0jZGVmaW5lIEZJWF9NVUxUX0RDVChLLCB4KSAoTVVMXzMyU18zMlNfSEkoSywgeCkgPDwgMikKLQotICBpbnQzMl90IEwwMCwgTDAxLCBMMDIsIEwwMywgTDA0LCBMMDUsIEwwNiwgTDA3OwotICBpbnQzMl90IEwyNTsKLQotICBpbnQzMl90IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgaW50MzJfdCBpbjQsIGluNSwgaW42LCBpbjc7Ci0KLSNpZiBEQ1RJSV84X1NISUZUX0lOICE9IDAKLSAgaW4wID0gU0NBTEUoaW5bMF0sIERDVElJXzhfU0hJRlRfSU4pOwotICBpbjEgPSBTQ0FMRShpblsxXSwgRENUSUlfOF9TSElGVF9JTik7Ci0gIGluMiA9IFNDQUxFKGluWzJdLCBEQ1RJSV84X1NISUZUX0lOKTsKLSAgaW4zID0gU0NBTEUoaW5bM10sIERDVElJXzhfU0hJRlRfSU4pOwotICBpbjQgPSBTQ0FMRShpbls0XSwgRENUSUlfOF9TSElGVF9JTik7Ci0gIGluNSA9IFNDQUxFKGluWzVdLCBEQ1RJSV84X1NISUZUX0lOKTsKLSAgaW42ID0gU0NBTEUoaW5bNl0sIERDVElJXzhfU0hJRlRfSU4pOwotICBpbjcgPSBTQ0FMRShpbls3XSwgRENUSUlfOF9TSElGVF9JTik7Ci0jZWxzZQotICBpbjAgPSBpblswXTsKLSAgaW4xID0gaW5bMV07Ci0gIGluMiA9IGluWzJdOwotICBpbjMgPSBpblszXTsKLSAgaW40ID0gaW5bNF07Ci0gIGluNSA9IGluWzVdOwotICBpbjYgPSBpbls2XTsKLSAgaW43ID0gaW5bN107Ci0jZW5kaWYKLQotICBMMDAgPSBpbjAgKyBpbjc7Ci0gIEwwMSA9IGluMSArIGluNjsKLSAgTDAyID0gaW4yICsgaW41OwotICBMMDMgPSBpbjMgKyBpbjQ7Ci0KLSAgTDA0ID0gaW4zIC0gaW40OwotICBMMDUgPSBpbjIgLSBpbjU7Ci0gIEwwNiA9IGluMSAtIGluNjsKLSAgTDA3ID0gaW4wIC0gaW43OwotCi0gIEJVVFRFUkZMWShMMDAsIEwwMyk7Ci0gIEJVVFRFUkZMWShMMDEsIEwwMik7Ci0KLSAgTDAyICs9IEwwMzsKLQotICBMMDIgPSBGSVhfTVVMVF9EQ1QoQUFOX0M0X0ZJWCwgTDAyKTsKLQotICBCVVRURVJGTFkoTDAwLCBMMDEpOwotCi0gIG91dFswXSA9IChpbnQxNl90KVNDQUxFKEwwMCwgRENUSUlfOF9TSElGVF8wKTsKLSAgb3V0WzRdID0gKGludDE2X3QpU0NBTEUoTDAxLCBEQ1RJSV84X1NISUZUXzQpOwotCi0gIEJVVFRFUkZMWShMMDMsIEwwMik7Ci0gIG91dFs2XSA9IChpbnQxNl90KVNDQUxFKEwwMiwgRENUSUlfOF9TSElGVF82KTsKLSAgb3V0WzJdID0gKGludDE2X3QpU0NBTEUoTDAzLCBEQ1RJSV84X1NISUZUXzIpOwotCi0gIEwwNCArPSBMMDU7Ci0gIEwwNSArPSBMMDY7Ci0gIEwwNiArPSBMMDc7Ci0KLSAgTDA0IC89IDI7Ci0gIEwwNSAvPSAyOwotICBMMDYgLz0gMjsKLSAgTDA3IC89IDI7Ci0KLSAgTDA1ID0gRklYX01VTFRfRENUKEFBTl9DNF9GSVgsIEwwNSk7Ci0KLSAgTDI1ID0gTDA2IC0gTDA0OwotICBMMjUgPSBGSVhfTVVMVF9EQ1QoQUFOX0M2X0ZJWCwgTDI1KTsKLQotICBMMDQgPSBGSVhfTVVMVF9EQ1QoQUFOX1EwX0ZJWCwgTDA0KTsKLSAgTDA0IC09IEwyNTsKLQotICBMMDYgPSBGSVhfTVVMVF9EQ1QoQUFOX1ExX0ZJWCwgTDA2KTsKLSAgTDA2IC09IEwyNTsKLQotICBCVVRURVJGTFkoTDA3LCBMMDUpOwotCi0gIEJVVFRFUkZMWShMMDUsIEwwNCk7Ci0gIG91dFszXSA9IChpbnQxNl90KVNDQUxFKEwwNCwgRENUSUlfOF9TSElGVF8zIC0gMSk7Ci0gIG91dFs1XSA9IChpbnQxNl90KVNDQUxFKEwwNSwgRENUSUlfOF9TSElGVF81IC0gMSk7Ci0KLSAgQlVUVEVSRkxZKEwwNywgTDA2KTsKLSAgb3V0WzddID0gKGludDE2X3QpU0NBTEUoTDA2LCBEQ1RJSV84X1NISUZUXzcgLSAxKTsKLSAgb3V0WzFdID0gKGludDE2X3QpU0NBTEUoTDA3LCBEQ1RJSV84X1NISUZUXzEgLSAxKTsKLSN1bmRlZiBCVVRURVJGTFkKLQotI2lmZGVmIERFQlVHX0RDVAotICB7Ci0gICAgZmxvYXQgZmxvYXRfb3V0WzhdOwotICAgIGZsb2F0X2RjdDJfOChmbG9hdF9vdXQsIGluKTsKLSAgfQotI2VuZGlmCi19Ci0KLS8qKkB9Ki8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3N5bnRoZXNpcy1zYmMuYyBiL2VtYmRydi9zYmMvZGVjb2Rlci9zcmNlL3N5bnRoZXNpcy1zYmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxMTFhZS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2RlY29kZXIvc3JjZS9zeW50aGVzaXMtc2JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IE9wZW4gSW50ZXJmYWNlIE5vcnRoIEFtZXJpY2EsIEluYy4gQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZC4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAkUmV2aXNpb246ICMxICQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiBAZmlsZQotCi1UaGlzIGZpbGUsIGFsb25nIHdpdGggc3ludGhlc2lzLWdlbmVyYXRlZC5jLCBjb250YWlucyB0aGUgc3ludGhlc2lzCi1maWx0ZXJiYW5rIHJvdXRpbmVzLiBUaGUgb3BlcmF0aW9ucyBwZXJmb3JtZWQgY29ycmVzcG9uZCB0byB0aGUKLW9wZXJhdGlvbnMgZGVzY3JpYmVkIGluIEEyRFAgQXBwZW5kaXggQiwgRmlndXJlIDEyLjMuIFNldmVyYWwKLW1hdGhlbWF0aWNhbCBvcHRpbWl6YXRpb25zIGFyZSBwZXJmb3JtZWQsIHBhcnRpY3VsYXJseSBmb3IgdGhlCi04LXN1YmJhbmQgY2FzZS4KLQotT25lIGltcG9ydGFudCBvcHRpbWl6YXRpb24gaXMgdG8gbm90ZSB0aGF0IHRoZSAibWF0cml4aW5nIiBvcGVyYXRpb24KLWNhbiBiZSBkZWNvbXBvc2VkIGludG8gdGhlIHByb2R1Y3Qgb2YgYSB0eXBlIElJIGRpc2NyZXRlIGNvc2luZSBrZXJuZWwKLWFuZCBhbm90aGVyLCBzcGFyc2UgbWF0cml4LgotCi1BY2NvcmRpbmcgdG8gRmlnIDEyLjMsIGluIHRoZSA4LXN1YmJhbmQgY2FzZSwKLUBjb2RlCi0gICAgTltrXVtpXSA9IGNvcygoaSswLjUpKihrKzQpKnBpLzgpLCBrID0gMC4uMTUgYW5kIGkgPSAwLi43Ci1AZW5kY29kZQotCi1OIGNhbiBiZSBmYWN0b3JlZCBhcyBSICogQzIsIHdoZXJlIEMyIGlzIGFuIDgtcG9pbnQgdHlwZSBJSSBkaXNjcmV0ZQotY29zaW5lIGtlcm5lbCBnaXZlbiBieQotQGNvZGUKLSAgICBDMltrXVtpXSA9IGNvcygoaSswLjUpKmsqcGkvOCkpLCBrID0gMC4uNyBhbmQgaSA9IDAuLjcKLUBlbmRjb2RlCi0KLVIgdHVybnMgb3V0IHRvIGJlIGEgc3BhcnNlIDE2eDggbWF0cml4IHdpdGggdGhlIGZvbGxvd2luZyBub24temVybwotZW50cmllczoKLUBjb2RlCi0gICAgUltrXVtrKzRdICAgICAgICA9ICAxLCAgIGsgPSAwLi4zCi0gICAgUltrXVthYnMoMTItayldICA9IC0xLCAgIGsgPSA1Li4xNQotQGVuZGNvZGUKLQotVGhlIHNwZWMgZGVzY3JpYmVzIGNvbXB1dGluZyBWWzAuLjE1XSBhcyBOICogUi4KLUBjb2RlCi0gICAgVlswLi4xNV0gPSBOICogUiA9IChSICogQzIpICogUiA9IFIgKiAoQzIgKiBSKQotQGVuZGNvZGUKLQotQzIgKiBSIGNvcnJlc3BvbmRzIHRvIGNvbXB1dGluZyB0aGUgZGlzY3JldGUgY29zaW5lIHRyYW5zZm9ybSBvZiBSLCBzbwotVlswLi4xNV0gY2FuIGJlIGNvbXB1dGVkIGJ5IHRha2luZyB0aGUgRENUIG9mIFIgZm9sbG93ZWQgYnkgYXNzaWdubWVudAotYW5kIHNlbGVjdGl2ZSBuZWdhdGlvbiBvZiB0aGUgRENUIHJlc3VsdCBpbnRvIFYuCi0KLSAgICAgICAgQWx0aG91Z2ggdGhpcyB3YXMgZGVyaXZlZCBlbXBpcmljYWxseSB1c2luZyBHTlUgT2N0YXZlLCBpdCBpcwotICAgICAgICBmb3JtYWxseSBkZW1vbnN0cmF0ZWQgaW4sIGUuZy4sIExpdSwgQ2hpLU1pbiBhbmQgTGVlLAotICAgICAgICBXZW4tQ2hpZWguICJBIFVuaWZpZWQgRmFzdCBBbGdvcml0aG0gZm9yIENvc2luZSBNb2R1bGF0ZWQKLSAgICAgICAgRmlsdGVyIEJhbmtzIGluIEN1cnJlbnQgQXVkaW8gQ29kaW5nIFN0YW5kYXJkcy4iIEpvdXJuYWwgb2YKLSAgICAgICAgdGhlIEFFUyA0NyAoRGVjZW1iZXIgMTk5OSk6IDEwNjEuCi0KLUdpdmVuIHRoZSBzaGlmdCBvcGVyYXRpb24gcGVyZm9ybWVkIHByaW9yIHRvIGNvbXB1dGluZyBWWzAuLjE1XSwgaXQgaXMKLWNsZWFyIHRoYXQgVlswLi4xNTldIHJlcHJlc2VudHMgYSByb2xsaW5nIGhpc3Rvcnkgb2YgdGhlIDEwIG1vc3QKLXJlY2VudCBncm91cHMgb2YgYmxvY2tzIGlucHV0IHRvIHRoZSBzeW50aGVzaXMgb3BlcmF0aW9uLiBJbnRlcnByZXRpbmcKLXRoZSBtYXRyaXggTiBpbiBsaWdodCBvZiBpdHMgZmFjdG9yaXphdGlvbiBpbnRvIEMyIGFuZCBSLCBSJ3MKLXNwYXJzZW5lc3MgaGFzIGltcGxpY2F0aW9ucyBmb3IgaW50ZXJwcmV0aW5nIHRoZSB2YWx1ZXMgaW4gVi4gSW4KLXBhcnRpY3VsYXIsIHRoZXJlIGlzIGNvbnNpZGVyYWJsZSByZWR1bmRhbmN5IGluIHRoZSB2YWx1ZXMgc3RvcmVkIGluCi1WLiBGdXJ0aGVybW9yZSwgc2luY2UgUls0XVswLi43XSBhcmUgYWxsIHplcm9zLCBvbmUgb3V0IG9mIGV2ZXJ5IDE2Ci12YWx1ZXMgaW4gViB3aWxsIGJlIHplcm8gcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZGF0YS4gV2l0aGluIGVhY2gKLWJsb2NrIG9mIDE2IHZhbHVlcyBpbiBWLCBmdWxseSBoYWxmIG9mIHRoZW0gYXJlIHJlZHVuZGFudCBvcgotaXJyZWxldmFudDoKLQotQGNvZGUKLSAgICBWWyAwXSA9ICBEQ1RbNF0KLSAgICBWWyAxXSA9ICBEQ1RbNV0KLSAgICBWWyAyXSA9ICBEQ1RbNl0KLSAgICBWWyAzXSA9ICBEQ1RbN10KLSAgICBWWyA0XSA9IDAKLSAgICBWWyA1XSA9IC1EQ1RbN10gPSAtVlszXSAocmVkdW5kYW50KQotICAgIFZbIDZdID0gLURDVFs2XSA9IC1WWzJdIChyZWR1bmRhbnQpCi0gICAgVlsgN10gPSAtRENUWzVdID0gLVZbMV0gKHJlZHVuZGFudCkKLSAgICBWWyA4XSA9IC1EQ1RbNF0gPSAtVlswXSAocmVkdW5kYW50KQotICAgIFZbIDldID0gLURDVFszXQotICAgIFZbMTBdID0gLURDVFsyXQotICAgIFZbMTFdID0gLURDVFsxXQotICAgIFZbMTJdID0gLURDVFswXQotICAgIFZbMTNdID0gLURDVFsxXSA9IFZbMTFdIChyZWR1bmRhbnQpCi0gICAgVlsxNF0gPSAtRENUWzJdID0gVlsxMF0gKHJlZHVuZGFudCkKLSAgICBWWzE1XSA9IC1EQ1RbM10gPSBWWyA5XSAocmVkdW5kYW50KQotQGVuZGNvZGUKLQotU2luY2UgdGhlIGVsZW1lbnRzIG9mIFYgYmV5b25kIDE1IHdlcmUgb3JpZ2luYWxseSBjb21wdXRlZCB0aGUgc2FtZQotd2F5IGR1cmluZyBhIHByZXZpb3VzIHJ1biwgd2hhdCBob2xkcyB0cnVlIGZvciBWW3hdIGFsc28gaG9sZHMgdHJ1ZQotZm9yIFZbeCsxNl0uIFRodXMsIHNvIGxvbmcgYXMgY2FyZSBpcyB0YWtlbiB0byBtYWludGFpbiB0aGUgbWFwcGluZywKLXdlIG5lZWQgb25seSBhY3R1YWxseSBzdG9yZSB0aGUgdW5pcXVlIHZhbHVlcywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUKLW91dHB1dCBvZiB0aGUgRENULCBpbiBzb21lIGNhc2VzIGludmVydGVkLiBJbiBmYWN0LCBpbnN0ZWFkIG9mIHN0b3JpbmcKLVZbMC4uMTU5XSwgd2UgY291bGQgc3RvcmUgRENUWzAuLjc5XSB3aGljaCB3b3VsZCBjb250YWluIGEgaGlzdG9yeSBvZgotRENUIHJlc3VsdHMuIE1vcmUgb24gdGhpcyBpbiBhIGJpdC4KLQotR29pbmcgYmFjayB0byBmaWd1cmUgMTIuMyBpbiB0aGUgc3BlYywgaXQgc2hvdWxkIGJlIGNsZWFyIHRoYXQgdGhlCi12ZWN0b3IgVSBuZWVkIG5vdCBhY3R1YWxseSBiZSBleHBsaWNpdGx5IGNvbnN0cnVjdGVkLCBidXQgdGhhdCB3aXRoCi1zdWl0YWJsZSBpbmRleGluZyBpbnRvIFYgZHVyaW5nIHRoZSB3aW5kb3cgb3BlcmF0aW9uLCB0aGUgc2FtZSBlbmQgY2FuCi1iZSBhY2NvbXBsaXNoZWQuIEluIHRoZSBzYW1lIHNwaXJpdCBvZiB0aGUgcHNldWRvY29kZSBzaG93biBpbiB0aGUKLWZpZ3VyZSwgdGhlIGZvbGxvd2luZyBpcyB0aGUgY29uc3RydWN0aW9uIG9mIFcgd2l0aG91dCB1c2luZyBVOgotCi1AY29kZQotICAgIGZvciBpPTAgdG8gNzkgZG8KLSAgICAgICAgV1tpXSA9IERbaV0qVlNJR04oaSkqVltyZW1hcF9WKGkpXSB3aGVyZSByZW1hcF9WKGkpID0gMzIqKGludChpLzE2KSkgKwotKGkgJSAxNikgKyAoaSAlIDE2ID49IDggPyAxNiA6IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgVlNJR04oaSkgbWFwcyBpJTE2IGludG8gezEsIDEsCi0xLCAxLCAwLCAtMSwgLTEsIC0xLCAtMSwgMSwgMSwgMSwgMSwgMSwgMSB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25zIG9mIHRoZSByZWR1bmRhbnQgdmFsdWVzIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93biBpbiB0aGUgZXhwbGFuYXRpb24gdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaHMgYWJvdmUuCi1AZW5kY29kZQotCi1XZSBzYXcgYWJvdmUgaG93IFZbNC4uOCwxMy4uMTVdIChhbmQgYnkgZXh0ZW5zaW9uCi1WWyg0Li44LDEzLi4xNSkrMTYqbl0pIGNhbiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mIG90aGVyIGVsZW1lbnRzCi13aXRoaW4gdGhlIHN1YmJsb2NrIG9mIFYuIFZbMC4uMyw5Li4xMl0gY29ycmVzcG9uZCB0byBEQ1QgZWxlbWVudHMuCi0KLUBjb2RlCi0gICAgZm9yIGk9MCB0byA3OSBkbwotICAgICAgICBXW2ldID0gRFtpXSpEU0lHTihpKSpEQ1RbcmVtYXBfRENUKGkpXQotQGVuZGNvZGUKLQotVGhlIERDVCBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBBcmFpLUFndWktTmFrYWppbWEgZmFjdG9yaXphdGlvbiwKLXdoaWNoIHNhdmVzIHNvbWUgY29tcHV0YXRpb24gYnkgcHJvZHVjaW5nIG91dHB1dCB0aGF0IG5lZWRzIHRvIGJlCi1tdWx0aXBsaWVkIGJ5IHNjYWxpbmcgZmFjdG9ycyBiZWZvcmUgYmVpbmcgdXNlZC4KLQotQGNvZGUKLSAgICBmb3IgaT0wIHRvIDc5IGRvCi0gICAgICAgIFdbaV0gPSBEW2ldKlNDQUxFW2klOF0qQUFOX0RDVFtyZW1hcF9EQ1QoaSldCi1AZW5kY29kZQotCi1EIGNhbiBiZSBwcmVtdWx0aXBsaWVkIHdpdGggdGhlIERDVCBzY2FsaW5nIGZhY3RvcnMgdG8geWllbGQKLQotQGNvZGUKLSAgICBmb3IgaT0wIHRvIDc5IGRvCi0gICAgICAgIFdbaV0gPSBEU0NBTEVEW2ldKkFBTl9EQ1RbcmVtYXBfRENUKGkpXSB3aGVyZSBEU0NBTEVEW2ldID0KLURbaV0qU0NBTEVbaSU4XQotQGVuZGNvZGUKLQotVGhlIG91dHB1dCBzYW1wbGVzIFhbMC4uN10gYXJlIGRlZmluZWQgYXMgc3VtcyBvZiBXOgotCi1AY29kZQotICAgICAgICBYW2pdID0gc3Vte2k9MC4uOX0oV1tqKzgqaV0pCi1AZW5kY29kZQotCi1AaW5ncm91cCBjb2RlY19pbnRlcm5hbAotKi8KLQotLyoqCi1AYWRkdG9ncm91cCBjb2RlY19pbnRlcm5hbAotQHsKLSovCi0KLSNpbmNsdWRlICJvaV9jb2RlY19zYmNfcHJpdmF0ZS5oIgotCi1jb25zdCBpbnQzMl90IGRlY193aW5kb3dfNFsyMV0gPSB7Ci0gICAgMCwgICAgICAvKiArMC4wMDAwMDAwMEUrMDAgKi8KLSAgICA5NywgICAgIC8qICs1LjM2NTQ4OTc2RS0wNCAqLwotICAgIDI3MCwgICAgLyogKzEuNDkxODgzNTdFLTAzICovCi0gICAgNDk1LCAgICAvKiArMi43MzM3MDkwNEUtMDMgKi8KLSAgICA2OTQsICAgIC8qICszLjgzNzIwMTkzRS0wMyAqLwotICAgIDcwNCwgICAgLyogKzMuODkyMDUxNDlFLTAzICovCi0gICAgMzM4LCAgICAvKiArMS44NjU4MTY5MUUtMDMgKi8KLSAgICAtNTU0LCAgIC8qIC0zLjA2MDEyMjg2RS0wMyAqLwotICAgIDE5NzQsICAgLyogKzEuMDkxMzc2MjBFLTAyICovCi0gICAgMzY5NywgICAvKiArMi4wNDM4NTA4N0UtMDIgKi8KLSAgICA1MjI0LCAgIC8qICsyLjg4NzU3MzkyRS0wMiAqLwotICAgIDU4MjQsICAgLyogKzMuMjE5MzkyOTBFLTAyICovCi0gICAgNDY4MSwgICAvKiArMi41ODc2NzgxMUUtMDIgKi8KLSAgICAxMTA5LCAgIC8qICs2LjEzMjQ1MTg2RS0wMyAqLwotICAgIC01MjE0LCAgLyogLTIuODgyMTcyNzRFLTAyICovCi0gICAgLTE0MDQ3LCAvKiAtNy43NjQ2MzQ5NEUtMDIgKi8KLSAgICAyNDUyOSwgIC8qICsxLjM1NTkzMjc0RS0wMSAqLwotICAgIDM1Mjc0LCAgLyogKzEuOTQ5ODc4NDFFLTAxICovCi0gICAgNDQ2MTgsICAvKiArMi40NjYzNjY2MkUtMDEgKi8KLSAgICA1MDk4NCwgIC8qICsyLjgxODI4MjAzRS0wMSAqLwotICAgIDUzMjQzLCAgLyogKzIuOTQzMTUzMzJFLTAxICovCi19OwotCi0jZGVmaW5lIERDVElJXzRfSzA2X0ZJWCAoMTE1ODUpIC8qIFMxLjE0ICAgICAgMTE1ODUgICAwLjcwNzEwNyovCi0KLSNkZWZpbmUgRENUSUlfNF9LMDhfRklYICgyMTQwNykgLyogUzEuMTQgICAgICAyMTQwNyAgIDEuMzA2NTYzKi8KLQotI2RlZmluZSBEQ1RJSV80X0swOV9GSVggKC0xNTEzNykgLyogUzEuMTQgICAgIC0xNTEzNyAgLTAuOTIzODgwKi8KLQotI2RlZmluZSBEQ1RJSV80X0sxMF9GSVggKC04ODY3KSAvKiBTMS4xNCAgICAgIC04ODY3ICAtMC41NDExOTYqLwotCi0vKiogU2NhbGVzIHggYnkgeSBiaXRzIHRvIHRoZSByaWdodCwgYWRkaW5nIGEgcm91bmRpbmcgZmFjdG9yLgotICovCi0jaWZuZGVmIFNDQUxFCi0jZGVmaW5lIFNDQUxFKHgsIHkpICgoKHgpICsgKDEgPDwgKCh5KS0xKSkpID4+ICh5KSkKLSNlbmRpZgotCi0jaWZuZGVmIENMSVBfSU5UMTYKLSNkZWZpbmUgQ0xJUF9JTlQxNih4KSAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoeCkgPiBPSV9JTlQxNl9NQVgpIHsgICAgICAgIFwKLSAgICAgICh4KSA9IE9JX0lOVDE2X01BWDsgICAgICAgICAgICBcCi0gICAgfSBlbHNlIGlmICgoeCkgPCBPSV9JTlQxNl9NSU4pIHsgXAotICAgICAgKHgpID0gT0lfSU5UMTZfTUlOOyAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotLyoqCi0gKiBEZWZhdWx0IEMgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gb2YgYSAxNngzMi0+MzIgbXVsdGlwbHkuIFRoaXMgZnVuY3Rpb24gbWF5Ci0gKiBiZSByZXBsYWNlZCBieSBhIHBsYXRmb3JtLXNwZWNpZmljIHZlcnNpb24gZm9yIHNwZWVkLgotICoKLSAqIEBwYXJhbSB1IEEgc2lnbmVkIDE2LWJpdCBtdWx0aXBsaWNhbmQKLSAqIEBwYXJhbSB2IEEgc2lnbmVkIDMyLWJpdCBtdWx0aXBsaWVyCi0KLSAqIEByZXR1cm4gIEEgc2lnbmVkIDMyLWJpdCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMiBtb3N0IHNpZ25pZmljYW50IGJpdHMKLSAqIG9mIHRoZSA0OC1iaXQgcHJvZHVjdCBvZiB1IGFuZCB2LgotICovCi1JTkxJTkUgaW50MzJfdCBkZWZhdWx0X211bF8xNnNfMzJzX2hpKGludDE2X3QgdSwgaW50MzJfdCB2KSB7Ci0gIHVpbnQxNl90IHYwOwotICBpbnQxNl90IHYxOwotCi0gIGludDMyX3QgdywgeDsKLQotICB2MCA9ICh1aW50MTZfdCkodiAmIDB4ZmZmZik7Ci0gIHYxID0gKGludDE2X3QpKHYgPj4gMTYpOwotCi0gIHcgPSB2MSAqIHU7Ci0gIHggPSB1ICogdjA7Ci0KLSAgcmV0dXJuIHcgKyAoeCA+PiAxNik7Ci19Ci0KLSNkZWZpbmUgTVVMXzE2U18zMlNfSEkoX3gsIF95KSBkZWZhdWx0X211bF8xNnNfMzJzX2hpKF94LCBfeSkKLQotI2RlZmluZSBMT05HX01VTFRfRENUKEssIHNhbXBsZSkgKE1VTF8xNlNfMzJTX0hJKEssIHNhbXBsZSkgPDwgMikKLQotUFJJVkFURSB2b2lkIFN5bnRoV2luZG93ODBfZ2VuZXJhdGVkKGludDE2X3QqIHBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQkNfQlVGRkVSX1QgY29uc3QqIFJFU1RSSUNUIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIHN0cmlkZVNoaWZ0KTsKLVBSSVZBVEUgdm9pZCBTeW50aFdpbmRvdzExMl9nZW5lcmF0ZWQoaW50MTZfdCogcGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQkNfQlVGRkVSX1QgY29uc3QqIFJFU1RSSUNUIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfVUlOVCBzdHJpZGVTaGlmdCk7Ci1QUklWQVRFIHZvaWQgZGN0Ml84KFNCQ19CVUZGRVJfVCogUkVTVFJJQ1Qgb3V0LCBpbnQzMl90IGNvbnN0KiBSRVNUUklDVCB4KTsKLQotdHlwZWRlZiB2b2lkICgqU1lOVEhfRlJBTUUpKE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsIGludDE2X3QqIHBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGJsa3N0YXJ0LCBPSV9VSU5UIGJsa2NvdW50KTsKLQotI2lmbmRlZiBDT1BZX0JBQ0tXQVJEXzMyQklUX0FMSUdORURfNzJfSEFMRldPUkRTCi0jZGVmaW5lIENPUFlfQkFDS1dBUkRfMzJCSVRfQUxJR05FRF83Ml9IQUxGV09SRFMoZGVzdCwgc3JjKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2hpZnRfYnVmZmVyKGRlc3QsIHNyYywgNzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmbmRlZiBEQ1QyXzgKLSNkZWZpbmUgRENUMl84KGRzdCwgc3JjKSBkY3QyXzgoZHN0LCBzcmMpCi0jZW5kaWYKLQotI2lmbmRlZiBTWU5USDgwCi0jZGVmaW5lIFNZTlRIODAgU3ludGhXaW5kb3c4MF9nZW5lcmF0ZWQKLSNlbmRpZgotCi0jaWZuZGVmIFNZTlRIMTEyCi0jZGVmaW5lIFNZTlRIMTEyIFN5bnRoV2luZG93MTEyX2dlbmVyYXRlZAotI2VuZGlmCi0KLVBSSVZBVEUgdm9pZCBPSV9TQkNfU3ludGhGcmFtZV84MChPSV9DT0RFQ19TQkNfREVDT0RFUl9DT05URVhUKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIHBjbSwgT0lfVUlOVCBibGtzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGJsa2NvdW50KSB7Ci0gIE9JX1VJTlQgYmxrOwotICBPSV9VSU5UIGNoOwotICBPSV9VSU5UIG5yb2ZfY2hhbm5lbHMgPSBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2ZfY2hhbm5lbHM7Ci0gIE9JX1VJTlQgcGNtU3RyaWRlU2hpZnQgPSBjb250ZXh0LT5jb21tb24ucGNtU3RyaWRlID09IDEgPyAwIDogMTsKLSAgT0lfVUlOVCBvZmZzZXQgPSBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyT2Zmc2V0OwotICBpbnQzMl90KiBzID0gY29udGV4dC0+Y29tbW9uLnN1YmRhdGEgKyA4ICogbnJvZl9jaGFubmVscyAqIGJsa3N0YXJ0OwotICBPSV9VSU5UIGJsa3N0b3AgPSBibGtzdGFydCArIGJsa2NvdW50OwotCi0gIGZvciAoYmxrID0gYmxrc3RhcnQ7IGJsayA8IGJsa3N0b3A7IGJsaysrKSB7Ci0gICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICBDT1BZX0JBQ0tXQVJEXzMyQklUX0FMSUdORURfNzJfSEFMRldPUkRTKAotICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJbMF0gKyBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyTGVuIC0KLSAgICAgICAgICAgICAgNzIsCi0gICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlclswXSk7Ci0gICAgICBpZiAobnJvZl9jaGFubmVscyA9PSAyKSB7Ci0gICAgICAgIENPUFlfQkFDS1dBUkRfMzJCSVRfQUxJR05FRF83Ml9IQUxGV09SRFMoCi0gICAgICAgICAgICBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyWzFdICsgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlckxlbiAtCi0gICAgICAgICAgICAgICAgNzIsCi0gICAgICAgICAgICBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyWzFdKTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCA9IGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJMZW4gLSA4MDsKLSAgICB9IGVsc2UgewotICAgICAgb2Zmc2V0IC09IDEgKiA4OwotICAgIH0KLQotICAgIGZvciAoY2ggPSAwOyBjaCA8IG5yb2ZfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIERDVDJfOChjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyW2NoXSArIG9mZnNldCwgcyk7Ci0gICAgICBTWU5USDgwKHBjbSArIGNoLCBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyW2NoXSArIG9mZnNldCwKLSAgICAgICAgICAgICAgcGNtU3RyaWRlU2hpZnQpOwotICAgICAgcyArPSA4OwotICAgIH0KLSAgICBwY20gKz0gKDggPDwgcGNtU3RyaWRlU2hpZnQpOwotICB9Ci0gIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJPZmZzZXQgPSBvZmZzZXQ7Ci19Ci0KLVBSSVZBVEUgdm9pZCBPSV9TQkNfU3ludGhGcmFtZV80U0IoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogcGNtLCBPSV9VSU5UIGJsa3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIGJsa2NvdW50KSB7Ci0gIE9JX1VJTlQgYmxrOwotICBPSV9VSU5UIGNoOwotICBPSV9VSU5UIG5yb2ZfY2hhbm5lbHMgPSBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2ZfY2hhbm5lbHM7Ci0gIE9JX1VJTlQgcGNtU3RyaWRlU2hpZnQgPSBjb250ZXh0LT5jb21tb24ucGNtU3RyaWRlID09IDEgPyAwIDogMTsKLSAgT0lfVUlOVCBvZmZzZXQgPSBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyT2Zmc2V0OwotICBpbnQzMl90KiBzID0gY29udGV4dC0+Y29tbW9uLnN1YmRhdGEgKyA4ICogbnJvZl9jaGFubmVscyAqIGJsa3N0YXJ0OwotICBPSV9VSU5UIGJsa3N0b3AgPSBibGtzdGFydCArIGJsa2NvdW50OwotCi0gIGZvciAoYmxrID0gYmxrc3RhcnQ7IGJsayA8IGJsa3N0b3A7IGJsaysrKSB7Ci0gICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICBDT1BZX0JBQ0tXQVJEXzMyQklUX0FMSUdORURfNzJfSEFMRldPUkRTKAotICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJbMF0gKyBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyTGVuIC0KLSAgICAgICAgICAgICAgNzIsCi0gICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlclswXSk7Ci0gICAgICBpZiAobnJvZl9jaGFubmVscyA9PSAyKSB7Ci0gICAgICAgIENPUFlfQkFDS1dBUkRfMzJCSVRfQUxJR05FRF83Ml9IQUxGV09SRFMoCi0gICAgICAgICAgICBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyWzFdICsgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlckxlbiAtCi0gICAgICAgICAgICAgICAgNzIsCi0gICAgICAgICAgICBjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyWzFdKTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCA9IGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJMZW4gLSA4MDsKLSAgICB9IGVsc2UgewotICAgICAgb2Zmc2V0IC09IDg7Ci0gICAgfQotICAgIGZvciAoY2ggPSAwOyBjaCA8IG5yb2ZfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIGNvc2luZU1vZHVsYXRlU3ludGg0KGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJbY2hdICsgb2Zmc2V0LCBzKTsKLSAgICAgIFN5bnRoV2luZG93NDBfaW50MzJfaW50MzJfc3ltbWV0cnlfd2l0aF9zdW0oCi0gICAgICAgICAgcGNtICsgY2gsIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJbY2hdICsgb2Zmc2V0LCBwY21TdHJpZGVTaGlmdCk7Ci0gICAgICBzICs9IDQ7Ci0gICAgfQotICAgIHBjbSArPSAoNCA8PCBwY21TdHJpZGVTaGlmdCk7Ci0gIH0KLSAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlck9mZnNldCA9IG9mZnNldDsKLX0KLQotI2lmZGVmIFNCQ19FTkhBTkNFRAotCi1QUklWQVRFIHZvaWQgT0lfU0JDX1N5bnRoRnJhbWVfRW5oYW5jZWQoT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBwY20sIE9JX1VJTlQgYmxrc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lfVUlOVCBibGtjb3VudCkgewotICBPSV9VSU5UIGJsazsKLSAgT0lfVUlOVCBjaDsKLSAgT0lfVUlOVCBucm9mX2NoYW5uZWxzID0gY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5ucm9mX2NoYW5uZWxzOwotICBPSV9VSU5UIHBjbVN0cmlkZVNoaWZ0ID0gY29udGV4dC0+Y29tbW9uLnBjbVN0cmlkZSA9PSAxID8gMCA6IDE7Ci0gIE9JX1VJTlQgb2Zmc2V0ID0gY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlck9mZnNldDsKLSAgaW50MzJfdCogcyA9IGNvbnRleHQtPmNvbW1vbi5zdWJkYXRhICsgOCAqIG5yb2ZfY2hhbm5lbHMgKiBibGtzdGFydDsKLSAgT0lfVUlOVCBibGtzdG9wID0gYmxrc3RhcnQgKyBibGtjb3VudDsKLQotICBmb3IgKGJsayA9IGJsa3N0YXJ0OyBibGsgPCBibGtzdG9wOyBibGsrKykgewotICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgQ09QWV9CQUNLV0FSRF8zMkJJVF9BTElHTkVEXzEwNF9IQUxGV09SRFMoCi0gICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlclswXSArIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJMZW4gLQotICAgICAgICAgICAgICAxMDQsCi0gICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlclswXSk7Ci0gICAgICBpZiAobnJvZl9jaGFubmVscyA9PSAyKSB7Ci0gICAgICAgIENPUFlfQkFDS1dBUkRfMzJCSVRfQUxJR05FRF8xMDRfSEFMRldPUkRTKAotICAgICAgICAgICAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlclsxXSArIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJMZW4gLQotICAgICAgICAgICAgICAgIDEwNCwKLSAgICAgICAgICAgIGNvbnRleHQtPmNvbW1vbi5maWx0ZXJCdWZmZXJbMV0pOwotICAgICAgfQotICAgICAgb2Zmc2V0ID0gY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlckxlbiAtIDExMjsKLSAgICB9IGVsc2UgewotICAgICAgb2Zmc2V0IC09IDg7Ci0gICAgfQotICAgIGZvciAoY2ggPSAwOyBjaCA8IG5yb2ZfY2hhbm5lbHM7ICsrY2gpIHsKLSAgICAgIERDVDJfOChjb250ZXh0LT5jb21tb24uZmlsdGVyQnVmZmVyW2NoXSArIG9mZnNldCwgcyk7Ci0gICAgICBTWU5USDExMihwY20gKyBjaCwgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlcltjaF0gKyBvZmZzZXQsCi0gICAgICAgICAgICAgICBwY21TdHJpZGVTaGlmdCk7Ci0gICAgICBzICs9IDg7Ci0gICAgfQotICAgIHBjbSArPSAoOCA8PCBwY21TdHJpZGVTaGlmdCk7Ci0gIH0KLSAgY29udGV4dC0+Y29tbW9uLmZpbHRlckJ1ZmZlck9mZnNldCA9IG9mZnNldDsKLX0KLQotc3RhdGljIGNvbnN0IFNZTlRIX0ZSQU1FIFN5bnRoRnJhbWVFbmhhbmNlZFtdID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnZhbGlkICovCi0gICAgT0lfU0JDX1N5bnRoRnJhbWVfRW5oYW5jZWQsIC8qIG1vbm8gKi8KLSAgICBPSV9TQkNfU3ludGhGcmFtZV9FbmhhbmNlZCAgLyogc3RlcmVvICovCi19OwotCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IFNZTlRIX0ZSQU1FIFN5bnRoRnJhbWU4U0JbXSA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgLyogaW52YWxpZCAqLwotICAgIE9JX1NCQ19TeW50aEZyYW1lXzgwLCAvKiBtb25vICovCi0gICAgT0lfU0JDX1N5bnRoRnJhbWVfODAgIC8qIHN0ZXJlbyAqLwotfTsKLQotc3RhdGljIGNvbnN0IFNZTlRIX0ZSQU1FIFN5bnRoRnJhbWU0U0JbXSA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIGludmFsaWQgKi8KLSAgICBPSV9TQkNfU3ludGhGcmFtZV80U0IsIC8qIG1vbm8gKi8KLSAgICBPSV9TQkNfU3ludGhGcmFtZV80U0IgIC8qIHN0ZXJlbyAqLwotfTsKLQotUFJJVkFURSB2b2lkIE9JX1NCQ19TeW50aEZyYW1lKE9JX0NPREVDX1NCQ19ERUNPREVSX0NPTlRFWFQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogcGNtLCBPSV9VSU5UIHN0YXJ0X2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JX1VJTlQgbnJvZl9ibG9ja3MpIHsKLSAgT0lfVUlOVCBucm9mX3N1YmJhbmRzID0gY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5ucm9mX3N1YmJhbmRzOwotICBPSV9VSU5UIG5yb2ZfY2hhbm5lbHMgPSBjb250ZXh0LT5jb21tb24uZnJhbWVJbmZvLm5yb2ZfY2hhbm5lbHM7Ci0KLSAgT0lfQVNTRVJUKG5yb2Zfc3ViYmFuZHMgPT0gNCB8fCBucm9mX3N1YmJhbmRzID09IDgpOwotICBpZiAobnJvZl9zdWJiYW5kcyA9PSA0KSB7Ci0gICAgU3ludGhGcmFtZTRTQltucm9mX2NoYW5uZWxzXShjb250ZXh0LCBwY20sIHN0YXJ0X2Jsb2NrLCBucm9mX2Jsb2Nrcyk7Ci0jaWZkZWYgU0JDX0VOSEFOQ0VECi0gIH0gZWxzZSBpZiAoY29udGV4dC0+Y29tbW9uLmZyYW1lSW5mby5lbmhhbmNlZCkgewotICAgIFN5bnRoRnJhbWVFbmhhbmNlZFtucm9mX2NoYW5uZWxzXShjb250ZXh0LCBwY20sIHN0YXJ0X2Jsb2NrLCBucm9mX2Jsb2Nrcyk7Ci0jZW5kaWYgLyogU0JDX0VOSEFOQ0VEICovCi0gIH0gZWxzZSB7Ci0gICAgU3ludGhGcmFtZThTQltucm9mX2NoYW5uZWxzXShjb250ZXh0LCBwY20sIHN0YXJ0X2Jsb2NrLCBucm9mX2Jsb2Nrcyk7Ci0gIH0KLX0KLQotdm9pZCBTeW50aFdpbmRvdzQwX2ludDMyX2ludDMyX3N5bW1ldHJ5X3dpdGhfc3VtKGludDE2X3QqIHBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQkNfQlVGRkVSX1QgYnVmZmVyWzgwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSV9VSU5UIHN0cmlkZVNoaWZ0KSB7Ci0gIGludDMyX3QgcGE7Ci0gIGludDMyX3QgcGI7Ci0KLSAgLyogVGhlc2UgdmFsdWVzIHNob3VsZCBiZSB6ZXJvLCBzaW5jZSBvdXRbMl0gb2YgdGhlIDQtYmFuZCBjb3NpbmUgbW9kdWxhdGlvbgotICAgKiBpcyBhbHdheXMgemVyby4gKi8KLSAgT0lfQVNTRVJUKGJ1ZmZlclsyXSA9PSAwKTsKLSAgT0lfQVNTRVJUKGJ1ZmZlclsxMF0gPT0gMCk7Ci0gIE9JX0FTU0VSVChidWZmZXJbMThdID09IDApOwotICBPSV9BU1NFUlQoYnVmZmVyWzI2XSA9PSAwKTsKLSAgT0lfQVNTRVJUKGJ1ZmZlclszNF0gPT0gMCk7Ci0gIE9JX0FTU0VSVChidWZmZXJbNDJdID09IDApOwotICBPSV9BU1NFUlQoYnVmZmVyWzUwXSA9PSAwKTsKLSAgT0lfQVNTRVJUKGJ1ZmZlcls1OF0gPT0gMCk7Ci0gIE9JX0FTU0VSVChidWZmZXJbNjZdID09IDApOwotICBPSV9BU1NFUlQoYnVmZmVyWzc0XSA9PSAwKTsKLQotICBwYSA9IGRlY193aW5kb3dfNFs0XSAqIChidWZmZXJbMTJdICsgYnVmZmVyWzc2XSk7Ci0gIHBhICs9IGRlY193aW5kb3dfNFs4XSAqIChidWZmZXJbMTZdIC0gYnVmZmVyWzY0XSk7Ci0gIHBhICs9IGRlY193aW5kb3dfNFsxMl0gKiAoYnVmZmVyWzI4XSArIGJ1ZmZlcls2MF0pOwotICBwYSArPSBkZWNfd2luZG93XzRbMTZdICogKGJ1ZmZlclszMl0gLSBidWZmZXJbNDhdKTsKLSAgcGEgKz0gZGVjX3dpbmRvd180WzIwXSAqIGJ1ZmZlcls0NF07Ci0gIHBhID0gU0NBTEUoLXBhLCAxNSk7Ci0gIENMSVBfSU5UMTYocGEpOwotICBwY21bMCA8PCBzdHJpZGVTaGlmdF0gPSAoaW50MTZfdClwYTsKLQotICBwYSA9IGRlY193aW5kb3dfNFsxXSAqIGJ1ZmZlclsxXTsKLSAgcGIgPSBkZWNfd2luZG93XzRbMV0gKiBidWZmZXJbNzldOwotICBwYiArPSBkZWNfd2luZG93XzRbM10gKiBidWZmZXJbM107Ci0gIHBhICs9IGRlY193aW5kb3dfNFszXSAqIGJ1ZmZlcls3N107Ci0gIHBhICs9IGRlY193aW5kb3dfNFs1XSAqIGJ1ZmZlclsxM107Ci0gIHBiICs9IGRlY193aW5kb3dfNFs1XSAqIGJ1ZmZlcls2N107Ci0gIHBiICs9IGRlY193aW5kb3dfNFs3XSAqIGJ1ZmZlclsxNV07Ci0gIHBhICs9IGRlY193aW5kb3dfNFs3XSAqIGJ1ZmZlcls2NV07Ci0gIHBhICs9IGRlY193aW5kb3dfNFs5XSAqIGJ1ZmZlclsxN107Ci0gIHBiICs9IGRlY193aW5kb3dfNFs5XSAqIGJ1ZmZlcls2M107Ci0gIHBiICs9IGRlY193aW5kb3dfNFsxMV0gKiBidWZmZXJbMTldOwotICBwYSArPSBkZWNfd2luZG93XzRbMTFdICogYnVmZmVyWzYxXTsKLSAgcGEgKz0gZGVjX3dpbmRvd180WzEzXSAqIGJ1ZmZlclsyOV07Ci0gIHBiICs9IGRlY193aW5kb3dfNFsxM10gKiBidWZmZXJbNTFdOwotICBwYiArPSBkZWNfd2luZG93XzRbMTVdICogYnVmZmVyWzMxXTsKLSAgcGEgKz0gZGVjX3dpbmRvd180WzE1XSAqIGJ1ZmZlcls0OV07Ci0gIHBhICs9IGRlY193aW5kb3dfNFsxN10gKiBidWZmZXJbMzNdOwotICBwYiArPSBkZWNfd2luZG93XzRbMTddICogYnVmZmVyWzQ3XTsKLSAgcGIgKz0gZGVjX3dpbmRvd180WzE5XSAqIGJ1ZmZlclszNV07Ci0gIHBhICs9IGRlY193aW5kb3dfNFsxOV0gKiBidWZmZXJbNDVdOwotICBwYSA9IFNDQUxFKC1wYSwgMTUpOwotICBDTElQX0lOVDE2KHBhKTsKLSAgcGNtWzEgPDwgc3RyaWRlU2hpZnRdID0gKGludDE2X3QpKHBhKTsKLSAgcGIgPSBTQ0FMRSgtcGIsIDE1KTsKLSAgQ0xJUF9JTlQxNihwYik7Ci0gIHBjbVszIDw8IHN0cmlkZVNoaWZ0XSA9IChpbnQxNl90KShwYik7Ci0KLSAgcGEgPSBkZWNfd2luZG93XzRbMl0gKgotICAgICAgICgvKmJ1ZmZlclsgMl0gKyAqLyBidWZmZXJbNzhdKTsgLyogYnVmZmVyWyAyXSBpcyBhbHdheXMgemVybyAqLwotICBwYSArPSBkZWNfd2luZG93XzRbNl0gKgotICAgICAgICAoYnVmZmVyWzE0XSAvKiArIGJ1ZmZlcls2Nl0qLyk7IC8qIGJ1ZmZlcls2Nl0gaXMgYWx3YXlzIHplcm8gKi8KLSAgcGEgKz0gZGVjX3dpbmRvd180WzEwXSAqCi0gICAgICAgICgvKmJ1ZmZlclsxOF0gKyAqLyBidWZmZXJbNjJdKTsgLyogYnVmZmVyWzE4XSBpcyBhbHdheXMgemVybyAqLwotICBwYSArPSBkZWNfd2luZG93XzRbMTRdICoKLSAgICAgICAgKGJ1ZmZlclszMF0gLyogKyBidWZmZXJbNTBdKi8pOyAvKiBidWZmZXJbNTBdIGlzIGFsd2F5cyB6ZXJvICovCi0gIHBhICs9IGRlY193aW5kb3dfNFsxOF0gKgotICAgICAgICAoLypidWZmZXJbMzRdICsgKi8gYnVmZmVyWzQ2XSk7IC8qIGJ1ZmZlclszNF0gaXMgYWx3YXlzIHplcm8gKi8KLSAgcGEgPSBTQ0FMRSgtcGEsIDE1KTsKLSAgQ0xJUF9JTlQxNihwYSk7Ci0gIHBjbVsyIDw8IHN0cmlkZVNoaWZ0XSA9IChpbnQxNl90KShwYSk7Ci19Ci0KLS8qKgotICBUaGlzIHJvdXRpbmUgaW1wbGVtZW50cyB0aGUgY29zaW5lIG1vZHVsYXRpb24gbWF0cml4IGZvciA0LXN1YmJhbmQKLSAgc3ludGhlc2lzLiBUaGlzIGlzIGNhbGxlZCAibWF0cml4aW5nIiBpbiB0aGUgU0JDIHNwZWNpZmljYXRpb24uIFRoaXMKLSAgbWF0cml4LCBNNCwgIGNhbiBiZSBmYWN0b3JlZCBpbnRvIGFuIDgtcG9pbnQgVHlwZSBJSSBEaXNjcmV0ZSBDb3NpbmUKLSAgVHJhbnNmb3JtLCBEQ1RJSV80IGFuZCBhIG1hdHJpeCBTNCwgZ2l2ZW4gaGVyZToKLQotICBAY29kZQotICAgICAgICBfXyAgICAgICAgICAgICAgIF9fCi0gICAgICAgfCAgIDAgICAwICAgMSAgIDAgICB8Ci0gICAgICAgfCAgIDAgICAwICAgMCAgIDEgICB8Ci0gICAgICAgfCAgIDAgICAwICAgMCAgIDAgICB8Ci0gICAgICAgfCAgIDAgICAwICAgMCAgLTEgICB8Ci0gIFM0ID0gfCAgIDAgICAwICAtMSAgIDAgICB8Ci0gICAgICAgfCAgIDAgIC0xICAgMCAgIDAgICB8Ci0gICAgICAgfCAgLTEgICAwICAgMCAgIDAgICB8Ci0gICAgICAgfF9fIDAgIC0xICAgMCAgIDAgX198Ci0KLSAgTTQgKiBpbiA9IFM0ICogKERDVElJXzQgKiBpbikKLSAgQGVuZGNvZGUKLQotICAoRENUSUlfNCAqIGluKSBpcyBjb21wdXRlZCB1c2luZyBhIEZhc3QgQ29zaW5lIFRyYW5zZm9ybS4gVGhlIGFsZ29yaXRobQotICBoZXJlIGlzIGJhc2VkIG9uIGFuIGltcGxlbWVudGF0aW9uIGNvbXB1dGVkIGJ5IHRoZSBTUElSQUwgY29tcHV0ZXIKLSAgYWxnZWJyYSBzeXN0ZW0sIG1hbnVhbGx5IGNvbnZlcnRlZCB0byBmaXhlZC1wb2ludCBhcml0aG1ldGljLiBTNCBjYW4gYmUKLSAgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBhc3NpZ25tZW50IGFuZCBuZWdhdGlvbi4KLSAgKi8KLVBSSVZBVEUgdm9pZCBjb3NpbmVNb2R1bGF0ZVN5bnRoNChTQkNfQlVGRkVSX1QqIFJFU1RSSUNUIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnN0KiBSRVNUUklDVCBpbikgewotICBpbnQzMl90IGYwLCBmMSwgZjIsIGYzLCBmNCwgZjcsIGY4LCBmOSwgZjEwOwotICBpbnQzMl90IHkwLCB5MSwgeTIsIHkzOwotCi0gIGYwID0gKGluWzBdIC0gaW5bM10pOwotICBmMSA9IChpblswXSArIGluWzNdKTsKLSAgZjIgPSAoaW5bMV0gLSBpblsyXSk7Ci0gIGYzID0gKGluWzFdICsgaW5bMl0pOwotCi0gIGY0ID0gZjEgLSBmMzsKLQotICB5MCA9IC1TQ0FMRShmMSArIGYzLCBEQ1RfU0hJRlQpOwotICB5MiA9IC1TQ0FMRShMT05HX01VTFRfRENUKERDVElJXzRfSzA2X0ZJWCwgZjQpLCBEQ1RfU0hJRlQpOwotICBmNyA9IGYwICsgZjI7Ci0gIGY4ID0gTE9OR19NVUxUX0RDVChEQ1RJSV80X0swOF9GSVgsIGYwKTsKLSAgZjkgPSBMT05HX01VTFRfRENUKERDVElJXzRfSzA5X0ZJWCwgZjcpOwotICBmMTAgPSBMT05HX01VTFRfRENUKERDVElJXzRfSzEwX0ZJWCwgZjIpOwotICB5MyA9IC1TQ0FMRShmOCArIGY5LCBEQ1RfU0hJRlQpOwotICB5MSA9IC1TQ0FMRShmMTAgLSBmOSwgRENUX1NISUZUKTsKLQotICBvdXRbMF0gPSAoaW50MTZfdCkteTI7Ci0gIG91dFsxXSA9IChpbnQxNl90KS15MzsKLSAgb3V0WzJdID0gKGludDE2X3QpMDsKLSAgb3V0WzNdID0gKGludDE2X3QpeTM7Ci0gIG91dFs0XSA9IChpbnQxNl90KXkyOwotICBvdXRbNV0gPSAoaW50MTZfdCl5MTsKLSAgb3V0WzZdID0gKGludDE2X3QpeTA7Ci0gIG91dFs3XSA9IChpbnQxNl90KXkxOwotfQotCi0vKioKLUB9Ci0qLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9lbmNvZGVyL0FuZHJvaWQuYnAgYi9lbWJkcnYvc2JjL2VuY29kZXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmOGQyYi4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2VuY29kZXIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnQtc2JjLWVuY29kZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAic3JjZS9zYmNfYW5hbHlzaXMuYyIsCi0gICAgICAgICJzcmNlL3NiY19kY3QuYyIsCi0gICAgICAgICJzcmNlL3NiY19kY3RfY29lZmZzLmMiLAotICAgICAgICAic3JjZS9zYmNfZW5jX2JpdF9hbGxvY19tb25vLmMiLAotICAgICAgICAic3JjZS9zYmNfZW5jX2JpdF9hbGxvY19zdGUuYyIsCi0gICAgICAgICJzcmNlL3NiY19lbmNfY29lZmZzLmMiLAotICAgICAgICAic3JjZS9zYmNfZW5jb2Rlci5jIiwKLSAgICAgICAgInNyY2Uvc2JjX3BhY2tpbmcuYyIsCi0gICAgXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAic3JjZSIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlL3NiY19kY3QuaCBiL2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlL3NiY19kY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxMzBiNy4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZS9zYmNfZGN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIERlZmluaXRpb25zIGZvciB0aGUgZmFzdCBEQ1QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBTQkNfRENUX0gKLSNkZWZpbmUgU0JDX0RDVF9ICi0KLSNpbmNsdWRlICJzYmNfZW5jX2Z1bmNfZGVjbGFyZS5oIgotCi0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBUUlVFKQotI2RlZmluZSBTQkNfTVVMVF8zMl8xNl9TSU1QTElGSUVEKHMxNkluMiwgczMySW4xLCBzMzJPdXRMb3cpIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20gewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotICAgIE1VTCBzMzJPdXRMb3csKGludDMyX3QpczE2SW4yLCAoczMySW4xPj4xNSkgfSBcCi0gIH0KLSNlbHNlCi0jaWYgKFNCQ19EU1BfT1BUID09IFRSVUUpCi0jZGVmaW5lIFNCQ19NVUxUXzMyXzE2X1NJTVBMSUZJRUQoczE2SW4yLCBzMzJJbjEsIHMzMk91dExvdykgXAotICBzMzJPdXRMb3cgPSBTQkNfTXVsdGlwbHlfMzJfMTZfU2ltcGxpZmllZCgoaW50MzJfdClzMTZJbjIsIHMzMkluMSk7Ci0jZWxzZQotI2lmIChTQkNfSVBBUV9PUFQgPT0gVFJVRSkKLS8qCi0jZGVmaW5lIFNCQ19NVUxUXzMyXzE2X1NJTVBMSUZJRUQoczE2SW4yLCBzMzJJbjEgLCBzMzJPdXRMb3cpCi1zMzJPdXRMb3c9KGludDMyX3QpKChpbnQzMl90KShzMTZJbjIpKihpbnQzMl90KShzMzJJbjE+PjE1KSk7Ci0qLwotI2RlZmluZSBTQkNfTVVMVF8zMl8xNl9TSU1QTElGSUVEKHMxNkluMiwgczMySW4xLCBzMzJPdXRMb3cpIFwKLSAgczMyT3V0TG93ID0gKGludDMyX3QpKCgoaW50NjRfdCkoczE2SW4yKSAqIChpbnQ2NF90KShzMzJJbjEpKSA+PiAxNSk7Ci0jaWYgKFNCQ19JU182NF9NVUxUX0lOX0lEQ1QgPT0gVFJVRSkKLSNkZWZpbmUgU0JDX01VTFRfMzJfMzIoczMySW4yLCBzMzJJbjEsIHMzMk91dExvdykgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9ICgoaW50NjRfdClzMzJJbjIpICogKChpbnQ2NF90KXMzMkluMSkgPj4gMzE7IFwKLSAgICBzMzJPdXRMb3cgPSAoaW50MzJfdClzNjRUZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIFNCQ19NVUxUXzMyXzE2X1NJTVBMSUZJRUQoczE2SW4yLCBzMzJJbjEsIHMzMk91dExvdykgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkluMVRlbXAgPSBzMzJJbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMySW4yVGVtcCA9IChpbnQzMl90KXMxNkluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC8qIE11bHRpcGx5IG9uZSArdmUgYW5kIHRoZSBvdGhlciAtdmUgbnVtYmVyICovICAgICAgICAgICAgICBcCi0gICAgaWYgKHMzMkluMVRlbXAgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHMzMkluMVRlbXAgXj0gMHhGRkZGRkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgczMySW4xVGVtcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzMzJPdXRMb3cgPSAoczMySW4yVGVtcCAqIChzMzJJbjFUZW1wID4+IDE2KSk7ICAgICAgICAgICAgIFwKLSAgICAgIHMzMk91dExvdyArPSAoKHMzMkluMlRlbXAgKiAoczMySW4xVGVtcCAmIDB4RkZGRikpID4+IDE2KTsgXAotICAgICAgczMyT3V0TG93IF49IDB4RkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzMzJPdXRMb3crKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgczMyT3V0TG93ID0gKHMzMkluMlRlbXAgKiAoczMySW4xVGVtcCA+PiAxNikpOyAgICAgICAgICAgICBcCi0gICAgICBzMzJPdXRMb3cgKz0gKChzMzJJbjJUZW1wICogKHMzMkluMVRlbXAgJiAweEZGRkYpKSA+PiAxNik7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMk91dExvdyA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fSURDVCA9PSBUUlVFKQotI2RlZmluZSBTQkNfTVVMVF82NChzMzJJbjEsIHMzMkluMiwgczMyT3V0TG93LCBzMzJPdXRIaSkgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJPdXRMb3cgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdCkoKChpbnQ2NF90KXMzMkluMSAqIChpbnQ2NF90KXMzMkluMikgJiAweDAwMDAwMDAwRkZGRkZGRkYpOyBcCi0gICAgczMyT3V0SGkgPSAoaW50MzJfdCkoKChpbnQ2NF90KXMzMkluMSAqIChpbnQ2NF90KXMzMkluMikgPj4gMzIpOyAgICAgICAgIFwKLSAgfQotI2RlZmluZSBTQkNfTVVMVF8zMl8zMihzMzJJbjIsIHMzMkluMSwgczMyT3V0TG93KSAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkhpVGVtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNCQ19NVUxUXzY0KHMzMkluMiwgczMySW4xLCBzMzJPdXRMb3csIHMzMkhpVGVtcCk7ICAgICAgICAgICAgICAgXAotICAgIHMzMk91dExvdyA9ICgoKHMzMk91dExvdyA+PiAxNSkgJiAweDFGRkZGKSB8IChzMzJIaVRlbXAgPDwgMTcpKTsgXAotICB9Ci0jZW5kaWYKLQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlL3NiY19lbmNfZnVuY19kZWNsYXJlLmggYi9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZS9zYmNfZW5jX2Z1bmNfZGVjbGFyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFmOGFiLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlL3NiY19lbmNfZnVuY19kZWNsYXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFNCQ19GVU5DREVDTEFSRV9ICi0jZGVmaW5lIFNCQ19GVU5DREVDTEFSRV9ICi0KLSNpbmNsdWRlICJzYmNfZW5jb2Rlci5oIgotLyogR2xvYmFsIGRhdGEgKi8KLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgPT0gRkFMU0UpCi1leHRlcm4gY29uc3QgaW50MTZfdCBnYXMzMkNvZWZmRm9yNFNCc1tdOwotZXh0ZXJuIGNvbnN0IGludDE2X3QgZ2FzMzJDb2VmZkZvcjhTQnNbXTsKLSNlbHNlCi1leHRlcm4gY29uc3QgaW50MzJfdCBnYXMzMkNvZWZmRm9yNFNCc1tdOwotZXh0ZXJuIGNvbnN0IGludDMyX3QgZ2FzMzJDb2VmZkZvcjhTQnNbXTsKLSNlbmRpZgotCi0vKiBHbG9iYWwgZnVuY3Rpb25zKi8KLQotZXh0ZXJuIHZvaWQgc2JjX2VuY19iaXRfYWxsb2NfbW9ubyhTQkNfRU5DX1BBUkFNUyogQ29kZWNQYXJhbXMpOwotZXh0ZXJuIHZvaWQgc2JjX2VuY19iaXRfYWxsb2Nfc3RlKFNCQ19FTkNfUEFSQU1TKiBDb2RlY1BhcmFtcyk7Ci0KLWV4dGVybiB2b2lkIFNiY0FuYWx5c2lzSW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgU2JjQW5hbHlzaXNGaWx0ZXI0KFNCQ19FTkNfUEFSQU1TKiBzdHJFbmNQYXJhbXMsIGludDE2X3QqIGlucHV0KTsKLWV4dGVybiB2b2lkIFNiY0FuYWx5c2lzRmlsdGVyOChTQkNfRU5DX1BBUkFNUyogc3RyRW5jUGFyYW1zLCBpbnQxNl90KiBpbnB1dCk7Ci0KLWV4dGVybiB2b2lkIFNCQ19GYXN0SURDVDgoaW50MzJfdCogcEluVmVjdCwgaW50MzJfdCogcE91dFZlY3QpOwotZXh0ZXJuIHZvaWQgU0JDX0Zhc3RJRENUNChpbnQzMl90KiB4MCwgaW50MzJfdCogcE91dFZlY3QpOwotCi1leHRlcm4gdWludDMyX3QgRW5jUGFja2luZyhTQkNfRU5DX1BBUkFNUyogc3RyRW5jUGFyYW1zLCB1aW50OF90KiBvdXRwdXQpOwotZXh0ZXJuIHZvaWQgRW5jUXVhbnRpemVyKFNCQ19FTkNfUEFSQU1TKik7Ci0jaWYgKFNCQ19EU1BfT1BUID09IFRSVUUpCi1pbnQzMl90IFNCQ19NdWx0aXBseV8zMl8xNl9TaW1wbGlmaWVkKGludDMyX3QgczMySW4yVGVtcCwgaW50MzJfdCBzMzJJbjFUZW1wKTsKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZS9zYmNfZW5jb2Rlci5oIGIvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUvc2JjX2VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMTA4OS4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZS9zYmNfZW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyB1c2VkIGJ5IEVuY29kZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBTQkNfRU5DT0RFUl9ICi0jZGVmaW5lIFNCQ19FTkNPREVSX0gKLQotI2RlZmluZSBFTkNPREVSX1ZFUlNJT04gIjAwMjUiCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLQotLypERUZJTkVTKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICghRkFMU0UpCi0jZW5kaWYKLQotI2RlZmluZSBTQkNfTUFYX05VTV9PRl9TVUJCQU5EUyA4Ci0jZGVmaW5lIFNCQ19NQVhfTlVNX09GX0NIQU5ORUxTIDIKLSNkZWZpbmUgU0JDX01BWF9OVU1fT0ZfQkxPQ0tTIDE2Ci0KLSNkZWZpbmUgU0JDX0xPVURORVNTIDAKLSNkZWZpbmUgU0JDX1NOUiAxCi0KLSNkZWZpbmUgU1VCX0JBTkRTXzggOAotI2RlZmluZSBTVUJfQkFORFNfNCA0Ci0KLSNkZWZpbmUgU0JDX3NmMTYwMDAgMAotI2RlZmluZSBTQkNfc2YzMjAwMCAxCi0jZGVmaW5lIFNCQ19zZjQ0MTAwIDIKLSNkZWZpbmUgU0JDX3NmNDgwMDAgMwotCi0jZGVmaW5lIFNCQ19NT05PIDAKLSNkZWZpbmUgU0JDX0RVQUwgMQotI2RlZmluZSBTQkNfU1RFUkVPIDIKLSNkZWZpbmUgU0JDX0pPSU5UX1NURVJFTyAzCi0KLSNkZWZpbmUgU0JDX0JMT0NLXzAgNAotI2RlZmluZSBTQkNfQkxPQ0tfMSA4Ci0jZGVmaW5lIFNCQ19CTE9DS18yIDEyCi0jZGVmaW5lIFNCQ19CTE9DS18zIDE2Ci0KLSNkZWZpbmUgU0JDX05VTEwgMAotCi0jaWZuZGVmIFNCQ19NQVhfTlVNX0ZSQU1FCi0jZGVmaW5lIFNCQ19NQVhfTlVNX0ZSQU1FIDEKLSNlbmRpZgotCi0jaWZuZGVmIFNCQ19EU1BfT1BUCi0jZGVmaW5lIFNCQ19EU1BfT1BUIEZBTFNFCi0jZW5kaWYKLQotLyogU2V0IFNCQ19VU0VfQVJNX1BSQUdNQSB0byBUUlVFIHRvIHVzZSAiI3ByYWdtYSBhcm0gc2VjdGlvbiB6aWRhdGEiICovCi0jaWZuZGVmIFNCQ19VU0VfQVJNX1BSQUdNQQotI2RlZmluZSBTQkNfVVNFX0FSTV9QUkFHTUEgRkFMU0UKLSNlbmRpZgotCi0vKiBTZXQgU0JDX0FSTV9BU01fT1BUIHRvIFRSVUUgaW4gY2FzZSB0aGUgdGFyZ2V0IGlzIGFuIEFSTSAqLwotLyogdGhpcyB3aWxsIHJlcGxhY2UgYWxsIHRoZSAzMiBhbmQgNjQgYml0IG11bHQgYnkgaW4gbGluZSBhc3NlbWJseSBjb2RlICovCi0jaWZuZGVmIFNCQ19BUk1fQVNNX09QVAotI2RlZmluZSBTQkNfQVJNX0FTTV9PUFQgRkFMU0UKLSNlbmRpZgotCi0vKiBncmVlbiBoaWxsIGNvbXBpbGVyIG9wdGlvbiAtPiBVc2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSBzeW50YXggZm9yIGlubGluZQotICogYXNzZW1ibHkgY29kZQotICovCi0jaWZuZGVmIFNCQ19HSFNfQ09NUElMRVIKLSNkZWZpbmUgU0JDX0dIU19DT01QSUxFUiBGQUxTRQotI2VuZGlmCi0KLS8qIEFSTSBjb21waWxlciBvcHRpb24gLT4gVXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgc3ludGF4IGZvciBpbmxpbmUgYXNzZW1ibHkKLSAqIGNvZGUgKi8KLSNpZm5kZWYgU0JDX0FSTV9DT01QSUxFUgotI2RlZmluZSBTQkNfQVJNX0NPTVBJTEVSIFRSVUUKLSNlbmRpZgotCi0vKiBTZXQgU0JDX0lQQVFfT1BUIHRvIFRSVUUgaW4gY2FzZSB0aGUgdGFyZ2V0IGlzIGFuIEFSTSAqLwotLyogMzIgYW5kIDY0IGJpdCBtdWx0IHdpbGwgYmUgcGVyZm9ybWVkIHVzaW5nIGludDY0X3QgKCB1c3VhbHkgX19pbnQ2NCApIGNhc3QKLSAqIHRoYXQgdXN1YWx5IGdpdmUgb3B0aW1hbCBwZXJmb3JtYW5jZSBpZiBzdXBwb3J0ZWQKLSAqLwotI2lmbmRlZiBTQkNfSVBBUV9PUFQKLSNkZWZpbmUgU0JDX0lQQVFfT1BUIFRSVUUKLSNlbmRpZgotCi0vKiBEZWJ1ZyBvbmx5OiBzZXQgU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgdG8gVFJVRSB0byB1c2UgNjQgYml0Ci0gKiBtdWx0aXBsaWNhdGlvbiBpbiB0aGUgd2luZG93aW5nCi0gKi8KLS8qIC0+IG5vdCByZWNvbWVuZGVkLCBtb3JlIE1JUFMgZm9yIHRoZSBzYW1lIHJlc3RpdHV0aW9uLiAgKi8KLSNpZm5kZWYgU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UKLSNkZWZpbmUgU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgRkFMU0UKLSNlbmRpZiAvKlNCQ19JU182NF9NVUxUX0lOX1dJTkRPV19BQ0NVICovCi0KLS8qIFNldCBTQkNfSVNfNjRfTVVMVF9JTl9JRENUIHRvIFRSVUUgdG8gdXNlIDY0IGJpdHMgbXVsdGlwbGljYXRpb24gaW4gdGhlIERDVAotICogb2YgTWF0cml4aW5nCi0gKi8KLS8qIC0+IG1vcmUgTUlQUyByZXF1aXJlZCBmb3IgYSBiZXR0ZXIgYXVkaW8gcXVhbGl0eS4gY29tcGFyYXNpb24gd2l0aCB0aGUgU0lHCi0gKiB1dGlsaXRpZXMgc2hvd3MgYSBkaXZpc2lvbiBieSAxMCBvZiB0aGUgUk1TCi0gKi8KLS8qIENBVVRJT046IEl0IG9ubHkgYXBwbHkgaW4gdGhlIGlmIFNCQ19GQVNUX0RDVCBpcyBzZXQgdG8gVFJVRSAqLwotI2lmbmRlZiBTQkNfSVNfNjRfTVVMVF9JTl9JRENUCi0jZGVmaW5lIFNCQ19JU182NF9NVUxUX0lOX0lEQ1QgRkFMU0UKLSNlbmRpZiAvKlNCQ19JU182NF9NVUxUX0lOX0lEQ1QgKi8KLQotLyogc2V0IFNCQ19JU182NF9NVUxUX0lOX1FVQU5USVpFUiB0byBUUlVFIHRvIHVzZSA2NCBiaXRzIG11bHRpcGxpY2F0aW9uIGluIHRoZQotICogcXVhbnRpemVyCi0gKi8KLS8qIHNldHRpbmcgdGhpcyBmbGFnIHRvIEZBTFNFIGFkZHMgYSB3aGlzdGxpbmcgbm9pc2UgYXQgNS41IGFuZCAxMSBLSHogdXN1YWx5Ci0gKiBub3QgcGVyY2VwdGlibGUgYnkgaHVtYW4ncyBoZWFycy4gKi8KLSNpZm5kZWYgU0JDX0lTXzY0X01VTFRfSU5fUVVBTlRJWkVSCi0jZGVmaW5lIFNCQ19JU182NF9NVUxUX0lOX1FVQU5USVpFUiBUUlVFCi0jZW5kaWYgLypTQkNfSVNfNjRfTVVMVF9JTl9JRENUICovCi0KLS8qIERlYnVnIG9ubHk6IHNldCB0aGlzIGZsYWcgdG8gRkFMU0UgdG8gZGlzYWJsZSBmYXN0IERDVCBhbGdvcml0aG0gKi8KLSNpZm5kZWYgU0JDX0ZBU1RfRENUCi0jZGVmaW5lIFNCQ19GQVNUX0RDVCBUUlVFCi0jZW5kaWYgLypTQkNfRkFTVF9EQ1QgKi8KLQotLyogSW4gY2FzZSB3ZSBkbyBub3QgdXNlIGpvaW50IHN0ZXJlbyBtb2RlIHRoZSBmbGFnIHNhdmUgc29tZSBSQU0gYW5kIFJPTSBpbgotICogY2FzZSBpdCBpcyBzZXQgdG8gRkFMU0UgKi8KLSNpZm5kZWYgU0JDX0pPSU5UX1NURV9JTkNMVURFRAotI2RlZmluZSBTQkNfSk9JTlRfU1RFX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0jZGVmaW5lIE1JTklNVU1fRU5DX1ZYX0JVRkZFUl9TSVpFICg4ICogMTAgKiAyKQotI2lmbmRlZiBFTkNfVlhfQlVGRkVSX1NJWkUKLSNkZWZpbmUgRU5DX1ZYX0JVRkZFUl9TSVpFIChNSU5JTVVNX0VOQ19WWF9CVUZGRVJfU0laRSArIDY0KQotLyojZGVmaW5lIEVOQ19WWF9CVUZGRVJfU0laRSBNSU5JTVVNX0VOQ19WWF9CVUZGRVJfU0laRSArIDEwMjQqLwotI2VuZGlmCi0KLS8qY29uc3RhbnRzIHVzZWQgZm9yIGluZGV4IGNhbGN1bGF0aW9uKi8KLSNkZWZpbmUgU0JDX0JMSyAoU0JDX01BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBTQkNfTUFYX05VTV9PRl9TVUJCQU5EUykKLQotI2RlZmluZSBTQkNfTUFYX1BDTV9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKFNCQ19NQVhfTlVNX0ZSQU1FICogU0JDX01BWF9OVU1fT0ZfQkxPQ0tTICogU0JDX01BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBcCi0gICBTQkNfTUFYX05VTV9PRl9TVUJCQU5EUykKLQotI2luY2x1ZGUgInNiY190eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdCBTQkNfRU5DX1BBUkFNU19UQUcgewotICBpbnQxNl90IHMxNlNhbXBsaW5nRnJlcTsgIC8qIDE2aywgMzJrLCA0NC4xayBvciA0OGsqLwotICBpbnQxNl90IHMxNkNoYW5uZWxNb2RlOyAgIC8qIG1vbm8sIGR1YWwsIHN0cmVvIG9yIGpvaW50IHN0cmVvKi8KLSAgaW50MTZfdCBzMTZOdW1PZlN1YkJhbmRzOyAvKiA0IG9yIDggKi8KLSAgaW50MTZfdCBzMTZOdW1PZkNoYW5uZWxzOwotICBpbnQxNl90IHMxNk51bU9mQmxvY2tzOyAgICAgIC8qIDQsIDgsIDEyIG9yIDE2Ki8KLSAgaW50MTZfdCBzMTZBbGxvY2F0aW9uTWV0aG9kOyAvKiBsb3VkbmVzcyBvciBTTlIqLwotICBpbnQxNl90IHMxNkJpdFBvb2w7ICAgICAgICAgIC8qIDE2Km51bU9mU2IgZm9yIG1vbm8gJiBkdWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIqbnVtT2ZTYiBmb3Igc3RlcmVvICYgam9pbnQgc3RlcmVvICovCi0gIHVpbnQxNl90IHUxNkJpdFJhdGU7Ci0jaWYgKFNCQ19KT0lOVF9TVEVfSU5DTFVERUQgPT0gVFJVRSkKLSAgaW50MTZfdCBhczE2Sm9pbltTQkNfTUFYX05VTV9PRl9TVUJCQU5EU107IC8qMSBpZiBKUywgMCBvdGhlcndpc2UqLwotI2VuZGlmCi0KLSAgaW50MTZfdCBzMTZNYXhCaXROZWVkOwotICBpbnQxNl90IGFzMTZTY2FsZUZhY3RvcltTQkNfTUFYX05VTV9PRl9DSEFOTkVMUyAqIFNCQ19NQVhfTlVNX09GX1NVQkJBTkRTXTsKLQotICBpbnQxNl90IHMxNlNjYXJ0Y2hNZW1Gb3JCaXRBbGxvY1sxNl07Ci0KLSAgaW50MzJfdCBzMzJTYkJ1ZmZlcltTQkNfTUFYX05VTV9PRl9DSEFOTkVMUyAqIFNCQ19NQVhfTlVNX09GX1NVQkJBTkRTICoKLSAgICAgICAgICAgICAgICAgICAgICBTQkNfTUFYX05VTV9PRl9CTE9DS1NdOwotCi0gIGludDE2X3QgYXMxNkJpdHNbU0JDX01BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBTQkNfTUFYX05VTV9PRl9TVUJCQU5EU107Ci0KLSAgdWludDE2X3QgRnJhbWVIZWFkZXI7Ci0KLX0gU0JDX0VOQ19QQVJBTVM7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRW5jb2RlIHRoZSBmcmFtZSB1c2luZyBTQkMuIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBpbnRvIHxvdXRwdXR8LiBSZXR1cm4KLSAqIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiAqLwotZXh0ZXJuIHVpbnQzMl90IFNCQ19FbmNvZGUoU0JDX0VOQ19QQVJBTVMqIHN0ckVuY1BhcmFtcywgaW50MTZfdCogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQpOwotZXh0ZXJuIHZvaWQgU0JDX0VuY29kZXJfSW5pdChTQkNfRU5DX1BBUkFNUyogc3RyRW5jUGFyYW1zKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFNCQ19FTkNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlL3NiY19pZi5oIGIvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUvc2JjX2lmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NzkzODMuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUvc2JjX2lmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9TQkNfSUZfSAotI2RlZmluZSBfU0JDX0lGX0gKLQotI2RlZmluZSBQQ01fQlVGRkVSX1NJWkUgNTEyCi0KLS8qCi0gU0JDX0luaXQgLSBjYWxsZWQgb25jZSBmb3IgZWFjaCB0cmFjayBwbGF5ZWQKLQotIHBjbV9zYW1wbGVfZnJlcSAtIDQwMDAgdG8gNDgwMDAKLSBjaGFubmVscyAtIDEgbW9ubyAyIHN0ZXJlbwotIGJpdHNfcGVyX3NhbXBsZSAtIDggb3IgMTYKLSByZXR1cm4gLSAwIHN1Y2VzcwotKi8KLQotaW50IFNCQ19pbml0KGludCBwY21fc2FtcGxlX2ZyZXEsIGludCBjaGFubmVscywgaW50IGJpdHNfcGVyX3NhbXBsZSk7Ci0KLS8qCi0gU0JDX3dyaXRlIC0gY2FsbGVkIHJlcGVhdGVkbHkgd2l0aCBwY21faW4gcG9pbnRlcgotICAgICAgICBpbmNyZWFzaW5nIGJ5IGxlbmd0aCB1bnRpbCB0cmFjayBpcyBmaW5pc2hlZC4KLQotIHBjbV9pbiAtIHBvaW50ZXIgdG8gUENNIGJ1ZmZlcgotIGxlbmd0aCAtIGFueQotIHNiY19vdXQgLSBwb2ludGVyIHRvIFNCQyBvdXRwdXQgYnVmZmVyCi0gcmV0dXJuIC0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gc2JjX291dAotKi8KLQotaW50IFNCQ193cml0ZSh1bnNpZ25lZCBjaGFyKiBwY21faW4sIGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIqIHNiY19vdXQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlL3NiY190eXBlcy5oIGIvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUvc2JjX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzdkMDMuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUvc2JjX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIERhdGEgdHlwZSBkZWNsYXJhdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBTQkNfVFlQRVNfSAotI2RlZmluZSBTQkNfVFlQRVNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLQotI2RlZmluZSBhYnMzMih4KSAoKCh4KSA+PSAwKSA/ICh4KSA6ICgtKHgpKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfYW5hbHlzaXMuYyBiL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19hbmFseXNpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWE5YTVjLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19hbmFseXNpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0aGF0IHBlcmZvcm1zIEFuYWx5c2lzIG9mIHRoZSBpbnB1dCBhdWRpbwotICogIHN0cmVhbS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInNiY19lbmNfZnVuY19kZWNsYXJlLmgiCi0jaW5jbHVkZSAic2JjX2VuY29kZXIuaCIKLS8qI2luY2x1ZGUgPG1hdGguaD4qLwotCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX1dJTkRPV19BQ0NVID09IFRSVUUpCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18wXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoaW50MzJfdCkweDAxNjU5RjQ1IC8qIGdhczMyQ29lZmZGb3I0U0JzWzhdID0gLWdhczMyQ29lZmZGb3I0U0JzWzMyXSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjU5RjQ1ICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18wXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKGludDMyX3QpMHgxMTVCMUVEMiAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxNl0gPSAtZ2FzMzJDb2VmZkZvcjRTQnNbMjRdID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE1QjFFRDIgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzFfMCBcCi0gIChpbnQzMl90KTB4MDAxMTk0RTYgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMSBldCAzOV0gPSAweDAwMTE5NEU2ICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18xXzEgXAotICAoaW50MzJfdCkweDAyOURCQUEzIC8qIGdhczMyQ29lZmZGb3I0U0JzWzkgZXQgMzFdID0gMHgwMjlEQkFBMyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMV8yIFwKLSAgKGludDMyX3QpMHgxOEY1NUM5MCAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxNyBldCAyM10gPSAweDE4RjU1QzkwICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18xXzMgXAotICAoaW50MzJfdCkweEY2MEZBRjM3IC8qIGdhczMyQ29lZmZGb3I0U0JzWzE1IGV0IDI1XSA9IDB4RjYwRkFGMzcgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzFfNCBcCi0gIChpbnQzMl90KTB4RkY5QkI5RDUgLyogZ2FzMzJDb2VmZkZvcjRTQnNbNyBldCAzM10gPSAweEZGOUJCOUQ1ICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18yXzAgXAotICAoaW50MzJfdCkweDAwMzBFMkQzIC8qIGdhczMyQ29lZmZGb3I0U0JzWzIgZXQgMzhdID0gMHgwMDMwRTJEMyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMl8xIFwKLSAgKGludDMyX3QpMHgwM0IyMzM0MSAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxMCBldCAzMF0gPSAweDAzQjIzMzQxICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18yXzIgXAotICAoaW50MzJfdCkweDFGOTFDQTQ2IC8qIGdhczMyQ29lZmZGb3I0U0JzWzE4IGV0IDIyXSA9IDB4MUY5MUNBNDYgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzJfMyBcCi0gIChpbnQzMl90KTB4RkM0RjkxRDQgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTQgZXQgMjZdID0gMHhGQzRGOTFENCAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMl80IFwKLSAgKGludDMyX3QpMHgwMDNEMjM5QiAvKiBnYXMzMkNvZWZmRm9yNFNCc1s2IGV0IDM0XSA9IDB4MDAzRDIzOUIgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzNfMCBcCi0gIChpbnQzMl90KTB4MDA1OTk0MDMgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMyBldCAzN10gPSAweDAwNTk5NDAzICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18zXzEgXAotICAoaW50MzJfdCkweDA0MUVFRTQwIC8qIGdhczMyQ29lZmZGb3I0U0JzWzExIGV0IDI5XSA9IDB4MDQxRUVFNDAgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzNfMiBcCi0gIChpbnQzMl90KTB4MjQxMkYyNTEgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTkgZXQgMjFdID0gMHgyNDEyRjI1MSAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfM18zIFwKLSAgKGludDMyX3QpMHgwMEM4RjJCQyAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxMyBldCAyN10gPSAweDAwQzhGMkJDICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18zXzQgXAotICAoaW50MzJfdCkweDAwN0Y4OEU0IC8qIGdhczMyQ29lZmZGb3I0U0JzWzUgZXQgMzVdID0gMHgwMDdGODhFNCAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfNF8wIFwKLSAgKGludDMyX3QpMHgwMDdEQkNDOCAvKiBnYXMzMkNvZWZmRm9yNFNCc1s0IGV0IDM2XSA9IDB4MDA3REJDQzggKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzRfMSBcCi0gIChpbnQzMl90KTB4MDM0RkVFMkMgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTIgZXQgMjhdID0gMHgwMzRGRUUyQyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfNF8yIFwKLSAgKGludDMyX3QpMHgyNUFDMUZGMiAvKiBnYXMzMkNvZWZmRm9yNFNCc1syMF0gPSAweDI1QUMxRkYyICovCi0KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzBfMSAoaW50MzJfdCkweDAwQjk3MzQ4IC8qIDE2IDB4MDBCOTczNDggKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzBfMiAoaW50MzJfdCkweDA4QjQzMDdBIC8qIDMyIDB4MDhCNDMwN0EgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzFfMCAoaW50MzJfdCkweDAwMDUyMTczIC8qIDEgZXQgNzkgPSAweDAwMDUyMTczICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18xXzEgKGludDMyX3QpMHgwMTA3MUI5NiAvKiAxNyBldCA2MyA9IDB4MDEwNzFCOTYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzFfMiAoaW50MzJfdCkweDBBOUYzRTlBIC8qIDMzIGV0IDQ3ID0gMHgwQTlGM0U5QSovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18xXzMgKGludDMyX3QpMHhGOTMxMjg5MSAvKiAzMSBldCA0OSA9IDB4RjkzMTI4OTEgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzFfNCAoaW50MzJfdCkweEZGOEQ2NzkzIC8qIDE1IGV0IDY1ID0gMHhGRjhENjc5MyAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMl8wIChpbnQzMl90KTB4MDAwQjNGNzEgLyogMiBldCA3OCA9IDB4MDAwQjNGNzEgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzJfMSAoaW50MzJfdCkweDAxNTZCM0NBIC8qIDE4IGV0IDYyID0gMHgwMTU2QjNDQSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMl8yIChpbnQzMl90KTB4MEM3RDU5QjYgLyogMzQgZXQgNDYgPSAweDBDN0Q1OUI2ICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18yXzMgKGludDMyX3QpMHhGQUZGOTVGQyAvKiAzMCBldCA1MCA9IDB4RkFGRjk1RkMgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzJfNCAoaW50MzJfdCkweEZGQzlGMTBFIC8qIDE0IGV0IDY2ID0gMHhGRkM5RjEwRSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfM18wIChpbnQzMl90KTB4MDAxMjJDN0QgLyogMyBldCA3NyA9IDB4MDAxMjJDN0QqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfM18xIChpbnQzMl90KTB4MDFBMUIzOEIgLyogMTkgZXQgNjEgPSAweDAxQTFCMzhCICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18zXzIgKGludDMyX3QpMHgwRTNCQjE2RiAvKiAzNSBldCA0NSA9IDB4MEUzQkIxNkYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzNfMyAoaW50MzJfdCkweEZDQTg2RTdFIC8qIDI5IGV0IDUxID0gMHhGQ0E4NkU3RSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfM180IChpbnQzMl90KTB4RkZGQTI0MTMgLyogMTMgZXQgNjcgPSAweEZGRkEyNDEzICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU180XzAgKGludDMyX3QpMHgwMDFBRkY4OSAvKiA0IGV0IDY2ID0gMHgwMDFBRkY4OSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNF8xIChpbnQzMl90KTB4MDFFMDIyNEMgLyogMjAgZXQgNjAgPSAweDAxRTAyMjRDICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU180XzIgKGludDMyX3QpMHgwRkM3MjFGOSAvKiAzNiBldCA0NCA9IDB4MEZDNzIxRjkgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzRfMyAoaW50MzJfdCkweEZFMjA0MzVEIC8qIDI4IGV0IDUyID0gMHhGRTIwNDM1RCAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNF80IChpbnQzMl90KTB4MDAxRDhGRDIgLyogMTIgZXQgNjggPSAweDAwMUQ4RkQyICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU181XzAgKGludDMyX3QpMHgwMDI1NUE2MiAvKiA1IGV0IDc1ID0gMHgwMDI1NUE2MiAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNV8xIChpbnQzMl90KTB4MDIwOTI5MUYgLyogMjEgZXQgNTkgPSAweDAyMDkyOTFGICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU181XzIgKGludDMyX3QpMHgxMTBFQ0VGMCAvKiAzNyBldCA0MyA9IDB4MTEwRUNFRjAgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzVfMyAoaW50MzJfdCkweEZGNUVFQjczIC8qIDI3IGV0ICA1MyA9IDB4RkY1RUVCNzMgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzVfNCAoaW50MzJfdCkweDAwMzRGOEI2IC8qIDExIGV0IDY5ID0gMHgwMDM0RjhCNiAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNl8wIChpbnQzMl90KTB4MDAzMDYwRjQgLyogNiBldCA3NCA9IDB4MDAzMDYwRjQgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzZfMSAoaW50MzJfdCkweDAyMTM4NjUzIC8qIDIyIGV0IDU4ID0gMHgwMjEzODY1MyAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNl8yIChpbnQzMl90KTB4MTIwNDM1RkEgLyogMzggZXQgNDIgPSAweDEyMDQzNUZBICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU182XzMgKGludDMyX3QpMHgwMDVGRDBGRiAvKiAyNiBldCA1NCA9IDB4MDA1RkQwRkYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzZfNCAoaW50MzJfdCkweDAwNDE1Qjc1IC8qIDEwIGV0IDcwID0gMHgwMDQxNUI3NSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfN18wIChpbnQzMl90KTB4MDAzQTcyRTcgLyogNyBldCA3MyA9IDB4MDAzQTcyRTcgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzdfMSAoaW50MzJfdCkweDAxRjVGNDI0IC8qIDIzIGV0IDU3ID0gMHgwMUY1RjQyNCAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfN18yIChpbnQzMl90KTB4MTI5QzIyNkYgLyogMzkgZXQgNDEgPSAweDEyOUMyMjZGICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU183XzMgKGludDMyX3QpMHgwMTIyM0VCQSAvKiAyNSBldCA1NSA9IDB4MDEyMjNFQkEgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzdfNCAoaW50MzJfdCkweDAwNDRFRjQ4IC8qIDkgZXQgNzEgPSAweDAwNDRFRjQ4ICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU184XzAgKGludDMyX3QpMHgwMDQxRUM2QSAvKiA4IGV0IDcyID0gMHgwMDQxRUM2QSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfOF8xIChpbnQzMl90KTB4MDFBN0VDRUYgLyogMjQgZXQgNTYgPSAweDAxQTdFQ0VGICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU184XzIgKGludDMyX3QpMHgxMkNGNkM3NSAvKiA0MCA9IDB4MTJDRjZDNzUgKi8KLSNlbHNlCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18wXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChpbnQxNl90KTB4MDE2NiAvKiBnYXMzMkNvZWZmRm9yNFNCc1s4XSA9IC1nYXMzMkNvZWZmRm9yNFNCc1szMl0gPSBcCi0gICAgICAgICAgICAgICAgICAgICAweDAxNjU5RjQ1ICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18wXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoaW50MTZfdCkweDExNUIgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTZdID0gLWdhczMyQ29lZmZGb3I0U0JzWzI0XSA9IFwKLSAgICAgICAgICAgICAgICAgICAgIDB4MTE1QjFFRDIgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzFfMCBcCi0gIChpbnQxNl90KTB4MDAxMiAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxIGV0IDM5XSA9IDB4MDAxMTk0RTYgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzFfMSBcCi0gIChpbnQxNl90KTB4MDI5RSAvKiBnYXMzMkNvZWZmRm9yNFNCc1s5IGV0IDMxXSA9IDB4MDI5REJBQTMgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzFfMiBcCi0gIChpbnQxNl90KTB4MThGNSAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxNyBldCAyM10gPSAweDE4RjU1QzkwICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18xXzMgXAotICAoaW50MTZfdCkweEY2MTAgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTUgZXQgMjVdID0gMHhGNjBGQUYzNyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMV80IFwKLSAgKGludDE2X3QpMHhGRjlDIC8qIGdhczMyQ29lZmZGb3I0U0JzWzcgZXQgMzNdID0gMHhGRjlCQjlENSAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMl8wIFwKLSAgKGludDE2X3QpMHgwMDMxIC8qIGdhczMyQ29lZmZGb3I0U0JzWzIgZXQgMzhdID0gMHgwMDMwRTJEMyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMl8xIFwKLSAgKGludDE2X3QpMHgwM0IyIC8qIGdhczMyQ29lZmZGb3I0U0JzWzEwIGV0IDMwXSA9IDB4MDNCMjMzNDEgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzJfMiBcCi0gIChpbnQxNl90KTB4MUY5MSAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxOCBldCAyMl0gPSAweDFGOTFDQTQ2ICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18yXzMgXAotICAoaW50MTZfdCkweEZDNTAgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTQgZXQgMjZdID0gMHhGQzRGOTFENCAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfMl80IFwKLSAgKGludDE2X3QpMHgwMDNEIC8qIGdhczMyQ29lZmZGb3I0U0JzWzYgZXQgMzRdID0gMHgwMDNEMjM5QiAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfM18wIFwKLSAgKGludDE2X3QpMHgwMDVBIC8qIGdhczMyQ29lZmZGb3I0U0JzWzMgZXQgMzddID0gMHgwMDU5OTQwMyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfM18xIFwKLSAgKGludDE2X3QpMHgwNDFGIC8qIGdhczMyQ29lZmZGb3I0U0JzWzExIGV0IDI5XSA9IDB4MDQxRUVFNDAgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzNfMiBcCi0gIChpbnQxNl90KTB4MjQxMyAvKiBnYXMzMkNvZWZmRm9yNFNCc1sxOSBldCAyMV0gPSAweDI0MTJGMjUxICovCi0jZGVmaW5lIFdJTkRfNF9TVUJCQU5EU18zXzMgXAotICAoaW50MTZfdCkweDAwQzkgLyogZ2FzMzJDb2VmZkZvcjRTQnNbMTMgZXQgMjddID0gMHgwMEM4RjJCQyAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfM180IFwKLSAgKGludDE2X3QpMHgwMDgwIC8qIGdhczMyQ29lZmZGb3I0U0JzWzUgZXQgMzVdID0gMHgwMDdGODhFNCAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfNF8wIFwKLSAgKGludDE2X3QpMHgwMDdFIC8qIGdhczMyQ29lZmZGb3I0U0JzWzQgZXQgMzZdID0gMHgwMDdEQkNDOCAqLwotI2RlZmluZSBXSU5EXzRfU1VCQkFORFNfNF8xIFwKLSAgKGludDE2X3QpMHgwMzUwIC8qIGdhczMyQ29lZmZGb3I0U0JzWzEyIGV0IDI4XSA9IDB4MDM0RkVFMkMgKi8KLSNkZWZpbmUgV0lORF80X1NVQkJBTkRTXzRfMiBcCi0gIChpbnQxNl90KTB4MjVBQyAvKiBnYXMzMkNvZWZmRm9yNFNCc1syMF0gPSAyNUFDMUZGMiAqLwotCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18wXzEgKGludDE2X3QpMHgwMEI5IC8qIDE2IDB4MTJDRjZDNzUgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzBfMiAoaW50MTZfdCkweDA4QjQgLyogMzIgMHgwOEI0MzA3QSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMV8wIChpbnQxNl90KTB4MDAwNSAvKiAxIGV0IDc5ID0gMHgwMDA1MjE3MyAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMV8xIChpbnQxNl90KTB4MDEwNyAvKiAxNyBldCA2MyA9IDB4MDEwNzFCOTYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzFfMiAoaW50MTZfdCkweDBBOUYgLyogMzMgZXQgNDcgPSAweDBBOUYzRTlBKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzFfMyAoaW50MTZfdCkweEY5MzEgLyogMzEgZXQgNDkgPSAweEY5MzEyODkxICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18xXzQgKGludDE2X3QpMHhGRjhEIC8qIDE1IGV0IDY1ID0gMHhGRjhENjc5MyAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMl8wIChpbnQxNl90KTB4MDAwQiAvKiAyIGV0IDc4ID0gMHgwMDBCM0Y3MSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMl8xIChpbnQxNl90KTB4MDE1NyAvKiAxOCBldCA2MiA9IDB4MDE1NkIzQ0EgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzJfMiAoaW50MTZfdCkweDBDN0QgLyogMzQgZXQgNDYgPSAweDBDN0Q1OUI2ICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18yXzMgKGludDE2X3QpMHhGQjAwIC8qIDMwIGV0IDUwID0gMHhGQUZGOTVGQyAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfMl80IChpbnQxNl90KTB4RkZDQSAvKiAxNCBldCA2NiA9IDB4RkZDOUYxMEUgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzNfMCAoaW50MTZfdCkweDAwMTIgLyogMyBldCA3NyA9IDB4MDAxMjJDN0QqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfM18xIChpbnQxNl90KTB4MDFBMiAvKiAxOSBldCA2MSA9IDB4MDFBMUIzOEIgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzNfMiAoaW50MTZfdCkweDBFM0MgLyogMzUgZXQgNDUgPSAweDBFM0JCMTZGICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU18zXzMgKGludDE2X3QpMHhGQ0E4IC8qIDI5IGV0IDUxID0gMHhGQ0E4NkU3RSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfM180IChpbnQxNl90KTB4RkZGQSAvKiAxMyBldCA2NyA9IDB4RkZGQTI0MTMgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzRfMCAoaW50MTZfdCkweDAwMUIgLyogNCBldCA2NiA9IDB4MDAxQUZGODkgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzRfMSAoaW50MTZfdCkweDAxRTAgLyogMjAgZXQgNjAgPSAweDAxRTAyMjRDICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU180XzIgKGludDE2X3QpMHgwRkM3IC8qIDM2IGV0IDQ0ID0gMHgwRkM3MjFGOSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNF8zIChpbnQxNl90KTB4RkUyMCAvKiAyOCBldCA1MiA9IDB4RkUyMDQzNUQgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzRfNCAoaW50MTZfdCkweDAwMUUgLyogMTIgZXQgNjggPSAweDAwMUQ4RkQyICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU181XzAgKGludDE2X3QpMHgwMDI1IC8qIDUgZXQgNzUgPSAweDAwMjU1QTYyICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU181XzEgKGludDE2X3QpMHgwMjA5IC8qIDIxIGV0IDU5ID0gMHgwMjA5MjkxRiAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNV8yIChpbnQxNl90KTB4MTEwRiAvKiAzNyBldCA0MyA9IDB4MTEwRUNFRjAgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzVfMyAoaW50MTZfdCkweEZGNUYgLyogMjcgZXQgIDUzID0gMHhGRjVFRUI3MyAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNV80IChpbnQxNl90KTB4MDAzNSAvKiAxMSBldCA2OSA9IDB4MDAzNEY4QjYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzZfMCAoaW50MTZfdCkweDAwMzAgLyogNiBldCA3NCA9IDB4MDAzMDYwRjQgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzZfMSAoaW50MTZfdCkweDAyMTQgLyogMjIgZXQgNTggPSAweDAyMTM4NjUzICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU182XzIgKGludDE2X3QpMHgxMjA0IC8qIDM4IGV0IDQyID0gMHgxMjA0MzVGQSAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfNl8zIChpbnQxNl90KTB4MDA2MCAvKiAyNiBldCA1NCA9IDB4MDA1RkQwRkYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzZfNCAoaW50MTZfdCkweDAwNDEgLyogMTAgZXQgNzAgPSAweDAwNDE1Qjc1ICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU183XzAgKGludDE2X3QpMHgwMDNBIC8qIDcgZXQgNzMgPSAweDAwM0E3MkU3ICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU183XzEgKGludDE2X3QpMHgwMUY2IC8qIDIzIGV0IDU3ID0gMHgwMUY1RjQyNCAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfN18yIChpbnQxNl90KTB4MTI5QyAvKiAzOSBldCA0MSA9IDB4MTI5QzIyNkYgKi8KLSNkZWZpbmUgV0lORF84X1NVQkJBTkRTXzdfMyAoaW50MTZfdCkweDAxMjIgLyogMjUgZXQgNTUgPSAweDAxMjIzRUJBICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU183XzQgKGludDE2X3QpMHgwMDQ1IC8qIDkgZXQgNzEgPSAweDAwNDRFRjQ4ICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU184XzAgKGludDE2X3QpMHgwMDQyIC8qIDggZXQgNzIgPSAweDAwNDFFQzZBICovCi0jZGVmaW5lIFdJTkRfOF9TVUJCQU5EU184XzEgKGludDE2X3QpMHgwMUE4IC8qIDI0IGV0IDU2ID0gMHgwMUE3RUNFRiAqLwotI2RlZmluZSBXSU5EXzhfU1VCQkFORFNfOF8yIChpbnQxNl90KTB4MTJDRiAvKiA0MCA9IDB4MTJDRjZDNzUgKi8KLSNlbmRpZgotCi0jaWYgKFNCQ19VU0VfQVJNX1BSQUdNQSA9PSBUUlVFKQotI3ByYWdtYSBhcm0gc2VjdGlvbiB6aWRhdGEgPSAic2JjX3MzMl9hbmFseXNpc19zZWN0aW9uIgotI2VuZGlmCi1zdGF0aWMgaW50MzJfdCBzMzJEQ1RZWzE2XSA9IHswfTsKLXN0YXRpYyBpbnQzMl90IHMzMlhbRU5DX1ZYX0JVRkZFUl9TSVpFIC8gMl07Ci1zdGF0aWMgaW50MTZfdCogczE2WCA9Ci0gICAgKGludDE2X3QqKXMzMlg7IC8qIHMxNlggbXVzdCBiZSAzMiBiaXRzIGFsaWduZWQgY2YgIFNISUZUVVBfWDhfMiovCi0jaWYgKFNCQ19VU0VfQVJNX1BSQUdNQSA9PSBUUlVFKQotI3ByYWdtYSBhcm0gc2VjdGlvbiB6aWRhdGEKLSNlbmRpZgotCi0vKiBUaGlzIG1hY3JvIGlzIGZvciA0IHN1YmJhbmRzICovCi0jZGVmaW5lIFNISUZUVVBfWDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBzMzJYID0gKGludDMyX3QqKShzMTZYICsgRW5jTWF4U2hpZnRDb3VudGVyICsgMzgpOyBcCi0gICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpwczMyWCA9ICoocHMzMlggLSAyIC0gKFNoaWZ0Q291bnRlciA+PiAxKSk7ICAgICAgXAotICAgICAgcHMzMlgtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqcHMzMlggPSAqKHBzMzJYIC0gMiAtIChTaGlmdENvdW50ZXIgPj4gMSkpOyAgICAgIFwKLSAgICAgIHBzMzJYLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgU0hJRlRVUF9YNF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBzMzJYID0gKGludDMyX3QqKShzMTZYICsgRW5jTWF4U2hpZnRDb3VudGVyICsgMzgpOyAgICAgICAgIFwKLSAgICBwczMyWDIgPSAoaW50MzJfdCopKHMxNlggKyAoRW5jTWF4U2hpZnRDb3VudGVyIDw8IDEpICsgNzgpOyBcCi0gICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnBzMzJYID0gKihwczMyWCAtIDIgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICAgICAgICAgIFwKLSAgICAgICoocHMzMlgyKSA9ICoocHMzMlgyIC0gMiAtIChTaGlmdENvdW50ZXIgPj4gMSkpOyAgICAgICAgICBcCi0gICAgICBwczMyWC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcHMzMlgyLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpwczMyWCA9ICoocHMzMlggLSAyIC0gKFNoaWZ0Q291bnRlciA+PiAxKSk7ICAgICAgICAgICAgICBcCi0gICAgICAqKHBzMzJYMikgPSAqKHBzMzJYMiAtIDIgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICAgICAgXAotICAgICAgcHMzMlgtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHBzMzJYMi0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8qIFRoaXMgbWFjcm8gaXMgZm9yIDggc3ViYmFuZHMgKi8KLSNkZWZpbmUgU0hJRlRVUF9YOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHMzMlggPSAoaW50MzJfdCopKHMxNlggKyBFbmNNYXhTaGlmdENvdW50ZXIgKyA3OCk7IFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnBzMzJYID0gKihwczMyWCAtIDQgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICBcCi0gICAgICBwczMyWC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpwczMyWCA9ICoocHMzMlggLSA0IC0gKFNoaWZ0Q291bnRlciA+PiAxKSk7ICAgICAgXAotICAgICAgcHMzMlgtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqcHMzMlggPSAqKHBzMzJYIC0gNCAtIChTaGlmdENvdW50ZXIgPj4gMSkpOyAgICAgIFwKLSAgICAgIHBzMzJYLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnBzMzJYID0gKihwczMyWCAtIDQgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICBcCi0gICAgICBwczMyWC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFNISUZUVVBfWDhfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBzMzJYID0gKGludDMyX3QqKShzMTZYICsgRW5jTWF4U2hpZnRDb3VudGVyICsgNzgpOyAgICAgICAgICBcCi0gICAgcHMzMlgyID0gKGludDMyX3QqKShzMTZYICsgKEVuY01heFNoaWZ0Q291bnRlciA8PCAxKSArIDE1OCk7IFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnBzMzJYID0gKihwczMyWCAtIDQgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICAgICAgICAgICBcCi0gICAgICAqKHBzMzJYMikgPSAqKHBzMzJYMiAtIDQgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICAgICAgIFwKLSAgICAgIHBzMzJYLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcHMzMlgyLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqcHMzMlggPSAqKHBzMzJYIC0gNCAtIChTaGlmdENvdW50ZXIgPj4gMSkpOyAgICAgICAgICAgICAgIFwKLSAgICAgICoocHMzMlgyKSA9ICoocHMzMlgyIC0gNCAtIChTaGlmdENvdW50ZXIgPj4gMSkpOyAgICAgICAgICAgXAotICAgICAgcHMzMlgtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBwczMyWDItLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpwczMyWCA9ICoocHMzMlggLSA0IC0gKFNoaWZ0Q291bnRlciA+PiAxKSk7ICAgICAgICAgICAgICAgXAotICAgICAgKihwczMyWDIpID0gKihwczMyWDIgLSA0IC0gKFNoaWZ0Q291bnRlciA+PiAxKSk7ICAgICAgICAgICBcCi0gICAgICBwczMyWC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHBzMzJYMi0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnBzMzJYID0gKihwczMyWCAtIDQgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICAgICAgICAgICBcCi0gICAgICAqKHBzMzJYMikgPSAqKHBzMzJYMiAtIDQgLSAoU2hpZnRDb3VudGVyID4+IDEpKTsgICAgICAgICAgIFwKLSAgICAgIHBzMzJYLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcHMzMlgyLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBUUlVFKQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20ge1wKLSAgICAgICAgTVVMIHMzMkhpLFdJTkRfOF9TVUJCQU5EU18wXzEsKHMxNlhbQ2hPZmZzZXQrMTZdLXMxNlhbQ2hPZmZzZXQrNjRdKTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfMF8yLChzMTZYW0NoT2Zmc2V0KzMyXS1zMTZYW0NoT2Zmc2V0KzQ4XSksczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVswXSxzMzJIaTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzFfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHtcCi0gICAgICAgIE1VTCBzMzJIaSxXSU5EXzhfU1VCQkFORFNfMV8wLHMxNlhbQ2hPZmZzZXQrMV07XAotICAgICAgICBNVUwgczMySGkyLFdJTkRfOF9TVUJCQU5EU18xXzAsczE2WFtDaE9mZnNldCs2NCsxNV07XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzFfMSxzMTZYW0NoT2Zmc2V0KzE2KzFdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfMV8xLHMxNlhbQ2hPZmZzZXQrNDgrMTVdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfMV8yLHMxNlhbQ2hPZmZzZXQrMzIrMV0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU18xXzIsczE2WFtDaE9mZnNldCszMisxNV0sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU18xXzMsczE2WFtDaE9mZnNldCs0OCsxXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzFfMyxzMTZYW0NoT2Zmc2V0KzE2KzE1XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzFfNCxzMTZYW0NoT2Zmc2V0KzY0KzFdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfMV80LHMxNlhbQ2hPZmZzZXQrMTVdLHMzMkhpMjtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzFdLHMzMkhpO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbMTVdLHMzMkhpMjsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfMl8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20ge1wKLSAgICAgICAgTVVMIHMzMkhpLFdJTkRfOF9TVUJCQU5EU18yXzAsczE2WFtDaE9mZnNldCsyXTtcCi0gICAgICAgIE1VTCBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzJfMCxzMTZYW0NoT2Zmc2V0KzY0KzE0XTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfMl8xLHMxNlhbQ2hPZmZzZXQrMTYrMl0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU18yXzEsczE2WFtDaE9mZnNldCs0OCsxNF0sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU18yXzIsczE2WFtDaE9mZnNldCszMisyXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzJfMixzMTZYW0NoT2Zmc2V0KzMyKzE0XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzJfMyxzMTZYW0NoT2Zmc2V0KzQ4KzJdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfMl8zLHMxNlhbQ2hPZmZzZXQrMTYrMTRdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfMl80LHMxNlhbQ2hPZmZzZXQrNjQrMl0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU18yXzQsczE2WFtDaE9mZnNldCsxNF0sczMySGkyO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbMl0sczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVsxNF0sczMySGkyOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF8zXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfX2FzbSB7XAotICAgICAgICBNVUwgczMySGksV0lORF84X1NVQkJBTkRTXzNfMCxzMTZYW0NoT2Zmc2V0KzNdO1wKLSAgICAgICAgTVVMIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfM18wLHMxNlhbQ2hPZmZzZXQrNjQrMTNdO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU18zXzEsczE2WFtDaE9mZnNldCsxNiszXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzNfMSxzMTZYW0NoT2Zmc2V0KzQ4KzEzXSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzNfMixzMTZYW0NoT2Zmc2V0KzMyKzNdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfM18yLHMxNlhbQ2hPZmZzZXQrMzIrMTNdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfM18zLHMxNlhbQ2hPZmZzZXQrNDgrM10sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU18zXzMsczE2WFtDaE9mZnNldCsxNisxM10sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU18zXzQsczE2WFtDaE9mZnNldCs2NCszXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzNfNCxzMTZYW0NoT2Zmc2V0KzEzXSxzMzJIaTI7XAotICAgICAgICBNT1YgczMyRENUWVszXSxzMzJIaTtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzEzXSxzMzJIaTI7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzRfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHtcCi0gICAgICAgIE1VTCBzMzJIaSxXSU5EXzhfU1VCQkFORFNfNF8wLHMxNlhbQ2hPZmZzZXQrNF07XAotICAgICAgICBNVUwgczMySGkyLFdJTkRfOF9TVUJCQU5EU180XzAsczE2WFtDaE9mZnNldCs2NCsxMl07XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzRfMSxzMTZYW0NoT2Zmc2V0KzE2KzRdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfNF8xLHMxNlhbQ2hPZmZzZXQrNDgrMTJdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfNF8yLHMxNlhbQ2hPZmZzZXQrMzIrNF0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU180XzIsczE2WFtDaE9mZnNldCszMisxMl0sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU180XzMsczE2WFtDaE9mZnNldCs0OCs0XSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzRfMyxzMTZYW0NoT2Zmc2V0KzE2KzEyXSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzRfNCxzMTZYW0NoT2Zmc2V0KzY0KzRdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfNF80LHMxNlhbQ2hPZmZzZXQrMTJdLHMzMkhpMjtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzRdLHMzMkhpO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbMTJdLHMzMkhpMjsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfNV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20ge1wKLSAgICAgICAgTVVMIHMzMkhpLFdJTkRfOF9TVUJCQU5EU181XzAsczE2WFtDaE9mZnNldCs1XTtcCi0gICAgICAgIE1VTCBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzVfMCxzMTZYW0NoT2Zmc2V0KzY0KzExXTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfNV8xLHMxNlhbQ2hPZmZzZXQrMTYrNV0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU181XzEsczE2WFtDaE9mZnNldCs0OCsxMV0sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU181XzIsczE2WFtDaE9mZnNldCszMis1XSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzVfMixzMTZYW0NoT2Zmc2V0KzMyKzExXSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzVfMyxzMTZYW0NoT2Zmc2V0KzQ4KzVdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfNV8zLHMxNlhbQ2hPZmZzZXQrMTYrMTFdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfNV80LHMxNlhbQ2hPZmZzZXQrNjQrNV0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU181XzQsczE2WFtDaE9mZnNldCsxMV0sczMySGkyO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbNV0sczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVsxMV0sczMySGkyOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF82XzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfX2FzbSB7XAotICAgICAgICBNVUwgczMySGksV0lORF84X1NVQkJBTkRTXzZfMCxzMTZYW0NoT2Zmc2V0KzZdO1wKLSAgICAgICAgTVVMIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfNl8wLHMxNlhbQ2hPZmZzZXQrNjQrMTBdO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU182XzEsczE2WFtDaE9mZnNldCsxNis2XSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzZfMSxzMTZYW0NoT2Zmc2V0KzQ4KzEwXSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzZfMixzMTZYW0NoT2Zmc2V0KzMyKzZdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfNl8yLHMxNlhbQ2hPZmZzZXQrMzIrMTBdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfNl8zLHMxNlhbQ2hPZmZzZXQrNDgrNl0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU182XzMsczE2WFtDaE9mZnNldCsxNisxMF0sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU182XzQsczE2WFtDaE9mZnNldCs2NCs2XSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzZfNCxzMTZYW0NoT2Zmc2V0KzEwXSxzMzJIaTI7XAotICAgICAgICBNT1YgczMyRENUWVs2XSxzMzJIaTtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzEwXSxzMzJIaTI7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzdfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHtcCi0gICAgICAgIE1VTCBzMzJIaSxXSU5EXzhfU1VCQkFORFNfN18wLHMxNlhbQ2hPZmZzZXQrN107XAotICAgICAgICBNVUwgczMySGkyLFdJTkRfOF9TVUJCQU5EU183XzAsczE2WFtDaE9mZnNldCs2NCs5XTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfN18xLHMxNlhbQ2hPZmZzZXQrMTYrN10sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU183XzEsczE2WFtDaE9mZnNldCs0OCs5XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzdfMixzMTZYW0NoT2Zmc2V0KzMyKzddLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzhfU1VCQkFORFNfN18yLHMxNlhbQ2hPZmZzZXQrMzIrOV0sczMySGkyO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfOF9TVUJCQU5EU183XzMsczE2WFtDaE9mZnNldCs0OCs3XSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF84X1NVQkJBTkRTXzdfMyxzMTZYW0NoT2Zmc2V0KzE2KzldLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfN180LHMxNlhbQ2hPZmZzZXQrNjQrN10sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfOF9TVUJCQU5EU183XzQsczE2WFtDaE9mZnNldCs5XSxzMzJIaTI7XAotICAgICAgICBNT1YgczMyRENUWVs3XSxzMzJIaTtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzldLHMzMkhpMjsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20ge1wKLSAgICAgICAgTVVMIHMzMkhpLFdJTkRfOF9TVUJCQU5EU184XzAsKHMxNlhbQ2hPZmZzZXQrOF0rczE2WFtDaE9mZnNldCs4KzY0XSk7XAotICAgICAgICBNTEEgczMySGksV0lORF84X1NVQkJBTkRTXzhfMSwoczE2WFtDaE9mZnNldCs4KzE2XStzMTZYW0NoT2Zmc2V0KzgrNjRdKSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzhfU1VCQkFORFNfOF8yLHMxNlhbQ2hPZmZzZXQrOCszMl0sczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVs4XSxzMzJIaTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20ge1wKLSAgICAgICAgTVVMIHMzMkhpLFdJTkRfNF9TVUJCQU5EU18wXzEsKHMxNlhbQ2hPZmZzZXQrOF0tczE2WFtDaE9mZnNldCszMl0pO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfNF9TVUJCQU5EU18wXzIsKHMxNlhbQ2hPZmZzZXQrMTZdLXMxNlhbQ2hPZmZzZXQrMjRdKSxzMzJIaTtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzBdLHMzMkhpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF8xXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHtcCi0gICAgICAgIE1VTCBzMzJIaSxXSU5EXzRfU1VCQkFORFNfMV8wLHMxNlhbQ2hPZmZzZXQrMV07XAotICAgICAgICBNVUwgczMySGkyLFdJTkRfNF9TVUJCQU5EU18xXzAsczE2WFtDaE9mZnNldCszMis3XTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzRfU1VCQkFORFNfMV8xLHMxNlhbQ2hPZmZzZXQrOCsxXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF80X1NVQkJBTkRTXzFfMSxzMTZYW0NoT2Zmc2V0KzI0KzddLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzRfU1VCQkFORFNfMV8yLHMxNlhbQ2hPZmZzZXQrMTYrMV0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfNF9TVUJCQU5EU18xXzIsczE2WFtDaE9mZnNldCsxNis3XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzFfMyxzMTZYW0NoT2Zmc2V0KzI0KzFdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzRfU1VCQkFORFNfMV8zLHMxNlhbQ2hPZmZzZXQrOCs3XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzFfNCxzMTZYW0NoT2Zmc2V0KzMyKzFdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzRfU1VCQkFORFNfMV80LHMxNlhbQ2hPZmZzZXQrN10sczMySGkyO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbMV0sczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVs3XSxzMzJIaTI7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF8yXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHtcCi0gICAgICAgIE1VTCBzMzJIaSxXSU5EXzRfU1VCQkFORFNfMl8wLHMxNlhbQ2hPZmZzZXQrMl07XAotICAgICAgICBNVUwgczMySGkyLFdJTkRfNF9TVUJCQU5EU18yXzAsczE2WFtDaE9mZnNldCszMis2XTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzRfU1VCQkFORFNfMl8xLHMxNlhbQ2hPZmZzZXQrOCsyXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF80X1NVQkJBTkRTXzJfMSxzMTZYW0NoT2Zmc2V0KzI0KzZdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzRfU1VCQkFORFNfMl8yLHMxNlhbQ2hPZmZzZXQrMTYrMl0sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfNF9TVUJCQU5EU18yXzIsczE2WFtDaE9mZnNldCsxNis2XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzJfMyxzMTZYW0NoT2Zmc2V0KzI0KzJdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzRfU1VCQkFORFNfMl8zLHMxNlhbQ2hPZmZzZXQrOCs2XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzJfNCxzMTZYW0NoT2Zmc2V0KzMyKzJdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzRfU1VCQkFORFNfMl80LHMxNlhbQ2hPZmZzZXQrNl0sczMySGkyO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbMl0sczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVs2XSxzMzJIaTI7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF8zXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHtcCi0gICAgICAgIE1VTCBzMzJIaSxXSU5EXzRfU1VCQkFORFNfM18wLHMxNlhbQ2hPZmZzZXQrM107XAotICAgICAgICBNVUwgczMySGkyLFdJTkRfNF9TVUJCQU5EU18zXzAsczE2WFtDaE9mZnNldCszMis1XTtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzRfU1VCQkFORFNfM18xLHMxNlhbQ2hPZmZzZXQrOCszXSxzMzJIaTtcCi0gICAgICAgIE1MQSBzMzJIaTIsV0lORF80X1NVQkJBTkRTXzNfMSxzMTZYW0NoT2Zmc2V0KzI0KzVdLHMzMkhpMjtcCi0gICAgICAgIE1MQSBzMzJIaSxXSU5EXzRfU1VCQkFORFNfM18yLHMxNlhbQ2hPZmZzZXQrMTYrM10sczMySGk7XAotICAgICAgICBNTEEgczMySGkyLFdJTkRfNF9TVUJCQU5EU18zXzIsczE2WFtDaE9mZnNldCsxNis1XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzNfMyxzMTZYW0NoT2Zmc2V0KzI0KzNdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzRfU1VCQkFORFNfM18zLHMxNlhbQ2hPZmZzZXQrOCs1XSxzMzJIaTI7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzNfNCxzMTZYW0NoT2Zmc2V0KzMyKzNdLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpMixXSU5EXzRfU1VCQkFORFNfM180LHMxNlhbQ2hPZmZzZXQrNV0sczMySGkyO1wKLSAgICAgICAgTU9WIHMzMkRDVFlbM10sczMySGk7XAotICAgICAgICBNT1YgczMyRENUWVs1XSxzMzJIaTI7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19hc20ge1wKLSAgICAgICAgTVVMIHMzMkhpLFdJTkRfNF9TVUJCQU5EU180XzAsKHMxNlhbQ2hPZmZzZXQrNF0rczE2WFtDaE9mZnNldCs0KzMyXSk7XAotICAgICAgICBNTEEgczMySGksV0lORF80X1NVQkJBTkRTXzRfMSwoczE2WFtDaE9mZnNldCs0KzhdK3MxNlhbQ2hPZmZzZXQrNCsyNF0pLHMzMkhpO1wKLSAgICAgICAgTUxBIHMzMkhpLFdJTkRfNF9TVUJCQU5EU180XzIsczE2WFtDaE9mZnNldCs0KzE2XSxzMzJIaTtcCi0gICAgICAgIE1PViBzMzJEQ1RZWzRdLHMzMkhpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIFdJTkRPV19QQVJUSUFMXzQgXAotICB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBXSU5ET1dfQUNDVV80XzA7ICAgICBcCi0gICAgV0lORE9XX0FDQ1VfNF8xXzc7ICAgXAotICAgIFdJTkRPV19BQ0NVXzRfMl82OyAgIFwKLSAgICBXSU5ET1dfQUNDVV80XzNfNTsgICBcCi0gICAgV0lORE9XX0FDQ1VfNF80OyAgICAgXAotICB9Ci0KLSNkZWZpbmUgV0lORE9XX1BBUlRJQUxfOCBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFdJTkRPV19BQ0NVXzhfMDsgICAgIFwKLSAgICBXSU5ET1dfQUNDVV84XzFfMTU7ICBcCi0gICAgV0lORE9XX0FDQ1VfOF8yXzE0OyAgXAotICAgIFdJTkRPV19BQ0NVXzhfM18xMzsgIFwKLSAgICBXSU5ET1dfQUNDVV84XzRfMTI7ICBcCi0gICAgV0lORE9XX0FDQ1VfOF81XzExOyAgXAotICAgIFdJTkRPV19BQ0NVXzhfNl8xMDsgIFwKLSAgICBXSU5ET1dfQUNDVV84XzdfOTsgICBcCi0gICAgV0lORE9XX0FDQ1VfOF84OyAgICAgXAotICB9Ci0KLSNlbHNlCi0jaWYgKFNCQ19JUEFRX09QVCA9PSBUUlVFKQotCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX1dJTkRPV19BQ0NVID09IFRSVUUpCi0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9IChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18wXzEgKiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIChpbnQ2NF90KShzMTZYW0NoT2Zmc2V0ICsgMTZdIC0gczE2WFtDaE9mZnNldCArIDY0XSk7ICBcCi0gICAgczY0VGVtcCArPSAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMF8yICogICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAoaW50NjRfdCkoczE2WFtDaE9mZnNldCArIDMyXSAtIHMxNlhbQ2hPZmZzZXQgKyA0OF0pOyBcCi0gICAgczMyRENUWVswXSA9IChpbnQzMl90KShzNjRUZW1wID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF8xXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9IChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18xXzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMV07ICAgIFwKLSAgICBzNjRUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMV8wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDY0ICsgMTVdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzFfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDFdOyAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18xXzEgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyAxNV07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMV8yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgMV07ICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzFfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDE1XTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18xXzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyAxXTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMV8zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE2ICsgMTVdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzFfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDFdOyAgICAgXAotICAgIHM2NFRlbXAyICs9IChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18xXzQgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTVdOyBcCi0gICAgczMyRENUWVsxXSA9IChpbnQzMl90KShzNjRUZW1wID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzE1XSA9IChpbnQzMl90KShzNjRUZW1wMiA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfMl8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMl8wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDJdOyAgICBcCi0gICAgczY0VGVtcDIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzJfMCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDE0XTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18yXzEgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAyXTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMl8xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDQ4ICsgMTRdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzJfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDJdOyAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18yXzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAxNF07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMl8zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDQ4ICsgMl07ICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzJfMyAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDE0XTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18yXzQgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyAyXTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfMl80ICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE0XTsgXAotICAgIHMzMkRDVFlbMl0gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVsxNF0gPSAoaW50MzJfdCkoczY0VGVtcDIgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzNfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzNjRUZW1wID0gKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzNfMCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzXTsgICAgXAotICAgIHM2NFRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18zXzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyAxM107ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfM18xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE2ICsgM107ICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzNfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDEzXTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18zXzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAzXTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfM18yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgMTNdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzNfMyAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDNdOyAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU18zXzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAxM107ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfM180ICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDY0ICsgM107ICAgICBcCi0gICAgczY0VGVtcDIgKz0gKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzNfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxM107IFwKLSAgICBzMzJEQ1RZWzNdID0gKGludDMyX3QpKHM2NFRlbXAgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbMTNdID0gKGludDMyX3QpKHM2NFRlbXAyID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF80XzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9IChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU180XzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNF07ICAgIFwKLSAgICBzNjRUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNF8wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDY0ICsgMTJdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzRfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDRdOyAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU180XzEgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyAxMl07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNF8yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgNF07ICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzRfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDEyXTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU180XzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyA0XTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNF8zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE2ICsgMTJdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzRfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDRdOyAgICAgXAotICAgIHM2NFRlbXAyICs9IChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU180XzQgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTJdOyBcCi0gICAgczMyRENUWVs0XSA9IChpbnQzMl90KShzNjRUZW1wID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzEyXSA9IChpbnQzMl90KShzNjRUZW1wMiA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfNV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNV8wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDVdOyAgICBcCi0gICAgczY0VGVtcDIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzVfMCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDExXTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU181XzEgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyA1XTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNV8xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDQ4ICsgMTFdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzVfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDVdOyAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU181XzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAxMV07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNV8zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDQ4ICsgNV07ICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzVfMyAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDExXTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU181XzQgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyA1XTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNV80ICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDExXTsgXAotICAgIHMzMkRDVFlbNV0gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVsxMV0gPSAoaW50MzJfdCkoczY0VGVtcDIgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzZfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzNjRUZW1wID0gKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzZfMCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA2XTsgICAgXAotICAgIHM2NFRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU182XzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyAxMF07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNl8xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE2ICsgNl07ICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzZfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDEwXTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU182XzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyA2XTsgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNl8yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgMTBdOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzZfMyAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDZdOyAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU182XzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAxMF07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfNl80ICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDY0ICsgNl07ICAgICBcCi0gICAgczY0VGVtcDIgKz0gKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzZfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxMF07IFwKLSAgICBzMzJEQ1RZWzZdID0gKGludDMyX3QpKHM2NFRlbXAgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbMTBdID0gKGludDMyX3QpKHM2NFRlbXAyID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF83XzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfN18wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDddOyAgIFwKLSAgICBzNjRUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU183XzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyA5XTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzdfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDddOyAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfN18xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDQ4ICsgOV07ICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU183XzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyA3XTsgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzdfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDldOyAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfN18zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDQ4ICsgN107ICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU183XzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyA5XTsgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzdfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDddOyAgICBcCi0gICAgczY0VGVtcDIgKz0gKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzdfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA5XTsgXAotICAgIHMzMkRDVFlbN10gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzldID0gKGludDMyX3QpKHM2NFRlbXAyID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9IChpbnQ2NF90KVdJTkRfOF9TVUJCQU5EU184XzAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgKGludDY0X3QpKHMxNlhbQ2hPZmZzZXQgKyA4XSArIHMxNlhbQ2hPZmZzZXQgKyA2NCArIDhdKTsgICAgICAgXAotICAgIHM2NFRlbXAgKz0gKGludDY0X3QpV0lORF84X1NVQkJBTkRTXzhfMSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAoaW50NjRfdCkoczE2WFtDaE9mZnNldCArIDE2ICsgOF0gKyBzMTZYW0NoT2Zmc2V0ICsgNDggKyA4XSk7IFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzhfU1VCQkFORFNfOF8yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgOF07ICAgICBcCi0gICAgczMyRENUWVs4XSA9IChpbnQzMl90KShzNjRUZW1wID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV80XzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMF8xICogICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAoaW50NjRfdCkoczE2WFtDaE9mZnNldCArIDhdIC0gczE2WFtDaE9mZnNldCArIDMyXSk7ICAgXAotICAgIHM2NFRlbXAgKz0gKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzBfMiAqICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgKGludDY0X3QpKHMxNlhbQ2hPZmZzZXQgKyAxNl0gLSBzMTZYW0NoT2Zmc2V0ICsgMjRdKTsgXAotICAgIHMzMkRDVFlbMF0gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzRfMV83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzNjRUZW1wID0gKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzFfMCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxXTsgICAgICBcCi0gICAgczY0VGVtcDIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMV8wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgN107ICAgICAgIFwKLSAgICBzNjRUZW1wICs9IChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18xXzEgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgOCArIDFdOyBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMV8xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDI0ICsgN107ICAgICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18xXzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAxXTsgICAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzFfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDddOyAgICAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMV8zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDI0ICsgMV07ICAgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18xXzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgOCArIDddOyAgICAgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzFfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDFdOyAgICAgICBcCi0gICAgczY0VGVtcDIgKz0gKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzFfNCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA3XTsgICAgXAotICAgIHMzMkRDVFlbMV0gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzddID0gKGludDMyX3QpKHM2NFRlbXAyID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF8yXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMl8wICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDJdOyAgICAgIFwKLSAgICBzNjRUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18yXzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyA2XTsgICAgICAgXAotICAgIHM2NFRlbXAgKz0gKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzJfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA4ICsgMl07IFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18yXzEgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMjQgKyA2XTsgICAgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzJfMiAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDJdOyAgICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMl8yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE2ICsgNl07ICAgICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18yXzMgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMjQgKyAyXTsgICAgICAgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzJfMyAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyA4ICsgNl07ICAgICAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMl80ICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDMyICsgMl07ICAgICAgIFwKLSAgICBzNjRUZW1wMiArPSAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfMl80ICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDZdOyAgICBcCi0gICAgczMyRENUWVsyXSA9IChpbnQzMl90KShzNjRUZW1wID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbNl0gPSAoaW50MzJfdCkoczY0VGVtcDIgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV80XzNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9IChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18zXzAgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgM107ICAgICAgXAotICAgIHM2NFRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzNfMCAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDVdOyAgICAgICBcCi0gICAgczY0VGVtcCArPSAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfM18xICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDggKyAzXTsgXAotICAgIHM2NFRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzNfMSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAyNCArIDVdOyAgICAgICBcCi0gICAgczY0VGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfM18yICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDE2ICsgM107ICAgICAgIFwKLSAgICBzNjRUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18zXzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyA1XTsgICAgICAgXAotICAgIHM2NFRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDY0X3QpV0lORF80X1NVQkJBTkRTXzNfMyAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyAyNCArIDNdOyAgICAgICBcCi0gICAgczY0VGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfM18zICogKGludDY0X3QpczE2WFtDaE9mZnNldCArIDggKyA1XTsgICAgICAgIFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18zXzQgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAzXTsgICAgICAgXAotICAgIHM2NFRlbXAyICs9IChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU18zXzQgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNV07ICAgIFwKLSAgICBzMzJEQ1RZWzNdID0gKGludDMyX3QpKHM2NFRlbXAgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVs1XSA9IChpbnQzMl90KShzNjRUZW1wMiA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfNF8wICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgKGludDY0X3QpKHMxNlhbQ2hPZmZzZXQgKyA0XSArIHMxNlhbQ2hPZmZzZXQgKyA0ICsgMzJdKTsgICAgICBcCi0gICAgczY0VGVtcCArPSAoaW50NjRfdClXSU5EXzRfU1VCQkFORFNfNF8xICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgKGludDY0X3QpKHMxNlhbQ2hPZmZzZXQgKyA0ICsgOF0gKyBzMTZYW0NoT2Zmc2V0ICsgNCArIDI0XSk7IFwKLSAgICBzNjRUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQ2NF90KVdJTkRfNF9TVUJCQU5EU180XzIgKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgNCArIDE2XTsgICAgXAotICAgIHMzMkRDVFlbNF0gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2Vsc2UgLyogU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgPT0gRkFMU0UgKi8KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJUZW1wID0gKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzBfMSAqICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgKGludDMyX3QpKHMxNlhbQ2hPZmZzZXQgKyAxNl0gLSBzMTZYW0NoT2Zmc2V0ICsgNjRdKTsgIFwKLSAgICBzMzJUZW1wICs9IChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18wXzIgKiAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgIChpbnQzMl90KShzMTZYW0NoT2Zmc2V0ICsgMzJdIC0gczE2WFtDaE9mZnNldCArIDQ4XSk7IFwKLSAgICBzMzJEQ1RZWzBdID0gKGludDMyX3QpczMyVGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzFfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJUZW1wID0gKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzFfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxXTsgICAgXAotICAgIHMzMlRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18xXzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyAxNV07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfMV8xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgMV07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzFfMSAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDE1XTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18xXzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAxXTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfMV8yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgMTVdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzFfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDFdOyAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18xXzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAxNV07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfMV80ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDY0ICsgMV07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzFfNCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNV07IFwKLSAgICBzMzJEQ1RZWzFdID0gKGludDMyX3QpczMyVGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbMTVdID0gKGludDMyX3QpczMyVGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF8yXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyVGVtcCA9IChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18yXzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMl07ICAgIFwKLSAgICBzMzJUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfMl8wICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDY0ICsgMTRdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzJfMSAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDJdOyAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18yXzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyAxNF07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfMl8yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgMl07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzJfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDE0XTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18yXzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyAyXTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfMl8zICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgMTRdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzJfNCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDJdOyAgICAgXAotICAgIHMzMlRlbXAyICs9IChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18yXzQgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTRdOyBcCi0gICAgczMyRENUWVsyXSA9IChpbnQzMl90KXMzMlRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzE0XSA9IChpbnQzMl90KXMzMlRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfM18xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMlRlbXAgPSAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfM18wICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDNdOyAgICBcCi0gICAgczMyVGVtcDIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzNfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDEzXTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18zXzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAzXTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfM18xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDQ4ICsgMTNdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzNfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDNdOyAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18zXzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAxM107ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfM18zICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDQ4ICsgM107ICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzNfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDEzXTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU18zXzQgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyAzXTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfM180ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDEzXTsgXAotICAgIHMzMkRDVFlbM10gPSAoaW50MzJfdClzMzJUZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVsxM10gPSAoaW50MzJfdClzMzJUZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzRfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJUZW1wID0gKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzRfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA0XTsgICAgXAotICAgIHMzMlRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU180XzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyAxMl07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNF8xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgNF07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzRfMSAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDEyXTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU180XzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyA0XTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNF8yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgMTJdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzRfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA0OCArIDRdOyAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU180XzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAxMl07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNF80ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDY0ICsgNF07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzRfNCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxMl07IFwKLSAgICBzMzJEQ1RZWzRdID0gKGludDMyX3QpczMyVGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbMTJdID0gKGludDMyX3QpczMyVGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfOF81XzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyVGVtcCA9IChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU181XzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNV07ICAgIFwKLSAgICBzMzJUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNV8wICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDY0ICsgMTFdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzVfMSAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDVdOyAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU181XzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyAxMV07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNV8yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgNV07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzVfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDExXTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU181XzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyA1XTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNV8zICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgMTFdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzVfNCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDVdOyAgICAgXAotICAgIHMzMlRlbXAyICs9IChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU181XzQgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTFdOyBcCi0gICAgczMyRENUWVs1XSA9IChpbnQzMl90KXMzMlRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzExXSA9IChpbnQzMl90KXMzMlRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzhfNl8xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMlRlbXAgPSAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNl8wICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDZdOyAgICBcCi0gICAgczMyVGVtcDIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzZfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDEwXTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU182XzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyA2XTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNl8xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDQ4ICsgMTBdOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzZfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDZdOyAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU182XzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAxMF07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNl8zICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDQ4ICsgNl07ICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzZfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDEwXTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU182XzQgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNjQgKyA2XTsgICAgIFwKLSAgICBzMzJUZW1wMiArPSAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfNl80ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDEwXTsgXAotICAgIHMzMkRDVFlbNl0gPSAoaW50MzJfdClzMzJUZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVsxMF0gPSAoaW50MzJfdClzMzJUZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzdfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyVGVtcCA9IChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU183XzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgN107ICAgXAotICAgIHMzMlRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzdfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA2NCArIDldOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfN18xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgN107ICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU183XzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyA5XTsgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzdfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDddOyAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfN18yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgOV07ICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU183XzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNDggKyA3XTsgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzdfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDldOyAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfN180ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDY0ICsgN107ICAgIFwKLSAgICBzMzJUZW1wMiArPSAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfN180ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDldOyBcCi0gICAgczMyRENUWVs3XSA9IChpbnQzMl90KXMzMlRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbOV0gPSAoaW50MzJfdClzMzJUZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV84XzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJUZW1wID0gKGludDMyX3QpV0lORF84X1NVQkJBTkRTXzhfMCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAoaW50MzJfdCkoczE2WFtDaE9mZnNldCArIDhdICsgczE2WFtDaE9mZnNldCArIDY0ICsgOF0pOyAgICAgICBcCi0gICAgczMyVGVtcCArPSAoaW50MzJfdClXSU5EXzhfU1VCQkFORFNfOF8xICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgIChpbnQzMl90KShzMTZYW0NoT2Zmc2V0ICsgMTYgKyA4XSArIHMxNlhbQ2hPZmZzZXQgKyA0OCArIDhdKTsgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfOF9TVUJCQU5EU184XzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyA4XTsgICAgIFwKLSAgICBzMzJEQ1RZWzhdID0gKGludDMyX3QpczMyVGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyVGVtcCA9IChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18wXzEgKiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIChpbnQzMl90KShzMTZYW0NoT2Zmc2V0ICsgOF0gLSBzMTZYW0NoT2Zmc2V0ICsgMzJdKTsgICBcCi0gICAgczMyVGVtcCArPSAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMF8yICogICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAoaW50MzJfdCkoczE2WFtDaE9mZnNldCArIDE2XSAtIHMxNlhbQ2hPZmZzZXQgKyAyNF0pOyBcCi0gICAgczMyRENUWVswXSA9IChpbnQzMl90KShzMzJUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgV0lORE9XX0FDQ1VfNF8xXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMlRlbXAgPSAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMV8wICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDFdOyAgICAgIFwKLSAgICBzMzJUZW1wMiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18xXzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyA3XTsgICAgICAgXAotICAgIHMzMlRlbXAgKz0gKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzFfMSAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA4ICsgMV07IFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18xXzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMjQgKyA3XTsgICAgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzFfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDFdOyAgICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMV8yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgN107ICAgICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18xXzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMjQgKyAxXTsgICAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzFfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA4ICsgN107ICAgICAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMV80ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgMV07ICAgICAgIFwKLSAgICBzMzJUZW1wMiArPSAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMV80ICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDddOyAgICBcCi0gICAgczMyRENUWVsxXSA9IChpbnQzMl90KShzMzJUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbN10gPSAoaW50MzJfdCkoczMyVGVtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBXSU5ET1dfQUNDVV80XzJfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyVGVtcCA9IChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18yXzAgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMl07ICAgICAgXAotICAgIHMzMlRlbXAyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzJfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDZdOyAgICAgICBcCi0gICAgczMyVGVtcCArPSAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMl8xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDggKyAyXTsgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzJfMSAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAyNCArIDZdOyAgICAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMl8yICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDE2ICsgMl07ICAgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18yXzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyA2XTsgICAgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzJfMyAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAyNCArIDJdOyAgICAgICBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfMl8zICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDggKyA2XTsgICAgICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18yXzQgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMzIgKyAyXTsgICAgICAgXAotICAgIHMzMlRlbXAyICs9IChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18yXzQgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgNl07ICAgIFwKLSAgICBzMzJEQ1RZWzJdID0gKGludDMyX3QpKHMzMlRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVs2XSA9IChpbnQzMl90KShzMzJUZW1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFdJTkRPV19BQ0NVXzRfM181ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJUZW1wID0gKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzNfMCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzXTsgICAgICBcCi0gICAgczMyVGVtcDIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfM18wICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDMyICsgNV07ICAgICAgIFwKLSAgICBzMzJUZW1wICs9IChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18zXzEgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgOCArIDNdOyBcCi0gICAgczMyVGVtcDIgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfM18xICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDI0ICsgNV07ICAgICAgIFwKLSAgICBzMzJUZW1wICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18zXzIgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgMTYgKyAzXTsgICAgICAgXAotICAgIHMzMlRlbXAyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzNfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAxNiArIDVdOyAgICAgICBcCi0gICAgczMyVGVtcCArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoaW50MzJfdClXSU5EXzRfU1VCQkFORFNfM18zICogKGludDMyX3QpczE2WFtDaE9mZnNldCArIDI0ICsgM107ICAgICAgIFwKLSAgICBzMzJUZW1wMiArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU18zXzMgKiAoaW50MzJfdClzMTZYW0NoT2Zmc2V0ICsgOCArIDVdOyAgICAgICAgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzNfNCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyAzMiArIDNdOyAgICAgICBcCi0gICAgczMyVGVtcDIgKz0gKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzNfNCAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA1XTsgICAgXAotICAgIHMzMkRDVFlbM10gPSAoaW50MzJfdCkoczMyVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZWzVdID0gKGludDMyX3QpKHMzMlRlbXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBXSU5ET1dfQUNDVV80XzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyVGVtcCA9IChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU180XzAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAoaW50MzJfdCkoczE2WFtDaE9mZnNldCArIDRdICsgczE2WFtDaE9mZnNldCArIDQgKyAzMl0pOyAgICAgIFwKLSAgICBzMzJUZW1wICs9IChpbnQzMl90KVdJTkRfNF9TVUJCQU5EU180XzEgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAoaW50MzJfdCkoczE2WFtDaE9mZnNldCArIDQgKyA4XSArIHMxNlhbQ2hPZmZzZXQgKyA0ICsgMjRdKTsgXAotICAgIHMzMlRlbXAgKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGludDMyX3QpV0lORF80X1NVQkJBTkRTXzRfMiAqIChpbnQzMl90KXMxNlhbQ2hPZmZzZXQgKyA0ICsgMTZdOyAgICBcCi0gICAgczMyRENUWVs0XSA9IChpbnQzMl90KShzMzJUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLSNkZWZpbmUgV0lORE9XX1BBUlRJQUxfNCBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFdJTkRPV19BQ0NVXzRfMDsgICAgIFwKLSAgICBXSU5ET1dfQUNDVV80XzFfNzsgICBcCi0gICAgV0lORE9XX0FDQ1VfNF8yXzY7ICAgXAotICAgIFdJTkRPV19BQ0NVXzRfM181OyAgIFwKLSAgICBXSU5ET1dfQUNDVV80XzQ7ICAgICBcCi0gIH0KLQotI2RlZmluZSBXSU5ET1dfUEFSVElBTF84IFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgV0lORE9XX0FDQ1VfOF8wOyAgICAgXAotICAgIFdJTkRPV19BQ0NVXzhfMV8xNTsgIFwKLSAgICBXSU5ET1dfQUNDVV84XzJfMTQ7ICBcCi0gICAgV0lORE9XX0FDQ1VfOF8zXzEzOyAgXAotICAgIFdJTkRPV19BQ0NVXzhfNF8xMjsgIFwKLSAgICBXSU5ET1dfQUNDVV84XzVfMTE7ICBcCi0gICAgV0lORE9XX0FDQ1VfOF82XzEwOyAgXAotICAgIFdJTkRPV19BQ0NVXzhfN185OyAgIFwKLSAgICBXSU5ET1dfQUNDVV84Xzg7ICAgICBcCi0gIH0KLSNlbHNlCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX1dJTkRPV19BQ0NVID09IFRSVUUpCi0jZGVmaW5lIFdJTkRPV19BQ0NVXzQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgPSAoKGludDY0X3QpZ2FzMzJDb2VmZkZvcjRTQnNbaV0gKiAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgaV0pOyBcCi0gICAgczY0VGVtcCArPSAoKGludDY0X3QpZ2FzMzJDb2VmZkZvcjRTQnNbKGkgKyA4KV0gKiAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgaSArIDhdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgKz0gKChpbnQ2NF90KWdhczMyQ29lZmZGb3I0U0JzWyhpICsgMTYpXSAqICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKGludDY0X3QpczE2WFtDaE9mZnNldCArIGkgKyAxNl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzNjRUZW1wICs9ICgoaW50NjRfdClnYXMzMkNvZWZmRm9yNFNCc1soaSArIDI0KV0gKiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyBpICsgMjRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCArPSAoKGludDY0X3QpZ2FzMzJDb2VmZkZvcjRTQnNbKGkgKyAzMildICogICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgaSArIDMyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbaV0gPSAoaW50MzJfdCkoczY0VGVtcCA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLypwcmludGYoInMzMkRDVFk0OiAweCV4IFxuIiwgczMyRENUWVtpXSk7Ki8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2Vsc2UKLSNkZWZpbmUgV0lORE9XX0FDQ1VfNChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbaV0gPSAoZ2FzMzJDb2VmZkZvcjRTQnNbaSAqIDJdICogczE2WFtDaE9mZnNldCArIGldKSArICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKCgoaW50MzJfdCkodWludDE2X3QpKGdhczMyQ29lZmZGb3I0U0JzWyhpICogMikgKyAxXSkgKiBcCi0gICAgICAgICAgICAgICAgICAgczE2WFtDaE9mZnNldCArIGldKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZW2ldICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChnYXMzMkNvZWZmRm9yNFNCc1soaSArIDgpICogMl0gKiBzMTZYW0NoT2Zmc2V0ICsgaSArIDhdKSArICAgICAgXAotICAgICAgICAoKChpbnQzMl90KSh1aW50MTZfdCkoZ2FzMzJDb2VmZkZvcjRTQnNbKChpICsgOCkgKiAyKSArIDFdKSAqICAgIFwKLSAgICAgICAgICBzMTZYW0NoT2Zmc2V0ICsgaSArIDhdKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbaV0gKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGdhczMyQ29lZmZGb3I0U0JzWyhpICsgMTYpICogMl0gKiBzMTZYW0NoT2Zmc2V0ICsgaSArIDE2XSkgKyAgICBcCi0gICAgICAgICgoKGludDMyX3QpKHVpbnQxNl90KShnYXMzMkNvZWZmRm9yNFNCc1soKGkgKyAxNikgKiAyKSArIDFdKSAqICAgXAotICAgICAgICAgIHMxNlhbQ2hPZmZzZXQgKyBpICsgMTZdKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVtpXSArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoZ2FzMzJDb2VmZkZvcjRTQnNbKGkgKyAyNCkgKiAyXSAqIHMxNlhbQ2hPZmZzZXQgKyBpICsgMjRdKSArICAgIFwKLSAgICAgICAgKCgoaW50MzJfdCkodWludDE2X3QpKGdhczMyQ29lZmZGb3I0U0JzWygoaSArIDI0KSAqIDIpICsgMV0pICogICBcCi0gICAgICAgICAgczE2WFtDaE9mZnNldCArIGkgKyAyNF0pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZW2ldICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChnYXMzMkNvZWZmRm9yNFNCc1soaSArIDMyKSAqIDJdICogczE2WFtDaE9mZnNldCArIGkgKyAzMl0pICsgICAgXAotICAgICAgICAoKChpbnQzMl90KSh1aW50MTZfdCkoZ2FzMzJDb2VmZkZvcjRTQnNbKChpICsgMzIpICogMikgKyAxXSkgKiAgIFwKLSAgICAgICAgICBzMTZYW0NoT2Zmc2V0ICsgaSArIDMyXSkgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLSNkZWZpbmUgV0lORE9XX1BBUlRJQUxfNCBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFdJTkRPV19BQ0NVXzQoMCk7ICAgIFwKLSAgICBXSU5ET1dfQUNDVV80KDEpOyAgICBcCi0gICAgV0lORE9XX0FDQ1VfNCgyKTsgICAgXAotICAgIFdJTkRPV19BQ0NVXzQoMyk7ICAgIFwKLSAgICBXSU5ET1dfQUNDVV80KDQpOyAgICBcCi0gICAgV0lORE9XX0FDQ1VfNCg1KTsgICAgXAotICAgIFdJTkRPV19BQ0NVXzQoNik7ICAgIFwKLSAgICBXSU5ET1dfQUNDVV80KDcpOyAgICBcCi0gIH0KLQotI2lmIChTQkNfSVNfNjRfTVVMVF9JTl9XSU5ET1dfQUNDVSA9PSBUUlVFKQotI2RlZmluZSBXSU5ET1dfQUNDVV84KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKCgoaW50NjRfdClnYXMzMkNvZWZmRm9yOFNCc1tpXSAqIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyBpXSkpKTsgIFwKLSAgICBzNjRUZW1wICs9ICgoKChpbnQ2NF90KWdhczMyQ29lZmZGb3I4U0JzWyhpICsgMTYpXSAqICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgaSArIDE2XSkpKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHM2NFRlbXAgKz0gKCgoKGludDY0X3QpZ2FzMzJDb2VmZkZvcjhTQnNbKGkgKyAzMildICogICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXMxNlhbQ2hPZmZzZXQgKyBpICsgMzJdKSkpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczY0VGVtcCArPSAoKCgoaW50NjRfdClnYXMzMkNvZWZmRm9yOFNCc1soaSArIDQ4KV0gKiAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgKGludDY0X3QpczE2WFtDaE9mZnNldCArIGkgKyA0OF0pKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzNjRUZW1wICs9ICgoKChpbnQ2NF90KWdhczMyQ29lZmZGb3I4U0JzWyhpICsgNjQpXSAqICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAoaW50NjRfdClzMTZYW0NoT2Zmc2V0ICsgaSArIDY0XSkpKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC8qcHJpbnRmKCJzMzJEQ1RZODogJWQ9IDB4JXggKiAlZFxuIiwgczMyRENUWVtpXSwgZ2FzMzJDb2VmZkZvcjhTQnNbaV0sIFwKLSAgICAgKiBzMTZYW0NoT2Zmc2V0K2ldKTsqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVtpXSA9IChpbnQzMl90KShzNjRUZW1wID4+IDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZWxzZQotI2RlZmluZSBXSU5ET1dfQUNDVV84KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVtpXSA9IChnYXMzMkNvZWZmRm9yOFNCc1tpICogMl0gKiBzMTZYW0NoT2Zmc2V0ICsgaV0pICsgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAoKChpbnQzMl90KSh1aW50MTZfdCkoZ2FzMzJDb2VmZkZvcjhTQnNbKGkgKiAyKSArIDFdKSAqICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBzMTZYW0NoT2Zmc2V0ICsgaV0pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbaV0gKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGdhczMyQ29lZmZGb3I4U0JzWyhpICsgMTYpICogMl0gKiBzMTZYW0NoT2Zmc2V0ICsgaSArIDE2XSkgKyAgICAgICAgICBcCi0gICAgICAgICgoKGludDMyX3QpKHVpbnQxNl90KShnYXMzMkNvZWZmRm9yOFNCc1soKGkgKyAxNikgKiAyKSArIDFdKSAqICAgICAgICAgXAotICAgICAgICAgIHMxNlhbQ2hPZmZzZXQgKyBpICsgMTZdKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgczMyRENUWVtpXSArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoZ2FzMzJDb2VmZkZvcjhTQnNbKGkgKyAzMikgKiAyXSAqIHMxNlhbQ2hPZmZzZXQgKyBpICsgMzJdKSArICAgICAgICAgIFwKLSAgICAgICAgKCgoaW50MzJfdCkodWludDE2X3QpKGdhczMyQ29lZmZGb3I4U0JzWygoaSArIDMyKSAqIDIpICsgMV0pICogICAgICAgICBcCi0gICAgICAgICAgczE2WFtDaE9mZnNldCArIGkgKyAzMl0pID4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJEQ1RZW2ldICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChnYXMzMkNvZWZmRm9yOFNCc1soaSArIDQ4KSAqIDJdICogczE2WFtDaE9mZnNldCArIGkgKyA0OF0pICsgICAgICAgICAgXAotICAgICAgICAoKChpbnQzMl90KSh1aW50MTZfdCkoZ2FzMzJDb2VmZkZvcjhTQnNbKChpICsgNDgpICogMikgKyAxXSkgKiAgICAgICAgIFwKLSAgICAgICAgICBzMTZYW0NoT2Zmc2V0ICsgaSArIDQ4XSkgPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHMzMkRDVFlbaV0gKz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKGdhczMyQ29lZmZGb3I4U0JzWyhpICsgNjQpICogMl0gKiBzMTZYW0NoT2Zmc2V0ICsgaSArIDY0XSkgKyAgICAgICAgICBcCi0gICAgICAgICgoKGludDMyX3QpKHVpbnQxNl90KShnYXMzMkNvZWZmRm9yOFNCc1soKGkgKyA2NCkgKiAyKSArIDFdKSAqICAgICAgICAgXAotICAgICAgICAgIHMxNlhbQ2hPZmZzZXQgKyBpICsgNjRdKSA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLypwcmludGYoInMzMkRDVFk4OiAlZCA9IDB4JTR4JTR4ICogJWRcbiIsIHMzMkRDVFlbaV0sIGdhczMyQ29lZmZGb3I4U0JzW2kgXAotICAgICAqICogMl0sIChnYXMzMkNvZWZmRm9yOFNCc1soaSAqIDIpICsgMV0pLCBzMTZYW0NoT2Zmc2V0K2ldKTsqLyAgICAgICAgICAgIFwKLSAgICAvKnMzMkRDVFlbaV09KGludDMyX3QpKHM2NFRlbXA+PjE2KTsqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNlbmRpZgotI2RlZmluZSBXSU5ET1dfUEFSVElBTF84IFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgV0lORE9XX0FDQ1VfOCgwKTsgICAgXAotICAgIFdJTkRPV19BQ0NVXzgoMSk7ICAgIFwKLSAgICBXSU5ET1dfQUNDVV84KDIpOyAgICBcCi0gICAgV0lORE9XX0FDQ1VfOCgzKTsgICAgXAotICAgIFdJTkRPV19BQ0NVXzgoNCk7ICAgIFwKLSAgICBXSU5ET1dfQUNDVV84KDUpOyAgICBcCi0gICAgV0lORE9XX0FDQ1VfOCg2KTsgICAgXAotICAgIFdJTkRPV19BQ0NVXzgoNyk7ICAgIFwKLSAgICBXSU5ET1dfQUNDVV84KDgpOyAgICBcCi0gICAgV0lORE9XX0FDQ1VfOCg5KTsgICAgXAotICAgIFdJTkRPV19BQ0NVXzgoMTApOyAgIFwKLSAgICBXSU5ET1dfQUNDVV84KDExKTsgICBcCi0gICAgV0lORE9XX0FDQ1VfOCgxMik7ICAgXAotICAgIFdJTkRPV19BQ0NVXzgoMTMpOyAgIFwKLSAgICBXSU5ET1dfQUNDVV84KDE0KTsgICBcCi0gICAgV0lORE9XX0FDQ1VfOCgxNSk7ICAgXAotICB9Ci0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgaW50MTZfdCBTaGlmdENvdW50ZXIgPSAwOwotZXh0ZXJuIGludDE2X3QgRW5jTWF4U2hpZnRDb3VudGVyOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogU2JjQW5hbHlzaXNGaWx0ZXIgLSBwZXJmb3JtcyBBbmFseXNpcyBvZiB0aGUgaW5wdXQgYXVkaW8gc3RyZWFtCi0qCi0qIFJFVFVSTlMgOiBOL0EKLSovCi12b2lkIFNiY0FuYWx5c2lzRmlsdGVyNChTQkNfRU5DX1BBUkFNUyogcHN0ckVuY1BhcmFtcywgaW50MTZfdCogaW5wdXQpIHsKLSAgaW50MTZfdCogcHMxNlBjbUJ1ZjsKLSAgaW50MzJfdCogcHMzMlNiQnVmOwotICBpbnQzMl90IHMzMkJsaywgczMyQ2g7Ci0gIGludDMyX3QgczMyTnVtT2ZDaGFubmVscywgczMyTnVtT2ZCbG9ja3M7Ci0gIGludDMyX3QgaSwgKnBzMzJYLCAqcHMzMlgyOwotICBpbnQzMl90IE9mZnNldCwgT2Zmc2V0MiwgQ2hPZmZzZXQ7Ci0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBUUlVFKQotICByZWdpc3RlciBpbnQzMl90IHMzMkhpLCBzMzJIaTI7Ci0jZWxzZQotI2lmIChTQkNfSVBBUV9PUFQgPT0gVFJVRSkKLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgPT0gVFJVRSkKLSAgcmVnaXN0ZXIgaW50NjRfdCBzNjRUZW1wLCBzNjRUZW1wMjsKLSNlbHNlCi0gIHJlZ2lzdGVyIGludDMyX3QgczMyVGVtcCwgczMyVGVtcDI7Ci0jZW5kaWYKLSNlbHNlCi0KLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgPT0gVFJVRSkKLSAgaW50NjRfdCBzNjRUZW1wOwotI2VuZGlmCi0KLSNlbmRpZgotI2VuZGlmCi0KLSAgczMyTnVtT2ZDaGFubmVscyA9IHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHM7Ci0gIHMzMk51bU9mQmxvY2tzID0gcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZCbG9ja3M7Ci0KLSAgcHMxNlBjbUJ1ZiA9IGlucHV0OwotCi0gIHBzMzJTYkJ1ZiA9IHBzdHJFbmNQYXJhbXMtPnMzMlNiQnVmZmVyOwotICBPZmZzZXQyID0gKGludDMyX3QpKEVuY01heFNoaWZ0Q291bnRlciArIDQwKTsKLSAgZm9yIChzMzJCbGsgPSAwOyBzMzJCbGsgPCBzMzJOdW1PZkJsb2NrczsgczMyQmxrKyspIHsKLSAgICBPZmZzZXQgPSAoaW50MzJfdCkoRW5jTWF4U2hpZnRDb3VudGVyIC0gU2hpZnRDb3VudGVyKTsKLSAgICAvKiBTdG9yZSBuZXcgc2FtcGxlcyAqLwotICAgIGlmIChzMzJOdW1PZkNoYW5uZWxzID09IDEpIHsKLSAgICAgIHMxNlhbMyArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbMiArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbMSArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbMCArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICB9IGVsc2UgewotICAgICAgczE2WFszICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFtPZmZzZXQyICsgMyArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbMiArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbT2Zmc2V0MiArIDIgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYWzEgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYW09mZnNldDIgKyAxICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFswICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFtPZmZzZXQyICsgMCArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICB9Ci0gICAgZm9yIChzMzJDaCA9IDA7IHMzMkNoIDwgczMyTnVtT2ZDaGFubmVsczsgczMyQ2grKykgewotICAgICAgQ2hPZmZzZXQgPSBzMzJDaCAqIE9mZnNldDIgKyBPZmZzZXQ7Ci0KLSAgICAgIFdJTkRPV19QQVJUSUFMXzQKLQotICAgICAgU0JDX0Zhc3RJRENUNChzMzJEQ1RZLCBwczMyU2JCdWYpOwotCi0gICAgICBwczMyU2JCdWYgKz0gU1VCX0JBTkRTXzQ7Ci0gICAgfQotICAgIGlmIChzMzJOdW1PZkNoYW5uZWxzID09IDEpIHsKLSAgICAgIGlmIChTaGlmdENvdW50ZXIgPj0gRW5jTWF4U2hpZnRDb3VudGVyKSB7Ci0gICAgICAgIFNISUZUVVBfWDQ7Ci0gICAgICAgIFNoaWZ0Q291bnRlciA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTaGlmdENvdW50ZXIgKz0gU1VCX0JBTkRTXzQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChTaGlmdENvdW50ZXIgPj0gRW5jTWF4U2hpZnRDb3VudGVyKSB7Ci0gICAgICAgIFNISUZUVVBfWDRfMjsKLSAgICAgICAgU2hpZnRDb3VudGVyID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNoaWZ0Q291bnRlciArPSBTVUJfQkFORFNfNDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLXZvaWQgU2JjQW5hbHlzaXNGaWx0ZXI4KFNCQ19FTkNfUEFSQU1TKiBwc3RyRW5jUGFyYW1zLCBpbnQxNl90KiBpbnB1dCkgewotICBpbnQxNl90KiBwczE2UGNtQnVmOwotICBpbnQzMl90KiBwczMyU2JCdWY7Ci0gIGludDMyX3QgczMyQmxrLCBzMzJDaDsgLyogY291bnRlciBmb3IgYmxvY2sqLwotICBpbnQzMl90IE9mZnNldCwgT2Zmc2V0MjsKLSAgaW50MzJfdCBzMzJOdW1PZkNoYW5uZWxzLCBzMzJOdW1PZkJsb2NrczsKLSAgaW50MzJfdCBpLCAqcHMzMlgsICpwczMyWDI7Ci0gIGludDMyX3QgQ2hPZmZzZXQ7Ci0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBUUlVFKQotICByZWdpc3RlciBpbnQzMl90IHMzMkhpLCBzMzJIaTI7Ci0jZWxzZQotI2lmIChTQkNfSVBBUV9PUFQgPT0gVFJVRSkKLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fV0lORE9XX0FDQ1UgPT0gVFJVRSkKLSAgcmVnaXN0ZXIgaW50NjRfdCBzNjRUZW1wLCBzNjRUZW1wMjsKLSNlbHNlCi0gIHJlZ2lzdGVyIGludDMyX3QgczMyVGVtcCwgczMyVGVtcDI7Ci0jZW5kaWYKLSNlbHNlCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX1dJTkRPV19BQ0NVID09IFRSVUUpCi0gIGludDY0X3QgczY0VGVtcDsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotICBzMzJOdW1PZkNoYW5uZWxzID0gcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZDaGFubmVsczsKLSAgczMyTnVtT2ZCbG9ja3MgPSBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkJsb2NrczsKLQotICBwczE2UGNtQnVmID0gaW5wdXQ7Ci0KLSAgcHMzMlNiQnVmID0gcHN0ckVuY1BhcmFtcy0+czMyU2JCdWZmZXI7Ci0gIE9mZnNldDIgPSAoaW50MzJfdCkoRW5jTWF4U2hpZnRDb3VudGVyICsgODApOwotICBmb3IgKHMzMkJsayA9IDA7IHMzMkJsayA8IHMzMk51bU9mQmxvY2tzOyBzMzJCbGsrKykgewotICAgIE9mZnNldCA9IChpbnQzMl90KShFbmNNYXhTaGlmdENvdW50ZXIgLSBTaGlmdENvdW50ZXIpOwotICAgIC8qIFN0b3JlIG5ldyBzYW1wbGVzICovCi0gICAgaWYgKHMzMk51bU9mQ2hhbm5lbHMgPT0gMSkgewotICAgICAgczE2WFs3ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFs2ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFs1ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFs0ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFszICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFsyICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFsxICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFswICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgIH0gZWxzZSB7Ci0gICAgICBzMTZYWzcgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYW09mZnNldDIgKyA3ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFs2ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFtPZmZzZXQyICsgNiArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbNSArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbT2Zmc2V0MiArIDUgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYWzQgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYW09mZnNldDIgKyA0ICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFszICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFtPZmZzZXQyICsgMyArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbMiArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICAgIHMxNlhbT2Zmc2V0MiArIDIgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYWzEgKyBPZmZzZXRdID0gKnBzMTZQY21CdWY7Ci0gICAgICBwczE2UGNtQnVmKys7Ci0gICAgICBzMTZYW09mZnNldDIgKyAxICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFswICsgT2Zmc2V0XSA9ICpwczE2UGNtQnVmOwotICAgICAgcHMxNlBjbUJ1ZisrOwotICAgICAgczE2WFtPZmZzZXQyICsgMCArIE9mZnNldF0gPSAqcHMxNlBjbUJ1ZjsKLSAgICAgIHBzMTZQY21CdWYrKzsKLSAgICB9Ci0gICAgZm9yIChzMzJDaCA9IDA7IHMzMkNoIDwgczMyTnVtT2ZDaGFubmVsczsgczMyQ2grKykgewotICAgICAgQ2hPZmZzZXQgPSBzMzJDaCAqIE9mZnNldDIgKyBPZmZzZXQ7Ci0KLSAgICAgIFdJTkRPV19QQVJUSUFMXzgKLQotICAgICAgU0JDX0Zhc3RJRENUOChzMzJEQ1RZLCBwczMyU2JCdWYpOwotCi0gICAgICBwczMyU2JCdWYgKz0gU1VCX0JBTkRTXzg7Ci0gICAgfQotICAgIGlmIChzMzJOdW1PZkNoYW5uZWxzID09IDEpIHsKLSAgICAgIGlmIChTaGlmdENvdW50ZXIgPj0gRW5jTWF4U2hpZnRDb3VudGVyKSB7Ci0gICAgICAgIFNISUZUVVBfWDg7Ci0gICAgICAgIFNoaWZ0Q291bnRlciA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTaGlmdENvdW50ZXIgKz0gU1VCX0JBTkRTXzg7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChTaGlmdENvdW50ZXIgPj0gRW5jTWF4U2hpZnRDb3VudGVyKSB7Ci0gICAgICAgIFNISUZUVVBfWDhfMjsKLSAgICAgICAgU2hpZnRDb3VudGVyID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNoaWZ0Q291bnRlciArPSBTVUJfQkFORFNfODsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTYmNBbmFseXNpc0luaXQodm9pZCkgewotICBtZW1zZXQoczE2WCwgMCwgRU5DX1ZYX0JVRkZFUl9TSVpFICogc2l6ZW9mKGludDE2X3QpKTsKLSAgU2hpZnRDb3VudGVyID0gMDsKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19kY3QuYyBiL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19kY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwZWZlNC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfZGN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBzb3VyY2UgZmlsZSBmb3IgZmFzdCBkY3Qgb3BlcmF0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzYmNfZGN0LmgiCi0jaW5jbHVkZSAic2JjX2VuY19mdW5jX2RlY2xhcmUuaCIKLSNpbmNsdWRlICJzYmNfZW5jb2Rlci5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0JDX0Zhc3RJRENUOAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgaW1wbGVtZW50YXRpb24gb2YgZmFzdCBEQ1QgYWxnb3JpdGhtIGJ5IEZlaWcgYW5kIFdpbm9ncmFkCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgeSA9IGRjdChwSW5WZWN0KQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX0lEQ1QgPT0gRkFMU0UpCi0jZGVmaW5lIFNCQ19DT1NfUElfU1VSXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgweDAwMDA1YTgyKSAvKiAoKDB4ODAwMCkgKiAwLjcwNzEpICAgICA9IGNvcyhwaS80KSBcCi0gICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTQkNfQ09TX1BJX1NVUl84IFwKLSAgKDB4MDAwMDc2NDEpIC8qICgoMHg4MDAwKSAqIDAuOTIzOSkgICAgID0gKGNvcyhwaS84KSkgKi8KLSNkZWZpbmUgU0JDX0NPU18zUElfU1VSXzggXAotICAoMHgwMDAwMzBmYikgLyogKCgweDgwMDApICogMC4zODI3KSAgICAgPSAoY29zKDMqcGkvOCkpICovCi0jZGVmaW5lIFNCQ19DT1NfUElfU1VSXzE2IFwKLSAgKDB4MDAwMDdkOGEpIC8qICgoMHg4MDAwKSAqIDAuOTgwOCkpICAgICA9IChjb3MocGkvMTYpKSAqLwotI2RlZmluZSBTQkNfQ09TXzNQSV9TVVJfMTYgXAotICAoMHgwMDAwNmE2ZCkgLyogKCgweDgwMDApICogMC44MzE1KSkgICAgID0gKGNvcygzKnBpLzE2KSkgKi8KLSNkZWZpbmUgU0JDX0NPU181UElfU1VSXzE2IFwKLSAgKDB4MDAwMDQ3MWMpIC8qICgoMHg4MDAwKSAqIDAuNTU1NikpICAgICA9IChjb3MoNSpwaS8xNikpICovCi0jZGVmaW5lIFNCQ19DT1NfN1BJX1NVUl8xNiBcCi0gICgweDAwMDAxOGY4KSAvKiAoKDB4ODAwMCkgKiAwLjE5NTEpKSAgICAgPSAoY29zKDcqcGkvMTYpKSAqLwotI2RlZmluZSBTQkNfSURDVF9NVUxUKGEsIGIsIGMpIFNCQ19NVUxUXzMyXzE2X1NJTVBMSUZJRUQoYSwgYiwgYykKLSNlbHNlCi0jZGVmaW5lIFNCQ19DT1NfUElfU1VSXzQgXAotICAoMHg1QTgyNzk5OSkgLyogKCgweDgwMDAwMDAwKSAqIDAuNzA3MTA2NzgxKSAgICAgID0gKGNvcyhwaS80KSAgICkgKi8KLSNkZWZpbmUgU0JDX0NPU19QSV9TVVJfOCBcCi0gICgweDc2NDFBRjNDKSAvKiAoKDB4ODAwMDAwMDApICogMC45MjM4Nzk1MzMpICAgICAgPSAoY29zKHBpLzgpICAgKSAqLwotI2RlZmluZSBTQkNfQ09TXzNQSV9TVVJfOCBcCi0gICgweDMwRkJDNTREKSAvKiAoKDB4ODAwMDAwMDApICogMC4zODI2ODM0MzIpICAgICAgPSAoY29zKDMqcGkvOCkgKSAqLwotI2RlZmluZSBTQkNfQ09TX1BJX1NVUl8xNiBcCi0gICgweDdEOEE1RjNGKSAvKiAoKDB4ODAwMDAwMDApICogMC45ODA3ODUyOCApKSAgICAgPSAoY29zKHBpLzE2KSAgKSAqLwotI2RlZmluZSBTQkNfQ09TXzNQSV9TVVJfMTYgXAotICAoMHg2QTZEOThBNCkgLyogKCgweDgwMDAwMDAwKSAqIDAuODMxNDY5NjEyKSkgICAgID0gKGNvcygzKnBpLzE2KSkgKi8KLSNkZWZpbmUgU0JDX0NPU181UElfU1VSXzE2IFwKLSAgKDB4NDcxQ0VDRTYpIC8qICgoMHg4MDAwMDAwMCkgKiAwLjU1NTU3MDIzMykpICAgICA9IChjb3MoNSpwaS8xNikpICovCi0jZGVmaW5lIFNCQ19DT1NfN1BJX1NVUl8xNiBcCi0gICgweDE4RjhCODNDKSAvKiAoKDB4ODAwMDAwMDApICogMC4xOTUwOTAzMjIpKSAgICAgPSAoY29zKDcqcGkvMTYpKSAqLwotI2RlZmluZSBTQkNfSURDVF9NVUxUKGEsIGIsIGMpIFNCQ19NVUxUXzMyXzMyKGEsIGIsIGMpCi0jZW5kaWYgLyogU0JDX0lTXzY0X01VTFRfSU5fSURDVCAqLwotCi0jaWYgKFNCQ19GQVNUX0RDVCA9PSBGQUxTRSkKLWV4dGVybiBjb25zdCBpbnQxNl90IGdhczE2QW5hbERDVGNvZWZmOFtdOwotZXh0ZXJuIGNvbnN0IGludDE2X3QgZ2FzMTZBbmFsRENUY29lZmY0W107Ci0jZW5kaWYKLQotdm9pZCBTQkNfRmFzdElEQ1Q4KGludDMyX3QqIHBJblZlY3QsIGludDMyX3QqIHBPdXRWZWN0KSB7Ci0jaWYgKFNCQ19GQVNUX0RDVCA9PSBUUlVFKQotI2lmIChTQkNfQVJNX0FTTV9PUFQgPT0gVFJVRSkKLSNlbHNlCi0jaWYgKFNCQ19JUEFRX09QVCA9PSBUUlVFKQotI2lmIChTQkNfSVNfNjRfTVVMVF9JTl9JRENUID09IFRSVUUpCi0gIGludDY0X3QgczY0VGVtcDsKLSNlbmRpZgotI2Vsc2UKLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fSURDVCA9PSBUUlVFKQotICBpbnQzMl90IHMzMkhpVGVtcDsKLSNlbHNlCi0gIGludDMyX3QgczMySW4yVGVtcDsKLSAgcmVnaXN0ZXIgaW50MzJfdCBzMzJJbjFUZW1wOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0gIHJlZ2lzdGVyIGludDMyX3QgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB0ZW1wOwotICBpbnQzMl90IHJlc19ldmVuWzRdLCByZXNfb2RkWzRdOwotICAvKngwPSAocEluVmVjdFs0XSkvMiA7Ki8KLSAgU0JDX0lEQ1RfTVVMVChTQkNfQ09TX1BJX1NVUl80LCBwSW5WZWN0WzRdLCB4MCk7Ci0gIC8qcHJpbnRmKCJ4MCAweCV4ID0gJWQgPSAlZCAqICVkXG4iLCB4MCwgeDAsIFNCQ19DT1NfUElfU1VSXzQsIHBJblZlY3RbNF0pOyovCi0KLSAgeDEgPSAocEluVmVjdFszXSArIHBJblZlY3RbNV0pID4+IDE7Ci0gIHgyID0gKHBJblZlY3RbMl0gKyBwSW5WZWN0WzZdKSA+PiAxOwotICB4MyA9IChwSW5WZWN0WzFdICsgcEluVmVjdFs3XSkgPj4gMTsKLSAgeDQgPSAocEluVmVjdFswXSArIHBJblZlY3RbOF0pID4+IDE7Ci0gIHg1ID0gKHBJblZlY3RbOV0gLSBwSW5WZWN0WzE1XSkgPj4gMTsKLSAgeDYgPSAocEluVmVjdFsxMF0gLSBwSW5WZWN0WzE0XSkgPj4gMTsKLSAgeDcgPSAocEluVmVjdFsxMV0gLSBwSW5WZWN0WzEzXSkgPj4gMTsKLQotICAvKiAyLXBvaW50IElEQ1Qgb2YgeDAgYW5kIHg0IGFzIGluICgxMSkgKi8KLSAgdGVtcCA9IHgwOwotICBTQkNfSURDVF9NVUxUKFNCQ19DT1NfUElfU1VSXzQsICh4MCArIHg0KSwKLSAgICAgICAgICAgICAgICB4MCk7IC8qeDAgPSAoIHgwICsgeDQgKSAqIGNvcygxKnBpLzQpIDsgKi8KLSAgU0JDX0lEQ1RfTVVMVChTQkNfQ09TX1BJX1NVUl80LCAodGVtcCAtIHg0KSwKLSAgICAgICAgICAgICAgICB4NCk7IC8qeDQgPSAoIHRlbXAgLSB4NCApICogY29zKDEqcGkvNCkgOyAqLwotCi0gIC8qIHJlYXJyYW5nZW1lbnQgb2YgeDIgYW5kIHg2IGFzIGluICgxNSkgKi8KLSAgeDIgLT0geDY7Ci0gIHg2IDw8PSAxOwotCi0gIC8qIDItcG9pbnQgSURDVCBvZiB4MiBhbmQgeDYgYW5kIHBvc3QtbXVsdGlwbGljYXRpb24gYXMgaW4gKDE1KSAqLwotICBTQkNfSURDVF9NVUxUKFNCQ19DT1NfUElfU1VSXzQsIHg2LCB4Nik7IC8qeDYgPSB4NiAqIGNvcygxKnBpLzQpIDsgKi8KLSAgdGVtcCA9IHgyOwotICBTQkNfSURDVF9NVUxUKFNCQ19DT1NfUElfU1VSXzgsICh4MiArIHg2KSwKLSAgICAgICAgICAgICAgICB4Mik7IC8qeDIgPSAoIHgyICsgeDYgKSAqIGNvcygxKnBpLzgpIDsgKi8KLSAgU0JDX0lEQ1RfTVVMVChTQkNfQ09TXzNQSV9TVVJfOCwgKHRlbXAgLSB4NiksCi0gICAgICAgICAgICAgICAgeDYpOyAvKng2ID0gKCB0ZW1wIC0geDYgKSAqIGNvcygzKnBpLzgpIDsqLwotCi0gIC8qIDQtcG9pbnQgSURDVCBvZiB4MCx4Mix4NCBhbmQgeDYgYXMgaW4gKDExKSAqLwotICByZXNfZXZlblswXSA9IHgwICsgeDI7Ci0gIHJlc19ldmVuWzFdID0geDQgKyB4NjsKLSAgcmVzX2V2ZW5bMl0gPSB4NCAtIHg2OwotICByZXNfZXZlblszXSA9IHgwIC0geDI7Ci0KLSAgLyogcmVhcnJhbmdlbWVudCBvZiB4MSx4Myx4NSx4NyBhcyBpbiAoMTUpICovCi0gIHg3IDw8PSAxOwotICB4NSA9ICh4NSA8PCAxKSAtIHg3OwotICB4MyA9ICh4MyA8PCAxKSAtIHg1OwotICB4MSAtPSB4MyA+PiAxOwotCi0gIC8qIHR3by1kaW1lbnNpb25hbCBJRENUIG9mIHgxIGFuZCB4NSAqLwotICBTQkNfSURDVF9NVUxUKFNCQ19DT1NfUElfU1VSXzQsIHg1LCB4NSk7IC8qeDUgPSB4NSAqIGNvcygxKnBpLzQpIDsgKi8KLSAgdGVtcCA9IHgxOwotICB4MSA9IHgxICsgeDU7Ci0gIHg1ID0gdGVtcCAtIHg1OwotCi0gIC8qIHJlYXJyYW5nZW1lbnQgb2YgeDMgYW5kIHg3IGFzIGluICgxNSkgKi8KLSAgeDMgLT0geDc7Ci0gIHg3IDw8PSAxOwotICBTQkNfSURDVF9NVUxUKFNCQ19DT1NfUElfU1VSXzQsIHg3LCB4Nyk7IC8qeDcgPSB4NyAqIGNvcygxKnBpLzQpIDsgKi8KLQotICAvKiAyLXBvaW50IElEQ1Qgb2YgeDMgYW5kIHg3IGFuZCBwb3N0LW11bHRpcGxpY2F0aW9uIGFzIGluICgxNSkgKi8KLSAgdGVtcCA9IHgzOwotICBTQkNfSURDVF9NVUxUKFNCQ19DT1NfUElfU1VSXzgsICh4MyArIHg3KSwKLSAgICAgICAgICAgICAgICB4Myk7IC8qeDMgPSAoIHgzICsgeDcgKSAqIGNvcygxKnBpLzgpICA7ICovCi0gIFNCQ19JRENUX01VTFQoU0JDX0NPU18zUElfU1VSXzgsICh0ZW1wIC0geDcpLAotICAgICAgICAgICAgICAgIHg3KTsgLyp4NyA9ICggdGVtcCAtIHg3ICkgKiBjb3MoMypwaS84KSA7Ki8KLQotICAvKiA0LXBvaW50IElEQ1Qgb2YgeDEseDMseDUgYW5kIHg3IGFuZCBwb3N0IG11bHRpcGxpY2F0aW9uIGJ5IGRpYWdvbmFsIG1hdHJpeAotICAgKiBhcyBpbiAoMTQpICovCi0gIFNCQ19JRENUX01VTFQoKFNCQ19DT1NfUElfU1VSXzE2KSwgKHgxICsgeDMpLAotICAgICAgICAgICAgICAgIHJlc19vZGRbMF0pOyAvKnJlc19vZGRbIDAgXSA9ICggeDEgKyB4MyApICogY29zKDEqcGkvMTYpIDsgKi8KLSAgU0JDX0lEQ1RfTVVMVCgoU0JDX0NPU18zUElfU1VSXzE2KSwgKHg1ICsgeDcpLAotICAgICAgICAgICAgICAgIHJlc19vZGRbMV0pOyAvKnJlc19vZGRbIDEgXSA9ICggeDUgKyB4NyApICogY29zKDMqcGkvMTYpIDsgKi8KLSAgU0JDX0lEQ1RfTVVMVCgoU0JDX0NPU181UElfU1VSXzE2KSwgKHg1IC0geDcpLAotICAgICAgICAgICAgICAgIHJlc19vZGRbMl0pOyAvKnJlc19vZGRbIDIgXSA9ICggeDUgLSB4NyApICogY29zKDUqcGkvMTYpIDsgKi8KLSAgU0JDX0lEQ1RfTVVMVCgoU0JDX0NPU183UElfU1VSXzE2KSwgKHgxIC0geDMpLAotICAgICAgICAgICAgICAgIHJlc19vZGRbM10pOyAvKnJlc19vZGRbIDMgXSA9ICggeDEgLSB4MyApICogY29zKDcqcGkvMTYpIDsgKi8KLQotICAvKiBhZGRpdGlvbnMgYW5kIHN1YnRyYWN0aW9ucyBhcyBpbiAoOSkgKi8KLSAgcE91dFZlY3RbMF0gPSAocmVzX2V2ZW5bMF0gKyByZXNfb2RkWzBdKTsKLSAgcE91dFZlY3RbMV0gPSAocmVzX2V2ZW5bMV0gKyByZXNfb2RkWzFdKTsKLSAgcE91dFZlY3RbMl0gPSAocmVzX2V2ZW5bMl0gKyByZXNfb2RkWzJdKTsKLSAgcE91dFZlY3RbM10gPSAocmVzX2V2ZW5bM10gKyByZXNfb2RkWzNdKTsKLSAgcE91dFZlY3RbN10gPSAocmVzX2V2ZW5bMF0gLSByZXNfb2RkWzBdKTsKLSAgcE91dFZlY3RbNl0gPSAocmVzX2V2ZW5bMV0gLSByZXNfb2RkWzFdKTsKLSAgcE91dFZlY3RbNV0gPSAocmVzX2V2ZW5bMl0gLSByZXNfb2RkWzJdKTsKLSAgcE91dFZlY3RbNF0gPSAocmVzX2V2ZW5bM10gLSByZXNfb2RkWzNdKTsKLSNlbHNlCi0gIHVpbnQ4X3QgSW5kZXgsIGs7Ci0gIGludDMyX3QgdGVtcDsKLSAgLypDYWxjdWxhdGUgNCBzdWJiYW5kIHNhbXBsZXMgYnkgbWF0cml4aW5nKi8KLSAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgODsgSW5kZXgrKykgewotICAgIHRlbXAgPSAwOwotICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKSB7Ci0gICAgICAvKnRlbXAgKz0gKGludDMyX3QpKCgoaW50NjRfdClNWyhJbmRleCpzdHJFbmNQYXJhbXMtPm51bU9mU3ViQmFuZHMqMikra10gKgotICAgICAgICogWVtrXSkgPj4gMTYgKTsqLwotICAgICAgdGVtcCArPSAoZ2FzMTZBbmFsRENUY29lZmY4WyhJbmRleCAqIDggKiAyKSArIGtdICogKHBJblZlY3Rba10gPj4gMTYpKTsKLSAgICAgIHRlbXAgKz0KLSAgICAgICAgICAoKGdhczE2QW5hbERDVGNvZWZmOFsoSW5kZXggKiA4ICogMikgKyBrXSAqIChwSW5WZWN0W2tdICYgMHhGRkZGKSkgPj4KLSAgICAgICAgICAgMTYpOwotICAgIH0KLSAgICBwT3V0VmVjdFtJbmRleF0gPSB0ZW1wOwotICB9Ci0jZW5kaWYKLSAgLyogICAgcHJpbnRmKCJwT3V0VmVjdDogMHgleDsweCV4OzB4JXg7MHgleDsweCV4OzB4JXg7MHgleDsweCV4XG4iLFwKLSAgICAgICAgICBwT3V0VmVjdFswXSxwT3V0VmVjdFsxXSxwT3V0VmVjdFsyXSxwT3V0VmVjdFszXSxwT3V0VmVjdFs0XSxwT3V0VmVjdFs1XSxwT3V0VmVjdFs2XSxwT3V0VmVjdFs3XSk7Ki8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNCQ19GYXN0SURDVDQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGltcGxlbWVudGF0aW9uIG9mIGZhc3QgRENUIGFsZ29yaXRobSBieSBGZWlnIGFuZCBXaW5vZ3JhZAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHkgPSBkY3QoeDApCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNCQ19GYXN0SURDVDQoaW50MzJfdCogcEluVmVjdCwgaW50MzJfdCogcE91dFZlY3QpIHsKLSNpZiAoU0JDX0ZBU1RfRENUID09IFRSVUUpCi0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBUUlVFKQotI2Vsc2UKLSNpZiAoU0JDX0lQQVFfT1BUID09IFRSVUUpCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX0lEQ1QgPT0gVFJVRSkKLSAgaW50NjRfdCBzNjRUZW1wOwotI2VuZGlmCi0jZWxzZQotI2lmIChTQkNfSVNfNjRfTVVMVF9JTl9JRENUID09IFRSVUUpCi0gIGludDMyX3QgczMySGlUZW1wOwotI2Vsc2UKLSAgdWludDE2X3QgczMySW4yVGVtcDsKLSAgaW50MzJfdCBzMzJJbjFUZW1wOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotICBpbnQzMl90IHRlbXAsIHgyOwotICBpbnQzMl90IHRtcFs4XTsKLQotICB4MiA9IHBJblZlY3RbMl0gPj4gMTsKLSAgdGVtcCA9IChwSW5WZWN0WzBdICsgcEluVmVjdFs0XSk7Ci0gIFNCQ19JRENUX01VTFQoKFNCQ19DT1NfUElfU1VSXzQgPj4gMSksIHRlbXAsIHRtcFswXSk7Ci0gIHRtcFsxXSA9IHgyIC0gdG1wWzBdOwotICB0bXBbMF0gKz0geDI7Ci0gIHRlbXAgPSAocEluVmVjdFsxXSArIHBJblZlY3RbM10pOwotICBTQkNfSURDVF9NVUxUKChTQkNfQ09TXzNQSV9TVVJfOCA+PiAxKSwgdGVtcCwgdG1wWzNdKTsKLSAgU0JDX0lEQ1RfTVVMVCgoU0JDX0NPU19QSV9TVVJfOCA+PiAxKSwgdGVtcCwgdG1wWzJdKTsKLSAgdGVtcCA9IChwSW5WZWN0WzVdIC0gcEluVmVjdFs3XSk7Ci0gIFNCQ19JRENUX01VTFQoKFNCQ19DT1NfM1BJX1NVUl84ID4+IDEpLCB0ZW1wLCB0bXBbNV0pOwotICBTQkNfSURDVF9NVUxUKChTQkNfQ09TX1BJX1NVUl84ID4+IDEpLCB0ZW1wLCB0bXBbNF0pOwotICB0bXBbNl0gPSB0bXBbMl0gKyB0bXBbNV07Ci0gIHRtcFs3XSA9IHRtcFszXSAtIHRtcFs0XTsKLSAgcE91dFZlY3RbMF0gPSAodG1wWzBdICsgdG1wWzZdKTsKLSAgcE91dFZlY3RbMV0gPSAodG1wWzFdICsgdG1wWzddKTsKLSAgcE91dFZlY3RbMl0gPSAodG1wWzFdIC0gdG1wWzddKTsKLSAgcE91dFZlY3RbM10gPSAodG1wWzBdIC0gdG1wWzZdKTsKLSNlbHNlCi0gIHVpbnQ4X3QgSW5kZXgsIGs7Ci0gIGludDMyX3QgdGVtcDsKLSAgLypDYWxjdWxhdGUgNCBzdWJiYW5kIHNhbXBsZXMgYnkgbWF0cml4aW5nKi8KLSAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgNDsgSW5kZXgrKykgewotICAgIHRlbXAgPSAwOwotICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKLSAgICAgIC8qdGVtcCArPSAoaW50MzJfdCkoKChpbnQ2NF90KU1bKEluZGV4KnN0ckVuY1BhcmFtcy0+bnVtT2ZTdWJCYW5kcyoyKStrXSAqCi0gICAgICAgKiBZW2tdKSA+PiAxNiApOyAqLwotICAgICAgdGVtcCArPSAoZ2FzMTZBbmFsRENUY29lZmY0WyhJbmRleCAqIDQgKiAyKSArIGtdICogKHBJblZlY3Rba10gPj4gMTYpKTsKLSAgICAgIHRlbXAgKz0KLSAgICAgICAgICAoKGdhczE2QW5hbERDVGNvZWZmNFsoSW5kZXggKiA0ICogMikgKyBrXSAqIChwSW5WZWN0W2tdICYgMHhGRkZGKSkgPj4KLSAgICAgICAgICAgMTYpOwotICAgIH0KLSAgICBwT3V0VmVjdFtJbmRleF0gPSB0ZW1wOwotICB9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19kY3RfY29lZmZzLmMgYi9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfZGN0X2NvZWZmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDdlOWNkLi4wMDAwMDAwCi0tLSBhL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19kY3RfY29lZmZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHRhYmxlIHVzZWQgZm9yIERDVCBjb21wdXRhdGlvbiBpbgotICogIGFuYWx5c2lzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzYmNfZW5jb2Rlci5oIgotLypEQ1QgY29lZmYgZm9yIDQgc3ViLWJhbmQgY2FzZS4qLwotI2lmIChTQkNfRkFTVF9EQ1QgPT0gRkFMU0UpCi1jb25zdCBpbnQxNl90IGdhczE2QW5hbERDVGNvZWZmNFtdID0gewotICAgIChpbnQxNl90KSgwLjcwNzEgKiAzMjc2OCksICAoaW50MTZfdCkoMC45MjM5ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgxLjAwMDAgKiAzMjc2NyksICAoaW50MTZfdCkoMC45MjM5ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjcwNzEgKiAzMjc2OCksICAoaW50MTZfdCkoMC4zODI3ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjAwMDAgKiAzMjc2OCksICAoaW50MTZfdCkoLTAuMzgyNyAqIDMyNzY4KSwKLQotICAgIChpbnQxNl90KSgtMC43MDcxICogMzI3NjgpLCAoaW50MTZfdCkoMC4zODI3ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgxLjAwMDAgKiAzMjc2NyksICAoaW50MTZfdCkoMC4zODI3ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC43MDcxICogMzI3NjgpLCAoaW50MTZfdCkoLTAuOTIzOSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuMDAwMCAqIDMyNzY4KSwgKGludDE2X3QpKDAuOTIzOSAqIDMyNzY4KSwKLQotICAgIChpbnQxNl90KSgtMC43MDcxICogMzI3NjgpLCAoaW50MTZfdCkoLTAuMzgyNyAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMS4wMDAwICogMzI3NjcpLCAgKGludDE2X3QpKC0wLjM4MjcgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjcwNzEgKiAzMjc2OCksIChpbnQxNl90KSgwLjkyMzkgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuMDAwMCAqIDMyNzY4KSwgIChpbnQxNl90KSgtMC45MjM5ICogMzI3NjgpLAotCi0gICAgKGludDE2X3QpKDAuNzA3MSAqIDMyNzY4KSwgIChpbnQxNl90KSgtMC45MjM5ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgxLjAwMDAgKiAzMjc2NyksICAoaW50MTZfdCkoLTAuOTIzOSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC43MDcxICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjM4MjcgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjAwMDAgKiAzMjc2OCksIChpbnQxNl90KSgwLjM4MjcgKiAzMjc2OCl9OwotCi0vKkRDVCBjb2VmZiBmb3IgOCBzdWItYmFuZCBjYXNlLiovCi1jb25zdCBpbnQxNl90IGdhczE2QW5hbERDVGNvZWZmOFtdID0gewotICAgIChpbnQxNl90KSgwLjcwNzEgKiAzMjc2OCksICAoaW50MTZfdCkoMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjkyMzkgKiAzMjc2OCksICAoaW50MTZfdCkoMC45ODA4ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgxLjAwMDAgKiAzMjc2NyksICAoaW50MTZfdCkoMC45ODA4ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjkyMzkgKiAzMjc2OCksICAoaW50MTZfdCkoMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjcwNzEgKiAzMjc2OCksICAoaW50MTZfdCkoMC41NTU2ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjM4MjcgKiAzMjc2OCksICAoaW50MTZfdCkoMC4xOTUxICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjAwMDAgKiAzMjc2OCksICAoaW50MTZfdCkoLTAuMTk1MSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuMzgyNyAqIDMyNzY4KSwgKGludDE2X3QpKC0wLjU1NTYgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjcwNzEgKiAzMjc2OCksIChpbnQxNl90KSgtMC4xOTUxICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjM4MjcgKiAzMjc2OCksICAoaW50MTZfdCkoMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgxLjAwMDAgKiAzMjc2NyksICAoaW50MTZfdCkoMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjM4MjcgKiAzMjc2OCksICAoaW50MTZfdCkoLTAuMTk1MSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuNzA3MSAqIDMyNzY4KSwgKGludDE2X3QpKC0wLjk4MDggKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjkyMzkgKiAzMjc2OCksIChpbnQxNl90KSgtMC41NTU2ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC4wMDAwICogMzI3NjgpLCAoaW50MTZfdCkoMC41NTU2ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjkyMzkgKiAzMjc2OCksICAoaW50MTZfdCkoMC45ODA4ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC43MDcxICogMzI3NjgpLCAoaW50MTZfdCkoLTAuOTgwOCAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuMzgyNyAqIDMyNzY4KSwgKGludDE2X3QpKDAuNTU1NiAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMS4wMDAwICogMzI3NjcpLCAgKGludDE2X3QpKDAuNTU1NiAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuMzgyNyAqIDMyNzY4KSwgKGludDE2X3QpKC0wLjk4MDggKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjcwNzEgKiAzMjc2OCksIChpbnQxNl90KSgwLjE5NTEgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuOTIzOSAqIDMyNzY4KSwgIChpbnQxNl90KSgwLjgzMTUgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuMDAwMCAqIDMyNzY4KSwgIChpbnQxNl90KSgtMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC45MjM5ICogMzI3NjgpLCAoaW50MTZfdCkoLTAuMTk1MSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC43MDcxICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjU1NTYgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjkyMzkgKiAzMjc2OCksIChpbnQxNl90KSgwLjE5NTEgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDEuMDAwMCAqIDMyNzY3KSwgIChpbnQxNl90KSgwLjE5NTEgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjkyMzkgKiAzMjc2OCksIChpbnQxNl90KSgtMC41NTU2ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjcwNzEgKiAzMjc2OCksICAoaW50MTZfdCkoMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC4zODI3ICogMzI3NjgpLCAoaW50MTZfdCkoLTAuOTgwOCAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuMDAwMCAqIDMyNzY4KSwgKGludDE2X3QpKDAuOTgwOCAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC4zODI3ICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjgzMTUgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuNzA3MSAqIDMyNzY4KSwgIChpbnQxNl90KSgwLjU1NTYgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjkyMzkgKiAzMjc2OCksIChpbnQxNl90KSgtMC4xOTUxICogMzI3NjgpLAotICAgIChpbnQxNl90KSgxLjAwMDAgKiAzMjc2NyksICAoaW50MTZfdCkoLTAuMTk1MSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuOTIzOSAqIDMyNzY4KSwgKGludDE2X3QpKDAuNTU1NiAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC43MDcxICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjgzMTUgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjM4MjcgKiAzMjc2OCksIChpbnQxNl90KSgwLjk4MDggKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuMDAwMCAqIDMyNzY4KSwgIChpbnQxNl90KSgtMC45ODA4ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjM4MjcgKiAzMjc2OCksICAoaW50MTZfdCkoMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC43MDcxICogMzI3NjgpLCAoaW50MTZfdCkoMC45ODA4ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC4zODI3ICogMzI3NjgpLCAoaW50MTZfdCkoLTAuNTU1NiAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMS4wMDAwICogMzI3NjcpLCAgKGludDE2X3QpKC0wLjU1NTYgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjM4MjcgKiAzMjc2OCksIChpbnQxNl90KSgwLjk4MDggKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjcwNzEgKiAzMjc2OCksIChpbnQxNl90KSgtMC4xOTUxICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjkyMzkgKiAzMjc2OCksICAoaW50MTZfdCkoLTAuODMxNSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuMDAwMCAqIDMyNzY4KSwgKGludDE2X3QpKDAuODMxNSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuOTIzOSAqIDMyNzY4KSwgKGludDE2X3QpKDAuMTk1MSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoLTAuNzA3MSAqIDMyNzY4KSwgKGludDE2X3QpKDAuMTk1MSAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC4zODI3ICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjgzMTUgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDEuMDAwMCAqIDMyNzY3KSwgIChpbnQxNl90KSgtMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjM4MjcgKiAzMjc2OCksICAoaW50MTZfdCkoMC4xOTUxICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC43MDcxICogMzI3NjgpLCAoaW50MTZfdCkoMC45ODA4ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC45MjM5ICogMzI3NjgpLCAoaW50MTZfdCkoMC41NTU2ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgtMC4wMDAwICogMzI3NjgpLCAoaW50MTZfdCkoLTAuNTU1NiAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC45MjM5ICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjk4MDggKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuNzA3MSAqIDMyNzY4KSwgIChpbnQxNl90KSgtMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjkyMzkgKiAzMjc2OCksICAoaW50MTZfdCkoLTAuOTgwOCAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMS4wMDAwICogMzI3NjcpLCAgKGludDE2X3QpKC0wLjk4MDggKiAzMjc2OCksCi0gICAgKGludDE2X3QpKDAuOTIzOSAqIDMyNzY4KSwgIChpbnQxNl90KSgtMC44MzE1ICogMzI3NjgpLAotICAgIChpbnQxNl90KSgwLjcwNzEgKiAzMjc2OCksICAoaW50MTZfdCkoLTAuNTU1NiAqIDMyNzY4KSwKLSAgICAoaW50MTZfdCkoMC4zODI3ICogMzI3NjgpLCAgKGludDE2X3QpKC0wLjE5NTEgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjAwMDAgKiAzMjc2OCksIChpbnQxNl90KSgwLjE5NTEgKiAzMjc2OCksCi0gICAgKGludDE2X3QpKC0wLjM4MjcgKiAzMjc2OCksIChpbnQxNl90KSgwLjU1NTYgKiAzMjc2OCl9OwotI2VuZGlmCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfZW5jX2JpdF9hbGxvY19tb25vLmMgYi9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfZW5jX2JpdF9hbGxvY19tb25vLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGNlNmYuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX2VuY19iaXRfYWxsb2NfbW9uby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIGZvciBiaXQgYWxsb2NhdGlvbiBhbGdvcml0aG0uIEl0IGNhbGN1bGF0ZXMKLSAqICB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgZm9yIHRoZSBlbmNvZGVkIHN0cmVhbSBvZiBkYXRhLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qSW5jbHVkZXMqLwotI2luY2x1ZGUgInNiY19lbmNfZnVuY19kZWNsYXJlLmgiCi0jaW5jbHVkZSAic2JjX2VuY29kZXIuaCIKLQotLypnbG9iYWwgYXJyYXlzKi8KLWNvbnN0IGludDE2X3Qgc2JjX2VuY19hczE2T2Zmc2V0NFs0XVs0XSA9IHsKLSAgICB7LTEsIDAsIDAsIDB9LCB7LTIsIDAsIDAsIDF9LCB7LTIsIDAsIDAsIDF9LCB7LTIsIDAsIDAsIDF9fTsKLWNvbnN0IGludDE2X3Qgc2JjX2VuY19hczE2T2Zmc2V0OFs0XVs4XSA9IHt7LTIsIDAsIDAsIDAsIDAsIDAsIDAsIDF9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMywgMCwgMCwgMCwgMCwgMCwgMSwgMn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCAwLCAwLCAwLCAwLCAwLCAxLCAyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIDAsIDAsIDAsIDAsIDAsIDEsIDJ9fTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQml0QWxsb2MgLSBDYWxjdWxhdGVzIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgYml0cyBmb3IgdGhlIGdpdmVuIHNjYWxlIGZhY3RvcgotKiBhbmQgdGhlIG51bWJlciBvZiBzdWJiYW5kcy4KLSoKLSogUkVUVVJOUyA6IE4vQQotKi8KLQotdm9pZCBzYmNfZW5jX2JpdF9hbGxvY19tb25vKFNCQ19FTkNfUEFSQU1TKiBwc3RyQ29kZWNQYXJhbXMpIHsKLSAgaW50MzJfdCBzMzJNYXhCaXROZWVkOyAvKnRvIHN0b3JlIHRoZSBtYXggYml0cyBuZWVkZWQgcGVyIHNiKi8KLSAgaW50MzJfdCBzMzJCaXRDb3VudDsgICAvKnRoZSB1c2VkIG51bWJlciBvZiBiaXRzKi8KLSAgaW50MzJfdCBzMzJTbGljZUNvdW50OyAvKnRvIHN0b3JlIGh3byBtYW55IHNsaWNlcyBjYW4gYmUgcHV0IGluIGJpdHBvb2wqLwotICBpbnQzMl90IHMzMkJpdFNsaWNlOyAgIC8qbnVtYmVyIG9mIGJpdHNsaWNlcyBpbiBiaXRwb29sKi8KLSAgaW50MzJfdCBzMzJTYjsgICAgICAgICAvKmNvdW50ZXIgZm9yIHN1Yi1iYW5kKi8KLSAgaW50MzJfdCBzMzJDaDsgICAgICAgICAvKmNvdW50ZXIgZm9yIGNoYW5uZWwqLwotICBpbnQxNl90KiBwczE2Qml0TmVlZDsgIC8qdGVtcCBtZW1vcnkgdG8gc3RvcmUgcmVxdWlyZWQgbnVtYmVyIG9mIGJpdHMqLwotICBpbnQzMl90IHMzMkxvdWRuZXNzOyAgIC8qdXNlZCBpbiBMb3VkbmVzcyBjYWxjdWxhdGlvbiovCi0gIGludDE2X3QqIHBzMTZHZW5CdWZQdHI7Ci0gIGludDE2X3QqIHBzMTZHZW5BcnJQdHI7Ci0gIGludDE2X3QqIHBzMTZHZW5UYWJQdHI7Ci0gIGludDMyX3QgczMyTnVtT2ZTdWJCYW5kcyA9IHBzdHJDb2RlY1BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kczsKLQotICBwczE2Qml0TmVlZCA9IHBzdHJDb2RlY1BhcmFtcy0+czE2U2NhcnRjaE1lbUZvckJpdEFsbG9jOwotCi0gIGZvciAoczMyQ2ggPSAwOyBzMzJDaCA8IHBzdHJDb2RlY1BhcmFtcy0+czE2TnVtT2ZDaGFubmVsczsgczMyQ2grKykgewotICAgIHBzMTZHZW5CdWZQdHIgPSBwczE2Qml0TmVlZCArIHMzMkNoICogczMyTnVtT2ZTdWJCYW5kczsKLSAgICBwczE2R2VuQXJyUHRyID0gcHN0ckNvZGVjUGFyYW1zLT5hczE2Qml0cyArIHMzMkNoICogU0JDX01BWF9OVU1fT0ZfU1VCQkFORFM7Ci0KLSAgICAvKiBiaXRuZWVkIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHNjYWxlIGZhY3RvciAqLwotICAgIGlmIChwc3RyQ29kZWNQYXJhbXMtPnMxNkFsbG9jYXRpb25NZXRob2QgPT0gU0JDX1NOUikgewotICAgICAgcHMxNkJpdE5lZWQgPSBwc3RyQ29kZWNQYXJhbXMtPmFzMTZTY2FsZUZhY3RvcjsKLSAgICAgIHBzMTZHZW5CdWZQdHIgPSBwczE2Qml0TmVlZCArIHMzMkNoICogczMyTnVtT2ZTdWJCYW5kczsKLSAgICB9IGVsc2UgewotICAgICAgcHMxNkdlbkJ1ZlB0ciA9IHBzMTZCaXROZWVkICsgczMyQ2ggKiBzMzJOdW1PZlN1YkJhbmRzOwotICAgICAgaWYgKHMzMk51bU9mU3ViQmFuZHMgPT0gNCkgewotICAgICAgICBwczE2R2VuVGFiUHRyID0KLSAgICAgICAgICAgIChpbnQxNl90KilzYmNfZW5jX2FzMTZPZmZzZXQ0W3BzdHJDb2RlY1BhcmFtcy0+czE2U2FtcGxpbmdGcmVxXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBzMTZHZW5UYWJQdHIgPQotICAgICAgICAgICAgKGludDE2X3QqKXNiY19lbmNfYXMxNk9mZnNldDhbcHN0ckNvZGVjUGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXFdOwotICAgICAgfQotICAgICAgZm9yIChzMzJTYiA9IDA7IHMzMlNiIDwgczMyTnVtT2ZTdWJCYW5kczsgczMyU2IrKykgewotICAgICAgICBpZiAocHN0ckNvZGVjUGFyYW1zCi0gICAgICAgICAgICAgICAgLT5hczE2U2NhbGVGYWN0b3JbczMyQ2ggKiBzMzJOdW1PZlN1YkJhbmRzICsgczMyU2JdID09IDApCi0gICAgICAgICAgKihwczE2R2VuQnVmUHRyKSA9IC01OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBzMzJMb3VkbmVzcyA9IChpbnQzMl90KSgKLSAgICAgICAgICAgICAgcHN0ckNvZGVjUGFyYW1zCi0gICAgICAgICAgICAgICAgICAtPmFzMTZTY2FsZUZhY3RvcltzMzJDaCAqIHMzMk51bU9mU3ViQmFuZHMgKyBzMzJTYl0gLQotICAgICAgICAgICAgICAqcHMxNkdlblRhYlB0cik7Ci0gICAgICAgICAgaWYgKHMzMkxvdWRuZXNzID4gMCkKLSAgICAgICAgICAgICoocHMxNkdlbkJ1ZlB0cikgPSAoaW50MTZfdCkoczMyTG91ZG5lc3MgPj4gMSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgKihwczE2R2VuQnVmUHRyKSA9IChpbnQxNl90KXMzMkxvdWRuZXNzOwotICAgICAgICB9Ci0gICAgICAgIHBzMTZHZW5CdWZQdHIrKzsKLSAgICAgICAgcHMxNkdlblRhYlB0cisrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIG1heCBiaXRuZWVkIGluZGV4IGlzIHNlYXJjaGVkKi8KLSAgICBzMzJNYXhCaXROZWVkID0gMDsKLSAgICBwczE2R2VuQnVmUHRyID0gcHMxNkJpdE5lZWQgKyBzMzJDaCAqIHMzMk51bU9mU3ViQmFuZHM7Ci0gICAgZm9yIChzMzJTYiA9IDA7IHMzMlNiIDwgczMyTnVtT2ZTdWJCYW5kczsgczMyU2IrKykgewotICAgICAgaWYgKCoocHMxNkdlbkJ1ZlB0cikgPiBzMzJNYXhCaXROZWVkKSBzMzJNYXhCaXROZWVkID0gKihwczE2R2VuQnVmUHRyKTsKLQotICAgICAgcHMxNkdlbkJ1ZlB0cisrOwotICAgIH0KLSAgICBwczE2R2VuQnVmUHRyID0gcHMxNkJpdE5lZWQgKyBzMzJDaCAqIHMzMk51bU9mU3ViQmFuZHM7Ci0gICAgLyppdGVyYXRpdmUgcHJvY2VzcyB0byBmaW5kIGh3byBtYW55IGJpdHNsaWNlcyBmaXQgaW50byB0aGUgYml0cG9vbCovCi0gICAgczMyQml0U2xpY2UgPSBzMzJNYXhCaXROZWVkICsgMTsKLSAgICBzMzJCaXRDb3VudCA9IHBzdHJDb2RlY1BhcmFtcy0+czE2Qml0UG9vbDsKLSAgICBzMzJTbGljZUNvdW50ID0gMDsKLSAgICBkbyB7Ci0gICAgICBzMzJCaXRTbGljZS0tOwotICAgICAgczMyQml0Q291bnQgLT0gczMyU2xpY2VDb3VudDsKLSAgICAgIHMzMlNsaWNlQ291bnQgPSAwOwotCi0gICAgICBmb3IgKHMzMlNiID0gMDsgczMyU2IgPCBzMzJOdW1PZlN1YkJhbmRzOyBzMzJTYisrKSB7Ci0gICAgICAgIGlmICgoKCgqcHMxNkdlbkJ1ZlB0ciAtIHMzMkJpdFNsaWNlKSA8IDE2KSAmJgotICAgICAgICAgICAgICgqcHMxNkdlbkJ1ZlB0ciAtIHMzMkJpdFNsaWNlKSA+PSAxKSkgewotICAgICAgICAgIGlmICgoKnBzMTZHZW5CdWZQdHIgLSBzMzJCaXRTbGljZSkgPT0gMSkKLSAgICAgICAgICAgIHMzMlNsaWNlQ291bnQgKz0gMjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzMzJTbGljZUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcHMxNkdlbkJ1ZlB0cisrOwotCi0gICAgICB9IC8qZW5kIG9mIGZvciovCi0gICAgICBwczE2R2VuQnVmUHRyID0gcHMxNkJpdE5lZWQgKyBzMzJDaCAqIHMzMk51bU9mU3ViQmFuZHM7Ci0gICAgfSB3aGlsZSAoczMyQml0Q291bnQgLSBzMzJTbGljZUNvdW50ID4gMCk7Ci0KLSAgICBpZiAoczMyQml0Q291bnQgPT0gMCkgewotICAgICAgczMyQml0Q291bnQgLT0gczMyU2xpY2VDb3VudDsKLSAgICAgIHMzMkJpdFNsaWNlLS07Ci0gICAgfQotCi0gICAgLypCaXRzIGFyZSBkaXN0cmlidXRlZCB1bnRpbCB0aGUgbGFzdCBiaXRzbGljZSBpcyByZWFjaGVkKi8KLSAgICBwczE2R2VuQXJyUHRyID0gcHN0ckNvZGVjUGFyYW1zLT5hczE2Qml0cyArIHMzMkNoICogczMyTnVtT2ZTdWJCYW5kczsKLSAgICBwczE2R2VuQnVmUHRyID0gcHMxNkJpdE5lZWQgKyBzMzJDaCAqIHMzMk51bU9mU3ViQmFuZHM7Ci0gICAgZm9yIChzMzJTYiA9IDA7IHMzMlNiIDwgczMyTnVtT2ZTdWJCYW5kczsgczMyU2IrKykgewotICAgICAgaWYgKCoocHMxNkdlbkJ1ZlB0cikgPCBzMzJCaXRTbGljZSArIDIpCi0gICAgICAgICoocHMxNkdlbkFyclB0cikgPSAwOwotICAgICAgZWxzZQotICAgICAgICAqKHBzMTZHZW5BcnJQdHIpID0gKCgqKHBzMTZHZW5CdWZQdHIpLXMzMkJpdFNsaWNlKSA8IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGludDE2X3QpKCoocHMxNkdlbkJ1ZlB0ciktczMyQml0U2xpY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxNjsKLQotICAgICAgcHMxNkdlbkJ1ZlB0cisrOwotICAgICAgcHMxNkdlbkFyclB0cisrOwotICAgIH0KLSAgICBwczE2R2VuQXJyUHRyID0gcHN0ckNvZGVjUGFyYW1zLT5hczE2Qml0cyArIHMzMkNoICogczMyTnVtT2ZTdWJCYW5kczsKLSAgICBwczE2R2VuQnVmUHRyID0gcHMxNkJpdE5lZWQgKyBzMzJDaCAqIHMzMk51bU9mU3ViQmFuZHM7Ci0gICAgLyp0aGUgcmVtYWluaW5nIGJpdHMgYXJlIGFsbG9jYXRlZCBzdGFydGluZyBhdCBzdWJiYW5kIDAqLwotICAgIHMzMlNiID0gMDsKLSAgICB3aGlsZSAoKHMzMkJpdENvdW50ID4gMCkgJiYgKHMzMlNiIDwgczMyTnVtT2ZTdWJCYW5kcykpIHsKLSAgICAgIGlmICgoKihwczE2R2VuQXJyUHRyKSA+PSAyKSAmJiAoKihwczE2R2VuQXJyUHRyKSA8IDE2KSkgewotICAgICAgICAoKihwczE2R2VuQXJyUHRyKSkrKzsKLSAgICAgICAgczMyQml0Q291bnQtLTsKLSAgICAgIH0gZWxzZSBpZiAoKCoocHMxNkdlbkJ1ZlB0cikgPT0gczMyQml0U2xpY2UgKyAxKSAmJiAoczMyQml0Q291bnQgPiAxKSkgewotICAgICAgICAqKHBzMTZHZW5BcnJQdHIpID0gMjsKLSAgICAgICAgczMyQml0Q291bnQgLT0gMjsKLSAgICAgIH0KLSAgICAgIHMzMlNiKys7Ci0gICAgICBwczE2R2VuQXJyUHRyKys7Ci0gICAgICBwczE2R2VuQnVmUHRyKys7Ci0gICAgfQotICAgIHBzMTZHZW5BcnJQdHIgPSBwc3RyQ29kZWNQYXJhbXMtPmFzMTZCaXRzICsgczMyQ2ggKiBzMzJOdW1PZlN1YkJhbmRzOwotCi0gICAgczMyU2IgPSAwOwotICAgIHdoaWxlICgoczMyQml0Q291bnQgPiAwKSAmJiAoczMyU2IgPCBzMzJOdW1PZlN1YkJhbmRzKSkgewotICAgICAgaWYgKCoocHMxNkdlbkFyclB0cikgPCAxNikgewotICAgICAgICAoKihwczE2R2VuQXJyUHRyKSkrKzsKLSAgICAgICAgczMyQml0Q291bnQtLTsKLSAgICAgIH0KLSAgICAgIHMzMlNiKys7Ci0gICAgICBwczE2R2VuQXJyUHRyKys7Ci0gICAgfQotICB9Ci19Ci0vKkVuZCBvZiBCaXRBbGxvYygpIGZ1bmN0aW9uKi8KZGlmZiAtLWdpdCBhL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19lbmNfYml0X2FsbG9jX3N0ZS5jIGIvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX2VuY19iaXRfYWxsb2Nfc3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWU2NWIuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX2VuY19iaXRfYWxsb2Nfc3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgZm9yIGJpdCBhbGxvY2F0aW9uIGFsZ29yaXRobS4gSXQgY2FsY3VsYXRlcwotICogIHRoZSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCBmb3IgdGhlIGVuY29kZWQgc3RyZWFtIG9mIGRhdGEuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLypJbmNsdWRlcyovCi0jaW5jbHVkZSAic2JjX2VuY19mdW5jX2RlY2xhcmUuaCIKLSNpbmNsdWRlICJzYmNfZW5jb2Rlci5oIgotCi0vKmdsb2JhbCBhcnJheXMqLwotZXh0ZXJuIGNvbnN0IGludDE2X3Qgc2JjX2VuY19hczE2T2Zmc2V0NFs0XVs0XTsKLWV4dGVybiBjb25zdCBpbnQxNl90IHNiY19lbmNfYXMxNk9mZnNldDhbNF1bOF07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEJpdEFsbG9jIC0gQ2FsY3VsYXRlcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBnaXZlbiBzY2FsZSBmYWN0b3IKLSogYW5kIHRoZSBudW1iZXIgb2Ygc3ViYmFuZHMuCi0qCi0qIFJFVFVSTlMgOiBOL0EKLSovCi0KLXZvaWQgc2JjX2VuY19iaXRfYWxsb2Nfc3RlKFNCQ19FTkNfUEFSQU1TKiBwc3RyQ29kZWNQYXJhbXMpIHsKLSAgLyogQ0FVVElPTSAtPiBtaXBzIG9wdGltIGZvciBhcm0gMzIgcmVxdWlyZSB0byB1c2UgaW50MzJfdCBpbnN0ZWFkIG9mIGludDE2X3QKLSAgICovCi0gIC8qIERvIG5vdCBjaGFuZ2UgdmFyaWFibGUgdHlwZSBvciBuYW1lICovCi0gIGludDMyX3QgczMyTWF4Qml0TmVlZDsgLyp0byBzdG9yZSB0aGUgbWF4IGJpdHMgbmVlZGVkIHBlciBzYiovCi0gIGludDMyX3QgczMyQml0Q291bnQ7ICAgLyp0aGUgdXNlZCBudW1iZXIgb2YgYml0cyovCi0gIGludDMyX3QgczMyU2xpY2VDb3VudDsgLyp0byBzdG9yZSBod28gbWFueSBzbGljZXMgY2FuIGJlIHB1dCBpbiBiaXRwb29sKi8KLSAgaW50MzJfdCBzMzJCaXRTbGljZTsgICAvKm51bWJlciBvZiBiaXRzbGljZXMgaW4gYml0cG9vbCovCi0gIGludDMyX3QgczMyU2I7ICAgICAgICAgLypjb3VudGVyIGZvciBzdWItYmFuZCovCi0gIGludDMyX3QgczMyQ2g7ICAgICAgICAgLypjb3VudGVyIGZvciBjaGFubmVsKi8KLSAgaW50MTZfdCogcHMxNkJpdE5lZWQ7ICAvKnRlbXAgbWVtb3J5IHRvIHN0b3JlIHJlcXVpcmVkIG51bWJlciBvZiBiaXRzKi8KLSAgaW50MzJfdCBzMzJMb3VkbmVzczsgICAvKnVzZWQgaW4gTG91ZG5lc3MgY2FsY3VsYXRpb24qLwotICBpbnQxNl90ICpwczE2R2VuQnVmUHRyLCAqcGFzMTZTY2FsZUZhY3RvcjsKLSAgaW50MTZfdCogcHMxNkdlbkFyclB0cjsKLSAgaW50MTZfdCogcHMxNkdlblRhYlB0cjsKLSAgaW50MzJfdCBzMzJOdW1PZlN1YkJhbmRzID0gcHN0ckNvZGVjUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzOwotICBpbnQzMl90IHMzMkJpdFBvb2wgPSBwc3RyQ29kZWNQYXJhbXMtPnMxNkJpdFBvb2w7Ci0KLSAgLyogYml0bmVlZCB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSBzY2FsZSBmYWN0b3IgKi8KLSAgaWYgKHBzdHJDb2RlY1BhcmFtcy0+czE2QWxsb2NhdGlvbk1ldGhvZCA9PSBTQkNfU05SKSB7Ci0gICAgcHMxNkJpdE5lZWQgPSBwc3RyQ29kZWNQYXJhbXMtPmFzMTZTY2FsZUZhY3RvcjsKLSAgICBzMzJNYXhCaXROZWVkID0gcHN0ckNvZGVjUGFyYW1zLT5zMTZNYXhCaXROZWVkOwotICB9IGVsc2UgewotICAgIHBzMTZCaXROZWVkID0gcHN0ckNvZGVjUGFyYW1zLT5zMTZTY2FydGNoTWVtRm9yQml0QWxsb2M7Ci0gICAgcGFzMTZTY2FsZUZhY3RvciA9IHBzdHJDb2RlY1BhcmFtcy0+YXMxNlNjYWxlRmFjdG9yOwotICAgIHMzMk1heEJpdE5lZWQgPSAwOwotICAgIHBzMTZHZW5CdWZQdHIgPSBwczE2Qml0TmVlZDsKLSAgICBmb3IgKHMzMkNoID0gMDsgczMyQ2ggPCAyOyBzMzJDaCsrKSB7Ci0gICAgICBpZiAoczMyTnVtT2ZTdWJCYW5kcyA9PSA0KSB7Ci0gICAgICAgIHBzMTZHZW5UYWJQdHIgPQotICAgICAgICAgICAgKGludDE2X3QqKXNiY19lbmNfYXMxNk9mZnNldDRbcHN0ckNvZGVjUGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXFdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHMxNkdlblRhYlB0ciA9Ci0gICAgICAgICAgICAoaW50MTZfdCopc2JjX2VuY19hczE2T2Zmc2V0OFtwc3RyQ29kZWNQYXJhbXMtPnMxNlNhbXBsaW5nRnJlcV07Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoczMyU2IgPSAwOyBzMzJTYiA8IHMzMk51bU9mU3ViQmFuZHM7IHMzMlNiKyspIHsKLSAgICAgICAgaWYgKCpwYXMxNlNjYWxlRmFjdG9yID09IDApCi0gICAgICAgICAgKnBzMTZHZW5CdWZQdHIgPSAtNTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgczMyTG91ZG5lc3MgPSAoaW50MzJfdCkoKnBhczE2U2NhbGVGYWN0b3IgLSAqcHMxNkdlblRhYlB0cik7Ci0KLSAgICAgICAgICBpZiAoczMyTG91ZG5lc3MgPiAwKQotICAgICAgICAgICAgKnBzMTZHZW5CdWZQdHIgPSAoaW50MTZfdCkoczMyTG91ZG5lc3MgPj4gMSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgKnBzMTZHZW5CdWZQdHIgPSAoaW50MTZfdClzMzJMb3VkbmVzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqcHMxNkdlbkJ1ZlB0ciA+IHMzMk1heEJpdE5lZWQpIHMzMk1heEJpdE5lZWQgPSAqcHMxNkdlbkJ1ZlB0cjsKLSAgICAgICAgcGFzMTZTY2FsZUZhY3RvcisrOwotICAgICAgICBwczE2R2VuQnVmUHRyKys7Ci0gICAgICAgIHBzMTZHZW5UYWJQdHIrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBpdGVyYXRpdmUgcHJvY2VzcyB0byBmaW5kIG91dCBod28gbWFueSBiaXRzbGljZXMgZml0IGludG8gdGhlIGJpdHBvb2wgKi8KLSAgczMyQml0U2xpY2UgPSBzMzJNYXhCaXROZWVkICsgMTsKLSAgczMyQml0Q291bnQgPSBzMzJCaXRQb29sOwotICBzMzJTbGljZUNvdW50ID0gMDsKLSAgZG8gewotICAgIHMzMkJpdFNsaWNlLS07Ci0gICAgczMyQml0Q291bnQgLT0gczMyU2xpY2VDb3VudDsKLSAgICBzMzJTbGljZUNvdW50ID0gMDsKLSAgICBwczE2R2VuQnVmUHRyID0gcHMxNkJpdE5lZWQ7Ci0KLSAgICBmb3IgKHMzMlNiID0gMDsgczMyU2IgPCAyICogczMyTnVtT2ZTdWJCYW5kczsgczMyU2IrKykgewotICAgICAgaWYgKCgqcHMxNkdlbkJ1ZlB0ciA+PSBzMzJCaXRTbGljZSArIDEpICYmCi0gICAgICAgICAgKCpwczE2R2VuQnVmUHRyIDwgczMyQml0U2xpY2UgKyAxNikpIHsKLSAgICAgICAgaWYgKCoocHMxNkdlbkJ1ZlB0cikgPT0gczMyQml0U2xpY2UgKyAxKQotICAgICAgICAgIHMzMlNsaWNlQ291bnQgKz0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHMzMlNsaWNlQ291bnQrKzsKLSAgICAgIH0KLSAgICAgIHBzMTZHZW5CdWZQdHIrKzsKLSAgICB9Ci0gIH0gd2hpbGUgKHMzMkJpdENvdW50IC0gczMyU2xpY2VDb3VudCA+IDApOwotCi0gIGlmIChzMzJCaXRDb3VudCAtIHMzMlNsaWNlQ291bnQgPT0gMCkgewotICAgIHMzMkJpdENvdW50IC09IHMzMlNsaWNlQ291bnQ7Ci0gICAgczMyQml0U2xpY2UtLTsKLSAgfQotCi0gIC8qIEJpdHMgYXJlIGRpc3RyaWJ1dGVkIHVudGlsIHRoZSBsYXN0IGJpdHNsaWNlIGlzIHJlYWNoZWQgKi8KLSAgcHMxNkdlbkJ1ZlB0ciA9IHBzMTZCaXROZWVkOwotICBwczE2R2VuQXJyUHRyID0gcHN0ckNvZGVjUGFyYW1zLT5hczE2Qml0czsKLSAgZm9yIChzMzJDaCA9IDA7IHMzMkNoIDwgMjsgczMyQ2grKykgewotICAgIGZvciAoczMyU2IgPSAwOyBzMzJTYiA8IHMzMk51bU9mU3ViQmFuZHM7IHMzMlNiKyspIHsKLSAgICAgIGlmICgqcHMxNkdlbkJ1ZlB0ciA8IHMzMkJpdFNsaWNlICsgMikKLSAgICAgICAgKnBzMTZHZW5BcnJQdHIgPSAwOwotICAgICAgZWxzZQotICAgICAgICAqcHMxNkdlbkFyclB0ciA9ICgoKihwczE2R2VuQnVmUHRyKS1zMzJCaXRTbGljZSkgPCAxNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaW50MTZfdCkoKihwczE2R2VuQnVmUHRyKS1zMzJCaXRTbGljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxNjsKLSAgICAgIHBzMTZHZW5CdWZQdHIrKzsKLSAgICAgIHBzMTZHZW5BcnJQdHIrKzsKLSAgICB9Ci0gIH0KLQotICAvKiB0aGUgcmVtYWluaW5nIGJpdHMgYXJlIGFsbG9jYXRlZCBzdGFydGluZyBhdCBzdWJiYW5kIDAgKi8KLSAgczMyQ2ggPSAwOwotICBzMzJTYiA9IDA7Ci0gIHBzMTZHZW5CdWZQdHIgPSBwczE2Qml0TmVlZDsKLSAgcHMxNkdlbkFyclB0ciAtPSAyICogczMyTnVtT2ZTdWJCYW5kczsKLQotICB3aGlsZSAoKHMzMkJpdENvdW50ID4gMCkgJiYgKHMzMlNiIDwgczMyTnVtT2ZTdWJCYW5kcykpIHsKLSAgICBpZiAoKCoocHMxNkdlbkFyclB0cikgPj0gMikgJiYgKCoocHMxNkdlbkFyclB0cikgPCAxNikpIHsKLSAgICAgICgqKHBzMTZHZW5BcnJQdHIpKSsrOwotICAgICAgczMyQml0Q291bnQtLTsKLSAgICB9IGVsc2UgaWYgKCgqcHMxNkdlbkJ1ZlB0ciA9PSBzMzJCaXRTbGljZSArIDEpICYmIChzMzJCaXRDb3VudCA+IDEpKSB7Ci0gICAgICAqKHBzMTZHZW5BcnJQdHIpID0gMjsKLSAgICAgIHMzMkJpdENvdW50IC09IDI7Ci0gICAgfQotICAgIGlmIChzMzJDaCA9PSAxKSB7Ci0gICAgICBzMzJDaCA9IDA7Ci0gICAgICBzMzJTYisrOwotICAgICAgcHMxNkdlbkJ1ZlB0ciA9IHBzMTZCaXROZWVkICsgczMyU2I7Ci0gICAgICBwczE2R2VuQXJyUHRyID0gcHN0ckNvZGVjUGFyYW1zLT5hczE2Qml0cyArIHMzMlNiOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHMzMkNoID0gMTsKLSAgICAgIHBzMTZHZW5CdWZQdHIgPSBwczE2Qml0TmVlZCArIHMzMk51bU9mU3ViQmFuZHMgKyBzMzJTYjsKLSAgICAgIHBzMTZHZW5BcnJQdHIgPSBwc3RyQ29kZWNQYXJhbXMtPmFzMTZCaXRzICsgczMyTnVtT2ZTdWJCYW5kcyArIHMzMlNiOwotICAgIH0KLSAgfQotCi0gIHMzMkNoID0gMDsKLSAgczMyU2IgPSAwOwotICBwczE2R2VuQXJyUHRyID0gcHN0ckNvZGVjUGFyYW1zLT5hczE2Qml0czsKLQotICB3aGlsZSAoKHMzMkJpdENvdW50ID4gMCkgJiYgKHMzMlNiIDwgczMyTnVtT2ZTdWJCYW5kcykpIHsKLSAgICBpZiAoKihwczE2R2VuQXJyUHRyKSA8IDE2KSB7Ci0gICAgICAoKihwczE2R2VuQXJyUHRyKSkrKzsKLSAgICAgIHMzMkJpdENvdW50LS07Ci0gICAgfQotICAgIGlmIChzMzJDaCA9PSAxKSB7Ci0gICAgICBzMzJDaCA9IDA7Ci0gICAgICBzMzJTYisrOwotICAgICAgcHMxNkdlbkFyclB0ciA9IHBzdHJDb2RlY1BhcmFtcy0+YXMxNkJpdHMgKyBzMzJTYjsKLSAgICB9IGVsc2UgewotICAgICAgczMyQ2ggPSAxOwotICAgICAgcHMxNkdlbkFyclB0ciA9IHBzdHJDb2RlY1BhcmFtcy0+YXMxNkJpdHMgKyBzMzJOdW1PZlN1YkJhbmRzICsgczMyU2I7Ci0gICAgfQotICB9Ci19Ci0KLS8qRW5kIG9mIEJpdEFsbG9jKCkgZnVuY3Rpb24qLwpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX2VuY19jb2VmZnMuYyBiL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19lbmNfY29lZmZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzZiNzkuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX2VuY19jb2VmZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgV2luZG93aW5nIGNvZWZmcyBmb3Igc3ludGhlc2lzIGZpbHRlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzYmNfZW5jb2Rlci5oIgotCi0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBGQUxTRSAmJiBTQkNfSVBBUV9PUFQgPT0gRkFMU0UpCi0jaWYgKFNCQ19JU182NF9NVUxUX0lOX1dJTkRPV19BQ0NVID09IEZBTFNFKQotLypXaW5kb3cgY29lZmYgZm9yIDQgc3ViIGJhbmQgY2FzZSovCi1jb25zdCBpbnQxNl90IGdhczMyQ29lZmZGb3I0U0JzW10gPSB7Ci0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAwMDAwMDAgPj4gMTYpLCAoaW50MTZfdCkweDAwMDAwMDAwLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMTE5NEU2ID4+IDE2KSwgKGludDE2X3QpMHgwMDExOTRFNiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDMwRTJEMyA+PiAxNiksIChpbnQxNl90KTB4MDAzMEUyRDMsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDA1OTk0MDMgPj4gMTYpLCAoaW50MTZfdCkweDAwNTk5NDAzLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwN0RCQ0M4ID4+IDE2KSwgKGludDE2X3QpMHgwMDdEQkNDOCwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDdGODhFNCA+PiAxNiksIChpbnQxNl90KTB4MDA3Rjg4RTQsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAzRDIzOUIgPj4gMTYpLCAoaW50MTZfdCkweDAwM0QyMzlCLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZGOUJCOUQ1ID4+IDE2KSwgKGludDE2X3QpMHhGRjlCQjlENSwKLQotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAxNjU5RjQ1ID4+IDE2KSwgKGludDE2X3QpMHgwMTY1OUY0NSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMjlEQkFBMyA+PiAxNiksIChpbnQxNl90KTB4MDI5REJBQTMsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDNCMjMzNDEgPj4gMTYpLCAoaW50MTZfdCkweDAzQjIzMzQxLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDA0MUVFRTQwID4+IDE2KSwgKGludDE2X3QpMHgwNDFFRUU0MCwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMzRGRUUyQyA+PiAxNiksIChpbnQxNl90KTB4MDM0RkVFMkMsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDBDOEYyQkMgPj4gMTYpLCAoaW50MTZfdCkweDAwQzhGMkJDLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZDNEY5MUQ0ID4+IDE2KSwgKGludDE2X3QpMHhGQzRGOTFENCwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGNjBGQUYzNyA+PiAxNiksIChpbnQxNl90KTB4RjYwRkFGMzcsCi0KLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgxMTVCMUVEMiA+PiAxNiksIChpbnQxNl90KTB4MTE1QjFFRDIsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MThGNTVDOTAgPj4gMTYpLCAoaW50MTZfdCkweDE4RjU1QzkwLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDFGOTFDQTQ2ID4+IDE2KSwgKGludDE2X3QpMHgxRjkxQ0E0NiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgyNDEyRjI1MSA+PiAxNiksIChpbnQxNl90KTB4MjQxMkYyNTEsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MjVBQzFGRjIgPj4gMTYpLCAoaW50MTZfdCkweDI1QUMxRkYyLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDI0MTJGMjUxID4+IDE2KSwgKGludDE2X3QpMHgyNDEyRjI1MSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgxRjkxQ0E0NiA+PiAxNiksIChpbnQxNl90KTB4MUY5MUNBNDYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MThGNTVDOTAgPj4gMTYpLCAoaW50MTZfdCkweDE4RjU1QzkwLAotCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RUVBNEUxMkUgPj4gMTYpLCAoaW50MTZfdCkweEVFQTRFMTJFLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEY2MEZBRjM3ID4+IDE2KSwgKGludDE2X3QpMHhGNjBGQUYzNywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGQzRGOTFENCA+PiAxNiksIChpbnQxNl90KTB4RkM0RjkxRDQsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDBDOEYyQkMgPj4gMTYpLCAoaW50MTZfdCkweDAwQzhGMkJDLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAzNEZFRTJDID4+IDE2KSwgKGludDE2X3QpMHgwMzRGRUUyQywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwNDFFRUU0MCA+PiAxNiksIChpbnQxNl90KTB4MDQxRUVFNDAsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDNCMjMzNDEgPj4gMTYpLCAoaW50MTZfdCkweDAzQjIzMzQxLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAyOURCQUEzID4+IDE2KSwgKGludDE2X3QpMHgwMjlEQkFBMywKLQotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZFOUE2MEJCID4+IDE2KSwgKGludDE2X3QpMHhGRTlBNjBCQiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGRjlCQjlENSA+PiAxNiksIChpbnQxNl90KTB4RkY5QkI5RDUsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAzRDIzOUIgPj4gMTYpLCAoaW50MTZfdCkweDAwM0QyMzlCLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwN0Y4OEU0ID4+IDE2KSwgKGludDE2X3QpMHgwMDdGODhFNCwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDdEQkNDOCA+PiAxNiksIChpbnQxNl90KTB4MDA3REJDQzgsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDA1OTk0MDMgPj4gMTYpLCAoaW50MTZfdCkweDAwNTk5NDAzLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMzBFMkQzID4+IDE2KSwgKGludDE2X3QpMHgwMDMwRTJEMywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDExOTRFNiA+PiAxNiksIChpbnQxNl90KTB4MDAxMTk0RTZ9OwotCi0vKldpbmRvdyBjb2VmZiBmb3IgOCBzdWIgYmFuZCBjYXNlKi8KLWNvbnN0IGludDE2X3QgZ2FzMzJDb2VmZkZvcjhTQnNbXSA9IHsKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDAwMDAwMCA+PiAxNiksIChpbnQxNl90KTB4MDAwMDAwMDAsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAwNTIxNzMgPj4gMTYpLCAoaW50MTZfdCkweDAwMDUyMTczLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMEIzRjcxID4+IDE2KSwgKGludDE2X3QpMHgwMDBCM0Y3MSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDEyMkM3RCA+PiAxNiksIChpbnQxNl90KTB4MDAxMjJDN0QsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAxQUZGODkgPj4gMTYpLCAoaW50MTZfdCkweDAwMUFGRjg5LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMjU1QTYyID4+IDE2KSwgKGludDE2X3QpMHgwMDI1NUE2MiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDMwNjBGNCA+PiAxNiksIChpbnQxNl90KTB4MDAzMDYwRjQsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAzQTcyRTcgPj4gMTYpLCAoaW50MTZfdCkweDAwM0E3MkU3LAotCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDA0MUVDNkEgPj4gMTYpLCAoaW50MTZfdCkweDAwNDFFQzZBLCAvKiA4ICovCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDA0NEVGNDggPj4gMTYpLCAoaW50MTZfdCkweDAwNDRFRjQ4LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwNDE1Qjc1ID4+IDE2KSwgKGludDE2X3QpMHgwMDQxNUI3NSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDM0RjhCNiA+PiAxNiksIChpbnQxNl90KTB4MDAzNEY4QjYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAxRDhGRDIgPj4gMTYpLCAoaW50MTZfdCkweDAwMUQ4RkQyLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZGRkEyNDEzID4+IDE2KSwgKGludDE2X3QpMHhGRkZBMjQxMywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGRkM5RjEwRSA+PiAxNiksIChpbnQxNl90KTB4RkZDOUYxMEUsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RkY4RDY3OTMgPj4gMTYpLCAoaW50MTZfdCkweEZGOEQ2NzkzLAotCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDBCOTczNDggPj4gMTYpLCAoaW50MTZfdCkweDAwQjk3MzQ4LCAvKiAxNiAqLwotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAxMDcxQjk2ID4+IDE2KSwgKGludDE2X3QpMHgwMTA3MUI5NiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMTU2QjNDQSA+PiAxNiksIChpbnQxNl90KTB4MDE1NkIzQ0EsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDFBMUIzOEIgPj4gMTYpLCAoaW50MTZfdCkweDAxQTFCMzhCLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAxRTAyMjRDID4+IDE2KSwgKGludDE2X3QpMHgwMUUwMjI0QywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMjA5MjkxRiA+PiAxNiksIChpbnQxNl90KTB4MDIwOTI5MUYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDIxMzg2NTMgPj4gMTYpLCAoaW50MTZfdCkweDAyMTM4NjUzLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAxRjVGNDI0ID4+IDE2KSwgKGludDE2X3QpMHgwMUY1RjQyNCwKLQotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAxQTdFQ0VGID4+IDE2KSwgKGludDE2X3QpMHgwMUE3RUNFRiwgLyogMjQgKi8KLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMTIyM0VCQSA+PiAxNiksIChpbnQxNl90KTB4MDEyMjNFQkEsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDA1RkQwRkYgPj4gMTYpLCAoaW50MTZfdCkweDAwNUZEMEZGLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZGNUVFQjczID4+IDE2KSwgKGludDE2X3QpMHhGRjVFRUI3MywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGRTIwNDM1RCA+PiAxNiksIChpbnQxNl90KTB4RkUyMDQzNUQsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RkNBODZFN0UgPj4gMTYpLCAoaW50MTZfdCkweEZDQTg2RTdFLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZBRkY5NUZDID4+IDE2KSwgKGludDE2X3QpMHhGQUZGOTVGQywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGOTMxMjg5MSA+PiAxNiksIChpbnQxNl90KTB4RjkzMTI4OTEsCi0KLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwOEI0MzA3QSA+PiAxNiksIChpbnQxNl90KTB4MDhCNDMwN0EsIC8qIDMyICovCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MEE5RjNFOUEgPj4gMTYpLCAoaW50MTZfdCkweDBBOUYzRTlBLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDBDN0Q1OUI2ID4+IDE2KSwgKGludDE2X3QpMHgwQzdENTlCNiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwRTNCQjE2RiA+PiAxNiksIChpbnQxNl90KTB4MEUzQkIxNkYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MEZDNzIxRjkgPj4gMTYpLCAoaW50MTZfdCkweDBGQzcyMUY5LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDExMEVDRUYwID4+IDE2KSwgKGludDE2X3QpMHgxMTBFQ0VGMCwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgxMjA0MzVGQSA+PiAxNiksIChpbnQxNl90KTB4MTIwNDM1RkEsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MTI5QzIyNkYgPj4gMTYpLCAoaW50MTZfdCkweDEyOUMyMjZGLAotCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MTJDRjZDNzUgPj4gMTYpLCAoaW50MTZfdCkweDEyQ0Y2Qzc1LCAvKiA0MCAqLwotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDEyOUMyMjZGID4+IDE2KSwgKGludDE2X3QpMHgxMjlDMjI2RiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgxMjA0MzVGQSA+PiAxNiksIChpbnQxNl90KTB4MTIwNDM1RkEsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MTEwRUNFRjAgPj4gMTYpLCAoaW50MTZfdCkweDExMEVDRUYwLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDBGQzcyMUY5ID4+IDE2KSwgKGludDE2X3QpMHgwRkM3MjFGOSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwRTNCQjE2RiA+PiAxNiksIChpbnQxNl90KTB4MEUzQkIxNkYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MEM3RDU5QjYgPj4gMTYpLCAoaW50MTZfdCkweDBDN0Q1OUI2LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDBBOUYzRTlBID4+IDE2KSwgKGludDE2X3QpMHgwQTlGM0U5QSwKLQotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEY3NEJDRjg2ID4+IDE2KSwgKGludDE2X3QpMHhGNzRCQ0Y4NiwgLyogNDggKi8KLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGOTMxMjg5MSA+PiAxNiksIChpbnQxNl90KTB4RjkzMTI4OTEsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RkFGRjk1RkMgPj4gMTYpLCAoaW50MTZfdCkweEZBRkY5NUZDLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZDQTg2RTdFID4+IDE2KSwgKGludDE2X3QpMHhGQ0E4NkU3RSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGRTIwNDM1RCA+PiAxNiksIChpbnQxNl90KTB4RkUyMDQzNUQsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RkY1RUVCNzMgPj4gMTYpLCAoaW50MTZfdCkweEZGNUVFQjczLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwNUZEMEZGID4+IDE2KSwgKGludDE2X3QpMHgwMDVGRDBGRiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMTIyM0VCQSA+PiAxNiksIChpbnQxNl90KTB4MDEyMjNFQkEsCi0KLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMUE3RUNFRiA+PiAxNiksIChpbnQxNl90KTB4MDFBN0VDRUYsIC8qIDU2ICovCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDFGNUY0MjQgPj4gMTYpLCAoaW50MTZfdCkweDAxRjVGNDI0LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAyMTM4NjUzID4+IDE2KSwgKGludDE2X3QpMHgwMjEzODY1MywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMjA5MjkxRiA+PiAxNiksIChpbnQxNl90KTB4MDIwOTI5MUYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDFFMDIyNEMgPj4gMTYpLCAoaW50MTZfdCkweDAxRTAyMjRDLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAxQTFCMzhCID4+IDE2KSwgKGludDE2X3QpMHgwMUExQjM4QiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMTU2QjNDQSA+PiAxNiksIChpbnQxNl90KTB4MDE1NkIzQ0EsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDEwNzFCOTYgPj4gMTYpLCAoaW50MTZfdCkweDAxMDcxQjk2LAotCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RkY0NjhDQjggPj4gMTYpLCAoaW50MTZfdCkweEZGNDY4Q0I4LCAvKiA2NCAqLwotICAgIChpbnQxNl90KSgoaW50MzJfdCkweEZGOEQ2NzkzID4+IDE2KSwgKGludDE2X3QpMHhGRjhENjc5MywKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHhGRkM5RjEwRSA+PiAxNiksIChpbnQxNl90KTB4RkZDOUYxMEUsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4RkZGQTI0MTMgPj4gMTYpLCAoaW50MTZfdCkweEZGRkEyNDEzLAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMUQ4RkQyID4+IDE2KSwgKGludDE2X3QpMHgwMDFEOEZEMiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDM0RjhCNiA+PiAxNiksIChpbnQxNl90KTB4MDAzNEY4QjYsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDA0MTVCNzUgPj4gMTYpLCAoaW50MTZfdCkweDAwNDE1Qjc1LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwNDRFRjQ4ID4+IDE2KSwgKGludDE2X3QpMHgwMDQ0RUY0OCwKLQotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwNDFFQzZBID4+IDE2KSwgKGludDE2X3QpMHgwMDQxRUM2QSwgLyogNzIgKi8KLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDNBNzJFNyA+PiAxNiksIChpbnQxNl90KTB4MDAzQTcyRTcsCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAzMDYwRjQgPj4gMTYpLCAoaW50MTZfdCkweDAwMzA2MEY0LAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMjU1QTYyID4+IDE2KSwgKGludDE2X3QpMHgwMDI1NUE2MiwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDFBRkY4OSA+PiAxNiksIChpbnQxNl90KTB4MDAxQUZGODksCi0gICAgKGludDE2X3QpKChpbnQzMl90KTB4MDAxMjJDN0QgPj4gMTYpLCAoaW50MTZfdCkweDAwMTIyQzdELAotICAgIChpbnQxNl90KSgoaW50MzJfdCkweDAwMEIzRjcxID4+IDE2KSwgKGludDE2X3QpMHgwMDBCM0Y3MSwKLSAgICAoaW50MTZfdCkoKGludDMyX3QpMHgwMDA1MjE3MyA+PiAxNiksIChpbnQxNl90KTB4MDAwNTIxNzN9OwotCi0jZWxzZQotCi0vKldpbmRvdyBjb2VmZiBmb3IgNCBzdWIgYmFuZCBjYXNlKi8KLWNvbnN0IGludDMyX3QgZ2FzMzJDb2VmZkZvcjRTQnNbXSA9IHsKLSAgICAoaW50MzJfdCkweDAwMDAwMDAwLCAoaW50MzJfdCkweDAwMTE5NEU2LCAoaW50MzJfdCkweDAwMzBFMkQzLAotICAgIChpbnQzMl90KTB4MDA1OTk0MDMsIChpbnQzMl90KTB4MDA3REJDQzgsIChpbnQzMl90KTB4MDA3Rjg4RTQsCi0gICAgKGludDMyX3QpMHgwMDNEMjM5QiwgKGludDMyX3QpMHhGRjlCQjlENSwKLQotICAgIChpbnQzMl90KTB4MDE2NTlGNDUsIChpbnQzMl90KTB4MDI5REJBQTMsIChpbnQzMl90KTB4MDNCMjMzNDEsCi0gICAgKGludDMyX3QpMHgwNDFFRUU0MCwgKGludDMyX3QpMHgwMzRGRUUyQywgKGludDMyX3QpMHgwMEM4RjJCQywKLSAgICAoaW50MzJfdCkweEZDNEY5MUQ0LCAoaW50MzJfdCkweEY2MEZBRjM3LAotCi0gICAgKGludDMyX3QpMHgxMTVCMUVEMiwgKGludDMyX3QpMHgxOEY1NUM5MCwgKGludDMyX3QpMHgxRjkxQ0E0NiwKLSAgICAoaW50MzJfdCkweDI0MTJGMjUxLCAoaW50MzJfdCkweDI1QUMxRkYyLCAoaW50MzJfdCkweDI0MTJGMjUxLAotICAgIChpbnQzMl90KTB4MUY5MUNBNDYsIChpbnQzMl90KTB4MThGNTVDOTAsCi0KLSAgICAoaW50MzJfdCkweEVFQTRFMTJFLCAoaW50MzJfdCkweEY2MEZBRjM3LCAoaW50MzJfdCkweEZDNEY5MUQ0LAotICAgIChpbnQzMl90KTB4MDBDOEYyQkMsIChpbnQzMl90KTB4MDM0RkVFMkMsIChpbnQzMl90KTB4MDQxRUVFNDAsCi0gICAgKGludDMyX3QpMHgwM0IyMzM0MSwgKGludDMyX3QpMHgwMjlEQkFBMywKLQotICAgIChpbnQzMl90KTB4RkU5QTYwQkIsIChpbnQzMl90KTB4RkY5QkI5RDUsIChpbnQzMl90KTB4MDAzRDIzOUIsCi0gICAgKGludDMyX3QpMHgwMDdGODhFNCwgKGludDMyX3QpMHgwMDdEQkNDOCwgKGludDMyX3QpMHgwMDU5OTQwMywKLSAgICAoaW50MzJfdCkweDAwMzBFMkQzLCAoaW50MzJfdCkweDAwMTE5NEU2fTsKLQotLypXaW5kb3cgY29lZmYgZm9yIDggc3ViIGJhbmQgY2FzZSovCi1jb25zdCBpbnQzMl90IGdhczMyQ29lZmZGb3I4U0JzW10gPSB7Ci0gICAgKGludDMyX3QpMHgwMDAwMDAwMCwgKGludDMyX3QpMHgwMDA1MjE3MywgKGludDMyX3QpMHgwMDBCM0Y3MSwKLSAgICAoaW50MzJfdCkweDAwMTIyQzdELCAoaW50MzJfdCkweDAwMUFGRjg5LCAoaW50MzJfdCkweDAwMjU1QTYyLAotICAgIChpbnQzMl90KTB4MDAzMDYwRjQsIChpbnQzMl90KTB4MDAzQTcyRTcsCi0KLSAgICAoaW50MzJfdCkweDAwNDFFQzZBLCAvKiA4ICovCi0gICAgKGludDMyX3QpMHgwMDQ0RUY0OCwgKGludDMyX3QpMHgwMDQxNUI3NSwgKGludDMyX3QpMHgwMDM0RjhCNiwKLSAgICAoaW50MzJfdCkweDAwMUQ4RkQyLCAoaW50MzJfdCkweEZGRkEyNDEzLCAoaW50MzJfdCkweEZGQzlGMTBFLAotICAgIChpbnQzMl90KTB4RkY4RDY3OTMsCi0KLSAgICAoaW50MzJfdCkweDAwQjk3MzQ4LCAvKiAxNiAqLwotICAgIChpbnQzMl90KTB4MDEwNzFCOTYsIChpbnQzMl90KTB4MDE1NkIzQ0EsIChpbnQzMl90KTB4MDFBMUIzOEIsCi0gICAgKGludDMyX3QpMHgwMUUwMjI0QywgKGludDMyX3QpMHgwMjA5MjkxRiwgKGludDMyX3QpMHgwMjEzODY1MywKLSAgICAoaW50MzJfdCkweDAxRjVGNDI0LAotCi0gICAgKGludDMyX3QpMHgwMUE3RUNFRiwgLyogMjQgKi8KLSAgICAoaW50MzJfdCkweDAxMjIzRUJBLCAoaW50MzJfdCkweDAwNUZEMEZGLCAoaW50MzJfdCkweEZGNUVFQjczLAotICAgIChpbnQzMl90KTB4RkUyMDQzNUQsIChpbnQzMl90KTB4RkNBODZFN0UsIChpbnQzMl90KTB4RkFGRjk1RkMsCi0gICAgKGludDMyX3QpMHhGOTMxMjg5MSwKLQotICAgIChpbnQzMl90KTB4MDhCNDMwN0EsIC8qIDMyICovCi0gICAgKGludDMyX3QpMHgwQTlGM0U5QSwgKGludDMyX3QpMHgwQzdENTlCNiwgKGludDMyX3QpMHgwRTNCQjE2RiwKLSAgICAoaW50MzJfdCkweDBGQzcyMUY5LCAoaW50MzJfdCkweDExMEVDRUYwLCAoaW50MzJfdCkweDEyMDQzNUZBLAotICAgIChpbnQzMl90KTB4MTI5QzIyNkYsCi0KLSAgICAoaW50MzJfdCkweDEyQ0Y2Qzc1LCAvKiA0MCAqLwotICAgIChpbnQzMl90KTB4MTI5QzIyNkYsIChpbnQzMl90KTB4MTIwNDM1RkEsIChpbnQzMl90KTB4MTEwRUNFRjAsCi0gICAgKGludDMyX3QpMHgwRkM3MjFGOSwgKGludDMyX3QpMHgwRTNCQjE2RiwgKGludDMyX3QpMHgwQzdENTlCNiwKLSAgICAoaW50MzJfdCkweDBBOUYzRTlBLAotCi0gICAgKGludDMyX3QpMHhGNzRCQ0Y4NiwgLyogNDggKi8KLSAgICAoaW50MzJfdCkweEY5MzEyODkxLCAoaW50MzJfdCkweEZBRkY5NUZDLCAoaW50MzJfdCkweEZDQTg2RTdFLAotICAgIChpbnQzMl90KTB4RkUyMDQzNUQsIChpbnQzMl90KTB4RkY1RUVCNzMsIChpbnQzMl90KTB4MDA1RkQwRkYsCi0gICAgKGludDMyX3QpMHgwMTIyM0VCQSwKLQotICAgIChpbnQzMl90KTB4MDFBN0VDRUYsIC8qIDU2ICovCi0gICAgKGludDMyX3QpMHgwMUY1RjQyNCwgKGludDMyX3QpMHgwMjEzODY1MywgKGludDMyX3QpMHgwMjA5MjkxRiwKLSAgICAoaW50MzJfdCkweDAxRTAyMjRDLCAoaW50MzJfdCkweDAxQTFCMzhCLCAoaW50MzJfdCkweDAxNTZCM0NBLAotICAgIChpbnQzMl90KTB4MDEwNzFCOTYsCi0KLSAgICAoaW50MzJfdCkweEZGNDY4Q0I4LCAvKiA2NCAqLwotICAgIChpbnQzMl90KTB4RkY4RDY3OTMsIChpbnQzMl90KTB4RkZDOUYxMEUsIChpbnQzMl90KTB4RkZGQTI0MTMsCi0gICAgKGludDMyX3QpMHgwMDFEOEZEMiwgKGludDMyX3QpMHgwMDM0RjhCNiwgKGludDMyX3QpMHgwMDQxNUI3NSwKLSAgICAoaW50MzJfdCkweDAwNDRFRjQ4LAotCi0gICAgKGludDMyX3QpMHgwMDQxRUM2QSwgLyogNzIgKi8KLSAgICAoaW50MzJfdCkweDAwM0E3MkU3LCAoaW50MzJfdCkweDAwMzA2MEY0LCAoaW50MzJfdCkweDAwMjU1QTYyLAotICAgIChpbnQzMl90KTB4MDAxQUZGODksIChpbnQzMl90KTB4MDAxMjJDN0QsIChpbnQzMl90KTB4MDAwQjNGNzEsCi0gICAgKGludDMyX3QpMHgwMDA1MjE3M307Ci0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfZW5jb2Rlci5jIGIvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX2VuY29kZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyMTJhZC4uMDAwMDAwMAotLS0gYS9lbWJkcnYvc2JjL2VuY29kZXIvc3JjZS9zYmNfZW5jb2Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgY29udGFpbnMgY29kZSBmb3IgZW5jb2RlciBmbG93IGFuZCBpbml0YWxpemF0aW9uIG9mIGVuY29kZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic2JjX2VuY29kZXIuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJzYmNfZW5jX2Z1bmNfZGVjbGFyZS5oIgotCi1pbnQxNl90IEVuY01heFNoaWZ0Q291bnRlcjsKLQotI2lmIChTQkNfSk9JTlRfU1RFX0lOQ0xVREVEID09IFRSVUUpCi1pbnQzMl90IHMzMkxSRGlmZltTQkNfTUFYX05VTV9PRl9CTE9DS1NdID0gezB9OwotaW50MzJfdCBzMzJMUlN1bVtTQkNfTUFYX05VTV9PRl9CTE9DS1NdID0gezB9OwotI2VuZGlmCi0KLXVpbnQzMl90IFNCQ19FbmNvZGUoU0JDX0VOQ19QQVJBTVMqIHBzdHJFbmNQYXJhbXMsIGludDE2X3QqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQpIHsKLSAgaW50MzJfdCBzMzJDaDsgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGNoKi8KLSAgaW50MzJfdCBzMzJTYjsgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIHN1Yi1iYW5kKi8KLSAgdWludDMyX3QgdTMyQ291bnQsIG1heEJpdCA9IDA7IC8qIGxvb3AgY291bnQqLwotICBpbnQzMl90IHMzMk1heFZhbHVlOyAgICAgICAgICAgLyogdGVtcCB2YXJpYWJsZSB0byBzdG9yZSBtYXggdmFsdWUgKi8KLQotICBpbnQxNl90KiBwczE2U2NmTDsKLSAgaW50MzJfdCogU2JCdWZmZXI7Ci0gIGludDMyX3QgczMyQmxrOyAvKiBjb3VudGVyIGZvciBibG9jayovCi0gIGludDMyX3QgczMyTnVtT2ZCbG9ja3MgPSBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkJsb2NrczsKLSNpZiAoU0JDX0pPSU5UX1NURV9JTkNMVURFRCA9PSBUUlVFKQotICBpbnQzMl90IHMzMk1heFZhbHVlMjsKLSAgdWludDMyX3QgdTMyQ291bnRTdW0sIHUzMkNvdW50RGlmZjsKLSAgaW50MzJfdCAqcFN1bSwgKnBEaWZmOwotI2VuZGlmCi0gIHJlZ2lzdGVyIGludDMyX3QgczMyTnVtT2ZTdWJCYW5kcyA9IHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mU3ViQmFuZHM7Ci0KLSAgLyogU0JDIGFuYW5seXNpcyBmaWx0ZXIqLwotICBpZiAoczMyTnVtT2ZTdWJCYW5kcyA9PSA0KQotICAgIFNiY0FuYWx5c2lzRmlsdGVyNChwc3RyRW5jUGFyYW1zLCBpbnB1dCk7Ci0gIGVsc2UKLSAgICBTYmNBbmFseXNpc0ZpbHRlcjgocHN0ckVuY1BhcmFtcywgaW5wdXQpOwotCi0gIC8qIGNvbXB1dGUgdGhlIHNjYWxlIGZhY3RvciwgYW5kIHNhdmUgdGhlIG1heCAqLwotICBwczE2U2NmTCA9IHBzdHJFbmNQYXJhbXMtPmFzMTZTY2FsZUZhY3RvcjsKLSAgczMyQ2ggPSBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzICogczMyTnVtT2ZTdWJCYW5kczsKLQotICBmb3IgKHMzMlNiID0gMDsgczMyU2IgPCBzMzJDaDsgczMyU2IrKykgewotICAgIFNiQnVmZmVyID0gcHN0ckVuY1BhcmFtcy0+czMyU2JCdWZmZXIgKyBzMzJTYjsKLSAgICBzMzJNYXhWYWx1ZSA9IDA7Ci0gICAgZm9yIChzMzJCbGsgPSBzMzJOdW1PZkJsb2NrczsgczMyQmxrID4gMDsgczMyQmxrLS0pIHsKLSAgICAgIGlmIChzMzJNYXhWYWx1ZSA8IGFiczMyKCpTYkJ1ZmZlcikpIHMzMk1heFZhbHVlID0gYWJzMzIoKlNiQnVmZmVyKTsKLSAgICAgIFNiQnVmZmVyICs9IHMzMkNoOwotICAgIH0KLQotICAgIHUzMkNvdW50ID0gKHMzMk1heFZhbHVlID4gMHg4MDAwMDApID8gOSA6IDA7Ci0KLSAgICBmb3IgKDsgdTMyQ291bnQgPCAxNTsgdTMyQ291bnQrKykgewotICAgICAgaWYgKHMzMk1heFZhbHVlIDw9IChpbnQzMl90KSgweDgwMDAgPDwgdTMyQ291bnQpKSBicmVhazsKLSAgICB9Ci0gICAgKnBzMTZTY2ZMKysgPSAoaW50MTZfdCl1MzJDb3VudDsKLQotICAgIGlmICh1MzJDb3VudCA+IG1heEJpdCkgbWF4Qml0ID0gdTMyQ291bnQ7Ci0gIH0KLS8qIEluIGNhc2Ugb2YgSlMgcHJvY2Vzc2luZyxjaGVjayB3aGV0aGVyIHRvIHVzZSBKUyAqLwotI2lmIChTQkNfSk9JTlRfU1RFX0lOQ0xVREVEID09IFRSVUUpCi0gIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZDaGFubmVsTW9kZSA9PSBTQkNfSk9JTlRfU1RFUkVPKSB7Ci0gICAgLyogQ2FsY3VsYXRlIHN1bSBhbmQgZGlmZmVyYW5jZSAgc2NhbGUgZmFjdG9ycyBmb3IgbWFraW5nIEpTIGRlY2lzaW9uICAgKi8KLSAgICBwczE2U2NmTCA9IHBzdHJFbmNQYXJhbXMtPmFzMTZTY2FsZUZhY3RvcjsKLSAgICAvKiBjYWxjdWxhdGUgdGhlIHNjYWxlIGZhY3RvciBvZiBKb2ludCBzdGVyZW8gbWF4IHN1bSBhbmQgZGlmZiAqLwotICAgIGZvciAoczMyU2IgPSAwOyBzMzJTYiA8IHMzMk51bU9mU3ViQmFuZHMgLSAxOyBzMzJTYisrKSB7Ci0gICAgICBTYkJ1ZmZlciA9IHBzdHJFbmNQYXJhbXMtPnMzMlNiQnVmZmVyICsgczMyU2I7Ci0gICAgICBzMzJNYXhWYWx1ZTIgPSAwOwotICAgICAgczMyTWF4VmFsdWUgPSAwOwotICAgICAgcFN1bSA9IHMzMkxSU3VtOwotICAgICAgcERpZmYgPSBzMzJMUkRpZmY7Ci0gICAgICBmb3IgKHMzMkJsayA9IDA7IHMzMkJsayA8IHMzMk51bU9mQmxvY2tzOyBzMzJCbGsrKykgewotICAgICAgICAqcFN1bSA9ICgqU2JCdWZmZXIgKyAqKFNiQnVmZmVyICsgczMyTnVtT2ZTdWJCYW5kcykpID4+IDE7Ci0gICAgICAgIGlmIChhYnMzMigqcFN1bSkgPiBzMzJNYXhWYWx1ZSkgczMyTWF4VmFsdWUgPSBhYnMzMigqcFN1bSk7Ci0gICAgICAgIHBTdW0rKzsKLSAgICAgICAgKnBEaWZmID0gKCpTYkJ1ZmZlciAtICooU2JCdWZmZXIgKyBzMzJOdW1PZlN1YkJhbmRzKSkgPj4gMTsKLSAgICAgICAgaWYgKGFiczMyKCpwRGlmZikgPiBzMzJNYXhWYWx1ZTIpIHMzMk1heFZhbHVlMiA9IGFiczMyKCpwRGlmZik7Ci0gICAgICAgIHBEaWZmKys7Ci0gICAgICAgIFNiQnVmZmVyICs9IHMzMkNoOwotICAgICAgfQotICAgICAgdTMyQ291bnQgPSAoczMyTWF4VmFsdWUgPiAweDgwMDAwMCkgPyA5IDogMDsKLSAgICAgIGZvciAoOyB1MzJDb3VudCA8IDE1OyB1MzJDb3VudCsrKSB7Ci0gICAgICAgIGlmIChzMzJNYXhWYWx1ZSA8PSAoaW50MzJfdCkoMHg4MDAwIDw8IHUzMkNvdW50KSkgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB1MzJDb3VudFN1bSA9IHUzMkNvdW50OwotICAgICAgdTMyQ291bnQgPSAoczMyTWF4VmFsdWUyID4gMHg4MDAwMDApID8gOSA6IDA7Ci0gICAgICBmb3IgKDsgdTMyQ291bnQgPCAxNTsgdTMyQ291bnQrKykgewotICAgICAgICBpZiAoczMyTWF4VmFsdWUyIDw9IChpbnQzMl90KSgweDgwMDAgPDwgdTMyQ291bnQpKSBicmVhazsKLSAgICAgIH0KLSAgICAgIHUzMkNvdW50RGlmZiA9IHUzMkNvdW50OwotICAgICAgaWYgKCgqcHMxNlNjZkwgKyAqKHBzMTZTY2ZMICsgczMyTnVtT2ZTdWJCYW5kcykpID4KLSAgICAgICAgICAoaW50MTZfdCkodTMyQ291bnRTdW0gKyB1MzJDb3VudERpZmYpKSB7Ci0gICAgICAgIGlmICh1MzJDb3VudFN1bSA+IG1heEJpdCkgbWF4Qml0ID0gdTMyQ291bnRTdW07Ci0KLSAgICAgICAgaWYgKHUzMkNvdW50RGlmZiA+IG1heEJpdCkgbWF4Qml0ID0gdTMyQ291bnREaWZmOwotCi0gICAgICAgICpwczE2U2NmTCA9IChpbnQxNl90KXUzMkNvdW50U3VtOwotICAgICAgICAqKHBzMTZTY2ZMICsgczMyTnVtT2ZTdWJCYW5kcykgPSAoaW50MTZfdCl1MzJDb3VudERpZmY7Ci0KLSAgICAgICAgU2JCdWZmZXIgPSBwc3RyRW5jUGFyYW1zLT5zMzJTYkJ1ZmZlciArIHMzMlNiOwotICAgICAgICBwU3VtID0gczMyTFJTdW07Ci0gICAgICAgIHBEaWZmID0gczMyTFJEaWZmOwotCi0gICAgICAgIGZvciAoczMyQmxrID0gMDsgczMyQmxrIDwgczMyTnVtT2ZCbG9ja3M7IHMzMkJsaysrKSB7Ci0gICAgICAgICAgKlNiQnVmZmVyID0gKnBTdW07Ci0gICAgICAgICAgKihTYkJ1ZmZlciArIHMzMk51bU9mU3ViQmFuZHMpID0gKnBEaWZmOwotCi0gICAgICAgICAgU2JCdWZmZXIgKz0gczMyTnVtT2ZTdWJCYW5kcyA8PCAxOwotICAgICAgICAgIHBTdW0rKzsKLSAgICAgICAgICBwRGlmZisrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHN0ckVuY1BhcmFtcy0+YXMxNkpvaW5bczMyU2JdID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBzdHJFbmNQYXJhbXMtPmFzMTZKb2luW3MzMlNiXSA9IDA7Ci0gICAgICB9Ci0gICAgICBwczE2U2NmTCsrOwotICAgIH0KLSAgICBwc3RyRW5jUGFyYW1zLT5hczE2Sm9pbltzMzJTYl0gPSAwOwotICB9Ci0jZW5kaWYKLQotICBwc3RyRW5jUGFyYW1zLT5zMTZNYXhCaXROZWVkID0gKGludDE2X3QpbWF4Qml0OwotCi0gIC8qIGJpdCBhbGxvY2F0aW9uICovCi0gIGlmICgocHN0ckVuY1BhcmFtcy0+czE2Q2hhbm5lbE1vZGUgPT0gU0JDX1NURVJFTykgfHwKLSAgICAgIChwc3RyRW5jUGFyYW1zLT5zMTZDaGFubmVsTW9kZSA9PSBTQkNfSk9JTlRfU1RFUkVPKSkKLSAgICBzYmNfZW5jX2JpdF9hbGxvY19zdGUocHN0ckVuY1BhcmFtcyk7Ci0gIGVsc2UKLSAgICBzYmNfZW5jX2JpdF9hbGxvY19tb25vKHBzdHJFbmNQYXJhbXMpOwotCi0gIC8qIFF1YW50aXplIHRoZSBlbmNvZGVkIGF1ZGlvICovCi0gIHJldHVybiBFbmNQYWNraW5nKHBzdHJFbmNQYXJhbXMsIG91dHB1dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEluaXRTYmNBbmFseXNpc0ZpbHQgLSBJbml0YWxpemVzIHRoZSBpbnB1dCBkYXRhIHRvIDAKLSoKLSogUkVUVVJOUyA6IE4vQQotKi8KLXZvaWQgU0JDX0VuY29kZXJfSW5pdChTQkNfRU5DX1BBUkFNUyogcHN0ckVuY1BhcmFtcykgewotICB1aW50MTZfdCBzMTZTYW1wbGluZ0ZyZXE7IC8qdGVtcCB2YXJpYWJsZSB0byBzdG9yZSBzbXBsaW5nIGZyZXEqLwotICBpbnQxNl90IHMxNkJpdHBvb2w7ICAgICAgIC8qdG8gc3RvcmUgYml0IHBvb2wgdmFsdWUqLwotICBpbnQxNl90IHMxNkJpdFJhdGU7ICAgICAgIC8qdG8gc3RvcmUgYml0cmF0ZSovCi0gIGludDE2X3QgczE2RnJhbWVMZW47ICAgICAgLyp0byBzdG9yZSBmcmFtZSBsZW5ndGgqLwotICB1aW50MTZfdCBIZWFkZXJQYXJhbXM7Ci0KLSAgLyogUmVxdWlyZWQgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZDaGFubmVsTW9kZSA9PSBTQkNfTU9OTykKLSAgICBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzID0gMTsKLSAgZWxzZQotICAgIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMgPSAyOwotCi0gIC8qIEJpdCBwb29sIGNhbGN1bGF0aW9uICovCi0gIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXEgPT0gU0JDX3NmMTYwMDApCi0gICAgczE2U2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gIGVsc2UgaWYgKHBzdHJFbmNQYXJhbXMtPnMxNlNhbXBsaW5nRnJlcSA9PSBTQkNfc2YzMjAwMCkKLSAgICBzMTZTYW1wbGluZ0ZyZXEgPSAzMjAwMDsKLSAgZWxzZSBpZiAocHN0ckVuY1BhcmFtcy0+czE2U2FtcGxpbmdGcmVxID09IFNCQ19zZjQ0MTAwKQotICAgIHMxNlNhbXBsaW5nRnJlcSA9IDQ0MTAwOwotICBlbHNlCi0gICAgczE2U2FtcGxpbmdGcmVxID0gNDgwMDA7Ci0KLSAgaWYgKChwc3RyRW5jUGFyYW1zLT5zMTZDaGFubmVsTW9kZSA9PSBTQkNfSk9JTlRfU1RFUkVPKSB8fAotICAgICAgKHBzdHJFbmNQYXJhbXMtPnMxNkNoYW5uZWxNb2RlID09IFNCQ19TVEVSRU8pKSB7Ci0gICAgczE2Qml0cG9vbCA9Ci0gICAgICAgIChpbnQxNl90KSgocHN0ckVuY1BhcmFtcy0+dTE2Qml0UmF0ZSAqIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgKgotICAgICAgICAgICAgICAgICAgIDEwMDAgLyBzMTZTYW1wbGluZ0ZyZXEpIC0KLSAgICAgICAgICAgICAgICAgICgoMzIgKyAoNCAqIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSArCi0gICAgICAgICAgICAgICAgICAgICgocHN0ckVuY1BhcmFtcy0+czE2Q2hhbm5lbE1vZGUgLSAyKSAqCi0gICAgICAgICAgICAgICAgICAgICBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzKSkgLwotICAgICAgICAgICAgICAgICAgIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQmxvY2tzKSk7Ci0KLSAgICBzMTZGcmFtZUxlbiA9IDQgKwotICAgICAgICAgICAgICAgICAgKDQgKiBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICoKLSAgICAgICAgICAgICAgICAgICBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSAvCi0gICAgICAgICAgICAgICAgICAgICAgOCArCi0gICAgICAgICAgICAgICAgICAoKChwc3RyRW5jUGFyYW1zLT5zMTZDaGFubmVsTW9kZSAtIDIpICoKLSAgICAgICAgICAgICAgICAgICAgcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykgKwotICAgICAgICAgICAgICAgICAgIChwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkJsb2NrcyAqIHMxNkJpdHBvb2wpKSAvCi0gICAgICAgICAgICAgICAgICAgICAgODsKLQotICAgIHMxNkJpdFJhdGUgPSAoOCAqIHMxNkZyYW1lTGVuICogczE2U2FtcGxpbmdGcmVxKSAvCi0gICAgICAgICAgICAgICAgIChwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICoKLSAgICAgICAgICAgICAgICAgIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQmxvY2tzICogMTAwMCk7Ci0KLSAgICBpZiAoczE2Qml0UmF0ZSA+IHBzdHJFbmNQYXJhbXMtPnUxNkJpdFJhdGUpIHMxNkJpdHBvb2wtLTsKLQotICAgIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzID09IDgpCi0gICAgICBwc3RyRW5jUGFyYW1zLT5zMTZCaXRQb29sID0gKHMxNkJpdHBvb2wgPiAyNTUpID8gMjU1IDogczE2Qml0cG9vbDsKLSAgICBlbHNlCi0gICAgICBwc3RyRW5jUGFyYW1zLT5zMTZCaXRQb29sID0gKHMxNkJpdHBvb2wgPiAxMjgpID8gMTI4IDogczE2Qml0cG9vbDsKLSAgfSBlbHNlIHsKLSAgICBzMTZCaXRwb29sID0gKGludDE2X3QpKAotICAgICAgICAoKHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgKiBwc3RyRW5jUGFyYW1zLT51MTZCaXRSYXRlICogMTAwMCkgLwotICAgICAgICAgKHMxNlNhbXBsaW5nRnJlcSAqIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMpKSAtCi0gICAgICAgICgoKDMyIC8gcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZDaGFubmVscykgKwotICAgICAgICAgICg0ICogcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykpIC8KLSAgICAgICAgIHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQmxvY2tzKSk7Ci0KLSAgICBwc3RyRW5jUGFyYW1zLT5zMTZCaXRQb29sID0KLSAgICAgICAgKHMxNkJpdHBvb2wgPiAoMTYgKiBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzKSkKLSAgICAgICAgICAgID8gKDE2ICogcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykKLSAgICAgICAgICAgIDogczE2Qml0cG9vbDsKLSAgfQotCi0gIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZCaXRQb29sIDwgMCkgcHN0ckVuY1BhcmFtcy0+czE2Qml0UG9vbCA9IDA7Ci0gIC8qIHNhbXBsaW5nIGZyZXEgKi8KLSAgSGVhZGVyUGFyYW1zID0gKChwc3RyRW5jUGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXEgJiAzKSA8PCA2KTsKLQotICAvKiBudW1iZXIgb2YgYmxvY2tzKi8KLSAgSGVhZGVyUGFyYW1zIHw9ICgoKHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQmxvY2tzIC0gNCkgJiAxMikgPDwgMik7Ci0KLSAgLyogY2hhbm5lbCBtb2RlOiBtb25vLCBkdWFsLi4uKi8KLSAgSGVhZGVyUGFyYW1zIHw9ICgocHN0ckVuY1BhcmFtcy0+czE2Q2hhbm5lbE1vZGUgJiAzKSA8PCAyKTsKLQotICAvKiBMb3VkbmVzcyBvciBTTlIgKi8KLSAgSGVhZGVyUGFyYW1zIHw9ICgocHN0ckVuY1BhcmFtcy0+czE2QWxsb2NhdGlvbk1ldGhvZCAmIDEpIDw8IDEpOwotICBIZWFkZXJQYXJhbXMgfD0gKChwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzID4+IDMpICYgMSk7IC8qNCBvciA4Ki8KLSAgcHN0ckVuY1BhcmFtcy0+RnJhbWVIZWFkZXIgPSBIZWFkZXJQYXJhbXM7Ci0KLSAgaWYgKHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgPT0gNCkgewotICAgIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzID09IDEpCi0gICAgICBFbmNNYXhTaGlmdENvdW50ZXIgPSAoKEVOQ19WWF9CVUZGRVJfU0laRSAtIDQgKiAxMCkgPj4gMikgPDwgMjsKLSAgICBlbHNlCi0gICAgICBFbmNNYXhTaGlmdENvdW50ZXIgPSAoKEVOQ19WWF9CVUZGRVJfU0laRSAtIDQgKiAxMCAqIDIpID4+IDMpIDw8IDI7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHBzdHJFbmNQYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMgPT0gMSkKLSAgICAgIEVuY01heFNoaWZ0Q291bnRlciA9ICgoRU5DX1ZYX0JVRkZFUl9TSVpFIC0gOCAqIDEwKSA+PiAzKSA8PCAzOwotICAgIGVsc2UKLSAgICAgIEVuY01heFNoaWZ0Q291bnRlciA9ICgoRU5DX1ZYX0JVRkZFUl9TSVpFIC0gOCAqIDEwICogMikgPj4gNCkgPDwgMzsKLSAgfQotCi0gIFNiY0FuYWx5c2lzSW5pdCgpOwotfQpkaWZmIC0tZ2l0IGEvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX3BhY2tpbmcuYyBiL2VtYmRydi9zYmMvZW5jb2Rlci9zcmNlL3NiY19wYWNraW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNWIzNzMuLjAwMDAwMDAKLS0tIGEvZW1iZHJ2L3NiYy9lbmNvZGVyL3NyY2Uvc2JjX3BhY2tpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBwYWNraW5nIHRoZSBFbmNvZGVkIGRhdGEgaW50byBiaXQgc3RyZWFtcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic2JjX2VuY19mdW5jX2RlY2xhcmUuaCIKLSNpbmNsdWRlICJzYmNfZW5jb2Rlci5oIgotCi0jaWYgKFNCQ19BUk1fQVNNX09QVCA9PSBUUlVFKQotI2RlZmluZSBNdWx0MzIoczMySW4xLCBzMzJJbjIsIHMzMk91dExvdykgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBNVUwgczMyT3V0TG93LHMzMkluMSxzMzJJbjI7IH0gXAotICB9Ci0jZGVmaW5lIE11bHQ2NChzMzJJbjEsIHMzMkluMiwgczMyT3V0TG93LCBzMzJPdXRIaSkgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFNNVUxMIHMzMk91dExvdyxzMzJPdXRIaSxzMzJJbjEsczMySW4yIH0gXAotICB9Ci0jZWxzZQotI2RlZmluZSBNdWx0MzIoczMySW4xLCBzMzJJbjIsIHMzMk91dExvdykgXAotICBzMzJPdXRMb3cgPSAoaW50MzJfdCkoczMySW4xKSAqIChpbnQzMl90KShzMzJJbjIpOwotI2RlZmluZSBNdWx0NjQoczMySW4xLCBzMzJJbjIsIHMzMk91dExvdywgczMyT3V0SGkpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19idWlsdGluX211bF9vdmVyZmxvdyhzMzJJbjEsICh1aW50MTZfdClzMzJJbjIsICZzNjRPdXRUZW1wKTsgXAotICAgIHMzMk91dExvdyA9IHM2NE91dFRlbXAgJiAweEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzMzJPdXRIaSA9IChzNjRPdXRUZW1wID4+IDMyKSAmIDB4RkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNlbmRpZgotCi0vKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gb3V0cHV0ICovCi11aW50MzJfdCBFbmNQYWNraW5nKFNCQ19FTkNfUEFSQU1TKiBwc3RyRW5jUGFyYW1zLCB1aW50OF90KiBvdXRwdXQpIHsKLSAgdWludDhfdCogcHU4UGFja2V0UHRyOyAvKiBwYWNrZXQgcHRyKi8KLSAgdWludDhfdCBUZW1wOwotICBpbnQzMl90IHMzMkJsazsgICAgICAgIC8qIGNvdW50ZXIgZm9yIGJsb2NrKi8KLSAgaW50MzJfdCBzMzJDaDsgICAgICAgICAvKiBjb3VudGVyIGZvciBjaGFubmVsKi8KLSAgaW50MzJfdCBzMzJTYjsgICAgICAgICAvKiBjb3VudGVyIGZvciBzdWItYmFuZCovCi0gIGludDMyX3QgczMyUHJlc2VudEJpdDsgLyogcmVwcmVzZW50cyBiaXQgdG8gYmUgc3RvcmVkKi8KLSAgLyppbnQzMl90IHMzMkxvb3BDb3VudEk7ICAgICAgICAgICAgICAgICAgICAgICBsb29wIGNvdW50ZXIqLwotICBpbnQzMl90IHMzMkxvb3BDb3VudEo7IC8qIGxvb3AgY291bnRlciovCi0gIHVpbnQzMl90IHUzMlF1YW50aXplZFNiVmFsdWUsCi0gICAgICB1MzJRdWFudGl6ZWRTYlZhbHVlMDsgLyogdGVtcCB2YXJpYWJsZSB0byBzdG9yZSBxdWFudGl6ZWQgc2IgdmFsKi8KLSAgaW50MzJfdCBzMzJMb29wQ291bnQ7ICAgICAvKiBsb29wIGNvdW50ZXIqLwotICB1aW50OF90IHU4WG9yZWRWYWw7ICAgICAgIC8qIHRvIHN0b3JlIFhPUmVkIHZhbHVlIGluIENSQyBjYWxjdWxhdGlvbiovCi0gIHVpbnQ4X3QgdThDUkM7ICAgICAgICAgICAgLyogdG8gc3RvcmUgQ1JDIHZhbHVlKi8KLSAgaW50MTZfdCogcHMxNkdlblB0cjsKLSAgaW50MzJfdCBzMzJOdW1PZkJsb2NrczsKLSAgaW50MzJfdCBzMzJOdW1PZlN1YkJhbmRzID0gcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kczsKLSAgaW50MzJfdCBzMzJOdW1PZkNoYW5uZWxzID0gcHN0ckVuY1BhcmFtcy0+czE2TnVtT2ZDaGFubmVsczsKLSAgdWludDMyX3QgdTMyU2ZSYWlzZWRUb1BvdzI7IC8qc2NhbGUgZmFjdG9yIHJhaXNlZCB0byBwb3dlciAyKi8KLSAgaW50MTZfdCogcHMxNlNjZlB0cjsKLSAgaW50MzJfdCogcHMzMlNiUHRyOwotICB1aW50MTZfdCB1MTZMZXZlbHM7IC8qdG8gc3RvcmUgbGV2ZWxzKi8KLSAgaW50MzJfdCBzMzJUZW1wMTsgICAvKnVzZWQgaW4gNjQtYml0IG11bHRpcGxpY2F0aW9uKi8KLSAgaW50MzJfdCBzMzJMb3c7ICAgICAvKnVzZWQgaW4gNjQtYml0IG11bHRpcGxpY2F0aW9uKi8KLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fUVVBTlRJWkVSID09IFRSVUUpCi0gIGludDMyX3QgczMySGkxLCBzMzJMb3cxLCBzMzJIaSwgczMyVGVtcDI7Ci0jaWYgKFNCQ19BUk1fQVNNX09QVCAhPSBUUlVFKQotICBpbnQ2NF90IHM2NE91dFRlbXA7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIHB1OFBhY2tldFB0ciA9IG91dHB1dDsgICAgICAgICAgIC8qSW5pdGlhbGl6ZSB0aGUgcHRyKi8KLSAgKnB1OFBhY2tldFB0cisrID0gKHVpbnQ4X3QpMHg5QzsgLypTeW5jIHdvcmQqLwotICAqcHU4UGFja2V0UHRyKysgPSAodWludDhfdCkocHN0ckVuY1BhcmFtcy0+RnJhbWVIZWFkZXIpOwotCi0gICpwdThQYWNrZXRQdHIgPSAodWludDhfdCkocHN0ckVuY1BhcmFtcy0+czE2Qml0UG9vbCAmIDB4MDBGRik7Ci0gIHB1OFBhY2tldFB0ciArPSAyOyAvKnNraXAgZm9yIENSQyovCi0KLSAgLypoZXJlIGl0IGluZGljYXRlIGlmIGl0IGlzIGJ5dGUgYm91bmRhcnkgb3IgbmliYmxlIGJvdW5kYXJ5Ki8KLSAgczMyUHJlc2VudEJpdCA9IDg7Ci0gIFRlbXAgPSAwOwotI2lmIChTQkNfSk9JTlRfU1RFX0lOQ0xVREVEID09IFRSVUUpCi0gIGlmIChwc3RyRW5jUGFyYW1zLT5zMTZDaGFubmVsTW9kZSA9PSBTQkNfSk9JTlRfU1RFUkVPKSB7Ci0gICAgLyogcGFjayBqb2luIHN0ZXJvIHBhcmFtZXRlcnMgKi8KLSAgICBmb3IgKHMzMlNiID0gMDsgczMyU2IgPCBzMzJOdW1PZlN1YkJhbmRzOyBzMzJTYisrKSB7Ci0gICAgICBUZW1wIDw8PSAxOwotICAgICAgVGVtcCB8PSBwc3RyRW5jUGFyYW1zLT5hczE2Sm9pbltzMzJTYl07Ci0gICAgfQotCi0gICAgLyogcGFjayBSRkEgKi8KLSAgICBpZiAoczMyTnVtT2ZTdWJCYW5kcyA9PSBTVUJfQkFORFNfNCkgewotICAgICAgczMyUHJlc2VudEJpdCA9IDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICoocHU4UGFja2V0UHRyKyspID0gVGVtcDsKLSAgICAgIFRlbXAgPSAwOwotICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgLyogUGFjayBTY2FsZSBmYWN0b3IgKi8KLSAgcHMxNkdlblB0ciA9IHBzdHJFbmNQYXJhbXMtPmFzMTZTY2FsZUZhY3RvcjsKLSAgczMyU2IgPSBzMzJOdW1PZkNoYW5uZWxzICogczMyTnVtT2ZTdWJCYW5kczsKLSAgLypUZW1wPSpwdThQYWNrZXRQdHI7Ki8KLSAgZm9yIChzMzJDaCA9IHMzMlNiOyBzMzJDaCA+IDA7IHMzMkNoLS0pIHsKLSAgICBUZW1wIDw8PSA0OwotICAgIFRlbXAgfD0gKnBzMTZHZW5QdHIrKzsKLQotICAgIGlmIChzMzJQcmVzZW50Qml0ID09IDQpIHsKLSAgICAgIHMzMlByZXNlbnRCaXQgPSA4OwotICAgICAgKihwdThQYWNrZXRQdHIrKykgPSBUZW1wOwotICAgICAgVGVtcCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMzMlByZXNlbnRCaXQgPSA0OwotICAgIH0KLSAgfQotCi0gIC8qIFBhY2sgc2FtcGxlcyAqLwotICBwczMyU2JQdHIgPSBwc3RyRW5jUGFyYW1zLT5zMzJTYkJ1ZmZlcjsKLSAgLypUZW1wPSpwdThQYWNrZXRQdHI7Ki8KLSAgczMyTnVtT2ZCbG9ja3MgPSBwc3RyRW5jUGFyYW1zLT5zMTZOdW1PZkJsb2NrczsKLSAgZm9yIChzMzJCbGsgPSBzMzJOdW1PZkJsb2NrcyAtIDE7IHMzMkJsayA+PSAwOyBzMzJCbGstLSkgewotICAgIHBzMTZHZW5QdHIgPSBwc3RyRW5jUGFyYW1zLT5hczE2Qml0czsKLSAgICBwczE2U2NmUHRyID0gcHN0ckVuY1BhcmFtcy0+YXMxNlNjYWxlRmFjdG9yOwotICAgIGZvciAoczMyQ2ggPSBzMzJTYiAtIDE7IHMzMkNoID49IDA7IHMzMkNoLS0pIHsKLSAgICAgIHMzMkxvb3BDb3VudCA9ICpwczE2R2VuUHRyKys7Ci0gICAgICBpZiAoczMyTG9vcENvdW50ICE9IDApIHsKLSNpZiAoU0JDX0lTXzY0X01VTFRfSU5fUVVBTlRJWkVSID09IFRSVUUpCi0gICAgICAgIC8qIGZpbmRpbmcgbGV2ZWwgZnJvbSByZWNvbnN0cnVjdGlvbiBwYXJ0IG9mIGRlY29kZXIgKi8KLSAgICAgICAgdTMyU2ZSYWlzZWRUb1BvdzIgPSAoKHVpbnQzMl90KTEgPDwgKCgqcHMxNlNjZlB0cikgKyAxKSk7Ci0gICAgICAgIHUxNkxldmVscyA9ICh1aW50MTZfdCkoKCh1aW50MzJfdCkxIDw8IHMzMkxvb3BDb3VudCkgLSAxKTsKLQotICAgICAgICAvKiBxdWFudGl6ZXIgKi8KLSAgICAgICAgczMyVGVtcDEgPSAoKnBzMzJTYlB0ciA+PiAyKSArIChpbnQzMl90KSh1MzJTZlJhaXNlZFRvUG93MiA8PCAxMik7Ci0gICAgICAgIHMzMlRlbXAyID0gdTE2TGV2ZWxzOwotCi0gICAgICAgIE11bHQ2NChzMzJUZW1wMSwgczMyVGVtcDIsIHMzMkxvdywgczMySGkpOwotCi0gICAgICAgIHMzMkxvdzEgPSBzMzJMb3cgPj4gKCgqcHMxNlNjZlB0cikgKyAyKTsKLSAgICAgICAgczMyTG93MSAmPSAoKHVpbnQzMl90KTEgPDwgKDMyIC0gKCgqcHMxNlNjZlB0cikgKyAyKSkpIC0gMTsKLSAgICAgICAgczMySGkxID0gczMySGkgPDwgKDMyIC0gKCgqcHMxNlNjZlB0cikgKyAyKSk7Ci0KLSAgICAgICAgdTMyUXVhbnRpemVkU2JWYWx1ZTAgPSAodWludDE2X3QpKChzMzJMb3cxIHwgczMySGkxKSA+PiAxMik7Ci0jZWxzZQotICAgICAgICAvKiBmaW5kaW5nIGxldmVsIGZyb20gcmVjb25zdHJ1Y3Rpb24gcGFydCBvZiBkZWNvZGVyICovCi0gICAgICAgIHUzMlNmUmFpc2VkVG9Qb3cyID0gKCh1aW50MzJfdCkxIDw8ICpwczE2U2NmUHRyKTsKLSAgICAgICAgdTE2TGV2ZWxzID0gKHVpbnQxNl90KSgoKHVpbnQzMl90KTEgPDwgczMyTG9vcENvdW50KSAtIDEpOwotCi0gICAgICAgIC8qIHF1YW50aXplciAqLwotICAgICAgICBzMzJUZW1wMSA9ICgqcHMzMlNiUHRyID4+IDE1KSArIHUzMlNmUmFpc2VkVG9Qb3cyOwotICAgICAgICBNdWx0MzIoczMyVGVtcDEsIHUxNkxldmVscywgczMyTG93KTsKLSAgICAgICAgczMyTG93ID4+PSAoKnBzMTZTY2ZQdHIgKyAxKTsKLSAgICAgICAgdTMyUXVhbnRpemVkU2JWYWx1ZTAgPSAodWludDE2X3QpczMyTG93OwotI2VuZGlmCi0gICAgICAgIC8qc3RvcmUgdGhlIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIGFuZCB0aGUgcXVhbnRpemVkIHMzMlNiCi0gICAgICAgIHNhbXBsZSB0byBlYXNlIHRoZSBjb2RpbmcqLwotICAgICAgICB1MzJRdWFudGl6ZWRTYlZhbHVlID0gdTMyUXVhbnRpemVkU2JWYWx1ZTA7Ci0KLSAgICAgICAgaWYgKHMzMlByZXNlbnRCaXQgPj0gczMyTG9vcENvdW50KSB7Ci0gICAgICAgICAgVGVtcCA8PD0gczMyTG9vcENvdW50OwotICAgICAgICAgIFRlbXAgfD0gdTMyUXVhbnRpemVkU2JWYWx1ZTsKLSAgICAgICAgICBzMzJQcmVzZW50Qml0IC09IHMzMkxvb3BDb3VudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3aGlsZSAoczMyUHJlc2VudEJpdCA8IHMzMkxvb3BDb3VudCkgewotICAgICAgICAgICAgczMyTG9vcENvdW50IC09IHMzMlByZXNlbnRCaXQ7Ci0gICAgICAgICAgICB1MzJRdWFudGl6ZWRTYlZhbHVlID4+PSBzMzJMb29wQ291bnQ7Ci0KLSAgICAgICAgICAgIC8qcmVtb3ZlIHRoZSB1bndhbnRlZCBtc2JzKi8KLSAgICAgICAgICAgIC8qdTMyUXVhbnRpemVkU2JWYWx1ZSA8PD0gMTYgLSBzMzJQcmVzZW50Qml0OwotICAgICAgICAgICAgdTMyUXVhbnRpemVkU2JWYWx1ZSA+Pj0gMTYgLSBzMzJQcmVzZW50Qml0OyovCi0KLSAgICAgICAgICAgIFRlbXAgPDw9IHMzMlByZXNlbnRCaXQ7Ci0KLSAgICAgICAgICAgIFRlbXAgfD0gdTMyUXVhbnRpemVkU2JWYWx1ZTsKLSAgICAgICAgICAgIC8qcmVzdG9yZSB0aGUgb3JpZ2luYWwqLwotICAgICAgICAgICAgdTMyUXVhbnRpemVkU2JWYWx1ZSA9IHUzMlF1YW50aXplZFNiVmFsdWUwOwotCi0gICAgICAgICAgICAqKHB1OFBhY2tldFB0cisrKSA9IFRlbXA7Ci0gICAgICAgICAgICBUZW1wID0gMDsKLSAgICAgICAgICAgIHMzMlByZXNlbnRCaXQgPSA4OwotICAgICAgICAgIH0KLSAgICAgICAgICBUZW1wIDw8PSBzMzJMb29wQ291bnQ7Ci0KLSAgICAgICAgICAvKiByZW1vdmUgdGhlIHVud2FudGVkIG1zYnMgKi8KLSAgICAgICAgICAvKnUzMlF1YW50aXplZFNiVmFsdWUgPDw9IDE2IC0gczMyTG9vcENvdW50OwotICAgICAgICAgIHUzMlF1YW50aXplZFNiVmFsdWUgPj49IDE2IC0gczMyTG9vcENvdW50OyovCi0KLSAgICAgICAgICBUZW1wIHw9IHUzMlF1YW50aXplZFNiVmFsdWU7Ci0KLSAgICAgICAgICBzMzJQcmVzZW50Qml0IC09IHMzMkxvb3BDb3VudDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHMxNlNjZlB0cisrOwotICAgICAgcHMzMlNiUHRyKys7Ci0gICAgfQotICB9Ci0KLSAgVGVtcCA8PD0gczMyUHJlc2VudEJpdDsKLSAgKnB1OFBhY2tldFB0ciA9IFRlbXA7Ci0gIHVpbnQzMl90IHUxNlBhY2tldExlbmd0aCA9IHB1OFBhY2tldFB0ciAtIG91dHB1dCArIDE7Ci0gIC8qZmluZCBDUkMqLwotICBwdThQYWNrZXRQdHIgPSBvdXRwdXQgKyAxOyAvKkluaXRpYWxpemUgdGhlIHB0ciovCi0gIHU4Q1JDID0gMHgwRjsKLSAgczMyTG9vcENvdW50ID0gczMyU2IgPj4gMTsKLQotICAvKgotICBUaGUgbG9vcHMgaXMgcnVuIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQgdGlsbCB0aGUgc2NhbGUgZmFjdG9yCi0gIHBhcmFtZXRlcnMuIEluIGNhc2Ugb2YgSlMsICdqb2luJyBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaW4gdGhlIHBhY2tldAotICBzbyB0aGF0IG1hbnkgbW9yZSBieXRlcyBhcmUgaW5jbHVkZWQgaW4gQ1JDIGNhbGN1bGF0aW9uLgotICAqLwotICBUZW1wID0gKnB1OFBhY2tldFB0cjsKLSAgZm9yIChzMzJDaCA9IDE7IHMzMkNoIDwgKHMzMkxvb3BDb3VudCArIDQpOyBzMzJDaCsrKSB7Ci0gICAgLyogc2tpcCBzeW5jIHdvcmQgYW5kIENSQyBieXRlcyAqLwotICAgIGlmIChzMzJDaCAhPSAzKSB7Ci0gICAgICBmb3IgKHMzMkxvb3BDb3VudEogPSA3OyBzMzJMb29wQ291bnRKID49IDA7IHMzMkxvb3BDb3VudEotLSkgewotICAgICAgICB1OFhvcmVkVmFsID0gKCh1OENSQyA+PiA3KSAmIDB4MDEpIF4gKChUZW1wID4+IHMzMkxvb3BDb3VudEopICYgMHgwMSk7Ci0gICAgICAgIHU4Q1JDIDw8PSAxOwotICAgICAgICB1OENSQyBePSAodThYb3JlZFZhbCAqIDB4MUQpOwotICAgICAgICB1OENSQyAmPSAweEZGOwotICAgICAgfQotICAgIH0KLSAgICBUZW1wID0gKigrK3B1OFBhY2tldFB0cik7Ci0gIH0KLQotICBpZiAocHN0ckVuY1BhcmFtcy0+czE2Q2hhbm5lbE1vZGUgPT0gU0JDX0pPSU5UX1NURVJFTykgewotICAgIGZvciAoczMyTG9vcENvdW50SiA9IDc7IHMzMkxvb3BDb3VudEogPj0gKDggLSBzMzJOdW1PZlN1YkJhbmRzKTsKLSAgICAgICAgIHMzMkxvb3BDb3VudEotLSkgewotICAgICAgdThYb3JlZFZhbCA9ICgodThDUkMgPj4gNykgJiAweDAxKSBeICgoVGVtcCA+PiBzMzJMb29wQ291bnRKKSAmIDB4MDEpOwotICAgICAgdThDUkMgPDw9IDE7Ci0gICAgICB1OENSQyBePSAodThYb3JlZFZhbCAqIDB4MUQpOwotICAgICAgdThDUkMgJj0gMHhGRjsKLSAgICB9Ci0gIH0KLQotICAvKiBDUkMgY2FsY3VsYXRpb24gZW5kcyBoZXJlICovCi0KLSAgLyogc3RvcmUgQ1JDIGluIHBhY2tldCAqLwotICBvdXRwdXRbM10gPSB1OENSQzsKLSAgcmV0dXJuIHUxNlBhY2tldExlbmd0aDsKLX0KZGlmZiAtLWdpdCBhL2dkLy5jbGFuZy1mb3JtYXQgYi9nZC8uY2xhbmctZm9ybWF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGYzMWZlLi4wMDAwMDAwCi0tLSBhL2dkLy5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMKLSMgQmVsb3cgYXJlIHNvbWUgbWlub3IgZGV2aWF0aW9ucyBmcm9tIHRoZSBkZWZhdWx0IEdvb2dsZSBzdHlsZSB0bwotIyBhY2NvbW1vZGF0ZSBmb3IgaGFuZGxpbmcgb2YgdGhlIGxhcmdlIGxlZ2FjeSBjb2RlIGJhc2UuCi0jCi0KLUJhc2VkT25TdHlsZTogR29vZ2xlCi1Db21tZW50UHJhZ21hczogTk9MSU5UOi4qCi1EZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQotQ29sdW1uTGltaXQ6IDEyMAotQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IEVtcHR5Ci1Db25zdHJ1Y3RvckluaXRpYWxpemVyQWxsT25PbmVMaW5lT3JPbmVQZXJMaW5lOiB0cnVlCi1CcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzOiBCZWZvcmVDb2xvbgotQWxpZ25BZnRlck9wZW5CcmFja2V0OiBBbHdheXNCcmVhawotQmluUGFja0FyZ3VtZW50czogZmFsc2UKLUJpblBhY2tQYXJhbWV0ZXJzOiBmYWxzZQpkaWZmIC0tZ2l0IGEvZ2QvLmdpdGlnbm9yZSBiL2dkLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NGI0YzUuLjAwMDAwMDAKLS0tIGEvZ2QvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotKiovZGVmYXVsdC5wcm9mcmF3Ci0qKi9fX3B5Y2FjaGVfXy8KLWdkX2NlcnRfdmVudgpkaWZmIC0tZ2l0IGEvZ2QvQW5kcm9pZC5icCBiL2dkL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Y2Q3ZDkuLjAwMDAwMDAKLS0tIGEvZ2QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDk0NiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNECi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZ2RfZGVmYXVsdHMiLAotICAgIHRpZHlfY2hlY2tzOiBbCi0gICAgICAgICItcGVyZm9ybWFuY2UtdW5uZWNlc3NhcnktdmFsdWUtcGFyYW0iLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHRlc3RfY29uZmlnX3RlbXBsYXRlOiAiQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwiLAotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1ET1NfQU5EUk9JRCIsCi0gICAgICAgICAgICAgICAgIi1ET1NfTElOVVhfR0VORVJJQyIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgICAgICAgICAibGlibG9nIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBzYW5pdGl6ZTogewotICAgICAgICAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICAgICAgaG9zdDogewotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1ET1NfTElOVVhfR0VORVJJQyIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi0gICAgY3BwX3N0ZDogImMrKzE3IiwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ERVhQT1JUX1NZTUJPTD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKLSAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLURMT0dfTkRFQlVHPTEiLAotICAgICAgICAiLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgICAgICAiLVduby11bnVzZWQtcmVzdWx0IiwKLSAgICBdLAotICAgIGNvbmx5ZmxhZ3M6IFsKLSAgICAgICAgIi1zdGQ9Yzk5IiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImpuaV9oZWFkZXJzIl0sCi0KLX0KLQotLy8gRW5hYmxlcyBjb2RlIGNvdmVyYWdlIGZvciBhIHNldCBvZiBzb3VyY2UgZmlsZXMuIE11c3QgYmUgY29tYmluZWQgd2l0aAotLy8gImNsYW5nX2NvdmVyYWdlX2JpbiIgaW4gb3JkZXIgdG8gd29yay4gU2VlIC8vdGVzdC9nZW5fY292ZXJhZ2UucHkgZm9yIG1vcmUgaW5mb3JtYXRpb24KLS8vIG9uIGdlbmVyYXRpbmcgY29kZSBjb3ZlcmFnZS4KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZ2RfY2xhbmdfZmlsZV9jb3ZlcmFnZSIsCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIGNsYW5nX2NmbGFnczogWwotICAgICAgICAgICAgICAgICItZnByb2ZpbGUtaW5zdHItZ2VuZXJhdGUiLAotICAgICAgICAgICAgICAgICItZmNvdmVyYWdlLW1hcHBpbmciLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCi0vLyBFbmFibGVkIGNvZGUgY292ZXJhZ2Ugb24gYSBiaW5hcnkuIFRoZXNlIGZsYWdzIGFsbG93IGxpYnJhcmllcyB0aGF0IHdlcmUKLS8vIGNvbXBpbGVkIHdpdGggImNsYW5nX2ZpbGVfY292ZXJhZ2UiIHRvIGJlIHByb3Blcmx5IGxpbmtlZCB0b2dldGhlciBpbgotLy8gb3JkZXIgdG8gY3JlYXRlIGEgYmluYXJ5IHRoYXQgd2lsbCBjcmVhdGUgYSBwcm9mcmF3IGZpbGUgd2hlbiByYW4uIE5vdGUKLS8vIHRoZXNlIGZsYWdzIHRoZW1zZWx2ZXMgZG9uJ3QgZW5hYmxlIGNvZGUgY292ZXJhZ2UgZm9yIHRoZSBzb3VyY2UgZmlsZXMKLS8vIGNvbXBpbGVkIGluIHRoZSBiaW5hcnkuIFNlZSAvL3Rlc3QvZ2VuX2NvdmVyYWdlLnB5IGZvciBtb3JlIGluZm9ybWF0aW9uCi0vLyBvbiBnZW5lcmF0aW5nIGNvZGUgY292ZXJhZ2UuCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImdkX2NsYW5nX2NvdmVyYWdlX2JpbiIsCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIGxkZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLWZwcm9maWxlLWluc3RyLWdlbmVyYXRlIiwKLSAgICAgICAgICAgICAgICAiLWZjb3ZlcmFnZS1tYXBwaW5nIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJnZF9jbGFuZ190aWR5IiwKLSAgICB0aWR5OiB0cnVlLAotICAgIHRpZHlfY2hlY2tzOiBbCi0gICAgICAgICJjbGFuZy1hbmFseXplci1jb3JlLkNhbGxBbmRNZXNzYWdlIiwKLSAgICAgICAgImNsYW5nLWFuYWx5emVyLW9wdGluLmNwbHVzcGx1cy5VbmluaXRpYWxpemVkT2JqZWN0IiwKLSAgICAgICAgIi1nb29nbGUqIiwKLSAgICAgICAgIi1wZXJmb3JtYW5jZSoiLAotICAgICAgICAiLWJ1Z3Byb25lKiIsCi0gICAgICAgICItY2VydC1kY2wyMS1jcHAiLCAgLy8gd2FybmluZzogb3ZlcmxvYWRlZCByZXR1cm5zIGEgbm9uLWNvbnN0YW50IG9iamVjdCBpbnN0ZWFkIG9mIGEgY29uc3RhbnQgb2JqZWN0IHR5cGUKLSAgICAgICAgIi1jZXJ0LWRjbDU5LWNwcCIsICAvLyB3YXJuaW5nOiBkbyBub3QgdXNlIHVubmFtZWQgbmFtZXNwYWNlcyBpbiBoZWFkZXIgZmlsZXMKLSAgICAgICAgIi1jZXJ0LW9vcDU0LWNwcCIsICAvLyB3YXJuaW5nOiBvcGVyYXRvcj0oKSBkb2VzIG5vdCBoYW5kbGUgc2VsZi1hc3NpZ25tZW50IHByb3Blcmx5Ci0gICAgICAgICItY2VydC1tc2M1MC1jcHAiLCAgLy8gd2FybmluZzogcmFuZCgpIGhhcyBsaW1pdGVkIHJhbmRvbW5lc3M7IHVzZSBDKysxMSByYW5kb20gbGlicmFyeSBpbnN0ZWFkCi0gICAgICAgICItY2VydC1tc2MzMC1jIiwgICAgLy8gd2FybmluZzogcmFuZCgpIGhhcyBsaW1pdGVkIHJhbmRvbW5lc3M7IHVzZSBDKysxMSByYW5kb20gbGlicmFyeSBpbnN0ZWFkCi0gICAgXSwKLSAgICB0aWR5X2NoZWNrc19hc19lcnJvcnM6IFsKLSAgICAgICAgImNwcGNvcmVndWlkZWxpbmVzLXByby10eXBlLW1lbWJlci1pbml0IiwKLSAgICAgICAgImNsYW5nLWFuYWx5emVyLWNvcmUuQ2FsbEFuZE1lc3NhZ2UiLAotICAgICAgICAiY2xhbmctYW5hbHl6ZXItb3B0aW4uY3BsdXNwbHVzLlVuaW5pdGlhbGl6ZWRPYmplY3QiLAotICAgIF0sCi0gICAgdGlkeV9mbGFnczogWwotICAgICAgICAiLS1oZWFkZXItZmlsdGVyPV4uKnN5c3RlbS9idC8uKi5oJCIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9LVhjbGFuZyIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9LWFuYWx5emVyLWNvbmZpZyIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9LVhjbGFuZyIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9b3B0aW4uY3BsdXNwbHVzLlVuaW5pdGlhbGl6ZWRPYmplY3Q6UGVkYW50aWM9dHJ1ZSIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9LVhjbGFuZyIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9LWFuYWx5emVyLWNvbmZpZyIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9LVhjbGFuZyIsCi0gICAgICAgICItLWV4dHJhLWFyZy1iZWZvcmU9b3B0aW4uY3BsdXNwbHVzLlVuaW5pdGlhbGl6ZWRPYmplY3Q6Q2hlY2tQb2ludGVlSW5pdGlhbGl6YXRpb249dHJ1ZSIsCi0gICAgXSwKLX0KLQotLy8gQ2xhbmcgaXMgdGFyZ2V0ZWQgZm9yIGFuZHJvaWQgY29yZSBsaWJyYXJpZXMgYnV0IG90aGVyIGJhc2UgbGlicmFyaWVzCi0vLyBtYXkgbm90IHN1cHBvcnQgY2xhbmcgdGlkeSByZWNvbW1lbmRhdGlvbnMgKGUuZy4gTWFjT1MpCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImdkX2NsYW5nX3RpZHlfaWdub3JlX2FuZHJvaWQiLAotICAgIHRpZHk6IHRydWUsCi0gICAgdGlkeV9jaGVja3M6IFsKLSAgICAgICAgIi1hbmRyb2lkLWNsb2V4ZWMtcGlwZTIiLCAvLyAgd2FybmluZzogJ3BpcGUyJyBzaG91bGQgdXNlIE9fQ0xPRVhFQyB3aGVyZSBwb3NzaWJsZQotICAgICAgICAiLWFuZHJvaWQtY2xvZXhlYy1hY2NlcHQiLCAvLyB3YXJuaW5nOiBwcmVmZXIgYWNjZXB0NCgpIHRvIGFjY2VwdCgpIGJlY2F1c2UgYWNjZXB0NCgpIGFsbG93cyBTT0NLX0NMT0VYRUMKLSAgICAgICAgIi1hbmRyb2lkLWNsb2V4ZWMtc29ja2V0IiwgIC8vIHdhcm5pbmc6ICdwaXBlMicgc2hvdWxkIHVzZSBPX0NMT0VYRUMgd2hlcmUgcG9zc2libGUKLSAgICBdLAotfQotCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aF9nZF9kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImdkX2RlZmF1bHRzIiwKLSAgICAgICAgImdkX2NsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGxpbnV4OiB7Ci0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgIjpCbHVldG9vdGhCdGFhU291cmNlc19saW51eF9nZW5lcmljIiwKLSAgICAgICAgICAgICAgICAiOkJsdWV0b290aE9zU291cmNlc19saW51eF9nZW5lcmljIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAiOkJsdWV0b290aEJ0YWFTb3VyY2VzX2hvc3QiLAotICAgICAgICAgICAgICAgICI6Qmx1ZXRvb3RoSGFsU291cmNlc19oY2lfaG9zdCIsCi0gICAgICAgICAgICAgICAgIjpCbHVldG9vdGhPc1NvdXJjZXNfaG9zdCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgIjpCbHVldG9vdGhCdGFhU291cmNlc19hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAiOkJsdWV0b290aEhhbFNvdXJjZXNfaGNpX2FuZHJvaWRfaGlkbCIsCi0gICAgICAgICAgICAgICAgIjpCbHVldG9vdGhPc1NvdXJjZXNfYW5kcm9pZCIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4wIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zeXN0ZW0uc3VzcGVuZC5jb250cm9sLVYxLW5kayIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQtVjEtbmRrIiwKLSAgICAgICAgICAgICAgICAibGliYmluZGVyX25kayIsCi0gICAgICAgICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJzdGF0c2xvZ19idCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgc3JjczogWwotICAgICAgICAic3RhY2tfbWFuYWdlci5jYyIsCi0gICAgICAgICJtb2R1bGUuY2MiLAotICAgICAgICAiOkJsdWV0b290aEF0dFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aENvbW1vblNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aENyeXB0b1Rvb2xib3hTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhEdW1wc3lzU291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoSGFsU291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoSGNpU291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoSXNvU291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoTDJjYXBTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhOZWlnaGJvclNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFBhY2tldFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFNoaW1Tb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhTZWN1cml0eVNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFN0b3JhZ2VTb3VyY2VzIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRCdW5kbGVyU2NoZW1hX2hfYmZicyIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY2hyb21lIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJmbGF0YnVmZmVycy1jcHAiLAotICAgICAgICAibGliZ3JwYysrIiwKLSAgICAgICAgImxpYmdycGNfd3JhcCIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICAgICAibGliYmx1ZXRvb3RoLXByb3RvcyIsCi0gICAgICAgICJsaWJibHVldG9vdGhfcnVzdF9pbnRlcm9wIiwKLSAgICAgICAgImxpYmJ0LXBsYXRmb3JtLXByb3Rvcy1saXRlIiwKLSAgICBdLAotICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsgImxpYmJsdWV0b290aF9ydXN0X2ludGVyb3AiIF0sCi19Ci0KLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGhfZ2QiLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfZ2RfZGVmYXVsdHMiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGhfZ2RfZnV6emluZyIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aF9nZF9kZWZhdWx0cyIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6Qmx1ZXRvb3RoT3NTb3VyY2VzX2Z1enoiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREZVWlpfVEFSR0VUIiwKLSAgICBdLAotfQotCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJibHVldG9vdGhfc3RhY2tfd2l0aF9mYWNhZGUiLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJnZF9kZWZhdWx0cyIsCi0gICAgICAgICJnZF9jbGFuZ19jb3ZlcmFnZV9iaW4iLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiZmFjYWRlL2ZhY2FkZV9tYWluLmNjIiwKLSAgICAgICAgImZhY2FkZS9ncnBjX3Jvb3Rfc2VydmVyLmNjIiwKLSAgICAgICAgImZhY2FkZS9yZWFkX29ubHlfcHJvcGVydHlfc2VydmVyLmNjIiwKLSAgICAgICAgImdycGMvZ3JwY19tb2R1bGUuY2MiLAotICAgICAgICAiOkJsdWV0b290aEZhY2FkZV9oY2lfaGFsIiwKLSAgICAgICAgIjpCbHVldG9vdGhGYWNhZGVfaGNpX2xheWVyIiwKLSAgICAgICAgIjpCbHVldG9vdGhGYWNhZGVfbDJjYXBfbGF5ZXIiLAotICAgICAgICAiOkJsdWV0b290aEZhY2FkZV9uZWlnaGJvciIsCi0gICAgICAgICI6Qmx1ZXRvb3RoRmFjYWRlX2lzb19sYXllciIsCi0gICAgICAgICI6Qmx1ZXRvb3RoRmFjYWRlX3NlY3VyaXR5X2xheWVyIiwKLSAgICAgICAgIjpCbHVldG9vdGhGYWNhZGVfc2hpbV9sYXllciIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAiQmx1ZXRvb3RoRmFjYWRlR2VuZXJhdGVkU3R1Yl9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZEJ1bmRsZXJTY2hlbWFfaF9iZmJzIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNEYXRhU2NoZW1hX2giLAotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICAgICAgLy8gTmVlZGVkIGhlcmUgdG8gZ3VhcmFudGVlIHRoYXQgZ2VuZXJhdGVkIHppcCBmaWxlIGlzIGNyZWF0ZWQgYmVmb3JlCi0gICAgICAgIC8vIGJsdWV0b290aF9jZXJ0X3Rlc3RzLnppcCBpcyBwYWNrYWdlZAotICAgICAgICAiQmx1ZXRvb3RoRmFjYWRlQW5kQ2VydEdlbmVyYXRlZFN0dWJfcHkiLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsKLSAgICAgICAgIkJsdWV0b290aEZhY2FkZUdlbmVyYXRlZFN0dWJfY2MiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImJyZWFrcGFkX2NsaWVudCIsCi0gICAgICAgICJsaWJibHVldG9vdGgtZHVtcHN5cyIsCi0gICAgICAgICJsaWJibHVldG9vdGgtcHJvdG9zIiwKLSAgICAgICAgImxpYmJsdWV0b290aF9nZCIsCi0gICAgICAgICJsaWJmbGF0YnVmZmVycy1jcHAiLAotICAgICAgICAibGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmFja3RyYWNlIiwKLSAgICAgICAgImxpYmNocm9tZSIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliZ3JwYysrIiwKLSAgICAgICAgImxpYmdycGMrK191bnNlY3VyZSIsCi0gICAgICAgICJsaWJncnBjX3dyYXAiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWZ1bGwiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQuY29udHJvbC1WMS1uZGsiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLVYxLW5kayIsCi0gICAgICAgICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAotICAgICAgICAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgICAgICAgICAibGlic3RhdHNsb2dfYnQiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgaG9zdDogewotICAgICAgICAgICAgcmVxdWlyZWQ6IFsKLSAgICAgICAgICAgICAgICAicm9vdC1jYW5hbCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0KLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF90ZXN0X2dkX3VuaXQiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJnZF9kZWZhdWx0cyIsCi0gICAgICAgICJnZF9jbGFuZ19jb3ZlcmFnZV9iaW4iLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgdGVzdF9vcHRpb25zOiB7Ci0gICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKLSAgICB9LAotICAgIHRhcmdldDogewotICAgICAgICBsaW51eDogewotICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICI6Qmx1ZXRvb3RoT3NUZXN0U291cmNlc19saW51eF9nZW5lcmljIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAiOkJsdWV0b290aEhhbFRlc3RTb3VyY2VzX2hjaV9ob3N0IiwKLSAgICAgICAgICAgICAgICAiOkJsdWV0b290aE9zVGVzdFNvdXJjZXNfaG9zdCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgIjpCbHVldG9vdGhIYWxUZXN0U291cmNlc19oY2lfYW5kcm9pZF9oaWRsIiwKLSAgICAgICAgICAgICAgICAiOkJsdWV0b290aE9zVGVzdFNvdXJjZXNfYW5kcm9pZCIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4wIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zeXN0ZW0uc3VzcGVuZC5jb250cm9sLVYxLW5kayIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQtVjEtbmRrIiwKLSAgICAgICAgICAgICAgICAibGliYmluZGVyX25kayIsCi0gICAgICAgICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJzdGF0c2xvZ19idCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgc3JjczogWwotICAgICAgICAibW9kdWxlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgInN0YWNrX21hbmFnZXJfdW5pdHRlc3QuY2MiLAotICAgICAgICAiOkJsdWV0b290aENvbW1vblRlc3RTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhDcnlwdG9Ub29sYm94VGVzdFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aER1bXBzeXNUZXN0U291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoSGFsVGVzdFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aEhjaVVuaXRUZXN0U291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoTDJjYXBVbml0VGVzdFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFBhY2tldFRlc3RTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhTaGltVGVzdFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFNlY3VyaXR5VW5pdFRlc3RTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhTdG9yYWdlVW5pdFRlc3RTb3VyY2VzIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRCdW5kbGVyU2NoZW1hX2hfYmZicyIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNUZXN0RGF0YV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMtdGVzdCIsCi0gICAgICAgICJsaWJibHVldG9vdGgtZHVtcHN5cy11bml0dGVzdCIsCi0gICAgICAgICJsaWJibHVldG9vdGgtcHJvdG9zIiwKLSAgICAgICAgImxpYmJsdWV0b290aF9nZCIsCi0gICAgICAgICJsaWJjKytmcyIsCi0gICAgICAgICJsaWJmbGF0YnVmZmVycy1jcHAiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY2hyb21lIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJncnBjKysiLAotICAgICAgICAibGliZ3JwY193cmFwIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGFkZHJlc3M6IHRydWUsCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF9wYWNrZXRfcGFyc2VyX3Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJnZF9kZWZhdWx0cyIsCi0gICAgICAgICJnZF9jbGFuZ19jb3ZlcmFnZV9iaW4iLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9idC9nZCJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2kvYWRkcmVzcy5jYyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoUGFja2V0U291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoUGFja2V0UGFyc2VyVGVzdFBhY2tldFRlc3RTb3VyY2VzIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhQYWNrZXRQYXJzZXJUZXN0UGFja2V0UGRsR2VuX2giLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmNocm9tZSIsCi0gICAgICAgICJsaWJibHVldG9vdGhfcnVzdF9pbnRlcm9wIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJncnBjKysiLAotICAgICAgICAibGliZ3JwY193cmFwIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJnZF9mdXp6X2RlZmF1bHRzIiwKLSAgICBkZWZhdWx0czogWyJnZF9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpCbHVldG9vdGhGdXp6SGVscGVyU291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoSGNpRnV6ekhlbHBlclNvdXJjZXMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aC1wcm90b3MiLAotICAgICAgICAibGliYmx1ZXRvb3RoX2dkX2Z1enppbmciLAotICAgICAgICAibGliY2hyb21lIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmd0ZXN0IiwKLSAgICAgICAgImxpYmJsdWV0b290aF9ydXN0X2ludGVyb3AiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNEYXRhU2NoZW1hX2giLAotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICAgICAgImxpYmdycGMrKyIsCi0gICAgICAgICJsaWJncnBjX3dyYXAiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREZVWlpfVEFSR0VUIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLmNvbnRyb2wtVjEtbmRrIiwKLSAgICAgICAgICAgICAgICAibGliYmluZGVyX25kayIsCi0gICAgICAgICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJzdGF0c2xvZ19idCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJibHVldG9vdGhfZ2RfZnV6el90ZXN0IiwKLSAgICBkZWZhdWx0czogWyJnZF9mdXp6X2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el90ZXN0LmNjIiwKLSAgICAgICAgIjpCbHVldG9vdGhIY2lGdXp6VGVzdFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aEwyY2FwRnV6elRlc3RTb3VyY2VzIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoX2dkX2hjaV9sYXllcl9mdXp6X3Rlc3QiLAotICAgIGRlZmF1bHRzOiBbImdkX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2kvZnV6ei9oY2lfbGF5ZXJfZnV6el90ZXN0LmNjIiwKLSAgICAgICAgIjpCbHVldG9vdGhIYWxGdXp6U291cmNlcyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImJsdWV0b290aF9nZF9hY2xfbWFuYWdlcl9mdXp6X3Rlc3QiLAotICAgIGRlZmF1bHRzOiBbImdkX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2kvZnV6ei9hY2xfbWFuYWdlcl9mdXp6X3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWNjX2JlbmNobWFyayB7Ci0gICAgbmFtZTogImJsdWV0b290aF9iZW5jaG1hcmtfZ2QiLAotICAgIGRlZmF1bHRzOiBbImdkX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiYmVuY2htYXJrLmNjIiwKLSAgICAgICAgIjpCbHVldG9vdGhPc0JlbmNobWFya1NvdXJjZXMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aF9nZCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY2hyb21lIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhIY2lDbGFzc1NvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImhjaS9hZGRyZXNzLmNjIiwKLSAgICAgICAgImhjaS9jbGFzc19vZl9kZXZpY2UuY2MiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJibHVldG9vdGhfcGFja2V0Z2VuIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gYmx1ZXRvb3RoX3BhY2tldGdlbikgLS1pbmNsdWRlPXN5c3RlbS9idC9nZCAtLW91dD0kKGdlbkRpcikgJChpbikiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImhjaS9oY2lfcGFja2V0cy5wZGwiLAotICAgICAgICAibDJjYXAvbDJjYXBfcGFja2V0cy5wZGwiLAotICAgICAgICAic2VjdXJpdHkvc21wX3BhY2tldHMucGRsIiwKLSAgICBdLAotICAgIG91dDogWwotICAgICAgICAiaGNpL2hjaV9wYWNrZXRzLmgiLAotICAgICAgICAibDJjYXAvbDJjYXBfcGFja2V0cy5oIiwKLSAgICAgICAgInNlY3VyaXR5L3NtcF9wYWNrZXRzLmgiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX3J1c3QiLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJibHVldG9vdGhfcGFja2V0Z2VuIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gYmx1ZXRvb3RoX3BhY2tldGdlbikgLS1pbmNsdWRlPXN5c3RlbS9idC9nZCAtLW91dD0kKGdlbkRpcikgJChpbikgLS1ydXN0IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2kvaGNpX3BhY2tldHMucGRsIiwKLSAgICBdLAotICAgIG91dDogWwotICAgICAgICAiaGNpL2hjaV9wYWNrZXRzLnJzIiwKLSAgICBdLAotfQotCi1ydXN0X2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJidF9wYWNrZXRzIiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgY3JhdGVfbmFtZTogImJ0X3BhY2tldHMiLAotICAgIHNyY3M6IFsicnVzdC9wYWNrZXRzL2xpYi5ycyIsICI6Qmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19ydXN0Il0sCi0gICAgZWRpdGlvbjogIjIwMTgiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHByb2NfbWFjcm9zOiBbImxpYm51bV9kZXJpdmUiXSwKLSAgICBydXN0bGliczogWwotICAgICAgICAibGliYnl0ZXMiLAotICAgICAgICAibGlibnVtX3RyYWl0cyIsCi0gICAgICAgICJsaWJ0aGlzZXJyb3IiLAotICAgICAgICAibGlibG9nX3J1c3QiLAotICAgIF0sCi19Ci0KLXJ1c3RfdGVzdF9ob3N0IHsKLSAgICBuYW1lOiAibGliYnRfcGFja2V0c190ZXN0IiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJydXN0L3BhY2tldHMvbGliLnJzIiwgIjpCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX3J1c3QiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCi0gICAgZWRpdGlvbjogIjIwMTgiLAotICAgIHByb2NfbWFjcm9zOiBbImxpYm51bV9kZXJpdmUiXSwKLSAgICBydXN0bGliczogWwotICAgICAgICAibGliYnl0ZXMiLAotICAgICAgICAibGlibnVtX3RyYWl0cyIsCi0gICAgICAgICJsaWJ0aGlzZXJyb3IiLAotICAgICAgICAibGlibG9nX3J1c3QiLAotICAgIF0sCi19Ci0KLS8vIEdlbmVyYXRlcyBiaW5hcnkgc2NoZW1hIGRhdGEgdG8gYmUgYnVuZGxlZCBhbmQgc291cmNlIGZpbGUgZ2VuZXJhdGVkCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c0JpbmFyeVNjaGVtYV9iZmJzIiwKLSAgICB0b29sczogWwotICAgICAgICAiZmxhdGMiLAotICAgIF0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBmbGF0YykgLUkgc3lzdGVtL2J0L2dkIC1iIC0tc2NoZW1hIC1vICQoZ2VuRGlyKSAkKGluKSAiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uZmJzIiwKLSAgICAgICAgImNvbW1vbi9pbml0X2ZsYWdzLmZicyIsCi0gICAgICAgICJkdW1wc3lzX2RhdGEuZmJzIiwKLSAgICAgICAgImhjaS9oY2lfYWNsX21hbmFnZXIuZmJzIiwKLSAgICAgICAgImwyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuZmJzIiwKLSAgICAgICAgInNoaW0vZHVtcHN5cy5mYnMiLAotICAgICAgICAib3Mvd2FrZWxvY2tfbWFuYWdlci5mYnMiLAotICAgIF0sCi0gICAgb3V0OiBbCi0gICAgICAgICJhY3Rpdml0eV9hdHRyaWJ1dGlvbi5iZmJzIiwKLSAgICAgICAgImluaXRfZmxhZ3MuYmZicyIsCi0gICAgICAgICJkdW1wc3lzLmJmYnMiLAotICAgICAgICAiZHVtcHN5c19kYXRhLmJmYnMiLAotICAgICAgICAiaGNpX2FjbF9tYW5hZ2VyLmJmYnMiLAotICAgICAgICAibDJjYXBfY2xhc3NpY19tb2R1bGUuYmZicyIsCi0gICAgICAgICJ3YWtlbG9ja19tYW5hZ2VyLmJmYnMiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICB0b29sczogWwotICAgICAgICAiZmxhdGMiLAotICAgIF0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBmbGF0YykgLUkgc3lzdGVtL2J0L2dkIC1vICQoZ2VuRGlyKSAtLWNwcCAkKGluKSAiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uZmJzIiwKLSAgICAgICAgImNvbW1vbi9pbml0X2ZsYWdzLmZicyIsCi0gICAgICAgICJkdW1wc3lzX2RhdGEuZmJzIiwKLSAgICAgICAgImhjaS9oY2lfYWNsX21hbmFnZXIuZmJzIiwKLSAgICAgICAgImwyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuZmJzIiwKLSAgICAgICAgInNoaW0vZHVtcHN5cy5mYnMiLAotICAgICAgICAib3Mvd2FrZWxvY2tfbWFuYWdlci5mYnMiLAotICAgIF0sCi0gICAgb3V0OiBbCi0gICAgICAgICJhY3Rpdml0eV9hdHRyaWJ1dGlvbl9nZW5lcmF0ZWQuaCIsCi0gICAgICAgICJkdW1wc3lzX2RhdGFfZ2VuZXJhdGVkLmgiLAotICAgICAgICAiZHVtcHN5c19nZW5lcmF0ZWQuaCIsCi0gICAgICAgICJoY2lfYWNsX21hbmFnZXJfZ2VuZXJhdGVkLmgiLAotICAgICAgICAiaW5pdF9mbGFnc19nZW5lcmF0ZWQuaCIsCi0gICAgICAgICJsMmNhcF9jbGFzc2ljX21vZHVsZV9nZW5lcmF0ZWQuaCIsCi0gICAgICAgICJ3YWtlbG9ja19tYW5hZ2VyX2dlbmVyYXRlZC5oIiwKLSAgICBdLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19weXRob24zX2NjIiwKLSAgICB0b29sczogWwotICAgICAgICAiYmx1ZXRvb3RoX3BhY2tldGdlbiIsCi0gICAgXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGJsdWV0b290aF9wYWNrZXRnZW4pIC0taW5jbHVkZT1zeXN0ZW0vYnQvZ2QgLS1vdXQ9JChnZW5EaXIpIC0tbnVtX3NoYXJkcz0xMCAkKGluKSIsCi0gICAgc3JjczogWwotICAgICAgICAiaGNpL2hjaV9wYWNrZXRzLnBkbCIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzLnBkbCIsCi0gICAgICAgICJzZWN1cml0eS9zbXBfcGFja2V0cy5wZGwiLAotICAgIF0sCi0gICAgb3V0OiBbCi0gICAgICAgICJoY2kvaGNpX3BhY2tldHNfcHl0aG9uMy5jYyIsCi0gICAgICAgICJoY2kvaGNpX3BhY2tldHNfcHl0aG9uM19zaGFyZF8wLmNjIiwKLSAgICAgICAgImhjaS9oY2lfcGFja2V0c19weXRob24zX3NoYXJkXzEuY2MiLAotICAgICAgICAiaGNpL2hjaV9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMi5jYyIsCi0gICAgICAgICJoY2kvaGNpX3BhY2tldHNfcHl0aG9uM19zaGFyZF8zLmNjIiwKLSAgICAgICAgImhjaS9oY2lfcGFja2V0c19weXRob24zX3NoYXJkXzQuY2MiLAotICAgICAgICAiaGNpL2hjaV9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfNS5jYyIsCi0gICAgICAgICJoY2kvaGNpX3BhY2tldHNfcHl0aG9uM19zaGFyZF82LmNjIiwKLSAgICAgICAgImhjaS9oY2lfcGFja2V0c19weXRob24zX3NoYXJkXzcuY2MiLAotICAgICAgICAiaGNpL2hjaV9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfOC5jYyIsCi0gICAgICAgICJoY2kvaGNpX3BhY2tldHNfcHl0aG9uM19zaGFyZF85LmNjIiwKLSAgICAgICAgImwyY2FwL2wyY2FwX3BhY2tldHNfcHl0aG9uMy5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMC5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMS5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMi5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMy5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfNC5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfNS5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfNi5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfNy5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfOC5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfOS5jYyIsCi0gICAgICAgICJzZWN1cml0eS9zbXBfcGFja2V0c19weXRob24zLmNjIiwKLSAgICAgICAgInNlY3VyaXR5L3NtcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMC5jYyIsCi0gICAgICAgICJzZWN1cml0eS9zbXBfcGFja2V0c19weXRob24zX3NoYXJkXzEuY2MiLAotICAgICAgICAic2VjdXJpdHkvc21wX3BhY2tldHNfcHl0aG9uM19zaGFyZF8yLmNjIiwKLSAgICAgICAgInNlY3VyaXR5L3NtcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfMy5jYyIsCi0gICAgICAgICJzZWN1cml0eS9zbXBfcGFja2V0c19weXRob24zX3NoYXJkXzQuY2MiLAotICAgICAgICAic2VjdXJpdHkvc21wX3BhY2tldHNfcHl0aG9uM19zaGFyZF81LmNjIiwKLSAgICAgICAgInNlY3VyaXR5L3NtcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfNi5jYyIsCi0gICAgICAgICJzZWN1cml0eS9zbXBfcGFja2V0c19weXRob24zX3NoYXJkXzcuY2MiLAotICAgICAgICAic2VjdXJpdHkvc21wX3BhY2tldHNfcHl0aG9uM19zaGFyZF84LmNjIiwKLSAgICAgICAgInNlY3VyaXR5L3NtcF9wYWNrZXRzX3B5dGhvbjNfc2hhcmRfOS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlUHJvdG8iLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZhY2FkZS9jb21tb24ucHJvdG8iLAotICAgICAgICAiZmFjYWRlL3Jvb3RzZXJ2aWNlLnByb3RvIiwKLSAgICAgICAgImhhbC9oYWxfZmFjYWRlLnByb3RvIiwKLSAgICAgICAgImhjaS9mYWNhZGUvaGNpX2ZhY2FkZS5wcm90byIsCi0gICAgICAgICJoY2kvZmFjYWRlL2FjbF9tYW5hZ2VyX2ZhY2FkZS5wcm90byIsCi0gICAgICAgICJoY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLnByb3RvIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLnByb3RvIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUucHJvdG8iLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUucHJvdG8iLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5wcm90byIsCi0gICAgICAgICJpc28vZmFjYWRlLnByb3RvIiwKLSAgICAgICAgIm5laWdoYm9yL2ZhY2FkZS9mYWNhZGUucHJvdG8iLAotICAgICAgICAibDJjYXAvY2xhc3NpYy9mYWNhZGUucHJvdG8iLAotICAgICAgICAibDJjYXAvbGUvZmFjYWRlLnByb3RvIiwKLSAgICAgICAgInNlY3VyaXR5L2ZhY2FkZS5wcm90byIsCi0gICAgICAgICJzaGltL2ZhY2FkZS9mYWNhZGUucHJvdG8iLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhGYWNhZGVHZW5lcmF0ZWRTdHViX2giLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJhcHJvdG9jIiwKLSAgICAgICAgInByb3RvYy1nZW4tZ3JwYy1jcHAtcGx1Z2luIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gYXByb3RvYykgLUlzeXN0ZW0vYnQvZ2QgLUlleHRlcm5hbC9wcm90b2J1Zi9zcmMgLS1wbHVnaW49cHJvdG9jLWdlbi1ncnBjPSQobG9jYXRpb24gcHJvdG9jLWdlbi1ncnBjLWNwcC1wbHVnaW4pICQoaW4pIC0tZ3JwY19vdXQ9JChnZW5EaXIpIC0tY3BwX291dD0kKGdlbkRpcikiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpCbHVldG9vdGhGYWNhZGVQcm90byIsCi0gICAgXSwKLSAgICBvdXQ6IFsKLSAgICAgICAgImZhY2FkZS9jb21tb24uZ3JwYy5wYi5oIiwKLSAgICAgICAgImZhY2FkZS9jb21tb24ucGIuaCIsCi0gICAgICAgICJmYWNhZGUvcm9vdHNlcnZpY2UuZ3JwYy5wYi5oIiwKLSAgICAgICAgImZhY2FkZS9yb290c2VydmljZS5wYi5oIiwKLSAgICAgICAgImhhbC9oYWxfZmFjYWRlLmdycGMucGIuaCIsCi0gICAgICAgICJoYWwvaGFsX2ZhY2FkZS5wYi5oIiwKLSAgICAgICAgImhjaS9mYWNhZGUvaGNpX2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAiaGNpL2ZhY2FkZS9oY2lfZmFjYWRlLnBiLmgiLAotICAgICAgICAiaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUuZ3JwYy5wYi5oIiwKLSAgICAgICAgImhjaS9mYWNhZGUvYWNsX21hbmFnZXJfZmFjYWRlLnBiLmgiLAotICAgICAgICAiaGNpL2ZhY2FkZS9jb250cm9sbGVyX2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAiaGNpL2ZhY2FkZS9jb250cm9sbGVyX2ZhY2FkZS5wYi5oIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLmdycGMucGIuaCIsCi0gICAgICAgICJoY2kvZmFjYWRlL2xlX2FjbF9tYW5hZ2VyX2ZhY2FkZS5wYi5oIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUuZ3JwYy5wYi5oIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUucGIuaCIsCi0gICAgICAgICJoY2kvZmFjYWRlL2xlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUucGIuaCIsCi0gICAgICAgICJoY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLmdycGMucGIuaCIsCi0gICAgICAgICJoY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLnBiLmgiLAotICAgICAgICAiaXNvL2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAiaXNvL2ZhY2FkZS5wYi5oIiwKLSAgICAgICAgImwyY2FwL2NsYXNzaWMvZmFjYWRlLmdycGMucGIuaCIsCi0gICAgICAgICJsMmNhcC9jbGFzc2ljL2ZhY2FkZS5wYi5oIiwKLSAgICAgICAgImwyY2FwL2xlL2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAibDJjYXAvbGUvZmFjYWRlLnBiLmgiLAotICAgICAgICAibmVpZ2hib3IvZmFjYWRlL2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAibmVpZ2hib3IvZmFjYWRlL2ZhY2FkZS5wYi5oIiwKLSAgICAgICAgInNlY3VyaXR5L2ZhY2FkZS5ncnBjLnBiLmgiLAotICAgICAgICAic2VjdXJpdHkvZmFjYWRlLnBiLmgiLAotICAgICAgICAic2hpbS9mYWNhZGUvZmFjYWRlLmdycGMucGIuaCIsCi0gICAgICAgICJzaGltL2ZhY2FkZS9mYWNhZGUucGIuaCIsCi0gICAgXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogIkJsdWV0b290aEZhY2FkZUdlbmVyYXRlZFN0dWJfY2MiLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJhcHJvdG9jIiwKLSAgICAgICAgInByb3RvYy1nZW4tZ3JwYy1jcHAtcGx1Z2luIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gYXByb3RvYykgLUlzeXN0ZW0vYnQvZ2QgLUlleHRlcm5hbC9wcm90b2J1Zi9zcmMgLS1wbHVnaW49cHJvdG9jLWdlbi1ncnBjPSQobG9jYXRpb24gcHJvdG9jLWdlbi1ncnBjLWNwcC1wbHVnaW4pICQoaW4pIC0tZ3JwY19vdXQ9JChnZW5EaXIpIC0tY3BwX291dD0kKGdlbkRpcikiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpCbHVldG9vdGhGYWNhZGVQcm90byIsCi0gICAgXSwKLSAgICBvdXQ6IFsKLSAgICAgICAgImZhY2FkZS9jb21tb24uZ3JwYy5wYi5jYyIsCi0gICAgICAgICJmYWNhZGUvY29tbW9uLnBiLmNjIiwKLSAgICAgICAgImZhY2FkZS9yb290c2VydmljZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImZhY2FkZS9yb290c2VydmljZS5wYi5jYyIsCi0gICAgICAgICJoYWwvaGFsX2ZhY2FkZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImhhbC9oYWxfZmFjYWRlLnBiLmNjIiwKLSAgICAgICAgImhjaS9mYWNhZGUvaGNpX2ZhY2FkZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImhjaS9mYWNhZGUvaGNpX2ZhY2FkZS5wYi5jYyIsCi0gICAgICAgICJoY2kvZmFjYWRlL2FjbF9tYW5hZ2VyX2ZhY2FkZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImhjaS9mYWNhZGUvYWNsX21hbmFnZXJfZmFjYWRlLnBiLmNjIiwKLSAgICAgICAgImhjaS9mYWNhZGUvY29udHJvbGxlcl9mYWNhZGUuZ3JwYy5wYi5jYyIsCi0gICAgICAgICJoY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLnBiLmNjIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLmdycGMucGIuY2MiLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUucGIuY2MiLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImhjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUucGIuY2MiLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuZ3JwYy5wYi5jYyIsCi0gICAgICAgICJoY2kvZmFjYWRlL2xlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5wYi5jYyIsCi0gICAgICAgICJoY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLmdycGMucGIuY2MiLAotICAgICAgICAiaGNpL2ZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5wYi5jYyIsCi0gICAgICAgICJpc28vZmFjYWRlLmdycGMucGIuY2MiLAotICAgICAgICAiaXNvL2ZhY2FkZS5wYi5jYyIsCi0gICAgICAgICJsMmNhcC9jbGFzc2ljL2ZhY2FkZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImwyY2FwL2NsYXNzaWMvZmFjYWRlLnBiLmNjIiwKLSAgICAgICAgImwyY2FwL2xlL2ZhY2FkZS5ncnBjLnBiLmNjIiwKLSAgICAgICAgImwyY2FwL2xlL2ZhY2FkZS5wYi5jYyIsCi0gICAgICAgICJuZWlnaGJvci9mYWNhZGUvZmFjYWRlLmdycGMucGIuY2MiLAotICAgICAgICAibmVpZ2hib3IvZmFjYWRlL2ZhY2FkZS5wYi5jYyIsCi0gICAgICAgICJzZWN1cml0eS9mYWNhZGUuZ3JwYy5wYi5jYyIsCi0gICAgICAgICJzZWN1cml0eS9mYWNhZGUucGIuY2MiLAotICAgICAgICAic2hpbS9mYWNhZGUvZmFjYWRlLmdycGMucGIuY2MiLAotICAgICAgICAic2hpbS9mYWNhZGUvZmFjYWRlLnBiLmNjIiwKLSAgICBdLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlQW5kQ2VydEdlbmVyYXRlZFN0dWJfcHkiLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJhcHJvdG9jIiwKLSAgICAgICAgInByb3RvYy1nZW4tZ3JwYy1weXRob24tcGx1Z2luIiwKLSAgICAgICAgInNvb25nX3ppcCIsCi0gICAgXSwKLSAgICBjbWQ6ICJta2RpciAtcCAkKGdlbkRpcikvZmlsZXMgJiYgIiArCi0gICAgICAgICIkKGxvY2F0aW9uIGFwcm90b2MpIC1Jc3lzdGVtL2J0L2dkIC1Jc3lzdGVtL2J0L2JsdWViZXJyeS90ZXN0cy9nZC9jZXJ0IC1JZXh0ZXJuYWwvcHJvdG9idWYvc3JjIC0tcGx1Z2luPXByb3RvYy1nZW4tZ3JwYz0kKGxvY2F0aW9uIHByb3RvYy1nZW4tZ3JwYy1weXRob24tcGx1Z2luKSAkKGluKSAtLWdycGNfb3V0PSQoZ2VuRGlyKS9maWxlcyAtLXB5dGhvbl9vdXQ9JChnZW5EaXIpL2ZpbGVzICYmICIgKwotICAgICAgICAibWtkaXIgLXAgJChnZW5EaXIpL2ZpbGVzL2NlcnQgJiYgIiArCi0gICAgICAgICJ0b3VjaCAkKGdlbkRpcikvZmlsZXMvY2VydC9fX2luaXRfXy5weSAmJiAiICsKLSAgICAgICAgInRvdWNoICQoZ2VuRGlyKS9maWxlcy9mYWNhZGUvX19pbml0X18ucHkgJiYgIiArCi0gICAgICAgICJ0b3VjaCAkKGdlbkRpcikvZmlsZXMvaGFsL19faW5pdF9fLnB5ICYmICIgKwotICAgICAgICAidG91Y2ggJChnZW5EaXIpL2ZpbGVzL2hjaS9fX2luaXRfXy5weSAmJiAiICsKLSAgICAgICAgInRvdWNoICQoZ2VuRGlyKS9maWxlcy9oY2kvZmFjYWRlL19faW5pdF9fLnB5ICYmICIgKwotICAgICAgICAidG91Y2ggJChnZW5EaXIpL2ZpbGVzL2lzby9fX2luaXRfXy5weSAmJiAiICsKLSAgICAgICAgInRvdWNoICQoZ2VuRGlyKS9maWxlcy9sMmNhcC9jbGFzc2ljL19faW5pdF9fLnB5ICYmICIgKwotICAgICAgICAidG91Y2ggJChnZW5EaXIpL2ZpbGVzL2wyY2FwL2xlL19faW5pdF9fLnB5ICYmICIgKwotICAgICAgICAidG91Y2ggJChnZW5EaXIpL2ZpbGVzL25laWdoYm9yL2ZhY2FkZS9fX2luaXRfXy5weSAmJiAiICsKLSAgICAgICAgInRvdWNoICQoZ2VuRGlyKS9maWxlcy9zZWN1cml0eS9fX2luaXRfXy5weSAmJiAiICsKLSAgICAgICAgIm1rZGlyIC1wICQoZ2VuRGlyKS9maWxlcy9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydCAmJiAiICsKLSAgICAgICAgInRvdWNoICQoZ2VuRGlyKS9maWxlcy9ibHVlYmVycnkvdGVzdHMvZ2QvY2VydC9fX2luaXRfXy5weSAmJiAiICsKLSAgICAgICAgLy8gQnVuZGxlIHRvcHNoaW0gcHJvdG8gaGVyZSBmb3Igbm93Ci0gICAgICAgICJta2RpciAtcCAkKGdlbkRpcikvZmlsZXMvcnVzdC90b3BzaGltL2ZhY2FkZSAmJiAiICsKLSAgICAgICAgIiQobG9jYXRpb24gYXByb3RvYykgLUlzeXN0ZW0vYnQvZ2QgLS1wbHVnaW49cHJvdG9jLWdlbi1ncnBjPSQobG9jYXRpb24gcHJvdG9jLWdlbi1ncnBjLXB5dGhvbi1wbHVnaW4pIHN5c3RlbS9idC9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL2ZhY2FkZS5wcm90byAtLWdycGNfb3V0PSQoZ2VuRGlyKS9maWxlcyAtLXB5dGhvbl9vdXQ9JChnZW5EaXIpL2ZpbGVzICYmICIgKwotICAgICAgICAidG91Y2ggJChnZW5EaXIpL2ZpbGVzL3J1c3QvX19pbml0X18ucHkgJiYgIiArCi0gICAgICAgICJ0b3VjaCAkKGdlbkRpcikvZmlsZXMvcnVzdC90b3BzaGltL19faW5pdF9fLnB5ICYmICIgKwotICAgICAgICAidG91Y2ggJChnZW5EaXIpL2ZpbGVzL3J1c3QvdG9wc2hpbS9mYWNhZGUvX19pbml0X18ucHkgJiYgIiArCi0gICAgICAgICIkKGxvY2F0aW9uIHNvb25nX3ppcCkgLUMgJChnZW5EaXIpL2ZpbGVzIC1EICQoZ2VuRGlyKS9maWxlcyAtbyAkKG91dCkiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpCbHVldG9vdGhGYWNhZGVQcm90byIsCi0gICAgXSwKLSAgICBvdXQ6IFsiYmx1ZXRvb3RoX2NlcnRfZ2VuZXJhdGVkX3B5LnppcCJdLAotfQotCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImJsdWV0b290aF9weTNfbmF0aXZlX2V4dGVuc2lvbl9kZWZhdWx0cyIsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9weXRob24vY3B5dGhvbjMvSW5jbHVkZSIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgaW5jbHVkZV9kaXJzOiBbImV4dGVybmFsL3B5dGhvbi9jcHl0aG9uMy9hbmRyb2lkL2Jpb25pYy9weWNvbmZpZyJdLAotICAgICAgICB9LAotICAgICAgICBhbmRyb2lkX2FybTogewotICAgICAgICAgICAgY2ZsYWdzOiBbIi1EU09BQkk9XCJjcHl0aG9uLTM4YW5kcm9pZC1hcm0tYW5kcm9pZC1iaW9uaWNcIiJdLAotICAgICAgICAgICAgc3VmZml4OiAiLmNweXRob24tMzhhbmRyb2lkLWFybS1hbmRyb2lkLWJpb25pYyIsCi0gICAgICAgIH0sCi0gICAgICAgIGFuZHJvaWRfYXJtNjQ6IHsKLSAgICAgICAgICAgIGNmbGFnczogWyItRFNPQUJJPVwiY3B5dGhvbi0zOGFuZHJvaWQtYXJtNjQtYW5kcm9pZC1iaW9uaWNcIiJdLAotICAgICAgICAgICAgc3VmZml4OiAiLmNweXRob24tMzhhbmRyb2lkLWFybTY0LWFuZHJvaWQtYmlvbmljIiwKLSAgICAgICAgfSwKLSAgICAgICAgYW5kcm9pZF94ODY6IHsKLSAgICAgICAgICAgIGNmbGFnczogWyItRFNPQUJJPVwiY3B5dGhvbi0zOGFuZHJvaWQteDg2LWFuZHJvaWQtYmlvbmljXCIiXSwKLSAgICAgICAgICAgIHN1ZmZpeDogIi5jcHl0aG9uLTM4YW5kcm9pZC14ODYtYW5kcm9pZC1iaW9uaWMiLAotICAgICAgICB9LAotICAgICAgICBhbmRyb2lkX3g4Nl82NDogewotICAgICAgICAgICAgY2ZsYWdzOiBbIi1EU09BQkk9XCJjcHl0aG9uLTM4YW5kcm9pZC14ODZfNjQtYW5kcm9pZC1iaW9uaWNcIiJdLAotICAgICAgICAgICAgc3VmZml4OiAiLmNweXRob24tMzhhbmRyb2lkLXg4Nl82NC1hbmRyb2lkLWJpb25pYyIsCi0gICAgICAgIH0sCi0gICAgICAgIC8vIFJlZ2VuZXJhdGUgaW5jbHVkZSBkaXJzIHdpdGggYW5kcm9pZF9yZWdlbi5zaAotICAgICAgICBkYXJ3aW5feDg2XzY0OiB7Ci0gICAgICAgICAgICBpbmNsdWRlX2RpcnM6IFsiZXh0ZXJuYWwvcHl0aG9uL2NweXRob24zL2FuZHJvaWQvZGFyd2luX3g4Nl82NC9weWNvbmZpZyJdLAotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAotICAgICAgICAgICAgICAgICItV25vLXBvaW50ZXItYXJpdGgiLAotICAgICAgICAgICAgICAgICItRFNPQUJJPVwiY3B5dGhvbi0zOGFuZHJvaWQteDg2XzY0LWRhcndpblwiIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBzdWZmaXg6ICIuY3B5dGhvbi0zOGFuZHJvaWQteDg2XzY0LWRhcndpbiIsCi0gICAgICAgIH0sCi0gICAgICAgIGxpbnV4X2Jpb25pYzogewotICAgICAgICAgICAgLy8gTkIgbGludXhfYmlvbmljIGlzIGEgJ2hvc3QnIGFyY2hpdGVjdHVyZSBidXQgaXQgdXNlcyB0aGUgYmlvbmljIGxpYmMgbGlrZSAnYW5kcm9pZCcKLSAgICAgICAgICAgIC8vIHRhcmdldHMgc28gdXNlIHRoZSBhbmRyb2lkIHB5Y29uZmlnLgotICAgICAgICAgICAgaW5jbHVkZV9kaXJzOiBbImV4dGVybmFsL3B5dGhvbi9jcHl0aG9uMy9hbmRyb2lkL2Jpb25pYy9weWNvbmZpZyJdLAotICAgICAgICAgICAgY2ZsYWdzOiBbIi1EU09BQkk9XCJjcHl0aG9uLTM4YW5kcm9pZC14ODZfNjQtbGludXgtYmlvbmljXCIiXSwKLSAgICAgICAgICAgIHN1ZmZpeDogIi5jcHl0aG9uLTM4YW5kcm9pZC14ODZfNjQtbGludXgtYmlvbmljIiwKLSAgICAgICAgfSwKLSAgICAgICAgbGludXhfZ2xpYmNfeDg2OiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICAgICAgbGludXhfZ2xpYmNfeDg2XzY0OiB7Ci0gICAgICAgICAgICBpbmNsdWRlX2RpcnM6IFsiZXh0ZXJuYWwvcHl0aG9uL2NweXRob24zL2FuZHJvaWQvbGludXhfeDg2XzY0L3B5Y29uZmlnIl0sCi0gICAgICAgICAgICBjZmxhZ3M6IFsiLURTT0FCST1cImNweXRob24tMzhhbmRyb2lkLXg4Nl82NC1saW51eC1nbnVcIiJdLAotICAgICAgICAgICAgLy8gQ29tbWVudGluZyBvdXQgdGhlIExpbnV4IHN1ZmZpeCBzbyB0aGF0IGNweXRob24tMzgteDg2XzY0LWxpbnV4LWdudQotICAgICAgICAgICAgLy8gUHl0aG9uIDMuOCBjYW4gYWxzbyBpbXBvcnQgdGhlIHVudGFnZ2VkIC5zbyBsaWJyYXJ5IHBlciBQRVAgMzE0OQotICAgICAgICAgICAgLy8gS2VlcCB0aGlzIGNoYW5nZSB1bnRpbCBBbmRyb2lkIHB5My1jbWQgY2FuIHJ1biBBQ1RTLCBnUlBDIGFuZCBjYW4KLSAgICAgICAgICAgIC8vIEV4cG9ydCBQeXRob24gbmF0aXZlIHN5bWJvbHMgc3VjaCBhcyBQeVR5cGVfVHlwZQotICAgICAgICAgICAgLy8gc3VmZml4OiAiLmNweXRob24tMzhhbmRyb2lkLXg4Nl82NC1saW51eC1nbnUiLAotICAgICAgICB9LAotICAgICAgICB3aW5kb3dzOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotICAgIGFsbG93X3VuZGVmaW5lZF9zeW1ib2xzOiB0cnVlLAotfQotCi1jY19saWJyYXJ5X2hvc3Rfc2hhcmVkIHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImdkX2RlZmF1bHRzIiwKLSAgICAgICAgImJsdWV0b290aF9weTNfbmF0aXZlX2V4dGVuc2lvbl9kZWZhdWx0cyIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjb21tb24vc3RyaW5ncy5jYyIsCi0gICAgICAgICJwYWNrZXQvcHl0aG9uM19tb2R1bGUuY2MiLAotICAgICAgICAibDJjYXAvZmNzLmNjIiwKLSAgICAgICAgIjpCbHVldG9vdGhQYWNrZXRTb3VyY2VzIiwKLSAgICAgICAgImhjaS9hZGRyZXNzLmNjIiwKLSAgICAgICAgImhjaS9jbGFzc19vZl9kZXZpY2UuY2MiLAotCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX3B5dGhvbjNfY2MiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgInB5YmluZDExX2hlYWRlcnMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItZmV4Y2VwdGlvbnMiLAotICAgIF0sCi0gICAgcnR0aTogdHJ1ZSwKLX0KLQotcnVzdF9wcm90b2J1ZiB7Ci0gICAgbmFtZTogImxpYmJ0X2ZhY2FkZV9wcm90byIsCi0gICAgY3JhdGVfbmFtZTogImJ0X2ZhY2FkZV9wcm90byIsCi0gICAgcHJvdG9zOiBbImZhY2FkZS9jb21tb24ucHJvdG8iXSwKLSAgICBncnBjX3Byb3RvczogWwotICAgICAgICAiaGNpL2ZhY2FkZS9jb250cm9sbGVyX2ZhY2FkZS5wcm90byIsCi0gICAgICAgICJoY2kvZmFjYWRlL2hjaV9mYWNhZGUucHJvdG8iLAotICAgICAgICAiaGFsL2hhbF9mYWNhZGUucHJvdG8iLAotICAgICAgICAiZmFjYWRlL3Jvb3RzZXJ2aWNlLnByb3RvIiwKLSAgICBdLAotICAgIHNvdXJjZV9zdGVtOiAiZmFjYWRlIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KZGlmZiAtLWdpdCBhL2dkL0FuZHJvaWQubWsgYi9nZC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjI1OTM1Li4wMDAwMDAwCi0tLSBhL2dkL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jTElOVC5JZkNoYW5nZQotTE9DQUxfY2VydF90ZXN0X3NvdXJjZXMgOj0gXAotCSQoY2FsbCBhbGwtbmFtZWQtZmlsZXMtdW5kZXIsKi5weSwuKSBcCi0JY2VydC9hbGxfY2VydF90ZXN0Y2FzZXMgXAotCWNlcnQvcmVhbF9kZXZpY2VfdGVzdGNhc2VzIFwKLQloY2kvY2VydC9sZV9leHRlbmRlZF9jb25maWcuanNvbiBcCi0JaGNpL2NlcnQvbGVfbGVnYWN5X2NvbmZpZy5qc29uCi1MT0NBTF9jZXJ0X3Rlc3Rfc291cmNlcyA6PSBcCi0JJChmaWx0ZXItb3V0IGdkX2NlcnRfdmVudiUgdmVudiUsICQoTE9DQUxfY2VydF90ZXN0X3NvdXJjZXMpKQotTE9DQUxfY2VydF90ZXN0X3NvdXJjZXMgOj0gXAotCSQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKExPQ0FMX2NlcnRfdGVzdF9zb3VyY2VzKSkKLQotTE9DQUxfaG9zdF9leGVjdXRhYmxlcyA6PSBcCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlIFwKLQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ibHVldG9vdGhfd2l0aF9mYWNhZGVzIFwKLQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idF90b3BzaGltX2ZhY2FkZSBcCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvcm9vdC1jYW5hbAotCi1MT0NBTF9ob3N0X3B5dGhvbl9leHRlbnNpb25fbGlicmFyaWVzIDo9IFwKLQkkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2JsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuc28KLQotTE9DQUxfaG9zdF9saWJyYXJpZXMgOj0gXAotCSQoSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliYmFzZS5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJibHVldG9vdGguc28gXAotCSQoSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliYmx1ZXRvb3RoX2dkLnNvIFwKLQkkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYmMrKy5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJjaHJvbWUuc28gXAotCSQoSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliY3J5cHRvLWhvc3Quc28gXAotCSQoSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliZXZlbnQtaG9zdC5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJmbGF0YnVmZmVycy1jcHAuc28gXAotCSQoSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliZ3JwYysrX3Vuc2VjdXJlLnNvIFwKLQkkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYmdycGMrKy5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJncnBjX3dyYXAuc28gXAotCSQoSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGlibG9nLnNvIFwKLQkkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYnNzbC1ob3N0LnNvIFwKLQkkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYnotaG9zdC5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJwcm90b2J1Zi1jcHAtZnVsbC5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJ1bndpbmRzdGFjay5zbyBcCi0JJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKS9saWJsem1hLnNvIFwKLQkkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYmJhY2t0cmFjZS5zbwotCi1MT0NBTF90YXJnZXRfZXhlY3V0YWJsZXMgOj0gXAotCSQoVEFSR0VUX09VVF9FWEVDVVRBQkxFUykvYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlCi0KLUxPQ0FMX3RhcmdldF9saWJyYXJpZXMgOj0gXAotCSQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9hbmRyb2lkLnN5c3RlbS5zdXNwZW5kLmNvbnRyb2wtVjEtbmRrLnNvIFwKLQkkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliY3J5cHRvLnNvIFwKLQkkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliYmx1ZXRvb3RoX2dkLnNvIFwKLQkkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliZ3JwYysrX3Vuc2VjdXJlLnNvIFwKLQkkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliZ3JwYysrLnNvIFwKLQkkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGliZ3JwY193cmFwLnNvIFwKLQkkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvbGlic3RhdHNsb2dfYnQuc28KLSNMSU5ULlRoZW5DaGFuZ2UoY2VydC9ydW4pCi0KLWJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCA6PSBcCi0JJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsYmx1ZXRvb3RoX2NlcnRfc3JjX2FuZF9iaW4sSE9TVCkvYmx1ZXRvb3RoX2NlcnRfc3JjX2FuZF9iaW4uemlwCi0KLSMgQXNzdW1lIDY0LWJpdCBPUwotJChibHVldG9vdGhfY2VydF9zcmNfYW5kX2Jpbl96aXApOiBQUklWQVRFX2NlcnRfdGVzdF9zb3VyY2VzIDo9ICQoTE9DQUxfY2VydF90ZXN0X3NvdXJjZXMpCi0kKGJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCk6IFBSSVZBVEVfaG9zdF9leGVjdXRhYmxlcyA6PSAkKExPQ0FMX2hvc3RfZXhlY3V0YWJsZXMpCi0kKGJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCk6IFBSSVZBVEVfaG9zdF9weXRob25fZXh0ZW5zaW9uX2xpYnJhcmllcyA6PSAkKExPQ0FMX2hvc3RfcHl0aG9uX2V4dGVuc2lvbl9saWJyYXJpZXMpCi0kKGJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCk6IFBSSVZBVEVfaG9zdF9saWJyYXJpZXMgOj0gJChMT0NBTF9ob3N0X2xpYnJhcmllcykKLSQoYmx1ZXRvb3RoX2NlcnRfc3JjX2FuZF9iaW5femlwKTogUFJJVkFURV90YXJnZXRfZXhlY3V0YWJsZXMgOj0gJChMT0NBTF90YXJnZXRfZXhlY3V0YWJsZXMpCi0kKGJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCk6IFBSSVZBVEVfdGFyZ2V0X2xpYnJhcmllcyA6PSAkKExPQ0FMX3RhcmdldF9saWJyYXJpZXMpCi0kKGJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCk6ICQoU09PTkdfWklQKSAkKExPQ0FMX2NlcnRfdGVzdF9zb3VyY2VzKSBcCi0JCSQoTE9DQUxfaG9zdF9leGVjdXRhYmxlcykgJChMT0NBTF9ob3N0X2xpYnJhcmllcykgJChMT0NBTF9ob3N0X3B5dGhvbl9leHRlbnNpb25fbGlicmFyaWVzKSBcCi0JCSQoTE9DQUxfdGFyZ2V0X2V4ZWN1dGFibGVzKSAkKExPQ0FMX3RhcmdldF9saWJyYXJpZXMpCi0JJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgXAotCQktQyBzeXN0ZW0vYnQvZ2QgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9jZXJ0X3Rlc3Rfc291cmNlcykpIFwKLQkJLUMgJChIT1NUX09VVF9FWEVDVVRBQkxFUykgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9ob3N0X2V4ZWN1dGFibGVzKSkgXAotCQktQyAkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfaG9zdF9weXRob25fZXh0ZW5zaW9uX2xpYnJhcmllcykpIFwKLQkJLVAgbGliNjQgXAotCQktQyAkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfaG9zdF9saWJyYXJpZXMpKSBcCi0JCS1QIHRhcmdldCBcCi0JCS1DICQoVEFSR0VUX09VVF9FWEVDVVRBQkxFUykgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV90YXJnZXRfZXhlY3V0YWJsZXMpKSBcCi0JCS1DICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKSAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX3RhcmdldF9saWJyYXJpZXMpKQotCi0jIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGxvY2F0ZSBvdXRwdXQgZnJvbSBTT09ORyBnZW5ydWxlKCkKLUxPQ0FMX2NlcnRfZ2VuZXJhdGVkX3B5X3ppcCA6PSBcCi0JJChTT09OR19PVVRfRElSKS8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vYnQvZ2QvQmx1ZXRvb3RoRmFjYWRlQW5kQ2VydEdlbmVyYXRlZFN0dWJfcHkvZ2VuL2JsdWV0b290aF9jZXJ0X2dlbmVyYXRlZF9weS56aXAKLQotTE9DQUxfYWN0c196aXAgOj0gJChIT1NUX09VVCkvYWN0cy1kaXN0L2FjdHMuemlwCi0KLWJsdWV0b290aF9jZXJ0X3Rlc3RzX3B5X3BhY2thZ2VfemlwIDo9IFwKLQkkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxibHVldG9vdGhfY2VydF90ZXN0c19weV9wYWNrYWdlLEhPU1QpL2JsdWV0b290aF9jZXJ0X3Rlc3RzLnppcAotCi0kKGJsdWV0b290aF9jZXJ0X3Rlc3RzX3B5X3BhY2thZ2VfemlwKTogUFJJVkFURV9jZXJ0X3NyY19hbmRfYmluX3ppcCA6PSAkKGJsdWV0b290aF9jZXJ0X3NyY19hbmRfYmluX3ppcCkKLSQoYmx1ZXRvb3RoX2NlcnRfdGVzdHNfcHlfcGFja2FnZV96aXApOiBQUklWQVRFX2FjdHNfemlwIDo9ICQoTE9DQUxfYWN0c196aXApCi0kKGJsdWV0b290aF9jZXJ0X3Rlc3RzX3B5X3BhY2thZ2VfemlwKTogUFJJVkFURV9jZXJ0X2dlbmVyYXRlZF9weV96aXAgOj0gJChMT0NBTF9jZXJ0X2dlbmVyYXRlZF9weV96aXApCi0kKGJsdWV0b290aF9jZXJ0X3Rlc3RzX3B5X3BhY2thZ2VfemlwKTogJChTT09OR19aSVApICQoTE9DQUxfYWN0c196aXApIFwKLQkJJChibHVldG9vdGhfY2VydF9zcmNfYW5kX2Jpbl96aXApICQoYmx1ZXRvb3RoX2NlcnRfZ2VuZXJhdGVkX3B5X3ppcCkKLQlAZWNobyAiUGFja2FnaW5nIEJsdWV0b290aCBDZXJ0IFRlc3RzIGludG8gJEAiCi0JQHJtIC1yZiAkKGRpciAkQClibHVldG9vdGhfY2VydF90ZXN0cwotCUBybSAtcmYgJChkaXIgJEApYWN0cwotCUBta2RpciAtcCAkKGRpciAkQClibHVldG9vdGhfY2VydF90ZXN0cwotCUBta2RpciAtcCAkKGRpciAkQClhY3RzCi0JJChoaWRlKSB1bnppcCAtbyAtcSAkKFBSSVZBVEVfYWN0c196aXApICJ0b29scy90ZXN0L2Nvbm5lY3Rpdml0eS9hY3RzL2ZyYW1ld29yay8qIiAtZCAkKGRpciAkQClhY3RzCi0JJChoaWRlKSB1bnppcCAtbyAtcSAkKFBSSVZBVEVfY2VydF9zcmNfYW5kX2Jpbl96aXApIC1kICQoZGlyICRAKWJsdWV0b290aF9jZXJ0X3Rlc3RzCi0JJChoaWRlKSB1bnppcCAtbyAtcSAkKFBSSVZBVEVfY2VydF9nZW5lcmF0ZWRfcHlfemlwKSAtZCAkKGRpciAkQClibHVldG9vdGhfY2VydF90ZXN0cwotCSMgTWFrZSBhbGwgc3ViZGlyZWN0b3J5IG9mIGdkIFB5dGhvbiBwYWNha2FnZXMgZXhjZXB0IGxpYjY0IGFuZCB0YXJnZXQKLQkkKGhpZGUpIGZvciBmIGluIGBmaW5kICQoZGlyICRAKWJsdWV0b290aF9jZXJ0X3Rlc3RzIC10eXBlIGQgLW5hbWUgIioiIFwKLQkJCQkJLW5vdCAtcGF0aCAiJChkaXIgJEApYmx1ZXRvb3RoX2NlcnRfdGVzdHMvdGFyZ2V0KiIgXAotCQkJCQktbm90IC1wYXRoICIkKGRpciAkQClibHVldG9vdGhfY2VydF90ZXN0cy9saWI2NCoiYCBcCi0JCQk7IGRvICh0b3VjaCAtYSAkJGYvX19pbml0X18ucHkpIDsgZG9uZQotCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoZGlyICRAKWJsdWV0b290aF9jZXJ0X3Rlc3RzIC1EICQoZGlyICRAKWJsdWV0b290aF9jZXJ0X3Rlc3RzIFwKLQkJLVAgYWN0c19mcmFtZXdvcmsgXAotCQktQyAkKGRpciAkQClhY3RzL3Rvb2xzL3Rlc3QvY29ubmVjdGl2aXR5L2FjdHMvZnJhbWV3b3JrIC1EICQoZGlyICRAKWFjdHMvdG9vbHMvdGVzdC9jb25uZWN0aXZpdHkvYWN0cy9mcmFtZXdvcmsgXAotCQktUCBibHVlYmVycnkgLUMgc3lzdGVtL2J0L2JsdWViZXJyeSAtRCBzeXN0ZW0vYnQvYmx1ZWJlcnJ5IFwKLQkJLVAgbGx2bV9iaW51dGlscyAtQyAkKExMVk1fUFJFQlVJTFRTX0JBU0UpL2xpbnV4LXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pIFwKLQkJLWYgJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9iaW4vbGx2bS1jb3YgXAotCQktZiAkKExMVk1fUFJFQlVJTFRTX0JBU0UpL2xpbnV4LXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pL2Jpbi9sbHZtLXByb2ZkYXRhIFwKLQkJLWYgJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9iaW4vbGx2bS1zeW1ib2xpemVyIFwKLQkJLWYgJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9saWI2NC9saWJjKysuc28uMQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlLCQoYmx1ZXRvb3RoX2NlcnRfdGVzdHNfcHlfcGFja2FnZV96aXApOmJsdWV0b290aF9jZXJ0X3Rlc3RzLnppcCkKZGlmZiAtLWdpdCBhL2dkL0FuZHJvaWRUZXN0VGVtcGxhdGUueG1sIGIvZ2QvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMWJlOTMuLjAwMDAwMDAKLS0tIGEvZ2QvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyB7TU9EVUxFfS4iPgotICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdCIgLz4KLSAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QtbmF0aXZlIiAvPgotICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJvb3RUYXJnZXRQcmVwYXJlciIgLz4KLSAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KLSAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IntNT0RVTEV9LT4vZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+Ci0gIDwvdGFyZ2V0X3ByZXBhcmVyPgotICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJydW4tY29tbWFuZCIgdmFsdWU9InNldHRpbmdzIHB1dCBnbG9iYWwgYmxlX3NjYW5fYWx3YXlzX2VuYWJsZWQgMCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ic3ZjIGJsdWV0b290aCBkaXNhYmxlIiAvPgotICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5Gb2xkZXJTYXZlciI+Ci0gICAgPG9wdGlvbiBuYW1lPSJkZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL3ZlbmRvci9zc3JkdW1wIiAvPgotICA8L3RhcmdldF9wcmVwYXJlcj4KLSAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0iIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJydW4tdGVzdC1hcyIgdmFsdWU9IjAiIC8+Ci0gIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2dkL0JVSUxELmduIGIvZ2QvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMmEzODAuLjAwMDAwMDAKLS0tIGEvZ2QvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCgiLy9idC9nZC9kdW1wc3lzL2J1bmRsZXIvYnVuZGxlci5nbmkiKQotaW1wb3J0KCIvL2J0L2dkL3BhY2tldC9wYXJzZXIvcGFja2V0Z2VuLmduaSIpCi1pbXBvcnQoIi8vY29tbW9uLW1rL2ZsYXRidWZmZXIuZ25pIikKLQotY29uZmlnKCJnZF9kZWZhdWx0cyIpIHsKLSAgY2ZsYWdzX2NjID0gWwotICAgICItREdPT0dMRV9QUk9UT0JVRl9OT19SVFRJIiwKLSAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICAiLVduby11bnVzZWQtcmVzdWx0IiwKLSAgICAiLVduby10YXV0b2xvZ2ljYWwtb3ZlcmxhcC1jb21wYXJlIiwKLSAgXQotCi0gIGRlZmluZXMgPSBbCi0gICAgIk9TX0xJTlVYX0dFTkVSSUMiLAotICAgICJPU19HRU5FUklDIiwKLSAgICAiVEFSR0VUX0ZMT1NTIiwKLSAgXQotCi0gIGxpYnMgPSBbCi0gICAgInNzbCIsCi0gICAgImNyeXB0byIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbICIvL2J0L2dkIiBdCi0gIGNvbmZpZ3MgPSBbICIvL2J0OnRhcmdldF9kZWZhdWx0cyIgXQotfQotCi1jb25maWcoInJ1c3RfZGVmYXVsdHMiKSB7Ci0gICMgRW1wdHkgZm9yIG5vdwotfQotCi1ncm91cCgiZ2RfZGVmYXVsdF9kZXBzIikgewotICBkZXBzID0gWwotICAgICIvL2J0L2dkOkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNEYXRhU2NoZW1hX2giLAotICAgICIvL2J0L2dkOkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgIi8vYnQvZ2QvZHVtcHN5czpsaWJibHVldG9vdGgtZHVtcHN5cyIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gIF0KLX0KLQotc3RhdGljX2xpYnJhcnkoImxpYmJsdWV0b290aF9nZCIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAibW9kdWxlLmNjIiwKLSAgICAic3RhY2tfbWFuYWdlci5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbICIuIiBdCi0gIGNvbmZpZ3MgKz0gWyAiOmdkX2RlZmF1bHRzIiBdCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC90b3BzaGltOmxpYmJsdWV0b290aF90b3BzaGltIiwKLSAgICAiLy9idC9nZC9ydXN0L3NoaW06bGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgIi8vYnQvZ2Q6Qmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICAiLy9idC9nZC9hdHQ6Qmx1ZXRvb3RoQXR0U291cmNlcyIsCi0gICAgIi8vYnQvZ2QvY29tbW9uOkJsdWV0b290aENvbW1vblNvdXJjZXMiLAotICAgICIvL2J0L2dkL2NyeXB0b190b29sYm94OkJsdWV0b290aENyeXB0b1Rvb2xib3hTb3VyY2VzIiwKLSAgICAiLy9idC9nZC9kdW1wc3lzOkJsdWV0b290aER1bXBzeXNTb3VyY2VzIiwKLSAgICAiLy9idC9nZC9idGFhOkJsdWV0b290aEJ0YWFTb3VyY2VzX2xpbnV4IiwKLSAgICAiLy9idC9nZC9oYWw6Qmx1ZXRvb3RoSGFsU291cmNlcyIsCi0gICAgIi8vYnQvZ2QvaGFsOkJsdWV0b290aEhhbFNvdXJjZXNfaGNpX2hvc3QiLAotICAgICIvL2J0L2dkL2wyY2FwOkJsdWV0b290aEwyY2FwU291cmNlcyIsCi0gICAgIi8vYnQvZ2QvbmVpZ2hib3I6Qmx1ZXRvb3RoTmVpZ2hib3JTb3VyY2VzIiwKLSAgICAiLy9idC9nZC9zZWN1cml0eTpCbHVldG9vdGhTZWN1cml0eVNvdXJjZXMiLAotICAgICIvL2J0L2dkL3NoaW06Qmx1ZXRvb3RoU2hpbVNvdXJjZXMiLAotICAgICIvL2J0L2dkL3N0b3JhZ2U6Qmx1ZXRvb3RoU3RvcmFnZVNvdXJjZXMiLAotICBdCi19Ci0KLWZsYXRidWZmZXIoIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNEYXRhU2NoZW1hX2giKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uZmJzIiwKLSAgICAiY29tbW9uL2luaXRfZmxhZ3MuZmJzIiwKLSAgICAiZHVtcHN5c19kYXRhLmZicyIsCi0gICAgImhjaS9oY2lfYWNsX21hbmFnZXIuZmJzIiwKLSAgICAibDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5mYnMiLAotICAgICJvcy93YWtlbG9ja19tYW5hZ2VyLmZicyIsCi0gICAgInNoaW0vZHVtcHN5cy5mYnMiLAotICBdCi19Ci0KLWJ0X2ZsYXRjX2JpbmFyeV9zY2hlbWEoIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNCaW5hcnlTY2hlbWFfYmZicyIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiYnRhYS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5mYnMiLAotICAgICJjb21tb24vaW5pdF9mbGFncy5mYnMiLAotICAgICJkdW1wc3lzX2RhdGEuZmJzIiwKLSAgICAiaGNpL2hjaV9hY2xfbWFuYWdlci5mYnMiLAotICAgICJsMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmZicyIsCi0gICAgIm9zL3dha2Vsb2NrX21hbmFnZXIuZmJzIiwKLSAgICAic2hpbS9kdW1wc3lzLmZicyIsCi0gIF0KLQotICBpbmNsdWRlX2RpciA9ICJidC9nZCIKLX0KLQotcGFja2V0Z2VuX3B5KCJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX3B5dGhvbjNfY2MiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImhjaS9oY2lfcGFja2V0cy5wZGwiLAotICAgICJsMmNhcC9sMmNhcF9wYWNrZXRzLnBkbCIsCi0gICAgInNlY3VyaXR5L3NtcF9wYWNrZXRzLnBkbCIsCi0gIF0KLQotICBpbmNsdWRlID0gImJ0L2dkIgotICBzb3VyY2Vfcm9vdCA9ICIuLi8uLiIKLSAgc2hhcmRzID0gMTAKLX0KLQotcGFja2V0Z2VuX2hlYWRlcnMoIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiaGNpL2hjaV9wYWNrZXRzLnBkbCIsCi0gICAgImwyY2FwL2wyY2FwX3BhY2tldHMucGRsIiwKLSAgICAic2VjdXJpdHkvc21wX3BhY2tldHMucGRsIiwKLSAgXQotCi0gIGluY2x1ZGUgPSAiYnQvZ2QiCi0gIHNvdXJjZV9yb290ID0gIi4uLy4uIgotfQotCi1wYWNrZXRnZW5fcnVzdCgiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19ydXN0IikgewotICBzb3VyY2VzID0gWyAiaGNpL2hjaV9wYWNrZXRzLnBkbCIgXQotCi0gIGluY2x1ZGUgPSAiYnQvZ2QiCi0gIHNvdXJjZV9yb290ID0gIi4uLy4uIgotfQpkaWZmIC0tZ2l0IGEvZ2QvUkVBRE1FLm1kIGIvZ2QvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGEwMjExLi4wMDAwMDAwCi0tLSBhL2dkL1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyBXaHkgaXMgZ2FiZWxkb3JzY2hlIHBsdXJhbD8KLQotUGxlYXNlIHNlZSB0aGlzIFtpbmZvcm1hdGl2ZSB2aWRlbyB3ZSd2ZSBwcmVwYXJlZF0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj12TFJ5SjBkYXdqTSkuCi0KLSMjIyBBcmNoaXRlY3R1cmUKLQotR3VpZGVsaW5lcyBmb3IgZGV2ZWxvcGluZyB0aGUgR2FiZWxkb3JzY2hlIChHRCkgc3RhY2sKLQotKiAgIFtBcmNoaXRlY3R1cmVdKC4vZG9jcy9hcmNoaXRlY3R1cmUvYXJjaGl0ZWN0dXJlLm1kKQotKiAgIFtTdHlsZSBHdWlkZV0oLi9kb2NzL2FyY2hpdGVjdHVyZS9zdHlsZV9ndWlkZS5tZCkKLQotIyMjIFRlc3RpbmcKLQotR2FiZWxkb3JzY2hlIChHRCkgd2FzIGJ1aWx0IHdpdGggdGVzdCBkcml2ZW4gZGV2ZWxvcG1lbnQgaW4gbWluZC4gVGhyZWUgdHlwZXMgb2YKLXRlc3RzIGFyZSB1c2VkIGluIGVuc3VyaW5nIEdhYmVsZG9yc2NoZSBzdGFjaydzIHN0YWJpbGl0eSwgY29ycmVjdG5lc3MgYW5kIGZyZWUKLWZyb20gcmVncmVzc2lvbi4KLQotSWYgeW91IGFyZSB2ZXJpZnlpbmcgc29tZXRoaW5nIGlzIGdsdWVkIG9yIGhvb2tlZCB1cCBjb3JyZWN0bHkgaW5zaWRlIHRoZSBzdGFjaywKLXVzZSBhIHVuaXQgdGVzdC4KLQotKiAgIFtHVGVzdCBVbml0IFRlc3RdKC4vZG9jcy90ZXN0aW5nL2d0ZXN0Lm1kKQotCi1JZiB5b3UgYXJlIHZlcmlmeWluZyBjb3JyZWN0IGJlaGF2aW9yIChlc3BlY2lhbGx5IGludGVyb3AgcHJvYmxlbXMpICoqRE8gTk9UKioKLXdyaXRlIGEgdW5pdCB0ZXN0IGFzIHRoaXMgbm90IGEgZ29vZCB1c2Ugb2YgeW91ciB0aW1lLiBXcml0ZSBhIFtjZXJ0IHRlc3RdKC4vY2VydF90ZXN0Lm1kKSBpbnN0ZWFkCi1zbyBpdCBhcHBsaWVzIHRvIGFueSBzdGFjay4KLQotKiAgIFtHRCBDZXJ0aWZpY2F0aW9uIFRlc3RzXSguL2RvY3MvdGVzdGluZy9jZXJ0X3Rlc3QubWQpCmRpZmYgLS1naXQgYS9nZC9hdHQvQW5kcm9pZC5icCBiL2dkL2F0dC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTExZGY2Li4wMDAwMDAwCi0tLSBhL2dkL2F0dC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoQXR0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiYXR0X21vZHVsZS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoQXR0VGVzdFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvYXR0L0JVSUxELmduIGIvZ2QvYXR0L0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDE2OTM3Li4wMDAwMDAwCi0tLSBhL2dkL2F0dC9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zb3VyY2Vfc2V0KCJCbHVldG9vdGhBdHRTb3VyY2VzIikgewotICBzb3VyY2VzID0gWyAiYXR0X21vZHVsZS5jYyIgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotICBkZXBzID0gWyAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiIF0KLX0KZGlmZiAtLWdpdCBhL2dkL2F0dC9hdHRfbW9kdWxlLmNjIGIvZ2QvYXR0L2F0dF9tb2R1bGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODQ2ZmIuLjAwMDAwMDAKLS0tIGEvZ2QvYXR0L2F0dF9tb2R1bGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImF0dCIKLQotI2luY2x1ZGUgImF0dC9hdHRfbW9kdWxlLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvbDJjYXBfbGVfbW9kdWxlLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdHQgewotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEF0dE1vZHVsZTo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgQXR0TW9kdWxlKCk7IH0pOwotCi1uYW1lc3BhY2Ugewotdm9pZCBPbkF0dFJlZ2lzdHJhdGlvbkNvbXBsZXRlTGUoCi0gICAgbDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQgcmVzdWx0LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6bGU6OkZpeGVkQ2hhbm5lbFNlcnZpY2U+IGxlX3NtcF9zZXJ2aWNlKSB7Ci0gIExPR19JTkZPKCJBVFQgY2hhbm5lbCByZWdpc3RyYXRpb24gY29tcGxldGUiKTsKLX0KLQotdm9pZCBPbkF0dENvbm5lY3Rpb25PcGVuTGUoc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpsZTo6Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gIExPR19JTkZPKCJBVFQgY29ubmVjaXRvbiBvcGVuZWQiKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdHJ1Y3QgQXR0TW9kdWxlOjppbXBsIHsKLSAgaW1wbCgKLSAgICAgIG9zOjpIYW5kbGVyKiBhdHRfaGFuZGxlciwKLSAgICAgIGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZSogbDJjYXBfbGVfbW9kdWxlLAotICAgICAgbDJjYXA6OmNsYXNzaWM6OkwyY2FwQ2xhc3NpY01vZHVsZSogbDJjYXBfY2xhc3NpY19tb2R1bGUpCi0gICAgICA6IGF0dF9oYW5kbGVyXyhhdHRfaGFuZGxlciksIGwyY2FwX2xlX21vZHVsZV8obDJjYXBfbGVfbW9kdWxlKSwgbDJjYXBfY2xhc3NpY19tb2R1bGVfKGwyY2FwX2NsYXNzaWNfbW9kdWxlKSB7Ci0gICAgLy8gVE9ETzogbW92ZSB0aGF0IGludG8gYSBBVFQgbWFuYWdlciwgb3Igb3RoZXIgcHJvcGVyIHBsYWNlCi0gICAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6bDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyPiBsMmNhcF9tYW5hZ2VyX2xlXygKLSAgICAgICAgbDJjYXBfbGVfbW9kdWxlXy0+R2V0Rml4ZWRDaGFubmVsTWFuYWdlcigpKTsKLSAgICAvLyBUT0RPKGIvMTYxMjU2NDk3KTogQ0lEIDQgaXMgdGFrZW4gYnkgc2hpbSBsYXllciBBVFQgbW9kdWxlIHNvIGZhci4gV2hlbiB3ZSBtaWdyYXRlIHRvIEdEIEFUVCBtb2R1bGUsIHdlIHVzZSByZWFsCi0gICAgLy8gQ0lEIGhlcmUuCi0gICAgY29uc3RleHByIHVpbnQxNl90IGtGYWtlTGVBdHRyaWJ1dGVDaWQgPSA1MDsKLSAgICBsMmNhcF9tYW5hZ2VyX2xlXy0+UmVnaXN0ZXJTZXJ2aWNlKAotICAgICAgICBrRmFrZUxlQXR0cmlidXRlQ2lkLAotICAgICAgICBjb21tb246OkJpbmRPbmNlKCZPbkF0dFJlZ2lzdHJhdGlvbkNvbXBsZXRlTGUpLAotICAgICAgICBjb21tb246OkJpbmQoJk9uQXR0Q29ubmVjdGlvbk9wZW5MZSksCi0gICAgICAgIGF0dF9oYW5kbGVyXyk7Ci0gIH0KLQotICBvczo6SGFuZGxlciogYXR0X2hhbmRsZXJfOwotICBsMmNhcDo6bGU6OkwyY2FwTGVNb2R1bGUqIGwyY2FwX2xlX21vZHVsZV87Ci0gIGwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGUqIGwyY2FwX2NsYXNzaWNfbW9kdWxlXzsKLX07Ci0KLXZvaWQgQXR0TW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgbGlzdC0+YWRkPGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPGwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGU+KCk7Ci19Ci0KLXZvaWQgQXR0TW9kdWxlOjpTdGFydCgpIHsKLSAgcGltcGxfID0gc3RkOjptYWtlX3VuaXF1ZTxpbXBsPigKLSAgICAgIEdldEhhbmRsZXIoKSwgR2V0RGVwZW5kZW5jeTxsMmNhcDo6bGU6OkwyY2FwTGVNb2R1bGU+KCksIEdldERlcGVuZGVuY3k8bDJjYXA6OmNsYXNzaWM6OkwyY2FwQ2xhc3NpY01vZHVsZT4oKSk7Ci19Ci0KLXZvaWQgQXR0TW9kdWxlOjpTdG9wKCkgewotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotc3RkOjpzdHJpbmcgQXR0TW9kdWxlOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICJBdHQgTW9kdWxlIjsKLX0KLQotLy8gc3RkOjp1bmlxdWVfcHRyPEF0dE1hbmFnZXI+IEF0dE1vZHVsZTo6R2V0QXR0TWFuYWdlcigpIHsKLS8vICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBdHRNYW5hZ2VyPigKLS8vICAgICAgIG5ldyBBdHRNYW5hZ2VyKHBpbXBsXy0+YXR0X2hhbmRsZXJfLCAmcGltcGxfLT5hdHRfbWFuYWdlcl9pbXBsKSk7Ci0vLyB9Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdHQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2F0dC9hdHRfbW9kdWxlLmggYi9nZC9hdHQvYXR0X21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQ5OTNjLi4wMDAwMDAwCi0tLSBhL2dkL2F0dC9hdHRfbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJtb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXR0IHsKLQotY2xhc3MgQXR0TW9kdWxlIDogcHVibGljIGJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIEF0dE1vZHVsZSgpID0gZGVmYXVsdDsKLSAgfkF0dE1vZHVsZSgpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF0dE1vZHVsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXR0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9iZW5jaG1hcmsuY2MgYi9nZC9iZW5jaG1hcmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTFjODkuLjAwMDAwMDAKLS0tIGEvZ2QvYmVuY2htYXJrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIDo6YmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKLSAgaWYgKDo6YmVuY2htYXJrOjpSZXBvcnRVbnJlY29nbml6ZWRBcmd1bWVudHMoYXJnYywgYXJndikpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICA6OmJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOwotfQpkaWZmIC0tZ2l0IGEvZ2QvYnRhYS9BbmRyb2lkLmJwIGIvZ2QvYnRhYS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWVhN2VlLi4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEJ0YWFTb3VyY2VzX2FuZHJvaWQiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFuZHJvaWQvYWN0aXZpdHlfYXR0cmlidXRpb24uY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEJ0YWFTb3VyY2VzX2hvc3QiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImhvc3QvYWN0aXZpdHlfYXR0cmlidXRpb24uY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEJ0YWFTb3VyY2VzX2xpbnV4X2dlbmVyaWMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvYXR0cmlidXRpb25fcHJvY2Vzc29yLmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvY21kX2V2dF9jbGFzc2lmaWNhdGlvbi5jYyIsCi0gICAgICAgICJsaW51eF9nZW5lcmljL2hjaV9wcm9jZXNzb3IuY2MiLAotICAgICAgICAibGludXhfZ2VuZXJpYy93YWtlbG9ja19wcm9jZXNzb3IuY2MiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9nZC9idGFhL0JVSUxELmduIGIvZ2QvYnRhYS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyYTRlMy4uMDAwMDAwMAotLS0gYS9nZC9idGFhL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXNvdXJjZV9zZXQoIkJsdWV0b290aEJ0YWFTb3VyY2VzX2xpbnV4IikgewotICBzb3VyY2VzID0gWyAibGludXgvYWN0aXZpdHlfYXR0cmlidXRpb24uY2MiIF0KLQotICBjb25maWdzICs9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdHMiIF0KLSAgZGVwcyA9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdF9kZXBzIiBdCi19CmRpZmYgLS1naXQgYS9nZC9idGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmZicyBiL2dkL2J0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYxOGNkLi4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uZmJzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotbmFtZXNwYWNlIGJsdWV0b290aC5hY3Rpdml0eV9hdHRyaWJ1dGlvbjsKLQotYXR0cmlidXRlICJwcml2YWN5IjsKLQotdGFibGUgV2FrZXVwRW50cnkgewotICAgIHdha2V1cF90aW1lOnN0cmluZzsKLSAgICBhY3Rpdml0eTpzdHJpbmc7Ci0gICAgYWRkcmVzczpzdHJpbmc7Ci19Ci0KLXRhYmxlIERldmljZUFjdGl2aXR5QWdncmVnYXRpb25FbnRyeSB7Ci0gICAgYWRkcmVzczpzdHJpbmc7Ci0gICAgYWN0aXZpdHk6c3RyaW5nOwotICAgIHdha2V1cF9jb3VudDppbnQ7Ci0gICAgYnl0ZV9jb3VudDppbnQ7Ci0gICAgd2FrZWxvY2tfZHVyYXRpb25fbXM6aW50OwotICAgIGNyZWF0aW9uX3RpbWU6c3RyaW5nOwotfQotCi10YWJsZSBBY3Rpdml0eUF0dHJpYnV0aW9uRGF0YSB7Ci0gICAgdGl0bGVfd2FrZXVwOnN0cmluZzsKLSAgICBudW1fd2FrZXVwOmludDsKLSAgICB3YWtldXBfYXR0cmlidXRpb246W1dha2V1cEVudHJ5XTsKLSAgICB0aXRsZV9hY3Rpdml0eTpzdHJpbmc7Ci0gICAgbnVtX2RldmljZV9hY3Rpdml0eTppbnQ7Ci0gICAgZGV2aWNlX2FjdGl2aXR5X2FnZ3JlZ2F0aW9uOltEZXZpY2VBY3Rpdml0eUFnZ3JlZ2F0aW9uRW50cnldOwotfQotCi1yb290X3R5cGUgQWN0aXZpdHlBdHRyaWJ1dGlvbkRhdGE7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvYnRhYS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIGIvZ2QvYnRhYS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFmMzY1Li4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGFsL3Nub29wX2xvZ2dlci5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uIHsKLQotZW51bSBjbGFzcyBBY3Rpdml0eSA6IHVpbnQ4X3QgeyBVTktOT1dOID0gMCwgQUNMLCBBRFZFUlRJU0UsIENPTk5FQ1QsIENPTlRST0wsIEhGUCwgSVNPLCBTQ0FOLCBWRU5ET1IgfTsKLQotdXNpbmcgQ3JlYXRpb25UaW1lID0gc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz47Ci0KLXN0cnVjdCBCdGFhQWdncmVnYXRpb25FbnRyeSB7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzOwotICBBY3Rpdml0eSBhY3Rpdml0eTsKLSAgdWludDE2X3Qgd2FrZXVwX2NvdW50OwotICB1aW50MzJfdCBieXRlX2NvdW50OwotICB1aW50MzJfdCB3YWtlbG9ja19kdXJhdGlvbl9tczsKLSAgQ3JlYXRpb25UaW1lIGNyZWF0aW9uX3RpbWU7Ci19OwotCi1jbGFzcyBBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+QWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKCkgPSBkZWZhdWx0OwotCi0gIC8vIENhbGxiYWNrIHdoZW4gQmx1ZXRvb3RoIHdva2UgdXAgdGhlIHN5c3RlbQotICB2aXJ0dWFsIHZvaWQgT25XYWtldXAoY29uc3QgQWN0aXZpdHkgYWN0aXZpdHksIGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8vIENhbGxiYWNrIHdoZW4gQmx1ZXRvb3RoIGFjdGl2aXR5IGxvZ3MgYXJlIHJlYWR5IHRvIGJlIG1vdmVkCi0gIHZpcnR1YWwgdm9pZCBPbkFjdGl2aXR5TG9nc1JlYWR5KGNvbnN0IHN0ZDo6dmVjdG9yPEJ0YWFBZ2dyZWdhdGlvbkVudHJ5PiBsb2dzKSA9IDA7Ci19OwotCi1jbGFzcyBBY3Rpdml0eUF0dHJpYnV0aW9uIDogcHVibGljIGJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIEFjdGl2aXR5QXR0cmlidXRpb24oKSA9IGRlZmF1bHQ7Ci0gIH5BY3Rpdml0eUF0dHJpYnV0aW9uKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgQ2FwdHVyZShjb25zdCBoYWw6OkhjaVBhY2tldCYgcGFja2V0LCBoYWw6OlNub29wTG9nZ2VyOjpQYWNrZXRUeXBlIHR5cGUpOwotICB2b2lkIE9uV2FrZWxvY2tBY3F1aXJlZCgpOwotICB2b2lkIE9uV2FrZWxvY2tSZWxlYXNlZCgpOwotICB2b2lkIE9uV2FrZXVwKCk7Ci0gIHZvaWQgUmVnaXN0ZXJBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2soQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKiBjYWxsYmFjayk7Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotICBEdW1wc3lzRGF0YUZpbmlzaGVyIEdldER1bXBzeXNEYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogYnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAvLyBNb2R1bGUKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBpbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW1wbD4gcGltcGxfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBY3Rpdml0eUF0dHJpYnV0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvYnRhYS9hbmRyb2lkL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjIGIvZ2QvYnRhYS9hbmRyb2lkL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWMwZGYxLi4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvYW5kcm9pZC9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0YWEiCi0KLSNpbmNsdWRlICJidGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0jaW5jbHVkZSAiYWN0aXZpdHlfYXR0cmlidXRpb25fZ2VuZXJhdGVkLmgiCi0KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvc3lzdGVtL3N1c3BlbmQvQm5TdXNwZW5kQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvc3lzdGVtL3N1c3BlbmQvQm5XYWtlbG9ja0NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL3N5c3RlbS9zdXNwZW5kL0lTdXNwZW5kQ29udHJvbFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlICJidGFhL2F0dHJpYnV0aW9uX3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgImJ0YWEvaGNpX3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgImJ0YWEvd2FrZWxvY2tfcHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLXVzaW5nIGFpZGw6OmFuZHJvaWQ6OnN5c3RlbTo6c3VzcGVuZDo6Qm5TdXNwZW5kQ2FsbGJhY2s7Ci11c2luZyBhaWRsOjphbmRyb2lkOjpzeXN0ZW06OnN1c3BlbmQ6OkJuV2FrZWxvY2tDYWxsYmFjazsKLXVzaW5nIGFpZGw6OmFuZHJvaWQ6OnN5c3RlbTo6c3VzcGVuZDo6SVN1c3BlbmRDYWxsYmFjazsKLXVzaW5nIGFpZGw6OmFuZHJvaWQ6OnN5c3RlbTo6c3VzcGVuZDo6SVN1c3BlbmRDb250cm9sU2VydmljZTsKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgbmFtZXNwYWNlIG5kazsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24gewotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEFjdGl2aXR5QXR0cmlidXRpb246OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEFjdGl2aXR5QXR0cmlidXRpb24oKTsgfSk7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQnRXYWtlbG9ja05hbWUoImhhbF9ibHVldG9vdGhfbG9jayIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtCdFdha2V1cFJlYXNvbigiaHNfdWFydF93YWtldXAiKTsKLXN0YXRpYyBjb25zdCBzaXplX3Qga0hjaUFjbEhlYWRlclNpemUgPSA0OwotCi1zdGF0aWMgc3RkOjptdXRleCBnX21vZHVsZV9tdXRleDsKLXN0YXRpYyBBY3Rpdml0eUF0dHJpYnV0aW9uKiBnX21vZHVsZSA9IG51bGxwdHI7Ci1zdGF0aWMgYm9vbCBpc193YWtldXBfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IGZhbHNlOwotc3RhdGljIGJvb2wgaXNfd2FrZWxvY2tfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IGZhbHNlOwotCi1zdHJ1Y3Qgd2FrZWxvY2tfY2FsbGJhY2sgOiBwdWJsaWMgQm5XYWtlbG9ja0NhbGxiYWNrIHsKLSAgd2FrZWxvY2tfY2FsbGJhY2soKSB7fQotCi0gIFN0YXR1cyBub3RpZnlBY3F1aXJlZCgpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQoZ19tb2R1bGVfbXV0ZXgpOwotICAgIGlmIChnX21vZHVsZSAhPSBudWxscHRyKSB7Ci0gICAgICBnX21vZHVsZS0+T25XYWtlbG9ja0FjcXVpcmVkKCk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLSAgU3RhdHVzIG5vdGlmeVJlbGVhc2VkKCkgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChnX21vZHVsZV9tdXRleCk7Ci0gICAgaWYgKGdfbW9kdWxlICE9IG51bGxwdHIpIHsKLSAgICAgIGdfbW9kdWxlLT5Pbldha2Vsb2NrUmVsZWFzZWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotfTsKLQotc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjx3YWtlbG9ja19jYWxsYmFjaz4gZ193YWtlbG9ja19jYWxsYmFjayA9IG51bGxwdHI7Ci0KLXN0cnVjdCB3YWtldXBfY2FsbGJhY2sgOiBwdWJsaWMgQm5TdXNwZW5kQ2FsbGJhY2sgewotICB3YWtldXBfY2FsbGJhY2soKSB7fQotCi0gIFN0YXR1cyBub3RpZnlXYWtldXAoYm9vbCBzdWNjZXNzLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHdha2V1cF9yZWFzb25zKSBvdmVycmlkZSB7Ci0gICAgZm9yIChhdXRvJiB3YWtldXBfcmVhc29uIDogd2FrZXVwX3JlYXNvbnMpIHsKLSAgICAgIGlmICh3YWtldXBfcmVhc29uLmZpbmQoa0J0V2FrZXVwUmVhc29uKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQoZ19tb2R1bGVfbXV0ZXgpOwotICAgICAgICBpZiAoZ19tb2R1bGUgIT0gbnVsbHB0cikgewotICAgICAgICAgIGdfbW9kdWxlLT5Pbldha2V1cCgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci19OwotCi1zdGF0aWMgc3RkOjpzaGFyZWRfcHRyPHdha2V1cF9jYWxsYmFjaz4gZ193YWtldXBfY2FsbGJhY2sgPSBudWxscHRyOwotCi1zdHJ1Y3QgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6aW1wbCB7Ci0gIGltcGwoQWN0aXZpdHlBdHRyaWJ1dGlvbiogbW9kdWxlKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKGdfbW9kdWxlX211dGV4KTsKLSAgICBnX21vZHVsZSA9IG1vZHVsZTsKLSAgICBpZiAoaXNfd2FrZXVwX2NhbGxiYWNrX3JlZ2lzdGVyZWQgJiYgaXNfd2FrZWxvY2tfY2FsbGJhY2tfcmVnaXN0ZXJlZCkgewotICAgICAgTE9HX0VSUk9SKCJXYWtldXAgYW5kIHdha2Vsb2NrIGNhbGxiYWNrcyBhcmUgYWxyZWFkeSByZWdpc3RlcmVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3RhdHVzIHJlZ2lzdGVyX2NhbGxiYWNrX3N0YXR1czsKLSAgICBib29sIGlzX3JlZ2lzdGVyX3N1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICBhdXRvIGNvbnRyb2xfc2VydmljZSA9Ci0gICAgICAgIElTdXNwZW5kQ29udHJvbFNlcnZpY2U6OmZyb21CaW5kZXIoU3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgic3VzcGVuZF9jb250cm9sIikpKTsKLSAgICBpZiAoIWNvbnRyb2xfc2VydmljZSkgewotICAgICAgTE9HX0VSUk9SKCJGYWlsIHRvIG9idGFpbiBzdXNwZW5kX2NvbnRyb2wiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWlzX3dha2V1cF9jYWxsYmFja19yZWdpc3RlcmVkKSB7Ci0gICAgICBnX3dha2V1cF9jYWxsYmFjayA9IFNoYXJlZFJlZkJhc2U6Om1ha2U8d2FrZXVwX2NhbGxiYWNrPigpOwotICAgICAgcmVnaXN0ZXJfY2FsbGJhY2tfc3RhdHVzID0gY29udHJvbF9zZXJ2aWNlLT5yZWdpc3RlckNhbGxiYWNrKGdfd2FrZXVwX2NhbGxiYWNrLCAmaXNfcmVnaXN0ZXJfc3VjY2Vzc2Z1bCk7Ci0gICAgICBpZiAoIWlzX3JlZ2lzdGVyX3N1Y2Nlc3NmdWwgfHwgIXJlZ2lzdGVyX2NhbGxiYWNrX3N0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsIHRvIHJlZ2lzdGVyIHdha2V1cCBjYWxsYmFjayIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpc193YWtldXBfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc193YWtlbG9ja19jYWxsYmFja19yZWdpc3RlcmVkKSB7Ci0gICAgICBnX3dha2Vsb2NrX2NhbGxiYWNrID0gU2hhcmVkUmVmQmFzZTo6bWFrZTx3YWtlbG9ja19jYWxsYmFjaz4oKTsKLSAgICAgIHJlZ2lzdGVyX2NhbGxiYWNrX3N0YXR1cyA9Ci0gICAgICAgICAgY29udHJvbF9zZXJ2aWNlLT5yZWdpc3Rlcldha2Vsb2NrQ2FsbGJhY2soZ193YWtlbG9ja19jYWxsYmFjaywga0J0V2FrZWxvY2tOYW1lLCAmaXNfcmVnaXN0ZXJfc3VjY2Vzc2Z1bCk7Ci0gICAgICBpZiAoIWlzX3JlZ2lzdGVyX3N1Y2Nlc3NmdWwgfHwgIXJlZ2lzdGVyX2NhbGxiYWNrX3N0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsIHRvIHJlZ2lzdGVyIHdha2Vsb2NrIGNhbGxiYWNrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlzX3dha2Vsb2NrX2NhbGxiYWNrX3JlZ2lzdGVyZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIH5pbXBsKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChnX21vZHVsZV9tdXRleCk7Ci0gICAgZ19tb2R1bGUgPSBudWxscHRyOwotICB9Ci0KLSAgdm9pZCBvbl9oY2lfcGFja2V0KGhhbDo6SGNpUGFja2V0IHBhY2tldCwgaGFsOjpTbm9vcExvZ2dlcjo6UGFja2V0VHlwZSB0eXBlLCB1aW50MTZfdCBsZW5ndGgpIHsKLSAgICBhdHRyaWJ1dGlvbl9wcm9jZXNzb3JfLk9uQnRhYVBhY2tldHMoc3RkOjptb3ZlKGhjaV9wcm9jZXNzb3JfLk9uSGNpUGFja2V0KHN0ZDo6bW92ZShwYWNrZXQpLCB0eXBlLCBsZW5ndGgpKSk7Ci0gIH0KLQotICB2b2lkIG9uX3dha2Vsb2NrX2FjcXVpcmVkKCkgewotICAgIHdha2Vsb2NrX3Byb2Nlc3Nvcl8uT25XYWtlbG9ja0FjcXVpcmVkKCk7Ci0gIH0KLQotICB2b2lkIG9uX3dha2Vsb2NrX3JlbGVhc2VkKCkgewotICAgIHVpbnQzMl90IHdha2Vsb2NrX2R1cmF0aW9uX21zID0gMDsKLQotICAgIHdha2Vsb2NrX2R1cmF0aW9uX21zID0gd2FrZWxvY2tfcHJvY2Vzc29yXy5Pbldha2Vsb2NrUmVsZWFzZWQoKTsKLSAgICBpZiAod2FrZWxvY2tfZHVyYXRpb25fbXMgIT0gMCkgewotICAgICAgYXR0cmlidXRpb25fcHJvY2Vzc29yXy5Pbldha2Vsb2NrUmVsZWFzZWQod2FrZWxvY2tfZHVyYXRpb25fbXMpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fd2FrZXVwKCkgewotICAgIGF0dHJpYnV0aW9uX3Byb2Nlc3Nvcl8uT25XYWtldXAoKTsKLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfY2FsbGJhY2soQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKiBjYWxsYmFjaykgewotICAgIGNhbGxiYWNrXyA9IGNhbGxiYWNrOwotICB9Ci0KLSAgdm9pZCBEdW1wKAotICAgICAgc3RkOjpwcm9taXNlPGZsYXRidWZmZXJzOjpPZmZzZXQ8QWN0aXZpdHlBdHRyaWJ1dGlvbkRhdGE+PiBwcm9taXNlLCBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGZiX2J1aWxkZXIpIHsKLSAgICBhdHRyaWJ1dGlvbl9wcm9jZXNzb3JfLkR1bXAoc3RkOjptb3ZlKHByb21pc2UpLCBmYl9idWlsZGVyKTsKLSAgfQotCi0gIEFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFjayogY2FsbGJhY2tfOwotICBBdHRyaWJ1dGlvblByb2Nlc3NvciBhdHRyaWJ1dGlvbl9wcm9jZXNzb3JfOwotICBIY2lQcm9jZXNzb3IgaGNpX3Byb2Nlc3Nvcl87Ci0gIFdha2Vsb2NrUHJvY2Vzc29yIHdha2Vsb2NrX3Byb2Nlc3Nvcl87Ci19OwotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246OkNhcHR1cmUoY29uc3QgaGFsOjpIY2lQYWNrZXQmIHBhY2tldCwgaGFsOjpTbm9vcExvZ2dlcjo6UGFja2V0VHlwZSB0eXBlKSB7Ci0gIHVpbnQxNl90IG9yaWdpbmFsX2xlbmd0aCA9IHBhY2tldC5zaXplKCk7Ci0gIHVpbnQxNl90IHRydW5jYXRlX2xlbmd0aDsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkNNRDoKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkVWVDoKLSAgICAgIHRydW5jYXRlX2xlbmd0aCA9IHBhY2tldC5zaXplKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkFDTDoKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OlNDTzoKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OklTTzoKLSAgICAgIHRydW5jYXRlX2xlbmd0aCA9IGtIY2lBY2xIZWFkZXJTaXplOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoIXRydW5jYXRlX2xlbmd0aCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGhhbDo6SGNpUGFja2V0IHRydW5jYXRlX3BhY2tldChwYWNrZXQuYmVnaW4oKSwgcGFja2V0LmJlZ2luKCkgKyB0cnVuY2F0ZV9sZW5ndGgpOwotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6b25faGNpX3BhY2tldCwgdHJ1bmNhdGVfcGFja2V0LCB0eXBlLCBvcmlnaW5hbF9sZW5ndGgpOwotfQotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246Ok9uV2FrZWxvY2tBY3F1aXJlZCgpIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6Om9uX3dha2Vsb2NrX2FjcXVpcmVkKTsKLX0KLQotdm9pZCBBY3Rpdml0eUF0dHJpYnV0aW9uOjpPbldha2Vsb2NrUmVsZWFzZWQoKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpvbl93YWtlbG9ja19yZWxlYXNlZCk7Ci19Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6T25XYWtldXAoKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpvbl93YWtldXApOwotfQotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246OlJlZ2lzdGVyQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKEFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFjayogY2FsbGJhY2spIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6OnJlZ2lzdGVyX2NhbGxiYWNrLCBjYWxsYmFjayk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEFjdGl2aXR5QXR0cmlidXRpb246OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIkJ0YWEgTW9kdWxlIjsKLX0KLQotdm9pZCBBY3Rpdml0eUF0dHJpYnV0aW9uOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHt9Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6U3RhcnQoKSB7Ci0gIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4odGhpcyk7Ci19Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6U3RvcCgpIHsKLSAgcGltcGxfLnJlc2V0KCk7Ci19Ci0KLUR1bXBzeXNEYXRhRmluaXNoZXIgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6R2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSBjb25zdCB7Ci0gIEFTU0VSVChmYl9idWlsZGVyICE9IG51bGxwdHIpOwotCi0gIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEFjdGl2aXR5QXR0cmlidXRpb25EYXRhPj4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgcGltcGxfLT5EdW1wKHN0ZDo6bW92ZShwcm9taXNlKSwgZmJfYnVpbGRlcik7Ci0KLSAgYXV0byBkdW1wc3lzX2RhdGEgPSBmdXR1cmUuZ2V0KCk7Ci0KLSAgcmV0dXJuIFtkdW1wc3lzX2RhdGFdKER1bXBzeXNEYXRhQnVpbGRlciogZHVtcHN5c19idWlsZGVyKSB7Ci0gICAgZHVtcHN5c19idWlsZGVyLT5hZGRfYWN0aXZpdHlfYXR0cmlidXRpb25fZHVtcHN5c19kYXRhKGR1bXBzeXNfZGF0YSk7Ci0gIH07Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvYnRhYS9hdHRyaWJ1dGlvbl9wcm9jZXNzb3IuaCBiL2dkL2J0YWEvYXR0cmlidXRpb25fcHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmJjOWMuLjAwMDAwMDAKLS0tIGEvZ2QvYnRhYS9hdHRyaWJ1dGlvbl9wcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiaGNpX3Byb2Nlc3Nvci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbiB7Ci0KLXN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtXYWtldXBBZ2dyZWdhdG9yU2l6ZSA9IDIwMDsKLQotc3RydWN0IEFkZHJlc3NBY3Rpdml0eUtleSB7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzOwotICBBY3Rpdml0eSBhY3Rpdml0eTsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkcmVzc0FjdGl2aXR5S2V5JiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiAoYWRkcmVzcyA9PSBvdGhlci5hZGRyZXNzICYmIGFjdGl2aXR5ID09IG90aGVyLmFjdGl2aXR5KTsKLSAgfQotfTsKLQotc3RydWN0IEFkZHJlc3NBY3Rpdml0eUtleUhhc2hlciB7Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgQWRkcmVzc0FjdGl2aXR5S2V5JiBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gKAotICAgICAgICAoc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPigpKGtleS5hZGRyZXNzLlRvU3RyaW5nKCkpIF4KLSAgICAgICAgIChzdGQ6Omhhc2g8dW5zaWduZWQgY2hhcj4oKShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihrZXkuYWN0aXZpdHkpKSkpKTsKLSAgfQotfTsKLQotc3RydWN0IFdha2V1cERlc2NyaXB0b3IgewotICBBY3Rpdml0eSBhY3Rpdml0eV87Ci0gIGNvbnN0IGhjaTo6QWRkcmVzcyBhZGRyZXNzXzsKLSAgV2FrZXVwRGVzY3JpcHRvcihBY3Rpdml0eSBhY3Rpdml0eSwgY29uc3QgaGNpOjpBZGRyZXNzIGFkZHJlc3MpIDogYWN0aXZpdHlfKGFjdGl2aXR5KSwgYWRkcmVzc18oYWRkcmVzcykge30KLSAgdmlydHVhbCB+V2FrZXVwRGVzY3JpcHRvcigpIHt9Ci19OwotCi1jbGFzcyBBdHRyaWJ1dGlvblByb2Nlc3NvciB7Ci0gcHVibGljOgotICB2b2lkIE9uQnRhYVBhY2tldHMoc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4gYnRhYV9wYWNrZXRzKTsKLSAgdm9pZCBPbldha2Vsb2NrUmVsZWFzZWQodWludDMyX3QgZHVyYXRpb25fbXMpOwotICB2b2lkIE9uV2FrZXVwKCk7Ci0gIHZvaWQgRHVtcCgKLSAgICAgIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEFjdGl2aXR5QXR0cmlidXRpb25EYXRhPj4gcHJvbWlzZSwgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgd2FrZXVwXyA9IGZhbHNlOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8QWRkcmVzc0FjdGl2aXR5S2V5LCBCdGFhQWdncmVnYXRpb25FbnRyeSwgQWRkcmVzc0FjdGl2aXR5S2V5SGFzaGVyPiBidGFhX2FnZ3JlZ2F0b3JfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8QWRkcmVzc0FjdGl2aXR5S2V5LCBCdGFhQWdncmVnYXRpb25FbnRyeSwgQWRkcmVzc0FjdGl2aXR5S2V5SGFzaGVyPiB3YWtlbG9ja19kdXJhdGlvbl9hZ2dyZWdhdG9yXzsKLSAgY29tbW9uOjpUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyPFdha2V1cERlc2NyaXB0b3I+IHdha2V1cF9hZ2dyZWdhdG9yXyA9Ci0gICAgICBjb21tb246OlRpbWVzdGFtcGVkQ2lyY3VsYXJCdWZmZXI8V2FrZXVwRGVzY3JpcHRvcj4oa1dha2V1cEFnZ3JlZ2F0b3JTaXplKTsKLSAgY29uc3QgY2hhciogQWN0aXZpdHlUb1N0cmluZyhBY3Rpdml0eSBhY3Rpdml0eSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2J0YWEvY21kX2V2dF9jbGFzc2lmaWNhdGlvbi5oIGIvZ2QvYnRhYS9jbWRfZXZ0X2NsYXNzaWZpY2F0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWU2YzIuLjAwMDAwMDAKLS0tIGEvZ2QvYnRhYS9jbWRfZXZ0X2NsYXNzaWZpY2F0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24gewotCi1zdHJ1Y3QgQ21kRXZ0QWN0aXZpdHlDbGFzc2lmaWNhdGlvbiB7Ci0gIEFjdGl2aXR5IGFjdGl2aXR5OwotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZV9wb3M7Ci0gIHVpbnQxNl90IGFkZHJlc3NfcG9zOwotfTsKLQotQ21kRXZ0QWN0aXZpdHlDbGFzc2lmaWNhdGlvbiBsb29rdXBfY21kKGhjaTo6T3BDb2RlIG9wY29kZSk7Ci1DbWRFdnRBY3Rpdml0eUNsYXNzaWZpY2F0aW9uIGxvb2t1cF9ldmVudChoY2k6OkV2ZW50Q29kZSBldmVudF9jb2RlKTsKLUNtZEV2dEFjdGl2aXR5Q2xhc3NpZmljYXRpb24gbG9va3VwX2xlX2V2ZW50KGhjaTo6U3ViZXZlbnRDb2RlIHN1YmV2ZW50X2NvZGUpOwotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2J0YWEvaGNpX3Byb2Nlc3Nvci5oIGIvZ2QvYnRhYS9oY2lfcHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZmJjNjguLjAwMDAwMDAKLS0tIGEvZ2QvYnRhYS9oY2lfcHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJidGFhL2NtZF9ldnRfY2xhc3NpZmljYXRpb24uaCIKLSNpbmNsdWRlICJoYWwvc25vb3BfbG9nZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24gewotCi1zdHJ1Y3QgQnRhYUhjaVBhY2tldCB7Ci0gIEFjdGl2aXR5IGFjdGl2aXR5OwotICBoY2k6OkFkZHJlc3MgYWRkcmVzczsKLSAgdWludDE2X3QgYnl0ZV9jb3VudDsKLQotICBCdGFhSGNpUGFja2V0KCkge30KLSAgQnRhYUhjaVBhY2tldChBY3Rpdml0eSBhY3Rpdml0eSwgaGNpOjpBZGRyZXNzIGFkZHJlc3MsIHVpbnQxNl90IGJ5dGVfY291bnQpCi0gICAgICA6IGFjdGl2aXR5KGFjdGl2aXR5KSwgYWRkcmVzcyhhZGRyZXNzKSwgYnl0ZV9jb3VudChieXRlX2NvdW50KSB7fQotfTsKLQotY2xhc3MgRGV2aWNlUGFyc2VyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgbWF0Y2hfaGFuZGxlX3dpdGhfYWRkcmVzcyh1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSwgaGNpOjpBZGRyZXNzJiBhZGRyZXNzKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6bWFwPHVpbnQxNl90LCBoY2k6OkFkZHJlc3M+IGNvbm5lY3Rpb25fbG9va3VwX3RhYmxlXzsKLX07Ci0KLXN0cnVjdCBQZW5kaW5nQ29tbWFuZCB7Ci0gIGhjaTo6T3BDb2RlIG9wY29kZTsKLSAgQnRhYUhjaVBhY2tldCBidGFhX2hjaV9wYWNrZXQ7Ci19OwotCi1jbGFzcyBIY2lQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4gT25IY2lQYWNrZXQoaGFsOjpIY2lQYWNrZXQgcGFja2V0LCBoYWw6OlNub29wTG9nZ2VyOjpQYWNrZXRUeXBlIHR5cGUsIHVpbnQxNl90IGxlbmd0aCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIHByb2Nlc3NfbGVfZXZlbnQoc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4mIGJ0YWFfaGNpX3BhY2tldHMsIGludDE2X3QgYnl0ZV9jb3VudCwgaGNpOjpFdmVudFZpZXcmIGV2ZW50KTsKLSAgdm9pZCBwcm9jZXNzX3NwZWNpYWxfZXZlbnQoCi0gICAgICBzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiYgYnRhYV9oY2lfcGFja2V0cywKLSAgICAgIGhjaTo6RXZlbnRDb2RlIGV2ZW50X2NvZGUsCi0gICAgICB1aW50MTZfdCBieXRlX2NvdW50LAotICAgICAgaGNpOjpFdmVudFZpZXcmIGV2ZW50KTsKLSAgdm9pZCBwcm9jZXNzX2NvbW1hbmQoCi0gICAgICBzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiYgYnRhYV9oY2lfcGFja2V0cywKLSAgICAgIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+JiBwYWNrZXRfdmlldywKLSAgICAgIHVpbnQxNl90IGJ5dGVfY291bnQpOwotICB2b2lkIHByb2Nlc3NfZXZlbnQoCi0gICAgICBzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiYgYnRhYV9oY2lfcGFja2V0cywKLSAgICAgIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+JiBwYWNrZXRfdmlldywKLSAgICAgIHVpbnQxNl90IGJ5dGVfY291bnQpOwotICB2b2lkIHByb2Nlc3NfYWNsKAotICAgICAgc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4mIGJ0YWFfaGNpX3BhY2tldHMsCi0gICAgICBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPiYgcGFja2V0X3ZpZXcsCi0gICAgICB1aW50MTZfdCBieXRlX2NvdW50KTsKLSAgdm9pZCBwcm9jZXNzX3NjbygKLSAgICAgIHN0ZDo6dmVjdG9yPEJ0YWFIY2lQYWNrZXQ+JiBidGFhX2hjaV9wYWNrZXRzLAotICAgICAgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4mIHBhY2tldF92aWV3LAotICAgICAgdWludDE2X3QgYnl0ZV9jb3VudCk7Ci0gIHZvaWQgcHJvY2Vzc19pc28oCi0gICAgICBzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiYgYnRhYV9oY2lfcGFja2V0cywKLSAgICAgIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+JiBwYWNrZXRfdmlldywKLSAgICAgIHVpbnQxNl90IGJ5dGVfY291bnQpOwotCi0gIERldmljZVBhcnNlciBkZXZpY2VfcGFyc2VyXzsKLSAgUGVuZGluZ0NvbW1hbmQgcGVuZGluZ19jb21tYW5kXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvYnRhYS9ob3N0L2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjIGIvZ2QvYnRhYS9ob3N0L2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ1OGI5Li4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvaG9zdC9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJidGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0KLSNpbmNsdWRlICJtb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24gewotCi1zdHJ1Y3QgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6aW1wbCB7fTsKLQotdm9pZCBBY3Rpdml0eUF0dHJpYnV0aW9uOjpPbldha2Vsb2NrQWNxdWlyZWQoKSB7fQotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246Ok9uV2FrZWxvY2tSZWxlYXNlZCgpIHt9Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6T25XYWtldXAoKSB7fQotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246OlJlZ2lzdGVyQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKEFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFjayogY2FsbGJhY2spIHt9Ci0KLXN0ZDo6c3RyaW5nIEFjdGl2aXR5QXR0cmlidXRpb246OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIkJ0YWEgTW9kdWxlIjsKLX0KLQotdm9pZCBBY3Rpdml0eUF0dHJpYnV0aW9uOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHt9Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6U3RhcnQoKSB7fQotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246OlN0b3AoKSB7fQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEFjdGl2aXR5QXR0cmlidXRpb246OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEFjdGl2aXR5QXR0cmlidXRpb24oKTsgfSk7Ci0KLUR1bXBzeXNEYXRhRmluaXNoZXIgRW1wdHlEdW1wc3lzRGF0YUZpbmlzaGVyID0gW10oRHVtcHN5c0RhdGFCdWlsZGVyKiBkdW1wc3lzX2RhdGFfYnVpbGRlcikge307Ci1EdW1wc3lzRGF0YUZpbmlzaGVyIEFjdGl2aXR5QXR0cmlidXRpb246OkdldER1bXBzeXNEYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogYnVpbGRlcikgY29uc3QgewotICByZXR1cm4gRW1wdHlEdW1wc3lzRGF0YUZpbmlzaGVyOwotfQotfSAgLy8gbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9idGFhL2xpbnV4L2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjIGIvZ2QvYnRhYS9saW51eC9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxYWQ1ZC4uMDAwMDAwMAotLS0gYS9nZC9idGFhL2xpbnV4L2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLQotLy8gVE9ETzogSW1wbGVtZW50IGZvciBMaW51eC4KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uIHsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBBY3Rpdml0eUF0dHJpYnV0aW9uOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBBY3Rpdml0eUF0dHJpYnV0aW9uKCk7IH0pOwotCi1zdHJ1Y3QgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6aW1wbCB7Ci0gIGltcGwoQWN0aXZpdHlBdHRyaWJ1dGlvbiogbW9kdWxlKSB7fQotCi0gIHZvaWQgb25faGNpX3BhY2tldChoYWw6OkhjaVBhY2tldCBwYWNrZXQsIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGUgdHlwZSwgdWludDE2X3QgbGVuZ3RoKSB7fQotCi0gIHZvaWQgcmVnaXN0ZXJfY2FsbGJhY2soQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKiBjYWxsYmFjaykge30KLX07Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6Q2FwdHVyZShjb25zdCBoYWw6OkhjaVBhY2tldCYgcGFja2V0LCBoYWw6OlNub29wTG9nZ2VyOjpQYWNrZXRUeXBlIHR5cGUpIHt9Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6UmVnaXN0ZXJBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2soQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrKiBjYWxsYmFjaykge30KLQotc3RkOjpzdHJpbmcgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiQnRhYSBNb2R1bGUiOwotfQotCi12b2lkIEFjdGl2aXR5QXR0cmlidXRpb246Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qge30KLQotdm9pZCBBY3Rpdml0eUF0dHJpYnV0aW9uOjpTdGFydCgpIHt9Ci0KLXZvaWQgQWN0aXZpdHlBdHRyaWJ1dGlvbjo6U3RvcCgpIHt9Ci0KLUR1bXBzeXNEYXRhRmluaXNoZXIgRW1wdHlEdW1wc3lzRGF0YUZpbmlzaGVyID0gW10oRHVtcHN5c0RhdGFCdWlsZGVyKiBkdW1wc3lzX2RhdGFfYnVpbGRlcikge307Ci1EdW1wc3lzRGF0YUZpbmlzaGVyIEFjdGl2aXR5QXR0cmlidXRpb246OkdldER1bXBzeXNEYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogYnVpbGRlcikgY29uc3QgewotICByZXR1cm4gRW1wdHlEdW1wc3lzRGF0YUZpbmlzaGVyOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2J0YWEvbGludXhfZ2VuZXJpYy9hdHRyaWJ1dGlvbl9wcm9jZXNzb3IuY2MgYi9nZC9idGFhL2xpbnV4X2dlbmVyaWMvYXR0cmlidXRpb25fcHJvY2Vzc29yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTUyNDNhLi4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvbGludXhfZ2VuZXJpYy9hdHRyaWJ1dGlvbl9wcm9jZXNzb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJ0YWEvYXR0cmlidXRpb25fcHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbiB7Ci0KLWNvbnN0ZXhwciBjaGFyIGtBY3Rpdml0eUF0dHJpYnV0aW9uVGltZUZvcm1hdFtdID0gIiVZLSVtLSVkICVIOiVNOiVTIjsKLS8vIEEgZGV2aWNlLWFjdGl2aXR5IGFnZ3JlZ2F0aW9uIGVudHJ5IGV4cGlyZXMgYWZ0ZXIgdHdvIGRheXMgKDE3MjgwMCBzZWNvbmRzKQotc3RhdGljIGNvbnN0IGludCBrRHVyYXRpb25Ub0tlZXBEZXZpY2VBY3Rpdml0eUVudHJ5U2VjcyA9IDE3MjgwMDsKLS8vIEEgdHJhbnNpZW50IGRldmljZS1hY3Rpdml0eSBhZ2dyZWdhdGlvbiBlbnRyeSBpcyBkZWZpbmVkIGFzIGFuIGVudHJ5IHdpdGggdmVyeSBmZXcgQnl0ZSBjb3VudAotLy8gKDIwMCBCeXRlcywgdGhpcyBpcyBhYm91dCB0aGUgc2l6ZSBvZiA1IGFkdmVydGlzaW5nIHBhY2tldHMpIG92ZXIgYSBwZXJpb2Qgb2YgdGltZSAoMTUgbWludXRlcykKLXN0YXRpYyBjb25zdCBpbnQga0J5dGVDb3VudFRyYW5zaWVudERldmljZUFjdGl2aXR5RW50cnkgPSAyMDA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdXJhdGlvblRyYW5zaWVudERldmljZUFjdGl2aXR5RW50cnlTZWNzID0gOTAwOwotc3RhdGljIGNvbnN0IGludCBrTWFwU2l6ZVRyaW1Eb3duQWdncmVnYXRpb25FbnRyeSA9IDIwMDsKLQotdm9pZCBBdHRyaWJ1dGlvblByb2Nlc3Nvcjo6T25CdGFhUGFja2V0cyhzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiBidGFhX3BhY2tldHMpIHsKLSAgQWRkcmVzc0FjdGl2aXR5S2V5IGtleTsKLQotICBmb3IgKGF1dG8mIGJ0YWFfcGFja2V0IDogYnRhYV9wYWNrZXRzKSB7Ci0gICAga2V5LmFkZHJlc3MgPSBidGFhX3BhY2tldC5hZGRyZXNzOwotICAgIGtleS5hY3Rpdml0eSA9IGJ0YWFfcGFja2V0LmFjdGl2aXR5OwotCi0gICAgaWYgKHdha2Vsb2NrX2R1cmF0aW9uX2FnZ3JlZ2F0b3JfLmZpbmQoa2V5KSA9PSB3YWtlbG9ja19kdXJhdGlvbl9hZ2dyZWdhdG9yXy5lbmQoKSkgewotICAgICAgd2FrZWxvY2tfZHVyYXRpb25fYWdncmVnYXRvcl9ba2V5XSA9IHt9OwotICAgIH0KLSAgICB3YWtlbG9ja19kdXJhdGlvbl9hZ2dyZWdhdG9yX1trZXldLmJ5dGVfY291bnQgKz0gYnRhYV9wYWNrZXQuYnl0ZV9jb3VudDsKLQotICAgIGlmICh3YWtldXBfKSB7Ci0gICAgICB3YWtlbG9ja19kdXJhdGlvbl9hZ2dyZWdhdG9yX1trZXldLndha2V1cF9jb3VudCArPSAxOwotICAgICAgd2FrZXVwX2FnZ3JlZ2F0b3JfLlB1c2goc3RkOjptb3ZlKFdha2V1cERlc2NyaXB0b3IoYnRhYV9wYWNrZXQuYWN0aXZpdHksIGJ0YWFfcGFja2V0LmFkZHJlc3MpKSk7Ci0gICAgfQotICB9Ci0gIHdha2V1cF8gPSBmYWxzZTsKLX0KLQotdm9pZCBBdHRyaWJ1dGlvblByb2Nlc3Nvcjo6T25XYWtlbG9ja1JlbGVhc2VkKHVpbnQzMl90IGR1cmF0aW9uX21zKSB7Ci0gIHVpbnQzMl90IHRvdGFsX2J5dGVfY291bnQgPSAwOwotICB1aW50MzJfdCBtc19wZXJfYnl0ZSA9IDA7Ci0KLSAgZm9yIChhdXRvJiBpdCA6IHdha2Vsb2NrX2R1cmF0aW9uX2FnZ3JlZ2F0b3JfKSB7Ci0gICAgdG90YWxfYnl0ZV9jb3VudCArPSBpdC5zZWNvbmQuYnl0ZV9jb3VudDsKLSAgfQotCi0gIGlmICh0b3RhbF9ieXRlX2NvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtc19wZXJfYnl0ZSA9IGR1cmF0aW9uX21zIC8gdG90YWxfYnl0ZV9jb3VudDsKLSAgYXV0byBjdXJfdGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwotICBmb3IgKGF1dG8mIGl0IDogd2FrZWxvY2tfZHVyYXRpb25fYWdncmVnYXRvcl8pIHsKLSAgICBpdC5zZWNvbmQud2FrZWxvY2tfZHVyYXRpb25fbXMgPSBtc19wZXJfYnl0ZSAqIGl0LnNlY29uZC5ieXRlX2NvdW50OwotICAgIGlmIChidGFhX2FnZ3JlZ2F0b3JfLmZpbmQoaXQuZmlyc3QpID09IGJ0YWFfYWdncmVnYXRvcl8uZW5kKCkpIHsKLSAgICAgIGJ0YWFfYWdncmVnYXRvcl9baXQuZmlyc3RdID0ge307Ci0gICAgICBidGFhX2FnZ3JlZ2F0b3JfW2l0LmZpcnN0XS5jcmVhdGlvbl90aW1lID0gY3VyX3RpbWU7Ci0gICAgfQotCi0gICAgYXV0byBlbGFwc2VkX3RpbWVfc2VjID0KLSAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KGN1cl90aW1lIC0gYnRhYV9hZ2dyZWdhdG9yX1tpdC5maXJzdF0uY3JlYXRpb25fdGltZSkuY291bnQoKTsKLSAgICBpZiAoZWxhcHNlZF90aW1lX3NlYyA+IGtEdXJhdGlvblRvS2VlcERldmljZUFjdGl2aXR5RW50cnlTZWNzKSB7Ci0gICAgICBidGFhX2FnZ3JlZ2F0b3JfW2l0LmZpcnN0XS53YWtldXBfY291bnQgPSAwOwotICAgICAgYnRhYV9hZ2dyZWdhdG9yX1tpdC5maXJzdF0uYnl0ZV9jb3VudCA9IDA7Ci0gICAgICBidGFhX2FnZ3JlZ2F0b3JfW2l0LmZpcnN0XS53YWtlbG9ja19kdXJhdGlvbl9tcyA9IDA7Ci0gICAgICBidGFhX2FnZ3JlZ2F0b3JfW2l0LmZpcnN0XS5jcmVhdGlvbl90aW1lID0gY3VyX3RpbWU7Ci0gICAgfQotCi0gICAgYnRhYV9hZ2dyZWdhdG9yX1tpdC5maXJzdF0ud2FrZXVwX2NvdW50ICs9IGl0LnNlY29uZC53YWtldXBfY291bnQ7Ci0gICAgYnRhYV9hZ2dyZWdhdG9yX1tpdC5maXJzdF0uYnl0ZV9jb3VudCArPSBpdC5zZWNvbmQuYnl0ZV9jb3VudDsKLSAgICBidGFhX2FnZ3JlZ2F0b3JfW2l0LmZpcnN0XS53YWtlbG9ja19kdXJhdGlvbl9tcyArPSBpdC5zZWNvbmQud2FrZWxvY2tfZHVyYXRpb25fbXM7Ci0gIH0KLSAgd2FrZWxvY2tfZHVyYXRpb25fYWdncmVnYXRvcl8uY2xlYXIoKTsKLQotICBpZiAoYnRhYV9hZ2dyZWdhdG9yXy5zaXplKCkgPCBrTWFwU2l6ZVRyaW1Eb3duQWdncmVnYXRpb25FbnRyeSkgewotICAgIHJldHVybjsKLSAgfQotICAvLyBUcmltIGRvd24gdGhlIHRyYW5zaWVudCBlbnRyaWVzIGluIHRoZSBhZ2dyZWdhdG9yIHRvIGF2b2lkIHRoYXQgaXQgb3Zlcmdyb3dzCi0gIGZvciAoYXV0byYgaXQgOiBidGFhX2FnZ3JlZ2F0b3JfKSB7Ci0gICAgYXV0byBlbGFwc2VkX3RpbWVfc2VjID0KLSAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KGN1cl90aW1lIC0gaXQuc2Vjb25kLmNyZWF0aW9uX3RpbWUpLmNvdW50KCk7Ci0gICAgaWYgKGVsYXBzZWRfdGltZV9zZWMgPiBrRHVyYXRpb25UcmFuc2llbnREZXZpY2VBY3Rpdml0eUVudHJ5U2VjcyAmJgotICAgICAgICBpdC5zZWNvbmQuYnl0ZV9jb3VudCA8IGtCeXRlQ291bnRUcmFuc2llbnREZXZpY2VBY3Rpdml0eUVudHJ5KSB7Ci0gICAgICBidGFhX2FnZ3JlZ2F0b3JfLmVyYXNlKGl0LmZpcnN0KTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBBdHRyaWJ1dGlvblByb2Nlc3Nvcjo6T25XYWtldXAoKSB7Ci0gIGlmICh3YWtldXBfKSB7Ci0gICAgTE9HX0lORk8oIlByZXZpb3VzIHdha2V1cCBub3RpZmljYXRpb24gaXMgbm90IGNvbnN1bWVkLiIpOwotICB9Ci0gIHdha2V1cF8gPSB0cnVlOwotfQotCi12b2lkIEF0dHJpYnV0aW9uUHJvY2Vzc29yOjpEdW1wKAotICAgIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEFjdGl2aXR5QXR0cmlidXRpb25EYXRhPj4gcHJvbWlzZSwgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSB7Ci0gIC8vIER1bXAgd2FrZXVwIGF0dHJpYnV0aW9uIGRhdGEKLSAgYXV0byB0aXRsZV93YWtldXAgPSBmYl9idWlsZGVyLT5DcmVhdGVTdHJpbmcoIi0tLS0tIFdha2V1cCBBdHRyaWJ1dGlvbiBEdW1wc3lzIC0tLS0tIik7Ci0gIHN0ZDo6dmVjdG9yPGNvbW1vbjo6VGltZXN0YW1wZWRFbnRyeTxXYWtldXBEZXNjcmlwdG9yPj4gd2FrZXVwX2FnZ3JlZ2F0b3IgPSB3YWtldXBfYWdncmVnYXRvcl8uUHVsbCgpOwotICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PFdha2V1cEVudHJ5Pj4gd2FrZXVwX2VudHJ5X29mZnNldHM7Ci0gIGZvciAoYXV0byYgaXQgOiB3YWtldXBfYWdncmVnYXRvcikgewotICAgIFdha2V1cEVudHJ5QnVpbGRlciB3YWtldXBfZW50cnlfYnVpbGRlcigqZmJfYnVpbGRlcik7Ci0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBkdXJhdGlvbihpdC50aW1lc3RhbXApOwotICAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHdha2V1cF90aW1lKGR1cmF0aW9uKTsKLSAgICB3YWtldXBfZW50cnlfYnVpbGRlci5hZGRfd2FrZXVwX3RpbWUoZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKAotICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6U3RyaW5nRm9ybWF0VGltZVdpdGhNaWxsaXNlY29uZHMoa0FjdGl2aXR5QXR0cmlidXRpb25UaW1lRm9ybWF0LCB3YWtldXBfdGltZSkuY19zdHIoKSkpOwotICAgIHdha2V1cF9lbnRyeV9idWlsZGVyLmFkZF9hY3Rpdml0eShmYl9idWlsZGVyLT5DcmVhdGVTdHJpbmcoKEFjdGl2aXR5VG9TdHJpbmcoaXQuZW50cnkuYWN0aXZpdHlfKSkpKTsKLSAgICB3YWtldXBfZW50cnlfYnVpbGRlci5hZGRfYWRkcmVzcyhmYl9idWlsZGVyLT5DcmVhdGVTdHJpbmcoaXQuZW50cnkuYWRkcmVzc18uVG9TdHJpbmcoKSkpOwotICAgIHdha2V1cF9lbnRyeV9vZmZzZXRzLnB1c2hfYmFjayh3YWtldXBfZW50cnlfYnVpbGRlci5GaW5pc2goKSk7Ci0gIH0KLSAgYXV0byB3YWtldXBfZW50cmllcyA9IGZiX2J1aWxkZXItPkNyZWF0ZVZlY3Rvcih3YWtldXBfZW50cnlfb2Zmc2V0cyk7Ci0KLSAgLy8gRHVtcCBkZXZpY2UtYmFzZWQgYWN0aXZpdHkgYWdncmVnYXRpb24gZGF0YQotICBhdXRvIHRpdGxlX2RldmljZV9hY3Rpdml0eSA9IGZiX2J1aWxkZXItPkNyZWF0ZVN0cmluZygiLS0tLS0gRGV2aWNlLWJhc2VkIEFjdGl2aXR5IEF0dHJpYnV0aW9uIER1bXBzeXMgLS0tLS0iKTsKLSAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXZpY2VBY3Rpdml0eUFnZ3JlZ2F0aW9uRW50cnk+PiBhZ2dyZWdhdGlvbl9lbnRyeV9vZmZzZXRzOwotICBmb3IgKGF1dG8mIGl0IDogYnRhYV9hZ2dyZWdhdG9yXykgewotICAgIERldmljZUFjdGl2aXR5QWdncmVnYXRpb25FbnRyeUJ1aWxkZXIgZGV2aWNlX2VudHJ5X2J1aWxkZXIoKmZiX2J1aWxkZXIpOwotICAgIGRldmljZV9lbnRyeV9idWlsZGVyLmFkZF9hZGRyZXNzKGZiX2J1aWxkZXItPkNyZWF0ZVN0cmluZyhpdC5maXJzdC5hZGRyZXNzLlRvU3RyaW5nKCkpKTsKLSAgICBkZXZpY2VfZW50cnlfYnVpbGRlci5hZGRfYWN0aXZpdHkoZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKChBY3Rpdml0eVRvU3RyaW5nKGl0LmZpcnN0LmFjdGl2aXR5KSkpKTsKLSAgICBkZXZpY2VfZW50cnlfYnVpbGRlci5hZGRfd2FrZXVwX2NvdW50KGl0LnNlY29uZC53YWtldXBfY291bnQpOwotICAgIGRldmljZV9lbnRyeV9idWlsZGVyLmFkZF9ieXRlX2NvdW50KGl0LnNlY29uZC5ieXRlX2NvdW50KTsKLSAgICBkZXZpY2VfZW50cnlfYnVpbGRlci5hZGRfd2FrZWxvY2tfZHVyYXRpb25fbXMoaXQuc2Vjb25kLndha2Vsb2NrX2R1cmF0aW9uX21zKTsKLSAgICBkZXZpY2VfZW50cnlfYnVpbGRlci5hZGRfY3JlYXRpb25fdGltZShmYl9idWlsZGVyLT5DcmVhdGVTdHJpbmcoCi0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpTdHJpbmdGb3JtYXRUaW1lV2l0aE1pbGxpc2Vjb25kcyhrQWN0aXZpdHlBdHRyaWJ1dGlvblRpbWVGb3JtYXQsIGl0LnNlY29uZC5jcmVhdGlvbl90aW1lKQotICAgICAgICAgICAgLmNfc3RyKCkpKTsKLSAgICBhZ2dyZWdhdGlvbl9lbnRyeV9vZmZzZXRzLnB1c2hfYmFjayhkZXZpY2VfZW50cnlfYnVpbGRlci5GaW5pc2goKSk7Ci0gIH0KLSAgYXV0byBhZ2dyZWdhdGlvbl9lbnRyaWVzID0gZmJfYnVpbGRlci0+Q3JlYXRlVmVjdG9yKGFnZ3JlZ2F0aW9uX2VudHJ5X29mZnNldHMpOwotCi0gIEFjdGl2aXR5QXR0cmlidXRpb25EYXRhQnVpbGRlciBidWlsZGVyKCpmYl9idWlsZGVyKTsKLSAgYnVpbGRlci5hZGRfdGl0bGVfd2FrZXVwKHRpdGxlX3dha2V1cCk7Ci0gIGJ1aWxkZXIuYWRkX251bV93YWtldXAod2FrZXVwX2FnZ3JlZ2F0b3Iuc2l6ZSgpKTsKLSAgYnVpbGRlci5hZGRfd2FrZXVwX2F0dHJpYnV0aW9uKHdha2V1cF9lbnRyaWVzKTsKLSAgYnVpbGRlci5hZGRfdGl0bGVfYWN0aXZpdHkodGl0bGVfZGV2aWNlX2FjdGl2aXR5KTsKLSAgYnVpbGRlci5hZGRfbnVtX2RldmljZV9hY3Rpdml0eShidGFhX2FnZ3JlZ2F0b3JfLnNpemUoKSk7Ci0gIGJ1aWxkZXIuYWRkX2RldmljZV9hY3Rpdml0eV9hZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbl9lbnRyaWVzKTsKLSAgYnRhYV9hZ2dyZWdhdG9yXy5jbGVhcigpOwotCi0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWN0aXZpdHlBdHRyaWJ1dGlvbkRhdGE+IGR1bXBzeXNfZGF0YSA9IGJ1aWxkZXIuRmluaXNoKCk7Ci0gIHByb21pc2Uuc2V0X3ZhbHVlKGR1bXBzeXNfZGF0YSk7Ci19Ci0KLSNpZm5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0jZW5kaWYKLQotY29uc3QgY2hhciogQXR0cmlidXRpb25Qcm9jZXNzb3I6OkFjdGl2aXR5VG9TdHJpbmcoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLSAgc3dpdGNoIChhY3Rpdml0eSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQWN0aXZpdHk6OkFDTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBY3Rpdml0eTo6QURWRVJUSVNFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEFjdGl2aXR5OjpDT05ORUNUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEFjdGl2aXR5OjpDT05UUk9MKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEFjdGl2aXR5OjpIRlApOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQWN0aXZpdHk6OklTTyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBY3Rpdml0eTo6U0NBTik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBY3Rpdml0eTo6VkVORE9SKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVTktOT1dOIjsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2J0YWEvbGludXhfZ2VuZXJpYy9jbWRfZXZ0X2NsYXNzaWZpY2F0aW9uLmNjIGIvZ2QvYnRhYS9saW51eF9nZW5lcmljL2NtZF9ldnRfY2xhc3NpZmljYXRpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjYxNTEuLjAwMDAwMDAKLS0tIGEvZ2QvYnRhYS9saW51eF9nZW5lcmljL2NtZF9ldnRfY2xhc3NpZmljYXRpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJ0YWEvY21kX2V2dF9jbGFzc2lmaWNhdGlvbi5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbiB7Ci0KLUNtZEV2dEFjdGl2aXR5Q2xhc3NpZmljYXRpb24gbG9va3VwX2NtZChoY2k6Ok9wQ29kZSBvcGNvZGUpIHsKLSAgQ21kRXZ0QWN0aXZpdHlDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiA9IHt9OwotICBzd2l0Y2ggKG9wY29kZSkgewotICAgIGNhc2UgaGNpOjpPcENvZGU6OklOUVVJUlk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6SU5RVUlSWV9DQU5DRUw6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UEVSSU9ESUNfSU5RVUlSWV9NT0RFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkVYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OlNDQU4sIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkFDQ0VQVF9DT05ORUNUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlBJTl9DT0RFX1JFUVVFU1RfUkVQTFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UElOX0NPREVfUkVRVUVTVF9ORUdBVElWRV9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUpFQ1RfQ09OTkVDVElPTl9SRVFVRVNUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFTU9URV9OQU1FX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVNT1RFX05BTUVfUkVRVUVTVF9DQU5DRUw6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6QUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT046Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT046Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9ORUdBVElWRV9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpVU0VSX1BBU1NLRVlfUkVRVUVTVF9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpVU0VSX1BBU1NLRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9ORUdBVElWRV9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6RU5IQU5DRURfQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT046Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVNT1RFX09PQl9FWFRFTkRFRF9EQVRBX1JFUVVFU1RfUkVQTFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6U1dJVENIX1JPTEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9TVE9SRURfTElOS19LRVk6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDN9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpDRU5UUkFMX0xJTktfS0VZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX1NDQU5fRU5BQkxFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfUEFHRV9TQ0FOX0FDVElWSVRZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX1BBR0VfU0NBTl9BQ1RJVklUWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX1BBR0VfU0NBTl9UWVBFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX1BBR0VfU0NBTl9UWVBFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfU0lNUExFX1BBSVJJTkdfTU9ERToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9TSU1QTEVfUEFJUklOR19NT0RFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfU0NBTl9FTkFCTEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfQ09OTkVDVF9MSVNUX1NJWkU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQ0xFQVJfQ09OTkVDVF9MSVNUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlNFTkRfS0VZUFJFU1NfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX0NMRUFSX1JFU09MVklOR19MSVNUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfUkVTT0xWSU5HX0xJU1RfU0laRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkNPTk5FQ1QsIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6RElTQ09OTkVDVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpDSEFOR0VfQ09OTkVDVElPTl9QQUNLRVRfVFlQRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpBVVRIRU5USUNBVElPTl9SRVFVRVNURUQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6U0VUX0NPTk5FQ1RJT05fRU5DUllQVElPTjoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpDSEFOR0VfQ09OTkVDVElPTl9MSU5LX0tFWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVM6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVM6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTjoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0NMT0NLX09GRlNFVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xNUF9IQU5ETEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6U0VUVVBfU1lOQ0hST05PVVNfQ09OTkVDVElPTjoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpFTkhBTkNFRF9TRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkhPTERfTU9ERToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpTTklGRl9NT0RFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkVYSVRfU05JRkZfTU9ERToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpRT1NfU0VUVVA6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6Uk9MRV9ESVNDT1ZFUlk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9MSU5LX1BPTElDWV9TRVRUSU5HUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9MSU5LX1BPTElDWV9TRVRUSU5HUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpGTE9XX1NQRUNJRklDQVRJT046Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6U05JRkZfU1VCUkFUSU5HOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkZMVVNIOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFRlJFU0hfRU5DUllQVElPTl9LRVk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVI6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9MSU5LX1FVQUxJVFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9SU1NJOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfQUZIX0NIQU5ORUxfTUFQOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfQ0xPQ0s6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9FTkNSWVBUSU9OX0tFWV9TSVpFOgotICAgIC8vIFJFQURfTE9PUEJBQ0tfTU9ERSA9IDB4MTgwMSwKLSAgICAvLyBXUklURV9MT09QQkFDS19NT0RFID0gMHgxODAyLAotICAgIC8vIEVOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFID0gMHgxODAzLAotICAgIC8vIFdSSVRFX1NJTVBMRV9QQUlSSU5HX0RFQlVHX01PREUgPSAweDE4MDQsCi0gICAgLy8gV1JJVEVfU0VDVVJFX0NPTk5FQ1RJT05TX1RFU1RfTU9ERSA9IDB4MTgwYSwKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpFTkhBTkNFRF9GTFVTSDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9DT05ORUNUSU9OX1VQREFURToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TVEFSVF9FTkNSWVBUSU9OOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX0xPTkdfVEVSTV9LRVlfUkVRVUVTVF9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9MT05HX1RFUk1fS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVBRF9QSFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX1BIWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX1JFTU9URV9GRUFUVVJFUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9ORUdBVElWRV9SRVBMWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfREFUQV9MRU5HVEg6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDMsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpTRVRfRVZFTlRfTUFTSzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRVNFVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpTRVRfRVZFTlRfRklMVEVSOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfUElOX1RZUEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfUElOX1RZUEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfTE9DQUxfTkFNRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xPQ0FMX05BTUU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9QQUdFX1RJTUVPVVQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfUEFHRV9USU1FT1VUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0NMQVNTX09GX0RFVklDRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9DTEFTU19PRl9ERVZJQ0U6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9WT0lDRV9TRVRUSU5HOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX1ZPSUNFX1NFVFRJTkc6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9OVU1fQlJPQURDQVNUX1JFVFJBTlNNSVRTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX05VTV9CUk9BRENBU1RfUkVUUkFOU01JVFM6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9IT0xEX01PREVfQUNUSVZJVFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSE9MRF9NT0RFX0FDVElWSVRZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfU1lOQ0hST05PVVNfRkxPV19DT05UUk9MX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlNFVF9DT05UUk9MTEVSX1RPX0hPU1RfRkxPV19DT05UUk9MOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkhPU1RfQlVGRkVSX1NJWkU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6SE9TVF9OVU1fQ09NUExFVEVEX1BBQ0tFVFM6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0lBQzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0NVUlJFTlRfSUFDX0xBUDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9DVVJSRU5UX0lBQ19MQVA6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6U0VUX0FGSF9IT1NUX0NIQU5ORUxfQ0xBU1NJRklDQVRJT046Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfQUZIX0NIQU5ORUxfQVNTRVNTTUVOVF9NT0RFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfTEVfSE9TVF9TVVBQT1JUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX0xFX0hPU1RfU1VQUE9SVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfU0VDVVJFX0NPTk5FQ1RJT05TX0hPU1RfU1VQUE9SVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xPQ0FMX09PQl9FWFRFTkRFRF9EQVRBOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlNFVF9FQ09TWVNURU1fQkFTRV9JTlRFUlZBTDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpDT05GSUdVUkVfREFUQV9QQVRIOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTjoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT01NQU5EUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xPQ0FMX0VYVEVOREVEX0ZFQVRVUkVTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfQlVGRkVSX1NJWkU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9CRF9BRERSOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfREFUQV9CTE9DS19TSVpFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDU19WMToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfVjI6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9MT0NBTF9TVVBQT1JURURfQ09ERUNfQ0FQQUJJTElUSUVTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfTE9DQUxfU1VQUE9SVEVEX0NPTlRST0xMRVJfREVMQVk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9MT0NBTF9PT0JfREFUQToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9HRU5FUkFURV9ESEtFWV9DT01NQU5EOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX01PRElGWV9TTEVFUF9DTE9DS19BQ0NVUkFDWToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX0JVRkZFUl9TSVpFX1YyOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEg6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfV1JJVEVfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEg6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVBRF9MT0NBTF9QXzI1Nl9QVUJMSUNfS0VZX0NPTU1BTkQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfR0VORVJBVEVfREhLRVlfQ09NTUFORF9WMToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfRVZFTlRfTUFTSzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX0JVRkZFUl9TSVpFX1YxOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9SQU5ET01fQUREUkVTUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX1RSQU5TTUlUX1BPV0VSOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfUkZfUEFUSF9DT01QRU5TQVRJT05fUE9XRVI6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfV1JJVEVfUkZfUEFUSF9DT01QRU5TQVRJT05fUE9XRVI6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX0RFRkFVTFRfUEhZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX0VOQ1JZUFQ6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkFORDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfQUREUkVTU19SRVNPTFVUSU9OX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfUkVTT0xWQUJMRV9QUklWQVRFX0FERFJFU1NfVElNRU9VVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX01BWElNVU1fREFUQV9MRU5HVEg6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVBRF9TVVBQT1JURURfU1RBVEVTOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkNPTlRST0wsIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6REVMRVRFX1NUT1JFRF9MSU5LX0tFWToKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpDT05UUk9MLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gM307Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkNPTlRST0wsIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAzLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9JTlFVSVJZX1NDQU5fQUNUSVZJVFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfSU5RVUlSWV9TQ0FOX1RZUEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9TQ0FOX1RZUEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9JTlFVSVJZX01PREU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9NT0RFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9FWFRFTkRFRF9JTlFVSVJZX1JFU1BPTlNFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9DSUdfUEFSQU1FVEVSUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9DUkVBVEVfQ0lTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFTU9WRV9DSUc6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQUNDRVBUX0NJU19SRVFVRVNUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFSkVDVF9DSVNfUkVRVUVTVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9DUkVBVEVfQklHOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1RFUk1JTkFURV9CSUc6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQklHX0NSRUFURV9TWU5DOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX0JJR19URVJNSU5BVEVfU1lOQzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRVFVRVNUX1BFRVJfU0NBOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVFVQX0lTT19EQVRBX1BBVEg6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVNT1ZFX0lTT19EQVRBX1BBVEg6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX0hPU1RfRkVBVFVSRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX0lTT19MSU5LX1FVQUxJVFk6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfRU5IQU5DRURfUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX1JFTU9URV9UUkFOU01JVF9QT1dFUl9MRVZFTDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfUEFUSF9MT1NTX1JFUE9SVElOR19QQVJBTUVURVJTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9QQVRIX0xPU1NfUkVQT1JUSU5HX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfVFJBTlNNSVRfUE9XRVJfUkVQT1JUSU5HX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9HRVRfVkVORE9SX0NBUEFCSUxJVElFUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9NVUxUSV9BRFZUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX0JBVENIX1NDQU46Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQURWX0ZJTFRFUjoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9FTkVSR1lfSU5GTzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9FWFRFTkRFRF9TQ0FOX1BBUkFNUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpDT05UUk9MTEVSX0RFQlVHX0lORk86Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6Q09OVFJPTExFUl9BMkRQX09QQ09ERToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpDT05UUk9MTEVSX0JRUjoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0lOUVVJUllfUkVTUE9OU0VfVFJBTlNNSVRfUE9XRVJfTEVWRUw6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9UUkFOU01JVF9QT1dFUl9MRVZFTDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfU0NBTl9QQVJBTUVURVJTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9TQ0FOX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQ19DQU5DRUw6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX1NDQU5fUEFSQU1FVEVSUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfU0NBTl9FTkFCTEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX0RFRkFVTFRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTUVURVJTOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19SRUNFSVZFX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9DTEVBUl9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVF9TSVpFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1BFUklPRElDX0FEVkVSVElTSU5HX1RFUk1JTkFURV9TWU5DOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OlNDQU4sIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVBRF9BRFZFUlRJU0lOR19QSFlTSUNBTF9DSEFOTkVMX1RYX1BPV0VSOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9BRFZFUlRJU0lOR19EQVRBOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9TQ0FOX1JFU1BPTlNFX0RBVEE6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX0FEVkVSVElTSU5HX0VOQUJMRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfREFUQToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfU0NBTl9SRVNQT05TRToKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfRU5BQkxFOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFQURfTUFYSU1VTV9BRFZFUlRJU0lOR19EQVRBX0xFTkdUSDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX05VTUJFUl9PRl9TVVBQT1JURURfQURWRVJUSVNJTkdfU0VUUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRU1PVkVfQURWRVJUSVNJTkdfU0VUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX0NMRUFSX0FEVkVSVElTSU5HX1NFVFM6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1BBUkFNOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19FTkFCTEU6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1JBTkRPTV9BRERSRVNTOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkFEVkVSVElTRSwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfQURWRVJUSVNJTkdfUEFSQU1FVEVSUzoKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpTQ0FOLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gMTB9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDl9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1Q6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVBRF9DSEFOTkVMX01BUDoKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpDT05ORUNULCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gNCwgLmFkZHJlc3NfcG9zID0gMH07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1Q6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19SRVNPTFZJTkdfTElTVDoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRU1PVkVfREVWSUNFX0ZST01fUkVTT0xWSU5HX0xJU1Q6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUkVBRF9QRUVSX1JFU09MVkFCTEVfQUREUkVTUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9SRUFEX0xPQ0FMX1JFU09MVkFCTEVfQUREUkVTUzoKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpMRV9TRVRfUFJJVkFDWV9NT0RFOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkNPTk5FQ1QsIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSA0fTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlM6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6QURWRVJUSVNFLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gMTV9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfRVhURU5ERURfQ1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDZ9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkM6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6U0NBTiwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDZ9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUOgotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1JFTU9WRV9ERVZJQ0VfRlJPTV9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OlNDQU4sIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSA0fTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpPcENvZGU6OkxFX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVI6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU0VUX0lORk9fVFJBTlNGRVI6Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU1FVEVSUzoKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpTQ0FOLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMywgLmFkZHJlc3NfcG9zID0gMH07Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6VU5LTk9XTiwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGNsYXNzaWZpY2F0aW9uOwotfQotCi1DbWRFdnRBY3Rpdml0eUNsYXNzaWZpY2F0aW9uIGxvb2t1cF9ldmVudChoY2k6OkV2ZW50Q29kZSBldmVudF9jb2RlKSB7Ci0gIENtZEV2dEFjdGl2aXR5Q2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24gPSB7fTsKLSAgc3dpdGNoIChldmVudF9jb2RlKSB7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9DT01QTEVURToKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpTQ0FOLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gMH07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlNZTkNIUk9OT1VTX0NPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDMsIC5hZGRyZXNzX3BvcyA9IDV9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpDT05ORUNUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVDoKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpMSU5LX0tFWV9SRVFVRVNUOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkxJTktfS0VZX05PVElGSUNBVElPTjoKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpVU0VSX1BBU1NLRVlfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OktFWVBSRVNTX05PVElGSUNBVElPTjoKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpSRU1PVEVfSE9TVF9TVVBQT1JURURfRkVBVFVSRVNfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVDoKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1Q6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDJ9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpESVNDT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkFVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkVOQ1JZUFRJT05fQ0hBTkdFOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkVOQ1JZUFRJT05fS0VZX1JFRlJFU0hfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6TElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NIQU5HRUQ6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6Q0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVlfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6Q0VOVFJBTF9MSU5LX0tFWV9DT01QTEVURToKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVNfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTl9DT01QTEVURToKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpRT1NfU0VUVVBfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6TU9ERV9DSEFOR0U6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVBRF9DTE9DS19PRkZTRVRfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6Q09OTkVDVElPTl9QQUNLRVRfVFlQRV9DSEFOR0VEOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkZMT1dfU1BFQ0lGSUNBVElPTl9DT01QTEVURToKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFU19DT01QTEVURToKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpTWU5DSFJPTk9VU19DT05ORUNUSU9OX0NIQU5HRUQ6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6U05JRkZfU1VCUkFUSU5HOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkNPTk5FQ1QsIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAzLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX05BTUVfUkVRVUVTVF9DT01QTEVURToKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpFWFRFTkRFRF9JTlFVSVJZX1JFU1VMVDoKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpTQ0FOLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gM307Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpGTFVTSF9PQ0NVUlJFRDoKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpNQVhfU0xPVFNfQ0hBTkdFOgotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlFPU19WSU9MQVRJT046Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6RU5IQU5DRURfRkxVU0hfQ09NUExFVEU6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDIsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6Uk9MRV9DSEFOR0U6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6U0lNUExFX1BBSVJJTkdfQ09NUExFVEU6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDN9OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UEFHRV9TQ0FOX1JFUEVUSVRJT05fTU9ERV9DSEFOR0U6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6U0NBTiwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDJ9OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OlVOS05PV04sIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAwLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgfQotICByZXR1cm4gY2xhc3NpZmljYXRpb247Ci19Ci0KLUNtZEV2dEFjdGl2aXR5Q2xhc3NpZmljYXRpb24gbG9va3VwX2xlX2V2ZW50KGhjaTo6U3ViZXZlbnRDb2RlIHN1YmV2ZW50X2NvZGUpIHsKLSAgQ21kRXZ0QWN0aXZpdHlDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiA9IHt9OwotICBzd2l0Y2ggKHN1YmV2ZW50X2NvZGUpIHsKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkVOSEFOQ0VEX0NPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDQsIC5hZGRyZXNzX3BvcyA9IDd9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX1VQREFURV9DT01QTEVURToKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpSRUFEX1JFTU9URV9GRUFUVVJFU19DT01QTEVURToKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpQSFlfVVBEQVRFX0NPTVBMRVRFOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkNURV9SRVFVRVNUX0ZBSUxFRDoKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpUUkFOU01JVF9QT1dFUl9SRVBPUlRJTkc6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OTkVDVCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDQsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpMT05HX1RFUk1fS0VZX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6UkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1Q6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6REFUQV9MRU5HVEhfQ0hBTkdFOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkNIQU5ORUxfU0VMRUNUSU9OX0FMR09SSVRITToKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX0lRX1JFUE9SVDoKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpQQVRIX0xPU1NfVEhSRVNIT0xEOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OkNPTk5FQ1QsIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSAzLCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6UkVBRF9MT0NBTF9QMjU2X1BVQkxJQ19LRVlfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6R0VORVJBVEVfREhLRVlfQ09NUExFVEU6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6Q09OVFJPTCwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpQRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX0VTVEFCTElTSEVEOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpQRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX0xPU1Q6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6QURWRVJUSVNJTkdfU0VUX1RFUk1JTkFURUQ6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6QURWRVJUSVNFLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gMH07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OlNDQU5fVElNRU9VVDoKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpCSUdfSU5GT19BRFZFUlRJU0lOR19SRVBPUlQ6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6Q09OTkVDVElPTkxFU1NfSVFfUkVQT1JUOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkNSRUFURV9CSUdfQ09NUExFVEU6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6VEVSTUlOQVRFX0JJR19DT01QTEVURToKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpCSUdfU1lOQ19FU1RBQkxJU0hFRDoKLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpCSUdfU1lOQ19MT1NUOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OlJFUVVFU1RfUEVFUl9TQ0FfQ09NUExFVEU6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6U0NBTiwgLmNvbm5lY3Rpb25faGFuZGxlX3BvcyA9IDAsIC5hZGRyZXNzX3BvcyA9IDB9OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpTQ0FOX1JFUVVFU1RfUkVDRUlWRUQ6Ci0gICAgICBjbGFzc2lmaWNhdGlvbiA9IHsuYWN0aXZpdHkgPSBBY3Rpdml0eTo6QURWRVJUSVNFLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gNX07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUkVDRUlWRUQ6Ci0gICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6Q0lTX0VTVEFCTElTSEVEOgotICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkNJU19SRVFVRVNUOgotICAgICAgY2xhc3NpZmljYXRpb24gPSB7LmFjdGl2aXR5ID0gQWN0aXZpdHk6OlNDQU4sIC5jb25uZWN0aW9uX2hhbmRsZV9wb3MgPSA0LCAuYWRkcmVzc19wb3MgPSAwfTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGNsYXNzaWZpY2F0aW9uID0gey5hY3Rpdml0eSA9IEFjdGl2aXR5OjpVTktOT1dOLCAuY29ubmVjdGlvbl9oYW5kbGVfcG9zID0gMCwgLmFkZHJlc3NfcG9zID0gMH07Ci0gIH0KLSAgcmV0dXJuIGNsYXNzaWZpY2F0aW9uOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2J0YWEvbGludXhfZ2VuZXJpYy9oY2lfcHJvY2Vzc29yLmNjIGIvZ2QvYnRhYS9saW51eF9nZW5lcmljL2hjaV9wcm9jZXNzb3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzU5NjkuLjAwMDAwMDAKLS0tIGEvZ2QvYnRhYS9saW51eF9nZW5lcmljL2hjaV9wcm9jZXNzb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJ0YWEvaGNpX3Byb2Nlc3Nvci5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uIHsKLQotdm9pZCBEZXZpY2VQYXJzZXI6Om1hdGNoX2hhbmRsZV93aXRoX2FkZHJlc3ModWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUsIGhjaTo6QWRkcmVzcyYgYWRkcmVzcykgewotICBpZiAoY29ubmVjdGlvbl9oYW5kbGUgJiYgIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgY29ubmVjdGlvbl9sb29rdXBfdGFibGVfW2Nvbm5lY3Rpb25faGFuZGxlXSA9IGFkZHJlc3M7Ci0gIH0gZWxzZSBpZiAoY29ubmVjdGlvbl9oYW5kbGUpIHsKLSAgICBpZiAoY29ubmVjdGlvbl9sb29rdXBfdGFibGVfLmZpbmQoY29ubmVjdGlvbl9oYW5kbGUpICE9IGNvbm5lY3Rpb25fbG9va3VwX3RhYmxlXy5lbmQoKSkgewotICAgICAgYWRkcmVzcyA9IGNvbm5lY3Rpb25fbG9va3VwX3RhYmxlX1tjb25uZWN0aW9uX2hhbmRsZV07Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgSGNpUHJvY2Vzc29yOjpwcm9jZXNzX2xlX2V2ZW50KAotICAgIHN0ZDo6dmVjdG9yPEJ0YWFIY2lQYWNrZXQ+JiBidGFhX2hjaV9wYWNrZXRzLCBpbnQxNl90IGJ5dGVfY291bnQsIGhjaTo6RXZlbnRWaWV3JiBldmVudCkgewotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZV92YWx1ZSA9IDA7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzX3ZhbHVlOwotCi0gIGF1dG8gbGVfcGFja2V0X3ZpZXcgPSBoY2k6OkxlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgaWYgKCFsZV9wYWNrZXRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIHN1YmV2ZW50X2NvZGUgPSBsZV9wYWNrZXRfdmlldy5HZXRTdWJldmVudENvZGUoKTsKLSAgYXV0byBsZV9ldmVudF9pbmZvID0gbG9va3VwX2xlX2V2ZW50KHN1YmV2ZW50X2NvZGUpOwotCi0gIGlmIChsZV9ldmVudF9pbmZvLmFjdGl2aXR5ICE9IEFjdGl2aXR5OjpVTktOT1dOKSB7Ci0gICAgLy8gbG9va3VwX2xlX2V2ZW50IHJldHVybnMgYWxsIHNpbXBsZSBjbGFzc2ljIGV2ZW50IHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYWRkaXRpb25hbCBwcm9jZXNzaW5nLgotICAgIGlmIChsZV9ldmVudF9pbmZvLmNvbm5lY3Rpb25faGFuZGxlX3BvcykgewotICAgICAgYXV0byBjb25uZWN0aW9uX2hhbmRsZV9pdCA9IGV2ZW50LmJlZ2luKCkgKyBsZV9ldmVudF9pbmZvLmNvbm5lY3Rpb25faGFuZGxlX3BvczsKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlX3ZhbHVlID0gY29ubmVjdGlvbl9oYW5kbGVfaXQuZXh0cmFjdDx1aW50MTZfdD4oKTsKLSAgICB9Ci0gICAgaWYgKGxlX2V2ZW50X2luZm8uYWRkcmVzc19wb3MpIHsKLSAgICAgIGF1dG8gYWRkcmVzc192YWx1ZV9pdCA9IGV2ZW50LmJlZ2luKCkgKyBsZV9ldmVudF9pbmZvLmFkZHJlc3NfcG9zOwotICAgICAgYWRkcmVzc192YWx1ZSA9IGFkZHJlc3NfdmFsdWVfaXQuZXh0cmFjdDxoY2k6OkFkZHJlc3M+KCk7Ci0gICAgfQotICAgIGRldmljZV9wYXJzZXJfLm1hdGNoX2hhbmRsZV93aXRoX2FkZHJlc3MoY29ubmVjdGlvbl9oYW5kbGVfdmFsdWUsIGFkZHJlc3NfdmFsdWUpOwotICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQobGVfZXZlbnRfaW5mby5hY3Rpdml0eSwgYWRkcmVzc192YWx1ZSwgYnl0ZV9jb3VudCkpOwotICB9Ci19Ci0KLXZvaWQgSGNpUHJvY2Vzc29yOjpwcm9jZXNzX3NwZWNpYWxfZXZlbnQoCi0gICAgc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4mIGJ0YWFfaGNpX3BhY2tldHMsCi0gICAgaGNpOjpFdmVudENvZGUgZXZlbnRfY29kZSwKLSAgICB1aW50MTZfdCBieXRlX2NvdW50LAotICAgIGhjaTo6RXZlbnRWaWV3JiBldmVudCkgewotICB1aW50MTZfdCBhdmdfYnl0ZV9jb3VudDsKLSAgaGNpOjpBZGRyZXNzIGFkZHJlc3NfdmFsdWU7Ci0KLSAgc3dpdGNoIChldmVudF9jb2RlKSB7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFQ6Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJOiB7Ci0gICAgICBhdXRvIHBhY2tldF92aWV3ID0gaGNpOjpJbnF1aXJ5UmVzdWx0Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICAgIGlmICghcGFja2V0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGF1dG8gaW5xdWlyeV9yZXN1bHRzID0gcGFja2V0X3ZpZXcuR2V0SW5xdWlyeVJlc3VsdHMoKTsKLSAgICAgIGF2Z19ieXRlX2NvdW50ID0gYnl0ZV9jb3VudCAvIGlucXVpcnlfcmVzdWx0cy5zaXplKCk7Ci0gICAgICBmb3IgKGF1dG8mIGlucXVpcnlfcmVzdWx0IDogaW5xdWlyeV9yZXN1bHRzKSB7Ci0gICAgICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoQWN0aXZpdHk6OlNDQU4sIGlucXVpcnlfcmVzdWx0LmJkX2FkZHJfLCBhdmdfYnl0ZV9jb3VudCkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpOVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFM6IHsKLSAgICAgIGF1dG8gcGFja2V0X3ZpZXcgPSBoY2k6Ok51bWJlck9mQ29tcGxldGVkUGFja2V0c1ZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgICBpZiAoIXBhY2tldF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBhdXRvIGNvbXBsZXRlZF9wYWNrZXRzID0gcGFja2V0X3ZpZXcuR2V0Q29tcGxldGVkUGFja2V0cygpOwotICAgICAgYXZnX2J5dGVfY291bnQgPSBieXRlX2NvdW50IC8gY29tcGxldGVkX3BhY2tldHMuc2l6ZSgpOwotICAgICAgZm9yIChhdXRvJiBjb21wbGV0ZWRfcGFja2V0IDogY29tcGxldGVkX3BhY2tldHMpIHsKLSAgICAgICAgZGV2aWNlX3BhcnNlcl8ubWF0Y2hfaGFuZGxlX3dpdGhfYWRkcmVzcyhjb21wbGV0ZWRfcGFja2V0LmNvbm5lY3Rpb25faGFuZGxlXywgYWRkcmVzc192YWx1ZSk7Ci0gICAgICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoQWN0aXZpdHk6OkNPTk5FQ1QsIGFkZHJlc3NfdmFsdWUsIGF2Z19ieXRlX2NvdW50KSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlJFVFVSTl9MSU5LX0tFWVM6IHsKLSAgICAgIGF1dG8gcGFja2V0X3ZpZXcgPSBoY2k6OlJldHVybkxpbmtLZXlzVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICAgIGlmICghcGFja2V0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGF1dG8ga2V5c19hbmRfYWRkcmVzc2VzID0gcGFja2V0X3ZpZXcuR2V0S2V5cygpOwotICAgICAgYXZnX2J5dGVfY291bnQgPSBieXRlX2NvdW50IC8ga2V5c19hbmRfYWRkcmVzc2VzLnNpemUoKTsKLSAgICAgIGZvciAoYXV0byYga2V5X2FuZF9hZGRyZXNzIDoga2V5c19hbmRfYWRkcmVzc2VzKSB7Ci0gICAgICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoQWN0aXZpdHk6OkNPTk5FQ1QsIGtleV9hbmRfYWRkcmVzcy5hZGRyZXNzXywgYXZnX2J5dGVfY291bnQpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDogewotICAgICAgYnRhYV9oY2lfcGFja2V0cy5wdXNoX2JhY2soQnRhYUhjaVBhY2tldChBY3Rpdml0eTo6VU5LTk9XTiwgYWRkcmVzc192YWx1ZSwgYnl0ZV9jb3VudCkpOwotICAgIH0gYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBIY2lQcm9jZXNzb3I6OnByb2Nlc3NfY29tbWFuZCgKLSAgICBzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiYgYnRhYV9oY2lfcGFja2V0cywKLSAgICBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPiYgcGFja2V0X3ZpZXcsCi0gICAgdWludDE2X3QgYnl0ZV9jb3VudCkgewotICBoY2k6OkNvbW1hbmRWaWV3IGNvbW1hbmQgPSBoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICBpZiAoIWNvbW1hbmQuSXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGVfdmFsdWUgPSAwOwotICBoY2k6OkFkZHJlc3MgYWRkcmVzc192YWx1ZTsKLSAgYXV0byBvcGNvZGUgPSBjb21tYW5kLkdldE9wQ29kZSgpOwotICBhdXRvIGNtZF9pbmZvID0gbG9va3VwX2NtZChvcGNvZGUpOwotCi0gIGlmIChjbWRfaW5mby5jb25uZWN0aW9uX2hhbmRsZV9wb3MpIHsKLSAgICBhdXRvIGNvbm5lY3Rpb25faGFuZGxlX2l0ID0gY29tbWFuZC5iZWdpbigpICsgY21kX2luZm8uY29ubmVjdGlvbl9oYW5kbGVfcG9zOwotICAgIGNvbm5lY3Rpb25faGFuZGxlX3ZhbHVlID0gY29ubmVjdGlvbl9oYW5kbGVfaXQuZXh0cmFjdDx1aW50MTZfdD4oKTsKLSAgfQotICBpZiAoY21kX2luZm8uYWRkcmVzc19wb3MpIHsKLSAgICBhdXRvIGFkZHJlc3NfdmFsdWVfaXQgPSBjb21tYW5kLmJlZ2luKCkgKyBjbWRfaW5mby5hZGRyZXNzX3BvczsKLSAgICBhZGRyZXNzX3ZhbHVlID0gYWRkcmVzc192YWx1ZV9pdC5leHRyYWN0PGhjaTo6QWRkcmVzcz4oKTsKLSAgfQotICBkZXZpY2VfcGFyc2VyXy5tYXRjaF9oYW5kbGVfd2l0aF9hZGRyZXNzKGNvbm5lY3Rpb25faGFuZGxlX3ZhbHVlLCBhZGRyZXNzX3ZhbHVlKTsKLSAgcGVuZGluZ19jb21tYW5kXy5idGFhX2hjaV9wYWNrZXQgPSBCdGFhSGNpUGFja2V0KGNtZF9pbmZvLmFjdGl2aXR5LCBhZGRyZXNzX3ZhbHVlLCBieXRlX2NvdW50KTsKLQotICBwZW5kaW5nX2NvbW1hbmRfLm9wY29kZSA9IG9wY29kZTsKLX0KLQotdm9pZCBIY2lQcm9jZXNzb3I6OnByb2Nlc3NfZXZlbnQoCi0gICAgc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4mIGJ0YWFfaGNpX3BhY2tldHMsCi0gICAgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4mIHBhY2tldF92aWV3LAotICAgIHVpbnQxNl90IGJ5dGVfY291bnQpIHsKLSAgaGNpOjpFdmVudFZpZXcgZXZlbnQgPSBoY2k6OkV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldF92aWV3KTsKLSAgaWYgKCFldmVudC5Jc1ZhbGlkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZV92YWx1ZSA9IDA7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzX3ZhbHVlOwotICBhdXRvIGV2ZW50X2NvZGUgPSBldmVudC5HZXRFdmVudENvZGUoKTsKLSAgYXV0byBldmVudF9pbmZvID0gbG9va3VwX2V2ZW50KGV2ZW50X2NvZGUpOwotCi0gIGlmIChldmVudF9pbmZvLmFjdGl2aXR5ICE9IEFjdGl2aXR5OjpVTktOT1dOKSB7Ci0gICAgLy8gbG9va3VwX2V2ZW50IHJldHVybnMgYWxsIHNpbXBsZSBjbGFzc2ljIGV2ZW50IHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYWRkaXRpb25hbCBwcm9jZXNzaW5nLgotICAgIGlmIChldmVudF9pbmZvLmNvbm5lY3Rpb25faGFuZGxlX3BvcykgewotICAgICAgYXV0byBjb25uZWN0aW9uX2hhbmRsZV9pdCA9IGV2ZW50LmJlZ2luKCkgKyBldmVudF9pbmZvLmNvbm5lY3Rpb25faGFuZGxlX3BvczsKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlX3ZhbHVlID0gY29ubmVjdGlvbl9oYW5kbGVfaXQuZXh0cmFjdDx1aW50MTZfdD4oKTsKLSAgICB9Ci0gICAgaWYgKGV2ZW50X2luZm8uYWRkcmVzc19wb3MpIHsKLSAgICAgIGF1dG8gYWRkcmVzc192YWx1ZV9pdCA9IGV2ZW50LmJlZ2luKCkgKyBldmVudF9pbmZvLmFkZHJlc3NfcG9zOwotICAgICAgYWRkcmVzc192YWx1ZSA9IGFkZHJlc3NfdmFsdWVfaXQuZXh0cmFjdDxoY2k6OkFkZHJlc3M+KCk7Ci0gICAgfQotICAgIGRldmljZV9wYXJzZXJfLm1hdGNoX2hhbmRsZV93aXRoX2FkZHJlc3MoY29ubmVjdGlvbl9oYW5kbGVfdmFsdWUsIGFkZHJlc3NfdmFsdWUpOwotICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoZXZlbnRfaW5mby5hY3Rpdml0eSwgYWRkcmVzc192YWx1ZSwgYnl0ZV9jb3VudCkpOwotICB9IGVsc2UgewotICAgIC8vIFRoZSBldmVudCByZXF1aXJlcyBhZGRpdGlvbmFsIHByb2Nlc3NpbmcuCi0gICAgc3dpdGNoIChldmVudF9jb2RlKSB7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpDT01NQU5EX0NPTVBMRVRFOiB7Ci0gICAgICAgIGF1dG8gcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgICAgIGlmIChwYWNrZXRfdmlldy5Jc1ZhbGlkKCkgJiYgcGFja2V0X3ZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpID09IHBlbmRpbmdfY29tbWFuZF8ub3Bjb2RlKSB7Ci0gICAgICAgICAgcGVuZGluZ19jb21tYW5kXy5idGFhX2hjaV9wYWNrZXQuYnl0ZV9jb3VudCArPSBieXRlX2NvdW50OwotICAgICAgICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKHN0ZDo6bW92ZShwZW5kaW5nX2NvbW1hbmRfLmJ0YWFfaGNpX3BhY2tldCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoQWN0aXZpdHk6OlVOS05PV04sIGFkZHJlc3NfdmFsdWUsIGJ5dGVfY291bnQpKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkNPTU1BTkRfU1RBVFVTOiB7Ci0gICAgICAgIGF1dG8gcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRTdGF0dXNWaWV3OjpDcmVhdGUoZXZlbnQpOwotICAgICAgICBpZiAocGFja2V0X3ZpZXcuSXNWYWxpZCgpICYmIHBhY2tldF92aWV3LkdldENvbW1hbmRPcENvZGUoKSA9PSBwZW5kaW5nX2NvbW1hbmRfLm9wY29kZSkgewotICAgICAgICAgIHBlbmRpbmdfY29tbWFuZF8uYnRhYV9oY2lfcGFja2V0LmJ5dGVfY291bnQgKz0gYnl0ZV9jb3VudDsKLSAgICAgICAgICBidGFhX2hjaV9wYWNrZXRzLnB1c2hfYmFjayhzdGQ6Om1vdmUocGVuZGluZ19jb21tYW5kXy5idGFhX2hjaV9wYWNrZXQpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidGFhX2hjaV9wYWNrZXRzLnB1c2hfYmFjayhCdGFhSGNpUGFja2V0KEFjdGl2aXR5OjpVTktOT1dOLCBhZGRyZXNzX3ZhbHVlLCBieXRlX2NvdW50KSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UOgotICAgICAgICBwcm9jZXNzX2xlX2V2ZW50KGJ0YWFfaGNpX3BhY2tldHMsIGJ5dGVfY291bnQsIGV2ZW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpWRU5ET1JfU1BFQ0lGSUM6Ci0gICAgICAgIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoQWN0aXZpdHk6OlZFTkRPUiwgYWRkcmVzc192YWx1ZSwgYnl0ZV9jb3VudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHByb2Nlc3Nfc3BlY2lhbF9ldmVudChidGFhX2hjaV9wYWNrZXRzLCBldmVudF9jb2RlLCBieXRlX2NvdW50LCBldmVudCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi12b2lkIEhjaVByb2Nlc3Nvcjo6cHJvY2Vzc19hY2woCi0gICAgc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4mIGJ0YWFfaGNpX3BhY2tldHMsCi0gICAgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4mIHBhY2tldF92aWV3LAotICAgIHVpbnQxNl90IGJ5dGVfY291bnQpIHsKLSAgaGNpOjpBY2xWaWV3IGFjbCA9IGhjaTo6QWNsVmlldzo6Q3JlYXRlKHBhY2tldF92aWV3KTsKLSAgYXV0byBjb25uZWN0aW9uX2hhbmRsZSA9IGFjbC5iZWdpbigpOwotICAvLyBDb25uZWN0aW9uIGhhbmRsZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgMTIgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZV92YWx1ZSA9IGNvbm5lY3Rpb25faGFuZGxlLmV4dHJhY3Q8dWludDE2X3Q+KCkgJiAweGZmZjsKLSAgaGNpOjpBZGRyZXNzIGFkZHJlc3NfdmFsdWU7Ci0gIGRldmljZV9wYXJzZXJfLm1hdGNoX2hhbmRsZV93aXRoX2FkZHJlc3MoY29ubmVjdGlvbl9oYW5kbGVfdmFsdWUsIGFkZHJlc3NfdmFsdWUpOwotICBidGFhX2hjaV9wYWNrZXRzLnB1c2hfYmFjayhCdGFhSGNpUGFja2V0KEFjdGl2aXR5OjpBQ0wsIGFkZHJlc3NfdmFsdWUsIGJ5dGVfY291bnQpKTsKLX0KLQotdm9pZCBIY2lQcm9jZXNzb3I6OnByb2Nlc3Nfc2NvKAotICAgIHN0ZDo6dmVjdG9yPEJ0YWFIY2lQYWNrZXQ+JiBidGFhX2hjaV9wYWNrZXRzLAotICAgIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+JiBwYWNrZXRfdmlldywKLSAgICB1aW50MTZfdCBieXRlX2NvdW50KSB7Ci0gIGhjaTo6U2NvVmlldyBzY28gPSBoY2k6OlNjb1ZpZXc6OkNyZWF0ZShwYWNrZXRfdmlldyk7Ci0gIGF1dG8gY29ubmVjdGlvbl9oYW5kbGUgPSBzY28uYmVnaW4oKTsKLSAgLy8gQ29ubmVjdGlvbiBoYW5kbGUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIDEyIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGVfdmFsdWUgPSBjb25uZWN0aW9uX2hhbmRsZS5leHRyYWN0PHVpbnQxNl90PigpICYgMHhmZmY7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzX3ZhbHVlOwotICBkZXZpY2VfcGFyc2VyXy5tYXRjaF9oYW5kbGVfd2l0aF9hZGRyZXNzKGNvbm5lY3Rpb25faGFuZGxlX3ZhbHVlLCBhZGRyZXNzX3ZhbHVlKTsKLSAgYnRhYV9oY2lfcGFja2V0cy5wdXNoX2JhY2soQnRhYUhjaVBhY2tldChBY3Rpdml0eTo6SEZQLCBhZGRyZXNzX3ZhbHVlLCBieXRlX2NvdW50KSk7Ci19Ci0KLXZvaWQgSGNpUHJvY2Vzc29yOjpwcm9jZXNzX2lzbygKLSAgICBzdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiYgYnRhYV9oY2lfcGFja2V0cywKLSAgICBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPiYgcGFja2V0X3ZpZXcsCi0gICAgdWludDE2X3QgYnl0ZV9jb3VudCkgewotICBoY2k6Oklzb1ZpZXcgaXNvID0gaGNpOjpJc29WaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICBhdXRvIGNvbm5lY3Rpb25faGFuZGxlID0gaXNvLmJlZ2luKCk7Ci0gIC8vIENvbm5lY3Rpb24gaGFuZGxlIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSAxMiBsZWFzdCBzaWduaWZpY2FudCBiaXQuCi0gIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlX3ZhbHVlID0gY29ubmVjdGlvbl9oYW5kbGUuZXh0cmFjdDx1aW50MTZfdD4oKSAmIDB4ZmZmOwotICBoY2k6OkFkZHJlc3MgYWRkcmVzc192YWx1ZTsKLSAgZGV2aWNlX3BhcnNlcl8ubWF0Y2hfaGFuZGxlX3dpdGhfYWRkcmVzcyhjb25uZWN0aW9uX2hhbmRsZV92YWx1ZSwgYWRkcmVzc192YWx1ZSk7Ci0gIGJ0YWFfaGNpX3BhY2tldHMucHVzaF9iYWNrKEJ0YWFIY2lQYWNrZXQoQWN0aXZpdHk6OklTTywgYWRkcmVzc192YWx1ZSwgYnl0ZV9jb3VudCkpOwotfQotCi1zdGQ6OnZlY3RvcjxCdGFhSGNpUGFja2V0PiBIY2lQcm9jZXNzb3I6Ok9uSGNpUGFja2V0KAotICAgIGhhbDo6SGNpUGFja2V0IHBhY2tldCwgaGFsOjpTbm9vcExvZ2dlcjo6UGFja2V0VHlwZSB0eXBlLCB1aW50MTZfdCBsZW5ndGgpIHsKLSAgc3RkOjp2ZWN0b3I8QnRhYUhjaVBhY2tldD4gYnRhYV9oY2lfcGFja2V0czsKLSAgYXV0byBwYWNrZXRfdmlldyA9IHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KHBhY2tldCkpOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkNNRDoKLSAgICAgIHByb2Nlc3NfY29tbWFuZChidGFhX2hjaV9wYWNrZXRzLCBwYWNrZXRfdmlldywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGFsOjpTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6RVZUOgotICAgICAgcHJvY2Vzc19ldmVudChidGFhX2hjaV9wYWNrZXRzLCBwYWNrZXRfdmlldywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGFsOjpTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6QUNMOgotICAgICAgcHJvY2Vzc19hY2woYnRhYV9oY2lfcGFja2V0cywgcGFja2V0X3ZpZXcsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhhbDo6U25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OlNDTzoKLSAgICAgIHByb2Nlc3Nfc2NvKGJ0YWFfaGNpX3BhY2tldHMsIHBhY2tldF92aWV3LCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoYWw6OlNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpJU086Ci0gICAgICBwcm9jZXNzX2lzbyhidGFhX2hjaV9wYWNrZXRzLCBwYWNrZXRfdmlldywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBidGFhX2hjaV9wYWNrZXRzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2J0YWEvbGludXhfZ2VuZXJpYy93YWtlbG9ja19wcm9jZXNzb3IuY2MgYi9nZC9idGFhL2xpbnV4X2dlbmVyaWMvd2FrZWxvY2tfcHJvY2Vzc29yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNiM2VkLi4wMDAwMDAwCi0tLSBhL2dkL2J0YWEvbGludXhfZ2VuZXJpYy93YWtlbG9ja19wcm9jZXNzb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRhYS93YWtlbG9ja19wcm9jZXNzb3IuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbiB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga1dha2Vsb2NrTWF4RHVyYXRpb25NcygxMDAwMCk7Ci0KLVdha2Vsb2NrUHJvY2Vzc29yOjpXYWtlbG9ja1Byb2Nlc3NvcigpIHsKLSAgd2FrZWxvY2tfbmV0X2NvdW50XyA9IDA7Ci0gIHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfID0ge307Ci19Ci0KLXVpbnQzMl90IFdha2Vsb2NrUHJvY2Vzc29yOjpPbldha2Vsb2NrUmVsZWFzZWQoKSB7Ci0gIGF1dG8gY3VyX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKLSAgdWludDMyX3Qgd2FrZWxvY2tfZHVyYXRpb25fbXMgPSAwOwotCi0gIGlmICh3YWtlbG9ja19uZXRfY291bnRfID09IDApIHsKLSAgICBMT0dfSU5GTygiUmVsZWFzZSBhIG5ldmVyIGFjcXVpcmVkIHdha2Vsb2NrLCBpZ25vcmVkLiIpOwotICB9IGVsc2UgewotICAgIHdha2Vsb2NrX25ldF9jb3VudF8tLTsKLSAgICBpZiAod2FrZWxvY2tfbmV0X2NvdW50XyA9PSAwKSB7Ci0gICAgICB3YWtlbG9ja19kdXJhdGlvbl9tcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihjdXJfdGltZSAtIHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfKS5jb3VudCgpKTsKLSAgICAgIHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfID0ge307Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHdha2Vsb2NrX2R1cmF0aW9uX21zOwotfQotCi12b2lkIFdha2Vsb2NrUHJvY2Vzc29yOjpPbldha2Vsb2NrQWNxdWlyZWQoKSB7Ci0gIGF1dG8gY3VyX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKLQotICBpZiAod2FrZWxvY2tfbmV0X2NvdW50XyA9PSAwKSB7Ci0gICAgaWYgKHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKSB7Ci0gICAgICBMT0dfSU5GTygiUHJldmlvdXMgd2FrZWxvY2sgYWNxdWlyZWQgdGltZSBpcyBub3QgY29uc3VtZWQsIGRyb3BwZWQuIik7Ci0gICAgfQotICAgIHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfID0gY3VyX3RpbWU7Ci0gIH0gZWxzZSBpZiAoY3VyX3RpbWUgLSB3YWtlbG9ja19hY3F1aXJlZF90aW1lXyA+IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoa1dha2Vsb2NrTWF4RHVyYXRpb25NcykpIHsKLSAgICBMT0dfSU5GTygiV2FrZWxvY2sgaGVsZCBmb3IgdG9vIGxvbmcsIGxpa2VseSB3ZSBtaXNzZWQgYSByZWxlYXNlIG5vdGlmaWNhdGlvbi4gUmVzZXR0aW5nIHdha2Vsb2NrIHN0YXRzLiIpOwotICAgIHdha2Vsb2NrX25ldF9jb3VudF8gPSAwOwotICAgIHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfID0gY3VyX3RpbWU7Ci0gIH0KLQotICB3YWtlbG9ja19uZXRfY291bnRfKys7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvYnRhYS93YWtlbG9ja19wcm9jZXNzb3IuaCBiL2dkL2J0YWEvd2FrZWxvY2tfcHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzAwZDIuLjAwMDAwMDAKLS0tIGEvZ2QvYnRhYS93YWtlbG9ja19wcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGFjdGl2aXR5X2F0dHJpYnV0aW9uIHsKLQotY2xhc3MgV2FrZWxvY2tQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgV2FrZWxvY2tQcm9jZXNzb3IoKTsKLQotICB1aW50MzJfdCBPbldha2Vsb2NrUmVsZWFzZWQoKTsKLSAgdm9pZCBPbldha2Vsb2NrQWNxdWlyZWQoKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHdha2Vsb2NrX2FjcXVpcmVkX3RpbWVfOwotICB1aW50OF90IHdha2Vsb2NrX25ldF9jb3VudF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NlcnQvYWxsX2NlcnRfdGVzdGNhc2VzIGIvZ2QvY2VydC9hbGxfY2VydF90ZXN0Y2FzZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDU5NTQuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9hbGxfY2VydF90ZXN0Y2FzZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1DZXJ0U2VsZlRlc3QKLVNpbXBsZUhhbFRlc3QKLURpcmVjdEhjaVRlc3QKLUxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdAotTGVTY2FubmluZ01hbmFnZXJUZXN0Ci1MZUV4dGVuZGVkU2Nhbm5pbmdNYW5hZ2VyVGVzdAotTGVTY2FubmluZ1dpdGhTZWN1cml0eVRlc3QKLU5laWdoYm9yVGVzdAotQ29udHJvbGxlclRlc3QKLUFjbE1hbmFnZXJUZXN0Ci1MZUFjbE1hbmFnZXJUZXN0Ci1TdGFja1Rlc3QKLUwyY2FwVGVzdAotTGVMMmNhcFRlc3QKLUR1YWxMMmNhcFRlc3QKLUxlU2VjdXJpdHlUZXN0Ci1MMmNhcFBlcmZvcm1hbmNlVGVzdAotU2VjdXJpdHlUZXN0Ci1TaGltVGVzdAotTGVJc29UZXN0CmRpZmYgLS1naXQgYS9nZC9jZXJ0L2FzeW5jX3N1YnByb2Nlc3NfbG9nZ2VyLnB5IGIvZ2QvY2VydC9hc3luY19zdWJwcm9jZXNzX2xvZ2dlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhNWQ2OS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2FzeW5jX3N1YnByb2Nlc3NfbG9nZ2VyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNvbnRleHRsaWIgaW1wb3J0IEV4aXRTdGFjawotaW1wb3J0IGNvbmN1cnJlbnQuZnV0dXJlcwotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCByZQotaW1wb3J0IHN1YnByb2Nlc3MKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgVGVybWluYWxDb2xvcgotCi0KLWNsYXNzIEFzeW5jU3VicHJvY2Vzc0xvZ2dlcjoKLSAgICAiIiIKLSAgICBBbiBhc3luY2hyb25vdXMgbG9nZ2VyIGZvciBzdWJwcm9jZXNzZXMuUG9wZW4gb2JqZWN0J3MgU1RET1VUCi0KLSAgICBDb250YWlucyB0aHJlYWRpbmcgZnVuY3Rpb25hbGl0eSB0aGF0IGFsbG93cyBhc3luY2hyb25vdXMgaGFuZGxpbmcgb2YgbGluZXMKLSAgICBmcm9tIFNURE9VVCBmcm9tIHN1YnByb2Nlc3MuUG9wZW4KLSAgICAiIiIKLSAgICBXQUlUX1RJTUVPVVRfU0VDT05EUyA9IDEwCi0gICAgUFJPQ0VTU19UQUdfTUlOX1dJRFRIID0gMjQKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLAotICAgICAgICAgICAgICAgICBwcm9jZXNzOiBzdWJwcm9jZXNzLlBvcGVuLAotICAgICAgICAgICAgICAgICBsb2dfZmlsZV9wYXRocywKLSAgICAgICAgICAgICAgICAgbG9nX3RvX3N0ZG91dD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgdGFnPU5vbmUsCi0gICAgICAgICAgICAgICAgIGNvbG9yOiBUZXJtaW5hbENvbG9yID0gTm9uZSk6Ci0gICAgICAgICIiIgotICAgICAgICA6cGFyYW0gcHJvY2VzczogYSBzdWJwcm9jZXNzLlBvcGVuIG9iamVjdCB3aXRoIFNURE9VVAotICAgICAgICA6cGFyYW0gbG9nX2ZpbGVfcGF0aHM6IGxpc3Qgb2YgbG9nIGZpbGVzIHRvIHJlZGlyZWN0IGxvZyB0bwotICAgICAgICA6cGFyYW0gbG9nX3RvX3N0ZG91dDogd2hldGhlciB0byBkdW1wIGxvZ3MgdG8gc3Rkb3V0IGluIHRoZSBmb3JtYXQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbdGFnXSBsb2dsaW5lIgotICAgICAgICA6cGFyYW0gdGFnOiB0YWcgdG8gYmUgdXNlZCBpbiBhYm92ZSBmb3JtYXQKLSAgICAgICAgOnBhcmFtIGNvbG9yOiB3aGVuIGR1bXBpbmcgdG8gc3Rkb3V0LCB3aGF0IGNvbG9yIHRvIHVzZSBmb3IgdGFnCi0gICAgICAgICIiIgotICAgICAgICBpZiBub3QgcHJvY2VzczoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInByb2Nlc3MgY2Fubm90IGJlIE5vbmUiKQotICAgICAgICBpZiBub3QgcHJvY2Vzcy5zdGRvdXQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwcm9jZXNzLnN0ZG91dCBjYW5ub3QgYmUgTm9uZSIpCi0gICAgICAgIGlmIGxvZ190b19zdGRvdXQ6Ci0gICAgICAgICAgICBpZiBub3QgdGFnIG9yIHR5cGUodGFnKSBpcyBub3Qgc3RyOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIldoZW4gbG9nZ2luZyB0byBzdGRvdXQsIGxvZyB0YWcgbXVzdCBiZSBzZXQiKQotICAgICAgICBzZWxmLmxvZ19maWxlX3BhdGhzID0gbG9nX2ZpbGVfcGF0aHMKLSAgICAgICAgc2VsZi5sb2dfdG9fc3Rkb3V0ID0gbG9nX3RvX3N0ZG91dAotICAgICAgICBzZWxmLnRhZyA9IHRhZwotICAgICAgICBzZWxmLmNvbG9yID0gY29sb3IKLSAgICAgICAgc2VsZi5wcm9jZXNzID0gcHJvY2VzcwotICAgICAgICBzZWxmLmV4ZWN1dG9yID0gY29uY3VycmVudC5mdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz0xKQotICAgICAgICBzZWxmLmZ1dHVyZSA9IHNlbGYuZXhlY3V0b3Iuc3VibWl0KHNlbGYuX19sb2dnaW5nX2xvb3ApCi0KLSAgICBkZWYgc3RvcChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFN0b3AgdGhpcyBsb2dnZXIgYW5kIHRoaXMgb2JqZWN0IGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlciB0aGlzIGNhbGwKLSAgICAgICAgIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZnV0dXJlLnJlc3VsdCh0aW1lb3V0PXNlbGYuV0FJVF9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgICAgICBpZiByZXN1bHQ6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigibG9nZ2luZyB0aHJlYWQgJXMgcHJvZHVjZWQgYW4gZXJyb3Igd2hlbiBleGVjdXRpbmc6ICVzIiAlIChzZWxmLnRhZywgc3RyKHJlc3VsdCkpKQotICAgICAgICBleGNlcHQgY29uY3VycmVudC5mdXR1cmVzLlRpbWVvdXRFcnJvcjoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImxvZ2dpbmcgdGhyZWFkICVzIGZhaWxlZCB0byBmaW5pc2ggYWZ0ZXIgJWQgc2Vjb25kcyIgJSAoc2VsZi50YWcsIHNlbGYuV0FJVF9USU1FT1VUX1NFQ09ORFMpKQotICAgICAgICBzZWxmLmV4ZWN1dG9yLnNodXRkb3duKHdhaXQ9RmFsc2UpCi0KLSAgICBkZWYgX19sb2dnaW5nX2xvb3Aoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuY29sb3I6Ci0gICAgICAgICAgICBsb2dnYWJsZVRhZyA9ICJbJXMlcyVzXSIgJSAoc2VsZi5jb2xvciwgc2VsZi50YWcsIFRlcm1pbmFsQ29sb3IuRU5EKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbG9nZ2FibGVUYWcgPSAiWyVzXSIgJSBzZWxmLnRhZwotICAgICAgICB0YWdMZW5ndGggPSBsZW4ocmUuc3ViKCdbXlx3XHNdJywgJycsIGxvZ2dhYmxlVGFnKSkKLSAgICAgICAgaWYgdGFnTGVuZ3RoIDwgc2VsZi5QUk9DRVNTX1RBR19NSU5fV0lEVEg6Ci0gICAgICAgICAgICBsb2dnYWJsZVRhZyArPSAiICIgKiAoc2VsZi5QUk9DRVNTX1RBR19NSU5fV0lEVEggLSB0YWdMZW5ndGgpCi0gICAgICAgIHdpdGggRXhpdFN0YWNrKCkgYXMgc3RhY2s6Ci0gICAgICAgICAgICBsb2dfZmlsZXMgPSBbc3RhY2suZW50ZXJfY29udGV4dChvcGVuKGZpbGVfcGF0aCwgJ3cnKSkgZm9yIGZpbGVfcGF0aCBpbiBzZWxmLmxvZ19maWxlX3BhdGhzXQotICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5wcm9jZXNzLnN0ZG91dDoKLSAgICAgICAgICAgICAgICBmb3IgbG9nX2ZpbGUgaW4gbG9nX2ZpbGVzOgotICAgICAgICAgICAgICAgICAgICBsb2dfZmlsZS53cml0ZShsaW5lKQotICAgICAgICAgICAgICAgIGlmIHNlbGYubG9nX3RvX3N0ZG91dDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoInt9e30iLmZvcm1hdChsb2dnYWJsZVRhZywgbGluZS5zdHJpcCgpKSkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvYmVoYXZpb3IucHkgYi9nZC9jZXJ0L2JlaGF2aW9yLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAzZGQ2Li4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvYmVoYXZpb3IucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGFiYyBpbXBvcnQgQUJDLCBhYnN0cmFjdG1ldGhvZAotZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQotZnJvbSBtb2JseSBpbXBvcnQgc2lnbmFscwotZnJvbSB0aHJlYWRpbmcgaW1wb3J0IENvbmRpdGlvbgotCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBzdGF0aWNfcmVtYWluaW5nX3RpbWVfZGVsdGEKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotCi0KLWNsYXNzIElIYXNCZWhhdmlvcnMoQUJDKToKLQotICAgIEBhYnN0cmFjdG1ldGhvZAotICAgIGRlZiBnZXRfYmVoYXZpb3JzKHNlbGYpOgotICAgICAgICBwYXNzCi0KLQotZGVmIGFueXRoaW5nKCk6Ci0gICAgcmV0dXJuIGxhbWJkYSBvYmo6IFRydWUKLQotCi1kZWYgd2hlbihoYXNfYmVoYXZpb3JzKToKLSAgICBhc3NlcnRUaGF0KGlzaW5zdGFuY2UoaGFzX2JlaGF2aW9ycywgSUhhc0JlaGF2aW9ycykpLmlzVHJ1ZSgpCi0gICAgcmV0dXJuIGhhc19iZWhhdmlvcnMuZ2V0X2JlaGF2aW9ycygpCi0KLQotZGVmIElHTk9SRV9VTkhBTkRMRUQob2JqKToKLSAgICBwYXNzCi0KLQotY2xhc3MgU2luZ2xlQXJndW1lbnRCZWhhdmlvcihvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcGx5X3N0YWdlX2ZhY3RvcnkpOgotICAgICAgICBzZWxmLl9yZXBseV9zdGFnZV9mYWN0b3J5ID0gcmVwbHlfc3RhZ2VfZmFjdG9yeQotICAgICAgICBzZWxmLl9pbnN0YW5jZXMgPSBbXQotICAgICAgICBzZWxmLl9pbnZva2VkX29iaiA9IFtdCi0gICAgICAgIHNlbGYuX2ludm9rZWRfY29uZGl0aW9uID0gQ29uZGl0aW9uKCkKLSAgICAgICAgc2VsZi5zZXRfZGVmYXVsdF90b19jcmFzaCgpCi0KLSAgICBkZWYgYmVnaW4oc2VsZiwgbWF0Y2hlcik6Ci0gICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVN0YWdlKHNlbGYsIG1hdGNoZXIsIHNlbGYuX3JlcGx5X3N0YWdlX2ZhY3RvcnkpCi0KLSAgICBkZWYgYXBwZW5kKHNlbGYsIGJlaGF2aW9yX2luc3RhbmNlKToKLSAgICAgICAgc2VsZi5faW5zdGFuY2VzLmFwcGVuZChiZWhhdmlvcl9pbnN0YW5jZSkKLQotICAgIGRlZiBzZXRfZGVmYXVsdChzZWxmLCBmbik6Ci0gICAgICAgIGFzc2VydFRoYXQoZm4pLmlzTm90Tm9uZSgpCi0gICAgICAgIHNlbGYuX2RlZmF1bHRfZm4gPSBmbgotCi0gICAgZGVmIHNldF9kZWZhdWx0X3RvX2NyYXNoKHNlbGYpOgotICAgICAgICBzZWxmLl9kZWZhdWx0X2ZuID0gTm9uZQotCi0gICAgZGVmIHNldF9kZWZhdWx0X3RvX2lnbm9yZShzZWxmKToKLSAgICAgICAgc2VsZi5fZGVmYXVsdF9mbiA9IElHTk9SRV9VTkhBTkRMRUQKLQotICAgIGRlZiBydW4oc2VsZiwgb2JqKToKLSAgICAgICAgZm9yIGluc3RhbmNlIGluIHNlbGYuX2luc3RhbmNlczoKLSAgICAgICAgICAgIGlmIGluc3RhbmNlLnRyeV9ydW4ob2JqKToKLSAgICAgICAgICAgICAgICBzZWxmLl9fb2JqX2ludm9rZWQob2JqKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLl9kZWZhdWx0X2ZuIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgIyBJR05PUkVfVU5IQU5ETEVEIGlzIGFsc28gYSBkZWZhdWx0IGZuCi0gICAgICAgICAgICBzZWxmLl9kZWZhdWx0X2ZuKG9iaikKLSAgICAgICAgICAgIHNlbGYuX19vYmpfaW52b2tlZChvYmopCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlKAotICAgICAgICAgICAgICAgICIlczogYmVoYXZpb3IgZm9yICVzIHdlbnQgdW5oYW5kbGVkIiAlIChzZWxmLl9yZXBseV9zdGFnZV9mYWN0b3J5KCkuX19jbGFzc19fLl9fbmFtZV9fLCBvYmopLAotICAgICAgICAgICAgICAgIGV4dHJhcz1Ob25lKQotCi0gICAgZGVmIF9fb2JqX2ludm9rZWQoc2VsZiwgb2JqKToKLSAgICAgICAgc2VsZi5faW52b2tlZF9jb25kaXRpb24uYWNxdWlyZSgpCi0gICAgICAgIHNlbGYuX2ludm9rZWRfb2JqLmFwcGVuZChvYmopCi0gICAgICAgIHNlbGYuX2ludm9rZWRfY29uZGl0aW9uLm5vdGlmeSgpCi0gICAgICAgIHNlbGYuX2ludm9rZWRfY29uZGl0aW9uLnJlbGVhc2UoKQotCi0gICAgZGVmIHdhaXRfdW50aWxfaW52b2tlZChzZWxmLCBtYXRjaGVyLCB0aW1lcywgdGltZW91dCk6Ci0gICAgICAgIGVuZF90aW1lID0gZGF0ZXRpbWUubm93KCkgKyB0aW1lb3V0Ci0gICAgICAgIGludm9rZWRfdGltZXMgPSAwCi0gICAgICAgIHdoaWxlIGRhdGV0aW1lLm5vdygpIDwgZW5kX3RpbWUgYW5kIGludm9rZWRfdGltZXMgPCB0aW1lczoKLSAgICAgICAgICAgIHJlbWFpbmluZyA9IHN0YXRpY19yZW1haW5pbmdfdGltZV9kZWx0YShlbmRfdGltZSkKLSAgICAgICAgICAgIGludm9rZWRfdGltZXMgPSBzdW0oKG1hdGNoZXIoaSkgZm9yIGkgaW4gc2VsZi5faW52b2tlZF9vYmopKQotICAgICAgICAgICAgc2VsZi5faW52b2tlZF9jb25kaXRpb24uYWNxdWlyZSgpCi0gICAgICAgICAgICBzZWxmLl9pbnZva2VkX2NvbmRpdGlvbi53YWl0KHJlbWFpbmluZy50b3RhbF9zZWNvbmRzKCkpCi0gICAgICAgICAgICBzZWxmLl9pbnZva2VkX2NvbmRpdGlvbi5yZWxlYXNlKCkKLSAgICAgICAgcmV0dXJuIGludm9rZWRfdGltZXMgPT0gdGltZXMKLQotCi1jbGFzcyBQZXJzaXN0ZW5jZVN0YWdlKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgYmVoYXZpb3IsIG1hdGNoZXIsIHJlcGx5X3N0YWdlX2ZhY3RvcnkpOgotICAgICAgICBzZWxmLl9iZWhhdmlvciA9IGJlaGF2aW9yCi0gICAgICAgIHNlbGYuX21hdGNoZXIgPSBtYXRjaGVyCi0gICAgICAgIHNlbGYuX3JlcGx5X3N0YWdlX2ZhY3RvcnkgPSByZXBseV9zdGFnZV9mYWN0b3J5Ci0KLSAgICBkZWYgdGhlbihzZWxmLCB0aW1lcz0xKToKLSAgICAgICAgcmVwbHlfc3RhZ2UgPSBzZWxmLl9yZXBseV9zdGFnZV9mYWN0b3J5KCkKLSAgICAgICAgcmVwbHlfc3RhZ2UuaW5pdChzZWxmLl9iZWhhdmlvciwgc2VsZi5fbWF0Y2hlciwgdGltZXMpCi0gICAgICAgIHJldHVybiByZXBseV9zdGFnZQotCi0gICAgZGVmIGFsd2F5cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYudGhlbih0aW1lcz0tMSkKLQotCi1jbGFzcyBSZXBseVN0YWdlKG9iamVjdCk6Ci0KLSAgICBkZWYgaW5pdChzZWxmLCBiZWhhdmlvciwgbWF0Y2hlciwgcGVyc2lzdGVuY2UpOgotICAgICAgICBzZWxmLl9iZWhhdmlvciA9IGJlaGF2aW9yCi0gICAgICAgIHNlbGYuX21hdGNoZXIgPSBtYXRjaGVyCi0gICAgICAgIHNlbGYuX3BlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2UKLQotICAgIGRlZiBfY29tbWl0KHNlbGYsIGZuKToKLSAgICAgICAgc2VsZi5fYmVoYXZpb3IuYXBwZW5kKEJlaGF2aW9ySW5zdGFuY2Uoc2VsZi5fbWF0Y2hlciwgc2VsZi5fcGVyc2lzdGVuY2UsIGZuKSkKLQotCi1jbGFzcyBCZWhhdmlvckluc3RhbmNlKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hlciwgcGVyc2lzdGVuY2UsIGZuKToKLSAgICAgICAgc2VsZi5fbWF0Y2hlciA9IG1hdGNoZXIKLSAgICAgICAgc2VsZi5fcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZQotICAgICAgICBzZWxmLl9mbiA9IGZuCi0gICAgICAgIHNlbGYuX2NhbGxlZF9jb3VudCA9IDAKLQotICAgIGRlZiB0cnlfcnVuKHNlbGYsIG9iaik6Ci0gICAgICAgIGlmIG5vdCBzZWxmLl9tYXRjaGVyKG9iaik6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgaWYgc2VsZi5fcGVyc2lzdGVuY2UgPj0gMDoKLSAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxlZF9jb3VudCA+PSBzZWxmLl9wZXJzaXN0ZW5jZToKLSAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgc2VsZi5fY2FsbGVkX2NvdW50ICs9IDEKLSAgICAgICAgc2VsZi5fZm4ob2JqKQotICAgICAgICByZXR1cm4gVHJ1ZQotCi0KLWNsYXNzIEJvdW5kVmVyaWZpY2F0aW9uU3RhZ2Uob2JqZWN0KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiZWhhdmlvciwgbWF0Y2hlciwgdGltZW91dCk6Ci0gICAgICAgIHNlbGYuX2JlaGF2aW9yID0gYmVoYXZpb3IKLSAgICAgICAgc2VsZi5fbWF0Y2hlciA9IG1hdGNoZXIKLSAgICAgICAgc2VsZi5fdGltZW91dCA9IHRpbWVvdXQKLQotICAgIGRlZiB0aW1lcyhzZWxmLCB0aW1lcz0xKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2JlaGF2aW9yLndhaXRfdW50aWxfaW52b2tlZChzZWxmLl9tYXRjaGVyLCB0aW1lcywgc2VsZi5fdGltZW91dCkKLQotCi1jbGFzcyBXYWl0Rm9yQmVoYXZpb3JTdWJqZWN0KG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgYmVoYXZpb3JzLCB0aW1lb3V0KToKLSAgICAgICAgc2VsZi5fYmVoYXZpb3JzID0gYmVoYXZpb3JzCi0gICAgICAgIHNlbGYuX3RpbWVvdXQgPSB0aW1lb3V0Ci0KLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgaXRlbSk6Ci0gICAgICAgIGJlaGF2aW9yID0gZ2V0YXR0cihzZWxmLl9iZWhhdmlvcnMsIGl0ZW0gKyAiX2JlaGF2aW9yIikKLSAgICAgICAgdCA9IHNlbGYuX3RpbWVvdXQKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBtYXRjaGVyOiBCb3VuZFZlcmlmaWNhdGlvblN0YWdlKGJlaGF2aW9yLCBtYXRjaGVyLCB0KQotCi0KLWRlZiB3YWl0X3VudGlsKGlfaGFzX2JlaGF2aW9ycywgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0zKSk6Ci0gICAgcmV0dXJuIFdhaXRGb3JCZWhhdmlvclN1YmplY3QoaV9oYXNfYmVoYXZpb3JzLmdldF9iZWhhdmlvcnMoKSwgdGltZW91dCkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uM19zZXR1cC5weSBiL2dkL2NlcnQvYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uM19zZXR1cC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzE4Yi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2JsdWV0b290aF9wYWNrZXRzX3B5dGhvbjNfc2V0dXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVXNhZ2U6Ci0jIDEuIFJ1biBlbnZzZXR1cCBhbmQgbHVuY2ggZmlyc3QgaW4gYW4gQW5kcm9pZCBjaGVja291dAotIyAyLiBNYWtlIHRhcmdldCBibHVldG9vdGhfcGFja2V0c19weXRob24zIHRoYXQgd2lsbCBnZW5lcmF0ZSBDKysgc291cmNlcyBmb3IgdGhlCi0jICAgIEV4dGVuc2lvbgotIyAzLiBCdWlsZCBvbmx5OgotIyAgICAgICBweXRob24zIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjNfc2V0dXAucHkgYnVpbGRfZXh0Ci0jICAgVGhlbiBGaW5kIHRoZSAuc28gZmlsZSBpbiBidWlsZC9saWIubGludXgteDg2XzY0LTMuWAotIyA0LiBJbnN0YWxsOgotIyAgICAgICBweXRob24zIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjNfc2V0dXAucHkgaW5zdGFsbCAtLXVzZXIKLQotaW1wb3J0IG9zCi1pbXBvcnQgZ2xvYgotZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCi0KLUFORFJPSURfQlVJTERfVE9QID0gb3MuZ2V0ZW52KCJBTkRST0lEX0JVSUxEX1RPUCIpCi1QWUJJTkQxMV9JTkNMVURFX0RJUiA9IG9zLnBhdGguam9pbihBTkRST0lEX0JVSUxEX1RPUCwgImV4dGVybmFsL3B5dGhvbi9weWJpbmQxMS9pbmNsdWRlIikKLUdEX0RJUiA9IG9zLnBhdGguam9pbihBTkRST0lEX0JVSUxEX1RPUCwgInN5c3RlbS9idC9nZCIpCi1CVF9QQUNLRVRTX0dFTl9ESVIgPSBvcy5wYXRoLmpvaW4oQU5EUk9JRF9CVUlMRF9UT1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vYnQvZ2QvQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oL2dlbiIpCi1CVF9QQUNLRVRTX1BZM19HRU5fRElSID0gb3MucGF0aC5qb2luKEFORFJPSURfQlVJTERfVE9QLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9idC9nZC9CbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX3B5dGhvbjNfY2MvZ2VuIikKLQotQlRfUEFDS0VUU19CQVNFX1NSQ1MgPSBbCi0gICAgb3MucGF0aC5qb2luKEdEX0RJUiwgImwyY2FwL2Zjcy5jYyIpLAotICAgIG9zLnBhdGguam9pbihHRF9ESVIsICJwYWNrZXQvYml0X2luc2VydGVyLmNjIiksCi0gICAgb3MucGF0aC5qb2luKEdEX0RJUiwgInBhY2tldC9ieXRlX2luc2VydGVyLmNjIiksCi0gICAgb3MucGF0aC5qb2luKEdEX0RJUiwgInBhY2tldC9ieXRlX29ic2VydmVyLmNjIiksCi0gICAgb3MucGF0aC5qb2luKEdEX0RJUiwgInBhY2tldC9pdGVyYXRvci5jYyIpLAotICAgIG9zLnBhdGguam9pbihHRF9ESVIsICJwYWNrZXQvZnJhZ21lbnRpbmdfaW5zZXJ0ZXIuY2MiKSwKLSAgICBvcy5wYXRoLmpvaW4oR0RfRElSLCAicGFja2V0L3BhY2tldF92aWV3LmNjIiksCi0gICAgb3MucGF0aC5qb2luKEdEX0RJUiwgInBhY2tldC9yYXdfYnVpbGRlci5jYyIpLAotICAgIG9zLnBhdGguam9pbihHRF9ESVIsICJwYWNrZXQvdmlldy5jYyIpLAotXQotCi1CVF9QQUNLRVRTX1BZM19TUkNzID0gXAotICBbb3MucGF0aC5qb2luKEdEX0RJUiwgInBhY2tldC9weXRob24zX21vZHVsZS5jYyIpXSBcCi0gICsgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihCVF9QQUNLRVRTX1BZM19HRU5fRElSLCAiaGNpIiwgIiouY2MiKSkgXAotICArIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oQlRfUEFDS0VUU19QWTNfR0VOX0RJUiwgImwyY2FwIiwgIiouY2MiKSkgXAotICArIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oQlRfUEFDS0VUU19QWTNfR0VOX0RJUiwgInNlY3VyaXR5IiwgIiouY2MiKSkKLQotYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uM19tb2R1bGUgPSBFeHRlbnNpb24oCi0gICAgJ2JsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMnLAotICAgIHNvdXJjZXM9QlRfUEFDS0VUU19CQVNFX1NSQ1MgKyBCVF9QQUNLRVRTX1BZM19TUkNzLAotICAgIGluY2x1ZGVfZGlycz1bR0RfRElSLCBCVF9QQUNLRVRTX0dFTl9ESVIsIEJUX1BBQ0tFVFNfUFkzX0dFTl9ESVIsIFBZQklORDExX0lOQ0xVREVfRElSXSwKLSAgICBleHRyYV9jb21waWxlX2FyZ3M9Wyctc3RkPWMrKzE3J10pCi0KLXNldHVwKAotICAgIG5hbWU9J2JsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMnLAotICAgIHZlcnNpb249JzEuMCcsCi0gICAgYXV0aG9yPSJBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgIGRlc2NyaXB0aW9uPSIiIkJsdWV0b290aCBQYWNrZXQgTGlicmFyeSIiIiwKLSAgICBleHRfbW9kdWxlcz1bYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uM19tb2R1bGVdLAotICAgIHB5X21vZHVsZXM9WyJibHVldG9vdGhfcGFja2V0c19weXRob24zIl0sCi0pCmRpZmYgLS1naXQgYS9nZC9jZXJ0L2NhcHR1cmUucHkgYi9nZC9jZXJ0L2NhcHR1cmUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2RjN2QuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9jYXB0dXJlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLWNsYXNzIENhcHR1cmUob2JqZWN0KToKLSAgICAiIiIKLSAgICBXcmFwIGEgbWF0Y2ggZnVuY3Rpb24gYW5kIHVzZSBpbiBpdHMgcGxhY2UsIHRvIGNhcHR1cmUgdGhlIHZhbHVlCi0gICAgdGhhdCBtYXRjaGVkLiBTcGVjaWZ5IGFuIG9wdGlvbmFsIHxjYXB0dXJlX2ZufCB0byB0cmFuc2Zvcm0gdGhlCi0gICAgY2FwdHVyZWQgdmFsdWUuCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfZm4sIGNhcHR1cmVfZm49Tm9uZSk6Ci0gICAgICAgIHNlbGYuX21hdGNoX2ZuID0gbWF0Y2hfZm4KLSAgICAgICAgc2VsZi5fY2FwdHVyZV9mbiA9IGNhcHR1cmVfZm4KLSAgICAgICAgc2VsZi5fdmFsdWUgPSBOb25lCi0KLSAgICBkZWYgX19jYWxsX18oc2VsZiwgb2JqKToKLSAgICAgICAgaWYgc2VsZi5fbWF0Y2hfZm4ob2JqKSAhPSBUcnVlOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAgICAgaWYgc2VsZi5fY2FwdHVyZV9mbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gc2VsZi5fY2FwdHVyZV9mbihvYmopCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl92YWx1ZSA9IG9iagotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIGdldChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCmRpZmYgLS1naXQgYS9nZC9jZXJ0L2NhcHR1cmVzLnB5IGIvZ2QvY2VydC9jYXB0dXJlcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhNWI2OC4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2NhcHR1cmVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgYXMgYnRfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBsMmNhcF9wYWNrZXRzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgQ29tbWFuZENvZGUsIExlQ29tbWFuZENvZGUKLWZyb20gY2VydC5jYXB0dXJlIGltcG9ydCBDYXB0dXJlCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEhjaU1hdGNoZXJzCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEwyY2FwTWF0Y2hlcnMKLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgU2VjdXJpdHlNYXRjaGVycwotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBVaU1zZ1R5cGUKLQotCi1jbGFzcyBIYWxDYXB0dXJlcyhvYmplY3QpOgotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBSZWFkQmRBZGRyQ29tcGxldGVDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogcGFja2V0LnBheWxvYWRbMDo1XSA9PSBiJ1x4MGVceDBhXHgwMVx4MDlceDEwJywgbGFtYmRhIHBhY2tldDogaGNpX3BhY2tldHMuUmVhZEJkQWRkckNvbXBsZXRlVmlldygKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Db21tYW5kQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QocGFja2V0LnBheWxvYWQpKSkpKSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ29ubmVjdGlvblJlcXVlc3RDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogcGFja2V0LnBheWxvYWRbMDoyXSA9PSBiJ1x4MDRceDBhJywgbGFtYmRhIHBhY2tldDogaGNpX3BhY2tldHMuQ29ubmVjdGlvblJlcXVlc3RWaWV3KAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkV2ZW50VmlldyhidF9wYWNrZXRzLlBhY2tldFZpZXdMaXR0bGVFbmRpYW4obGlzdChwYWNrZXQucGF5bG9hZCkpKSkpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBwYWNrZXQucGF5bG9hZFswOjNdID09IGInXHgwM1x4MGJceDAwJywgbGFtYmRhIHBhY2tldDogaGNpX3BhY2tldHMuQ29ubmVjdGlvbkNvbXBsZXRlVmlldygKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QocGFja2V0LnBheWxvYWQpKSkpKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBEaXNjb25uZWN0aW9uQ29tcGxldGVDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogcGFja2V0LnBheWxvYWRbMDoyXSA9PSBiJ1x4MDVceDA0JywgbGFtYmRhIHBhY2tldDogaGNpX3BhY2tldHMuRGlzY29ubmVjdGlvbkNvbXBsZXRlVmlldygKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QocGFja2V0LnBheWxvYWQpKSkpKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBMZUNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBwYWNrZXQucGF5bG9hZFswXSA9PSAweDNlIGFuZCAocGFja2V0LnBheWxvYWRbMl0gPT0gMHgwMSBvciBwYWNrZXQucGF5bG9hZFsyXSA9PSAweDBhKSwKLSAgICAgICAgICAgIGxhbWJkYSBwYWNrZXQ6IGhjaV9wYWNrZXRzLkxlQ29ubmVjdGlvbkNvbXBsZXRlVmlldygKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5MZU1ldGFFdmVudFZpZXcoCi0gICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkV2ZW50VmlldyhidF9wYWNrZXRzLlBhY2tldFZpZXdMaXR0bGVFbmRpYW4obGlzdChwYWNrZXQucGF5bG9hZCkpKSkpKQotCi0KLWNsYXNzIEhjaUNhcHR1cmVzKG9iamVjdCk6Ci0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFJlYWRMb2NhbE9vYkRhdGFDb21wbGV0ZUNhcHR1cmUoKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoCi0gICAgICAgICAgICBIY2lNYXRjaGVycy5Db21tYW5kQ29tcGxldGUoaGNpX3BhY2tldHMuT3BDb2RlLlJFQURfTE9DQUxfT09CX0RBVEEpLAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogSGNpTWF0Y2hlcnMuRXh0cmFjdE1hdGNoaW5nQ29tbWFuZENvbXBsZXRlKHBhY2tldC5wYXlsb2FkLCBoY2lfcGFja2V0cy5PcENvZGUuUkVBRF9MT0NBTF9PT0JfREFUQSkKLSAgICAgICAgKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBSZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFDb21wbGV0ZUNhcHR1cmUoKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoCi0gICAgICAgICAgICBIY2lNYXRjaGVycy5Db21tYW5kQ29tcGxldGUoaGNpX3BhY2tldHMuT3BDb2RlLlJFQURfTE9DQUxfT09CX0VYVEVOREVEX0RBVEEpLAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogSGNpTWF0Y2hlcnMuRXh0cmFjdE1hdGNoaW5nQ29tbWFuZENvbXBsZXRlKHBhY2tldC5wYXlsb2FkLCBoY2lfcGFja2V0cy5PcENvZGUuUkVBRF9MT0NBTF9PT0JfRVhURU5ERURfREFUQSkKLSAgICAgICAgKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBSZWFkQmRBZGRyQ29tcGxldGVDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgSGNpTWF0Y2hlcnMuQ29tbWFuZENvbXBsZXRlKGhjaV9wYWNrZXRzLk9wQ29kZS5SRUFEX0JEX0FERFIpLAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogaGNpX3BhY2tldHMuUmVhZEJkQWRkckNvbXBsZXRlVmlldyhIY2lNYXRjaGVycy5FeHRyYWN0TWF0Y2hpbmdDb21tYW5kQ29tcGxldGUocGFja2V0LnBheWxvYWQsIGhjaV9wYWNrZXRzLk9wQ29kZS5SRUFEX0JEX0FERFIpKSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ29ubmVjdGlvblJlcXVlc3RDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShoY2lfcGFja2V0cy5FdmVudENvZGUuQ09OTkVDVElPTl9SRVFVRVNUKSwKLSAgICAgICAgICAgIGxhbWJkYSBwYWNrZXQ6IGhjaV9wYWNrZXRzLkNvbm5lY3Rpb25SZXF1ZXN0VmlldygKLSAgICAgICAgICAgICAgICBIY2lNYXRjaGVycy5FeHRyYWN0RXZlbnRXaXRoQ29kZShwYWNrZXQucGF5bG9hZCwgaGNpX3BhY2tldHMuRXZlbnRDb2RlLkNPTk5FQ1RJT05fUkVRVUVTVCkpKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBDb25uZWN0aW9uQ29tcGxldGVDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShoY2lfcGFja2V0cy5FdmVudENvZGUuQ09OTkVDVElPTl9DT01QTEVURSksCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBoY2lfcGFja2V0cy5Db25uZWN0aW9uQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgIEhjaU1hdGNoZXJzLkV4dHJhY3RFdmVudFdpdGhDb2RlKHBhY2tldC5wYXlsb2FkLCBoY2lfcGFja2V0cy5FdmVudENvZGUuQ09OTkVDVElPTl9DT01QTEVURSkpKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBEaXNjb25uZWN0aW9uQ29tcGxldGVDYXB0dXJlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShoY2lfcGFja2V0cy5FdmVudENvZGUuRElTQ09OTkVDVElPTl9DT01QTEVURSksCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBoY2lfcGFja2V0cy5EaXNjb25uZWN0aW9uQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgIEhjaU1hdGNoZXJzLkV4dHJhY3RFdmVudFdpdGhDb2RlKHBhY2tldC5wYXlsb2FkLCBoY2lfcGFja2V0cy5FdmVudENvZGUuRElTQ09OTkVDVElPTl9DT01QTEVURSkpKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBMZUNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoSGNpTWF0Y2hlcnMuTGVDb25uZWN0aW9uQ29tcGxldGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogSGNpTWF0Y2hlcnMuRXh0cmFjdExlQ29ubmVjdGlvbkNvbXBsZXRlKHBhY2tldC5wYXlsb2FkKSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgU2ltcGxlUGFpcmluZ0NvbXBsZXRlQ2FwdHVyZSgpOgotICAgICAgICByZXR1cm4gQ2FwdHVyZShIY2lNYXRjaGVycy5FdmVudFdpdGhDb2RlKGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5TSU1QTEVfUEFJUklOR19DT01QTEVURSksCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBoY2lfcGFja2V0cy5TaW1wbGVQYWlyaW5nQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgIEhjaU1hdGNoZXJzLkV4dHJhY3RFdmVudFdpdGhDb2RlKHBhY2tldC5wYXlsb2FkLCBoY2lfcGFja2V0cy5FdmVudENvZGUuU0lNUExFX1BBSVJJTkdfQ09NUExFVEUpKSkKLQotCi1jbGFzcyBMMmNhcENhcHR1cmVzKG9iamVjdCk6Ci0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbm5lY3Rpb25SZXF1ZXN0KHBzbSk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKEwyY2FwTWF0Y2hlcnMuQ29ubmVjdGlvblJlcXVlc3QocHNtKSwgTDJjYXBDYXB0dXJlcy5fZXh0cmFjdF9jb25uZWN0aW9uX3JlcXVlc3QpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9leHRyYWN0X2Nvbm5lY3Rpb25fcmVxdWVzdChwYWNrZXQpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBDb21tYW5kQ29kZS5DT05ORUNUSU9OX1JFUVVFU1QpCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25SZXF1ZXN0VmlldyhmcmFtZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ29ubmVjdGlvblJlc3BvbnNlKHNjaWQpOgotICAgICAgICByZXR1cm4gQ2FwdHVyZShMMmNhcE1hdGNoZXJzLkNvbm5lY3Rpb25SZXNwb25zZShzY2lkKSwgTDJjYXBDYXB0dXJlcy5fZXh0cmFjdF9jb25uZWN0aW9uX3Jlc3BvbnNlKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfZXh0cmFjdF9jb25uZWN0aW9uX3Jlc3BvbnNlKHBhY2tldCk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5jb250cm9sX2ZyYW1lX3dpdGhfY29kZShwYWNrZXQsIENvbW1hbmRDb2RlLkNPTk5FQ1RJT05fUkVTUE9OU0UpCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25SZXNwb25zZVZpZXcoZnJhbWUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbmZpZ3VyYXRpb25SZXF1ZXN0KGNpZD1Ob25lKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoTDJjYXBNYXRjaGVycy5Db25maWd1cmF0aW9uUmVxdWVzdChjaWQpLCBMMmNhcENhcHR1cmVzLl9leHRyYWN0X2NvbmZpZ3VyYXRpb25fcmVxdWVzdCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2V4dHJhY3RfY29uZmlndXJhdGlvbl9yZXF1ZXN0KHBhY2tldCk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5jb250cm9sX2ZyYW1lX3dpdGhfY29kZShwYWNrZXQsIENvbW1hbmRDb2RlLkNPTkZJR1VSQVRJT05fUkVRVUVTVCkKLSAgICAgICAgcmV0dXJuIGwyY2FwX3BhY2tldHMuQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3KGZyYW1lKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0KHBzbSk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5DcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0KHBzbSksIEwyY2FwQ2FwdHVyZXMuX2V4dHJhY3RfY3JlZGl0X2Jhc2VkX2Nvbm5lY3Rpb25fcmVxdWVzdCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2V4dHJhY3RfY3JlZGl0X2Jhc2VkX2Nvbm5lY3Rpb25fcmVxdWVzdChwYWNrZXQpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMubGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBMZUNvbW1hbmRDb2RlLkxFX0NSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QpCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVxdWVzdFZpZXcoZnJhbWUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlKCk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKEwyY2FwTWF0Y2hlcnMuQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgTDJjYXBDYXB0dXJlcy5fZXh0cmFjdF9jcmVkaXRfYmFzZWRfY29ubmVjdGlvbl9yZXNwb25zZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2V4dHJhY3RfY3JlZGl0X2Jhc2VkX2Nvbm5lY3Rpb25fcmVzcG9uc2UocGFja2V0KToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmxlX2NvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgTGVDb21tYW5kQ29kZS5MRV9DUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVNQT05TRSkKLSAgICAgICAgcmV0dXJuIGwyY2FwX3BhY2tldHMuTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVZpZXcoZnJhbWUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnQodHlwZSk6Ci0gICAgICAgIHJldHVybiBDYXB0dXJlKEwyY2FwTWF0Y2hlcnMuTGlua1NlY3VyaXR5SW50ZXJmYWNlQ2FsbGJhY2tFdmVudCh0eXBlKSwgTDJjYXBDYXB0dXJlcy5fZXh0cmFjdF9hZGRyZXNzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfZXh0cmFjdF9hZGRyZXNzKHBhY2tldCk6Ci0gICAgICAgIHJldHVybiBwYWNrZXQuYWRkcmVzcwotCi0KLWNsYXNzIFNlY3VyaXR5Q2FwdHVyZXMob2JqZWN0KToKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRGlzcGxheVBhc3NrZXkoKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUoU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZKSwgU2VjdXJpdHlDYXB0dXJlcy5fZXh0cmFjdF9wYXNza2V5KQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfZXh0cmFjdF9wYXNza2V5KGV2ZW50KToKLSAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBldmVudC5udW1lcmljX3ZhbHVlCmRpZmYgLS1naXQgYS9nZC9jZXJ0L2NlcnRfc2VsZl90ZXN0LnB5IGIvZ2QvY2VydC9jZXJ0X3NlbGZfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0MzA1ZS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2NlcnRfc2VsZl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQotaW1wb3J0IGxvZ2dpbmcKLWZyb20gdGhyZWFkaW5nIGltcG9ydCBUaW1lcgotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKLQotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotCi1mcm9tIGFjdHMgaW1wb3J0IHNpZ25hbHMKLWZyb20gYWN0cy5iYXNlX3Rlc3QgaW1wb3J0IEJhc2VUZXN0Q2xhc3MKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBsMmNhcF9wYWNrZXRzCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBFdmVudFN0cmVhbSwgRmlsdGVyaW5nRXZlbnRTdHJlYW0KLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBjZXJ0Lm1ldGFkYXRhIGltcG9ydCBtZXRhZGF0YQotZnJvbSBjZXJ0LmJlaGF2aW9yIGltcG9ydCB3aGVuLCB3YWl0X3VudGlsCi1mcm9tIGNlcnQuYmVoYXZpb3IgaW1wb3J0IElIYXNCZWhhdmlvcnMKLWZyb20gY2VydC5iZWhhdmlvciBpbXBvcnQgYW55dGhpbmcKLWZyb20gY2VydC5iZWhhdmlvciBpbXBvcnQgU2luZ2xlQXJndW1lbnRCZWhhdmlvcgotZnJvbSBjZXJ0LmJlaGF2aW9yIGltcG9ydCBSZXBseVN0YWdlCi1mcm9tIGNlcnQuY2VydF9zZWxmX3Rlc3RfbGliIGltcG9ydCAqCi0KLQotY2xhc3MgQ2VydFNlbGZUZXN0KEJhc2VUZXN0Q2xhc3MpOgotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiB0ZXN0X2Fzc2VydF9vY2N1cnNfYXRfbGVhc3RfcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydF9vY2N1cnNfYXRfbGVhc3RfcGFzc2VzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0X29jY3Vyc19wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0X29jY3Vyc19wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRfb2NjdXJzX2ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydF9vY2N1cnNfZmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRfb2NjdXJzX2F0X21vc3RfcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydF9vY2N1cnNfYXRfbW9zdF9wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRfb2NjdXJzX2F0X21vc3RfZmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0X29jY3Vyc19hdF9tb3N0X2ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3Rfc2tpcF9hX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHRlc3Rfc2tpcF9hX3Rlc3RfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9uZXN0ZWRfcGFja2V0cyhzZWxmKToKLSAgICAgICAgdGVzdF9uZXN0ZWRfcGFja2V0c19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2wyY2FwX2NvbmZpZ19vcHRpb25zKHNlbGYpOgotICAgICAgICB0ZXN0X2wyY2FwX2NvbmZpZ19vcHRpb25zX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9ib29sZWFuX3N1Y2Nlc3Moc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ib29sZWFuX3N1Y2Nlc3NfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2Jvb2xlYW5fZmFsc2VJc1RydWUoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ib29sZWFuX2ZhbHNlSXNUcnVlX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9ib29sZWFuX3RydWVJc0ZhbHNlKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfYm9vbGVhbl90cnVlSXNGYWxzZV9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X3N1Y2Nlc3Moc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3Rfc3VjY2Vzc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzRXF1YWxUb0ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzRXF1YWxUb0ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNOb3RFcXVhbFRvRmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNOb3RFcXVhbFRvRmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9pc05vbmVGYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9pc05vbmVGYWlsc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzTm90Tm9uZUZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzTm90Tm9uZUZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c19wYXNzZXMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c19wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX3RoZW5fcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfdGhlbl9wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX2ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfZmFpbHNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX3RoZW5fZmFpbHMoc2VsZik6Ci0gICAgICAgIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c190aGVuX2ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c0luT3JkZXJfcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbk9yZGVyX3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbkFueU9yZGVyX3Bhc3NlcyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzSW5BbnlPcmRlcl9wYXNzZXNfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzSW5PcmRlcl9mYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzSW5PcmRlcl9mYWlsc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbkFueU9yZGVyX2ZhaWxzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbkFueU9yZGVyX2ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3Bhc3Nlc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3Bhc3Nlc19hZnRlcl8xX3NlY29uZChzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV9wYXNzZXNfYWZ0ZXJfMV9zZWNvbmRfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV9mYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV9mYWlsc19jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3plcm9fcGFzc2VzKHNlbGYpOgotICAgICAgICB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3plcm9fcGFzc2VzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfemVyb19wYXNzZXNfYWZ0ZXJfb25lX3NlY29uZChzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV96ZXJvX3Bhc3Nlc19hZnRlcl9vbmVfc2Vjb25kX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfemVyb19mYWlscyhzZWxmKToKLSAgICAgICAgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV96ZXJvX2ZhaWxzX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmlsdGVyaW5nX2V2ZW50X3N0cmVhbV9ub25lX2ZpbHRlcl9mdW5jdGlvbihzZWxmKToKLSAgICAgICAgdGVzdF9maWx0ZXJpbmdfZXZlbnRfc3RyZWFtX25vbmVfZmlsdGVyX2Z1bmN0aW9uX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfbWV0YWRhdGFfZW1wdHkoc2VsZik6Ci0KLSAgICAgICAgQG1ldGFkYXRhKCkKLSAgICAgICAgZGVmIHNpbXBsZV9wYXNzX3Rlc3QoYXJnKToKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaW1wbGVfcGFzc190ZXN0KDEpCi0gICAgICAgIGV4Y2VwdCBzaWduYWxzLlRlc3RGYWlsdXJlOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkBtZXRhZGF0YSgpIHNob3VsZCBvbmx5IHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHJhaXNlZCAlcyB3aXRoIG1zZyAlcyBpbnN0ZWFkIiAlIChlLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKGUpKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiQG1ldGFkYXRhKCkgc2hvdWxkIG5vdCB3b3JrIikKLQotICAgIGRlZiB0ZXN0X21ldGFkYXRhX2VtcHR5X25vX2Z1bmN0aW9uX2NhbGwoc2VsZik6Ci0KLSAgICAgICAgQG1ldGFkYXRhCi0gICAgICAgIGRlZiBzaW1wbGVfcGFzc190ZXN0KGFyZyk6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2ltcGxlX3Bhc3NfdGVzdCgxKQotICAgICAgICBleGNlcHQgc2lnbmFscy5UZXN0RmFpbHVyZToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJAbWV0YWRhdGEgc2hvdWxkIG9ubHkgcmFpc2Ugc2lnbmFscy5UZXN0RmFpbHVyZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgcmFpc2VkICVzIHdpdGggbXNnICVzIGluc3RlYWQiICUgKGUuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoZSkpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJAbWV0YWRhdGEgc2hvdWxkIG5vdCB3b3JrIikKLQotICAgIGRlZiB0ZXN0X21ldGFkYXRhX3B0c19taXNzaW5nX2lkKHNlbGYpOgotCi0gICAgICAgIEBtZXRhZGF0YShwdHNfdGVzdF9uYW1lPSJIZWxsbyB3b3JsZCIpCi0gICAgICAgIGRlZiBzaW1wbGVfcGFzc190ZXN0KGFyZyk6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2ltcGxlX3Bhc3NfdGVzdCgxKQotICAgICAgICBleGNlcHQgc2lnbmFscy5UZXN0RmFpbHVyZToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJzaG91bGQgb25seSByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCByYWlzZWQgJXMgd2l0aCBtc2cgJXMgaW5zdGVhZCIgJSAoZS5fX2NsYXNzX18uX19uYW1lX18sIHN0cihlKSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIm1pc3NpbmcgcHRzX3Rlc3RfaWQgc2hvdWxkIG5vdCB3b3JrIikKLQotICAgIGRlZiB0ZXN0X21ldGFkYXRhX3B0c19taXNzaW5nX25hbWUoc2VsZik6Ci0KLSAgICAgICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJBL0IvQyIpCi0gICAgICAgIGRlZiBzaW1wbGVfcGFzc190ZXN0KGFyZyk6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2ltcGxlX3Bhc3NfdGVzdCgxKQotICAgICAgICBleGNlcHQgc2lnbmFscy5UZXN0RmFpbHVyZToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJzaG91bGQgb25seSByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCByYWlzZWQgJXMgd2l0aCBtc2cgJXMgaW5zdGVhZCIgJSAoZS5fX2NsYXNzX18uX19uYW1lX18sIHN0cihlKSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIm1pc3NpbmcgcHRzX3Rlc3RfbmFtZSBzaG91bGQgbm90IHdvcmsiKQotCi0gICAgZGVmIHRlc3RfbWV0YWRhdGFfcHRzX3Rlc3RfaWRfYW5kX2Rlc2NyaXB0aW9uKHNlbGYpOgotCi0gICAgICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iQS9CL0MiLCBwdHNfdGVzdF9uYW1lPSJIZWxsbyB3b3JsZCIpCi0gICAgICAgIGRlZiBzaW1wbGVfcGFzc190ZXN0KGFyZyk6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2ltcGxlX3Bhc3NfdGVzdCgxKQotICAgICAgICBleGNlcHQgc2lnbmFscy5UZXN0UGFzcyBhcyBlOgotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgicHRzX3Rlc3RfaWQiIGluIGUuZXh0cmFzLCBtc2c9KCJwdHNfdGVzdF9pZCBub3QgaW4gZXh0cmE6ICVzIiAlIHN0cihlLmV4dHJhcykpKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoZS5leHRyYXNbInB0c190ZXN0X2lkIl0sICJBL0IvQyIpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKCJwdHNfdGVzdF9uYW1lIiBpbiBlLmV4dHJhcywgbXNnPSgicHRzX3Rlc3RfbmFtZSBub3QgaW4gZXh0cmE6ICVzIiAlIHN0cihlLmV4dHJhcykpKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfZXF1YWwoZS5leHRyYXNbInB0c190ZXN0X25hbWUiXSwgIkhlbGxvIHdvcmxkIikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiTXVzdCB0aHJvdyBhbiBleGNlcHRpb24gdXNpbmcgQG1ldGFkYXRhIGRlY29yYXRvciIpCi0KLSAgICBkZWYgdGVzdF9tZXRhZGF0YV90ZXN0X3dpdGhfZXhjZXB0aW9uX3N0YWNrdHJhY2Uoc2VsZik6Ci0KLSAgICAgICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJBL0IvQyIsIHB0c190ZXN0X25hbWU9IkhlbGxvIHdvcmxkIikKLSAgICAgICAgZGVmIHNpbXBsZV9mYWlsX3Rlc3QoZmFpbHVyZV9hcmd1bWVudCk6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGZhaWx1cmVfYXJndW1lbnQpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2ltcGxlX2ZhaWxfdGVzdCgiQkVFRkJFRUYiKQotICAgICAgICBleGNlcHQgc2lnbmFscy5UZXN0RXJyb3IgYXMgZToKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoInB0c190ZXN0X2lkIiBpbiBlLmV4dHJhcywgbXNnPSgicHRzX3Rlc3RfaWQgbm90IGluIGV4dHJhOiAlcyIgJSBzdHIoZS5leHRyYXMpKSkKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X2VxdWFsKGUuZXh0cmFzWyJwdHNfdGVzdF9pZCJdLCAiQS9CL0MiKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgicHRzX3Rlc3RfbmFtZSIgaW4gZS5leHRyYXMsIG1zZz0oInB0c190ZXN0X25hbWUgbm90IGluIGV4dHJhOiAlcyIgJSBzdHIoZS5leHRyYXMpKSkKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X2VxdWFsKGUuZXh0cmFzWyJwdHNfdGVzdF9uYW1lIl0sICJIZWxsbyB3b3JsZCIpCi0gICAgICAgICAgICB0cmFjZV9zdHIgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICAgICAgICAgICJyYWlzZSBWYWx1ZUVycm9yKGZhaWx1cmVfYXJndW1lbnQpIiBpbiB0cmFjZV9zdHIsCi0gICAgICAgICAgICAgICAgbXNnPSJGYWlsZWQgdGVzdCBtZXRob2Qgbm90IGluIGVycm9yIHN0YWNrIHRyYWNlOiAlcyIgJSB0cmFjZV9zdHIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIk11c3QgdGhyb3cgYW4gZXhjZXB0aW9uIHVzaW5nIEBtZXRhZGF0YSBkZWNvcmF0b3IiKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX3NpbXBsZShzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3Jfc2ltcGxlX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3NpbmdsZV9fY2FwdHVyZXNfb25lKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fdGhlbl9zaW5nbGVfX2NhcHR1cmVzX29uZV9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fdGhlbl90aW1lc19fY2FwdHVyZXNfYWxsKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fdGhlbl90aW1lc19fY2FwdHVyZXNfYWxsX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19hbHdheXNfX2NhcHR1cmVzX2FsbChzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX2Fsd2F5c19fY2FwdHVyZXNfYWxsX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19tYXRjaGVyX19jYXB0dXJlc19yZWxldmFudChzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX21hdGNoZXJfX2NhcHR1cmVzX3JlbGV2YW50X2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3JlcGVhdGVkX19jYXB0dXJlc19yZWxldmFudChzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3RoZW5fcmVwZWF0ZWRfX2NhcHR1cmVzX3JlbGV2YW50X2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19mYWxsYmFja19fY2FwdHVyZXNfcmVsZXZhbnQoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19mYWxsYmFja19fY2FwdHVyZXNfcmVsZXZhbnRfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX2RlZmF1bHRfdW5oYW5kbGVkX2NyYXNoKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fZGVmYXVsdF91bmhhbmRsZWRfY3Jhc2hfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3NldF9kZWZhdWx0X3dvcmtzKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fc2V0X2RlZmF1bHRfd29ya3NfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZShzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX2RpZmZlcmVudF9sYW1iZGEoc2VsZik6Ci0gICAgICAgIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfZGlmZmVyZW50X2xhbWJkYV9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX2FueXRoaW5nKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX2FueXRoaW5nX2NvcmUoKQotCi0gICAgZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfbm90X2hhcHBlbmVkKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX25vdF9oYXBwZW5lZF9jb3JlKCkKLQotICAgIGRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX3dpdGhfZGVmYXVsdChzZWxmKToKLSAgICAgICAgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV93aXRoX2RlZmF1bHRfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV90d29fZXZlbnRzX0FBKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX3R3b19ldmVudHNfQUFfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV90d29fZXZlbnRzX0FCKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX3R3b19ldmVudHNfQUJfY29yZSgpCi0KLSAgICBkZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9vbmx5X29uZV9ldmVudF9pc19kb25lKHNlbGYpOgotICAgICAgICB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX29ubHlfb25lX2V2ZW50X2lzX2RvbmVfY29yZSgpCmRpZmYgLS1naXQgYS9nZC9jZXJ0L2NlcnRfc2VsZl90ZXN0X2xpYi5weSBiL2dkL2NlcnQvY2VydF9zZWxmX3Rlc3RfbGliLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njc2MjM4Li4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvY2VydF9zZWxmX3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQotaW1wb3J0IGxvZ2dpbmcKLWZyb20gdGhyZWFkaW5nIGltcG9ydCBUaW1lcgotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKLQotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGwyY2FwX3BhY2tldHMKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtLCBGaWx0ZXJpbmdFdmVudFN0cmVhbQotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGNlcnQuYmVoYXZpb3IgaW1wb3J0IHdoZW4sIHdhaXRfdW50aWwKLWZyb20gY2VydC5iZWhhdmlvciBpbXBvcnQgSUhhc0JlaGF2aW9ycwotZnJvbSBjZXJ0LmJlaGF2aW9yIGltcG9ydCBhbnl0aGluZwotZnJvbSBjZXJ0LmJlaGF2aW9yIGltcG9ydCBTaW5nbGVBcmd1bWVudEJlaGF2aW9yCi1mcm9tIGNlcnQuYmVoYXZpb3IgaW1wb3J0IFJlcGx5U3RhZ2UKLQotCi1jbGFzcyBCb2d1c1Byb3RvOgotCi0gICAgY2xhc3MgQm9ndXNUeXBlOgotCi0gICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYubmFtZSA9ICJCb2d1c1Byb3RvIgotICAgICAgICAgICAgc2VsZi5pc19leHRlbnNpb24gPSBGYWxzZQotICAgICAgICAgICAgc2VsZi5jcHBfdHlwZSA9IEZhbHNlCi0KLSAgICAgICAgZGVmIHR5cGUoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gJ0JvZ3VzUnBjJwotCi0gICAgICAgIGRlZiBsYWJlbChzZWxmKToKLSAgICAgICAgICAgIHJldHVybiAibGFiZWwiCi0KLSAgICBjbGFzcyBCb2d1c0Rlc2NyaXB0b3I6Ci0KLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgICAgICAgICAgc2VsZi5mdWxsX25hbWUgPSBuYW1lCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotICAgICAgICBzZWxmLnZhbHVlXyA9IHZhbHVlCi0gICAgICAgIHNlbGYuREVTQ1JJUFRPUiA9IEJvZ3VzUHJvdG8uQm9ndXNEZXNjcmlwdG9yKHN0cih2YWx1ZSkpCi0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICJCb2d1c1JwYyB2YWx1ZSA9ICIgKyBzdHIoc2VsZi52YWx1ZV8pCi0KLSAgICBkZWYgTGlzdEZpZWxkcyhzZWxmKToKLSAgICAgICAgZm9yIGZpZWxkIGluIFtCb2d1c1Byb3RvLkJvZ3VzVHlwZSgpXToKLSAgICAgICAgICAgIHlpZWxkIFtmaWVsZCwgc2VsZi52YWx1ZV9dCi0KLQotY2xhc3MgRmV0Y2hFdmVudHM6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZXZlbnRzLCBkZWxheV9tcyk6Ci0gICAgICAgIHNlbGYuZXZlbnRzXyA9IGV2ZW50cwotICAgICAgICBzZWxmLnNsZWVwX3RpbWVfID0gKGRlbGF5X21zICogMS4wKSAvIDEwMDAKLSAgICAgICAgc2VsZi5pbmRleF8gPSAwCi0gICAgICAgIHNlbGYuZG9uZV8gPSBGYWxzZQotICAgICAgICBzZWxmLnRoZW5fID0gZGF0ZXRpbWUubm93KCkKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYuZXZlbnRzXzoKLSAgICAgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5zbGVlcF90aW1lXykKLSAgICAgICAgICAgIGlmIHNlbGYuZG9uZV86Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ5aWVsZGluZyAlZCIgJSBldmVudCkKLSAgICAgICAgICAgIHlpZWxkIEJvZ3VzUHJvdG8oZXZlbnQpCi0KLSAgICBkZWYgZG9uZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZG9uZV8KLQotICAgIGRlZiBjYW5jZWwoc2VsZik6Ci0gICAgICAgIGxvZ2dpbmcuZGVidWcoImNhbmNlbCIpCi0gICAgICAgIHNlbGYuZG9uZV8gPSBUcnVlCi0gICAgICAgIHJldHVybiBOb25lCi0KLQotY2xhc3MgVGVzdEJlaGF2aW9ycyhvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6Ci0gICAgICAgIHNlbGYudGVzdF9yZXF1ZXN0X2JlaGF2aW9yID0gU2luZ2xlQXJndW1lbnRCZWhhdmlvcihsYW1iZGE6IFRlc3RCZWhhdmlvcnMuVGVzdFJlcXVlc3RSZXBseVN0YWdlKHBhcmVudCkpCi0KLSAgICBkZWYgdGVzdF9yZXF1ZXN0KHNlbGYsIG1hdGNoZXIpOgotICAgICAgICByZXR1cm4gc2VsZi50ZXN0X3JlcXVlc3RfYmVoYXZpb3IuYmVnaW4obWF0Y2hlcikKLQotICAgIGNsYXNzIFRlc3RSZXF1ZXN0UmVwbHlTdGFnZShSZXBseVN0YWdlKToKLQotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50KToKLSAgICAgICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudAotCi0gICAgICAgIGRlZiBpbmNyZW1lbnRfY291bnQoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLl9jb21taXQobGFtYmRhIG9iajogc2VsZi5faW5jcmVtZW50X2NvdW50KG9iaikpCi0gICAgICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgICAgIGRlZiBfaW5jcmVtZW50X2NvdW50KHNlbGYsIG9iaik6Ci0gICAgICAgICAgICBzZWxmLl9wYXJlbnQuY291bnQgKz0gMQotICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNhcHR1cmVkLmFwcGVuZChvYmopCi0KLQotY2xhc3MgT2JqZWN0V2l0aEJlaGF2aW9ycyhJSGFzQmVoYXZpb3JzKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5iZWhhdmlvcnMgPSBUZXN0QmVoYXZpb3JzKHNlbGYpCi0gICAgICAgIHNlbGYuY291bnQgPSAwCi0gICAgICAgIHNlbGYuY2FwdHVyZWQgPSBbXQotICAgICAgICBzZWxmLnVuaGFuZGxlZF9jb3VudCA9IDAKLQotICAgIGRlZiBnZXRfYmVoYXZpb3JzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5iZWhhdmlvcnMKLQotICAgIGRlZiBpbmNyZW1lbnRfdW5oYW5kbGVkKHNlbGYpOgotICAgICAgICBzZWxmLnVuaGFuZGxlZF9jb3VudCArPSAxCi0KLQotZGVmIHRlc3RfYXNzZXJ0X29jY3Vyc19hdF9sZWFzdF9wYXNzZXNfY29yZSgpOgotICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxLCAyLCAzLCAxLCAyLCAzXSwgZGVsYXlfbXM9NDApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgIGV2ZW50X3N0cmVhbS5hc3NlcnRfZXZlbnRfb2NjdXJzKAotICAgICAgICAgICAgbGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDEsIHRpbWVvdXQ9dGltZWRlbHRhKG1pbGxpc2Vjb25kcz0zMDApLCBhdF9sZWFzdF90aW1lcz0yKQotCi0KLWRlZiB0ZXN0X2Fzc2VydF9vY2N1cnNfcGFzc2VzX2NvcmUoKToKLSAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bMSwgMiwgM10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICBldmVudF9zdHJlYW0uYXNzZXJ0X2V2ZW50X29jY3VycyhsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gMSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xKSkKLQotCi1kZWYgdGVzdF9hc3NlcnRfb2NjdXJzX2ZhaWxzX2NvcmUoKToKLSAgICB0cnk6Ci0gICAgICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxLCAyLCAzXSwgZGVsYXlfbXM9NTApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgICAgICBldmVudF9zdHJlYW0uYXNzZXJ0X2V2ZW50X29jY3VycyhsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gNCwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xKSkKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgIGxvZ2dpbmcuZGVidWcoZSkKLSAgICAgICAgcmV0dXJuIFRydWUgICMgRmFpbGVkIGFzIGV4cGVjdGVkCi0gICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHRlc3RfYXNzZXJ0X29jY3Vyc19hdF9tb3N0X3Bhc3Nlc19jb3JlKCk6Ci0gICAgd2l0aCBFdmVudFN0cmVhbShGZXRjaEV2ZW50cyhldmVudHM9WzEsIDIsIDMsIDRdLCBkZWxheV9tcz01MCkpIGFzIGV2ZW50X3N0cmVhbToKLSAgICAgICAgZXZlbnRfc3RyZWFtLmFzc2VydF9ldmVudF9vY2N1cnNfYXRfbW9zdCgKLSAgICAgICAgICAgIGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA8IDQsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MSksIGF0X21vc3RfdGltZXM9MykKLQotCi1kZWYgdGVzdF9hc3NlcnRfb2NjdXJzX2F0X21vc3RfZmFpbHNfY29yZSgpOgotICAgIHRyeToKLSAgICAgICAgd2l0aCBFdmVudFN0cmVhbShGZXRjaEV2ZW50cyhldmVudHM9WzEsIDIsIDMsIDRdLCBkZWxheV9tcz01MCkpIGFzIGV2ZW50X3N0cmVhbToKLSAgICAgICAgICAgIGV2ZW50X3N0cmVhbS5hc3NlcnRfZXZlbnRfb2NjdXJzX2F0X21vc3QoCi0gICAgICAgICAgICAgICAgbGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID4gMSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xKSwgYXRfbW9zdF90aW1lcz0yKQotICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKLSAgICAgICAgbG9nZ2luZy5kZWJ1ZyhlKQotICAgICAgICByZXR1cm4gVHJ1ZSAgIyBGYWlsZWQgYXMgZXhwZWN0ZWQKLSAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgdGVzdF9za2lwX2FfdGVzdF9jb3JlKCk6Ci0gICAgYXNzZXJ0cy5za2lwKCJTa2lwcGluZyB0aGlzIHRlc3QgYmVjYXVzZSBpdCdzIGJsb2NrZWQgYnkgYi94eXoiKQotICAgIGFzc2VydCBGYWxzZQotCi0KLWRlZiB0ZXN0X25lc3RlZF9wYWNrZXRzX2NvcmUoKToKLSAgICBoYW5kbGUgPSAxMjMKLSAgICBpbnNpZGUgPSBoY2lfcGFja2V0cy5SZWFkU2NhbkVuYWJsZUJ1aWxkZXIoKQotICAgIGxvZ2dpbmcuZGVidWcoaW5zaWRlLlNlcmlhbGl6ZSgpKQotICAgIGxvZ2dpbmcuZGVidWcoImJ1aWxkaW5nIG91dHNpZGUiKQotICAgIG91dHNpZGUgPSBoY2lfcGFja2V0cy5BY2xCdWlsZGVyKGhhbmRsZSwgaGNpX3BhY2tldHMuUGFja2V0Qm91bmRhcnlGbGFnLkZJUlNUX05PTl9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Ccm9hZGNhc3RGbGFnLlBPSU5UX1RPX1BPSU5ULCBpbnNpZGUpCi0gICAgbG9nZ2luZy5kZWJ1ZyhvdXRzaWRlLlNlcmlhbGl6ZSgpKQotICAgIGxvZ2dpbmcuZGVidWcoIkRvbmUhIikKLQotCi1kZWYgdGVzdF9sMmNhcF9jb25maWdfb3B0aW9uc19jb3JlKCk6Ci0gICAgbXR1X29wdCA9IGwyY2FwX3BhY2tldHMuTXR1Q29uZmlndXJhdGlvbk9wdGlvbigpCi0gICAgbXR1X29wdC5tdHUgPSAxMjMKLSAgICBmY3Nfb3B0ID0gbDJjYXBfcGFja2V0cy5GcmFtZUNoZWNrU2VxdWVuY2VPcHRpb24oKQotICAgIGZjc19vcHQuZmNzX3R5cGUgPSBsMmNhcF9wYWNrZXRzLkZjc1R5cGUuREVGQVVMVAotICAgIHJlcXVlc3QgPSBsMmNhcF9wYWNrZXRzLkNvbmZpZ3VyYXRpb25SZXF1ZXN0QnVpbGRlcigKLSAgICAgICAgMHgxZCwgICMgQ29tbWFuZCBJRAotICAgICAgICAweGMxZCwgICMgQ2hhbm5lbCBJRAotICAgICAgICBsMmNhcF9wYWNrZXRzLkNvbnRpbnVhdGlvbi5FTkQsCi0gICAgICAgIFttdHVfb3B0LCBmY3Nfb3B0XSkKLSAgICByZXF1ZXN0X2JfZnJhbWUgPSBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVCdWlsZGVyKDB4MDEsIHJlcXVlc3QpCi0gICAgaGFuZGxlID0gMTIzCi0gICAgd3JhcHBlZCA9IGhjaV9wYWNrZXRzLkFjbEJ1aWxkZXIoaGFuZGxlLCBoY2lfcGFja2V0cy5QYWNrZXRCb3VuZGFyeUZsYWcuRklSU1RfTk9OX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsIHJlcXVlc3RfYl9mcmFtZSkKLSAgICAjIFNpemUgaXMgQUNMICg0KSArIEwyQ0FQICg0KSArIENvbmZpZ3VyZSAoOCkgKyBNVFUgKDQpICsgRkNTICgzKQotICAgIGFzc2VydHMuYXNzZXJ0X3RydWUobGVuKHdyYXBwZWQuU2VyaWFsaXplKCkpID09IDIzLCAiUGFja2V0IHNlcmlhbGl6ZWQgaW5jb3JyZWN0bHkiKQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfYm9vbGVhbl9zdWNjZXNzX2NvcmUoKToKLSAgICBhc3NlcnRUaGF0KFRydWUpLmlzVHJ1ZSgpCi0gICAgYXNzZXJ0VGhhdChGYWxzZSkuaXNGYWxzZSgpCi0KLQotZGVmIHRlc3RfYXNzZXJ0VGhhdF9ib29sZWFuX2ZhbHNlSXNUcnVlX2NvcmUoKToKLSAgICB0cnk6Ci0gICAgICAgIGFzc2VydFRoYXQoRmFsc2UpLmlzVHJ1ZSgpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICByZXR1cm4gVHJ1ZQotICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfYm9vbGVhbl90cnVlSXNGYWxzZV9jb3JlKCk6Ci0gICAgdHJ5OgotICAgICAgICBhc3NlcnRUaGF0KFRydWUpLmlzRmFsc2UoKQotICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9zdWNjZXNzX2NvcmUoKToKLSAgICBhc3NlcnRUaGF0KCJ0aGlzIikuaXNFcXVhbFRvKCJ0aGlzIikKLSAgICBhc3NlcnRUaGF0KCJ0aGlzIikuaXNOb3RFcXVhbFRvKCJ0aGF0IikKLSAgICBhc3NlcnRUaGF0KE5vbmUpLmlzTm9uZSgpCi0gICAgYXNzZXJ0VGhhdCgidGhpcyIpLmlzTm90Tm9uZSgpCi0KLQotZGVmIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNFcXVhbFRvRmFpbHNfY29yZSgpOgotICAgIHRyeToKLSAgICAgICAgYXNzZXJ0VGhhdCgidGhpcyIpLmlzRXF1YWxUbygidGhhdCIpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICByZXR1cm4gVHJ1ZQotICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfb2JqZWN0X2lzTm90RXF1YWxUb0ZhaWxzX2NvcmUoKToKLSAgICB0cnk6Ci0gICAgICAgIGFzc2VydFRoYXQoInRoaXMiKS5pc05vdEVxdWFsVG8oInRoaXMiKQotICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X29iamVjdF9pc05vbmVGYWlsc19jb3JlKCk6Ci0gICAgdHJ5OgotICAgICAgICBhc3NlcnRUaGF0KCJ0aGlzIikuaXNOb25lKCkKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgIHJldHVybiBUcnVlCi0gICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHRlc3RfYXNzZXJ0VGhhdF9vYmplY3RfaXNOb3ROb25lRmFpbHNfY29yZSgpOgotICAgIHRyeToKLSAgICAgICAgYXNzZXJ0VGhhdChOb25lKS5pc05vdE5vbmUoKQotICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX3Bhc3Nlc19jb3JlKCk6Ci0gICAgd2l0aCBFdmVudFN0cmVhbShGZXRjaEV2ZW50cyhldmVudHM9WzEsIDIsIDNdLCBkZWxheV9tcz01MCkpIGFzIGV2ZW50X3N0cmVhbToKLSAgICAgICAgYXNzZXJ0VGhhdChldmVudF9zdHJlYW0pLmVtaXRzKGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAxKQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfdGhlbl9wYXNzZXNfY29yZSgpOgotICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxLCAyLCAzXSwgZGVsYXlfbXM9NTApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgIGFzc2VydFRoYXQoZXZlbnRfc3RyZWFtKS5lbWl0cyhsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gMSkudGhlbihsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gMykKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzX2ZhaWxzX2NvcmUoKToKLSAgICB0cnk6Ci0gICAgICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxLCAyLCAzXSwgZGVsYXlfbXM9NTApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHMobGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDQpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICBsb2dnaW5nLmRlYnVnKGUpCi0gICAgICAgIHJldHVybiBUcnVlICAjIEZhaWxlZCBhcyBleHBlY3RlZAotICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNfdGhlbl9mYWlsc19jb3JlKCk6Ci0gICAgdHJ5OgotICAgICAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bMSwgMiwgM10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudF9zdHJlYW0pLmVtaXRzKGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAxKS5lbWl0cyhsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gNCkKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgIGxvZ2dpbmcuZGVidWcoZSkKLSAgICAgICAgcmV0dXJuIFRydWUgICMgRmFpbGVkIGFzIGV4cGVjdGVkCi0gICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHRlc3RfYXNzZXJ0VGhhdF9ldmVudFN0cmVhbV9lbWl0c0luT3JkZXJfcGFzc2VzX2NvcmUoKToKLSAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bMSwgMiwgM10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHMobGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDEsIGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAyKS5pbk9yZGVyKCkKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzSW5BbnlPcmRlcl9wYXNzZXNfY29yZSgpOgotICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxLCAyLCAzXSwgZGVsYXlfbXM9NTApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgIGFzc2VydFRoYXQoZXZlbnRfc3RyZWFtKS5lbWl0cyhsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAxKS5pbkFueU9yZGVyKCkudGhlbihsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gMykKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X2V2ZW50U3RyZWFtX2VtaXRzSW5PcmRlcl9mYWlsc19jb3JlKCk6Ci0gICAgdHJ5OgotICAgICAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bMSwgMiwgM10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudF9zdHJlYW0pLmVtaXRzKGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAyLCBsYW1iZGEgZGF0YTogZGF0YS52YWx1ZV8gPT0gMSkuaW5PcmRlcigpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICBsb2dnaW5nLmRlYnVnKGUpCi0gICAgICAgIHJldHVybiBUcnVlICAjIEZhaWxlZCBhcyBleHBlY3RlZAotICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfZXZlbnRTdHJlYW1fZW1pdHNJbkFueU9yZGVyX2ZhaWxzX2NvcmUoKToKLSAgICB0cnk6Ci0gICAgICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxLCAyLCAzXSwgZGVsYXlfbXM9NTApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHMobGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDQsIGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAxKS5pbkFueU9yZGVyKCkKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgIGxvZ2dpbmcuZGVidWcoZSkKLSAgICAgICAgcmV0dXJuIFRydWUgICMgRmFpbGVkIGFzIGV4cGVjdGVkCi0gICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfcGFzc2VzX2NvcmUoKToKLSAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bMSwgMiwgM10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHNOb25lKAotICAgICAgICAgICAgbGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDQsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MC4xNSkpLnRoZW5Ob25lKAotICAgICAgICAgICAgICAgIGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSA1LCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTAuMTUpKQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3Bhc3Nlc19hZnRlcl8xX3NlY29uZF9jb3JlKCk6Ci0gICAgd2l0aCBFdmVudFN0cmVhbShGZXRjaEV2ZW50cyhldmVudHM9WzEsIDIsIDMsIDRdLCBkZWxheV9tcz00MDApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgIGFzc2VydFRoYXQoZXZlbnRfc3RyZWFtKS5lbWl0c05vbmUobGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDQsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MSkpCi0KLQotZGVmIHRlc3RfYXNzZXJ0VGhhdF9lbWl0c05vbmVfZmFpbHNfY29yZSgpOgotICAgIHRyeToKLSAgICAgICAgd2l0aCBFdmVudFN0cmVhbShGZXRjaEV2ZW50cyhldmVudHM9WzEsIDIsIDNdLCBkZWxheV9tcz01MCkpIGFzIGV2ZW50X3N0cmVhbToKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZXZlbnRfc3RyZWFtKS5lbWl0c05vbmUobGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDIsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MSkpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICBsb2dnaW5nLmRlYnVnKGUpCi0gICAgICAgIHJldHVybiBUcnVlICAjIEZhaWxlZCBhcyBleHBlY3RlZAotICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3plcm9fcGFzc2VzX2NvcmUoKToKLSAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bXSwgZGVsYXlfbXM9NTApKSBhcyBldmVudF9zdHJlYW06Ci0gICAgICAgIGFzc2VydFRoYXQoZXZlbnRfc3RyZWFtKS5lbWl0c05vbmUodGltZW91dD10aW1lZGVsdGEobWlsbGlzZWNvbmRzPTEwKSkudGhlbk5vbmUoCi0gICAgICAgICAgICB0aW1lb3V0PXRpbWVkZWx0YShtaWxsaXNlY29uZHM9MTApKQotCi0KLWRlZiB0ZXN0X2Fzc2VydFRoYXRfZW1pdHNOb25lX3plcm9fcGFzc2VzX2FmdGVyX29uZV9zZWNvbmRfY29yZSgpOgotICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoWzFdLCBkZWxheV9tcz0xNTAwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHNOb25lKHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MS4wKSkKLQotCi1kZWYgdGVzdF9hc3NlcnRUaGF0X2VtaXRzTm9uZV96ZXJvX2ZhaWxzX2NvcmUoKToKLSAgICB0cnk6Ci0gICAgICAgIHdpdGggRXZlbnRTdHJlYW0oRmV0Y2hFdmVudHMoZXZlbnRzPVsxN10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICAgICAgYXNzZXJ0VGhhdChldmVudF9zdHJlYW0pLmVtaXRzTm9uZSh0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTEpKQotICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKLSAgICAgICAgbG9nZ2luZy5kZWJ1ZyhlKQotICAgICAgICByZXR1cm4gVHJ1ZSAgIyBGYWlsZWQgYXMgZXhwZWN0ZWQKLSAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgdGVzdF9maWx0ZXJpbmdfZXZlbnRfc3RyZWFtX25vbmVfZmlsdGVyX2Z1bmN0aW9uX2NvcmUoKToKLSAgICB3aXRoIEV2ZW50U3RyZWFtKEZldGNoRXZlbnRzKGV2ZW50cz1bMSwgMiwgM10sIGRlbGF5X21zPTUwKSkgYXMgZXZlbnRfc3RyZWFtOgotICAgICAgICBmaWx0ZXJlZF9ldmVudF9zdHJlYW0gPSBGaWx0ZXJpbmdFdmVudFN0cmVhbShldmVudF9zdHJlYW0sIE5vbmUpCi0gICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWRfZXZlbnRfc3RyZWFtKSBcCi0gICAgICAgICAgICAuZW1pdHMobGFtYmRhIGRhdGE6IGRhdGEudmFsdWVfID09IDEpIFwKLSAgICAgICAgICAgIC50aGVuKGxhbWJkYSBkYXRhOiBkYXRhLnZhbHVlXyA9PSAzKQotCi0KLWRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9zaW1wbGVfY29yZSgpOgotICAgIHRoaW5nID0gT2JqZWN0V2l0aEJlaGF2aW9ycygpCi0KLSAgICB3aGVuKHRoaW5nKS50ZXN0X3JlcXVlc3QoYW55dGhpbmcoKSkudGhlbigpLmluY3JlbWVudF9jb3VudCgpCi0KLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0KLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMSkKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJBIl0pCi0KLQotZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3NpbmdsZV9fY2FwdHVyZXNfb25lX2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5zZXRfZGVmYXVsdF90b19pZ25vcmUoKQotCi0gICAgd2hlbih0aGluZykudGVzdF9yZXF1ZXN0KGFueXRoaW5nKCkpLnRoZW4oKS5pbmNyZW1lbnRfY291bnQoKQotCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkEiKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0KLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMSkKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJBIl0pCi0KLQotZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3RpbWVzX19jYXB0dXJlc19hbGxfY29yZSgpOgotICAgIHRoaW5nID0gT2JqZWN0V2l0aEJlaGF2aW9ycygpCi0KLSAgICB3aGVuKHRoaW5nKS50ZXN0X3JlcXVlc3QoYW55dGhpbmcoKSkudGhlbih0aW1lcz0zKS5pbmNyZW1lbnRfY291bnQoKQotCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkEiKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJCIikKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQyIpCi0KLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMykKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJBIiwgIkIiLCAiQyJdKQotCi0KLWRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fYWx3YXlzX19jYXB0dXJlc19hbGxfY29yZSgpOgotICAgIHRoaW5nID0gT2JqZWN0V2l0aEJlaGF2aW9ycygpCi0KLSAgICB3aGVuKHRoaW5nKS50ZXN0X3JlcXVlc3QoYW55dGhpbmcoKSkuYWx3YXlzKCkuaW5jcmVtZW50X2NvdW50KCkKLQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQiIpCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkMiKQotCi0gICAgYXNzZXJ0VGhhdCh0aGluZy5jb3VudCkuaXNFcXVhbFRvKDMpCi0gICAgYXNzZXJ0VGhhdCh0aGluZy5jYXB0dXJlZCkuaXNFcXVhbFRvKFsiQSIsICJCIiwgIkMiXSkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX21hdGNoZXJfX2NhcHR1cmVzX3JlbGV2YW50X2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3Iuc2V0X2RlZmF1bHRfdG9faWdub3JlKCkKLQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChsYW1iZGEgb2JqOiBvYmogPT0gIkIiKS5hbHdheXMoKS5pbmNyZW1lbnRfY291bnQoKQotCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkEiKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJCIikKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQyIpCi0KLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMSkKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJCIl0pCi0KLQotZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX190aGVuX3JlcGVhdGVkX19jYXB0dXJlc19yZWxldmFudF9jb3JlKCk6Ci0gICAgdGhpbmcgPSBPYmplY3RXaXRoQmVoYXZpb3JzKCkKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnNldF9kZWZhdWx0X3RvX2lnbm9yZSgpCi0KLSAgICB3aGVuKHRoaW5nKS50ZXN0X3JlcXVlc3QoYW55dGhpbmcoKSkudGhlbigpLmluY3JlbWVudF9jb3VudCgpLmluY3JlbWVudF9jb3VudCgpCi0KLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkIiKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLQotICAgIGFzc2VydFRoYXQodGhpbmcuY291bnQpLmlzRXF1YWxUbygyKQotICAgIGFzc2VydFRoYXQodGhpbmcuY2FwdHVyZWQpLmlzRXF1YWxUbyhbIkEiLCAiQiJdKQotCi0KLWRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fZmFsbGJhY2tfX2NhcHR1cmVzX3JlbGV2YW50X2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3Iuc2V0X2RlZmF1bHRfdG9faWdub3JlKCkKLQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChsYW1iZGEgb2JqOiBvYmogPT0gIkIiKS50aGVuKHRpbWVzPTEpLmluY3JlbWVudF9jb3VudCgpCi0gICAgd2hlbih0aGluZykudGVzdF9yZXF1ZXN0KGxhbWJkYSBvYmo6IG9iaiA9PSAiQyIpLmFsd2F5cygpLmluY3JlbWVudF9jb3VudCgpCi0KLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkIiKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQyIpCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkIiKQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJDIikKLQotICAgIGFzc2VydFRoYXQodGhpbmcuY291bnQpLmlzRXF1YWxUbygzKQotICAgIGFzc2VydFRoYXQodGhpbmcuY2FwdHVyZWQpLmlzRXF1YWxUbyhbIkIiLCAiQyIsICJDIl0pCi0KLQotZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19kZWZhdWx0X3VuaGFuZGxlZF9jcmFzaF9jb3JlKCk6Ci0gICAgdGhpbmcgPSBPYmplY3RXaXRoQmVoYXZpb3JzKCkKLQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChhbnl0aGluZygpKS50aGVuKCkuaW5jcmVtZW50X2NvdW50KCkKLQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0cnk6Ci0gICAgICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgIGxvZ2dpbmcuZGVidWcoZSkKLSAgICAgICAgcmV0dXJuIFRydWUgICMgRmFpbGVkIGFzIGV4cGVjdGVkCi0gICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX19zZXRfZGVmYXVsdF93b3Jrc19jb3JlKCk6Ci0gICAgdGhpbmcgPSBPYmplY3RXaXRoQmVoYXZpb3JzKCkKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnNldF9kZWZhdWx0KGxhbWJkYSBvYmo6IHRoaW5nLmluY3JlbWVudF91bmhhbmRsZWQoKSkKLQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChhbnl0aGluZygpKS50aGVuKCkuaW5jcmVtZW50X2NvdW50KCkKLQotICAgIHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgYXNzZXJ0VGhhdCh0aGluZy51bmhhbmRsZWRfY291bnQpLmlzRXF1YWxUbygxKQotCi0KLWRlZiB0ZXN0X2ZsdWVudF9iZWhhdmlvcl9fd2FpdF91bnRpbF9kb25lX2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotICAgIGlzX2EgPSBsYW1iZGEgb2JqOiBvYmogPT0gIkEiCi0gICAgd2hlbih0aGluZykudGVzdF9yZXF1ZXN0KGlzX2EpLnRoZW4oKS5pbmNyZW1lbnRfY291bnQoKQotCi0gICAgY2xvc3VyZSA9IGxhbWJkYTogdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkEiKQotICAgIHQgPSBUaW1lcigwLjUsIGNsb3N1cmUpCi0gICAgdC5zdGFydCgpCi0KLSAgICB3YWl0X3VudGlsKHRoaW5nKS50ZXN0X3JlcXVlc3QoaXNfYSkudGltZXMoMSkKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMSkKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJBIl0pCi0KLQotZGVmIHRlc3RfZmx1ZW50X2JlaGF2aW9yX193YWl0X3VudGlsX2RvbmVfZGlmZmVyZW50X2xhbWJkYV9jb3JlKCk6Ci0gICAgdGhpbmcgPSBPYmplY3RXaXRoQmVoYXZpb3JzKCkKLSAgICB3aGVuKHRoaW5nKS50ZXN0X3JlcXVlc3QobGFtYmRhIG9iajogb2JqID09ICJBIikudGhlbigpLmluY3JlbWVudF9jb3VudCgpCi0KLSAgICBjbG9zdXJlID0gbGFtYmRhOiB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgdCA9IFRpbWVyKDAuNSwgY2xvc3VyZSkKLSAgICB0LnN0YXJ0KCkKLQotICAgIHdhaXRfdW50aWwodGhpbmcpLnRlc3RfcmVxdWVzdChsYW1iZGEgb2JqOiBvYmogPT0gIkEiKS50aW1lcygxKQotICAgIGFzc2VydFRoYXQodGhpbmcuY291bnQpLmlzRXF1YWxUbygxKQotICAgIGFzc2VydFRoYXQodGhpbmcuY2FwdHVyZWQpLmlzRXF1YWxUbyhbIkEiXSkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9hbnl0aGluZ19jb3JlKCk6Ci0gICAgdGhpbmcgPSBPYmplY3RXaXRoQmVoYXZpb3JzKCkKLSAgICB3aGVuKHRoaW5nKS50ZXN0X3JlcXVlc3QobGFtYmRhIG9iajogb2JqID09ICJBIikudGhlbigpLmluY3JlbWVudF9jb3VudCgpCi0KLSAgICBjbG9zdXJlID0gbGFtYmRhOiB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgdCA9IFRpbWVyKDAuNSwgY2xvc3VyZSkKLSAgICB0LnN0YXJ0KCkKLQotICAgIHdhaXRfdW50aWwodGhpbmcpLnRlc3RfcmVxdWVzdChhbnl0aGluZygpKS50aW1lcygxKQotICAgIGFzc2VydFRoYXQodGhpbmcuY291bnQpLmlzRXF1YWxUbygxKQotICAgIGFzc2VydFRoYXQodGhpbmcuY2FwdHVyZWQpLmlzRXF1YWxUbyhbIkEiXSkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9ub3RfaGFwcGVuZWRfY29yZSgpOgotICAgIHRoaW5nID0gT2JqZWN0V2l0aEJlaGF2aW9ycygpCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5zZXRfZGVmYXVsdF90b19pZ25vcmUoKQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChsYW1iZGEgb2JqOiBvYmogPT0gIkEiKS50aGVuKCkuaW5jcmVtZW50X2NvdW50KCkKLQotICAgIGNsb3N1cmUgPSBsYW1iZGE6IHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJCIikKLSAgICB0ID0gVGltZXIoMC41LCBjbG9zdXJlKQotICAgIHQuc3RhcnQoKQotICAgIGFzc2VydFRoYXQod2FpdF91bnRpbCh0aGluZykudGVzdF9yZXF1ZXN0KGxhbWJkYSBvYmo6IG9iaiA9PSAiQSIpLnRpbWVzKDEpKS5pc0ZhbHNlKCkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV93aXRoX2RlZmF1bHRfY29yZSgpOgotICAgIHRoaW5nID0gT2JqZWN0V2l0aEJlaGF2aW9ycygpCi0gICAgdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5zZXRfZGVmYXVsdChsYW1iZGEgb2JqOiB0aGluZy5pbmNyZW1lbnRfdW5oYW5kbGVkKCkpCi0KLSAgICBjbG9zdXJlID0gbGFtYmRhOiB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgdCA9IFRpbWVyKDAuNSwgY2xvc3VyZSkKLSAgICB0LnN0YXJ0KCkKLQotICAgIHdhaXRfdW50aWwodGhpbmcpLnRlc3RfcmVxdWVzdChhbnl0aGluZygpKS50aW1lcygxKQotICAgIGFzc2VydFRoYXQodGhpbmcudW5oYW5kbGVkX2NvdW50KS5pc0VxdWFsVG8oMSkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV90d29fZXZlbnRzX0FBX2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChsYW1iZGEgb2JqOiBvYmogPT0gIkEiKS50aGVuKCkuaW5jcmVtZW50X2NvdW50KCkuaW5jcmVtZW50X2NvdW50KCkKLQotICAgIGNsb3N1cmUxID0gbGFtYmRhOiB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQSIpCi0gICAgdDEgPSBUaW1lcigwLjUsIGNsb3N1cmUxKQotICAgIHQxLnN0YXJ0KCkKLSAgICBjbG9zdXJlMiA9IGxhbWJkYTogdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkEiKQotICAgIHQyID0gVGltZXIoMC41LCBjbG9zdXJlMikKLSAgICB0Mi5zdGFydCgpCi0KLSAgICB3YWl0X3VudGlsKHRoaW5nKS50ZXN0X3JlcXVlc3QobGFtYmRhIG9iajogb2JqID09ICJBIikudGltZXMoMikKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMikKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJBIiwgIkEiXSkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV90d29fZXZlbnRzX0FCX2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChhbnl0aGluZygpKS5hbHdheXMoKS5pbmNyZW1lbnRfY291bnQoKQotCi0gICAgY2xvc3VyZTEgPSBsYW1iZGE6IHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0MSA9IFRpbWVyKDAuNSwgY2xvc3VyZTEpCi0gICAgdDEuc3RhcnQoKQotICAgIGNsb3N1cmUyID0gbGFtYmRhOiB0aGluZy5iZWhhdmlvcnMudGVzdF9yZXF1ZXN0X2JlaGF2aW9yLnJ1bigiQiIpCi0gICAgdDIgPSBUaW1lcigxLCBjbG9zdXJlMikKLSAgICB0Mi5zdGFydCgpCi0KLSAgICB3YWl0X3VudGlsKHRoaW5nKS50ZXN0X3JlcXVlc3QoYW55dGhpbmcoKSkudGltZXMoMikKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNvdW50KS5pc0VxdWFsVG8oMikKLSAgICBhc3NlcnRUaGF0KHRoaW5nLmNhcHR1cmVkKS5pc0VxdWFsVG8oWyJBIiwgIkIiXSkKLQotCi1kZWYgdGVzdF9mbHVlbnRfYmVoYXZpb3JfX3dhaXRfdW50aWxfZG9uZV9vbmx5X29uZV9ldmVudF9pc19kb25lX2NvcmUoKToKLSAgICB0aGluZyA9IE9iamVjdFdpdGhCZWhhdmlvcnMoKQotICAgIHdoZW4odGhpbmcpLnRlc3RfcmVxdWVzdChhbnl0aGluZygpKS5hbHdheXMoKS5pbmNyZW1lbnRfY291bnQoKQotCi0gICAgY2xvc3VyZTEgPSBsYW1iZGE6IHRoaW5nLmJlaGF2aW9ycy50ZXN0X3JlcXVlc3RfYmVoYXZpb3IucnVuKCJBIikKLSAgICB0MSA9IFRpbWVyKDEsIGNsb3N1cmUxKQotICAgIHQxLnN0YXJ0KCkKLSAgICBjbG9zdXJlMiA9IGxhbWJkYTogdGhpbmcuYmVoYXZpb3JzLnRlc3RfcmVxdWVzdF9iZWhhdmlvci5ydW4oIkIiKQotICAgIHQyID0gVGltZXIoMywgY2xvc3VyZTIpCi0gICAgdDIuc3RhcnQoKQotICAgIGFzc2VydFRoYXQod2FpdF91bnRpbCh0aGluZykudGVzdF9yZXF1ZXN0KGxhbWJkYSBvYmo6IG9iaiA9PSAiQSIpLnRpbWVzKDIpKS5pc0ZhbHNlKCkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvY2hhbmdlX3dhaXRlci5weSBiL2dkL2NlcnQvY2hhbmdlX3dhaXRlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNzJmOS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2NoYW5nZV93YWl0ZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1pbXBvcnQgcHlpbm90aWZ5Ci1pbXBvcnQgc3lzCi0KLXdtID0gcHlpbm90aWZ5LldhdGNoTWFuYWdlcigpCi1tYXNrID0gcHlpbm90aWZ5LklOX0RFTEVURSB8IHB5aW5vdGlmeS5JTl9DUkVBVEUgfCBweWlub3RpZnkuSU5fTU9ESUZZCi0KLQotY2xhc3MgRXZlbnRIYW5kbGVyKHB5aW5vdGlmeS5Qcm9jZXNzRXZlbnQpOgotCi0gICAgZGVmIHByb2Nlc3NfZGVmYXVsdChzZWxmLCBldmVudCk6Ci0gICAgICAgIHF1aXQoKQotCi0KLWhhbmRsZXIgPSBFdmVudEhhbmRsZXIoKQotbm90aWZpZXIgPSBweWlub3RpZnkuTm90aWZpZXIod20sIGhhbmRsZXIpCi13ZGQgPSB3bS5hZGRfd2F0Y2goc3lzLmFyZ3ZbMV0sIG1hc2ssIHJlYz1UcnVlKQotCi1ub3RpZmllci5sb29wKCkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvY2xvc2FibGUucHkgYi9nZC9jZXJ0L2Nsb3NhYmxlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMwNzM3Li4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvY2xvc2FibGUucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYWJjIGltcG9ydCBBQkMsIGFic3RyYWN0bWV0aG9kCi0KLQotY2xhc3MgQ2xvc2FibGUoQUJDKToKLQotICAgIGRlZiBfX2VudGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6Ci0gICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICByZXR1cm4gdHJhY2ViYWNrIGlzIE5vbmUKLQotICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICBzZWxmLmNsb3NlKCkKLQotICAgIEBhYnN0cmFjdG1ldGhvZAotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgcGFzcwotCi0KLWRlZiBzYWZlQ2xvc2UoY2xvc2FibGUpOgotICAgIGlmIGNsb3NhYmxlIGlzIG5vdCBOb25lOgotICAgICAgICBjbG9zYWJsZS5jbG9zZSgpCmRpZmYgLS1naXQgYS9nZC9jZXJ0L2RldmljZXNfY29uZmlnLmpzb24gYi9nZC9jZXJ0L2RldmljZXNfY29uZmlnLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTNlMmMuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9kZXZpY2VzX2NvbmZpZy5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAoteyAgICJfZGVzY3JpcHRpb24iOiAiQmx1ZXRvb3RoIGNlcnQgdGVzdGluZyIsCi0gICAgInRlc3RiZWQiOgotICAgIFsKLSAgICAgICAgewotICAgICAgICAgICAgIl9kZXNjcmlwdGlvbiI6ICJUd28gQW5kcm9pZCBkZXZpY2VzIGNlcnQgdGVzdGJlZCIsCi0gICAgICAgICAgICAibmFtZSI6ICJBbmRyb2lkRGV2aWNlQ2VydCIsCi0gICAgICAgICAgICAiR2REZXZpY2UiOgotICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImdycGNfcG9ydCI6ICI4ODk4IiwKLSAgICAgICAgICAgICAgICAgICAgImdycGNfcm9vdF9zZXJ2ZXJfcG9ydCI6ICI4ODk2IiwKLSAgICAgICAgICAgICAgICAgICAgInNpZ25hbF9wb3J0IjogIjg4OTQiLAotICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiAiY2VydCIsCi0gICAgICAgICAgICAgICAgICAgICJzZXJpYWxfbnVtYmVyIjogIkNFUlQiLAotICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDZXJ0IERldmljZSIsCi0gICAgICAgICAgICAgICAgICAgICJjbWQiOgotICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWRiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJChzZXJpYWxfbnVtYmVyKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2hlbGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi9zeXN0ZW0vYmluL2JsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1ncnBjLXBvcnQ9JChncnBjX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3Qtc2VydmVyLXBvcnQ9JChncnBjX3Jvb3Rfc2VydmVyX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWJ0c25vb3A9L2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub29wX2hjaS5sb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tYnRzbm9vej0vZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3pfaGNpLmxvZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1idGNvbmZpZz0vZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuY29uZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1zaWduYWwtcG9ydD0kKHNpZ25hbF9wb3J0KSIKLSAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiZ3JwY19wb3J0IjogIjg4OTkiLAotICAgICAgICAgICAgICAgICAgICAiZ3JwY19yb290X3NlcnZlcl9wb3J0IjogIjg4OTciLAotICAgICAgICAgICAgICAgICAgICAic2lnbmFsX3BvcnQiOiAiODg5NSIsCi0gICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJkdXQiLAotICAgICAgICAgICAgICAgICAgICAic2VyaWFsX251bWJlciI6ICJEVVQiLAotICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJEVVQgRGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgImNtZCI6Ci0gICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhZGIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIkKHNlcmlhbF9udW1iZXIpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaGVsbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQVNBTl9PUFRJT05TPWRldGVjdF9jb250YWluZXJfb3ZlcmZsb3c9MCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiL3N5c3RlbS9iaW4vYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWdycGMtcG9ydD0kKGdycGNfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tcm9vdC1zZXJ2ZXItcG9ydD0kKGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tYnRzbm9vcD0vZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1idHNub296PS9kYXRhL21pc2MvYmx1ZXRvb3RoL2xvZ3MvYnRzbm9vel9oY2kubG9nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWJ0Y29uZmlnPS9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXNpZ25hbC1wb3J0PSQoc2lnbmFsX3BvcnQpIgotICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQotICAgICAgICB9Ci0gICAgXSwKLSAgICAibG9ncGF0aCI6ICIvdG1wL2xvZ3MiCi19CmRpZmYgLS1naXQgYS9nZC9jZXJ0L2V2ZW50X3N0cmVhbS5weSBiL2dkL2NlcnQvZXZlbnRfc3RyZWFtLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTcxOTM1Li4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvZXZlbnRfc3RyZWFtLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBhYmMgaW1wb3J0IEFCQywgYWJzdHJhY3RtZXRob2QKLWZyb20gY29uY3VycmVudC5mdXR1cmVzIGltcG9ydCBUaHJlYWRQb29sRXhlY3V0b3IKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKLWltcG9ydCBsb2dnaW5nCi1mcm9tIHF1ZXVlIGltcG9ydCBTaW1wbGVRdWV1ZSwgRW1wdHkKLQotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdGV4dF9mb3JtYXQKLQotZnJvbSBncnBjIGltcG9ydCBScGNFcnJvcgotCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IENsb3NhYmxlCi0KLQotY2xhc3MgSUV2ZW50U3RyZWFtKEFCQyk6Ci0KLSAgICBAYWJzdHJhY3RtZXRob2QKLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICBwYXNzCi0KLQotY2xhc3MgRmlsdGVyaW5nRXZlbnRTdHJlYW0oSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGZpbHRlcl9mbik6Ci0gICAgICAgIHNlbGYuZmlsdGVyX2ZuID0gZmlsdGVyX2ZuIGlmIGZpbHRlcl9mbiBlbHNlIGxhbWJkYSB4OiB4Ci0gICAgICAgIHNlbGYuZXZlbnRfcXVldWUgPSBTaW1wbGVRdWV1ZSgpCi0gICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCi0KLSAgICAgICAgc2VsZi5zdHJlYW0ucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5fX2V2ZW50X2NhbGxiYWNrLCBsYW1iZGEgcGFja2V0OiBzZWxmLmZpbHRlcl9mbihwYWNrZXQpIGlzIG5vdCBOb25lKQotCi0gICAgZGVmIF9fZXZlbnRfY2FsbGJhY2soc2VsZiwgZXZlbnQpOgotICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlLnB1dChzZWxmLmZpbHRlcl9mbihldmVudCkpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5ldmVudF9xdWV1ZQotCi0gICAgZGVmIHVucmVnaXN0ZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuc3RyZWFtLnVucmVnaXN0ZXIoc2VsZi5fX2V2ZW50X2NhbGxiYWNrKQotCi0KLWRlZiBwcmV0dHlfcHJpbnQocHJvdG9fZXZlbnQpOgotICAgIHJldHVybiAne30ge30nLmZvcm1hdCh0eXBlKHByb3RvX2V2ZW50KS5fX25hbWVfXywgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHByb3RvX2V2ZW50LCBhc19vbmVfbGluZT1UcnVlKSkKLQotCi1ERUZBVUxUX1RJTUVPVVRfU0VDT05EUyA9IDEwCi0KLQotY2xhc3MgRXZlbnRTdHJlYW0oSUV2ZW50U3RyZWFtLCBDbG9zYWJsZSk6Ci0gICAgIiIiCi0gICAgQSBjbGFzcyB0aGF0IHN0cmVhbXMgZXZlbnRzIGZyb20gYSBnUlBDIHN0cmVhbSwgd2hpY2ggeW91IGNhbiBhc3NlcnQgb24uCi0KLSAgICBEb24ndCB1c2UgdGhlc2UgYXNzZXJ0cyBkaXJlY3RseSwgdXNlIHRoZSBvbmVzIGZyb20gY2VydC50cnV0aC4KLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfc3RyZWFtX2NhbGwpOgotICAgICAgICBpZiBzZXJ2ZXJfc3RyZWFtX2NhbGwgaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlcnZlcl9zdHJlYW1fY2FsbCBjYW5ub3QgYmUgTm9uZSIpCi0KLSAgICAgICAgc2VsZi5zZXJ2ZXJfc3RyZWFtX2NhbGwgPSBzZXJ2ZXJfc3RyZWFtX2NhbGwKLSAgICAgICAgc2VsZi5ldmVudF9xdWV1ZSA9IFNpbXBsZVF1ZXVlKCkKLSAgICAgICAgc2VsZi5oYW5kbGVycyA9IFtdCi0gICAgICAgIHNlbGYuZXhlY3V0b3IgPSBUaHJlYWRQb29sRXhlY3V0b3IoKQotICAgICAgICBzZWxmLmZ1dHVyZSA9IHNlbGYuZXhlY3V0b3Iuc3VibWl0KEV2ZW50U3RyZWFtLl9fZXZlbnRfbG9vcCwgc2VsZikKLQotICAgIGRlZiBnZXRfZXZlbnRfcXVldWUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmV2ZW50X3F1ZXVlCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBTdG9wIHRoZSBnUlBDIGxhbWJkYSBzbyB0aGF0IGV2ZW50X2NhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQgYWZ0ZXIKLSAgICAgICAgdGhlIG1ldGhvZCByZXR1cm5zLgotCi0gICAgICAgIFRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlbGVzcyBhZnRlciB0aGlzIGNhbGwgYXMgdGhlcmUgaXMgbm8gd2F5IHRvCi0gICAgICAgIHJlc3RhcnQgdGhlIGdSUEMgY2FsbGJhY2suIFlvdSB3b3VsZCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBFdmVudFN0cmVhbQotCi0gICAgICAgIDpyYWlzZSBOb25lIG9uIHN1Y2Nlc3MsIG9yIHRoZSBzYW1lIGV4Y2VwdGlvbiBhcyBfX2V2ZW50X2xvb3AoKSwgb3IKLSAgICAgICAgICAgICAgIGNvbmN1cnJlbnQuZnV0dXJlcy5UaW1lb3V0RXJyb3IgaWYgdW5kZXJseWluZyBzdHJlYW0gZmFpbGVkIHRvCi0gICAgICAgICAgICAgICB0ZXJtaW5hdGUgd2l0aGluIERFRkFVTFRfVElNRU9VVF9TRUNPTkRTCi0gICAgICAgICIiIgotICAgICAgICAjIFRyeSB0byBjYW5jZWwgdGhlIGV4ZWN1dGlvbiwgZG9uJ3QgY2FyZSB0aGUgcmVzdWx0LCBub24tYmxvY2tpbmcKLSAgICAgICAgc2VsZi5zZXJ2ZXJfc3RyZWFtX2NhbGwuY2FuY2VsKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBjYW5jZWxsaW5nIGdSUEMgc3RyZWFtIHNob3VsZCBjYXVzZSBfX2V2ZW50X2xvb3AoKSB0byBxdWl0Ci0gICAgICAgICAgICAjIHNhbWUgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGJ5IGZ1dHVyZS5yZXN1bHQoKSBvcgotICAgICAgICAgICAgIyBjb25jdXJyZW50LmZ1dHVyZXMuVGltZW91dEVycm9yIHdpbGwgYmUgcmFpc2VkIGFmdGVyIHRpbWVvdXQKLSAgICAgICAgICAgIHNlbGYuZnV0dXJlLnJlc3VsdCh0aW1lb3V0PURFRkFVTFRfVElNRU9VVF9TRUNPTkRTKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgZm9yY2Ugc2h1dGRvd24gdGhlIGV4ZWN1dG9yIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdAotICAgICAgICAgICAgc2VsZi5leGVjdXRvci5zaHV0ZG93bih3YWl0PUZhbHNlKQotCi0gICAgZGVmIHJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrLCBtYXRjaGVyX2ZuPU5vbmUpOgotICAgICAgICAiIiIKLSAgICAgICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBoYW5kbGUgZXZlbnRzLiBFdmVudCB3aWxsIGJlIGhhbmRsZWQgYnkgY2FsbGJhY2sKLSAgICAgICAgaWYgbWF0Y2hlcl9mbihldmVudCkgcmV0dXJucyBUcnVlCi0KLSAgICAgICAgY2FsbGJhY2sgYW5kIG1hdGNoZXIgYXJlIHJlZ2lzdGVyZWQgYXMgYSB0dXBsZS4gSGVuY2UgdGhlIHNhbWUgY2FsbGJhY2sKLSAgICAgICAgd2l0aCBkaWZmZXJlbnQgbWF0Y2hlciBhcmUgY29uc2lkZXJlZCB0d28gZGlmZmVyZW50IGhhbmRsZXIgdW5pdHMuIFNhbWUKLSAgICAgICAgbWF0Y2hlciwgYnV0IGRpZmZlcmVudCBjYWxsYmFjayBhcmUgYWxzbyBjb25zaWRlcmVkIGRpZmZlcmVudCBoYW5kbGluZwotICAgICAgICB1bml0Ci0KLSAgICAgICAgQ2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIG9uIGEgVGhyZWFkUG9vbEV4ZWN1dG9yIG93bmVkIGJ5IHRoaXMKLSAgICAgICAgRXZlbnRTdHJlYW0KLQotICAgICAgICA6cGFyYW0gY2FsbGJhY2s6IFdpbGwgYmUgY2FsbGVkIGFzIGNhbGxiYWNrKGV2ZW50KQotICAgICAgICA6cGFyYW0gbWF0Y2hlcl9mbjogQSBib29sZWFuIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBUcnVlIG9yIEZhbHNlIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgbWF0Y2hlcl9mbihldmVudCksIGlmIE5vbmUsIGFsbCBldmVudCB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBtYXRjaGVkCi0gICAgICAgICIiIgotICAgICAgICBpZiBjYWxsYmFjayBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FsbGJhY2sgbXVzdCBub3QgYmUgTm9uZSIpCi0gICAgICAgIHNlbGYuaGFuZGxlcnMuYXBwZW5kKChjYWxsYmFjaywgbWF0Y2hlcl9mbikpCi0KLSAgICBkZWYgdW5yZWdpc3Rlcl9jYWxsYmFjayhzZWxmLCBjYWxsYmFjaywgbWF0Y2hlcl9mbj1Ob25lKToKLSAgICAgICAgIiIiCi0gICAgICAgIFVucmVnaXN0ZXIgY2FsbGJhY2sgYW5kIG1hdGNoZXJfZm4gZnJvbSB0aGUgZXZlbnQgc3RyZWFtLiBCb3RoIG9iamVjdHMKLSAgICAgICAgbXVzdCBtYXRjaCBleGFjdGx5IHRoZSBvbmVzIHdoZW4gY2FsbGluZyByZWdpc3Rlcl9jYWxsYmFjaygpCi0KLSAgICAgICAgOnBhcmFtIGNhbGxiYWNrOiBjYWxsYmFjayB1c2VkIGluIHJlZ2lzdGVyX2NhbGxiYWNrKCkKLSAgICAgICAgOnBhcmFtIG1hdGNoZXJfZm46IG1hdGNoZXJfZm4gdXNlZCBpbiByZWdpc3Rlcl9jYWxsYmFjaygpCi0gICAgICAgIDpyYWlzZXMgVmFsdWVFcnJvciB3aGVuIChjYWxsYmFjaywgbWF0Y2hlcl9mbikgdHVwbGUgaXMgbm90IGZvdW5kCi0gICAgICAgICIiIgotICAgICAgICBpZiBjYWxsYmFjayBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FsbGJhY2sgbXVzdCBub3QgYmUgTm9uZSIpCi0gICAgICAgIHNlbGYuaGFuZGxlcnMucmVtb3ZlKChjYWxsYmFjaywgbWF0Y2hlcl9mbikpCi0KLSAgICBkZWYgX19ldmVudF9sb29wKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTWFpbiBsb29wIGZvciBjb25zdW1pbmcgdGhlIGdSUEMgc3RyZWFtIGV2ZW50cy4KLSAgICAgICAgQmxvY2tzIHVudGlsIGNvbXB1dGF0aW9uIGlzIGNhbmNlbGxlZAotICAgICAgICA6cmFpc2UgZ3JwYy5FcnJvciBvbiBmYWlsdXJlCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5zZXJ2ZXJfc3RyZWFtX2NhbGw6Ci0gICAgICAgICAgICAgICAgc2VsZi5ldmVudF9xdWV1ZS5wdXQoZXZlbnQpCi0gICAgICAgICAgICAgICAgZm9yIChjYWxsYmFjaywgbWF0Y2hlcl9mbikgaW4gc2VsZi5oYW5kbGVyczoKLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoZXJfZm4gb3IgbWF0Y2hlcl9mbihldmVudCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCkKLSAgICAgICAgZXhjZXB0IFJwY0Vycm9yIGFzIGV4cDoKLSAgICAgICAgICAgICMgVW5kZXJseWluZyBnUlBDIHN0cmVhbSBzaG91bGQgcnVuIGluZGVmaW5pdGVseSB1bnRpbCBjYW5jZWxsZWQKLSAgICAgICAgICAgICMgSGVuY2UgYW55IG90aGVyIHJlYXNvbiBiZXNpZGVzIENBTkNFTExFRCBpcyByYWlzZWQgYXMgYW4gZXJyb3IKLSAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyX3N0cmVhbV9jYWxsLmNhbmNlbGxlZCgpOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIkNhbmNlbGxlZCIpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIGV4cAotCi0gICAgZGVmIGFzc2VydF9ldmVudF9vY2N1cnMoc2VsZiwgbWF0Y2hfZm4sIGF0X2xlYXN0X3RpbWVzPTEsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9REVGQVVMVF9USU1FT1VUX1NFQ09ORFMpKToKLSAgICAgICAgIiIiCi0gICAgICAgIEFzc2VydCBhdCBsZWFzdCB8YXRfbGVhc3RfdGltZXN8IGluc3RhbmNlcyBvZiBldmVudHMgaGFwcGVuIHdoZXJlCi0gICAgICAgIG1hdGNoX2ZuKGV2ZW50KSByZXR1cm5zIFRydWUgd2l0aGluIHRpbWVvdXQgcGVyaW9kCi0KLSAgICAgICAgOnBhcmFtIG1hdGNoX2ZuOiByZXR1cm5zIFRydWUvRmFsc2Ugb24gbWF0Y2hfZm4oZXZlbnQpCi0gICAgICAgIDpwYXJhbSB0aW1lb3V0OiBhIHRpbWVkZWx0YSBvYmplY3QKLSAgICAgICAgOnBhcmFtIGF0X2xlYXN0X3RpbWVzOiBob3cgbWFueSB0aW1lcyBhdCBsZWFzdCBhIG1hdGNoaW5nIGV2ZW50IHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbgotICAgICAgICA6cmV0dXJuOgotICAgICAgICAiIiIKLSAgICAgICAgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2V2ZW50X29jY3VycyhzZWxmLCBtYXRjaF9mbiwgYXRfbGVhc3RfdGltZXMsIHRpbWVvdXQpCi0KLSAgICBkZWYgYXNzZXJ0X2V2ZW50X29jY3Vyc19hdF9tb3N0KHNlbGYsIG1hdGNoX2ZuLCBhdF9tb3N0X3RpbWVzLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPURFRkFVTFRfVElNRU9VVF9TRUNPTkRTKSk6Ci0gICAgICAgICIiIgotICAgICAgICBBc3NlcnQgYXQgbW9zdCB8YXRfbW9zdF90aW1lc3wgaW5zdGFuY2VzIG9mIGV2ZW50cyBoYXBwZW4gd2hlcmUKLSAgICAgICAgbWF0Y2hfZm4oZXZlbnQpIHJldHVybnMgVHJ1ZSB3aXRoaW4gdGltZW91dCBwZXJpb2QKLQotICAgICAgICA6cGFyYW0gbWF0Y2hfZm46IHJldHVybnMgVHJ1ZS9GYWxzZSBvbiBtYXRjaF9mbihldmVudCkKLSAgICAgICAgOnBhcmFtIGF0X21vc3RfdGltZXM6IGhvdyBtYW55IHRpbWVzIGF0IG1vc3QgYSBtYXRjaGluZyBldmVudCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW4KLSAgICAgICAgOnBhcmFtIHRpbWVvdXQ6YSB0aW1lZGVsdGEgb2JqZWN0Ci0gICAgICAgIDpyZXR1cm46Ci0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmRlYnVnKCJhc3NlcnRfZXZlbnRfb2NjdXJzX2F0X21vc3QiKQotICAgICAgICBldmVudF9saXN0ID0gW10KLSAgICAgICAgZW5kX3RpbWUgPSBkYXRldGltZS5ub3coKSArIHRpbWVvdXQKLSAgICAgICAgd2hpbGUgbGVuKGV2ZW50X2xpc3QpIDw9IGF0X21vc3RfdGltZXMgYW5kIGRhdGV0aW1lLm5vdygpIDwgZW5kX3RpbWU6Ci0gICAgICAgICAgICByZW1haW5pbmcgPSBzdGF0aWNfcmVtYWluaW5nX3RpbWVfZGVsdGEoZW5kX3RpbWUpCi0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJXYWl0aW5nIGZvciBldmVudCBpdGVyYXRpb24gKCVmcyByZW1haW5pbmcpIiAlIChyZW1haW5pbmcudG90YWxfc2Vjb25kcygpKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBjdXJyZW50X2V2ZW50ID0gc2VsZi5ldmVudF9xdWV1ZS5nZXQodGltZW91dD1yZW1haW5pbmcudG90YWxfc2Vjb25kcygpKQotICAgICAgICAgICAgICAgIGlmIG1hdGNoX2ZuKGN1cnJlbnRfZXZlbnQpOgotICAgICAgICAgICAgICAgICAgICBldmVudF9saXN0LmFwcGVuZChjdXJyZW50X2V2ZW50KQotICAgICAgICAgICAgZXhjZXB0IEVtcHR5OgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIkRvbmUgd2FpdGluZywgZ290ICVkIGV2ZW50cyIgJSBsZW4oZXZlbnRfbGlzdCkpCi0gICAgICAgIGFzc2VydF90cnVlKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGxlbihldmVudF9saXN0KSA8PSBhdF9tb3N0X3RpbWVzLAotICAgICAgICAgICAgbXNnPSgiRXhwZWN0ZWQgYXQgbW9zdCAlZCBldmVudHMsIGJ1dCBnb3QgJWQiICUgKGF0X21vc3RfdGltZXMsIGxlbihldmVudF9saXN0KSkpKQotCi0KLWRlZiBzdGF0aWNfcmVtYWluaW5nX3RpbWVfZGVsdGEoZW5kX3RpbWUpOgotICAgIHJlbWFpbmluZyA9IGVuZF90aW1lIC0gZGF0ZXRpbWUubm93KCkKLSAgICBpZiByZW1haW5pbmcgPCB0aW1lZGVsdGEobWlsbGlzZWNvbmRzPTApOgotICAgICAgICByZW1haW5pbmcgPSB0aW1lZGVsdGEobWlsbGlzZWNvbmRzPTApCi0gICAgcmV0dXJuIHJlbWFpbmluZwotCi0KLWRlZiBhc3NlcnRfdHJ1ZShpc3RyZWFtLCBleHByLCBtc2csIGV4dHJhcz1Ob25lKToKLSAgICBpZiBub3QgZXhwcjoKLSAgICAgICAgaXN0cmVhbS5jbG9zZSgpCi0gICAgICAgIGFzc2VydHMuZmFpbChtc2csIGV4dHJhcykKLQotCi1kZWYgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2V2ZW50X29jY3Vycyhpc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdF9sZWFzdF90aW1lcz0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz1ERUZBVUxUX1RJTUVPVVRfU0VDT05EUykpOgotICAgIGxvZ2dpbmcuZGVidWcoImFzc2VydF9ldmVudF9vY2N1cnMgJWQgJWZzIiAlIChhdF9sZWFzdF90aW1lcywgdGltZW91dC50b3RhbF9zZWNvbmRzKCkpKQotICAgIGV2ZW50X2xpc3QgPSBbXQotICAgIGVuZF90aW1lID0gZGF0ZXRpbWUubm93KCkgKyB0aW1lb3V0Ci0gICAgd2hpbGUgbGVuKGV2ZW50X2xpc3QpIDwgYXRfbGVhc3RfdGltZXMgYW5kIGRhdGV0aW1lLm5vdygpIDwgZW5kX3RpbWU6Ci0gICAgICAgIHJlbWFpbmluZyA9IHN0YXRpY19yZW1haW5pbmdfdGltZV9kZWx0YShlbmRfdGltZSkKLSAgICAgICAgbG9nZ2luZy5kZWJ1ZygiV2FpdGluZyBmb3IgZXZlbnQgKCVmcyByZW1haW5pbmcpIiAlIChyZW1haW5pbmcudG90YWxfc2Vjb25kcygpKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY3VycmVudF9ldmVudCA9IGlzdHJlYW0uZ2V0X2V2ZW50X3F1ZXVlKCkuZ2V0KHRpbWVvdXQ9cmVtYWluaW5nLnRvdGFsX3NlY29uZHMoKSkKLSAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoImN1cnJlbnRfZXZlbnQ6ICVzIiwgY3VycmVudF9ldmVudCkKLSAgICAgICAgICAgIGlmIG1hdGNoX2ZuKGN1cnJlbnRfZXZlbnQpOgotICAgICAgICAgICAgICAgIGV2ZW50X2xpc3QuYXBwZW5kKGN1cnJlbnRfZXZlbnQpCi0gICAgICAgIGV4Y2VwdCBFbXB0eToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgbG9nZ2luZy5kZWJ1ZygiRG9uZSB3YWl0aW5nIGZvciBldmVudCwgcmVjZWl2ZWQgJWQiLCBsZW4oZXZlbnRfbGlzdCkpCi0KLSAgICBhc3NlcnRfdHJ1ZSgKLSAgICAgICAgaXN0cmVhbSwKLSAgICAgICAgbGVuKGV2ZW50X2xpc3QpID49IGF0X2xlYXN0X3RpbWVzLAotICAgICAgICBtc2c9KCJFeHBlY3RlZCBhdCBsZWFzdCAlZCBldmVudHMsIGJ1dCBnb3QgJWQiICUgKGF0X2xlYXN0X3RpbWVzLCBsZW4oZXZlbnRfbGlzdCkpKSkKLQotCi1kZWYgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2FsbF9ldmVudHNfb2NjdXIoaXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9mbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfbWF0dGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPURFRkFVTFRfVElNRU9VVF9TRUNPTkRTKSk6Ci0gICAgbG9nZ2luZy5kZWJ1ZygiYXNzZXJ0X2FsbF9ldmVudHNfb2NjdXIgJWZzIiAlIHRpbWVvdXQudG90YWxfc2Vjb25kcygpKQotICAgIHBlbmRpbmdfbWF0Y2hlcyA9IGxpc3QobWF0Y2hfZm5zKQotICAgIG1hdGNoZWRfb3JkZXIgPSBbXQotICAgIGVuZF90aW1lID0gZGF0ZXRpbWUubm93KCkgKyB0aW1lb3V0Ci0gICAgd2hpbGUgbGVuKHBlbmRpbmdfbWF0Y2hlcykgPiAwIGFuZCBkYXRldGltZS5ub3coKSA8IGVuZF90aW1lOgotICAgICAgICByZW1haW5pbmcgPSBzdGF0aWNfcmVtYWluaW5nX3RpbWVfZGVsdGEoZW5kX3RpbWUpCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIldhaXRpbmcgZm9yIGV2ZW50ICglZnMgcmVtYWluaW5nKSIgJSAocmVtYWluaW5nLnRvdGFsX3NlY29uZHMoKSkpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGN1cnJlbnRfZXZlbnQgPSBpc3RyZWFtLmdldF9ldmVudF9xdWV1ZSgpLmdldCh0aW1lb3V0PXJlbWFpbmluZy50b3RhbF9zZWNvbmRzKCkpCi0gICAgICAgICAgICBmb3IgbWF0Y2hfZm4gaW4gcGVuZGluZ19tYXRjaGVzOgotICAgICAgICAgICAgICAgIGlmIG1hdGNoX2ZuKGN1cnJlbnRfZXZlbnQpOgotICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX21hdGNoZXMucmVtb3ZlKG1hdGNoX2ZuKQotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkX29yZGVyLmFwcGVuZChtYXRjaF9mbikKLSAgICAgICAgZXhjZXB0IEVtcHR5OgotICAgICAgICAgICAgY29udGludWUKLSAgICBsb2dnaW5nLmRlYnVnKCJEb25lIHdhaXRpbmcgZm9yIGV2ZW50IikKLSAgICBhc3NlcnRfdHJ1ZSgKLSAgICAgICAgaXN0cmVhbSwKLSAgICAgICAgbGVuKG1hdGNoZWRfb3JkZXIpID09IGxlbihtYXRjaF9mbnMpLAotICAgICAgICBtc2c9KCJFeHBlY3RlZCBhdCBsZWFzdCAlZCBldmVudHMsIGJ1dCBnb3QgJWQiICUgKGxlbihtYXRjaF9mbnMpLCBsZW4obWF0Y2hlZF9vcmRlcikpKSkKLSAgICBpZiBvcmRlcl9tYXR0ZXJzOgotICAgICAgICBjb3JyZWN0X29yZGVyID0gVHJ1ZQotICAgICAgICBpID0gMAotICAgICAgICB3aGlsZSBpIDwgbGVuKG1hdGNoX2Zucyk6Ci0gICAgICAgICAgICBpZiBtYXRjaF9mbnNbaV0gaXMgbm90IG1hdGNoZWRfb3JkZXJbaV06Ci0gICAgICAgICAgICAgICAgY29ycmVjdF9vcmRlciA9IEZhbHNlCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGkgKz0gMQotICAgICAgICBhc3NlcnRfdHJ1ZShpc3RyZWFtLCBjb3JyZWN0X29yZGVyLCAiRXZlbnRzIG5vdCByZWNlaXZlZCBpbiBjb3JyZWN0IG9yZGVyICVzICVzIiAlIChtYXRjaF9mbnMsIG1hdGNoZWRfb3JkZXIpKQotCi0KLWRlZiBOT1RfRk9SX1lPVV9hc3NlcnRfbm9uZV9tYXRjaGluZyhpc3RyZWFtLCBtYXRjaF9mbiwgdGltZW91dCk6Ci0gICAgbG9nZ2luZy5kZWJ1ZygiYXNzZXJ0X25vbmVfbWF0Y2hpbmcgJWZzIiAlICh0aW1lb3V0LnRvdGFsX3NlY29uZHMoKSkpCi0gICAgZXZlbnQgPSBOb25lCi0gICAgZW5kX3RpbWUgPSBkYXRldGltZS5ub3coKSArIHRpbWVvdXQKLSAgICB3aGlsZSBldmVudCBpcyBOb25lIGFuZCBkYXRldGltZS5ub3coKSA8IGVuZF90aW1lOgotICAgICAgICByZW1haW5pbmcgPSBzdGF0aWNfcmVtYWluaW5nX3RpbWVfZGVsdGEoZW5kX3RpbWUpCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIldhaXRpbmcgZm9yIGV2ZW50ICglZnMgcmVtYWluaW5nKSIgJSAocmVtYWluaW5nLnRvdGFsX3NlY29uZHMoKSkpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGN1cnJlbnRfZXZlbnQgPSBpc3RyZWFtLmdldF9ldmVudF9xdWV1ZSgpLmdldCh0aW1lb3V0PXJlbWFpbmluZy50b3RhbF9zZWNvbmRzKCkpCi0gICAgICAgICAgICBpZiBtYXRjaF9mbihjdXJyZW50X2V2ZW50KToKLSAgICAgICAgICAgICAgICBldmVudCA9IGN1cnJlbnRfZXZlbnQKLSAgICAgICAgZXhjZXB0IEVtcHR5OgotICAgICAgICAgICAgY29udGludWUKLSAgICBsb2dnaW5nLmRlYnVnKCJEb25lIHdhaXRpbmcgZm9yIGFuIGV2ZW50IikKLSAgICBpZiBldmVudCBpcyBOb25lOgotICAgICAgICByZXR1cm4gICMgQXZvaWQgYW4gYXNzZXJ0IGluIE1lc3NhZ2VUb1N0cmluZyhOb25lLCAuLi4pCi0gICAgYXNzZXJ0X3RydWUoaXN0cmVhbSwgZXZlbnQgaXMgTm9uZSwgbXNnPSdFeHBlY3RlZCBOb25lIG1hdGNoaW5nLCBidXQgZ290IHt9Jy5mb3JtYXQocHJldHR5X3ByaW50KGV2ZW50KSkpCi0KLQotZGVmIE5PVF9GT1JfWU9VX2Fzc2VydF9ub25lKGlzdHJlYW0sIHRpbWVvdXQpOgotICAgIGxvZ2dpbmcuZGVidWcoImFzc2VydF9ub25lICVmcyIgJSAodGltZW91dC50b3RhbF9zZWNvbmRzKCkpKQotICAgIHRyeToKLSAgICAgICAgZXZlbnQgPSBpc3RyZWFtLmdldF9ldmVudF9xdWV1ZSgpLmdldCh0aW1lb3V0PXRpbWVvdXQudG90YWxfc2Vjb25kcygpKQotICAgICAgICBhc3NlcnRfdHJ1ZShpc3RyZWFtLCBldmVudCBpcyBOb25lLCBtc2c9J0V4cGVjdGVkIE5vbmUsIGJ1dCBnb3Qge30nLmZvcm1hdChwcmV0dHlfcHJpbnQoZXZlbnQpKSkKLSAgICBleGNlcHQgRW1wdHk6Ci0gICAgICAgIHJldHVybgpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9nZF9iYXNlX3Rlc3QucHkgYi9nZC9jZXJ0L2dkX2Jhc2VfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzZDEzNS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2dkX2Jhc2VfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBpbXBvcnRsaWIKLWltcG9ydCBvcwotaW1wb3J0IHRyYWNlYmFjawotCi1mcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKLWZyb20gZ3JwYyBpbXBvcnQgUnBjRXJyb3IKLQotZnJvbSBhY3RzIGltcG9ydCBhc3NlcnRzLCBzaWduYWxzCi1mcm9tIGFjdHMuY29udGV4dCBpbXBvcnQgZ2V0X2N1cnJlbnRfY29udGV4dAotZnJvbSBhY3RzLmJhc2VfdGVzdCBpbXBvcnQgQmFzZVRlc3RDbGFzcwotCi1mcm9tIGNlcnQuZ2RfZGV2aWNlIGltcG9ydCBNT0JMWV9DT05UUk9MTEVSX0NPTkZJR19OQU1FIGFzIENPTlRST0xMRVJfQ09ORklHX05BTUUKLWZyb20gY2VydC5nZF9iYXNlX3Rlc3RfbGliIGltcG9ydCBzZXR1cF9yb290Y2FuYWwKLWZyb20gY2VydC5nZF9iYXNlX3Rlc3RfbGliIGltcG9ydCB0ZWFyZG93bl9yb290Y2FuYWwKLWZyb20gY2VydC5nZF9iYXNlX3Rlc3RfbGliIGltcG9ydCBkdW1wX2NyYXNoZXNfY29yZQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IGdlbmVyYXRlX2NvdmVyYWdlX3JlcG9ydF9mb3JfaG9zdAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBnZXRfZ2Rfcm9vdAotCi1mcm9tIGZhY2FkZSBpbXBvcnQgcm9vdHNlcnZpY2VfcGIyIGFzIGZhY2FkZV9yb290c2VydmljZQotCi0KLWNsYXNzIEdkQmFzZVRlc3RDbGFzcyhCYXNlVGVzdENsYXNzKToKLQotICAgIFNVQlBST0NFU1NfV0FJVF9USU1FT1VUX1NFQ09ORFMgPSAxMAotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGUsIGNlcnRfbW9kdWxlKToKLSAgICAgICAgc2VsZi5kdXRfbW9kdWxlID0gZHV0X21vZHVsZQotICAgICAgICBzZWxmLmNlcnRfbW9kdWxlID0gY2VydF9tb2R1bGUKLSAgICAgICAgc2VsZi5kdXRfY292ZXJhZ2VfaW5mbyA9IE5vbmUKLSAgICAgICAgc2VsZi5jZXJ0X2NvdmVyYWdlX2luZm8gPSBOb25lCi0KLSAgICBkZWYgdGVhcmRvd25fY2xhc3Moc2VsZik6Ci0gICAgICAgICMgYXNzdW1lIGVhY2ggdGVzdCBydW5zIHRoZSBzYW1lIGJpbmFyeSBmb3IgZHV0IGFuZCBjZXJ0Ci0gICAgICAgICMgZ2VuZXJhdGUgY292ZXJhZ2UgcmVwb3J0IGFmdGVyIHJ1bm5pbmcgYWxsIHRlc3RzIGluIGEgY2xhc3MKLSAgICAgICAgaWYgc2VsZi5kdXRfY292ZXJhZ2VfaW5mbzoKLSAgICAgICAgICAgIGdlbmVyYXRlX2NvdmVyYWdlX3JlcG9ydF9mb3JfaG9zdChzZWxmLmR1dF9jb3ZlcmFnZV9pbmZvKQotICAgICAgICAgICAgc2VsZi5kdXRfY292ZXJhZ2VfaW5mbyA9IE5vbmUKLSAgICAgICAgaWYgc2VsZi5jZXJ0X2NvdmVyYWdlX2luZm86Ci0gICAgICAgICAgICBnZW5lcmF0ZV9jb3ZlcmFnZV9yZXBvcnRfZm9yX2hvc3Qoc2VsZi5jZXJ0X2NvdmVyYWdlX2luZm8pCi0gICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbyA9IE5vbmUKLQotICAgIGRlZiBzZXRfY29udHJvbGxlcl9wcm9wZXJ0aWVzX3BhdGgoc2VsZiwgcGF0aCk6Ci0gICAgICAgIGFic29sdXRlX3BhdGggPSBvcy5wYXRoLmpvaW4oZ2V0X2dkX3Jvb3QoKSwgcGF0aCkKLSAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoYWJzb2x1dGVfcGF0aCk6Ci0gICAgICAgICAgICBzZWxmLmNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlID0gYWJzb2x1dGVfcGF0aAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQoYWJzb2x1dGVfcGF0aCArICIgbm90IGV4aXN0ISIpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5sb2dfcGF0aF9iYXNlID0gZ2V0X2N1cnJlbnRfY29udGV4dCgpLmdldF9mdWxsX291dHB1dF9wYXRoKCkKLSAgICAgICAgc2VsZi52ZXJib3NlX21vZGUgPSBib29sKHNlbGYudXNlcl9wYXJhbXMuZ2V0KCd2ZXJib3NlX21vZGUnLCBGYWxzZSkpCi0gICAgICAgIGZvciBjb25maWcgaW4gc2VsZi5jb250cm9sbGVyX2NvbmZpZ3NbQ09OVFJPTExFUl9DT05GSUdfTkFNRV06Ci0gICAgICAgICAgICBjb25maWdbJ3ZlcmJvc2VfbW9kZSddID0gc2VsZi52ZXJib3NlX21vZGUKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb250cm9sbGVyX3Byb3BlcnRpZXNfZmlsZSA9IHNlbGYuY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUgPSAnJwotCi0gICAgICAgIHNlbGYuaW5mbyA9IHNldHVwX3Jvb3RjYW5hbCgKLSAgICAgICAgICAgIGR1dF9tb2R1bGU9c2VsZi5kdXRfbW9kdWxlLAotICAgICAgICAgICAgY2VydF9tb2R1bGU9c2VsZi5jZXJ0X21vZHVsZSwKLSAgICAgICAgICAgIHZlcmJvc2VfbW9kZT1zZWxmLnZlcmJvc2VfbW9kZSwKLSAgICAgICAgICAgIGxvZ19wYXRoX2Jhc2U9c2VsZi5sb2dfcGF0aF9iYXNlLAotICAgICAgICAgICAgY29udHJvbGxlcl9jb25maWdzPXNlbGYuY29udHJvbGxlcl9jb25maWdzLAotICAgICAgICAgICAgY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGU9Y29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUpCi0gICAgICAgIHNlbGYucm9vdGNhbmFsX3J1bm5pbmcgPSBzZWxmLmluZm9bJ3Jvb3RjYW5hbF9ydW5uaW5nJ10KLSAgICAgICAgc2VsZi5yb290Y2FuYWxfbG9ncGF0aCA9IHNlbGYuaW5mb1sncm9vdGNhbmFsX2xvZ3BhdGgnXQotICAgICAgICBzZWxmLnJvb3RjYW5hbF9wcm9jZXNzID0gc2VsZi5pbmZvWydyb290Y2FuYWxfcHJvY2VzcyddCi0gICAgICAgIHNlbGYucm9vdGNhbmFsX2xvZ2dlciA9IHNlbGYuaW5mb1sncm9vdGNhbmFsX2xvZ2dlciddCi0KLSAgICAgICAgaWYgJ3Jvb3RjYW5hbCcgaW4gc2VsZi5jb250cm9sbGVyX2NvbmZpZ3M6Ci0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKHNlbGYuaW5mb1sncm9vdGNhbmFsX2V4aXN0J10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb290IGNhbmFsIGRvZXMgbm90IGV4aXN0IGF0ICVzIiAlIHNlbGYuaW5mb1sncm9vdGNhbmFsJ10pCi0gICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKHNlbGYuaW5mb1snbWFrZV9yb290Y2FuYWxfcG9ydHNfYXZhaWxhYmxlJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbWFrZSByb290IGNhbmFsIHBvcnRzIGF2YWlsYWJsZSIpCi0KLSAgICAgICAgICAgIHNlbGYubG9nLmRlYnVnKCJSdW5uaW5nICVzIiAlICIgIi5qb2luKHNlbGYuaW5mb1sncm9vdGNhbmFsX2NtZCddKSkKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICAgICAgc2VsZi5pbmZvWydpc19yb290Y2FuYWxfcHJvY2Vzc19zdGFydGVkJ10sCi0gICAgICAgICAgICAgICAgbXNnPSJDYW5ub3Qgc3RhcnQgcm9vdC1jYW5hbCBhdCAiICsgc3RyKHNlbGYuaW5mb1sncm9vdGNhbmFsJ10pKQotICAgICAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShzZWxmLmluZm9bJ2lzX3N1YnByb2Nlc3NfYWxpdmUnXSwgbXNnPSJyb290LWNhbmFsIHN0b3BwZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcnVubmluZyIpCi0KLSAgICAgICAgICAgIHNlbGYuY29udHJvbGxlcl9jb25maWdzID0gc2VsZi5pbmZvWydjb250cm9sbGVyX2NvbmZpZ3MnXQotCi0gICAgICAgICMgUGFyc2UgYW5kIGNvbnN0cnVjdCBHRCBkZXZpY2Ugb2JqZWN0cwotICAgICAgICBzZWxmLnJlZ2lzdGVyX2NvbnRyb2xsZXIoaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ2NlcnQuZ2RfZGV2aWNlJyksIGJ1aWx0aW49VHJ1ZSkKLSAgICAgICAgc2VsZi5kdXQgPSBzZWxmLmdkX2RldmljZXNbMV0KLSAgICAgICAgc2VsZi5jZXJ0ID0gc2VsZi5nZF9kZXZpY2VzWzBdCi0gICAgICAgIGlmIHNlbGYuZHV0Lmhvc3Rfb25seV9kZXZpY2U6Ci0gICAgICAgICAgICBuZXdfZHV0X2NvdmVyYWdlX2luZm8gPSBzZWxmLmR1dC5nZXRfY292ZXJhZ2VfaW5mbygpCi0gICAgICAgICAgICBpZiBzZWxmLmR1dF9jb3ZlcmFnZV9pbmZvOgotICAgICAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZHV0X2NvdmVyYWdlX2luZm8gPT0gbmV3X2R1dF9jb3ZlcmFnZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICBtc2c9IkRVVCBjb3ZlcmFnZSBpbmZvIG11c3QgYmUgdGhlIHNhbWUgZm9yIGVhY2ggdGVzdCBydW4sIG9sZDoge30sIG5ldzoge30iLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHV0X2NvdmVyYWdlX2luZm8sIG5ld19kdXRfY292ZXJhZ2VfaW5mbykpCi0gICAgICAgICAgICBzZWxmLmR1dF9jb3ZlcmFnZV9pbmZvID0gbmV3X2R1dF9jb3ZlcmFnZV9pbmZvCi0gICAgICAgIGlmIHNlbGYuY2VydC5ob3N0X29ubHlfZGV2aWNlOgotICAgICAgICAgICAgbmV3X2NlcnRfY292ZXJhZ2VfaW5mbyA9IHNlbGYuY2VydC5nZXRfY292ZXJhZ2VfaW5mbygpCi0gICAgICAgICAgICBpZiBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbzoKLSAgICAgICAgICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICAgICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbyA9PSBuZXdfY2VydF9jb3ZlcmFnZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICBtc2c9IkNFUlQgY292ZXJhZ2UgaW5mbyBtdXN0IGJlIHRoZSBzYW1lIGZvciBlYWNoIHRlc3QgcnVuLCBvbGQ6IHt9LCBuZXc6IHt9Ii5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbywgbmV3X2NlcnRfY292ZXJhZ2VfaW5mbykpCi0gICAgICAgICAgICBzZWxmLmNlcnRfY292ZXJhZ2VfaW5mbyA9IG5ld19jZXJ0X2NvdmVyYWdlX2luZm8KLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmR1dC5yb290c2VydmljZS5TdGFydFN0YWNrKAotICAgICAgICAgICAgICAgIGZhY2FkZV9yb290c2VydmljZS5TdGFydFN0YWNrUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3VuZGVyX3Rlc3Q9ZmFjYWRlX3Jvb3RzZXJ2aWNlLkJsdWV0b290aE1vZHVsZS5WYWx1ZShzZWxmLmR1dF9tb2R1bGUpKSkKLSAgICAgICAgZXhjZXB0IFJwY0Vycm9yIGFzIHJwY19lcnJvcjoKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiRmFpbGVkIHRvIHN0YXJ0IERVVCBzdGFjaywgUnBjRXJyb3I9eyFyfSIuZm9ybWF0KHJwY19lcnJvcikpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuY2VydC5yb290c2VydmljZS5TdGFydFN0YWNrKAotICAgICAgICAgICAgICAgIGZhY2FkZV9yb290c2VydmljZS5TdGFydFN0YWNrUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3VuZGVyX3Rlc3Q9ZmFjYWRlX3Jvb3RzZXJ2aWNlLkJsdWV0b290aE1vZHVsZS5WYWx1ZShzZWxmLmNlcnRfbW9kdWxlKSkpCi0gICAgICAgIGV4Y2VwdCBScGNFcnJvciBhcyBycGNfZXJyb3I6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkZhaWxlZCB0byBzdGFydCBDRVJUIHN0YWNrLCBScGNFcnJvcj17IXJ9Ii5mb3JtYXQocnBjX2Vycm9yKSkKLSAgICAgICAgc2VsZi5kdXQud2FpdF9jaGFubmVsX3JlYWR5KCkKLSAgICAgICAgc2VsZi5jZXJ0LndhaXRfY2hhbm5lbF9yZWFkeSgpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc3RhY2sgPSAiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzdGFjayA9ICJDRVJUIgotICAgICAgICAgICAgc2VsZi5jZXJ0LnJvb3RzZXJ2aWNlLlN0b3BTdGFjayhmYWNhZGVfcm9vdHNlcnZpY2UuU3RvcFN0YWNrUmVxdWVzdCgpKQotICAgICAgICAgICAgc3RhY2sgPSAiRFVUIgotICAgICAgICAgICAgc2VsZi5kdXQucm9vdHNlcnZpY2UuU3RvcFN0YWNrKGZhY2FkZV9yb290c2VydmljZS5TdG9wU3RhY2tSZXF1ZXN0KCkpCi0gICAgICAgIGV4Y2VwdCBScGNFcnJvciBhcyBycGNfZXJyb3I6Ci0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoIkZhaWxlZCB0byBzdG9wIHt9IHN0YWNrLCBScGNFcnJvcj17IXJ9Ii5mb3JtYXQoc3RhY2ssIHJwY19lcnJvcikpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAjIERlc3Ryb3kgR0QgZGV2aWNlIG9iamVjdHMKLSAgICAgICAgICAgIHNlbGYuX2NvbnRyb2xsZXJfbWFuYWdlci51bnJlZ2lzdGVyX2NvbnRyb2xsZXJzKCkKLSAgICAgICAgICAgIHRlYXJkb3duX3Jvb3RjYW5hbCgKLSAgICAgICAgICAgICAgICByb290Y2FuYWxfcnVubmluZz1zZWxmLnJvb3RjYW5hbF9ydW5uaW5nLAotICAgICAgICAgICAgICAgIHJvb3RjYW5hbF9wcm9jZXNzPXNlbGYucm9vdGNhbmFsX3Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgcm9vdGNhbmFsX2xvZ2dlcj1zZWxmLnJvb3RjYW5hbF9sb2dnZXIsCi0gICAgICAgICAgICAgICAgc3VicHJvY2Vzc193YWl0X3RpbWVvdXRfc2Vjb25kcz1zZWxmLlNVQlBST0NFU1NfV0FJVF9USU1FT1VUX1NFQ09ORFMpCi0KLSAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKToKLSAgICAgICAgYXR0ciA9IHN1cGVyKCkuX19nZXRhdHRyaWJ1dGVfXyhuYW1lKQotICAgICAgICBpZiBub3QgY2FsbGFibGUoYXR0cikgb3Igbm90IEdkQmFzZVRlc3RDbGFzcy5fX2lzX2VudHJ5X2Z1bmN0aW9uKG5hbWUpOgotICAgICAgICAgICAgcmV0dXJuIGF0dHIKLQotICAgICAgICBAd3JhcHMoYXR0cikKLSAgICAgICAgZGVmIF9fd3JhcHBlZCgqYXJncywgKiprd2FyZ3MpOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJldHVybiBhdHRyKCphcmdzLCAqKmt3YXJncykKLSAgICAgICAgICAgIGV4Y2VwdCBScGNFcnJvciBhcyBlOgotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9pbmZvID0gIiIuam9pbih0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbihlLl9fY2xhc3NfXywgZSwgZS5fX3RyYWNlYmFja19fKSkKLSAgICAgICAgICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICAiUnBjRXJyb3IgZHVyaW5nIHRlc3RcblxuUnBjRXJyb3I6XG5cbiVzXG4lcyIgJSAoZXhjZXB0aW9uX2luZm8sIHNlbGYuX19kdW1wX2NyYXNoZXMoKSkpCi0KLSAgICAgICAgcmV0dXJuIF9fd3JhcHBlZAotCi0gICAgX19FTlRSWV9NRVRIT0RTID0geyJzZXR1cF9jbGFzcyIsICJ0ZWFyZG93bl9jbGFzcyIsICJzZXR1cF90ZXN0IiwgInRlYXJkb3duX3Rlc3QifQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfX2lzX2VudHJ5X2Z1bmN0aW9uKG5hbWUpOgotICAgICAgICByZXR1cm4gbmFtZS5zdGFydHN3aXRoKCJ0ZXN0XyIpIG9yIG5hbWUgaW4gR2RCYXNlVGVzdENsYXNzLl9fRU5UUllfTUVUSE9EUwotCi0gICAgZGVmIF9fZHVtcF9jcmFzaGVzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuOiBmb3JtYXR0ZWQgc3RhY2sgdHJhY2VzIGlmIGZvdW5kLCBvciBsYXN0IGZldyBsaW5lcyBvZiBsb2cKLSAgICAgICAgIiIiCi0gICAgICAgIGNyYXNoX2RldGFpbCA9IGR1bXBfY3Jhc2hlc19jb3JlKAotICAgICAgICAgICAgZHV0PXNlbGYuZHV0LAotICAgICAgICAgICAgY2VydD1zZWxmLmNlcnQsCi0gICAgICAgICAgICByb290Y2FuYWxfcnVubmluZz1zZWxmLnJvb3RjYW5hbF9ydW5uaW5nLAotICAgICAgICAgICAgcm9vdGNhbmFsX3Byb2Nlc3M9c2VsZi5yb290Y2FuYWxfcHJvY2VzcywKLSAgICAgICAgICAgIHJvb3RjYW5hbF9sb2dwYXRoPXNlbGYucm9vdGNhbmFsX2xvZ3BhdGgpCi0gICAgICAgIHJldHVybiBjcmFzaF9kZXRhaWwKZGlmZiAtLWdpdCBhL2dkL2NlcnQvZ2RfYmFzZV90ZXN0X2xpYi5weSBiL2dkL2NlcnQvZ2RfYmFzZV90ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4YTA1Yi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2dkX2Jhc2VfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1pbXBvcnQgc2lnbmFsCi1pbXBvcnQgc3VicHJvY2VzcwotCi1mcm9tIGNlcnQuYXN5bmNfc3VicHJvY2Vzc19sb2dnZXIgaW1wb3J0IEFzeW5jU3VicHJvY2Vzc0xvZ2dlcgotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBnZXRfZ2Rfcm9vdAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCByZWFkX2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsCi1mcm9tIGNlcnQub3NfdXRpbHMgaW1wb3J0IGlzX3N1YnByb2Nlc3NfYWxpdmUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgbWFrZV9wb3J0c19hdmFpbGFibGUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgVGVybWluYWxDb2xvcgotCi0KLWRlZiBzZXR1cF9yb290Y2FuYWwoZHV0X21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgY2VydF9tb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgIHZlcmJvc2VfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgbG9nX3BhdGhfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcl9jb25maWdzLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyX3Byb3BlcnRpZXNfZmlsZT0nJyk6Ci0gICAgaW5mbyA9IHt9Ci0gICAgaW5mb1snZHV0X21vZHVsZSddID0gZHV0X21vZHVsZQotICAgIGluZm9bJ2NlcnRfbW9kdWxlJ10gPSBjZXJ0X21vZHVsZQotICAgIGluZm9bJ2NvbnRyb2xsZXJfY29uZmlncyddID0gY29udHJvbGxlcl9jb25maWdzCi0KLSAgICAjIFN0YXJ0IHJvb3QtY2FuYWwgaWYgbmVlZGVkCi0gICAgaW5mb1sncm9vdGNhbmFsX3J1bm5pbmcnXSA9IEZhbHNlCi0gICAgaW5mb1sncm9vdGNhbmFsX2xvZ3BhdGgnXSA9IE5vbmUKLSAgICBpbmZvWydyb290Y2FuYWxfcHJvY2VzcyddID0gTm9uZQotICAgIGluZm9bJ3Jvb3RjYW5hbF9sb2dnZXInXSA9IE5vbmUKLSAgICBpZiAncm9vdGNhbmFsJyBpbiBpbmZvWydjb250cm9sbGVyX2NvbmZpZ3MnXToKLSAgICAgICAgaW5mb1sncm9vdGNhbmFsX3J1bm5pbmcnXSA9IFRydWUKLSAgICAgICAgIyBHZXQgcm9vdCBjYW5hbCBiaW5hcnkKLSAgICAgICAgcm9vdGNhbmFsID0gb3MucGF0aC5qb2luKGdldF9nZF9yb290KCksICJyb290LWNhbmFsIikKLSAgICAgICAgaW5mb1sncm9vdGNhbmFsJ10gPSByb290Y2FuYWwKLSAgICAgICAgaW5mb1sncm9vdGNhbmFsX2V4aXN0J10gPSBvcy5wYXRoLmlzZmlsZShyb290Y2FuYWwpCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShyb290Y2FuYWwpOgotICAgICAgICAgICAgcmV0dXJuIGluZm8KLQotICAgICAgICAjIEdldCByb290IGNhbmFsIGxvZwotICAgICAgICByb290Y2FuYWxfbG9ncGF0aCA9IG9zLnBhdGguam9pbihsb2dfcGF0aF9iYXNlLCAncm9vdGNhbmFsX2xvZ3MudHh0JykKLSAgICAgICAgaW5mb1sncm9vdGNhbmFsX2xvZ3BhdGgnXSA9IHJvb3RjYW5hbF9sb2dwYXRoCi0gICAgICAgICMgTWFrZSBzdXJlIHBvcnRzIGFyZSBhdmFpbGFibGUKLSAgICAgICAgcm9vdGNhbmFsX2NvbmZpZyA9IGluZm9bJ2NvbnRyb2xsZXJfY29uZmlncyddWydyb290Y2FuYWwnXQotICAgICAgICByb290Y2FuYWxfdGVzdF9wb3J0ID0gaW50KHJvb3RjYW5hbF9jb25maWcuZ2V0KCJ0ZXN0X3BvcnQiLCAiNjQwMSIpKQotICAgICAgICByb290Y2FuYWxfaGNpX3BvcnQgPSBpbnQocm9vdGNhbmFsX2NvbmZpZy5nZXQoImhjaV9wb3J0IiwgIjY0MDIiKSkKLSAgICAgICAgcm9vdGNhbmFsX2xpbmtfbGF5ZXJfcG9ydCA9IGludChyb290Y2FuYWxfY29uZmlnLmdldCgibGlua19sYXllcl9wb3J0IiwgIjY0MDMiKSkKLQotICAgICAgICBpbmZvWydtYWtlX3Jvb3RjYW5hbF9wb3J0c19hdmFpbGFibGUnXSA9IG1ha2VfcG9ydHNfYXZhaWxhYmxlKChyb290Y2FuYWxfdGVzdF9wb3J0LCByb290Y2FuYWxfaGNpX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RjYW5hbF9saW5rX2xheWVyX3BvcnQpKQotICAgICAgICBpZiBub3QgbWFrZV9wb3J0c19hdmFpbGFibGUoKHJvb3RjYW5hbF90ZXN0X3BvcnQsIHJvb3RjYW5hbF9oY2lfcG9ydCwgcm9vdGNhbmFsX2xpbmtfbGF5ZXJfcG9ydCkpOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigKLSAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZyZWUgcG9ydHMgcm9vdGNhbmFsX3Rlc3RfcG9ydD17fSwgcm9vdGNhbmFsX2hjaV9wb3J0PXt9LCByb290Y2FuYWxfbGlua19sYXllcl9wb3J0PXt9Ii4KLSAgICAgICAgICAgICAgICBmb3JtYXQocm9vdGNhbmFsX3Rlc3RfcG9ydCwgcm9vdGNhbmFsX2hjaV9wb3J0LCByb290Y2FuYWxfbGlua19sYXllcl9wb3J0KSkKLSAgICAgICAgICAgIHJldHVybiBpbmZvCi0KLSAgICAgICAgIyBTdGFydCByb290IGNhbmFsIHByb2Nlc3MKLSAgICAgICAgcm9vdGNhbmFsX2NtZCA9IFsKLSAgICAgICAgICAgIHJvb3RjYW5hbCwKLSAgICAgICAgICAgIHN0cihyb290Y2FuYWxfdGVzdF9wb3J0KSwKLSAgICAgICAgICAgIHN0cihyb290Y2FuYWxfaGNpX3BvcnQpLAotICAgICAgICAgICAgc3RyKHJvb3RjYW5hbF9saW5rX2xheWVyX3BvcnQpLCAnLWNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlPScgKyBjb250cm9sbGVyX3Byb3BlcnRpZXNfZmlsZQotICAgICAgICBdCi0gICAgICAgIGluZm9bJ3Jvb3RjYW5hbF9jbWQnXSA9IHJvb3RjYW5hbF9jbWQKLQotICAgICAgICByb290Y2FuYWxfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgICAgICByb290Y2FuYWxfY21kLAotICAgICAgICAgICAgY3dkPWdldF9nZF9yb290KCksCi0gICAgICAgICAgICBlbnY9b3MuZW52aXJvbi5jb3B5KCksCi0gICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAotICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCi0KLSAgICAgICAgaW5mb1sncm9vdGNhbmFsX3Byb2Nlc3MnXSA9IHJvb3RjYW5hbF9wcm9jZXNzCi0gICAgICAgIGlmIHJvb3RjYW5hbF9wcm9jZXNzOgotICAgICAgICAgICAgaW5mb1snaXNfcm9vdGNhbmFsX3Byb2Nlc3Nfc3RhcnRlZCddID0gVHJ1ZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaW5mb1snaXNfcm9vdGNhbmFsX3Byb2Nlc3Nfc3RhcnRlZCddID0gRmFsc2UKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoInJvb3RjYW5hbCBwcm9jZXNzIGZhaWxlZCB0byBzdGFydCIpCi0gICAgICAgICAgICByZXR1cm4gaW5mbwotICAgICAgICBpbmZvWydpc19zdWJwcm9jZXNzX2FsaXZlJ10gPSBpc19zdWJwcm9jZXNzX2FsaXZlKHJvb3RjYW5hbF9wcm9jZXNzKQotICAgICAgICBpZiBub3QgaXNfc3VicHJvY2Vzc19hbGl2ZShyb290Y2FuYWxfcHJvY2Vzcyk6Ci0gICAgICAgICAgICBpbmZvWydpc19zdWJwcm9jZXNzX2FsaXZlJ10gPSBGYWxzZQotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigicm9vdGNhbmFsIGRpZWQgYWZ0ZXIgcnVubmluZyIpCi0gICAgICAgICAgICByZXR1cm4gaW5mbwotCi0gICAgICAgIGluZm9bJ3Jvb3RjYW5hbF9sb2dnZXInXSA9IEFzeW5jU3VicHJvY2Vzc0xvZ2dlcigKLSAgICAgICAgICAgIHJvb3RjYW5hbF9wcm9jZXNzLCBbcm9vdGNhbmFsX2xvZ3BhdGhdLAotICAgICAgICAgICAgbG9nX3RvX3N0ZG91dD12ZXJib3NlX21vZGUsCi0gICAgICAgICAgICB0YWc9InJvb3RjYW5hbCIsCi0gICAgICAgICAgICBjb2xvcj1UZXJtaW5hbENvbG9yLk1BR0VOVEEpCi0KLSAgICAgICAgIyBNb2RpZnkgdGhlIGRldmljZSBjb25maWcgdG8gaW5jbHVkZSB0aGUgY29ycmVjdCByb290LWNhbmFsIHBvcnQKLSAgICAgICAgZm9yIGdkX2RldmljZV9jb25maWcgaW4gaW5mb1snY29udHJvbGxlcl9jb25maWdzJ10uZ2V0KCJHZERldmljZSIpOgotICAgICAgICAgICAgZ2RfZGV2aWNlX2NvbmZpZ1sicm9vdGNhbmFsX3BvcnQiXSA9IHN0cihyb290Y2FuYWxfaGNpX3BvcnQpCi0KLSAgICByZXR1cm4gaW5mbwotCi0KLWRlZiB0ZWFyZG93bl9yb290Y2FuYWwocm9vdGNhbmFsX3J1bm5pbmcsIHJvb3RjYW5hbF9wcm9jZXNzLCByb290Y2FuYWxfbG9nZ2VyLCBzdWJwcm9jZXNzX3dhaXRfdGltZW91dF9zZWNvbmRzKToKLSAgICBpZiByb290Y2FuYWxfcnVubmluZzoKLSAgICAgICAgc3RvcF9zaWduYWwgPSBzaWduYWwuU0lHSU5UCi0gICAgICAgIHJvb3RjYW5hbF9wcm9jZXNzLnNlbmRfc2lnbmFsKHN0b3Bfc2lnbmFsKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm5fY29kZSA9IHJvb3RjYW5hbF9wcm9jZXNzLndhaXQodGltZW91dD1zdWJwcm9jZXNzX3dhaXRfdGltZW91dF9zZWNvbmRzKQotICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkZhaWxlZCB0byBpbnRlcnJ1cHQgcm9vdCBjYW5hbCB2aWEgU0lHSU5ULCBzZW5kaW5nIFNJR0tJTEwiKQotICAgICAgICAgICAgc3RvcF9zaWduYWwgPSBzaWduYWwuU0lHS0lMTAotICAgICAgICAgICAgcm9vdGNhbmFsX3Byb2Nlc3Mua2lsbCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSByb290Y2FuYWxfcHJvY2Vzcy53YWl0KHRpbWVvdXQ9c3VicHJvY2Vzc193YWl0X3RpbWVvdXRfc2Vjb25kcykKLSAgICAgICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkZhaWxlZCB0byBraWxsIHJvb3QgY2FuYWwiKQotICAgICAgICAgICAgICAgIHJldHVybl9jb2RlID0gLTY1NTM2Ci0gICAgICAgIGlmIHJldHVybl9jb2RlICE9IDAgYW5kIHJldHVybl9jb2RlICE9IC1zdG9wX3NpZ25hbDoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoInJvb3RjYW5hbCBzdG9wcGVkIHdpdGggY29kZTogJWQiICUgcmV0dXJuX2NvZGUpCi0gICAgICAgIHJvb3RjYW5hbF9sb2dnZXIuc3RvcCgpCi0KLQotZGVmIGR1bXBfY3Jhc2hlc19jb3JlKGR1dCwgY2VydCwgcm9vdGNhbmFsX3J1bm5pbmcsIHJvb3RjYW5hbF9wcm9jZXNzLCByb290Y2FuYWxfbG9ncGF0aCk6Ci0gICAgZHV0X2NyYXNoLCBkdXRfbG9nX3RhaWwgPSBkdXQuZ2V0X2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsKCkKLSAgICBjZXJ0X2NyYXNoLCBjZXJ0X2xvZ190YWlsID0gY2VydC5nZXRfY3Jhc2hfc25pcHBldF9hbmRfbG9nX3RhaWwoKQotICAgIHJvb3RjYW5hbF9jcmFzaCA9IE5vbmUKLSAgICByb290Y2FuYWxfbG9nX3RhaWwgPSBOb25lCi0gICAgaWYgcm9vdGNhbmFsX3J1bm5pbmcgYW5kIG5vdCBpc19zdWJwcm9jZXNzX2FsaXZlKHJvb3RjYW5hbF9wcm9jZXNzKToKLSAgICAgICAgcm9vdGNhbmFsX2NyYXNoLCByb29jYW5hbF9sb2dfdGFpbCA9IHJlYWRfY3Jhc2hfc25pcHBldF9hbmRfbG9nX3RhaWwocm9vdGNhbmFsX2xvZ3BhdGgpCi0KLSAgICBjcmFzaF9kZXRhaWwgPSAiIgotICAgIGlmIGR1dF9jcmFzaCBvciBjZXJ0X2NyYXNoIG9yIHJvb3RjYW5hbF9jcmFzaDoKLSAgICAgICAgaWYgcm9vdGNhbmFsX2NyYXNoOgotICAgICAgICAgICAgY3Jhc2hfZGV0YWlsICs9ICJyb290Y2FuYWwgY3Jhc2hlZDpcblxuJXNcblxuIiAlIHJvb3RjYW5hbF9jcmFzaAotICAgICAgICBpZiBkdXRfY3Jhc2g6Ci0gICAgICAgICAgICBjcmFzaF9kZXRhaWwgKz0gImR1dCBzdGFjayBjcmFzaGVkOlxuXG4lc1xuXG4iICUgZHV0X2NyYXNoCi0gICAgICAgIGlmIGNlcnRfY3Jhc2g6Ci0gICAgICAgICAgICBjcmFzaF9kZXRhaWwgKz0gImNlcnQgc3RhY2sgY3Jhc2hlZDpcblxuJXNcblxuIiAlIGNlcnRfY3Jhc2gKLSAgICBlbHNlOgotICAgICAgICBpZiByb290Y2FuYWxfbG9nX3RhaWw6Ci0gICAgICAgICAgICBjcmFzaF9kZXRhaWwgKz0gInJvb3RjYW5hbCBsb2cgdGFpbDpcblxuJXNcblxuIiAlIHJvb3RjYW5hbF9sb2dfdGFpbAotICAgICAgICBpZiBkdXRfbG9nX3RhaWw6Ci0gICAgICAgICAgICBjcmFzaF9kZXRhaWwgKz0gImR1dCBsb2cgdGFpbDpcblxuJXNcblxuIiAlIGR1dF9sb2dfdGFpbAotICAgICAgICBpZiBjZXJ0X2xvZ190YWlsOgotICAgICAgICAgICAgY3Jhc2hfZGV0YWlsICs9ICJjZXJ0IGxvZyB0YWlsOlxuXG4lc1xuXG4iICUgY2VydF9sb2dfdGFpbAotCi0gICAgcmV0dXJuIGNyYXNoX2RldGFpbApkaWZmIC0tZ2l0IGEvZ2QvY2VydC9nZF9kZXZpY2UucHkgYi9nZC9jZXJ0L2dkX2RldmljZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjNzcwNi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2dkX2RldmljZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYWJjIGltcG9ydCBBQkMKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCi1pbXBvcnQgaW5zcGVjdAotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBvcwotaW1wb3J0IHBhdGhsaWIKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaWduYWwKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgdGltZQotZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLQotaW1wb3J0IGdycGMKLQotZnJvbSBhY3RzIGltcG9ydCBhc3NlcnRzCi1mcm9tIGFjdHMgaW1wb3J0IHV0aWxzCi1mcm9tIGFjdHMuY29udGV4dCBpbXBvcnQgZ2V0X2N1cnJlbnRfY29udGV4dAotZnJvbSBhY3RzLmNvbnRyb2xsZXJzLmFkYiBpbXBvcnQgQWRiUHJveHkKLWZyb20gYWN0cy5jb250cm9sbGVycy5hZGIgaW1wb3J0IEFkYkVycm9yCi1mcm9tIGFjdHMuY29udHJvbGxlcnMuYWRiX2xpYi5lcnJvciBpbXBvcnQgQWRiQ29tbWFuZEVycm9yCi0KLWZyb20gY2VydC5hc3luY19zdWJwcm9jZXNzX2xvZ2dlciBpbXBvcnQgQXN5bmNTdWJwcm9jZXNzTG9nZ2VyCi1mcm9tIGNlcnQuZ2RfZGV2aWNlX2xpYiBpbXBvcnQgY3JlYXRlX2NvcmUKLWZyb20gY2VydC5nZF9kZXZpY2VfbGliIGltcG9ydCBkZXN0cm95X2NvcmUKLWZyb20gY2VydC5nZF9kZXZpY2VfbGliIGltcG9ydCBnZXRfaW5mbwotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IHJlcGxhY2VfdmFycwotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IEdkRGV2aWNlQmFzZUNvcmUKLWZyb20gY2VydC5nZF9kZXZpY2VfbGliIGltcG9ydCBnZXRfY292ZXJhZ2VfcHJvZmRhdGFfcGF0aF9mb3JfaG9zdAotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IG1lcmdlX2NvdmVyYWdlX3Byb2ZkYXRhX2Zvcl9ob3N0Ci1mcm9tIGNlcnQuZ2RfZGV2aWNlX2xpYiBpbXBvcnQgTU9CTFlfQ09OVFJPTExFUl9DT05GSUdfTkFNRQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IEFDVFNfQ09OVFJPTExFUl9SRUZFUkVOQ0VfTkFNRQotZnJvbSBjZXJ0LmxvZ2dpbmdfY2xpZW50X2ludGVyY2VwdG9yIGltcG9ydCBMb2dnaW5nQ2xpZW50SW50ZXJjZXB0b3IKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgZ2V0X2dkX3Jvb3QKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgcmVhZF9jcmFzaF9zbmlwcGV0X2FuZF9sb2dfdGFpbAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBpc19zdWJwcm9jZXNzX2FsaXZlCi1mcm9tIGNlcnQub3NfdXRpbHMgaW1wb3J0IG1ha2VfcG9ydHNfYXZhaWxhYmxlCi1mcm9tIGNlcnQub3NfdXRpbHMgaW1wb3J0IFRlcm1pbmFsQ29sb3IKLWZyb20gZmFjYWRlIGltcG9ydCByb290c2VydmljZV9wYjJfZ3JwYyBhcyBmYWNhZGVfcm9vdHNlcnZpY2VfcGIyX2dycGMKLQotCi1kZWYgY3JlYXRlKGNvbmZpZ3MpOgotICAgIGNyZWF0ZV9jb3JlKGNvbmZpZ3MpCi0gICAgcmV0dXJuIGdldF9pbnN0YW5jZXNfd2l0aF9jb25maWdzKGNvbmZpZ3MpCi0KLQotZGVmIGRlc3Ryb3koZGV2aWNlcyk6Ci0gICAgZGVzdHJveV9jb3JlKGRldmljZXMpCi0KLQotZGVmIGdldF9pbnN0YW5jZXNfd2l0aF9jb25maWdzKGNvbmZpZ3MpOgotICAgIHByaW50KGNvbmZpZ3MpCi0gICAgZGV2aWNlcyA9IFtdCi0gICAgZm9yIGNvbmZpZyBpbiBjb25maWdzOgotICAgICAgICByZXNvbHZlZF9jbWQgPSBbXQotICAgICAgICBmb3IgYXJnIGluIGNvbmZpZ1siY21kIl06Ci0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKGFyZykKLSAgICAgICAgICAgIHJlc29sdmVkX2NtZC5hcHBlbmQocmVwbGFjZV92YXJzKGFyZywgY29uZmlnKSkKLSAgICAgICAgdmVyYm9zZV9tb2RlID0gYm9vbChjb25maWcuZ2V0KCd2ZXJib3NlX21vZGUnLCBGYWxzZSkpCi0gICAgICAgIGlmIGNvbmZpZy5nZXQoInNlcmlhbF9udW1iZXIiKToKLSAgICAgICAgICAgIGRldmljZSA9IEdkQW5kcm9pZERldmljZShjb25maWdbImdycGNfcG9ydCJdLCBjb25maWdbImdycGNfcm9vdF9zZXJ2ZXJfcG9ydCJdLCBjb25maWdbInNpZ25hbF9wb3J0Il0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRfY21kLCBjb25maWdbImxhYmVsIl0sIE1PQkxZX0NPTlRST0xMRVJfQ09ORklHX05BTUUsIGNvbmZpZ1sibmFtZSJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sic2VyaWFsX251bWJlciJdLCB2ZXJib3NlX21vZGUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBkZXZpY2UgPSBHZEhvc3RPbmx5RGV2aWNlKGNvbmZpZ1siZ3JwY19wb3J0Il0sIGNvbmZpZ1siZ3JwY19yb290X3NlcnZlcl9wb3J0Il0sIGNvbmZpZ1sic2lnbmFsX3BvcnQiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRfY21kLCBjb25maWdbImxhYmVsIl0sIE1PQkxZX0NPTlRST0xMRVJfQ09ORklHX05BTUUsIGNvbmZpZ1sibmFtZSJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlX21vZGUpCi0gICAgICAgIGRldmljZS5zZXR1cCgpCi0gICAgICAgIGRldmljZXMuYXBwZW5kKGRldmljZSkKLSAgICByZXR1cm4gZGV2aWNlcwotCi0KLWNsYXNzIEdkRGV2aWNlQmFzZShHZERldmljZUJhc2VDb3JlKToKLSAgICAiIiIKLSAgICBCYXNlIEdEIGRldmljZSBjbGFzcyB0aGF0IGNvdmVycyBjb21tb24gdHJhaXRzIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUKLSAgICBkZXZpY2UgbXVzdCBiZSBkcml2ZW4gYnkgYSBkcml2ZXItbGlrZSBiYWNraW5nIHByb2Nlc3MgdGhhdCB0YWtlcyBmb2xsb3dpbmcKLSAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzOgotICAgIC0tZ3JwYy1wb3J0OiBtYWluIGVudHJ5IHBvcnQgZm9yIGZhY2FkZSBzZXJ2aWNlcwotICAgIC0tcm9vdC1zZXJ2ZXItcG9ydDogbWFuYWdlbWVudCBwb3J0IGZvciBzdGFydGluZyBhbmQgc3RvcHBpbmcgc2VydmljZXMKLSAgICAtLWJ0c25vb3A6IHBhdGggdG8gYnRzbm9vcCBIQ0kgbG9nCi0gICAgLS1zaWduYWwtcG9ydDogc2lnbmFsaW5nIHBvcnQgdG8gaW5kaWNhdGUgdGhhdCBiYWNraW5nIHByb2Nlc3MgaXMgc3RhcnRlZAotICAgIC0tcm9vdGNhbmFsLXBvcnQ6IHJvb3QtY2FuYWwgSENJIHBvcnQsIG9wdGlvbmFsCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JwY19wb3J0OiBzdHIsIGdycGNfcm9vdF9zZXJ2ZXJfcG9ydDogc3RyLCBzaWduYWxfcG9ydDogc3RyLCBjbWQ6IExpc3Rbc3RyXSwgbGFiZWw6IHN0ciwKLSAgICAgICAgICAgICAgICAgdHlwZV9pZGVudGlmaWVyOiBzdHIsIG5hbWU6IHN0ciwgdmVyYm9zZV9tb2RlOiBib29sKToKLSAgICAgICAgIiIiVmVyaWZ5IGFyZ3VtZW50cyBhbmQgbG9nIHBhdGgsIGluaXRpYWxpemUgQmFzZSBHRCBkZXZpY2UsIGNvbW1vbiB0cmFpdHMKLSAgICAgICAgIGZvciBib3RoIGRldmljZSBiYXNlZCBhbmQgaG9zdCBvbmx5IEdEIGNlcnQgdGVzdHMKLSAgICAgICAgOnBhcmFtIGdycGNfcG9ydDogbWFpbiBnUlBDIHNlcnZpY2UgcG9ydAotICAgICAgICA6cGFyYW0gZ3JwY19yb290X3NlcnZlcl9wb3J0OiBnUlBDIHJvb3Qgc2VydmVyIHBvcnQKLSAgICAgICAgOnBhcmFtIHNpZ25hbF9wb3J0OiBzaWduYWxpbmcgcG9ydCBmb3IgYmFja2luZyBwcm9jZXNzIHN0YXJ0IHVwCi0gICAgICAgIDpwYXJhbSBjbWQ6IGxpc3Qgb2YgYXJndW1lbnRzIHRvIHJ1biBpbiBiYWNraW5nIHByb2Nlc3MKLSAgICAgICAgOnBhcmFtIGxhYmVsOiBkZXZpY2UgbGFiZWwgdXNlZCBpbiBsb2dzCi0gICAgICAgIDpwYXJhbSB0eXBlX2lkZW50aWZpZXI6IGRldmljZSB0eXBlIGlkZW50aWZpZXIgdXNlZCBpbiBsb2dzCi0gICAgICAgIDpwYXJhbSBuYW1lOiBuYW1lIG9mIGRldmljZSB1c2VkIGluIGxvZ3MKLSAgICAgICAgIiIiCi0gICAgICAgICMgTXVzdCBiZSBhdCB0aGUgZmlyc3QgbGluZSBvZiBfX2luaXRfXyBtZXRob2QKLSAgICAgICAgdmFsdWVzID0gbG9jYWxzKCkKLSAgICAgICAgYXJndW1lbnRzID0gW3ZhbHVlc1thcmddIGZvciBhcmcgaW4gaW5zcGVjdC5nZXRmdWxsYXJnc3BlYyhHZERldmljZUJhc2UuX19pbml0X18pLmFyZ3MgaWYgYXJnICE9ICJ2ZXJib3NlX21vZGUiXQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKGFsbChhcmd1bWVudHMpLCAiQWxsIGFyZ3VtZW50cyB0byBHZERldmljZUJhc2UgbXVzdCBub3QgYmUgTm9uZSBub3IgZW1wdHkiKQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKGFsbChjbWQpLCAiY21kIGxpc3Qgc2hvdWxkIG5vdCBoYXZlIE5vbmUgbm9yIGVtcHR5IGNvbXBvbmVudCIpCi0KLSAgICAgICAgIyBsb2dnaW5nLmxvZ19wYXRoIG9ubHkgZXhpc3RzIHdoZW4gdGhpcyBpcyB1c2VkIGluIGFuIEFDVFMgdGVzdCBydW4uCi0gICAgICAgIHNlbGYubG9nX3BhdGhfYmFzZSA9IGdldF9jdXJyZW50X2NvbnRleHQoKS5nZXRfZnVsbF9vdXRwdXRfcGF0aCgpCi0gICAgICAgIHNlbGYudGVzdF9ydW5uZXJfYmFzZV9wYXRoID0gXAotICAgICAgICAgICAgZ2V0X2N1cnJlbnRfY29udGV4dCgpLmdldF9iYXNlX291dHB1dF9wYXRoKCkKLQotICAgICAgICBHZERldmljZUJhc2VDb3JlLl9faW5pdF9fKHNlbGYsIGdycGNfcG9ydCwgZ3JwY19yb290X3NlcnZlcl9wb3J0LCBzaWduYWxfcG9ydCwgY21kLCBsYWJlbCwgdHlwZV9pZGVudGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZlcmJvc2VfbW9kZSwgc2VsZi5sb2dfcGF0aF9iYXNlLCBzZWxmLnRlc3RfcnVubmVyX2Jhc2VfcGF0aCkKLQotICAgIGRlZiBzZXR1cChzZWxmKToKLSAgICAgICAgIiIiSW5oZXJpdGVkIHNldHVwIG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MgdG8gc2V0IHVwIHRoaXMgZGV2aWNlIGZvciB0ZXN0LAotICAgICAgICBlbnN1cmUgc2lnbmFsIHBvcnQgaXMgYXZhaWxhYmxlIGFuZCBiYWNraW5nIHByb2Nlc3MgaXMgc3RhcnRlZCBhbmQgYWxpdmUsCi0gICAgICAgIG11c3QgcnVuIGJlZm9yZSB1c2luZyB0aGlzIGRldmljZQotICAgICAgICAtIEFmdGVyIGNhbGxpbmcgdGhpcywgdGVhcmRvd24oKSBtdXN0IGJlIGNhbGxlZCB3aGVuIHRlc3QgZmluaXNoZXMKLSAgICAgICAgLSBTaG91bGQgYmUgZXhlY3V0ZWQgYWZ0ZXIgY2hpbGRyZW4gY2xhc3Nlcycgc2V0dXAoKSBtZXRob2RzCi0gICAgICAgIDpyZXR1cm46Ci0gICAgICAgICIiIgotICAgICAgICBHZERldmljZUJhc2VDb3JlLnNldHVwKHNlbGYpCi0KLSAgICAgICAgIyBFbnN1cmUgYmFja2luZyBwcm9jZXNzIGlzIHN0YXJ0ZWQgYW5kIGFsaXZlCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5iYWNraW5nX3Byb2Nlc3MsIG1zZz0iQ2Fubm90IHN0YXJ0IGJhY2tpbmdfcHJvY2VzcyBhdCAiICsgIiAiLmpvaW4oc2VsZi5jbWQpKQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICAgICAgc2VsZi5pc19iYWNraW5nX3Byb2Nlc3NfYWxpdmUsCi0gICAgICAgICAgICBtc2c9ImJhY2tpbmdfcHJvY2VzcyBzdG9wcGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJ1bm5pbmcgIiArICIgIi5qb2luKHNlbGYuY21kKSkKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgICAgIHNlbGYuZ3JwY19yb290X3NlcnZlcl9yZWFkeSwgbXNnPSJnUlBDIHJvb3Qgc2VydmVyIGRpZCBub3Qgc3RhcnQgYWZ0ZXIgcnVubmluZyAiICsgIiAiLmpvaW4oc2VsZi5jbWQpKQotCi0gICAgZGVmIGdldF9jcmFzaF9zbmlwcGV0X2FuZF9sb2dfdGFpbChzZWxmKToKLSAgICAgICAgR2REZXZpY2VCYXNlQ29yZS5nZXRfY3Jhc2hfc25pcHBldF9hbmRfbG9nX3RhaWwoc2VsZikKLQotICAgIGRlZiB0ZWFyZG93bihzZWxmKToKLSAgICAgICAgIiIiSW5oZXJpdGVkIHRlYXJkb3duIG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MgdG8gdGVhciBkb3duIHRoaXMgZGV2aWNlCi0gICAgICAgIGFuZCBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzLgotICAgICAgICAtIE11c3QgYmUgY2FsbGVkIGFmdGVyIHNldHVwKCkKLSAgICAgICAgLSBTaG91bGQgYmUgZXhlY3V0ZWQgYmVmb3JlIGNoaWxkcmVuIGNsYXNzZXMnIHRlYXJkb3duKCkKLSAgICAgICAgOnJldHVybjoKLSAgICAgICAgIiIiCi0gICAgICAgIEdkRGV2aWNlQmFzZUNvcmUudGVhcmRvd24oc2VsZikKLQotICAgIGRlZiB3YWl0X2NoYW5uZWxfcmVhZHkoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIEdkRGV2aWNlQmFzZUNvcmUud2FpdF9jaGFubmVsX3JlYWR5KHNlbGYpCi0gICAgICAgIGV4Y2VwdCBncnBjLkZ1dHVyZVRpbWVvdXRFcnJvcjoKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiWyVzXSB3YWl0IGNoYW5uZWwgcmVhZHkgdGltZW91dCIgJSBzZWxmLmxhYmVsKQotCi0KLWNsYXNzIEdkSG9zdE9ubHlEZXZpY2UoR2REZXZpY2VCYXNlKToKLSAgICAiIiIKLSAgICBIb3N0IG9ubHkgZGV2aWNlIHdoZXJlIHRoZSBiYWNraW5nIHByb2Nlc3MgaXMgcnVubmluZyBvbiB0aGUgaG9zdCBtYWNoaW5lCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JwY19wb3J0OiBzdHIsIGdycGNfcm9vdF9zZXJ2ZXJfcG9ydDogc3RyLCBzaWduYWxfcG9ydDogc3RyLCBjbWQ6IExpc3Rbc3RyXSwgbGFiZWw6IHN0ciwKLSAgICAgICAgICAgICAgICAgdHlwZV9pZGVudGlmaWVyOiBzdHIsIG5hbWU6IHN0ciwgdmVyYm9zZV9tb2RlOiBib29sKToKLSAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhncnBjX3BvcnQsIGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCwgc2lnbmFsX3BvcnQsIGNtZCwgbGFiZWwsIE1PQkxZX0NPTlRST0xMRVJfQ09ORklHX05BTUUsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZV9tb2RlKQotICAgICAgICBzZWxmLmhvc3Rfb25seV9kZXZpY2UgPSBUcnVlCi0gICAgICAgICMgRW5hYmxlIExMVk0gY29kZSBjb3ZlcmFnZSBvdXRwdXQgZm9yIGhvc3Qgb25seSB0ZXN0cwotICAgICAgICBzZWxmLmJhY2tpbmdfcHJvY2Vzc19wcm9mcmF3X3BhdGggPSBwYXRobGliLlBhdGgoc2VsZi5sb2dfcGF0aF9iYXNlKS5qb2lucGF0aCgKLSAgICAgICAgICAgICIlc18lc19iYWNraW5nX2NvdmVyYWdlLnByb2ZyYXciICUgKHNlbGYudHlwZV9pZGVudGlmaWVyLCBzZWxmLmxhYmVsKSkKLSAgICAgICAgc2VsZi5lbnZpcm9ubWVudFsiTExWTV9QUk9GSUxFX0ZJTEUiXSA9IHN0cihzZWxmLmJhY2tpbmdfcHJvY2Vzc19wcm9mcmF3X3BhdGgpCi0gICAgICAgIGxsdm1fYmludXRpbHMgPSBwYXRobGliLlBhdGgoZ2V0X2dkX3Jvb3QoKSkuam9pbnBhdGgoImxsdm1fYmludXRpbHMiKS5qb2lucGF0aCgiYmluIikKLSAgICAgICAgbGx2bV9zeW1ib2xpemVyID0gbGx2bV9iaW51dGlscy5qb2lucGF0aCgibGx2bS1zeW1ib2xpemVyIikKLSAgICAgICAgaWYgbGx2bV9zeW1ib2xpemVyLmlzX2ZpbGUoKToKLSAgICAgICAgICAgIHNlbGYuZW52aXJvbm1lbnRbIkFTQU5fU1lNQk9MSVpFUl9QQVRIIl0gPSBsbHZtX3N5bWJvbGl6ZXIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiWyVzXSBDYW5ub3QgZmluZCBMTFZNIHN5bWJvbGl6ZXIgYXQgJXMiICUgKHNlbGYubGFiZWwsIHN0cihsbHZtX3N5bWJvbGl6ZXIpKSkKLSAgICAgICAgc2VsZi5wcm9mZGF0YV9wYXRoID0gZ2V0X2NvdmVyYWdlX3Byb2ZkYXRhX3BhdGhfZm9yX2hvc3Qoc2VsZi50ZXN0X3J1bm5lcl9iYXNlX3BhdGgsIHNlbGYudHlwZV9pZGVudGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsKQotCi0gICAgZGVmIHRlYXJkb3duKHNlbGYpOgotICAgICAgICBzdXBlcigpLnRlYXJkb3duKCkKLSAgICAgICAgbWVyZ2VfY292ZXJhZ2VfcHJvZmRhdGFfZm9yX2hvc3Qoc2VsZi5iYWNraW5nX3Byb2Nlc3NfcHJvZnJhd19wYXRoLCBzZWxmLnByb2ZkYXRhX3BhdGgsIHNlbGYubGFiZWwpCi0KLSAgICBkZWYgZ2V0X2NvdmVyYWdlX2luZm8oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBHZXQgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBjb3ZlcmFnZSByZXBvcnRpbmcKLSAgICAgICAgOnJldHVybjogYSBkaWN0aW9uYXJ5IHdpdGggYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY292ZXJhZ2UgcmVwb3J0aW5nCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgInByb2ZkYXRhX3BhdGgiOiBzZWxmLnByb2ZkYXRhX3BhdGgsCi0gICAgICAgICAgICAibGFiZWwiOiBzZWxmLmxhYmVsLAotICAgICAgICAgICAgInRlc3RfcnVubmVyX2Jhc2VfcGF0aCI6IHNlbGYudGVzdF9ydW5uZXJfYmFzZV9wYXRoLAotICAgICAgICAgICAgInR5cGVfaWRlbnRpZmllciI6IHNlbGYudHlwZV9pZGVudGlmaWVyLAotICAgICAgICAgICAgInN0YWNrX2JpbiI6IHNlbGYuY21kWzBdCi0gICAgICAgIH0KLQotICAgIGRlZiBzZXR1cChzZWxmKToKLSAgICAgICAgIyBFbnN1cmUgcG9ydHMgYXJlIGF2YWlsYWJsZQotICAgICAgICAjIE9ubHkgY2hlY2sgb24gaG9zdCBvbmx5IHRlc3QsIGZvciBBbmRyb2lkIGRldmljZXMsIHRoZXNlIHBvcnRzIHdpbGwKLSAgICAgICAgIyBiZSBvcGVuZWQgb24gQW5kcm9pZCBkZXZpY2UgYW5kIGhvc3QgbWFjaGluZSBwb3J0cyB3aWxsIGJlIG9jY3VwaWVkCi0gICAgICAgICMgYnkgc3NoZCBvciBhZGIgZm9yd2FyZGluZwotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKAotICAgICAgICAgICAgbWFrZV9wb3J0c19hdmFpbGFibGUoKHNlbGYuZ3JwY19wb3J0LCBzZWxmLmdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkpLAotICAgICAgICAgICAgIlslc10gRmFpbGVkIHRvIG1ha2UgYmFja2luZyBwcm9jZXNzIHBvcnRzIGF2YWlsYWJsZSIgJSBzZWxmLmxhYmVsKQotICAgICAgICBzdXBlcigpLnNldHVwKCkKLQotCi1jbGFzcyBHZEFuZHJvaWREZXZpY2UoR2REZXZpY2VCYXNlKToKLSAgICAiIiJSZWFsIEFuZHJvaWQgZGV2aWNlIHdoZXJlIHRoZSBiYWNraW5nIHByb2Nlc3MgaXMgcnVubmluZyBvbiBpdAotICAgICIiIgotCi0gICAgV0FJVF9GT1JfREVWSUNFX1RJTUVPVVRfU0VDT05EUyA9IDE4MAotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGdycGNfcG9ydDogc3RyLCBncnBjX3Jvb3Rfc2VydmVyX3BvcnQ6IHN0ciwgc2lnbmFsX3BvcnQ6IHN0ciwgY21kOiBMaXN0W3N0cl0sIGxhYmVsOiBzdHIsCi0gICAgICAgICAgICAgICAgIHR5cGVfaWRlbnRpZmllcjogc3RyLCBuYW1lOiBzdHIsIHNlcmlhbF9udW1iZXI6IHN0ciwgdmVyYm9zZV9tb2RlOiBib29sKToKLSAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhncnBjX3BvcnQsIGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCwgc2lnbmFsX3BvcnQsIGNtZCwgbGFiZWwsIHR5cGVfaWRlbnRpZmllciwgbmFtZSwgdmVyYm9zZV9tb2RlKQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKHNlcmlhbF9udW1iZXIsICJzZXJpYWxfbnVtYmVyIG11c3Qgbm90IGJlIE5vbmUgbm9yIGVtcHR5IikKLSAgICAgICAgc2VsZi5zZXJpYWxfbnVtYmVyID0gc2VyaWFsX251bWJlcgotICAgICAgICBzZWxmLmFkYiA9IEFkYlByb3h5KHNlcmlhbF9udW1iZXIpCi0KLSAgICBkZWYgc2V0dXAoc2VsZik6Ci0gICAgICAgIGxvZ2dpbmcuaW5mbygiU2V0dGluZyB1cCBkZXZpY2UgJXMgJXMiICUgKHNlbGYubGFiZWwsIHNlbGYuc2VyaWFsX251bWJlcikpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5hZGIuZW5zdXJlX3Jvb3QoKSwgImRldmljZSAlcyBjYW5ub3QgcnVuIGFzIHJvb3QiLCBzZWxmLnNlcmlhbF9udW1iZXIpCi0gICAgICAgIHNlbGYuZW5zdXJlX3Zlcml0eV9kaXNhYmxlZCgpCi0KLSAgICAgICAgIyBUcnkgZnJlZWluZyBwb3J0cyBhbmQgaWdub3JlIHJlc3VsdHMKLSAgICAgICAgc2VsZi5jbGVhbnVwX3BvcnRfZm9yd2FyZGluZygpCi0gICAgICAgIHNlbGYuc3luY19kZXZpY2VfdGltZSgpCi0KLSAgICAgICAgIyBTZXQgdXAgcG9ydCBmb3J3YXJkaW5nIG9yIHJldmVyc2Ugb3IgZGllCi0gICAgICAgIHNlbGYudGNwX2ZvcndhcmRfb3JfZGllKHNlbGYuZ3JwY19wb3J0LCBzZWxmLmdycGNfcG9ydCkKLSAgICAgICAgc2VsZi50Y3BfZm9yd2FyZF9vcl9kaWUoc2VsZi5ncnBjX3Jvb3Rfc2VydmVyX3BvcnQsIHNlbGYuZ3JwY19yb290X3NlcnZlcl9wb3J0KQotICAgICAgICBzZWxmLnRjcF9yZXZlcnNlX29yX2RpZShzZWxmLnNpZ25hbF9wb3J0LCBzZWxmLnNpZ25hbF9wb3J0KQotCi0gICAgICAgICMgUHVzaCB0ZXN0IGJpbmFyaWVzCi0gICAgICAgIHNlbGYucHVzaF9vcl9kaWUob3MucGF0aC5qb2luKGdldF9nZF9yb290KCksICJ0YXJnZXQiLCAiYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlIiksICJzeXN0ZW0vYmluIikKLSAgICAgICAgc2VsZi5wdXNoX29yX2RpZSgKLSAgICAgICAgICAgIG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAidGFyZ2V0IiwgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQuY29udHJvbC1WMS1uZGsuc28iKSwgInN5c3RlbS9saWI2NCIpCi0gICAgICAgIHNlbGYucHVzaF9vcl9kaWUob3MucGF0aC5qb2luKGdldF9nZF9yb290KCksICJ0YXJnZXQiLCAibGliYmx1ZXRvb3RoX2dkLnNvIiksICJzeXN0ZW0vbGliNjQiKQotICAgICAgICBzZWxmLnB1c2hfb3JfZGllKG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAidGFyZ2V0IiwgImxpYmdycGMrK191bnNlY3VyZS5zbyIpLCAic3lzdGVtL2xpYjY0IikKLSAgICAgICAgc2VsZi5wdXNoX29yX2RpZShvcy5wYXRoLmpvaW4oZ2V0X2dkX3Jvb3QoKSwgInRhcmdldCIsICJsaWJncnBjKysuc28iKSwgInN5c3RlbS9saWI2NCIpCi0gICAgICAgIHNlbGYucHVzaF9vcl9kaWUob3MucGF0aC5qb2luKGdldF9nZF9yb290KCksICJ0YXJnZXQiLCAibGliZ3JwY193cmFwLnNvIiksICJzeXN0ZW0vbGliNjQiKQotICAgICAgICBzZWxmLnB1c2hfb3JfZGllKG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAidGFyZ2V0IiwgImxpYnN0YXRzbG9nX2J0LnNvIiksICJzeXN0ZW0vbGliNjQiKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYWRiLnNoZWxsKCJybSAvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyIpCi0gICAgICAgIGV4Y2VwdCBBZGJDb21tYW5kRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICBpZiAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgbm90IGluIHN0cihlcnJvcik6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiRXJyb3IgZHVyaW5nIHNldHVwOiAiICsgc3RyKGVycm9yKSkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5zaGVsbCgicm0gL2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub296X2hjaS5sb2ciKQotICAgICAgICBleGNlcHQgQWRiQ29tbWFuZEVycm9yIGFzIGVycm9yOgotICAgICAgICAgICAgaWYgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiIG5vdCBpbiBzdHIoZXJyb3IpOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkVycm9yIGR1cmluZyBzZXR1cDogIiArIHN0cihlcnJvcikpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hZGIuc2hlbGwoInJtIC9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIikKLSAgICAgICAgZXhjZXB0IEFkYkNvbW1hbmRFcnJvciBhcyBlcnJvcjoKLSAgICAgICAgICAgIGlmICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiBub3QgaW4gc3RyKGVycm9yKToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJFcnJvciBkdXJpbmcgc2V0dXA6ICIgKyBzdHIoZXJyb3IpKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYWRiLnNoZWxsKCJybSAvZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuYmFrIikKLSAgICAgICAgZXhjZXB0IEFkYkNvbW1hbmRFcnJvciBhcyBlcnJvcjoKLSAgICAgICAgICAgIGlmICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiBub3QgaW4gc3RyKGVycm9yKToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJFcnJvciBkdXJpbmcgc2V0dXA6ICIgKyBzdHIoZXJyb3IpKQotCi0gICAgICAgIHNlbGYuZW5zdXJlX25vX291dHB1dChzZWxmLmFkYi5zaGVsbCgic3ZjIGJsdWV0b290aCBkaXNhYmxlIikpCi0KLSAgICAgICAgIyBTdGFydCBsb2djYXQgbG9nZ2luZwotICAgICAgICBzZWxmLmxvZ2NhdF9vdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbigKLSAgICAgICAgICAgIHNlbGYubG9nX3BhdGhfYmFzZSwgJyVzXyVzXyVzX2xvZ2NhdF9sb2dzLnR4dCcgJSAoc2VsZi50eXBlX2lkZW50aWZpZXIsIHNlbGYubGFiZWwsIHNlbGYuc2VyaWFsX251bWJlcikpCi0gICAgICAgIHNlbGYubG9nY2F0X2NtZCA9IFsiYWRiIiwgIi1zIiwgc2VsZi5zZXJpYWxfbnVtYmVyLCAibG9nY2F0IiwgIi1UIiwgIjEiLCAiLXYiLCAieWVhciIsICItdiIsICJ1aWQiXQotICAgICAgICBsb2dnaW5nLmRlYnVnKCJSdW5uaW5nICVzIiwgIiAiLmpvaW4oc2VsZi5sb2djYXRfY21kKSkKLSAgICAgICAgc2VsZi5sb2djYXRfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgICAgICBzZWxmLmxvZ2NhdF9jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5sb2djYXRfcHJvY2VzcywgbXNnPSJDYW5ub3Qgc3RhcnQgbG9nY2F0X3Byb2Nlc3MgYXQgIiArICIgIi5qb2luKHNlbGYubG9nY2F0X2NtZCkpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICBpc19zdWJwcm9jZXNzX2FsaXZlKHNlbGYubG9nY2F0X3Byb2Nlc3MpLAotICAgICAgICAgICAgbXNnPSJsb2djYXRfcHJvY2VzcyBzdG9wcGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJ1bm5pbmcgIiArICIgIi5qb2luKHNlbGYubG9nY2F0X2NtZCkpCi0gICAgICAgIHNlbGYubG9nY2F0X2xvZ2dlciA9IEFzeW5jU3VicHJvY2Vzc0xvZ2dlcigKLSAgICAgICAgICAgIHNlbGYubG9nY2F0X3Byb2Nlc3MsIFtzZWxmLmxvZ2NhdF9vdXRwdXRfcGF0aF0sCi0gICAgICAgICAgICBsb2dfdG9fc3Rkb3V0PXNlbGYudmVyYm9zZV9tb2RlLAotICAgICAgICAgICAgdGFnPSIlc18lcyIgJSAoc2VsZi5sYWJlbCwgc2VsZi5zZXJpYWxfbnVtYmVyKSwKLSAgICAgICAgICAgIGNvbG9yPXNlbGYudGVybWluYWxfY29sb3IpCi0KLSAgICAgICAgIyBEb25lIHJ1biBwYXJlbnQgc2V0dXAKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJEb25lIHByZXBhcmF0aW9uIGZvciAlcywgc3RhcnRpbmcgYmFja2luZyBwcm9jZXNzIiAlIHNlbGYuc2VyaWFsX251bWJlcikKLSAgICAgICAgc3VwZXIoKS5zZXR1cCgpCi0KLSAgICBkZWYgdGVhcmRvd24oc2VsZik6Ci0gICAgICAgIHN1cGVyKCkudGVhcmRvd24oKQotICAgICAgICBzdG9wX3NpZ25hbCA9IHNpZ25hbC5TSUdJTlQKLSAgICAgICAgc2VsZi5sb2djYXRfcHJvY2Vzcy5zZW5kX3NpZ25hbChzdG9wX3NpZ25hbCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSBzZWxmLmxvZ2NhdF9wcm9jZXNzLndhaXQodGltZW91dD1zZWxmLldBSVRfQ0hBTk5FTF9SRUFEWV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiWyVzXyVzXSBGYWlsZWQgdG8gaW50ZXJydXB0IGxvZ2NhdCBwcm9jZXNzIHZpYSBTSUdJTlQsIHNlbmRpbmcgU0lHS0lMTCIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sYWJlbCwgc2VsZi5zZXJpYWxfbnVtYmVyKSkKLSAgICAgICAgICAgIHN0b3Bfc2lnbmFsID0gc2lnbmFsLlNJR0tJTEwKLSAgICAgICAgICAgIHNlbGYubG9nY2F0X3Byb2Nlc3Mua2lsbCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSBzZWxmLmxvZ2NhdF9wcm9jZXNzLndhaXQodGltZW91dD1zZWxmLldBSVRfQ0hBTk5FTF9SRUFEWV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJGYWlsZWQgdG8ga2lsbCBsb2djYXRfcHJvY2VzcyAlcyAlcyIgJSAoc2VsZi5sYWJlbCwgc2VsZi5zZXJpYWxfbnVtYmVyKSkKLSAgICAgICAgICAgICAgICByZXR1cm5fY29kZSA9IC02NTUzNgotICAgICAgICBpZiByZXR1cm5fY29kZSBub3QgaW4gWy1zdG9wX3NpZ25hbCwgMF06Ci0gICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJsb2djYXRfcHJvY2VzcyAlc18lcyBzdG9wcGVkIHdpdGggY29kZTogJWQiICUgKHNlbGYubGFiZWwsIHNlbGYuc2VyaWFsX251bWJlciwgcmV0dXJuX2NvZGUpKQotICAgICAgICBzZWxmLmxvZ2NhdF9sb2dnZXIuc3RvcCgpCi0gICAgICAgIHNlbGYuY2xlYW51cF9wb3J0X2ZvcndhcmRpbmcoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5wdWxsKCIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyAlcyIgJSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICAgICAgc2VsZi5sb2dfcGF0aF9iYXNlLCAiJXNfYnRzbm9vcF9oY2kubG9nIiAlIHNlbGYubGFiZWwpKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICAjIFNvbWUgdGVzdHMgaGF2ZSBubyBzbm9vcCBsb2dzLCBhbmQgdGhhdCdzIE9LCi0gICAgICAgICAgICBpZiAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgbm90IGluIHN0cihlcnJvcik6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiV2hpbGUgdHJ5aW5nIHRvIHB1bGwgbG9nIGZpbGVzIiArIHN0cihlcnJvcikpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYWRiLnB1bGwoIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mICVzIiAlIG9zLnBhdGguam9pbihzZWxmLmxvZ19wYXRoX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzX2J0X2NvbmZpZy5jb25mIiAlIHNlbGYubGFiZWwpKQotICAgICAgICBleGNlcHQgQWRiRXJyb3IgYXMgZXJyb3I6Ci0gICAgICAgICAgICAjIFNvbWUgdGVzdHMgaGF2ZSBubyBjb25maWcgZmlsZSwgYW5kIHRoYXQncyBPSwotICAgICAgICAgICAgaWYgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiIG5vdCBpbiBzdHIoZXJyb3IpOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIldoaWxlIHRyeWluZyB0byBwdWxsIGxvZyBmaWxlcyIgKyBzdHIoZXJyb3IpKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5wdWxsKCIvZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuYmFrICVzIiAlIG9zLnBhdGguam9pbihzZWxmLmxvZ19wYXRoX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNfYnRfY29uZmlnLmJhayIgJSBzZWxmLmxhYmVsKSkKLSAgICAgICAgZXhjZXB0IEFkYkVycm9yIGFzIGVycm9yOgotICAgICAgICAgICAgIyBTb21lIHRlc3RzIGhhdmUgbm8gY29uZmlnLmJhayBmaWxlLCBhbmQgdGhhdCdzIE9LCi0gICAgICAgICAgICBpZiAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgbm90IGluIHN0cihlcnJvcik6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiV2hpbGUgdHJ5aW5nIHRvIHB1bGwgbG9nIGZpbGVzIiArIHN0cihlcnJvcikpCi0KLSAgICBkZWYgY2xlYW51cF9wb3J0X2ZvcndhcmRpbmcoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYWRiLnJlbW92ZV90Y3BfZm9yd2FyZChzZWxmLmdycGNfcG9ydCkKLSAgICAgICAgZXhjZXB0IEFkYkVycm9yIGFzIGVycm9yOgotICAgICAgICAgICAgbXNnID0gIkR1cmluZyBwb3J0IGZvcndhcmRpbmcgY2xlYW51cDogIiArIHN0cihlcnJvcikKLSAgICAgICAgICAgIGlmICJub3QgZm91bmQiIGluIG1zZzoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8obXNnKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKG1zZykKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5yZW1vdmVfdGNwX2ZvcndhcmQoc2VsZi5ncnBjX3Jvb3Rfc2VydmVyX3BvcnQpCi0gICAgICAgIGV4Y2VwdCBBZGJFcnJvciBhcyBlcnJvcjoKLSAgICAgICAgICAgIG1zZyA9ICJEdXJpbmcgcG9ydCBmb3J3YXJkaW5nIGNsZWFudXA6ICIgKyBzdHIoZXJyb3IpCi0gICAgICAgICAgICBpZiAibm90IGZvdW5kIiBpbiBtc2c6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKG1zZykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcihtc2cpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hZGIucmV2ZXJzZSgiLS1yZW1vdmUgdGNwOiVkIiAlIHNlbGYuc2lnbmFsX3BvcnQpCi0gICAgICAgIGV4Y2VwdCBBZGJFcnJvciBhcyBlcnJvcjoKLSAgICAgICAgICAgIG1zZyA9ICJEdXJpbmcgcG9ydCBmb3J3YXJkaW5nIGNsZWFudXA6ICIgKyBzdHIoZXJyb3IpCi0gICAgICAgICAgICBpZiAibm90IGZvdW5kIiBpbiBtc2c6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKG1zZykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcihtc2cpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIGVuc3VyZV9ub19vdXRwdXQocmVzdWx0KToKLSAgICAgICAgIiIiCi0gICAgICAgIEVuc3VyZSBhIGNvbW1hbmQgaGFzIG5vdCBvdXRwdXQKLSAgICAgICAgIiIiCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoCi0gICAgICAgICAgICByZXN1bHQgaXMgTm9uZSBvciBsZW4ocmVzdWx0KSA9PSAwLCBtc2c9ImNvbW1hbmQgcmV0dXJuZWQgc29tZXRoaW5nIHdoZW4gaXQgc2hvdWxkbid0OiAlcyIgJSByZXN1bHQpCi0KLSAgICBkZWYgc3luY19kZXZpY2VfdGltZShzZWxmKToKLSAgICAgICAgc2VsZi5hZGIuc2hlbGwoInNldHRpbmdzIHB1dCBnbG9iYWwgYXV0b190aW1lIDAiKQotICAgICAgICBzZWxmLmFkYi5zaGVsbCgic2V0dGluZ3MgcHV0IGdsb2JhbCBhdXRvX3RpbWVfem9uZSAwIikKLSAgICAgICAgZGV2aWNlX3R6ID0gc2VsZi5hZGIuc2hlbGwoImRhdGUgKyV6IikKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShkZXZpY2VfdHosICJkYXRlICsleiBtdXN0IHJldHVybiBkZXZpY2UgdGltZXpvbmUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHJldHVybmVkIHt9IGluc3RlYWQiLmZvcm1hdChkZXZpY2VfdHopKQotICAgICAgICBob3N0X3R6ID0gdGltZS5zdHJmdGltZSgiJXoiKQotICAgICAgICBpZiBkZXZpY2VfdHogIT0gaG9zdF90ejoKLSAgICAgICAgICAgIHRhcmdldF90aW1lem9uZSA9IHV0aWxzLmdldF90aW1lem9uZV9vbHNvbl9pZCgpCi0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJEZXZpY2UgdGltZXpvbmUgJXMgZG9lcyBub3QgbWF0Y2ggaG9zdCB0aW1lem9uZSAlcywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAic3luY2luZyB0aGVtIGJ5IHNldHRpbmcgdGltZXpvbmUgdG8gJXMiICUgKGRldmljZV90eiwgaG9zdF90eiwgdGFyZ2V0X3RpbWV6b25lKSkKLSAgICAgICAgICAgIHNlbGYuYWRiLnNoZWxsKCJzZXRwcm9wIHBlcnNpc3Quc3lzLnRpbWV6b25lICVzIiAlIHRhcmdldF90aW1lem9uZSkKLSAgICAgICAgICAgIHNlbGYucmVib290KCkKLSAgICAgICAgICAgIHNlbGYuYWRiLnJlbW91bnQoKQotICAgICAgICAgICAgZGV2aWNlX3R6ID0gc2VsZi5hZGIuc2hlbGwoImRhdGUgKyV6IikKLSAgICAgICAgICAgIGFzc2VydHMuYXNzZXJ0X2VxdWFsKAotICAgICAgICAgICAgICAgIGhvc3RfdHosIGRldmljZV90eiwgIkRldmljZSB0aW1lem9uZSAlcyBzdGlsbCBkb2VzIG5vdCBtYXRjaCBob3N0ICIKLSAgICAgICAgICAgICAgICAidGltZXpvbmUgJXMgYWZ0ZXIgcmVzZXQiICUgKGRldmljZV90eiwgaG9zdF90eikpCi0gICAgICAgIHNlbGYuYWRiLnNoZWxsKCJkYXRlICVzIiAlIHRpbWUuc3RyZnRpbWUoIiVtJWQlSCVNJVkuJVMiKSkKLSAgICAgICAgZGF0ZXRpbWVfZm9ybWF0ID0gIiVZLSVtLSVkVCVIOiVNOiVTJXoiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGRldmljZV90aW1lID0gZGF0ZXRpbWUuc3RycHRpbWUoc2VsZi5hZGIuc2hlbGwoImRhdGUgKyclcyciICUgZGF0ZXRpbWVfZm9ybWF0KSwgZGF0ZXRpbWVfZm9ybWF0KQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbCgiRmFpbGVkIHRvIGdldCB0aW1lIGFmdGVyIHN5bmMiKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICMgSW5jbHVkZSBBREIgZGVsYXkgdGhhdCBtaWdodCBiZSBsb25nZXIgaW4gU1NIIGVudmlyb25tZW50Ci0gICAgICAgIG1heF9kZWx0YV9zZWNvbmRzID0gMwotICAgICAgICBob3N0X3RpbWUgPSBkYXRldGltZS5ub3codHo9ZGV2aWNlX3RpbWUudHppbmZvKQotICAgICAgICBhc3NlcnRzLmFzc2VydF9hbG1vc3RfZXF1YWwoCi0gICAgICAgICAgICAoZGV2aWNlX3RpbWUgLSBob3N0X3RpbWUpLnRvdGFsX3NlY29uZHMoKSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICBtc2c9IkRldmljZSB0aW1lICVzIGFuZCBob3N0IHRpbWUgJXMgb2ZmIGJ5ID4lZG1zIGFmdGVyIHN5bmMiICUKLSAgICAgICAgICAgIChkZXZpY2VfdGltZS5pc29mb3JtYXQoKSwgaG9zdF90aW1lLmlzb2Zvcm1hdCgpLCBpbnQobWF4X2RlbHRhX3NlY29uZHMgKiAxMDAwKSksCi0gICAgICAgICAgICBkZWx0YT1tYXhfZGVsdGFfc2Vjb25kcykKLQotICAgIGRlZiBwdXNoX29yX2RpZShzZWxmLCBzcmNfZmlsZV9wYXRoLCBkc3RfZmlsZV9wYXRoLCBwdXNoX3RpbWVvdXQ9MzAwKToKLSAgICAgICAgIiIiUHVzaGVzIGEgZmlsZSB0byB0aGUgQW5kcm9pZCBkZXZpY2UKLQotICAgICAgICBBcmdzOgotICAgICAgICAgICAgc3JjX2ZpbGVfcGF0aDogVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gaW5zdGFsbC4KLSAgICAgICAgICAgIGRzdF9maWxlX3BhdGg6IFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgIHB1c2hfdGltZW91dDogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHB1c2ggdG8gZmluaXNoIGluIHNlY29uZHMKLSAgICAgICAgIiIiCi0gICAgICAgIG91dCA9IHNlbGYuYWRiLnB1c2goJyVzICVzJyAlIChzcmNfZmlsZV9wYXRoLCBkc3RfZmlsZV9wYXRoKSwgdGltZW91dD1wdXNoX3RpbWVvdXQpCi0gICAgICAgIGlmICdlcnJvcicgaW4gb3V0OgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCdVbmFibGUgdG8gcHVzaCBmaWxlICVzIHRvICVzIGR1ZSB0byAlcycgJSAoc3JjX2ZpbGVfcGF0aCwgZHN0X2ZpbGVfcGF0aCwgb3V0KSkKLQotICAgIGRlZiB0Y3BfZm9yd2FyZF9vcl9kaWUoc2VsZiwgaG9zdF9wb3J0LCBkZXZpY2VfcG9ydCwgbnVtX3JldHJ5PTEpOgotICAgICAgICAiIiIKLSAgICAgICAgRm9yd2FyZCBhIFRDUCBwb3J0IGZyb20gaG9zdCB0byBkZXZpY2Ugb3IgZmFpbAotICAgICAgICA6cGFyYW0gaG9zdF9wb3J0OiBob3N0IHBvcnQsIGludCwgMCBmb3IgYWRiIHRvIGFzc2lnbiBvbmUKLSAgICAgICAgOnBhcmFtIGRldmljZV9wb3J0OiBkZXZpY2UgcG9ydCwgaW50Ci0gICAgICAgIDpwYXJhbSBudW1fcmV0cnk6IG51bWJlciBvZiB0aW1lcyB0byByZWJvb3QgYW5kIHJldHJ5IHRoaXMgYmVmb3JlIGR5aW5nCi0gICAgICAgIDpyZXR1cm46IGhvc3QgcG9ydCBpbnQKLSAgICAgICAgIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGVycm9yX29yX3BvcnQgPSBzZWxmLmFkYi50Y3BfZm9yd2FyZChob3N0X3BvcnQsIGRldmljZV9wb3J0KQotICAgICAgICAgICAgaWYgbm90IGVycm9yX29yX3BvcnQ6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaG9zdCBwb3J0ICVkIHdhcyBhbHJlYWR5IGZvcndhcmRlZCIgJSBob3N0X3BvcnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RfcG9ydAotICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXJyb3Jfb3JfcG9ydCwgaW50KToKLSAgICAgICAgICAgICAgICBpZiBudW1fcmV0cnkgPiAwOgotICAgICAgICAgICAgICAgICAgICAjIElmIHJlcXVlc3RlZCwgcmVib290IGFuIHJldHJ5Ci0gICAgICAgICAgICAgICAgICAgIG51bV9yZXRyeSAtPSAxCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdIEZhaWxlZCB0byBUQ1AgZm9yd2FyZCBob3N0IHBvcnQgJWQgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgImRldmljZSBwb3J0ICVkLCBudW1fcmV0cmllcyBsZWZ0IGlzICVkIiAlIChzZWxmLmxhYmVsLCBob3N0X3BvcnQsIGRldmljZV9wb3J0LCBudW1fcmV0cnkpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLnJlYm9vdCgpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYWRiLnJlbW91bnQoKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50Y3BfZm9yd2FyZF9vcl9kaWUoaG9zdF9wb3J0LCBkZXZpY2VfcG9ydCwgbnVtX3JldHJ5PW51bV9yZXRyeSkKLSAgICAgICAgICAgICAgICBhc3NlcnRzLmZhaWwoJ1VuYWJsZSB0byBmb3J3YXJkIGhvc3QgcG9ydCAlZCB0byBkZXZpY2UgcG9ydCAlZCwgZXJyb3IgJXMnICUgKGhvc3RfcG9ydCwgZGV2aWNlX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9vcl9wb3J0KSkKLSAgICAgICAgICAgIHJldHVybiBlcnJvcl9vcl9wb3J0Ci0gICAgICAgIGV4Y2VwdCBBZGJFcnJvcjoKLSAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygKLSAgICAgICAgICAgICAgICAiWyVzXSBGYWlsZWQgdG8gVENQIGZvcndhcmQgaG9zdCBwb3J0ICVkIHRvIGRldmljZSBwb3J0ICVkIiAlIChzZWxmLmxhYmVsLCBob3N0X3BvcnQsIGRldmljZV9wb3J0KSkKLSAgICAgICAgICAgIGZvcndhcmRfbGlzdCA9IHNlbGYuYWRiLmZvcndhcmQoIi0tbGlzdCIpCi0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIlslc10gZm9yd2FyZCBwb3J0IGxpc3Q6ICVzIiAlIChzZWxmLmxhYmVsLCBmb3J3YXJkX2xpc3QpKQotICAgICAgICAgICAgcG9ydF9zdGF0dXNfY21kID0gIm5ldHN0YXQgLW50bHAgfCBncmVwICVzIiAlIGRldmljZV9wb3J0Ci0gICAgICAgICAgICBwb3J0X3N0YXR1cyA9IHN1YnByb2Nlc3MuUG9wZW4ocG9ydF9zdGF0dXNfY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5zdGRvdXQucmVhZCgpCi0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoInBvcnQgJXMgc3RhdHVzOiAlcyIgJSAoZGV2aWNlX3BvcnQsIHBvcnRfc3RhdHVzKSkKLQotICAgIGRlZiB0Y3BfcmV2ZXJzZV9vcl9kaWUoc2VsZiwgZGV2aWNlX3BvcnQsIGhvc3RfcG9ydCwgbnVtX3JldHJ5PTEpOgotICAgICAgICAiIiIKLSAgICAgICAgRm9yd2FyZCBhIFRDUCBwb3J0IGZyb20gZGV2aWNlIHRvIGhvc3Qgb3IgZmFpbAotICAgICAgICA6cGFyYW0gZGV2aWNlX3BvcnQ6IGRldmljZSBwb3J0LCBpbnQsIDAgZm9yIGFkYiB0byBhc3NpZ24gb25lCi0gICAgICAgIDpwYXJhbSBob3N0X3BvcnQ6IGhvc3QgcG9ydCwgaW50Ci0gICAgICAgIDpwYXJhbSBudW1fcmV0cnk6IG51bWJlciBvZiB0aW1lcyB0byByZWJvb3QgYW5kIHJldHJ5IHRoaXMgYmVmb3JlIGR5aW5nCi0gICAgICAgIDpyZXR1cm46IGRldmljZSBwb3J0IGludAotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZXJyb3Jfb3JfcG9ydCA9IHNlbGYuYWRiLnJldmVyc2UoInRjcDolZCB0Y3A6JWQiICUgKGRldmljZV9wb3J0LCBob3N0X3BvcnQpKQotICAgICAgICAgICAgaWYgbm90IGVycm9yX29yX3BvcnQ6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiZGV2aWNlIHBvcnQgJWQgd2FzIGFscmVhZHkgcmV2ZXJzZWQiICUgZGV2aWNlX3BvcnQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9wb3J0Ci0gICAgICAgICAgICBlcnJvcl9vcl9wb3J0ID0gaW50KGVycm9yX29yX3BvcnQpCi0gICAgICAgIGV4Y2VwdCBBZGJFcnJvcjoKLSAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygKLSAgICAgICAgICAgICAgICAiWyVzXSBGYWlsZWQgdG8gVENQIHJldmVyc2UgZGV2aWNlIHBvcnQgJWQgdG8gaG9zdCBwb3J0ICVkIiAlIChzZWxmLmxhYmVsLCBkZXZpY2VfcG9ydCwgaG9zdF9wb3J0KSkKLSAgICAgICAgICAgIHJldmVyc2VfbGlzdCA9IHNlbGYuYWRiLnJldmVyc2UoIi0tbGlzdCIpCi0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIlslc10gcmV2ZXJzZSBwb3J0IGxpc3Q6ICVzIiAlIChzZWxmLmxhYmVsLCByZXZlcnNlX2xpc3QpKQotICAgICAgICAgICAgcG9ydF9zdGF0dXNfY21kID0gIm5ldHN0YXQgLW50bHAgfCBncmVwICVzIiAlIGRldmljZV9wb3J0Ci0gICAgICAgICAgICBwb3J0X3N0YXR1cyA9IHN1YnByb2Nlc3MuUG9wZW4ocG9ydF9zdGF0dXNfY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5zdGRvdXQucmVhZCgpCi0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoInBvcnQgJXMgc3RhdHVzOiAlcyIgJSAoZGV2aWNlX3BvcnQsIHBvcnRfc3RhdHVzKSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBpZiBudW1fcmV0cnkgPiAwOgotICAgICAgICAgICAgICAgICMgSWYgcmVxdWVzdGVkLCByZWJvb3QgYW4gcmV0cnkKLSAgICAgICAgICAgICAgICBudW1fcmV0cnkgLT0gMQotICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgIlslc10gRmFpbGVkIHRvIFRDUCByZXZlcnNlIGRldmljZSBwb3J0ICVkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgImhvc3QgcG9ydCAlZCwgbnVtX3JldHJpZXMgbGVmdCBpcyAlZCIgJSAoc2VsZi5sYWJlbCwgZGV2aWNlX3BvcnQsIGhvc3RfcG9ydCwgbnVtX3JldHJ5KSkKLSAgICAgICAgICAgICAgICBzZWxmLnJlYm9vdCgpCi0gICAgICAgICAgICAgICAgc2VsZi5hZGIucmVtb3VudCgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudGNwX3JldmVyc2Vfb3JfZGllKGRldmljZV9wb3J0LCBob3N0X3BvcnQsIG51bV9yZXRyeT1udW1fcmV0cnkpCi0gICAgICAgICAgICBhc3NlcnRzLmZhaWwoCi0gICAgICAgICAgICAgICAgJ1VuYWJsZSB0byByZXZlcnNlIGRldmljZSBwb3J0ICVkIHRvIGhvc3QgcG9ydCAlZCwgZXJyb3IgJXMnICUgKGRldmljZV9wb3J0LCBob3N0X3BvcnQsIGVycm9yX29yX3BvcnQpKQotICAgICAgICByZXR1cm4gZXJyb3Jfb3JfcG9ydAotCi0gICAgZGVmIGVuc3VyZV92ZXJpdHlfZGlzYWJsZWQoc2VsZik6Ci0gICAgICAgICIiIkVuc3VyZXMgdGhhdCB2ZXJpdHkgaXMgZW5hYmxlZC4KLQotICAgICAgICBJZiB2ZXJpdHkgaXMgbm90IGVuYWJsZWQsIHRoaXMgY2FsbCB3aWxsIHJlYm9vdCB0aGUgcGhvbmUuIE5vdGUgdGhhdAotICAgICAgICB0aGlzIG9ubHkgd29ya3Mgb24gZGVidWdnYWJsZSBidWlsZHMuCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmRlYnVnKCJEaXNhYmxpbmcgdmVyaXR5IGFuZCByZW1vdW50IGZvciAlcyIsIHNlbGYuc2VyaWFsX251bWJlcikKLSAgICAgICAgIyBUaGUgYmVsb3cgcHJvcGVydGllcyB3aWxsIG9ubHkgZXhpc3QgaWYgdmVyaXR5IGhhcyBiZWVuIGVuYWJsZWQuCi0gICAgICAgIHN5c3RlbV92ZXJpdHkgPSBzZWxmLmFkYi5nZXRwcm9wKCdwYXJ0aXRpb24uc3lzdGVtLnZlcmlmaWVkJykKLSAgICAgICAgdmVuZG9yX3Zlcml0eSA9IHNlbGYuYWRiLmdldHByb3AoJ3BhcnRpdGlvbi52ZW5kb3IudmVyaWZpZWQnKQotICAgICAgICBpZiBzeXN0ZW1fdmVyaXR5IG9yIHZlbmRvcl92ZXJpdHk6Ci0gICAgICAgICAgICBzZWxmLmFkYi5kaXNhYmxlX3Zlcml0eSgpCi0gICAgICAgICAgICBzZWxmLnJlYm9vdCgpCi0gICAgICAgIHNlbGYuYWRiLnJlbW91bnQoKQotICAgICAgICBzZWxmLmFkYi53YWl0X2Zvcl9kZXZpY2UodGltZW91dD1zZWxmLldBSVRfRk9SX0RFVklDRV9USU1FT1VUX1NFQ09ORFMpCi0KLSAgICBkZWYgcmVib290KHNlbGYsIHRpbWVvdXRfbWludXRlcz0xNS4wKToKLSAgICAgICAgIiIiUmVib290cyB0aGUgZGV2aWNlLgotCi0gICAgICAgIFJlYm9vdCB0aGUgZGV2aWNlLCB3YWl0IGZvciBkZXZpY2UgdG8gY29tcGxldGUgYm9vdGluZy4KLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIlJlYm9vdGluZyAlcyIsIHNlbGYuc2VyaWFsX251bWJlcikKLSAgICAgICAgc2VsZi5hZGIucmVib290KCkKLQotICAgICAgICB0aW1lb3V0X3N0YXJ0ID0gdGltZS50aW1lKCkKLSAgICAgICAgdGltZW91dCA9IHRpbWVvdXRfbWludXRlcyAqIDYwCi0gICAgICAgICMgQW5kcm9pZCBzb21ldGltZXMgcmV0dXJuIGVhcmx5IGFmdGVyIGBhZGIgcmVib290YCBpcyBjYWxsZWQuIFRoaXMKLSAgICAgICAgIyBtZWFucyBzdWJzZXF1ZW50IGNhbGxzIG1heSBtYWtlIGl0IHRvIHRoZSBkZXZpY2UgYmVmb3JlIHRoZSByZWJvb3QKLSAgICAgICAgIyBnb2VzIHRocm91Z2gsIHJldHVybiBmYWxzZSBwb3NpdGl2ZXMgZm9yIGdldHByb3BzIHN1Y2ggYXMKLSAgICAgICAgIyBzeXMuYm9vdF9jb21wbGV0ZWQuCi0gICAgICAgIHdoaWxlIHRpbWUudGltZSgpIDwgdGltZW91dF9zdGFydCArIHRpbWVvdXQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hZGIuZ2V0X3N0YXRlKCkKLSAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKC4xKQotICAgICAgICAgICAgZXhjZXB0IEFkYkVycm9yOgotICAgICAgICAgICAgICAgICMgZ2V0X3N0YXRlIHdpbGwgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIGRldmljZSBpcyBub3QgZm91bmQuIFdlCi0gICAgICAgICAgICAgICAgIyB3YW50IHRoZSBkZXZpY2UgdG8gYmUgbWlzc2luZyB0byBwcm92ZSB0aGUgZGV2aWNlIGhhcyBraWNrZWQKLSAgICAgICAgICAgICAgICAjIG9mZiB0aGUgcmVib290LgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIG1pbnV0ZXNfbGVmdCA9IHRpbWVvdXRfbWludXRlcyAtICh0aW1lLnRpbWUoKSAtIHRpbWVvdXRfc3RhcnQpIC8gNjAuMAotICAgICAgICBzZWxmLndhaXRfZm9yX2Jvb3RfY29tcGxldGlvbih0aW1lb3V0X21pbnV0ZXM9bWludXRlc19sZWZ0KQotICAgICAgICBhc3NlcnRzLmFzc2VydF90cnVlKHNlbGYuYWRiLmVuc3VyZV9yb290KCksICJkZXZpY2UgJXMgY2Fubm90IHJ1biBhcyByb290IGFmdGVyIHJlYm9vdCIsIHNlbGYuc2VyaWFsX251bWJlcikKLQotICAgIGRlZiB3YWl0X2Zvcl9ib290X2NvbXBsZXRpb24oc2VsZiwgdGltZW91dF9taW51dGVzPTE1LjApOgotICAgICAgICAiIiIKLSAgICAgICAgV2FpdHMgZm9yIEFuZHJvaWQgZnJhbWV3b3JrIHRvIGJyb2FkY2FzdCBBQ1RJT05fQk9PVF9DT01QTEVURUQuCi0gICAgICAgIDpwYXJhbSB0aW1lb3V0X21pbnV0ZXM6IG51bWJlciBvZiBtaW51dGVzIHRvIHdhaXQKLSAgICAgICAgIiIiCi0gICAgICAgIHRpbWVvdXRfc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgICAgICB0aW1lb3V0ID0gdGltZW91dF9taW51dGVzICogNjAKLQotICAgICAgICBzZWxmLmFkYi53YWl0X2Zvcl9kZXZpY2UodGltZW91dD1zZWxmLldBSVRfRk9SX0RFVklDRV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgIHdoaWxlIHRpbWUudGltZSgpIDwgdGltZW91dF9zdGFydCArIHRpbWVvdXQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY29tcGxldGVkID0gc2VsZi5hZGIuZ2V0cHJvcCgic3lzLmJvb3RfY29tcGxldGVkIikKLSAgICAgICAgICAgICAgICBpZiBjb21wbGV0ZWQgPT0gJzEnOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGV4Y2VwdCBBZGJFcnJvcjoKLSAgICAgICAgICAgICAgICAjIGFkYiBzaGVsbCBjYWxscyBtYXkgZmFpbCBkdXJpbmcgY2VydGFpbiBwZXJpb2Qgb2YgYm9vdGluZwotICAgICAgICAgICAgICAgICMgcHJvY2Vzcywgd2hpY2ggaXMgbm9ybWFsLiBJZ25vcmluZyB0aGVzZSBlcnJvcnMuCi0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdGltZS5zbGVlcCg1KQotICAgICAgICBhc3NlcnRzLmZhaWwobXNnPSdEZXZpY2UgJXMgYm9vdGluZyBwcm9jZXNzIHRpbWVkIG91dC4nICUgc2VsZi5zZXJpYWxfbnVtYmVyKQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9nZF9kZXZpY2VfbGliLnB5IGIvZ2QvY2VydC9nZF9kZXZpY2VfbGliLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFkOTQwLi4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvZ2RfZGV2aWNlX2xpYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gYWJjIGltcG9ydCBBQkMKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgb3MKLWltcG9ydCBwYXRobGliCi1pbXBvcnQgc2h1dGlsCi1pbXBvcnQgc2lnbmFsCi1pbXBvcnQgc3VicHJvY2VzcwotCi1pbXBvcnQgZ3JwYwotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi0KLWZyb20gY2VydC5hc3luY19zdWJwcm9jZXNzX2xvZ2dlciBpbXBvcnQgQXN5bmNTdWJwcm9jZXNzTG9nZ2VyCi1mcm9tIGNlcnQubG9nZ2luZ19jbGllbnRfaW50ZXJjZXB0b3IgaW1wb3J0IExvZ2dpbmdDbGllbnRJbnRlcmNlcHRvcgotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBnZXRfZ2Rfcm9vdAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCByZWFkX2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsCi1mcm9tIGNlcnQub3NfdXRpbHMgaW1wb3J0IGlzX3N1YnByb2Nlc3NfYWxpdmUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgVGVybWluYWxDb2xvcgotZnJvbSBmYWNhZGUgaW1wb3J0IHJvb3RzZXJ2aWNlX3BiMl9ncnBjIGFzIGZhY2FkZV9yb290c2VydmljZV9wYjJfZ3JwYwotZnJvbSBoYWwgaW1wb3J0IGhhbF9mYWNhZGVfcGIyX2dycGMKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgaGNpX2ZhY2FkZV9wYjJfZ3JwYwotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBhY2xfbWFuYWdlcl9mYWNhZGVfcGIyX2dycGMKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgY29udHJvbGxlcl9mYWNhZGVfcGIyX2dycGMKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfYWNsX21hbmFnZXJfZmFjYWRlX3BiMl9ncnBjCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlX3BiMl9ncnBjCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZV9wYjJfZ3JwYwotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZV9wYjJfZ3JwYwotZnJvbSBsMmNhcC5jbGFzc2ljIGltcG9ydCBmYWNhZGVfcGIyX2dycGMgYXMgbDJjYXBfZmFjYWRlX3BiMl9ncnBjCi1mcm9tIGwyY2FwLmxlIGltcG9ydCBmYWNhZGVfcGIyX2dycGMgYXMgbDJjYXBfbGVfZmFjYWRlX3BiMl9ncnBjCi1mcm9tIGlzbyBpbXBvcnQgZmFjYWRlX3BiMl9ncnBjIGFzIGlzb19mYWNhZGVfcGIyX2dycGMKLWZyb20gbmVpZ2hib3IuZmFjYWRlIGltcG9ydCBmYWNhZGVfcGIyX2dycGMgYXMgbmVpZ2hib3JfZmFjYWRlX3BiMl9ncnBjCi1mcm9tIHNlY3VyaXR5IGltcG9ydCBmYWNhZGVfcGIyX2dycGMgYXMgc2VjdXJpdHlfZmFjYWRlX3BiMl9ncnBjCi1mcm9tIHNoaW0uZmFjYWRlIGltcG9ydCBmYWNhZGVfcGIyX2dycGMgYXMgc2hpbV9mYWNhZGVfcGIyX2dycGMKLQotTU9CTFlfQ09OVFJPTExFUl9DT05GSUdfTkFNRSA9ICJHZERldmljZSIKLUFDVFNfQ09OVFJPTExFUl9SRUZFUkVOQ0VfTkFNRSA9ICJnZF9kZXZpY2VzIgotCi1HUlBDX1NUQVJUX1RJTUVPVVRfU0VDID0gMTUKLQotCi1kZWYgY3JlYXRlX2NvcmUoY29uZmlncyk6Ci0gICAgaWYgbm90IGNvbmZpZ3M6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBpcyBlbXB0eSIpCi0gICAgZWxpZiBub3QgaXNpbnN0YW5jZShjb25maWdzLCBsaXN0KToKLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIHNob3VsZCBiZSBhIGxpc3QiKQotCi0KLWRlZiBkZXN0cm95X2NvcmUoZGV2aWNlcyk6Ci0gICAgZm9yIGRldmljZSBpbiBkZXZpY2VzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkZXZpY2UudGVhcmRvd24oKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiWyVzXSBGYWlsZWQgdG8gY2xlYW4gdXAgcHJvcGVybHkgZHVlIHRvIiAlIGRldmljZS5sYWJlbCkKLQotCi1kZWYgZ2V0X2luZm8oZGV2aWNlcyk6Ci0gICAgcmV0dXJuIFtdCi0KLQotZGVmIHJlcGxhY2VfdmFycyhzdHJpbmcsIGNvbmZpZyk6Ci0gICAgc2VyaWFsX251bWJlciA9IGNvbmZpZy5nZXQoInNlcmlhbF9udW1iZXIiKQotICAgIGlmIHNlcmlhbF9udW1iZXIgaXMgTm9uZToKLSAgICAgICAgc2VyaWFsX251bWJlciA9ICIiCi0gICAgcm9vdGNhbmFsX3BvcnQgPSBjb25maWcuZ2V0KCJyb290Y2FuYWxfcG9ydCIpCi0gICAgaWYgcm9vdGNhbmFsX3BvcnQgaXMgTm9uZToKLSAgICAgICAgcm9vdGNhbmFsX3BvcnQgPSAiIgotICAgIGlmIHNlcmlhbF9udW1iZXIgPT0gIkRVVCIgb3Igc2VyaWFsX251bWJlciA9PSAiQ0VSVCI6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRGlkIHlvdSBmb3JnZXQgdG8gY29uZmlndXJlIHRoZSBzZXJpYWwgbnVtYmVyPyIpCi0gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCIkR0RfUk9PVCIsIGdldF9nZF9yb290KCkpIFwKLSAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIiQoZ3JwY19wb3J0KSIsIGNvbmZpZy5nZXQoImdycGNfcG9ydCIpKSBcCi0gICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkKGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkiLCBjb25maWcuZ2V0KCJncnBjX3Jvb3Rfc2VydmVyX3BvcnQiKSkgXAotICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJChyb290Y2FuYWxfcG9ydCkiLCByb290Y2FuYWxfcG9ydCkgXAotICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJChzaWduYWxfcG9ydCkiLCBjb25maWcuZ2V0KCJzaWduYWxfcG9ydCIpKSBcCi0gICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkKHNlcmlhbF9udW1iZXIpIiwgc2VyaWFsX251bWJlcikKLQotCi1jbGFzcyBHZERldmljZUJhc2VDb3JlKEFCQyk6Ci0gICAgIiIiCi0gICAgQmFzZSBjbGFzcyBvZiBHZERldmljZUJhc2UgdGhhdCBjb3ZlcnMgY29tbW9uIHRyYWl0cyB1bmJvdW5kIG9mIEFDVFMgZGVwZW5kZW5jeQotICAgICIiIgotCi0gICAgV0FJVF9DSEFOTkVMX1JFQURZX1RJTUVPVVRfU0VDT05EUyA9IDEwCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JwY19wb3J0LCBncnBjX3Jvb3Rfc2VydmVyX3BvcnQsIHNpZ25hbF9wb3J0LCBjbWQsIGxhYmVsLCB0eXBlX2lkZW50aWZpZXIsIG5hbWUsIHZlcmJvc2VfbW9kZSwKLSAgICAgICAgICAgICAgICAgbG9nX3BhdGhfYmFzZSwgdGVzdF9ydW5uZXJfYmFzZV9wYXRoKToKLSAgICAgICAgIiIiQmFzZSBHRCBkZXZpY2UsIGNvbW1vbiB0cmFpdHMgZm9yIGJvdGggZGV2aWNlIGJhc2VkIGFuZCBob3N0IG9ubHkgR0QKLSAgICAgICAgY2VydCB0ZXN0cwotICAgICAgICA6cGFyYW0gZ3JwY19wb3J0OiBtYWluIGdSUEMgc2VydmljZSBwb3J0Ci0gICAgICAgIDpwYXJhbSBncnBjX3Jvb3Rfc2VydmVyX3BvcnQ6IGdSUEMgcm9vdCBzZXJ2ZXIgcG9ydAotICAgICAgICA6cGFyYW0gc2lnbmFsX3BvcnQ6IHNpZ25hbGluZyBwb3J0IGZvciBiYWNraW5nIHByb2Nlc3Mgc3RhcnQgdXAKLSAgICAgICAgOnBhcmFtIGNtZDogbGlzdCBvZiBhcmd1bWVudHMgdG8gcnVuIGluIGJhY2tpbmcgcHJvY2VzcwotICAgICAgICA6cGFyYW0gbGFiZWw6IGRldmljZSBsYWJlbCB1c2VkIGluIGxvZ3MKLSAgICAgICAgOnBhcmFtIHR5cGVfaWRlbnRpZmllcjogZGV2aWNlIHR5cGUgaWRlbnRpZmllciB1c2VkIGluIGxvZ3MKLSAgICAgICAgOnBhcmFtIG5hbWU6IG5hbWUgb2YgZGV2aWNlIHVzZWQgaW4gbG9ncwotICAgICAgICA6cGFyYW0gbG9nX3BhdGhfYmFzZTogcGF0aCB0byB0ZXN0IGNhc2UgbG9ncwotICAgICAgICA6cGFyYW0gdGVzdF9ydW5uZXJfYmFzZV9wYXRoOiBwYXRoIHRvIHRlc3QgcnVuIGxvZ3MKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYudmVyYm9zZV9tb2RlID0gdmVyYm9zZV9tb2RlCi0gICAgICAgIHNlbGYuaG9zdF9vbmx5X2RldmljZSA9IEZhbHNlCi0gICAgICAgIHNlbGYuZ3JwY19yb290X3NlcnZlcl9wb3J0ID0gaW50KGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkKLSAgICAgICAgc2VsZi5ncnBjX3BvcnQgPSBpbnQoZ3JwY19wb3J0KQotICAgICAgICBzZWxmLnNpZ25hbF9wb3J0ID0gaW50KHNpZ25hbF9wb3J0KQotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgICAgIHNlbGYudHlwZV9pZGVudGlmaWVyID0gdHlwZV9pZGVudGlmaWVyCi0gICAgICAgIHNlbGYubGFiZWwgPSBsYWJlbAotICAgICAgICBzZWxmLmxvZ19wYXRoX2Jhc2UgPSBsb2dfcGF0aF9iYXNlCi0gICAgICAgIHNlbGYudGVzdF9ydW5uZXJfYmFzZV9wYXRoID0gdGVzdF9ydW5uZXJfYmFzZV9wYXRoCi0gICAgICAgIHNlbGYuYmFja2luZ19wcm9jZXNzX2xvZ19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYubG9nX3BhdGhfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzXyVzX2JhY2tpbmdfbG9ncy50eHQnICUgKHNlbGYudHlwZV9pZGVudGlmaWVyLCBzZWxmLmxhYmVsKSkKLSAgICAgICAgaWYgIi0tYnRzbm9vcD0iIG5vdCBpbiAiICIuam9pbihjbWQpOgotICAgICAgICAgICAgY21kLmFwcGVuZCgiLS1idHNub29wPSVzIiAlIG9zLnBhdGguam9pbihzZWxmLmxvZ19wYXRoX2Jhc2UsICclc19idHNub29wX2hjaS5sb2cnICUgc2VsZi5sYWJlbCkpCi0gICAgICAgIGlmICItLWJ0c25vb3o9IiBub3QgaW4gIiAiLmpvaW4oY21kKToKLSAgICAgICAgICAgIGNtZC5hcHBlbmQoIi0tYnRzbm9vej0lcyIgJSBvcy5wYXRoLmpvaW4oc2VsZi5sb2dfcGF0aF9iYXNlLCAnJXNfYnRzbm9vel9oY2kubG9nJyAlIHNlbGYubGFiZWwpKQotICAgICAgICBpZiAiLS1idGNvbmZpZz0iIG5vdCBpbiAiICIuam9pbihjbWQpOgotICAgICAgICAgICAgY21kLmFwcGVuZCgiLS1idGNvbmZpZz0lcyIgJSBvcy5wYXRoLmpvaW4oc2VsZi5sb2dfcGF0aF9iYXNlLCAnJXNfYnRfY29uZmlnLmNvbmYnICUgc2VsZi5sYWJlbCkpCi0gICAgICAgIHNlbGYuY21kID0gY21kCi0gICAgICAgIHNlbGYuZW52aXJvbm1lbnQgPSBvcy5lbnZpcm9uLmNvcHkoKQotICAgICAgICBpZiAiY2VydCIgaW4gc2VsZi5sYWJlbDoKLSAgICAgICAgICAgIHNlbGYudGVybWluYWxfY29sb3IgPSBUZXJtaW5hbENvbG9yLkJMVUUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudGVybWluYWxfY29sb3IgPSBUZXJtaW5hbENvbG9yLllFTExPVwotCi0gICAgZGVmIHNldHVwKHNlbGYpOgotICAgICAgICAiIiJDb3JlIG1ldGhvZCB0byBzZXQgdXAgZGV2aWNlIGZvciB0ZXN0Ci0gICAgICAgIDpyZXR1cm46Ci0gICAgICAgICIiIgotICAgICAgICAjIFN0YXJ0IGJhY2tpbmcgcHJvY2VzcwotICAgICAgICBsb2dnaW5nLmRlYnVnKCJbJXNdIFJ1bm5pbmcgJXMgJXMiICUgKHNlbGYudHlwZV9pZGVudGlmaWVyLCBzZWxmLmxhYmVsLCAiICIuam9pbihzZWxmLmNtZCkpKQotICAgICAgICBzZWxmLmJhY2tpbmdfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgICAgICBzZWxmLmNtZCwKLSAgICAgICAgICAgIGN3ZD1nZXRfZ2Rfcm9vdCgpLAotICAgICAgICAgICAgZW52PXNlbGYuZW52aXJvbm1lbnQsCi0gICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAotICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCi0gICAgICAgIGlmIG5vdCBzZWxmLmJhY2tpbmdfcHJvY2VzczoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIlslc10gZmFpbGVkIHRvIG9wZW4gYmFja2luZyBwcm9jZXNzIGZvciAlcyIgJSAoc2VsZi50eXBlX2lkZW50aWZpZXIsIHNlbGYubGFiZWwpKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuaXNfYmFja2luZ19wcm9jZXNzX2FsaXZlID0gaXNfc3VicHJvY2Vzc19hbGl2ZShzZWxmLmJhY2tpbmdfcHJvY2VzcykKLSAgICAgICAgaWYgbm90IHNlbGYuaXNfYmFja2luZ19wcm9jZXNzX2FsaXZlOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiWyVzXSBiYWNraW5nIHByb2Nlc3MgZm9yICVzIGRpZWQgYWZ0ZXIgc3RhcnRpbmciICUgKHNlbGYudHlwZV9pZGVudGlmaWVyLCBzZWxmLmxhYmVsKSkKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHNlbGYuYmFja2luZ19wcm9jZXNzX2xvZ2dlciA9IEFzeW5jU3VicHJvY2Vzc0xvZ2dlcigKLSAgICAgICAgICAgIHNlbGYuYmFja2luZ19wcm9jZXNzLCBbc2VsZi5iYWNraW5nX3Byb2Nlc3NfbG9nX3BhdGhdLAotICAgICAgICAgICAgbG9nX3RvX3N0ZG91dD1zZWxmLnZlcmJvc2VfbW9kZSwKLSAgICAgICAgICAgIHRhZz1zZWxmLmxhYmVsLAotICAgICAgICAgICAgY29sb3I9c2VsZi50ZXJtaW5hbF9jb2xvcikKLQotICAgICAgICAjIFNldHVwIGdSUEMgbWFuYWdlbWVudCBjaGFubmVscwotICAgICAgICBzZWxmLmdycGNfcm9vdF9zZXJ2ZXJfY2hhbm5lbCA9IGdycGMuaW5zZWN1cmVfY2hhbm5lbCgibG9jYWxob3N0OiVkIiAlIHNlbGYuZ3JwY19yb290X3NlcnZlcl9wb3J0KQotCi0gICAgICAgIHNlbGYuZ3JwY19yb290X3NlcnZlcl9yZWFkeSA9IEZhbHNlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiWyVzXSBXYWl0aW5nIHRvIGNvbm5lY3QgdG8gZ1JQQyByb290IHNlcnZlciBmb3IgJXMsIHRpbWVvdXQgaXMgJWQgc2Vjb25kcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVfaWRlbnRpZmllciwgc2VsZi5sYWJlbCwgR1JQQ19TVEFSVF9USU1FT1VUX1NFQykpCi0gICAgICAgICAgICBncnBjLmNoYW5uZWxfcmVhZHlfZnV0dXJlKHNlbGYuZ3JwY19yb290X3NlcnZlcl9jaGFubmVsKS5yZXN1bHQodGltZW91dD1HUlBDX1NUQVJUX1RJTUVPVVRfU0VDKQotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJbJXNdIFN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gZ1JQQyByb290IHNlcnZlciBmb3IgJXMiICUgKHNlbGYudHlwZV9pZGVudGlmaWVyLCBzZWxmLmxhYmVsKSkKLSAgICAgICAgICAgIHNlbGYuZ3JwY19yb290X3NlcnZlcl9yZWFkeSA9IFRydWUKLSAgICAgICAgZXhjZXB0IGdycGMuRnV0dXJlVGltZW91dEVycm9yOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiWyVzXSBGYWlsZWQgdG8gY29ubmVjdCB0byBnUlBDIHJvb3Qgc2VydmVyIGZvciAlcyIgJSAoc2VsZi50eXBlX2lkZW50aWZpZXIsIHNlbGYubGFiZWwpKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgc2VsZi5ncnBjX2NoYW5uZWwgPSBncnBjLmluc2VjdXJlX2NoYW5uZWwoImxvY2FsaG9zdDolZCIgJSBzZWxmLmdycGNfcG9ydCkKLQotICAgICAgICBpZiBzZWxmLnZlcmJvc2VfbW9kZToKLSAgICAgICAgICAgIHNlbGYuZ3JwY19jaGFubmVsID0gZ3JwYy5pbnRlcmNlcHRfY2hhbm5lbChzZWxmLmdycGNfY2hhbm5lbCwgTG9nZ2luZ0NsaWVudEludGVyY2VwdG9yKHNlbGYubGFiZWwpKQotCi0gICAgICAgICMgRXN0YWJsaXNoIHNlcnZpY2VzIGZyb20gZmFjYWRlcwotICAgICAgICBzZWxmLnJvb3RzZXJ2aWNlID0gZmFjYWRlX3Jvb3RzZXJ2aWNlX3BiMl9ncnBjLlJvb3RGYWNhZGVTdHViKHNlbGYuZ3JwY19yb290X3NlcnZlcl9jaGFubmVsKQotICAgICAgICBzZWxmLmhhbCA9IGhhbF9mYWNhZGVfcGIyX2dycGMuSGNpSGFsRmFjYWRlU3R1YihzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5jb250cm9sbGVyX3JlYWRfb25seV9wcm9wZXJ0eSA9IGZhY2FkZV9yb290c2VydmljZV9wYjJfZ3JwYy5SZWFkT25seVByb3BlcnR5U3R1YihzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5oY2kgPSBoY2lfZmFjYWRlX3BiMl9ncnBjLkhjaUZhY2FkZVN0dWIoc2VsZi5ncnBjX2NoYW5uZWwpCi0gICAgICAgIHNlbGYubDJjYXAgPSBsMmNhcF9mYWNhZGVfcGIyX2dycGMuTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlU3R1YihzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5sMmNhcF9sZSA9IGwyY2FwX2xlX2ZhY2FkZV9wYjJfZ3JwYy5MMmNhcExlTW9kdWxlRmFjYWRlU3R1YihzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5pc28gPSBpc29fZmFjYWRlX3BiMl9ncnBjLklzb01vZHVsZUZhY2FkZVN0dWIoc2VsZi5ncnBjX2NoYW5uZWwpCi0gICAgICAgIHNlbGYuaGNpX2FjbF9tYW5hZ2VyID0gYWNsX21hbmFnZXJfZmFjYWRlX3BiMl9ncnBjLkFjbE1hbmFnZXJGYWNhZGVTdHViKHNlbGYuZ3JwY19jaGFubmVsKQotICAgICAgICBzZWxmLmhjaV9sZV9hY2xfbWFuYWdlciA9IGxlX2FjbF9tYW5hZ2VyX2ZhY2FkZV9wYjJfZ3JwYy5MZUFjbE1hbmFnZXJGYWNhZGVTdHViKHNlbGYuZ3JwY19jaGFubmVsKQotICAgICAgICBzZWxmLmhjaV9sZV9pbml0aWF0b3JfYWRkcmVzcyA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZV9wYjJfZ3JwYy5MZUluaXRpYXRvckFkZHJlc3NGYWNhZGVTdHViKAotICAgICAgICAgICAgc2VsZi5ncnBjX2NoYW5uZWwpCi0gICAgICAgIHNlbGYuaGNpX2NvbnRyb2xsZXIgPSBjb250cm9sbGVyX2ZhY2FkZV9wYjJfZ3JwYy5Db250cm9sbGVyRmFjYWRlU3R1YihzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5oY2lfY29udHJvbGxlci5HZXRNYWNBZGRyZXNzU2ltcGxlID0gbGFtYmRhOiBzZWxmLmhjaV9jb250cm9sbGVyLkdldE1hY0FkZHJlc3MoZW1wdHlfcHJvdG8uRW1wdHkoKSkuYWRkcmVzcwotICAgICAgICBzZWxmLmhjaV9jb250cm9sbGVyLkdldExvY2FsTmFtZVNpbXBsZSA9IGxhbWJkYTogc2VsZi5oY2lfY29udHJvbGxlci5HZXRMb2NhbE5hbWUoZW1wdHlfcHJvdG8uRW1wdHkoKSkubmFtZQotICAgICAgICBzZWxmLmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyID0gbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGVfcGIyX2dycGMuTGVBZHZlcnRpc2luZ01hbmFnZXJGYWNhZGVTdHViKAotICAgICAgICAgICAgc2VsZi5ncnBjX2NoYW5uZWwpCi0gICAgICAgIHNlbGYuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIgPSBsZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZV9wYjJfZ3JwYy5MZVNjYW5uaW5nTWFuYWdlckZhY2FkZVN0dWIoCi0gICAgICAgICAgICBzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5uZWlnaGJvciA9IG5laWdoYm9yX2ZhY2FkZV9wYjJfZ3JwYy5OZWlnaGJvckZhY2FkZVN0dWIoc2VsZi5ncnBjX2NoYW5uZWwpCi0gICAgICAgIHNlbGYuc2VjdXJpdHkgPSBzZWN1cml0eV9mYWNhZGVfcGIyX2dycGMuU2VjdXJpdHlNb2R1bGVGYWNhZGVTdHViKHNlbGYuZ3JwY19jaGFubmVsKQotICAgICAgICBzZWxmLnNoaW0gPSBzaGltX2ZhY2FkZV9wYjJfZ3JwYy5TaGltRmFjYWRlU3R1YihzZWxmLmdycGNfY2hhbm5lbCkKLQotICAgIGRlZiBnZXRfY3Jhc2hfc25pcHBldF9hbmRfbG9nX3RhaWwoc2VsZik6Ci0gICAgICAgIGlmIGlzX3N1YnByb2Nlc3NfYWxpdmUoc2VsZi5iYWNraW5nX3Byb2Nlc3MpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKLQotICAgICAgICByZXR1cm4gcmVhZF9jcmFzaF9zbmlwcGV0X2FuZF9sb2dfdGFpbChzZWxmLmJhY2tpbmdfcHJvY2Vzc19sb2dfcGF0aCkKLQotICAgIGRlZiB0ZWFyZG93bihzZWxmKToKLSAgICAgICAgIiIiQ29yZSBtZXRob2QgdG8gdGVhciBkb3duIGRldmljZSBhbmQgY2xlYW4gdXAgYW55IHJlc291cmNlcwotICAgICAgICA6cmV0dXJuOgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5ncnBjX2NoYW5uZWwuY2xvc2UoKQotICAgICAgICBzZWxmLmdycGNfcm9vdF9zZXJ2ZXJfY2hhbm5lbC5jbG9zZSgpCi0gICAgICAgIHN0b3Bfc2lnbmFsID0gc2lnbmFsLlNJR0lOVAotICAgICAgICBzZWxmLmJhY2tpbmdfcHJvY2Vzcy5zZW5kX3NpZ25hbChzdG9wX3NpZ25hbCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSBzZWxmLmJhY2tpbmdfcHJvY2Vzcy53YWl0KHRpbWVvdXQ9c2VsZi5XQUlUX0NIQU5ORUxfUkVBRFlfVElNRU9VVF9TRUNPTkRTKQotICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIlslc10gRmFpbGVkIHRvIGludGVycnVwdCBiYWNraW5nIHByb2Nlc3MgdmlhIFNJR0lOVCwgc2VuZGluZyBTSUdLSUxMIiAlIHNlbGYubGFiZWwpCi0gICAgICAgICAgICBzdG9wX3NpZ25hbCA9IHNpZ25hbC5TSUdLSUxMCi0gICAgICAgICAgICBzZWxmLmJhY2tpbmdfcHJvY2Vzcy5raWxsKCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXR1cm5fY29kZSA9IHNlbGYuYmFja2luZ19wcm9jZXNzLndhaXQodGltZW91dD1zZWxmLldBSVRfQ0hBTk5FTF9SRUFEWV9USU1FT1VUX1NFQ09ORFMpCi0gICAgICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJGYWlsZWQgdG8ga2lsbCBiYWNraW5nIHByb2Nlc3MiKQotICAgICAgICAgICAgICAgIHJldHVybl9jb2RlID0gLTY1NTM2Ci0gICAgICAgIGlmIHJldHVybl9jb2RlIG5vdCBpbiBbLXN0b3Bfc2lnbmFsLCAwXToKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImJhY2tpbmcgcHJvY2VzcyAlcyBzdG9wcGVkIHdpdGggY29kZTogJWQiICUgKHNlbGYubGFiZWwsIHJldHVybl9jb2RlKSkKLSAgICAgICAgc2VsZi5iYWNraW5nX3Byb2Nlc3NfbG9nZ2VyLnN0b3AoKQotCi0gICAgZGVmIHdhaXRfY2hhbm5lbF9yZWFkeShzZWxmKToKLSAgICAgICAgZnV0dXJlID0gZ3JwYy5jaGFubmVsX3JlYWR5X2Z1dHVyZShzZWxmLmdycGNfY2hhbm5lbCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZnV0dXJlLnJlc3VsdCh0aW1lb3V0PXNlbGYuV0FJVF9DSEFOTkVMX1JFQURZX1RJTUVPVVRfU0VDT05EUykKLSAgICAgICAgZXhjZXB0IGdycGMuRnV0dXJlVGltZW91dEVycm9yOgotICAgICAgICAgICAgcmFpc2UKLQotCi1kZWYgZ2V0X2NvdmVyYWdlX3Byb2ZkYXRhX3BhdGhfZm9yX2hvc3QodGVzdF9ydW5uZXJfYmFzZV9wYXRoLCB0eXBlX2lkZW50aWZpZXIsIGxhYmVsKSAtPiBwYXRobGliLlBhdGg6Ci0gICAgcmV0dXJuIHBhdGhsaWIuUGF0aCh0ZXN0X3J1bm5lcl9iYXNlX3BhdGgpLnBhcmVudC5wYXJlbnQuam9pbnBhdGgoCi0gICAgICAgICIlc18lc19iYWNraW5nX3Byb2Nlc3NfY292ZXJhZ2UucHJvZmRhdGEiICUgKHR5cGVfaWRlbnRpZmllciwgbGFiZWwpKQotCi0KLWRlZiBtZXJnZV9jb3ZlcmFnZV9wcm9mZGF0YV9mb3JfaG9zdChiYWNraW5nX3Byb2Nlc3NfcHJvZnJhd19wYXRoLCBwcm9mZGF0YV9wYXRoOiBwYXRobGliLlBhdGgsIGxhYmVsKToKLSAgICBpZiBub3QgYmFja2luZ19wcm9jZXNzX3Byb2ZyYXdfcGF0aC5pc19maWxlKCk6Ci0gICAgICAgIGxvZ2dpbmcuaW5mbygKLSAgICAgICAgICAgICJbJXNdIFNraXAgY292ZXJhZ2UgcmVwb3J0IGFzIHRoZXJlIGlzIG5vIHByb2ZyYXcgZmlsZSBhdCAlcyIgJSAobGFiZWwsIHN0cihiYWNraW5nX3Byb2Nlc3NfcHJvZnJhd19wYXRoKSkpCi0gICAgICAgIHJldHVybgotICAgIHRyeToKLSAgICAgICAgaWYgYmFja2luZ19wcm9jZXNzX3Byb2ZyYXdfcGF0aC5zdGF0KCkuc3Rfc2l6ZSA8PSAwOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKAotICAgICAgICAgICAgICAgICJbJXNdIFNraXAgY292ZXJhZ2UgcmVwb3J0IGFzIHByb2ZyYXcgZmlsZSBpcyBlbXB0eSBhdCAlcyIgJSAobGFiZWwsIHN0cihiYWNraW5nX3Byb2Nlc3NfcHJvZnJhd19wYXRoKSkpCi0gICAgICAgICAgICByZXR1cm4KLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJbJXNdIFNraXAgY292ZXJhZ2UgcmVwb3J0IGFzIHByb2ZyYXcgZmlsZSBpcyBpbmFjY2Vzc2libGUgYXQgJXMiICUKLSAgICAgICAgICAgICAgICAgICAgIChsYWJlbCwgc3RyKGJhY2tpbmdfcHJvY2Vzc19wcm9mcmF3X3BhdGgpKSkKLSAgICAgICAgcmV0dXJuCi0gICAgbGx2bV9iaW51dGlscyA9IHBhdGhsaWIuUGF0aChnZXRfZ2Rfcm9vdCgpKS5qb2lucGF0aCgibGx2bV9iaW51dGlscyIpLmpvaW5wYXRoKCJiaW4iKQotICAgIGxsdm1fcHJvZmRhdGEgPSBsbHZtX2JpbnV0aWxzLmpvaW5wYXRoKCJsbHZtLXByb2ZkYXRhIikKLSAgICBpZiBub3QgbGx2bV9wcm9mZGF0YS5pc19maWxlKCk6Ci0gICAgICAgIGxvZ2dpbmcuaW5mbygiWyVzXSBTa2lwIGNvdmVyYWdlIHJlcG9ydCBhcyBsbHZtLXByb2ZkYXRhIGlzIG5vdCBmb3VuZCBhdCAlcyIgJSAobGFiZWwsIHN0cihsbHZtX3Byb2ZkYXRhKSkpCi0gICAgICAgIHJldHVybgotICAgIGxvZ2dpbmcuaW5mbygiWyVzXSBNZXJnaW5nIGNvdmVyYWdlIHByb2ZkYXRhIiAlIGxhYmVsKQotICAgIHByb2ZkYXRhX3BhdGhfdG1wID0gcHJvZmRhdGFfcGF0aC5wYXJlbnQgLyAocHJvZmRhdGFfcGF0aC5zdGVtICsgIl90bXAiICsgcHJvZmRhdGFfcGF0aC5zdWZmaXgpCi0gICAgIyBNZXJnZSB3aXRoIGV4aXN0aW5nIHByb2ZkYXRhIGlmIHBvc3NpYmxlCi0gICAgcHJvZmRhdGFfY21kID0gW3N0cihsbHZtX3Byb2ZkYXRhKSwgIm1lcmdlIiwgIi1zcGFyc2UiLCBzdHIoYmFja2luZ19wcm9jZXNzX3Byb2ZyYXdfcGF0aCldCi0gICAgaWYgcHJvZmRhdGFfcGF0aC5pc19maWxlKCk6Ci0gICAgICAgIHByb2ZkYXRhX2NtZC5hcHBlbmQoc3RyKHByb2ZkYXRhX3BhdGgpKQotICAgIHByb2ZkYXRhX2NtZCArPSBbIi1vIiwgc3RyKHByb2ZkYXRhX3BhdGhfdG1wKV0KLSAgICBsb2dnaW5nLmRlYnVnKCJSdW5uaW5nIGxsdm1fcHJvZmRhdGE6ICVzIiAlICIgIi5qb2luKHByb2ZkYXRhX2NtZCkpCi0gICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4ocHJvZmRhdGFfY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMDoKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJbJXNdIEZhaWxlZCB0byBpbmRleCBwcm9mZGF0YSwgY21kIHJlc3VsdDogJXIiICUgKGxhYmVsLCByZXN1bHQpKQotICAgICAgICBwcm9mZGF0YV9wYXRoLnVubGluayhtaXNzaW5nX29rPVRydWUpCi0gICAgICAgIHJldHVybgotICAgIHNodXRpbC5tb3ZlKHByb2ZkYXRhX3BhdGhfdG1wLCBwcm9mZGF0YV9wYXRoKQotCi0KLWRlZiBnZW5lcmF0ZV9jb3ZlcmFnZV9yZXBvcnRfZm9yX2hvc3QoY292ZXJhZ2VfaW5mbyk6Ci0gICAgbGFiZWwgPSBjb3ZlcmFnZV9pbmZvWyJsYWJlbCJdCi0gICAgdGVzdF9ydW5uZXJfYmFzZV9wYXRoID0gY292ZXJhZ2VfaW5mb1sidGVzdF9ydW5uZXJfYmFzZV9wYXRoIl0KLSAgICB0eXBlX2lkZW50aWZpZXIgPSBjb3ZlcmFnZV9pbmZvWyJ0eXBlX2lkZW50aWZpZXIiXQotICAgIHByb2ZkYXRhX3BhdGggPSBjb3ZlcmFnZV9pbmZvWyJwcm9mZGF0YV9wYXRoIl0KLSAgICBzdGFja19iaW4gPSBjb3ZlcmFnZV9pbmZvWyJzdGFja19iaW4iXQotICAgIGxsdm1fYmludXRpbHMgPSBwYXRobGliLlBhdGgoZ2V0X2dkX3Jvb3QoKSkuam9pbnBhdGgoImxsdm1fYmludXRpbHMiKS5qb2lucGF0aCgiYmluIikKLSAgICBsbHZtX2NvdiA9IGxsdm1fYmludXRpbHMuam9pbnBhdGgoImxsdm0tY292IikKLSAgICBpZiBub3QgbGx2bV9jb3YuaXNfZmlsZSgpOgotICAgICAgICBsb2dnaW5nLmluZm8oIlslc10gU2tpcCBjb3ZlcmFnZSByZXBvcnQgYXMgbGx2bS1jb3YgaXMgbm90IGZvdW5kIGF0ICVzIiAlIChsYWJlbCwgc3RyKGxsdm1fY292KSkpCi0gICAgICAgIHJldHVybgotICAgIGxvZ2dpbmcuaW5mbygiWyVzXSBHZW5lcmF0aW5nIGNvdmVyYWdlIHJlcG9ydCBpbiBKU09OIiAlIGxhYmVsKQotICAgIGNvdmVyYWdlX3Jlc3VsdF9wYXRoID0gcGF0aGxpYi5QYXRoKHRlc3RfcnVubmVyX2Jhc2VfcGF0aCkucGFyZW50LnBhcmVudC5qb2lucGF0aCgKLSAgICAgICAgIiVzXyVzX2JhY2tpbmdfcHJvY2Vzc19jb3ZlcmFnZS5qc29uIiAlICh0eXBlX2lkZW50aWZpZXIsIGxhYmVsKSkKLSAgICB3aXRoIGNvdmVyYWdlX3Jlc3VsdF9wYXRoLm9wZW4oInciKSBhcyBjb3ZlcmFnZV9yZXN1bHRfZmlsZToKLSAgICAgICAgbGx2bV9jb3ZfZXhwb3J0X2NtZCA9IFsKLSAgICAgICAgICAgIHN0cihsbHZtX2NvdiksICJleHBvcnQiLCAiLS1mb3JtYXQ9dGV4dCIsICItLWlnbm9yZS1maWxlbmFtZS1yZWdleCIsICIoZXh0ZXJuYWx8b3V0KS4qIiwgIi0taW5zdHItcHJvZmlsZSIsCi0gICAgICAgICAgICBzdHIocHJvZmRhdGFfcGF0aCksCi0gICAgICAgICAgICBzdHIoc3RhY2tfYmluKQotICAgICAgICBdCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIlJ1bm5pbmcgbGx2bV9jb3YgZXhwb3J0OiAlcyIgJSAiICIuam9pbihsbHZtX2Nvdl9leHBvcnRfY21kKSkKLSAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCi0gICAgICAgICAgICBsbHZtX2Nvdl9leHBvcnRfY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9Y292ZXJhZ2VfcmVzdWx0X2ZpbGUsIGN3ZD1vcy5wYXRoLmpvaW4oZ2V0X2dkX3Jvb3QoKSkpCi0gICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMDoKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJbJXNdIEZhaWxlZCB0byBnZW5lcmF0ZWQgY292ZXJhZ2UgcmVwb3J0LCBjbWQgcmVzdWx0OiAlciIgJSAobGFiZWwsIHJlc3VsdCkpCi0gICAgICAgIGNvdmVyYWdlX3Jlc3VsdF9wYXRoLnVubGluayhtaXNzaW5nX29rPVRydWUpCi0gICAgICAgIHJldHVybgotICAgIGxvZ2dpbmcuaW5mbygiWyVzXSBHZW5lcmF0aW5nIGNvdmVyYWdlIHN1bW1hcnkgaW4gdGV4dCIgJSBsYWJlbCkKLSAgICBjb3ZlcmFnZV9zdW1tYXJ5X3BhdGggPSBwYXRobGliLlBhdGgodGVzdF9ydW5uZXJfYmFzZV9wYXRoKS5wYXJlbnQucGFyZW50LmpvaW5wYXRoKAotICAgICAgICAiJXNfJXNfYmFja2luZ19wcm9jZXNzX2NvdmVyYWdlX3N1bW1hcnkudHh0IiAlICh0eXBlX2lkZW50aWZpZXIsIGxhYmVsKSkKLSAgICB3aXRoIGNvdmVyYWdlX3N1bW1hcnlfcGF0aC5vcGVuKCJ3IikgYXMgY292ZXJhZ2Vfc3VtbWFyeV9maWxlOgotICAgICAgICBsbHZtX2Nvdl9yZXBvcnRfY21kID0gWwotICAgICAgICAgICAgc3RyKGxsdm1fY292KSwgInJlcG9ydCIsICItLWlnbm9yZS1maWxlbmFtZS1yZWdleCIsICIoZXh0ZXJuYWx8b3V0KS4qIiwgIi0taW5zdHItcHJvZmlsZSIsCi0gICAgICAgICAgICBzdHIocHJvZmRhdGFfcGF0aCksCi0gICAgICAgICAgICBzdHIoc3RhY2tfYmluKQotICAgICAgICBdCi0gICAgICAgIGxvZ2dpbmcuZGVidWcoIlJ1bm5pbmcgbGx2bV9jb3YgcmVwb3J0OiAlcyIgJSAiICIuam9pbihsbHZtX2Nvdl9yZXBvcnRfY21kKSkKLSAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCi0gICAgICAgICAgICBsbHZtX2Nvdl9yZXBvcnRfY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9Y292ZXJhZ2Vfc3VtbWFyeV9maWxlLCBjd2Q9b3MucGF0aC5qb2luKGdldF9nZF9yb290KCkpKQotICAgIGlmIHJlc3VsdC5yZXR1cm5jb2RlICE9IDA6Ci0gICAgICAgIGxvZ2dpbmcud2FybmluZygiWyVzXSBGYWlsZWQgdG8gZ2VuZXJhdGVkIGNvdmVyYWdlIHN1bW1hcnksIGNtZCByZXN1bHQ6ICVyIiAlIChsYWJlbCwgcmVzdWx0KSkKLSAgICAgICAgY292ZXJhZ2Vfc3VtbWFyeV9wYXRoLnVubGluayhtaXNzaW5nX29rPVRydWUpCmRpZmYgLS1naXQgYS9nZC9jZXJ0L2dlbl9odG1sX2NvdmVyYWdlLnNoIGIvZ2QvY2VydC9nZW5faHRtbF9jb3ZlcmFnZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZiMWVkYi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2dlbl9odG1sX2NvdmVyYWdlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotcHVzaGQgJEFORFJPSURfQlVJTERfVE9QCi0KLWxsdm0tY292IHNob3cgLS1mb3JtYXQ9aHRtbCAtLXN1bW1hcnktb25seSAtLXNob3ctbGluZS1jb3VudHMtb3ItcmVnaW9ucyAtLXNob3ctaW5zdGFudGlhdGlvbi1zdW1tYXJ5IC0taW5zdHItcHJvZmlsZT0vdG1wL2xvZ3MvSG9zdE9ubHlDZXJ0L2xhdGVzdC9HZERldmljZV9kdXRfYmFja2luZ19wcm9jZXNzX2NvdmVyYWdlLnByb2ZkYXRhIC0tb3V0cHV0LWRpcj0vdG1wL2xvZ3MvSG9zdE9ubHlDZXJ0L2xhdGVzdC9HZERldmljZV9kdXRfYmFja2luZ19wcm9jZXNzX2NvdmVyYWdlLyBvdXQvZGlzdC9ibHVldG9vdGhfdmVudi9saWIvcHl0aG9uMy44L3NpdGUtcGFja2FnZXMvYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlCi0KLXBvcGQKLQotZWNobyAicG9pbnQgeW91ciBicm93c2VyIHRvIGZpbGU6Ly8vdG1wL2xvZ3MvSG9zdE9ubHlDZXJ0L2xhdGVzdC9HZERldmljZV9kdXRfYmFja2luZ19wcm9jZXNzX2NvdmVyYWdlL2luZGV4Lmh0bWwiCi0KZGlmZiAtLWdpdCBhL2dkL2NlcnQvaG9zdF9jb25maWcuanNvbiBiL2dkL2NlcnQvaG9zdF9jb25maWcuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNGRjNy4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L2hvc3RfY29uZmlnLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0KLXsgICAiX2Rlc2NyaXB0aW9uIjogIkJsdWV0b290aCBjZXJ0IHRlc3RpbmciLAotICAgICJ0ZXN0YmVkIjoKLSAgICBbCi0gICAgICAgIHsKLSAgICAgICAgICAgICJfZGVzY3JpcHRpb24iOiAiSG9zdCBvbmx5IGNlcnQgdGVzdGJlZCIsCi0gICAgICAgICAgICAibmFtZSI6ICJIb3N0T25seUNlcnQiLAotICAgICAgICAgICAgInJvb3RjYW5hbCI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgInRlc3RfcG9ydCI6ICI2NDAxIiwKLSAgICAgICAgICAgICAgICAiaGNpX3BvcnQiOiAiNjQwMiIsCi0gICAgICAgICAgICAgICAgImxpbmtfbGF5ZXJfcG9ydCI6ICI2NDAzIgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJHZERldmljZSI6Ci0gICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiZ3JwY19wb3J0IjogIjg5OTgiLAotICAgICAgICAgICAgICAgICAgICAiZ3JwY19yb290X3NlcnZlcl9wb3J0IjogIjg5OTYiLAotICAgICAgICAgICAgICAgICAgICAic2lnbmFsX3BvcnQiOiAiODk5NCIsCi0gICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJjZXJ0IiwKLSAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2VydCBEZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAiY21kIjoKLSAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgIiRHRF9ST09UL2JsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1ncnBjLXBvcnQ9JChncnBjX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3Qtc2VydmVyLXBvcnQ9JChncnBjX3Jvb3Rfc2VydmVyX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3RjYW5hbC1wb3J0PSQocm9vdGNhbmFsX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXNpZ25hbC1wb3J0PSQoc2lnbmFsX3BvcnQpIgotICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJncnBjX3BvcnQiOiAiODk5OSIsCi0gICAgICAgICAgICAgICAgICAgICJncnBjX3Jvb3Rfc2VydmVyX3BvcnQiOiAiODk5NyIsCi0gICAgICAgICAgICAgICAgICAgICJzaWduYWxfcG9ydCI6ICI4OTk1IiwKLSAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogImR1dCIsCi0gICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkRVVCBEZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAiY21kIjoKLSAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgIiRHRF9ST09UL2JsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1ncnBjLXBvcnQ9JChncnBjX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3Qtc2VydmVyLXBvcnQ9JChncnBjX3Jvb3Rfc2VydmVyX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3RjYW5hbC1wb3J0PSQocm9vdGNhbmFsX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXNpZ25hbC1wb3J0PSQoc2lnbmFsX3BvcnQpIgotICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQotICAgICAgICB9Ci0gICAgXSwKLSAgICAibG9ncGF0aCI6ICIvdG1wL2xvZ3MiCi19CmRpZmYgLS1naXQgYS9nZC9jZXJ0L2lydW4gYi9nZC9jZXJ0L2lydW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwYWI4NzcuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9pcnVuCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIGludGVyYWN0aXZlIHZlcnNpb24gb2YgcnVuCi0KLXRyYXAgImV4aXQ7IiBTSUdJTlQgU0lHVEVSTQotCi13aGlsZSB0cnVlCi1kbwotICAgICR7QU5EUk9JRF9CVUlMRF9UT1B9L3N5c3RlbS9idC9nZC9jZXJ0L3J1biAiJEAiCi0gICAgcHl0aG9uMyAke0FORFJPSURfQlVJTERfVE9QfS9zeXN0ZW0vYnQvZ2QvY2VydC9jaGFuZ2Vfd2FpdGVyLnB5ICR7QU5EUk9JRF9CVUlMRF9UT1B9L3N5c3RlbS9idAotZG9uZQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9sb2dnaW5nX2NsaWVudF9pbnRlcmNlcHRvci5weSBiL2dkL2NlcnQvbG9nZ2luZ19jbGllbnRfaW50ZXJjZXB0b3IucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjcxNDkuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9sb2dnaW5nX2NsaWVudF9pbnRlcmNlcHRvci5weQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGdycGMKLWltcG9ydCByZQotCi1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAotCi0KLWRlZiBjdXN0b21fbWVzc2FnZV9mb3JtYXR0ZXIobSwgaWRlbnQsIGFzX29uZV9saW5lKToKLSAgICBpZiBtLkRFU0NSSVBUT1IgPT0gY29tbW9uLkRhdGEuREVTQ1JJUFRPUjoKLSAgICAgICAgcmV0dXJuICdwYXlsb2FkOiAoaGV4KSAie30iJy5mb3JtYXQobS5wYXlsb2FkLmhleCgiICIpKQotICAgIHJldHVybiBOb25lCi0KLQotZGVmIHByZXR0eV9wcmludChyZXF1ZXN0KToKLSAgICByZXR1cm4gJ3t9IHt9Jy5mb3JtYXQoCi0gICAgICAgIHR5cGUocmVxdWVzdCkuX19uYW1lX18sCi0gICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhyZXF1ZXN0LCBhc19vbmVfbGluZT1UcnVlLCBtZXNzYWdlX2Zvcm1hdHRlcj1jdXN0b21fbWVzc2FnZV9mb3JtYXR0ZXIpKQotCi0KLWNsYXNzIExvZ2dpbmdSYW5kZXp2b3VzV3JhcHBlcigpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9zdHJlYW1fY2FsbCwgbG9nVGFnKToKLSAgICAgICAgaWYgc2VydmVyX3N0cmVhbV9jYWxsIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZXJ2ZXJfc3RyZWFtX2NhbGwgY2Fubm90IGJlIE5vbmUiKQotICAgICAgICBzZWxmLnNlcnZlcl9zdHJlYW1fY2FsbCA9IHNlcnZlcl9zdHJlYW1fY2FsbAotICAgICAgICBzZWxmLmxvZ1RhZyA9IGxvZ1RhZwotCi0gICAgZGVmIGNhbmNlbChzZWxmKToKLSAgICAgICAgc2VsZi5zZXJ2ZXJfc3RyZWFtX2NhbGwuY2FuY2VsKCkKLQotICAgIGRlZiBjYW5jZWxsZWQoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLnNlcnZlcl9zdHJlYW1fY2FsbC5jYW5jZWxsZWQoKQotCi0gICAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICByZXNwID0gc2VsZi5zZXJ2ZXJfc3RyZWFtX2NhbGwuX19uZXh0X18oKQotICAgICAgICBwcmludCgiJXMgJXMiICUgKHNlbGYubG9nVGFnLCBwcmV0dHlfcHJpbnQocmVzcCkpKQotICAgICAgICByZXR1cm4gcmVzcAotCi0KLWNsYXNzIExvZ2dpbmdDbGllbnRJbnRlcmNlcHRvcihncnBjLlVuYXJ5VW5hcnlDbGllbnRJbnRlcmNlcHRvciwgZ3JwYy5VbmFyeVN0cmVhbUNsaWVudEludGVyY2VwdG9yKToKLQotICAgIFRBR19NSU5fV0lEVEggPSAyNAotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgICAgIHNlbGYuaW5Mb2dUYWcgPSAiW2hvc3Qg4pa24pa24pa24pa24pa2ICVzXSIgJSBzZWxmLm5hbWUKLSAgICAgICAgc2VsZi5vdXRMb2dUYWcgPSAiW2hvc3Qg4peA4peA4peA4peA4peAICVzXSIgJSBzZWxmLm5hbWUKLSAgICAgICAgdGFnTGVuZ3RoID0gbGVuKHJlLnN1YignW15cd1xzXScsICcnLCBzZWxmLmluTG9nVGFnKSkgKyAxMQotICAgICAgICBpZiB0YWdMZW5ndGggPCBzZWxmLlRBR19NSU5fV0lEVEg6Ci0gICAgICAgICAgICBzZWxmLmluTG9nVGFnICs9ICIgIiAqIChzZWxmLlRBR19NSU5fV0lEVEggLSB0YWdMZW5ndGgpCi0gICAgICAgICAgICBzZWxmLm91dExvZ1RhZyArPSAiICIgKiAoc2VsZi5UQUdfTUlOX1dJRFRIIC0gdGFnTGVuZ3RoKQotCi0gICAgZGVmIGludGVyY2VwdF91bmFyeV91bmFyeShzZWxmLCBjb250aW51YXRpb24sIGNsaWVudF9jYWxsX2RldGFpbHMsIHJlcXVlc3QpOgotICAgICAgICAiIiIKLSAgICAgICAgVGhpcyBpbnRlcmNlcHRvciBsb2dzIHRoZSByZXF1ZXN0cyBmcm9tIGhvc3QKLSAgICAgICAgIiIiCi0gICAgICAgIHByaW50KCIlcyVzICVzIiAlIChzZWxmLmluTG9nVGFnLCBjbGllbnRfY2FsbF9kZXRhaWxzLm1ldGhvZCwgcHJldHR5X3ByaW50KHJlcXVlc3QpKSkKLSAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjbGllbnRfY2FsbF9kZXRhaWxzLCByZXF1ZXN0KQotCi0gICAgZGVmIGludGVyY2VwdF91bmFyeV9zdHJlYW0oc2VsZiwgY29udGludWF0aW9uLCBjbGllbnRfY2FsbF9kZXRhaWxzLCByZXF1ZXN0KToKLSAgICAgICAgIiIiCi0gICAgICAgIFRoaXMgaW50ZXJjZXB0b3Igd3JhcHMgdGhlIHNlcnZlciByZXNwb25zZSwgYW5kIGxvZ3MgYWxsIHRoZSBtZXNzYWdlcyBjb21pbmcgdG8gaG9zdAotICAgICAgICAiIiIKLSAgICAgICAgcHJpbnQoIiVzJXMgJXMiICUgKHNlbGYuaW5Mb2dUYWcsIGNsaWVudF9jYWxsX2RldGFpbHMubWV0aG9kLCBwcmV0dHlfcHJpbnQocmVxdWVzdCkpKQotICAgICAgICBzZXJ2ZXJfc3RyZWFtX2NhbGwgPSBjb250aW51YXRpb24oY2xpZW50X2NhbGxfZGV0YWlscywgcmVxdWVzdCkKLSAgICAgICAgcmV0dW5pbmdNc2dMb2dUYWcgPSBzZWxmLm91dExvZ1RhZyArIGNsaWVudF9jYWxsX2RldGFpbHMubWV0aG9kCi0gICAgICAgIHJldHVybiBMb2dnaW5nUmFuZGV6dm91c1dyYXBwZXIoc2VydmVyX3N0cmVhbV9jYWxsLCByZXR1bmluZ01zZ0xvZ1RhZykKZGlmZiAtLWdpdCBhL2dkL2NlcnQvbWF0Y2hlcnMucHkgYi9nZC9jZXJ0L21hdGNoZXJzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkyM2U3Li4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvbWF0Y2hlcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgYXMgYnRfcGFja2V0cwotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBFdmVudENvZGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgbDJjYXBfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmwyY2FwX3BhY2tldHMgaW1wb3J0IENvbW1hbmRDb2RlLCBMZUNvbW1hbmRDb2RlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0Ci1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0Ci1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5sMmNhcF9wYWNrZXRzIGltcG9ydCBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0Ci0KLQotY2xhc3MgSGNpTWF0Y2hlcnMob2JqZWN0KToKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ29tbWFuZENvbXBsZXRlKG9wY29kZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgbXNnOiBIY2lNYXRjaGVycy5faXNfbWF0Y2hpbmdfY29tbWFuZF9jb21wbGV0ZShtc2cucGF5bG9hZCwgb3Bjb2RlKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBFeHRyYWN0TWF0Y2hpbmdDb21tYW5kQ29tcGxldGUocGFja2V0X2J5dGVzLCBvcGNvZGU9Tm9uZSk6Ci0gICAgICAgIHJldHVybiBIY2lNYXRjaGVycy5fZXh0cmFjdF9tYXRjaGluZ19jb21tYW5kX2NvbXBsZXRlKHBhY2tldF9ieXRlcywgb3Bjb2RlKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfY29tbWFuZF9jb21wbGV0ZShwYWNrZXRfYnl0ZXMsIG9wY29kZT1Ob25lKToKLSAgICAgICAgcmV0dXJuIEhjaU1hdGNoZXJzLl9leHRyYWN0X21hdGNoaW5nX2NvbW1hbmRfY29tcGxldGUocGFja2V0X2J5dGVzLCBvcGNvZGUpIGlzIG5vdCBOb25lCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9leHRyYWN0X21hdGNoaW5nX2NvbW1hbmRfY29tcGxldGUocGFja2V0X2J5dGVzLCBvcGNvZGU9Tm9uZSk6Ci0gICAgICAgIGV2ZW50ID0gSGNpTWF0Y2hlcnMuX2V4dHJhY3RfbWF0Y2hpbmdfZXZlbnQocGFja2V0X2J5dGVzLCBFdmVudENvZGUuQ09NTUFORF9DT01QTEVURSkKLSAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGNvbXBsZXRlID0gaGNpX3BhY2tldHMuQ29tbWFuZENvbXBsZXRlVmlldyhldmVudCkKLSAgICAgICAgaWYgb3Bjb2RlIGlzIE5vbmUgb3IgY29tcGxldGUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgY29tcGxldGUuR2V0Q29tbWFuZE9wQ29kZSgpICE9IG9wY29kZToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxldGUKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ29tbWFuZFN0YXR1cyhvcGNvZGU9Tm9uZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgbXNnOiBIY2lNYXRjaGVycy5faXNfbWF0Y2hpbmdfY29tbWFuZF9zdGF0dXMobXNnLnBheWxvYWQsIG9wY29kZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRXh0cmFjdE1hdGNoaW5nQ29tbWFuZFN0YXR1cyhwYWNrZXRfYnl0ZXMsIG9wY29kZT1Ob25lKToKLSAgICAgICAgcmV0dXJuIEhjaU1hdGNoZXJzLl9leHRyYWN0X21hdGNoaW5nX2NvbW1hbmRfY29tcGxldGUocGFja2V0X2J5dGVzLCBvcGNvZGUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19jb21tYW5kX3N0YXR1cyhwYWNrZXRfYnl0ZXMsIG9wY29kZT1Ob25lKToKLSAgICAgICAgcmV0dXJuIEhjaU1hdGNoZXJzLl9leHRyYWN0X21hdGNoaW5nX2NvbW1hbmRfc3RhdHVzKHBhY2tldF9ieXRlcywgb3Bjb2RlKSBpcyBub3QgTm9uZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfZXh0cmFjdF9tYXRjaGluZ19jb21tYW5kX3N0YXR1cyhwYWNrZXRfYnl0ZXMsIG9wY29kZT1Ob25lKToKLSAgICAgICAgZXZlbnQgPSBIY2lNYXRjaGVycy5fZXh0cmFjdF9tYXRjaGluZ19ldmVudChwYWNrZXRfYnl0ZXMsIEV2ZW50Q29kZS5DT01NQU5EX1NUQVRVUykKLSAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGNvbXBsZXRlID0gaGNpX3BhY2tldHMuQ29tbWFuZFN0YXR1c1ZpZXcoZXZlbnQpCi0gICAgICAgIGlmIG9wY29kZSBpcyBOb25lIG9yIGNvbXBsZXRlIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gY29tcGxldGUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGNvbXBsZXRlLkdldENvbW1hbmRPcENvZGUoKSAhPSBvcGNvZGU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEV2ZW50V2l0aENvZGUoZXZlbnRfY29kZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgbXNnOiBIY2lNYXRjaGVycy5faXNfbWF0Y2hpbmdfZXZlbnQobXNnLnBheWxvYWQsIGV2ZW50X2NvZGUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEV4dHJhY3RFdmVudFdpdGhDb2RlKHBhY2tldF9ieXRlcywgZXZlbnRfY29kZSk6Ci0gICAgICAgIHJldHVybiBIY2lNYXRjaGVycy5fZXh0cmFjdF9tYXRjaGluZ19ldmVudChwYWNrZXRfYnl0ZXMsIGV2ZW50X2NvZGUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19ldmVudChwYWNrZXRfYnl0ZXMsIGV2ZW50X2NvZGUpOgotICAgICAgICByZXR1cm4gSGNpTWF0Y2hlcnMuX2V4dHJhY3RfbWF0Y2hpbmdfZXZlbnQocGFja2V0X2J5dGVzLCBldmVudF9jb2RlKSBpcyBub3QgTm9uZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfZXh0cmFjdF9tYXRjaGluZ19ldmVudChwYWNrZXRfYnl0ZXMsIGV2ZW50X2NvZGUpOgotICAgICAgICBldmVudCA9IGhjaV9wYWNrZXRzLkV2ZW50VmlldyhidF9wYWNrZXRzLlBhY2tldFZpZXdMaXR0bGVFbmRpYW4obGlzdChwYWNrZXRfYnl0ZXMpKSkKLSAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGlmIGV2ZW50X2NvZGUgaXMgbm90IE5vbmUgYW5kIGV2ZW50LkdldEV2ZW50Q29kZSgpICE9IGV2ZW50X2NvZGU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gZXZlbnQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgTGVFdmVudFdpdGhDb2RlKHN1YmV2ZW50X2NvZGUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIG1zZzogSGNpTWF0Y2hlcnMuX2V4dHJhY3RfbWF0Y2hpbmdfbGVfZXZlbnQobXNnLnBheWxvYWQsIHN1YmV2ZW50X2NvZGUpIGlzIG5vdCBOb25lCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEV4dHJhY3RMZUV2ZW50V2l0aENvZGUocGFja2V0X2J5dGVzLCBzdWJldmVudF9jb2RlKToKLSAgICAgICAgcmV0dXJuIEhjaU1hdGNoZXJzLl9leHRyYWN0X21hdGNoaW5nX2xlX2V2ZW50KHBhY2tldF9ieXRlcywgc3ViZXZlbnRfY29kZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2V4dHJhY3RfbWF0Y2hpbmdfbGVfZXZlbnQocGFja2V0X2J5dGVzLCBzdWJldmVudF9jb2RlKToKLSAgICAgICAgaW5uZXJfZXZlbnQgPSBIY2lNYXRjaGVycy5fZXh0cmFjdF9tYXRjaGluZ19ldmVudChwYWNrZXRfYnl0ZXMsIGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5MRV9NRVRBX0VWRU5UKQotICAgICAgICBpZiBpbm5lcl9ldmVudCBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgZXZlbnQgPSBoY2lfcGFja2V0cy5MZU1ldGFFdmVudFZpZXcoaW5uZXJfZXZlbnQpCi0gICAgICAgIGlmIGV2ZW50LkdldFN1YmV2ZW50Q29kZSgpICE9IHN1YmV2ZW50X2NvZGU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gZXZlbnQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgTGVDb25uZWN0aW9uQ29tcGxldGUoKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBtc2c6IEhjaU1hdGNoZXJzLl9leHRyYWN0X2xlX2Nvbm5lY3Rpb25fY29tcGxldGUobXNnLnBheWxvYWQpIGlzIG5vdCBOb25lCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEV4dHJhY3RMZUNvbm5lY3Rpb25Db21wbGV0ZShwYWNrZXRfYnl0ZXMpOgotICAgICAgICByZXR1cm4gSGNpTWF0Y2hlcnMuX2V4dHJhY3RfbGVfY29ubmVjdGlvbl9jb21wbGV0ZShwYWNrZXRfYnl0ZXMpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9leHRyYWN0X2xlX2Nvbm5lY3Rpb25fY29tcGxldGUocGFja2V0X2J5dGVzKToKLSAgICAgICAgaW5uZXJfZXZlbnQgPSBIY2lNYXRjaGVycy5fZXh0cmFjdF9tYXRjaGluZ19sZV9ldmVudChwYWNrZXRfYnl0ZXMsIGhjaV9wYWNrZXRzLlN1YmV2ZW50Q29kZS5DT05ORUNUSU9OX0NPTVBMRVRFKQotICAgICAgICBpZiBpbm5lcl9ldmVudCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBoY2lfcGFja2V0cy5MZUNvbm5lY3Rpb25Db21wbGV0ZVZpZXcoaW5uZXJfZXZlbnQpCi0KLSAgICAgICAgaW5uZXJfZXZlbnQgPSBIY2lNYXRjaGVycy5fZXh0cmFjdF9tYXRjaGluZ19sZV9ldmVudChwYWNrZXRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuU3ViZXZlbnRDb2RlLkVOSEFOQ0VEX0NPTk5FQ1RJT05fQ09NUExFVEUpCi0gICAgICAgIGlmIGlubmVyX2V2ZW50IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcmV0dXJuIGhjaV9wYWNrZXRzLkxlRW5oYW5jZWRDb25uZWN0aW9uQ29tcGxldGVWaWV3KGlubmVyX2V2ZW50KQotCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIExvZ0V2ZW50Q29kZSgpOgotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBsb2dnaW5nLmluZm8oIlJlY2VpdmVkIGV2ZW50OiAleCIgJSBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QoZXZlbnQucGF5bG9hZCkpKS5HZXRFdmVudENvZGUoKSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgTGlua0tleVJlcXVlc3QoKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBldmVudDogSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShFdmVudENvZGUuTElOS19LRVlfUkVRVUVTVCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgSW9DYXBhYmlsaXR5UmVxdWVzdCgpOgotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBIY2lNYXRjaGVycy5FdmVudFdpdGhDb2RlKEV2ZW50Q29kZS5JT19DQVBBQklMSVRZX1JFUVVFU1QpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIElvQ2FwYWJpbGl0eVJlc3BvbnNlKCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IEhjaU1hdGNoZXJzLkV2ZW50V2l0aENvZGUoRXZlbnRDb2RlLklPX0NBUEFCSUxJVFlfUkVTUE9OU0UpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFVzZXJQYXNza2V5Tm90aWZpY2F0aW9uKCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IEhjaU1hdGNoZXJzLkV2ZW50V2l0aENvZGUoRXZlbnRDb2RlLlVTRVJfUEFTU0tFWV9OT1RJRklDQVRJT04pCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFVzZXJQYXNza2V5UmVxdWVzdCgpOgotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBIY2lNYXRjaGVycy5FdmVudFdpdGhDb2RlKEV2ZW50Q29kZS5VU0VSX1BBU1NLRVlfUkVRVUVTVCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBldmVudDogSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShFdmVudENvZGUuVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgUmVtb3RlSG9zdFN1cHBvcnRlZEZlYXR1cmVzTm90aWZpY2F0aW9uKCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IEhjaU1hdGNoZXJzLkV2ZW50V2l0aENvZGUoRXZlbnRDb2RlLlJFTU9URV9IT1NUX1NVUFBPUlRFRF9GRUFUVVJFU19OT1RJRklDQVRJT04pCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIExpbmtLZXlOb3RpZmljYXRpb24oKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBldmVudDogSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShFdmVudENvZGUuTElOS19LRVlfTk9USUZJQ0FUSU9OKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBTaW1wbGVQYWlyaW5nQ29tcGxldGUoKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBldmVudDogSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShFdmVudENvZGUuU0lNUExFX1BBSVJJTkdfQ09NUExFVEUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIERpc2Nvbm5lY3QoKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBldmVudDogSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShFdmVudENvZGUuRElTQ09OTkVDVCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRGlzY29ubmVjdGlvbkNvbXBsZXRlKCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IEhjaU1hdGNoZXJzLkV2ZW50V2l0aENvZGUoRXZlbnRDb2RlLkRJU0NPTk5FQ1RJT05fQ09NUExFVEUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFJlbW90ZU9vYkRhdGFSZXF1ZXN0KCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IEhjaU1hdGNoZXJzLkV2ZW50V2l0aENvZGUoRXZlbnRDb2RlLlJFTU9URV9PT0JfREFUQV9SRVFVRVNUKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBQaW5Db2RlUmVxdWVzdCgpOgotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBIY2lNYXRjaGVycy5FdmVudFdpdGhDb2RlKEV2ZW50Q29kZS5QSU5fQ09ERV9SRVFVRVNUKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBMb29wYmFja09mKHBhY2tldCk6Ci0gICAgICAgIHJldHVybiBIY2lNYXRjaGVycy5FeGFjdGx5KGhjaV9wYWNrZXRzLkxvb3BiYWNrQ29tbWFuZEJ1aWxkZXIocGFja2V0KSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRXhhY3RseShwYWNrZXQpOgotICAgICAgICBkYXRhID0gYnl0ZXMocGFja2V0LlNlcmlhbGl6ZSgpKQotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBkYXRhID09IGV2ZW50LnBheWxvYWQKLQotCi1jbGFzcyBBZHZlcnRpc2luZ01hdGNoZXJzKG9iamVjdCk6Ci0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2codHlwZSwgYWR2ZXJ0aXNlcl9pZD1Ob25lLCBzdGF0dXM9Tm9uZSwgZGF0YT1Ob25lKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBldmVudDogVHJ1ZSBpZiBldmVudC5tZXNzYWdlX3R5cGUgPT0gdHlwZSBhbmQgKGFkdmVydGlzZXJfaWQgPT0gTm9uZSBvciBhZHZlcnRpc2VyX2lkID09IGV2ZW50LmFkdmVydGlzZXJfaWQpIFwKLSAgICAgICAgICAgIGFuZCAoc3RhdHVzID09IE5vbmUgb3Igc3RhdHVzID09IGV2ZW50LnN0YXR1cykgYW5kIChkYXRhID09IE5vbmUgb3IgZGF0YSA9PSBldmVudC5kYXRhKSBlbHNlIEZhbHNlCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEFkZHJlc3NNc2codHlwZSwgYWR2ZXJ0aXNlcl9pZD1Ob25lLCBhZGRyZXNzPU5vbmUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBUcnVlIGlmIGV2ZW50Lm1lc3NhZ2VfdHlwZSA9PSB0eXBlIGFuZCAoYWR2ZXJ0aXNlcl9pZCA9PSBOb25lIG9yIGFkdmVydGlzZXJfaWQgPT0gZXZlbnQuYWR2ZXJ0aXNlcl9pZCkgXAotICAgICAgICAgICAgYW5kIChhZGRyZXNzID09IE5vbmUgb3IgYWRkcmVzcyA9PSBldmVudC5hZGRyZXNzKSBlbHNlIEZhbHNlCi0KLQotY2xhc3MgU2Nhbm5pbmdNYXRjaGVycyhvYmplY3QpOgotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBTY2FubmluZ0NhbGxiYWNrTXNnKHR5cGUsIHN0YXR1cz1Ob25lLCBkYXRhPU5vbmUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIGV2ZW50OiBUcnVlIGlmIGV2ZW50Lm1lc3NhZ2VfdHlwZSA9PSB0eXBlIGFuZCAoc3RhdHVzID09IE5vbmUgb3Igc3RhdHVzID09IGV2ZW50LnN0YXR1cykgXAotICAgICAgICAgICAgYW5kIChkYXRhID09IE5vbmUgb3IgZGF0YSA9PSBldmVudC5kYXRhKSBlbHNlIEZhbHNlCi0KLQotY2xhc3MgTmVpZ2hib3JNYXRjaGVycyhvYmplY3QpOgotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBJbnF1aXJ5UmVzdWx0KGFkZHJlc3MpOgotICAgICAgICByZXR1cm4gbGFtYmRhIG1zZzogTmVpZ2hib3JNYXRjaGVycy5faXNfbWF0Y2hpbmdfaW5xdWlyeV9yZXN1bHQobXNnLnBhY2tldCwgYWRkcmVzcykKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2lzX21hdGNoaW5nX2lucXVpcnlfcmVzdWx0KHBhY2tldCwgYWRkcmVzcyk6Ci0gICAgICAgIGhjaV9ldmVudCA9IEhjaU1hdGNoZXJzLkV4dHJhY3RFdmVudFdpdGhDb2RlKHBhY2tldCwgRXZlbnRDb2RlLklOUVVJUllfUkVTVUxUKQotICAgICAgICBpZiBoY2lfZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpbnF1aXJ5X3ZpZXcgPSBoY2lfcGFja2V0cy5JbnF1aXJ5UmVzdWx0VmlldyhoY2lfZXZlbnQpCi0gICAgICAgIGlmIGlucXVpcnlfdmlldyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJlc3VsdHMgPSBpbnF1aXJ5X3ZpZXcuR2V0SW5xdWlyeVJlc3VsdHMoKQotICAgICAgICByZXR1cm4gYW55KChhZGRyZXNzID09IHJlc3VsdC5iZF9hZGRyIGZvciByZXN1bHQgaW4gcmVzdWx0cykpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIElucXVpcnlSZXN1bHR3aXRoUnNzaShhZGRyZXNzKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBtc2c6IE5laWdoYm9yTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2lucXVpcnlfcmVzdWx0X3dpdGhfcnNzaShtc2cucGFja2V0LCBhZGRyZXNzKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfaW5xdWlyeV9yZXN1bHRfd2l0aF9yc3NpKHBhY2tldCwgYWRkcmVzcyk6Ci0gICAgICAgIGhjaV9ldmVudCA9IEhjaU1hdGNoZXJzLkV4dHJhY3RFdmVudFdpdGhDb2RlKHBhY2tldCwgRXZlbnRDb2RlLklOUVVJUllfUkVTVUxUX1dJVEhfUlNTSSkKLSAgICAgICAgaWYgaGNpX2V2ZW50IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgaW5xdWlyeV92aWV3ID0gaGNpX3BhY2tldHMuSW5xdWlyeVJlc3VsdFdpdGhSc3NpVmlldyhoY2lfZXZlbnQpCi0gICAgICAgIGlmIGlucXVpcnlfdmlldyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJlc3VsdHMgPSBpbnF1aXJ5X3ZpZXcuR2V0SW5xdWlyeVJlc3VsdHMoKQotICAgICAgICByZXR1cm4gYW55KChhZGRyZXNzID09IHJlc3VsdC5hZGRyZXNzIGZvciByZXN1bHQgaW4gcmVzdWx0cykpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEV4dGVuZGVkSW5xdWlyeVJlc3VsdChhZGRyZXNzKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBtc2c6IE5laWdoYm9yTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2V4dGVuZGVkX2lucXVpcnlfcmVzdWx0KG1zZy5wYWNrZXQsIGFkZHJlc3MpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19leHRlbmRlZF9pbnF1aXJ5X3Jlc3VsdChwYWNrZXQsIGFkZHJlc3MpOgotICAgICAgICBoY2lfZXZlbnQgPSBIY2lNYXRjaGVycy5FeHRyYWN0RXZlbnRXaXRoQ29kZShwYWNrZXQsIEV2ZW50Q29kZS5FWFRFTkRFRF9JTlFVSVJZX1JFU1VMVCkKLSAgICAgICAgaWYgaGNpX2V2ZW50IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgZXh0ZW5kZWRfdmlldyA9IGhjaV9wYWNrZXRzLkV4dGVuZGVkSW5xdWlyeVJlc3VsdFZpZXcoaGNpX2V2ZW50KQotICAgICAgICBpZiBleHRlbmRlZF92aWV3IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmV0dXJuIGFkZHJlc3MgPT0gZXh0ZW5kZWRfdmlldy5HZXRBZGRyZXNzKCkKLQotCi1jbGFzcyBMMmNhcE1hdGNoZXJzKG9iamVjdCk6Ci0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbm5lY3Rpb25SZXF1ZXN0KHBzbSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19jb25uZWN0aW9uX3JlcXVlc3QocGFja2V0LCBwc20pCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbm5lY3Rpb25SZXNwb25zZShzY2lkKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IEwyY2FwTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2Nvbm5lY3Rpb25fcmVzcG9uc2UocGFja2V0LCBzY2lkKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBDb25maWd1cmF0aW9uUmVzcG9uc2UocmVzdWx0PUNvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IEwyY2FwTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UocGFja2V0LCByZXN1bHQpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbmZpZ3VyYXRpb25SZXF1ZXN0KGNpZD1Ob25lKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IEwyY2FwTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2NvbmZpZ3VyYXRpb25fcmVxdWVzdF93aXRoX2NpZChwYWNrZXQsIGNpZCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ29uZmlndXJhdGlvblJlcXVlc3RXaXRoRXJ0bSgpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfY29uZmlndXJhdGlvbl9yZXF1ZXN0X3dpdGhfZXJ0bShwYWNrZXQpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbmZpZ3VyYXRpb25SZXF1ZXN0VmlldyhkY2lkKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSByZXF1ZXN0X3ZpZXc6IHJlcXVlc3Rfdmlldy5HZXREZXN0aW5hdGlvbkNpZCgpID09IGRjaWQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRGlzY29ubmVjdGlvblJlcXVlc3Qoc2NpZCwgZGNpZCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19kaXNjb25uZWN0aW9uX3JlcXVlc3QocGFja2V0LCBzY2lkLCBkY2lkKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBEaXNjb25uZWN0aW9uUmVzcG9uc2Uoc2NpZCwgZGNpZCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19kaXNjb25uZWN0aW9uX3Jlc3BvbnNlKHBhY2tldCwgc2NpZCwgZGNpZCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRWNob1Jlc3BvbnNlKCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19jb250cm9sX2ZyYW1lX3dpdGhfY29kZShwYWNrZXQsIENvbW1hbmRDb2RlLkVDSE9fUkVTUE9OU0UpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIENvbW1hbmRSZWplY3QoKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IEwyY2FwTWF0Y2hlcnMuX2lzX2NvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgQ29tbWFuZENvZGUuQ09NTUFORF9SRUpFQ1QpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIExlQ29tbWFuZFJlamVjdCgpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBMZUNvbW1hbmRDb2RlLkNPTU1BTkRfUkVKRUNUKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBMZUNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0KCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19sZV9jb250cm9sX2ZyYW1lX3dpdGhfY29kZSgKLSAgICAgICAgICAgIHBhY2tldCwgTGVDb21tYW5kQ29kZS5DT05ORUNUSU9OX1BBUkFNRVRFUl9VUERBVEVfUkVRVUVTVCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgTGVDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2UocmVzdWx0PWwyY2FwX3BhY2tldHMuQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlUmVzdWx0LkFDQ0VQVEVEKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IEwyY2FwTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2Nvbm5lY3Rpb25fcGFyYW1ldGVyX3VwZGF0ZV9yZXNwb25zZShwYWNrZXQsIHJlc3VsdCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVxdWVzdChwc20pOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfY3JlZGl0X2Jhc2VkX2Nvbm5lY3Rpb25fcmVxdWVzdChwYWNrZXQsIHBzbSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2UocmVzdWx0PUxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQuU1VDQ0VTUyk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19jcmVkaXRfYmFzZWRfY29ubmVjdGlvbl9yZXNwb25zZShwYWNrZXQsIHJlc3VsdCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VVc2VkQ2lkKCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19jcmVkaXRfYmFzZWRfY29ubmVjdGlvbl9yZXNwb25zZSgKLSAgICAgICAgICAgIHBhY2tldCwgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5TT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVECi0gICAgICAgICkgb3IgTDJjYXBNYXRjaGVycy5faXNfbGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBMZUNvbW1hbmRDb2RlLkNPTU1BTkRfUkVKRUNUKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBMZURpc2Nvbm5lY3Rpb25SZXF1ZXN0KHNjaWQsIGRjaWQpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfbGVfZGlzY29ubmVjdGlvbl9yZXF1ZXN0KHBhY2tldCwgc2NpZCwgZGNpZCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgTGVEaXNjb25uZWN0aW9uUmVzcG9uc2Uoc2NpZCwgZGNpZCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19sZV9kaXNjb25uZWN0aW9uX3Jlc3BvbnNlKHBhY2tldCwgc2NpZCwgZGNpZCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgTGVGbG93Q29udHJvbENyZWRpdChjaWQpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfbGVfZmxvd19jb250cm9sX2NyZWRpdChwYWNrZXQsIGNpZCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgU0ZyYW1lKHJlcV9zZXE9Tm9uZSwgZj1Ob25lLCBzPU5vbmUsIHA9Tm9uZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9pc19tYXRjaGluZ19zdXBlcnZpc29yeV9mcmFtZShwYWNrZXQsIHJlcV9zZXEsIGYsIHMsIHApCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIElGcmFtZSh0eF9zZXE9Tm9uZSwgcGF5bG9hZD1Ob25lLCBmPU5vbmUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfaW5mb3JtYXRpb25fZnJhbWUocGFja2V0LCB0eF9zZXEsIHBheWxvYWQsIGYsIGZjcz1GYWxzZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgSUZyYW1lV2l0aEZjcyh0eF9zZXE9Tm9uZSwgcGF5bG9hZD1Ob25lLCBmPU5vbmUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfaW5mb3JtYXRpb25fZnJhbWUocGFja2V0LCB0eF9zZXEsIHBheWxvYWQsIGYsIGZjcz1UcnVlKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBJRnJhbWVTdGFydCh0eF9zZXE9Tm9uZSwgcGF5bG9hZD1Ob25lLCBmPU5vbmUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfaW5mb3JtYXRpb25fc3RhcnRfZnJhbWUocGFja2V0LCB0eF9zZXEsIHBheWxvYWQsIGYsIGZjcz1GYWxzZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRGF0YShwYXlsb2FkKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IHBhY2tldC5HZXRQYXlsb2FkKCkuR2V0Qnl0ZXMoKSA9PSBwYXlsb2FkCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEZpcnN0TGVJRnJhbWUocGF5bG9hZCwgc2R1X3NpemUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faXNfbWF0Y2hpbmdfZmlyc3RfbGVfaV9mcmFtZShwYWNrZXQsIHBheWxvYWQsIHNkdV9zaXplKQotCi0gICAgIyB0aGlzIGlzIGEgaGFjayAtIHNob3VsZCBiZSByZW1vdmVkCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBQYXJ0aWFsRGF0YShwYXlsb2FkKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IHBheWxvYWQgaW4gcGFja2V0LkdldFBheWxvYWQoKS5HZXRCeXRlcygpCi0KLSAgICAjIHRoaXMgaXMgYSBoYWNrIC0gc2hvdWxkIGJlIHJlbW92ZWQKLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFBhY2tldFBheWxvYWRSYXdEYXRhKHBheWxvYWQpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogcGF5bG9hZCBpbiBwYWNrZXQucGF5bG9hZAotCi0gICAgIyB0aGlzIGlzIGEgaGFjayAtIHNob3VsZCBiZSByZW1vdmVkCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBQYWNrZXRQYXlsb2FkV2l0aE1hdGNoaW5nUHNtKHBzbSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBOb25lIGlmIHBzbSAhPSBwYWNrZXQucHNtIGVsc2UgcGFja2V0Ci0KLSAgICAjIHRoaXMgaXMgYSBoYWNrIC0gc2hvdWxkIGJlIHJlbW92ZWQKLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFBhY2tldFBheWxvYWRXaXRoTWF0Y2hpbmdDaWQoY2lkKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IE5vbmUgaWYgY2lkICE9IHBhY2tldC5maXhlZF9jaWQgZWxzZSBwYWNrZXQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRXh0cmFjdEJhc2ljRnJhbWUoc2NpZCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9iYXNpY19mcmFtZV9mb3IocGFja2V0LCBzY2lkKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBFeHRyYWN0QmFzaWNGcmFtZVdpdGhGY3Moc2NpZCk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgcGFja2V0OiBMMmNhcE1hdGNoZXJzLl9iYXNpY19mcmFtZV93aXRoX2Zjc19mb3IocGFja2V0LCBzY2lkKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBJbmZvcm1hdGlvblJlcXVlc3RXaXRoVHlwZShpbmZvX3R5cGUpOgotICAgICAgICByZXR1cm4gbGFtYmRhIHBhY2tldDogTDJjYXBNYXRjaGVycy5faW5mb3JtYXRpb25fcmVxdWVzdF93aXRoX3R5cGUocGFja2V0LCBpbmZvX3R5cGUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEluZm9ybWF0aW9uUmVzcG9uc2VFeHRlbmRlZEZlYXR1cmVzKHN1cHBvcnRzX2VydG09Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNfc3RyZWFtaW5nPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzX2Zjcz1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c19maXhlZF9jaGFubmVscz1Ob25lKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IEwyY2FwTWF0Y2hlcnMuX2lzX21hdGNoaW5nX2luZm9ybWF0aW9uX3Jlc3BvbnNlX2V4dGVuZGVkX2ZlYXR1cmVzKAotICAgICAgICAgICAgcGFja2V0LCBzdXBwb3J0c19lcnRtLCBzdXBwb3J0c19zdHJlYW1pbmcsIHN1cHBvcnRzX2Zjcywgc3VwcG9ydHNfZml4ZWRfY2hhbm5lbHMpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9iYXNpY19mcmFtZShwYWNrZXQpOgotICAgICAgICBpZiBwYWNrZXQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVWaWV3KGJ0X3BhY2tldHMuUGFja2V0Vmlld0xpdHRsZUVuZGlhbihsaXN0KHBhY2tldC5wYXlsb2FkKSkpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9iYXNpY19mcmFtZV93aXRoX2ZjcyhwYWNrZXQpOgotICAgICAgICBpZiBwYWNrZXQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVXaXRoRmNzVmlldyhidF9wYWNrZXRzLlBhY2tldFZpZXdMaXR0bGVFbmRpYW4obGlzdChwYWNrZXQucGF5bG9hZCkpKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfYmFzaWNfZnJhbWVfZm9yKHBhY2tldCwgc2NpZCk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5fYmFzaWNfZnJhbWUocGFja2V0KQotICAgICAgICBpZiBmcmFtZS5HZXRDaGFubmVsSWQoKSAhPSBzY2lkOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgcmV0dXJuIGZyYW1lCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9iYXNpY19mcmFtZV93aXRoX2Zjc19mb3IocGFja2V0LCBzY2lkKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLl9iYXNpY19mcmFtZShwYWNrZXQpCi0gICAgICAgIGlmIGZyYW1lLkdldENoYW5uZWxJZCgpICE9IHNjaWQ6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuX2Jhc2ljX2ZyYW1lX3dpdGhfZmNzKHBhY2tldCkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBmcmFtZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaW5mb3JtYXRpb25fZnJhbWUocGFja2V0KToKLSAgICAgICAgc3RhbmRhcmRfZnJhbWUgPSBsMmNhcF9wYWNrZXRzLlN0YW5kYXJkRnJhbWVWaWV3KHBhY2tldCkKLSAgICAgICAgaWYgc3RhbmRhcmRfZnJhbWUuR2V0RnJhbWVUeXBlKCkgIT0gbDJjYXBfcGFja2V0cy5GcmFtZVR5cGUuSV9GUkFNRToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkVuaGFuY2VkSW5mb3JtYXRpb25GcmFtZVZpZXcoc3RhbmRhcmRfZnJhbWUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pbmZvcm1hdGlvbl9mcmFtZV93aXRoX2ZjcyhwYWNrZXQpOgotICAgICAgICBzdGFuZGFyZF9mcmFtZSA9IGwyY2FwX3BhY2tldHMuU3RhbmRhcmRGcmFtZVdpdGhGY3NWaWV3KHBhY2tldCkKLSAgICAgICAgaWYgc3RhbmRhcmRfZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGlmIHN0YW5kYXJkX2ZyYW1lLkdldEZyYW1lVHlwZSgpICE9IGwyY2FwX3BhY2tldHMuRnJhbWVUeXBlLklfRlJBTUU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gbDJjYXBfcGFja2V0cy5FbmhhbmNlZEluZm9ybWF0aW9uRnJhbWVXaXRoRmNzVmlldyhzdGFuZGFyZF9mcmFtZSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2luZm9ybWF0aW9uX3N0YXJ0X2ZyYW1lKHBhY2tldCk6Ci0gICAgICAgIHN0YXJ0X2ZyYW1lID0gTDJjYXBNYXRjaGVycy5faW5mb3JtYXRpb25fZnJhbWUocGFja2V0KQotICAgICAgICBpZiBzdGFydF9mcmFtZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgcmV0dXJuIGwyY2FwX3BhY2tldHMuRW5oYW5jZWRJbmZvcm1hdGlvblN0YXJ0RnJhbWVWaWV3KHN0YXJ0X2ZyYW1lKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaW5mb3JtYXRpb25fc3RhcnRfZnJhbWVfd2l0aF9mY3MocGFja2V0KToKLSAgICAgICAgc3RhcnRfZnJhbWUgPSBMMmNhcE1hdGNoZXJzLl9pbmZvcm1hdGlvbl9mcmFtZV93aXRoX2ZjcyhwYWNrZXQpCi0gICAgICAgIGlmIHN0YXJ0X2ZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gbDJjYXBfcGFja2V0cy5FbmhhbmNlZEluZm9ybWF0aW9uU3RhcnRGcmFtZVdpdGhGY3NWaWV3KHN0YXJ0X2ZyYW1lKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfc3VwZXJ2aXNvcnlfZnJhbWUocGFja2V0KToKLSAgICAgICAgc3RhbmRhcmRfZnJhbWUgPSBsMmNhcF9wYWNrZXRzLlN0YW5kYXJkRnJhbWVWaWV3KHBhY2tldCkKLSAgICAgICAgaWYgc3RhbmRhcmRfZnJhbWUuR2V0RnJhbWVUeXBlKCkgIT0gbDJjYXBfcGFja2V0cy5GcmFtZVR5cGUuU19GUkFNRToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBsMmNhcF9wYWNrZXRzLkVuaGFuY2VkU3VwZXJ2aXNvcnlGcmFtZVZpZXcoc3RhbmRhcmRfZnJhbWUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19pbmZvcm1hdGlvbl9mcmFtZShwYWNrZXQsIHR4X3NlcSwgcGF5bG9hZCwgZiwgZmNzPUZhbHNlKToKLSAgICAgICAgaWYgZmNzOgotICAgICAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLl9pbmZvcm1hdGlvbl9mcmFtZV93aXRoX2ZjcyhwYWNrZXQpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuX2luZm9ybWF0aW9uX2ZyYW1lKHBhY2tldCkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiB0eF9zZXEgaXMgbm90IE5vbmUgYW5kIGZyYW1lLkdldFR4U2VxKCkgIT0gdHhfc2VxOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGlmIHBheWxvYWQgaXMgbm90IE5vbmUgYW5kIGZyYW1lLkdldFBheWxvYWQoKS5HZXRCeXRlcygpICE9IHBheWxvYWQ6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgaWYgZiBpcyBub3QgTm9uZSBhbmQgZnJhbWUuR2V0RigpICE9IGY6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2lzX21hdGNoaW5nX2luZm9ybWF0aW9uX3N0YXJ0X2ZyYW1lKHBhY2tldCwgdHhfc2VxLCBwYXlsb2FkLCBmLCBmY3M9RmFsc2UpOgotICAgICAgICBpZiBmY3M6Ci0gICAgICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuX2luZm9ybWF0aW9uX3N0YXJ0X2ZyYW1lX3dpdGhfZmNzKHBhY2tldCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5faW5mb3JtYXRpb25fc3RhcnRfZnJhbWUocGFja2V0KQotICAgICAgICBpZiBmcmFtZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGlmIHR4X3NlcSBpcyBub3QgTm9uZSBhbmQgZnJhbWUuR2V0VHhTZXEoKSAhPSB0eF9zZXE6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgaWYgcGF5bG9hZCBpcyBub3QgTm9uZSBhbmQgZnJhbWUuR2V0UGF5bG9hZCgpLkdldEJ5dGVzKCkgIT0gcGF5bG9hZDoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBmIGlzIG5vdCBOb25lIGFuZCBmcmFtZS5HZXRGKCkgIT0gZjoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfc3VwZXJ2aXNvcnlfZnJhbWUocGFja2V0LCByZXFfc2VxLCBmLCBzLCBwKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLl9zdXBlcnZpc29yeV9mcmFtZShwYWNrZXQpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgaWYgcmVxX3NlcSBpcyBub3QgTm9uZSBhbmQgZnJhbWUuR2V0UmVxU2VxKCkgIT0gcmVxX3NlcToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBmIGlzIG5vdCBOb25lIGFuZCBmcmFtZS5HZXRGKCkgIT0gZjoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBzIGlzIG5vdCBOb25lIGFuZCBmcmFtZS5HZXRTKCkgIT0gczoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBwIGlzIG5vdCBOb25lIGFuZCBmcmFtZS5HZXRQKCkgIT0gcDoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfZmlyc3RfbGVfaV9mcmFtZShwYWNrZXQsIHBheWxvYWQsIHNkdV9zaXplKToKLSAgICAgICAgZmlyc3RfbGVfaV9mcmFtZSA9IGwyY2FwX3BhY2tldHMuRmlyc3RMZUluZm9ybWF0aW9uRnJhbWVWaWV3KHBhY2tldCkKLSAgICAgICAgcmV0dXJuIGZpcnN0X2xlX2lfZnJhbWUuR2V0UGF5bG9hZCgpLkdldEJ5dGVzKCkgPT0gcGF5bG9hZCBhbmQgZmlyc3RfbGVfaV9mcmFtZS5HZXRMMmNhcFNkdUxlbmd0aCgpID09IHNkdV9zaXplCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9jb250cm9sX2ZyYW1lKHBhY2tldCk6Ci0gICAgICAgIGlmIHBhY2tldC5HZXRDaGFubmVsSWQoKSAhPSAxOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgcmV0dXJuIGwyY2FwX3BhY2tldHMuQ29udHJvbFZpZXcocGFja2V0LkdldFBheWxvYWQoKSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2xlX2NvbnRyb2xfZnJhbWUocGFja2V0KToKLSAgICAgICAgaWYgcGFja2V0LkdldENoYW5uZWxJZCgpICE9IDU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gbDJjYXBfcGFja2V0cy5MZUNvbnRyb2xWaWV3KHBhY2tldC5HZXRQYXlsb2FkKCkpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIGNvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgY29kZSk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5fY29udHJvbF9mcmFtZShwYWNrZXQpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmUgb3IgZnJhbWUuR2V0Q29kZSgpICE9IGNvZGU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gZnJhbWUKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgbGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBjb2RlKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLl9sZV9jb250cm9sX2ZyYW1lKHBhY2tldCkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZSBvciBmcmFtZS5HZXRDb2RlKCkgIT0gY29kZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBmcmFtZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBjb2RlKToKLSAgICAgICAgcmV0dXJuIEwyY2FwTWF0Y2hlcnMuY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBjb2RlKSBpcyBub3QgTm9uZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBjb2RlKToKLSAgICAgICAgcmV0dXJuIEwyY2FwTWF0Y2hlcnMubGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBjb2RlKSBpcyBub3QgTm9uZQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfY29ubmVjdGlvbl9yZXF1ZXN0KHBhY2tldCwgcHNtKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmNvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgQ29tbWFuZENvZGUuQ09OTkVDVElPTl9SRVFVRVNUKQotICAgICAgICBpZiBmcmFtZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJlcXVlc3QgPSBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25SZXF1ZXN0VmlldyhmcmFtZSkKLSAgICAgICAgcmV0dXJuIHJlcXVlc3QuR2V0UHNtKCkgPT0gcHNtCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19jb25uZWN0aW9uX3Jlc3BvbnNlKHBhY2tldCwgc2NpZCk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5jb250cm9sX2ZyYW1lX3dpdGhfY29kZShwYWNrZXQsIENvbW1hbmRDb2RlLkNPTk5FQ1RJT05fUkVTUE9OU0UpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25SZXNwb25zZVZpZXcoZnJhbWUpCi0gICAgICAgIHJldHVybiByZXNwb25zZS5HZXRTb3VyY2VDaWQoKSA9PSBzY2lkIGFuZCByZXNwb25zZS5HZXRSZXN1bHQoCi0gICAgICAgICkgPT0gQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LlNVQ0NFU1MgYW5kIHJlc3BvbnNlLkdldERlc3RpbmF0aW9uQ2lkKCkgIT0gMAotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfY29uZmlndXJhdGlvbl9yZXF1ZXN0X3dpdGhfY2lkKHBhY2tldCwgY2lkPU5vbmUpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBDb21tYW5kQ29kZS5DT05GSUdVUkFUSU9OX1JFUVVFU1QpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3KGZyYW1lKQotICAgICAgICBkY2lkID0gcmVxdWVzdC5HZXREZXN0aW5hdGlvbkNpZCgpCi0gICAgICAgIHJldHVybiBjaWQgaXMgTm9uZSBvciBjaWQgPT0gZGNpZAotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfY29uZmlndXJhdGlvbl9yZXF1ZXN0X3dpdGhfZXJ0bShwYWNrZXQpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBDb21tYW5kQ29kZS5DT05GSUdVUkFUSU9OX1JFUVVFU1QpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3KGZyYW1lKQotICAgICAgICBjb25maWdfYnl0ZXMgPSByZXF1ZXN0LkdldEJ5dGVzKCkKLSAgICAgICAgIyBUT0RPKGIvMTUzMTg5NTAzKTogVXNlIHBhY2tldCBzdHJ1Y3QgcGFyc2VyLgotICAgICAgICByZXR1cm4gYiJceDA0XHgwOVx4MDMiIGluIGNvbmZpZ19ieXRlcwotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfY29uZmlndXJhdGlvbl9yZXNwb25zZShwYWNrZXQsIHJlc3VsdD1Db25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQuU1VDQ0VTUyk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5jb250cm9sX2ZyYW1lX3dpdGhfY29kZShwYWNrZXQsIENvbW1hbmRDb2RlLkNPTkZJR1VSQVRJT05fUkVTUE9OU0UpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkNvbmZpZ3VyYXRpb25SZXNwb25zZVZpZXcoZnJhbWUpCi0gICAgICAgIHJldHVybiByZXNwb25zZS5HZXRSZXN1bHQoKSA9PSByZXN1bHQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2lzX21hdGNoaW5nX2Rpc2Nvbm5lY3Rpb25fcmVxdWVzdChwYWNrZXQsIHNjaWQsIGRjaWQpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBDb21tYW5kQ29kZS5ESVNDT05ORUNUSU9OX1JFUVVFU1QpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuRGlzY29ubmVjdGlvblJlcXVlc3RWaWV3KGZyYW1lKQotICAgICAgICByZXR1cm4gcmVxdWVzdC5HZXRTb3VyY2VDaWQoKSA9PSBzY2lkIGFuZCByZXF1ZXN0LkdldERlc3RpbmF0aW9uQ2lkKCkgPT0gZGNpZAotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaXNfbWF0Y2hpbmdfZGlzY29ubmVjdGlvbl9yZXNwb25zZShwYWNrZXQsIHNjaWQsIGRjaWQpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBDb21tYW5kQ29kZS5ESVNDT05ORUNUSU9OX1JFU1BPTlNFKQotICAgICAgICBpZiBmcmFtZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJlc3BvbnNlID0gbDJjYXBfcGFja2V0cy5EaXNjb25uZWN0aW9uUmVzcG9uc2VWaWV3KGZyYW1lKQotICAgICAgICByZXR1cm4gcmVzcG9uc2UuR2V0U291cmNlQ2lkKCkgPT0gc2NpZCBhbmQgcmVzcG9uc2UuR2V0RGVzdGluYXRpb25DaWQoKSA9PSBkY2lkCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19sZV9kaXNjb25uZWN0aW9uX3Jlc3BvbnNlKHBhY2tldCwgc2NpZCwgZGNpZCk6Ci0gICAgICAgIGZyYW1lID0gTDJjYXBNYXRjaGVycy5sZV9jb250cm9sX2ZyYW1lX3dpdGhfY29kZShwYWNrZXQsIExlQ29tbWFuZENvZGUuRElTQ09OTkVDVElPTl9SRVNQT05TRSkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXNwb25zZSA9IGwyY2FwX3BhY2tldHMuTGVEaXNjb25uZWN0aW9uUmVzcG9uc2VWaWV3KGZyYW1lKQotICAgICAgICByZXR1cm4gcmVzcG9uc2UuR2V0U291cmNlQ2lkKCkgPT0gc2NpZCBhbmQgcmVzcG9uc2UuR2V0RGVzdGluYXRpb25DaWQoKSA9PSBkY2lkCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19sZV9kaXNjb25uZWN0aW9uX3JlcXVlc3QocGFja2V0LCBzY2lkLCBkY2lkKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmxlX2NvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgTGVDb21tYW5kQ29kZS5ESVNDT05ORUNUSU9OX1JFUVVFU1QpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuTGVEaXNjb25uZWN0aW9uUmVxdWVzdFZpZXcoZnJhbWUpCi0gICAgICAgIHJldHVybiByZXF1ZXN0LkdldFNvdXJjZUNpZCgpID09IHNjaWQgYW5kIHJlcXVlc3QuR2V0RGVzdGluYXRpb25DaWQoKSA9PSBkY2lkCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19sZV9mbG93X2NvbnRyb2xfY3JlZGl0KHBhY2tldCwgY2lkKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmxlX2NvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgTGVDb21tYW5kQ29kZS5MRV9GTE9XX0NPTlRST0xfQ1JFRElUKQotICAgICAgICBpZiBmcmFtZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJlcXVlc3QgPSBsMmNhcF9wYWNrZXRzLkxlRmxvd0NvbnRyb2xDcmVkaXRWaWV3KGZyYW1lKQotICAgICAgICByZXR1cm4gcmVxdWVzdC5HZXRDaWQoKSA9PSBjaWQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2luZm9ybWF0aW9uX3JlcXVlc3Rfd2l0aF90eXBlKHBhY2tldCwgaW5mb190eXBlKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmNvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgQ29tbWFuZENvZGUuSU5GT1JNQVRJT05fUkVRVUVTVCkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJlcXVlc3QgPSBsMmNhcF9wYWNrZXRzLkluZm9ybWF0aW9uUmVxdWVzdFZpZXcoZnJhbWUpCi0gICAgICAgIGlmIHJlcXVlc3QuR2V0SW5mb1R5cGUoKSAhPSBpbmZvX3R5cGU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gcmVxdWVzdAotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfaW5mb3JtYXRpb25fcmVzcG9uc2Vfd2l0aF90eXBlKHBhY2tldCwgaW5mb190eXBlKToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmNvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgQ29tbWFuZENvZGUuSU5GT1JNQVRJT05fUkVTUE9OU0UpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXNwb25zZSA9IGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXNwb25zZVZpZXcoZnJhbWUpCi0gICAgICAgIGlmIHJlc3BvbnNlLkdldEluZm9UeXBlKCkgIT0gaW5mb190eXBlOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19pbmZvcm1hdGlvbl9yZXNwb25zZV9leHRlbmRlZF9mZWF0dXJlcyhwYWNrZXQsIHN1cHBvcnRzX2VydG0sIHN1cHBvcnRzX3N0cmVhbWluZywgc3VwcG9ydHNfZmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNfZml4ZWRfY2hhbm5lbHMpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMuX2luZm9ybWF0aW9uX3Jlc3BvbnNlX3dpdGhfdHlwZShwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlLkVYVEVOREVEX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBmZWF0dXJlcyA9IGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXNwb25zZUV4dGVuZGVkRmVhdHVyZXNWaWV3KGZyYW1lKQotICAgICAgICBpZiBzdXBwb3J0c19lcnRtIGlzIG5vdCBOb25lIGFuZCBmZWF0dXJlcy5HZXRFbmhhbmNlZFJldHJhbnNtaXNzaW9uTW9kZSgpICE9IHN1cHBvcnRzX2VydG06Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgaWYgc3VwcG9ydHNfc3RyZWFtaW5nIGlzIG5vdCBOb25lIGFuZCBmZWF0dXJlcy5HZXRTdHJlYW1pbmdNb2RlICE9IHN1cHBvcnRzX3N0cmVhbWluZzoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBzdXBwb3J0c19mY3MgaXMgbm90IE5vbmUgYW5kIGZlYXR1cmVzLkdldEZjc09wdGlvbigpICE9IHN1cHBvcnRzX2ZjczoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBzdXBwb3J0c19maXhlZF9jaGFubmVscyBpcyBub3QgTm9uZSBhbmQgZmVhdHVyZXMuR2V0Rml4ZWRDaGFubmVscygpICE9IHN1cHBvcnRzX2ZpeGVkX2NoYW5uZWxzOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9pc19tYXRjaGluZ19jb25uZWN0aW9uX3BhcmFtZXRlcl91cGRhdGVfcmVzcG9uc2UocGFja2V0LCByZXN1bHQpOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMubGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBMZUNvbW1hbmRDb2RlLkNPTk5FQ1RJT05fUEFSQU1FVEVSX1VQREFURV9SRVNQT05TRSkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gbDJjYXBfcGFja2V0cy5Db25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2VWaWV3KGZyYW1lKS5HZXRSZXN1bHQoKSA9PSByZXN1bHQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2lzX21hdGNoaW5nX2NyZWRpdF9iYXNlZF9jb25uZWN0aW9uX3JlcXVlc3QocGFja2V0LCBwc20pOgotICAgICAgICBmcmFtZSA9IEwyY2FwTWF0Y2hlcnMubGVfY29udHJvbF9mcmFtZV93aXRoX2NvZGUocGFja2V0LCBMZUNvbW1hbmRDb2RlLkxFX0NSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QpCi0gICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0VmlldyhmcmFtZSkKLSAgICAgICAgcmV0dXJuIHJlcXVlc3QuR2V0TGVQc20oKSA9PSBwc20KLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX2lzX21hdGNoaW5nX2NyZWRpdF9iYXNlZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHBhY2tldCwgcmVzdWx0KToKLSAgICAgICAgZnJhbWUgPSBMMmNhcE1hdGNoZXJzLmxlX2NvbnRyb2xfZnJhbWVfd2l0aF9jb2RlKHBhY2tldCwgTGVDb21tYW5kQ29kZS5MRV9DUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVNQT05TRSkKLSAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXNwb25zZSA9IGwyY2FwX3BhY2tldHMuTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVZpZXcoZnJhbWUpCi0gICAgICAgIHJldHVybiByZXNwb25zZS5HZXRSZXN1bHQoKSA9PSByZXN1bHQgYW5kIChyZXN1bHQgIT0gTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5HZXREZXN0aW5hdGlvbkNpZCgpICE9IDApCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnQodHlwZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IFRydWUgaWYgZXZlbnQuZXZlbnRfdHlwZSA9PSB0eXBlIGVsc2UgRmFsc2UKLQotCi1jbGFzcyBTZWN1cml0eU1hdGNoZXJzKG9iamVjdCk6Ci0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIFVpTXNnKHR5cGUsIGFkZHJlc3M9Tm9uZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IFRydWUgaWYgZXZlbnQubWVzc2FnZV90eXBlID09IHR5cGUgYW5kIChhZGRyZXNzID09IE5vbmUgb3IgYWRkcmVzcyA9PSBldmVudC5wZWVyKSBlbHNlIEZhbHNlCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIEJvbmRNc2codHlwZSwgYWRkcmVzcz1Ob25lLCByZWFzb249Tm9uZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IFRydWUgaWYgZXZlbnQubWVzc2FnZV90eXBlID09IHR5cGUgYW5kIChhZGRyZXNzID09IE5vbmUgb3IgYWRkcmVzcyA9PSBldmVudC5wZWVyKSBhbmQgKHJlYXNvbiA9PSBOb25lIG9yIHJlYXNvbiA9PSBldmVudC5yZWFzb24pIGVsc2UgRmFsc2UKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgSGVscGVyTXNnKHR5cGUsIGFkZHJlc3M9Tm9uZSk6Ci0gICAgICAgIHJldHVybiBsYW1iZGEgZXZlbnQ6IFRydWUgaWYgZXZlbnQubWVzc2FnZV90eXBlID09IHR5cGUgYW5kIChhZGRyZXNzID09IE5vbmUgb3IgYWRkcmVzcyA9PSBldmVudC5wZWVyKSBlbHNlIEZhbHNlCi0KLQotY2xhc3MgSXNvTWF0Y2hlcnMob2JqZWN0KToKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgRGF0YShwYXlsb2FkKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IHBhY2tldC5wYXlsb2FkID09IHBheWxvYWQKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgUGFja2V0UGF5bG9hZFdpdGhNYXRjaGluZ0Npc0hhbmRsZShjaXNfaGFuZGxlKToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSBwYWNrZXQ6IE5vbmUgaWYgY2lzX2hhbmRsZSAhPSBwYWNrZXQuaGFuZGxlIGVsc2UgcGFja2V0CmRpZmYgLS1naXQgYS9nZC9jZXJ0L21ldGFkYXRhLnB5IGIvZ2QvY2VydC9tZXRhZGF0YS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1YzBhZC4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L21ldGFkYXRhLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotaW1wb3J0IGZ1bmN0b29scwotaW1wb3J0IGluc3BlY3QKLQotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0LnRlc3RfZGVjb3JhdG9ycyBpbXBvcnQgdGVzdF9pbmZvCi0KLQotZGVmIF9mYWlsX2RlY29yYXRvcihtc2cpOgotCi0gICAgZGVmIGZhaWxfZGVjb3JhdG9yKGZ1bmMpOgotCi0gICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKLSAgICAgICAgZGVmIGZhaWwoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgICAgIGFzc2VydHMuZmFpbChtc2cpCi0KLSAgICAgICAgcmV0dXJuIGZhaWwKLQotICAgIHJldHVybiBmYWlsX2RlY29yYXRvcgotCi0KLWRlZiBtZXRhZGF0YShfZG9fbm90X3VzZT1Ob25lLCBwdHNfdGVzdF9pZD1Ob25lLCBwdHNfdGVzdF9uYW1lPU5vbmUpOgotICAgICIiIgotICAgIFJlY29yZCBhIHBpZWNlIG9mIHRlc3QgbWV0YWRhdGEgaW4gdGhlIEV4dHJhIHNlY3Rpb24gb2YgdGhlIHRlc3QgUmVjb3JkIGluCi0gICAgdGhlIHRlc3Qgc3VtbWFyeSBmaWxlLiBUaGUgbWV0YWRhdGEgd2lsbCBjb21lIHdpdGggYSB0aW1lc3RhbXAsIGJ1dCB0aGVyZQotICAgIGlzIG5vIGd1YXJhbnRlZSBvbiB0aGUgb3JkZXIgb2Ygd2hlbiB0aGUgbWV0YWRhdGEgd2lsbCBiZSB3cml0dGVuCi0KLSAgICBOb3RlOgotICAgIC0gTWV0YWRhdGEgaXMgcmVjb3JkZWQgcGVyIHRlc3QgY2FzZSBhcyBrZXktdmFsdWUgcGFpcnMuCi0gICAgLSBNZXRhZGF0YSBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgd3JpdHRlbiB3aGVuIHRoZSB0ZXN0IHJlc3VsdCBpcyBQQVNTLAotICAgICAgRkFJTCBvciBTS0lQUEVELiBXaGVuIHRoZXJlIGFyZSB0ZXN0IGluZnJhc3RydWN0dXJhbCBlcnJvcnMsIG1ldGFkYXRhCi0gICAgICBtaWdodCBub3QgYmUgd3JpdHRlbiBzdWNjZXNzZnVsbHkKLSAgICA6cGFyYW0gX2RvX25vdF91c2U6IGEgcG9zaXRpb25hbCBhcmd1bWVudCB3aXRoIGRlZmF1bHQgdmFsdWUuIFRoaXMgYXJndW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGVuc3VyZSB0aGF0IEBtZXRhZGF0YShrZXk9dmFsdWUpIGlzIHVzZWQgaW4gYQotICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbCBmb3JtIGluc3RlYWQgb2YgQG1ldGFkYXRhIG9yIEBtZXRhZGF0YShhKQotICAgIDpwYXJhbSBwdHNfdGVzdF9pZDogQSBmdWxseSBxdWFsaWZpZWQgUFRTIHRlc3QgSUQgc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVAvQ09TL0lFWC9CVi0wMS1DCi0gICAgOnBhcmFtIHB0c190ZXN0X25hbWU6IEEgaHVtYW4gcmVhZGFibGUgdGVzdCBuYW1lIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgQ29ubmVjdGlvbiIgZm9yIHRoZSBhYm92ZSBleGFtcGxlCi0gICAgOnJldHVybjogZGVjb3JhdGVkIHRlc3QgY2FzZSBmdW5jdGlvbiBvYmplY3QKLSAgICAiIiIKLSAgICBpZiBfZG9fbm90X3VzZSBpcyBub3QgTm9uZToKLQotICAgICAgICBkZWYgZmFpbCgqYXJncywgKiprd2FyZ3MpOgotICAgICAgICAgICAgYXNzZXJ0cy5mYWlsKCJAbWV0YWRhdGEgbXVzdCBiZSB1c2VkIGluIGZ1bmN0aW9uYWwgZm9ybSBzdWNoICIgImFzIEBtZXRhZHRhKGtleT12YWx1ZSkiKQotCi0gICAgICAgIHJldHVybiBmYWlsCi0KLSAgICAjIENyZWF0ZSBhIGRpY3Rpb25hcnkgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycwotICAgIHZhbHVlcyA9IGxvY2FscygpCi0gICAgYXJncyA9IHthcmc6IHZhbHVlc1thcmddIGZvciBhcmcgaW4gaW5zcGVjdC5nZXRmdWxsYXJnc3BlYyhtZXRhZGF0YSkuYXJnc30KLSAgICBkZWwgYXJnc1siX2RvX25vdF91c2UiXQotCi0gICAgIyBDaGVjayBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHZhbGlkCi0gICAgaWYgbm90IGFueShhcmdzLnZhbHVlcygpKToKLSAgICAgICAgcmV0dXJuIF9mYWlsX2RlY29yYXRvcigiYXQgbGVhc3Qgb25lIG9wdGlvbmFsIGFyZ3VtZW50IHNob3VsZCBiZSB2YWxpZCIpCi0KLSAgICAjIFZhbGlkYXRlIHB0c190ZXN0X2lkIGFuZCBwdHNfdGVzdF9uYW1lCi0gICAgaWYgYW55KChwdHNfdGVzdF9pZCwgcHRzX3Rlc3RfbmFtZSkpIGFuZCBcCi0gICAgICAgICAgICBub3QgYWxsKChwdHNfdGVzdF9pZCwgcHRzX3Rlc3RfbmFtZSkpOgotICAgICAgICByZXR1cm4gX2ZhaWxfZGVjb3JhdG9yKCJwdHNfdGVzdF9pZCBhbmQgcHRzX3Rlc3RfbmFtZSBtdXN0IGJvdGggIiAiYmUgdmFsaWQgaWYgb25lIG9mIHRoZW0gaXMgdmFsaWQiKQotCi0gICAgcmV0dXJuIHRlc3RfaW5mbygqKmFyZ3MpCmRpZmYgLS1naXQgYS9nZC9jZXJ0L29zX3V0aWxzLnB5IGIvZ2QvY2VydC9vc191dGlscy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZjNlZC4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L29zX3V0aWxzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGxvZ2dpbmcKLWZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAotaW1wb3J0IHBzdXRpbAotaW1wb3J0IHJlCi1pbXBvcnQgc3VicHJvY2VzcwotZnJvbSB0eXBpbmcgaW1wb3J0IENvbnRhaW5lcgotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKLQotCi1jbGFzcyBUZXJtaW5hbENvbG9yOgotICAgIFJFRCA9ICJcMDMzWzMxOzFtIgotICAgIEJMVUUgPSAiXDAzM1szNDsxbSIKLSAgICBZRUxMT1cgPSAiXDAzM1szMzsxbSIKLSAgICBNQUdFTlRBID0gIlwwMzNbMzU7MW0iCi0gICAgRU5EID0gIlwwMzNbMG0iCi0KLQotZGVmIGlzX3N1YnByb2Nlc3NfYWxpdmUocHJvY2VzcywgdGltZW91dF9zZWNvbmRzPTEpOgotICAgICIiIgotICAgIENoZWNrIGlmIGEgcHJvY2VzcyBpcyBhbGl2ZSBmb3IgYXQgbGVhc3QgdGltZW91dF9zZWNvbmRzCi0gICAgOnBhcmFtIHByb2Nlc3M6IGEgUG9wZW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50IGEgc3VicHJvY2VzcwotICAgIDpwYXJhbSB0aW1lb3V0X3NlY29uZHM6IHByb2Nlc3MgbmVlZHMgdG8gYmUgYWxpdmUgZm9yIGF0IGxlYXN0Ci0gICAgICAgICAgIHRpbWVvdXRfc2Vjb25kcwotICAgIDpyZXR1cm46IFRydWUgaWYgcHJvY2VzcyBpcyBhbGl2ZSBmb3IgYXQgbGVhc3QgdGltZW91dF9zZWNvbmRzCi0gICAgIiIiCi0gICAgdHJ5OgotICAgICAgICBwcm9jZXNzLndhaXQodGltZW91dD10aW1lb3V0X3NlY29uZHMpCi0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkIGFzIGV4cDoKLSAgICAgICAgcmV0dXJuIFRydWUKLQotCi1kZWYgZ2V0X2dkX3Jvb3QoKToKLSAgICAiIiIKLSAgICBSZXR1cm4gdGhlIHJvb3Qgb2YgdGhlIEdEIHRlc3QgbGlicmFyeQotCi0gICAgR0Qgcm9vdCBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBjZXJ0Ci0gICAgOnJldHVybjogcm9vdCBkaXJlY3Rvcnkgc3RyaW5nIG9mIGdkIHRlc3QgbGlicmFyeQotICAgICIiIgotICAgIHJldHVybiBzdHIoUGF0aChfX2ZpbGVfXykuYWJzb2x1dGUoKS5wYXJlbnRzWzFdKQotCi0KLWRlZiBtYWtlX3BvcnRzX2F2YWlsYWJsZShwb3J0czogQ29udGFpbmVyW2ludF0sIHRpbWVvdXRfc2Vjb25kcz0xMCk6Ci0gICAgIiIiTWFrZSBzdXJlIGEgbGlzdCBvZiBwb3J0cyBhcmUgYXZhaWxhYmxlCi0gICAga2lsbCBvY2N1cHlpbmcgcHJvY2VzcyBpZiBwb3NzaWJsZQotICAgIDpwYXJhbSBwb3J0czogbGlzdCBvZiB0YXJnZXQgcG9ydHMKLSAgICA6cGFyYW0gdGltZW91dF9zZWNvbmRzOiBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IHdoZW4ga2lsbGluZyBwcm9jZXNzZXMKLSAgICA6cmV0dXJuOiBUcnVlIG9uIHN1Y2Nlc3MsIEZhbHNlIG9uIGZhaWx1cmUKLSAgICAiIiIKLSAgICBpZiBub3QgcG9ydHM6Ci0gICAgICAgIGxvZ2dpbmcud2FybmluZygiRW1wdHkgcG9ydHMgaXMgZ2l2ZW4gdG8gbWFrZV9wb3J0c19hdmFpbGFibGUoKSIpCi0gICAgICAgIHJldHVybiBUcnVlCi0gICAgIyBHZXQgY29ubmVjdGlvbnMgd2hvc2Ugc3RhdGUgYXJlIGluIExJU1RFTiBvbmx5Ci0gICAgIyBDb25uZWN0aW9ucyBpbiBvdGhlciBzdGF0ZXMgd29uJ3QgYWZmZWN0IGJpbmRpbmcgYXMgU09fUkVVU0VBRERSIGlzIHVzZWQKLSAgICBsaXN0ZW5pbmdfY29ubnNfZm9yX3BvcnQgPSBmaWx0ZXIoCi0gICAgICAgIGxhbWJkYSBjb25uOiAoY29ubiBhbmQgY29ubi5zdGF0dXMgPT0gcHN1dGlsLkNPTk5fTElTVEVOIGFuZCBjb25uLmxhZGRyIGFuZCBjb25uLmxhZGRyLnBvcnQgaW4gcG9ydHMpLAotICAgICAgICBwc3V0aWwubmV0X2Nvbm5lY3Rpb25zKCkpCi0gICAgc3VjY2VzcyA9IFRydWUKLSAgICBraWxsZWRfcGlkcyA9IHNldCgpCi0gICAgZm9yIGNvbm4gaW4gbGlzdGVuaW5nX2Nvbm5zX2Zvcl9wb3J0OgotICAgICAgICBsb2dnaW5nLndhcm5pbmcoIkZyZWVpbmcgcG9ydCAlZCB1c2VkIGJ5ICVzIiAlIChjb25uLmxhZGRyLnBvcnQsIHN0cihjb25uKSkpCi0gICAgICAgIGlmIG5vdCBjb25uLnBpZDoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkZhaWxlZCB0byBraWxsIHByb2Nlc3Mgb2NjdXB5aW5nIHBvcnQgJWQgZHVlIHRvIGxhY2sgb2YgcGlkIiAlIGNvbm4ubGFkZHIucG9ydCkKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJLaWxsaW5nIHBpZCAlZCB0aGF0IGlzIHVzaW5nIHBvcnQgcG9ydCAlZCIgJSAoY29ubi5waWQsIGNvbm4ubGFkZHIucG9ydCkpCi0gICAgICAgIGlmIGNvbm4ucGlkIGluIGtpbGxlZF9waWRzOgotICAgICAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJQaWQgJWQgaXMgYWxyZWFkeSBraWxsZWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIiAlIChjb25uLnBpZCkpCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwcm9jZXNzID0gcHN1dGlsLlByb2Nlc3MoY29ubi5waWQpCi0gICAgICAgICAgICBwcm9jZXNzLmtpbGwoKQotICAgICAgICAgICAgcHJvY2Vzcy53YWl0KHRpbWVvdXQ9dGltZW91dF9zZWNvbmRzKQotICAgICAgICAgICAga2lsbGVkX3BpZHMuYWRkKGNvbm4ucGlkKQotICAgICAgICBleGNlcHQgcHN1dGlsLk5vU3VjaFByb2Nlc3M6Ci0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIlBpZCAlZCBpcyBhbHJlYWR5IGRlYWQgYmVmb3JlIHRyeWluZyB0byBraWxsIGl0IiAlIChjb25uLnBpZCkpCi0gICAgICAgICAgICBraWxsZWRfcGlkcy5hZGQoY29ubi5waWQpCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBleGNlcHQgcHN1dGlsLlRpbWVvdXRFeHBpcmVkOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiU0lHS0lMTCB0aW1lb3V0IGFmdGVyICVkIHNlY29uZHMgZm9yIHBpZCAlZCIgJSAodGltZW91dF9zZWNvbmRzLCBjb25uLnBpZCkpCi0gICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKLSAgICAgICAgICAgIGJyZWFrCi0gICAgcmV0dXJuIHN1Y2Nlc3MKLQotCi0jIGUuZy4gMjAyMC0wNS0wNiAxNjowMjowNC4yMTYgYnQgLSBzeXN0ZW0vYnQvZ2QvZmFjYWRlL2ZhY2FkZV9tYWluLmNjOjc5IC0gY3Jhc2hfY2FsbGJhY2s6ICMwMyBwYyAwMDAwMDAwMDAwMDEzNTIwICAvbGliL3g4Nl82NC1saW51eC1nbnUvbGlicHRocmVhZC0yLjI5LnNvCi1IT1NUX0NSQVNIX0xJTkVfUkVHRVggPSByZS5jb21waWxlKHIiXi4qIC0gY3Jhc2hfY2FsbGJhY2s6ICg/UDxsaW5lPi4qKSQiKQotSE9TVF9BQk9SVF9IRUFERVIgPSAiUHJvY2VzcyBjcmFzaGVkLCBzaWduYWw6IEFib3J0ZWQiCi1BU0FOX09VVFBVVF9TVEFSVF9SRUdFWCA9IHJlLmNvbXBpbGUociJePT0uKkFkZHJlc3NTYW5pdGl6ZXIuKiQiKQotCi0KLWRlZiByZWFkX2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsKGxvZ3BhdGgpOgotICAgICIiIgotICAgIEdldCBjcmFzaCBzbmlwcGV0IGlmIHJlZ2V4IG1hdGNoZWQgb3IgbGFzdCAyMCBsaW5lcyBvZiBsb2cKLSAgICA6cmV0dXJuOiBjcmFzaF9zbmlwcGV0LCBsb2dfdGFpbF8yMAotICAgICAgICAgICAgMSkgY3Jhc2ggc25pcHBldCB3aXRob3V0IHRpbWVzdGFtcCBpbiBvbmUgc3RyaW5nOwotICAgICAgICAgICAgMikgbGFzdCAyMCBsaW5lcyBvZiBsb2cgaW4gb25lIHN0cmluZzsKLSAgICAiIiIKLSAgICBnZF9yb290X3ByZWZpeCA9IGdldF9nZF9yb290KCkgKyAiLyIKLSAgICBhYm9ydF9saW5lID0gTm9uZQotICAgIGxhc3RfMjBfbGluZXMgPSBkZXF1ZShtYXhsZW49MjApCi0gICAgY3Jhc2hfbG9nX2xpbmVzID0gW10KLSAgICBhc2FuID0gRmFsc2UKLSAgICBhc2FuX2xpbmVzID0gW10KLQotICAgIHRyeToKLSAgICAgICAgd2l0aCBvcGVuKGxvZ3BhdGgpIGFzIGY6Ci0gICAgICAgICAgICBmb3IgXywgbGluZSBpbiBlbnVtZXJhdGUoZik6Ci0gICAgICAgICAgICAgICAgbGFzdF8yMF9saW5lcy5hcHBlbmQobGluZSkKLSAgICAgICAgICAgICAgICBhc2FuX21hdGNoID0gQVNBTl9PVVRQVVRfU1RBUlRfUkVHRVgubWF0Y2gobGluZSkKLSAgICAgICAgICAgICAgICBpZiBhc2FuIG9yIGFzYW5fbWF0Y2g6Ci0gICAgICAgICAgICAgICAgICAgIGFzYW5fbGluZXMuYXBwZW5kKGxpbmUpCi0gICAgICAgICAgICAgICAgICAgIGFzYW4gPSBUcnVlCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgICAgICAgICBob3N0X2NyYXNoX21hdGNoID0gSE9TVF9DUkFTSF9MSU5FX1JFR0VYLm1hdGNoKGxpbmUpCi0gICAgICAgICAgICAgICAgaWYgaG9zdF9jcmFzaF9tYXRjaDoKLSAgICAgICAgICAgICAgICAgICAgY3Jhc2hfbGluZSA9IGhvc3RfY3Jhc2hfbWF0Y2guZ3JvdXAoImxpbmUiKS5yZXBsYWNlKGdkX3Jvb3RfcHJlZml4LCAiIikKLSAgICAgICAgICAgICAgICAgICAgaWYgSE9TVF9BQk9SVF9IRUFERVIgaW4gY3Jhc2hfbGluZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxlbihsYXN0XzIwX2xpbmVzKSA+IDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydF9saW5lID0gbGFzdF8yMF9saW5lc1stMl0KLSAgICAgICAgICAgICAgICAgICAgY3Jhc2hfbG9nX2xpbmVzLmFwcGVuZChjcmFzaF9saW5lKQotICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgotICAgICAgICBsb2dnaW5nLmVycm9yKCJDYW5ub3Qgb3BlbiBiYWNraW5nIGxvZyBmaWxlIGF0IHt9Ii5mb3JtYXQobG9ncGF0aCkpCi0gICAgICAgIHJldHVybiBOb25lLCBOb25lCi0KLSAgICBsb2dfdGFpbF8yMCA9ICIiLmpvaW4obGFzdF8yMF9saW5lcykKLSAgICBjcmFzaF9zbmlwcGV0ID0gIiIKLSAgICBpZiBhYm9ydF9saW5lIGlzIG5vdCBOb25lOgotICAgICAgICBjcmFzaF9zbmlwcGV0ICs9ICJhYm9ydCBsb2cgbGluZTpcblxuJXNcbiIgJSBhYm9ydF9saW5lCi0gICAgY3Jhc2hfc25pcHBldCArPSAiXG4iLmpvaW4oY3Jhc2hfbG9nX2xpbmVzKQotCi0gICAgaWYgbGVuKGFzYW5fbGluZXMpID4gMDoKLSAgICAgICAgcmV0dXJuICIiLmpvaW4oYXNhbl9saW5lcyksIGxvZ190YWlsXzIwCi0KLSAgICBpZiBsZW4oY3Jhc2hfbG9nX2xpbmVzKSA+IDA6Ci0gICAgICAgIHJldHVybiBjcmFzaF9zbmlwcGV0LCBsb2dfdGFpbF8yMAotCi0gICAgcmV0dXJuIE5vbmUsIGxvZ190YWlsXzIwCmRpZmYgLS1naXQgYS9nZC9jZXJ0L3BlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLnB5IGIvZ2QvY2VydC9wZXJmb3JtYW5jZV90ZXN0X2xvZ2dlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2YmJkNi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3BlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQotCi0KLWNsYXNzIFBlcmZvcm1hbmNlVGVzdExvZ2dlcihvYmplY3QpOgotICAgICIiIgotICAgIEEgaGVscGVyIGNsYXNzIHRvIGxvZyB0aW1lIHBvaW50cyBhbmQgaW50ZXJ2YWxzCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYmFzZV90aW1lcG9pbnQgPSBkYXRldGltZS5ub3coKQotICAgICAgICAjIFdlIHVzZSBhIGRpY3Rpb25hcnkgb2YgYSBsaXN0IG9mIHRpbWVwb2ludHMKLSAgICAgICAgc2VsZi5zdGFydF9pbnRlcnZhbF9wb2ludHMgPSB7fQotICAgICAgICBzZWxmLmVuZF9pbnRlcnZhbF9wb2ludHMgPSB7fQotICAgICAgICBzZWxmLnNpbmdsZV9wb2ludHMgPSB7fQotCi0gICAgZGVmIGxvZ19zaW5nbGVfcG9pbnQoc2VsZiwgbGFiZWw9IiIpOgotICAgICAgICBpZiBsYWJlbCBub3QgaW4gc2VsZi5zaW5nbGVfcG9pbnRzOgotICAgICAgICAgICAgc2VsZi5zaW5nbGVfcG9pbnRzW2xhYmVsXSA9IFtdCi0gICAgICAgIHNlbGYuc2luZ2xlX3BvaW50c1tsYWJlbF0uYXBwZW5kKGRhdGV0aW1lLm5vdygpKQotCi0gICAgZGVmIHN0YXJ0X2ludGVydmFsKHNlbGYsIGxhYmVsPSIiKToKLSAgICAgICAgaWYgbGFiZWwgbm90IGluIHNlbGYuc3RhcnRfaW50ZXJ2YWxfcG9pbnRzOgotICAgICAgICAgICAgc2VsZi5zdGFydF9pbnRlcnZhbF9wb2ludHNbbGFiZWxdID0gW10KLSAgICAgICAgc2VsZi5zdGFydF9pbnRlcnZhbF9wb2ludHNbbGFiZWxdLmFwcGVuZChkYXRldGltZS5ub3coKSkKLQotICAgIGRlZiBlbmRfaW50ZXJ2YWwoc2VsZiwgbGFiZWw9IiIpOgotICAgICAgICBpZiBsYWJlbCBub3QgaW4gc2VsZi5lbmRfaW50ZXJ2YWxfcG9pbnRzOgotICAgICAgICAgICAgc2VsZi5lbmRfaW50ZXJ2YWxfcG9pbnRzW2xhYmVsXSA9IFtdCi0gICAgICAgIHNlbGYuZW5kX2ludGVydmFsX3BvaW50c1tsYWJlbF0uYXBwZW5kKGRhdGV0aW1lLm5vdygpKQotCi0gICAgZGVmIF9jaGVja19pbnRlcnZhbF9sYWJlbChzZWxmLCBsYWJlbCk6Ci0gICAgICAgIGlmIGxhYmVsIG5vdCBpbiBzZWxmLnN0YXJ0X2ludGVydmFsX3BvaW50cyBvciBsYWJlbCBub3QgaW4gc2VsZi5lbmRfaW50ZXJ2YWxfcG9pbnRzOgotICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImxhYmVsICVzIGRvZXNuJ3QgZXhpc3QiICUgbGFiZWwpCi0gICAgICAgIGlmIGxlbihzZWxmLnN0YXJ0X2ludGVydmFsX3BvaW50c1tsYWJlbF0pICE9IGxlbihzZWxmLmVuZF9pbnRlcnZhbF9wb2ludHNbbGFiZWxdKToKLSAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJsYWJlbCAlcyBkb2Vzbid0IGhhdmUgY29ycmVjdCBzdGFydCBhbmQgZW5kIGxvZyIgJSBsYWJlbCkKLQotICAgIGRlZiBnZXRfZHVyYXRpb25fb2ZfaW50ZXJ2YWxzKHNlbGYsIGxhYmVsKToKLSAgICAgICAgIiIiCi0gICAgICAgIFJldHVybiB0aGUgbGlzdCBvZiBkdXJhdGlvbiBvZiB0aGUgaW50ZXJ2YWxzIHdpdGggc3BlY2lmaWVkIGxhYmVsLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fY2hlY2tfaW50ZXJ2YWxfbGFiZWwobGFiZWwpCi0gICAgICAgIGludGVydmFscyA9IFtdCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnN0YXJ0X2ludGVydmFsX3BvaW50c1tsYWJlbF0pKToKLSAgICAgICAgICAgIGludGVydmFsID0gc2VsZi5lbmRfaW50ZXJ2YWxfcG9pbnRzW2xhYmVsXVtpXSAtIHNlbGYuc3RhcnRfaW50ZXJ2YWxfcG9pbnRzW2xhYmVsXVtpXQotICAgICAgICAgICAgaW50ZXJ2YWxzLmFwcGVuZChpbnRlcnZhbCkKLSAgICAgICAgcmV0dXJuIGludGVydmFscwotCi0gICAgZGVmIGR1bXBfaW50ZXJ2YWxzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgR2l2ZXMgYW4gaXRlcmF0b3Igb2YgKGl0ZXJhdG9yIG9mIGxhYmVsLCBzdGFydCwgZW5kKSBvdmVyIGFsbCBsYWJlbHMKLSAgICAgICAgIiIiCi0gICAgICAgIGZvciBsYWJlbCBpbiBzZWxmLnN0YXJ0X2ludGVydmFsX3BvaW50czoKLSAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludGVydmFsX2xhYmVsKGxhYmVsKQotICAgICAgICAgICAgeWllbGQgKChsYWJlbCwgc2VsZi5zdGFydF9pbnRlcnZhbF9wb2ludHNbbGFiZWxdW2ldLCBzZWxmLmVuZF9pbnRlcnZhbF9wb2ludHNbbGFiZWxdW2ldKQotICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnN0YXJ0X2ludGVydmFsX3BvaW50c1tsYWJlbF0pKSkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvcHRzLmpzb24gYi9nZC9jZXJ0L3B0cy5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY2YzVhLi4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvcHRzLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0KLXsgICAiX2Rlc2NyaXB0aW9uIjogIkJsdWV0b290aCBjZXJ0IHRlc3RpbmciLAotICAgICJ0ZXN0YmVkIjoKLSAgICBbCi0gICAgICAgIHsKLSAgICAgICAgICAgICJfZGVzY3JpcHRpb24iOiAiUFRTIGwyY2FwIGxheWVyIHRlc3QiLAotICAgICAgICAgICAgIm5hbWUiOiAiUFRTTDJDQVAiLAotICAgICAgICAgICAgIkdkRGV2aWNlIjoKLSAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJncnBjX3BvcnQiOiAiODg5OSIsCi0gICAgICAgICAgICAgICAgICAgICJncnBjX3Jvb3Rfc2VydmVyX3BvcnQiOiAiODg5NyIsCi0gICAgICAgICAgICAgICAgICAgICJzaWduYWxfcG9ydCI6ICI4ODk1IiwKLSAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogInN0YWNrX3VuZGVyX3Rlc3QiLAotICAgICAgICAgICAgICAgICAgICAic2VyaWFsX251bWJlciI6ICJEVVQiLAotICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDZXJ0IERldmljZSIsCi0gICAgICAgICAgICAgICAgICAgICJjbWQiOgotICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWRiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJChzZXJpYWxfbnVtYmVyKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2hlbGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi9zeXN0ZW0vYmluL2JsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1ncnBjLXBvcnQ9JChncnBjX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3Qtc2VydmVyLXBvcnQ9JChncnBjX3Jvb3Rfc2VydmVyX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWJ0c25vb3A9ZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1zaWduYWwtcG9ydD0kKHNpZ25hbF9wb3J0KSIKLSAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAicHRzX2FkZHJlc3MiOiAiUFRTIgotICAgICAgICB9Ci0gICAgXSwKLSAgICAibG9ncGF0aCI6ICIvdG1wL2xvZ3MiCi19CmRpZmYgLS1naXQgYS9nZC9jZXJ0L3B0c19iYXNlX3Rlc3QucHkgYi9nZC9jZXJ0L3B0c19iYXNlX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTk0MDcuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9wdHNfYmFzZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGFjdHMuYmFzZV90ZXN0IGltcG9ydCBCYXNlVGVzdENsYXNzCi0KLWltcG9ydCBpbXBvcnRsaWIKLQotCi1jbGFzcyBQVFNCYXNlVGVzdENsYXNzKEJhc2VUZXN0Q2xhc3MpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZ3MpOgotICAgICAgICBCYXNlVGVzdENsYXNzLl9faW5pdF9fKHNlbGYsIGNvbmZpZ3MpCi0KLSAgICAgICAgZ2RfZGV2aWNlcyA9IHNlbGYuY29udHJvbGxlcl9jb25maWdzLmdldCgiR2REZXZpY2UiKQotCi0gICAgICAgIHNlbGYucmVnaXN0ZXJfY29udHJvbGxlcihpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnY2VydC5nZF9kZXZpY2UnKSwgYnVpbHRpbj1UcnVlKQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9wdHNfbDJjYXBfdGVzdGNhc2UgYi9nZC9jZXJ0L3B0c19sMmNhcF90ZXN0Y2FzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhZTQwZS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3B0c19sMmNhcF90ZXN0Y2FzZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBUU0wyY2FwVGVzdApkaWZmIC0tZ2l0IGEvZ2QvY2VydC9weV9hY2xfbWFuYWdlci5weSBiL2dkL2NlcnQvcHlfYWNsX21hbmFnZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTU4YWQuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9weV9hY2xfbWFuYWdlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IElFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmNhcHR1cmVzIGltcG9ydCBIY2lDYXB0dXJlcwotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgaGNpX3BhY2tldHMKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBhY2xfbWFuYWdlcl9mYWNhZGVfcGIyIGFzIGFjbF9tYW5hZ2VyX2ZhY2FkZQotCi0KLWNsYXNzIFB5QWNsTWFuYWdlckFjbENvbm5lY3Rpb24oSUV2ZW50U3RyZWFtLCBDbG9zYWJsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgYWNsX21hbmFnZXIsIHJlbW90ZV9hZGRyLCBoYW5kbGUsIGV2ZW50X3N0cmVhbSk6Ci0gICAgICAgIHNlbGYuYWNsX21hbmFnZXIgPSBhY2xfbWFuYWdlcgotICAgICAgICBzZWxmLmhhbmRsZSA9IGhhbmRsZQotICAgICAgICBzZWxmLnJlbW90ZV9hZGRyID0gcmVtb3RlX2FkZHIKLSAgICAgICAgc2VsZi5jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSA9IGV2ZW50X3N0cmVhbQotICAgICAgICBzZWxmLmFjbF9zdHJlYW0gPSBFdmVudFN0cmVhbShzZWxmLmFjbF9tYW5hZ2VyLkZldGNoQWNsRGF0YShhY2xfbWFuYWdlcl9mYWNhZGUuSGFuZGxlTXNnKGhhbmRsZT1zZWxmLmhhbmRsZSkpKQotCi0gICAgZGVmIGRpc2Nvbm5lY3Qoc2VsZiwgcmVhc29uKToKLSAgICAgICAgcGFja2V0X2J5dGVzID0gYnl0ZXMoaGNpX3BhY2tldHMuRGlzY29ubmVjdEJ1aWxkZXIoc2VsZi5oYW5kbGUsIHJlYXNvbikuU2VyaWFsaXplKCkpCi0gICAgICAgIHNlbGYuYWNsX21hbmFnZXIuQ29ubmVjdGlvbkNvbW1hbmQoYWNsX21hbmFnZXJfZmFjYWRlLkNvbm5lY3Rpb25Db21tYW5kTXNnKHBhY2tldD1wYWNrZXRfYnl0ZXMpKQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuYWNsX3N0cmVhbSkKLQotICAgIGRlZiB3YWl0X2Zvcl9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKHNlbGYpOgotICAgICAgICBkaXNjb25uZWN0aW9uX2NvbXBsZXRlID0gSGNpQ2FwdHVyZXMuRGlzY29ubmVjdGlvbkNvbXBsZXRlQ2FwdHVyZSgpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkuZW1pdHMoZGlzY29ubmVjdGlvbl9jb21wbGV0ZSkKLSAgICAgICAgc2VsZi5kaXNjb25uZWN0X3JlYXNvbiA9IGRpc2Nvbm5lY3Rpb25fY29tcGxldGUuZ2V0KCkuR2V0UmVhc29uKCkKLQotICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLmFjbF9tYW5hZ2VyLlNlbmRBY2xEYXRhKGFjbF9tYW5hZ2VyX2ZhY2FkZS5BY2xEYXRhKGhhbmRsZT1zZWxmLmhhbmRsZSwgcGF5bG9hZD1ieXRlcyhkYXRhKSkpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5hY2xfc3RyZWFtLmdldF9ldmVudF9xdWV1ZSgpCi0KLQotY2xhc3MgUHlBY2xNYW5hZ2VyOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldmljZSk6Ci0gICAgICAgIHNlbGYuYWNsX21hbmFnZXIgPSBkZXZpY2UuaGNpX2FjbF9tYW5hZ2VyCi0gICAgICAgIHNlbGYuaW5jb21pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0gPSBOb25lCi0gICAgICAgIHNlbGYub3V0Z29pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0gPSBOb25lCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNhZmVDbG9zZShzZWxmLmluY29taW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtKQotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkKLQotICAgIGRlZiBsaXN0ZW5fZm9yX2FuX2luY29taW5nX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5pbmNvbWluZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkuaXNOb25lKCkKLSAgICAgICAgc2VsZi5pbmNvbWluZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKAotICAgICAgICAgICAgc2VsZi5hY2xfbWFuYWdlci5GZXRjaEluY29taW5nQ29ubmVjdGlvbihlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgIGRlZiBpbml0aWF0ZV9jb25uZWN0aW9uKHNlbGYsIHJlbW90ZV9hZGRyKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLm91dGdvaW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtKS5pc05vbmUoKQotICAgICAgICByZW1vdGVfYWRkcl9ieXRlcyA9IGJ5dGVzKHJlbW90ZV9hZGRyLCAndXRmOCcpIGlmIHR5cGUocmVtb3RlX2FkZHIpIGlzIHN0ciBlbHNlIGJ5dGVzKHJlbW90ZV9hZGRyKQotICAgICAgICBzZWxmLm91dGdvaW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLmFjbF9tYW5hZ2VyLkNyZWF0ZUNvbm5lY3Rpb24oYWNsX21hbmFnZXJfZmFjYWRlLkNvbm5lY3Rpb25Nc2coYWRkcmVzcz1yZW1vdGVfYWRkcl9ieXRlcykpKQotCi0gICAgZGVmIGNvbXBsZXRlX2Nvbm5lY3Rpb24oc2VsZiwgZXZlbnRfc3RyZWFtKToKLSAgICAgICAgY29ubmVjdGlvbl9jb21wbGV0ZSA9IEhjaUNhcHR1cmVzLkNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHMoY29ubmVjdGlvbl9jb21wbGV0ZSkKLSAgICAgICAgY29tcGxldGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlLmdldCgpCi0gICAgICAgIGhhbmRsZSA9IGNvbXBsZXRlLkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICBhZGRyZXNzID0gY29tcGxldGUuR2V0QmRBZGRyKCkKLSAgICAgICAgcmV0dXJuIFB5QWNsTWFuYWdlckFjbENvbm5lY3Rpb24oc2VsZi5hY2xfbWFuYWdlciwgYWRkcmVzcywgaGFuZGxlLCBldmVudF9zdHJlYW0pCi0KLSAgICBkZWYgY29tcGxldGVfaW5jb21pbmdfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmluY29taW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtKS5pc05vdE5vbmUoKQotICAgICAgICBldmVudF9zdHJlYW0gPSBzZWxmLmluY29taW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtCi0gICAgICAgIHNlbGYuaW5jb21pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0gPSBOb25lCi0gICAgICAgIHJldHVybiBzZWxmLmNvbXBsZXRlX2Nvbm5lY3Rpb24oZXZlbnRfc3RyZWFtKQotCi0gICAgZGVmIGNvbXBsZXRlX291dGdvaW5nX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkuaXNOb3ROb25lKCkKLSAgICAgICAgZXZlbnRfc3RyZWFtID0gc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbQotICAgICAgICBzZWxmLm91dGdvaW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtID0gTm9uZQotICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0ZV9jb25uZWN0aW9uKGV2ZW50X3N0cmVhbSkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvcHlfaGFsLnB5IGIvZ2QvY2VydC9weV9oYWwucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNDhiNmEuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9weV9oYWwucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRmlsdGVyaW5nRXZlbnRTdHJlYW0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IElFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC5jYXB0dXJlcyBpbXBvcnQgSGNpQ2FwdHVyZXMKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBXcml0ZVNjYW5FbmFibGVCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFNjYW5FbmFibGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQWNsQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBSYXdCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEJyb2FkY2FzdEZsYWcKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgUGFja2V0Qm91bmRhcnlGbGFnCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEhjaU1hdGNoZXJzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEZpbHRlckR1cGxpY2F0ZXMKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc0J1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFBlZXJBZGRyZXNzVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBBZHZlcnRpc2luZ0ZpbHRlclBvbGljeQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBHYXBEYXRhCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEdhcERhdGFUeXBlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IE9wZXJhdGlvbgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBPd25BZGRyZXNzVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNjYW5uaW5nRmlsdGVyUG9saWN5Ci1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEVuYWJsZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBGcmFnbWVudFByZWZlcmVuY2UKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGVCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0RXh0ZW5kZWRTY2FuRW5hYmxlQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBFbmFibGVkU2V0Ci1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IE9wQ29kZQotZnJvbSBmYWNhZGUgaW1wb3J0IGNvbW1vbl9wYjIgYXMgY29tbW9uCi0KLQotY2xhc3MgUHlIYWxBY2xDb25uZWN0aW9uKElFdmVudFN0cmVhbSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlLCBhY2xfc3RyZWFtLCBkZXZpY2UpOgotICAgICAgICBzZWxmLmhhbmRsZSA9IGludChoYW5kbGUpCi0gICAgICAgIHNlbGYuZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYub3VyX2FjbF9zdHJlYW0gPSBGaWx0ZXJpbmdFdmVudFN0cmVhbShhY2xfc3RyZWFtLCBOb25lKQotCi0gICAgZGVmIHNlbmQoc2VsZiwgcGJfZmxhZywgYl9mbGFnLCBkYXRhKToKLSAgICAgICAgYWNsID0gQWNsQnVpbGRlcihzZWxmLmhhbmRsZSwgcGJfZmxhZywgYl9mbGFnLCBSYXdCdWlsZGVyKGRhdGEpKQotICAgICAgICBzZWxmLmRldmljZS5oYWwuU2VuZEFjbChjb21tb24uRGF0YShwYXlsb2FkPWJ5dGVzKGFjbC5TZXJpYWxpemUoKSkpKQotCi0gICAgZGVmIHNlbmRfZmlyc3Qoc2VsZiwgZGF0YSk6Ci0gICAgICAgIHNlbGYuc2VuZChQYWNrZXRCb3VuZGFyeUZsYWcuRklSU1RfTk9OX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFLCBCcm9hZGNhc3RGbGFnLlBPSU5UX1RPX1BPSU5ULCBieXRlcyhkYXRhKSkKLQotICAgIGRlZiBnZXRfZXZlbnRfcXVldWUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm91cl9hY2xfc3RyZWFtLmdldF9ldmVudF9xdWV1ZSgpCi0KLQotY2xhc3MgUHlIYWxBZHZlcnRpc2VtZW50KG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlLCBweV9oYWwpOgotICAgICAgICBzZWxmLmhhbmRsZSA9IGhhbmRsZQotICAgICAgICBzZWxmLnB5X2hhbCA9IHB5X2hhbAotCi0gICAgZGVmIHNldF9kYXRhKHNlbGYsIGNvbXBsZXRlX25hbWUpOgotICAgICAgICBkYXRhID0gR2FwRGF0YSgpCi0gICAgICAgIGRhdGEuZGF0YV90eXBlID0gR2FwRGF0YVR5cGUuQ09NUExFVEVfTE9DQUxfTkFNRQotICAgICAgICBkYXRhLmRhdGEgPSBsaXN0KGJ5dGVzKGNvbXBsZXRlX25hbWUpKQotICAgICAgICBzZWxmLnB5X2hhbC5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YUJ1aWxkZXIoc2VsZi5oYW5kbGUsIE9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRQcmVmZXJlbmNlLkNPTlRST0xMRVJfU0hPVUxEX05PVCwgW2RhdGFdKSkKLSAgICAgICAgc2VsZi5weV9oYWwud2FpdF9mb3JfY29tcGxldGUoT3BDb2RlLkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19EQVRBKQotCi0gICAgZGVmIHNldF9zY2FuX3Jlc3BvbnNlKHNlbGYsIHNob3J0ZW5lZF9uYW1lKToKLSAgICAgICAgZGF0YSA9IEdhcERhdGEoKQotICAgICAgICBkYXRhLmRhdGFfdHlwZSA9IEdhcERhdGFUeXBlLlNIT1JURU5FRF9MT0NBTF9OQU1FCi0gICAgICAgIGRhdGEuZGF0YSA9IGxpc3QoYnl0ZXMoc2hvcnRlbmVkX25hbWUpKQotICAgICAgICBzZWxmLnB5X2hhbC5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcihzZWxmLmhhbmRsZSwgT3BlcmF0aW9uLkNPTVBMRVRFX0FEVkVSVElTRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtkYXRhXSkpCi0gICAgICAgIHNlbGYucHlfaGFsLndhaXRfZm9yX2NvbXBsZXRlKE9wQ29kZS5MRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfU0NBTl9SRVNQT05TRSkKLQotICAgIGRlZiBzdGFydChzZWxmKToKLSAgICAgICAgZW5hYmxlZF9zZXQgPSBFbmFibGVkU2V0KCkKLSAgICAgICAgZW5hYmxlZF9zZXQuYWR2ZXJ0aXNpbmdfaGFuZGxlID0gc2VsZi5oYW5kbGUKLSAgICAgICAgZW5hYmxlZF9zZXQuZHVyYXRpb24gPSAwCi0gICAgICAgIGVuYWJsZWRfc2V0Lm1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMgPSAwCi0gICAgICAgIHNlbGYucHlfaGFsLnNlbmRfaGNpX2NvbW1hbmQoTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcihFbmFibGUuRU5BQkxFRCwgW2VuYWJsZWRfc2V0XSkpCi0gICAgICAgIHNlbGYucHlfaGFsLndhaXRfZm9yX2NvbXBsZXRlKE9wQ29kZS5MRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfRU5BQkxFKQotCi0gICAgZGVmIHN0b3Aoc2VsZik6Ci0gICAgICAgIGVuYWJsZWRfc2V0ID0gRW5hYmxlZFNldCgpCi0gICAgICAgIGVuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZSA9IHNlbGYuaGFuZGxlCi0gICAgICAgIGVuYWJsZWRfc2V0LmR1cmF0aW9uID0gMAotICAgICAgICBlbmFibGVkX3NldC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzID0gMAotICAgICAgICBzZWxmLnB5X2hhbC5zZW5kX2hjaV9jb21tYW5kKExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXIoRW5hYmxlLkRJU0FCTEVELCBbZW5hYmxlZF9zZXRdKSkKLSAgICAgICAgc2VsZi5weV9oYWwud2FpdF9mb3JfY29tcGxldGUoT3BDb2RlLkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19FTkFCTEUpCi0KLQotY2xhc3MgUHlIYWwoQ2xvc2FibGUpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldmljZSk6Ci0gICAgICAgIHNlbGYuZGV2aWNlID0gZGV2aWNlCi0KLSAgICAgICAgc2VsZi5oY2lfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5kZXZpY2UuaGFsLlN0cmVhbUV2ZW50cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLSAgICAgICAgc2VsZi5hY2xfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5kZXZpY2UuaGFsLlN0cmVhbUFjbChlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgICAgICBzZWxmLmV2ZW50X21hc2sgPSAweDFGRkZfRkZGRl9GRkZGICAjIERlZmF1bHQgRXZlbnQgTWFzayAoQ29yZSBWb2wgNCBbRV0gNy4zLjEpCi0KLSAgICAgICAgIyBXZSBkb24ndCBkZWFsIHdpdGggU0NPIGZvciBub3cKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuaGNpX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuYWNsX3N0cmVhbSkKLQotICAgIGRlZiBnZXRfaGNpX2V2ZW50X3N0cmVhbShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuaGNpX2V2ZW50X3N0cmVhbQotCi0gICAgZGVmIHdhaXRfZm9yX2NvbXBsZXRlKHNlbGYsIG9wY29kZSk6Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5oY2lfZXZlbnRfc3RyZWFtKS5lbWl0cyhIY2lNYXRjaGVycy5Db21tYW5kQ29tcGxldGUob3Bjb2RlKSkKLQotICAgIGRlZiB3YWl0X2Zvcl9zdGF0dXMoc2VsZiwgb3Bjb2RlKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmhjaV9ldmVudF9zdHJlYW0pLmVtaXRzKEhjaU1hdGNoZXJzLkNvbW1hbmRTdGF0dXMob3Bjb2RlKSkKLQotICAgIGRlZiBnZXRfYWNsX3N0cmVhbShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuYWNsX3N0cmVhbQotCi0gICAgZGVmIHNlbmRfaGNpX2NvbW1hbmQoc2VsZiwgY29tbWFuZCk6Ci0gICAgICAgIHNlbGYuZGV2aWNlLmhhbC5TZW5kQ29tbWFuZChjb21tb24uRGF0YShwYXlsb2FkPWJ5dGVzKGNvbW1hbmQuU2VyaWFsaXplKCkpKSkKLQotICAgIGRlZiBzZW5kX2FjbChzZWxmLCBoYW5kbGUsIHBiX2ZsYWcsIGJfZmxhZywgZGF0YSk6Ci0gICAgICAgIGFjbCA9IEFjbEJ1aWxkZXIoaGFuZGxlLCBwYl9mbGFnLCBiX2ZsYWcsIFJhd0J1aWxkZXIoZGF0YSkpCi0gICAgICAgIHNlbGYuZGV2aWNlLmhhbC5TZW5kQWNsKGNvbW1vbi5EYXRhKHBheWxvYWQ9Ynl0ZXMoYWNsLlNlcmlhbGl6ZSgpKSkpCi0KLSAgICBkZWYgc2VuZF9hY2xfZmlyc3Qoc2VsZiwgaGFuZGxlLCBkYXRhKToKLSAgICAgICAgc2VsZi5zZW5kX2FjbChoYW5kbGUsIFBhY2tldEJvdW5kYXJ5RmxhZy5GSVJTVF9OT05fQVVUT01BVElDQUxMWV9GTFVTSEFCTEUsIEJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsIGRhdGEpCi0KLSAgICBkZWYgcmVhZF9vd25fYWRkcmVzcyhzZWxmKToKLSAgICAgICAgc2VsZi5zZW5kX2hjaV9jb21tYW5kKGhjaV9wYWNrZXRzLlJlYWRCZEFkZHJCdWlsZGVyKCkpCi0gICAgICAgIHJlYWRfYmRfYWRkciA9IEhjaUNhcHR1cmVzLlJlYWRCZEFkZHJDb21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuaGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMocmVhZF9iZF9hZGRyKQotICAgICAgICByZXR1cm4gcmVhZF9iZF9hZGRyLmdldCgpLkdldEJkQWRkcigpCi0KLSAgICBkZWYgc2V0X3JhbmRvbV9sZV9hZGRyZXNzKHNlbGYsIGFkZHIpOgotICAgICAgICBzZWxmLnNlbmRfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuTGVTZXRSYW5kb21BZGRyZXNzQnVpbGRlcihhZGRyKSkKLSAgICAgICAgc2VsZi53YWl0X2Zvcl9jb21wbGV0ZShPcENvZGUuTEVfU0VUX1JBTkRPTV9BRERSRVNTKQotCi0gICAgZGVmIHNldF9zY2FuX3BhcmFtZXRlcnMoc2VsZik6Ci0gICAgICAgIHBoeV9zY2FuX3BhcmFtcyA9IGhjaV9wYWNrZXRzLlBoeVNjYW5QYXJhbWV0ZXJzKCkKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmxlX3NjYW5faW50ZXJ2YWwgPSA2NTUzCi0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5sZV9zY2FuX3dpbmRvdyA9IDY1NTMKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmxlX3NjYW5fdHlwZSA9IGhjaV9wYWNrZXRzLkxlU2NhblR5cGUuQUNUSVZFCi0KLSAgICAgICAgc2VsZi5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQnVpbGRlcihoY2lfcGFja2V0cy5Pd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlU2Nhbm5pbmdGaWx0ZXJQb2xpY3kuQUNDRVBUX0FMTCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BoeV9zY2FuX3BhcmFtc10pKQotICAgICAgICBzZWxmLndhaXRfZm9yX2NvbXBsZXRlKE9wQ29kZS5MRV9TRVRfRVhURU5ERURfU0NBTl9QQVJBTUVURVJTKQotCi0gICAgZGVmIHVubWFza19ldmVudChzZWxmLCAqZXZlbnRfY29kZXMpOgotICAgICAgICBmb3IgZXZlbnRfY29kZSBpbiBldmVudF9jb2RlczoKLSAgICAgICAgICAgIHNlbGYuZXZlbnRfbWFzayB8PSAxIDw8IChpbnQoZXZlbnRfY29kZSkgLSAxKQotICAgICAgICBzZWxmLnNlbmRfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuU2V0RXZlbnRNYXNrQnVpbGRlcihzZWxmLmV2ZW50X21hc2spKQotCi0gICAgZGVmIHN0YXJ0X3NjYW5uaW5nKHNlbGYpOgotICAgICAgICBzZWxmLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXIoaGNpX3BhY2tldHMuRW5hYmxlLkVOQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuRmlsdGVyRHVwbGljYXRlcy5ESVNBQkxFRCwgMCwgMCkpCi0gICAgICAgIHNlbGYud2FpdF9mb3JfY29tcGxldGUoT3BDb2RlLkxFX1NFVF9FWFRFTkRFRF9TQ0FOX0VOQUJMRSkKLQotICAgIGRlZiBzdG9wX3NjYW5uaW5nKHNlbGYpOgotICAgICAgICBzZWxmLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXIoaGNpX3BhY2tldHMuRW5hYmxlLkRJU0FCTEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkZpbHRlckR1cGxpY2F0ZXMuRElTQUJMRUQsIDAsIDApKQotICAgICAgICBzZWxmLndhaXRfZm9yX2NvbXBsZXRlKE9wQ29kZS5MRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpCi0KLSAgICBkZWYgcmVzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2VuZF9oY2lfY29tbWFuZChoY2lfcGFja2V0cy5SZXNldEJ1aWxkZXIoKSkKLSAgICAgICAgc2VsZi53YWl0X2Zvcl9jb21wbGV0ZShPcENvZGUuUkVTRVQpCi0KLSAgICBkZWYgZW5hYmxlX2lucXVpcnlfYW5kX3BhZ2Vfc2NhbihzZWxmKToKLSAgICAgICAgc2VsZi5zZW5kX2hjaV9jb21tYW5kKFdyaXRlU2NhbkVuYWJsZUJ1aWxkZXIoU2NhbkVuYWJsZS5JTlFVSVJZX0FORF9QQUdFX1NDQU4pKQotCi0gICAgZGVmIGluaXRpYXRlX2Nvbm5lY3Rpb24oc2VsZiwgcmVtb3RlX2FkZHIpOgotICAgICAgICBzZWxmLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5DcmVhdGVDb25uZWN0aW9uQnVpbGRlcigKLSAgICAgICAgICAgICAgICByZW1vdGVfYWRkciBpZiBpc2luc3RhbmNlKHJlbW90ZV9hZGRyLCBzdHIpIGVsc2UgcmVtb3RlX2FkZHIuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgICAgICAgICAgIDB4Y2MxOCwgICMgUGFja2V0IFR5cGUKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5QYWdlU2NhblJlcGV0aXRpb25Nb2RlLlIxLAotICAgICAgICAgICAgICAgIDB4MCwKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5DbG9ja09mZnNldFZhbGlkLklOVkFMSUQsCi0gICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuQ3JlYXRlQ29ubmVjdGlvblJvbGVTd2l0Y2guQUxMT1dfUk9MRV9TV0lUQ0gpKQotCi0gICAgZGVmIGFjY2VwdF9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICBjb25uZWN0aW9uX3JlcXVlc3QgPSBIY2lDYXB0dXJlcy5Db25uZWN0aW9uUmVxdWVzdENhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuaGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoY29ubmVjdGlvbl9yZXF1ZXN0KQotCi0gICAgICAgIHNlbGYuc2VuZF9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkFjY2VwdENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcihjb25uZWN0aW9uX3JlcXVlc3QuZ2V0KCkuR2V0QmRBZGRyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlLlJFTUFJTl9QRVJJUEhFUkFMKSkKLSAgICAgICAgcmV0dXJuIHNlbGYuY29tcGxldGVfY29ubmVjdGlvbigpCi0KLSAgICBkZWYgY29tcGxldGVfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgY29ubmVjdGlvbl9jb21wbGV0ZSA9IEhjaUNhcHR1cmVzLkNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuaGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoY29ubmVjdGlvbl9jb21wbGV0ZSkKLQotICAgICAgICBoYW5kbGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlLmdldCgpLkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICByZXR1cm4gUHlIYWxBY2xDb25uZWN0aW9uKGhhbmRsZSwgc2VsZi5hY2xfc3RyZWFtLCBzZWxmLmRldmljZSkKLQotICAgIGRlZiBpbml0aWF0ZV9sZV9jb25uZWN0aW9uKHNlbGYsIHJlbW90ZV9hZGRyKToKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zID0gaGNpX3BhY2tldHMuTGVDcmVhdGVDb25uUGh5U2NhblBhcmFtZXRlcnMoKQotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuc2Nhbl9pbnRlcnZhbCA9IDB4NjAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLnNjYW5fd2luZG93ID0gMHgzMAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuY29ubl9pbnRlcnZhbF9taW4gPSAweDE4Ci0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5jb25uX2ludGVydmFsX21heCA9IDB4MjgKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmNvbm5fbGF0ZW5jeSA9IDAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLnN1cGVydmlzaW9uX3RpbWVvdXQgPSAweDFmNAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMubWluX2NlX2xlbmd0aCA9IDAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLm1heF9jZV9sZW5ndGggPSAwCi0gICAgICAgIHNlbGYuc2VuZF9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlRXh0ZW5kZWRDcmVhdGVDb25uZWN0aW9uQnVpbGRlcigKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Jbml0aWF0b3JGaWx0ZXJQb2xpY3kuVVNFX1BFRVJfQUREUkVTUywgaGNpX3BhY2tldHMuT3duQWRkcmVzc1R5cGUuUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkFkZHJlc3NUeXBlLlJBTkRPTV9ERVZJQ0VfQUREUkVTUywgcmVtb3RlX2FkZHIsIDEsIFtwaHlfc2Nhbl9wYXJhbXNdKSkKLSAgICAgICAgc2VsZi53YWl0X2Zvcl9zdGF0dXMoT3BDb2RlLkxFX0VYVEVOREVEX0NSRUFURV9DT05ORUNUSU9OKQotCi0gICAgZGVmIGFkZF90b19jb25uZWN0X2xpc3Qoc2VsZiwgcmVtb3RlX2FkZHIpOgotICAgICAgICBzZWxmLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZUFkZERldmljZVRvQ29ubmVjdExpc3RCdWlsZGVyKGhjaV9wYWNrZXRzLkNvbm5lY3RMaXN0QWRkcmVzc1R5cGUuUkFORE9NLCByZW1vdGVfYWRkcikpCi0KLSAgICBkZWYgaW5pdGlhdGVfbGVfY29ubmVjdGlvbl9ieV9jb25uZWN0X2xpc3Qoc2VsZiwgcmVtb3RlX2FkZHIpOgotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMgPSBoY2lfcGFja2V0cy5MZUNyZWF0ZUNvbm5QaHlTY2FuUGFyYW1ldGVycygpCi0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5zY2FuX2ludGVydmFsID0gMHg2MAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuc2Nhbl93aW5kb3cgPSAweDMwCi0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5jb25uX2ludGVydmFsX21pbiA9IDB4MTgKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmNvbm5faW50ZXJ2YWxfbWF4ID0gMHgyOAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuY29ubl9sYXRlbmN5ID0gMAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuc3VwZXJ2aXNpb25fdGltZW91dCA9IDB4MWY0Ci0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5taW5fY2VfbGVuZ3RoID0gMAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMubWF4X2NlX2xlbmd0aCA9IDAKLSAgICAgICAgc2VsZi5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25CdWlsZGVyKAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkluaXRpYXRvckZpbHRlclBvbGljeS5VU0VfQ09OTkVDVF9MSVNULCBoY2lfcGFja2V0cy5Pd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuQWRkcmVzc1R5cGUuUkFORE9NX0RFVklDRV9BRERSRVNTLCByZW1vdGVfYWRkciwgMSwgW3BoeV9zY2FuX3BhcmFtc10pKQotCi0gICAgZGVmIGNvbXBsZXRlX2xlX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgIGNvbm5lY3Rpb25fY29tcGxldGUgPSBIY2lDYXB0dXJlcy5MZUNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuaGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoY29ubmVjdGlvbl9jb21wbGV0ZSkKLQotICAgICAgICBoYW5kbGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlLmdldCgpLkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICByZXR1cm4gUHlIYWxBY2xDb25uZWN0aW9uKGhhbmRsZSwgc2VsZi5hY2xfc3RyZWFtLCBzZWxmLmRldmljZSkKLQotICAgIGRlZiBjcmVhdGVfYWR2ZXJ0aXNlbWVudChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzPUxlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcy5BRFZfSU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5faW50ZXJ2YWw9NDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaW50ZXJ2YWw9NDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25fYWRkcmVzc190eXBlPU93bkFkZHJlc3NUeXBlLlJBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzX3R5cGU9UGVlckFkZHJlc3NUeXBlLlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzPScwMDowMDowMDowMDowMDowMCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9wb2xpY3k9QWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3Bvd2VyPTB4RjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZD0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uPUVuYWJsZS5ESVNBQkxFRCk6Ci0KLSAgICAgICAgc2VsZi5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc0J1aWxkZXIoaGFuZGxlLCBwcm9wZXJ0aWVzLCBtaW5faW50ZXJ2YWwsIG1heF9pbnRlcnZhbCwgY2hhbm5lbF9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25fYWRkcmVzc190eXBlLCBwZWVyX2FkZHJlc3NfdHlwZSwgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3BvbGljeSwgdHhfcG93ZXIsIHNpZCwgc2Nhbl9yZXF1ZXN0X25vdGlmaWNhdGlvbikpCi0gICAgICAgIHNlbGYud2FpdF9mb3JfY29tcGxldGUoT3BDb2RlLkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19QQVJBTUVURVJTKQotCi0gICAgICAgIHNlbGYuc2VuZF9oY2lfY29tbWFuZChMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQnVpbGRlcihoYW5kbGUsIG93bl9hZGRyZXNzKSkKLSAgICAgICAgc2VsZi53YWl0X2Zvcl9jb21wbGV0ZShPcENvZGUuTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1JBTkRPTV9BRERSRVNTKQotCi0gICAgICAgIHJldHVybiBQeUhhbEFkdmVydGlzZW1lbnQoaGFuZGxlLCBzZWxmKQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9weV9oY2kucHkgYi9nZC9jZXJ0L3B5X2hjaS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxMmRmNi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3B5X2hjaS5weQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBGaWx0ZXJpbmdFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgSUV2ZW50U3RyZWFtCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IENsb3NhYmxlCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IHNhZmVDbG9zZQotZnJvbSBjZXJ0LmNhcHR1cmVzIGltcG9ydCBIY2lDYXB0dXJlcwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGhjaV9mYWNhZGVfcGIyIGFzIGhjaV9mYWNhZGUKLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyIGFzIGNvbW1vbgotZnJvbSBjZXJ0Lm1hdGNoZXJzIGltcG9ydCBIY2lNYXRjaGVycwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBGaWx0ZXJEdXBsaWNhdGVzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0xlZ2FjeVBhcmFtZXRlcnNCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBQZWVyQWRkcmVzc1R5cGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0J1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgR2FwRGF0YQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBHYXBEYXRhVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBPcGVyYXRpb24KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgT3duQWRkcmVzc1R5cGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTY2FubmluZ0ZpbHRlclBvbGljeQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBFbmFibGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgRnJhZ21lbnRQcmVmZXJlbmNlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZUJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgRW5hYmxlZFNldAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBPcENvZGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQWNsQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBSYXdCdWlsZGVyCi0KLQotY2xhc3MgUHlIY2lBY2xDb25uZWN0aW9uKElFdmVudFN0cmVhbSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlLCBhY2xfc3RyZWFtLCBkZXZpY2UpOgotICAgICAgICBzZWxmLmhhbmRsZSA9IGludChoYW5kbGUpCi0gICAgICAgIHNlbGYuZGV2aWNlID0gZGV2aWNlCi0gICAgICAgICMgdG9kbywgaGFuZGxlIHdlIGdvdCBpcyAwLCBzbyBkb2Vzbid0IG1hdGNoIC0gZml4IGJlZm9yZSBlbmFibGluZyBmaWx0ZXJpbmcKLSAgICAgICAgc2VsZi5vdXJfYWNsX3N0cmVhbSA9IEZpbHRlcmluZ0V2ZW50U3RyZWFtKGFjbF9zdHJlYW0sIE5vbmUpCi0KLSAgICBkZWYgc2VuZChzZWxmLCBwYl9mbGFnLCBiX2ZsYWcsIGRhdGEpOgotICAgICAgICBhY2wgPSBBY2xCdWlsZGVyKHNlbGYuaGFuZGxlLCBwYl9mbGFnLCBiX2ZsYWcsIFJhd0J1aWxkZXIoZGF0YSkpCi0gICAgICAgIHNlbGYuZGV2aWNlLmhjaS5TZW5kQWNsKGNvbW1vbi5EYXRhKHBheWxvYWQ9Ynl0ZXMoYWNsLlNlcmlhbGl6ZSgpKSkpCi0KLSAgICBkZWYgc2VuZF9maXJzdChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5zZW5kKGhjaV9wYWNrZXRzLlBhY2tldEJvdW5kYXJ5RmxhZy5GSVJTVF9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRSwKLSAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsIGJ5dGVzKGRhdGEpKQotCi0gICAgZGVmIHNlbmRfY29udGludWluZyhzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5zZW5kKGhjaV9wYWNrZXRzLlBhY2tldEJvdW5kYXJ5RmxhZy5DT05USU5VSU5HX0ZSQUdNRU5ULCBoY2lfcGFja2V0cy5Ccm9hZGNhc3RGbGFnLlBPSU5UX1RPX1BPSU5ULAotICAgICAgICAgICAgICAgICAgYnl0ZXMoZGF0YSkpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5vdXJfYWNsX3N0cmVhbS5nZXRfZXZlbnRfcXVldWUoKQotCi0KLWNsYXNzIFB5SGNpQWR2ZXJ0aXNlbWVudChvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZSwgcHlfaGNpKToKLSAgICAgICAgc2VsZi5oYW5kbGUgPSBoYW5kbGUKLSAgICAgICAgc2VsZi5weV9oY2kgPSBweV9oY2kKLQotICAgIGRlZiBzZXRfZGF0YShzZWxmLCBjb21wbGV0ZV9uYW1lKToKLSAgICAgICAgZGF0YSA9IEdhcERhdGEoKQotICAgICAgICBkYXRhLmRhdGFfdHlwZSA9IEdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZGF0YS5kYXRhID0gbGlzdChieXRlcyhjb21wbGV0ZV9uYW1lKSkKLSAgICAgICAgc2VsZi5weV9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YUJ1aWxkZXIoc2VsZi5oYW5kbGUsIE9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRQcmVmZXJlbmNlLkNPTlRST0xMRVJfU0hPVUxEX05PVCwgW2RhdGFdKSkKLQotICAgIGRlZiBzZXRfc2Nhbl9yZXNwb25zZShzZWxmLCBzaG9ydGVuZWRfbmFtZSk6Ci0gICAgICAgIGRhdGEgPSBHYXBEYXRhKCkKLSAgICAgICAgZGF0YS5kYXRhX3R5cGUgPSBHYXBEYXRhVHlwZS5TSE9SVEVORURfTE9DQUxfTkFNRQotICAgICAgICBkYXRhLmRhdGEgPSBsaXN0KGJ5dGVzKHNob3J0ZW5lZF9uYW1lKSkKLSAgICAgICAgc2VsZi5weV9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcihzZWxmLmhhbmRsZSwgT3BlcmF0aW9uLkNPTVBMRVRFX0FEVkVSVElTRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtkYXRhXSkpCi0KLSAgICBkZWYgc3RhcnQoc2VsZik6Ci0gICAgICAgIGVuYWJsZWRfc2V0ID0gRW5hYmxlZFNldCgpCi0gICAgICAgIGVuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZSA9IHNlbGYuaGFuZGxlCi0gICAgICAgIGVuYWJsZWRfc2V0LmR1cmF0aW9uID0gMAotICAgICAgICBlbmFibGVkX3NldC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzID0gMAotICAgICAgICBzZWxmLnB5X2hjaS5zZW5kX2NvbW1hbmQoTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcihFbmFibGUuRU5BQkxFRCwgW2VuYWJsZWRfc2V0XSkpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5weV9oY2kuZ2V0X2V2ZW50X3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIEhjaU1hdGNoZXJzLkNvbW1hbmRDb21wbGV0ZShPcENvZGUuTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSkpCi0KLQotY2xhc3MgUHlIY2koQ2xvc2FibGUpOgotCi0gICAgZXZlbnRfc3RyZWFtID0gTm9uZQotICAgIGxlX2V2ZW50X3N0cmVhbSA9IE5vbmUKLSAgICBhY2xfc3RyZWFtID0gTm9uZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldmljZSwgYWNsX3N0cmVhbWluZz1GYWxzZSk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgSWYgeW91IGFyZSBwbGFubmluZyBvbiBwZXJzb25hbGx5IHVzaW5nIHRoZSBBQ0wgZGF0YSBzdHJlYW0KLSAgICAgICAgICAgIGNvbWluZyBmcm9tIEhDSSwgc3BlY2lmeSBhY2xfc3RyZWFtaW5nPVRydWUuIFlvdSBwcm9iYWJseSBvbmx5Ci0gICAgICAgICAgICB3YW50IHRoaXMgaWYgeW91IGFyZSB0ZXN0aW5nIEhDSSBpdHNlbGYuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmRldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLmV2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKHNlbGYuZGV2aWNlLmhjaS5TdHJlYW1FdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0gICAgICAgIHNlbGYubGVfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5kZXZpY2UuaGNpLlN0cmVhbUxlU3ViZXZlbnRzKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotICAgICAgICBpZiBhY2xfc3RyZWFtaW5nOgotICAgICAgICAgICAgc2VsZi5yZWdpc3Rlcl9mb3JfZXZlbnRzKGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5ST0xFX0NIQU5HRSwgaGNpX3BhY2tldHMuRXZlbnRDb2RlLkNPTk5FQ1RJT05fUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuQ09OTkVDVElPTl9DT01QTEVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuQ09OTkVDVElPTl9QQUNLRVRfVFlQRV9DSEFOR0VEKQotICAgICAgICAgICAgc2VsZi5hY2xfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5kZXZpY2UuaGNpLlN0cmVhbUFjbChlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuZXZlbnRfc3RyZWFtKQotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5sZV9ldmVudF9zdHJlYW0pCi0gICAgICAgIHNhZmVDbG9zZShzZWxmLmFjbF9zdHJlYW0pCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3N0cmVhbShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZXZlbnRfc3RyZWFtCi0KLSAgICBkZWYgZ2V0X2xlX2V2ZW50X3N0cmVhbShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYubGVfZXZlbnRfc3RyZWFtCi0KLSAgICBkZWYgZ2V0X3Jhd19hY2xfc3RyZWFtKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmFjbF9zdHJlYW0gaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiUGxlYXNlIGNvbnN0cnVjdCAnJXMnIHdpdGggYWNsX3N0cmVhbWluZz1UcnVlISIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKLSAgICAgICAgcmV0dXJuIHNlbGYuYWNsX3N0cmVhbQotCi0gICAgZGVmIHJlZ2lzdGVyX2Zvcl9ldmVudHMoc2VsZiwgKmV2ZW50X2NvZGVzKToKLSAgICAgICAgZm9yIGV2ZW50X2NvZGUgaW4gZXZlbnRfY29kZXM6Ci0gICAgICAgICAgICBzZWxmLmRldmljZS5oY2kuUmVxdWVzdEV2ZW50KGhjaV9mYWNhZGUuRXZlbnRSZXF1ZXN0KGNvZGU9aW50KGV2ZW50X2NvZGUpKSkKLQotICAgIGRlZiByZWdpc3Rlcl9mb3JfbGVfZXZlbnRzKHNlbGYsICpldmVudF9jb2Rlcyk6Ci0gICAgICAgIGZvciBldmVudF9jb2RlIGluIGV2ZW50X2NvZGVzOgotICAgICAgICAgICAgc2VsZi5kZXZpY2UuaGNpLlJlcXVlc3RMZVN1YmV2ZW50KGhjaV9mYWNhZGUuRXZlbnRSZXF1ZXN0KGNvZGU9aW50KGV2ZW50X2NvZGUpKSkKLQotICAgIGRlZiBzZW5kX2NvbW1hbmQoc2VsZiwgY29tbWFuZCk6Ci0gICAgICAgIHNlbGYuZGV2aWNlLmhjaS5TZW5kQ29tbWFuZChjb21tb24uRGF0YShwYXlsb2FkPWJ5dGVzKGNvbW1hbmQuU2VyaWFsaXplKCkpKSkKLQotICAgIGRlZiBlbmFibGVfaW5xdWlyeV9hbmRfcGFnZV9zY2FuKHNlbGYpOgotICAgICAgICBzZWxmLnNlbmRfY29tbWFuZChoY2lfcGFja2V0cy5Xcml0ZVNjYW5FbmFibGVCdWlsZGVyKGhjaV9wYWNrZXRzLlNjYW5FbmFibGUuSU5RVUlSWV9BTkRfUEFHRV9TQ0FOKSkKLQotICAgIGRlZiByZWFkX293bl9hZGRyZXNzKHNlbGYpOgotICAgICAgICBzZWxmLnNlbmRfY29tbWFuZChoY2lfcGFja2V0cy5SZWFkQmRBZGRyQnVpbGRlcigpKQotICAgICAgICByZWFkX2JkX2FkZHIgPSBIY2lDYXB0dXJlcy5SZWFkQmRBZGRyQ29tcGxldGVDYXB0dXJlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmV2ZW50X3N0cmVhbSkuZW1pdHMocmVhZF9iZF9hZGRyKQotICAgICAgICByZXR1cm4gcmVhZF9iZF9hZGRyLmdldCgpLkdldEJkQWRkcigpCi0KLSAgICBkZWYgaW5pdGlhdGVfY29ubmVjdGlvbihzZWxmLCByZW1vdGVfYWRkcik6Ci0gICAgICAgIHNlbGYuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuQ3JlYXRlQ29ubmVjdGlvbkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgcmVtb3RlX2FkZHIgaWYgaXNpbnN0YW5jZShyZW1vdGVfYWRkciwgc3RyKSBlbHNlIHJlbW90ZV9hZGRyLmRlY29kZSgndXRmLTgnKSwKLSAgICAgICAgICAgICAgICAweGNjMTgsICAjIFBhY2tldCBUeXBlCi0gICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuUGFnZVNjYW5SZXBldGl0aW9uTW9kZS5SMSwKLSAgICAgICAgICAgICAgICAweDAsCi0gICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuQ2xvY2tPZmZzZXRWYWxpZC5JTlZBTElELAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkNyZWF0ZUNvbm5lY3Rpb25Sb2xlU3dpdGNoLkFMTE9XX1JPTEVfU1dJVENIKSkKLQotICAgIGRlZiBhY2NlcHRfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgY29ubmVjdGlvbl9yZXF1ZXN0ID0gSGNpQ2FwdHVyZXMuQ29ubmVjdGlvblJlcXVlc3RDYXB0dXJlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmV2ZW50X3N0cmVhbSkuZW1pdHMoY29ubmVjdGlvbl9yZXF1ZXN0KQotCi0gICAgICAgIHNlbGYuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RCdWlsZGVyKGNvbm5lY3Rpb25fcmVxdWVzdC5nZXQoKS5HZXRCZEFkZHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5BY2NlcHRDb25uZWN0aW9uUmVxdWVzdFJvbGUuUkVNQUlOX1BFUklQSEVSQUwpKQotICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0ZV9jb25uZWN0aW9uKCkKLQotICAgIGRlZiBjb21wbGV0ZV9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICBjb25uZWN0aW9uX2NvbXBsZXRlID0gSGNpQ2FwdHVyZXMuQ29ubmVjdGlvbkNvbXBsZXRlQ2FwdHVyZSgpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5ldmVudF9zdHJlYW0pLmVtaXRzKGNvbm5lY3Rpb25fY29tcGxldGUpCi0KLSAgICAgICAgaGFuZGxlID0gY29ubmVjdGlvbl9jb21wbGV0ZS5nZXQoKS5HZXRDb25uZWN0aW9uSGFuZGxlKCkKLSAgICAgICAgaWYgc2VsZi5hY2xfc3RyZWFtIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlBsZWFzZSBjb25zdHJ1Y3QgJyVzJyB3aXRoIGFjbF9zdHJlYW1pbmc9VHJ1ZSEiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCi0gICAgICAgIHJldHVybiBQeUhjaUFjbENvbm5lY3Rpb24oaGFuZGxlLCBzZWxmLmFjbF9zdHJlYW0sIHNlbGYuZGV2aWNlKQotCi0gICAgZGVmIGNyZWF0ZV9hZHZlcnRpc2VtZW50KHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM9TGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzLkFEVl9JTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9pbnRlcnZhbD00MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pbnRlcnZhbD00NTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwPTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9T3duQWRkcmVzc1R5cGUuUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3NfdHlwZT1QZWVyQWRkcmVzc1R5cGUuUFVCTElDX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3M9JzAwOjAwOjAwOjAwOjAwOjAwJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1BZHZlcnRpc2luZ0ZpbHRlclBvbGljeS5BTExfREVWSUNFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfcG93ZXI9MHhGOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkPTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fcmVxdWVzdF9ub3RpZmljYXRpb249RW5hYmxlLkRJU0FCTEVEKToKLQotICAgICAgICBzZWxmLnNlbmRfY29tbWFuZCgKLSAgICAgICAgICAgIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0xlZ2FjeVBhcmFtZXRlcnNCdWlsZGVyKGhhbmRsZSwgcHJvcGVydGllcywgbWluX2ludGVydmFsLCBtYXhfaW50ZXJ2YWwsIGNoYW5uZWxfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZSwgcGVlcl9hZGRyZXNzX3R5cGUsIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9wb2xpY3ksIHR4X3Bvd2VyLCBzaWQsIHNjYW5fcmVxdWVzdF9ub3RpZmljYXRpb24pKQotCi0gICAgICAgIHNlbGYuc2VuZF9jb21tYW5kKExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3NCdWlsZGVyKGhhbmRsZSwgb3duX2FkZHJlc3MpKQotICAgICAgICByZXR1cm4gUHlIY2lBZHZlcnRpc2VtZW50KGhhbmRsZSwgc2VsZikKZGlmZiAtLWdpdCBhL2dkL2NlcnQvcHlfbDJjYXAucHkgYi9nZC9jZXJ0L3B5X2wyY2FwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFhMjMwLi4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvcHlfbDJjYXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi0KLWZyb20gbDJjYXAuY2xhc3NpYyBpbXBvcnQgZmFjYWRlX3BiMiBhcyBsMmNhcF9mYWNhZGVfcGIyCi1mcm9tIGwyY2FwLmNsYXNzaWMuZmFjYWRlX3BiMiBpbXBvcnQgTGlua1NlY3VyaXR5SW50ZXJmYWNlQ2FsbGJhY2tFdmVudFR5cGUKLWZyb20gbDJjYXAubGUgaW1wb3J0IGZhY2FkZV9wYjIgYXMgbDJjYXBfbGVfZmFjYWRlX3BiMgotZnJvbSBsMmNhcC5sZS5mYWNhZGVfcGIyIGltcG9ydCBTZWN1cml0eUxldmVsCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGwyY2FwX3BhY2tldHMKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEZpbHRlcmluZ0V2ZW50U3RyZWFtCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBFdmVudFN0cmVhbSwgSUV2ZW50U3RyZWFtCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IENsb3NhYmxlLCBzYWZlQ2xvc2UKLWZyb20gY2VydC5weV9oY2kgaW1wb3J0IFB5SGNpCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEhjaU1hdGNoZXJzCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEwyY2FwTWF0Y2hlcnMKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBmYWNhZGUgaW1wb3J0IGNvbW1vbl9wYjIgYXMgY29tbW9uCi0KLQotY2xhc3MgUHlMMmNhcENoYW5uZWwoSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UsIHBzbSwgbDJjYXBfc3RyZWFtKToKLSAgICAgICAgc2VsZi5fZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYuX3BzbSA9IHBzbQotICAgICAgICBzZWxmLl9sZV9sMmNhcF9zdHJlYW0gPSBsMmNhcF9zdHJlYW0KLSAgICAgICAgc2VsZi5fb3VyX2xlX2wyY2FwX3ZpZXcgPSBGaWx0ZXJpbmdFdmVudFN0cmVhbShzZWxmLl9sZV9sMmNhcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkV2l0aE1hdGNoaW5nUHNtKHNlbGYuX3BzbSkpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fb3VyX2xlX2wyY2FwX3ZpZXcuZ2V0X2V2ZW50X3F1ZXVlKCkKLQotICAgIGRlZiBzZW5kKHNlbGYsIHBheWxvYWQpOgotICAgICAgICBzZWxmLl9kZXZpY2UubDJjYXAuU2VuZER5bmFtaWNDaGFubmVsUGFja2V0KAotICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209c2VsZi5fcHNtLCBwYXlsb2FkPXBheWxvYWQpKQotCi0gICAgZGVmIGNsb3NlX2NoYW5uZWwoc2VsZik6Ci0gICAgICAgIHNlbGYuX2RldmljZS5sMmNhcC5DbG9zZUNoYW5uZWwobDJjYXBfZmFjYWRlX3BiMi5DbG9zZUNoYW5uZWxSZXF1ZXN0KHBzbT1zZWxmLl9wc20pKQotCi0gICAgZGVmIHNldF90cmFmZmljX3BhdXNlZChzZWxmLCBwYXVzZWQpOgotICAgICAgICBzZWxmLl9kZXZpY2UubDJjYXAuU2V0VHJhZmZpY1BhdXNlZChsMmNhcF9mYWNhZGVfcGIyLlNldFRyYWZmaWNQYXVzZWRSZXF1ZXN0KHBzbT1zZWxmLl9wc20sIHBhdXNlZD1wYXVzZWQpKQotCi0KLWNsYXNzIF9DbGFzc2ljQ29ubmVjdGlvblJlc3BvbnNlRnV0dXJlV3JhcHBlcihvYmplY3QpOgotICAgICIiIgotICAgIFRoZSBmdXR1cmUgb2JqZWN0IHJldHVybmVkIHdoZW4gd2Ugc2VuZCBhIGNvbm5lY3Rpb24gcmVxdWVzdCBmcm9tIERVVC4gQ2FuIGJlIHVzZWQgdG8gZ2V0IGNvbm5lY3Rpb24gc3RhdHVzIGFuZAotICAgIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBQeUwyY2FwRHluYW1pY0NoYW5uZWwgb2JqZWN0IGxhdGVyCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JwY19yZXNwb25zZV9mdXR1cmUsIGRldmljZSwgcHNtLCBsMmNhcF9zdHJlYW0pOgotICAgICAgICBzZWxmLl9ncnBjX3Jlc3BvbnNlX2Z1dHVyZSA9IGdycGNfcmVzcG9uc2VfZnV0dXJlCi0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9wc20gPSBwc20KLSAgICAgICAgc2VsZi5fbDJjYXBfc3RyZWFtID0gbDJjYXBfc3RyZWFtCi0KLSAgICBkZWYgZ2V0X2NoYW5uZWwoc2VsZik6Ci0gICAgICAgIHJldHVybiBQeUwyY2FwQ2hhbm5lbChzZWxmLl9kZXZpY2UsIHNlbGYuX3BzbSwgc2VsZi5fbDJjYXBfc3RyZWFtKQotCi0KLWNsYXNzIFB5TDJjYXAoQ2xvc2FibGUpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldmljZSwgY2VydF9hZGRyZXNzLCBoYXNfc2VjdXJpdHk9RmFsc2UpOgotICAgICAgICBzZWxmLl9kZXZpY2UgPSBkZXZpY2UKLSAgICAgICAgc2VsZi5fY2VydF9hZGRyZXNzID0gY2VydF9hZGRyZXNzCi0gICAgICAgIHNlbGYuX2hjaSA9IFB5SGNpKGRldmljZSkKLSAgICAgICAgc2VsZi5fbDJjYXBfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5fZGV2aWNlLmwyY2FwLkZldGNoTDJjYXBEYXRhKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotICAgICAgICBzZWxmLl9zZWN1cml0eV9jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKAotICAgICAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwLkZldGNoU2VjdXJpdHlDb25uZWN0aW9uRXZlbnRzKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotICAgICAgICBpZiBoYXNfc2VjdXJpdHkgPT0gRmFsc2U6Ci0gICAgICAgICAgICBzZWxmLl9oY2kucmVnaXN0ZXJfZm9yX2V2ZW50cyhoY2lfcGFja2V0cy5FdmVudENvZGUuTElOS19LRVlfUkVRVUVTVCkKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2wyY2FwX3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuX3NlY3VyaXR5X2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtKQotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5faGNpKQotCi0gICAgZGVmIHJlZ2lzdGVyX2R5bmFtaWNfY2hhbm5lbChzZWxmLCBwc209MHgzMywgbW9kZT1sMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkJBU0lDKToKLSAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1tb2RlKSkKLSAgICAgICAgcmV0dXJuIFB5TDJjYXBDaGFubmVsKHNlbGYuX2RldmljZSwgcHNtLCBzZWxmLl9sMmNhcF9zdHJlYW0pCi0KLSAgICBkZWYgY29ubmVjdF9keW5hbWljX2NoYW5uZWxfdG9fY2VydChzZWxmLCBwc209MHgzMywgbW9kZT1sMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkJBU0lDKToKLSAgICAgICAgIiIiCi0gICAgICAgIFNlbmQgb3BlbiBEeW5hbWljIGNoYW5uZWwgcmVxdWVzdCB0byBDRVJULgotICAgICAgICBHZXQgYSBmdXR1cmUgZm9yIGNvbm5lY3Rpb24gcmVzdWx0LCB0byBiZSB1c2VkIGFmdGVyIENFUlQgYWNjZXB0cyByZXF1ZXN0Ci0gICAgICAgICIiIgotICAgICAgICBzZWxmLnJlZ2lzdGVyX2R5bmFtaWNfY2hhbm5lbChwc20sIG1vZGUpCi0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuX2RldmljZS5sMmNhcC5PcGVuQ2hhbm5lbC5mdXR1cmUoCi0gICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLk9wZW5DaGFubmVsUmVxdWVzdChwc209cHNtLCByZW1vdGU9c2VsZi5fY2VydF9hZGRyZXNzLCBtb2RlPW1vZGUpKQotCi0gICAgICAgIHJldHVybiBfQ2xhc3NpY0Nvbm5lY3Rpb25SZXNwb25zZUZ1dHVyZVdyYXBwZXIocmVzcG9uc2VfZnV0dXJlLCBzZWxmLl9kZXZpY2UsIHBzbSwgc2VsZi5fbDJjYXBfc3RyZWFtKQotCi0gICAgZGVmIGdldF9jaGFubmVsX3F1ZXVlX2J1ZmZlcl9zaXplKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fZGV2aWNlLmwyY2FwLkdldENoYW5uZWxRdWV1ZURlcHRoKGVtcHR5X3Byb3RvLkVtcHR5KCkpLnNpemUKLQotICAgIGRlZiBpbml0aWF0ZV9jb25uZWN0aW9uX2Zvcl9zZWN1cml0eShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEVzdGFibGlzaCBhbiBBQ0wgZm9yIHRoZSBzcGVjaWZpYyBwdXJwb3NlIG9mIHBhaXJpbmcgZGV2aWNlcwotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwLkluaXRpYXRlQ29ubmVjdGlvbkZvclNlY3VyaXR5KHNlbGYuX2NlcnRfYWRkcmVzcykKLQotICAgIGRlZiBnZXRfc2VjdXJpdHlfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBTdHJlYW0gb2YgTGluayByZWxhdGVkIGV2ZW50cy4gIEV2ZW50cyBhcmUgcmV0dXJuZWQgd2l0aCBhbiBhZGRyZXNzLgotICAgICAgICBFdmVudHMgbWFwIHRvIHRoZSBMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lciBjYWxsYmFja3MKLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmLl9zZWN1cml0eV9jb25uZWN0aW9uX2V2ZW50X3N0cmVhbQotCi0gICAgZGVmIHNlY3VyaXR5X2xpbmtfaG9sZChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEhvbGRzIG9wZW4gdGhlIEFDTCBpbmRlZmluaXRlbHkgYWxsb3dpbmcgZm9yIHRoZSBzZWN1cml0eSBoYW5kc2hha2UKLSAgICAgICAgdG8gdGFrZSBwbGFjZQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwLlNlY3VyaXR5TGlua0hvbGQoc2VsZi5fY2VydF9hZGRyZXNzKQotCi0gICAgZGVmIHNlY3VyaXR5X2xpbmtfZW5zdXJlX2F1dGhlbnRpY2F0ZWQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBUcmlnZ2VycyBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGJ5IHNlbmRpbmcgSENJIGV2ZW50IEFVVEhFTlRJQ0FUSU9OX1JFUVVFU1RFRAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwLlNlY3VyaXR5TGlua0Vuc3VyZUF1dGhlbnRpY2F0ZWQoc2VsZi5fY2VydF9hZGRyZXNzKQotCi0gICAgZGVmIHNlY3VyaXR5X2xpbmtfcmVsZWFzZShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFJlbGVhc2VzIGEgSGVsZCBvcGVuIEFDTCBhbGxvd2luZyBmb3IgdGhlIEFDTCB0byB0aW1lIG91dCBhZnRlciB0aGUgZGVmYXVsdCB0aW1lCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9kZXZpY2UubDJjYXAuU2VjdXJpdHlMaW5rUmVsZWFzZShzZWxmLl9jZXJ0X2FkZHJlc3MpCi0KLSAgICBkZWYgc2VjdXJpdHlfbGlua19kaXNjb25uZWN0KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgSW1tZWRpYXRlbHkgcmVsZWFzZSBhbmQgZGlzY29ubmVjdCBBQ0wKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX2RldmljZS5sMmNhcC5TZWN1cml0eUxpbmtEaXNjb25uZWN0KHNlbGYuX2NlcnRfYWRkcmVzcykKLQotICAgIGRlZiB2ZXJpZnlfc2VjdXJpdHlfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHdlIGdldCBhIGNvbm5lY3Rpb24gYW5kIGEgbGluayBrZXkgcmVxdWVzdAotICAgICAgICAiIiIKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmdldF9zZWN1cml0eV9jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIGxhbWJkYSBldmVudDogZXZlbnQuZXZlbnRfdHlwZSA9PSBMaW5rU2VjdXJpdHlJbnRlcmZhY2VDYWxsYmFja0V2ZW50VHlwZS5PTl9DT05ORUNURUQpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpLmdldF9ldmVudF9zdHJlYW0oKSkuZW1pdHMoSGNpTWF0Y2hlcnMuTGlua0tleVJlcXVlc3QoKSkKLQotCi1jbGFzcyBQeUxlTDJjYXBGaXhlZENoYW5uZWwoSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UsIGNpZCwgbDJjYXBfc3RyZWFtKToKLSAgICAgICAgc2VsZi5fZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYuX2NpZCA9IGNpZAotICAgICAgICBzZWxmLl9sZV9sMmNhcF9zdHJlYW0gPSBsMmNhcF9zdHJlYW0KLSAgICAgICAgc2VsZi5fb3VyX2xlX2wyY2FwX3ZpZXcgPSBGaWx0ZXJpbmdFdmVudFN0cmVhbShzZWxmLl9sZV9sMmNhcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkV2l0aE1hdGNoaW5nQ2lkKHNlbGYuX2NpZCkpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fb3VyX2xlX2wyY2FwX3ZpZXcuZ2V0X2V2ZW50X3F1ZXVlKCkKLQotICAgIGRlZiBzZW5kKHNlbGYsIHBheWxvYWQpOgotICAgICAgICBzZWxmLl9kZXZpY2UubDJjYXBfbGUuU2VuZEZpeGVkQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgIGwyY2FwX2xlX2ZhY2FkZV9wYjIuRml4ZWRDaGFubmVsUGFja2V0KGNpZD1zZWxmLl9jaWQsIHBheWxvYWQ9cGF5bG9hZCkpCi0KLSAgICBkZWYgY2xvc2VfY2hhbm5lbChzZWxmKToKLSAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwX2xlLlNldEZpeGVkQ2hhbm5lbCgKLSAgICAgICAgICAgIGwyY2FwX2xlX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRml4ZWRDaGFubmVsUmVxdWVzdChjaWQ9c2VsZi5fY2lkLCBlbmFibGU9RmFsc2UpKQotCi0KLWNsYXNzIFB5TGVMMmNhcER5bmFtaWNDaGFubmVsKElFdmVudFN0cmVhbSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGV2aWNlLCBjZXJ0X2FkZHJlc3MsIHBzbSwgbDJjYXBfc3RyZWFtKToKLSAgICAgICAgc2VsZi5fZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYuX2NlcnRfYWRkcmVzcyA9IGNlcnRfYWRkcmVzcwotICAgICAgICBzZWxmLl9wc20gPSBwc20KLSAgICAgICAgc2VsZi5fbGVfbDJjYXBfc3RyZWFtID0gbDJjYXBfc3RyZWFtCi0gICAgICAgIHNlbGYuX291cl9sZV9sMmNhcF92aWV3ID0gRmlsdGVyaW5nRXZlbnRTdHJlYW0oc2VsZi5fbGVfbDJjYXBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFdpdGhNYXRjaGluZ1BzbShzZWxmLl9wc20pKQotCi0gICAgZGVmIGdldF9ldmVudF9xdWV1ZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX291cl9sZV9sMmNhcF92aWV3LmdldF9ldmVudF9xdWV1ZSgpCi0KLSAgICBkZWYgc2VuZChzZWxmLCBwYXlsb2FkKToKLSAgICAgICAgc2VsZi5fZGV2aWNlLmwyY2FwX2xlLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgIGwyY2FwX2xlX2ZhY2FkZV9wYjIuRHluYW1pY0NoYW5uZWxQYWNrZXQocHNtPXNlbGYuX3BzbSwgcGF5bG9hZD1wYXlsb2FkKSkKLQotICAgIGRlZiBjbG9zZV9jaGFubmVsKHNlbGYpOgotICAgICAgICBzZWxmLl9kZXZpY2UubDJjYXBfbGUuQ2xvc2VEeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgIGwyY2FwX2xlX2ZhY2FkZV9wYjIuQ2xvc2VEeW5hbWljQ2hhbm5lbFJlcXVlc3QocmVtb3RlPXNlbGYuX2NlcnRfYWRkcmVzcywgcHNtPXNlbGYuX3BzbSkpCi0KLQotY2xhc3MgX0NyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlRnV0dXJlV3JhcHBlcihvYmplY3QpOgotICAgICIiIgotICAgIFRoZSBmdXR1cmUgb2JqZWN0IHJldHVybmVkIHdoZW4gd2Ugc2VuZCBhIGNvbm5lY3Rpb24gcmVxdWVzdCBmcm9tIERVVC4gQ2FuIGJlIHVzZWQgdG8gZ2V0IGNvbm5lY3Rpb24gc3RhdHVzIGFuZAotICAgIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBQeUxlTDJjYXBEeW5hbWljQ2hhbm5lbCBvYmplY3QgbGF0ZXIKLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncnBjX3Jlc3BvbnNlX2Z1dHVyZSwgZGV2aWNlLCBjZXJ0X2FkZHJlc3MsIHBzbSwgbGVfbDJjYXBfc3RyZWFtKToKLSAgICAgICAgc2VsZi5fZ3JwY19yZXNwb25zZV9mdXR1cmUgPSBncnBjX3Jlc3BvbnNlX2Z1dHVyZQotICAgICAgICBzZWxmLl9kZXZpY2UgPSBkZXZpY2UKLSAgICAgICAgc2VsZi5fY2VydF9hZGRyZXNzID0gY2VydF9hZGRyZXNzCi0gICAgICAgIHNlbGYuX3BzbSA9IHBzbQotICAgICAgICBzZWxmLl9sZV9sMmNhcF9zdHJlYW0gPSBsZV9sMmNhcF9zdHJlYW0KLQotICAgIGRlZiBnZXRfc3RhdHVzKHNlbGYpOgotICAgICAgICByZXR1cm4gbDJjYXBfcGFja2V0cy5MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0KHNlbGYuX2dycGNfcmVzcG9uc2VfZnV0dXJlLnJlc3VsdCgpLnN0YXR1cykKLQotICAgIGRlZiBnZXRfY2hhbm5lbChzZWxmKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmdldF9zdGF0dXMoKSkuaXNFcXVhbFRvKGwyY2FwX3BhY2tldHMuTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTKQotICAgICAgICByZXR1cm4gUHlMZUwyY2FwRHluYW1pY0NoYW5uZWwoc2VsZi5fZGV2aWNlLCBzZWxmLl9jZXJ0X2FkZHJlc3MsIHNlbGYuX3BzbSwgc2VsZi5fbGVfbDJjYXBfc3RyZWFtKQotCi0KLWNsYXNzIFB5TGVMMmNhcChDbG9zYWJsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGV2aWNlKToKLSAgICAgICAgc2VsZi5fZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYuX2xlX2wyY2FwX3N0cmVhbSA9IEV2ZW50U3RyZWFtKHNlbGYuX2RldmljZS5sMmNhcF9sZS5GZXRjaEwyY2FwRGF0YShlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2xlX2wyY2FwX3N0cmVhbSkKLQotICAgIGRlZiBlbmFibGVfZml4ZWRfY2hhbm5lbChzZWxmLCBjaWQ9NCk6Ci0gICAgICAgIHNlbGYuX2RldmljZS5sMmNhcF9sZS5TZXRGaXhlZENoYW5uZWwobDJjYXBfbGVfZmFjYWRlX3BiMi5TZXRFbmFibGVGaXhlZENoYW5uZWxSZXF1ZXN0KGNpZD1jaWQsIGVuYWJsZT1UcnVlKSkKLQotICAgIGRlZiBnZXRfZml4ZWRfY2hhbm5lbChzZWxmLCBjaWQ9NCk6Ci0gICAgICAgIHJldHVybiBQeUxlTDJjYXBGaXhlZENoYW5uZWwoc2VsZi5fZGV2aWNlLCBjaWQsIHNlbGYuX2xlX2wyY2FwX3N0cmVhbSkKLQotICAgIGRlZiByZWdpc3Rlcl9jb2Moc2VsZiwgY2VydF9hZGRyZXNzLCBwc209MHgzMywgc2VjdXJpdHlfbGV2ZWw9U2VjdXJpdHlMZXZlbC5OT19TRUNVUklUWSk6Ci0gICAgICAgIHNlbGYuX2RldmljZS5sMmNhcF9sZS5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgIGwyY2FwX2xlX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIGVuYWJsZT1UcnVlLCBzZWN1cml0eV9sZXZlbD1zZWN1cml0eV9sZXZlbCkpCi0gICAgICAgIHJldHVybiBQeUxlTDJjYXBEeW5hbWljQ2hhbm5lbChzZWxmLl9kZXZpY2UsIGNlcnRfYWRkcmVzcywgcHNtLCBzZWxmLl9sZV9sMmNhcF9zdHJlYW0pCi0KLSAgICBkZWYgY29ubmVjdF9jb2NfdG9fY2VydChzZWxmLCBjZXJ0X2FkZHJlc3MsIHBzbT0weDMzKToKLSAgICAgICAgIiIiCi0gICAgICAgIFNlbmQgb3BlbiBMRSBDT0MgcmVxdWVzdCB0byBDRVJULiBHZXQgYSBmdXR1cmUgZm9yIGNvbm5lY3Rpb24gcmVzdWx0LCB0byBiZSB1c2VkIGFmdGVyIENFUlQgYWNjZXB0cyByZXF1ZXN0Ci0gICAgICAgICIiIgotICAgICAgICBzZWxmLnJlZ2lzdGVyX2NvYyhjZXJ0X2FkZHJlc3MsIHBzbSkKLSAgICAgICAgcmVzcG9uc2VfZnV0dXJlID0gc2VsZi5fZGV2aWNlLmwyY2FwX2xlLk9wZW5EeW5hbWljQ2hhbm5lbC5mdXR1cmUoCi0gICAgICAgICAgICBsMmNhcF9sZV9mYWNhZGVfcGIyLk9wZW5EeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmVtb3RlPWNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgcmV0dXJuIF9DcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZUZ1dHVyZVdyYXBwZXIocmVzcG9uc2VfZnV0dXJlLCBzZWxmLl9kZXZpY2UsIGNlcnRfYWRkcmVzcywgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sZV9sMmNhcF9zdHJlYW0pCi0KLSAgICBkZWYgdXBkYXRlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX2ludGVydmFsX21pbj0weDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9pbnRlcnZhbF9tYXg9MHgxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5fbGF0ZW5jeT0weDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNpb25fdGltZW91dD0weDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2NlX2xlbmd0aD0xMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jZV9sZW5ndGg9MTIpOgotICAgICAgICBzZWxmLl9kZXZpY2UubDJjYXBfbGUuU2VuZENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGUoCi0gICAgICAgICAgICBsMmNhcF9sZV9mYWNhZGVfcGIyLkNvbm5lY3Rpb25QYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgY29ubl9pbnRlcnZhbF9taW49Y29ubl9pbnRlcnZhbF9taW4sCi0gICAgICAgICAgICAgICAgY29ubl9pbnRlcnZhbF9tYXg9Y29ubl9pbnRlcnZhbF9tYXgsCi0gICAgICAgICAgICAgICAgY29ubl9sYXRlbmN5PWNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICBzdXBlcnZpc2lvbl90aW1lb3V0PXN1cGVydmlzaW9uX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgbWluX2NlX2xlbmd0aD1taW5fY2VfbGVuZ3RoLAotICAgICAgICAgICAgICAgIG1heF9jZV9sZW5ndGg9bWF4X2NlX2xlbmd0aCkpCmRpZmYgLS1naXQgYS9nZC9jZXJ0L3B5X2xlX2FjbF9tYW5hZ2VyLnB5IGIvZ2QvY2VydC9weV9sZV9hY2xfbWFuYWdlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiYTlkMy4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3B5X2xlX2FjbF9tYW5hZ2VyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgSUV2ZW50U3RyZWFtCi1mcm9tIGNlcnQuY2FwdHVyZXMgaW1wb3J0IEhjaUNhcHR1cmVzCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IENsb3NhYmxlCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IHNhZmVDbG9zZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfYWNsX21hbmFnZXJfZmFjYWRlX3BiMiBhcyBsZV9hY2xfbWFuYWdlcl9mYWNhZGUKLQotCi1jbGFzcyBQeUxlQWNsTWFuYWdlckFjbENvbm5lY3Rpb24oSUV2ZW50U3RyZWFtLCBDbG9zYWJsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbGVfYWNsX21hbmFnZXIsIGFkZHJlc3MsIHJlbW90ZV9hZGRyLCBoYW5kbGUsIGV2ZW50X3N0cmVhbSk6Ci0gICAgICAgICIiIgotICAgICAgICBBbiBhYnN0cmFjdCByZXByZXNlbnRhdGlvbiBmb3IgYW4gTEUgQUNMIGNvbm5lY3Rpb24gaW4gR0QgY2VydGlmaWNhdGlvbiB0ZXN0Ci0gICAgICAgIDpwYXJhbSBsZV9hY2xfbWFuYWdlcjogVGhlIExlQWNsTWFuYWdlciBmcm9tIHRoaXMgR0QgZGV2aWNlCi0gICAgICAgIDpwYXJhbSBhZGRyZXNzOiBUaGUgbG9jYWwgZGV2aWNlIGFkZHJlc3MKLSAgICAgICAgOnBhcmFtIHJlbW90ZV9hZGRyOiBSZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICAgICAgOnBhcmFtIGhhbmRsZTogQ29ubmVjdGlvbiBoYW5kbGUKLSAgICAgICAgOnBhcmFtIGV2ZW50X3N0cmVhbTogVGhlIGNvbm5lY3Rpb24gZXZlbnQgc3RyZWFtIGZvciB0aGlzIGNvbm5lY3Rpb24KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYubGVfYWNsX21hbmFnZXIgPSBsZV9hY2xfbWFuYWdlcgotICAgICAgICAjIHRvZG8gZW5hYmxlIGZpbHRlcmluZyBhZnRlciBzb3J0aW5nIG91dCBoYW5kbGVzCi0gICAgICAgICMgc2VsZi5vdXJfYWNsX3N0cmVhbSA9IEZpbHRlcmluZ0V2ZW50U3RyZWFtKGFjbF9zdHJlYW0sIE5vbmUpCi0gICAgICAgIHNlbGYuaGFuZGxlID0gaGFuZGxlCi0gICAgICAgIHNlbGYuY29ubmVjdGlvbl9ldmVudF9zdHJlYW0gPSBldmVudF9zdHJlYW0KLSAgICAgICAgc2VsZi5hY2xfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLmxlX2FjbF9tYW5hZ2VyLkZldGNoQWNsRGF0YShsZV9hY2xfbWFuYWdlcl9mYWNhZGUuTGVIYW5kbGVNc2coaGFuZGxlPXNlbGYuaGFuZGxlKSkpCi0gICAgICAgIHNlbGYucmVtb3RlX2FkZHJlc3MgPSByZW1vdGVfYWRkcgotICAgICAgICBzZWxmLm93bl9hZGRyZXNzID0gYWRkcmVzcwotICAgICAgICBzZWxmLmRpc2Nvbm5lY3RfcmVhc29uID0gTm9uZQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuYWNsX3N0cmVhbSkKLQotICAgIGRlZiB3YWl0X2Zvcl9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKHNlbGYpOgotICAgICAgICBkaXNjb25uZWN0aW9uX2NvbXBsZXRlID0gSGNpQ2FwdHVyZXMuRGlzY29ubmVjdGlvbkNvbXBsZXRlQ2FwdHVyZSgpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkuZW1pdHMoZGlzY29ubmVjdGlvbl9jb21wbGV0ZSkKLSAgICAgICAgc2VsZi5kaXNjb25uZWN0X3JlYXNvbiA9IGRpc2Nvbm5lY3Rpb25fY29tcGxldGUuZ2V0KCkuR2V0UmVhc29uKCkKLQotICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLmxlX2FjbF9tYW5hZ2VyLlNlbmRBY2xEYXRhKGxlX2FjbF9tYW5hZ2VyX2ZhY2FkZS5MZUFjbERhdGEoaGFuZGxlPXNlbGYuaGFuZGxlLCBwYXlsb2FkPWJ5dGVzKGRhdGEpKSkKLQotICAgIGRlZiBnZXRfZXZlbnRfcXVldWUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmFjbF9zdHJlYW0uZ2V0X2V2ZW50X3F1ZXVlKCkKLQotCi1jbGFzcyBQeUxlQWNsTWFuYWdlcihDbG9zYWJsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGV2aWNlKToKLSAgICAgICAgIiIiCi0gICAgICAgIExFIEFDTCBNYW5hZ2VyIGZvciBHRCBDZXJ0aWZpY2F0aW9uIHRlc3QKLSAgICAgICAgOnBhcmFtIGRldmljZTogVGhlIEdEIGRldmljZQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5sZV9hY2xfbWFuYWdlciA9IGRldmljZS5oY2lfbGVfYWNsX21hbmFnZXIKLQotICAgICAgICBzZWxmLmluY29taW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtID0gTm9uZQotICAgICAgICBzZWxmLm91dGdvaW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtcyA9IHt9Ci0gICAgICAgIHNlbGYuYWN0aXZlX2Nvbm5lY3Rpb25zID0gW10KLSAgICAgICAgc2VsZi5uZXh0X3Rva2VuID0gMQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5pbmNvbWluZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgZm9yIHYgaW4gc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbXMudmFsdWVzKCk6Ci0gICAgICAgICAgICBzYWZlQ2xvc2UodlswXSkKLSAgICAgICAgZm9yIGNvbm5lY3Rpb24gaW4gc2VsZi5hY3RpdmVfY29ubmVjdGlvbnM6Ci0gICAgICAgICAgICBzYWZlQ2xvc2UoY29ubmVjdGlvbikKLQotICAgIGRlZiBsaXN0ZW5fZm9yX2luY29taW5nX2Nvbm5lY3Rpb25zKHNlbGYpOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuaW5jb21pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0pLmlzTm9uZSgpCi0gICAgICAgIHNlbGYuaW5jb21pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0gPSBFdmVudFN0cmVhbSgKLSAgICAgICAgICAgIHNlbGYubGVfYWNsX21hbmFnZXIuRmV0Y2hJbmNvbWluZ0Nvbm5lY3Rpb24oZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0KLSAgICBkZWYgY29ubmVjdF90b19yZW1vdGUoc2VsZiwgcmVtb3RlX2FkZHIpOgotICAgICAgICB0b2tlbiA9IHNlbGYuaW5pdGlhdGVfY29ubmVjdGlvbihyZW1vdGVfYWRkcikKLSAgICAgICAgcmV0dXJuIHNlbGYuY29tcGxldGVfb3V0Z29pbmdfY29ubmVjdGlvbih0b2tlbikKLQotICAgIGRlZiB3YWl0X2Zvcl9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmxpc3Rlbl9mb3JfaW5jb21pbmdfY29ubmVjdGlvbnMoKQotICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0ZV9pbmNvbWluZ19jb25uZWN0aW9uKCkKLQotICAgIGRlZiB3YWl0X2Zvcl9jb25uZWN0aW9uX2ZhaWwoc2VsZiwgdG9rZW4pOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYub3V0Z29pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW1zW3Rva2VuXSkuaXNOb3ROb25lKCkKLSAgICAgICAgZXZlbnRfc3RyZWFtID0gc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbXNbdG9rZW5dWzBdCi0gICAgICAgIGNvbm5lY3Rpb25fZmFpbCA9IEhjaUNhcHR1cmVzLkxlQ29ubmVjdGlvbkNvbXBsZXRlQ2FwdHVyZSgpCi0gICAgICAgIGFzc2VydFRoYXQoZXZlbnRfc3RyZWFtKS5lbWl0cyhjb25uZWN0aW9uX2ZhaWwsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MzUpKQotICAgICAgICBjb21wbGV0ZSA9IGNvbm5lY3Rpb25fZmFpbC5nZXQoKQotICAgICAgICBhc3NlcnRUaGF0KGNvbXBsZXRlLkdldFN0YXR1cygpID09IGhjaV9wYWNrZXRzLkVycm9yQ29kZS5DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUKS5pc1RydWUoKQotCi0gICAgZGVmIGNhbmNlbF9jb25uZWN0aW9uKHNlbGYsIHRva2VuKToKLSAgICAgICAgYXNzZXJ0VGhhdCh0b2tlbiBpbiBzZWxmLm91dGdvaW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtcykuaXNUcnVlKCkKLSAgICAgICAgcGFpciA9IHNlbGYub3V0Z29pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW1zLnBvcCh0b2tlbikKLSAgICAgICAgc2FmZUNsb3NlKHBhaXJbMF0pCi0gICAgICAgIHNlbGYubGVfYWNsX21hbmFnZXIuQ2FuY2VsQ29ubmVjdGlvbihwYWlyWzFdKQotCi0gICAgZGVmIGluaXRpYXRlX2Nvbm5lY3Rpb24oc2VsZiwgcmVtb3RlX2FkZHIpOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYubmV4dF90b2tlbiBpbiBzZWxmLm91dGdvaW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtcykuaXNGYWxzZSgpCi0gICAgICAgIHNlbGYub3V0Z29pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW1zW3NlbGYubmV4dF90b2tlbl0gPSBFdmVudFN0cmVhbSgKLSAgICAgICAgICAgIHNlbGYubGVfYWNsX21hbmFnZXIuQ3JlYXRlQ29ubmVjdGlvbihyZW1vdGVfYWRkcikpLCByZW1vdGVfYWRkcgotICAgICAgICB0b2tlbiA9IHNlbGYubmV4dF90b2tlbgotICAgICAgICBzZWxmLm5leHRfdG9rZW4gKz0gMQotICAgICAgICByZXR1cm4gdG9rZW4KLQotICAgIGRlZiBpbml0aWF0ZV9iYWNrZ3JvdW5kX2FuZF9kaXJlY3RfY29ubmVjdGlvbihzZWxmLCByZW1vdGVfYWRkcik6Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5uZXh0X3Rva2VuIGluIHNlbGYub3V0Z29pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW1zKS5pc0ZhbHNlKCkKLSAgICAgICAgc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbXNbc2VsZi5uZXh0X3Rva2VuXSA9IEV2ZW50U3RyZWFtKAotICAgICAgICAgICAgc2VsZi5sZV9hY2xfbWFuYWdlci5DcmVhdGVCYWNrZ3JvdW5kQW5kRGlyZWN0Q29ubmVjdGlvbihyZW1vdGVfYWRkcikpLCByZW1vdGVfYWRkcgotICAgICAgICB0b2tlbiA9IHNlbGYubmV4dF90b2tlbgotICAgICAgICBzZWxmLm5leHRfdG9rZW4gKz0gMQotICAgICAgICByZXR1cm4gdG9rZW4KLQotICAgIGRlZiBjb21wbGV0ZV9jb25uZWN0aW9uKHNlbGYsIGV2ZW50X3N0cmVhbSk6Ci0gICAgICAgIGNvbm5lY3Rpb25fY29tcGxldGUgPSBIY2lDYXB0dXJlcy5MZUNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KGV2ZW50X3N0cmVhbSkuZW1pdHMoY29ubmVjdGlvbl9jb21wbGV0ZSkKLSAgICAgICAgY29tcGxldGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlLmdldCgpCi0gICAgICAgIGhhbmRsZSA9IGNvbXBsZXRlLkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICByZW1vdGUgPSBjb21wbGV0ZS5HZXRQZWVyQWRkcmVzcygpCi0gICAgICAgIGlmIGNvbXBsZXRlLkdldFN1YmV2ZW50Q29kZSgpID09IGhjaV9wYWNrZXRzLlN1YmV2ZW50Q29kZS5FTkhBTkNFRF9DT05ORUNUSU9OX0NPTVBMRVRFOgotICAgICAgICAgICAgYWRkcmVzcyA9IGNvbXBsZXRlLkdldExvY2FsUmVzb2x2YWJsZVByaXZhdGVBZGRyZXNzKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFkZHJlc3MgPSBOb25lCi0gICAgICAgIGNvbm5lY3Rpb24gPSBQeUxlQWNsTWFuYWdlckFjbENvbm5lY3Rpb24oc2VsZi5sZV9hY2xfbWFuYWdlciwgYWRkcmVzcywgcmVtb3RlLCBoYW5kbGUsIGV2ZW50X3N0cmVhbSkKLSAgICAgICAgc2VsZi5hY3RpdmVfY29ubmVjdGlvbnMuYXBwZW5kKGNvbm5lY3Rpb24pCi0gICAgICAgIHJldHVybiBjb25uZWN0aW9uCi0KLSAgICBkZWYgY29tcGxldGVfaW5jb21pbmdfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmluY29taW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtKS5pc05vdE5vbmUoKQotICAgICAgICBldmVudF9zdHJlYW0gPSBzZWxmLmluY29taW5nX2Nvbm5lY3Rpb25fZXZlbnRfc3RyZWFtCi0gICAgICAgIHNlbGYuaW5jb21pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW0gPSBOb25lCi0gICAgICAgIHJldHVybiBzZWxmLmNvbXBsZXRlX2Nvbm5lY3Rpb24oZXZlbnRfc3RyZWFtKQotCi0gICAgZGVmIGNvbXBsZXRlX291dGdvaW5nX2Nvbm5lY3Rpb24oc2VsZiwgdG9rZW4pOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYub3V0Z29pbmdfY29ubmVjdGlvbl9ldmVudF9zdHJlYW1zW3Rva2VuXSkuaXNOb3ROb25lKCkKLSAgICAgICAgZXZlbnRfc3RyZWFtID0gc2VsZi5vdXRnb2luZ19jb25uZWN0aW9uX2V2ZW50X3N0cmVhbXMucG9wKHRva2VuKVswXQotICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0ZV9jb25uZWN0aW9uKGV2ZW50X3N0cmVhbSkKZGlmZiAtLWdpdCBhL2dkL2NlcnQvcHlfbGVfaXNvLnB5IGIvZ2QvY2VydC9weV9sZV9pc28ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjJmNDkuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9weV9sZV9pc28ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIxIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgbG9nZ2luZwotCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGNlcnQuY2FwdHVyZSBpbXBvcnQgQ2FwdHVyZQotZnJvbSBjZXJ0LmNhcHR1cmVzIGltcG9ydCBTZWN1cml0eUNhcHR1cmVzCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IENsb3NhYmxlCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IHNhZmVDbG9zZQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0sIElFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRmlsdGVyaW5nRXZlbnRTdHJlYW0KLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgSXNvTWF0Y2hlcnMKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gaXNvIGltcG9ydCBmYWNhZGVfcGIyIGFzIGlzb19mYWNhZGVfcGIyCi0KLQotY2xhc3MgQ2lzVGVzdFBhcmFtZXRlcnMoKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjaXNfaWQsIG5zZSwgbWF4X3NkdV9tX3RvX3MsIG1heF9zZHVfc190b19tLCBtYXhfcGR1X21fdG9fcywgbWF4X3BkdV9zX3RvX20sIHBoeV9tX3RvX3MsCi0gICAgICAgICAgICAgICAgIHBoeV9zX3RvX20sIGJuX21fdG9fcywgYm5fc190b19tKToKLSAgICAgICAgc2VsZi5jaXNfaWQgPSBjaXNfaWQKLSAgICAgICAgc2VsZi5uc2UgPSBuc2UKLSAgICAgICAgc2VsZi5tYXhfc2R1X21fdG9fcyA9IG1heF9zZHVfbV90b19zCi0gICAgICAgIHNlbGYubWF4X3NkdV9zX3RvX20gPSBtYXhfc2R1X3NfdG9fbQotICAgICAgICBzZWxmLm1heF9wZHVfbV90b19zID0gbWF4X3BkdV9tX3RvX3MKLSAgICAgICAgc2VsZi5tYXhfcGR1X3NfdG9fbSA9IG1heF9wZHVfc190b19tCi0gICAgICAgIHNlbGYucGh5X21fdG9fcyA9IHBoeV9tX3RvX3MKLSAgICAgICAgc2VsZi5waHlfc190b19tID0gcGh5X3NfdG9fbQotICAgICAgICBzZWxmLmJuX21fdG9fcyA9IGJuX21fdG9fcwotICAgICAgICBzZWxmLmJuX3NfdG9fbSA9IGJuX3NfdG9fbQotCi0KLWNsYXNzIFB5TGVJc29TdHJlYW0oSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UsIGNpc19oYW5kbGUsIGlzb19kYXRhX3N0cmVhbSk6Ci0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9jaXNfaGFuZGxlID0gY2lzX2hhbmRsZQotICAgICAgICBzZWxmLl9sZV9pc29fZGF0YV9zdHJlYW0gPSBpc29fZGF0YV9zdHJlYW0KLSAgICAgICAgc2VsZi5fb3VyX2xlX2lzb19jaXNfdmlldyA9IEZpbHRlcmluZ0V2ZW50U3RyZWFtKAotICAgICAgICAgICAgc2VsZi5fbGVfaXNvX2RhdGFfc3RyZWFtLCBJc29NYXRjaGVycy5QYWNrZXRQYXlsb2FkV2l0aE1hdGNoaW5nQ2lzSGFuZGxlKHNlbGYuX2Npc19oYW5kbGUpKQotCi0gICAgZGVmIGdldF9ldmVudF9xdWV1ZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX291cl9sZV9pc29fY2lzX3ZpZXcuZ2V0X2V2ZW50X3F1ZXVlKCkKLQotICAgIGRlZiBzZW5kKHNlbGYsIHBheWxvYWQpOgotICAgICAgICBzZWxmLl9kZXZpY2UuaXNvLlNlbmRJc29QYWNrZXQoaXNvX2ZhY2FkZV9wYjIuSXNvUGFja2V0KGhhbmRsZT1zZWxmLl9jaXNfaGFuZGxlLCBwYXlsb2FkPXBheWxvYWQpKQotCi0KLWNsYXNzIFB5TGVJc28oQ2xvc2FibGUpOgotICAgICIiIgotICAgICAgICBBYnN0cmFjdGlvbiBmb3IgaXNvIHRhc2tzIGFuZCBHUlBDIGNhbGxzCi0gICAgIiIiCi0KLSAgICBfaXNvX2V2ZW50X3N0cmVhbSA9IE5vbmUKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UpOgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogSW5pdCIpCi0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9kZXZpY2Uud2FpdF9jaGFubmVsX3JlYWR5KCkKLSAgICAgICAgc2VsZi5faXNvX2V2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKHNlbGYuX2RldmljZS5pc28uRmV0Y2hJc29FdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0gICAgICAgIHNlbGYuX2lzb19kYXRhX3N0cmVhbSA9IEV2ZW50U3RyZWFtKHNlbGYuX2RldmljZS5pc28uRmV0Y2hJc29EYXRhKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBpZiBzZWxmLl9pc29fZXZlbnRfc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2lzb19ldmVudF9zdHJlYW0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogSVNPIEV2ZW50IFN0cmVhbSBpcyBOb25lISIpCi0gICAgICAgIGlmIHNlbGYuX2lzb19kYXRhX3N0cmVhbSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNhZmVDbG9zZShzZWxmLl9pc29fZGF0YV9zdHJlYW0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogSVNPIERhdGEgU3RyZWFtIGlzIE5vbmUhIikKLQotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogY2xvc2UiKQotCi0gICAgZGVmIGxlX3NldF9jaWdfcGFyYW1ldGVycyhzZWxmLCBjaWdfaWQsIHNkdV9pbnRlcnZhbF9tX3RvX3MsIHNkdV9pbnRlcnZhbF9zX3RvX20sIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2luZywgZnJhbWluZywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwgY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3NkdV9tX3RvX3MsIG1heF9zZHVfc190b19tLCBwaHlfbV90b19zLCBwaHlfc190b19tLCBydG5fbV90b19zLCBydG5fc190b19tKToKLQotICAgICAgICByZXNwID0gc2VsZi5fZGV2aWNlLmlzby5MZVNldENpZ1BhcmFtZXRlcnMoCi0gICAgICAgICAgICBpc29fZmFjYWRlX3BiMi5MZVNldENpZ1BhcmFtZXRlcnNSZXF1ZXN0KAotICAgICAgICAgICAgICAgIGNpZ19pZD1jaWdfaWQsCi0gICAgICAgICAgICAgICAgc2R1X2ludGVydmFsX21fdG9fcz1zZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgICAgICAgICAgIHNkdV9pbnRlcnZhbF9zX3RvX209c2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgICAgICAgICAgICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeT1wZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICAgICAgICAgICAgICBwYWNraW5nPXBhY2tpbmcsCi0gICAgICAgICAgICAgICAgZnJhbWluZz1mcmFtaW5nLAotICAgICAgICAgICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3M9bWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgICAgICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tPW1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICAgICAgICAgICAgY2lzX2lkPWNpc19pZCwKLSAgICAgICAgICAgICAgICBtYXhfc2R1X21fdG9fcz1tYXhfc2R1X21fdG9fcywKLSAgICAgICAgICAgICAgICBtYXhfc2R1X3NfdG9fbT1tYXhfc2R1X3NfdG9fbSwKLSAgICAgICAgICAgICAgICBwaHlfbV90b19zPXBoeV9tX3RvX3MsCi0gICAgICAgICAgICAgICAgcGh5X3NfdG9fbT1waHlfc190b19tLAotICAgICAgICAgICAgICAgIHJ0bl9tX3RvX3M9cnRuX21fdG9fcywKLSAgICAgICAgICAgICAgICBydG5fc190b19tPXJ0bl9zX3RvX20pKQotCi0gICAgZGVmIGxlX3NldF9jaWdfcGFyYW1ldGVyc190ZXN0KHNlbGYsIGNpZ19pZCwgc2R1X2ludGVydmFsX21fdG9fcywgc2R1X2ludGVydmFsX3NfdG9fbSwgZnRfbV90b19zLCBmdF9zX3RvX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb19pbnRlcnZhbCwgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksIHBhY2tpbmcsIGZyYW1pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sIGNpc19jb25maWdzKToKLSAgICAgICAgY29uZmlncyA9IFtdCi0gICAgICAgIGZvciBjYyBpbiBjaXNfY29uZmlnczoKLSAgICAgICAgICAgIGNvbmZpZ3MuYXBwZW5kKAotICAgICAgICAgICAgICAgIGlzb19mYWNhZGVfcGIyLkxlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RSZXF1ZXN0LkxlQ2lzUGFyYW1ldGVyc1Rlc3RDb25maWcoCi0gICAgICAgICAgICAgICAgICAgIGNpc19pZD1jYy5jaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgIG5zZT1jYy5uc2UsCi0gICAgICAgICAgICAgICAgICAgIG1heF9zZHVfbV90b19zPWNjLm1heF9zZHVfbV90b19zLAotICAgICAgICAgICAgICAgICAgICBtYXhfc2R1X3NfdG9fbT1jYy5tYXhfc2R1X3NfdG9fbSwKLSAgICAgICAgICAgICAgICAgICAgbWF4X3BkdV9tX3RvX3M9Y2MubWF4X3BkdV9tX3RvX3MsCi0gICAgICAgICAgICAgICAgICAgIG1heF9wZHVfc190b19tPWNjLm1heF9wZHVfc190b19tLAotICAgICAgICAgICAgICAgICAgICBwaHlfbV90b19zPWNjLnBoeV9tX3RvX3MsCi0gICAgICAgICAgICAgICAgICAgIHBoeV9zX3RvX209Y2MucGh5X3NfdG9fbSwKLSAgICAgICAgICAgICAgICAgICAgYm5fbV90b19zPWNjLmJuX21fdG9fcywKLSAgICAgICAgICAgICAgICAgICAgYm5fc190b19tPWNjLmJuX3NfdG9fbSwKLSAgICAgICAgICAgICAgICApKQotCi0gICAgICAgIHJlc3AgPSBzZWxmLl9kZXZpY2UuaXNvLkxlU2V0Q2lnUGFyYW1ldGVycygKLSAgICAgICAgICAgIGlzb19mYWNhZGVfcGIyLkxlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RSZXF1ZXN0KAotICAgICAgICAgICAgICAgIGNpZ19pZD1jaWdfaWQsCi0gICAgICAgICAgICAgICAgc2R1X2ludGVydmFsX21fdG9fcz1zZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgICAgICAgICAgIHNkdV9pbnRlcnZhbF9zX3RvX209c2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgICAgICAgICAgICBmdF9tX3RvX3M9ZnRfbV90b19zLAotICAgICAgICAgICAgICAgIGZ0X3NfdG9fbT1mdF9zX3RvX20sCi0gICAgICAgICAgICAgICAgaXNvX2ludGVydmFsPWlzb19pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeT1wZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICAgICAgICAgICAgICBwYWNraW5nPXBhY2tpbmcsCi0gICAgICAgICAgICAgICAgZnJhbWluZz1mcmFtaW5nLAotICAgICAgICAgICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3M9bWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgICAgICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tPW1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICAgICAgICAgICAgY2lzX2NvbmZpZ3M9Y29uZmlncykpCi0KLSAgICBkZWYgd2FpdF9sZV9zZXRfY2lnX3BhcmFtZXRlcnNfY29tcGxldGUoc2VsZik6Ci0gICAgICAgIHNldF9jaWdfcGFyYW1zX2NvbXBsZXRlX2NhcHR1cmUgPSBQeUxlSXNvLklzb0NpZ0NvbXBsZXRlKGlzb19mYWNhZGVfcGIyLklzb01zZ1R5cGUuSVNPX1BBUkFNRVRFUlNfU0VUX0NPTVBMRVRFKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faXNvX2V2ZW50X3N0cmVhbSkuZW1pdHMoc2V0X2NpZ19wYXJhbXNfY29tcGxldGVfY2FwdHVyZSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz01KSkKLSAgICAgICAgcmV0dXJuIHNldF9jaWdfcGFyYW1zX2NvbXBsZXRlX2NhcHR1cmUuZ2V0KCkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgSXNvQ2lnQ29tcGxldGUodHlwZT1Ob25lKToKLSAgICAgICAgcmV0dXJuIENhcHR1cmUobGFtYmRhIGV2ZW50OiBUcnVlIGlmIGV2ZW50Lm1lc3NhZ2VfdHlwZSA9PSB0eXBlIGVsc2UgRmFsc2UsIFB5TGVJc28uX2V4dHJhY3RfY2lzX2hhbmRsZXMpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9leHRyYWN0X2Npc19oYW5kbGVzKGV2ZW50KToKLSAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHJldHVybiBldmVudC5jaXNfaGFuZGxlCi0KLSAgICBkZWYgbGVfY3JlYXRlX2NpcyhzZWxmLCBjaXNfYW5kX2FjbF9oYW5kbGVfYXJyYXkpOgotICAgICAgICBoYW5kbGVzX3BhaXJzID0gW10KLSAgICAgICAgZm9yIGhwX3RtcCBpbiBjaXNfYW5kX2FjbF9oYW5kbGVfYXJyYXk6Ci0gICAgICAgICAgICBoYW5kbGVzX3BhaXJzLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBpc29fZmFjYWRlX3BiMi5MZUNyZWF0ZUNpc1JlcXVlc3QuSGFuZGxlUGFpcihjaXNfaGFuZGxlPWhwX3RtcFswXSwgYWNsX2hhbmRsZT1ocF90bXBbMV0pKQotCi0gICAgICAgIHNlbGYuX2RldmljZS5pc28uTGVDcmVhdGVDaXMoaXNvX2ZhY2FkZV9wYjIuTGVDcmVhdGVDaXNSZXF1ZXN0KGhhbmRsZV9wYWlyPWhhbmRsZXNfcGFpcnMpKQotCi0gICAgZGVmIHdhaXRfbGVfY2lzX2VzdGFibGlzaGVkKHNlbGYpOgotICAgICAgICBjaXNfZXN0YWJsc2hlZF9jYXB0dXJlID0gUHlMZUlzby5Jc29DaWdFc3RhYmxpc2hlZChpc29fZmFjYWRlX3BiMi5Jc29Nc2dUeXBlLklTT19DSVNfRVNUQUJMSVNIRUQpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faXNvX2V2ZW50X3N0cmVhbSkuZW1pdHMoY2lzX2VzdGFibHNoZWRfY2FwdHVyZSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz01KSkKLSAgICAgICAgY2lzX2hhbmRsZSA9IGNpc19lc3RhYmxzaGVkX2NhcHR1cmUuZ2V0KClbMF0KLSAgICAgICAgcmV0dXJuIFB5TGVJc29TdHJlYW0oc2VsZi5fZGV2aWNlLCBjaXNfaGFuZGxlLCBzZWxmLl9pc29fZGF0YV9zdHJlYW0pCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIElzb0NpZ0VzdGFibGlzaGVkKHR5cGUpOgotICAgICAgICByZXR1cm4gQ2FwdHVyZShsYW1iZGEgZXZlbnQ6IFRydWUgaWYgZXZlbnQubWVzc2FnZV90eXBlID09IHR5cGUgZWxzZSBGYWxzZSwgUHlMZUlzby5fZXh0cmFjdF9jaXNfaGFuZGxlcykKZGlmZiAtLWdpdCBhL2dkL2NlcnQvcHlfbGVfc2VjdXJpdHkucHkgYi9nZC9jZXJ0L3B5X2xlX3NlY3VyaXR5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRhZGU5Li4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvcHlfbGVfc2VjdXJpdHkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBsb2dnaW5nCi0KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgaGNpX3BhY2tldHMKLWZyb20gY2VydC5jYXB0dXJlcyBpbXBvcnQgU2VjdXJpdHlDYXB0dXJlcwotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IFNlY3VyaXR5TWF0Y2hlcnMKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgSW9DYXBhYmlsaXR5TWVzc2FnZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50c01lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgTGVBdXRoUmVxdWlyZW1lbnRzTWVzc2FnZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBPb2JEYXRhUHJlc2VudE1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgVWlDYWxsYmFja01zZwotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBVaUNhbGxiYWNrVHlwZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBIZWxwZXJNc2dUeXBlCi0KLQotY2xhc3MgUHlMZVNlY3VyaXR5KENsb3NhYmxlKToKLSAgICAiIiIKLSAgICAgICAgQWJzdHJhY3Rpb24gZm9yIHNlY3VyaXR5IHRhc2tzIGFuZCBHUlBDIGNhbGxzCi0gICAgIiIiCi0KLSAgICBfdWlfZXZlbnRfc3RyZWFtID0gTm9uZQotICAgIF9ib25kX2V2ZW50X3N0cmVhbSA9IE5vbmUKLSAgICBfaGVscGVyX2V2ZW50X3N0cmVhbSA9IE5vbmUKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UpOgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogSW5pdCIpCi0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9kZXZpY2Uud2FpdF9jaGFubmVsX3JlYWR5KCkKLSAgICAgICAgc2VsZi5fdWlfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5fZGV2aWNlLnNlY3VyaXR5LkZldGNoVWlFdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0gICAgICAgIHNlbGYuX2JvbmRfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5fZGV2aWNlLnNlY3VyaXR5LkZldGNoQm9uZEV2ZW50cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLSAgICAgICAgc2VsZi5faGVscGVyX2V2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKHNlbGYuX2RldmljZS5zZWN1cml0eS5GZXRjaEhlbHBlckV2ZW50cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgIGRlZiBnZXRfdWlfc3RyZWFtKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fdWlfZXZlbnRfc3RyZWFtCi0KLSAgICBkZWYgZ2V0X2JvbmRfc3RyZWFtKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fYm9uZF9ldmVudF9zdHJlYW0KLQotICAgIGRlZiB3YWl0X2Zvcl91aV9ldmVudF9wYXNza2V5KHNlbGYsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MykpOgotICAgICAgICBkaXNwbGF5X3Bhc3NrZXlfY2FwdHVyZSA9IFNlY3VyaXR5Q2FwdHVyZXMuRGlzcGxheVBhc3NrZXkoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX3VpX2V2ZW50X3N0cmVhbSkuZW1pdHMoZGlzcGxheV9wYXNza2V5X2NhcHR1cmUsIHRpbWVvdXQ9dGltZW91dCkKLSAgICAgICAgcmV0dXJuIGRpc3BsYXlfcGFzc2tleV9jYXB0dXJlLmdldCgpCi0KLSAgICBkZWYgd2FpdF9kZXZpY2VfZGlzY29ubmVjdChzZWxmLCBhZGRyZXNzKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9oZWxwZXJfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuSGVscGVyTXNnKEhlbHBlck1zZ1R5cGUuREVWSUNFX0RJU0NPTk5FQ1RFRCwgYWRkcmVzcykpCi0KLSAgICBkZWYgU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKExlQXV0aFJlcXVpcmVtZW50c01lc3NhZ2UoKmFyZ3MsICoqa3dhcmdzKSkKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgaWYgc2VsZi5fdWlfZXZlbnRfc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2FmZUNsb3NlKHNlbGYuX3VpX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBVSSBFdmVudCBTdHJlYW0gaXMgTm9uZSEiKQotCi0gICAgICAgIGlmIHNlbGYuX2JvbmRfZXZlbnRfc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2JvbmRfZXZlbnRfc3RyZWFtKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJEVVQ6IEJvbmQgRXZlbnQgU3RyZWFtIGlzIE5vbmUhIikKLQotICAgICAgICBpZiBzZWxmLl9oZWxwZXJfZXZlbnRfc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2hlbHBlcl9ldmVudF9zdHJlYW0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogSGVscGVyIEV2ZW50IFN0cmVhbSBpcyBOb25lISIpCmRpZmYgLS1naXQgYS9nZC9jZXJ0L3B5X3NlY3VyaXR5LnB5IGIvZ2QvY2VydC9weV9zZWN1cml0eS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlZTc2Zi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3B5X3NlY3VyaXR5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyIGFzIGNvbW1vbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzTWVzc2FnZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBCb25kTXNnVHlwZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBTZWN1cml0eVBvbGljeU1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgSW9DYXBhYmlsaXRpZXMKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgSW9DYXBhYmlsaXR5TWVzc2FnZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBPb2JEYXRhQm9uZE1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgT29iRGF0YU1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgT29iRGF0YVByZXNlbnRNZXNzYWdlCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IFVpTXNnVHlwZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBVaUNhbGxiYWNrTXNnCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IFVpQ2FsbGJhY2tUeXBlCi0KLQotY2xhc3MgUHlTZWN1cml0eShDbG9zYWJsZSk6Ci0gICAgIiIiCi0gICAgICAgIEFic3RyYWN0aW9uIGZvciBzZWN1cml0eSB0YXNrcyBhbmQgR1JQQyBjYWxscwotICAgICIiIgotCi0gICAgX2lvX2NhcGFiaWxpdGllc19uYW1lX2xvb2t1cCA9IHsKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuRElTUExBWV9PTkxZOiAiRElTUExBWV9PTkxZIiwKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuRElTUExBWV9ZRVNfTk9fSU9fQ0FQOiAiRElTUExBWV9ZRVNfTk9fSU9fQ0FQIiwKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuS0VZQk9BUkRfT05MWTogIktFWUJPQVJEX09OTFkiLAotICAgICAgICBJb0NhcGFiaWxpdGllcy5OT19JTlBVVF9OT19PVVRQVVQ6ICJOT19JTlBVVF9OT19PVVRQVVQiLAotICAgIH0KLQotICAgIF9hdXRoX3JlcXNfbmFtZV9sb29rdXAgPSB7Ci0gICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLk5PX0JPTkRJTkc6ICJOT19CT05ESU5HIiwKLSAgICAgICAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuTk9fQk9ORElOR19NSVRNX1BST1RFQ1RJT046ICJOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTiIsCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HOiAiREVESUNBVEVEX0JPTkRJTkciLAotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT046ICJERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04iLAotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5HRU5FUkFMX0JPTkRJTkc6ICJHRU5FUkFMX0JPTkRJTkciLAotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5HRU5FUkFMX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOiAiR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTiIsCi0gICAgfQotCi0gICAgX3VpX2V2ZW50X3N0cmVhbSA9IE5vbmUKLSAgICBfYm9uZF9ldmVudF9zdHJlYW0gPSBOb25lCi0gICAgX29vYl9kYXRhX2V2ZW50X3N0cmVhbSA9IE5vbmUKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UpOgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogSW5pdCIpCi0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9kZXZpY2Uud2FpdF9jaGFubmVsX3JlYWR5KCkKLSAgICAgICAgc2VsZi5fdWlfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5fZGV2aWNlLnNlY3VyaXR5LkZldGNoVWlFdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0gICAgICAgIHNlbGYuX2JvbmRfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5fZGV2aWNlLnNlY3VyaXR5LkZldGNoQm9uZEV2ZW50cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLSAgICAgICAgc2VsZi5fZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuRmV0Y2hFbmZvcmNlU2VjdXJpdHlQb2xpY3lFdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0gICAgICAgIHNlbGYuX2Rpc2Nvbm5lY3RfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oc2VsZi5fZGV2aWNlLnNlY3VyaXR5LkZldGNoRGlzY29ubmVjdEV2ZW50cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLSAgICAgICAgc2VsZi5fb29iX2RhdGFfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuRmV0Y2hHZXRPdXRPZkJhbmREYXRhRXZlbnRzKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotCi0gICAgZGVmIGNyZWF0ZV9ib25kKHNlbGYsIGFkZHJlc3MsIHR5cGUpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFRyaWdnZXJzIHN0YWNrIHVuZGVyIHRlc3QgdG8gY3JlYXRlIGJvbmQKLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBDcmVhdGluZyBib25kIHRvICclcycgZnJvbSAnJXMnIiAlIChzdHIoYWRkcmVzcyksIHN0cihzZWxmLl9kZXZpY2UuYWRkcmVzcykpKQotICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuQ3JlYXRlQm9uZCgKLSAgICAgICAgICAgIGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLCB0eXBlPXR5cGUpKQotCi0gICAgZGVmIGNyZWF0ZV9ib25kX291dF9vZl9iYW5kKHNlbGYsIGFkZHJlc3MsIHR5cGUsIHAxOTJfb29iX2RhdGEsIHAyNTZfb29iX2RhdGEpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFRyaWdnZXJzIHN0YWNrIHVuZGVyIHRlc3QgdG8gY3JlYXRlIGJvbmQgdXNpbmcgT3V0IG9mIEJhbmQgbWV0aG9kCi0gICAgICAgICIiIgotCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBDcmVhdGluZyBPT0IgYm9uZCB0byAnJXMnIGZyb20gJyVzJyIgJSAoc3RyKGFkZHJlc3MpLCBzdHIoc2VsZi5fZGV2aWNlLmFkZHJlc3MpKSkKLQotICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuQ3JlYXRlQm9uZE91dE9mQmFuZCgKLSAgICAgICAgICAgIE9vYkRhdGFCb25kTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLCB0eXBlPXR5cGUpLAotICAgICAgICAgICAgICAgIHAxOTJfZGF0YT1Pb2JEYXRhTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLCB0eXBlPXR5cGUpLAotICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25fdmFsdWU9Ynl0ZXMoYnl0ZWFycmF5KHAxOTJfb29iX2RhdGFbMF0pKSwKLSAgICAgICAgICAgICAgICAgICAgcmFuZG9tX3ZhbHVlPWJ5dGVzKGJ5dGVhcnJheShwMTkyX29vYl9kYXRhWzFdKSkpLAotICAgICAgICAgICAgICAgIHAyNTZfZGF0YT1Pb2JEYXRhTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLCB0eXBlPXR5cGUpLAotICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25fdmFsdWU9Ynl0ZXMoYnl0ZWFycmF5KHAyNTZfb29iX2RhdGFbMF0pKSwKLSAgICAgICAgICAgICAgICAgICAgcmFuZG9tX3ZhbHVlPWJ5dGVzKGJ5dGVhcnJheShwMjU2X29vYl9kYXRhWzFdKSkpKSkKLQotICAgIGRlZiByZW1vdmVfYm9uZChzZWxmLCBhZGRyZXNzLCB0eXBlKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBSZW1vdmVzIGJvbmQgZnJvbSBzdGFjayB1bmRlciB0ZXN0Ci0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuUmVtb3ZlQm9uZCgKLSAgICAgICAgICAgIGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLCB0eXBlPXR5cGUpKQotCi0gICAgZGVmIHNldF9pb19jYXBhYmlsaXRpZXMoc2VsZiwgaW9fY2FwYWJpbGl0aWVzKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBTZXQgdGhlIElPIENhcGFiaWxpdGllcyB1c2VkIGZvciB0aGUgRFVUCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogc2V0dGluZyBJTyBDYXBhYmlsaXRpZXMgZGF0YSB0byAnJXMnIiAlIHNlbGYuX2lvX2NhcGFiaWxpdGllc19uYW1lX2xvb2t1cC5nZXQoCi0gICAgICAgICAgICBpb19jYXBhYmlsaXRpZXMsICJFUlJPUiIpKQotICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuU2V0SW9DYXBhYmlsaXR5KElvQ2FwYWJpbGl0eU1lc3NhZ2UoY2FwYWJpbGl0eT1pb19jYXBhYmlsaXRpZXMpKQotCi0gICAgZGVmIHNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoc2VsZiwgYXV0aF9yZXFzKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBFc3RhYmxpc2ggYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGUgc3RhY2sKLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBzZXR0aW5nIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVtZW50cyBkYXRhIHRvICclcyciICUgc2VsZi5fYXV0aF9yZXFzX25hbWVfbG9va3VwLmdldCgKLSAgICAgICAgICAgIGF1dGhfcmVxcywgIkVSUk9SIikpCi0gICAgICAgIHNlbGYuX2RldmljZS5zZWN1cml0eS5TZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyhBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50c01lc3NhZ2UocmVxdWlyZW1lbnQ9YXV0aF9yZXFzKSkKLQotICAgIGRlZiBfX3NlbmRfdWlfY2FsbGJhY2soc2VsZiwgYWRkcmVzcywgY2FsbGJhY2tfdHlwZSwgYiwgdWlkLCBwaW4pOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFNlbmQgYSBjYWxsYmFjayBmcm9tIHRoZSBVSSBhcyBpZiB0aGUgdXNlciBwcmVzc2VkIGEgYnV0dG9uIG9uIHRoZSBkaWFsb2cKLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBTZW5kaW5nIHVzZXIgaW5wdXQgcmVzcG9uc2UgdWlkOiAlZDsgcmVzcG9uc2U6ICVzIiAlICh1aWQsIGIpKQotICAgICAgICBzZWxmLl9kZXZpY2Uuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1jYWxsYmFja190eXBlLAotICAgICAgICAgICAgICAgIGJvb2xlYW49YiwKLSAgICAgICAgICAgICAgICB1bmlxdWVfaWQ9dWlkLAotICAgICAgICAgICAgICAgIHBpbj1ieXRlcyhwaW4pLAotICAgICAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLAotICAgICAgICAgICAgICAgICAgICB0eXBlPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzVHlwZUVudW0uUFVCTElDX0RFVklDRV9BRERSRVNTKSkpCi0KLSAgICBkZWYgZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHlvdSB3YW50IHRvIGVuYWJsZSBTU1AgZm9yIHRlc3RpbmcKLSAgICAgICAgICAgIFNpbmNlIHRoZSBzdGFjayB1bmRlciB0ZXN0IGFscmVhZHkgZW5hYmxlcyBpdCBieSBkZWZhdWx0Ci0gICAgICAgICAgICB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlIGZvciB0aGUgdGltZSBiZWluZwotICAgICAgICAiIiIKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGVuYWJsZV9zZWN1cmVfY29ubmVjdGlvbnMoc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBhY2NlcHRfcGFpcmluZyhzZWxmLCBjZXJ0X2FkZHJlc3MsIHJlcGx5X2Jvb2xlYW4pOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIEhlcmUgd2UgcGFzcywgYnV0IGluIGNlcnQgd2UgcGVyZm9ybSBwYWlyaW5nIGZsb3cgdGFza3MuCi0gICAgICAgICAgICBUaGlzIHdhcyBhZGRlZCBoZXJlIGluIG9yZGVyIHRvIGJlIG1vcmUgZHluYW1pYywgYnV0IHRoZSBzdGFjawotICAgICAgICAgICAgdW5kZXIgdGVzdCB3aWxsIGhhbmRsZSB0aGUgcGFpcmluZyBmbG93LgotICAgICAgICAiIiIKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGFjY2VwdF9vb2JfcGFpcmluZyhzZWxmLCBjZXJ0X2FkZHJlc3MsIHJlcGx5X2Jvb2xlYW4pOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIEhlcmUgd2UgcGFzcywgYnV0IGluIGNlcnQgd2UgcGVyZm9ybSBwYWlyaW5nIGZsb3cgdGFza3MuCi0gICAgICAgICAgICBUaGlzIHdhcyBhZGRlZCBoZXJlIGluIG9yZGVyIHRvIGJlIG1vcmUgZHluYW1pYywgYnV0IHRoZSBzdGFjawotICAgICAgICAgICAgdW5kZXIgdGVzdCB3aWxsIGhhbmRsZSB0aGUgcGFpcmluZyBmbG93LgotICAgICAgICAiIiIKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIHdhaXRfZm9yX3Bhc3NrZXkoc2VsZiwgY2VydF9hZGRyZXNzKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBSZXNwb25kIHRvIHRoZSBVSSBldmVudAotICAgICAgICAiIiIKLSAgICAgICAgcGFzc2tleSA9IC0xCi0KLSAgICAgICAgZGVmIGdldF9wYXNza2V5KGV2ZW50KToKLSAgICAgICAgICAgIGlmIGV2ZW50Lm1lc3NhZ2VfdHlwZSA9PSBVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZOgotICAgICAgICAgICAgICAgIG5vbmxvY2FsIHBhc3NrZXkKLSAgICAgICAgICAgICAgICBwYXNza2V5ID0gZXZlbnQubnVtZXJpY192YWx1ZQotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogV2FpdGluZyBmb3IgZXhwZWN0ZWQgVUkgZXZlbnQiKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX3VpX2V2ZW50X3N0cmVhbSkuZW1pdHMoZ2V0X3Bhc3NrZXkpCi0gICAgICAgIHJldHVybiBwYXNza2V5Ci0KLSAgICBkZWYgaW5wdXRfcGluKHNlbGYsIGNlcnRfYWRkcmVzcywgcGluKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBSZXNwb25kIHRvIHRoZSBVSSBldmVudAotICAgICAgICAiIiIKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJEVVQ6IElucHV0dGluZyBwaW4gY29kZTogJXMiICUgc3RyKHBpbikpCi0gICAgICAgIHNlbGYub25fdXNlcl9pbnB1dCgKLSAgICAgICAgICAgIGNlcnRfYWRkcmVzcz1jZXJ0X2FkZHJlc3MsIHJlcGx5X2Jvb2xlYW49VHJ1ZSwgZXhwZWN0ZWRfdWlfZXZlbnQ9VWlNc2dUeXBlLkRJU1BMQVlfUElOX0VOVFJZLCBwaW49cGluKQotCi0gICAgZGVmIG9uX3VzZXJfaW5wdXQoc2VsZiwgY2VydF9hZGRyZXNzLCByZXBseV9ib29sZWFuLCBleHBlY3RlZF91aV9ldmVudCwgcGluPVtdKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBSZXNwb25kIHRvIHRoZSBVSSBldmVudAotICAgICAgICAiIiIKLSAgICAgICAgaWYgZXhwZWN0ZWRfdWlfZXZlbnQgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHVpX2lkID0gLTEKLQotICAgICAgICBkZWYgZ2V0X3VuaXF1ZV9pZChldmVudCk6Ci0gICAgICAgICAgICBpZiBldmVudC5tZXNzYWdlX3R5cGUgPT0gZXhwZWN0ZWRfdWlfZXZlbnQ6Ci0gICAgICAgICAgICAgICAgbm9ubG9jYWwgdWlfaWQKLSAgICAgICAgICAgICAgICB1aV9pZCA9IGV2ZW50LnVuaXF1ZV9pZAotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogV2FpdGluZyBmb3IgZXhwZWN0ZWQgVUkgZXZlbnQiKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX3VpX2V2ZW50X3N0cmVhbSkuZW1pdHMoZ2V0X3VuaXF1ZV9pZCkKLSAgICAgICAgY2FsbGJhY2tfdHlwZSA9IFVpQ2FsbGJhY2tUeXBlLllFU19OTyBpZiBsZW4ocGluKSA9PSAwIGVsc2UgVWlDYWxsYmFja1R5cGUuUElOCi0gICAgICAgIHNlbGYuX19zZW5kX3VpX2NhbGxiYWNrKGNlcnRfYWRkcmVzcywgY2FsbGJhY2tfdHlwZSwgcmVwbHlfYm9vbGVhbiwgdWlfaWQsIHBpbikKLQotICAgIGRlZiBnZXRfYWRkcmVzcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2RldmljZS5hZGRyZXNzCi0KLSAgICBkZWYgd2FpdF9mb3JfYm9uZF9ldmVudChzZWxmLCBleHBlY3RlZF9ib25kX2V2ZW50KToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBBIGJvbmQgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQgb25jZSB0aGUgYm9uZCBwcm9jZXNzCi0gICAgICAgICAgICBpcyBjb21wbGV0ZS4gIEZvciB0aGUgRFVUIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXQsCi0gICAgICAgICAgICBmb3IgQ2VydCBpdCBpc24ndCBuZWVkZWQuCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogV2FpdGluZyBmb3IgQm9uZCBFdmVudDogJXMgIiAlIGV4cGVjdGVkX2JvbmRfZXZlbnQpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5fYm9uZF9ldmVudF9zdHJlYW0pLmVtaXRzKAotICAgICAgICAgICAgbGFtYmRhIGV2ZW50OiBldmVudC5tZXNzYWdlX3R5cGUgPT0gZXhwZWN0ZWRfYm9uZF9ldmVudCBvciBsb2dnaW5nLmluZm8oIkRVVDogQWN0dWFsIEJvbmQgRXZlbnQ6ICVzIiAlIGV2ZW50Lm1lc3NhZ2VfdHlwZSkKLSAgICAgICAgKQotCi0gICAgZGVmIHdhaXRfZm9yX2VuZm9yY2Vfc2VjdXJpdHlfZXZlbnQoc2VsZiwgZXhwZWN0ZWRfZW5mb3JjZV9zZWN1cml0eV9ldmVudCk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgV2UgZXhwZWN0IGEgJ1RydWUnIG9yICdGYWxzZScgZnJvbSB0aGUgZW5mb3JjZSBzZWN1cml0eSBjYWxsCi0KLSAgICAgICAgICAgIFRoaXMgaW50ZXJmYWNlIHdpbGwgYWxsb3cgdGhlIGNhbGxlciB0byB3YWl0IGZvciBhIGNhbGxiYWNrCi0gICAgICAgICAgICByZXN1bHQgZnJvbSBlbmZvcmNpbmcgc2VjdXJpdHkgcG9saWN5IG92ZXIgdGhlIGZhY2FkZS4KLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBXYWl0aW5nIGZvciBlbmZvcmNlIHNlY3VyaXR5IGV2ZW50IikKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9lbmZvcmNlX3NlY3VyaXR5X3BvbGljeV9zdHJlYW0pLmVtaXRzKAotICAgICAgICAgICAgbGFtYmRhIGV2ZW50OiBldmVudC5yZXN1bHQgPT0gZXhwZWN0ZWRfZW5mb3JjZV9zZWN1cml0eV9ldmVudCBvciBsb2dnaW5nLmluZm8oZXZlbnQucmVzdWx0KSkKLQotICAgIGRlZiB3YWl0X2Zvcl9kaXNjb25uZWN0X2V2ZW50KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFRoZSBBZGRyZXNzIGlzIGV4cGVjdGVkIHRvIGJlIHJldHVybmVkCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogV2FpdGluZyBmb3IgRGlzY29ubmVjdCBFdmVudCIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5fZGlzY29ubmVjdF9ldmVudF9zdHJlYW0pLmVtaXRzKGxhbWJkYSBldmVudDogbG9nZ2luZy5pbmZvKCJldmVudDogJXMiICUgZXZlbnQuYWRkcmVzcykgb3IgVHJ1ZSkKLQotICAgIGRlZiBlbmZvcmNlX3NlY3VyaXR5X3BvbGljeShzZWxmLCBhZGRyZXNzLCB0eXBlLCBwb2xpY3kpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIENhbGwgdG8gZW5mb3JjZSBjbGFzc2ljIHNlY3VyaXR5IHBvbGljeQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZGV2aWNlLnNlY3VyaXR5LkVuZm9yY2VTZWN1cml0eVBvbGljeSgKLSAgICAgICAgICAgIFNlY3VyaXR5UG9saWN5TWVzc2FnZSgKLSAgICAgICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWFkZHJlc3MpLCB0eXBlPXR5cGUpLAotICAgICAgICAgICAgICAgIHBvbGljeT1wb2xpY3kpKQotCi0gICAgZGVmIGdldF9vb2JfZGF0YV9mcm9tX2NvbnRyb2xsZXIoc2VsZiwgb29iX2RhdGFfcHJlc2VudCk6Ci0gICAgICAgIHNlbGYuX2RldmljZS5zZWN1cml0eS5HZXRPdXRPZkJhbmREYXRhKGVtcHR5X3Byb3RvLkVtcHR5KCkpCi0gICAgICAgIG9vYl9kYXRhID0gW10KLQotICAgICAgICBkZWYgZ2V0X29vYl9kYXRhKGV2ZW50KToKLSAgICAgICAgICAgIG5vbmxvY2FsIG9vYl9kYXRhCi0gICAgICAgICAgICBvb2JfZGF0YSA9IFsKLSAgICAgICAgICAgICAgICBsaXN0KGV2ZW50LnAxOTJfZGF0YS5jb25maXJtYXRpb25fdmFsdWUpLAotICAgICAgICAgICAgICAgIGxpc3QoZXZlbnQucDE5Ml9kYXRhLnJhbmRvbV92YWx1ZSksIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0sIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0KLSAgICAgICAgICAgIF0KLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9vb2JfZGF0YV9ldmVudF9zdHJlYW0pLmVtaXRzKGdldF9vb2JfZGF0YSkKLSAgICAgICAgcmV0dXJuIG9vYl9kYXRhCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNhZmVDbG9zZShzZWxmLl91aV9ldmVudF9zdHJlYW0pCi0gICAgICAgIHNhZmVDbG9zZShzZWxmLl9ib25kX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2VuZm9yY2Vfc2VjdXJpdHlfcG9saWN5X3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuX2Rpc2Nvbm5lY3RfZXZlbnRfc3RyZWFtKQotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5fb29iX2RhdGFfZXZlbnRfc3RyZWFtKQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9yZWFsX2RldmljZV90ZXN0Y2FzZXMgYi9nZC9jZXJ0L3JlYWxfZGV2aWNlX3Rlc3RjYXNlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0NjBhMi4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3JlYWxfZGV2aWNlX3Rlc3RjYXNlcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUNlcnRTZWxmVGVzdAotU2ltcGxlSGFsVGVzdAotRGlyZWN0SGNpVGVzdAotTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0Ci1MZVNjYW5uaW5nTWFuYWdlclRlc3QKLUxlRXh0ZW5kZWRTY2FubmluZ01hbmFnZXJUZXN0Ci1MZVNjYW5uaW5nV2l0aFNlY3VyaXR5VGVzdAotTmVpZ2hib3JUZXN0Ci1Db250cm9sbGVyVGVzdAotQWNsTWFuYWdlclRlc3QKLUxlQWNsTWFuYWdlclRlc3QKLVN0YWNrVGVzdAotRHVhbEwyY2FwVGVzdAotTGVTZWN1cml0eVRlc3QKLVNoaW1UZXN0Ci1MZUlzb1Rlc3QKLQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9ydW4gYi9nZC9jZXJ0L3J1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTBjNGY2OS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3J1bgorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0jISAvYmluL2Jhc2gKLQotWUVMTE9XPSJcMDMzWzE7MzNtIgotTk9DT0xPUj0iXDAzM1swbSIKLUJMVUU9IlwwMzNbMTszNG0iCi1SRUQ9IlwwMzNbMTs5MW0iCi0KLWZ1bmN0aW9uIGhhcHB5X2hlZGdlaG9nIHsKLSAgICBlY2hvIC1lICJcdCR7QkxVRX0iCi0gICAgZWNobyAtZSAiXHQgICAgICAgX19fLS0tLS0tX18iCi0gICAgZWNobyAtZSAiXHQgfFxfXy0tIC9cICAgICAgIF8tIgotICAgIGVjaG8gLWUgIlx0IHwvXyAgIF9fICAgICAgLSIKLSAgICBlY2hvIC1lICJcdCAvLyBcIC8gIFwgICAgL19fIgotICAgIGVjaG8gLWUgIlx0IHwgMCB8ICAwIHxfXyAgICAgLS1fICAgICAgICBHb3R0YSBnbyBmYXN0ISIKLSAgICBlY2hvIC1lICJcdCBcXF9fX18tLSBfXyBcICAgX19fLSIKLSAgICBlY2hvIC1lICJcdCAoIEAgICAgX18vICAvIC9fIgotICAgIGVjaG8gLWUgIlx0ICAgIC1fX19fXy0tLSAgIC0tXyIKLSAgICBlY2hvIC1lICJcdCAgICAgLy8gIFwgXFwgICBfX18tIgotICAgIGVjaG8gLWUgIlx0ICAgLy98XF9fLyAgXFwgIFxcIgotICAgIGVjaG8gLWUgIlx0ICAgXF8tXF9fX19fLyAgXC1cXCIKLSAgICBlY2hvIC1lICJcdCAgICAgICAgLy8gXFwtLVx8IgotICAgIGVjaG8gLWUgIlx0ICAgJHtSRUR9X19fXyR7QkxVRX0vLyAgfHwke1JFRH1fIgotICAgIGVjaG8gLWUgIlx0JHtSRUR9ICAvX19fX19cIC9fX19cXCIKLSAgICBlY2hvIC1lICIke05PQ09MT1J9IgotfQotCi1mdW5jdGlvbiBzYWRfaGVkZ2Vob2cgewotICAgIGVjaG8gLWUgIlx0JHtCTFVFfSIKLSAgICBlY2hvIC1lICJcdCAgICAgICBfX18tLS0tLS1fXyIKLSAgICBlY2hvIC1lICJcdCB8XF9fLS0gL1wgICAgICAgXy0iCi0gICAgZWNobyAtZSAiXHQgfC9fICAgIF9fICAgICAgLSIKLSAgICBlY2hvIC1lICJcdCAvLyBcICAvICBcICAgIC9fXyIKLSAgICBlY2hvIC1lICJcdCB8IDAgfCAgMCB8X18gICAgIC0tXyAgICAgICAgR290dGEgZ28gc2xsbG9vd3d3dyEiCi0gICAgZWNobyAtZSAiXHQgXFxfX19fLS0gX18gXCAgIF9fXy0iCi0gICAgZWNobyAtZSAiXHQgKCBAICAgIF9fICAgLyAvXyIKLSAgICBlY2hvIC1lICJcdCAgICAtX19fX18tLS0gICAtLV8iCi0gICAgZWNobyAtZSAiXHQgICAgIC8vICBcIFxcICAgX19fLSIKLSAgICBlY2hvIC1lICJcdCAgIC8vfFxfXy8gIFxcICBcXCIKLSAgICBlY2hvIC1lICJcdCAgIFxfLVxfX19fXy8gIFwtXFwiCi0gICAgZWNobyAtZSAiXHQgICAgICAgIC8vIFxcLS1cfCIKLSAgICBlY2hvIC1lICJcdCAgJHtSRUR9IF9fX18ke0JMVUV9Ly8gIHx8JHtSRUR9XyIKLSAgICBlY2hvIC1lICJcdCR7UkVEfSAgL19fX19fXCAvX19fXFwiCi0gICAgZWNobyAtZSAieyROT0NPTE9SfSIKLX0KLQotZnVuY3Rpb24gY2hlY2tfZW52aXJvbm1lbnQgewotICAgIGlmIFtbIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXV0gfHwgW1sgLXogIiR7QU5EUk9JRF9IT1NUX09VVH0iIF1dIDsgdGhlbgotICAgICAgZWNobyAtZSAiJHtSRUR9QU5EUk9JRF9CVUlMRF9UT1Ake05PQ09MT1J9IG9yICR7UkVEfUFORFJPSURfSE9TVF9PVVQke05PQ09MT1J9IGlzIG5vdCBzZXQgZm9yIGhvc3QgcnVuIgotICAgICAgZWNobyAtZSAiTmF2aWdhdGUgdG8gYW5kcm9pZCByb290IGFuZCBydW46IgotICAgICAgZWNobyAtZSAiJHtZRUxMT1d9IgotICAgICAgZWNobyAtZSAiLiBidWlsZC9lbnZzZXR1cC5zaCIKLSAgICAgIGVjaG8gLWUgImx1bmNoIDxmaXNoPiIKLSAgICAgIGVjaG8gLWUgIiR7Tk9DT0xPUn0iCi0gICAgICBlY2hvCi0gICAgICBleGl0IDEKLSAgICBmaQotICAgIGlmICEgWyAteCAiJChjb21tYW5kIC12IHB5dGhvbjMuOSkiIF0gOyB0aGVuCi0gICAgICBlY2hvIC1lICIke1JFRH1Zb3UgbXVzdCBoYXZlIHB5dGhvbiAzLjkgaW5zdGFsbGVkJHtOT0NPTE9SfSIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgcHl0aG9uMy45IC1tIHZpcnR1YWxlbnYgLS12ZXJzaW9uCi0gICAgaWYgW1sgJD8gLW5lIDAgXV0gOyB0aGVuCi0gICAgICAgIGVjaG8gLWUgIiR7UkVEfXZpcnR1YWxlbnYgbm90IGluc3RhbGxlZCBmb3IgcHl0aG9uMy45JHtOT0NPTE9SfSIKLSAgICAgICAgZWNobyAtZSAiJHtSRUR9UGxlYXNlIHJ1biAncHl0aG9uMy45IC1tIHBpcCBpbnN0YWxsIHZpcnR1YWxlbnYnIHRvIGluc3RhbGwgaXQke05PQ09MT1J9IgotICAgICAgICBleGl0IDEKLSAgICBmaQotfQotCi1BU0hNRU1fT1VUPSIvZGV2L3NobS9vdXQiCi1BU0hNRU1fRElTVD0iJHtBU0hNRU1fT1VUfS9kaXN0IgotQVNITUVNX1ZFTlY9IiR7QVNITUVNX0RJU1R9L2JsdWV0b290aF92ZW52IgotQVNITUVNX0dPVFRBX0dPX0ZBU1Q9Ii9kZXYvc2htL2dvdHRhZ29mYXN0IgotQVNITUVNX0hPU1RfTE9HUz0iJHtBU0hNRU1fR09UVEFfR09fRkFTVH0vbG9ncyIKLUFTSE1FTV9PVVRfVEFSR0VUPSIke0FTSE1FTV9HT1RUQV9HT19GQVNUfS90YXJnZXQiCi1BU0hNRU1fU09PTkc9IiR7QVNITUVNX0dPVFRBX0dPX0ZBU1R9L291dC9zb29uZyIKLUNFUlRfSE9TVF9MT0dTPSIvdG1wL2xvZ3MvSG9zdE9ubHlDZXJ0IgotQ0VSVF9ERVZJQ0VfTE9HUz0iVE9ETzogQWRkIHRoaXMiCi1DRVJUX1RFU1RfVkVOVj0ke0FORFJPSURfQlVJTERfVE9QfS9vdXQvZGlzdC9ibHVldG9vdGhfdmVudgotT1VUX1RBUkdFVD0iJHtBTkRST0lEX0JVSUxEX1RPUH0vb3V0L3RhcmdldCIKLVRFU1RfQ09ORklHPSIke0FORFJPSURfQlVJTERfVE9QfS9zeXN0ZW0vYnQvZ2QvY2VydC9ob3N0X2NvbmZpZy5qc29uIgotVEVTVF9GSUxURVI9Ii10ZiAke0FORFJPSURfQlVJTERfVE9QfS9zeXN0ZW0vYnQvZ2QvY2VydC9hbGxfY2VydF90ZXN0Y2FzZXMiCi1DUFBfQlVJTERfVEFSR0VUPSJibHVldG9vdGhfc3RhY2tfd2l0aF9mYWNhZGUgcm9vdC1jYW5hbCBibHVldG9vdGhfcGFja2V0c19weXRob24zIgotUlVTVF9CVUlMRF9UQVJHRVQ9ImJsdWV0b290aF93aXRoX2ZhY2FkZXMgcm9vdC1jYW5hbCBibHVldG9vdGhfcGFja2V0c19weXRob24zIgotQlVJTERfVEFSR0VUPSRDUFBfQlVJTERfVEFSR0VUCi0KLUNMRUFOX1ZFTlY9ZmFsc2UKLUdPVFRBX0dPX0ZBU1Q9ZmFsc2UKLU5VTV9SRVBFVElUSU9OUz0iMSIKLVNLSVBfU09PTkdfQlVJTEQ9ZmFsc2UKLVVTRV9BU0hNRU1fVkVOVj10cnVlCi1WRVJCT1NFX01PREU9ZmFsc2UKLQotIyBEaXJlY3RvcnkgZm9yIHRlc3QgY29uZmlncyB0byBtb2RpZnkKLUNPTkZJR19ESVI9IiQoIGNkICIkKCBkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIgKSIgPi9kZXYvbnVsbCAyPiYxICYmIHB3ZCApIgotCi0jIyBWZXJpZnkgZGV2aWNlcyBjb25uZWN0ZWQgYW5kIHZhbGlkCi1EVVRfU0VSSUFMPSJEVVQgTm90IFNldCIKLURVVF9BREI9IkRVVCBOb3QgU2V0IgotRFVUX05BTUU9IkRVVCBOb3QgU2V0IgotCi0jIFVzZWQgZm9yIHBvc2l0aW9uIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGxhdGVyCi1QT1NJVElPTkFMPSgpCi1mdW5jdGlvbiBwYXJzZV9vcHRpb25zIHsKLSAgICB3aGlsZSBbWyAkIyAtZ3QgMCBdXQotICAgIGRvCi0gICAga2V5PSIkMSIKLSAgICBjYXNlICRrZXkgaW4KLSAgICAgICAgIyBUaGlzIHdpbGwgZGVsZXRlIHRoZSBleGlzdGluZyB2ZW52IGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0Ci0gICAgICAgICMgSWYgeW91IHVwZGF0ZWQgZXh0ZXJuYWwgbGlicmFyaWVzIHN1Y2ggYXMgQUNUUywgeW91IG5lZWQgdG8gYWRkIHRoaXMgZmxhZwotICAgICAgICAtLWNsZWFuKQotICAgICAgICBDTEVBTl9WRU5WPXRydWUKLSAgICAgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50Ci0gICAgICAgIDs7Ci0gICAgICAgIC0taGVscCkKLSAgICAgICAgZWNobwotICAgICAgICBlY2hvIC1lICIke1lFTExPV31IZWxwIG1lbnUke05PQ09MT1J9IgotICAgICAgICBlY2hvIC1lICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS1jbGVhbiR7Tk9DT0xPUn0iCi0gICAgICAgIGVjaG8gLWUgIiAgICBDbGVhbiB0aGUgdmlydHVsIGVudmlyb25tZW50OyB1c2UgaWYgQUNUUyBoYXMgYmVlbiB1cGRhdGVkLiIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS1kaXNhYmxlLWFzaG1lbS12ZW52JHtOT0NPTE9SfSIKLSAgICAgICAgZWNobyAtZSAiICAgIFBsYWNlcyB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBvbiBkaXNrIHJhdGhlciB0aGFuIGluIGFzaG1lbSB3aGljaCBpcyBkZWZhdWx0LiIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS1nb3R0YS1nby1mYXN0JHtOT0NPTE9SfSIKLSAgICAgICAgZWNobyAtZSAiICAgIE1ha2VzIHVzZSBvZiBhc2htZW0gYXMgYmVzdCBhcyBwb3NzaWJsZSBmb3IgdGFyZ2V0ZWQgc3BlZWQgaW5jcmVhc2VzLiIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS1kZXZpY2Uke05PQ09MT1J9IgotICAgICAgICBlY2hvIC1lICIgICAgUnVuIHRoZSB0ZXN0IG9uIHRoZSAyIHJlYWwgZGV2aWNlcy4iCi0gICAgICAgIGVjaG8gLWUgIiR7QkxVRX0gIC0tcnVzdCR7Tk9DT0xPUn0iCi0gICAgICAgIGVjaG8gLWUgIiAgICBSdW4gdGhlIHRlc3QgdXNpbmcgdGhlIHJ1c3QgaW1wbGVtZW50YXRpb24gb24gdGhlIDIgcmVhbCBkZXZpY2VzLiIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS1yaG9zdCR7Tk9DT0xPUn0iCi0gICAgICAgIGVjaG8gLWUgIiAgICBSdW4gdGhlIHRlc3QgdXNpbmcgdGhlIHJ1c3QgaW1wbGVtZW50YXRpb24gb24gdGhlIGhvc3QuIgotICAgICAgICBlY2hvIC1lICIke0JMVUV9ICAtLXJlcGVhdD08Tj4ke05PQ09MT1J9IgotICAgICAgICBlY2hvIC1lICIgICAgUmVwZWF0IHRoZSB0ZXN0IHNlcXVlbmNlIE4gKGludCkgbnVtYmVyIG9mIHRpbWVzLiIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS1za2lwLXNvb25nLWJ1aWxkJHtOT0NPTE9SfSIKLSAgICAgICAgZWNobyAtZSAiICAgIFNraXBzIGJ1aWxkaW5nIHNvb25nIHRhcmdldHMuIFVzZSB3aGVuIHlvdSBhcmUganVzdCBtb2RpZnlpbmcgc2ltcGxlIHB5dGhvbiBmaWxlcy4iCi0gICAgICAgIGVjaG8gLWUgIiR7QkxVRX0gIC0tdGVzdF9jb25maWc9PGNvbmZpZ2ZpbGU+JHtOT0NPTE9SfSIKLSAgICAgICAgZWNobyAtZSAiICAgIE92ZXJyaWRlIGRlZmF1bHQgdGVzdCBjb25maWd1cmF0aW9uLiIKLSAgICAgICAgZWNobyAtZSAiJHtCTFVFfSAgLS12ZXJib3NlJHtOT0NPTE9SfSIKLSAgICAgICAgZWNobyAtZSAiICAgIERpc3BsYXlzIGRldmljZSBsb2dzIGFuZCB0ZXN0IGxvZ3MgdG8gb3V0cHV0LiIKLSAgICAgICAgZWNobwotICAgICAgICBlY2hvIC1lICJVc2FnZTogJDAgWy0tY2xlYW58LS1ob3N0fC0tcmVwZWF0PTxOPnwtLXRlc3RfY29uZmlnPTxjb25maWc+XSBbVGVzdEdyb3VwTmFtZVs6SW5kaXZpZHVhbFRlc3ROYW1lXV0iCi0gICAgICAgIGVjaG8gLWUgIiAgICAgICAgJHtZRUxMT1d9ZS5nLiIKLSAgICAgICAgZWNobyAtZSAiICAgICAgICAgJDAgLS1ob3N0IC0tY2xlYW4gU2VjdXJpdHlUZXN0IgotICAgICAgICBlY2hvIC1lICIgICAgICAgICAkMCAtLWhvc3QgLS12ZXJib3NlIFNlY3VyaXR5VGVzdDp0ZXN0X2R1dF9pbml0aWF0ZWRfZGlzcGxheV9vbmx5X2Rpc3BsYXlfb25seSAke05PQ09MT1J9IgotICAgICAgICBlY2hvCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGV4aXQgMAotICAgICAgICA7OwotICAgICAgICAjIFRoaXMgd2lsbCBjYXVzZSB0aGUgYmx1ZXRvb3RoX3ZlbnYgdG8gTk9UIGJlIGNyZWF0ZWQgaW4gYXNobWVtCi0gICAgICAgICMgVXNpbmcgYXNobWVtIGluY3JlYXNlcyAtLWNsZWFuIGJ1aWxkIHRpbWVzIGJ5IDQwJSAofjIxIHNlY29uZHMgb24gbXkgbWFjaGluZSkKLSAgICAgICAgLS1kaXNhYmxlLWFzaG1lbS12ZW52KQotICAgICAgICBVU0VfQVNITUVNX1ZFTlY9ZmFsc2UKLSAgICAgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50Ci0gICAgICAgIDs7Ci0gICAgICAgIC0tZ290dGEtZ28tZmFzdCkKLSAgICAgICAgR09UVEFfR09fRkFTVD10cnVlCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgICAgICAtLWRldmljZSkKLSAgICAgICAgVEVTVF9DT05GSUc9IiR7QU5EUk9JRF9CVUlMRF9UT1B9L3N5c3RlbS9idC9nZC9jZXJ0L2RldmljZXNfY29uZmlnLmpzb24iCi0gICAgICAgIFRFU1RfRklMVEVSPSItdGYgJHtBTkRST0lEX0JVSUxEX1RPUH0vc3lzdGVtL2J0L2dkL2NlcnQvcmVhbF9kZXZpY2VfdGVzdGNhc2VzIgotICAgICAgICBSUj0iJChjYXQgJHtURVNUX0NPTkZJR318Z3JlcCBcIkNFUlRcXFx8RFVUXCIpIgotICAgICAgICBpZiBbICIkUlIiICE9ICIiIF07IHRoZW4KLSAgICAgICAgRFVUX1NFUklBTD0iJChtZW51LWFkYiBEVVQpIgotICAgICAgICBEVVRfQURCPSJhZGIgLXMgJHtEVVRfU0VSSUFMfSIKLSAgICAgICAgRFVUX05BTUU9IiQoYWRiIGRldmljZXMgLWwgfCBncmVwIC12ICJMaXN0IG9mIGRldmljZSIgfCBncmVwICR7RFVUX1NFUklBTH0gfCBhd2sgJ3sgcHJpbnQgJDYgfScgfCBjdXQgLWQgJzonIC1mIDIpIgotICAgICAgICBDRVJUX1NFUklBTD0iJChtZW51LWFkYiBDRVJUKSIKLSAgICAgICAgQ0VSVF9BREI9ImFkYiAtcyAke0NFUlRfU0VSSUFMfSIKLSAgICAgICAgQ0VSVF9OQU1FPSIkKGFkYiBkZXZpY2VzIC1sIHwgZ3JlcCAtdiAiTGlzdCBvZiBkZXZpY2UiIHwgZ3JlcCAke0NFUlRfU0VSSUFMfSB8IGF3ayAneyBwcmludCAkNiB9JyB8IGN1dCAtZCAnOicgLWYgMikiCi0KLSAgICAgICAgaWYgWyAiJHtDRVJUX1NFUklBTH0iID09ICIke0RVVF9TRVJJQUx9IiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvCi0gICAgICAgICAgICBlY2hvIC1lICIke1JFRH1FUlJPUjogQ0VSVCBhbmQgRFVUIGNhbm5vdCBiZSB0aGUgc2FtZSBkZXZpY2UsIG9yIHlvdSBvbmx5IGhhdmUgb25lIGRldmljZSBjb25uZWN0ZWQhJHtOT0NPTE9SfSIKLSAgICAgICAgICAgIGVjaG8KLSAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotCi0gICAgICAgICMjIFNldCBhbmRyb2lkIGRldmljZXMgaW4gY29uZmlnCi0gICAgICAgIHB1c2hkIC4KLSAgICAgICAgY2QgIiR7Q09ORklHX0RJUn0iCi0gICAgICAgIHBvcGQKLSAgICAgICAgc2VkIC1pICJzL1wiRFVUXCIvXCIke0RVVF9TRVJJQUx9XCIvZyIgJHtDT05GSUdfRElSfS9kZXZpY2VzX2NvbmZpZy5qc29uCi0gICAgICAgIHNlZCAtaSAicy9cIkNFUlRcIi9cIiR7Q0VSVF9TRVJJQUx9XCIvZyIgJHtDT05GSUdfRElSfS9kZXZpY2VzX2NvbmZpZy5qc29uCi0gICAgICAgIGZpCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgICAgICAjIFJlcGVhdCBydW5uaW5nIHRoZSBzcGVjaWZpZWQgdGVzdCBjYXNlcyBieSBOIHRpbWVzIGluIG9uZSBzaW5nbGUgc2V0dXAKLSAgICAgICAgLS1yZXBlYXQ9KikKLSAgICAgICAgTlVNX1JFUEVUSVRJT05TPSIke2tleSMqPX0iCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgICAgICAtLXNraXAtc29vbmctYnVpbGQpCi0gICAgICAgIFNLSVBfU09PTkdfQlVJTEQ9dHJ1ZQotICAgICAgICBzaGlmdAotICAgICAgICA7OwotICAgICAgICAtLXRlc3RfY29uZmlnPSopCi0gICAgICAgIFRFU1RfQ09ORklHPSIke2tleSMqPX0iCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgICAgICAtLXJ1c3QpCi0gICAgICAgIEJVSUxEX1RBUkdFVD0kUlVTVF9CVUlMRF9UQVJHRVQKLSAgICAgICAgZXhwb3J0IFJVU1RfQkFDS1RSQUNFPTEKLSAgICAgICAgVEVTVF9DT05GSUc9JEFORFJPSURfQlVJTERfVE9QL3N5c3RlbS9idC9nZC9jZXJ0L3J1c3RfYW5kcm9pZF9kZXZpY2VzX2NvbmZpZy5qc29uCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgICAgICAtLXJob3N0KQotICAgICAgICBleHBvcnQgUlVTVF9CQUNLVFJBQ0U9MQotICAgICAgICBCVUlMRF9UQVJHRVQ9JFJVU1RfQlVJTERfVEFSR0VUCi0gICAgICAgIFRFU1RfQ09ORklHPSRBTkRST0lEX0JVSUxEX1RPUC9zeXN0ZW0vYnQvZ2QvY2VydC9ydXN0X2hvc3RfY29uZmlnLmpzb24KLSAgICAgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50Ci0gICAgICAgIDs7Ci0gICAgICAgICMgVGhpcyB3aWxsIGxvZyBldmVyeXRoaW5nIHRvIGJvdGggbG9nIGZpbGUgYW5kIHN0ZG91dAotICAgICAgICAtLXZlcmJvc2UpCi0gICAgICAgIFZFUkJPU0VfTU9ERT10cnVlCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgICAgICAtLSopICMgdW5rbm93biBhcmd1bWVudAotICAgICAgICBlY2hvICIkMDogdW5yZWNvZ25pemVkIGFyZ3VtZW50ICckMSciCi0gICAgICAgIGVjaG8gIlRyeSAnJDAgIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCi0gICAgICAgIGV4aXQgMQotICAgICAgICBzaGlmdAotICAgICAgICA7OwotICAgICAgICAqKSAgICAjIHVua25vd24gb3B0aW9uCi0gICAgICAgIFBPU0lUSU9OQUwrPSgiJDEiKSAjIHNhdmUgaXQgaW4gYW4gYXJyYXkgZm9yIGxhdGVyCi0gICAgICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgICAgICA7OwotICAgIGVzYWMKLSAgICBkb25lCi0gICAgc2V0IC0tICIke1BPU0lUSU9OQUxbQF19IiAjIHJlc3RvcmUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzCi0KLSAgICAjIFNldCB0aGUgdGVzdCBmaWx0ZXIKLSAgICBpZiBbWyAtbiAiJDEiIF1dIDsgdGhlbgotICAgICAgVEVTVF9GSUxURVI9Ii10YyAkMSIKLSAgICBmaQotCi0gICAgSU5TVEFMTF9BUkdTPSItLXJldXNlLWFjdHMiCi0gICAgaWYgWyAiJENMRUFOX1ZFTlYiID09IHRydWUgXSA7IHRoZW4KLSAgICAgIGVjaG8gLWUgIiR7WUVMTE9XfUNsZWFuaW5nIHVwIGV4aXN0aW5nIHZpcnR1YWxlbnYke05PQ09MT1J9IgotICAgICAgcm0gLXJmICRDRVJUX1RFU1RfVkVOVi8qCi0gICAgICBybSAtcmYgJENFUlRfVEVTVF9WRU5WCi0gICAgICBta2RpciAtcCAke0NFUlRfVEVTVF9WRU5WfQotICAgICAgSU5TVEFMTF9BUkdTPSIiCi0gICAgZWxzZQotICAgICAgZWNobyAtZSAiJHtZRUxMT1d9VHJ5IHRvIHJldXNlIGV4aXN0aW5nIHZpcnR1YWxlbnYgYXQgJHtDRVJUX1RFU1RfVkVOVn0ke05PQ09MT1J9IgotICAgIGZpCi0KLX0KLQotZnVuY3Rpb24gc29vbmdfYnVpbGQgewotICAgIGlmIFsgIiRDTEVBTl9WRU5WIiA9PSB0cnVlIF0gOyB0aGVuCi0gICAgICAgICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tYnVpbGQtbW9kZSAtLSJtb2R1bGVzLWluLWEtZGlyIiAtLWRpcj0iJHtBTkRST0lEX0JVSUxEX1RPUH0vc3lzdGVtL2J0L2dkIiBkaXN0ICRCVUlMRF9UQVJHRVQgLWoyMAotICAgICAgICBpZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gLWUgIiR7UkVEfUZhaWxlZCB0byBidWlsZCAke0JVSUxEX1RBUkdFVH0ke05PQ09MT1J9IgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0gICAgZWxzZQotICAgICAgICAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWJ1aWxkLW1vZGUgLS0iYWxsLW1vZHVsZXMiIC0tZGlyPSIke0FORFJPSURfQlVJTERfVE9QfS9zeXN0ZW0vYnQvZ2QiICRCVUlMRF9UQVJHRVQgLWoyMAotICAgICAgICBpZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gLWUgIiR7UkVEfUZhaWxlZCB0byBidWlsZCAke0JVSUxEX1RBUkdFVH0ke05PQ09MT1J9IgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0gICAgZmkKLX0KLQotZnVuY3Rpb24gc2V0dXBfdmVudiB7Ci0gICAgIyBNYWtlIHZlbnYgaW4gbWVtb3J5LCBkZWNyZWFzZXMgLS1jbGVhbiBidWlsZCB0aW1lcyBieSA0MCUKLSAgICAjIENhdmVhdCBpcyB5b3UgbG9zZSB0aGUgdmVudiBpZiB0aGUgY29tcHV0ZXIgcmVib290cwotICAgIGlmIFsgIiR7VVNFX0FTSE1FTV9WRU5WfSIgPT0gdHJ1ZSBdIDsgdGhlbgotICAgICAgICBlY2hvIC1lICIke0JMVUV9VXNpbmcgYXNobWVtIHZpcnR1YWwgZW52aXJvbm1lbnQuJHtOT0NPTE9SfSIKLSAgICAgICAgaWYgW1sgISAtTCAke0NFUlRfVEVTVF9WRU5WfSBdXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gLWUgIiR7QkxVRX0iCi0gICAgICAgICAgICBlY2hvIC1uZSAiQ3JlYXRpbmcgYXNobWVtIGRpc3QgZm9sZGVyLi4uIgotICAgICAgICAgICAgbWtkaXIgLXAgIiR7QVNITUVNX1ZFTlZ9IgotICAgICAgICAgICAgIyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0Ci0gICAgICAgICAgICBybSAtcmYgIiR7Q0VSVF9URVNUX1ZFTlZ9IgotICAgICAgICAgICAgZWNobyAtZSAiRG9uZSIKLSAgICAgICAgICAgIGVjaG8gLW5lICJTeW0gbGlua2luZyAke0FTSE1FTV9WRU5WfSB0byAke0NFUlRfVEVTVF9WRU5WfS4uLiIKLSAgICAgICAgICAgIGxuIC1zICIke0FTSE1FTV9WRU5WfSIgIiR7Q0VSVF9URVNUX1ZFTlZ9IgotICAgICAgICAgICAgZWNobyAtZSAiRG9uZSIKLSAgICAgICAgICAgIGVjaG8gLWUgIiR7Tk9DT0xPUn0iCi0gICAgICAgIGZpCi0gICAgZWxzZQotICAgICAgICBlY2hvIC1lICIke1JFRH1Ob3QgdXNpbmcgYXNobWVtIHZpcnR1YWwgZW52aXJvbm1lbnQuJHtOT0NPTE9SfSIKLSAgICAgICAgaWYgW1sgLUwgJHtDRVJUX1RFU1RfVkVOVn0gXV0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvIC1lICIke1JFRH0iCi0gICAgICAgICAgICBlY2hvIC1lbiAiUmVtb3Zpbmcgc3ltIGxpbmsgZnJvbSAke0FTSE1FTV9WRU5WfSB0byAke0NFUlRfVEVTVF9WRU5WfS4uLiIKLSAgICAgICAgICAgIHJtIC1yZiAiIiR7QVNITUVNX1ZFTlZ9ICIke0NFUlRfVEVTVF9WRU5WfSIKLSAgICAgICAgICAgIGVjaG8gLWUgIkRvbmUiCi0gICAgICAgICAgICBlY2hvIC1lbiAiQ2xlYW5pbmcgdXAgbWVtb3J5Li4uIgotICAgICAgICAgICAgcm0gLXJmICIke0FTSE1FTV9WRU5WfSIKLSAgICAgICAgICAgIGVjaG8gLWUgIkRvbmUiCi0gICAgICAgICAgICBlY2hvIC1lICIke05PQ09MT1J9IgotICAgICAgICBmaQotICAgIGZpCi0gICAgcHl0aG9uMy45IC1tIHZpcnR1YWxlbnYgLS1weXRob24gYHdoaWNoIHB5dGhvbjMuOWAgIiR7Q0VSVF9URVNUX1ZFTlZ9IgotICAgIGlmIFtbICQ/IC1uZSAwIF1dIDsgdGhlbgotICAgICAgICBlY2hvIC1lICIke1JFRH1FcnJvciBzZXR0aW5nIHVwIHZpcnR1YWxlbnYke05PQ09MT1J9IgotICAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgdW56aXAgLW8gLXEgIiR7QU5EUk9JRF9CVUlMRF9UT1B9L291dC9kaXN0L2JsdWV0b290aF9jZXJ0X3Rlc3RzLnppcCIgLWQgIiR7Q0VSVF9URVNUX1ZFTlZ9L2FjdHMiCi0gICAgaWYgW1sgJD8gLW5lIDAgXV0gOyB0aGVuCi0gICAgICAgIGVjaG8gLWUgIiR7UkVEfUVycm9yIHVuemlwcGluZyBibHVldG9vdGhfY2VydF90ZXN0cy56aXAke05PQ09MT1J9IgotICAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgdmVudl9jb21tb24KLX0KLQotZnVuY3Rpb24gaW5jcmVtZW50YWxfdmVudiB7Ci0jTElOVC5JZkNoYW5nZQotICAgIEhPU1RfQklOPSIke0FORFJPSURfQlVJTERfVE9QfS9vdXQvaG9zdC9saW51eC14ODYvYmluIgotICAgIEhPU1RfTElCPSIke0FORFJPSURfQlVJTERfVE9QfS9vdXQvaG9zdC9saW51eC14ODYvbGliNjQiCi0gICAgREVTVF9ESVI9IiR7QU5EUk9JRF9CVUlMRF9UT1B9L291dC9kaXN0L2JsdWV0b290aF92ZW52L2FjdHMiCi0gICAgREVTVF9MSUJfRElSPSIke0RFU1RfRElSfS9saWI2NCIKLSAgICBjcCB7JEhPU1RfQklOLCRERVNUX0RJUn0vYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlCi0gICAgY3AgeyRIT1NUX0JJTiwkREVTVF9ESVJ9L2JsdWV0b290aF93aXRoX2ZhY2FkZXMKLSAgICBjcCB7JEhPU1RfQklOLCRERVNUX0RJUn0vcm9vdC1jYW5hbAotCi0gICAgY3AgeyRIT1NUX0xJQiwkREVTVF9ESVJ9L2JsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuc28KLQotICAgIGNwIHskSE9TVF9MSUIsJERFU1RfTElCX0RJUn0vbGliYmFzZS5zbwotICAgIGNwIHskSE9TVF9MSUIsJERFU1RfTElCX0RJUn0vbGliYmx1ZXRvb3RoX2dkLnNvCi0gICAgY3AgeyRIT1NUX0xJQiwkREVTVF9MSUJfRElSfS9saWJjKysuc28KLSAgICBjcCB7JEhPU1RfTElCLCRERVNUX0xJQl9ESVJ9L2xpYmNocm9tZS5zbwotICAgIGNwIHskSE9TVF9MSUIsJERFU1RfTElCX0RJUn0vbGliY3J5cHRvLWhvc3Quc28KLSAgICBjcCB7JEhPU1RfTElCLCRERVNUX0xJQl9ESVJ9L2xpYmV2ZW50LWhvc3Quc28KLSAgICBjcCB7JEhPU1RfTElCLCRERVNUX0xJQl9ESVJ9L2xpYmdycGMrK191bnNlY3VyZS5zbwotICAgIGNwIHskSE9TVF9MSUIsJERFU1RfTElCX0RJUn0vbGliZ3JwYysrLnNvCi0gICAgY3AgeyRIT1NUX0xJQiwkREVTVF9MSUJfRElSfS9saWJncnBjX3dyYXAuc28KLSAgICBjcCB7JEhPU1RfTElCLCRERVNUX0xJQl9ESVJ9L2xpYmxvZy5zbwotICAgIGNwIHskSE9TVF9MSUIsJERFU1RfTElCX0RJUn0vbGlic3NsLWhvc3Quc28KLSAgICBjcCB7JEhPU1RfTElCLCRERVNUX0xJQl9ESVJ9L2xpYnotaG9zdC5zbwotICAgIGNwIHskSE9TVF9MSUIsJERFU1RfTElCX0RJUn0vbGlicHJvdG9idWYtY3BwLWZ1bGwuc28KLSAgICBjcCB7JEhPU1RfTElCLCRERVNUX0xJQl9ESVJ9L2xpYnVud2luZHN0YWNrLnNvCi0gICAgY3AgeyRIT1NUX0xJQiwkREVTVF9MSUJfRElSfS9saWJsem1hLnNvCi0gICAgY3AgeyRIT1NUX0xJQiwkREVTVF9MSUJfRElSfS9saWJiYWNrdHJhY2Uuc28KLQotICAgIGZvciBpIGluIGBmaW5kICR7QU5EUk9JRF9CVUlMRF9UT1B9L3N5c3RlbS9idC9nZCAtbmFtZSAiKi5weSIgLXR5cGUgZmA7IGRvCi0gICAgICAgIGNwIHske0FORFJPSURfQlVJTERfVE9QfS9zeXN0ZW0vYnQvZ2QsJERFU1RfRElSfSR7aSMke0FORFJPSURfQlVJTERfVE9QfS9zeXN0ZW0vYnQvZ2R9Ci0gICAgZG9uZQotI0xJTlQuVGhlbkNoYW5nZSguLi9BbmRyb2lkLm1rKQotCi0gICAgdmVudl9jb21tb24KLX0KLQotZnVuY3Rpb24gdmVudl9jb21tb24gewotICAgICQoZWNobyAiJHtDRVJUX1RFU1RfVkVOVn0vYmluL3B5dGhvbiIgIiR7Q0VSVF9URVNUX1ZFTlZ9L2FjdHMvc2V0dXAucHkiIC0tcXVpZXQgYnVpbGQgLS1mb3JjZSkKLSAgICBpZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgZWNobyAtZSAiJHtSRUR9RXJyb3IgYnVpbGRpbmcgR0QgUHl0aG9uIGxpYnJhcmllcyR7Tk9DT0xPUn0iCi0gICAgICAgIGVjaG8gLWUgIiR7WUVMTE9XfU5PVEU6JHtOT0NPTE9SfSBUbyBidWlsZCBleHRlcm5hbCBsaWJyYXJpZXMgdGhlIGZpcnN0IHRpbWUsIHBsZWFzZSBhZGQgLS1jbGVhbiBvcHRpb24uIgotICAgICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgJChlY2hvICIke0NFUlRfVEVTVF9WRU5WfS9iaW4vcHl0aG9uIiAiJHtDRVJUX1RFU1RfVkVOVn0vYWN0cy9zZXR1cC5weSIgLS1xdWlldCBpbnN0YWxsIC0tc2tpcC1idWlsZCAtLWZvcmNlICIke0lOU1RBTExfQVJHU30iKQotICAgIGlmIFtbICQ/IC1uZSAwIF1dIDsgdGhlbgotICAgICAgICBlY2hvIC1lICIke1JFRH1FcnJvciBpbnN0YWxsaW5nIEdEIFB5dGhvbiBsaWJyYXJpZXMke05PQ09MT1J9IgotICAgICAgICBleGl0IDEKLSAgICBmaQotCi0iJHtDRVJUX1RFU1RfVkVOVn0vYmluL3B5dGhvbiIgLWMgIgotaW1wb3J0IGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgYXMgYnAzCi1icDMuQmFzZVN0cnVjdAotIgotaWYgW1sgJD8gLW5lIDAgXV0gOyB0aGVuCi0gIGVjaG8gLWUgIiR7UkVEfVNldHVwIGZhaWxlZCBhcyBibHVldG9vdGhfcGFja2V0c19weXRob24zIGNhbm5vdCBiZSBpbXBvcnRlZCR7Tk9DT0xPUn0iCi0gIGV4aXQgMQotZmkKLQotaWYgWyAiJHtWRVJCT1NFX01PREV9IiA9PSB0cnVlIF0gOyB0aGVuCi0gIFRFTVBfQ09ORklHPS90bXAvdGVtcF9hY3RzX2NvbmZpZy5qc29uCi0gIGNhdCAiJHtURVNUX0NPTkZJR30iIHwgIiR7Q0VSVF9URVNUX1ZFTlZ9L2Jpbi9weXRob24iIC1jICIKLWltcG9ydCBzeXMKLWltcG9ydCBqc29uCi1mcm9tIGFjdHMgaW1wb3J0IGtleXMKLWNvbmZpZyA9IGpzb24ubG9hZChzeXMuc3RkaW4pCi1jb25maWdbJ3ZlcmJvc2VfbW9kZSddID0gVHJ1ZQotcHJpbnQoanNvbi5kdW1wcyhjb25maWcpKQotICAiID4gIiR7VEVNUF9DT05GSUd9IgotICBURVNUX0NPTkZJRz0iJHtURU1QX0NPTkZJR30iCi0gIGlmIFtbICQ/IC1uZSAwIF1dIDsgdGhlbgotICAgIGVjaG8gLWUgIiR7UkVEfVNldHVwIGZhaWxlZCBhcyB2ZXJib3NlIG1vZGUgaXMgY2hvc2VuIGJ1dCBjYW5ub3QgYmUgZW5hYmxlZCR7Tk9DT0xPUn0iCi0gICAgZXhpdCAxCi0gIGZpCi1maQotfQotCi1mdW5jdGlvbiBnb3R0YV9nb19mYXN0IHsKLSAgICBpZiBbICIke0dPVFRBX0dPX0ZBU1R9IiA9PSB0cnVlIF0gOyB0aGVuCi0gICAgICAgICMgQ2FsbCBoZXJlIHRvIGV4cGxpY2l0bHkgbm90ZSB0aGUgZmxhZyBpcyBpbiB1c2UKLSAgICAgICAgaGFwcHlfaGVkZ2Vob2cKLSAgICAgICAgaWYgW1sgISAtTCAiJHtDRVJUX0hPU1RfTE9HU30iIF1dIDsgdGhlbgotICAgICAgICAgICAgcm0gLXJmICIke0NFUlRfSE9TVF9MT0dTfSIKLSAgICAgICAgICAgIG1rZGlyIC1wICIke0FTSE1FTV9IT1NUX0xPR1N9IgotICAgICAgICAgICAgbG4gLXMgIiR7QVNITUVNX0hPU1RfTE9HU30iICIke0NFUlRfSE9TVF9MT0dTfSIKLSAgICAgICAgZmkKLQotICAgICAgICBpZiBbWyAhIC1MICIke09VVF9UQVJHRVR9IiBdXSA7IHRoZW4KLSAgICAgICAgICAgIHJtIC1yZiAiJHtPVVRfVEFSR0VUfSIKLSAgICAgICAgICAgIG1rZGlyIC1wICIke0FTSE1FTV9PVVRfVEFSR0VUfSIKLSAgICAgICAgICAgIGxuIC1zICAiJHtBU0hNRU1fT1VUX1RBUkdFVH0iICIke09VVF9UQVJHRVR9IgotICAgICAgICBmaQotICAgIGVsc2UKLSAgICAgICAgaWYgW1sgLUwgIiR7Q0VSVF9IT1NUX0xPR1N9IiBdXSA7IHRoZW4KLSAgICAgICAgICAgICMgQ2FsbCBoZXJlIHNvIHdlIGRvbid0IHNwYW0gYW55b25lIG5vdCB1c2luZyB0aGUgZmxhZwotICAgICAgICAgICAgc2FkX2hlZGdlaG9nCi0gICAgICAgICAgICBybSAtcmYgIiR7Q0VSVF9IT1NUX0xPR1N9IgotICAgICAgICAgICAgcm0gLXJmICIke0FTSE1FTV9IT1NUX0xPR1N9IgotICAgICAgICBmaQotCi0gICAgICAgIGlmIFtbIC1MICIke09VVF9UQVJHRVR9IiBdXSA7IHRoZW4KLSAgICAgICAgICAgIHJtIC1yZiAiJHtPVVRfVEFSR0VUfSIKLSAgICAgICAgICAgIHJtIC1yZiAiJHtBU0hNRU1fT1VUX1RBUkdFVH0iCi0gICAgICAgIGZpCi0gICAgZmkKLX0KLQotZnVuY3Rpb24gcnVuX3Rlc3RzIHsKLSAgICBmb3IgbiBpbiAkKHNlcSAiJHtOVU1fUkVQRVRJVElPTlN9Iik7IGRvCi0gICAgICAkKGVjaG8gIiR7Q0VSVF9URVNUX1ZFTlZ9L2Jpbi9weXRob24iICIke0NFUlRfVEVTVF9WRU5WfS9iaW4vYWN0LnB5IiBcCi0gICAgICAgICAgLWMgIiR7VEVTVF9DT05GSUd9IiBcCi0gICAgICAgICAgIiR7VEVTVF9GSUxURVJ9IiBcCi0gICAgICAgICAgLXRwICIke0NFUlRfVEVTVF9WRU5WfSIvYWN0cykKLSAgICBkb25lCi0KLSAgICBpZiBbICIke0NMRUFOX1ZFTlZ9IiAhPSB0cnVlIF0gOyB0aGVuCi0gICAgICBlY2hvIC1lICIke1lFTExPV31OT1RFOiR7Tk9DT0xPUn0gQ29tcGxldGVkIHRlc3RzIHVzaW5nIGV4aXN0aW5nIGV4dGVybmFsIGxpYnJhcmllcyBpbiB2aXJ0dWFsZW52LiIKLSAgICAgIGVjaG8gLWUgIiR7WUVMTE9XfU5PVEU6JHtOT0NPTE9SfSBUbyB1cGRhdGUgZXh0ZXJuYWwgbGlicmFyaWVzLCBwbGVhc2UgYWRkIC0tY2xlYW4gb3B0aW9uLiIKLSAgICBmaQotfQotCi1mdW5jdGlvbiBtZW51LWFkYigpIHsKLSAgICBUTVA9JChhZGIgZGV2aWNlcyAtbCB8IGdyZXAgLXYgIkxpc3Qgb2YgZGV2aWNlIiB8IGF3ayAneyBwcmludCAkMSB9JykKLSAgICAjIFRPRE8ob3B0ZWRvYmxpdmlvbik6IElmIHRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIGEgbmFtZSAob2ZmbGluZSksIGl0IG1pc25hbWVzIHRoZW0KLSAgICBOVE1QPSQoYWRiIGRldmljZXMgLWwgfCBncmVwIC12ICJMaXN0IG9mIGRldmljZSIgfCBhd2sgJ3sgcHJpbnQgJDYgfScgfCBjdXQgLWQgJzonIC1mIDIpCi0gICAgU0VSSUFMUz0oJFRNUCkKLSAgICBERVZJQ0VTPSgkTlRNUCkKLSAgICBMRU49JHsjU0VSSUFMU1tAXX0KLSAgICByZXN1bHQ9MAotICAgIGlmIFsgJExFTiAtbHQgMSBdOyB0aGVuCi0gICAgICAgIGVjaG8gLWUgIiR7WUVMTE9XfU5vIGRldmljZXMgY29ubmVjdGVkISR7Tk9DT0xPUn0iCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIGlmIFsgIiRMRU4iID09ICIiIF07IHRoZW4KLSAgICAgICAgTEVOPTAKLSAgICBmaQotCi0gICAgYW5zd2VyPTAKLQotICAgIERFVklDRV9OQU1FPSIkMSBkZXZpY2UiCi0KLSAgICBpZiBbICRMRU4gLWd0IDEgXTsgdGhlbgotICAgICAgICBlY2hvICIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiIDE+JjIKLSAgICAgICAgZWNobyAifCBDaG9vc2UgYSAke0RFVklDRV9OQU1FfTogICAgICAgICAgICAgICAgICAgICAgICAgIiAxPiYyCi0gICAgICAgIGVjaG8gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIgMT4mMgotICAgICAgICBlY2hvICJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiIDE+JjIKLSAgICAgICAgbGV0IGZpeGVkX2xlbj0kTEVOLTEKLSAgICAgICAgZm9yIGkgaW4gYHNlcSAwICRmaXhlZF9sZW5gOwotICAgICAgICBkbwotICAgICAgICAgICAgc2VyaWFsPSR7U0VSSUFMU1tpXX0KLSAgICAgICAgICAgIGRldmljZT0ke0RFVklDRVNbaV19Ci0gICAgICAgICAgICBlY2hvICJ8ICRpKSAkc2VyaWFsICRkZXZpY2UiIDE+JjIKLSAgICAgICAgICAgICMjIFRPRE9bTVNCXTogRmluZCBjaGFyYWN0ZXIgY291bnQsIGZpbGwgd2l0aCBzcGFjZSBhbmQgZW5kaW5nIGJveCB3YWxsCi0gICAgICAgIGRvbmUKLSAgICAgICAgZWNobyAifCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IiAxPiYyCi0gICAgICAgIGVjaG8gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIgMT4mMgotICAgICAgICBlY2hvIDE+JjIKLSAgICAgICAgZWNobyAtbiAiSW5kZXggbnVtYmVyOiAiIDE+JjIKLSAgICAgICAgcmVhZCBhbnN3ZXIKLSAgICBmaQotCi0gICAgaWYgWyAkYW5zd2VyIC1nZSAkTEVOIF07IHRoZW4KLSAgICAgICAgZWNobwotICAgICAgICBlY2hvICJQbGVhc2UgY2hvb3NlIGEgY29ycmVjdCBpbmRleCEiIDE+JjIKLSAgICAgICAgZWNobwotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBTRVJJQUw9JHtTRVJJQUxTWyRhbnN3ZXJdfQotICAgIGVjaG8gJFNFUklBTAotfQotCi1mdW5jdGlvbiBtYWluIHsKLSAgICBjaGVja19lbnZpcm9ubWVudAotICAgIHBhcnNlX29wdGlvbnMgJEAKLSAgICBpZiBbWyAiJHtTS0lQX1NPT05HX0JVSUxEfSIgIT0gdHJ1ZSBdXSA7IHRoZW4KLSAgICAgICAgc29vbmdfYnVpbGQKLSAgICBmaQotICAgIGlmIFsgIiRDTEVBTl9WRU5WIiA9PSB0cnVlIF0gOyB0aGVuCi0gICAgICAgIHNldHVwX3ZlbnYKLSAgICBlbHNlCi0gICAgICAgIGluY3JlbWVudGFsX3ZlbnYKLSAgICBmaQotICAgIGdvdHRhX2dvX2Zhc3QKLSAgICBydW5fdGVzdHMKLX0KLQotbWFpbiAkQApkaWZmIC0tZ2l0IGEvZ2QvY2VydC9ydW5fcHRzX2wyY2FwLnNoIGIvZ2QvY2VydC9ydW5fcHRzX2wyY2FwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTZiMzFmLi4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvcnVuX3B0c19sMmNhcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0KLXNvdXJjZSAkQU5EUk9JRF9CVUlMRF9UT1Avc3lzdGVtL2J0L2NlcnQvcnVuIFwKLSAgLS10ZXN0X2NvbmZpZz0kQU5EUk9JRF9CVUlMRF9UT1Avc3lzdGVtL2J0L2dkL2NlcnQvcHRzLmpzb24gXAotICAtLXRlc3RfZmlsZT0kQU5EUk9JRF9CVUlMRF9UT1Avc3lzdGVtL2J0L2dkL2NlcnQvcHRzX2wyY2FwX3Rlc3RjYXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9ydXN0X2FuZHJvaWRfZGV2aWNlc19jb25maWcuanNvbiBiL2dkL2NlcnQvcnVzdF9hbmRyb2lkX2RldmljZXNfY29uZmlnLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzYzMTAuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9ydXN0X2FuZHJvaWRfZGV2aWNlc19jb25maWcuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXsgICAiX2Rlc2NyaXB0aW9uIjogIkJsdWV0b290aCBjZXJ0IHRlc3RpbmciLAotICAgICJ0ZXN0YmVkIjoKLSAgICBbCi0gICAgICAgIHsKLSAgICAgICAgICAgICJfZGVzY3JpcHRpb24iOiAiVHdvIEFuZHJvaWQgZGV2aWNlcyBjZXJ0IHRlc3RiZWQiLAotICAgICAgICAgICAgIm5hbWUiOiAiQW5kcm9pZERldmljZUNlcnQiLAotICAgICAgICAgICAgIkdkRGV2aWNlIjoKLSAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJncnBjX3BvcnQiOiAiODg5OCIsCi0gICAgICAgICAgICAgICAgICAgICJncnBjX3Jvb3Rfc2VydmVyX3BvcnQiOiAiODg5NiIsCi0gICAgICAgICAgICAgICAgICAgICJzaWduYWxfcG9ydCI6ICI4ODk0IiwKLSAgICAgICAgICAgICAgICAgICAgImxhYmVsIjogImNlcnQiLAotICAgICAgICAgICAgICAgICAgICAic2VyaWFsX251bWJlciI6ICJDRVJUIiwKLSAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2VydCBEZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAiY21kIjoKLSAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgImFkYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIiQoc2VyaWFsX251bWJlcikiLAotICAgICAgICAgICAgICAgICAgICAgICAgInNoZWxsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIvc3lzdGVtL2Jpbi9ibHVldG9vdGhfd2l0aF9mYWNhZGFzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWdycGMtcG9ydD0kKGdycGNfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tcm9vdC1zZXJ2ZXItcG9ydD0kKGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tYnRzbm9vcD0vZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1idGNvbmZpZz0vZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuY29uZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1zaWduYWwtcG9ydD0kKHNpZ25hbF9wb3J0KSIKLSAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiZ3JwY19wb3J0IjogIjg4OTkiLAotICAgICAgICAgICAgICAgICAgICAiZ3JwY19yb290X3NlcnZlcl9wb3J0IjogIjg4OTciLAotICAgICAgICAgICAgICAgICAgICAic2lnbmFsX3BvcnQiOiAiODg5NSIsCi0gICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJkdXQiLAotICAgICAgICAgICAgICAgICAgICAic2VyaWFsX251bWJlciI6ICJEVVQiLAotICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJEVVQgRGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgImNtZCI6Ci0gICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhZGIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIkKHNlcmlhbF9udW1iZXIpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaGVsbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiL3N5c3RlbS9iaW4vYmx1ZXRvb3RoX3dpdGhfZmFjYWRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1ncnBjLXBvcnQ9JChncnBjX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLXJvb3Qtc2VydmVyLXBvcnQ9JChncnBjX3Jvb3Rfc2VydmVyX3BvcnQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWJ0c25vb3A9L2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub29wX2hjaS5sb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tYnRjb25maWc9L2RhdGEvbWlzYy9ibHVlZHJvaWQvYnRfY29uZmlnLmNvbmYiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tc2lnbmFsLXBvcnQ9JChzaWduYWxfcG9ydCkiCi0gICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi0gICAgICAgIH0KLSAgICBdLAotICAgICJsb2dwYXRoIjogIi90bXAvbG9ncyIKLX0KZGlmZiAtLWdpdCBhL2dkL2NlcnQvcnVzdF9ob3N0X2NvbmZpZy5qc29uIGIvZ2QvY2VydC9ydXN0X2hvc3RfY29uZmlnLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzJhNTMuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9ydXN0X2hvc3RfY29uZmlnLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0KLXsgICAiX2Rlc2NyaXB0aW9uIjogIkJsdWV0b290aCBjZXJ0IHRlc3RpbmciLAotICAgICJ0ZXN0YmVkIjoKLSAgICBbCi0gICAgICAgIHsKLSAgICAgICAgICAgICJfZGVzY3JpcHRpb24iOiAiSG9zdCBvbmx5IGNlcnQgdGVzdGJlZCIsCi0gICAgICAgICAgICAibmFtZSI6ICJIb3N0T25seUNlcnQiLAotICAgICAgICAgICAgInJvb3RjYW5hbCI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgInRlc3RfcG9ydCI6ICI2NDAxIiwKLSAgICAgICAgICAgICAgICAiaGNpX3BvcnQiOiAiNjQwMiIsCi0gICAgICAgICAgICAgICAgImxpbmtfbGF5ZXJfcG9ydCI6ICI2NDAzIgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJHZERldmljZSI6Ci0gICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiZ3JwY19wb3J0IjogIjg5OTgiLAotICAgICAgICAgICAgICAgICAgICAiZ3JwY19yb290X3NlcnZlcl9wb3J0IjogIjg5OTYiLAotICAgICAgICAgICAgICAgICAgICAic2lnbmFsX3BvcnQiOiAiODk5NCIsCi0gICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJjZXJ0IiwKLSAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2VydCBEZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAiY21kIjoKLSAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgIiRHRF9ST09UL2JsdWV0b290aF93aXRoX2ZhY2FkZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tZ3JwYy1wb3J0PSQoZ3JwY19wb3J0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1yb290LXNlcnZlci1wb3J0PSQoZ3JwY19yb290X3NlcnZlcl9wb3J0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1yb290Y2FuYWwtcG9ydD0kKHJvb3RjYW5hbF9wb3J0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS1zaWduYWwtcG9ydD0kKHNpZ25hbF9wb3J0KSIKLSAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiZ3JwY19wb3J0IjogIjg5OTkiLAotICAgICAgICAgICAgICAgICAgICAiZ3JwY19yb290X3NlcnZlcl9wb3J0IjogIjg5OTciLAotICAgICAgICAgICAgICAgICAgICAic2lnbmFsX3BvcnQiOiAiODk5NSIsCi0gICAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJkdXQiLAotICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJEVVQgRGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgImNtZCI6Ci0gICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICIkR0RfUk9PVC9ibHVldG9vdGhfd2l0aF9mYWNhZGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICItLWdycGMtcG9ydD0kKGdycGNfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tcm9vdC1zZXJ2ZXItcG9ydD0kKGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tcm9vdGNhbmFsLXBvcnQ9JChyb290Y2FuYWxfcG9ydCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tc2lnbmFsLXBvcnQ9JChzaWduYWxfcG9ydCkiCi0gICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi0gICAgICAgIH0KLSAgICBdLAotICAgICJsb2dwYXRoIjogIi90bXAvbG9ncyIKLX0KZGlmZiAtLWdpdCBhL2dkL2NlcnQvc2V0X3VwX2FuZF9ydW5fZGV2aWNlX2NlcnQuc2ggYi9nZC9jZXJ0L3NldF91cF9hbmRfcnVuX2RldmljZV9jZXJ0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2Y4N2NiLi4wMDAwMDAwCi0tLSBhL2dkL2NlcnQvc2V0X3VwX2FuZF9ydW5fZGV2aWNlX2NlcnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iICkiID4vZGV2L251bGwgMj4mMSAmJiBwd2QgKSIKLQotZnVuY3Rpb24gbWVudS1hZGIoKSB7Ci0gICAgVE1QPSQoYWRiIGRldmljZXMgLWwgfCBncmVwIC12ICJMaXN0IG9mIGRldmljZSIgfCBhd2sgJ3sgcHJpbnQgJDEgfScpCi0gICAgIyBUT0RPKG9wdGVkb2JsaXZpb24pOiBJZiB0aGUgZGV2aWNlIGRvZXNuJ3QgaGF2ZSBhIG5hbWUgKG9mZmxpbmUpLCBpdCBtaXNuYW1lcyB0aGVtCi0gICAgTlRNUD0kKGFkYiBkZXZpY2VzIC1sIHwgZ3JlcCAtdiAiTGlzdCBvZiBkZXZpY2UiIHwgYXdrICd7IHByaW50ICQ2IH0nIHwgY3V0IC1kICc6JyAtZiAyKQotICAgIFNFUklBTFM9KCRUTVApCi0gICAgREVWSUNFUz0oJE5UTVApCi0gICAgTEVOPSR7I1NFUklBTFNbQF19Ci0gICAgcmVzdWx0PTAKLSAgICBpZiBbICRMRU4gLWx0IDEgXTsgdGhlbgotICAgICAgICBlY2hvICJObyBkZXZpY2VzIGNvbm5lY3RlZCEiCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIGlmIFsgIiRMRU4iID09ICIiIF07IHRoZW4KLSAgICAgICAgTEVOPTAKLSAgICBmaQotCi0gICAgYW5zd2VyPTAKLQotICAgIERFVklDRV9OQU1FPSIkMSBkZXZpY2UiCi0KLSAgICBpZiBbICRMRU4gLWd0IDEgXTsgdGhlbgotICAgICAgICBlY2hvICIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiIDE+JjIKLSAgICAgICAgZWNobyAifCBDaG9vc2UgYSAke0RFVklDRV9OQU1FfTogICAgICAgICAgICAgICAgICAgICAgICAgIiAxPiYyCi0gICAgICAgIGVjaG8gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIgMT4mMgotICAgICAgICBlY2hvICJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiIDE+JjIKLSAgICAgICAgbGV0IGZpeGVkX2xlbj0kTEVOLTEKLSAgICAgICAgZm9yIGkgaW4gYHNlcSAwICRmaXhlZF9sZW5gOwotICAgICAgICBkbwotICAgICAgICAgICAgc2VyaWFsPSR7U0VSSUFMU1tpXX0KLSAgICAgICAgICAgIGRldmljZT0ke0RFVklDRVNbaV19Ci0gICAgICAgICAgICBlY2hvICJ8ICRpKSAkc2VyaWFsICRkZXZpY2UiIDE+JjIKLSAgICAgICAgICAgICMjIFRPRE9bTVNCXTogRmluZCBjaGFyYWN0ZXIgY291bnQsIGZpbGwgd2l0aCBzcGFjZSBhbmQgZW5kaW5nIGJveCB3YWxsCi0gICAgICAgIGRvbmUKLSAgICAgICAgZWNobyAifCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IiAxPiYyCi0gICAgICAgIGVjaG8gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIgMT4mMgotICAgICAgICBlY2hvIDE+JjIKLSAgICAgICAgZWNobyAtbiAiSW5kZXggbnVtYmVyOiAiIDE+JjIKLSAgICAgICAgcmVhZCBhbnN3ZXIKLSAgICBmaQotCi0gICAgaWYgWyAkYW5zd2VyIC1nZSAkTEVOIF07IHRoZW4KLSAgICAgICAgZWNobwotICAgICAgICBlY2hvICJQbGVhc2UgY2hvb3NlIGEgY29ycmVjdCBpbmRleCEiIDE+JjIKLSAgICAgICAgZWNobwotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBTRVJJQUw9JHtTRVJJQUxTWyRhbnN3ZXJdfQotICAgIGVjaG8gJFNFUklBTAotfQotCi1mdW5jdGlvbiBVcEZpbmQgewotICAgIHdoaWxlIFtbICRQV0QgIT0gLyBdXSA7IGRvCi0gICAgICAgIHJjPSQoZmluZCAiJFBXRCIgLW1heGRlcHRoIDEgIiRAIikKLSAgICAgICAgaWYgWyAtbiAiJHJjIiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvICQoZGlybmFtZSAiJHJjIikKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBmaQotICAgICAgICBjZCAuLgotICAgIGRvbmUKLX0KLQotCi1mdW5jdGlvbiBnZXQtYW5kcm9pZC1yb290KCkgewotICAgIGFuZHJvaWRfcm9vdD0kKFVwRmluZCAtbmFtZSBkYWx2aWsgLXR5cGUgZCkKLSAgICBpZiBbWyAteiAkYW5kcm9pZF9yb290IF1dIDsgdGhlbgotICAgICAgICBlY2hvCi0gICAgICAgIGVjaG8gIk5lZWRzIHRvIGJlIHJhbiBpbiB0aGUgYW5kcm9pZCB0cmVlIgotICAgICAgICBlY2hvCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLSAgICBlY2hvICIke2FuZHJvaWRfcm9vdH0iCi19Ci0KLWZ1bmN0aW9uIGJhbm5lcigpIHsKLSAgICBlY2hvCi0gICAgZWNobyAiR0QgT24gRGV2aWNlIENlcnQgVGVzdCIKLSAgICBlY2hvCi19Ci0KLSMjIE1haW4KLWJhbm5lcgotCi1EUllfUlVOPSIiCi1ET19CVUlMRD0wCi1lY2hvICIkQCIKLWlmIFsgJCMgLWd0IDAgXTsgdGhlbgotICAgIGZvciB2YXIgaW4gIiRAIgotICAgIGRvCi0gICAgICAgIGlmIFsgIiR2YXIiID09ICItaCIgXTsgdGhlbgotICAgICAgICAgICAgZWNobwotICAgICAgICAgICAgZWNobyAiVXNhZ2U6ICQwIFstaHwtZF0iCi0gICAgICAgICAgICBlY2hvCi0gICAgICAgICAgICBlY2hvICJBdmFpbGFibGUgT3B0aW9uczoiCi0gICAgICAgICAgICBlY2hvICI9PT09PT09PT09PT09PT09PT0iCi0gICAgICAgICAgICBlY2hvICIgLWggfCBIZWxwKHRoaXMpIE1lbnUiCi0gICAgICAgICAgICBlY2hvICIgLWQgfCBEcnkgcnVuOyBqdXN0IHByaW50cyBjb21tYW5kcyIKLSAgICAgICAgICAgIGVjaG8KLSAgICAgICAgICAgIHJldHVybiAwCi0gICAgICAgIGVsaWYgWyAiJHZhciIgPT0gIi1kIiBdOyB0aGVuCi0gICAgICAgICAgICBEUllfUlVOPSJlY2hvIgotICAgICAgICBlbGlmIFsgIiR2YXIiID09ICItYiIgXTsgdGhlbgotICAgICAgICAgICAgRE9fQlVJTEQ9MQotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLSMjIFZlcmlmeSBkZXZpY2VzIGNvbm5lY3RlZCBhbmQgc2FuZQotRFVUX1NFUklBTD0iJChtZW51LWFkYiBEVVQpIgotRFVUX0FEQj0iYWRiIC1zICR7RFVUX1NFUklBTH0iCi1EVVRfTkFNRT0iJChhZGIgZGV2aWNlcyAtbCB8IGdyZXAgLXYgIkxpc3Qgb2YgZGV2aWNlIiB8IGdyZXAgJHtEVVRfU0VSSUFMfSB8IGF3ayAneyBwcmludCAkNiB9JyB8IGN1dCAtZCAnOicgLWYgMikiCi0KLUNFUlRfU0VSSUFMPSIkKG1lbnUtYWRiIENFUlQpIgotQ0VSVF9BREI9ImFkYiAtcyAke0NFUlRfU0VSSUFMfSIKLUNFUlRfTkFNRT0iJChhZGIgZGV2aWNlcyAtbCB8IGdyZXAgLXYgIkxpc3Qgb2YgZGV2aWNlIiB8IGdyZXAgJHtDRVJUX1NFUklBTH0gfCBhd2sgJ3sgcHJpbnQgJDYgfScgfCBjdXQgLWQgJzonIC1mIDIpIgotCi1pZiBbICIke0NFUlRfU0VSSUFMfSIgPT0gIiR7RFVUX1NFUklBTH0iIF07IHRoZW4KLSAgICBlY2hvCi0gICAgZWNobyAiRVJST1I6IENFUlQgYW5kIERVVCBjYW5ub3QgYmUgdGhlIHNhbWUgZGV2aWNlLCBvciB5b3Ugb25seSBoYXZlIG9uZSBkZXZpY2UgY29ubmVjdGVkISIKLSAgICBlY2hvCi0gICAgcmV0dXJuIDEKLWZpCi0KLSMjIFN0YXJ0IGJ1aWxkcwotaWYgWyAkRE9fQlVJTEQgPT0gMSBdOyB0aGVuCi0gICAgJERSWV9SVU4gY2QgJChnZXQtYW5kcm9pZC1yb290KQotICAgICREUllfUlVOIC4gYnVpbGQvZW52c2V0dXAuc2gKLSAgICAjRFVUCi0gICAgJERSWV9SVU4gbHVuY2ggJERVVF9OQU1FCi0gICAgJERSWV9SVU4gY2QgJChnZXQtYW5kcm9pZC1yb290KS9zeXN0ZW0vYnQvZ2QKLSAgICAkRFJZX1JVTiBtbWEgLWogYGNhdCAvcHJvYy9jcHVpbmZvIHwgZ3JlcCBjb3JlIHwgd2MgLWxgCi0gICAgJERSWV9SVU4gY2QgJChnZXQtYW5kcm9pZC1yb290KQotICAgICMgQ0VSVAotICAgICREUllfUlVOIGx1bmNoICRDRVJUX05BTUUKLSAgICAkRFJZX1JVTiBjZCAkKGdldC1hbmRyb2lkLXJvb3QpL3N5c3RlbS9idC9nZAotICAgICREUllfUlVOIG1tYSAtaiBgY2F0IC9wcm9jL2NwdWluZm8gfCBncmVwIGNvcmUgfCB3YyAtbGAKLSAgICAkRFJZX1JVTiBjZCAkKGdldC1hbmRyb2lkLXJvb3QpCi1maQotCi0jIyBTZXQgYW5kcm9pZCBkZXZpY2VzIGluIGNvbmZpZwotcHVzaGQgLgotY2QgIiR7RElSfSIKLSMgUmVzZXQgaW4gY2FzZSB1c2VyIGNob29zZXMgZGlmZmVyZW50IGl0ZW0gaW4gbWVudQotZ2l0IGNoZWNrb3V0IGRldmljZXNfY29uZmlnLmpzb24KLXBvcGQKLSREUllfUlVOIHNlZCAtaSAicy9cIkRVVFwiL1wiJHtEVVRfU0VSSUFMfVwiL2ciICR7RElSfS9kZXZpY2VzX2NvbmZpZy5qc29uCi0kRFJZX1JVTiBzZWQgLWkgInMvXCJDRVJUXCIvXCIke0NFUlRfU0VSSUFMfVwiL2ciICR7RElSfS9kZXZpY2VzX2NvbmZpZy5qc29uCi0KLSMjIEFDVFMKLSMkRFJZX1JVTiBzb3VyY2UgJChnZXQtYW5kcm9pZC1yb290KS9zeXN0ZW0vYnQvZ2QvY2VydC9zZXRfdXBfYWN0cy5zaAotCi0jIyBTdGFydCB0ZXN0Ci0kRFJZX1JVTiAkKGdldC1hbmRyb2lkLXJvb3QpL3N5c3RlbS9idC9nZC9jZXJ0L3J1biAtLWRldmljZQpkaWZmIC0tZ2l0IGEvZ2QvY2VydC9zZXRfdXBfdmlydHVhbGVudi5zaCBiL2dkL2NlcnQvc2V0X3VwX3ZpcnR1YWxlbnYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDc2OTEuLjAwMDAwMDAKLS0tIGEvZ2QvY2VydC9zZXRfdXBfdmlydHVhbGVudi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMKLSMgU2NyaXB0IHRvIHNldHVwIHZpcnR1YWwgZW52aXJvbm1lbnQgdG8gcnVuIEdEIGNlcnQgdGVzdHMgYW5kIGRldmxvcCB1c2luZyBJREUKLSMKLSMgVXNhZ2UKLSMgIDEuIGNkIHN5c3RlbS9idC9nZAotIyAgMi4gc291cmNlIGNlcnQvc2V0X3VwX3ZpcnR1YWxlbnYuc2gKLSMgIDQuIFtydW4gdGVzdHMsIGRvIGRldmVsb3BtZW50LCBoYWNrXSB1c2luZyB2ZXZuL2Jpbi9weXRob24KLSMKLSMgTm90ZTogSnVzdCB1c2UgdGhlIHZpcnR1YWxpemVkIFB5dGhvbiBiaW5hcnksIG5vIG5lZWQgdG8gYWN0aXZhdGUKLQotIyMgQW5kcm9pZCBidWlsZCBtYWluIGJ1aWxkIHNldHVwIHNjcmlwdCByZWxhdGl2ZSB0byB0b3AgbGV2ZWwgYW5kcm9pZCBzb3VyY2Ugcm9vdAotQlVJTERfU0VUVVA9Li9idWlsZC9lbnZzZXR1cC5zaAotCi1mdW5jdGlvbiBVc2FnZUFuZHJvaWRUcmVlIHsKLSAgICBjYXQ8PEVPRgotRW5zdXJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhlIGFuZHJvaWQgc291cmNlIHRyZWUKLUVPRgotfQotCi1mdW5jdGlvbiBVc2FnZVNvdXJjZWROb3RFeGVjdXRlZCB7Ci0gICAgY2F0PDxFT0YKLUVuc3VyZSBzY3JpcHQgaXMgU09VUkNFRCBhbmQgbm90IGV4ZWN1dGVkIHRvIHBlcnNpc3QgdGhlIGJ1aWxkIHNldHVwCi1lLmcuCi1zb3VyY2UgJDAKLUVPRgotfQotCi1mdW5jdGlvbiBVcEZpbmQgewotICAgIHdoaWxlIFtbICRQV0QgIT0gLyBdXSA7IGRvCi0gICAgICAgIHJjPSQoZmluZCAiJFBXRCIgLW1heGRlcHRoIDEgIiRAIikKLSAgICAgICAgaWYgWyAtbiAiJHJjIiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvICQoZGlybmFtZSAiJHJjIikKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBmaQotICAgICAgICBjZCAuLgotICAgIGRvbmUKLX0KLQotZnVuY3Rpb24gU2V0VXBBbmRyb2lkQnVpbGQgewotICAgIHB1c2hkIC4KLSAgICBhbmRyb2lkX3Jvb3Q9JChVcEZpbmQgLW5hbWUgb3V0IC10eXBlIGQpCi0gICAgaWYgW1sgLXogJGFuZHJvaWRfcm9vdCBdXSA7IHRoZW4KLSAgICAgICAgVXNhZ2VBbmRyb2lkVHJlZQotICAgICAgICByZXR1cm4KLSAgICBmaQotICAgIGVjaG8gIkZvdW5kIGFuZHJvaWQgcm9vdCAkYW5kcm9pZF9yb290IgotICAgIGNkICRhbmRyb2lkX3Jvb3QgJiYgLiAkQlVJTERfU0VUVVAKLSAgICBlY2hvICJTb3VyY2VkIGJ1aWxkIHNldHVwIHJ1bGVzIgotICAgIGNkICRhbmRyb2lkX3Jvb3QgJiYgbHVuY2gKLSAgICBwb3BkCi19Ci0KLWZ1bmN0aW9uIFNldHVwUHl0aG9uMzggewotICAgIGVjaG8gIlNldHRpbmcgdXAgcHl0aG9uMy44IgotICAgIHN1ZG8gYXB0LWdldCBpbnN0YWxsIHB5dGhvbjMuOC1kZXYKLX0KLQotZnVuY3Rpb24gU2V0dXBQaXAzIHsKLSAgICBlY2hvICJTZXR0aW5nIHVwIHBpcDMiCi0gICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgcHl0aG9uMy1waXAKLX0KLQotIyBEZWFjdGl2YXRlIGV4aXN0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnQsIGlmIGFueSwgaWdub3JlIGVycm9ycwotZGVhY3RpdmF0ZSA+IC9kZXYvbnVsbCAyPiYxCi0KLWlmIFtbICIke0JBU0hfU09VUkNFWzBdfSIgPT0gIiR7MH0iIF1dIDsgdGhlbgotICAgIFVzYWdlU291cmNlZE5vdEV4ZWN1dGVkCi0gICAgcmV0dXJuIDEKLWZpCi0KLSMjIENoZWNrIHB5dGhvbjMuOCBpcyBpbnN0YWxsZWQgcHJvcGVybHkKLSMjIE5lZWQgUHl0aG9uIDMuOCBiZWNhdXNlIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaXMgY29tcGlsZWQgYWdhaW5zdAotIyMgUHl0aG9uIDMuOCBoZWFkZXJzCi1kcGtnIC1sIHB5dGhvbjMuOC1kZXYgPiAvZGV2L251bGwgMj4mMQotaWYgW1sgJD8gLW5lIDAgXV0gOyB0aGVuCi0gICAgU2V0dXBQeXRob24zOAotZmkKLQotIyMgQ2hlY2sgcGlwMyBpcyBpbnN0YWxsZWQgcHJvcGVybHkKLSMjIE5lZWQgcGlwMyBmb3IgUHl0aG9uIDMgc3VwcG9ydAotZHBrZyAtbCBweXRob24zLXBpcCA+IC9kZXYvbnVsbCAyPiYxCi1pZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgICBTZXR1cFBpcDMKLWZpCi0KLSMgSW5zdGFsbCBhbmQgdXBncmFkZSB2aXJ0dWFsZW52IHRvIGxhdGVzdCB2ZXJzaW9uCi1waXAzIGluc3RhbGwgLS11c2VyIC0tdXBncmFkZSB2aXJ0dWFsZW52ID4gL2Rldi9udWxsIDI+JjEKLWlmIFtbICQ/IC1uZSAwIF1dIDsgdGhlbgotICAgIGVjaG8gIkVycm9yIGluc3RhbGwgYW5kIHVwZ3JhZGUgdmlydHVhbGVudiIKLSAgICByZXR1cm4gMQotZmkKLQotIyBTZXQtdXAgQW5kcm9pZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLWlmIFtbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF1dIDsgdGhlbgotICAgIFNldFVwQW5kcm9pZEJ1aWxkCi1maQotCi0jIyBDb21waWxlIGFuZCB1bnppcCB0ZXN0IGFydGlmYWN0cwotZWNobyAiQ29tcGlsaW5nIGJsdWV0b290aF9zdGFja193aXRoX2ZhY2FkZSAuLi4iCi0kQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWJ1aWxkLW1vZGUgLS0iYWxsLW1vZHVsZXMiIC0tZGlyPSIkKHB3ZCkiIGRpc3QgYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlCi1pZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgICBlY2hvICJGYWlsZWQgdG8gY29tcGlsZSBibHVldG9vdGhfc3RhY2tfd2l0aF9mYWNhZGUiCi0gICAgcmV0dXJuIDEKLWZpCi1pZiBbWyAhIC1mICIkQU5EUk9JRF9CVUlMRF9UT1Avb3V0L2Rpc3QvYmx1ZXRvb3RoX2NlcnRfdGVzdHMuemlwIiBdXTsgdGhlbgotICAgIGVjaG8gIkNhbm5vdCBmaW5kIGJsdWV0b290aF9jZXJ0X3Rlc3RzLnppcCBhZnRlciBjb21waWxhdGlvbiIKLSAgICByZXR1cm4gMQotZmkKLQotQ0VSVF9URVNUX1ZFTlY9JEFORFJPSURfQlVJTERfVE9QL291dC9kaXN0L2JsdWV0b290aF92ZW52Ci0KLXJtIC1yZiAkQ0VSVF9URVNUX1ZFTlYKLQotcHl0aG9uMy44IC1tIHZpcnR1YWxlbnYgLS1weXRob24gYHdoaWNoIHB5dGhvbjMuOGAgJENFUlRfVEVTVF9WRU5WCi1pZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgICBlY2hvICJFcnJvciBzZXR0aW5nIHVwIHZpcnR1YWxlbnYiCi0gICAgcmV0dXJuIDEKLWZpCi0KLXVuemlwIC1vIC1xICRBTkRST0lEX0JVSUxEX1RPUC9vdXQvZGlzdC9ibHVldG9vdGhfY2VydF90ZXN0cy56aXAgLWQgJENFUlRfVEVTVF9WRU5WL2FjdHMKLWlmIFtbICQ/IC1uZSAwIF1dIDsgdGhlbgotICAgIGVjaG8gIkVycm9yIHVuemlwcGluZyBibHVldG9vdGhfY2VydF90ZXN0cy56aXAiCi0gICAgcmV0dXJuIDEKLWZpCi0KLSRDRVJUX1RFU1RfVkVOVi9iaW4vcHl0aG9uICRDRVJUX1RFU1RfVkVOVi9hY3RzL3NldHVwLnB5IGluc3RhbGwKLWlmIFtbICQ/IC1uZSAwIF1dIDsgdGhlbgotICAgIGVjaG8gIkVycm9yIGluc3RhbGxpbmcgR0QgbGlicmFyaWVzIgotICAgIHJldHVybiAxCi1maQotCi0kQ0VSVF9URVNUX1ZFTlYvYmluL3B5dGhvbiAtYyAiCi1pbXBvcnQgYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBhcyBicDMKLWJwMy5CYXNlU3RydWN0Ci0iCi1pZiBbWyAkPyAtbmUgMCBdXSA7IHRoZW4KLSAgZWNobyAiU2V0dXAgZmFpbGVkIGFzIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgY2Fubm90IGJlIGltcG9ydGVkIgotICByZXR1cm4gMQotZmkKLQotZWNobyAiIgotZWNobyAiUGxlYXNlIG1hcmsgR0Qgcm9vdCBkaXJlY3RvcnkgYXMgXCJQcm9qZWN0IFNvdXJjZXMgYW5kIEhlYWRlcnNcIiBpbiBJREUiCi1lY2hvICJJZiBzdGlsbCBzZWVpbmcgZXJyb3JzLCBpbnZhbGlkYXRlIGNhY2hlZCBhbmQgcmVzdGFydCIKLWVjaG8gInZpcnR1YWxlbnYgc2V0dXAgY29tcGxldGUiCmRpZmYgLS1naXQgYS9nZC9jZXJ0L3RydXRoLnB5IGIvZ2QvY2VydC90cnV0aC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNDgyOS4uMDAwMDAwMAotLS0gYS9nZC9jZXJ0L3RydXRoLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi0KLWZyb20gbW9ibHkuYXNzZXJ0cyBpbXBvcnQgYXNzZXJ0X3RydWUKLWZyb20gbW9ibHkuYXNzZXJ0cyBpbXBvcnQgYXNzZXJ0X2ZhbHNlCi1mcm9tIG1vYmx5IGltcG9ydCBzaWduYWxzCi0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IElFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2V2ZW50X29jY3VycwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2FsbF9ldmVudHNfb2NjdXIKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IE5PVF9GT1JfWU9VX2Fzc2VydF9ub25lX21hdGNoaW5nCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBOT1RfRk9SX1lPVV9hc3NlcnRfbm9uZQotCi0KLWNsYXNzIE9iamVjdFN1YmplY3Qob2JqZWN0KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6Ci0gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKLQotICAgIGRlZiBpc0VxdWFsVG8oc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBzZWxmLl92YWx1ZSAhPSBvdGhlcjoKLSAgICAgICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoIkV4cGVjdGVkIFwiJXNcIiB0byBiZSBlcXVhbCB0byBcIiVzXCIiICUgKHNlbGYuX3ZhbHVlLCBvdGhlciksIGV4dHJhcz1Ob25lKQotCi0gICAgZGVmIGlzTm90RXF1YWxUbyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIHNlbGYuX3ZhbHVlID09IG90aGVyOgotICAgICAgICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RmFpbHVyZSgiRXhwZWN0ZWQgXCIlc1wiIG5vdCB0byBiZSBlcXVhbCB0byBcIiVzXCIiICUgKHNlbGYuX3ZhbHVlLCBvdGhlciksIGV4dHJhcz1Ob25lKQotCi0gICAgZGVmIGlzR3JlYXRlclRoYW4oc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBzZWxmLl92YWx1ZSA8PSBvdGhlcjoKLSAgICAgICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoIkV4cGVjdGVkIFwiJXNcIiB0byBiZSBncmVhdGVyIHRoYW4gXCIlc1wiIiAlIChzZWxmLl92YWx1ZSwgb3RoZXIpLCBleHRyYXM9Tm9uZSkKLQotICAgIGRlZiBpc0xlc3NUaGFuKHNlbGYsIG90aGVyKToKLSAgICAgICAgaWYgc2VsZi5fdmFsdWUgPj0gb3RoZXI6Ci0gICAgICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlKCJFeHBlY3RlZCBcIiVzXCIgdG8gYmUgbGVzcyB0aGFuIFwiJXNcIiIgJSAoc2VsZi5fdmFsdWUsIG90aGVyKSwgZXh0cmFzPU5vbmUpCi0KLSAgICBkZWYgaXNOb25lKHNlbGYpOgotICAgICAgICBpZiBzZWxmLl92YWx1ZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoIkV4cGVjdGVkIFwiJXNcIiB0byBiZSBOb25lIiAlIHNlbGYuX3ZhbHVlLCBleHRyYXM9Tm9uZSkKLQotICAgIGRlZiBpc05vdE5vbmUoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuX3ZhbHVlIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlKCJFeHBlY3RlZCBcIiVzXCIgdG8gbm90IGJlIE5vbmUiICUgc2VsZi5fdmFsdWUsIGV4dHJhcz1Ob25lKQotCi0KLURFRkFVTFRfVElNRU9VVCA9IHRpbWVkZWx0YShzZWNvbmRzPTEwKQotCi0KLWNsYXNzIEV2ZW50U3RyZWFtU3ViamVjdChPYmplY3RTdWJqZWN0KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6Ci0gICAgICAgIHN1cGVyKCkuX19pbml0X18odmFsdWUpCi0KLSAgICBkZWYgZW1pdHMoc2VsZiwgKm1hdGNoX2ZucywgYXRfbGVhc3RfdGltZXM9MSwgdGltZW91dD1ERUZBVUxUX1RJTUVPVVQpOgotICAgICAgICBpZiBsZW4obWF0Y2hfZm5zKSA9PSAwOgotICAgICAgICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RmFpbHVyZSgiTXVzdCBzcGVjaWZ5IGEgbWF0Y2ggZnVuY3Rpb24iKQotICAgICAgICBlbGlmIGxlbihtYXRjaF9mbnMpID09IDE6Ci0gICAgICAgICAgICBOT1RfRk9SX1lPVV9hc3NlcnRfZXZlbnRfb2NjdXJzKHNlbGYuX3ZhbHVlLCBtYXRjaF9mbnNbMF0sIGF0X2xlYXN0X3RpbWVzPWF0X2xlYXN0X3RpbWVzLCB0aW1lb3V0PXRpbWVvdXQpCi0gICAgICAgICAgICByZXR1cm4gRXZlbnRTdHJlYW1Db250aW51YXRpb25TdWJqZWN0KHNlbGYuX3ZhbHVlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIE11bHRpTWF0Y2hTdHJlYW1TdWJqZWN0KHNlbGYuX3ZhbHVlLCBtYXRjaF9mbnMsIHRpbWVvdXQpCi0KLSAgICBkZWYgZW1pdHNOb25lKHNlbGYsICptYXRjaF9mbnMsIHRpbWVvdXQpOgotICAgICAgICBpZiBsZW4obWF0Y2hfZm5zKSA9PSAwOgotICAgICAgICAgICAgTk9UX0ZPUl9ZT1VfYXNzZXJ0X25vbmUoc2VsZi5fdmFsdWUsIHRpbWVvdXQ9dGltZW91dCkKLSAgICAgICAgICAgIHJldHVybiBFdmVudFN0cmVhbUNvbnRpbnVhdGlvblN1YmplY3Qoc2VsZi5fdmFsdWUpCi0gICAgICAgIGVsaWYgbGVuKG1hdGNoX2ZucykgPT0gMToKLSAgICAgICAgICAgIE5PVF9GT1JfWU9VX2Fzc2VydF9ub25lX21hdGNoaW5nKHNlbGYuX3ZhbHVlLCBtYXRjaF9mbnNbMF0sIHRpbWVvdXQ9dGltZW91dCkKLSAgICAgICAgICAgIHJldHVybiBFdmVudFN0cmVhbUNvbnRpbnVhdGlvblN1YmplY3Qoc2VsZi5fdmFsdWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBzaWduYWxzLlRlc3RGYWlsdXJlKCJDYW5ub3Qgc3BlY2lmeSBtdWx0aXBsZSBtYXRjaCBmdW5jdGlvbnMiKQotCi0KLWNsYXNzIE11bHRpTWF0Y2hTdHJlYW1TdWJqZWN0KG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBtYXRjaF9mbnMsIHRpbWVvdXQpOgotICAgICAgICBzZWxmLl9zdHJlYW0gPSBzdHJlYW0KLSAgICAgICAgc2VsZi5fbWF0Y2hfZm5zID0gbWF0Y2hfZm5zCi0gICAgICAgIHNlbGYuX3RpbWVvdXQgPSB0aW1lb3V0Ci0KLSAgICBkZWYgaW5BbnlPcmRlcihzZWxmKToKLSAgICAgICAgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2FsbF9ldmVudHNfb2NjdXIoc2VsZi5fc3RyZWFtLCBzZWxmLl9tYXRjaF9mbnMsIG9yZGVyX21hdHRlcnM9RmFsc2UsIHRpbWVvdXQ9c2VsZi5fdGltZW91dCkKLSAgICAgICAgcmV0dXJuIEV2ZW50U3RyZWFtQ29udGludWF0aW9uU3ViamVjdChzZWxmLl9zdHJlYW0pCi0KLSAgICBkZWYgaW5PcmRlcihzZWxmKToKLSAgICAgICAgTk9UX0ZPUl9ZT1VfYXNzZXJ0X2FsbF9ldmVudHNfb2NjdXIoc2VsZi5fc3RyZWFtLCBzZWxmLl9tYXRjaF9mbnMsIG9yZGVyX21hdHRlcnM9VHJ1ZSwgdGltZW91dD1zZWxmLl90aW1lb3V0KQotICAgICAgICByZXR1cm4gRXZlbnRTdHJlYW1Db250aW51YXRpb25TdWJqZWN0KHNlbGYuX3N0cmVhbSkKLQotCi1jbGFzcyBFdmVudFN0cmVhbUNvbnRpbnVhdGlvblN1YmplY3QoT2JqZWN0U3ViamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotICAgICAgICBzdXBlcigpLl9faW5pdF9fKHZhbHVlKQotCi0gICAgZGVmIHRoZW4oc2VsZiwgKm1hdGNoX2ZucywgYXRfbGVhc3RfdGltZXM9MSwgdGltZW91dD1ERUZBVUxUX1RJTUVPVVQpOgotICAgICAgICBpZiBsZW4obWF0Y2hfZm5zKSA9PSAwOgotICAgICAgICAgICAgcmFpc2Ugc2lnbmFscy5UZXN0RmFpbHVyZSgiTXVzdCBzcGVjaWZ5IGEgbWF0Y2ggZnVuY3Rpb24iKQotICAgICAgICBlbGlmIGxlbihtYXRjaF9mbnMpID09IDE6Ci0gICAgICAgICAgICBOT1RfRk9SX1lPVV9hc3NlcnRfZXZlbnRfb2NjdXJzKHNlbGYuX3ZhbHVlLCBtYXRjaF9mbnNbMF0sIGF0X2xlYXN0X3RpbWVzPWF0X2xlYXN0X3RpbWVzLCB0aW1lb3V0PXRpbWVvdXQpCi0gICAgICAgICAgICByZXR1cm4gRXZlbnRTdHJlYW1Db250aW51YXRpb25TdWJqZWN0KHNlbGYuX3ZhbHVlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIE11bHRpTWF0Y2hTdHJlYW1TdWJqZWN0KHNlbGYuX3ZhbHVlLCBtYXRjaF9mbnMsIHRpbWVvdXQpCi0KLSAgICBkZWYgdGhlbk5vbmUoc2VsZiwgKm1hdGNoX2ZucywgdGltZW91dCk6Ci0gICAgICAgIGlmIGxlbihtYXRjaF9mbnMpID09IDA6Ci0gICAgICAgICAgICBOT1RfRk9SX1lPVV9hc3NlcnRfbm9uZShzZWxmLl92YWx1ZSwgdGltZW91dD10aW1lb3V0KQotICAgICAgICAgICAgcmV0dXJuIEV2ZW50U3RyZWFtQ29udGludWF0aW9uU3ViamVjdChzZWxmLl92YWx1ZSkKLSAgICAgICAgZWxpZiBsZW4obWF0Y2hfZm5zKSA9PSAxOgotICAgICAgICAgICAgTk9UX0ZPUl9ZT1VfYXNzZXJ0X25vbmVfbWF0Y2hpbmcoc2VsZi5fdmFsdWUsIG1hdGNoX2Zuc1swXSwgdGltZW91dD10aW1lb3V0KQotICAgICAgICAgICAgcmV0dXJuIEV2ZW50U3RyZWFtQ29udGludWF0aW9uU3ViamVjdChzZWxmLl92YWx1ZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIHNpZ25hbHMuVGVzdEZhaWx1cmUoIkNhbm5vdCBzcGVjaWZ5IG11bHRpcGxlIG1hdGNoIGZ1bmN0aW9ucyIpCi0KLQotY2xhc3MgQm9vbGVhblN1YmplY3QoT2JqZWN0U3ViamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotICAgICAgICBzdXBlcigpLl9faW5pdF9fKHZhbHVlKQotCi0gICAgZGVmIGlzVHJ1ZShzZWxmKToKLSAgICAgICAgYXNzZXJ0X3RydWUoc2VsZi5fdmFsdWUsICIiKQotCi0gICAgZGVmIGlzRmFsc2Uoc2VsZik6Ci0gICAgICAgIGFzc2VydF9mYWxzZShzZWxmLl92YWx1ZSwgIiIpCi0KLQotY2xhc3MgVGltZURlbHRhU3ViamVjdChPYmplY3RTdWJqZWN0KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6Ci0gICAgICAgIHN1cGVyKCkuX19pbml0X18odmFsdWUpCi0KLSAgICBkZWYgaXNXaXRoaW4oc2VsZiwgdGltZV9ib3VuZCk6Ci0gICAgICAgIGFzc2VydF90cnVlKHNlbGYuX3ZhbHVlIDwgdGltZV9ib3VuZCwgIiIpCi0KLQotZGVmIGFzc2VydFRoYXQoc3ViamVjdCk6Ci0gICAgaWYgdHlwZShzdWJqZWN0KSBpcyBib29sOgotICAgICAgICByZXR1cm4gQm9vbGVhblN1YmplY3Qoc3ViamVjdCkKLSAgICBlbGlmIGlzaW5zdGFuY2Uoc3ViamVjdCwgSUV2ZW50U3RyZWFtKToKLSAgICAgICAgcmV0dXJuIEV2ZW50U3RyZWFtU3ViamVjdChzdWJqZWN0KQotICAgIGVsaWYgaXNpbnN0YW5jZShzdWJqZWN0LCB0aW1lZGVsdGEpOgotICAgICAgICByZXR1cm4gVGltZURlbHRhU3ViamVjdChzdWJqZWN0KQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBPYmplY3RTdWJqZWN0KHN1YmplY3QpCmRpZmYgLS1naXQgYS9nZC9jb21tb24vQW5kcm9pZC5icCBiL2dkL2NvbW1vbi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Q1NTlhLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoQ29tbW9uU291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiaW5pdF9mbGFncy5jYyIsCi0gICAgICAgICJtZXRyaWNfaWRfbWFuYWdlci5jYyIsCi0gICAgICAgICJzdHJpbmdzLmNjIiwKLSAgICAgICAgInN0b3Bfd2F0Y2guY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aENvbW1vblRlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibG9ja2luZ19xdWV1ZV91bml0dGVzdC5jYyIsCi0gICAgICAgICJiaWRpX3F1ZXVlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImJ5dGVfYXJyYXlfdGVzdC5jYyIsCi0gICAgICAgICJjaXJjdWxhcl9idWZmZXJfdGVzdC5jYyIsCi0gICAgICAgICJvYnNlcnZlcl9yZWdpc3RyeV90ZXN0LmNjIiwKLSAgICAgICAgImluaXRfZmxhZ3NfdGVzdC5jYyIsCi0gICAgICAgICJsaXN0X21hcF90ZXN0LmNjIiwKLSAgICAgICAgImxydV9jYWNoZV90ZXN0LmNjIiwKLSAgICAgICAgIm1ldHJpY19pZF9tYW5hZ2VyX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgIm11bHRpX3ByaW9yaXR5X3F1ZXVlX3Rlc3QuY2MiLAotICAgICAgICAibnVtYmVyc190ZXN0LmNjIiwKLSAgICAgICAgInN0cmluZ3NfdGVzdC5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9CVUlMRC5nbiBiL2dkL2NvbW1vbi9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0ZGFkOS4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc291cmNlX3NldCgiQmx1ZXRvb3RoQ29tbW9uU291cmNlcyIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiaW5pdF9mbGFncy5jYyIsCi0gICAgIm1ldHJpY19pZF9tYW5hZ2VyLmNjIiwKLSAgICAic3RvcF93YXRjaC5jYyIsCi0gICAgInN0cmluZ3MuY2MiLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2Q6Z2RfZGVmYXVsdF9kZXBzIiwKLSAgICAiLy9idDpsaWJidC1wbGF0Zm9ybS1wcm90b3MtbGl0ZSIsCi0gIF0KLX0KZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9iaWRpX3F1ZXVlLmggYi9nZC9jb21tb24vYmlkaV9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmRmMDg1Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9iaWRpX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBURU5RVUVVRSwgdHlwZW5hbWUgVERFUVVFVUU+Ci1jbGFzcyBCaWRpUXVldWVFbmQgOiBwdWJsaWMgOjpibHVldG9vdGg6Om9zOjpJUXVldWVFbnF1ZXVlPFRFTlFVRVVFPiwgcHVibGljIDo6Ymx1ZXRvb3RoOjpvczo6SVF1ZXVlRGVxdWV1ZTxUREVRVUVVRT4gewotIHB1YmxpYzoKLSAgdXNpbmcgRW5xdWV1ZUNhbGxiYWNrID0gQ2FsbGJhY2s8c3RkOjp1bmlxdWVfcHRyPFRFTlFVRVVFPigpPjsKLSAgdXNpbmcgRGVxdWV1ZUNhbGxiYWNrID0gQ2FsbGJhY2s8dm9pZCgpPjsKLQotICBCaWRpUXVldWVFbmQoOjpibHVldG9vdGg6Om9zOjpJUXVldWVFbnF1ZXVlPFRFTlFVRVVFPiogdHgsIDo6Ymx1ZXRvb3RoOjpvczo6SVF1ZXVlRGVxdWV1ZTxUREVRVUVVRT4qIHJ4KQotICAgICAgOiB0eF8odHgpLCByeF8ocngpIHt9Ci0KLSAgdm9pZCBSZWdpc3RlckVucXVldWUoOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBoYW5kbGVyLCBFbnF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlIHsKLSAgICB0eF8tPlJlZ2lzdGVyRW5xdWV1ZShoYW5kbGVyLCBjYWxsYmFjayk7Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXJFbnF1ZXVlKCkgb3ZlcnJpZGUgewotICAgIHR4Xy0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJEZXF1ZXVlKDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogaGFuZGxlciwgRGVxdWV1ZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgcnhfLT5SZWdpc3RlckRlcXVldWUoaGFuZGxlciwgY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyRGVxdWV1ZSgpIG92ZXJyaWRlIHsKLSAgICByeF8tPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8VERFUVVFVUU+IFRyeURlcXVldWUoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHJ4Xy0+VHJ5RGVxdWV1ZSgpOwotICB9Ci0KLSBwcml2YXRlOgotICA6OmJsdWV0b290aDo6b3M6OklRdWV1ZUVucXVldWU8VEVOUVVFVUU+KiB0eF87Ci0gIDo6Ymx1ZXRvb3RoOjpvczo6SVF1ZXVlRGVxdWV1ZTxUREVRVUVVRT4qIHJ4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUVVAsIHR5cGVuYW1lIFRET1dOPgotY2xhc3MgQmlkaVF1ZXVlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJpZGlRdWV1ZShzaXplX3QgY2FwYWNpdHkpCi0gICAgICA6IHVwX3F1ZXVlXyhjYXBhY2l0eSksCi0gICAgICAgIGRvd25fcXVldWVfKGNhcGFjaXR5KSwKLSAgICAgICAgdXBfZW5kXygmZG93bl9xdWV1ZV8sICZ1cF9xdWV1ZV8pLAotICAgICAgICBkb3duX2VuZF8oJnVwX3F1ZXVlXywgJmRvd25fcXVldWVfKSB7fQotCi0gIEJpZGlRdWV1ZUVuZDxURE9XTiwgVFVQPiogR2V0VXBFbmQoKSB7Ci0gICAgcmV0dXJuICZ1cF9lbmRfOwotICB9Ci0KLSAgQmlkaVF1ZXVlRW5kPFRVUCwgVERPV04+KiBHZXREb3duRW5kKCkgewotICAgIHJldHVybiAmZG93bl9lbmRfOwotICB9Ci0KLSBwcml2YXRlOgotICA6OmJsdWV0b290aDo6b3M6OlF1ZXVlPFRVUD4gdXBfcXVldWVfOwotICA6OmJsdWV0b290aDo6b3M6OlF1ZXVlPFRET1dOPiBkb3duX3F1ZXVlXzsKLSAgQmlkaVF1ZXVlRW5kPFRET1dOLCBUVVA+IHVwX2VuZF87Ci0gIEJpZGlRdWV1ZUVuZDxUVVAsIFRET1dOPiBkb3duX2VuZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vYmlkaV9xdWV1ZV91bml0dGVzdC5jYyBiL2dkL2NvbW1vbi9iaWRpX3F1ZXVlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTU5Mjc1Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9iaWRpX3F1ZXVlX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjb21tb24vYmlkaV9xdWV1ZS5oIgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLQotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpUaHJlYWQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBCaWRpUXVldWVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHVwX3RocmVhZF8gPSBuZXcgVGhyZWFkKCJ1cF90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIHVwX2hhbmRsZXJfID0gbmV3IEhhbmRsZXIodXBfdGhyZWFkXyk7Ci0gICAgZG93bl90aHJlYWRfID0gbmV3IFRocmVhZCgiZG93bl90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGRvd25faGFuZGxlcl8gPSBuZXcgSGFuZGxlcihkb3duX3RocmVhZF8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgdXBfaGFuZGxlcl87Ci0gICAgZGVsZXRlIHVwX3RocmVhZF87Ci0gICAgZGVsZXRlIGRvd25faGFuZGxlcl87Ci0gICAgZGVsZXRlIGRvd25fdGhyZWFkXzsKLSAgfQotCi0gIFRocmVhZCogdXBfdGhyZWFkXzsKLSAgSGFuZGxlciogdXBfaGFuZGxlcl87Ci0gIFRocmVhZCogZG93bl90aHJlYWRfOwotICBIYW5kbGVyKiBkb3duX2hhbmRsZXJfOwotfTsKLQotY2xhc3MgQSB7fTsKLQotY2xhc3MgQiB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQj4KLWNsYXNzIFRlc3RCaWRpUXVldWVFbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGVzdEJpZGlRdWV1ZUVuZChCaWRpUXVldWVFbmQ8VEEsIFRCPiogZW5kLCBIYW5kbGVyKiBoYW5kbGVyKSA6IGhhbmRsZXJfKGhhbmRsZXIpLCBlbmRfKGVuZCkge30KLQotICB+VGVzdEJpZGlRdWV1ZUVuZCgpIHsKLSAgICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgfQotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiogU2VuZChUQSogdmFsdWUpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2UgPSBuZXcgc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gICAgaGFuZGxlcl8tPlBvc3QoQmluZE9uY2UoCi0gICAgICAgICZUZXN0QmlkaVF1ZXVlRW5kPFRBLCBUQj46OmhhbmRsZV9zZW5kLAotICAgICAgICBjb21tb246OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZCh2YWx1ZSksCi0gICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwcm9taXNlKSkpOwotICAgIHJldHVybiBwcm9taXNlOwotICB9Ci0KLSAgc3RkOjpwcm9taXNlPFRCKj4qIFJlY2VpdmUoKSB7Ci0gICAgc3RkOjpwcm9taXNlPFRCKj4qIHByb21pc2UgPSBuZXcgc3RkOjpwcm9taXNlPFRCKj4oKTsKLSAgICBoYW5kbGVyXy0+UG9zdCgKLSAgICAgICAgQmluZE9uY2UoJlRlc3RCaWRpUXVldWVFbmQ8VEEsIFRCPjo6aGFuZGxlX3JlY2VpdmUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgY29tbW9uOjpVbnJldGFpbmVkKHByb21pc2UpKSk7Ci0KLSAgICByZXR1cm4gcHJvbWlzZTsKLSAgfQotCi0gIHZvaWQgaGFuZGxlX3NlbmQoVEEqIHZhbHVlLCBzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2UpIHsKLSAgICBlbmRfLT5SZWdpc3RlckVucXVldWUoCi0gICAgICAgIGhhbmRsZXJfLAotICAgICAgICBCaW5kKAotICAgICAgICAgICAgJlRlc3RCaWRpUXVldWVFbmQ8VEEsIFRCPjo6aGFuZGxlX3JlZ2lzdGVyX2VucXVldWUsCi0gICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQodmFsdWUpLAotICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHByb21pc2UpKSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8VEE+IGhhbmRsZV9yZWdpc3Rlcl9lbnF1ZXVlKFRBKiB2YWx1ZSwgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlKSB7Ci0gICAgZW5kXy0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFRBPih2YWx1ZSk7Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9yZWNlaXZlKHN0ZDo6cHJvbWlzZTxUQio+KiBwcm9taXNlKSB7Ci0gICAgZW5kXy0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBoYW5kbGVyXywKLSAgICAgICAgQmluZCgKLSAgICAgICAgICAgICZUZXN0QmlkaVF1ZXVlRW5kPFRBLCBUQj46OmhhbmRsZV9yZWdpc3Rlcl9kZXF1ZXVlLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIGNvbW1vbjo6VW5yZXRhaW5lZChwcm9taXNlKSkpOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfcmVnaXN0ZXJfZGVxdWV1ZShzdGQ6OnByb21pc2U8VEIqPiogcHJvbWlzZSkgewotICAgIGVuZF8tPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgcHJvbWlzZS0+c2V0X3ZhbHVlKGVuZF8tPlRyeURlcXVldWUoKS5nZXQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotICBCaWRpUXVldWVFbmQ8VEEsIFRCPiogZW5kXzsKLX07Ci0KLVRFU1RfRihCaWRpUXVldWVUZXN0LCBzaW1wbGVfdGVzdCkgewotICBCaWRpUXVldWU8QSwgQj4gcXVldWUoMTAwKTsKLSAgVGVzdEJpZGlRdWV1ZUVuZDxCLCBBPiB0ZXN0X3VwKHF1ZXVlLkdldFVwRW5kKCksIHVwX2hhbmRsZXJfKTsKLSAgVGVzdEJpZGlRdWV1ZUVuZDxBLCBCPiB0ZXN0X2Rvd24ocXVldWUuR2V0RG93bkVuZCgpLCBkb3duX2hhbmRsZXJfKTsKLQotICBhdXRvIHNlbmRpbmdfYiA9IG5ldyBCKCk7Ci0gIGF1dG8gcHJvbWlzZV9zZW5kaW5nX2IgPSB0ZXN0X3VwLlNlbmQoc2VuZGluZ19iKTsKLSAgcHJvbWlzZV9zZW5kaW5nX2ItPmdldF9mdXR1cmUoKS53YWl0KCk7Ci0gIGF1dG8gcHJvbWlzZV9yZWNlaXZlX2IgPSB0ZXN0X2Rvd24uUmVjZWl2ZSgpOwotICBFWFBFQ1RfRVEocHJvbWlzZV9yZWNlaXZlX2ItPmdldF9mdXR1cmUoKS5nZXQoKSwgc2VuZGluZ19iKTsKLSAgZGVsZXRlIHByb21pc2VfcmVjZWl2ZV9iOwotICBkZWxldGUgcHJvbWlzZV9zZW5kaW5nX2I7Ci0KLSAgYXV0byBzZW5kaW5nX2EgPSBuZXcgQSgpOwotICBhdXRvIHByb21pc2Vfc2VuZGluZ19hID0gdGVzdF9kb3duLlNlbmQoc2VuZGluZ19hKTsKLSAgcHJvbWlzZV9zZW5kaW5nX2EtPmdldF9mdXR1cmUoKS53YWl0KCk7Ci0gIGF1dG8gcHJvbWlzZV9yZWNlaXZlX2EgPSB0ZXN0X3VwLlJlY2VpdmUoKTsKLSAgRVhQRUNUX0VRKHByb21pc2VfcmVjZWl2ZV9hLT5nZXRfZnV0dXJlKCkuZ2V0KCksIHNlbmRpbmdfYSk7Ci0gIGRlbGV0ZSBwcm9taXNlX3JlY2VpdmVfYTsKLSAgZGVsZXRlIHByb21pc2Vfc2VuZGluZ19hOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9iaW5kLmggYi9nZC9jb21tb24vYmluZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDZkM2QyLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9iaW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6QmluZE9uY2U7Ci11c2luZyBiYXNlOjpJZ25vcmVSZXN1bHQ7Ci0jaWYgZGVmaW5lZChCQVNFX1ZFUikgJiYgQkFTRV9WRVIgPj0gODYwMjIwCi0vLyBUT0RPKGIvMTg5MjkzNjQ2KTogZmluZCBhIHdheSB0byBhdm9pZCBiYXNlOjppbnRlcm5hbC4KLXVzaW5nIGJhc2U6OmludGVybmFsOjpNYWtlVW5ib3VuZFJ1blR5cGU7Ci0jZWxzZQotdXNpbmcgYmFzZTo6TWFrZVVuYm91bmRSdW5UeXBlOwotI2VuZGlmCi11c2luZyBiYXNlOjpPd25lZDsKLXVzaW5nIGJhc2U6OlBhc3NlZDsKLXVzaW5nIGJhc2U6OlJldGFpbmVkUmVmOwotdXNpbmcgYmFzZTo6VW5yZXRhaW5lZDsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1pbmxpbmUgYmFzZTo6Q2FsbGJhY2s8TWFrZVVuYm91bmRSdW5UeXBlPEZ1bmN0b3IsIFQsIEFyZ3MuLi4+PiBCaW5kT24oVCogb2JqLCBGdW5jdG9yJiYgZnVuY3RvciwgQXJncyYmLi4uIGFyZ3MpIHsKLSAgcmV0dXJuIGNvbW1vbjo6QmluZChzdGQ6OmZvcndhcmQ8RnVuY3Rvcj4oZnVuY3RvciksIGNvbW1vbjo6VW5yZXRhaW5lZChvYmopLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vYmxvY2tpbmdfcXVldWUuaCBiL2dkL2NvbW1vbi9ibG9ja2luZ19xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjJjYTA4Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9ibG9ja2luZ19xdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHF1ZXVlPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEJsb2NraW5nUXVldWUgewotIHB1YmxpYzoKLSAgdm9pZCBwdXNoKFQgZGF0YSkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIHF1ZXVlXy5wdXNoKHN0ZDo6bW92ZShkYXRhKSk7Ci0gICAgaWYgKHF1ZXVlXy5zaXplKCkgPT0gMSkgewotICAgICAgbm90X2VtcHR5Xy5ub3RpZnlfYWxsKCk7Ci0gICAgfQotICB9OwotCi0gIFQgdGFrZSgpIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICB3aGlsZSAocXVldWVfLmVtcHR5KCkpIHsKLSAgICAgIG5vdF9lbXB0eV8ud2FpdChsb2NrKTsKLSAgICB9Ci0gICAgVCBkYXRhID0gcXVldWVfLmZyb250KCk7Ci0gICAgcXVldWVfLnBvcCgpOwotICAgIHJldHVybiBkYXRhOwotICB9OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0YWtlKCkgd2lsbCBub3QgYmxvY2sgd2l0aGluIGEgdGltZSBwZXJpb2QKLSAgYm9vbCB3YWl0X3RvX3Rha2Uoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgd2hpbGUgKHF1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICBpZiAobm90X2VtcHR5Xy53YWl0X2Zvcihsb2NrLCB0aW1lKSA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICByZXR1cm4gcXVldWVfLmVtcHR5KCk7Ci0gIH07Ci0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBzdGQ6OnF1ZXVlPFQ+IGVtcHR5OwotICAgIHN0ZDo6c3dhcChxdWV1ZV8sIGVtcHR5KTsKLSAgfTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6cXVldWU8VD4gcXVldWVfOwotICBtdXRhYmxlIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBub3RfZW1wdHlfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL2Jsb2NraW5nX3F1ZXVlX3VuaXR0ZXN0LmNjIGIvZ2QvY29tbW9uL2Jsb2NraW5nX3F1ZXVlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmM5NjMyLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9ibG9ja2luZ19xdWV1ZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL2Jsb2NraW5nX3F1ZXVlLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8dGhyZWFkPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotbmFtZXNwYWNlIHsKLWNsYXNzIEJsb2NraW5nUXVldWVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKHF1ZXVlXy5lbXB0eSgpKTsKLSAgfQotCi0gIC8vIFBvc3Rjb25kaXRpb24gZm9yIGVhY2ggdGVzdCBjYXNlOiBjbGVhciB0aGUgYmxvY2tpbmcgcXVldWUKLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBFWFBFQ1RfVFJVRShxdWV1ZV8uZW1wdHkoKSk7Ci0gIH0KLQotICBCbG9ja2luZ1F1ZXVlPGludD4gcXVldWVfOwotfTsKLQotVEVTVF9GKEJsb2NraW5nUXVldWVUZXN0LCBpbml0aWFsX2VtcHR5KSB7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlXy5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKEJsb2NraW5nUXVldWVUZXN0LCBzYW1lX3RocmVhZF9wdXNoX2FuZF9wb3ApIHsKLSAgaW50IGRhdGEgPSAxOwotICBxdWV1ZV8ucHVzaChkYXRhKTsKLSAgRVhQRUNUX0ZBTFNFKHF1ZXVlXy5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKHF1ZXVlXy50YWtlKCksIGRhdGEpOwotICBFWFBFQ1RfVFJVRShxdWV1ZV8uZW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihCbG9ja2luZ1F1ZXVlVGVzdCwgc2FtZV90aHJlYWRfcHVzaF9hbmRfcG9wX3NlcXVlbnRpYWwpIHsKLSAgZm9yIChpbnQgZGF0YSA9IDA7IGRhdGEgPCAxMDsgZGF0YSsrKSB7Ci0gICAgcXVldWVfLnB1c2goZGF0YSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHF1ZXVlXy5lbXB0eSgpKTsKLSAgICBFWFBFQ1RfRVEocXVldWVfLnRha2UoKSwgZGF0YSk7Ci0gICAgRVhQRUNUX1RSVUUocXVldWVfLmVtcHR5KCkpOwotICB9Ci19Ci0KLVRFU1RfRihCbG9ja2luZ1F1ZXVlVGVzdCwgc2FtZV90aHJlYWRfcHVzaF9hbmRfcG9wX2JhdGNoKSB7Ci0gIGZvciAoaW50IGRhdGEgPSAwOyBkYXRhIDwgMTA7IGRhdGErKykgewotICAgIHF1ZXVlXy5wdXNoKGRhdGEpOwotICB9Ci0gIEVYUEVDVF9GQUxTRShxdWV1ZV8uZW1wdHkoKSk7Ci0gIGZvciAoaW50IGRhdGEgPSAwOyBkYXRhIDwgMTA7IGRhdGErKykgewotICAgIEVYUEVDVF9FUShxdWV1ZV8udGFrZSgpLCBkYXRhKTsKLSAgfQotICBFWFBFQ1RfVFJVRShxdWV1ZV8uZW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihCbG9ja2luZ1F1ZXVlVGVzdCwgY2xlYXJfcXVldWUpIHsKLSAgZm9yIChpbnQgZGF0YSA9IDA7IGRhdGEgPCAxMDsgZGF0YSsrKSB7Ci0gICAgcXVldWVfLnB1c2goZGF0YSk7Ci0gIH0KLSAgRVhQRUNUX0ZBTFNFKHF1ZXVlXy5lbXB0eSgpKTsKLSAgcXVldWVfLmNsZWFyKCk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlXy5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKEJsb2NraW5nUXVldWVUZXN0LCB3YWl0X2Zvcl9ub25fZW1wdHkpIHsKLSAgaW50IGRhdGEgPSAxOwotICBzdGQ6OnRocmVhZCB3YWl0ZXJfdGhyZWFkKFt0aGlzLCBkYXRhXSB7IEVYUEVDVF9FUShxdWV1ZV8udGFrZSgpLCBkYXRhKTsgfSk7Ci0gIHF1ZXVlXy5wdXNoKGRhdGEpOwotICB3YWl0ZXJfdGhyZWFkLmpvaW4oKTsKLSAgRVhQRUNUX1RSVUUocXVldWVfLmVtcHR5KCkpOwotfQotCi1URVNUX0YoQmxvY2tpbmdRdWV1ZVRlc3QsIHdhaXRfdG9fdGFrZV9mYWlsKSB7Ci0gIEVYUEVDVF9GQUxTRShxdWV1ZV8ud2FpdF90b190YWtlKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMykpKTsKLX0KLQotVEVTVF9GKEJsb2NraW5nUXVldWVUZXN0LCB3YWl0X3RvX3Rha2VfYWZ0ZXJfbm9uX2VtcHR5KSB7Ci0gIGludCBkYXRhID0gMTsKLSAgcXVldWVfLnB1c2goZGF0YSk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlXy53YWl0X3RvX3Rha2Uoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzKSkpOwotICBxdWV1ZV8uY2xlYXIoKTsKLX0KLQotVEVTVF9GKEJsb2NraW5nUXVldWVUZXN0LCB3YWl0X3RvX3Rha2VfYmVmb3JlX25vbl9lbXB0eSkgewotICBpbnQgZGF0YSA9IDE7Ci0gIHN0ZDo6dGhyZWFkIHdhaXRlcl90aHJlYWQoW3RoaXNdIHsgRVhQRUNUX1RSVUUocXVldWVfLndhaXRfdG9fdGFrZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKSk7IH0pOwotICBxdWV1ZV8ucHVzaChkYXRhKTsKLSAgd2FpdGVyX3RocmVhZC5qb2luKCk7Ci0gIHF1ZXVlXy5jbGVhcigpOwotfQotCi1URVNUX0YoQmxvY2tpbmdRdWV1ZVRlc3QsIHdhaXRfZm9yX25vbl9lbXB0eV9iYXRjaCkgewotICBzdGQ6OnRocmVhZCB3YWl0ZXJfdGhyZWFkKFt0aGlzXSB7Ci0gICAgZm9yIChpbnQgZGF0YSA9IDA7IGRhdGEgPCAxMDsgZGF0YSsrKSB7Ci0gICAgICBFWFBFQ1RfRVEocXVldWVfLnRha2UoKSwgZGF0YSk7Ci0gICAgfQotICB9KTsKLSAgZm9yIChpbnQgZGF0YSA9IDA7IGRhdGEgPCAxMDsgZGF0YSsrKSB7Ci0gICAgcXVldWVfLnB1c2goZGF0YSk7Ci0gIH0KLSAgd2FpdGVyX3RocmVhZC5qb2luKCk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlXy5lbXB0eSgpKTsKLX0KLQotY2xhc3MgVmVjdG9yQmxvY2tpbmdRdWV1ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgRVhQRUNUX1RSVUUocXVldWVfLmVtcHR5KCkpOwotICB9Ci0KLSAgLy8gUG9zdGNvbmRpdGlvbiBmb3IgZWFjaCB0ZXN0IGNhc2U6IGNsZWFyIHRoZSBibG9ja2luZyBxdWV1ZQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKHF1ZXVlXy5lbXB0eSgpKTsKLSAgfQotCi0gIEJsb2NraW5nUXVldWU8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHF1ZXVlXzsKLX07Ci0KLVRFU1RfRihWZWN0b3JCbG9ja2luZ1F1ZXVlVGVzdCwgc2FtZV90aHJlYWRfcHVzaF9hbmRfcG9wKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgPSB7MSwgMiwgMywgNCwgNSwgNn07Ci0gIHF1ZXVlXy5wdXNoKGRhdGEpOwotICBFWFBFQ1RfRkFMU0UocXVldWVfLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEocXVldWVfLnRha2UoKSwgZGF0YSk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlXy5lbXB0eSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vYnl0ZV9hcnJheS5oIGIvZ2QvY29tbW9uL2J5dGVfYXJyYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyZjUyOS4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vYnl0ZV9hcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAicGFja2V0L2N1c3RvbV9maWVsZF9maXhlZF9zaXplX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0b3JhZ2Uvc2VyaWFsaXphYmxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXRlbXBsYXRlIDxzdGQ6OnNpemVfdCBMRU5HVEg+Ci1jbGFzcyBCeXRlQXJyYXkgOiBwdWJsaWMgcGFja2V0OjpDdXN0b21GaWVsZEZpeGVkU2l6ZUludGVyZmFjZTxCeXRlQXJyYXk8TEVOR1RIPj4sCi0gICAgICAgICAgICAgICAgICBwdWJsaWMgc3RvcmFnZTo6U2VyaWFsaXphYmxlPEJ5dGVBcnJheTxMRU5HVEg+PiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTGVuZ3RoID0gTEVOR1RIOwotICBCeXRlQXJyYXkoKSA9IGRlZmF1bHQ7Ci0gIEJ5dGVBcnJheShjb25zdCB1aW50OF90ICgmZClba0xlbmd0aF0pIHsKLSAgICBzdGQ6OmNvcHkoZCwgZCArIGtMZW5ndGgsIGRhdGEoKSk7Ci0gIH0KLSAgQnl0ZUFycmF5KHN0ZDo6YXJyYXk8dWludDhfdCwga0xlbmd0aD4gYSkgOiBieXRlcyhzdGQ6Om1vdmUoYSkpIHt9Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCBrTGVuZ3RoPiBieXRlcyA9IHt9OwotCi0gIHVpbnQ4X3QqIGRhdGEoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGJ5dGVzLmRhdGEoKTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGJ5dGVzLmRhdGEoKTsKLSAgfQotCi0gIC8vIG9wZXJhdG9ycwotICBib29sIG9wZXJhdG9yPChjb25zdCBCeXRlQXJyYXkmIHJocykgY29uc3QgewotICAgIHJldHVybiBieXRlcyA8IHJocy5ieXRlczsKLSAgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQnl0ZUFycmF5JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gYnl0ZXMgPT0gcmhzLmJ5dGVzOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEJ5dGVBcnJheSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIChyaHMgPCAqdGhpcyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEJ5dGVBcnJheSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPiByaHMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBCeXRlQXJyYXkmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzIDwgcmhzKTsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgQnl0ZUFycmF5JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSByaHMpOwotICB9Ci0KLSAgLy8gc3RvcmFnZTo6U2VyaWFsaXphYmxlIG1ldGhvZHMKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGNvbW1vbjo6VG9IZXhTdHJpbmcoYnl0ZXMuYmVnaW4oKSwgYnl0ZXMuZW5kKCkpOwotICB9Ci0gIHN0YXRpYyBzdGQ6Om9wdGlvbmFsPEJ5dGVBcnJheTxrTGVuZ3RoPj4gRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSkgewotICAgIGlmIChmcm9tLmxlbmd0aCgpICE9IChrTGVuZ3RoICogMikpIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICAgIGF1dG8gdmVjID0gY29tbW9uOjpGcm9tSGV4U3RyaW5nKGZyb20pOwotICAgIGlmICghdmVjKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICBCeXRlQXJyYXk8a0xlbmd0aD4gYnl0ZV9hcnJheSA9IHt9OwotICAgIHN0ZDo6bW92ZSh2ZWMtPmRhdGEoKSwgdmVjLT5kYXRhKCkgKyB2ZWMtPnNpemUoKSwgYnl0ZV9hcnJheS5kYXRhKCkpOwotICAgIHJldHVybiBieXRlX2FycmF5OwotICB9Ci0gIHN0ZDo6c3RyaW5nIFRvTGVnYWN5Q29uZmlnU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBUb1N0cmluZygpOwotICB9Ci0gIHN0YXRpYyBzdGQ6Om9wdGlvbmFsPEJ5dGVBcnJheTxrTGVuZ3RoPj4gRnJvbUxlZ2FjeUNvbmZpZ1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSkgewotICAgIHJldHVybiBGcm9tU3RyaW5nKGZyb20pOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL2J5dGVfYXJyYXlfdGVzdC5jYyBiL2dkL2NvbW1vbi9ieXRlX2FycmF5X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNmIyNzQuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL2J5dGVfYXJyYXlfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjb21tb24vYnl0ZV9hcnJheS5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6Qnl0ZUFycmF5OwotCi1zdGF0aWMgY29uc3QgY2hhciogdGVzdF9ieXRlcyA9ICI0YzY4Mzg0MTM5ZjU3NGQ4MzZiY2YzNGU5ZGZiMDFiZlwwIjsKLXN0YXRpYyB1aW50OF90IHRlc3RfZGF0YVsxNl0gPSB7Ci0gICAgMHg0YywgMHg2OCwgMHgzOCwgMHg0MSwgMHgzOSwgMHhmNSwgMHg3NCwgMHhkOCwgMHgzNiwgMHhiYywgMHhmMywgMHg0ZSwgMHg5ZCwgMHhmYiwgMHgwMSwgMHhiZn07Ci1zdGF0aWMgdWludDhfdCBkYXRhWzE2XSA9IHsKLSAgICAweDRjLCAweDg3LCAweDQ5LCAweGUxLCAweDJlLCAweDU1LCAweDBmLCAweDdmLCAweDYwLCAweDhiLCAweDRmLCAweDk2LCAweGQ3LCAweGM1LCAweGJjLCAweDJhfTsKLQotVEVTVChCeXRlQXJyYXlUZXN0LCB0ZXN0X2NvbnN0cnVjdG9yX2FycmF5KSB7Ci0gIEJ5dGVBcnJheTwxNj4gYnl0ZV9hcnJheShkYXRhKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IEJ5dGVBcnJheTwxNj46OmtMZW5ndGg7IGkrKykgewotICAgIEFTU0VSVF9FUShkYXRhW2ldLCBieXRlX2FycmF5LmJ5dGVzW2ldKTsKLSAgfQotfQotCi1URVNUKEJ5dGVBcnJheVRlc3QsIHRlc3RfZnJvbV9zdHIpIHsKLSAgYXV0byBieXRlX2FycmF5ID0gQnl0ZUFycmF5PDE2Pjo6RnJvbVN0cmluZyh0ZXN0X2J5dGVzKTsKLSAgQVNTRVJUX1RSVUUoYnl0ZV9hcnJheSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCeXRlQXJyYXk8MTY+OjprTGVuZ3RoOyBpKyspIHsKLSAgICBBU1NFUlRfRVEodGVzdF9kYXRhW2ldLCBieXRlX2FycmF5LT5ieXRlc1tpXSk7Ci0gIH0KLX0KLQotVEVTVChCeXRlQXJyYXlUZXN0LCB0ZXN0X3RvX3N0cikgewotICBCeXRlQXJyYXk8MTY+IGJ5dGVfYXJyYXkgPSB7Ci0gICAgICB7MHg0QywgMHg2OCwgMHgzOCwgMHg0MSwgMHgzOSwgMHhmNSwgMHg3NCwgMHhkOCwgMHgzNiwgMHhiYywgMHhmMywgMHg0ZSwgMHg5ZCwgMHhmYiwgMHgwMSwgMHhiZn19OwotICBzdGQ6OnN0cmluZyBzdHIgPSBieXRlX2FycmF5LlRvU3RyaW5nKCk7Ci0gIEFTU0VSVF9TVFJFUShzdHIuY19zdHIoKSwgdGVzdF9ieXRlcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL2NhbGxiYWNrLmggYi9nZC9jb21tb24vY2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiZTY0Mi4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vY2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi11c2luZyBiYXNlOjpDYWxsYmFjazsKLXVzaW5nIGJhc2U6OkNsb3N1cmU7Ci11c2luZyBiYXNlOjpPbmNlQ2FsbGJhY2s7Ci11c2luZyBiYXNlOjpPbmNlQ2xvc3VyZTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL2NhbGxiYWNrX2xpc3QuaCBiL2dkL2NvbW1vbi9jYWxsYmFja19saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYWQ2YjEuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL2NhbGxiYWNrX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfbGlzdC5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIENhbGxiYWNrTGlzdCBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSBjYWxsYmFjayBvbiBwcm92aWRlZCBIYW5kbGVyIHRocmVhZAotCi1FeGFtcGxlIHVzYWdlIGluc2lkZSB5b3VyIGNsYXNzOgotCi1wcml2YXRlOgotICBjb21tb246OkNhbGxiYWNrTGlzdDx2b2lkKGludCk+IGNhbGxiYWNrc19saXN0XzsKLXB1YmxpYzoKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbW1vbjo6Q2FsbGJhY2tMaXN0PHZvaWQoaW50KT46OlN1YnNjcmlwdGlvbj4gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgIGNvbnN0IGJhc2U6OlJlcGVhdGluZ0NhbGxiYWNrPHZvaWQoaW50KT4mIGNiLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIHJldHVybiBjYWxsYmFja3NfbGlzdF8uQWRkKHtjYiwgaGFuZGxlcn0pOwotICB9Ci0KLSAgdm9pZCBOb3RpZnlBbGxDYWxsYmFja3MoaW50IHZhbHVlKSB7Ci0gICAgY2FsbGJhY2tzX2xpc3RfLk5vdGlmeSh2YWx1ZSk7Ci0gIH0KLSovCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLW5hbWVzcGFjZSB7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2tUeXBlPgotc3RydWN0IENhbGxiYWNrV2l0aEhhbmRsZXIgewotICBDYWxsYmFja1dpdGhIYW5kbGVyKGJhc2U6OlJlcGVhdGluZ0NhbGxiYWNrPENhbGxiYWNrVHlwZT4gY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgICAgOiBjYWxsYmFjayhjYWxsYmFjayksIGhhbmRsZXIoaGFuZGxlcikge30KLQotICBib29sIGlzX251bGwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbGxiYWNrLmlzX251bGwoKTsKLSAgfQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgY2FsbGJhY2suUmVzZXQoKTsKLSAgfQotCi0gIGJhc2U6OlJlcGVhdGluZ0NhbGxiYWNrPENhbGxiYWNrVHlwZT4gY2FsbGJhY2s7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTaWc+Ci1jbGFzcyBDYWxsYmFja0xpc3Q7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLWNsYXNzIENhbGxiYWNrTGlzdDx2b2lkKEFyZ3MuLi4pPiA6IHB1YmxpYyBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tMaXN0QmFzZTxDYWxsYmFja1dpdGhIYW5kbGVyPHZvaWQoQXJncy4uLik+PiB7Ci0gcHVibGljOgotICB1c2luZyBDYWxsYmFja1R5cGUgPSBDYWxsYmFja1dpdGhIYW5kbGVyPHZvaWQoQXJncy4uLik+OwotICBDYWxsYmFja0xpc3QoKSA9IGRlZmF1bHQ7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBSdW5BcmdzPgotICB2b2lkIE5vdGlmeShSdW5BcmdzJiYuLi4gYXJncykgewotICAgIGF1dG8gaXQgPSB0aGlzLT5HZXRJdGVyYXRvcigpOwotICAgIENhbGxiYWNrVHlwZSogY2I7Ci0gICAgd2hpbGUgKChjYiA9IGl0LkdldE5leHQoKSkgIT0gbnVsbHB0cikgewotICAgICAgY2ItPmhhbmRsZXItPlBvc3QoYmFzZTo6QmluZChjYi0+Y2FsbGJhY2ssIGFyZ3MuLi4pKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDYWxsYmFja0xpc3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL2NpcmN1bGFyX2J1ZmZlci5oIGIvZ2QvY29tbW9uL2NpcmN1bGFyX2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ2OTcyLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9jaXJjdWxhcl9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHF1ZXVlPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENpcmN1bGFyQnVmZmVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENpcmN1bGFyQnVmZmVyKHNpemVfdCBzaXplKTsKLQotICAvLyBQdXNoIG9uZSBpdGVtIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKLSAgdm9pZCBQdXNoKFQgaXRlbSk7Ci0gIC8vIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGFuZCByZXR1cm4gaXQgYXMgYSB2ZWN0b3IKLSAgc3RkOjp2ZWN0b3I8VD4gUHVsbCgpIGNvbnN0OwotICAvLyBEcmFpbiBldmVyeXRoaW5nIGZyb20gdGhlIGNpcmN1bGFyIGJ1ZmZlciBhbmQgcmV0dXJuIHRoZW0gYXMgYSB2ZWN0b3IKLSAgc3RkOjp2ZWN0b3I8VD4gRHJhaW4oKTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IHNpemVfdCBzaXplXzsKLSAgc3RkOjpkZXF1ZTxUPiBxdWV1ZV87Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci19OwotCi1jbGFzcyBUaW1lc3RhbXBlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGxvbmcgbG9uZyBHZXRUaW1lc3RhbXAoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgflRpbWVzdGFtcGVyKCkge30KLX07Ci0KLWNsYXNzIFRpbWVzdGFtcGVySW5NaWxsaXNlY29uZHMgOiBwdWJsaWMgVGltZXN0YW1wZXIgewotIHB1YmxpYzoKLSAgbG9uZyBsb25nIEdldFRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKQotICAgICAgICAuY291bnQoKTsKLSAgfQotICB2aXJ0dWFsIH5UaW1lc3RhbXBlckluTWlsbGlzZWNvbmRzKCkge30KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFRpbWVzdGFtcGVkRW50cnkgewotICBsb25nIGxvbmcgdGltZXN0YW1wOwotICBUIGVudHJ5OwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyIDogcHVibGljIENpcmN1bGFyQnVmZmVyPFRpbWVzdGFtcGVkRW50cnk8VD4+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFRpbWVzdGFtcGVkQ2lyY3VsYXJCdWZmZXIoCi0gICAgICBzaXplX3Qgc2l6ZSwgc3RkOjp1bmlxdWVfcHRyPFRpbWVzdGFtcGVyPiB0aW1lc3RhbXBlciA9IHN0ZDo6bWFrZV91bmlxdWU8VGltZXN0YW1wZXJJbk1pbGxpc2Vjb25kcz4oKSk7Ci0KLSAgdm9pZCBQdXNoKFQgaXRlbSk7Ci0gIHN0ZDo6dmVjdG9yPFRpbWVzdGFtcGVkRW50cnk8VD4+IFB1bGwoKSBjb25zdDsKLSAgc3RkOjp2ZWN0b3I8VGltZXN0YW1wZWRFbnRyeTxUPj4gRHJhaW4oKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxUaW1lc3RhbXBlcj4gdGltZXN0YW1wZXJfe3N0ZDo6bWFrZV91bmlxdWU8VGltZXN0YW1wZXJJbk1pbGxpc2Vjb25kcz4oKX07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYmx1ZXRvb3RoOjpjb21tb246OkNpcmN1bGFyQnVmZmVyPFQ+OjpDaXJjdWxhckJ1ZmZlcihzaXplX3Qgc2l6ZSkgOiBzaXplXyhzaXplKSB7fQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgYmx1ZXRvb3RoOjpjb21tb246OkNpcmN1bGFyQnVmZmVyPFQ+OjpQdXNoKGNvbnN0IFQgaXRlbSkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcXVldWVfLnB1c2hfYmFjayhpdGVtKTsKLSAgd2hpbGUgKHF1ZXVlXy5zaXplKCkgPiBzaXplXykgewotICAgIHF1ZXVlXy5wb3BfZnJvbnQoKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6dmVjdG9yPFQ+IGJsdWV0b290aDo6Y29tbW9uOjpDaXJjdWxhckJ1ZmZlcjxUPjo6UHVsbCgpIGNvbnN0IHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHJldHVybiBzdGQ6OnZlY3RvcjxUPihxdWV1ZV8uY2JlZ2luKCksIHF1ZXVlXy5jZW5kKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6dmVjdG9yPFQ+IGJsdWV0b290aDo6Y29tbW9uOjpDaXJjdWxhckJ1ZmZlcjxUPjo6RHJhaW4oKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBzdGQ6OnZlY3RvcjxUPiBpdGVtcyhzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihxdWV1ZV8uYmVnaW4oKSksIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHF1ZXVlXy5lbmQoKSkpOwotICBxdWV1ZV8uY2xlYXIoKTsKLSAgcmV0dXJuIGl0ZW1zOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJsdWV0b290aDo6Y29tbW9uOjpUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyPFQ+OjpUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyKAotICAgIHNpemVfdCBzaXplLCBzdGQ6OnVuaXF1ZV9wdHI8VGltZXN0YW1wZXI+IHRpbWVzdGFtcGVyKQotICAgIDogQ2lyY3VsYXJCdWZmZXI8VGltZXN0YW1wZWRFbnRyeTxUPj4oc2l6ZSksIHRpbWVzdGFtcGVyXyhzdGQ6Om1vdmUodGltZXN0YW1wZXIpKSB7fQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgYmx1ZXRvb3RoOjpjb21tb246OlRpbWVzdGFtcGVkQ2lyY3VsYXJCdWZmZXI8VD46OlB1c2goY29uc3QgVCBpdGVtKSB7Ci0gIFRpbWVzdGFtcGVkRW50cnk8VD4gdGltZXN0YW1wZWRfZW50cnl7dGltZXN0YW1wZXJfLT5HZXRUaW1lc3RhbXAoKSwgaXRlbX07Ci0gIGJsdWV0b290aDo6Y29tbW9uOjpDaXJjdWxhckJ1ZmZlcjxUaW1lc3RhbXBlZEVudHJ5PFQ+Pjo6UHVzaCh0aW1lc3RhbXBlZF9lbnRyeSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjp2ZWN0b3I8c3RydWN0IGJsdWV0b290aDo6Y29tbW9uOjpUaW1lc3RhbXBlZEVudHJ5PFQ+PiBibHVldG9vdGg6OmNvbW1vbjo6VGltZXN0YW1wZWRDaXJjdWxhckJ1ZmZlcjxUPjo6UHVsbCgpCi0gICAgY29uc3QgewotICByZXR1cm4gYmx1ZXRvb3RoOjpjb21tb246OkNpcmN1bGFyQnVmZmVyPFRpbWVzdGFtcGVkRW50cnk8VD4+OjpQdWxsKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjp2ZWN0b3I8c3RydWN0IGJsdWV0b290aDo6Y29tbW9uOjpUaW1lc3RhbXBlZEVudHJ5PFQ+PiBibHVldG9vdGg6OmNvbW1vbjo6VGltZXN0YW1wZWRDaXJjdWxhckJ1ZmZlcjxUPjo6RHJhaW4oKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6Q2lyY3VsYXJCdWZmZXI8VGltZXN0YW1wZWRFbnRyeTxUPj46OkRyYWluKCk7Ci19CmRpZmYgLS1naXQgYS9nZC9jb21tb24vY2lyY3VsYXJfYnVmZmVyX3Rlc3QuY2MgYi9nZC9jb21tb24vY2lyY3VsYXJfYnVmZmVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjcyMDcuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL2NpcmN1bGFyX2J1ZmZlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImNvbW1vbi9jaXJjdWxhcl9idWZmZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1sb25nIGxvbmcgdGltZXN0YW1wX3swfTsKLXN0cnVjdCBUZXN0VGltZXN0YW1wZXIgOiBwdWJsaWMgYmx1ZXRvb3RoOjpjb21tb246OlRpbWVzdGFtcGVyIHsKLSAgdmlydHVhbCBsb25nIGxvbmcgR2V0VGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiB0aW1lc3RhbXBfKys7Ci0gIH0KLX07Ci0KLVRFU1QoQ2lyY3VsYXJCdWZmZXJUZXN0LCBzaW1wbGUpIHsKLSAgYmx1ZXRvb3RoOjpjb21tb246OlRpbWVzdGFtcGVkQ2lyY3VsYXJCdWZmZXI8c3RkOjpzdHJpbmc+IGJ1ZmZlcigxMCk7Ci0KLSAgYnVmZmVyLlB1c2goc3RkOjpzdHJpbmcoIk9uZSIpKTsKLSAgYnVmZmVyLlB1c2goc3RkOjpzdHJpbmcoIlR3byIpKTsKLSAgYnVmZmVyLlB1c2goc3RkOjpzdHJpbmcoIlRocmVlIikpOwotCi0gIGF1dG8gdmVjID0gYnVmZmVyLlB1bGwoKTsKLQotICBBU1NFUlRfU1RSRVEoIk9uZSIsIHZlY1swXS5lbnRyeS5jX3N0cigpKTsKLSAgQVNTRVJUX1NUUkVRKCJUd28iLCB2ZWNbMV0uZW50cnkuY19zdHIoKSk7Ci0gIEFTU0VSVF9TVFJFUSgiVGhyZWUiLCB2ZWNbMl0uZW50cnkuY19zdHIoKSk7Ci0KLSAgYXV0byB2ZWMyID0gYnVmZmVyLlB1bGwoKTsKLQotICBBU1NFUlRfRkFMU0UodmVjMi5lbXB0eSgpKTsKLX0KLQotVEVTVChDaXJjdWxhckJ1ZmZlclRlc3QsIHNpbXBsZV9kcmFpbikgewotICBibHVldG9vdGg6OmNvbW1vbjo6VGltZXN0YW1wZWRDaXJjdWxhckJ1ZmZlcjxzdGQ6OnN0cmluZz4gYnVmZmVyKDEwKTsKLQotICBidWZmZXIuUHVzaChzdGQ6OnN0cmluZygiT25lIikpOwotICBidWZmZXIuUHVzaChzdGQ6OnN0cmluZygiVHdvIikpOwotICBidWZmZXIuUHVzaChzdGQ6OnN0cmluZygiVGhyZWUiKSk7Ci0KLSAgYXV0byB2ZWMgPSBidWZmZXIuRHJhaW4oKTsKLQotICBBU1NFUlRfU1RSRVEoIk9uZSIsIHZlY1swXS5lbnRyeS5jX3N0cigpKTsKLSAgQVNTRVJUX1NUUkVRKCJUd28iLCB2ZWNbMV0uZW50cnkuY19zdHIoKSk7Ci0gIEFTU0VSVF9TVFJFUSgiVGhyZWUiLCB2ZWNbMl0uZW50cnkuY19zdHIoKSk7Ci0KLSAgYXV0byB2ZWMyID0gYnVmZmVyLlB1bGwoKTsKLQotICBBU1NFUlRfVFJVRSh2ZWMyLmVtcHR5KCkpOwotfQotCi1URVNUKENpcmN1bGFyQnVmZmVyVGVzdCwgdGVzdF90aW1lc3RhbXBzKSB7Ci0gIGJsdWV0b290aDo6Y29tbW9uOjpUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyPHN0ZDo6c3RyaW5nPiBidWZmZXIoMTAsIHN0ZDo6bWFrZV91bmlxdWU8VGVzdFRpbWVzdGFtcGVyPigpKTsKLQotICBidWZmZXIuUHVzaChzdGQ6OnN0cmluZygiT25lIikpOwotICBidWZmZXIuUHVzaChzdGQ6OnN0cmluZygiVHdvIikpOwotICBidWZmZXIuUHVzaChzdGQ6OnN0cmluZygiVGhyZWUiKSk7Ci0KLSAgYXV0byB2ZWMgPSBidWZmZXIuUHVsbCgpOwotICBsb25nIGxvbmcgdGltZXN0YW1wID0gMDsKLSAgZm9yIChhdXRvIHYgOiB2ZWMpIHsKLSAgICBBU1NFUlRfRVEodGltZXN0YW1wLCB2LnRpbWVzdGFtcCk7Ci0gICAgdGltZXN0YW1wKys7Ci0gIH0KLX0KLQotVEVTVChDaXJjdWxhckJ1ZmZlclRlc3QsIG1heF90aW1lc3RhbXBzKSB7Ci0gIGJsdWV0b290aDo6Y29tbW9uOjpUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyPHN0ZDo6c3RyaW5nPiBidWZmZXIoMTApOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0X2RhdGE7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAgKyAxOyBpKyspIHsKLSAgICBjaGFyIGJ1ZlsyNTVdOwotICAgIHNucHJpbnRmKGJ1ZiwgMjU1LCAidmFsdWU6JWQiLCBpKTsKLSAgICB0ZXN0X2RhdGEucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGJ1ZikpOwotICAgIGJ1ZmZlci5QdXNoKHN0ZDo6c3RyaW5nKGJ1ZikpOwotICB9Ci0KLSAgYXV0byB2ZWMgPSBidWZmZXIuUHVsbCgpOwotICBBU1NFUlRfRVEoMTAsIHZlYy5zaXplKCkpOwotCi0gIGludCBpID0gMCArIDE7Ci0gIGZvciAoYXV0byB2IDogdmVjKSB7Ci0gICAgQVNTRVJUX0VRKHRlc3RfZGF0YVtpXSwgdi5lbnRyeS5jX3N0cigpKTsKLSAgICBpKys7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9jb250ZXh0dWFsX2NhbGxiYWNrLmggYi9nZC9jb21tb24vY29udGV4dHVhbF9jYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzkzNTI5Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9jb250ZXh0dWFsX2NhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi1jbGFzcyBJUG9zdGFibGVDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklQb3N0YWJsZUNvbnRleHQoKXt9OwotICB2aXJ0dWFsIHZvaWQgUG9zdChPbmNlQ2xvc3VyZSBjbG9zdXJlKSA9IDA7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4KLWNsYXNzIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s7Ci0KLS8vIEEgY2FsbGJhY2sgYm91bmQgdG8gYW4gZXhlY3V0aW9uIGNvbnRleHQgdGhhdCBjYW4gYmUgaW52b2tlZCBvbmx5IG9uY2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4KLWNsYXNzIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s8UihBcmdzLi4uKT4gewotIHB1YmxpYzoKLSAgQ29udGV4dHVhbE9uY2VDYWxsYmFjayhjb21tb246Ok9uY2VDYWxsYmFjazxSKEFyZ3MuLi4pPiYmIGNhbGxiYWNrLCBJUG9zdGFibGVDb250ZXh0KiBjb250ZXh0KQotICAgICAgOiBjYWxsYmFja18oc3RkOjptb3ZlKGNhbGxiYWNrKSksIGNvbnRleHRfKGNvbnRleHQpIHt9Ci0KLSAgY29uc3RleHByIENvbnRleHR1YWxPbmNlQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbnRleHR1YWxPbmNlQ2FsbGJhY2spOwotCi0gIENvbnRleHR1YWxPbmNlQ2FsbGJhY2soQ29udGV4dHVhbE9uY2VDYWxsYmFjayYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0gIENvbnRleHR1YWxPbmNlQ2FsbGJhY2smIG9wZXJhdG9yPShDb250ZXh0dWFsT25jZUNhbGxiYWNrJiYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLQotICB2b2lkIEludm9rZShBcmdzLi4uIGFyZ3MpIHsKLSAgICBjb250ZXh0Xy0+UG9zdChjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShjYWxsYmFja18pLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pKTsKLSAgfQotCi0gIHZvaWQgSW52b2tlSWZOb3RFbXB0eShBcmdzLi4uIGFyZ3MpIHsKLSAgICBpZiAoY29udGV4dF8gIT0gbnVsbHB0cikgewotICAgICAgY29udGV4dF8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShzdGQ6Om1vdmUoY2FsbGJhY2tfKSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBJc0VtcHR5KCkgewotICAgIHJldHVybiBjb250ZXh0XyA9PSBudWxscHRyOwotICB9Ci0KLSBwcml2YXRlOgotICBjb21tb246Ok9uY2VDYWxsYmFjazxSKEFyZ3MuLi4pPiBjYWxsYmFja187Ci0gIElQb3N0YWJsZUNvbnRleHQqIGNvbnRleHRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1jbGFzcyBDb250ZXh0dWFsQ2FsbGJhY2s7Ci0KLS8vIEEgY2FsbGJhY2sgYm91bmQgdG8gYW4gZXhlY3V0aW9uIGNvbnRleHQgdGhhdCBjYW4gYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBBcmdzPgotY2xhc3MgQ29udGV4dHVhbENhbGxiYWNrPFIoQXJncy4uLik+IHsKLSBwdWJsaWM6Ci0gIENvbnRleHR1YWxDYWxsYmFjayhjb21tb246OkNhbGxiYWNrPFIoQXJncy4uLik+JiYgY2FsbGJhY2ssIElQb3N0YWJsZUNvbnRleHQqIGNvbnRleHQpCi0gICAgICA6IGNhbGxiYWNrXyhzdGQ6Om1vdmUoY2FsbGJhY2spKSwgY29udGV4dF8oY29udGV4dCkge30KLQotICBjb25zdGV4cHIgQ29udGV4dHVhbENhbGxiYWNrKCkgPSBkZWZhdWx0OwotCi0gIENvbnRleHR1YWxDYWxsYmFjayhjb25zdCBDb250ZXh0dWFsQ2FsbGJhY2smKSA9IGRlZmF1bHQ7Ci0gIENvbnRleHR1YWxDYWxsYmFjayYgb3BlcmF0b3I9KGNvbnN0IENvbnRleHR1YWxDYWxsYmFjayYpID0gZGVmYXVsdDsKLSAgQ29udGV4dHVhbENhbGxiYWNrKENvbnRleHR1YWxDYWxsYmFjayYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0gIENvbnRleHR1YWxDYWxsYmFjayYgb3BlcmF0b3I9KENvbnRleHR1YWxDYWxsYmFjayYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBJbnZva2UoQXJncy4uLiBhcmdzKSB7Ci0gICAgY29udGV4dF8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShjYWxsYmFja18sIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotICB9Ci0KLSAgdm9pZCBJbnZva2VJZk5vdEVtcHR5KEFyZ3MuLi4gYXJncykgewotICAgIGlmIChjb250ZXh0XyAhPSBudWxscHRyKSB7Ci0gICAgICBjb250ZXh0Xy0+UG9zdChjb21tb246OkJpbmRPbmNlKGNhbGxiYWNrXywgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBJc0VtcHR5KCkgewotICAgIHJldHVybiBjb250ZXh0XyA9PSBudWxscHRyOwotICB9Ci0KLSBwcml2YXRlOgotICBjb21tb246OkNhbGxiYWNrPFIoQXJncy4uLik+IGNhbGxiYWNrXzsKLSAgSVBvc3RhYmxlQ29udGV4dCogY29udGV4dF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vaW5pdF9mbGFncy5jYyBiL2dkL2NvbW1vbi9pbml0X2ZsYWdzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE5YWE2Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9pbml0X2ZsYWdzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJpbml0X2ZsYWdzLmgiCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLWJvb2wgSW5pdEZsYWdzOjpsb2dnaW5nX2RlYnVnX2VuYWJsZWRfZm9yX2FsbCA9IGZhbHNlOwotaW50IEluaXRGbGFnczo6aGNpX2FkYXB0ZXIgPSAwOwotc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBJbml0RmxhZ3M6OmxvZ2dpbmdfZGVidWdfZXhwbGljaXRfdGFnX3NldHRpbmdzID0ge307Ci0KLWJvb2wgUGFyc2VCb29sRmxhZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZsYWdfcGFpciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWcsIGJvb2wqIHZhcmlhYmxlKSB7Ci0gIGlmIChmbGFnICE9IGZsYWdfcGFpclswXSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIHZhbHVlID0gQm9vbEZyb21TdHJpbmcoZmxhZ19wYWlyWzFdKTsKLSAgaWYgKCF2YWx1ZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmFyaWFibGUgPSAqdmFsdWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlSW50RmxhZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZsYWdfcGFpciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWcsIGludCogdmFyaWFibGUpIHsKLSAgaWYgKGZsYWcgIT0gZmxhZ19wYWlyWzBdKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8gdmFsdWUgPSBJbnQ2NEZyb21TdHJpbmcoZmxhZ19wYWlyWzFdKTsKLSAgaWYgKCF2YWx1ZSB8fCAqdmFsdWUgPiBJTlQzMl9NQVgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqdmFyaWFibGUgPSAqdmFsdWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEluaXRGbGFnczo6TG9hZChjb25zdCBjaGFyKiogZmxhZ3MpIHsKLSAgY29uc3QgY2hhcioqIGZsYWdzX2NvcHkgPSBmbGFnczsKLSAgU2V0QWxsKGZhbHNlKTsKLSAgd2hpbGUgKGZsYWdzICE9IG51bGxwdHIgJiYgKmZsYWdzICE9IG51bGxwdHIpIHsKLSAgICBzdGQ6OnN0cmluZyBmbGFnX2VsZW1lbnQgPSAqZmxhZ3M7Ci0gICAgYXV0byBmbGFnX3BhaXIgPSBTdHJpbmdTcGxpdChmbGFnX2VsZW1lbnQsICI9IiwgMik7Ci0gICAgaWYgKGZsYWdfcGFpci5zaXplKCkgIT0gMikgewotICAgICAgZmxhZ3MrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIFBhcnNlIGFkYXB0ZXIgaW5kZXggKGRlZmF1bHRzIHRvIDApCi0gICAgUGFyc2VJbnRGbGFnKGZsYWdfcGFpciwgIi0taGNpIiwgJmhjaV9hZGFwdGVyKTsKLQotICAgIFBhcnNlQm9vbEZsYWcoZmxhZ19wYWlyLCAiSU5JVF9sb2dnaW5nX2RlYnVnX2VuYWJsZWRfZm9yX2FsbCIsICZsb2dnaW5nX2RlYnVnX2VuYWJsZWRfZm9yX2FsbCk7Ci0gICAgaWYgKCJJTklUX2xvZ2dpbmdfZGVidWdfZW5hYmxlZF9mb3JfdGFncyIgPT0gZmxhZ19wYWlyWzBdKSB7Ci0gICAgICBhdXRvIHRhZ3MgPSBTdHJpbmdTcGxpdChmbGFnX3BhaXJbMV0sICIsIik7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhZyA6IHRhZ3MpIHsKLSAgICAgICAgYXV0byBzZXR0aW5nID0gbG9nZ2luZ19kZWJ1Z19leHBsaWNpdF90YWdfc2V0dGluZ3MuZmluZCh0YWcpOwotICAgICAgICBpZiAoc2V0dGluZyA9PSBsb2dnaW5nX2RlYnVnX2V4cGxpY2l0X3RhZ19zZXR0aW5ncy5lbmQoKSkgewotICAgICAgICAgIGxvZ2dpbmdfZGVidWdfZXhwbGljaXRfdGFnX3NldHRpbmdzLmluc2VydF9vcl9hc3NpZ24odGFnLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoIklOSVRfbG9nZ2luZ19kZWJ1Z19kaXNhYmxlZF9mb3JfdGFncyIgPT0gZmxhZ19wYWlyWzBdKSB7Ci0gICAgICBhdXRvIHRhZ3MgPSBTdHJpbmdTcGxpdChmbGFnX3BhaXJbMV0sICIsIik7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhZyA6IHRhZ3MpIHsKLSAgICAgICAgbG9nZ2luZ19kZWJ1Z19leHBsaWNpdF90YWdfc2V0dGluZ3MuaW5zZXJ0X29yX2Fzc2lnbih0YWcsIGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmxhZ3MrKzsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsb2dnaW5nX2RlYnVnX2VuYWJsZWRfdGFnczsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxvZ2dpbmdfZGVidWdfZGlzYWJsZWRfdGFnczsKLSAgZm9yIChjb25zdCBhdXRvJiB0YWdfc2V0dGluZyA6IGxvZ2dpbmdfZGVidWdfZXhwbGljaXRfdGFnX3NldHRpbmdzKSB7Ci0gICAgaWYgKHRhZ19zZXR0aW5nLnNlY29uZCkgewotICAgICAgbG9nZ2luZ19kZWJ1Z19lbmFibGVkX3RhZ3MuZW1wbGFjZV9iYWNrKHRhZ19zZXR0aW5nLmZpcnN0KTsKLSAgICB9IGVsc2UgewotICAgICAgbG9nZ2luZ19kZWJ1Z19kaXNhYmxlZF90YWdzLmVtcGxhY2VfYmFjayh0YWdfc2V0dGluZy5maXJzdCk7Ci0gICAgfQotICB9Ci0KLSAgZmxhZ3MgPSBmbGFnc19jb3B5OwotICBydXN0OjpWZWM8cnVzdDo6U3RyaW5nPiBydXN0ZWRfZmxhZ3MgPSBydXN0OjpWZWM8cnVzdDo6U3RyaW5nPigpOwotICB3aGlsZSAoZmxhZ3MgIT0gbnVsbHB0ciAmJiAqZmxhZ3MgIT0gbnVsbHB0cikgewotICAgIHJ1c3RlZF9mbGFncy5wdXNoX2JhY2socnVzdDo6U3RyaW5nKCpmbGFncykpOwotICAgIGZsYWdzKys7Ci0gIH0KLSAgaW5pdF9mbGFnczo6bG9hZChzdGQ6Om1vdmUocnVzdGVkX2ZsYWdzKSk7Ci19Ci0KLXZvaWQgSW5pdEZsYWdzOjpTZXRBbGwoYm9vbCB2YWx1ZSkgewotICBsb2dnaW5nX2RlYnVnX2VuYWJsZWRfZm9yX2FsbCA9IHZhbHVlOwotICBsb2dnaW5nX2RlYnVnX2V4cGxpY2l0X3RhZ19zZXR0aW5ncy5jbGVhcigpOwotfQotCi12b2lkIEluaXRGbGFnczo6U2V0QWxsRm9yVGVzdGluZygpIHsKLSAgaW5pdF9mbGFnczo6c2V0X2FsbF9mb3JfdGVzdGluZygpOwotICBTZXRBbGwodHJ1ZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9pbml0X2ZsYWdzLmZicyBiL2dkL2NvbW1vbi9pbml0X2ZsYWdzLmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5ZDIzZC4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vaW5pdF9mbGFncy5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1uYW1lc3BhY2UgYmx1ZXRvb3RoLmNvbW1vbjsKLQotYXR0cmlidXRlICJwcml2YWN5IjsKLQotdGFibGUgSW5pdEZsYWdzRGF0YSB7Ci0gICAgdGl0bGU6c3RyaW5nOwotICAgIGdkX2FkdmVydGlzaW5nX2VuYWJsZWQ6Ym9vbDsKLSAgICBnZF9zY2FubmluZ19lbmFibGVkOmJvb2w7Ci0gICAgZ2Rfc2VjdXJpdHlfZW5hYmxlZDpib29sOwotICAgIGdkX2FjbF9lbmFibGVkOmJvb2w7Ci0gICAgZ2RfaGNpX2VuYWJsZWQ6Ym9vbDsKLSAgICBnZF9jb250cm9sbGVyX2VuYWJsZWQ6Ym9vbDsKLSAgICBnZF9jb3JlX2VuYWJsZWQ6Ym9vbDsKLSAgICBidGFhX2hjaV9sb2dfZW5hYmxlZDpib29sOwotfQotCi1yb290X3R5cGUgSW5pdEZsYWdzRGF0YTsKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9pbml0X2ZsYWdzLmggYi9nZC9jb21tb24vaW5pdF9mbGFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBlNGY1Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9pbml0X2ZsYWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgInNyYy9pbml0X2ZsYWdzLnJzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLWNsYXNzIEluaXRGbGFncyBmaW5hbCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBMb2FkKGNvbnN0IGNoYXIqKiBmbGFncyk7Ci0KLSAgaW5saW5lIHN0YXRpYyBib29sIElzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZyhjb25zdCBzdGQ6OnN0cmluZyYgdGFnKSB7Ci0gICAgYXV0byB0YWdfc2V0dGluZyA9IGxvZ2dpbmdfZGVidWdfZXhwbGljaXRfdGFnX3NldHRpbmdzLmZpbmQodGFnKTsKLSAgICBpZiAodGFnX3NldHRpbmcgIT0gbG9nZ2luZ19kZWJ1Z19leHBsaWNpdF90YWdfc2V0dGluZ3MuZW5kKCkpIHsKLSAgICAgIHJldHVybiB0YWdfc2V0dGluZy0+c2Vjb25kOwotICAgIH0KLSAgICByZXR1cm4gbG9nZ2luZ19kZWJ1Z19lbmFibGVkX2Zvcl9hbGw7Ci0gIH0KLQotICBpbmxpbmUgc3RhdGljIGJvb2wgSXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yQWxsKCkgewotICAgIHJldHVybiBsb2dnaW5nX2RlYnVnX2VuYWJsZWRfZm9yX2FsbDsKLSAgfQotCi0gIGlubGluZSBzdGF0aWMgaW50IEdldEFkYXB0ZXJJbmRleCgpIHsKLSAgICByZXR1cm4gaGNpX2FkYXB0ZXI7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBTZXRBbGxGb3JUZXN0aW5nKCk7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgdm9pZCBTZXRBbGwoYm9vbCB2YWx1ZSk7Ci0gIHN0YXRpYyBib29sIGxvZ2dpbmdfZGVidWdfZW5hYmxlZF9mb3JfYWxsOwotICBzdGF0aWMgaW50IGhjaV9hZGFwdGVyOwotICAvLyBzYXZlIGJvdGggbG9nIGFsbG93IGxpc3QgYW5kIGJsb2NrIGxpc3QgaW4gdGhlIG1hcCB0byBzYXZlIGhhc2hpbmcgdGltZQotICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBsb2dnaW5nX2RlYnVnX2V4cGxpY2l0X3RhZ19zZXR0aW5nczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9pbml0X2ZsYWdzX3Rlc3QuY2MgYi9nZC9jb21tb24vaW5pdF9mbGFnc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJhYmNjLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9pbml0X2ZsYWdzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY29tbW9uL2luaXRfZmxhZ3MuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M7Ci0KLVRFU1QoSW5pdEZsYWdzVGVzdCwgdGVzdF9lbmFibGVfZGVidWdfbG9nZ2luZ19mb3JfYWxsKSB7Ci0gIGNvbnN0IGNoYXIqIGlucHV0W10gPSB7IklOSVRfbG9nZ2luZ19kZWJ1Z19lbmFibGVkX2Zvcl9hbGw9dHJ1ZSIsIG51bGxwdHJ9OwotICBJbml0RmxhZ3M6OkxvYWQoaW5wdXQpOwotICBBU1NFUlRfVFJVRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZygiZm9vIikpOwotICBBU1NFUlRfVFJVRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZygiYmFyIikpOwotICBBU1NFUlRfVFJVRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvckFsbCgpKTsKLX0KLQotVEVTVChJbml0RmxhZ3NUZXN0LCB0ZXN0X2VuYWJsZV9kZWJ1Z19sb2dnaW5nX2Zvcl90YWdzKSB7Ci0gIGNvbnN0IGNoYXIqIGlucHV0W10gPSB7IklOSVRfbG9nZ2luZ19kZWJ1Z19lbmFibGVkX2Zvcl90YWdzPWZvbyxiYXIsaGVsbG8iLCBudWxscHRyfTsKLSAgSW5pdEZsYWdzOjpMb2FkKGlucHV0KTsKLSAgQVNTRVJUX1RSVUUoSW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoImZvbyIpKTsKLSAgQVNTRVJUX1RSVUUoSW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoImJhciIpKTsKLSAgQVNTRVJUX1RSVUUoSW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoImhlbGxvIikpOwotICBBU1NFUlRfRkFMU0UoSW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoIkZvbyIpKTsKLSAgQVNTRVJUX0ZBTFNFKEluaXRGbGFnczo6SXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yQWxsKCkpOwotfQotCi1URVNUKEluaXRGbGFnc1Rlc3QsIHRlc3RfZGlzYWJsZV9kZWJ1Z19sb2dnaW5nX2Zvcl90YWdzKSB7Ci0gIGNvbnN0IGNoYXIqIGlucHV0W10gPSB7IklOSVRfbG9nZ2luZ19kZWJ1Z19kaXNhYmxlZF9mb3JfdGFncz1mb28sYmFyLGhlbGxvIiwgbnVsbHB0cn07Ci0gIEluaXRGbGFnczo6TG9hZChpbnB1dCk7Ci0gIEFTU0VSVF9GQUxTRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZygiZm9vIikpOwotICBBU1NFUlRfRkFMU0UoSW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoImJhciIpKTsKLSAgQVNTRVJUX0ZBTFNFKEluaXRGbGFnczo6SXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yVGFnKCJoZWxsbyIpKTsKLSAgQVNTRVJUX0ZBTFNFKEluaXRGbGFnczo6SXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yVGFnKCJGb28iKSk7Ci0gIEFTU0VSVF9GQUxTRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvckFsbCgpKTsKLX0KLQotVEVTVChJbml0RmxhZ3NUZXN0LCB0ZXN0X2RlYnVnX2xvZ2dpbmdfbXVsdGlwbGVfZmxhZ3MpIHsKLSAgY29uc3QgY2hhciogaW5wdXRbXSA9IHsiSU5JVF9sb2dnaW5nX2RlYnVnX2VuYWJsZWRfZm9yX3RhZ3M9Zm9vLGhlbGxvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiSU5JVF9sb2dnaW5nX2RlYnVnX2Rpc2FibGVkX2Zvcl90YWdzPWZvbyxiYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJJTklUX2xvZ2dpbmdfZGVidWdfZW5hYmxlZF9mb3JfYWxsPWZhbHNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyfTsKLSAgSW5pdEZsYWdzOjpMb2FkKGlucHV0KTsKLSAgQVNTRVJUX0ZBTFNFKEluaXRGbGFnczo6SXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yVGFnKCJmb28iKSk7Ci0gIEFTU0VSVF9GQUxTRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZygiYmFyIikpOwotICBBU1NFUlRfVFJVRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZygiaGVsbG8iKSk7Ci0gIEFTU0VSVF9GQUxTRShJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZygiRm9vIikpOwotICBBU1NFUlRfRkFMU0UoSW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JBbGwoKSk7Ci19CmRpZmYgLS1naXQgYS9nZC9jb21tb24vbGlzdF9tYXAuaCBiL2dkL2NvbW1vbi9saXN0X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWJmODY5Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9saXN0X21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi0vLyBBIG1hcCB0aGF0IG1haW50YWlucyBvcmRlciBvZiBpdHMgZWxlbWVudCBhcyBhIGxpc3QuIEFuIGVsZW1lbnQgdGhhdCBpcyBwdXQgZWFybGllciB3aWxsIGFwcGVhciBiZWZvcmUgYW4gZWxlbWVudAotLy8gdGhhdCBpcyBwdXQgbGF0ZXIgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCB0aGlzIG1hcCdzIGVudHJpZXMuIEtleXMgbXVzdCBiZSB1bmlxdWUuCi0vLwotLy8gUGVyZm9ybWFuY2U6Ci0vLyAgIC0gS2V5IGxvb2stdXAgYW5kIG1vZGlmaWNhdGlvbiBpcyBPKDEpCi0vLyAgIC0gVmFsdWUgb3BlcmF0ZWQgYnkgcmVwbGFjZW1lbnQsIG5vIGluLXBsYWNlIG1vZGlmaWNhdGlvbgotLy8gICAtIE1lbW9yeSBjb25zdW1wdGlvbiBpczoKLS8vICAgICBPKDIqY2FwYWNpdHkqc2l6ZW9mKEspICsgY2FwYWNpdHkqKHNpemVvZihudWxscHRyKStzaXplb2YoVikpKQotLy8gICAtIE5PVCBUSFJFQUQgU0FGRQotLy8KLS8vIFRlbXBsYXRlOgotLy8gICAtIEtleSBrZXkKLS8vICAgLSBUIHZhbHVlCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBUPgotY2xhc3MgTGlzdE1hcCB7Ci0gcHVibGljOgotICB1c2luZyB2YWx1ZV90eXBlID0gc3RkOjpwYWlyPGNvbnN0IEtleSwgVD47Ci0gIC8vIGRpZmZlcmVudCBmcm9tIGMrKzE3IG5vZGVfdHlwZSBvbiBwdXJwb3NlIGFzIHdlIHdhbnQgbm9kZSB0byBiZSBjb3B5YWJsZQotICB1c2luZyBub2RlX3R5cGUgPSBzdGQ6OnBhaXI8S2V5LCBUPjsKLSAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46Oml0ZXJhdG9yOwotICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6bGlzdDx2YWx1ZV90eXBlPjo6Y29uc3RfaXRlcmF0b3I7Ci0KLSAgLy8gQ29uc3RydWN0b3Igb2YgdGhlIGxpc3QgbWFwCi0gIExpc3RNYXAoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gZm9yIG1vdmUKLSAgTGlzdE1hcChMaXN0TWFwJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLSAgTGlzdE1hcCYgb3BlcmF0b3I9KExpc3RNYXAmJiBvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OwotCi0gIC8vIGNvcHktY29uc3RydWN0b3IKLSAgLy8gaXRlcmF0b3JzIGluIGtleV9tYXBfIGNhbm5vdCBiZSBjb3BpZWQgZGlyZWN0bHkKLSAgTGlzdE1hcChjb25zdCBMaXN0TWFwJiBvdGhlcikgOiBub2RlX2xpc3RfKG90aGVyLm5vZGVfbGlzdF8pIHsKLSAgICBmb3IgKGF1dG8gaXRlciA9IG5vZGVfbGlzdF8uYmVnaW4oKTsgaXRlciAhPSBub2RlX2xpc3RfLmVuZCgpOyBpdGVyKyspIHsKLSAgICAgIGtleV9tYXBfLmVtcGxhY2UoaXRlci0+Zmlyc3QsIGl0ZXIpOwotICAgIH0KLSAgfQotCi0gIC8vIGNvcHktYXNzaWdubWVudAotICAvLyBpdGVyYXRvcnMgaW4ga2V5X21hcF8gY2Fubm90IGJlIGNvcGllZCBkaXJlY3RseQotICBMaXN0TWFwJiBvcGVyYXRvcj0oY29uc3QgTGlzdE1hcCYgb3RoZXIpIHsKLSAgICBpZiAoJm90aGVyID09IHRoaXMpIHsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgbm9kZV9saXN0XyA9IG90aGVyLm5vZGVfbGlzdF87Ci0gICAga2V5X21hcF8uY2xlYXIoKTsKLSAgICBmb3IgKGF1dG8gaXRlciA9IG5vZGVfbGlzdF8uYmVnaW4oKTsgaXRlciAhPSBub2RlX2xpc3RfLmVuZCgpOyBpdGVyKyspIHsKLSAgICAgIGtleV9tYXBfLmVtcGxhY2UoaXRlci0+Zmlyc3QsIGl0ZXIpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBjb21wYXJpc29uIG9wZXJhdG9ycwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGlzdE1hcCYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5vZGVfbGlzdF8gPT0gcmhzLm5vZGVfbGlzdF87Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IExpc3RNYXAmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IHJocyk7Ci0gIH0KLQotICB+TGlzdE1hcCgpIHsKLSAgICBjbGVhcigpOwotICB9Ci0KLSAgLy8gQ2xlYXIgdGhlIGxpc3QgbWFwCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAga2V5X21hcF8uY2xlYXIoKTsKLSAgICBub2RlX2xpc3RfLmNsZWFyKCk7Ci0gIH0KLQotICAvLyBjb25zdCB2ZXJzaW9uIG9mIGZpbmQoKQotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleSYga2V5KSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGlzdE1hcCo+KHRoaXMpLT5maW5kKGtleSk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHZhbHVlIG9mIGEga2V5LiBSZXR1cm4gaXRlcmF0b3IgdG8gdGhlIGl0ZW0gaWYgZm91bmQsIGVuZCgpIGlmIG5vdCBmb3VuZAotICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleSYga2V5KSB7Ci0gICAgYXV0byBtYXBfaXRlcmF0b3IgPSBrZXlfbWFwXy5maW5kKGtleSk7Ci0gICAgaWYgKG1hcF9pdGVyYXRvciA9PSBrZXlfbWFwXy5lbmQoKSkgewotICAgICAgcmV0dXJuIGVuZCgpOwotICAgIH0KLSAgICByZXR1cm4gbWFwX2l0ZXJhdG9yLT5zZWNvbmQ7Ci0gIH0KLQotICAvLyBDaGVjayBpZiBrZXkgZXhpc3QgaW4gdGhlIG1hcC4gUmV0dXJuIHRydWUgaWYga2V5IGV4aXN0IGluIG1hcCwgZmFsc2UgaWYgbm90LgotICBib29sIGNvbnRhaW5zKGNvbnN0IEtleSYga2V5KSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbmQoa2V5KSAhPSBlbmQoKTsKLSAgfQotCi0gIC8vIFRyeSBlbXBsYWNlIGFuIGVsZW1lbnQgYmVmb3JlIGEgc3BlY2lmaWMgcG9zaXRpb24gfHBvc3wgb2YgdGhlIGxpc3QgbWFwLiBJZiB0aGUgfGtleXwgYWxyZWFkeSBleGlzdHMsIGRvZXMgbm90aGluZy4KLSAgLy8gTW92ZWQgYXJndW1lbnRzIHdvbid0IGJlIG1vdmVkIHdoZW4ga2V5IGFscmVhZHkgZXhpc3RzLiBSZXR1cm4gPGl0ZXJhdG9yLCB0cnVlPiB3aGVuIGtleSBkb2VzIG5vdCBleGlzdCwgPGl0ZXJhdG9yLAotICAvLyBmYWxzZT4gd2hlbiBrZXkgZXhpc3QgYW5kIGl0ZXJhdG9yIGlzIHRoZSBwb3NpdGlvbiB3aGVyZSBpdCB3YXMgcGxhY2VkLgotICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KLSAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciBwb3MsIGNvbnN0IEtleSYga2V5LCBBcmdzJiYuLi4gYXJncykgewotICAgIGF1dG8gbWFwX2l0ZXJhdG9yID0ga2V5X21hcF8uZmluZChrZXkpOwotICAgIGlmIChtYXBfaXRlcmF0b3IgIT0ga2V5X21hcF8uZW5kKCkpIHsKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihlbmQoKSwgZmFsc2UpOwotICAgIH0KLSAgICBhdXRvIGxpc3RfaXRlcmF0b3IgPSBub2RlX2xpc3RfLmVtcGxhY2UocG9zLCBrZXksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Ci0gICAga2V5X21hcF8uZW1wbGFjZShrZXksIGxpc3RfaXRlcmF0b3IpOwotICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihsaXN0X2l0ZXJhdG9yLCB0cnVlKTsKLSAgfQotCi0gIC8vIFRyeSBlbXBsYWNlIGFuIGVsZW1lbnQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxpc3QgbWFwLiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzLCBkb2VzIG5vdGhpbmcuIE1vdmVkIGFyZ3VtZW50cwotICAvLyB3b24ndCBiZSBtb3ZlZCB3aGVuIGtleSBhbHJlYWR5IGV4aXN0cyByZXR1cm4gPGl0ZXJhdG9yLCB0cnVlPiB3aGVuIGtleSBkb2VzIG5vdCBleGlzdCwgPGl0ZXJhdG9yLCBmYWxzZT4gd2hlbiBrZXkKLSAgLy8gZXhpc3QgYW5kIGl0ZXJhdG9yIGlzIHRoZSBwb3NpdGlvbiB3aGVyZSBpdCB3YXMgcGxhY2VkCi0gIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgotICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlX2JhY2soY29uc3QgS2V5JiBrZXksIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgcmV0dXJuIHRyeV9lbXBsYWNlKGVuZCgpLCBrZXksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Ci0gIH0KLQotICAvLyBQdXQgYSBrZXktdmFsdWUgcGFpciB0byB0aGUgbWFwIGJlZm9yZSBwb3NpdGlvbi4gSWYga2V5IGFscmVhZHkgZXhpc3QsIHxwb3N8IHdpbGwgYmUgaWdub3JlZCBhbmQgZXhpc3RpbmcgdmFsdWUKLSAgLy8gd2lsbCBiZSByZXBsYWNlZAotICB2b2lkIGluc2VydF9vcl9hc3NpZ24oY29uc3RfaXRlcmF0b3IgcG9zLCBjb25zdCBLZXkmIGtleSwgVCB2YWx1ZSkgewotICAgIGF1dG8gbWFwX2l0ZXJhdG9yID0ga2V5X21hcF8uZmluZChrZXkpOwotICAgIGlmIChtYXBfaXRlcmF0b3IgIT0ga2V5X21hcF8uZW5kKCkpIHsKLSAgICAgIG1hcF9pdGVyYXRvci0+c2Vjb25kLT5zZWNvbmQgPSBzdGQ6Om1vdmUodmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvIGxpc3RfaXRlcmF0b3IgPSBub2RlX2xpc3RfLmVtcGxhY2UocG9zLCBrZXksIHN0ZDo6bW92ZSh2YWx1ZSkpOwotICAgIGtleV9tYXBfLmVtcGxhY2Uoa2V5LCBsaXN0X2l0ZXJhdG9yKTsKLSAgfQotCi0gIC8vIFB1dCBhIGtleS12YWx1ZSBwYWlyIHRvIHRoZSB0YWlsIG9mIHRoZSBtYXAgb3IgcmVwbGFjZSB0aGUgY3VycmVudCB2YWx1ZSB3aXRob3V0IG1vdmluZyB0aGUga2V5IGlmIGtleSBleGlzdHMKLSAgdm9pZCBpbnNlcnRfb3JfYXNzaWduKGNvbnN0IEtleSYga2V5LCBUIHZhbHVlKSB7Ci0gICAgaW5zZXJ0X29yX2Fzc2lnbihlbmQoKSwga2V5LCBzdGQ6Om1vdmUodmFsdWUpKTsKLSAgfQotCi0gIC8vIFNUTCBzcGxpY2UsIHNhbWUgYXMgc3RkOjpsaXN0OjpzcGxpY2UKLSAgLy8gLSBwb3M6IGVsZW1lbnQgYmVmb3JlIHdoaWNoIHRoZSBjb250ZW50IHdpbGwgYmUgaW5zZXJ0ZWQKLSAgLy8gLSBvdGhlcjogYW5vdGhlciBjb250YWluZXIgdG8gdHJhbnNmZXIgdGhlIGNvbnRlbnQgZnJvbQotICAvLyAtIGl0OiB0aGUgZWxlbWVudCB0byB0cmFuc2ZlciBmcm9tIG90aGVyIHRvICp0aGlzCi0gIHZvaWQgc3BsaWNlKGNvbnN0X2l0ZXJhdG9yIHBvcywgTGlzdE1hcDxLZXksIFQ+JiBvdGhlciwgY29uc3RfaXRlcmF0b3IgaXQpIHsKLSAgICBpZiAoJm90aGVyICE9IHRoaXMpIHsKLSAgICAgIGF1dG8gbWFwX25vZGUgPSBvdGhlci5rZXlfbWFwXy5leHRyYWN0KGl0LT5maXJzdCk7Ci0gICAgICBrZXlfbWFwXy5pbnNlcnQoc3RkOjptb3ZlKG1hcF9ub2RlKSk7Ci0gICAgfQotICAgIG5vZGVfbGlzdF8uc3BsaWNlKHBvcywgb3RoZXIubm9kZV9saXN0XywgaXQpOwotICB9Ci0KLSAgLy8gUmVtb3ZlIGEga2V5IGZyb20gdGhlIGxpc3QgbWFwIGFuZCByZXR1cm4gcmVtb3ZlZCB2YWx1ZSBpZiBrZXkgZXhpdHMsIHN0ZDo6bnVsbG9wdCBpZiBub3QuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZQotICAvLyBldmFsdWF0ZWQgdG8gdHJ1ZSBpbiBhIGJvb2xlYW4gY29udGV4dCBpZiBhIHZhbHVlIGlzIGNvbnRhaW5lZCBieSBzdGQ6Om9wdGlvbmFsLCBmYWxzZSBvdGhlcndpc2UuCi0gIHN0ZDo6b3B0aW9uYWw8bm9kZV90eXBlPiBleHRyYWN0KGNvbnN0IEtleSYga2V5KSB7Ci0gICAgYXV0byBtYXBfaXRlcmF0b3IgPSBrZXlfbWFwXy5maW5kKGtleSk7Ci0gICAgaWYgKG1hcF9pdGVyYXRvciA9PSBrZXlfbWFwXy5lbmQoKSkgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgc3RkOjpvcHRpb25hbDxub2RlX3R5cGU+IHJlbW92ZWRfbm9kZShzdGQ6Om1vdmUoKm1hcF9pdGVyYXRvci0+c2Vjb25kKSk7Ci0gICAgbm9kZV9saXN0Xy5lcmFzZShtYXBfaXRlcmF0b3ItPnNlY29uZCk7Ci0gICAga2V5X21hcF8uZXJhc2UobWFwX2l0ZXJhdG9yKTsKLSAgICByZXR1cm4gcmVtb3ZlZF9ub2RlOwotICB9Ci0KLSAgLy8gUmVtb3ZlIGFuIGl0ZXJhdG9yIHBvaW50ZWQgaXRlbSBmcm9tIHRoZSBsaXN0IG1hcCBhbmQgcmV0dXJuIHRoZSBpdGVyYXRvciBpbW1lZGlhdGVseSBhZnRlciB0aGUgZXJhc2VkIGl0ZW0KLSAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgaXRlcikgewotICAgIGtleV9tYXBfLmVyYXNlKGl0ZXItPmZpcnN0KTsKLSAgICByZXR1cm4gbm9kZV9saXN0Xy5lcmFzZShpdGVyKTsKLSAgfQotCi0gIC8vIFJldHVybiBzaXplIG9mIHRoZSBsaXN0IG1hcAotICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5vZGVfbGlzdF8uc2l6ZSgpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGl0ZXJhdG9yIGludGVyZmFjZSBmb3IgYmVnaW4KLSAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgewotICAgIHJldHVybiBub2RlX2xpc3RfLmJlZ2luKCk7Ci0gIH0KLQotICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgZm9yIGJlZ2luLCBjb25zdAotICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5vZGVfbGlzdF8uYmVnaW4oKTsKLSAgfQotCi0gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBmb3IgZW5kCi0gIGlubGluZSBpdGVyYXRvciBlbmQoKSB7Ci0gICAgcmV0dXJuIG5vZGVfbGlzdF8uZW5kKCk7Ci0gIH0KLQotICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgZm9yIGVuZCwgY29uc3QKLSAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbm9kZV9saXN0Xy5lbmQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpsaXN0PHZhbHVlX3R5cGU+IG5vZGVfbGlzdF87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxLZXksIGl0ZXJhdG9yPiBrZXlfbWFwXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9jb21tb24vbGlzdF9tYXBfdGVzdC5jYyBiL2dkL2NvbW1vbi9saXN0X21hcF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjgyZWVhLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9saXN0X21hcF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2xpc3RfbWFwLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Okxpc3RNYXA7Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGVtcHR5X3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIEVYUEVDVF9FUShsaXN0X21hcC5zaXplKCksIDApOwotICBFWFBFQ1RfRVEobGlzdF9tYXAuZmluZCg0MiksIGxpc3RfbWFwLmVuZCgpKTsKLSAgbGlzdF9tYXAuY2xlYXIoKTsgIC8vIHNob3VsZCBub3QgY3Jhc2gKLSAgRVhQRUNUX0VRKGxpc3RfbWFwLmZpbmQoNDIpLCBsaXN0X21hcC5lbmQoKSk7Ci0gIEVYUEVDVF9GQUxTRShsaXN0X21hcC5jb250YWlucyg0MikpOwotICBFWFBFQ1RfRkFMU0UobGlzdF9tYXAuZXh0cmFjdCg0MikpOwotfQotCi1URVNUKExpc3RNYXBUZXN0LCBjb21wYXJpc29uX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXBfMTsKLSAgbGlzdF9tYXBfMS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbGlzdF9tYXBfMS5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXBfMjsKLSAgbGlzdF9tYXBfMi5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbGlzdF9tYXBfMi5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgRVhQRUNUX0VRKGxpc3RfbWFwXzEsIGxpc3RfbWFwXzIpOwotICAvLyBMaXN0IG1hcCB3aXRoIGRpZmZlcmVudCB2YWx1ZSBzaG91bGQgYmUgZGlmZmVyZW50Ci0gIGxpc3RfbWFwXzIuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMSk7Ci0gIEVYUEVDVF9ORShsaXN0X21hcF8xLCBsaXN0X21hcF8yKTsKLSAgLy8gTGlzdCBtYXBzIHdpdGggZGlmZmVyZW50IG9yZGVyIHNob3VsZCBub3QgYmUgZXF1YWwKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXBfMzsKLSAgbGlzdF9tYXBfMy5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgbGlzdF9tYXBfMy5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgRVhQRUNUX05FKGxpc3RfbWFwXzEsIGxpc3RfbWFwXzMpOwotICAvLyBFbXB0eSBsaXN0IG1hcCBzaG91bGQgbm90IGJlIGVxdWFsIHRvIG5vbi1lbXB0eSBvbmVzCi0gIExpc3RNYXA8aW50LCBpbnQ+IGxpc3RfbWFwXzQ7Ci0gIEVYUEVDVF9ORShsaXN0X21hcF8xLCBsaXN0X21hcF80KTsKLSAgLy8gRW1wdHkgbGlzdCBtYXBzIHNob3VsZCBiZSBlcXVhbAotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcF81OwotICBFWFBFQ1RfRVEobGlzdF9tYXBfNCwgbGlzdF9tYXBfNSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGNvcHlfdGVzdCkgewotICBMaXN0TWFwPGludCwgc3RkOjpzaGFyZWRfcHRyPGludD4+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigxMDApKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDEwMCk7Ci0gIExpc3RNYXA8aW50LCBzdGQ6OnNoYXJlZF9wdHI8aW50Pj4gbmV3X2xpc3RfbWFwID0gbGlzdF9tYXA7Ci0gIGl0ZXIgPSBuZXdfbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDEwMCk7Ci0gICppdGVyLT5zZWNvbmQgPSAzMDA7Ci0gIGl0ZXIgPSBuZXdfbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDMwMCk7Ci0gIC8vIFNpbmNlIGNvcHkgaXMgdXNlZCwgc2hhcmVkX3B0ciBzaG91bGQgaW5jcmVhc2UgY291bnQKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZC51c2VfY291bnQoKSwgMik7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIG1vdmVfdGVzdCkgewotICBMaXN0TWFwPGludCwgc3RkOjpzaGFyZWRfcHRyPGludD4+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigxMDApKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDEwMCk7Ci0gIExpc3RNYXA8aW50LCBzdGQ6OnNoYXJlZF9wdHI8aW50Pj4gbmV3X2xpc3RfbWFwID0gc3RkOjptb3ZlKGxpc3RfbWFwKTsKLSAgaXRlciA9IG5ld19saXN0X21hcC5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMTAwKTsKLSAgKml0ZXItPnNlY29uZCA9IDMwMDsKLSAgaXRlciA9IG5ld19saXN0X21hcC5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMzAwKTsKLSAgLy8gU2luY2UgbW92ZSBpcyB1c2VkLCBzaGFyZWRfcHRyIHNob3VsZCBub3QgaW5jcmVhc2UgY291bnQKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZC51c2VfY291bnQoKSwgMSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIG1vdmVfaW5zZXJ0X3VuaXF1ZV9wdHJfdGVzdCkgewotICBMaXN0TWFwPGludCwgc3RkOjp1bmlxdWVfcHRyPGludD4+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIHN0ZDo6bWFrZV91bmlxdWU8aW50PigxMDApKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDEwMCk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMSwgc3RkOjptYWtlX3VuaXF1ZTxpbnQ+KDQwMCkpOwotICBpdGVyID0gbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDQwMCk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIG1vdmVfaW5zZXJ0X2xpc3RfbWFwX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIExpc3RNYXA8aW50LCBpbnQ+PiBsaXN0X21hcDsKLSAgTGlzdE1hcDxpbnQsIGludD4gbTE7Ci0gIG0xLmluc2VydF9vcl9hc3NpZ24oMSwgMTAwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigxLCBzdGQ6Om1vdmUobTEpKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX1RIQVQoaXRlci0+c2Vjb25kLCBFbGVtZW50c0FyZShQYWlyKDEsIDEwMCkpKTsKLSAgTGlzdE1hcDxpbnQsIGludD4gbTI7Ci0gIG0yLmluc2VydF9vcl9hc3NpZ24oMiwgMjAwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigxLCBzdGQ6Om1vdmUobTIpKTsKLSAgaXRlciA9IGxpc3RfbWFwLmZpbmQoMSk7Ci0gIEVYUEVDVF9USEFUKGl0ZXItPnNlY29uZCwgRWxlbWVudHNBcmUoUGFpcigyLCAyMDApKSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGVyYXNlX29uZV9pdGVtX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigzLCAzMCk7Ci0gIGF1dG8gaXRlciA9IGxpc3RfbWFwLmZpbmQoMik7Ci0gIGl0ZXIgPSBsaXN0X21hcC5lcmFzZShpdGVyKTsKLSAgRVhQRUNUX0VRKGl0ZXItPmZpcnN0LCAzKTsKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZCwgMzApOwotfQotCi1URVNUKExpc3RNYXBUZXN0LCBlcmFzZV9pbl9mb3JfbG9vcF90ZXN0KSB7Ci0gIExpc3RNYXA8aW50LCBpbnQ+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMywgMzApOwotICBmb3IgKGF1dG8gaXRlciA9IGxpc3RfbWFwLmJlZ2luKCk7IGl0ZXIgIT0gbGlzdF9tYXAuZW5kKCk7KSB7Ci0gICAgaWYgKGl0ZXItPmZpcnN0ID09IDIpIHsKLSAgICAgIGl0ZXIgPSBsaXN0X21hcC5lcmFzZShpdGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgKytpdGVyOwotICAgIH0KLSAgfQotICBFWFBFQ1RfVEhBVChsaXN0X21hcCwgRWxlbWVudHNBcmUoUGFpcigxLCAxMCksIFBhaXIoMywgMzApKSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIHNwbGljZV9kaWZmZXJlbnRfbGlzdF90ZXN0KSB7Ci0gIExpc3RNYXA8aW50LCBpbnQ+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMywgMzApOwotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcF8yOwotICBsaXN0X21hcF8yLmluc2VydF9vcl9hc3NpZ24oNCwgNDApOwotICBsaXN0X21hcF8yLmluc2VydF9vcl9hc3NpZ24oNSwgNTApOwotICBsaXN0X21hcC5zcGxpY2UobGlzdF9tYXAuZmluZCgyKSwgbGlzdF9tYXBfMiwgbGlzdF9tYXBfMi5maW5kKDQpKTsKLSAgRVhQRUNUX0VRKGxpc3RfbWFwXzIuZmluZCg0KSwgbGlzdF9tYXBfMi5lbmQoKSk7Ci0gIGF1dG8gaXRlciA9IGxpc3RfbWFwLmZpbmQoNCk7Ci0gIEVYUEVDVF9ORShpdGVyLCBsaXN0X21hcC5lbmQoKSk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDQwKTsKLSAgRVhQRUNUX1RIQVQobGlzdF9tYXAsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTApLCBQYWlyKDQsIDQwKSwgUGFpcigyLCAyMCksIFBhaXIoMywgMzApKSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIHNwbGljZV9zYW1lX2xpc3RfdGVzdCkgewotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcDsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMCk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMiwgMjApOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDMsIDMwKTsKLSAgbGlzdF9tYXAuc3BsaWNlKGxpc3RfbWFwLmZpbmQoMiksIGxpc3RfbWFwLCBsaXN0X21hcC5maW5kKDMpKTsKLSAgRVhQRUNUX1RIQVQobGlzdF9tYXAsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTApLCBQYWlyKDMsIDMwKSwgUGFpcigyLCAyMCkpKTsKLSAgbGlzdF9tYXAuZXh0cmFjdCgyKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbihsaXN0X21hcC5iZWdpbigpLCA0LCA0MCk7Ci0gIEVYUEVDVF9USEFUKGxpc3RfbWFwLCBFbGVtZW50c0FyZShQYWlyKDQsIDQwKSwgUGFpcigxLCAxMCksIFBhaXIoMywgMzApKSk7Ci0gIGF1dG8gaXRlciA9IGxpc3RfbWFwLmZpbmQoNCk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDQwKTsKLSAgbGlzdF9tYXAuc3BsaWNlKGxpc3RfbWFwLmJlZ2luKCksIGxpc3RfbWFwLCBsaXN0X21hcC5maW5kKDQpKTsKLSAgbGlzdF9tYXAuc3BsaWNlKGxpc3RfbWFwLmJlZ2luKCksIGxpc3RfbWFwLCBsaXN0X21hcC5maW5kKDMpKTsKLSAgbGlzdF9tYXAuc3BsaWNlKGxpc3RfbWFwLmJlZ2luKCksIGxpc3RfbWFwLCBsaXN0X21hcC5maW5kKDEpKTsKLSAgRVhQRUNUX1RIQVQobGlzdF9tYXAsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTApLCBQYWlyKDMsIDMwKSwgUGFpcig0LCA0MCkpKTsKLSAgaXRlciA9IGxpc3RfbWFwLmZpbmQoNCk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDQwKTsKLSAgaXRlciA9IGxpc3RfbWFwLmZpbmQoMyk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDMwKTsKLX0KLQotVEVTVChMaXN0TWFwVGVzdCwgcHV0X2dldF9hbmRfY29udGFpbnNfa2V5X3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIEVYUEVDVF9FUShsaXN0X21hcC5zaXplKCksIDApOwotICBFWFBFQ1RfRVEobGlzdF9tYXAuZmluZCg0MiksIGxpc3RfbWFwLmVuZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGxpc3RfbWFwLmNvbnRhaW5zKDQyKSk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oNTYsIDIwMCk7Ci0gIEVYUEVDVF9FUShsaXN0X21hcC5maW5kKDQyKSwgbGlzdF9tYXAuZW5kKCkpOwotICBFWFBFQ1RfRkFMU0UobGlzdF9tYXAuY29udGFpbnMoNDIpKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCg1Nik7Ci0gIEVYUEVDVF9ORShpdGVyLCBsaXN0X21hcC5lbmQoKSk7Ci0gIEVYUEVDVF9UUlVFKGxpc3RfbWFwLmNvbnRhaW5zKDU2KSk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDIwMCk7Ci0gIEVYUEVDVF9UUlVFKGxpc3RfbWFwLmV4dHJhY3QoNTYpKTsKLSAgRVhQRUNUX0ZBTFNFKGxpc3RfbWFwLmNvbnRhaW5zKDU2KSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIHRyeV9lbXBsYWNlX2F0X3Bvc2l0aW9uX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCgyKTsKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZCwgMjApOwotICBhdXRvIHJlc3VsdCA9IGxpc3RfbWFwLnRyeV9lbXBsYWNlKGl0ZXIsIDQyLCA0MjApOwotICBFWFBFQ1RfVFJVRShyZXN1bHQuc2Vjb25kKTsKLSAgaXRlciA9IGxpc3RfbWFwLmZpbmQoNDIpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCA0MjApOwotICBFWFBFQ1RfRVEoaXRlciwgcmVzdWx0LmZpcnN0KTsKLSAgQVNTRVJUX1RIQVQobGlzdF9tYXAsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTApLCBQYWlyKDQyLCA0MjApLCBQYWlyKDIsIDIwKSkpOwotICBFWFBFQ1RfRkFMU0UobGlzdF9tYXAudHJ5X2VtcGxhY2UocmVzdWx0LmZpcnN0LCA0MiwgNDIwKS5zZWNvbmQpOwotfQotCi1URVNUKExpc3RNYXBUZXN0LCB0cnlfZW1wbGFjZV9iYWNrX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgYXV0byByZXN1bHQgPSBsaXN0X21hcC50cnlfZW1wbGFjZV9iYWNrKDQyLCA0MjApOwotICBFWFBFQ1RfVFJVRShyZXN1bHQuc2Vjb25kKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCg0Mik7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDQyMCk7Ci0gIEVYUEVDVF9FUShpdGVyLCByZXN1bHQuZmlyc3QpOwotICBBU1NFUlRfVEhBVChsaXN0X21hcCwgRWxlbWVudHNBcmUoUGFpcigxLCAxMCksIFBhaXIoMiwgMjApLCBQYWlyKDQyLCA0MjApKSk7Ci0gIEVYUEVDVF9GQUxTRShsaXN0X21hcC50cnlfZW1wbGFjZV9iYWNrKDQyLCA0MjApLnNlY29uZCk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGluc2VydF9hdF9wb3NpdGlvbl90ZXN0KSB7Ci0gIExpc3RNYXA8aW50LCBpbnQ+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIGF1dG8gaXRlciA9IGxpc3RfbWFwLmZpbmQoMik7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDIwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbihpdGVyLCA0MiwgNDIwKTsKLSAgaXRlciA9IGxpc3RfbWFwLmZpbmQoNDIpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCA0MjApOwotICBBU1NFUlRfVEhBVChsaXN0X21hcCwgRWxlbWVudHNBcmUoUGFpcigxLCAxMCksIFBhaXIoNDIsIDQyMCksIFBhaXIoMiwgMjApKSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGluX3BsYWNlX21vZGlmaWNhdGlvbl90ZXN0KSB7Ci0gIExpc3RNYXA8aW50LCBpbnQ+IGxpc3RfbWFwOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIGF1dG8gaXRlciA9IGxpc3RfbWFwLmZpbmQoMik7Ci0gIGl0ZXItPnNlY29uZCA9IDIwMDsKLSAgQVNTRVJUX1RIQVQobGlzdF9tYXAsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTApLCBQYWlyKDIsIDIwMCkpKTsKLX0KLQotVEVTVChMaXN0TWFwVGVzdCwgZ2V0X3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZCgxKTsKLSAgRVhQRUNUX05FKGl0ZXIsIGxpc3RfbWFwLmVuZCgpKTsKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZCwgMTApOwotfQotCi1URVNUKExpc3RNYXBUZXN0LCByZW1vdmVfdGVzdCkgewotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcDsKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDw9IDMwOyBrZXkrKykgewotICAgIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oa2V5LCBrZXkgKiAxMDApOwotICB9Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8PSAzMDsga2V5KyspIHsKLSAgICBFWFBFQ1RfVFJVRShsaXN0X21hcC5jb250YWlucyhrZXkpKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPD0gMzA7IGtleSsrKSB7Ci0gICAgYXV0byByZW1vdmVkID0gbGlzdF9tYXAuZXh0cmFjdChrZXkpOwotICAgIEVYUEVDVF9UUlVFKHJlbW92ZWQpOwotICAgIEVYUEVDVF9FUSgqcmVtb3ZlZCwgc3RkOjptYWtlX3BhaXIoa2V5LCBrZXkgKiAxMDApKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPD0gMzA7IGtleSsrKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKGxpc3RfbWFwLmNvbnRhaW5zKGtleSkpOwotICB9Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGNsZWFyX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwOyBrZXkrKykgewotICAgIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oa2V5LCBrZXkgKiAxMDApOwotICB9Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwOyBrZXkrKykgewotICAgIEVYUEVDVF9UUlVFKGxpc3RfbWFwLmNvbnRhaW5zKGtleSkpOwotICB9Ci0gIGxpc3RfbWFwLmNsZWFyKCk7Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwOyBrZXkrKykgewotICAgIEVYUEVDVF9GQUxTRShsaXN0X21hcC5jb250YWlucyhrZXkpKTsKLSAgfQotCi0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8IDEwOyBrZXkrKykgewotICAgIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oa2V5LCBrZXkgKiAxMDAwKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCAxMDsga2V5KyspIHsKLSAgICBFWFBFQ1RfVFJVRShsaXN0X21hcC5jb250YWlucyhrZXkpKTsKLSAgfQotfQotCi1URVNUKExpc3RNYXBUZXN0LCBjb250YWluZXJfdGVzdCkgewotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcDsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMCk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMiwgMjApOwotICBBU1NFUlRfVEhBVChsaXN0X21hcCwgRWxlbWVudHNBcmUoUGFpcigxLCAxMCksIFBhaXIoMiwgMjApKSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIGl0ZXJhdG9yX3Rlc3QpIHsKLSAgTGlzdE1hcDxpbnQsIGludD4gbGlzdF9tYXA7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxpbnQsIGludD4+IGxpc3QobGlzdF9tYXAuYmVnaW4oKSwgbGlzdF9tYXAuZW5kKCkpOwotICBBU1NFUlRfVEhBVChsaXN0LCBFbGVtZW50c0FyZShQYWlyKDEsIDEwKSwgUGFpcigyLCAyMCkpKTsKLX0KLQotVEVTVChMaXN0TWFwVGVzdCwgZm9yX2xvb3BfdGVzdCkgewotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcDsKLSAgbGlzdF9tYXAuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMCk7Ci0gIGxpc3RfbWFwLmluc2VydF9vcl9hc3NpZ24oMiwgMjApOwotICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGludCwgaW50Pj4gbGlzdDsKLSAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogbGlzdF9tYXApIHsKLSAgICBsaXN0LmVtcGxhY2VfYmFjayhub2RlKTsKLSAgfQotICBBU1NFUlRfVEhBVChsaXN0LCBFbGVtZW50c0FyZShQYWlyKDEsIDEwKSwgUGFpcigyLCAyMCkpKTsKLSAgbGlzdC5jbGVhcigpOwotICBmb3IgKGF1dG8mIG5vZGUgOiBsaXN0X21hcCkgewotICAgIGxpc3QuZW1wbGFjZV9iYWNrKG5vZGUpOwotICAgIG5vZGUuc2Vjb25kID0gbm9kZS5zZWNvbmQgKiAyOwotICB9Ci0gIEFTU0VSVF9USEFUKGxpc3QsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTApLCBQYWlyKDIsIDIwKSkpOwotICBsaXN0LmNsZWFyKCk7Ci0gIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IGxpc3RfbWFwKSB7Ci0gICAgbGlzdC5lbXBsYWNlX2JhY2sobm9kZSk7Ci0gIH0KLSAgQVNTRVJUX1RIQVQobGlzdCwgRWxlbWVudHNBcmUoUGFpcigxLCAyMCksIFBhaXIoMiwgNDApKSk7Ci19Ci0KLVRFU1QoTGlzdE1hcFRlc3QsIHByZXNzdXJlX3Rlc3QpIHsKLSAgYXV0byBzdGFydGVkID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGludCBudW1fZW50cmllcyA9IDB4RkZGRjsgIC8vIDJeMTYgPSA2NTUzNQotICBMaXN0TWFwPGludCwgaW50PiBsaXN0X21hcDsKLQotICAvLyBmaWxsIHRoZSBsaXN0X21hcAotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCBudW1fZW50cmllczsga2V5KyspIHsKLSAgICBsaXN0X21hcC5pbnNlcnRfb3JfYXNzaWduKGtleSwga2V5KTsKLSAgfQotCi0gIC8vIG1ha2Ugc3VyZSB0aGUgbGlzdF9tYXAgaXMgZnVsbAotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCBudW1fZW50cmllczsga2V5KyspIHsKLSAgICBFWFBFQ1RfVFJVRShsaXN0X21hcC5jb250YWlucyhrZXkpKTsKLSAgfQotCi0gIC8vIGNsZWFyIHRoZSBlbnRpcmUgbGlzdF9tYXAKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgbnVtX2VudHJpZXM7IGtleSsrKSB7Ci0gICAgYXV0byBpdGVyID0gbGlzdF9tYXAuZmluZChrZXkpOwotICAgIEVYUEVDVF9ORShpdGVyLCBsaXN0X21hcC5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZCwga2V5KTsKLSAgICBFWFBFQ1RfVFJVRShsaXN0X21hcC5leHRyYWN0KGtleSkpOwotICB9Ci0gIEVYUEVDVF9FUShsaXN0X21hcC5zaXplKCksIDApOwotCi0gIC8vIHRlc3QgZXhlY3V0aW9uIHRpbWUKLSAgYXV0byBkb25lID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gIGludCBleGVjdXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KGRvbmUgLSBzdGFydGVkKS5jb3VudCgpOwotICAvLyBTaG91bGRuJ3QgYmUgbW9yZSB0aGFuIDEwMDBtcwotICBpbnQgZXhlY3V0aW9uX3RpbWVfcGVyX2N5Y2xlX3VzID0gMTA7Ci0gIEVYUEVDVF9MVChleGVjdXRpb25fdGltZSwgZXhlY3V0aW9uX3RpbWVfcGVyX2N5Y2xlX3VzICogbnVtX2VudHJpZXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL2xydV9jYWNoZS5oIGIvZ2QvY29tbW9uL2xydV9jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJlYWZmLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9scnVfY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImNvbW1vbi9saXN0X21hcC5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi0vLyBBbiBMUlUgbWFwLWNhY2hlIHRoZSBldmljdCB0aGUgb2xkZXN0IGl0ZW0gd2hlbiByZWFjaGluZyBjYXBhY2l0eQotLy8KLS8vIFVzYWdlOgotLy8gICAtIGtleXMgYXJlIHNvcnRlZCBmcm9tIHdhcm1lc3QgdG8gY29sZGVzdAotLy8gICAtIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBjYWNoZSB3b24ndCB3YXJtIHVwIGtleXMKLS8vICAgLSBvcGVyYXRpb25zIG9uIGl0ZXJhdG9ycyB3b24ndCB3YXJtIHVwIGtleXMKLS8vICAgLSBmaW5kKCksIGNvbnRhaW5zKCksIGluc2VydF9vcl9hc3NpZ24oKSB3aWxsIHdhcm0gdXAgdGhlIGtleQotLy8gICAtIGluc2VydF9vcl9hc3NpZ24oKSB3aWxsIGV2aWN0IGNvbGRlc3Qga2V5IHdoZW4gY2FjaGUgcmVhY2hlcyBjYXBhY2l0eQotLy8gICAtIE5PVCBUSFJFQUQgU0FGRQotLy8KLS8vIFBlcmZvcm1hbmNlOgotLy8gICAtIEtleSBsb29rLXVwIGFuZCBtb2RpZmljYXRpb24gaXMgTygxKQotLy8gICAtIE1lbW9yeSBjb25zdW1wdGlvbiBpczoKLS8vICAgICBPKDIqY2FwYWNpdHkqc2l6ZW9mKEspICsgY2FwYWNpdHkqKHNpemVvZihudWxscHRyKStzaXplb2YoVikpKQotLy8KLS8vIFRlbXBsYXRlOgotLy8gICAtIEtleSBrZXkgdHlwZQotLy8gICAtIFQgdmFsdWUgdHlwZQotLy8gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+Ci1jbGFzcyBMcnVDYWNoZSB7Ci0gcHVibGljOgotICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgTGlzdE1hcDxLZXksIFQ+Ojp2YWx1ZV90eXBlOwotICAvLyBkaWZmZXJlbnQgZnJvbSBjKysxNyBub2RlX3R5cGUgb24gcHVycG9zZSBhcyB3ZSB3YW50IG5vZGUgdG8gYmUgY29weWFibGUKLSAgdXNpbmcgbm9kZV90eXBlID0gdHlwZW5hbWUgTGlzdE1hcDxLZXksIFQ+Ojpub2RlX3R5cGU7Ci0gIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgTGlzdE1hcDxLZXksIFQ+OjppdGVyYXRvcjsKLSAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBMaXN0TWFwPEtleSwgVD46OmNvbnN0X2l0ZXJhdG9yOwotCi0gIC8vIENvbnN0cnVjdG9yIGEgTFJVIGNhY2hlIHdpdGggfGNhcGFjaXR5fAotICBleHBsaWNpdCBMcnVDYWNoZShzaXplX3QgY2FwYWNpdHkpIDogY2FwYWNpdHlfKGNhcGFjaXR5KSB7Ci0gICAgQVNTRVJUX0xPRyhjYXBhY2l0eV8gIT0gMCwgIlVuYWJsZSB0byBoYXZlIDAgTFJVIENhY2hlIGNhcGFjaXR5Iik7Ci0gIH0KLQotICAvLyBmb3IgbW92ZQotICBMcnVDYWNoZShMcnVDYWNoZSYmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0gIExydUNhY2hlJiBvcGVyYXRvcj0oTHJ1Q2FjaGUmJiBvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OwotCi0gIC8vIGNvcHktY29uc3RydWN0b3IKLSAgLy8gaXRlcmF0b3JzIGluIGtleV9tYXBfIGNhbm5vdCBiZSBjb3BpZWQgZGlyZWN0bHkKLSAgTHJ1Q2FjaGUoY29uc3QgTHJ1Q2FjaGUmIG90aGVyKSA6IGNhcGFjaXR5XyhvdGhlci5jYXBhY2l0eV8pLCBsaXN0X21hcF8ob3RoZXIubGlzdF9tYXBfKSB7fQotCi0gIC8vIGNvcHktYXNzaWdubWVudAotICAvLyBpdGVyYXRvcnMgaW4ga2V5X21hcF8gY2Fubm90IGJlIGNvcGllZCBkaXJlY3RseQotICBMcnVDYWNoZSYgb3BlcmF0b3I9KGNvbnN0IExydUNhY2hlJiBvdGhlcikgewotICAgIGlmICgmb3RoZXIgPT0gdGhpcykgewotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBjYXBhY2l0eV8gPSBvdGhlci5jYXBhY2l0eV87Ci0gICAgbGlzdF9tYXBfID0gb3RoZXIubGlzdF9tYXBfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIGNvbXBhcmlzb24gb3BlcmF0b3JzCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMcnVDYWNoZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhcGFjaXR5XyA9PSByaHMuY2FwYWNpdHlfICYmIGxpc3RfbWFwXyA9PSByaHMubGlzdF9tYXBfOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBMcnVDYWNoZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKLSAgfQotCi0gIH5McnVDYWNoZSgpIHsKLSAgICBjbGVhcigpOwotICB9Ci0KLSAgLy8gQ2xlYXIgdGhlIGNhY2hlCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgbGlzdF9tYXBfLmNsZWFyKCk7Ci0gIH0KLQotICAvLyBGaW5kIHRoZSB2YWx1ZSBvZiBhIGtleSwgYW5kIG1vdmUgdGhlIGtleSB0byB0aGUgaGVhZCBvZiBjYWNoZSwgaWYgdGhlcmUgaXMgb25lLiBSZXR1cm4gaXRlcmF0b3IgdG8gdmFsdWUgaWYga2V5Ci0gIC8vIGV4aXN0cywgZW5kKCkgaWYgbm90LiBJdGVyYXRvciBtaWdodCBiZSBpbnZhbGlkYXRlZCB3aGVuIHJlbW92ZWQgb3IgZXZpY3RlZC4gQ29uc3QgdmVyc2lvbi4KLSAgLy8KLSAgLy8gTFJVOiBXaWxsIHdhcm0gdXAga2V5Ci0gIC8vIExSVTogQWNjZXNzIHRvIHJldHVybmVkIGl0ZXJhdG9yIHdvbid0IG1vdmUga2V5IGluIExSVQotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleSYga2V5KSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8THJ1Q2FjaGUqPih0aGlzKS0+ZmluZChrZXkpOwotICB9Ci0KLSAgLy8gRmluZCB0aGUgdmFsdWUgb2YgYSBrZXksIGFuZCBtb3ZlIHRoZSBrZXkgdG8gdGhlIGhlYWQgb2YgY2FjaGUsIGlmIHRoZXJlIGlzIG9uZS4gUmV0dXJuIGl0ZXJhdG9yIHRvIHZhbHVlIGlmIGtleQotICAvLyBleGlzdHMsIGVuZCgpIGlmIG5vdC4gSXRlcmF0b3IgbWlnaHQgYmUgaW52YWxpZGF0ZWQgd2hlbiByZW1vdmVkIG9yIGV2aWN0ZWQKLSAgLy8KLSAgLy8gTFJVOiBXaWxsIHdhcm0gdXAga2V5Ci0gIC8vIExSVTogQWNjZXNzIHRvIHJldHVybmVkIGl0ZXJhdG9yIHdvbid0IG1vdmUga2V5IGluIExSVQotICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleSYga2V5KSB7Ci0gICAgYXV0byBpdGVyID0gbGlzdF9tYXBfLmZpbmQoa2V5KTsKLSAgICBpZiAoaXRlciA9PSBsaXN0X21hcF8uZW5kKCkpIHsKLSAgICAgIHJldHVybiBlbmQoKTsKLSAgICB9Ci0gICAgLy8gbW92ZSB0byBmcm9udAotICAgIGxpc3RfbWFwXy5zcGxpY2UobGlzdF9tYXBfLmJlZ2luKCksIGxpc3RfbWFwXywgaXRlcik7Ci0gICAgcmV0dXJuIGl0ZXI7Ci0gIH0KLQotICAvLyBDaGVjayBpZiBrZXkgZXhpc3QgaW4gdGhlIGNhY2hlLiBSZXR1cm4gdHJ1ZSBpZiBrZXkgZXhpc3QgaW4gY2FjaGUsIGZhbHNlLCBpZiBub3QKLSAgLy8KLSAgLy8gTFJVOiBXaWxsIHdhcm0gdXAga2V5Ci0gIGJvb2wgY29udGFpbnMoY29uc3QgS2V5JiBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gZmluZChrZXkpICE9IGxpc3RfbWFwXy5lbmQoKTsKLSAgfQotCi0gIC8vIFB1dCBhIGtleS12YWx1ZSBwYWlyIHRvIHRoZSBoZWFkIG9mIGNhY2hlLCBldmljdCB0aGUgb2xkZXN0IGtleSBpZiBjYWNoZSBpcyBhdCBjYXBhY2l0eS4gRXZpY3Rpb24gaXMgYmFzZWQgb24ga2V5Ci0gIC8vIE9OTFkuIEhlbmNlLCB1cGRhdGluZyBhIGtleSB3aWxsIG5vdCBldmljdCB0aGUgb2xkZXN0IGtleS4gUmV0dXJuIGV2aWN0ZWQgdmFsdWUgaWYgb2xkIHZhbHVlIHdhcyBldmljdGVkLAotICAvLyBzdGQ6Om51bGxvcHQgaWYgbm90LiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRydWUgaW4gYSBib29sZWFuIGNvbnRleHQgaWYgYSB2YWx1ZSBpcyBjb250YWluZWQgYnkKLSAgLy8gc3RkOjpvcHRpb25hbCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAvLwotICAvLyBMUlU6IFdpbGwgd2FybSB1cCBrZXkKLSAgc3RkOjpvcHRpb25hbDxub2RlX3R5cGU+IGluc2VydF9vcl9hc3NpZ24oY29uc3QgS2V5JiBrZXksIFQgdmFsdWUpIHsKLSAgICBpZiAoY29udGFpbnMoa2V5KSkgewotICAgICAgLy8gY29udGFpbnMoKSBjYWxscyBmaW5kKCkgdGhhdCBtb3ZlZCB0aGUgbm9kZSB0byB0aGUgaGVhZAotICAgICAgbGlzdF9tYXBfLmJlZ2luKCktPnNlY29uZCA9IHN0ZDo6bW92ZSh2YWx1ZSk7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICAvLyByZW1vdmUgdGFpbCBpZiBhdCBjYXBhY2l0eQotICAgIHN0ZDo6b3B0aW9uYWw8bm9kZV90eXBlPiBldmljdGVkX25vZGUgPSBzdGQ6Om51bGxvcHQ7Ci0gICAgaWYgKGxpc3RfbWFwXy5zaXplKCkgPT0gY2FwYWNpdHlfKSB7Ci0gICAgICBldmljdGVkX25vZGUgPSBsaXN0X21hcF8uZXh0cmFjdChzdGQ6OnByZXYobGlzdF9tYXBfLmVuZCgpKS0+Zmlyc3QpOwotICAgIH0KLSAgICAvLyBpbnNlcnQgbmV3IG9uZSB0byBmcm9udCBvZiBsaXN0Ci0gICAgbGlzdF9tYXBfLmluc2VydF9vcl9hc3NpZ24obGlzdF9tYXBfLmJlZ2luKCksIGtleSwgc3RkOjptb3ZlKHZhbHVlKSk7Ci0gICAgcmV0dXJuIGV2aWN0ZWRfbm9kZTsKLSAgfQotCi0gIC8vIFB1dCBhIGtleS12YWx1ZSBwYWlyIHRvIHRoZSBoZWFkIG9mIGNhY2hlLCBldmljdCB0aGUgb2xkZXN0IGtleSBpZiBjYWNoZSBpcyBhdCBjYXBhY2l0eS4gRXZpY3Rpb24gaXMgYmFzZWQgb24ga2V5Ci0gIC8vIE9OTFkuIEhlbmNlLCB1cGRhdGluZyBhIGtleSB3aWxsIG5vdCBldmljdCB0aGUgb2xkZXN0IGtleS4gVGhpcyBtZXRob2QgdHJpZXMgdG8gY29uc3RydWN0IHRoZSB2YWx1ZSBpbi1wbGFjZS4gSWYKLSAgLy8gdGhlIGtleSBhbHJlYWR5IGV4aXN0LCB0aGlzIG1ldGhvZCBvbmx5IHVwZGF0ZSB0aGUgdmFsdWUuIFJldHVybiBpbnNlcnRlZCBpdGVyYXRvciwgd2hldGhlciBpbnNlcnRpb24gaGFwcGVucywgYW5kCi0gIC8vIGV2aWN0ZWQgdmFsdWUgaWYgb2xkIHZhbHVlIHdhcyBldmljdGVkIG9yIHN0ZDo6bnVsbG9wdAotICAvLwotICAvLyBMUlU6IFdpbGwgd2FybSB1cCBrZXkKLSAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+Ci0gIHN0ZDo6dHVwbGU8aXRlcmF0b3IsIGJvb2wsIHN0ZDo6b3B0aW9uYWw8bm9kZV90eXBlPj4gdHJ5X2VtcGxhY2UoY29uc3QgS2V5JiBrZXksIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgaWYgKGNvbnRhaW5zKGtleSkpIHsKLSAgICAgIC8vIGNvbnRhaW5zKCkgY2FsbHMgZmluZCgpIHRoYXQgbW92ZWQgdGhlIG5vZGUgdG8gdGhlIGhlYWQKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoZW5kKCksIGZhbHNlLCBzdGQ6Om51bGxvcHQpOwotICAgIH0KLSAgICAvLyByZW1vdmUgdGFpbCBpZiBhdCBjYXBhY2l0eQotICAgIHN0ZDo6b3B0aW9uYWw8bm9kZV90eXBlPiBldmljdGVkX25vZGUgPSBzdGQ6Om51bGxvcHQ7Ci0gICAgaWYgKGxpc3RfbWFwXy5zaXplKCkgPT0gY2FwYWNpdHlfKSB7Ci0gICAgICBldmljdGVkX25vZGUgPSBsaXN0X21hcF8uZXh0cmFjdChzdGQ6OnByZXYobGlzdF9tYXBfLmVuZCgpKS0+Zmlyc3QpOwotICAgIH0KLSAgICAvLyBpbnNlcnQgbmV3IG9uZSB0byBmcm9udCBvZiBsaXN0Ci0gICAgYXV0byBwYWlyID0gbGlzdF9tYXBfLnRyeV9lbXBsYWNlKGxpc3RfbWFwXy5iZWdpbigpLCBrZXksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCwgc3RkOjptb3ZlKGV2aWN0ZWRfbm9kZSkpOwotICB9Ci0KLSAgLy8gRGVsZXRlIGEga2V5IGZyb20gY2FjaGUsIHJldHVybiByZW1vdmVkIHZhbHVlIGlmIG9sZCB2YWx1ZSB3YXMgZXZpY3RlZCwgc3RkOjpudWxsb3B0IGlmIG5vdC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsCi0gIC8vIGJlIGV2YWx1YXRlZCB0byB0cnVlIGluIGEgYm9vbGVhbiBjb250ZXh0IGlmIGEgdmFsdWUgaXMgY29udGFpbmVkIGJ5IHN0ZDo6b3B0aW9uYWwsIGZhbHNlIG90aGVyd2lzZS4KLSAgaW5saW5lIHN0ZDo6b3B0aW9uYWw8bm9kZV90eXBlPiBleHRyYWN0KGNvbnN0IEtleSYga2V5KSB7Ci0gICAgcmV0dXJuIGxpc3RfbWFwXy5leHRyYWN0KGtleSk7Ci0gIH0KLQotICAvLy8gUmVtb3ZlIGFuIGl0ZXJhdG9yIHBvaW50ZWQgaXRlbSBmcm9tIHRoZSBscnUgY2FjaGUgYW5kIHJldHVybiB0aGUgaXRlcmF0b3IgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGVyYXNlZCBpdGVtCi0gIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGl0ZXIpIHsKLSAgICByZXR1cm4gbGlzdF9tYXBfLmVyYXNlKGl0ZXIpOwotICB9Ci0KLSAgLy8gUmV0dXJuIHNpemUgb2YgdGhlIGNhY2hlCi0gIGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbGlzdF9tYXBfLnNpemUoKTsKLSAgfQotCi0gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBmb3IgYmVnaW4KLSAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgewotICAgIHJldHVybiBsaXN0X21hcF8uYmVnaW4oKTsKLSAgfQotCi0gIC8vIFJldHVybiBpdGVyYXRvciBpbnRlcmZhY2UgZm9yIGJlZ2luLCBjb25zdAotICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxpc3RfbWFwXy5iZWdpbigpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGl0ZXJhdG9yIGludGVyZmFjZSBmb3IgZW5kCi0gIGlubGluZSBpdGVyYXRvciBlbmQoKSB7Ci0gICAgcmV0dXJuIGxpc3RfbWFwXy5lbmQoKTsKLSAgfQotCi0gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBmb3IgZW5kLCBjb25zdAotICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgewotICAgIHJldHVybiBsaXN0X21hcF8uZW5kKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNpemVfdCBjYXBhY2l0eV87Ci0gIExpc3RNYXA8S2V5LCBUPiBsaXN0X21hcF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vbHJ1X2NhY2hlX3Rlc3QuY2MgYi9nZC9jb21tb24vbHJ1X2NhY2hlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjAzZGQuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL2xydV9jYWNoZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2xydV9jYWNoZS5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpMcnVDYWNoZTsKLQotVEVTVChMcnVDYWNoZVRlc3QsIGVtcHR5X3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDMpOyAgLy8gY2FwYWNpdHkgPSAzOwotICBFWFBFQ1RfRVEoY2FjaGUuc2l6ZSgpLCAwKTsKLSAgRVhQRUNUX0VRKGNhY2hlLmZpbmQoNDIpLCBjYWNoZS5lbmQoKSk7Ci0gIGNhY2hlLmNsZWFyKCk7ICAvLyBzaG91bGQgbm90IGNyYXNoCi0gIEVYUEVDVF9FUShjYWNoZS5maW5kKDQyKSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuY29udGFpbnMoNDIpKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLmV4dHJhY3QoNDIpKTsKLX0KLQotVEVTVChMcnVDYWNoZVRlc3QsIGNvbXBhcmlzb25fdGVzdCkgewotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGVfMSgyKTsKLSAgY2FjaGVfMS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgY2FjaGVfMS5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlXzIoMik7Ci0gIGNhY2hlXzIuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMCk7Ci0gIGNhY2hlXzIuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIEVYUEVDVF9FUShjYWNoZV8xLCBjYWNoZV8yKTsKLSAgLy8gQ2FjaGUgd2l0aCBkaWZmZXJlbnQgb3JkZXIgc2hvdWxkIG5vdCBiZSBlcXVhbAotICBjYWNoZV8yLmZpbmQoMSk7Ci0gIEVYUEVDVF9ORShjYWNoZV8xLCBjYWNoZV8yKTsKLSAgY2FjaGVfMS5maW5kKDEpOwotICBFWFBFQ1RfRVEoY2FjaGVfMSwgY2FjaGVfMik7Ci0gIC8vIENhY2hlIHdpdGggZGlmZmVyZW50IHZhbHVlIHNob3VsZCBiZSBkaWZmZXJlbnQKLSAgY2FjaGVfMi5pbnNlcnRfb3JfYXNzaWduKDEsIDExKTsKLSAgRVhQRUNUX05FKGNhY2hlXzEsIGNhY2hlXzIpOwotICAvLyBDYWNoZSB3aXRoIGRpZmZlcmVudCBjYXBhY2l0eSBzaG91bGQgbm90IGJlIGVxdWFsCi0gIExydUNhY2hlPGludCwgaW50PiBjYWNoZV8zKDMpOwotICBjYWNoZV8zLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBjYWNoZV8zLmluc2VydF9vcl9hc3NpZ24oMiwgMjApOwotICBFWFBFQ1RfTkUoY2FjaGVfMSwgY2FjaGVfMyk7Ci0gIC8vIEVtcHR5IGNhY2hlIHNob3VsZCBub3QgYmUgZXF1YWwgdG8gbm9uLWVtcHR5IG9uZXMKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlXzQoMik7Ci0gIEVYUEVDVF9ORShjYWNoZV8xLCBjYWNoZV80KTsKLSAgLy8gRW1wdHkgY2FjaGVzIHNob3VsZCBiZSBlcXVhbAotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGVfNSgyKTsKLSAgRVhQRUNUX0VRKGNhY2hlXzQsIGNhY2hlXzUpOwotICAvLyBFbXB0eSBjYWNoZXMgd2l0aCBkaWZmZXJlbnQgY2FwYWNpdHkgc2hvdWxkIG5vdCBiZSBlcXVhbAotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGVfNigzKTsKLSAgRVhQRUNUX05FKGNhY2hlXzQsIGNhY2hlXzYpOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgdHJ5X2VtcGxhY2VfdGVzdCkgewotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMik7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgYXV0byByZXN1bHQgPSBjYWNoZS50cnlfZW1wbGFjZSg0MiwgNDIwKTsKLSAgLy8gMSwgMTAgZXZpY3RlZAotICBFWFBFQ1RfRVEoc3RkOjpnZXQ8Mj4ocmVzdWx0KSwgc3RkOjptYWtlX3BhaXIoMSwgMTApKTsKLSAgYXV0byBpdGVyID0gY2FjaGUuZmluZCg0Mik7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDQyMCk7Ci0gIEVYUEVDVF9FUShpdGVyLCBzdGQ6OmdldDwwPihyZXN1bHQpKTsKLSAgQVNTRVJUX1RIQVQoY2FjaGUsIEVsZW1lbnRzQXJlKFBhaXIoNDIsIDQyMCksIFBhaXIoMiwgMjApKSk7Ci19Ci0KLVRFU1QoTHJ1Q2FjaGVUZXN0LCBjb3B5X3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBzdGQ6OnNoYXJlZF9wdHI8aW50Pj4gY2FjaGUoMik7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgc3RkOjptYWtlX3NoYXJlZDxpbnQ+KDEwMCkpOwotICBhdXRvIGl0ZXIgPSBjYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMTAwKTsKLSAgTHJ1Q2FjaGU8aW50LCBzdGQ6OnNoYXJlZF9wdHI8aW50Pj4gbmV3X2NhY2hlID0gY2FjaGU7Ci0gIGl0ZXIgPSBuZXdfY2FjaGUuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDEwMCk7Ci0gICppdGVyLT5zZWNvbmQgPSAzMDA7Ci0gIGl0ZXIgPSBuZXdfY2FjaGUuZmluZCgxKTsKLSAgRVhQRUNUX0VRKCppdGVyLT5zZWNvbmQsIDMwMCk7Ci0gIC8vIFNpbmNlIGNvcHkgaXMgdXNlZCwgc2hhcmVkX3B0ciBzaG91bGQgaW5jcmVhc2UgY291bnQKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZC51c2VfY291bnQoKSwgMik7Ci19Ci0KLVRFU1QoTHJ1Q2FjaGVUZXN0LCBtb3ZlX3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBzdGQ6OnNoYXJlZF9wdHI8aW50Pj4gY2FjaGUoMik7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgc3RkOjptYWtlX3NoYXJlZDxpbnQ+KDEwMCkpOwotICBhdXRvIGl0ZXIgPSBjYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMTAwKTsKLSAgTHJ1Q2FjaGU8aW50LCBzdGQ6OnNoYXJlZF9wdHI8aW50Pj4gbmV3X2NhY2hlID0gc3RkOjptb3ZlKGNhY2hlKTsKLSAgaXRlciA9IG5ld19jYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMTAwKTsKLSAgKml0ZXItPnNlY29uZCA9IDMwMDsKLSAgaXRlciA9IG5ld19jYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMzAwKTsKLSAgLy8gU2luY2UgbW92ZSBpcyB1c2VkLCBzaGFyZWRfcHRyIHNob3VsZCBub3QgaW5jcmVhc2UgY291bnQKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZC51c2VfY291bnQoKSwgMSk7Ci19Ci0KLVRFU1QoTHJ1Q2FjaGVUZXN0LCBtb3ZlX2luc2VydF91bmlxdWVfcHRyX3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBzdGQ6OnVuaXF1ZV9wdHI8aW50Pj4gY2FjaGUoMik7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgc3RkOjptYWtlX3VuaXF1ZTxpbnQ+KDEwMCkpOwotICBhdXRvIGl0ZXIgPSBjYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgMTAwKTsKLSAgY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigxLCBzdGQ6Om1ha2VfdW5pcXVlPGludD4oNDAwKSk7Ci0gIGl0ZXIgPSBjYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfRVEoKml0ZXItPnNlY29uZCwgNDAwKTsKLX0KLQotVEVTVChMcnVDYWNoZVRlc3QsIG1vdmVfaW5zZXJ0X2NhY2hlX3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBMcnVDYWNoZTxpbnQsIGludD4+IGNhY2hlKDIpOwotICBMcnVDYWNoZTxpbnQsIGludD4gbTEoMik7Ci0gIG0xLmluc2VydF9vcl9hc3NpZ24oMSwgMTAwKTsKLSAgY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigxLCBzdGQ6Om1vdmUobTEpKTsKLSAgYXV0byBpdGVyID0gY2FjaGUuZmluZCgxKTsKLSAgRVhQRUNUX1RIQVQoaXRlci0+c2Vjb25kLCBFbGVtZW50c0FyZShQYWlyKDEsIDEwMCkpKTsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IG0yKDIpOwotICBtMi5pbnNlcnRfb3JfYXNzaWduKDIsIDIwMCk7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgc3RkOjptb3ZlKG0yKSk7Ci0gIGl0ZXIgPSBjYWNoZS5maW5kKDEpOwotICBFWFBFQ1RfVEhBVChpdGVyLT5zZWNvbmQsIEVsZW1lbnRzQXJlKFBhaXIoMiwgMjAwKSkpOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgZXJhc2Vfb25lX2l0ZW1fdGVzdCkgewotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMyk7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigzLCAzMCk7Ci0gIGF1dG8gaXRlciA9IGNhY2hlLmZpbmQoMik7Ci0gIC8vIDIsIDMsIDEKLSAgY2FjaGUuZmluZCgzKTsKLSAgLy8gMywgMiwgMQotICBpdGVyID0gY2FjaGUuZXJhc2UoaXRlcik7Ci0gIEVYUEVDVF9FUShpdGVyLT5maXJzdCwgMSk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDEwKTsKLSAgRVhQRUNUX1RIQVQoY2FjaGUsIEVsZW1lbnRzQXJlKFBhaXIoMywgMzApLCBQYWlyKDEsIDEwKSkpOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgZXJhc2VfaW5fZm9yX2xvb3BfdGVzdCkgewotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMyk7Ci0gIGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDIsIDIwKTsKLSAgY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigzLCAzMCk7Ci0gIGZvciAoYXV0byBpdGVyID0gY2FjaGUuYmVnaW4oKTsgaXRlciAhPSBjYWNoZS5lbmQoKTspIHsKLSAgICBpZiAoaXRlci0+Zmlyc3QgPT0gMikgewotICAgICAgaXRlciA9IGNhY2hlLmVyYXNlKGl0ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK2l0ZXI7Ci0gICAgfQotICB9Ci0gIEVYUEVDVF9USEFUKGNhY2hlLCBFbGVtZW50c0FyZShQYWlyKDMsIDMwKSwgUGFpcigxLCAxMCkpKTsKLX0KLQotVEVTVChMcnVDYWNoZVRlc3QsIGdldF9hbmRfY29udGFpbnNfa2V5X3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDMpOyAgLy8gY2FwYWNpdHkgPSAzOwotICBFWFBFQ1RfRVEoY2FjaGUuc2l6ZSgpLCAwKTsKLSAgRVhQRUNUX0VRKGNhY2hlLmZpbmQoNDIpLCBjYWNoZS5lbmQoKSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5jb250YWlucyg0MikpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbig1NiwgMjAwKSk7Ci0gIEVYUEVDVF9FUShjYWNoZS5maW5kKDQyKSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuY29udGFpbnMoNDIpKTsKLSAgRVhQRUNUX05FKGNhY2hlLmZpbmQoNTYpLCBjYWNoZS5lbmQoKSk7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLmNvbnRhaW5zKDU2KSk7Ci0gIGF1dG8gaXRlciA9IGNhY2hlLmZpbmQoNTYpOwotICBFWFBFQ1RfTkUoaXRlciwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAyMDApOwotICBFWFBFQ1RfVFJVRShjYWNoZS5leHRyYWN0KDU2KSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5jb250YWlucyg1NikpOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgcHV0X2FuZF9nZXRfc2VxdWVuY2VfMSkgewotICAvLyBTZWN0aW9uIDE6IE9yZGVyZWQgcHV0IGFuZCBvcmRlcmVkIGdldAotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMyk7ICAvLyBjYXBhY2l0eSA9IDM7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKSk7Ci0gIEVYUEVDVF9FUShjYWNoZS5zaXplKCksIDEpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCkpOwotICBFWFBFQ1RfRVEoY2FjaGUuc2l6ZSgpLCAyKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMywgMzApKTsKLSAgRVhQRUNUX0VRKGNhY2hlLnNpemUoKSwgMyk7Ci0gIC8vIDMsIDIsIDEgYWZ0ZXIgYWJvdmUgb3BlcmF0aW9ucwotCi0gIGF1dG8gZXZpY3RlZCA9IGNhY2hlLmluc2VydF9vcl9hc3NpZ24oNCwgNDApOwotICAvLyA0LCAzLCAyIGFmdGVyIGFib3ZlIG9wZXJhdGlvbnMsIDEgaXMgZXZpY3RlZAotICBFWFBFQ1RfVFJVRShldmljdGVkKTsKLSAgRVhQRUNUX0VRKCpldmljdGVkLCBzdGQ6Om1ha2VfcGFpcigxLCAxMCkpOwotICBFWFBFQ1RfRVEoY2FjaGUuZmluZCgxKSwgY2FjaGUuZW5kKCkpOwotICBMcnVDYWNoZTxpbnQsIGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gIEVYUEVDVF9ORShpdGVyID0gY2FjaGUuZmluZCg0KSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCA0MCk7Ci0gIEVYUEVDVF9ORShpdGVyID0gY2FjaGUuZmluZCgyKSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAyMCk7Ci0gIEVYUEVDVF9ORShpdGVyID0gY2FjaGUuZmluZCgzKSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAzMCk7Ci0gIC8vIDMsIDIsIDQgYWZ0ZXIgYWJvdmUgb3BlcmF0aW9ucwotCi0gIC8vIFNlY3Rpb24gMjogT3ZlciBjYXBhY2l0eSBwdXQgYW5kIG9yZGVyZWQgZ2V0Ci0gIGV2aWN0ZWQgPSBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDUsIDUwKTsKLSAgLy8gNSwgMywgMiBhZnRlciBhYm92ZSBvcGVyYXRpb25zLCA0IGlzIGV2aWN0ZWQKLSAgRVhQRUNUX0VRKGNhY2hlLnNpemUoKSwgMyk7Ci0gIEVYUEVDVF9UUlVFKGV2aWN0ZWQpOwotICBFWFBFQ1RfRVEoKmV2aWN0ZWQsIHN0ZDo6bWFrZV9wYWlyKDQsIDQwKSk7Ci0KLSAgRVhQRUNUX1RSVUUoY2FjaGUuZXh0cmFjdCgzKSk7Ci0gIC8vIDUsIDIgc2hvdWxkIGJlIGluIGNhY2hlLCAzIGlzIHJlbW92ZWQKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLmluc2VydF9vcl9hc3NpZ24oNiwgNjApKTsKLSAgLy8gNiwgNSwgMiBzaG91bGQgYmUgaW4gY2FjaGUKLQotICAvLyBTZWN0aW9uIDM6IE91dCBvZiBvcmRlciBnZXQKLSAgRVhQRUNUX0VRKGNhY2hlLmZpbmQoMyksIGNhY2hlLmVuZCgpKTsKLSAgRVhQRUNUX0VRKGNhY2hlLmZpbmQoNCksIGNhY2hlLmVuZCgpKTsKLSAgRVhQRUNUX05FKGl0ZXIgPSBjYWNoZS5maW5kKDIpLCBjYWNoZS5lbmQoKSk7Ci0gIC8vIDIsIDYsIDUgc2hvdWxkIGJlIGluIGNhY2hlCi0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDIwKTsKLSAgRVhQRUNUX05FKGl0ZXIgPSBjYWNoZS5maW5kKDYpLCBjYWNoZS5lbmQoKSk7Ci0gIC8vIDYsIDIsIDUgc2hvdWxkIGJlIGluIGNhY2hlCi0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDYwKTsKLSAgRVhQRUNUX05FKGl0ZXIgPSBjYWNoZS5maW5kKDUpLCBjYWNoZS5lbmQoKSk7Ci0gIC8vIDUsIDYsIDIgc2hvdWxkIGJlIGluIGNhY2hlCi0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDUwKTsKLSAgZXZpY3RlZCA9IGNhY2hlLmluc2VydF9vcl9hc3NpZ24oNywgNzApOwotICAvLyA3LCA1LCA2IHNob3VsZCBiZSBpbiBjYWNoZSwgMiBpcyBldmljdGVkCi0gIEVYUEVDVF9UUlVFKGV2aWN0ZWQpOwotICBFWFBFQ1RfRVEoKmV2aWN0ZWQsIHN0ZDo6bWFrZV9wYWlyKDIsIDIwKSk7Ci19Ci0KLVRFU1QoTHJ1Q2FjaGVUZXN0LCBwdXRfYW5kX2dldF9zZXF1ZW5jZV8yKSB7Ci0gIC8vIFNlY3Rpb24gMTogUmVwbGFjZSBpdGVtIGluIGNhY2hlCi0gIExydUNhY2hlPGludCwgaW50PiBjYWNoZSgyKTsgIC8vIHNpemUgPSAyOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMCkpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCkpOwotICAvLyAyLCAxIGluIGNhY2hlCi0gIGF1dG8gZXZpY3RlZCA9IGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMywgMzApOwotICAvLyAzLCAyIGluIGNhY2hlLCAxIGlzIGV2aWN0ZWQKLSAgRVhQRUNUX1RSVUUoZXZpY3RlZCk7Ci0gIEVYUEVDVF9FUSgqZXZpY3RlZCwgc3RkOjptYWtlX3BhaXIoMSwgMTApKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLmluc2VydF9vcl9hc3NpZ24oMiwgMjAwKSk7Ci0gIC8vIDIsIDMgaW4gY2FjaGUsIG5vdGhpbmcgaXMgZXZpY3RlZAotICBFWFBFQ1RfRVEoY2FjaGUuc2l6ZSgpLCAyKTsKLQotICBFWFBFQ1RfRkFMU0UoY2FjaGUuY29udGFpbnMoMSkpOwotICBMcnVDYWNoZTxpbnQsIGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gIEVYUEVDVF9ORShpdGVyID0gY2FjaGUuZmluZCgyKSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAyMDApOwotICBFWFBFQ1RfTkUoaXRlciA9IGNhY2hlLmZpbmQoMyksIGNhY2hlLmVuZCgpKTsKLSAgLy8gMywgMiBpbiBjYWNoZQotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAzMCk7Ci0KLSAgZXZpY3RlZCA9IGNhY2hlLmluc2VydF9vcl9hc3NpZ24oNCwgNDApOwotICAvLyA0LCAzIGluIGNhY2hlLCAyIGlzIGV2aWN0ZWQKLSAgRVhQRUNUX1RSVUUoZXZpY3RlZCk7Ci0gIEVYUEVDVF9FUSgqZXZpY3RlZCwgc3RkOjptYWtlX3BhaXIoMiwgMjAwKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLmNvbnRhaW5zKDIpKTsKLSAgRVhQRUNUX05FKGl0ZXIgPSBjYWNoZS5maW5kKDMpLCBjYWNoZS5lbmQoKSk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDMwKTsKLSAgRVhQRUNUX05FKGl0ZXIgPSBjYWNoZS5maW5kKDQpLCBjYWNoZS5lbmQoKSk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDQwKTsKLSAgLy8gNCwgMyBpbiBjYWNoZQotCi0gIEVYUEVDVF9UUlVFKGNhY2hlLmV4dHJhY3QoNCkpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuY29udGFpbnMoNCkpOwotICAvLyAzIGluIGNhY2hlCi0gIEVYUEVDVF9FUShjYWNoZS5zaXplKCksIDEpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMDAwKSk7Ci0gIC8vIDIsIDMgaW4gY2FjaGUKLQotICBFWFBFQ1RfRkFMU0UoY2FjaGUuY29udGFpbnMoNCkpOwotICBFWFBFQ1RfTkUoaXRlciA9IGNhY2hlLmZpbmQoMyksIGNhY2hlLmVuZCgpKTsKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZCwgMzApOwotICBFWFBFQ1RfTkUoaXRlciA9IGNhY2hlLmZpbmQoMiksIGNhY2hlLmVuZCgpKTsKLSAgRVhQRUNUX0VRKGl0ZXItPnNlY29uZCwgMjAwMCk7Ci0KLSAgRVhQRUNUX1RSVUUoY2FjaGUuZXh0cmFjdCgyKSk7Ci0gIEVYUEVDVF9UUlVFKGNhY2hlLmV4dHJhY3QoMykpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbig1LCA1MCkpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMDApKTsKLSAgRVhQRUNUX0ZBTFNFKGNhY2hlLmluc2VydF9vcl9hc3NpZ24oNSwgMTAwMCkpOwotICBFWFBFQ1RfRVEoY2FjaGUuc2l6ZSgpLCAyKTsKLSAgLy8gNSwgMSBpbiBjYWNoZQotCi0gIGV2aWN0ZWQgPSBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDYsIDIwMDApOwotICAvLyA2LCA1IGluIGNhY2hlCi0gIEVYUEVDVF9UUlVFKGV2aWN0ZWQpOwotICBFWFBFQ1RfRVEoKmV2aWN0ZWQsIHN0ZDo6bWFrZV9wYWlyKDEsIDEwMCkpOwotCi0gIEVYUEVDVF9GQUxTRShjYWNoZS5jb250YWlucygyKSk7Ci0gIEVYUEVDVF9GQUxTRShjYWNoZS5jb250YWlucygzKSk7Ci0gIEVYUEVDVF9ORShpdGVyID0gY2FjaGUuZmluZCg2KSwgY2FjaGUuZW5kKCkpOwotICBFWFBFQ1RfRVEoaXRlci0+c2Vjb25kLCAyMDAwKTsKLSAgRVhQRUNUX05FKGl0ZXIgPSBjYWNoZS5maW5kKDUpLCBjYWNoZS5lbmQoKSk7Ci0gIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIDEwMDApOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgaW5fcGxhY2VfbW9kaWZpY2F0aW9uX3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDIpOwotICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIGF1dG8gaXRlciA9IGNhY2hlLmZpbmQoMik7Ci0gIEFTU0VSVF9USEFUKGNhY2hlLCBFbGVtZW50c0FyZShQYWlyKDIsIDIwKSwgUGFpcigxLCAxMCkpKTsKLSAgaXRlci0+c2Vjb25kID0gMjAwOwotICBBU1NFUlRfVEhBVChjYWNoZSwgRWxlbWVudHNBcmUoUGFpcigyLCAyMDApLCBQYWlyKDEsIDEwKSkpOwotICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwMCk7Ci0gIC8vIDEsIDIgaW4gY2FjaGUKLSAgQVNTRVJUX1RIQVQoY2FjaGUsIEVsZW1lbnRzQXJlKFBhaXIoMSwgMTAwKSwgUGFpcigyLCAyMDApKSk7Ci0gIC8vIG1vZGlmeWluZyBpdGVyYXRvciBkb2VzIG5vdCB3YXJtIHVwIGtleQotICBpdGVyLT5zZWNvbmQgPSA0MDA7Ci0gIEFTU0VSVF9USEFUKGNhY2hlLCBFbGVtZW50c0FyZShQYWlyKDEsIDEwMCksIFBhaXIoMiwgNDAwKSkpOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgZ2V0X3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGNhY2hlKDIpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigxLCAxMCkpOwotICBFWFBFQ1RfRkFMU0UoY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCkpOwotICBFWFBFQ1RfVFJVRShjYWNoZS5jb250YWlucygxKSk7Ci0gIC8vIDEsIDIgaW4gY2FjaGUKLSAgYXV0byBldmljdGVkID0gY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigzLCAzMCk7Ci0gIC8vIDMsIDEgaW4gY2FjaGUKLSAgRVhQRUNUX1RSVUUoZXZpY3RlZCk7Ci0gIEVYUEVDVF9FUSgqZXZpY3RlZCwgc3RkOjptYWtlX3BhaXIoMiwgMjApKTsKLX0KLQotVEVTVChMcnVDYWNoZVRlc3QsIHJlbW92ZV90ZXN0KSB7Ci0gIExydUNhY2hlPGludCwgaW50PiBjYWNoZSgxMCk7Ci0gIGZvciAoaW50IGtleSA9IDA7IGtleSA8PSAzMDsga2V5KyspIHsKLSAgICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKGtleSwga2V5ICogMTAwKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPD0gMjA7IGtleSsrKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKGNhY2hlLmNvbnRhaW5zKGtleSkpOwotICB9Ci0gIGZvciAoaW50IGtleSA9IDIxOyBrZXkgPD0gMzA7IGtleSsrKSB7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuY29udGFpbnMoa2V5KSk7Ci0gIH0KLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDw9IDIwOyBrZXkrKykgewotICAgIEVYUEVDVF9GQUxTRShjYWNoZS5leHRyYWN0KGtleSkpOwotICB9Ci0gIGZvciAoaW50IGtleSA9IDIxOyBrZXkgPD0gMzA7IGtleSsrKSB7Ci0gICAgYXV0byByZW1vdmVkID0gY2FjaGUuZXh0cmFjdChrZXkpOwotICAgIEVYUEVDVF9UUlVFKHJlbW92ZWQpOwotICAgIEVYUEVDVF9FUSgqcmVtb3ZlZCwgc3RkOjptYWtlX3BhaXIoa2V5LCBrZXkgKiAxMDApKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAyMTsga2V5IDw9IDMwOyBrZXkrKykgewotICAgIEVYUEVDVF9GQUxTRShjYWNoZS5jb250YWlucyhrZXkpKTsKLSAgfQotfQotCi1URVNUKExydUNhY2hlVGVzdCwgY2xlYXJfdGVzdCkgewotICBMcnVDYWNoZTxpbnQsIGludD4gY2FjaGUoMTApOwotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCAxMDsga2V5KyspIHsKLSAgICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKGtleSwga2V5ICogMTAwKTsKLSAgfQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCAxMDsga2V5KyspIHsKLSAgICBFWFBFQ1RfVFJVRShjYWNoZS5jb250YWlucyhrZXkpKTsKLSAgfQotICBjYWNoZS5jbGVhcigpOwotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCAxMDsga2V5KyspIHsKLSAgICBFWFBFQ1RfRkFMU0UoY2FjaGUuY29udGFpbnMoa2V5KSk7Ci0gIH0KLQotICBmb3IgKGludCBrZXkgPSAwOyBrZXkgPCAxMDsga2V5KyspIHsKLSAgICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKGtleSwga2V5ICogMTAwMCk7Ci0gIH0KLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgMTA7IGtleSsrKSB7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuY29udGFpbnMoa2V5KSk7Ci0gIH0KLX0KLQotVEVTVChMcnVDYWNoZVRlc3QsIGNvbnRhaW5lcl90ZXN0KSB7Ci0gIExydUNhY2hlPGludCwgaW50PiBscnVfY2FjaGUoMik7Ci0gIGxydV9jYWNoZS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbHJ1X2NhY2hlLmluc2VydF9vcl9hc3NpZ24oMiwgMjApOwotICAvLyBXYXJtIGVsZW1lbnRzIGZpcnN0Ci0gIEFTU0VSVF9USEFUKGxydV9jYWNoZSwgRWxlbWVudHNBcmUoUGFpcigyLCAyMCksIFBhaXIoMSwgMTApKSk7Ci19Ci0KLVRFU1QoTHJ1Q2FjaGVUZXN0LCBpdGVyYXRvcl90ZXN0KSB7Ci0gIExydUNhY2hlPGludCwgaW50PiBscnVfY2FjaGUoMik7Ci0gIGxydV9jYWNoZS5pbnNlcnRfb3JfYXNzaWduKDEsIDEwKTsKLSAgbHJ1X2NhY2hlLmluc2VydF9vcl9hc3NpZ24oMiwgMjApOwotICAvLyBXYXJtIGVsZW1lbnRzIGZpcnN0Ci0gIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8aW50LCBpbnQ+PiBsaXN0KGxydV9jYWNoZS5iZWdpbigpLCBscnVfY2FjaGUuZW5kKCkpOwotICBBU1NFUlRfVEhBVChsaXN0LCBFbGVtZW50c0FyZShQYWlyKDIsIDIwKSwgUGFpcigxLCAxMCkpKTsKLX0KLQotVEVTVChMcnVDYWNoZVRlc3QsIGZvcl9sb29wX3Rlc3QpIHsKLSAgTHJ1Q2FjaGU8aW50LCBpbnQ+IGxydV9jYWNoZSgyKTsKLSAgbHJ1X2NhY2hlLmluc2VydF9vcl9hc3NpZ24oMSwgMTApOwotICBscnVfY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbigyLCAyMCk7Ci0gIC8vIFdhcm0gZWxlbWVudHMgZmlyc3QKLSAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxpbnQsIGludD4+IGxpc3Q7Ci0gIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IGxydV9jYWNoZSkgewotICAgIGxpc3QuZW1wbGFjZV9iYWNrKG5vZGUpOwotICB9Ci0gIEFTU0VSVF9USEFUKGxpc3QsIEVsZW1lbnRzQXJlKFBhaXIoMiwgMjApLCBQYWlyKDEsIDEwKSkpOwotICBsaXN0LmNsZWFyKCk7Ci0gIGZvciAoYXV0byYgbm9kZSA6IGxydV9jYWNoZSkgewotICAgIGxpc3QuZW1wbGFjZV9iYWNrKG5vZGUpOwotICAgIG5vZGUuc2Vjb25kID0gbm9kZS5zZWNvbmQgKiAyOwotICB9Ci0gIEFTU0VSVF9USEFUKGxpc3QsIEVsZW1lbnRzQXJlKFBhaXIoMiwgMjApLCBQYWlyKDEsIDEwKSkpOwotICBsaXN0LmNsZWFyKCk7Ci0gIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IGxydV9jYWNoZSkgewotICAgIGxpc3QuZW1wbGFjZV9iYWNrKG5vZGUpOwotICB9Ci0gIEFTU0VSVF9USEFUKGxpc3QsIEVsZW1lbnRzQXJlKFBhaXIoMiwgNDApLCBQYWlyKDEsIDIwKSkpOwotfQotCi1URVNUKExydUNhY2hlVGVzdCwgcHJlc3N1cmVfdGVzdCkgewotICBhdXRvIHN0YXJ0ZWQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgaW50IGNhcGFjaXR5ID0gMHhGRkZGOyAgLy8gMl4xNiA9IDY1NTM1Ci0gIExydUNhY2hlPGludCwgaW50PiBjYWNoZShzdGF0aWNfY2FzdDxzaXplX3Q+KGNhcGFjaXR5KSk7Ci0KLSAgLy8gZmlsbCB0aGUgY2FjaGUKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgY2FwYWNpdHk7IGtleSsrKSB7Ci0gICAgY2FjaGUuaW5zZXJ0X29yX2Fzc2lnbihrZXksIGtleSk7Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGZ1bGwKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgY2FwYWNpdHk7IGtleSsrKSB7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuY29udGFpbnMoa2V5KSk7Ci0gIH0KLQotICAvLyByZWZyZXNoIHRoZSBlbnRpcmUgY2FjaGUKLSAgZm9yIChpbnQga2V5ID0gMDsga2V5IDwgY2FwYWNpdHk7IGtleSsrKSB7Ci0gICAgaW50IG5ld19rZXkgPSBrZXkgKyBjYXBhY2l0eTsKLSAgICBjYWNoZS5pbnNlcnRfb3JfYXNzaWduKG5ld19rZXksIG5ld19rZXkpOwotICAgIEVYUEVDVF9GQUxTRShjYWNoZS5jb250YWlucyhrZXkpKTsKLSAgICBFWFBFQ1RfVFJVRShjYWNoZS5jb250YWlucyhuZXdfa2V5KSk7Ci0gIH0KLQotICAvLyBjbGVhciB0aGUgZW50aXJlIGNhY2hlCi0gIExydUNhY2hlPGludCwgaW50Pjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpbnQga2V5ID0gY2FwYWNpdHk7IGtleSA8IDIgKiBjYXBhY2l0eTsga2V5KyspIHsKLSAgICBFWFBFQ1RfTkUoaXRlciA9IGNhY2hlLmZpbmQoa2V5KSwgY2FjaGUuZW5kKCkpOwotICAgIEVYUEVDVF9FUShpdGVyLT5zZWNvbmQsIGtleSk7Ci0gICAgRVhQRUNUX1RSVUUoY2FjaGUuZXh0cmFjdChrZXkpKTsKLSAgfQotICBFWFBFQ1RfRVEoY2FjaGUuc2l6ZSgpLCAwKTsKLQotICAvLyB0ZXN0IGV4ZWN1dGlvbiB0aW1lCi0gIGF1dG8gZG9uZSA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBpbnQgZXhlY3V0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPihkb25lIC0gc3RhcnRlZCkuY291bnQoKTsKLSAgLy8gU2hvdWxkbid0IGJlIG1vcmUgdGhhbiAxMTIwbXMKLSAgaW50IGV4ZWN1dGlvbl90aW1lX3Blcl9jeWNsZV91cyA9IDE3OwotICBFWFBFQ1RfTFQoZXhlY3V0aW9uX3RpbWUsIGV4ZWN1dGlvbl90aW1lX3Blcl9jeWNsZV91cyAqIGNhcGFjaXR5KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9tZXRyaWNfaWRfbWFuYWdlci5jYyBiL2dkL2NvbW1vbi9tZXRyaWNfaWRfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3MjA5Ny4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vbWV0cmljX2lkX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMT0dfVEFHICJCbHVldG9vdGhNZXRyaWNJZE1hbmFnZXIiCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNfaWRfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi11c2luZyBoY2k6OkFkZHJlc3M7Ci0KLWNvbnN0IHNpemVfdCBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSA9IDIwMDsKLWNvbnN0IHNpemVfdCBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkgPSA2NTAwMDsKLWNvbnN0IGludCBNZXRyaWNJZE1hbmFnZXI6OmtNaW5JZCA9IDE7Ci1jb25zdCBpbnQgTWV0cmljSWRNYW5hZ2VyOjprTWF4SWQgPSA2NTUzNDsgIC8vIDJeMTYgLSAyCi0KLS8vIGlkIHNwYWNlIHNob3VsZCBhbHdheXMgYmUgbGFyZ2VyIHRoYW4ga01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSArCi0vLyBrTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkKLXN0YXRpY19hc3NlcnQoKE1ldHJpY0lkTWFuYWdlcjo6a01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5ICsKLSAgICAgICAgICAgICAgIE1ldHJpY0lkTWFuYWdlcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSkgPAotICAgICAgICAgICAgICAgICAgKE1ldHJpY0lkTWFuYWdlcjo6a01heElkIC0gTWV0cmljSWRNYW5hZ2VyOjprTWluSWQpLAotICAgICAgICAgICAgICAiaWQgc3BhY2Ugc2hvdWxkIGFsd2F5cyBiZSBsYXJnZXIgdGhhbiAiCi0gICAgICAgICAgICAgICJrTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5ICsgTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkiKTsKLQotTWV0cmljSWRNYW5hZ2VyOjpNZXRyaWNJZE1hbmFnZXIoKQotICAgIDogcGFpcmVkX2RldmljZV9jYWNoZV8oa01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSksCi0gICAgICB0ZW1wb3JhcnlfZGV2aWNlX2NhY2hlXyhrTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkpIHt9Ci0KLWJvb2wgTWV0cmljSWRNYW5hZ2VyOjpJbml0KAotICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxBZGRyZXNzLCBpbnQ+JiBwYWlyZWRfZGV2aWNlX21hcCwKLSAgICBDYWxsYmFjayBzYXZlX2lkX2NhbGxiYWNrLCBDYWxsYmFjayBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGlkX2FsbG9jYXRvcl9tdXRleF8pOwotICBpZiAoaW5pdGlhbGl6ZWRfKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gaW5pdCBwYWlyZWRfZGV2aWNlc19tYXAKLSAgaWYgKHBhaXJlZF9kZXZpY2VfbWFwLnNpemUoKSA+IGtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKAotICAgICAgICAiUGFpcmVkIGRldmljZSBtYXAgaGFzIHNpemUgJXp1LCB3aGljaCBpcyBiaWdnZXIgdGhhbiAiCi0gICAgICAgICJrTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5ICV6dSIsCi0gICAgICAgIHBhaXJlZF9kZXZpY2VfbWFwLnNpemUoKSwga01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gICAgLy8gZmFpbCBsb3VkbHkgdG8gbGV0IGNhbGxlciBrbm93Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbmV4dF9pZF8gPSBrTWluSWQ7Ci0gIGZvciAoY29uc3QgYXV0byYgcCA6IHBhaXJlZF9kZXZpY2VfbWFwKSB7Ci0gICAgaWYgKHAuc2Vjb25kIDwga01pbklkIHx8IHAuc2Vjb25kID4ga01heElkKSB7Ci0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIEJsdWV0b290aCBNZXRyaWMgSWQgaW4gY29uZmlnLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJJZCAlZCBvZiAlcyBpcyBvdXQgb2YgcmFuZ2UgWyVkLCAlZF0iLAotICAgICAgICAgICAgICAgICAgICAgICBwLnNlY29uZCwgcC5maXJzdC5Ub1N0cmluZygpLmNfc3RyKCksIGtNaW5JZCwga01heElkKTsKLSAgICB9Ci0gICAgYXV0byBldmljdGVkID0gcGFpcmVkX2RldmljZV9jYWNoZV8uaW5zZXJ0X29yX2Fzc2lnbihwLmZpcnN0LCBwLnNlY29uZCk7Ci0gICAgaWYgKGV2aWN0ZWQpIHsKLSAgICAgIEZvcmdldERldmljZVBvc3Rwcm9jZXNzKGV2aWN0ZWQtPmZpcnN0LCBldmljdGVkLT5zZWNvbmQpOwotICAgIH0KLSAgICBpZF9zZXRfLmluc2VydChwLnNlY29uZCk7Ci0gICAgbmV4dF9pZF8gPSBzdGQ6Om1heChuZXh0X2lkXywgcC5zZWNvbmQgKyAxKTsKLSAgfQotICBpZiAobmV4dF9pZF8gPiBrTWF4SWQpIHsKLSAgICBuZXh0X2lkXyA9IGtNaW5JZDsKLSAgfQotCi0gIC8vIGluaXQgY2FsbGJhY2tzCi0gIHNhdmVfaWRfY2FsbGJhY2tfID0gc2F2ZV9pZF9jYWxsYmFjazsKLSAgZm9yZ2V0X2RldmljZV9jYWxsYmFja18gPSBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrOwotCi0gIHJldHVybiBpbml0aWFsaXplZF8gPSB0cnVlOwotfQotCi1NZXRyaWNJZE1hbmFnZXI6On5NZXRyaWNJZE1hbmFnZXIoKSB7IENsb3NlKCk7IH0KLQotYm9vbCBNZXRyaWNJZE1hbmFnZXI6OkNsb3NlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgaWYgKCFpbml0aWFsaXplZF8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcGFpcmVkX2RldmljZV9jYWNoZV8uY2xlYXIoKTsKLSAgdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8uY2xlYXIoKTsKLSAgaWRfc2V0Xy5jbGVhcigpOwotICBpbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLU1ldHJpY0lkTWFuYWdlciYgTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpIHsKLSAgc3RhdGljIE1ldHJpY0lkTWFuYWdlciBtZXRyaWNfaWRfYWxsb2NhdG9yOwotICByZXR1cm4gbWV0cmljX2lkX2FsbG9jYXRvcjsKLX0KLQotYm9vbCBNZXRyaWNJZE1hbmFnZXI6OklzRW1wdHkoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGlkX2FsbG9jYXRvcl9tdXRleF8pOwotICByZXR1cm4gcGFpcmVkX2RldmljZV9jYWNoZV8uc2l6ZSgpID09IDAgJiYKLSAgICAgICAgIHRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfLnNpemUoKSA9PSAwOwotfQotCi0vLyBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhIG5ldyBkZXZpY2UgaXMgc2Nhbm5lZAotaW50IE1ldHJpY0lkTWFuYWdlcjo6QWxsb2NhdGVJZChjb25zdCBBZGRyZXNzJiBtYWNfYWRkcmVzcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgYXV0byBpdCA9IHBhaXJlZF9kZXZpY2VfY2FjaGVfLmZpbmQobWFjX2FkZHJlc3MpOwotICAvLyBpZiBhbHJlYWR5IGhhdmUgYW4gaWQsIHJldHVybiBpdAotICBpZiAoaXQgIT0gcGFpcmVkX2RldmljZV9jYWNoZV8uZW5kKCkpIHsKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotICBpdCA9IHRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfLmZpbmQobWFjX2FkZHJlc3MpOwotICBpZiAoaXQgIT0gdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8uZW5kKCkpIHsKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotCi0gIC8vIGZpbmQgbmV4dCBhdmFpbGFibGUgaWQKLSAgd2hpbGUgKGlkX3NldF8uY291bnQobmV4dF9pZF8pID4gMCkgewotICAgIG5leHRfaWRfKys7Ci0gICAgaWYgKG5leHRfaWRfID4ga01heElkKSB7Ci0gICAgICBuZXh0X2lkXyA9IGtNaW5JZDsKLSAgICAgIExPR19XQVJOKCJCbHVldG9vdGggbWV0cmljIGlkIG92ZXJmbG93LiIpOwotICAgIH0KLSAgfQotICBpbnQgaWQgPSBuZXh0X2lkXysrOwotICBpZF9zZXRfLmluc2VydChpZCk7Ci0gIGF1dG8gZXZpY3RlZCA9IHRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfLmluc2VydF9vcl9hc3NpZ24obWFjX2FkZHJlc3MsIGlkKTsKLSAgaWYgKGV2aWN0ZWQpIHsKLSAgICB0aGlzLT5pZF9zZXRfLmV4dHJhY3QoZXZpY3RlZC0+c2Vjb25kKTsKLSAgfQotCi0gIGlmIChuZXh0X2lkXyA+IGtNYXhJZCkgewotICAgIG5leHRfaWRfID0ga01pbklkOwotICB9Ci0gIHJldHVybiBpZDsKLX0KLQotLy8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBkZXZpY2UgaXMgcGFpcmVkCi1ib29sIE1ldHJpY0lkTWFuYWdlcjo6U2F2ZURldmljZShjb25zdCBBZGRyZXNzJiBtYWNfYWRkcmVzcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpZF9hbGxvY2F0b3JfbXV0ZXhfKTsKLSAgaWYgKHBhaXJlZF9kZXZpY2VfY2FjaGVfLmNvbnRhaW5zKG1hY19hZGRyZXNzKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICghdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8uY29udGFpbnMobWFjX2FkZHJlc3MpKSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2F2ZSBkZXZpY2UgYmVjYXVzZSBkZXZpY2UgaXMgbm90IGluICIKLSAgICAgICAgICAgICAgInRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8gb3B0ID0gdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8uZXh0cmFjdChtYWNfYWRkcmVzcyk7Ci0gIGlmICghb3B0KSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVtb3ZlIGRldmljZSBmcm9tIHRlbXBvcmFyeV9kZXZpY2VfY2FjaGVfIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludCBpZCA9IG9wdC0+c2Vjb25kOwotICBhdXRvIGV2aWN0ZWQgPSBwYWlyZWRfZGV2aWNlX2NhY2hlXy5pbnNlcnRfb3JfYXNzaWduKG1hY19hZGRyZXNzLCBpZCk7Ci0gIGlmIChldmljdGVkKSB7Ci0gICAgRm9yZ2V0RGV2aWNlUG9zdHByb2Nlc3MoZXZpY3RlZC0+Zmlyc3QsIGV2aWN0ZWQtPnNlY29uZCk7Ci0gIH0KLSAgaWYgKCFzYXZlX2lkX2NhbGxiYWNrXyhtYWNfYWRkcmVzcywgaWQpKSB7Ci0gICAgTE9HX0VSUk9SKCJDYWxsYmFjayByZXR1cm5lZCBmYWxzZSBhZnRlciBzYXZpbmcgdGhlIGRldmljZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBkZXZpY2UgaXMgZm9yZ290dGVuCi12b2lkIE1ldHJpY0lkTWFuYWdlcjo6Rm9yZ2V0RGV2aWNlKGNvbnN0IEFkZHJlc3MmIG1hY19hZGRyZXNzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGlkX2FsbG9jYXRvcl9tdXRleF8pOwotICBhdXRvIG9wdCA9IHBhaXJlZF9kZXZpY2VfY2FjaGVfLmV4dHJhY3QobWFjX2FkZHJlc3MpOwotICBpZiAoIW9wdCkgewotICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlbW92ZSBkZXZpY2UgZnJvbSBwYWlyZWRfZGV2aWNlX2NhY2hlXyIpOwotICAgIHJldHVybjsKLSAgfQotICBGb3JnZXREZXZpY2VQb3N0cHJvY2VzcyhtYWNfYWRkcmVzcywgb3B0LT5zZWNvbmQpOwotfQotCi1ib29sIE1ldHJpY0lkTWFuYWdlcjo6SXNWYWxpZElkKGNvbnN0IGludCBpZCkgewotICByZXR1cm4gaWQgPj0ga01pbklkICYmIGlkIDw9IGtNYXhJZDsKLX0KLQotdm9pZCBNZXRyaWNJZE1hbmFnZXI6OkZvcmdldERldmljZVBvc3Rwcm9jZXNzKGNvbnN0IEFkZHJlc3MmIG1hY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlkKSB7Ci0gIGlkX3NldF8uZXJhc2UoaWQpOwotICBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrXyhtYWNfYWRkcmVzcywgaWQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vbWV0cmljX2lkX21hbmFnZXIuaCBiL2dkL2NvbW1vbi9tZXRyaWNfaWRfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjM4ZTIyLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9tZXRyaWNfaWRfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJjb21tb24vbHJ1X2NhY2hlLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotY2xhc3MgTWV0cmljSWRNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcywgY29uc3QgaW50IGlkKT47Ci0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnk7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeTsKLQotICBzdGF0aWMgY29uc3QgaW50IGtNaW5JZDsKLSAgc3RhdGljIGNvbnN0IGludCBrTWF4SWQ7Ci0KLSAgfk1ldHJpY0lkTWFuYWdlcigpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHNpbmdsZXRvbgotICAgKgotICAgKiBAcmV0dXJuIE1ldHJpY0lkTWFuYWdlciYKLSAgICovCi0gIHN0YXRpYyBNZXRyaWNJZE1hbmFnZXImIEdldEluc3RhbmNlKCk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhlIGFsbG9jYXRvcgotICAgKgotICAgKiBAcGFyYW0gcGFpcmVkX2RldmljZV9tYXAgbWFwIGZyb20gbWFjX2FkZHJlc3MgdG8gaWQgYWxyZWFkeSBzYXZlZAotICAgKiBpbiB0aGUgZGlzayBiZWZvcmUgaW5pdAotICAgKiBAcGFyYW0gc2F2ZV9pZF9jYWxsYmFjayBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bGx5Ci0gICAqIHNhdmluZyBpZCBmb3IgYSBwYWlyZWQgZGV2aWNlCi0gICAqIEBwYXJhbSBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCBhZnRlcgotICAgKiBzdWNjZXNzZnVsIGlkIGRlbGV0aW9uIGZvciBmb3Jnb3R0ZW4gZGV2aWNlLAotICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkCi0gICAqLwotICBib29sIEluaXQoCi0gICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzLCBpbnQ+JiBwYWlyZWRfZGV2aWNlX21hcCwKLSAgICAgIENhbGxiYWNrIHNhdmVfaWRfY2FsbGJhY2ssCi0gICAgICBDYWxsYmFjayBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIGFsbG9jYXRvci4gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIEJsdWV0b290aCBwcm9jZXNzIGlzIGtpbGxlZAotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGNsb3NlCi0gICAqLwotICBib29sIENsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIG5vIGlkIHNhdmVkIGluIG1lbW9yeQotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgbm8gaWQgaXMgc2F2ZWQKLSAgICovCi0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBhbiBpZCBmb3IgYSBzY2FubmVkIGRldmljZSwgb3IgcmV0dXJuIHRoZSBpZCBpZiB0aGVyZSBpcyBhbHJlYWR5Ci0gICAqIG9uZQotICAgKgotICAgKiBAcGFyYW0gbWFjX2FkZHJlc3MgbWFjIGFkZHJlc3Mgb2YgQmx1ZXRvb3RoIGRldmljZQotICAgKiBAcmV0dXJuIHRoZSBpZCBvZiBkZXZpY2UKLSAgICovCi0gIGludCBBbGxvY2F0ZUlkKGNvbnN0IGhjaTo6QWRkcmVzcyYgbWFjX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBTYXZlIHRoZSBpZCBmb3IgYSBwYWlyZWQgZGV2aWNlCi0gICAqCi0gICAqIEBwYXJhbSBtYWNfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzYXZlIHN1Y2Nlc3NmdWxseQotICAgKi8KLSAgYm9vbCBTYXZlRGV2aWNlKGNvbnN0IGhjaTo6QWRkcmVzcyYgbWFjX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIGlkIGZvciBhIGRldmljZSB0byBiZSBmb3Jnb3R0ZW4KLSAgICoKLSAgICogQHBhcmFtIG1hY19hZGRyZXNzIG1hYyBhZGRyZXNzIG9mIEJsdWV0b290aCBkZXZpY2UKLSAgICovCi0gIHZvaWQgRm9yZ2V0RGV2aWNlKGNvbnN0IGhjaTo6QWRkcmVzcyYgbWFjX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiBhbiBpZCBpcyB2YWxpZC4KLSAgICogVGhlIGlkIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8ga01heElkIGFuZCBiaWdnZXIgdGhhbiBvciBlcXVhbCB0bwotICAgKiBrTWluSWQKLSAgICoKLSAgICogQHBhcmFtIG1hY19hZGRyZXNzIG1hYyBhZGRyZXNzIG9mIEJsdWV0b290aCBkZXZpY2UKLSAgICogQHJldHVybiB0cnVlIGlmIGRlbGV0ZSBzdWNjZXNzZnVsbHkKLSAgICovCi0gIHN0YXRpYyBib29sIElzVmFsaWRJZChjb25zdCBpbnQgaWQpOwotCi0gcHJvdGVjdGVkOgotICAvLyBTaW5nbGV0b24KLSAgTWV0cmljSWRNYW5hZ2VyKCk7Ci0KLSBwcml2YXRlOgotICBtdXRhYmxlIHN0ZDo6bXV0ZXggaWRfYWxsb2NhdG9yX211dGV4XzsKLQotICBMcnVDYWNoZTxoY2k6OkFkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9jYWNoZV87Ci0gIExydUNhY2hlPGhjaTo6QWRkcmVzcywgaW50PiB0ZW1wb3JhcnlfZGV2aWNlX2NhY2hlXzsKLSAgc3RkOjp1bm9yZGVyZWRfc2V0PGludD4gaWRfc2V0XzsKLQotICBpbnQgbmV4dF9pZF97a01pbklkfTsKLSAgYm9vbCBpbml0aWFsaXplZF97ZmFsc2V9OwotICBDYWxsYmFjayBzYXZlX2lkX2NhbGxiYWNrXzsKLSAgQ2FsbGJhY2sgZm9yZ2V0X2RldmljZV9jYWxsYmFja187Ci0KLSAgdm9pZCBGb3JnZXREZXZpY2VQb3N0cHJvY2Vzcyhjb25zdCBoY2k6OkFkZHJlc3MmIG1hY19hZGRyZXNzLAotICAgICAgY29uc3QgaW50IGlkKTsKLQotICAvLyBkZWxldGUgY29weSBjb25zdHJ1Y3RvciBmb3Igc2luZ2xldG9uCi0gIE1ldHJpY0lkTWFuYWdlcihNZXRyaWNJZE1hbmFnZXIgY29uc3QmKSA9IGRlbGV0ZTsKLSAgTWV0cmljSWRNYW5hZ2VyJiBvcGVyYXRvcj0oTWV0cmljSWRNYW5hZ2VyIGNvbnN0JikgPSBkZWxldGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vbWV0cmljX2lkX21hbmFnZXJfdW5pdHRlc3QuY2MgYi9nZC9jb21tb24vbWV0cmljX2lkX21hbmFnZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDAwMmIuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL21ldHJpY19pZF9tYW5hZ2VyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJjb21tb24vbWV0cmljX2lkX21hbmFnZXIuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRNYW5hZ2VyOwotCi1ibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBrdGhBZGRyZXNzKHVpbnQzMl90IGspIHsKLSAgdWludDhfdCBhcnJheVs2XSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKLSAgZm9yIChpbnQgaSA9IDU7IGkgPj0gMjsgaS0tKSB7Ci0gICAgYXJyYXlbaV0gPSBrICUgMjU2OwotICAgIGsgPSBrIC8gMjU2OwotICB9Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIGFkZHIoYXJyYXkpOwotICByZXR1cm4gYWRkcjsKLX0KLQotc3RkOjp1bm9yZGVyZWRfbWFwPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzLCBpbnQ+IGdlbmVyYXRlQWRkcmVzc2VzKAotICAgIGNvbnN0IHVpbnQzMl90IG51bSkgewotICAvLyBnZW5lcmF0ZSBmaXJzdCBudW0gb2YgbWFjIGFkZHJlc3MgLT4gaWQgcGFpcnMKLSAgLy8gaW5wdXQgbWF5IGlzIGFsd2F5cyB2YWxpZCAyNTZeNiA9IDJeNDggPiAyXjMyCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6QWRkcmVzcywgaW50PiBkZXZpY2VfbWFwOwotICBmb3IgKHNpemVfdCBrZXkgPSAwOyBrZXkgPCBudW07IGtleSsrKSB7Ci0gICAgZGV2aWNlX21hcFtrdGhBZGRyZXNzKGtleSldID0ga2V5ICsgTWV0cmljSWRNYW5hZ2VyOjprTWluSWQ7Ci0gIH0KLSAgcmV0dXJuIGRldmljZV9tYXA7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRNYW5hZ2VyVGVzdCwgTWV0cmljSWRNYW5hZ2VySW5pdENsb3NlVGVzdCkgewotICBhdXRvJiBtYW5hZ2VyID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXA7Ci0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXSgKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgY2FsbGJhY2ssIGNhbGxiYWNrKSk7Ci0gIEFTU0VSVF9GQUxTRShtYW5hZ2VyLkluaXQocGFpcmVkX2RldmljZV9tYXAsIGNhbGxiYWNrLCBjYWxsYmFjaykpOwotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkTWFuYWdlclRlc3QsIE1ldHJpY0lkTWFuYWdlck5vdENsb3NlVGVzdCkgewotICBhdXRvJiBtYW5hZ2VyID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXA7Ci0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXSgKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgY2FsbGJhY2ssIGNhbGxiYWNrKSk7Ci0KLSAgLy8gc2hvdWxkIGZhaWwgYmVjYXVzZSBpdCBpc24ndCBjbG9zZWQKLSAgQVNTRVJUX0ZBTFNFKG1hbmFnZXIuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgY2FsbGJhY2ssIGNhbGxiYWNrKSk7Ci0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuQ2xvc2UoKSk7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRNYW5hZ2VyVGVzdCwgTWV0cmljSWRNYW5hZ2VyU2NhbkRldmljZUZyb21FbXB0eVRlc3QpIHsKLSAgYXV0byYgbWFuYWdlciA9IE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKTsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBNZXRyaWNJZE1hbmFnZXI6OkNhbGxiYWNrIGNhbGxiYWNrID0gW10oCi0gICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyYsIGNvbnN0IGludCkgewotICAgIHJldHVybiB0cnVlOwotICB9OwotICAvLyB0ZXN0IGVtcHR5IG1hcCwgbmV4dCBpZCBzaG91bGQgYmUga01pbklkCi0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgY2FsbGJhY2ssIGNhbGxiYWNrKSk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcygwKSksIE1ldHJpY0lkTWFuYWdlcjo6a01pbklkKTsKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKDEpKSwgTWV0cmljSWRNYW5hZ2VyOjprTWluSWQgKyAxKTsKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKDApKSwgTWV0cmljSWRNYW5hZ2VyOjprTWluSWQpOwotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoMikpLCBNZXRyaWNJZE1hbmFnZXI6OmtNaW5JZCArIDIpOwotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkTWFuYWdlclRlc3QsCi0gICAgIE1ldHJpY0lkTWFuYWdlclNjYW5EZXZpY2VGcm9tRmlsbGVkVGVzdCkgewotICBhdXRvJiBtYW5hZ2VyID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXA7Ci0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXSgKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIGludCBpZCA9IHN0YXRpY19jYXN0PGludD4oTWV0cmljSWRNYW5hZ2VyOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5KSArCi0gICAgICAgICAgIE1ldHJpY0lkTWFuYWdlcjo6a01pbklkOwotICAvLyBuZXh0IGlkIHNob3VsZCBiZSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkKLSAgcGFpcmVkX2RldmljZV9tYXAgPQotICAgICAgZ2VuZXJhdGVBZGRyZXNzZXMoTWV0cmljSWRNYW5hZ2VyOjprTWF4TnVtUGFpcmVkRGV2aWNlc0luTWVtb3J5KTsKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLSAgLy8gdHJ5IG5ldyB2YWx1ZXMgbm90IGluIHRoZSBtYXAsIHNob3VsZCBnZXQgbmV3IGlkLgotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoSU5UX01BWCkpLCBpZCk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhJTlRfTUFYIC0gMSkpLCBpZCArIDEpOwotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoSU5UX01BWCkpLCBpZCk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhJTlRfTUFYIC0gMikpLCBpZCArIDIpOwotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkTWFuYWdlclRlc3QsIE1ldHJpY0lkTWFuYWdlckFsbG9jYXRlRXhpc3RpbmdUZXN0KSB7Ci0gIGF1dG8mIG1hbmFnZXIgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcCA9Ci0gICAgICBnZW5lcmF0ZUFkZHJlc3NlcyhNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkpOwotCi0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXSgKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIGludCBpZCA9IE1ldHJpY0lkTWFuYWdlcjo6a01pbklkOwotICAvLyBuZXh0IGlkIHNob3VsZCBiZSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLQotICAvLyB0cnkgdmFsdWVzIGFscmVhZHkgaW4gdGhlIG1hcCwgc2hvdWxkIGdldCBuZXcgaWQuCi0gIEFTU0VSVF9FUSgKLSAgICAgIG1hbmFnZXIuQWxsb2NhdGVJZChibHVldG9vdGg6OmhjaTo6QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMH0pKSwgaWQpOwotICBBU1NFUlRfRVEoCi0gICAgICBtYW5hZ2VyLkFsbG9jYXRlSWQoCi0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDF9KSksIGlkICsgMSk7Ci0gIEFTU0VSVF9FUSgKLSAgICAgIG1hbmFnZXIuQWxsb2NhdGVJZChibHVldG9vdGg6OmhjaTo6QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMH0pKSwgaWQpOwotICBBU1NFUlRfRVEoCi0gICAgICBtYW5hZ2VyLkFsbG9jYXRlSWQoCi0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDJ9KSksIGlkICsgMik7Ci0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuQ2xvc2UoKSk7Ci19Ci0KLVRFU1QoQmx1ZXRvb3RoTWV0cmljSWRNYW5hZ2VyVGVzdCwgTWV0cmljSWRNYW5hZ2VyTWFpblRlc3QxKSB7Ci0gIGF1dG8mIG1hbmFnZXIgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcDsKLSAgaW50IHBsYWNlaG9sZGVyID0gMjI7Ci0gIGludCogcG9pbnRlciA9ICZwbGFjZWhvbGRlcjsKLSAgTWV0cmljSWRNYW5hZ2VyOjpDYWxsYmFjayBzYXZlX2NhbGxiYWNrID0gW3BvaW50ZXJdKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmLAotICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAqIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgZm9yZ2V0X2NhbGxiYWNrID0gW3BvaW50ZXJdKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmLAotICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAvIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0KLSAgQVNTRVJUX1RSVUUoCi0gICAgICBtYW5hZ2VyLkluaXQocGFpcmVkX2RldmljZV9tYXAsIHNhdmVfY2FsbGJhY2ssIGZvcmdldF9jYWxsYmFjaykpOwotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAwfSkpLAotICAgICAgICAgICAgTWV0cmljSWRNYW5hZ2VyOjprTWluSWQpOwotICAvLyBzYXZlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICBBU1NFUlRfVFJVRSgKLSAgICAgIG1hbmFnZXIuU2F2ZURldmljZShibHVldG9vdGg6OmhjaTo6QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMH0pKSk7Ci0gIEFTU0VSVF9FUShwbGFjZWhvbGRlciwgNDQpOwotCi0gIC8vIHNob3VsZCBmYWlsLCBzaW5jZSBpZCBvZiBkZXZpY2UgaXMgbm90IGFsbG9jYXRlZAotICBBU1NFUlRfRkFMU0UoCi0gICAgICBtYW5hZ2VyLlNhdmVEZXZpY2UoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MoezAsIDAsIDAsIDAsIDAsIDF9KSkpOwotICBBU1NFUlRfRVEocGxhY2Vob2xkZXIsIDQ0KTsKLQotICAvLyBzYXZlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAyfSkpLAotICAgICAgICAgICAgTWV0cmljSWRNYW5hZ2VyOjprTWluSWQgKyAxKTsKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChibHVldG9vdGg6OmhjaTo6QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgM30pKSwKLSAgICAgICAgICAgIE1ldHJpY0lkTWFuYWdlcjo6a01pbklkICsgMik7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgbWFuYWdlci5TYXZlRGV2aWNlKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAyfSkpKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCA4OCk7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgbWFuYWdlci5TYXZlRGV2aWNlKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAzfSkpKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCAxNzYpOwotCi0gIC8vIHNob3VsZCBiZSB0cnVlIGJ1dCBjYWxsYmFjayB3b24ndCBiZSBjYWxsZWQsIHNpbmNlIGlkIGhhZCBiZWVuIHNhdmVkCi0gIEFTU0VSVF9UUlVFKAotICAgICAgbWFuYWdlci5TYXZlRGV2aWNlKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzKHswLCAwLCAwLCAwLCAwLCAwfSkpKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCAxNzYpOwotCi0gIC8vIGZvcmdldAotICBtYW5hZ2VyLkZvcmdldERldmljZShibHVldG9vdGg6OmhjaTo6QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMX0pKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCAxNzYpOwotICBtYW5hZ2VyLkZvcmdldERldmljZShibHVldG9vdGg6OmhjaTo6QWRkcmVzcyh7MCwgMCwgMCwgMCwgMCwgMn0pKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCA4OCk7Ci0KLSAgQVNTRVJUX1RSVUUobWFuYWdlci5DbG9zZSgpKTsKLX0KLQotVEVTVChCbHVldG9vdGhNZXRyaWNJZE1hbmFnZXJUZXN0LCBNZXRyaWNJZE1hbmFnZXJGdWxsUGFpcmVkTWFwKSB7Ci0gIGF1dG8mIG1hbmFnZXIgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gIC8vIHByZXNldCBhIGZ1bGwgbWFwCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcCA9Ci0gICAgICBnZW5lcmF0ZUFkZHJlc3NlcyhNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkpOwotICBpbnQgcGxhY2Vob2xkZXIgPSAyNDM7Ci0gIGludCogcG9pbnRlciA9ICZwbGFjZWhvbGRlcjsKLSAgTWV0cmljSWRNYW5hZ2VyOjpDYWxsYmFjayBzYXZlX2NhbGxiYWNrID0gW3BvaW50ZXJdKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmLAotICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAqIDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgZm9yZ2V0X2NhbGxiYWNrID0gW3BvaW50ZXJdKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmLAotICAgICAgY29uc3QgaW50KSB7Ci0gICAgKnBvaW50ZXIgPSAqcG9pbnRlciAvIDM7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0KLSAgQVNTRVJUX1RSVUUoCi0gICAgICBtYW5hZ2VyLkluaXQocGFpcmVkX2RldmljZV9tYXAsIHNhdmVfY2FsbGJhY2ssIGZvcmdldF9jYWxsYmFjaykpOwotCi0gIC8vIGNoZWNrIGlmIGFsbCBwcmVzZXQgaWRzIGFyZSB0aGVyZS4KLSAgLy8gY29tbWVudHMgYmFzZWQgb24ga01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSA9IDIwMC4gSXQgY2FuIGNoYW5nZS4KLSAgaW50IGtleSA9IDA7Ci0gIGZvciAoa2V5ID0gMDsKLSAgICAgICBrZXkgPCBzdGF0aWNfY2FzdDxpbnQ+KE1ldHJpY0lkTWFuYWdlcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gICAgICAga2V5KyspIHsKLSAgICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3Moa2V5KSksCi0gICAgICAgICAgICAgIGtleSArIE1ldHJpY0lkTWFuYWdlcjo6a01pbklkKTsKLSAgfQotICAvLyBwYWlyZWQ6IDAsIDEsIDIgLi4uIDE5OSwKLSAgLy8gc2Nhbm5lZDoKLQotICBpbnQgaWQgPSBzdGF0aWNfY2FzdDxpbnQ+KE1ldHJpY0lkTWFuYWdlcjo6a01heE51bVBhaXJlZERldmljZXNJbk1lbW9yeSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljSWRNYW5hZ2VyOjprTWluSWQpOwotICAvLyBuZXh0IGlkIHNob3VsZCBiZSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkgKwotICAvLyBNZXRyaWNJZE1hbmFnZXI6OmtNaW5JZAotCi0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkpKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogMCwgMSwgMiAuLi4gMTk5LAotICAvLyBzY2FubmVkOiAyMDAKLQotICAvLyBzYXZlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICBBU1NFUlRfVFJVRShtYW5hZ2VyLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkpKSk7Ci0gIC8vIG9uZSBrZXkgaXMgZXZpY3RlZCwgYW5vdGhlciBrZXkgaXMgc2F2ZWQgc28gKjIvMwotICBBU1NFUlRfRVEocGxhY2Vob2xkZXIsIDE2Mik7Ci0KLSAgLy8gcGFpcmVkOiAxLCAyIC4uLiAxOTksIDIwMCwKLSAgLy8gc2Nhbm5lZDoKLQotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoMCkpLCBpZCsrKTsKLSAgLy8gcGFpcmVkOiAxLCAyIC4uLiAxOTksIDIwMAotICAvLyBzY2FubmVkOiAwCi0KLSAgLy8ga2V5ID09IDIwMAotICAvLyBzaG91bGQgZmFpbCwgc2luY2UgaWQgb2YgZGV2aWNlIGlzIG5vdCBhbGxvY2F0ZWQKLSAgQVNTRVJUX0ZBTFNFKG1hbmFnZXIuU2F2ZURldmljZShrdGhBZGRyZXNzKGtleSArIDEpKSk7Ci0gIEFTU0VSVF9FUShwbGFjZWhvbGRlciwgMTYyKTsKLSAgLy8gcGFpcmVkOiAxLCAyIC4uLiAxOTksIDIwMCwKLSAgLy8gc2Nhbm5lZDogMAotCi0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkgKyAxKSksIGlkKyspOwotICBBU1NFUlRfVFJVRShtYW5hZ2VyLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAxKSkpOwotICAvLyBvbmUga2V5IGlzIGV2aWN0ZWQsIGFub3RoZXIga2V5IGlzIHNhdmVkIHNvICoyLzMsCi0gIEFTU0VSVF9FUShwbGFjZWhvbGRlciwgMTA4KTsKLSAgLy8gcGFpcmVkOiAyIC4uLiAxOTksIDIwMCwgMjAxCi0gIC8vIHNjYW5uZWQ6IDAKLQotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MoMSkpLCBpZCsrKTsKLSAgLy8gcGFpcmVkOiAyIC4uLiAxOTksIDIwMCwgMjAxLAotICAvLyBzY2FubmVkOiAwLCAxCi0KLSAgLy8gc2F2ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSArIDIpKSwgaWQrKyk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkgKyAzKSksIGlkKyspOwotICAvLyBwYWlyZWQ6IDIgLi4uIDE5OSwgMjAwLCAyMDEsCi0gIC8vIHNjYW5uZWQ6IDAsIDEsIDIwMiwgMjAzCi0KLSAgcGxhY2Vob2xkZXIgPSA5OwotICBBU1NFUlRfVFJVRShtYW5hZ2VyLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAyKSkpOwotICAvLyBvbmUga2V5IGlzIGV2aWN0ZWQsIGFub3RoZXIga2V5IGlzIHNhdmVkIHNvICoyLzMsCi0gIEFTU0VSVF9FUShwbGFjZWhvbGRlciwgNik7Ci0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuU2F2ZURldmljZShrdGhBZGRyZXNzKGtleSArIDMpKSk7Ci0gIC8vIG9uZSBrZXkgaXMgZXZpY3RlZCwgYW5vdGhlciBrZXkgaXMgc2F2ZWQgc28gKjIvMywKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCA0KTsKLSAgLy8gcGFpcmVkOiA0IC4uLiAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMwotICAvLyBzY2FubmVkOiAwLCAxCi0KLSAgLy8gc2hvdWxkIGJlIHRydWUgYnV0IGNhbGxiYWNrIHdvbid0IGJlIGNhbGxlZCwgc2luY2UgaWQgaGFkIGJlZW4gc2F2ZWQKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5TYXZlRGV2aWNlKGt0aEFkZHJlc3Moa2V5ICsgMikpKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCA0KTsKLQotICBwbGFjZWhvbGRlciA9IDI3OwotICAvLyBmb3JnZXQKLSAgbWFuYWdlci5Gb3JnZXREZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAyMDApKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCAyNyk7ICAvLyBzaG91bGQgZmFpbCwgbm8gc3VjaCBhIGtleQotICBtYW5hZ2VyLkZvcmdldERldmljZShrdGhBZGRyZXNzKGtleSArIDIpKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCA5KTsKLSAgLy8gcGFpcmVkOiA0IC4uLiAxOTksIDIwMCwgMjAxLCAyMDMKLSAgLy8gc2Nhbm5lZDogMCwgMQotCi0gIC8vIHNhdmUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhrZXkgKyAyKSksIGlkKyspOwotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3Moa2V5ICsgNCkpLCBpZCsrKTsKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSArIDUpKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogNCAuLi4gMTk5LCAyMDAsIDIwMSwgMjAzCi0gIC8vIHNjYW5uZWQ6IDAsIDEsIDIwMiwgMjA0LCAyMDUKLQotICBBU1NFUlRfVFJVRShtYW5hZ2VyLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAyKSkpOwotICBBU1NFUlRfRVEocGxhY2Vob2xkZXIsIDE4KTsgIC8vIG5vIGtleSBpcyBldmljdGVkLCBhIGtleSBpcyBzYXZlZCBzbyAqMiwKLQotICAvLyBzaG91bGQgYmUgdHJ1ZSBidXQgY2FsbGJhY2sgd29uJ3QgYmUgY2FsbGVkLCBzaW5jZSBpZCBoYWQgYmVlbiBzYXZlZAotICBBU1NFUlRfVFJVRShtYW5hZ2VyLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyAzKSkpOwotICBBU1NFUlRfRVEocGxhY2Vob2xkZXIsIDE4KTsgIC8vIG5vIHN1Y2ggYSBrZXkgaW4gc2Nhbm5lZAotICBBU1NFUlRfVFJVRShtYW5hZ2VyLlNhdmVEZXZpY2Uoa3RoQWRkcmVzcyhrZXkgKyA0KSkpOwotICAvLyBvbmUga2V5IGlzIGV2aWN0ZWQsIGFub3RoZXIga2V5IGlzIHNhdmVkIHNvICoyLzMKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCAxMik7Ci0gIC8vIHBhaXJlZDogNSA2IC4uLiAxOTksIDIwMCwgMjAxLCAyMDMsIDIwMiwgMjA0Ci0gIC8vIHNjYW5uZWQ6IDAsIDEsIDIwNQotCi0gIC8vIHZlcmlmeSBwYWlyZWQ6Ci0gIGZvciAoa2V5ID0gNTsga2V5IDw9IDE5OTsga2V5KyspIHsKLSAgICBwbGFjZWhvbGRlciA9IDM7Ci0gICAgbWFuYWdlci5Gb3JnZXREZXZpY2Uoa3RoQWRkcmVzcyhrZXkpKTsKLSAgICBBU1NFUlRfRVEocGxhY2Vob2xkZXIsIDEpOwotICB9Ci0gIGZvciAoc2l6ZV90IGsgPSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnk7Ci0gICAgICAgayA8PSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkgKyA0OyBrKyspIHsKLSAgICBwbGFjZWhvbGRlciA9IDM7Ci0gICAgbWFuYWdlci5Gb3JnZXREZXZpY2Uoa3RoQWRkcmVzcyhrKSk7Ci0gICAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCAxKTsKLSAgfQotCi0gIC8vIHZlcmlmeSBzY2FubmVkCi0gIHBsYWNlaG9sZGVyID0gNDsKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5TYXZlRGV2aWNlKGt0aEFkZHJlc3MoMCkpKTsKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5TYXZlRGV2aWNlKGt0aEFkZHJlc3MoMSkpKTsKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5TYXZlRGV2aWNlKAotICAgICAga3RoQWRkcmVzcyhNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1QYWlyZWREZXZpY2VzSW5NZW1vcnkgKyA1KSkpOwotICBBU1NFUlRfRVEocGxhY2Vob2xkZXIsIDMyKTsKLQotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkTWFuYWdlclRlc3QsIE1ldHJpY0lkTWFuYWdlckZ1bGxTY2FubmVkTWFwKSB7Ci0gIGF1dG8mIG1hbmFnZXIgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcDsKLSAgaW50IHBsYWNlaG9sZGVyID0gMjI7Ci0gIGludCogcG9pbnRlciA9ICZwbGFjZWhvbGRlcjsKLSAgTWV0cmljSWRNYW5hZ2VyOjpDYWxsYmFjayBzYXZlX2NhbGxiYWNrID0gW3BvaW50ZXJdKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmLGNvbnN0IGludCkgewotICAgICpwb2ludGVyID0gKnBvaW50ZXIgKiAyOwotICAgIHJldHVybiB0cnVlOwotICB9OwotICBNZXRyaWNJZE1hbmFnZXI6OkNhbGxiYWNrIGZvcmdldF9jYWxsYmFjayA9IFtwb2ludGVyXSgKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzJixjb25zdCBpbnQpIHsKLSAgICAqcG9pbnRlciA9ICpwb2ludGVyIC8gMjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLQotICBBU1NFUlRfVFJVRSgKLSAgICAgIG1hbmFnZXIuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgc2F2ZV9jYWxsYmFjaywgZm9yZ2V0X2NhbGxiYWNrKSk7Ci0KLSAgLy8gYWxsb2NhdGUga01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5IGlkcwotICAvLyBjb21tZW50cyBiYXNlZCBvbiBrTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkgPSAyMDAKLSAgZm9yIChpbnQga2V5ID0gMDsKLSAgICAgICBrZXkgPAotICAgICAgIHN0YXRpY19jYXN0PGludD4oTWV0cmljSWRNYW5hZ2VyOjprTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkpOwotICAgICAgIGtleSsrKSB7Ci0gICAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSkpLAotICAgICAgICAgICAgICBrZXkgKyBNZXRyaWNJZE1hbmFnZXI6OmtNaW5JZCk7Ci0gIH0KLSAgLy8gc2Nhbm5lZDogMCwgMSwgMiAuLi4gMTk5LAotICAvLyBwYWlyZWQ6Ci0KLSAgaW50IGlkID0gTWV0cmljSWRNYW5hZ2VyOjprTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkgKwotICAgICAgICAgICBNZXRyaWNJZE1hbmFnZXI6OmtNaW5JZDsKLSAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkciA9Ci0gICAgICBrdGhBZGRyZXNzKE1ldHJpY0lkTWFuYWdlcjo6a01heE51bVVucGFpcmVkRGV2aWNlc0luTWVtb3J5KTsKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChhZGRyKSwgaWQpOwotICAvLyBzY2FubmVkOiAxLCAyIC4uLiAxOTksIDIwMAotCi0gIC8vIHNhdmUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuU2F2ZURldmljZShhZGRyKSk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoYWRkciksIGlkKTsKLSAgQVNTRVJUX0VRKHBsYWNlaG9sZGVyLCA0NCk7Ci0gIC8vIHBhaXJlZDogMjAwLAotICAvLyBzY2FubmVkOiAxLCAyIC4uLiAxOTksCi0gIGlkKys7Ci0KLSAgYWRkciA9IGt0aEFkZHJlc3MoTWV0cmljSWRNYW5hZ2VyOjprTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkgKyAxKTsKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChhZGRyKSwgaWQrKyk7Ci0gIC8vIHBhaXJlZDogMjAwLAotICAvLyBzY2FubmVkOiAxLCAyIC4uLiAxOTksIDIwMQotCi0gIC8vIHRyeSB0byBhbGxvY2F0ZSBmb3IgZGV2aWNlIDAsIDEsIDIsIDMsIDQuLi4uMTk5Ci0gIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IGlkIGV2ZXJ5IHRpbWUsCi0gIC8vIHNpbmNlIHRoZSBzY2FubmVkIG1hcCBpcyBmdWxsIGF0IHRoaXMgcG9pbnQKLSAgZm9yIChpbnQga2V5ID0gMDsKLSAgICAgICBrZXkgPAotICAgICAgIHN0YXRpY19jYXN0PGludD4oTWV0cmljSWRNYW5hZ2VyOjprTWF4TnVtVW5wYWlyZWREZXZpY2VzSW5NZW1vcnkpOwotICAgICAgIGtleSsrKSB7Ci0gICAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKGtleSkpLCBpZCsrKTsKLSAgfQotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkTWFuYWdlclRlc3QsIE1ldHJpY0lkTWFuYWdlck11bHRpVGhyZWFkUHJlc3N1cmVUZXN0KSB7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6QWRkcmVzcywgaW50PiBwYWlyZWRfZGV2aWNlX21hcDsKLSAgYXV0byYgbWFuYWdlciA9IE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKTsKLSAgaW50IHBsYWNlaG9sZGVyID0gMjI7Ci0gIGludCogcG9pbnRlciA9ICZwbGFjZWhvbGRlcjsKLSAgTWV0cmljSWRNYW5hZ2VyOjpDYWxsYmFjayBzYXZlX2NhbGxiYWNrID0gW3BvaW50ZXJdKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmLCBjb25zdCBpbnQpIHsKLSAgICAqcG9pbnRlciA9ICpwb2ludGVyICsgMTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfTsKLSAgTWV0cmljSWRNYW5hZ2VyOjpDYWxsYmFjayBmb3JnZXRfY2FsbGJhY2sgPSBbcG9pbnRlcl0oCi0gICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyYsIGNvbnN0IGludCkgewotICAgICpwb2ludGVyID0gKnBvaW50ZXIgLSAxOwotICAgIHJldHVybiB0cnVlOwotICB9OwotICBBU1NFUlRfVFJVRSgKLSAgICAgIG1hbmFnZXIuSW5pdChwYWlyZWRfZGV2aWNlX21hcCwgc2F2ZV9jYWxsYmFjaywgZm9yZ2V0X2NhbGxiYWNrKSk7Ci0KLSAgLy8gbWFrZSBzdXJlIG5vIGRlYWRsb2NrCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiB3b3JrZXJzOwotICBmb3IgKGludCBrZXkgPSAwOwotICAgICAgIGtleSA8Ci0gICAgICAgc3RhdGljX2Nhc3Q8aW50PihNZXRyaWNJZE1hbmFnZXI6OmtNYXhOdW1VbnBhaXJlZERldmljZXNJbk1lbW9yeSk7Ci0gICAgICAga2V5KyspIHsKLSAgICB3b3JrZXJzLnB1c2hfYmFjayhzdGQ6OnRocmVhZChba2V5XSgpIHsKLSAgICAgIGF1dG8mIG1hbmFnZXIgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gICAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBmYWtlX21hY19hZGRyZXNzID0ga3RoQWRkcmVzcyhrZXkpOwotICAgICAgbWFuYWdlci5BbGxvY2F0ZUlkKGZha2VfbWFjX2FkZHJlc3MpOwotICAgICAgQVNTRVJUX1RSVUUobWFuYWdlci5TYXZlRGV2aWNlKGZha2VfbWFjX2FkZHJlc3MpKTsKLSAgICAgIG1hbmFnZXIuRm9yZ2V0RGV2aWNlKGZha2VfbWFjX2FkZHJlc3MpOwotICAgIH0pKTsKLSAgfQotICBmb3IgKGF1dG8mIHdvcmtlciA6IHdvcmtlcnMpIHsKLSAgICB3b3JrZXIuam9pbigpOwotICB9Ci0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuSXNFbXB0eSgpKTsKLSAgQVNTRVJUX1RSVUUobWFuYWdlci5DbG9zZSgpKTsKLX0KLQotVEVTVChCbHVldG9vdGhNZXRyaWNJZE1hbmFnZXJUZXN0LCBNZXRyaWNJZE1hbmFnZXJXcmFwQXJvdW5kVGVzdDEpIHsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzLCBpbnQ+IHBhaXJlZF9kZXZpY2VfbWFwOwotICBhdXRvJiBtYW5hZ2VyID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICBNZXRyaWNJZE1hbmFnZXI6OkNhbGxiYWNrIGNhbGxiYWNrID0gW10oCi0gICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyYsIGNvbnN0IGludCkgewotICAgIHJldHVybiB0cnVlOwotICB9OwotCi0gIC8vIG1ha2UgYSBzcGFyc2UgcGFpcmVkX2RldmljZV9tYXAKLSAgaW50IG1pbl9pZCA9IE1ldHJpY0lkTWFuYWdlcjo6a01pbklkOwotICBwYWlyZWRfZGV2aWNlX21hcFtrdGhBZGRyZXNzKG1pbl9pZCldID0gbWluX2lkOwotICBwYWlyZWRfZGV2aWNlX21hcFtrdGhBZGRyZXNzKG1pbl9pZCArIDEpXSA9IG1pbl9pZCArIDE7Ci0gIHBhaXJlZF9kZXZpY2VfbWFwW2t0aEFkZHJlc3MobWluX2lkICsgMyldID0gbWluX2lkICsgMzsKLSAgcGFpcmVkX2RldmljZV9tYXBba3RoQWRkcmVzcyhtaW5faWQgKyA0KV0gPSBtaW5faWQgKyA0OwotCi0gIGludCBtYXhfaWQgPSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhJZDsKLSAgcGFpcmVkX2RldmljZV9tYXBba3RoQWRkcmVzcyhtYXhfaWQgLSAzKV0gPSBtYXhfaWQgLSAzOwotICBwYWlyZWRfZGV2aWNlX21hcFtrdGhBZGRyZXNzKG1heF9pZCAtIDQpXSA9IG1heF9pZCAtIDQ7Ci0KLSAgQVNTRVJUX1RSVUUobWFuYWdlci5Jbml0KHBhaXJlZF9kZXZpY2VfbWFwLCBjYWxsYmFjaywgY2FsbGJhY2spKTsKLQotICAvLyBuZXh0IGlkIHNob3VsZCBiZSBtYXhfaWQgLSAyLCBtYXhfaWQgLSAxLCBtYXhfaWQsIG1pbl9pZCArIDIsIG1pbl9pZCArIDUKLSAgQVNTRVJUX0VRKG1hbmFnZXIuQWxsb2NhdGVJZChrdGhBZGRyZXNzKG1heF9pZCAtIDIpKSwgbWF4X2lkIC0gMik7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhtYXhfaWQgLSAxKSksIG1heF9pZCAtIDEpOwotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWF4X2lkKSksIG1heF9pZCk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhtaW5faWQgKyAyKSksIG1pbl9pZCArIDIpOwotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWluX2lkICsgNSkpLCBtaW5faWQgKyA1KTsKLQotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkNsb3NlKCkpOwotfQotCi1URVNUKEJsdWV0b290aE1ldHJpY0lkTWFuYWdlclRlc3QsIE1ldHJpY0lkTWFuYWdlcldyYXBBcm91bmRUZXN0MikgewotICBzdGQ6OnVub3JkZXJlZF9tYXA8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXA7Ci0gIGF1dG8mIG1hbmFnZXIgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gIE1ldHJpY0lkTWFuYWdlcjo6Q2FsbGJhY2sgY2FsbGJhY2sgPSBbXSgKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzJiwgY29uc3QgaW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH07Ci0KLSAgLy8gbWFrZSBhIHNwYXJzZSBwYWlyZWRfZGV2aWNlX21hcAotICBpbnQgbWluX2lkID0gTWV0cmljSWRNYW5hZ2VyOjprTWluSWQ7Ci0gIGludCBtYXhfaWQgPSBNZXRyaWNJZE1hbmFnZXI6OmtNYXhJZDsKLSAgcGFpcmVkX2RldmljZV9tYXBba3RoQWRkcmVzcyhtYXhfaWQpXSA9IG1heF9pZDsKLQotICBBU1NFUlRfVFJVRShtYW5hZ2VyLkluaXQocGFpcmVkX2RldmljZV9tYXAsIGNhbGxiYWNrLCBjYWxsYmFjaykpOwotCi0gIC8vIG5leHQgaWQgc2hvdWxkIGJlIG1pbl9pZCwgbWluX2lkICsgMQotICBBU1NFUlRfRVEobWFuYWdlci5BbGxvY2F0ZUlkKGt0aEFkZHJlc3MobWluX2lkKSksIG1pbl9pZCk7Ci0gIEFTU0VSVF9FUShtYW5hZ2VyLkFsbG9jYXRlSWQoa3RoQWRkcmVzcyhtaW5faWQgKyAxKSksIG1pbl9pZCArIDEpOwotCi0gIEFTU0VSVF9UUlVFKG1hbmFnZXIuQ2xvc2UoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9jb21tb24vbXVsdGlfcHJpb3JpdHlfcXVldWUuaCBiL2dkL2NvbW1vbi9tdWx0aV9wcmlvcml0eV9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ2Y2Q5Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9tdWx0aV9wcmlvcml0eV9xdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotLyoqCi0gKiBBIHF1ZXVlIGltcGxlbWVudGF0aW9uIHdoaWNoIHN1cHBvcnRzIGl0ZW1zIHdpdGggbXVsdGlwbGUgcHJpb3JpdGllcy4KLSAqIEl0ZW1zIHdpdGggZ3JlYXRlciBwcmlvcml0eSB2YWx1ZSB3aWxsIGJlIGRlcXVldWVkIGZpcnN0LgotICogV2hlbiBFbnF1ZXVpbmcsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBwcmlvcml0eSAoMCBieSBkZWZhdWx0KS4KLSAqIFRoaXMgY2FuIGJlIHVzZWQgYnkgQUNMIG9yIEwyQ0FQIGxvd2VyIHF1ZXVlIGVuZCBzZW5kZXIgdG8gcHJpb3JpdGl6ZSBzb21lIGxpbmsgb3IgY2hhbm5lbCwgdXNlZCBieSBBMkRQLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE5VTV9QUklPUklUWV9MRVZFTFMgPSAyPgotY2xhc3MgTXVsdGlQcmlvcml0eVF1ZXVlIHsKLSAgc3RhdGljX2Fzc2VydChOVU1fUFJJT1JJVFlfTEVWRUxTID4gMSk7Ci0KLSBwdWJsaWM6Ci0gIC8vIEdldCB0aGUgZnJvbnQgaXRlbSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5LiAgUXVldWUgbXVzdCBiZSBub24tZW1wdHkuCi0gIFQmIGZyb250KCkgewotICAgIHJldHVybiBxdWV1ZXNfW25leHRfdG9fZGVxdWV1ZV8udG9wKCldLmZyb250KCk7Ci0gIH0KLQotICBbW25vZGlzY2FyZF1dIGJvb2wgZW1wdHkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5leHRfdG9fZGVxdWV1ZV8uZW1wdHkoKTsKLSAgfQotCi0gIFtbbm9kaXNjYXJkXV0gc2l6ZV90IHNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5leHRfdG9fZGVxdWV1ZV8uc2l6ZSgpOwotICB9Ci0KLSAgLy8gUHVzaCB0aGUgaXRlbSB3aXRoIHNwZWNpZmllZCBwcmlvcml0eQotICB2b2lkIHB1c2goY29uc3QgVCYgdCwgaW50IHByaW9yaXR5ID0gMCkgewotICAgIHF1ZXVlc19bcHJpb3JpdHldLnB1c2godCk7Ci0gICAgbmV4dF90b19kZXF1ZXVlXy5wdXNoKHByaW9yaXR5KTsKLSAgfQotCi0gIC8vIFB1c2ggdGhlIGl0ZW0gd2l0aCBzcGVjaWZpZWQgcHJpb3JpdHkKLSAgdm9pZCBwdXNoKFQmJiB0LCBpbnQgcHJpb3JpdHkgPSAwKSB7Ci0gICAgcXVldWVzX1twcmlvcml0eV0ucHVzaChzdGQ6OmZvcndhcmQ8VD4odCkpOwotICAgIG5leHRfdG9fZGVxdWV1ZV8ucHVzaChwcmlvcml0eSk7Ci0gIH0KLQotICAvLyBQb3AgdGhlIGl0ZW0gaW4gdGhlIGZyb250Ci0gIHZvaWQgcG9wKCkgewotICAgIHF1ZXVlc19bbmV4dF90b19kZXF1ZXVlXy50b3AoKV0ucG9wKCk7Ci0gICAgbmV4dF90b19kZXF1ZXVlXy5wb3AoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjphcnJheTxzdGQ6OnF1ZXVlPFQ+LCBOVU1fUFJJT1JJVFlfTEVWRUxTPiBxdWV1ZXNfOwotICBzdGQ6OnByaW9yaXR5X3F1ZXVlPGludD4gbmV4dF90b19kZXF1ZXVlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9tdWx0aV9wcmlvcml0eV9xdWV1ZV90ZXN0LmNjIGIvZ2QvY29tbW9uL211bHRpX3ByaW9yaXR5X3F1ZXVlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTE4YWQuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL211bHRpX3ByaW9yaXR5X3F1ZXVlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9tdWx0aV9wcmlvcml0eV9xdWV1ZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi1URVNUKE11bHRpUHJpb3JpdHlRdWV1ZVRlc3QsIHdpdGhvdXRfaGlnaF9wcmlvcml0eV9pdGVtKSB7Ci0gIGNvbW1vbjo6TXVsdGlQcmlvcml0eVF1ZXVlPGludCwgMj4gcTsKLSAgQVNTRVJUX1RSVUUocS5lbXB0eSgpKTsKLSAgcS5wdXNoKDApOwotICBxLnB1c2goMSwgMCk7Ci0gIHEucHVzaCgyKTsKLSAgQVNTRVJUX0VRKHEuc2l6ZSgpLCAzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocS5mcm9udCgpLCBpKTsKLSAgICBxLnBvcCgpOwotICB9Ci0gIEFTU0VSVF9UUlVFKHEuZW1wdHkoKSk7Ci19Ci0KLVRFU1QoTXVsdGlQcmlvcml0eVF1ZXVlVGVzdCwgd2l0aF9oaWdoX3ByaW9yaXR5X2l0ZW0pIHsKLSAgY29tbW9uOjpNdWx0aVByaW9yaXR5UXVldWU8aW50LCAyPiBxOwotICBxLnB1c2goMSk7Ci0gIHEucHVzaCgyKTsKLSAgcS5wdXNoKDAsIDEpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgIEFTU0VSVF9FUShxLmZyb250KCksIGkpOwotICAgIHEucG9wKCk7Ci0gIH0KLX0KLQotVEVTVChNdWx0aVByaW9yaXR5UXVldWVUZXN0LCB3aXRoX211bHRpcGxlX3ByaW9yaXR5X2l0ZW0pIHsKLSAgY29tbW9uOjpNdWx0aVByaW9yaXR5UXVldWU8aW50LCAzPiBxOwotICBxLnB1c2goMSwgMSk7Ci0gIHEucHVzaCgwLCAyKTsKLSAgcS5wdXNoKDIsIDApOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgIEFTU0VSVF9FUShxLmZyb250KCksIGkpOwotICAgIHEucG9wKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL251bWJlcnMuaCBiL2dkL2NvbW1vbi9udW1iZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTk2MjEuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL251bWJlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi0vLyBDaGVjayBpZiBpbnB1dCBpcyB3aXRoaW4gbnVtZXJpYyBsaW1pdHMgb2YgUmF3VHlwZQotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGUsIHR5cGVuYW1lIElucHV0VHlwZT4KLWJvb2wgSXNOdW1iZXJJbk51bWVyaWNMaW1pdHMoSW5wdXRUeXBlIGlucHV0KSB7Ci0gIC8vIE9ubHkgYXJpdGhtZXRpYyB0eXBlcyBhcmUgc3VwcG9ydGVkCi0gIHN0YXRpY19hc3NlcnQoc3RkOjppc19hcml0aG1ldGljX3Y8UmF3VHlwZT4gJiYgc3RkOjppc19hcml0aG1ldGljX3Y8SW5wdXRUeXBlPik7Ci0gIC8vIEVpdGhlciBib3RoIGFyZSBzaWduZWQgb3IgYm90aCBhcmUgdW5zaWduZWQKLSAgc3RhdGljX2Fzc2VydCgKLSAgICAgIChzdGQ6OmlzX3NpZ25lZF92PFJhd1R5cGU+ICYmIHN0ZDo6aXNfc2lnbmVkX3Y8SW5wdXRUeXBlPikgfHwKLSAgICAgIChzdGQ6OmlzX3Vuc2lnbmVkX3Y8UmF3VHlwZT4gJiYgc3RkOjppc191bnNpZ25lZF92PElucHV0VHlwZT4pKTsKLSAgaWYgKHN0ZDo6bnVtZXJpY19saW1pdHM8SW5wdXRUeXBlPjo6bWF4KCkgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjptYXgoKSkgewotICAgIGlmIChpbnB1dCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46Om1heCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGlmIChzdGQ6Om51bWVyaWNfbGltaXRzPElucHV0VHlwZT46Omxvd2VzdCgpIDwgc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6bG93ZXN0KCkpIHsKLSAgICBpZiAoaW5wdXQgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+Ojpsb3dlc3QoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9udW1iZXJzX3Rlc3QuY2MgYi9nZC9jb21tb24vbnVtYmVyc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRjM2Q3Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9udW1iZXJzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL251bWJlcnMuaCIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpJc051bWJlckluTnVtZXJpY0xpbWl0czsKLQotVEVTVChOdW1iZXJzVGVzdCwgdGVzdF9pc19udW1iZXJfaW5fbnVtZXJpY19saW1pdHMpIHsKLSAgLy8gSU5UMzJfTUFYKzEKLSAgaW50NjRfdCBuID0gMjE0NzQ4MzY0OEw7Ci0gIEFTU0VSVF9GQUxTRShJc051bWJlckluTnVtZXJpY0xpbWl0czxpbnQzMl90PihuKSk7Ci0gIEFTU0VSVF9UUlVFKElzTnVtYmVySW5OdW1lcmljTGltaXRzPGludDY0X3Q+KG4pKTsKLSAgQVNTRVJUX0ZBTFNFKElzTnVtYmVySW5OdW1lcmljTGltaXRzPGludDhfdD4oaW50MzJfdCgxMjgpKSk7Ci0gIEFTU0VSVF9GQUxTRShJc051bWJlckluTnVtZXJpY0xpbWl0czx1aW50OF90Pih1aW50MzJfdCgyNTYpKSk7Ci0gIEFTU0VSVF9GQUxTRShJc051bWJlckluTnVtZXJpY0xpbWl0czxpbnQ4X3Q+KGludDMyX3QoLTEyOSkpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9jb21tb24vb2JzZXJ2ZXJfcmVnaXN0cnkuaCBiL2dkL2NvbW1vbi9vYnNlcnZlcl9yZWdpc3RyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWRlNTdmLi4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9vYnNlcnZlcl9yZWdpc3RyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhcnJheT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8vIFRyYWNrcyBhbiBvYnNlcnZlciByZWdpc3RyYXRpb24gb24gY2xpZW50IChvYnNlcnZlcikgY29kZS4gUmVnaXN0ZXIoKSByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFjayBvYmplY3Qgd2hpY2ggY2FuCi0vLyBiZSBwYXNzZWQgdG8gc2VydmVyJ3MgcmVnaXN0ZXIgQVBJLiBVbnJlZ2lzdGVyKCkgaW52YWxpZGF0ZXMgdGhlIHdyYXBwZWQgY2FsbGJhY2sgc28gYWxsIGNhbGxiYWNrcyB0aGF0IGFyZSBwb3N0ZWQKLS8vIHRvIHRoZSBjbGllbnQgaGFuZGxlciBhZnRlciB0aGUgY2xpZW50IGNhbGxlZCBVbnJlZ2lzdGVyKCkgY2FsbCBhbmQgYmVmb3JlIHRoZSBzZXJ2ZXIgcHJvY2Vzc2VkIHRoZSBVbnJlZ2lzdGVyKCkKLS8vIGNhbGwgb24gaXRzIGhhbmRsZXIsIGFyZSBkcm9wcGVkLgotLy8gTm90ZTogUmVnaXN0ZXIoKSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgcmVnaXN0cmF0aW9uLgotY2xhc3MgU2luZ2xlT2JzZXJ2ZXJSZWdpc3RyeSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gVD4KLSAgZGVjbHR5cGUoYXV0bykgUmVnaXN0ZXIoQ2FsbGJhY2s8UihULi4uKT4gY2FsbGJhY2spIHsKLSAgICBzZXNzaW9uXysrOwotICAgIHJldHVybiBCaW5kKCZTaW5nbGVPYnNlcnZlclJlZ2lzdHJ5OjpjYWxsYmFja193cmFwcGVyPFIsIFQuLi4+LCBVbnJldGFpbmVkKHRoaXMpLCBzZXNzaW9uXywgY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyKCkgewotICAgIHNlc3Npb25fKys7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBUPgotICB2b2lkIGNhbGxiYWNrX3dyYXBwZXIoaW50IHNlc3Npb24sIENhbGxiYWNrPFIoVC4uLik+IGNhbGxiYWNrLCBULi4uIHQpIHsKLSAgICBpZiAoc2Vzc2lvbiA9PSBzZXNzaW9uXykgewotICAgICAgY2FsbGJhY2suUnVuKHN0ZDo6Zm9yd2FyZDxUPih0KS4uLik7Ci0gICAgfQotICB9Ci0KLSAgdWludDhfdCBzZXNzaW9uXyA9IDA7Ci19OwotCi0vLyBUcmFja3Mgb2JzZXJ2ZXIgcmVnaXN0cmF0aW9uIGZvciBtdWx0aXBsZSBldmVudCB0eXBlLiBFYWNoIGV2ZW50IHR5cGUgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW50ZWdlciBpbiBbMCwgQ2FwYWNpdHkpLgotdGVtcGxhdGUgPGludCBDYXBhY2l0eSA9IDEwPgotY2xhc3MgTXVsdGlwbGVPYnNlcnZlclJlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBUPgotICBkZWNsdHlwZShhdXRvKSBSZWdpc3RlcihpbnQgZXZlbnRfdHlwZSwgQ2FsbGJhY2s8UihULi4uKT4gY2FsbGJhY2spIHsKLSAgICBBU1NFUlQoZXZlbnRfdHlwZSA8IENhcGFjaXR5KTsKLSAgICByZXR1cm4gcmVnaXN0cnlfW2V2ZW50X3R5cGVdLlJlZ2lzdGVyKGNhbGxiYWNrKTsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlcihpbnQgZXZlbnRfdHlwZSkgewotICAgIEFTU0VSVChldmVudF90eXBlIDwgQ2FwYWNpdHkpOwotICAgIHJlZ2lzdHJ5X1tldmVudF90eXBlXS5VbnJlZ2lzdGVyKCk7Ci0gIH0KLQotICBzdGQ6OmFycmF5PFNpbmdsZU9ic2VydmVyUmVnaXN0cnksIENhcGFjaXR5PiByZWdpc3RyeV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vb2JzZXJ2ZXJfcmVnaXN0cnlfdGVzdC5jYyBiL2dkL2NvbW1vbi9vYnNlcnZlcl9yZWdpc3RyeV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIzM2E4Li4wMDAwMDAwCi0tLSBhL2dkL2NvbW1vbi9vYnNlcnZlcl9yZWdpc3RyeV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjb21tb24vb2JzZXJ2ZXJfcmVnaXN0cnkuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotY2xhc3MgU2luZ2xlT2JzZXJ2ZXJSZWdpc3RyeVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgcmVnaXN0cnlfID0gbmV3IFNpbmdsZU9ic2VydmVyUmVnaXN0cnk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSByZWdpc3RyeV87Ci0gIH0KLQotICBTaW5nbGVPYnNlcnZlclJlZ2lzdHJ5KiByZWdpc3RyeV87Ci19OwotCi12b2lkIEluY3JlbWVudChpbnQqIGNvdW50KSB7Ci0gICgqY291bnQpKys7Ci19Ci0KLXZvaWQgSW5jcmVtZW50QnkoaW50KiBjb3VudCwgaW50IG4pIHsKLSAgKCpjb3VudCkgKz0gbjsKLX0KLQotVEVTVF9GKFNpbmdsZU9ic2VydmVyUmVnaXN0cnlUZXN0LCB3cmFwcGVkX2NhbGxiYWNrKSB7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGF1dG8gd3JhcHBlZF9jYWxsYmFjayA9IHJlZ2lzdHJ5Xy0+UmVnaXN0ZXIoQmluZCgmSW5jcmVtZW50LCBVbnJldGFpbmVkKCZjb3VudCkpKTsKLSAgd3JhcHBlZF9jYWxsYmFjay5SdW4oKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAxKTsKLSAgd3JhcHBlZF9jYWxsYmFjay5SdW4oKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAyKTsKLSAgd3JhcHBlZF9jYWxsYmFjay5SdW4oKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAzKTsKLSAgcmVnaXN0cnlfLT5VbnJlZ2lzdGVyKCk7Ci19Ci0KLVRFU1RfRihTaW5nbGVPYnNlcnZlclJlZ2lzdHJ5VGVzdCwgdW5yZWdpc3RlcikgewotICBpbnQgY291bnQgPSAwOwotICBhdXRvIHdyYXBwZWRfY2FsbGJhY2sgPSByZWdpc3RyeV8tPlJlZ2lzdGVyKEJpbmQoJkluY3JlbWVudCwgVW5yZXRhaW5lZCgmY291bnQpKSk7Ci0gIHJlZ2lzdHJ5Xy0+VW5yZWdpc3RlcigpOwotICB3cmFwcGVkX2NhbGxiYWNrLlJ1bigpOwotICBFWFBFQ1RfRVEoY291bnQsIDApOwotfQotCi1URVNUX0YoU2luZ2xlT2JzZXJ2ZXJSZWdpc3RyeVRlc3QsIHNlY29uZF9yZWdpc3RlcikgewotICBpbnQgY291bnQgPSAwOwotICBhdXRvIHdyYXBwZWRfY2FsbGJhY2sgPSByZWdpc3RyeV8tPlJlZ2lzdGVyKEJpbmQoJkluY3JlbWVudCwgVW5yZXRhaW5lZCgmY291bnQpKSk7Ci0gIHJlZ2lzdHJ5Xy0+VW5yZWdpc3RlcigpOwotICBhdXRvIHdyYXBwZWRfY2FsbGJhY2syID0gcmVnaXN0cnlfLT5SZWdpc3RlcihCaW5kKCZJbmNyZW1lbnQsIFVucmV0YWluZWQoJmNvdW50KSkpOwotICB3cmFwcGVkX2NhbGxiYWNrLlJ1bigpOwotICBFWFBFQ1RfRVEoY291bnQsIDApOwotICB3cmFwcGVkX2NhbGxiYWNrMi5SdW4oKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAxKTsKLX0KLQotY2xhc3MgTXVsdGlwbGVPYnNlcnZlclJlZ2lzdHJ5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICByZWdpc3RyeV8gPSBuZXcgTXVsdGlwbGVPYnNlcnZlclJlZ2lzdHJ5PDI+OwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgcmVnaXN0cnlfOwotICB9Ci0KLSAgTXVsdGlwbGVPYnNlcnZlclJlZ2lzdHJ5PDI+KiByZWdpc3RyeV87Ci19OwotCi1URVNUX0YoTXVsdGlwbGVPYnNlcnZlclJlZ2lzdHJ5VGVzdCwgc2luZ2xlX3dyYXBwZWRfY2FsbGJhY2spIHsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXV0byB3cmFwcGVkX2NhbGxiYWNrID0gcmVnaXN0cnlfLT5SZWdpc3RlcigwLCBCaW5kKCZJbmNyZW1lbnQsIFVucmV0YWluZWQoJmNvdW50KSkpOwotICB3cmFwcGVkX2NhbGxiYWNrLlJ1bigpOwotICBFWFBFQ1RfRVEoY291bnQsIDEpOwotICB3cmFwcGVkX2NhbGxiYWNrLlJ1bigpOwotICBFWFBFQ1RfRVEoY291bnQsIDIpOwotICB3cmFwcGVkX2NhbGxiYWNrLlJ1bigpOwotICBFWFBFQ1RfRVEoY291bnQsIDMpOwotICByZWdpc3RyeV8tPlVucmVnaXN0ZXIoMCk7Ci19Ci0KLVRFU1RfRihNdWx0aXBsZU9ic2VydmVyUmVnaXN0cnlUZXN0LCBtdWx0aXBsZV93cmFwcGVkX2NhbGxiYWNrKSB7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGF1dG8gd3JhcHBlZF9jYWxsYmFjazAgPSByZWdpc3RyeV8tPlJlZ2lzdGVyKDAsIEJpbmQoJkluY3JlbWVudCwgVW5yZXRhaW5lZCgmY291bnQpKSk7Ci0gIGF1dG8gd3JhcHBlZF9jYWxsYmFjazEgPSByZWdpc3RyeV8tPlJlZ2lzdGVyKDEsIEJpbmQoJkluY3JlbWVudEJ5LCBVbnJldGFpbmVkKCZjb3VudCksIDEwKSk7Ci0gIHdyYXBwZWRfY2FsbGJhY2swLlJ1bigpOwotICBFWFBFQ1RfRVEoY291bnQsIDEpOwotICB3cmFwcGVkX2NhbGxiYWNrMS5SdW4oKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAxMSk7Ci0gIHJlZ2lzdHJ5Xy0+VW5yZWdpc3RlcigwKTsKLSAgd3JhcHBlZF9jYWxsYmFjazAuUnVuKCk7Ci0gIEVYUEVDVF9FUShjb3VudCwgMTEpOwotICB3cmFwcGVkX2NhbGxiYWNrMS5SdW4oKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAyMSk7Ci0gIHJlZ2lzdHJ5Xy0+VW5yZWdpc3RlcigxKTsKLSAgRVhQRUNUX0VRKGNvdW50LCAyMSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NvbW1vbi9zdG9wX3dhdGNoLmNjIGIvZ2QvY29tbW9uL3N0b3Bfd2F0Y2guY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2E5Y2IuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL3N0b3Bfd2F0Y2guY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJCdFN0b3BXYXRjaCIKLQotI2luY2x1ZGUgImNvbW1vbi9zdG9wX3dhdGNoLmgiCi0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXN0YXRpYyBjb25zdCBpbnQgTE9HX0JVRkZFUl9MRU5HVEggPSAxMDsKLXN0YXRpYyBzdGQ6OmFycmF5PFN0b3BXYXRjaExvZywgTE9HX0JVRkZFUl9MRU5HVEg+IHN0b3B3YXRjaF9sb2dzOwotc3RhdGljIGludCBjdXJyZW50X2J1ZmZlcl9pbmRleDsKLXN0YXRpYyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBzdG9wd2F0Y2hfbG9nX211dGV4OwotCi12b2lkIFN0b3BXYXRjaDo6UmVjb3JkTG9nKFN0b3BXYXRjaExvZyBsb2cpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhzdG9wd2F0Y2hfbG9nX211dGV4LCBzdGQ6OmRlZmVyX2xvY2spOwotICBpZiAoIWxvY2sudHJ5X2xvY2soKSkgewotICAgIExPR19JTkZPKCJ0cnlfbG9jayBmYWlsLiBsb2cgY29udGVudDogJXMsIHRvb2sgJXp1IHVzIiwgbG9nLm1lc3NhZ2UuY19zdHIoKSwKLSAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KAotICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPigKLSAgICAgICAgICAgICAgICAgICAgIHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5lbmRfdGltZXN0YW1wIC0KLSAgICAgICAgICAgICAgICAgICAgIHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5zdGFydF90aW1lc3RhbXApCi0gICAgICAgICAgICAgICAgICAgICAuY291bnQoKSkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoY3VycmVudF9idWZmZXJfaW5kZXggPj0gTE9HX0JVRkZFUl9MRU5HVEgpIHsKLSAgICBjdXJyZW50X2J1ZmZlcl9pbmRleCA9IDA7Ci0gIH0KLSAgc3RvcHdhdGNoX2xvZ3NbY3VycmVudF9idWZmZXJfaW5kZXhdID0gc3RkOjptb3ZlKGxvZyk7Ci0gIGN1cnJlbnRfYnVmZmVyX2luZGV4Kys7Ci0gIGxvY2sudW5sb2NrKCk7Ci19Ci0KLXZvaWQgU3RvcFdhdGNoOjpEdW1wU3RvcFdhdGNoTG9nKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soc3RvcHdhdGNoX2xvZ19tdXRleCk7Ci0gIExPR19JTkZPKCI9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09Iik7Ci0gIExPR19JTkZPKCJibHVldG9vdGggc3RvcHdhdGNoIGxvZyBoaXN0b3J5OiIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IExPR19CVUZGRVJfTEVOR1RIOyBpKyspIHsKLSAgICBpZiAoY3VycmVudF9idWZmZXJfaW5kZXggPj0gTE9HX0JVRkZFUl9MRU5HVEgpIHsKLSAgICAgIGN1cnJlbnRfYnVmZmVyX2luZGV4ID0gMDsKLSAgICB9Ci0gICAgaWYgKHN0b3B3YXRjaF9sb2dzW2N1cnJlbnRfYnVmZmVyX2luZGV4XS5tZXNzYWdlLmVtcHR5KCkpIHsKLSAgICAgIGN1cnJlbnRfYnVmZmVyX2luZGV4Kys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgYXV0byBub3cgPSBzdG9wd2F0Y2hfbG9nc1tjdXJyZW50X2J1ZmZlcl9pbmRleF0udGltZXN0YW1wOwotICAgIGF1dG8gbWlsbGlzID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCi0gICAgICAgICAgICAgICAgICAgICAgbm93LnRpbWVfc2luY2VfZXBvY2goKSkgJQotICAgICAgICAgICAgICAgICAgMTAwMDsKLSAgICBhdXRvIG5vd190aW1lX3QgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3Qobm93KTsKLSAgICBzcyA8PCBzdGQ6OnB1dF90aW1lKHN0ZDo6bG9jYWx0aW1lKCZub3dfdGltZV90KSwgIiVZLSVtLSVkICVIOiVNOiVTIik7Ci0gICAgc3MgPDwgJy4nIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygzKSA8PCBtaWxsaXMuY291bnQoKTsKLSAgICBzdGQ6OnN0cmluZyBzdGFydF90aW1lc3RhbXAgPSBzcy5zdHIoKTsKLSAgICBMT0dfSU5GTygKLSAgICAgICAgIiVzOiAlczogdG9vayAlenUgdXMiLAotICAgICAgICBzdGFydF90aW1lc3RhbXAuY19zdHIoKSwKLSAgICAgICAgc3RvcHdhdGNoX2xvZ3NbY3VycmVudF9idWZmZXJfaW5kZXhdLm1lc3NhZ2UuY19zdHIoKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHdhdGNoX2xvZ3NbY3VycmVudF9idWZmZXJfaW5kZXhdLmVuZF90aW1lc3RhbXAgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wd2F0Y2hfbG9nc1tjdXJyZW50X2J1ZmZlcl9pbmRleF0uc3RhcnRfdGltZXN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKSkpOwotICAgIGN1cnJlbnRfYnVmZmVyX2luZGV4Kys7Ci0gIH0KLSAgTE9HX0lORk8oIj0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0iKTsKLX0KLQotU3RvcFdhdGNoOjpTdG9wV2F0Y2goc3RkOjpzdHJpbmcgdGV4dCkKLSAgICA6IHRleHRfKHN0ZDo6bW92ZSh0ZXh0KSksCi0gICAgICB0aW1lc3RhbXBfKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpKSwKLSAgICAgIHN0YXJ0X3RpbWVzdGFtcF8oc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkpIHt9Ci0KLVN0b3BXYXRjaDo6flN0b3BXYXRjaCgpIHsKLSAgU3RvcFdhdGNoTG9nIHN3X2xvZzsKLSAgc3dfbG9nLnRpbWVzdGFtcCA9IHRpbWVzdGFtcF87Ci0gIHN3X2xvZy5zdGFydF90aW1lc3RhbXAgPSBzdGFydF90aW1lc3RhbXBfOwotICBzd19sb2cuZW5kX3RpbWVzdGFtcCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICBzd19sb2cubWVzc2FnZSA9IHN0ZDo6bW92ZSh0ZXh0Xyk7Ci0KLSAgUmVjb3JkTG9nKHN0ZDo6bW92ZShzd19sb2cpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL3N0b3Bfd2F0Y2guaCBiL2dkL2NvbW1vbi9zdG9wX3dhdGNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkN2Q1NDQuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL3N0b3Bfd2F0Y2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWVzdGFtcDsKLSAgc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lc3RhbXA7Ci0gIHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgZW5kX3RpbWVzdGFtcDsKLSAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKLX0gU3RvcFdhdGNoTG9nOwotCi1jbGFzcyBTdG9wV2F0Y2ggewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgRHVtcFN0b3BXYXRjaExvZyh2b2lkKTsKLSAgU3RvcFdhdGNoKHN0ZDo6c3RyaW5nIHRleHQpOwotICB+U3RvcFdhdGNoKCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyB0ZXh0XzsKLSAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0aW1lc3RhbXBfOwotICBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0X3RpbWVzdGFtcF87Ci0gIHZvaWQgUmVjb3JkTG9nKFN0b3BXYXRjaExvZyBsb2cpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL3N0cmluZ3MuY2MgYi9nZC9jb21tb24vc3RyaW5ncy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjNWMwNS4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vc3RyaW5ncy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLQotI2luY2x1ZGUgPGNoYXJjb252PgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotCi1uYW1lc3BhY2UgewotCi1zdHJ1Y3QgSXNTcGFjZSA6IHN0ZDo6dW5hcnlfZnVuY3Rpb248c3RkOjpzdHJpbmc6OnZhbHVlX3R5cGUsIGJvb2w+IHsKLSAgYm9vbCBvcGVyYXRvcigpKHN0ZDo6c3RyaW5nOjp2YWx1ZV90eXBlIHYpIHsKLSAgICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDxpbnQ+KHYpKTsKLSAgfQotfTsKLQotc3RydWN0IElzSGV4RGlnaXQgOiBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPHN0ZDo6c3RyaW5nOjp2YWx1ZV90eXBlLCBib29sPiB7Ci0gIGJvb2wgb3BlcmF0b3IoKShzdGQ6OnN0cmluZzo6dmFsdWVfdHlwZSB2KSB7Ci0gICAgcmV0dXJuIGlzeGRpZ2l0KHN0YXRpY19jYXN0PGludD4odikpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotc3RkOjpzdHJpbmcgVG9IZXhTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gIHJldHVybiBUb0hleFN0cmluZyh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSk7Ci19Ci0KLWJvb2wgSXNWYWxpZEhleFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBzdGQ6OmZpbmRfaWZfbm90KHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIElzSGV4RGlnaXR7fSkgPT0gc3RyLmVuZCgpOwotfQotCi1zdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBGcm9tSGV4U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgaWYgKHN0ci5zaXplKCkgJSAyICE9IDApIHsKLSAgICBMT0dfSU5GTygic3RyIHNpemUgaXMgbm90IGRpdmlzaWJsZSBieSAyLCBzaXplIGlzICV6dSIsIHN0ci5zaXplKCkpOwotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgaWYgKHN0ZDo6ZmluZF9pZl9ub3Qoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgSXNIZXhEaWdpdHt9KSAhPSBzdHIuZW5kKCkpIHsKLSAgICBMT0dfSU5GTygidmFsdWUgY29udGFpbnMgbm9uZSBoZXggZGlnaXQiKTsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICB2YWx1ZS5yZXNlcnZlKHN0ci5zaXplKCkgLyAyKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyBpICs9IDIpIHsKLSAgICB1aW50OF90IHYgPSAwOwotICAgIGF1dG8gcmV0ID0gc3RkOjpmcm9tX2NoYXJzKHN0ci5jX3N0cigpICsgaSwgc3RyLmNfc3RyKCkgKyBpICsgMiwgdiwgMTYpOwotICAgIGlmIChzdGQ6Om1ha2VfZXJyb3JfY29kZShyZXQuZWMpKSB7Ci0gICAgICBMT0dfSU5GTygiZmFpbGVkIHRvIHBhcnNlIGhleCBjaGFyIGF0IGluZGV4ICV6dSIsIGkpOwotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgdmFsdWUucHVzaF9iYWNrKHYpOwotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RkOjpzdHJpbmcgU3RyaW5nVHJpbShzdGQ6OnN0cmluZyBzdHIpIHsKLSAgc3RyLmVyYXNlKHN0ci5iZWdpbigpLCBzdGQ6OmZpbmRfaWZfbm90KHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIElzU3BhY2V7fSkpOwotICBzdHIuZXJhc2Uoc3RkOjpmaW5kX2lmX25vdChzdHIucmJlZ2luKCksIHN0ci5yZW5kKCksIElzU3BhY2V7fSkuYmFzZSgpLCBzdHIuZW5kKCkpOwotICByZXR1cm4gc3RyOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3RyaW5nU3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRlbGltLCBzaXplX3QgbWF4X3Rva2VuKSB7Ci0gIEFTU0VSVF9MT0coIWRlbGltLmVtcHR5KCksICJkZWxpbSBjYW5ub3QgYmUgZW1wdHkiKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKLSAgLy8gVXNlIHN0ZDo6c3RyaW5nOjpmaW5kIGFuZCBzdGQ6OnN0cmluZzo6c3Vic3RyIHRvIGF2b2lkIGNvcHlpbmcgc3RyIGludG8gYSBzdHJpbmdzdHJlYW0KLSAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzdGFydGluZ19pbmRleCA9IDA7Ci0gIGF1dG8gaW5kZXhfb2ZfZGVsaW0gPSBzdHIuZmluZChkZWxpbSk7Ci0gIHdoaWxlICgobWF4X3Rva2VuID09IDAgfHwgdG9rZW5zLnNpemUoKSA8IChtYXhfdG9rZW4gLSAxKSkgJiYgaW5kZXhfb2ZfZGVsaW0gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICB0b2tlbnMucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnRpbmdfaW5kZXgsIGluZGV4X29mX2RlbGltIC0gc3RhcnRpbmdfaW5kZXgpKTsKLSAgICBzdGFydGluZ19pbmRleCA9IGluZGV4X29mX2RlbGltICsgZGVsaW0uc2l6ZSgpOwotICAgIGluZGV4X29mX2RlbGltID0gc3RyLmZpbmQoZGVsaW0sIHN0YXJ0aW5nX2luZGV4KTsKLSAgfQotICAvLyBBcHBlbmQgbGFzdCBpdGVtIHRvIHRoZSB2ZWN0b3IgaWYgdGhlcmUgYXJlIGFueXRoaW5nIGxlZnQKLSAgaWYgKHN0YXJ0aW5nX2luZGV4IDwgKHN0ci5zaXplKCkgKyAxKSkgewotICAgIHRva2Vucy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydGluZ19pbmRleCkpOwotICB9Ci0gIHJldHVybiB0b2tlbnM7Ci19Ci0KLXN0ZDo6c3RyaW5nIFN0cmluZ0pvaW4oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBzdHJpbmdzLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW0pIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIGZvciAoYXV0byBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgaXQrKykgewotICAgIHNzIDw8ICppdDsKLSAgICBpZiAoc3RkOjpuZXh0KGl0KSAhPSBzdHJpbmdzLmVuZCgpKSB7Ci0gICAgICBzcyA8PCBkZWxpbTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi1zdGQ6Om9wdGlvbmFsPGludDY0X3Q+IEludDY0RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGNoYXIqIHB0ciA9IG51bGxwdHI7Ci0gIGVycm5vID0gMDsKLSAgaW50NjRfdCB2YWx1ZSA9IHN0ZDo6c3RydG9sbChzdHIuY19zdHIoKSwgJnB0ciwgMTApOwotICBpZiAoZXJybm8gIT0gMCkgewotICAgIExPR19JTkZPKCJjYW5ub3QgcGFyc2Ugc3RyaW5nICclcycgd2l0aCBlcnJvciAnJXMnIiwgc3RyLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAocHRyID09IHN0ci5jX3N0cigpKSB7Ci0gICAgTE9HX0lORk8oInN0cmluZyAnJXMnIGlzIGVtcHR5IG9yIGhhcyB3cm9uZyBmb3JtYXQiLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAocHRyICE9IChzdHIuY19zdHIoKSArIHN0ci5zaXplKCkpKSB7Ci0gICAgTE9HX0lORk8oImNhbm5vdCBwYXJzZSB3aG9sZSBzdHJpbmcgJyVzJyIsIHN0ci5jX3N0cigpKTsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RkOjpzdHJpbmcgVG9TdHJpbmcoaW50NjRfdCB2YWx1ZSkgewotICByZXR1cm4gc3RkOjp0b19zdHJpbmcodmFsdWUpOwotfQotCi1zdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBVaW50NjRGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgaWYgKHN0ci5maW5kKCctJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICBMT0dfSU5GTygic3RyaW5nICclcycgY29udGFpbnMgbWludXMgc2lnbiwgdGhpcyBmdW5jdGlvbiBpcyBmb3IgdW5zaWduZWQiLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBjaGFyKiBwdHIgPSBudWxscHRyOwotICBlcnJubyA9IDA7Ci0gIHVpbnQ2NF90IHZhbHVlID0gc3RkOjpzdHJ0b3VsbChzdHIuY19zdHIoKSwgJnB0ciwgMTApOwotICBpZiAoZXJybm8gIT0gMCkgewotICAgIExPR19JTkZPKCJjYW5ub3QgcGFyc2Ugc3RyaW5nICclcycgd2l0aCBlcnJvciAnJXMnIiwgc3RyLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAocHRyID09IHN0ci5jX3N0cigpKSB7Ci0gICAgTE9HX0lORk8oInN0cmluZyAnJXMnIGlzIGVtcHR5IG9yIGhhcyB3cm9uZyBmb3JtYXQiLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAocHRyICE9IChzdHIuY19zdHIoKSArIHN0ci5zaXplKCkpKSB7Ci0gICAgTE9HX0lORk8oImNhbm5vdCBwYXJzZSB3aG9sZSBzdHJpbmcgJyVzJyIsIHN0ci5jX3N0cigpKTsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RkOjpzdHJpbmcgVG9TdHJpbmcodWludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHZhbHVlKTsKLX0KLQotc3RkOjpvcHRpb25hbDxib29sPiBCb29sRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGlmIChzdHIgPT0gInRydWUiKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoc3RyID09ICJmYWxzZSIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oInN0cmluZyAnJXMnIGlzIG5laXRoZXIgdHJ1ZSBub3IgZmFsc2UiLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyBUb1N0cmluZyhib29sIHZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9jb21tb24vc3RyaW5ncy5oIGIvZ2QvY29tbW9uL3N0cmluZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwZDMxNC4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vc3RyaW5ncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxjaGFyY29udj4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29tbW9uL3R5cGVfaGVscGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8vIENvbnZlcnQgbnVtYmVyIGludG8gYSBoZXggc3RyaW5nIHByZWZpeGVkIHdpdGggMHgKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjpzdHJpbmcgVG9IZXhTdHJpbmcoVCB4KSB7Ci0gIGlmICh4IDwgMCkgewotICAgIGlmICh4ID09IElOVF9NSU4pIHJldHVybiAiSU5UX01JTiI7Ci0gICAgcmV0dXJuICItIiArIFRvSGV4U3RyaW5nKC14KTsKLSAgfQotICBzdGQ6OnN0cmluZ3N0cmVhbSB0bXA7Ci0gIHRtcCA8PCAiMHgiIDw8IHN0ZDo6aW50ZXJuYWwgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KHNpemVvZihUKSAqIDIpIDw8ICh1bnNpZ25lZCBsb25nKXg7Ci0gIHJldHVybiB0bXAuc3RyKCk7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgc3RkOjpzdHJpbmcgVG9IZXhTdHJpbmc8PihzaWduZWQgbG9uZyB4KSB7Ci0gIGlmICh4IDwgMCkgewotICAgIGlmICh4ID09IExPTkdfTUlOKSByZXR1cm4gIkxPTkdfTUlOIjsKLSAgICByZXR1cm4gIi0iICsgVG9IZXhTdHJpbmc8c2lnbmVkIGxvbmc+KC14KTsKLSAgfQotICBzdGQ6OnN0cmluZ3N0cmVhbSB0bXA7Ci0gIHRtcCA8PCAiMHgiIDw8IHN0ZDo6aW50ZXJuYWwgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KHNpemVvZihzaWduZWQgbG9uZykgKiAyKQotICAgICAgPDwgKHVuc2lnbmVkIGxvbmcpeDsKLSAgcmV0dXJuIHRtcC5zdHIoKTsKLX0KLQotdGVtcGxhdGUgPD4KLWlubGluZSBzdGQ6OnN0cmluZyBUb0hleFN0cmluZzw+KHVuc2lnbmVkIGludCB4KSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHRtcDsKLSAgdG1wIDw8ICIweCIgPDwgc3RkOjppbnRlcm5hbCA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoc2l6ZW9mKHVuc2lnbmVkIGludCkgKiAyKQotICAgICAgPDwgKHVuc2lnbmVkIGxvbmcpeDsKLSAgcmV0dXJuIHRtcC5zdHIoKTsKLX0KLQotLy8gQ29udmVydCB2YWx1ZSBpbnRvIGEgaGV4IGRlY2ltYWwgZm9ybWF0dGVkIHN0cmluZyBpbiBsb3dlciBjYXNlLCBwcmVmaXhlZCB3aXRoIDBzCi10ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdD4KLXN0ZDo6c3RyaW5nIFRvSGV4U3RyaW5nKElucHV0SXQgZmlyc3QsIElucHV0SXQgbGFzdCkgewotICBzdGF0aWNfYXNzZXJ0KAotICAgICAgc3RkOjppc19zYW1lX3Y8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdD46OnZhbHVlX3R5cGUsIHVpbnQ4X3Q+LCAiTXVzdCB1c2UgdWludDhfdCBpdGVyYXRvciIpOwotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgZm9yIChJbnB1dEl0IGl0ID0gZmlyc3Q7IGl0ICE9IGxhc3Q7ICsraXQpIHsKLSAgICAvLyArKGJ5dGUpIHRvIHByZXZlbnQgYW4gdWludDhfdCB0byBiZSBpbnRlcnByZXRlZCBhcyBhIGNoYXIKLSAgICBzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgKygqaXQpOwotICB9Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLS8vIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igbm9ybWFsIGNhc2VzIGFuZCBpbml0aWFsaXplciBsaXN0LCBlLmcuIFRvSGV4U3RyaW5nKHsweDEyLCAweDM0LCAweDU2LCAweGFifSkKLXN0ZDo6c3RyaW5nIFRvSGV4U3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSk7Ci0KLS8vIFJldHVybiB0cnVlIGlmIHxzdHJ8IGlzIGEgdmFsaWQgaGV4IGRlbWljYWwgc3RyaW5ncyBjb250YWlucyBvbmx5IGhleCBkZWNpbWFsIGNoYXJzIFswLTlhLWZBLUZdCi1ib29sIElzVmFsaWRIZXhTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLS8vIFBhcnNlIHxzdHJ8IGludG8gYSB2ZWN0b3Igb2YgdWludDhfdCwgfHN0cnwgbXVzdCBjb250YWlucyBvbmx5IGhleCBkZWNpbWFsCi1zdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBGcm9tSGV4U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0vLyBSZW1vdmUgd2hpdGVzcGFjZSBmcm9tIGJvdGggZW5kcyBvZiB0aGUgfHN0cnwsIHJldHVybmluZyBhIGNvcHkKLXN0ZDo6c3RyaW5nIFN0cmluZ1RyaW0oc3RkOjpzdHJpbmcgc3RyKTsKLQotLy8gU3BsaXQgfHN0cnwgaW50byBhdCBtb3N0IHxtYXhfdG9rZW58IHRva2VucyBkZWxpbWl0ZWQgYnkgfGRlbGltfCwgdW5saW1pdGVkIHRva2VucyB3aGVuIHxtYXhfdG9rZW58IGlzIDAKLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdHJpbmdTcGxpdChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW0sIHNpemVfdCBtYXhfdG9rZW4gPSAwKTsKLQotLy8gSm9pbiB8c3RyaW5nc3wgaW50byBhIHNpbmdsZSBzdHJpbmcgdXNpbmcgfGRlbGltfAotc3RkOjpzdHJpbmcgU3RyaW5nSm9pbihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN0cmluZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWxpbSk7Ci0KLS8vIFZhcmlvdXMgbnVtYmVyIGNvbXBhcmlzb24gZnVuY3Rpb25zLCBvbmx5IGJhc2UgMTAgaXMgc3VwcG9ydGVkCi1zdGQ6Om9wdGlvbmFsPGludDY0X3Q+IEludDY0RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLXN0ZDo6c3RyaW5nIFRvU3RyaW5nKGludDY0X3QgdmFsdWUpOwotc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gVWludDY0RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLXN0ZDo6c3RyaW5nIFRvU3RyaW5nKHVpbnQ2NF90IHZhbHVlKTsKLXN0ZDo6b3B0aW9uYWw8Ym9vbD4gQm9vbEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci1zdGQ6OnN0cmluZyBUb1N0cmluZyhib29sIHZhbHVlKTsKLQotLy8gTWlncmF0ZSB0aGlzIG1ldGhvZCB0byBzdGQ6OmZvcm1hdCB3aGVuIEMrKzIwIGJlY29tZXMgYXZhaWxhYmxlCi0vLyBwcmludGYgbGlrZSBmb3JtYXR0aW5nIHRvIHN0ZDo6c3RyaW5nCi0vLyBmb3JtYXQgbXVzdCBjb250YWlucyBmb3JtYXQgaW5mb3JtYXRpb24sIHRvIHByaW50IGEgc3RyaW5nIHVzZSBTdHJpbmdGb3JtYXQoIiVzIiwgc3RyKQotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci1zdGQ6OnN0cmluZyBTdHJpbmdGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZvcm1hdCwgQXJncy4uLiBhcmdzKSB7Ci0gIGF1dG8gc2l6ZSA9IHN0ZDo6c25wcmludGYobnVsbHB0ciwgMCwgZm9ybWF0LmNfc3RyKCksIGFyZ3MuLi4pOwotICBBU1NFUlRfTE9HKHNpemUgPj0gMCwgInJldHVybiB2YWx1ZSAlZCwgZXJyb3IgJWQsIHRleHQgJyVzJyIsIHNpemUsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAvLyBBZGQgMSBmb3IgdGVybWluYXRpbmcgbnVsbCBieXRlCi0gIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZmZlcihzaXplICsgMSk7Ci0gIGF1dG8gYWN0dWFsX3NpemUgPSBzdGQ6OnNucHJpbnRmKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCksIGZvcm1hdC5jX3N0cigpLCBhcmdzLi4uKTsKLSAgQVNTRVJUX0xPRygKLSAgICAgIHNpemUgPT0gYWN0dWFsX3NpemUsCi0gICAgICAiYXNrZWQgc2l6ZSAlZCwgYWN0dWFsIHNpemUgJWQsIGVycm9yICVkLCB0ZXh0ICclcyciLAotICAgICAgc2l6ZSwKLSAgICAgIGFjdHVhbF9zaXplLAotICAgICAgZXJybm8sCi0gICAgICBzdHJlcnJvcihlcnJubykpOwotICAvLyBFeGNsdWRlIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlci5kYXRhKCksIHNpemUpOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgU3RyaW5nRm9ybWF0VGltZShjb25zdCBzdGQ6OnN0cmluZyYgZm9ybWF0LCBjb25zdCBzdHJ1Y3Qgc3RkOjp0bSYgdG0pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOwotICBvcyA8PCBzdGQ6OnB1dF90aW1lKCZ0bSwgZm9ybWF0LmNfc3RyKCkpOwotICByZXR1cm4gb3Muc3RyKCk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBTdHJpbmdGb3JtYXRUaW1lV2l0aE1pbGxpc2Vjb25kcygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm9ybWF0LAotICAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHRpbWVfcG9pbnQsCi0gICAgc3RydWN0IHRtKiAoKmNhbGVuZGFyX3RvX3RtKShjb25zdCB0aW1lX3QqIHRpbWVwKSA9IGxvY2FsdGltZSkgewotICBzdGQ6OnRpbWVfdCBlcG9jaF90aW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KHRpbWVfcG9pbnQpOwotICBhdXRvIG1pbGxpcyA9IHRpbWVfcG9pbnQudGltZV9zaW5jZV9lcG9jaCgpIC8gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKSAlIDEwMDA7Ci0gIHN0ZDo6dG0gdG0gPSAqY2FsZW5kYXJfdG9fdG0oJmVwb2NoX3RpbWUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7Ci0gIG9zIDw8IHN0ZDo6cHV0X3RpbWUoJnRtLCBmb3JtYXQuY19zdHIoKSkgPDwgU3RyaW5nRm9ybWF0KCIuJTAzdSIsIG1pbGxpcyk7Ci0gIHJldHVybiBvcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL3N0cmluZ3NfdGVzdC5jYyBiL2dkL2NvbW1vbi9zdHJpbmdzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTFjY2QuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL3N0cmluZ3NfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6Qm9vbEZyb21TdHJpbmc7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6RnJvbUhleFN0cmluZzsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpJbnQ2NEZyb21TdHJpbmc7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6U3RyaW5nRm9ybWF0OwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlN0cmluZ0Zvcm1hdFRpbWU7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6U3RyaW5nRm9ybWF0VGltZVdpdGhNaWxsaXNlY29uZHM7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6U3RyaW5nSm9pbjsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpTdHJpbmdTcGxpdDsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpTdHJpbmdUcmltOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlRvSGV4U3RyaW5nOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlRvU3RyaW5nOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OlVpbnQ2NEZyb21TdHJpbmc7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc19hcmNoMzIoKSB7Ci0gIHJldHVybiBzaXplb2YobG9uZykgPT0gNDsKLX0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc19hcmNoNjQoKSB7Ci0gIHJldHVybiBzaXplb2YobG9uZykgPT0gODsKLX0KLQotVEVTVChTdHJpbmdzVGVzdCwgdG9faGV4X3N0cmluZ19mcm9tX251bWJlcikgewotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoMCksICIweDAwMDAwMDAwIik7Ci0gIEFTU0VSVF9FUShUb0hleFN0cmluZygzKSwgIjB4MDAwMDAwMDMiKTsKLSAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKDI1KSwgIjB4MDAwMDAwMTkiKTsKLSAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKC0yNSksICItMHgwMDAwMDAxOSIpOwotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoSU5UX01JTiArIDEpLCAiLTB4N2ZmZmZmZmYiKTsKLSAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKElOVF9NQVgpLCAiMHg3ZmZmZmZmZiIpOwotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoSU5UX01JTiksICJJTlRfTUlOIik7Ci0gIGlmIChpc19hcmNoMzIoKSkgewotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZygxICsgSU5UX01BWCksICJJTlRfTUlOIik7Ci0gICAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKDIgKyBJTlRfTUFYKSwgIi0weDdmZmZmZmZmIik7ICAvLyBSb2xsZWQgb3ZlcgotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZygtMSAtIElOVF9NSU4pLCAiMHg3ZmZmZmZmZiIpOyAgLy8gUm9sbGVkIG92ZXIKLSAgICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoTE9OR19NQVgpLCAiMHg3ZmZmZmZmZiIpOwotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZyhMT05HX01BWCAtIDFMKSwgIjB4N2ZmZmZmZmUiKTsKLSAgICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoTE9OR19NSU4pLCAiTE9OR19NSU4iKTsKLSAgICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoTE9OR19NSU4gKyAxTCksICItMHg3ZmZmZmZmZiIpOwotICB9IGVsc2UgaWYgKGlzX2FyY2g2NCgpKSB7Ci0gICAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKChzaWduZWQgbG9uZylJTlRfTUlOKSwgIi0weDAwMDAwMDAwODAwMDAwMDAiKTsKLSAgICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoMSArIElOVF9NQVgpLCAiSU5UX01JTiIpOyAgICAgIC8vIFJvbGxlZCBvdmVyCi0gICAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKDIgKyBJTlRfTUFYKSwgIi0weDdmZmZmZmZmIik7ICAvLyBSb2xsZWQgb3ZlcgotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZygxTCArIElOVF9NQVgpLCAiMHgwMDAwMDAwMDgwMDAwMDAwIik7Ci0gICAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKDJMICsgSU5UX01BWCksICIweDAwMDAwMDAwODAwMDAwMDEiKTsKLSAgICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoLTFMICsgSU5UX01JTiksICItMHgwMDAwMDAwMDgwMDAwMDAxIik7Ci0gICAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKExPTkdfTUFYKSwgIjB4N2ZmZmZmZmZmZmZmZmZmZiIpOwotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZyhMT05HX01BWCAtIDFMKSwgIjB4N2ZmZmZmZmZmZmZmZmZmZSIpOwotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZyhMT05HX01JTiksICJMT05HX01JTiIpOwotICAgIEFTU0VSVF9FUShUb0hleFN0cmluZyhMT05HX01JTiArIDFMKSwgIi0weDdmZmZmZmZmZmZmZmZmZmYiKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoIlVua25vd24gYXJjaGl0ZWN0dXJlIik7Ci0gICAgQVNTRVJUX1RSVUUoZmFsc2UpOwotICB9Ci0gIEFTU0VSVF9FUShUb0hleFN0cmluZygnYScpLCAiMHg2MSIpOwotfQotCi1URVNUKFN0cmluZ3NUZXN0LCB0b19oZXhfc3RyaW5nX2Zyb21fbnVtYmVyX3Vuc2lnbmVkX2ludCkgewotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoMFUpLCAiMHgwMDAwMDAwMCIpOwotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoMVUpLCAiMHgwMDAwMDAwMSIpOwotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoM1UpLCAiMHgwMDAwMDAwMyIpOwotICBBU1NFUlRfRVEoVG9IZXhTdHJpbmcoMjVVKSwgIjB4MDAwMDAwMTkiKTsKLSAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKFVJTlRfTUFYKSwgIjB4ZmZmZmZmZmYiKTsKLSAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKDFVICsgVUlOVF9NQVgpLCAiMHgwMDAwMDAwMCIpOyAgLy8gUm9sbGVkIG92ZXIKLSAgQVNTRVJUX0VRKFRvSGV4U3RyaW5nKDJVICsgVUlOVF9NQVgpLCAiMHgwMDAwMDAwMSIpOyAgLy8gUm9sbGVkIG92ZXIKLX0KLQotVEVTVChTdHJpbmdzVGVzdCwgdHJpbV9zdHJpbmdfdGVzdCkgewotICBBU1NFUlRfRVEoU3RyaW5nVHJpbSgiICBhYSBiYiIpLCAiYWEgYmIiKTsKLSAgQVNTRVJUX0VRKFN0cmluZ1RyaW0oImFhIGJiICIpLCAiYWEgYmIiKTsKLSAgQVNTRVJUX0VRKFN0cmluZ1RyaW0oIiAgYWEgYmIgIiksICJhYSBiYiIpOwotICBBU1NFUlRfRVEoU3RyaW5nVHJpbSgiICBhYSBiYiBcbiIpLCAiYWEgYmIiKTsKLSAgQVNTRVJUX0VRKFN0cmluZ1RyaW0oIiAgXHJhYSBiYlx0IFxuIiksICJhYSBiYiIpOwotfQotCi1URVNUKFN0cmluZ3NUZXN0LCBzcGxpdF9zdHJpbmdfdGVzdCkgewotICBBU1NFUlRfVEhBVChTdHJpbmdTcGxpdCgiIiwgIiwiKSwgRWxlbWVudHNBcmUoIiIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nU3BsaXQoIjEsMiwzIiwgIiwiKSwgRWxlbWVudHNBcmUoIjEiLCAiMiIsICIzIikpOwotICBBU1NFUlRfVEhBVChTdHJpbmdTcGxpdCgiMSwyLDMiLCAiISIpLCBFbGVtZW50c0FyZSgiMSwyLDMiKSk7Ci0gIEFTU0VSVF9USEFUKFN0cmluZ1NwbGl0KCIxLDIsMyIsICIsIiwgMiksIEVsZW1lbnRzQXJlKCIxIiwgIjIsMyIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nU3BsaXQoImEsYiwiLCAiLCIpLCBFbGVtZW50c0FyZSgiYSIsICJiIiwgIiIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nU3BsaXQoImFiLCIsICIsIiwgMiksIEVsZW1lbnRzQXJlKCJhYiIsICIiKSk7Ci0gIEFTU0VSVF9USEFUKFN0cmluZ1NwbGl0KCJhYiwsIiwgIiwiLCAyKSwgRWxlbWVudHNBcmUoImFiIiwgIiwiKSk7Ci0gIEFTU0VSVF9USEFUKFN0cmluZ1NwbGl0KCJhYiwsIiwgIiwiLCAxKSwgRWxlbWVudHNBcmUoImFiLCwiKSk7Ci0gIEFTU0VSVF9USEFUKFN0cmluZ1NwbGl0KCIxLCwyLCwzIiwgIiwsIiksIEVsZW1lbnRzQXJlKCIxIiwgIjIiLCAiMyIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nU3BsaXQoIjEsLDIsLDMsLCIsICIsLCIpLCBFbGVtZW50c0FyZSgiMSIsICIyIiwgIjMiLCAiIikpOwotICBBU1NFUlRfVEhBVChTdHJpbmdTcGxpdCgiMSwsMiwsMywsIiwgIiwsIiwgMiksIEVsZW1lbnRzQXJlKCIxIiwgIjIsLDMsLCIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nU3BsaXQoIjEiLCAiLCwiLCAyKSwgRWxlbWVudHNBcmUoIjEiKSk7Ci0gIEFTU0VSVF9ERUFUSCh7IFN0cmluZ1NwbGl0KCIxLDIsMyIsICIiKTsgfSwgImRlbGltIGNhbm5vdCBiZSBlbXB0eSIpOwotfQotCi1URVNUKFN0cmluZ3NUZXN0LCBqb2luX3N0cmluZ190ZXN0KSB7Ci0gIEFTU0VSVF9USEFUKFN0cmluZ0pvaW4oe3siMSIsICIyIiwgIjMifX0sICIsIiksIFN0ckVxKCIxLDIsMyIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nSm9pbih7e319LCAiLCIpLCBTdHJFcSgiIikpOwotICBBU1NFUlRfVEhBVChTdHJpbmdKb2luKHt7IjEifX0sICIsIiksIFN0ckVxKCIxIikpOwotICBBU1NFUlRfVEhBVChTdHJpbmdKb2luKHt7IjEiLCAiMiIsICIzIn19LCAiLCwiKSwgU3RyRXEoIjEsLDIsLDMiKSk7Ci0gIEFTU0VSVF9USEFUKFN0cmluZ0pvaW4oe3siMSIsICIsIiwgIjMifX0sICIsLCIpLCBTdHJFcSgiMSwsLCwsMyIpKTsKLX0KLQotVEVTVChTdHJpbmdzVGVzdCwgdG9faGV4X3N0cmluZ190ZXN0KSB7Ci0gIC8vIG5vcm1hbAotICBBU1NFUlRfVEhBVChUb0hleFN0cmluZyh7MHgxMiwgMHgzNCwgMHg1NiwgMHhhYn0pLCBFcSgiMTIzNDU2YWIiKSk7Ci0gIC8vIGVtcHR5Ci0gIEFTU0VSVF9USEFUKFRvSGV4U3RyaW5nKHt9KSwgRXEoIiIpKTsKLSAgLy8gdW5hcnkKLSAgQVNTRVJUX1RIQVQoVG9IZXhTdHJpbmcoezB4MTJ9KSwgRXEoIjEyIikpOwotICAvLyBoYWxmCi0gIEFTU0VSVF9USEFUKFRvSGV4U3RyaW5nKHsweDYsIDB4NSwgMHg1NiwgMHhifSksIEVxKCIwNjA1NTYwYiIpKTsKLSAgLy8gb3RoZXIgdHlwZXMKLSAgc3RkOjphcnJheTx1aW50OF90LCAyPiBhID0gezB4MTIsIDB4NTZ9OwotICBBU1NFUlRfVEhBVChUb0hleFN0cmluZyhhLmJlZ2luKCksIGEuZW5kKCkpLCBFcSgiMTI1NiIpKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYiA9IHsweDM0LCAweDc4fTsKLSAgQVNTRVJUX1RIQVQoVG9IZXhTdHJpbmcoYi5iZWdpbigpLCBiLmVuZCgpKSwgRXEoIjM0NzgiKSk7Ci19Ci0KLVRFU1QoU3RyaW5nc1Rlc3QsIGZyb21faGV4X3N0cmluZ190ZXN0KSB7Ci0gIC8vIG5vcm1hbAotICBBU1NFUlRfVEhBVChGcm9tSGV4U3RyaW5nKCJhYWJiY2NkZDExMjIiKSwgT3B0aW9uYWwoRWxlbWVudHNBcmUoMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHgxMSwgMHgyMikpKTsKLSAgLy8gZW1wdHkKLSAgQVNTRVJUX1RIQVQoRnJvbUhleFN0cmluZygiIiksIE9wdGlvbmFsKElzRW1wdHkoKSkpOwotICAvLyB1bmFyeQotICBBU1NFUlRfVEhBVChGcm9tSGV4U3RyaW5nKCJhYSIpLCBPcHRpb25hbChFbGVtZW50c0FyZSgweGFhKSkpOwotICAvLyBoYWxmCi0gIEFTU0VSVF9USEFUKEZyb21IZXhTdHJpbmcoIjA2MDU1NjBiIiksIE9wdGlvbmFsKEVsZW1lbnRzQXJlKDB4NiwgMHg1LCAweDU2LCAweGIpKSk7Ci0gIC8vIHVwcGVyIGNhc2UgbGV0dGVyCi0gIEFTU0VSVF9USEFUKEZyb21IZXhTdHJpbmcoIkFBQkJDQyIpLCBPcHRpb25hbChFbGVtZW50c0FyZSgweGFhLCAweGJiLCAweGNjKSkpOwotICAvLyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIgbWl4ZWQKLSAgQVNTRVJUX1RIQVQoRnJvbUhleFN0cmluZygiYUFiYkNDIiksIE9wdGlvbmFsKEVsZW1lbnRzQXJlKDB4YWEsIDB4YmIsIDB4Y2MpKSk7Ci0gIC8vIEVycm9yOiBvZGQgbGVuZ3RoCi0gIEFTU0VSVF9GQUxTRShGcm9tSGV4U3RyaW5nKCIwNjA1NTYwIikpOwotICAvLyBFcnJvcjogbm9uIGhleCBjaGFyCi0gIEFTU0VSVF9GQUxTRShGcm9tSGV4U3RyaW5nKCIwNjB1NTYwYiIpKTsKLX0KLQotVEVTVChTdHJpbmdzVGVzdCwgaW50NjRfZnJvbV9hbmRfdG9fc3RyaW5nX3Rlc3QpIHsKLSAgQVNTRVJUX1RIQVQoSW50NjRGcm9tU3RyaW5nKCI0MiIpLCBPcHRpb25hbChFcShpbnQ2NF90KDQyKSkpKTsKLSAgQVNTRVJUX1RIQVQoSW50NjRGcm9tU3RyaW5nKCItNDIiKSwgT3B0aW9uYWwoRXEoaW50NjRfdCgtNDIpKSkpOwotICBBU1NFUlRfVEhBVChJbnQ2NEZyb21TdHJpbmcoIjAiKSwgT3B0aW9uYWwoRXEoaW50NjRfdCgwKSkpKTsKLSAgQVNTRVJUX0ZBTFNFKEludDY0RnJvbVN0cmluZygiIikpOwotICAvLyBvbmx5IGJhc2UgMTAgaXMgc3VwcG9ydGVkCi0gIEFTU0VSVF9GQUxTRShJbnQ2NEZyb21TdHJpbmcoIjB4NDJhYiIpKTsKLSAgQVNTRVJUX0ZBTFNFKEludDY0RnJvbVN0cmluZygiLTB4NDIiKSk7Ci0gIC8vIGZsb2F0aW5nIHBvaW50IG5vdCBzdXBwb3J0ZWQKLSAgQVNTRVJUX0ZBTFNFKEludDY0RnJvbVN0cmluZygiNDIuMCIpKTsKLSAgQVNTRVJUX0ZBTFNFKEludDY0RnJvbVN0cmluZygiLTQyLjAiKSk7Ci0gIEFTU0VSVF9GQUxTRShJbnQ2NEZyb21TdHJpbmcoIjQyYWJjIikpOwotICBBU1NFUlRfRkFMU0UoSW50NjRGcm9tU3RyaW5nKCIiKSk7Ci0gIC8vIElOVDMyX01BWCArIDEKLSAgQVNTRVJUX1RIQVQoSW50NjRGcm9tU3RyaW5nKCIyMTQ3NDgzNjQ4IiksIE9wdGlvbmFsKEVxKGludDY0X3QoMjE0NzQ4MzY0OCkpKSk7Ci0gIEFTU0VSVF9USEFUKFRvU3RyaW5nKGludDY0X3QoMjE0NzQ4MzY0OCkpLCBTdHJFcSgiMjE0NzQ4MzY0OCIpKTsKLSAgLy8gSU5UMzJfTUlOIC0gMQotICBBU1NFUlRfVEhBVChJbnQ2NEZyb21TdHJpbmcoIi0yMTQ3NDgzNjQ5IiksIE9wdGlvbmFsKEVxKGludDY0X3QoLTIxNDc0ODM2NDkpKSkpOwotICBBU1NFUlRfVEhBVChUb1N0cmluZyhpbnQ2NF90KC0yMTQ3NDgzNjQ5KSksIFN0ckVxKCItMjE0NzQ4MzY0OSIpKTsKLSAgLy8gSU5UNjRfTUFYCi0gIEFTU0VSVF9USEFUKEludDY0RnJvbVN0cmluZygiOTIyMzM3MjAzNjg1NDc3NTgwNyIpLCBPcHRpb25hbChFcShpbnQ2NF90KDkyMjMzNzIwMzY4NTQ3NzU4MDcpKSkpOwotICBBU1NFUlRfVEhBVChUb1N0cmluZyhpbnQ2NF90KDkyMjMzNzIwMzY4NTQ3NzU4MDcpKSwgU3RyRXEoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7Ci0gIC8vIElOVDY0X01BWCsxCi0gIEFTU0VSVF9GQUxTRShJbnQ2NEZyb21TdHJpbmcoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7Ci0gIC8vIElOVDY0X01JTgotICBBU1NFUlRfVEhBVChJbnQ2NEZyb21TdHJpbmcoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IiksIE9wdGlvbmFsKEVxKGludDY0X3QoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCAtIDEpKSkpOwotICBBU1NFUlRfVEhBVChUb1N0cmluZyhpbnQ2NF90KC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwgLSAxKSksIFN0ckVxKCItOTIyMzM3MjAzNjg1NDc3NTgwOCIpKTsKLSAgLy8gSU5UNjRfTUlOLTEKLSAgQVNTRVJUX0ZBTFNFKEludDY0RnJvbVN0cmluZygiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiKSk7Ci19Ci0KLVRFU1QoU3RyaW5nc1Rlc3QsIHVpbnQ2NF9mcm9tX2FuZF90b19zdHJpbmdfdGVzdCkgewotICBBU1NFUlRfVEhBVChVaW50NjRGcm9tU3RyaW5nKCI0MiIpLCBPcHRpb25hbChFcSh1aW50NjRfdCg0MikpKSk7Ci0gIEFTU0VSVF9USEFUKFVpbnQ2NEZyb21TdHJpbmcoIjAiKSwgT3B0aW9uYWwoRXEodWludDY0X3QoMCkpKSk7Ci0gIEFTU0VSVF9GQUxTRShVaW50NjRGcm9tU3RyaW5nKCIiKSk7Ci0gIC8vIG9ubHkgYmFzZSAxMCBpcyBzdXBwb3J0ZWQKLSAgQVNTRVJUX0ZBTFNFKFVpbnQ2NEZyb21TdHJpbmcoIjB4NDJhYiIpKTsKLSAgLy8gb25seSBwb3NpdGl2ZSBudW1iZXIgaXMgc3VwcG9ydGVkCi0gIEFTU0VSVF9GQUxTRShVaW50NjRGcm9tU3RyaW5nKCItNDIiKSk7Ci0gIC8vIGZsb2F0aW5nIHBvaW50IG5vdCBzdXBwb3J0ZWQKLSAgQVNTRVJUX0ZBTFNFKFVpbnQ2NEZyb21TdHJpbmcoIjQyLjAiKSk7Ci0gIEFTU0VSVF9GQUxTRShVaW50NjRGcm9tU3RyaW5nKCItNDIuMCIpKTsKLSAgQVNTRVJUX0ZBTFNFKFVpbnQ2NEZyb21TdHJpbmcoIjQyYWJjIikpOwotICBBU1NFUlRfRkFMU0UoVWludDY0RnJvbVN0cmluZygiIikpOwotICAvLyBVSU5UMzJfTUFYICsgMQotICBBU1NFUlRfVEhBVChVaW50NjRGcm9tU3RyaW5nKCI0Mjk0OTY3Mjk1IiksIE9wdGlvbmFsKEVxKHVpbnQ2NF90KDQyOTQ5NjcyOTUpKSkpOwotICBBU1NFUlRfVEhBVChUb1N0cmluZyh1aW50NjRfdCg0Mjk0OTY3Mjk1KSksIFN0ckVxKCI0Mjk0OTY3Mjk1IikpOwotICAvLyBVSU5UNjRfTUFYCi0gIEFTU0VSVF9USEFUKFVpbnQ2NEZyb21TdHJpbmcoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiksIE9wdGlvbmFsKEVxKHVpbnQ2NF90KDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMKSkpKTsKLSAgQVNTRVJUX1RIQVQoVG9TdHJpbmcodWludDY0X3QoMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwpKSwgU3RyRXEoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IikpOwotICAvLyBVSU5UNjRfTUFYKzEKLSAgQVNTRVJUX0ZBTFNFKFVpbnQ2NEZyb21TdHJpbmcoIjE4NDQ2NzQ0MDczNzA5NTUxNjE2IikpOwotfQotCi1URVNUKFN0cmluZ3NUZXN0LCBib29sX2Zyb21fYW5kX3RvX3N0cmluZ190ZXN0KSB7Ci0gIEFTU0VSVF9USEFUKEJvb2xGcm9tU3RyaW5nKCJ0cnVlIiksIE9wdGlvbmFsKElzVHJ1ZSgpKSk7Ci0gIEFTU0VSVF9USEFUKEJvb2xGcm9tU3RyaW5nKCJmYWxzZSIpLCBPcHRpb25hbChJc0ZhbHNlKCkpKTsKLSAgQVNTRVJUX0ZBTFNFKEJvb2xGcm9tU3RyaW5nKCJhYmMiKSk7Ci0gIEFTU0VSVF9GQUxTRShCb29sRnJvbVN0cmluZygiRkFMU0UiKSk7Ci0gIEFTU0VSVF9GQUxTRShCb29sRnJvbVN0cmluZygiVFJVRSIpKTsKLSAgQVNTRVJUX0ZBTFNFKEJvb2xGcm9tU3RyaW5nKCIiKSk7Ci0gIEFTU0VSVF9USEFUKFRvU3RyaW5nKHRydWUpLCBTdHJFcSgidHJ1ZSIpKTsKLSAgQVNTRVJUX1RIQVQoVG9TdHJpbmcoZmFsc2UpLCBTdHJFcSgiZmFsc2UiKSk7Ci19Ci0KLVRFU1QoU3RyaW5nc1Rlc3QsIHN0cmluZ19mb3JtYXRfdGVzdCkgewotICBBU1NFUlRfVEhBVChTdHJpbmdGb3JtYXQoIiVzIiwgImhlbGxvIiksIFN0ckVxKCJoZWxsbyIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nRm9ybWF0KCIlZCIsIDQyKSwgU3RyRXEoIjQyIikpOwotICBBU1NFUlRfVEhBVChTdHJpbmdGb3JtYXQoIiVzIHdvcmxkIiwgImhlbGxvIiksIFN0ckVxKCJoZWxsbyB3b3JsZCIpKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nRm9ybWF0KCIlZCAlLjFmIDB4JTAyeCIsIDQyLCA0My4xMjMsIDB4OCksIFN0ckVxKCI0MiA0My4xIDB4MDgiKSk7Ci19Ci0KLVRFU1QoU3RyaW5nc1Rlc3QsIHN0cmluZ19mb3JtYXRfdGltZV90ZXN0KSB7Ci0gIHN0ZDo6c3RyaW5nIGZvcm1hdCgiJVktJW0tJWQgJUg6JU06JVMiKTsKLSAgdGltZV90IHRoZW4gPSAxMjM0NTY3ODk7Ci0gIHN0cnVjdCBzdGQ6OnRtIHRtOwotICBnbXRpbWVfcigmdGhlbiwgJnRtKTsKLSAgQVNTRVJUX1RIQVQoU3RyaW5nRm9ybWF0VGltZShmb3JtYXQsIHRtKSwgU3RyRXEoIjE5NzMtMTEtMjkgMjE6MzM6MDkiKSk7Ci19Ci0KLVRFU1QoU3RyaW5nc1Rlc3QsIHN0cmluZ19mb3JtYXRfdGltZV93aXRoX21zX2luX3RoZV9iZWdpbm5pbmdfdGVzdCkgewotICBzdGQ6OnN0cmluZyBmb3JtYXQoIiVZLSVtLSVkICVIOiVNOiVTIik7Ci0gIHN0ZDo6dGltZV90IGZyb21fdGltZSA9IDA7Ci0gIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHRpbWVfcG9pbnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpmcm9tX3RpbWVfdChmcm9tX3RpbWUpOwotCi0gIEFTU0VSVF9USEFUKFN0cmluZ0Zvcm1hdFRpbWVXaXRoTWlsbGlzZWNvbmRzKGZvcm1hdCwgdGltZV9wb2ludCwgZ210aW1lKSwgU3RyRXEoIjE5NzAtMDEtMDEgMDA6MDA6MDAuMDAwIikpOwotfQotCi1URVNUKFN0cmluZ3NUZXN0LCBzdHJpbmdfZm9ybWF0X3RpbWVfd2l0aF9tc190ZXN0KSB7Ci0gIHN0ZDo6c3RyaW5nIGZvcm1hdCgiJVktJW0tJWQgJUg6JU06JVMiKTsKLSAgc3RkOjp0aW1lX3QgZnJvbV90aW1lMSA9IDEyMzQ1Njc4OTA7Ci0gIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHRpbWVfcG9pbnQxID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6ZnJvbV90aW1lX3QoZnJvbV90aW1lMSk7Ci0gIHN0ZDo6dGltZV90IGZyb21fdGltZTIgPSAxMjM0NTY3ODkwOwotICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrPiB0aW1lX3BvaW50MiA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OmZyb21fdGltZV90KGZyb21fdGltZTIpOwotCi0gIHRpbWVfcG9pbnQyICs9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMSk7Ci0KLSAgQVNTRVJUX1RIQVQoU3RyaW5nRm9ybWF0VGltZVdpdGhNaWxsaXNlY29uZHMoZm9ybWF0LCB0aW1lX3BvaW50MSwgZ210aW1lKSwgU3RyRXEoIjIwMDktMDItMTMgMjM6MzE6MzAuMDAwIikpOwotICBBU1NFUlRfVEhBVChTdHJpbmdGb3JtYXRUaW1lV2l0aE1pbGxpc2Vjb25kcyhmb3JtYXQsIHRpbWVfcG9pbnQyLCBnbXRpbWUpLCBTdHJFcSgiMjAwOS0wMi0xMyAyMzozMTozMC4wMDEiKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9jb21tb24vdGVzdGluZy9iaW5kX3Rlc3RfdXRpbC5oIGIvZ2QvY29tbW9uL3Rlc3RpbmcvYmluZF90ZXN0X3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiOTIwNC4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vdGVzdGluZy9iaW5kX3Rlc3RfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJiYXNlL3Rlc3QvYmluZF90ZXN0X3V0aWwuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmFzZTo6QmluZExhbWJkYUZvclRlc3Rpbmc7Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jb21tb24vdGVzdGluZy93aXJlZF9wYWlyX29mX2JpZGlfcXVldWVzLmggYi9nZC9jb21tb24vdGVzdGluZy93aXJlZF9wYWlyX29mX2JpZGlfcXVldWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzZhMWYuLjAwMDAwMDAKLS0tIGEvZ2QvY29tbW9uL3Rlc3Rpbmcvd2lyZWRfcGFpcl9vZl9iaWRpX3F1ZXVlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmlkaV9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLyogVGhpcyBjbGFzcyBpcyBhIHBhaXIgb2YgQmlEaVF1ZXVlcywgdGhhdCBoYXZlIGRvd24gZW5kcyAid2lyZWQiIHRvZ2V0aGVyLiBJdCBjYW4gYmUgdXNlZCBpLmUuIHRvIG1vY2sgTDJjYXAKLSAqIGludGVyZmFjZSwgYW5kIHByb3ZpZGUgdHdvIHF1ZXVlcywgd2hlcmUgZWFjaCBzZW5kcyBwYWNrZXRzIG9mIHR5cGUgQSwgYW5kIHJlY2VpdmVzIHBhY2tldHMgb2YgdHlwZSBCICovCi10ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQiwgc3RkOjp1bmlxdWVfcHRyPEI+ICgqQV9UT19CKShzdGQ6OnVuaXF1ZV9wdHI8QT4pPgotY2xhc3MgV2lyZWRQYWlyT2ZCaURpUXVldWVzIHsKLSAgdm9pZCBkZXF1ZXVlX2NhbGxiYWNrX2EoKSB7Ci0gICAgYXV0byBkb3duX3RoaW5nID0gcXVldWVfYV8uR2V0RG93bkVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gICAgaWYgKCFkb3duX3RoaW5nKSBMT0dfRVJST1IoIlJlY2VpdmVkIGRlcXVldWUsIGJ1dCBubyBkYXRhIHJlYWR5Li4uIik7Ci0KLSAgICBkb3duX2J1ZmZlcl9iXy5FbnF1ZXVlKEFfVE9fQihzdGQ6Om1vdmUoZG93bl90aGluZykpLCBoYW5kbGVyXyk7Ci0gIH0KLQotICB2b2lkIGRlcXVldWVfY2FsbGJhY2tfYigpIHsKLSAgICBhdXRvIGRvd25fdGhpbmcgPSBxdWV1ZV9iXy5HZXREb3duRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBpZiAoIWRvd25fdGhpbmcpIExPR19FUlJPUigiUmVjZWl2ZWQgZGVxdWV1ZSwgYnV0IG5vIGRhdGEgcmVhZHkuLi4iKTsKLQotICAgIGRvd25fYnVmZmVyX2FfLkVucXVldWUoQV9UT19CKHN0ZDo6bW92ZShkb3duX3RoaW5nKSksIGhhbmRsZXJfKTsKLSAgfQotCi0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgY29tbW9uOjpCaWRpUXVldWU8QiwgQT4gcXVldWVfYV97MTB9OwotICBjb21tb246OkJpZGlRdWV1ZTxCLCBBPiBxdWV1ZV9iX3sxMH07Ci0gIG9zOjpFbnF1ZXVlQnVmZmVyPEI+IGRvd25fYnVmZmVyX2Ffe3F1ZXVlX2FfLkdldERvd25FbmQoKX07Ci0gIG9zOjpFbnF1ZXVlQnVmZmVyPEI+IGRvd25fYnVmZmVyX2Jfe3F1ZXVlX2JfLkdldERvd25FbmQoKX07Ci0KLSBwdWJsaWM6Ci0gIFdpcmVkUGFpck9mQmlEaVF1ZXVlcyhvczo6SGFuZGxlciogaGFuZGxlcikgOiBoYW5kbGVyXyhoYW5kbGVyKSB7Ci0gICAgcXVldWVfYV8uR2V0RG93bkVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgIGhhbmRsZXJfLCBjb21tb246OkJpbmQoJldpcmVkUGFpck9mQmlEaVF1ZXVlczo6ZGVxdWV1ZV9jYWxsYmFja19hLCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgICBxdWV1ZV9iXy5HZXREb3duRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmV2lyZWRQYWlyT2ZCaURpUXVldWVzOjpkZXF1ZXVlX2NhbGxiYWNrX2IsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgfldpcmVkUGFpck9mQmlEaVF1ZXVlcygpIHsKLSAgICBxdWV1ZV9hXy5HZXREb3duRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgcXVldWVfYl8uR2V0RG93bkVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICB9Ci0KLSAgLyogVGhpcyBtZXRoZCByZXR1cm5zIHRoZSBVcEVuZCBvZiBxdWV1ZSBBICovCi0gIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPEEsIEI+KiBHZXRRdWV1ZUFVcEVuZCgpIHsKLSAgICByZXR1cm4gcXVldWVfYV8uR2V0VXBFbmQoKTsKLSAgfQotCi0gIC8qIFRoaXMgbWV0aGQgcmV0dXJucyB0aGUgVXBFbmQgb2YgcXVldWUgQiAqLwotICBjb21tb246OkJpZGlRdWV1ZUVuZDxBLCBCPiogR2V0UXVldWVCVXBFbmQoKSB7Ci0gICAgcmV0dXJuIHF1ZXVlX2JfLkdldFVwRW5kKCk7Ci0gIH0KLX07Ci0KLW5hbWVzcGFjZSB7Ci1zdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+IEJ1aWxkZXJUb1ZpZXcoCi0gICAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHVwX3RoaW5nKSB7Ci0gIGF1dG8gYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZSh1cF90aGluZy0+c2l6ZSgpKTsKLSAgdXBfdGhpbmctPlNlcmlhbGl6ZShpKTsKLSAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+KGJ5dGVzKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi11c2luZyBXaXJlZFBhaXJPZkwyY2FwUXVldWVzID0KLSAgICBXaXJlZFBhaXJPZkJpRGlRdWV1ZXM8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlciwgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4sIEJ1aWxkZXJUb1ZpZXc+OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvY29tbW9uL3R5cGVfaGVscGVyLmggYi9nZC9jb21tb24vdHlwZV9oZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5OTFmYi4uMDAwMDAwMAotLS0gYS9nZC9jb21tb24vdHlwZV9oZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLS8vIENoZWNrIHdoZXRoZXIgVCBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIFRlbXBsYXRlVHlwZQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgVGVtcGxhdGVUeXBlPgotc3RydWN0IGlzX3NwZWNpYWxpemF0aW9uX29mIDogc3RkOjpmYWxzZV90eXBlIHt9OwotdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgVGVtcGxhdGVUeXBlLCB0eXBlbmFtZS4uLiBBcmdzPgotc3RydWN0IGlzX3NwZWNpYWxpemF0aW9uX29mPFRlbXBsYXRlVHlwZTxBcmdzLi4uPiwgVGVtcGxhdGVUeXBlPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvY3J5cHRvX3Rvb2xib3gvQW5kcm9pZC5icCBiL2dkL2NyeXB0b190b29sYm94L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OWEwYTkuLjAwMDAwMDAKLS0tIGEvZ2QvY3J5cHRvX3Rvb2xib3gvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoQ3J5cHRvVG9vbGJveFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFlcy5jYyIsCi0gICAgICAgICJhZXNfY21hYy5jYyIsCi0gICAgICAgICJjcnlwdG9fdG9vbGJveC5jYyIsCi0gICAgXQotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhDcnlwdG9Ub29sYm94VGVzdFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNyeXB0b190b29sYm94X3Rlc3QuY2MiLAotICAgIF0KLX0KZGlmZiAtLWdpdCBhL2dkL2NyeXB0b190b29sYm94L0JVSUxELmduIGIvZ2QvY3J5cHRvX3Rvb2xib3gvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiY2E1OTEuLjAwMDAwMDAKLS0tIGEvZ2QvY3J5cHRvX3Rvb2xib3gvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotc291cmNlX3NldCgiQmx1ZXRvb3RoQ3J5cHRvVG9vbGJveFNvdXJjZXMiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImFlcy5jYyIsCi0gICAgImFlc19jbWFjLmNjIiwKLSAgICAiY3J5cHRvX3Rvb2xib3guY2MiLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi19CmRpZmYgLS1naXQgYS9nZC9jcnlwdG9fdG9vbGJveC9hZXMuY2MgYi9nZC9jcnlwdG9fdG9vbGJveC9hZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTY0MmMuLjAwMDAwMDAKLS0tIGEvZ2QvY3J5cHRvX3Rvb2xib3gvYWVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODk4ICswLDAgQEAKLS8qCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQ29weXJpZ2h0IChjKSAxOTk4LTIwMDgsIEJyaWFuIEdsYWRtYW4sIFdvcmNlc3RlciwgVUsuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBMSUNFTlNFIFRFUk1TCi0KLSBUaGUgcmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykKLSBpcyBhbGxvd2VkIHdpdGhvdXQgdGhlIHBheW1lbnQgb2YgZmVlcyBvciByb3lhbHRpZXMgcHJvdmlkZWQgdGhhdDoKLQotICAxLiBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAgICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXI7Ci0KLSAgMi4gYmluYXJ5IGRpc3RyaWJ1dGlvbnMgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0Ci0gICAgIG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVpciBkb2N1bWVudGF0aW9uOwotCi0gIDMuIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGlzIG5vdCB1c2VkIHRvIGVuZG9yc2UgcHJvZHVjdHMKLSAgICAgYnVpbHQgdXNpbmcgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotIERJU0NMQUlNRVIKLQotIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcwotIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcwotIGFuZC9vciBmaXRuZXNzIGZvciBwdXJwb3NlLgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElzc3VlIDA5LzA5LzIwMDYKLQotIFRoaXMgaXMgYW4gQUVTIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBvbmx5IDgtYml0IGJ5dGUgb3BlcmF0aW9ucyBvbiB0aGUKLSBjaXBoZXIgc3RhdGUgKHRoZXJlIGFyZSBvcHRpb25zIHRvIHVzZSAzMi1iaXQgdHlwZXMgaWYgYXZhaWxhYmxlKS4KLQotIFRoZSBjb21iaW5hdGlvbiBvZiBtaXggY29sdW1ucyBhbmQgYnl0ZSBzdWJzdGl0dXRpb24gdXNlZCBoZXJlIGlzIGJhc2VkIG9uCi0gdGhhdCBkZXZlbG9wZWQgYnkgS2FybCBNYWxicmFpbi4gSGlzIGNvbnRyaWJ1dGlvbiBpcyBhY2tub3dsZWRnZWQuCi0gKi8KLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGEgZmFzdCBtZW1jcHkgZnVuY3Rpb24gb24geW91ciBzeXN0ZW0gKi8KLSNpZiAxCi0jZGVmaW5lIEhBVkVfTUVNQ1BZCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgMAotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jaW5jbHVkZSA8aW50cmluLmg+Ci0jcHJhZ21hIGludHJpbnNpYyhtZW1jcHkpCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGZhc3QgMzItYml0IHR5cGVzIG9uIHlvdXIgc3lzdGVtICovCi0jaWYgMQotI2RlZmluZSBIQVZFX1VJTlRfMzJUCi0jZW5kaWYKLQotLyogZGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IGFueSB0YWJsZXMgKi8KLSNpZiAxCi0jZGVmaW5lIFVTRV9UQUJMRVMKLSNlbmRpZgotCi0vKiAgT24gSW50ZWwgQ29yZSAyIGR1byBWRVJTSU9OXzEgaXMgZmFzdGVyICovCi0KLS8qIGFsdGVybmF0aXZlIHZlcnNpb25zICh0ZXN0IGZvciBwZXJmb3JtYW5jZSBvbiB5b3VyIHN5c3RlbSkgKi8KLSNpZiAxCi0jZGVmaW5lIFZFUlNJT05fMQotI2VuZGlmCi0KLSNpbmNsdWRlICJhZXMuaCIKLQotI2lmIGRlZmluZWQoSEFWRV9VSU5UXzMyVCkKLXR5cGVkZWYgdWludDMyX3QgdWludF8zMnQ7Ci0jZW5kaWYKLQotLyogZnVuY3Rpb25zIGZvciBmaW5pdGUgZmllbGQgbXVsdGlwbGljYXRpb24gaW4gdGhlIEFFUyBHYWxvaXMgZmllbGQgICAgKi8KLQotI2RlZmluZSBXUE9MWSAweDAxMWIKLSNkZWZpbmUgQlBPTFkgMHgxYgotI2RlZmluZSBEUE9MWSAweDAwOGQKLQotI2RlZmluZSBmMSh4KSAoeCkKLSNkZWZpbmUgZjIoeCkgKCgoeCkgPDwgMSkgXiAoKCgoeCkgPj4gNykgJiAxKSAqIFdQT0xZKSkKLSNkZWZpbmUgZjQoeCkgKCgoeCkgPDwgMikgXiAoKCgoeCkgPj4gNikgJiAxKSAqIFdQT0xZKSBeICgoKCh4KSA+PiA2KSAmIDIpICogV1BPTFkpKQotI2RlZmluZSBmOCh4KSAoKCh4KSA8PCAzKSBeICgoKCh4KSA+PiA1KSAmIDEpICogV1BPTFkpIF4gKCgoKHgpID4+IDUpICYgMikgKiBXUE9MWSkgXiAoKCgoeCkgPj4gNSkgJiA0KSAqIFdQT0xZKSkKLSNkZWZpbmUgZDIoeCkgKCgoeCkgPj4gMSkgXiAoKHgpJjEgPyBEUE9MWSA6IDApKQotCi0jZGVmaW5lIGYzKHgpIChmMih4KSBeICh4KSkKLSNkZWZpbmUgZjkoeCkgKGY4KHgpIF4gKHgpKQotI2RlZmluZSBmYih4KSAoZjgoeCkgXiBmMih4KSBeICh4KSkKLSNkZWZpbmUgZmQoeCkgKGY4KHgpIF4gZjQoeCkgXiAoeCkpCi0jZGVmaW5lIGZlKHgpIChmOCh4KSBeIGY0KHgpIF4gZjIoeCkpCi0KLSNpZiBkZWZpbmVkKFVTRV9UQUJMRVMpCi0KLSNkZWZpbmUgc2JfZGF0YSh3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7IC8qIFMgQm94IGRhdGEgdmFsdWVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdygweDYzKSwgdygweDdjKSwgdygweDc3KSwgdygweDdiKSwgdygweGYyKSwgdygweDZiKSwgdygweDZmKSwgdygweGM1KSwgdygweDMwKSwgdygweDAxKSwgdygweDY3KSwgdygweDJiKSwgICAgIFwKLSAgICAgICAgdygweGZlKSwgdygweGQ3KSwgdygweGFiKSwgdygweDc2KSwgdygweGNhKSwgdygweDgyKSwgdygweGM5KSwgdygweDdkKSwgdygweGZhKSwgdygweDU5KSwgdygweDQ3KSwgdygweGYwKSwgXAotICAgICAgICB3KDB4YWQpLCB3KDB4ZDQpLCB3KDB4YTIpLCB3KDB4YWYpLCB3KDB4OWMpLCB3KDB4YTQpLCB3KDB4NzIpLCB3KDB4YzApLCB3KDB4YjcpLCB3KDB4ZmQpLCB3KDB4OTMpLCB3KDB4MjYpLCBcCi0gICAgICAgIHcoMHgzNiksIHcoMHgzZiksIHcoMHhmNyksIHcoMHhjYyksIHcoMHgzNCksIHcoMHhhNSksIHcoMHhlNSksIHcoMHhmMSksIHcoMHg3MSksIHcoMHhkOCksIHcoMHgzMSksIHcoMHgxNSksIFwKLSAgICAgICAgdygweDA0KSwgdygweGM3KSwgdygweDIzKSwgdygweGMzKSwgdygweDE4KSwgdygweDk2KSwgdygweDA1KSwgdygweDlhKSwgdygweDA3KSwgdygweDEyKSwgdygweDgwKSwgdygweGUyKSwgXAotICAgICAgICB3KDB4ZWIpLCB3KDB4MjcpLCB3KDB4YjIpLCB3KDB4NzUpLCB3KDB4MDkpLCB3KDB4ODMpLCB3KDB4MmMpLCB3KDB4MWEpLCB3KDB4MWIpLCB3KDB4NmUpLCB3KDB4NWEpLCB3KDB4YTApLCBcCi0gICAgICAgIHcoMHg1MiksIHcoMHgzYiksIHcoMHhkNiksIHcoMHhiMyksIHcoMHgyOSksIHcoMHhlMyksIHcoMHgyZiksIHcoMHg4NCksIHcoMHg1MyksIHcoMHhkMSksIHcoMHgwMCksIHcoMHhlZCksIFwKLSAgICAgICAgdygweDIwKSwgdygweGZjKSwgdygweGIxKSwgdygweDViKSwgdygweDZhKSwgdygweGNiKSwgdygweGJlKSwgdygweDM5KSwgdygweDRhKSwgdygweDRjKSwgdygweDU4KSwgdygweGNmKSwgXAotICAgICAgICB3KDB4ZDApLCB3KDB4ZWYpLCB3KDB4YWEpLCB3KDB4ZmIpLCB3KDB4NDMpLCB3KDB4NGQpLCB3KDB4MzMpLCB3KDB4ODUpLCB3KDB4NDUpLCB3KDB4ZjkpLCB3KDB4MDIpLCB3KDB4N2YpLCBcCi0gICAgICAgIHcoMHg1MCksIHcoMHgzYyksIHcoMHg5ZiksIHcoMHhhOCksIHcoMHg1MSksIHcoMHhhMyksIHcoMHg0MCksIHcoMHg4ZiksIHcoMHg5MiksIHcoMHg5ZCksIHcoMHgzOCksIHcoMHhmNSksIFwKLSAgICAgICAgdygweGJjKSwgdygweGI2KSwgdygweGRhKSwgdygweDIxKSwgdygweDEwKSwgdygweGZmKSwgdygweGYzKSwgdygweGQyKSwgdygweGNkKSwgdygweDBjKSwgdygweDEzKSwgdygweGVjKSwgXAotICAgICAgICB3KDB4NWYpLCB3KDB4OTcpLCB3KDB4NDQpLCB3KDB4MTcpLCB3KDB4YzQpLCB3KDB4YTcpLCB3KDB4N2UpLCB3KDB4M2QpLCB3KDB4NjQpLCB3KDB4NWQpLCB3KDB4MTkpLCB3KDB4NzMpLCBcCi0gICAgICAgIHcoMHg2MCksIHcoMHg4MSksIHcoMHg0ZiksIHcoMHhkYyksIHcoMHgyMiksIHcoMHgyYSksIHcoMHg5MCksIHcoMHg4OCksIHcoMHg0NiksIHcoMHhlZSksIHcoMHhiOCksIHcoMHgxNCksIFwKLSAgICAgICAgdygweGRlKSwgdygweDVlKSwgdygweDBiKSwgdygweGRiKSwgdygweGUwKSwgdygweDMyKSwgdygweDNhKSwgdygweDBhKSwgdygweDQ5KSwgdygweDA2KSwgdygweDI0KSwgdygweDVjKSwgXAotICAgICAgICB3KDB4YzIpLCB3KDB4ZDMpLCB3KDB4YWMpLCB3KDB4NjIpLCB3KDB4OTEpLCB3KDB4OTUpLCB3KDB4ZTQpLCB3KDB4NzkpLCB3KDB4ZTcpLCB3KDB4YzgpLCB3KDB4MzcpLCB3KDB4NmQpLCBcCi0gICAgICAgIHcoMHg4ZCksIHcoMHhkNSksIHcoMHg0ZSksIHcoMHhhOSksIHcoMHg2YyksIHcoMHg1NiksIHcoMHhmNCksIHcoMHhlYSksIHcoMHg2NSksIHcoMHg3YSksIHcoMHhhZSksIHcoMHgwOCksIFwKLSAgICAgICAgdygweGJhKSwgdygweDc4KSwgdygweDI1KSwgdygweDJlKSwgdygweDFjKSwgdygweGE2KSwgdygweGI0KSwgdygweGM2KSwgdygweGU4KSwgdygweGRkKSwgdygweDc0KSwgdygweDFmKSwgXAotICAgICAgICB3KDB4NGIpLCB3KDB4YmQpLCB3KDB4OGIpLCB3KDB4OGEpLCB3KDB4NzApLCB3KDB4M2UpLCB3KDB4YjUpLCB3KDB4NjYpLCB3KDB4NDgpLCB3KDB4MDMpLCB3KDB4ZjYpLCB3KDB4MGUpLCBcCi0gICAgICAgIHcoMHg2MSksIHcoMHgzNSksIHcoMHg1NyksIHcoMHhiOSksIHcoMHg4NiksIHcoMHhjMSksIHcoMHgxZCksIHcoMHg5ZSksIHcoMHhlMSksIHcoMHhmOCksIHcoMHg5OCksIHcoMHgxMSksIFwKLSAgICAgICAgdygweDY5KSwgdygweGQ5KSwgdygweDhlKSwgdygweDk0KSwgdygweDliKSwgdygweDFlKSwgdygweDg3KSwgdygweGU5KSwgdygweGNlKSwgdygweDU1KSwgdygweDI4KSwgdygweGRmKSwgXAotICAgICAgICB3KDB4OGMpLCB3KDB4YTEpLCB3KDB4ODkpLCB3KDB4MGQpLCB3KDB4YmYpLCB3KDB4ZTYpLCB3KDB4NDIpLCB3KDB4NjgpLCB3KDB4NDEpLCB3KDB4OTkpLCB3KDB4MmQpLCB3KDB4MGYpLCBcCi0gICAgICAgIHcoMHhiMCksIHcoMHg1NCksIHcoMHhiYiksIHcoMHgxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIGlzYl9kYXRhKHcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAvKiBpbnZlcnNlIFMgQm94IGRhdGEgdmFsdWVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHcoMHg1MiksIHcoMHgwOSksIHcoMHg2YSksIHcoMHhkNSksIHcoMHgzMCksIHcoMHgzNiksIHcoMHhhNSksIHcoMHgzOCksIHcoMHhiZiksIHcoMHg0MCksIHcoMHhhMyksIHcoMHg5ZSksICAgICBcCi0gICAgICAgIHcoMHg4MSksIHcoMHhmMyksIHcoMHhkNyksIHcoMHhmYiksIHcoMHg3YyksIHcoMHhlMyksIHcoMHgzOSksIHcoMHg4MiksIHcoMHg5YiksIHcoMHgyZiksIHcoMHhmZiksIHcoMHg4NyksIFwKLSAgICAgICAgdygweDM0KSwgdygweDhlKSwgdygweDQzKSwgdygweDQ0KSwgdygweGM0KSwgdygweGRlKSwgdygweGU5KSwgdygweGNiKSwgdygweDU0KSwgdygweDdiKSwgdygweDk0KSwgdygweDMyKSwgXAotICAgICAgICB3KDB4YTYpLCB3KDB4YzIpLCB3KDB4MjMpLCB3KDB4M2QpLCB3KDB4ZWUpLCB3KDB4NGMpLCB3KDB4OTUpLCB3KDB4MGIpLCB3KDB4NDIpLCB3KDB4ZmEpLCB3KDB4YzMpLCB3KDB4NGUpLCBcCi0gICAgICAgIHcoMHgwOCksIHcoMHgyZSksIHcoMHhhMSksIHcoMHg2NiksIHcoMHgyOCksIHcoMHhkOSksIHcoMHgyNCksIHcoMHhiMiksIHcoMHg3NiksIHcoMHg1YiksIHcoMHhhMiksIHcoMHg0OSksIFwKLSAgICAgICAgdygweDZkKSwgdygweDhiKSwgdygweGQxKSwgdygweDI1KSwgdygweDcyKSwgdygweGY4KSwgdygweGY2KSwgdygweDY0KSwgdygweDg2KSwgdygweDY4KSwgdygweDk4KSwgdygweDE2KSwgXAotICAgICAgICB3KDB4ZDQpLCB3KDB4YTQpLCB3KDB4NWMpLCB3KDB4Y2MpLCB3KDB4NWQpLCB3KDB4NjUpLCB3KDB4YjYpLCB3KDB4OTIpLCB3KDB4NmMpLCB3KDB4NzApLCB3KDB4NDgpLCB3KDB4NTApLCBcCi0gICAgICAgIHcoMHhmZCksIHcoMHhlZCksIHcoMHhiOSksIHcoMHhkYSksIHcoMHg1ZSksIHcoMHgxNSksIHcoMHg0NiksIHcoMHg1NyksIHcoMHhhNyksIHcoMHg4ZCksIHcoMHg5ZCksIHcoMHg4NCksIFwKLSAgICAgICAgdygweDkwKSwgdygweGQ4KSwgdygweGFiKSwgdygweDAwKSwgdygweDhjKSwgdygweGJjKSwgdygweGQzKSwgdygweDBhKSwgdygweGY3KSwgdygweGU0KSwgdygweDU4KSwgdygweDA1KSwgXAotICAgICAgICB3KDB4YjgpLCB3KDB4YjMpLCB3KDB4NDUpLCB3KDB4MDYpLCB3KDB4ZDApLCB3KDB4MmMpLCB3KDB4MWUpLCB3KDB4OGYpLCB3KDB4Y2EpLCB3KDB4M2YpLCB3KDB4MGYpLCB3KDB4MDIpLCBcCi0gICAgICAgIHcoMHhjMSksIHcoMHhhZiksIHcoMHhiZCksIHcoMHgwMyksIHcoMHgwMSksIHcoMHgxMyksIHcoMHg4YSksIHcoMHg2YiksIHcoMHgzYSksIHcoMHg5MSksIHcoMHgxMSksIHcoMHg0MSksIFwKLSAgICAgICAgdygweDRmKSwgdygweDY3KSwgdygweGRjKSwgdygweGVhKSwgdygweDk3KSwgdygweGYyKSwgdygweGNmKSwgdygweGNlKSwgdygweGYwKSwgdygweGI0KSwgdygweGU2KSwgdygweDczKSwgXAotICAgICAgICB3KDB4OTYpLCB3KDB4YWMpLCB3KDB4NzQpLCB3KDB4MjIpLCB3KDB4ZTcpLCB3KDB4YWQpLCB3KDB4MzUpLCB3KDB4ODUpLCB3KDB4ZTIpLCB3KDB4ZjkpLCB3KDB4MzcpLCB3KDB4ZTgpLCBcCi0gICAgICAgIHcoMHgxYyksIHcoMHg3NSksIHcoMHhkZiksIHcoMHg2ZSksIHcoMHg0NyksIHcoMHhmMSksIHcoMHgxYSksIHcoMHg3MSksIHcoMHgxZCksIHcoMHgyOSksIHcoMHhjNSksIHcoMHg4OSksIFwKLSAgICAgICAgdygweDZmKSwgdygweGI3KSwgdygweDYyKSwgdygweDBlKSwgdygweGFhKSwgdygweDE4KSwgdygweGJlKSwgdygweDFiKSwgdygweGZjKSwgdygweDU2KSwgdygweDNlKSwgdygweDRiKSwgXAotICAgICAgICB3KDB4YzYpLCB3KDB4ZDIpLCB3KDB4NzkpLCB3KDB4MjApLCB3KDB4OWEpLCB3KDB4ZGIpLCB3KDB4YzApLCB3KDB4ZmUpLCB3KDB4NzgpLCB3KDB4Y2QpLCB3KDB4NWEpLCB3KDB4ZjQpLCBcCi0gICAgICAgIHcoMHgxZiksIHcoMHhkZCksIHcoMHhhOCksIHcoMHgzMyksIHcoMHg4OCksIHcoMHgwNyksIHcoMHhjNyksIHcoMHgzMSksIHcoMHhiMSksIHcoMHgxMiksIHcoMHgxMCksIHcoMHg1OSksIFwKLSAgICAgICAgdygweDI3KSwgdygweDgwKSwgdygweGVjKSwgdygweDVmKSwgdygweDYwKSwgdygweDUxKSwgdygweDdmKSwgdygweGE5KSwgdygweDE5KSwgdygweGI1KSwgdygweDRhKSwgdygweDBkKSwgXAotICAgICAgICB3KDB4MmQpLCB3KDB4ZTUpLCB3KDB4N2EpLCB3KDB4OWYpLCB3KDB4OTMpLCB3KDB4YzkpLCB3KDB4OWMpLCB3KDB4ZWYpLCB3KDB4YTApLCB3KDB4ZTApLCB3KDB4M2IpLCB3KDB4NGQpLCBcCi0gICAgICAgIHcoMHhhZSksIHcoMHgyYSksIHcoMHhmNSksIHcoMHhiMCksIHcoMHhjOCksIHcoMHhlYiksIHcoMHhiYiksIHcoMHgzYyksIHcoMHg4MyksIHcoMHg1MyksIHcoMHg5OSksIHcoMHg2MSksIFwKLSAgICAgICAgdygweDE3KSwgdygweDJiKSwgdygweDA0KSwgdygweDdlKSwgdygweGJhKSwgdygweDc3KSwgdygweGQ2KSwgdygweDI2KSwgdygweGUxKSwgdygweDY5KSwgdygweDE0KSwgdygweDYzKSwgXAotICAgICAgICB3KDB4NTUpLCB3KDB4MjEpLCB3KDB4MGMpLCB3KDB4N2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBtbV9kYXRhKHcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgLyogYmFzaWMgZGF0YSBmb3IgZm9ybWluZyBmaW5pdGUgZmllbGQgdGFibGVzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3KDB4MDApLCB3KDB4MDEpLCB3KDB4MDIpLCB3KDB4MDMpLCB3KDB4MDQpLCB3KDB4MDUpLCB3KDB4MDYpLCB3KDB4MDcpLCB3KDB4MDgpLCB3KDB4MDkpLCB3KDB4MGEpLCB3KDB4MGIpLCAgICAgXAotICAgICAgICB3KDB4MGMpLCB3KDB4MGQpLCB3KDB4MGUpLCB3KDB4MGYpLCB3KDB4MTApLCB3KDB4MTEpLCB3KDB4MTIpLCB3KDB4MTMpLCB3KDB4MTQpLCB3KDB4MTUpLCB3KDB4MTYpLCB3KDB4MTcpLCBcCi0gICAgICAgIHcoMHgxOCksIHcoMHgxOSksIHcoMHgxYSksIHcoMHgxYiksIHcoMHgxYyksIHcoMHgxZCksIHcoMHgxZSksIHcoMHgxZiksIHcoMHgyMCksIHcoMHgyMSksIHcoMHgyMiksIHcoMHgyMyksIFwKLSAgICAgICAgdygweDI0KSwgdygweDI1KSwgdygweDI2KSwgdygweDI3KSwgdygweDI4KSwgdygweDI5KSwgdygweDJhKSwgdygweDJiKSwgdygweDJjKSwgdygweDJkKSwgdygweDJlKSwgdygweDJmKSwgXAotICAgICAgICB3KDB4MzApLCB3KDB4MzEpLCB3KDB4MzIpLCB3KDB4MzMpLCB3KDB4MzQpLCB3KDB4MzUpLCB3KDB4MzYpLCB3KDB4MzcpLCB3KDB4MzgpLCB3KDB4MzkpLCB3KDB4M2EpLCB3KDB4M2IpLCBcCi0gICAgICAgIHcoMHgzYyksIHcoMHgzZCksIHcoMHgzZSksIHcoMHgzZiksIHcoMHg0MCksIHcoMHg0MSksIHcoMHg0MiksIHcoMHg0MyksIHcoMHg0NCksIHcoMHg0NSksIHcoMHg0NiksIHcoMHg0NyksIFwKLSAgICAgICAgdygweDQ4KSwgdygweDQ5KSwgdygweDRhKSwgdygweDRiKSwgdygweDRjKSwgdygweDRkKSwgdygweDRlKSwgdygweDRmKSwgdygweDUwKSwgdygweDUxKSwgdygweDUyKSwgdygweDUzKSwgXAotICAgICAgICB3KDB4NTQpLCB3KDB4NTUpLCB3KDB4NTYpLCB3KDB4NTcpLCB3KDB4NTgpLCB3KDB4NTkpLCB3KDB4NWEpLCB3KDB4NWIpLCB3KDB4NWMpLCB3KDB4NWQpLCB3KDB4NWUpLCB3KDB4NWYpLCBcCi0gICAgICAgIHcoMHg2MCksIHcoMHg2MSksIHcoMHg2MiksIHcoMHg2MyksIHcoMHg2NCksIHcoMHg2NSksIHcoMHg2NiksIHcoMHg2NyksIHcoMHg2OCksIHcoMHg2OSksIHcoMHg2YSksIHcoMHg2YiksIFwKLSAgICAgICAgdygweDZjKSwgdygweDZkKSwgdygweDZlKSwgdygweDZmKSwgdygweDcwKSwgdygweDcxKSwgdygweDcyKSwgdygweDczKSwgdygweDc0KSwgdygweDc1KSwgdygweDc2KSwgdygweDc3KSwgXAotICAgICAgICB3KDB4NzgpLCB3KDB4NzkpLCB3KDB4N2EpLCB3KDB4N2IpLCB3KDB4N2MpLCB3KDB4N2QpLCB3KDB4N2UpLCB3KDB4N2YpLCB3KDB4ODApLCB3KDB4ODEpLCB3KDB4ODIpLCB3KDB4ODMpLCBcCi0gICAgICAgIHcoMHg4NCksIHcoMHg4NSksIHcoMHg4NiksIHcoMHg4NyksIHcoMHg4OCksIHcoMHg4OSksIHcoMHg4YSksIHcoMHg4YiksIHcoMHg4YyksIHcoMHg4ZCksIHcoMHg4ZSksIHcoMHg4ZiksIFwKLSAgICAgICAgdygweDkwKSwgdygweDkxKSwgdygweDkyKSwgdygweDkzKSwgdygweDk0KSwgdygweDk1KSwgdygweDk2KSwgdygweDk3KSwgdygweDk4KSwgdygweDk5KSwgdygweDlhKSwgdygweDliKSwgXAotICAgICAgICB3KDB4OWMpLCB3KDB4OWQpLCB3KDB4OWUpLCB3KDB4OWYpLCB3KDB4YTApLCB3KDB4YTEpLCB3KDB4YTIpLCB3KDB4YTMpLCB3KDB4YTQpLCB3KDB4YTUpLCB3KDB4YTYpLCB3KDB4YTcpLCBcCi0gICAgICAgIHcoMHhhOCksIHcoMHhhOSksIHcoMHhhYSksIHcoMHhhYiksIHcoMHhhYyksIHcoMHhhZCksIHcoMHhhZSksIHcoMHhhZiksIHcoMHhiMCksIHcoMHhiMSksIHcoMHhiMiksIHcoMHhiMyksIFwKLSAgICAgICAgdygweGI0KSwgdygweGI1KSwgdygweGI2KSwgdygweGI3KSwgdygweGI4KSwgdygweGI5KSwgdygweGJhKSwgdygweGJiKSwgdygweGJjKSwgdygweGJkKSwgdygweGJlKSwgdygweGJmKSwgXAotICAgICAgICB3KDB4YzApLCB3KDB4YzEpLCB3KDB4YzIpLCB3KDB4YzMpLCB3KDB4YzQpLCB3KDB4YzUpLCB3KDB4YzYpLCB3KDB4YzcpLCB3KDB4YzgpLCB3KDB4YzkpLCB3KDB4Y2EpLCB3KDB4Y2IpLCBcCi0gICAgICAgIHcoMHhjYyksIHcoMHhjZCksIHcoMHhjZSksIHcoMHhjZiksIHcoMHhkMCksIHcoMHhkMSksIHcoMHhkMiksIHcoMHhkMyksIHcoMHhkNCksIHcoMHhkNSksIHcoMHhkNiksIHcoMHhkNyksIFwKLSAgICAgICAgdygweGQ4KSwgdygweGQ5KSwgdygweGRhKSwgdygweGRiKSwgdygweGRjKSwgdygweGRkKSwgdygweGRlKSwgdygweGRmKSwgdygweGUwKSwgdygweGUxKSwgdygweGUyKSwgdygweGUzKSwgXAotICAgICAgICB3KDB4ZTQpLCB3KDB4ZTUpLCB3KDB4ZTYpLCB3KDB4ZTcpLCB3KDB4ZTgpLCB3KDB4ZTkpLCB3KDB4ZWEpLCB3KDB4ZWIpLCB3KDB4ZWMpLCB3KDB4ZWQpLCB3KDB4ZWUpLCB3KDB4ZWYpLCBcCi0gICAgICAgIHcoMHhmMCksIHcoMHhmMSksIHcoMHhmMiksIHcoMHhmMyksIHcoMHhmNCksIHcoMHhmNSksIHcoMHhmNiksIHcoMHhmNyksIHcoMHhmOCksIHcoMHhmOSksIHcoMHhmYSksIHcoMHhmYiksIFwKLSAgICAgICAgdygweGZjKSwgdygweGZkKSwgdygweGZlKSwgdygweGZmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLXN0YXRpYyBjb25zdCB1aW50Xzh0IHNib3hbMjU2XSA9IHNiX2RhdGEoZjEpOwotc3RhdGljIGNvbnN0IHVpbnRfOHQgaXNib3hbMjU2XSA9IGlzYl9kYXRhKGYxKTsKLQotc3RhdGljIGNvbnN0IHVpbnRfOHQgZ2ZtMl9zYm94WzI1Nl0gPSBzYl9kYXRhKGYyKTsKLXN0YXRpYyBjb25zdCB1aW50Xzh0IGdmbTNfc2JveFsyNTZdID0gc2JfZGF0YShmMyk7Ci0KLXN0YXRpYyBjb25zdCB1aW50Xzh0IGdmbXVsXzlbMjU2XSA9IG1tX2RhdGEoZjkpOwotc3RhdGljIGNvbnN0IHVpbnRfOHQgZ2ZtdWxfYlsyNTZdID0gbW1fZGF0YShmYik7Ci1zdGF0aWMgY29uc3QgdWludF84dCBnZm11bF9kWzI1Nl0gPSBtbV9kYXRhKGZkKTsKLXN0YXRpYyBjb25zdCB1aW50Xzh0IGdmbXVsX2VbMjU2XSA9IG1tX2RhdGEoZmUpOwotCi0jZGVmaW5lIHNfYm94KHgpIHNib3hbKHgpXQotI2RlZmluZSBpc19ib3goeCkgaXNib3hbKHgpXQotI2RlZmluZSBnZm0yX3NiKHgpIGdmbTJfc2JveFsoeCldCi0jZGVmaW5lIGdmbTNfc2IoeCkgZ2ZtM19zYm94Wyh4KV0KLSNkZWZpbmUgZ2ZtXzkoeCkgZ2ZtdWxfOVsoeCldCi0jZGVmaW5lIGdmbV9iKHgpIGdmbXVsX2JbKHgpXQotI2RlZmluZSBnZm1fZCh4KSBnZm11bF9kWyh4KV0KLSNkZWZpbmUgZ2ZtX2UoeCkgZ2ZtdWxfZVsoeCldCi0KLSNlbHNlCi0KLS8qIHRoaXMgaXMgdGhlIGhpZ2ggYml0IG9mIHggcmlnaHQgc2hpZnRlZCBieSAxICovCi0vKiBwb3NpdGlvbi4gU2luY2UgdGhlIHN0YXJ0aW5nIHBvbHlub21pYWwgaGFzICAqLwotLyogOSBiaXRzICgweDExYiksIHRoaXMgcmlnaHQgc2hpZnQga2VlcHMgdGhlICAgKi8KLS8qIHZhbHVlcyBvZiBhbGwgdG9wIGJpdHMgd2l0aGluIGEgYnl0ZSAgICAgICAgICovCi0KLXN0YXRpYyB1aW50Xzh0IGhpYml0KGNvbnN0IHVpbnRfOHQgeCkgewotICB1aW50Xzh0IHIgPSAodWludF84dCkoKHggPj4gMSkgfCAoeCA+PiAyKSk7Ci0KLSAgciB8PSAociA+PiAyKTsKLSAgciB8PSAociA+PiA0KTsKLSAgcmV0dXJuIChyICsgMSkgPj4gMTsKLX0KLQotLyogcmV0dXJuIHRoZSBpbnZlcnNlIG9mIHRoZSBmaW5pdGUgZmllbGQgZWxlbWVudCB4ICovCi0KLXN0YXRpYyB1aW50Xzh0IGdmX2ludihjb25zdCB1aW50Xzh0IHgpIHsKLSAgdWludF84dCBwMSA9IHgsIHAyID0gQlBPTFksIG4xID0gaGliaXQoeCksIG4yID0gMHg4MCwgdjEgPSAxLCB2MiA9IDA7Ci0KLSAgaWYgKHggPCAyKSByZXR1cm4geDsKLQotICBmb3IgKDs7KSB7Ci0gICAgaWYgKG4xKQotICAgICAgd2hpbGUgKG4yID49IG4xKSAvKiBkaXZpZGUgcG9seW5vbWlhbCBwMiBieSBwMSAgICAqLwotICAgICAgewotICAgICAgICBuMiAvPSBuMTsgICAgICAgICAgICAgICAvKiBzaGlmdCBzbWFsbGVyIHBvbHlub21pYWwgbGVmdCAqLwotICAgICAgICBwMiBePSAocDEgKiBuMikgJiAweGZmOyAvKiBhbmQgcmVtb3ZlIGZyb20gbGFyZ2VyIG9uZSAgICAqLwotICAgICAgICB2MiBePSAodjEgKiBuMik7ICAgICAgICAvKiBzaGlmdCBhY2N1bXVsYXRlZCB2YWx1ZSBhbmQgICAqLwotICAgICAgICBuMiA9IGhpYml0KHAyKTsgICAgICAgICAvKiBhZGQgaW50byByZXN1bHQgICAgICAgICAgICAgICAqLwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiB2MTsKLQotICAgIGlmIChuMikgLyogcmVwZWF0IHdpdGggdmFsdWVzIHN3YXBwZWQgICAgKi8KLSAgICAgIHdoaWxlIChuMSA+PSBuMikgewotICAgICAgICBuMSAvPSBuMjsKLSAgICAgICAgcDEgXj0gcDIgKiBuMTsKLSAgICAgICAgdjEgXj0gdjIgKiBuMTsKLSAgICAgICAgbjEgPSBoaWJpdChwMSk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHYyOwotICB9Ci19Ci0KLS8qIFRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbnMgdXNlZCBpbiB0aGUgUy1ib3ggKi8KLXVpbnRfOHQgZndkX2FmZmluZShjb25zdCB1aW50Xzh0IHgpIHsKLSNpZiBkZWZpbmVkKEhBVkVfVUlOVF8zMlQpCi0gIHVpbnRfMzJ0IHcgPSB4OwotICB3IF49ICh3IDw8IDEpIF4gKHcgPDwgMikgXiAodyA8PCAzKSBeICh3IDw8IDQpOwotICByZXR1cm4gMHg2MyBeICgodyBeICh3ID4+IDgpKSAmIDB4ZmYpOwotI2Vsc2UKLSAgcmV0dXJuIDB4NjMgXiB4IF4gKHggPDwgMSkgXiAoeCA8PCAyKSBeICh4IDw8IDMpIF4gKHggPDwgNCkgXiAoeCA+PiA3KSBeICh4ID4+IDYpIF4gKHggPj4gNSkgXiAoeCA+PiA0KTsKLSNlbmRpZgotfQotCi11aW50Xzh0IGludl9hZmZpbmUoY29uc3QgdWludF84dCB4KSB7Ci0jaWYgZGVmaW5lZChIQVZFX1VJTlRfMzJUKQotICB1aW50XzMydCB3ID0geDsKLSAgdyA9ICh3IDw8IDEpIF4gKHcgPDwgMykgXiAodyA8PCA2KTsKLSAgcmV0dXJuIDB4MDUgXiAoKHcgXiAodyA+PiA4KSkgJiAweGZmKTsKLSNlbHNlCi0gIHJldHVybiAweDA1IF4gKHggPDwgMSkgXiAoeCA8PCAzKSBeICh4IDw8IDYpIF4gKHggPj4gNykgXiAoeCA+PiA1KSBeICh4ID4+IDIpOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgc19ib3goeCkgZndkX2FmZmluZShnZl9pbnYoeCkpCi0jZGVmaW5lIGlzX2JveCh4KSBnZl9pbnYoaW52X2FmZmluZSh4KSkKLSNkZWZpbmUgZ2ZtMl9zYih4KSBmMihzX2JveCh4KSkKLSNkZWZpbmUgZ2ZtM19zYih4KSBmMyhzX2JveCh4KSkKLSNkZWZpbmUgZ2ZtXzkoeCkgZjkoeCkKLSNkZWZpbmUgZ2ZtX2IoeCkgZmIoeCkKLSNkZWZpbmUgZ2ZtX2QoeCkgZmQoeCkKLSNkZWZpbmUgZ2ZtX2UoeCkgZmUoeCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfTUVNQ1BZKQotI2RlZmluZSBibG9ja19jb3B5X25uKGQsIHMsIGwpIG1lbWNweShkLCBzLCBsKQotI2RlZmluZSBibG9ja19jb3B5KGQsIHMpIG1lbWNweShkLCBzLCBOX0JMT0NLKQotI2Vsc2UKLSNkZWZpbmUgYmxvY2tfY29weV9ubihkLCBzLCBsKSBjb3B5X2Jsb2NrX25uKGQsIHMsIGwpCi0jZGVmaW5lIGJsb2NrX2NvcHkoZCwgcykgY29weV9ibG9jayhkLCBzKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChIQVZFX01FTUNQWSkKLXN0YXRpYyB2b2lkIGNvcHlfYmxvY2sodm9pZCogZCwgY29uc3Qgdm9pZCogcykgewotI2lmIGRlZmluZWQoSEFWRV9VSU5UXzMyVCkKLSAgKCh1aW50XzMydCopZClbMF0gPSAoKHVpbnRfMzJ0KilzKVswXTsKLSAgKCh1aW50XzMydCopZClbMV0gPSAoKHVpbnRfMzJ0KilzKVsxXTsKLSAgKCh1aW50XzMydCopZClbMl0gPSAoKHVpbnRfMzJ0KilzKVsyXTsKLSAgKCh1aW50XzMydCopZClbM10gPSAoKHVpbnRfMzJ0KilzKVszXTsKLSNlbHNlCi0gICgodWludF84dCopZClbMF0gPSAoKHVpbnRfOHQqKXMpWzBdOwotICAoKHVpbnRfOHQqKWQpWzFdID0gKCh1aW50Xzh0KilzKVsxXTsKLSAgKCh1aW50Xzh0KilkKVsyXSA9ICgodWludF84dCopcylbMl07Ci0gICgodWludF84dCopZClbM10gPSAoKHVpbnRfOHQqKXMpWzNdOwotICAoKHVpbnRfOHQqKWQpWzRdID0gKCh1aW50Xzh0KilzKVs0XTsKLSAgKCh1aW50Xzh0KilkKVs1XSA9ICgodWludF84dCopcylbNV07Ci0gICgodWludF84dCopZClbNl0gPSAoKHVpbnRfOHQqKXMpWzZdOwotICAoKHVpbnRfOHQqKWQpWzddID0gKCh1aW50Xzh0KilzKVs3XTsKLSAgKCh1aW50Xzh0KilkKVs4XSA9ICgodWludF84dCopcylbOF07Ci0gICgodWludF84dCopZClbOV0gPSAoKHVpbnRfOHQqKXMpWzldOwotICAoKHVpbnRfOHQqKWQpWzEwXSA9ICgodWludF84dCopcylbMTBdOwotICAoKHVpbnRfOHQqKWQpWzExXSA9ICgodWludF84dCopcylbMTFdOwotICAoKHVpbnRfOHQqKWQpWzEyXSA9ICgodWludF84dCopcylbMTJdOwotICAoKHVpbnRfOHQqKWQpWzEzXSA9ICgodWludF84dCopcylbMTNdOwotICAoKHVpbnRfOHQqKWQpWzE0XSA9ICgodWludF84dCopcylbMTRdOwotICAoKHVpbnRfOHQqKWQpWzE1XSA9ICgodWludF84dCopcylbMTVdOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfYmxvY2tfbm4odm9pZCogZCwgY29uc3Qgdm9pZCogcywgdWludF84dCBubikgewotICB3aGlsZSAobm4tLSkgKigodWludF84dCopZCkrKyA9ICooKHVpbnRfOHQqKXMpKys7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgeG9yX2Jsb2NrKHZvaWQqIGQsIGNvbnN0IHZvaWQqIHMpIHsKLSNpZiBkZWZpbmVkKEhBVkVfVUlOVF8zMlQpCi0gICgodWludF8zMnQqKWQpWzBdIF49ICgodWludF8zMnQqKXMpWzBdOwotICAoKHVpbnRfMzJ0KilkKVsxXSBePSAoKHVpbnRfMzJ0KilzKVsxXTsKLSAgKCh1aW50XzMydCopZClbMl0gXj0gKCh1aW50XzMydCopcylbMl07Ci0gICgodWludF8zMnQqKWQpWzNdIF49ICgodWludF8zMnQqKXMpWzNdOwotI2Vsc2UKLSAgKCh1aW50Xzh0KilkKVswXSBePSAoKHVpbnRfOHQqKXMpWzBdOwotICAoKHVpbnRfOHQqKWQpWzFdIF49ICgodWludF84dCopcylbMV07Ci0gICgodWludF84dCopZClbMl0gXj0gKCh1aW50Xzh0KilzKVsyXTsKLSAgKCh1aW50Xzh0KilkKVszXSBePSAoKHVpbnRfOHQqKXMpWzNdOwotICAoKHVpbnRfOHQqKWQpWzRdIF49ICgodWludF84dCopcylbNF07Ci0gICgodWludF84dCopZClbNV0gXj0gKCh1aW50Xzh0KilzKVs1XTsKLSAgKCh1aW50Xzh0KilkKVs2XSBePSAoKHVpbnRfOHQqKXMpWzZdOwotICAoKHVpbnRfOHQqKWQpWzddIF49ICgodWludF84dCopcylbN107Ci0gICgodWludF84dCopZClbOF0gXj0gKCh1aW50Xzh0KilzKVs4XTsKLSAgKCh1aW50Xzh0KilkKVs5XSBePSAoKHVpbnRfOHQqKXMpWzldOwotICAoKHVpbnRfOHQqKWQpWzEwXSBePSAoKHVpbnRfOHQqKXMpWzEwXTsKLSAgKCh1aW50Xzh0KilkKVsxMV0gXj0gKCh1aW50Xzh0KilzKVsxMV07Ci0gICgodWludF84dCopZClbMTJdIF49ICgodWludF84dCopcylbMTJdOwotICAoKHVpbnRfOHQqKWQpWzEzXSBePSAoKHVpbnRfOHQqKXMpWzEzXTsKLSAgKCh1aW50Xzh0KilkKVsxNF0gXj0gKCh1aW50Xzh0KilzKVsxNF07Ci0gICgodWludF84dCopZClbMTVdIF49ICgodWludF84dCopcylbMTVdOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfYW5kX2tleSh2b2lkKiBkLCBjb25zdCB2b2lkKiBzLCBjb25zdCB2b2lkKiBrKSB7Ci0jaWYgZGVmaW5lZChIQVZFX1VJTlRfMzJUKQotICAoKHVpbnRfMzJ0KilkKVswXSA9ICgodWludF8zMnQqKXMpWzBdIF4gKCh1aW50XzMydCopaylbMF07Ci0gICgodWludF8zMnQqKWQpWzFdID0gKCh1aW50XzMydCopcylbMV0gXiAoKHVpbnRfMzJ0KilrKVsxXTsKLSAgKCh1aW50XzMydCopZClbMl0gPSAoKHVpbnRfMzJ0KilzKVsyXSBeICgodWludF8zMnQqKWspWzJdOwotICAoKHVpbnRfMzJ0KilkKVszXSA9ICgodWludF8zMnQqKXMpWzNdIF4gKCh1aW50XzMydCopaylbM107Ci0jZWxpZiAxCi0gICgodWludF84dCopZClbMF0gPSAoKHVpbnRfOHQqKXMpWzBdIF4gKCh1aW50Xzh0KilrKVswXTsKLSAgKCh1aW50Xzh0KilkKVsxXSA9ICgodWludF84dCopcylbMV0gXiAoKHVpbnRfOHQqKWspWzFdOwotICAoKHVpbnRfOHQqKWQpWzJdID0gKCh1aW50Xzh0KilzKVsyXSBeICgodWludF84dCopaylbMl07Ci0gICgodWludF84dCopZClbM10gPSAoKHVpbnRfOHQqKXMpWzNdIF4gKCh1aW50Xzh0KilrKVszXTsKLSAgKCh1aW50Xzh0KilkKVs0XSA9ICgodWludF84dCopcylbNF0gXiAoKHVpbnRfOHQqKWspWzRdOwotICAoKHVpbnRfOHQqKWQpWzVdID0gKCh1aW50Xzh0KilzKVs1XSBeICgodWludF84dCopaylbNV07Ci0gICgodWludF84dCopZClbNl0gPSAoKHVpbnRfOHQqKXMpWzZdIF4gKCh1aW50Xzh0KilrKVs2XTsKLSAgKCh1aW50Xzh0KilkKVs3XSA9ICgodWludF84dCopcylbN10gXiAoKHVpbnRfOHQqKWspWzddOwotICAoKHVpbnRfOHQqKWQpWzhdID0gKCh1aW50Xzh0KilzKVs4XSBeICgodWludF84dCopaylbOF07Ci0gICgodWludF84dCopZClbOV0gPSAoKHVpbnRfOHQqKXMpWzldIF4gKCh1aW50Xzh0KilrKVs5XTsKLSAgKCh1aW50Xzh0KilkKVsxMF0gPSAoKHVpbnRfOHQqKXMpWzEwXSBeICgodWludF84dCopaylbMTBdOwotICAoKHVpbnRfOHQqKWQpWzExXSA9ICgodWludF84dCopcylbMTFdIF4gKCh1aW50Xzh0KilrKVsxMV07Ci0gICgodWludF84dCopZClbMTJdID0gKCh1aW50Xzh0KilzKVsxMl0gXiAoKHVpbnRfOHQqKWspWzEyXTsKLSAgKCh1aW50Xzh0KilkKVsxM10gPSAoKHVpbnRfOHQqKXMpWzEzXSBeICgodWludF84dCopaylbMTNdOwotICAoKHVpbnRfOHQqKWQpWzE0XSA9ICgodWludF84dCopcylbMTRdIF4gKCh1aW50Xzh0KilrKVsxNF07Ci0gICgodWludF84dCopZClbMTVdID0gKCh1aW50Xzh0KilzKVsxNV0gXiAoKHVpbnRfOHQqKWspWzE1XTsKLSNlbHNlCi0gIGJsb2NrX2NvcHkoZCwgcyk7Ci0gIHhvcl9ibG9jayhkLCBrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBhZGRfcm91bmRfa2V5KHVpbnRfOHQgZFtOX0JMT0NLXSwgY29uc3QgdWludF84dCBrW05fQkxPQ0tdKSB7Ci0gIHhvcl9ibG9jayhkLCBrKTsKLX0KLQotc3RhdGljIHZvaWQgc2hpZnRfc3ViX3Jvd3ModWludF84dCBzdFtOX0JMT0NLXSkgewotICB1aW50Xzh0IHR0OwotCi0gIHN0WzBdID0gc19ib3goc3RbMF0pOwotICBzdFs0XSA9IHNfYm94KHN0WzRdKTsKLSAgc3RbOF0gPSBzX2JveChzdFs4XSk7Ci0gIHN0WzEyXSA9IHNfYm94KHN0WzEyXSk7Ci0KLSAgdHQgPSBzdFsxXTsKLSAgc3RbMV0gPSBzX2JveChzdFs1XSk7Ci0gIHN0WzVdID0gc19ib3goc3RbOV0pOwotICBzdFs5XSA9IHNfYm94KHN0WzEzXSk7Ci0gIHN0WzEzXSA9IHNfYm94KHR0KTsKLQotICB0dCA9IHN0WzJdOwotICBzdFsyXSA9IHNfYm94KHN0WzEwXSk7Ci0gIHN0WzEwXSA9IHNfYm94KHR0KTsKLSAgdHQgPSBzdFs2XTsKLSAgc3RbNl0gPSBzX2JveChzdFsxNF0pOwotICBzdFsxNF0gPSBzX2JveCh0dCk7Ci0KLSAgdHQgPSBzdFsxNV07Ci0gIHN0WzE1XSA9IHNfYm94KHN0WzExXSk7Ci0gIHN0WzExXSA9IHNfYm94KHN0WzddKTsKLSAgc3RbN10gPSBzX2JveChzdFszXSk7Ci0gIHN0WzNdID0gc19ib3godHQpOwotfQotCi1zdGF0aWMgdm9pZCBpbnZfc2hpZnRfc3ViX3Jvd3ModWludF84dCBzdFtOX0JMT0NLXSkgewotICB1aW50Xzh0IHR0OwotCi0gIHN0WzBdID0gaXNfYm94KHN0WzBdKTsKLSAgc3RbNF0gPSBpc19ib3goc3RbNF0pOwotICBzdFs4XSA9IGlzX2JveChzdFs4XSk7Ci0gIHN0WzEyXSA9IGlzX2JveChzdFsxMl0pOwotCi0gIHR0ID0gc3RbMTNdOwotICBzdFsxM10gPSBpc19ib3goc3RbOV0pOwotICBzdFs5XSA9IGlzX2JveChzdFs1XSk7Ci0gIHN0WzVdID0gaXNfYm94KHN0WzFdKTsKLSAgc3RbMV0gPSBpc19ib3godHQpOwotCi0gIHR0ID0gc3RbMl07Ci0gIHN0WzJdID0gaXNfYm94KHN0WzEwXSk7Ci0gIHN0WzEwXSA9IGlzX2JveCh0dCk7Ci0gIHR0ID0gc3RbNl07Ci0gIHN0WzZdID0gaXNfYm94KHN0WzE0XSk7Ci0gIHN0WzE0XSA9IGlzX2JveCh0dCk7Ci0KLSAgdHQgPSBzdFszXTsKLSAgc3RbM10gPSBpc19ib3goc3RbN10pOwotICBzdFs3XSA9IGlzX2JveChzdFsxMV0pOwotICBzdFsxMV0gPSBpc19ib3goc3RbMTVdKTsKLSAgc3RbMTVdID0gaXNfYm94KHR0KTsKLX0KLQotI2lmIGRlZmluZWQoVkVSU0lPTl8xKQotc3RhdGljIHZvaWQgbWl4X3N1Yl9jb2x1bW5zKHVpbnRfOHQgZHRbTl9CTE9DS10pIHsKLSAgdWludF84dCBzdFtOX0JMT0NLXTsKLSAgYmxvY2tfY29weShzdCwgZHQpOwotI2Vsc2UKLXN0YXRpYyB2b2lkIG1peF9zdWJfY29sdW1ucyh1aW50Xzh0IGR0W05fQkxPQ0tdLCB1aW50Xzh0IHN0W05fQkxPQ0tdKSB7Ci0jZW5kaWYKLSAgZHRbMF0gPSBnZm0yX3NiKHN0WzBdKSBeIGdmbTNfc2Ioc3RbNV0pIF4gc19ib3goc3RbMTBdKSBeIHNfYm94KHN0WzE1XSk7Ci0gIGR0WzFdID0gc19ib3goc3RbMF0pIF4gZ2ZtMl9zYihzdFs1XSkgXiBnZm0zX3NiKHN0WzEwXSkgXiBzX2JveChzdFsxNV0pOwotICBkdFsyXSA9IHNfYm94KHN0WzBdKSBeIHNfYm94KHN0WzVdKSBeIGdmbTJfc2Ioc3RbMTBdKSBeIGdmbTNfc2Ioc3RbMTVdKTsKLSAgZHRbM10gPSBnZm0zX3NiKHN0WzBdKSBeIHNfYm94KHN0WzVdKSBeIHNfYm94KHN0WzEwXSkgXiBnZm0yX3NiKHN0WzE1XSk7Ci0KLSAgZHRbNF0gPSBnZm0yX3NiKHN0WzRdKSBeIGdmbTNfc2Ioc3RbOV0pIF4gc19ib3goc3RbMTRdKSBeIHNfYm94KHN0WzNdKTsKLSAgZHRbNV0gPSBzX2JveChzdFs0XSkgXiBnZm0yX3NiKHN0WzldKSBeIGdmbTNfc2Ioc3RbMTRdKSBeIHNfYm94KHN0WzNdKTsKLSAgZHRbNl0gPSBzX2JveChzdFs0XSkgXiBzX2JveChzdFs5XSkgXiBnZm0yX3NiKHN0WzE0XSkgXiBnZm0zX3NiKHN0WzNdKTsKLSAgZHRbN10gPSBnZm0zX3NiKHN0WzRdKSBeIHNfYm94KHN0WzldKSBeIHNfYm94KHN0WzE0XSkgXiBnZm0yX3NiKHN0WzNdKTsKLQotICBkdFs4XSA9IGdmbTJfc2Ioc3RbOF0pIF4gZ2ZtM19zYihzdFsxM10pIF4gc19ib3goc3RbMl0pIF4gc19ib3goc3RbN10pOwotICBkdFs5XSA9IHNfYm94KHN0WzhdKSBeIGdmbTJfc2Ioc3RbMTNdKSBeIGdmbTNfc2Ioc3RbMl0pIF4gc19ib3goc3RbN10pOwotICBkdFsxMF0gPSBzX2JveChzdFs4XSkgXiBzX2JveChzdFsxM10pIF4gZ2ZtMl9zYihzdFsyXSkgXiBnZm0zX3NiKHN0WzddKTsKLSAgZHRbMTFdID0gZ2ZtM19zYihzdFs4XSkgXiBzX2JveChzdFsxM10pIF4gc19ib3goc3RbMl0pIF4gZ2ZtMl9zYihzdFs3XSk7Ci0KLSAgZHRbMTJdID0gZ2ZtMl9zYihzdFsxMl0pIF4gZ2ZtM19zYihzdFsxXSkgXiBzX2JveChzdFs2XSkgXiBzX2JveChzdFsxMV0pOwotICBkdFsxM10gPSBzX2JveChzdFsxMl0pIF4gZ2ZtMl9zYihzdFsxXSkgXiBnZm0zX3NiKHN0WzZdKSBeIHNfYm94KHN0WzExXSk7Ci0gIGR0WzE0XSA9IHNfYm94KHN0WzEyXSkgXiBzX2JveChzdFsxXSkgXiBnZm0yX3NiKHN0WzZdKSBeIGdmbTNfc2Ioc3RbMTFdKTsKLSAgZHRbMTVdID0gZ2ZtM19zYihzdFsxMl0pIF4gc19ib3goc3RbMV0pIF4gc19ib3goc3RbNl0pIF4gZ2ZtMl9zYihzdFsxMV0pOwotfQotCi0jaWYgZGVmaW5lZChWRVJTSU9OXzEpCi1zdGF0aWMgdm9pZCBpbnZfbWl4X3N1Yl9jb2x1bW5zKHVpbnRfOHQgZHRbTl9CTE9DS10pIHsKLSAgdWludF84dCBzdFtOX0JMT0NLXTsKLSAgYmxvY2tfY29weShzdCwgZHQpOwotI2Vsc2UKLXN0YXRpYyB2b2lkIGludl9taXhfc3ViX2NvbHVtbnModWludF84dCBkdFtOX0JMT0NLXSwgdWludF84dCBzdFtOX0JMT0NLXSkgewotI2VuZGlmCi0gIGR0WzBdID0gaXNfYm94KGdmbV9lKHN0WzBdKSBeIGdmbV9iKHN0WzFdKSBeIGdmbV9kKHN0WzJdKSBeIGdmbV85KHN0WzNdKSk7Ci0gIGR0WzVdID0gaXNfYm94KGdmbV85KHN0WzBdKSBeIGdmbV9lKHN0WzFdKSBeIGdmbV9iKHN0WzJdKSBeIGdmbV9kKHN0WzNdKSk7Ci0gIGR0WzEwXSA9IGlzX2JveChnZm1fZChzdFswXSkgXiBnZm1fOShzdFsxXSkgXiBnZm1fZShzdFsyXSkgXiBnZm1fYihzdFszXSkpOwotICBkdFsxNV0gPSBpc19ib3goZ2ZtX2Ioc3RbMF0pIF4gZ2ZtX2Qoc3RbMV0pIF4gZ2ZtXzkoc3RbMl0pIF4gZ2ZtX2Uoc3RbM10pKTsKLQotICBkdFs0XSA9IGlzX2JveChnZm1fZShzdFs0XSkgXiBnZm1fYihzdFs1XSkgXiBnZm1fZChzdFs2XSkgXiBnZm1fOShzdFs3XSkpOwotICBkdFs5XSA9IGlzX2JveChnZm1fOShzdFs0XSkgXiBnZm1fZShzdFs1XSkgXiBnZm1fYihzdFs2XSkgXiBnZm1fZChzdFs3XSkpOwotICBkdFsxNF0gPSBpc19ib3goZ2ZtX2Qoc3RbNF0pIF4gZ2ZtXzkoc3RbNV0pIF4gZ2ZtX2Uoc3RbNl0pIF4gZ2ZtX2Ioc3RbN10pKTsKLSAgZHRbM10gPSBpc19ib3goZ2ZtX2Ioc3RbNF0pIF4gZ2ZtX2Qoc3RbNV0pIF4gZ2ZtXzkoc3RbNl0pIF4gZ2ZtX2Uoc3RbN10pKTsKLQotICBkdFs4XSA9IGlzX2JveChnZm1fZShzdFs4XSkgXiBnZm1fYihzdFs5XSkgXiBnZm1fZChzdFsxMF0pIF4gZ2ZtXzkoc3RbMTFdKSk7Ci0gIGR0WzEzXSA9IGlzX2JveChnZm1fOShzdFs4XSkgXiBnZm1fZShzdFs5XSkgXiBnZm1fYihzdFsxMF0pIF4gZ2ZtX2Qoc3RbMTFdKSk7Ci0gIGR0WzJdID0gaXNfYm94KGdmbV9kKHN0WzhdKSBeIGdmbV85KHN0WzldKSBeIGdmbV9lKHN0WzEwXSkgXiBnZm1fYihzdFsxMV0pKTsKLSAgZHRbN10gPSBpc19ib3goZ2ZtX2Ioc3RbOF0pIF4gZ2ZtX2Qoc3RbOV0pIF4gZ2ZtXzkoc3RbMTBdKSBeIGdmbV9lKHN0WzExXSkpOwotCi0gIGR0WzEyXSA9IGlzX2JveChnZm1fZShzdFsxMl0pIF4gZ2ZtX2Ioc3RbMTNdKSBeIGdmbV9kKHN0WzE0XSkgXiBnZm1fOShzdFsxNV0pKTsKLSAgZHRbMV0gPSBpc19ib3goZ2ZtXzkoc3RbMTJdKSBeIGdmbV9lKHN0WzEzXSkgXiBnZm1fYihzdFsxNF0pIF4gZ2ZtX2Qoc3RbMTVdKSk7Ci0gIGR0WzZdID0gaXNfYm94KGdmbV9kKHN0WzEyXSkgXiBnZm1fOShzdFsxM10pIF4gZ2ZtX2Uoc3RbMTRdKSBeIGdmbV9iKHN0WzE1XSkpOwotICBkdFsxMV0gPSBpc19ib3goZ2ZtX2Ioc3RbMTJdKSBeIGdmbV9kKHN0WzEzXSkgXiBnZm1fOShzdFsxNF0pIF4gZ2ZtX2Uoc3RbMTVdKSk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFFU19FTkNfUFJFS0VZRUQpIHx8IGRlZmluZWQoQUVTX0RFQ19QUkVLRVlFRCkKLQotLyogIFNldCB0aGUgY2lwaGVyIGtleSBmb3IgdGhlIHByZS1rZXllZCB2ZXJzaW9uICovCi0vKiAgTk9URTogSWYgdGhlIGxlbmd0aF90eXBlIHVzZWQgZm9yIHRoZSBrZXkgbGVuZ3RoIGlzIGFuCi0gICAgdW5zaWduZWQgOC1iaXQgY2hhcmFjdGVyLCBhIGtleSBsZW5ndGggb2YgMjU2IGJpdHMgbXVzdAotICAgIGJlIGVudGVyZWQgYXMgYSBsZW5ndGggaW4gYnl0ZXMgKHZhbGlkIGlucHV0cyBhcmUgaGVuY2UKLSAgICAxMjgsIDE5MiwgMTYsIDI0IGFuZCAzMikuCi0qLwotCi1yZXR1cm5fdHlwZSBhZXNfc2V0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyIGtleVtdLCBsZW5ndGhfdHlwZSBrZXlsZW4sIGFlc19jb250ZXh0IGN0eFsxXSkgewotICB1aW50Xzh0IGNjLCByYywgaGk7Ci0KLSAgc3dpdGNoIChrZXlsZW4pIHsKLSAgICBjYXNlIDE2OgotICAgIGNhc2UgMTI4OiAvKiBsZW5ndGggaW4gYml0cyAoMTI4ID0gOCoxNikgKi8KLSAgICAgIGtleWxlbiA9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICBjYXNlIDE5MjogLyogbGVuZ3RoIGluIGJpdHMgKDE5MiA9IDgqMjQpICovCi0gICAgICBrZXlsZW4gPSAyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICAvKiAgICBjYXNlIDI1NjogICAgICAgICAgIGxlbmd0aCBpbiBiaXRzICgyNTYgPSA4KjMyKSAqLwotICAgICAga2V5bGVuID0gMzI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgY3R4LT5ybmQgPSAwOwotICAgICAgcmV0dXJuIChyZXR1cm5fdHlwZSktMTsKLSAgfQotICBibG9ja19jb3B5X25uKGN0eC0+a3NjaCwga2V5LCBrZXlsZW4pOwotICBoaSA9IChrZXlsZW4gKyAyOCkgPDwgMjsKLSAgY3R4LT5ybmQgPSAoaGkgPj4gNCkgLSAxOwotICBmb3IgKGNjID0ga2V5bGVuLCByYyA9IDE7IGNjIDwgaGk7IGNjICs9IDQpIHsKLSAgICB1aW50Xzh0IHR0LCB0MCwgdDEsIHQyLCB0MzsKLQotICAgIHQwID0gY3R4LT5rc2NoW2NjIC0gNF07Ci0gICAgdDEgPSBjdHgtPmtzY2hbY2MgLSAzXTsKLSAgICB0MiA9IGN0eC0+a3NjaFtjYyAtIDJdOwotICAgIHQzID0gY3R4LT5rc2NoW2NjIC0gMV07Ci0gICAgaWYgKGNjICUga2V5bGVuID09IDApIHsKLSAgICAgIHR0ID0gdDA7Ci0gICAgICB0MCA9IHNfYm94KHQxKSBeIHJjOwotICAgICAgdDEgPSBzX2JveCh0Mik7Ci0gICAgICB0MiA9IHNfYm94KHQzKTsKLSAgICAgIHQzID0gc19ib3godHQpOwotICAgICAgcmMgPSBmMihyYyk7Ci0gICAgfSBlbHNlIGlmIChrZXlsZW4gPiAyNCAmJiBjYyAlIGtleWxlbiA9PSAxNikgewotICAgICAgdDAgPSBzX2JveCh0MCk7Ci0gICAgICB0MSA9IHNfYm94KHQxKTsKLSAgICAgIHQyID0gc19ib3godDIpOwotICAgICAgdDMgPSBzX2JveCh0Myk7Ci0gICAgfQotICAgIHR0ID0gY2MgLSBrZXlsZW47Ci0gICAgY3R4LT5rc2NoW2NjICsgMF0gPSBjdHgtPmtzY2hbdHQgKyAwXSBeIHQwOwotICAgIGN0eC0+a3NjaFtjYyArIDFdID0gY3R4LT5rc2NoW3R0ICsgMV0gXiB0MTsKLSAgICBjdHgtPmtzY2hbY2MgKyAyXSA9IGN0eC0+a3NjaFt0dCArIDJdIF4gdDI7Ci0gICAgY3R4LT5rc2NoW2NjICsgM10gPSBjdHgtPmtzY2hbdHQgKyAzXSBeIHQzOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0VOQ19QUkVLRVlFRCkKLQotLyogIEVuY3J5cHQgYSBzaW5nbGUgYmxvY2sgb2YgMTYgYnl0ZXMgKi8KLQotcmV0dXJuX3R5cGUgYWVzX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sIGNvbnN0IGFlc19jb250ZXh0IGN0eFsxXSkgewotICBpZiAoY3R4LT5ybmQpIHsKLSAgICB1aW50Xzh0IHMxW05fQkxPQ0tdLCByOwotICAgIGNvcHlfYW5kX2tleShzMSwgaW4sIGN0eC0+a3NjaCk7Ci0KLSAgICBmb3IgKHIgPSAxOyByIDwgY3R4LT5ybmQ7ICsrcikKLSNpZiBkZWZpbmVkKFZFUlNJT05fMSkKLSAgICB7Ci0gICAgICBtaXhfc3ViX2NvbHVtbnMoczEpOwotICAgICAgYWRkX3JvdW5kX2tleShzMSwgY3R4LT5rc2NoICsgciAqIE5fQkxPQ0spOwotICAgIH0KLSNlbHNlCi0gICAgewotICAgICAgdWludF84dCBzMltOX0JMT0NLXTsKLSAgICAgIG1peF9zdWJfY29sdW1ucyhzMiwgczEpOwotICAgICAgY29weV9hbmRfa2V5KHMxLCBzMiwgY3R4LT5rc2NoICsgciAqIE5fQkxPQ0spOwotICAgIH0KLSNlbmRpZgotICAgIHNoaWZ0X3N1Yl9yb3dzKHMxKTsKLSAgICBjb3B5X2FuZF9rZXkob3V0LCBzMSwgY3R4LT5rc2NoICsgciAqIE5fQkxPQ0spOwotICB9IGVsc2UKLSAgICByZXR1cm4gKHJldHVybl90eXBlKS0xOwotICByZXR1cm4gMDsKLX0KLQotLyogQ0JDIGVuY3J5cHQgYSBudW1iZXIgb2YgYmxvY2tzIChpbnB1dCBhbmQgcmV0dXJuIGFuIElWKSAqLwotCi1yZXR1cm5fdHlwZSBhZXNfY2JjX2VuY3J5cHQoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHVuc2lnbmVkIGNoYXIqIG91dCwgaW50IG5fYmxvY2ssIHVuc2lnbmVkIGNoYXIgaXZbTl9CTE9DS10sIGNvbnN0IGFlc19jb250ZXh0IGN0eFsxXSkgewotICB3aGlsZSAobl9ibG9jay0tKSB7Ci0gICAgeG9yX2Jsb2NrKGl2LCBpbik7Ci0gICAgaWYgKGFlc19lbmNyeXB0KGl2LCBpdiwgY3R4KSAhPSBFWElUX1NVQ0NFU1MpIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgbWVtY3B5KG91dCwgaXYsIE5fQkxPQ0spOwotICAgIGluICs9IE5fQkxPQ0s7Ci0gICAgb3V0ICs9IE5fQkxPQ0s7Ci0gIH0KLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFFU19ERUNfUFJFS0VZRUQpCi0KLS8qICBEZWNyeXB0IGEgc2luZ2xlIGJsb2NrIG9mIDE2IGJ5dGVzICovCi0KLXJldHVybl90eXBlIGFlc19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLCBjb25zdCBhZXNfY29udGV4dCBjdHhbMV0pIHsKLSAgaWYgKGN0eC0+cm5kKSB7Ci0gICAgdWludF84dCBzMVtOX0JMT0NLXSwgcjsKLSAgICBjb3B5X2FuZF9rZXkoczEsIGluLCBjdHgtPmtzY2ggKyBjdHgtPnJuZCAqIE5fQkxPQ0spOwotICAgIGludl9zaGlmdF9zdWJfcm93cyhzMSk7Ci0KLSAgICBmb3IgKHIgPSBjdHgtPnJuZDsgLS1yOykKLSNpZiBkZWZpbmVkKFZFUlNJT05fMSkKLSAgICB7Ci0gICAgICBhZGRfcm91bmRfa2V5KHMxLCBjdHgtPmtzY2ggKyByICogTl9CTE9DSyk7Ci0gICAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxKTsKLSAgICB9Ci0jZWxzZQotICAgIHsKLSAgICAgIHVpbnRfOHQgczJbTl9CTE9DS107Ci0gICAgICBjb3B5X2FuZF9rZXkoczIsIHMxLCBjdHgtPmtzY2ggKyByICogTl9CTE9DSyk7Ci0gICAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxLCBzMik7Ci0gICAgfQotI2VuZGlmCi0gICAgY29weV9hbmRfa2V5KG91dCwgczEsIGN0eC0+a3NjaCk7Ci0gIH0gZWxzZQotICAgIHJldHVybiAocmV0dXJuX3R5cGUpLTE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBDQkMgZGVjcnlwdCBhIG51bWJlciBvZiBibG9ja3MgKGlucHV0IGFuZCByZXR1cm4gYW4gSVYpICovCi0KLXJldHVybl90eXBlIGFlc19jYmNfZGVjcnlwdCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgY2hhciogb3V0LCBpbnQgbl9ibG9jaywgdW5zaWduZWQgY2hhciBpdltOX0JMT0NLXSwgY29uc3QgYWVzX2NvbnRleHQgY3R4WzFdKSB7Ci0gIHdoaWxlIChuX2Jsb2NrLS0pIHsKLSAgICB1aW50Xzh0IHRtcFtOX0JMT0NLXTsKLQotICAgIG1lbWNweSh0bXAsIGluLCBOX0JMT0NLKTsKLSAgICBpZiAoYWVzX2RlY3J5cHQoaW4sIG91dCwgY3R4KSAhPSBFWElUX1NVQ0NFU1MpIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgeG9yX2Jsb2NrKG91dCwgaXYpOwotICAgIG1lbWNweShpdiwgdG1wLCBOX0JMT0NLKTsKLSAgICBpbiArPSBOX0JMT0NLOwotICAgIG91dCArPSBOX0JMT0NLOwotICB9Ci0gIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfRU5DXzEyOF9PVEZLKQotCi0vKiAgVGhlICdvbiB0aGUgZmx5JyBlbmNyeXB0aW9uIGtleSB1cGRhdGUgZm9yIGZvciAxMjggYml0IGtleXMgKi8KLQotc3RhdGljIHZvaWQgdXBkYXRlX2VuY3J5cHRfa2V5XzEyOCh1aW50Xzh0IGtbTl9CTE9DS10sIHVpbnRfOHQqIHJjKSB7Ci0gIHVpbnRfOHQgY2M7Ci0KLSAga1swXSBePSBzX2JveChrWzEzXSkgXiAqcmM7Ci0gIGtbMV0gXj0gc19ib3goa1sxNF0pOwotICBrWzJdIF49IHNfYm94KGtbMTVdKTsKLSAga1szXSBePSBzX2JveChrWzEyXSk7Ci0gICpyYyA9IGYyKCpyYyk7Ci0KLSAgZm9yIChjYyA9IDQ7IGNjIDwgMTY7IGNjICs9IDQpIHsKLSAgICBrW2NjICsgMF0gXj0ga1tjYyAtIDRdOwotICAgIGtbY2MgKyAxXSBePSBrW2NjIC0gM107Ci0gICAga1tjYyArIDJdIF49IGtbY2MgLSAyXTsKLSAgICBrW2NjICsgM10gXj0ga1tjYyAtIDFdOwotICB9Ci19Ci0KLS8qICBFbmNyeXB0IGEgc2luZ2xlIGJsb2NrIG9mIDE2IGJ5dGVzIHdpdGggJ29uIHRoZSBmbHknIDEyOCBiaXQga2V5aW5nICovCi0KLXZvaWQgYWVzX2VuY3J5cHRfMTI4KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvX2tleVtOX0JMT0NLXSkgewotICB1aW50Xzh0IHMxW05fQkxPQ0tdLCByLCByYyA9IDE7Ci0KLSAgaWYgKG9fa2V5ICE9IGtleSkgYmxvY2tfY29weShvX2tleSwga2V5KTsKLSAgY29weV9hbmRfa2V5KHMxLCBpbiwgb19rZXkpOwotCi0gIGZvciAociA9IDE7IHIgPCAxMDsgKytyKQotI2lmIGRlZmluZWQoVkVSU0lPTl8xKQotICB7Ci0gICAgbWl4X3N1Yl9jb2x1bW5zKHMxKTsKLSAgICB1cGRhdGVfZW5jcnlwdF9rZXlfMTI4KG9fa2V5LCAmcmMpOwotICAgIGFkZF9yb3VuZF9rZXkoczEsIG9fa2V5KTsKLSAgfQotI2Vsc2UKLSAgewotICAgIHVpbnRfOHQgczJbTl9CTE9DS107Ci0gICAgbWl4X3N1Yl9jb2x1bW5zKHMyLCBzMSk7Ci0gICAgdXBkYXRlX2VuY3J5cHRfa2V5XzEyOChvX2tleSwgJnJjKTsKLSAgICBjb3B5X2FuZF9rZXkoczEsIHMyLCBvX2tleSk7Ci0gIH0KLSNlbmRpZgotCi0gIHNoaWZ0X3N1Yl9yb3dzKHMxKTsKLSAgdXBkYXRlX2VuY3J5cHRfa2V5XzEyOChvX2tleSwgJnJjKTsKLSAgY29weV9hbmRfa2V5KG91dCwgczEsIG9fa2V5KTsKLX0KLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFFU19ERUNfMTI4X09URkspCi0KLS8qICBUaGUgJ29uIHRoZSBmbHknIGRlY3J5cHRpb24ga2V5IHVwZGF0ZSBmb3IgZm9yIDEyOCBiaXQga2V5cyAqLwotCi1zdGF0aWMgdm9pZCB1cGRhdGVfZGVjcnlwdF9rZXlfMTI4KHVpbnRfOHQga1tOX0JMT0NLXSwgdWludF84dCogcmMpIHsKLSAgdWludF84dCBjYzsKLQotICBmb3IgKGNjID0gMTI7IGNjID4gMDsgY2MgLT0gNCkgewotICAgIGtbY2MgKyAwXSBePSBrW2NjIC0gNF07Ci0gICAga1tjYyArIDFdIF49IGtbY2MgLSAzXTsKLSAgICBrW2NjICsgMl0gXj0ga1tjYyAtIDJdOwotICAgIGtbY2MgKyAzXSBePSBrW2NjIC0gMV07Ci0gIH0KLSAgKnJjID0gZDIoKnJjKTsKLSAga1swXSBePSBzX2JveChrWzEzXSkgXiAqcmM7Ci0gIGtbMV0gXj0gc19ib3goa1sxNF0pOwotICBrWzJdIF49IHNfYm94KGtbMTVdKTsKLSAga1szXSBePSBzX2JveChrWzEyXSk7Ci19Ci0KLS8qICBEZWNyeXB0IGEgc2luZ2xlIGJsb2NrIG9mIDE2IGJ5dGVzIHdpdGggJ29uIHRoZSBmbHknIDEyOCBiaXQga2V5aW5nICovCi0KLXZvaWQgYWVzX2RlY3J5cHRfMTI4KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvX2tleVtOX0JMT0NLXSkgewotICB1aW50Xzh0IHMxW05fQkxPQ0tdLCByLCByYyA9IDB4NmM7Ci0gIGlmIChvX2tleSAhPSBrZXkpIGJsb2NrX2NvcHkob19rZXksIGtleSk7Ci0KLSAgY29weV9hbmRfa2V5KHMxLCBpbiwgb19rZXkpOwotICBpbnZfc2hpZnRfc3ViX3Jvd3MoczEpOwotCi0gIGZvciAociA9IDEwOyAtLXI7KQotI2lmIGRlZmluZWQoVkVSU0lPTl8xKQotICB7Ci0gICAgdXBkYXRlX2RlY3J5cHRfa2V5XzEyOChvX2tleSwgJnJjKTsKLSAgICBhZGRfcm91bmRfa2V5KHMxLCBvX2tleSk7Ci0gICAgaW52X21peF9zdWJfY29sdW1ucyhzMSk7Ci0gIH0KLSNlbHNlCi0gIHsKLSAgICB1aW50Xzh0IHMyW05fQkxPQ0tdOwotICAgIHVwZGF0ZV9kZWNyeXB0X2tleV8xMjgob19rZXksICZyYyk7Ci0gICAgY29weV9hbmRfa2V5KHMyLCBzMSwgb19rZXkpOwotICAgIGludl9taXhfc3ViX2NvbHVtbnMoczEsIHMyKTsKLSAgfQotI2VuZGlmCi0gIHVwZGF0ZV9kZWNyeXB0X2tleV8xMjgob19rZXksICZyYyk7Ci0gIGNvcHlfYW5kX2tleShvdXQsIHMxLCBvX2tleSk7Ci19Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfRU5DXzI1Nl9PVEZLKQotCi0vKiAgVGhlICdvbiB0aGUgZmx5JyBlbmNyeXB0aW9uIGtleSB1cGRhdGUgZm9yIGZvciAyNTYgYml0IGtleXMgKi8KLQotc3RhdGljIHZvaWQgdXBkYXRlX2VuY3J5cHRfa2V5XzI1Nih1aW50Xzh0IGtbMiAqIE5fQkxPQ0tdLCB1aW50Xzh0KiByYykgewotICB1aW50Xzh0IGNjOwotCi0gIGtbMF0gXj0gc19ib3goa1syOV0pIF4gKnJjOwotICBrWzFdIF49IHNfYm94KGtbMzBdKTsKLSAga1syXSBePSBzX2JveChrWzMxXSk7Ci0gIGtbM10gXj0gc19ib3goa1syOF0pOwotICAqcmMgPSBmMigqcmMpOwotCi0gIGZvciAoY2MgPSA0OyBjYyA8IDE2OyBjYyArPSA0KSB7Ci0gICAga1tjYyArIDBdIF49IGtbY2MgLSA0XTsKLSAgICBrW2NjICsgMV0gXj0ga1tjYyAtIDNdOwotICAgIGtbY2MgKyAyXSBePSBrW2NjIC0gMl07Ci0gICAga1tjYyArIDNdIF49IGtbY2MgLSAxXTsKLSAgfQotCi0gIGtbMTZdIF49IHNfYm94KGtbMTJdKTsKLSAga1sxN10gXj0gc19ib3goa1sxM10pOwotICBrWzE4XSBePSBzX2JveChrWzE0XSk7Ci0gIGtbMTldIF49IHNfYm94KGtbMTVdKTsKLQotICBmb3IgKGNjID0gMjA7IGNjIDwgMzI7IGNjICs9IDQpIHsKLSAgICBrW2NjICsgMF0gXj0ga1tjYyAtIDRdOwotICAgIGtbY2MgKyAxXSBePSBrW2NjIC0gM107Ci0gICAga1tjYyArIDJdIF49IGtbY2MgLSAyXTsKLSAgICBrW2NjICsgM10gXj0ga1tjYyAtIDFdOwotICB9Ci19Ci0KLS8qICBFbmNyeXB0IGEgc2luZ2xlIGJsb2NrIG9mIDE2IGJ5dGVzIHdpdGggJ29uIHRoZSBmbHknIDI1NiBiaXQga2V5aW5nICovCi0KLXZvaWQgYWVzX2VuY3J5cHRfMjU2KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbMiAqIE5fQkxPQ0tdLAotICAgIHVuc2lnbmVkIGNoYXIgb19rZXlbMiAqIE5fQkxPQ0tdKSB7Ci0gIHVpbnRfOHQgczFbTl9CTE9DS10sIHIsIHJjID0gMTsKLSAgaWYgKG9fa2V5ICE9IGtleSkgewotICAgIGJsb2NrX2NvcHkob19rZXksIGtleSk7Ci0gICAgYmxvY2tfY29weShvX2tleSArIDE2LCBrZXkgKyAxNik7Ci0gIH0KLSAgY29weV9hbmRfa2V5KHMxLCBpbiwgb19rZXkpOwotCi0gIGZvciAociA9IDE7IHIgPCAxNDsgKytyKQotI2lmIGRlZmluZWQoVkVSU0lPTl8xKQotICB7Ci0gICAgbWl4X3N1Yl9jb2x1bW5zKHMxKTsKLSAgICBpZiAociAmIDEpCi0gICAgICBhZGRfcm91bmRfa2V5KHMxLCBvX2tleSArIDE2KTsKLSAgICBlbHNlIHsKLSAgICAgIHVwZGF0ZV9lbmNyeXB0X2tleV8yNTYob19rZXksICZyYyk7Ci0gICAgICBhZGRfcm91bmRfa2V5KHMxLCBvX2tleSk7Ci0gICAgfQotICB9Ci0jZWxzZQotICB7Ci0gICAgdWludF84dCBzMltOX0JMT0NLXTsKLSAgICBtaXhfc3ViX2NvbHVtbnMoczIsIHMxKTsKLSAgICBpZiAociAmIDEpCi0gICAgICBjb3B5X2FuZF9rZXkoczEsIHMyLCBvX2tleSArIDE2KTsKLSAgICBlbHNlIHsKLSAgICAgIHVwZGF0ZV9lbmNyeXB0X2tleV8yNTYob19rZXksICZyYyk7Ci0gICAgICBjb3B5X2FuZF9rZXkoczEsIHMyLCBvX2tleSk7Ci0gICAgfQotICB9Ci0jZW5kaWYKLQotICBzaGlmdF9zdWJfcm93cyhzMSk7Ci0gIHVwZGF0ZV9lbmNyeXB0X2tleV8yNTYob19rZXksICZyYyk7Ci0gIGNvcHlfYW5kX2tleShvdXQsIHMxLCBvX2tleSk7Ci19Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfREVDXzI1Nl9PVEZLKQotCi0vKiAgVGhlICdvbiB0aGUgZmx5JyBlbmNyeXB0aW9uIGtleSB1cGRhdGUgZm9yIGZvciAyNTYgYml0IGtleXMgKi8KLQotc3RhdGljIHZvaWQgdXBkYXRlX2RlY3J5cHRfa2V5XzI1Nih1aW50Xzh0IGtbMiAqIE5fQkxPQ0tdLCB1aW50Xzh0KiByYykgewotICB1aW50Xzh0IGNjOwotCi0gIGZvciAoY2MgPSAyODsgY2MgPiAxNjsgY2MgLT0gNCkgewotICAgIGtbY2MgKyAwXSBePSBrW2NjIC0gNF07Ci0gICAga1tjYyArIDFdIF49IGtbY2MgLSAzXTsKLSAgICBrW2NjICsgMl0gXj0ga1tjYyAtIDJdOwotICAgIGtbY2MgKyAzXSBePSBrW2NjIC0gMV07Ci0gIH0KLQotICBrWzE2XSBePSBzX2JveChrWzEyXSk7Ci0gIGtbMTddIF49IHNfYm94KGtbMTNdKTsKLSAga1sxOF0gXj0gc19ib3goa1sxNF0pOwotICBrWzE5XSBePSBzX2JveChrWzE1XSk7Ci0KLSAgZm9yIChjYyA9IDEyOyBjYyA+IDA7IGNjIC09IDQpIHsKLSAgICBrW2NjICsgMF0gXj0ga1tjYyAtIDRdOwotICAgIGtbY2MgKyAxXSBePSBrW2NjIC0gM107Ci0gICAga1tjYyArIDJdIF49IGtbY2MgLSAyXTsKLSAgICBrW2NjICsgM10gXj0ga1tjYyAtIDFdOwotICB9Ci0KLSAgKnJjID0gZDIoKnJjKTsKLSAga1swXSBePSBzX2JveChrWzI5XSkgXiAqcmM7Ci0gIGtbMV0gXj0gc19ib3goa1szMF0pOwotICBrWzJdIF49IHNfYm94KGtbMzFdKTsKLSAga1szXSBePSBzX2JveChrWzI4XSk7Ci19Ci0KLS8qICBEZWNyeXB0IGEgc2luZ2xlIGJsb2NrIG9mIDE2IGJ5dGVzIHdpdGggJ29uIHRoZSBmbHknCi0gICAgMjU2IGJpdCBrZXlpbmcKLSovCi12b2lkIGFlc19kZWNyeXB0XzI1NigKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLAotICAgIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5WzIgKiBOX0JMT0NLXSwKLSAgICB1bnNpZ25lZCBjaGFyIG9fa2V5WzIgKiBOX0JMT0NLXSkgewotICB1aW50Xzh0IHMxW05fQkxPQ0tdLCByLCByYyA9IDB4ODA7Ci0KLSAgaWYgKG9fa2V5ICE9IGtleSkgewotICAgIGJsb2NrX2NvcHkob19rZXksIGtleSk7Ci0gICAgYmxvY2tfY29weShvX2tleSArIDE2LCBrZXkgKyAxNik7Ci0gIH0KLQotICBjb3B5X2FuZF9rZXkoczEsIGluLCBvX2tleSk7Ci0gIGludl9zaGlmdF9zdWJfcm93cyhzMSk7Ci0KLSAgZm9yIChyID0gMTQ7IC0tcjspCi0jaWYgZGVmaW5lZChWRVJTSU9OXzEpCi0gIHsKLSAgICBpZiAoKHIgJiAxKSkgewotICAgICAgdXBkYXRlX2RlY3J5cHRfa2V5XzI1NihvX2tleSwgJnJjKTsKLSAgICAgIGFkZF9yb3VuZF9rZXkoczEsIG9fa2V5ICsgMTYpOwotICAgIH0gZWxzZQotICAgICAgYWRkX3JvdW5kX2tleShzMSwgb19rZXkpOwotICAgIGludl9taXhfc3ViX2NvbHVtbnMoczEpOwotICB9Ci0jZWxzZQotICB7Ci0gICAgdWludF84dCBzMltOX0JMT0NLXTsKLSAgICBpZiAoKHIgJiAxKSkgewotICAgICAgdXBkYXRlX2RlY3J5cHRfa2V5XzI1NihvX2tleSwgJnJjKTsKLSAgICAgIGNvcHlfYW5kX2tleShzMiwgczEsIG9fa2V5ICsgMTYpOwotICAgIH0gZWxzZQotICAgICAgY29weV9hbmRfa2V5KHMyLCBzMSwgb19rZXkpOwotICAgIGludl9taXhfc3ViX2NvbHVtbnMoczEsIHMyKTsKLSAgfQotI2VuZGlmCi0gIGNvcHlfYW5kX2tleShvdXQsIHMxLCBvX2tleSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2QvY3J5cHRvX3Rvb2xib3gvYWVzLmggYi9nZC9jcnlwdG9fdG9vbGJveC9hZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1OTc0My4uMDAwMDAwMAotLS0gYS9nZC9jcnlwdG9fdG9vbGJveC9hZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIENvcHlyaWdodCAoYykgMTk5OC0yMDA4LCBCcmlhbiBHbGFkbWFuLCBXb3JjZXN0ZXIsIFVLLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gTElDRU5TRSBURVJNUwotCi0gVGhlIHJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpCi0gaXMgYWxsb3dlZCB3aXRob3V0IHRoZSBwYXltZW50IG9mIGZlZXMgb3Igcm95YWx0aWVzIHByb3ZpZGVkIHRoYXQ6Ci0KLSAgMS4gc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucyBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOwotCi0gIDIuIGJpbmFyeSBkaXN0cmlidXRpb25zIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAotICAgICBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlaXIgZG9jdW1lbnRhdGlvbjsKLQotICAzLiB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCi0gICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSBESVNDTEFJTUVSCi0KLSBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKLSBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKLSBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJc3N1ZSAwOS8wOS8yMDA2Ci0KLSBUaGlzIGlzIGFuIEFFUyBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgb25seSA4LWJpdCBieXRlIG9wZXJhdGlvbnMgb24gdGhlCi0gY2lwaGVyIHN0YXRlLgotICovCi0KLSNpZm5kZWYgQUVTX0gKLSNkZWZpbmUgQUVTX0gKLQotI2lmIDEKLSNkZWZpbmUgQUVTX0VOQ19QUkVLRVlFRCAvKiBBRVMgZW5jcnlwdGlvbiB3aXRoIGEgcHJlY29tcHV0ZWQga2V5IHNjaGVkdWxlICAqLwotI2VuZGlmCi0jaWYgMQotI2RlZmluZSBBRVNfREVDX1BSRUtFWUVEIC8qIEFFUyBkZWNyeXB0aW9uIHdpdGggYSBwcmVjb21wdXRlZCBrZXkgc2NoZWR1bGUgICovCi0jZW5kaWYKLSNpZiAxCi0jZGVmaW5lIEFFU19FTkNfMTI4X09URksgLyogQUVTIGVuY3J5cHRpb24gd2l0aCAnb24gdGhlIGZseScgMTI4IGJpdCBrZXlpbmcgKi8KLSNlbmRpZgotI2lmIDEKLSNkZWZpbmUgQUVTX0RFQ18xMjhfT1RGSyAvKiBBRVMgZGVjcnlwdGlvbiB3aXRoICdvbiB0aGUgZmx5JyAxMjggYml0IGtleWluZyAqLwotI2VuZGlmCi0jaWYgMQotI2RlZmluZSBBRVNfRU5DXzI1Nl9PVEZLIC8qIEFFUyBlbmNyeXB0aW9uIHdpdGggJ29uIHRoZSBmbHknIDI1NiBiaXQga2V5aW5nICovCi0jZW5kaWYKLSNpZiAxCi0jZGVmaW5lIEFFU19ERUNfMjU2X09URksgLyogQUVTIGRlY3J5cHRpb24gd2l0aCAnb24gdGhlIGZseScgMjU2IGJpdCBrZXlpbmcgKi8KLSNlbmRpZgotCi0jZGVmaW5lIE5fUk9XIDQKLSNkZWZpbmUgTl9DT0wgNAotI2RlZmluZSBOX0JMT0NLIChOX1JPVyAqIE5fQ09MKQotI2RlZmluZSBOX01BWF9ST1VORFMgMTQKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnRfOHQ7Ci0KLXR5cGVkZWYgdWludF84dCByZXR1cm5fdHlwZTsKLQotLyogIFdhcm5pbmc6IFRoZSBrZXkgbGVuZ3RoIGZvciAyNTYgYml0IGtleXMgb3ZlcmZsb3dzIGEgYnl0ZQotICAgIChzZWUgY29tbWVudCBiZWxvdykKLSovCi0KLXR5cGVkZWYgdWludF84dCBsZW5ndGhfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50Xzh0IGtzY2hbKE5fTUFYX1JPVU5EUyArIDEpICogTl9CTE9DS107Ci0gIHVpbnRfOHQgcm5kOwotfSBhZXNfY29udGV4dDsKLQotLyogIFRoZSBmb2xsb3dpbmcgY2FsbHMgYXJlIGZvciBhIHByZWNvbXB1dGVkIGtleSBzY2hlZHVsZQotCi0gICAgTk9URTogSWYgdGhlIGxlbmd0aF90eXBlIHVzZWQgZm9yIHRoZSBrZXkgbGVuZ3RoIGlzIGFuCi0gICAgdW5zaWduZWQgOC1iaXQgY2hhcmFjdGVyLCBhIGtleSBsZW5ndGggb2YgMjU2IGJpdHMgbXVzdAotICAgIGJlIGVudGVyZWQgYXMgYSBsZW5ndGggaW4gYnl0ZXMgKHZhbGlkIGlucHV0cyBhcmUgaGVuY2UKLSAgICAxMjgsIDE5MiwgMTYsIDI0IGFuZCAzMikuCi0qLwotCi0jaWYgZGVmaW5lZChBRVNfRU5DX1BSRUtFWUVEKSB8fCBkZWZpbmVkKEFFU19ERUNfUFJFS0VZRUQpCi0KLXJldHVybl90eXBlIGFlc19zZXRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5W10sIGxlbmd0aF90eXBlIGtleWxlbiwgYWVzX2NvbnRleHQgY3R4WzFdKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfRU5DX1BSRUtFWUVEKQotCi1yZXR1cm5fdHlwZSBhZXNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLCB1bnNpZ25lZCBjaGFyIG91dFtOX0JMT0NLXSwgY29uc3QgYWVzX2NvbnRleHQgY3R4WzFdKTsKLQotcmV0dXJuX3R5cGUgYWVzX2NiY19lbmNyeXB0KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCB1bnNpZ25lZCBjaGFyKiBvdXQsIGludCBuX2Jsb2NrLCB1bnNpZ25lZCBjaGFyIGl2W05fQkxPQ0tdLCBjb25zdCBhZXNfY29udGV4dCBjdHhbMV0pOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFFU19ERUNfUFJFS0VZRUQpCi0KLXJldHVybl90eXBlIGFlc19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLCBjb25zdCBhZXNfY29udGV4dCBjdHhbMV0pOwotCi1yZXR1cm5fdHlwZSBhZXNfY2JjX2RlY3J5cHQoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIHVuc2lnbmVkIGNoYXIqIG91dCwgaW50IG5fYmxvY2ssIHVuc2lnbmVkIGNoYXIgaXZbTl9CTE9DS10sIGNvbnN0IGFlc19jb250ZXh0IGN0eFsxXSk7Ci0jZW5kaWYKLQotLyogIFRoZSBmb2xsb3dpbmcgY2FsbHMgYXJlIGZvciAnb24gdGhlIGZseScga2V5aW5nLiAgSW4gdGhpcyBjYXNlIHRoZQotICAgIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24ga2V5cyBhcmUgZGlmZmVyZW50LgotCi0gICAgVGhlIGVuY3J5cHRpb24gc3Vicm91dGluZXMgdGFrZSBhIGtleSBpbiBhbiBhcnJheSBvZiBieXRlcyBpbgotICAgIGtleVtMXSB3aGVyZSBMIGlzIDE2LCAyNCBvciAzMiBieXRlcyBmb3Iga2V5IGxlbmd0aHMgb2YgMTI4LAotICAgIDE5MiwgYW5kIDI1NiBiaXRzIHJlc3BlY3RpdmVseS4gIFRoZXkgdGhlbiBlbmNyeXB0cyB0aGUgaW5wdXQKLSAgICBkYXRhLCBpbltdIHdpdGggdGhpcyBrZXkgYW5kIHB1dCB0aGUgcmV1bHQgaW4gdGhlIG91dHB1dCBhcnJheQotICAgIG91dFtdLiAgSW4gYWRkaXRpb24sIHRoZSBzZWNvbmQga2V5IGFycmF5LCBvX2tleVtMXSwgaXMgdXNlZAotICAgIHRvIG91dHB1dCB0aGUga2V5IHRoYXQgaXMgbmVlZGVkIGJ5IHRoZSBkZWNyeXB0aW9uIHN1YnJvdXRpbmUKLSAgICB0byByZXZlcnNlIHRoZSBlbmNyeXB0aW9uIG9wZXJhdGlvbi4gIFRoZSB0d28ga2V5IGFycmF5cyBjYW4KLSAgICBiZSB0aGUgc2FtZSBhcnJheSBidXQgaW4gdGhpcyBjYXNlIHRoZSBvcmlnaW5hbCBrZXkgd2lsbCBiZQotICAgIG92ZXJ3cml0dGVuLgotCi0gICAgSW4gdGhlIHNhbWUgd2F5LCB0aGUgZGVjcnlwdGlvbiBzdWJyb3V0aW5lcyBvdXRwdXQga2V5cyB0aGF0Ci0gICAgY2FuIGJlIHVzZWQgdG8gcmV2ZXJzZSB0aGVpciBlZmZlY3Qgd2hlbiB1c2VkIGZvciBlbmNyeXB0aW9uLgotCi0gICAgT25seSAxMjggYW5kIDI1NiBiaXQga2V5cyBhcmUgc3VwcG9ydGVkIGluIHRoZXNlICdvbiB0aGUgZmx5JwotICAgIG1vZGVzLgotKi8KLQotI2lmIGRlZmluZWQoQUVTX0VOQ18xMjhfT1RGSykKLXZvaWQgYWVzX2VuY3J5cHRfMTI4KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbTl9CTE9DS10sCi0gICAgdWludF84dCBvX2tleVtOX0JMT0NLXSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0RFQ18xMjhfT1RGSykKLXZvaWQgYWVzX2RlY3J5cHRfMTI4KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvX2tleVtOX0JMT0NLXSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0VOQ18yNTZfT1RGSykKLXZvaWQgYWVzX2VuY3J5cHRfMjU2KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbMiAqIE5fQkxPQ0tdLAotICAgIHVuc2lnbmVkIGNoYXIgb19rZXlbMiAqIE5fQkxPQ0tdKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfREVDXzI1Nl9PVEZLKQotdm9pZCBhZXNfZGVjcnlwdF8yNTYoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwKLSAgICB1bnNpZ25lZCBjaGFyIG91dFtOX0JMT0NLXSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVsyICogTl9CTE9DS10sCi0gICAgdW5zaWduZWQgY2hhciBvX2tleVsyICogTl9CTE9DS10pOwotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2QvY3J5cHRvX3Rvb2xib3gvYWVzX2NtYWMuY2MgYi9nZC9jcnlwdG9fdG9vbGJveC9hZXNfY21hYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmZGQ1OS4uMDAwMDAwMAotLS0gYS9nZC9jcnlwdG9fdG9vbGJveC9hZXNfY21hYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA4LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFFUzEyOCBhbmQgQUVTIENNQUMgYWxnb3JpdGhtLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9hZXMuaCIKLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCogdGV4dDsKLSAgdWludDE2X3QgbGVuOwotICB1aW50MTZfdCByb3VuZDsKLX0gdENNQUNfQ0I7Ci0KLXRocmVhZF9sb2NhbCB0Q01BQ19DQiBjbWFjX2NiOwotCi0vKiBSYiBmb3IgQUVTLTEyOCBhcyBibG9jayBjaXBoZXIsIExTQiBhcyBbMF0gKi8KLU9jdGV0MTYgY29uc3RfUmJ7MHg4NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLS8qKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGRvIGFuIGJpdGVpc2UgZXhjbHVzaXZlLU9SIG9mIHR3byBiaXQgc3RyaW5ncyBvZiB0aGUKLSAqIGxlbmd0aCBvZiBPQ1RFVDE2X0xFTi4gUmVzdWx0IGlzIHN0b3JlZCBpbiBmaXJzdCBhcmd1bWVudC4KLSAqLwotc3RhdGljIHZvaWQgeG9yXzEyOChPY3RldDE2KiBhLCBjb25zdCBPY3RldDE2JiBiKSB7Ci0gIC8vIENIRUNLKGEpOwotICB1aW50OF90IGksICphYSA9IGEtPmRhdGEoKTsKLSAgY29uc3QgdWludDhfdCogYmIgPSBiLmRhdGEoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgT0NURVQxNl9MRU47IGkrKykgewotICAgIGFhW2ldID0gYWFbaV0gXiBiYltpXTsKLSAgfQotfQotfSAgLy8gbmFtZXNwYWNlCi0KLS8qIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgQUVTXzEyOChrZXksIG1lc3NhZ2UpICovCi1PY3RldDE2IGFlc18xMjgoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCBPY3RldDE2JiBtZXNzYWdlKSB7Ci0gIE9jdGV0MTYga2V5X3JldmVyc2VkOwotICBPY3RldDE2IG1lc3NhZ2VfcmV2ZXJzZWQ7Ci0gIE9jdGV0MTYgb3V0cHV0OwotCi0gIHN0ZDo6cmV2ZXJzZV9jb3B5KGtleS5iZWdpbigpLCBrZXkuZW5kKCksIGtleV9yZXZlcnNlZC5iZWdpbigpKTsKLSAgc3RkOjpyZXZlcnNlX2NvcHkobWVzc2FnZS5iZWdpbigpLCBtZXNzYWdlLmVuZCgpLCBtZXNzYWdlX3JldmVyc2VkLmJlZ2luKCkpOwotCi0gIGFlc19jb250ZXh0IGN0eDsKLSAgYWVzX3NldF9rZXkoa2V5X3JldmVyc2VkLmRhdGEoKSwga2V5X3JldmVyc2VkLnNpemUoKSwgJmN0eCk7Ci0gIGFlc19lbmNyeXB0KG1lc3NhZ2VfcmV2ZXJzZWQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpLCAmY3R4KTsKLQotICBzdGQ6OnJldmVyc2Uob3V0cHV0LmJlZ2luKCksIG91dHB1dC5lbmQoKSk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLS8qKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIHBhZGRpbmcgdGhlIGdpdmVuIHRleHQgdG8gYmUgYSAxMjggYml0cyBkYXRhLiBUaGUKLSAqIHBhcmFtZXRlciBkZXN0IGlzIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyLCBpdCBtdXN0IHBvaW50IHRvIGEKLSAqIE9DVEVUMTZfTEVOIG1lbW9yeSBzcGFjZTsgd2hlcmUgaW5jbHVkZSBsZW5ndGggYnl0ZXMgdmFsaWQgZGF0YS4gKi8KLXN0YXRpYyB2b2lkIHBhZGRpbmcoT2N0ZXQxNiogZGVzdCwgdWludDhfdCBsZW5ndGgpIHsKLSAgdWludDhfdCBpLCAqcCA9IGRlc3QtPmRhdGEoKTsKLSAgLyogb3JpZ2luYWwgbGFzdCBibG9jayAqLwotICBmb3IgKGkgPSBsZW5ndGg7IGkgPCBPQ1RFVDE2X0xFTjsgaSsrKSBwW09DVEVUMTZfTEVOIC0gaSAtIDFdID0gKGkgPT0gbGVuZ3RoKSA/IDB4ODAgOiAwOwotfQotCi0vKiogdXRpbGl0eSBmdW5jdGlvbiB0byBsZWZ0IHNoaWZ0IG9uZSBiaXQgZm9yIGEgMTI4IGJpdHMgdmFsdWUuICovCi1zdGF0aWMgdm9pZCBsZWZ0c2hpZnRfb25lYml0KHVpbnQ4X3QqIGlucHV0LCB1aW50OF90KiBvdXRwdXQpIHsKLSAgdWludDhfdCBpLCBvdmVyZmxvdyA9IDAsIG5leHRfb3ZlcmZsb3cgPSAwOwotICAvKiBpbnB1dFswXSBpcyBMU0IgKi8KLSAgZm9yIChpID0gMDsgaSA8IE9DVEVUMTZfTEVOOyBpKyspIHsKLSAgICBuZXh0X292ZXJmbG93ID0gKGlucHV0W2ldICYgMHg4MCkgPyAxIDogMDsKLSAgICBvdXRwdXRbaV0gPSAoaW5wdXRbaV0gPDwgMSkgfCBvdmVyZmxvdzsKLSAgICBvdmVyZmxvdyA9IG5leHRfb3ZlcmZsb3c7Ci0gIH0KLSAgcmV0dXJuOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpcyB0aGUgY2FsY3VsYXRpb24gb2YgYmxvY2sgY2lwaGVyIHVzaW5nIEFFUy0xMjguICovCi1zdGF0aWMgT2N0ZXQxNiBjbWFjX2Flc19rX2NhbGN1bGF0ZShjb25zdCBPY3RldDE2JiBrZXkpIHsKLSAgT2N0ZXQxNiBvdXRwdXQ7Ci0gIE9jdGV0MTYgeHswfTsgIC8vIHplcm8gaW5pdGlhbGl6ZWQKLQotICB1aW50OF90IGkgPSAxOwotICB3aGlsZSAoaSA8PSBjbWFjX2NiLnJvdW5kKSB7Ci0gICAgLyogTWknIDo9IE1pICgrKSBYICAqLwotICAgIHhvcl8xMjgoKE9jdGV0MTYqKSZjbWFjX2NiLnRleHRbKGNtYWNfY2Iucm91bmQgLSBpKSAqIE9DVEVUMTZfTEVOXSwgeCk7Ci0KLSAgICBvdXRwdXQgPSBhZXNfMTI4KGtleSwgJmNtYWNfY2IudGV4dFsoY21hY19jYi5yb3VuZCAtIGkpICogT0NURVQxNl9MRU5dLCBPQ1RFVDE2X0xFTik7Ci0gICAgeCA9IG91dHB1dDsKLSAgICBpKys7Ci0gIH0KLQotICByZXR1cm4gb3V0cHV0OwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBwcm9jZWVlZCB0byBwcmVwYXJlIHRoZSBsYXN0IGJsb2NrIG9mIG1lc3NhZ2UgTW4gZGVwZW5kaW5nIG9uCi0gKiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAqLwotc3RhdGljIHZvaWQgY21hY19wcmVwYXJlX2xhc3RfYmxvY2soY29uc3QgT2N0ZXQxNiYgazEsIGNvbnN0IE9jdGV0MTYmIGsyKSB7Ci0gIC8vICAgIHVpbnQ4X3QgICAgIHhbMTZdID0gezB9OwotICBib29sIGZsYWc7Ci0KLSAgLyogbGFzdCBibG9jayBpcyBhIGNvbXBsZXRlIGJsb2NrIHNldCBmbGFnIHRvIDEgKi8KLSAgZmxhZyA9ICgoY21hY19jYi5sZW4gJSBPQ1RFVDE2X0xFTikgPT0gMCAmJiBjbWFjX2NiLmxlbiAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQotICBpZiAoZmxhZykgeyAvKiBsYXN0IGJsb2NrIGlzIGNvbXBsZXRlIGJsb2NrICovCi0gICAgeG9yXzEyOCgoT2N0ZXQxNiopJmNtYWNfY2IudGV4dFswXSwgazEpOwotICB9IGVsc2UgLyogcGFkZGluZyB0aGVuIHhvciB3aXRoIGsyICovCi0gIHsKLSAgICBwYWRkaW5nKChPY3RldDE2KikmY21hY19jYi50ZXh0WzBdLCAodWludDhfdCkoY21hY19jYi5sZW4gJSAxNikpOwotCi0gICAgeG9yXzEyOCgoT2N0ZXQxNiopJmNtYWNfY2IudGV4dFswXSwgazIpOwotICB9Ci19Ci0KLS8qKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgdHdvIHN1YmtleXMuCi0gKiB8a2V5fCBpcyBDTUFDIGtleSwgZXhwZWN0IFNSSyB3aGVuIHVzZWQgYnkgU01QLgotICovCi1zdGF0aWMgdm9pZCBjbWFjX2dlbmVyYXRlX3N1YmtleShjb25zdCBPY3RldDE2JiBrZXkpIHsKLSAgT2N0ZXQxNiB6ZXJve307Ci0gIE9jdGV0MTYgcCA9IGFlc18xMjgoa2V5LCB6ZXJvLmRhdGEoKSwgT0NURVQxNl9MRU4pOwotCi0gIE9jdGV0MTYgazEsIGsyOwotICB1aW50OF90KiBwcCA9IHAuZGF0YSgpOwotCi0gIC8qIElmIE1TQihMKSA9IDAsIHRoZW4gSzEgPSBMIDw8IDEgKi8KLSAgaWYgKChwcFtPQ1RFVDE2X0xFTiAtIDFdICYgMHg4MCkgIT0gMCkgewotICAgIC8qIEVsc2UgSzEgPSAoIEwgPDwgMSApICgrKSBSYiAqLwotICAgIGxlZnRzaGlmdF9vbmViaXQocHAsIGsxLmRhdGEoKSk7Ci0gICAgeG9yXzEyOCgmazEsIGNvbnN0X1JiKTsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0c2hpZnRfb25lYml0KHBwLCBrMS5kYXRhKCkpOwotICB9Ci0KLSAgaWYgKChrMVtPQ1RFVDE2X0xFTiAtIDFdICYgMHg4MCkgIT0gMCkgewotICAgIC8qIEsyID0gIChLMSA8PCAxKSAoKykgUmIgKi8KLSAgICBsZWZ0c2hpZnRfb25lYml0KGsxLmRhdGEoKSwgazIuZGF0YSgpKTsKLSAgICB4b3JfMTI4KCZrMiwgY29uc3RfUmIpOwotICB9IGVsc2UgewotICAgIC8qIElmIE1TQihLMSkgPSAwLCB0aGVuIEsyID0gSzEgPDwgMSAqLwotICAgIGxlZnRzaGlmdF9vbmViaXQoazEuZGF0YSgpLCBrMi5kYXRhKCkpOwotICB9Ci0KLSAgY21hY19wcmVwYXJlX2xhc3RfYmxvY2soazEsIGsyKTsKLX0KLQotLyoqIGtleSAtIENNQUMga2V5IGluIGxpdHRsZSBlbmRpYW4gb3JkZXIKLSAqICBpbnB1dCAtIHRleHQgdG8gYmUgc2lnbmVkIGluIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci4KLSAqICBsZW5ndGggLSBsZW5ndGggb2YgdGhlIGlucHV0IGluIGJ5dGUuCi0gKi8KLU9jdGV0MTYgYWVzX2NtYWMoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCB1aW50OF90KiBpbnB1dCwgdWludDE2X3QgbGVuZ3RoKSB7Ci0gIHVpbnQzMl90IGxlbjsKLSAgdWludDE2X3QgZGlmZjsKLSAgLyogbiBpcyBudW1iZXIgb2Ygcm91bmRzICovCi0gIHVpbnQxNl90IG4gPSAobGVuZ3RoICsgT0NURVQxNl9MRU4gLSAxKSAvIE9DVEVUMTZfTEVOOwotCi0gIGlmIChuID09IDApIG4gPSAxOwotICBsZW4gPSBuICogT0NURVQxNl9MRU47Ci0KLSAgLyogYWxsb2NhdGUgYSBtZW1vcnkgc3BhY2Ugb2YgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgdG8gaG9sZCB0ZXh0ICAqLwotICBjbWFjX2NiLnRleHQgPSAodWludDhfdCopYWxsb2NhKGxlbik7Ci0gIGNtYWNfY2Iucm91bmQgPSBuOwotICBkaWZmID0gbGVuIC0gbGVuZ3RoOwotCi0gIGlmIChpbnB1dCAhPSBOVUxMICYmIGxlbmd0aCA+IDApIHsKLSAgICBtZW1jcHkoJmNtYWNfY2IudGV4dFtkaWZmXSwgaW5wdXQsIChpbnQpbGVuZ3RoKTsKLSAgICBjbWFjX2NiLmxlbiA9IGxlbmd0aDsKLSAgfSBlbHNlIHsKLSAgICBjbWFjX2NiLmxlbiA9IDA7Ci0gIH0KLQotICAvKiBwcmVwYXJlIGNhbGN1bGF0aW9uIGZvciBzdWJrZXkgcyBhbmQgbGFzdCBibG9jayBvZiBkYXRhICovCi0gIGNtYWNfZ2VuZXJhdGVfc3Via2V5KGtleSk7Ci0gIC8qIHN0YXJ0IGNhbGN1bGF0aW9uICovCi0gIE9jdGV0MTYgc2lnbmF0dXJlID0gY21hY19hZXNfa19jYWxjdWxhdGUoa2V5KTsKLQotICAvKiBjbGVhbiB1cCAqLwotICBtZW1zZXQoJmNtYWNfY2IsIDAsIHNpemVvZih0Q01BQ19DQikpOwotICAvLyBjbWFjX2NiLnRleHQgaXMgYXV0by1mcmVlZCBieSBhbGxvY2EKLQotICByZXR1cm4gc2lnbmF0dXJlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY3J5cHRvX3Rvb2xib3gKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmNjIGIvZ2QvY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZjFhNzAuLjAwMDAwMDAKLS0tIGEvZ2QvY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9hZXMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY3J5cHRvX3Rvb2xib3ggewotCi1jb25zdGV4cHIgaW50IE9DVEVUMzJfTEVOID0gMzI7Ci0KLU9jdGV0MTYgaDYoY29uc3QgT2N0ZXQxNiYgdywgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlpZCkgewotICByZXR1cm4gYWVzX2NtYWModywga2V5aWQuZGF0YSgpLCBrZXlpZC5zaXplKCkpOwotfQotCi1PY3RldDE2IGg3KGNvbnN0IE9jdGV0MTYmIHNhbHQsIGNvbnN0IE9jdGV0MTYmIHcpIHsKLSAgcmV0dXJuIGFlc19jbWFjKHNhbHQsIHcuZGF0YSgpLCB3LnNpemUoKSk7Ci19Ci0KLU9jdGV0MTYgZjQodWludDhfdCogdSwgdWludDhfdCogdiwgY29uc3QgT2N0ZXQxNiYgeCwgdWludDhfdCB6KSB7Ci0gIGNvbnN0ZXhwciBzaXplX3QgbXNnX2xlbiA9IE9DVEVUMzJfTEVOIC8qIFUgc2l6ZSAqLyArIE9DVEVUMzJfTEVOIC8qIFYgc2l6ZSAqLyArIDEgLyogWiBzaXplICovOwotCi0gIC8vIERWTE9HKDIpIDw8ICJVPSIgPDwgSGV4RW5jb2RlKHUsIE9DVEVUMzJfTEVOKSA8PCAiLCBWPSIgPDwgSGV4RW5jb2RlKHYsIE9DVEVUMzJfTEVOKQotICAvLyAgICAgICAgICA8PCAiLCBYPSIgPDwgSGV4RW5jb2RlKHguZGF0YSgpLCB4LnNpemUoKSkgPDwgIiwgWj0iIDw8IHN0ZDo6aGV4IDw8ICt6OwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgbXNnX2xlbj4gbXNnOwotICBhdXRvIGl0ID0gbXNnLmJlZ2luKCk7Ci0gIGl0ID0gc3RkOjpjb3B5KCZ6LCAmeiArIDEsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkodiwgdiArIE9DVEVUMzJfTEVOLCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KHUsIHUgKyBPQ1RFVDMyX0xFTiwgaXQpOwotICByZXR1cm4gYWVzX2NtYWMoeCwgbXNnLmRhdGEoKSwgbXNnLnNpemUoKSk7Ci19Ci0KLS8qKiBoZWxwZXIgZm9yIGY1ICovCi1zdGF0aWMgT2N0ZXQxNiBjYWxjdWxhdGVfbWFjX2tleV9vcl9sdGsoCi0gICAgY29uc3QgT2N0ZXQxNiYgdCwKLSAgICB1aW50OF90IGNvdW50ZXIsCi0gICAgdWludDhfdCoga2V5X2lkLAotICAgIGNvbnN0IE9jdGV0MTYmIG4xLAotICAgIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgIHVpbnQ4X3QqIGExLAotICAgIHVpbnQ4X3QqIGEyLAotICAgIHVpbnQ4X3QqIGxlbmd0aCkgewotICBjb25zdGV4cHIgc2l6ZV90IG1zZ19sZW4gPSAxIC8qIENvdW50ZXIgc2l6ZSAqLyArIDQgLyoga2V5SUQgc2l6ZSAqLyArIE9DVEVUMTZfTEVOIC8qIE4xIHNpemUgKi8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ1RFVDE2X0xFTiAvKiBOMiBzaXplICovICsgNyAvKiBBMSBzaXplKi8gKyA3IC8qIEEyIHNpemUqLyArIDIgLyogTGVuZ3RoIHNpemUgKi87Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCBtc2dfbGVuPiBtc2c7Ci0gIGF1dG8gaXQgPSBtc2cuYmVnaW4oKTsKLSAgaXQgPSBzdGQ6OmNvcHkobGVuZ3RoLCBsZW5ndGggKyAyLCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KGEyLCBhMiArIDcsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkoYTEsIGExICsgNywgaXQpOwotICBpdCA9IHN0ZDo6Y29weShuMi5iZWdpbigpLCBuMi5lbmQoKSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weShuMS5iZWdpbigpLCBuMS5lbmQoKSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weShrZXlfaWQsIGtleV9pZCArIDQsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkoJmNvdW50ZXIsICZjb3VudGVyICsgMSwgaXQpOwotCi0gIHJldHVybiBhZXNfY21hYyh0LCBtc2cuZGF0YSgpLCBtc2cuc2l6ZSgpKTsKLX0KLQotdm9pZCBmNSh1aW50OF90KiB3LCBjb25zdCBPY3RldDE2JiBuMSwgY29uc3QgT2N0ZXQxNiYgbjIsIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMiwgT2N0ZXQxNiogbWFjX2tleSwgT2N0ZXQxNiogbHRrKSB7Ci0gIC8vIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICJXPSIgPDwgSGV4RW5jb2RlKHcsIE9DVEVUMzJfTEVOKSA8PCAiLCBOMT0iIDw8IEhleEVuY29kZShuMS5kYXRhKCksIG4xLnNpemUoKSkKLSAgLy8gICAgICAgICAgPDwgIiwgTjI9IiA8PCBIZXhFbmNvZGUobjIuZGF0YSgpLCBuMi5zaXplKCkpIDw8ICIsIEExPSIgPDwgSGV4RW5jb2RlKGExLCA3KSA8PCAiLCBBMj0iIDw8IEhleEVuY29kZShhMiwKLSAgLy8gICAgICAgICAgNyk7Ci0KLSAgY29uc3QgT2N0ZXQxNiBzYWx0ezB4QkUsIDB4ODMsIDB4NjAsIDB4NUEsIDB4REIsIDB4MEIsIDB4MzcsIDB4NjAsIDB4MzgsIDB4QTUsIDB4RjUsIDB4QUEsIDB4OTEsIDB4ODMsIDB4ODgsIDB4NkN9OwotICBPY3RldDE2IHQgPSBhZXNfY21hYyhzYWx0LCB3LCBPQ1RFVDMyX0xFTik7Ci0KLSAgLy8gRFZMT0coMikgPDwgIlQ9IiA8PCBIZXhFbmNvZGUodC5kYXRhKCksIHQuc2l6ZSgpKTsKLQotICB1aW50OF90IGtleV9pZFs0XSA9IHsweDY1LCAweDZjLCAweDc0LCAweDYyfTsgLyogMHg2Mjc0NmM2NSAqLwotICB1aW50OF90IGxlbmd0aFsyXSA9IHsweDAwLCAweDAxfTsgICAgICAgICAgICAgLyogMHgwMTAwICovCi0KLSAgKm1hY19rZXkgPSBjYWxjdWxhdGVfbWFjX2tleV9vcl9sdGsodCwgMCwga2V5X2lkLCBuMSwgbjIsIGExLCBhMiwgbGVuZ3RoKTsKLQotICAqbHRrID0gY2FsY3VsYXRlX21hY19rZXlfb3JfbHRrKHQsIDEsIGtleV9pZCwgbjEsIG4yLCBhMSwgYTIsIGxlbmd0aCk7Ci0KLSAgLy8gRFZMT0coMikgPDwgIm1hY19rZXk9IiA8PCBIZXhFbmNvZGUobWFjX2tleS0+ZGF0YSgpLCBtYWNfa2V5LT5zaXplKCkpOwotICAvLyBEVkxPRygyKSA8PCAibHRrPSIgPDwgSGV4RW5jb2RlKGx0ay0+ZGF0YSgpLCBsdGstPnNpemUoKSk7Ci19Ci0KLU9jdGV0MTYKLWY2KGNvbnN0IE9jdGV0MTYmIHcsIGNvbnN0IE9jdGV0MTYmIG4xLCBjb25zdCBPY3RldDE2JiBuMiwgY29uc3QgT2N0ZXQxNiYgciwgdWludDhfdCogaW9jYXAsIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMikgewotICBjb25zdCB1aW50OF90IG1zZ19sZW4gPSBPQ1RFVDE2X0xFTiAvKiBOMSBzaXplICovICsgT0NURVQxNl9MRU4gLyogTjIgc2l6ZSAqLyArIE9DVEVUMTZfTEVOIC8qIFIgc2l6ZSAqLyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDMgLyogSU9jYXAgc2l6ZSAqLyArIDcgLyogQTEgc2l6ZSovICsgNyAvKiBBMiBzaXplKi87Ci0KLSAgLy8gRFZMT0coMikgPDwgX19mdW5jX18gPDwgIlc9IiA8PCBIZXhFbmNvZGUody5kYXRhKCksIHcuc2l6ZSgpKSA8PCAiLCBOMT0iIDw8IEhleEVuY29kZShuMS5kYXRhKCksIG4xLnNpemUoKSkKLSAgLy8gICAgICAgICAgPDwgIiwgTjI9IiA8PCBIZXhFbmNvZGUobjIuZGF0YSgpLCBuMi5zaXplKCkpIDw8ICIsIFI9IiA8PCBIZXhFbmNvZGUoci5kYXRhKCksIHIuc2l6ZSgpKQotICAvLyAgICAgICAgICA8PCAiLCBJT2NhcD0iIDw8IEhleEVuY29kZShpb2NhcCwgMykgPDwgIiwgQTE9IiA8PCBIZXhFbmNvZGUoYTEsIDcpIDw8ICIsIEEyPSIgPDwgSGV4RW5jb2RlKGEyLCA3KTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIG1zZ19sZW4+IG1zZzsKLSAgYXV0byBpdCA9IG1zZy5iZWdpbigpOwotICBpdCA9IHN0ZDo6Y29weShhMiwgYTIgKyA3LCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KGExLCBhMSArIDcsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkoaW9jYXAsIGlvY2FwICsgMywgaXQpOwotICBpdCA9IHN0ZDo6Y29weShyLmJlZ2luKCksIHIuZW5kKCksIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkobjIuYmVnaW4oKSwgbjIuZW5kKCksIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkobjEuYmVnaW4oKSwgbjEuZW5kKCksIGl0KTsKLQotICByZXR1cm4gYWVzX2NtYWModywgbXNnLmRhdGEoKSwgbXNnLnNpemUoKSk7Ci19Ci0KLXVpbnQzMl90IGcyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsIGNvbnN0IE9jdGV0MTYmIHkpIHsKLSAgY29uc3RleHByIHNpemVfdCBtc2dfbGVuID0gT0NURVQzMl9MRU4gLyogVSBzaXplICovICsgT0NURVQzMl9MRU4gLyogViBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT0NURVQxNl9MRU4gLyogWSBzaXplICovOwotCi0gIC8vIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICJVPSIgPDwgSGV4RW5jb2RlKHUsIE9DVEVUMzJfTEVOKSA8PCAiLCBWPSIgPDwgSGV4RW5jb2RlKHYsIE9DVEVUMzJfTEVOKQotICAvLyAgICAgICAgICA8PCAiLCBYPSIgPDwgSGV4RW5jb2RlKHguZGF0YSgpLCB4LnNpemUoKSkgPDwgIiwgWT0iIDw8IEhleEVuY29kZSh5LmRhdGEoKSwgeS5zaXplKCkpOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgbXNnX2xlbj4gbXNnOwotICBhdXRvIGl0ID0gbXNnLmJlZ2luKCk7Ci0gIGl0ID0gc3RkOjpjb3B5KHkuYmVnaW4oKSwgeS5lbmQoKSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weSh2LCB2ICsgT0NURVQzMl9MRU4sIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkodSwgdSArIE9DVEVUMzJfTEVOLCBpdCk7Ci0KLSAgT2N0ZXQxNiBjbWFjID0gYWVzX2NtYWMoeCwgbXNnLmRhdGEoKSwgbXNnLnNpemUoKSk7Ci0KLSAgLyogdnJlcyA9IGNtYWMgbW9kIDIqKjMyIG1vZCAxMCoqNiAqLwotICByZXR1cm4gbGUzMnRvaCgqKHVpbnQzMl90KiljbWFjLmRhdGEoKSkgJSAxMDAwMDAwOwotfQotCi1PY3RldDE2IGx0a190b19saW5rX2tleShjb25zdCBPY3RldDE2JiBsdGssIGJvb2wgdXNlX2g3KSB7Ci0gIE9jdGV0MTYgaWxrOyAvKiBpbnRlcm1pZGlhdGUgbGluayBrZXkgKi8KLSAgaWYgKHVzZV9oNykgewotICAgIGNvbnN0ZXhwciBPY3RldDE2IHNhbHR7Ci0gICAgICAgIDB4MzEsIDB4NzAsIDB4NkQsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICAgIGlsayA9IGg3KHNhbHQsIGx0ayk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogInRtcDEiIG1hcHBpbmcgdG8gZXh0ZW5kZWQgQVNDSUksIGxpdHRsZSBlbmRpYW4qLwotICAgIGNvbnN0ZXhwciBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleUlEX3RtcDEgPSB7MHgzMSwgMHg3MCwgMHg2RCwgMHg3NH07Ci0gICAgaWxrID0gaDYobHRrLCBrZXlJRF90bXAxKTsKLSAgfQotCi0gIC8qICJsZWJyIiBtYXBwaW5nIHRvIGV4dGVuZGVkIEFTQ0lJLCBsaXR0bGUgZW5kaWFuICovCi0gIGNvbnN0ZXhwciBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleUlEX2xlYnIgPSB7MHg3MiwgMHg2MiwgMHg2NSwgMHg2Y307Ci0gIHJldHVybiBoNihpbGssIGtleUlEX2xlYnIpOwotfQotCi1PY3RldDE2IGxpbmtfa2V5X3RvX2x0ayhjb25zdCBPY3RldDE2JiBsaW5rX2tleSwgYm9vbCB1c2VfaDcpIHsKLSAgT2N0ZXQxNiBpbHRrOyAvKiBpbnRlcm1pZGlhdGUgbG9uZyB0ZXJtIGtleSAqLwotICBpZiAodXNlX2g3KSB7Ci0gICAgY29uc3RleHByIE9jdGV0MTYgc2FsdHsKLSAgICAgICAgMHgzMiwgMHg3MCwgMHg2RCwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gICAgaWx0ayA9IGg3KHNhbHQsIGxpbmtfa2V5KTsKLSAgfSBlbHNlIHsKLSAgICAvKiAidG1wMiIgbWFwcGluZyB0byBleHRlbmRlZCBBU0NJSSwgbGl0dGxlIGVuZGlhbiAqLwotICAgIGNvbnN0ZXhwciBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleUlEX3RtcDIgPSB7MHgzMiwgMHg3MCwgMHg2RCwgMHg3NH07Ci0gICAgaWx0ayA9IGg2KGxpbmtfa2V5LCBrZXlJRF90bXAyKTsKLSAgfQotCi0gIC8qICJicmxlIiBtYXBwaW5nIHRvIGV4dGVuZGVkIEFTQ0lJLCBsaXR0bGUgZW5kaWFuICovCi0gIGNvbnN0ZXhwciBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleUlEX2JybGUgPSB7MHg2NSwgMHg2YywgMHg3MiwgMHg2Mn07Ci0gIHJldHVybiBoNihpbHRrLCBrZXlJRF9icmxlKTsKLX0KLQotT2N0ZXQxNiBjMSgKLSAgICBjb25zdCBPY3RldDE2JiBrLAotICAgIGNvbnN0IE9jdGV0MTYmIHIsCi0gICAgY29uc3QgdWludDhfdCogcHJlcSwKLSAgICBjb25zdCB1aW50OF90KiBwcmVzLAotICAgIGNvbnN0IHVpbnQ4X3QgaWF0LAotICAgIGNvbnN0IHVpbnQ4X3QqIGlhLAotICAgIGNvbnN0IHVpbnQ4X3QgcmF0LAotICAgIGNvbnN0IHVpbnQ4X3QqIHJhKSB7Ci0gIE9jdGV0MTYgcDE7Ci0gIGF1dG8gaXQgPSBwMS5iZWdpbigpOwotICBpdCA9IHN0ZDo6Y29weSgmaWF0LCAmaWF0ICsgMSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weSgmcmF0LCAmcmF0ICsgMSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weShwcmVxLCBwcmVxICsgNywgaXQpOwotICBpdCA9IHN0ZDo6Y29weShwcmVzLCBwcmVzICsgNywgaXQpOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IE9DVEVUMTZfTEVOOyBpKyspIHsKLSAgICBwMVtpXSA9IHJbaV0gXiBwMVtpXTsKLSAgfQotCi0gIE9jdGV0MTYgcDFiaXMgPSBhZXNfMTI4KGssIHAxKTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IHBhZGRpbmd7MH07Ci0gIE9jdGV0MTYgcDI7Ci0gIGl0ID0gcDIuYmVnaW4oKTsKLSAgaXQgPSBzdGQ6OmNvcHkocmEsIHJhICsgNiwgaXQpOwotICBpdCA9IHN0ZDo6Y29weShpYSwgaWEgKyA2LCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KHBhZGRpbmcuYmVnaW4oKSwgcGFkZGluZy5lbmQoKSwgaXQpOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IE9DVEVUMTZfTEVOOyBpKyspIHsKLSAgICBwMltpXSA9IHAxYmlzW2ldIF4gcDJbaV07Ci0gIH0KLQotICByZXR1cm4gYWVzXzEyOChrLCBwMik7Ci19Ci0KLU9jdGV0MTYgczEoY29uc3QgT2N0ZXQxNiYgaywgY29uc3QgT2N0ZXQxNiYgcjEsIGNvbnN0IE9jdGV0MTYmIHIyKSB7Ci0gIE9jdGV0MTYgdGV4dHswfTsKLSAgY29uc3RleHByIHVpbnQ4X3QgQlRfT0NURVQ4X0xFTiA9IDg7Ci0gIG1lbWNweSh0ZXh0LmRhdGEoKSwgcjEuZGF0YSgpLCBCVF9PQ1RFVDhfTEVOKTsKLSAgbWVtY3B5KHRleHQuZGF0YSgpICsgQlRfT0NURVQ4X0xFTiwgcjIuZGF0YSgpLCBCVF9PQ1RFVDhfTEVOKTsKLQotICByZXR1cm4gYWVzXzEyOChrLCB0ZXh0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNyeXB0b190b29sYm94Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCBiL2dkL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGEwOTcuLjAwMDAwMDAKLS0tIGEvZ2QvY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY3J5cHRvX3Rvb2xib3ggewotCi1jb25zdGV4cHIgaW50IE9DVEVUMTZfTEVOID0gMTY7Ci11c2luZyBPY3RldDE2ID0gc3RkOjphcnJheTx1aW50OF90LCBPQ1RFVDE2X0xFTj47Ci0KLU9jdGV0MTYgYzEoCi0gICAgY29uc3QgT2N0ZXQxNiYgaywKLSAgICBjb25zdCBPY3RldDE2JiByLAotICAgIGNvbnN0IHVpbnQ4X3QqIHByZXMsCi0gICAgY29uc3QgdWludDhfdCogcHJlcSwKLSAgICBjb25zdCB1aW50OF90IGlhdCwKLSAgICBjb25zdCB1aW50OF90KiBpYSwKLSAgICBjb25zdCB1aW50OF90IHJhdCwKLSAgICBjb25zdCB1aW50OF90KiByYSk7Ci1PY3RldDE2IHMxKGNvbnN0IE9jdGV0MTYmIGssIGNvbnN0IE9jdGV0MTYmIHIxLCBjb25zdCBPY3RldDE2JiByMik7Ci0KLWV4dGVybiBPY3RldDE2IGFlc18xMjgoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCBPY3RldDE2JiBtZXNzYWdlKTsKLWV4dGVybiBPY3RldDE2IGFlc19jbWFjKGNvbnN0IE9jdGV0MTYmIGtleSwgY29uc3QgdWludDhfdCogbWVzc2FnZSwgdWludDE2X3QgbGVuZ3RoKTsKLWV4dGVybiBPY3RldDE2IGY0KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsIHVpbnQ4X3Qgeik7Ci1leHRlcm4gdm9pZCBmNSgKLSAgICB1aW50OF90KiB3LCBjb25zdCBPY3RldDE2JiBuMSwgY29uc3QgT2N0ZXQxNiYgbjIsIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMiwgT2N0ZXQxNiogbWFjX2tleSwgT2N0ZXQxNiogbHRrKTsKLWV4dGVybiBPY3RldDE2IGY2KAotICAgIGNvbnN0IE9jdGV0MTYmIHcsIGNvbnN0IE9jdGV0MTYmIG4xLCBjb25zdCBPY3RldDE2JiBuMiwgY29uc3QgT2N0ZXQxNiYgciwgdWludDhfdCogaW9jYXAsIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMik7Ci1leHRlcm4gT2N0ZXQxNiBoNihjb25zdCBPY3RldDE2JiB3LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleWlkKTsKLWV4dGVybiBPY3RldDE2IGg3KGNvbnN0IE9jdGV0MTYmIHNhbHQsIGNvbnN0IE9jdGV0MTYmIHcpOwotZXh0ZXJuIHVpbnQzMl90IGcyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsIGNvbnN0IE9jdGV0MTYmIHkpOwotZXh0ZXJuIE9jdGV0MTYgbHRrX3RvX2xpbmtfa2V5KGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcpOwotZXh0ZXJuIE9jdGV0MTYgbGlua19rZXlfdG9fbHRrKGNvbnN0IE9jdGV0MTYmIGxpbmtfa2V5LCBib29sIHVzZV9oNyk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgQUVTXzEyOChrZXksIG1lc3NhZ2UpLiB8a2V5fCBtdXN0IGJlIDEyOGJpdC4KLSAqIHxtZXNzYWdlfCBjYW4gYmUgYXQgbW9zdCAxNiBieXRlcyBsb25nLCBpdCdzIGxlbmd0aCBpbiBieXRlcyBpcyBnaXZlbiBpbgotICogfGxlbmd0aHwgKi8KLWlubGluZSBPY3RldDE2IGFlc18xMjgoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCB1aW50OF90KiBtZXNzYWdlLCBjb25zdCB1aW50OF90IGxlbmd0aCkgewotICAvLyBDSEVDSyhsZW5ndGggPD0gT0NURVQxNl9MRU4pIDw8ICJ5b3UgdHJpZWQgYWVzXzEyOCBtb3JlIHRoYW4gMTYgYnl0ZXMhIjsKLSAgT2N0ZXQxNiBtc2d7MH07Ci0gIHN0ZDo6Y29weShtZXNzYWdlLCBtZXNzYWdlICsgbGVuZ3RoLCBtc2cuYmVnaW4oKSk7Ci0gIHJldHVybiBhZXNfMTI4KGtleSwgbXNnKTsKLX0KLQotLy8gfHRsZW58IC0gbGVudGggb2YgbWFjIGRlc2lyZWQKLS8vIHxwX3NpZ25hdHVyZXwgLSBkYXRhIHBvaW50ZXIgdG8gd2hlcmUgc2lnbmVkIGRhdGEgdG8gYmUgc3RvcmVkLCB0bGVuIGxvbmcuCi1pbmxpbmUgdm9pZCBhZXNfY21hYyhjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IHVpbnQ4X3QqIG1lc3NhZ2UsIHVpbnQxNl90IGxlbmd0aCwgdWludDE2X3QgdGxlbiwgdWludDhfdCogcF9zaWduYXR1cmUpIHsKLSAgT2N0ZXQxNiBzaWduYXR1cmUgPSBhZXNfY21hYyhrZXksIG1lc3NhZ2UsIGxlbmd0aCk7Ci0KLSAgdWludDhfdCogcF9tYWMgPSBzaWduYXR1cmUuZGF0YSgpICsgKE9DVEVUMTZfTEVOIC0gdGxlbik7Ci0gIG1lbWNweShwX3NpZ25hdHVyZSwgcF9tYWMsIHRsZW4pOwotfQotCi1pbmxpbmUgT2N0ZXQxNiBhZXNfY21hYyhjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IE9jdGV0MTYmIG1lc3NhZ2UpIHsKLSAgcmV0dXJuIGFlc19jbWFjKGtleSwgbWVzc2FnZS5kYXRhKCksIG1lc3NhZ2Uuc2l6ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNyeXB0b190b29sYm94Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveF90ZXN0LmNjIGIvZ2QvY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3hfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyMWE1ZC4uMDAwMDAwMAotLS0gYS9nZC9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNyeXB0b190b29sYm94L2Flcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveCB7Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjEKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfdGVzdF9kXzFfdGVzdCkgewotICB1aW50OF90IGtbXSA9IHsweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LCAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjfTsKLQotICB1aW50OF90IG1bXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotICB1aW50OF90IGFlc19jbWFjX2tfbVtdID0gewotICAgICAgMHg3ZCwgMHhmNywgMHg2YiwgMHgwYywgMHgxYSwgMHhiOCwgMHg5OSwgMHhiMywgMHgzZSwgMHg0MiwgMHhmMCwgMHg0NywgMHhiOSwgMHgxYiwgMHg1NCwgMHg2Zn07Ci0KLSAgdWludDhfdCBvdXRwdXRbMTZdOwotICBhZXNfY29udGV4dCBjdHg7Ci0gIGFlc19zZXRfa2V5KGssIHNpemVvZihrKSwgJmN0eCk7Ci0gIGFlc19lbmNyeXB0KG0sIG91dHB1dCwgJmN0eCk7IC8qIG91dHB1dHMgaW4gYnl0ZSA0OCB0byBieXRlIDYzICovCi0KLSAgRVhQRUNUX1RSVUUobWVtY21wKG91dHB1dCwgYWVzX2NtYWNfa19tLCBPQ1RFVDE2X0xFTikgPT0gMCk7Ci0KLSAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSAgLy8gTE9HKElORk8pIDw8ICJrICIgPDwgYmFzZTo6SGV4RW5jb2RlKGssIE9DVEVUMTZfTEVOKTsKLSAgLy8gTE9HKElORk8pIDw8ICJtICIgPDwgYmFzZTo6SGV4RW5jb2RlKG0sIHNpemVvZihtKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCAib3V0cHV0ICIgPDwgYmFzZTo6SGV4RW5jb2RlKG91dHB1dCwgT0NURVQxNl9MRU4pOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC4xLjEKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzFfMV90ZXN0KSB7Ci0gIE9jdGV0MTYga3sweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LCAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjfTsKLQotICBPY3RldDE2IGFlc19jbWFjX2tfbXsweGJiLCAweDFkLCAweDY5LCAweDI5LCAweGU5LCAweDU5LCAweDM3LCAweDI4LCAweDdmLCAweGEzLCAweDdkLCAweDEyLCAweDliLCAweDc1LCAweDY3LCAweDQ2fTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihrKSwgc3RkOjplbmQoaykpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihhZXNfY21hY19rX20pLCBzdGQ6OmVuZChhZXNfY21hY19rX20pKTsKLQotICBPY3RldDE2IG91dHB1dCA9IGFlc19jbWFjKGssIG51bGxwdHIgLyogZW1wdHkgbWVzc2FnZSAqLywgMCk7Ci0KLSAgRVhQRUNUX0VRKG91dHB1dCwgYWVzX2NtYWNfa19tKTsKLQotICAvLyB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICAvLyBMT0coSU5GTykgPDwgImsgIiA8PCBiYXNlOjpIZXhFbmNvZGUoay5kYXRhKCksIGsuc2l6ZSgpKTsKLSAgLy8gTE9HKElORk8pIDw8ICJhZXNfY21hYyhrLG51bGxwdHIpICIKLSAgLy8gICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZShvdXRwdXQuZGF0YSgpLCBvdXRwdXQuc2l6ZSgpKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMS4yCi1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8xXzJfdGVzdCkgewotICBPY3RldDE2IGt7MHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzY307Ci0KLSAgT2N0ZXQxNiBtID0gezB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmF9OwotCi0gIE9jdGV0MTYgYWVzX2NtYWNfa19tezB4MDcsIDB4MGEsIDB4MTYsIDB4YjQsIDB4NmIsIDB4NGQsIDB4NDEsIDB4NDQsIDB4ZjcsIDB4OWIsIDB4ZGQsIDB4OWQsIDB4ZDAsIDB4NGEsIDB4MjgsIDB4N2N9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGspLCBzdGQ6OmVuZChrKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKG0pLCBzdGQ6OmVuZChtKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGFlc19jbWFjX2tfbSksIHN0ZDo6ZW5kKGFlc19jbWFjX2tfbSkpOwotCi0gIE9jdGV0MTYgb3V0cHV0ID0gYWVzX2NtYWMoaywgbSk7Ci0KLSAgRVhQRUNUX0VRKG91dHB1dCwgYWVzX2NtYWNfa19tKTsKLQotICAvLyB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICAvLyBMT0coSU5GTykgPDwgImsgIiA8PCBiYXNlOjpIZXhFbmNvZGUoay5kYXRhKCksIGsuc2l6ZSgpKTsKLSAgLy8gTE9HKElORk8pIDw8ICJtICIgPDwgYmFzZTo6SGV4RW5jb2RlKG0sIHNpemVvZihtKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCAiYWVzX2NtYWMoayxtKSAiCi0gIC8vICAgICAgICAgICA8PCBiYXNlOjpIZXhFbmNvZGUob3V0cHV0LmRhdGEoKSwgb3V0cHV0LnNpemUoKSk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjEuMwotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY19leGFtcGxlX2RfMV8zX3Rlc3QpIHsKLSAgT2N0ZXQxNiBrezB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2N9OwotCi0gIHVpbnQ4X3QgbVtdID0gezB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsCi0gICAgICAgICAgICAgICAgIDB4MTcsIDB4MmEsIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsCi0gICAgICAgICAgICAgICAgIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTF9OwotCi0gIE9jdGV0MTYgYWVzX2NtYWNfa19tezB4ZGYsIDB4YTYsIDB4NjcsIDB4NDcsIDB4ZGUsIDB4OWEsIDB4ZTYsIDB4MzAsIDB4MzAsIDB4Y2EsIDB4MzIsIDB4NjEsIDB4MTQsIDB4OTcsIDB4YzgsIDB4Mjd9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGspLCBzdGQ6OmVuZChrKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKG0pLCBzdGQ6OmVuZChtKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGFlc19jbWFjX2tfbSksIHN0ZDo6ZW5kKGFlc19jbWFjX2tfbSkpOwotCi0gIE9jdGV0MTYgb3V0cHV0ID0gYWVzX2NtYWMoaywgbSwgc2l6ZW9mKG0pKTsKLSAgRVhQRUNUX0VRKG91dHB1dCwgYWVzX2NtYWNfa19tKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMS40Ci1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8xXzRfdGVzdCkgewotICBPY3RldDE2IGt7MHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzY307Ci0KLSAgdWludDhfdCBtW10gPSB7MHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKLSAgICAgICAgICAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKLSAgICAgICAgICAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKLSAgICAgICAgICAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMH07Ci0KLSAgT2N0ZXQxNiBhZXNfY21hY19rX217MHg1MSwgMHhmMCwgMHhiZSwgMHhiZiwgMHg3ZSwgMHgzYiwgMHg5ZCwgMHg5MiwgMHhmYywgMHg0OSwgMHg3NCwgMHgxNywgMHg3OSwgMHgzNiwgMHgzYywgMHhmZX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oayksIHN0ZDo6ZW5kKGspKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4obSksIHN0ZDo6ZW5kKG0pKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oYWVzX2NtYWNfa19tKSwgc3RkOjplbmQoYWVzX2NtYWNfa19tKSk7Ci0KLSAgT2N0ZXQxNiBvdXRwdXQgPSBhZXNfY21hYyhrLCBtLCBzaXplb2YobSkpOwotCi0gIEVYUEVDVF9FUShvdXRwdXQsIGFlc19jbWFjX2tfbSk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjIKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzJfdGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1ezB4MjAsIDB4YjAsIDB4MDMsIDB4ZDIsIDB4ZjIsIDB4OTcsIDB4YmUsIDB4MmMsIDB4NWUsIDB4MmMsIDB4ODMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHhhNywgMHhlOSwgMHhmOSwgMHhhNSwgMHhiOSwgMHhlZiwgMHhmNCwgMHg5MSwgMHgxMSwgMHhhYywgMHhmNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweGZkLCAweGRiLCAweGNjLCAweDAzLCAweDAxLCAweDQ4LCAweDBlLCAweDM1LCAweDlkLCAweGU2fTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdnsweDU1LCAweDE4LCAweDhiLCAweDNkLCAweDMyLCAweGY2LCAweGJiLCAweDlhLCAweDkwLCAweDBhLCAweGZjLAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmIsIDB4ZWUsIDB4ZDQsIDB4ZTcsIDB4MmEsIDB4NTksIDB4Y2IsIDB4OWEsIDB4YzIsIDB4ZjEsIDB4OWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHg3YywgMHhmYiwgMHg2YiwgMHg0ZiwgMHhkZCwgMHg0OSwgMHhmNCwgMHg3ZiwgMHhjNSwgMHhmZH07Ci0gIE9jdGV0MTYgeHsweGQ1LCAweGNiLCAweDg0LCAweDU0LCAweGQxLCAweDc3LCAweDczLCAweDNlLCAweGZmLCAweGZmLCAweGIyLCAweGVjLCAweDcxLCAweDJiLCAweGFlLCAweGFifTsKLSAgdWludDhfdCB6ID0gMHgwMDsKLQotICBPY3RldDE2IGFlc19jbWFjX2tfbXsweGYyLCAweGM5LCAweDE2LCAweGYxLCAweDA3LCAweGE5LCAweGJkLCAweDFjLCAweGYxLCAweGVkLCAweGExLCAweGJlLCAweGE5LCAweDc0LCAweDg3LCAweDJkfTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih1KSwgc3RkOjplbmQodSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih2KSwgc3RkOjplbmQodikpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih4KSwgc3RkOjplbmQoeCkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihhZXNfY21hY19rX20pLCBzdGQ6OmVuZChhZXNfY21hY19rX20pKTsKLQotICBPY3RldDE2IG91dHB1dCA9IGY0KHUuZGF0YSgpLCB2LmRhdGEoKSwgeCwgeik7Ci0KLSAgRVhQRUNUX0VRKG91dHB1dCwgYWVzX2NtYWNfa19tKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMwotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY19leGFtcGxlX2RfM190ZXN0KSB7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IGRoa2V5X3d7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwgMHgzNCwgMHgxMCwgMHgxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGE2LCAweDBhLCAweDM5LCAweDdkLCAweDliLCAweDk5LCAweDc5LCAweDZiLCAweDEzLCAweGI0LCAweGY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsIDB4ZjEsIDB4ODYsIDB4OGQsIDB4MzQsIDB4ZjMsIDB4NzMsIDB4YmYsIDB4YTYsIDB4OTh9OwotICBPY3RldDE2IG4xezB4ZDUsIDB4Y2IsIDB4ODQsIDB4NTQsIDB4ZDEsIDB4NzcsIDB4NzMsIDB4M2UsIDB4ZmYsIDB4ZmYsIDB4YjIsIDB4ZWMsIDB4NzEsIDB4MmIsIDB4YWUsIDB4YWJ9OwotICBPY3RldDE2IG4yezB4YTYsIDB4ZTgsIDB4ZTcsIDB4Y2MsIDB4MjUsIDB4YTcsIDB4NWYsIDB4NmUsIDB4MjEsIDB4NjUsIDB4ODMsIDB4ZjcsIDB4ZmYsIDB4M2QsIDB4YzQsIDB4Y2Z9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDc+IGExezB4MDAsIDB4NTYsIDB4MTIsIDB4MzcsIDB4MzcsIDB4YmYsIDB4Y2V9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDc+IGEyezB4MDAsIDB4YTcsIDB4MTMsIDB4NzAsIDB4MmQsIDB4Y2YsIDB4YzF9OwotCi0gIE9jdGV0MTYgZXhwZWN0ZWRfbHRrezB4NjksIDB4ODYsIDB4NzksIDB4MTEsIDB4NjksIDB4ZDcsIDB4Y2QsIDB4MjMsIDB4OTgsIDB4MDUsIDB4MjIsIDB4YjUsIDB4OTQsIDB4NzUsIDB4MGEsIDB4Mzh9OwotICBPY3RldDE2IGV4cGVjdGVkX21hY19rZXl7Ci0gICAgICAweDI5LCAweDY1LCAweGYxLCAweDc2LCAweGExLCAweDA4LCAweDRhLCAweDAyLCAweGZkLCAweDNmLCAweDZhLCAweDIwLCAweGNlLCAweDYzLCAweDZlLCAweDIwfTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihkaGtleV93KSwgc3RkOjplbmQoZGhrZXlfdykpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihuMSksIHN0ZDo6ZW5kKG4xKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKG4yKSwgc3RkOjplbmQobjIpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oYTEpLCBzdGQ6OmVuZChhMSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihhMiksIHN0ZDo6ZW5kKGEyKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2x0ayksIHN0ZDo6ZW5kKGV4cGVjdGVkX2x0aykpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihleHBlY3RlZF9tYWNfa2V5KSwgc3RkOjplbmQoZXhwZWN0ZWRfbWFjX2tleSkpOwotCi0gIE9jdGV0MTYgbWFjX2tleSwgbHRrOwotICBmNShkaGtleV93LmRhdGEoKSwgbjEsIG4yLCBhMS5kYXRhKCksIGEyLmRhdGEoKSwgJm1hY19rZXksICZsdGspOwotCi0gIEVYUEVDVF9FUShtYWNfa2V5LCBleHBlY3RlZF9tYWNfa2V5KTsKLSAgRVhQRUNUX0VRKGx0aywgZXhwZWN0ZWRfbHRrKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuNAotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY19leGFtcGxlX2RfNF90ZXN0KSB7Ci0gIE9jdGV0MTYgbjF7MHhkNSwgMHhjYiwgMHg4NCwgMHg1NCwgMHhkMSwgMHg3NywgMHg3MywgMHgzZSwgMHhmZiwgMHhmZiwgMHhiMiwgMHhlYywgMHg3MSwgMHgyYiwgMHhhZSwgMHhhYn07Ci0gIE9jdGV0MTYgbjJ7MHhhNiwgMHhlOCwgMHhlNywgMHhjYywgMHgyNSwgMHhhNywgMHg1ZiwgMHg2ZSwgMHgyMSwgMHg2NSwgMHg4MywgMHhmNywgMHhmZiwgMHgzZCwgMHhjNCwgMHhjZn07Ci0gIE9jdGV0MTYgcnsweDEyLCAweGEzLCAweDM0LCAweDNiLCAweGI0LCAweDUzLCAweGJiLCAweDU0LCAweDA4LCAweGRhLCAweDQyLCAweGQyLCAweDBjLCAweDJkLCAweDBmLCAweGM4fTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gSU9jYXB7MHgwMSwgMHgwMSwgMHgwMn07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGExezB4MDAsIDB4NTYsIDB4MTIsIDB4MzcsIDB4MzcsIDB4YmYsIDB4Y2V9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhMnsweDAwLCAweGE3LCAweDEzLCAweDcwLCAweDJkLCAweGNmLCAweGMxfTsKLQotICBPY3RldDE2IE1hY0tleXsweDI5LCAweDY1LCAweGYxLCAweDc2LCAweGExLCAweDA4LCAweDRhLCAweDAyLCAweGZkLCAweDNmLCAweDZhLCAweDIwLCAweGNlLCAweDYzLCAweDZlLCAweDIwfTsKLQotICBPY3RldDE2IGV4cGVjdGVkX2Flc19jbWFjewotICAgICAgMHhlMywgMHhjNCwgMHg3MywgMHg5OCwgMHg5YywgMHhkMCwgMHhlOCwgMHhjNSwgMHhkMiwgMHg2YywgMHgwYiwgMHgwOSwgMHhkYSwgMHg5NSwgMHg4ZiwgMHg2MX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4objEpLCBzdGQ6OmVuZChuMSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihuMiksIHN0ZDo6ZW5kKG4yKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKHIpLCBzdGQ6OmVuZChyKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKElPY2FwKSwgc3RkOjplbmQoSU9jYXApKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oYTEpLCBzdGQ6OmVuZChhMSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihhMiksIHN0ZDo6ZW5kKGEyKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKE1hY0tleSksIHN0ZDo6ZW5kKE1hY0tleSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihleHBlY3RlZF9hZXNfY21hYyksIHN0ZDo6ZW5kKGV4cGVjdGVkX2Flc19jbWFjKSk7Ci0KLSAgT2N0ZXQxNiBhZXNfY21hYyA9IGY2KE1hY0tleSwgbjEsIG4yLCByLCBJT2NhcC5kYXRhKCksIGExLmRhdGEoKSwgYTIuZGF0YSgpKTsKLQotICBFWFBFQ1RfRVEoYWVzX2NtYWMsIGV4cGVjdGVkX2Flc19jbWFjKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuNQotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY19leGFtcGxlX2RfNV90ZXN0KSB7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IHV7MHgyMCwgMHhiMCwgMHgwMywgMHhkMiwgMHhmMiwgMHg5NywgMHhiZSwgMHgyYywgMHg1ZSwgMHgyYywgMHg4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGE3LCAweGU5LCAweGY5LCAweGE1LCAweGI5LCAweGVmLCAweGY0LCAweDkxLCAweDExLCAweGFjLCAweGY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmQsIDB4ZGIsIDB4Y2MsIDB4MDMsIDB4MDEsIDB4NDgsIDB4MGUsIDB4MzUsIDB4OWQsIDB4ZTZ9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiB2ezB4NTUsIDB4MTgsIDB4OGIsIDB4M2QsIDB4MzIsIDB4ZjYsIDB4YmIsIDB4OWEsIDB4OTAsIDB4MGEsIDB4ZmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmYiwgMHhlZSwgMHhkNCwgMHhlNywgMHgyYSwgMHg1OSwgMHhjYiwgMHg5YSwgMHhjMiwgMHhmMSwgMHg5ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdjLCAweGZiLCAweDZiLCAweDRmLCAweGRkLCAweDQ5LCAweGY0LCAweDdmLCAweGM1LCAweGZkfTsKLQotICBPY3RldDE2IHh7MHhkNSwgMHhjYiwgMHg4NCwgMHg1NCwgMHhkMSwgMHg3NywgMHg3MywgMHgzZSwgMHhmZiwgMHhmZiwgMHhiMiwgMHhlYywgMHg3MSwgMHgyYiwgMHhhZSwgMHhhYn07Ci0gIE9jdGV0MTYgeXsweGE2LCAweGU4LCAweGU3LCAweGNjLCAweDI1LCAweGE3LCAweDVmLCAweDZlLCAweDIxLCAweDY1LCAweDgzLCAweGY3LCAweGZmLCAweDNkLCAweGM0LCAweGNmfTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih1KSwgc3RkOjplbmQodSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih2KSwgc3RkOjplbmQodikpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih4KSwgc3RkOjplbmQoeCkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbih5KSwgc3RkOjplbmQoeSkpOwotCi0gIHVpbnQzMl90IHZhbCA9IGcyKHUuZGF0YSgpLCB2LmRhdGEoKSwgeCwgeSk7Ci0KLSAgLyogdGhlIHJldHVybmVkIHZhbHVlIGlzIGFscmVhZHkgbW9kIDEwMDAwMDAsIHNvIGRvIG1vZCBvbiB0aGUgdGVzdCByZXN1bHQKLSAgICogdmFsdWUgdG9vICovCi0gIEVYUEVDVF9FUSh2YWwsIDB4MmY5ZWQ1YmFVICUgMTAwMDAwMCk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjYKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzZfdGVzdCkgewotICBPY3RldDE2IGtleXsweGVjLCAweDAyLCAweDM0LCAweGEzLCAweDU3LCAweGM4LCAweGFkLCAweDA1LCAweDM0LCAweDEwLCAweDEwLCAweGE2LCAweDBhLCAweDM5LCAweDdkLCAweDlifTsKLSAgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlJRHsweDZjLCAweDY1LCAweDYyLCAweDcyfTsKLSAgT2N0ZXQxNiBleHBlY3RlZF9hZXNfY21hY3sKLSAgICAgIDB4MmQsIDB4OWEsIDB4ZTEsIDB4MDIsIDB4ZTcsIDB4NmQsIDB4YzksIDB4MWMsIDB4ZTgsIDB4ZDMsIDB4YTksIDB4ZTIsIDB4ODAsIDB4YjEsIDB4NjMsIDB4OTl9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGtleSksIHN0ZDo6ZW5kKGtleSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihrZXlJRCksIHN0ZDo6ZW5kKGtleUlEKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2Flc19jbWFjKSwgc3RkOjplbmQoZXhwZWN0ZWRfYWVzX2NtYWMpKTsKLQotICBPY3RldDE2IGFlc19jbWFjID0gaDYoa2V5LCBrZXlJRCk7Ci0gIEVYUEVDVF9FUShhZXNfY21hYywgZXhwZWN0ZWRfYWVzX2NtYWMpOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC43Ci1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF83X3Rlc3QpIHsKLSAgT2N0ZXQxNiBJUkt7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwgMHgzNCwgMHgxMCwgMHgxMCwgMHhhNiwgMHgwYSwgMHgzOSwgMHg3ZCwgMHg5Yn07Ci0gIE9jdGV0MTYgcHJhbmR7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg4MSwgMHg5NH07Ci0gIE9jdGV0MTYgZXhwZWN0ZWRfYWVzXzEyOHsKLSAgICAgIDB4MTUsIDB4OWQsIDB4NWYsIDB4YjcsIDB4MmUsIDB4YmUsIDB4MjMsIDB4MTEsIDB4YTQsIDB4OGMsIDB4MWIsIDB4ZGMsIDB4YzQsIDB4MGQsIDB4ZmIsIDB4YWF9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGV4cGVjdGVkX2FoezB4MGQsIDB4ZmIsIDB4YWF9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKElSSyksIHN0ZDo6ZW5kKElSSykpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihwcmFuZCksIHN0ZDo6ZW5kKHByYW5kKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2Flc18xMjgpLCBzdGQ6OmVuZChleHBlY3RlZF9hZXNfMTI4KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2FoKSwgc3RkOjplbmQoZXhwZWN0ZWRfYWgpKTsKLQotICBPY3RldDE2IHJlc3VsdCA9IGFlc18xMjgoSVJLLCBwcmFuZC5kYXRhKCksIDMpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfYWVzXzEyOCwgcmVzdWx0KTsKLQotICAvLyBsaXR0bGUvYmlnIGVuZGlhbiAyNCBiaXRzCi0gIEVYUEVDVF9FUShyZXN1bHRbMF0sIGV4cGVjdGVkX2FoWzBdKTsKLSAgRVhQRUNUX0VRKHJlc3VsdFsxXSwgZXhwZWN0ZWRfYWhbMV0pOwotICBFWFBFQ1RfRVEocmVzdWx0WzJdLCBleHBlY3RlZF9haFsyXSk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjgKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzhfdGVzdCkgewotICBPY3RldDE2IEtleXsweGVjLCAweDAyLCAweDM0LCAweGEzLCAweDU3LCAweGM4LCAweGFkLCAweDA1LCAweDM0LCAweDEwLCAweDEwLCAweGE2LCAweDBhLCAweDM5LCAweDdkLCAweDlifTsKLSAgT2N0ZXQxNiBTQUxUezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4NkQsIDB4NzAsIDB4MzF9OwotICBPY3RldDE2IGV4cGVjdGVkX2Flc19jbWFjewotICAgICAgMHhmYiwgMHgxNywgMHgzNSwgMHg5NywgMHhjNiwgMHhhMywgMHhjMCwgMHhlYywgMHhkMiwgMHg5OSwgMHg4YywgMHgyYSwgMHg3NSwgMHhhNSwgMHg3MCwgMHgxMX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oS2V5KSwgc3RkOjplbmQoS2V5KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKFNBTFQpLCBzdGQ6OmVuZChTQUxUKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2Flc19jbWFjKSwgc3RkOjplbmQoZXhwZWN0ZWRfYWVzX2NtYWMpKTsKLQotICBPY3RldDE2IGFlc19jbWFjID0gaDcoU0FMVCwgS2V5KTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2Flc19jbWFjLCBhZXNfY21hYyk7Ci19Ci0KLWV4dGVybiBPY3RldDE2IHNtcF9jYWxjdWxhdGVfbHRrX3RvX2xpbmtfa2V5KGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcpOwotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC45Ci1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF85X3Rlc3QpIHsKLSAgT2N0ZXQxNiBMVEt7MHgzNiwgMHg4ZCwgMHhmOSwgMHhiYywgMHhlMywgMHgyNiwgMHg0YiwgMHg1OCwgMHhiZCwgMHgwNiwgMHg2YywgMHgzMywgMHgzMywgMHg0ZiwgMHhiZiwgMHg2NH07Ci0gIE9jdGV0MTYgZXhwZWN0ZWRfbGlua19rZXl7Ci0gICAgICAweDI4LCAweDdhLCAweGQzLCAweDc5LCAweGRjLCAweGE0LCAweDAyLCAweDUzLCAweDBhLCAweDM5LCAweGYxLCAweGY0LCAweDMwLCAweDQ3LCAweGI4LCAweDM1fTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihMVEspLCBzdGQ6OmVuZChMVEspKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfbGlua19rZXkpLCBzdGQ6OmVuZChleHBlY3RlZF9saW5rX2tleSkpOwotCi0gIE9jdGV0MTYgbGlua19rZXkgPSBsdGtfdG9fbGlua19rZXkoTFRLLCB0cnVlKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2xpbmtfa2V5LCBsaW5rX2tleSk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjEwCi1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8xMF90ZXN0KSB7Ci0gIE9jdGV0MTYgTFRLezB4MzYsIDB4OGQsIDB4ZjksIDB4YmMsIDB4ZTMsIDB4MjYsIDB4NGIsIDB4NTgsIDB4YmQsIDB4MDYsIDB4NmMsIDB4MzMsIDB4MzMsIDB4NGYsIDB4YmYsIDB4NjR9OwotICBPY3RldDE2IGV4cGVjdGVkX2xpbmtfa2V5ewotICAgICAgMHhiYywgMHgxYywgMHhhNCwgMHhlZiwgMHg2MywgMHgzZiwgMHhjMSwgMHhiZCwgMHgwZCwgMHg4MiwgMHgzMCwgMHhhZiwgMHhlZSwgMHgzOCwgMHg4ZiwgMHhiMH07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oTFRLKSwgc3RkOjplbmQoTFRLKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2xpbmtfa2V5KSwgc3RkOjplbmQoZXhwZWN0ZWRfbGlua19rZXkpKTsKLQotICBPY3RldDE2IGxpbmtfa2V5ID0gbHRrX3RvX2xpbmtfa2V5KExUSywgZmFsc2UpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfbGlua19rZXksIGxpbmtfa2V5KTsKLX0KLQotLy8gLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMTEKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzExX3Rlc3QpIHsKLSAgT2N0ZXQxNiBsaW5rX2tleXsweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAxLCAweDAwLCAweDA5LCAweDA4LCAweDA3LCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAxLCAweDAwfTsKLSAgT2N0ZXQxNiBleHBlY3RlZF9sdGt7MHhlOCwgMHg1ZSwgMHgwOSwgMHhlYiwgMHg1ZSwgMHhjYywgMHhiMywgMHhlMiwgMHg2OSwgMHg0MSwgMHg4YSwgMHgxMywgMHgzMiwgMHgxMSwgMHhiYywgMHg3OX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4obGlua19rZXkpLCBzdGQ6OmVuZChsaW5rX2tleSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihleHBlY3RlZF9sdGspLCBzdGQ6OmVuZChleHBlY3RlZF9sdGspKTsKLQotICBPY3RldDE2IGx0ayA9IGxpbmtfa2V5X3RvX2x0ayhsaW5rX2tleSwgdHJ1ZSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9sdGssIGx0ayk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjEyCi1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8xMl90ZXN0KSB7Ci0gIE9jdGV0MTYgbGlua19rZXl7MHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMSwgMHgwMCwgMHgwOSwgMHgwOCwgMHgwNywgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMiwgMHgwMSwgMHgwMH07Ci0gIE9jdGV0MTYgZXhwZWN0ZWRfbHRrezB4YTgsIDB4MTMsIDB4ZmIsIDB4NzIsIDB4ZjEsIDB4YTMsIDB4ZGYsIDB4YTEsIDB4OGEsIDB4MmMsIDB4OWEsIDB4NDMsIDB4ZjEsIDB4MGQsIDB4MGEsIDB4MzB9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGxpbmtfa2V5KSwgc3RkOjplbmQobGlua19rZXkpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfbHRrKSwgc3RkOjplbmQoZXhwZWN0ZWRfbHRrKSk7Ci0KLSAgT2N0ZXQxNiBsdGsgPSBsaW5rX2tleV90b19sdGsobGlua19rZXksIGZhbHNlKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2x0aywgbHRrKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNyeXB0b190b29sYm94Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9kb2NzL2FyY2hpdGVjdHVyZS9hcmNoaXRlY3R1cmUubWQgYi9nZC9kb2NzL2FyY2hpdGVjdHVyZS9hcmNoaXRlY3R1cmUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGVjOGMuLjAwMDAwMDAKLS0tIGEvZ2QvZG9jcy9hcmNoaXRlY3R1cmUvYXJjaGl0ZWN0dXJlLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLSMgR2FiZWxkb3JzY2hlIEFyY2hpdGVjdHVyZQotCi1bVE9DXQotCi1UaGlzIGRvY3VtZW50IG91dGxpbmVzIHNvbWUgYXJjaGl0ZWN0dXJhbCBjb25zaWRlcmF0aW9ucyB3ZSd2ZSBtYWRlIHdoZW4KLWRldmVsb3BpbmcgdGhlIEdhYmVsZG9yc2NoZSAoR0QpIEJsdWV0b290aCBzdGFjay4KLQotIyMgVGhyZWFkaW5nIG1vZGVsCi0KLUZpcnN0IG9mIGFsbCwgdGhlIEdEIHN0YWNrIGRvZXMgbm90IGJ1aWxkIG9uIGNvbmNlcHRzIG9mIHRocmVhZHMuIEluc3RlYWQsIGl0Ci13b3JrcyB3aXRoIFtgSGFuZGxlcnNgXSgjaGFuZGxlcikuIEhvd2V2ZXIsIHNpbmNlIEdEIHVsdGltYXRlbHkgcnVucyBvbiBhbiBPUywKLWl0IHN0aWxsIG5lZWRzIHRvIGludGVyYWN0IHdpdGggcHJvY2Vzc2VzIGFuZCB0aHJlYWRzIGJlZm9yZSBhY2hpZXZpbmcgdGhlCi1bYEhhbmRsZXJgXSgjaGFuZGxlcikgYWJzdHJhY3Rpb24uCi0KLSMjIyBQcm9jZXNzZXMKLQotSW4gZ2VuZXJhbC4gdGhyZWUgdHlwZXMgb2YgcHJvY2Vzc2VzIGV4aXN0IGluIHRoZSBHRCBydW50aW1lIGVudmlyb25tZW50OgotCi0qKkFwcGxpY2F0aW9uIHByb2Nlc3NlcyoqCi06ICAgaW5jbHVkZSB0aGlyZC1wYXJ0eSBhcHBzLCBvdGhlciBzeXN0ZW0gY29tcG9uZW50cyBzdWNoIGFzIGF1ZGlvIGFuZCB0ZWxlY29tCi0gICAgc2VydmljZXMgdGhhdCBpbnRlcmFjdCB3aXRoIHRoZSBfQmx1ZXRvb3RoIHN0YWNrIHByb2Nlc3NfIEFQSXMgZGVmaW5lZAotICAgIHRocm91Z2ggdmFyaW91cyBSUEMvSVBDIG1ldGhvZHMgc3VjaCBhcyBCaW5kZXIsIFNvY2tldCBJUEMsIGdSUEMsIERCVVMuIGFuZAotICAgIHNvIG9uLCB1c2luZyBsYW5ndWFnZXMgc3VjaCBhcyBBSURMIG9yIFByb3RvYnVmLiBGb3IgQW5kcm9pZCBhcHBsaWNhdGlvbnMsCi0gICAgYWx0aG91Z2ggQVBJcyBhcmUgZGVmaW5lZCBpbiBBSURMLCBzb21lIGJvaWxlciBwbGF0ZSBjb2RlIGlzIHdyYXBwZWQgaW4gSmF2YQotICAgIGxpYnJhcmllcyBleHBvc2VkIHRocm91Z2ggY29kZSBpbgotICAgIFtgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aGBdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL3JlZnMvaGVhZHMvbWFzdGVyL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC8pCi0gICAgdGhhdCBpcyByZWxlYXNlZCB0byBkZXZlbG9wZXJzIGFzCi0gICAgW0FuZHJvaWQgU0RLXShodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvY29ubmVjdGl2aXR5L2JsdWV0b290aCkuCi0KLSoqSGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIgKEhBTCkgcHJvY2Vzc2VzKioKLTogICBvbmUgb3IgbWFueSBwcm9jZXNzZXMgZnJvbSB0aGUgdmVuZG9yIHBhcnRpdGlvbiwgYW5kIGhlbmNlIGlzIGhhcmR3YXJlCi0gICAgZGVwZW5lZGVudC4gVGhleSBpbnRlcmFjdCB3aXRoIHRoZSBfQmx1ZXRvb3RoIHN0YWNrIHByb2Nlc3NfIHZpYSBhIHNldCBvZgotICAgIGhhcmR3YXJlIGFic3RyYWN0aW9uIEFQSXMgZGVmaW5lZCB0aHJvdWdoIFJQQy9JUEMgbWV0aG9kcyBzdWNoIGFzIEJpbmRlciwKLSAgICBTb2NrZXQgSVBDLCBEQlVTLCBhbmQgc28gb24sIHVzaW5nIGxhbmd1YWdlcyBzdWNoIGFzIEhJREwuIE9uIEFuZHJvaWQsIHRoaXMKLSAgICB3b3VsZCBiZSBIQUwgcHJvY2Vzc2VzIHRoYXQgaW1wbGVtZW50IEhJREwgQVBJcyBzdWNoIGFzCi0gICAgW0lCbHVldG9vdGhIY2ldKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2hhcmR3YXJlL2ludGVyZmFjZXMvKy9yZWZzL2hlYWRzL21hc3Rlci9ibHVldG9vdGgvMS4xL0lCbHVldG9vdGhIY2kuaGFsKQotICAgIGFuZAotICAgIFtJQmx1ZXRvb3RoQXVkaW9Qcm92aWRlcl0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vaGFyZHdhcmUvaW50ZXJmYWNlcy8rL3JlZnMvaGVhZHMvbWFzdGVyL2JsdWV0b290aC9hdWRpby8yLjAvSUJsdWV0b290aEF1ZGlvUHJvdmlkZXIuaGFsKS4KLQotKipCbHVldG9vdGggc3RhY2sgcHJvY2VzcyoqCi06ICAgdHlwaWNhbGx5IG9uZSBzaW5nbGUgcHJvY2VzcyB0aGF0IGltcGxlbWVudHMgdmFyaW91cyBCbHVldG9vdGggcHJvdG9jb2xzIGFuZAotICAgIHByb2ZpbGVzIGFib3ZlIHRoZSBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIChIQ0kpIGFuZCBiZWxvdyB0aGUgQmx1ZXRvb3RoCi0gICAgU0RLIEFQSXMuIE9uIG9uZSBoYW5kLCBpdCBzZXJ2Y2VzIHRoZSByZXF1ZXN0cyBmcm9tIF9BcHBsaWNhdGlvbiBwcm9jZXNzZXNfOwotICAgIG9uIHRoZSBvdGhlciBoYW5kLCBpdCBmb3J3YXJkcyB0aGVzZSByZXF1ZXN0cyB2aWEgaW50ZXJhY3Rpb25zIHdpdGggX0hBTAotICAgIHByb2Nlc3Nlc18uIE9uIEFuZHJvaWQsIHRoaXMgcHJvY2VzcyB0eXBpY2FsbHkgcnVucyB1bmRlciBBSURfQkxVRVRPT1RICi0gICAgKHVzdWFsbHkgMTAwMikgd2l0aCBwcm9jZXNzIG5hbWUgImNvbS5hbmRyb2lkLmJsdWV0b290aCIuIFRoZSBwcm9jZXNzIGlzCi0gICAgc3RhcnRlZCBpbiBKYXZhIGFuZCBsb2FkcyBuYXRpdmUgbGlicmFyaWVzIHRocm91Z2ggSk5JLiBPdGhlciBzeXN0ZW1zIHRoYXQKLSAgICBkbyBub3QgdXNlIEphdmEgdmlydHVhbCBtYWNoaW5lIG1heSBoYXZlIGEgcHVyZSBuYXRpdmUgcHJvY2Vzcy4gTXVsdGlwbGUKLSAgICB0aHJlYWRzIG1heSBleGlzdCBpbiB0aGlzIHByb2Nlc3MgZm9yIHZhcmlvdXMgcmVhc29ucy4gVGhlIEdEIHN0YWNrIHJ1bnMKLSAgICBlbnRpcmVseSBpbiB0aGlzIHByb2Nlc3MuCi0KLSMjIyBUaHJlYWRzIGluIEJsdWV0b290aCBzdGFjayBwcm9jZXNzCi0KLUN1cnJlbnRseSwgdGhlIGdvYWxzIG9mIHRocmVhZCBvcHRpbWl6YXRpb24gaW4gdGhlIEJsdWV0b290aCBzdGFjayBhcmU6Ci0KLSogICBSZWR1Y2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gc2ltcGxpZnkgc3luY2hyb25pemF0aW9uCi0qICAgRG8gYmxvY2tpbmcgSS9PIG9wZXJhdGlvbnMgaW4gc2VwYXJhdGUgdGhyZWFkcwotKiAgIFRyeSBtb3ZpbmcgSS9PIG9wZXJhdGlvbnMgaW50byBwb2xsaW5nIG1vZGUgc28gdGhhdCB3ZSBjYW4gdXNlIGV2ZW50IGRyaXZlbgotICAgIG1ldGhvZHMgdG8gaW50ZXJhY3Qgd2l0aCBpdCBvbiBtYWluIHRocmVhZAotKiAgIE1vdmUgYWxhcm0gYW5kIHRpbWVyIG1lY2hhbmlzbXMgdG8gdGhlaXIgY2FsbGluZyB0aHJlYWRzIHRvIGF2b2lkIGEgc2VwYXJhdGUKLSAgICBhbGFybSB0aHJlYWQKLSogICBJc29sYXRlIGluZGl2aWR1YWwgY29tcG9uZW50cyBzbyB0aGF0IGVhY2ggY29tcG9uZW50IGNhbiBiZSBzdGFydGVkIGFuZAotICAgIHN0b3BwZWQgaW5kaXZpZHVhbGx5IHdpdGhvdXQgdGVybWluYXRpbmcgdGhlIG1haW4gdGhyZWFkCi0qICAgUHJlZmVyIGRhdGEgcGFzc2luZyBvdmVyIGRhdGEgc2hhcmluZyBhbW9uZyB0aHJlYWRzIHRvIHJlZHVjZSBsb2NraW5nIGFuZAotICAgIHJhY2UgY29uZGl0aW9ucwotCi1BZnRlciBhYm92ZSBvcHRpbWl6YXRpb24sIHdlIGFyZSBsZWZ0IHdpdGggZml2ZSBtYWluIHR5cGVzIG9mIHRocmVhZHMgd2l0aGluIHRoZQotbmF0aXZlIGNvZGU6Ci0KLSoqTWFpbiB0aHJlYWQqKgotOiAgIFRoZSBtYWluIHdvcmtob3JzZSBpbiB0aGUgQmx1ZXRvb3RoIHN0YWNrLiBUaGUgdGhyZWFkJ3MgZXhlY3V0aW9uIGNvbnRleHQgaXMKLSAgICBmdXJ0aGVyIGRpdmlkZWQgaW50byBbYEhhbmRsZXJzYF0oI2hhbmRsZXIpIHRoYXQgcmVzaWRlIGluIGluZGl2aWR1YWwKLSAgICBbYE1vZHVsZXNgXSgjbW9kdWxlKS4gVGhpcyB0aHJlYWQgY2FuIGJlIGRpdmlkZWQgZnVydGhlciBpbnRvIHNtYWxsZXIgb25lcwotICAgIGlmIHBlcmZvcm1hbmNlIGlzIGNvbnN0cmFpbmVkIG9uIHRoZSBydW5uaW5nIHBsYXRmb3JtLiBEZXBsb3llciBqdXN0IG5lZWRzCi0gICAgdG8gYmluZCBoYW5kbGVycyB0byBkaWZmZXJlbnQgdGhyZWFkcyBhbmQgdGhhdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgb3ZlcmFsbAotICAgIG9wZXJhdGlvbi4KLQotKipKTkkgdGhyZWFkKioKLTogICBJbiB0aGUgbmF0aXZlIHRocmVhZCwgd2UgdHJlYXQgdGhlIEphdmEgbGF5ZXIgYXMgYSBzZXBhcmF0ZSBhcHBsaWNhdGlvbiBhcwotICAgIGl0cyB0aHJlYWRpbmcgbW9kdWxlIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50LiBUaGVyZWZvcmUsIHdlIHB1dCBhIHRocmVhZAotICAgIGJldHdlZW4gdGhlc2UgdHdvIGxheWVycyB0byBidWZmZXIgYW55IGJsb2NraW5nIG9wZXJhdGlvbi4KLQotKipIQ0kgdGhyZWFkIChvciBvdGhlciBIVyBJL08gdGhyZWFkKSoqCi06ICAgVGhpcyB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIGRlYWRsaW5nIHdpdGggaGFyZHdhcmUgSS9PIGFuZCBjYW4gYmUKLSAgICBwb3RlbnRpYWxseSBibG9ja2luZy4gSGVuY2UgaXQgaGFzIGl0cyBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgYmxvY2tpbmcgdGhlCi0gICAgbWFpbiB0aHJlYWQuCi0KLSoqQXVkaW8gd29ya2VyIHRocmVhZCoqCi06ICAgUmVzcG9uc2libGUgZm9yIGF1ZGlvIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBoaWdoZXIKLSAgICBwcmVjaXNpb24gZXhlY3V0aW9uIHRpbWluZy4gU3VjaCB3b3JrZXIgaGFzIGl0cyBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQKLSAgICBiZWluZyBhZmZlY3RlZCBieSB0aGUgbWFpbiB0aHJlYWQuCi0KLSoqU29ja2V0IEkvTyB0aHJlYWQqKgotOiAgIENvbW11bmljYXRlIHdpdGggdmFyaW91cyBhcHBsaWNhdGlvbnMgdGhhdCB1c2VzIHRoZQotICAgIFtgQmx1ZXRvb3RTb2NrZXRgXShodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU29ja2V0KQotICAgIGludGVyZmFjZS4gSXQgaGFzIGl0cyBzZXBlYXJhdGUgdGhyZWFkIGR1ZSB0byBwb3RlbnRpYWwgSS9PIGRlbGF5LgotCi0jIyMgRGF0YSBmbG93IGRpYWdyYW0KLQotRnVuY3Rpb24gaW52b2NhdGlvbnMgYmV0d2VlbiBkaWZmZXJlbnQgY29tcG9uZW50cyBhcmUgYWJzdHJhY3RlZCBhcyBjb250cm9sCi1wYWNrZXRzIChmdW5jdGlvbiBjbG9zdXJlKSBwYXNzZWQgdGhyb3VnaCBxdWV1ZXMuIERhdGEgZmxvdyBiZXR3ZWVuIGNvbXBvbmVudHMKLWFyZSBkYXRhIHBhY2tldHMgc2VudCB0aHJvdWdoIHF1ZXVlcywgc2lnbmFsZWQgdXNpbmcgW2BSZWFjdG9yYF0oI3JlYWN0b3IpLiBUaGV5Ci13aWxsIG1lcmdlIHRvIHRoZSBpbnB1dCBxdWV1ZSBmb3IgZWFjaCBjb21wb25lbnQuIFdlIGRlZmluZSB0aHJlZSB0eXBlcyBvZgotcXVldWVzOgotCi0qKk5vbi1ibG9ja2luZyBxdWV1ZSoqCi06ICAgV2hlbiB1c2VycyB0cnkgdG8gZGVxdWV1ZSB3aGVuIGl04oCZcyBlbXB0eSwgb3IgZW5xdWV1ZSB3aGVuIGl04oCZcyBmdWxsLCBpdAotICAgIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBBbGwgcXVldWVpbmcgd2l0aGluIGEgdGhyZWFkIG11c3QgYmUgbm9uLWJsb2NraW5nLAotICAgIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgZGVhZGxvY2suCi0KLSoqQmxvY2tpbmcgcXVldWUqKgotOiAgIFdoZW4gdXNlcnMgdHJ5IHRvIGRlcXVldWUgd2hlbiBpdOKAmXMgZW1wdHksIG9yIGVucXVldWUgd2hlbiBpdOKAmXMgZnVsbCwgaXQKLSAgICB3aWxsIGJsb2NrLCB1bnRpbCBvdGhlciB0aHJlYWQgbWFrZXMgdGhlIHF1ZXVlIHRvIGJlIHdyaXRhYmxlL3JlYWRhYmxlLiBJdAotICAgIGNhbiBiZSB1c2VkIGFzIGEgZmxvdyBjb250cm9sIG1lY2hhbmlzbSB0byBhdm9pZCB0b28gbWFueSBwYWNrZXRzIGZyb20gdXNlcgotICAgIHRocmVhZC4KLQotKipMZWFreSBxdWV1ZSoqCi06ICAgU2FtZSBhcyBub24tYmxvY2tpbmcgcXVldWUsIGJ1dCBpdCB3aWxsIGZsdXNoIHdoZW4gaXTigJlzIGZ1bGwgYW5kIHVzZXIgdHJpZXMKLSAgICB0byBlbnF1ZXVlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXVkaW8gZW5jb2RpbmcuCi0KLSFbVGhyZWFkaW5nIE1vZGVsXSguL2RhdGFfZmxvd19kaWFncmFtLnBuZykKLQotIyMgQnVpbGRpbmcgYmxvY2tzCi0KLSMjIyBNb2R1bGUgeyNtb2R1bGV9Ci0KLUNvZGUgaW4gR0QgaXMgcGFja2VkIGludG8gQysrIG9iamVjdHMgY2FsbGVkCi1bYE1vZHVsZWBdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL21hc3Rlci9nZC9tb2R1bGUuaCkuCi1BIG1vZHVsZSBzdGFuZGFyZGl6ZWQgdGhlIGZvbGxvd2luZyBhc3BlY3RzIG9mIEdEIGNvZGU6Ci0KLSogICAqKkRlcGVuZGVuY2llcyoqOiBBIG1vZHVsZSBwcm92aWRlcyBpdHMgb3duIGRlcGVuZGVuY2llcyBvbiBvdGhlciBtb2R1bGVzIGJ5Ci0gICAgaW1wbGVtZW50aW5nIGBMaXN0RGVwZW5kZW5jaWVzKClgCi0qICAgKipMaWZlIEN5Y2xlKio6IEEgbW9kdWxlIG11c3QgaW1wbGVtZW50IGBTdGFydCgpYCBhbmQgYFN0b3AoKWAgbGlmZSBjeWNsZQotICAgIG1ldGhvZHMKLSogICAqKlRocmVhZGluZyBNb2R1bGUqKjogVGhlIGBNb2R1bGVgIGJhc2UgY2xhc3MgcHJvdmlkZXMgYSBgSGFuZGxlcmAgZm9yIGNvZGUKLSAgICBleGVjdXRpb24gY29udGV4dCB2aWEgYEdldEhhbmRsZXIoKWAKLSogICAqKk1ldHJpY3MqKjogQSBgTW9kdWxlYCBjYW4gZHVtcCBpdHMgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGR1bXBzeXMgdGhyb3VnaAotICAgIGBEdW1wU3RhdGUoKWAKLQotU2VlIGl0cyBkZWZpbml0aW9uIGF0OiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9tYXN0ZXIvZ2QvbW9kdWxlLmgKLQotIyMjIEhhbmRsZXIgeyNoYW5kbGVyfQotCi1TaW1pbGFyIHRvCi1bYGFuZHJvaWQub3MuSGFuZGxlcmBdKGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0hhbmRsZXIpLAotW2BibHVldG9vdGg6Om9zOjpIYW5kbGVyYF0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvbWFzdGVyL2dkL29zL2hhbmRsZXIuaCkKLXByb3ZpZGVzIGEgc2VxdWVudGlhbCBleGVjdXRpb24gY29udGV4dCB3aGlsZSBoaWRpbmcgdGhlIGNvbmNlcHQgb2YgdGhyZWFkIGZyb20KLXRoZSBleGVjdXRpbmcgY29kZS4KLQotQnkgc2NvcGluZyBleGVjdXRpb24gY29udGV4dCBpbnRvIHNtYWxsZXIgYXJlYXMsIGBIYW5kbGVyYCBiZW5lZml0cyBkZXZlbG9wbWVudAotaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotCi0qICAgTGVzcyBuZWVkIGZvciBsb2NraW5nIGR1ZSB0byBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBjb250ZXh0Ci0qICAgU21hbGxlciBjb250ZXh0IGxlYWRzIHRvIGVhc2llciBtYW5hZ2VtZW50IG9mIGNvZGUgZmxvdwotKiAgIFNlcGFyYXRpb24gZnJvbSB0aHJlYWQgZ2l2ZXMgc3lzdGVtIGRlcGxveWVyIG1vcmUgZnJlZWRvbSB0byB0d2VhayB0aGUKLSAgICB1bmRlcmx5aW5nIHRocmVhZCBhbGxvY2F0aW9uLiBGb3IgZXhhbXBsZSwgZm9yIHJlYWwgdGltZSBPUyB3aXRob3V0IGZ1bGwKLSAgICB0aHJlYWQgaW1wbGVtZW50YXRpb24sIGEgYEhhbmRsZXJgIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYSBuZWFyLXRocmVhZAotICAgIGV4ZWN1dGlvbiBjb250ZXh0Ci0KLU9mIGNvdXJzZSwgdGhlcmUgYXJlIGRvd25zaWRlcyBvZiB1c2luZyBgSGFuZGxlcmAsIHdoaWNoIGRldmVsb3BlcnMgc2hvdWxkIGJlCi1jYXV0aW91cyBhYm91dDoKLQotV0FSTklORzogQWx0aG91Z2ggbXVsdGlwbGUgYEhhbmRsZXJgIGNvdWxkIGJpbmQgdG8gdGhlIHNhbWUgdGhyZWFkLCBgSGFuZGxlcmAKLWRvZXMgbm90IGd1cmFudGVlIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIGNvZGUgYWNyb3NzIGRpZmZlcmVudCBgSGFuZGxlcmAgZXZlbgotd2hlbiB0aGUgYXJlIG9uIHRoZSBzYW1lIHRocmVhZC4KLQotV0FSTklORzogTG9ja2luZyBhbW9uZyBgSGFuZGxlcnNgIHRoYXQgd2VyZSBib3VuZCB0byB0aGUgc2FtZSB0aHJlYWQgbWF5IHJlc3VsdAotaW4gZGVhZGxvY2sKLQotV0FSTklORzogRGF0YSBtdXN0IGJlIGNvcGllZCBiZXR3ZWVuIGBIYW5kbGVyYCB0byBhdm9pZCBib3RoIGRlYWRsb2NrIGFuZCByYWNlCi1jb25kaXRpb24KLQotU2VlIGl0cyBkZWZpbml0aW9uIGF0OiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9tYXN0ZXIvZ2Qvb3MvaGFuZGxlci5oCi0KLSMjIyBSZWFjdG9yIHsjcmVhY3Rvcn0KLQotW2BibHVldG9vdGg6Om9zOlJlYWN0b3JgXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9tYXN0ZXIvZ2Qvb3MvcmVhY3Rvci5oKQotaW1wbGVtZW50cyB0aGUKLVtSZWFjdG9yIERlc2lnbiBQYXR0ZXJuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWFjdG9yX3BhdHRlcm4pLCBpbgotd2hpY2ggY29uY3VycmVudCBfRXZlbnRzXyBhcmUgZGVtdWx0aXBsZXhlZCBieSBhIF9TeW5jaHJvbm91cyBFdmVudAotRGVtdWx0aXBsZXhlcl8gdG8gYSBsaXN0IG9mIF9SZXF1ZXN0IEhhbmRsZXJzXyByZWdpc3RlcmVkIHRocm91Z2ggYQotX0Rpc3BhdGNoZXJfLgotCi1JbiBhIGdlbmVyaWMgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgc3VjaCBhcyBBbmRyb2lkLCB3ZSBpbXBsZW1lbnRlZCBpdCB1c2luZwotZmlsZSBkZXNjcmlwdG9ycyBzdWNoIGFzCi1bZXZlbnRmZF0oaHR0cDovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW4yL2V2ZW50ZmQuMi5odG1sKSBmb3IgYEhhbmRsZXJgLAotW3RpbWVyZmRdKGh0dHA6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuMi90aW1lcmZkX2NyZWF0ZS4yLmh0bWwpIGZvcgotYEFsYXJtYCwgYW5kIFtzb2NrZXRmZF0oaHR0cDovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW4yL3NvY2tldC4yLmh0bWwpIGZvcgotZGF0YSBwcm9jZXNzaW5nIHBpcGVsaW5lcy4gSW4gdGhlIGNvbnRleHQgb2YgZmlsZSBkZXNjcmlwdG9ycywgZXZlbnRzIGFyZQotY2F0aWdvcml6ZWQgaW50byB0d28gdHlwZXM6Ci0KLSogICAqKk9uUmVhZFJlYWR5Kio6IG1lYW5zIHRoYXQgdGhlIGRlbXVsdGlwbGV4ZXIgaGFzIHNvbWUgZXZlbnRzIGZvciB0aGUKLSAgICBoYW5kbGVyIGFuZCB0aGUgaGFuZGxlciBjYW4gcmVhZCBhdCBsZWFzdCBvbmUgZXZlbnQgZnJvbSB0aGUgdW5kZXJseWluZwotICAgIGV2ZW50IHF1ZXVlLiBUaGlzIGlzIG9mdGVuIGFzc29jaWF0ZWQgd2l0aCBgRVBPTExJTmAsIGBFUE9MTEhVUGAsCi0gICAgYEVQT0xMUkRIVVBgLCBhbmQgYEVQT0xMRVJSYC4KLSogICAqKk9uV3JpdGVSZWFkeSoqOiBtZWFucyB0aGF0IHRoZSBkZW11bHRpcGxleGVyIGlzIHJlYWR5IHRvIGNvbnN1bWUgbW9yZQotICAgIGV2ZW50cyBmcm9tIHRoaXMgaGFuZGxlciwgYW5kIHRoZSBoYW5kbGVyIGNhbiB3cml0ZSBhdCBsZWFzdCBvbmUgZXZlbnQgdG8KLSAgICB0aGUgdW5kZXJseWluZyBxdWV1ZS4gdGhpcyBpcyBvZnRlbiBhc3NvY2lhdGVkIHdpdGggYEVQT0xMT1VUYC4KLQotVGhpcyBwYXR0ZXJuIG5hdHVyYWxseSBjcmVhdGVzIGEgYmFjayBwcmVzc3VyZSBmcm9tIG9uZSBxdWV1ZSB0byBhbm90aGVyIHdpdGhvdXQKLWFueSBleHRyYSBzaWduYWxpbmcgbWVjaGFuaXNtLiBXaGVuIHVzZWQgaW4gbmV0d29ya2luZyBzdGFjayBsaWtlIG91cnMsIGl0Ci1zaW1wbGlmaWVzIHRoZSBzaWduYWxpbmcgY29kZSBmbG93LgotCi1TZWUgaXRzIGRlZmluaXRpb24gYXQ6Ci1odHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9tYXN0ZXIvZ2Qvb3MvcmVhY3Rvci5oCi0KLUEgcHVyZSBkYXRhIHVzZSBjYXNlIG9mIGBSZWFjdG9yYCBpcyBhIGBSZWFjdGl2ZSBRdWV1ZWAsIHNlZSBpdHMgZGVmaW5pdGlvbiBhdDoKLWh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL21hc3Rlci9nZC9vcy9xdWV1ZS5oCi0KLSMjIFBhY2tldCBEZWZpbml0aW9uIExhbmd1YWdlIChQREwpCi0KLVBhY2tldCBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uIGhhcyBiZWVuIGEgYmlnIHBhcnQgb2YgYW55IG5ldHdvcmtpbmcgc3RhY2suIEl0Ci1pcyB1c3VhbGx5IHRoZSBmaXJzdCBzbmlwcGV0IG9mIGNvZGUgdGhhdCBpbnRlcmZhY2Ugd2l0aCBhIHJlbW90ZSBkZXZpY2UuIEluIHRoZQotcGFzdCwgdGhpcyBoYXMgYmVlbiBhY2hpZXZlZCBtYW51YWxseSB1c2luZyBtYWNyb3MgbGlrZSBgU1RSRUFNX1RPX1VOSVQ4YCBvcgotYFVJTlQ4X1RPX1NUUkVBTWAuIFRoaXMgbWFudWFsIG1ldGhvZCBpcyB0ZWRpb3VzIGFuZCBlcnJvcnByb25lLiBUbyBmaXggdGhpcywgd2UKLWNyZWF0ZWQgYSBQYWNrZXQgRGVmaW5pdGlvbiBMYW5ndWFnZSB0aGF0IGRlZmluZXMgbmV0d29ya2luZyBwYWNrZXQgc3RydWN0dXJlIHRvCi10aGUgYml0cyBsZXZlbC4gQysrIGhlYWRlcnMgYW5kIFB5dGhvbiBiaW5kaW5ncyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi1mcm9tIGl0cyBjb2RlIGdlbmVyYXRvciBhbmQgYW55IGZpeGVzIHRvIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGFwcGx5Ci1zeXN0ZW1hdGljYWxseSB0byBhbGwgcGFja2V0IGNvZGUgZ2VuZXJhdGVkLgotCi1FeGFtcGxlIFBETDoKLQotYGBgCi0vLyBDb21tZW50cwotbGl0dGxlX2VuZGlhbl9wYWNrZXRzIC8vIFdoZXRoZXIgdGhpcyBwYWNrZXQgaXMgYmlnIG9yIHNtYWxsIGVuZGlhbgotCi0vLyBJbmNsdWRlIGhlYWRlciBmcm9tIG90aGVyIEMrKyBoZWFkZXIgZmlsZXMKLWN1c3RvbV9maWVsZCBTaXhCeXRlcyA6IDQ4ICJwYWNrZXQvcGFyc2VyL3Rlc3QvIiAvLyBleHBlY3Qgc2l4X2J5dGVzLmgKLWN1c3RvbV9maWVsZCBWYXJpYWJsZSAicGFja2V0L3BhcnNlci90ZXN0LyIgLy8gZXhwZWN0IHZhcmlhYmxlLmgKLQotLy8gQSBwYWNrZXQKLXBhY2tldCBQYXJlbnQgewotICBfZml4ZWRfID0gMHgxMiA6IDgsIC8vIGZpeGVkIGZpZWxkIDB4MTIgdGhhdCB0YWtlcyA4IGJpdHMKLSAgX3NpemVfKF9wYXlsb2FkXykgOiA4LCAvLyBTaXplIGZpZWxkIHRoYXQgdGFrZXMgOCBiaXRzCi0gIF9wYXlsb2FkXywgLy8gc3BlY2lhbCBwYXlsb2FkIGZpZWxkIG9mIHZhcmlhYmxlIHNpemUKLSAgZm9vdGVyIDogOCwgLy8gZmlleGVkIHNpemUgZm9vdGVyIG9mIDggYml0cwotfQotCi1wYWNrZXQgQ2hpbGQgOiBQYXJlbnQgewotICBmaWVsZF9uYW1lIDogMTYsIC8vIGFkZGl0aW9uIGZpZWxkIGFwcGVuZCBhZnRlciBQYXJlbnQKLX0KLQotLy8gYW4gZW51bSBvZiA0IGJpdHMKLWVudW0gRm91ckJpdHMgOiA0IHsKLSAgT05FID0gMSwKLSAgVFdPID0gMiwKLSAgVEhSRUUgPSAzLAotICBGSVZFID0gNSwKLSAgVEVOID0gMTAsCi0gIExBWllfTUUgPSAxNSwKLX0KLWBgYAotCi1TZWUgaXRzIGRvY3VtZW50YXRpb24gYXQ6Ci1odHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9tYXN0ZXIvZ2QvcGFja2V0L3BhcnNlci9SRUFETUUKLQotIyMgQ2FsbGluZyBjb252ZW50aW9uIGJldHdlZW4gbW9kdWxlcwotCi0jIyMgQXN5bmNocm9ub3VzIHNlcnZlci1jbGllbnQgbW9kZWwKLQotRm9yIG1vc3QgY29tbXVuaWNhdGlvbiBhbW9uZyBtb2R1bGVzLCBkZXZlbG9wZXJzIHNob3VsZCBhc3N1bWUgYW4gYXN5bmNocm9ub3VzCi1zZXJ2ZXItY2xpZW50IG1vZGVsIGluIGEgZ2VuZXJpYyBtb2RlbCBsaWtlOgotCi1gYGBjKysKLS8vIERlZmluZSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlCi11c2luZyBDYWxsYmFja0Z1bmN0aW9uID0gc3RkOjpmdW5jdGlvbjx2b2lkKFBhcmFtVHlwZSk+OwotCi0vLyBBc3luY2hyb25vdXMgbWV0aG9kIGRlZmluaXRpb24KLWJvb2wgRm9vKFBhcmFtZXRlciBwYXJhbSwgQ2FsbGJhY2tGdW5jdGlvbiBjYWxsYmFjayk7Ci0KLS8vIEEgbmV3IGNhbGxiYWNrIGlzIHBhc3NlZCBmb3IgZWFjaCBhc3luY2hyb25vdXMgY2FsbAotLy8gQWx3YXlzIHByZWZlciBsYW1iZGEgb3ZlciBzdGQ6OmJpbmQKLUNhbGxiYWNrRnVuY3Rpb24gY2FsbGJhY2sgPSBbdGhpc10gewotICAvLyBkbyBzb21ldGhpbmcKLX07Ci1QYXJhbWV0ZXIgcGFyYW0gPSB7Ci0gIC8vIHNvbWV0aGluZwotfTsKLWlmIChGb28ocGFyYW0sIGNhbGxiYWNrKSkgewotICAgLy8gVGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZAotICAgLy8gQ2FsbGJhY2sgbXVzdCBiZSBpbnZva2VkIGluIHRoZSBmdXR1cmUKLX0gZWxzZSB7Ci0gICAvLyBGYWlsZWQsIG5vIG5lZWQgdG8gd2FpdAotfQotYGBgCi0KLU1hbnkgcHJvdG9jb2xzIGFuZCBwcm9maWxlcyBmaXQgaW50byBzdWNoIG1vZGVsIHN1Y2ggYXMgYEFjbE1hbmFnZXJgIGFuZAotYEwyY2FwYC4KLQotIyMjIFN5bmNocm9ub3VzIGRhdGFiYXNlIG1vZGVsCi0KLUluIHNvbWUgY2FzZXMsIGFuIGFzeW5jaHJvbm91cyBzZXJ2ZXItY2xpZW50IG1vZGVsIGlzIG5vdCBmZWFzaWJsZS4gSW4gdGhpcwotY2FzZSwgZGV2ZWxvcGVycyBjYW4gY29uc2lkZXIgYSBzeW5jaHJvbm91cyBkYXRhYmFzZSBtb2RlbC4gSW4gc3VjaCBhIG1vZGVsLAotb3BlcmF0aW9ucyBjYW4gaGFwcGVuIHN5bmNocm9ub3VzbHkgd2l0aCBoZWxwIG9mIG11dGV4LiBXaGVuIHRoZSBtZXRob2QgcmV0dXJucywKLXRoZSBjaGFuZ2VzIG11c3QgYmUgcmVmbGVjdGVkIHRvIGFsbCBkZXBlbmRlbmNpZXMuIEFueSBjaGFuZ2VzIGluIHRoZSBpbnRlcm5hbAotc3RhdGVzIG11c3QgYmUgYXBwbGllZCBhdG9taWNhbGx5LgotCi1gYGBjKysKLS8vIFN5bmNocm9ub3VzIG1ldGhvZCBkZWZpbml0aW9uCi12b2lkIEZvbyhQYXJhbWV0ZXIgcGFyYW0sIE91dHB1dCogb3V0cHV0KTsKLWludCBCYXIoUGFyYW1ldGVyIHBhcmFtKTsKLVBhcmFtZXRlciBwYXJhbSA9IHsKLSAgLy8gc29tZXRoaW5nCi19OwotT3V0cHV0IG91dHB1dCA9IHt9OwotRm9vKHBhcmFtLCAmb3V0cHV0KTsKLS8vIG91dHB1dCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseQotaW50IGJhcl9vdXRwdXQgPSBCYXIocGFyYW0pOwotLy8gYmFyX291dHB1dCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseQotYGBgCi0KLU1hbnkgc3RvcmFnZSBhbmQgaW5mb3JtYXRpb25hbCBtb2R1bGVzIGZpdCBpbnRvIHRoaXMgbW9kZWwgc3VjaCBhcyBgTWV0cmljc2AgYW5kCi1gU3RvcmFnZWAuCmRpZmYgLS1naXQgYS9nZC9kb2NzL2FyY2hpdGVjdHVyZS9kYXRhX2Zsb3dfZGlhZ3JhbS5wbmcgYi9nZC9kb2NzL2FyY2hpdGVjdHVyZS9kYXRhX2Zsb3dfZGlhZ3JhbS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGI4ZWUuLjAwMDAwMDAKLS0tIGEvZ2QvZG9jcy9hcmNoaXRlY3R1cmUvZGF0YV9mbG93X2RpYWdyYW0ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ2QvZG9jcy9hcmNoaXRlY3R1cmUvc3R5bGVfZ3VpZGUubWQgYi9nZC9kb2NzL2FyY2hpdGVjdHVyZS9zdHlsZV9ndWlkZS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkMzc3Yi4uMDAwMDAwMAotLS0gYS9nZC9kb2NzL2FyY2hpdGVjdHVyZS9zdHlsZV9ndWlkZS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0jIEdhYmVsZG9yc2NoZSBTdHlsZSBHdWlkZQotCi1bVE9DXQotCi0jIyBCYXNlCi0KLUluIGdlbmVyYWwsIHdoZW4gbm90IG1lbnRpb25lZCBpbiB0aGlzIGRvY3VtZW50LCBkZXZlbG9wZXJzIHNob3VsZCBmb2xsb3cgdGhlCi1Hb29nbGUgQysrIGFuZCBHb29nbGUgSmF2YSBzdHlsZSBndWlkZSBhcyBtdWNoIGFzIHBvc3NpYmxlLgotCi0jIyMgR29vZ2xlIEMrKyBTdHlsZSBHdWlkZQotCi1DKysgU3R5bGUgR3VpZGU6IGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwKLQotIyMjIEFuZHJvaWQgYW5kIEdvb2dsZSBKYXZhIFN0eWxlIEd1aWRlCi0KLTEuICBBbmRyb2lkIEphdmEgU3R5bGUgR3VpZGU6Ci0gICAgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc2V0dXAvY29udHJpYnV0ZS9jb2RlLXN0eWxlCi0KLTIuICB3aGVuIG5vdCBjb3ZlcmVkIGJ5ICgxKSwgc2VlIEV4dGVybmFsIEphdmEgU3R5bGUgR3VpZGU6Ci0gICAgaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL3N0eWxlZ3VpZGUvamF2YWd1aWRlLmh0bWwKLQotbGluZSBsZW5ndGggbGltaXQgaXMgMTIwIGNoYXJhY3RlcnMgZm9yIEMrKyBhbmQgSmF2YQotCi0jIyMgUHl0aG9uIFN0eWxlIEd1aWRlCi0KLVRoZSBHRCBzdGFjayB1c2VzIHRoZSBHb29nbGUgUHl0aG9uIFN0eWxlIEd1aWRlOgotCi0qICAgaHR0cDovL2dvb2dsZS5naXRodWIuaW8vc3R5bGVndWlkZS9weWd1aWRlLmh0bWwKLQotd2l0aCB0aGUgZm9sbG93aW5nIG1vZGlmaWNhdGlvbnMgYXMgc2hvd24gaW4gdGhlCi1bLnN0eWxlLnlhcGZdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL3JlZnMvaGVhZHMvbWFzdGVyLy5zdHlsZS55YXBmKSBkZWZpbml0aW9uOgotCi1gYGB5YXBmCi1iYXNlZF9vbl9zdHlsZTogZ29vZ2xlCi1pbmRlbnRfd2lkdGg6IDQKLWNvbHVtbl9saW1pdDogMTIwCi1gYGAKLQotIyMgQnVpbGQgZmlsZXMKLQotKiAgIE9uZSBidWlsZCB0YXJnZXQgZm9yIHRoZSBlbnRpcmUgc3RhY2sgaW4gc3lzdGVtL2J0IChpLmUuIG9uZSBjY19saWJyYXJ5KCkpCi0gICAgKiAgIElmIG9ubHkgcGFydCBvZiB0aGUgc3RhY2sgbmVlZHMgdG8gYmUgY29tcGlsZWQsIGNvbmZpZ3VyZSBpdCB1c2luZyB0aGUKLSAgICAgICAg4oCcdGFyZ2V04oCdIGNvbmZpZ3VyYXRpb24gaW4gQW5kcm9pZC5icAotKiAgIE9uZSBidWlsZCB0YXJnZXQgZm9yIGFsbCB1bml0IHRlc3RzIChpLmUuIG9uZSBjY190ZXN0KQotKiAgIFdoZW4gbmVlZGVkLCBmaWxncm91cCgpIGNhbiBiZSBjcmVhdGVkIGluIEFuZHJvaWQuYnAgaW4gc3ViLWRpcmVjdG9yaWVzLiBUaGUKLSAgICBtYWluIGJ1aWxkIHRhcmdldCBzaG91bGQgdXNlIHRoZXNlIGZpbGVncm91cHMoKSB0byBidWlsZCB0aGUgbWFpbiBvdXRwdXQKLSAgICBsaWJyYXJ5LgotKiAgIEFsbCB0YXJnZXRzIG11c3QgaGF2ZSBob3N0X3N1cHBvcnRlZCA9PSB0cnVlIHVubGVzcyBpdCBpcyBkZXBlbmRlbnQgb24gdGhlCi0gICAgT1MKLSogICBJZiB0aGUgc3RhY2sgbmVlZHMgdG8gYmUgY29tcGlsZWQgdXNpbmcgb3RoZXIgYnVpbGQgc3lzdGVtLCB0aGVuIHRoZSBidWlsZAotICAgIGZpbGVzIHNob3VsZCBhbHNvIGxpdmUgaW4gc3lzdGVtL2J0Ci0KLSMjIE5hbWVzcGFjZSBhbmQgaW5jbHVkZQotCi0qICAgTmFtZXNwYWNlIG11c3QgZm9sbG93IGRpcmVjdG9yeSBuYW1lcwotKiAgIFRvcCBsZXZlbCBuYW1lc3BhY2UgZm9yIGludGVybmFsIGNvZGUgaXMg4oCcYmx1ZXRvb3Ro4oCdCi0qICAgVG9wIGxldmVsIG5hbWVzcGFjZSBmb3IgZXh0ZXJuYWxseSB2aXNpYmxlIGNvZGUgaXMg4oCcYW5kcm9pZDo6Ymx1ZXRvb3Ro4oCdCi0qICAgSW5jbHVkZSBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBzdGFjay4gTm9ybWFsbHkKLSAgICBpdCBpcyBzeXN0ZW0vYnQsIGZvciBHRCByZWZhY3RvciBjb2RlLCBpdCBpcyBzeXN0ZW0vYnQvZ2QKLQotIyMgTXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIGhlYWRlcgotCi1TaW5jZSBHRCBpbnRlcmFjdCB3aXRoIG1hbnkgbG93ZXIgbGV2ZWwgY29tcG9uZW50cyB0aGF0IGFyZSBwbGF0Zm9ybSBkZXBlbmRlbnQsCi1mcmVxdWVudGx5IHRoZXJlIGlzIG5lZWQgdG8gaW1wbGVtZW50IHRoZSBzYW1lIGhlYWRlciBtdWx0aXBsZSB0aW1lcyBmb3IKLWRpZmZlcmVudCBwbGF0Zm9ybSBvciBoYXJkd2FyZS4gV2hlbiBkb2luZyB0aGlzOgotCi0qICAgQXZvaWQgI2RlZmluZSBtYWNyb3MgYXMgbXVjaCBhcyBwb3NzaWJsZS4gSW5zdGVhZCBwdXQgY29kZSBpbnRvIGRpZmZlcmVudAotICAgIHNvdXJjZSBmaWxlcyBhbmQgc2VsZWN0aXZlbHkgY29tcGlsZSB0aGVtIGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KLSogICBDb252ZW50aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW0gdXNlZDoKLSAgICAqICAgYW5kcm9pZC8KLSAgICAgICAgKiAgIEFsbCBBbmRyb2lkIGRldmljZXMgdGhhdCB1c2UgSElETAotICAgICogICBsaW51eC8KLSAgICAgICAgKiAgIEFsbCBub24tQW5kcm9pZCBsaW51eCBkZXZpY2VzCi0gICAgKiAgIGxpbnV4X2dlbmVyaWMvCi0gICAgICAgICogICBBbmRyb2lkIGFuZCBub24tQW5kcm9pZCBsaW51eCBkZXZpY2VzCi0KLSMjIERpcmVjdG9yeSBzdHJ1Y3R1cmUKLQotUm9vdCBkaXJlY3RvcnkgdW5kZXIgQW5kcm9pZCB0cmVlOgotWyoqc3lzdGVtL2J0L2dkLyoqXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9yZWZzL2hlYWRzL21hc3Rlci9nZC8pCi0KLSogICBEaXJlY3Rvcnkgc3RydWN0dXJlIHNob3VsZCBiZSBhcyBmbGF0IGFzIHBvc3NpYmxlCi0qICAgRWFjaCBmaWxlIHNob3VsZCBjb250YWluIGF0IG1vc3Qgb25lIGNsYXNzCi0qICAgSGVhZGVyLCBzb3VyY2UgY29kZSwgYW5kIHVuaXQgdGVzdCBzaG91bGQgbGl2ZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aAotICAgIHRoZSBmb2xsb3dpbmcgbmFtaW5nIGd1aWRlbGluZToKLSAgICAqICAgU291cmNlOiBiYi5jYwotICAgICogICBIZWFkZXI6IGJiLmgKLSAgICAqICAgVGVzdDogYmJfdGVzdC5jYwotKiAgIEVhY2ggcHJvZmlsZSBzaG91bGQgaGF2ZSBpdHMgb3duIGRpcmVjdG9yeSBhbmQgbW9kdWxlCi0qICAgU291cmNlIGFuZCBzaW5rLCBzZXJ2ZXIgYW5kIGNsaWVudCBwcm9maWxlcyBzaG91bGQgbGl2ZSBpbiB0d28gc3ViIGZvbGRlcnMKLSAgICBvZiB0aGUgc2FtZSBjb21tb24gZGlyZWN0b3J5IHdoZXJlIGNvbW1vbiBjb2RlIGNhbiBiZSBzdG9yZWQuIEhvd2V2ZXIsCi0gICAgc291cmNlIGFuZCBzaW5rIG11c3QgaGF2ZSBzZXBhcmF0ZSBtb2R1bGVzCi0qICAgTW9kdWxlIGZpbGUgaXMgYWxzbyB0aGUgZXh0ZXJuYWwgQVBJIGhlYWRlcgotKiAgIFByZWZlciB1bmRlcnNjb3JlIG92ZXIgZGFzaGVzCi0KLSMjIyBFeGFtcGxlOiB1dGlsaXR5IGxpYnJhcnkgd2l0aCBPUyBkZXBlbmRlbnQgaW1wbGVtZW50YXRpb24KLQotKiAgIG9zLzogT1MgZGVwZW5kZW50IGNsYXNzZXMgc3VjaCBhcyBBbGFybSwgVGhyZWFkLCBIYW5kbGVyCi0gICAgKiAgIEFuZHJvaWQuYnA6IEJ1aWxkIGZpbGUgdGhhdCBkZWZpbmVzIGZpbGUgZ3JvdXBzIHRoYXQgd291bGQgaW5jbHVkZQotICAgICAgICBkaWZmZXJlbnQgc291cmNlIGZpbGVzIGJhc2VkIG9uIGNvbXBpbGUgdGltZSB0YXJnZXQKLSAgICAqICAgYWxhcm0uaDogY29tbW9uIGhlYWRlciBmb3IgYWxhcm0KLSAgICAqICAgbGludXhfZ2VuZXJpYy86IEltcGxlbWVudGF0aW9ucyBmb3IgZ2VuZXJpYyBMaW51eCBPUwotICAgICAgICAqICAgYWxhcm0uY2M6IExpbnV4IGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgYWxhcm0uaCB1c2luZyB0aW1lcl9mZAotICAgICAgICAqICAgYWxhcm1fdGVzdC5jYzogdW5pdCB0ZXN0IGZvciBhbGFybS5oCi0gICAgKiAgIGZ1enovOiBsaWJyYXJ5IG5lZWRlZCBmb3IgZnV6eiB0ZXN0cyBpbiB0aGUgb3MvIGxpYnJhcnkKLQotIyMjIEV4YW1wbGU6IG1vZHVsZSB3aXRoIGhhcmR3YXJlIGRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbgotCi0qICAgaGFsLzogSGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIgc3VjaCBhcyBIQ0kgaW50ZXJmYWNlcywgQXVkaW8gaW50ZXJmYWNlcwotICAgICogICBBbmRyb2lkLmJwOiBCdWlsZCBmaWxlIHRoYXQgZGVmaW5lcyBmaWxlIGdyb3VwcyB0aGF0IHdvdWxkIGluY2x1ZGUKLSAgICAgICAgZGlmZmVyZW50IHNvdXJjZSBmaWxlcyBiYXNlZCBvbiBjb21waWxlIHRpbWUgdGFyZ2V0Ci0gICAgKiAgIGhjaV9oYWwuaDogY29tbW9uIGxpYnJhcnkgaGVhZGVyCi0gICAgKiAgIGhjaV9oYWxfYW5kcm9pZF9oaWRsLmNjOiBpbXBsZW1lbnRhdGlvbiBvZiBoY2lfaGFsLmggdXNpbmcgQW5kcm9pZCBISURMCi0gICAgKiAgIGhjaV9oYWxfYW5kcm9pZF9oaWRsX3Rlc3QuY2M6IHVuaXQgdGVzdHMgZm9yIHRoZSBBbmRyb2lkIEhJREwKLSAgICAgICAgaW1wbGVtZW50YXRpb24KLSAgICAqICAgaGNpX2hhbF9ob3N0LmNjOiBpbXBsZW1lbnRhdGlvbiBvZiBoY2lfaGFsLmggdXNpbmcgbGludXggQmx1ZXRvb3RoIEhDSQotICAgICAgICBzb2NrZXQKLSAgICAqICAgaGNpX2hhbF9ob3N0X3Jvb3RjYW5hbC5jYzogaW1wbGVtZW50YXRpb24gb2YgaGNpX2hhbC5oIHVzaW5nIHJvb3QtY2FuYWwKLSAgICAgICAgZW11bGF0b3IKLSAgICAqICAgaGNpX2hhbF9ob3N0X3Rlc3QuY2M6IHVuaXQgdGVzdHMgZm9yIHRoZSBzb2NrZXQgYmFzZWQgSEFMIChyb290LWNhbmFsKQotICAgICAgICBlbXVsYXRvciBpbXBsZW1lbnRhdGlvbgotICAgICogICBmYWNhZGUucHJvdG86IGdSUEMgYXV0b21hdGlvbiBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgdGhpcyBsYXllcgotICAgICogICBmYWNhZGUuaC9jYzogYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGFib3ZlIGdSUEMgaW50ZXJmYWNlIGZvciB0aGUgR0QKLSAgICAgICAgc3RhY2sKLSAgICAqICAgY2VydC86IGNlcnRpZmljYXRpb24gdGVzdHMgZm9yIHRoaXMgbW9kdWxlCi0gICAgKiAgIGZ1enovOiBsaWJyYXJ5IG5lZWRlZCBmb3IgZnV6eiB0ZXN0cyBpbiB0aGUgaGFsLyBtb2R1bGUKLQotIyMjIEV4YW1wbGU6IHNpbWlsYXIgcHJvdG9jb2wgd2l0aCB0aGUgc2FtZSBiYXNlCi0KLSogICBsMmNhcC86IEwyQ0FQIGxheWVyLCBzcGxpdHRlZCBhbW9uZyBjbGFzc2ljIGFuZCBMRQotICAgICogICBjbGFzc2ljLzogQ2xhc3NpYyBMMkNBUCBtb2R1bGUKLSAgICAgICAgKiAgIGNlcnQvOiBjZXJ0aWZpY2F0aW9uIHRlc3RzIGZvciB0aGlzIG1vZHVsZQotICAgICAgICAqICAgaW50ZXJuYWwvOiBpbnRlcm5hbCBjb2RlIHRvIGJlIHVzZWQgb25seSBpbiBjbGFzc2ljCi0gICAgICAgICogICBTb3VyY2UgY29kZSBhbmQgaGVhZGVycyBiZWluZyBleHBvcnRlZCB0byBvdGhlciBtb2R1bGVzCi0gICAgKiAgIGxlLzogTEUgTDJDQVAgbW9kdWxlCi0gICAgICAgICogICBjZXJ0LzogY2VydGlmaWNhdGlvbiB0ZXN0cyBmb3IgdGhpcyBtb2R1bGUKLSAgICAgICAgKiAgIGludGVybmFsLzogaW50ZXJuYWwgY29kZSB0byBiZSB1c2VkIG9ubHkgaW4gY2xhc3NpYwotICAgICAgICAqICAgU291cmNlIGNvZGUgYW5kIGhlYWRlcnMgYmVpbmcgZXhwb3J0ZWQgdG8gb3RoZXIgbW9kdWxlcwotICAgICogICBpbnRlcm5hbC86IEwyQ0FQIGludGVybmFsIGNvZGUgdGhhdCBzaG91bGQgbm90IGJlIHVzZWQgYnkgc291cmNlcwotICAgICAgICBvdXRzaWRlIEwyQ0FQCi0gICAgICAgICogICBkYXRhX3BpcGVsaW5lX21hbmFnZXIuaAotICAgICAgICAqICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyLmNjCi0gICAgICAgICogICBkYXRhX3BpcGVsaW5lX21hbmFnZXJfbW9jay5oOiBNb2NrIG9mIHRoaXMgY2xhc3MsIHVzZWQgaW4gdW5pdCB0ZXN0cwotICAgICAgICAqICAgZHluYW1pY19jaGFubmVsX2FsbG9jYXRvci5oCi0gICAgICAgICogICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmNjCi0gICAgICAgICogICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX3Rlc3QuY2M6IEdUZXN0IHVuaXQgdGVzdCBvZiB0aGlzIGNsYXNzCi0gICAgICAgICogICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX2Z1enpfdGVzdC5jYzogRnV6eiB0ZXN0IG9mIHRoaXMgY2xhc3MKLSAgICAqICAgKi5oLy5jYzogQ29tbW9uIGhlYWRlcnMgYW5kIHNvdXJjZXMgdGhhdCBpcyBleHBvc2VkIHRvIG90aGVyIG1vZHVsZXMKLQotIyMjIEV4YW1wbGU6IHByb3RvY29sIG9yIHByb2ZpbGVzIHdpdGggY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZSBpbXBsZW1lbnRhdGlvbnMKLQotKiAgIGEyZHAvOiBBMkRQIHByb2ZpbGUKLSAgICAqICAgc2luay86IEEyRFAgc2luayBtb2R1bGUgKGUuZy4gaGVhZHNldCkKLSAgICAqICAgc291cmNlLzogQTJEUCBzb3VyY2UgbW9kdWxlIChlLmcuIHBob25lKQotKiAgIGF2cmNwLwotICAgICogICBjb250cm9sbGVyLzogQVZSQ1AgcGVyaXBoZXJhbCBtb2R1bGUgKGUuZy4gY2Fya2l0KQotICAgICogICB0YXJnZXQvOiBBVlJDUCB0YXJnZXQgbW9kdWxlIChlLmcuIFBob25lKQotKiAgIGhmcC8KLSAgICAqICAgaGYvOiBIYW5kc2ZyZWUgZGV2aWNlIChlLmcuIGhlYWRzZXQpCi0gICAgKiAgIGFnLzogQXVkaW8gZ2F0ZXdheSAoZS5nLiBwaG9uZSkKLQotIyMgRXh0ZXJuYWwgbGlicmFyaWVzCi0KLVRvIG1haW50YWluIGhpZ2ggcG9ydGFiaWxpdHksIHdlIGFyZSB0cnlpbmcgdG8gc3RpY2sgd2l0aCBDKysgU1RMIGFzIG11Y2ggYXMKLXBvc3NpYmxlLiBIZW5jZSwgYmVmb3JlIGluY2x1ZGluZyBhbiBleHRlcm5hbCBsaWJyYXJ5LCBwbGVhc2UgYXNrIHRoZSB0ZWFtIGZvcgotcmV2aWV3LgotCi1FeGFtcGxlcyBvZiBjdXJyZW50bHkgdXNlZCBsaWJyYXJpZXM6Ci0KLSogICBib3Jpbmdzc2w6IEdvb2dsZSdzIG9wZW5zc2wgaW1wbGVtZW50YXRpb24KLSogICBzbWFsbCBwYXJ0cyBvZiBsaWJjaHJvbWUsIHRvIGJlIHJlbW92ZWQgb3IgcmVwbGFjZWQgZXZlbnR1YWxseQotICAgICogICBiYXNlOjpPbmNlQ2FsbGJhY2sKLSAgICAqICAgYmFzZTo6Q2FsbGJhY2sKLSAgICAqICAgYmFzZTo6QmluZE9uY2UKLSAgICAqICAgYmFzZTo6QmluZAotKiAgIGdvb2dsZS1icmVha3BhZDogaG9zdCBiaW5hcnkgY3Jhc2ggaGFuZGxlcgotKiAgIGxpYmJhY2t0cmFjZTogcHJpbnQgc3RhY2t0cmFjZSBvbiBjcmFzaCBvbiBob3N0Ci0KLSMjIEV4cG9zZWQgc3ltYm9scwotCi1HaXZlbiB0aGF0IGVudGlyZSBGbHVvcmlkZSBsaWJyYXJ5IGlzIGhlbGQgaW4gbGliYmx1ZXRvb3RoLnNvIGR5bmFtaWMgbGlicmFyeQotZmlsZSwgd2UgbmVlZCBhIHdheSB0byBsb2FkIHRoaXMgbGlicmFyeSBhbmQgZXh0cmFjdCBlbnRyeSBwb2ludHMgdG8gaXQuIFRoZQotb25seSBzeW1ib2xzIHRoYXQgc2hvdWxkIGJlIGV4cG9zZWQgYXJlOgotCi0qICAgQW4gZW50cnkgcG9pbnQgdG8gYSBub3JtYWwgcnVubmluZyBhZGFwdGVyIG1vZHVsZSBsaWJibHVldG9vdGguc28KLSogICBBIGhlYWRlciBsaWJyYXJ5IHRvIGFsbCBleHBvc2VkIEFQSSBzZXJ2aWNlIHRvIHByb2ZpbGVzIGFuZCBsYXllcnMKLSogICBBbiBlbnRyeSBwb2ludCB0byBhIGNlcnRpZmljYXRpb24gaW50ZXJmYWNlLCBsaWJibHVldG9vdGhcX2NlcnRpZmljYXRpb24uc28KLSogICBBIGhlYWRlciBsaWJyYXJ5IHRvIHRoaXMgY2VydGlmaWNhdGlvbiBzdGFjawotCi0jIyBMb2dnaW5nCi0KLUdhYmVsZG9yc2NoZSB1c2VzIGBwcmludGZgIHN0eWxlIGxvZ2dpbmcgd2l0aCBtYWNyb3MgZGVmaW5lZCBpbiBgb3MvbG9nLmhgLiBGaXZlCi1sb2cgbGV2ZWxzIGFyZSBhdmFpbGFibGUuCi0KLSogICBMT0dfVkVSQk9TRShmbXQsIGFyZ3MuLi4pOiBXaWxsIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSogICBMT0dfSU5GTyhmbXQsIGFyZ3MuLi4pOiBXaWxsIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSogICBMT0dfSU5GTyhmbXQsIGFyZ3MuLi4pOiBFbmFibGVkCi0qICAgTE9HX1dBUk4oZm10LCBhcmdzLi4uKTogRW5hYmxlZAotKiAgIExPR19FUlJPUihmbXQsIGFyZ3MuLi4pOiBFbmFibGVkCi0qICAgTE9HX0FMV0FZU19GQVRBTChmbXQsIGFyZ3MuLi4pOiBFbmFibGVkLCB3aWxsIGFsd2F5cyBjcmFzaAotKiAgIEFTU0VSVChjb25kaXRpb24pOiBFbmFibGVkLCB3aWxsIGNyYXNoIHdoZW4gY29uZGl0aW9uIGlzIGZhbHNlCi0qICAgQVNTRVJUX0xPRyhjb25kaXRvbiwgZm10LCBhcmdzLi4uKTogRW5hYmxlZCwgd2lsbCBjcmFzaCBhbmQgcHJpbnQgbG9nIHdoZW4KLSAgICBjb25kaXRpb24gaXMgZmFsc2UKLQotSW4gZ2VuZXJhbCwgZXJyb3JzIHRoYXQgYXJlIGNhdXNlZCBieSByZW1vdGUgZGV2aWNlIHNob3VsZCBuZXZlciBjcmFzaCBvdXIgc3RhY2sKLWFuZCBzaG91bGQgYmUgbG9nZ2VkIHVzaW5nIExPR19XQVJOKCkgb25seS4gUmVjb3ZlcmFibGUgZXJyb3JzIGR1ZSB0byBvdXIgc3RhY2sKLW9yIGJhZGx5IGJlaGF2ZWQgYmx1ZXRvb3RoIGNvbnRyb2xsZXIgZmlybXdhcmUgc2hvdWxkIGJlIGxvZ2dlZCB1c2luZwotTE9HX0VSUk9SKCkgYmVmb3JlIHJlY292ZXJ5LiBOb24tcmVjb3ZlcmFibGUgZXJyb3JzIHNob3VsZCBiZSBsb2dnZWQgYXMKLUxPR19BTFdBWVNfRkFUQUwoKSB0byBjcmFzaCB0aGUgc3RhY2sgYW5kIHJlc3RhcnQuCmRpZmYgLS1naXQgYS9nZC9kb2NzL3Rlc3RpbmcvY2VydF90ZXN0Lm1kIGIvZ2QvZG9jcy90ZXN0aW5nL2NlcnRfdGVzdC5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2OTY4MS4uMDAwMDAwMAotLS0gYS9nZC9kb2NzL3Rlc3RpbmcvY2VydF90ZXN0Lm1kCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLSMgR2FiZWxkb3JzY2hlIENlcnRpZmljYXRpb24gVGVzdHMKLQotW1RPQ10KLQotIyMgV2hhdCBpcyBHRCBjZXJ0IHRlc3QKLQotQSBjb3JlIHByb2JsZW0gYmVoaW5kIEJsdWV0b290aCBpbnRlcm9wZXJhYmlsaXR5IHRlc3RpbmcgaXMgdGVzdGVycycgaW5hYmlsaXR5IHRvCi1hdXRvbWF0ZSB0ZXN0IG9wZXJhdGlvbnMgb24gY2VydGFpbiBwZXJpcGhlcmFscy4gRm9yIGV4YW1wbGUsIGFsdGhvdWdoIGFuIHVzZXIKLWNhbiBhdXRvbWF0ZSBBUEkgY2FsbHMgb24gQW5kcm9pZCB3aXRoIHRvb2xzIGxpa2UKLVtTTDRBXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9leHRlcm5hbC9zbDRhLykgb3IgQURCIHNoZWxsCi1jb21tYW5kcywgdGhleSBvZnRlbiBzdHJ1Z2dsZSB3aXRoIGF1dG9tYXRpbmcgY29ycmVzcG9uZGluZyBvcGVyYXRpb25zIG9uCi1jYXJraXRzLCBoZWFkc2V0cywgYW5kIHNtYXJ0IHdhdGNoZXMuIEV2ZW4gaWYgdGhleSBmaW5kIGEgd2F5IHRvIGF1dG9tYXRpY2FsbHkKLWNvbnRyb2wgb25lIG1vZGVsIG9mIHN1Y2ggcGVyaXBoZXJhbCBkZXZpY2UgdXNpbmcgZGV2aWNlIG1ha2VyJ3MgdG9vbHMgb3IKLXNlbGYtZGV2ZWxvcGVkIGFmdGVyLW1hcmtldCB0b29scyBzdWNoIGFzIHJlbGF5cyBhbmQgcm9ib3RpYyBhcm1zLCBzdWNoIGtpbmQgb2YKLXRvb2wgdXN1YWxseSBkb2VzIG5vdCBzY2FsZSB0byBvdGhlciBtb2RlbHMgb2YgcGVyaXBoZXJhbHMgZHVlIHRvIHRoZWlyCi1kaWZmZXJlbmNlcyBpbiBwaHlzaWNhbCB1c2VyIGludGVyZmFjZXMuCi0KLUdEIGNlcnRpZmljYXRpb24gdGVzdCBmcmFtZXdvcmsgY29tZXMgaW50byByZXNjdWUuIEluCi10aGUgZnJhbWV3b3JrLCBhIGNvbW1vbiBBUEkgaXMgZGVmaW5lZCB1c2luZyBhIFtnUlBDXShodHRwczovL2dycGMuaW8vKSBwcm90b2J1ZgotZm9yIHByb2ZpbGVzIHN1Y2ggYXMgSEZQLCBBVlJDUCBhbmQgZnVuY3Rpb24gZ3JvdXBzIGxpa2UgcGFpcmluZywgc2Nhbm5pbmcsIGFuZAotYWR2ZXJ0aXNpbmcuIEV2ZXJ5b25lIHdobyB3YW50cyB0byB0ZXN0IHRoZWlyIEJsdWV0b290aCBkZXZpY2UgaW1wbGVtZW50cyBhbgotKipnUlBDIEZhY2FkZSBTZXJ2ZXIqKiB1c2luZyB0aGlzIHByb3RvYnVmIGRlZmluaXRpb24uIFRoaXMgc2VydmVyIGV4ZWN1dGFibGUgaXMKLXJlc3BvbnNpYmxlIGluIGdsdWluZyB2YXJpb3VzIGdSUEMgYmFzZWQgQVBJcyB3aXRoIHRoZWlyIGRldmljZSBzcGVjaWZpYwotYXV0b21hdGlvbiBob29rIHRocm91Z2ggYSAqKkRldmljZSBTcGVjaWZpYyBEcml2ZXIqKi4gVGhlIHNlcnZlciB3aWxsIHRoZW4KLWV4cG9zZSBhbiBJUCBhZGRyZXNzIGFuZCBhIHBvcnQgbnVtYmVyIHRvIHRoZSB0ZXN0IHJ1bm5lci4gQSAqKlRlc3QgUnVubmVyKioKLXByb2Nlc3Mgd2lsbCBsb2FkIGFuZCBleGVjdXRlIHRoZSBhY3R1YWwgdGVzdCBjYXNlIGFuZCB1c2UgdGhlIGF1dG8tZ2VuZXJhdGVkCi1nUlBDIGZhY2FkZSBjbGllbnQgQVBJcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBkZXZpY2UgYmVpbmcgdGVzdGVkLiBUaGUgZm9sbG93aW5nCi1kaWFncmFtIHNob3dzIGhvdyB0aGUgc3lzdGVtIGNvdWxkIGJlIGNvbmZpZ3VyZWQ6Ci0KLSFbY2VydF90ZXN0X2FyY2hpdGVjdHVyZV9kcmF3aW5nXSguL2NlcnRfdGVzdF9hcmNoaXRlY3R1cmVfZHJhd2luZy5wbmcpCi0KLSMjIFRlcm1pbm9sb2d5Ci0KLSoqZ1JQQyBGYWNhZGUqKgotOiAgIEEgc2V0IG9mIGF1dG9tYXRpb24gQVBJcyBvZiBhIHNwZWNpZmljIHByb2ZpbGUgKEhGUCwgQVZSQ1AsIGV0Yykgb3IgZnVuY3Rpb24KLSAgICBncm91cCAocGFpcmluZywgc2Nhbm5pbmcsIGFkdmVydGlzaW5nLCBldGMpIGRlZmluZWQgaW4gZ1JQQyBwcm90b2J1ZiBmb3JtYXQuCi0KLSoqVGVzdCBSdW5uZXIqKgotOiAgIEEgcHJvY2VzcyB0aGF0IGxvYWRzIGFuZCBydW5zIHRoZSBhY3R1YWwgdGVzdCBjYXNlcyBhbmQgdXNlIGF1dG8tZ2VuZXJhdGVkCi0gICAgZ1JQQyBmYWNhZGUgY2xpZW50IGxpYnJhcnkgdG8gaW50ZXJhY3Qgd2l0aCB0ZXN0IGRldmljZXMuIEN1cnJlbnRseSwgdGhlCi0gICAgcHJlZmVycmVkIHRlc3QgcnVubmVyIGlzIHRoZSBbQW5kcm9pZCBBQ1RTXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS90b29scy90ZXN0L2Nvbm5lY3Rpdml0eS8rL3JlZnMvaGVhZHMvbWFzdGVyL2FjdHMvKQotICAgIGZyYW1ld29yayBhbmQgdGVzdCBjYXNlcyBhcmUgd3JpdHRlbiBpbiBQeXRob24gZm9yIGZhc3QgaXRlcmF0aW9uIGFuZCBlYXN5IGRlYnVnZ2luZwotCi0qKmdSUEMgRmFjYWRlIFNlcnZlcioqCi06ICAgQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ1JQQyBhdXRvbWF0aW9uIEFQSXMsIHdoaWNoIHdpbGwgY29udmVydAotICAgIFJQQyByZXF1ZXN0cyBpbnRvIGludm9jYXRpb25zIG9mIGRldmljZSBzcGVjaWZpYyBhdXRvbWF0aW9uIGhvb2sgdXNpbmcgYQotICAgICoqRGV2aWNlIFNwZWNpZmljIERyaXZlcioqLiBUaGlzIHNlcnZlciBjYW4gYmUgd3JpdHRlbiBpbiBhbnkgbGFuZ3VhZ2UgYW5kCi0gICAgb24gYW55IHBsYXRmb3JtLiBUaGUgc2VydmVyIG5lZWQgdG8gZXhwb3NlIGFuIElQIGFkZHJlc3MgYW5kIDMgcG9ydHMKLQotKipUZXN0ZXIgU2lnbmFsIFBvcnQqKgotOiAgIEEgcG9ydCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzZXJ2ZXIgaXMgcmVhZHkgZm9yIG9wZXJhdGlvbiB0byB0aGUgKipUZXN0Ci0gICAgUnVubmVyKioKLQotKipnUlBDIFJvb3QgU2VydmVyIFBvcnQqKgotOiAgIEEgcG9ydCB0aGF0IGFsbG93cyAqKlRlc3QgUnVubmVyKiogdG8gc3RhcnQgYW5kIHN0b3AgdmFyaW91cyBmdW5jdGlvbmFsCi0gICAgZmFjYWRlIHNlcnZpY2VzCi0KLSoqZ1JQQyBGYWNhZGUgU2VydmVyIFBvcnQqKgotOiAgIEEgcG9ydCB0aGF0IGFsbG93cyAqKlRlc3QgUnVubmVyKiogdG8gaW50ZXJhY3Qgd2l0aCBhY3R1YWwgcHJvZmlsZQotICAgIGltcGxlbWVudGF0aW9ucyBvbiB0aGUgdGVzdCBkZXZpY2UKLQotKipEZXZpY2UgU3BlY2lmaWMgRHJpdmVyKioKLTogICBBIGxpYnJhcnkgb3Igc29tZSBtZWNoYW5pc20gdGhhdCBhbGxvd3MgdGhlICoqZ1JQQyBGYWNhZGUgU2VydmVyKiogdG8KLSAgICBjb250cm9sIHRoZSB0ZXN0IGRldmljZS4gVGhpcyBsaWJyYXJ5IGlzIG9wYXF1ZSB0byB0aGUgKipUZXN0IFJ1bm5lcioqIHRoYXQKLSAgICBzaG91bGQgaGF2ZSBubyBrbm93bGVkZ2Ugb2YgaG93IHRoaXMgY29tcG9uZW50IHdvcmtzICogKipSb290LUNhbmFsKio6IEEKLSAgICBCbHVldG9vdGggUEhZIGVtdWxhdG9yIHRoYXQgdGFrZXMgZWl0aGVyIExNUCBvciBIQ0kgcGFja2V0cy4gVGhlIGdvYWwgaXMgZm9yCi0gICAgdGhpcyBlbXVsYXRvciB0byBzaW11bGF0ZSBhIFBoeXNpY2FsIFJGIGVudmlyb25tZW50IHdpdGhvdXQgdXNpbmcgYW55IHJlYWwKLSAgICBCbHVldG9vdGggYWRhdHBlci4KLQotIyMgSG93IHRvIHJ1biBHRCBjZXJ0IHRlc3QgaW4gQW5kcm9pZCB0cmVlCi0KLUFzc3VtZSB1c2VyIGhhcyBhbiBBbmRyb2lkIGNoZWNrb3V0IGFuZCBmaW5pc2hlZCBgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoYCBhbmQKLWBsdW5jaGAgdG8gYSBwcmVmZXJyZWQgdGFyZ2V0Ci0KLSMjIyBSdW4gR0QgY2VydCB0ZXN0cyBvbiBob3N0IG1hY2hpbmUKLQotYGBgc2hlbGwKLSRBTkRST0lEX0JVSUxEX1RPUC9zeXN0ZW0vYnQvZ2QvY2VydC9ydW4gLS1ob3N0Ci1gYGAKLQotIyMjIyBQeXRob24gMy44KwotVGhlIGNlcnQgdGVzdHMgcmVxdWlyZSA+cHl0aG9uMy44IHRvIG9wZXJhdGUgYW5kIHRoZSBhc3NvY2lhdGVkIHB5dGhvbgotdmlydHVhbGVudiBwYWNrYWdlLiAgVGhlIHNjcmlwdCBtYXkgaGVscCBwcm9wZXJseSBpbnN0YWxsIHRoZXNlIHJlcXVpc2l0ZXMuCi0KLWBgYHNoZWxsCi1zb3VyY2UgJEFORFJPSURfQlVJTERfVE9QL3N5c3RlbS9idC9nZC9jZXJ0L3NldF91cF92aXJ0dWFsZW52LnNoCi1gYGAKLQotIyMjIFJ1biBHRCBjZXJ0IHRlc3RzIG9uIGRldmljZXMgZm9yIHRoZSBmaXJzdCB0aW1lCi0KLUNvbm5lY3QgYXQgbGVhc3QgdHdvIEFuZHJvaWQgZGV2aWNlcyBhbmQgZm9sbG93IG9uLXNjcmVlbiBpbnN0cnVjdGlvbnMgYWZ0ZXIKLXJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kCi0KLWBgYHNoZWxsCi0kQU5EUk9JRF9CVUlMRF9UT1Avc3lzdGVtL2J0L2dkL2NlcnQvc2V0X3VwX2FuZF9ydW5fZGV2aWNlX2NlcnQuc2gKLWBgYAotCi0jIyMgUnVuIEdEIGNlcnQgdGVzdHMgb24gZGV2aWNlcyBmb3IgdGhlIHNlY29uZCB0aW1lIGFuZCBhZnRlcgotCi1LZWVwaW5nIHRoZSBzYW1lIHNldCBvZiBkZXZpY2VzIGNvbm5lY3RlZAotCi1gYGBzaGVsbAotJEFORFJPSURfQlVJTERfVE9QL3N5c3RlbS9idC9nZC9jZXJ0L3J1bgotYGBgCi0KLSMjIyBgc3lzdGVtL2J0L2dkL2NlcnQvcnVuYCBjb21tYW5kIHJlZmVyZW5jZQotCi0qICAgYC0taG9zdGA6IFJ1biB0ZXN0cyBvbiBob3N0IG9ubHkgdXNpbmcgYHJvb3QtY2FuYWxgCi0qICAgYC0tY2xlYW5gOiBSZW1vdmUgYW55IHRlc3Qgc2V0dXAgZmlsZXMgYW5kIGRvIGEgY2xlYW4gdGVzdCBydW4KLSogICBgLS1yZXBlYXQ9TmA6IFJlcGVhdCBydW5uaW5nIHRoZSBzYW1lIHNldCBvZiB0ZXN0cyBOIHRpbWVzIHdpdGhvdXQgcmVkb2luZwotICAgIHRlc3Qgc2V0dXAKLSogICBgLS10ZXN0X2ZpbGU9PGZpbGVfbmFtZT5gOiBSdW5uaW5nIG9ubHkgdGVzdHMgbGlzdGVkIGluIGA8ZmlsZV9uYW1lPmAKLSogICBgLS10ZXN0X2ZpbHRlcj08dGVzdF9maWx0ZXI+YDogVGVzdCBjYXNlIGZpbHRlciBpbiB0aGUgZm9ybWF0IG9mCi0gICAgIlRlc3RDbGFzczp0ZXN0X2Nhc2VfbmFtZSIsIGZvciBtdWx0aXBsZSB0ZXN0IGNhc2VzLCBxdW90ZSB0aGVtIHVzaW5nICIgYW5kCi0gICAgc2VwYXJhdGUgZWFjaCBmaWx0ZXIgYnkgc3BhY2Ugc3VjaCBhcyAiVGVzdENsYXNzMTp0ZXN0X2Nhc2VfMQotICAgIFRlc3RDbGFzczI6dGVzdF9jYXNlXzIiCi0KLSMjIyBSdW4gR0QgY2VydCB0ZXN0cyBvbiBkZXZpY2VzIG92ZXIgU1NICi0KLVRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnMgYXNzdW1lIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbgotCi0qICAgTG9jYWwgc2V0dXA6IExpbnV4IG9yIE1BQyBsYXB0b3Agd2l0aCB0d28gQW5kcm9pZCBwaG9uZXMgY29ubmVjdGVkCi0qICAgUmVtb3RlIHNldHVwOiBMaW51eCBvciBNQUMgd29ya3N0YXRpb24KLQotMS4gIENoZWNrIGlmIHlvdXIgQURCIHZlcnNpb24gaXMgdXAgdG8gZGF0ZSBvbiBib3RoIGhvc3QgbWFjaGluZSBhbmQgcmVtb3RlCi0gICAgd29ya3N0YXRpb24uIEJvdGggdmVyc2lvbnMgc2hvdWxkIGJlIDI5LjAuMyBvciBhYm92ZS4gSWYgbm90LCB1bmluc3RhbGwgYW5kCi0gICAgcmVpbnN0YWxsIHlvdXIgYWRiLgotCi0xLiAgRW5hYmxlIFNTSCBwb3J0IGZvcndhcmRpbmcgZm9yIGJvdGggQURCIHBvcnQgYW5kIHZhcmlvdXMgcG9ydHMgdXNlZCBieSBvdXIKLSAgICB0ZXN0cywgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBvbiB5b3VyIE1hYywgYXNzdW1pbmcgdGhlIGZvbGxvd2luZwotICAgIGNvbmZpZ3VyYXRpb24ge3ZhbHVlPTJ9Ci0KLSAgICAqICAgQURCIFBvcnQ6IDUwMzcKLSAgICAqICAgQ2VydCBEZXZpY2U6Ci0gICAgICAgICogICBnUlBDIFJvb3QgU2VydmVyIFBvcnQ6IDg4OTYKLSAgICAgICAgKiAgIGdSUEMgRmFjYWRlIFBvcnQ6IDg4OTgKLSAgICAgICAgKiAgIFNpZ25hbCBQb3J0OiA4ODk0Ci0gICAgKiAgIERldmljZSBVbmRlciBUZXN0OgotICAgICAgICAqICAgZ1JQQyBSb290IFNlcnZlciBQb3J0OiA4ODk3Ci0gICAgICAgICogICBnUlBDIEZhY2FkZSBQb3J0OiA4ODk5Ci0gICAgICAgICogICBTaWduYWwgUG9ydDogODg5NQotCi0gICAgQW1vbmcgdGhlc2UgcG9ydHMsIEFEQiBQb3J0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIGxvY2FsIG1hY2hpbmUgdG8KLSAgICBsaXN0ZW4gb24gcmVtb3RlIHdvcmtzdGF0aW9uIHNvIHRoYXQgaXRzIGFkYiBjbGllbnQgY2FuIGNvbm5lY3QgdG8gbG9jYWwKLSAgICBtYWNoaW5lJ3MgYWRiIHNlcnZlciAoYHNzaCAtUmApLiBTaWduYWwgUG9ydCBuZWVkcyB0byBiZSBmb3J3YXJkZWQgZnJvbQotICAgIHJlbW90ZSB3b3Jrc3RhdGlvbiB0byBsaXN0ZW4gb24gbG9jYWwgbWFjaGluZSBzbyB0aGF0IGxvY2FsIHBob25lIGNhbgotICAgIGNvbm5lY3QgdG8gVGVzdCBSdW5uZXIgbGlzdGVuaW5nIG9uIHRoaXMgcG9ydCBkdXJpbmcgRmFjYWRlIFNlcnZlciBicmluZyB1cAotICAgIChgc3NoIC1MYCkuIEJvdGggZ1JQQyBSb290IFNlcnZlciBQb3J0IGFuZCBnUlBDIEZhY2FkZSBQb3J0IG5lZWQgdG8gYmUKLSAgICBmb3J3YXJkZWQgZnJvbSBsb2NhbCBtYWNoaW5lIHRvIGxpc3RlbiBvbiByZW1vdGUgd29ya3N0YXRpb24gc28gdGhhdCBUZXN0Ci0gICAgUnVubmVyIGNhbiBjb25uZWN0IHRvIHRoZXNlIHBvcnRzIG9uIHRoZSBGYWNhZGUgU2VydmVyIChgc3NoIC1SYCkuCi0KLSAgICBIZW5jZSwgdGhlIHJlc3VsdGluZyBgc3NoYCBjb21tYW5kIGlzOgotCi0gICAgYGBgc2hlbGwKLSAgICBzc2ggLVIgNTAzNzoxMjcuMC4wLjE6NTAzNyAtUiA2NDAxOjEyNy4wLjAuMTo2NDAxIC1SIDY0MDI6MTI3LjAuMC4xOjY0MDIgXAotICAgIC1SIDY0MDM6MTI3LjAuMC4xOjY0MDMgLUwgODg5NDoxMjcuMC4wLjE6ODg5NCAtTCA4ODk1OjEyNy4wLjAuMTo4ODk1IFwKLSAgICAtUiA4ODk2OjEyNy4wLjAuMTo4ODk2IC1SIDg4OTc6MTI3LjAuMC4xOjg4OTcgLVIgODg5ODoxMjcuMC4wLjE6ODg5OCBcCi0gICAgLVIgODg5OToxMjcuMC4wLjE6ODg5OSA8aG9zdF9uYW1lPgotICAgIGBgYAotCi0xLiAgQ29ubmVjdCBhbGwgeW91ciBkZXZpY2VzLCBvcGVuIGEgZGlmZmVyZW50IHRlcm1pbmFsIG9uIHlvdXIgTWFjIGFuZCBydW4KLQotICAgIGBgYHNoZWxsCi0gICAgYWRiIGtpbGwtc2VydmVyICYmIGFkYiBkZXZpY2VzCi0gICAgYGBgCi0KLSAgICBZb3Ugc2hvdWxkIHNlZSBkZXZpY2VzIG9uIHlvdXIgbG9jYWwgbWFjaGluZSBzaG93cyB1cAotCi0xLiAgU1NIIGludG8geW91ciByZW1vdGUgd29ya3N0YXRpb24gYW5kIHJ1bgotCi0gICAgYGBgc2hlbGwKLSAgICBhZGIga2lsbC1zZXJ2ZXIgJiYgYWRiIGRldmljZXMKLSAgICBgYGAKLQotICAgIFlvdSBzaG91bGQgc2VlIHNhbWUgc2V0IG9mIGRldmljZXMgY29ubmVjdGVkIHRvIHlvdXIgbG9jYWwgbWFjaGluZQotCi0xLiAgQ29udGludWUgd2l0aCBkZXZpY2Ugc2V0dXAKLQotICAgIGBgYHNoZWxsCi0gICAgJEFORFJPSURfQlVJTERfVE9QL3N5c3RlbS9idC9nZC9jZXJ0L3NldF91cF9hbmRfcnVuX2RldmljZV9jZXJ0LnNoCi0gICAgYGBgCi0KLTEuICBJbiBzdWJzZXF1ZW50IHJ1bnMKLQotICAgIGBgYHNoZWxsCi0gICAgJEFORFJPSURfQlVJTERfVE9QL3N5c3RlbS9idC9nZC9jZXJ0L3J1bgotICAgIGBgYAotCi0jIyBIb3cgdG8gZGVidWcgR0QgY2VydCB0ZXN0cwotCi1Mb2dzIGFyZSBwcm9kdWNlZCBhbmQgc2F2ZWQgd2hlbmV2ZXIgR0QgY2VydCB0ZXN0cyBydW5zLiBEZXBlbmRpbmcgb24gaG93IHRoZQotdGVzdHMgd2VyZSBydW4sIHRoZSBsb2cgcm9vdCBpcyBkaWZmZXJlbnQKLQotV2hlbiBydW5uaW5nIHRlc3RzIG9uIGxvY2FsIEFuZHJvaWQgY2hlY2tvdXQsIGxvZ3Mgb3IgbW9zdCByZWNlbnQgcnVuIGFyZSBzdG9yZWQKLWF0Ci0KLSogICAvdG1wL2xvZ3MvSG9zdE9ubHlDZXJ0L2xhdGVzdAotCi1OYXZpZ2F0ZSB0ZXN0IGxvZ3MKLQotSW4gdGVzdCByb290LCB0aGUgZm9sbG93aW5nIGxvZ3MgYXJlIGF2YWlsYWJsZToKLQotKiAgIEluIGV2ZXJ5IGRpcmVjdG9yeSBsYXllcjoKLSAgICAqICAgdGVzdF9ydW5fZGVidWcudHh0OiBERUJVRyBsZXZlbCBvdXRwdXQgZnJvbSBQeXRob24gbG9nZ2luZyBBUEkKLSAgICAgICAgc2NvcGVkIGF0IHRoZWlyIHJlc3BlY3RpdmUgbGF5ZXIgYmFzZWQgb24gdGhlIGRpcmVjdG9yeQotKiAgIEluIHRlc3Qgcm9vdCBkaXJlY3Rvcnk6Ci0gICAgKiAgIHRlc3Rfc3VtbWFyeS5qc29uOiBBIHN1bW1hcnkgdGVzdCByZXN1bHRzLCBpbmNsdWRpbmcgc3RhY2sgdHJhY2VzCi0gICAgICAgIGZvciBhbnkgZmFpbHVyZXMgYW5kIG1ldGFkYXRhCi0gICAgKiAgIHRlc3RfY29uZmlncy5qc29uOiBUaGUgQUNUcyBjb25maWcgdXNlZCB0byBydW4gdGhpcyB0ZXN0Ci0gICAgKiAgIEdkRGV2aWNlX2NlcnRfc3RhY2tfYmFja2luZ19wcm9jZXNzX2NvdmVyYWdlX3N1bW1hcnkudHh0OiBjb2RlCi0gICAgICAgIGNvdmVyYWdlIHN1bW1hcnkgZnJvbSBsbHZtLWNvdgotKiAgIEluIHRlc3QgY2xhc3MgZGlyZWN0b3J5OgotICAgICogICByb290Y2FuYWxfbG9ncy50eHQ6IFJvb3QtQ2FuYWwgc3Rkb3V0IGFuZCBzdGRlcnJyLCBob3N0IHRlc3Qgb25seQotICAgICogICBDZXJ0IHN0YWNrIGxvZ3M6Ci0gICAgICAgICogICBHZERldmljZV9jZXJ0X3N0YWNrX2JhY2tpbmdfbG9ncy50eHQ6IGZhY2FkZSBzZXJ2ZXIgcHJvY2VzcyBsb2cKLSAgICAgICAgKiAgIGNlcnRfc3RhY2tfYnRzbm9vcF9oY2kubG9nOiBIQ0kgcGFja2V0IGxvZyBvbiBjZXJ0IGRldmljZQotICAgICAgICAqICAgY2VydF9zdGFja19zeXN0ZW1fbG9nOiBBbmRyb2lkIHBob25lIGxvZ2NhdCBvdXRwdXQsIGRldmljZSBiYXNlZAotICAgICAgICAgICAgdGVzdCBvbmx5Ci0gICAgKiAgIERldmljZSB1bmRlciB0ZXN0IGxvZ3M6Ci0gICAgICAgICogICBHZERldmljZV9zdGFja191bmRlcl90ZXN0X2JhY2tpbmdfbG9ncy50eHQ6IGZhY2FkZSBzZXJ2ZXIKLSAgICAgICAgICAgIHByb2Nlc3MgbG9nCi0gICAgICAgICogICBzdGFja191bmRlcl90ZXN0X2J0c25vb3BfaGNpLmxvZzogSENJIHBhY2tldCBsb2cgb24gY2VydCBkZXZpY2UKLSAgICAgICAgKiAgIHN0YWNrX3VuZGVyX3Rlc3Rfc3lzdGVtX2xvZzogQW5kcm9pZCBwaG9uZSBsb2djYXQgb3V0cHV0LCBkZXZpY2UKLSAgICAgICAgICAgIGJhc2VkIHRlc3Qgb25seQotICAgICogICBJbmRpdmlkdWFsIHRlc3QgZGlyZWN0b3JpZXM6IGxvZ3MgZm9yIGluZGl2aWR1YWwgdGVzdCBjYXNlcwotCi0jIyBQVFMgdGVzdCBjYXNlIGNvdmVyYWdlCi0KLUEgUHl0aG9uIGRlY29yYXRvciBpcyB1c2VkIHRvIGluZGljYXRlIGEgdGVzdCdzIGFzc29jaWF0aW9uIHdpdGggYSBCbHVldG9vdGggU0lHCi1Qcm9maWxlIFR1bmluZyBTdWl0ZSAoUFRTKSBRdWFsaWZpY2F0aW9uIHRlc3QuIEZvciBleGFtcGxlCi0KLWBgYHB5dGhvbgotQG1ldGFkYXRhKAotICAgIHB0c190ZXN0X2lkPSJMMkNBUC9FWEYvQlYtMDEtQyIsCi0gICAgcHRzX3Rlc3RfbmFtZT0iRXh0ZW5kZWQgRmVhdHVyZXMgSW5mb3JtYXRpb24gUmVzcG9uc2UgZm9yICIKLSAgICAiRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gTW9kZSIpCi1gYGAKLQotVGhlc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IHRoZSBUZXN0IENhc2UgUmVmZXJlbmNlIExpc3QgKFRDUkwpIGRvY3VtZW50Ci1pbgotW1F1YWxpZmljYXRpb24gVGVzdCBSZXF1aXJlbWVudHNdKGh0dHBzOi8vd3d3LmJsdWV0b290aC5jb20vc3BlY2lmaWNhdGlvbnMvcXVhbGlmaWNhdGlvbi10ZXN0LXJlcXVpcmVtZW50cy8pCi1wYWdlIGF0IHRoZSBCbHVldG9vdGggU0lHIHdlYnNpdGUuCi0KLSMjIENvZGUgY292ZXJhZ2UKLQotSWYgdGhlIGZhY2FkZSBzZXJ2ZXIgYmluYXJ5IGlzIGNvbXBpbGVkIHVzaW5nIFtgY2xhbmdgXShodHRwczovL2NsYW5nLmxsdm0ub3JnLykKLWFuZCB3aXRoCi1bYC1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSAtZmNvdmVyYWdlLW1hcHBpbmdgXShodHRwczovL2NsYW5nLmxsdm0ub3JnL2RvY3MvU291cmNlQmFzZWRDb2RlQ292ZXJhZ2UuaHRtbCkKLWZsYWdzLiBBIGAucHJvZnJhd2AgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiBlY2ggdGVzdCBjbGFzcyBsb2cgZGlyZWN0b3J5IGFmdGVyCi10aGUgdGVzdCBydW4uIFRoZSBUZXN0IFJ1bm5lciB3aWxsIHRoZW4gdHJ5IHRvIGluZGV4IHRoZXNlIHByb2ZpbGluZyBkYXRhIHVzaW5nCi1bYGxsdm0tcHJvZmRhdGFgXShodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL2xsdm0tcHJvZmRhdGEuaHRtbCksCi1pdGVyYXRpdmVseSBtZXJnZSB0aGVtIGZyb20gZWFjaCB0ZXN0IGNsYXNzLCBhbmQgZ2VuZXJhdGUgYSBsaW5lLWJ5LWxpbmUgdGVzdAotY292ZXJhZ2UgcmVwb3J0IHVzaW5nCi1bYGxsdm0tY292YF0oaHR0cHM6Ly9sbHZtLm9yZy9kb2NzL0NvbW1hbmRHdWlkZS9sbHZtLWNvdi5odG1sKS4KZGlmZiAtLWdpdCBhL2dkL2RvY3MvdGVzdGluZy9jZXJ0X3Rlc3RfYXJjaGl0ZWN0dXJlX2RyYXdpbmcucG5nIGIvZ2QvZG9jcy90ZXN0aW5nL2NlcnRfdGVzdF9hcmNoaXRlY3R1cmVfZHJhd2luZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDkwMzUuLjAwMDAwMDAKLS0tIGEvZ2QvZG9jcy90ZXN0aW5nL2NlcnRfdGVzdF9hcmNoaXRlY3R1cmVfZHJhd2luZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZC9kb2NzL3Rlc3RpbmcvZ3Rlc3QubWQgYi9nZC9kb2NzL3Rlc3RpbmcvZ3Rlc3QubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWE3NzkuLjAwMDAwMDAKLS0tIGEvZ2QvZG9jcy90ZXN0aW5nL2d0ZXN0Lm1kCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLSMgR1Rlc3QgVW5pdCBUZXN0cwotCi1bVE9DXQotCi0jIyBHVGVzdCBVbml0IFRlc3RzCi0KLVtHVGVzdF0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0KSBpcyBhIEdvb2dsZSBkZXZlbG9wZWQgb3BlbiBzb3VyY2UKLXVuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIEMrKyBhbmQgQyBjb2RlLiBBcyB0aGUgbWFqb3JpdHkgb2YgR0QgY29kZSBpcyB3cml0ZWVuCi1pbiBDKyssIEdUZXN0IHByb3ZpZGUgdGhlIGZpcnN0IGxheWVyIG9mIGRlZmVuY2UgYWdhaW5zdCBidWdzIGZyb20gdGhlCi1pbXBsZW1lbnRhdGlvbiBsZXZlbC4gVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoCi1bR01vY2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xlbW9jaykgZGV2ZWxvcGVycyBjYW4gZWFzaWx5IGlzb2xhdGUKLWNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIHRoZWlyIGNvZGUgdG8gY29uZHVjdCB1bml0IHRlc3RpbmcuCi0KLSogICBbR1Rlc3QgUHJpbWVyXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QvYmxvYi9tYXN0ZXIvZ29vZ2xldGVzdC9kb2NzL3ByaW1lci5tZCkKLSogICBbR01vY2sgZm9yIER1bW1pZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdC9ibG9iL21hc3Rlci9nb29nbGVtb2NrL2RvY3MvZm9yX2R1bW1pZXMubWQpCi0KLSMjIyBUZXN0IEJpbmFyeQotCi1BbGwgR2QgdW5pdCB0ZXN0IGNsYXNzZXMgYXJlIGNvbXBpbGVkIGludG8gYSBzaW5nbGUgYmluYXJ5Ci1bYmx1ZXRvb3RoX3Rlc3RfZ2RdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL21hc3Rlci9nZC9BbmRyb2lkLmJwKS4KLQotIyMjIFRlc3QgU291cmNlcyBEZWZpbml0aW9ucwotCi0qICAgVGVzdHMgc2hvdWxkIGxpdmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UgY29kZQotKiAgIE1vY2tzIHNob3VsZCBsaXZlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGhlYWRlciBzbyB0aGF0IGl0IGNhbgotICAgIGJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSB0ZXN0cwotKiAgIFRlc3RzIHNob3VsZCBub3QgbW9kaWZ5IGdsb2JhbCBzdGF0ZXMgdGhhdCB3b3VsZCBhZmZlY3Qgb3RoZXIgdGVzdHMsIHNvIHRoYXQKLSAgICBhbGwgdGVzdHMgY291bGQgYmUgZXhlY3V0ZWQgdXNpbmcgdGhlIHNhbWUgYmluYXJ5Ci0qICAgRWFjaCBtb2R1bGUgY2FuIGRlZmluZSBhIGZpbGVncm91cCgpIHRoYXQgaW5jbHVkZXMgYWxsIHRlc3Qgc291cmNlcy4gVGhpcwotICAgIGZpbGVncm91cCBpcyB0aGVuIGluY2x1ZGVkIGluIGEgc2luZ2xlIGNjX3Rlc3QoKSB0YXJnZXQgdGhhdCBwcm9kdWNlIGEKLSAgICBzaW5nbGUgdGVzdCBiaW5hcnkKLSAgICBbYmx1ZXRvb3RoX3Rlc3RfZ2RdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL21hc3Rlci9nZC9BbmRyb2lkLmJwKS4KLSAgICBBIHNpbmdsZSB0ZXN0IGJpbmFyeSBzaW1wbGlmaWVzIHRoZSBjb25maWd1cmF0aW9uIGVmZm9ydCBuZWVkZWQgZm9yCi0gICAgY29tcGlsYXRpb24sIHByZXN1Ym1pdCBhbmQgcG9zdHN1Ym1pdCBleGVjdXRpb24sIGFuZCBzbyBvbi4KLQotIyMjIEhvdyB0byBydW4gdGVzdHMKLQotIyMjIyBVc2UgYGF0ZXN0YAotCi1bQVRlc3RdKGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbXBhdGliaWxpdHkvdGVzdHMvZGV2ZWxvcG1lbnQvYXRlc3QpIGlzIGFuCi1BbmRyb2lkIHRvb2wgdGhhdCBhbGxvd3MgYSBkZXZlbG9wZXJzIHRvIHJ1biBtdWx0aXBsZSBtb2RlcyBvZiB0ZXN0cyBmcm9tIHRoZQotc2FtZSBgYXRlc3RgIGNvbW1hbmQsIGluY2x1ZGluZyBKYXZhIEluc3RydW1lbnRhdGlvbiBUZXN0cywgQy9DKysgR1Rlc3RzLAotQ1RTL0dUUyB0ZXN0cywgZXRjLiBUbyB1c2UgYGF0ZXN0YCB3aXRoIEdELCBzaW1wbHlpbmcgc3luYyB5b3VyIEFuZHJvaWQgdHJlZSwKLXJ1biBgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoYCBhbmQgYGx1bmNoYCB0byBhIGRlc2lyZWQgdGFyZ2V0LiBUaGVuCi0KLSogICBUbyBydW4gdGVzdHMgb24gZGV2aWNlLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkLAotICAgIHB1c2gsIGFuZCBleGVjdXRlIHRlc3RzIG9uIGEgY29ubmVjdGVkIEFuZHJvaWQgZGV2aWNlCi0KLSAgICBgYGBzaGVsbAotICAgIGF0ZXN0IGJsdWV0b290aF90ZXN0X2dkCi0gICAgYGBgCi0KLSogICBUbyBydW4gdGVzdHMgb24gaG9zdCwgdGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhbmQgcnVuCi0gICAgdGVzdHMgb24geW91ciBob3N0IG1hY2hpbmUKLQotICAgIGBgYHNoZWxsCi0gICAgYXRlc3QgLS1ob3N0IGJsdWV0b290aF90ZXN0X2dkCi0gICAgYGBgCi0KLSogICBUbyBydW4gYSBzaW5nbGUgdGVzdCBjYXNlLCB1c2UgYDx0ZXN0X2JpbmFyeT46PHRlc3RfY2xhc3M+Izx0ZXN0X21ldGhvZD5gCi0gICAgZm9ybWF0LCBzdWNoIGFzCi0KLSAgICBgYGBzaGVsbAotICAgIGF0ZXN0IC0taG9zdCBibHVldG9vdGhfdGVzdF9nZDpBY2xNYW5hZ2VyVGVzdCNpbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19jb25uZWN0aW9uX2NvbXBsZXRlX3N1Y2Nlc3MKLSAgICBgYGAKLQotICAgIFNlZSBgYXRlc3QgLS1oZWxwYCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgYXRlc3QgdG8gcnVuIHZhcmlvdXMKLSAgICB0ZXN0cwotCi0jIyMjIFJ1biBpdCB5b3Vyc2VsZiAoTm90IHJlY2VvbW1lbmRlZCB1bmxlc3MgcmVhbGx5IG5lZWRlZCkKLQotU29tZXRpbWVzLCB5b3UgbWF5IHdhbnQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBiaW5hcnkgZGlyZWN0bHkgYmVjYXVzZSB5b3Ugd2FudCB0bwotYXR0YWNoIGEgZGVidWdnZXIgb3IgeW91IHdhbnQgdG8gYXZvaWQgdGhlIHRlc3QgYm9vc3RyYXAgZGVsYXkgaW4gYGF0ZXN0YC4gWW91Ci1jYW4gZG8gaXQgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBzCi0KLTEuICBTeW5jIEFuZHJvaWQgdHJlZSwgcnVuIGBidWlsZC9lbnZzZXR1cGAgYW5kIGBsdW5jaGAgZGVzaXJlZCB0YXJnZXQsIGBjZGAKLSAgICBpbnRvIEFuZHJvaWQgY2hlY2tvdXQgcm9vdCBkaXJlY3RvcnkKLQotMS4gIE1ha2UgYmx1ZXRvb3RoX3Rlc3RfZ2QgYmluYXJ5Ci0KLSAgICBgYGBzaGVsbAotICAgIG0gLWo0MCBibHVldG9vdGhfdGVzdF9nZAotICAgIGBgYAotCi0xLiAgUnVuIHRoZSB0ZXN0IG9uIGhvc3Qge3ZhbHVlPTN9Ci0KLSAgICBgYGBzaGVsbAotICAgICRBTkRST0lEX0hPU1RfT1VUL25hdGl2ZXRlc3Q2NC9ibHVldG9vdGhfdGVzdF9nZC9ibHVldG9vdGhfdGVzdF9nZAotICAgIGBgYAotCi0xLiAgUnVuIHRoZSB0ZXN0IG9uIGRldmljZSB7dmFsdWU9NH0KLQotICAgIFB1c2ggdGVzdCB0byBkZXZpY2UKLQotICAgIGBgYHNoZWxsCi0gICAgYWRiIHB1c2ggJEFORFJPSURfUFJPRFVDVF9PVVQvdGVzdGNhc2VzL2JsdWV0b290aF90ZXN0X2dkL2FybTY0L2JsdWV0b290aF90ZXN0X2dkIC9kYXRhL25hdGl2ZXRlc3Q2NC9ibHVldG9vdGhfdGVzdF9nZAotICAgIGBgYAotCi0gICAgUnVuIHRlc3QgdXNpbmcgQURCCi0KLSAgICBgYGBzaGVsbAotICAgIGFkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvYmx1ZXRvb3RoX3Rlc3RfZ2QKLSAgICBgYGAKLQotMS4gIFJ1biB0ZXN0IHdpdGggZmlsdGVyIChXb3JrcyB0aGUgc2FtZSB3YXkgZm9yIGRldmljZSBiYXNlZCB0ZXN0KSB7dmFsdWU9NX0KLQotICAgIGBgYHNoZWxsCi0gICAgJEFORFJPSURfSE9TVF9PVVQvbmF0aXZldGVzdDY0L2JsdWV0b290aF90ZXN0X2dkL2JsdWV0b290aF90ZXN0X2dkIC0tZ3Rlc3RfZmlsdGVyPUFjbE1hbmFnZXJUZXN0Lmludm9rZV9yZWdpc3RlcmVkX2NhbGxiYWNrX2Nvbm5lY3Rpb25fY29tcGxldGVfc3VjY2VzcyoKLSAgICBgYGAKLQotICAgIE5vdGU6IHRoZSAnKicgd2lsZGNhcmQgaXMgdmVyeSBpbXBvcnRhbnQKLQotMS4gIEdldCBjb21tYW5kIGxpbmUgaGVscCB7dmFsdWU9Nn0KLQotICAgIGBgYHNoZWxsCi0gICAgJEFORFJPSURfSE9TVF9PVVQvbmF0aXZldGVzdDY0L2JsdWV0b290aF90ZXN0X2dkL2JsdWV0b290aF90ZXN0X2dkIC0taGVscAotICAgIGBgYAotCi0jIyMgRXhhbXBsZTogTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QKLQotTm90ZTogQWxsIHBhdGhzIGFyZSByZWxhdGl2ZSB0bwotW3N5c3RlbS9idC9nZF0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvbWFzdGVyL2dkKQotCi0jIyMjIFNvdXJjZSBjb2RlOgotCi0qICAgW2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmhdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL21hc3Rlci9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oKQotCi1gYGBjKysKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMaW5rOwotCi1jbGFzcyBGaXhlZENoYW5uZWxJbXBsIDogcHVibGljIGwyY2FwOjppbnRlcm5hbDo6Q2hhbm5lbEltcGwgewotIHB1YmxpYzoKLSAgRml4ZWRDaGFubmVsSW1wbChDaWQgY2lkLCBMaW5rKiBsaW5rLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcik7Ci0gIHZpcnR1YWwgfkZpeGVkQ2hhbm5lbEltcGwoKSA9IGRlZmF1bHQ7Ci0gIGhjaTo6QWRkcmVzcyBHZXREZXZpY2UoKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXIsIEZpeGVkQ2hhbm5lbDo6T25DbG9zZUNhbGxiYWNrIG9uX2Nsb3NlX2NhbGxiYWNrKTsKLSAgdmlydHVhbCB2b2lkIEFjcXVpcmUoKTsKLSAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsKLSAgdmlydHVhbCBib29sIElzQWNxdWlyZWQoKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIE9uQ2xvc2VkKGhjaTo6RXJyb3JDb2RlIHN0YXR1cyk7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKTsKLSAgY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlciwgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+KiBHZXRRdWV1ZVVwRW5kKCk7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+LCBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiogR2V0UXVldWVEb3duRW5kKCk7Ci0gIENpZCBHZXRDaWQoKSBjb25zdDsKLSAgQ2lkIEdldFJlbW90ZUNpZCgpIGNvbnN0OwotIHByaXZhdGU6Ci0gIC8vIHByaXZhdGUgZmllbGRzIG9taXR0ZWQgaW4gZG9jIC4uLgotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi1gYGAKLQotKiAgIFtzeXN0ZW0vYnQvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuY2NdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL21hc3Rlci9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5jYykKLQotIyMjIyBNb2NrcyBmb3IgZGVwZW5kZW5jaWVzJyB1bml0IHRlc3RzCi0KLSogICBbbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGxfbW9jay5oXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vYnQvKy9tYXN0ZXIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGxfbW9jay5oKQotCi1gYGBjKysKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrRml4ZWRDaGFubmVsSW1wbCA6IHB1YmxpYyBGaXhlZENoYW5uZWxJbXBsIHsKLSBwdWJsaWM6Ci0gIE1vY2tGaXhlZENoYW5uZWxJbXBsKENpZCBjaWQsIExpbmsqIGxpbmssIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyKSA6IEZpeGVkQ2hhbm5lbEltcGwoY2lkLCBsaW5rLCBsMmNhcF9oYW5kbGVyKSB7fQotICBNT0NLX01FVEhPRCh2b2lkLCBSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaywKLSAgICAgICAgICAgICAgKG9zOjpIYW5kbGVyICogdXNlcl9oYW5kbGVyLCBGaXhlZENoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjayksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBBY3F1aXJlLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlbGVhc2UsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgSXNBY3F1aXJlZCwgKCksIChvdmVycmlkZSwgY29uc3QpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgT25DbG9zZWQsIChoY2k6OkVycm9yQ29kZSBzdGF0dXMpLCAob3ZlcnJpZGUpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLWBgYAotCi0jIyMjIFRlc3RzCi0KLSogICBbbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGxfdGVzdC5jY10oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvbWFzdGVyL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX3Rlc3QuY2MpCi0KLWBgYGMrKwotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0KLSNpbmNsdWRlICJjb21tb24vdGVzdGluZy9iaW5kX3Rlc3RfdXRpbC5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyX21vY2suaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXVzaW5nIGwyY2FwOjppbnRlcm5hbDo6dGVzdGluZzo6TW9ja1BhcmFtZXRlclByb3ZpZGVyOwotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6TW9ja0xpbms7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLQotY2xhc3MgTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFN5bmNIYW5kbGVyKG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICBoYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLCBjb21tb246OlVucmV0YWluZWQoJnByb21pc2UpKSk7Ci0gICAgZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBsMmNhcF9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgbDJjYXBfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGwyY2FwX2hhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgb3M6OlRocmVhZCogdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QsIGdldF9kZXZpY2UpIHsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyOwotICBFWFBFQ1RfQ0FMTChtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwgR2V0Q2xhc3NpY0xpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpKTsKLSAgdGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uKiBtb2NrX2FjbF9jb25uZWN0aW9uID0gbmV3IHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbigpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19hY2xfY29ubmVjdGlvbiwgR2V0QWRkcmVzcygpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIGwyY2FwX2hhbmRsZXJfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBVbnJlZ2lzdGVyQ2FsbGJhY2tzKF8pKS5UaW1lcygxKTsKLSAgTW9ja0xpbmsgbW9ja19jbGFzc2ljX2xpbmsobDJjYXBfaGFuZGxlcl8sICZtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbj4obW9ja19hY2xfY29ubmVjdGlvbikpOwotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2V7aGNpOjpBZGRyZXNze3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTU307Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19saW5rLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBGaXhlZENoYW5uZWxJbXBsIGZpeGVkX2NoYW5uZWxfaW1wbChrU21wQnJDaWQsICZtb2NrX2NsYXNzaWNfbGluaywgbDJjYXBfaGFuZGxlcl8pOwotICBFWFBFQ1RfRVEoZGV2aWNlLkdldEFkZHJlc3MoKSwgZml4ZWRfY2hhbm5lbF9pbXBsLkdldERldmljZSgpKTsKLX0KLQotLy8gT3RoZXIgdGVzdCBjYXNlcyBvbWl0dGVkIGluIGRvYyAuLi4KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi1gYGAKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvQW5kcm9pZC5icCBiL2dkL2R1bXBzeXMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0Y2E5OS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRHVtcHN5c1NvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZpbHRlci5jYyIsCi0gICAgICAgICJpbml0X2ZsYWdzLmNjIiwKLSAgICAgICAgImludGVybmFsL2ZpbHRlcl9pbnRlcm5hbC5jYyIsCi0gICAgICAgICJyZWZsZWN0aW9uX3NjaGVtYS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRHVtcHN5c1Rlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmaWx0ZXJfdGVzdC5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9maWx0ZXJfaW50ZXJuYWxfdGVzdC5jYyIsCi0gICAgICAgICJyZWZsZWN0aW9uX3NjaGVtYV90ZXN0LmNjIiwKLSAgICBdLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c1Rlc3REYXRhX2giLAotICAgIHZpc2liaWxpdHk6IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJmbGF0YyIsCi0gICAgXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGZsYXRjKSAtSSBzeXN0ZW0vYnQvZ2QgLWIgLS1zY2hlbWEgLW8gJChnZW5EaXIpIC0tY3BwICQoaW4pICIsCi0gICAgc3JjczogWwotICAgICAgICAidGVzdF9kYXRhL3Jvb3QuZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9iYXIuZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9iYXouZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9mb28uZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9xdXguZmJzIiwKLSAgICBdLAotICAgIG91dDogWwotICAgICAgICAicm9vdF9nZW5lcmF0ZWQuaCIsCi0gICAgICAgICJiYXJfZ2VuZXJhdGVkLmgiLAotICAgICAgICAiYmF6X2dlbmVyYXRlZC5oIiwKLSAgICAgICAgImZvb19nZW5lcmF0ZWQuaCIsCi0gICAgICAgICJxdXhfZ2VuZXJhdGVkLmgiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzVGVzdERhdGFfYmZicyIsCi0gICAgdmlzaWJpbGl0eTogWyIvL3Zpc2liaWxpdHk6cHJpdmF0ZSJdLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJmbGF0YyIsCi0gICAgXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGZsYXRjKSAtSSBzeXN0ZW0vYnQvZ2QgLWIgLS1zY2hlbWEgLW8gJChnZW5EaXIpIC0tY3BwICQoaW4pICIsCi0gICAgc3JjczogWwotICAgICAgICAidGVzdF9kYXRhL3Jvb3QuZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9iYXIuZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9iYXouZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9mb28uZmJzIiwKLSAgICAgICAgInRlc3RfZGF0YS9xdXguZmJzIiwKLSAgICBdLAotICAgIG91dDogWwotICAgICAgICAicm9vdC5iZmJzIiwKLSAgICAgICAgImJhci5iZmJzIiwKLSAgICAgICAgImJhei5iZmJzIiwKLSAgICAgICAgImZvby5iZmJzIiwKLSAgICAgICAgInF1eC5iZmJzIiwKLSAgICBdLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c1Rlc3RTY2hlbWFfY2MiLAotICAgIHZpc2liaWxpdHk6IFsiLy92aXNpYmlsaXR5OnByaXZhdGUiXSwKLSAgICB0b29sczogWwotICAgICAgICAiYmx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlciIsCi0gICAgXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGJsdWV0b290aF9mbGF0YnVmZmVyX2J1bmRsZXIpIC13IC1tIGJsdWV0b290aC5EdW1wc3lzRGF0YSAtZiBkdW1wc3lzX21vZHVsZV9zY2hlbWFfZGF0YSAtbiB0ZXN0aW5nIC1nICQoZ2VuRGlyKSAkKGxvY2F0aW9ucyA6Qmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c0JpbmFyeVNjaGVtYV9iZmJzKSIsCi0gICAgc3JjczogWwotICAgICAgICAiOkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNCaW5hcnlTY2hlbWFfYmZicyIsCi0gICAgXSwKLSAgICBvdXQ6IFsKLSAgICAgICAgICJkdW1wc3lzX21vZHVsZV9zY2hlbWFfZGF0YS5jYyIsCi0gICAgXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNCdW5kbGVkU2NoZW1hX2NjIiwKLSAgICB2aXNpYmlsaXR5OiBbIi8vdmlzaWJpbGl0eTpwcml2YXRlIl0sCi0gICAgdG9vbHM6IFsKLSAgICAgICAgICAgICJibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gYmx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlcikgLXcgLW0gYmx1ZXRvb3RoLkR1bXBzeXNEYXRhIC1mIGdlbmVyYXRlZF9kdW1wc3lzX2J1bmRsZWRfc2NoZW1hIC1uIGJsdWV0b290aDo6ZHVtcHN5cyAtZyAkKGdlbkRpcikgJChsb2NhdGlvbnMgOkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNCaW5hcnlTY2hlbWFfYmZicykiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzQmluYXJ5U2NoZW1hX2JmYnMiLAotICAgIF0sCi0gICAgb3V0OiBbCi0gICAgICAgICAiZ2VuZXJhdGVkX2R1bXBzeXNfYnVuZGxlZF9zY2hlbWEuY2MiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzQnVuZGxlZFRlc3RTY2hlbWFfY2MiLAotICAgIHZpc2liaWxpdHk6IFsiLy92aXNpYmlsaXR5OnByaXZhdGUiXSwKLSAgICB0b29sczogWwotICAgICAgICAgICAgImJsdWV0b290aF9mbGF0YnVmZmVyX2J1bmRsZXIiLAotICAgIF0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyKSAtdyAtbSB0ZXN0aW5nLkR1bXBzeXNUZXN0RGF0YVJvb3QgIC1mIGdlbmVyYXRlZF9kdW1wc3lzX2J1bmRsZWRfdGVzdF9zY2hlbWEgLW4gdGVzdGluZyAtZyAkKGdlbkRpcikgJChsb2NhdGlvbnMgOkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNUZXN0RGF0YV9iZmJzKSIsCi0gICAgc3JjczogWwotICAgICAgICAiOkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNUZXN0RGF0YV9iZmJzIiwKLSAgICBdLAotICAgIG91dDogWwotICAgICAgICAgImdlbmVyYXRlZF9kdW1wc3lzX2J1bmRsZWRfdGVzdF9zY2hlbWEuY2MiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJCbHVldG9vdGhGbGF0YnVmZmVyVGVzdERhdGFfaCIsCi0gICAgdG9vbHM6IFsKLSAgICAgICAgImZsYXRjIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gZmxhdGMpIC1JIHN5c3RlbS9idC9nZCAtYiAtLXNjaGVtYSAtbyAkKGdlbkRpcikgLS1jcHAgJChpbikgIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGhfZmxhdGJ1ZmZlcl90ZXN0LmZicyIsCi0gICAgXSwKLSAgICBvdXQ6IFsKLSAgICAgICAgImJsdWV0b290aF9mbGF0YnVmZmVyX3Rlc3RfZ2VuZXJhdGVkLmgiLCAiYmx1ZXRvb3RoX2ZsYXRidWZmZXJfdGVzdC5iZmJzIiwKLSAgICBdLAotfQotCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJnZF9kZWZhdWx0cyIsCi0gICAgICAgICJnZF9jbGFuZ19maWxlX2NvdmVyYWdlIiwKLSAgICAgICAgImdkX2NsYW5nX3RpZHkiLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNCdW5kbGVkU2NoZW1hX2NjIiwKLSAgICBdLAotfQotCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RoLWR1bXBzeXMtdGVzdCIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImdkX2RlZmF1bHRzIiwKLSAgICAgICAgImdkX2NsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgICAgICAiZ2RfY2xhbmdfdGlkeSIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfc291cmNlczogWwotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c0J1bmRsZWRUZXN0U2NoZW1hX2NjIiwKLSAgIF0sCi19Ci0KLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGgtZHVtcHN5cy11bml0dGVzdCIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImdkX2RlZmF1bHRzIiwKLSAgICAgICAgImdkX2NsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgICAgICAiZ2RfY2xhbmdfdGlkeSIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c1Rlc3RTY2hlbWFfY2MiLAotICAgXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF9mbGF0YnVmZmVyX3Rlc3RzIiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmZsYXRidWZmZXJzLWNwcCIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGhfZmxhdGJ1ZmZlcl90ZXN0LmNjIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhGbGF0YnVmZmVyVGVzdERhdGFfaCIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdleHRyYSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvQlVJTEQuZ24gYi9nZC9kdW1wc3lzL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgwZWM4Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0KCIvL2J0L2dkL2R1bXBzeXMvYnVuZGxlci9idW5kbGVyLmduaSIpCi0KLXNvdXJjZV9zZXQoIkJsdWV0b290aER1bXBzeXNTb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJmaWx0ZXIuY2MiLAotICAgICJpbml0X2ZsYWdzLmNjIiwKLSAgICAiaW50ZXJuYWwvZmlsdGVyX2ludGVybmFsLmNjIiwKLSAgICAicmVmbGVjdGlvbl9zY2hlbWEuY2MiLAotICBdCi0KLSAgY2ZsYWdzX2NjID0gWyAiLVduby1lbnVtLWNvbXBhcmUtc3dpdGNoIiBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi0gIGRlcHMgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRfZGVwcyIgXQotfQotCi1idF9mbGF0Y19idW5kbGVyKCJsaWJibHVldG9vdGgtZHVtcHN5cyIpIHsKLSAgcm9vdF9uYW1lID0gImJsdWV0b290aC5EdW1wc3lzRGF0YSIKLSAgZmlsZW5hbWUgPSAiZ2VuZXJhdGVkX2R1bXBzeXNfYnVuZGxlZF9zY2hlbWEiCi0gIG5hbWVzcGFjZSA9ICJibHVldG9vdGg6OmR1bXBzeXMiCi0gIGRlcHMgPSBbICIvL2J0L2dkOkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNCaW5hcnlTY2hlbWFfYmZicyIgXQotICBjb25maWdzID0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9ibHVldG9vdGhfZmxhdGJ1ZmZlcl90ZXN0LmNjIGIvZ2QvZHVtcHN5cy9ibHVldG9vdGhfZmxhdGJ1ZmZlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgzNjc2Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYmx1ZXRvb3RoX2ZsYXRidWZmZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGhfZmxhdGJ1ZmZlcl90ZXN0X2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvdXRpbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBkdW1wc3lzIHsKLQotY2xhc3MgQmx1ZXRvb3RoRmxhdGJ1ZmZlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotfTsKLQotVEVTVF9GKEJsdWV0b290aEZsYXRidWZmZXJUZXN0LCBwcmVjb25kaXRpb24pIHt9Ci0KLVRFU1RfRihCbHVldG9vdGhGbGF0YnVmZmVyVGVzdCwgQnVpbGRlclRlc3QpIHsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIoMTAyNCk7Ci0gIGF1dG8gc3RyaW5nX3ByaXZhdGUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiU3RyaW5nIHByaXZhdGUiKTsKLSAgYXV0byBzdHJpbmdfb3BhcXVlID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoIlN0cmluZyBvcGFxdWUiKTsKLSAgYXV0byBzdHJpbmdfYW5vbnltaXplZCA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKCJTdHJpbmcgYW5vbnltaXplZCIpOwotICBhdXRvIHN0cmluZ19hbnkgPSBidWlsZGVyLkNyZWF0ZVN0cmluZygiU3RyaW5nIGFueSIpOwotCi0gIFRlc3RUYWJsZUJ1aWxkZXIgdGFibGVfYnVpbGRlcihidWlsZGVyKTsKLSAgdGFibGVfYnVpbGRlci5hZGRfc3RyaW5nX3ByaXZhdGUoc3RyaW5nX3ByaXZhdGUpOwotICB0YWJsZV9idWlsZGVyLmFkZF9zdHJpbmdfb3BhcXVlKHN0cmluZ19vcGFxdWUpOwotICB0YWJsZV9idWlsZGVyLmFkZF9zdHJpbmdfYW5vbnltaXplZChzdHJpbmdfYW5vbnltaXplZCk7Ci0gIHRhYmxlX2J1aWxkZXIuYWRkX3N0cmluZ19hbnkoc3RyaW5nX2FueSk7Ci0KLSAgdGFibGVfYnVpbGRlci5hZGRfaW50X3ByaXZhdGUoMTIzKTsKLSAgdGFibGVfYnVpbGRlci5hZGRfaW50X29wYXF1ZSg0NTYpOwotICB0YWJsZV9idWlsZGVyLmFkZF9pbnRfYW5vbnltaXplZCg3ODkpOwotICB0YWJsZV9idWlsZGVyLmFkZF9pbnRfYW55KDB4YWJjKTsKLQotICBidWlsZGVyLkZpbmlzaCh0YWJsZV9idWlsZGVyLkZpbmlzaCgpKTsKLQotICBjb25zdCBUZXN0VGFibGUqIHRlc3RfdGFibGUgPSBHZXRUZXN0VGFibGUoYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCkpOwotCi0gIEFTU0VSVF9FUSgiU3RyaW5nIHByaXZhdGUiLCB0ZXN0X3RhYmxlLT5zdHJpbmdfcHJpdmF0ZSgpLT5zdHIoKSk7Ci0gIEFTU0VSVF9FUSgiU3RyaW5nIG9wYXF1ZSIsIHRlc3RfdGFibGUtPnN0cmluZ19vcGFxdWUoKS0+c3RyKCkpOwotICBBU1NFUlRfRVEoIlN0cmluZyBhbm9ueW1pemVkIiwgdGVzdF90YWJsZS0+c3RyaW5nX2Fub255bWl6ZWQoKS0+c3RyKCkpOwotICBBU1NFUlRfRVEoIlN0cmluZyBhbnkiLCB0ZXN0X3RhYmxlLT5zdHJpbmdfYW55KCktPnN0cigpKTsKLQotICBBU1NFUlRfRVEoMTIzLCB0ZXN0X3RhYmxlLT5pbnRfcHJpdmF0ZSgpKTsKLSAgQVNTRVJUX0VRKDQ1NiwgdGVzdF90YWJsZS0+aW50X29wYXF1ZSgpKTsKLSAgQVNTRVJUX0VRKDc4OSwgdGVzdF90YWJsZS0+aW50X2Fub255bWl6ZWQoKSk7Ci0gIEFTU0VSVF9FUSgweGFiYywgdGVzdF90YWJsZS0+aW50X2FueSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGR1bXBzeXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvYmx1ZXRvb3RoX2ZsYXRidWZmZXJfdGVzdC5mYnMgYi9nZC9kdW1wc3lzL2JsdWV0b290aF9mbGF0YnVmZmVyX3Rlc3QuZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQ5ODEzLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYmx1ZXRvb3RoX2ZsYXRidWZmZXJfdGVzdC5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBCbHVldG9vdGggbW9kdWxlIHRlc3Qgc2NoZW1hCi0KLWF0dHJpYnV0ZSAicHJpdmFjeSI7Ci0KLXRhYmxlIFRlc3RUYWJsZSB7Ci0gICAgc3RyaW5nX3ByaXZhdGU6c3RyaW5nOyAvLyBubyBwcml2YWN5IGF0dHJpYnV0ZSBpbXBsaWVzIHByaXZhdGUKLSAgICBzdHJpbmdfb3BhcXVlOnN0cmluZyAocHJpdmFjeToiT3BhcXVlIik7Ci0gICAgc3RyaW5nX2Fub255bWl6ZWQ6c3RyaW5nIChwcml2YWN5OiJBbm9ueW1pemVkIik7Ci0gICAgc3RyaW5nX2FueTpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotCi0gICAgaW50X3ByaXZhdGU6aW50MzIgKHByaXZhY3k6IlByaXZhdGUiKTsgLy8gRXhwbGljaXRseSBwcml2YXRlCi0gICAgaW50X29wYXF1ZTppbnQzMiAocHJpdmFjeToiT3BhcXVlIik7Ci0gICAgaW50X2Fub255bWl6ZWQ6aW50MzIgKHByaXZhY3k6IkFub255bWl6ZWQiKTsKLSAgICBpbnRfYW55OmludDMyIChwcml2YWN5OiJBbnkiKTsKLX0KLQotcm9vdF90eXBlIFRlc3RUYWJsZTsKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvYnVuZGxlci9BbmRyb2lkLmJwIGIvZ2QvZHVtcHN5cy9idW5kbGVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWY5ZDYuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9idW5kbGVyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhGbGF0YnVmZmVyQnVuZGxlclNvdXJjZXMiLAotICAgIHZpc2liaWxpdHk6IFsiLy92aXNpYmlsaXR5OnByaXZhdGUiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJidW5kbGVyLmNjIiwKLSAgICAgICAgIm1haW4uY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEZsYXRidWZmZXJCdW5kbGVyVGVzdFNvdXJjZXMiLAotICAgIHZpc2liaWxpdHk6IFsiLy92aXNpYmlsaXR5OnByaXZhdGUiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJidW5kbGVyLmNjIiwKLSAgICAgICAgInRlc3QuY2MiLAotICAgIF0sCi19Ci0KLS8vIEZsYXRidWZmZXIgYnVuZGxlciBzY2hlbWEgdGhhdCB3cmFwcyB0aGUgYnVuZGxlZCBiaW5hcnkgbW9kdWxlIHNjaGVtYQotZ2VucnVsZSB7Ci0gICAgbmFtZTogIkJsdWV0b290aEdlbmVyYXRlZEJ1bmRsZXJTY2hlbWFfaF9iZmJzIiwKLSAgICB2aXNpYmlsaXR5OiBbCi0gICAgICAgICIvL3N5c3RlbS9idC9nZCIsCi0gICAgICAgICIvL3N5c3RlbS9idC9tYWluIiwKLSAgICBdLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJmbGF0YyIsCi0gICAgXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGZsYXRjKSAtSSBzeXN0ZW0vYnQvZ2QgLWIgLS1zY2hlbWEgLW8gJChnZW5EaXIpIC0tY3BwICQoaW4pICIsCi0gICAgc3JjczogWwotICAgICAgICAiYnVuZGxlcl9zY2hlbWEuZmJzIiwKLSAgICBdLAotICAgIG91dDogWwotICAgICAgICAiYnVuZGxlcl9zY2hlbWFfZ2VuZXJhdGVkLmgiLCAiYnVuZGxlcl9zY2hlbWEuYmZicyIsCi0gICAgXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyX2RlZmF1bHRzIiwKLSAgICBjcHBfc3RkOiAiYysrMTciLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZEJ1bmRsZXJTY2hlbWFfaF9iZmJzIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAotICAgIH0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmZsYXRidWZmZXJzLWNwcCIsCi0gICAgXSwKLX0KLQotY2NfYmluYXJ5X2hvc3QgewotICAgIG5hbWU6ICJibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6Qmx1ZXRvb3RoRmxhdGJ1ZmZlckJ1bmRsZXJTb3VyY2VzIiwKLSAgICBdLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyX2RlZmF1bHRzIiwKLSAgICBdLAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlcl90ZXN0IiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6Qmx1ZXRvb3RoRmxhdGJ1ZmZlckJ1bmRsZXJUZXN0U291cmNlcyIsCi0gICAgXSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiYmx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlcl9kZWZhdWx0cyIsCi0gICAgXSwKLSAgICBkYXRhOiBbCi0gICAgICAgICJ0ZXN0LmJmYnMiLAotICAgIF0sCi0gICAgdGVzdF9vcHRpb25zOiB7Ci0gICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9idW5kbGVyL0JVSUxELmduIGIvZ2QvZHVtcHN5cy9idW5kbGVyL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDE0OWRjLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQoIi8vYnQvZ2QvZHVtcHN5cy9idW5kbGVyL2J1bmRsZXIuZ25pIikKLWltcG9ydCgiLy9jb21tb24tbWsvZmxhdGJ1ZmZlci5nbmkiKQotCi1idF9mbGF0Y19iaW5hcnlfc2NoZW1hKCJCbHVldG9vdGhHZW5lcmF0ZWRCdW5kbGVyU2NoZW1hX2hfYmZicyIpIHsKLSAgc291cmNlcyA9IFsgImJ1bmRsZXJfc2NoZW1hLmZicyIgXQotICBpbmNsdWRlX2RpciA9ICJidC9nZCIKLSAgZ2VuX2hlYWRlciA9IHRydWUKLX0KLQotIwotIyBUaGUgcmVtYWluaW5nIHJ1bGVzIGFyZSBmb3IgYnVpbGRpbmcgb24gdGhlIGhvc3QKLSMKLQotY29uZmlnKCJidW5kbGVyX2RlZmF1bHRzIikgewotICBjZmxhZ3MgPSBbICItZlBJQyIgXQotCi0gIGNmbGFnc19jYyA9IFsKLSAgICAiLXN0ZD1jKysxNyIsCi0gICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKLSAgICAiLVduby1wb2lzb24tc3lzdGVtLWRpcmVjdG9yaWVzIiwKLSAgXQotfQotCi1leGVjdXRhYmxlKCJibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyIikgewotICBzb3VyY2VzID0gWwotICAgICJidW5kbGVyLmNjIiwKLSAgICAibWFpbi5jYyIsCi0gIF0KLQotICBsaWJzID0gWyAiZmxhdGJ1ZmZlcnMiIF0KLQotICBkZXBzID0gWyAiOkJsdWV0b290aEdlbmVyYXRlZEJ1bmRsZXJTY2hlbWFfaF9iZmJzIiBdCi0KLSAgY29uZmlncyArPSBbICI6YnVuZGxlcl9kZWZhdWx0cyIgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9idW5kbGVyL2J1bmRsZXIuY2MgYi9nZC9kdW1wc3lzL2J1bmRsZXIvYnVuZGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhMmNjYS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2J1bmRsZXIvYnVuZGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgImJ1bmRsZXIuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ1bmRsZXJfc2NoZW1hX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgImZsYXRidWZmZXJzL2lkbC5oIgotI2luY2x1ZGUgImZsYXRidWZmZXJzL3V0aWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDsKLXVzaW5nIG5hbWVzcGFjZSBkdW1wc3lzOwotCi1zdHJ1Y3QgT3B0cyBvcHRzOwotCi0vKioKLSAqIExvYWQgYSBiaW5hcnkgc2NoZW1hIGZyb20gcGVyc2lzdGVudCBzdG9yZSB1c2luZyBmbGF0YnVmZmVyIEFQSS4KLSAqCi0gKiBAcGFyYW0gZmlsZW5hbWU7IE5hbWUgb2YgZmlsZSB0byBvcGVuIGFuZCByZWFkLgotICogQHBhcmFtIGJpbmFyeV9zY2hlbWE6IEJhY2tpbmcgc3RvcmUgZm9yIGZsYXRidWZmZXIgYmluYXJ5IHNjaGVtYSBkYXRhLgotICoKLSAqIEByZXR1cm46IFRydWUgaWYgb3BlcmF0aW9uIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotYm9vbCBMb2FkQmluYXJ5U2NoZW1hKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBzdGQ6OnN0cmluZyogYmluYXJ5X3NjaGVtYSkgewotICBhc3NlcnQoZmlsZW5hbWUgIT0gbnVsbHB0cik7Ci0gIGFzc2VydChiaW5hcnlfc2NoZW1hICE9IG51bGxwdHIpOwotICBpZiAoIWZsYXRidWZmZXJzOjpMb2FkRmlsZShmaWxlbmFtZSwgaGVscGVyOjpBc0JpbmFyeUZpbGUsIGJpbmFyeV9zY2hlbWEpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiBiaW5hcnkgZmxhdGJ1ZmZlciBzY2hlbWEgZmlsZTolc1xuIiwgZmlsZW5hbWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogVmVyaWZ5IGEgYmluYXJ5IHNjaGVtYSB1c2luZyBmbGF0YnVmZmVyIEFQSS4KLSAqCi0gKiBAcGFyYW0gc2NoZW1hOiBSYXcgYmluYXJ5IHNjaGVtYSB0byB2ZXJpZnkKLSAqCi0gKiBAcmV0dXJuOiBUcnVlIGlmIG9wZXJhdGlvbiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLWJvb2wgVmVyaWZ5QmluYXJ5U2NoZW1hKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByYXdfc2NoZW1hKSB7Ci0gIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihyYXdfc2NoZW1hLmRhdGEoKSwgcmF3X3NjaGVtYS5zaXplKCkpOwotICBpZiAoIXJlZmxlY3Rpb246OlZlcmlmeVNjaGVtYUJ1ZmZlcih2ZXJpZmllcikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogQnVuZGxlIGEgc2V0IG9mIGJpbmFyeSBmbGF0YnVmZmVyIHNjaGVtYSBpbnRvIHRoZSBidW5kbGVyIGRhdGFiYXNlLgotICoKLSAqIEBwYXJhbSBidWlsZGVyOyBGbGF0YnVmZmVyIGJ1aWxkZXIKLSAqIEBwYXJhbSBmaWxlbmFtZXM6IFNldCBvZiBmaWxlbmFtZXMgdG8gaW5jbHVkZSBpbiBidW5kbGUKLSAqIEBwYXJhbSB2ZWN0b3JfbWFwOiBGaWxlbmFtZSB0byBmaWxlZGF0YSBtYXBwaW5nCi0gKgotICogQHJldHVybjogVHJ1ZSBpZiBvcGVyYXRpb24gc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1ib29sIENyZWF0ZUJpbmFyeVNjaGVtYUJ1bmRsZSgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBmaWxlbmFtZXMsCi0gICAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdW5kbGVkU2NoZW1hTWFwPj4qIHZlY3Rvcl9tYXAsCi0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiogYnVuZGxlZF9uYW1lcykgewotICBhc3NlcnQoYnVpbGRlciAhPSBudWxscHRyKTsKLSAgYXNzZXJ0KHZlY3Rvcl9tYXAgIT0gbnVsbHB0cik7Ci0gIGFzc2VydChidW5kbGVkX25hbWVzICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBmaWxlbmFtZSA6IGZpbGVuYW1lcykgewotICAgIHN0ZDo6c3RyaW5nIHN0cmluZ19zY2hlbWE7Ci0gICAgaWYgKCFMb2FkQmluYXJ5U2NoZW1hKGZpbGVuYW1lLmNfc3RyKCksICZzdHJpbmdfc2NoZW1hKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCBiaW5hcnkgc2NoZW1hIGZyb20gZmlsZW5hbWU6JXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYXdfc2NoZW1hKHN0cmluZ19zY2hlbWEuYmVnaW4oKSwgc3RyaW5nX3NjaGVtYS5lbmQoKSk7Ci0gICAgaWYgKCFWZXJpZnlCaW5hcnlTY2hlbWEocmF3X3NjaGVtYSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHZlcmlmaWNhdGlvbiBvbiBiaW5hcnkgc2NoZW1hIGZpbGVuYW1lOiVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEqIHNjaGVtYSA9IHJlZmxlY3Rpb246OkdldFNjaGVtYShyYXdfc2NoZW1hLmRhdGEoKSk7Ci0gICAgaWYgKHNjaGVtYS0+cm9vdF90YWJsZSgpID09IG51bGxwdHIpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZpbmQgcm9vdCB0YWJsZSBmb3IgYmluYXJ5IGZsYXRidWZmZXIgc2NoZW1hOiVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBidW5kbGVkX25hbWVzLT5wdXNoX2JhY2soc2NoZW1hLT5yb290X3RhYmxlKCktPm5hbWUoKS0+c3RyKCkpOwotICAgIGF1dG8gbmFtZSA9IGJ1aWxkZXItPkNyZWF0ZVN0cmluZyhzY2hlbWEtPnJvb3RfdGFibGUoKS0+bmFtZSgpLT5zdHIoKSk7Ci0gICAgYXV0byBkYXRhID0gYnVpbGRlci0+Q3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KHJhd19zY2hlbWEuZGF0YSgpLCByYXdfc2NoZW1hLnNpemUoKSk7Ci0gICAgdmVjdG9yX21hcC0+cHVzaF9iYWNrKENyZWF0ZUJ1bmRsZWRTY2hlbWFNYXAoKmJ1aWxkZXIsIG5hbWUsIGRhdGEpKTsKLQotICAgIGlmIChvcHRzLnZlcmJvc2UpIHsKLSAgICAgIGZwcmludGYoc3Rkb3V0LCAiQnVuZGxlZCBiaW5hcnkgc2NoZW1hIGZpbGU6JXNcbiIsIHNjaGVtYS0+cm9vdF90YWJsZSgpLT5uYW1lKCktPmNfc3RyKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBXcml0ZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgYnVuZGxlZCBiaW5hcnkgc2NoZW1hCi0gKiBkYXRhIGFuZCBtZXRhIGRhdGEKLSAqCi0gKiBAcGFyYW0gZGF0YTogU291cmNlIGZpbGUgZGF0YS4KLSAqIEBwYXJhbSBkYXRhX2xlbjogbGVuZ3RoIG9mIGRhdGEKLSAqLwotdm9pZCBXcml0ZUhlYWRlckZpbGUoRklMRSogZnAsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX2xlbikgewotICBhc3NlcnQoZnAgIT0gbnVsbHB0cik7Ci0gIHN0ZDo6c3RyaW5nIGRlbGltKGtEZWZhdWx0TmFtZXNwYWNlRGVsaW0pOwotICBzdGQ6OnN0cmluZyBuc19zdHJpbmcob3B0cy5uc19uYW1lKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzcGFjZXM7Ci0KLSAgc2l6ZV90IHN0YXJ0ID0gMDsKLSAgc2l6ZV90IGVuZCA9IG5zX3N0cmluZy5maW5kKGRlbGltKTsKLSAgd2hpbGUgKGVuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIG5hbWVzcGFjZXMucHVzaF9iYWNrKG5zX3N0cmluZy5zdWJzdHIoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7Ci0gICAgc3RhcnQgPSBlbmQgKyBkZWxpbS5zaXplKCk7Ci0gICAgZW5kID0gbnNfc3RyaW5nLmZpbmQoZGVsaW0sIHN0YXJ0KTsKLSAgfQotICBpZiAoc3RhcnQgIT0gMCAmJiBzdGFydCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIG5hbWVzcGFjZXMucHVzaF9iYWNrKG5zX3N0cmluZy5zdWJzdHIoc3RhcnQpKTsKLSAgfSBlbHNlIGlmICghbnNfc3RyaW5nLmVtcHR5KCkpIHsKLSAgICBuYW1lc3BhY2VzLnB1c2hfYmFjayhuc19zdHJpbmcpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeDsKLSAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogbmFtZXNwYWNlcykgbmFtZXNwYWNlX3ByZWZpeCArPSAobmFtZSArICdfJyk7Ci0KLSAgZnByaW50ZigKLSAgICAgIGZwLAotICAgICAgIi8vIEdlbmVyYXRlZCBmaWxlIGJ5IGJsdWV0b290aF9mbGF0YnVmZmVyIGJ1bmRsZXJcbiIKLSAgICAgICIjaW5jbHVkZSA8c3RyaW5nPlxuIik7Ci0gIGZvcl9lYWNoKAotICAgICAgbmFtZXNwYWNlcy5iZWdpbigpLCBuYW1lc3BhY2VzLmVuZCgpLCBbZnBdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IGZwcmludGYoZnAsICJuYW1lc3BhY2UgJXMge1xuIiwgcy5jX3N0cigpKTsgfSk7Ci0gIGZwcmludGYoZnAsICJleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcmIEdldEJ1bmRsZWRTY2hlbWFEYXRhKCk7XG4iKTsKLSAgZnByaW50ZihmcCwgImNvbnN0IHVuc2lnbmVkIGNoYXIgJXNkYXRhX1slenVdID0ge1xuIiwgbmFtZXNwYWNlX3ByZWZpeC5jX3N0cigpLCBkYXRhX2xlbik7Ci0KLSAgZm9yIChhdXRvIGkgPSAwOyBpIDwgZGF0YV9sZW47IGkrKykgewotICAgIGZwcmludGYoZnAsICIgMHglMDJ4IiwgZGF0YVtpXSk7Ci0gICAgaWYgKGkgIT0gZGF0YV9sZW4gLSAxKSB7Ci0gICAgICBmcHJpbnRmKGZwLCAiLCIpOwotICAgIH0KLSAgICBpZiAoKGkgKyAxKSAlIDE2ID09IDApIHsKLSAgICAgIGZwcmludGYoZnAsICJcbiIpOwotICAgIH0KLSAgfQotICBmcHJpbnRmKGZwLCAiIH07XG4iKTsKLSAgZnByaW50ZigKLSAgICAgIGZwLAotICAgICAgImNvbnN0IHN0ZDo6c3RyaW5nICVzc3RyaW5nX2RhdGFfKCVzZGF0YV8sICVzZGF0YV8gKyBzaXplb2YoJXNkYXRhXykpO1xuIiwKLSAgICAgIG5hbWVzcGFjZV9wcmVmaXguY19zdHIoKSwKLSAgICAgIG5hbWVzcGFjZV9wcmVmaXguY19zdHIoKSwKLSAgICAgIG5hbWVzcGFjZV9wcmVmaXguY19zdHIoKSwKLSAgICAgIG5hbWVzcGFjZV9wcmVmaXguY19zdHIoKSk7Ci0gIGZwcmludGYoZnAsICJjb25zdCBzdGQ6OnN0cmluZyYgR2V0QnVuZGxlZFNjaGVtYURhdGEoKSB7IHJldHVybiAlc3N0cmluZ19kYXRhXzsgfVxuIiwgbmFtZXNwYWNlX3ByZWZpeC5jX3N0cigpKTsKLQotICBmb3JfZWFjaChuYW1lc3BhY2VzLmNyYmVnaW4oKSwgbmFtZXNwYWNlcy5jcmVuZCgpLCBbZnBdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7Ci0gICAgZnByaW50ZihmcCwgIn0gIC8vIG5hbWVzcGFjZSAlc1xuIiwgcy5jX3N0cigpKTsKLSAgfSk7Ci19Ci0KLWludCBSZWFkQnVuZGxlZFNjaGVtYSgpIHsKLSAgY29uc3QgY2hhciogZmlsZW5hbWUgPSBvcHRzLmZpbGVuYW1lOwotICBhc3NlcnQoZmlsZW5hbWUgIT0gbnVsbHB0cik7Ci0KLSAgc3RkOjpzdHJpbmcgZmxhdGZpbGVfZGF0YTsKLSAgaWYgKCFmbGF0YnVmZmVyczo6TG9hZEZpbGUoZmlsZW5hbWUsIGhlbHBlcjo6QXNCaW5hcnlGaWxlLCAmZmxhdGZpbGVfZGF0YSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIHNjaGVtYSBkYXRhIGZpbGU6JXNcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gLTU7Ci0gIH0KLQotICBhdXRvIGJ1bmRsZV9zY2hlbWEgPSBmbGF0YnVmZmVyczo6R2V0Um9vdDxCdW5kbGVkU2NoZW1hPihmbGF0ZmlsZV9kYXRhLmNfc3RyKCkpOwotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVuZGxlZFNjaGVtYU1hcD4+KiBtYXAgPSBidW5kbGVfc2NoZW1hLT5tYXAoKTsKLQotICBmcHJpbnRmKHN0ZG91dCwgIkJ1bmRsZSBzY2hlbWEgdGl0bGU6JXNcbiIsIGJ1bmRsZV9zY2hlbWEtPnRpdGxlKCktPmNfc3RyKCkpOwotICBmcHJpbnRmKHN0ZG91dCwgIkJ1bmRsZSBzY2hlbWEgcm9vdF9uYW1lOiVzXG4iLCBidW5kbGVfc2NoZW1hLT5yb290X25hbWUoKS0+Y19zdHIoKSk7Ci0gIGludCBjbnQgPSAwOwotICBmb3IgKGF1dG8gaXQgPSBtYXAtPmNiZWdpbigpOyBpdCAhPSBtYXAtPmNlbmQoKTsgKytpdCwgY250KyspIHsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIiAgICVkIG5hbWU6JXMgc2NoZW1hOiVzXG4iLCBjbnQsIGl0LT5uYW1lKCktPmNfc3RyKCksICJzY2hlbWEiKTsKLSAgfQotICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQotCi1pbnQgV3JpdGVCdW5kbGVkU2NoZW1hKCkgewotICBjb25zdCBjaGFyKiBmaWxlbmFtZSA9IG9wdHMuZmlsZW5hbWU7Ci0gIGFzc2VydChmaWxlbmFtZSAhPSBudWxscHRyKTsKLQotICBjb25zdCBjaGFyKiBtYWluX3Jvb3RfbmFtZSA9IG9wdHMubWFpbl9yb290X25hbWU7Ci0gIGlmIChtYWluX3Jvb3RfbmFtZSA9PSBudWxscHRyKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNdXN0IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG1haW4gcm9vdCBuYW1lIGZvciB0aGlzIGJ1bmRsZVxuIik7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBiZmJzX2ZpbGVuYW1lczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRzLmFyZy5jOyBpKyspIHsKLSAgICBiZmJzX2ZpbGVuYW1lcy5wdXNoX2JhY2soc3RkOjpzdHJpbmcob3B0cy5hcmcudltpXSkpOwotICB9Ci0gIGlmIChiZmJzX2ZpbGVuYW1lcy5lbXB0eSgpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJObyBiZmJzIGZpbGVzIGFyZSBzcGVjaWZpZWQgdG8gYnVuZGxlXG4iKTsKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICB9Ci0KLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIoMTAyNCk7Ci0KLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBidW5kbGVkX25hbWVzOwotICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1bmRsZWRTY2hlbWFNYXA+PiB2ZWN0b3JfbWFwOwotICBpZiAoIUNyZWF0ZUJpbmFyeVNjaGVtYUJ1bmRsZSgmYnVpbGRlciwgYmZic19maWxlbmFtZXMsICZ2ZWN0b3JfbWFwLCAmYnVuZGxlZF9uYW1lcykpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBidW5kbGUgc2NoZW1hIGJmYnMgZmlsZXNcbiIpOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICBpZiAoc3RkOjpmaW5kKGJ1bmRsZWRfbmFtZXMuYmVnaW4oKSwgYnVuZGxlZF9uYW1lcy5lbmQoKSwgbWFpbl9yb290X25hbWUpID09IGJ1bmRsZWRfbmFtZXMuZW5kKCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSBtYWluIHJvb3QgbmFtZSBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgYnVuZGxlZCBzY2hlbWEgbmFtZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICBtYWluIHJvb3QgbmFtZTolc1xuIiwgbWFpbl9yb290X25hbWUpOwotICAgIGZvciAoYXV0byBuYW1lIDogYnVuZGxlZF9uYW1lcykgewotICAgICAgZnByaW50ZihzdGRlcnIsICIgIGJ1bmRsZWQgc2NoZW1hIG5hbWU6JXNcbiIsIG5hbWUuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICBjb25zdCBjaGFyKiB0aXRsZSA9IG9wdHMudGl0bGU7Ci0gIGF1dG8gc2NoZW1hX29mZnNldCA9IENyZWF0ZUJ1bmRsZWRTY2hlbWFEaXJlY3QoYnVpbGRlciwgdGl0bGUsIG1haW5fcm9vdF9uYW1lLCAmdmVjdG9yX21hcCk7Ci0gIGJ1aWxkZXIuRmluaXNoKHNjaGVtYV9vZmZzZXQpOwotCi0gIHN0ZDo6c3RyaW5nIGZpbmFsX2ZpbGVuYW1lKG9wdHMuZ2VuKTsKLSAgZmluYWxfZmlsZW5hbWUuYXBwZW5kKCIvIik7Ci0gIGZpbmFsX2ZpbGVuYW1lLmFwcGVuZChmaWxlbmFtZSk7Ci0gIGlmICghZmxhdGJ1ZmZlcnM6OlNhdmVGaWxlKAotICAgICAgICAgIGZpbmFsX2ZpbGVuYW1lLmNfc3RyKCksIChjb25zdCBjaGFyKilidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSwgYnVpbGRlci5HZXRTaXplKCksIGhlbHBlcjo6QXNCaW5hcnlGaWxlKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHNhdmUgZmlsZTolc1xuIiwgZmluYWxfZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGhlYWRlcihvcHRzLmdlbik7Ci0gIGhlYWRlciArPSAoIi8iICsgc3RkOjpzdHJpbmcob3B0cy5maWxlbmFtZSkgKyAiLmNjIik7Ci0gIEZJTEUqIGZwID0gZm9wZW4oaGVhZGVyLmNfc3RyKCksICJ3KyIpOwotICBpZiAoZnAgPT0gbnVsbHB0cikgewotICAgIGZwcmludGYoc3Rkb3V0LCAiVW5hYmxlIHRvIG9wZW4gZm9yIHdyaXRpbmcgaGVhZGVyIGZpbGU6JXNcbiIsIGhlYWRlci5jX3N0cigpKTsKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICB9Ci0gIFdyaXRlSGVhZGVyRmlsZShmcCwgYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCksIGJ1aWxkZXIuR2V0U2l6ZSgpKTsKLSAgZmNsb3NlKGZwKTsKLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KLQotaW50IFVzYWdlKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBmcHJpbnRmKAotICAgICAgc3RkZXJyLAotICAgICAgIlVzYWdlOiAlcyBbLXIgfCAtd10gWy1mIDxmaWxlbmFtZT5dIFstZyA8Z2VuX291dF9wYXRoPl0gWy1uIDxuYW1lc3BhY2U+IF0gWy12XSAtbSA8bWFpbl9yb290X25hbWU+IDxmaWxlLmJmYnMgIgotICAgICAgIi4uLj5cbiIsCi0gICAgICBhcmd2WzBdKTsKLSAgZnByaW50ZihzdGRlcnIsICIgLXJ8LXcgOiBSZWFkIG9yIHdyaXRlIGEgZHVtcHN5cyBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgLWYgOiBGaWxlbmFtZSBidW5kbGVkIHNjaGVtYSB0byByZWFkIG9yIHdyaXRlIChkZWZhdWx0OiVzKVxuIiwga0RlZmF1bHRCdW5kbGVEYXRhRmlsZSk7Ci0gIGZwcmludGYoc3RkZXJyLCAiIC1nIDogR2VuZXJhdGVkIGZpbGUgb3V0cHV0IHBhdGhcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAtbiA6IE5hbWVzcGFjZSB0byBlbWJlZCBiaW5hcnkgb3V0cHV0IGJ1bmRsZSBkYXRhIHNvdXJjZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiIC1tIDogTmFtZSBvZiB0aGUgbWFpbiByb290IG9mIHRoaXMgYnVuZGxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgLXYgOiBWZXJib3NlIHByaW50aW5nIG1vZGVcbiIpOwotICByZXR1cm4gRVhJVF9GQUlMVVJFOwotfQotCi12b2lkIFBhcnNlQXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaW50IG9wdDsKLSAgaW50IHBhcnNlZF9jbnQgPSAxOwotICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZjpnOm06bjpydDp2dyIpKSAhPSAtMSkgewotICAgIHBhcnNlZF9jbnQrKzsKLSAgICBzd2l0Y2ggKG9wdCkgewotICAgICAgY2FzZSAnZic6Ci0gICAgICAgIG9wdHMuZmlsZW5hbWUgPSBvcHRhcmc7Ci0gICAgICAgIHBhcnNlZF9jbnQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdnJzoKLSAgICAgICAgb3B0cy5nZW4gPSBvcHRhcmc7Ci0gICAgICAgIHBhcnNlZF9jbnQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdtJzoKLSAgICAgICAgb3B0cy5tYWluX3Jvb3RfbmFtZSA9IG9wdGFyZzsKLSAgICAgICAgcGFyc2VkX2NudCsrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ24nOgotICAgICAgICBvcHRzLm5zX25hbWUgPSBvcHRhcmc7Ci0gICAgICAgIHBhcnNlZF9jbnQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdyJzoKLSAgICAgICAgb3B0cy5yZWFkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd3JzoKLSAgICAgICAgb3B0cy53cml0ZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAndCc6Ci0gICAgICAgIG9wdHMudGl0bGUgPSBvcHRhcmc7Ci0gICAgICAgIHBhcnNlZF9jbnQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd2JzoKLSAgICAgICAgb3B0cy52ZXJib3NlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBleGl0KFVzYWdlKGFyZ2MsIGFyZ3YpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG9wdHMuYXJnLmMgPSBhcmdjIC0gcGFyc2VkX2NudDsKLSAgb3B0cy5hcmcudiA9ICZhcmd2W3BhcnNlZF9jbnRdOwotfQpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9idW5kbGVyL2J1bmRsZXIuZ25pIGIvZ2QvZHVtcHN5cy9idW5kbGVyL2J1bmRsZXIuZ25pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDIwN2Q1Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci9idW5kbGVyLmduaQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBHZW5lcmF0ZSBidW5kbGVkIGZsYXQgYnVmZmVycwotIwotIyBBcmdzOgotIyAgIGluY2x1ZGVfZGlyOiBQYXRoIHRvIGluY2x1ZGUgZGlyZWN0b3J5Ci0jICAgc291cmNlczogRmxhdGJ1ZmZlciBzb3VyY2UgZmlsZXMKLSMgICBnZW5faGVhZGVyIFtvcHRpb25hbF06IFdoZXRoZXIgdG8gZ2VuZXJhdGUgaGVhZGVycy4KLXRlbXBsYXRlKCJidF9mbGF0Y19iaW5hcnlfc2NoZW1hIikgewotICBhY3Rpb25fbmFtZSA9ICIke3RhcmdldF9uYW1lfV9nZW4iCi0gIGFjdGlvbihhY3Rpb25fbmFtZSkgewotICAgIGZvcndhcmRfdmFyaWFibGVzX2Zyb20oaW52b2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVfZGlyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKLSAgICBhc3NlcnQoZGVmaW5lZChpbmNsdWRlX2RpciksICJpbmNsdWRlX2RpciBtdXN0IGJlIHNldCIpCi0gICAgYXNzZXJ0KGRlZmluZWQoc291cmNlcyksICJzb3VyY2VzIG11c3QgYmUgc2V0IikKLQotICAgIGdlbl9oZWFkZXIgPSBkZWZpbmVkKGludm9rZXIuZ2VuX2hlYWRlcikgJiYgaW52b2tlci5nZW5faGVhZGVyCi0KLSAgICBzY3JpcHQgPSAiLy9jb21tb24tbWsvZmlsZV9nZW5lcmF0b3Jfd3JhcHBlci5weSIKLSAgICBiaW5maWxlID0gImZsYXRjIgotICAgIGFyZ3MgPSBbCi0gICAgICBiaW5maWxlLAotICAgICAgIi1JIiwKLSAgICAgICIke2luY2x1ZGVfZGlyfSIsCi0gICAgICAiLWIiLAotICAgICAgIi0tc2NoZW1hIiwKLSAgICAgICItbyIsCi0gICAgICAiJHt0YXJnZXRfZ2VuX2Rpcn0iLAotICAgIF0KLQotICAgIGJmYnNfbmFtZXMgPSBbXQotICAgIHNyY2xpc3QgPSBbXQotICAgIG91dHB1dHMgPSBbXQotCi0gICAgZm9yZWFjaChzLCBzb3VyY2VzKSB7Ci0gICAgICBzcmNsaXN0ICs9IFsgcmViYXNlX3BhdGgocykgXQotCi0gICAgICAjIGJmYnMgZ2V0IGdlbmVyYXRlZCBpbnRvICR7dGFyZ2V0X2dlbl9yb290fSBkaXJlY3RvcnkKLSAgICAgIG5hbWUgPSBzdHJpbmdfcmVwbGFjZShnZXRfcGF0aF9pbmZvKHMsICJmaWxlIiksICIuZmJzIiwgIi5iZmJzIikKLSAgICAgIGJmYnNfbmFtZXMgKz0gWyAiJHt0YXJnZXRfZ2VuX2Rpcn0vJHtuYW1lfSIgXQotICAgICAgb3V0cHV0cyArPSBbICIke3RhcmdldF9nZW5fZGlyfS8ke25hbWV9IiBdCi0KLSAgICAgICMgaGVhZGVycyBnZXQgZ2VuZXJhdGVkIGl0byBzdWJkaXJlY3RvcmllcyBiYXNlZCBvbiByZWxhdGl2ZSBwYXRoCi0gICAgICBpZiAoZ2VuX2hlYWRlcikgewotICAgICAgICBoZWFkZXJfbmFtZSA9IHN0cmluZ19yZXBsYWNlKHMsICIuZmJzIiwgIl9nZW5lcmF0ZWQuaCIpCi0gICAgICAgIG91dHB1dHMgKz0gWyAiJHt0YXJnZXRfZ2VuX2Rpcn0vJHtoZWFkZXJfbmFtZX0iIF0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAjIEdlbmVyYXRlIGhlYWRlciBmaWxlIGFzIHdlbGwKLSAgICBpZiAoZ2VuX2hlYWRlcikgewotICAgICAgYXJncyArPSBbICItLWNwcCIgXQotICAgIH0KLQotICAgICMgQWN0dWFsIGlucHV0IGZpbGVzIGF0IHRoZSBlbmQKLSAgICBhcmdzICs9IHNyY2xpc3QKLQotICAgIG1ldGFkYXRhID0gewotICAgICAgYmZic19vdXRwdXRzID0gYmZic19uYW1lcwotICAgIH0KLSAgfQotCi0gIGFsbF9kZXBlbmRlbnRfY29uZmlnX25hbWUgPSAiXyR7dGFyZ2V0X25hbWV9X2FsbF9kZXBlbmRlbnRfY29uZmlnIgotICBjb25maWcoYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSkgewotICAgICMgU2luY2UgZWFjaCBoZWFkZXIgd2lsbCBiZSBnZW5lcmF0ZWQgaW50byBhIHN1YmRpcmVjdG9yeSwgYWRkIHRoZW0gdG8gdGhlCi0gICAgIyBpbmNsdWRlIGRpcnMgYXMgd2VsbAotICAgIGdlbl9kaXJzID0gW10KLSAgICBmb3JlYWNoKHMsIGludm9rZXIuc291cmNlcykgewotICAgICAgZ2VuX2RpcnMgKz0gWyBnZXRfcGF0aF9pbmZvKHMsICJnZW5fZGlyIikgXQotICAgIH0KLQotICAgIGluY2x1ZGVfZGlycyA9IFsgIiR7dGFyZ2V0X2dlbl9kaXJ9IiBdICsgZ2VuX2RpcnMKLSAgfQotCi0gIGdlbmVyYXRlZF9maWxlKHRhcmdldF9uYW1lKSB7Ci0gICAgb3V0cHV0cyA9IFsgIiR7dGFyZ2V0X2dlbl9kaXJ9LyR7dGFyZ2V0X25hbWV9LmZpbGVzIiBdCi0gICAgb3V0cHV0X2NvbnZlcnNpb24gPSAibGlzdCBsaW5lcyIKLSAgICBkYXRhX2tleXMgPSBbICJiZmJzX291dHB1dHMiIF0KLQotICAgIGFsbF9kZXBlbmRlbnRfY29uZmlncyA9IFsgIjoke2FsbF9kZXBlbmRlbnRfY29uZmlnX25hbWV9IiBdCi0gICAgaWYgKGRlZmluZWQoaW52b2tlci5hbGxfZGVwZW5kZW50X2NvbmZpZ3MpKSB7Ci0gICAgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgKz0gaW52b2tlci5hbGxfZGVwZW5kZW50X2NvbmZpZ3MKLSAgICB9Ci0KLSAgICBkZXBzID0gWyAiOiR7YWN0aW9uX25hbWV9IiBdCi0gICAgaWYgKGRlZmluZWQoaW52b2tlci5kZXBzKSkgewotICAgICAgZGVwcyArPSBpbnZva2VyLmRlcHMKLSAgICB9Ci0KLSAgICBpZiAoZGVmaW5lZChpbnZva2VyLmNvbmZpZ3MpKSB7Ci0gICAgICBjb25maWdzICs9IGludm9rZXIuY29uZmlncwotICAgIH0KLSAgfQotfQotCi0jIEdlbmVyYXRlIGJ1bmRsZWQgaGVhZGVyCi10ZW1wbGF0ZSgiYnRfZmxhdGNfYnVuZGxlciIpIHsKLSAgYWN0aW9uX25hbWUgPSAiJHt0YXJnZXRfbmFtZX1fZ2VuIgotICBhY3Rpb24oYWN0aW9uX25hbWUpIHsKLSAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgImRlcHMiIF0pCi0gICAgYXNzZXJ0KGRlZmluZWQoZGVwcyksICJkZXBzIG11c3QgYmUgc2V0IikKLSAgICBhc3NlcnQoZGVmaW5lZChpbnZva2VyLnJvb3RfbmFtZSksICJyb290X25hbWUgbXVzdCBiZSBzZXQiKQotICAgIGFzc2VydChkZWZpbmVkKGludm9rZXIuZmlsZW5hbWUpLCAiZmlsZW5hbWUgbXVzdCBiZSBzZXQiKQotICAgIGFzc2VydChkZWZpbmVkKGludm9rZXIubmFtZXNwYWNlKSwgIm5hbWVzcGFjZSBtdXN0IGJlIHNldCIpCi0KLSAgICBmaWxlc19saXN0ID0gW10KLSAgICBmb3JlYWNoKHMsIGRlcHMpIHsKLSAgICAgIG5hbWUgPSBnZXRfbGFiZWxfaW5mbyhzLCAibmFtZSIpCi0gICAgICBnZW5fZGlyID0gZ2V0X2xhYmVsX2luZm8ocywgInRhcmdldF9nZW5fZGlyIikKLSAgICAgIGZpbGVzX2xpc3QgKz0gWyAiJHtnZW5fZGlyfS8ke25hbWV9LmZpbGVzIiBdCi0gICAgfQotCi0gICAgc2NyaXB0ID0gIi8vYnQvZ2QvZHVtcHN5cy9idW5kbGVyL2V4dHJhY3RfZmlsZXNfYW5kX2NhbGwucHkiCi0gICAgYmluZmlsZSA9ICIke3Jvb3Rfb3V0X2Rpcn0vYmx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlciIKLSAgICBhcmdzID0gZmlsZXNfbGlzdAotICAgIGFyZ3MgKz0gWwotICAgICAgIi0tIiwKLSAgICAgIGJpbmZpbGUsCi0gICAgICAiLXciLAotICAgICAgIi1tIiwKLSAgICAgICIke2ludm9rZXIucm9vdF9uYW1lfSIsCi0gICAgICAiLWYiLAotICAgICAgIiR7aW52b2tlci5maWxlbmFtZX0iLAotICAgICAgIi1uIiwKLSAgICAgICIke2ludm9rZXIubmFtZXNwYWNlfSIsCi0gICAgICAiLWciLAotICAgICAgIiR7dGFyZ2V0X2dlbl9kaXJ9IiwKLSAgICBdCi0KLSAgICBvdXRwdXRzID0gWwotICAgICAgIiR7dGFyZ2V0X2dlbl9kaXJ9LyR7aW52b2tlci5maWxlbmFtZX0uY2MiLAotICAgICAgIiR7dGFyZ2V0X2dlbl9kaXJ9LyR7aW52b2tlci5maWxlbmFtZX0iLAotICAgIF0KLQotICAgIG1ldGFkYXRhID0gewotICAgICAgYWxsX291dHB1dHMgPSBvdXRwdXRzCi0gICAgfQotICB9Ci0KLSAgYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSA9ICJfJHt0YXJnZXRfbmFtZX1fYWxsX2RlcGVuZGVudF9jb25maWciCi0gIGNvbmZpZyhhbGxfZGVwZW5kZW50X2NvbmZpZ19uYW1lKSB7Ci0gICAgaW5jbHVkZV9kaXJzID0gWyAiJHt0YXJnZXRfZ2VuX2Rpcn0iIF0KLSAgfQotCi0gIHNvdXJjZV9zZXQodGFyZ2V0X25hbWUpIHsKLSAgICBzb3VyY2VzID0gWwotICAgICAgIiR7dGFyZ2V0X2dlbl9kaXJ9LyR7aW52b2tlci5maWxlbmFtZX0uY2MiLAotICAgIF0KLQotICAgIHB1YmxpY19kZXBzID0gWyAiOiRhY3Rpb25fbmFtZSIgXQotCi0gICAgaWYgKGRlZmluZWQoaW52b2tlci5jb25maWdzKSkgewotICAgICAgY29uZmlncyArPSBpbnZva2VyLmNvbmZpZ3MKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvYnVuZGxlci9idW5kbGVyLmggYi9nZC9kdW1wc3lzL2J1bmRsZXIvYnVuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM0YjI0Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci9idW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSB7Ci1jb25zdGV4cHIgY2hhciBrRGVmYXVsdEJ1bmRsZURhdGFGaWxlW10gPSAiYnVuZGxlX2JmYnMuYmluIjsKLWNvbnN0ZXhwciBjaGFyIGtEZWZhdWx0R2VuZXJhdGVkT3V0cHV0UGF0aFtdID0gIi4iOwotY29uc3RleHByIGNoYXIga0RlZmF1bHROYW1lc3BhY2VbXSA9ICIiOwotY29uc3RleHByIGNoYXIga0RlZmF1bHROYW1lc3BhY2VEZWxpbVtdID0gIjo6IjsKLWNvbnN0ZXhwciBjaGFyIGtEZWZhdWx0VGl0bGVbXSA9ICJCdW5kbGVkIHNjaGVtYSB0YWJsZXMiOwotfSAgLy8gbmFtZXNwYWNlCi0KLXN0cnVjdCBPcHRzIHsKLSAgYm9vbCB2ZXJib3Nle2ZhbHNlfTsKLSAgYm9vbCByZWFke2ZhbHNlfTsKLSAgYm9vbCB3cml0ZXtmYWxzZX07Ci0gIGNvbnN0IGNoYXIqIGZpbGVuYW1le2tEZWZhdWx0QnVuZGxlRGF0YUZpbGV9OwotICBjb25zdCBjaGFyKiBnZW57a0RlZmF1bHRHZW5lcmF0ZWRPdXRwdXRQYXRofTsKLSAgY29uc3QgY2hhciogbWFpbl9yb290X25hbWV7bnVsbHB0cn07Ci0gIGNvbnN0IGNoYXIqIG5zX25hbWV7a0RlZmF1bHROYW1lc3BhY2V9OwotICBjb25zdCBjaGFyKiB0aXRsZXtrRGVmYXVsdFRpdGxlfTsKLSAgc3RydWN0IHsKLSAgICBpbnQgY3swfTsKLSAgICBjaGFyKiogdntudWxscHRyfTsKLSAgfSBhcmc7Ci19OwotZXh0ZXJuIE9wdHMgb3B0czsKLQotbmFtZXNwYWNlIHsKLW5hbWVzcGFjZSBoZWxwZXIgeyAgLy8gUGFydCBvZiBmbGF0YnVmZmVycyBBUEkKLWNvbnN0ZXhwciBib29sIEFzQmluYXJ5RmlsZSA9IHRydWU7Ci1jb25zdGV4cHIgYm9vbCBBc1RleHRGaWxlID0gZmFsc2U7Ci19ICAvLyBuYW1lc3BhY2UgaGVscGVyCi0KLX0gIC8vIG5hbWVzcGFjZQotCi0vKioKLSAqIFJlYWQgYW5kIHBhcnNlIGEgcHJldmlvdXNseSBnZW5lcmF0ZWQgYnVuZGxlIGRhdGEgZmlsZQotICoKLSAqKi8KLWludCBSZWFkQnVuZGxlZFNjaGVtYSgpOwotCi0vKioKLSAqIEdlbmVyYXRlIGEgYnVuZGxlIGRhdGEgZmlsZSBmcm9tIHRoZSBiaW5hcnkgZmxhdGJ1ZmZlciBzY2hlbWEKLSAqIGZpbGVzIHByb3ZpZGVkIGFzIGlucHV0Ci0gKgotICoqLwotaW50IFdyaXRlQnVuZGxlZFNjaGVtYSgpOwotCi0vKioKLSAqIFByaW50IHRvb2wgdXNhZ2Ugb3B0aW9ucwotICovCi1pbnQgVXNhZ2UoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKLQotLyoqCi0gKiBQYXJzZSB0b29sIHVzYWdlIG9wdGlvbnMKLSAqLwotdm9pZCBQYXJzZUFyZ3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvYnVuZGxlci9idW5kbGVyX3NjaGVtYS5mYnMgYi9nZC9kdW1wc3lzL2J1bmRsZXIvYnVuZGxlcl9zY2hlbWEuZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFmYjdmLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci9idW5kbGVyX3NjaGVtYS5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLyBCdW5kbGVkIFNjaGVtYQotLy8KLS8vIERlc2NyaWJlcyBhIGNvbGxlY3Rpb24gb2YgYmluYXJ5IGZsYXRidWZmZXIgc2NoZW1hLgotLy8KLQotbmFtZXNwYWNlIGJsdWV0b290aC5kdW1wc3lzOwotCi10YWJsZSBCdW5kbGVkU2NoZW1hTWFwIHsKLSAgICBuYW1lOnN0cmluZzsKLSAgICBkYXRhOlt1Ynl0ZV07Ci19Ci0KLXRhYmxlIEJ1bmRsZWRTY2hlbWEgewotICAgIHRpdGxlOnN0cmluZzsKLSAgICByb290X25hbWU6c3RyaW5nOwotICAgIG1hcDpbQnVuZGxlZFNjaGVtYU1hcF07Ci19Ci0KLXJvb3RfdHlwZSBCdW5kbGVkU2NoZW1hOwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9idW5kbGVyL2V4dHJhY3RfZmlsZXNfYW5kX2NhbGwucHkgYi9nZC9kdW1wc3lzL2J1bmRsZXIvZXh0cmFjdF9maWxlc19hbmRfY2FsbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYwNDE1Zi4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2J1bmRsZXIvZXh0cmFjdF9maWxlc19hbmRfY2FsbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMgLSotIGNvZGluZzogdXRmLTggLSotCi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSIiIiBHZXQgY29udGVudHMgb2YgZ2l2ZW4gZmlsZXMgYW5kIHBhc3MgYXMgYXJncyB0byByZW1haW5pbmcgcGFyYW1zLgotCi1FeGFtcGxlOgotICBhLmZpbGVzID0gWyAiZm9vIiwgImJhciIgXQotICBiLmZpbGVzID0gWyAiZml6eiIsICJidXp6IiBdCi0KLSAgZXh0cmFjdF9maWxlc19hbmRfY2FsbC5weSBhLmZpbGVzIGIuZmlsZXMgLS0gc29tZWJpbiAtYSAtLXNldCBmb28gLWMgLW8KLQotICB3aWxsIHJlc3VsdCBpbiB0aGlzIGNhbGw6Ci0KLSAgc29tZWJpbiAtYSAtLXNldCBmb28gLWMgLW8gZm9vIGJhciBmaXp6IGJ1enoKLQotIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KLQotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLQotCi1kZWYgZmlsZV90b19hcmdzKGZpbGVuYW1lKToKLSAgICAiIiIgUmVhZCBmaWxlIGFuZCByZXR1cm4gbGluZXMgd2l0aCBlbXB0aWVzIHJlbW92ZWQuCi0gICAgIiIiCi0gICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGY6Ci0gICAgICAgIHJldHVybiBbeC5zdHJpcCgpIGZvciB4IGluIGYucmVhZGxpbmVzKCkgaWYgeC5zdHJpcCgpXQotCi0KLWRlZiBtYWluKCk6Ci0gICAgZmlsZV9jb250ZW50cyA9IFtdCi0gICAgYXJncyA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHN5cy5hcmd2KSAtIDEpOgotICAgICAgICBpZiBzeXMuYXJndltpXSA9PSAnLS0nOgotICAgICAgICAgICAgYXJncyA9IHN5cy5hcmd2W2kgKyAxOl0gKyBmaWxlX2NvbnRlbnRzCi0gICAgICAgICAgICBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZmlsZV9jb250ZW50cy5leHRlbmQoZmlsZV90b19hcmdzKHN5cy5hcmd2W2ldKSkKLQotICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChhcmdzKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2J1bmRsZXIvbWFpbi5jYyBiL2dkL2R1bXBzeXMvYnVuZGxlci9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQwZWYyLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlICJidW5kbGVyLmgiCi0jaW5jbHVkZSAiYnVuZGxlcl9zY2hlbWFfZ2VuZXJhdGVkLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBQYXJzZUFyZ3MoYXJnYywgYXJndik7Ci0gIGlmIChvcHRzLnJlYWQpIHsKLSAgICBleGl0KFJlYWRCdW5kbGVkU2NoZW1hKCkpOwotICB9Ci0gIGlmIChvcHRzLndyaXRlKSB7Ci0gICAgZXhpdChXcml0ZUJ1bmRsZWRTY2hlbWEoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvYnVuZGxlci90ZXN0LmJmYnMgYi9nZC9kdW1wc3lzL2J1bmRsZXIvdGVzdC5iZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRhNmU1Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci90ZXN0LmJmYnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2J1bmRsZXIvdGVzdC5jYyBiL2dkL2R1bXBzeXMvYnVuZGxlci90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjliNmZmLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvYnVuZGxlci90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidW5kbGVyLmgiCi0jaW5jbHVkZSAiYnVuZGxlcl9zY2hlbWFfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKLQotLy8gTXVzdCBiZSBydW4gZnJvbSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHRlc3QgZGF0YSAndGVzdC5iZmJzJy4KLS8vIFRoaXMgaXMgaG93IHRoZSBwcmVzdWJtaXQgdW5pdCB0ZXN0IHBpcGVsaW5lIGZ1bmN0aW9ucy4KLWNvbnN0ZXhwciBjaGFyIGtUZXN0RmlsZW5hbWVbXSA9ICJ0ZXN0LmJmYnMiOwotCi1ib29sIExvYWRCaW5hcnlTY2hlbWEoY29uc3QgY2hhciogZmlsZW5hbWUsIHN0ZDo6c3RyaW5nKiBiaW5hcnlfc2NoZW1hKTsKLWJvb2wgVmVyaWZ5QmluYXJ5U2NoZW1hKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByYXdfc2NoZW1hKTsKLWJvb2wgQ3JlYXRlQmluYXJ5U2NoZW1hQnVuZGxlKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogYnVpbGRlciwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZpbGVuYW1lcywKLSAgICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGJsdWV0b290aDo6ZHVtcHN5czo6QnVuZGxlZFNjaGVtYU1hcD4+KiB2ZWN0b3JfbWFwLAotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4qIGJ1bmRsZWRfbmFtZXMpOwotaW50IFdyaXRlSGVhZGVyRmlsZShGSUxFKiBmcCwgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfbGVuKTsKLQotY2xhc3MgQnVuZGxlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotfTsKLQotVEVTVF9GKEJ1bmRsZXJUZXN0LCBMb2FkQmluYXJ5U2NoZW1hKSB7Ci0gIHN0ZDo6c3RyaW5nIHN0cmluZ19zY2hlbWE7Ci0gIEFTU0VSVF9GQUxTRShMb2FkQmluYXJ5U2NoZW1hKG51bGxwdHIsICZzdHJpbmdfc2NoZW1hKSk7Ci0gIEFTU0VSVF9ERUFUSChMb2FkQmluYXJ5U2NoZW1hKGtUZXN0RmlsZW5hbWUsIG51bGxwdHIpLCAiIik7Ci0gIEFTU0VSVF9UUlVFKExvYWRCaW5hcnlTY2hlbWEoa1Rlc3RGaWxlbmFtZSwgJnN0cmluZ19zY2hlbWEpKTsKLSAgQVNTRVJUX0ZBTFNFKExvYWRCaW5hcnlTY2hlbWEoImRvZXNfbm90X2V4aXN0LmJmYnMiLCAmc3RyaW5nX3NjaGVtYSkpOwotfQotCi1URVNUX0YoQnVuZGxlclRlc3QsIFZlcmlmeUJpbmFyeVNjaGVtYSkgewotICBzdGQ6OnN0cmluZyBzdHJpbmdfc2NoZW1hOwotICBBU1NFUlRfVFJVRShMb2FkQmluYXJ5U2NoZW1hKGtUZXN0RmlsZW5hbWUsICZzdHJpbmdfc2NoZW1hKSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJhd19zY2hlbWEoc3RyaW5nX3NjaGVtYS5iZWdpbigpLCBzdHJpbmdfc2NoZW1hLmVuZCgpKTsKLSAgQVNTRVJUX1RSVUUoVmVyaWZ5QmluYXJ5U2NoZW1hKHJhd19zY2hlbWEpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBib2d1c19yYXdfc2NoZW1hKHN0cmluZ19zY2hlbWEuYmVnaW4oKSArIDEsIHN0cmluZ19zY2hlbWEuZW5kKCkpOwotICBBU1NFUlRfRkFMU0UoVmVyaWZ5QmluYXJ5U2NoZW1hKGJvZ3VzX3Jhd19zY2hlbWEpKTsKLX0KLQotVEVTVF9GKEJ1bmRsZXJUZXN0LCBDcmVhdGVCaW5hcnlTY2hlbWFCdW5kbGUpIHsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXI7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlbmFtZXM7Ci0gIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8Ymx1ZXRvb3RoOjpkdW1wc3lzOjpCdW5kbGVkU2NoZW1hTWFwPj4gdmVjdG9yX21hcDsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBidW5kbGVkX25hbWVzOwotICBBU1NFUlRfVFJVRShDcmVhdGVCaW5hcnlTY2hlbWFCdW5kbGUoJmJ1aWxkZXIsIGZpbGVuYW1lcywgJnZlY3Rvcl9tYXAsICZidW5kbGVkX25hbWVzKSk7Ci0gIEFTU0VSVF9FUSgwLCB2ZWN0b3JfbWFwLnNpemUoKSk7Ci19Ci0KLVRFU1RfRihCdW5kbGVyVGVzdCwgV3JpdGVIZWFkZXJGaWxlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE7Ci0gIGRhdGEucHVzaF9iYWNrKDB4MTApOwotICBkYXRhLnB1c2hfYmFjaygweDExKTsKLSAgZGF0YS5wdXNoX2JhY2soMHgxMik7Ci0gIGRhdGEucHVzaF9iYWNrKDB4MTMpOwotICBBU1NFUlRfREVBVEgoV3JpdGVIZWFkZXJGaWxlKG51bGxwdHIsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSksICIiKTsKLSAgRklMRSogZnAgPSBmb3BlbigiL3RtcC90ZXN0LmgiLCAidysiKTsKLSAgQVNTRVJUX05FKGZwLCBudWxscHRyKTsKLSAgV3JpdGVIZWFkZXJGaWxlKGZwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotICBmc2VlayhmcCwgMEwsIFNFRUtfU0VUKTsKLSAgY2hhciBidWZbMTZdOwotICBmcmVhZChidWYsIDEsIDE1LCBmcCk7Ci0gIGJ1ZlsxMl0gPSAnXDAnOwotICBzdGQ6OnN0cmluZyBzKGJ1Zik7Ci0gIEFTU0VSVF9FUSgiLy8gR2VuZXJhdGVkIiwgcyk7Ci0gIGZjbG9zZShmcCk7Ci0gIHVubGluaygiL3RtcC90ZXN0LmgiKTsKLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvZHVtcHN5cy5oIGIvZ2QvZHVtcHN5cy9kdW1wc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMmNhZmQuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9kdW1wc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGR1bXBzeXMgewotY29uc3Qgc3RkOjpzdHJpbmcmIEdldEJ1bmRsZWRTY2hlbWFEYXRhKCk7Ci19ICAvLyBuYW1lc3BhY2UgZHVtcHN5cwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9kdW1wc3lzX3Rlc3RfZGF0YS5oIGIvZ2QvZHVtcHN5cy9kdW1wc3lzX3Rlc3RfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNkNzAyLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvZHVtcHN5c190ZXN0X2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotY29uc3Qgc3RkOjpzdHJpbmcmIEdldEJ1bmRsZWRTY2hlbWFEYXRhKCk7Ci19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9maWx0ZXIuY2MgYi9nZC9kdW1wc3lzL2ZpbHRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjZmRhNS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ZpbHRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiZHVtcHN5cy9maWx0ZXIuaCIKLSNpbmNsdWRlICJkdW1wc3lzL2ludGVybmFsL2ZpbHRlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOwotdXNpbmcgbmFtZXNwYWNlIGR1bXBzeXM7Ci0KLWNsYXNzIEZpbHRlciB7Ci0gcHVibGljOgotICBGaWx0ZXIoY29uc3QgZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYSYgcmVmbGVjdGlvbl9zY2hlbWEpIDogcmVmbGVjdGlvbl9zY2hlbWFfKHJlZmxlY3Rpb25fc2NoZW1hKSB7fQotCi0gIHZpcnR1YWwgfkZpbHRlcigpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIHZvaWQgRmlsdGVySW5QbGFjZShjaGFyKiBkdW1wc3lzX2RhdGEpID0gMDsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEZpbHRlcj4gRmFjdG9yeSgKLSAgICAgIGR1bXBzeXM6OkZpbHRlclR5cGUgZmlsdGVyX3R5cGUsIGNvbnN0IGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWEmIHJlZmxlY3Rpb25fc2NoZW1hKTsKLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIEdpdmVuIGJvdGggcmVmbGVjdGlvbiBmaWVsZCBkYXRhIGFuZCB0aGUgcG9wdWxhdGVkIGZsYXRidWZmZXIgdGFibGUgZGF0YSwgaWYgYW55LAotICAgKiBmaWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWVsZCBiYXNlZCB1cG9uIHRoZSBmaWx0ZXJpbmcgcHJpdmFjeSBsZXZlbC4KLSAgICoKLSAgICogUHJpbWl0aXZlcyBhbmQgY29tcG9zaXRlIHN0cmluZ3MgbWF5IGJlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYXQgdGhpcyBwb2ludC4KLSAgICogT3RoZXIgY29tcG9zaXRlIHR5cGVzIChlLmcuIHN0cnVjdHMgb3IgdGFibGVzKSBtdXN0IGJlIGV4cGFuZGVkIGludG8gdGhlCi0gICAqIHJlc3BlY3RpdmUgZ3JvdXBpbmcgb2Ygc3ViZmllbGRzLgotICAgKgotICAgKiBAcGFyYW0gZmllbGQgVGhlIHJlZmxlY3Rpb24gZmllbGQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYnVuZGxlZCBzY2hlbWEKLSAgICogQHBhcmFtIHRhYmxlIFRoZSBwb3B1bGF0ZWQgZmllbGQgZGF0YSwgaWYgYW55Ci0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWVsZCB3YXMgZmlsdGVyZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgRmlsdGVyRmllbGQoY29uc3QgcmVmbGVjdGlvbjo6RmllbGQqIGZpZWxkLCBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGJvdGggcmVmbGVjdGlvbiBvYmplY3QgZGF0YSBhbmQgdGhlIHBvcHVsYXRlZCBmbGF0YnVmZmVyIHRhYmxlIGRhdGEsIGlmIGFueSwKLSAgICogZmlsdGVyIHRoZSBvYmplY3QgZmllbGRzIGJhc2VkIHVwb24gdGhlIGZpbHRlcmluZyBwcml2YWN5IGxldmVsLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSByZWZsZWN0aW9uIG9iamVjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBidW5kbGVkIHNjaGVtYQotICAgKiBAcGFyYW0gdGFibGUgVGhlIHBvcHVsYXRlZCBmaWVsZCBkYXRhLCBpZiBhbnkKLSAgICoKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBGaWx0ZXJPYmplY3QoY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QsIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUpe307Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGJvdGggcmVmbGVjdGlvbiBmaWVsZCBkYXRhIGFuZCB0aGUgcG9wdWxhdGVkIHRhYmxlIGRhdGEsIGlmIGFueSwKLSAgICogZmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUgYmFzZWQgdXBvbiB0aGUgZmlsdGVyaW5nIHByaXZhY3kgbGV2ZWwuCi0gICAqCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhlIHJlZmxlY3Rpb24gc2NoZW1hIGluZm9ybWF0aW9uIGZyb20gdGhlIGJ1bmRsZWQgc2NoZW1hCi0gICAqIEBwYXJhbSB0YWJsZSBUaGUgcG9wdWxhdGVkIGZpZWxkIGRhdGEsIGlmIGFueQotICAgKgotICAgKi8KLSAgdmlydHVhbCB2b2lkIEZpbHRlclRhYmxlKGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogc2NoZW1hLCBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlKXt9OwotCi0gIGNvbnN0IGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWEmIHJlZmxlY3Rpb25fc2NoZW1hXzsKLX07Ci0KLWNsYXNzIERldmVsb3BlclByaXZhY3lGaWx0ZXIgOiBwdWJsaWMgRmlsdGVyIHsKLSBwdWJsaWM6Ci0gIERldmVsb3BlclByaXZhY3lGaWx0ZXIoY29uc3QgZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYSYgcmVmbGVjdGlvbl9zY2hlbWEpIDogRmlsdGVyKHJlZmxlY3Rpb25fc2NoZW1hKSB7fQotICB2b2lkIEZpbHRlckluUGxhY2UoY2hhciogZHVtcHN5c19kYXRhKSBvdmVycmlkZSB7fQotfTsKLQotY2xhc3MgVXNlclByaXZhY3lGaWx0ZXIgOiBwdWJsaWMgRmlsdGVyIHsKLSBwdWJsaWM6Ci0gIFVzZXJQcml2YWN5RmlsdGVyKGNvbnN0IGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWEmIHJlZmxlY3Rpb25fc2NoZW1hKSA6IEZpbHRlcihyZWZsZWN0aW9uX3NjaGVtYSkge30KLSAgdm9pZCBGaWx0ZXJJblBsYWNlKGNoYXIqIGR1bXBzeXNfZGF0YSkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgRmlsdGVyRmllbGQoY29uc3QgcmVmbGVjdGlvbjo6RmllbGQqIGZpZWxkLCBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlKSBvdmVycmlkZTsKLSAgdm9pZCBGaWx0ZXJPYmplY3QoY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QsIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUpIG92ZXJyaWRlOwotICB2b2lkIEZpbHRlclRhYmxlKGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogc2NoZW1hLCBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlKSBvdmVycmlkZTsKLX07Ci0KLWJvb2wgVXNlclByaXZhY3lGaWx0ZXI6OkZpbHRlckZpZWxkKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkKiBmaWVsZCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSkgewotICBBU1NFUlQoZmllbGQgIT0gbnVsbHB0cik7Ci0gIEFTU0VSVCh0YWJsZSAhPSBudWxscHRyKTsKLSAgaW50ZXJuYWw6OlByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsID0gaW50ZXJuYWw6OkZpbmRGaWVsZFByaXZhY3lMZXZlbCgqZmllbGQpOwotCi0gIHN3aXRjaCAoc3RhdGljX2Nhc3Q8ZmxhdGJ1ZmZlcnM6OkJhc2VUeXBlPihmaWVsZC0+dHlwZSgpLT5iYXNlX3R5cGUoKSkpIHsKLSAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfSU5UOgotICAgICAgcmV0dXJuIGludGVybmFsOjpGaWx0ZXJUeXBlSW50ZWdlcigqZmllbGQsIHRhYmxlLCBwcml2YWN5X2xldmVsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBpbnRlcm5hbDo6RmlsdGVyVHlwZUZsb2F0KCpmaWVsZCwgdGFibGUsIHByaXZhY3lfbGV2ZWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBmbGF0YnVmZmVyczo6QkFTRV9UWVBFX1NUUklORzoKLSAgICAgIHJldHVybiBpbnRlcm5hbDo6RmlsdGVyVHlwZVN0cmluZygqZmllbGQsIHRhYmxlLCBwcml2YWN5X2xldmVsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZmxhdGJ1ZmZlcnM6OkJBU0VfVFlQRV9TVFJVQ1Q6Ci0gICAgICByZXR1cm4gaW50ZXJuYWw6OkZpbHRlclR5cGVTdHJ1Y3QoKmZpZWxkLCB0YWJsZSwgcHJpdmFjeV9sZXZlbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGZsYXRidWZmZXJzOjpCQVNFX1RZUEVfQk9PTDoKLSAgICAgIHJldHVybiBpbnRlcm5hbDo6RmlsdGVyVHlwZUJvb2woKmZpZWxkLCB0YWJsZSwgcHJpdmFjeV9sZXZlbCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIiVzIFdBUk4gVW5zdXBwb3J0ZWQgYmFzZSB0eXBlXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgVXNlclByaXZhY3lGaWx0ZXI6OkZpbHRlck9iamVjdChjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSkgewotICBBU1NFUlQob2JqZWN0ICE9IG51bGxwdHIpOwotICBpZiAodGFibGUgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsgIC8vIHRhYmxlIGRhdGEgaXMgbm90IHBvcHVsYXRlZAotICB9Ci0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoIUZpbHRlckZpZWxkKCppdCwgdGFibGUpKSB7Ci0gICAgICBMT0dfRVJST1IoIiVzIFVuYWJsZSB0byBmaWx0ZXIgZmllbGQgZnJvbSBhbiBvYmplY3Qgd2hlbiBpdCdzIGV4cGVjdGVkIGl0IHdpbGwgd29yayIsIF9fZnVuY19fKTsKLSAgICB9OwotICB9Ci19Ci0KLXZvaWQgVXNlclByaXZhY3lGaWx0ZXI6OkZpbHRlclRhYmxlKGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogc2NoZW1hLCBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlKSB7Ci0gIGlmIChzY2hlbWEgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCIlcyBzY2hlbWEgaXMgbnVsbHB0ci4uLnByb2JhYmx5IG9rIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hLT5yb290X3RhYmxlKCk7Ci0gIGlmIChvYmplY3QgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCIlcyByZWZsZWN0aW9uIG9iamVjdCBpcyBudWxscHRyLi4uaXMgb2sgPyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAodGFibGUgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsgIC8vIHRhYmxlIG5vdCBwb3B1bGF0ZWQKLSAgfQotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoRmlsdGVyRmllbGQoKml0LCB0YWJsZSkpIHsKLSAgICAgIGNvbnRpbnVlOyAgLy8gRmllbGQgc3VjY2Vzc2Z1bGx5IGZpbHRlcmVkCi0gICAgfQotICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhpcyBjb21wbGV4IG5vbi1zdHJpbmcgb2JqZWN0IGZyb20gdGhlIHNjaGVtYSB3aGljaCBpcwotICAgIC8vIGFsc28gdGhlIHNhbWUgaW5kZXggaW50byB0aGUgZGF0YSB0YWJsZS4KLSAgICBpbnQzMl90IGluZGV4ID0gaXQtPnR5cGUoKS0+aW5kZXgoKTsKLSAgICBBU1NFUlQoaW5kZXggIT0gLTEpOwotCi0gICAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiBzdWJfdGFibGUgPSB0YWJsZS0+R2V0UG9pbnRlcjxmbGF0YnVmZmVyczo6VGFibGUqPihpdC0+b2Zmc2V0KCkpOwotICAgIGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogc3ViX3NjaGVtYSA9Ci0gICAgICAgIHJlZmxlY3Rpb25fc2NoZW1hXy5GaW5kSW5SZWZsZWN0aW9uU2NoZW1hKHNjaGVtYS0+b2JqZWN0cygpLT5HZXQoaW5kZXgpLT5uYW1lKCktPnN0cigpKTsKLQotICAgIGlmIChzdWJfc2NoZW1hICE9IG51bGxwdHIpIHsKLSAgICAgIEZpbHRlclRhYmxlKHN1Yl9zY2hlbWEsIHN1Yl90YWJsZSk7ICAvLyBUb3AgbGV2ZWwgc2NoZW1hCi0gICAgfSBlbHNlIHsKLSAgICAgIC8vIExlYWYgbm9kZSBzY2hlbWEKLSAgICAgIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqIG5hbWUgPSBzY2hlbWEtPm9iamVjdHMoKS0+R2V0KGluZGV4KS0+bmFtZSgpOwotICAgICAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBzdWJfb2JqZWN0ID0gaW50ZXJuYWw6OkZpbmRSZWZsZWN0aW9uT2JqZWN0KHNjaGVtYS0+b2JqZWN0cygpLCBuYW1lKTsKLSAgICAgIGlmIChzdWJfb2JqZWN0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgRmlsdGVyT2JqZWN0KHN1Yl9vYmplY3QsIHN1Yl90YWJsZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIHJlZmxlY3Rpb24gc3ViIG9iamVjdDolc1xuIiwgbmFtZS0+Y19zdHIoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVXNlclByaXZhY3lGaWx0ZXI6OkZpbHRlckluUGxhY2UoY2hhciogZHVtcHN5c19kYXRhKSB7Ci0gIEFTU0VSVChkdW1wc3lzX2RhdGEgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogcm9vdF9zY2hlbWEgPSByZWZsZWN0aW9uX3NjaGVtYV8uRmluZEluUmVmbGVjdGlvblNjaGVtYShyZWZsZWN0aW9uX3NjaGVtYV8uR2V0Um9vdE5hbWUoKSk7Ci0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBjb25zdF9jYXN0PGZsYXRidWZmZXJzOjpUYWJsZSo+KGZsYXRidWZmZXJzOjpHZXRSb290PGZsYXRidWZmZXJzOjpUYWJsZT4oZHVtcHN5c19kYXRhKSk7Ci0gIEZpbHRlclRhYmxlKHJvb3Rfc2NoZW1hLCB0YWJsZSk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxGaWx0ZXI+IEZpbHRlcjo6RmFjdG9yeSgKLSAgICBkdW1wc3lzOjpGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCBjb25zdCBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hJiByZWZsZWN0aW9uX3NjaGVtYSkgewotICBzd2l0Y2ggKGZpbHRlcl90eXBlKSB7Ci0gICAgY2FzZSBkdW1wc3lzOjpGaWx0ZXJUeXBlOjpBU19ERVZFTE9QRVI6Ci0gICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxEZXZlbG9wZXJQcml2YWN5RmlsdGVyPihyZWZsZWN0aW9uX3NjaGVtYSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFVzZXJQcml2YWN5RmlsdGVyPihyZWZsZWN0aW9uX3NjaGVtYSk7Ci0gIH0KLX0KLQotdm9pZCBibHVldG9vdGg6OmR1bXBzeXM6OkZpbHRlckluUGxhY2UoCi0gICAgRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgY29uc3QgUmVmbGVjdGlvblNjaGVtYSYgcmVmbGVjdGlvbl9zY2hlbWEsIHN0ZDo6c3RyaW5nKiBkdW1wc3lzX2RhdGEpIHsKLSAgYXV0byBmaWx0ZXIgPSBGaWx0ZXI6OkZhY3RvcnkoZmlsdGVyX3R5cGUsIHJlZmxlY3Rpb25fc2NoZW1hKTsKLSAgZmlsdGVyLT5GaWx0ZXJJblBsYWNlKGR1bXBzeXNfZGF0YS0+ZGF0YSgpKTsKLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvZmlsdGVyLmggYi9nZC9kdW1wc3lzL2ZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTcyYzQwLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvZmlsdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImR1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWEuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZHVtcHN5cyB7Ci0KLWVudW0gRmlsdGVyVHlwZSB7IEFTX1VTRVIgPSAwLCBBU19ERVZFTE9QRVIgfTsKLQotdm9pZCBGaWx0ZXJJblBsYWNlKEZpbHRlclR5cGUgZmlsdGVyX3R5cGUsIGNvbnN0IFJlZmxlY3Rpb25TY2hlbWEmIHJlZmxlY3Rpb25fc2NoZW1hLCBzdGQ6OnN0cmluZyogZHVtcHN5c19kYXRhKTsKLQotfSAgLy8gbmFtZXNwYWNlIGR1bXBzeXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvZmlsdGVyX3Rlc3QuY2MgYi9nZC9kdW1wc3lzL2ZpbHRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWE5OGY4Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvZmlsdGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImR1bXBzeXMvZmlsdGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHF1ZXVlPgotCi0jaW5jbHVkZSAiZHVtcHN5cy9kdW1wc3lzX3Rlc3RfZGF0YS5oIgotI2luY2x1ZGUgInRlc3RfZGF0YS9iYXIuaCIKLSNpbmNsdWRlICJ0ZXN0X2RhdGEvYmF6LmgiCi0jaW5jbHVkZSAidGVzdF9kYXRhL2Zvby5oIgotI2luY2x1ZGUgInRlc3RfZGF0YS9xdXguaCIKLSNpbmNsdWRlICJ0ZXN0X2RhdGEvcm9vdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg7Ci0KLWNsYXNzIER1bXBzeXNGaWx0ZXJUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZXN0X2RhdGFfY2xhc3Nlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8QmFyVGVzdERhdGFDbGFzcz4oKSk7Ci0gICAgdGVzdF9kYXRhX2NsYXNzZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEJhelRlc3REYXRhQ2xhc3M+KCkpOwotICAgIHRlc3RfZGF0YV9jbGFzc2VzXy5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxGb29UZXN0RGF0YUNsYXNzPigpKTsKLSAgICB0ZXN0X2RhdGFfY2xhc3Nlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8UXV4VGVzdERhdGFDbGFzcz4oKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUge30KLQotICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPER1bXBzeXNUZXN0RGF0YUNsYXNzPj4gdGVzdF9kYXRhX2NsYXNzZXNfOwotCi0gIHN0ZDo6c3RyaW5nIFBvcHVsYXRlVGVzdFNjaGVtYSgpOwotfTsKLQotc3RkOjpzdHJpbmcgRHVtcHN5c0ZpbHRlclRlc3Q6OlBvcHVsYXRlVGVzdFNjaGVtYSgpIHsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiX2J1aWxkZXIoMTAyNCk7Ci0KLSAgYXV0byBzdHJpbmdfcHJpdmF0ZSA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCJTdHJpbmcgcHJpdmF0ZSIpOwotICBhdXRvIHN0cmluZ19vcGFxdWUgPSBmYl9idWlsZGVyLkNyZWF0ZVN0cmluZygiU3RyaW5nIG9wYXF1ZSIpOwotICBhdXRvIHN0cmluZ19hbm9ueW1pemVkID0gZmJfYnVpbGRlci5DcmVhdGVTdHJpbmcoIlN0cmluZyBhbm9ueW1pemVkIik7Ci0gIGF1dG8gc3RyaW5nX2FueSA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCJTdHJpbmcgYW55Iik7Ci0KLSAgc3RkOjpxdWV1ZTxUYWJsZUFkZEZ1bmN0aW9uPiBxdWV1ZTsKLSAgZm9yIChhdXRvJiB0ZXN0X2RhdGFfY2xhc3MgOiB0ZXN0X2RhdGFfY2xhc3Nlc18pIHsKLSAgICBxdWV1ZS5wdXNoKHRlc3RfZGF0YV9jbGFzcy0+R2V0VGFibGUoZmJfYnVpbGRlcikpOwotICB9Ci0KLSAgdGVzdGluZzo6RHVtcHN5c1Rlc3REYXRhUm9vdEJ1aWxkZXIgYnVpbGRlcihmYl9idWlsZGVyKTsKLQotICBidWlsZGVyLmFkZF9zdHJpbmdfcHJpdmF0ZShzdHJpbmdfcHJpdmF0ZSk7Ci0gIGJ1aWxkZXIuYWRkX3N0cmluZ19vcGFxdWUoc3RyaW5nX29wYXF1ZSk7Ci0gIGJ1aWxkZXIuYWRkX3N0cmluZ19hbm9ueW1pemVkKHN0cmluZ19hbm9ueW1pemVkKTsKLSAgYnVpbGRlci5hZGRfc3RyaW5nX2FueShzdHJpbmdfYW55KTsKLQotICBidWlsZGVyLmFkZF9pbnRfcHJpdmF0ZSgxMjMpOwotICBidWlsZGVyLmFkZF9pbnRfb3BhcXVlKDQ1Nik7Ci0gIGJ1aWxkZXIuYWRkX2ludF9hbm9ueW1pemVkKDc4OSk7Ci0gIGJ1aWxkZXIuYWRkX2ludF9hbnkoMHhhYmMpOwotCi0gIHdoaWxlICghcXVldWUuZW1wdHkoKSkgewotICAgIHF1ZXVlLmZyb250KCkoJmJ1aWxkZXIpOwotICAgIHF1ZXVlLnBvcCgpOwotICB9Ci0gIGZiX2J1aWxkZXIuRmluaXNoKGJ1aWxkZXIuRmluaXNoKCkpOwotCi0gIHJldHVybiBzdGQ6OnN0cmluZyhmYl9idWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSwgZmJfYnVpbGRlci5HZXRCdWZmZXJQb2ludGVyKCkgKyBmYl9idWlsZGVyLkdldFNpemUoKSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzRmlsdGVyVGVzdCwgZmlsdGVyX2FzX2RldmVsb3BlcikgewotICBzdGQ6OnN0cmluZyBkdW1wc3lzX2RhdGEgPSBQb3B1bGF0ZVRlc3RTY2hlbWEoKTsKLSAgZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYSByZWZsZWN0aW9uX3NjaGVtYSh0ZXN0aW5nOjpHZXRCdW5kbGVkU2NoZW1hRGF0YSgpKTsKLQotICBkdW1wc3lzOjpGaWx0ZXJJblBsYWNlKGR1bXBzeXM6OkZpbHRlclR5cGU6OkFTX0RFVkVMT1BFUiwgcmVmbGVjdGlvbl9zY2hlbWEsICZkdW1wc3lzX2RhdGEpOwotCi0gIGNvbnN0IHRlc3Rpbmc6OkR1bXBzeXNUZXN0RGF0YVJvb3QqIGRhdGFfcm9vdCA9IEdldER1bXBzeXNUZXN0RGF0YVJvb3QoZHVtcHN5c19kYXRhLmRhdGEoKSk7Ci0KLSAgQVNTRVJUX1RSVUUoZGF0YV9yb290LT5zdHJpbmdfcHJpdmF0ZSgpLT5zdHIoKSA9PSAiU3RyaW5nIHByaXZhdGUiKTsKLSAgQVNTRVJUX1RSVUUoZGF0YV9yb290LT5zdHJpbmdfb3BhcXVlKCktPnN0cigpID09ICJTdHJpbmcgb3BhcXVlIik7Ci0gIEFTU0VSVF9UUlVFKGRhdGFfcm9vdC0+c3RyaW5nX2Fub255bWl6ZWQoKS0+c3RyKCkgPT0gIlN0cmluZyBhbm9ueW1pemVkIik7Ci0gIEFTU0VSVF9UUlVFKGRhdGFfcm9vdC0+c3RyaW5nX2FueSgpLT5zdHIoKSA9PSAiU3RyaW5nIGFueSIpOwotCi0gIEFTU0VSVF9UUlVFKGRhdGFfcm9vdC0+aW50X3ByaXZhdGUoKSA9PSAxMjMpOwotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPmludF9vcGFxdWUoKSA9PSA0NTYpOwotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPmludF9hbm9ueW1pemVkKCkgPT0gNzg5KTsKLSAgQVNTRVJUX1RSVUUoZGF0YV9yb290LT5pbnRfYW55KCkgPT0gMHhhYmMpOwotCi0gIEFTU0VSVF9FUShudWxscHRyLCBkYXRhX3Jvb3QtPmJhcl9tb2R1bGVfZGF0YSgpKTsKLQotICBjb25zdCB0ZXN0aW5nOjpGb29UZXN0U2NoZW1hKiBmb28gPSBkYXRhX3Jvb3QtPmZvb19tb2R1bGVfZGF0YSgpOwotCi0gIEFTU0VSVF9FUSgxMjMsIGZvby0+Zm9vX2ludF9wcml2YXRlKCkpOwotICBBU1NFUlRfRVEoMTIzLCBmb28tPmZvb19pbnRfb3BhcXVlKCkpOwotICBBU1NFUlRfRVEoMTIzLCBmb28tPmZvb19pbnRfYW5vbnltaXplZCgpKTsKLSAgQVNTRVJUX0VRKDEyMywgZm9vLT5mb29faW50X2FueSgpKTsKLSAgQVNTRVJUX1NUUkVRKCIxMjMiLCBmb28tPmZvb19pbnRfc3RyaW5nKCktPmNfc3RyKCkpOwotCi0gIEFTU0VSVF9GTE9BVF9FUSgxMjMuNDU2LCBmb28tPmZvb19mbG9hdF9wcml2YXRlKCkpOwotICBBU1NFUlRfRkxPQVRfRVEoMTIzLjQ1NiwgZm9vLT5mb29fZmxvYXRfb3BhcXVlKCkpOwotICBBU1NFUlRfRkxPQVRfRVEoMTIzLjQ1NiwgZm9vLT5mb29fZmxvYXRfYW5vbnltaXplZCgpKTsKLSAgQVNTRVJUX0ZMT0FUX0VRKDEyMy40NTYsIGZvby0+Zm9vX2Zsb2F0X2FueSgpKTsKLSAgQVNTRVJUX1NUUkVRKCIxMjMuNDU2IiwgZm9vLT5mb29fZmxvYXRfc3RyaW5nKCktPmNfc3RyKCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlclRlc3QsIGZpbHRlcl9hc191c2VyKSB7Ci0gIHN0ZDo6c3RyaW5nIGR1bXBzeXNfZGF0YSA9IFBvcHVsYXRlVGVzdFNjaGVtYSgpOwotICBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hIHJlZmxlY3Rpb25fc2NoZW1hKHRlc3Rpbmc6OkdldEJ1bmRsZWRTY2hlbWFEYXRhKCkpOwotCi0gIGR1bXBzeXM6OkZpbHRlckluUGxhY2UoZHVtcHN5czo6RmlsdGVyVHlwZTo6QVNfVVNFUiwgcmVmbGVjdGlvbl9zY2hlbWEsICZkdW1wc3lzX2RhdGEpOwotCi0gIFtbbWF5YmVfdW51c2VkXV0gY29uc3QgdGVzdGluZzo6RHVtcHN5c1Rlc3REYXRhUm9vdCogZGF0YV9yb290ID0gR2V0RHVtcHN5c1Rlc3REYXRhUm9vdChkdW1wc3lzX2RhdGEuZGF0YSgpKTsKLQotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPnN0cmluZ19wcml2YXRlKCkgPT0gbnVsbHB0cik7Ci0gIEFTU0VSVF9UUlVFKGRhdGFfcm9vdC0+c3RyaW5nX29wYXF1ZSgpLT5zdHIoKSA9PSAiKioqKioqKioqKioqKiIpOwotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPnN0cmluZ19hbm9ueW1pemVkKCktPnN0cigpICE9ICJTdHJpbmcgYW5vbnltaXplZCIpOwotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPnN0cmluZ19hbnkoKS0+c3RyKCkgPT0gIlN0cmluZyBhbnkiKTsKLQotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPmludF9wcml2YXRlKCkgPT0gMCk7Ci0gIEFTU0VSVF9UUlVFKGRhdGFfcm9vdC0+aW50X29wYXF1ZSgpID09IDApOwotICBBU1NFUlRfVFJVRShkYXRhX3Jvb3QtPmludF9hbm9ueW1pemVkKCkgIT0gNzg5KTsKLSAgQVNTRVJUX1RSVUUoZGF0YV9yb290LT5pbnRfYW55KCkgPT0gMHhhYmMpOwotCi0gIC8vIGJhcgotICBBU1NFUlRfRVEobnVsbHB0ciwgZGF0YV9yb290LT5iYXJfbW9kdWxlX2RhdGEoKSk7Ci0KLSAgLy8gYmF6Ci0gIGNvbnN0IHRlc3Rpbmc6OkJhelRlc3RTY2hlbWEqIGJheiA9IGRhdGFfcm9vdC0+YmF6X21vZHVsZV9kYXRhKCk7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBiYXopOwotCi0gIGNvbnN0IHRlc3Rpbmc6OkJhelN1YlRhYmxlQW55KiBiYXpfYW55ID0gYmF6LT5zdWJfdGFibGVfYW55KCk7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBiYXpfYW55KTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGJhei0+c3ViX3RhYmxlX2Fub255bWl6ZWQoKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBiYXotPnN1Yl90YWJsZV9vcGFxdWUoKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBiYXotPnN1Yl90YWJsZV9wcml2YXRlKCkpOwotCi0gIEFTU0VSVF9FUSgwLCBiYXpfYW55LT5zdWJ0YWJsZV9pbnRfcHJpdmF0ZSgpKTsgICAgIC8vIDEKLSAgQVNTRVJUX0VRKDAsIGJhel9hbnktPnN1YnRhYmxlX2ludF9vcGFxdWUoKSk7ICAgICAgLy8gMgotICBBU1NFUlRfTkUoMywgYmF6X2FueS0+c3VidGFibGVfaW50X2Fub255bWl6ZWQoKSk7ICAvLyAzCi0gIEFTU0VSVF9FUSg0LCBiYXpfYW55LT5zdWJ0YWJsZV9pbnRfYW55KCkpOyAgICAgICAgIC8vIDQKLSAgQVNTRVJUX1NUUkVRKCJCYXogU3VidGFibGUgQW55IiwgYmF6X2FueS0+c3VidGFibGVfc3RyaW5nX2FueSgpLT5jX3N0cigpKTsKLQotICAvLyBmb28KLSAgY29uc3QgdGVzdGluZzo6Rm9vVGVzdFNjaGVtYSogZm9vID0gZGF0YV9yb290LT5mb29fbW9kdWxlX2RhdGEoKTsKLSAgQVNTRVJUX0VRKDAsIGZvby0+Zm9vX2ludF9wcml2YXRlKCkpOwotICBBU1NFUlRfRVEoMCwgZm9vLT5mb29faW50X29wYXF1ZSgpKTsKLSAgQVNTRVJUX05FKDEyMywgZm9vLT5mb29faW50X2Fub255bWl6ZWQoKSk7Ci0gIEFTU0VSVF9FUSgxMjMsIGZvby0+Zm9vX2ludF9hbnkoKSk7Ci0gIEFTU0VSVF9TVFJFUSgiMTIzIiwgZm9vLT5mb29faW50X3N0cmluZygpLT5jX3N0cigpKTsKLSAgQVNTRVJUX0ZMT0FUX0VRKDAuMCwgZm9vLT5mb29fZmxvYXRfcHJpdmF0ZSgpKTsKLSAgQVNTRVJUX0ZMT0FUX0VRKDAuMCwgZm9vLT5mb29fZmxvYXRfb3BhcXVlKCkpOwotICBBU1NFUlRfVEhBVChmb28tPmZvb19mbG9hdF9hbm9ueW1pemVkKCksIE5vdChGbG9hdEVxKDEyMy40NTYpKSk7Ci0gIEFTU0VSVF9GTE9BVF9FUSgxMjMuNDU2LCBmb28tPmZvb19mbG9hdF9hbnkoKSk7Ci0gIEFTU0VSVF9TVFJFUSgiMTIzLjQ1NiIsIGZvby0+Zm9vX2Zsb2F0X3N0cmluZygpLT5jX3N0cigpKTsKLQotICAvLyBxdXgKLSAgY29uc3QgdGVzdGluZzo6UXV4VGVzdFNjaGVtYSogcXV4ID0gZGF0YV9yb290LT5xdXhfbW9kdWxlX2RhdGEoKTsKLSAgQVNTRVJUX0VRKDAsIHF1eC0+cXV4X2ludF9wcml2YXRlKCkpOwotICBBU1NFUlRfRVEoMCwgcXV4LT5xdXhfaW50X29wYXF1ZSgpKTsKLSAgQVNTRVJUX05FKDc4OSwgcXV4LT5xdXhfaW50X2Fub255bWl6ZWQoKSk7Ci0gIEFTU0VSVF9FUSgweGFiYywgcXV4LT5xdXhfaW50X2FueSgpKTsKLSAgQVNTRVJUX1NUUkVRKCJRdXggTW9kdWxlIFN0cmluZyIsIHF1eC0+cXV4X3N0cmluZ19uYW1lKCktPmNfc3RyKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbml0X2ZsYWdzLmNjIGIvZ2QvZHVtcHN5cy9pbml0X2ZsYWdzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmUwNjZiLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW5pdF9mbGFncy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImR1bXBzeXMvaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImluaXRfZmxhZ3NfZ2VuZXJhdGVkLmgiCi0KLWZsYXRidWZmZXJzOjpPZmZzZXQ8Ymx1ZXRvb3RoOjpjb21tb246OkluaXRGbGFnc0RhdGE+IGJsdWV0b290aDo6ZHVtcHN5czo6SW5pdEZsYWdzOjpEdW1wKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlcikgewotICBhdXRvIHRpdGxlID0gZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKCItLS0tLSBJbml0IEZsYWdzIC0tLS0tIik7Ci0gIGNvbW1vbjo6SW5pdEZsYWdzRGF0YUJ1aWxkZXIgYnVpbGRlcigqZmJfYnVpbGRlcik7Ci0gIGJ1aWxkZXIuYWRkX3RpdGxlKHRpdGxlKTsKLSAgYnVpbGRlci5hZGRfZ2RfYWR2ZXJ0aXNpbmdfZW5hYmxlZChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfYWR2ZXJ0aXNpbmdfaXNfZW5hYmxlZCgpKTsKLSAgYnVpbGRlci5hZGRfZ2Rfc2Nhbm5pbmdfZW5hYmxlZChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2Rfc2Nhbm5pbmdfaXNfZW5hYmxlZCgpKTsKLSAgYnVpbGRlci5hZGRfZ2Rfc2VjdXJpdHlfZW5hYmxlZChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2Rfc2VjdXJpdHlfaXNfZW5hYmxlZCgpKTsKLSAgYnVpbGRlci5hZGRfZ2RfYWNsX2VuYWJsZWQoYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX2FjbF9pc19lbmFibGVkKCkpOwotICBidWlsZGVyLmFkZF9nZF9oY2lfZW5hYmxlZCh0cnVlKTsKLSAgYnVpbGRlci5hZGRfZ2RfY29udHJvbGxlcl9lbmFibGVkKHRydWUpOwotICBidWlsZGVyLmFkZF9nZF9jb3JlX2VuYWJsZWQoYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX2NvcmVfaXNfZW5hYmxlZCgpKTsKLSAgYnVpbGRlci5hZGRfYnRhYV9oY2lfbG9nX2VuYWJsZWQoYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmJ0YWFfaGNpX2lzX2VuYWJsZWQoKSk7Ci0gIHJldHVybiBidWlsZGVyLkZpbmlzaCgpOwotfQpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbml0X2ZsYWdzLmggYi9nZC9kdW1wc3lzL2luaXRfZmxhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2ZmJhMy4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2luaXRfZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKLSNpbmNsdWRlICJpbml0X2ZsYWdzX2dlbmVyYXRlZC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBkdW1wc3lzIHsKLQotY2xhc3MgSW5pdEZsYWdzIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PGNvbW1vbjo6SW5pdEZsYWdzRGF0YT4gRHVtcChmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGZiX2J1aWxkZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGR1bXBzeXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvZmlsdGVyX2ludGVybmFsLmNjIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC9maWx0ZXJfaW50ZXJuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhN2Q4ODEuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC9maWx0ZXJfaW50ZXJuYWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJkdW1wc3lzL2ludGVybmFsL2ZpbHRlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLSNkZWZpbmUgREJHIDAKLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDsKLXVzaW5nIG5hbWVzcGFjZSBkdW1wc3lzOwotCi1jb25zdGV4cHIgZmxhdGJ1ZmZlcnM6OnZvZmZzZXRfdCBrRXJhc2VkRnJvbVRhYmxlID0gMDsKLWNvbnN0ZXhwciBib29sIGtGaWVsZElzTm90UG9wdWxhdGVkID0gdHJ1ZTsKLWNvbnN0ZXhwciBib29sIGtGaWVsZEhhc0JlZW5GaWx0ZXJlZCA9IHRydWU7Ci1jb25zdGV4cHIgYm9vbCBrRmllbGRDb250aW51ZUZpbHRlcmluZyA9IGZhbHNlOwotCi12b2lkIGludGVybmFsOjpTY3J1YkZyb21UYWJsZShmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlLCBmbGF0YnVmZmVyczo6dm9mZnNldF90IGZpZWxkX29mZnNldCkgewotICBBU1NFUlQodGFibGUgIT0gbnVsbHB0cik7Ci0gIHVpbnQ4X3QqIHZ0YWJsZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHRhYmxlLT5HZXRWVGFibGUoKSk7Ci0gIHZ0YWJsZVtmaWVsZF9vZmZzZXRdID0ga0VyYXNlZEZyb21UYWJsZTsKLX0KLQotdm9pZCBpbnRlcm5hbDo6UmVwbGFjZUluU3RyaW5nKGZsYXRidWZmZXJzOjpTdHJpbmcqIHN0cmluZywgaW50IGMpIHsKLSAgdWludDhfdCogcCA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHN0cmluZy0+RGF0YSgpKTsKLSAgbWVtc2V0KHAsIGMsIHN0cmluZy0+c2l6ZSgpKTsKLX0KLQotdm9pZCBpbnRlcm5hbDo6UmFuZG9taXplSW5TdHJpbmcoZmxhdGJ1ZmZlcnM6OlN0cmluZyogc3RyaW5nKSB7Ci0gIHN0ZDo6c2l6ZV90IGhhc2ggPSBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30oc3RyaW5nLT5zdHIoKSk7Ci0gIHN0ZDo6c3RyaW5nIGhhc2hlZF9zdHJpbmcgPSBzdGQ6OnRvX3N0cmluZyhoYXNoKTsKLSAgUmVwbGFjZUluU3RyaW5nKHN0cmluZywgJyAnKTsKLSAgc2l6ZV90IGxlbiA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHNpemVfdD4oc3RyaW5nLT5zaXplKCkpLCBoYXNoZWRfc3RyaW5nLnNpemUoKSk7Ci0gIHVpbnQ4X3QqIHAgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihzdHJpbmctPkRhdGEoKSk7Ci0gIG1lbWNweShwLCBoYXNoZWRfc3RyaW5nLmNfc3RyKCksIGxlbik7Ci19Ci0KLWNvbnN0IGNoYXIqIGludGVybmFsOjpQcml2YWN5TGV2ZWxOYW1lKFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsKSB7Ci0gIHN3aXRjaCAocHJpdmFjeV9sZXZlbCkgewotICAgIGNhc2Uga1ByaXZhdGU6Ci0gICAgICByZXR1cm4gIlByaXZhdGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrT3BhcXVlOgotICAgICAgcmV0dXJuICJPcGFxdWUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQW5vbnltaXplZDoKLSAgICAgIHJldHVybiAiQW5vbnltaXplZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtBbnk6Ci0gICAgICByZXR1cm4gIkFueSI7Ci0gICAgICBicmVhazsKLSAgfQotfTsKLWludGVybmFsOjpQcml2YWN5TGV2ZWwgaW50ZXJuYWw6OkdldFByaXZhY3lMZXZlbEF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKSB7Ci0gIGlmIChzdHJpbmcgPT0gIkFueSIpIHsKLSAgICByZXR1cm4ga0FueTsKLSAgfSBlbHNlIGlmIChzdHJpbmcgPT0gIkFub255bWl6ZWQiKSB7Ci0gICAgcmV0dXJuIGtBbm9ueW1pemVkOwotICB9IGVsc2UgaWYgKHN0cmluZyA9PSAiT3BhcXVlIikgewotICAgIHJldHVybiBrT3BhcXVlOwotICB9IGVsc2UgaWYgKHN0cmluZyA9PSAiUHJpdmF0ZSIpIHsKLSAgICByZXR1cm4ga1ByaXZhdGU7Ci0gIH0KLSAgcmV0dXJuIGtEZWZhdWx0UHJpdmFjeUxldmVsOwotfQotCi1pbnRlcm5hbDo6UHJpdmFjeUxldmVsIGludGVybmFsOjpGaW5kRmllbGRQcml2YWN5TGV2ZWwoY29uc3QgcmVmbGVjdGlvbjo6RmllbGQmIGZpZWxkKSB7Ci0gIFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsID0ga0RlZmF1bHRQcml2YWN5TGV2ZWw7Ci0KLSAgaWYgKGZpZWxkLmF0dHJpYnV0ZXMoKSAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBrZXkgPSBmaWVsZC5hdHRyaWJ1dGVzKCktPkxvb2t1cEJ5S2V5KGtQcml2YWN5QXR0cmlidXRlS2V5d29yZCk7Ci0gICAgaWYgKGtleSAhPSBudWxscHRyKSB7Ci0gICAgICBwcml2YWN5X2xldmVsID0gaW50ZXJuYWw6OkdldFByaXZhY3lMZXZlbEF0dHJpYnV0ZShrZXktPnZhbHVlKCktPnN0cigpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHByaXZhY3lfbGV2ZWw7Ci19Ci0KLWNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogaW50ZXJuYWw6OkZpbmRSZWZsZWN0aW9uT2JqZWN0KAotICAgIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxyZWZsZWN0aW9uOjpPYmplY3Q+Piogb2JqZWN0cywgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyogbmFtZSkgewotICBBU1NFUlQob2JqZWN0cyAhPSBudWxscHRyKTsKLSAgQVNTRVJUKG5hbWUgIT0gbnVsbHB0cik7Ci0gIGZvciAoYXV0byBpdCA9IG9iamVjdHMtPmNiZWdpbigpOyBpdCAhPSBvYmplY3RzLT5jZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoaXQtPm5hbWUoKS0+c3RyKCkgPT0gbmFtZS0+c3RyKCkpIHsKLSAgICAgIHJldHVybiAqaXQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1ib29sIGludGVybmFsOjpGaWx0ZXJUeXBlQm9vbChjb25zdCByZWZsZWN0aW9uOjpGaWVsZCYgZmllbGQsIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUsIFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsKSB7Ci0gIEFTU0VSVCh0YWJsZSAhPSBudWxscHRyKTsKLQotICAvLyBUT0RPKGNtYW50b24pIEZpZ3VyZSBvdXQgYm9vbGVhbiBmaWx0ZXJpbmcKLSAgcmV0dXJuIGtGaWVsZEhhc0JlZW5GaWx0ZXJlZDsKLX0KLQotYm9vbCBpbnRlcm5hbDo6RmlsdGVyVHlwZUludGVnZXIoCi0gICAgY29uc3QgcmVmbGVjdGlvbjo6RmllbGQmIGZpZWxkLCBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlLCBQcml2YWN5TGV2ZWwgcHJpdmFjeV9sZXZlbCkgewotICBBU1NFUlQodGFibGUgIT0gbnVsbHB0cik7Ci0gIEFTU0VSVChmbGF0YnVmZmVyczo6SXNJbnRlZ2VyKGZpZWxkLnR5cGUoKS0+YmFzZV90eXBlKCkpKTsKLQotICBpbnQzMl90IGRlZmF1bHRfdmFsID0gZmxhdGJ1ZmZlcnM6OkdldEZpZWxkRGVmYXVsdEk8aW50MzJfdD4oZmllbGQpOwotICBmbGF0YnVmZmVyczo6dm9mZnNldF90IGZpZWxkX29mZnNldCA9IGZpZWxkLm9mZnNldCgpOwotICBbW21heWJlX3VudXNlZF1dIGludDMyX3QgdmFsID0gdGFibGUtPkdldEZpZWxkPGludDMyX3Q+KGZpZWxkX29mZnNldCwgZGVmYXVsdF92YWwpOwotCi0gIHN3aXRjaCAocHJpdmFjeV9sZXZlbCkgewotICAgIGNhc2Uga1ByaXZhdGU6Ci0gICAgICBmbGF0YnVmZmVyczo6U2V0RmllbGQ8aW50MzJfdD4odGFibGUsIGZpZWxkLCBkZWZhdWx0X3ZhbCk7Ci0gICAgICBpbnRlcm5hbDo6U2NydWJGcm9tVGFibGUodGFibGUsIGZpZWxkX29mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtPcGFxdWU6Ci0gICAgICBmbGF0YnVmZmVyczo6U2V0RmllbGQ8aW50MzJfdD4odGFibGUsIGZpZWxkLCBkZWZhdWx0X3ZhbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtBbm9ueW1pemVkOiB7Ci0gICAgICBhdXRvIHRhcmdldF9maWVsZCA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZEk8aW50MzJfdD4oKnRhYmxlLCBmaWVsZCk7Ci0gICAgICBpbnQzMl90IG5ld192YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30oc3RkOjp0b19zdHJpbmcodGFyZ2V0X2ZpZWxkKSkpOwotICAgICAgZmxhdGJ1ZmZlcnM6OlNldEZpZWxkPGludDMyX3Q+KHRhYmxlLCBmaWVsZCwgbmV3X3ZhbCk7Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2Uga0FueToKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKERCRykgewotICAgIExPR19JTkZPKAotICAgICAgICAiSW50ZWdlciBGaWVsZF9uYW1lOiVzIHByaXZhY3lfbGV2ZWw6JXMgb2xkX3ZhbHVlOiVkIC8gMHgleCA9PT4gbmV3X3ZhbHVlOiVkXG4iLAotICAgICAgICBmaWVsZC5uYW1lKCktPmNfc3RyKCksCi0gICAgICAgIFByaXZhY3lMZXZlbE5hbWUocHJpdmFjeV9sZXZlbCksCi0gICAgICAgIHZhbCwKLSAgICAgICAgdmFsLAotICAgICAgICB0YWJsZS0+R2V0RmllbGQ8aW50MzJfdD4oZmllbGRfb2Zmc2V0LCBkZWZhdWx0X3ZhbCkpOwotICB9Ci0gIHJldHVybiBrRmllbGRIYXNCZWVuRmlsdGVyZWQ7Ci19Ci0KLWJvb2wgaW50ZXJuYWw6OkZpbHRlclR5cGVGbG9hdChjb25zdCByZWZsZWN0aW9uOjpGaWVsZCYgZmllbGQsIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUsIFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsKSB7Ci0gIEFTU0VSVCh0YWJsZSAhPSBudWxscHRyKTsKLSAgQVNTRVJUKGZsYXRidWZmZXJzOjpJc0Zsb2F0KGZpZWxkLnR5cGUoKS0+YmFzZV90eXBlKCkpKTsKLQotICBmbG9hdCBkZWZhdWx0X3ZhbCA9IGZsYXRidWZmZXJzOjpHZXRGaWVsZERlZmF1bHRJPGZsb2F0PihmaWVsZCk7Ci0gIGZsYXRidWZmZXJzOjp2b2Zmc2V0X3QgZmllbGRfb2Zmc2V0ID0gZmllbGQub2Zmc2V0KCk7Ci0gIFtbbWF5YmVfdW51c2VkXV0gZmxvYXQgdmFsID0gdGFibGUtPkdldEZpZWxkPGZsb2F0PihmaWVsZF9vZmZzZXQsIGRlZmF1bHRfdmFsKTsKLSAgc3dpdGNoIChwcml2YWN5X2xldmVsKSB7Ci0gICAgY2FzZSBrUHJpdmF0ZToKLSAgICAgIGZsYXRidWZmZXJzOjpTZXRGaWVsZDxmbG9hdD4odGFibGUsIGZpZWxkLCBkZWZhdWx0X3ZhbCk7Ci0gICAgICBpbnRlcm5hbDo6U2NydWJGcm9tVGFibGUodGFibGUsIGZpZWxkX29mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtPcGFxdWU6Ci0gICAgICBmbGF0YnVmZmVyczo6U2V0RmllbGQ8ZmxvYXQ+KHRhYmxlLCBmaWVsZCwgZGVmYXVsdF92YWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQW5vbnltaXplZDogewotICAgICAgYXV0byB0YXJnZXRfZmllbGQgPSBmbGF0YnVmZmVyczo6R2V0RmllbGRGPGZsb2F0PigqdGFibGUsIGZpZWxkKTsKLSAgICAgIGludDMyX3QgbmV3X3ZhbCA9IHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30oc3RkOjp0b19zdHJpbmcodGFyZ2V0X2ZpZWxkKSkpOwotICAgICAgZmxhdGJ1ZmZlcnM6OlNldEZpZWxkPGZsb2F0Pih0YWJsZSwgZmllbGQsIG5ld192YWwpOwotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGtBbnk6Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoREJHKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJGbG9hdCBGaWVsZF9uYW1lOiVzIHByaXZhY3lfbGV2ZWw6JXMgb2xkX3ZhbHVlOiVmID09PiBuZXdfdmFsdWU6JWYiLAotICAgICAgICBmaWVsZC5uYW1lKCktPmNfc3RyKCksCi0gICAgICAgIFByaXZhY3lMZXZlbE5hbWUocHJpdmFjeV9sZXZlbCksCi0gICAgICAgIHZhbCwKLSAgICAgICAgdGFibGUtPkdldEZpZWxkPGZsb2F0PihmaWVsZF9vZmZzZXQsIGRlZmF1bHRfdmFsKSk7Ci0gIH0KLSAgcmV0dXJuIGtGaWVsZEhhc0JlZW5GaWx0ZXJlZDsKLX0KLQotYm9vbCBpbnRlcm5hbDo6RmlsdGVyVHlwZVN0cmluZyhjb25zdCByZWZsZWN0aW9uOjpGaWVsZCYgZmllbGQsIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUsIFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsKSB7Ci0gIEFTU0VSVCh0YWJsZSAhPSBudWxscHRyKTsKLSAgQVNTRVJUKGZpZWxkLnR5cGUoKS0+YmFzZV90eXBlKCkgPT0gcmVmbGVjdGlvbjo6QmFzZVR5cGU6OlN0cmluZyk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OnZvZmZzZXRfdCBmaWVsZF9vZmZzZXQgPSBmaWVsZC5vZmZzZXQoKTsKLQotICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nKiBzdHJpbmcgPSBmbGF0YnVmZmVyczo6R2V0RmllbGRTKCp0YWJsZSwgZmllbGQpOwotICBpZiAoc3RyaW5nID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4ga0ZpZWxkSXNOb3RQb3B1bGF0ZWQ7Ci0gICAgLy8gRmllbGQgaXMgbm90IHBvcHVsYXRlZAotICB9Ci0gIEFTU0VSVChzdHJpbmcgIT0gbnVsbHB0cik7Ci0gIGZsYXRidWZmZXJzOjpTdHJpbmcqIG11dGFibGVfc3RyaW5nID0gY29uc3RfY2FzdDxmbGF0YnVmZmVyczo6U3RyaW5nKj4oc3RyaW5nKTsKLQotICBbW21heWJlX3VudXNlZF1dIHN0ZDo6c3RyaW5nIG9sZF9zdHJpbmcoc3RyaW5nLT5zdHIoKSk7Ci0gIHN3aXRjaCAocHJpdmFjeV9sZXZlbCkgewotICAgIGNhc2Uga1ByaXZhdGU6Ci0gICAgICBpbnRlcm5hbDo6UmVwbGFjZUluU3RyaW5nKG11dGFibGVfc3RyaW5nLCAnKicpOwotICAgICAgaW50ZXJuYWw6OlNjcnViRnJvbVRhYmxlKHRhYmxlLCBmaWVsZF9vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrT3BhcXVlOgotICAgICAgaW50ZXJuYWw6OlJlcGxhY2VJblN0cmluZyhtdXRhYmxlX3N0cmluZywgJyonKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0Fub255bWl6ZWQ6Ci0gICAgICBpbnRlcm5hbDo6UmFuZG9taXplSW5TdHJpbmcobXV0YWJsZV9zdHJpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGtBbnk6Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoREJHKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICIlcyBGaWVsZF9uYW1lOiVzIHNpemU6JXUgcHJpdmFjeV9sZXZlbDolcyBvbGRfc3RyaW5nOiVzID09PiBuZXdfc3RyaW5nOiVzIiwKLSAgICAgICAgX19mdW5jX18sCi0gICAgICAgIGZpZWxkLm5hbWUoKS0+Y19zdHIoKSwKLSAgICAgICAgc3RyaW5nLT5zaXplKCksCi0gICAgICAgIFByaXZhY3lMZXZlbE5hbWUocHJpdmFjeV9sZXZlbCksCi0gICAgICAgIG9sZF9zdHJpbmcuY19zdHIoKSwKLSAgICAgICAgc3RyaW5nLT5jX3N0cigpKTsKLSAgfQotICByZXR1cm4ga0ZpZWxkSGFzQmVlbkZpbHRlcmVkOwotfQotCi1ib29sIGludGVybmFsOjpGaWx0ZXJUeXBlU3RydWN0KGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkJiBmaWVsZCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSwgUHJpdmFjeUxldmVsIHByaXZhY3lfbGV2ZWwpIHsKLSAgQVNTRVJUKHRhYmxlICE9IG51bGxwdHIpOwotICBBU1NFUlQoIWZsYXRidWZmZXJzOjpJc1NjYWxhcihmaWVsZC50eXBlKCktPmJhc2VfdHlwZSgpKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OnZvZmZzZXRfdCBmaWVsZF9vZmZzZXQgPSBmaWVsZC5vZmZzZXQoKTsKLQotICBpZiAocHJpdmFjeV9sZXZlbCAhPSBrQW55KSB7Ci0gICAgZmxhdGJ1ZmZlcnM6OlNldEZpZWxkVCh0YWJsZSwgZmllbGQsIG51bGxwdHIpOwotICAgIGludGVybmFsOjpTY3J1YkZyb21UYWJsZSh0YWJsZSwgZmllbGRfb2Zmc2V0KTsKLSAgICBpZiAoREJHKSB7Ci0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICAiIFRhYmxlIFJlbW92aW5nIGZpZWxkIG5hbWU6JXMgcHJpdmFjeV9sZXZlbDolcyIsIGZpZWxkLm5hbWUoKS0+Y19zdHIoKSwgUHJpdmFjeUxldmVsTmFtZShwcml2YWN5X2xldmVsKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBrRmllbGRDb250aW51ZUZpbHRlcmluZzsKLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvZmlsdGVyX2ludGVybmFsLmggYi9nZC9kdW1wc3lzL2ludGVybmFsL2ZpbHRlcl9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjY2OGM0Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvZmlsdGVyX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKLSNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZHVtcHN5cyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jb25zdGV4cHIgY2hhciBrUHJpdmFjeUF0dHJpYnV0ZUtleXdvcmRbXSA9ICJwcml2YWN5IjsKLQotZW51bSBQcml2YWN5TGV2ZWwgewotICBrUHJpdmF0ZSA9IDAsCi0gIGtPcGFxdWUgPSAxLAotICBrQW5vbnltaXplZCA9IDIsCi0gIGtBbnkgPSA0LAotICBrRGVmYXVsdFByaXZhY3lMZXZlbCA9IGtQcml2YXRlLAotfTsKLQotLyoqCi0gKiBSZW1vdmUgdGhlIGZpZWxkIG9mZnNldCBmcm9tIGZsYXRidWZmZXIgdGFibGUgZWxpbWluYXRpbmcgYWJpbGl0eSB0bwotICogYWNjZXNzIHZhbHVlLgotICoKLSAqIEBwYXJhbSB0YWJsZSBUYWJsZSB1bmRlciBjb25zaWRlcmF0aW9uIGZvciBmaWVsZCByZW1vdmVhbAotICogQHBhcmFtIGZpZWxkX29mZnNldCBWaXJ0dWFsIG9mZnNldCBvZiBmaWVsZCBpbnRvIHRhYmxlLgotICovCi12b2lkIFNjcnViRnJvbVRhYmxlKGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUsIGZsYXRidWZmZXJzOjp2b2Zmc2V0X3QgZmllbGRfb2Zmc2V0KTsKLQotLyoqCi0gKiBPdmVyd3JpdGUgaWhlIGNvbnRlbnRzIG9mIGZsYXRidWZmZXIgc3RyaW5nIHdpdGggdGhlIGludGVnZXIgdmFsdWUgcHJvdmljZWQuCi0gKiBUaGUgZW50aXJlIHNpemUgb2YgdGhlIHN0cmluZyB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgcHJvdmlkZWQuCi0gKgotICogQHBhcmFtIHN0cmluZyBGbGF0YnVmZmVyIHN0cmluZyB1bmRlciBjb25zaWRlcmF0aW9uIGZvciBjb250ZW50IGNoYW5naW5nLgotICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIG92ZXJ3cml0ZSB0aGUgc3RyaW5nIGNvbnRlbnRzLgotICovCi12b2lkIFJlcGxhY2VJblN0cmluZyhmbGF0YnVmZmVyczo6U3RyaW5nKiBzdHJpbmcsIGludCB2YWx1ZSk7Ci0KLS8qKgotICogT3ZlcndyaXRlIHRoZSBjb250ZW50cyBvZiBmbGF0YnVmZmVyIHN0cmluZyB3aXRoIGEgaGFzaGVkIHZhbHVlLgotICogVGhlIHBvcnRpb24gb2YgdGhlIHN0cmluZyBncmVhdGVyIHRoYW4gdGhlIGhhc2ggdmFsdWUgd2lsbCBiZSBzZXQgdG8gU1BBQ0UuCi0gKiBJZiB0aGUgc3RyaW5nIGlzIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZSBlbnRpcmUgaGFzaCB2YWx1ZSwgdGhlIGhhc2gKLSAqIHZhbHVlIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcuCi0gKgotICogQHBhcmFtIHN0cmluZyBGbGF0YnVmZmVyIHN0cmluZyB1bmRlciBjb25zaWRlcmF0aW9uIGZvciBjb250ZW50IGNoYW5naW5nLgotICovCi12b2lkIFJhbmRvbWl6ZUluU3RyaW5nKGZsYXRidWZmZXJzOjpTdHJpbmcqIHN0cmluZyk7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcHJpdmFjeSBsZXZlbCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF4dHVhbCBudW1lcmljIGxldmVsLgotICoKLSAqIEBwYXJhbSBwcml2YWN5X2xldmVsIFByaXZhY3lMZXZlbAotICoKLSAqIEByZXR1cm4gTmFtZSBvZiBwcml2YWN5IGxldmVsLgotICovCi1jb25zdCBjaGFyKiBQcml2YWN5TGV2ZWxOYW1lKFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsKTsKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBwcml2YWN5IGxldmVsIGZvciB0aGUgZ2l2ZW4gZmllbGQuICBJZiB0aGVyZSBpcyBubyBleHBsaWNpdGx5Ci0gKiBwcml2YWN5IGxldmVsIGZvciB0aGlzIGZpZWxkLCB0aGUgZGVmYXVsdCBwcml2YWN5IGxldmVsIGlzIHJldHVybmVkLgotICoKLSAqIEBwYXJhbSBmaWVsZCBUaGUgcmVmbGVjdGlvbiBmaWVsZCBmb3IgdGhlIHNjaGVtYQotICoKLSAqIEByZXR1cm4gUHJpdmFjeSBsZXZlbCBlbnVtZXJhdGlvbiB2YWx1ZQotICovCi1Qcml2YWN5TGV2ZWwgRmluZEZpZWxkUHJpdmFjeUxldmVsKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkJiBmaWVsZCk7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcHJpdmFjeSBsZXZlbCBmb3IgZ2l2ZW4gcHJpdmFjeSBsZXZlbCBrZXl3b3JkIG5hbWUuCi0gKiBJZiB0aGUgcHJpdmFjeSBsZXZlbCBmb3IgdGhpcyBmaWVsZCwgdGhlIGRlZmF1bHQgcHJpdmFjeSBsZXZlbCBpcyByZXR1cm5lZC4KLSAqCi0gKiBAcGFyYW0gbmFtZSBUaGUgcHJpdmFjeSBsZXZlbCBuYW1lLgotICoKLSAqIEByZXR1cm4gUHJpdmFjeSBsZXZlbCBlbnVtZXJhdGlvbiB2YWx1ZS4KLSAqLwotUHJpdmFjeUxldmVsIEdldFByaXZhY3lMZXZlbEF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLS8qKgotICogRmluZCBhIHRoZSByZWZsZWN0aW9uIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHByb3ZpZGVkLgotICogUmV0dXJucyBudWxscHRyIGlzIG5vdCBmb3VuZC4KLSAqCi0gKiBAcGFyYW0gb2JqZWN0cyBWZWN0b3IgY29udGFpbmVyIG9mIGZsYXRidWZmZXIgb2JqZWN0cwotICogQHBhcmFtIG5hbWUgRmxhdGJ1ZmZlciBzdHJpbmcgbmFtZSB0byBzZWFyY2gKLSAqCi0gKiBAcmV0dXJuIFJlZmxlY3Rpb24gb2JqZWN0IGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZS4KLSAqLwotY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBGaW5kUmVmbGVjdGlvbk9iamVjdCgKLSAgICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8cmVmbGVjdGlvbjo6T2JqZWN0Pj4qIG9iamVjdHMsIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqIG5hbWUpOwotCi0vKioKLSAqIFByb2Nlc3MgYW5kIGZpbHRlciB0aGUgcmVzcGVjdGl2ZSBkYXRhIHR5cGVzLgotICoKLSAqIEBwYXJhbSBmaWVsZCBUaGUgcmVmbGVjdGlvbiBmaWVsZCBzY2hlbWEuCi0gKiBAcGFyYW0gdGFibGUgVGhlIG11dGFibGUgdGFibGUgZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY2hlbWEuCi0gKiBAcGFyYW0gcHJpdmFjeV9sZXZlbCBUaGUgcHJpdmFjeSBsZXZlbCBpbiB3aGljaCB0byBmaWx0ZXIgdGhlIGRhdGEuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBmaWx0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1ib29sIEZpbHRlclR5cGVCb29sKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkJiBmaWVsZCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSwgUHJpdmFjeUxldmVsIHByaXZhY3lfbGV2ZWwpOwotYm9vbCBGaWx0ZXJUeXBlSW50ZWdlcihjb25zdCByZWZsZWN0aW9uOjpGaWVsZCYgZmllbGQsIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUsIFByaXZhY3lMZXZlbCBwcml2YWN5X2xldmVsKTsKLWJvb2wgRmlsdGVyVHlwZUZsb2F0KGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkJiBmaWVsZCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSwgUHJpdmFjeUxldmVsIHByaXZhY3lfbGV2ZWwpOwotYm9vbCBGaWx0ZXJUeXBlU3RyaW5nKGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkJiBmaWVsZCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSwgUHJpdmFjeUxldmVsIHByaXZhY3lfbGV2ZWwpOwotYm9vbCBGaWx0ZXJUeXBlU3RydWN0KGNvbnN0IHJlZmxlY3Rpb246OkZpZWxkJiBmaWVsZCwgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSwgUHJpdmFjeUxldmVsIHByaXZhY3lfbGV2ZWwpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBkdW1wc3lzCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL2ZpbHRlcl9pbnRlcm5hbF90ZXN0LmNjIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC9maWx0ZXJfaW50ZXJuYWxfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjNzgwMS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL2ZpbHRlcl9pbnRlcm5hbF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJkdW1wc3lzL2ludGVybmFsL2ZpbHRlcl9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvZmxvYXRfYmZicy5oIgotI2luY2x1ZGUgImR1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2Zsb2F0X2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgImR1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2ludGVnZXJfYmZicy5oIgotI2luY2x1ZGUgImR1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2ludGVnZXJfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAiZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nX2JmYnMuaCIKLSNpbmNsdWRlICJkdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJpbmdfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAiZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RydWN0X2JmYnMuaCIKLSNpbmNsdWRlICJkdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJ1Y3RfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgRHVtcHN5c0ZpbHRlckludGVybmFsVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7fQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUge30KLQotICBmbGF0YnVmZmVyczo6VGFibGUqIEdldE11dGFibGVUYWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldE11dGFibGVSb290PGZsYXRidWZmZXJzOjpUYWJsZT4oZmJfYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpKTsKLSAgfQotCi0gIHZvaWQgUGFyc2VSZWZsZWN0aW9uU2NoZW1hKHVuc2lnbmVkIGNoYXIqIGJmYnMsIHVuc2lnbmVkIGludCBiZmJzX2xlbikgewotICAgIEFTU0VSVF9UUlVFKHJlZmxlY3Rpb25fc2NoZW1hXy5lbXB0eSgpKTsKLSAgICByZWZsZWN0aW9uX3NjaGVtYV8gPSBzdGQ6Om1vdmUoc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdD4oYmZicywgYmZicyArIGJmYnNfbGVuKSk7Ci0gICAgZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyIHZlcmlmaWVyKHJlZmxlY3Rpb25fc2NoZW1hXy5kYXRhKCksIHJlZmxlY3Rpb25fc2NoZW1hXy5zaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKHJlZmxlY3Rpb246OlZlcmlmeVNjaGVtYUJ1ZmZlcih2ZXJpZmllcikpOwotICAgIHNjaGVtYV8gPSByZWZsZWN0aW9uOjpHZXRTY2hlbWEocmVmbGVjdGlvbl9zY2hlbWFfLmRhdGEoKSk7Ci0gICAgQVNTRVJUX1RSVUUoc2NoZW1hXyAhPSBudWxscHRyKTsKLSAgfQotCi0gIGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogc2NoZW1hX3tudWxscHRyfTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiX2J1aWxkZXJfID0gc3RkOjptb3ZlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlcigxMDI0KSk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90PiByZWZsZWN0aW9uX3NjaGVtYV87Ci19OwotCi1jbGFzcyBEdW1wc3lzRmlsdGVySW50ZXJuYWxJbnRlZ2VyVGVzdCA6IHB1YmxpYyBEdW1wc3lzRmlsdGVySW50ZXJuYWxUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhpcy0+UGFyc2VSZWZsZWN0aW9uU2NoZW1hKGludGVnZXJfYmZicywgaW50ZWdlcl9iZmJzX2xlbik7Ci0gIH0KLQotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVJbnRlZ2VyKiBDcmVhdGVJbnRlZ2VyKGludDMyX3QgdmFsdWUpIHsKLSAgICBUZXN0VGFibGVJbnRlZ2VyQnVpbGRlciBidWlsZGVyKGZiX2J1aWxkZXJfKTsKLSAgICBidWlsZGVyLmFkZF90ZXN0X2ludCh2YWx1ZSk7Ci0gICAgZmJfYnVpbGRlcl8uRmluaXNoKGJ1aWxkZXIuRmluaXNoKCkpOwotICAgIHJldHVybiBHZXRUZXN0VGFibGVJbnRlZ2VyKGZiX2J1aWxkZXJfLkdldEJ1ZmZlclBvaW50ZXIoKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIER1bXBzeXNGaWx0ZXJJbnRlcm5hbEZsb2F0VGVzdCA6IHB1YmxpYyBEdW1wc3lzRmlsdGVySW50ZXJuYWxUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhpcy0+UGFyc2VSZWZsZWN0aW9uU2NoZW1hKGZsb2F0X2JmYnMsIGZsb2F0X2JmYnNfbGVuKTsKLSAgfQotCi0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZUZsb2F0KiBDcmVhdGVGbG9hdChkb3VibGUgdmFsdWUpIHsKLSAgICBUZXN0VGFibGVGbG9hdEJ1aWxkZXIgYnVpbGRlcihmYl9idWlsZGVyXyk7Ci0gICAgYnVpbGRlci5hZGRfdGVzdF9mbG9hdCh2YWx1ZSk7Ci0gICAgZmJfYnVpbGRlcl8uRmluaXNoKGJ1aWxkZXIuRmluaXNoKCkpOwotICAgIHJldHVybiBHZXRUZXN0VGFibGVGbG9hdChmYl9idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCkpOwotICB9Ci19OwotCi1jbGFzcyBEdW1wc3lzRmlsdGVySW50ZXJuYWxTdHJpbmdUZXN0IDogcHVibGljIER1bXBzeXNGaWx0ZXJJbnRlcm5hbFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aGlzLT5QYXJzZVJlZmxlY3Rpb25TY2hlbWEoc3RyaW5nX2JmYnMsIHN0cmluZ19iZmJzX2xlbik7Ci0gIH0KLQotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmcqIENyZWF0ZVN0cmluZyhzdGQ6OnN0cmluZyBzdHJpbmcpIHsKLSAgICBhdXRvIHRlc3Rfc3RyaW5nID0gZmJfYnVpbGRlcl8uQ3JlYXRlU3RyaW5nKHN0cmluZyk7Ci0gICAgVGVzdFRhYmxlU3RyaW5nQnVpbGRlciBidWlsZGVyKGZiX2J1aWxkZXJfKTsKLSAgICBidWlsZGVyLmFkZF90ZXN0X3N0cmluZyh0ZXN0X3N0cmluZyk7Ci0gICAgZmJfYnVpbGRlcl8uRmluaXNoKGJ1aWxkZXIuRmluaXNoKCkpOwotICAgIHJldHVybiBHZXRUZXN0VGFibGVTdHJpbmcoZmJfYnVpbGRlcl8uR2V0QnVmZmVyUG9pbnRlcigpKTsKLSAgfQotfTsKLQotY2xhc3MgRHVtcHN5c0ZpbHRlckludGVybmFsU3RydWN0VGVzdCA6IHB1YmxpYyBEdW1wc3lzRmlsdGVySW50ZXJuYWxUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhpcy0+UGFyc2VSZWZsZWN0aW9uU2NoZW1hKHN0cnVjdF9iZmJzLCBzdHJ1Y3RfYmZic19sZW4pOwotICB9Ci0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U3ViVGFibGU+IENyZWF0ZVN1YlRhYmxlKGludCB2YWwpIHsKLSAgICBUZXN0U3ViVGFibGVCdWlsZGVyIGJ1aWxkZXIoZmJfYnVpbGRlcl8pOwotICAgIGJ1aWxkZXIuYWRkX3BsYWNlaG9sZGVyKHZhbCk7Ci0gICAgcmV0dXJuIGJ1aWxkZXIuRmluaXNoKCk7Ci0gIH0KLQotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVTdHJ1Y3QqIENyZWF0ZVN0cnVjdChpbnQgdmFsKSB7Ci0gICAgYXV0byBzdWJfdGFibGUgPSBDcmVhdGVTdWJUYWJsZSh2YWwpOwotCi0gICAgVGVzdFRhYmxlU3RydWN0QnVpbGRlciBidWlsZGVyKGZiX2J1aWxkZXJfKTsKLSAgICBidWlsZGVyLmFkZF9zdWJfdGFibGUoc3ViX3RhYmxlKTsKLSAgICBmYl9idWlsZGVyXy5GaW5pc2goYnVpbGRlci5GaW5pc2goKSk7Ci0gICAgcmV0dXJuIEdldFRlc3RUYWJsZVN0cnVjdChmYl9idWlsZGVyXy5HZXRCdWZmZXJQb2ludGVyKCkpOwotICB9Ci19OwotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsSW50ZWdlclRlc3QsIGZpbHRlcl90eXBlX2ludGVnZXJfYW55KSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZUludGVnZXIqIHRlc3RfdGFibGUgPSBDcmVhdGVJbnRlZ2VyKDEyMyk7Ci0gIEFTU0VSVF9FUSgxMjMsIHRlc3RfdGFibGUtPnRlc3RfaW50KCkpOwotCi0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBHZXRNdXRhYmxlVGFibGUoKTsKLQotICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCA9IHNjaGVtYV8tPnJvb3RfdGFibGUoKTsKLSAgQVNTRVJUX1RSVUUob2JqZWN0ICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpGaWx0ZXJUeXBlSW50ZWdlcigqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprQW55KTsKLSAgfQotICBBU1NFUlRfRVEoMTIzLCB0ZXN0X3RhYmxlLT50ZXN0X2ludCgpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbEludGVnZXJUZXN0LCBmaWx0ZXJfdHlwZV9pbnRlZ2VyX2Fub255bWl6ZWQpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlciogdGVzdF90YWJsZSA9IENyZWF0ZUludGVnZXIoMTIzKTsKLSAgQVNTRVJUX0VRKDEyMywgdGVzdF90YWJsZS0+dGVzdF9pbnQoKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSA9IEdldE11dGFibGVUYWJsZSgpOwotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hXy0+cm9vdF90YWJsZSgpOwotICBBU1NFUlRfVFJVRShvYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgZm9yIChhdXRvIGl0ID0gb2JqZWN0LT5maWVsZHMoKS0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdC0+ZmllbGRzKCktPmNlbmQoKTsgKytpdCkgewotICAgIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OkZpbHRlclR5cGVJbnRlZ2VyKAotICAgICAgICAqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprQW5vbnltaXplZCk7Ci0gIH0KLSAgQVNTRVJUX05FKDEyMywgdGVzdF90YWJsZS0+dGVzdF9pbnQoKSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzRmlsdGVySW50ZXJuYWxJbnRlZ2VyVGVzdCwgZmlsdGVyX3R5cGVfaW50ZWdlcl9vcGFxdWUpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlciogdGVzdF90YWJsZSA9IENyZWF0ZUludGVnZXIoMTIzKTsKLSAgQVNTRVJUX0VRKDEyMywgdGVzdF90YWJsZS0+dGVzdF9pbnQoKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSA9IEdldE11dGFibGVUYWJsZSgpOwotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hXy0+cm9vdF90YWJsZSgpOwotICBBU1NFUlRfVFJVRShvYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgZm9yIChhdXRvIGl0ID0gb2JqZWN0LT5maWVsZHMoKS0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdC0+ZmllbGRzKCktPmNlbmQoKTsgKytpdCkgewotICAgIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OkZpbHRlclR5cGVJbnRlZ2VyKCoqaXQsIHRhYmxlLCBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpQcml2YWN5TGV2ZWw6OmtPcGFxdWUpOwotICB9Ci0gIEFTU0VSVF9FUSgwLCB0ZXN0X3RhYmxlLT50ZXN0X2ludCgpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbEludGVnZXJUZXN0LCBmaWx0ZXJfdHlwZV9pbnRlZ2VyX3ByaXZhY3kpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlciogdGVzdF90YWJsZSA9IENyZWF0ZUludGVnZXIoMTIzKTsKLSAgQVNTRVJUX0VRKDEyMywgdGVzdF90YWJsZS0+dGVzdF9pbnQoKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSA9IEdldE11dGFibGVUYWJsZSgpOwotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hXy0+cm9vdF90YWJsZSgpOwotICBBU1NFUlRfVFJVRShvYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgZm9yIChhdXRvIGl0ID0gb2JqZWN0LT5maWVsZHMoKS0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdC0+ZmllbGRzKCktPmNlbmQoKTsgKytpdCkgewotICAgIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OkZpbHRlclR5cGVJbnRlZ2VyKCoqaXQsIHRhYmxlLCBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpQcml2YWN5TGV2ZWw6OmtQcml2YXRlKTsKLSAgfQotICBBU1NFUlRfRVEoMCwgdGVzdF90YWJsZS0+dGVzdF9pbnQoKSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzRmlsdGVySW50ZXJuYWxGbG9hdFRlc3QsIGZpbHRlcl90eXBlX2Zsb2F0X2FueSkgewotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVGbG9hdCogdGVzdF90YWJsZSA9IENyZWF0ZUZsb2F0KDEuMjMpOwotICBBU1NFUlRfRkxPQVRfRVEoMS4yMywgdGVzdF90YWJsZS0+dGVzdF9mbG9hdCgpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZUZsb2F0KCoqaXQsIHRhYmxlLCBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpQcml2YWN5TGV2ZWw6OmtBbnkpOwotICB9Ci0gIEFTU0VSVF9GTE9BVF9FUSgxLjIzLCB0ZXN0X3RhYmxlLT50ZXN0X2Zsb2F0KCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsRmxvYXRUZXN0LCBmaWx0ZXJfdHlwZV9mbG9hdF9hbm9ueW1pemVkKSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZUZsb2F0KiB0ZXN0X3RhYmxlID0gQ3JlYXRlRmxvYXQoMS4yMyk7Ci0gIEFTU0VSVF9GTE9BVF9FUSgxLjIzLCB0ZXN0X3RhYmxlLT50ZXN0X2Zsb2F0KCkpOwotCi0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBHZXRNdXRhYmxlVGFibGUoKTsKLQotICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCA9IHNjaGVtYV8tPnJvb3RfdGFibGUoKTsKLSAgQVNTRVJUX1RSVUUob2JqZWN0ICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpGaWx0ZXJUeXBlRmxvYXQoKippdCwgdGFibGUsIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OlByaXZhY3lMZXZlbDo6a0Fub255bWl6ZWQpOwotICB9Ci0gIEFTU0VSVF9USEFUKHRlc3RfdGFibGUtPnRlc3RfZmxvYXQoKSwgTm90KEZsb2F0RXEoMS4yMykpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbEZsb2F0VGVzdCwgZmlsdGVyX3R5cGVfZmxvYXRfb3BhcXVlKSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZUZsb2F0KiB0ZXN0X3RhYmxlID0gQ3JlYXRlRmxvYXQoMS4yMyk7Ci0gIEFTU0VSVF9GTE9BVF9FUSgxLjIzLCB0ZXN0X3RhYmxlLT50ZXN0X2Zsb2F0KCkpOwotCi0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBHZXRNdXRhYmxlVGFibGUoKTsKLQotICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCA9IHNjaGVtYV8tPnJvb3RfdGFibGUoKTsKLSAgQVNTRVJUX1RSVUUob2JqZWN0ICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpGaWx0ZXJUeXBlRmxvYXQoKippdCwgdGFibGUsIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OlByaXZhY3lMZXZlbDo6a09wYXF1ZSk7Ci0gIH0KLSAgQVNTRVJUX0ZMT0FUX0VRKDAuMCwgdGVzdF90YWJsZS0+dGVzdF9mbG9hdCgpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbEZsb2F0VGVzdCwgZmlsdGVyX3R5cGVfZmxvYXRfcHJpdmF0ZSkgewotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVGbG9hdCogdGVzdF90YWJsZSA9IENyZWF0ZUZsb2F0KDEuMjMpOwotICBBU1NFUlRfRkxPQVRfRVEoMS4yMywgdGVzdF90YWJsZS0+dGVzdF9mbG9hdCgpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZUZsb2F0KCoqaXQsIHRhYmxlLCBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpQcml2YWN5TGV2ZWw6OmtQcml2YXRlKTsKLSAgfQotICBBU1NFUlRfRkxPQVRfRVEoMC4wLCB0ZXN0X3RhYmxlLT50ZXN0X2Zsb2F0KCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsU3RyaW5nVGVzdCwgZmlsdGVyX3R5cGVfc3RyaW5nX2FueSkgewotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmcqIHRlc3RfdGFibGUgPSBDcmVhdGVTdHJpbmcoIlRoaXMgaXMgYSBzdHJpbmciKTsKLSAgQVNTRVJUX1NUUkVRKCJUaGlzIGlzIGEgc3RyaW5nIiwgdGVzdF90YWJsZS0+dGVzdF9zdHJpbmcoKS0+Y19zdHIoKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSA9IEdldE11dGFibGVUYWJsZSgpOwotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hXy0+cm9vdF90YWJsZSgpOwotICBBU1NFUlRfVFJVRShvYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgZm9yIChhdXRvIGl0ID0gb2JqZWN0LT5maWVsZHMoKS0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdC0+ZmllbGRzKCktPmNlbmQoKTsgKytpdCkgewotICAgIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OkZpbHRlclR5cGVTdHJpbmcoKippdCwgdGFibGUsIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OlByaXZhY3lMZXZlbDo6a0FueSk7Ci0gIH0KLSAgQVNTRVJUX1NUUkVRKCJUaGlzIGlzIGEgc3RyaW5nIiwgdGVzdF90YWJsZS0+dGVzdF9zdHJpbmcoKS0+Y19zdHIoKSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzRmlsdGVySW50ZXJuYWxTdHJpbmdUZXN0LCBmaWx0ZXJfdHlwZV9zdHJpbmdfYW5vbnltb3VzKSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZVN0cmluZyogdGVzdF90YWJsZSA9IENyZWF0ZVN0cmluZygiVGhpcyBpcyBhIHN0cmluZyIpOwotICBBU1NFUlRfU1RSRVEoIlRoaXMgaXMgYSBzdHJpbmciLCB0ZXN0X3RhYmxlLT50ZXN0X3N0cmluZygpLT5jX3N0cigpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZVN0cmluZygKLSAgICAgICAgKippdCwgdGFibGUsIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OlByaXZhY3lMZXZlbDo6a0Fub255bWl6ZWQpOwotICB9Ci0gIEFTU0VSVF9ORSgiVGhpcyBpcyBhIHN0cmluZyIsIHRlc3RfdGFibGUtPnRlc3Rfc3RyaW5nKCktPmNfc3RyKCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsU3RyaW5nVGVzdCwgZmlsdGVyX3R5cGVfc3RyaW5nX2Fub255bW91c19zbWFsbCkgewotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmcqIHRlc3RfdGFibGUgPSBDcmVhdGVTdHJpbmcoIkEiKTsKLSAgQVNTRVJUX1NUUkVRKCJBIiwgdGVzdF90YWJsZS0+dGVzdF9zdHJpbmcoKS0+Y19zdHIoKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSA9IEdldE11dGFibGVUYWJsZSgpOwotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hXy0+cm9vdF90YWJsZSgpOwotICBBU1NFUlRfVFJVRShvYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgZm9yIChhdXRvIGl0ID0gb2JqZWN0LT5maWVsZHMoKS0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdC0+ZmllbGRzKCktPmNlbmQoKTsgKytpdCkgewotICAgIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OkZpbHRlclR5cGVTdHJpbmcoCi0gICAgICAgICoqaXQsIHRhYmxlLCBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpQcml2YWN5TGV2ZWw6OmtBbm9ueW1pemVkKTsKLSAgfQotICBBU1NFUlRfTkUoIkEiLCB0ZXN0X3RhYmxlLT50ZXN0X3N0cmluZygpLT5jX3N0cigpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbFN0cmluZ1Rlc3QsIGZpbHRlcl90eXBlX3N0cmluZ19hbm9ueW1vdXNfbGFyZ2UpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlU3RyaW5nKiB0ZXN0X3RhYmxlID0gQ3JlYXRlU3RyaW5nKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Iik7Ci0gIEFTU0VSVF9TVFJFUSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsIHRlc3RfdGFibGUtPnRlc3Rfc3RyaW5nKCktPmNfc3RyKCkpOwotCi0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBHZXRNdXRhYmxlVGFibGUoKTsKLQotICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCA9IHNjaGVtYV8tPnJvb3RfdGFibGUoKTsKLSAgQVNTRVJUX1RSVUUob2JqZWN0ICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpGaWx0ZXJUeXBlU3RyaW5nKAotICAgICAgICAqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprQW5vbnltaXplZCk7Ci0gIH0KLSAgQVNTRVJUX05FKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgdGVzdF90YWJsZS0+dGVzdF9zdHJpbmcoKS0+Y19zdHIoKSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzRmlsdGVySW50ZXJuYWxTdHJpbmdUZXN0LCBmaWx0ZXJfdHlwZV9zdHJpbmdfb3BhcXVlKSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZVN0cmluZyogdGVzdF90YWJsZSA9IENyZWF0ZVN0cmluZygiVGhpcyBpcyBhIHN0cmluZyIpOwotICBBU1NFUlRfU1RSRVEoIlRoaXMgaXMgYSBzdHJpbmciLCB0ZXN0X3RhYmxlLT50ZXN0X3N0cmluZygpLT5jX3N0cigpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZVN0cmluZygqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprT3BhcXVlKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIG9wYXF1ZV9leHBlY3RlZChzdHJsZW4oIlRoaXMgaXMgYSBzdHJpbmciKSwgJyonKTsKLSAgQVNTRVJUX1NUUkVRKG9wYXF1ZV9leHBlY3RlZC5jX3N0cigpLCB0ZXN0X3RhYmxlLT50ZXN0X3N0cmluZygpLT5jX3N0cigpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbFN0cmluZ1Rlc3QsIGZpbHRlcl90eXBlX3N0cmluZ19wcml2YXRlKSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZVN0cmluZyogdGVzdF90YWJsZSA9IENyZWF0ZVN0cmluZygiVGhpcyBpcyBhIHN0cmluZyIpOwotICBBU1NFUlRfU1RSRVEoIlRoaXMgaXMgYSBzdHJpbmciLCB0ZXN0X3RhYmxlLT50ZXN0X3N0cmluZygpLT5jX3N0cigpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZVN0cmluZygqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprUHJpdmF0ZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKG51bGxwdHIsIHRlc3RfdGFibGUtPnRlc3Rfc3RyaW5nKCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsU3RyaW5nVGVzdCwgZmlsdGVyX3R5cGVfc3RyaW5nX3ByaXZhdGVfc21hbGwpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlU3RyaW5nKiB0ZXN0X3RhYmxlID0gQ3JlYXRlU3RyaW5nKCJBIik7Ci0gIEFTU0VSVF9TVFJFUSgiQSIsIHRlc3RfdGFibGUtPnRlc3Rfc3RyaW5nKCktPmNfc3RyKCkpOwotCi0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBHZXRNdXRhYmxlVGFibGUoKTsKLQotICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCA9IHNjaGVtYV8tPnJvb3RfdGFibGUoKTsKLSAgQVNTRVJUX1RSVUUob2JqZWN0ICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpGaWx0ZXJUeXBlU3RyaW5nKCoqaXQsIHRhYmxlLCBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpQcml2YWN5TGV2ZWw6OmtQcml2YXRlKTsKLSAgfQotICBBU1NFUlRfRVEobnVsbHB0ciwgdGVzdF90YWJsZS0+dGVzdF9zdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzRmlsdGVySW50ZXJuYWxTdHJ1Y3RUZXN0LCBmaWx0ZXJfdHlwZV9zdHJ1Y3RfYW55KSB7Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZVN0cnVjdCogdGVzdF90YWJsZSA9IENyZWF0ZVN0cnVjdCg0NTYpOwotICBBU1NFUlRfRVEoNDU2LCB0ZXN0X3RhYmxlLT5zdWJfdGFibGUoKS0+cGxhY2Vob2xkZXIoKSk7Ci0KLSAgZmxhdGJ1ZmZlcnM6OlRhYmxlKiB0YWJsZSA9IEdldE11dGFibGVUYWJsZSgpOwotCi0gIGNvbnN0IHJlZmxlY3Rpb246Ok9iamVjdCogb2JqZWN0ID0gc2NoZW1hXy0+cm9vdF90YWJsZSgpOwotICBBU1NFUlRfVFJVRShvYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgZm9yIChhdXRvIGl0ID0gb2JqZWN0LT5maWVsZHMoKS0+Y2JlZ2luKCk7IGl0ICE9IG9iamVjdC0+ZmllbGRzKCktPmNlbmQoKTsgKytpdCkgewotICAgIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OkZpbHRlclR5cGVTdHJ1Y3QoKippdCwgdGFibGUsIGJsdWV0b290aDo6ZHVtcHN5czo6aW50ZXJuYWw6OlByaXZhY3lMZXZlbDo6a0FueSk7Ci0gIH0KLSAgQVNTRVJUX0VRKDQ1NiwgdGVzdF90YWJsZS0+c3ViX3RhYmxlKCktPnBsYWNlaG9sZGVyKCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsU3RydWN0VGVzdCwgZmlsdGVyX3R5cGVfc3RydWN0X2Fub255bW91cykgewotICBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVTdHJ1Y3QqIHRlc3RfdGFibGUgPSBDcmVhdGVTdHJ1Y3QoNDU2KTsKLSAgQVNTRVJUX0VRKDQ1NiwgdGVzdF90YWJsZS0+c3ViX3RhYmxlKCktPnBsYWNlaG9sZGVyKCkpOwotCi0gIGZsYXRidWZmZXJzOjpUYWJsZSogdGFibGUgPSBHZXRNdXRhYmxlVGFibGUoKTsKLQotICBjb25zdCByZWZsZWN0aW9uOjpPYmplY3QqIG9iamVjdCA9IHNjaGVtYV8tPnJvb3RfdGFibGUoKTsKLSAgQVNTRVJUX1RSVUUob2JqZWN0ICE9IG51bGxwdHIpOwotCi0gIGZvciAoYXV0byBpdCA9IG9iamVjdC0+ZmllbGRzKCktPmNiZWdpbigpOyBpdCAhPSBvYmplY3QtPmZpZWxkcygpLT5jZW5kKCk7ICsraXQpIHsKLSAgICBibHVldG9vdGg6OmR1bXBzeXM6OmludGVybmFsOjpGaWx0ZXJUeXBlU3RydWN0KAotICAgICAgICAqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprQW5vbnltaXplZCk7Ci0gIH0KLSAgQVNTRVJUX0VRKG51bGxwdHIsIHRlc3RfdGFibGUtPnN1Yl90YWJsZSgpKTsKLX0KLQotVEVTVF9GKER1bXBzeXNGaWx0ZXJJbnRlcm5hbFN0cnVjdFRlc3QsIGZpbHRlcl90eXBlX3N0cnVjdF9vcGFxdWUpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlU3RydWN0KiB0ZXN0X3RhYmxlID0gQ3JlYXRlU3RydWN0KDQ1Nik7Ci0gIEFTU0VSVF9FUSg0NTYsIHRlc3RfdGFibGUtPnN1Yl90YWJsZSgpLT5wbGFjZWhvbGRlcigpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZVN0cnVjdCgqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprT3BhcXVlKTsKLSAgfQotICBBU1NFUlRfRVEobnVsbHB0ciwgdGVzdF90YWJsZS0+c3ViX3RhYmxlKCkpOwotfQotCi1URVNUX0YoRHVtcHN5c0ZpbHRlckludGVybmFsU3RydWN0VGVzdCwgZmlsdGVyX3R5cGVfc3RydWN0X3ByaXZhdGUpIHsKLSAgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlU3RydWN0KiB0ZXN0X3RhYmxlID0gQ3JlYXRlU3RydWN0KDQ1Nik7Ci0gIEFTU0VSVF9FUSg0NTYsIHRlc3RfdGFibGUtPnN1Yl90YWJsZSgpLT5wbGFjZWhvbGRlcigpKTsKLQotICBmbGF0YnVmZmVyczo6VGFibGUqIHRhYmxlID0gR2V0TXV0YWJsZVRhYmxlKCk7Ci0KLSAgY29uc3QgcmVmbGVjdGlvbjo6T2JqZWN0KiBvYmplY3QgPSBzY2hlbWFfLT5yb290X3RhYmxlKCk7Ci0gIEFTU0VSVF9UUlVFKG9iamVjdCAhPSBudWxscHRyKTsKLQotICBmb3IgKGF1dG8gaXQgPSBvYmplY3QtPmZpZWxkcygpLT5jYmVnaW4oKTsgaXQgIT0gb2JqZWN0LT5maWVsZHMoKS0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6RmlsdGVyVHlwZVN0cnVjdCgqKml0LCB0YWJsZSwgYmx1ZXRvb3RoOjpkdW1wc3lzOjppbnRlcm5hbDo6UHJpdmFjeUxldmVsOjprUHJpdmF0ZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKG51bGxwdHIsIHRlc3RfdGFibGUtPnN1Yl90YWJsZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2Zsb2F0LmJmYnMgYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9mbG9hdC5iZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI0NzA3Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2Zsb2F0LmJmYnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9mbG9hdC5mYnMgYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9mbG9hdC5mYnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODMyZTYuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvZmxvYXQuZmJzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1uYW1lc3BhY2UgdGVzdGluZzsKLQotdGFibGUgVGVzdFRhYmxlRmxvYXQgewotICAgIHRlc3RfZmxvYXQ6ZmxvYXQ7Ci19Ci0KLXJvb3RfdHlwZSBUZXN0VGFibGVGbG9hdDsKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2Zsb2F0X2JmYnMuaCBiL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2Zsb2F0X2JmYnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkYTU0ZC4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9mbG9hdF9iZmJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi11bnNpZ25lZCBjaGFyIGZsb2F0X2JmYnNbXSA9IHsKLSAgICAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDQyLCAweDQ2LCAweDQyLCAweDUzLCAweDEwLCAweDAwLCAweDFjLCAweDAwLCAweDA0LCAweDAwLCAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDEwLAotICAgIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsCi0gICAgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDJjLCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDc0LCAweDY1LCAweDczLCAweDc0LCAweDY5LCAweDZlLCAweDY3LCAweDJlLCAweDU0LAotICAgIDB4NjUsIDB4NzMsIDB4NzQsIDB4NTQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NDYsIDB4NmMsIDB4NmYsIDB4NjEsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTIsIDB4MDAsCi0gICAgMHgwOCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDA4LCAweDAwLCAweDA3LCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MGIsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NjYsIDB4NmMsIDB4NmYsIDB4NjEsIDB4NzQsIDB4MDAsIDB4MDB9OwotdW5zaWduZWQgaW50IGZsb2F0X2JmYnNfbGVuID0gMjA4OwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvZmxvYXRfZ2VuZXJhdGVkLmggYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9mbG9hdF9nZW5lcmF0ZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NGU1MS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9mbG9hdF9nZW5lcmF0ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jaWZuZGVmIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9GTE9BVF9URVNUSU5HX0hfCi0jZGVmaW5lIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9GTE9BVF9URVNUSU5HX0hfCi0KLSNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXN0cnVjdCBUZXN0VGFibGVGbG9hdDsKLXN0cnVjdCBUZXN0VGFibGVGbG9hdEJ1aWxkZXI7Ci0KLXN0cnVjdCBUZXN0VGFibGVGbG9hdCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKLSAgdHlwZWRlZiBUZXN0VGFibGVGbG9hdEJ1aWxkZXIgQnVpbGRlcjsKLSAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsgVlRfVEVTVF9GTE9BVCA9IDQgfTsKLSAgZmxvYXQgdGVzdF9mbG9hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0RmllbGQ8ZmxvYXQ+KFZUX1RFU1RfRkxPQVQsIDAuMGYpOwotICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciYgdmVyaWZpZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9URVNUX0ZMT0FUKSAmJiB2ZXJpZmllci5FbmRUYWJsZSgpOwotICB9Ci19OwotCi1zdHJ1Y3QgVGVzdFRhYmxlRmxvYXRCdWlsZGVyIHsKLSAgdHlwZWRlZiBUZXN0VGFibGVGbG9hdCBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfdGVzdF9mbG9hdChmbG9hdCB0ZXN0X2Zsb2F0KSB7Ci0gICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihUZXN0VGFibGVGbG9hdDo6VlRfVEVTVF9GTE9BVCwgdGVzdF9mbG9hdCwgMC4wZik7Ci0gIH0KLSAgZXhwbGljaXQgVGVzdFRhYmxlRmxvYXRCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgX2ZiYikgOiBmYmJfKF9mYmIpIHsKLSAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKLSAgfQotICBUZXN0VGFibGVGbG9hdEJ1aWxkZXImIG9wZXJhdG9yPShjb25zdCBUZXN0VGFibGVGbG9hdEJ1aWxkZXImKTsKLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0VGFibGVGbG9hdD4gRmluaXNoKCkgewotICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFRhYmxlRmxvYXQ+KGVuZCk7Ci0gICAgcmV0dXJuIG87Ci0gIH0KLX07Ci0KLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RUYWJsZUZsb2F0PiBDcmVhdGVUZXN0VGFibGVGbG9hdCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIF9mYmIsIGZsb2F0IHRlc3RfZmxvYXQgPSAwLjBmKSB7Ci0gIFRlc3RUYWJsZUZsb2F0QnVpbGRlciBidWlsZGVyXyhfZmJiKTsKLSAgYnVpbGRlcl8uYWRkX3Rlc3RfZmxvYXQodGVzdF9mbG9hdCk7Ci0gIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKLX0KLQotaW5saW5lIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZUZsb2F0KiBHZXRUZXN0VGFibGVGbG9hdChjb25zdCB2b2lkKiBidWYpIHsKLSAgcmV0dXJuIGZsYXRidWZmZXJzOjpHZXRSb290PHRlc3Rpbmc6OlRlc3RUYWJsZUZsb2F0PihidWYpOwotfQotCi1pbmxpbmUgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlRmxvYXQqIEdldFNpemVQcmVmaXhlZFRlc3RUYWJsZUZsb2F0KGNvbnN0IHZvaWQqIGJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8dGVzdGluZzo6VGVzdFRhYmxlRmxvYXQ+KGJ1Zik7Ci19Ci0KLWlubGluZSBib29sIFZlcmlmeVRlc3RUYWJsZUZsb2F0QnVmZmVyKGZsYXRidWZmZXJzOjpWZXJpZmllciYgdmVyaWZpZXIpIHsKLSAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeUJ1ZmZlcjx0ZXN0aW5nOjpUZXN0VGFibGVGbG9hdD4obnVsbHB0cik7Ci19Ci0KLWlubGluZSBib29sIFZlcmlmeVNpemVQcmVmaXhlZFRlc3RUYWJsZUZsb2F0QnVmZmVyKGZsYXRidWZmZXJzOjpWZXJpZmllciYgdmVyaWZpZXIpIHsKLSAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVNpemVQcmVmaXhlZEJ1ZmZlcjx0ZXN0aW5nOjpUZXN0VGFibGVGbG9hdD4obnVsbHB0cik7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBUZXN0VGFibGVGbG9hdEV4dGVuc2lvbigpIHsKLSAgcmV0dXJuICJiZmJzIjsKLX0KLQotaW5saW5lIHZvaWQgRmluaXNoVGVzdFRhYmxlRmxvYXRCdWZmZXIoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmIsIGZsYXRidWZmZXJzOjpPZmZzZXQ8dGVzdGluZzo6VGVzdFRhYmxlRmxvYXQ+IHJvb3QpIHsKLSAgZmJiLkZpbmlzaChyb290KTsKLX0KLQotaW5saW5lIHZvaWQgRmluaXNoU2l6ZVByZWZpeGVkVGVzdFRhYmxlRmxvYXRCdWZmZXIoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmIsIGZsYXRidWZmZXJzOjpPZmZzZXQ8dGVzdGluZzo6VGVzdFRhYmxlRmxvYXQ+IHJvb3QpIHsKLSAgZmJiLkZpbmlzaFNpemVQcmVmaXhlZChyb290KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBGTEFUQlVGRkVSU19HRU5FUkFURURfRkxPQVRfVEVTVElOR19IXwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvaW50ZWdlci5iZmJzIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvaW50ZWdlci5iZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAzNmUzLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2ludGVnZXIuYmZicworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL2ludGVnZXIuZmJzIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvaW50ZWdlci5mYnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTU1NjkuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvaW50ZWdlci5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLW5hbWVzcGFjZSB0ZXN0aW5nOwotCi10YWJsZSBUZXN0VGFibGVJbnRlZ2VyIHsKLSAgICB0ZXN0X2ludDppbnQ7Ci19Ci0KLXJvb3RfdHlwZSBUZXN0VGFibGVJbnRlZ2VyOwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvaW50ZWdlcl9iZmJzLmggYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9pbnRlZ2VyX2JmYnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3MjBlOS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9pbnRlZ2VyX2JmYnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXVuc2lnbmVkIGNoYXIgaW50ZWdlcl9iZmJzW10gPSB7Ci0gICAgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0NiwgMHg0MiwgMHg1MywgMHgxMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwYywgMHgwMCwKLSAgICAweDEwLCAweDAwLCAweDE0LCAweDAwLCAweDE4LCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDBjLCAweDAwLCAweDEwLCAweDAwLCAweDA0LCAweDAwLAotICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NCwgMHg2NSwKLSAgICAweDczLCAweDc0LCAweDY5LCAweDZlLCAweDY3LCAweDJlLCAweDU0LCAweDY1LCAweDczLCAweDc0LCAweDU0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDQ5LCAweDZlLCAweDc0LAotICAgIDB4NjUsIDB4NjcsIDB4NjUsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNiwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDA4LCAweDAwLCAweDA3LCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDA4LCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NjksIDB4NmUsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotdW5zaWduZWQgaW50IGludGVnZXJfYmZic19sZW4gPSAyMTI7CmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9pbnRlZ2VyX2dlbmVyYXRlZC5oIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvaW50ZWdlcl9nZW5lcmF0ZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkMThiZi4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9pbnRlZ2VyX2dlbmVyYXRlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSNpZm5kZWYgRkxBVEJVRkZFUlNfR0VORVJBVEVEX0lOVEVHRVJfVEVTVElOR19IXwotI2RlZmluZSBGTEFUQlVGRkVSU19HRU5FUkFURURfSU5URUdFUl9URVNUSU5HX0hfCi0KLSNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXN0cnVjdCBUZXN0VGFibGVJbnRlZ2VyOwotc3RydWN0IFRlc3RUYWJsZUludGVnZXJCdWlsZGVyOwotCi1zdHJ1Y3QgVGVzdFRhYmxlSW50ZWdlciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKLSAgdHlwZWRlZiBUZXN0VGFibGVJbnRlZ2VyQnVpbGRlciBCdWlsZGVyOwotICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeyBWVF9URVNUX0lOVCA9IDQgfTsKLSAgaW50MzJfdCB0ZXN0X2ludCgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfVEVTVF9JTlQsIDApOwotICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciYgdmVyaWZpZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFU1RfSU5UKSAmJiB2ZXJpZmllci5FbmRUYWJsZSgpOwotICB9Ci19OwotCi1zdHJ1Y3QgVGVzdFRhYmxlSW50ZWdlckJ1aWxkZXIgewotICB0eXBlZGVmIFRlc3RUYWJsZUludGVnZXIgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX3Rlc3RfaW50KGludDMyX3QgdGVzdF9pbnQpIHsKLSAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oVGVzdFRhYmxlSW50ZWdlcjo6VlRfVEVTVF9JTlQsIHRlc3RfaW50LCAwKTsKLSAgfQotICBleHBsaWNpdCBUZXN0VGFibGVJbnRlZ2VyQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIF9mYmIpIDogZmJiXyhfZmJiKSB7Ci0gICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7Ci0gIH0KLSAgVGVzdFRhYmxlSW50ZWdlckJ1aWxkZXImIG9wZXJhdG9yPShjb25zdCBUZXN0VGFibGVJbnRlZ2VyQnVpbGRlciYpOwotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RUYWJsZUludGVnZXI+IEZpbmlzaCgpIHsKLSAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RUYWJsZUludGVnZXI+KGVuZCk7Ci0gICAgcmV0dXJuIG87Ci0gIH0KLX07Ci0KLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RUYWJsZUludGVnZXI+IENyZWF0ZVRlc3RUYWJsZUludGVnZXIoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBfZmJiLCBpbnQzMl90IHRlc3RfaW50ID0gMCkgewotICBUZXN0VGFibGVJbnRlZ2VyQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKLSAgYnVpbGRlcl8uYWRkX3Rlc3RfaW50KHRlc3RfaW50KTsKLSAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwotfQotCi1pbmxpbmUgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlciogR2V0VGVzdFRhYmxlSW50ZWdlcihjb25zdCB2b2lkKiBidWYpIHsKLSAgcmV0dXJuIGZsYXRidWZmZXJzOjpHZXRSb290PHRlc3Rpbmc6OlRlc3RUYWJsZUludGVnZXI+KGJ1Zik7Ci19Ci0KLWlubGluZSBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVJbnRlZ2VyKiBHZXRTaXplUHJlZml4ZWRUZXN0VGFibGVJbnRlZ2VyKGNvbnN0IHZvaWQqIGJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8dGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlcj4oYnVmKTsKLX0KLQotaW5saW5lIGJvb2wgVmVyaWZ5VGVzdFRhYmxlSW50ZWdlckJ1ZmZlcihmbGF0YnVmZmVyczo6VmVyaWZpZXImIHZlcmlmaWVyKSB7Ci0gIHJldHVybiB2ZXJpZmllci5WZXJpZnlCdWZmZXI8dGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlcj4obnVsbHB0cik7Ci19Ci0KLWlubGluZSBib29sIFZlcmlmeVNpemVQcmVmaXhlZFRlc3RUYWJsZUludGVnZXJCdWZmZXIoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyJiB2ZXJpZmllcikgewotICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5U2l6ZVByZWZpeGVkQnVmZmVyPHRlc3Rpbmc6OlRlc3RUYWJsZUludGVnZXI+KG51bGxwdHIpOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogVGVzdFRhYmxlSW50ZWdlckV4dGVuc2lvbigpIHsKLSAgcmV0dXJuICJiZmJzIjsKLX0KLQotaW5saW5lIHZvaWQgRmluaXNoVGVzdFRhYmxlSW50ZWdlckJ1ZmZlcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIGZiYiwgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZXN0aW5nOjpUZXN0VGFibGVJbnRlZ2VyPiByb290KSB7Ci0gIGZiYi5GaW5pc2gocm9vdCk7Ci19Ci0KLWlubGluZSB2b2lkIEZpbmlzaFNpemVQcmVmaXhlZFRlc3RUYWJsZUludGVnZXJCdWZmZXIoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmIsIGZsYXRidWZmZXJzOjpPZmZzZXQ8dGVzdGluZzo6VGVzdFRhYmxlSW50ZWdlcj4gcm9vdCkgewotICBmYmIuRmluaXNoU2l6ZVByZWZpeGVkKHJvb3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9JTlRFR0VSX1RFU1RJTkdfSF8KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL21rZmlsZXMgYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9ta2ZpbGVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU3N2QwLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL21rZmlsZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS4uLy4uLy4uLy4uLy4uL291dC9ob3N0L2xpbnV4LXg4Ni9iaW4vZmxhdGMgLWIgLS1zY2hlbWEgLS1jcHAgc3RyaW5nLmZicwoteHhkIC1pIHN0cmluZy5iZmJzID4gc3RyaW5nX2JmYnMuaAotLi4vLi4vLi4vLi4vLi4vb3V0L2hvc3QvbGludXgteDg2L2Jpbi9mbGF0YyAtYiAtLXNjaGVtYSAtLWNwcCBpbnRlZ2VyLmZicwoteHhkIC1pIGludGVnZXIuYmZicyA+IGludGVnZXJfYmZicy5oCi0uLi8uLi8uLi8uLi8uLi9vdXQvaG9zdC9saW51eC14ODYvYmluL2ZsYXRjIC1iIC0tc2NoZW1hIC0tY3BwIGZsb2F0LmZicwoteHhkIC1pIGZsb2F0LmJmYnMgPiBmbG9hdF9iZmJzLmgKLS4uLy4uLy4uLy4uLy4uL291dC9ob3N0L2xpbnV4LXg4Ni9iaW4vZmxhdGMgLWIgLS1zY2hlbWEgLS1jcHAgc3RydWN0LmZicwoteHhkIC1pIHN0cnVjdC5iZmJzID4gc3RydWN0X2JmYnMuaAotCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9yb290LmggYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9yb290LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzBlZTguLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvcm9vdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKLSNpbmNsdWRlICJyb290X2dlbmVyYXRlZC5oIgotCi11c2luZyBUYWJsZUFkZEZ1bmN0aW9uID0gc3RkOjpmdW5jdGlvbjx2b2lkKHRlc3Rpbmc6OkR1bXBzeXNUZXN0RGF0YVJvb3RCdWlsZGVyKiByb290X2J1aWxkZXIpPjsKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1zdHJ1Y3QgRHVtcHN5c1Rlc3REYXRhQ2xhc3MgewotICB2aXJ0dWFsIFRhYmxlQWRkRnVuY3Rpb24gR2V0VGFibGUoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBidWlsZGVyKSA9IDA7Ci0gIHZpcnR1YWwgfkR1bXBzeXNUZXN0RGF0YUNsYXNzKCkgPSBkZWZhdWx0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL3N0cmluZy5iZmJzIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nLmJmYnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTQ4MDIuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nLmJmYnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJpbmcuZmJzIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nLmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0ZjJmZC4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJpbmcuZmJzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1uYW1lc3BhY2UgdGVzdGluZzsKLQotdGFibGUgVGVzdFRhYmxlU3RyaW5nIHsKLSAgICB0ZXN0X3N0cmluZzpzdHJpbmc7Ci19Ci0KLXJvb3RfdHlwZSBUZXN0VGFibGVTdHJpbmc7CmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJpbmdfYmZicy5oIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nX2JmYnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MTRlZi4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJpbmdfYmZicy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotdW5zaWduZWQgY2hhciBzdHJpbmdfYmZic1tdID0gewotICAgIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDYsIDB4NDIsIDB4NTMsIDB4MTAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTAsCi0gICAgMHgwMCwgMHgxNCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywKLSAgICAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NjksIDB4NmUsIDB4NjcsIDB4MmUsIDB4NTQsCi0gICAgMHg2NSwgMHg3MywgMHg3NCwgMHg1NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1MywgMHg3NCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg2NywgMHgwMCwgMHgwYywgMHgwMCwgMHgxMiwgMHgwMCwKLSAgICAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDE4LCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwZCwgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NCwgMHg2NSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg3NCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg2NywgMHgwMH07Ci11bnNpZ25lZCBpbnQgc3RyaW5nX2JmYnNfbGVuID0gMjA4OwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nX2dlbmVyYXRlZC5oIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RyaW5nX2dlbmVyYXRlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VhN2ZlLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL3N0cmluZ19nZW5lcmF0ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jaWZuZGVmIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9TVFJJTkdfVEVTVElOR19IXwotI2RlZmluZSBGTEFUQlVGRkVSU19HRU5FUkFURURfU1RSSU5HX1RFU1RJTkdfSF8KLQotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotc3RydWN0IFRlc3RUYWJsZVN0cmluZzsKLXN0cnVjdCBUZXN0VGFibGVTdHJpbmdCdWlsZGVyOwotCi1zdHJ1Y3QgVGVzdFRhYmxlU3RyaW5nIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgewotICB0eXBlZGVmIFRlc3RUYWJsZVN0cmluZ0J1aWxkZXIgQnVpbGRlcjsKLSAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsgVlRfVEVTVF9TVFJJTkcgPSA0IH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqIHRlc3Rfc3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqPihWVF9URVNUX1NUUklORyk7Ci0gIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyJiB2ZXJpZmllcikgY29uc3QgewotICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJiBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFU1RfU1RSSU5HKSAmJgotICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlTdHJpbmcodGVzdF9zdHJpbmcoKSkgJiYgdmVyaWZpZXIuRW5kVGFibGUoKTsKLSAgfQotfTsKLQotc3RydWN0IFRlc3RUYWJsZVN0cmluZ0J1aWxkZXIgewotICB0eXBlZGVmIFRlc3RUYWJsZVN0cmluZyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfdGVzdF9zdHJpbmcoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiB0ZXN0X3N0cmluZykgewotICAgIGZiYl8uQWRkT2Zmc2V0KFRlc3RUYWJsZVN0cmluZzo6VlRfVEVTVF9TVFJJTkcsIHRlc3Rfc3RyaW5nKTsKLSAgfQotICBleHBsaWNpdCBUZXN0VGFibGVTdHJpbmdCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgX2ZiYikgOiBmYmJfKF9mYmIpIHsKLSAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKLSAgfQotICBUZXN0VGFibGVTdHJpbmdCdWlsZGVyJiBvcGVyYXRvcj0oY29uc3QgVGVzdFRhYmxlU3RyaW5nQnVpbGRlciYpOwotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RUYWJsZVN0cmluZz4gRmluaXNoKCkgewotICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFRhYmxlU3RyaW5nPihlbmQpOwotICAgIHJldHVybiBvOwotICB9Ci19OwotCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0VGFibGVTdHJpbmc+IENyZWF0ZVRlc3RUYWJsZVN0cmluZygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIF9mYmIsIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gdGVzdF9zdHJpbmcgPSAwKSB7Ci0gIFRlc3RUYWJsZVN0cmluZ0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7Ci0gIGJ1aWxkZXJfLmFkZF90ZXN0X3N0cmluZyh0ZXN0X3N0cmluZyk7Ci0gIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKLX0KLQotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFRhYmxlU3RyaW5nPiBDcmVhdGVUZXN0VGFibGVTdHJpbmdEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBfZmJiLCBjb25zdCBjaGFyKiB0ZXN0X3N0cmluZyA9IG51bGxwdHIpIHsKLSAgYXV0byB0ZXN0X3N0cmluZ19fID0gdGVzdF9zdHJpbmcgPyBfZmJiLkNyZWF0ZVN0cmluZyh0ZXN0X3N0cmluZykgOiAwOwotICByZXR1cm4gdGVzdGluZzo6Q3JlYXRlVGVzdFRhYmxlU3RyaW5nKF9mYmIsIHRlc3Rfc3RyaW5nX18pOwotfQotCi1pbmxpbmUgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlU3RyaW5nKiBHZXRUZXN0VGFibGVTdHJpbmcoY29uc3Qgdm9pZCogYnVmKSB7Ci0gIHJldHVybiBmbGF0YnVmZmVyczo6R2V0Um9vdDx0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmc+KGJ1Zik7Ci19Ci0KLWlubGluZSBjb25zdCB0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmcqIEdldFNpemVQcmVmaXhlZFRlc3RUYWJsZVN0cmluZyhjb25zdCB2b2lkKiBidWYpIHsKLSAgcmV0dXJuIGZsYXRidWZmZXJzOjpHZXRTaXplUHJlZml4ZWRSb290PHRlc3Rpbmc6OlRlc3RUYWJsZVN0cmluZz4oYnVmKTsKLX0KLQotaW5saW5lIGJvb2wgVmVyaWZ5VGVzdFRhYmxlU3RyaW5nQnVmZmVyKGZsYXRidWZmZXJzOjpWZXJpZmllciYgdmVyaWZpZXIpIHsKLSAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeUJ1ZmZlcjx0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmc+KG51bGxwdHIpOwotfQotCi1pbmxpbmUgYm9vbCBWZXJpZnlTaXplUHJlZml4ZWRUZXN0VGFibGVTdHJpbmdCdWZmZXIoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyJiB2ZXJpZmllcikgewotICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5U2l6ZVByZWZpeGVkQnVmZmVyPHRlc3Rpbmc6OlRlc3RUYWJsZVN0cmluZz4obnVsbHB0cik7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBUZXN0VGFibGVTdHJpbmdFeHRlbnNpb24oKSB7Ci0gIHJldHVybiAiYmZicyI7Ci19Ci0KLWlubGluZSB2b2lkIEZpbmlzaFRlc3RUYWJsZVN0cmluZ0J1ZmZlcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIGZiYiwgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZXN0aW5nOjpUZXN0VGFibGVTdHJpbmc+IHJvb3QpIHsKLSAgZmJiLkZpbmlzaChyb290KTsKLX0KLQotaW5saW5lIHZvaWQgRmluaXNoU2l6ZVByZWZpeGVkVGVzdFRhYmxlU3RyaW5nQnVmZmVyKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJiLCBmbGF0YnVmZmVyczo6T2Zmc2V0PHRlc3Rpbmc6OlRlc3RUYWJsZVN0cmluZz4gcm9vdCkgewotICBmYmIuRmluaXNoU2l6ZVByZWZpeGVkKHJvb3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9TVFJJTkdfVEVTVElOR19IXwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RydWN0LmJmYnMgYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJ1Y3QuYmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwM2NjNS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJ1Y3QuYmZicworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL3N0cnVjdC5mYnMgYi9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJ1Y3QuZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Q0OTc0Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL3N0cnVjdC5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1uYW1lc3BhY2UgdGVzdGluZzsKLQotdGFibGUgVGVzdFN1YlRhYmxlIHsKLSAgcGxhY2Vob2xkZXI6aW50OwotfQotCi10YWJsZSBUZXN0VGFibGVTdHJ1Y3R7Ci0gIHN1Yl90YWJsZTpUZXN0U3ViVGFibGU7Ci19Ci0KLXJvb3RfdHlwZSBUZXN0VGFibGVTdHJ1Y3Q7CmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJ1Y3RfYmZicy5oIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RydWN0X2JmYnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkOGUyMi4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL2ludGVybmFsL3Rlc3RfZGF0YS9zdHJ1Y3RfYmZicy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotdW5zaWduZWQgY2hhciBzdHJ1Y3RfYmZic1tdID0gewotICAgIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDYsIDB4NDIsIDB4NTMsIDB4MTAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTAsCi0gICAgMHgwMCwgMHgxNCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDJjLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxNCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDE3LCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NjksIDB4NmUsIDB4NjcsIDB4MmUsIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NTQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsCi0gICAgMHg1MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg2MywgMHg3NCwgMHgwMCwgMHg4OCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDBjLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDBhLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzMsIDB4NzUsIDB4NjIsIDB4NWYsIDB4NzQsIDB4NjEsCi0gICAgMHg2MiwgMHg2YywgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwYywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NjksIDB4NmUsIDB4NjcsIDB4MmUsIDB4NTQsIDB4NjUsIDB4NzMsCi0gICAgMHg3NCwgMHg1MywgMHg3NSwgMHg2MiwgMHg1NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgxMiwgMHgwMCwgMHgwOCwgMHgwMCwKLSAgICAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDBjLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsCi0gICAgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg2YywgMHg2MSwgMHg2MywgMHg2NSwgMHg2OCwgMHg2ZiwgMHg2YywgMHg2NCwgMHg2NSwgMHg3MiwgMHgwMH07Ci11bnNpZ25lZCBpbnQgc3RydWN0X2JmYnNfbGVuID0gMzIwOwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RydWN0X2dlbmVyYXRlZC5oIGIvZ2QvZHVtcHN5cy9pbnRlcm5hbC90ZXN0X2RhdGEvc3RydWN0X2dlbmVyYXRlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmUyZTBiLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvaW50ZXJuYWwvdGVzdF9kYXRhL3N0cnVjdF9nZW5lcmF0ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotI2lmbmRlZiBGTEFUQlVGRkVSU19HRU5FUkFURURfU1RSVUNUX1RFU1RJTkdfSF8KLSNkZWZpbmUgRkxBVEJVRkZFUlNfR0VORVJBVEVEX1NUUlVDVF9URVNUSU5HX0hfCi0KLSNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXN0cnVjdCBUZXN0U3ViVGFibGU7Ci1zdHJ1Y3QgVGVzdFN1YlRhYmxlQnVpbGRlcjsKLQotc3RydWN0IFRlc3RUYWJsZVN0cnVjdDsKLXN0cnVjdCBUZXN0VGFibGVTdHJ1Y3RCdWlsZGVyOwotCi1zdHJ1Y3QgVGVzdFN1YlRhYmxlIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgewotICB0eXBlZGVmIFRlc3RTdWJUYWJsZUJ1aWxkZXIgQnVpbGRlcjsKLSAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsgVlRfUExBQ0VIT0xERVIgPSA0IH07Ci0gIGludDMyX3QgcGxhY2Vob2xkZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX1BMQUNFSE9MREVSLCAwKTsKLSAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXImIHZlcmlmaWVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9QTEFDRUhPTERFUikgJiYgdmVyaWZpZXIuRW5kVGFibGUoKTsKLSAgfQotfTsKLQotc3RydWN0IFRlc3RTdWJUYWJsZUJ1aWxkZXIgewotICB0eXBlZGVmIFRlc3RTdWJUYWJsZSBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfcGxhY2Vob2xkZXIoaW50MzJfdCBwbGFjZWhvbGRlcikgewotICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihUZXN0U3ViVGFibGU6OlZUX1BMQUNFSE9MREVSLCBwbGFjZWhvbGRlciwgMCk7Ci0gIH0KLSAgZXhwbGljaXQgVGVzdFN1YlRhYmxlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIF9mYmIpIDogZmJiXyhfZmJiKSB7Ci0gICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7Ci0gIH0KLSAgVGVzdFN1YlRhYmxlQnVpbGRlciYgb3BlcmF0b3I9KGNvbnN0IFRlc3RTdWJUYWJsZUJ1aWxkZXImKTsKLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0U3ViVGFibGU+IEZpbmlzaCgpIHsKLSAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RTdWJUYWJsZT4oZW5kKTsKLSAgICByZXR1cm4gbzsKLSAgfQotfTsKLQotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFN1YlRhYmxlPiBDcmVhdGVUZXN0U3ViVGFibGUoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBfZmJiLCBpbnQzMl90IHBsYWNlaG9sZGVyID0gMCkgewotICBUZXN0U3ViVGFibGVCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwotICBidWlsZGVyXy5hZGRfcGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpOwotICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Ci19Ci0KLXN0cnVjdCBUZXN0VGFibGVTdHJ1Y3QgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7Ci0gIHR5cGVkZWYgVGVzdFRhYmxlU3RydWN0QnVpbGRlciBCdWlsZGVyOwotICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeyBWVF9TVUJfVEFCTEUgPSA0IH07Ci0gIGNvbnN0IHRlc3Rpbmc6OlRlc3RTdWJUYWJsZSogc3ViX3RhYmxlKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHRlc3Rpbmc6OlRlc3RTdWJUYWJsZSo+KFZUX1NVQl9UQUJMRSk7Ci0gIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyJiB2ZXJpZmllcikgY29uc3QgewotICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJiBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NVQl9UQUJMRSkgJiYgdmVyaWZpZXIuVmVyaWZ5VGFibGUoc3ViX3RhYmxlKCkpICYmCi0gICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7Ci0gIH0KLX07Ci0KLXN0cnVjdCBUZXN0VGFibGVTdHJ1Y3RCdWlsZGVyIHsKLSAgdHlwZWRlZiBUZXN0VGFibGVTdHJ1Y3QgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX3N1Yl90YWJsZShmbGF0YnVmZmVyczo6T2Zmc2V0PHRlc3Rpbmc6OlRlc3RTdWJUYWJsZT4gc3ViX3RhYmxlKSB7Ci0gICAgZmJiXy5BZGRPZmZzZXQoVGVzdFRhYmxlU3RydWN0OjpWVF9TVUJfVEFCTEUsIHN1Yl90YWJsZSk7Ci0gIH0KLSAgZXhwbGljaXQgVGVzdFRhYmxlU3RydWN0QnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIF9mYmIpIDogZmJiXyhfZmJiKSB7Ci0gICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7Ci0gIH0KLSAgVGVzdFRhYmxlU3RydWN0QnVpbGRlciYgb3BlcmF0b3I9KGNvbnN0IFRlc3RUYWJsZVN0cnVjdEJ1aWxkZXImKTsKLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZXN0VGFibGVTdHJ1Y3Q+IEZpbmlzaCgpIHsKLSAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlc3RUYWJsZVN0cnVjdD4oZW5kKTsKLSAgICByZXR1cm4gbzsKLSAgfQotfTsKLQotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVzdFRhYmxlU3RydWN0PiBDcmVhdGVUZXN0VGFibGVTdHJ1Y3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBfZmJiLCBmbGF0YnVmZmVyczo6T2Zmc2V0PHRlc3Rpbmc6OlRlc3RTdWJUYWJsZT4gc3ViX3RhYmxlID0gMCkgewotICBUZXN0VGFibGVTdHJ1Y3RCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwotICBidWlsZGVyXy5hZGRfc3ViX3RhYmxlKHN1Yl90YWJsZSk7Ci0gIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKLX0KLQotaW5saW5lIGNvbnN0IHRlc3Rpbmc6OlRlc3RUYWJsZVN0cnVjdCogR2V0VGVzdFRhYmxlU3RydWN0KGNvbnN0IHZvaWQqIGJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8dGVzdGluZzo6VGVzdFRhYmxlU3RydWN0PihidWYpOwotfQotCi1pbmxpbmUgY29uc3QgdGVzdGluZzo6VGVzdFRhYmxlU3RydWN0KiBHZXRTaXplUHJlZml4ZWRUZXN0VGFibGVTdHJ1Y3QoY29uc3Qgdm9pZCogYnVmKSB7Ci0gIHJldHVybiBmbGF0YnVmZmVyczo6R2V0U2l6ZVByZWZpeGVkUm9vdDx0ZXN0aW5nOjpUZXN0VGFibGVTdHJ1Y3Q+KGJ1Zik7Ci19Ci0KLWlubGluZSBib29sIFZlcmlmeVRlc3RUYWJsZVN0cnVjdEJ1ZmZlcihmbGF0YnVmZmVyczo6VmVyaWZpZXImIHZlcmlmaWVyKSB7Ci0gIHJldHVybiB2ZXJpZmllci5WZXJpZnlCdWZmZXI8dGVzdGluZzo6VGVzdFRhYmxlU3RydWN0PihudWxscHRyKTsKLX0KLQotaW5saW5lIGJvb2wgVmVyaWZ5U2l6ZVByZWZpeGVkVGVzdFRhYmxlU3RydWN0QnVmZmVyKGZsYXRidWZmZXJzOjpWZXJpZmllciYgdmVyaWZpZXIpIHsKLSAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVNpemVQcmVmaXhlZEJ1ZmZlcjx0ZXN0aW5nOjpUZXN0VGFibGVTdHJ1Y3Q+KG51bGxwdHIpOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogVGVzdFRhYmxlU3RydWN0RXh0ZW5zaW9uKCkgewotICByZXR1cm4gImJmYnMiOwotfQotCi1pbmxpbmUgdm9pZCBGaW5pc2hUZXN0VGFibGVTdHJ1Y3RCdWZmZXIoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmIsIGZsYXRidWZmZXJzOjpPZmZzZXQ8dGVzdGluZzo6VGVzdFRhYmxlU3RydWN0PiByb290KSB7Ci0gIGZiYi5GaW5pc2gocm9vdCk7Ci19Ci0KLWlubGluZSB2b2lkIEZpbmlzaFNpemVQcmVmaXhlZFRlc3RUYWJsZVN0cnVjdEJ1ZmZlcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIGZiYiwgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZXN0aW5nOjpUZXN0VGFibGVTdHJ1Y3Q+IHJvb3QpIHsKLSAgZmJiLkZpbmlzaFNpemVQcmVmaXhlZChyb290KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBGTEFUQlVGRkVSU19HRU5FUkFURURfU1RSVUNUX1RFU1RJTkdfSF8KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWEuY2MgYi9nZC9kdW1wc3lzL3JlZmxlY3Rpb25fc2NoZW1hLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNlYWEyLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZHVtcHN5cy9yZWZsZWN0aW9uX3NjaGVtYS5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnVuZGxlcl9zY2hlbWFfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKLSNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDsKLQotZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYTo6UmVmbGVjdGlvblNjaGVtYShjb25zdCBzdGQ6OnN0cmluZyYgcHJlX2J1bmRsZWRfc2NoZW1hKQotICAgIDogcHJlX2J1bmRsZWRfc2NoZW1hXyhwcmVfYnVuZGxlZF9zY2hlbWEpIHsKLSAgYnVuZGxlZF9zY2hlbWFfID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8Ymx1ZXRvb3RoOjpkdW1wc3lzOjpCdW5kbGVkU2NoZW1hPihwcmVfYnVuZGxlZF9zY2hlbWFfLmRhdGEoKSk7Ci0gIEFTU0VSVChidW5kbGVkX3NjaGVtYV8gIT0gbnVsbHB0cik7Ci19Ci0KLWludCBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hOjpHZXROdW1iZXJPZkJ1bmRsZWRTY2hlbWFzKCkgY29uc3QgewotICByZXR1cm4gYnVuZGxlZF9zY2hlbWFfLT5tYXAoKS0+c2l6ZSgpOwotfQotCi1zdGQ6OnN0cmluZyBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hOjpHZXRUaXRsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGJ1bmRsZWRfc2NoZW1hXy0+dGl0bGUoKS0+c3RyKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWE6OkdldFJvb3ROYW1lKCkgY29uc3QgewotICByZXR1cm4gYnVuZGxlZF9zY2hlbWFfLT5yb290X25hbWUoKS0+c3RyKCk7Ci19Ci0KLWNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYTo6R2V0Um9vdFJlZmxlY3Rpb25TY2hlbWEoKSBjb25zdCB7Ci0gIHJldHVybiBGaW5kSW5SZWZsZWN0aW9uU2NoZW1hKEdldFJvb3ROYW1lKCkpOwotfQotCi1jb25zdCByZWZsZWN0aW9uOjpTY2hlbWEqIGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWE6OkZpbmRJblJlZmxlY3Rpb25TY2hlbWEoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGJsdWV0b290aDo6ZHVtcHN5czo6QnVuZGxlZFNjaGVtYU1hcD4+KiBtYXAgPSBidW5kbGVkX3NjaGVtYV8tPm1hcCgpOwotCi0gIGZvciAoYXV0byBpdCA9IG1hcC0+Y2JlZ2luKCk7IGl0ICE9IG1hcC0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgaWYgKGl0LT5uYW1lKCktPnN0cigpID09IG5hbWUpIHsKLSAgICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpdC0+ZGF0YSgpLT5EYXRhKCkpLCBpdC0+ZGF0YSgpLT5zaXplKCkpOwotICAgICAgaWYgKCFyZWZsZWN0aW9uOjpWZXJpZnlTY2hlbWFCdWZmZXIodmVyaWZpZXIpKSB7Ci0gICAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gdmVyaWZ5IHNjaGVtYSBidWZmZXIgbmFtZTolcyIsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlZmxlY3Rpb246OkdldFNjaGVtYShpdC0+ZGF0YSgpLT5EYXRhKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hOjpQcmludFJlZmxlY3Rpb25TY2hlbWEoKSBjb25zdCB7Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxibHVldG9vdGg6OmR1bXBzeXM6OkJ1bmRsZWRTY2hlbWFNYXA+PiogbWFwID0gYnVuZGxlZF9zY2hlbWFfLT5tYXAoKTsKLSAgTE9HX0lORk8oCi0gICAgICAiICBCdW5kbGVkIHNjaGVtYSB0aXRsZTolcyByb290X25hbWU6JXMiLAotICAgICAgYnVuZGxlZF9zY2hlbWFfLT50aXRsZSgpLT5jX3N0cigpLAotICAgICAgYnVuZGxlZF9zY2hlbWFfLT5yb290X25hbWUoKS0+Y19zdHIoKSk7Ci0gIGZvciAoYXV0byBpdCA9IG1hcC0+Y2JlZ2luKCk7IGl0ICE9IG1hcC0+Y2VuZCgpOyArK2l0KSB7Ci0gICAgTE9HX0lORk8oIiAgICBzY2hlbWE6JXMiLCBpdC0+bmFtZSgpLT5jX3N0cigpKTsKLSAgfQotfQotCi1ib29sIGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWE6OlZlcmlmeVJlZmxlY3Rpb25TY2hlbWEoKSBjb25zdCB7Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxibHVldG9vdGg6OmR1bXBzeXM6OkJ1bmRsZWRTY2hlbWFNYXA+PiogbWFwID0gYnVuZGxlZF9zY2hlbWFfLT5tYXAoKTsKLQotICBmb3IgKGF1dG8gaXQgPSBtYXAtPmNiZWdpbigpOyBpdCAhPSBtYXAtPmNlbmQoKTsgKytpdCkgewotICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciB2ZXJpZmllcihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihpdC0+ZGF0YSgpLT5EYXRhKCkpLCBpdC0+ZGF0YSgpLT5zaXplKCkpOwotICAgIGlmICghcmVmbGVjdGlvbjo6VmVyaWZ5U2NoZW1hQnVmZmVyKHZlcmlmaWVyKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWEuaCBiL2dkL2R1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0OTY0NC4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL3JlZmxlY3Rpb25fc2NoZW1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ1bmRsZXJfc2NoZW1hX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0jaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvaWRsLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGR1bXBzeXMgewotCi1jbGFzcyBSZWZsZWN0aW9uU2NoZW1hIHsKLSBwdWJsaWM6Ci0gIFJlZmxlY3Rpb25TY2hlbWEoY29uc3Qgc3RkOjpzdHJpbmcmIHByZV9idW5kbGVkX3NjaGVtYSk7Ci0KLSAgc3RkOjpzdHJpbmcgR2V0VGl0bGUoKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgR2V0Um9vdE5hbWUoKSBjb25zdDsKLSAgaW50IEdldE51bWJlck9mQnVuZGxlZFNjaGVtYXMoKSBjb25zdDsKLQotICBib29sIFZlcmlmeVJlZmxlY3Rpb25TY2hlbWEoKSBjb25zdDsKLSAgY29uc3QgcmVmbGVjdGlvbjo6U2NoZW1hKiBHZXRSb290UmVmbGVjdGlvblNjaGVtYSgpIGNvbnN0OwotICBjb25zdCByZWZsZWN0aW9uOjpTY2hlbWEqIEZpbmRJblJlZmxlY3Rpb25TY2hlbWEoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OwotICB2b2lkIFByaW50UmVmbGVjdGlvblNjaGVtYSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgQnVuZGxlZFNjaGVtYSogYnVuZGxlZF9zY2hlbWFfOwotICBjb25zdCBzdGQ6OnN0cmluZyBwcmVfYnVuZGxlZF9zY2hlbWFfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGR1bXBzeXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWFfdGVzdC5jYyBiL2dkL2R1bXBzeXMvcmVmbGVjdGlvbl9zY2hlbWFfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllYzQ5Yy4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL3JlZmxlY3Rpb25fc2NoZW1hX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZHVtcHN5cy9yZWZsZWN0aW9uX3NjaGVtYS5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImR1bXBzeXMvZHVtcHN5c190ZXN0X2RhdGEuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZHVtcHN5cyB7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciogZGF0YTsKLWV4dGVybiBjb25zdCBzaXplX3QgZGF0YV9zaXplOwotY29uc3Qgc3RkOjpzdHJpbmcmIEdldEJ1bmRsZWRTY2hlbWFEYXRhKCk7Ci19ICAvLyBuYW1lc3BhY2UgZHVtcHN5cwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg7Ci0KLWNsYXNzIFJlZmxlY3Rpb25TY2hlbWFUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHt9Ci19OwotCi1URVNUX0YoUmVmbGVjdGlvblNjaGVtYVRlc3QsIHZlcmlmeV90ZXN0X2NvbnRlbnQpIHsKLSAgZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYSByZWZsZWN0aW9uX3NjaGVtYSh0ZXN0aW5nOjpHZXRCdW5kbGVkU2NoZW1hRGF0YSgpKTsKLSAgQVNTRVJUX1RSVUUocmVmbGVjdGlvbl9zY2hlbWEuR2V0TnVtYmVyT2ZCdW5kbGVkU2NoZW1hcygpID09IDUpOwotICBBU1NFUlRfVFJVRShyZWZsZWN0aW9uX3NjaGVtYS5GaW5kSW5SZWZsZWN0aW9uU2NoZW1hKCJ0ZXN0aW5nLkR1bXBzeXNUZXN0RGF0YVJvb3QiKSAhPSBudWxscHRyKTsKLSAgQVNTRVJUX1RSVUUocmVmbGVjdGlvbl9zY2hlbWEuRmluZEluUmVmbGVjdGlvblNjaGVtYSgidGVzdGluZy5CYXJUZXN0U2NoZW1hIikgIT0gbnVsbHB0cik7Ci0gIEFTU0VSVF9UUlVFKHJlZmxlY3Rpb25fc2NoZW1hLkZpbmRJblJlZmxlY3Rpb25TY2hlbWEoInRlc3RpbmcuQmF6VGVzdFNjaGVtYSIpICE9IG51bGxwdHIpOwotICBBU1NFUlRfVFJVRShyZWZsZWN0aW9uX3NjaGVtYS5GaW5kSW5SZWZsZWN0aW9uU2NoZW1hKCJ0ZXN0aW5nLkZvb1Rlc3RTY2hlbWEiKSAhPSBudWxscHRyKTsKLSAgQVNTRVJUX1RSVUUocmVmbGVjdGlvbl9zY2hlbWEuRmluZEluUmVmbGVjdGlvblNjaGVtYSgidGVzdGluZy5RdXhUZXN0U2NoZW1hIikgIT0gbnVsbHB0cik7Ci0gIEFTU0VSVF9UUlVFKHJlZmxlY3Rpb25fc2NoZW1hLkZpbmRJblJlZmxlY3Rpb25TY2hlbWEoIkRvZXNOb3RFeGlzdCIpID09IG51bGxwdHIpOwotfQotCi1URVNUX0YoUmVmbGVjdGlvblNjaGVtYVRlc3QsIHZlcmlmeV90ZXN0X3NjaGVtYSkgewotICBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hIHJlZmxlY3Rpb25fc2NoZW1hKHRlc3Rpbmc6OkdldEJ1bmRsZWRTY2hlbWFEYXRhKCkpOwotICBBU1NFUlRfVFJVRShyZWZsZWN0aW9uX3NjaGVtYS5WZXJpZnlSZWZsZWN0aW9uU2NoZW1hKCkpOwotfQotCi1URVNUX0YoUmVmbGVjdGlvblNjaGVtYVRlc3QsIHZlcmlmeV9wcm9kdWN0aW9uX3NjaGVtYSkgewotICBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hIHJlZmxlY3Rpb25fc2NoZW1hKGJsdWV0b290aDo6ZHVtcHN5czo6R2V0QnVuZGxlZFNjaGVtYURhdGEoKSk7Ci0gIEFTU0VSVF9UUlVFKHJlZmxlY3Rpb25fc2NoZW1hLlZlcmlmeVJlZmxlY3Rpb25TY2hlbWEoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9iYXIuZmJzIGIvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvYmFyLmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0MjNmZWEuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvYmFyLmZicworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLW5hbWVzcGFjZSB0ZXN0aW5nOwotCi1hdHRyaWJ1dGUgInByaXZhY3kiOwotCi10YWJsZSBCYXJUZXN0U2NoZW1hIHsKLSAgICBiYXJfeDppbnQ7Ci0gICAgYmFyX3k6aW50OwotICAgIGFub3RoZXJfZmllbGQ6c3RyaW5nIChwcml2YWN5OiJBbnkiKTsKLX0KLQotcm9vdF90eXBlIEJhclRlc3RTY2hlbWE7Ci0KZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL2Jhci5oIGIvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvYmFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmQwZWUuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvYmFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioKLSAqCi0gKiovCi0jaW5jbHVkZSAiYmFyX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgInJvb3QuaCIKLSNpbmNsdWRlICJyb290X2dlbmVyYXRlZC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIEJhclRlc3REYXRhQ2xhc3MgOiBwdWJsaWMgRHVtcHN5c1Rlc3REYXRhQ2xhc3MgewotIHB1YmxpYzoKLSAgVGFibGVBZGRGdW5jdGlvbiBHZXRUYWJsZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIGZiX2J1aWxkZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gW10oRHVtcHN5c1Rlc3REYXRhUm9vdEJ1aWxkZXIqIGJ1aWxkZXIpIHt9OwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvYmF6LmZicyBiL2dkL2R1bXBzeXMvdGVzdF9kYXRhL2Jhei5mYnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjQ5YTkuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvYmF6LmZicworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLW5hbWVzcGFjZSB0ZXN0aW5nOwotCi1hdHRyaWJ1dGUgInByaXZhY3kiOwotCi10YWJsZSBCYXpTdWJUYWJsZVByaXZhdGUgewotICAgIHN1YnRhYmxlX2ludF9hbnk6aW50IChwcml2YWN5OiJBbnkiKTsKLSAgICBzdWJ0YWJsZV9zdHJpbmdfYW55OnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci19Ci0KLXRhYmxlIEJhelN1YlRhYmxlT3BhcXVlIHsKLSAgICBzdWJ0YWJsZV9pbnRfYW55OmludCAocHJpdmFjeToiQW55Iik7Ci0gICAgc3VidGFibGVfc3RyaW5nX2FueTpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotfQotCi10YWJsZSBCYXpTdWJUYWJsZUFub255bWl6ZWQgewotICAgIHN1YnRhYmxlX2ludF9hbnk6aW50IChwcml2YWN5OiJBbnkiKTsKLSAgICBzdWJ0YWJsZV9zdHJpbmdfYW55OnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci19Ci0KLXRhYmxlIEJhelN1YlRhYmxlQW55IHsKLSAgICBzdWJ0YWJsZV9pbnRfcHJpdmF0ZTppbnQgKHByaXZhY3k6IlByaXZhdGUiKTsKLSAgICBzdWJ0YWJsZV9pbnRfb3BhcXVlOmludCAocHJpdmFjeToiT3BhcXVlIik7Ci0gICAgc3VidGFibGVfaW50X2Fub255bWl6ZWQ6aW50IChwcml2YWN5OiJBbm9ueW1pemVkIik7Ci0gICAgc3VidGFibGVfaW50X2FueTppbnQgKHByaXZhY3k6IkFueSIpOwotICAgIHN1YnRhYmxlX3N0cmluZ19hbnk6c3RyaW5nIChwcml2YWN5OiJBbnkiKTsKLX0KLQotdGFibGUgQmF6VGVzdFNjaGVtYSB7Ci0gICAgc3ViX3RhYmxlX3ByaXZhdGU6QmF6U3ViVGFibGVQcml2YXRlOyAvLyBwcml2YXRlIGJ5IGRlZmF1bHQKLSAgICBzdWJfdGFibGVfb3BhcXVlOkJhelN1YlRhYmxlT3BhcXVlIChwcml2YWN5OiJPcGFxdWUiKTsKLSAgICBzdWJfdGFibGVfYW5vbnltaXplZDpCYXpTdWJUYWJsZUFub255bWl6ZWQgKHByaXZhY3k6IkFub255bWl6ZWQiKTsKLSAgICBzdWJfdGFibGVfYW55OkJhelN1YlRhYmxlQW55IChwcml2YWN5OiJBbnkiKTsKLX0KLQotcm9vdF90eXBlIEJhelRlc3RTY2hlbWE7CmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9iYXouaCBiL2dkL2R1bXBzeXMvdGVzdF9kYXRhL2Jhei5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk3MDg1Li4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL2Jhei5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCi0jaW5jbHVkZSAiYmF6X2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgInJvb3QuaCIKLSNpbmNsdWRlICJyb290X2dlbmVyYXRlZC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIEJhelRlc3REYXRhQ2xhc3MgOiBwdWJsaWMgRHVtcHN5c1Rlc3REYXRhQ2xhc3MgewotIHB1YmxpYzoKLSAgVGFibGVBZGRGdW5jdGlvbiBHZXRUYWJsZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIGZiX2J1aWxkZXIpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHN1Yl9uYW1lX3ByaXZhdGUgPSBmYl9idWlsZGVyLkNyZWF0ZVN0cmluZygiQmF6IFN1YnRhYmxlIFByaXZhdGUiKTsKLSAgICBhdXRvIHN1Yl9uYW1lX29wYXF1ZSA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCJCYXogU3VidGFibGUgT3BhcXVlIik7Ci0gICAgYXV0byBzdWJfbmFtZV9hbm9ueW1pemVkID0gZmJfYnVpbGRlci5DcmVhdGVTdHJpbmcoIkJheiBTdWJ0YWJsZSBBbm9ueW1pemVkIik7Ci0gICAgYXV0byBzdWJfbmFtZV9hbnkgPSBmYl9idWlsZGVyLkNyZWF0ZVN0cmluZygiQmF6IFN1YnRhYmxlIEFueSIpOwotCi0gICAgYXV0byBwcml2YXRlX3N1YnRhYmxlID0gQ3JlYXRlQmF6U3ViVGFibGVQcml2YXRlKGZiX2J1aWxkZXIsIDEsIHN1Yl9uYW1lX3ByaXZhdGUpOwotICAgIGF1dG8gb3BhcXVlX3N1YnRhYmxlID0gQ3JlYXRlQmF6U3ViVGFibGVPcGFxdWUoZmJfYnVpbGRlciwgMSwgc3ViX25hbWVfb3BhcXVlKTsKLSAgICBhdXRvIGFub255bWl6ZWRfc3VidGFibGUgPSBDcmVhdGVCYXpTdWJUYWJsZUFub255bWl6ZWQoZmJfYnVpbGRlciwgMSwgc3ViX25hbWVfYW5vbnltaXplZCk7Ci0gICAgYXV0byBhbnlfc3VidGFibGUgPSBDcmVhdGVCYXpTdWJUYWJsZUFueShmYl9idWlsZGVyLCAxLCAyLCAzLCA0LCBzdWJfbmFtZV9hbnkpOwotCi0gICAgQmF6VGVzdFNjaGVtYUJ1aWxkZXIgYnVpbGRlcihmYl9idWlsZGVyKTsKLSAgICBidWlsZGVyLmFkZF9zdWJfdGFibGVfcHJpdmF0ZShwcml2YXRlX3N1YnRhYmxlKTsKLSAgICBidWlsZGVyLmFkZF9zdWJfdGFibGVfb3BhcXVlKG9wYXF1ZV9zdWJ0YWJsZSk7Ci0gICAgYnVpbGRlci5hZGRfc3ViX3RhYmxlX2Fub255bWl6ZWQoYW5vbnltaXplZF9zdWJ0YWJsZSk7Ci0gICAgYnVpbGRlci5hZGRfc3ViX3RhYmxlX2FueShhbnlfc3VidGFibGUpOwotICAgIGF1dG8gYmF6X3RhYmxlID0gYnVpbGRlci5GaW5pc2goKTsKLQotICAgIHJldHVybiBbYmF6X3RhYmxlXShEdW1wc3lzVGVzdERhdGFSb290QnVpbGRlciogYnVpbGRlcikgeyBidWlsZGVyLT5hZGRfYmF6X21vZHVsZV9kYXRhKGJhel90YWJsZSk7IH07Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9mb28uZmJzIGIvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvZm9vLmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0ODJjMy4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9mb28uZmJzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotbmFtZXNwYWNlIHRlc3Rpbmc7Ci0KLWF0dHJpYnV0ZSAicHJpdmFjeSI7Ci0KLXRhYmxlIEZvb1Rlc3RTY2hlbWEgewotICAgIGZvb19pbnRfcHJpdmF0ZTppbnQ7Ci0gICAgZm9vX2ludF9vcGFxdWU6aW50IChwcml2YWN5OiJPcGFxdWUiKTsKLSAgICBmb29faW50X2Fub255bWl6ZWQ6aW50IChwcml2YWN5OiJBbm9ueW1pemVkIik7Ci0gICAgZm9vX2ludF9hbnk6aW50IChwcml2YWN5OiJBbnkiKTsKLSAgICBmb29faW50X3N0cmluZzpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotCi0gICAgZm9vX2Zsb2F0X3ByaXZhdGU6ZmxvYXQ7Ci0gICAgZm9vX2Zsb2F0X29wYXF1ZTpmbG9hdCAocHJpdmFjeToiT3BhcXVlIik7Ci0gICAgZm9vX2Zsb2F0X2Fub255bWl6ZWQ6ZmxvYXQgKHByaXZhY3k6IkFub255bWl6ZWQiKTsKLSAgICBmb29fZmxvYXRfYW55OmZsb2F0IChwcml2YWN5OiJBbnkiKTsKLSAgICBmb29fZmxvYXRfc3RyaW5nOnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci0KLSAgICBmb29fYm9vbF9wcml2YXRlOmJvb2wgKHByaXZhY3k6IlByaXZhdGUiKTsKLSAgICBmb29fYm9vbF9vcGFxdWU6Ym9vbCAocHJpdmFjeToiT3BhcXVlIik7Ci0gICAgZm9vX2Jvb2xfYW5vbnltaXplZDpib29sIChwcml2YWN5OiJBbm9ueW1pemVkIik7Ci0gICAgZm9vX2Jvb2xfYW55OmJvb2wgKHByaXZhY3k6IkFueSIpOwotICAgIGZvb19ib29sX3N0cmluZzpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotfQotCi1yb290X3R5cGUgRm9vVGVzdFNjaGVtYTsKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL2Zvby5oIGIvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvZm9vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTdiZDkuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvZm9vLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0KLSNpbmNsdWRlICJmb29fZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAicm9vdC5oIgotI2luY2x1ZGUgInJvb3RfZ2VuZXJhdGVkLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgRm9vVGVzdERhdGFDbGFzcyA6IHB1YmxpYyBEdW1wc3lzVGVzdERhdGFDbGFzcyB7Ci0gcHVibGljOgotICBUYWJsZUFkZEZ1bmN0aW9uIEdldFRhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJfYnVpbGRlcikgb3ZlcnJpZGUgewotICAgIGF1dG8gaW50X3N0cmluZyA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCIxMjMiKTsKLSAgICBhdXRvIGZsb2F0X3N0cmluZyA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCIxMjMuNDU2Iik7Ci0gICAgYXV0byBib29sX3N0cmluZyA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCJ0cnVlIik7Ci0KLSAgICBGb29UZXN0U2NoZW1hQnVpbGRlciBidWlsZGVyKGZiX2J1aWxkZXIpOwotICAgIGJ1aWxkZXIuYWRkX2Zvb19pbnRfcHJpdmF0ZSgxMjMpOwotICAgIGJ1aWxkZXIuYWRkX2Zvb19pbnRfb3BhcXVlKDEyMyk7Ci0gICAgYnVpbGRlci5hZGRfZm9vX2ludF9hbm9ueW1pemVkKDEyMyk7Ci0gICAgYnVpbGRlci5hZGRfZm9vX2ludF9hbnkoMTIzKTsKLSAgICBidWlsZGVyLmFkZF9mb29faW50X3N0cmluZyhpbnRfc3RyaW5nKTsKLQotICAgIGJ1aWxkZXIuYWRkX2Zvb19mbG9hdF9wcml2YXRlKDEyMy40NTYpOwotICAgIGJ1aWxkZXIuYWRkX2Zvb19mbG9hdF9vcGFxdWUoMTIzLjQ1Nik7Ci0gICAgYnVpbGRlci5hZGRfZm9vX2Zsb2F0X2Fub255bWl6ZWQoMTIzLjQ1Nik7Ci0gICAgYnVpbGRlci5hZGRfZm9vX2Zsb2F0X2FueSgxMjMuNDU2KTsKLSAgICBidWlsZGVyLmFkZF9mb29fZmxvYXRfc3RyaW5nKGZsb2F0X3N0cmluZyk7Ci0KLSAgICBidWlsZGVyLmFkZF9mb29fYm9vbF9wcml2YXRlKHRydWUpOwotICAgIGJ1aWxkZXIuYWRkX2Zvb19ib29sX29wYXF1ZSh0cnVlKTsKLSAgICBidWlsZGVyLmFkZF9mb29fYm9vbF9hbm9ueW1pemVkKHRydWUpOwotICAgIGJ1aWxkZXIuYWRkX2Zvb19ib29sX2FueSh0cnVlKTsKLSAgICBidWlsZGVyLmFkZF9mb29fYm9vbF9zdHJpbmcoYm9vbF9zdHJpbmcpOwotCi0gICAgYXV0byBmb29fdGFibGUgPSBidWlsZGVyLkZpbmlzaCgpOwotCi0gICAgcmV0dXJuIFtmb29fdGFibGVdKER1bXBzeXNUZXN0RGF0YVJvb3RCdWlsZGVyKiBidWlsZGVyKSB7IGJ1aWxkZXItPmFkZF9mb29fbW9kdWxlX2RhdGEoZm9vX3RhYmxlKTsgfTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL3F1eC5mYnMgYi9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9xdXguZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWUxN2RhLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL3F1eC5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1uYW1lc3BhY2UgdGVzdGluZzsKLQotYXR0cmlidXRlICJwcml2YWN5IjsKLQotdGFibGUgUXV4VGVzdFNjaGVtYSB7Ci0gICAgcXV4X2ludF9wcml2YXRlOmludDsKLSAgICBxdXhfaW50X29wYXF1ZTppbnQgKHByaXZhY3k6Ik9wYXF1ZSIpOwotICAgIHF1eF9pbnRfYW5vbnltaXplZDppbnQgKHByaXZhY3k6IkFub255bWl6ZWQiKTsKLSAgICBxdXhfaW50X2FueTppbnQgKHByaXZhY3k6IkFueSIpOwotICAgIHF1eF9zdHJpbmdfbmFtZTpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotfQotCi1yb290X3R5cGUgUXV4VGVzdFNjaGVtYTsKZGlmZiAtLWdpdCBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL3F1eC5oIGIvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvcXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODlkM2QuLjAwMDAwMDAKLS0tIGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvcXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0KLSNpbmNsdWRlICJxdXhfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAicm9vdC5oIgotI2luY2x1ZGUgInJvb3RfZ2VuZXJhdGVkLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgUXV4VGVzdERhdGFDbGFzcyA6IHB1YmxpYyBEdW1wc3lzVGVzdERhdGFDbGFzcyB7Ci0gcHVibGljOgotICBUYWJsZUFkZEZ1bmN0aW9uIEdldFRhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJfYnVpbGRlcikgb3ZlcnJpZGUgewotICAgIGF1dG8gbmFtZSA9IGZiX2J1aWxkZXIuQ3JlYXRlU3RyaW5nKCJRdXggTW9kdWxlIFN0cmluZyIpOwotCi0gICAgUXV4VGVzdFNjaGVtYUJ1aWxkZXIgYnVpbGRlcihmYl9idWlsZGVyKTsKLSAgICBidWlsZGVyLmFkZF9xdXhfaW50X3ByaXZhdGUoMTIzKTsKLSAgICBidWlsZGVyLmFkZF9xdXhfaW50X29wYXF1ZSg0NTYpOwotICAgIGJ1aWxkZXIuYWRkX3F1eF9pbnRfYW5vbnltaXplZCg3ODkpOwotICAgIGJ1aWxkZXIuYWRkX3F1eF9pbnRfYW55KDB4YWJjKTsKLSAgICBidWlsZGVyLmFkZF9xdXhfc3RyaW5nX25hbWUobmFtZSk7Ci0KLSAgICBhdXRvIHF1eF90YWJsZSA9IGJ1aWxkZXIuRmluaXNoKCk7Ci0KLSAgICByZXR1cm4gW3F1eF90YWJsZV0oRHVtcHN5c1Rlc3REYXRhUm9vdEJ1aWxkZXIqIGJ1aWxkZXIpIHsgYnVpbGRlci0+YWRkX3F1eF9tb2R1bGVfZGF0YShxdXhfdGFibGUpOyB9OwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvcm9vdC5mYnMgYi9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9yb290LmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkZDMxMC4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzL3Rlc3RfZGF0YS9yb290LmZicworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLWluY2x1ZGUgImZvby5mYnMiOwotaW5jbHVkZSAiYmFyLmZicyI7Ci1pbmNsdWRlICJiYXouZmJzIjsKLWluY2x1ZGUgInF1eC5mYnMiOwotCi1uYW1lc3BhY2UgdGVzdGluZzsKLQotYXR0cmlidXRlICJwcml2YWN5IjsKLQotdGFibGUgRHVtcHN5c1Rlc3REYXRhUm9vdCB7Ci0gICAgc3RyaW5nX3ByaXZhdGU6c3RyaW5nOwotICAgIHN0cmluZ19vcGFxdWU6c3RyaW5nIChwcml2YWN5OiJPcGFxdWUiKTsKLSAgICBzdHJpbmdfYW5vbnltaXplZDpzdHJpbmcgKHByaXZhY3k6IkFub255bWl6ZWQiKTsKLSAgICBzdHJpbmdfYW55OnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci0KLSAgICBpbnRfcHJpdmF0ZTppbnQzMiAocHJpdmFjeToiUHJpdmF0ZSIpOwotICAgIGludF9vcGFxdWU6aW50MzIgKHByaXZhY3k6Ik9wYXF1ZSIpOwotICAgIGludF9hbm9ueW1pemVkOmludDMyIChwcml2YWN5OiJBbm9ueW1pemVkIik7Ci0gICAgaW50X2FueTppbnQzMiAocHJpdmFjeToiQW55Iik7Ci0KLSAgICBmb29fbW9kdWxlX2RhdGE6Rm9vVGVzdFNjaGVtYSAocHJpdmFjeToiQW55Iik7Ci0gICAgYmFyX21vZHVsZV9kYXRhOkJhclRlc3RTY2hlbWEgKHByaXZhY3k6IkFueSIpOwotICAgIGJhel9tb2R1bGVfZGF0YTpCYXpUZXN0U2NoZW1hIChwcml2YWN5OiJBbnkiKTsKLSAgICBxdXhfbW9kdWxlX2RhdGE6UXV4VGVzdFNjaGVtYSAocHJpdmFjeToiQW55Iik7Ci19Ci0KLXJvb3RfdHlwZSBEdW1wc3lzVGVzdERhdGFSb290OwpkaWZmIC0tZ2l0IGEvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvcm9vdC5oIGIvZ2QvZHVtcHN5cy90ZXN0X2RhdGEvcm9vdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU4YzhlLi4wMDAwMDAwCi0tLSBhL2dkL2R1bXBzeXMvdGVzdF9kYXRhL3Jvb3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLQotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0jaW5jbHVkZSAicm9vdF9nZW5lcmF0ZWQuaCIKLQotdXNpbmcgVGFibGVBZGRGdW5jdGlvbiA9IHN0ZDo6ZnVuY3Rpb248dm9pZCh0ZXN0aW5nOjpEdW1wc3lzVGVzdERhdGFSb290QnVpbGRlciogcm9vdF9idWlsZGVyKT47Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotc3RydWN0IER1bXBzeXNUZXN0RGF0YUNsYXNzIHsKLSAgdmlydHVhbCBUYWJsZUFkZEZ1bmN0aW9uIEdldFRhYmxlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJfYnVpbGRlcikgPSAwOwotICB2aXJ0dWFsIH5EdW1wc3lzVGVzdERhdGFDbGFzcygpID0gZGVmYXVsdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9kdW1wc3lzX2RhdGEuZmJzIGIvZ2QvZHVtcHN5c19kYXRhLmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmMTQ2MS4uMDAwMDAwMAotLS0gYS9nZC9kdW1wc3lzX2RhdGEuZmJzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gVG9wIGxldmVsIG1vZHVsZSBkdW1wc3lzIGRhdGEgc2NoZW1hCi1pbmNsdWRlICJidGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmZicyI7Ci1pbmNsdWRlICJjb21tb24vaW5pdF9mbGFncy5mYnMiOwotaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5mYnMiOwotaW5jbHVkZSAiaGNpL2hjaV9hY2xfbWFuYWdlci5mYnMiOwotaW5jbHVkZSAibW9kdWxlX3VuaXR0ZXN0LmZicyI7Ci1pbmNsdWRlICJvcy93YWtlbG9ja19tYW5hZ2VyLmZicyI7Ci1pbmNsdWRlICJzaGltL2R1bXBzeXMuZmJzIjsKLQotbmFtZXNwYWNlIGJsdWV0b290aDsKLQotYXR0cmlidXRlICJwcml2YWN5IjsKLQotdGFibGUgRHVtcHN5c0RhdGEgewotICAgIHRpdGxlOnN0cmluZzsKLSAgICBpbml0X2ZsYWdzOmNvbW1vbi5Jbml0RmxhZ3NEYXRhIChwcml2YWN5OiJBbnkiKTsKLSAgICB3YWtlbG9ja19tYW5hZ2VyX2RhdGE6Ymx1ZXRvb3RoLm9zLldha2Vsb2NrTWFuYWdlckRhdGEgKHByaXZhY3k6IkFueSIpOwotICAgIHNoaW1fZHVtcHN5c19kYXRhOmJsdWV0b290aC5zaGltLkR1bXBzeXNNb2R1bGVEYXRhIChwcml2YWN5OiJBbnkiKTsKLSAgICBsMmNhcF9jbGFzc2ljX2R1bXBzeXNfZGF0YTpibHVldG9vdGgubDJjYXAuY2xhc3NpYy5MMmNhcENsYXNzaWNNb2R1bGVEYXRhIChwcml2YWN5OiJBbnkiKTsKLSAgICBoY2lfYWNsX21hbmFnZXJfZHVtcHN5c19kYXRhOmJsdWV0b290aC5oY2kuQWNsTWFuYWdlckRhdGEgKHByaXZhY3k6IkFueSIpOwotICAgIG1vZHVsZV91bml0dGVzdF9kYXRhOmJsdWV0b290aC5Nb2R1bGVVbml0VGVzdERhdGE7IC8vIHByaXZhdGUKLSAgICBhY3Rpdml0eV9hdHRyaWJ1dGlvbl9kdW1wc3lzX2RhdGE6Ymx1ZXRvb3RoLmFjdGl2aXR5X2F0dHJpYnV0aW9uLkFjdGl2aXR5QXR0cmlidXRpb25EYXRhIChwcml2YWN5OiJBbnkiKTsKLX0KLQotcm9vdF90eXBlIER1bXBzeXNEYXRhOwpkaWZmIC0tZ2l0IGEvZ2QvZmFjYWRlL2NvbW1vbi5wcm90byBiL2dkL2ZhY2FkZS9jb21tb24ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjE1ZWQuLjAwMDAwMDAKLS0tIGEvZ2QvZmFjYWRlL2NvbW1vbi5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGJsdWV0b290aC5mYWNhZGU7Ci0KLW1lc3NhZ2UgRGF0YSB7Ci0gIGJ5dGVzIHBheWxvYWQgPSAxOwotfQotCi1tZXNzYWdlIEJsdWV0b290aEFkZHJlc3MgewotICBieXRlcyBhZGRyZXNzID0gMTsKLX0KLQotZW51bSBCbHVldG9vdGhBZGRyZXNzVHlwZUVudW0gewotICBQVUJMSUNfREVWSUNFX0FERFJFU1MgPSAweDA7Ci0gIFJBTkRPTV9ERVZJQ0VfQUREUkVTUyA9IDB4MTsKLSAgUFVCTElDX0lERU5USVRZX0FERFJFU1MgPSAweDI7Ci0gIFJBTkRPTV9JREVOVElUWV9BRERSRVNTID0gMHgzOwotfQotCi1lbnVtIEJsdWV0b290aE93bkFkZHJlc3NUeXBlRW51bSB7Ci0gIFVTRV9QVUJMSUNfREVWSUNFX0FERFJFU1MgPSAweDA7Ci0gIFVTRV9SQU5ET01fREVWSUNFX0FERFJFU1MgPSAweDE7Ci0gIFJFU09MVkFCTEVfT1JfUFVCTElDX0FERFJFU1MgPSAweDI7Ci0gIFJFU09MVkFCTEVfT1JfUkFORE9NX0FERFJFU1MgPSAweDM7Ci19Ci0KLW1lc3NhZ2UgQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIHsKLSAgQmx1ZXRvb3RoQWRkcmVzcyBhZGRyZXNzID0gMTsKLSAgQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtIHR5cGUgPSAyOwotfQotCi1lbnVtIEJsdWV0b290aFBlZXJBZGRyZXNzVHlwZUVudW0gewotICBQVUJMSUNfREVWSUNFX09SX0lERU5USVRZX0FERFJFU1MgPSAweDA7Ci0gIFJBTkRPTV9ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUyA9IDB4MTsKLX0KZGlmZiAtLWdpdCBhL2dkL2ZhY2FkZS9mYWNhZGVfbWFpbi5jYyBiL2dkL2ZhY2FkZS9mYWNhZGVfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0OTI3OS4uMDAwMDAwMAotLS0gYS9nZC9mYWNhZGUvZmFjYWRlX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y3NpZ25hbD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSAic3RhY2tfbWFuYWdlci5oIgotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0jaW5jbHVkZSA8Y2xpZW50L2xpbnV4L2hhbmRsZXIvZXhjZXB0aW9uX2hhbmRsZXIuaD4KLSNpbmNsdWRlIDxiYWNrdHJhY2UvQmFja3RyYWNlLmg+Ci0jaW5jbHVkZSA8YmFja3RyYWNlL2JhY2t0cmFjZV9jb25zdGFudHMuaD4KLS8vIGNsYW5nLWZvcm1hdCBvbgotCi0jaW5jbHVkZSAiY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJmYWNhZGUvZ3JwY19yb290X3NlcnZlci5oIgotI2luY2x1ZGUgImhhbC9oY2lfaGFsX2hvc3QuaCIKLSNpbmNsdWRlICJoYWwvc25vb3BfbG9nZ2VyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAib3MvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAib3Mvc3lzdGVtX3Byb3BlcnRpZXMuaCIKLQotdXNpbmcgOjpibHVldG9vdGg6Ok1vZHVsZUxpc3Q7Ci11c2luZyA6OmJsdWV0b290aDo6U3RhY2tNYW5hZ2VyOwotdXNpbmcgOjpibHVldG9vdGg6OmhhbDo6SGNpSGFsSG9zdFJvb3RjYW5hbENvbmZpZzsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpvczo6VGhyZWFkOwotCi1leHRlcm4gIkMiIGNvbnN0IGNoYXIqIF9fYXNhbl9kZWZhdWx0X29wdGlvbnMoKSB7Ci0gIHJldHVybiAiZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIjsKLX0KLQotbmFtZXNwYWNlIHsKLTo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkdycGNSb290U2VydmVyIGdycGNfcm9vdF9zZXJ2ZXI7Ci0KLWJvb2wgaW50ZXJydXB0ZWQgPSBmYWxzZTsKLXN0cnVjdCBzaWdhY3Rpb24gb2xkX2FjdCA9IHt9Owotdm9pZCBpbnRlcnJ1cHRfaGFuZGxlcihpbnQgc2lnbmFsX251bWJlcikgewotICBpZiAoIWludGVycnVwdGVkKSB7Ci0gICAgaW50ZXJydXB0ZWQgPSB0cnVlOwotICAgIExPR19JTkZPKCJTdG9wcGluZyBnUlBDIHJvb3Qgc2VydmVyIGR1ZSB0byBzaWduYWw6ICVzWyVkXSIsIHN0cnNpZ25hbChzaWduYWxfbnVtYmVyKSwgc2lnbmFsX251bWJlcik7Ci0gICAgZ3JwY19yb290X3NlcnZlci5TdG9wU2VydmVyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX1dBUk4oIkFscmVhZHkgaW50ZXJydXB0ZWQgYnkgc2lnbmFsOiAlc1slZF0iLCBzdHJzaWduYWwoc2lnbmFsX251bWJlciksIHNpZ25hbF9udW1iZXIpOwotICB9Ci0gIGlmIChvbGRfYWN0LnNhX2hhbmRsZXIgIT0gbnVsbHB0ciAmJiBvbGRfYWN0LnNhX2hhbmRsZXIgIT0gU0lHX0lHTiAmJiBvbGRfYWN0LnNhX2hhbmRsZXIgIT0gU0lHX0RGTCkgewotICAgIExPR19JTkZPKCJDYWxsaW5nIHNhdmVkIHNpZ25hbCBoYW5kbGVyIik7Ci0gICAgb2xkX2FjdC5zYV9oYW5kbGVyKHNpZ25hbF9udW1iZXIpOwotICB9Ci19Ci1zdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3QgPSB7LnNhX2hhbmRsZXIgPSBpbnRlcnJ1cHRfaGFuZGxlcn07Ci0KLWJvb2wgY3Jhc2hfY2FsbGJhY2soY29uc3Qgdm9pZCogY3Jhc2hfY29udGV4dCwgc2l6ZV90IGNyYXNoX2NvbnRleHRfc2l6ZSwgdm9pZCogY29udGV4dCkgewotICBwaWRfdCB0aWQgPSBCQUNLVFJBQ0VfQ1VSUkVOVF9USFJFQUQ7Ci0gIGlmIChjcmFzaF9jb250ZXh0X3NpemUgPj0gc2l6ZW9mKGdvb2dsZV9icmVha3BhZDo6RXhjZXB0aW9uSGFuZGxlcjo6Q3Jhc2hDb250ZXh0KSkgewotICAgIGF1dG8qIGN0eCA9IHN0YXRpY19jYXN0PGNvbnN0IGdvb2dsZV9icmVha3BhZDo6RXhjZXB0aW9uSGFuZGxlcjo6Q3Jhc2hDb250ZXh0Kj4oY3Jhc2hfY29udGV4dCk7Ci0gICAgdGlkID0gY3R4LT50aWQ7Ci0gICAgaW50IHNpZ25hbF9udW1iZXIgPSBjdHgtPnNpZ2luZm8uc2lfc2lnbm87Ci0gICAgTE9HX0VSUk9SKCJQcm9jZXNzIGNyYXNoZWQsIHNpZ25hbDogJXNbJWRdLCB0aWQ6ICVkIiwgc3Ryc2lnbmFsKHNpZ25hbF9udW1iZXIpLCBzaWduYWxfbnVtYmVyLCBjdHgtPnRpZCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCJQcm9jZXNzIGNyYXNoZWQsIHNpZ25hbDogdW5rbm93biwgdGlkOiB1bmtub3duIik7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfcHRyPEJhY2t0cmFjZT4gYmFja3RyYWNlKEJhY2t0cmFjZTo6Q3JlYXRlKEJBQ0tUUkFDRV9DVVJSRU5UX1BST0NFU1MsIHRpZCkpOwotICBpZiAoYmFja3RyYWNlID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgYmFja3RyYWNlIG9iamVjdCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWJhY2t0cmFjZS0+VW53aW5kKDApKSB7Ci0gICAgTE9HX0VSUk9SKCJiYWNrdHJhY2UtPlVud2luZCBmYWlsZWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTE9HX0VSUk9SKCJCYWNrdHJhY2U6Iik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmFja3RyYWNlLT5OdW1GcmFtZXMoKTsgaSsrKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyIsIGJhY2t0cmFjZS0+Rm9ybWF0RnJhbWVEYXRhKGkpLmNfc3RyKCkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gVGhlIGVudHJ5IHBvaW50IGZvciB0aGUgYmluYXJ5IHdpdGggbGliYmx1ZXRvb3RoICsgZmFjYWRlcwotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KSB7Ci0gIGdvb2dsZV9icmVha3BhZDo6TWluaWR1bXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IoZ29vZ2xlX2JyZWFrcGFkOjpNaW5pZHVtcERlc2NyaXB0b3I6OmtNaWNyb2R1bXBPbkNvbnNvbGUpOwotICBnb29nbGVfYnJlYWtwYWQ6OkV4Y2VwdGlvbkhhbmRsZXIgZWgoZGVzY3JpcHRvciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgdHJ1ZSwgLTEpOwotICBlaC5zZXRfY3Jhc2hfaGFuZGxlcihjcmFzaF9jYWxsYmFjayk7Ci0KLSAgaW50IHJvb3Rfc2VydmVyX3BvcnQgPSA4ODk3OwotICBpbnQgZ3JwY19wb3J0ID0gODg5OTsKLQotICBibHVldG9vdGg6OmNvbW1vbjo6SW5pdEZsYWdzOjpTZXRBbGxGb3JUZXN0aW5nKCk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX2dycGNfcm9vdF9zZXJ2ZXJfcG9ydCA9ICItLXJvb3Qtc2VydmVyLXBvcnQ9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX2dycGNfc2VydmVyX3BvcnQgPSAiLS1ncnBjLXBvcnQ9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX3Jvb3RjYW5hbF9wb3J0ID0gIi0tcm9vdGNhbmFsLXBvcnQ9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX2J0c25vb3BfcGF0aCA9ICItLWJ0c25vb3A9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX2J0c25vb3pfcGF0aCA9ICItLWJ0c25vb3o9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX2J0Y29uZmlnX3BhdGggPSAiLS1idGNvbmZpZz0iOwotICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgIHN0ZDo6c3RyaW5nIGFyZyA9IGFyZ3ZbaV07Ci0gICAgaWYgKGFyZy5maW5kKGFyZ19ncnBjX3Jvb3Rfc2VydmVyX3BvcnQpID09IDApIHsKLSAgICAgIGF1dG8gcG9ydF9udW1iZXIgPSBhcmcuc3Vic3RyKGFyZ19ncnBjX3Jvb3Rfc2VydmVyX3BvcnQuc2l6ZSgpKTsKLSAgICAgIHJvb3Rfc2VydmVyX3BvcnQgPSBzdGQ6OnN0b2kocG9ydF9udW1iZXIpOwotICAgIH0KLSAgICBpZiAoYXJnLmZpbmQoYXJnX2dycGNfc2VydmVyX3BvcnQpID09IDApIHsKLSAgICAgIGF1dG8gcG9ydF9udW1iZXIgPSBhcmcuc3Vic3RyKGFyZ19ncnBjX3NlcnZlcl9wb3J0LnNpemUoKSk7Ci0gICAgICBncnBjX3BvcnQgPSBzdGQ6OnN0b2kocG9ydF9udW1iZXIpOwotICAgIH0KLSAgICBpZiAoYXJnLmZpbmQoYXJnX3Jvb3RjYW5hbF9wb3J0KSA9PSAwKSB7Ci0gICAgICBhdXRvIHBvcnRfbnVtYmVyID0gYXJnLnN1YnN0cihhcmdfcm9vdGNhbmFsX3BvcnQuc2l6ZSgpKTsKLSAgICAgIEhjaUhhbEhvc3RSb290Y2FuYWxDb25maWc6OkdldCgpLT5TZXRQb3J0KHN0ZDo6c3RvaShwb3J0X251bWJlcikpOwotICAgIH0KLSAgICBpZiAoYXJnLmZpbmQoYXJnX2J0c25vb3BfcGF0aCkgPT0gMCkgewotICAgICAgYXV0byBidHNub29wX3BhdGggPSBhcmcuc3Vic3RyKGFyZ19idHNub29wX3BhdGguc2l6ZSgpKTsKLSAgICAgIDo6Ymx1ZXRvb3RoOjpvczo6UGFyYW1ldGVyUHJvdmlkZXI6Ok92ZXJyaWRlU25vb3BMb2dGaWxlUGF0aChidHNub29wX3BhdGgpOwotICAgICAgQ0hFQ0soOjpibHVldG9vdGg6Om9zOjpTZXRTeXN0ZW1Qcm9wZXJ0eSgKLSAgICAgICAgICA6OmJsdWV0b290aDo6aGFsOjpTbm9vcExvZ2dlcjo6a0J0U25vb3BMb2dNb2RlUHJvcGVydHksIDo6Ymx1ZXRvb3RoOjpoYWw6OlNub29wTG9nZ2VyOjprQnRTbm9vcExvZ01vZGVGdWxsKSk7Ci0gICAgfQotICAgIGlmIChhcmcuZmluZChhcmdfYnRzbm9vel9wYXRoKSA9PSAwKSB7Ci0gICAgICBhdXRvIGJ0c25vb3pfcGF0aCA9IGFyZy5zdWJzdHIoYXJnX2J0c25vb3pfcGF0aC5zaXplKCkpOwotICAgICAgOjpibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6T3ZlcnJpZGVTbm9vekxvZ0ZpbGVQYXRoKGJ0c25vb3pfcGF0aCk7Ci0gICAgfQotICAgIGlmIChhcmcuZmluZChhcmdfYnRjb25maWdfcGF0aCkgPT0gMCkgewotICAgICAgYXV0byBidGNvbmZpZ19wYXRoID0gYXJnLnN1YnN0cihhcmdfYnRjb25maWdfcGF0aC5zaXplKCkpOwotICAgICAgOjpibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6T3ZlcnJpZGVDb25maWdGaWxlUGF0aChidGNvbmZpZ19wYXRoKTsKLSAgICB9Ci0gIH0KLQotICBpbnQgcmV0ID0gc2lnYWN0aW9uKFNJR0lOVCwgJm5ld19hY3QsICZvbGRfYWN0KTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0dfRVJST1IoInNpZ2FjdGlvbiBlcnJvcjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci0KLSAgZ3JwY19yb290X3NlcnZlci5TdGFydFNlcnZlcigiMC4wLjAuMCIsIHJvb3Rfc2VydmVyX3BvcnQsIGdycGNfcG9ydCk7Ci0gIGF1dG8gd2FpdF90aHJlYWQgPSBzdGQ6OnRocmVhZChbXSB7IGdycGNfcm9vdF9zZXJ2ZXIuUnVuR3JwY0xvb3AoKTsgfSk7Ci0gIHdhaXRfdGhyZWFkLmpvaW4oKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dkL2ZhY2FkZS9ncnBjX3Jvb3Rfc2VydmVyLmNjIGIvZ2QvZmFjYWRlL2dycGNfcm9vdF9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTk4ZTQuLjAwMDAwMDAKLS0tIGEvZ2QvZmFjYWRlL2dycGNfcm9vdF9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZhY2FkZS9ncnBjX3Jvb3Rfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJmYWNhZGUvcmVhZF9vbmx5X3Byb3BlcnR5X3NlcnZlci5oIgotI2luY2x1ZGUgImZhY2FkZS9yb290c2VydmljZS5ncnBjLnBiLmgiCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotI2luY2x1ZGUgImhhbC9mYWNhZGUuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2FjbF9tYW5hZ2VyX2ZhY2FkZS5oIgotI2luY2x1ZGUgImhjaS9mYWNhZGUvY29udHJvbGxlcl9mYWNhZGUuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2ZhY2FkZS5oIgotI2luY2x1ZGUgImhjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLmgiCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5oIgotI2luY2x1ZGUgImhjaS9mYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLmgiCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgImhjaS9sZV9zY2FubmluZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaXNvL2ZhY2FkZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZmFjYWRlLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZmFjYWRlLmgiCi0jaW5jbHVkZSAibmVpZ2hib3IvY29ubmVjdGFiaWxpdHkuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9kaXNjb3ZlcmFiaWxpdHkuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9mYWNhZGUvZmFjYWRlLmgiCi0jaW5jbHVkZSAibmVpZ2hib3IvaW5xdWlyeS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL25hbWUuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9wYWdlLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvZmFjYWRlLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc2VjdXJpdHlfbW9kdWxlLmgiCi0jaW5jbHVkZSAic2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAic2hpbS9mYWNhZGUvZmFjYWRlLmgiCi0jaW5jbHVkZSAic3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgInN0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotdXNpbmcgOjpibHVldG9vdGg6OmdycGM6OkdycGNNb2R1bGU7Ci11c2luZyA6OmJsdWV0b290aDo6b3M6OlRocmVhZDsKLQotbmFtZXNwYWNlIHsKLWNsYXNzIFJvb3RGYWNhZGVTZXJ2aWNlIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OlJvb3RGYWNhZGU6OlNlcnZpY2UgewotIHB1YmxpYzoKLSAgUm9vdEZhY2FkZVNlcnZpY2UoaW50IGdycGNfcG9ydCkgOiBncnBjX3BvcnRfKGdycGNfcG9ydCkge30KLQotICA6OmdycGM6OlN0YXR1cyBTdGFydFN0YWNrKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OmZhY2FkZTo6U3RhcnRTdGFja1JlcXVlc3QqIHJlcXVlc3QsCi0gICAgICA6OmJsdWV0b290aDo6ZmFjYWRlOjpTdGFydFN0YWNrUmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaWYgKGlzX3J1bm5pbmdfKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAic3RhY2sgaXMgcnVubmluZyIpOwotICAgIH0KLQotICAgIE1vZHVsZUxpc3QgbW9kdWxlczsKLSAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6Z3JwYzo6R3JwY01vZHVsZT4oKTsKLQotICAgIEJsdWV0b290aE1vZHVsZSBtb2R1bGVfdW5kZXJfdGVzdCA9IHJlcXVlc3QtPm1vZHVsZV91bmRlcl90ZXN0KCk7Ci0gICAgc3dpdGNoIChtb2R1bGVfdW5kZXJfdGVzdCkgewotICAgICAgY2FzZSBCbHVldG9vdGhNb2R1bGU6OkhBTDoKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhhbDo6SGNpSGFsRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQmx1ZXRvb3RoTW9kdWxlOjpIQ0k6Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OlJlYWRPbmx5UHJvcGVydHlTZXJ2ZXJNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpoY2k6OmZhY2FkZTo6SGNpRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQmx1ZXRvb3RoTW9kdWxlOjpIQ0lfSU5URVJGQUNFUzoKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmZhY2FkZTo6UmVhZE9ubHlQcm9wZXJ0eVNlcnZlck1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpIY2lGYWNhZGVNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpoY2k6OmZhY2FkZTo6QWNsTWFuYWdlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpDb250cm9sbGVyRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6aGNpOjpmYWNhZGU6OkxlQWNsTWFuYWdlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpMZUluaXRpYXRvckFkZHJlc3NGYWNhZGVNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpoY2k6OmZhY2FkZTo6TGVTY2FubmluZ01hbmFnZXJGYWNhZGVNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpuZWlnaGJvcjo6ZmFjYWRlOjpOZWlnaGJvckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6Omlzbzo6SXNvTW9kdWxlRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQmx1ZXRvb3RoTW9kdWxlOjpMMkNBUDoKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpDb250cm9sbGVyRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6aGNpOjpmYWNhZGU6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6aGNpOjpmYWNhZGU6OkxlSW5pdGlhdG9yQWRkcmVzc0ZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6Om5laWdoYm9yOjpmYWNhZGU6Ok5laWdoYm9yRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6ZmFjYWRlOjpSZWFkT25seVByb3BlcnR5U2VydmVyTW9kdWxlPigpOwotICAgICAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OkwyY2FwQ2xhc3NpY01vZHVsZUZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZUZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpIY2lGYWNhZGVNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjppc286Oklzb01vZHVsZUZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJsdWV0b290aE1vZHVsZTo6U0VDVVJJVFk6Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OlJlYWRPbmx5UHJvcGVydHlTZXJ2ZXJNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpoY2k6OmZhY2FkZTo6Q29udHJvbGxlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OnNlY3VyaXR5OjpTZWN1cml0eU1vZHVsZUZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6Om5laWdoYm9yOjpmYWNhZGU6Ok5laWdoYm9yRmFjYWRlTW9kdWxlPigpOwotICAgICAgICBtb2R1bGVzLmFkZDw6OmJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OkwyY2FwQ2xhc3NpY01vZHVsZUZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpIY2lGYWNhZGVNb2R1bGU+KCk7Ci0gICAgICAgIG1vZHVsZXMuYWRkPDo6Ymx1ZXRvb3RoOjpoY2k6OmZhY2FkZTo6Q29udHJvbGxlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OmhjaTo6ZmFjYWRlOjpMZVNjYW5uaW5nTWFuYWdlckZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJsdWV0b290aE1vZHVsZTo6U0hJTToKLSAgICAgICAgbW9kdWxlcy5hZGQ8OjpibHVldG9vdGg6OnNoaW06OmZhY2FkZTo6U2hpbUZhY2FkZU1vZHVsZT4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiaW52YWxpZCBtb2R1bGUgdW5kZXIgdGVzdCIpOwotICAgIH0KLQotICAgIHN0YWNrX3RocmVhZF8gPSBuZXcgVGhyZWFkKCJzdGFja190aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIHN0YWNrX21hbmFnZXJfLlN0YXJ0VXAoJm1vZHVsZXMsIHN0YWNrX3RocmVhZF8pOwotCi0gICAgR3JwY01vZHVsZSogZ3JwY19tb2R1bGUgPSBzdGFja19tYW5hZ2VyXy5HZXRJbnN0YW5jZTxHcnBjTW9kdWxlPigpOwotICAgIGdycGNfbW9kdWxlLT5TdGFydFNlcnZlcigiMC4wLjAuMCIsIGdycGNfcG9ydF8pOwotCi0gICAgZ3JwY19sb29wX3RocmVhZF8gPSBuZXcgc3RkOjp0aHJlYWQoW2dycGNfbW9kdWxlXSB7IGdycGNfbW9kdWxlLT5SdW5HcnBjTG9vcCgpOyB9KTsKLSAgICBpc19ydW5uaW5nXyA9IHRydWU7Ci0KLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU3RvcFN0YWNrKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OmZhY2FkZTo6U3RvcFN0YWNrUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgIDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OlN0b3BTdGFja1Jlc3BvbnNlKiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGlmICghaXNfcnVubmluZ18pIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJzdGFjayBpcyBub3QgcnVubmluZyIpOwotICAgIH0KLQotICAgIHN0YWNrX21hbmFnZXJfLkdldEluc3RhbmNlPEdycGNNb2R1bGU+KCktPlN0b3BTZXJ2ZXIoKTsKLSAgICBncnBjX2xvb3BfdGhyZWFkXy0+am9pbigpOwotICAgIGRlbGV0ZSBncnBjX2xvb3BfdGhyZWFkXzsKLQotICAgIHN0YWNrX21hbmFnZXJfLlNodXREb3duKCk7Ci0gICAgZGVsZXRlIHN0YWNrX3RocmVhZF87Ci0gICAgaXNfcnVubmluZ18gPSBmYWxzZTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSBwcml2YXRlOgotICBUaHJlYWQqIHN0YWNrX3RocmVhZF8gPSBudWxscHRyOwotICBib29sIGlzX3J1bm5pbmdfID0gZmFsc2U7Ci0gIHN0ZDo6dGhyZWFkKiBncnBjX2xvb3BfdGhyZWFkXyA9IG51bGxwdHI7Ci0gIFN0YWNrTWFuYWdlciBzdGFja19tYW5hZ2VyXzsKLSAgaW50IGdycGNfcG9ydF8gPSA4ODk4OwotfTsKLQotUm9vdEZhY2FkZVNlcnZpY2UqIHJvb3RfZmFjYWRlX3NlcnZpY2U7Ci19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBHcnBjUm9vdFNlcnZlcjo6U3RhcnRTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsIGludCBncnBjX3Jvb3Rfc2VydmVyX3BvcnQsIGludCBncnBjX3BvcnQpIHsKLSAgQVNTRVJUKCFzdGFydGVkXyk7Ci0gIHN0YXJ0ZWRfID0gdHJ1ZTsKLQotICBzdGQ6OnN0cmluZyBsaXN0ZW5pbmdfcG9ydCA9IGFkZHJlc3MgKyAiOiIgKyBzdGQ6OnRvX3N0cmluZyhncnBjX3Jvb3Rfc2VydmVyX3BvcnQpOwotICA6OmdycGM6OlNlcnZlckJ1aWxkZXIgYnVpbGRlcjsKLSAgcm9vdF9mYWNhZGVfc2VydmljZSA9IG5ldyBSb290RmFjYWRlU2VydmljZShncnBjX3BvcnQpOwotICBidWlsZGVyLlJlZ2lzdGVyU2VydmljZShyb290X2ZhY2FkZV9zZXJ2aWNlKTsKLSAgYnVpbGRlci5BZGRMaXN0ZW5pbmdQb3J0KGxpc3RlbmluZ19wb3J0LCA6OmdycGM6Okluc2VjdXJlU2VydmVyQ3JlZGVudGlhbHMoKSk7Ci0gIHNlcnZlcl8gPSBidWlsZGVyLkJ1aWxkQW5kU3RhcnQoKTsKLQotICBBU1NFUlQoc2VydmVyXyAhPSBudWxscHRyKTsKLX0KLQotdm9pZCBHcnBjUm9vdFNlcnZlcjo6U3RvcFNlcnZlcigpIHsKLSAgQVNTRVJUKHN0YXJ0ZWRfKTsKLSAgc2VydmVyXy0+U2h1dGRvd24oKTsKLSAgc3RhcnRlZF8gPSBmYWxzZTsKLSAgc2VydmVyXy5yZXNldCgpOwotICBkZWxldGUgcm9vdF9mYWNhZGVfc2VydmljZTsKLX0KLQotdm9pZCBHcnBjUm9vdFNlcnZlcjo6UnVuR3JwY0xvb3AoKSB7Ci0gIEFTU0VSVChzdGFydGVkXyk7Ci0gIHNlcnZlcl8tPldhaXQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvZmFjYWRlL2dycGNfcm9vdF9zZXJ2ZXIuaCBiL2dkL2ZhY2FkZS9ncnBjX3Jvb3Rfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmFmMjYuLjAwMDAwMDAKLS0tIGEvZ2QvZmFjYWRlL2dycGNfcm9vdF9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgR3JwY1Jvb3RTZXJ2ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBTdGFydFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IGdycGNfcm9vdF9zZXJ2ZXJfcG9ydCwgaW50IGdycGNfcG9ydCk7Ci0KLSAgdm9pZCBTdG9wU2VydmVyKCk7Ci0KLSAgdm9pZCBSdW5HcnBjTG9vcCgpOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBzdGFydGVkXyA9IGZhbHNlOwotICBzdGQ6OnVuaXF1ZV9wdHI8OjpncnBjOjpTZXJ2ZXI+IHNlcnZlcl8gPSBudWxscHRyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvZmFjYWRlL3JlYWRfb25seV9wcm9wZXJ0eV9zZXJ2ZXIuY2MgYi9nZC9mYWNhZGUvcmVhZF9vbmx5X3Byb3BlcnR5X3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyZTVlNy4uMDAwMDAwMAotLS0gYS9nZC9mYWNhZGUvcmVhZF9vbmx5X3Byb3BlcnR5X3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmYWNhZGUvcmVhZF9vbmx5X3Byb3BlcnR5X3NlcnZlci5oIgotCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgUmVhZE9ubHlQcm9wZXJ0eVNlcnZpY2UgOiBwdWJsaWMgUmVhZE9ubHlQcm9wZXJ0eTo6U2VydmljZSB7Ci0gcHVibGljOgotICBSZWFkT25seVByb3BlcnR5U2VydmljZShoY2k6OkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIpIDogY29udHJvbGxlcl8oY29udHJvbGxlcikge30KLSAgOjpncnBjOjpTdGF0dXMgUmVhZExvY2FsQWRkcmVzcygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmJsdWV0b290aDo6ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzKiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGF1dG8gYWRkcmVzcyA9IGNvbnRyb2xsZXJfLT5HZXRNYWNBZGRyZXNzKCkuVG9TdHJpbmcoKTsKLSAgICByZXNwb25zZS0+c2V0X2FkZHJlc3MoYWRkcmVzcyk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgaGNpOjpDb250cm9sbGVyKiBjb250cm9sbGVyXzsKLX07Ci0KLXZvaWQgUmVhZE9ubHlQcm9wZXJ0eVNlcnZlck1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIEdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxoY2k6OkNvbnRyb2xsZXI+KCk7Ci19Ci12b2lkIFJlYWRPbmx5UHJvcGVydHlTZXJ2ZXJNb2R1bGU6OlN0YXJ0KCkgewotICBHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8UmVhZE9ubHlQcm9wZXJ0eVNlcnZpY2U+KEdldERlcGVuZGVuY3k8aGNpOjpDb250cm9sbGVyPigpKTsKLX0KLXZvaWQgUmVhZE9ubHlQcm9wZXJ0eVNlcnZlck1vZHVsZTo6U3RvcCgpIHsKLSAgc2VydmljZV8ucmVzZXQoKTsKLSAgR3JwY0ZhY2FkZU1vZHVsZTo6U3RvcCgpOwotfQotOjpncnBjOjpTZXJ2aWNlKiBSZWFkT25seVByb3BlcnR5U2VydmVyTW9kdWxlOjpHZXRTZXJ2aWNlKCkgY29uc3QgewotICByZXR1cm4gc2VydmljZV8uZ2V0KCk7Ci19Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgUmVhZE9ubHlQcm9wZXJ0eVNlcnZlck1vZHVsZTo6RmFjdG9yeSA9Ci0gICAgOjpibHVldG9vdGg6Ok1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgUmVhZE9ubHlQcm9wZXJ0eVNlcnZlck1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvZmFjYWRlL3JlYWRfb25seV9wcm9wZXJ0eV9zZXJ2ZXIuaCBiL2dkL2ZhY2FkZS9yZWFkX29ubHlfcHJvcGVydHlfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmFlYzEuLjAwMDAwMDAKLS0tIGEvZ2QvZmFjYWRlL3JlYWRfb25seV9wcm9wZXJ0eV9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiZmFjYWRlL3Jvb3RzZXJ2aWNlLmdycGMucGIuaCIKLSNpbmNsdWRlICJncnBjL2dycGNfbW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLWNsYXNzIFJlYWRPbmx5UHJvcGVydHlTZXJ2aWNlOwotCi1jbGFzcyBSZWFkT25seVByb3BlcnR5U2VydmVyTW9kdWxlIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotICA6OmdycGM6OlNlcnZpY2UqIEdldFNlcnZpY2UoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxSZWFkT25seVByb3BlcnR5U2VydmljZT4gc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZmFjYWRlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9mYWNhZGUvcm9vdHNlcnZpY2UucHJvdG8gYi9nZC9mYWNhZGUvcm9vdHNlcnZpY2UucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmVmY2IuLjAwMDAwMDAKLS0tIGEvZ2QvZmFjYWRlL3Jvb3RzZXJ2aWNlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotc3ludGF4ID0gInByb3RvMyI7Ci0KLXBhY2thZ2UgYmx1ZXRvb3RoLmZhY2FkZTsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotaW1wb3J0ICJmYWNhZGUvY29tbW9uLnByb3RvIjsKLQotc2VydmljZSBSb290RmFjYWRlIHsKLSAgcnBjIFN0YXJ0U3RhY2soU3RhcnRTdGFja1JlcXVlc3QpIHJldHVybnMgKFN0YXJ0U3RhY2tSZXNwb25zZSkge30KLSAgcnBjIFN0b3BTdGFjayhTdG9wU3RhY2tSZXF1ZXN0KSByZXR1cm5zIChTdG9wU3RhY2tSZXNwb25zZSkge30KLX0KLQotZW51bSBCbHVldG9vdGhNb2R1bGUgewotICBIQUwgPSAwOwotICBIQ0kgPSAxOwotICBIQ0lfSU5URVJGQUNFUyA9IDI7Ci0gIEwyQ0FQID0gMzsKLSAgU0VDVVJJVFkgPSA0OwotICBTSElNID0gNTsKLX0KLQotbWVzc2FnZSBTdGFydFN0YWNrUmVxdWVzdCB7Ci0gIEJsdWV0b290aE1vZHVsZSBtb2R1bGVfdW5kZXJfdGVzdCA9IDE7Ci19Ci0KLW1lc3NhZ2UgU3RhcnRTdGFja1Jlc3BvbnNlIHt9Ci0KLW1lc3NhZ2UgU3RvcFN0YWNrUmVxdWVzdCB7fQotCi1tZXNzYWdlIFN0b3BTdGFja1Jlc3BvbnNlIHt9Ci0KLXNlcnZpY2UgUmVhZE9ubHlQcm9wZXJ0eSB7Ci0gIHJwYyBSZWFkTG9jYWxBZGRyZXNzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoZmFjYWRlLkJsdWV0b290aEFkZHJlc3MpIHt9Ci19CmRpZmYgLS1naXQgYS9nZC9mdXp6L0FuZHJvaWQuYnAgYi9nZC9mdXp6L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTU2ZDEuLjAwMDAwMDAKLS0tIGEvZ2QvZnV6ei9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRnV6ekhlbHBlclNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImhlbHBlcnMuY2MiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9nZC9mdXp6L2hlbHBlcnMuY2MgYi9nZC9mdXp6L2hlbHBlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTUzMDUuLjAwMDAwMDAKLS0tIGEvZ2QvZnV6ei9oZWxwZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZ1enovaGVscGVycy5oIgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZnV6eiB7Ci0KLS8vIGNyaWJiZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Z1enppbmcvYmxvYi9tYXN0ZXIvZG9jcy9zcGxpdC1pbnB1dHMubWQjbWFnaWMtc2VwYXJhdG9yCi1zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gU3BsaXRJbnB1dCgKLSAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgdWludDhfdCogc2VwYXJhdG9yLCBzaXplX3Qgc2VwYXJhdG9yU2l6ZSkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcmVzdWx0OwotICBhc3NlcnQoc2VwYXJhdG9yU2l6ZSA+IDApOwotICBhdXRvIGJlZyA9IGRhdGE7Ci0gIGF1dG8gZW5kID0gZGF0YSArIHNpemU7Ci0gIHdoaWxlIChjb25zdCB1aW50OF90KiBwb3MgPSAoY29uc3QgdWludDhfdCopbWVtbWVtKGJlZywgZW5kIC0gYmVnLCBzZXBhcmF0b3IsIHNlcGFyYXRvclNpemUpKSB7Ci0gICAgcmVzdWx0LnB1c2hfYmFjayh7YmVnLCBwb3N9KTsKLSAgICBiZWcgPSBwb3MgKyBzZXBhcmF0b3JTaXplOwotICB9Ci0gIGlmIChiZWcgPCBlbmQpIHsKLSAgICByZXN1bHQucHVzaF9iYWNrKHtiZWcsIGVuZH0pOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEdldEFyYml0cmFyeUJ5dGVzKEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHJldHVybiBmZHAtPkNvbnN1bWVCeXRlczx1aW50OF90PihmZHAtPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZnV6egotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvZnV6ei9oZWxwZXJzLmggYi9nZC9mdXp6L2hlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljYmQxOC4uMDAwMDAwMAotLS0gYS9nZC9mdXp6L2hlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGZ1enogewotCi1zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gU3BsaXRJbnB1dCgKLSAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgdWludDhfdCogc2VwYXJhdG9yLCBzaXplX3Qgc2VwYXJhdG9yU2l6ZSk7Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEdldEFyYml0cmFyeUJ5dGVzKEZ1enplZERhdGFQcm92aWRlciogZmRwKTsKLQotI2RlZmluZSBDT05TVFJVQ1RfVkFMSURfVU5JUVVFX09USEVSV0lTRV9CQUlMKFQsIG5hbWUsIGRhdGEpIFwKLSAgYXV0byBuYW1lID0gc3RkOjptYWtlX3VuaXF1ZTxUPihUOjpGcm9tQnl0ZXMoZGF0YSkpOyAgICAgICBcCi0gIGlmICghbmFtZS0+SXNWYWxpZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFZpZXc+Ci12b2lkIEludm9rZUlmVmFsaWQoY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoVFZpZXcpPiBjYWxsYmFjaywgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBhdXRvIHBhY2tldCA9IFRWaWV3OjpGcm9tQnl0ZXMoZGF0YSk7Ci0gIGlmICghcGFja2V0LklzVmFsaWQoKSkgewotICAgIHJldHVybjsKLSAgfQotICBjYWxsYmFjay5JbnZva2VJZk5vdEVtcHR5KHBhY2tldCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUVmlldz4KLXZvaWQgSW52b2tlSWZWYWxpZChjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKFRWaWV3KT4gY2FsbGJhY2ssIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgYXV0byBwYWNrZXQgPSBUVmlldzo6RnJvbUJ5dGVzKGRhdGEpOwotICBpZiAoIXBhY2tldC5Jc1ZhbGlkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgY2FsbGJhY2suSW52b2tlSWZOb3RFbXB0eShwYWNrZXQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZnV6egotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvZnV6ei9ydW4gYi9nZC9mdXp6L3J1bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRkNjQ1Yy4uMDAwMDAwMAotLS0gYS9nZC9mdXp6L3J1bgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMhIC9iaW4vYmFzaAotCi1pZiBbWyAteiAiJHtBTkRST0lEX0JVSUxEX1RPUH0iIF1dOyB0aGVuCi0gIGVjaG8gIkFORFJPSURfQlVJTERfVE9QIGlzIG5vdCBzZXQiCi1maQotCi1pZiBbWyAteiAiJHtBTkRST0lEX0hPU1RfT1VUfSIgXV07IHRoZW4KLSAgZWNobyAiQU5EUk9JRF9IT1NUX09VVCBpcyBub3Qgc2V0IGZvciBob3N0IHJ1biIKLWZpCi0KLUhPU1Q9ZmFsc2UKLVBPU0lUSU9OQUw9KCkKLXdoaWxlIFtbICQjIC1ndCAwIF1dCi1kbwota2V5PSIkMSIKLWNhc2UgJGtleSBpbgotICAgIC0taG9zdCkKLSAgICBIT1NUPXRydWUKLSAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKLSAgICA7OwotICAgICopICAgICMgdW5rbm93biBvcHRpb24KLSAgICBQT1NJVElPTkFMKz0oIiQxIikgIyBzYXZlIGl0IGluIGFuIGFycmF5IGZvciBsYXRlcgotICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAotICAgIDs7Ci1lc2FjCi1kb25lCi1zZXQgLS0gIiR7UE9TSVRJT05BTFtAXX0iICMgcmVzdG9yZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKLQotVEVTVF9OQU1FPWJsdWV0b290aF9nZF8kezF9X2Z1enpfdGVzdAotCi1pZiBbICIkSE9TVCIgPT0gdHJ1ZSBdIDsgdGhlbgotICBIT1NUX0FSQ0g9JCgkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSBIT1NUX0FSQ0gpCi0gIFNBTklUSVpFX0hPU1Q9YWRkcmVzcyAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWJ1aWxkLW1vZGUgLS0iYWxsLW1vZHVsZXMiIC0tZGlyPSIkKHB3ZCkiICRURVNUX05BTUUgJiYgJHtBTkRST0lEX0hPU1RfT1VUfS9mdXp6LyRIT1NUX0FSQ0gvJFRFU1RfTkFNRS8kVEVTVF9OQU1FICQyCi1maQpkaWZmIC0tZ2l0IGEvZ2QvZnV6el90ZXN0LmNjIGIvZ2QvZnV6el90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjM1OGI1Li4wMDAwMDAwCi0tLSBhL2dkL2Z1enpfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotZXh0ZXJuIHZvaWQgUnVuTDJjYXBDbGFzc2ljRHluYW1pY0NoYW5uZWxBbGxvY2F0b3JGdXp6VGVzdChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gdm9pZCBSdW5MMmNhcFBhY2tldEZ1enpUZXN0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkIFJ1bkhjaVBhY2tldEZ1enpUZXN0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBSdW5MMmNhcENsYXNzaWNEeW5hbWljQ2hhbm5lbEFsbG9jYXRvckZ1enpUZXN0KGRhdGEsIHNpemUpOwotICBSdW5MMmNhcFBhY2tldEZ1enpUZXN0KGRhdGEsIHNpemUpOwotICBSdW5IY2lQYWNrZXRGdXp6VGVzdChkYXRhLCBzaXplKTsKLSAgcmV0dXJuIDA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvZ3JwYy9ncnBjX2V2ZW50X3F1ZXVlLmggYi9nZC9ncnBjL2dycGNfZXZlbnRfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5YzNkMC4uMDAwMDAwMAotLS0gYS9nZC9ncnBjL2dycGNfZXZlbnRfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29tbW9uL2Jsb2NraW5nX3F1ZXVlLmgiCi0jaW5jbHVkZSAiZmFjYWRlL2NvbW1vbi5wYi5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBncnBjIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBHcnBjRXZlbnRRdWV1ZSB7Ci0gcHVibGljOgotICAvKioKLSAgICogQ3JlYXRlIGEgR3JwY0V2ZW50UXVldWUgdGhhdCBjYW4gYmUgdXNlZCB0byBzaHVmZmxlIGV2ZW50IGZyb20gb25lIHRocmVhZCB0byBhbm90aGVyCi0gICAqIEBwYXJhbSBsb2dfbmFtZQotICAgKi8KLSAgZXhwbGljaXQgR3JwY0V2ZW50UXVldWUoc3RkOjpzdHJpbmcgbG9nX25hbWUpIDogbG9nX25hbWVfKHN0ZDo6bW92ZShsb2dfbmFtZSkpe307Ci0KLSAgLyoqCi0gICAqIFJ1biB0aGUgZXZlbnQgbG9vcCBhbmQgYmxvY2tzIHVudGlsIGNsaWVudCBjYW5jZWxzIHRoZSBzdHJlYW0gcmVxdWVzdAotICAgKiBFdmVudCBxdWV1ZSB3aWxsIGJlIGNsZWFyZWQgYmVmb3JlIGVudGVyaW5nIHRoZSBsb29wLiBIZW5jZSwgb25seSBldmVudHMgb2NjdXJyZWQgYWZ0ZXIgZ1JQQyByZXF1ZXN0IHdpbGwgYmUKLSAgICogZGVsaXZlcmVkIHRvIHRoZSB1c2VyLiBIZW5jZSB1c2VyIGlzIGFkdmlzZWQgdG8gcnVuIHRoZSBsb29wIGJlZm9yZSBnZW5lcmF0aW5nIHBlbmRpbmcgZXZlbnRzLgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dCBjbGllbnQgY29udGV4dAotICAgKiBAcGFyYW0gd3JpdGVyIG91dHB1dCB3cml0ZXIKLSAgICogQHJldHVybiBnUlBDIHN0YXR1cwotICAgKi8KLSAgOjpncnBjOjpTdGF0dXMgUnVuTG9vcCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIDo6Z3JwYzo6U2VydmVyV3JpdGVyPFQ+KiB3cml0ZXIpIHsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Ci0gICAgTE9HX0lORk8oIiVzOiBFbnRlcmluZyBMb29wIiwgbG9nX25hbWVfLmNfc3RyKCkpOwotICAgIHdoaWxlICghY29udGV4dC0+SXNDYW5jZWxsZWQoKSkgewotICAgICAgLy8gV2FpdCBmb3IgNTAwIG1zIHNvIHRoYXQgY2FuY2VsbGF0aW9uIGNhbiBiZSBjYXVnaHQgaW4gYW1vcnRpemVkIDI1MCBtcyBsYXRlbmN5Ci0gICAgICBpZiAocGVuZGluZ19ldmVudHNfLndhaXRfdG9fdGFrZSg1MDBtcykpIHsKLSAgICAgICAgTE9HX0lORk8oIiVzOiBHb3QgZXZlbnQgZnJvbSBxdWV1ZSIsIGxvZ19uYW1lXy5jX3N0cigpKTsKLSAgICAgICAgd3JpdGVyLT5Xcml0ZShwZW5kaW5nX2V2ZW50c18udGFrZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcnVubmluZ18gPSBmYWxzZTsKLSAgICBMT0dfSU5GTygiJXM6IEV4aXRlZCBMb29wIiwgbG9nX25hbWVfLmNfc3RyKCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gaW5jb21pbmcgZXZlbnQKLSAgICogQHBhcmFtIGV2ZW50IGluY29taW5nIGV2ZW50Ci0gICAqLwotICB2b2lkIE9uSW5jb21pbmdFdmVudChUIGV2ZW50KSB7Ci0gICAgaWYgKCFydW5uaW5nXykgewotICAgICAgTE9HX0lORk8oIiVzOiBEaXNjYXJkaW5nIGFuIGV2ZW50IHdoaWxlIG5vdCBydW5uaW5nIHRoZSBsb29wIiwgbG9nX25hbWVfLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0dfSU5GTygiJXM6IEdvdCBldmVudCwgZW5xdWV1aW5nIiwgbG9nX25hbWVfLmNfc3RyKCkpOwotICAgIHBlbmRpbmdfZXZlbnRzXy5wdXNoKHN0ZDo6bW92ZShldmVudCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBsb2dfbmFtZV87Ci0gIHN0ZDo6YXRvbWljPGJvb2w+IHJ1bm5pbmdfe3RydWV9OwotICBjb21tb246OkJsb2NraW5nUXVldWU8VD4gcGVuZGluZ19ldmVudHNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGdycGMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2dycGMvZ3JwY19tb2R1bGUuY2MgYi9nZC9ncnBjL2dycGNfbW9kdWxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ0MGFiLi4wMDAwMDAwCi0tLSBhL2dkL2dycGMvZ3JwY19tb2R1bGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdycGMvZ3JwY19tb2R1bGUuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyA6OmdycGM6OlNlcnZlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQnVpbGRlcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZ3JwYyB7Ci0KLXZvaWQgR3JwY01vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7fQotCi12b2lkIEdycGNNb2R1bGU6OlN0YXJ0KCkgewotICBBU1NFUlQoIXN0YXJ0ZWRfKTsKLX0KLQotdm9pZCBHcnBjTW9kdWxlOjpTdG9wKCkgewotICBBU1NFUlQoIXN0YXJ0ZWRfKTsKLX0KLQotdm9pZCBHcnBjTW9kdWxlOjpTdGFydFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpIHsKLSAgQVNTRVJUKCFzdGFydGVkXyk7Ci0gIHN0YXJ0ZWRfID0gdHJ1ZTsKLQotICBzdGQ6OnN0cmluZyBsaXN0ZW5pbmdfcG9ydCA9IGFkZHJlc3MgKyAiOiIgKyBzdGQ6OnRvX3N0cmluZyhwb3J0KTsKLSAgU2VydmVyQnVpbGRlciBidWlsZGVyOwotCi0gIGZvciAoY29uc3QgYXV0byYgZmFjYWRlIDogZmFjYWRlc18pIHsKLSAgICBidWlsZGVyLlJlZ2lzdGVyU2VydmljZShmYWNhZGUtPkdldFNlcnZpY2UoKSk7Ci0gIH0KLQotICBidWlsZGVyLkFkZExpc3RlbmluZ1BvcnQobGlzdGVuaW5nX3BvcnQsIDo6Z3JwYzo6SW5zZWN1cmVTZXJ2ZXJDcmVkZW50aWFscygpKTsKLSAgY29tcGxldGlvbl9xdWV1ZV8gPSBidWlsZGVyLkFkZENvbXBsZXRpb25RdWV1ZSgpOwotICBzZXJ2ZXJfID0gYnVpbGRlci5CdWlsZEFuZFN0YXJ0KCk7Ci0gIEFTU0VSVChzZXJ2ZXJfICE9IG51bGxwdHIpOwotICBMT0dfSU5GTygiZ1JQQyBzZXJ2ZXIgc3RhcnRlZCBvbiAlcyIsIGxpc3RlbmluZ19wb3J0LmNfc3RyKCkpOwotCi0gIGZvciAoY29uc3QgYXV0byYgZmFjYWRlIDogZmFjYWRlc18pIHsKLSAgICBmYWNhZGUtPk9uU2VydmVyU3RhcnRlZCgpOwotICB9Ci19Ci0KLXZvaWQgR3JwY01vZHVsZTo6U3RvcFNlcnZlcigpIHsKLSAgQVNTRVJUKHN0YXJ0ZWRfKTsKLQotICBzZXJ2ZXJfLT5TaHV0ZG93bigpOwotICBjb21wbGV0aW9uX3F1ZXVlXy0+U2h1dGRvd24oKTsKLQotICBmb3IgKGNvbnN0IGF1dG8mIGZhY2FkZSA6IGZhY2FkZXNfKSB7Ci0gICAgZmFjYWRlLT5PblNlcnZlclN0b3BwZWQoKTsKLSAgfQotCi0gIHN0YXJ0ZWRfID0gZmFsc2U7Ci19Ci0KLXZvaWQgR3JwY01vZHVsZTo6UmVnaXN0ZXIoR3JwY0ZhY2FkZU1vZHVsZSogZmFjYWRlKSB7Ci0gIEFTU0VSVCghc3RhcnRlZF8pOwotCi0gIGZhY2FkZXNfLnB1c2hfYmFjayhmYWNhZGUpOwotfQotCi12b2lkIEdycGNNb2R1bGU6OlVucmVnaXN0ZXIoR3JwY0ZhY2FkZU1vZHVsZSogZmFjYWRlKSB7Ci0gIEFTU0VSVCghc3RhcnRlZF8pOwotCi0gIGZvciAoYXV0byBpdCA9IGZhY2FkZXNfLmJlZ2luKCk7IGl0ICE9IGZhY2FkZXNfLmVuZCgpOyBpdCsrKSB7Ci0gICAgaWYgKCppdCA9PSBmYWNhZGUpIHsKLSAgICAgIGZhY2FkZXNfLmVyYXNlKGl0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBBU1NFUlQoZmFsc2UpOwotfQotCi12b2lkIEdycGNNb2R1bGU6OlJ1bkdycGNMb29wKCkgewotICB2b2lkKiB0YWc7Ci0gIGJvb2wgb2s7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKCFjb21wbGV0aW9uX3F1ZXVlXy0+TmV4dCgmdGFnLCAmb2spKSB7Ci0gICAgICBMT0dfSU5GTygiZ1JQQyBpcyBzaHV0ZG93biIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIEdycGNNb2R1bGU6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIkdycGMgTW9kdWxlIjsKLX0KLQotY29uc3QgOjpibHVldG9vdGg6Ok1vZHVsZUZhY3RvcnkgR3JwY01vZHVsZTo6RmFjdG9yeSA9IDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEdycGNNb2R1bGUoKTsgfSk7Ci0KLXZvaWQgR3JwY0ZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxHcnBjTW9kdWxlPigpOwotfQotCi12b2lkIEdycGNGYWNhZGVNb2R1bGU6OlN0YXJ0KCkgewotICBHZXREZXBlbmRlbmN5PEdycGNNb2R1bGU+KCktPlJlZ2lzdGVyKHRoaXMpOwotfQotCi12b2lkIEdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIEdldERlcGVuZGVuY3k8R3JwY01vZHVsZT4oKS0+VW5yZWdpc3Rlcih0aGlzKTsKLX0KLQotc3RkOjpzdHJpbmcgR3JwY0ZhY2FkZU1vZHVsZTo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiR3JwYyBGYWNhZGUgTW9kdWxlIjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGdycGMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2dycGMvZ3JwY19tb2R1bGUuaCBiL2dkL2dycGMvZ3JwY19tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0N2RmNy4uMDAwMDAwMAotLS0gYS9nZC9ncnBjL2dycGNfbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdycGMrKy9ncnBjKysuaD4KLSNpbmNsdWRlIDxtb2R1bGUuaD4KLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBncnBjIHsKLQotY2xhc3MgR3JwY0ZhY2FkZU1vZHVsZTsKLQotY2xhc3MgR3JwY01vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdm9pZCBTdGFydFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpOwotCi0gIHZvaWQgU3RvcFNlcnZlcigpOwotCi0gIHZvaWQgUmVnaXN0ZXIoR3JwY0ZhY2FkZU1vZHVsZSogZmFjYWRlKTsKLQotICB2b2lkIFVucmVnaXN0ZXIoR3JwY0ZhY2FkZU1vZHVsZSogZmFjYWRlKTsKLQotICAvLyBCbG9ja3MgZm9yIGluY29taW5nIGdSUEMgcmVxdWVzdHMKLSAgdm9pZCBSdW5HcnBjTG9vcCgpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBib29sIHN0YXJ0ZWRfOwotICBzdGQ6OnVuaXF1ZV9wdHI8OjpncnBjOjpTZXJ2ZXI+IHNlcnZlcl8gPSBudWxscHRyOwotICBzdGQ6OnVuaXF1ZV9wdHI8OjpncnBjOjpTZXJ2ZXJDb21wbGV0aW9uUXVldWU+IGNvbXBsZXRpb25fcXVldWVfID0gbnVsbHB0cjsKLSAgc3RkOjp2ZWN0b3I8R3JwY0ZhY2FkZU1vZHVsZSo+IGZhY2FkZXNfOwotfTsKLQotY2xhc3MgR3JwY0ZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6TW9kdWxlIHsKLSAgZnJpZW5kIEdycGNNb2R1bGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCA6OmdycGM6OlNlcnZpY2UqIEdldFNlcnZpY2UoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uU2VydmVyU3RhcnRlZCgpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIE9uU2VydmVyU3RvcHBlZCgpIHt9Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBncnBjCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvQW5kcm9pZC5icCBiL2dkL2hhbC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhiNGNhLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoSGFsU291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAic25vb3BfbG9nZ2VyLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhIYWxUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAic25vb3BfbG9nZ2VyX3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEhhbFNvdXJjZXNfaGNpX2hvc3QiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImhjaV9oYWxfaG9zdF9yb290Y2FuYWwuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEhhbFNvdXJjZXNfaGNpX2FuZHJvaWRfaGlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiaGNpX2hhbF9hbmRyb2lkX2hpZGwuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEhhbFRlc3RTb3VyY2VzX2hjaV9ob3N0IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2lfaGFsX2hvc3RfdGVzdC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoSGFsVGVzdFNvdXJjZXNfaGNpX2FuZHJvaWRfaGlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiaGNpX2hhbF9hbmRyb2lkX2hpZGxfdGVzdC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlX2hjaV9oYWwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZhY2FkZS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoSGFsRnV6elNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZ1enovZnV6el9oY2lfaGFsLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvaGFsL0JVSUxELmduIGIvZ2QvaGFsL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWQ4MTRhLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zb3VyY2Vfc2V0KCJCbHVldG9vdGhIYWxTb3VyY2VzIikgewotICBzb3VyY2VzID0gWyAic25vb3BfbG9nZ2VyLmNjIiBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi0gIGRlcHMgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRfZGVwcyIgXQotfQotCi1zb3VyY2Vfc2V0KCJCbHVldG9vdGhIYWxTb3VyY2VzX2hjaV9ob3N0IikgewotICBzb3VyY2VzID0gWyAiaGNpX2hhbF9ob3N0LmNjIiBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi0gIGRlcHMgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRfZGVwcyIgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvaGFsL2NlcnQvc2ltcGxlX2hhbF90ZXN0LnB5IGIvZ2QvaGFsL2NlcnQvc2ltcGxlX2hhbF90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk2MjY1Li4wMDAwMDAwCi0tLSBhL2dkL2hhbC9jZXJ0L3NpbXBsZV9oYWxfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIGhhbC5jZXJ0LnNpbXBsZV9oYWxfdGVzdF9saWIgaW1wb3J0IFNpbXBsZUhhbFRlc3RCYXNlCi0KLV9HUlBDX1RJTUVPVVQgPSAxMAotCi0KLWNsYXNzIFNpbXBsZUhhbFRlc3QoR2RCYXNlVGVzdENsYXNzLCBTaW1wbGVIYWxUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQUwnLCBjZXJ0X21vZHVsZT0nSEFMJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfdGVzdChzZWxmKQotICAgICAgICBTaW1wbGVIYWxUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgU2ltcGxlSGFsVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBHZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQpkaWZmIC0tZ2l0IGEvZ2QvaGFsL2NlcnQvc2ltcGxlX2hhbF90ZXN0X2xpYi5weSBiL2dkL2hhbC9jZXJ0L3NpbXBsZV9oYWxfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWQ5MzguLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2NlcnQvc2ltcGxlX2hhbF90ZXN0X2xpYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQotCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBFdmVudFN0cmVhbQotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGNlcnQucHlfaGFsIGltcG9ydCBQeUhhbAotZnJvbSBjZXJ0Lm1hdGNoZXJzIGltcG9ydCBIY2lNYXRjaGVycwotZnJvbSBjZXJ0LmNhcHR1cmVzIGltcG9ydCBIY2lDYXB0dXJlcwotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMgotZnJvbSBmYWNhZGUgaW1wb3J0IHJvb3RzZXJ2aWNlX3BiMiBhcyBmYWNhZGVfcm9vdHNlcnZpY2VfcGIyCi1mcm9tIGhhbCBpbXBvcnQgaGFsX2ZhY2FkZV9wYjIgYXMgaGFsX2ZhY2FkZV9wYjIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgaGNpX3BhY2tldHMKLWltcG9ydCBibHVldG9vdGhfcGFja2V0c19weXRob24zIGFzIGJ0X3BhY2tldHMKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQWNsQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBSYXdCdWlsZGVyCi0KLV9HUlBDX1RJTUVPVVQgPSAxMAotCi0KLWNsYXNzIFNpbXBsZUhhbFRlc3RCYXNlKCk6Ci0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmLCBkdXQsIGNlcnQpOgotICAgICAgICBzZWxmLmR1dF9oYWwgPSBQeUhhbChkdXQpCi0gICAgICAgIHNlbGYuY2VydF9oYWwgPSBQeUhhbChjZXJ0KQotCi0gICAgICAgIHNlbGYuZHV0X2hhbC5yZXNldCgpCi0gICAgICAgIHNlbGYuY2VydF9oYWwucmVzZXQoKQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0X2hhbC5jbG9zZSgpCi0gICAgICAgIHNlbGYuY2VydF9oYWwuY2xvc2UoKQotCi0gICAgZGVmIHRlc3Rfc3RyZWFtX2V2ZW50cyhzZWxmKToKLSAgICAgICAgc2VsZi5kdXRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZUFkZERldmljZVRvQ29ubmVjdExpc3RCdWlsZGVyKGhjaV9wYWNrZXRzLkNvbm5lY3RMaXN0QWRkcmVzc1R5cGUuUkFORE9NLCAnMEM6MDU6MDQ6MDM6MDI6MDEnKSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hhbC5nZXRfaGNpX2V2ZW50X3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIEhjaU1hdGNoZXJzLkV4YWN0bHkoaGNpX3BhY2tldHMuTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyKDEsIGhjaV9wYWNrZXRzLkVycm9yQ29kZS5TVUNDRVNTKSkpCi0KLSAgICBkZWYgdGVzdF9sb29wYmFja19oY2lfY29tbWFuZChzZWxmKToKLSAgICAgICAgc2VsZi5kdXRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuV3JpdGVMb29wYmFja01vZGVCdWlsZGVyKGhjaV9wYWNrZXRzLkxvb3BiYWNrTW9kZS5FTkFCTEVfTE9DQUwpKQotCi0gICAgICAgIGNvbW1hbmQgPSBoY2lfcGFja2V0cy5MZUFkZERldmljZVRvQ29ubmVjdExpc3RCdWlsZGVyKGhjaV9wYWNrZXRzLkNvbm5lY3RMaXN0QWRkcmVzc1R5cGUuUkFORE9NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMEM6MDU6MDQ6MDM6MDI6MDEnKQotICAgICAgICBzZWxmLmR1dF9oYWwuc2VuZF9oY2lfY29tbWFuZChjb21tYW5kKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfaGFsLmdldF9oY2lfZXZlbnRfc3RyZWFtKCkpLmVtaXRzKEhjaU1hdGNoZXJzLkxvb3BiYWNrT2YoY29tbWFuZCkpCi0KLSAgICBkZWYgdGVzdF9pbnF1aXJ5X2Zyb21fZHV0KHNlbGYpOgotICAgICAgICBzZWxmLmNlcnRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuV3JpdGVTY2FuRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5TY2FuRW5hYmxlLklOUVVJUllfQU5EX1BBR0VfU0NBTikpCi0KLSAgICAgICAgbGFwID0gaGNpX3BhY2tldHMuTGFwKCkKLSAgICAgICAgbGFwLmxhcCA9IDB4MzMKLSAgICAgICAgc2VsZi5kdXRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuSW5xdWlyeUJ1aWxkZXIobGFwLCAweDMwLCAweGZmKSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hhbC5nZXRfaGNpX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ1x4MDJceDBmJyBpbiBwYWNrZXQucGF5bG9hZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEV4cGVjdGluZyBhbiBIQ0kgRXZlbnQgKGNvZGUgMHgwMiwgbGVuZ3RoIDB4MGYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0gICAgZGVmIHRlc3RfbGVfYWRfc2Nhbl9jZXJ0X2FkdmVydGlzZXMoc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0X2hhbC51bm1hc2tfZXZlbnQoaGNpX3BhY2tldHMuRXZlbnRDb2RlLkxFX01FVEFfRVZFTlQpCi0gICAgICAgIHNlbGYuZHV0X2hhbC5zZXRfcmFuZG9tX2xlX2FkZHJlc3MoJzBEOjA1OjA0OjAzOjAyOjAxJykKLQotICAgICAgICBzZWxmLmR1dF9oYWwuc2V0X3NjYW5fcGFyYW1ldGVycygpCi0gICAgICAgIHNlbGYuZHV0X2hhbC5zdGFydF9zY2FubmluZygpCi0KLSAgICAgICAgYWR2ZXJ0aXNlbWVudCA9IHNlbGYuY2VydF9oYWwuY3JlYXRlX2FkdmVydGlzZW1lbnQoCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgJzBDOjA1OjA0OjAzOjAyOjAxJywKLSAgICAgICAgICAgIG1pbl9pbnRlcnZhbD01MTIsCi0gICAgICAgICAgICBtYXhfaW50ZXJ2YWw9NzY4LAotICAgICAgICAgICAgcGVlcl9hZGRyZXNzPSdBNjpBNTpBNDpBMzpBMjpBMScsCi0gICAgICAgICAgICB0eF9wb3dlcj0weDdmLAotICAgICAgICAgICAgc2lkPTEpCi0gICAgICAgIGFkdmVydGlzZW1lbnQuc2V0X2RhdGEoYidJbV9BX0NlcnQnKQotICAgICAgICBhZHZlcnRpc2VtZW50LnN0YXJ0KCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hhbC5nZXRfaGNpX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ0ltX0FfQ2VydCcgaW4gcGFja2V0LnBheWxvYWQpCi0KLSAgICAgICAgYWR2ZXJ0aXNlbWVudC5zdG9wKCkKLQotICAgICAgICBzZWxmLmR1dF9oYWwuc3RvcF9zY2FubmluZygpCi0KLSAgICBkZWYgdGVzdF9sZV9jb25uZWN0aW9uX2R1dF9hZHZlcnRpc2VzKHNlbGYpOgotICAgICAgICBzZWxmLmNlcnRfaGFsLnVubWFza19ldmVudChoY2lfcGFja2V0cy5FdmVudENvZGUuTEVfTUVUQV9FVkVOVCkKLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5zZXRfcmFuZG9tX2xlX2FkZHJlc3MoJzBDOjA1OjA0OjAzOjAyOjAxJykKLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5pbml0aWF0ZV9sZV9jb25uZWN0aW9uKCcwRDowNTowNDowMzowMjowMScpCi0KLSAgICAgICAgIyBEVVQgQWR2ZXJ0aXNlcwotICAgICAgICBzZWxmLmR1dF9oYWwudW5tYXNrX2V2ZW50KGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5MRV9NRVRBX0VWRU5UKQotICAgICAgICBhZHZlcnRpc2VtZW50ID0gc2VsZi5kdXRfaGFsLmNyZWF0ZV9hZHZlcnRpc2VtZW50KDAsICcwRDowNTowNDowMzowMjowMScpCi0gICAgICAgIGFkdmVydGlzZW1lbnQuc2V0X2RhdGEoYidJbV9UaGVfRFVUJykKLSAgICAgICAgYWR2ZXJ0aXNlbWVudC5zZXRfc2Nhbl9yZXNwb25zZShiJ0ltX1RoZV9EJykKLSAgICAgICAgYWR2ZXJ0aXNlbWVudC5zdGFydCgpCi0KLSAgICAgICAgY2VydF9hY2wgPSBzZWxmLmNlcnRfaGFsLmNvbXBsZXRlX2xlX2Nvbm5lY3Rpb24oKQotICAgICAgICBkdXRfYWNsID0gc2VsZi5kdXRfaGFsLmNvbXBsZXRlX2xlX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgIGR1dF9hY2wuc2VuZF9maXJzdChiJ0p1c3QgU29tZUFjbERhdGEnKQotICAgICAgICBjZXJ0X2FjbC5zZW5kX2ZpcnN0KGInSnVzdCBTb21lTW9yZUFjbERhdGEnKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2hhbC5nZXRfYWNsX3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ1NvbWVBY2xEYXRhJyBpbiBwYWNrZXQucGF5bG9hZCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9oYWwuZ2V0X2FjbF9zdHJlYW0oKSkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lTW9yZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotCi0gICAgZGVmIHRlc3RfbGVfY29ubmVjdF9saXN0X2Nvbm5lY3Rpb25fY2VydF9hZHZlcnRpc2VzKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9oYWwudW5tYXNrX2V2ZW50KGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5MRV9NRVRBX0VWRU5UKQotICAgICAgICBzZWxmLmR1dF9oYWwuc2V0X3JhbmRvbV9sZV9hZGRyZXNzKCcwRDowNTowNDowMzowMjowMScpCi0gICAgICAgIHNlbGYuZHV0X2hhbC5hZGRfdG9fY29ubmVjdF9saXN0KCcwQzowNTowNDowMzowMjowMScpCi0gICAgICAgIHNlbGYuZHV0X2hhbC5pbml0aWF0ZV9sZV9jb25uZWN0aW9uX2J5X2Nvbm5lY3RfbGlzdCgnQkE6RDU6QTQ6QTM6QTI6QTEnKQotCi0gICAgICAgIHNlbGYuY2VydF9oYWwudW5tYXNrX2V2ZW50KGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5MRV9NRVRBX0VWRU5UKQotICAgICAgICBhZHZlcnRpc2VtZW50ID0gc2VsZi5jZXJ0X2hhbC5jcmVhdGVfYWR2ZXJ0aXNlbWVudCgKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAnMEM6MDU6MDQ6MDM6MDI6MDEnLAotICAgICAgICAgICAgbWluX2ludGVydmFsPTUxMiwKLSAgICAgICAgICAgIG1heF9pbnRlcnZhbD03NjgsCi0gICAgICAgICAgICBwZWVyX2FkZHJlc3M9J0E2OkE1OkE0OkEzOkEyOkExJywKLSAgICAgICAgICAgIHR4X3Bvd2VyPTB4N0YsCi0gICAgICAgICAgICBzaWQ9MCkKLSAgICAgICAgYWR2ZXJ0aXNlbWVudC5zZXRfZGF0YShiJ0ltX0FfQ2VydCcpCi0gICAgICAgIGFkdmVydGlzZW1lbnQuc3RhcnQoKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2hhbC5nZXRfaGNpX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhIY2lNYXRjaGVycy5MZUNvbm5lY3Rpb25Db21wbGV0ZSgpKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hhbC5nZXRfaGNpX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhIY2lNYXRjaGVycy5MZUNvbm5lY3Rpb25Db21wbGV0ZSgpKQpkaWZmIC0tZ2l0IGEvZ2QvaGFsL2ZhY2FkZS5jYyBiL2dkL2hhbC9mYWNhZGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2E4MzQuLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGFsL2ZhY2FkZS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX2V2ZW50X3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGFsL2hhbF9mYWNhZGUuZ3JwYy5wYi5oIgotI2luY2x1ZGUgImhhbC9oY2lfaGFsLmgiCi0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIEhjaUhhbEZhY2FkZVNlcnZpY2UgOiBwdWJsaWMgSGNpSGFsRmFjYWRlOjpTZXJ2aWNlLCBwdWJsaWMgOjpibHVldG9vdGg6OmhhbDo6SGNpSGFsQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEhjaUhhbEZhY2FkZVNlcnZpY2UoSGNpSGFsKiBoYWwpIDogaGFsXyhoYWwpIHsKLSAgICBoYWwtPnJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjayh0aGlzKTsKLSAgfQotCi0gIH5IY2lIYWxGYWNhZGVTZXJ2aWNlKCkgewotICAgIGhhbF8tPnVucmVnaXN0ZXJJbmNvbWluZ1BhY2tldENhbGxiYWNrKCk7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZW5kQ29tbWFuZCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGEqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIGNhbl9zZW5kX2hjaV9jb21tYW5kXyA9IGZhbHNlOwotICAgIHN0ZDo6c3RyaW5nIHJlcV9zdHJpbmcgPSByZXF1ZXN0LT5wYXlsb2FkKCk7Ci0gICAgaGFsXy0+c2VuZEhjaUNvbW1hbmQoc3RkOjp2ZWN0b3I8dWludDhfdD4ocmVxX3N0cmluZy5iZWdpbigpLCByZXFfc3RyaW5nLmVuZCgpKSk7Ci0gICAgd2hpbGUgKCFjYW5fc2VuZF9oY2lfY29tbWFuZF8pIHsKLSAgICAgIGN2Xy53YWl0KGxvY2spOwotICAgIH0KLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2VuZEFjbCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGEqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6c3RyaW5nIHJlcV9zdHJpbmcgPSByZXF1ZXN0LT5wYXlsb2FkKCk7Ci0gICAgaGFsXy0+c2VuZEFjbERhdGEoc3RkOjp2ZWN0b3I8dWludDhfdD4ocmVxX3N0cmluZy5iZWdpbigpLCByZXFfc3RyaW5nLmVuZCgpKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmRTY28oCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6ZmFjYWRlOjpEYXRhKiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnN0cmluZyByZXFfc3RyaW5nID0gcmVxdWVzdC0+cGF5bG9hZCgpOwotICAgIGhhbF8tPnNlbmRTY29EYXRhKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHJlcV9zdHJpbmcuYmVnaW4oKSwgcmVxX3N0cmluZy5lbmQoKSkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTdHJlYW1FdmVudHMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBwZW5kaW5nX2hjaV9ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfTsKLQotICA6OmdycGM6OlN0YXR1cyBTdHJlYW1BY2woCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBwZW5kaW5nX2FjbF9ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfTsKLQotICA6OmdycGM6OlN0YXR1cyBTdHJlYW1TY28oCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBwZW5kaW5nX3Njb19ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfTsKLQotICA6OmdycGM6OlN0YXR1cyBTdHJlYW1Jc28oCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBwZW5kaW5nX2lzb19ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfTsKLQotICB2b2lkIGhjaUV2ZW50UmVjZWl2ZWQoYmx1ZXRvb3RoOjpoYWw6OkhjaVBhY2tldCBldmVudCkgb3ZlcnJpZGUgewotICAgIHsKLSAgICAgIDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGEgcmVzcG9uc2U7Ci0gICAgICByZXNwb25zZS5zZXRfcGF5bG9hZChzdGQ6OnN0cmluZyhldmVudC5iZWdpbigpLCBldmVudC5lbmQoKSkpOwotICAgICAgcGVuZGluZ19oY2lfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgfQotICAgIGNhbl9zZW5kX2hjaV9jb21tYW5kXyA9IHRydWU7Ci0gICAgY3ZfLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIHZvaWQgYWNsRGF0YVJlY2VpdmVkKGJsdWV0b290aDo6aGFsOjpIY2lQYWNrZXQgZGF0YSkgb3ZlcnJpZGUgewotICAgIDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGEgcmVzcG9uc2U7Ci0gICAgcmVzcG9uc2Uuc2V0X3BheWxvYWQoc3RkOjpzdHJpbmcoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKSk7Ci0gICAgcGVuZGluZ19hY2xfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gIH0KLQotICB2b2lkIHNjb0RhdGFSZWNlaXZlZChibHVldG9vdGg6OmhhbDo6SGNpUGFja2V0IGRhdGEpIG92ZXJyaWRlIHsKLSAgICA6OmJsdWV0b290aDo6ZmFjYWRlOjpEYXRhIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLnNldF9wYXlsb2FkKHN0ZDo6c3RyaW5nKGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSkpOwotICAgIHBlbmRpbmdfc2NvX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICB9Ci0KLSAgdm9pZCBpc29EYXRhUmVjZWl2ZWQoYmx1ZXRvb3RoOjpoYWw6OkhjaVBhY2tldCBkYXRhKSBvdmVycmlkZSB7Ci0gICAgOjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YSByZXNwb25zZTsKLSAgICByZXNwb25zZS5zZXRfcGF5bG9hZChzdGQ6OnN0cmluZyhkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpKTsKLSAgICBwZW5kaW5nX2lzb19ldmVudHNfLk9uSW5jb21pbmdFdmVudChzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgSGNpSGFsKiBoYWxfOwotICBib29sIGNhbl9zZW5kX2hjaV9jb21tYW5kXyA9IHRydWU7Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci0gIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2XzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGE+IHBlbmRpbmdfaGNpX2V2ZW50c197IlN0cmVhbUV2ZW50cyJ9OwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4gcGVuZGluZ19hY2xfZXZlbnRzX3siU3RyZWFtQWNsIn07Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTw6OmJsdWV0b290aDo6ZmFjYWRlOjpEYXRhPiBwZW5kaW5nX3Njb19ldmVudHNfeyJTdHJlYW1TY28ifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGE+IHBlbmRpbmdfaXNvX2V2ZW50c197IlN0cmVhbUlzbyJ9OwotfTsKLQotdm9pZCBIY2lIYWxGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhsaXN0KTsKLSAgbGlzdC0+YWRkPEhjaUhhbD4oKTsKLX0KLQotdm9pZCBIY2lIYWxGYWNhZGVNb2R1bGU6OlN0YXJ0KCkgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RhcnQoKTsKLSAgc2VydmljZV8gPSBuZXcgSGNpSGFsRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PEhjaUhhbD4oKSk7Ci19Ci0KLXZvaWQgSGNpSGFsRmFjYWRlTW9kdWxlOjpTdG9wKCkgewotICBkZWxldGUgc2VydmljZV87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdG9wKCk7Ci19Ci0KLTo6Z3JwYzo6U2VydmljZSogSGNpSGFsRmFjYWRlTW9kdWxlOjpHZXRTZXJ2aWNlKCkgY29uc3QgewotICByZXR1cm4gc2VydmljZV87Ci19Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgSGNpSGFsRmFjYWRlTW9kdWxlOjpGYWN0b3J5ID0gOjpibHVldG9vdGg6Ok1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgSGNpSGFsRmFjYWRlTW9kdWxlKCk7IH0pOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvZmFjYWRlLmggYi9nZC9oYWwvZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNGIxYWQuLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2ZhY2FkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxncnBjKysvZ3JwYysrLmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotI2luY2x1ZGUgImhhbC9oY2lfaGFsLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIEhjaUhhbEZhY2FkZVNlcnZpY2U7Ci0KLWNsYXNzIEhjaUhhbEZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgSGNpSGFsRmFjYWRlU2VydmljZSogc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvZnV6ei9mdXp6X2hjaV9oYWwuY2MgYi9nZC9oYWwvZnV6ei9mdXp6X2hjaV9oYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWZiNmQuLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2Z1enovZnV6el9oY2lfaGFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoYWwvZnV6ei9mdXp6X2hjaV9oYWwuaCIKLQotI2luY2x1ZGUgImZ1enovaGVscGVycy5oIgotI2luY2x1ZGUgImhjaS9mdXp6L3N0YXR1c192c19jb21wbGV0ZV9jb21tYW5kcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGZ1enogewotdXNpbmcgYmx1ZXRvb3RoOjpmdXp6OjpHZXRBcmJpdHJhcnlCeXRlczsKLQotdm9pZCBGdXp6SGNpSGFsOjpyZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soSGNpSGFsQ2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgY2FsbGJhY2tzXyA9IGNhbGxiYWNrczsKLX0KLQotdm9pZCBGdXp6SGNpSGFsOjp1bnJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjaygpIHsKLSAgY2FsbGJhY2tzXyA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgRnV6ekhjaUhhbDo6aW5qZWN0QXJiaXRyYXJ5KEZ1enplZERhdGFQcm92aWRlciYgZmRwKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgYWN0aW9uID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2UoMCwgNCk7Ci0gIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5qZWN0QWNsRGF0YShHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbmplY3RIY2lFdmVudChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBpbmplY3RTY29EYXRhKEdldEFyYml0cmFyeUJ5dGVzKCZmZHApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGluamVjdElzb0RhdGEoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBGdXp6SGNpSGFsOjpzZW5kSGNpQ29tbWFuZChIY2lQYWNrZXQgcGFja2V0KSB7Ci0gIGhjaTo6Q29tbWFuZFZpZXcgY29tbWFuZCA9IGhjaTo6Q29tbWFuZFZpZXc6OkZyb21CeXRlcyhwYWNrZXQpOwotICBpZiAoIWNvbW1hbmQuSXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgd2FpdGluZ19vcGNvZGVfID0gY29tbWFuZC5HZXRPcENvZGUoKTsKLSAgd2FpdGluZ19mb3Jfc3RhdHVzXyA9IGhjaTo6ZnV6ejo6dXNlc19jb21tYW5kX3N0YXR1cyh3YWl0aW5nX29wY29kZV8pOwotfQotCi12b2lkIEZ1enpIY2lIYWw6OmluamVjdEhjaUV2ZW50KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgaGNpOjpFdmVudFZpZXcgZXZlbnQgPSBoY2k6OkV2ZW50Vmlldzo6RnJvbUJ5dGVzKGRhdGEpOwotICBpZiAoIWV2ZW50LklzVmFsaWQoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyBjb21wbGV0ZSA9IGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgaWYgKGNvbXBsZXRlLklzVmFsaWQoKSkgewotICAgIGlmICh3YWl0aW5nX2Zvcl9zdGF0dXNfIHx8IGNvbXBsZXRlLkdldENvbW1hbmRPcENvZGUoKSAhPSB3YWl0aW5nX29wY29kZV8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoIXdhaXRpbmdfZm9yX3N0YXR1c18pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBoY2k6OkNvbW1hbmRTdGF0dXNWaWV3IHN0YXR1cyA9IGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXc6OkNyZWF0ZShldmVudCk7Ci0gIGlmIChzdGF0dXMuSXNWYWxpZCgpKSB7Ci0gICAgaWYgKCF3YWl0aW5nX2Zvcl9zdGF0dXNfIHx8IHN0YXR1cy5HZXRDb21tYW5kT3BDb2RlKCkgIT0gd2FpdGluZ19vcGNvZGVfKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgaWYgKHdhaXRpbmdfZm9yX3N0YXR1c18pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjYWxsYmFja3NfLT5oY2lFdmVudFJlY2VpdmVkKGRhdGEpOwotfQotCi12b2lkIEZ1enpIY2lIYWw6OmluamVjdEFjbERhdGEoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBoY2k6OkFjbFZpZXcgYWNsUGFja2V0ID0gaGNpOjpBY2xWaWV3OjpGcm9tQnl0ZXMoZGF0YSk7Ci0gIGlmICghYWNsUGFja2V0LklzVmFsaWQoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGNhbGxiYWNrc18tPmFjbERhdGFSZWNlaXZlZChkYXRhKTsKLX0KLQotdm9pZCBGdXp6SGNpSGFsOjppbmplY3RTY29EYXRhKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgaGNpOjpTY29WaWV3IHNjb1BhY2tldCA9IGhjaTo6U2NvVmlldzo6RnJvbUJ5dGVzKGRhdGEpOwotICBpZiAoIXNjb1BhY2tldC5Jc1ZhbGlkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjYWxsYmFja3NfLT5zY29EYXRhUmVjZWl2ZWQoZGF0YSk7Ci19Ci0KLXZvaWQgRnV6ekhjaUhhbDo6aW5qZWN0SXNvRGF0YShzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIGhjaTo6SXNvVmlldyBpc29QYWNrZXQgPSBoY2k6Oklzb1ZpZXc6OkZyb21CeXRlcyhkYXRhKTsKLSAgaWYgKCFpc29QYWNrZXQuSXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2FsbGJhY2tzXy0+aXNvRGF0YVJlY2VpdmVkKGRhdGEpOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEZ1enpIY2lIYWw6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEZ1enpIY2lIYWwoKTsgfSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBmdXp6Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvZnV6ei9mdXp6X2hjaV9oYWwuaCBiL2dkL2hhbC9mdXp6L2Z1enpfaGNpX2hhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTczNzg0Li4wMDAwMDAwCi0tLSBhL2dkL2hhbC9mdXp6L2Z1enpfaGNpX2hhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmdXp6L2hlbHBlcnMuaCIKLSNpbmNsdWRlICJoYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGZ1enogewotCi1jbGFzcyBGdXp6SGNpSGFsIDogcHVibGljIEhjaUhhbCB7Ci0gcHVibGljOgotICB2b2lkIHJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjayhIY2lIYWxDYWxsYmFja3MqIGNhbGxiYWNrcykgb3ZlcnJpZGU7Ci0gIHZvaWQgdW5yZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soKSBvdmVycmlkZTsKLQotICB2b2lkIHNlbmRIY2lDb21tYW5kKEhjaVBhY2tldCBjb21tYW5kKSBvdmVycmlkZTsKLSAgdm9pZCBzZW5kQWNsRGF0YShIY2lQYWNrZXQgcGFja2V0KSBvdmVycmlkZSB7fQotICB2b2lkIHNlbmRTY29EYXRhKEhjaVBhY2tldCBwYWNrZXQpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgc2VuZElzb0RhdGEoSGNpUGFja2V0IHBhY2tldCkgb3ZlcnJpZGUge30KLQotICB2b2lkIGluamVjdEFyYml0cmFyeShGdXp6ZWREYXRhUHJvdmlkZXImIGZkcCk7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJIY2lIYWxGdXp6IjsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZSB7fQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLQotIHByaXZhdGU6Ci0gIHZvaWQgaW5qZWN0QWNsRGF0YShzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RIY2lFdmVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RTY29EYXRhKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotICB2b2lkIGluamVjdElzb0RhdGEoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0KLSAgSGNpSGFsQ2FsbGJhY2tzKiBjYWxsYmFja3NfOwotICBoY2k6Ok9wQ29kZSB3YWl0aW5nX29wY29kZV87Ci0gIGJvb2wgd2FpdGluZ19mb3Jfc3RhdHVzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmdXp6Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvaGFsX2ZhY2FkZS5wcm90byBiL2dkL2hhbC9oYWxfZmFjYWRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDlhZjBkLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9oYWxfZmFjYWRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotc3ludGF4ID0gInByb3RvMyI7Ci0KLXBhY2thZ2UgYmx1ZXRvb3RoLmhhbDsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotaW1wb3J0ICJmYWNhZGUvY29tbW9uLnByb3RvIjsKLQotc2VydmljZSBIY2lIYWxGYWNhZGUgewotICBycGMgU2VuZENvbW1hbmQoZmFjYWRlLkRhdGEpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFN0cmVhbUV2ZW50cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBmYWNhZGUuRGF0YSkge30KLQotICBycGMgU2VuZEFjbChmYWNhZGUuRGF0YSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU3RyZWFtQWNsKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIGZhY2FkZS5EYXRhKSB7fQotCi0gIHJwYyBTZW5kU2NvKGZhY2FkZS5EYXRhKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTdHJlYW1TY28oZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gZmFjYWRlLkRhdGEpIHt9Ci0KLSAgcnBjIFNlbmRJc28oZmFjYWRlLkRhdGEpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFN0cmVhbUlzbyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBmYWNhZGUuRGF0YSkge30KLX0KZGlmZiAtLWdpdCBhL2dkL2hhbC9oY2lfaGFsLmggYi9nZC9oYWwvaGNpX2hhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTgwZmZhLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9oY2lfaGFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJtb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLQotdXNpbmcgSGNpUGFja2V0ID0gc3RkOjp2ZWN0b3I8dWludDhfdD47Ci0KLWVudW0gY2xhc3MgU3RhdHVzIDogaW50MzJfdCB7IFNVQ0NFU1MsIFRSQU5TUE9SVF9FUlJPUiwgSU5JVElBTElaQVRJT05fRVJST1IsIFVOS05PV04gfTsKLQotLy8gTWlycm9ycyBoYXJkd2FyZS9pbnRlcmZhY2VzL2JsdWV0b290aC8xLjAvSUJsdWV0b290aEhjaUNhbGxiYWNrcy5oYWwgaW4gQW5kcm9pZCwgYnV0IG1vdmVkIGluaXRpYWxpemF0aW9uQ29tcGxldGUKLS8vIGNhbGxiYWNrIHRvIEJsdWV0b290aEluaXRpYWxpemF0aW9uQ29tcGxldGVDYWxsYmFjawotCi0vLyBUaGUgaW50ZXJmYWNlIGZyb20gdGhlIEJsdWV0b290aCBDb250cm9sbGVyIHRvIHRoZSBzdGFjawotY2xhc3MgSGNpSGFsQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkhjaUhhbENhbGxiYWNrcygpID0gZGVmYXVsdDsKLQotICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbiBhbiBIQ0kgZXZlbnQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUKLSAgLy8gQmx1ZXRvb3RoIGNvbnRyb2xsZXIgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBCbHVldG9vdGggc3RhY2sKLSAgLy8gQHBhcmFtIGV2ZW50IGlzIHRoZSBIQ0kgZXZlbnQgdG8gYmUgc2VudCB0byB0aGUgQmx1ZXRvb3RoIHN0YWNrCi0gIHZpcnR1YWwgdm9pZCBoY2lFdmVudFJlY2VpdmVkKEhjaVBhY2tldCBldmVudCkgPSAwOwotCi0gIC8vIFNlbmQgYW4gQUNMIGRhdGEgcGFja2V0IGZyb20gdGhlIGNvbnRyb2xsZXIgdG8gdGhlIGhvc3QKLSAgLy8gQHBhcmFtIGRhdGEgdGhlIEFDTCBIQ0kgcGFja2V0IHRvIGJlIHBhc3NlZCB0byB0aGUgaG9zdCBzdGFjawotICB2aXJ0dWFsIHZvaWQgYWNsRGF0YVJlY2VpdmVkKEhjaVBhY2tldCBkYXRhKSA9IDA7Ci0KLSAgLy8gU2VuZCBhIFNDTyBkYXRhIHBhY2tldCBmcm9tIHRoZSBjb250cm9sbGVyIHRvIHRoZSBob3N0Ci0gIC8vIEBwYXJhbSBkYXRhIHRoZSBTQ08gSENJIHBhY2tldCB0byBiZSBwYXNzZWQgdG8gdGhlIGhvc3Qgc3RhY2sKLSAgdmlydHVhbCB2b2lkIHNjb0RhdGFSZWNlaXZlZChIY2lQYWNrZXQgZGF0YSkgPSAwOwotCi0gIC8vIFNlbmQgYW4gSVNPIGRhdGEgcGFja2V0IGZyb20gdGhlIGNvbnRyb2xsZXIgdG8gdGhlIGhvc3QKLSAgLy8gQHBhcmFtIGRhdGEgdGhlIElTTyBIQ0kgcGFja2V0IHRvIGJlIHBhc3NlZCB0byB0aGUgaG9zdCBzdGFjawotICB2aXJ0dWFsIHZvaWQgaXNvRGF0YVJlY2VpdmVkKEhjaVBhY2tldCBkYXRhKSA9IDA7Ci19OwotCi0vLyBNaXJyb3JzIGhhcmR3YXJlL2ludGVyZmFjZXMvYmx1ZXRvb3RoLzEuMC9JQmx1ZXRvb3RoSGNpLmhhbCBpbiBBbmRyb2lkCi0vLyBUaGUgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoSENJKSBpcyB0aGUgbGF5ZXIgZGVmaW5lZCBieSB0aGUgQmx1ZXRvb3RoCi0vLyBzcGVjaWZpY2F0aW9uIGJldHdlZW4gdGhlIHNvZnR3YXJlIHRoYXQgcnVucyBvbiB0aGUgaG9zdCBhbmQgdGhlIEJsdWV0b290aAotLy8gY29udHJvbGxlciBjaGlwLiBUaGlzIGJvdW5kYXJ5IGlzIHRoZSBuYXR1cmFsIGNob2ljZSBmb3IgYSBIYXJkd2FyZQotLy8gQWJzdHJhY3Rpb24gTGF5ZXIgKEhBTCkuIERlYWxpbmcgb25seSBpbiBIQ0kgcGFja2V0cyBhbmQgZXZlbnRzIHNpbXBsaWZpZXMKLS8vIHRoZSBzdGFjayBhbmQgYWJzdHJhY3RzIGF3YXkgcG93ZXIgbWFuYWdlbWVudCwgaW5pdGlhbGl6YXRpb24sIGFuZCBvdGhlcgotLy8gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZGV0YWlscyByZWxhdGVkIHRvIHRoZSBoYXJkd2FyZS4KLS8vIExJTlQuSWZDaGFuZ2UKLWNsYXNzIEhjaUhhbCA6IHB1YmxpYyA6OmJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdmlydHVhbCB+SGNpSGFsKCkgPSBkZWZhdWx0OwotCi0gIC8vIFJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IgaW5jb21pbmcgcGFja2V0cy4gQWxsIGluY29taW5nIHBhY2tldHMgYXJlIGRyb3BwZWQgYmVmb3JlCi0gIC8vIHRoaXMgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4gQ2FsbGJhY2sgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZCBvbmNlLgotICAvLwotICAvLyBAcGFyYW0gY2FsbGJhY2sgaW1wbGVtZW50cyBCbHVldG9vdGhIY2lIYWxDYWxsYmFja3Mgd2hpY2ggd2lsbAotICAvLyAgICByZWNlaXZlIGNhbGxiYWNrcyB3aGVuIGluY29taW5nIEhDSSBwYWNrZXRzIGFyZSByZWNlaXZlZAotICAvLyAgICBmcm9tIHRoZSBjb250cm9sbGVyIHRvIGJlIHNlbnQgdG8gdGhlIGhvc3QuCi0gIHZpcnR1YWwgdm9pZCByZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soSGNpSGFsQ2FsbGJhY2tzKiBjYWxsYmFjaykgPSAwOwotCi0gIC8vIFVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvciBpbmNvbWluZyBwYWNrZXRzLiBEcm9wIGFsbCBmdXJ0aGVyIGluY29taW5nIHBhY2tldHMuCi0gIHZpcnR1YWwgdm9pZCB1bnJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjaygpID0gMDsKLQotICAvLyBTZW5kIGFuIEhDSSBjb21tYW5kIChhcyBzcGVjaWZpZWQgaW4gdGhlIEJsdWV0b290aCBTcGVjaWZpY2F0aW9uCi0gIC8vIFY0LjIsIFZvbCAyLCBQYXJ0IDUsIFNlY3Rpb24gNS40LjEpIHRvIHRoZSBCbHVldG9vdGggY29udHJvbGxlci4KLSAgLy8gQ29tbWFuZHMgbXVzdCBiZSBleGVjdXRlZCBpbiBvcmRlci4KLSAgdmlydHVhbCB2b2lkIHNlbmRIY2lDb21tYW5kKEhjaVBhY2tldCBjb21tYW5kKSA9IDA7Ci0KLSAgLy8gU2VuZCBhbiBIQ0kgQUNMIGRhdGEgcGFja2V0IChhcyBzcGVjaWZpZWQgaW4gdGhlIEJsdWV0b290aCBTcGVjaWZpY2F0aW9uCi0gIC8vIFY0LjIsIFZvbCAyLCBQYXJ0IDUsIFNlY3Rpb24gNS40LjIpIHRvIHRoZSBCbHVldG9vdGggY29udHJvbGxlci4KLSAgLy8gUGFja2V0cyBtdXN0IGJlIHByb2Nlc3NlZCBpbiBvcmRlci4KLSAgdmlydHVhbCB2b2lkIHNlbmRBY2xEYXRhKEhjaVBhY2tldCBkYXRhKSA9IDA7Ci0KLSAgLy8gU2VuZCBhbiBTQ08gZGF0YSBwYWNrZXQgKGFzIHNwZWNpZmllZCBpbiB0aGUgQmx1ZXRvb3RoIFNwZWNpZmljYXRpb24KLSAgLy8gVjQuMiwgVm9sIDIsIFBhcnQgNSwgU2VjdGlvbiA1LjQuMykgdG8gdGhlIEJsdWV0b290aCBjb250cm9sbGVyLgotICAvLyBQYWNrZXRzIG11c3QgYmUgcHJvY2Vzc2VkIGluIG9yZGVyLgotICB2aXJ0dWFsIHZvaWQgc2VuZFNjb0RhdGEoSGNpUGFja2V0IGRhdGEpID0gMDsKLQotICAvLyBTZW5kIGFuIEhDSSBJU08gZGF0YSBwYWNrZXQgKGFzIHNwZWNpZmllZCBpbiB0aGUgQmx1ZXRvb3RoIFNwZWNpZmljYXRpb24KLSAgLy8gVjUuMiwgVm9sIDQsIFBhcnQgRSwgU2VjdGlvbiA1LjQuNSkgdG8gdGhlIEJsdWV0b290aCBjb250cm9sbGVyLgotICAvLyBQYWNrZXRzIG11c3QgYmUgcHJvY2Vzc2VkIGluIG9yZGVyLgotICB2aXJ0dWFsIHZvaWQgc2VuZElzb0RhdGEoSGNpUGFja2V0IGRhdGEpID0gMDsKLX07Ci0vLyBMSU5ULlRoZW5DaGFuZ2UoZnV6ei9mdXp6X2hjaV9oYWwuaCkKLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGFsL2hjaV9oYWxfYW5kcm9pZF9oaWRsLmNjIGIvZ2QvaGFsL2hjaV9oYWxfYW5kcm9pZF9oaWRsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTkwOTQzLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9oY2lfaGFsX2FuZHJvaWRfaGlkbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ibHVldG9vdGgvMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ibHVldG9vdGgvMS4xL0lCbHVldG9vdGhIY2kuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2JsdWV0b290aC8xLjEvSUJsdWV0b290aEhjaUNhbGxiYWNrcy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJjb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImNvbW1vbi9zdG9wX3dhdGNoLmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLSNpbmNsdWRlICJoYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgImhhbC9zbm9vcF9sb2dnZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjpWMV8xOjpJQmx1ZXRvb3RoSGNpOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjpWMV8xOjpJQmx1ZXRvb3RoSGNpQ2FsbGJhY2tzOwotdXNpbmcgSGlkbFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6VjFfMDo6U3RhdHVzOwotdXNpbmcgSUJsdWV0b290aEhjaV8xXzAgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OlYxXzA6OklCbHVldG9vdGhIY2k7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBIY2lEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgLypjb29raWUqLywgY29uc3QgYW5kcm9pZDo6d3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qd2hvKi8pIHsKLSAgICBMT0dfRVJST1IoIkJsdWV0b290aCBIQUwgc2VydmljZSBkaWVkISIpOwotICAgIGNvbW1vbjo6U3RvcFdhdGNoOjpEdW1wU3RvcFdhdGNoTG9nKCk7Ci0gICAgYWJvcnQoKTsKLSAgfQotfTsKLQotYW5kcm9pZDo6c3A8SGNpRGVhdGhSZWNpcGllbnQ+IGhjaV9kZWF0aF9yZWNpcGllbnRfID0gbmV3IEhjaURlYXRoUmVjaXBpZW50KCk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBWZWNUeXBlPgotc3RkOjpzdHJpbmcgR2V0VGltZXJUZXh0KGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgVmVjVHlwZSB2ZWMpIHsKLSAgcmV0dXJuIGNvbW1vbjo6U3RyaW5nRm9ybWF0KAotICAgICAgIiVzOiBsZW4gJXp1LCAxc3QgNSBieXRlcyAnJXMnIiwKLSAgICAgIGZ1bmNfbmFtZSwKLSAgICAgIHZlYy5zaXplKCksCi0gICAgICBjb21tb246OlRvSGV4U3RyaW5nKHZlYy5iZWdpbigpLCBzdGQ6Om1pbih2ZWMuZW5kKCksIHZlYy5iZWdpbigpICsgNSkpLmNfc3RyKCkpOwotfQotCi1jbGFzcyBJbnRlcm5hbEhjaUNhbGxiYWNrcyA6IHB1YmxpYyBJQmx1ZXRvb3RoSGNpQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIEludGVybmFsSGNpQ2FsbGJhY2tzKGFjdGl2aXR5X2F0dHJpYnV0aW9uOjpBY3Rpdml0eUF0dHJpYnV0aW9uKiBidGFhX2xvZ2dlcl8sIFNub29wTG9nZ2VyKiBidHNub29wX2xvZ2dlcikKLSAgICAgIDogYnRhYV9sb2dnZXJfKGJ0YWFfbG9nZ2VyXyksIGJ0c25vb3BfbG9nZ2VyXyhidHNub29wX2xvZ2dlcikgewotICAgIGluaXRfcHJvbWlzZV8gPSBuZXcgc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIH0KLQotICB2b2lkIFNldENhbGxiYWNrKEhjaUhhbENhbGxiYWNrcyogY2FsbGJhY2spIHsKLSAgICBBU1NFUlQoY2FsbGJhY2tfID09IG51bGxwdHIgJiYgY2FsbGJhY2sgIT0gbnVsbHB0cik7Ci0gICAgY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gIH0KLQotICB2b2lkIFJlc2V0Q2FsbGJhY2soKSB7Ci0gICAgY2FsbGJhY2tfID0gbnVsbHB0cjsKLSAgfQotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiogR2V0SW5pdFByb21pc2UoKSB7Ci0gICAgcmV0dXJuIGluaXRfcHJvbWlzZV87Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gaW5pdGlhbGl6YXRpb25Db21wbGV0ZShIaWRsU3RhdHVzIHN0YXR1cykgewotICAgIGNvbW1vbjo6U3RvcFdhdGNoKF9fZnVuY19fKTsKLSAgICBBU1NFUlQoc3RhdHVzID09IEhpZGxTdGF0dXM6OlNVQ0NFU1MpOwotICAgIGluaXRfcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gaGNpRXZlbnRSZWNlaXZlZChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZXZlbnQpIG92ZXJyaWRlIHsKLSAgICBjb21tb246OlN0b3BXYXRjaChHZXRUaW1lclRleHQoX19mdW5jX18sIGV2ZW50KSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVjZWl2ZWRfaGNpX3BhY2tldChldmVudC5iZWdpbigpLCBldmVudC5lbmQoKSk7Ci0gICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkX2hjaV9wYWNrZXQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246OklOQ09NSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6RVZUKTsKLSAgICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpidGFhX2hjaV9pc19lbmFibGVkKCkpIHsKLSAgICAgIGJ0YWFfbG9nZ2VyXy0+Q2FwdHVyZShyZWNlaXZlZF9oY2lfcGFja2V0LCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6RVZUKTsKLSAgICB9Ci0gICAgaWYgKGNhbGxiYWNrXyAhPSBudWxscHRyKSB7Ci0gICAgICBjYWxsYmFja18tPmhjaUV2ZW50UmVjZWl2ZWQoc3RkOjptb3ZlKHJlY2VpdmVkX2hjaV9wYWNrZXQpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLSAgfQotCi0gIFJldHVybjx2b2lkPiBhY2xEYXRhUmVjZWl2ZWQoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIG92ZXJyaWRlIHsKLSAgICBjb21tb246OlN0b3BXYXRjaChHZXRUaW1lclRleHQoX19mdW5jX18sIGRhdGEpKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZWNlaXZlZF9oY2lfcGFja2V0KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7Ci0gICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkX2hjaV9wYWNrZXQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246OklOQ09NSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6QUNMKTsKLSAgICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpidGFhX2hjaV9pc19lbmFibGVkKCkpIHsKLSAgICAgIGJ0YWFfbG9nZ2VyXy0+Q2FwdHVyZShyZWNlaXZlZF9oY2lfcGFja2V0LCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6QUNMKTsKLSAgICB9Ci0gICAgaWYgKGNhbGxiYWNrXyAhPSBudWxscHRyKSB7Ci0gICAgICBjYWxsYmFja18tPmFjbERhdGFSZWNlaXZlZChzdGQ6Om1vdmUocmVjZWl2ZWRfaGNpX3BhY2tldCkpOwotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotICB9Ci0KLSAgUmV0dXJuPHZvaWQ+IHNjb0RhdGFSZWNlaXZlZChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSkgb3ZlcnJpZGUgewotICAgIGNvbW1vbjo6U3RvcFdhdGNoKEdldFRpbWVyVGV4dChfX2Z1bmNfXywgZGF0YSkpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlY2VpdmVkX2hjaV9wYWNrZXQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocmVjZWl2ZWRfaGNpX3BhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6SU5DT01JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpTQ08pOwotICAgIGlmIChjb21tb246OmluaXRfZmxhZ3M6OmJ0YWFfaGNpX2lzX2VuYWJsZWQoKSkgewotICAgICAgYnRhYV9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkX2hjaV9wYWNrZXQsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpTQ08pOwotICAgIH0KLSAgICBpZiAoY2FsbGJhY2tfICE9IG51bGxwdHIpIHsKLSAgICAgIGNhbGxiYWNrXy0+c2NvRGF0YVJlY2VpdmVkKHN0ZDo6bW92ZShyZWNlaXZlZF9oY2lfcGFja2V0KSk7Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gaXNvRGF0YVJlY2VpdmVkKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSBvdmVycmlkZSB7Ci0gICAgY29tbW9uOjpTdG9wV2F0Y2goR2V0VGltZXJUZXh0KF9fZnVuY19fLCBkYXRhKSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVjZWl2ZWRfaGNpX3BhY2tldChkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpOwotICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShyZWNlaXZlZF9oY2lfcGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpJTkNPTUlORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OklTTyk7Ci0gICAgaWYgKGNhbGxiYWNrXyAhPSBudWxscHRyKSB7Ci0gICAgICBjYWxsYmFja18tPmlzb0RhdGFSZWNlaXZlZChzdGQ6Om1vdmUocmVjZWl2ZWRfaGNpX3BhY2tldCkpOwotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnByb21pc2U8dm9pZD4qIGluaXRfcHJvbWlzZV8gPSBudWxscHRyOwotICBIY2lIYWxDYWxsYmFja3MqIGNhbGxiYWNrXyA9IG51bGxwdHI7Ci0gIGFjdGl2aXR5X2F0dHJpYnV0aW9uOjpBY3Rpdml0eUF0dHJpYnV0aW9uKiBidGFhX2xvZ2dlcl8gPSBudWxscHRyOwotICBTbm9vcExvZ2dlciogYnRzbm9vcF9sb2dnZXJfID0gbnVsbHB0cjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBIY2lIYWxIaWRsIDogcHVibGljIEhjaUhhbCB7Ci0gcHVibGljOgotICB2b2lkIHJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjayhIY2lIYWxDYWxsYmFja3MqIGNhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgY2FsbGJhY2tzXy0+U2V0Q2FsbGJhY2soY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCB1bnJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjaygpIG92ZXJyaWRlIHsKLSAgICBjYWxsYmFja3NfLT5SZXNldENhbGxiYWNrKCk7Ci0gIH0KLQotICB2b2lkIHNlbmRIY2lDb21tYW5kKEhjaVBhY2tldCBjb21tYW5kKSBvdmVycmlkZSB7Ci0gICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKGNvbW1hbmQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6Q01EKTsKLSAgICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpidGFhX2hjaV9pc19lbmFibGVkKCkpIHsKLSAgICAgIGJ0YWFfbG9nZ2VyXy0+Q2FwdHVyZShjb21tYW5kLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6Q01EKTsKLSAgICB9Ci0gICAgYnRfaGNpXy0+c2VuZEhjaUNvbW1hbmQoY29tbWFuZCk7Ci0gIH0KLQotICB2b2lkIHNlbmRBY2xEYXRhKEhjaVBhY2tldCBwYWNrZXQpIG92ZXJyaWRlIHsKLSAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpPVVRHT0lORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkFDTCk7Ci0gICAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6YnRhYV9oY2lfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICBidGFhX2xvZ2dlcl8tPkNhcHR1cmUocGFja2V0LCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6QUNMKTsKLSAgICB9Ci0gICAgYnRfaGNpXy0+c2VuZEFjbERhdGEocGFja2V0KTsKLSAgfQotCi0gIHZvaWQgc2VuZFNjb0RhdGEoSGNpUGFja2V0IHBhY2tldCkgb3ZlcnJpZGUgewotICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShwYWNrZXQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6U0NPKTsKLSAgICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpidGFhX2hjaV9pc19lbmFibGVkKCkpIHsKLSAgICAgIGJ0YWFfbG9nZ2VyXy0+Q2FwdHVyZShwYWNrZXQsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpTQ08pOwotICAgIH0KLSAgICBidF9oY2lfLT5zZW5kU2NvRGF0YShwYWNrZXQpOwotICB9Ci0KLSAgdm9pZCBzZW5kSXNvRGF0YShIY2lQYWNrZXQgcGFja2V0KSBvdmVycmlkZSB7Ci0gICAgaWYgKGJ0X2hjaV8xXzFfID09IG51bGxwdHIpIHsKLSAgICAgIExPR19FUlJPUigiSVNPIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSEFMIHYxLjAiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpPVVRHT0lORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OklTTyk7Ci0gICAgYnRfaGNpXzFfMV8tPnNlbmRJc29EYXRhKHBhY2tldCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgICBsaXN0LT5hZGQ8U25vb3BMb2dnZXI+KCk7Ci0gICAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6YnRhYV9oY2lfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICBsaXN0LT5hZGQ8YWN0aXZpdHlfYXR0cmlidXRpb246OkFjdGl2aXR5QXR0cmlidXRpb24+KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHsKLSAgICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpidGFhX2hjaV9pc19lbmFibGVkKCkpIHsKLSAgICAgIGJ0YWFfbG9nZ2VyXyA9IEdldERlcGVuZGVuY3k8YWN0aXZpdHlfYXR0cmlidXRpb246OkFjdGl2aXR5QXR0cmlidXRpb24+KCk7Ci0gICAgfQotICAgIGJ0c25vb3BfbG9nZ2VyXyA9IEdldERlcGVuZGVuY3k8U25vb3BMb2dnZXI+KCk7Ci0KLSAgICBidF9oY2lfMV8xXyA9IElCbHVldG9vdGhIY2k6OmdldFNlcnZpY2UoKTsKLQotICAgIGlmIChidF9oY2lfMV8xXyAhPSBudWxscHRyKSB7Ci0gICAgICBidF9oY2lfID0gYnRfaGNpXzFfMV87Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ0X2hjaV8gPSBJQmx1ZXRvb3RoSGNpXzFfMDo6Z2V0U2VydmljZSgpOwotICAgIH0KLQotICAgIEFTU0VSVChidF9oY2lfICE9IG51bGxwdHIpOwotICAgIGF1dG8gZGVhdGhfbGluayA9IGJ0X2hjaV8tPmxpbmtUb0RlYXRoKGhjaV9kZWF0aF9yZWNpcGllbnRfLCAwKTsKLSAgICBBU1NFUlRfTE9HKGRlYXRoX2xpbmsuaXNPaygpLCAiVW5hYmxlIHRvIHNldCB0aGUgZGVhdGggcmVjaXBpZW50IGZvciB0aGUgQmx1ZXRvb3RoIEhBTCIpOwotICAgIC8vIEJsb2NrIGFsbG93cyBhbGxvY2F0aW9uIG9mIGEgdmFyaWFibGUgdGhhdCBtaWdodCBiZSBieXBhc3NlZCBieSBnb3RvLgotICAgIHsKLSAgICAgIGNhbGxiYWNrc18gPSBuZXcgSW50ZXJuYWxIY2lDYWxsYmFja3MoYnRhYV9sb2dnZXJfLCBidHNub29wX2xvZ2dlcl8pOwotICAgICAgaWYgKGJ0X2hjaV8xXzFfICE9IG51bGxwdHIpIHsKLSAgICAgICAgYnRfaGNpXzFfMV8tPmluaXRpYWxpemVfMV8xKGNhbGxiYWNrc18pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnRfaGNpXy0+aW5pdGlhbGl6ZShjYWxsYmFja3NfKTsKLSAgICAgIH0KLQotICAgICAgLy8gRG9uJ3QgdGltZW91dCBoZXJlLCB0aW1lIG91dCBhdCBhIGhpZ2hlciBsYXllcgotICAgICAgY2FsbGJhY2tzXy0+R2V0SW5pdFByb21pc2UoKS0+Z2V0X2Z1dHVyZSgpLndhaXQoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFN0b3AoKSBvdmVycmlkZSB7Ci0gICAgQVNTRVJUKGJ0X2hjaV8gIT0gbnVsbHB0cik7Ci0gICAgYXV0byBkZWF0aF91bmxpbmsgPSBidF9oY2lfLT51bmxpbmtUb0RlYXRoKGhjaV9kZWF0aF9yZWNpcGllbnRfKTsKLSAgICBpZiAoIWRlYXRoX3VubGluay5pc09rKCkpIHsKLSAgICAgIExPR19FUlJPUigiRXJyb3IgdW5saW5raW5nIGRlYXRoIHJlY2lwaWVudCBmcm9tIHRoZSBCbHVldG9vdGggSEFMIik7Ci0gICAgfQotICAgIGJ0X2hjaV8tPmNsb3NlKCk7Ci0gICAgY2FsbGJhY2tzXy0+UmVzZXRDYWxsYmFjaygpOwotICAgIGJ0X2hjaV8gPSBudWxscHRyOwotICAgIGJ0X2hjaV8xXzFfID0gbnVsbHB0cjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiSGNpSGFsSGlkbCIpOwotICB9Ci0KLSBwcml2YXRlOgotICBhbmRyb2lkOjpzcDxJbnRlcm5hbEhjaUNhbGxiYWNrcz4gY2FsbGJhY2tzXzsKLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEhjaV8xXzA+IGJ0X2hjaV87Ci0gIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhIY2k+IGJ0X2hjaV8xXzFfOwotICBhY3Rpdml0eV9hdHRyaWJ1dGlvbjo6QWN0aXZpdHlBdHRyaWJ1dGlvbiogYnRhYV9sb2dnZXJfOwotICBTbm9vcExvZ2dlciogYnRzbm9vcF9sb2dnZXJfOwotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBIY2lIYWw6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEhjaUhhbEhpZGwoKTsgfSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hhbC9oY2lfaGFsX2FuZHJvaWRfaGlkbF90ZXN0LmNjIGIvZ2QvaGFsL2hjaV9oYWxfYW5kcm9pZF9oaWRsX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZGZmNTguLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2hjaV9oYWxfYW5kcm9pZF9oaWRsX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJoYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotCi11c2luZyA6OmJsdWV0b290aDo6b3M6OlRocmVhZDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIEhjaUhhbEhpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgVGhyZWFkKCJ0ZXN0X3RocmVhZCIsIFRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgTW9kdWxlUmVnaXN0cnkgZmFrZV9yZWdpc3RyeV87Ci0gIFRocmVhZCogdGhyZWFkXzsKLX07Ci0KLVRFU1RfRihIY2lIYWxIaWRsVGVzdCwgaW5pdF9hbmRfY2xvc2UpIHsKLSAgZmFrZV9yZWdpc3RyeV8uU3RhcnQ8SGNpSGFsPih0aHJlYWRfKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3RvcEFsbCgpOwotfQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvaGNpX2hhbF9ob3N0LmNjIGIvZ2QvaGFsL2hjaV9oYWxfaG9zdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1MWQyOC4uMDAwMDAwMAotLS0gYS9nZC9oYWwvaGNpX2hhbF9ob3N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoYWwvaGNpX2hhbF9ob3N0LmgiCi0KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzaWduYWw+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJoYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgImhhbC9zbm9vcF9sb2dnZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy9yZWFjdG9yLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLW5hbWVzcGFjZSB7Ci1jb25zdGV4cHIgaW50IElOVkFMSURfRkQgPSAtMTsKLQotY29uc3RleHByIHVpbnQ4X3Qga0g0Q29tbWFuZCA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrSDRBY2wgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3Qga0g0U2NvID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtINEV2ZW50ID0gMHgwNDsKLWNvbnN0ZXhwciB1aW50OF90IGtINElzbyA9IDB4MDU7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtINEhlYWRlclNpemUgPSAxOwotY29uc3RleHByIHVpbnQ4X3Qga0hjaUFjbEhlYWRlclNpemUgPSA0OwotY29uc3RleHByIHVpbnQ4X3Qga0hjaVNjb0hlYWRlclNpemUgPSAzOwotY29uc3RleHByIHVpbnQ4X3Qga0hjaUV2dEhlYWRlclNpemUgPSAyOwotY29uc3RleHByIHVpbnQ4X3Qga0hjaUlzb0hlYWRlclNpemUgPSA0OwotY29uc3RleHByIGludCBrQnVmU2l6ZSA9IDEwMjQgKyA0ICsgMTsgIC8vIERldmljZVByb3BlcnRpZXM6OmFjbF9kYXRhX3BhY2tldF9zaXplXyArIEFDTCBoZWFkZXIgKyBINCBoZWFkZXIKLQotY29uc3RleHByIHVpbnQ4X3QgQlRQUk9UT19IQ0kgPSAxOwotY29uc3RleHByIHVpbnQxNl90IEhDSV9DSEFOTkVMX1VTRVIgPSAxOwotY29uc3RleHByIHVpbnQxNl90IEhDSV9DSEFOTkVMX0NPTlRST0wgPSAzOwotY29uc3RleHByIHVpbnQxNl90IEhDSV9ERVZfTk9ORSA9IDB4ZmZmZjsKLQotLyogcmVmZXJlbmNlIGZyb20gPGtlcm5lbD4vaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaCAqLwotI2RlZmluZSBNR01UX09QX0lOREVYX0xJU1QgMHgwMDAzCi0jZGVmaW5lIE1HTVRfRVZfSU5ERVhfQURERUQgMHgwMDA0Ci0jZGVmaW5lIE1HTVRfRVZfQ09NTUFORF9DT01QIDB4MDAwMQotI2RlZmluZSBNR01UX0VWX1NJWkVfTUFYIDEwMjQKLSNkZWZpbmUgV1JJVEVfTk9fSU5UUihmbikgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKChmbikgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0KLXN0cnVjdCBzb2NrYWRkcl9oY2kgewotICBzYV9mYW1pbHlfdCBoY2lfZmFtaWx5OwotICB1bnNpZ25lZCBzaG9ydCBoY2lfZGV2OwotICB1bnNpZ25lZCBzaG9ydCBoY2lfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBtZ210X3BrdCB7Ci0gIHVpbnQxNl90IG9wY29kZTsKLSAgdWludDE2X3QgaW5kZXg7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCBkYXRhW01HTVRfRVZfU0laRV9NQVhdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IG1nbXRfZXZlbnRfcmVhZF9pbmRleCB7Ci0gIHVpbnQxNl90IGNjX29wY29kZTsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IG51bV9pbnRmOwotICB1aW50MTZfdCBpbmRleFswXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLWludCB3YWl0SGNpRGV2KGludCBoY2lfaW50ZXJmYWNlKSB7Ci0gIHN0cnVjdCBzb2NrYWRkcl9oY2kgYWRkcjsKLSAgc3RydWN0IHBvbGxmZCBmZHNbMV07Ci0gIHN0cnVjdCBtZ210X3BrdCBldjsKLSAgaW50IGZkOwotICBpbnQgcmV0ID0gMDsKLQotICBmZCA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfUkFXLCBCVFBST1RPX0hDSSk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICBMT0dfRVJST1IoIkJsdWV0b290aCBzb2NrZXQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICBhZGRyLmhjaV9mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gIGFkZHIuaGNpX2RldiA9IEhDSV9ERVZfTk9ORTsKLSAgYWRkci5oY2lfY2hhbm5lbCA9IEhDSV9DSEFOTkVMX0NPTlRST0w7Ci0gIGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICBMT0dfRVJST1IoIkhDSSBDaGFubmVsIENvbnRyb2w6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgZmRzWzBdLmZkID0gZmQ7Ci0gIGZkc1swXS5ldmVudHMgPSBQT0xMSU47Ci0KLSAgLyogUmVhZCBDb250cm9sbGVyIEluZGV4IExpc3QgQ29tbWFuZCAqLwotICBldi5vcGNvZGUgPSBNR01UX09QX0lOREVYX0xJU1Q7Ci0gIGV2LmluZGV4ID0gSENJX0RFVl9OT05FOwotICBldi5sZW4gPSAwOwotCi0gIHNzaXplX3Qgd3JvdGU7Ci0gIFdSSVRFX05PX0lOVFIod3JvdGUgPSB3cml0ZShmZCwgJmV2LCA2KSk7Ci0gIGlmICh3cm90ZSAhPSA2KSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gd3JpdGUgbWdtdCBjb21tYW5kOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiAtMTsKLSAgfQotICAvKiB2YWxpZGF0ZSBtZW50aW9uZWQgaGNpIGludGVyZmFjZSBpcyBwcmVzZW50IGFuZCByZWdpc3RlcmVkIHdpdGggc29jayBzeXN0ZW0gKi8KLSAgd2hpbGUgKDEpIHsKLSAgICBpbnQgbjsKLSAgICBXUklURV9OT19JTlRSKG4gPSBwb2xsKGZkcywgMSwgLTEpKTsKLSAgICBpZiAobiA9PSAtMSkgewotICAgICAgTE9HX0VSUk9SKCJQb2xsIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICByZXQgPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICBMT0dfRVJST1IoIlRpbWVvdXQsIG5vIEhDSSBkZXZpY2UgZGV0ZWN0ZWQiKTsKLSAgICAgIHJldCA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSB7Ci0gICAgICBXUklURV9OT19JTlRSKG4gPSByZWFkKGZkLCAmZXYsIHNpemVvZihzdHJ1Y3QgbWdtdF9wa3QpKSk7Ci0gICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZWFkaW5nIGNvbnRyb2wgY2hhbm5lbDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChldi5vcGNvZGUgPT0gTUdNVF9FVl9JTkRFWF9BRERFRCAmJiBldi5pbmRleCA9PSBoY2lfaW50ZXJmYWNlKSB7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfSBlbHNlIGlmIChldi5vcGNvZGUgPT0gTUdNVF9FVl9DT01NQU5EX0NPTVApIHsKLSAgICAgICAgc3RydWN0IG1nbXRfZXZlbnRfcmVhZF9pbmRleCogY2M7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGNjID0gKHN0cnVjdCBtZ210X2V2ZW50X3JlYWRfaW5kZXgqKWV2LmRhdGE7Ci0KLSAgICAgICAgaWYgKGNjLT5jY19vcGNvZGUgIT0gTUdNVF9PUF9JTkRFWF9MSVNUIHx8IGNjLT5zdGF0dXMgIT0gMCkgY29udGludWU7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNjLT5udW1faW50ZjsgaSsrKSB7Ci0gICAgICAgICAgaWYgKGNjLT5pbmRleFtpXSA9PSBoY2lfaW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbG9zZShmZCk7Ci0gIHJldHVybiAtMTsKLX0KLQotLy8gQ29ubmVjdCB0byBMaW51eCBIQ0kgc29ja2V0Ci1pbnQgQ29ubmVjdFRvU29ja2V0KCkgewotICBpbnQgc29ja2V0X2ZkID0gc29ja2V0KEFGX0JMVUVUT09USCwgU09DS19SQVcsIEJUUFJPVE9fSENJKTsKLSAgaWYgKHNvY2tldF9mZCA8IDEpIHsKLSAgICBMT0dfRVJST1IoImNhbid0IGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gSU5WQUxJRF9GRDsKLSAgfQotCi0gIGludCBoY2lfaW50ZXJmYWNlID0gMDsgIC8vIEFzc3VtZSB3ZSBvbmx5IGhhdmUgSENJIDAKLQotICBpZiAod2FpdEhjaURldihoY2lfaW50ZXJmYWNlKSAhPSAwKSB7Ci0gICAgOjpjbG9zZShzb2NrZXRfZmQpOwotICAgIHJldHVybiBJTlZBTElEX0ZEOwotICB9Ci0KLSAgc3RydWN0IHNvY2thZGRyX2hjaSBhZGRyOwotICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gIGFkZHIuaGNpX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgYWRkci5oY2lfZGV2ID0gaGNpX2ludGVyZmFjZTsKLSAgYWRkci5oY2lfY2hhbm5lbCA9IEhDSV9DSEFOTkVMX1VTRVI7Ci0gIGlmIChiaW5kKHNvY2tldF9mZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgTE9HX0VSUk9SKCJIQ0kgQ2hhbm5lbCBDb250cm9sOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgOjpjbG9zZShzb2NrZXRfZmQpOwotICAgIHJldHVybiBJTlZBTElEX0ZEOwotICB9Ci0gIExPR19JTkZPKCJIQ0kgZGV2aWNlIHJlYWR5Iik7Ci0gIHJldHVybiBzb2NrZXRfZmQ7Ci19Ci19Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIEhjaUhhbEhvc3QgOiBwdWJsaWMgSGNpSGFsIHsKLSBwdWJsaWM6Ci0gIHZvaWQgcmVnaXN0ZXJJbmNvbWluZ1BhY2tldENhbGxiYWNrKEhjaUhhbENhbGxiYWNrcyogY2FsbGJhY2spIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBMT0dfSU5GTygiJXMgYmVmb3JlIiwgX19mdW5jX18pOwotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgIEFTU0VSVChpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID09IG51bGxwdHIgJiYgY2FsbGJhY2sgIT0gbnVsbHB0cik7Ci0gICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIExPR19JTkZPKCIlcyBhZnRlciIsIF9fZnVuY19fKTsKLSAgfQotCi0gIHZvaWQgdW5yZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXBpX211dGV4Xyk7Ci0gICAgTE9HX0lORk8oIiVzIGJlZm9yZSIsIF9fZnVuY19fKTsKLSAgICB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX2xvY2soaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX211dGV4Xyk7Ci0gICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgTE9HX0lORk8oIiVzIGFmdGVyIiwgX19mdW5jX18pOwotICB9Ci0KLSAgdm9pZCBzZW5kSGNpQ29tbWFuZChIY2lQYWNrZXQgY29tbWFuZCkgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFwaV9tdXRleF8pOwotICAgIEFTU0VSVChzb2NrX2ZkXyAhPSBJTlZBTElEX0ZEKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQgPSBzdGQ6Om1vdmUoY29tbWFuZCk7Ci0gICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHBhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpDTUQpOwotICAgIHBhY2tldC5pbnNlcnQocGFja2V0LmNiZWdpbigpLCBrSDRDb21tYW5kKTsKLSAgICB3cml0ZV90b19mZChwYWNrZXQpOwotICB9Ci0KLSAgdm9pZCBzZW5kQWNsRGF0YShIY2lQYWNrZXQgZGF0YSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFwaV9tdXRleF8pOwotICAgIEFTU0VSVChzb2NrX2ZkXyAhPSBJTlZBTElEX0ZEKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQgPSBzdGQ6Om1vdmUoZGF0YSk7Ci0gICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHBhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpBQ0wpOwotICAgIHBhY2tldC5pbnNlcnQocGFja2V0LmNiZWdpbigpLCBrSDRBY2wpOwotICAgIHdyaXRlX3RvX2ZkKHBhY2tldCk7Ci0gIH0KLQotICB2b2lkIHNlbmRTY29EYXRhKEhjaVBhY2tldCBkYXRhKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXBpX211dGV4Xyk7Ci0gICAgQVNTRVJUKHNvY2tfZmRfICE9IElOVkFMSURfRkQpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCA9IHN0ZDo6bW92ZShkYXRhKTsKLSAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpPVVRHT0lORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OlNDTyk7Ci0gICAgcGFja2V0Lmluc2VydChwYWNrZXQuY2JlZ2luKCksIGtINFNjbyk7Ci0gICAgd3JpdGVfdG9fZmQocGFja2V0KTsKLSAgfQotCi0gIHZvaWQgc2VuZElzb0RhdGEoSGNpUGFja2V0IGRhdGEpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBBU1NFUlQoc29ja19mZF8gIT0gSU5WQUxJRF9GRCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0ID0gc3RkOjptb3ZlKGRhdGEpOwotICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShwYWNrZXQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6SVNPKTsKLSAgICBwYWNrZXQuaW5zZXJ0KHBhY2tldC5jYmVnaW4oKSwga0g0SXNvKTsKLSAgICB3cml0ZV90b19mZChwYWNrZXQpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gICAgbGlzdC0+YWRkPFNub29wTG9nZ2VyPigpOwotICB9Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBBU1NFUlQoc29ja19mZF8gPT0gSU5WQUxJRF9GRCk7Ci0gICAgc29ja19mZF8gPSBDb25uZWN0VG9Tb2NrZXQoKTsKLSAgICBBU1NFUlQoc29ja19mZF8gIT0gSU5WQUxJRF9GRCk7Ci0gICAgcmVhY3RhYmxlXyA9IGhjaV9pbmNvbWluZ190aHJlYWRfLkdldFJlYWN0b3IoKS0+UmVnaXN0ZXIoCi0gICAgICAgIHNvY2tfZmRfLCBjb21tb246OkJpbmQoJkhjaUhhbEhvc3Q6OmluY29taW5nX3BhY2tldF9yZWNlaXZlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgY29tbW9uOjpDbG9zdXJlKCkpOwotICAgIGJ0c25vb3BfbG9nZ2VyXyA9IEdldERlcGVuZGVuY3k8U25vb3BMb2dnZXI+KCk7Ci0gICAgTE9HX0lORk8oIkhBTCBvcGVuZWQgc3VjY2Vzc2Z1bGx5Iik7Ci0gIH0KLQotICB2b2lkIFN0b3AoKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXBpX211dGV4Xyk7Ci0gICAgTE9HX0lORk8oIkhBTCBpcyBjbG9zaW5nIik7Ci0gICAgaWYgKHJlYWN0YWJsZV8gIT0gbnVsbHB0cikgewotICAgICAgaGNpX2luY29taW5nX3RocmVhZF8uR2V0UmVhY3RvcigpLT5VbnJlZ2lzdGVyKHJlYWN0YWJsZV8pOwotICAgICAgTE9HX0lORk8oIkhBTCBpcyBzdG9wcGluZywgc3RhcnQgd2FpdGluZyBmb3IgbGFzdCBjYWxsYmFjayIpOwotICAgICAgLy8gV2FpdCB1cCB0byAxIHNlY29uZCBmb3IgdGhlIGxhc3QgaW5jb21pbmcgcGFja2V0IGNhbGxiYWNrIHRvIGZpbmlzaAotICAgICAgaGNpX2luY29taW5nX3RocmVhZF8uR2V0UmVhY3RvcigpLT5XYWl0Rm9yVW5yZWdpc3RlcmVkUmVhY3RhYmxlKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCkpOwotICAgICAgTE9HX0lORk8oIkhBTCBpcyBzdG9wcGluZywgZmluaXNoZWQgd2FpdGluZyBmb3IgbGFzdCBjYWxsYmFjayIpOwotICAgICAgQVNTRVJUKHNvY2tfZmRfICE9IElOVkFMSURfRkQpOwotICAgIH0KLSAgICByZWFjdGFibGVfID0gbnVsbHB0cjsKLSAgICB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX2xvY2soaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX211dGV4Xyk7Ci0gICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgOjpjbG9zZShzb2NrX2ZkXyk7Ci0gICAgc29ja19mZF8gPSBJTlZBTElEX0ZEOwotICAgIExPR19JTkZPKCJIQUwgaXMgY2xvc2VkIik7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkhjaUhhbEhvc3QiKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gSGVsZCB3aGVuIEFQSXMgYXJlIGNhbGxlZCwgTk9UIHRvIGJlIGhlbGQgZHVyaW5nIGNhbGxiYWNrcwotICBzdGQ6Om11dGV4IGFwaV9tdXRleF87Ci0gIEhjaUhhbENhbGxiYWNrcyogaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrXyA9IG51bGxwdHI7Ci0gIHN0ZDo6bXV0ZXggaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX211dGV4XzsKLSAgaW50IHNvY2tfZmRfID0gSU5WQUxJRF9GRDsKLSAgYmx1ZXRvb3RoOjpvczo6VGhyZWFkIGhjaV9pbmNvbWluZ190aHJlYWRfID0KLSAgICAgIGJsdWV0b290aDo6b3M6OlRocmVhZCgiaGNpX2luY29taW5nX3RocmVhZCIsIGJsdWV0b290aDo6b3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gIGJsdWV0b290aDo6b3M6OlJlYWN0b3I6OlJlYWN0YWJsZSogcmVhY3RhYmxlXyA9IG51bGxwdHI7Ci0gIHN0ZDo6cXVldWU8c3RkOjp2ZWN0b3I8dWludDhfdD4+IGhjaV9vdXRnb2luZ19xdWV1ZV87Ci0gIFNub29wTG9nZ2VyKiBidHNub29wX2xvZ2dlcl8gPSBudWxscHRyOwotCi0gIHZvaWQgd3JpdGVfdG9fZmQoSGNpUGFja2V0IHBhY2tldCkgewotICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIG5ldyBxdWV1ZSB3aGVuIGl0J3MgcmVhZHkKLSAgICBoY2lfb3V0Z29pbmdfcXVldWVfLmVtcGxhY2UocGFja2V0KTsKLSAgICBpZiAoaGNpX291dGdvaW5nX3F1ZXVlXy5zaXplKCkgPT0gMSkgewotICAgICAgaGNpX2luY29taW5nX3RocmVhZF8uR2V0UmVhY3RvcigpLT5Nb2RpZnlSZWdpc3RyYXRpb24oCi0gICAgICAgICAgcmVhY3RhYmxlXywKLSAgICAgICAgICBjb21tb246OkJpbmQoJkhjaUhhbEhvc3Q6OmluY29taW5nX3BhY2tldF9yZWNlaXZlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICBjb21tb246OkJpbmQoJkhjaUhhbEhvc3Q6OnNlbmRfcGFja2V0X3JlYWR5LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNlbmRfcGFja2V0X3JlYWR5KCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHRoaXMtPmFwaV9tdXRleF8pOwotICAgIGF1dG8gcGFja2V0X3RvX3NlbmQgPSB0aGlzLT5oY2lfb3V0Z29pbmdfcXVldWVfLmZyb250KCk7Ci0gICAgYXV0byBieXRlc193cml0dGVuID0gd3JpdGUodGhpcy0+c29ja19mZF8sICh2b2lkKilwYWNrZXRfdG9fc2VuZC5kYXRhKCksIHBhY2tldF90b19zZW5kLnNpemUoKSk7Ci0gICAgdGhpcy0+aGNpX291dGdvaW5nX3F1ZXVlXy5wb3AoKTsKLSAgICBpZiAoYnl0ZXNfd3JpdHRlbiA9PSAtMSkgewotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gICAgaWYgKGhjaV9vdXRnb2luZ19xdWV1ZV8uZW1wdHkoKSkgewotICAgICAgdGhpcy0+aGNpX2luY29taW5nX3RocmVhZF8uR2V0UmVhY3RvcigpLT5Nb2RpZnlSZWdpc3RyYXRpb24oCi0gICAgICAgICAgdGhpcy0+cmVhY3RhYmxlXywKLSAgICAgICAgICBjb21tb246OkJpbmQoJkhjaUhhbEhvc3Q6OmluY29taW5nX3BhY2tldF9yZWNlaXZlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICBjb21tb246OkNsb3N1cmUoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBpbmNvbWluZ19wYWNrZXRfcmVjZWl2ZWQoKSB7Ci0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGluY29taW5nX3BhY2tldF9jYWxsYmFja19sb2NrKGluY29taW5nX3BhY2tldF9jYWxsYmFja19tdXRleF8pOwotICAgICAgaWYgKGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPT0gbnVsbHB0cikgewotICAgICAgICBMT0dfSU5GTygiRHJvcHBpbmcgYSBwYWNrZXQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICB1aW50OF90IGJ1ZltrQnVmU2l6ZV0gPSB7fTsKLQotICAgIHNzaXplX3QgcmVjZWl2ZWRfc2l6ZTsKLSAgICBSVU5fTk9fSU5UUihyZWNlaXZlZF9zaXplID0gcmVhZChzb2NrX2ZkXywgYnVmLCBrQnVmU2l6ZSkpOwotICAgIEFTU0VSVF9MT0cocmVjZWl2ZWRfc2l6ZSAhPSAtMSwgIkNhbid0IHJlY2VpdmUgZnJvbSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBpZiAocmVjZWl2ZWRfc2l6ZSA9PSAwKSB7Ci0gICAgICBMT0dfV0FSTigiQ2FuJ3QgcmVhZCBINCBoZWFkZXIuIEVPRiByZWNlaXZlZCIpOwotICAgICAgcmFpc2UoU0lHSU5UKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYnVmWzBdID09IGtINEV2ZW50KSB7Ci0gICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgIHJlY2VpdmVkX3NpemUgPj0ga0g0SGVhZGVyU2l6ZSArIGtIY2lFdnRIZWFkZXJTaXplLCAiUmVjZWl2ZWQgYmFkIEhDSV9FVlQgcGFja2V0IHNpemU6ICV6dSIsIHJlY2VpdmVkX3NpemUpOwotICAgICAgdWludDhfdCBoY2lfZXZ0X3BhcmFtZXRlcl90b3RhbF9sZW5ndGggPSBidWZbMl07Ci0gICAgICBzc2l6ZV90IHBheWxvYWRfc2l6ZSA9IHJlY2VpdmVkX3NpemUgLSAoa0g0SGVhZGVyU2l6ZSArIGtIY2lFdnRIZWFkZXJTaXplKTsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgcGF5bG9hZF9zaXplID09IGhjaV9ldnRfcGFyYW1ldGVyX3RvdGFsX2xlbmd0aCwKLSAgICAgICAgICAibWFsZm9ybWVkIEhDSSBldmVudCB0b3RhbCBwYXJhbWV0ZXIgc2l6ZSByZWNlaXZlZDogJXp1ICE9ICVkIiwKLSAgICAgICAgICBwYXlsb2FkX3NpemUsCi0gICAgICAgICAgaGNpX2V2dF9wYXJhbWV0ZXJfdG90YWxfbGVuZ3RoKTsKLQotICAgICAgSGNpUGFja2V0IHJlY2VpdmVkSGNpUGFja2V0OwotICAgICAgcmVjZWl2ZWRIY2lQYWNrZXQuYXNzaWduKGJ1ZiArIGtINEhlYWRlclNpemUsIGJ1ZiArIGtINEhlYWRlclNpemUgKyBrSGNpRXZ0SGVhZGVyU2l6ZSArIHBheWxvYWRfc2l6ZSk7Ci0gICAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocmVjZWl2ZWRIY2lQYWNrZXQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246OklOQ09NSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6RVZUKTsKLSAgICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGluY29taW5nX3BhY2tldF9jYWxsYmFja19sb2NrKGluY29taW5nX3BhY2tldF9jYWxsYmFja19tdXRleF8pOwotICAgICAgICBpZiAoaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrXyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgTE9HX0lORk8oIkRyb3BwaW5nIGFuIGV2ZW50IGFmdGVyIHByb2Nlc3NpbmciKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrXy0+aGNpRXZlbnRSZWNlaXZlZChyZWNlaXZlZEhjaVBhY2tldCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJ1ZlswXSA9PSBrSDRBY2wpIHsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgcmVjZWl2ZWRfc2l6ZSA+PSBrSDRIZWFkZXJTaXplICsga0hjaUFjbEhlYWRlclNpemUsICJSZWNlaXZlZCBiYWQgSENJX0FDTCBwYWNrZXQgc2l6ZTogJXp1IiwgcmVjZWl2ZWRfc2l6ZSk7Ci0gICAgICBpbnQgcGF5bG9hZF9zaXplID0gcmVjZWl2ZWRfc2l6ZSAtIChrSDRIZWFkZXJTaXplICsga0hjaUFjbEhlYWRlclNpemUpOwotICAgICAgdWludDE2X3QgaGNpX2FjbF9kYXRhX3RvdGFsX2xlbmd0aCA9IChidWZbNF0gPDwgOCkgKyBidWZbM107Ci0gICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgIHBheWxvYWRfc2l6ZSA9PSBoY2lfYWNsX2RhdGFfdG90YWxfbGVuZ3RoLAotICAgICAgICAgICJtYWxmb3JtZWQgQUNMIGxlbmd0aCByZWNlaXZlZDogJWQgIT0gJWQiLAotICAgICAgICAgIHBheWxvYWRfc2l6ZSwKLSAgICAgICAgICBoY2lfYWNsX2RhdGFfdG90YWxfbGVuZ3RoKTsKLSAgICAgIEFTU0VSVF9MT0coaGNpX2FjbF9kYXRhX3RvdGFsX2xlbmd0aCA8PSBrQnVmU2l6ZSAtIGtINEhlYWRlclNpemUgLSBrSGNpQWNsSGVhZGVyU2l6ZSwgInBhY2tldCB0b28gbG9uZyIpOwotCi0gICAgICBIY2lQYWNrZXQgcmVjZWl2ZWRIY2lQYWNrZXQ7Ci0gICAgICByZWNlaXZlZEhjaVBhY2tldC5hc3NpZ24oYnVmICsga0g0SGVhZGVyU2l6ZSwgYnVmICsga0g0SGVhZGVyU2l6ZSArIGtIY2lBY2xIZWFkZXJTaXplICsgcGF5bG9hZF9zaXplKTsKLSAgICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShyZWNlaXZlZEhjaVBhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6SU5DT01JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpBQ0wpOwotICAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX2xvY2soaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX211dGV4Xyk7Ci0gICAgICAgIGlmIChpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID09IG51bGxwdHIpIHsKLSAgICAgICAgICBMT0dfSU5GTygiRHJvcHBpbmcgYW4gQUNMIHBhY2tldCBhZnRlciBwcm9jZXNzaW5nIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGluY29taW5nX3BhY2tldF9jYWxsYmFja18tPmFjbERhdGFSZWNlaXZlZChyZWNlaXZlZEhjaVBhY2tldCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJ1ZlswXSA9PSBrSDRTY28pIHsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgcmVjZWl2ZWRfc2l6ZSA+PSBrSDRIZWFkZXJTaXplICsga0hjaVNjb0hlYWRlclNpemUsICJSZWNlaXZlZCBiYWQgSENJX1NDTyBwYWNrZXQgc2l6ZTogJXp1IiwgcmVjZWl2ZWRfc2l6ZSk7Ci0gICAgICBpbnQgcGF5bG9hZF9zaXplID0gcmVjZWl2ZWRfc2l6ZSAtIChrSDRIZWFkZXJTaXplICsga0hjaVNjb0hlYWRlclNpemUpOwotICAgICAgdWludDhfdCBoY2lfc2NvX2RhdGFfdG90YWxfbGVuZ3RoID0gYnVmWzNdOwotICAgICAgQVNTRVJUX0xPRygKLSAgICAgICAgICBwYXlsb2FkX3NpemUgPT0gaGNpX3Njb19kYXRhX3RvdGFsX2xlbmd0aCwKLSAgICAgICAgICAibWFsZm9ybWVkIFNDTyBsZW5ndGggcmVjZWl2ZWQ6ICVkICE9ICVkIiwKLSAgICAgICAgICBwYXlsb2FkX3NpemUsCi0gICAgICAgICAgaGNpX3Njb19kYXRhX3RvdGFsX2xlbmd0aCk7Ci0KLSAgICAgIEhjaVBhY2tldCByZWNlaXZlZEhjaVBhY2tldDsKLSAgICAgIHJlY2VpdmVkSGNpUGFja2V0LmFzc2lnbihidWYgKyBrSDRIZWFkZXJTaXplLCBidWYgKyBrSDRIZWFkZXJTaXplICsga0hjaVNjb0hlYWRlclNpemUgKyBwYXlsb2FkX3NpemUpOwotICAgICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkSGNpUGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpJTkNPTUlORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OlNDTyk7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgICAgaWYgKGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPT0gbnVsbHB0cikgewotICAgICAgICAgIExPR19JTkZPKCJEcm9wcGluZyBhIFNDTyBwYWNrZXQgYWZ0ZXIgcHJvY2Vzc2luZyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfLT5zY29EYXRhUmVjZWl2ZWQocmVjZWl2ZWRIY2lQYWNrZXQpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChidWZbMF0gPT0ga0g0SXNvKSB7Ci0gICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgIHJlY2VpdmVkX3NpemUgPj0ga0g0SGVhZGVyU2l6ZSArIGtIY2lJc29IZWFkZXJTaXplLCAiUmVjZWl2ZWQgYmFkIEhDSV9JU08gcGFja2V0IHNpemU6ICV6dSIsIHJlY2VpdmVkX3NpemUpOwotICAgICAgaW50IHBheWxvYWRfc2l6ZSA9IHJlY2VpdmVkX3NpemUgLSAoa0g0SGVhZGVyU2l6ZSArIGtIY2lJc29IZWFkZXJTaXplKTsKLSAgICAgIHVpbnQxNl90IGhjaV9pc29fZGF0YV90b3RhbF9sZW5ndGggPSAoKGJ1Zls0XSAmIDB4M2YpIDw8IDgpICsgYnVmWzNdOwotICAgICAgQVNTRVJUX0xPRygKLSAgICAgICAgICBwYXlsb2FkX3NpemUgPT0gaGNpX2lzb19kYXRhX3RvdGFsX2xlbmd0aCwKLSAgICAgICAgICAibWFsZm9ybWVkIElTTyBsZW5ndGggcmVjZWl2ZWQ6ICVkICE9ICVkIiwKLSAgICAgICAgICBwYXlsb2FkX3NpemUsCi0gICAgICAgICAgaGNpX2lzb19kYXRhX3RvdGFsX2xlbmd0aCk7Ci0KLSAgICAgIEhjaVBhY2tldCByZWNlaXZlZEhjaVBhY2tldDsKLSAgICAgIHJlY2VpdmVkSGNpUGFja2V0LmFzc2lnbihidWYgKyBrSDRIZWFkZXJTaXplLCBidWYgKyBrSDRIZWFkZXJTaXplICsga0hjaUlzb0hlYWRlclNpemUgKyBwYXlsb2FkX3NpemUpOwotICAgICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkSGNpUGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpJTkNPTUlORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OklTTyk7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgICAgaWYgKGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPT0gbnVsbHB0cikgewotICAgICAgICAgIExPR19JTkZPKCJEcm9wcGluZyBhIElTTyBwYWNrZXQgYWZ0ZXIgcHJvY2Vzc2luZyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfLT5pc29EYXRhUmVjZWl2ZWQocmVjZWl2ZWRIY2lQYWNrZXQpOwotICAgICAgfQotICAgIH0KLSAgICBtZW1zZXQoYnVmLCAwLCBrQnVmU2l6ZSk7Ci0gIH0KLX07Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgSGNpSGFsOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBIY2lIYWxIb3N0KCk7IH0pOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvaGNpX2hhbF9ob3N0LmggYi9nZC9oYWwvaGNpX2hhbF9ob3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzNiMTUuLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2hjaV9oYWxfaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLS8vIFNpbmdsZXRvbiBvYmplY3QgdG8gc3RvcmUgcnVudGltZSBjb25maWd1cmF0aW9uIGZvciByb290Y2FuYWwKLWNsYXNzIEhjaUhhbEhvc3RSb290Y2FuYWxDb25maWcgewotIHB1YmxpYzoKLSAgc3RhdGljIEhjaUhhbEhvc3RSb290Y2FuYWxDb25maWcqIEdldCgpIHsKLSAgICBzdGF0aWMgSGNpSGFsSG9zdFJvb3RjYW5hbENvbmZpZyBpbnN0YW5jZTsKLSAgICByZXR1cm4gJmluc3RhbmNlOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBsaXN0ZW5pbmcgVENQIHBvcnQgZm9yIHJvb3RjYW5hbCBIQ0kgc29ja2V0Ci0gIHVpbnQxNl90IEdldFBvcnQoKSB7Ci0gICAgcmV0dXJuIHBvcnRfOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBsaXN0ZW5pbmcgVENQIHBvcnQgZm9yIHJvb3RjYW5hbCBIQ0kgc29ja2V0Ci0gIHZvaWQgU2V0UG9ydCh1aW50MTZfdCBwb3J0KSB7Ci0gICAgcG9ydF8gPSBwb3J0OwotICB9Ci0KLSAgLy8gR2V0IHRoZSBzZXJ2ZXIgYWRkcmVzcyBmb3Igcm9vdGNhbmFsIEhDSSBzb2NrZXQKLSAgc3RkOjpzdHJpbmcgR2V0U2VydmVyQWRkcmVzcygpIHsKLSAgICByZXR1cm4gc2VydmVyX2FkZHJlc3NfOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBzZXJ2ZXIgYWRkcmVzcyBmb3Igcm9vdGNhbmFsIEhDSSBzb2NrZXQKLSAgdm9pZCBTZXRTZXJ2ZXJBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSB7Ci0gICAgc2VydmVyX2FkZHJlc3NfID0gYWRkcmVzczsKLSAgfQotCi0gcHJpdmF0ZToKLSAgSGNpSGFsSG9zdFJvb3RjYW5hbENvbmZpZygpID0gZGVmYXVsdDsKLSAgdWludDE2X3QgcG9ydF8gPSA2NDAyOyAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHNlcnZlciBUQ1AgcG9ydAotICBzdGQ6OnN0cmluZyBzZXJ2ZXJfYWRkcmVzc18gPSAiMTI3LjAuMC4xIjsgIC8vIERlZmF1bHQgc2VydmVyIGFkZHJlc3MKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hhbC9oY2lfaGFsX2hvc3Rfcm9vdGNhbmFsLmNjIGIvZ2QvaGFsL2hjaV9oYWxfaG9zdF9yb290Y2FuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODlmM2YuLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2hjaV9oYWxfaG9zdF9yb290Y2FuYWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhhbC9oY2lfaGFsX2hvc3QuaCIKLQotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHBvbGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3NpZ25hbD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImhhbC9oY2lfaGFsLmgiCi0jaW5jbHVkZSAiaGFsL3Nub29wX2xvZ2dlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3JlYWN0b3IuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBpbnQgSU5WQUxJRF9GRCA9IC0xOwotCi1jb25zdGV4cHIgdWludDhfdCBrSDRDb21tYW5kID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtINEFjbCA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBrSDRTY28gPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3Qga0g0RXZlbnQgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3Qga0g0SXNvID0gMHgwNTsKLQotY29uc3RleHByIHVpbnQ4X3Qga0g0SGVhZGVyU2l6ZSA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBrSGNpQWNsSGVhZGVyU2l6ZSA9IDQ7Ci1jb25zdGV4cHIgdWludDhfdCBrSGNpU2NvSGVhZGVyU2l6ZSA9IDM7Ci1jb25zdGV4cHIgdWludDhfdCBrSGNpRXZ0SGVhZGVyU2l6ZSA9IDI7Ci1jb25zdGV4cHIgdWludDhfdCBrSGNpSXNvSGVhZGVyU2l6ZSA9IDQ7Ci1jb25zdGV4cHIgaW50IGtCdWZTaXplID0gMTAyNCArIDQgKyAxOyAgLy8gRGV2aWNlUHJvcGVydGllczo6YWNsX2RhdGFfcGFja2V0X3NpemVfICsgQUNMIGhlYWRlciArIEg0IGhlYWRlcgotCi1pbnQgQ29ubmVjdFRvU29ja2V0KCkgewotICBhdXRvKiBjb25maWcgPSBibHVldG9vdGg6OmhhbDo6SGNpSGFsSG9zdFJvb3RjYW5hbENvbmZpZzo6R2V0KCk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2ZXIgPSBjb25maWctPkdldFNlcnZlckFkZHJlc3MoKTsKLSAgaW50IHBvcnQgPSBjb25maWctPkdldFBvcnQoKTsKLQotICBpbnQgc29ja2V0X2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLSAgaWYgKHNvY2tldF9mZCA8IDEpIHsKLSAgICBMT0dfRVJST1IoImNhbid0IGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gSU5WQUxJRF9GRDsKLSAgfQotCi0gIHN0cnVjdCBob3N0ZW50KiBob3N0OwotICBob3N0ID0gZ2V0aG9zdGJ5bmFtZShzZXJ2ZXIuY19zdHIoKSk7Ci0gIGlmIChob3N0ID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoImNhbid0IGdldCBzZXJ2ZXIgbmFtZSIpOwotICAgIHJldHVybiBJTlZBTElEX0ZEOwotICB9Ci0KLSAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZfYWRkcjsKLSAgbWVtc2V0KCh2b2lkKikmc2Vydl9hZGRyLCAwLCBzaXplb2Yoc2Vydl9hZGRyKSk7Ci0gIHNlcnZfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgc2Vydl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci0gIHNlcnZfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCi0gIGludCByZXN1bHQgPSBjb25uZWN0KHNvY2tldF9mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNlcnZfYWRkciwgc2l6ZW9mKHNlcnZfYWRkcikpOwotICBpZiAocmVzdWx0IDwgMCkgewotICAgIExPR19FUlJPUigiY2FuJ3QgY29ubmVjdDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBJTlZBTElEX0ZEOwotICB9Ci0KLSAgdGltZXZhbCBzb2NrZXRfdGltZW91dHsKLSAgICAgIC50dl9zZWMgPSAzLAotICAgICAgLnR2X3VzZWMgPSAwLAotICB9OwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfZmQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAmc29ja2V0X3RpbWVvdXQsIHNpemVvZihzb2NrZXRfdGltZW91dCkpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCJjYW4ndCBjb250cm9sIHNvY2tldCBmZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBJTlZBTElEX0ZEOwotICB9Ci0gIHJldHVybiBzb2NrZXRfZmQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLQotY2xhc3MgSGNpSGFsSG9zdCA6IHB1YmxpYyBIY2lIYWwgewotIHB1YmxpYzoKLSAgdm9pZCByZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soSGNpSGFsQ2FsbGJhY2tzKiBjYWxsYmFjaykgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFwaV9tdXRleF8pOwotICAgIExPR19JTkZPKCIlcyBiZWZvcmUiLCBfX2Z1bmNfXyk7Ci0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGluY29taW5nX3BhY2tldF9jYWxsYmFja19sb2NrKGluY29taW5nX3BhY2tldF9jYWxsYmFja19tdXRleF8pOwotICAgICAgQVNTRVJUKGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPT0gbnVsbHB0ciAmJiBjYWxsYmFjayAhPSBudWxscHRyKTsKLSAgICAgIGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgTE9HX0lORk8oIiVzIGFmdGVyIiwgX19mdW5jX18pOwotICB9Ci0KLSAgdm9pZCB1bnJlZ2lzdGVySW5jb21pbmdQYWNrZXRDYWxsYmFjaygpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBMT0dfSU5GTygiJXMgYmVmb3JlIiwgX19mdW5jX18pOwotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgIGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPSBudWxscHRyOwotICAgIH0KLSAgICBMT0dfSU5GTygiJXMgYWZ0ZXIiLCBfX2Z1bmNfXyk7Ci0gIH0KLQotICB2b2lkIHNlbmRIY2lDb21tYW5kKEhjaVBhY2tldCBjb21tYW5kKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXBpX211dGV4Xyk7Ci0gICAgQVNTRVJUKHNvY2tfZmRfICE9IElOVkFMSURfRkQpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCA9IHN0ZDo6bW92ZShjb21tYW5kKTsKLSAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpPVVRHT0lORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkNNRCk7Ci0gICAgcGFja2V0Lmluc2VydChwYWNrZXQuY2JlZ2luKCksIGtINENvbW1hbmQpOwotICAgIHdyaXRlX3RvX2ZkKHBhY2tldCk7Ci0gIH0KLQotICB2b2lkIHNlbmRBY2xEYXRhKEhjaVBhY2tldCBkYXRhKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXBpX211dGV4Xyk7Ci0gICAgQVNTRVJUKHNvY2tfZmRfICE9IElOVkFMSURfRkQpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCA9IHN0ZDo6bW92ZShkYXRhKTsKLSAgICBidHNub29wX2xvZ2dlcl8tPkNhcHR1cmUocGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpPVVRHT0lORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkFDTCk7Ci0gICAgcGFja2V0Lmluc2VydChwYWNrZXQuY2JlZ2luKCksIGtINEFjbCk7Ci0gICAgd3JpdGVfdG9fZmQocGFja2V0KTsKLSAgfQotCi0gIHZvaWQgc2VuZFNjb0RhdGEoSGNpUGFja2V0IGRhdGEpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBBU1NFUlQoc29ja19mZF8gIT0gSU5WQUxJRF9GRCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0ID0gc3RkOjptb3ZlKGRhdGEpOwotICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShwYWNrZXQsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6U0NPKTsKLSAgICBwYWNrZXQuaW5zZXJ0KHBhY2tldC5jYmVnaW4oKSwga0g0U2NvKTsKLSAgICB3cml0ZV90b19mZChwYWNrZXQpOwotICB9Ci0KLSAgdm9pZCBzZW5kSXNvRGF0YShIY2lQYWNrZXQgZGF0YSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFwaV9tdXRleF8pOwotICAgIEFTU0VSVChzb2NrX2ZkXyAhPSBJTlZBTElEX0ZEKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQgPSBzdGQ6Om1vdmUoZGF0YSk7Ci0gICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHBhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpJU08pOwotICAgIHBhY2tldC5pbnNlcnQocGFja2V0LmNiZWdpbigpLCBrSDRJc28pOwotICAgIHdyaXRlX3RvX2ZkKHBhY2tldCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgICBsaXN0LT5hZGQ8U25vb3BMb2dnZXI+KCk7Ci0gIH0KLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFwaV9tdXRleF8pOwotICAgIEFTU0VSVChzb2NrX2ZkXyA9PSBJTlZBTElEX0ZEKTsKLSAgICBzb2NrX2ZkXyA9IENvbm5lY3RUb1NvY2tldCgpOwotICAgIEFTU0VSVChzb2NrX2ZkXyAhPSBJTlZBTElEX0ZEKTsKLSAgICByZWFjdGFibGVfID0gaGNpX2luY29taW5nX3RocmVhZF8uR2V0UmVhY3RvcigpLT5SZWdpc3RlcigKLSAgICAgICAgc29ja19mZF8sIGNvbW1vbjo6QmluZCgmSGNpSGFsSG9zdDo6aW5jb21pbmdfcGFja2V0X3JlY2VpdmVkLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLCBjb21tb246OkNsb3N1cmUoKSk7Ci0gICAgYnRzbm9vcF9sb2dnZXJfID0gR2V0RGVwZW5kZW5jeTxTbm9vcExvZ2dlcj4oKTsKLSAgICBMT0dfSU5GTygiSEFMIG9wZW5lZCBzdWNjZXNzZnVsbHkiKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBMT0dfSU5GTygiSEFMIGlzIGNsb3NpbmciKTsKLSAgICBpZiAocmVhY3RhYmxlXyAhPSBudWxscHRyKSB7Ci0gICAgICBoY2lfaW5jb21pbmdfdGhyZWFkXy5HZXRSZWFjdG9yKCktPlVucmVnaXN0ZXIocmVhY3RhYmxlXyk7Ci0gICAgICBMT0dfSU5GTygiSEFMIGlzIHN0b3BwaW5nLCBzdGFydCB3YWl0aW5nIGZvciBsYXN0IGNhbGxiYWNrIik7Ci0gICAgICAvLyBXYWl0IHVwIHRvIDEgc2Vjb25kIGZvciB0aGUgbGFzdCBpbmNvbWluZyBwYWNrZXQgY2FsbGJhY2sgdG8gZmluaXNoCi0gICAgICBoY2lfaW5jb21pbmdfdGhyZWFkXy5HZXRSZWFjdG9yKCktPldhaXRGb3JVbnJlZ2lzdGVyZWRSZWFjdGFibGUoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSk7Ci0gICAgICBMT0dfSU5GTygiSEFMIGlzIHN0b3BwaW5nLCBmaW5pc2hlZCB3YWl0aW5nIGZvciBsYXN0IGNhbGxiYWNrIik7Ci0gICAgICBBU1NFUlQoc29ja19mZF8gIT0gSU5WQUxJRF9GRCk7Ci0gICAgfQotICAgIHJlYWN0YWJsZV8gPSBudWxscHRyOwotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgIGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPSBudWxscHRyOwotICAgIH0KLSAgICA6OmNsb3NlKHNvY2tfZmRfKTsKLSAgICBzb2NrX2ZkXyA9IElOVkFMSURfRkQ7Ci0gICAgTE9HX0lORk8oIkhBTCBpcyBjbG9zZWQiKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiSGNpSGFsSG9zdCIpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBIZWxkIHdoZW4gQVBJcyBhcmUgY2FsbGVkLCBOT1QgdG8gYmUgaGVsZCBkdXJpbmcgY2FsbGJhY2tzCi0gIHN0ZDo6bXV0ZXggYXBpX211dGV4XzsKLSAgSGNpSGFsQ2FsbGJhY2tzKiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID0gbnVsbHB0cjsKLSAgc3RkOjptdXRleCBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfOwotICBpbnQgc29ja19mZF8gPSBJTlZBTElEX0ZEOwotICBibHVldG9vdGg6Om9zOjpUaHJlYWQgaGNpX2luY29taW5nX3RocmVhZF8gPQotICAgICAgYmx1ZXRvb3RoOjpvczo6VGhyZWFkKCJoY2lfaW5jb21pbmdfdGhyZWFkIiwgYmx1ZXRvb3RoOjpvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgYmx1ZXRvb3RoOjpvczo6UmVhY3Rvcjo6UmVhY3RhYmxlKiByZWFjdGFibGVfID0gbnVsbHB0cjsKLSAgc3RkOjpxdWV1ZTxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gaGNpX291dGdvaW5nX3F1ZXVlXzsKLSAgU25vb3BMb2dnZXIqIGJ0c25vb3BfbG9nZ2VyXyA9IG51bGxwdHI7Ci0KLSAgdm9pZCB3cml0ZV90b19mZChIY2lQYWNrZXQgcGFja2V0KSB7Ci0gICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggbmV3IHF1ZXVlIHdoZW4gaXQncyByZWFkeQotICAgIGhjaV9vdXRnb2luZ19xdWV1ZV8uZW1wbGFjZShwYWNrZXQpOwotICAgIGlmIChoY2lfb3V0Z29pbmdfcXVldWVfLnNpemUoKSA9PSAxKSB7Ci0gICAgICBoY2lfaW5jb21pbmdfdGhyZWFkXy5HZXRSZWFjdG9yKCktPk1vZGlmeVJlZ2lzdHJhdGlvbigKLSAgICAgICAgICByZWFjdGFibGVfLAotICAgICAgICAgIGNvbW1vbjo6QmluZCgmSGNpSGFsSG9zdDo6aW5jb21pbmdfcGFja2V0X3JlY2VpdmVkLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICAgIGNvbW1vbjo6QmluZCgmSGNpSGFsSG9zdDo6c2VuZF9wYWNrZXRfcmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2VuZF9wYWNrZXRfcmVhZHkoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sodGhpcy0+YXBpX211dGV4Xyk7Ci0gICAgYXV0byBwYWNrZXRfdG9fc2VuZCA9IHRoaXMtPmhjaV9vdXRnb2luZ19xdWV1ZV8uZnJvbnQoKTsKLSAgICBhdXRvIGJ5dGVzX3dyaXR0ZW4gPSB3cml0ZSh0aGlzLT5zb2NrX2ZkXywgKHZvaWQqKXBhY2tldF90b19zZW5kLmRhdGEoKSwgcGFja2V0X3RvX3NlbmQuc2l6ZSgpKTsKLSAgICB0aGlzLT5oY2lfb3V0Z29pbmdfcXVldWVfLnBvcCgpOwotICAgIGlmIChieXRlc193cml0dGVuID09IC0xKSB7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICBpZiAoaGNpX291dGdvaW5nX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICB0aGlzLT5oY2lfaW5jb21pbmdfdGhyZWFkXy5HZXRSZWFjdG9yKCktPk1vZGlmeVJlZ2lzdHJhdGlvbigKLSAgICAgICAgICB0aGlzLT5yZWFjdGFibGVfLAotICAgICAgICAgIGNvbW1vbjo6QmluZCgmSGNpSGFsSG9zdDo6aW5jb21pbmdfcGFja2V0X3JlY2VpdmVkLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICAgIGNvbW1vbjo6Q2xvc3VyZSgpKTsKLSAgICB9Ci0gIH0KLQotICBib29sIHNvY2tldFJlY3ZBbGwodm9pZCogYnVmZmVyLCBpbnQgYnVmZmVyTGVuKSB7Ci0gICAgYXV0byBidWYgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmZmVyKTsKLSAgICB3aGlsZSAoYnVmZmVyTGVuID4gMCkgewotICAgICAgc3NpemVfdCByZXQ7Ci0gICAgICBSVU5fTk9fSU5UUihyZXQgPSByZWN2KHNvY2tfZmRfLCBidWYsIGJ1ZmZlckxlbiwgMCkpOwotICAgICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJ1ZiArPSByZXQ7Ci0gICAgICBidWZmZXJMZW4gLT0gcmV0OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgaW5jb21pbmdfcGFja2V0X3JlY2VpdmVkKCkgewotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgIGlmIChpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID09IG51bGxwdHIpIHsKLSAgICAgICAgTE9HX0lORk8oIkRyb3BwaW5nIGEgcGFja2V0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgdWludDhfdCBidWZba0J1ZlNpemVdID0ge307Ci0KLSAgICBzc2l6ZV90IHJlY2VpdmVkX3NpemU7Ci0gICAgUlVOX05PX0lOVFIocmVjZWl2ZWRfc2l6ZSA9IHJlY3Yoc29ja19mZF8sIGJ1Ziwga0g0SGVhZGVyU2l6ZSwgMCkpOwotICAgIEFTU0VSVF9MT0cocmVjZWl2ZWRfc2l6ZSAhPSAtMSwgIkNhbid0IHJlY2VpdmUgZnJvbSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBpZiAocmVjZWl2ZWRfc2l6ZSA9PSAwKSB7Ci0gICAgICBMT0dfV0FSTigiQ2FuJ3QgcmVhZCBINCBoZWFkZXIuIEVPRiByZWNlaXZlZCIpOwotICAgICAgcmFpc2UoU0lHSU5UKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYnVmWzBdID09IGtINEV2ZW50KSB7Ci0gICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgIHNvY2tldFJlY3ZBbGwoYnVmICsga0g0SGVhZGVyU2l6ZSwga0hjaUV2dEhlYWRlclNpemUpLCAiQ2FuJ3QgcmVjZWl2ZSBmcm9tIHNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICB1aW50OF90IGhjaV9ldnRfcGFyYW1ldGVyX3RvdGFsX2xlbmd0aCA9IGJ1ZlsyXTsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgc29ja2V0UmVjdkFsbChidWYgKyBrSDRIZWFkZXJTaXplICsga0hjaUV2dEhlYWRlclNpemUsIGhjaV9ldnRfcGFyYW1ldGVyX3RvdGFsX2xlbmd0aCksCi0gICAgICAgICAgIkNhbid0IHJlY2VpdmUgZnJvbSBzb2NrZXQ6ICVzIiwKLSAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICBIY2lQYWNrZXQgcmVjZWl2ZWRIY2lQYWNrZXQ7Ci0gICAgICByZWNlaXZlZEhjaVBhY2tldC5hc3NpZ24oCi0gICAgICAgICAgYnVmICsga0g0SGVhZGVyU2l6ZSwgYnVmICsga0g0SGVhZGVyU2l6ZSArIGtIY2lFdnRIZWFkZXJTaXplICsgaGNpX2V2dF9wYXJhbWV0ZXJfdG90YWxfbGVuZ3RoKTsKLSAgICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShyZWNlaXZlZEhjaVBhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6SU5DT01JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpFVlQpOwotICAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX2xvY2soaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX211dGV4Xyk7Ci0gICAgICAgIGlmIChpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID09IG51bGxwdHIpIHsKLSAgICAgICAgICBMT0dfSU5GTygiRHJvcHBpbmcgYW4gZXZlbnQgYWZ0ZXIgcHJvY2Vzc2luZyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfLT5oY2lFdmVudFJlY2VpdmVkKHJlY2VpdmVkSGNpUGFja2V0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYnVmWzBdID09IGtINEFjbCkgewotICAgICAgQVNTRVJUX0xPRygKLSAgICAgICAgICBzb2NrZXRSZWN2QWxsKGJ1ZiArIGtINEhlYWRlclNpemUsIGtIY2lBY2xIZWFkZXJTaXplKSwgIkNhbid0IHJlY2VpdmUgZnJvbSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgdWludDE2X3QgaGNpX2FjbF9kYXRhX3RvdGFsX2xlbmd0aCA9IChidWZbNF0gPDwgOCkgKyBidWZbM107Ci0gICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgIHNvY2tldFJlY3ZBbGwoYnVmICsga0g0SGVhZGVyU2l6ZSArIGtIY2lBY2xIZWFkZXJTaXplLCBoY2lfYWNsX2RhdGFfdG90YWxfbGVuZ3RoKSwKLSAgICAgICAgICAiQ2FuJ3QgcmVjZWl2ZSBmcm9tIHNvY2tldDogJXMiLAotICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgICAgIEhjaVBhY2tldCByZWNlaXZlZEhjaVBhY2tldDsKLSAgICAgIHJlY2VpdmVkSGNpUGFja2V0LmFzc2lnbigKLSAgICAgICAgICBidWYgKyBrSDRIZWFkZXJTaXplLCBidWYgKyBrSDRIZWFkZXJTaXplICsga0hjaUFjbEhlYWRlclNpemUgKyBoY2lfYWNsX2RhdGFfdG90YWxfbGVuZ3RoKTsKLSAgICAgIGJ0c25vb3BfbG9nZ2VyXy0+Q2FwdHVyZShyZWNlaXZlZEhjaVBhY2tldCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6SU5DT01JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpBQ0wpOwotICAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX2xvY2soaW5jb21pbmdfcGFja2V0X2NhbGxiYWNrX211dGV4Xyk7Ci0gICAgICAgIGlmIChpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfID09IG51bGxwdHIpIHsKLSAgICAgICAgICBMT0dfSU5GTygiRHJvcHBpbmcgYW4gQUNMIHBhY2tldCBhZnRlciBwcm9jZXNzaW5nIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGluY29taW5nX3BhY2tldF9jYWxsYmFja18tPmFjbERhdGFSZWNlaXZlZChyZWNlaXZlZEhjaVBhY2tldCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJ1ZlswXSA9PSBrSDRTY28pIHsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgc29ja2V0UmVjdkFsbChidWYgKyBrSDRIZWFkZXJTaXplLCBrSGNpU2NvSGVhZGVyU2l6ZSksICJDYW4ndCByZWNlaXZlIGZyb20gc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgICAgIHVpbnQ4X3QgaGNpX3Njb19kYXRhX3RvdGFsX2xlbmd0aCA9IGJ1ZlszXTsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgc29ja2V0UmVjdkFsbChidWYgKyBrSDRIZWFkZXJTaXplICsga0hjaVNjb0hlYWRlclNpemUsIGhjaV9zY29fZGF0YV90b3RhbF9sZW5ndGgpLAotICAgICAgICAgICJDYW4ndCByZWNlaXZlIGZyb20gc29ja2V0OiAlcyIsCi0gICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgSGNpUGFja2V0IHJlY2VpdmVkSGNpUGFja2V0OwotICAgICAgcmVjZWl2ZWRIY2lQYWNrZXQuYXNzaWduKAotICAgICAgICAgIGJ1ZiArIGtINEhlYWRlclNpemUsIGJ1ZiArIGtINEhlYWRlclNpemUgKyBrSGNpU2NvSGVhZGVyU2l6ZSArIGhjaV9zY29fZGF0YV90b3RhbF9sZW5ndGgpOwotICAgICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkSGNpUGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpJTkNPTUlORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OlNDTyk7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgICAgaWYgKGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPT0gbnVsbHB0cikgewotICAgICAgICAgIExPR19JTkZPKCJEcm9wcGluZyBhIFNDTyBwYWNrZXQgYWZ0ZXIgcHJvY2Vzc2luZyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfLT5zY29EYXRhUmVjZWl2ZWQocmVjZWl2ZWRIY2lQYWNrZXQpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChidWZbMF0gPT0ga0g0SXNvKSB7Ci0gICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgIHNvY2tldFJlY3ZBbGwoYnVmICsga0g0SGVhZGVyU2l6ZSwga0hjaUlzb0hlYWRlclNpemUpLCAiQ2FuJ3QgcmVjZWl2ZSBmcm9tIHNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICB1aW50MTZfdCBoY2lfaXNvX2RhdGFfdG90YWxfbGVuZ3RoID0gKChidWZbNF0gJiAweDNmKSA8PCA4KSArIGJ1ZlszXTsKLSAgICAgIEFTU0VSVF9MT0coCi0gICAgICAgICAgc29ja2V0UmVjdkFsbChidWYgKyBrSDRIZWFkZXJTaXplICsga0hjaUlzb0hlYWRlclNpemUsIGhjaV9pc29fZGF0YV90b3RhbF9sZW5ndGgpLAotICAgICAgICAgICJDYW4ndCByZWNlaXZlIGZyb20gc29ja2V0OiAlcyIsCi0gICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgSGNpUGFja2V0IHJlY2VpdmVkSGNpUGFja2V0OwotICAgICAgcmVjZWl2ZWRIY2lQYWNrZXQuYXNzaWduKAotICAgICAgICAgIGJ1ZiArIGtINEhlYWRlclNpemUsIGJ1ZiArIGtINEhlYWRlclNpemUgKyBrSGNpSXNvSGVhZGVyU2l6ZSArIGhjaV9pc29fZGF0YV90b3RhbF9sZW5ndGgpOwotICAgICAgYnRzbm9vcF9sb2dnZXJfLT5DYXB0dXJlKHJlY2VpdmVkSGNpUGFja2V0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpJTkNPTUlORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OklTTyk7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbG9jayhpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfbXV0ZXhfKTsKLSAgICAgICAgaWYgKGluY29taW5nX3BhY2tldF9jYWxsYmFja18gPT0gbnVsbHB0cikgewotICAgICAgICAgIExPR19JTkZPKCJEcm9wcGluZyBhIElTTyBwYWNrZXQgYWZ0ZXIgcHJvY2Vzc2luZyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbmNvbWluZ19wYWNrZXRfY2FsbGJhY2tfLT5pc29EYXRhUmVjZWl2ZWQocmVjZWl2ZWRIY2lQYWNrZXQpOwotICAgICAgfQotICAgIH0KLSAgICBtZW1zZXQoYnVmLCAwLCBrQnVmU2l6ZSk7Ci0gIH0KLX07Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgSGNpSGFsOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBIY2lIYWxIb3N0KCk7IH0pOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oYWwvaGNpX2hhbF9ob3N0X3Rlc3QuY2MgYi9nZC9oYWwvaGNpX2hhbF9ob3N0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMmFkYTYuLjAwMDAwMDAKLS0tIGEvZ2QvaGFsL2hjaV9oYWxfaG9zdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoYWwvaGNpX2hhbF9ob3N0LmgiCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiaGFsL2hjaV9oYWwuaCIKLSNpbmNsdWRlICJoYWwvc2VyaWFsaXplX3BhY2tldC5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zL3V0aWxzLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpvczo6VGhyZWFkOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIHsKLQotdWludDE2X3Qga1Rlc3RQb3J0ID0gNjUzNzsKLQotY29uc3RleHByIHVpbnQ4X3Qga0g0Q29tbWFuZCA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrSDRBY2wgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3Qga0g0U2NvID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtINEV2ZW50ID0gMHgwNDsKLWNvbnN0ZXhwciB1aW50OF90IGtINElzbyA9IDB4MDU7Ci0KLXVzaW5nIEg0UGFja2V0ID0gc3RkOjp2ZWN0b3I8dWludDhfdD47Ci0KLXN0ZDo6cXVldWU8c3RkOjpwYWlyPHVpbnQ4X3QsIEhjaVBhY2tldD4+IGluY29taW5nX3BhY2tldHNfcXVldWVfOwotCi1jbGFzcyBUZXN0SGNpSGFsQ2FsbGJhY2tzIDogcHVibGljIEhjaUhhbENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2b2lkIGhjaUV2ZW50UmVjZWl2ZWQoSGNpUGFja2V0IHBhY2tldCkgb3ZlcnJpZGUgewotICAgIGluY29taW5nX3BhY2tldHNfcXVldWVfLmVtcGxhY2Uoa0g0RXZlbnQsIHBhY2tldCk7Ci0gIH0KLQotICB2b2lkIGFjbERhdGFSZWNlaXZlZChIY2lQYWNrZXQgcGFja2V0KSBvdmVycmlkZSB7Ci0gICAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZW1wbGFjZShrSDRBY2wsIHBhY2tldCk7Ci0gIH0KLQotICB2b2lkIHNjb0RhdGFSZWNlaXZlZChIY2lQYWNrZXQgcGFja2V0KSBvdmVycmlkZSB7Ci0gICAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZW1wbGFjZShrSDRTY28sIHBhY2tldCk7Ci0gIH0KLQotICB2b2lkIGlzb0RhdGFSZWNlaXZlZChIY2lQYWNrZXQgcGFja2V0KSBvdmVycmlkZSB7Ci0gICAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZW1wbGFjZShrSDRJc28sIHBhY2tldCk7Ci0gIH0KLX07Ci0KLS8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHJvb3RjYW5hbCBkZXNrdG9wIEhDSSBzZXJ2ZXIgd2hpY2ggbGlzdGVucyBvbiBsb2NhbGhvc3Q6a0xpc3RlbmluZ1BvcnQKLWNsYXNzIEZha2VSb290Y2FuYWxEZXNrdG9wSGNpU2VydmVyIHsKLSBwdWJsaWM6Ci0gIEZha2VSb290Y2FuYWxEZXNrdG9wSGNpU2VydmVyKCkgewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsaXN0ZW5fYWRkcmVzczsKLSAgICBzb2NrbGVuX3Qgc29ja2FkZHJfaW5fc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwotICAgIG1lbXNldCgmbGlzdGVuX2FkZHJlc3MsIDAsIHNvY2thZGRyX2luX3NpemUpOwotCi0gICAgUlVOX05PX0lOVFIobGlzdGVuX2ZkXyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpOwotICAgIGlmIChsaXN0ZW5fZmRfIDwgMCkgewotICAgICAgTE9HX1dBUk4oIkVycm9yIGNyZWF0aW5nIHNvY2tldCBmb3IgdGVzdCBjaGFubmVsLiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxpc3Rlbl9hZGRyZXNzLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIGxpc3Rlbl9hZGRyZXNzLnNpbl9wb3J0ID0gaHRvbnMoSGNpSGFsSG9zdFJvb3RjYW5hbENvbmZpZzo6R2V0KCktPkdldFBvcnQoKSk7Ci0gICAgbGlzdGVuX2FkZHJlc3Muc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0KLSAgICBpZiAoYmluZChsaXN0ZW5fZmRfLCByZWludGVycHJldF9jYXN0PHNvY2thZGRyKj4oJmxpc3Rlbl9hZGRyZXNzKSwgc29ja2FkZHJfaW5fc2l6ZSkgPCAwKSB7Ci0gICAgICBMT0dfV0FSTigiRXJyb3IgYmluZGluZyB0ZXN0IGNoYW5uZWwgbGlzdGVuZXIgc29ja2V0IHRvIGFkZHJlc3MuIik7Ci0gICAgICBjbG9zZShsaXN0ZW5fZmRfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGlzdGVuKGxpc3Rlbl9mZF8sIDEpIDwgMCkgewotICAgICAgTE9HX1dBUk4oIkVycm9yIGxpc3RlbmluZyBmb3IgdGVzdCBjaGFubmVsLiIpOwotICAgICAgY2xvc2UobGlzdGVuX2ZkXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgfkZha2VSb290Y2FuYWxEZXNrdG9wSGNpU2VydmVyKCkgewotICAgIGNsb3NlKGxpc3Rlbl9mZF8pOwotICB9Ci0KLSAgaW50IEFjY2VwdCgpIHsKLSAgICBpbnQgYWNjZXB0X2ZkOwotCi0gICAgUlVOX05PX0lOVFIoYWNjZXB0X2ZkID0gYWNjZXB0KGxpc3Rlbl9mZF8sIG51bGxwdHIsIG51bGxwdHIpKTsKLQotICAgIGludCBmbGFncyA9IGZjbnRsKGFjY2VwdF9mZCwgRl9HRVRGTCwgTlVMTCk7Ci0gICAgaW50IHJldCA9IGZjbnRsKGFjY2VwdF9mZCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKLSAgICBpZiAocmV0ID09IC0xKSB7Ci0gICAgICBMT0dfRVJST1IoIkNhbid0IGZjbnRsIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGFjY2VwdF9mZCA8IDApIHsKLSAgICAgIExPR19XQVJOKCJFcnJvciBhY2NlcHRpbmcgdGVzdCBjaGFubmVsIGNvbm5lY3Rpb24gZXJybm89JWQgKCVzKS4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFV09VTERCTE9DSykgewotICAgICAgICBMT0dfRVJST1IoIkNsb3NpbmcgbGlzdGVuX2ZkXyAod29uJ3QgdHJ5IGFnYWluKS4iKTsKLSAgICAgICAgY2xvc2UobGlzdGVuX2ZkXyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYWNjZXB0X2ZkOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQgbGlzdGVuX2ZkXyA9IC0xOwotfTsKLQotY2xhc3MgSGNpSGFsUm9vdGNhbmFsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGVzdF90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotCi0gICAgSGNpSGFsSG9zdFJvb3RjYW5hbENvbmZpZzo6R2V0KCktPlNldFBvcnQoa1Rlc3RQb3J0KTsKLSAgICBmYWtlX3NlcnZlcl8gPSBuZXcgRmFrZVJvb3RjYW5hbERlc2t0b3BIY2lTZXJ2ZXI7Ci0gICAgaGFsXyA9IGZha2VfcmVnaXN0cnlfLlN0YXJ0PEhjaUhhbD4odGhyZWFkXyk7Ci0gICAgaGFsXy0+cmVnaXN0ZXJJbmNvbWluZ1BhY2tldENhbGxiYWNrKCZjYWxsYmFja3NfKTsKLSAgICBmYWtlX3NlcnZlcl9zb2NrZXRfID0gZmFrZV9zZXJ2ZXJfLT5BY2NlcHQoKTsgIC8vIGFjY2VwdCgpIGFmdGVyIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYXZvaWQgYmxvY2tpbmcKLSAgICBzdGQ6OnF1ZXVlPHN0ZDo6cGFpcjx1aW50OF90LCBIY2lQYWNrZXQ+PiBlbXB0eTsKLSAgICBzdGQ6OnN3YXAoaW5jb21pbmdfcGFja2V0c19xdWV1ZV8sIGVtcHR5KTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgaGFsXy0+dW5yZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gICAgY2xvc2UoZmFrZV9zZXJ2ZXJfc29ja2V0Xyk7Ci0gICAgZGVsZXRlIGZha2Vfc2VydmVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIHZvaWQgU2V0RmFrZVNlcnZlclNvY2tldFRvQmxvY2tpbmcoKSB7Ci0gICAgaW50IGZsYWdzID0gZmNudGwoZmFrZV9zZXJ2ZXJfc29ja2V0XywgRl9HRVRGTCwgTlVMTCk7Ci0gICAgaW50IHJldCA9IGZjbnRsKGZha2Vfc2VydmVyX3NvY2tldF8sIEZfU0VURkwsIGZsYWdzICYgfk9fTk9OQkxPQ0spOwotICAgIEVYUEVDVF9ORShyZXQsIC0xKSA8PCAiQ2FuJ3Qgc2V0IGFjY2VwdCBmZCB0byBibG9ja2luZyI7Ci0gIH0KLQotICBGYWtlUm9vdGNhbmFsRGVza3RvcEhjaVNlcnZlciogZmFrZV9zZXJ2ZXJfID0gbnVsbHB0cjsKLSAgSGNpSGFsKiBoYWxfID0gbnVsbHB0cjsKLSAgTW9kdWxlUmVnaXN0cnkgZmFrZV9yZWdpc3RyeV87Ci0gIFRlc3RIY2lIYWxDYWxsYmFja3MgY2FsbGJhY2tzXzsKLSAgaW50IGZha2Vfc2VydmVyX3NvY2tldF8gPSAtMTsKLSAgVGhyZWFkKiB0aHJlYWRfOwotfTsKLQotdm9pZCBjaGVja19wYWNrZXRfZXF1YWwoc3RkOjpwYWlyPHVpbnQ4X3QsIEhjaVBhY2tldD4gaGNpX3BhY2tldDFfdHlwZV9kYXRhX3BhaXIsIEg0UGFja2V0IGg0X3BhY2tldDIpIHsKLSAgYXV0byBwYWNrZXQxX2hjaV9zaXplID0gaGNpX3BhY2tldDFfdHlwZV9kYXRhX3BhaXIuc2Vjb25kLnNpemUoKTsKLSAgQVNTRVJUX0VRKHBhY2tldDFfaGNpX3NpemUgKyAxLCBoNF9wYWNrZXQyLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShoY2lfcGFja2V0MV90eXBlX2RhdGFfcGFpci5maXJzdCwgaDRfcGFja2V0MlswXSk7Ci0gIEFTU0VSVF9FUShtZW1jbXAoaGNpX3BhY2tldDFfdHlwZV9kYXRhX3BhaXIuc2Vjb25kLmRhdGEoKSwgaDRfcGFja2V0Mi5kYXRhKCkgKyAxLCBwYWNrZXQxX2hjaV9zaXplKSwgMCk7Ci19Ci0KLUhjaVBhY2tldCBtYWtlX3NhbXBsZV9oY2lfY21kX3BrdCh1aW50OF90IHBhcmFtZXRlcl90b3RhbF9sZW5ndGgpIHsKLSAgSGNpUGFja2V0IHBrdDsKLSAgcGt0LmFzc2lnbigyICsgMSArIHBhcmFtZXRlcl90b3RhbF9sZW5ndGgsIDB4MDEpOwotICBwa3RbMl0gPSBwYXJhbWV0ZXJfdG90YWxfbGVuZ3RoOwotICByZXR1cm4gcGt0OwotfQotCi1IY2lQYWNrZXQgbWFrZV9zYW1wbGVfaGNpX2FjbF9wa3QodWludDhfdCBwYXlsb2FkX3NpemUpIHsKLSAgSGNpUGFja2V0IHBrdDsKLSAgcGt0LmFzc2lnbigyICsgMiArIHBheWxvYWRfc2l6ZSwgMHgwMSk7Ci0gIHBrdFsyXSA9IHBheWxvYWRfc2l6ZTsKLSAgcmV0dXJuIHBrdDsKLX0KLQotSGNpUGFja2V0IG1ha2Vfc2FtcGxlX2hjaV9zY29fcGt0KHVpbnQ4X3QgcGF5bG9hZF9zaXplKSB7Ci0gIEhjaVBhY2tldCBwa3Q7Ci0gIHBrdC5hc3NpZ24oMyArIHBheWxvYWRfc2l6ZSwgMHgwMSk7Ci0gIHBrdFsyXSA9IHBheWxvYWRfc2l6ZTsKLSAgcmV0dXJuIHBrdDsKLX0KLQotSDRQYWNrZXQgbWFrZV9zYW1wbGVfaDRfZXZ0X3BrdCh1aW50OF90IHBhcmFtZXRlcl90b3RhbF9sZW5ndGgpIHsKLSAgSDRQYWNrZXQgcGt0OwotICBwa3QuYXNzaWduKDEgKyAxICsgMSArIHBhcmFtZXRlcl90b3RhbF9sZW5ndGgsIDB4MDEpOwotICBwa3RbMF0gPSBrSDRFdmVudDsKLSAgcGt0WzJdID0gcGFyYW1ldGVyX3RvdGFsX2xlbmd0aDsKLSAgcmV0dXJuIHBrdDsKLX0KLQotSGNpUGFja2V0IG1ha2Vfc2FtcGxlX2g0X2FjbF9wa3QodWludDhfdCBwYXlsb2FkX3NpemUpIHsKLSAgSGNpUGFja2V0IHBrdDsKLSAgcGt0LmFzc2lnbigxICsgMiArIDIgKyBwYXlsb2FkX3NpemUsIDB4MDEpOwotICBwa3RbMF0gPSBrSDRBY2w7Ci0gIHBrdFszXSA9IHBheWxvYWRfc2l6ZTsKLSAgcGt0WzRdID0gMDsKLSAgcmV0dXJuIHBrdDsKLX0KLQotSGNpUGFja2V0IG1ha2Vfc2FtcGxlX2g0X3Njb19wa3QodWludDhfdCBwYXlsb2FkX3NpemUpIHsKLSAgSGNpUGFja2V0IHBrdDsKLSAgcGt0LmFzc2lnbigxICsgMyArIHBheWxvYWRfc2l6ZSwgMHgwMSk7Ci0gIHBrdFswXSA9IGtINFNjbzsKLSAgcGt0WzNdID0gcGF5bG9hZF9zaXplOwotICByZXR1cm4gcGt0OwotfQotCi1IY2lQYWNrZXQgbWFrZV9zYW1wbGVfaDRfaXNvX3BrdCh1aW50OF90IHBheWxvYWRfc2l6ZSkgewotICBIY2lQYWNrZXQgcGt0OwotICBwa3QuYXNzaWduKDEgKyA0ICsgcGF5bG9hZF9zaXplLCAweDAxKTsKLSAgcGt0WzBdID0ga0g0SXNvOwotICBwa3RbM10gPSBwYXlsb2FkX3NpemU7Ci0gIHBrdFs0XSA9IDA7Ci0gIHJldHVybiBwa3Q7Ci19Ci0KLXNpemVfdCByZWFkX3dpdGhfcmV0cnkoaW50IHNvY2tldCwgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7Ci0gIHNzaXplX3QgYnl0ZXNfcmVhZF9jdXJyZW50ID0gMDsKLSAgZG8gewotICAgIGJ5dGVzX3JlYWRfY3VycmVudCA9IHJlYWQoc29ja2V0LCBkYXRhICsgYnl0ZXNfcmVhZCwgbGVuZ3RoIC0gYnl0ZXNfcmVhZCk7Ci0gICAgYnl0ZXNfcmVhZCArPSBieXRlc19yZWFkX2N1cnJlbnQ7Ci0gIH0gd2hpbGUgKGxlbmd0aCA+IGJ5dGVzX3JlYWQgJiYgYnl0ZXNfcmVhZF9jdXJyZW50ID4gMCk7Ci0gIHJldHVybiBieXRlc19yZWFkOwotfQotCi1URVNUX0YoSGNpSGFsUm9vdGNhbmFsVGVzdCwgaW5pdF9hbmRfY2xvc2UpIHt9Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCByZWNlaXZlX2hjaV9ldnQpIHsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0ID0gbWFrZV9zYW1wbGVfaDRfZXZ0X3BrdCgzKTsKLSAgd3JpdGUoZmFrZV9zZXJ2ZXJfc29ja2V0XywgaW5jb21pbmdfcGFja2V0LmRhdGEoKSwgaW5jb21pbmdfcGFja2V0LnNpemUoKSk7Ci0gIHdoaWxlIChpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5zaXplKCkgIT0gMSkgewotICB9Ci0gIGF1dG8gcGFja2V0ID0gaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZnJvbnQoKTsKLSAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8ucG9wKCk7Ci0gIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci19Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCByZWNlaXZlX2hjaV9hY2wpIHsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0ID0gbWFrZV9zYW1wbGVfaDRfYWNsX3BrdCgzKTsKLSAgd3JpdGUoZmFrZV9zZXJ2ZXJfc29ja2V0XywgaW5jb21pbmdfcGFja2V0LmRhdGEoKSwgaW5jb21pbmdfcGFja2V0LnNpemUoKSk7Ci0gIHdoaWxlIChpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5zaXplKCkgIT0gMSkgewotICB9Ci0gIGF1dG8gcGFja2V0ID0gaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZnJvbnQoKTsKLSAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8ucG9wKCk7Ci0gIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci19Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCByZWNlaXZlX2hjaV9zY28pIHsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0ID0gbWFrZV9zYW1wbGVfaDRfc2NvX3BrdCgzKTsKLSAgd3JpdGUoZmFrZV9zZXJ2ZXJfc29ja2V0XywgaW5jb21pbmdfcGFja2V0LmRhdGEoKSwgaW5jb21pbmdfcGFja2V0LnNpemUoKSk7Ci0gIHdoaWxlIChpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5zaXplKCkgIT0gMSkgewotICB9Ci0gIGF1dG8gcGFja2V0ID0gaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZnJvbnQoKTsKLSAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8ucG9wKCk7Ci0gIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci19Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCByZWNlaXZlX2hjaV9pc28pIHsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0ID0gbWFrZV9zYW1wbGVfaDRfaXNvX3BrdCgzKTsKLSAgd3JpdGUoZmFrZV9zZXJ2ZXJfc29ja2V0XywgaW5jb21pbmdfcGFja2V0LmRhdGEoKSwgaW5jb21pbmdfcGFja2V0LnNpemUoKSk7Ci0gIHdoaWxlIChpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5zaXplKCkgIT0gMSkgewotICB9Ci0gIGF1dG8gcGFja2V0ID0gaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZnJvbnQoKTsKLSAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8ucG9wKCk7Ci0gIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci19Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCByZWNlaXZlX3R3b19oY2lfZXZ0cykgewotICBINFBhY2tldCBpbmNvbWluZ19wYWNrZXQgPSBtYWtlX3NhbXBsZV9oNF9ldnRfcGt0KDMpOwotICBINFBhY2tldCBpbmNvbWluZ19wYWNrZXQyID0gbWFrZV9zYW1wbGVfaDRfZXZ0X3BrdCg1KTsKLSAgd3JpdGUoZmFrZV9zZXJ2ZXJfc29ja2V0XywgaW5jb21pbmdfcGFja2V0LmRhdGEoKSwgaW5jb21pbmdfcGFja2V0LnNpemUoKSk7Ci0gIHdyaXRlKGZha2Vfc2VydmVyX3NvY2tldF8sIGluY29taW5nX3BhY2tldDIuZGF0YSgpLCBpbmNvbWluZ19wYWNrZXQyLnNpemUoKSk7Ci0gIHdoaWxlIChpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5zaXplKCkgIT0gMikgewotICB9Ci0gIGF1dG8gcGFja2V0ID0gaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uZnJvbnQoKTsKLSAgaW5jb21pbmdfcGFja2V0c19xdWV1ZV8ucG9wKCk7Ci0gIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci0gIHBhY2tldCA9IGluY29taW5nX3BhY2tldHNfcXVldWVfLmZyb250KCk7Ci0gIGluY29taW5nX3BhY2tldHNfcXVldWVfLnBvcCgpOwotICBjaGVja19wYWNrZXRfZXF1YWwocGFja2V0LCBpbmNvbWluZ19wYWNrZXQyKTsKLX0KLQotVEVTVF9GKEhjaUhhbFJvb3RjYW5hbFRlc3QsIHJlY2VpdmVfZXZ0X2FuZF9hY2wpIHsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0ID0gbWFrZV9zYW1wbGVfaDRfZXZ0X3BrdCgzKTsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0MiA9IG1ha2Vfc2FtcGxlX2g0X2FjbF9wa3QoNSk7Ci0gIHdyaXRlKGZha2Vfc2VydmVyX3NvY2tldF8sIGluY29taW5nX3BhY2tldC5kYXRhKCksIGluY29taW5nX3BhY2tldC5zaXplKCkpOwotICB3cml0ZShmYWtlX3NlcnZlcl9zb2NrZXRfLCBpbmNvbWluZ19wYWNrZXQyLmRhdGEoKSwgaW5jb21pbmdfcGFja2V0Mi5zaXplKCkpOwotICB3aGlsZSAoaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uc2l6ZSgpICE9IDIpIHsKLSAgfQotICBhdXRvIHBhY2tldCA9IGluY29taW5nX3BhY2tldHNfcXVldWVfLmZyb250KCk7Ci0gIGluY29taW5nX3BhY2tldHNfcXVldWVfLnBvcCgpOwotICBjaGVja19wYWNrZXRfZXF1YWwocGFja2V0LCBpbmNvbWluZ19wYWNrZXQpOwotICBwYWNrZXQgPSBpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5mcm9udCgpOwotICBpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5wb3AoKTsKLSAgY2hlY2tfcGFja2V0X2VxdWFsKHBhY2tldCwgaW5jb21pbmdfcGFja2V0Mik7Ci19Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCByZWNlaXZlX211bHRpcGxlX2FjbF9iYXRjaCkgewotICBINFBhY2tldCBpbmNvbWluZ19wYWNrZXQgPSBtYWtlX3NhbXBsZV9oNF9hY2xfcGt0KDUpOwotICBpbnQgbnVtX3BhY2tldHMgPSAxMDAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wYWNrZXRzOyBpKyspIHsKLSAgICB3cml0ZShmYWtlX3NlcnZlcl9zb2NrZXRfLCBpbmNvbWluZ19wYWNrZXQuZGF0YSgpLCBpbmNvbWluZ19wYWNrZXQuc2l6ZSgpKTsKLSAgfQotICB3aGlsZSAoaW5jb21pbmdfcGFja2V0c19xdWV1ZV8uc2l6ZSgpICE9IG51bV9wYWNrZXRzKSB7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5mcm9udCgpOwotICAgIGluY29taW5nX3BhY2tldHNfcXVldWVfLnBvcCgpOwotICAgIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci0gIH0KLX0KLQotVEVTVF9GKEhjaUhhbFJvb3RjYW5hbFRlc3QsIHJlY2VpdmVfbXVsdGlwbGVfYWNsX3NlcXVlbnRpYWwpIHsKLSAgSDRQYWNrZXQgaW5jb21pbmdfcGFja2V0ID0gbWFrZV9zYW1wbGVfaDRfYWNsX3BrdCg1KTsKLSAgaW50IG51bV9wYWNrZXRzID0gMTAwMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7Ci0gICAgd3JpdGUoZmFrZV9zZXJ2ZXJfc29ja2V0XywgaW5jb21pbmdfcGFja2V0LmRhdGEoKSwgaW5jb21pbmdfcGFja2V0LnNpemUoKSk7Ci0gICAgd2hpbGUgKGluY29taW5nX3BhY2tldHNfcXVldWVfLmVtcHR5KCkpIHsKLSAgICB9Ci0gICAgYXV0byBwYWNrZXQgPSBpbmNvbWluZ19wYWNrZXRzX3F1ZXVlXy5mcm9udCgpOwotICAgIGluY29taW5nX3BhY2tldHNfcXVldWVfLnBvcCgpOwotICAgIGNoZWNrX3BhY2tldF9lcXVhbChwYWNrZXQsIGluY29taW5nX3BhY2tldCk7Ci0gIH0KLX0KLQotVEVTVF9GKEhjaUhhbFJvb3RjYW5hbFRlc3QsIHNlbmRfaGNpX2NtZCkgewotICB1aW50OF90IGhjaV9jbWRfcGFyYW1fc2l6ZSA9IDI7Ci0gIEhjaVBhY2tldCBoY2lfZGF0YSA9IG1ha2Vfc2FtcGxlX2hjaV9jbWRfcGt0KGhjaV9jbWRfcGFyYW1fc2l6ZSk7Ci0gIGhhbF8tPnNlbmRIY2lDb21tYW5kKGhjaV9kYXRhKTsKLSAgSDRQYWNrZXQgcmVhZF9idWYoMSArIDIgKyAxICsgaGNpX2NtZF9wYXJhbV9zaXplKTsKLSAgU2V0RmFrZVNlcnZlclNvY2tldFRvQmxvY2tpbmcoKTsKLSAgYXV0byBzaXplX3JlYWQgPSByZWFkX3dpdGhfcmV0cnkoZmFrZV9zZXJ2ZXJfc29ja2V0XywgcmVhZF9idWYuZGF0YSgpLCByZWFkX2J1Zi5zaXplKCkpOwotCi0gIEFTU0VSVF9FUShzaXplX3JlYWQsIDEgKyBoY2lfZGF0YS5zaXplKCkpOwotICBjaGVja19wYWNrZXRfZXF1YWwoe2tINENvbW1hbmQsIGhjaV9kYXRhfSwgcmVhZF9idWYpOwotfQotCi1URVNUX0YoSGNpSGFsUm9vdGNhbmFsVGVzdCwgc2VuZF9hY2wpIHsKLSAgdWludDhfdCBhY2xfcGF5bG9hZF9zaXplID0gMjAwOwotICBIY2lQYWNrZXQgYWNsX3BhY2tldCA9IG1ha2Vfc2FtcGxlX2hjaV9hY2xfcGt0KGFjbF9wYXlsb2FkX3NpemUpOwotICBoYWxfLT5zZW5kQWNsRGF0YShhY2xfcGFja2V0KTsKLSAgSDRQYWNrZXQgcmVhZF9idWYoMSArIDIgKyAyICsgYWNsX3BheWxvYWRfc2l6ZSk7Ci0gIFNldEZha2VTZXJ2ZXJTb2NrZXRUb0Jsb2NraW5nKCk7Ci0gIGF1dG8gc2l6ZV9yZWFkID0gcmVhZF93aXRoX3JldHJ5KGZha2Vfc2VydmVyX3NvY2tldF8sIHJlYWRfYnVmLmRhdGEoKSwgcmVhZF9idWYuc2l6ZSgpKTsKLQotICBBU1NFUlRfRVEoc2l6ZV9yZWFkLCAxICsgYWNsX3BhY2tldC5zaXplKCkpOwotICBjaGVja19wYWNrZXRfZXF1YWwoe2tINEFjbCwgYWNsX3BhY2tldH0sIHJlYWRfYnVmKTsKLX0KLQotVEVTVF9GKEhjaUhhbFJvb3RjYW5hbFRlc3QsIHNlbmRfc2NvKSB7Ci0gIHVpbnQ4X3Qgc2NvX3BheWxvYWRfc2l6ZSA9IDIwMDsKLSAgSGNpUGFja2V0IHNjb19wYWNrZXQgPSBtYWtlX3NhbXBsZV9oY2lfc2NvX3BrdChzY29fcGF5bG9hZF9zaXplKTsKLSAgaGFsXy0+c2VuZFNjb0RhdGEoc2NvX3BhY2tldCk7Ci0gIEg0UGFja2V0IHJlYWRfYnVmKDEgKyAzICsgc2NvX3BheWxvYWRfc2l6ZSk7Ci0gIFNldEZha2VTZXJ2ZXJTb2NrZXRUb0Jsb2NraW5nKCk7Ci0gIGF1dG8gc2l6ZV9yZWFkID0gcmVhZF93aXRoX3JldHJ5KGZha2Vfc2VydmVyX3NvY2tldF8sIHJlYWRfYnVmLmRhdGEoKSwgcmVhZF9idWYuc2l6ZSgpKTsKLQotICBBU1NFUlRfRVEoc2l6ZV9yZWFkLCAxICsgc2NvX3BhY2tldC5zaXplKCkpOwotICBjaGVja19wYWNrZXRfZXF1YWwoe2tINFNjbywgc2NvX3BhY2tldH0sIHJlYWRfYnVmKTsKLX0KLQotVEVTVF9GKEhjaUhhbFJvb3RjYW5hbFRlc3QsIHNlbmRfbXVsdGlwbGVfYWNsX2JhdGNoKSB7Ci0gIHVpbnQ4X3QgYWNsX3BheWxvYWRfc2l6ZSA9IDIwMDsKLSAgaW50IG51bV9wYWNrZXRzID0gMTAwMDsKLSAgSGNpUGFja2V0IGFjbF9wYWNrZXQgPSBtYWtlX3NhbXBsZV9oY2lfYWNsX3BrdChhY2xfcGF5bG9hZF9zaXplKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7Ci0gICAgaGFsXy0+c2VuZEFjbERhdGEoYWNsX3BhY2tldCk7Ci0gIH0KLSAgSDRQYWNrZXQgcmVhZF9idWYoMSArIDIgKyAyICsgYWNsX3BheWxvYWRfc2l6ZSk7Ci0gIFNldEZha2VTZXJ2ZXJTb2NrZXRUb0Jsb2NraW5nKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3BhY2tldHM7IGkrKykgewotICAgIGF1dG8gc2l6ZV9yZWFkID0gcmVhZF93aXRoX3JldHJ5KGZha2Vfc2VydmVyX3NvY2tldF8sIHJlYWRfYnVmLmRhdGEoKSwgcmVhZF9idWYuc2l6ZSgpKTsKLSAgICBBU1NFUlRfRVEoc2l6ZV9yZWFkLCAxICsgYWNsX3BhY2tldC5zaXplKCkpOwotICAgIGNoZWNrX3BhY2tldF9lcXVhbCh7a0g0QWNsLCBhY2xfcGFja2V0fSwgcmVhZF9idWYpOwotICB9Ci19Ci0KLVRFU1RfRihIY2lIYWxSb290Y2FuYWxUZXN0LCBzZW5kX211bHRpcGxlX2FjbF9zZXF1ZW50aWFsKSB7Ci0gIHVpbnQ4X3QgYWNsX3BheWxvYWRfc2l6ZSA9IDIwMDsKLSAgaW50IG51bV9wYWNrZXRzID0gMTAwMDsKLSAgSGNpUGFja2V0IGFjbF9wYWNrZXQgPSBtYWtlX3NhbXBsZV9oY2lfYWNsX3BrdChhY2xfcGF5bG9hZF9zaXplKTsKLSAgU2V0RmFrZVNlcnZlclNvY2tldFRvQmxvY2tpbmcoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7Ci0gICAgaGFsXy0+c2VuZEFjbERhdGEoYWNsX3BhY2tldCk7Ci0gICAgSDRQYWNrZXQgcmVhZF9idWYoMSArIDIgKyAyICsgYWNsX3BheWxvYWRfc2l6ZSk7Ci0gICAgYXV0byBzaXplX3JlYWQgPSByZWFkX3dpdGhfcmV0cnkoZmFrZV9zZXJ2ZXJfc29ja2V0XywgcmVhZF9idWYuZGF0YSgpLCByZWFkX2J1Zi5zaXplKCkpOwotICAgIEFTU0VSVF9FUShzaXplX3JlYWQsIDEgKyBhY2xfcGFja2V0LnNpemUoKSk7Ci0gICAgY2hlY2tfcGFja2V0X2VxdWFsKHtrSDRBY2wsIGFjbF9wYWNrZXR9LCByZWFkX2J1Zik7Ci0gIH0KLX0KLQotVEVTVChIY2lIYWxIaWRsVGVzdCwgc2VyaWFsaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OwotICBhdXRvIHBhY2tldF9ieXRlcyA9IGhhbDo6U2VyaWFsaXplUGFja2V0KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPihuZXcgcGFja2V0OjpSYXdCdWlsZGVyKGJ5dGVzKSkpOwotICBBU1NFUlRfRVEoYnl0ZXMsIHBhY2tldF9ieXRlcyk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hhbC9zZXJpYWxpemVfcGFja2V0LmggYi9nZC9oYWwvc2VyaWFsaXplX3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFkY2VjLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9zZXJpYWxpemVfcGFja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInBhY2tldC9iYXNlX3BhY2tldF9idWlsZGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLWlubGluZSBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTZXJpYWxpemVQYWNrZXQoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfYnl0ZXM7Ci0gIHBhY2tldF9ieXRlcy5yZXNlcnZlKHBhY2tldC0+c2l6ZSgpKTsKLSAgcGFja2V0OjpCaXRJbnNlcnRlciBpdChwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0gIHJldHVybiBwYWNrZXRfYnl0ZXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hhbC9zbm9vcF9sb2dnZXIuY2MgYi9nZC9oYWwvc25vb3BfbG9nZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE3YzhlLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9zbm9vcF9sb2dnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhhbC9zbm9vcF9sb2dnZXIuaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Yml0c2V0PgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAiY29tbW9uL2NpcmN1bGFyX2J1ZmZlci5oIgotI2luY2x1ZGUgImNvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLSNpbmNsdWRlICJvcy9maWxlcy5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3BhcmFtZXRlcl9wcm92aWRlci5oIgotI2luY2x1ZGUgIm9zL3N5c3RlbV9wcm9wZXJ0aWVzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEVwb2NoIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSAwMS8wMS8wMDAwLgotY29uc3RleHByIHVpbnQ2NF90IGtCdFNub29wRXBvY2hEZWx0YSA9IDB4MDBkY2RkYjMwZjJmODAwMFVMTDsKLQotY29uc3RleHByIHVpbnQzMl90IGtCeXRlc1RvVGVzdCA9IDB4MTIzNDU2Nzg7Ci1jb25zdGV4cHIgdWludDhfdCBrRmlyc3RCeXRlID0gKGNvbnN0IHVpbnQ4X3QmKWtCeXRlc1RvVGVzdDsKLWNvbnN0ZXhwciBib29sIGlzTGl0dGxlRW5kaWFuID0ga0ZpcnN0Qnl0ZSA9PSAweDc4OwotY29uc3RleHByIGJvb2wgaXNCaWdFbmRpYW4gPSBrRmlyc3RCeXRlID09IDB4MTI7Ci1zdGF0aWNfYXNzZXJ0KGlzTGl0dGxlRW5kaWFuIHx8IGlzQmlnRW5kaWFuICYmIGlzTGl0dGxlRW5kaWFuICE9IGlzQmlnRW5kaWFuKTsKLQotY29uc3RleHByIHVpbnQzMl90IEJUU05PT1BfVkVSU0lPTl9OVU1CRVIgPSBpc0xpdHRsZUVuZGlhbiA/IDB4MDEwMDAwMDAgOiAxOwotY29uc3RleHByIHVpbnQzMl90IEJUU05PT1BfREFUQUxJTktfVFlQRSA9Ci0gICAgaXNMaXR0bGVFbmRpYW4gPyAweGVhMDMwMDAwIDogMHgwM2VhOyAgLy8gRGF0YWxpbmsgVHlwZSBjb2RlIGZvciBIQ0kgVUFSVCAoSDQpIGlzIDEwMDIKLXVpbnQ2NF90IGh0b25sbCh1aW50NjRfdCBsbCkgewotICBpZiBjb25zdGV4cHIgKGlzTGl0dGxlRW5kaWFuKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihodG9ubChsbCAmIDB4ZmZmZmZmZmYpKSA8PCAzMiB8IGh0b25sKGxsID4+IDMyKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbGw7Ci0gIH0KLX0KLQotY29uc3RleHByIFNub29wTG9nZ2VyOjpGaWxlSGVhZGVyVHlwZSBrQnRTbm9vcEZpbGVIZWFkZXIgPSB7Ci0gICAgLmlkZW50aWZpY2F0aW9uX3BhdHRlcm4gPSB7J2InLCAndCcsICdzJywgJ24nLCAnbycsICdvJywgJ3AnLCAweDAwfSwKLSAgICAudmVyc2lvbl9udW1iZXIgPSBCVFNOT09QX1ZFUlNJT05fTlVNQkVSLAotICAgIC5kYXRhbGlua190eXBlID0gQlRTTk9PUF9EQVRBTElOS19UWVBFfTsKLQotLy8gVGhlIG51bWJlciBvZiBwYWNrZXRzIHBlciBidHNub29wIGZpbGUgYmVmb3JlIHdlIHJvdGF0ZSB0byB0aGUgbmV4dCBmaWxlLiBBcyBvZiByaWdodCBub3cgdGhlcmUKLS8vIGFyZSB0d28gc25vb3AgZmlsZXMgdGhhdCBhcmUgcm90YXRlZCB0aHJvdWdoLiBUaGUgc2l6ZSBjYW4gYmUgZHluYW1pY2FsbHkgY29uZmlndXJlZCBieSBzZXR0aW5nCi0vLyB0aGUgcmVsZXZhbnQgc3lzdGVtIHByb3BlcnR5Ci1jb25zdGV4cHIgc2l6ZV90IGtEZWZhdWx0QnRTbm9vcE1heFBhY2tldHNQZXJGaWxlID0gMHhmZmZmOwotCi0vLyBXZSB3YW50IHRvIHVzZSBhdCBtb3N0IDI1NiBLQiBtZW1vcnkgZm9yIGJ0c25vb3ogbG9nCi1jb25zdGV4cHIgc2l6ZV90IGtEZWZhdWx0QnRzbm9vek1heE1lbW9yeVVzYWdlQnl0ZXMgPSAyNTYgKiAxMDI0OwotLy8gV2UgcmVzdHJpY3QgdGhlIG1heGltdW0gcGFja2V0IHNpemUgdG8gMTUwIGJ5dGVzCi1jb25zdGV4cHIgc2l6ZV90IGtEZWZhdWx0QnRTbm9vek1heEJ5dGVzUGVyUGFja2V0ID0gMTUwOwotY29uc3RleHByIHNpemVfdCBrRGVmYXVsdEJ0U25vb3pNYXhQYXlsb2FkQnl0ZXNQZXJQYWNrZXQgPQotICAgIGtEZWZhdWx0QnRTbm9vek1heEJ5dGVzUGVyUGFja2V0IC0gc2l6ZW9mKFNub29wTG9nZ2VyOjpQYWNrZXRIZWFkZXJUeXBlKTsKLS8vIENhbGN1bGF0ZSBtYXggbnVtYmVyIG9mIHBhY2tldHMgYmFzZWQgb24gbWF4IG1lbW9yeSB1c2FnZSBhbmQgbWF4IHBhY2tldCBzaXplCi1jb25zdGV4cHIgc2l6ZV90IGtEZWZhdWx0QnRTbm9vek1heFBhY2tldHNQZXJCdWZmZXIgPQotICAgIGtEZWZhdWx0QnRzbm9vek1heE1lbW9yeVVzYWdlQnl0ZXMgLyBrRGVmYXVsdEJ0U25vb3pNYXhCeXRlc1BlclBhY2tldDsKLQotc3RkOjpzdHJpbmcgZ2V0X2J0c25vb3BfbG9nX3BhdGgoc3RkOjpzdHJpbmcgbG9nX2RpciwgYm9vbCBmaWx0ZXJlZCkgewotICBpZiAoZmlsdGVyZWQpIHsKLSAgICBsb2dfZGlyLmFwcGVuZCgiLmZpbHRlcmVkIik7Ci0gIH0KLSAgcmV0dXJuIGxvZ19kaXI7Ci19Ci0KLXN0ZDo6c3RyaW5nIGdldF9sYXN0X2xvZ19wYXRoKHN0ZDo6c3RyaW5nIGxvZ19maWxlX3BhdGgpIHsKLSAgcmV0dXJuIGxvZ19maWxlX3BhdGguYXBwZW5kKCIubGFzdCIpOwotfQotCi12b2lkIGRlbGV0ZV9idHNub29wX2ZpbGVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2dfcGF0aCkgewotICBMT0dfSU5GTygiRGVsZXRpbmcgbG9ncyBpZiB0aGV5IGV4aXN0Iik7Ci0gIGlmIChvczo6RmlsZUV4aXN0cyhsb2dfcGF0aCkpIHsKLSAgICBpZiAoIW9zOjpSZW1vdmVGaWxlKGxvZ19wYXRoKSkgewotICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVtb3ZlIG1haW4gbG9nIGZpbGUgYXQgXCIlc1wiIiwgbG9nX3BhdGguY19zdHIoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJNYWluIGxvZyBmaWxlIGRvZXMgbm90IGV4aXN0IGF0IFwiJXNcIiIsIGxvZ19wYXRoLmNfc3RyKCkpOwotICB9Ci0gIGF1dG8gbGFzdF9sb2dfcGF0aCA9IGdldF9sYXN0X2xvZ19wYXRoKGxvZ19wYXRoKTsKLSAgaWYgKG9zOjpGaWxlRXhpc3RzKGxhc3RfbG9nX3BhdGgpKSB7Ci0gICAgaWYgKCFvczo6UmVtb3ZlRmlsZShsYXN0X2xvZ19wYXRoKSkgewotICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVtb3ZlIGxhc3QgbG9nIGZpbGUgYXQgXCIlc1wiIiwgbG9nX3BhdGguY19zdHIoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJMYXN0IGxvZyBmaWxlIGRvZXMgbm90IGV4aXN0IGF0IFwiJXNcIiIsIGxvZ19wYXRoLmNfc3RyKCkpOwotICB9Ci19Ci0KLXNpemVfdCBnZXRfYnRzbm9vel9wYWNrZXRfbGVuZ3RoX3RvX3dyaXRlKGNvbnN0IEhjaVBhY2tldCYgcGFja2V0LCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZSB0eXBlKSB7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0FjbEhlYWRlclNpemUgPSA0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMMmNhcEhlYWRlclNpemUgPSA0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMMmNhcENpZE9mZnNldCA9IChrQWNsSGVhZGVyU2l6ZSArIDIpOwotICBzdGF0aWMgY29uc3QgdWludDE2X3Qga0wyY2FwU2lnbmFsaW5nQ2lkID0gMHgwMDAxOwotCi0gIC8vIE1heGltdW0gYW1vdW50IG9mIEFDTCBkYXRhIHRvIGxvZy4KLSAgLy8gRW5vdWdoIGZvciBhbiBSRkNPTU0gZnJhbWUgdXAgdG8gdGhlIGZyYW1lIGNoZWNrOwotICAvLyBub3QgZW5vdWdoIGZvciBhIEhJRCByZXBvcnQgb3IgYXVkaW8gZGF0YS4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4QnRzbm9vekFjbFNpemUgPSAxNDsKLQotICAvLyBDYWxjdWxhdGUgcGFja2V0IGxlbmd0aCB0byBiZSBpbmNsdWRlZAotICBzaXplX3QgaW5jbHVkZWRfbGVuZ3RoID0gMDsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6Q01EOgotICAgIGNhc2UgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkVWVDoKLSAgICAgIGluY2x1ZGVkX2xlbmd0aCA9IHBhY2tldC5zaXplKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkFDTDogewotICAgICAgLy8gTG9nIEFDTCBhbmQgTDJDQVAgaGVhZGVyIGJ5IGRlZmF1bHQKLSAgICAgIHNpemVfdCBsZW5faGNpX2FjbCA9IGtBY2xIZWFkZXJTaXplICsga0wyY2FwSGVhZGVyU2l6ZTsKLSAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIGFuIEwyQ0FQIGhlYWRlcgotICAgICAgaWYgKHBhY2tldC5zaXplKCkgPiBsZW5faGNpX2FjbCkgewotICAgICAgICB1aW50MTZfdCBsMmNhcF9jaWQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHBhY2tldFtrTDJjYXBDaWRPZmZzZXRdKSB8Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oKHN0YXRpY19jYXN0PHVpbnQxNl90PihwYWNrZXRba0wyY2FwQ2lkT2Zmc2V0ICsgMV0pIDw8IHN0YXRpY19jYXN0PHVpbnQxNl90Pig4KSkpOwotICAgICAgICBpZiAobDJjYXBfY2lkID09IGtMMmNhcFNpZ25hbGluZ0NpZCkgewotICAgICAgICAgIC8vIEZvciB0aGUgc2lnbmFsaW5nIENJRCwgdGFrZSB0aGUgZnVsbCBwYWNrZXQuCi0gICAgICAgICAgLy8gVGhhdCB3YXksIHRoZSBQU00gc2V0dXAgaXMgY2FwdHVyZWQsIGFsbG93aW5nIGRlY29kaW5nIG9mIFBTTXMgZG93bgotICAgICAgICAgIC8vIHRoZSByb2FkLgotICAgICAgICAgIHJldHVybiBwYWNrZXQuc2l6ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGFzIG11Y2ggYXMgd2UgcmVhc29uYWJseSBjYW4KLSAgICAgICAgICBsZW5faGNpX2FjbCA9IGtNYXhCdHNub296QWNsU2l6ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5jbHVkZWRfbGVuZ3RoID0gc3RkOjptaW4obGVuX2hjaV9hY2wsIHBhY2tldC5zaXplKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6SVNPOgotICAgIGNhc2UgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OlNDTzoKLSAgICBkZWZhdWx0OgotICAgICAgLy8gV2UgYXJlIG5vdCBsb2dnaW5nIFNDTyBhbmQgSVNPIHBhY2tldHMgaW4gc25vb3ogbG9nIGFzIHRoZXkgbWF5IGNvbnRhaW4gdm9pY2UgZGF0YQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHN0ZDo6bWluKGluY2x1ZGVkX2xlbmd0aCwga0RlZmF1bHRCdFNub296TWF4UGF5bG9hZEJ5dGVzUGVyUGFja2V0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNvbnN0IHN0ZDo6c3RyaW5nIFNub29wTG9nZ2VyOjprQnRTbm9vcExvZ01vZGVEaXNhYmxlZCA9ICJkaXNhYmxlZCI7Ci1jb25zdCBzdGQ6OnN0cmluZyBTbm9vcExvZ2dlcjo6a0J0U25vb3BMb2dNb2RlRmlsdGVyZWQgPSAiZmlsdGVyZWQiOwotY29uc3Qgc3RkOjpzdHJpbmcgU25vb3BMb2dnZXI6OmtCdFNub29wTG9nTW9kZUZ1bGwgPSAiZnVsbCI7Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nIFNub29wTG9nZ2VyOjprQnRTbm9vcE1heFBhY2tldHNQZXJGaWxlUHJvcGVydHkgPSAicGVyc2lzdC5ibHVldG9vdGguYnRzbm9vcHNpemUiOwotY29uc3Qgc3RkOjpzdHJpbmcgU25vb3BMb2dnZXI6OmtJc0RlYnVnZ2FibGVQcm9wZXJ0eSA9ICJyby5kZWJ1Z2dhYmxlIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIFNub29wTG9nZ2VyOjprQnRTbm9vcExvZ01vZGVQcm9wZXJ0eSA9ICJwZXJzaXN0LmJsdWV0b290aC5idHNub29wbG9nbW9kZSI7Ci1jb25zdCBzdGQ6OnN0cmluZyBTbm9vcExvZ2dlcjo6a0J0U25vb3BEZWZhdWx0TG9nTW9kZVByb3BlcnR5ID0gInBlcnNpc3QuYmx1ZXRvb3RoLmJ0c25vb3BkZWZhdWx0bW9kZSI7Ci0KLVNub29wTG9nZ2VyOjpTbm9vcExvZ2dlcigKLSAgICBzdGQ6OnN0cmluZyBzbm9vcF9sb2dfcGF0aCwKLSAgICBzdGQ6OnN0cmluZyBzbm9vel9sb2dfcGF0aCwKLSAgICBzaXplX3QgbWF4X3BhY2tldHNfcGVyX2ZpbGUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ0c25vb3BfbW9kZSkKLSAgICA6IHNub29wX2xvZ19wYXRoXyhzdGQ6Om1vdmUoc25vb3BfbG9nX3BhdGgpKSwKLSAgICAgIHNub296X2xvZ19wYXRoXyhzdGQ6Om1vdmUoc25vb3pfbG9nX3BhdGgpKSwKLSAgICAgIG1heF9wYWNrZXRzX3Blcl9maWxlXyhtYXhfcGFja2V0c19wZXJfZmlsZSksCi0gICAgICBidHNub296X2J1ZmZlcl8oa0RlZmF1bHRCdFNub296TWF4UGFja2V0c1BlckJ1ZmZlcikgewotICBpZiAoZmFsc2UgJiYgYnRzbm9vcF9tb2RlID09IGtCdFNub29wTG9nTW9kZUZpbHRlcmVkKSB7Ci0gICAgLy8gVE9ETyhiLzE2MzczMzUzOCk6IGltcGxlbWVudCBmaWx0ZXJlZCBzbm9vcCBsb2cgaW4gR0QsIGN1cnJlbnRseSBmaWx0ZXJlZCA9PSBkaXNhYmxlZAotICAgIExPR19JTkZPKCJGaWx0ZXJlZCBTbm9vcCBMb2dzIGVuYWJsZWQiKTsKLSAgICBpc19lbmFibGVkXyA9IHRydWU7Ci0gICAgaXNfZmlsdGVyZWRfID0gdHJ1ZTsKLSAgICAvLyBkZWxldGUgdW5maWx0ZXJlZCBsb2dzCi0gICAgZGVsZXRlX2J0c25vb3BfZmlsZXMoZ2V0X2J0c25vb3BfbG9nX3BhdGgoc25vb3BfbG9nX3BhdGhfLCBmYWxzZSkpOwotICAgIC8vIGRlbGV0ZSBzbm9veiBsb2dzCi0gICAgZGVsZXRlX2J0c25vb3BfZmlsZXMoc25vb3pfbG9nX3BhdGhfKTsKLSAgfSBlbHNlIGlmIChidHNub29wX21vZGUgPT0ga0J0U25vb3BMb2dNb2RlRnVsbCkgewotICAgIExPR19JTkZPKCJTbm9vcCBMb2dzIGZ1bGx5IGVuYWJsZWQiKTsKLSAgICBpc19lbmFibGVkXyA9IHRydWU7Ci0gICAgaXNfZmlsdGVyZWRfID0gZmFsc2U7Ci0gICAgLy8gZGVsZXRlIGZpbHRlcmVkIGxvZ3MKLSAgICBkZWxldGVfYnRzbm9vcF9maWxlcyhnZXRfYnRzbm9vcF9sb2dfcGF0aChzbm9vcF9sb2dfcGF0aF8sIHRydWUpKTsKLSAgICAvLyBkZWxldGUgc25vb3ogbG9ncwotICAgIGRlbGV0ZV9idHNub29wX2ZpbGVzKHNub296X2xvZ19wYXRoXyk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oIlNub29wIExvZ3MgZGlzYWJsZWQiKTsKLSAgICBpc19lbmFibGVkXyA9IGZhbHNlOwotICAgIGlzX2ZpbHRlcmVkXyA9IGZhbHNlOwotICAgIC8vIGRlbGV0ZSBib3RoIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGxvZ3MKLSAgICBkZWxldGVfYnRzbm9vcF9maWxlcyhnZXRfYnRzbm9vcF9sb2dfcGF0aChzbm9vcF9sb2dfcGF0aF8sIHRydWUpKTsKLSAgICBkZWxldGVfYnRzbm9vcF9maWxlcyhnZXRfYnRzbm9vcF9sb2dfcGF0aChzbm9vcF9sb2dfcGF0aF8sIGZhbHNlKSk7Ci0gIH0KLSAgLy8gQWRkICIuZmlsdGVyZWQiIGV4dGVuc2lvbiBpZiBuZWNlc3NhcnkKLSAgc25vb3BfbG9nX3BhdGhfID0gZ2V0X2J0c25vb3BfbG9nX3BhdGgoc25vb3BfbG9nX3BhdGhfLCBpc19maWx0ZXJlZF8pOwotfQotCi12b2lkIFNub29wTG9nZ2VyOjpDbG9zZUN1cnJlbnRTbm9vcExvZ0ZpbGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhmaWxlX211dGV4Xyk7Ci0gIGlmIChidHNub29wX29zdHJlYW1fLmlzX29wZW4oKSkgewotICAgIGJ0c25vb3Bfb3N0cmVhbV8uZmx1c2goKTsKLSAgICBidHNub29wX29zdHJlYW1fLmNsb3NlKCk7Ci0gIH0KLSAgcGFja2V0X2NvdW50ZXJfID0gMDsKLX0KLQotdm9pZCBTbm9vcExvZ2dlcjo6T3Blbk5leHRTbm9vcExvZ0ZpbGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhmaWxlX211dGV4Xyk7Ci0gIENsb3NlQ3VycmVudFNub29wTG9nRmlsZSgpOwotCi0gIGF1dG8gbGFzdF9maWxlX3BhdGggPSBnZXRfbGFzdF9sb2dfcGF0aChzbm9vcF9sb2dfcGF0aF8pOwotCi0gIGlmIChvczo6RmlsZUV4aXN0cyhzbm9vcF9sb2dfcGF0aF8pKSB7Ci0gICAgaWYgKCFvczo6UmVuYW1lRmlsZShzbm9vcF9sb2dfcGF0aF8sIGxhc3RfZmlsZV9wYXRoKSkgewotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJVbmFibGVkIHRvIHJlbmFtZSBleGlzdGluZyBzbm9vcCBsb2cgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIiwKLSAgICAgICAgICBzbm9vcF9sb2dfcGF0aF8uY19zdHIoKSwKLSAgICAgICAgICBsYXN0X2ZpbGVfcGF0aC5jX3N0cigpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oIlByZXZpb3VzIGxvZyBmaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCwgc2tpcCByZW5hbWluZyIsIHNub29wX2xvZ19wYXRoXy5jX3N0cigpKTsKLSAgfQotCi0gIG1vZGVfdCBwcmV2bWFzayA9IHVtYXNrKDApOwotICAvLyBkbyBub3QgdXNlIHN0ZDo6aW9zOjphcHAgYXMgd2Ugd2FudCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgZmlsZQotICBidHNub29wX29zdHJlYW1fLm9wZW4oc25vb3BfbG9nX3BhdGhfLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6Om91dCk7Ci0gIGlmICghYnRzbm9vcF9vc3RyZWFtXy5nb29kKCkpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmFibGUgdG8gb3BlbiBzbm9vcCBsb2cgYXQgXCIlc1wiLCBlcnJvcjogXCIlc1wiIiwgc25vb3BfbG9nX3BhdGhfLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLSAgdW1hc2socHJldm1hc2spOwotICBpZiAoIWJ0c25vb3Bfb3N0cmVhbV8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmtCdFNub29wRmlsZUhlYWRlciksIHNpemVvZihGaWxlSGVhZGVyVHlwZSkpKSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiVW5hYmxlIHRvIHdyaXRlIGZpbGUgaGVhZGVyIHRvIFwiJXNcIiwgZXJyb3I6IFwiJXNcIiIsIHNub29wX2xvZ19wYXRoXy5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci0gIGlmICghYnRzbm9vcF9vc3RyZWFtXy5mbHVzaCgpKSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZmx1c2gsIGVycm9yOiBcIiVzXCIiLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci19Ci0KLXZvaWQgU25vb3BMb2dnZXI6OkNhcHR1cmUoY29uc3QgSGNpUGFja2V0JiBwYWNrZXQsIERpcmVjdGlvbiBkaXJlY3Rpb24sIFBhY2tldFR5cGUgdHlwZSkgewotICB1aW50NjRfdCB0aW1lc3RhbXBfdXMgPQotICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKQotICAgICAgICAgIC5jb3VudCgpOwotICBzdGQ6OmJpdHNldDwzMj4gZmxhZ3MgPSAwOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFBhY2tldFR5cGU6OkNNRDoKLSAgICAgIGZsYWdzLnNldCgwLCBmYWxzZSk7Ci0gICAgICBmbGFncy5zZXQoMSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhY2tldFR5cGU6OkFDTDoKLSAgICBjYXNlIFBhY2tldFR5cGU6OklTTzoKLSAgICBjYXNlIFBhY2tldFR5cGU6OlNDTzoKLSAgICAgIGZsYWdzLnNldCgwLCBkaXJlY3Rpb24gPT0gRGlyZWN0aW9uOjpJTkNPTUlORyk7Ci0gICAgICBmbGFncy5zZXQoMSwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWNrZXRUeXBlOjpFVlQ6Ci0gICAgICBmbGFncy5zZXQoMCwgdHJ1ZSk7Ci0gICAgICBmbGFncy5zZXQoMSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotICB1aW50MzJfdCBsZW5ndGggPSBwYWNrZXQuc2l6ZSgpICsgLyogdHlwZSBieXRlICovIDE7Ci0gIFBhY2tldEhlYWRlclR5cGUgaGVhZGVyID0gey5sZW5ndGhfb3JpZ2luYWwgPSBodG9ubChsZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoX2NhcHR1cmVkID0gaHRvbmwobGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gaHRvbmwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGZsYWdzLnRvX3Vsb25nKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRyb3BwZWRfcGFja2V0cyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aW1lc3RhbXAgPSBodG9ubGwodGltZXN0YW1wX3VzICsga0J0U25vb3BFcG9jaERlbHRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih0eXBlKX07Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soZmlsZV9tdXRleF8pOwotICAgIGlmICghaXNfZW5hYmxlZF8pIHsKLSAgICAgIC8vIGJ0c25vb3AgZGlzYWJsZWQsIGxvZyBpbi1tZW1vcnkgYnRzbm9veiBsb2cgb25seQotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICBzaXplX3QgaW5jbHVkZWRfbGVuZ3RoID0gZ2V0X2J0c25vb3pfcGFja2V0X2xlbmd0aF90b193cml0ZShwYWNrZXQsIHR5cGUpOwotICAgICAgaGVhZGVyLmxlbmd0aF9jYXB0dXJlZCA9IGh0b25sKGluY2x1ZGVkX2xlbmd0aCArIC8qIHR5cGUgYnl0ZSAqLyAxKTsKLSAgICAgIGlmICghc3Mud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmhlYWRlciksIHNpemVvZihQYWNrZXRIZWFkZXJUeXBlKSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gd3JpdGUgcGFja2V0IGhlYWRlciBmb3IgYnRzbm9veiwgZXJyb3I6IFwiJXNcIiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoIXNzLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBhY2tldC5kYXRhKCkpLCBpbmNsdWRlZF9sZW5ndGgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHdyaXRlIHBhY2tldCBwYXlsb2FkIGZvciBidHNub296LCBlcnJvcjogXCIlc1wiIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIH0KLSAgICAgIGJ0c25vb3pfYnVmZmVyXy5QdXNoKHNzLnN0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcGFja2V0X2NvdW50ZXJfKys7Ci0gICAgaWYgKHBhY2tldF9jb3VudGVyXyA+IG1heF9wYWNrZXRzX3Blcl9maWxlXykgewotICAgICAgT3Blbk5leHRTbm9vcExvZ0ZpbGUoKTsKLSAgICB9Ci0gICAgaWYgKCFidHNub29wX29zdHJlYW1fLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZoZWFkZXIpLCBzaXplb2YoUGFja2V0SGVhZGVyVHlwZSkpKSB7Ci0gICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byB3cml0ZSBwYWNrZXQgaGVhZGVyIGZvciBidHNub29wLCBlcnJvcjogXCIlc1wiIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgaWYgKCFidHNub29wX29zdHJlYW1fLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBhY2tldC5kYXRhKCkpLCBwYWNrZXQuc2l6ZSgpKSkgewotICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gd3JpdGUgcGFja2V0IHBheWxvYWQgZm9yIGJ0c25vb3AsIGVycm9yOiBcIiVzXCIiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgICAvLyBzdGQ6Om9mc3RyZWFtOjpmbHVzaCgpIHB1c2hlcyB1c2VyIGRhdGEgaW50byBrZXJuZWwgbWVtb3J5LiBUaGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gZXZlbiBpZiB0aGlzIHByb2Nlc3MKLSAgICAvLyBjcmFzaGVzLiBIb3dldmVyLCBkYXRhIHdpbGwgYmUgbG9zdCBpZiB0aGVyZSBpcyBhIGtlcm5lbCBwYW5pYywgd2hpY2ggaXMgb3V0IG9mIHNjb3BlIG9mIEJUIHNub29wIGxvZy4KLSAgICAvLyBOT1RFOiBzdGQ6Om9mc3RyZWFtOjp3cml0ZSgpIGZvbGxvd2VkIGJ5IHN0ZDo6b2ZzdHJlYW06OmZsdXNoKCkgaGFzIHNpbWlsYXIgZWZmZWN0IGFzIFVOSVggd3JpdGUoZmQsIGRhdGEsIGxlbikKLSAgICAvLyAgICAgICBhcyB3cml0ZSgpIHN5c2NhbGwgZHVtcHMgZGF0YSBpbnRvIGtlcm5lbCBtZW1vcnkgZGlyZWN0bHkKLSAgICBpZiAoIWJ0c25vb3Bfb3N0cmVhbV8uZmx1c2goKSkgewotICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZmx1c2gsIGVycm9yOiBcIiVzXCIiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFNub29wTG9nZ2VyOjpEdW1wU25vb3pMb2dUb0ZpbGUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkYXRhKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhmaWxlX211dGV4Xyk7Ci0gIGlmIChpc19lbmFibGVkXykgewotICAgIExPR19ERUJVRygiYnRzbm9vcCBsb2cgaXMgZW5hYmxlZCwgc2tpcCBkdW1waW5nIGJ0c25vb3ogbG9nIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBsYXN0X2ZpbGVfcGF0aCA9IGdldF9sYXN0X2xvZ19wYXRoKHNub296X2xvZ19wYXRoXyk7Ci0KLSAgaWYgKG9zOjpGaWxlRXhpc3RzKHNub296X2xvZ19wYXRoXykpIHsKLSAgICBpZiAoIW9zOjpSZW5hbWVGaWxlKHNub296X2xvZ19wYXRoXywgbGFzdF9maWxlX3BhdGgpKSB7Ci0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIlVuYWJsZWQgdG8gcmVuYW1lIGV4aXN0aW5nIHNub296IGxvZyBmcm9tIFwiJXNcIiB0byBcIiVzXCIiLAotICAgICAgICAgIHNub296X2xvZ19wYXRoXy5jX3N0cigpLAotICAgICAgICAgIGxhc3RfZmlsZV9wYXRoLmNfc3RyKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiUHJldmlvdXMgbG9nIGZpbGUgXCIlc1wiIGRvZXMgbm90IGV4aXN0LCBza2lwIHJlbmFtaW5nIiwgc25vb3pfbG9nX3BhdGhfLmNfc3RyKCkpOwotICB9Ci0KLSAgbW9kZV90IHByZXZtYXNrID0gdW1hc2soMCk7Ci0gIC8vIGRvIG5vdCB1c2Ugc3RkOjppb3M6OmFwcCBhcyB3ZSB3YW50IG92ZXJyaWRlIHRoZSBleGlzdGluZyBmaWxlCi0gIHN0ZDo6b2ZzdHJlYW0gYnRzbm9vel9vc3RyZWFtKHNub296X2xvZ19wYXRoXywgc3RkOjppb3M6OmJpbmFyeSB8IHN0ZDo6aW9zOjpvdXQpOwotICBpZiAoIWJ0c25vb3pfb3N0cmVhbS5nb29kKCkpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmFibGUgdG8gb3BlbiBzbm9vcCBsb2cgYXQgXCIlc1wiLCBlcnJvcjogXCIlc1wiIiwgc25vb3pfbG9nX3BhdGhfLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLSAgdW1hc2socHJldm1hc2spOwotICBpZiAoIWJ0c25vb3pfb3N0cmVhbS53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigma0J0U25vb3BGaWxlSGVhZGVyKSwgc2l6ZW9mKEZpbGVIZWFkZXJUeXBlKSkpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmFibGUgdG8gd3JpdGUgZmlsZSBoZWFkZXIgdG8gXCIlc1wiLCBlcnJvcjogXCIlc1wiIiwgc25vb3pfbG9nX3BhdGhfLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiBwYWNrZXQgOiBkYXRhKSB7Ci0gICAgaWYgKCFidHNub296X29zdHJlYW0ud3JpdGUocGFja2V0LmRhdGEoKSwgcGFja2V0LnNpemUoKSkpIHsKLSAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHdyaXRlIHBhY2tldCBwYXlsb2FkIGZvciBidHNub296LCBlcnJvcjogXCIlc1wiIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFidHNub296X29zdHJlYW0uZmx1c2goKSkgewotICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGZsdXNoLCBlcnJvcjogXCIlc1wiIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotfQotCi12b2lkIFNub29wTG9nZ2VyOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgLy8gV2UgaGF2ZSBubyBkZXBlbmRlbmNpZXMKLX0KLQotdm9pZCBTbm9vcExvZ2dlcjo6U3RhcnQoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhmaWxlX211dGV4Xyk7Ci0gIGlmIChpc19lbmFibGVkXykgewotICAgIE9wZW5OZXh0U25vb3BMb2dGaWxlKCk7Ci0gIH0KLX0KLQotdm9pZCBTbm9vcExvZ2dlcjo6U3RvcCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGZpbGVfbXV0ZXhfKTsKLSAgTE9HX0RFQlVHKCJEdW1waW5nIGJ0c25vb3ogbG9nIGRhdGEgdG8gJXMiLCBzbm9vel9sb2dfcGF0aF8uY19zdHIoKSk7Ci0gIER1bXBTbm9vekxvZ1RvRmlsZShidHNub296X2J1ZmZlcl8uRHJhaW4oKSk7Ci0gIExPR19ERUJVRygiQ2xvc2luZyBidHNub29wIGxvZyBkYXRhIGF0ICVzIiwgc25vb3BfbG9nX3BhdGhfLmNfc3RyKCkpOwotICBDbG9zZUN1cnJlbnRTbm9vcExvZ0ZpbGUoKTsKLX0KLQotRHVtcHN5c0RhdGFGaW5pc2hlciBTbm9vcExvZ2dlcjo6R2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBidWlsZGVyKSBjb25zdCB7Ci0gIExPR19ERUJVRygiRHVtcGluZyBidHNub296IGxvZyBkYXRhIHRvICVzIiwgc25vb3pfbG9nX3BhdGhfLmNfc3RyKCkpOwotICBEdW1wU25vb3pMb2dUb0ZpbGUoYnRzbm9vel9idWZmZXJfLlB1bGwoKSk7Ci0gIHJldHVybiBNb2R1bGU6OkdldER1bXBzeXNEYXRhKGJ1aWxkZXIpOwotfQotCi1zaXplX3QgU25vb3BMb2dnZXI6OkdldE1heFBhY2tldHNQZXJGaWxlKCkgewotICAvLyBBbGxvdyBvdmVycmlkZSBtYXggcGFja2V0IHBlciBmaWxlIHZpYSBzeXN0ZW0gcHJvcGVydHkKLSAgYXV0byBtYXhfcGFja2V0c19wZXJfZmlsZSA9IGtEZWZhdWx0QnRTbm9vcE1heFBhY2tldHNQZXJGaWxlOwotICB7Ci0gICAgYXV0byBtYXhfcGFja2V0c19wZXJfZmlsZV9wcm9wID0gb3M6OkdldFN5c3RlbVByb3BlcnR5KGtCdFNub29wTWF4UGFja2V0c1BlckZpbGVQcm9wZXJ0eSk7Ci0gICAgaWYgKG1heF9wYWNrZXRzX3Blcl9maWxlX3Byb3ApIHsKLSAgICAgIGF1dG8gbWF4X3BhY2tldHNfcGVyX2ZpbGVfbnVtYmVyID0gY29tbW9uOjpVaW50NjRGcm9tU3RyaW5nKG1heF9wYWNrZXRzX3Blcl9maWxlX3Byb3AudmFsdWUoKSk7Ci0gICAgICBpZiAobWF4X3BhY2tldHNfcGVyX2ZpbGVfbnVtYmVyKSB7Ci0gICAgICAgIG1heF9wYWNrZXRzX3Blcl9maWxlID0gbWF4X3BhY2tldHNfcGVyX2ZpbGVfbnVtYmVyLnZhbHVlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBtYXhfcGFja2V0c19wZXJfZmlsZTsKLX0KLQotc3RkOjpzdHJpbmcgU25vb3BMb2dnZXI6OkdldEJ0U25vb3BNb2RlKCkgewotICAvLyBEZWZhdWx0IG1vZGUgaXMgRElTQUJMRUQgb24gdXNlciBidWlsZC4KLSAgLy8gSW4gdXNlcmRlYnVnL2VuZyBidWlsZCwgaXQgY2FuIGFsc28gYmUgb3ZlcndyaXR0ZW4gYnkgbW9kaWZ5aW5nIHRoZSBnbG9iYWwgc2V0dGluZwotICBzdGQ6OnN0cmluZyBkZWZhdWx0X21vZGUgPSBrQnRTbm9vcExvZ01vZGVEaXNhYmxlZDsKLSAgewotICAgIGF1dG8gaXNfZGVidWdnYWJsZSA9IG9zOjpHZXRTeXN0ZW1Qcm9wZXJ0eShrSXNEZWJ1Z2dhYmxlUHJvcGVydHkpOwotICAgIGlmIChpc19kZWJ1Z2dhYmxlLmhhc192YWx1ZSgpICYmIGNvbW1vbjo6U3RyaW5nVHJpbShpc19kZWJ1Z2dhYmxlLnZhbHVlKCkpID09ICIxIikgewotICAgICAgYXV0byBkZWZhdWx0X21vZGVfcHJvcGVydHkgPSBvczo6R2V0U3lzdGVtUHJvcGVydHkoa0J0U25vb3BEZWZhdWx0TG9nTW9kZVByb3BlcnR5KTsKLSAgICAgIGlmIChkZWZhdWx0X21vZGVfcHJvcGVydHkpIHsKLSAgICAgICAgZGVmYXVsdF9tb2RlID0gc3RkOjptb3ZlKGRlZmF1bHRfbW9kZV9wcm9wZXJ0eS52YWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFjdHVhbCBtb2RlIGlmIGV4aXN0Ci0gIHN0ZDo6c3RyaW5nIGJ0c25vb3BfbW9kZSA9IGRlZmF1bHRfbW9kZTsKLSAgewotICAgIGF1dG8gYnRzbm9vcF9tb2RlX3Byb3AgPSBvczo6R2V0U3lzdGVtUHJvcGVydHkoa0J0U25vb3BMb2dNb2RlUHJvcGVydHkpOwotICAgIGlmIChidHNub29wX21vZGVfcHJvcCkgewotICAgICAgYnRzbm9vcF9tb2RlID0gc3RkOjptb3ZlKGJ0c25vb3BfbW9kZV9wcm9wLnZhbHVlKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gYnRzbm9vcF9tb2RlOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFNub29wTG9nZ2VyOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsKLSAgcmV0dXJuIG5ldyBTbm9vcExvZ2dlcigKLSAgICAgIG9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6U25vb3BMb2dGaWxlUGF0aCgpLAotICAgICAgb3M6OlBhcmFtZXRlclByb3ZpZGVyOjpTbm9vekxvZ0ZpbGVQYXRoKCksCi0gICAgICBHZXRNYXhQYWNrZXRzUGVyRmlsZSgpLAotICAgICAgR2V0QnRTbm9vcE1vZGUoKSk7Ci19KTsKLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGFsL3Nub29wX2xvZ2dlci5oIGIvZ2QvaGFsL3Nub29wX2xvZ2dlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmU4OGQ4Li4wMDAwMDAwCi0tLSBhL2dkL2hhbC9zbm9vcF9sb2dnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiY29tbW9uL2NpcmN1bGFyX2J1ZmZlci5oIgotI2luY2x1ZGUgImhhbC9oY2lfaGFsLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIFNub29wTG9nZ2VyIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0J0U25vb3BMb2dNb2RlRGlzYWJsZWQ7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQnRTbm9vcExvZ01vZGVGaWx0ZXJlZDsKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtCdFNub29wTG9nTW9kZUZ1bGw7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtCdFNub29wTWF4UGFja2V0c1BlckZpbGVQcm9wZXJ0eTsKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJc0RlYnVnZ2FibGVQcm9wZXJ0eTsKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtCdFNub29wTG9nTW9kZVByb3BlcnR5OwotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0J0U25vb3BEZWZhdWx0TG9nTW9kZVByb3BlcnR5OwotCi0gIC8vIFB1dCBpbiBoZWFkZXIgZm9yIHRlc3QKLSAgc3RydWN0IFBhY2tldEhlYWRlclR5cGUgewotICAgIHVpbnQzMl90IGxlbmd0aF9vcmlnaW5hbDsKLSAgICB1aW50MzJfdCBsZW5ndGhfY2FwdHVyZWQ7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgdWludDMyX3QgZHJvcHBlZF9wYWNrZXRzOwotICAgIHVpbnQ2NF90IHRpbWVzdGFtcDsKLSAgICB1aW50OF90IHR5cGU7Ci0gIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0gIC8vIFB1dCBpbiBoZWFkZXIgZm9yIHRlc3QKLSAgc3RydWN0IEZpbGVIZWFkZXJUeXBlIHsKLSAgICB1aW50OF90IGlkZW50aWZpY2F0aW9uX3BhdHRlcm5bOF07Ci0gICAgdWludDMyX3QgdmVyc2lvbl9udW1iZXI7Ci0gICAgdWludDMyX3QgZGF0YWxpbmtfdHlwZTsKLSAgfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyBwZXIgZmlsZQotICAvLyBDaGFuZ2VzIHRvIHRoaXMgdmFsdWUgaXMgb25seSBlZmZlY3RpdmUgYWZ0ZXIgcmVzdGFydGluZyBCbHVldG9vdGgKLSAgc3RhdGljIHNpemVfdCBHZXRNYXhQYWNrZXRzUGVyRmlsZSgpOwotCi0gIC8vIEdldCBzbm9vcCBsb2dnZXIgbW9kZSBiYXNlZCBvbiBjdXJyZW50IHN5c3RlbSBzZXR1cAotICAvLyBDaGFuZ2VzIHRvIHRoaXMgdmFsdWVzIGlzIG9ubHkgZWZmZWN0aXZlIGFmdGVyIHJlc3RhcnRpbmcgQmx1ZXRvb3RoCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRCdFNub29wTW9kZSgpOwotCi0gIC8vIEhhcyB0byBiZSBkZWZpbmVkIGZyb20gMSB0byA0IHBlciBidHNub29wIGZvcm1hdAotICBlbnVtIFBhY2tldFR5cGUgewotICAgIENNRCA9IDEsCi0gICAgQUNMID0gMiwKLSAgICBTQ08gPSAzLAotICAgIEVWVCA9IDQsCi0gICAgSVNPID0gNSwKLSAgfTsKLQotICBlbnVtIERpcmVjdGlvbiB7Ci0gICAgSU5DT01JTkcsCi0gICAgT1VUR09JTkcsCi0gIH07Ci0KLSAgdm9pZCBDYXB0dXJlKGNvbnN0IEhjaVBhY2tldCYgcGFja2V0LCBEaXJlY3Rpb24gZGlyZWN0aW9uLCBQYWNrZXRUeXBlIHR5cGUpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIER1bXBzeXNEYXRhRmluaXNoZXIgR2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBidWlsZGVyKSBjb25zdCBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJTbm9vcExvZ2dlciIpOwotICB9Ci0KLSAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZwotICBTbm9vcExvZ2dlcigKLSAgICAgIHN0ZDo6c3RyaW5nIHNub29wX2xvZ19wYXRoLAotICAgICAgc3RkOjpzdHJpbmcgc25vb3pfbG9nX3BhdGgsCi0gICAgICBzaXplX3QgbWF4X3BhY2tldHNfcGVyX2ZpbGUsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnRzbm9vcF9tb2RlKTsKLSAgdm9pZCBDbG9zZUN1cnJlbnRTbm9vcExvZ0ZpbGUoKTsKLSAgdm9pZCBPcGVuTmV4dFNub29wTG9nRmlsZSgpOwotICB2b2lkIER1bXBTbm9vekxvZ1RvRmlsZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRhdGEpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgc25vb3BfbG9nX3BhdGhfOwotICBzdGQ6OnN0cmluZyBzbm9vel9sb2dfcGF0aF87Ci0gIHN0ZDo6b2ZzdHJlYW0gYnRzbm9vcF9vc3RyZWFtXzsKLSAgYm9vbCBpc19lbmFibGVkXyA9IGZhbHNlOwotICBib29sIGlzX2ZpbHRlcmVkXyA9IGZhbHNlOwotICBzaXplX3QgbWF4X3BhY2tldHNfcGVyX2ZpbGVfOwotICBjb21tb246OkNpcmN1bGFyQnVmZmVyPHN0ZDo6c3RyaW5nPiBidHNub296X2J1ZmZlcl87Ci0gIHNpemVfdCBwYWNrZXRfY291bnRlcl8gPSAwOwotICBtdXRhYmxlIHN0ZDo6cmVjdXJzaXZlX211dGV4IGZpbGVfbXV0ZXhfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGFsL3Nub29wX2xvZ2dlcl90ZXN0LmNjIGIvZ2QvaGFsL3Nub29wX2xvZ2dlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZlOTJkLi4wMDAwMDAwCi0tLSBhL2dkL2hhbC9zbm9vcF9sb2dnZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGFsL3Nub29wX2xvZ2dlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBrSW5mb3JtYXRpb25SZXF1ZXN0ID0gewotICAgIDB4ZmUsCi0gICAgMHgyZSwKLSAgICAweDBhLAotICAgIDB4MDAsCi0gICAgMHgwNiwKLSAgICAweDAwLAotICAgIDB4MDEsCi0gICAgMHgwMCwKLSAgICAweDBhLAotICAgIDB4MDIsCi0gICAgMHgwMiwKLSAgICAweDAwLAotICAgIDB4MDIsCi0gICAgMHgwMCwKLX07Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtTZHBDb25uZWN0aW9uUmVxdWVzdCA9IHsKLSAgICAweDA4LCAweDIwLCAweDBjLCAweDAwLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDBjLCAweDA0LCAweDAwLCAweDAxLCAweDAwLCAweDQ0LCAweDAwfTsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4ga0F2ZHRwU3VzcGVuZCA9IHsweDAyLCAweDAyLCAweDAwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweDhkLCAweDAwLCAweDkwLCAweDA5LCAweDA0fTsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4ga0hmcEF0TnJlYzAgPSB7MHgwMiwgMHgwMiwgMHgyMCwgMHgxMywgMHgwMCwgMHgwZiwgMHgwMCwgMHg0MSwgMHgwMCwgMHgwOSwgMHhmZiwgMHgxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4NDEsIDB4NTQsIDB4MmIsIDB4NGUsIDB4NTIsIDB4NDUsIDB4NDMsIDB4M2QsIDB4MzAsIDB4MGQsIDB4NWN9OwotCi19ICAvLyBuYW1lc3BhY2UKLQotdXNpbmcgYmx1ZXRvb3RoOjpUZXN0TW9kdWxlUmVnaXN0cnk7Ci11c2luZyBibHVldG9vdGg6OmhhbDo6U25vb3BMb2dnZXI7Ci0KLS8vIEV4cG9zZSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgZm9yIHRlc3QKLWNsYXNzIFRlc3RTbm9vcExvZ2dlck1vZHVsZSA6IHB1YmxpYyBTbm9vcExvZ2dlciB7Ci0gcHVibGljOgotICBUZXN0U25vb3BMb2dnZXJNb2R1bGUoCi0gICAgICBzdGQ6OnN0cmluZyBzbm9vcF9sb2dfcGF0aCwKLSAgICAgIHN0ZDo6c3RyaW5nIHNub296X2xvZ19wYXRoLAotICAgICAgc2l6ZV90IG1heF9wYWNrZXRzX3Blcl9maWxlLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ0c25vb3BfbW9kZSkKLSAgICAgIDogU25vb3BMb2dnZXIoc3RkOjptb3ZlKHNub29wX2xvZ19wYXRoKSwgc3RkOjptb3ZlKHNub296X2xvZ19wYXRoKSwgbWF4X3BhY2tldHNfcGVyX2ZpbGUsIGJ0c25vb3BfbW9kZSkge30KLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlRlc3RTbm9vcExvZ2dlck1vZHVsZSIpOwotICB9Ci19OwotCi1jbGFzcyBTbm9vcExvZ2dlck1vZHVsZVRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRlbXBfZGlyXyA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICAgIHRlbXBfc25vb3BfbG9nXyA9IHRlbXBfZGlyXyAvICJidHNub29wX2hjaS5sb2ciOwotICAgIHRlbXBfc25vb3BfbG9nX2xhc3RfID0gdGVtcF9kaXJfIC8gImJ0c25vb3BfaGNpLmxvZy5sYXN0IjsKLSAgICB0ZW1wX3Nub296X2xvZ18gPSB0ZW1wX2Rpcl8gLyAiYnRzbm9vel9oY2kubG9nIjsKLSAgICB0ZW1wX3Nub296X2xvZ19sYXN0XyA9IHRlbXBfZGlyXyAvICJidHNub296X2hjaS5sb2cubGFzdCI7Ci0gICAgRGVsZXRlU25vb3BMb2dGaWxlcygpOwotICAgIEFTU0VSVF9GQUxTRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ18pKTsKLSAgICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfbGFzdF8pKTsKLSAgICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vel9sb2dfKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3pfbG9nX2xhc3RfKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIERlbGV0ZVNub29wTG9nRmlsZXMoKTsKLSAgfQotCi0gIHZvaWQgRGVsZXRlU25vb3BMb2dGaWxlcygpIHsKLSAgICBpZiAoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfKSkgewotICAgICAgQVNTRVJUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpyZW1vdmUodGVtcF9zbm9vcF9sb2dfKSk7Ci0gICAgfQotICAgIGlmIChzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ19sYXN0XykpIHsKLSAgICAgIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKHRlbXBfc25vb3BfbG9nX2xhc3RfKSk7Ci0gICAgfQotICAgIGlmIChzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub296X2xvZ18pKSB7Ci0gICAgICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZSh0ZW1wX3Nub296X2xvZ18pKTsKLSAgICB9Ci0gICAgaWYgKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3pfbG9nX2xhc3RfKSkgewotICAgICAgQVNTRVJUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpyZW1vdmUodGVtcF9zbm9vel9sb2dfbGFzdF8pKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggdGVtcF9kaXJfOwotICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggdGVtcF9zbm9vcF9sb2dfOwotICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggdGVtcF9zbm9vcF9sb2dfbGFzdF87Ci0gIHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCB0ZW1wX3Nub296X2xvZ187Ci0gIHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCB0ZW1wX3Nub296X2xvZ19sYXN0XzsKLX07Ci0KLVRFU1RfRihTbm9vcExvZ2dlck1vZHVsZVRlc3QsIGVtcHR5X3Nub29wX2xvZ190ZXN0KSB7Ci0gIC8vIEFjdHVhbCB0ZXN0Ci0gIGF1dG8qIHNub29wX2xvb2dlciA9IG5ldyBUZXN0U25vb3BMb2dnZXJNb2R1bGUoCi0gICAgICB0ZW1wX3Nub29wX2xvZ18uc3RyaW5nKCksIHRlbXBfc25vb3pfbG9nXy5zdHJpbmcoKSwgMTAsIFNub29wTG9nZ2VyOjprQnRTbm9vcExvZ01vZGVGdWxsKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU25vb3BMb2dnZXI6OkZhY3RvcnksIHNub29wX2xvb2dlcik7Ci0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ18pKTsKLSAgQVNTRVJUX0ZBTFNFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3BfbG9nX2xhc3RfKSk7Ci0gIEFTU0VSVF9FUShzdGQ6OmZpbGVzeXN0ZW06OmZpbGVfc2l6ZSh0ZW1wX3Nub29wX2xvZ18pLCBzaXplb2YoU25vb3BMb2dnZXI6OkZpbGVIZWFkZXJUeXBlKSk7Ci19Ci0KLVRFU1RfRihTbm9vcExvZ2dlck1vZHVsZVRlc3QsIGRpc2FibGVfc25vb3BfbG9nX3Rlc3QpIHsKLSAgLy8gQWN0dWFsIHRlc3QKLSAgYXV0byogc25vb3BfbG9vZ2VyID0gbmV3IFRlc3RTbm9vcExvZ2dlck1vZHVsZSgKLSAgICAgIHRlbXBfc25vb3BfbG9nXy5zdHJpbmcoKSwgdGVtcF9zbm9vel9sb2dfLnN0cmluZygpLCAxMCwgU25vb3BMb2dnZXI6OmtCdFNub29wTG9nTW9kZURpc2FibGVkKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU25vb3BMb2dnZXI6OkZhY3RvcnksIHNub29wX2xvb2dlcik7Ci0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfKSk7Ci0gIEFTU0VSVF9GQUxTRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ19sYXN0XykpOwotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub296X2xvZ18pKTsKLX0KLQotVEVTVF9GKFNub29wTG9nZ2VyTW9kdWxlVGVzdCwgY2FwdHVyZV9vbmVfcGFja2V0X3Rlc3QpIHsKLSAgLy8gQWN0dWFsIHRlc3QKLSAgYXV0byogc25vb3BfbG9vZ2VyID0gbmV3IFRlc3RTbm9vcExvZ2dlck1vZHVsZSgKLSAgICAgIHRlbXBfc25vb3BfbG9nXy5zdHJpbmcoKSwgdGVtcF9zbm9vel9sb2dfLnN0cmluZygpLCAxMCwgU25vb3BMb2dnZXI6OmtCdFNub29wTG9nTW9kZUZ1bGwpOwotICBUZXN0TW9kdWxlUmVnaXN0cnkgdGVzdF9yZWdpc3RyeTsKLSAgdGVzdF9yZWdpc3RyeS5JbmplY3RUZXN0TW9kdWxlKCZTbm9vcExvZ2dlcjo6RmFjdG9yeSwgc25vb3BfbG9vZ2VyKTsKLQotICBzbm9vcF9sb29nZXItPkNhcHR1cmUoa0luZm9ybWF0aW9uUmVxdWVzdCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpDTUQpOwotCi0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ18pKTsKLSAgQVNTRVJUX0ZBTFNFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3BfbG9nX2xhc3RfKSk7Ci0gIEFTU0VSVF9FUSgKLSAgICAgIHN0ZDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplKHRlbXBfc25vb3BfbG9nXyksCi0gICAgICBzaXplb2YoU25vb3BMb2dnZXI6OkZpbGVIZWFkZXJUeXBlKSArIHNpemVvZihTbm9vcExvZ2dlcjo6UGFja2V0SGVhZGVyVHlwZSkgKyBrSW5mb3JtYXRpb25SZXF1ZXN0LnNpemUoKSk7Ci19Ci0KLVRFU1RfRihTbm9vcExvZ2dlck1vZHVsZVRlc3QsIGNhcHR1cmVfaGNpX2NtZF9idHNub296X3Rlc3QpIHsKLSAgLy8gQWN0dWFsIHRlc3QKLSAgYXV0byogc25vb3BfbG9vZ2VyID0gbmV3IFRlc3RTbm9vcExvZ2dlck1vZHVsZSgKLSAgICAgIHRlbXBfc25vb3BfbG9nXy5zdHJpbmcoKSwgdGVtcF9zbm9vel9sb2dfLnN0cmluZygpLCAxMCwgU25vb3BMb2dnZXI6OmtCdFNub29wTG9nTW9kZURpc2FibGVkKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU25vb3BMb2dnZXI6OkZhY3RvcnksIHNub29wX2xvb2dlcik7Ci0KLSAgc25vb3BfbG9vZ2VyLT5DYXB0dXJlKGtJbmZvcm1hdGlvblJlcXVlc3QsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6Q01EKTsKLQotICB0ZXN0X3JlZ2lzdHJ5LlN0b3BBbGwoKTsKLQotICAvLyBWZXJpZnkgc3RhdGVzIGFmdGVyIHRlc3QKLSAgQVNTRVJUX0ZBTFNFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3BfbG9nXykpOwotICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfbGFzdF8pKTsKLSAgQVNTRVJUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vel9sb2dfKSk7Ci0gIEFTU0VSVF9FUSgKLSAgICAgIHN0ZDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplKHRlbXBfc25vb3pfbG9nXyksCi0gICAgICBzaXplb2YoU25vb3BMb2dnZXI6OkZpbGVIZWFkZXJUeXBlKSArIHNpemVvZihTbm9vcExvZ2dlcjo6UGFja2V0SGVhZGVyVHlwZSkgKyBrSW5mb3JtYXRpb25SZXF1ZXN0LnNpemUoKSk7Ci19Ci0KLVRFU1RfRihTbm9vcExvZ2dlck1vZHVsZVRlc3QsIGNhcHR1cmVfbDJjYXBfc2lnbmFsX3BhY2tldF9idHNub296X3Rlc3QpIHsKLSAgLy8gQWN0dWFsIHRlc3QKLSAgYXV0byogc25vb3BfbG9vZ2VyID0gbmV3IFRlc3RTbm9vcExvZ2dlck1vZHVsZSgKLSAgICAgIHRlbXBfc25vb3BfbG9nXy5zdHJpbmcoKSwgdGVtcF9zbm9vel9sb2dfLnN0cmluZygpLCAxMCwgU25vb3BMb2dnZXI6OmtCdFNub29wTG9nTW9kZURpc2FibGVkKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU25vb3BMb2dnZXI6OkZhY3RvcnksIHNub29wX2xvb2dlcik7Ci0KLSAgc25vb3BfbG9vZ2VyLT5DYXB0dXJlKGtTZHBDb25uZWN0aW9uUmVxdWVzdCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpBQ0wpOwotCi0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfKSk7Ci0gIEFTU0VSVF9GQUxTRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ19sYXN0XykpOwotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub296X2xvZ18pKTsKLSAgQVNTRVJUX0VRKAotICAgICAgc3RkOjpmaWxlc3lzdGVtOjpmaWxlX3NpemUodGVtcF9zbm9vel9sb2dfKSwKLSAgICAgIHNpemVvZihTbm9vcExvZ2dlcjo6RmlsZUhlYWRlclR5cGUpICsgc2l6ZW9mKFNub29wTG9nZ2VyOjpQYWNrZXRIZWFkZXJUeXBlKSArIGtTZHBDb25uZWN0aW9uUmVxdWVzdC5zaXplKCkpOwotfQotCi1URVNUX0YoU25vb3BMb2dnZXJNb2R1bGVUZXN0LCBjYXB0dXJlX2wyY2FwX3Nob3J0X2RhdGFfcGFja2V0X2J0c25vb3pfdGVzdCkgewotICAvLyBBY3R1YWwgdGVzdAotICBhdXRvKiBzbm9vcF9sb29nZXIgPSBuZXcgVGVzdFNub29wTG9nZ2VyTW9kdWxlKAotICAgICAgdGVtcF9zbm9vcF9sb2dfLnN0cmluZygpLCB0ZW1wX3Nub296X2xvZ18uc3RyaW5nKCksIDEwLCBTbm9vcExvZ2dlcjo6a0J0U25vb3BMb2dNb2RlRGlzYWJsZWQpOwotICBUZXN0TW9kdWxlUmVnaXN0cnkgdGVzdF9yZWdpc3RyeTsKLSAgdGVzdF9yZWdpc3RyeS5JbmplY3RUZXN0TW9kdWxlKCZTbm9vcExvZ2dlcjo6RmFjdG9yeSwgc25vb3BfbG9vZ2VyKTsKLQotICBzbm9vcF9sb29nZXItPkNhcHR1cmUoa0F2ZHRwU3VzcGVuZCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpBQ0wpOwotCi0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfKSk7Ci0gIEFTU0VSVF9GQUxTRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ19sYXN0XykpOwotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub296X2xvZ18pKTsKLSAgQVNTRVJUX0VRKAotICAgICAgc3RkOjpmaWxlc3lzdGVtOjpmaWxlX3NpemUodGVtcF9zbm9vel9sb2dfKSwKLSAgICAgIHNpemVvZihTbm9vcExvZ2dlcjo6RmlsZUhlYWRlclR5cGUpICsgc2l6ZW9mKFNub29wTG9nZ2VyOjpQYWNrZXRIZWFkZXJUeXBlKSArIGtBdmR0cFN1c3BlbmQuc2l6ZSgpKTsKLX0KLQotVEVTVF9GKFNub29wTG9nZ2VyTW9kdWxlVGVzdCwgY2FwdHVyZV9sMmNhcF9sb25nX2RhdGFfcGFja2V0X2J0c25vb3pfdGVzdCkgewotICAvLyBBY3R1YWwgdGVzdAotICBhdXRvKiBzbm9vcF9sb29nZXIgPSBuZXcgVGVzdFNub29wTG9nZ2VyTW9kdWxlKAotICAgICAgdGVtcF9zbm9vcF9sb2dfLnN0cmluZygpLCB0ZW1wX3Nub296X2xvZ18uc3RyaW5nKCksIDEwLCBTbm9vcExvZ2dlcjo6a0J0U25vb3BMb2dNb2RlRGlzYWJsZWQpOwotICBUZXN0TW9kdWxlUmVnaXN0cnkgdGVzdF9yZWdpc3RyeTsKLSAgdGVzdF9yZWdpc3RyeS5JbmplY3RUZXN0TW9kdWxlKCZTbm9vcExvZ2dlcjo6RmFjdG9yeSwgc25vb3BfbG9vZ2VyKTsKLQotICBzbm9vcF9sb29nZXItPkNhcHR1cmUoa0hmcEF0TnJlYzAsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6QUNMKTsKLQotICB0ZXN0X3JlZ2lzdHJ5LlN0b3BBbGwoKTsKLQotICAvLyBWZXJpZnkgc3RhdGVzIGFmdGVyIHRlc3QKLSAgQVNTRVJUX0ZBTFNFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3BfbG9nXykpOwotICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfbGFzdF8pKTsKLSAgQVNTRVJUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vel9sb2dfKSk7Ci0gIEFTU0VSVF9FUSgKLSAgICAgIHN0ZDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplKHRlbXBfc25vb3pfbG9nXyksCi0gICAgICBzaXplb2YoU25vb3BMb2dnZXI6OkZpbGVIZWFkZXJUeXBlKSArIHNpemVvZihTbm9vcExvZ2dlcjo6UGFja2V0SGVhZGVyVHlwZSkgKyAxNCk7Ci19Ci0KLVRFU1RfRihTbm9vcExvZ2dlck1vZHVsZVRlc3QsIHJvdGF0ZV9maWxlX2F0X25ld19zZXNzaW9uX3Rlc3QpIHsKLSAgLy8gU3RhcnQgb25jZQotICB7Ci0gICAgYXV0byogc25vb3BfbG9vZ2VyID0gbmV3IFRlc3RTbm9vcExvZ2dlck1vZHVsZSgKLSAgICAgICAgdGVtcF9zbm9vcF9sb2dfLnN0cmluZygpLCB0ZW1wX3Nub296X2xvZ18uc3RyaW5nKCksIDEwLCBTbm9vcExvZ2dlcjo6a0J0U25vb3BMb2dNb2RlRnVsbCk7Ci0gICAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gICAgdGVzdF9yZWdpc3RyeS5JbmplY3RUZXN0TW9kdWxlKCZTbm9vcExvZ2dlcjo6RmFjdG9yeSwgc25vb3BfbG9vZ2VyKTsKLSAgICBzbm9vcF9sb29nZXItPkNhcHR1cmUoa0luZm9ybWF0aW9uUmVxdWVzdCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpDTUQpOwotICAgIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotICB9Ci0KLSAgLy8gVmVyaWZ5IHN0YXRlcyBhZnRlciB0ZXN0Ci0gIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3BfbG9nXykpOwotICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfbGFzdF8pKTsKLSAgQVNTRVJUX0VRKAotICAgICAgc3RkOjpmaWxlc3lzdGVtOjpmaWxlX3NpemUodGVtcF9zbm9vcF9sb2dfKSwKLSAgICAgIHNpemVvZihTbm9vcExvZ2dlcjo6RmlsZUhlYWRlclR5cGUpICsgc2l6ZW9mKFNub29wTG9nZ2VyOjpQYWNrZXRIZWFkZXJUeXBlKSArIGtJbmZvcm1hdGlvblJlcXVlc3Quc2l6ZSgpKTsKLQotICAvLyBTdGFydCBhZ2FpbgotICB7Ci0gICAgYXV0byogc25vb3BfbG9vZ2VyID0gbmV3IFRlc3RTbm9vcExvZ2dlck1vZHVsZSgKLSAgICAgICAgdGVtcF9zbm9vcF9sb2dfLnN0cmluZygpLCB0ZW1wX3Nub296X2xvZ18uc3RyaW5nKCksIDEwLCBTbm9vcExvZ2dlcjo6a0J0U25vb3BMb2dNb2RlRnVsbCk7Ci0gICAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gICAgdGVzdF9yZWdpc3RyeS5JbmplY3RUZXN0TW9kdWxlKCZTbm9vcExvZ2dlcjo6RmFjdG9yeSwgc25vb3BfbG9vZ2VyKTsKLSAgICBzbm9vcF9sb29nZXItPkNhcHR1cmUoa0luZm9ybWF0aW9uUmVxdWVzdCwgU25vb3BMb2dnZXI6OkRpcmVjdGlvbjo6T1VUR09JTkcsIFNub29wTG9nZ2VyOjpQYWNrZXRUeXBlOjpDTUQpOwotICAgIHNub29wX2xvb2dlci0+Q2FwdHVyZShrSW5mb3JtYXRpb25SZXF1ZXN0LCBTbm9vcExvZ2dlcjo6RGlyZWN0aW9uOjpPVVRHT0lORywgU25vb3BMb2dnZXI6OlBhY2tldFR5cGU6OkNNRCk7Ci0gICAgdGVzdF9yZWdpc3RyeS5TdG9wQWxsKCk7Ci0gIH0KLQotICAvLyBWZXJpZnkgc3RhdGVzIGFmdGVyIHRlc3QKLSAgQVNTRVJUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfKSk7Ci0gIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfc25vb3BfbG9nX2xhc3RfKSk7Ci0gIEFTU0VSVF9FUSgKLSAgICAgIHN0ZDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplKHRlbXBfc25vb3BfbG9nXyksCi0gICAgICBzaXplb2YoU25vb3BMb2dnZXI6OkZpbGVIZWFkZXJUeXBlKSArIChzaXplb2YoU25vb3BMb2dnZXI6OlBhY2tldEhlYWRlclR5cGUpICsga0luZm9ybWF0aW9uUmVxdWVzdC5zaXplKCkpICogMik7Ci0gIEFTU0VSVF9FUSgKLSAgICAgIHN0ZDo6ZmlsZXN5c3RlbTo6ZmlsZV9zaXplKHRlbXBfc25vb3BfbG9nX2xhc3RfKSwKLSAgICAgIHNpemVvZihTbm9vcExvZ2dlcjo6RmlsZUhlYWRlclR5cGUpICsgc2l6ZW9mKFNub29wTG9nZ2VyOjpQYWNrZXRIZWFkZXJUeXBlKSArIGtJbmZvcm1hdGlvblJlcXVlc3Quc2l6ZSgpKTsKLX0KLQotVEVTVF9GKFNub29wTG9nZ2VyTW9kdWxlVGVzdCwgcm90YXRlX2ZpbGVfYWZ0ZXJfZnVsbF90ZXN0KSB7Ci0gIC8vIEFjdHVhbCB0ZXN0Ci0gIGF1dG8qIHNub29wX2xvb2dlciA9IG5ldyBUZXN0U25vb3BMb2dnZXJNb2R1bGUoCi0gICAgICB0ZW1wX3Nub29wX2xvZ18uc3RyaW5nKCksIHRlbXBfc25vb3pfbG9nXy5zdHJpbmcoKSwgMTAsIFNub29wTG9nZ2VyOjprQnRTbm9vcExvZ01vZGVGdWxsKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU25vb3BMb2dnZXI6OkZhY3RvcnksIHNub29wX2xvb2dlcik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0gICAgc25vb3BfbG9vZ2VyLT5DYXB0dXJlKGtJbmZvcm1hdGlvblJlcXVlc3QsIFNub29wTG9nZ2VyOjpEaXJlY3Rpb246Ok9VVEdPSU5HLCBTbm9vcExvZ2dlcjo6UGFja2V0VHlwZTo6Q01EKTsKLSAgfQotCi0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX3Nub29wX2xvZ18pKTsKLSAgQVNTRVJUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9zbm9vcF9sb2dfbGFzdF8pKTsKLSAgQVNTRVJUX0VRKAotICAgICAgc3RkOjpmaWxlc3lzdGVtOjpmaWxlX3NpemUodGVtcF9zbm9vcF9sb2dfKSwKLSAgICAgIHNpemVvZihTbm9vcExvZ2dlcjo6RmlsZUhlYWRlclR5cGUpICsgKHNpemVvZihTbm9vcExvZ2dlcjo6UGFja2V0SGVhZGVyVHlwZSkgKyBrSW5mb3JtYXRpb25SZXF1ZXN0LnNpemUoKSkgKiAxKTsKLSAgQVNTRVJUX0VRKAotICAgICAgc3RkOjpmaWxlc3lzdGVtOjpmaWxlX3NpemUodGVtcF9zbm9vcF9sb2dfbGFzdF8pLAotICAgICAgc2l6ZW9mKFNub29wTG9nZ2VyOjpGaWxlSGVhZGVyVHlwZSkgKyAoc2l6ZW9mKFNub29wTG9nZ2VyOjpQYWNrZXRIZWFkZXJUeXBlKSArIGtJbmZvcm1hdGlvblJlcXVlc3Quc2l6ZSgpKSAqIDEwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL2hjaS9BbmRyb2lkLmJwIGIvZ2QvaGNpL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNWE1ODkuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhIY2lTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhY2xfbWFuYWdlci9hY2xfY29ubmVjdGlvbi5jYyIsCi0gICAgICAgICJhY2xfbWFuYWdlci9jbGFzc2ljX2FjbF9jb25uZWN0aW9uLmNjIiwKLSAgICAgICAgImFjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmNjIiwKLSAgICAgICAgImFjbF9tYW5hZ2VyL3JvdW5kX3JvYmluX3NjaGVkdWxlci5jYyIsCi0gICAgICAgICJhY2xfbWFuYWdlci9hY2xfZnJhZ21lbnRlci5jYyIsCi0gICAgICAgICJhY2xfbWFuYWdlci5jYyIsCi0gICAgICAgICJhZGRyZXNzLmNjIiwKLSAgICAgICAgImNsYXNzX29mX2RldmljZS5jYyIsCi0gICAgICAgICJjb250cm9sbGVyLmNjIiwKLSAgICAgICAgImhjaV9sYXllci5jYyIsCi0gICAgICAgICJoY2lfbWV0cmljc19sb2dnaW5nLmNjIiwKLSAgICAgICAgImxlX2FkZHJlc3NfbWFuYWdlci5jYyIsCi0gICAgICAgICJsZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjIiwKLSAgICAgICAgImxlX3NjYW5uaW5nX21hbmFnZXIuY2MiLAotICAgICAgICAibGlua19rZXkuY2MiLAotICAgICAgICAidXVpZC5jYyIsCi0gICAgICAgICJ2ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoSGNpVW5pdFRlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhY2xfYnVpbGRlcl90ZXN0LmNjIiwKLSAgICAgICAgImFkZHJlc3NfdW5pdHRlc3QuY2MiLAotICAgICAgICAiYWRkcmVzc193aXRoX3R5cGVfdGVzdC5jYyIsCi0gICAgICAgICJjbGFzc19vZl9kZXZpY2VfdW5pdHRlc3QuY2MiLAotICAgICAgICAiaGNpX3BhY2tldHNfdGVzdC5jYyIsCi0gICAgICAgICJ1dWlkX3VuaXR0ZXN0LmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhIY2lUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyX3Rlc3QuY2MiLAotICAgICAgICAiYWNsX21hbmFnZXJfdGVzdC5jYyIsCi0gICAgICAgICJjb250cm9sbGVyX3Rlc3QuY2MiLAotICAgICAgICAiaGNpX2xheWVyX3Rlc3QuY2MiLAotICAgICAgICAibGVfYWRkcmVzc19tYW5hZ2VyX3Rlc3QuY2MiLAotICAgICAgICAibGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0LmNjIiwKLSAgICAgICAgImxlX3NjYW5uaW5nX21hbmFnZXJfdGVzdC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlX2hjaV9sYXllciIsCi0gICAgc3JjczogWwotICAgICAgICAiZmFjYWRlL2ZhY2FkZS5jYyIsCi0gICAgICAgICJmYWNhZGUvYWNsX21hbmFnZXJfZmFjYWRlLmNjIiwKLSAgICAgICAgImZhY2FkZS9jb250cm9sbGVyX2ZhY2FkZS5jYyIsCi0gICAgICAgICJmYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLmNjIiwKLSAgICAgICAgImZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5jYyIsCi0gICAgICAgICJmYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLmNjIiwKLSAgICAgICAgImZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoSGNpRnV6elRlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2lfcGFja2V0c19mdXp6X3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEhjaUZ1enpIZWxwZXJTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6L3N0YXR1c192c19jb21wbGV0ZV9jb21tYW5kcy5jYyIsCi0gICAgICAgICJmdXp6L2hjaV9sYXllcl9mdXp6X2NsaWVudC5jYyIsCi0gICAgICAgICJmdXp6L2Z1enpfaGNpX2xheWVyLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL0JVSUxELmduIGIvZ2QvaGNpL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI0YmJmLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1zb3VyY2Vfc2V0KCJCbHVldG9vdGhIY2lTb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJhY2xfbWFuYWdlci5jYyIsCi0gICAgImFjbF9tYW5hZ2VyL2FjbF9jb25uZWN0aW9uLmNjIiwKLSAgICAiYWNsX21hbmFnZXIvYWNsX2ZyYWdtZW50ZXIuY2MiLAotICAgICJhY2xfbWFuYWdlci9jbGFzc2ljX2FjbF9jb25uZWN0aW9uLmNjIiwKLSAgICAiYWNsX21hbmFnZXIvbGVfYWNsX2Nvbm5lY3Rpb24uY2MiLAotICAgICJhY2xfbWFuYWdlci9yb3VuZF9yb2Jpbl9zY2hlZHVsZXIuY2MiLAotICAgICJhZGRyZXNzLmNjIiwKLSAgICAiY2xhc3Nfb2ZfZGV2aWNlLmNjIiwKLSAgICAiY29udHJvbGxlci5jYyIsCi0gICAgImhjaV9sYXllci5jYyIsCi0gICAgImhjaV9tZXRyaWNzX2xvZ2dpbmcuY2MiLAotICAgICJsZV9hZGRyZXNzX21hbmFnZXIuY2MiLAotICAgICJsZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjIiwKLSAgICAibGVfc2Nhbm5pbmdfbWFuYWdlci5jYyIsCi0gICAgImxpbmtfa2V5LmNjIiwKLSAgICAidXVpZC5jYyIsCi0gICAgInZlbmRvcl9zcGVjaWZpY19ldmVudF9tYW5hZ2VyLmNjIiwKLSAgXQotCi0gIGluY2x1ZGVfZGlycyA9IFsgIi8vYnQvZ2QiIF0KLQotICBkZXBzID0gWwotICAgICIvL2J0OmxpYmJ0LXBsYXRmb3JtLXByb3Rvcy1saXRlIiwKLSAgICAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0OnRhcmdldF9kZWZhdWx0cyIgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9idWlsZGVyX3Rlc3QuY2MgYi9nZC9oY2kvYWNsX2J1aWxkZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4NmMzMS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWNsX2J1aWxkZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIHsKLXZlY3Rvcjx1aW50OF90PiBpbmZvcm1hdGlvbl9yZXF1ZXN0ID0gewotICAgIDB4ZmUsIDB4MmUsIDB4MGEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MGEsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCi19OwotLy8gMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLi4uCi12ZWN0b3I8dWludDhfdD4gY291bnRpbmdfYnl0ZXM7Ci0vLyAweEZGLCAweEZFLCAweEZELCAweEZDLCAuLi4KLXZlY3Rvcjx1aW50OF90PiBjb3VudGluZ19kb3duX2J5dGVzOwotY29uc3Qgc2l6ZV90IGNvdW50X3NpemUgPSAweDg7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jbGFzcyBBY2xCdWlsZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQWNsQnVpbGRlclRlc3QoKSB7Ci0gICAgY291bnRpbmdfYnl0ZXMucmVzZXJ2ZShjb3VudF9zaXplKTsKLSAgICBjb3VudGluZ19kb3duX2J5dGVzLnJlc2VydmUoY291bnRfc2l6ZSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9zaXplOyBpKyspIHsKLSAgICAgIGNvdW50aW5nX2J5dGVzLnB1c2hfYmFjayhpKTsKLSAgICAgIGNvdW50aW5nX2Rvd25fYnl0ZXMucHVzaF9iYWNrKH5pKTsKLSAgICB9Ci0gIH0KLSAgfkFjbEJ1aWxkZXJUZXN0KCkgPSBkZWZhdWx0OwotfTsKLQotVEVTVChBY2xCdWlsZGVyVGVzdCwgYnVpbGRBY2xDb3VudCkgewotICB1aW50MTZfdCBoYW5kbGUgPSAweDAzMTQ7Ci0gIFBhY2tldEJvdW5kYXJ5RmxhZyBwYWNrZXRfYm91bmRhcnlfZmxhZyA9IFBhY2tldEJvdW5kYXJ5RmxhZzo6RklSU1RfQVVUT01BVElDQUxMWV9GTFVTSEFCTEU7Ci0gIEJyb2FkY2FzdEZsYWcgYnJvYWRjYXN0X2ZsYWcgPSBCcm9hZGNhc3RGbGFnOjpBQ1RJVkVfUEVSSVBIRVJBTF9CUk9BRENBU1Q7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+IGNvdW50X3BheWxvYWQgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KCk7Ci0gIGNvdW50X3BheWxvYWQtPkFkZE9jdGV0cyhjb3VudGluZ19ieXRlcyk7Ci0gIEFTU0VSVF9FUShjb3VudGluZ19ieXRlcy5zaXplKCksIGNvdW50X3BheWxvYWQtPnNpemUoKSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPEFjbEJ1aWxkZXI+IGNvdW50X3BhY2tldCA9Ci0gICAgICBBY2xCdWlsZGVyOjpDcmVhdGUoaGFuZGxlLCBwYWNrZXRfYm91bmRhcnlfZmxhZywgYnJvYWRjYXN0X2ZsYWcsIHN0ZDo6bW92ZShjb3VudF9wYXlsb2FkKSk7Ci0KLSAgQVNTRVJUX0VRKGNvdW50aW5nX2J5dGVzLnNpemUoKSArIDQsIGNvdW50X3BhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IGNvdW50X3BhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpjb3VudF9wYWNrZXRfYnl0ZXMpOwotICBjb3VudF9wYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgUGFja2V0Vmlldzx0cnVlPiBjb3VudF9wYWNrZXRfYnl0ZXNfdmlldyhjb3VudF9wYWNrZXRfYnl0ZXMpOwotICBBY2xWaWV3IGNvdW50X3BhY2tldF92aWV3ID0gQWNsVmlldzo6Q3JlYXRlKGNvdW50X3BhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUoY291bnRfcGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLQotICBBU1NFUlRfRVEoaGFuZGxlLCBjb3VudF9wYWNrZXRfdmlldy5HZXRIYW5kbGUoKSk7Ci0gIEFTU0VSVF9FUShwYWNrZXRfYm91bmRhcnlfZmxhZywgY291bnRfcGFja2V0X3ZpZXcuR2V0UGFja2V0Qm91bmRhcnlGbGFnKCkpOwotICBBU1NFUlRfRVEoYnJvYWRjYXN0X2ZsYWcsIGNvdW50X3BhY2tldF92aWV3LkdldEJyb2FkY2FzdEZsYWcoKSk7Ci0gIFBhY2tldFZpZXc8dHJ1ZT4gY291bnRfdmlldyA9IGNvdW50X3BhY2tldF92aWV3LkdldFBheWxvYWQoKTsKLQotICBBU1NFUlRfRVEoY291bnRfdmlldy5zaXplKCksIGNvdW50aW5nX2J5dGVzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnRfdmlldy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShjb3VudF92aWV3W2ldLCBjb3VudGluZ19ieXRlc1tpXSk7Ci0gIH0KLX0KLQotVEVTVChBY2xCdWlsZGVyVGVzdCwgYnVpbGRBY2xDb3VudEludmVydGVkKSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDB4MDMwNDsKLSAgUGFja2V0Qm91bmRhcnlGbGFnIHBhY2tldF9ib3VuZGFyeV9mbGFnID0gUGFja2V0Qm91bmRhcnlGbGFnOjpDT05USU5VSU5HX0ZSQUdNRU5UOwotICBCcm9hZGNhc3RGbGFnIGJyb2FkY2FzdF9mbGFnID0gQnJvYWRjYXN0RmxhZzo6UE9JTlRfVE9fUE9JTlQ7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+IGNvdW50aW5nX2Rvd25fYnl0ZXNfcGF5bG9hZCA9IHN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4oKTsKLSAgY291bnRpbmdfZG93bl9ieXRlc19wYXlsb2FkLT5BZGRPY3RldHMoY291bnRpbmdfZG93bl9ieXRlcyk7Ci0gIEFTU0VSVF9FUShjb3VudGluZ19kb3duX2J5dGVzLnNpemUoKSwgY291bnRpbmdfZG93bl9ieXRlc19wYXlsb2FkLT5zaXplKCkpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxBY2xCdWlsZGVyPiBjb3VudGluZ19kb3duX2J5dGVzX3BhY2tldCA9Ci0gICAgICBBY2xCdWlsZGVyOjpDcmVhdGUoaGFuZGxlLCBwYWNrZXRfYm91bmRhcnlfZmxhZywgYnJvYWRjYXN0X2ZsYWcsIHN0ZDo6bW92ZShjb3VudGluZ19kb3duX2J5dGVzX3BheWxvYWQpKTsKLQotICBBU1NFUlRfRVEoY291bnRpbmdfZG93bl9ieXRlcy5zaXplKCkgKyA0LCBjb3VudGluZ19kb3duX2J5dGVzX3BhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IGNvdW50aW5nX2Rvd25fYnl0ZXNfcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKmNvdW50aW5nX2Rvd25fYnl0ZXNfcGFja2V0X2J5dGVzKTsKLSAgY291bnRpbmdfZG93bl9ieXRlc19wYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0gIFBhY2tldFZpZXc8dHJ1ZT4gY291bnRpbmdfZG93bl9ieXRlc19wYWNrZXRfYnl0ZXNfdmlldyhjb3VudGluZ19kb3duX2J5dGVzX3BhY2tldF9ieXRlcyk7Ci0gIEFjbFZpZXcgY291bnRpbmdfZG93bl9ieXRlc19wYWNrZXRfdmlldyA9IEFjbFZpZXc6OkNyZWF0ZShjb3VudGluZ19kb3duX2J5dGVzX3BhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUoY291bnRpbmdfZG93bl9ieXRlc19wYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFTU0VSVF9FUShoYW5kbGUsIGNvdW50aW5nX2Rvd25fYnl0ZXNfcGFja2V0X3ZpZXcuR2V0SGFuZGxlKCkpOwotICBBU1NFUlRfRVEocGFja2V0X2JvdW5kYXJ5X2ZsYWcsIGNvdW50aW5nX2Rvd25fYnl0ZXNfcGFja2V0X3ZpZXcuR2V0UGFja2V0Qm91bmRhcnlGbGFnKCkpOwotICBBU1NFUlRfRVEoYnJvYWRjYXN0X2ZsYWcsIGNvdW50aW5nX2Rvd25fYnl0ZXNfcGFja2V0X3ZpZXcuR2V0QnJvYWRjYXN0RmxhZygpKTsKLSAgUGFja2V0Vmlldzx0cnVlPiBjb3VudGluZ19kb3duX2J5dGVzX3ZpZXcgPSBjb3VudGluZ19kb3duX2J5dGVzX3BhY2tldF92aWV3LkdldFBheWxvYWQoKTsKLQotICBBU1NFUlRfRVEoY291bnRpbmdfZG93bl9ieXRlc192aWV3LnNpemUoKSwgY291bnRpbmdfZG93bl9ieXRlcy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50aW5nX2Rvd25fYnl0ZXNfdmlldy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShjb3VudGluZ19kb3duX2J5dGVzX3ZpZXdbaV0sIGNvdW50aW5nX2Rvd25fYnl0ZXNbaV0pOwotICB9Ci19Ci0KLVRFU1QoQWNsQnVpbGRlclRlc3QsIGJ1aWxkSW5mb3JtYXRpb25SZXF1ZXN0KSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDB4MGVmZTsKLSAgUGFja2V0Qm91bmRhcnlGbGFnIHBhY2tldF9ib3VuZGFyeV9mbGFnID0gUGFja2V0Qm91bmRhcnlGbGFnOjpGSVJTVF9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRTsKLSAgQnJvYWRjYXN0RmxhZyBicm9hZGNhc3RfZmxhZyA9IEJyb2FkY2FzdEZsYWc6OlBPSU5UX1RPX1BPSU5UOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWRfYnl0ZXMoaW5mb3JtYXRpb25fcmVxdWVzdC5iZWdpbigpICsgNCwgaW5mb3JtYXRpb25fcmVxdWVzdC5lbmQoKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxSYXdCdWlsZGVyPiBwYXlsb2FkID0gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPigpOwotICBwYXlsb2FkLT5BZGRPY3RldHMocGF5bG9hZF9ieXRlcyk7Ci0gIEFTU0VSVF9FUShwYXlsb2FkX2J5dGVzLnNpemUoKSwgcGF5bG9hZC0+c2l6ZSgpKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8QWNsQnVpbGRlcj4gcGFja2V0ID0KLSAgICAgIEFjbEJ1aWxkZXI6OkNyZWF0ZShoYW5kbGUsIHBhY2tldF9ib3VuZGFyeV9mbGFnLCBicm9hZGNhc3RfZmxhZywgc3RkOjptb3ZlKHBheWxvYWQpKTsKLQotICBBU1NFUlRfRVEoaW5mb3JtYXRpb25fcmVxdWVzdC5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0gIFBhY2tldFZpZXc8dHJ1ZT4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgQWNsVmlldyBwYWNrZXRfdmlldyA9IEFjbFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+c2l6ZSgpLCBpbmZvcm1hdGlvbl9yZXF1ZXN0LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFja2V0X2J5dGVzLT5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSgoKnBhY2tldF9ieXRlcylbaV0sIGluZm9ybWF0aW9uX3JlcXVlc3RbaV0pOwotICB9Ci0KLSAgQVNTRVJUX0VRKGhhbmRsZSwgcGFja2V0X3ZpZXcuR2V0SGFuZGxlKCkpOwotICBBU1NFUlRfRVEocGFja2V0X2JvdW5kYXJ5X2ZsYWcsIHBhY2tldF92aWV3LkdldFBhY2tldEJvdW5kYXJ5RmxhZygpKTsKLSAgQVNTRVJUX0VRKGJyb2FkY2FzdF9mbGFnLCBwYWNrZXRfdmlldy5HZXRCcm9hZGNhc3RGbGFnKCkpOwotICBQYWNrZXRWaWV3PHRydWU+IHBheWxvYWRfdmlldyA9IHBhY2tldF92aWV3LkdldFBheWxvYWQoKTsKLQotICBBU1NFUlRfRVEocGF5bG9hZF92aWV3LnNpemUoKSwgcGF5bG9hZF9ieXRlcy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBheWxvYWRfdmlldy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShwYXlsb2FkX3ZpZXdbaV0sIHBheWxvYWRfYnl0ZXNbaV0pOwotICB9Ci0KLSAgQVNTRVJUX0VRKHBhY2tldF92aWV3LnNpemUoKSwgaW5mb3JtYXRpb25fcmVxdWVzdC5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhY2tldF92aWV3LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHBhY2tldF92aWV3W2ldLCBpbmZvcm1hdGlvbl9yZXF1ZXN0W2ldKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlLmggYi9nZC9oY2kvYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTMyZWUuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvY29tbWFuZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy91dGlscy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jb25zdGV4cHIgRXZlbnRDb2RlIEFjbENvbm5lY3Rpb25FdmVudHNbXSA9IHsKLSAgICBFdmVudENvZGU6OkNPTk5FQ1RJT05fUEFDS0VUX1RZUEVfQ0hBTkdFRCwKLSAgICBFdmVudENvZGU6OlJPTEVfQ0hBTkdFLAotICAgIEV2ZW50Q29kZTo6Q09OTkVDVElPTl9DT01QTEVURSwKLSAgICBFdmVudENvZGU6OkNPTk5FQ1RJT05fUkVRVUVTVCwKLSAgICBFdmVudENvZGU6OkFVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFLAotICAgIEV2ZW50Q29kZTo6UkVBRF9DTE9DS19PRkZTRVRfQ09NUExFVEUsCi0gICAgRXZlbnRDb2RlOjpNT0RFX0NIQU5HRSwKLSAgICBFdmVudENvZGU6OlNOSUZGX1NVQlJBVElORywKLSAgICBFdmVudENvZGU6OlFPU19TRVRVUF9DT01QTEVURSwKLSAgICBFdmVudENvZGU6OkZMT1dfU1BFQ0lGSUNBVElPTl9DT01QTEVURSwKLSAgICBFdmVudENvZGU6OkZMVVNIX09DQ1VSUkVELAotICAgIEV2ZW50Q29kZTo6UkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTX0NPTVBMRVRFLAotICAgIEV2ZW50Q29kZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVNfQ09NUExFVEUsCi0gICAgRXZlbnRDb2RlOjpMSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ0hBTkdFRCwKLX07Ci0KLXR5cGVkZWYgQ29tbWFuZEludGVyZmFjZTxBY2xDb21tYW5kQnVpbGRlcj4gQWNsQ29ubmVjdGlvbkludGVyZmFjZTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyLmNjIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGIxNGRjLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfaW1wbC5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2ltcGwuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpX2FjbF9tYW5hZ2VyX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5oIgotI2luY2x1ZGUgInN0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY29uc3RleHByIHVpbnQxNl90IGtRdWFsY29tbURlYnVnSGFuZGxlID0gMHhlZGM7Ci0KLXVzaW5nIGFjbF9tYW5hZ2VyOjpBY2xDb25uZWN0aW9uOwotdXNpbmcgY29tbW9uOjpCaW5kOwotdXNpbmcgY29tbW9uOjpCaW5kT25jZTsKLQotdXNpbmcgYWNsX21hbmFnZXI6OmNsYXNzaWNfaW1wbDsKLXVzaW5nIGFjbF9tYW5hZ2VyOjpDbGFzc2ljQWNsQ29ubmVjdGlvbjsKLXVzaW5nIGFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uQ2FsbGJhY2tzOwotCi11c2luZyBhY2xfbWFuYWdlcjo6bGVfaW1wbDsKLXVzaW5nIGFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb247Ci11c2luZyBhY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzOwotCi11c2luZyBhY2xfbWFuYWdlcjo6Um91bmRSb2JpblNjaGVkdWxlcjsKLQotc3RydWN0IEFjbE1hbmFnZXI6OmltcGwgewotICBpbXBsKGNvbnN0IEFjbE1hbmFnZXImIGFjbF9tYW5hZ2VyKSA6IGFjbF9tYW5hZ2VyXyhhY2xfbWFuYWdlcikge30KLQotICB2b2lkIFN0YXJ0KCkgewotICAgIGhjaV9sYXllcl8gPSBhY2xfbWFuYWdlcl8uR2V0RGVwZW5kZW5jeTxIY2lMYXllcj4oKTsKLSAgICBoYW5kbGVyXyA9IGFjbF9tYW5hZ2VyXy5HZXRIYW5kbGVyKCk7Ci0gICAgY29udHJvbGxlcl8gPSBhY2xfbWFuYWdlcl8uR2V0RGVwZW5kZW5jeTxDb250cm9sbGVyPigpOwotICAgIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8gPSBuZXcgUm91bmRSb2JpblNjaGVkdWxlcihoYW5kbGVyXywgY29udHJvbGxlcl8sIGhjaV9sYXllcl8tPkdldEFjbFF1ZXVlRW5kKCkpOwotCi0gICAgaGNpX3F1ZXVlX2VuZF8gPSBoY2lfbGF5ZXJfLT5HZXRBY2xRdWV1ZUVuZCgpOwotICAgIGhjaV9xdWV1ZV9lbmRfLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgIGhhbmRsZXJfLCBjb21tb246OkJpbmQoJmltcGw6OmRlcXVldWVfYW5kX3JvdXRlX2FjbF9wYWNrZXRfdG9fY29ubmVjdGlvbiwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgYm9vbCBjcmFzaF9vbl91bmtub3duX2hhbmRsZSA9IGZhbHNlOwotICAgIGNsYXNzaWNfaW1wbF8gPQotICAgICAgICBuZXcgY2xhc3NpY19pbXBsKGhjaV9sYXllcl8sIGNvbnRyb2xsZXJfLCBoYW5kbGVyXywgcm91bmRfcm9iaW5fc2NoZWR1bGVyXywgY3Jhc2hfb25fdW5rbm93bl9oYW5kbGUpOwotICAgIGxlX2ltcGxfID0gbmV3IGxlX2ltcGwoaGNpX2xheWVyXywgY29udHJvbGxlcl8sIGhhbmRsZXJfLCByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLCBjcmFzaF9vbl91bmtub3duX2hhbmRsZSk7Ci0gIH0KLQotICB2b2lkIFN0b3AoKSB7Ci0gICAgZGVsZXRlIGxlX2ltcGxfOwotICAgIGRlbGV0ZSBjbGFzc2ljX2ltcGxfOwotICAgIGhjaV9xdWV1ZV9lbmRfLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIGRlbGV0ZSByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfOwotICAgIGlmIChlbnF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKGZhbHNlKSkgewotICAgICAgaGNpX3F1ZXVlX2VuZF8tPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgfQotICAgIGhjaV9xdWV1ZV9lbmRfID0gbnVsbHB0cjsKLSAgICBoYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIH0KLQotICAvLyBJbnZva2VkIGZyb20gc29tZSBleHRlcm5hbCBRdWV1ZSBSZWFjdGFibGUgY29udGV4dCAyCi0gIHZvaWQgZGVxdWV1ZV9hbmRfcm91dGVfYWNsX3BhY2tldF90b19jb25uZWN0aW9uKCkgewotICAgIGF1dG8gcGFja2V0ID0gaGNpX3F1ZXVlX2VuZF8tPlRyeURlcXVldWUoKTsKLSAgICBBU1NFUlQocGFja2V0ICE9IG51bGxwdHIpOwotICAgIGlmICghcGFja2V0LT5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19JTkZPKCJEcm9wcGluZyBpbnZhbGlkIHBhY2tldCBvZiBzaXplICV6dSIsIHBhY2tldC0+c2l6ZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDE2X3QgaGFuZGxlID0gcGFja2V0LT5HZXRIYW5kbGUoKTsKLSAgICBpZiAoaGFuZGxlID09IGtRdWFsY29tbURlYnVnSGFuZGxlKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gY29ubmVjdGlvbl9wYWlyID0gY2xhc3NpY19pbXBsXy0+YWNsX2Nvbm5lY3Rpb25zXy5maW5kKGhhbmRsZSk7Ci0gICAgaWYgKGNvbm5lY3Rpb25fcGFpciAhPSBjbGFzc2ljX2ltcGxfLT5hY2xfY29ubmVjdGlvbnNfLmVuZCgpKSB7Ci0gICAgICBjb25uZWN0aW9uX3BhaXItPnNlY29uZC5hc3NlbWJsZXJfLm9uX2luY29taW5nX3BhY2tldCgqcGFja2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBsZV9jb25uZWN0aW9uX3BhaXIgPSBsZV9pbXBsXy0+bGVfYWNsX2Nvbm5lY3Rpb25zXy5maW5kKGhhbmRsZSk7Ci0gICAgICBpZiAobGVfY29ubmVjdGlvbl9wYWlyID09IGxlX2ltcGxfLT5sZV9hY2xfY29ubmVjdGlvbnNfLmVuZCgpKSB7Ci0gICAgICAgIExPR19JTkZPKCJEcm9wcGluZyBwYWNrZXQgb2Ygc2l6ZSAlenUgdG8gdW5rbm93biBjb25uZWN0aW9uIDB4JTBoeCIsIHBhY2tldC0+c2l6ZSgpLCBoYW5kbGUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBsZV9jb25uZWN0aW9uX3BhaXItPnNlY29uZC5hc3NlbWJsZXJfLm9uX2luY29taW5nX3BhY2tldCgqcGFja2V0KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIER1bXAoCi0gICAgICBzdGQ6OnByb21pc2U8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBY2xNYW5hZ2VyRGF0YT4+IHByb21pc2UsIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlcikgY29uc3Q7Ci0KLSAgY29uc3QgQWNsTWFuYWdlciYgYWNsX21hbmFnZXJfOwotCi0gIGNsYXNzaWNfaW1wbCogY2xhc3NpY19pbXBsXyA9IG51bGxwdHI7Ci0gIGxlX2ltcGwqIGxlX2ltcGxfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfID0gbnVsbHB0cjsKLSAgQ29udHJvbGxlciogY29udHJvbGxlcl8gPSBudWxscHRyOwotICBIY2lMYXllciogaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIFJvdW5kUm9iaW5TY2hlZHVsZXIqIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8gPSBudWxscHRyOwotICBjb21tb246OkJpZGlRdWV1ZUVuZDxBY2xCdWlsZGVyLCBBY2xWaWV3PiogaGNpX3F1ZXVlX2VuZF8gPSBudWxscHRyOwotICBzdGQ6OmF0b21pY19ib29sIGVucXVldWVfcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLSAgdWludDE2X3QgZGVmYXVsdF9saW5rX3BvbGljeV9zZXR0aW5nc18gPSAweGZmZmY7Ci19OwotCi1BY2xNYW5hZ2VyOjpBY2xNYW5hZ2VyKCkgOiBwaW1wbF8oc3RkOjptYWtlX3VuaXF1ZTxpbXBsPigqdGhpcykpIHt9Ci0KLXZvaWQgQWNsTWFuYWdlcjo6UmVnaXN0ZXJDYWxsYmFja3MoQ29ubmVjdGlvbkNhbGxiYWNrcyogY2FsbGJhY2tzLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBBU1NFUlQoY2FsbGJhY2tzICE9IG51bGxwdHIgJiYgaGFuZGxlciAhPSBudWxscHRyKTsKLSAgR2V0SGFuZGxlcigpLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmNsYXNzaWNfaW1wbDo6aGFuZGxlX3JlZ2lzdGVyX2NhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHBpbXBsXy0+Y2xhc3NpY19pbXBsXyksIGNvbW1vbjo6VW5yZXRhaW5lZChjYWxsYmFja3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQoaGFuZGxlcikpKTsKLX0KLQotdm9pZCBBY2xNYW5hZ2VyOjpVbnJlZ2lzdGVyQ2FsbGJhY2tzKENvbm5lY3Rpb25DYWxsYmFja3MqIGNhbGxiYWNrcywgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgQVNTRVJUKGNhbGxiYWNrcyAhPSBudWxscHRyKTsKLSAgQ2FsbE9uKAotICAgICAgcGltcGxfLT5jbGFzc2ljX2ltcGxfLAotICAgICAgJmNsYXNzaWNfaW1wbDo6aGFuZGxlX3VucmVnaXN0ZXJfY2FsbGJhY2tzLAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGNhbGxiYWNrcyksCi0gICAgICBzdGQ6Om1vdmUocHJvbWlzZSkpOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OlJlZ2lzdGVyTGVDYWxsYmFja3MoTGVDb25uZWN0aW9uQ2FsbGJhY2tzKiBjYWxsYmFja3MsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIEFTU0VSVChjYWxsYmFja3MgIT0gbnVsbHB0ciAmJiBoYW5kbGVyICE9IG51bGxwdHIpOwotICBDYWxsT24oCi0gICAgICBwaW1wbF8tPmxlX2ltcGxfLAotICAgICAgJmxlX2ltcGw6OmhhbmRsZV9yZWdpc3Rlcl9sZV9jYWxsYmFja3MsCi0gICAgICBjb21tb246OlVucmV0YWluZWQoY2FsbGJhY2tzKSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChoYW5kbGVyKSk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6VW5yZWdpc3RlckxlQ2FsbGJhY2tzKExlQ29ubmVjdGlvbkNhbGxiYWNrcyogY2FsbGJhY2tzLCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICBBU1NFUlQoY2FsbGJhY2tzICE9IG51bGxwdHIpOwotICBDYWxsT24ocGltcGxfLT5sZV9pbXBsXywgJmxlX2ltcGw6OmhhbmRsZV91bnJlZ2lzdGVyX2xlX2NhbGxiYWNrcywgY29tbW9uOjpVbnJldGFpbmVkKGNhbGxiYWNrcyksIHN0ZDo6bW92ZShwcm9taXNlKSk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6Q3JlYXRlQ29ubmVjdGlvbihBZGRyZXNzIGFkZHJlc3MpIHsKLSAgQ2FsbE9uKHBpbXBsXy0+Y2xhc3NpY19pbXBsXywgJmNsYXNzaWNfaW1wbDo6Y3JlYXRlX2Nvbm5lY3Rpb24sIGFkZHJlc3MpOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OkNyZWF0ZUxlQ29ubmVjdGlvbihBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgaXNfZGlyZWN0KSB7Ci0gIGlmICghaXNfZGlyZWN0KSB7Ci0gICAgQ2FsbE9uKHBpbXBsXy0+bGVfaW1wbF8sICZsZV9pbXBsOjphZGRfZGV2aWNlX3RvX2JhY2tncm91bmRfY29ubmVjdGlvbl9saXN0LCBhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIH0KLSAgQ2FsbE9uKHBpbXBsXy0+bGVfaW1wbF8sICZsZV9pbXBsOjpjcmVhdGVfbGVfY29ubmVjdGlvbiwgYWRkcmVzc193aXRoX3R5cGUsIHRydWUsIGlzX2RpcmVjdCk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6U2V0TGVTdWdnZXN0ZWREZWZhdWx0RGF0YVBhcmFtZXRlcnModWludDE2X3Qgb2N0ZXRzLCB1aW50MTZfdCB0aW1lKSB7Ci0gIENhbGxPbihwaW1wbF8tPmxlX2ltcGxfLCAmbGVfaW1wbDo6c2V0X2xlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfcGFyYW1ldGVycywgb2N0ZXRzLCB0aW1lKTsKLX0KLQotdm9pZCBBY2xNYW5hZ2VyOjpTZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgIEFkZHJlc3NXaXRoVHlwZSBmaXhlZF9hZGRyZXNzLAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWF4aW11bV9yb3RhdGlvbl90aW1lKSB7Ci0gIGNyeXB0b190b29sYm94OjpPY3RldDE2IHJvdGF0aW9uX2lya3t9OwotICBhdXRvIGlyayA9IEdldERlcGVuZGVuY3k8c3RvcmFnZTo6U3RvcmFnZU1vZHVsZT4oKS0+R2V0QWRhcHRlckNvbmZpZygpLkdldExlSWRlbnRpdHlSZXNvbHZpbmdLZXkoKTsKLSAgaWYgKGlyay5oYXNfdmFsdWUoKSkgewotICAgIHJvdGF0aW9uX2lyayA9IGlyay0+Ynl0ZXM7Ci0gIH0KLSAgQ2FsbE9uKAotICAgICAgcGltcGxfLT5sZV9pbXBsXywKLSAgICAgICZsZV9pbXBsOjpzZXRfcHJpdmFjeV9wb2xpY3lfZm9yX2luaXRpYXRvcl9hZGRyZXNzLAotICAgICAgYWRkcmVzc19wb2xpY3ksCi0gICAgICBmaXhlZF9hZGRyZXNzLAotICAgICAgcm90YXRpb25faXJrLAotICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lKTsKLX0KLQotLy8gVE9ETyhqcGF3bG93c2tpKTogcmVtb3ZlIG9uY2Ugd2UgaGF2ZSBjb25maWcgZmlsZSBhYnN0cmFjdGlvbiBpbiBjZXJ0IHRlc3RzCi12b2lkIEFjbE1hbmFnZXI6OlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzRm9yVGVzdCgKLSAgICBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgIEFkZHJlc3NXaXRoVHlwZSBmaXhlZF9hZGRyZXNzLAotICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IHJvdGF0aW9uX2lyaywKLSAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1heGltdW1fcm90YXRpb25fdGltZSkgewotICBDYWxsT24oCi0gICAgICBwaW1wbF8tPmxlX2ltcGxfLAotICAgICAgJmxlX2ltcGw6OnNldF9wcml2YWN5X3BvbGljeV9mb3JfaW5pdGlhdG9yX2FkZHJlc3NfZm9yX3Rlc3QsCi0gICAgICBhZGRyZXNzX3BvbGljeSwKLSAgICAgIGZpeGVkX2FkZHJlc3MsCi0gICAgICByb3RhdGlvbl9pcmssCi0gICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsCi0gICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OkNhbmNlbENvbm5lY3QoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gIENhbGxPbihwaW1wbF8tPmNsYXNzaWNfaW1wbF8sICZjbGFzc2ljX2ltcGw6OmNhbmNlbF9jb25uZWN0LCBhZGRyZXNzKTsKLX0KLQotdm9pZCBBY2xNYW5hZ2VyOjpDYW5jZWxMZUNvbm5lY3QoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIENhbGxPbihwaW1wbF8tPmxlX2ltcGxfLCAmbGVfaW1wbDo6cmVtb3ZlX2RldmljZV9mcm9tX2JhY2tncm91bmRfY29ubmVjdGlvbl9saXN0LCBhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIENhbGxPbihwaW1wbF8tPmxlX2ltcGxfLCAmbGVfaW1wbDo6Y2FuY2VsX2Nvbm5lY3QsIGFkZHJlc3Nfd2l0aF90eXBlKTsKLX0KLQotdm9pZCBBY2xNYW5hZ2VyOjpBZGREZXZpY2VUb0Nvbm5lY3RMaXN0KEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgewotICBDYWxsT24ocGltcGxfLT5sZV9pbXBsXywgJmxlX2ltcGw6OmFkZF9kZXZpY2VfdG9fY29ubmVjdF9saXN0LCBhZGRyZXNzX3dpdGhfdHlwZSk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6UmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0KEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgewotICBDYWxsT24ocGltcGxfLT5sZV9pbXBsXywgJmxlX2ltcGw6OnJlbW92ZV9kZXZpY2VfZnJvbV9jb25uZWN0X2xpc3QsIGFkZHJlc3Nfd2l0aF90eXBlKTsKLX0KLQotdm9pZCBBY2xNYW5hZ2VyOjpBZGREZXZpY2VUb1Jlc29sdmluZ0xpc3QoCi0gICAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiBwZWVyX2lyaywKLSAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgbG9jYWxfaXJrKSB7Ci0gIENhbGxPbihwaW1wbF8tPmxlX2ltcGxfLCAmbGVfaW1wbDo6YWRkX2RldmljZV90b19yZXNvbHZpbmdfbGlzdCwgYWRkcmVzc193aXRoX3R5cGUsIHBlZXJfaXJrLCBsb2NhbF9pcmspOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OlJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgewotICBDYWxsT24ocGltcGxfLT5sZV9pbXBsXywgJmxlX2ltcGw6OnJlbW92ZV9kZXZpY2VfZnJvbV9yZXNvbHZpbmdfbGlzdCwgYWRkcmVzc193aXRoX3R5cGUpOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OkNsZWFyUmVzb2x2aW5nTGlzdCgpIHsKLSAgQ2FsbE9uKHBpbXBsXy0+bGVfaW1wbF8sICZsZV9pbXBsOjpjbGVhcl9yZXNvbHZpbmdfbGlzdCk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6Q2VudHJhbExpbmtLZXkoS2V5RmxhZyBrZXlfZmxhZykgewotICBDYWxsT24ocGltcGxfLT5jbGFzc2ljX2ltcGxfLCAmY2xhc3NpY19pbXBsOjpjZW50cmFsX2xpbmtfa2V5LCBrZXlfZmxhZyk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6U3dpdGNoUm9sZShBZGRyZXNzIGFkZHJlc3MsIFJvbGUgcm9sZSkgewotICBDYWxsT24ocGltcGxfLT5jbGFzc2ljX2ltcGxfLCAmY2xhc3NpY19pbXBsOjpzd2l0Y2hfcm9sZSwgYWRkcmVzcywgcm9sZSk7Ci19Ci0KLXVpbnQxNl90IEFjbE1hbmFnZXI6OlJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKCkgewotICBBU1NFUlRfTE9HKHBpbXBsXy0+ZGVmYXVsdF9saW5rX3BvbGljeV9zZXR0aW5nc18gIT0gMHhmZmZmLCAiU2V0dGluZ3Mgd2VyZSBuZXZlciB3cml0dGVuIik7Ci0gIHJldHVybiBwaW1wbF8tPmRlZmF1bHRfbGlua19wb2xpY3lfc2V0dGluZ3NfOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OldyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncyh1aW50MTZfdCBkZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzKSB7Ci0gIHBpbXBsXy0+ZGVmYXVsdF9saW5rX3BvbGljeV9zZXR0aW5nc18gPSBkZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzOwotICBDYWxsT24ocGltcGxfLT5jbGFzc2ljX2ltcGxfLCAmY2xhc3NpY19pbXBsOjp3cml0ZV9kZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzLCBkZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzKTsKLX0KLQotdm9pZCBBY2xNYW5hZ2VyOjpPbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZChFcnJvckNvZGUgc3RhdHVzLCB1aW50MTZfdCBjb25uX2hhbmRsZSwgaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWR2X2FkZHJlc3MpIHsKLSAgaWYgKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICBDYWxsT24ocGltcGxfLT5sZV9pbXBsXywgJmxlX2ltcGw6OlVwZGF0ZUxvY2FsQWRkcmVzcywgY29ubl9oYW5kbGUsIGFkdl9hZGRyZXNzKTsKLSAgfQotfQotCi12b2lkIEFjbE1hbmFnZXI6OlNldFNlY3VyaXR5TW9kdWxlKHNlY3VyaXR5OjpTZWN1cml0eU1vZHVsZSogc2VjdXJpdHlfbW9kdWxlKSB7Ci0gIENhbGxPbihwaW1wbF8tPmNsYXNzaWNfaW1wbF8sICZjbGFzc2ljX2ltcGw6OnNldF9zZWN1cml0eV9tb2R1bGUsIHNlY3VyaXR5X21vZHVsZSk7Ci19Ci0KLUxlQWRkcmVzc01hbmFnZXIqIEFjbE1hbmFnZXI6OkdldExlQWRkcmVzc01hbmFnZXIoKSB7Ci0gIHJldHVybiBwaW1wbF8tPmxlX2ltcGxfLT5sZV9hZGRyZXNzX21hbmFnZXJfOwotfQotCi11aW50MTZfdCBBY2xNYW5hZ2VyOjpIQUNLX0dldEhhbmRsZShBZGRyZXNzIGFkZHJlc3MpIHsKLSAgcmV0dXJuIHBpbXBsXy0+Y2xhc3NpY19pbXBsXy0+SEFDS19nZXRfaGFuZGxlKGFkZHJlc3MpOwotfQotCi11aW50MTZfdCBBY2xNYW5hZ2VyOjpIQUNLX0dldExlSGFuZGxlKEFkZHJlc3MgYWRkcmVzcykgewotICByZXR1cm4gcGltcGxfLT5sZV9pbXBsXy0+SEFDS19nZXRfaGFuZGxlKGFkZHJlc3MpOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OkhBQ0tfU2V0Tm9uQWNsRGlzY29ubmVjdENhbGxiYWNrKHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCwgdWludDhfdCk+IGNhbGxiYWNrKSB7Ci0gIHBpbXBsXy0+Y2xhc3NpY19pbXBsXy0+SEFDS19TZXROb25BY2xEaXNjb25uZWN0Q2FsbGJhY2soY2FsbGJhY2spOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OkhBQ0tfU2V0QWNsVHhQcmlvcml0eSh1aW50OF90IGhhbmRsZSwgYm9vbCBoaWdoX3ByaW9yaXR5KSB7Ci0gIENhbGxPbihwaW1wbF8tPnJvdW5kX3JvYmluX3NjaGVkdWxlcl8sICZSb3VuZFJvYmluU2NoZWR1bGVyOjpTZXRMaW5rUHJpb3JpdHksIGhhbmRsZSwgaGlnaF9wcmlvcml0eSk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxIY2lMYXllcj4oKTsKLSAgbGlzdC0+YWRkPENvbnRyb2xsZXI+KCk7Ci0gIGxpc3QtPmFkZDxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpOwotfQotCi12b2lkIEFjbE1hbmFnZXI6OlN0YXJ0KCkgewotICBwaW1wbF8tPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgQWNsTWFuYWdlcjo6U3RvcCgpIHsKLSAgcGltcGxfLT5TdG9wKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEFjbE1hbmFnZXI6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIkFjbCBNYW5hZ2VyIjsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBBY2xNYW5hZ2VyOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBBY2xNYW5hZ2VyKCk7IH0pOwotCi1BY2xNYW5hZ2VyOjp+QWNsTWFuYWdlcigpID0gZGVmYXVsdDsKLQotdm9pZCBBY2xNYW5hZ2VyOjppbXBsOjpEdW1wKAotICAgIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEFjbE1hbmFnZXJEYXRhPj4gcHJvbWlzZSwgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSBjb25zdCB7Ci0gIGF1dG8gdGl0bGUgPSBmYl9idWlsZGVyLT5DcmVhdGVTdHJpbmcoIi0tLS0tIEFjbCBNYW5hZ2VyIER1bXBzeXMgLS0tLS0iKTsKLSAgQWNsTWFuYWdlckRhdGFCdWlsZGVyIGJ1aWxkZXIoKmZiX2J1aWxkZXIpOwotICBidWlsZGVyLmFkZF90aXRsZSh0aXRsZSk7Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWNsTWFuYWdlckRhdGE+IGR1bXBzeXNfZGF0YSA9IGJ1aWxkZXIuRmluaXNoKCk7Ci0gIHByb21pc2Uuc2V0X3ZhbHVlKGR1bXBzeXNfZGF0YSk7Ci19Ci0KLUR1bXBzeXNEYXRhRmluaXNoZXIgQWNsTWFuYWdlcjo6R2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSBjb25zdCB7Ci0gIEFTU0VSVChmYl9idWlsZGVyICE9IG51bGxwdHIpOwotCi0gIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEFjbE1hbmFnZXJEYXRhPj4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgcGltcGxfLT5EdW1wKHN0ZDo6bW92ZShwcm9taXNlKSwgZmJfYnVpbGRlcik7Ci0KLSAgYXV0byBkdW1wc3lzX2RhdGEgPSBmdXR1cmUuZ2V0KCk7Ci0KLSAgcmV0dXJuIFtkdW1wc3lzX2RhdGFdKER1bXBzeXNEYXRhQnVpbGRlciogZHVtcHN5c19idWlsZGVyKSB7Ci0gICAgZHVtcHN5c19idWlsZGVyLT5hZGRfaGNpX2FjbF9tYW5hZ2VyX2R1bXBzeXNfZGF0YShkdW1wc3lzX2RhdGEpOwotICB9OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIuaCBiL2dkL2hjaS9hY2xfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzkxNzIyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvY29ubmVjdGlvbl9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvbGVfY29ubmVjdGlvbl9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJoY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLWNsYXNzIFNlY3VyaXR5TW9kdWxlOwotfQotbmFtZXNwYWNlIHNoaW0gewotbmFtZXNwYWNlIGxlZ2FjeSB7Ci1jbGFzcyBBY2w7Ci19Ci0KLWNsYXNzIEJ0bTsKLXZvaWQgTDJDQV9Vc2VMZWdhY3lTZWN1cml0eU1vZHVsZSgpOwotYm9vbCBMMkNBX1NldEFjbFByaW9yaXR5KHVpbnQxNl90LCBib29sKTsKLX0KLQotbmFtZXNwYWNlIGhjaSB7Ci0KLWNsYXNzIEFjbE1hbmFnZXIgOiBwdWJsaWMgTW9kdWxlIHsKLSBmcmllbmQgY2xhc3MgYmx1ZXRvb3RoOjpzaGltOjpCdG07Ci0gZnJpZW5kIGNsYXNzIGJsdWV0b290aDo6c2hpbTo6bGVnYWN5OjpBY2w7Ci0gZnJpZW5kIHZvaWQgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1VzZUxlZ2FjeVNlY3VyaXR5TW9kdWxlKCk7Ci0gZnJpZW5kIGJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1NldEFjbFByaW9yaXR5KHVpbnQxNl90LCBib29sKTsKLQotcHVibGljOgotIEFjbE1hbmFnZXIoKTsKLSAvLyBOT1RFOiBJdCBpcyBuZWNlc3NhcnkgdG8gZm9yd2FyZCBkZWNsYXJlIGEgZGVmYXVsdCBkZXN0cnVjdG9yIHRoYXQgb3ZlcnJpZGVzIHRoZSBiYXNlIGNsYXNzIG9uZSwgYmVjYXVzZQotIC8vICJzdHJ1Y3QgaW1wbCIgaXMgZm9yd2FyZGVkIGRlY2xhcmVkIGluIC5jYyBhbmQgY29tcGlsZXIgbmVlZHMgYSBjb25jcmV0ZSBkZWZpbml0aW9uIG9mICJzdHJ1Y3QgaW1wbCIgd2hlbgotIC8vIGNvbXBpbGluZyBBY2xNYW5hZ2VyJ3MgZGVzdHJ1Y3Rvci4gSGVuY2Ugd2UgbmVlZCB0byBmb3J3YXJkIGRlY2xhcmUgdGhlIGRlc3RydWN0b3IgZm9yIEFjbE1hbmFnZXIgdG8gZGVsYXkKLSAvLyBjb21waWxpbmcgQWNsTWFuYWdlcidzIGRlc3RydWN0b3IgdW50aWwgaXQgc3RhcnRzIGxpbmtpbmcgdGhlIC5jYyBmaWxlLgotIH5BY2xNYW5hZ2VyKCk7Ci0KLSAvLyBTaG91bGQgcmVnaXN0ZXIgb25seSBvbmNlIHdoZW4gdXNlciBtb2R1bGUgc3RhcnRzLgotIC8vIEdlbmVyYXRlcyBPbkNvbm5lY3RTdWNjZXNzIHdoZW4gYW4gaW5jb21pbmcgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KLSB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJDYWxsYmFja3MoYWNsX21hbmFnZXI6OkNvbm5lY3Rpb25DYWxsYmFja3MqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyQ2FsbGJhY2tzKGFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uQ2FsbGJhY2tzKiBjYWxsYmFja3MsIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLQotIC8vIFNob3VsZCByZWdpc3RlciBvbmx5IG9uY2Ugd2hlbiB1c2VyIG1vZHVsZSBzdGFydHMuCi0gdmlydHVhbCB2b2lkIFJlZ2lzdGVyTGVDYWxsYmFja3MoYWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbkNhbGxiYWNrcyogY2FsbGJhY2tzLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0gdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJMZUNhbGxiYWNrcyhhY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzKiBjYWxsYmFja3MsIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLQotIC8vIEdlbmVyYXRlcyBPbkNvbm5lY3RTdWNjZXNzIGlmIGNvbm5lY3RlZCwgb3IgT25Db25uZWN0RmFpbCBvdGhlcndpc2UKLSB2aXJ0dWFsIHZvaWQgQ3JlYXRlQ29ubmVjdGlvbihBZGRyZXNzIGFkZHJlc3MpOwotCi0gLy8gR2VuZXJhdGVzIE9uTGVDb25uZWN0U3VjY2VzcyBpZiBjb25uZWN0ZWQsIG9yIE9uTGVDb25uZWN0RmFpbCBvdGhlcndpc2UKLSB2aXJ0dWFsIHZvaWQgQ3JlYXRlTGVDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSwgYm9vbCBpc19kaXJlY3QpOwotCi0gLy8gQXNrIHRoZSBjb250cm9sbGVyIGZvciBzcGVjaWZpYyBkYXRhIHBhcmFtZXRlcnMKLSB2aXJ0dWFsIHZvaWQgU2V0TGVTdWdnZXN0ZWREZWZhdWx0RGF0YVBhcmFtZXRlcnModWludDE2X3Qgb2N0ZXRzLCB1aW50MTZfdCB0aW1lKTsKLQotIHZpcnR1YWwgdm9pZCBTZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeSBhZGRyZXNzX3BvbGljeSwKLSAgICAgQWRkcmVzc1dpdGhUeXBlIGZpeGVkX2FkZHJlc3MsCi0gICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1heGltdW1fcm90YXRpb25fdGltZSk7Ci0KLSAvLyBUT0RPKGpwYXdsb3dza2kpOiByZW1vdmUgb25jZSB3ZSBoYXZlIGNvbmZpZyBmaWxlIGFic3RyYWN0aW9uIGluIGNlcnQgdGVzdHMKLSB2aXJ0dWFsIHZvaWQgU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3NGb3JUZXN0KAotICAgICBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgICBBZGRyZXNzV2l0aFR5cGUgZml4ZWRfYWRkcmVzcywKLSAgICAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcm90YXRpb25faXJrLAotICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotCi0gLy8gR2VuZXJhdGVzIE9uQ29ubmVjdEZhaWwgd2l0aCBlcnJvciBjb2RlICJ0ZXJtaW5hdGVkIGJ5IGxvY2FsIGhvc3QgMHgxNiIgaWYgY2FuY2VsbGVkLCBvciBPbkNvbm5lY3RTdWNjZXNzIGlmIG5vdAotIC8vIHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQgYW5kIGFscmVhZHkgY29ubmVjdGVkCi0gdmlydHVhbCB2b2lkIENhbmNlbENvbm5lY3QoQWRkcmVzcyBhZGRyZXNzKTsKLQotIHZpcnR1YWwgdm9pZCBDYW5jZWxMZUNvbm5lY3QoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKTsKLSB2aXJ0dWFsIHZvaWQgQWRkRGV2aWNlVG9Db25uZWN0TGlzdChBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpOwotIHZpcnR1YWwgdm9pZCBSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3QoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKTsKLSB2aXJ0dWFsIHZvaWQgQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KAotICAgICBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiBwZWVyX2lyaywKLSAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGxvY2FsX2lyayk7Ci0gdmlydHVhbCB2b2lkIFJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gdmlydHVhbCB2b2lkIENsZWFyUmVzb2x2aW5nTGlzdCgpOwotCi0gdmlydHVhbCB2b2lkIENlbnRyYWxMaW5rS2V5KEtleUZsYWcga2V5X2ZsYWcpOwotIHZpcnR1YWwgdm9pZCBTd2l0Y2hSb2xlKEFkZHJlc3MgYWRkcmVzcywgUm9sZSByb2xlKTsKLSB2aXJ0dWFsIHVpbnQxNl90IFJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKCk7Ci0gdmlydHVhbCB2b2lkIFdyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncyh1aW50MTZfdCBkZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzKTsKLQotIC8vIENhbGxiYWNrIGZyb20gQWR2ZXJ0aXNpbmcgTWFuYWdlciB0byBub3RpZnkgdGhlIGFkdml0aXNlciAobG9jYWwpIGFkZHJlc3MKLSB2aXJ0dWFsIHZvaWQgT25BZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWQoRXJyb3JDb2RlIHN0YXR1cywgdWludDE2X3QgY29ubl9oYW5kbGUsIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkdl9hZGRyZXNzKTsKLQotIC8vIEluIG9yZGVyIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgdXNlIHNldHRlciByYXRoZXIgdGhhbiBtb2R1bGUgZGVwZW5kZW5jeS4KLSB2aXJ0dWFsIHZvaWQgU2V0U2VjdXJpdHlNb2R1bGUoc2VjdXJpdHk6OlNlY3VyaXR5TW9kdWxlKiBzZWN1cml0eV9tb2R1bGUpOwotCi0gdmlydHVhbCBMZUFkZHJlc3NNYW5hZ2VyKiBHZXRMZUFkZHJlc3NNYW5hZ2VyKCk7Ci0KLSBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi1wcm90ZWN0ZWQ6Ci0gdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotCi0gdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotCi0gdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gRHVtcHN5c0RhdGFGaW5pc2hlciBHZXREdW1wc3lzRGF0YShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlOyAgLy8gTW9kdWxlCi0KLXByaXZhdGU6Ci0gdmlydHVhbCB1aW50MTZfdCBIQUNLX0dldEhhbmRsZShjb25zdCBBZGRyZXNzIGFkZHJlc3MpOwotIHZpcnR1YWwgdWludDE2X3QgSEFDS19HZXRMZUhhbmRsZShjb25zdCBBZGRyZXNzIGFkZHJlc3MpOwotCi0gLy8gSGFjayBmb3IgdGhlIHNoaW0gdG8gZ2V0IG5vbi1hY2wgZGlzY29ubmVjdCBjYWxsYmFjay4gU2hpbSBuZWVkcyB0byBwb3N0IHRvIHRoZWlyIGhhbmRsZXIhCi0gdmlydHVhbCB2b2lkIEhBQ0tfU2V0Tm9uQWNsRGlzY29ubmVjdENhbGxiYWNrKHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCAvKiBoYW5kbGUgKi8sIHVpbnQ4X3QgLyogcmVhc29uICovKT4pOwotCi0gdmlydHVhbCB2b2lkIEhBQ0tfU2V0QWNsVHhQcmlvcml0eSh1aW50OF90IGhhbmRsZSwgYm9vbCBoaWdoX3ByaW9yaXR5KTsKLQotIHN0cnVjdCBpbXBsOwotIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0KLSBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWNsTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIvYWNsX2Nvbm5lY3Rpb24uY2MgYi9nZC9oY2kvYWNsX21hbmFnZXIvYWNsX2Nvbm5lY3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzhiZjkuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2FjbF9jb25uZWN0aW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9hY2xfY29ubmVjdGlvbi5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGFjbF9tYW5hZ2VyIHsKLQotQWNsQ29ubmVjdGlvbjo6UXVldWVVcEVuZCogQWNsQ29ubmVjdGlvbjo6R2V0QWNsUXVldWVFbmQoKSBjb25zdCB7Ci0gIHJldHVybiBxdWV1ZV91cF9lbmRfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWNsX21hbmFnZXIKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9hY2xfbWFuYWdlci9hY2xfY29ubmVjdGlvbi5oIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2FjbF9jb25uZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTZiMTguLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2FjbF9jb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBBY2xDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIEFjbENvbm5lY3Rpb24oKSA6IHF1ZXVlX3VwX2VuZF8obnVsbHB0ciksIGhhbmRsZV8oMCl7fTsKLSAgdmlydHVhbCB+QWNsQ29ubmVjdGlvbigpID0gZGVmYXVsdDsKLQotICB1aW50MTZfdCBHZXRIYW5kbGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGhhbmRsZV87Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpID0gMDsKLQotICB1c2luZyBRdWV1ZSA9IGNvbW1vbjo6QmlkaVF1ZXVlPFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4sIEJhc2VQYWNrZXRCdWlsZGVyPjsKLSAgdXNpbmcgUXVldWVVcEVuZCA9IGNvbW1vbjo6QmlkaVF1ZXVlRW5kPEJhc2VQYWNrZXRCdWlsZGVyLCBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+PjsKLSAgdXNpbmcgUXVldWVEb3duRW5kID0gY29tbW9uOjpCaWRpUXVldWVFbmQ8UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiwgQmFzZVBhY2tldEJ1aWxkZXI+OwotICB2aXJ0dWFsIFF1ZXVlVXBFbmQqIEdldEFjbFF1ZXVlRW5kKCkgY29uc3Q7Ci0KLSAgYm9vbCBsb2NhbGx5X2luaXRpYXRlZF97ZmFsc2V9OwotCi0gcHJvdGVjdGVkOgotICBBY2xDb25uZWN0aW9uKFF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCwgdWludDE2X3QgaGFuZGxlKSA6IHF1ZXVlX3VwX2VuZF8ocXVldWVfdXBfZW5kKSwgaGFuZGxlXyhoYW5kbGUpIHt9Ci0gIFF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZF87Ci0gIHVpbnQxNl90IGhhbmRsZV87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBY2xDb25uZWN0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2FjbF9mcmFnbWVudGVyLmNjIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2FjbF9mcmFnbWVudGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmNiZTY5Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9hY2xfZnJhZ21lbnRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvYWNsX2ZyYWdtZW50ZXIuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGFjbF9tYW5hZ2VyIHsKLQotQWNsRnJhZ21lbnRlcjo6QWNsRnJhZ21lbnRlcihzaXplX3QgbXR1LCBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGFja2V0KQotICAgIDogbXR1XyhtdHUpLCBwYWNrZXRfKHN0ZDo6bW92ZShwYWNrZXQpKSB7fQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPj4gQWNsRnJhZ21lbnRlcjo6R2V0RnJhZ21lbnRzKCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPj4gdG9fcmV0dXJuOwotICBwYWNrZXQ6OkZyYWdtZW50aW5nSW5zZXJ0ZXIgZnJhZ21lbnRpbmdfaW5zZXJ0ZXIobXR1Xywgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcih0b19yZXR1cm4pKTsKLSAgcGFja2V0Xy0+U2VyaWFsaXplKGZyYWdtZW50aW5nX2luc2VydGVyKTsKLSAgZnJhZ21lbnRpbmdfaW5zZXJ0ZXIuZmluYWxpemUoKTsKLSAgcmV0dXJuIHRvX3JldHVybjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFjbF9tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIvYWNsX2ZyYWdtZW50ZXIuaCBiL2dkL2hjaS9hY2xfbWFuYWdlci9hY2xfZnJhZ21lbnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2JhZGVmLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9hY2xfZnJhZ21lbnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBhY2xfbWFuYWdlciB7Ci0KLWNsYXNzIEFjbEZyYWdtZW50ZXIgewotIHB1YmxpYzoKLSAgQWNsRnJhZ21lbnRlcihzaXplX3QgbXR1LCBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gaW5wdXQpOwotICB2aXJ0dWFsIH5BY2xGcmFnbWVudGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OlJhd0J1aWxkZXI+PiBHZXRGcmFnbWVudHMoKTsKLQotIHByaXZhdGU6Ci0gIHNpemVfdCBtdHVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGFja2V0XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2Fzc2VtYmxlci5oIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2Fzc2VtYmxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZkN2NhLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9hc3NlbWJsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBhY2xfbWFuYWdlciB7Ci0KLWNvbnN0ZXhwciBzaXplX3Qga01heFF1ZXVlZFBhY2tldHNQZXJDb25uZWN0aW9uID0gMTA7Ci1jb25zdGV4cHIgc2l6ZV90IGtMMmNhcEJhc2ljRnJhbWVIZWFkZXJTaXplID0gNDsKLQotbmFtZXNwYWNlIHsKLWNsYXNzIFBhY2tldFZpZXdGb3JSZWNvbWJpbmF0aW9uIDogcHVibGljIHBhY2tldDo6UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiB7Ci0gcHVibGljOgotICBQYWNrZXRWaWV3Rm9yUmVjb21iaW5hdGlvbihjb25zdCBQYWNrZXRWaWV3JiBwYWNrZXRWaWV3KSA6IFBhY2tldFZpZXcocGFja2V0Vmlldykge30KLSAgdm9pZCBBcHBlbmRQYWNrZXRWaWV3KHBhY2tldDo6UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiB0b19hcHBlbmQpIHsKLSAgICBBcHBlbmQodG9fYXBwZW5kKTsKLSAgfQotfTsKLQotLy8gUGVyIHNwZWMgNS4xIFZvbCAyIFBhcnQgQiA1LjMsIEFDTCBsaW5rIHNoYWxsIGNhcnJ5IEwyQ0FQIGRhdGEuIFRoZXJlZm9yZSwgYW4gQUNMIHBhY2tldCBzaGFsbCBjb250YWluIEwyQ0FQIFBEVS4KLS8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgUERVIHNpemUgb2YgdGhlIEwyQ0FQIGRhdGEgaWYgaXQncyBhIHN0YXJ0aW5nIHBhY2tldC4gUmV0dXJucyAwIGlmIGl0J3MgaW52YWxpZC4KLXVpbnQxNl90IEdldEwyY2FwUGR1U2l6ZShBY2xWaWV3IHBhY2tldCkgewotICBhdXRvIGwyY2FwX3BheWxvYWQgPSBwYWNrZXQuR2V0UGF5bG9hZCgpOwotICBpZiAobDJjYXBfcGF5bG9hZC5zaXplKCkgPCBrTDJjYXBCYXNpY0ZyYW1lSGVhZGVyU2l6ZSkgewotICAgIExPR19FUlJPUigiQ29udHJvbGxlciBzZW50IGFuIGludmFsaWQgTDJDQVAgc3RhcnRpbmcgcGFja2V0ISIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAobDJjYXBfcGF5bG9hZC5hdCgxKSA8PCA4dSkgKyBsMmNhcF9wYXlsb2FkLmF0KDApOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RydWN0IGFzc2VtYmxlciB7Ci0gIGFzc2VtYmxlcihBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIEFjbENvbm5lY3Rpb246OlF1ZXVlRG93bkVuZCogZG93bl9lbmQsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgICAgOiBhZGRyZXNzX3dpdGhfdHlwZV8oYWRkcmVzc193aXRoX3R5cGUpLCBkb3duX2VuZF8oZG93bl9lbmQpLCBoYW5kbGVyXyhoYW5kbGVyKSB7fQotICBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGVfOwotICBBY2xDb25uZWN0aW9uOjpRdWV1ZURvd25FbmQqIGRvd25fZW5kXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICBQYWNrZXRWaWV3Rm9yUmVjb21iaW5hdGlvbiByZWNvbWJpbmF0aW9uX3N0YWdlX3tQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpfTsKLSAgc2l6ZV90IHJlbWFpbmluZ19zZHVfY29udGludWF0aW9uX3BhY2tldF9zaXplXyA9IDA7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OmF0b21pY19ib29sPiBlbnF1ZXVlX3JlZ2lzdGVyZWRfID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OmF0b21pY19ib29sPihmYWxzZSk7Ci0gIHN0ZDo6cXVldWU8cGFja2V0OjpQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+PiBpbmNvbWluZ19xdWV1ZV87Ci0KLSAgfmFzc2VtYmxlcigpIHsKLSAgICBpZiAoZW5xdWV1ZV9yZWdpc3RlcmVkXy0+ZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICBkb3duX2VuZF8tPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW52b2tlZCBmcm9tIHNvbWUgZXh0ZXJuYWwgUXVldWUgUmVhY3RhYmxlIGNvbnRleHQKLSAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPj4gb25fbGVfaW5jb21pbmdfZGF0YV9yZWFkeSgpIHsKLSAgICBhdXRvIHBhY2tldCA9IGluY29taW5nX3F1ZXVlXy5mcm9udCgpOwotICAgIGluY29taW5nX3F1ZXVlXy5wb3AoKTsKLSAgICBpZiAoaW5jb21pbmdfcXVldWVfLmVtcHR5KCkgJiYgZW5xdWV1ZV9yZWdpc3RlcmVkXy0+ZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICBkb3duX2VuZF8tPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4+KHBhY2tldCk7Ci0gIH0KLQotICB2b2lkIG9uX2luY29taW5nX3BhY2tldChBY2xWaWV3IHBhY2tldCkgewotICAgIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGF5bG9hZCA9IHBhY2tldC5HZXRQYXlsb2FkKCk7Ci0gICAgYXV0byBwYXlsb2FkX3NpemUgPSBwYXlsb2FkLnNpemUoKTsKLSAgICBhdXRvIGJyb2FkY2FzdF9mbGFnID0gcGFja2V0LkdldEJyb2FkY2FzdEZsYWcoKTsKLSAgICBpZiAoYnJvYWRjYXN0X2ZsYWcgPT0gQnJvYWRjYXN0RmxhZzo6QUNUSVZFX1BFUklQSEVSQUxfQlJPQURDQVNUKSB7Ci0gICAgICBMT0dfV0FSTigiRHJvcHBpbmcgYnJvYWRjYXN0IGZyb20gcmVtb3RlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gcGFja2V0X2JvdW5kYXJ5X2ZsYWcgPSBwYWNrZXQuR2V0UGFja2V0Qm91bmRhcnlGbGFnKCk7Ci0gICAgaWYgKHBhY2tldF9ib3VuZGFyeV9mbGFnID09IFBhY2tldEJvdW5kYXJ5RmxhZzo6RklSU1RfTk9OX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFKSB7Ci0gICAgICBMT0dfRVJST1IoIkNvbnRyb2xsZXIgaXMgbm90IGFsbG93ZWQgdG8gc2VuZCBGSVJTVF9OT05fQVVUT01BVElDQUxMWV9GTFVTSEFCTEUgdG8gaG9zdCBleGNlcHQgbG9vcGJhY2sgbW9kZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGFja2V0X2JvdW5kYXJ5X2ZsYWcgPT0gUGFja2V0Qm91bmRhcnlGbGFnOjpDT05USU5VSU5HX0ZSQUdNRU5UKSB7Ci0gICAgICBpZiAocmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfIDwgcGF5bG9hZF9zaXplKSB7Ci0gICAgICAgIExPR19XQVJOKCJSZW1vdGUgc2VudCB1bmV4cGVjdGVkIEwyQ0FQIFBEVS4gRHJvcCB0aGUgZW50aXJlIEwyQ0FQIFBEVSIpOwotICAgICAgICByZWNvbWJpbmF0aW9uX3N0YWdlXyA9Ci0gICAgICAgICAgICBQYWNrZXRWaWV3Rm9yUmVjb21iaW5hdGlvbihQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpKTsKLSAgICAgICAgcmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfIC09IHBheWxvYWRfc2l6ZTsKLSAgICAgIHJlY29tYmluYXRpb25fc3RhZ2VfLkFwcGVuZFBhY2tldFZpZXcocGF5bG9hZCk7Ci0gICAgICBpZiAocmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfICE9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGF5bG9hZCA9IHJlY29tYmluYXRpb25fc3RhZ2VfOwotICAgICAgICByZWNvbWJpbmF0aW9uX3N0YWdlXyA9Ci0gICAgICAgICAgICBQYWNrZXRWaWV3Rm9yUmVjb21iaW5hdGlvbihQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBhY2tldF9ib3VuZGFyeV9mbGFnID09IFBhY2tldEJvdW5kYXJ5RmxhZzo6RklSU1RfQVVUT01BVElDQUxMWV9GTFVTSEFCTEUpIHsKLSAgICAgIGlmIChyZWNvbWJpbmF0aW9uX3N0YWdlXy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIExPR19FUlJPUigiQ29udHJvbGxlciBzZW50IGEgc3RhcnRpbmcgcGFja2V0IHdpdGhvdXQgZmluaXNoaW5nIHByZXZpb3VzIHBhY2tldC4gRHJvcCBwcmV2aW91cyBvbmUuIik7Ci0gICAgICB9Ci0gICAgICBhdXRvIGwyY2FwX3BkdV9zaXplID0gR2V0TDJjYXBQZHVTaXplKHBhY2tldCk7Ci0gICAgICByZW1haW5pbmdfc2R1X2NvbnRpbnVhdGlvbl9wYWNrZXRfc2l6ZV8gPSBsMmNhcF9wZHVfc2l6ZSAtIChwYXlsb2FkX3NpemUgLSBrTDJjYXBCYXNpY0ZyYW1lSGVhZGVyU2l6ZSk7Ci0gICAgICBpZiAocmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfID4gMCkgewotICAgICAgICByZWNvbWJpbmF0aW9uX3N0YWdlXyA9IHBheWxvYWQ7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluY29taW5nX3F1ZXVlXy5zaXplKCkgPiBrTWF4UXVldWVkUGFja2V0c1BlckNvbm5lY3Rpb24pIHsKLSAgICAgIExPR19FUlJPUigiRHJvcHBpbmcgcGFja2V0IGZyb20gJXMgZHVlIHRvIGNvbmdlc3Rpb24iLCBhZGRyZXNzX3dpdGhfdHlwZV8uVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbmNvbWluZ19xdWV1ZV8ucHVzaChwYXlsb2FkKTsKLSAgICBpZiAoIWVucXVldWVfcmVnaXN0ZXJlZF8tPmV4Y2hhbmdlKHRydWUpKSB7Ci0gICAgICBkb3duX2VuZF8tPlJlZ2lzdGVyRW5xdWV1ZShoYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6QmluZCgmYXNzZW1ibGVyOjpvbl9sZV9pbmNvbWluZ19kYXRhX3JlYWR5LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgICB9Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uY2MgYi9nZC9oY2kvYWNsX21hbmFnZXIvY2xhc3NpY19hY2xfY29ubmVjdGlvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzMjZlNy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWNsX21hbmFnZXIvY2xhc3NpY19hY2xfY29ubmVjdGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvZXZlbnRfY2hlY2tlcnMuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgIm9zL21ldHJpY3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBBY2xDb25uZWN0aW9uVHJhY2tlciA6IHB1YmxpYyBDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICBBY2xDb25uZWN0aW9uVHJhY2tlcigKLSAgICAgIEFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUpCi0gICAgICA6IGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8oYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlKSwgYWRkcmVzc18oYWRkcmVzcyksIGNvbm5lY3Rpb25faGFuZGxlXyhjb25uZWN0aW9uX2hhbmRsZSkge30KLSAgfkFjbENvbm5lY3Rpb25UcmFja2VyKCkgewotICAgIC8vIElmIGNhbGxiYWNrcyB3ZXJlIHJlZ2lzdGVyZWQsIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBkZWxpdmVyZWQuCi0gICAgQVNTRVJUKGNsaWVudF9jYWxsYmFja3NfID09IG51bGxwdHIgfHwgcXVldWVkX2NhbGxiYWNrc18uZW1wdHkoKSk7Ci0gIH0KLSAgdm9pZCBSZWdpc3RlckNhbGxiYWNrcyhDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogY2FsbGJhY2tzLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIGNsaWVudF9oYW5kbGVyXyA9IGhhbmRsZXI7Ci0gICAgY2xpZW50X2NhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0gICAgd2hpbGUgKCFxdWV1ZWRfY2FsbGJhY2tzXy5lbXB0eSgpKSB7Ci0gICAgICBhdXRvIGl0ZXIgPSBxdWV1ZWRfY2FsbGJhY2tzXy5iZWdpbigpOwotICAgICAgaGFuZGxlci0+UG9zdChzdGQ6Om1vdmUoKml0ZXIpKTsKLSAgICAgIHF1ZXVlZF9jYWxsYmFja3NfLmVyYXNlKGl0ZXIpOwotICAgIH0KLSAgfQotCi0jZGVmaW5lIFNBVkVfT1JfQ0FMTChmLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGNsaWVudF9oYW5kbGVyXyA9PSBudWxscHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHF1ZXVlZF9jYWxsYmFja3NfLmVtcGxhY2VfYmFjayggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJkNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOjpmLCBjb21tb246OlVucmV0YWluZWQodGhpcyksICMjX19WQV9BUkdTX18pKTsgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsaWVudF9oYW5kbGVyXy0+UG9zdCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJkNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOjpmLCBjb21tb246OlVucmV0YWluZWQoY2xpZW50X2NhbGxiYWNrc18pLCAjI19fVkFfQVJHU19fKSk7IFwKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWQodWludDE2X3QgcGFja2V0X3R5cGUpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25Db25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWQsIHBhY2tldF90eXBlKQotICB9Ci0gIHZvaWQgT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlLCBoY2lfc3RhdHVzKQotICB9Ci0gIHZvaWQgT25FbmNyeXB0aW9uQ2hhbmdlKEVuY3J5cHRpb25FbmFibGVkIGVuYWJsZWQpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25FbmNyeXB0aW9uQ2hhbmdlLCBlbmFibGVkKQotICB9Ci0gIHZvaWQgT25DaGFuZ2VDb25uZWN0aW9uTGlua0tleUNvbXBsZXRlKCkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPbkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGUpCi0gIH0KLSAgdm9pZCBPblJlYWRDbG9ja09mZnNldENvbXBsZXRlKHVpbnQxNl90IGNsb2NrX29mZnNldCkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPblJlYWRDbG9ja09mZnNldENvbXBsZXRlLCBjbG9ja19vZmZzZXQpCi0gIH0KLSAgdm9pZCBPbk1vZGVDaGFuZ2UoRXJyb3JDb2RlIHN0YXR1cywgTW9kZSBjdXJyZW50X21vZGUsIHVpbnQxNl90IGludGVydmFsKSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uTW9kZUNoYW5nZSwgc3RhdHVzLCBjdXJyZW50X21vZGUsIGludGVydmFsKQotICB9Ci0gIHZvaWQgT25TbmlmZlN1YnJhdGluZygKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoCi0gICAgICAgIE9uU25pZmZTdWJyYXRpbmcsCi0gICAgICAgIGhjaV9zdGF0dXMsCi0gICAgICAgIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgICAgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgIG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci0gIH0KLSAgdm9pZCBPblFvc1NldHVwQ29tcGxldGUoU2VydmljZVR5cGUgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUW9zU2V0dXBDb21wbGV0ZSwgc2VydmljZV90eXBlLCB0b2tlbl9yYXRlLCBwZWFrX2JhbmR3aWR0aCwgbGF0ZW5jeSwgZGVsYXlfdmFyaWF0aW9uKQotICB9Ci0gIHZvaWQgT25GbG93U3BlY2lmaWNhdGlvbkNvbXBsZXRlKEZsb3dEaXJlY3Rpb24gZmxvd19kaXJlY3Rpb24sIFNlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSwgdWludDMyX3QgdG9rZW5fcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUsIHVpbnQzMl90IHBlYWtfYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY2Nlc3NfbGF0ZW5jeSkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPbkZsb3dTcGVjaWZpY2F0aW9uQ29tcGxldGUsIGZsb3dfZGlyZWN0aW9uLCBzZXJ2aWNlX3R5cGUsIHRva2VuX3JhdGUsIHRva2VuX2J1Y2tldF9zaXplLAotICAgICAgICAgICAgICAgICBwZWFrX2JhbmR3aWR0aCwgYWNjZXNzX2xhdGVuY3kpCi0gIH0KLSAgdm9pZCBPbkZsdXNoT2NjdXJyZWQoKSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uRmx1c2hPY2N1cnJlZCkKLSAgfQotICB2b2lkIE9uUm9sZURpc2NvdmVyeUNvbXBsZXRlKFJvbGUgY3VycmVudF9yb2xlKSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUm9sZURpc2NvdmVyeUNvbXBsZXRlLCBjdXJyZW50X3JvbGUpCi0gIH0KLSAgdm9pZCBPblJlYWRMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZSh1aW50MTZfdCBsaW5rX3BvbGljeV9zZXR0aW5ncykgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPblJlYWRMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZSwgbGlua19wb2xpY3lfc2V0dGluZ3MpCi0gIH0KLSAgdm9pZCBPblJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXRDb21wbGV0ZSh1aW50MTZfdCBmbHVzaF90aW1lb3V0KSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dENvbXBsZXRlLCBmbHVzaF90aW1lb3V0KQotICB9Ci0gIHZvaWQgT25SZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUodWludDhfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCkgb3ZlcnJpZGUgewotICAgIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoCi0gICAgICAgIGFkZHJlc3NfLCBjb25uZWN0aW9uX2hhbmRsZV8sIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEVycm9yQ29kZTo6U1VDQ0VTUyksIHRyYW5zbWl0X3Bvd2VyX2xldmVsKTsKLSAgICBTQVZFX09SX0NBTEwoT25SZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUsIHRyYW5zbWl0X3Bvd2VyX2xldmVsKQotICB9Ci0gIHZvaWQgT25SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlKHVpbnQxNl90IGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPblJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q29tcGxldGUsIGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCkKLSAgfQotICB2b2lkIE9uUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyQ29tcGxldGUodWludDE2X3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcikgb3ZlcnJpZGUgewotICAgIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY1JlYWRGYWlsZWRDb250YWN0Q291bnRlclJlc3VsdCgKLSAgICAgICAgYWRkcmVzc18sIGNvbm5lY3Rpb25faGFuZGxlXywgc3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpTVUNDRVNTKSwgZmFpbGVkX2NvbnRhY3RfY291bnRlcik7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyQ29tcGxldGUsIGZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotICB9Ci0gIHZvaWQgT25SZWFkTGlua1F1YWxpdHlDb21wbGV0ZSh1aW50OF90IGxpbmtfcXVhbGl0eSkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPblJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlLCBsaW5rX3F1YWxpdHkpCi0gIH0KLSAgdm9pZCBPblJlYWRBZmhDaGFubmVsTWFwQ29tcGxldGUoQWZoTW9kZSBhZmhfbW9kZSwgc3RkOjphcnJheTx1aW50OF90LCAxMD4gYWZoX2NoYW5uZWxfbWFwKSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUmVhZEFmaENoYW5uZWxNYXBDb21wbGV0ZSwgYWZoX21vZGUsIGFmaF9jaGFubmVsX21hcCkKLSAgfQotICB2b2lkIE9uUmVhZFJzc2lDb21wbGV0ZSh1aW50OF90IHJzc2kpIG92ZXJyaWRlIHsKLSAgICBibHVldG9vdGg6Om9zOjpMb2dNZXRyaWNSZWFkUnNzaVJlc3VsdCgKLSAgICAgICAgYWRkcmVzc18sIGNvbm5lY3Rpb25faGFuZGxlXywgc3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpTVUNDRVNTKSwgcnNzaSk7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUmVhZFJzc2lDb21wbGV0ZSwgcnNzaSk7Ci0gIH0KLSAgdm9pZCBPblJlYWRDbG9ja0NvbXBsZXRlKHVpbnQzMl90IGNsb2NrLCB1aW50MTZfdCBhY2N1cmFjeSkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPblJlYWRDbG9ja0NvbXBsZXRlLCBjbG9jaywgYWNjdXJhY3kpCi0gIH0KLSAgdm9pZCBPbkNlbnRyYWxMaW5rS2V5Q29tcGxldGUoS2V5RmxhZyBrZXlfZmxhZykgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPbkNlbnRyYWxMaW5rS2V5Q29tcGxldGUsIGtleV9mbGFnKQotICB9Ci0gIHZvaWQgT25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIFJvbGUgbmV3X3JvbGUpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25Sb2xlQ2hhbmdlLCBoY2lfc3RhdHVzLCBuZXdfcm9sZSkKLSAgfQotICB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSBvdmVycmlkZSB7Ci0gICAgYmx1ZXRvb3RoOjpvczo6TG9nTWV0cmljUmVtb3RlVmVyc2lvbkluZm8oCi0gICAgICAgIGNvbm5lY3Rpb25faGFuZGxlXywgc3RhdGljX2Nhc3Q8dWludDhfdD4oaGNpX3N0YXR1cyksIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXJfbmFtZSwgc3ViX3ZlcnNpb24pOwotICAgIFNBVkVfT1JfQ0FMTChPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSwgaGNpX3N0YXR1cywgbG1wX3ZlcnNpb24sIG1hbnVmYWN0dXJlcl9uYW1lLCBzdWJfdmVyc2lvbik7Ci0gIH0KLSAgdm9pZCBPblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlKHVpbnQ2NF90IGZlYXR1cmVzKSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGUsIGZlYXR1cmVzKTsKLSAgfQotICB2b2lkIE9uUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZSh1aW50OF90IHBhZ2VfbnVtYmVyLCB1aW50OF90IG1heF9wYWdlX251bWJlciwgdWludDY0X3QgZmVhdHVyZXMpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlc0NvbXBsZXRlLCBwYWdlX251bWJlciwgbWF4X3BhZ2VfbnVtYmVyLCBmZWF0dXJlcyk7Ci0gIH0KLSAgdm9pZCBPbkRpc2Nvbm5lY3Rpb24oRXJyb3JDb2RlIHJlYXNvbikgewotICAgIFNBVkVfT1JfQ0FMTChPbkRpc2Nvbm5lY3Rpb24sIHJlYXNvbik7Ci0gIH0KLQotI3VuZGVmIFNBVkVfT1JfQ0FMTAotCi0gIHZvaWQgb25fcm9sZV9kaXNjb3ZlcnlfY29tcGxldGUoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gUm9sZURpc2NvdmVyeUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIGlmICghY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcm9sZV9kaXNjb3ZlcnlfY29tcGxldGUgd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIGF1dG8gc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX2NvZGUgPSBFcnJvckNvZGVUZXh0KHN0YXR1cyk7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JvbGVfZGlzY292ZXJ5X2NvbXBsZXRlIHdpdGggZXJyb3IgY29kZSAlcyIsIGVycm9yX2NvZGUuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIE9uUm9sZURpc2NvdmVyeUNvbXBsZXRlKGNvbXBsZXRlX3ZpZXcuR2V0Q3VycmVudFJvbGUoKSk7Ci0gIH0KLQotICB2b2lkIG9uX3JlYWRfbGlua19wb2xpY3lfc2V0dGluZ3NfY29tcGxldGUoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIGlmICghY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcmVhZF9saW5rX3BvbGljeV9zZXR0aW5nc19jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcmVhZF9saW5rX3BvbGljeV9zZXR0aW5nc19jb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvcl9jb2RlLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBPblJlYWRMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZShjb21wbGV0ZV92aWV3LkdldExpbmtQb2xpY3lTZXR0aW5ncygpKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZShDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NvbXBsZXRlIHdpdGggaW52YWxpZCBwYWNrZXQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NvbXBsZXRlIHdpdGggZXJyb3IgY29kZSAlcyIsIGVycm9yX2NvZGUuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIE9uUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dENvbXBsZXRlKGNvbXBsZXRlX3ZpZXcuR2V0Rmx1c2hUaW1lb3V0KCkpOwotICB9Ci0KLSAgdm9pZCBvbl9yZWFkX3RyYW5zbWl0X3Bvd2VyX2xldmVsX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IFJlYWRUcmFuc21pdFBvd2VyTGV2ZWxDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBpZiAoIWNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JlYWRfdHJhbnNtaXRfcG93ZXJfbGV2ZWxfY29tcGxldGUgd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIGF1dG8gc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX2NvZGUgPSBFcnJvckNvZGVUZXh0KHN0YXR1cyk7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JlYWRfdHJhbnNtaXRfcG93ZXJfbGV2ZWxfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgT25SZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUoY29tcGxldGVfdmlldy5HZXRUcmFuc21pdFBvd2VyTGV2ZWwoKSk7Ci0gIH0KLQotICB2b2lkIG9uX3JlYWRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0X2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2xpbmtfc3VwZXJ2aXNpb25fdGltZW91dF9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcmVhZF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXRfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgT25SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlKGNvbXBsZXRlX3ZpZXcuR2V0TGlua1N1cGVydmlzaW9uVGltZW91dCgpKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IFJlYWRGYWlsZWRDb250YWN0Q291bnRlckNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIGlmICghY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlIHdpdGggaW52YWxpZCBwYWNrZXQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgT25SZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZShjb21wbGV0ZV92aWV3LkdldEZhaWxlZENvbnRhY3RDb3VudGVyKCkpOwotICB9Ci0KLSAgdm9pZCBvbl9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZShDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkTGlua1F1YWxpdHlDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBpZiAoIWNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JlYWRfbGlua19xdWFsaXR5X2NvbXBsZXRlIHdpdGggaW52YWxpZCBwYWNrZXQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvcl9jb2RlLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBPblJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlKGNvbXBsZXRlX3ZpZXcuR2V0TGlua1F1YWxpdHkoKSk7Ci0gIH0KLQotICB2b2lkIG9uX3JlYWRfYWZoX2NoYW5uZWxfbWFwX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IFJlYWRBZmhDaGFubmVsTWFwQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2FmaF9jaGFubmVsX21hcF9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcmVhZF9hZmhfY2hhbm5lbF9tYXBfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgT25SZWFkQWZoQ2hhbm5lbE1hcENvbXBsZXRlKGNvbXBsZXRlX3ZpZXcuR2V0QWZoTW9kZSgpLCBjb21wbGV0ZV92aWV3LkdldEFmaENoYW5uZWxNYXAoKSk7Ci0gIH0KLQotICB2b2lkIG9uX3JlYWRfcnNzaV9jb21wbGV0ZShDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkUnNzaUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIGlmICghY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcmVhZF9yc3NpX2NvbXBsZXRlIHdpdGggaW52YWxpZCBwYWNrZXQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX3Jzc2lfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgT25SZWFkUnNzaUNvbXBsZXRlKGNvbXBsZXRlX3ZpZXcuR2V0UnNzaSgpKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9yZW1vdGVfdmVyc2lvbl9pbmZvcm1hdGlvbl9zdGF0dXMoQ29tbWFuZFN0YXR1c1ZpZXcgdmlldykgewotICAgIEFTU0VSVF9MT0codmlldy5Jc1ZhbGlkKCksICJCYWQgc3RhdHVzIHBhY2tldCEiKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9yZW1vdGVfc3VwcG9ydGVkX2ZlYXR1cmVzX3N0YXR1cyhDb21tYW5kU3RhdHVzVmlldyB2aWV3KSB7Ci0gICAgQVNTRVJUX0xPRyh2aWV3LklzVmFsaWQoKSwgIkJhZCBzdGF0dXMgcGFja2V0ISIpOwotICB9Ci0KLSAgdm9pZCBvbl9yZWFkX3JlbW90ZV9leHRlbmRlZF9mZWF0dXJlc19zdGF0dXMoQ29tbWFuZFN0YXR1c1ZpZXcgdmlldykgewotICAgIEFTU0VSVF9MT0codmlldy5Jc1ZhbGlkKCksICJCYWQgc3RhdHVzIHBhY2tldCEiKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9jbG9ja19jb21wbGV0ZShDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkQ2xvY2tDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBpZiAoIWNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JlYWRfY2xvY2tfY29tcGxldGUgd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIGF1dG8gc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX2NvZGUgPSBFcnJvckNvZGVUZXh0KHN0YXR1cyk7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JlYWRfY2xvY2tfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDMyX3QgY2xvY2sgPSBjb21wbGV0ZV92aWV3LkdldENsb2NrKCk7Ci0gICAgdWludDE2X3QgYWNjdXJhY3kgPSBjb21wbGV0ZV92aWV3LkdldEFjY3VyYWN5KCk7Ci0gICAgT25SZWFkQ2xvY2tDb21wbGV0ZShjbG9jaywgYWNjdXJhY3kpOwotICB9Ci0KLSAgQWNsQ29ubmVjdGlvbkludGVyZmFjZSogYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXzsKLSAgb3M6OkhhbmRsZXIqIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIENvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBjbGllbnRfY2FsbGJhY2tzXyA9IG51bGxwdHI7Ci0gIHN0ZDo6bGlzdDxjb21tb246Ok9uY2VDbG9zdXJlPiBxdWV1ZWRfY2FsbGJhY2tzXzsKLSAgQWRkcmVzcyBhZGRyZXNzXzsKLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGVfOwotfTsKLQotc3RydWN0IENsYXNzaWNBY2xDb25uZWN0aW9uOjppbXBsIHsKLSAgaW1wbCgKLSAgICAgIEFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxRdWV1ZT4gcXVldWUsCi0gICAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUpCi0gICAgICA6IHRyYWNrZXIoYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlLCBhZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSksIHF1ZXVlXyhzdGQ6Om1vdmUocXVldWUpKSB7fQotICBDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogR2V0RXZlbnRDYWxsYmFja3MoKSB7Ci0gICAgQVNTRVJUKCFjYWxsYmFja3NfZ2l2ZW5fKTsKLSAgICBjYWxsYmFja3NfZ2l2ZW5fID0gdHJ1ZTsKLSAgICByZXR1cm4gJnRyYWNrZXI7Ci0gIH0KLQotICBib29sIGNhbGxiYWNrc19naXZlbl97ZmFsc2V9OwotICBBY2xDb25uZWN0aW9uVHJhY2tlciB0cmFja2VyOwotICBzdGQ6OnNoYXJlZF9wdHI8UXVldWU+IHF1ZXVlXzsKLX07Ci0KLUNsYXNzaWNBY2xDb25uZWN0aW9uOjpDbGFzc2ljQWNsQ29ubmVjdGlvbigpCi0gICAgOiBBY2xDb25uZWN0aW9uKCksIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8obnVsbHB0ciksIGFkZHJlc3NfKEFkZHJlc3M6OmtFbXB0eSkge30KLQotQ2xhc3NpY0FjbENvbm5lY3Rpb246OkNsYXNzaWNBY2xDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxRdWV1ZT4gcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNsQ29ubmVjdGlvbkludGVyZmFjZSogYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBhZGRyZXNzKQotICAgIDogQWNsQ29ubmVjdGlvbihxdWV1ZS0+R2V0VXBFbmQoKSwgaGFuZGxlKSwgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXyhhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2UpLCBhZGRyZXNzXyhhZGRyZXNzKSB7Ci0gIHBpbXBsXyA9IG5ldyBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6aW1wbChhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2UsIHN0ZDo6bW92ZShxdWV1ZSksIGFkZHJlc3MsIGhhbmRsZSk7Ci19Ci0KLUNsYXNzaWNBY2xDb25uZWN0aW9uOjp+Q2xhc3NpY0FjbENvbm5lY3Rpb24oKSB7Ci0gIGRlbGV0ZSBwaW1wbF87Ci19Ci0KLUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6R2V0RXZlbnRDYWxsYmFja3MoKSB7Ci0gIHJldHVybiBwaW1wbF8tPkdldEV2ZW50Q2FsbGJhY2tzKCk7Ci19Ci0KLXZvaWQgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlJlZ2lzdGVyQ2FsbGJhY2tzKENvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIHJldHVybiBwaW1wbF8tPnRyYWNrZXIuUmVnaXN0ZXJDYWxsYmFja3MoY2FsbGJhY2tzLCBoYW5kbGVyKTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6RGlzY29ubmVjdChEaXNjb25uZWN0UmVhc29uIHJlYXNvbikgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIERpc2Nvbm5lY3RCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgcmVhc29uKSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlKCZjaGVja19jb21tYW5kX3N0YXR1czxEaXNjb25uZWN0U3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OkNoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlKHVpbnQxNl90IHBhY2tldF90eXBlKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgQ2hhbmdlQ29ubmVjdGlvblBhY2tldFR5cGVCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgcGFja2V0X3R5cGUpLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPENoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OkF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPEF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlNldENvbm5lY3Rpb25FbmNyeXB0aW9uKEVuYWJsZSBlbmFibGUpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBTZXRDb25uZWN0aW9uRW5jcnlwdGlvbkJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfLCBlbmFibGUpLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPFNldENvbm5lY3Rpb25FbmNyeXB0aW9uU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5KCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5QnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5U3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlJlYWRDbG9ja09mZnNldCgpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBSZWFkQ2xvY2tPZmZzZXRCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXyksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZSgmY2hlY2tfY29tbWFuZF9zdGF0dXM8UmVhZENsb2NrT2Zmc2V0U3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OkhvbGRNb2RlKHVpbnQxNl90IG1heF9pbnRlcnZhbCwgdWludDE2X3QgbWluX2ludGVydmFsKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgSG9sZE1vZGVCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgbWF4X2ludGVydmFsLCBtaW5faW50ZXJ2YWwpLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPEhvbGRNb2RlU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlNuaWZmTW9kZSh1aW50MTZfdCBtYXhfaW50ZXJ2YWwsIHVpbnQxNl90IG1pbl9pbnRlcnZhbCwgdWludDE2X3QgYXR0ZW1wdCwgdWludDE2X3QgdGltZW91dCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFNuaWZmTW9kZUJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfLCBtYXhfaW50ZXJ2YWwsIG1pbl9pbnRlcnZhbCwgYXR0ZW1wdCwgdGltZW91dCksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZSgmY2hlY2tfY29tbWFuZF9zdGF0dXM8U25pZmZNb2RlU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OkV4aXRTbmlmZk1vZGUoKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgRXhpdFNuaWZmTW9kZUJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfKSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlKCZjaGVja19jb21tYW5kX3N0YXR1czxFeGl0U25pZmZNb2RlU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlFvc1NldHVwKFNlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSwgdWludDMyX3QgdG9rZW5fcmF0ZSwgdWludDMyX3QgcGVha19iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5LCB1aW50MzJfdCBkZWxheV92YXJpYXRpb24pIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBRb3NTZXR1cEJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfLCBzZXJ2aWNlX3R5cGUsIHRva2VuX3JhdGUsIHBlYWtfYmFuZHdpZHRoLCBsYXRlbmN5LCBkZWxheV92YXJpYXRpb24pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPFFvc1NldHVwU3RhdHVzVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlJvbGVEaXNjb3ZlcnkoKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgUm9sZURpc2NvdmVyeUJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfKSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlT24oJnBpbXBsXy0+dHJhY2tlciwgJkFjbENvbm5lY3Rpb25UcmFja2VyOjpvbl9yb2xlX2Rpc2NvdmVyeV9jb21wbGV0ZSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6UmVhZExpbmtQb2xpY3lTZXR0aW5ncygpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBSZWFkTGlua1BvbGljeVNldHRpbmdzQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2VPbigmcGltcGxfLT50cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWNsQ29ubmVjdGlvblRyYWNrZXI6Om9uX3JlYWRfbGlua19wb2xpY3lfc2V0dGluZ3NfY29tcGxldGUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OldyaXRlTGlua1BvbGljeVNldHRpbmdzKHVpbnQxNl90IGxpbmtfcG9saWN5X3NldHRpbmdzKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgV3JpdGVMaW5rUG9saWN5U2V0dGluZ3NCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgbGlua19wb2xpY3lfc2V0dGluZ3MpLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfY29tcGxldGU8V3JpdGVMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZVZpZXc+KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpGbG93U3BlY2lmaWNhdGlvbihGbG93RGlyZWN0aW9uIGZsb3dfZGlyZWN0aW9uLCBTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwgdWludDMyX3QgcGVha19iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY2Nlc3NfbGF0ZW5jeSkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIEZsb3dTcGVjaWZpY2F0aW9uQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8sIGZsb3dfZGlyZWN0aW9uLCBzZXJ2aWNlX3R5cGUsIHRva2VuX3JhdGUsIHRva2VuX2J1Y2tldF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVha19iYW5kd2lkdGgsIGFjY2Vzc19sYXRlbmN5KSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlKCZjaGVja19jb21tYW5kX3N0YXR1czxGbG93U3BlY2lmaWNhdGlvblN0YXR1c1ZpZXc+KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpTbmlmZlN1YnJhdGluZyh1aW50MTZfdCBtYXhpbXVtX2xhdGVuY3ksIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBTbmlmZlN1YnJhdGluZ0J1aWxkZXI6OkNyZWF0ZShoYW5kbGVfLCBtYXhpbXVtX2xhdGVuY3ksIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsIG1pbmltdW1fbG9jYWxfdGltZW91dCksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZSgmY2hlY2tfY29tbWFuZF9jb21wbGV0ZTxTbmlmZlN1YnJhdGluZ0NvbXBsZXRlVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OkZsdXNoKCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIEZsdXNoQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfY29tcGxldGU8Rmx1c2hDb21wbGV0ZVZpZXc+KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpSZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0KCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXRCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXyksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZU9uKCZwaW1wbF8tPnRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY2xDb25uZWN0aW9uVHJhY2tlcjo6b25fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6V3JpdGVBdXRvbWF0aWNGbHVzaFRpbWVvdXQodWludDE2X3QgZmx1c2hfdGltZW91dCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFdyaXRlQXV0b21hdGljRmx1c2hUaW1lb3V0QnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8sIGZsdXNoX3RpbWVvdXQpLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfY29tcGxldGU8V3JpdGVBdXRvbWF0aWNGbHVzaFRpbWVvdXRDb21wbGV0ZVZpZXc+KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpSZWFkVHJhbnNtaXRQb3dlckxldmVsKFRyYW5zbWl0UG93ZXJMZXZlbFR5cGUgdHlwZSkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFJlYWRUcmFuc21pdFBvd2VyTGV2ZWxCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgdHlwZSksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZU9uKCZwaW1wbF8tPnRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY2xDb25uZWN0aW9uVHJhY2tlcjo6b25fcmVhZF90cmFuc21pdF9wb3dlcl9sZXZlbF9jb21wbGV0ZSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6UmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQoKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXRCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXyksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZU9uKCZwaW1wbF8tPnRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY2xDb25uZWN0aW9uVHJhY2tlcjo6b25fcmVhZF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXRfY29tcGxldGUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OldyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCh1aW50MTZfdCBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXRCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlKCZjaGVja19jb21tYW5kX2NvbXBsZXRlPFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlVmlldz4pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlJlYWRGYWlsZWRDb250YWN0Q291bnRlcigpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXyksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZU9uKCZwaW1wbF8tPnRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY2xDb25uZWN0aW9uVHJhY2tlcjo6b25fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXJCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXyksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZSgmY2hlY2tfY29tbWFuZF9jb21wbGV0ZTxSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyQ29tcGxldGVWaWV3PikpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6UmVhZExpbmtRdWFsaXR5KCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFJlYWRMaW5rUXVhbGl0eUJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfKSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlT24oJnBpbXBsXy0+dHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjbENvbm5lY3Rpb25UcmFja2VyOjpvbl9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6UmVhZEFmaENoYW5uZWxNYXAoKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgUmVhZEFmaENoYW5uZWxNYXBCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXyksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZU9uKCZwaW1wbF8tPnRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY2xDb25uZWN0aW9uVHJhY2tlcjo6b25fcmVhZF9hZmhfY2hhbm5lbF9tYXBfY29tcGxldGUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlJlYWRSc3NpKCkgewotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIFJlYWRSc3NpQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2VPbigmcGltcGxfLT50cmFja2VyLCAmQWNsQ29ubmVjdGlvblRyYWNrZXI6Om9uX3JlYWRfcnNzaV9jb21wbGV0ZSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDbGFzc2ljQWNsQ29ubmVjdGlvbjo6UmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2VPbigmcGltcGxfLT50cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWNsQ29ubmVjdGlvblRyYWNrZXI6Om9uX3JlYWRfcmVtb3RlX3ZlcnNpb25faW5mb3JtYXRpb25fc3RhdHVzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoKSB7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2VPbigmcGltcGxfLT50cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWNsQ29ubmVjdGlvblRyYWNrZXI6Om9uX3JlYWRfcmVtb3RlX3N1cHBvcnRlZF9mZWF0dXJlc19zdGF0dXMpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2xhc3NpY0FjbENvbm5lY3Rpb246OlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKHVpbnQ4X3QgcGFnZV9udW1iZXIpIHsKLSAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZShoYW5kbGVfLCBwYWdlX251bWJlciksCi0gICAgICBwaW1wbF8tPnRyYWNrZXIuY2xpZW50X2hhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgICZwaW1wbF8tPnRyYWNrZXIsICZBY2xDb25uZWN0aW9uVHJhY2tlcjo6b25fcmVhZF9yZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZXNfc3RhdHVzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENsYXNzaWNBY2xDb25uZWN0aW9uOjpSZWFkQ2xvY2soV2hpY2hDbG9jayB3aGljaF9jbG9jaykgewotICBwaW1wbF8tPnRyYWNrZXIuYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBSZWFkQ2xvY2tCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgd2hpY2hfY2xvY2spLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2VPbigmcGltcGxfLT50cmFja2VyLCAmQWNsQ29ubmVjdGlvblRyYWNrZXI6Om9uX3JlYWRfY2xvY2tfY29tcGxldGUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uaCBiL2dkL2hjaS9hY2xfbWFuYWdlci9jbGFzc2ljX2FjbF9jb25uZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTI2Y2IuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBDbGFzc2ljQWNsQ29ubmVjdGlvbiA6IHB1YmxpYyBBY2xDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIENsYXNzaWNBY2xDb25uZWN0aW9uKCk7Ci0gIENsYXNzaWNBY2xDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxRdWV1ZT4gcXVldWUsIEFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGFkZHJlc3MpOwotICB+Q2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLQotICB2aXJ0dWFsIEFkZHJlc3MgR2V0QWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzc187Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJDYWxsYmFja3MoQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotICB2aXJ0dWFsIGJvb2wgRGlzY29ubmVjdChEaXNjb25uZWN0UmVhc29uIHJlYXNvbik7Ci0gIHZpcnR1YWwgYm9vbCBDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZSh1aW50MTZfdCBwYWNrZXRfdHlwZSk7Ci0gIHZpcnR1YWwgYm9vbCBBdXRoZW50aWNhdGlvblJlcXVlc3RlZCgpOwotICB2aXJ0dWFsIGJvb2wgU2V0Q29ubmVjdGlvbkVuY3J5cHRpb24oRW5hYmxlIGVuYWJsZSk7Ci0gIHZpcnR1YWwgYm9vbCBDaGFuZ2VDb25uZWN0aW9uTGlua0tleSgpOwotICB2aXJ0dWFsIGJvb2wgUmVhZENsb2NrT2Zmc2V0KCk7Ci0gIHZpcnR1YWwgYm9vbCBIb2xkTW9kZSh1aW50MTZfdCBtYXhfaW50ZXJ2YWwsIHVpbnQxNl90IG1pbl9pbnRlcnZhbCk7Ci0gIHZpcnR1YWwgYm9vbCBTbmlmZk1vZGUodWludDE2X3QgbWF4X2ludGVydmFsLCB1aW50MTZfdCBtaW5faW50ZXJ2YWwsIHVpbnQxNl90IGF0dGVtcHQsIHVpbnQxNl90IHRpbWVvdXQpOwotICB2aXJ0dWFsIGJvb2wgRXhpdFNuaWZmTW9kZSgpOwotICB2aXJ0dWFsIGJvb2wgUW9zU2V0dXAoU2VydmljZVR5cGUgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbik7Ci0gIHZpcnR1YWwgYm9vbCBSb2xlRGlzY292ZXJ5KCk7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkTGlua1BvbGljeVNldHRpbmdzKCk7Ci0gIHZpcnR1YWwgYm9vbCBXcml0ZUxpbmtQb2xpY3lTZXR0aW5ncyh1aW50MTZfdCBsaW5rX3BvbGljeV9zZXR0aW5ncyk7Ci0gIHZpcnR1YWwgYm9vbCBGbG93U3BlY2lmaWNhdGlvbihGbG93RGlyZWN0aW9uIGZsb3dfZGlyZWN0aW9uLCBTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGFjY2Vzc19sYXRlbmN5KTsKLSAgdmlydHVhbCBib29sIFNuaWZmU3VicmF0aW5nKHVpbnQxNl90IG1heGltdW1fbGF0ZW5jeSwgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci0gIHZpcnR1YWwgYm9vbCBGbHVzaCgpOwotICB2aXJ0dWFsIGJvb2wgUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dCgpOwotICB2aXJ0dWFsIGJvb2wgV3JpdGVBdXRvbWF0aWNGbHVzaFRpbWVvdXQodWludDE2X3QgZmx1c2hfdGltZW91dCk7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkVHJhbnNtaXRQb3dlckxldmVsKFRyYW5zbWl0UG93ZXJMZXZlbFR5cGUgdHlwZSk7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCgpOwotICB2aXJ0dWFsIGJvb2wgV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KHVpbnQxNl90IGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCk7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXIoKTsKLSAgdmlydHVhbCBib29sIFJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXIoKTsKLSAgdmlydHVhbCBib29sIFJlYWRMaW5rUXVhbGl0eSgpOwotICB2aXJ0dWFsIGJvb2wgUmVhZEFmaENoYW5uZWxNYXAoKTsKLSAgdmlydHVhbCBib29sIFJlYWRSc3NpKCk7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkQ2xvY2soV2hpY2hDbG9jayB3aGljaF9jbG9jayk7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKCkgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoKTsKLSAgdmlydHVhbCBib29sIFJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKHVpbnQ4X3QgcGFnZV9udW1iZXIpOwotCi0gIC8vIENhbGxlZCBvbmNlIGJlZm9yZSBwYXNzaW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQKLSAgdmlydHVhbCBDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogR2V0RXZlbnRDYWxsYmFja3MoKTsKLQotIHByaXZhdGU6Ci0gIEFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV87Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEFkZHJlc3MgYWRkcmVzc187Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RydWN0IGltcGwqIHBpbXBsXyA9IG51bGxwdHI7Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDbGFzc2ljQWNsQ29ubmVjdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYWNsX21hbmFnZXIKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9hY2xfbWFuYWdlci9jbGFzc2ljX2ltcGwuaCBiL2dkL2hjaS9hY2xfbWFuYWdlci9jbGFzc2ljX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiYThkOC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWNsX21hbmFnZXIvY2xhc3NpY19pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9hc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvZXZlbnRfY2hlY2tlcnMuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9zZWN1cml0eV9tYW5hZ2VyX2xpc3RlbmVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc2VjdXJpdHlfbW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1zdHJ1Y3QgYWNsX2Nvbm5lY3Rpb24gewotICBhY2xfY29ubmVjdGlvbihBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIEFjbENvbm5lY3Rpb246OlF1ZXVlRG93bkVuZCogcXVldWVfZG93bl9lbmQsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgICAgOiBhc3NlbWJsZXJfKGFkZHJlc3Nfd2l0aF90eXBlLCBxdWV1ZV9kb3duX2VuZCwgaGFuZGxlciksIGFkZHJlc3Nfd2l0aF90eXBlXyhhZGRyZXNzX3dpdGhfdHlwZSkge30KLSAgfmFjbF9jb25uZWN0aW9uKCkgPSBkZWZhdWx0OwotICBzdHJ1Y3QgYWNsX21hbmFnZXI6OmFzc2VtYmxlciBhc3NlbWJsZXJfOwotICBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGVfOwotICBDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18gPSBudWxscHRyOwotfTsKLQotc3RydWN0IGNsYXNzaWNfaW1wbCA6IHB1YmxpYyBzZWN1cml0eTo6SVNlY3VyaXR5TWFuYWdlckxpc3RlbmVyIHsKLSAgY2xhc3NpY19pbXBsKAotICAgICAgSGNpTGF5ZXIqIGhjaV9sYXllciwKLSAgICAgIENvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgIFJvdW5kUm9iaW5TY2hlZHVsZXIqIHJvdW5kX3JvYmluX3NjaGVkdWxlciwKLSAgICAgIGJvb2wgY3Jhc2hfb25fdW5rbm93bl9oYW5kbGUpCi0gICAgICA6IGhjaV9sYXllcl8oaGNpX2xheWVyKSwKLSAgICAgICAgY29udHJvbGxlcl8oY29udHJvbGxlciksCi0gICAgICAgIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8ocm91bmRfcm9iaW5fc2NoZWR1bGVyKSwKLSAgICAgICAgY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKGNyYXNoX29uX3Vua25vd25faGFuZGxlKSB7Ci0gICAgaGNpX2xheWVyXyA9IGhjaV9sYXllcjsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgaGFuZGxlcl8gPSBoYW5kbGVyOwotICAgIHNob3VsZF9hY2NlcHRfY29ubmVjdGlvbl8gPSBjb21tb246OkJpbmQoW10oQWRkcmVzcywgQ2xhc3NPZkRldmljZSkgeyByZXR1cm4gdHJ1ZTsgfSk7Ci0gICAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXyA9IGhjaV9sYXllcl8tPkdldEFjbENvbm5lY3Rpb25JbnRlcmZhY2UoCi0gICAgICAgIGhhbmRsZXJfLT5CaW5kT24odGhpcywgJmNsYXNzaWNfaW1wbDo6b25fY2xhc3NpY19ldmVudCksCi0gICAgICAgIGhhbmRsZXJfLT5CaW5kT24odGhpcywgJmNsYXNzaWNfaW1wbDo6b25fY2xhc3NpY19kaXNjb25uZWN0KSwKLSAgICAgICAgaGFuZGxlcl8tPkJpbmRPbih0aGlzLCAmY2xhc3NpY19pbXBsOjpvbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uKSk7Ci0gIH0KLQotICB+Y2xhc3NpY19pbXBsKCkgewotICAgIGZvciAoYXV0byBldmVudF9jb2RlIDogQWNsQ29ubmVjdGlvbkV2ZW50cykgewotICAgICAgaGNpX2xheWVyXy0+VW5yZWdpc3RlckV2ZW50SGFuZGxlcihldmVudF9jb2RlKTsKLSAgICB9Ci0gICAgYWNsX2Nvbm5lY3Rpb25zXy5jbGVhcigpOwotICAgIHNlY3VyaXR5X21hbmFnZXJfLnJlc2V0KCk7Ci0gIH0KLQotICBDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogZ2V0X2NhbGxiYWNrcyh1aW50MTZfdCBoYW5kbGUpIHsKLSAgICBhdXRvIGNvbm4gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQoaGFuZGxlKTsKLSAgICBpZiAoY29ubiA9PSBhY2xfY29ubmVjdGlvbnNfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNvbm4tPnNlY29uZC5jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9uX2NsYXNzaWNfZXZlbnQoRXZlbnRWaWV3IGV2ZW50X3BhY2tldCkgewotICAgIEV2ZW50Q29kZSBldmVudF9jb2RlID0gZXZlbnRfcGFja2V0LkdldEV2ZW50Q29kZSgpOwotICAgIHN3aXRjaCAoZXZlbnRfY29kZSkgewotICAgICAgY2FzZSBFdmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgICAgIG9uX2Nvbm5lY3Rpb25fY29tcGxldGUoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEV2ZW50Q29kZTo6Q09OTkVDVElPTl9SRVFVRVNUOgotICAgICAgICBvbl9pbmNvbWluZ19jb25uZWN0aW9uKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFdmVudENvZGU6OkNPTk5FQ1RJT05fUEFDS0VUX1RZUEVfQ0hBTkdFRDoKLSAgICAgICAgb25fY29ubmVjdGlvbl9wYWNrZXRfdHlwZV9jaGFuZ2VkKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFdmVudENvZGU6OkFVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFOgotICAgICAgICBvbl9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZShldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRXZlbnRDb2RlOjpSRUFEX0NMT0NLX09GRlNFVF9DT01QTEVURToKLSAgICAgICAgb25fcmVhZF9jbG9ja19vZmZzZXRfY29tcGxldGUoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEV2ZW50Q29kZTo6TU9ERV9DSEFOR0U6Ci0gICAgICAgIG9uX21vZGVfY2hhbmdlKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFdmVudENvZGU6OlNOSUZGX1NVQlJBVElORzoKLSAgICAgICAgb25fc25pZmZfc3VicmF0aW5nKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFdmVudENvZGU6OlFPU19TRVRVUF9DT01QTEVURToKLSAgICAgICAgb25fcW9zX3NldHVwX2NvbXBsZXRlKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFdmVudENvZGU6OlJPTEVfQ0hBTkdFOgotICAgICAgICBvbl9yb2xlX2NoYW5nZShldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRXZlbnRDb2RlOjpGTE9XX1NQRUNJRklDQVRJT05fQ09NUExFVEU6Ci0gICAgICAgIG9uX2Zsb3dfc3BlY2lmaWNhdGlvbl9jb21wbGV0ZShldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRXZlbnRDb2RlOjpGTFVTSF9PQ0NVUlJFRDoKLSAgICAgICAgb25fZmx1c2hfb2NjdXJyZWQoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEV2ZW50Q29kZTo6UkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTX0NPTVBMRVRFOgotICAgICAgICBvbl9yZWFkX3JlbW90ZV9zdXBwb3J0ZWRfZmVhdHVyZXNfY29tcGxldGUoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEV2ZW50Q29kZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVNfQ09NUExFVEU6Ci0gICAgICAgIG9uX3JlYWRfcmVtb3RlX2V4dGVuZGVkX2ZlYXR1cmVzX2NvbXBsZXRlKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFdmVudENvZGU6OkxJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DSEFOR0VEOgotICAgICAgICBvbl9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXRfY2hhbmdlZChldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRXZlbnRDb2RlOjpDRU5UUkFMX0xJTktfS0VZX0NPTVBMRVRFOgotICAgICAgICBvbl9jZW50cmFsX2xpbmtfa2V5X2NvbXBsZXRlKGV2ZW50X3BhY2tldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5oYW5kbGVkIGV2ZW50IGNvZGUgJXMiLCBFdmVudENvZGVUZXh0KGV2ZW50X2NvZGUpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fY2xhc3NpY19kaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgRXJyb3JDb2RlIHJlYXNvbikgewotICAgIGF1dG8gY2FsbGJhY2tzID0gZ2V0X2NhbGxiYWNrcyhoYW5kbGUpOwotICAgIGlmIChjYWxsYmFja3MgIT0gbnVsbHB0cikgewotICAgICAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihoYW5kbGUpOwotICAgICAgY2FsbGJhY2tzLT5PbkRpc2Nvbm5lY3Rpb24ocmVhc29uKTsKLSAgICAgIGFjbF9jb25uZWN0aW9uc18uZXJhc2UoaGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhpcyBoYW5kbGUgaXMgcHJvYmFibHkgZm9yIFNDTywgc28gd2UgdXNlIHRoZSBjYWxsYmFjayB3b3JrYXJvdW5kLgotICAgICAgaWYgKG5vbl9hY2xfZGlzY29ubmVjdF9jYWxsYmFja18gIT0gbnVsbHB0cikgewotICAgICAgICBub25fYWNsX2Rpc2Nvbm5lY3RfY2FsbGJhY2tfKGhhbmRsZSwgc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVhc29uKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBoYW5kbGVfcmVnaXN0ZXJfY2FsbGJhY2tzKENvbm5lY3Rpb25DYWxsYmFja3MqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgICBBU1NFUlQoY2xpZW50X2NhbGxiYWNrc18gPT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGNsaWVudF9oYW5kbGVyXyA9PSBudWxscHRyKTsKLSAgICBjbGllbnRfY2FsbGJhY2tzXyA9IGNhbGxiYWNrczsKLSAgICBjbGllbnRfaGFuZGxlcl8gPSBoYW5kbGVyOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfdW5yZWdpc3Rlcl9jYWxsYmFja3MoQ29ubmVjdGlvbkNhbGxiYWNrcyogY2FsbGJhY2tzLCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIEFTU0VSVF9MT0coY2xpZW50X2NhbGxiYWNrc18gPT0gY2FsbGJhY2tzLCAiUmVnaXN0ZXJlZCBjYWxsYmFjayBlbnRpdHkgaXMgZGlmZmVyZW50IHRoZW4gdW5yZWdpc3RlciByZXF1ZXN0Iik7Ci0gICAgY2xpZW50X2NhbGxiYWNrc18gPSBudWxscHRyOwotICAgIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgb25faW5jb21pbmdfY29ubmVjdGlvbihFdmVudFZpZXcgcGFja2V0KSB7Ci0gICAgQ29ubmVjdGlvblJlcXVlc3RWaWV3IHJlcXVlc3QgPSBDb25uZWN0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIEFTU0VSVChyZXF1ZXN0LklzVmFsaWQoKSk7Ci0gICAgQWRkcmVzcyBhZGRyZXNzID0gcmVxdWVzdC5HZXRCZEFkZHIoKTsKLSAgICBpZiAoY2xpZW50X2NhbGxiYWNrc18gPT0gbnVsbHB0cikgewotICAgICAgTE9HX0VSUk9SKCJObyBjYWxsYmFja3MgdG8gY2FsbCIpOwotICAgICAgYXV0byByZWFzb24gPSBSZWplY3RDb25uZWN0aW9uUmVhc29uOjpMSU1JVEVEX1JFU09VUkNFUzsKLSAgICAgIHRoaXMtPnJlamVjdF9jb25uZWN0aW9uKFJlamVjdENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MsIHJlYXNvbikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAocmVxdWVzdC5HZXRMaW5rVHlwZSgpKSB7Ci0gICAgICBjYXNlIENvbm5lY3Rpb25SZXF1ZXN0TGlua1R5cGU6OlNDTzoKLSAgICAgICAgY2xpZW50X2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICAgICAgICBjbGllbnRfY2FsbGJhY2tzXywgJkNvbm5lY3Rpb25DYWxsYmFja3M6OkhBQ0tfT25TY29Db25uZWN0UmVxdWVzdCwgYWRkcmVzcywgcmVxdWVzdC5HZXRDbGFzc09mRGV2aWNlKCkpOwotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgQ29ubmVjdGlvblJlcXVlc3RMaW5rVHlwZTo6QUNMOgotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBDb25uZWN0aW9uUmVxdWVzdExpbmtUeXBlOjpFU0NPOgotICAgICAgICBjbGllbnRfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgICAgICAgIGNsaWVudF9jYWxsYmFja3NfLCAmQ29ubmVjdGlvbkNhbGxiYWNrczo6SEFDS19PbkVzY29Db25uZWN0UmVxdWVzdCwgYWRkcmVzcywgcmVxdWVzdC5HZXRDbGFzc09mRGV2aWNlKCkpOwotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgQ29ubmVjdGlvblJlcXVlc3RMaW5rVHlwZTo6VU5LTk9XTjoKLSAgICAgICAgTE9HX0VSUk9SKCJSZXF1ZXN0IGhhcyB1bmtub3duIENvbm5lY3Rpb25SZXF1ZXN0TGlua1R5cGUuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbmNvbWluZ19jb25uZWN0aW5nX2FkZHJlc3NfID0gYWRkcmVzczsKLSAgICBpZiAoaXNfY2xhc3NpY19saW5rX2FscmVhZHlfY29ubmVjdGVkKGFkZHJlc3MpKSB7Ci0gICAgICBhdXRvIHJlYXNvbiA9IFJlamVjdENvbm5lY3Rpb25SZWFzb246OlVOQUNDRVBUQUJMRV9CRF9BRERSOwotICAgICAgdGhpcy0+cmVqZWN0X2Nvbm5lY3Rpb24oUmVqZWN0Q29ubmVjdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcywgcmVhc29uKSk7Ci0gICAgfSBlbHNlIGlmIChzaG91bGRfYWNjZXB0X2Nvbm5lY3Rpb25fLlJ1bihhZGRyZXNzLCByZXF1ZXN0LkdldENsYXNzT2ZEZXZpY2UoKSkpIHsKLSAgICAgIHRoaXMtPmFjY2VwdF9jb25uZWN0aW9uKGFkZHJlc3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhdXRvIHJlYXNvbiA9IFJlamVjdENvbm5lY3Rpb25SZWFzb246OkxJTUlURURfUkVTT1VSQ0VTOyAgLy8gVE9ETzogZGV0ZXJtaW5lIHJlYXNvbgotICAgICAgdGhpcy0+cmVqZWN0X2Nvbm5lY3Rpb24oUmVqZWN0Q29ubmVjdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcywgcmVhc29uKSk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBpc19jbGFzc2ljX2xpbmtfYWxyZWFkeV9jb25uZWN0ZWQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjb25uZWN0aW9uIDogYWNsX2Nvbm5lY3Rpb25zXykgewotICAgICAgaWYgKGNvbm5lY3Rpb24uc2Vjb25kLmFkZHJlc3Nfd2l0aF90eXBlXy5HZXRBZGRyZXNzKCkgPT0gYWRkcmVzcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBjcmVhdGVfY29ubmVjdGlvbihBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICAvLyBUT0RPOiBDb25maWd1cmUgZGVmYXVsdCBjb25uZWN0aW9uIHBhcmFtZXRlcnM/Ci0gICAgdWludDE2X3QgcGFja2V0X3R5cGUgPSAweDQ0MDggLyogRE0gMSwzLDUgKi8gfCAweDg4MTAgLypESCAxLDMsNSAqLzsKLSAgICBQYWdlU2NhblJlcGV0aXRpb25Nb2RlIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUgPSBQYWdlU2NhblJlcGV0aXRpb25Nb2RlOjpSMTsKLSAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQgPSAwOwotICAgIENsb2NrT2Zmc2V0VmFsaWQgY2xvY2tfb2Zmc2V0X3ZhbGlkID0gQ2xvY2tPZmZzZXRWYWxpZDo6SU5WQUxJRDsKLSAgICBDcmVhdGVDb25uZWN0aW9uUm9sZVN3aXRjaCBhbGxvd19yb2xlX3N3aXRjaCA9IENyZWF0ZUNvbm5lY3Rpb25Sb2xlU3dpdGNoOjpBTExPV19ST0xFX1NXSVRDSDsKLSAgICBBU1NFUlQoY2xpZW50X2NhbGxiYWNrc18gIT0gbnVsbHB0cik7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENyZWF0ZUNvbm5lY3Rpb25CdWlsZGVyPiBwYWNrZXQgPSBDcmVhdGVDb25uZWN0aW9uQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBhZGRyZXNzLCBwYWNrZXRfdHlwZSwgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSwgY2xvY2tfb2Zmc2V0LCBjbG9ja19vZmZzZXRfdmFsaWQsIGFsbG93X3JvbGVfc3dpdGNoKTsKLQotICAgIGlmIChpbmNvbWluZ19jb25uZWN0aW5nX2FkZHJlc3NfID09IEFkZHJlc3M6OmtFbXB0eSAmJiBvdXRnb2luZ19jb25uZWN0aW5nX2FkZHJlc3NfID09IEFkZHJlc3M6OmtFbXB0eSkgewotICAgICAgaWYgKGlzX2NsYXNzaWNfbGlua19hbHJlYWR5X2Nvbm5lY3RlZChhZGRyZXNzKSkgewotICAgICAgICBMT0dfV0FSTigiYWxyZWFkeSBjb25uZWN0ZWQ6ICVzIiwgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBvdXRnb2luZ19jb25uZWN0aW5nX2FkZHJlc3NfID0gYWRkcmVzczsKLSAgICAgIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpLCBoYW5kbGVyXy0+QmluZE9uY2UoW10oQ29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7Ci0gICAgICAgIEFTU0VSVChzdGF0dXMuSXNWYWxpZCgpKTsKLSAgICAgICAgQVNTRVJUKHN0YXR1cy5HZXRDb21tYW5kT3BDb2RlKCkgPT0gT3BDb2RlOjpDUkVBVEVfQ09OTkVDVElPTik7Ci0gICAgICB9KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBlbmRpbmdfb3V0Z29pbmdfY29ubmVjdGlvbnNfLmVtcGxhY2UoYWRkcmVzcywgc3RkOjptb3ZlKHBhY2tldCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fY29ubmVjdGlvbl9jb21wbGV0ZShFdmVudFZpZXcgcGFja2V0KSB7Ci0gICAgQ29ubmVjdGlvbkNvbXBsZXRlVmlldyBjb25uZWN0aW9uX2NvbXBsZXRlID0gQ29ubmVjdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgQVNTRVJUKGNvbm5lY3Rpb25fY29tcGxldGUuSXNWYWxpZCgpKTsKLSAgICBhdXRvIHN0YXR1cyA9IGNvbm5lY3Rpb25fY29tcGxldGUuR2V0U3RhdHVzKCk7Ci0gICAgYXV0byBhZGRyZXNzID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRCZEFkZHIoKTsKLSAgICBSb2xlIGN1cnJlbnRfcm9sZSA9IFJvbGU6OkNFTlRSQUw7Ci0gICAgYm9vbCBsb2NhbGx5X2luaXRpYXRlZCA9IHRydWU7Ci0gICAgaWYgKG91dGdvaW5nX2Nvbm5lY3RpbmdfYWRkcmVzc18gPT0gYWRkcmVzcykgewotICAgICAgb3V0Z29pbmdfY29ubmVjdGluZ19hZGRyZXNzXyA9IEFkZHJlc3M6OmtFbXB0eTsKLSAgICB9IGVsc2UgewotICAgICAgbG9jYWxseV9pbml0aWF0ZWQgPSBmYWxzZTsKLSAgICAgIGlmIChpbmNvbWluZ19jb25uZWN0aW5nX2FkZHJlc3NfICE9IGFkZHJlc3MgJiYgc3RhdHVzID09IEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OKSB7Ci0gICAgICAgIExPR19XQVJOKCJObyBtYXRjaGluZyBjb25uZWN0aW9uIHRvICVzICglcykiLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgICAgICBMT0dfV0FSTigiRmlybXdhcmUgZXJyb3IgYWZ0ZXIgUmVtb3RlTmFtZVJlcXVlc3RDYW5jZWw/Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIEFTU0VSVF9MT0coaW5jb21pbmdfY29ubmVjdGluZ19hZGRyZXNzXyA9PSBhZGRyZXNzLCAiTm8gcHJpb3IgY29ubmVjdGlvbiByZXF1ZXN0IGZvciAlcyIsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGluY29taW5nX2Nvbm5lY3RpbmdfYWRkcmVzc18gPSBBZGRyZXNzOjprRW1wdHk7Ci0gICAgICBjdXJyZW50X3JvbGUgPSBSb2xlOjpQRVJJUEhFUkFMOwotICAgIH0KLSAgICBpZiAoY2xpZW50X2NhbGxiYWNrc18gPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIk5vIGNsaWVudCBjYWxsYmFja3MgcmVnaXN0ZXJlZCBmb3IgY29ubmVjdGlvbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgY2xpZW50X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJkNvbm5lY3Rpb25DYWxsYmFja3M6Ok9uQ29ubmVjdEZhaWwsIGNvbW1vbjo6VW5yZXRhaW5lZChjbGllbnRfY2FsbGJhY2tzXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBzdGF0dXMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDEwKTsKLSAgICBhdXRvIGNvbm5fcGFpciA9IGFjbF9jb25uZWN0aW9uc18uZW1wbGFjZSgKLSAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAotICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlKSwKLSAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKAotICAgICAgICAgICAgQWRkcmVzc1dpdGhUeXBle2FkZHJlc3MsIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9LCBxdWV1ZS0+R2V0RG93bkVuZCgpLCBoYW5kbGVyXykpOwotICAgIEFTU0VSVChjb25uX3BhaXIuc2Vjb25kKTsgIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGR1cGxpY2F0ZQotICAgIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpDTEFTU0lDLCBoYW5kbGUsIHF1ZXVlKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2xhc3NpY0FjbENvbm5lY3Rpb24+IGNvbm5lY3Rpb24oCi0gICAgICAgIG5ldyBDbGFzc2ljQWNsQ29ubmVjdGlvbihzdGQ6Om1vdmUocXVldWUpLCBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLCBoYW5kbGUsIGFkZHJlc3MpKTsKLSAgICBjb25uZWN0aW9uLT5sb2NhbGx5X2luaXRpYXRlZF8gPSBsb2NhbGx5X2luaXRpYXRlZDsKLSAgICBhdXRvJiBjb25uZWN0aW9uX3Byb3h5ID0gY29ubl9wYWlyLmZpcnN0LT5zZWNvbmQ7Ci0gICAgY29ubmVjdGlvbl9wcm94eS5jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXyA9IGNvbm5lY3Rpb24tPkdldEV2ZW50Q2FsbGJhY2tzKCk7Ci0gICAgaWYgKGRlbGF5ZWRfcm9sZV9jaGFuZ2VfICE9IG51bGxwdHIpIHsKLSAgICAgIGlmIChkZWxheWVkX3JvbGVfY2hhbmdlXy0+R2V0QmRBZGRyKCkgPT0gYWRkcmVzcykgewotICAgICAgICBMT0dfSU5GTygiU2VuZGluZyBkZWxheWVkIHJvbGUgY2hhbmdlIGZvciAlcyIsIGRlbGF5ZWRfcm9sZV9jaGFuZ2VfLT5HZXRCZEFkZHIoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBjb25uZWN0aW9uX3Byb3h5LmNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLT5PblJvbGVDaGFuZ2UoCi0gICAgICAgICAgICBkZWxheWVkX3JvbGVfY2hhbmdlXy0+R2V0U3RhdHVzKCksIGRlbGF5ZWRfcm9sZV9jaGFuZ2VfLT5HZXROZXdSb2xlKCkpOwotICAgICAgfQotICAgICAgZGVsYXllZF9yb2xlX2NoYW5nZV8gPSBudWxscHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25uZWN0aW9uX3Byb3h5LmNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLT5PblJvbGVDaGFuZ2UoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGN1cnJlbnRfcm9sZSk7Ci0gICAgfQotICAgIGNsaWVudF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkNvbm5lY3RTdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChjbGllbnRfY2FsbGJhY2tzXyksIHN0ZDo6bW92ZShjb25uZWN0aW9uKSkpOwotICAgIHdoaWxlICghcGVuZGluZ19vdXRnb2luZ19jb25uZWN0aW9uc18uZW1wdHkoKSkgewotICAgICAgYXV0byBjcmVhdGVfY29ubmVjdGlvbl9wYWNrZXRfYW5kX2FkZHJlc3MgPSBzdGQ6Om1vdmUocGVuZGluZ19vdXRnb2luZ19jb25uZWN0aW9uc18uZnJvbnQoKSk7Ci0gICAgICBwZW5kaW5nX291dGdvaW5nX2Nvbm5lY3Rpb25zXy5wb3AoKTsKLSAgICAgIGlmICghaXNfY2xhc3NpY19saW5rX2FscmVhZHlfY29ubmVjdGVkKGNyZWF0ZV9jb25uZWN0aW9uX3BhY2tldF9hbmRfYWRkcmVzcy5maXJzdCkpIHsKLSAgICAgICAgb3V0Z29pbmdfY29ubmVjdGluZ19hZGRyZXNzXyA9IGNyZWF0ZV9jb25uZWN0aW9uX3BhY2tldF9hbmRfYWRkcmVzcy5maXJzdDsKLSAgICAgICAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKGNyZWF0ZV9jb25uZWN0aW9uX3BhY2tldF9hbmRfYWRkcmVzcy5zZWNvbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2UoW10oQ29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHN0YXR1cy5Jc1ZhbGlkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChzdGF0dXMuR2V0Q29tbWFuZE9wQ29kZSgpID09IE9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fY29ubmVjdGlvbl9wYWNrZXRfdHlwZV9jaGFuZ2VkKEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgICBDb25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWRWaWV3IHBhY2tldF90eXBlX2NoYW5nZWQgPSBDb25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBpZiAoIXBhY2tldF90eXBlX2NoYW5nZWQuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX2Nvbm5lY3Rpb25fcGFja2V0X3R5cGVfY2hhbmdlZCB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChwYWNrZXRfdHlwZV9jaGFuZ2VkLkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBwYWNrZXRfdHlwZV9jaGFuZ2VkLkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fY29ubmVjdGlvbl9wYWNrZXRfdHlwZV9jaGFuZ2VkIHdpdGggZXJyb3IgY29kZSAlcyIsIGVycm9yX2NvZGUuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQxNl90IGhhbmRsZSA9IHBhY2tldF90eXBlX2NoYW5nZWQuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgIGF1dG8gY2FsbGJhY2tzID0gZ2V0X2NhbGxiYWNrcyhoYW5kbGUpOwotICAgIGlmIChjYWxsYmFja3MgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIlVua25vd24gY29ubmVjdGlvbiBoYW5kbGUgMHglMDRoeCIsIGhhbmRsZSk7Ci0gICAgICBBU1NFUlQoIWNyYXNoX29uX3Vua25vd25faGFuZGxlXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIFdlIGRvbid0IGhhbmRsZSB0aGlzIGV2ZW50OyB3ZSBkaWRuJ3QgZG8gdGhpcyBpbiBsZWdhY3kgc3RhY2sgZWl0aGVyLgotICB9Ci0KLSAgdm9pZCBvbl9jZW50cmFsX2xpbmtfa2V5X2NvbXBsZXRlKEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgICBDZW50cmFsTGlua0tleUNvbXBsZXRlVmlldyBjb21wbGV0ZV92aWV3ID0gQ2VudHJhbExpbmtLZXlDb21wbGV0ZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIGlmICghY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fY2VudHJhbF9saW5rX2tleV9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fY2VudHJhbF9saW5rX2tleV9jb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvcl9jb2RlLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBjb21wbGV0ZV92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBLZXlGbGFnIGtleV9mbGFnID0gY29tcGxldGVfdmlldy5HZXRLZXlGbGFnKCk7Ci0gICAgY2FsbGJhY2tzLT5PbkNlbnRyYWxMaW5rS2V5Q29tcGxldGUoa2V5X2ZsYWcpOwotICB9Ci0KLSAgdm9pZCBvbl9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZShFdmVudFZpZXcgcGFja2V0KSB7Ci0gICAgQXV0aGVudGljYXRpb25Db21wbGV0ZVZpZXcgYXV0aGVudGljYXRpb25fY29tcGxldGUgPSBBdXRoZW50aWNhdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgaWYgKCFhdXRoZW50aWNhdGlvbl9jb21wbGV0ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fYXV0aGVudGljYXRpb25fY29tcGxldGUgd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBhdXRoZW50aWNhdGlvbl9jb21wbGV0ZS5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfV0FSTigiVW5rbm93biBjb25uZWN0aW9uIGhhbmRsZSAweCUwNGh4IiwgaGFuZGxlKTsKLSAgICAgIEFTU0VSVCghY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FsbGJhY2tzLT5PbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoYXV0aGVudGljYXRpb25fY29tcGxldGUuR2V0U3RhdHVzKCkpOwotICB9Ci0KLSAgdm9pZCBjYW5jZWxfY29ubmVjdChBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBpZiAob3V0Z29pbmdfY29ubmVjdGluZ19hZGRyZXNzXyA9PSBhZGRyZXNzKSB7Ci0gICAgICBMT0dfSU5GTygiQ2Fubm90IGNhbmNlbCBub24tZXhpc3RlbnQgY29ubmVjdGlvbiB0byAlcyIsIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENyZWF0ZUNvbm5lY3Rpb25DYW5jZWxCdWlsZGVyPiBwYWNrZXQgPSBDcmVhdGVDb25uZWN0aW9uQ2FuY2VsQnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MpOwotICAgIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUocGFja2V0KSwgaGFuZGxlcl8tPkJpbmRPbmNlKCZjaGVja19jb21tYW5kX2NvbXBsZXRlPENyZWF0ZUNvbm5lY3Rpb25DYW5jZWxDb21wbGV0ZVZpZXc+KSk7Ci0gIH0KLQotICB2b2lkIGNlbnRyYWxfbGlua19rZXkoS2V5RmxhZyBrZXlfZmxhZykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDZW50cmFsTGlua0tleUJ1aWxkZXI+IHBhY2tldCA9IENlbnRyYWxMaW5rS2V5QnVpbGRlcjo6Q3JlYXRlKGtleV9mbGFnKTsKLSAgICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgc3RkOjptb3ZlKHBhY2tldCksIGhhbmRsZXJfLT5CaW5kT25jZSgmY2hlY2tfY29tbWFuZF9zdGF0dXM8Q2VudHJhbExpbmtLZXlTdGF0dXNWaWV3PikpOwotICB9Ci0KLSAgdm9pZCBzd2l0Y2hfcm9sZShBZGRyZXNzIGFkZHJlc3MsIFJvbGUgcm9sZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxTd2l0Y2hSb2xlQnVpbGRlcj4gcGFja2V0ID0gU3dpdGNoUm9sZUJ1aWxkZXI6OkNyZWF0ZShhZGRyZXNzLCByb2xlKTsKLSAgICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPFN3aXRjaFJvbGVTdGF0dXNWaWV3PikpOwotICB9Ci0KLSAgdm9pZCB3cml0ZV9kZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzKHVpbnQxNl90IGRlZmF1bHRfbGlua19wb2xpY3lfc2V0dGluZ3MpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzQnVpbGRlcj4gcGFja2V0ID0KLSAgICAgICAgV3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzQnVpbGRlcjo6Q3JlYXRlKGRlZmF1bHRfbGlua19wb2xpY3lfc2V0dGluZ3MpOwotICAgIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUocGFja2V0KSwgaGFuZGxlcl8tPkJpbmRPbmNlKCZjaGVja19jb21tYW5kX2NvbXBsZXRlPFdyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlVmlldz4pKTsKLSAgfQotCi0gIHZvaWQgYWNjZXB0X2Nvbm5lY3Rpb24oQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgYXV0byByb2xlID0gQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlOjpCRUNPTUVfQ0VOVFJBTDsgIC8vIFdlIHByZWZlciB0byBiZSBjZW50cmFsCi0gICAgYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIEFjY2VwdENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MsIHJvbGUpLAotICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmY2xhc3NpY19pbXBsOjpvbl9hY2NlcHRfY29ubmVjdGlvbl9zdGF0dXMsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgb25fY2hhbmdlX2Nvbm5lY3Rpb25fbGlua19rZXlfY29tcGxldGUoRXZlbnRWaWV3IHBhY2tldCkgewotICAgIENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGVWaWV3IGNvbXBsZXRlX3ZpZXcgPSBDaGFuZ2VDb25uZWN0aW9uTGlua0tleUNvbXBsZXRlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9jaGFuZ2VfY29ubmVjdGlvbl9saW5rX2tleV9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fY2hhbmdlX2Nvbm5lY3Rpb25fbGlua19rZXlfY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDE2X3QgaGFuZGxlID0gY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfV0FSTigiVW5rbm93biBjb25uZWN0aW9uIGhhbmRsZSAweCUwNGh4IiwgaGFuZGxlKTsKLSAgICAgIEFTU0VSVCghY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FsbGJhY2tzLT5PbkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGUoKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9jbG9ja19vZmZzZXRfY29tcGxldGUoRXZlbnRWaWV3IHBhY2tldCkgewotICAgIFJlYWRDbG9ja09mZnNldENvbXBsZXRlVmlldyBjb21wbGV0ZV92aWV3ID0gUmVhZENsb2NrT2Zmc2V0Q29tcGxldGVWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBpZiAoIWNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3JlYWRfY2xvY2tfb2Zmc2V0X2NvbXBsZXRlIHdpdGggaW52YWxpZCBwYWNrZXQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9yZWFkX2Nsb2NrX29mZnNldF9jb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvcl9jb2RlLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBjb21wbGV0ZV92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQgPSBjb21wbGV0ZV92aWV3LkdldENsb2NrT2Zmc2V0KCk7Ci0gICAgY2FsbGJhY2tzLT5PblJlYWRDbG9ja09mZnNldENvbXBsZXRlKGNsb2NrX29mZnNldCk7Ci0gIH0KLQotICB2b2lkIG9uX21vZGVfY2hhbmdlKEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgICBNb2RlQ2hhbmdlVmlldyBtb2RlX2NoYW5nZV92aWV3ID0gTW9kZUNoYW5nZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIGlmICghbW9kZV9jaGFuZ2Vfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fbW9kZV9jaGFuZ2Ugd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBtb2RlX2NoYW5nZV92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYWxsYmFja3MtPk9uTW9kZUNoYW5nZSgKLSAgICAgICAgbW9kZV9jaGFuZ2Vfdmlldy5HZXRTdGF0dXMoKSwgbW9kZV9jaGFuZ2Vfdmlldy5HZXRDdXJyZW50TW9kZSgpLCBtb2RlX2NoYW5nZV92aWV3LkdldEludGVydmFsKCkpOwotICB9Ci0KLSAgdm9pZCBvbl9zbmlmZl9zdWJyYXRpbmcoRXZlbnRWaWV3IHBhY2tldCkgewotICAgIFNuaWZmU3VicmF0aW5nRXZlbnRWaWV3IHNuaWZmX3N1YnJhdGluZ192aWV3ID0gU25pZmZTdWJyYXRpbmdFdmVudFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIGlmICghc25pZmZfc3VicmF0aW5nX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3NuaWZmX3N1YnJhdGluZyB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQxNl90IGhhbmRsZSA9IHNuaWZmX3N1YnJhdGluZ192aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYWxsYmFja3MtPk9uU25pZmZTdWJyYXRpbmcoCi0gICAgICAgIHNuaWZmX3N1YnJhdGluZ192aWV3LkdldFN0YXR1cygpLAotICAgICAgICBzbmlmZl9zdWJyYXRpbmdfdmlldy5HZXRNYXhpbXVtVHJhbnNtaXRMYXRlbmN5KCksCi0gICAgICAgIHNuaWZmX3N1YnJhdGluZ192aWV3LkdldE1heGltdW1SZWNlaXZlTGF0ZW5jeSgpLAotICAgICAgICBzbmlmZl9zdWJyYXRpbmdfdmlldy5HZXRNaW5pbXVtUmVtb3RlVGltZW91dCgpLAotICAgICAgICBzbmlmZl9zdWJyYXRpbmdfdmlldy5HZXRNaW5pbXVtTG9jYWxUaW1lb3V0KCkpOwotICB9Ci0KLSAgdm9pZCBvbl9xb3Nfc2V0dXBfY29tcGxldGUoRXZlbnRWaWV3IHBhY2tldCkgewotICAgIFFvc1NldHVwQ29tcGxldGVWaWV3IGNvbXBsZXRlX3ZpZXcgPSBRb3NTZXR1cENvbXBsZXRlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9xb3Nfc2V0dXBfY29tcGxldGUgd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIGF1dG8gc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX2NvZGUgPSBFcnJvckNvZGVUZXh0KHN0YXR1cyk7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX3Fvc19zZXR1cF9jb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvcl9jb2RlLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBjb21wbGV0ZV92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUgPSBjb21wbGV0ZV92aWV3LkdldFNlcnZpY2VUeXBlKCk7Ci0gICAgdWludDMyX3QgdG9rZW5fcmF0ZSA9IGNvbXBsZXRlX3ZpZXcuR2V0VG9rZW5SYXRlKCk7Ci0gICAgdWludDMyX3QgcGVha19iYW5kd2lkdGggPSBjb21wbGV0ZV92aWV3LkdldFBlYWtCYW5kd2lkdGgoKTsKLSAgICB1aW50MzJfdCBsYXRlbmN5ID0gY29tcGxldGVfdmlldy5HZXRMYXRlbmN5KCk7Ci0gICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uID0gY29tcGxldGVfdmlldy5HZXREZWxheVZhcmlhdGlvbigpOwotICAgIGNhbGxiYWNrcy0+T25Rb3NTZXR1cENvbXBsZXRlKHNlcnZpY2VfdHlwZSwgdG9rZW5fcmF0ZSwgcGVha19iYW5kd2lkdGgsIGxhdGVuY3ksIGRlbGF5X3ZhcmlhdGlvbik7Ci0gIH0KLQotICB2b2lkIG9uX3JvbGVfY2hhbmdlKEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgICBSb2xlQ2hhbmdlVmlldyByb2xlX2NoYW5nZV92aWV3ID0gUm9sZUNoYW5nZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIGlmICghcm9sZV9jaGFuZ2Vfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fcm9sZV9jaGFuZ2Ugd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBib29sIHNlbnQgPSBmYWxzZTsKLSAgICBhdXRvIGhjaV9zdGF0dXMgPSByb2xlX2NoYW5nZV92aWV3LkdldFN0YXR1cygpOwotICAgIEFkZHJlc3MgYmRfYWRkciA9IHJvbGVfY2hhbmdlX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgUm9sZSBuZXdfcm9sZSA9IHJvbGVfY2hhbmdlX3ZpZXcuR2V0TmV3Um9sZSgpOwotICAgIGZvciAoYXV0byYgY29ubmVjdGlvbl9wYWlyIDogYWNsX2Nvbm5lY3Rpb25zXykgewotICAgICAgaWYgKGNvbm5lY3Rpb25fcGFpci5zZWNvbmQuYWRkcmVzc193aXRoX3R5cGVfLkdldEFkZHJlc3MoKSA9PSBiZF9hZGRyKSB7Ci0gICAgICAgIGNvbm5lY3Rpb25fcGFpci5zZWNvbmQuY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18tPk9uUm9sZUNoYW5nZShoY2lfc3RhdHVzLCBuZXdfcm9sZSk7Ci0gICAgICAgIHNlbnQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIXNlbnQpIHsKLSAgICAgIGlmIChkZWxheWVkX3JvbGVfY2hhbmdlXyAhPSBudWxscHRyKSB7Ci0gICAgICAgIExPR19XQVJOKCJTZWNvbmQgZGVsYXllZCByb2xlIGNoYW5nZSAoQCVzIGRyb3BwZWQpIiwgZGVsYXllZF9yb2xlX2NoYW5nZV8tPkdldEJkQWRkcigpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICAiUm9sZSBjaGFuZ2UgZm9yICVzIHdpdGggbm8gbWF0Y2hpbmcgY29ubmVjdGlvbiAobmV3IHJvbGU6ICVzKSIsCi0gICAgICAgICAgcm9sZV9jaGFuZ2Vfdmlldy5HZXRCZEFkZHIoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgUm9sZVRleHQocm9sZV9jaGFuZ2Vfdmlldy5HZXROZXdSb2xlKCkpLmNfc3RyKCkpOwotICAgICAgZGVsYXllZF9yb2xlX2NoYW5nZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFJvbGVDaGFuZ2VWaWV3Pihyb2xlX2NoYW5nZV92aWV3KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9uX2Zsb3dfc3BlY2lmaWNhdGlvbl9jb21wbGV0ZShFdmVudFZpZXcgcGFja2V0KSB7Ci0gICAgRmxvd1NwZWNpZmljYXRpb25Db21wbGV0ZVZpZXcgY29tcGxldGVfdmlldyA9IEZsb3dTcGVjaWZpY2F0aW9uQ29tcGxldGVWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBpZiAoIWNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG9uX2Zsb3dfc3BlY2lmaWNhdGlvbl9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgYXV0byBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fZmxvd19zcGVjaWZpY2F0aW9uX2NvbXBsZXRlIHdpdGggZXJyb3IgY29kZSAlcyIsIGVycm9yX2NvZGUuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQxNl90IGhhbmRsZSA9IGNvbXBsZXRlX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgIGF1dG8gY2FsbGJhY2tzID0gZ2V0X2NhbGxiYWNrcyhoYW5kbGUpOwotICAgIGlmIChjYWxsYmFja3MgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIlVua25vd24gY29ubmVjdGlvbiBoYW5kbGUgMHglMDRoeCIsIGhhbmRsZSk7Ci0gICAgICBBU1NFUlQoIWNyYXNoX29uX3Vua25vd25faGFuZGxlXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEZsb3dEaXJlY3Rpb24gZmxvd19kaXJlY3Rpb24gPSBjb21wbGV0ZV92aWV3LkdldEZsb3dEaXJlY3Rpb24oKTsKLSAgICBTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUgPSBjb21wbGV0ZV92aWV3LkdldFNlcnZpY2VUeXBlKCk7Ci0gICAgdWludDMyX3QgdG9rZW5fcmF0ZSA9IGNvbXBsZXRlX3ZpZXcuR2V0VG9rZW5SYXRlKCk7Ci0gICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUgPSBjb21wbGV0ZV92aWV3LkdldFRva2VuQnVja2V0U2l6ZSgpOwotICAgIHVpbnQzMl90IHBlYWtfYmFuZHdpZHRoID0gY29tcGxldGVfdmlldy5HZXRQZWFrQmFuZHdpZHRoKCk7Ci0gICAgdWludDMyX3QgYWNjZXNzX2xhdGVuY3kgPSBjb21wbGV0ZV92aWV3LkdldEFjY2Vzc0xhdGVuY3koKTsKLSAgICBjYWxsYmFja3MtPk9uRmxvd1NwZWNpZmljYXRpb25Db21wbGV0ZSgKLSAgICAgICAgZmxvd19kaXJlY3Rpb24sIHNlcnZpY2VfdHlwZSwgdG9rZW5fcmF0ZSwgdG9rZW5fYnVja2V0X3NpemUsIHBlYWtfYmFuZHdpZHRoLCBhY2Nlc3NfbGF0ZW5jeSk7Ci0gIH0KLQotICB2b2lkIG9uX2ZsdXNoX29jY3VycmVkKEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgICBGbHVzaE9jY3VycmVkVmlldyBmbHVzaF9vY2N1cnJlZF92aWV3ID0gRmx1c2hPY2N1cnJlZFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIGlmICghZmx1c2hfb2NjdXJyZWRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fZmx1c2hfb2NjdXJyZWQgd2l0aCBpbnZhbGlkIHBhY2tldCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBmbHVzaF9vY2N1cnJlZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYWxsYmFja3MtPk9uRmx1c2hPY2N1cnJlZCgpOwotICB9Ci0KLSAgdm9pZCBvbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IHZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbikgewotICAgIGF1dG8gY2FsbGJhY2tzID0gZ2V0X2NhbGxiYWNrcyhoYW5kbGUpOwotICAgIGlmIChjYWxsYmFja3MgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIlVua25vd24gY29ubmVjdGlvbiBoYW5kbGUgMHglMDRoeCIsIGhhbmRsZSk7Ci0gICAgICBBU1NFUlQoIWNyYXNoX29uX3Vua25vd25faGFuZGxlXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhbGxiYWNrcy0+T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUoaGNpX3N0YXR1cywgdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9yZW1vdGVfc3VwcG9ydGVkX2ZlYXR1cmVzX2NvbXBsZXRlKEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgICBhdXRvIHZpZXcgPSBSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXNDb21wbGV0ZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIEFTU0VSVF9MT0codmlldy5Jc1ZhbGlkKCksICJSZWFkIHJlbW90ZSBzdXBwb3J0ZWQgZmVhdHVyZXMgcGFja2V0IGludmFsaWQiKTsKLSAgICB1aW50MTZfdCBoYW5kbGUgPSB2aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYWxsYmFja3MtPk9uUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGUodmlldy5HZXRMbXBGZWF0dXJlcygpKTsKLSAgfQotCi0gIHZvaWQgb25fcmVhZF9yZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZXNfY29tcGxldGUoRXZlbnRWaWV3IHBhY2tldCkgewotICAgIGF1dG8gdmlldyA9IFJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzQ29tcGxldGVWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfTE9HKHZpZXcuSXNWYWxpZCgpLCAiUmVhZCByZW1vdGUgZXh0ZW5kZWQgZmVhdHVyZXMgcGFja2V0IGludmFsaWQiKTsKLSAgICB1aW50MTZfdCBoYW5kbGUgPSB2aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGNvbm5lY3Rpb24gaGFuZGxlIDB4JTA0aHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYWxsYmFja3MtPk9uUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZSgKLSAgICAgICAgdmlldy5HZXRQYWdlTnVtYmVyKCksIHZpZXcuR2V0TWF4aW11bVBhZ2VOdW1iZXIoKSwgdmlldy5HZXRFeHRlbmRlZExtcEZlYXR1cmVzKCkpOwotICB9Ci0KLSAgdm9pZCBvbl9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXRfY2hhbmdlZChFdmVudFZpZXcgcGFja2V0KSB7Ci0gICAgYXV0byB2aWV3ID0gTGlua1N1cGVydmlzaW9uVGltZW91dENoYW5nZWRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfTE9HKHZpZXcuSXNWYWxpZCgpLCAiTGluayBzdXBlcnZpc2lvbiB0aW1lb3V0IGNoYW5nZWQgcGFja2V0IGludmFsaWQiKTsKLSAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCBjYWxsZWQiKTsKLSAgfQotCi0gIHZvaWQgb25fYWNjZXB0X2Nvbm5lY3Rpb25fc3RhdHVzKEFkZHJlc3MgYWRkcmVzcywgQ29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7Ci0gICAgYXV0byBhY2NlcHRfc3RhdHVzID0gQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RTdGF0dXNWaWV3OjpDcmVhdGUoc3RhdHVzKTsKLSAgICBBU1NFUlQoYWNjZXB0X3N0YXR1cy5Jc1ZhbGlkKCkpOwotICAgIGlmIChzdGF0dXMuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBjYW5jZWxfY29ubmVjdChhZGRyZXNzKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlamVjdF9jb25uZWN0aW9uKHN0ZDo6dW5pcXVlX3B0cjxSZWplY3RDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXI+IGJ1aWxkZXIpIHsKLSAgICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgc3RkOjptb3ZlKGJ1aWxkZXIpLCBoYW5kbGVyXy0+QmluZE9uY2UoJmNoZWNrX2NvbW1hbmRfc3RhdHVzPFJlamVjdENvbm5lY3Rpb25SZXF1ZXN0U3RhdHVzVmlldz4pKTsKLSAgfQotCi0gIHZvaWQgT25EZXZpY2VCb25kZWQoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25EZXZpY2VVbmJvbmRlZChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgb3ZlcnJpZGUge30KLSAgdm9pZCBPbkRldmljZUJvbmRGYWlsZWQoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIHNlY3VyaXR5OjpQYWlyaW5nRmFpbHVyZSBzdGF0dXMpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBPbkVuY3J5cHRpb25TdGF0ZUNoYW5nZWQoRW5jcnlwdGlvbkNoYW5nZVZpZXcgZW5jcnlwdGlvbl9jaGFuZ2Vfdmlldykgb3ZlcnJpZGUgewotICAgIGlmICghZW5jcnlwdGlvbl9jaGFuZ2Vfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiSW52YWxpZCBwYWNrZXQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX0VSUk9SKCJlcnJvcl9jb2RlICVzIiwgZXJyb3JfY29kZS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDE2X3QgaGFuZGxlID0gZW5jcnlwdGlvbl9jaGFuZ2Vfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfV0FSTigiVW5rbm93biBjb25uZWN0aW9uIGhhbmRsZSAweCUwNGh4IiwgaGFuZGxlKTsKLSAgICAgIEFTU0VSVCghY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW5jcnlwdGlvbkVuYWJsZWQgZW5hYmxlZCA9IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuR2V0RW5jcnlwdGlvbkVuYWJsZWQoKTsKLSAgICBjYWxsYmFja3MtPk9uRW5jcnlwdGlvbkNoYW5nZShlbmFibGVkKTsKLSAgfQotCi0gIHZvaWQgc2V0X3NlY3VyaXR5X21vZHVsZShzZWN1cml0eTo6U2VjdXJpdHlNb2R1bGUqIHNlY3VyaXR5X21vZHVsZSkgewotICAgIHNlY3VyaXR5X21hbmFnZXJfID0gc2VjdXJpdHlfbW9kdWxlLT5HZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICBzZWN1cml0eV9tYW5hZ2VyXy0+UmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKHRoaXMsIGhhbmRsZXJfKTsKLSAgfQotCi0gIHVpbnQxNl90IEhBQ0tfZ2V0X2hhbmRsZShBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBhY2xfY29ubmVjdGlvbnNfLmJlZ2luKCk7IGl0ICE9IGFjbF9jb25uZWN0aW9uc18uZW5kKCk7IGl0KyspIHsKLSAgICAgIGlmIChpdC0+c2Vjb25kLmFkZHJlc3Nfd2l0aF90eXBlXy5HZXRBZGRyZXNzKCkgPT0gYWRkcmVzcykgewotICAgICAgICByZXR1cm4gaXQtPmZpcnN0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMHhGRkZGOwotICB9Ci0KLSAgdm9pZCBIQUNLX1NldE5vbkFjbERpc2Nvbm5lY3RDYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QsIHVpbnQ4X3QpPiBjYWxsYmFjaykgewotICAgIG5vbl9hY2xfZGlzY29ubmVjdF9jYWxsYmFja18gPSBjYWxsYmFjazsKLSAgfQotCi0gIEhjaUxheWVyKiBoY2lfbGF5ZXJfID0gbnVsbHB0cjsKLSAgQ29udHJvbGxlciogY29udHJvbGxlcl8gPSBudWxscHRyOwotICBSb3VuZFJvYmluU2NoZWR1bGVyKiByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfID0gbnVsbHB0cjsKLSAgQWNsQ29ubmVjdGlvbkludGVyZmFjZSogYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXyA9IG51bGxwdHI7Ci0gIENvbm5lY3Rpb25DYWxsYmFja3MqIGNsaWVudF9jYWxsYmFja3NfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6bWFwPHVpbnQxNl90LCBhY2xfY29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb25zXzsKLSAgQWRkcmVzcyBvdXRnb2luZ19jb25uZWN0aW5nX2FkZHJlc3Nfe0FkZHJlc3M6OmtFbXB0eX07Ci0gIEFkZHJlc3MgaW5jb21pbmdfY29ubmVjdGluZ19hZGRyZXNzX3tBZGRyZXNzOjprRW1wdHl9OwotICBjb21tb246OkNhbGxiYWNrPGJvb2woQWRkcmVzcywgQ2xhc3NPZkRldmljZSk+IHNob3VsZF9hY2NlcHRfY29ubmVjdGlvbl87Ci0gIHN0ZDo6cXVldWU8c3RkOjpwYWlyPEFkZHJlc3MsIHN0ZDo6dW5pcXVlX3B0cjxDcmVhdGVDb25uZWN0aW9uQnVpbGRlcj4+PiBwZW5kaW5nX291dGdvaW5nX2Nvbm5lY3Rpb25zXzsKLSAgc3RkOjp1bmlxdWVfcHRyPFJvbGVDaGFuZ2VWaWV3PiBkZWxheWVkX3JvbGVfY2hhbmdlXyA9IG51bGxwdHI7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPHNlY3VyaXR5OjpTZWN1cml0eU1hbmFnZXI+IHNlY3VyaXR5X21hbmFnZXJfOwotICBib29sIGNyYXNoX29uX3Vua25vd25faGFuZGxlXyA9IGZhbHNlOwotCi0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCwgdWludDhfdCk+IG5vbl9hY2xfZGlzY29ubmVjdF9jYWxsYmFja187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYWNsX21hbmFnZXIKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX2NhbGxiYWNrcy5oIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzI2NTQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvY2xhc3NpY19hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2NsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBhY2xfbWFuYWdlciB7Ci0KLWNsYXNzIENvbm5lY3Rpb25DYWxsYmFja3MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q29ubmVjdGlvbkNhbGxiYWNrcygpID0gZGVmYXVsdDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgQ29ubmVjdGlvbiBDb21wbGV0ZSBldmVudCB3aXRoIFN1Y2Nlc3MgZXJyb3IgY29kZQotICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0U3VjY2VzcyhzdGQ6OnVuaXF1ZV9wdHI8Q2xhc3NpY0FjbENvbm5lY3Rpb24+KSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIENvbm5lY3Rpb24gQ29tcGxldGUgZXZlbnQgd2l0aCBub24tU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPbkNvbm5lY3RGYWlsKEFkZHJlc3MsIEVycm9yQ29kZSByZWFzb24pID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgSEFDS19PbkVzY29Db25uZWN0UmVxdWVzdChBZGRyZXNzLCBDbGFzc09mRGV2aWNlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBIQUNLX09uU2NvQ29ubmVjdFJlcXVlc3QoQWRkcmVzcywgQ2xhc3NPZkRldmljZSkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFjbF9tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIvY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcy5oIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyZWVhMi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWNsX21hbmFnZXIvY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBhY2xfbWFuYWdlciB7Ci0KLWNsYXNzIENvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBDb25uZWN0aW9uIFBhY2tldCBUeXBlIENoYW5nZWQgZXZlbnQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvblBhY2tldFR5cGVDaGFuZ2VkKHVpbnQxNl90IHBhY2tldF90eXBlKSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlIGV2ZW50IHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cykgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBFbmNyeXB0aW9uIENoYW5nZSBldmVudCB3aXRoIFN1Y2Nlc3MgZXJyb3IgY29kZQotICB2aXJ0dWFsIHZvaWQgT25FbmNyeXB0aW9uQ2hhbmdlKEVuY3J5cHRpb25FbmFibGVkIGVuYWJsZWQpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgQ2hhbmdlIENvbm5lY3Rpb24gTGluayBLZXkgQ29tcGxldGUgZXZlbnQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZSgpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgUmVhZCBDbG9jayBPZmZzZXQgQ29tcGxldGUgZXZlbnQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZENsb2NrT2Zmc2V0Q29tcGxldGUodWludDE2X3QgY2xvY2tfb2Zmc2V0KSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIE1vZGUgQ2hhbmdlIGV2ZW50IHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPbk1vZGVDaGFuZ2UoRXJyb3JDb2RlIHN0YXR1cywgTW9kZSBjdXJyZW50X21vZGUsIHVpbnQxNl90IGludGVydmFsKSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIFNuaWZmIFN1YnJhdGluZyBldmVudCB3aXRoIFN1Y2Nlc3MgZXJyb3IgY29kZQotICB2aXJ0dWFsIHZvaWQgT25TbmlmZlN1YnJhdGluZygKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgUW9TIFNldHVwIENvbXBsZXRlIGV2ZW50IHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPblFvc1NldHVwQ29tcGxldGUoU2VydmljZVR5cGUgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5LCB1aW50MzJfdCBkZWxheV92YXJpYXRpb24pID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgRmxvdyBTcGVjaWZpY2F0aW9uIENvbXBsZXRlIGV2ZW50IHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPbkZsb3dTcGVjaWZpY2F0aW9uQ29tcGxldGUoRmxvd0RpcmVjdGlvbiBmbG93X2RpcmVjdGlvbiwgU2VydmljZVR5cGUgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRva2VuX2J1Y2tldF9zaXplLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY2Nlc3NfbGF0ZW5jeSkgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBGbHVzaCBPY2N1cnJlZCBldmVudAotICB2aXJ0dWFsIHZvaWQgT25GbHVzaE9jY3VycmVkKCkgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBDb21tYW5kIENvbXBsZXRlIGV2ZW50IGZvciBSb2xlIERpc2NvdmVyeSBjb21tYW5kIHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPblJvbGVEaXNjb3ZlcnlDb21wbGV0ZShSb2xlIGN1cnJlbnRfcm9sZSkgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBDb21tYW5kIENvbXBsZXRlIGV2ZW50IGZvciBSZWFkIExpbmsgUG9saWN5IFNldHRpbmdzIGNvbW1hbmQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlKHVpbnQxNl90IGxpbmtfcG9saWN5X3NldHRpbmdzKSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgZm9yIFJlYWQgQXV0b21hdGljIEZsdXNoIFRpbWVvdXQgY29tbWFuZCB3aXRoIFN1Y2Nlc3MgZXJyb3IKLSAgLy8gY29kZQotICB2aXJ0dWFsIHZvaWQgT25SZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGUodWludDE2X3QgZmx1c2hfdGltZW91dCkgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBDb21tYW5kIENvbXBsZXRlIGV2ZW50IGZvciBSZWFkIFRyYW5zbWl0IFBvd2VyIExldmVsIGNvbW1hbmQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZFRyYW5zbWl0UG93ZXJMZXZlbENvbXBsZXRlKHVpbnQ4X3QgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgQ29tbWFuZCBDb21wbGV0ZSBldmVudCBmb3IgUmVhZCBMaW5rIFN1cGVydmlzaW9uIFRpbWUgb3V0IGNvbW1hbmQgd2l0aCBTdWNjZXNzIGVycm9yCi0gIC8vIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXRDb21wbGV0ZSh1aW50MTZfdCBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgQ29tbWFuZCBDb21wbGV0ZSBldmVudCBmb3IgUmVhZCBGYWlsZWQgQ29udGFjdCBDb3VudGVyIGNvbW1hbmQgd2l0aCBTdWNjZXNzIGVycm9yCi0gIC8vIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyQ29tcGxldGUodWludDE2X3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcikgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBDb21tYW5kIENvbXBsZXRlIGV2ZW50IGZvciBSZWFkIExpbmsgUXVhbGl0eSBjb21tYW5kIHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPblJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlKHVpbnQ4X3QgbGlua19xdWFsaXR5KSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIENvbW1hbmQgQ29tcGxldGUgZXZlbnQgZm9yIFJlYWQgQUZIIENoYW5uZWwgTWFwIGNvbW1hbmQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZEFmaENoYW5uZWxNYXBDb21wbGV0ZShBZmhNb2RlIGFmaF9tb2RlLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDEwPiBhZmhfY2hhbm5lbF9tYXApID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgQ29tbWFuZCBDb21wbGV0ZSBldmVudCBmb3IgUmVhZCBSU1NJIGNvbW1hbmQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZFJzc2lDb21wbGV0ZSh1aW50OF90IHJzc2kpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgQ29tbWFuZCBDb21wbGV0ZSBldmVudCBmb3IgUmVhZCBDbG9jayBjb21tYW5kIHdpdGggU3VjY2VzcyBlcnJvciBjb2RlCi0gIHZpcnR1YWwgdm9pZCBPblJlYWRDbG9ja0NvbXBsZXRlKHVpbnQzMl90IGNsb2NrLCB1aW50MTZfdCBhY2N1cmFjeSkgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBDZW50cmFsIExpbmsgS2V5IENvbXBsZXRlIGV2ZW50Ci0gIHZpcnR1YWwgdm9pZCBPbkNlbnRyYWxMaW5rS2V5Q29tcGxldGUoS2V5RmxhZyBrZXlfZmxhZykgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBSb2xlIENoYW5nZSBldmVudAotICB2aXJ0dWFsIHZvaWQgT25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIFJvbGUgbmV3X3JvbGUpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgRGlzY29ubmVjdENvbXBsZXRlCi0gIHZpcnR1YWwgdm9pZCBPbkRpc2Nvbm5lY3Rpb24oRXJyb3JDb2RlIHJlYXNvbikgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBSZWFkIFJlbW90ZSBWZXJzaW9uIEluZm9ybWF0aW9uIENvbXBsZXRlCi0gIHZpcnR1YWwgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSgKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbikgPSAwOwotICAvLyBJbnZva2VkIHdoZW4gY29udHJvbGxlciBzZW5kcyBSZWFkIFJlbW90ZSBTdXBwb3J0ZWQgRmVhdHVyZXMgQ29tcGxldGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGUodWludDY0X3QgZmVhdHVyZXMpID0gMDsKLSAgLy8gSW52b2tlZCB3aGVuIGNvbnRyb2xsZXIgc2VuZHMgUmVhZCBSZW1vdGUgRXh0ZW5kZWQgRmVhdHVyZXMgQ29tcGxldGUKLSAgdmlydHVhbCB2b2lkIE9uUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZSgKLSAgICAgIHVpbnQ4X3QgcGFnZV9udW1iZXIsIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcykgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFjbF9tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIvZXZlbnRfY2hlY2tlcnMuaCBiL2dkL2hjaS9hY2xfbWFuYWdlci9ldmVudF9jaGVja2Vycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY1NjYxLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9ldmVudF9jaGVja2Vycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgY2hlY2tfY29tbWFuZF9jb21wbGV0ZShDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgQVNTRVJUKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBzdGF0dXNfdmlldyA9IFQ6OkNyZWF0ZSh2aWV3KTsKLSAgaWYgKCFzdGF0dXNfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICBMT0dfRVJST1IoIlJlY2VpdmVkIGNvbW1hbmQgY29tcGxldGUgd2l0aCBpbnZhbGlkIHBhY2tldCwgb3Bjb2RlIDB4JTAyaHgiLCB2aWV3LkdldENvbW1hbmRPcENvZGUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBzdGF0dXNfdmlldy5HZXRTdGF0dXMoKTsKLSAgT3BDb2RlIG9wX2NvZGUgPSBzdGF0dXNfdmlldy5HZXRDb21tYW5kT3BDb2RlKCk7Ci0gIGlmIChzdGF0dXMgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgc3RkOjpzdHJpbmcgZXJyb3JfY29kZSA9IEVycm9yQ29kZVRleHQoc3RhdHVzKTsKLSAgICBMT0dfRVJST1IoIlJlY2VpdmVkIGNvbW1hbmQgY29tcGxldGUgd2l0aCBlcnJvciBjb2RlICVzLCBvcGNvZGUgMHglMDJoeCIsIGVycm9yX2NvZGUuY19zdHIoKSwgb3BfY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBjaGVja19jb21tYW5kX3N0YXR1cyhDb21tYW5kU3RhdHVzVmlldyB2aWV3KSB7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gc3RhdHVzX3ZpZXcgPSBUOjpDcmVhdGUodmlldyk7Ci0gIGlmICghc3RhdHVzX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBjb21tYW5kIHN0YXR1cyB3aXRoIGludmFsaWQgcGFja2V0LCBvcGNvZGUgMHglMDJoeCIsIHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRXJyb3JDb2RlIHN0YXR1cyA9IHN0YXR1c192aWV3LkdldFN0YXR1cygpOwotICBPcENvZGUgb3BfY29kZSA9IHN0YXR1c192aWV3LkdldENvbW1hbmRPcENvZGUoKTsKLSAgaWYgKHN0YXR1cyAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgIExPR19FUlJPUigiUmVjZWl2ZWQgY29tbWFuZCBzdGF0dXMgd2l0aCBlcnJvciBjb2RlICVzLCBvcGNvZGUgMHglMDJoeCIsIGVycm9yX2NvZGUuY19zdHIoKSwgb3BfY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmNjIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzMzMjA0Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9sZV9hY2xfY29ubmVjdGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJvcy9tZXRyaWNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBMZUFjbENvbm5lY3Rpb25UcmFja2VyIDogcHVibGljIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgTGVBY2xDb25uZWN0aW9uVHJhY2tlcihMZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUpCi0gICAgICA6IGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8obGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlKSwgY29ubmVjdGlvbl9oYW5kbGVfKGNvbm5lY3Rpb25faGFuZGxlKSB7fQotICB+TGVBY2xDb25uZWN0aW9uVHJhY2tlcigpIHsKLSAgICBBU1NFUlQocXVldWVkX2NhbGxiYWNrc18uZW1wdHkoKSk7Ci0gIH0KLSAgdm9pZCBSZWdpc3RlckNhbGxiYWNrcyhMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gICAgY2xpZW50X2hhbmRsZXJfID0gaGFuZGxlcjsKLSAgICBjbGllbnRfY2FsbGJhY2tzXyA9IGNhbGxiYWNrczsKLSAgICB3aGlsZSAoIXF1ZXVlZF9jYWxsYmFja3NfLmVtcHR5KCkpIHsKLSAgICAgIGF1dG8gaXRlciA9IHF1ZXVlZF9jYWxsYmFja3NfLmJlZ2luKCk7Ci0gICAgICBoYW5kbGVyLT5Qb3N0KHN0ZDo6bW92ZSgqaXRlcikpOwotICAgICAgcXVldWVkX2NhbGxiYWNrc18uZXJhc2UoaXRlcik7Ci0gICAgfQotICB9Ci0KLSNkZWZpbmUgU0FWRV9PUl9DQUxMKGYsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoY2xpZW50X2hhbmRsZXJfID09IG51bGxwdHIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcXVldWVkX2NhbGxiYWNrc18uZW1wbGFjZV9iYWNrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrczo6ZiwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBfX1ZBX0FSR1NfXykpOyAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xpZW50X2hhbmRsZXJfLT5Qb3N0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrczo6ZiwgY29tbW9uOjpVbnJldGFpbmVkKGNsaWVudF9jYWxsYmFja3NfKSwgX19WQV9BUkdTX18pKTsgXAotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25VcGRhdGUoCi0gICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50MTZfdCBjb25uX2ludGVydmFsLCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25Db25uZWN0aW9uVXBkYXRlLCBoY2lfc3RhdHVzLCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpCi0gIH0KLQotICB2b2lkIE9uRGF0YUxlbmd0aENoYW5nZSh1aW50MTZfdCB0eF9vY3RldHMsIHVpbnQxNl90IHR4X3RpbWUsIHVpbnQxNl90IHJ4X29jdGV0cywgdWludDE2X3QgcnhfdGltZSkgb3ZlcnJpZGUgewotICAgIFNBVkVfT1JfQ0FMTChPbkRhdGFMZW5ndGhDaGFuZ2UsIHR4X29jdGV0cywgdHhfdGltZSwgcnhfb2N0ZXRzLCByeF90aW1lKQotICB9Ci0KLSAgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSgKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbikgewotICAgIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY1JlbW90ZVZlcnNpb25JbmZvKAotICAgICAgICBjb25uZWN0aW9uX2hhbmRsZV8sIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhjaV9zdGF0dXMpLCBsbXBfdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgICBTQVZFX09SX0NBTEwoT25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUsIGhjaV9zdGF0dXMsIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXJfbmFtZSwgc3ViX3ZlcnNpb24pOwotICB9Ci0gIHZvaWQgT25QaHlVcGRhdGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5KSBvdmVycmlkZSB7Ci0gICAgU0FWRV9PUl9DQUxMKE9uUGh5VXBkYXRlLCBoY2lfc3RhdHVzLCB0eF9waHksIHJ4X3BoeSk7Ci0gIH0KLSAgdm9pZCBPbkxvY2FsQWRkcmVzc1VwZGF0ZShBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25Mb2NhbEFkZHJlc3NVcGRhdGUsIGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgfQotCi0gIHZvaWQgT25EaXNjb25uZWN0aW9uKEVycm9yQ29kZSByZWFzb24pIG92ZXJyaWRlIHsKLSAgICBTQVZFX09SX0NBTEwoT25EaXNjb25uZWN0aW9uLCByZWFzb24pOwotICB9Ci0jdW5kZWYgU0FWRV9PUl9DQUxMCi0KLSAgTGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlKiBsZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfOwotICBvczo6SGFuZGxlciogY2xpZW50X2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogY2xpZW50X2NhbGxiYWNrc18gPSBudWxscHRyOwotICBzdGQ6Omxpc3Q8Y29tbW9uOjpPbmNlQ2xvc3VyZT4gcXVldWVkX2NhbGxiYWNrc187Ci0gIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlXzsKLX07Ci0KLXN0cnVjdCBMZUFjbENvbm5lY3Rpb246OmltcGwgewotICBpbXBsKExlQWNsQ29ubmVjdGlvbkludGVyZmFjZSogbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlLCBzdGQ6OnNoYXJlZF9wdHI8UXVldWU+IHF1ZXVlLCB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSkKLSAgICAgIDogcXVldWVfKHN0ZDo6bW92ZShxdWV1ZSkpLCB0cmFja2VyKGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwgY29ubmVjdGlvbl9oYW5kbGUpIHt9Ci0gIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MqIEdldEV2ZW50Q2FsbGJhY2tzKCkgewotICAgIEFTU0VSVCghY2FsbGJhY2tzX2dpdmVuXyk7Ci0gICAgY2FsbGJhY2tzX2dpdmVuXyA9IHRydWU7Ci0gICAgcmV0dXJuICZ0cmFja2VyOwotICB9Ci0KLSAgYm9vbCBjYWxsYmFja3NfZ2l2ZW5fe2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPFF1ZXVlPiBxdWV1ZV87Ci0gIExlQWNsQ29ubmVjdGlvblRyYWNrZXIgdHJhY2tlcjsKLX07Ci0KLUxlQWNsQ29ubmVjdGlvbjo6TGVBY2xDb25uZWN0aW9uKCkKLSAgICA6IEFjbENvbm5lY3Rpb24oKSwgbG9jYWxfYWRkcmVzc18oQWRkcmVzczo6a0VtcHR5LCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKSwKLSAgICAgIHJlbW90ZV9hZGRyZXNzXyhBZGRyZXNzOjprRW1wdHksIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpIHt9Ci0KLUxlQWNsQ29ubmVjdGlvbjo6TGVBY2xDb25uZWN0aW9uKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxRdWV1ZT4gcXVldWUsCi0gICAgTGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlKiBsZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2UsCi0gICAgdWludDE2X3QgaGFuZGxlLAotICAgIEFkZHJlc3NXaXRoVHlwZSBsb2NhbF9hZGRyZXNzLAotICAgIEFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcywKLSAgICBSb2xlIHJvbGUpCi0gICAgOiBBY2xDb25uZWN0aW9uKHF1ZXVlLT5HZXRVcEVuZCgpLCBoYW5kbGUpLAotICAgICAgbG9jYWxfYWRkcmVzc18obG9jYWxfYWRkcmVzcyksCi0gICAgICByZW1vdGVfYWRkcmVzc18ocmVtb3RlX2FkZHJlc3MpLAotICAgICAgcm9sZV8ocm9sZSkgewotICBwaW1wbF8gPSBuZXcgTGVBY2xDb25uZWN0aW9uOjppbXBsKGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwgc3RkOjptb3ZlKHF1ZXVlKSwgaGFuZGxlKTsKLX0KLQotTGVBY2xDb25uZWN0aW9uOjp+TGVBY2xDb25uZWN0aW9uKCkgewotICBkZWxldGUgcGltcGxfOwotfQotCi12b2lkIExlQWNsQ29ubmVjdGlvbjo6UmVnaXN0ZXJDYWxsYmFja3MoTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogY2FsbGJhY2tzLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICByZXR1cm4gcGltcGxfLT50cmFja2VyLlJlZ2lzdGVyQ2FsbGJhY2tzKGNhbGxiYWNrcywgaGFuZGxlcik7Ci19Ci0KLXZvaWQgTGVBY2xDb25uZWN0aW9uOjpEaXNjb25uZWN0KERpc2Nvbm5lY3RSZWFzb24gcmVhc29uKSB7Ci0gIHBpbXBsXy0+dHJhY2tlci5sZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIERpc2Nvbm5lY3RCdWlsZGVyOjpDcmVhdGUoaGFuZGxlXywgcmVhc29uKSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlKFtdKENvbW1hbmRTdGF0dXNWaWV3IHN0YXR1cykgewotICAgICAgICBBU1NFUlQoc3RhdHVzLklzVmFsaWQoKSk7Ci0gICAgICAgIEFTU0VSVChzdGF0dXMuR2V0Q29tbWFuZE9wQ29kZSgpID09IE9wQ29kZTo6RElTQ09OTkVDVCk7Ci0gICAgICAgIGF1dG8gZGlzY29ubmVjdF9zdGF0dXMgPSBEaXNjb25uZWN0U3RhdHVzVmlldzo6Q3JlYXRlKHN0YXR1cyk7Ci0gICAgICAgIEFTU0VSVChkaXNjb25uZWN0X3N0YXR1cy5Jc1ZhbGlkKCkpOwotICAgICAgICBhdXRvIGVycm9yX2NvZGUgPSBkaXNjb25uZWN0X3N0YXR1cy5HZXRTdGF0dXMoKTsKLSAgICAgICAgaWYgKGVycm9yX2NvZGUgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICAgICAgTE9HX0lORk8oIkRpc2Nvbm5lY3Qgc3RhdHVzICVzIiwgRXJyb3JDb2RlVGV4dChlcnJvcl9jb2RlKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfSkpOwotfQotCi1MZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBMZUFjbENvbm5lY3Rpb246OkdldEV2ZW50Q2FsbGJhY2tzKCkgewotICByZXR1cm4gcGltcGxfLT5HZXRFdmVudENhbGxiYWNrcygpOwotfQotCi1ib29sIExlQWNsQ29ubmVjdGlvbjo6TGVDb25uZWN0aW9uVXBkYXRlKHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWluLCB1aW50MTZfdCBjb25uX2ludGVydmFsX21heCwgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuZ3RoLCB1aW50MTZfdCBtYXhfY2VfbGVuZ3RoKSB7Ci0gIGlmICghY2hlY2tfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKGNvbm5faW50ZXJ2YWxfbWluLCBjb25uX2ludGVydmFsX21heCwgY29ubl9sYXRlbmN5LCBzdXBlcnZpc2lvbl90aW1lb3V0KSkgewotICAgIExPR19FUlJPUigiSW52YWxpZCBwYXJhbWV0ZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcGltcGxfLT50cmFja2VyLmxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgTGVDb25uZWN0aW9uVXBkYXRlQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8sIGNvbm5faW50ZXJ2YWxfbWluLCBjb25uX2ludGVydmFsX21heCwgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzaW9uX3RpbWVvdXQsIG1pbl9jZV9sZW5ndGgsIG1heF9jZV9sZW5ndGgpLAotICAgICAgcGltcGxfLT50cmFja2VyLmNsaWVudF9oYW5kbGVyXy0+QmluZE9uY2UoW10oQ29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7Ci0gICAgICAgIEFTU0VSVChzdGF0dXMuSXNWYWxpZCgpKTsKLSAgICAgICAgQVNTRVJUKHN0YXR1cy5HZXRDb21tYW5kT3BDb2RlKCkgPT0gT3BDb2RlOjpMRV9DT05ORUNUSU9OX1VQREFURSk7Ci0gICAgICB9KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExlQWNsQ29ubmVjdGlvbjo6UmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpIHsKLSAgcGltcGxfLT50cmFja2VyLmxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkJ1aWxkZXI6OkNyZWF0ZShoYW5kbGVfKSwKLSAgICAgIHBpbXBsXy0+dHJhY2tlci5jbGllbnRfaGFuZGxlcl8tPkJpbmRPbmNlKFtdKENvbW1hbmRTdGF0dXNWaWV3IHN0YXR1cykgewotICAgICAgICBBU1NFUlQoc3RhdHVzLklzVmFsaWQoKSk7Ci0gICAgICAgIEFTU0VSVChzdGF0dXMuR2V0Q29tbWFuZE9wQ29kZSgpID09IE9wQ29kZTo6UkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTik7Ci0gICAgICB9KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExlQWNsQ29ubmVjdGlvbjo6Y2hlY2tfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKAotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWluLCB1aW50MTZfdCBjb25uX2ludGVydmFsX21heCwgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0KSB7Ci0gIGlmIChjb25uX2ludGVydmFsX21pbiA8IDB4MDAwNiB8fCBjb25uX2ludGVydmFsX21pbiA+IDB4MEM4MCB8fCBjb25uX2ludGVydmFsX21heCA8IDB4MDAwNiB8fAotICAgICAgY29ubl9pbnRlcnZhbF9tYXggPiAweDBDODAgfHwgY29ubl9sYXRlbmN5ID4gMHgwMUYzIHx8IHN1cGVydmlzaW9uX3RpbWVvdXQgPCAweDAwMEEgfHwKLSAgICAgIHN1cGVydmlzaW9uX3RpbWVvdXQgPiAweDBDODApIHsKLSAgICBMT0dfRVJST1IoIkludmFsaWQgcGFyYW1ldGVyIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIFRoZSBNYXhpbXVtIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyB3aWxsIGJlIGNvbm5faW50ZXJ2YWxfbWF4ICogMS4yNSBtcwotICAvLyBUaGUgVGltZW91dCBpbiBtaWxsaXNlY29uZHMgd2lsbCBiZSBleHBlY3RlZF9zdXBlcnZpc2lvbl90aW1lb3V0ICogMTAgbXMKLSAgLy8gVGhlIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHNoYWxsIGJlIGxhcmdlciB0aGFuICgxICsgTGF0ZW5jeSkgKiBJbnRlcnZhbF9NYXggKiAyLCB3aGVyZSBJbnRlcnZhbF9NYXggaXMgZ2l2ZW4gaW4KLSAgLy8gbWlsbGlzZWNvbmRzLgotICB1aW50MzJfdCBzdXBlcnZpc2lvbl90aW1lb3V0X21pbiA9ICh1aW50MzJfdCkoMSArIGNvbm5fbGF0ZW5jeSkgKiBjb25uX2ludGVydmFsX21heCAqIDIgKyAxOwotICBpZiAoc3VwZXJ2aXNpb25fdGltZW91dCAqIDggPCBzdXBlcnZpc2lvbl90aW1lb3V0X21pbiB8fCBjb25uX2ludGVydmFsX21heCA8IGNvbm5faW50ZXJ2YWxfbWluKSB7Ci0gICAgTE9HX0VSUk9SKCJJbnZhbGlkIHBhcmFtZXRlciIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWNsX21hbmFnZXIKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9hY2xfbWFuYWdlci9sZV9hY2xfY29ubmVjdGlvbi5oIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwY2M0NzEuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9sZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiaGNpL2xlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGFjbF9tYW5hZ2VyIHsKLQotY2xhc3MgTGVBY2xDb25uZWN0aW9uIDogcHVibGljIEFjbENvbm5lY3Rpb24gewotIHB1YmxpYzoKLSAgTGVBY2xDb25uZWN0aW9uKCk7Ci0gIExlQWNsQ29ubmVjdGlvbigKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxRdWV1ZT4gcXVldWUsCi0gICAgICBMZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZSwKLSAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgIEFkZHJlc3NXaXRoVHlwZSBsb2NhbF9hZGRyZXNzLAotICAgICAgQWRkcmVzc1dpdGhUeXBlIHJlbW90ZV9hZGRyZXNzLAotICAgICAgUm9sZSByb2xlKTsKLSAgfkxlQWNsQ29ubmVjdGlvbigpOwotCi0gIHZpcnR1YWwgQWRkcmVzc1dpdGhUeXBlIEdldExvY2FsQWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbG9jYWxfYWRkcmVzc187Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVXBkYXRlTG9jYWxBZGRyZXNzKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7Ci0gICAgbG9jYWxfYWRkcmVzc18gPSBhZGRyZXNzOwotICB9Ci0KLSAgdmlydHVhbCBBZGRyZXNzV2l0aFR5cGUgR2V0UmVtb3RlQWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVtb3RlX2FkZHJlc3NfOwotICB9Ci0KLSAgdmlydHVhbCBSb2xlIEdldFJvbGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJvbGVfOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdChEaXNjb25uZWN0UmVhc29uIHJlYXNvbik7Ci0KLSAgdmlydHVhbCBib29sIExlQ29ubmVjdGlvblVwZGF0ZSh1aW50MTZfdCBjb25uX2ludGVydmFsX21pbiwgdWludDE2X3QgY29ubl9pbnRlcnZhbF9tYXgsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuZ3RoLCB1aW50MTZfdCBtYXhfY2VfbGVuZ3RoKTsKLQotICB2aXJ0dWFsIGJvb2wgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpIG92ZXJyaWRlOwotCi0gIC8vIFRPRE8gaW1wbGVtZW50IExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RSZXBseSwgTGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdE5lZ2F0aXZlUmVwbHkKLQotICAvLyBDYWxsZWQgb25jZSBiZWZvcmUgcGFzc2luZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50Ci0gIHZpcnR1YWwgTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogR2V0RXZlbnRDYWxsYmFja3MoKTsKLQotIHByaXZhdGU6Ci0gIHZpcnR1YWwgYm9vbCBjaGVja19jb25uZWN0aW9uX3BhcmFtZXRlcnMoCi0gICAgICB1aW50MTZfdCBjb25uX2ludGVydmFsX21pbiwKLSAgICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWF4LAotICAgICAgdWludDE2X3QgZXhwZWN0ZWRfY29ubl9sYXRlbmN5LAotICAgICAgdWludDE2X3QgZXhwZWN0ZWRfc3VwZXJ2aXNpb25fdGltZW91dCk7Ci0gIHN0cnVjdCBpbXBsOwotICBzdHJ1Y3QgaW1wbCogcGltcGxfID0gbnVsbHB0cjsKLSAgQWRkcmVzc1dpdGhUeXBlIGxvY2FsX2FkZHJlc3NfOwotICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3NfOwotICBSb2xlIHJvbGVfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTGVBY2xDb25uZWN0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmggYi9nZC9oY2kvYWNsX21hbmFnZXIvbGVfY29ubmVjdGlvbl9jYWxsYmFja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhYmM5YS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWNsX21hbmFnZXIvbGVfY29ubmVjdGlvbl9jYWxsYmFja3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9sZV9hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBhY2xfbWFuYWdlciB7Ci0KLWNsYXNzIExlQ29ubmVjdGlvbkNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5MZUNvbm5lY3Rpb25DYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIC8vIEludm9rZWQgd2hlbiBjb250cm9sbGVyIHNlbmRzIENvbm5lY3Rpb24gQ29tcGxldGUgZXZlbnQgd2l0aCBTdWNjZXNzIGVycm9yIGNvZGUKLSAgLy8gQWRkcmVzc1dpdGhUeXBlIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgb2JqZWN0IHVzZWQgaW4gQWNsTWFuYWdlciNDcmVhdGVMZUNvbm5lY3Rpb24KLSAgdmlydHVhbCB2b2lkIE9uTGVDb25uZWN0U3VjY2VzcyhBZGRyZXNzV2l0aFR5cGUsIHN0ZDo6dW5pcXVlX3B0cjxMZUFjbENvbm5lY3Rpb24+KSA9IDA7Ci0gIC8vIEludm9rZWQgd2hlbiBjcmVhdGUgY29ubmVjdGlvbiB0aW1lb3V0IG9yIGNvbnRyb2xsZXIgc2VuZHMgQ29ubmVjdGlvbiBDb21wbGV0ZSBldmVudCB3aXRoIG5vbi1TdWNjZXNzIGVycm9yIGNvZGUKLSAgdmlydHVhbCB2b2lkIE9uTGVDb25uZWN0RmFpbChBZGRyZXNzV2l0aFR5cGUsIEVycm9yQ29kZSByZWFzb24pID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MuaCBiL2dkL2hjaS9hY2xfbWFuYWdlci9sZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDM4YTYuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgdm9pZCBPbkNvbm5lY3Rpb25VcGRhdGUoCi0gICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9pbnRlcnZhbCwKLSAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25fbGF0ZW5jeSwKLSAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRGF0YUxlbmd0aENoYW5nZSh1aW50MTZfdCB0eF9vY3RldHMsIHVpbnQxNl90IHR4X3RpbWUsIHVpbnQxNl90IHJ4X29jdGV0cywgdWludDE2X3QgcnhfdGltZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25EaXNjb25uZWN0aW9uKEVycm9yQ29kZSByZWFzb24pID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblBoeVVwZGF0ZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHkpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uTG9jYWxBZGRyZXNzVXBkYXRlKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFjbF9tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIvbGVfaW1wbC5oIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1MWY3Yy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWNsX21hbmFnZXIvbGVfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9hc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiaGNpL2xlX2FkZHJlc3NfbWFuYWdlci5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi11c2luZyBjb21tb246OkJpbmRPbmNlOwotCi1jb25zdGV4cHIgdWludDE2X3Qga1NjYW5JbnRlcnZhbEZhc3QgPSAweDAwNjA7ICAgIC8qIDMwIH4gNjAgbXMgKHVzZSA2MCkgID0gOTYgKjAuNjI1ICovCi1jb25zdGV4cHIgdWludDE2X3Qga1NjYW5XaW5kb3dGYXN0ID0gMHgwMDMwOyAgICAgIC8qIDMwIG1zID0gNDggKjAuNjI1ICovCi1jb25zdGV4cHIgdWludDE2X3Qga1NjYW5XaW5kb3cybUZhc3QgPSAweDAwMTg7ICAgIC8qIDE1IG1zID0gMjQgKjAuNjI1ICovCi1jb25zdGV4cHIgdWludDE2X3Qga1NjYW5XaW5kb3dDb2RlZEZhc3QgPSAweDAwMTg7IC8qIDE1IG1zID0gMjQgKjAuNjI1ICovCi1jb25zdGV4cHIgdWludDE2X3Qga1NjYW5JbnRlcnZhbFNsb3cgPSAweDA4MDA7ICAgIC8qIDEuMjggcyA9IDIwNDggKjAuNjI1ICovCi1jb25zdGV4cHIgdWludDE2X3Qga1NjYW5XaW5kb3dTbG93ID0gMHgwMDMwOyAgICAgIC8qIDMwIG1zID0gNDggKjAuNjI1ICovCi1jb25zdGV4cHIgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBrQ3JlYXRlQ29ubmVjdGlvblRpbWVvdXRNcyA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAgKiAxMDAwKTsKLWNvbnN0ZXhwciB1aW50OF90IFBIWV9MRV9OT19QQUNLRVQgPSAweDAwOwotY29uc3RleHByIHVpbnQ4X3QgUEhZX0xFXzFNID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IFBIWV9MRV8yTSA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBQSFlfTEVfQ09ERUQgPSAweDA0OwotCi1zdHJ1Y3QgbGVfYWNsX2Nvbm5lY3Rpb24gewotICBsZV9hY2xfY29ubmVjdGlvbihBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3MsIEFjbENvbm5lY3Rpb246OlF1ZXVlRG93bkVuZCogcXVldWVfZG93bl9lbmQsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgICAgOiBhc3NlbWJsZXJfKHJlbW90ZV9hZGRyZXNzLCBxdWV1ZV9kb3duX2VuZCwgaGFuZGxlciksIHJlbW90ZV9hZGRyZXNzXyhyZW1vdGVfYWRkcmVzcykge30KLSAgfmxlX2FjbF9jb25uZWN0aW9uKCkgPSBkZWZhdWx0OwotICBzdHJ1Y3QgYWNsX21hbmFnZXI6OmFzc2VtYmxlciBhc3NlbWJsZXJfOwotICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3NfOwotICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXyA9IG51bGxwdHI7Ci19OwotCi1zdHJ1Y3QgbGVfaW1wbCA6IHB1YmxpYyBibHVldG9vdGg6OmhjaTo6TGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrIHsKLSAgbGVfaW1wbCgKLSAgICAgIEhjaUxheWVyKiBoY2lfbGF5ZXIsCi0gICAgICBDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsCi0gICAgICBSb3VuZFJvYmluU2NoZWR1bGVyKiByb3VuZF9yb2Jpbl9zY2hlZHVsZXIsCi0gICAgICBib29sIGNyYXNoX29uX3Vua25vd25faGFuZGxlKQotICAgICAgOiBoY2lfbGF5ZXJfKGhjaV9sYXllciksCi0gICAgICAgIGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpLAotICAgICAgICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfKHJvdW5kX3JvYmluX3NjaGVkdWxlciksCi0gICAgICAgIGNyYXNoX29uX3Vua25vd25faGFuZGxlXyhjcmFzaF9vbl91bmtub3duX2hhbmRsZSkgewotICAgIGhjaV9sYXllcl8gPSBoY2lfbGF5ZXI7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgIGhhbmRsZXJfID0gaGFuZGxlcjsKLSAgICBsZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfID0gaGNpX2xheWVyXy0+R2V0TGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlKAotICAgICAgICBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZsZV9pbXBsOjpvbl9sZV9ldmVudCksCi0gICAgICAgIGhhbmRsZXJfLT5CaW5kT24odGhpcywgJmxlX2ltcGw6Om9uX2xlX2Rpc2Nvbm5lY3QpLAotICAgICAgICBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZsZV9pbXBsOjpvbl9sZV9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uKSk7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXyA9IG5ldyBMZUFkZHJlc3NNYW5hZ2VyKAotICAgICAgICBjb21tb246OkJpbmQoJmxlX2ltcGw6OmVucXVldWVfY29tbWFuZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgaGFuZGxlcl8sCi0gICAgICAgIGNvbnRyb2xsZXItPkdldE1hY0FkZHJlc3MoKSwKLSAgICAgICAgY29udHJvbGxlci0+R2V0TGVDb25uZWN0TGlzdFNpemUoKSwKLSAgICAgICAgY29udHJvbGxlci0+R2V0TGVSZXNvbHZpbmdMaXN0U2l6ZSgpKTsKLSAgfQotCi0gIH5sZV9pbXBsKCkgewotICAgIGZvciAoYXV0byBzdWJldmVudF9jb2RlIDogTGVDb25uZWN0aW9uTWFuYWdlbWVudEV2ZW50cykgewotICAgICAgaGNpX2xheWVyXy0+VW5yZWdpc3RlckxlRXZlbnRIYW5kbGVyKHN1YmV2ZW50X2NvZGUpOwotICAgIH0KLSAgICBpZiAoYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWQpIHsKLSAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIodGhpcyk7Ci0gICAgfQotICAgIGRlbGV0ZSBsZV9hZGRyZXNzX21hbmFnZXJfOwotICAgIGxlX2FjbF9jb25uZWN0aW9uc18uY2xlYXIoKTsKLSAgfQotCi0gIHZvaWQgb25fbGVfZXZlbnQoTGVNZXRhRXZlbnRWaWV3IGV2ZW50X3BhY2tldCkgewotICAgIFN1YmV2ZW50Q29kZSBjb2RlID0gZXZlbnRfcGFja2V0LkdldFN1YmV2ZW50Q29kZSgpOwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgY2FzZSBTdWJldmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgICAgIG9uX2xlX2Nvbm5lY3Rpb25fY29tcGxldGUoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFN1YmV2ZW50Q29kZTo6RU5IQU5DRURfQ09OTkVDVElPTl9DT01QTEVURToKLSAgICAgICAgb25fbGVfZW5oYW5jZWRfY29ubmVjdGlvbl9jb21wbGV0ZShldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX1VQREFURV9DT01QTEVURToKLSAgICAgICAgb25fbGVfY29ubmVjdGlvbl91cGRhdGVfY29tcGxldGUoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFN1YmV2ZW50Q29kZTo6UEhZX1VQREFURV9DT01QTEVURToKLSAgICAgICAgb25fbGVfcGh5X3VwZGF0ZV9jb21wbGV0ZShldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU3ViZXZlbnRDb2RlOjpEQVRBX0xFTkdUSF9DSEFOR0U6Ci0gICAgICAgIG9uX2RhdGFfbGVuZ3RoX2NoYW5nZShldmVudF9wYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU3ViZXZlbnRDb2RlOjpSRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVDoKLSAgICAgICAgb25fcmVtb3RlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyX3JlcXVlc3QoZXZlbnRfcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmhhbmRsZWQgZXZlbnQgY29kZSAlcyIsIFN1YmV2ZW50Q29kZVRleHQoY29kZSkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogZ2V0X2NhbGxiYWNrcyh1aW50MTZfdCBoYW5kbGUpIHsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBsZV9hY2xfY29ubmVjdGlvbnNfLmZpbmQoaGFuZGxlKTsKLSAgICBpZiAoY29ubmVjdGlvbiA9PSBsZV9hY2xfY29ubmVjdGlvbnNfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb24tPnNlY29uZC5sZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXzsKLSAgfQotCi0gIHZvaWQgb25fbGVfZGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIEVycm9yQ29kZSByZWFzb24pIHsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihoYW5kbGUpOwotICAgIGNhbGxiYWNrcy0+T25EaXNjb25uZWN0aW9uKHJlYXNvbik7Ci0gICAgbGVfYWNsX2Nvbm5lY3Rpb25zXy5lcmFzZShoYW5kbGUpOwotICB9Ci0KLSAgdm9pZCBvbl9jb21tb25fbGVfY29ubmVjdGlvbl9jb21wbGV0ZShBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBhdXRvIGNvbm5lY3RpbmdfYWRkcl93aXRoX3R5cGUgPSBjb25uZWN0aW5nX2xlXy5maW5kKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgICBpZiAoY29ubmVjdGluZ19hZGRyX3dpdGhfdHlwZSA9PSBjb25uZWN0aW5nX2xlXy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIk5vIHByaW9yIGNvbm5lY3Rpb24gcmVxdWVzdCBmb3IgJXMiLCBhZGRyZXNzX3dpdGhfdHlwZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25uZWN0aW5nX2xlXy5lcmFzZShjb25uZWN0aW5nX2FkZHJfd2l0aF90eXBlKTsKLSAgICB9Ci0gICAgaWYgKGNyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXRfYWxhcm1zXy5maW5kKGFkZHJlc3Nfd2l0aF90eXBlKSAhPSBjcmVhdGVfY29ubmVjdGlvbl90aW1lb3V0X2FsYXJtc18uZW5kKCkpIHsKLSAgICAgIGNyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXRfYWxhcm1zXy5hdChhZGRyZXNzX3dpdGhfdHlwZSkuQ2FuY2VsKCk7Ci0gICAgICBjcmVhdGVfY29ubmVjdGlvbl90aW1lb3V0X2FsYXJtc18uZXJhc2UoYWRkcmVzc193aXRoX3R5cGUpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fbGVfY29ubmVjdGlvbl9jb21wbGV0ZShMZU1ldGFFdmVudFZpZXcgcGFja2V0KSB7Ci0gICAgTGVDb25uZWN0aW9uQ29tcGxldGVWaWV3IGNvbm5lY3Rpb25fY29tcGxldGUgPSBMZUNvbm5lY3Rpb25Db21wbGV0ZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIEFTU0VSVChjb25uZWN0aW9uX2NvbXBsZXRlLklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXMgPSBjb25uZWN0aW9uX2NvbXBsZXRlLkdldFN0YXR1cygpOwotICAgIGF1dG8gYWRkcmVzcyA9IGNvbm5lY3Rpb25fY29tcGxldGUuR2V0UGVlckFkZHJlc3MoKTsKLSAgICBhdXRvIHBlZXJfYWRkcmVzc190eXBlID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRQZWVyQWRkcmVzc1R5cGUoKTsKLSAgICAvLyBUT0RPOiBmaW5kIG91dCB3aGljaCBhZGRyZXNzIGFuZCB0eXBlIHdhcyB1c2VkIHRvIGluaXRpYXRlIHRoZSBjb25uZWN0aW9uCi0gICAgQWRkcmVzc1dpdGhUeXBlIHJlbW90ZV9hZGRyZXNzKGFkZHJlc3MsIHBlZXJfYWRkcmVzc190eXBlKTsKLSAgICBBZGRyZXNzV2l0aFR5cGUgbG9jYWxfYWRkcmVzcyA9IGxlX2FkZHJlc3NfbWFuYWdlcl8tPkdldEN1cnJlbnRBZGRyZXNzKCk7Ci0gICAgb25fY29tbW9uX2xlX2Nvbm5lY3Rpb25fY29tcGxldGUocmVtb3RlX2FkZHJlc3MpOwotICAgIGlmIChzdGF0dXMgPT0gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT04gJiYgcGF1c2VfY29ubmVjdGlvbikgewotICAgICAgLy8gY29ubmVjdGlvbiBjYW5jZWxlZCBieSBMZUFkZHJlc3NNYW5hZ2VyLk9uUGF1c2UoKSwgd2lsbCBhdXRvIHJlY29ubmVjdCBieSBMZUFkZHJlc3NNYW5hZ2VyLk9uUmVzdW1lKCkKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTiAmJiByZW1vdGVfYWRkcmVzcy5HZXRBZGRyZXNzKCkgPT0gQWRkcmVzczo6a0VtcHR5KSB7Ci0gICAgICAvLyBkaXJlY3QgY29ubmVjdCBjYW5jZWxlZCBkdWUgdG8gY29ubmVjdGlvbiB0aW1lb3V0LCBzdGFydCBiYWNrZ3JvdW5kIGNvbm5lY3QKLSAgICAgIGNyZWF0ZV9sZV9jb25uZWN0aW9uKHJlbW90ZV9hZGRyZXNzLCBmYWxzZSwgZmFsc2UpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBjYW5jZWxlZF9jb25uZWN0aW9uc18uZXJhc2UocmVtb3RlX2FkZHJlc3MpOwotICAgICAgcmVhZHlfdG9fdW5yZWdpc3RlciA9IHRydWU7Ci0gICAgICByZW1vdmVfZGV2aWNlX2Zyb21fY29ubmVjdF9saXN0KHJlbW90ZV9hZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBpZiAobGVfY2xpZW50X2hhbmRsZXJfID09IG51bGxwdHIpIHsKLSAgICAgIExPR19FUlJPUigiTm8gY2FsbGJhY2tzIHRvIGNhbGwiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgbGVfY2xpZW50X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJkxlQ29ubmVjdGlvbkNhbGxiYWNrczo6T25MZUNvbm5lY3RGYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGxlX2NsaWVudF9jYWxsYmFja3NfKSwgcmVtb3RlX2FkZHJlc3MsIHN0YXR1cykpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwgPSBjb25uZWN0aW9uX2NvbXBsZXRlLkdldENvbm5JbnRlcnZhbCgpOwotICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSA9IGNvbm5lY3Rpb25fY29tcGxldGUuR2V0Q29ubkxhdGVuY3koKTsKLSAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0ID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRTdXBlcnZpc2lvblRpbWVvdXQoKTsKLSAgICBpZiAoIWNoZWNrX2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhjb25uX2ludGVydmFsLCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmUgY29ubmVjdGlvbiBjb21wbGV0ZSB3aXRoIGludmFsaWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byByb2xlID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRSb2xlKCk7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDEwKTsKLSAgICBhdXRvIGVtcGxhY2VfcGFpciA9IGxlX2FjbF9jb25uZWN0aW9uc18uZW1wbGFjZSgKLSAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAotICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlKSwKLSAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHJlbW90ZV9hZGRyZXNzLCBxdWV1ZS0+R2V0RG93bkVuZCgpLCBoYW5kbGVyXykpOwotICAgIEFTU0VSVChlbXBsYWNlX3BhaXIuc2Vjb25kKTsgIC8vIE1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBpcyB1bmlxdWUKLSAgICBhdXRvJiBjb25uZWN0aW9uX3Byb3h5ID0gZW1wbGFjZV9wYWlyLmZpcnN0LT5zZWNvbmQ7Ci0gICAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkxFLCBoYW5kbGUsIHF1ZXVlKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uKG5ldyBMZUFjbENvbm5lY3Rpb24oCi0gICAgICAgIHN0ZDo6bW92ZShxdWV1ZSksIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8sIGhhbmRsZSwgbG9jYWxfYWRkcmVzcywgcmVtb3RlX2FkZHJlc3MsIHJvbGUpKTsKLSAgICBjb25uZWN0aW9uX3Byb3h5LmxlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfID0gY29ubmVjdGlvbi0+R2V0RXZlbnRDYWxsYmFja3MoKTsKLSAgICBsZV9jbGllbnRfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmTGVDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkxlQ29ubmVjdFN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGxlX2NsaWVudF9jYWxsYmFja3NfKSwgcmVtb3RlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNvbm5lY3Rpb24pKSk7Ci0gIH0KLQotICB2b2lkIG9uX2xlX2VuaGFuY2VkX2Nvbm5lY3Rpb25fY29tcGxldGUoTGVNZXRhRXZlbnRWaWV3IHBhY2tldCkgewotICAgIExlRW5oYW5jZWRDb25uZWN0aW9uQ29tcGxldGVWaWV3IGNvbm5lY3Rpb25fY29tcGxldGUgPSBMZUVuaGFuY2VkQ29ubmVjdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgQVNTRVJUKGNvbm5lY3Rpb25fY29tcGxldGUuSXNWYWxpZCgpKTsKLSAgICBhdXRvIHN0YXR1cyA9IGNvbm5lY3Rpb25fY29tcGxldGUuR2V0U3RhdHVzKCk7Ci0gICAgYXV0byBhZGRyZXNzID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRQZWVyQWRkcmVzcygpOwotICAgIGF1dG8gcGVlcl9hZGRyZXNzX3R5cGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlLkdldFBlZXJBZGRyZXNzVHlwZSgpOwotICAgIGF1dG8gcGVlcl9yZXNvbHZhYmxlX2FkZHJlc3MgPSBjb25uZWN0aW9uX2NvbXBsZXRlLkdldFBlZXJSZXNvbHZhYmxlUHJpdmF0ZUFkZHJlc3MoKTsKLSAgICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3MoYWRkcmVzcywgcGVlcl9hZGRyZXNzX3R5cGUpOwotICAgIGlmICghcGVlcl9yZXNvbHZhYmxlX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgICByZW1vdGVfYWRkcmVzcyA9IEFkZHJlc3NXaXRoVHlwZShwZWVyX3Jlc29sdmFibGVfYWRkcmVzcywgQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUyk7Ci0gICAgfQotICAgIG9uX2NvbW1vbl9sZV9jb25uZWN0aW9uX2NvbXBsZXRlKHJlbW90ZV9hZGRyZXNzKTsKLSAgICBpZiAoc3RhdHVzID09IEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OICYmIHBhdXNlX2Nvbm5lY3Rpb24pIHsKLSAgICAgIC8vIGNvbm5lY3Rpb24gY2FuY2VsZWQgYnkgTGVBZGRyZXNzTWFuYWdlci5PblBhdXNlKCksIHdpbGwgYXV0byByZWNvbm5lY3QgYnkgTGVBZGRyZXNzTWFuYWdlci5PblJlc3VtZSgpCi0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT04gJiYgcmVtb3RlX2FkZHJlc3MuR2V0QWRkcmVzcygpID09IEFkZHJlc3M6OmtFbXB0eSkgewotICAgICAgLy8gZGlyZWN0IGNvbm5lY3QgY2FuY2VsZWQgZHVlIHRvIGNvbm5lY3Rpb24gdGltZW91dCwgc3RhcnQgYmFja2dyb3VuZCBjb25uZWN0Ci0gICAgICBjcmVhdGVfbGVfY29ubmVjdGlvbihyZW1vdGVfYWRkcmVzcywgZmFsc2UsIGZhbHNlKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgY2FuY2VsZWRfY29ubmVjdGlvbnNfLmVyYXNlKHJlbW90ZV9hZGRyZXNzKTsKLSAgICAgIHJlYWR5X3RvX3VucmVnaXN0ZXIgPSB0cnVlOwotICAgICAgcmVtb3ZlX2RldmljZV9mcm9tX2Nvbm5lY3RfbGlzdChyZW1vdGVfYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgaWYgKGxlX2NsaWVudF9oYW5kbGVyXyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfRVJST1IoIk5vIGNhbGxiYWNrcyB0byBjYWxsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIGxlX2NsaWVudF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZMZUNvbm5lY3Rpb25DYWxsYmFja3M6Ok9uTGVDb25uZWN0RmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChsZV9jbGllbnRfY2FsbGJhY2tzXyksIHJlbW90ZV9hZGRyZXNzLCBzdGF0dXMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIHJvbGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlLkdldFJvbGUoKTsKLSAgICBBZGRyZXNzV2l0aFR5cGUgbG9jYWxfYWRkcmVzczsKLSAgICBpZiAocm9sZSA9PSBoY2k6OlJvbGU6OkNFTlRSQUwpIHsKLSAgICAgIGxvY2FsX2FkZHJlc3MgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRDdXJyZW50QWRkcmVzcygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyB3aGVuIGFjY2VwdGluZyBjb25uZWN0aW9uLCB3ZSBtdXN0IG9idGFpbiB0aGUgYWRkcmVzcyBmcm9tIHRoZSBhZHZlcnRpc2VyLgotICAgICAgLy8gV2hlbiB3ZSByZWNlaXZlICJzZXQgdGVybWluYXRlZCBldmVudCIsIHdlIGFzc29jaWF0ZSBjb25uZWN0aW9uIGhhbmRsZSB3aXRoIGFkdmVydGlzZXIgYWRkcmVzcwotICAgICAgbG9jYWxfYWRkcmVzcyA9IEFkZHJlc3NXaXRoVHlwZXt9OwotICAgIH0KLQotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwgPSBjb25uZWN0aW9uX2NvbXBsZXRlLkdldENvbm5JbnRlcnZhbCgpOwotICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSA9IGNvbm5lY3Rpb25fY29tcGxldGUuR2V0Q29ubkxhdGVuY3koKTsKLSAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0ID0gY29ubmVjdGlvbl9jb21wbGV0ZS5HZXRTdXBlcnZpc2lvblRpbWVvdXQoKTsKLSAgICBpZiAoIWNoZWNrX2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhjb25uX2ludGVydmFsLCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmUgZW5oZW5jZWQgY29ubmVjdGlvbiBjb21wbGV0ZSB3aXRoIGludmFsaWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQxNl90IGhhbmRsZSA9IGNvbm5lY3Rpb25fY29tcGxldGUuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgIGF1dG8gcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxMCk7Ci0gICAgYXV0byBlbXBsYWNlX3BhaXIgPSBsZV9hY2xfY29ubmVjdGlvbnNfLmVtcGxhY2UoCi0gICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKLSAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGhhbmRsZSksCi0gICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShyZW1vdGVfYWRkcmVzcywgcXVldWUtPkdldERvd25FbmQoKSwgaGFuZGxlcl8pKTsKLSAgICBBU1NFUlQoZW1wbGFjZV9wYWlyLnNlY29uZCk7ICAvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkdXBsaWNhdGUKLSAgICBhdXRvJiBjb25uZWN0aW9uX3Byb3h5ID0gZW1wbGFjZV9wYWlyLmZpcnN0LT5zZWNvbmQ7Ci0gICAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkxFLCBoYW5kbGUsIHF1ZXVlKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uKG5ldyBMZUFjbENvbm5lY3Rpb24oCi0gICAgICAgIHN0ZDo6bW92ZShxdWV1ZSksIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8sIGhhbmRsZSwgbG9jYWxfYWRkcmVzcywgcmVtb3RlX2FkZHJlc3MsIHJvbGUpKTsKLSAgICBjb25uZWN0aW9uX3Byb3h5LmxlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfID0gY29ubmVjdGlvbi0+R2V0RXZlbnRDYWxsYmFja3MoKTsKLSAgICBsZV9jbGllbnRfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmTGVDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkxlQ29ubmVjdFN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGxlX2NsaWVudF9jYWxsYmFja3NfKSwgcmVtb3RlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNvbm5lY3Rpb24pKSk7Ci0gIH0KLQotICB2b2lkIG9uX2xlX2Nvbm5lY3Rpb25fdXBkYXRlX2NvbXBsZXRlKExlTWV0YUV2ZW50VmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVDb25uZWN0aW9uVXBkYXRlQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBvbl9sZV9jb25uZWN0aW9uX3VwZGF0ZV9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gaGFuZGxlID0gY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBjb25uZWN0aW9uIDB4JWh4IiwgaGFuZGxlKTsKLSAgICAgIEFTU0VSVCghY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FsbGJhY2tzLT5PbkNvbm5lY3Rpb25VcGRhdGUoCi0gICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCksCi0gICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0Q29ubkludGVydmFsKCksCi0gICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0Q29ubkxhdGVuY3koKSwKLSAgICAgICAgY29tcGxldGVfdmlldy5HZXRTdXBlcnZpc2lvblRpbWVvdXQoKSk7Ci0gIH0KLQotICB2b2lkIG9uX2xlX3BoeV91cGRhdGVfY29tcGxldGUoTGVNZXRhRXZlbnRWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVBoeVVwZGF0ZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIGlmICghY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgb25fbGVfcGh5X3VwZGF0ZV9jb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gaGFuZGxlID0gY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBjb25uZWN0aW9uIDB4JWh4IiwgaGFuZGxlKTsKLSAgICAgIEFTU0VSVCghY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FsbGJhY2tzLT5PblBoeVVwZGF0ZShjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpLCBjb21wbGV0ZV92aWV3LkdldFR4UGh5KCksIGNvbXBsZXRlX3ZpZXcuR2V0UnhQaHkoKSk7Ci0gIH0KLQotICB2b2lkIG9uX2xlX3JlYWRfcmVtb3RlX3ZlcnNpb25faW5mb3JtYXRpb24oCi0gICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSB7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfSU5GTygiTm8gbGUgY29ubmVjdGlvbiByZWdpc3RlcmVkIGZvciAweCVoeCIsIGhhbmRsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhbGxiYWNrcy0+T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUoaGNpX3N0YXR1cywgdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgfQotCi0gIHZvaWQgZW5xdWV1ZV9jb21tYW5kKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZF9wYWNrZXQpIHsKLSAgICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgc3RkOjptb3ZlKGNvbW1hbmRfcGFja2V0KSwKLSAgICAgICAgaGFuZGxlcl8tPkJpbmRPbmNlKCZMZUFkZHJlc3NNYW5hZ2VyOjpPbkNvbW1hbmRDb21wbGV0ZSwgY29tbW9uOjpVbnJldGFpbmVkKGxlX2FkZHJlc3NfbWFuYWdlcl8pKSk7Ci0gIH0KLQotICB2b2lkIG9uX2RhdGFfbGVuZ3RoX2NoYW5nZShMZU1ldGFFdmVudFZpZXcgdmlldykgewotICAgIGF1dG8gZGF0YV9sZW5ndGhfdmlldyA9IExlRGF0YUxlbmd0aENoYW5nZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBpZiAoIWRhdGFfbGVuZ3RoX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIkludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gaGFuZGxlID0gZGF0YV9sZW5ndGhfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgYXV0byBjYWxsYmFja3MgPSBnZXRfY2FsbGJhY2tzKGhhbmRsZSk7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBjb25uZWN0aW9uIDB4JWh4IiwgaGFuZGxlKTsKLSAgICAgIEFTU0VSVCghY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FsbGJhY2tzLT5PbkRhdGFMZW5ndGhDaGFuZ2UoCi0gICAgICAgIGRhdGFfbGVuZ3RoX3ZpZXcuR2V0TWF4VHhPY3RldHMoKSwKLSAgICAgICAgZGF0YV9sZW5ndGhfdmlldy5HZXRNYXhUeFRpbWUoKSwKLSAgICAgICAgZGF0YV9sZW5ndGhfdmlldy5HZXRNYXhSeE9jdGV0cygpLAotICAgICAgICBkYXRhX2xlbmd0aF92aWV3LkdldE1heFJ4VGltZSgpKTsKLSAgfQotCi0gIHZvaWQgb25fcmVtb3RlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyX3JlcXVlc3QoTGVNZXRhRXZlbnRWaWV3IHZpZXcpIHsKLSAgICBhdXRvIHJlcXVlc3RfdmlldyA9IExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgaWYgKCFyZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIkludmFsaWQgcGFja2V0Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBoYW5kbGUgPSByZXF1ZXN0X3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgIGF1dG8gY2FsbGJhY2tzID0gZ2V0X2NhbGxiYWNrcyhoYW5kbGUpOwotICAgIGlmIChjYWxsYmFja3MgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIkNhbid0IGZpbmQgY29ubmVjdGlvbiAweCVoeCIsIGhhbmRsZSk7Ci0gICAgICBBU1NFUlQoIWNyYXNoX29uX3Vua25vd25faGFuZGxlXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIFRPRE86IHRoaXMgaXMgYmxpbmRseSBhY2NlcHRpbmcgYW55IHBhcmFtZXRlcnMsIGp1c3Qgc28gd2UgZG9uJ3QgaGFuZyBjb25uZWN0aW9uCi0gICAgLy8gaGF2ZSBwcm9wZXIgcGFyYW1ldGVyIG5lZ290aWF0aW9uCi0gICAgbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIHJlcXVlc3Rfdmlldy5HZXRJbnRlcnZhbE1pbigpLAotICAgICAgICAgICAgcmVxdWVzdF92aWV3LkdldEludGVydmFsTWF4KCksCi0gICAgICAgICAgICByZXF1ZXN0X3ZpZXcuR2V0TGF0ZW5jeSgpLAotICAgICAgICAgICAgcmVxdWVzdF92aWV3LkdldFRpbWVvdXQoKSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAwKSwKLSAgICAgICAgaGFuZGxlcl8tPkJpbmRPbmNlKFtdKENvbW1hbmRDb21wbGV0ZVZpZXcgc3RhdHVzKSB7fSkpOwotICB9Ci0KLSAgdm9pZCBhZGRfZGV2aWNlX3RvX2Nvbm5lY3RfbGlzdChBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBBZGRyZXNzVHlwZSBhZGRyZXNzX3R5cGUgPSBhZGRyZXNzX3dpdGhfdHlwZS5HZXRBZGRyZXNzVHlwZSgpOwotICAgIGlmICghYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWQpIHsKLSAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKHRoaXMpOwotICAgICAgYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWQgPSB0cnVlOwotICAgIH0KLSAgICBwYXVzZV9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICBzd2l0Y2ggKGFkZHJlc3NfdHlwZSkgewotICAgICAgY2FzZSBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOgotICAgICAgY2FzZSBBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1M6IHsKLSAgICAgICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWRkRGV2aWNlVG9Db25uZWN0TGlzdChDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpQVUJMSUMsIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTOgotICAgICAgY2FzZSBBZGRyZXNzVHlwZTo6UkFORE9NX0lERU5USVRZX0FERFJFU1M6IHsKLSAgICAgICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWRkRGV2aWNlVG9Db25uZWN0TGlzdChDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpSQU5ET00sIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBhZGRfZGV2aWNlX3RvX3Jlc29sdmluZ19saXN0KAotICAgICAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIHBlZXJfaXJrLAotICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGxvY2FsX2lyaykgewotICAgIEFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSA9IGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCk7Ci0gICAgaWYgKCFhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZCkgewotICAgICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+UmVnaXN0ZXIodGhpcyk7Ci0gICAgICBhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgfQotICAgIHBhdXNlX2Nvbm5lY3Rpb24gPSB0cnVlOwotICAgIHN3aXRjaCAoYWRkcmVzc190eXBlKSB7Ci0gICAgICBjYXNlIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M6Ci0gICAgICBjYXNlIEFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTUzogewotICAgICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5BZGREZXZpY2VUb1Jlc29sdmluZ0xpc3QoCi0gICAgICAgICAgICBQZWVyQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywgYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzcygpLCBwZWVyX2lyaywgbG9jYWxfaXJrKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1M6Ci0gICAgICBjYXNlIEFkZHJlc3NUeXBlOjpSQU5ET01fSURFTlRJVFlfQUREUkVTUzogewotICAgICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5BZGREZXZpY2VUb1Jlc29sdmluZ0xpc3QoCi0gICAgICAgICAgICBQZWVyQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywgYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzcygpLCBwZWVyX2lyaywgbG9jYWxfaXJrKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIGNyZWF0ZV9sZV9jb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSwgYm9vbCBhZGRfdG9fY29ubmVjdF9saXN0LCBib29sIGlzX2RpcmVjdCkgewotICAgIC8vIFRPRE86IENvbmZpZ3VyZSBkZWZhdWx0IExFIGNvbm5lY3Rpb24gcGFyYW1ldGVycz8KLSAgICBpZiAoYWRkX3RvX2Nvbm5lY3RfbGlzdCkgewotICAgICAgYWRkX2RldmljZV90b19jb25uZWN0X2xpc3QoYWRkcmVzc193aXRoX3R5cGUpOwotICAgICAgaWYgKGlzX2RpcmVjdCkgewotICAgICAgICBkaXJlY3RfY29ubmVjdGlvbnNfLmluc2VydChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgICAgIGlmIChjcmVhdGVfY29ubmVjdGlvbl90aW1lb3V0X2FsYXJtc18uZmluZChhZGRyZXNzX3dpdGhfdHlwZSkgPT0gY3JlYXRlX2Nvbm5lY3Rpb25fdGltZW91dF9hbGFybXNfLmVuZCgpKSB7Ci0gICAgICAgICAgY3JlYXRlX2Nvbm5lY3Rpb25fdGltZW91dF9hbGFybXNfLmVtcGxhY2UoCi0gICAgICAgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKLSAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSwgYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzc1R5cGUoKSksCi0gICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShoYW5kbGVyXykpOwotICAgICAgICAgIGNyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXRfYWxhcm1zXy5hdChhZGRyZXNzX3dpdGhfdHlwZSkKLSAgICAgICAgICAgICAgLlNjaGVkdWxlKAotICAgICAgICAgICAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmbGVfaW1wbDo6b25fY3JlYXRlX2Nvbm5lY3Rpb25fdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBhZGRyZXNzX3dpdGhfdHlwZSksCi0gICAgICAgICAgICAgICAgICBrQ3JlYXRlQ29ubmVjdGlvblRpbWVvdXRNcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkKSB7Ci0gICAgICBhdXRvIHBvbGljeSA9IGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKHRoaXMpOwotICAgICAgYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWQgPSB0cnVlOwotCi0gICAgICAvLyBQYXVzZSBjb25uZWN0aW9uLCB3YWl0IGZvciBzZXQgcmFuZG9tIGFkZHJlc3MgY29tcGxldGUKLSAgICAgIGlmIChwb2xpY3kgPT0gTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUyB8fAotICAgICAgICAgIHBvbGljeSA9PSBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgICAgICBwYXVzZV9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGF1c2VfY29ubmVjdGlvbikgewotICAgICAgY2FuY2VsZWRfY29ubmVjdGlvbnNfLmluc2VydChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChsZV9jbGllbnRfY2FsbGJhY2tzXyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfRVJST1IoIk5vIGNhbGxiYWNrcyB0byBjYWxsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdWludDE2X3QgbGVfc2Nhbl9pbnRlcnZhbCA9IGtTY2FuSW50ZXJ2YWxTbG93OwotICAgIHVpbnQxNl90IGxlX3NjYW5fd2luZG93ID0ga1NjYW5XaW5kb3dTbG93OwotICAgIHVpbnQxNl90IGxlX3NjYW5fd2luZG93XzJtID0ga1NjYW5XaW5kb3dTbG93OwotICAgIHVpbnQxNl90IGxlX3NjYW5fd2luZG93X2NvZGVkID0ga1NjYW5XaW5kb3dTbG93OwotICAgIC8vIElmIHRoZXJlIGlzIGFueSBkaXJlY3QgY29ubmVjdGlvbiBpbiB0aGUgY29ubmVjdGlvbiBsaXN0LCB1c2UgdGhlIGZhc3QgcGFyYW1ldGVyCi0gICAgaWYgKCFkaXJlY3RfY29ubmVjdGlvbnNfLmVtcHR5KCkpIHsKLSAgICAgIGxlX3NjYW5faW50ZXJ2YWwgPSBrU2NhbkludGVydmFsRmFzdDsKLSAgICAgIGxlX3NjYW5fd2luZG93ID0ga1NjYW5XaW5kb3dGYXN0OwotICAgICAgbGVfc2Nhbl93aW5kb3dfMm0gPSBrU2NhbldpbmRvdzJtRmFzdDsKLSAgICAgIGxlX3NjYW5fd2luZG93X2NvZGVkID0ga1NjYW5XaW5kb3dDb2RlZEZhc3Q7Ci0gICAgfQotICAgIEluaXRpYXRvckZpbHRlclBvbGljeSBpbml0aWF0b3JfZmlsdGVyX3BvbGljeSA9IEluaXRpYXRvckZpbHRlclBvbGljeTo6VVNFX0NPTk5FQ1RfTElTVDsKLSAgICBPd25BZGRyZXNzVHlwZSBvd25fYWRkcmVzc190eXBlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8T3duQWRkcmVzc1R5cGU+KGxlX2FkZHJlc3NfbWFuYWdlcl8tPkdldEN1cnJlbnRBZGRyZXNzKCkuR2V0QWRkcmVzc1R5cGUoKSk7Ci0gICAgdWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4gPSAweDAwMTg7Ci0gICAgdWludDE2X3QgY29ubl9pbnRlcnZhbF9tYXggPSAweDAwMjg7Ci0gICAgdWludDE2X3QgY29ubl9sYXRlbmN5ID0gMHgwMDAwOwotICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQgPSAweDAwMWY0OwotICAgIEFTU0VSVChjaGVja19jb25uZWN0aW9uX3BhcmFtZXRlcnMoY29ubl9pbnRlcnZhbF9taW4sIGNvbm5faW50ZXJ2YWxfbWF4LCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpKTsKLQotICAgIGNvbm5lY3RpbmdfbGVfLmluc2VydChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0KLSAgICBpZiAoaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kgPT0gSW5pdGlhdG9yRmlsdGVyUG9saWN5OjpVU0VfQ09OTkVDVF9MSVNUKSB7Ci0gICAgICBhZGRyZXNzX3dpdGhfdHlwZSA9IEFkZHJlc3NXaXRoVHlwZSgpOwotICAgIH0KLQotICAgIGlmIChjb250cm9sbGVyXy0+SXNTdXBwb3J0ZWQoT3BDb2RlOjpMRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTikpIHsKLSAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzID0gUEhZX0xFXzFNOwotICAgICAgc3RkOjp2ZWN0b3I8TGVDcmVhdGVDb25uUGh5U2NhblBhcmFtZXRlcnM+IHBhcmFtZXRlcnMgPSB7fTsKLSAgICAgIExlQ3JlYXRlQ29ublBoeVNjYW5QYXJhbWV0ZXJzIHNjYW5fcGFyYW1ldGVyczsKLSAgICAgIHNjYW5fcGFyYW1ldGVycy5zY2FuX2ludGVydmFsXyA9IGxlX3NjYW5faW50ZXJ2YWw7Ci0gICAgICBzY2FuX3BhcmFtZXRlcnMuc2Nhbl93aW5kb3dfID0gbGVfc2Nhbl93aW5kb3c7Ci0gICAgICBzY2FuX3BhcmFtZXRlcnMuY29ubl9pbnRlcnZhbF9taW5fID0gY29ubl9pbnRlcnZhbF9taW47Ci0gICAgICBzY2FuX3BhcmFtZXRlcnMuY29ubl9pbnRlcnZhbF9tYXhfID0gY29ubl9pbnRlcnZhbF9tYXg7Ci0gICAgICBzY2FuX3BhcmFtZXRlcnMuY29ubl9sYXRlbmN5XyA9IGNvbm5fbGF0ZW5jeTsKLSAgICAgIHNjYW5fcGFyYW1ldGVycy5zdXBlcnZpc2lvbl90aW1lb3V0XyA9IHN1cGVydmlzaW9uX3RpbWVvdXQ7Ci0gICAgICBzY2FuX3BhcmFtZXRlcnMubWluX2NlX2xlbmd0aF8gPSAweDAwOwotICAgICAgc2Nhbl9wYXJhbWV0ZXJzLm1heF9jZV9sZW5ndGhfID0gMHgwMDsKLSAgICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHNjYW5fcGFyYW1ldGVycyk7Ci0KLSAgICAgIGlmIChjb250cm9sbGVyXy0+U3VwcG9ydHNCbGUybVBoeSgpKSB7Ci0gICAgICAgIExlQ3JlYXRlQ29ublBoeVNjYW5QYXJhbWV0ZXJzIHNjYW5fcGFyYW1ldGVyc18ybTsKLSAgICAgICAgc2Nhbl9wYXJhbWV0ZXJzXzJtLnNjYW5faW50ZXJ2YWxfID0gbGVfc2Nhbl9pbnRlcnZhbDsKLSAgICAgICAgc2Nhbl9wYXJhbWV0ZXJzXzJtLnNjYW5fd2luZG93XyA9IGxlX3NjYW5fd2luZG93XzJtOwotICAgICAgICBzY2FuX3BhcmFtZXRlcnNfMm0uY29ubl9pbnRlcnZhbF9taW5fID0gY29ubl9pbnRlcnZhbF9taW47Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc18ybS5jb25uX2ludGVydmFsX21heF8gPSBjb25uX2ludGVydmFsX21heDsKLSAgICAgICAgc2Nhbl9wYXJhbWV0ZXJzXzJtLmNvbm5fbGF0ZW5jeV8gPSBjb25uX2xhdGVuY3k7Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc18ybS5zdXBlcnZpc2lvbl90aW1lb3V0XyA9IHN1cGVydmlzaW9uX3RpbWVvdXQ7Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc18ybS5taW5fY2VfbGVuZ3RoXyA9IDB4MDA7Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc18ybS5tYXhfY2VfbGVuZ3RoXyA9IDB4MDA7Ci0gICAgICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHNjYW5fcGFyYW1ldGVyc18ybSk7Ci0gICAgICAgIGluaXRpYXRpbmdfcGh5cyB8PSBQSFlfTEVfMk07Ci0gICAgICB9Ci0gICAgICBpZiAoY29udHJvbGxlcl8tPlN1cHBvcnRzQmxlQ29kZWRQaHkoKSkgewotICAgICAgICBMZUNyZWF0ZUNvbm5QaHlTY2FuUGFyYW1ldGVycyBzY2FuX3BhcmFtZXRlcnNfY29kZWQ7Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc19jb2RlZC5zY2FuX2ludGVydmFsXyA9IGxlX3NjYW5faW50ZXJ2YWw7Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc19jb2RlZC5zY2FuX3dpbmRvd18gPSBsZV9zY2FuX3dpbmRvd19jb2RlZDsKLSAgICAgICAgc2Nhbl9wYXJhbWV0ZXJzX2NvZGVkLmNvbm5faW50ZXJ2YWxfbWluXyA9IGNvbm5faW50ZXJ2YWxfbWluOwotICAgICAgICBzY2FuX3BhcmFtZXRlcnNfY29kZWQuY29ubl9pbnRlcnZhbF9tYXhfID0gY29ubl9pbnRlcnZhbF9tYXg7Ci0gICAgICAgIHNjYW5fcGFyYW1ldGVyc19jb2RlZC5jb25uX2xhdGVuY3lfID0gY29ubl9sYXRlbmN5OwotICAgICAgICBzY2FuX3BhcmFtZXRlcnNfY29kZWQuc3VwZXJ2aXNpb25fdGltZW91dF8gPSBzdXBlcnZpc2lvbl90aW1lb3V0OwotICAgICAgICBzY2FuX3BhcmFtZXRlcnNfY29kZWQubWluX2NlX2xlbmd0aF8gPSAweDAwOwotICAgICAgICBzY2FuX3BhcmFtZXRlcnNfY29kZWQubWF4X2NlX2xlbmd0aF8gPSAweDAwOwotICAgICAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayhzY2FuX3BhcmFtZXRlcnNfY29kZWQpOwotICAgICAgICBpbml0aWF0aW5nX3BoeXMgfD0gUEhZX0xFX0NPREVEOwotICAgICAgfQotCi0gICAgICBsZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICBMZUV4dGVuZGVkQ3JlYXRlQ29ubmVjdGlvbkJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCksCi0gICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgaW5pdGlhdGluZ19waHlzLAotICAgICAgICAgICAgICBwYXJhbWV0ZXJzKSwKLSAgICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2UoW10oQ29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7Ci0gICAgICAgICAgICBBU1NFUlQoc3RhdHVzLklzVmFsaWQoKSk7Ci0gICAgICAgICAgICBBU1NFUlQoc3RhdHVzLkdldENvbW1hbmRPcENvZGUoKSA9PSBPcENvZGU6OkxFX0VYVEVOREVEX0NSRUFURV9DT05ORUNUSU9OKTsKLSAgICAgICAgICB9KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlQ3JlYXRlQ29ubmVjdGlvbkJ1aWxkZXI6OkNyZWF0ZShsZV9zY2FuX2ludGVydmFsLCBsZV9zY2FuX3dpbmRvdywgaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCksIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZSwgY29ubl9pbnRlcnZhbF9taW4sIGNvbm5faW50ZXJ2YWxfbWF4LCBjb25uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzaW9uX3RpbWVvdXQsIGtNaW5pbXVtQ2VMZW5ndGgsIGtNYXhpbXVtQ2VMZW5ndGgpLAotICAgICAgICAgIGhhbmRsZXJfLT5CaW5kT25jZShbXShDb21tYW5kU3RhdHVzVmlldyBzdGF0dXMpIHsKLSAgICAgICAgICAgIEFTU0VSVChzdGF0dXMuSXNWYWxpZCgpKTsKLSAgICAgICAgICAgIEFTU0VSVChzdGF0dXMuR2V0Q29tbWFuZE9wQ29kZSgpID09IE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT04pOwotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9uX2NyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXQoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gICAgTE9HX0lORk8oIm9uX2NyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXQsIGFkZHJlc3M6ICVzIiwgYWRkcmVzc193aXRoX3R5cGUuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBpZiAoY3JlYXRlX2Nvbm5lY3Rpb25fdGltZW91dF9hbGFybXNfLmZpbmQoYWRkcmVzc193aXRoX3R5cGUpICE9IGNyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXRfYWxhcm1zXy5lbmQoKSkgewotICAgICAgY3JlYXRlX2Nvbm5lY3Rpb25fdGltZW91dF9hbGFybXNfLmF0KGFkZHJlc3Nfd2l0aF90eXBlKS5DYW5jZWwoKTsKLSAgICAgIGNyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXRfYWxhcm1zXy5lcmFzZShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgICBpZiAoYmFja2dyb3VuZF9jb25uZWN0aW9uc18uZmluZChhZGRyZXNzX3dpdGhfdHlwZSkgIT0gYmFja2dyb3VuZF9jb25uZWN0aW9uc18uZW5kKCkpIHsKLSAgICAgICAgZGlyZWN0X2Nvbm5lY3Rpb25zXy5lcmFzZShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgICAgIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgTGVDcmVhdGVDb25uZWN0aW9uQ2FuY2VsQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2UoJmxlX2ltcGw6Om9uX2NyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF9jb21wbGV0ZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYW5jZWxfY29ubmVjdChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgICB9Ci0gICAgICBsZV9jbGllbnRfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICAgICAmTGVDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkxlQ29ubmVjdEZhaWwsCi0gICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGxlX2NsaWVudF9jYWxsYmFja3NfKSwKLSAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICBFcnJvckNvZGU6OkNPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGNhbmNlbF9jb25uZWN0KEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgewotICAgIC8vIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2FuY2VsZWQgYnkgTGVBZGRyZXNzTWFuYWdlci5PblBhdXNlKCkKLSAgICByZW1vdmVfZGV2aWNlX2Zyb21fY29ubmVjdF9saXN0KGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgfQotCi0gIHZvaWQgc2V0X2xlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfcGFyYW1ldGVycyh1aW50MTZfdCBsZW5ndGgsIHVpbnQxNl90IHRpbWUpIHsKLSAgICBhdXRvIHBhY2tldCA9IExlV3JpdGVTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aEJ1aWxkZXI6OkNyZWF0ZShsZW5ndGgsIHRpbWUpOwotICAgIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUocGFja2V0KSwgaGFuZGxlcl8tPkJpbmRPbmNlKFtdKENvbW1hbmRDb21wbGV0ZVZpZXcgY29tcGxldGUpIHt9KSk7Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9kZXZpY2VfZnJvbV9jb25uZWN0X2xpc3QoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gICAgQWRkcmVzc1R5cGUgYWRkcmVzc190eXBlID0gYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzc1R5cGUoKTsKLSAgICBkaXJlY3RfY29ubmVjdGlvbnNfLmVyYXNlKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgICBpZiAoIWFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkKSB7Ci0gICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5SZWdpc3Rlcih0aGlzKTsKLSAgICAgIGFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcGF1c2VfY29ubmVjdGlvbiA9IHRydWU7Ci0gICAgc3dpdGNoIChhZGRyZXNzX3R5cGUpIHsKLSAgICAgIGNhc2UgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzoKLSAgICAgIGNhc2UgQWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTOiB7Ci0gICAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdCgKLSAgICAgICAgICAgIENvbm5lY3RMaXN0QWRkcmVzc1R5cGU6OlBVQkxJQywgYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzcygpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1M6Ci0gICAgICBjYXNlIEFkZHJlc3NUeXBlOjpSQU5ET01fSURFTlRJVFlfQUREUkVTUzogewotICAgICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5SZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3QoCi0gICAgICAgICAgICBDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpSQU5ET00sIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZW1vdmVfZGV2aWNlX2Zyb21fcmVzb2x2aW5nX2xpc3QoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gICAgQWRkcmVzc1R5cGUgYWRkcmVzc190eXBlID0gYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzc1R5cGUoKTsKLSAgICBpZiAoIWFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkKSB7Ci0gICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5SZWdpc3Rlcih0aGlzKTsKLSAgICAgIGFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcGF1c2VfY29ubmVjdGlvbiA9IHRydWU7Ci0gICAgc3dpdGNoIChhZGRyZXNzX3R5cGUpIHsKLSAgICAgIGNhc2UgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzoKLSAgICAgIGNhc2UgQWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTOiB7Ci0gICAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KAotICAgICAgICAgICAgUGVlckFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX09SX0lERU5USVRZX0FERFJFU1MsIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTOgotICAgICAgY2FzZSBBZGRyZXNzVHlwZTo6UkFORE9NX0lERU5USVRZX0FERFJFU1M6IHsKLSAgICAgICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+UmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3QoCi0gICAgICAgICAgICBQZWVyQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywgYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzcygpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIGNsZWFyX3Jlc29sdmluZ19saXN0KCkgewotICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkNsZWFyUmVzb2x2aW5nTGlzdCgpOwotICB9Ci0KLSAgdm9pZCBzZXRfcHJpdmFjeV9wb2xpY3lfZm9yX2luaXRpYXRvcl9hZGRyZXNzKAotICAgICAgTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeSBhZGRyZXNzX3BvbGljeSwKLSAgICAgIEFkZHJlc3NXaXRoVHlwZSBmaXhlZF9hZGRyZXNzLAotICAgICAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcm90YXRpb25faXJrLAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1heGltdW1fcm90YXRpb25fdGltZSkgewotICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKAotICAgICAgICBhZGRyZXNzX3BvbGljeSwKLSAgICAgICAgZml4ZWRfYWRkcmVzcywKLSAgICAgICAgcm90YXRpb25faXJrLAotICAgICAgICBjb250cm9sbGVyXy0+U3VwcG9ydHNCbGVQcml2YWN5KCksCi0gICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lKTsKLSAgfQotCi0gIC8vIFRPRE8oanBhd2xvd3NraSk6IHJlbW92ZSBvbmNlIHdlIGhhdmUgY29uZmlnIGZpbGUgYWJzdHJhY3Rpb24gaW4gY2VydCB0ZXN0cwotICB2b2lkIHNldF9wcml2YWN5X3BvbGljeV9mb3JfaW5pdGlhdG9yX2FkZHJlc3NfZm9yX3Rlc3QoCi0gICAgICBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgICAgQWRkcmVzc1dpdGhUeXBlIGZpeGVkX2FkZHJlc3MsCi0gICAgICBjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNiByb3RhdGlvbl9pcmssCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWF4aW11bV9yb3RhdGlvbl90aW1lKSB7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+U2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3NGb3JUZXN0KAotICAgICAgICBhZGRyZXNzX3BvbGljeSwgZml4ZWRfYWRkcmVzcywgcm90YXRpb25faXJrLCBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsIG1heGltdW1fcm90YXRpb25fdGltZSk7Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9yZWdpc3Rlcl9sZV9jYWxsYmFja3MoTGVDb25uZWN0aW9uQ2FsbGJhY2tzKiBjYWxsYmFja3MsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gICAgQVNTRVJUKGxlX2NsaWVudF9jYWxsYmFja3NfID09IG51bGxwdHIpOwotICAgIEFTU0VSVChsZV9jbGllbnRfaGFuZGxlcl8gPT0gbnVsbHB0cik7Ci0gICAgbGVfY2xpZW50X2NhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0gICAgbGVfY2xpZW50X2hhbmRsZXJfID0gaGFuZGxlcjsKLSAgfQotCi0gIHZvaWQgaGFuZGxlX3VucmVnaXN0ZXJfbGVfY2FsbGJhY2tzKExlQ29ubmVjdGlvbkNhbGxiYWNrcyogY2FsbGJhY2tzLCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIEFTU0VSVF9MT0cobGVfY2xpZW50X2NhbGxiYWNrc18gPT0gY2FsbGJhY2tzLCAiUmVnaXN0ZXJlZCBsZSBjYWxsYmFjayBlbnRpdHkgaXMgZGlmZmVyZW50IHRoZW4gdW5yZWdpc3RlciByZXF1ZXN0Iik7Ci0gICAgbGVfY2xpZW50X2NhbGxiYWNrc18gPSBudWxscHRyOwotICAgIGxlX2NsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIGJvb2wgY2hlY2tfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKAotICAgICAgdWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4sIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWF4LCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgICBpZiAoY29ubl9pbnRlcnZhbF9taW4gPCAweDAwMDYgfHwgY29ubl9pbnRlcnZhbF9taW4gPiAweDBDODAgfHwgY29ubl9pbnRlcnZhbF9tYXggPCAweDAwMDYgfHwKLSAgICAgICAgY29ubl9pbnRlcnZhbF9tYXggPiAweDBDODAgfHwgY29ubl9sYXRlbmN5ID4gMHgwMUYzIHx8IHN1cGVydmlzaW9uX3RpbWVvdXQgPCAweDAwMEEgfHwKLSAgICAgICAgc3VwZXJ2aXNpb25fdGltZW91dCA+IDB4MEM4MCkgewotICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIHBhcmFtZXRlciIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRoZSBNYXhpbXVtIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyB3aWxsIGJlIGNvbm5faW50ZXJ2YWxfbWF4ICogMS4yNSBtcwotICAgIC8vIFRoZSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB3aWxsIGJlIGV4cGVjdGVkX3N1cGVydmlzaW9uX3RpbWVvdXQgKiAxMCBtcwotICAgIC8vIFRoZSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBzaGFsbCBiZSBsYXJnZXIgdGhhbiAoMSArIExhdGVuY3kpICogSW50ZXJ2YWxfTWF4ICogMiwgd2hlcmUgSW50ZXJ2YWxfTWF4IGlzIGdpdmVuIGluCi0gICAgLy8gbWlsbGlzZWNvbmRzLgotICAgIHVpbnQzMl90IHN1cGVydmlzaW9uX3RpbWVvdXRfbWluID0gKHVpbnQzMl90KSgxICsgY29ubl9sYXRlbmN5KSAqIGNvbm5faW50ZXJ2YWxfbWF4ICogMiArIDE7Ci0gICAgaWYgKHN1cGVydmlzaW9uX3RpbWVvdXQgKiA4IDwgc3VwZXJ2aXNpb25fdGltZW91dF9taW4gfHwgY29ubl9pbnRlcnZhbF9tYXggPCBjb25uX2ludGVydmFsX21pbikgewotICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIHBhcmFtZXRlciIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBhZGRfZGV2aWNlX3RvX2JhY2tncm91bmRfY29ubmVjdGlvbl9saXN0KEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgewotICAgIGJhY2tncm91bmRfY29ubmVjdGlvbnNfLmluc2VydChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9kZXZpY2VfZnJvbV9iYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fbGlzdChBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zXy5lcmFzZShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIH0KLQotICB2b2lkIE9uUGF1c2UoKSBvdmVycmlkZSB7Ci0gICAgcGF1c2VfY29ubmVjdGlvbiA9IHRydWU7Ci0gICAgaWYgKGNvbm5lY3RpbmdfbGVfLmVtcHR5KCkpIHsKLSAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkFja1BhdXNlKHRoaXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYW5jZWxlZF9jb25uZWN0aW9uc18gPSBjb25uZWN0aW5nX2xlXzsKLSAgICBsZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgTGVDcmVhdGVDb25uZWN0aW9uQ2FuY2VsQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgIGhhbmRsZXJfLT5CaW5kT25jZSgmbGVfaW1wbDo6b25fY3JlYXRlX2Nvbm5lY3Rpb25fY2FuY2VsX2NvbXBsZXRlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5BY2tQYXVzZSh0aGlzKTsKLSAgfQotCi0gIHZvaWQgb25fY3JlYXRlX2Nvbm5lY3Rpb25fY2FuY2VsX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbENvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBlcnJvcl9jb2RlID0gRXJyb3JDb2RlVGV4dChzdGF0dXMpOwotICAgICAgTE9HX1dBUk4oIlJlY2VpdmVkIG9uX2NyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF9jb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvcl9jb2RlLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgY2hlY2tfZm9yX3VucmVnaXN0ZXIoKSB7Ci0gICAgaWYgKGxlX2FjbF9jb25uZWN0aW9uc18uZW1wdHkoKSAmJiBjb25uZWN0aW5nX2xlXy5lbXB0eSgpICYmIGNhbmNlbGVkX2Nvbm5lY3Rpb25zXy5lbXB0eSgpICYmCi0gICAgICAgIGFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkICYmIHJlYWR5X3RvX3VucmVnaXN0ZXIpIHsKLSAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIodGhpcyk7Ci0gICAgICBhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgcGF1c2VfY29ubmVjdGlvbiA9IGZhbHNlOwotICAgICAgcmVhZHlfdG9fdW5yZWdpc3RlciA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25SZXN1bWUoKSBvdmVycmlkZSB7Ci0gICAgcGF1c2VfY29ubmVjdGlvbiA9IGZhbHNlOwotICAgIGlmICghY2FuY2VsZWRfY29ubmVjdGlvbnNfLmVtcHR5KCkpIHsKLSAgICAgIGNyZWF0ZV9sZV9jb25uZWN0aW9uKCpjYW5jZWxlZF9jb25uZWN0aW9uc18uYmVnaW4oKSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2FuY2VsZWRfY29ubmVjdGlvbnNfLmNsZWFyKCk7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWNrUmVzdW1lKHRoaXMpOwotICAgIGNoZWNrX2Zvcl91bnJlZ2lzdGVyKCk7Ci0gIH0KLQotICB1aW50MTZfdCBIQUNLX2dldF9oYW5kbGUoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gbGVfYWNsX2Nvbm5lY3Rpb25zXy5iZWdpbigpOyBpdCAhPSBsZV9hY2xfY29ubmVjdGlvbnNfLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoaXQtPnNlY29uZC5yZW1vdGVfYWRkcmVzc18uR2V0QWRkcmVzcygpID09IGFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIGl0LT5maXJzdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDB4RkZGRjsKLSAgfQotCi0gIHZvaWQgVXBkYXRlTG9jYWxBZGRyZXNzKHVpbnQxNl90IGhhbmRsZSwgaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBhdXRvIGNhbGxiYWNrcyA9IGdldF9jYWxsYmFja3MoaGFuZGxlKTsKLSAgICBpZiAoY2FsbGJhY2tzID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJDYW4ndCBmaW5kIGNvbm5lY3Rpb24gMHglaHgiLCBoYW5kbGUpOwotICAgICAgQVNTRVJUKCFjcmFzaF9vbl91bmtub3duX2hhbmRsZV8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYWxsYmFja3MtPk9uTG9jYWxBZGRyZXNzVXBkYXRlKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01pbmltdW1DZUxlbmd0aCA9IDB4MDAwMjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrTWF4aW11bUNlTGVuZ3RoID0gMHgwQzAwOwotICBIY2lMYXllciogaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIENvbnRyb2xsZXIqIGNvbnRyb2xsZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfID0gbnVsbHB0cjsKLSAgUm91bmRSb2JpblNjaGVkdWxlciogcm91bmRfcm9iaW5fc2NoZWR1bGVyXyA9IG51bGxwdHI7Ci0gIExlQWRkcmVzc01hbmFnZXIqIGxlX2FkZHJlc3NfbWFuYWdlcl8gPSBudWxscHRyOwotICBMZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGxlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8gPSBudWxscHRyOwotICBMZUNvbm5lY3Rpb25DYWxsYmFja3MqIGxlX2NsaWVudF9jYWxsYmFja3NfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGxlX2NsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6bWFwPHVpbnQxNl90LCBsZV9hY2xfY29ubmVjdGlvbj4gbGVfYWNsX2Nvbm5lY3Rpb25zXzsKLSAgc3RkOjpzZXQ8QWRkcmVzc1dpdGhUeXBlPiBjb25uZWN0aW5nX2xlXzsKLSAgc3RkOjpzZXQ8QWRkcmVzc1dpdGhUeXBlPiBjYW5jZWxlZF9jb25uZWN0aW9uc187Ci0gIHN0ZDo6c2V0PEFkZHJlc3NXaXRoVHlwZT4gZGlyZWN0X2Nvbm5lY3Rpb25zXzsKLSAgLy8gU2V0IG9mIGRldmljZXMgdGhhdCB3aWxsIG5vdCBiZSByZW1vdmVkIGZyb20gY29ubmVjdCBsaXN0IGFmdGVyIGRpcmVjdCBjb25uZWN0IHRpbWVvdXQKLSAgc3RkOjpzZXQ8QWRkcmVzc1dpdGhUeXBlPiBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zXzsKLSAgYm9vbCBhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICBib29sIHJlYWR5X3RvX3VucmVnaXN0ZXIgPSBmYWxzZTsKLSAgYm9vbCBwYXVzZV9jb25uZWN0aW9uID0gZmFsc2U7Ci0gIGJvb2wgY3Jhc2hfb25fdW5rbm93bl9oYW5kbGVfID0gZmFsc2U7Ci0gIHN0ZDo6bWFwPEFkZHJlc3NXaXRoVHlwZSwgb3M6OkFsYXJtPiBjcmVhdGVfY29ubmVjdGlvbl90aW1lb3V0X2FsYXJtc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYWNsX21hbmFnZXIKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9hY2xfbWFuYWdlci9yb3VuZF9yb2Jpbl9zY2hlZHVsZXIuY2MgYi9nZC9oY2kvYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJmZmY0Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9yb3VuZF9yb2Jpbl9zY2hlZHVsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9yb3VuZF9yb2Jpbl9zY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvYWNsX2ZyYWdtZW50ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBhY2xfbWFuYWdlciB7Ci0KLVJvdW5kUm9iaW5TY2hlZHVsZXI6OlJvdW5kUm9iaW5TY2hlZHVsZXIoCi0gICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsIENvbnRyb2xsZXIqIGNvbnRyb2xsZXIsIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPEFjbEJ1aWxkZXIsIEFjbFZpZXc+KiBoY2lfcXVldWVfZW5kKQotICAgIDogaGFuZGxlcl8oaGFuZGxlciksIGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpLCBoY2lfcXVldWVfZW5kXyhoY2lfcXVldWVfZW5kKSB7Ci0gIG1heF9hY2xfcGFja2V0X2NyZWRpdHNfID0gY29udHJvbGxlcl8tPkdldE51bUFjbFBhY2tldEJ1ZmZlcnMoKTsKLSAgYWNsX3BhY2tldF9jcmVkaXRzXyA9IG1heF9hY2xfcGFja2V0X2NyZWRpdHNfOwotICBoY2lfbXR1XyA9IGNvbnRyb2xsZXJfLT5HZXRBY2xQYWNrZXRMZW5ndGgoKTsKLSAgTGVCdWZmZXJTaXplIGxlX2J1ZmZlcl9zaXplID0gY29udHJvbGxlcl8tPkdldExlQnVmZmVyU2l6ZSgpOwotICBsZV9tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyA9IGxlX2J1ZmZlcl9zaXplLnRvdGFsX251bV9sZV9wYWNrZXRzXzsKLSAgbGVfYWNsX3BhY2tldF9jcmVkaXRzXyA9IGxlX21heF9hY2xfcGFja2V0X2NyZWRpdHNfOwotICBsZV9oY2lfbXR1XyA9IGxlX2J1ZmZlcl9zaXplLmxlX2RhdGFfcGFja2V0X2xlbmd0aF87Ci0gIGNvbnRyb2xsZXJfLT5SZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayhoYW5kbGVyLT5CaW5kT24odGhpcywgJlJvdW5kUm9iaW5TY2hlZHVsZXI6OmluY29taW5nX2FjbF9jcmVkaXRzKSk7Ci19Ci0KLVJvdW5kUm9iaW5TY2hlZHVsZXI6On5Sb3VuZFJvYmluU2NoZWR1bGVyKCkgewotICB1bnJlZ2lzdGVyX2FsbF9jb25uZWN0aW9ucygpOwotICBjb250cm9sbGVyXy0+VW5yZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjaygpOwotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OlJlZ2lzdGVyKENvbm5lY3Rpb25UeXBlIGNvbm5lY3Rpb25fdHlwZSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWNsX21hbmFnZXI6OkFjbENvbm5lY3Rpb246OlF1ZXVlPiBxdWV1ZSkgewotICBhY2xfcXVldWVfaGFuZGxlciBhY2xfcXVldWVfaGFuZGxlciA9IHtjb25uZWN0aW9uX3R5cGUsIHN0ZDo6bW92ZShxdWV1ZSksIGZhbHNlLCAwfTsKLSAgYWNsX3F1ZXVlX2hhbmRsZXJzXy5pbnNlcnQoc3RkOjpwYWlyPHVpbnQxNl90LCBSb3VuZFJvYmluU2NoZWR1bGVyOjphY2xfcXVldWVfaGFuZGxlcj4oaGFuZGxlLCBhY2xfcXVldWVfaGFuZGxlcikpOwotICBpZiAoZnJhZ21lbnRzX3RvX3NlbmRfLnNpemUoKSA9PSAwKSB7Ci0gICAgc3RhcnRfcm91bmRfcm9iaW4oKTsKLSAgfQotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OlVucmVnaXN0ZXIodWludDE2X3QgaGFuZGxlKSB7Ci0gIEFTU0VSVChhY2xfcXVldWVfaGFuZGxlcnNfLmNvdW50KGhhbmRsZSkgPT0gMSk7Ci0gIGF1dG8gYWNsX3F1ZXVlX2hhbmRsZXIgPSBhY2xfcXVldWVfaGFuZGxlcnNfLmZpbmQoaGFuZGxlKS0+c2Vjb25kOwotICAvLyBSZWNsYWltIG91dHN0YW5kaW5nIHBhY2tldHMKLSAgaWYgKGFjbF9xdWV1ZV9oYW5kbGVyLmNvbm5lY3Rpb25fdHlwZV8gPT0gQ29ubmVjdGlvblR5cGU6OkNMQVNTSUMpIHsKLSAgICBhY2xfcGFja2V0X2NyZWRpdHNfICs9IGFjbF9xdWV1ZV9oYW5kbGVyLm51bWJlcl9vZl9zZW50X3BhY2tldHNfOwotICB9IGVsc2UgewotICAgIGxlX2FjbF9wYWNrZXRfY3JlZGl0c18gKz0gYWNsX3F1ZXVlX2hhbmRsZXIubnVtYmVyX29mX3NlbnRfcGFja2V0c187Ci0gIH0KLSAgYWNsX3F1ZXVlX2hhbmRsZXIubnVtYmVyX29mX3NlbnRfcGFja2V0c18gPSAwOwotCi0gIGlmIChhY2xfcXVldWVfaGFuZGxlci5kZXF1ZXVlX2lzX3JlZ2lzdGVyZWRfKSB7Ci0gICAgYWNsX3F1ZXVlX2hhbmRsZXIuZGVxdWV1ZV9pc19yZWdpc3RlcmVkXyA9IGZhbHNlOwotICAgIGFjbF9xdWV1ZV9oYW5kbGVyLnF1ZXVlXy0+R2V0RG93bkVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICB9Ci0gIGFjbF9xdWV1ZV9oYW5kbGVyc18uZXJhc2UoaGFuZGxlKTsKLSAgc3RhcnRpbmdfcG9pbnRfID0gYWNsX3F1ZXVlX2hhbmRsZXJzXy5iZWdpbigpOwotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OlNldExpbmtQcmlvcml0eSh1aW50MTZfdCBoYW5kbGUsIGJvb2wgaGlnaF9wcmlvcml0eSkgewotICBhdXRvIGFjbF9xdWV1ZV9oYW5kbGVyID0gYWNsX3F1ZXVlX2hhbmRsZXJzXy5maW5kKGhhbmRsZSk7Ci0gIGlmIChhY2xfcXVldWVfaGFuZGxlciA9PSBhY2xfcXVldWVfaGFuZGxlcnNfLmVuZCgpKSB7Ci0gICAgTE9HX1dBUk4oImhhbmRsZSAlZCBpcyBpbnZhbGlkIiwgaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5oaWdoX3ByaW9yaXR5XyA9IGhpZ2hfcHJpb3JpdHk7Ci19Ci0KLXVpbnQxNl90IFJvdW5kUm9iaW5TY2hlZHVsZXI6OkdldENyZWRpdHMoKSB7Ci0gIHJldHVybiBhY2xfcGFja2V0X2NyZWRpdHNfOwotfQotCi11aW50MTZfdCBSb3VuZFJvYmluU2NoZWR1bGVyOjpHZXRMZUNyZWRpdHMoKSB7Ci0gIHJldHVybiBsZV9hY2xfcGFja2V0X2NyZWRpdHNfOwotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OnN0YXJ0X3JvdW5kX3JvYmluKCkgewotICBpZiAoYWNsX3BhY2tldF9jcmVkaXRzXyA9PSAwICYmIGxlX2FjbF9wYWNrZXRfY3JlZGl0c18gPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoIWZyYWdtZW50c190b19zZW5kXy5lbXB0eSgpKSB7Ci0gICAgYXV0byBjb25uZWN0aW9uX3R5cGUgPSBmcmFnbWVudHNfdG9fc2VuZF8uZnJvbnQoKS5maXJzdDsKLSAgICBib29sIGNsYXNzaWNfYnVmZmVyX2Z1bGwgPSBhY2xfcGFja2V0X2NyZWRpdHNfID09IDAgJiYgY29ubmVjdGlvbl90eXBlID09IENvbm5lY3Rpb25UeXBlOjpDTEFTU0lDOwotICAgIGJvb2wgbGVfYnVmZmVyX2Z1bGwgPSBsZV9hY2xfcGFja2V0X2NyZWRpdHNfID09IDAgJiYgY29ubmVjdGlvbl90eXBlID09IENvbm5lY3Rpb25UeXBlOjpMRTsKLSAgICBpZiAoY2xhc3NpY19idWZmZXJfZnVsbCB8fCBsZV9idWZmZXJfZnVsbCkgewotICAgICAgTE9HX1dBUk4oIkJ1ZmZlciBvZiBjb25uZWN0aW9uX3R5cGUgJWQgaXMgZnVsbCIsIGNvbm5lY3Rpb25fdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHNlbmRfbmV4dF9mcmFnbWVudCgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYWNsX3F1ZXVlX2hhbmRsZXJzXy5lbXB0eSgpKSB7Ci0gICAgTE9HX0lORk8oIk5vIGFueSBhY2wgY29ubmVjdGlvbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChhY2xfcXVldWVfaGFuZGxlcnNfLnNpemUoKSA9PSAxIHx8IHN0YXJ0aW5nX3BvaW50XyA9PSBhY2xfcXVldWVfaGFuZGxlcnNfLmVuZCgpKSB7Ci0gICAgc3RhcnRpbmdfcG9pbnRfID0gYWNsX3F1ZXVlX2hhbmRsZXJzXy5iZWdpbigpOwotICB9Ci0gIHNpemVfdCBjb3VudCA9IGFjbF9xdWV1ZV9oYW5kbGVyc18uc2l6ZSgpOwotCi0gIGZvciAoYXV0byBhY2xfcXVldWVfaGFuZGxlciA9IHN0YXJ0aW5nX3BvaW50XzsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0gICAgLy8gUHJldmVudCByZWdpc3RyYXRpb24gd2hlbiBjcmVkaXRzIGlzIHplcm8KLSAgICBib29sIGNsYXNzaWNfYnVmZmVyX2Z1bGwgPQotICAgICAgICBhY2xfcGFja2V0X2NyZWRpdHNfID09IDAgJiYgYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5jb25uZWN0aW9uX3R5cGVfID09IENvbm5lY3Rpb25UeXBlOjpDTEFTU0lDOwotICAgIGJvb2wgbGVfYnVmZmVyX2Z1bGwgPQotICAgICAgICBsZV9hY2xfcGFja2V0X2NyZWRpdHNfID09IDAgJiYgYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5jb25uZWN0aW9uX3R5cGVfID09IENvbm5lY3Rpb25UeXBlOjpMRTsKLSAgICBpZiAoIWFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQuZGVxdWV1ZV9pc19yZWdpc3RlcmVkXyAmJiAhY2xhc3NpY19idWZmZXJfZnVsbCAmJiAhbGVfYnVmZmVyX2Z1bGwpIHsKLSAgICAgIGFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQuZGVxdWV1ZV9pc19yZWdpc3RlcmVkXyA9IHRydWU7Ci0gICAgICBhY2xfcXVldWVfaGFuZGxlci0+c2Vjb25kLnF1ZXVlXy0+R2V0RG93bkVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmUm91bmRSb2JpblNjaGVkdWxlcjo6YnVmZmVyX3BhY2tldCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBhY2xfcXVldWVfaGFuZGxlcikpOwotICAgIH0KLSAgICBhY2xfcXVldWVfaGFuZGxlciA9IHN0ZDo6bmV4dChhY2xfcXVldWVfaGFuZGxlcik7Ci0gICAgaWYgKGFjbF9xdWV1ZV9oYW5kbGVyID09IGFjbF9xdWV1ZV9oYW5kbGVyc18uZW5kKCkpIHsKLSAgICAgIGFjbF9xdWV1ZV9oYW5kbGVyID0gYWNsX3F1ZXVlX2hhbmRsZXJzXy5iZWdpbigpOwotICAgIH0KLSAgfQotCi0gIHN0YXJ0aW5nX3BvaW50XyA9IHN0ZDo6bmV4dChzdGFydGluZ19wb2ludF8pOwotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OmJ1ZmZlcl9wYWNrZXQoc3RkOjptYXA8dWludDE2X3QsIGFjbF9xdWV1ZV9oYW5kbGVyPjo6aXRlcmF0b3IgYWNsX3F1ZXVlX2hhbmRsZXIpIHsKLSAgQnJvYWRjYXN0RmxhZyBicm9hZGNhc3RfZmxhZyA9IEJyb2FkY2FzdEZsYWc6OlBPSU5UX1RPX1BPSU5UOwotICAvLyBXcmFwIHBhY2tldCBhbmQgZW5xdWV1ZSBpdAotICB1aW50MTZfdCBoYW5kbGUgPSBhY2xfcXVldWVfaGFuZGxlci0+Zmlyc3Q7Ci0gIGF1dG8gcGFja2V0ID0gYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5xdWV1ZV8tPkdldERvd25FbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICBBU1NFUlQocGFja2V0ICE9IG51bGxwdHIpOwotCi0gIENvbm5lY3Rpb25UeXBlIGNvbm5lY3Rpb25fdHlwZSA9IGFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQuY29ubmVjdGlvbl90eXBlXzsKLSAgc2l6ZV90IG10dSA9IGNvbm5lY3Rpb25fdHlwZSA9PSBDb25uZWN0aW9uVHlwZTo6Q0xBU1NJQyA/IGhjaV9tdHVfIDogbGVfaGNpX210dV87Ci0gIFBhY2tldEJvdW5kYXJ5RmxhZyBwYWNrZXRfYm91bmRhcnlfZmxhZyA9IChwYWNrZXQtPklzRmx1c2hhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBhY2tldEJvdW5kYXJ5RmxhZzo6RklSU1RfQVVUT01BVElDQUxMWV9GTFVTSEFCTEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0Qm91bmRhcnlGbGFnOjpGSVJTVF9OT05fQVVUT01BVElDQUxMWV9GTFVTSEFCTEU7Ci0KLSAgaW50IGFjbF9wcmlvcml0eSA9IGFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQuaGlnaF9wcmlvcml0eV8gPyAxIDogMDsKLSAgaWYgKHBhY2tldC0+c2l6ZSgpIDw9IG10dSkgewotICAgIGZyYWdtZW50c190b19zZW5kXy5wdXNoKAotICAgICAgICBzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgIGNvbm5lY3Rpb25fdHlwZSwgQWNsQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZSwgcGFja2V0X2JvdW5kYXJ5X2ZsYWcsIGJyb2FkY2FzdF9mbGFnLCBzdGQ6Om1vdmUocGFja2V0KSkpLAotICAgICAgICBhY2xfcHJpb3JpdHkpOwotICB9IGVsc2UgewotICAgIGF1dG8gZnJhZ21lbnRzID0gQWNsRnJhZ21lbnRlcihtdHUsIHN0ZDo6bW92ZShwYWNrZXQpKS5HZXRGcmFnbWVudHMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYWdtZW50cy5zaXplKCk7IGkrKykgewotICAgICAgZnJhZ21lbnRzX3RvX3NlbmRfLnB1c2goCi0gICAgICAgICAgc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgIGNvbm5lY3Rpb25fdHlwZSwKLSAgICAgICAgICAgICAgQWNsQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZSwgcGFja2V0X2JvdW5kYXJ5X2ZsYWcsIGJyb2FkY2FzdF9mbGFnLCBzdGQ6Om1vdmUoZnJhZ21lbnRzW2ldKSkpLAotICAgICAgICAgIGFjbF9wcmlvcml0eSk7Ci0gICAgICBwYWNrZXRfYm91bmRhcnlfZmxhZyA9IFBhY2tldEJvdW5kYXJ5RmxhZzo6Q09OVElOVUlOR19GUkFHTUVOVDsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUKGZyYWdtZW50c190b19zZW5kXy5zaXplKCkgPiAwKTsKLSAgdW5yZWdpc3Rlcl9hbGxfY29ubmVjdGlvbnMoKTsKLQotICBhY2xfcXVldWVfaGFuZGxlci0+c2Vjb25kLm51bWJlcl9vZl9zZW50X3BhY2tldHNfICs9IGZyYWdtZW50c190b19zZW5kXy5zaXplKCk7Ci0gIHNlbmRfbmV4dF9mcmFnbWVudCgpOwotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OnVucmVnaXN0ZXJfYWxsX2Nvbm5lY3Rpb25zKCkgewotICBmb3IgKGF1dG8gYWNsX3F1ZXVlX2hhbmRsZXIgPSBhY2xfcXVldWVfaGFuZGxlcnNfLmJlZ2luKCk7IGFjbF9xdWV1ZV9oYW5kbGVyICE9IGFjbF9xdWV1ZV9oYW5kbGVyc18uZW5kKCk7Ci0gICAgICAgYWNsX3F1ZXVlX2hhbmRsZXIgPSBzdGQ6Om5leHQoYWNsX3F1ZXVlX2hhbmRsZXIpKSB7Ci0gICAgaWYgKGFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQuZGVxdWV1ZV9pc19yZWdpc3RlcmVkXykgewotICAgICAgYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5kZXF1ZXVlX2lzX3JlZ2lzdGVyZWRfID0gZmFsc2U7Ci0gICAgICBhY2xfcXVldWVfaGFuZGxlci0+c2Vjb25kLnF1ZXVlXy0+R2V0RG93bkVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OnNlbmRfbmV4dF9mcmFnbWVudCgpIHsKLSAgaWYgKCFlbnF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKHRydWUpKSB7Ci0gICAgaGNpX3F1ZXVlX2VuZF8tPlJlZ2lzdGVyRW5xdWV1ZSgKLSAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmUm91bmRSb2JpblNjaGVkdWxlcjo6aGFuZGxlX2VucXVldWVfbmV4dF9mcmFnbWVudCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLX0KLQotLy8gSW52b2tlZCBmcm9tIHNvbWUgZXh0ZXJuYWwgUXVldWUgUmVhY3RhYmxlIGNvbnRleHQgMQotc3RkOjp1bmlxdWVfcHRyPEFjbEJ1aWxkZXI+IFJvdW5kUm9iaW5TY2hlZHVsZXI6OmhhbmRsZV9lbnF1ZXVlX25leHRfZnJhZ21lbnQoKSB7Ci0gIENvbm5lY3Rpb25UeXBlIGNvbm5lY3Rpb25fdHlwZSA9IGZyYWdtZW50c190b19zZW5kXy5mcm9udCgpLmZpcnN0OwotICBpZiAoY29ubmVjdGlvbl90eXBlID09IENvbm5lY3Rpb25UeXBlOjpDTEFTU0lDKSB7Ci0gICAgQVNTRVJUKGFjbF9wYWNrZXRfY3JlZGl0c18gPiAwKTsKLSAgICBhY2xfcGFja2V0X2NyZWRpdHNfIC09IDE7Ci0gIH0gZWxzZSB7Ci0gICAgQVNTRVJUKGxlX2FjbF9wYWNrZXRfY3JlZGl0c18gPiAwKTsKLSAgICBsZV9hY2xfcGFja2V0X2NyZWRpdHNfIC09IDE7Ci0gIH0KLQotICBhdXRvIHJhd19wb2ludGVyID0gZnJhZ21lbnRzX3RvX3NlbmRfLmZyb250KCkuc2Vjb25kLnJlbGVhc2UoKTsKLSAgZnJhZ21lbnRzX3RvX3NlbmRfLnBvcCgpOwotICBpZiAoZnJhZ21lbnRzX3RvX3NlbmRfLmVtcHR5KCkpIHsKLSAgICBpZiAoZW5xdWV1ZV9yZWdpc3RlcmVkXy5leGNoYW5nZShmYWxzZSkpIHsKLSAgICAgIGhjaV9xdWV1ZV9lbmRfLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICAgIH0KLSAgICBoYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZSb3VuZFJvYmluU2NoZWR1bGVyOjpzdGFydF9yb3VuZF9yb2JpbiwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQ29ubmVjdGlvblR5cGUgbmV4dF9jb25uZWN0aW9uX3R5cGUgPSBmcmFnbWVudHNfdG9fc2VuZF8uZnJvbnQoKS5maXJzdDsKLSAgICBib29sIGNsYXNzaWNfYnVmZmVyX2Z1bGwgPSBuZXh0X2Nvbm5lY3Rpb25fdHlwZSA9PSBDb25uZWN0aW9uVHlwZTo6Q0xBU1NJQyAmJiBhY2xfcGFja2V0X2NyZWRpdHNfID09IDA7Ci0gICAgYm9vbCBsZV9idWZmZXJfZnVsbCA9IG5leHRfY29ubmVjdGlvbl90eXBlID09IENvbm5lY3Rpb25UeXBlOjpMRSAmJiBsZV9hY2xfcGFja2V0X2NyZWRpdHNfID09IDA7Ci0gICAgaWYgKChjbGFzc2ljX2J1ZmZlcl9mdWxsIHx8IGxlX2J1ZmZlcl9mdWxsKSAmJiBlbnF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKGZhbHNlKSkgewotICAgICAgaGNpX3F1ZXVlX2VuZF8tPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QWNsQnVpbGRlcj4ocmF3X3BvaW50ZXIpOwotfQotCi12b2lkIFJvdW5kUm9iaW5TY2hlZHVsZXI6OmluY29taW5nX2FjbF9jcmVkaXRzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY3JlZGl0cykgewotICBhdXRvIGFjbF9xdWV1ZV9oYW5kbGVyID0gYWNsX3F1ZXVlX2hhbmRsZXJzXy5maW5kKGhhbmRsZSk7Ci0gIGlmIChhY2xfcXVldWVfaGFuZGxlciA9PSBhY2xfcXVldWVfaGFuZGxlcnNfLmVuZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQubnVtYmVyX29mX3NlbnRfcGFja2V0c18gPj0gY3JlZGl0cykgewotICAgIGFjbF9xdWV1ZV9oYW5kbGVyLT5zZWNvbmQubnVtYmVyX29mX3NlbnRfcGFja2V0c18gLT0gY3JlZGl0czsKLSAgfSBlbHNlIHsKLSAgICBMT0dfV0FSTigicmVjZWl2ZSBtb3JlIGNyZWRpdHMgdGhhbiB3ZSBzZW50Iik7Ci0gICAgYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5udW1iZXJfb2Zfc2VudF9wYWNrZXRzXyA9IDA7Ci0gIH0KLQotICBib29sIGNyZWRpdF93YXNfemVybyA9IGZhbHNlOwotICBpZiAoYWNsX3F1ZXVlX2hhbmRsZXItPnNlY29uZC5jb25uZWN0aW9uX3R5cGVfID09IENvbm5lY3Rpb25UeXBlOjpDTEFTU0lDKSB7Ci0gICAgaWYgKGFjbF9wYWNrZXRfY3JlZGl0c18gPT0gMCkgewotICAgICAgY3JlZGl0X3dhc196ZXJvID0gdHJ1ZTsKLSAgICB9Ci0gICAgYWNsX3BhY2tldF9jcmVkaXRzXyArPSBjcmVkaXRzOwotICAgIGlmIChhY2xfcGFja2V0X2NyZWRpdHNfID4gbWF4X2FjbF9wYWNrZXRfY3JlZGl0c18pIHsKLSAgICAgIGFjbF9wYWNrZXRfY3JlZGl0c18gPSBtYXhfYWNsX3BhY2tldF9jcmVkaXRzXzsKLSAgICAgIExPR19XQVJOKCJhY2wgcGFja2V0IGNyZWRpdHMgb3ZlcmZsb3cgZHVlIHRvIHJlY2VpdmUgJWh4IGNyZWRpdHMiLCBjcmVkaXRzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGxlX2FjbF9wYWNrZXRfY3JlZGl0c18gPT0gMCkgewotICAgICAgY3JlZGl0X3dhc196ZXJvID0gdHJ1ZTsKLSAgICB9Ci0gICAgbGVfYWNsX3BhY2tldF9jcmVkaXRzXyArPSBjcmVkaXRzOwotICAgIGlmIChsZV9hY2xfcGFja2V0X2NyZWRpdHNfID4gbGVfbWF4X2FjbF9wYWNrZXRfY3JlZGl0c18pIHsKLSAgICAgIGxlX2FjbF9wYWNrZXRfY3JlZGl0c18gPSBsZV9tYXhfYWNsX3BhY2tldF9jcmVkaXRzXzsKLSAgICAgIExPR19XQVJOKCJsZSBhY2wgcGFja2V0IGNyZWRpdHMgb3ZlcmZsb3cgZHVlIHRvIHJlY2VpdmUgJWh4IGNyZWRpdHMiLCBjcmVkaXRzKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGNyZWRpdF93YXNfemVybykgewotICAgIHN0YXJ0X3JvdW5kX3JvYmluKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFjbF9tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyLmggYi9nZC9oY2kvYWNsX21hbmFnZXIvcm91bmRfcm9iaW5fc2NoZWR1bGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGJmNTEuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL3JvdW5kX3JvYmluX3NjaGVkdWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL211bHRpX3ByaW9yaXR5X3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBSb3VuZFJvYmluU2NoZWR1bGVyIHsKLSBwdWJsaWM6Ci0gIFJvdW5kUm9iaW5TY2hlZHVsZXIoCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlciwgQ29udHJvbGxlciogY29udHJvbGxlciwgY29tbW9uOjpCaWRpUXVldWVFbmQ8QWNsQnVpbGRlciwgQWNsVmlldz4qIGhjaV9xdWV1ZV9lbmQpOwotICB+Um91bmRSb2JpblNjaGVkdWxlcigpOwotCi0gIGVudW0gQ29ubmVjdGlvblR5cGUgeyBDTEFTU0lDLCBMRSB9OwotCi0gIHN0cnVjdCBhY2xfcXVldWVfaGFuZGxlciB7Ci0gICAgQ29ubmVjdGlvblR5cGUgY29ubmVjdGlvbl90eXBlXzsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8YWNsX21hbmFnZXI6OkFjbENvbm5lY3Rpb246OlF1ZXVlPiBxdWV1ZV87Ci0gICAgYm9vbCBkZXF1ZXVlX2lzX3JlZ2lzdGVyZWRfID0gZmFsc2U7Ci0gICAgdWludDE2X3QgbnVtYmVyX29mX3NlbnRfcGFja2V0c18gPSAwOyAgLy8gVHJhY2sgY3JlZGl0cwotICAgIGJvb2wgaGlnaF9wcmlvcml0eV8gPSBmYWxzZTsgICAgICAgICAgIC8vIEZvciBBMmRwIHVzZQotICB9OwotCi0gIHZvaWQgUmVnaXN0ZXIoQ29ubmVjdGlvblR5cGUgY29ubmVjdGlvbl90eXBlLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFjbF9tYW5hZ2VyOjpBY2xDb25uZWN0aW9uOjpRdWV1ZT4gcXVldWUpOwotICB2b2lkIFVucmVnaXN0ZXIodWludDE2X3QgaGFuZGxlKTsKLSAgdm9pZCBTZXRMaW5rUHJpb3JpdHkodWludDE2X3QgaGFuZGxlLCBib29sIGhpZ2hfcHJpb3JpdHkpOwotICB1aW50MTZfdCBHZXRDcmVkaXRzKCk7Ci0gIHVpbnQxNl90IEdldExlQ3JlZGl0cygpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBzdGFydF9yb3VuZF9yb2JpbigpOwotICB2b2lkIGJ1ZmZlcl9wYWNrZXQoc3RkOjptYXA8dWludDE2X3QsIGFjbF9xdWV1ZV9oYW5kbGVyPjo6aXRlcmF0b3IgYWNsX3F1ZXVlX2hhbmRsZXIpOwotICB2b2lkIHVucmVnaXN0ZXJfYWxsX2Nvbm5lY3Rpb25zKCk7Ci0gIHZvaWQgc2VuZF9uZXh0X2ZyYWdtZW50KCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBY2xCdWlsZGVyPiBoYW5kbGVfZW5xdWV1ZV9uZXh0X2ZyYWdtZW50KCk7Ci0gIHZvaWQgaW5jb21pbmdfYWNsX2NyZWRpdHModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKTsKLQotICBvczo6SGFuZGxlciogaGFuZGxlcl8gPSBudWxscHRyOwotICBDb250cm9sbGVyKiBjb250cm9sbGVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6bWFwPHVpbnQxNl90LCBhY2xfcXVldWVfaGFuZGxlcj4gYWNsX3F1ZXVlX2hhbmRsZXJzXzsKLSAgY29tbW9uOjpNdWx0aVByaW9yaXR5UXVldWU8c3RkOjpwYWlyPENvbm5lY3Rpb25UeXBlLCBzdGQ6OnVuaXF1ZV9wdHI8QWNsQnVpbGRlcj4+LCAyPiBmcmFnbWVudHNfdG9fc2VuZF87Ci0gIHVpbnQxNl90IG1heF9hY2xfcGFja2V0X2NyZWRpdHNfID0gMDsKLSAgdWludDE2X3QgYWNsX3BhY2tldF9jcmVkaXRzXyA9IDA7Ci0gIHVpbnQxNl90IGxlX21heF9hY2xfcGFja2V0X2NyZWRpdHNfID0gMDsKLSAgdWludDE2X3QgbGVfYWNsX3BhY2tldF9jcmVkaXRzXyA9IDA7Ci0gIHNpemVfdCBoY2lfbXR1X3swfTsKLSAgc2l6ZV90IGxlX2hjaV9tdHVfezB9OwotICBzdGQ6OmF0b21pY19ib29sIGVucXVldWVfcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLSAgY29tbW9uOjpCaWRpUXVldWVFbmQ8QWNsQnVpbGRlciwgQWNsVmlldz4qIGhjaV9xdWV1ZV9lbmRfID0gbnVsbHB0cjsKLSAgLy8gZmlyc3QgcmVnaXN0ZXIgcXVldWUgZW5kIGZvciB0aGUgUm91bmQtcm9iaW4gc2NoZWR1bGUKLSAgc3RkOjptYXA8dWludDE2X3QsIGFjbF9xdWV1ZV9oYW5kbGVyPjo6aXRlcmF0b3Igc3RhcnRpbmdfcG9pbnRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFjbF9tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FjbF9tYW5hZ2VyL3JvdW5kX3JvYmluX3NjaGVkdWxlcl90ZXN0LmNjIGIvZ2QvaGNpL2FjbF9tYW5hZ2VyL3JvdW5kX3JvYmluX3NjaGVkdWxlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQzYzBmLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlci9yb3VuZF9yb2Jpbl9zY2hlZHVsZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL3JvdW5kX3JvYmluX3NjaGVkdWxlci5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpjb21tb246OkJpZGlRdWV1ZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpjb21tb246OkNhbGxiYWNrOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpUaHJlYWQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgYWNsX21hbmFnZXIgewotCi1jbGFzcyBUZXN0Q29udHJvbGxlciA6IHB1YmxpYyBDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIHVpbnQxNl90IEdldE51bUFjbFBhY2tldEJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1heF9hY2xfcGFja2V0X2NyZWRpdHNfOwotICB9Ci0KLSAgdWludDE2X3QgR2V0QWNsUGFja2V0TGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBoY2lfbXR1XzsKLSAgfQotCi0gIExlQnVmZmVyU2l6ZSBHZXRMZUJ1ZmZlclNpemUoKSBjb25zdCB7Ci0gICAgTGVCdWZmZXJTaXplIGxlX2J1ZmZlcl9zaXplOwotICAgIGxlX2J1ZmZlcl9zaXplLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8gPSBsZV9oY2lfbXR1XzsKLSAgICBsZV9idWZmZXJfc2l6ZS50b3RhbF9udW1fbGVfcGFja2V0c18gPSBsZV9tYXhfYWNsX3BhY2tldF9jcmVkaXRzXzsKLSAgICByZXR1cm4gbGVfYnVmZmVyX3NpemU7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKENvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayBjYikgewotICAgIGFjbF9jcmVkaXRzX2NhbGxiYWNrXyA9IGNiOwotICB9Ci0KLSAgdm9pZCBTZW5kQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY3JlZGl0cykgewotICAgIGFjbF9jcmVkaXRzX2NhbGxiYWNrXy5JbnZva2UoaGFuZGxlLCBjcmVkaXRzKTsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjaygpIHsKLSAgICBhY2xfY3JlZGl0c19jYWxsYmFja18gPSB7fTsKLSAgfQotCi0gIGNvbnN0IHVpbnQxNl90IG1heF9hY2xfcGFja2V0X2NyZWRpdHNfID0gMTA7Ci0gIGNvbnN0IHVpbnQxNl90IGhjaV9tdHVfID0gMTAyNDsKLSAgY29uc3QgdWludDE2X3QgbGVfbWF4X2FjbF9wYWNrZXRfY3JlZGl0c18gPSAxNTsKLSAgY29uc3QgdWludDE2X3QgbGVfaGNpX210dV8gPSAyNzsKLQotIHByaXZhdGU6Ci0gIENvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayBhY2xfY3JlZGl0c19jYWxsYmFja187Ci19OwotCi1jbGFzcyBSb3VuZFJvYmluU2NoZWR1bGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBIYW5kbGVyKHRocmVhZF8pOwotICAgIGNvbnRyb2xsZXJfID0gbmV3IFRlc3RDb250cm9sbGVyKCk7Ci0gICAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXyA9IG5ldyBSb3VuZFJvYmluU2NoZWR1bGVyKGhhbmRsZXJfLCBjb250cm9sbGVyXywgaGNpX3F1ZXVlXy5HZXRVcEVuZCgpKTsKLSAgICBoY2lfcXVldWVfLkdldERvd25FbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBoYW5kbGVyXywgY29tbW9uOjpCaW5kKCZSb3VuZFJvYmluU2NoZWR1bGVyVGVzdDo6SGNpRG93bkVuZERlcXVldWUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBoY2lfcXVldWVfLkdldERvd25FbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICBkZWxldGUgcm91bmRfcm9iaW5fc2NoZWR1bGVyXzsKLSAgICBkZWxldGUgY29udHJvbGxlcl87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgdm9pZCBzeW5jX2hhbmRsZXIoKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICBoYW5kbGVyXy0+QmluZE9uY2VPbigmcHJvbWlzZSwgJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlKS5JbnZva2UoKTsKLSAgICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKTsKLSAgICBFWFBFQ1RfRVEoc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgfQotCi0gIHZvaWQgRW5xdWV1ZUFjbFVwRW5kKEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0KSB7Ci0gICAgaWYgKGVucXVldWVfcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgZW5xdWV1ZV9mdXR1cmVfLT53YWl0KCk7Ci0gICAgfQotICAgIGVucXVldWVfcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICBlbnF1ZXVlX2Z1dHVyZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6ZnV0dXJlPHZvaWQ+PihlbnF1ZXVlX3Byb21pc2VfLT5nZXRfZnV0dXJlKCkpOwotICAgIHF1ZXVlX3VwX2VuZC0+UmVnaXN0ZXJFbnF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJlJvdW5kUm9iaW5TY2hlZHVsZXJUZXN0OjplbnF1ZXVlX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBxdWV1ZV91cF9lbmQsIHBhY2tldCkpOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IGVucXVldWVfY2FsbGJhY2soQWNsQ29ubmVjdGlvbjo6UXVldWVVcEVuZCogcXVldWVfdXBfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQpIHsKLSAgICBhdXRvIHBhY2tldF9vbmUgPSBzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UmF3QnVpbGRlcj4oMjAwMCk7Ci0gICAgcGFja2V0X29uZS0+QWRkT2N0ZXRzKHBhY2tldCk7Ci0gICAgcXVldWVfdXBfZW5kLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICAgIGVucXVldWVfcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgIHJldHVybiBwYWNrZXRfb25lOwotICB9OwotCi0gIHZvaWQgSGNpRG93bkVuZERlcXVldWUoKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBoY2lfcXVldWVfLkdldERvd25FbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICAgIC8vIENvbnZlcnQgZnJvbSBhIEJ1aWxkZXIgdG8gYSBWaWV3Ci0gICAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyIGkoKmJ5dGVzKTsKLSAgICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gICAgcGFja2V0LT5TZXJpYWxpemUoaSk7Ci0gICAgYXV0byBwYWNrZXRfdmlldyA9IGJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRWaWV3PGJsdWV0b290aDo6cGFja2V0OjprTGl0dGxlRW5kaWFuPihieXRlcyk7Ci0gICAgQWNsVmlldyBhY2xfcGFja2V0X3ZpZXcgPSBBY2xWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICAgIEFTU0VSVF9UUlVFKGFjbF9wYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICAgIFBhY2tldFZpZXc8dHJ1ZT4gY291bnRfdmlldyA9IGFjbF9wYWNrZXRfdmlldy5HZXRQYXlsb2FkKCk7Ci0gICAgc2VudF9hY2xfcGFja2V0c18ucHVzaChhY2xfcGFja2V0X3ZpZXcpOwotCi0gICAgcGFja2V0X2NvdW50Xy0tOwotICAgIGlmIChwYWNrZXRfY291bnRfID09IDApIHsKLSAgICAgIHBhY2tldF9wcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgICBwYWNrZXRfcHJvbWlzZV8gPSBudWxscHRyOwotICAgIH0KLSAgfQotCi0gIHZvaWQgVmVyaWZ5UGFja2V0KHVpbnQxNl90IGhhbmRsZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0KSB7Ci0gICAgYXV0byBhY2xfcGFja2V0X3ZpZXcgPSBzZW50X2FjbF9wYWNrZXRzXy5mcm9udCgpOwotICAgIEFTU0VSVF9FUShoYW5kbGUsIGFjbF9wYWNrZXRfdmlldy5HZXRIYW5kbGUoKSk7Ci0gICAgYXV0byBwYXlsb2FkID0gYWNsX3BhY2tldF92aWV3LkdldFBheWxvYWQoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBheWxvYWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgIEFTU0VSVF9FUShwYXlsb2FkW2ldLCBwYWNrZXRbaV0pOwotICAgIH0KLSAgICBzZW50X2FjbF9wYWNrZXRzXy5wb3AoKTsKLSAgfQotCi0gIHZvaWQgU2V0UGFja2V0RnV0dXJlKHVpbnQxNl90IGNvdW50KSB7Ci0gICAgQVNTRVJUX0xPRyhwYWNrZXRfcHJvbWlzZV8gPT0gbnVsbHB0ciwgIlByb21pc2VzLCBQcm9taXNlcywgLi4uIE9ubHkgb25lIGF0IGEgdGltZS4iKTsKLSAgICBwYWNrZXRfY291bnRfID0gY291bnQ7Ci0gICAgcGFja2V0X3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgcGFja2V0X2Z1dHVyZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6ZnV0dXJlPHZvaWQ+PihwYWNrZXRfcHJvbWlzZV8tPmdldF9mdXR1cmUoKSk7Ci0gIH0KLQotICBCaWRpUXVldWU8QWNsVmlldywgQWNsQnVpbGRlcj4gaGNpX3F1ZXVlX3szfTsKLSAgVGhyZWFkKiB0aHJlYWRfOwotICBIYW5kbGVyKiBoYW5kbGVyXzsKLSAgVGVzdENvbnRyb2xsZXIqIGNvbnRyb2xsZXJfOwotICBSb3VuZFJvYmluU2NoZWR1bGVyKiByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfOwotICBzdGQ6OnF1ZXVlPEFjbFZpZXc+IHNlbnRfYWNsX3BhY2tldHNfOwotICB1aW50MTZfdCBwYWNrZXRfY291bnRfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBwYWNrZXRfcHJvbWlzZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OmZ1dHVyZTx2b2lkPj4gcGFja2V0X2Z1dHVyZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+IGVucXVldWVfcHJvbWlzZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OmZ1dHVyZTx2b2lkPj4gZW5xdWV1ZV9mdXR1cmVfOwotfTsKLQotVEVTVF9GKFJvdW5kUm9iaW5TY2hlZHVsZXJUZXN0LCBzdGFydHVwX3RlYXJkb3duKSB7fQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIHJlZ2lzdGVyX3VucmVnaXN0ZXJfY29ubmVjdGlvbikgewotICB1aW50MTZfdCBoYW5kbGUgPSAweDAxOwotICBhdXRvIGNvbm5lY3Rpb25fcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxMCk7Ci0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpDTEFTU0lDLCBoYW5kbGUsIGNvbm5lY3Rpb25fcXVldWUpOwotICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5VbnJlZ2lzdGVyKGhhbmRsZSk7Ci19Ci0KLVRFU1RfRihSb3VuZFJvYmluU2NoZWR1bGVyVGVzdCwgYnVmZmVyX3BhY2tldCkgewotICB1aW50MTZfdCBoYW5kbGUgPSAweDAxOwotICBhdXRvIGNvbm5lY3Rpb25fcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxMCk7Ci0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpDTEFTU0lDLCBoYW5kbGUsIGNvbm5lY3Rpb25fcXVldWUpOwotCi0gIFNldFBhY2tldEZ1dHVyZSgyKTsKLSAgQWNsQ29ubmVjdGlvbjo6UXVldWVVcEVuZCogcXVldWVfdXBfZW5kID0gY29ubmVjdGlvbl9xdWV1ZS0+R2V0VXBFbmQoKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0MSA9IHsweDAxLCAweDAyLCAweDAzfTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0MiA9IHsweDA0LCAweDA1LCAweDA2fTsKLSAgRW5xdWV1ZUFjbFVwRW5kKHF1ZXVlX3VwX2VuZCwgcGFja2V0MSk7Ci0gIEVucXVldWVBY2xVcEVuZChxdWV1ZV91cF9lbmQsIHBhY2tldDIpOwotCi0gIHBhY2tldF9mdXR1cmVfLT53YWl0KCk7Ci0gIFZlcmlmeVBhY2tldChoYW5kbGUsIHBhY2tldDEpOwotICBWZXJpZnlQYWNrZXQoaGFuZGxlLCBwYWNrZXQyKTsKLSAgQVNTRVJUX0VRKHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPkdldENyZWRpdHMoKSwgY29udHJvbGxlcl8tPm1heF9hY2xfcGFja2V0X2NyZWRpdHNfIC0gMik7Ci0KLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihoYW5kbGUpOwotfQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIGJ1ZmZlcl9wYWNrZXRfZnJvbV90d29fY29ubmVjdGlvbnMpIHsKLSAgdWludDE2X3QgaGFuZGxlID0gMHgwMTsKLSAgdWludDE2X3QgbGVfaGFuZGxlID0gMHgwMjsKLSAgYXV0byBjb25uZWN0aW9uX3F1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxBY2xDb25uZWN0aW9uOjpRdWV1ZT4oMTApOwotICBhdXRvIGxlX2Nvbm5lY3Rpb25fcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxMCk7Ci0KLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkNMQVNTSUMsIGhhbmRsZSwgY29ubmVjdGlvbl9xdWV1ZSk7Ci0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpMRSwgbGVfaGFuZGxlLCBsZV9jb25uZWN0aW9uX3F1ZXVlKTsKLQotICBTZXRQYWNrZXRGdXR1cmUoMik7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCA9IGNvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIGxlX3F1ZXVlX3VwX2VuZCA9IGxlX2Nvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCA9IHsweDAxLCAweDAyLCAweDAzfTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfcGFja2V0ID0gezB4MDQsIDB4MDUsIDB4MDZ9OwotICBFbnF1ZXVlQWNsVXBFbmQobGVfcXVldWVfdXBfZW5kLCBsZV9wYWNrZXQpOwotICBFbnF1ZXVlQWNsVXBFbmQocXVldWVfdXBfZW5kLCBwYWNrZXQpOwotCi0gIHBhY2tldF9mdXR1cmVfLT53YWl0KCk7Ci0gIFZlcmlmeVBhY2tldChsZV9oYW5kbGUsIGxlX3BhY2tldCk7Ci0gIFZlcmlmeVBhY2tldChoYW5kbGUsIHBhY2tldCk7Ci0gIEFTU0VSVF9FUShyb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5HZXRDcmVkaXRzKCksIGNvbnRyb2xsZXJfLT5tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyAtIDEpOwotICBBU1NFUlRfRVEocm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+R2V0TGVDcmVkaXRzKCksIGNvbnRyb2xsZXJfLT5sZV9tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyAtIDEpOwotCi0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlVucmVnaXN0ZXIoaGFuZGxlKTsKLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihsZV9oYW5kbGUpOwotfQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIGRvX25vdF9yZWdpc3Rlcl93aGVuX2NyZWRpdHNfaXNfemVybykgewotICB1aW50MTZfdCBoYW5kbGUgPSAweDAxOwotICBhdXRvIGNvbm5lY3Rpb25fcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxNSk7Ci0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpDTEFTU0lDLCBoYW5kbGUsIGNvbm5lY3Rpb25fcXVldWUpOwotCi0gIFNldFBhY2tldEZ1dHVyZSgxMCk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCA9IGNvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IDE1OyBpKyspIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQgPSB7MHgwMSwgMHgwMiwgMHgwMywgaX07Ci0gICAgRW5xdWV1ZUFjbFVwRW5kKHF1ZXVlX3VwX2VuZCwgcGFja2V0KTsKLSAgfQotCi0gIHBhY2tldF9mdXR1cmVfLT53YWl0KCk7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQgPSB7MHgwMSwgMHgwMiwgMHgwMywgaX07Ci0gICAgVmVyaWZ5UGFja2V0KGhhbmRsZSwgcGFja2V0KTsKLSAgfQotICBBU1NFUlRfRVEocm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+R2V0Q3JlZGl0cygpLCAwKTsKLQotICBTZXRQYWNrZXRGdXR1cmUoNSk7Ci0gIGNvbnRyb2xsZXJfLT5TZW5kQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKDB4MDEsIDEwKTsKLSAgc3luY19oYW5kbGVyKCk7Ci0gIHBhY2tldF9mdXR1cmVfLT53YWl0KCk7Ci0gIGZvciAodWludDhfdCBpID0gMTA7IGkgPCAxNTsgaSsrKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0ID0gezB4MDEsIDB4MDIsIDB4MDMsIGl9OwotICAgIFZlcmlmeVBhY2tldChoYW5kbGUsIHBhY2tldCk7Ci0gIH0KLSAgQVNTRVJUX0VRKHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPkdldENyZWRpdHMoKSwgNSk7Ci0KLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihoYW5kbGUpOwotfQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIHJldmVpdmVkX2NvbXBsZXRlZF9jYWxsYmFja193aXRoX3Vua25vd25faGFuZGxlKSB7Ci0gIGNvbnRyb2xsZXJfLT5TZW5kQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKDB4MDAsIDEpOwotICBzeW5jX2hhbmRsZXIoKTsKLSAgRVhQRUNUX0VRKHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPkdldENyZWRpdHMoKSwgY29udHJvbGxlcl8tPm1heF9hY2xfcGFja2V0X2NyZWRpdHNfKTsKLSAgRVhQRUNUX0VRKHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPkdldExlQ3JlZGl0cygpLCBjb250cm9sbGVyXy0+bGVfbWF4X2FjbF9wYWNrZXRfY3JlZGl0c18pOwotfQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIGJ1ZmZlcl9wYWNrZXRfaW50ZXJ2YWxseSkgewotICB1aW50MTZfdCBoYW5kbGUxID0gMHgwMTsKLSAgdWludDE2X3QgaGFuZGxlMiA9IDB4MDI7Ci0gIHVpbnQxNl90IGxlX2hhbmRsZTEgPSAweDAzOwotICB1aW50MTZfdCBsZV9oYW5kbGUyID0gMHgwNDsKLSAgYXV0byBjb25uZWN0aW9uX3F1ZXVlMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDEwKTsKLSAgYXV0byBjb25uZWN0aW9uX3F1ZXVlMiA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDEwKTsKLSAgYXV0byBsZV9jb25uZWN0aW9uX3F1ZXVlMSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDEwKTsKLSAgYXV0byBsZV9jb25uZWN0aW9uX3F1ZXVlMiA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDEwKTsKLQotICBTZXRQYWNrZXRGdXR1cmUoMTgpOwotICBBY2xDb25uZWN0aW9uOjpRdWV1ZVVwRW5kKiBxdWV1ZV91cF9lbmQxID0gY29ubmVjdGlvbl9xdWV1ZTEtPkdldFVwRW5kKCk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZDIgPSBjb25uZWN0aW9uX3F1ZXVlMi0+R2V0VXBFbmQoKTsKLSAgQWNsQ29ubmVjdGlvbjo6UXVldWVVcEVuZCogbGVfcXVldWVfdXBfZW5kMSA9IGxlX2Nvbm5lY3Rpb25fcXVldWUxLT5HZXRVcEVuZCgpOwotICBBY2xDb25uZWN0aW9uOjpRdWV1ZVVwRW5kKiBsZV9xdWV1ZV91cF9lbmQyID0gbGVfY29ubmVjdGlvbl9xdWV1ZTItPkdldFVwRW5kKCk7Ci0KLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkNMQVNTSUMsIGhhbmRsZTEsIGNvbm5lY3Rpb25fcXVldWUxKTsKLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkNMQVNTSUMsIGhhbmRsZTIsIGNvbm5lY3Rpb25fcXVldWUyKTsKLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkxFLCBsZV9oYW5kbGUxLCBsZV9jb25uZWN0aW9uX3F1ZXVlMSk7Ci0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpMRSwgbGVfaGFuZGxlMiwgbGVfY29ubmVjdGlvbl9xdWV1ZTIpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCA9IHsweDAxLCAweDAyLCAweDAzfTsKLSAgRW5xdWV1ZUFjbFVwRW5kKHF1ZXVlX3VwX2VuZDEsIHBhY2tldCk7Ci0gIEVucXVldWVBY2xVcEVuZChsZV9xdWV1ZV91cF9lbmQyLCBwYWNrZXQpOwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQxID0gezB4MDEsIDB4MDIsIDB4MDMsIGl9OwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldDIgPSB7MHgwMiwgMHgwMiwgMHgwMywgaX07Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfcGFja2V0MSA9IHsweDA0LCAweDA1LCAweDA2LCBpfTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9wYWNrZXQyID0gezB4MDUsIDB4MDUsIDB4MDYsIGl9OwotICAgIEVucXVldWVBY2xVcEVuZChxdWV1ZV91cF9lbmQxLCBwYWNrZXQxKTsKLSAgICBFbnF1ZXVlQWNsVXBFbmQocXVldWVfdXBfZW5kMiwgcGFja2V0Mik7Ci0gICAgRW5xdWV1ZUFjbFVwRW5kKGxlX3F1ZXVlX3VwX2VuZDEsIGxlX3BhY2tldDEpOwotICAgIEVucXVldWVBY2xVcEVuZChsZV9xdWV1ZV91cF9lbmQyLCBsZV9wYWNrZXQyKTsKLSAgfQotCi0gIHBhY2tldF9mdXR1cmVfLT53YWl0KCk7Ci0gIFZlcmlmeVBhY2tldChoYW5kbGUxLCBwYWNrZXQpOwotICBWZXJpZnlQYWNrZXQobGVfaGFuZGxlMiwgcGFja2V0KTsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0MSA9IHsweDAxLCAweDAyLCAweDAzLCBpfTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQyID0gezB4MDIsIDB4MDIsIDB4MDMsIGl9OwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3BhY2tldDEgPSB7MHgwNCwgMHgwNSwgMHgwNiwgaX07Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfcGFja2V0MiA9IHsweDA1LCAweDA1LCAweDA2LCBpfTsKLSAgICBWZXJpZnlQYWNrZXQoaGFuZGxlMSwgcGFja2V0MSk7Ci0gICAgVmVyaWZ5UGFja2V0KGhhbmRsZTIsIHBhY2tldDIpOwotICAgIFZlcmlmeVBhY2tldChsZV9oYW5kbGUxLCBsZV9wYWNrZXQxKTsKLSAgICBWZXJpZnlQYWNrZXQobGVfaGFuZGxlMiwgbGVfcGFja2V0Mik7Ci0gIH0KLQotICBBU1NFUlRfRVEocm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+R2V0Q3JlZGl0cygpLCBjb250cm9sbGVyXy0+bWF4X2FjbF9wYWNrZXRfY3JlZGl0c18gLSA5KTsKLSAgQVNTRVJUX0VRKHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPkdldExlQ3JlZGl0cygpLCBjb250cm9sbGVyXy0+bGVfbWF4X2FjbF9wYWNrZXRfY3JlZGl0c18gLSA5KTsKLQotICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5VbnJlZ2lzdGVyKGhhbmRsZTEpOwotICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5VbnJlZ2lzdGVyKGhhbmRsZTIpOwotICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5VbnJlZ2lzdGVyKGxlX2hhbmRsZTEpOwotICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5VbnJlZ2lzdGVyKGxlX2hhbmRsZTIpOwotfQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIHNlbmRfZnJhZ21lbnRzX3dpdGhvdXRfaW50ZXJ2YWwpIHsKLSAgdWludDE2X3QgaGFuZGxlID0gMHgwMTsKLSAgdWludDE2X3QgbGVfaGFuZGxlID0gMHgwMjsKLSAgYXV0byBjb25uZWN0aW9uX3F1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxBY2xDb25uZWN0aW9uOjpRdWV1ZT4oMTApOwotICBhdXRvIGxlX2Nvbm5lY3Rpb25fcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxMCk7Ci0KLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+UmVnaXN0ZXIoUm91bmRSb2JpblNjaGVkdWxlcjo6Q29ubmVjdGlvblR5cGU6OkNMQVNTSUMsIGhhbmRsZSwgY29ubmVjdGlvbl9xdWV1ZSk7Ci0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpMRSwgbGVfaGFuZGxlLCBsZV9jb25uZWN0aW9uX3F1ZXVlKTsKLQotICBTZXRQYWNrZXRGdXR1cmUoNSk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCA9IGNvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIGxlX3F1ZXVlX3VwX2VuZCA9IGxlX2Nvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldChjb250cm9sbGVyXy0+aGNpX210dV8sIDB4ZmYpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfcGFydDEoY29udHJvbGxlcl8tPmhjaV9tdHVfLCAweGZmKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0X3BhcnQyID0gezB4MDMsIDB4MDIsIDB4MDF9OwotICBwYWNrZXQuaW5zZXJ0KHBhY2tldC5lbmQoKSwgcGFja2V0X3BhcnQyLmJlZ2luKCksIHBhY2tldF9wYXJ0Mi5lbmQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfcGFja2V0OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9wYWNrZXRfcGFydDE7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3BhY2tldF9wYXJ0MjsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfcGFja2V0X3BhcnQzOwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBjb250cm9sbGVyXy0+bGVfaGNpX210dV87IGkrKykgewotICAgIGxlX3BhY2tldC5wdXNoX2JhY2soaSk7Ci0gICAgbGVfcGFja2V0X3BhcnQxLnB1c2hfYmFjayhpKTsKLSAgICBsZV9wYWNrZXRfcGFydDIucHVzaF9iYWNrKGkgKiAyKTsKLSAgICBsZV9wYWNrZXRfcGFydDMucHVzaF9iYWNrKGkgKiAzKTsKLSAgfQotICBsZV9wYWNrZXQuaW5zZXJ0KGxlX3BhY2tldC5lbmQoKSwgbGVfcGFja2V0X3BhcnQyLmJlZ2luKCksIGxlX3BhY2tldF9wYXJ0Mi5lbmQoKSk7Ci0gIGxlX3BhY2tldC5pbnNlcnQobGVfcGFja2V0LmVuZCgpLCBsZV9wYWNrZXRfcGFydDMuYmVnaW4oKSwgbGVfcGFja2V0X3BhcnQzLmVuZCgpKTsKLQotICBFbnF1ZXVlQWNsVXBFbmQobGVfcXVldWVfdXBfZW5kLCBsZV9wYWNrZXQpOwotICBFbnF1ZXVlQWNsVXBFbmQocXVldWVfdXBfZW5kLCBwYWNrZXQpOwotCi0gIHBhY2tldF9mdXR1cmVfLT53YWl0KCk7Ci0gIFZlcmlmeVBhY2tldChsZV9oYW5kbGUsIGxlX3BhY2tldF9wYXJ0MSk7Ci0gIFZlcmlmeVBhY2tldChsZV9oYW5kbGUsIGxlX3BhY2tldF9wYXJ0Mik7Ci0gIFZlcmlmeVBhY2tldChsZV9oYW5kbGUsIGxlX3BhY2tldF9wYXJ0Myk7Ci0gIFZlcmlmeVBhY2tldChoYW5kbGUsIHBhY2tldF9wYXJ0MSk7Ci0gIFZlcmlmeVBhY2tldChoYW5kbGUsIHBhY2tldF9wYXJ0Mik7Ci0gIEFTU0VSVF9FUShyb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5HZXRDcmVkaXRzKCksIGNvbnRyb2xsZXJfLT5tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyAtIDIpOwotICBBU1NFUlRfRVEocm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+R2V0TGVDcmVkaXRzKCksIGNvbnRyb2xsZXJfLT5sZV9tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyAtIDMpOwotCi0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlVucmVnaXN0ZXIoaGFuZGxlKTsKLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihsZV9oYW5kbGUpOwotfQotCi1URVNUX0YoUm91bmRSb2JpblNjaGVkdWxlclRlc3QsIHJlY2VpdmVfbGVfY3JlZGl0X3doZW5fbmV4dF9mcmFnbWVudF9pc19jbGFzc2ljKSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDB4MDE7Ci0gIHVpbnQxNl90IGxlX2hhbmRsZSA9IDB4MDI7Ci0gIGF1dG8gY29ubmVjdGlvbl9xdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWNsQ29ubmVjdGlvbjo6UXVldWU+KDIwKTsKLSAgYXV0byBsZV9jb25uZWN0aW9uX3F1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxBY2xDb25uZWN0aW9uOjpRdWV1ZT4oMjApOwotCi0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlJlZ2lzdGVyKFJvdW5kUm9iaW5TY2hlZHVsZXI6OkNvbm5lY3Rpb25UeXBlOjpDTEFTU0lDLCBoYW5kbGUsIGNvbm5lY3Rpb25fcXVldWUpOwotICByb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5SZWdpc3RlcihSb3VuZFJvYmluU2NoZWR1bGVyOjpDb25uZWN0aW9uVHlwZTo6TEUsIGxlX2hhbmRsZSwgbGVfY29ubmVjdGlvbl9xdWV1ZSk7Ci0KLSAgU2V0UGFja2V0RnV0dXJlKGNvbnRyb2xsZXJfLT5sZV9tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyArIGNvbnRyb2xsZXJfLT5tYXhfYWNsX3BhY2tldF9jcmVkaXRzXyk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCA9IGNvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIGxlX3F1ZXVlX3VwX2VuZCA9IGxlX2Nvbm5lY3Rpb25fcXVldWUtPkdldFVwRW5kKCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh1Z2VfcGFja2V0KDIwMDApOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQgPSB7MHgwMSwgMHgwMiwgMHgwM307Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3BhY2tldCA9IHsweDA0LCAweDA1LCAweDA2fTsKLQotICAvLyBNYWtlIGxlX2FjbF9wYWNrZXRfY3JlZGl0c18gPSAwOwotICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY29udHJvbGxlcl8tPmxlX21heF9hY2xfcGFja2V0X2NyZWRpdHNfOyBpKyspIHsKLSAgICBFbnF1ZXVlQWNsVXBFbmQobGVfcXVldWVfdXBfZW5kLCBsZV9wYWNrZXQpOwotICB9Ci0KLSAgLy8gTWFrZSBhY2xfcGFja2V0X2NyZWRpdHNfID0gMCBhbmQgcmVtYWluIDEgYWNsIGZyYWdtZW50IGluIGZyYWdtZW50c190b19zZW5kXwotICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY29udHJvbGxlcl8tPm1heF9hY2xfcGFja2V0X2NyZWRpdHNfIC0gMTsgaSsrKSB7Ci0gICAgRW5xdWV1ZUFjbFVwRW5kKHF1ZXVlX3VwX2VuZCwgcGFja2V0KTsKLSAgfQotICBFbnF1ZXVlQWNsVXBFbmQocXVldWVfdXBfZW5kLCBodWdlX3BhY2tldCk7Ci0KLSAgcGFja2V0X2Z1dHVyZV8tPndhaXQoKTsKLQotICAvLyBUcmlnZ2VyIHN0YXJ0X3JvdW5kX3JvYmluCi0gIGNvbnRyb2xsZXJfLT5TZW5kQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKDB4MDIsIDEpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotCi0gIEFTU0VSVF9FUShyb3VuZF9yb2Jpbl9zY2hlZHVsZXJfLT5HZXRDcmVkaXRzKCksIDApOwotICBBU1NFUlRfRVEocm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+R2V0TGVDcmVkaXRzKCksIDEpOwotCi0gIHJvdW5kX3JvYmluX3NjaGVkdWxlcl8tPlVucmVnaXN0ZXIoaGFuZGxlKTsKLSAgcm91bmRfcm9iaW5fc2NoZWR1bGVyXy0+VW5yZWdpc3RlcihsZV9oYW5kbGUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYWNsX21hbmFnZXIKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9hY2xfbWFuYWdlcl9tb2NrLmggYi9nZC9oY2kvYWNsX21hbmFnZXJfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjkwZGY3Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlcl9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvY2xhc3NpY19hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBhY2xfbWFuYWdlcjo6TGVBY2xDb25uZWN0aW9uOwotdXNpbmcgYWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbkNhbGxiYWNrczsKLXVzaW5nIGFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOwotCi11c2luZyBhY2xfbWFuYWdlcjo6Q2xhc3NpY0FjbENvbm5lY3Rpb247Ci11c2luZyBhY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrczsKLXVzaW5nIGFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrczsKLQotY2xhc3MgTW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uIDogcHVibGljIENsYXNzaWNBY2xDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKEFkZHJlc3MsIEdldEFkZHJlc3MsICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIERpc2Nvbm5lY3QsIChEaXNjb25uZWN0UmVhc29uIHJlYXNvbiksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBSZWdpc3RlckNhbGxiYWNrcywgKENvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzICogY2FsbGJhY2tzLCBvczo6SGFuZGxlciogaGFuZGxlciksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChib29sLCBSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcywgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChib29sLCBSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcywgKHVpbnQ4X3QpLCAob3ZlcnJpZGUpKTsKLQotICBRdWV1ZVVwRW5kKiBHZXRBY2xRdWV1ZUVuZCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYWNsX3F1ZXVlXy5HZXRVcEVuZCgpOwotICB9Ci0gIG11dGFibGUgY29tbW9uOjpCaWRpUXVldWU8UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiwgQmFzZVBhY2tldEJ1aWxkZXI+IGFjbF9xdWV1ZV97MTB9OwotfTsKLQotY2xhc3MgTW9ja0xlQWNsQ29ubmVjdGlvbiA6IHB1YmxpYyBMZUFjbENvbm5lY3Rpb24gewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoQWRkcmVzc1dpdGhUeXBlLCBHZXRMb2NhbEFkZHJlc3MsICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKEFkZHJlc3NXaXRoVHlwZSwgR2V0UmVtb3RlQWRkcmVzcywgKCksIChjb25zdCwgb3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgRGlzY29ubmVjdCwgKERpc2Nvbm5lY3RSZWFzb24gcmVhc29uKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlZ2lzdGVyQ2FsbGJhY2tzLCAoTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyAqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbiwgKCksIChvdmVycmlkZSkpOwotCi0gIFF1ZXVlVXBFbmQqIEdldEFjbFF1ZXVlRW5kKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBhY2xfcXVldWVfLkdldFVwRW5kKCk7Ci0gIH0KLSAgbXV0YWJsZSBjb21tb246OkJpZGlRdWV1ZTxQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+LCBCYXNlUGFja2V0QnVpbGRlcj4gYWNsX3F1ZXVlX3sxMH07Ci19OwotCi1jbGFzcyBNb2NrQWNsTWFuYWdlciA6IHB1YmxpYyBBY2xNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlZ2lzdGVyQ2FsbGJhY2tzLCAoQ29ubmVjdGlvbkNhbGxiYWNrcyAqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVnaXN0ZXJMZUNhbGxiYWNrcywgKExlQ29ubmVjdGlvbkNhbGxiYWNrcyAqIGNhbGxiYWNrcywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgQ3JlYXRlQ29ubmVjdGlvbiwgKEFkZHJlc3MgYWRkcmVzcyksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBDcmVhdGVMZUNvbm5lY3Rpb24sIChBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgaXNfZGlyZWN0KSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIENhbmNlbENvbm5lY3QsIChBZGRyZXNzIGFkZHJlc3MpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICB2b2lkLAotICAgICAgU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MsCi0gICAgICAoTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeSBhZGRyZXNzX3BvbGljeSwKLSAgICAgICBBZGRyZXNzV2l0aFR5cGUgZml4ZWRfYWRkcmVzcywKLSAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1heGltdW1fcm90YXRpb25fdGltZSksCi0gICAgICAob3ZlcnJpZGUpKTsKLQotICAvLyBQUklWQVRFIFRPIFNISU0KLSAgTU9DS19NRVRIT0QoCi0gICAgICB2b2lkLCBIQUNLX1NldE5vbkFjbERpc2Nvbm5lY3RDYWxsYmFjaywgKHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCAvKiBoYW5kbGUgKi8sIHVpbnQ4X3QgLyogcmVhc29uICovKT4pKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvYWNsX21hbmFnZXJfdGVzdC5jYyBiL2dkL2hjaS9hY2xfbWFuYWdlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRjMGQ5Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hY2xfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2NsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGFjbF9tYW5hZ2VyIHsKLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIGNvbW1vbjo6QmlkaVF1ZXVlOwotdXNpbmcgY29tbW9uOjpCaWRpUXVldWVFbmQ7Ci11c2luZyBwYWNrZXQ6OmtMaXR0bGVFbmRpYW47Ci11c2luZyBwYWNrZXQ6OlBhY2tldFZpZXc7Ci11c2luZyBwYWNrZXQ6OlJhd0J1aWxkZXI7Ci0KLWNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6c2Vjb25kcyBrVGltZW91dCA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDIpOwotY29uc3RleHByIHVpbnQxNl90IGtTY2FuSW50ZXJ2YWxGYXN0ID0gMHgwMDYwOwotY29uc3RleHByIHVpbnQxNl90IGtTY2FuV2luZG93RmFzdCA9IDB4MDAzMDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrU2NhbkludGVydmFsU2xvdyA9IDB4MDgwMDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrU2NhbldpbmRvd1Nsb3cgPSAweDAwMzA7Ci1jb25zdCBBZGRyZXNzV2l0aFR5cGUgZW1wdHlfYWRkcmVzc193aXRoX3R5cGUgPSBoY2k6OkFkZHJlc3NXaXRoVHlwZSgpOwotCi1QYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IE5leHRQYXlsb2FkKHVpbnQxNl90IGhhbmRsZSkgewotICBzdGF0aWMgdWludDMyX3QgcGFja2V0X251bWJlciA9IDE7Ci0gIGF1dG8gcGF5bG9hZCA9IHN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4oKTsKLSAgcGF5bG9hZC0+QWRkT2N0ZXRzMig2KTsgIC8vIEwyQ0FQIFBEVSBzaXplCi0gIHBheWxvYWQtPkFkZE9jdGV0czIoMik7ICAvLyBMMkNBUCBDSUQKLSAgcGF5bG9hZC0+QWRkT2N0ZXRzMihoYW5kbGUpOwotICBwYXlsb2FkLT5BZGRPY3RldHM0KHBhY2tldF9udW1iZXIrKyk7Ci0gIHJldHVybiBzdGQ6Om1vdmUocGF5bG9hZCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxBY2xCdWlsZGVyPiBOZXh0QWNsUGFja2V0KHVpbnQxNl90IGhhbmRsZSkgewotICBQYWNrZXRCb3VuZGFyeUZsYWcgcGFja2V0X2JvdW5kYXJ5X2ZsYWcgPSBQYWNrZXRCb3VuZGFyeUZsYWc6OkZJUlNUX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFOwotICBCcm9hZGNhc3RGbGFnIGJyb2FkY2FzdF9mbGFnID0gQnJvYWRjYXN0RmxhZzo6UE9JTlRfVE9fUE9JTlQ7Ci0gIHJldHVybiBBY2xCdWlsZGVyOjpDcmVhdGUoaGFuZGxlLCBwYWNrZXRfYm91bmRhcnlfZmxhZywgYnJvYWRjYXN0X2ZsYWcsIE5leHRQYXlsb2FkKGhhbmRsZSkpOwotfQotCi1jbGFzcyBUZXN0Q29udHJvbGxlciA6IHB1YmxpYyBDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgUmVnaXN0ZXJDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2soCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90IC8qIGhhbmRsZSAqLywgdWludDE2X3QgLyogcGFja2V0cyAqLyk+IGNiKSBvdmVycmlkZSB7Ci0gICAgYWNsX2NiXyA9IGNiOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKCkgb3ZlcnJpZGUgewotICAgIGFjbF9jYl8gPSB7fTsKLSAgfQotCi0gIHVpbnQxNl90IEdldEFjbFBhY2tldExlbmd0aCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYWNsX2J1ZmZlcl9sZW5ndGhfOwotICB9Ci0KLSAgdWludDE2X3QgR2V0TnVtQWNsUGFja2V0QnVmZmVycygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gdG90YWxfYWNsX2J1ZmZlcnNfOwotICB9Ci0KLSAgYm9vbCBJc1N1cHBvcnRlZChibHVldG9vdGg6OmhjaTo6T3BDb2RlIG9wX2NvZGUpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBMZUJ1ZmZlclNpemUgR2V0TGVCdWZmZXJTaXplKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIExlQnVmZmVyU2l6ZSBsZV9idWZmZXJfc2l6ZTsKLSAgICBsZV9idWZmZXJfc2l6ZS50b3RhbF9udW1fbGVfcGFja2V0c18gPSAyOwotICAgIGxlX2J1ZmZlcl9zaXplLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8gPSAzMjsKLSAgICByZXR1cm4gbGVfYnVmZmVyX3NpemU7Ci0gIH0KLQotICB2b2lkIENvbXBsZXRlUGFja2V0cyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHBhY2tldHMpIHsKLSAgICBhY2xfY2JfLkludm9rZShoYW5kbGUsIHBhY2tldHMpOwotICB9Ci0KLSAgdWludDE2X3QgYWNsX2J1ZmZlcl9sZW5ndGhfID0gMTAyNDsKLSAgdWludDE2X3QgdG90YWxfYWNsX2J1ZmZlcnNfID0gMjsKLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZCh1aW50MTZfdCAvKiBoYW5kbGUgKi8sIHVpbnQxNl90IC8qIHBhY2tldHMgKi8pPiBhY2xfY2JfOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHt9Ci19OwotCi1jbGFzcyBUZXN0SGNpTGF5ZXIgOiBwdWJsaWMgSGNpTGF5ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRTdGF0dXNWaWV3KT4gb25fc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgY29tbWFuZF9xdWV1ZV8ucHVzaChzdGQ6Om1vdmUoY29tbWFuZCkpOwotICAgIGNvbW1hbmRfc3RhdHVzX2NhbGxiYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKG9uX3N0YXR1cykpOwotICAgIGlmIChjb21tYW5kX3Byb21pc2VfICE9IG51bGxwdHIpIHsKLSAgICAgIGNvbW1hbmRfcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgICAgY29tbWFuZF9wcm9taXNlXy5yZXNldCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4gb25fY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBjb21tYW5kX3F1ZXVlXy5wdXNoKHN0ZDo6bW92ZShjb21tYW5kKSk7Ci0gICAgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFja3MucHVzaF9iYWNrKHN0ZDo6bW92ZShvbl9jb21wbGV0ZSkpOwotICAgIGlmIChjb21tYW5kX3Byb21pc2VfICE9IG51bGxwdHIpIHsKLSAgICAgIGNvbW1hbmRfcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgICAgY29tbWFuZF9wcm9taXNlXy5yZXNldCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU2V0Q29tbWFuZEZ1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKGNvbW1hbmRfcHJvbWlzZV8gPT0gbnVsbHB0ciwgIlByb21pc2VzLCBQcm9taXNlcywgLi4uIE9ubHkgb25lIGF0IGEgdGltZS4iKTsKLSAgICBjb21tYW5kX3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgY29tbWFuZF9mdXR1cmVfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OmZ1dHVyZTx2b2lkPj4oY29tbWFuZF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpKTsKLSAgfQotCi0gIENvbW1hbmRWaWV3IEdldExhc3RDb21tYW5kKCkgewotICAgIGlmIChjb21tYW5kX3F1ZXVlXy5zaXplKCkgPT0gMCkgewotICAgICAgcmV0dXJuIENvbW1hbmRWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPihzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpKSk7Ci0gICAgfQotICAgIGF1dG8gbGFzdCA9IHN0ZDo6bW92ZShjb21tYW5kX3F1ZXVlXy5mcm9udCgpKTsKLSAgICBjb21tYW5kX3F1ZXVlXy5wb3AoKTsKLSAgICByZXR1cm4gQ29tbWFuZFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0KSkpOwotICB9Ci0KLSAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldyBHZXRDb21tYW5kKE9wQ29kZSBvcF9jb2RlKSB7Ci0gICAgaWYgKGNvbW1hbmRfZnV0dXJlXyAhPSBudWxscHRyKSB7Ci0gICAgICBhdXRvIHJlc3VsdCA9IGNvbW1hbmRfZnV0dXJlXy0+d2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSk7Ci0gICAgICBFWFBFQ1RfTkUoc3RkOjpmdXR1cmVfc3RhdHVzOjp0aW1lb3V0LCByZXN1bHQpOwotICAgIH0KLSAgICBpZiAoY29tbWFuZF9xdWV1ZV8uZW1wdHkoKSkgewotICAgICAgcmV0dXJuIENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIENvbW1hbmRWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPihzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpKSkpKTsKLSAgICB9Ci0gICAgQ29tbWFuZFZpZXcgY29tbWFuZF9wYWNrZXRfdmlldyA9IEdldExhc3RDb21tYW5kKCk7Ci0gICAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldyBjb21tYW5kID0KLSAgICAgICAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXRfdmlldykpOwotICAgIEVYUEVDVF9UUlVFKGNvbW1hbmQuSXNWYWxpZCgpKTsKLSAgICBFWFBFQ1RfRVEoY29tbWFuZC5HZXRPcENvZGUoKSwgb3BfY29kZSk7Ci0KLSAgICByZXR1cm4gY29tbWFuZDsKLSAgfQotCi0gIENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXcgR2V0TGFzdENvbW1hbmQoT3BDb2RlIG9wX2NvZGUpIHsKLSAgICBpZiAoIWNvbW1hbmRfcXVldWVfLmVtcHR5KCkgJiYgY29tbWFuZF9mdXR1cmVfICE9IG51bGxwdHIpIHsKLSAgICAgIGNvbW1hbmRfZnV0dXJlXy5yZXNldCgpOwotICAgICAgY29tbWFuZF9wcm9taXNlXy5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAoY29tbWFuZF9mdXR1cmVfICE9IG51bGxwdHIpIHsKLSAgICAgIGF1dG8gcmVzdWx0ID0gY29tbWFuZF9mdXR1cmVfLT53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKTsKLSAgICAgIEVYUEVDVF9ORShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnRpbWVvdXQsIHJlc3VsdCk7Ci0gICAgfQotICAgIGlmIChjb21tYW5kX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgQ29tbWFuZFZpZXc6OkNyZWF0ZShQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpKSkpOwotICAgIH0KLSAgICBDb21tYW5kVmlldyBjb21tYW5kX3BhY2tldF92aWV3ID0gR2V0TGFzdENvbW1hbmQoKTsKLSAgICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3IGNvbW1hbmQgPQotICAgICAgICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldF92aWV3KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29tbWFuZC5Jc1ZhbGlkKCkpOwotICAgIEVYUEVDVF9FUShjb21tYW5kLkdldE9wQ29kZSgpLCBvcF9jb2RlKTsKLQotICAgIHJldHVybiBjb21tYW5kOwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGUgZXZlbnRfY29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSBvdmVycmlkZSB7Ci0gICAgcmVnaXN0ZXJlZF9ldmVudHNfW2V2ZW50X2NvZGVdID0gZXZlbnRfaGFuZGxlcjsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGUgZXZlbnRfY29kZSkgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfZXZlbnRzXy5lcmFzZShldmVudF9jb2RlKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfbGVfZXZlbnRzX1tzdWJldmVudF9jb2RlXSA9IGV2ZW50X2hhbmRsZXI7Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSkgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfbGVfZXZlbnRzXy5lcmFzZShzdWJldmVudF9jb2RlKTsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdFdmVudChzdGQ6OnVuaXF1ZV9wdHI8RXZlbnRCdWlsZGVyPiBldmVudF9idWlsZGVyKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShldmVudF9idWlsZGVyKSk7Ci0gICAgRXZlbnRWaWV3IGV2ZW50ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfVFJVRShldmVudC5Jc1ZhbGlkKCkpOwotICAgIEV2ZW50Q29kZSBldmVudF9jb2RlID0gZXZlbnQuR2V0RXZlbnRDb2RlKCk7Ci0gICAgQVNTRVJUX05FKHJlZ2lzdGVyZWRfZXZlbnRzXy5maW5kKGV2ZW50X2NvZGUpLCByZWdpc3RlcmVkX2V2ZW50c18uZW5kKCkpIDw8IEV2ZW50Q29kZVRleHQoZXZlbnRfY29kZSk7Ci0gICAgcmVnaXN0ZXJlZF9ldmVudHNfW2V2ZW50X2NvZGVdLkludm9rZShldmVudCk7Ci0gIH0KLQotICB2b2lkIEluY29taW5nTGVNZXRhRXZlbnQoc3RkOjp1bmlxdWVfcHRyPExlTWV0YUV2ZW50QnVpbGRlcj4gZXZlbnRfYnVpbGRlcikgewotICAgIGF1dG8gcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoZXZlbnRfYnVpbGRlcikpOwotICAgIEV2ZW50VmlldyBldmVudCA9IEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgTGVNZXRhRXZlbnRWaWV3IG1ldGFfZXZlbnRfdmlldyA9IExlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBFWFBFQ1RfVFJVRShtZXRhX2V2ZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSA9IG1ldGFfZXZlbnRfdmlldy5HZXRTdWJldmVudENvZGUoKTsKLSAgICBFWFBFQ1RfVFJVRShyZWdpc3RlcmVkX2xlX2V2ZW50c18uZmluZChzdWJldmVudF9jb2RlKSAhPSByZWdpc3RlcmVkX2xlX2V2ZW50c18uZW5kKCkpOwotICAgIHJlZ2lzdGVyZWRfbGVfZXZlbnRzX1tzdWJldmVudF9jb2RlXS5JbnZva2UobWV0YV9ldmVudF92aWV3KTsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdBY2xEYXRhKHVpbnQxNl90IGhhbmRsZSkgewotICAgIG9zOjpIYW5kbGVyKiBoY2lfaGFuZGxlciA9IEdldEhhbmRsZXIoKTsKLSAgICBhdXRvKiBxdWV1ZV9lbmQgPSBhY2xfcXVldWVfLkdldERvd25FbmQoKTsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIHF1ZXVlX2VuZC0+UmVnaXN0ZXJFbnF1ZXVlKGhjaV9oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6QmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oZGVjbHR5cGUocXVldWVfZW5kKSBxdWV1ZV9lbmQsIHVpbnQxNl90IGhhbmRsZSwgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHBhY2tldCA9IEdldFBhY2tldFZpZXcoTmV4dEFjbFBhY2tldChoYW5kbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2xWaWV3IGFjbDIgPSBBY2xWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV9lbmQtPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxBY2xWaWV3PihhY2wyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfZW5kLCBoYW5kbGUsIGNvbW1vbjo6UGFzc2VkKHN0ZDo6bW92ZShwcm9taXNlKSkpKTsKLSAgICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIH0KLQotICB2b2lkIEFzc2VydE5vT3V0Z29pbmdBY2xEYXRhKCkgewotICAgIGF1dG8gcXVldWVfZW5kID0gYWNsX3F1ZXVlXy5HZXREb3duRW5kKCk7Ci0gICAgRVhQRUNUX0VRKHF1ZXVlX2VuZC0+VHJ5RGVxdWV1ZSgpLCBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgQ29tbWFuZENvbXBsZXRlQ2FsbGJhY2soRXZlbnRWaWV3IGV2ZW50KSB7Ci0gICAgQ29tbWFuZENvbXBsZXRlVmlldyBjb21wbGV0ZV92aWV3ID0gQ29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlRfVFJVRShjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2tzLmZyb250KCkpLkludm9rZShjb21wbGV0ZV92aWV3KTsKLSAgICBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5wb3BfZnJvbnQoKTsKLSAgfQotCi0gIHZvaWQgQ29tbWFuZFN0YXR1c0NhbGxiYWNrKEV2ZW50VmlldyBldmVudCkgewotICAgIENvbW1hbmRTdGF0dXNWaWV3IHN0YXR1c192aWV3ID0gQ29tbWFuZFN0YXR1c1ZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUX1RSVUUoc3RhdHVzX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBzdGQ6Om1vdmUoY29tbWFuZF9zdGF0dXNfY2FsbGJhY2tzLmZyb250KCkpLkludm9rZShzdGF0dXNfdmlldyk7Ci0gICAgY29tbWFuZF9zdGF0dXNfY2FsbGJhY2tzLnBvcF9mcm9udCgpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBPdXRnb2luZ0FjbERhdGEoKSB7Ci0gICAgYXV0byBxdWV1ZV9lbmQgPSBhY2xfcXVldWVfLkdldERvd25FbmQoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QWNsQnVpbGRlcj4gcmVjZWl2ZWQ7Ci0gICAgZG8gewotICAgICAgcmVjZWl2ZWQgPSBxdWV1ZV9lbmQtPlRyeURlcXVldWUoKTsKLSAgICB9IHdoaWxlIChyZWNlaXZlZCA9PSBudWxscHRyKTsKLQotICAgIHJldHVybiBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShyZWNlaXZlZCkpOwotICB9Ci0KLSAgQmlkaVF1ZXVlRW5kPEFjbEJ1aWxkZXIsIEFjbFZpZXc+KiBHZXRBY2xRdWV1ZUVuZCgpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYWNsX3F1ZXVlXy5HZXRVcEVuZCgpOwotICB9Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHt9Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgUmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlOjpDT01NQU5EX0NPTVBMRVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZXIoKS0+QmluZE9uKHRoaXMsICZUZXN0SGNpTGF5ZXI6OkNvbW1hbmRDb21wbGV0ZUNhbGxiYWNrKSk7Ci0gICAgUmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlOjpDT01NQU5EX1NUQVRVUywgR2V0SGFuZGxlcigpLT5CaW5kT24odGhpcywgJlRlc3RIY2lMYXllcjo6Q29tbWFuZFN0YXR1c0NhbGxiYWNrKSk7Ci0gIH0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLQotICB2b2lkIERpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCBFcnJvckNvZGUgcmVhc29uKSBvdmVycmlkZSB7Ci0gICAgR2V0SGFuZGxlcigpLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJlRlc3RIY2lMYXllcjo6ZG9fZGlzY29ubmVjdCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBoYW5kbGUsIHJlYXNvbikpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDxFdmVudENvZGUsIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoRXZlbnRWaWV3KT4+IHJlZ2lzdGVyZWRfZXZlbnRzXzsKLSAgc3RkOjptYXA8U3ViZXZlbnRDb2RlLCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+PiByZWdpc3RlcmVkX2xlX2V2ZW50c187Ci0gIHN0ZDo6bGlzdDxjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4+IGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2tzOwotICBzdGQ6Omxpc3Q8Y29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZFN0YXR1c1ZpZXcpPj4gY29tbWFuZF9zdGF0dXNfY2FsbGJhY2tzOwotICBCaWRpUXVldWU8QWNsVmlldywgQWNsQnVpbGRlcj4gYWNsX3F1ZXVlX3szIC8qIFRPRE86IFNldCBxdWV1ZSBkZXB0aCAqL307Ci0KLSAgc3RkOjpxdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+PiBjb21tYW5kX3F1ZXVlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gY29tbWFuZF9wcm9taXNlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6ZnV0dXJlPHZvaWQ+PiBjb21tYW5kX2Z1dHVyZV87Ci0KLSAgdm9pZCBkb19kaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgRXJyb3JDb2RlIHJlYXNvbikgewotICAgIEhjaUxheWVyOjpEaXNjb25uZWN0KGhhbmRsZSwgcmVhc29uKTsKLSAgfQotfTsKLQotY2xhc3MgQWNsTWFuYWdlck5vQ2FsbGJhY2tzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZXN0X2hjaV9sYXllcl8gPSBuZXcgVGVzdEhjaUxheWVyOyAgLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIHRvIHJlZ2lzdHJ5Ci0gICAgdGVzdF9jb250cm9sbGVyXyA9IG5ldyBUZXN0Q29udHJvbGxlcjsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZIY2lMYXllcjo6RmFjdG9yeSwgdGVzdF9oY2lfbGF5ZXJfKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZDb250cm9sbGVyOjpGYWN0b3J5LCB0ZXN0X2NvbnRyb2xsZXJfKTsKLSAgICBjbGllbnRfaGFuZGxlcl8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0TW9kdWxlSGFuZGxlcigmSGNpTGF5ZXI6OkZhY3RvcnkpOwotICAgIEFTU0VSVF9ORShjbGllbnRfaGFuZGxlcl8sIG51bGxwdHIpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PEFjbE1hbmFnZXI+KCZ0aHJlYWRfKTsKLSAgICBhY2xfbWFuYWdlcl8gPSBzdGF0aWNfY2FzdDxBY2xNYW5hZ2VyKj4oZmFrZV9yZWdpc3RyeV8uR2V0TW9kdWxlVW5kZXJUZXN0KCZBY2xNYW5hZ2VyOjpGYWN0b3J5KSk7Ci0gICAgQWRkcmVzczo6RnJvbVN0cmluZygiQTE6QTI6QTM6QTQ6QTU6QTYiLCByZW1vdGUpOwotCi0gICAgaGNpOjpBZGRyZXNzIGFkZHJlc3M7Ci0gICAgQWRkcmVzczo6RnJvbVN0cmluZygiRDA6MDU6MDQ6MDM6MDI6MDEiLCBhZGRyZXNzKTsKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZShhZGRyZXNzLCBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICAgIGF1dG8gbWluaW11bV9yb3RhdGlvbl90aW1lID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg3ICogNjAgKiAxMDAwKTsKLSAgICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTUgKiA2MCAqIDEwMDApOwotICAgIGFjbF9tYW5hZ2VyXy0+U2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoCi0gICAgICAgIExlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3k6OlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lKTsKLQotICAgIGF1dG8gc2V0X3JhbmRvbV9hZGRyZXNzX3BhY2tldCA9IExlU2V0UmFuZG9tQWRkcmVzc1ZpZXc6OkNyZWF0ZSgKLSAgICAgICAgTGVBZHZlcnRpc2luZ0NvbW1hbmRWaWV3OjpDcmVhdGUodGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1JBTkRPTV9BRERSRVNTKSkpOwotICAgIEFTU0VSVF9UUlVFKHNldF9yYW5kb21fYWRkcmVzc19wYWNrZXQuSXNWYWxpZCgpKTsKLSAgICBteV9pbml0aWF0aW5nX2FkZHJlc3MgPQotICAgICAgICBBZGRyZXNzV2l0aFR5cGUoc2V0X3JhbmRvbV9hZGRyZXNzX3BhY2tldC5HZXRSYW5kb21BZGRyZXNzKCksIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICAgIC8vIFZlcmlmeSBMRSBTZXQgUmFuZG9tIEFkZHJlc3Mgd2FzIHNlbnQgZHVyaW5nIHNldHVwCi0gICAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9SQU5ET01fQUREUkVTUyk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0UmFuZG9tQWRkcmVzc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkFjbE1hbmFnZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gIH0KLQotICBUZXN0TW9kdWxlUmVnaXN0cnkgZmFrZV9yZWdpc3RyeV87Ci0gIFRlc3RIY2lMYXllciogdGVzdF9oY2lfbGF5ZXJfID0gbnVsbHB0cjsKLSAgVGVzdENvbnRyb2xsZXIqIHRlc3RfY29udHJvbGxlcl8gPSBudWxscHRyOwotICBvczo6VGhyZWFkJiB0aHJlYWRfID0gZmFrZV9yZWdpc3RyeV8uR2V0VGVzdFRocmVhZCgpOwotICBBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlcl8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogY2xpZW50X2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgQWRkcmVzcyByZW1vdGU7Ci0gIEFkZHJlc3NXaXRoVHlwZSBteV9pbml0aWF0aW5nX2FkZHJlc3M7Ci0gIGNvbnN0IGJvb2wgdXNlX2Nvbm5lY3RfbGlzdF8gPSB0cnVlOyAgLy8gZ2QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgY29ubmVjdCBsaXN0Ci0KLSAgc3RkOjpmdXR1cmU8dm9pZD4gR2V0Q29ubmVjdGlvbkZ1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKG1vY2tfY29ubmVjdGlvbl9jYWxsYmFja18uY29ubmVjdGlvbl9wcm9taXNlXyA9PSBudWxscHRyLCAiUHJvbWlzZXMgcHJvbWlzZXMgLi4uIE9ubHkgb25lIGF0IGEgdGltZSIpOwotICAgIG1vY2tfY29ubmVjdGlvbl9jYWxsYmFja18uY29ubmVjdGlvbl9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHJldHVybiBtb2NrX2Nvbm5lY3Rpb25fY2FsbGJhY2tfLmNvbm5lY3Rpb25fcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgfQotCi0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IEdldExlQ29ubmVjdGlvbkZ1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKG1vY2tfbGVfY29ubmVjdGlvbl9jYWxsYmFja3NfLmxlX2Nvbm5lY3Rpb25fcHJvbWlzZV8gPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICJQcm9taXNlcyBwcm9taXNlcyAuLi4gT25seSBvbmUgYXQgYSB0aW1lIik7Ci0gICAgbW9ja19sZV9jb25uZWN0aW9uX2NhbGxiYWNrc18ubGVfY29ubmVjdGlvbl9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHJldHVybiBtb2NrX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzXy5sZV9jb25uZWN0aW9uX3Byb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8Q2xhc3NpY0FjbENvbm5lY3Rpb24+IEdldExhc3RDb25uZWN0aW9uKCkgewotICAgIHJldHVybiBtb2NrX2Nvbm5lY3Rpb25fY2FsbGJhY2tfLmNvbm5lY3Rpb25zXy5iYWNrKCk7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8TGVBY2xDb25uZWN0aW9uPiBHZXRMYXN0TGVDb25uZWN0aW9uKCkgewotICAgIHJldHVybiBtb2NrX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzXy5sZV9jb25uZWN0aW9uc18uYmFjaygpOwotICB9Ci0KLSAgdm9pZCBTZW5kQWNsRGF0YSh1aW50MTZfdCBoYW5kbGUsIEFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX2VuZCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgcXVldWVfZW5kLT5SZWdpc3RlckVucXVldWUoY2xpZW50X2hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6QmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oZGVjbHR5cGUocXVldWVfZW5kKSBxdWV1ZV9lbmQsIHVpbnQxNl90IGhhbmRsZSwgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV9lbmQtPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmV4dFBheWxvYWQoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfZW5kLCBoYW5kbGUsIGNvbW1vbjo6UGFzc2VkKHN0ZDo6bW92ZShwcm9taXNlKSkpKTsKLSAgICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIH0KLQotICBjbGFzcyBNb2NrQ29ubmVjdGlvbkNhbGxiYWNrIDogcHVibGljIENvbm5lY3Rpb25DYWxsYmFja3MgewotICAgcHVibGljOgotICAgIHZvaWQgT25Db25uZWN0U3VjY2VzcyhzdGQ6OnVuaXF1ZV9wdHI8Q2xhc3NpY0FjbENvbm5lY3Rpb24+IGNvbm5lY3Rpb24pIG92ZXJyaWRlIHsKLSAgICAgIC8vIENvbnZlcnQgdG8gc3RkOjpzaGFyZWRfcHRyIGR1cmluZyBwdXNoX2JhY2soKQotICAgICAgY29ubmVjdGlvbnNfLnB1c2hfYmFjayhzdGQ6Om1vdmUoY29ubmVjdGlvbikpOwotICAgICAgaWYgKGNvbm5lY3Rpb25fcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgICBjb25uZWN0aW9uX3Byb21pc2VfLT5zZXRfdmFsdWUoKTsKLSAgICAgICAgY29ubmVjdGlvbl9wcm9taXNlXy5yZXNldCgpOwotICAgICAgfQotICAgIH0KLSAgICBNT0NLX01FVEhPRCh2b2lkLCBPbkNvbm5lY3RGYWlsLCAoQWRkcmVzcywgRXJyb3JDb2RlIHJlYXNvbiksIChvdmVycmlkZSkpOwotCi0gICAgTU9DS19NRVRIT0Qodm9pZCwgSEFDS19PbkVzY29Db25uZWN0UmVxdWVzdCwgKEFkZHJlc3MsIENsYXNzT2ZEZXZpY2UpLCAob3ZlcnJpZGUpKTsKLSAgICBNT0NLX01FVEhPRCh2b2lkLCBIQUNLX09uU2NvQ29ubmVjdFJlcXVlc3QsIChBZGRyZXNzLCBDbGFzc09mRGV2aWNlKSwgKG92ZXJyaWRlKSk7Ci0KLSAgICBzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPENsYXNzaWNBY2xDb25uZWN0aW9uPj4gY29ubmVjdGlvbnNfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+IGNvbm5lY3Rpb25fcHJvbWlzZV87Ci0gIH0gbW9ja19jb25uZWN0aW9uX2NhbGxiYWNrXzsKLQotICBjbGFzcyBNb2NrTGVDb25uZWN0aW9uQ2FsbGJhY2tzIDogcHVibGljIExlQ29ubmVjdGlvbkNhbGxiYWNrcyB7Ci0gICBwdWJsaWM6Ci0gICAgdm9pZCBPbkxlQ29ubmVjdFN1Y2Nlc3MoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLCBzdGQ6OnVuaXF1ZV9wdHI8TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uKSBvdmVycmlkZSB7Ci0gICAgICBsZV9jb25uZWN0aW9uc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShjb25uZWN0aW9uKSk7Ci0gICAgICBpZiAobGVfY29ubmVjdGlvbl9wcm9taXNlXyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxlX2Nvbm5lY3Rpb25fcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgICAgICBsZV9jb25uZWN0aW9uX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIE1PQ0tfTUVUSE9EKHZvaWQsIE9uTGVDb25uZWN0RmFpbCwgKEFkZHJlc3NXaXRoVHlwZSwgRXJyb3JDb2RlIHJlYXNvbiksIChvdmVycmlkZSkpOwotCi0gICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxMZUFjbENvbm5lY3Rpb24+PiBsZV9jb25uZWN0aW9uc187Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gbGVfY29ubmVjdGlvbl9wcm9taXNlXzsKLSAgfSBtb2NrX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzXzsKLX07Ci0KLWNsYXNzIEFjbE1hbmFnZXJUZXN0IDogcHVibGljIEFjbE1hbmFnZXJOb0NhbGxiYWNrc1Rlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBY2xNYW5hZ2VyTm9DYWxsYmFja3NUZXN0OjpTZXRVcCgpOwotICAgIGFjbF9tYW5hZ2VyXy0+UmVnaXN0ZXJDYWxsYmFja3MoJm1vY2tfY29ubmVjdGlvbl9jYWxsYmFja18sIGNsaWVudF9oYW5kbGVyXyk7Ci0gICAgYWNsX21hbmFnZXJfLT5SZWdpc3RlckxlQ2FsbGJhY2tzKCZtb2NrX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzXywgY2xpZW50X2hhbmRsZXJfKTsKLSAgfQotfTsKLQotY2xhc3MgQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCA6IHB1YmxpYyBBY2xNYW5hZ2VyVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIEFjbE1hbmFnZXJUZXN0OjpTZXRVcCgpOwotCi0gICAgaGFuZGxlXyA9IDB4MTIzOwotICAgIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlQ29ubmVjdGlvbihyZW1vdGUpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdAotICAgIGF1dG8gbGFzdF9jb21tYW5kID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT04pOwotICAgIHdoaWxlICghbGFzdF9jb21tYW5kLklzVmFsaWQoKSkgewotICAgICAgbGFzdF9jb21tYW5kID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT04pOwotICAgIH0KLQotICAgIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uUm9sZUNoYW5nZShoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgUm9sZTo6Q0VOVFJBTCkpOwotCi0gICAgYXV0byBmaXJzdF9jb25uZWN0aW9uID0gR2V0Q29ubmVjdGlvbkZ1dHVyZSgpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgICAgQ29ubmVjdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgcmVtb3RlLCBMaW5rVHlwZTo6QUNMLCBFbmFibGU6OkRJU0FCTEVEKSk7Ci0KLSAgICBhdXRvIGZpcnN0X2Nvbm5lY3Rpb25fc3RhdHVzID0gZmlyc3RfY29ubmVjdGlvbi53YWl0X2ZvcihrVGltZW91dCk7Ci0gICAgQVNTRVJUX0VRKGZpcnN0X2Nvbm5lY3Rpb25fc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICAgIGNvbm5lY3Rpb25fID0gR2V0TGFzdENvbm5lY3Rpb24oKTsKLSAgICBjb25uZWN0aW9uXy0+UmVnaXN0ZXJDYWxsYmFja3MoJm1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIGNsaWVudF9oYW5kbGVyXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmSGNpTGF5ZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkFjbE1hbmFnZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gIH0KLQotICB2b2lkIHN5bmNfY2xpZW50X2hhbmRsZXIoKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICBjbGllbnRfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpKTsKLSAgICBhdXRvIGZ1dHVyZV9zdGF0dXMgPSBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwotICAgIEVYUEVDVF9FUShmdXR1cmVfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgfQotCi0gIHVpbnQxNl90IGhhbmRsZV87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxDbGFzc2ljQWNsQ29ubmVjdGlvbj4gY29ubmVjdGlvbl87Ci0KLSAgY2xhc3MgTW9ja0Nvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIDogcHVibGljIENvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIHsKLSAgIHB1YmxpYzoKLSAgICBNT0NLX01FVEhPRDEoT25Db25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWQsIHZvaWQodWludDE2X3QgcGFja2V0X3R5cGUpKTsKLSAgICBNT0NLX01FVEhPRDEoT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlLCB2b2lkKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMpKTsKLSAgICBNT0NLX01FVEhPRDEoT25FbmNyeXB0aW9uQ2hhbmdlLCB2b2lkKEVuY3J5cHRpb25FbmFibGVkIGVuYWJsZWQpKTsKLSAgICBNT0NLX01FVEhPRDAoT25DaGFuZ2VDb25uZWN0aW9uTGlua0tleUNvbXBsZXRlLCB2b2lkKCkpOwotICAgIE1PQ0tfTUVUSE9EMShPblJlYWRDbG9ja09mZnNldENvbXBsZXRlLCB2b2lkKHVpbnQxNl90IGNsb2NrX29mZnNlKSk7Ci0gICAgTU9DS19NRVRIT0QzKE9uTW9kZUNoYW5nZSwgdm9pZChFcnJvckNvZGUgc3RhdHVzLCBNb2RlIGN1cnJlbnRfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpKTsKLSAgICBNT0NLX01FVEhPRDUoCi0gICAgICAgIE9uU25pZmZTdWJyYXRpbmcsCi0gICAgICAgIHZvaWQoCi0gICAgICAgICAgICBFcnJvckNvZGUgc3RhdHVzLAotICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LAotICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KSk7Ci0gICAgTU9DS19NRVRIT0Q1KE9uUW9zU2V0dXBDb21wbGV0ZSwgdm9pZChTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsIHVpbnQzMl90IHBlYWtfYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSwgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKSk7Ci0gICAgTU9DS19NRVRIT0Q2KE9uRmxvd1NwZWNpZmljYXRpb25Db21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgdm9pZChGbG93RGlyZWN0aW9uIGZsb3dfZGlyZWN0aW9uLCBTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUsIHVpbnQzMl90IHBlYWtfYmFuZHdpZHRoLCB1aW50MzJfdCBhY2Nlc3NfbGF0ZW5jeSkpOwotICAgIE1PQ0tfTUVUSE9EMChPbkZsdXNoT2NjdXJyZWQsIHZvaWQoKSk7Ci0gICAgTU9DS19NRVRIT0QxKE9uUm9sZURpc2NvdmVyeUNvbXBsZXRlLCB2b2lkKFJvbGUgY3VycmVudF9yb2xlKSk7Ci0gICAgTU9DS19NRVRIT0QxKE9uUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlLCB2b2lkKHVpbnQxNl90IGxpbmtfcG9saWN5X3NldHRpbmdzKSk7Ci0gICAgTU9DS19NRVRIT0QxKE9uUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dENvbXBsZXRlLCB2b2lkKHVpbnQxNl90IGZsdXNoX3RpbWVvdXQpKTsKLSAgICBNT0NLX01FVEhPRDEoT25SZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUsIHZvaWQodWludDhfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCkpOwotICAgIE1PQ0tfTUVUSE9EMShPblJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q29tcGxldGUsIHZvaWQodWludDE2X3QgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KSk7Ci0gICAgTU9DS19NRVRIT0QxKE9uUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyQ29tcGxldGUsIHZvaWQodWludDE2X3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcikpOwotICAgIE1PQ0tfTUVUSE9EMShPblJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlLCB2b2lkKHVpbnQ4X3QgbGlua19xdWFsaXR5KSk7Ci0gICAgTU9DS19NRVRIT0QyKE9uUmVhZEFmaENoYW5uZWxNYXBDb21wbGV0ZSwgdm9pZChBZmhNb2RlIGFmaF9tb2RlLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDEwPiBhZmhfY2hhbm5lbF9tYXApKTsKLSAgICBNT0NLX01FVEhPRDEoT25SZWFkUnNzaUNvbXBsZXRlLCB2b2lkKHVpbnQ4X3QgcnNzaSkpOwotICAgIE1PQ0tfTUVUSE9EMihPblJlYWRDbG9ja0NvbXBsZXRlLCB2b2lkKHVpbnQzMl90IGNsb2NrLCB1aW50MTZfdCBhY2N1cmFjeSkpOwotICAgIE1PQ0tfTUVUSE9EMShPbkNlbnRyYWxMaW5rS2V5Q29tcGxldGUsIHZvaWQoS2V5RmxhZyBmbGFnKSk7Ci0gICAgTU9DS19NRVRIT0QyKE9uUm9sZUNoYW5nZSwgdm9pZChFcnJvckNvZGUgaGNpX3N0YXR1cywgUm9sZSBuZXdfcm9sZSkpOwotICAgIE1PQ0tfTUVUSE9EMShPbkRpc2Nvbm5lY3Rpb24sIHZvaWQoRXJyb3JDb2RlIHJlYXNvbikpOwotICAgIE1PQ0tfTUVUSE9ENCgKLSAgICAgICAgT25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUsCi0gICAgICAgIHZvaWQoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSk7Ci0gICAgTU9DS19NRVRIT0QxKE9uUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGUsIHZvaWQodWludDY0X3QgZmVhdHVyZXMpKTsKLSAgICBNT0NLX01FVEhPRDMoCi0gICAgICAgIE9uUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZSwgdm9pZCh1aW50OF90IHBhZ2VfbnVtYmVyLCB1aW50OF90IG1heF9wYWdlX251bWJlciwgdWludDY0X3QgZmVhdHVyZXMpKTsKLSAgfSBtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfOwotfTsKLQotVEVTVF9GKEFjbE1hbmFnZXJUZXN0LCBzdGFydHVwX3RlYXJkb3duKSB7fQotCi1URVNUX0YoQWNsTWFuYWdlck5vQ2FsbGJhY2tzVGVzdCwgYWNsX2Nvbm5lY3Rpb25fYmVmb3JlX3JlZ2lzdGVyZWRfY2FsbGJhY2tzKSB7Ci0gIENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKHJlbW90ZSwgY2xhc3Nfb2ZfZGV2aWNlLCBDb25uZWN0aW9uUmVxdWVzdExpbmtUeXBlOjpBQ0wpKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkFjbE1hbmFnZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBDb21tYW5kVmlldyBjb21tYW5kID0gQ29tbWFuZFZpZXc6OkNyZWF0ZSh0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKCkpOwotICBFWFBFQ1RfVFJVRShjb21tYW5kLklzVmFsaWQoKSk7Ci0gIE9wQ29kZSBvcF9jb2RlID0gY29tbWFuZC5HZXRPcENvZGUoKTsKLSAgRVhQRUNUX0VRKG9wX2NvZGUsIE9wQ29kZTo6UkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVCk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyVGVzdCwgaW52b2tlX3JlZ2lzdGVyZWRfY2FsbGJhY2tfY29ubmVjdGlvbl9jb21wbGV0ZV9zdWNjZXNzKSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDE7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlQ29ubmVjdGlvbihyZW1vdGUpOwotCi0gIC8vIFdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QKLSAgYXV0byBsYXN0X2NvbW1hbmQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpDUkVBVEVfQ09OTkVDVElPTik7Ci0gIHdoaWxlICghbGFzdF9jb21tYW5kLklzVmFsaWQoKSkgewotICAgIGxhc3RfY29tbWFuZCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkNSRUFURV9DT05ORUNUSU9OKTsKLSAgfQotCi0gIGF1dG8gZmlyc3RfY29ubmVjdGlvbiA9IEdldENvbm5lY3Rpb25GdXR1cmUoKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGUsIHJlbW90ZSwgTGlua1R5cGU6OkFDTCwgRW5hYmxlOjpESVNBQkxFRCkpOwotCi0gIGF1dG8gZmlyc3RfY29ubmVjdGlvbl9zdGF0dXMgPSBmaXJzdF9jb25uZWN0aW9uLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGZpcnN0X2Nvbm5lY3Rpb25fc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICBhdXRvIGNvbm5lY3Rpb24gPSBHZXRMYXN0Q29ubmVjdGlvbigpOwotICBBU1NFUlRfRVEoY29ubmVjdGlvbi0+R2V0QWRkcmVzcygpLCByZW1vdGUpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlclRlc3QsIGludm9rZV9yZWdpc3RlcmVkX2NhbGxiYWNrX2Nvbm5lY3Rpb25fY29tcGxldGVfZmFpbCkgewotICB1aW50MTZfdCBoYW5kbGUgPSAweDEyMzsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgYWNsX21hbmFnZXJfLT5DcmVhdGVDb25uZWN0aW9uKHJlbW90ZSk7Ci0KLSAgLy8gV2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdAotICBhdXRvIGxhc3RfY29tbWFuZCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkNSRUFURV9DT05ORUNUSU9OKTsKLSAgd2hpbGUgKCFsYXN0X2NvbW1hbmQuSXNWYWxpZCgpKSB7Ci0gICAgbGFzdF9jb21tYW5kID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT04pOwotICB9Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX2NhbGxiYWNrXywgT25Db25uZWN0RmFpbChyZW1vdGUsIEVycm9yQ29kZTo6UEFHRV9USU1FT1VUKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIENvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShFcnJvckNvZGU6OlBBR0VfVElNRU9VVCwgaGFuZGxlLCByZW1vdGUsIExpbmtUeXBlOjpBQ0wsIEVuYWJsZTo6RElTQUJMRUQpKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkFjbE1hbmFnZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotfQotCi1jbGFzcyBBY2xNYW5hZ2VyV2l0aExlQ29ubmVjdGlvblRlc3QgOiBwdWJsaWMgQWNsTWFuYWdlclRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBY2xNYW5hZ2VyVGVzdDo6U2V0VXAoKTsKLQotICAgIHJlbW90ZV93aXRoX3R5cGVfID0gQWRkcmVzc1dpdGhUeXBlKHJlbW90ZSwgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gICAgYWNsX21hbmFnZXJfLT5DcmVhdGVMZUNvbm5lY3Rpb24ocmVtb3RlX3dpdGhfdHlwZV8sIHRydWUpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gICAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9DUkVBVEVfQ09OTkVDVElPTik7Ci0gICAgYXV0byBsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3ID0KLSAgICAgICAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKTsKLSAgICBhdXRvIGNvbW1hbmRfdmlldyA9IExlQ3JlYXRlQ29ubmVjdGlvblZpZXc6OkNyZWF0ZShsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KTsKLSAgICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBpZiAodXNlX2Nvbm5lY3RfbGlzdF8pIHsKLSAgICAgIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3MoKSwgZW1wdHlfYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzcygpKTsKLSAgICAgIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3NUeXBlKCksIGVtcHR5X2FkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzKCksIHJlbW90ZSk7Ci0gICAgICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzVHlwZSgpLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgICB9Ci0KLSAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVDcmVhdGVDb25uZWN0aW9uU3RhdHVzQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgMHgwMSkpOwotCi0gICAgYXV0byBmaXJzdF9jb25uZWN0aW9uID0gR2V0TGVDb25uZWN0aW9uRnV0dXJlKCk7Ci0KLSAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nTGVNZXRhRXZlbnQoTGVDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgICAgaGFuZGxlXywKLSAgICAgICAgUm9sZTo6UEVSSVBIRVJBTCwKLSAgICAgICAgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgcmVtb3RlLAotICAgICAgICAweDAxMDAsCi0gICAgICAgIDB4MDAxMCwKLSAgICAgICAgMHgwQzgwLAotICAgICAgICBDbG9ja0FjY3VyYWN5OjpQUE1fMzApKTsKLQotICAgIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gICAgYXV0byBmaXJzdF9jb25uZWN0aW9uX3N0YXR1cyA9IGZpcnN0X2Nvbm5lY3Rpb24ud2FpdF9mb3Ioa1RpbWVvdXQpOwotICAgIEFTU0VSVF9FUShmaXJzdF9jb25uZWN0aW9uX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0KLSAgICBjb25uZWN0aW9uXyA9IEdldExhc3RMZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICAgIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmQWNsTWFuYWdlcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0b3BBbGwoKTsKLSAgfQotCi0gIHZvaWQgc3luY19jbGllbnRfaGFuZGxlcigpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGNsaWVudF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGF1dG8gZnV0dXJlX3N0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Ci0gICAgRVhQRUNUX0VRKGZ1dHVyZV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICB9Ci0KLSAgdWludDE2X3QgaGFuZGxlXyA9IDB4MTIzOwotICBzdGQ6OnNoYXJlZF9wdHI8TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uXzsKLSAgQWRkcmVzc1dpdGhUeXBlIHJlbW90ZV93aXRoX3R5cGVfOwotCi0gIGNsYXNzIE1vY2tMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIDogcHVibGljIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MgewotICAgcHVibGljOgotICAgIE1PQ0tfTUVUSE9EMShPbkRpc2Nvbm5lY3Rpb24sIHZvaWQoRXJyb3JDb2RlIHJlYXNvbikpOwotICAgIE1PQ0tfTUVUSE9ENCgKLSAgICAgICAgT25Db25uZWN0aW9uVXBkYXRlLAotICAgICAgICB2b2lkKAotICAgICAgICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywKLSAgICAgICAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25faW50ZXJ2YWwsCi0gICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0KSk7Ci0gICAgTU9DS19NRVRIT0Q0KE9uRGF0YUxlbmd0aENoYW5nZSwgdm9pZCh1aW50MTZfdCB0eF9vY3RldHMsIHVpbnQxNl90IHR4X3RpbWUsIHVpbnQxNl90IHJ4X29jdGV0cywgdWludDE2X3QgcnhfdGltZSkpOwotICAgIE1PQ0tfTUVUSE9ENCgKLSAgICAgICAgT25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUsCi0gICAgICAgIHZvaWQoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCB2ZXJzaW9uLCB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3ViX3ZlcnNpb24pKTsKLSAgICBNT0NLX01FVEhPRDMoT25QaHlVcGRhdGUsIHZvaWQoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5KSk7Ci0gICAgTU9DS19NRVRIT0QxKE9uTG9jYWxBZGRyZXNzVXBkYXRlLCB2b2lkKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkpOwotICB9IG1vY2tfbGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc187Ci19OwotCi0vLyBUT0RPOiBpbXBsZW1lbnQgdmVyc2lvbiBvZiB0aGlzIHRlc3Qgd2hlcmUgY29udHJvbGxlciBzdXBwb3J0cyBFeHRlbmRlZCBBZHZlcnRpc2luZyBGZWF0dXJlIGluCi0vLyBHZXRMZUxvY2FsU3VwcG9ydGVkRmVhdHVyZXMsIGFuZCBMRSBFeHRlbmRlZCBDcmVhdGUgQ29ubmVjdGlvbiBpcyB1c2VkCi1URVNUX0YoQWNsTWFuYWdlcldpdGhMZUNvbm5lY3Rpb25UZXN0LCBpbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19sZV9jb25uZWN0aW9uX2NvbXBsZXRlX3N1Y2Nlc3MpIHsKLSAgQVNTRVJUX0VRKGNvbm5lY3Rpb25fLT5HZXRMb2NhbEFkZHJlc3MoKSwgbXlfaW5pdGlhdGluZ19hZGRyZXNzKTsKLSAgQVNTRVJUX0VRKGNvbm5lY3Rpb25fLT5HZXRSZW1vdGVBZGRyZXNzKCksIHJlbW90ZV93aXRoX3R5cGVfKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJUZXN0LCBpbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19sZV9jb25uZWN0aW9uX2NvbXBsZXRlX2ZhaWwpIHsKLSAgQWRkcmVzc1dpdGhUeXBlIHJlbW90ZV93aXRoX3R5cGUocmVtb3RlLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlTGVDb25uZWN0aW9uKHJlbW90ZV93aXRoX3R5cGUsIHRydWUpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoT3BDb2RlOjpMRV9DUkVBVEVfQ09OTkVDVElPTik7Ci0gIGF1dG8gbGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldyA9Ci0gICAgICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldCkpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IExlQ3JlYXRlQ29ubmVjdGlvblZpZXc6OkNyZWF0ZShsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGlmICh1c2VfY29ubmVjdF9saXN0XykgewotICAgIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3MoKSwgaGNpOjpBZGRyZXNzOjprRW1wdHkpOwotICB9IGVsc2UgewotICAgIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3MoKSwgcmVtb3RlKTsKLSAgfQotICBFWFBFQ1RfRVEoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzVHlwZSgpLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVDcmVhdGVDb25uZWN0aW9uU3RhdHVzQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgMHgwMSkpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfbGVfY29ubmVjdGlvbl9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPbkxlQ29ubmVjdEZhaWwocmVtb3RlX3dpdGhfdHlwZSwgRXJyb3JDb2RlOjpDT05ORUNUSU9OX1JFSkVDVEVEX0xJTUlURURfUkVTT1VSQ0VTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdMZU1ldGFFdmVudChMZUNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6Q09OTkVDVElPTl9SRUpFQ1RFRF9MSU1JVEVEX1JFU09VUkNFUywKLSAgICAgIDB4MTIzLAotICAgICAgUm9sZTo6UEVSSVBIRVJBTCwKLSAgICAgIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MsCi0gICAgICByZW1vdGUsCi0gICAgICAweDAxMDAsCi0gICAgICAweDAwMTAsCi0gICAgICAweDAwMTEsCi0gICAgICBDbG9ja0FjY3VyYWN5OjpQUE1fMzApKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QpOwotICBsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3ID0gTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKTsKLSAgYXV0byByZW1vdmVfY29tbWFuZF92aWV3ID0gTGVSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3RWaWV3OjpDcmVhdGUobGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHJlbW92ZV9jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlUmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyVGVzdCwgY2FuY2VsX2xlX2Nvbm5lY3Rpb24pIHsKLSAgQWRkcmVzc1dpdGhUeXBlIHJlbW90ZV93aXRoX3R5cGUocmVtb3RlLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlTGVDb25uZWN0aW9uKHJlbW90ZV93aXRoX3R5cGUsIHRydWUpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT04pOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhY2xfbWFuYWdlcl8tPkNhbmNlbExlQ29ubmVjdChyZW1vdGVfd2l0aF90eXBlKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMKTsKLSAgYXV0byBsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3ID0KLSAgICAgIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0KSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gTGVDcmVhdGVDb25uZWN0aW9uQ2FuY2VsVmlldzo6Q3JlYXRlKGxlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVDcmVhdGVDb25uZWN0aW9uQ2FuY2VsQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdMZU1ldGFFdmVudChMZUNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OLAotICAgICAgMHgxMjMsCi0gICAgICBSb2xlOjpQRVJJUEhFUkFMLAotICAgICAgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUywKLSAgICAgIHJlbW90ZSwKLSAgICAgIDB4MDEwMCwKLSAgICAgIDB4MDAxMCwKLSAgICAgIDB4MDAxMSwKLSAgICAgIENsb2NrQWNjdXJhY3k6OlBQTV8zMCkpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfUkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVCk7Ci0gIGxlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcgPSBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldCkpOwotICBhdXRvIHJlbW92ZV9jb21tYW5kX3ZpZXcgPSBMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdFZpZXc6OkNyZWF0ZShsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUocmVtb3ZlX2NvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlclRlc3QsIGNyZWF0ZV9jb25uZWN0aW9uX3dpdGhfZmFzdF9tb2RlKSB7Ci0gIEFkZHJlc3NXaXRoVHlwZSByZW1vdGVfd2l0aF90eXBlKHJlbW90ZSwgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUxlQ29ubmVjdGlvbihyZW1vdGVfd2l0aF90eXBlLCB0cnVlKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT04pOwotICBhdXRvIGNvbW1hbmRfdmlldyA9Ci0gICAgICBMZUNyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldExlU2NhbkludGVydmFsKCksIGtTY2FuSW50ZXJ2YWxGYXN0KTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRMZVNjYW5XaW5kb3coKSwga1NjYW5XaW5kb3dGYXN0KTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQ3JlYXRlQ29ubmVjdGlvblN0YXR1c0J1aWxkZXI6OkNyZWF0ZShFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDEpKTsKLSAgYXV0byBmaXJzdF9jb25uZWN0aW9uID0gR2V0TGVDb25uZWN0aW9uRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdMZU1ldGFFdmVudChMZUNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgIDB4MDAsCi0gICAgICBSb2xlOjpQRVJJUEhFUkFMLAotICAgICAgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUywKLSAgICAgIHJlbW90ZSwKLSAgICAgIDB4MDEwMCwKLSAgICAgIDB4MDAxMCwKLSAgICAgIDB4MEM4MCwKLSAgICAgIENsb2NrQWNjdXJhY3k6OlBQTV8zMCkpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfUkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBhdXRvIGZpcnN0X2Nvbm5lY3Rpb25fc3RhdHVzID0gZmlyc3RfY29ubmVjdGlvbi53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShmaXJzdF9jb25uZWN0aW9uX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyVGVzdCwgY3JlYXRlX2Nvbm5lY3Rpb25fd2l0aF9zbG93X21vZGUpIHsKLSAgQWRkcmVzc1dpdGhUeXBlIHJlbW90ZV93aXRoX3R5cGUocmVtb3RlLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlTGVDb25uZWN0aW9uKHJlbW90ZV93aXRoX3R5cGUsIGZhbHNlKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT04pOwotICBhdXRvIGNvbW1hbmRfdmlldyA9Ci0gICAgICBMZUNyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldExlU2NhbkludGVydmFsKCksIGtTY2FuSW50ZXJ2YWxTbG93KTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRMZVNjYW5XaW5kb3coKSwga1NjYW5XaW5kb3dTbG93KTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQ3JlYXRlQ29ubmVjdGlvblN0YXR1c0J1aWxkZXI6OkNyZWF0ZShFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDEpKTsKLSAgYXV0byBmaXJzdF9jb25uZWN0aW9uID0gR2V0TGVDb25uZWN0aW9uRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdMZU1ldGFFdmVudChMZUNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgIDB4MDAsCi0gICAgICBSb2xlOjpQRVJJUEhFUkFMLAotICAgICAgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUywKLSAgICAgIHJlbW90ZSwKLSAgICAgIDB4MDEwMCwKLSAgICAgIDB4MDAxMCwKLSAgICAgIDB4MEM4MCwKLSAgICAgIENsb2NrQWNjdXJhY3k6OlBQTV8zMCkpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfUkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBhdXRvIGZpcnN0X2Nvbm5lY3Rpb25fc3RhdHVzID0gZmlyc3RfY29ubmVjdGlvbi53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShmaXJzdF9jb25uZWN0aW9uX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aExlQ29ubmVjdGlvblRlc3QsIGFjbF9zZW5kX2RhdGFfb25lX2xlX2Nvbm5lY3Rpb24pIHsKLSAgQVNTRVJUX0VRKGNvbm5lY3Rpb25fLT5HZXRSZW1vdGVBZGRyZXNzKCksIHJlbW90ZV93aXRoX3R5cGVfKTsKLSAgQVNTRVJUX0VRKGNvbm5lY3Rpb25fLT5HZXRIYW5kbGUoKSwgaGFuZGxlXyk7Ci0KLSAgLy8gU2VuZCBhIHBhY2tldCBmcm9tIEhDSQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nQWNsRGF0YShoYW5kbGVfKTsKLSAgYXV0byBxdWV1ZV9lbmQgPSBjb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPj4gcmVjZWl2ZWQ7Ci0gIGRvIHsKLSAgICByZWNlaXZlZCA9IHF1ZXVlX2VuZC0+VHJ5RGVxdWV1ZSgpOwotICB9IHdoaWxlIChyZWNlaXZlZCA9PSBudWxscHRyKTsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHJlY2VpdmVkX3BhY2tldCA9ICpyZWNlaXZlZDsKLQotICAvLyBTZW5kIGEgcGFja2V0IGZyb20gdGhlIGNvbm5lY3Rpb24KLSAgU2VuZEFjbERhdGEoaGFuZGxlXywgY29ubmVjdGlvbl8tPkdldEFjbFF1ZXVlRW5kKCkpOwotCi0gIGF1dG8gc2VudF9wYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPk91dGdvaW5nQWNsRGF0YSgpOwotCi0gIC8vIFNlbmQgYW5vdGhlciBwYWNrZXQgZnJvbSB0aGUgY29ubmVjdGlvbgotICBTZW5kQWNsRGF0YShoYW5kbGVfLCBjb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKSk7Ci0KLSAgc2VudF9wYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPk91dGdvaW5nQWNsRGF0YSgpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhMZUNvbm5lY3Rpb25UZXN0LCBpbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19sZV9jb25uZWN0aW9uX3VwZGF0ZV9zdWNjZXNzKSB7Ci0gIEFTU0VSVF9FUShjb25uZWN0aW9uXy0+R2V0TG9jYWxBZGRyZXNzKCksIG15X2luaXRpYXRpbmdfYWRkcmVzcyk7Ci0gIEFTU0VSVF9FUShjb25uZWN0aW9uXy0+R2V0UmVtb3RlQWRkcmVzcygpLCByZW1vdGVfd2l0aF90eXBlXyk7Ci0gIEFTU0VSVF9FUShjb25uZWN0aW9uXy0+R2V0SGFuZGxlKCksIGhhbmRsZV8pOwotICBjb25uZWN0aW9uXy0+UmVnaXN0ZXJDYWxsYmFja3MoJm1vY2tfbGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIGNsaWVudF9oYW5kbGVyXyk7Ci0KLSAgc3RkOjpwcm9taXNlPEVycm9yQ29kZT4gcHJvbWlzZTsKLSAgRXJyb3JDb2RlIGhjaV9zdGF0dXMgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgdWludDE2X3QgY29ubmVjdGlvbl9pbnRlcnZhbF9taW4gPSAweDAwMTI7Ci0gIHVpbnQxNl90IGNvbm5lY3Rpb25faW50ZXJ2YWxfbWF4ID0gMHgwMDgwOwotICB1aW50MTZfdCBjb25uZWN0aW9uX2ludGVydmFsID0gKGNvbm5lY3Rpb25faW50ZXJ2YWxfbWF4ICsgY29ubmVjdGlvbl9pbnRlcnZhbF9taW4pIC8gMjsKLSAgdWludDE2X3QgY29ubmVjdGlvbl9sYXRlbmN5ID0gMHgwMDAxOwotICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0ID0gMHgwQTAwOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgY29ubmVjdGlvbl8tPkxlQ29ubmVjdGlvblVwZGF0ZShjb25uZWN0aW9uX2ludGVydmFsX21pbiwgY29ubmVjdGlvbl9pbnRlcnZhbF9tYXgsIGNvbm5lY3Rpb25fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc2lvbl90aW1lb3V0LCAweDEwLCAweDIwKTsKLSAgYXV0byB1cGRhdGVfcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfQ09OTkVDVElPTl9VUERBVEUpOwotICBhdXRvIHVwZGF0ZV92aWV3ID0KLSAgICAgIExlQ29ubmVjdGlvblVwZGF0ZVZpZXc6OkNyZWF0ZShMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKHVwZGF0ZV9wYWNrZXQpKSk7Ci0gIEFTU0VSVF9UUlVFKHVwZGF0ZV92aWV3LklzVmFsaWQoKSk7Ci0gIEVYUEVDVF9FUSh1cGRhdGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCksIGhhbmRsZV8pOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfbGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sCi0gICAgICBPbkNvbm5lY3Rpb25VcGRhdGUoaGNpX3N0YXR1cywgY29ubmVjdGlvbl9pbnRlcnZhbCwgY29ubmVjdGlvbl9sYXRlbmN5LCBzdXBlcnZpc2lvbl90aW1lb3V0KSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdMZU1ldGFFdmVudChMZUNvbm5lY3Rpb25VcGRhdGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgY29ubmVjdGlvbl9pbnRlcnZhbCwgY29ubmVjdGlvbl9sYXRlbmN5LCBzdXBlcnZpc2lvbl90aW1lb3V0KSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aExlQ29ubmVjdGlvblRlc3QsIGludm9rZV9yZWdpc3RlcmVkX2NhbGxiYWNrX2xlX2Rpc2Nvbm5lY3QpIHsKLSAgQVNTRVJUX0VRKGNvbm5lY3Rpb25fLT5HZXRSZW1vdGVBZGRyZXNzKCksIHJlbW90ZV93aXRoX3R5cGVfKTsKLSAgQVNTRVJUX0VRKGNvbm5lY3Rpb25fLT5HZXRIYW5kbGUoKSwgaGFuZGxlXyk7Ci0gIGNvbm5lY3Rpb25fLT5SZWdpc3RlckNhbGxiYWNrcygmbW9ja19sZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgY2xpZW50X2hhbmRsZXJfKTsKLQotICBhdXRvIHJlYXNvbiA9IEVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OOwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPbkRpc2Nvbm5lY3Rpb24ocmVhc29uKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+RGlzY29ubmVjdChoYW5kbGVfLCByZWFzb24pOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhMZUNvbm5lY3Rpb25UZXN0LCBESVNBQkxFRF9pbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19sZV9kaXNjb25uZWN0X2RhdGFfcmFjZSkgewotICBBU1NFUlRfRVEoY29ubmVjdGlvbl8tPkdldFJlbW90ZUFkZHJlc3MoKSwgcmVtb3RlX3dpdGhfdHlwZV8pOwotICBBU1NFUlRfRVEoY29ubmVjdGlvbl8tPkdldEhhbmRsZSgpLCBoYW5kbGVfKTsKLSAgY29ubmVjdGlvbl8tPlJlZ2lzdGVyQ2FsbGJhY2tzKCZtb2NrX2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBjbGllbnRfaGFuZGxlcl8pOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdBY2xEYXRhKGhhbmRsZV8pOwotICBhdXRvIHJlYXNvbiA9IEVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OOwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPbkRpc2Nvbm5lY3Rpb24ocmVhc29uKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+RGlzY29ubmVjdChoYW5kbGVfLCByZWFzb24pOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhMZUNvbm5lY3Rpb25UZXN0LCBpbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19sZV9xdWV1ZV9kaXNjb25uZWN0KSB7Ci0gIGF1dG8gcmVhc29uID0gRXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT047Ci0gIHRlc3RfaGNpX2xheWVyXy0+RGlzY29ubmVjdChoYW5kbGVfLCByZWFzb24pOwotICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkhjaUxheWVyOjpGYWN0b3J5LCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7Ci0gIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmQWNsTWFuYWdlcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfbGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uRGlzY29ubmVjdGlvbihyZWFzb24pKTsKLSAgY29ubmVjdGlvbl8tPlJlZ2lzdGVyQ2FsbGJhY2tzKCZtb2NrX2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBjbGllbnRfaGFuZGxlcl8pOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBpbnZva2VfcmVnaXN0ZXJlZF9jYWxsYmFja19kaXNjb25uZWN0aW9uX2NvbXBsZXRlKSB7Ci0gIGF1dG8gcmVhc29uID0gRXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT047Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uRGlzY29ubmVjdGlvbihyZWFzb24pKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5EaXNjb25uZWN0KGhhbmRsZV8sIHJlYXNvbik7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBhY2xfc2VuZF9kYXRhX29uZV9jb25uZWN0aW9uKSB7Ci0gIC8vIFNlbmQgYSBwYWNrZXQgZnJvbSBIQ0kKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0FjbERhdGEoaGFuZGxlXyk7Ci0gIGF1dG8gcXVldWVfZW5kID0gY29ubmVjdGlvbl8tPkdldEFjbFF1ZXVlRW5kKCk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4+IHJlY2VpdmVkOwotICBkbyB7Ci0gICAgcmVjZWl2ZWQgPSBxdWV1ZV9lbmQtPlRyeURlcXVldWUoKTsKLSAgfSB3aGlsZSAocmVjZWl2ZWQgPT0gbnVsbHB0cik7Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiByZWNlaXZlZF9wYWNrZXQgPSAqcmVjZWl2ZWQ7Ci0KLSAgLy8gU2VuZCBhIHBhY2tldCBmcm9tIHRoZSBjb25uZWN0aW9uCi0gIFNlbmRBY2xEYXRhKGhhbmRsZV8sIGNvbm5lY3Rpb25fLT5HZXRBY2xRdWV1ZUVuZCgpKTsKLQotICBhdXRvIHNlbnRfcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5PdXRnb2luZ0FjbERhdGEoKTsKLQotICAvLyBTZW5kIGFub3RoZXIgcGFja2V0IGZyb20gdGhlIGNvbm5lY3Rpb24KLSAgU2VuZEFjbERhdGEoaGFuZGxlXywgY29ubmVjdGlvbl8tPkdldEFjbFF1ZXVlRW5kKCkpOwotCi0gIHNlbnRfcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5PdXRnb2luZ0FjbERhdGEoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGF1dG8gcmVhc29uID0gRXJyb3JDb2RlOjpBVVRIRU5USUNBVElPTl9GQUlMVVJFOwotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPbkRpc2Nvbm5lY3Rpb24ocmVhc29uKSk7Ci0gIGNvbm5lY3Rpb25fLT5EaXNjb25uZWN0KERpc2Nvbm5lY3RSZWFzb246OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkRJU0NPTk5FQ1QpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IERpc2Nvbm5lY3RWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpLCBoYW5kbGVfKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5EaXNjb25uZWN0KGhhbmRsZV8sIHJlYXNvbik7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBhY2xfc2VuZF9kYXRhX2NyZWRpdHMpIHsKLSAgLy8gVXNlIGFsbCB0aGUgY3JlZGl0cwotICBmb3IgKHVpbnQxNl90IGNyZWRpdHMgPSAwOyBjcmVkaXRzIDwgdGVzdF9jb250cm9sbGVyXy0+dG90YWxfYWNsX2J1ZmZlcnNfOyBjcmVkaXRzKyspIHsKLSAgICAvLyBTZW5kIGEgcGFja2V0IGZyb20gdGhlIGNvbm5lY3Rpb24KLSAgICBTZW5kQWNsRGF0YShoYW5kbGVfLCBjb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKSk7Ci0KLSAgICBhdXRvIHNlbnRfcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5PdXRnb2luZ0FjbERhdGEoKTsKLSAgfQotCi0gIC8vIFNlbmQgYW5vdGhlciBwYWNrZXQgZnJvbSB0aGUgY29ubmVjdGlvbgotICBTZW5kQWNsRGF0YShoYW5kbGVfLCBjb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKSk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5Bc3NlcnROb091dGdvaW5nQWNsRGF0YSgpOwotCi0gIHRlc3RfY29udHJvbGxlcl8tPkNvbXBsZXRlUGFja2V0cyhoYW5kbGVfLCAxKTsKLQotICBhdXRvIGFmdGVyX2NyZWRpdHNfc2VudF9wYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPk91dGdvaW5nQWNsRGF0YSgpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9zd2l0Y2hfcm9sZSkgewotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgYWNsX21hbmFnZXJfLT5Td2l0Y2hSb2xlKGNvbm5lY3Rpb25fLT5HZXRBZGRyZXNzKCksIFJvbGU6OlBFUklQSEVSQUwpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlNXSVRDSF9ST0xFKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBTd2l0Y2hSb2xlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldEJkQWRkcigpLCBjb25uZWN0aW9uXy0+R2V0QWRkcmVzcygpKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRSb2xlKCksIFJvbGU6OlBFUklQSEVSQUwpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uUm9sZUNoYW5nZShoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgUm9sZTo6UEVSSVBIRVJBTCkpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBSb2xlQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgY29ubmVjdGlvbl8tPkdldEFkZHJlc3MoKSwgUm9sZTo6UEVSSVBIRVJBTCkpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF93cml0ZV9kZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICB1aW50MTZfdCBsaW5rX3BvbGljeV9zZXR0aW5ncyA9IDB4MDU7Ci0gIGFjbF9tYW5hZ2VyXy0+V3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKGxpbmtfcG9saWN5X3NldHRpbmdzKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpXUklURV9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBXcml0ZURlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3NWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0RGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncygpLCAweDA1KTsKLQotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgV3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIEFTU0VSVF9FUShsaW5rX3BvbGljeV9zZXR0aW5ncywgYWNsX21hbmFnZXJfLT5SZWFkRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncygpKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdGVkKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+QXV0aGVudGljYXRpb25SZXF1ZXN0ZWQoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpBVVRIRU5USUNBVElPTl9SRVFVRVNURUQpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IEF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uQXV0aGVudGljYXRpb25Db21wbGV0ZSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChBdXRoZW50aWNhdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXykpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9yZWFkX2Nsb2NrX29mZnNldCkgewotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgY29ubmVjdGlvbl8tPlJlYWRDbG9ja09mZnNldCgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlJFQURfQ0xPQ0tfT0ZGU0VUKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBSZWFkQ2xvY2tPZmZzZXRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgT25SZWFkQ2xvY2tPZmZzZXRDb21wbGV0ZSgweDAxMjMpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KFJlYWRDbG9ja09mZnNldENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgMHgwMTIzKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX2hvbGRfbW9kZSkgewotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgY29ubmVjdGlvbl8tPkhvbGRNb2RlKDB4MDUwMCwgMHgwMDIwKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpIT0xEX01PREUpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IEhvbGRNb2RlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldEhvbGRNb2RlTWF4SW50ZXJ2YWwoKSwgMHgwNTAwKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRIb2xkTW9kZU1pbkludGVydmFsKCksIDB4MDAyMCk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgT25Nb2RlQ2hhbmdlKEVycm9yQ29kZTo6U1VDQ0VTUywgTW9kZTo6SE9MRCwgMHgwMDIwKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChNb2RlQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgTW9kZTo6SE9MRCwgMHgwMDIwKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX3NuaWZmX21vZGUpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5TbmlmZk1vZGUoMHgwNTAwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDE0KTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpTTklGRl9NT0RFKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBTbmlmZk1vZGVWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0U25pZmZNYXhJbnRlcnZhbCgpLCAweDA1MDApOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFNuaWZmTWluSW50ZXJ2YWwoKSwgMHgwMDIwKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRTbmlmZkF0dGVtcHQoKSwgMHgwMDQwKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRTbmlmZlRpbWVvdXQoKSwgMHgwMDE0KTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPbk1vZGVDaGFuZ2UoRXJyb3JDb2RlOjpTVUNDRVNTLCBNb2RlOjpTTklGRiwgMHgwMDI4KSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChNb2RlQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgTW9kZTo6U05JRkYsIDB4MDAyOCkpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9leGl0X3NuaWZmX21vZGUpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5FeGl0U25pZmZNb2RlKCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6RVhJVF9TTklGRl9NT0RFKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBFeGl0U25pZmZNb2RlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uTW9kZUNoYW5nZShFcnJvckNvZGU6OlNVQ0NFU1MsIE1vZGU6OkFDVElWRSwgMHgwMCkpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTW9kZUNoYW5nZUJ1aWxkZXI6OkNyZWF0ZShFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8sIE1vZGU6OkFDVElWRSwgMHgwMCkpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9xb3Nfc2V0dXApIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5Rb3NTZXR1cChTZXJ2aWNlVHlwZTo6QkVTVF9FRkZPUlQsIDB4MTIzNCwgMHgxMjMzLCAweDEyMzIsIDB4MTIzMSk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6UU9TX1NFVFVQKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBRb3NTZXR1cFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRTZXJ2aWNlVHlwZSgpLCBTZXJ2aWNlVHlwZTo6QkVTVF9FRkZPUlQpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFRva2VuUmF0ZSgpLCAweDEyMzQpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlYWtCYW5kd2lkdGgoKSwgMHgxMjMzKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRMYXRlbmN5KCksIDB4MTIzMik7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0RGVsYXlWYXJpYXRpb24oKSwgMHgxMjMxKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPblFvc1NldHVwQ29tcGxldGUoU2VydmljZVR5cGU6OkJFU1RfRUZGT1JULCAweDEyMzQsIDB4MTIzMywgMHgxMjMyLCAweDEyMzEpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KFFvc1NldHVwQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCBTZXJ2aWNlVHlwZTo6QkVTVF9FRkZPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIzNCwgMHgxMjMzLCAweDEyMzIsIDB4MTIzMSkpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9mbG93X3NwZWNpZmljYXRpb24pIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5GbG93U3BlY2lmaWNhdGlvbihGbG93RGlyZWN0aW9uOjpPVVRHT0lOR19GTE9XLCBTZXJ2aWNlVHlwZTo6QkVTVF9FRkZPUlQsIDB4MTIzNCwgMHgxMjMzLCAweDEyMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzEpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkZMT1dfU1BFQ0lGSUNBVElPTik7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gRmxvd1NwZWNpZmljYXRpb25WaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0Rmxvd0RpcmVjdGlvbigpLCBGbG93RGlyZWN0aW9uOjpPVVRHT0lOR19GTE9XKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRTZXJ2aWNlVHlwZSgpLCBTZXJ2aWNlVHlwZTo6QkVTVF9FRkZPUlQpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFRva2VuUmF0ZSgpLCAweDEyMzQpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFRva2VuQnVja2V0U2l6ZSgpLCAweDEyMzMpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlYWtCYW5kd2lkdGgoKSwgMHgxMjMyKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRBY2Nlc3NMYXRlbmN5KCksIDB4MTIzMSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25GbG93U3BlY2lmaWNhdGlvbkNvbXBsZXRlKEZsb3dEaXJlY3Rpb246Ok9VVEdPSU5HX0ZMT1csIFNlcnZpY2VUeXBlOjpCRVNUX0VGRk9SVCwgMHgxMjM0LCAweDEyMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzIsIDB4MTIzMSkpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBGbG93U3BlY2lmaWNhdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgRmxvd0RpcmVjdGlvbjo6T1VUR09JTkdfRkxPVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZVR5cGU6OkJFU1RfRUZGT1JULCAweDEyMzQsIDB4MTIzMywgMHgxMjMyLCAweDEyMzEpKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfZmx1c2gpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5GbHVzaCgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkZMVVNIKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBGbHVzaFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPbkZsdXNoT2NjdXJyZWQoKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChGbHVzaE9jY3VycmVkQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZV8pKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfcm9sZV9kaXNjb3ZlcnkpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5Sb2xlRGlzY292ZXJ5KCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6Uk9MRV9ESVNDT1ZFUlkpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFJvbGVEaXNjb3ZlcnlWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgT25Sb2xlRGlzY292ZXJ5Q29tcGxldGUoUm9sZTo6Q0VOVFJBTCkpOwotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgUm9sZURpc2NvdmVyeUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8sIFJvbGU6OkNFTlRSQUwpKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfcmVhZF9saW5rX3BvbGljeV9zZXR0aW5ncykgewotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgY29ubmVjdGlvbl8tPlJlYWRMaW5rUG9saWN5U2V0dGluZ3MoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpSRUFEX0xJTktfUE9MSUNZX1NFVFRJTkdTKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBSZWFkTGlua1BvbGljeVNldHRpbmdzVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlKDB4MDcpKTsKLSAgdWludDhfdCBudW1fcGFja2V0cyA9IDE7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIFJlYWRMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCAweDA3KSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX3dyaXRlX2xpbmtfcG9saWN5X3NldHRpbmdzKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+V3JpdGVMaW5rUG9saWN5U2V0dGluZ3MoMHgwNSk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6V1JJVEVfTElOS19QT0xJQ1lfU0VUVElOR1MpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFdyaXRlTGlua1BvbGljeVNldHRpbmdzVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldExpbmtQb2xpY3lTZXR0aW5ncygpLCAweDA1KTsKLQotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgV3JpdGVMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX3NuaWZmX3N1YnJhdGluZykgewotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgY29ubmVjdGlvbl8tPlNuaWZmU3VicmF0aW5nKDB4MTIzNCwgMHgxMjM1LCAweDEyMzYpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlNOSUZGX1NVQlJBVElORyk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gU25pZmZTdWJyYXRpbmdWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0TWF4aW11bUxhdGVuY3koKSwgMHgxMjM0KTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRNaW5pbXVtUmVtb3RlVGltZW91dCgpLCAweDEyMzUpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldE1pbmltdW1Mb2NhbFRpbWVvdXQoKSwgMHgxMjM2KTsKLQotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KFNuaWZmU3VicmF0aW5nQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXykpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0KSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+UmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dCgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlJFQURfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgT25SZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGUoMHgwN2ZmKSk7Ci0gIHVpbnQ4X3QgbnVtX3BhY2tldHMgPSAxOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBSZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgMHgwN2ZmKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX3dyaXRlX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0KSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+V3JpdGVBdXRvbWF0aWNGbHVzaFRpbWVvdXQoMHgwN0ZGKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpXUklURV9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gV3JpdGVBdXRvbWF0aWNGbHVzaFRpbWVvdXRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0Rmx1c2hUaW1lb3V0KCksIDB4MDdGRik7Ci0KLSAgdWludDhfdCBudW1fcGFja2V0cyA9IDE7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIFdyaXRlQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXykpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9yZWFkX3RyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+UmVhZFRyYW5zbWl0UG93ZXJMZXZlbChUcmFuc21pdFBvd2VyTGV2ZWxUeXBlOjpDVVJSRU5UKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpSRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBSZWFkVHJhbnNtaXRQb3dlckxldmVsVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFRyYW5zbWl0UG93ZXJMZXZlbFR5cGUoKSwgVHJhbnNtaXRQb3dlckxldmVsVHlwZTo6Q1VSUkVOVCk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgT25SZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUoMHgwNykpOwotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgUmVhZFRyYW5zbWl0UG93ZXJMZXZlbENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8sIDB4MDcpKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfcmVhZF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlJFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPblJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q29tcGxldGUoMHg1Njc3KSk7Ci0gIHVpbnQ4X3QgbnVtX3BhY2tldHMgPSAxOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8sIDB4NTY3NykpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF93cml0ZV9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5Xcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQoMHg1Njc4KTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpXUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KCksIDB4NTY3OCk7Ci0KLSAgdWludDhfdCBudW1fcGFja2V0cyA9IDE7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8pKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+UmVhZEZhaWxlZENvbnRhY3RDb3VudGVyKCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6UkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywgT25SZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZSgweDAwKSk7Ci0gIHVpbnQ4X3QgbnVtX3BhY2tldHMgPSAxOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCAweDAwKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX3Jlc2V0X2ZhaWxlZF9jb250YWN0X2NvdW50ZXIpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5SZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6UkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUik7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gUmVzZXRGYWlsZWRDb250YWN0Q291bnRlclZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgUmVzZXRGYWlsZWRDb250YWN0Q291bnRlckNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8pKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfcmVhZF9saW5rX3F1YWxpdHkpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5SZWFkTGlua1F1YWxpdHkoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpSRUFEX0xJTktfUVVBTElUWSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gUmVhZExpbmtRdWFsaXR5Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uUmVhZExpbmtRdWFsaXR5Q29tcGxldGUoMHhhOSkpOwotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgUmVhZExpbmtRdWFsaXR5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgMHhhOSkpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhDb25uZWN0aW9uVGVzdCwgc2VuZF9yZWFkX2FmaF9jaGFubmVsX21hcCkgewotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgY29ubmVjdGlvbl8tPlJlYWRBZmhDaGFubmVsTWFwKCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6UkVBRF9BRkhfQ0hBTk5FTF9NQVApOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFJlYWRBZmhDaGFubmVsTWFwVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDEwPiBhZmhfY2hhbm5lbF9tYXAgPSB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOX07Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzXywKLSAgICAgICAgICAgICAgT25SZWFkQWZoQ2hhbm5lbE1hcENvbXBsZXRlKEFmaE1vZGU6OkFGSF9FTkFCTEVELCBhZmhfY2hhbm5lbF9tYXApKTsKLSAgdWludDhfdCBudW1fcGFja2V0cyA9IDE7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChSZWFkQWZoQ2hhbm5lbE1hcENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmaE1vZGU6OkFGSF9FTkFCTEVELCBhZmhfY2hhbm5lbF9tYXApKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHNlbmRfcmVhZF9yc3NpKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBjb25uZWN0aW9uXy0+UmVhZFJzc2koKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpSRUFEX1JTU0kpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFJlYWRSc3NpVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrc18sIE9uUmVhZFJzc2lDb21wbGV0ZSgweDAwKSk7Ci0gIHVpbnQ4X3QgbnVtX3BhY2tldHMgPSAxOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoUmVhZFJzc2lDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCAweDAwKSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCBzZW5kX3JlYWRfY2xvY2spIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGNvbm5lY3Rpb25fLT5SZWFkQ2xvY2soV2hpY2hDbG9jazo6TE9DQUwpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlJFQURfQ0xPQ0spOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IFJlYWRDbG9ja1ZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRXaGljaENsb2NrKCksIFdoaWNoQ2xvY2s6OkxPQ0FMKTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3NfLCBPblJlYWRDbG9ja0NvbXBsZXRlKDB4MDAwMDJlNmEsIDB4MDAwMCkpOwotICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgUmVhZENsb2NrQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlXywgMHgwMDAwMmU2YSwgMHgwMDAwKSk7Ci19Ci0KLWNsYXNzIEFjbE1hbmFnZXJXaXRoUmVzb2x2YWJsZUFkZHJlc3NUZXN0IDogcHVibGljIEFjbE1hbmFnZXJOb0NhbGxiYWNrc1Rlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZXN0X2hjaV9sYXllcl8gPSBuZXcgVGVzdEhjaUxheWVyOyAgLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIHRvIHJlZ2lzdHJ5Ci0gICAgdGVzdF9jb250cm9sbGVyXyA9IG5ldyBUZXN0Q29udHJvbGxlcjsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZIY2lMYXllcjo6RmFjdG9yeSwgdGVzdF9oY2lfbGF5ZXJfKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZDb250cm9sbGVyOjpGYWN0b3J5LCB0ZXN0X2NvbnRyb2xsZXJfKTsKLSAgICBjbGllbnRfaGFuZGxlcl8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0TW9kdWxlSGFuZGxlcigmSGNpTGF5ZXI6OkZhY3RvcnkpOwotICAgIEFTU0VSVF9ORShjbGllbnRfaGFuZGxlcl8sIG51bGxwdHIpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PEFjbE1hbmFnZXI+KCZ0aHJlYWRfKTsKLSAgICBhY2xfbWFuYWdlcl8gPSBzdGF0aWNfY2FzdDxBY2xNYW5hZ2VyKj4oZmFrZV9yZWdpc3RyeV8uR2V0TW9kdWxlVW5kZXJUZXN0KCZBY2xNYW5hZ2VyOjpGYWN0b3J5KSk7Ci0gICAgQWRkcmVzczo6RnJvbVN0cmluZygiQTE6QTI6QTM6QTQ6QTU6QTYiLCByZW1vdGUpOwotCi0gICAgaGNpOjpBZGRyZXNzIGFkZHJlc3M7Ci0gICAgQWRkcmVzczo6RnJvbVN0cmluZygiRDA6MDU6MDQ6MDM6MDI6MDEiLCBhZGRyZXNzKTsKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZShhZGRyZXNzLCBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICAgIGFjbF9tYW5hZ2VyXy0+UmVnaXN0ZXJDYWxsYmFja3MoJm1vY2tfY29ubmVjdGlvbl9jYWxsYmFja18sIGNsaWVudF9oYW5kbGVyXyk7Ci0gICAgYWNsX21hbmFnZXJfLT5SZWdpc3RlckxlQ2FsbGJhY2tzKCZtb2NrX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzXywgY2xpZW50X2hhbmRsZXJfKTsKLSAgICBhdXRvIG1pbmltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNyAqIDYwICogMTAwMCk7Ci0gICAgYXV0byBtYXhpbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDE1ICogNjAgKiAxMDAwKTsKLSAgICBhY2xfbWFuYWdlcl8tPlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKAotICAgICAgICBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfUkVTT0xWQUJMRV9BRERSRVNTLAotICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotCi0gICAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9SQU5ET01fQUREUkVTUyk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0UmFuZG9tQWRkcmVzc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICB9Ci19OwotCi1URVNUX0YoQWNsTWFuYWdlcldpdGhSZXNvbHZhYmxlQWRkcmVzc1Rlc3QsIGNyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF9mYWlsKSB7Ci0gIGF1dG8gcmVtb3RlX3dpdGhfdHlwZV8gPSBBZGRyZXNzV2l0aFR5cGUocmVtb3RlLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlTGVDb25uZWN0aW9uKHJlbW90ZV93aXRoX3R5cGVfLCB0cnVlKTsKLQotICAvLyBTZXQgcmFuZG9tIGFkZHJlc3MKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9SQU5ET01fQUREUkVTUyk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRSYW5kb21BZGRyZXNzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgLy8gQWRkIGRldmljZSB0byBjb25uZWN0IGxpc3QKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUFkZERldmljZVRvQ29ubmVjdExpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgweDAxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLQotICAvLyBzZW5kIGNyZWF0ZSBjb25uZWN0aW9uIGNvbW1hbmQKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0NSRUFURV9DT05ORUNUSU9OKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQ3JlYXRlQ29ubmVjdGlvblN0YXR1c0J1aWxkZXI6OkNyZWF0ZShFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDEpKTsKLQotICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkhjaUxheWVyOjpGYWN0b3J5LCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7Ci0gIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmQWNsTWFuYWdlcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotCi0gIEFkZHJlc3MgcmVtb3RlMjsKLSAgQWRkcmVzczo6RnJvbVN0cmluZygiQTE6QTI6QTM6QTQ6QTU6QTciLCByZW1vdGUyKTsKLSAgYXV0byByZW1vdGVfd2l0aF90eXBlMiA9IEFkZHJlc3NXaXRoVHlwZShyZW1vdGUyLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLQotICAvLyBjcmVhdGUgYW5vdGhlciBjb25uZWN0aW9uCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUxlQ29ubmVjdGlvbihyZW1vdGVfd2l0aF90eXBlMiwgdHJ1ZSk7Ci0KLSAgLy8gY2FuY2VsIHByZXZpb3VzIGNvbm5lY3Rpb24KLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0NSRUFURV9DT05ORUNUSU9OX0NBTkNFTCk7Ci0KLSAgLy8gcmVjZWl2ZSBjb25uZWN0aW9uIGNvbXBsZXRlIG9mIGZpcnN0IGRldmljZQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nTGVNZXRhRXZlbnQoTGVDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAweDEyMywKLSAgICAgIFJvbGU6OlBFUklQSEVSQUwsCi0gICAgICBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTLAotICAgICAgcmVtb3RlLAotICAgICAgMHgwMTAwLAotICAgICAgMHgwMDEwLAotICAgICAgMHgwMDExLAotICAgICAgQ2xvY2tBY2N1cmFjeTo6UFBNXzMwKSk7Ci0KLSAgLy8gcmVjZWl2ZSBjcmVhdGUgY29ubmVjdGlvbiBjYW5jZWwgY29tcGxldGUgd2l0aCBFcnJvckNvZGU6OkNPTk5FQ1RJT05fQUxSRUFEWV9FWElTVFMKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIExlQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6Q09OTkVDVElPTl9BTFJFQURZX0VYSVNUUykpOwotCi0gIC8vIEFkZCBhbm90aGVyIGRldmljZSB0byBjb25uZWN0IGxpc3QKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotfQotCi1jbGFzcyBBY2xNYW5hZ2VyTGlmZUN5Y2xlVGVzdCA6IHB1YmxpYyBBY2xNYW5hZ2VyTm9DYWxsYmFja3NUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgQWNsTWFuYWdlck5vQ2FsbGJhY2tzVGVzdDo6U2V0VXAoKTsKLSAgICBhY2xfbWFuYWdlcl8tPlJlZ2lzdGVyQ2FsbGJhY2tzKCZtb2NrX2Nvbm5lY3Rpb25fY2FsbGJhY2tfLCBjbGllbnRfaGFuZGxlcl8pOwotICAgIGFjbF9tYW5hZ2VyXy0+UmVnaXN0ZXJMZUNhbGxiYWNrcygmbW9ja19sZV9jb25uZWN0aW9uX2NhbGxiYWNrc18sIGNsaWVudF9oYW5kbGVyXyk7Ci0gIH0KLQotICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX3dpdGhfdHlwZV87Ci0gIHVpbnQxNl90IGhhbmRsZV97MHgxMjN9OwotfTsKLQotVEVTVF9GKEFjbE1hbmFnZXJMaWZlQ3ljbGVUZXN0LCB1bnJlZ2lzdGVyX2NsYXNzaWNfYWZ0ZXJfY3JlYXRlX2Nvbm5lY3Rpb24pIHsKLSAgLy8gSW5qZWN0IGNyZWF0ZSBjb25uZWN0aW9uCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUNvbm5lY3Rpb24ocmVtb3RlKTsKLSAgYXV0byBjb25uZWN0aW9uX2NvbW1hbmQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpDUkVBVEVfQ09OTkVDVElPTik7Ci0KLSAgLy8gVW5yZWdpc3RlciBjYWxsYmFja3MgYWZ0ZXIgc2VuZGluZyBjb25uZWN0aW9uIHJlcXVlc3QKLSAgYXV0byBwcm9taXNlID0gc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+VW5yZWdpc3RlckNhbGxiYWNrcygmbW9ja19jb25uZWN0aW9uX2NhbGxiYWNrXywgc3RkOjptb3ZlKHByb21pc2UpKTsKLSAgZnV0dXJlLmdldCgpOwotCi0gIC8vIEluamVjdCBwZWVyIHNlbmRpbmcgY29ubmVjdGlvbiBjb21wbGV0ZQotICBhdXRvIGNvbm5lY3Rpb25fZnV0dXJlID0gR2V0Q29ubmVjdGlvbkZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCByZW1vdGUsIExpbmtUeXBlOjpBQ0wsIEVuYWJsZTo6RElTQUJMRUQpKTsKLSAgYXV0byBjb25uZWN0aW9uX2Z1dHVyZV9zdGF0dXMgPSBjb25uZWN0aW9uX2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9ORShjb25uZWN0aW9uX2Z1dHVyZV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotfQotCi1URVNUX0YoQWNsTWFuYWdlckxpZmVDeWNsZVRlc3QsIHVucmVnaXN0ZXJfY2xhc3NpY19iZWZvcmVfY29ubmVjdGlvbl9yZXF1ZXN0KSB7Ci0gIENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlOwotCi0gIC8vIFVucmVnaXN0ZXIgY2FsbGJhY2tzIGJlZm9yZSByZWNlaXZpbmcgY29ubmVjdGlvbiByZXF1ZXN0Ci0gIGF1dG8gcHJvbWlzZSA9IHN0ZDo6cHJvbWlzZTx2b2lkPigpOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBhY2xfbWFuYWdlcl8tPlVucmVnaXN0ZXJDYWxsYmFja3MoJm1vY2tfY29ubmVjdGlvbl9jYWxsYmFja18sIHN0ZDo6bW92ZShwcm9taXNlKSk7Ci0gIGZ1dHVyZS5nZXQoKTsKLQotICAvLyBJbmplY3QgcGVlciBzZW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdAotICBhdXRvIGNvbm5lY3Rpb25fZnV0dXJlID0gR2V0Q29ubmVjdGlvbkZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShyZW1vdGUsIGNsYXNzX29mX2RldmljZSwgQ29ubmVjdGlvblJlcXVlc3RMaW5rVHlwZTo6QUNMKSk7Ci0gIGF1dG8gY29ubmVjdGlvbl9mdXR1cmVfc3RhdHVzID0gY29ubmVjdGlvbl9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICBBU1NFUlRfTkUoY29ubmVjdGlvbl9mdXR1cmVfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6UkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVCk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyTGlmZUN5Y2xlVGVzdCwgdW5yZWdpc3Rlcl9sZV9iZWZvcmVfY29ubmVjdGlvbl9jb21wbGV0ZSkgewotICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX3dpdGhfdHlwZShyZW1vdGUsIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgYWNsX21hbmFnZXJfLT5DcmVhdGVMZUNvbm5lY3Rpb24ocmVtb3RlX3dpdGhfdHlwZSwgdHJ1ZSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoT3BDb2RlOjpMRV9BRERfREVWSUNFX1RPX0NPTk5FQ1RfTElTVCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUFkZERldmljZVRvQ29ubmVjdExpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgweDAxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT04pOwotICBhdXRvIGxlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcgPQotICAgICAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBMZUNyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUobGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBpZiAodXNlX2Nvbm5lY3RfbGlzdF8pIHsKLSAgICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzKCksIGhjaTo6QWRkcmVzczo6a0VtcHR5KTsKLSAgfSBlbHNlIHsKLSAgICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzKCksIHJlbW90ZSk7Ci0gIH0KLSAgQVNTRVJUX0VRKGNvbW1hbmRfdmlldy5HZXRQZWVyQWRkcmVzc1R5cGUoKSwgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0KLSAgLy8gVW5yZWdpc3RlciBjYWxsYmFja3MgYWZ0ZXIgc2VuZGluZyBjb25uZWN0aW9uIHJlcXVlc3QKLSAgYXV0byBwcm9taXNlID0gc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGFjbF9tYW5hZ2VyXy0+VW5yZWdpc3RlckxlQ2FsbGJhY2tzKCZtb2NrX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzXywgc3RkOjptb3ZlKHByb21pc2UpKTsKLSAgZnV0dXJlLmdldCgpOwotCi0gIGF1dG8gY29ubmVjdGlvbl9mdXR1cmUgPSBHZXRMZUNvbm5lY3Rpb25GdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0xlTWV0YUV2ZW50KExlQ29ubmVjdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgMHgxMjMsCi0gICAgICBSb2xlOjpQRVJJUEhFUkFMLAotICAgICAgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUywKLSAgICAgIHJlbW90ZSwKLSAgICAgIDB4MDEwMCwKLSAgICAgIDB4MDAxMCwKLSAgICAgIDB4MDUwMCwKLSAgICAgIENsb2NrQWNjdXJhY3k6OlBQTV8zMCkpOwotCi0gIGF1dG8gY29ubmVjdGlvbl9mdXR1cmVfc3RhdHVzID0gY29ubmVjdGlvbl9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICBBU1NFUlRfTkUoY29ubmVjdGlvbl9mdXR1cmVfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJMaWZlQ3ljbGVUZXN0LCB1bnJlZ2lzdGVyX2xlX2JlZm9yZV9lbmhhbmNlZF9jb25uZWN0aW9uX2NvbXBsZXRlKSB7Ci0gIEFkZHJlc3NXaXRoVHlwZSByZW1vdGVfd2l0aF90eXBlKHJlbW90ZSwgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUxlQ29ubmVjdGlvbihyZW1vdGVfd2l0aF90eXBlLCB0cnVlKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoT3BDb2RlOjpMRV9DUkVBVEVfQ09OTkVDVElPTik7Ci0gIGF1dG8gbGVfY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldyA9Ci0gICAgICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldCkpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IExlQ3JlYXRlQ29ubmVjdGlvblZpZXc6OkNyZWF0ZShsZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGlmICh1c2VfY29ubmVjdF9saXN0XykgewotICAgIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3MoKSwgaGNpOjpBZGRyZXNzOjprRW1wdHkpOwotICB9IGVsc2UgewotICAgIEFTU0VSVF9FUShjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3MoKSwgcmVtb3RlKTsKLSAgfQotICBBU1NFUlRfRVEoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzVHlwZSgpLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLQotICAvLyBVbnJlZ2lzdGVyIGNhbGxiYWNrcyBhZnRlciBzZW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdAotICBhdXRvIHByb21pc2UgPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgYWNsX21hbmFnZXJfLT5VbnJlZ2lzdGVyTGVDYWxsYmFja3MoJm1vY2tfbGVfY29ubmVjdGlvbl9jYWxsYmFja3NfLCBzdGQ6Om1vdmUocHJvbWlzZSkpOwotICBmdXR1cmUuZ2V0KCk7Ci0KLSAgYXV0byBjb25uZWN0aW9uX2Z1dHVyZSA9IEdldExlQ29ubmVjdGlvbkZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nTGVNZXRhRXZlbnQoTGVFbmhhbmNlZENvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgIDB4MTIzLAotICAgICAgUm9sZTo6UEVSSVBIRVJBTCwKLSAgICAgIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MsCi0gICAgICByZW1vdGUsCi0gICAgICBBZGRyZXNzOjprRW1wdHksCi0gICAgICBBZGRyZXNzOjprRW1wdHksCi0gICAgICAweDAxMDAsCi0gICAgICAweDAwMTAsCi0gICAgICAweDA1MDAsCi0gICAgICBDbG9ja0FjY3VyYWN5OjpQUE1fMzApKTsKLQotICBhdXRvIGNvbm5lY3Rpb25fZnV0dXJlX3N0YXR1cyA9IGNvbm5lY3Rpb25fZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX05FKGNvbm5lY3Rpb25fZnV0dXJlX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci19Ci0KLVRFU1RfRihBY2xNYW5hZ2VyV2l0aENvbm5lY3Rpb25UZXN0LCByZW1vdGVfc2NvX2Nvbm5lY3RfcmVxdWVzdCkgewotICBDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fY2FsbGJhY2tfLCBIQUNLX09uU2NvQ29ubmVjdFJlcXVlc3QocmVtb3RlLCBjbGFzc19vZl9kZXZpY2UpKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShyZW1vdGUsIGNsYXNzX29mX2RldmljZSwgQ29ubmVjdGlvblJlcXVlc3RMaW5rVHlwZTo6U0NPKSk7Ci0gIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmSGNpTGF5ZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZBY2xNYW5hZ2VyOjpGYWN0b3J5LCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7Ci0gIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmSGNpTGF5ZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLX0KLQotVEVTVF9GKEFjbE1hbmFnZXJXaXRoQ29ubmVjdGlvblRlc3QsIHJlbW90ZV9lc2NvX2Nvbm5lY3RfcmVxdWVzdCkgewotICBDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2Nvbm5lY3Rpb25fY2FsbGJhY2tfLCBIQUNLX09uRXNjb0Nvbm5lY3RSZXF1ZXN0KHJlbW90ZSwgY2xhc3Nfb2ZfZGV2aWNlKSk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgQ29ubmVjdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUocmVtb3RlLCBjbGFzc19vZl9kZXZpY2UsIENvbm5lY3Rpb25SZXF1ZXN0TGlua1R5cGU6OkVTQ08pKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkFjbE1hbmFnZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBhY2xfbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FkZHJlc3MuY2MgYi9nZC9oY2kvYWRkcmVzcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjMDEzZi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWRkcmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJjb21tb24vc3RyaW5ncy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jb25zdCBBZGRyZXNzIEFkZHJlc3M6OmtBbnl7ezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9fTsKLWNvbnN0IEFkZHJlc3MgQWRkcmVzczo6a0VtcHR5e3sweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfX07Ci0KLS8vIEFkZHJlc3MgY2Fubm90IGluaXRpYWxpemUgbWVtYmVyIHZhcmlhYmxlcyBhcyBpdCBpcyBhIFBPRCB0eXBlCi0vLyBOT0xJTlRORVhUTElORShjcHBjb3JlZ3VpZGVsaW5lcy1wcm8tdHlwZS1tZW1iZXItaW5pdCkKLUFkZHJlc3M6OkFkZHJlc3MoY29uc3QgdWludDhfdCAoJmFkZHIpWzZdKSB7Ci0gIHN0ZDo6Y29weShhZGRyLCBhZGRyICsga0xlbmd0aCwgZGF0YSgpKTsKLX0KLQotQWRkcmVzczo6QWRkcmVzcyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dWludDhfdD4gbCkgewotICBzdGQ6OmNvcHkobC5iZWdpbigpLCBzdGQ6Om1pbihsLmJlZ2luKCkgKyBrTGVuZ3RoLCBsLmVuZCgpKSwgZGF0YSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgQWRkcmVzczo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBmb3IgKGF1dG8gaXQgPSBhZGRyZXNzLnJiZWdpbigpOyBpdCAhPSBhZGRyZXNzLnJlbmQoKTsgaXQrKykgewotICAgIHNzIDw8IHN0ZDo6bm91cHBlcmNhc2UgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8ICsqaXQ7Ci0gICAgaWYgKHN0ZDo6bmV4dChpdCkgIT0gYWRkcmVzcy5yZW5kKCkpIHsKLSAgICAgIHNzIDw8ICc6JzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBBZGRyZXNzOjpUb0xlZ2FjeUNvbmZpZ1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIFRvU3RyaW5nKCk7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8QWRkcmVzcz4gQWRkcmVzczo6RnJvbUxlZ2FjeUNvbmZpZ1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBGcm9tU3RyaW5nKHN0cik7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8QWRkcmVzcz4gQWRkcmVzczo6RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSkgewotICBpZiAoZnJvbS5sZW5ndGgoKSAhPSAxNykgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLQotICBBZGRyZXNzIGFkZHJ7fTsKLSAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cmVhbShmcm9tKTsKLSAgc3RkOjpzdHJpbmcgdG9rZW47Ci0gIGludCBpbmRleCA9IDA7Ci0gIHdoaWxlIChnZXRsaW5lKHN0cmVhbSwgdG9rZW4sICc6JykpIHsKLSAgICBpZiAoaW5kZXggPj0gNikgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpZiAodG9rZW4ubGVuZ3RoKCkgIT0gMikgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBjaGFyKiB0ZW1wID0gbnVsbHB0cjsKLSAgICBhZGRyLmFkZHJlc3MuYXQoNSAtIGluZGV4KSA9IHN0ZDo6c3RydG9sKHRva2VuLmNfc3RyKCksICZ0ZW1wLCAxNik7Ci0gICAgaWYgKHRlbXAgPT0gdG9rZW4uY19zdHIoKSkgewotICAgICAgLy8gc3RyaW5nIHRva2VuIGlzIGVtcHR5IG9yIGhhcyB3cm9uZyBmb3JtYXQKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICAgIGlmICh0ZW1wICE9ICh0b2tlbi5jX3N0cigpICsgdG9rZW4uc2l6ZSgpKSkgewotICAgICAgLy8gY2Fubm90IHBhcnNlIHdob2xlIHN0cmluZwotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpbmRleCsrOwotICB9Ci0KLSAgaWYgKGluZGV4ICE9IDYpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0KLSAgcmV0dXJuIGFkZHI7Ci19Ci0KLWJvb2wgQWRkcmVzczo6RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwgQWRkcmVzcyYgdG8pIHsKLSAgYXV0byBhZGRyID0gRnJvbVN0cmluZyhmcm9tKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgdG8gPSB7fTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdG8gPSBzdGQ6Om1vdmUoKmFkZHIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc2l6ZV90IEFkZHJlc3M6OkZyb21PY3RldHMoY29uc3QgdWludDhfdCogZnJvbSkgewotICBzdGQ6OmNvcHkoZnJvbSwgZnJvbSArIGtMZW5ndGgsIGRhdGEoKSk7Ci0gIHJldHVybiBrTGVuZ3RoOwotfTsKLQotYm9vbCBBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcykgewotICByZXR1cm4gQWRkcmVzczo6RnJvbVN0cmluZyhhZGRyZXNzKS5oYXNfdmFsdWUoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FkZHJlc3MuaCBiL2dkL2hjaS9hZGRyZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTQzZDQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FkZHJlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInBhY2tldC9jdXN0b21fZmllbGRfZml4ZWRfc2l6ZV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdG9yYWdlL3NlcmlhbGl6YWJsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jbGFzcyBBZGRyZXNzIGZpbmFsIDogcHVibGljIHBhY2tldDo6Q3VzdG9tRmllbGRGaXhlZFNpemVJbnRlcmZhY2U8QWRkcmVzcz4sIHB1YmxpYyBzdG9yYWdlOjpTZXJpYWxpemFibGU8QWRkcmVzcz4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0xlbmd0aCA9IDY7Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCBrTGVuZ3RoPiBhZGRyZXNzID0ge307Ci0KLSAgQWRkcmVzcygpID0gZGVmYXVsdDsKLSAgQWRkcmVzcyhjb25zdCB1aW50OF90ICgmYWRkcilba0xlbmd0aF0pOwotICBBZGRyZXNzKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx1aW50OF90PiBsKTsKLQotICAvLyBDdXN0b21GaWVsZEZpeGVkU2l6ZUludGVyZmFjZSBtZXRob2RzCi0gIGlubGluZSB1aW50OF90KiBkYXRhKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBhZGRyZXNzLmRhdGEoKTsKLSAgfQotICBpbmxpbmUgY29uc3QgdWludDhfdCogZGF0YSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYWRkcmVzcy5kYXRhKCk7Ci0gIH0KLQotICAvLyBzdG9yYWdlOjpTZXJpYWxpemFibGUgbWV0aG9kcwotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotICBzdGF0aWMgc3RkOjpvcHRpb25hbDxBZGRyZXNzPiBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tKTsKLSAgc3RkOjpzdHJpbmcgVG9MZWdhY3lDb25maWdTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8QWRkcmVzcz4gRnJvbUxlZ2FjeUNvbmZpZ1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICBib29sIG9wZXJhdG9yPChjb25zdCBBZGRyZXNzJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzcyA8IHJocy5hZGRyZXNzOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZGRyZXNzJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzcyA9PSByaHMuYWRkcmVzczsKLSAgfQotICBib29sIG9wZXJhdG9yPihjb25zdCBBZGRyZXNzJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gKHJocyA8ICp0aGlzKTsKLSAgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgQWRkcmVzcyYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPiByaHMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBBZGRyZXNzJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA8IHJocyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IHJocyk7Ci0gIH0KLQotICBib29sIElzRW1wdHkoKSBjb25zdCB7Ci0gICAgcmV0dXJuICp0aGlzID09IGtFbXB0eTsKLSAgfQotCi0gIC8vIENvbnZlcnRzIHxzdHJpbmd8IHRvIEFkZHJlc3MgYW5kIHBsYWNlcyBpdCBpbiB8dG98LiBJZiB8ZnJvbXwgZG9lcwotICAvLyBub3QgcmVwcmVzZW50IGEgQmx1ZXRvb3RoIGFkZHJlc3MsIHx0b3wgaXMgbm90IG1vZGlmaWVkIGFuZCB0aGlzIGZ1bmN0aW9uCi0gIC8vIHJldHVybnMgZmFsc2UuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgotICBzdGF0aWMgYm9vbCBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBBZGRyZXNzJiB0byk7Ci0KLSAgLy8gQ29waWVzIHxmcm9tfCByYXcgQmx1ZXRvb3RoIGFkZHJlc3Mgb2N0ZXRzIHRvIHRoZSBsb2NhbCBvYmplY3QuCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZWQgb2N0ZXRzIC0gc2hvdWxkIGJlIGFsd2F5cyBBZGRyZXNzOjprTGVuZ3RoCi0gIHNpemVfdCBGcm9tT2N0ZXRzKGNvbnN0IHVpbnQ4X3QqIGZyb20pOwotCi0gIHN0YXRpYyBib29sIElzVmFsaWRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKLQotICBzdGF0aWMgY29uc3QgQWRkcmVzcyBrRW1wdHk7ICAvLyAwMDowMDowMDowMDowMDowMAotICBzdGF0aWMgY29uc3QgQWRkcmVzcyBrQW55OyAgICAvLyBGRjpGRjpGRjpGRjpGRjpGRgotfTsKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBBZGRyZXNzJiBhKSB7Ci0gIG9zIDw8IGEuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLW5hbWVzcGFjZSBzdGQgewotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzPiB7Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmIHZhbCkgY29uc3QgewotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVpbnQ2NF90KSA+PSBibHVldG9vdGg6OmhjaTo6QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgdWludDY0X3QgaW50X2FkZHIgPSAwOwotICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmaW50X2FkZHIpLCB2YWwuZGF0YSgpLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShpbnRfYWRkcik7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS9nZC9oY2kvYWRkcmVzc19weWJpbmQxMV90eXBlX2Nhc3Rlci5oIGIvZ2QvaGNpL2FkZHJlc3NfcHliaW5kMTFfdHlwZV9jYXN0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxNTFjMy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWRkcmVzc19weWJpbmQxMV90eXBlX2Nhc3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+Ci0jaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgcHkgPSBweWJpbmQxMTsKLQotbmFtZXNwYWNlIHB5YmluZDExIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotdGVtcGxhdGUgPD4KLXN0cnVjdCB0eXBlX2Nhc3Rlcjw6OmJsdWV0b290aDo6aGNpOjpBZGRyZXNzPiB7Ci0gcHVibGljOgotICAvLyBTZXQgdGhlIFB5dGhvbiBuYW1lIG9mIEFkZHJlc3MgYW5kIGRlY2xhcmUgInZhbHVlIgotICBQWUJJTkQxMV9UWVBFX0NBU1RFUig6OmJsdWV0b290aDo6aGNpOjpBZGRyZXNzLCBfKCJBZGRyZXNzIikpOwotCi0gIC8vIENvbnZlcnQgZnJvbSBQeXRob24tPkMrKwotICBib29sIGxvYWQoaGFuZGxlIHNyYywgYm9vbCkgewotICAgIFB5T2JqZWN0KiBzb3VyY2UgPSBzcmMucHRyKCk7Ci0gICAgaWYgKHB5Ojppc2luc3RhbmNlPHB5OjpzdHI+KHNyYykpIHsKLSAgICAgIGJvb2wgY29udmVyc2lvbl9zdWNjZXNzZnVsID0gYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcoUHlVbmljb2RlX0FzVVRGOChzb3VyY2UpLCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gY29udmVyc2lvbl9zdWNjZXNzZnVsICYmICFQeUVycl9PY2N1cnJlZCgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDb252ZXJ0IGZyb20gQysrLT5QeXRob24KLSAgc3RhdGljIGhhbmRsZSBjYXN0KGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIHNyYywgcmV0dXJuX3ZhbHVlX3BvbGljeSwgaGFuZGxlKSB7Ci0gICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKHNyYy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci19OwotfSAgLy8gbmFtZXNwYWNlIGRldGFpbAotfSAgLy8gbmFtZXNwYWNlIHB5YmluZDExCmRpZmYgLS1naXQgYS9nZC9oY2kvYWRkcmVzc191bml0dGVzdC5jYyBiL2dkL2hjaS9hZGRyZXNzX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJjMmU3Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9hZGRyZXNzX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiB0ZXN0X2FkZHIgPSAiYmM6OWE6Nzg6NTY6MzQ6MTIiOwotc3RhdGljIGNvbnN0IGNoYXIqIHRlc3RfYWRkcjIgPSAiMjE6NDM6NjU6ODc6YTk6Y2IiOwotCi1URVNUKEFkZHJlc3NVbml0dGVzdCwgdGVzdF9jb25zdHJ1Y3Rvcl9hcnJheSkgewotICBBZGRyZXNzIGJkYWRkcih7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5YSwgMHhiY30pOwotCi0gIEFTU0VSVF9FUSgweDEyLCBiZGFkZHIuYWRkcmVzc1swXSk7Ci0gIEFTU0VSVF9FUSgweDM0LCBiZGFkZHIuYWRkcmVzc1sxXSk7Ci0gIEFTU0VSVF9FUSgweDU2LCBiZGFkZHIuYWRkcmVzc1syXSk7Ci0gIEFTU0VSVF9FUSgweDc4LCBiZGFkZHIuYWRkcmVzc1szXSk7Ci0gIEFTU0VSVF9FUSgweDlBLCBiZGFkZHIuYWRkcmVzc1s0XSk7Ci0gIEFTU0VSVF9FUSgweEJDLCBiZGFkZHIuYWRkcmVzc1s1XSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0ID0gYmRhZGRyLlRvU3RyaW5nKCk7Ci0KLSAgQVNTRVJUX1NUUkVRKHRlc3RfYWRkciwgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKEFkZHJlc3NVbml0dGVzdCwgdGVzdF9pc19lbXB0eSkgewotICBBZGRyZXNzIGVtcHR5OwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMDowMDowMDowMDowMDowMCIsIGVtcHR5KTsKLSAgQVNTRVJUX1RSVUUoZW1wdHkuSXNFbXB0eSgpKTsKLQotICBBZGRyZXNzIG5vdF9lbXB0eTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZygiMDA6MDA6MDA6MDA6MDA6MDEiLCBub3RfZW1wdHkpOwotICBBU1NFUlRfRkFMU0Uobm90X2VtcHR5LklzRW1wdHkoKSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1VuaXR0ZXN0LCB0ZXN0X3RvX2Zyb21fc3RyKSB7Ci0gIEFkZHJlc3MgYmRhZGRyOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyKTsKLQotICBBU1NFUlRfRVEoMHgxMiwgYmRhZGRyLmFkZHJlc3NbMF0pOwotICBBU1NFUlRfRVEoMHgzNCwgYmRhZGRyLmFkZHJlc3NbMV0pOwotICBBU1NFUlRfRVEoMHg1NiwgYmRhZGRyLmFkZHJlc3NbMl0pOwotICBBU1NFUlRfRVEoMHg3OCwgYmRhZGRyLmFkZHJlc3NbM10pOwotICBBU1NFUlRfRVEoMHg5QSwgYmRhZGRyLmFkZHJlc3NbNF0pOwotICBBU1NFUlRfRVEoMHhCQywgYmRhZGRyLmFkZHJlc3NbNV0pOwotCi0gIHN0ZDo6c3RyaW5nIHJldCA9IGJkYWRkci5Ub1N0cmluZygpOwotCi0gIEFTU0VSVF9TVFJFUSh0ZXN0X2FkZHIsIHJldC5jX3N0cigpKTsKLX0KLQotVEVTVChBZGRyZXNzVW5pdHRlc3QsIHRlc3RfZnJvbV9vY3RldHMpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9hZGRyX2FycmF5W10gPSB7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5YSwgMHhiY307Ci0KLSAgQWRkcmVzcyBiZGFkZHI7Ci0gIHNpemVfdCBleHBlY3RlZF9yZXN1bHQgPSBBZGRyZXNzOjprTGVuZ3RoOwotICBBU1NFUlRfRVEoZXhwZWN0ZWRfcmVzdWx0LCBiZGFkZHIuRnJvbU9jdGV0cyh0ZXN0X2FkZHJfYXJyYXkpKTsKLQotICBBU1NFUlRfRVEoMHgxMiwgYmRhZGRyLmFkZHJlc3NbMF0pOwotICBBU1NFUlRfRVEoMHgzNCwgYmRhZGRyLmFkZHJlc3NbMV0pOwotICBBU1NFUlRfRVEoMHg1NiwgYmRhZGRyLmFkZHJlc3NbMl0pOwotICBBU1NFUlRfRVEoMHg3OCwgYmRhZGRyLmFkZHJlc3NbM10pOwotICBBU1NFUlRfRVEoMHg5QSwgYmRhZGRyLmFkZHJlc3NbNF0pOwotICBBU1NFUlRfRVEoMHhCQywgYmRhZGRyLmFkZHJlc3NbNV0pOwotCi0gIHN0ZDo6c3RyaW5nIHJldCA9IGJkYWRkci5Ub1N0cmluZygpOwotCi0gIEFTU0VSVF9TVFJFUSh0ZXN0X2FkZHIsIHJldC5jX3N0cigpKTsKLX0KLQotVEVTVChBZGRyZXNzVGVzdCwgdGVzdF9lcXVhbHMpIHsKLSAgQWRkcmVzcyBiZGFkZHIxOwotICBBZGRyZXNzIGJkYWRkcjI7Ci0gIEFkZHJlc3MgYmRhZGRyMzsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIsIGJkYWRkcjEpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMik7Ci0gIEFTU0VSVF9UUlVFKGJkYWRkcjEgPT0gYmRhZGRyMik7Ci0gIEFTU0VSVF9GQUxTRShiZGFkZHIxICE9IGJkYWRkcjIpOwotICBBU1NFUlRfVFJVRShiZGFkZHIxID09IGJkYWRkcjEpOwotICBBU1NFUlRfRkFMU0UoYmRhZGRyMSAhPSBiZGFkZHIxKTsKLQotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkcjIsIGJkYWRkcjMpOwotICBBU1NFUlRfRkFMU0UoYmRhZGRyMiA9PSBiZGFkZHIzKTsKLSAgQVNTRVJUX1RSVUUoYmRhZGRyMiAhPSBiZGFkZHIzKTsKLX0KLQotVEVTVChBZGRyZXNzVGVzdCwgdGVzdF9sZXNzX3RoYW4pIHsKLSAgQWRkcmVzcyBiZGFkZHIxOwotICBBZGRyZXNzIGJkYWRkcjI7Ci0gIEFkZHJlc3MgYmRhZGRyMzsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIsIGJkYWRkcjEpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMik7Ci0gIEFTU0VSVF9GQUxTRShiZGFkZHIxIDwgYmRhZGRyMik7Ci0gIEFTU0VSVF9GQUxTRShiZGFkZHIxIDwgYmRhZGRyMSk7Ci0KLSAgQWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIyLCBiZGFkZHIzKTsKLSAgQVNTRVJUX1RSVUUoYmRhZGRyMiA8IGJkYWRkcjMpOwotICBBU1NFUlRfRkFMU0UoYmRhZGRyMyA8IGJkYWRkcjIpOwotfQotCi1URVNUKEFkZHJlc3NUZXN0LCB0ZXN0X21vcmVfdGhhbikgewotICBBZGRyZXNzIGJkYWRkcjE7Ci0gIEFkZHJlc3MgYmRhZGRyMjsKLSAgQWRkcmVzcyBiZGFkZHIzOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMSk7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIyKTsKLSAgQVNTRVJUX0ZBTFNFKGJkYWRkcjEgPiBiZGFkZHIyKTsKLSAgQVNTRVJUX0ZBTFNFKGJkYWRkcjEgPiBiZGFkZHIxKTsKLQotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkcjIsIGJkYWRkcjMpOwotICBBU1NFUlRfRkFMU0UoYmRhZGRyMiA+IGJkYWRkcjMpOwotICBBU1NFUlRfVFJVRShiZGFkZHIzID4gYmRhZGRyMik7Ci19Ci0KLVRFU1QoQWRkcmVzc1Rlc3QsIHRlc3RfbGVzc190aGFuX29yX2VxdWFsKSB7Ci0gIEFkZHJlc3MgYmRhZGRyMTsKLSAgQWRkcmVzcyBiZGFkZHIyOwotICBBZGRyZXNzIGJkYWRkcjM7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIxKTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIsIGJkYWRkcjIpOwotICBBU1NFUlRfVFJVRShiZGFkZHIxIDw9IGJkYWRkcjIpOwotICBBU1NFUlRfVFJVRShiZGFkZHIxIDw9IGJkYWRkcjEpOwotCi0gIEFkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyMiwgYmRhZGRyMyk7Ci0gIEFTU0VSVF9UUlVFKGJkYWRkcjIgPD0gYmRhZGRyMyk7Ci0gIEFTU0VSVF9GQUxTRShiZGFkZHIzIDw9IGJkYWRkcjIpOwotfQotCi1URVNUKEFkZHJlc3NUZXN0LCB0ZXN0X21vcmVfdGhhbl9vcl9lcXVhbCkgewotICBBZGRyZXNzIGJkYWRkcjE7Ci0gIEFkZHJlc3MgYmRhZGRyMjsKLSAgQWRkcmVzcyBiZGFkZHIzOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMSk7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIyKTsKLSAgQVNTRVJUX1RSVUUoYmRhZGRyMSA+PSBiZGFkZHIyKTsKLSAgQVNTRVJUX1RSVUUoYmRhZGRyMSA+PSBiZGFkZHIxKTsKLQotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkcjIsIGJkYWRkcjMpOwotICBBU1NFUlRfRkFMU0UoYmRhZGRyMiA+PSBiZGFkZHIzKTsKLSAgQVNTRVJUX1RSVUUoYmRhZGRyMyA+PSBiZGFkZHIyKTsKLX0KLQotVEVTVChBZGRyZXNzVGVzdCwgdGVzdF9jb3B5KSB7Ci0gIEFkZHJlc3MgYmRhZGRyMTsKLSAgQWRkcmVzcyBiZGFkZHIyOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMSk7Ci0gIGJkYWRkcjIgPSBiZGFkZHIxOwotCi0gIEFTU0VSVF9UUlVFKGJkYWRkcjEgPT0gYmRhZGRyMik7Ci19Ci0KLVRFU1QoQWRkcmVzc1Rlc3QsIElzVmFsaWRBZGRyZXNzKSB7Ci0gIEFTU0VSVF9GQUxTRShBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcygiIikpOwotICBBU1NFUlRfRkFMU0UoQWRkcmVzczo6SXNWYWxpZEFkZHJlc3MoIjAwMDAwMDAwMDAwMCIpKTsKLSAgQVNTRVJUX0ZBTFNFKEFkZHJlc3M6OklzVmFsaWRBZGRyZXNzKCIwMDowMDowMDowMDowMDAwIikpOwotICBBU1NFUlRfRkFMU0UoQWRkcmVzczo6SXNWYWxpZEFkZHJlc3MoIjAwOjAwOjAwOjAwOjAwOjAiKSk7Ci0gIEFTU0VSVF9GQUxTRShBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcygiMDA6MDA6MDA6MDA6MDA6MDsiKSk7Ci0gIEFTU0VSVF9UUlVFKEFkZHJlc3M6OklzVmFsaWRBZGRyZXNzKCIwMDowMDowMDowMDowMDowMCIpKTsKLSAgQVNTRVJUX1RSVUUoQWRkcmVzczo6SXNWYWxpZEFkZHJlc3MoIkFCOmNkOjAwOjAwOjAwOjAwIikpOwotICBBU1NFUlRfRkFMU0UoQWRkcmVzczo6SXNWYWxpZEFkZHJlc3MoImFCOmNEOmVGOkdoOmlKOktsIikpOwotfQotCi1URVNUKEFkZHJlc3NUZXN0LCBCZEFkZHJGcm9tU3RyaW5nKSB7Ci0gIEFkZHJlc3MgYWRkciA9IHt9OwotCi0gIEFTU0VSVF9UUlVFKEFkZHJlc3M6OkZyb21TdHJpbmcoIjAwOjAwOjAwOjAwOjAwOjAwIiwgYWRkcikpOwotICBjb25zdCBBZGRyZXNzIHJlc3VsdDAgPSB7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9fTsKLSAgQVNTRVJUX0VRKDAsIG1lbWNtcChhZGRyLmRhdGEoKSwgcmVzdWx0MC5kYXRhKCksIEFkZHJlc3M6OmtMZW5ndGgpKTsKLQotICBBU1NFUlRfVFJVRShBZGRyZXNzOjpGcm9tU3RyaW5nKCJhYjowMTo0QzpkNToyMTo5ZiIsIGFkZHIpKTsKLSAgY29uc3QgQWRkcmVzcyByZXN1bHQxID0ge3sweDlmLCAweDIxLCAweGQ1LCAweDRjLCAweDAxLCAweGFifX07Ci0gIEFTU0VSVF9FUSgiYWI6MDE6NGM6ZDU6MjE6OWYiLCBhZGRyLlRvU3RyaW5nKCkpOwotICBBU1NFUlRfRVEoImFiOjAxOjRjOmQ1OjIxOjlmIiwgcmVzdWx0MS5Ub1N0cmluZygpKTsKLSAgQVNTRVJUX1RIQVQoYWRkci5hZGRyZXNzLCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgweDlmLCAweDIxLCAweGQ1LCAweDRjLCAweDAxLCAweGFiKSk7Ci0gIEFTU0VSVF9FUSgwLCBtZW1jbXAoYWRkci5kYXRhKCksIHJlc3VsdDEuZGF0YSgpLCBBZGRyZXNzOjprTGVuZ3RoKSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1Rlc3QsIEJkQWRkckZyb21TdHJpbmdUb1N0cmluZ0VxdWl2YWxlbnQpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9ICJjMTpjMjpjMzpkMTpkMjpkMyI7Ci0gIEFkZHJlc3MgYWRkcjsKLQotICBBU1NFUlRfVFJVRShBZGRyZXNzOjpGcm9tU3RyaW5nKGFkZHJlc3MsIGFkZHIpKTsKLSAgQVNTRVJUX0VRKGFkZHIuVG9TdHJpbmcoKSwgYWRkcmVzcyk7Ci19Ci0KLVRFU1QoQWRkcmVzc1Rlc3QsIEJkQWRkclNhbWVWYWx1ZVNhbWVPcmRlcikgewotICBBZGRyZXNzIGFkZHIxe3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIEFkZHJlc3MgYWRkcjJ7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgLy8gVGVzdCBpZiB0d28gYWRkcmVzc2VzIHdpdGggc2FtZSBieXRlIHZhbHVlIGhhdmUgdGhlIHNhbWUgaGFzaAotICBzdHJ1Y3Qgc3RkOjpoYXNoPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzPiBoYXNoZXI7Ci0gIEFTU0VSVF9FUShoYXNoZXIoYWRkcjEpLCBoYXNoZXIoYWRkcjIpKTsKLSAgLy8gVGVzdCBpZiB0d28gYWRkcmVzc2VzIHdpdGggdGhlIHNhbWUgaGFzaCBhbmQgdGhlIHNhbWUgdmFsdWUsIHRoZXkgd2lsbAotICAvLyBzdGlsbCBtYXAgdG8gdGhlIHNhbWUgdmFsdWUKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPEFkZHJlc3MsIGludD4gZGF0YSA9IHt9OwotICBkYXRhW2FkZHIxXSA9IDU7Ci0gIGRhdGFbYWRkcjJdID0gODsKLSAgQVNTRVJUX0VRKGRhdGFbYWRkcjFdLCBkYXRhW2FkZHIyXSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1Rlc3QsIEJkQWRkckhhc2hEaWZmZXJlbnRGb3JEaWZmZXJlbnRBZGRyZXNzZXNaZXJvQWRkcikgewotICBBZGRyZXNzIGFkZHIxe3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIHN0cnVjdCBzdGQ6Omhhc2g8QWRkcmVzcz4gaGFzaGVyOwotICBBU1NFUlRfTkUoaGFzaGVyKGFkZHIxKSwgaGFzaGVyKEFkZHJlc3M6OmtFbXB0eSkpOwotfQotCi1URVNUKEFkZHJlc3NUZXN0LCBCZEFkZHJIYXNoRGlmZmVyZW50Rm9yRGlmZmVyZW50QWRkcmVzc2VzRnVsbEFkZHIpIHsKLSAgQWRkcmVzcyBhZGRyMXt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBzdHJ1Y3Qgc3RkOjpoYXNoPEFkZHJlc3M+IGhhc2hlcjsKLSAgQVNTRVJUX05FKGhhc2hlcihhZGRyMSksIGhhc2hlcihBZGRyZXNzOjprQW55KSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1Rlc3QsIEJkQWRkckhhc2hEaWZmZXJlbnRGb3JEaWZmZXJlbnRBZGRyZXNzZXNaZXJvQW5kRnVsbEFkZHIpIHsKLSAgc3RydWN0IHN0ZDo6aGFzaDxBZGRyZXNzPiBoYXNoZXI7Ci0gIEFTU0VSVF9ORShoYXNoZXIoQWRkcmVzczo6a0VtcHR5KSwgaGFzaGVyKEFkZHJlc3M6OmtBbnkpKTsKLX0KZGlmZiAtLWdpdCBhL2dkL2hjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIGIvZ2QvaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDhlMTUuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jbGFzcyBBZGRyZXNzV2l0aFR5cGUgZmluYWwgewotIHB1YmxpYzoKLSAgQWRkcmVzc1dpdGhUeXBlKEFkZHJlc3MgYWRkcmVzcywgQWRkcmVzc1R5cGUgYWRkcmVzc190eXBlKQotICAgICAgOiBhZGRyZXNzXyhzdGQ6Om1vdmUoYWRkcmVzcykpLCBhZGRyZXNzX3R5cGVfKGFkZHJlc3NfdHlwZSkge30KLQotICBleHBsaWNpdCBBZGRyZXNzV2l0aFR5cGUoKSA6IGFkZHJlc3NfKEFkZHJlc3M6OmtFbXB0eSksIGFkZHJlc3NfdHlwZV8oQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUykge30KLQotICBpbmxpbmUgQWRkcmVzcyBHZXRBZGRyZXNzKCkgY29uc3QgewotICAgIHJldHVybiBhZGRyZXNzXzsKLSAgfQotCi0gIGlubGluZSBBZGRyZXNzVHlwZSBHZXRBZGRyZXNzVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzc190eXBlXzsKLSAgfQotCi0gIC8qIElzIHRoaXMgYW4gUmVzb2x2YWJsZSBQcml2YXRlIEFkZHJlc3MgPyAqLwotICBpbmxpbmUgYm9vbCBJc1JwYSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzc190eXBlXyA9PSBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MgJiYgKChhZGRyZXNzXy5kYXRhKCkpWzBdICYgMHhjMCkgPT0gMHg0MDsKLSAgfQotCi0gIC8qIElzIHRoaXMgYW4gUmVzb2x2YWJsZSBQcml2YXRlIEFkZHJlc3MsIHRoYXQgd2FzIGdlbmVyYXRlZCBmcm9tIGdpdmVuIGlyayA/ICovCi0gIGJvb2wgSXNScGFUaGF0TWF0Y2hlc0lyayhjb25zdCBjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNiYgaXJrKSBjb25zdCB7Ci0gICAgaWYgKCFJc1JwYSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiB1c2UgdGhlIDMgTVNCIG9mIGJkIGFkZHJlc3MgYXMgcHJhbmQgKi8KLSAgICB1aW50OF90IHByYW5kWzNdOwotICAgIHByYW5kWzBdID0gYWRkcmVzc18uYWRkcmVzc1syXTsKLSAgICBwcmFuZFsxXSA9IGFkZHJlc3NfLmFkZHJlc3NbMV07Ci0gICAgcHJhbmRbMl0gPSBhZGRyZXNzXy5hZGRyZXNzWzBdOwotICAgIC8qIGdlbmVyYXRlIFggPSBFIGlyayhSMCwgUjEsIFIyKSBhbmQgUiBpcyByYW5kb20gYWRkcmVzcyAzIExTTyAqLwotICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IGNvbXB1dGVkX2hhc2ggPSBjcnlwdG9fdG9vbGJveDo6YWVzXzEyOChpcmssICZwcmFuZFswXSwgMyk7Ci0gICAgdWludDhfdCBoYXNoWzNdOwotICAgIGhhc2hbMF0gPSBhZGRyZXNzXy5hZGRyZXNzWzVdOwotICAgIGhhc2hbMV0gPSBhZGRyZXNzXy5hZGRyZXNzWzRdOwotICAgIGhhc2hbMl0gPSBhZGRyZXNzXy5hZGRyZXNzWzNdOwotICAgIGlmIChtZW1jbXAoY29tcHV0ZWRfaGFzaC5kYXRhKCksICZoYXNoWzBdLCAzKSA9PSAwKSB7Ci0gICAgICAvLyBtYXRjaAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIG5vdCBhIG1hdGNoCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQWRkcmVzc1dpdGhUeXBlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzc18gPCByaHMuYWRkcmVzc18gJiYgYWRkcmVzc190eXBlXyA8IHJocy5hZGRyZXNzX3R5cGVfOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZGRyZXNzV2l0aFR5cGUmIHJocykgY29uc3QgewotICAgIHJldHVybiBhZGRyZXNzXyA9PSByaHMuYWRkcmVzc18gJiYgYWRkcmVzc190eXBlXyA9PSByaHMuYWRkcmVzc190eXBlXzsKLSAgfQotICBib29sIG9wZXJhdG9yPihjb25zdCBBZGRyZXNzV2l0aFR5cGUmIHJocykgY29uc3QgewotICAgIHJldHVybiAocmhzIDwgKnRoaXMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBZGRyZXNzV2l0aFR5cGUmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID4gcmhzKTsKLSAgfQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgQWRkcmVzc1dpdGhUeXBlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA8IHJocyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3NXaXRoVHlwZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IGFkZHJlc3NfIDw8ICJbIiA8PCBBZGRyZXNzVHlwZVRleHQoYWRkcmVzc190eXBlXykgPDwgIl0iOwotICAgIHJldHVybiBzcy5zdHIoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQWRkcmVzcyBhZGRyZXNzXzsKLSAgQWRkcmVzc1R5cGUgYWRkcmVzc190eXBlXzsKLX07Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQWRkcmVzc1dpdGhUeXBlJiBhKSB7Ci0gIG9zIDw8IGEuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLW5hbWVzcGFjZSBzdGQgewotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGU+IHsKLSAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiB2YWwpIGNvbnN0IHsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50NjRfdCkgPj0gKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOjprTGVuZ3RoICsgc2l6ZW9mKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZSkpKTsKLSAgICB1aW50NjRfdCBpbnRfYWRkciA9IDA7Ci0gICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZpbnRfYWRkciksIHZhbC5HZXRBZGRyZXNzKCkuZGF0YSgpLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSA9IHZhbC5HZXRBZGRyZXNzVHlwZSgpOwotICAgIG1lbWNweSgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmludF9hZGRyKSArIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOjprTGVuZ3RoLCAmYWRkcmVzc190eXBlLCBzaXplb2YoYWRkcmVzc190eXBlKSk7Ci0gICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShpbnRfYWRkcik7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2Ugc3RkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2FkZHJlc3Nfd2l0aF90eXBlX3Rlc3QuY2MgYi9nZC9oY2kvYWRkcmVzc193aXRoX3R5cGVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiNGFiNi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvYWRkcmVzc193aXRoX3R5cGVfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1URVNUKEFkZHJlc3NXaXRoVHlwZVRlc3QsIEFkZHJlc3NXaXRoVHlwZVNhbWVWYWx1ZVNhbWVPcmRlcikgewotICBBZGRyZXNzIGFkZHIxe3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIEFkZHJlc3NUeXBlIHR5cGUxID0gQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLSAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlXzEoYWRkcjEsIHR5cGUxKTsKLSAgQWRkcmVzcyBhZGRyMnt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBBZGRyZXNzVHlwZSB0eXBlMiA9IEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZV8yKGFkZHIyLCB0eXBlMik7Ci0gIC8vIFRlc3QgaWYgdHdvIGFkZHJlc3Mgd2l0aCB0eXBlIHdpdGggc2FtZSBieXRlIHZhbHVlIGhhdmUgdGhlIHNhbWUgaGFzaAotICBzdHJ1Y3Qgc3RkOjpoYXNoPGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGU+IGhhc2hlcjsKLSAgRVhQRUNUX0VRKGhhc2hlcihhZGRyZXNzX3dpdGhfdHlwZV8xKSwgaGFzaGVyKGFkZHJlc3Nfd2l0aF90eXBlXzIpKTsKLSAgLy8gVGVzdCBpZiB0d28gYWRkcmVzcyB3aXRoIHR5cGUgd2l0aCB0aGUgc2FtZSBoYXNoIGFuZCB0aGUgc2FtZSB2YWx1ZSwgdGhleSB3aWxsCi0gIC8vIHN0aWxsIG1hcCB0byB0aGUgc2FtZSB2YWx1ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8QWRkcmVzc1dpdGhUeXBlLCBpbnQ+IGRhdGEgPSB7fTsKLSAgZGF0YVthZGRyZXNzX3dpdGhfdHlwZV8xXSA9IDU7Ci0gIGRhdGFbYWRkcmVzc193aXRoX3R5cGVfMl0gPSA4OwotICBFWFBFQ1RfRVEoZGF0YVthZGRyZXNzX3dpdGhfdHlwZV8xXSwgZGF0YVthZGRyZXNzX3dpdGhfdHlwZV8yXSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1dpdGhUeXBlVGVzdCwgSGFzaERpZmZlcmVudERpZmZBZGRyU2FtZVR5cGUpIHsKLSAgQWRkcmVzcyBhZGRye3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIEFkZHJlc3NUeXBlIHR5cGUgPSBBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1M7Ci0gIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZShhZGRyLCB0eXBlKTsKLSAgc3RydWN0IHN0ZDo6aGFzaDxBZGRyZXNzV2l0aFR5cGU+IGhhc2hlcjsKLSAgRVhQRUNUX05FKGhhc2hlcihhZGRyZXNzX3dpdGhfdHlwZSksIGhhc2hlcihBZGRyZXNzV2l0aFR5cGUoQWRkcmVzczo6a0VtcHR5LCBBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1MpKSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1dpdGhUeXBlVGVzdCwgSGFzaERpZmZlcmVudFNhbWVBZGRyZXNzRGlmZlR5cGUpIHsKLSAgQWRkcmVzcyBhZGRyMXt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBBZGRyZXNzVHlwZSB0eXBlMSA9IEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZV8xKGFkZHIxLCB0eXBlMSk7Ci0gIEFkZHJlc3MgYWRkcjJ7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgQWRkcmVzc1R5cGUgdHlwZTIgPSBBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1M7Ci0gIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZV8yKGFkZHIyLCB0eXBlMik7Ci0gIHN0cnVjdCBzdGQ6Omhhc2g8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZT4gaGFzaGVyOwotICBFWFBFQ1RfTkUoaGFzaGVyKGFkZHJlc3Nfd2l0aF90eXBlXzEpLCBoYXNoZXIoYWRkcmVzc193aXRoX3R5cGVfMikpOwotfQotCi1URVNUKEFkZHJlc3NXaXRoVHlwZVRlc3QsIElzUnBhKSB7Ci0gIC8vIFB1YmxpYyBhZGRyZXNzIGNhbid0IGJlIFJQQQotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1MpLklzUnBhKCkpOwotCi0gIC8vIE11c3QgaGF2ZSBwcm9wZXIgTW9zdCBTaWduaWZpY2FudCBCaXQgY29uZmlndXJhdGlvbgotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHgzMCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKS5Jc1JwYSgpKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHg0MCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwM319LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKS5Jc1JwYSgpKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHg1MCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKS5Jc1JwYSgpKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHg2MCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKS5Jc1JwYSgpKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHg3MCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKS5Jc1JwYSgpKTsKLSAgRVhQRUNUX0ZBTFNFKAotICAgICAgQWRkcmVzc1dpdGhUeXBlKEFkZHJlc3N7ezB4ODAsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwgQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUykuSXNScGEoKSk7Ci19Ci0KLVRFU1QoQWRkcmVzc1dpdGhUeXBlVGVzdCwgSXNScGFUaGF0TWF0Y2hlc0lyaykgewotICAvLyBQdWJsaWMgYWRkcmVzcyBjYW4ndCBiZSBSUEEKLSAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3NfMSA9Ci0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHg1MCwgMHgwMiwgMHgwMywgMHhDOSwgMHgxMiwgMHhERX19LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3NfMiA9Ci0gICAgICBBZGRyZXNzV2l0aFR5cGUoQWRkcmVzc3t7MHg1MCwgMHgwMiwgMHgwMywgMHhDOSwgMHgxMiwgMHhERH19LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgaXJrXzF7MHg5MCwgMHg1ZSwgMHg2MCwgMHg1OSwgMHhjOSwgMHgxMSwgMHg0MywgMHg3YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCwgMHgwOSwgMHg2YSwgMHg1MywgMHgyOCwgMHhlNiwgMHg1OSwgMHg2ZH07Ci0KLSAgRVhQRUNUX1RSVUUoYWRkcmVzc18xLklzUnBhVGhhdE1hdGNoZXNJcmsoaXJrXzEpKTsKLSAgRVhQRUNUX0ZBTFNFKGFkZHJlc3NfMi5Jc1JwYVRoYXRNYXRjaGVzSXJrKGlya18xKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9oY2kvY2VydC9hY2xfbWFuYWdlcl90ZXN0LnB5IGIvZ2QvaGNpL2NlcnQvYWNsX21hbmFnZXJfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMWU2MC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY2VydC9hY2xfbWFuYWdlcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gaGNpLmNlcnQuYWNsX21hbmFnZXJfdGVzdF9saWIgaW1wb3J0IEFjbE1hbmFnZXJUZXN0QmFzZQotCi0KLWNsYXNzIEFjbE1hbmFnZXJUZXN0KEdkQmFzZVRlc3RDbGFzcywgQWNsTWFuYWdlclRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJywgY2VydF9tb2R1bGU9J0hDSScpCi0KLSAgICAjIHRvZG86IG1vdmUgaW50byBHZEJhc2VUZXN0Q2xhc3MsIGJhc2VkIG9uIG1vZHVsZXMgaW5pdGVkCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIEFjbE1hbmFnZXJUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgQWNsTWFuYWdlclRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotICAgIGRlZiB0ZXN0X2R1dF9jb25uZWN0cyhzZWxmKToKLSAgICAgICAgQWNsTWFuYWdlclRlc3RCYXNlLnRlc3RfZHV0X2Nvbm5lY3RzKHNlbGYpCi0KLSAgICBkZWYgdGVzdF9jZXJ0X2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVzdF9jZXJ0X2Nvbm5lY3RzKHNlbGYpCi0KLSAgICBkZWYgdGVzdF9yZWplY3RfYnJvYWRjYXN0KHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVzdF9yZWplY3RfYnJvYWRjYXN0KHNlbGYpCi0KLSAgICBkZWYgdGVzdF9jZXJ0X2Nvbm5lY3RzX2Rpc2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBBY2xNYW5hZ2VyVGVzdEJhc2UudGVzdF9jZXJ0X2Nvbm5lY3RzX2Rpc2Nvbm5lY3RzKHNlbGYpCi0KLSAgICBkZWYgdGVzdF9yZWNvbWJpbmF0aW9uX2wyY2FwX3BhY2tldChzZWxmKToKLSAgICAgICAgQWNsTWFuYWdlclRlc3RCYXNlLnRlc3RfcmVjb21iaW5hdGlvbl9sMmNhcF9wYWNrZXQoc2VsZikKZGlmZiAtLWdpdCBhL2dkL2hjaS9jZXJ0L2FjbF9tYW5hZ2VyX3Rlc3RfbGliLnB5IGIvZ2QvaGNpL2NlcnQvYWNsX21hbmFnZXJfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTI4NGQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NlcnQvYWNsX21hbmFnZXJfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQotZnJvbSBuZWlnaGJvci5mYWNhZGUgaW1wb3J0IGZhY2FkZV9wYjIgYXMgbmVpZ2hib3JfZmFjYWRlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGNlcnQucHlfaGNpIGltcG9ydCBQeUhjaQotZnJvbSBjZXJ0LnB5X2FjbF9tYW5hZ2VyIGltcG9ydCBQeUFjbE1hbmFnZXIKLQotCi1jbGFzcyBBY2xNYW5hZ2VyVGVzdEJhc2UoKToKLQotICAgICMgdG9kbzogbW92ZSBpbnRvIEdkQmFzZVRlc3RDbGFzcywgYmFzZWQgb24gbW9kdWxlcyBpbml0ZWQKLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmLCBkdXQsIGNlcnQpOgotICAgICAgICBzZWxmLmNlcnRfaGNpID0gUHlIY2koY2VydCwgYWNsX3N0cmVhbWluZz1UcnVlKQotICAgICAgICBzZWxmLmR1dF9hY2xfbWFuYWdlciA9IFB5QWNsTWFuYWdlcihkdXQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9kdXRfY29ubmVjdHMoc2VsZik6Ci0gICAgICAgIHNlbGYuY2VydF9oY2kuZW5hYmxlX2lucXVpcnlfYW5kX3BhZ2Vfc2NhbigpCi0gICAgICAgIGNlcnRfYWRkcmVzcyA9IHNlbGYuY2VydF9oY2kucmVhZF9vd25fYWRkcmVzcygpCi0KLSAgICAgICAgc2VsZi5kdXRfYWNsX21hbmFnZXIuaW5pdGlhdGVfY29ubmVjdGlvbihjZXJ0X2FkZHJlc3MpCi0gICAgICAgIGNlcnRfYWNsID0gc2VsZi5jZXJ0X2hjaS5hY2NlcHRfY29ubmVjdGlvbigpCi0gICAgICAgIHdpdGggc2VsZi5kdXRfYWNsX21hbmFnZXIuY29tcGxldGVfb3V0Z29pbmdfY29ubmVjdGlvbigpIGFzIGR1dF9hY2w6Ci0gICAgICAgICAgICBjZXJ0X2FjbC5zZW5kX2ZpcnN0KGInXHgyNlx4MDBceDA3XHgwMFRoaXMgaXMganVzdCBTb21lQWNsRGF0YSBmcm9tIHRoZSBDZXJ0JykKLSAgICAgICAgICAgIGR1dF9hY2wuc2VuZChiJ1x4MjlceDAwXHgwN1x4MDBUaGlzIGlzIGp1c3QgU29tZU1vcmVBY2xEYXRhIGZyb20gdGhlIERVVCcpCi0KLSAgICAgICAgICAgIGFzc2VydFRoYXQoY2VydF9hY2wpLmVtaXRzKGxhbWJkYSBwYWNrZXQ6IGInU29tZU1vcmVBY2xEYXRhJyBpbiBwYWNrZXQucGF5bG9hZCkKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZHV0X2FjbCkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lQWNsRGF0YScgaW4gcGFja2V0LnBheWxvYWQpCi0KLSAgICBkZWYgdGVzdF9jZXJ0X2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBkdXRfYWRkcmVzcyA9IHNlbGYuZHV0LmhjaV9jb250cm9sbGVyLkdldE1hY0FkZHJlc3NTaW1wbGUoKQotICAgICAgICBzZWxmLmR1dC5uZWlnaGJvci5FbmFibGVQYWdlU2NhbihuZWlnaGJvcl9mYWNhZGUuRW5hYmxlTXNnKGVuYWJsZWQ9VHJ1ZSkpCi0KLSAgICAgICAgc2VsZi5kdXRfYWNsX21hbmFnZXIubGlzdGVuX2Zvcl9hbl9pbmNvbWluZ19jb25uZWN0aW9uKCkKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5pbml0aWF0ZV9jb25uZWN0aW9uKGR1dF9hZGRyZXNzKQotICAgICAgICB3aXRoIHNlbGYuZHV0X2FjbF9tYW5hZ2VyLmNvbXBsZXRlX2luY29taW5nX2Nvbm5lY3Rpb24oKSBhcyBkdXRfYWNsOgotICAgICAgICAgICAgY2VydF9hY2wgPSBzZWxmLmNlcnRfaGNpLmNvbXBsZXRlX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgICAgICBkdXRfYWNsLnNlbmQoYidceDI5XHgwMFx4MDdceDAwVGhpcyBpcyBqdXN0IFNvbWVNb3JlQWNsRGF0YSBmcm9tIHRoZSBEVVQnKQotCi0gICAgICAgICAgICBjZXJ0X2FjbC5zZW5kX2ZpcnN0KGInXHgyNlx4MDBceDA3XHgwMFRoaXMgaXMganVzdCBTb21lQWNsRGF0YSBmcm9tIHRoZSBDZXJ0JykKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2FjbCkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lTW9yZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChkdXRfYWNsKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ1NvbWVBY2xEYXRhJyBpbiBwYWNrZXQucGF5bG9hZCkKLQotICAgIGRlZiB0ZXN0X3JlamVjdF9icm9hZGNhc3Qoc2VsZik6Ci0gICAgICAgIGR1dF9hZGRyZXNzID0gc2VsZi5kdXQuaGNpX2NvbnRyb2xsZXIuR2V0TWFjQWRkcmVzc1NpbXBsZSgpCi0gICAgICAgIHNlbGYuZHV0Lm5laWdoYm9yLkVuYWJsZVBhZ2VTY2FuKG5laWdoYm9yX2ZhY2FkZS5FbmFibGVNc2coZW5hYmxlZD1UcnVlKSkKLQotICAgICAgICBzZWxmLmR1dF9hY2xfbWFuYWdlci5saXN0ZW5fZm9yX2FuX2luY29taW5nX2Nvbm5lY3Rpb24oKQotICAgICAgICBzZWxmLmNlcnRfaGNpLmluaXRpYXRlX2Nvbm5lY3Rpb24oZHV0X2FkZHJlc3MpCi0gICAgICAgIHdpdGggc2VsZi5kdXRfYWNsX21hbmFnZXIuY29tcGxldGVfaW5jb21pbmdfY29ubmVjdGlvbigpIGFzIGR1dF9hY2w6Ci0gICAgICAgICAgICBjZXJ0X2FjbCA9IHNlbGYuY2VydF9oY2kuY29tcGxldGVfY29ubmVjdGlvbigpCi0KLSAgICAgICAgICAgIGNlcnRfYWNsLnNlbmQoaGNpX3BhY2tldHMuUGFja2V0Qm91bmRhcnlGbGFnLkZJUlNUX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Ccm9hZGNhc3RGbGFnLkFDVElWRV9QRVJJUEhFUkFMX0JST0FEQ0FTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYidceDI2XHgwMFx4MDdceDAwVGhpcyBpcyBhIEJyb2FkY2FzdCBmcm9tIHRoZSBDZXJ0JykKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZHV0X2FjbCkuZW1pdHNOb25lKHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MC41KSkKLQotICAgICAgICAgICAgY2VydF9hY2wuc2VuZChoY2lfcGFja2V0cy5QYWNrZXRCb3VuZGFyeUZsYWcuRklSU1RfQVVUT01BVElDQUxMWV9GTFVTSEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGInXHgyNlx4MDBceDA3XHgwMFRoaXMgaXMganVzdCBTb21lQWNsRGF0YSBmcm9tIHRoZSBDZXJ0JykKLSAgICAgICAgICAgIGFzc2VydFRoYXQoZHV0X2FjbCkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lQWNsRGF0YScgaW4gcGFja2V0LnBheWxvYWQpCi0KLSAgICBkZWYgdGVzdF9jZXJ0X2Nvbm5lY3RzX2Rpc2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBkdXRfYWRkcmVzcyA9IHNlbGYuZHV0LmhjaV9jb250cm9sbGVyLkdldE1hY0FkZHJlc3NTaW1wbGUoKQotICAgICAgICBzZWxmLmR1dC5uZWlnaGJvci5FbmFibGVQYWdlU2NhbihuZWlnaGJvcl9mYWNhZGUuRW5hYmxlTXNnKGVuYWJsZWQ9VHJ1ZSkpCi0KLSAgICAgICAgc2VsZi5kdXRfYWNsX21hbmFnZXIubGlzdGVuX2Zvcl9hbl9pbmNvbWluZ19jb25uZWN0aW9uKCkKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5pbml0aWF0ZV9jb25uZWN0aW9uKGR1dF9hZGRyZXNzKQotICAgICAgICB3aXRoIHNlbGYuZHV0X2FjbF9tYW5hZ2VyLmNvbXBsZXRlX2luY29taW5nX2Nvbm5lY3Rpb24oKSBhcyBkdXRfYWNsOgotICAgICAgICAgICAgY2VydF9hY2wgPSBzZWxmLmNlcnRfaGNpLmNvbXBsZXRlX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgICAgICBkdXRfYWNsLnNlbmQoYidceDI5XHgwMFx4MDdceDAwVGhpcyBpcyBqdXN0IFNvbWVNb3JlQWNsRGF0YSBmcm9tIHRoZSBEVVQnKQotCi0gICAgICAgICAgICBjZXJ0X2FjbC5zZW5kX2ZpcnN0KGInXHgyNlx4MDBceDA3XHgwMFRoaXMgaXMganVzdCBTb21lQWNsRGF0YSBmcm9tIHRoZSBDZXJ0JykKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2FjbCkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lTW9yZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChkdXRfYWNsKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ1NvbWVBY2xEYXRhJyBpbiBwYWNrZXQucGF5bG9hZCkKLQotICAgICAgICAgICAgZHV0X2FjbC5kaXNjb25uZWN0KGhjaV9wYWNrZXRzLkRpc2Nvbm5lY3RSZWFzb24uUkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKQotICAgICAgICAgICAgZHV0X2FjbC53YWl0X2Zvcl9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKCkKLQotICAgIGRlZiB0ZXN0X3JlY29tYmluYXRpb25fbDJjYXBfcGFja2V0KHNlbGYpOgotICAgICAgICBzZWxmLmNlcnRfaGNpLmVuYWJsZV9pbnF1aXJ5X2FuZF9wYWdlX3NjYW4oKQotICAgICAgICBjZXJ0X2FkZHJlc3MgPSBzZWxmLmNlcnRfaGNpLnJlYWRfb3duX2FkZHJlc3MoKQotCi0gICAgICAgIHNlbGYuZHV0X2FjbF9tYW5hZ2VyLmluaXRpYXRlX2Nvbm5lY3Rpb24oY2VydF9hZGRyZXNzKQotICAgICAgICBjZXJ0X2FjbCA9IHNlbGYuY2VydF9oY2kuYWNjZXB0X2Nvbm5lY3Rpb24oKQotICAgICAgICB3aXRoIHNlbGYuZHV0X2FjbF9tYW5hZ2VyLmNvbXBsZXRlX291dGdvaW5nX2Nvbm5lY3Rpb24oKSBhcyBkdXRfYWNsOgotICAgICAgICAgICAgY2VydF9hY2wuc2VuZF9maXJzdChiJ1x4MDZceDAwXHgwN1x4MDBIZWxsbycpCi0gICAgICAgICAgICBjZXJ0X2FjbC5zZW5kX2NvbnRpbnVpbmcoYichJykKLSAgICAgICAgICAgIGNlcnRfYWNsLnNlbmRfZmlyc3QoYidceGU4XHgwM1x4MDdceDAwJyArIGInSGVsbG8nICogMjAwKQotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KGR1dF9hY2wpLmVtaXRzKGxhbWJkYSBwYWNrZXQ6IGInSGVsbG8hJyBpbiBwYWNrZXQucGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogYidIZWxsbycgKiAyMDAgaW4gcGFja2V0LnBheWxvYWQpLmluT3JkZXIoKQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2NlcnQvY29udHJvbGxlcl90ZXN0LnB5IGIvZ2QvaGNpL2NlcnQvY29udHJvbGxlcl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdlYWYzLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2NvbnRyb2xsZXJfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIGhjaS5jZXJ0LmNvbnRyb2xsZXJfdGVzdF9saWIgaW1wb3J0IENvbnRyb2xsZXJUZXN0QmFzZQotCi0KLWNsYXNzIENvbnRyb2xsZXJUZXN0KEdkQmFzZVRlc3RDbGFzcywgQ29udHJvbGxlclRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiB0ZXN0X2dldF9hZGRyZXNzZXMoc2VsZik6Ci0gICAgICAgIENvbnRyb2xsZXJUZXN0QmFzZS50ZXN0X2dldF9hZGRyZXNzZXMoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZXN0X3dyaXRlX2xvY2FsX25hbWUoc2VsZik6Ci0gICAgICAgIENvbnRyb2xsZXJUZXN0QmFzZS50ZXN0X3dyaXRlX2xvY2FsX25hbWUoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3N1cHBvcnQoc2VsZik6Ci0gICAgICAgIENvbnRyb2xsZXJUZXN0QmFzZS50ZXN0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3N1cHBvcnQoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKZGlmZiAtLWdpdCBhL2dkL2hjaS9jZXJ0L2NvbnRyb2xsZXJfdGVzdF9saWIucHkgYi9nZC9oY2kvY2VydC9jb250cm9sbGVyX3Rlc3RfbGliLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGEyZjM1Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2NvbnRyb2xsZXJfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCB0aW1lCi0KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgaGNpX3BhY2tldHMKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotZnJvbSBmYWNhZGUgaW1wb3J0IHJvb3RzZXJ2aWNlX3BiMiBhcyBmYWNhZGVfcm9vdHNlcnZpY2UKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgY29udHJvbGxlcl9mYWNhZGVfcGIyIGFzIGNvbnRyb2xsZXJfZmFjYWRlCi0KLQotY2xhc3MgQ29udHJvbGxlclRlc3RCYXNlKCk6Ci0KLSAgICBkZWYgdGVzdF9nZXRfYWRkcmVzc2VzKHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIGNlcnRfYWRkcmVzcyA9IGNlcnQuaGNpX2NvbnRyb2xsZXIuR2V0TWFjQWRkcmVzc1NpbXBsZSgpCi0gICAgICAgIGR1dF9hZGRyZXNzID0gZHV0LmhjaV9jb250cm9sbGVyLkdldE1hY0FkZHJlc3NTaW1wbGUoKQotCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9hZGRyZXNzKS5pc05vdEVxdWFsVG8oZHV0X2FkZHJlc3MpCi0gICAgICAgIHRpbWUuc2xlZXAoMSkgICMgVGhpcyBzaG91bGRuJ3QgYmUgbmVlZGVkIGIvMTQ5MTIwNTQyCi0KLSAgICBkZWYgdGVzdF93cml0ZV9sb2NhbF9uYW1lKHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIGR1dC5oY2lfY29udHJvbGxlci5Xcml0ZUxvY2FsTmFtZShjb250cm9sbGVyX2ZhY2FkZS5OYW1lTXNnKG5hbWU9YidJbVRoZURVVCcpKQotICAgICAgICBjZXJ0LmhjaV9jb250cm9sbGVyLldyaXRlTG9jYWxOYW1lKGNvbnRyb2xsZXJfZmFjYWRlLk5hbWVNc2cobmFtZT1iJ0ltVGhlQ2VydCcpKQotICAgICAgICBjZXJ0X25hbWUgPSBjZXJ0LmhjaV9jb250cm9sbGVyLkdldExvY2FsTmFtZVNpbXBsZSgpCi0gICAgICAgIGR1dF9uYW1lID0gZHV0LmhjaV9jb250cm9sbGVyLkdldExvY2FsTmFtZVNpbXBsZSgpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfbmFtZSkuaXNFcXVhbFRvKGInSW1UaGVEVVQnKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfbmFtZSkuaXNFcXVhbFRvKGInSW1UaGVDZXJ0JykKLQotICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3N1cHBvcnQoc2VsZiwgZHV0LCBjZXJ0KToKLSAgICAgICAgZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfc3VwcG9ydGVkID0gZHV0LmhjaV9jb250cm9sbGVyLlN1cHBvcnRzQmxlRXh0ZW5kZWRBZHZlcnRpc2luZyhlbXB0eV9wcm90by5FbXB0eSgpKQotICAgICAgICBpZiBleHRlbmRlZF9hZHZlcnRpc2luZ19zdXBwb3J0ZWQuc3VwcG9ydGVkOgotICAgICAgICAgICAgbnVtYmVyX29mX3NldHMgPSBkdXQuaGNpX2NvbnRyb2xsZXIuR2V0TGVOdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0cyhlbXB0eV9wcm90by5FbXB0eSgpKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChudW1iZXJfb2Zfc2V0cy52YWx1ZSkuaXNHcmVhdGVyVGhhbig1KSAgIyBBbmRyb2lkIHRocmVzaG9sZCBmb3IgQ1RTCi0gICAgICAgICAgICBzdXBwb3J0ZWQgPSBkdXQuaGNpX2NvbnRyb2xsZXIuSXNTdXBwb3J0ZWRDb21tYW5kKAotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfZmFjYWRlLk9wQ29kZU1zZyhvcF9jb2RlPWludChoY2lfcGFja2V0cy5PcENvZGUuTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMpKSkKLSAgICAgICAgICAgIGFzc2VydFRoYXQoc3VwcG9ydGVkLnN1cHBvcnRlZCkuaXNFcXVhbFRvKFRydWUpCmRpZmYgLS1naXQgYS9nZC9oY2kvY2VydC9kaXJlY3RfaGNpX3Rlc3QucHkgYi9nZC9oY2kvY2VydC9kaXJlY3RfaGNpX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzljMjcuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NlcnQvZGlyZWN0X2hjaV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gaGNpLmNlcnQuZGlyZWN0X2hjaV90ZXN0X2xpYiBpbXBvcnQgRGlyZWN0SGNpVGVzdEJhc2UKLQotCi1jbGFzcyBEaXJlY3RIY2lUZXN0KEdkQmFzZVRlc3RDbGFzcywgRGlyZWN0SGNpVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nSENJJywgY2VydF9tb2R1bGU9J0hBTCcpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgRGlyZWN0SGNpVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIERpcmVjdEhjaVRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKZGlmZiAtLWdpdCBhL2dkL2hjaS9jZXJ0L2RpcmVjdF9oY2lfdGVzdF9saWIucHkgYi9nZC9oY2kvY2VydC9kaXJlY3RfaGNpX3Rlc3RfbGliLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTE3ZjMyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2RpcmVjdF9oY2lfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKLWltcG9ydCBsb2dnaW5nCi0KLWZyb20gY2VydC5jYXB0dXJlcyBpbXBvcnQgSGFsQ2FwdHVyZXMsIEhjaUNhcHR1cmVzCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEhjaU1hdGNoZXJzCi1mcm9tIGNlcnQucHlfaGFsIGltcG9ydCBQeUhhbAotZnJvbSBjZXJ0LnB5X2hjaSBpbXBvcnQgUHlIY2kKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBoY2lfZmFjYWRlX3BiMiBhcyBoY2lfZmFjYWRlCi1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgRXZlbnRDb2RlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExvb3BiYWNrTW9kZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBXcml0ZUxvb3BiYWNrTW9kZUJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgUmVhZExvY2FsTmFtZUJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgV3JpdGVTY2FuRW5hYmxlQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBTY2FuRW5hYmxlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IElucXVpcnlCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFN1YmV2ZW50Q29kZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldFJhbmRvbUFkZHJlc3NCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFBoeVNjYW5QYXJhbWV0ZXJzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2NhblR5cGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBPd25BZGRyZXNzVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNjYW5uaW5nRmlsdGVyUG9saWN5Ci1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEVuYWJsZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBGaWx0ZXJEdXBsaWNhdGVzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0xlZ2FjeVBhcmFtZXRlcnNCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBQZWVyQWRkcmVzc1R5cGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0J1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgR2FwRGF0YQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBHYXBEYXRhVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBPcGVyYXRpb24KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgRnJhZ21lbnRQcmVmZXJlbmNlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZUJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcgotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgRW5hYmxlZFNldAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZUNyZWF0ZUNvbm5QaHlTY2FuUGFyYW1ldGVycwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZUV4dGVuZGVkQ3JlYXRlQ29ubmVjdGlvbkJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgSW5pdGlhdG9yRmlsdGVyUG9saWN5Ci1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEFkZHJlc3NUeXBlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IEJyb2FkY2FzdEZsYWcKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQ29ubmVjdExpc3RBZGRyZXNzVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBMZUFkZERldmljZVRvQ29ubmVjdExpc3RCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IExlU2V0UmFuZG9tQWRkcmVzc0J1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGVSZWFkUmVtb3RlRmVhdHVyZXNCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFdyaXRlUGFnZVRpbWVvdXRCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFJlYWRCZEFkZHJCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IENyZWF0ZUNvbm5lY3Rpb25CdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQ2xvY2tPZmZzZXRWYWxpZAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBDcmVhdGVDb25uZWN0aW9uUm9sZVN3aXRjaAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBBY2NlcHRDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IFBhY2tldEJvdW5kYXJ5RmxhZwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBSZXNldEJ1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgTGFwCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IE9wQ29kZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmhjaV9wYWNrZXRzIGltcG9ydCBBY2xCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IFJhd0J1aWxkZXIKLQotCi1jbGFzcyBEaXJlY3RIY2lUZXN0QmFzZSgpOgotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZiwgZHV0LCBjZXJ0KToKLSAgICAgICAgc2VsZi5kdXRfaGNpID0gUHlIY2koZHV0LCBhY2xfc3RyZWFtaW5nPVRydWUpCi0gICAgICAgIHNlbGYuY2VydF9oYWwgPSBQeUhhbChjZXJ0KQotICAgICAgICBzZWxmLmNlcnRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoUmVzZXRCdWlsZGVyKCkpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5kdXRfaGNpLmNsb3NlKCkKLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5jbG9zZSgpCi0KLSAgICBkZWYgZW5xdWV1ZV9hY2xfZGF0YShzZWxmLCBoYW5kbGUsIHBiX2ZsYWcsIGJfZmxhZywgZGF0YSk6Ci0gICAgICAgIGFjbCA9IEFjbEJ1aWxkZXIoaGFuZGxlLCBwYl9mbGFnLCBiX2ZsYWcsIFJhd0J1aWxkZXIoZGF0YSkpCi0gICAgICAgIHNlbGYuZHV0LmhjaS5TZW5kQWNsKGNvbW1vbi5EYXRhKHBheWxvYWQ9Ynl0ZXMoYWNsLlNlcmlhbGl6ZSgpKSkpCi0KLSAgICBkZWYgdGVzdF9sb2NhbF9oY2lfY21kX2FuZF9ldmVudChzZWxmKToKLSAgICAgICAgIyBMb29wYmFjayBtb2RlIHJlc3BvbmRzIHdpdGggQUNMIGFuZCBTQ08gY29ubmVjdGlvbiBjb21wbGV0ZQotICAgICAgICBzZWxmLmR1dF9oY2kucmVnaXN0ZXJfZm9yX2V2ZW50cyhFdmVudENvZGUuTE9PUEJBQ0tfQ09NTUFORCkKLSAgICAgICAgc2VsZi5kdXRfaGNpLnNlbmRfY29tbWFuZChXcml0ZUxvb3BiYWNrTW9kZUJ1aWxkZXIoTG9vcGJhY2tNb2RlLkVOQUJMRV9MT0NBTCkpCi0KLSAgICAgICAgc2VsZi5kdXRfaGNpLnNlbmRfY29tbWFuZChSZWFkTG9jYWxOYW1lQnVpbGRlcigpKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hjaS5nZXRfZXZlbnRfc3RyZWFtKCkpLmVtaXRzKEhjaU1hdGNoZXJzLkxvb3BiYWNrT2YoUmVhZExvY2FsTmFtZUJ1aWxkZXIoKSkpCi0KLSAgICBkZWYgdGVzdF9pbnF1aXJ5X2Zyb21fZHV0KHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9oY2kucmVnaXN0ZXJfZm9yX2V2ZW50cyhFdmVudENvZGUuSU5RVUlSWV9SRVNVTFQpCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5lbmFibGVfaW5xdWlyeV9hbmRfcGFnZV9zY2FuKCkKLSAgICAgICAgbGFwID0gTGFwKCkKLSAgICAgICAgbGFwLmxhcCA9IDB4MzMKLSAgICAgICAgc2VsZi5kdXRfaGNpLnNlbmRfY29tbWFuZChJbnF1aXJ5QnVpbGRlcihsYXAsIDB4MzAsIDB4ZmYpKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hjaS5nZXRfZXZlbnRfc3RyZWFtKCkpLmVtaXRzKEhjaU1hdGNoZXJzLkV2ZW50V2l0aENvZGUoRXZlbnRDb2RlLklOUVVJUllfUkVTVUxUKSkKLQotICAgIGRlZiB0ZXN0X2xlX2FkX3NjYW5fY2VydF9hZHZlcnRpc2VzKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9oY2kucmVnaXN0ZXJfZm9yX2xlX2V2ZW50cyhTdWJldmVudENvZGUuRVhURU5ERURfQURWRVJUSVNJTkdfUkVQT1JULCBTdWJldmVudENvZGUuQURWRVJUSVNJTkdfUkVQT1JUKQotCi0gICAgICAgICMgRFVUIFNjYW5zCi0gICAgICAgIHNlbGYuZHV0X2hjaS5zZW5kX2NvbW1hbmQoTGVTZXRSYW5kb21BZGRyZXNzQnVpbGRlcignMEQ6MDU6MDQ6MDM6MDI6MDEnKSkKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zID0gUGh5U2NhblBhcmFtZXRlcnMoKQotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMubGVfc2Nhbl9pbnRlcnZhbCA9IDY1NTMKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmxlX3NjYW5fd2luZG93ID0gNjU1MwotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMubGVfc2Nhbl90eXBlID0gTGVTY2FuVHlwZS5BQ1RJVkUKLQotICAgICAgICBzZWxmLmR1dF9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQnVpbGRlcihPd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsIExlU2Nhbm5pbmdGaWx0ZXJQb2xpY3kuQUNDRVBUX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgW3BoeV9zY2FuX3BhcmFtc10pKQotICAgICAgICBzZWxmLmR1dF9oY2kuc2VuZF9jb21tYW5kKExlU2V0RXh0ZW5kZWRTY2FuRW5hYmxlQnVpbGRlcihFbmFibGUuRU5BQkxFRCwgRmlsdGVyRHVwbGljYXRlcy5ESVNBQkxFRCwgMCwgMCkpCi0KLSAgICAgICAgIyBDRVJUIEFkdmVydGlzZXMKLSAgICAgICAgYWR2ZXJ0aXNpbmdfaGFuZGxlID0gMAotICAgICAgICBzZWxmLmNlcnRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdMZWdhY3lQYXJhbWV0ZXJzQnVpbGRlcigKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19oYW5kbGUsCi0gICAgICAgICAgICAgICAgTGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzLkFEVl9JTkQsCi0gICAgICAgICAgICAgICAgNTEyLAotICAgICAgICAgICAgICAgIDc2OCwKLSAgICAgICAgICAgICAgICA3LAotICAgICAgICAgICAgICAgIE93bkFkZHJlc3NUeXBlLlJBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgICAgICBQZWVyQWRkcmVzc1R5cGUuUFVCTElDX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTLAotICAgICAgICAgICAgICAgICdBNjpBNTpBNDpBMzpBMjpBMScsCi0gICAgICAgICAgICAgICAgQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMsCi0gICAgICAgICAgICAgICAgMHhGNywKLSAgICAgICAgICAgICAgICAxLCAgIyBTSUQKLSAgICAgICAgICAgICAgICBFbmFibGUuRElTQUJMRUQgICMgU2NhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgKSkKLQotICAgICAgICBzZWxmLmNlcnRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQnVpbGRlcihhZHZlcnRpc2luZ19oYW5kbGUsICcwQzowNTowNDowMzowMjowMScpKQotICAgICAgICBnYXBfbmFtZSA9IEdhcERhdGEoKQotICAgICAgICBnYXBfbmFtZS5kYXRhX3R5cGUgPSBHYXBEYXRhVHlwZS5DT01QTEVURV9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fQV9DZXJ0JykpCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YUJ1aWxkZXIoYWR2ZXJ0aXNpbmdfaGFuZGxlLCBPcGVyYXRpb24uQ09NUExFVEVfQURWRVJUSVNFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtnYXBfbmFtZV0pKQotCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lID0gR2FwRGF0YSgpCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lLmRhdGFfdHlwZSA9IEdhcERhdGFUeXBlLlNIT1JURU5FRF9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fQV9DJykpCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5zZW5kX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcihhZHZlcnRpc2luZ19oYW5kbGUsIE9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudFByZWZlcmVuY2UuQ09OVFJPTExFUl9TSE9VTERfTk9ULCBbZ2FwX3Nob3J0X25hbWVdKSkKLQotICAgICAgICBlbmFibGVkX3NldCA9IEVuYWJsZWRTZXQoKQotICAgICAgICBlbmFibGVkX3NldC5hZHZlcnRpc2luZ19oYW5kbGUgPSAwCi0gICAgICAgIGVuYWJsZWRfc2V0LmR1cmF0aW9uID0gMAotICAgICAgICBlbmFibGVkX3NldC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzID0gMAotICAgICAgICBzZWxmLmNlcnRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcihFbmFibGUuRU5BQkxFRCwgW2VuYWJsZWRfc2V0XSkpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9oY2kuZ2V0X2xlX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ0ltX0FfQ2VydCcgaW4gcGFja2V0LnBheWxvYWQpCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5zZW5kX2hjaV9jb21tYW5kKExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXIoRW5hYmxlLkRJU0FCTEVELCBbZW5hYmxlZF9zZXRdKSkKLSAgICAgICAgc2VsZi5kdXRfaGNpLnNlbmRfY29tbWFuZChMZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXIoRW5hYmxlLkRJU0FCTEVELCBGaWx0ZXJEdXBsaWNhdGVzLkRJU0FCTEVELCAwLCAwKSkKLQotICAgIGRlZiBfdmVyaWZ5X2xlX2Nvbm5lY3Rpb25fY29tcGxldGUoc2VsZik6Ci0gICAgICAgIGNlcnRfY29ubl9jb21wbGV0ZV9jYXB0dXJlID0gSGFsQ2FwdHVyZXMuTGVDb25uZWN0aW9uQ29tcGxldGVDYXB0dXJlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfaGFsLmdldF9oY2lfZXZlbnRfc3RyZWFtKCkpLmVtaXRzKGNlcnRfY29ubl9jb21wbGV0ZV9jYXB0dXJlKQotICAgICAgICBjZXJ0X2hhbmRsZSA9IGNlcnRfY29ubl9jb21wbGV0ZV9jYXB0dXJlLmdldCgpLkdldENvbm5lY3Rpb25IYW5kbGUoKQotCi0gICAgICAgIGR1dF9jb25uX2NvbXBsZXRlX2NhcHR1cmUgPSBIY2lDYXB0dXJlcy5MZUNvbm5lY3Rpb25Db21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hjaS5nZXRfbGVfZXZlbnRfc3RyZWFtKCkpLmVtaXRzKGR1dF9jb25uX2NvbXBsZXRlX2NhcHR1cmUpCi0gICAgICAgIGR1dF9oYW5kbGUgPSBkdXRfY29ubl9jb21wbGV0ZV9jYXB0dXJlLmdldCgpLkdldENvbm5lY3Rpb25IYW5kbGUoKQotCi0gICAgICAgIHJldHVybiAoZHV0X2hhbmRsZSwgY2VydF9oYW5kbGUpCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9jcmVhdGVfcGh5X3NjYW5fcGFyYW1zKCk6Ci0gICAgICAgIHBoeV9zY2FuX3BhcmFtcyA9IExlQ3JlYXRlQ29ublBoeVNjYW5QYXJhbWV0ZXJzKCkKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLnNjYW5faW50ZXJ2YWwgPSAweDYwCi0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5zY2FuX3dpbmRvdyA9IDB4MzAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmNvbm5faW50ZXJ2YWxfbWluID0gMHgxOAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuY29ubl9pbnRlcnZhbF9tYXggPSAweDI4Ci0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5jb25uX2xhdGVuY3kgPSAwCi0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5zdXBlcnZpc2lvbl90aW1lb3V0ID0gMHgxZjQKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLm1pbl9jZV9sZW5ndGggPSAwCi0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5tYXhfY2VfbGVuZ3RoID0gMAotICAgICAgICByZXR1cm4gcGh5X3NjYW5fcGFyYW1zCi0KLSAgICBkZWYgdGVzdF9sZV9jb25uZWN0aW9uX2R1dF9hZHZlcnRpc2VzKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9oY2kucmVnaXN0ZXJfZm9yX2xlX2V2ZW50cyhTdWJldmVudENvZGUuQ09OTkVDVElPTl9DT01QTEVURSwgU3ViZXZlbnRDb2RlLkFEVkVSVElTSU5HX1NFVF9URVJNSU5BVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJldmVudENvZGUuRU5IQU5DRURfQ09OTkVDVElPTl9DT01QTEVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViZXZlbnRDb2RlLlJFQURfUkVNT1RFX0ZFQVRVUkVTX0NPTVBMRVRFKQotICAgICAgICAjIENlcnQgQ29ubmVjdHMKLSAgICAgICAgc2VsZi5jZXJ0X2hhbC51bm1hc2tfZXZlbnQoRXZlbnRDb2RlLkxFX01FVEFfRVZFTlQpCi0gICAgICAgIHNlbGYuY2VydF9oYWwuc2VuZF9oY2lfY29tbWFuZChMZVNldFJhbmRvbUFkZHJlc3NCdWlsZGVyKCcwQzowNTowNDowMzowMjowMScpKQotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMgPSBEaXJlY3RIY2lUZXN0QmFzZS5fY3JlYXRlX3BoeV9zY2FuX3BhcmFtcygpCi0gICAgICAgIHNlbGYuY2VydF9oYWwuc2VuZF9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIExlRXh0ZW5kZWRDcmVhdGVDb25uZWN0aW9uQnVpbGRlcihJbml0aWF0b3JGaWx0ZXJQb2xpY3kuVVNFX1BFRVJfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsIEFkZHJlc3NUeXBlLlJBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMEQ6MDU6MDQ6MDM6MDI6MDEnLCAxLCBbcGh5X3NjYW5fcGFyYW1zXSkpCi0KLSAgICAgICAgYWR2ZXJ0aXNlbWVudCA9IHNlbGYuZHV0X2hjaS5jcmVhdGVfYWR2ZXJ0aXNlbWVudCgwLCAnMEQ6MDU6MDQ6MDM6MDI6MDEnKQotICAgICAgICBhZHZlcnRpc2VtZW50LnNldF9kYXRhKGInSW1fVGhlX0RVVCcpCi0gICAgICAgIGFkdmVydGlzZW1lbnQuc2V0X3NjYW5fcmVzcG9uc2UoYidJbV9UaGVfRCcpCi0gICAgICAgIGFkdmVydGlzZW1lbnQuc3RhcnQoKQotCi0gICAgICAgIChkdXRfaGFuZGxlLCBjZXJ0X2hhbmRsZSkgPSBzZWxmLl92ZXJpZnlfbGVfY29ubmVjdGlvbl9jb21wbGV0ZSgpCi0KLSAgICAgICAgc2VsZi5kdXRfaGNpLnNlbmRfY29tbWFuZChMZVJlYWRSZW1vdGVGZWF0dXJlc0J1aWxkZXIoZHV0X2hhbmRsZSkpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfaGNpLmdldF9sZV9ldmVudF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBwYWNrZXQucGF5bG9hZFswXSA9PSBpbnQoRXZlbnRDb2RlLkxFX01FVEFfRVZFTlQpIGFuZCBwYWNrZXQucGF5bG9hZFsyXSA9PSBpbnQoU3ViZXZlbnRDb2RlLlJFQURfUkVNT1RFX0ZFQVRVUkVTX0NPTVBMRVRFKQotICAgICAgICApCi0KLSAgICAgICAgIyBTZW5kIEFDTCBEYXRhCi0gICAgICAgIHNlbGYuZW5xdWV1ZV9hY2xfZGF0YShkdXRfaGFuZGxlLCBQYWNrZXRCb3VuZGFyeUZsYWcuRklSU1RfTk9OX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0RmxhZy5QT0lOVF9UT19QT0lOVCwgYnl0ZXMoYidKdXN0IFNvbWVBY2xEYXRhJykpCi0gICAgICAgIHNlbGYuY2VydF9oYWwuc2VuZF9hY2xfZmlyc3QoY2VydF9oYW5kbGUsIGJ5dGVzKGInSnVzdCBTb21lTW9yZUFjbERhdGEnKSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9oYWwuZ2V0X2FjbF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBsYW1iZGEgcGFja2V0OiBsb2dnaW5nLmRlYnVnKHBhY2tldC5wYXlsb2FkKSBvciBiJ1NvbWVBY2xEYXRhJyBpbiBwYWNrZXQucGF5bG9hZCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9oY2kuZ2V0X3Jhd19hY2xfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgbGFtYmRhIHBhY2tldDogbG9nZ2luZy5kZWJ1ZyhwYWNrZXQucGF5bG9hZCkgb3IgYidTb21lTW9yZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotCi0gICAgZGVmIHRlc3RfbGVfY29ubmVjdF9saXN0X2Nvbm5lY3Rpb25fY2VydF9hZHZlcnRpc2VzKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9oY2kucmVnaXN0ZXJfZm9yX2xlX2V2ZW50cyhTdWJldmVudENvZGUuQ09OTkVDVElPTl9DT01QTEVURSwgU3ViZXZlbnRDb2RlLkVOSEFOQ0VEX0NPTk5FQ1RJT05fQ09NUExFVEUpCi0gICAgICAgICMgRFVUIENvbm5lY3RzCi0gICAgICAgIHNlbGYuZHV0X2hjaS5zZW5kX2NvbW1hbmQoTGVTZXRSYW5kb21BZGRyZXNzQnVpbGRlcignMEQ6MDU6MDQ6MDM6MDI6MDEnKSkKLSAgICAgICAgc2VsZi5kdXRfaGNpLnNlbmRfY29tbWFuZChMZUFkZERldmljZVRvQ29ubmVjdExpc3RCdWlsZGVyKENvbm5lY3RMaXN0QWRkcmVzc1R5cGUuUkFORE9NLCAnMEM6MDU6MDQ6MDM6MDI6MDEnKSkKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zID0gRGlyZWN0SGNpVGVzdEJhc2UuX2NyZWF0ZV9waHlfc2Nhbl9wYXJhbXMoKQotICAgICAgICBzZWxmLmR1dF9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgTGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25CdWlsZGVyKEluaXRpYXRvckZpbHRlclBvbGljeS5VU0VfQ09OTkVDVF9MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bkFkZHJlc3NUeXBlLlJBTkRPTV9ERVZJQ0VfQUREUkVTUywgQWRkcmVzc1R5cGUuUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCQTpENTpBNDpBMzpBMjpBMScsIDEsIFtwaHlfc2Nhbl9wYXJhbXNdKSkKLQotICAgICAgICBzZWxmLmNlcnRfaGFsLnVubWFza19ldmVudChFdmVudENvZGUuTEVfTUVUQV9FVkVOVCkKLSAgICAgICAgYWR2ZXJ0aXNlbWVudCA9IHNlbGYuY2VydF9oYWwuY3JlYXRlX2FkdmVydGlzZW1lbnQoCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgJzBDOjA1OjA0OjAzOjAyOjAxJywKLSAgICAgICAgICAgIG1pbl9pbnRlcnZhbD01MTIsCi0gICAgICAgICAgICBtYXhfaW50ZXJ2YWw9NzY4LAotICAgICAgICAgICAgcGVlcl9hZGRyZXNzPSdBNjpBNTpBNDpBMzpBMjpBMScsCi0gICAgICAgICAgICB0eF9wb3dlcj0weDdmLAotICAgICAgICAgICAgc2lkPTApCi0gICAgICAgIGFkdmVydGlzZW1lbnQuc2V0X2RhdGEoYidJbV9BX0NlcnQnKQotICAgICAgICBhZHZlcnRpc2VtZW50LnN0YXJ0KCkKLQotICAgICAgICAjIExlQ29ubmVjdGlvbkNvbXBsZXRlCi0gICAgICAgIHNlbGYuX3ZlcmlmeV9sZV9jb25uZWN0aW9uX2NvbXBsZXRlKCkKLQotICAgIGRlZiB0ZXN0X2Nvbm5lY3Rpb25fZHV0X2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9oY2kuc2VuZF9jb21tYW5kKFdyaXRlUGFnZVRpbWVvdXRCdWlsZGVyKDB4NDAwMCkpCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5lbmFibGVfaW5xdWlyeV9hbmRfcGFnZV9zY2FuKCkKLSAgICAgICAgYWRkcmVzcyA9IHNlbGYuY2VydF9oYWwucmVhZF9vd25fYWRkcmVzcygpCi0KLSAgICAgICAgc2VsZi5kdXRfaGNpLmluaXRpYXRlX2Nvbm5lY3Rpb24oYWRkcmVzcykKLSAgICAgICAgY2VydF9hY2wgPSBzZWxmLmNlcnRfaGFsLmFjY2VwdF9jb25uZWN0aW9uKCkKLSAgICAgICAgZHV0X2FjbCA9IHNlbGYuZHV0X2hjaS5jb21wbGV0ZV9jb25uZWN0aW9uKCkKLQotICAgICAgICAjIFNlbmQgQUNMIERhdGEKLSAgICAgICAgZHV0X2FjbC5zZW5kX2ZpcnN0KGInSnVzdCBTb21lQWNsRGF0YScpCi0gICAgICAgIGNlcnRfYWNsLnNlbmRfZmlyc3QoYidKdXN0IFNvbWVNb3JlQWNsRGF0YScpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfaGFsLmdldF9hY2xfc3RyZWFtKCkpLmVtaXRzKGxhbWJkYSBwYWNrZXQ6IGInU29tZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X2hjaS5nZXRfcmF3X2FjbF9zdHJlYW0oKSkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lTW9yZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotCi0gICAgZGVmIHRlc3RfY29ubmVjdGlvbl9jZXJ0X2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBzZWxmLmNlcnRfaGFsLnNlbmRfaGNpX2NvbW1hbmQoV3JpdGVQYWdlVGltZW91dEJ1aWxkZXIoMHg0MDAwKSkKLQotICAgICAgICBzZWxmLmR1dF9oY2kuZW5hYmxlX2lucXVpcnlfYW5kX3BhZ2Vfc2NhbigpCi0gICAgICAgIGFkZHJlc3MgPSBzZWxmLmR1dF9oY2kucmVhZF9vd25fYWRkcmVzcygpCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hhbC5pbml0aWF0ZV9jb25uZWN0aW9uKGFkZHJlc3MpCi0gICAgICAgIGR1dF9hY2wgPSBzZWxmLmR1dF9oY2kuYWNjZXB0X2Nvbm5lY3Rpb24oKQotICAgICAgICBjZXJ0X2FjbCA9IHNlbGYuY2VydF9oYWwuY29tcGxldGVfY29ubmVjdGlvbigpCi0KLSAgICAgICAgIyBTZW5kIEFDTCBEYXRhCi0gICAgICAgIGR1dF9hY2wuc2VuZF9maXJzdChiJ1RoaXMgaXMganVzdCBTb21lQWNsRGF0YScpCi0gICAgICAgIGNlcnRfYWNsLnNlbmRfZmlyc3QoYidUaGlzIGlzIGp1c3QgU29tZU1vcmVBY2xEYXRhJykKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9oYWwuZ2V0X2FjbF9zdHJlYW0oKSkuZW1pdHMobGFtYmRhIHBhY2tldDogYidTb21lQWNsRGF0YScgaW4gcGFja2V0LnBheWxvYWQpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfaGNpLmdldF9yYXdfYWNsX3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ1NvbWVNb3JlQWNsRGF0YScgaW4gcGFja2V0LnBheWxvYWQpCmRpZmYgLS1naXQgYS9nZC9oY2kvY2VydC9sZV9hY2xfbWFuYWdlcl90ZXN0LnB5IGIvZ2QvaGNpL2NlcnQvbGVfYWNsX21hbmFnZXJfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxMDg2MC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY2VydC9sZV9hY2xfbWFuYWdlcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gaGNpLmNlcnQubGVfYWNsX21hbmFnZXJfdGVzdF9saWIgaW1wb3J0IExlQWNsTWFuYWdlclRlc3RCYXNlCi0KLQotY2xhc3MgTGVBY2xNYW5hZ2VyVGVzdChHZEJhc2VUZXN0Q2xhc3MsIExlQWNsTWFuYWdlclRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJywgY2VydF9tb2R1bGU9J0hDSScpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVBY2xNYW5hZ2VyVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIExlQWNsTWFuYWdlclRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKZGlmZiAtLWdpdCBhL2dkL2hjaS9jZXJ0L2xlX2FjbF9tYW5hZ2VyX3Rlc3RfbGliLnB5IGIvZ2QvaGNpL2NlcnQvbGVfYWNsX21hbmFnZXJfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2N2JiNzEuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NlcnQvbGVfYWNsX21hbmFnZXJfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IHNhZmVDbG9zZQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBjZXJ0LnB5X2xlX2FjbF9tYW5hZ2VyIGltcG9ydCBQeUxlQWNsTWFuYWdlcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotZnJvbSBmYWNhZGUgaW1wb3J0IGNvbW1vbl9wYjIgYXMgY29tbW9uCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2FjbF9tYW5hZ2VyX2ZhY2FkZV9wYjIgYXMgbGVfYWNsX21hbmFnZXJfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlX3BiMiBhcyBsZV9hZHZlcnRpc2luZ19mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlX3BiMiBhcyBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgaGNpX2ZhY2FkZV9wYjIgYXMgaGNpX2ZhY2FkZQotaW1wb3J0IGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgYXMgYnRfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBSYXdCdWlsZGVyCi0KLQotY2xhc3MgTGVBY2xNYW5hZ2VyVGVzdEJhc2UoKToKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIHNlbGYuZHV0X2xlX2FjbF9tYW5hZ2VyID0gUHlMZUFjbE1hbmFnZXIoZHV0KQotICAgICAgICBzZWxmLmNlcnRfaGNpX2xlX2V2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKGNlcnQuaGNpLlN0cmVhbUxlU3ViZXZlbnRzKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotICAgICAgICBzZWxmLmNlcnRfYWNsX2RhdGFfc3RyZWFtID0gRXZlbnRTdHJlYW0oY2VydC5oY2kuU3RyZWFtQWNsKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHNhZmVDbG9zZShzZWxmLmNlcnRfaGNpX2xlX2V2ZW50X3N0cmVhbSkKLSAgICAgICAgc2FmZUNsb3NlKHNlbGYuY2VydF9hY2xfZGF0YV9zdHJlYW0pCi0gICAgICAgIHNhZmVDbG9zZShzZWxmLmR1dF9sZV9hY2xfbWFuYWdlcikKLQotICAgIGRlZiBzZXRfcHJpdmFjeV9wb2xpY3lfc3RhdGljKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9hZGRyZXNzID0gYidkMDowNTowNDowMzowMjowMScKLSAgICAgICAgcHJpdmF0ZV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWJ5dGVzKHNlbGYuZHV0X2FkZHJlc3MpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKSkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX2luaXRpYXRvcl9hZGRyZXNzLlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKHByaXZhdGVfcG9saWN5KQotCi0gICAgZGVmIHJlZ2lzdGVyX2Zvcl9ldmVudChzZWxmLCBldmVudF9jb2RlKToKLSAgICAgICAgbXNnID0gaGNpX2ZhY2FkZS5FdmVudFJlcXVlc3QoY29kZT1pbnQoZXZlbnRfY29kZSkpCi0gICAgICAgIHNlbGYuY2VydC5oY2kuUmVxdWVzdEV2ZW50KG1zZykKLQotICAgIGRlZiByZWdpc3Rlcl9mb3JfbGVfZXZlbnQoc2VsZiwgZXZlbnRfY29kZSk6Ci0gICAgICAgIG1zZyA9IGhjaV9mYWNhZGUuRXZlbnRSZXF1ZXN0KGNvZGU9aW50KGV2ZW50X2NvZGUpKQotICAgICAgICBzZWxmLmNlcnQuaGNpLlJlcXVlc3RMZVN1YmV2ZW50KG1zZykKLQotICAgIGRlZiBlbnF1ZXVlX2hjaV9jb21tYW5kKHNlbGYsIGNvbW1hbmQpOgotICAgICAgICBjbWRfYnl0ZXMgPSBieXRlcyhjb21tYW5kLlNlcmlhbGl6ZSgpKQotICAgICAgICBjbWQgPSBjb21tb24uRGF0YShwYXlsb2FkPWNtZF9ieXRlcykKLSAgICAgICAgc2VsZi5jZXJ0LmhjaS5TZW5kQ29tbWFuZChjbWQpCi0KLSAgICBkZWYgZW5xdWV1ZV9hY2xfZGF0YShzZWxmLCBoYW5kbGUsIHBiX2ZsYWcsIGJfZmxhZywgZGF0YSk6Ci0gICAgICAgIGFjbCA9IGhjaV9wYWNrZXRzLkFjbEJ1aWxkZXIoaGFuZGxlLCBwYl9mbGFnLCBiX2ZsYWcsIFJhd0J1aWxkZXIoZGF0YSkpCi0gICAgICAgIHNlbGYuY2VydC5oY2kuU2VuZEFjbChjb21tb24uRGF0YShwYXlsb2FkPWJ5dGVzKGFjbC5TZXJpYWxpemUoKSkpKQotCi0gICAgZGVmIGR1dF9jb25uZWN0cyhzZWxmLCBjaGVja19hZGRyZXNzKToKLSAgICAgICAgc2VsZi5yZWdpc3Rlcl9mb3JfbGVfZXZlbnQoaGNpX3BhY2tldHMuU3ViZXZlbnRDb2RlLkNPTk5FQ1RJT05fQ09NUExFVEUpCi0gICAgICAgIHNlbGYucmVnaXN0ZXJfZm9yX2xlX2V2ZW50KGhjaV9wYWNrZXRzLlN1YmV2ZW50Q29kZS5FTkhBTkNFRF9DT05ORUNUSU9OX0NPTVBMRVRFKQotCi0gICAgICAgICMgQ2VydCBBZHZlcnRpc2VzCi0gICAgICAgIGFkdmVydGlzaW5nX2hhbmRsZSA9IDAKLSAgICAgICAgc2VsZi5lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfaGFuZGxlLAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcy5BRFZfSU5ELAotICAgICAgICAgICAgICAgIDQwMCwKLSAgICAgICAgICAgICAgICA0NTAsCi0gICAgICAgICAgICAgICAgNywKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Pd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuUGVlckFkZHJlc3NUeXBlLlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywKLSAgICAgICAgICAgICAgICAnMDA6MDA6MDA6MDA6MDA6MDAnLAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTLAotICAgICAgICAgICAgICAgIDB4RjgsCi0gICAgICAgICAgICAgICAgMSwgICNTSUQKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FbmFibGUuRElTQUJMRUQgICMgU2NhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgKSkKLQotICAgICAgICBzZWxmLmVucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQnVpbGRlcihhZHZlcnRpc2luZ19oYW5kbGUsICcwQzowNTowNDowMzowMjowMScpKQotCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9BX0NlcnQnKSkKLQotICAgICAgICBzZWxmLmVucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQnVpbGRlcigKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19oYW5kbGUsIGhjaV9wYWNrZXRzLk9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtnYXBfbmFtZV0pKQotCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLlNIT1JURU5FRF9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fQV9DJykpCi0KLSAgICAgICAgc2VsZi5lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcigKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19oYW5kbGUsIGhjaV9wYWNrZXRzLk9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtnYXBfc2hvcnRfbmFtZV0pKQotCi0gICAgICAgIGVuYWJsZWRfc2V0ID0gaGNpX3BhY2tldHMuRW5hYmxlZFNldCgpCi0gICAgICAgIGVuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZSA9IGFkdmVydGlzaW5nX2hhbmRsZQotICAgICAgICBlbmFibGVkX3NldC5kdXJhdGlvbiA9IDAKLSAgICAgICAgZW5hYmxlZF9zZXQubWF4X2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50cyA9IDAKLSAgICAgICAgc2VsZi5lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5FbmFibGUuRU5BQkxFRCwgW2VuYWJsZWRfc2V0XSkpCi0KLSAgICAgICAgc2VsZi5kdXRfbGVfYWNsID0gc2VsZi5kdXRfbGVfYWNsX21hbmFnZXIuY29ubmVjdF90b19yZW1vdGUoCi0gICAgICAgICAgICByZW1vdGVfYWRkcj1jb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcygnMEM6MDU6MDQ6MDM6MDI6MDEnLCAndXRmOCcpKSwKLSAgICAgICAgICAgICAgICB0eXBlPWludChoY2lfcGFja2V0cy5BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MpKSkKLQotICAgICAgICAjIENlcnQgZ2V0cyBDb25uZWN0aW9uQ29tcGxldGUgd2l0aCBhIGhhbmRsZSBhbmQgc2VuZHMgQUNMIGRhdGEKLSAgICAgICAgaGFuZGxlID0gMHhmZmYKLSAgICAgICAgYWRkcmVzcyA9IGhjaV9wYWNrZXRzLkFkZHJlc3MoKQotCi0gICAgICAgIGRlZiBnZXRfaGFuZGxlKHBhY2tldCk6Ci0gICAgICAgICAgICBwYWNrZXRfYnl0ZXMgPSBwYWNrZXQucGF5bG9hZAotICAgICAgICAgICAgbm9ubG9jYWwgaGFuZGxlCi0gICAgICAgICAgICBub25sb2NhbCBhZGRyZXNzCi0gICAgICAgICAgICBpZiBiJ1x4M2VceDEzXHgwMVx4MDAnIGluIHBhY2tldF9ieXRlczoKLSAgICAgICAgICAgICAgICBjY192aWV3ID0gaGNpX3BhY2tldHMuTGVDb25uZWN0aW9uQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5MZU1ldGFFdmVudFZpZXcoCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QocGFja2V0X2J5dGVzKSkpKSkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBjY192aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBjY192aWV3LkdldFBlZXJBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgaWYgYidceDNlXHgxZlx4MEFceDAwJyBpbiBwYWNrZXRfYnl0ZXM6Ci0gICAgICAgICAgICAgICAgY2NfdmlldyA9IGhjaV9wYWNrZXRzLkxlRW5oYW5jZWRDb25uZWN0aW9uQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5MZU1ldGFFdmVudFZpZXcoCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QocGFja2V0X2J5dGVzKSkpKSkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBjY192aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBjY192aWV3LkdldFBlZXJBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAgICAgc2VsZi5jZXJ0X2hjaV9sZV9ldmVudF9zdHJlYW0uYXNzZXJ0X2V2ZW50X29jY3VycyhnZXRfaGFuZGxlKQotICAgICAgICBzZWxmLmNlcnRfaGFuZGxlID0gaGFuZGxlCi0gICAgICAgIGR1dF9hZGRyZXNzX2Zyb21fY29tcGxldGUgPSBhZGRyZXNzCi0gICAgICAgIGlmIGNoZWNrX2FkZHJlc3M6Ci0gICAgICAgICAgICBhc3NlcnRUaGF0KGR1dF9hZGRyZXNzX2Zyb21fY29tcGxldGUpLmlzRXF1YWxUbyhzZWxmLmR1dF9hZGRyZXNzLmRlY29kZSgpKQotCi0gICAgZGVmIHNlbmRfcmVjZWl2ZV9hbmRfY2hlY2soc2VsZik6Ci0gICAgICAgIHNlbGYuZW5xdWV1ZV9hY2xfZGF0YShzZWxmLmNlcnRfaGFuZGxlLCBoY2lfcGFja2V0cy5QYWNrZXRCb3VuZGFyeUZsYWcuRklSU1RfTk9OX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuQnJvYWRjYXN0RmxhZy5QT0lOVF9UT19QT0lOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKGInXHgxOVx4MDBceDA3XHgwMFNvbWVBY2xEYXRhIGZyb20gdGhlIENlcnQnKSkKLQotICAgICAgICBzZWxmLmR1dF9sZV9hY2wuc2VuZChiJ1x4MUNceDAwXHgwN1x4MDBTb21lTW9yZUFjbERhdGEgZnJvbSB0aGUgRFVUJykKLSAgICAgICAgc2VsZi5jZXJ0X2FjbF9kYXRhX3N0cmVhbS5hc3NlcnRfZXZlbnRfb2NjdXJzKGxhbWJkYSBwYWNrZXQ6IGInU29tZU1vcmVBY2xEYXRhJyBpbiBwYWNrZXQucGF5bG9hZCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9sZV9hY2wpLmVtaXRzKGxhbWJkYSBwYWNrZXQ6IGInU29tZUFjbERhdGEnIGluIHBhY2tldC5wYXlsb2FkKQotCi0gICAgZGVmIHRlc3RfZHV0X2Nvbm5lY3RzKHNlbGYpOgotICAgICAgICBzZWxmLnNldF9wcml2YWN5X3BvbGljeV9zdGF0aWMoKQotICAgICAgICBzZWxmLmR1dF9jb25uZWN0cyhjaGVja19hZGRyZXNzPVRydWUpCi0gICAgICAgIHNlbGYuc2VuZF9yZWNlaXZlX2FuZF9jaGVjaygpCi0KLSAgICBkZWYgdGVzdF9kdXRfY29ubmVjdHNfcmVzb2x2YWJsZV9hZGRyZXNzKHNlbGYpOgotICAgICAgICBwcml2YWN5X3BvbGljeSA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3k9bGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLkFkZHJlc3NQb2xpY3kuVVNFX1JFU09MVkFCTEVfQUREUkVTUywKLSAgICAgICAgICAgIHJvdGF0aW9uX2lyaz1iJ1x4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYnLAotICAgICAgICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lPTcgKiA2MCAqIDEwMDAsCi0gICAgICAgICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWU9MTUgKiA2MCAqIDEwMDApCi0gICAgICAgIHNlbGYuZHV0LmhjaV9sZV9pbml0aWF0b3JfYWRkcmVzcy5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcyhwcml2YWN5X3BvbGljeSkKLSAgICAgICAgc2VsZi5kdXRfY29ubmVjdHMoY2hlY2tfYWRkcmVzcz1GYWxzZSkKLSAgICAgICAgc2VsZi5zZW5kX3JlY2VpdmVfYW5kX2NoZWNrKCkKLQotICAgIGRlZiB0ZXN0X2R1dF9jb25uZWN0c19ub25fcmVzb2x2YWJsZV9hZGRyZXNzKHNlbGYpOgotICAgICAgICBwcml2YWN5X3BvbGljeSA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3k9bGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLkFkZHJlc3NQb2xpY3kuVVNFX05PTl9SRVNPTFZBQkxFX0FERFJFU1MsCi0gICAgICAgICAgICByb3RhdGlvbl9pcms9YidceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmJywKLSAgICAgICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZT04ICogNjAgKiAxMDAwLAotICAgICAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lPTE0ICogNjAgKiAxMDAwKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MocHJpdmFjeV9wb2xpY3kpCi0gICAgICAgIHNlbGYuZHV0X2Nvbm5lY3RzKGNoZWNrX2FkZHJlc3M9RmFsc2UpCi0gICAgICAgIHNlbGYuc2VuZF9yZWNlaXZlX2FuZF9jaGVjaygpCi0KLSAgICBkZWYgdGVzdF9kdXRfY29ubmVjdHNfcHVibGljX2FkZHJlc3Moc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0LmhjaV9sZV9pbml0aWF0b3JfYWRkcmVzcy5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgICAgICAgIGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9QVUJMSUNfQUREUkVTUykpCi0gICAgICAgIHNlbGYuZHV0X2Nvbm5lY3RzKGNoZWNrX2FkZHJlc3M9RmFsc2UpCi0gICAgICAgIHNlbGYuc2VuZF9yZWNlaXZlX2FuZF9jaGVjaygpCi0KLSAgICBkZWYgdGVzdF9kdXRfY29ubmVjdHNfcHVibGljX2FkZHJlc3NfY2FuY2VsbGVkKHNlbGYpOgotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoCi0gICAgICAgICAgICBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgICAgICBhZGRyZXNzX3BvbGljeT1sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuQWRkcmVzc1BvbGljeS5VU0VfUFVCTElDX0FERFJFU1MpKQotICAgICAgICBzZWxmLmR1dF9jb25uZWN0cyhjaGVja19hZGRyZXNzPUZhbHNlKQotICAgICAgICBzZWxmLnNlbmRfcmVjZWl2ZV9hbmRfY2hlY2soKQotCi0gICAgZGVmIHRlc3RfY2VydF9jb25uZWN0cyhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfcHJpdmFjeV9wb2xpY3lfc3RhdGljKCkKLSAgICAgICAgc2VsZi5yZWdpc3Rlcl9mb3JfbGVfZXZlbnQoaGNpX3BhY2tldHMuU3ViZXZlbnRDb2RlLkNPTk5FQ1RJT05fQ09NUExFVEUpCi0gICAgICAgIHNlbGYucmVnaXN0ZXJfZm9yX2xlX2V2ZW50KGhjaV9wYWNrZXRzLlN1YmV2ZW50Q29kZS5FTkhBTkNFRF9DT05ORUNUSU9OX0NPTVBMRVRFKQotCi0gICAgICAgIHNlbGYuZHV0X2xlX2FjbF9tYW5hZ2VyLmxpc3Rlbl9mb3JfaW5jb21pbmdfY29ubmVjdGlvbnMoKQotCi0gICAgICAgICMgRFVUIEFkdmVydGlzZXMKLSAgICAgICAgZ2FwX25hbWUgPSBoY2lfcGFja2V0cy5HYXBEYXRhKCkKLSAgICAgICAgZ2FwX25hbWUuZGF0YV90eXBlID0gaGNpX3BhY2tldHMuR2FwRGF0YVR5cGUuQ09NUExFVEVfTE9DQUxfTkFNRQotICAgICAgICBnYXBfbmFtZS5kYXRhID0gbGlzdChieXRlcyhiJ0ltX1RoZV9EVVQnKSkKLSAgICAgICAgZ2FwX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9uYW1lLlNlcmlhbGl6ZSgpKSkKLSAgICAgICAgY29uZmlnID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nQ29uZmlnKAotICAgICAgICAgICAgYWR2ZXJ0aXNlbWVudD1bZ2FwX2RhdGFdLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWluPTUxMiwKLSAgICAgICAgICAgIGludGVydmFsX21heD03NjgsCi0gICAgICAgICAgICBhZHZlcnRpc2luZ190eXBlPWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0V2ZW50VHlwZS5BRFZfSU5ELAotICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZT1jb21tb24uVVNFX1JBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgIHBlZXJfYWRkcmVzc190eXBlPWNvbW1vbi5QVUJMSUNfREVWSUNFX09SX0lERU5USVRZX0FERFJFU1MsCi0gICAgICAgICAgICBwZWVyX2FkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcyhiJ0E2OkE1OkE0OkEzOkEyOkExJykpLAotICAgICAgICAgICAgY2hhbm5lbF9tYXA9NywKLSAgICAgICAgICAgIGZpbHRlcl9wb2xpY3k9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTKQotICAgICAgICByZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkNyZWF0ZUFkdmVydGlzZXJSZXF1ZXN0KGNvbmZpZz1jb25maWcpCi0KLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotCi0gICAgICAgICMgQ2VydCBDb25uZWN0cwotICAgICAgICBzZWxmLmVucXVldWVfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuTGVTZXRSYW5kb21BZGRyZXNzQnVpbGRlcignMEM6MDU6MDQ6MDM6MDI6MDEnKSkKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zID0gaGNpX3BhY2tldHMuTGVDcmVhdGVDb25uUGh5U2NhblBhcmFtZXRlcnMoKQotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuc2Nhbl9pbnRlcnZhbCA9IDB4NjAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLnNjYW5fd2luZG93ID0gMHgzMAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMuY29ubl9pbnRlcnZhbF9taW4gPSAweDE4Ci0gICAgICAgIHBoeV9zY2FuX3BhcmFtcy5jb25uX2ludGVydmFsX21heCA9IDB4MjgKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLmNvbm5fbGF0ZW5jeSA9IDAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLnN1cGVydmlzaW9uX3RpbWVvdXQgPSAweDFmNAotICAgICAgICBwaHlfc2Nhbl9wYXJhbXMubWluX2NlX2xlbmd0aCA9IDAKLSAgICAgICAgcGh5X3NjYW5fcGFyYW1zLm1heF9jZV9sZW5ndGggPSAwCi0gICAgICAgIHNlbGYuZW5xdWV1ZV9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlRXh0ZW5kZWRDcmVhdGVDb25uZWN0aW9uQnVpbGRlcihoY2lfcGFja2V0cy5Jbml0aWF0b3JGaWx0ZXJQb2xpY3kuVVNFX1BFRVJfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Pd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuQWRkcmVzc1R5cGUuUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHV0X2FkZHJlc3MuZGVjb2RlKCksIDEsIFtwaHlfc2Nhbl9wYXJhbXNdKSkKLQotICAgICAgICAjIENlcnQgZ2V0cyBDb25uZWN0aW9uQ29tcGxldGUgd2l0aCBhIGhhbmRsZSBhbmQgc2VuZHMgQUNMIGRhdGEKLSAgICAgICAgaGFuZGxlID0gMHhmZmYKLQotICAgICAgICBkZWYgZ2V0X2hhbmRsZShwYWNrZXQpOgotICAgICAgICAgICAgcGFja2V0X2J5dGVzID0gcGFja2V0LnBheWxvYWQKLSAgICAgICAgICAgIG5vbmxvY2FsIGhhbmRsZQotICAgICAgICAgICAgaWYgYidceDNlXHgxM1x4MDFceDAwJyBpbiBwYWNrZXRfYnl0ZXM6Ci0gICAgICAgICAgICAgICAgY2NfdmlldyA9IGhjaV9wYWNrZXRzLkxlQ29ubmVjdGlvbkNvbXBsZXRlVmlldygKLSAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVNZXRhRXZlbnRWaWV3KAotICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuRXZlbnRWaWV3KGJ0X3BhY2tldHMuUGFja2V0Vmlld0xpdHRsZUVuZGlhbihsaXN0KHBhY2tldF9ieXRlcykpKSkpCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gY2Nfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgaWYgYidceDNlXHgxZlx4MEFceDAwJyBpbiBwYWNrZXRfYnl0ZXM6Ci0gICAgICAgICAgICAgICAgY2NfdmlldyA9IGhjaV9wYWNrZXRzLkxlRW5oYW5jZWRDb25uZWN0aW9uQ29tcGxldGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5MZU1ldGFFdmVudFZpZXcoCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudFZpZXcoYnRfcGFja2V0cy5QYWNrZXRWaWV3TGl0dGxlRW5kaWFuKGxpc3QocGFja2V0X2J5dGVzKSkpKSkKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBjY192aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKQotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICAgICBzZWxmLmNlcnRfaGNpX2xlX2V2ZW50X3N0cmVhbS5hc3NlcnRfZXZlbnRfb2NjdXJzKGdldF9oYW5kbGUpCi0gICAgICAgIHNlbGYuY2VydF9oYW5kbGUgPSBoYW5kbGUKLQotICAgICAgICBzZWxmLmVucXVldWVfYWNsX2RhdGEoc2VsZi5jZXJ0X2hhbmRsZSwgaGNpX3BhY2tldHMuUGFja2V0Qm91bmRhcnlGbGFnLkZJUlNUX05PTl9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyhiJ1x4MTlceDAwXHgwN1x4MDBTb21lQWNsRGF0YSBmcm9tIHRoZSBDZXJ0JykpCi0KLSAgICAgICAgIyBEVVQgZ2V0cyBhIGNvbm5lY3Rpb24gY29tcGxldGUgZXZlbnQgYW5kIHNlbmRzIGFuZCByZWNlaXZlcwotICAgICAgICBoYW5kbGUgPSAweGZmZgotICAgICAgICBzZWxmLmR1dF9sZV9hY2wgPSBzZWxmLmR1dF9sZV9hY2xfbWFuYWdlci5jb21wbGV0ZV9pbmNvbWluZ19jb25uZWN0aW9uKCkKLQotICAgICAgICBzZWxmLnNlbmRfcmVjZWl2ZV9hbmRfY2hlY2soKQotCi0gICAgZGVmIHRlc3RfcmVjb21iaW5hdGlvbl9sMmNhcF9wYWNrZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0X3ByaXZhY3lfcG9saWN5X3N0YXRpYygpCi0gICAgICAgIHNlbGYuZHV0X2Nvbm5lY3RzKGNoZWNrX2FkZHJlc3M9VHJ1ZSkKLQotICAgICAgICBzZWxmLmVucXVldWVfYWNsX2RhdGEoc2VsZi5jZXJ0X2hhbmRsZSwgaGNpX3BhY2tldHMuUGFja2V0Qm91bmRhcnlGbGFnLkZJUlNUX05PTl9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsIGJ5dGVzKGInXHgwNlx4MDBceDA3XHgwMEhlbGxvJykpCi0gICAgICAgIHNlbGYuZW5xdWV1ZV9hY2xfZGF0YShzZWxmLmNlcnRfaGFuZGxlLCBoY2lfcGFja2V0cy5QYWNrZXRCb3VuZGFyeUZsYWcuQ09OVElOVUlOR19GUkFHTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkJyb2FkY2FzdEZsYWcuUE9JTlRfVE9fUE9JTlQsIGJ5dGVzKGInIScpKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfbGVfYWNsKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ0hlbGxvIScgaW4gcGFja2V0LnBheWxvYWQpCi0KLSAgICBkZWYgdGVzdF9iYWNrZ3JvdW5kX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgIHNlbGYucmVnaXN0ZXJfZm9yX2xlX2V2ZW50KGhjaV9wYWNrZXRzLlN1YmV2ZW50Q29kZS5DT05ORUNUSU9OX0NPTVBMRVRFKQotICAgICAgICBzZWxmLnJlZ2lzdGVyX2Zvcl9sZV9ldmVudChoY2lfcGFja2V0cy5TdWJldmVudENvZGUuRU5IQU5DRURfQ09OTkVDVElPTl9DT01QTEVURSkKLSAgICAgICAgc2VsZi5zZXRfcHJpdmFjeV9wb2xpY3lfc3RhdGljKCkKLQotICAgICAgICAjIFN0YXJ0IGJhY2tncm91bmQgYW5kIGRpcmVjdCBjb25uZWN0aW9uCi0gICAgICAgIHRva2VuID0gc2VsZi5kdXRfbGVfYWNsX21hbmFnZXIuaW5pdGlhdGVfYmFja2dyb3VuZF9hbmRfZGlyZWN0X2Nvbm5lY3Rpb24oCi0gICAgICAgICAgICByZW1vdGVfYWRkcj1jb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcygnMEM6MDU6MDQ6MDM6MDI6MDEnLCAndXRmOCcpKSwKLSAgICAgICAgICAgICAgICB0eXBlPWludChoY2lfcGFja2V0cy5BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MpKSkKLQotICAgICAgICAjIFdhaXQgZm9yIGRpcmVjdCBjb25uZWN0aW9uIHRpbWVvdXQKLSAgICAgICAgc2VsZi5kdXRfbGVfYWNsX21hbmFnZXIud2FpdF9mb3JfY29ubmVjdGlvbl9mYWlsKHRva2VuKQotCi0gICAgICAgICMgQ2VydCBBZHZlcnRpc2VzCi0gICAgICAgIGFkdmVydGlzaW5nX2hhbmRsZSA9IDAKLSAgICAgICAgc2VsZi5lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfaGFuZGxlLAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcy5BRFZfSU5ELAotICAgICAgICAgICAgICAgIDQwMCwKLSAgICAgICAgICAgICAgICA0NTAsCi0gICAgICAgICAgICAgICAgNywKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5Pd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuUGVlckFkZHJlc3NUeXBlLlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywKLSAgICAgICAgICAgICAgICAnMDA6MDA6MDA6MDA6MDA6MDAnLAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTLAotICAgICAgICAgICAgICAgIDB4RjgsCi0gICAgICAgICAgICAgICAgMSwgICNTSUQKLSAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5FbmFibGUuRElTQUJMRUQgICMgU2NhbiByZXF1ZXN0IG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgKSkKLQotICAgICAgICBzZWxmLmVucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQnVpbGRlcihhZHZlcnRpc2luZ19oYW5kbGUsICcwQzowNTowNDowMzowMjowMScpKQotCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9BX0NlcnQnKSkKLQotICAgICAgICBzZWxmLmVucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQnVpbGRlcigKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19oYW5kbGUsIGhjaV9wYWNrZXRzLk9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtnYXBfbmFtZV0pKQotCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLlNIT1JURU5FRF9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9zaG9ydF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fQV9DJykpCi0KLSAgICAgICAgc2VsZi5lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcigKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19oYW5kbGUsIGhjaV9wYWNrZXRzLk9wZXJhdGlvbi5DT01QTEVURV9BRFZFUlRJU0VNRU5ULAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkZyYWdtZW50UHJlZmVyZW5jZS5DT05UUk9MTEVSX1NIT1VMRF9OT1QsIFtnYXBfc2hvcnRfbmFtZV0pKQotCi0gICAgICAgIGVuYWJsZWRfc2V0ID0gaGNpX3BhY2tldHMuRW5hYmxlZFNldCgpCi0gICAgICAgIGVuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZSA9IGFkdmVydGlzaW5nX2hhbmRsZQotICAgICAgICBlbmFibGVkX3NldC5kdXJhdGlvbiA9IDAKLSAgICAgICAgZW5hYmxlZF9zZXQubWF4X2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50cyA9IDAKLSAgICAgICAgc2VsZi5lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5FbmFibGUuRU5BQkxFRCwgW2VuYWJsZWRfc2V0XSkpCi0KLSAgICAgICAgIyBDaGVjayBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gY29tcGxldGUKLSAgICAgICAgc2VsZi5kdXRfbGVfYWNsX21hbmFnZXIuY29tcGxldGVfb3V0Z29pbmdfY29ubmVjdGlvbih0b2tlbikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9oY2kvY2VydC9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX3Rlc3QucHkgYi9nZC9oY2kvY2VydC9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTU2YWQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NlcnQvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gaGNpLmNlcnQubGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0X2xpYiBpbXBvcnQgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0QmFzZQotCi0KLWNsYXNzIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdChHZEJhc2VUZXN0Q2xhc3MsIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnLCBjZXJ0X21vZHVsZT0nSENJJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfdGVzdChzZWxmKQotICAgICAgICBMZUFkdmVydGlzaW5nTWFuYWdlclRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBHZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2NlcnQvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0X2xpYi5weSBiL2dkL2hjaS9jZXJ0L2xlX2FkdmVydGlzaW5nX21hbmFnZXJfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OWE3NjkuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NlcnQvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0X2xpYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC5jbG9zYWJsZSBpbXBvcnQgQ2xvc2FibGUKLWZyb20gY2VydC5jbG9zYWJsZSBpbXBvcnQgc2FmZUNsb3NlCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEFkdmVydGlzaW5nTWF0Y2hlcnMKLWZyb20gY2VydC5weV9oY2kgaW1wb3J0IFB5SGNpCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyIGFzIGNvbW1vbgotZnJvbSBmYWNhZGUgaW1wb3J0IHJvb3RzZXJ2aWNlX3BiMiBhcyBmYWNhZGVfcm9vdHNlcnZpY2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgaGNpX2ZhY2FkZV9wYjIgYXMgaGNpX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBcCi0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlX3BiMiBhcyBsZV9hZHZlcnRpc2luZ19mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlX3BiMiBhcyBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUKLWZyb20gaGNpLmZhY2FkZS5sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZV9wYjIgaW1wb3J0IEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlCi1mcm9tIGhjaS5mYWNhZGUubGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGVfcGIyIGltcG9ydCBBZHZlcnRpc2luZ1N0YXR1cwotCi0KLWNsYXNzIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdEJhc2UoKToKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYsIGNlcnQpOgotICAgICAgICBzZWxmLmNlcnRfaGNpID0gUHlIY2koY2VydCwgYWNsX3N0cmVhbWluZz1UcnVlKQotICAgICAgICBzZWxmLmR1dC5jYWxsYmFja19ldmVudF9zdHJlYW0gPSBFdmVudFN0cmVhbSgKLSAgICAgICAgICAgIHNlbGYuZHV0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLkZldGNoQ2FsbGJhY2tFdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0gICAgICAgIHNlbGYuZHV0LmFkZHJlc3NfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5GZXRjaEFkZHJlc3NFdmVudHMoZW1wdHlfcHJvdG8uRW1wdHkoKSkpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5jbG9zZSgpCi0gICAgICAgIGlmIHNlbGYuZHV0LmNhbGxiYWNrX2V2ZW50X3N0cmVhbSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNhZmVDbG9zZShzZWxmLmR1dC5jYWxsYmFja19ldmVudF9zdHJlYW0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogQ2FsbGJhY2sgRXZlbnQgU3RyZWFtIGlzIE5vbmUhIikKLSAgICAgICAgaWYgc2VsZi5kdXQuYWRkcmVzc19ldmVudF9zdHJlYW0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5kdXQuYWRkcmVzc19ldmVudF9zdHJlYW0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogYWRkcmVzcyBFdmVudCBTdHJlYW0gaXMgTm9uZSEiKQotCi0gICAgZGVmIHNldF9hZGRyZXNzX3BvbGljeV93aXRoX3N0YXRpY19hZGRyZXNzKHNlbGYpOgotICAgICAgICBwcml2YWN5X3BvbGljeSA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3k9bGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLkFkZHJlc3NQb2xpY3kuVVNFX1NUQVRJQ19BRERSRVNTLAotICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGU9Y29tbW9uLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidkMDowNTowNDowMzowMjowMScpKSwKLSAgICAgICAgICAgICAgICB0eXBlPWNvbW1vbi5SQU5ET01fREVWSUNFX0FERFJFU1MpLAotICAgICAgICAgICAgcm90YXRpb25faXJrPWInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcsCi0gICAgICAgICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWU9MCwKLSAgICAgICAgICAgIG1heGltdW1fcm90YXRpb25fdGltZT0wKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MocHJpdmFjeV9wb2xpY3kpCi0KLSAgICBkZWYgY3JlYXRlX2FkdmVydGlzZXIoc2VsZik6Ci0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9UaGVfRFVUJykpCi0gICAgICAgIGdhcF9kYXRhID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkdhcERhdGFNc2coZGF0YT1ieXRlcyhnYXBfbmFtZS5TZXJpYWxpemUoKSkpCi0gICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0NvbmZpZygKLSAgICAgICAgICAgIGFkdmVydGlzZW1lbnQ9W2dhcF9kYXRhXSwKLSAgICAgICAgICAgIGludGVydmFsX21pbj01MTIsCi0gICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfdHlwZT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdFdmVudFR5cGUuQURWX0lORCwKLSAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9Y29tbW9uLlVTRV9SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMpCi0gICAgICAgIHJlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQ3JlYXRlQWR2ZXJ0aXNlclJlcXVlc3QoY29uZmlnPWNvbmZpZykKLSAgICAgICAgY3JlYXRlX3Jlc3BvbnNlID0gc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotICAgICAgICByZXR1cm4gY3JlYXRlX3Jlc3BvbnNlCi0KLSAgICBkZWYgdGVzdF9sZV9hZF9zY2FuX2R1dF9hZHZlcnRpc2VzKHNlbGYpOgotICAgICAgICBzZWxmLnNldF9hZGRyZXNzX3BvbGljeV93aXRoX3N0YXRpY19hZGRyZXNzKCkKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5yZWdpc3Rlcl9mb3JfbGVfZXZlbnRzKGhjaV9wYWNrZXRzLlN1YmV2ZW50Q29kZS5BRFZFUlRJU0lOR19SRVBPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5TdWJldmVudENvZGUuRVhURU5ERURfQURWRVJUSVNJTkdfUkVQT1JUKQotCi0gICAgICAgICMgQ0VSVCBTY2FucwotICAgICAgICBzZWxmLmNlcnRfaGNpLnNlbmRfY29tbWFuZChoY2lfcGFja2V0cy5MZVNldFJhbmRvbUFkZHJlc3NCdWlsZGVyKCcwQzowNTowNDowMzowMjowMScpKQotICAgICAgICBzY2FuX3BhcmFtZXRlcnMgPSBoY2lfcGFja2V0cy5QaHlTY2FuUGFyYW1ldGVycygpCi0gICAgICAgIHNjYW5fcGFyYW1ldGVycy5sZV9zY2FuX3R5cGUgPSBoY2lfcGFja2V0cy5MZVNjYW5UeXBlLkFDVElWRQotICAgICAgICBzY2FuX3BhcmFtZXRlcnMubGVfc2Nhbl9pbnRlcnZhbCA9IDQwCi0gICAgICAgIHNjYW5fcGFyYW1ldGVycy5sZV9zY2FuX3dpbmRvdyA9IDIwCi0gICAgICAgIHNlbGYuY2VydF9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQnVpbGRlcihoY2lfcGFja2V0cy5Pd25BZGRyZXNzVHlwZS5SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlU2Nhbm5pbmdGaWx0ZXJQb2xpY3kuQUNDRVBUX0FMTCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYW5fcGFyYW1ldGVyc10pKQotICAgICAgICBzZWxmLmNlcnRfaGNpLnNlbmRfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlU2V0RXh0ZW5kZWRTY2FuRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5FbmFibGUuRU5BQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5GaWx0ZXJEdXBsaWNhdGVzLkRJU0FCTEVELCAwLCAwKSkKLQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNyZWF0ZV9hZHZlcnRpc2VyKCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9oY2kuZ2V0X2xlX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ0ltX1RoZV9EVVQnIGluIHBhY2tldC5wYXlsb2FkKQotCi0gICAgICAgIHJlbW92ZV9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLlJlbW92ZUFkdmVydGlzZXJSZXF1ZXN0KGFkdmVydGlzZXJfaWQ9Y3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQpCi0gICAgICAgIHNlbGYuZHV0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlJlbW92ZUFkdmVydGlzZXIocmVtb3ZlX3JlcXVlc3QpCi0gICAgICAgIHNlbGYuY2VydF9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRTY2FuRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5FbmFibGUuRElTQUJMRUQsIGhjaV9wYWNrZXRzLkVuYWJsZS5ESVNBQkxFRCkpCi0KLSAgICBkZWYgdGVzdF9leHRlbmRlZF9jcmVhdGVfYWR2ZXJ0aXNlcyhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIHNlbGYuY2VydF9oY2kucmVnaXN0ZXJfZm9yX2xlX2V2ZW50cyhoY2lfcGFja2V0cy5TdWJldmVudENvZGUuQURWRVJUSVNJTkdfUkVQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuU3ViZXZlbnRDb2RlLkVYVEVOREVEX0FEVkVSVElTSU5HX1JFUE9SVCkKLQotICAgICAgICAjIENFUlQgU2NhbnMKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5zZW5kX2NvbW1hbmQoaGNpX3BhY2tldHMuTGVTZXRSYW5kb21BZGRyZXNzQnVpbGRlcignMEM6MDU6MDQ6MDM6MDI6MDEnKSkKLSAgICAgICAgc2Nhbl9wYXJhbWV0ZXJzID0gaGNpX3BhY2tldHMuUGh5U2NhblBhcmFtZXRlcnMoKQotICAgICAgICBzY2FuX3BhcmFtZXRlcnMubGVfc2Nhbl90eXBlID0gaGNpX3BhY2tldHMuTGVTY2FuVHlwZS5BQ1RJVkUKLSAgICAgICAgc2Nhbl9wYXJhbWV0ZXJzLmxlX3NjYW5faW50ZXJ2YWwgPSA0MAotICAgICAgICBzY2FuX3BhcmFtZXRlcnMubGVfc2Nhbl93aW5kb3cgPSAyMAotICAgICAgICBzZWxmLmNlcnRfaGNpLnNlbmRfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkxlU2V0RXh0ZW5kZWRTY2FuUGFyYW1ldGVyc0J1aWxkZXIoaGNpX3BhY2tldHMuT3duQWRkcmVzc1R5cGUuUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNjYW5uaW5nRmlsdGVyUG9saWN5LkFDQ0VQVF9BTEwsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FuX3BhcmFtZXRlcnNdKSkKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5zZW5kX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5MZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXIoaGNpX3BhY2tldHMuRW5hYmxlLkVOQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX3BhY2tldHMuRmlsdGVyRHVwbGljYXRlcy5ESVNBQkxFRCwgMCwgMCkpCi0KLSAgICAgICAgZ2FwX25hbWUgPSBoY2lfcGFja2V0cy5HYXBEYXRhKCkKLSAgICAgICAgZ2FwX25hbWUuZGF0YV90eXBlID0gaGNpX3BhY2tldHMuR2FwRGF0YVR5cGUuQ09NUExFVEVfTE9DQUxfTkFNRQotICAgICAgICBnYXBfbmFtZS5kYXRhID0gbGlzdChieXRlcyhiJ0ltX1RoZV9EVVQnKSkKLSAgICAgICAgZ2FwX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9uYW1lLlNlcmlhbGl6ZSgpKSkKLSAgICAgICAgY29uZmlnID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nQ29uZmlnKAotICAgICAgICAgICAgYWR2ZXJ0aXNlbWVudD1bZ2FwX2RhdGFdLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWluPTUxMiwKLSAgICAgICAgICAgIGludGVydmFsX21heD03NjgsCi0gICAgICAgICAgICBhZHZlcnRpc2luZ190eXBlPWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0V2ZW50VHlwZS5BRFZfSU5ELAotICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZT1jb21tb24uVVNFX1JBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgIGNoYW5uZWxfbWFwPTcsCi0gICAgICAgICAgICBmaWx0ZXJfcG9saWN5PWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0ZpbHRlclBvbGljeS5BTExfREVWSUNFUykKLSAgICAgICAgZXh0ZW5kZWRfY29uZmlnID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcoCi0gICAgICAgICAgICBhZHZlcnRpc2luZ19jb25maWc9Y29uZmlnLAotICAgICAgICAgICAgY29ubmVjdGFibGU9VHJ1ZSwKLSAgICAgICAgICAgIHNjYW5uYWJsZT1GYWxzZSwKLSAgICAgICAgICAgIGRpcmVjdGVkPUZhbHNlLAotICAgICAgICAgICAgaGlnaF9kdXR5X2RpcmVjdGVkX2Nvbm5lY3RhYmxlPUZhbHNlLAotICAgICAgICAgICAgbGVnYWN5X3BkdXM9VHJ1ZSwKLSAgICAgICAgICAgIGFub255bW91cz1GYWxzZSwKLSAgICAgICAgICAgIGluY2x1ZGVfdHhfcG93ZXI9VHJ1ZSwKLSAgICAgICAgICAgIHVzZV9sZV9jb2RlZF9waHk9RmFsc2UsCi0gICAgICAgICAgICBzZWNvbmRhcnlfbWF4X3NraXA9MHgwMCwKLSAgICAgICAgICAgIHNlY29uZGFyeV9hZHZlcnRpc2luZ19waHk9MHgwMSwKLSAgICAgICAgICAgIHNpZD0weDAwLAotICAgICAgICAgICAgZW5hYmxlX3NjYW5fcmVxdWVzdF9ub3RpZmljYXRpb25zPTB4MDApCi0gICAgICAgIHJlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuRXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyUmVxdWVzdChjb25maWc9ZXh0ZW5kZWRfY29uZmlnKQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5FeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIocmVxdWVzdCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9oY2kuZ2V0X2xlX2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhsYW1iZGEgcGFja2V0OiBiJ0ltX1RoZV9EVVQnIGluIHBhY2tldC5wYXlsb2FkKQotCi0gICAgICAgIHJlbW92ZV9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLlJlbW92ZUFkdmVydGlzZXJSZXF1ZXN0KGFkdmVydGlzZXJfaWQ9Y3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQpCi0gICAgICAgIHNlbGYuZHV0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlJlbW92ZUFkdmVydGlzZXIocmVtb3ZlX3JlcXVlc3QpCi0gICAgICAgIHNlbGYuY2VydF9oY2kuc2VuZF9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuTGVTZXRTY2FuRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5FbmFibGUuRElTQUJMRUQsIGhjaV9wYWNrZXRzLkVuYWJsZS5ESVNBQkxFRCkpCi0KLSAgICBkZWYgdGVzdF9hZHZlcnRpc2luZ19zZXRfc3RhcnRlZF9jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY3JlYXRlX2FkdmVydGlzZXIoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0LmNhbGxiYWNrX2V2ZW50X3N0cmVhbSkuZW1pdHMoCi0gICAgICAgICAgICBBZHZlcnRpc2luZ01hdGNoZXJzLkFkdmVydGlzaW5nQ2FsbGJhY2tNc2coQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGUuQURWRVJUSVNJTkdfU0VUX1NUQVJURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQsIEFkdmVydGlzaW5nU3RhdHVzLkFEVl9TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDApKQotCi0gICAgZGVmIHRlc3RfZW5hYmxlX2FkdmVydGlzZXJfY2FsbGJhY2soc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0X2FkZHJlc3NfcG9saWN5X3dpdGhfc3RhdGljX2FkZHJlc3MoKQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNyZWF0ZV9hZHZlcnRpc2VyKCkKLSAgICAgICAgZW5hYmxlX2FkdmVydGlzZXJfcmVxdWVzdCA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5FbmFibGVBZHZlcnRpc2VyUmVxdWVzdCgKLSAgICAgICAgICAgIGFkdmVydGlzZXJfaWQ9Y3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQsIGVuYWJsZT1UcnVlKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5FbmFibGVBZHZlcnRpc2VyKGVuYWJsZV9hZHZlcnRpc2VyX3JlcXVlc3QpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dC5jYWxsYmFja19ldmVudF9zdHJlYW0pLmVtaXRzKAotICAgICAgICAgICAgQWR2ZXJ0aXNpbmdNYXRjaGVycy5BZHZlcnRpc2luZ0NhbGxiYWNrTXNnKEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlLkFEVkVSVElTSU5HX0VOQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQsIEFkdmVydGlzaW5nU3RhdHVzLkFEVl9TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEpKQotCi0gICAgZGVmIHRlc3RfZGlzYWJsZV9hZHZlcnRpc2VyX2NhbGxiYWNrKHNlbGYpOgotICAgICAgICBzZWxmLnNldF9hZGRyZXNzX3BvbGljeV93aXRoX3N0YXRpY19hZGRyZXNzKCkKLSAgICAgICAgY3JlYXRlX3Jlc3BvbnNlID0gc2VsZi5jcmVhdGVfYWR2ZXJ0aXNlcigpCi0gICAgICAgIGRpc2FibGVfYWR2ZXJ0aXNlcl9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkVuYWJsZUFkdmVydGlzZXJSZXF1ZXN0KAotICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZD1jcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCwgZW5hYmxlPUZhbHNlKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5FbmFibGVBZHZlcnRpc2VyKGRpc2FibGVfYWR2ZXJ0aXNlcl9yZXF1ZXN0KQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIEFkdmVydGlzaW5nTWF0Y2hlcnMuQWR2ZXJ0aXNpbmdDYWxsYmFja01zZyhBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZS5BRFZFUlRJU0lOR19FTkFCTEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ1N0YXR1cy5BRFZfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwKSkKLQotICAgIGRlZiB0ZXN0X3NldF9hZHZlcnRpc2luZ19kYXRhX2NhbGxiYWNrKHNlbGYpOgotICAgICAgICBzZWxmLnNldF9hZGRyZXNzX3BvbGljeV93aXRoX3N0YXRpY19hZGRyZXNzKCkKLSAgICAgICAgY3JlYXRlX3Jlc3BvbnNlID0gc2VsZi5jcmVhdGVfYWR2ZXJ0aXNlcigpCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9UaGVfRFVUMicpKQotICAgICAgICBnYXBfZGF0YSA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5HYXBEYXRhTXNnKGRhdGE9Ynl0ZXMoZ2FwX25hbWUuU2VyaWFsaXplKCkpKQotCi0gICAgICAgIHNldF9kYXRhX3JlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuU2V0RGF0YVJlcXVlc3QoCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkPWNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBzZXRfc2Nhbl9yc3A9RmFsc2UsIGRhdGE9W2dhcF9kYXRhXSkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuU2V0RGF0YShzZXRfZGF0YV9yZXF1ZXN0KQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIEFkdmVydGlzaW5nTWF0Y2hlcnMuQWR2ZXJ0aXNpbmdDYWxsYmFja01zZyhBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZS5BRFZFUlRJU0lOR19EQVRBX1NFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCwgQWR2ZXJ0aXNpbmdTdGF0dXMuQURWX1NVQ0NFU1MpKQotCi0gICAgZGVmIHRlc3Rfc2V0X3NjYW5fcmVzcG9uc2VfZGF0YV9jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY3JlYXRlX2FkdmVydGlzZXIoKQotICAgICAgICBnYXBfbmFtZSA9IGhjaV9wYWNrZXRzLkdhcERhdGEoKQotICAgICAgICBnYXBfbmFtZS5kYXRhX3R5cGUgPSBoY2lfcGFja2V0cy5HYXBEYXRhVHlwZS5DT01QTEVURV9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fVGhlX0RVVDInKSkKLSAgICAgICAgZ2FwX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9uYW1lLlNlcmlhbGl6ZSgpKSkKLQotICAgICAgICBzZXRfZGF0YV9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLlNldERhdGFSZXF1ZXN0KAotICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZD1jcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCwgc2V0X3NjYW5fcnNwPVRydWUsIGRhdGE9W2dhcF9kYXRhXSkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuU2V0RGF0YShzZXRfZGF0YV9yZXF1ZXN0KQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIEFkdmVydGlzaW5nTWF0Y2hlcnMuQWR2ZXJ0aXNpbmdDYWxsYmFja01zZyhBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZS5TQ0FOX1JFU1BPTlNFX0RBVEFfU0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ1N0YXR1cy5BRFZfU1VDQ0VTUykpCi0KLSAgICBkZWYgdGVzdF9zZXRfcGFyYW1ldGVyc19jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY3JlYXRlX2FkdmVydGlzZXIoKQotCi0gICAgICAgICMgVGhlIEhvc3Qgc2hhbGwgbm90IGlzc3VlIHNldCBwYXJhbWV0ZXJzIGNvbW1hbmQgd2hlbiBhZHZlcnRpc2luZyBpcyBlbmFibGVkCi0gICAgICAgIGRpc2FibGVfYWR2ZXJ0aXNlcl9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkVuYWJsZUFkdmVydGlzZXJSZXF1ZXN0KAotICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZD1jcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCwgZW5hYmxlPUZhbHNlKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5FbmFibGVBZHZlcnRpc2VyKGRpc2FibGVfYWR2ZXJ0aXNlcl9yZXF1ZXN0KQotCi0gICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0NvbmZpZygKLSAgICAgICAgICAgIGludGVydmFsX21pbj01MTIsCi0gICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfdHlwZT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdFdmVudFR5cGUuQURWX0lORCwKLSAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9Y29tbW9uLlVTRV9SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMpCi0KLSAgICAgICAgc2V0X3BhcmFtZXRlcnNfcmVxdWVzdCA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5TZXRQYXJhbWV0ZXJzUmVxdWVzdCgKLSAgICAgICAgICAgIGFkdmVydGlzZXJfaWQ9Y3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQsIGNvbmZpZz1jb25maWcpCi0gICAgICAgIHNlbGYuZHV0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlNldFBhcmFtZXRlcnMoc2V0X3BhcmFtZXRlcnNfcmVxdWVzdCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0LmNhbGxiYWNrX2V2ZW50X3N0cmVhbSkuZW1pdHMoCi0gICAgICAgICAgICBBZHZlcnRpc2luZ01hdGNoZXJzLkFkdmVydGlzaW5nQ2FsbGJhY2tNc2coQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGUuQURWRVJUSVNJTkdfUEFSQU1FVEVSU19VUERBVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ1N0YXR1cy5BRFZfU1VDQ0VTUykpCi0KLSAgICBkZWYgdGVzdF9zZXRfcGVyaW9kaWNfcGFyYW1ldGVyc19jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY3JlYXRlX2FkdmVydGlzZXIoKQotCi0gICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5QZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycygKLSAgICAgICAgICAgIG1pbl9pbnRlcnZhbD01MTIsCi0gICAgICAgICAgICBtYXhfaW50ZXJ2YWw9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfcHJvcGVydHk9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nUHJvcGVydHkuSU5DTFVERV9UWF9QT1dFUikKLQotICAgICAgICBzZXRfcGVyaW9kaWNfcGFyYW1ldGVyc19yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLlNldFBlcmlvZGljUGFyYW1ldGVyc1JlcXVlc3QoCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkPWNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBjb25maWc9Y29uZmlnKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5TZXRQZXJpb2RpY1BhcmFtZXRlcnMoc2V0X3BlcmlvZGljX3BhcmFtZXRlcnNfcmVxdWVzdCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0LmNhbGxiYWNrX2V2ZW50X3N0cmVhbSkuZW1pdHMoCi0gICAgICAgICAgICBBZHZlcnRpc2luZ01hdGNoZXJzLkFkdmVydGlzaW5nQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGUuUEVSSU9ESUNfQURWRVJUSVNJTkdfUEFSQU1FVEVSU19VUERBVEVELCBjcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCkpCi0KLSAgICBkZWYgdGVzdF9zZXRfcGVyaW9kaWNfZGF0YV9jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY3JlYXRlX2FkdmVydGlzZXIoKQotICAgICAgICBnYXBfbmFtZSA9IGhjaV9wYWNrZXRzLkdhcERhdGEoKQotICAgICAgICBnYXBfbmFtZS5kYXRhX3R5cGUgPSBoY2lfcGFja2V0cy5HYXBEYXRhVHlwZS5DT01QTEVURV9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fVGhlX0RVVDInKSkKLSAgICAgICAgZ2FwX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9uYW1lLlNlcmlhbGl6ZSgpKSkKLQotICAgICAgICBzZXRfcGVyaW9kaWNfZGF0YV9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLlNldFBlcmlvZGljRGF0YVJlcXVlc3QoCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkPWNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBkYXRhPVtnYXBfZGF0YV0pCi0gICAgICAgIHNlbGYuZHV0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlNldFBlcmlvZGljRGF0YShzZXRfcGVyaW9kaWNfZGF0YV9yZXF1ZXN0KQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIEFkdmVydGlzaW5nTWF0Y2hlcnMuQWR2ZXJ0aXNpbmdDYWxsYmFja01zZyhBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZS5QRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBX1NFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCkpCi0KLSAgICBkZWYgdGVzdF9lbmFibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfY2FsbGJhY2soc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0X2FkZHJlc3NfcG9saWN5X3dpdGhfc3RhdGljX2FkZHJlc3MoKQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNyZWF0ZV9hZHZlcnRpc2VyKCkKLSAgICAgICAgZW5hYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3JlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuRW5hYmxlUGVyaW9kaWNBZHZlcnRpc2luZ1JlcXVlc3QoCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkPWNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkLCBlbmFibGU9VHJ1ZSkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuRW5hYmxlUGVyaW9kaWNBZHZlcnRpc2luZyhlbmFibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfcmVxdWVzdCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0LmNhbGxiYWNrX2V2ZW50X3N0cmVhbSkuZW1pdHMoCi0gICAgICAgICAgICBBZHZlcnRpc2luZ01hdGNoZXJzLkFkdmVydGlzaW5nQ2FsbGJhY2tNc2coQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGUuUEVSSU9ESUNfQURWRVJUSVNJTkdfRU5BQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCkpCi0KLSAgICBkZWYgdGVzdF9nZXRfb3duX2FkZHJlc3Moc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0X2FkZHJlc3NfcG9saWN5X3dpdGhfc3RhdGljX2FkZHJlc3MoKQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNyZWF0ZV9hZHZlcnRpc2VyKCkKLSAgICAgICAgZ2V0X293bl9hZGRyZXNzX3JlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2V0T3duQWRkcmVzc1JlcXVlc3QoCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkPWNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5HZXRPd25BZGRyZXNzKGdldF9vd25fYWRkcmVzc19yZXF1ZXN0KQotICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZSA9IGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidkMDowNTowNDowMzowMjowMScpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0LmFkZHJlc3NfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIEFkdmVydGlzaW5nTWF0Y2hlcnMuQWRkcmVzc01zZyhBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZS5PV05fQUREUkVTU19SRUFELCBjcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZSkpCmRpZmYgLS1naXQgYS9nZC9oY2kvY2VydC9sZV9leHRlbmRlZF9jb25maWcuanNvbiBiL2dkL2hjaS9jZXJ0L2xlX2V4dGVuZGVkX2NvbmZpZy5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTgxYzBhLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2xlX2V4dGVuZGVkX2NvbmZpZy5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi17Ci0gICAgInN1cHBvcnRlZF9jb21tYW5kcyIgOiBbImIzIiwgImZmIiwgImVmIiwgIjAxIiwgImNlIiwgImZkIiwgIjgxIiwgImZmIiwgIjNmIiwgIjBmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDAiLCAiMWUiLCAiZjAiLCAiMDMiLCAiZTgiLCAiMDIiLCAiMDMiLCAiZDYiLCAiODEiLCAiOWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxYyIsICIwMCIsICIwMCIsICIwMCIsICI0MCIsICJmNyIsICJmZiIsICJhNyIsICIwZiIsICIyMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAwIiwgIjAwIiwgIjRhIiwgIjgwIiwgIjc4IiwgImZmIiwgImZmIiwgImZmIiwgIjAwIiwgIjAwIixdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2NlcnQvbGVfbGVnYWN5X2NvbmZpZy5qc29uIGIvZ2QvaGNpL2NlcnQvbGVfbGVnYWN5X2NvbmZpZy5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGU5Yzk1Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2xlX2xlZ2FjeV9jb25maWcuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotewotICAgICJzdXBwb3J0ZWRfY29tbWFuZHMiIDogWyJiMyIsICJmZiIsICJlZiIsICIwMSIsICJjZSIsICJmZCIsICI4MSIsICJmZiIsICIzZiIsICIwZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwIiwgIjFlIiwgImYwIiwgIjAzIiwgImU4IiwgIjAyIiwgIjAzIiwgImQ2IiwgIjgxIiwgIjlmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMWMiLCAiMDAiLCAiMDAiLCAiMDAiLCAiNDAiLCAiZjciLCAiZmYiLCAiYTciLCAiMGYiLCAiMjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMCIsICIwMCIsICI0YSIsICI4MCIsICI3OCIsICIwZSIsICIwMCIsICIwMCIsICIwMCIsICIwMCIsXSwKLX0KZGlmZiAtLWdpdCBhL2dkL2hjaS9jZXJ0L2xlX3NjYW5uaW5nX21hbmFnZXJfdGVzdC5weSBiL2dkL2hjaS9jZXJ0L2xlX3NjYW5uaW5nX21hbmFnZXJfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5YjIyZi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY2VydC9sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gY2VydC5nZF9iYXNlX3Rlc3QgaW1wb3J0IEdkQmFzZVRlc3RDbGFzcwotZnJvbSBoY2kuY2VydC5sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3RfbGliIGltcG9ydCBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlCi0KLQotY2xhc3MgTGVTY2FubmluZ01hbmFnZXJUZXN0KEdkQmFzZVRlc3RDbGFzcywgTGVTY2FubmluZ01hbmFnZXJUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycsIGNlcnRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldF9jb250cm9sbGVyX3Byb3BlcnRpZXNfcGF0aChzZWxmLCAnaGNpL2NlcnQvbGVfbGVnYWN5X2NvbmZpZy5qc29uJykKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVTY2FubmluZ01hbmFnZXJUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotCi1jbGFzcyBMZUV4dGVuZGVkU2Nhbm5pbmdNYW5hZ2VyVGVzdChHZEJhc2VUZXN0Q2xhc3MsIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnLCBjZXJ0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXRfY29udHJvbGxlcl9wcm9wZXJ0aWVzX3BhdGgoc2VsZiwgJ2hjaS9jZXJ0L2xlX2V4dGVuZGVkX2NvbmZpZy5qc29uJykKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVTY2FubmluZ01hbmFnZXJUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9oY2kvY2VydC9sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3RfbGliLnB5IGIvZ2QvaGNpL2NlcnQvbGVfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmODMwNy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY2VydC9sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi1pbXBvcnQgbG9nZ2luZwotCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IHNhZmVDbG9zZQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgU2Nhbm5pbmdNYXRjaGVycwotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gZmFjYWRlIGltcG9ydCByb290c2VydmljZV9wYjIgYXMgZmFjYWRlX3Jvb3RzZXJ2aWNlCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGhjaV9mYWNhZGVfcGIyIGFzIGhjaV9mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGVfcGIyIGFzIGxlX3NjYW5uaW5nX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZV9wYjIgYXMgbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZV9wYjIgYXMgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUubGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGVfcGIyIGltcG9ydCBTY2FubmluZ0NhbGxiYWNrTXNnVHlwZQotZnJvbSBoY2kuZmFjYWRlLmxlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlX3BiMiBpbXBvcnQgU2Nhbm5pbmdTdGF0dXMKLQotCi1jbGFzcyBMZVNjYW5uaW5nTWFuYWdlclRlc3RCYXNlKCk6Ci0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmLCBjZXJ0KToKLSAgICAgICAgc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLmR1dC5oY2lfbGVfc2Nhbm5pbmdfbWFuYWdlci5GZXRjaENhbGxiYWNrRXZlbnRzKGVtcHR5X3Byb3RvLkVtcHR5KCkpKQotICAgICAgICBzZWxmLmR1dC5hZHZlcnRpc2luZ19yZXBvcnRfc3RyZWFtID0gRXZlbnRTdHJlYW0oCi0gICAgICAgICAgICBzZWxmLmR1dC5oY2lfbGVfc2Nhbm5pbmdfbWFuYWdlci5GZXRjaEFkdmVydGlzaW5nUmVwb3J0cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBpZiBzZWxmLmR1dC5jYWxsYmFja19ldmVudF9zdHJlYW0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJEVVQ6IENhbGxiYWNrIEV2ZW50IFN0cmVhbSBpcyBOb25lISIpCi0gICAgICAgIGlmIHNlbGYuZHV0LmFkdmVydGlzaW5nX3JlcG9ydF9zdHJlYW0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5kdXQuYWR2ZXJ0aXNpbmdfcmVwb3J0X3N0cmVhbSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUOiBBZHZlcnRpc2luZyBSZXBvcnQgU3RyZWFtIGlzIE5vbmUhIikKLQotICAgIGRlZiByZWdpc3Rlcl9mb3JfZXZlbnQoc2VsZiwgZXZlbnRfY29kZSk6Ci0gICAgICAgIG1zZyA9IGhjaV9mYWNhZGUuRXZlbnRDb2RlTXNnKGNvZGU9aW50KGV2ZW50X2NvZGUpKQotICAgICAgICBzZWxmLmNlcnQuaGNpLlJlZ2lzdGVyRXZlbnRIYW5kbGVyKG1zZykKLQotICAgIGRlZiByZWdpc3Rlcl9mb3JfbGVfZXZlbnQoc2VsZiwgZXZlbnRfY29kZSk6Ci0gICAgICAgIG1zZyA9IGhjaV9mYWNhZGUuTGVTdWJldmVudENvZGVNc2coY29kZT1pbnQoZXZlbnRfY29kZSkpCi0gICAgICAgIHNlbGYuY2VydC5oY2kuUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihtc2cpCi0KLSAgICBkZWYgZW5xdWV1ZV9oY2lfY29tbWFuZChzZWxmLCBjb21tYW5kLCBleHBlY3RfY29tcGxldGUpOgotICAgICAgICBjbWRfYnl0ZXMgPSBieXRlcyhjb21tYW5kLlNlcmlhbGl6ZSgpKQotICAgICAgICBjbWQgPSBjb21tb24uRGF0YShwYXlsb2FkPWNtZF9ieXRlcykKLSAgICAgICAgaWYgKGV4cGVjdF9jb21wbGV0ZSk6Ci0gICAgICAgICAgICBzZWxmLmNlcnQuaGNpLkVucXVldWVDb21tYW5kV2l0aENvbXBsZXRlKGNtZCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuY2VydC5oY2kuRW5xdWV1ZUNvbW1hbmRXaXRoU3RhdHVzKGNtZCkKLQotICAgIGRlZiBzZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcyhzZWxmKToKLSAgICAgICAgcHJpdmFjeV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcyhhZGRyZXNzPWJ5dGVzKGInRDA6MDU6MDQ6MDM6MDI6MDEnKSksCi0gICAgICAgICAgICAgICAgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKSwKLSAgICAgICAgICAgIHJvdGF0aW9uX2lyaz1iJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnLAotICAgICAgICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lPTAsCi0gICAgICAgICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWU9MCkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX2luaXRpYXRvcl9hZGRyZXNzLlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKHByaXZhY3lfcG9saWN5KQotICAgICAgICBjZXJ0X3ByaXZhY3lfcG9saWN5ID0gbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLlByaXZhY3lQb2xpY3koCi0gICAgICAgICAgICBhZGRyZXNzX3BvbGljeT1sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuQWRkcmVzc1BvbGljeS5VU0VfU1RBVElDX0FERFJFU1MsCi0gICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZT1jb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcyhiJ0MwOjA1OjA0OjAzOjAyOjAxJykpLAotICAgICAgICAgICAgICAgIHR5cGU9Y29tbW9uLlJBTkRPTV9ERVZJQ0VfQUREUkVTUyksCi0gICAgICAgICAgICByb3RhdGlvbl9pcms9YidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJywKLSAgICAgICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZT0wLAotICAgICAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lPTApCi0gICAgICAgIHNlbGYuY2VydC5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoY2VydF9wcml2YWN5X3BvbGljeSkKLQotICAgIGRlZiB0ZXN0X2xlX2FkX3NjYW5fZHV0X3NjYW5zKHNlbGYpOgotICAgICAgICBzZWxmLnNldF9hZGRyZXNzX3BvbGljeV93aXRoX3N0YXRpY19hZGRyZXNzKCkKLSAgICAgICAgIyBDRVJUIEFkdmVydGlzZXMKLSAgICAgICAgZ2FwX25hbWUgPSBoY2lfcGFja2V0cy5HYXBEYXRhKCkKLSAgICAgICAgZ2FwX25hbWUuZGF0YV90eXBlID0gaGNpX3BhY2tldHMuR2FwRGF0YVR5cGUuQ09NUExFVEVfTE9DQUxfTkFNRQotICAgICAgICBnYXBfbmFtZS5kYXRhID0gbGlzdChieXRlcyhiJ0ltX1RoZV9DRVJUIScpKQotICAgICAgICBnYXBfZGF0YSA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5HYXBEYXRhTXNnKGRhdGE9Ynl0ZXMoZ2FwX25hbWUuU2VyaWFsaXplKCkpKQotICAgICAgICBnYXBfc2Nhbl9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9zY2FuX25hbWUuZGF0YV90eXBlID0gaGNpX3BhY2tldHMuR2FwRGF0YVR5cGUuU0hPUlRFTkVEX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX3NjYW5fbmFtZS5kYXRhID0gbGlzdChieXRlcyhiJ0NFUlQhJykpCi0gICAgICAgIGdhcF9zY2FuX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9zY2FuX25hbWUuU2VyaWFsaXplKCkpKQotICAgICAgICBjb25maWcgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdDb25maWcoCi0gICAgICAgICAgICBhZHZlcnRpc2VtZW50PVtnYXBfZGF0YV0sCi0gICAgICAgICAgICBzY2FuX3Jlc3BvbnNlPVtnYXBfc2Nhbl9kYXRhXSwKLSAgICAgICAgICAgIGludGVydmFsX21pbj01MTIsCi0gICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfdHlwZT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdFdmVudFR5cGUuQURWX0lORCwKLSAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9Y29tbW9uLlVTRV9SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMpCi0gICAgICAgIHJlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQ3JlYXRlQWR2ZXJ0aXNlclJlcXVlc3QoY29uZmlnPWNvbmZpZykKLQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNlcnQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotCi0gICAgICAgIHNjYW5fcmVxdWVzdCA9IGxlX3NjYW5uaW5nX2ZhY2FkZS5TY2FuUmVxdWVzdChzdGFydD1UcnVlKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfc2Nhbm5pbmdfbWFuYWdlci5TY2FuKHNjYW5fcmVxdWVzdCkKLQotICAgICAgICBzZWxmLmR1dC5hZHZlcnRpc2luZ19yZXBvcnRfc3RyZWFtLmFzc2VydF9ldmVudF9vY2N1cnMobGFtYmRhIHBhY2tldDogYidJbV9UaGVfQ0VSVCcgaW4gcGFja2V0LmV2ZW50KQotCi0gICAgICAgIHJlbW92ZV9yZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLlJlbW92ZUFkdmVydGlzZXJSZXF1ZXN0KGFkdmVydGlzZXJfaWQ9Y3JlYXRlX3Jlc3BvbnNlLmFkdmVydGlzZXJfaWQpCi0gICAgICAgIHNlbGYuY2VydC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5SZW1vdmVBZHZlcnRpc2VyKHJlbW92ZV9yZXF1ZXN0KQotCi0gICAgZGVmIHRlc3RfcmVnaXN0ZXJfc2Nhbm5lcl9jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIHJlZ2lzdGVyX3JlcXVlc3QgPSBsZV9zY2FubmluZ19mYWNhZGUuUmVnaXN0ZXJTY2FubmVyUmVxdWVzdCh1dWlkPTEyMykKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIuUmVnaXN0ZXJTY2FubmVyKHJlZ2lzdGVyX3JlcXVlc3QpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIFNjYW5uaW5nTWF0Y2hlcnMuU2Nhbm5pbmdDYWxsYmFja01zZyhTY2FubmluZ0NhbGxiYWNrTXNnVHlwZS5TQ0FOTkVSX1JFR0lTVEVSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nhbm5pbmdTdGF0dXMuU0NBTl9TVUNDRVNTLCAxMjMpKQotCi0gICAgZGVmIHRlc3RfcmVnaXN0ZXJfc2Nhbm5lcl93aXRoX3NhbWVfdXVpZChzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIHJlZ2lzdGVyX3JlcXVlc3QgPSBsZV9zY2FubmluZ19mYWNhZGUuUmVnaXN0ZXJTY2FubmVyUmVxdWVzdCh1dWlkPTEyMykKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIuUmVnaXN0ZXJTY2FubmVyKHJlZ2lzdGVyX3JlcXVlc3QpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIFNjYW5uaW5nTWF0Y2hlcnMuU2Nhbm5pbmdDYWxsYmFja01zZyhTY2FubmluZ0NhbGxiYWNrTXNnVHlwZS5TQ0FOTkVSX1JFR0lTVEVSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nhbm5pbmdTdGF0dXMuU0NBTl9TVUNDRVNTLCAxMjMpKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfc2Nhbm5pbmdfbWFuYWdlci5SZWdpc3RlclNjYW5uZXIocmVnaXN0ZXJfcmVxdWVzdCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dC5jYWxsYmFja19ldmVudF9zdHJlYW0pLmVtaXRzKAotICAgICAgICAgICAgU2Nhbm5pbmdNYXRjaGVycy5TY2FubmluZ0NhbGxiYWNrTXNnKFNjYW5uaW5nQ2FsbGJhY2tNc2dUeXBlLlNDQU5ORVJfUkVHSVNURVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FubmluZ1N0YXR1cy5TQ0FOX0lOVEVSTkFMX0VSUk9SLCAxMjMpKQotCi0gICAgZGVmIHRlc3Rfc2V0X3NjYW5fcGFyYW1ldGVyc19jYWxsYmFjayhzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIHNldF9zY2FuX3BhcmFtZXRlcnNfcmVxdWVzdCA9IGxlX3NjYW5uaW5nX2ZhY2FkZS5TZXRTY2FuUGFyYW1ldGVyc1JlcXVlc3QoCi0gICAgICAgICAgICBzY2FubmVyX2lkPTB4MDEsIHNjYW5fdHlwZT1sZV9zY2FubmluZ19mYWNhZGUuTGVTY2FuVHlwZS5BQ1RJVkUsIHNjYW5faW50ZXJ2YWw9MHgxMCwgc2Nhbl93aW5kb3c9MHgwNCkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIuU2V0U2NhblBhcmFtZXRlcnMoc2V0X3NjYW5fcGFyYW1ldGVyc19yZXF1ZXN0KQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIFNjYW5uaW5nTWF0Y2hlcnMuU2Nhbm5pbmdDYWxsYmFja01zZyhTY2FubmluZ0NhbGxiYWNrTXNnVHlwZS5TRVRfU0NBTk5FUl9QQVJBTUVURVJfQ09NUExFVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nhbm5pbmdTdGF0dXMuU0NBTl9TVUNDRVNTLCAweDAxKSkKLQotICAgIGRlZiB0ZXN0X3NldF9zY2FuX3BhcmFtZXRlcnNfd2l0aF9pbnZhbGlkX3BhcmFtZXRlcihzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgIHNldF9zY2FuX3BhcmFtZXRlcnNfcmVxdWVzdCA9IGxlX3NjYW5uaW5nX2ZhY2FkZS5TZXRTY2FuUGFyYW1ldGVyc1JlcXVlc3QoCi0gICAgICAgICAgICBzY2FubmVyX2lkPTB4MDEsIHNjYW5fdHlwZT1sZV9zY2FubmluZ19mYWNhZGUuTGVTY2FuVHlwZS5BQ1RJVkUsIHNjYW5faW50ZXJ2YWw9MHgwMCwgc2Nhbl93aW5kb3c9MHgwMCkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIuU2V0U2NhblBhcmFtZXRlcnMoc2V0X3NjYW5fcGFyYW1ldGVyc19yZXF1ZXN0KQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXQuY2FsbGJhY2tfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIFNjYW5uaW5nTWF0Y2hlcnMuU2Nhbm5pbmdDYWxsYmFja01zZyhTY2FubmluZ0NhbGxiYWNrTXNnVHlwZS5TRVRfU0NBTk5FUl9QQVJBTUVURVJfQ09NUExFVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nhbm5pbmdTdGF0dXMuU0NBTl9JTExFR0FMX1BBUkFNRVRFUikpCi0KLSAgICBkZWYgdGVzdF9hY3RpdmVfc2NhbihzZWxmKToKLSAgICAgICAgc2VsZi5zZXRfYWRkcmVzc19wb2xpY3lfd2l0aF9zdGF0aWNfYWRkcmVzcygpCi0gICAgICAgICMgQ0VSVCBBZHZlcnRpc2VzCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidTY2FuIHJlc3BvbnNlIGRhdGEnKSkKLSAgICAgICAgZ2FwX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9uYW1lLlNlcmlhbGl6ZSgpKSkKLSAgICAgICAgY29uZmlnID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nQ29uZmlnKAotICAgICAgICAgICAgc2Nhbl9yZXNwb25zZT1bZ2FwX2RhdGFdLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWluPTUxMiwKLSAgICAgICAgICAgIGludGVydmFsX21heD03NjgsCi0gICAgICAgICAgICBhZHZlcnRpc2luZ190eXBlPWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0V2ZW50VHlwZS5BRFZfSU5ELAotICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZT1jb21tb24uVVNFX1JBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgIGNoYW5uZWxfbWFwPTcsCi0gICAgICAgICAgICBmaWx0ZXJfcG9saWN5PWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0ZpbHRlclBvbGljeS5BTExfREVWSUNFUykKLSAgICAgICAgcmVxdWVzdCA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5DcmVhdGVBZHZlcnRpc2VyUmVxdWVzdChjb25maWc9Y29uZmlnKQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNlcnQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotCi0gICAgICAgIHNldF9zY2FuX3BhcmFtZXRlcnNfcmVxdWVzdCA9IGxlX3NjYW5uaW5nX2ZhY2FkZS5TZXRTY2FuUGFyYW1ldGVyc1JlcXVlc3QoCi0gICAgICAgICAgICBzY2FubmVyX2lkPTB4MDEsIHNjYW5fdHlwZT1sZV9zY2FubmluZ19mYWNhZGUuTGVTY2FuVHlwZS5BQ1RJVkUsIHNjYW5faW50ZXJ2YWw9MHgxMCwgc2Nhbl93aW5kb3c9MHgwNCkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIuU2V0U2NhblBhcmFtZXRlcnMoc2V0X3NjYW5fcGFyYW1ldGVyc19yZXF1ZXN0KQotICAgICAgICBzY2FuX3JlcXVlc3QgPSBsZV9zY2FubmluZ19mYWNhZGUuU2NhblJlcXVlc3Qoc3RhcnQ9VHJ1ZSkKLSAgICAgICAgc2VsZi5kdXQuaGNpX2xlX3NjYW5uaW5nX21hbmFnZXIuU2NhbihzY2FuX3JlcXVlc3QpCi0KLSAgICAgICAgc2VsZi5kdXQuYWR2ZXJ0aXNpbmdfcmVwb3J0X3N0cmVhbS5hc3NlcnRfZXZlbnRfb2NjdXJzKGxhbWJkYSBwYWNrZXQ6IGInU2NhbiByZXNwb25zZSBkYXRhJyBpbiBwYWNrZXQuZXZlbnQpCi0KLSAgICAgICAgcmVtb3ZlX3JlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuUmVtb3ZlQWR2ZXJ0aXNlclJlcXVlc3QoYWR2ZXJ0aXNlcl9pZD1jcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCkKLSAgICAgICAgc2VsZi5jZXJ0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlJlbW92ZUFkdmVydGlzZXIocmVtb3ZlX3JlcXVlc3QpCi0KLSAgICBkZWYgdGVzdF9wYXNzaXZlX3NjYW4oc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0X2FkZHJlc3NfcG9saWN5X3dpdGhfc3RhdGljX2FkZHJlc3MoKQotICAgICAgICAjIENFUlQgQWR2ZXJ0aXNlcwotICAgICAgICBnYXBfbmFtZSA9IGhjaV9wYWNrZXRzLkdhcERhdGEoKQotICAgICAgICBnYXBfbmFtZS5kYXRhX3R5cGUgPSBoY2lfcGFja2V0cy5HYXBEYXRhVHlwZS5DT01QTEVURV9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInU2NhbiByZXNwb25zZSBkYXRhJykpCi0gICAgICAgIGdhcF9kYXRhID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkdhcERhdGFNc2coZGF0YT1ieXRlcyhnYXBfbmFtZS5TZXJpYWxpemUoKSkpCi0gICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0NvbmZpZygKLSAgICAgICAgICAgIHNjYW5fcmVzcG9uc2U9W2dhcF9kYXRhXSwKLSAgICAgICAgICAgIGludGVydmFsX21pbj01MTIsCi0gICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfdHlwZT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdFdmVudFR5cGUuQURWX0lORCwKLSAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9Y29tbW9uLlVTRV9SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMpCi0gICAgICAgIHJlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQ3JlYXRlQWR2ZXJ0aXNlclJlcXVlc3QoY29uZmlnPWNvbmZpZykKLSAgICAgICAgY3JlYXRlX3Jlc3BvbnNlID0gc2VsZi5jZXJ0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLkNyZWF0ZUFkdmVydGlzZXIocmVxdWVzdCkKLQotICAgICAgICBzZXRfc2Nhbl9wYXJhbWV0ZXJzX3JlcXVlc3QgPSBsZV9zY2FubmluZ19mYWNhZGUuU2V0U2NhblBhcmFtZXRlcnNSZXF1ZXN0KAotICAgICAgICAgICAgc2Nhbm5lcl9pZD0weDAxLCBzY2FuX3R5cGU9bGVfc2Nhbm5pbmdfZmFjYWRlLkxlU2NhblR5cGUuUEFTU0lWRSwgc2Nhbl9pbnRlcnZhbD0weDEwLCBzY2FuX3dpbmRvdz0weDA0KQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfc2Nhbm5pbmdfbWFuYWdlci5TZXRTY2FuUGFyYW1ldGVycyhzZXRfc2Nhbl9wYXJhbWV0ZXJzX3JlcXVlc3QpCi0gICAgICAgIHNjYW5fcmVxdWVzdCA9IGxlX3NjYW5uaW5nX2ZhY2FkZS5TY2FuUmVxdWVzdChzdGFydD1UcnVlKQotICAgICAgICBzZWxmLmR1dC5oY2lfbGVfc2Nhbm5pbmdfbWFuYWdlci5TY2FuKHNjYW5fcmVxdWVzdCkKLQotICAgICAgICBzZWxmLmR1dC5hZHZlcnRpc2luZ19yZXBvcnRfc3RyZWFtLmFzc2VydF9ldmVudF9vY2N1cnNfYXRfbW9zdCgKLSAgICAgICAgICAgIGxhbWJkYSBwYWNrZXQ6IGInU2NhbiByZXNwb25zZSBkYXRhJyBpbiBwYWNrZXQuZXZlbnQsIDApCi0KLSAgICAgICAgcmVtb3ZlX3JlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuUmVtb3ZlQWR2ZXJ0aXNlclJlcXVlc3QoYWR2ZXJ0aXNlcl9pZD1jcmVhdGVfcmVzcG9uc2UuYWR2ZXJ0aXNlcl9pZCkKLSAgICAgICAgc2VsZi5jZXJ0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlJlbW92ZUFkdmVydGlzZXIocmVtb3ZlX3JlcXVlc3QpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2NlcnQvbGVfc2Nhbm5pbmdfd2l0aF9zZWN1cml0eV90ZXN0LnB5IGIvZ2QvaGNpL2NlcnQvbGVfc2Nhbm5pbmdfd2l0aF9zZWN1cml0eV90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWUxY2YyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2xlX3NjYW5uaW5nX3dpdGhfc2VjdXJpdHlfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIGhjaS5jZXJ0LmxlX3NjYW5uaW5nX3dpdGhfc2VjdXJpdHlfdGVzdF9saWIgaW1wb3J0IExlU2Nhbm5pbmdXaXRoU2VjdXJpdHlUZXN0QmFzZQotCi0KLWNsYXNzIExlU2Nhbm5pbmdXaXRoU2VjdXJpdHlUZXN0KEdkQmFzZVRlc3RDbGFzcywgTGVTY2FubmluZ1dpdGhTZWN1cml0eVRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J1NFQ1VSSVRZJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKZGlmZiAtLWdpdCBhL2dkL2hjaS9jZXJ0L2xlX3NjYW5uaW5nX3dpdGhfc2VjdXJpdHlfdGVzdF9saWIucHkgYi9nZC9oY2kvY2VydC9sZV9zY2FubmluZ193aXRoX3NlY3VyaXR5X3Rlc3RfbGliLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVmM2MwLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jZXJ0L2xlX3NjYW5uaW5nX3dpdGhfc2VjdXJpdHlfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgaGNpX2ZhY2FkZV9wYjIgYXMgaGNpX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZV9wYjIgYXMgbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZV9wYjIgYXMgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlX3BiMiBhcyBsZV9zY2FubmluZ19mYWNhZGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgaGNpX3BhY2tldHMKLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyIGFzIGNvbW1vbgotCi0KLWNsYXNzIExlU2Nhbm5pbmdXaXRoU2VjdXJpdHlUZXN0QmFzZSgpOgotCi0gICAgZGVmIHJlZ2lzdGVyX2Zvcl9ldmVudChzZWxmLCBldmVudF9jb2RlKToKLSAgICAgICAgbXNnID0gaGNpX2ZhY2FkZS5FdmVudENvZGVNc2coY29kZT1pbnQoZXZlbnRfY29kZSkpCi0gICAgICAgIHNlbGYuY2VydC5oY2kuUmVnaXN0ZXJFdmVudEhhbmRsZXIobXNnKQotCi0gICAgZGVmIHJlZ2lzdGVyX2Zvcl9sZV9ldmVudChzZWxmLCBldmVudF9jb2RlKToKLSAgICAgICAgbXNnID0gaGNpX2ZhY2FkZS5MZVN1YmV2ZW50Q29kZU1zZyhjb2RlPWludChldmVudF9jb2RlKSkKLSAgICAgICAgc2VsZi5jZXJ0LmhjaS5SZWdpc3RlckxlRXZlbnRIYW5kbGVyKG1zZykKLQotICAgIGRlZiBlbnF1ZXVlX2hjaV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIGV4cGVjdF9jb21wbGV0ZSk6Ci0gICAgICAgIGNtZF9ieXRlcyA9IGJ5dGVzKGNvbW1hbmQuU2VyaWFsaXplKCkpCi0gICAgICAgIGNtZCA9IGNvbW1vbi5EYXRhKGNvbW1hbmQ9Y21kX2J5dGVzKQotICAgICAgICBpZiAoZXhwZWN0X2NvbXBsZXRlKToKLSAgICAgICAgICAgIHNlbGYuY2VydC5oY2kuRW5xdWV1ZUNvbW1hbmRXaXRoQ29tcGxldGUoY21kKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5jZXJ0LmhjaS5FbnF1ZXVlQ29tbWFuZFdpdGhTdGF0dXMoY21kKQotCi0gICAgZGVmIHRlc3RfbGVfYWRfc2Nhbl9kdXRfc2NhbnMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBhZGRyZXNzIHBvbGljeSBpcyBjb3JyZWN0bHkgaW5pdGlhdGVkIGJ5IFNlY3VyaXR5TWFuYWdlciwgYW5kIHdlIGNhbiBzdGFydCBhIHNjYW4uCi0gICAgICAgICIiIgotICAgICAgICBjZXJ0X3ByaXZhY3lfcG9saWN5ID0gbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLlByaXZhY3lQb2xpY3koCi0gICAgICAgICAgICBhZGRyZXNzX3BvbGljeT1sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuQWRkcmVzc1BvbGljeS5VU0VfU1RBVElDX0FERFJFU1MsCi0gICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZT1jb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcyhiJ0MwOjA1OjA0OjAzOjAyOjAxJykpLAotICAgICAgICAgICAgICAgIHR5cGU9Y29tbW9uLlJBTkRPTV9ERVZJQ0VfQUREUkVTUyksCi0gICAgICAgICAgICByb3RhdGlvbl9pcms9YidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJywKLSAgICAgICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZT0wLAotICAgICAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lPTApCi0gICAgICAgIHNlbGYuY2VydC5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoY2VydF9wcml2YWN5X3BvbGljeSkKLSAgICAgICAgd2l0aCBFdmVudFN0cmVhbSgKLSAgICAgICAgICAgICAgICAjIERVVCBTY2FucwotICAgICAgICAgICAgICAgIHNlbGYuZHV0LmhjaV9sZV9zY2FubmluZ19tYW5hZ2VyLkZldGNoQWR2ZXJ0aXNpbmdSZXBvcnRzKAotICAgICAgICAgICAgICAgICAgICBlbXB0eV9wcm90by5FbXB0eSgpKSkgYXMgYWR2ZXJ0aXNpbmdfZXZlbnRfc3RyZWFtOgotCi0gICAgICAgICAgICAjIENFUlQgQWR2ZXJ0aXNlcwotICAgICAgICAgICAgZ2FwX25hbWUgPSBoY2lfcGFja2V0cy5HYXBEYXRhKCkKLSAgICAgICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fVGhlX0NFUlQhJykpCi0gICAgICAgICAgICBnYXBfZGF0YSA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5HYXBEYXRhTXNnKGRhdGE9Ynl0ZXMoZ2FwX25hbWUuU2VyaWFsaXplKCkpKQotICAgICAgICAgICAgZ2FwX3NjYW5fbmFtZSA9IGhjaV9wYWNrZXRzLkdhcERhdGEoKQotICAgICAgICAgICAgZ2FwX3NjYW5fbmFtZS5kYXRhX3R5cGUgPSBoY2lfcGFja2V0cy5HYXBEYXRhVHlwZS5TSE9SVEVORURfTE9DQUxfTkFNRQotICAgICAgICAgICAgZ2FwX3NjYW5fbmFtZS5kYXRhID0gbGlzdChieXRlcyhiJ0NFUlQhJykpCi0gICAgICAgICAgICBnYXBfc2Nhbl9kYXRhID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkdhcERhdGFNc2coZGF0YT1ieXRlcyhnYXBfc2Nhbl9uYW1lLlNlcmlhbGl6ZSgpKSkKLSAgICAgICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0NvbmZpZygKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2VtZW50PVtnYXBfZGF0YV0sCi0gICAgICAgICAgICAgICAgc2Nhbl9yZXNwb25zZT1bZ2FwX3NjYW5fZGF0YV0sCi0gICAgICAgICAgICAgICAgaW50ZXJ2YWxfbWluPTUxMiwKLSAgICAgICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX3R5cGU9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRXZlbnRUeXBlLkFEVl9JTkQsCi0gICAgICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZT1jb21tb24uVVNFX1JBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgICAgIGZpbHRlcl9wb2xpY3k9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTKQotICAgICAgICAgICAgcmVxdWVzdCA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5DcmVhdGVBZHZlcnRpc2VyUmVxdWVzdChjb25maWc9Y29uZmlnKQotCi0gICAgICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmNlcnQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotCi0gICAgICAgICAgICBzY2FuX3JlcXVlc3QgPSBsZV9zY2FubmluZ19mYWNhZGUuU2NhblJlcXVlc3Qoc3RhcnQ9VHJ1ZSkKLSAgICAgICAgICAgIHNlbGYuZHV0LmhjaV9sZV9zY2FubmluZ19tYW5hZ2VyLlNjYW4oc2Nhbl9yZXF1ZXN0KQotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KGFkdmVydGlzaW5nX2V2ZW50X3N0cmVhbSkuZW1pdHMobGFtYmRhIHBhY2tldDogYidJbV9UaGVfQ0VSVCcgaW4gcGFja2V0LmV2ZW50KQotCi0gICAgICAgICAgICByZW1vdmVfcmVxdWVzdCA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5SZW1vdmVBZHZlcnRpc2VyUmVxdWVzdChhZHZlcnRpc2VyX2lkPWNyZWF0ZV9yZXNwb25zZS5hZHZlcnRpc2VyX2lkKQotICAgICAgICAgICAgc2VsZi5jZXJ0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLlJlbW92ZUFkdmVydGlzZXIocmVtb3ZlX3JlcXVlc3QpCmRpZmYgLS1naXQgYS9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlLmNjIGIvZ2QvaGNpL2NsYXNzX29mX2RldmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2MzYxMy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJoY2kvY2xhc3Nfb2ZfZGV2aWNlLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvbW1vbi9udW1iZXJzLmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotLy8gQ2xhc3NPZkRldmljZSBjYW5ub3QgaW5pdGlhbGl6ZSBtZW1iZXIgdmFyaWFibGVzIGFzIGl0IGlzIGEgUE9EIHR5cGUKLS8vIE5PTElOVE5FWFRMSU5FKGNwcGNvcmVndWlkZWxpbmVzLXByby10eXBlLW1lbWJlci1pbml0KQotQ2xhc3NPZkRldmljZTo6Q2xhc3NPZkRldmljZShjb25zdCB1aW50OF90ICgmY2xhc3Nfb2ZfZGV2aWNlKVtrTGVuZ3RoXSkgewotICBzdGQ6OmNvcHkoY2xhc3Nfb2ZfZGV2aWNlLCBjbGFzc19vZl9kZXZpY2UgKyBrTGVuZ3RoLCBjb2QuZGF0YSgpKTsKLX07Ci0KLXN0ZDo6c3RyaW5nIENsYXNzT2ZEZXZpY2U6OlRvU3RyaW5nKCkgY29uc3QgewotICBjaGFyIGJ1ZmZlcltdID0gIjAwMC0wLTAwIjsKLSAgc3RkOjpzbnByaW50ZigmYnVmZmVyWzBdLCBzaXplb2YoYnVmZmVyKSwgIiUwM3gtJTAxeC0lMDJ4IiwgKHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb2RbMl0pIDw8IDQpIHwgY29kWzFdID4+IDQsCi0gICAgICAgICAgICAgICAgY29kWzFdICYgMHgwZiwgY29kWzBdKTsKLSAgc3RkOjpzdHJpbmcgc3RyKGJ1ZmZlcik7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLXN0ZDo6c3RyaW5nIENsYXNzT2ZEZXZpY2U6OlRvTGVnYWN5Q29uZmlnU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gc3RkOjp0b19zdHJpbmcoVG9VaW50MzJMZWdhY3koKSk7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8Q2xhc3NPZkRldmljZT4gQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGlmIChzdHIubGVuZ3RoKCkgIT0gOCkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLQotICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyZWFtKHN0cik7Ci0gIHN0ZDo6c3RyaW5nIHRva2VuOwotICBpbnQgaW5kZXggPSAwOwotICB1aW50MTZfdCB2YWx1ZXNbM107Ci0KLSAgQ2xhc3NPZkRldmljZSBuZXdfY29ke307Ci0gIHdoaWxlIChnZXRsaW5lKHN0cmVhbSwgdG9rZW4sICctJykpIHsKLSAgICBpZiAoaW5kZXggPj0gMykgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpZiAoaW5kZXggPT0gMCAmJiB0b2tlbi5sZW5ndGgoKSAhPSAzKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMSAmJiB0b2tlbi5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMiAmJiB0b2tlbi5sZW5ndGgoKSAhPSAyKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICBjaGFyKiB0ZW1wID0gbnVsbHB0cjsKLSAgICB2YWx1ZXNbaW5kZXhdID0gc3RkOjpzdHJ0b2wodG9rZW4uY19zdHIoKSwgJnRlbXAsIDE2KTsKLSAgICBpZiAoKnRlbXAgIT0gJ1wwJykgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBpbmRleCsrOwotICB9Ci0KLSAgaWYgKGluZGV4ICE9IDMpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0KLSAgbmV3X2NvZC5jb2RbMF0gPSB2YWx1ZXNbMl07Ci0gIG5ld19jb2QuY29kWzFdID0gdmFsdWVzWzFdIHwgKCh2YWx1ZXNbMF0gJiAweGYpIDw8IDQpOwotICBuZXdfY29kLmNvZFsyXSA9IHZhbHVlc1swXSA+PiA0OwotCi0gIHJldHVybiBuZXdfY29kOwotfQotCi1ib29sIENsYXNzT2ZEZXZpY2U6OkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sIENsYXNzT2ZEZXZpY2UmIHRvKSB7Ci0gIGF1dG8gbmV3X2NvZCA9IEZyb21TdHJpbmcoZnJvbSk7Ci0gIGlmICghbmV3X2NvZCkgewotICAgIHRvID0ge307Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHRvID0gc3RkOjptb3ZlKCpuZXdfY29kKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8Q2xhc3NPZkRldmljZT4gQ2xhc3NPZkRldmljZTo6RnJvbVVpbnQzMkxlZ2FjeSh1aW50MzJfdCBjb2RfaW50KSB7Ci0gIGlmIChjb2RfaW50ICE9IDAgJiYgKGNvZF9pbnQgPj4gMjQpICE9IDApIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIENsYXNzT2ZEZXZpY2UgcmVzdWx0ID0ge307Ci0gIHJlc3VsdC5jb2RbMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb2RfaW50KTsKLSAgcmVzdWx0LmNvZFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvZF9pbnQgPj4gOCk7Ci0gIHJlc3VsdC5jb2RbMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb2RfaW50ID4+IDE2KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjpvcHRpb25hbDxDbGFzc09mRGV2aWNlPiBDbGFzc09mRGV2aWNlOjpGcm9tTGVnYWN5Q29uZmlnU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgY2hhciogcHRyID0gbnVsbHB0cjsKLSAgYXV0byBudW0gPSBzdGQ6OnN0cnRvdWxsKHN0ci5kYXRhKCksICZwdHIsIDEwKTsKLSAgaWYgKG51bSA+IDB4ZmZmZmZmKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICByZXR1cm4gRnJvbVVpbnQzMkxlZ2FjeShzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtKSk7Ci19Ci0KLXVpbnQzMl90IENsYXNzT2ZEZXZpY2U6OlRvVWludDMyTGVnYWN5KCkgY29uc3QgewotICByZXR1cm4gKGNvZFsyXSkgfCAoY29kWzFdIDw8IDgpIHwgKGNvZFswXSA8PCAxNik7Ci19Ci0KLXNpemVfdCBDbGFzc09mRGV2aWNlOjpGcm9tT2N0ZXRzKGNvbnN0IHVpbnQ4X3QqIGZyb20pIHsKLSAgc3RkOjpjb3B5KGZyb20sIGZyb20gKyBrTGVuZ3RoLCBkYXRhKCkpOwotICByZXR1cm4ga0xlbmd0aDsKLX07Ci0KLWJvb2wgQ2xhc3NPZkRldmljZTo6SXNWYWxpZChjb25zdCBzdGQ6OnN0cmluZyYgY29kKSB7Ci0gIHJldHVybiBDbGFzc09mRGV2aWNlOjpGcm9tU3RyaW5nKGNvZCkuaGFzX3ZhbHVlKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlLmggYi9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTkwOGEuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NsYXNzX29mX2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJwYWNrZXQvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemVfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9zZXJpYWxpemFibGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY2xhc3MgQ2xhc3NPZkRldmljZSBmaW5hbCA6IHB1YmxpYyBwYWNrZXQ6OkN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlPENsYXNzT2ZEZXZpY2U+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdG9yYWdlOjpTZXJpYWxpemFibGU8Q2xhc3NPZkRldmljZT4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0xlbmd0aCA9IDM7Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCBrTGVuZ3RoPiBjb2QgPSB7fTsKLQotICBDbGFzc09mRGV2aWNlKCkgPSBkZWZhdWx0OwotICBDbGFzc09mRGV2aWNlKGNvbnN0IHVpbnQ4X3QgKCZjbGFzc19vZl9kZXZpY2UpW2tMZW5ndGhdKTsKLQotICAvLyBwYWNrZXQ6OkN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlIG1ldGhvZHMKLSAgaW5saW5lIHVpbnQ4X3QqIGRhdGEoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGNvZC5kYXRhKCk7Ci0gIH0KLSAgaW5saW5lIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGNvZC5kYXRhKCk7Ci0gIH0KLQotICAvLyBzdG9yYWdlOjpTZXJpYWxpemFibGUgbWV0aG9kcwotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotICBzdGF0aWMgc3RkOjpvcHRpb25hbDxDbGFzc09mRGV2aWNlPiBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICBzdGQ6OnN0cmluZyBUb0xlZ2FjeUNvbmZpZ1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotICBzdGF0aWMgc3RkOjpvcHRpb25hbDxDbGFzc09mRGV2aWNlPiBGcm9tTGVnYWN5Q29uZmlnU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENsYXNzT2ZEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiBjb2QgPCByaHMuY29kOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDbGFzc09mRGV2aWNlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gY29kID09IHJocy5jb2Q7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj4oY29uc3QgQ2xhc3NPZkRldmljZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIChyaHMgPCAqdGhpcyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IENsYXNzT2ZEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID4gcmhzKTsKLSAgfQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgQ2xhc3NPZkRldmljZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPCByaHMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDbGFzc09mRGV2aWNlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSByaHMpOwotICB9Ci0KLSAgLy8gQ29udmVydHMgfHN0cmluZ3wgdG8gQ2xhc3NPZkRldmljZSBhbmQgcGxhY2VzIGl0IGluIHx0b3wuIElmIHxmcm9tfCBkb2VzCi0gIC8vIG5vdCByZXByZXNlbnQgYSBDbGFzcyBvZiBEZXZpY2UsIHx0b3wgaXMgbm90IG1vZGlmaWVkIGFuZCB0aGlzIGZ1bmN0aW9uCi0gIC8vIHJldHVybnMgZmFsc2UuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgotICBzdGF0aWMgYm9vbCBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBDbGFzc09mRGV2aWNlJiB0byk7Ci0KLSAgLy8gQ29udmVydHMgdWludDMyX3QgZW5jb2RlZCBjbGFzcyBvZiBkZXZpY2UgdG8gQ2xhc3NPZkRldmljZSBvYmplY3QKLSAgLy8gdWludDMyX3QgZW5jb2Rpbmc6Ci0gIC8vICAgICA8aGlnaD4gdWludDhfdChjb2RbMF0pIHwgdWludDhfdChjb2RbMV0pIHwgdWludDhfdChjb2RbMl0pIDxsb3c+Ci0gIC8vIE9ubHkgdXNlZCBpbiBsZWdhY3kgc3RhY2sgZGV2aWNlIGNvbmZpZwotICBzdGF0aWMgc3RkOjpvcHRpb25hbDxDbGFzc09mRGV2aWNlPiBGcm9tVWludDMyTGVnYWN5KHVpbnQzMl90IGNvZF9pbnQpOwotICB1aW50MzJfdCBUb1VpbnQzMkxlZ2FjeSgpIGNvbnN0OwotCi0gIC8vIENvcGllcyB8ZnJvbXwgcmF3IENsYXNzIG9mIERldmljZSBvY3RldHMgdG8gdGhlIGxvY2FsIG9iamVjdC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcGllZCBvY3RldHMgKGFsd2F5cyBDbGFzc09mRGV2aWNlOjprTGVuZ3RoKQotICBzaXplX3QgRnJvbU9jdGV0cyhjb25zdCB1aW50OF90KiBmcm9tKTsKLQotICBzdGF0aWMgYm9vbCBJc1ZhbGlkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc19vZl9kZXZpY2UpOwotfTsKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDbGFzc09mRGV2aWNlJiBjKSB7Ci0gIG9zIDw8IGMuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlX3B5YmluZDExX3R5cGVfY2FzdGVyLmggYi9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlX3B5YmluZDExX3R5cGVfY2FzdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTVlM2IuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2NsYXNzX29mX2RldmljZV9weWJpbmQxMV90eXBlX2Nhc3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+Ci0jaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+Ci0KLSNpbmNsdWRlICJoY2kvY2xhc3Nfb2ZfZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSBweSA9IHB5YmluZDExOwotCi1uYW1lc3BhY2UgcHliaW5kMTEgewotbmFtZXNwYWNlIGRldGFpbCB7Ci10ZW1wbGF0ZSA8Pgotc3RydWN0IHR5cGVfY2FzdGVyPDo6Ymx1ZXRvb3RoOjpoY2k6OkNsYXNzT2ZEZXZpY2U+IHsKLSBwdWJsaWM6Ci0gIC8vIFNldCB0aGUgUHl0aG9uIG5hbWUgb2YgQ2xhc3NPZkRldmljZSBhbmQgZGVjbGFyZSAidmFsdWUiCi0gIFBZQklORDExX1RZUEVfQ0FTVEVSKDo6Ymx1ZXRvb3RoOjpoY2k6OkNsYXNzT2ZEZXZpY2UsIF8oIkNsYXNzT2ZEZXZpY2UiKSk7Ci0KLSAgLy8gQ29udmVydCBmcm9tIFB5dGhvbi0+QysrCi0gIGJvb2wgbG9hZChoYW5kbGUgc3JjLCBib29sKSB7Ci0gICAgUHlPYmplY3QqIHNvdXJjZSA9IHNyYy5wdHIoKTsKLSAgICBpZiAocHk6OmlzaW5zdGFuY2U8cHk6OnN0cj4oc3JjKSkgewotICAgICAgYm9vbCBjb252ZXJzaW9uX3N1Y2Nlc3NmdWwgPSBibHVldG9vdGg6OmhjaTo6Q2xhc3NPZkRldmljZTo6RnJvbVN0cmluZyhQeVVuaWNvZGVfQXNVVEY4KHNvdXJjZSksIHZhbHVlKTsKLSAgICAgIHJldHVybiBjb252ZXJzaW9uX3N1Y2Nlc3NmdWwgJiYgIVB5RXJyX09jY3VycmVkKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENvbnZlcnQgZnJvbSBDKystPlB5dGhvbgotICBzdGF0aWMgaGFuZGxlIGNhc3QoYmx1ZXRvb3RoOjpoY2k6OkNsYXNzT2ZEZXZpY2Ugc3JjLCByZXR1cm5fdmFsdWVfcG9saWN5LCBoYW5kbGUpIHsKLSAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoc3JjLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2UgZGV0YWlsCi19ICAvLyBuYW1lc3BhY2UgcHliaW5kMTEKZGlmZiAtLWdpdCBhL2dkL2hjaS9jbGFzc19vZl9kZXZpY2VfdW5pdHRlc3QuY2MgYi9nZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjBjZWQyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jbGFzc19vZl9kZXZpY2VfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImhjaS9jbGFzc19vZl9kZXZpY2UuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkNsYXNzT2ZEZXZpY2U7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiB0ZXN0X2NsYXNzID0gImVmYy1kLWFiIjsKLXN0YXRpYyBjb25zdCB1aW50OF90IHRlc3RfYnl0ZXNbXXsweGFiLCAweGNkLCAweGVmfTsKLQotVEVTVChDbGFzc09mRGV2aWNlVW5pdHRlc3QsIHRlc3RfY29uc3RydWN0b3JfYXJyYXkpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2QodGVzdF9ieXRlcyk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfYnl0ZXNbMF0sIGNvZC5jb2RbMF0pOwotICBBU1NFUlRfRVEodGVzdF9ieXRlc1sxXSwgY29kLmNvZFsxXSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X2J5dGVzWzJdLCBjb2QuY29kWzJdKTsKLQotICBzdGQ6OnN0cmluZyByZXQgPSBjb2QuVG9TdHJpbmcoKTsKLQotICBBU1NFUlRfU1RSRVEodGVzdF9jbGFzcywgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKENsYXNzT2ZEZXZpY2VVbml0dGVzdCwgdGVzdF90b19mcm9tX3N0cikgewotICBDbGFzc09mRGV2aWNlIGNvZDsKLSAgQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZyh0ZXN0X2NsYXNzLCBjb2QpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X2J5dGVzWzBdLCBjb2QuY29kWzBdKTsKLSAgQVNTRVJUX0VRKHRlc3RfYnl0ZXNbMV0sIGNvZC5jb2RbMV0pOwotICBBU1NFUlRfRVEodGVzdF9ieXRlc1syXSwgY29kLmNvZFsyXSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0ID0gY29kLlRvU3RyaW5nKCk7Ci0KLSAgQVNTRVJUX1NUUkVRKHRlc3RfY2xhc3MsIHJldC5jX3N0cigpKTsKLX0KLQotVEVTVChDbGFzc09mRGV2aWNlVW5pdHRlc3QsIHRlc3RfZnJvbV9vY3RldHMpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2Q7Ci0gIHNpemVfdCBleHBlY3RlZF9yZXN1bHQgPSBDbGFzc09mRGV2aWNlOjprTGVuZ3RoOwotICBBU1NFUlRfRVEoZXhwZWN0ZWRfcmVzdWx0LCBjb2QuRnJvbU9jdGV0cyh0ZXN0X2J5dGVzKSk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfYnl0ZXNbMF0sIGNvZC5jb2RbMF0pOwotICBBU1NFUlRfRVEodGVzdF9ieXRlc1sxXSwgY29kLmNvZFsxXSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X2J5dGVzWzJdLCBjb2QuY29kWzJdKTsKLQotICBzdGQ6OnN0cmluZyByZXQgPSBjb2QuVG9TdHJpbmcoKTsKLQotICBBU1NFUlRfU1RSRVEodGVzdF9jbGFzcywgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKENsYXNzT2ZEZXZpY2VUZXN0LCB0ZXN0X2NvcHkpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2QxOwotICBDbGFzc09mRGV2aWNlIGNvZDI7Ci0gIENsYXNzT2ZEZXZpY2U6OkZyb21TdHJpbmcodGVzdF9jbGFzcywgY29kMSk7Ci0gIGNvZDIgPSBjb2QxOwotCi0gIEFTU0VSVF9FUShjb2QxLmNvZFswXSwgY29kMi5jb2RbMF0pOwotICBBU1NFUlRfRVEoY29kMS5jb2RbMV0sIGNvZDIuY29kWzFdKTsKLSAgQVNTRVJUX0VRKGNvZDEuY29kWzJdLCBjb2QyLmNvZFsyXSk7Ci19Ci0KLVRFU1QoQ2xhc3NPZkRldmljZVRlc3QsIElzVmFsaWQpIHsKLSAgQVNTRVJUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIiIpKTsKLSAgQVNTRVJUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIjAwMDAwMCIpKTsKLSAgQVNTRVJUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIjAwLTAwLTAwIikpOwotICBBU1NFUlRfRkFMU0UoQ2xhc3NPZkRldmljZTo6SXNWYWxpZCgiMDAwLTAtMCIpKTsKLSAgQVNTRVJUX1RSVUUoQ2xhc3NPZkRldmljZTo6SXNWYWxpZCgiMDAwLTAtMDAiKSk7Ci0gIEFTU0VSVF9UUlVFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIkFCYy1kLTAwIikpOwotICBBU1NFUlRfVFJVRShDbGFzc09mRGV2aWNlOjpJc1ZhbGlkKCJhQmMtRC1lRiIpKTsKLX0KLQotVEVTVChDbGFzc09mRGV2aWNlVGVzdCwgY2xhc3NPZkRldmljZUZyb21TdHJpbmcpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2Q7Ci0KLSAgQVNTRVJUX1RSVUUoQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZygiMDAwLTAtMDAiLCBjb2QpKTsKLSAgY29uc3QgQ2xhc3NPZkRldmljZSByZXN1bHQwID0ge3sweDAwLCAweDAwLCAweDAwfX07Ci0gIEFTU0VSVF9FUSgwLCBtZW1jbXAoY29kLmRhdGEoKSwgcmVzdWx0MC5kYXRhKCksIENsYXNzT2ZEZXZpY2U6OmtMZW5ndGgpKTsKLQotICBBU1NFUlRfVFJVRShDbGFzc09mRGV2aWNlOjpGcm9tU3RyaW5nKCJhYjItMS00QyIsIGNvZCkpOwotICBjb25zdCBDbGFzc09mRGV2aWNlIHJlc3VsdDEgPSB7ezB4NGMsIDB4MjEsIDB4YWJ9fTsKLSAgQVNTRVJUX0VRKDAsIG1lbWNtcChjb2QuZGF0YSgpLCByZXN1bHQxLmRhdGEoKSwgQ2xhc3NPZkRldmljZTo6a0xlbmd0aCkpOwotfQotCi1URVNUKENsYXNzT2ZEZXZpY2VUZXN0LCBjbGFzc09mRGV2aWNlRnJvbVVpbnQzMkxlZ2FjeSkgewotICBhdXRvIGNvZCA9IENsYXNzT2ZEZXZpY2U6OkZyb21VaW50MzJMZWdhY3koMCk7Ci0gIEFTU0VSVF9UUlVFKGNvZCk7Ci0gIEFTU0VSVF9USEFUKGNvZC0+Y29kLCB0ZXN0aW5nOjpFbGVtZW50c0FyZSgweDAwLCAweDAwLCAweDAwKSk7Ci0gIEFTU0VSVF9FUShjb2QtPlRvVWludDMyTGVnYWN5KCksIDApOwotCi0gIGNvZCA9IENsYXNzT2ZEZXZpY2U6OkZyb21VaW50MzJMZWdhY3koMHhhYjIxNGMpOwotICBBU1NFUlRfVFJVRShjb2QpOwotICBBU1NFUlRfVEhBVChjb2QtPmNvZCwgdGVzdGluZzo6RWxlbWVudHNBcmUoMHhhYiwgMHgyMSwgMHg0YykpOwotICBBU1NFUlRfRVEoY29kLT5Ub1VpbnQzMkxlZ2FjeSgpLCAweGFiMjE0Yyk7Ci0KLSAgQVNTRVJUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OkZyb21VaW50MzJMZWdhY3koMHgxYWIyMTRjKSk7Ci19CmRpZmYgLS1naXQgYS9nZC9oY2kvY29tbWFuZF9pbnRlcmZhY2UuaCBiL2dkL2hjaS9jb21tYW5kX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmEwMWRiLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jb21tYW5kX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vY29udGV4dHVhbF9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy91dGlscy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENvbW1hbmRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQ29tbWFuZEludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+Q29tbWFuZEludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvbW1hbmRJbnRlcmZhY2UpOwotCi0gIHZpcnR1YWwgdm9pZCBFbnF1ZXVlQ29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8VD4gY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBFbnF1ZXVlQ29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8VD4gY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRTdGF0dXNWaWV3KT4gb25fc3RhdHVzKSA9IDA7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2NvbnRyb2xsZXIuY2MgYi9nZC9oY2kvY29udHJvbGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhOGZlZC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXVzaW5nIG9zOjpIYW5kbGVyOwotCi1zdHJ1Y3QgQ29udHJvbGxlcjo6aW1wbCB7Ci0gIGltcGwoQ29udHJvbGxlciYgbW9kdWxlKSA6IG1vZHVsZV8obW9kdWxlKSB7fQotCi0gIHZvaWQgU3RhcnQoaGNpOjpIY2lMYXllciogaGNpKSB7Ci0gICAgaGNpXyA9IGhjaTsKLSAgICBIYW5kbGVyKiBoYW5kbGVyID0gbW9kdWxlXy5HZXRIYW5kbGVyKCk7Ci0gICAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfYWNsX2lzX2VuYWJsZWQoKSB8fCBjb21tb246OmluaXRfZmxhZ3M6OmdkX2wyY2FwX2lzX2VuYWJsZWQoKSkgewotICAgICAgaGNpXy0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICAgICAgRXZlbnRDb2RlOjpOVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFMsIGhhbmRsZXItPkJpbmRPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6TnVtYmVyT2ZDb21wbGV0ZWRQYWNrZXRzKSk7Ci0gICAgfQotCi0gICAgbGVfc2V0X2V2ZW50X21hc2soa0RlZmF1bHRMZUV2ZW50TWFzayk7Ci0gICAgc2V0X2V2ZW50X21hc2soa0RlZmF1bHRFdmVudE1hc2spOwotICAgIHdyaXRlX2xlX2hvc3Rfc3VwcG9ydChFbmFibGU6OkVOQUJMRUQpOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKFJlYWRMb2NhbE5hbWVCdWlsZGVyOjpDcmVhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpyZWFkX2xvY2FsX25hbWVfY29tcGxldGVfaGFuZGxlcikpOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbkJ1aWxkZXI6OkNyZWF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXItPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OnJlYWRfbG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbl9jb21wbGV0ZV9oYW5kbGVyKSk7Ci0gICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHNCdWlsZGVyOjpDcmVhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpyZWFkX2xvY2FsX3N1cHBvcnRlZF9jb21tYW5kc19jb21wbGV0ZV9oYW5kbGVyKSk7Ci0KLSAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgTGVSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZSgpLAotICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpsZV9yZWFkX2xvY2FsX3N1cHBvcnRlZF9mZWF0dXJlc19oYW5kbGVyKSk7Ci0KLSAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgTGVSZWFkU3VwcG9ydGVkU3RhdGVzQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgIGhhbmRsZXItPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmxlX3JlYWRfc3VwcG9ydGVkX3N0YXRlc19oYW5kbGVyKSk7Ci0KLSAgICAvLyBXYWl0IGZvciBhbGwgZXh0ZW5kZWQgZmVhdHVyZXMgcmVhZAotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBmZWF0dXJlc19wcm9taXNlOwotICAgIGF1dG8gZmVhdHVyZXNfZnV0dXJlID0gZmVhdHVyZXNfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoUmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZSgweDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpyZWFkX2xvY2FsX2V4dGVuZGVkX2ZlYXR1cmVzX2NvbXBsZXRlX2hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZmVhdHVyZXNfcHJvbWlzZSkpKTsKLSAgICBmZWF0dXJlc19mdXR1cmUud2FpdCgpOwotCi0gICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoUmVhZEJ1ZmZlclNpemVCdWlsZGVyOjpDcmVhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpyZWFkX2J1ZmZlcl9zaXplX2NvbXBsZXRlX2hhbmRsZXIpKTsKLQotICAgIGlmIChpc19zdXBwb3J0ZWQoT3BDb2RlOjpMRV9SRUFEX0JVRkZFUl9TSVpFX1YyKSkgewotICAgICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVSZWFkQnVmZmVyU2l6ZVYyQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfcmVhZF9idWZmZXJfc2l6ZV92Ml9oYW5kbGVyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlUmVhZEJ1ZmZlclNpemVWMUJ1aWxkZXI6OkNyZWF0ZSgpLAotICAgICAgICAgIGhhbmRsZXItPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmxlX3JlYWRfYnVmZmVyX3NpemVfaGFuZGxlcikpOwotICAgIH0KLQotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBMZVJlYWRDb25uZWN0TGlzdFNpemVCdWlsZGVyOjpDcmVhdGUoKSwKLSAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfcmVhZF9jb25uZWN0X2xpc3Rfc2l6ZV9oYW5kbGVyKSk7Ci0KLSAgICBpZiAoaXNfc3VwcG9ydGVkKE9wQ29kZTo6TEVfUkVBRF9SRVNPTFZJTkdfTElTVF9TSVpFKSAmJiBtb2R1bGVfLlN1cHBvcnRzQmxlUHJpdmFjeSgpKSB7Ci0gICAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICBMZVJlYWRSZXNvbHZpbmdMaXN0U2l6ZUJ1aWxkZXI6OkNyZWF0ZSgpLAotICAgICAgICAgIGhhbmRsZXItPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmxlX3JlYWRfcmVzb2x2aW5nX2xpc3Rfc2l6ZV9oYW5kbGVyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19JTkZPKCJMRV9SRUFEX1JFU09MVklOR19MSVNUX1NJWkUgbm90IHN1cHBvcnRlZCwgZGVmYXVsdGluZyB0byAwIik7Ci0gICAgICBsZV9yZXNvbHZpbmdfbGlzdF9zaXplXyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGlzX3N1cHBvcnRlZChPcENvZGU6OkxFX1JFQURfTUFYSU1VTV9EQVRBX0xFTkdUSCkgJiYgbW9kdWxlXy5TdXBwb3J0c0JsZURhdGFQYWNrZXRMZW5ndGhFeHRlbnNpb24oKSkgewotICAgICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoTGVSZWFkTWF4aW11bURhdGFMZW5ndGhCdWlsZGVyOjpDcmVhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXItPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmxlX3JlYWRfbWF4aW11bV9kYXRhX2xlbmd0aF9oYW5kbGVyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19JTkZPKCJMRV9SRUFEX01BWElNVU1fREFUQV9MRU5HVEggbm90IHN1cHBvcnRlZCwgZGVmYXVsdGluZyB0byAwIik7Ci0gICAgICBsZV9tYXhpbXVtX2RhdGFfbGVuZ3RoXy5zdXBwb3J0ZWRfbWF4X3J4X29jdGV0c18gPSAwOwotICAgICAgbGVfbWF4aW11bV9kYXRhX2xlbmd0aF8uc3VwcG9ydGVkX21heF9yeF90aW1lXyA9IDA7Ci0gICAgICBsZV9tYXhpbXVtX2RhdGFfbGVuZ3RoXy5zdXBwb3J0ZWRfbWF4X3R4X29jdGV0c18gPSAwOwotICAgICAgbGVfbWF4aW11bV9kYXRhX2xlbmd0aF8uc3VwcG9ydGVkX21heF90eF90aW1lXyA9IDA7Ci0gICAgfQotCi0gICAgLy8gU1NQIGlzIG1hbmFnZWQgYnkgc2VjdXJpdHkgbGF5ZXIgb25jZSBlbmFibGVkCi0gICAgaWYgKCFjb21tb246OmluaXRfZmxhZ3M6OmdkX3NlY3VyaXR5X2lzX2VuYWJsZWQoKSkgewotICAgICAgd3JpdGVfc2ltcGxlX3BhaXJpbmdfbW9kZShFbmFibGU6OkVOQUJMRUQpOwotICAgICAgaWYgKG1vZHVsZV8uU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucygpKSB7Ci0gICAgICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0QnVpbGRlcjo6Q3JlYXRlKEVuYWJsZTo6RU5BQkxFRCksCi0gICAgICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjp3cml0ZV9zZWN1cmVfY29ubmVjdGlvbnNfaG9zdF9zdXBwb3J0X2NvbXBsZXRlX2hhbmRsZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlzX3N1cHBvcnRlZChPcENvZGU6OkxFX1JFQURfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEgpICYmIG1vZHVsZV8uU3VwcG9ydHNCbGVEYXRhUGFja2V0TGVuZ3RoRXh0ZW5zaW9uKCkpIHsKLSAgICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlUmVhZFN1Z2dlc3RlZERlZmF1bHREYXRhTGVuZ3RoQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfcmVhZF9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aF9oYW5kbGVyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19JTkZPKCJMRV9SRUFEX1NVR0dFU1RFRF9ERUZBVUxUX0RBVEFfTEVOR1RIIG5vdCBzdXBwb3J0ZWQsIGRlZmF1bHRpbmcgdG8gMjcgKDB4MUIpIik7Ci0gICAgICBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aF8gPSAyNzsKLSAgICB9Ci0KLSAgICBpZiAoaXNfc3VwcG9ydGVkKE9wQ29kZTo6TEVfUkVBRF9NQVhJTVVNX0FEVkVSVElTSU5HX0RBVEFfTEVOR1RIKSAmJiBtb2R1bGVfLlN1cHBvcnRzQmxlRXh0ZW5kZWRBZHZlcnRpc2luZygpKSB7Ci0gICAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICBMZVJlYWRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfcmVhZF9tYXhpbXVtX2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoX2hhbmRsZXIpKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX0lORk8oIkxFX1JFQURfTUFYSU1VTV9BRFZFUlRJU0lOR19EQVRBX0xFTkdUSCBub3Qgc3VwcG9ydGVkLCBkZWZhdWx0aW5nIHRvIDMxICgweDFGKSIpOwotICAgICAgbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF8gPSAzMTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfc3VwcG9ydGVkKE9wQ29kZTo6TEVfUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0FEVkVSVElTSU5HX1NFVFMpICYmCi0gICAgICAgIG1vZHVsZV8uU3VwcG9ydHNCbGVFeHRlbmRlZEFkdmVydGlzaW5nKCkpIHsKLSAgICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfcmVhZF9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHNfaGFuZGxlcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfSU5GTygiTEVfUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0FEVkVSVElTSU5HX1NFVFMgbm90IHN1cHBvcnRlZCwgZGVmYXVsdGluZyB0byAxIik7Ci0gICAgICBsZV9udW1iZXJfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHNfID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfc3VwcG9ydGVkKE9wQ29kZTo6TEVfUkVBRF9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUX1NJWkUpICYmIG1vZHVsZV8uU3VwcG9ydHNCbGVQZXJpb2RpY0FkdmVydGlzaW5nKCkpIHsKLSAgICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlUmVhZFBlcmlvZGljQWR2ZXJ0aXNlckxpc3RTaXplQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfcmVhZF9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZV9oYW5kbGVyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19JTkZPKCJMRV9SRUFEX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1RfU0laRSBub3Qgc3VwcG9ydGVkLCBkZWZhdWx0aW5nIHRvIDAiKTsKLSAgICAgIGxlX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplXyA9IDA7Ci0gICAgfQotICAgIGlmIChpc19zdXBwb3J0ZWQoT3BDb2RlOjpMRV9TRVRfSE9TVF9GRUFUVVJFKSkgewotICAgICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVTZXRIb3N0RmVhdHVyZUJ1aWxkZXI6OkNyZWF0ZShMZUhvc3RGZWF0dXJlQml0czo6Q09OTkVDVEVEX0lTT19TVFJFQU1fSE9TVF9TVVBQT1JULCBFbmFibGU6OkVOQUJMRUQpLAotICAgICAgICAgIGhhbmRsZXItPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmxlX3NldF9ob3N0X2ZlYXR1cmVfaGFuZGxlcikpOwotICAgIH0KLQotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci0+QmluZE9uY2VPbih0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6bGVfZ2V0X3ZlbmRvcl9jYXBhYmlsaXRpZXNfaGFuZGxlcikpOwotCi0gICAgLy8gV2Ugb25seSBuZWVkIHRvIHN5bmNocm9uaXplIHRoZSBsYXN0IHJlYWQuIE1ha2UgQkRfQUREUiB0byBiZSB0aGUgbGFzdCBvbmUuCi0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgUmVhZEJkQWRkckJ1aWxkZXI6OkNyZWF0ZSgpLAotICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpyZWFkX2NvbnRyb2xsZXJfbWFjX2FkZHJlc3NfaGFuZGxlciwgc3RkOjptb3ZlKHByb21pc2UpKSk7Ci0gICAgZnV0dXJlLndhaXQoKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIHsKLSAgICBpZiAoYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX2NvcmVfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICBoY2lfLT5VbnJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZTo6TlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTKTsKLSAgICB9Ci0gICAgaGNpXyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIE51bWJlck9mQ29tcGxldGVkUGFja2V0cyhFdmVudFZpZXcgZXZlbnQpIHsKLSAgICBpZiAoYWNsX2NyZWRpdHNfY2FsbGJhY2tfLklzRW1wdHkoKSkgewotICAgICAgTE9HX1dBUk4oIlJlY2VpdmVkIGV2ZW50IHdoZW4gQWNsTWFuYWdlciBpcyBub3QgbGlzdGVuaW5nIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IE51bWJlck9mQ29tcGxldGVkUGFja2V0c1ZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBmb3IgKGF1dG8gY29tcGxldGVkX3BhY2tldHMgOiBjb21wbGV0ZV92aWV3LkdldENvbXBsZXRlZFBhY2tldHMoKSkgewotICAgICAgdWludDE2X3QgaGFuZGxlID0gY29tcGxldGVkX3BhY2tldHMuY29ubmVjdGlvbl9oYW5kbGVfOwotICAgICAgdWludDE2X3QgY3JlZGl0cyA9IGNvbXBsZXRlZF9wYWNrZXRzLmhvc3RfbnVtX29mX2NvbXBsZXRlZF9wYWNrZXRzXzsKLSAgICAgIGFjbF9jcmVkaXRzX2NhbGxiYWNrXy5JbnZva2UoaGFuZGxlLCBjcmVkaXRzKTsKLSAgICAgIGlmICghYWNsX21vbml0b3JfY3JlZGl0c19jYWxsYmFja18uSXNFbXB0eSgpKSB7Ci0gICAgICAgIGFjbF9tb25pdG9yX2NyZWRpdHNfY2FsbGJhY2tfLkludm9rZShoYW5kbGUsIGNyZWRpdHMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfY29tcGxldGVkX2FjbF9wYWNrZXRzX2NhbGxiYWNrKENvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayBjYWxsYmFjaykgewotICAgIEFTU0VSVChhY2xfY3JlZGl0c19jYWxsYmFja18uSXNFbXB0eSgpKTsKLSAgICBhY2xfY3JlZGl0c19jYWxsYmFja18gPSBjYWxsYmFjazsKLSAgfQotCi0gIHZvaWQgdW5yZWdpc3Rlcl9jb21wbGV0ZWRfYWNsX3BhY2tldHNfY2FsbGJhY2soKSB7Ci0gICAgQVNTRVJUKCFhY2xfY3JlZGl0c19jYWxsYmFja18uSXNFbXB0eSgpKTsKLSAgICBhY2xfY3JlZGl0c19jYWxsYmFja18gPSB7fTsKLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfY29tcGxldGVkX21vbml0b3JfYWNsX3BhY2tldHNfY2FsbGJhY2soQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgQVNTRVJUKGFjbF9tb25pdG9yX2NyZWRpdHNfY2FsbGJhY2tfLklzRW1wdHkoKSk7Ci0gICAgYWNsX21vbml0b3JfY3JlZGl0c19jYWxsYmFja18gPSBjYWxsYmFjazsKLSAgfQotCi0gIHZvaWQgdW5yZWdpc3Rlcl9jb21wbGV0ZWRfbW9uaXRvcl9hY2xfcGFja2V0c19jYWxsYmFjaygpIHsKLSAgICBBU1NFUlQoIWFjbF9tb25pdG9yX2NyZWRpdHNfY2FsbGJhY2tfLklzRW1wdHkoKSk7Ci0gICAgYWNsX21vbml0b3JfY3JlZGl0c19jYWxsYmFja18gPSB7fTsKLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfbW9uaXRvcl9jb21wbGV0ZWRfYWNsX3BhY2tldHNfY2FsbGJhY2soQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgQVNTRVJUKGFjbF9tb25pdG9yX2NyZWRpdHNfY2FsbGJhY2tfLklzRW1wdHkoKSk7Ci0gICAgYWNsX21vbml0b3JfY3JlZGl0c19jYWxsYmFja18gPSBjYWxsYmFjazsKLSAgfQotCi0gIHZvaWQgdW5yZWdpc3Rlcl9tb25pdG9yX2NvbXBsZXRlZF9hY2xfcGFja2V0c19jYWxsYmFjaygpIHsKLSAgICBBU1NFUlQoIWFjbF9tb25pdG9yX2NyZWRpdHNfY2FsbGJhY2tfLklzRW1wdHkoKSk7Ci0gICAgYWNsX21vbml0b3JfY3JlZGl0c19jYWxsYmFja18gPSB7fTsKLSAgfQotCi0gIHZvaWQgd3JpdGVfc2VjdXJlX2Nvbm5lY3Rpb25zX2hvc3Rfc3VwcG9ydF9jb21wbGV0ZV9oYW5kbGVyKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IFdyaXRlU2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydENvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICB9Ci0KLSAgdm9pZCByZWFkX2xvY2FsX25hbWVfY29tcGxldGVfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkTG9jYWxOYW1lQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBFcnJvckNvZGUgc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICBBU1NFUlRfTE9HKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MsICJTdGF0dXMgMHglMDJoaHgsICVzIiwgc3RhdHVzLCBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gICAgc3RkOjphcnJheTx1aW50OF90LCAyNDg+IGxvY2FsX25hbWVfYXJyYXkgPSBjb21wbGV0ZV92aWV3LkdldExvY2FsTmFtZSgpOwotCi0gICAgbG9jYWxfbmFtZV8gPSBzdGQ6OnN0cmluZyhsb2NhbF9uYW1lX2FycmF5LmJlZ2luKCksIGxvY2FsX25hbWVfYXJyYXkuZW5kKCkpOwotICAgIC8vIGVyYXNlIFwwCi0gICAgbG9jYWxfbmFtZV8uZXJhc2Uoc3RkOjpmaW5kKGxvY2FsX25hbWVfLmJlZ2luKCksIGxvY2FsX25hbWVfLmVuZCgpLCAnXDAnKSwgbG9jYWxfbmFtZV8uZW5kKCkpOwotICB9Ci0KLSAgdm9pZCByZWFkX2xvY2FsX3ZlcnNpb25faW5mb3JtYXRpb25fY29tcGxldGVfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEVycm9yQ29kZSBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgIEFTU0VSVF9MT0coc3RhdHVzID09IEVycm9yQ29kZTo6U1VDQ0VTUywgIlN0YXR1cyAweCUwMmhoeCwgJXMiLCBzdGF0dXMsIEVycm9yQ29kZVRleHQoc3RhdHVzKS5jX3N0cigpKTsKLQotICAgIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb25fID0gY29tcGxldGVfdmlldy5HZXRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbigpOwotICB9Ci0KLSAgdm9pZCByZWFkX2xvY2FsX3N1cHBvcnRlZF9jb21tYW5kc19jb21wbGV0ZV9oYW5kbGVyKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBFcnJvckNvZGUgc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICBBU1NFUlRfTE9HKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MsICJTdGF0dXMgMHglMDJoaHgsICVzIiwgc3RhdHVzLCBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gICAgbG9jYWxfc3VwcG9ydGVkX2NvbW1hbmRzXyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3VwcG9ydGVkQ29tbWFuZHMoKTsKLSAgfQotCi0gIHZvaWQgcmVhZF9sb2NhbF9leHRlbmRlZF9mZWF0dXJlc19jb21wbGV0ZV9oYW5kbGVyKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlLCBDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkTG9jYWxFeHRlbmRlZEZlYXR1cmVzQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBFcnJvckNvZGUgc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICBBU1NFUlRfTE9HKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MsICJTdGF0dXMgMHglMDJoaHgsICVzIiwgc3RhdHVzLCBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gICAgdWludDhfdCBwYWdlX251bWJlciA9IGNvbXBsZXRlX3ZpZXcuR2V0UGFnZU51bWJlcigpOwotICAgIG1heGltdW1fcGFnZV9udW1iZXJfID0gY29tcGxldGVfdmlldy5HZXRNYXhpbXVtUGFnZU51bWJlcigpOwotICAgIGV4dGVuZGVkX2xtcF9mZWF0dXJlc19hcnJheV8ucHVzaF9iYWNrKGNvbXBsZXRlX3ZpZXcuR2V0RXh0ZW5kZWRMbXBGZWF0dXJlcygpKTsKLQotICAgIC8vIFF1ZXJ5IGFsbCBleHRlbmRlZCBmZWF0dXJlcwotICAgIGlmIChwYWdlX251bWJlciA8IG1heGltdW1fcGFnZV9udW1iZXJfKSB7Ci0gICAgICBwYWdlX251bWJlcisrOwotICAgICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgUmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZShwYWdlX251bWJlciksCi0gICAgICAgICAgbW9kdWxlXy5HZXRIYW5kbGVyKCktPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OnJlYWRfbG9jYWxfZXh0ZW5kZWRfZmVhdHVyZXNfY29tcGxldGVfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvbWlzZSkpKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlYWRfYnVmZmVyX3NpemVfY29tcGxldGVfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBSZWFkQnVmZmVyU2l6ZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGFjbF9idWZmZXJfbGVuZ3RoXyA9IGNvbXBsZXRlX3ZpZXcuR2V0QWNsRGF0YVBhY2tldExlbmd0aCgpOwotICAgIGFjbF9idWZmZXJzXyA9IGNvbXBsZXRlX3ZpZXcuR2V0VG90YWxOdW1BY2xEYXRhUGFja2V0cygpOwotCi0gICAgc2NvX2J1ZmZlcl9sZW5ndGhfID0gY29tcGxldGVfdmlldy5HZXRTeW5jaHJvbm91c0RhdGFQYWNrZXRMZW5ndGgoKTsKLSAgICBzY29fYnVmZmVyc18gPSBjb21wbGV0ZV92aWV3LkdldFRvdGFsTnVtU3luY2hyb25vdXNEYXRhUGFja2V0cygpOwotICB9Ci0KLSAgdm9pZCByZWFkX2NvbnRyb2xsZXJfbWFjX2FkZHJlc3NfaGFuZGxlcihzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSwgQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gUmVhZEJkQWRkckNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIG1hY19hZGRyZXNzXyA9IGNvbXBsZXRlX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgbGVfcmVhZF9idWZmZXJfc2l6ZV9oYW5kbGVyKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlUmVhZEJ1ZmZlclNpemVWMUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX2J1ZmZlcl9zaXplXyA9IGNvbXBsZXRlX3ZpZXcuR2V0TGVCdWZmZXJTaXplKCk7Ci0KLSAgICAvLyBJZiBMRSBidWZmZXIgc2l6ZSBpcyB6ZXJvLCB0aGVuIGJ1ZmZlcnMgcmV0dXJuZWQgYnkgUmVhZF9CdWZmZXJfU2l6ZSBhcmUgc2hhcmVkIGJldHdlZW4gQlIvRURSIGFuZCBMRS4KLSAgICBpZiAobGVfYnVmZmVyX3NpemVfLnRvdGFsX251bV9sZV9wYWNrZXRzXyA9PSAwKSB7Ci0gICAgICBBU1NFUlQoYWNsX2J1ZmZlcnNfICE9IDApOwotICAgICAgbGVfYnVmZmVyX3NpemVfLnRvdGFsX251bV9sZV9wYWNrZXRzXyA9IGFjbF9idWZmZXJzXyAvIDI7Ci0gICAgICBhY2xfYnVmZmVyc18gLT0gbGVfYnVmZmVyX3NpemVfLnRvdGFsX251bV9sZV9wYWNrZXRzXzsKLSAgICAgIGxlX2J1ZmZlcl9zaXplXy5sZV9kYXRhX3BhY2tldF9sZW5ndGhfID0gYWNsX2J1ZmZlcl9sZW5ndGhfOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbGVfcmVhZF9idWZmZXJfc2l6ZV92Ml9oYW5kbGVyKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlUmVhZEJ1ZmZlclNpemVWMkNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX2J1ZmZlcl9zaXplXyA9IGNvbXBsZXRlX3ZpZXcuR2V0TGVCdWZmZXJTaXplKCk7Ci0gICAgaXNvX2J1ZmZlcl9zaXplXyA9IGNvbXBsZXRlX3ZpZXcuR2V0SXNvQnVmZmVyU2l6ZSgpOwotCi0gICAgLy8gSWYgTEUgYnVmZmVyIHNpemUgaXMgemVybywgdGhlbiBidWZmZXJzIHJldHVybmVkIGJ5IFJlYWRfQnVmZmVyX1NpemUgYXJlIHNoYXJlZCBiZXR3ZWVuIEJSL0VEUiBhbmQgTEUuCi0gICAgaWYgKGxlX2J1ZmZlcl9zaXplXy50b3RhbF9udW1fbGVfcGFja2V0c18gPT0gMCkgewotICAgICAgQVNTRVJUKGFjbF9idWZmZXJzXyAhPSAwKTsKLSAgICAgIGxlX2J1ZmZlcl9zaXplXy50b3RhbF9udW1fbGVfcGFja2V0c18gPSBhY2xfYnVmZmVyc18gLyAyOwotICAgICAgYWNsX2J1ZmZlcnNfIC09IGxlX2J1ZmZlcl9zaXplXy50b3RhbF9udW1fbGVfcGFja2V0c187Ci0gICAgICBsZV9idWZmZXJfc2l6ZV8ubGVfZGF0YV9wYWNrZXRfbGVuZ3RoXyA9IGFjbF9idWZmZXJfbGVuZ3RoXzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxlX3NldF9ob3N0X2ZlYXR1cmVfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVNldEhvc3RGZWF0dXJlQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBFcnJvckNvZGUgc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICBBU1NFUlRfTE9HKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MsICJTdGF0dXMgMHglMDJoaHgsICVzIiwgc3RhdHVzLCBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gIH0KLQotICB2b2lkIGxlX3JlYWRfbG9jYWxfc3VwcG9ydGVkX2ZlYXR1cmVzX2hhbmRsZXIoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX2xvY2FsX3N1cHBvcnRlZF9mZWF0dXJlc18gPSBjb21wbGV0ZV92aWV3LkdldExlRmVhdHVyZXMoKTsKLSAgfQotCi0gIHZvaWQgbGVfcmVhZF9zdXBwb3J0ZWRfc3RhdGVzX2hhbmRsZXIoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVSZWFkU3VwcG9ydGVkU3RhdGVzQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBFcnJvckNvZGUgc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICBBU1NFUlRfTE9HKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MsICJTdGF0dXMgMHglMDJoaHgsICVzIiwgc3RhdHVzLCBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gICAgbGVfc3VwcG9ydGVkX3N0YXRlc18gPSBjb21wbGV0ZV92aWV3LkdldExlU3RhdGVzKCk7Ci0gIH0KLQotICB2b2lkIGxlX3JlYWRfY29ubmVjdF9saXN0X3NpemVfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVJlYWRDb25uZWN0TGlzdFNpemVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEVycm9yQ29kZSBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgIEFTU0VSVF9MT0coc3RhdHVzID09IEVycm9yQ29kZTo6U1VDQ0VTUywgIlN0YXR1cyAweCUwMmhoeCwgJXMiLCBzdGF0dXMsIEVycm9yQ29kZVRleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgICBsZV9jb25uZWN0X2xpc3Rfc2l6ZV8gPSBjb21wbGV0ZV92aWV3LkdldENvbm5lY3RMaXN0U2l6ZSgpOwotICB9Ci0KLSAgdm9pZCBsZV9yZWFkX3Jlc29sdmluZ19saXN0X3NpemVfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVJlYWRSZXNvbHZpbmdMaXN0U2l6ZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX3Jlc29sdmluZ19saXN0X3NpemVfID0gY29tcGxldGVfdmlldy5HZXRSZXNvbHZpbmdMaXN0U2l6ZSgpOwotICB9Ci0KLSAgdm9pZCBsZV9yZWFkX21heGltdW1fZGF0YV9sZW5ndGhfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVJlYWRNYXhpbXVtRGF0YUxlbmd0aENvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX21heGltdW1fZGF0YV9sZW5ndGhfID0gY29tcGxldGVfdmlldy5HZXRMZU1heGltdW1EYXRhTGVuZ3RoKCk7Ci0gIH0KLQotICB2b2lkIGxlX3JlYWRfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV9sZW5ndGhfaGFuZGxlcihDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVJlYWRTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aENvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoXyA9IGNvbXBsZXRlX3ZpZXcuR2V0VHhPY3RldHMoKTsKLSAgfQotCi0gIHZvaWQgbGVfcmVhZF9tYXhpbXVtX2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoX2hhbmRsZXIoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVSZWFkTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aENvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgQVNTRVJUX0xPRyhzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLCAiU3RhdHVzIDB4JTAyaGh4LCAlcyIsIHN0YXR1cywgRXJyb3JDb2RlVGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgIGxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGhfID0gY29tcGxldGVfdmlldy5HZXRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoKCk7Ci0gIH0KLQotICB2b2lkIGxlX3JlYWRfbnVtYmVyX29mX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzX2hhbmRsZXIoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcnRpc2luZ1NldHNDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEVycm9yQ29kZSBzdGF0dXMgPSBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgIEFTU0VSVF9MT0coc3RhdHVzID09IEVycm9yQ29kZTo6U1VDQ0VTUywgIlN0YXR1cyAweCUwMmhoeCwgJXMiLCBzdGF0dXMsIEVycm9yQ29kZVRleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgICBsZV9udW1iZXJfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHNfID0gY29tcGxldGVfdmlldy5HZXROdW1iZXJTdXBwb3J0ZWRBZHZlcnRpc2luZ1NldHMoKTsKLSAgfQotCi0gIHZvaWQgbGVfcmVhZF9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZV9oYW5kbGVyKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlUmVhZFBlcmlvZGljQWR2ZXJ0aXNlckxpc3RTaXplQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBFcnJvckNvZGUgc3RhdHVzID0gY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICBBU1NFUlRfTE9HKHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MsICJTdGF0dXMgMHglMDJoaHgsICVzIiwgc3RhdHVzLCBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gICAgbGVfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemVfID0gY29tcGxldGVfdmlldy5HZXRQZXJpb2RpY0FkdmVydGlzZXJMaXN0U2l6ZSgpOwotICB9Ci0KLSAgdm9pZCBsZV9nZXRfdmVuZG9yX2NhcGFiaWxpdGllc19oYW5kbGVyKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0KLSAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5pc19zdXBwb3J0ZWRfID0gMHgwMDsKLSAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5tYXhfYWR2dF9pbnN0YW5jZXNfID0gMHgwMDsKLSAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5vZmZsb2FkZWRfcmVzb2x1dGlvbl9vZl9wcml2YXRlX2FkZHJlc3NfID0gMHgwMDsKLSAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy50b3RhbF9zY2FuX3Jlc3VsdHNfc3RvcmFnZV8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLm1heF9pcmtfbGlzdF9zel8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmZpbHRlcmluZ19zdXBwb3J0XyA9IDB4MDA7Ci0gICAgdmVuZG9yX2NhcGFiaWxpdGllc18ubWF4X2ZpbHRlcl8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmFjdGl2aXR5X2VuZXJneV9pbmZvX3N1cHBvcnRfID0gMHgwMDsKLSAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy52ZXJzaW9uX3N1cHBvcnRlZF8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLnZlcnNpb25fc3VwcG9ydGVkXyA9IDB4MDA7Ci0gICAgdmVuZG9yX2NhcGFiaWxpdGllc18udG90YWxfbnVtX29mX2FkdnRfdHJhY2tlZF8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmV4dGVuZGVkX3NjYW5fc3VwcG9ydF8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkXyA9IDB4MDA7Ci0gICAgdmVuZG9yX2NhcGFiaWxpdGllc18ubGVfYWRkcmVzc19nZW5lcmF0aW9uX29mZmxvYWRpbmdfc3VwcG9ydF8gPSAweDAwOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmEyZHBfc291cmNlX29mZmxvYWRfY2FwYWJpbGl0eV9tYXNrXyA9IDB4MDA7Ci0gICAgdmVuZG9yX2NhcGFiaWxpdGllc18uYmx1ZXRvb3RoX3F1YWxpdHlfcmVwb3J0X3N1cHBvcnRfID0gMHgwMDsKLQotICAgIGlmIChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18uaXNfc3VwcG9ydGVkXyA9IDB4MDE7Ci0KLSAgICAgIC8vIHYwLjU1Ci0gICAgICBCYXNlVmVuZG9yQ2FwYWJpbGl0aWVzIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcyA9IGNvbXBsZXRlX3ZpZXcuR2V0QmFzZVZlbmRvckNhcGFiaWxpdGllcygpOwotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18ubWF4X2FkdnRfaW5zdGFuY2VzXyA9IGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcy5tYXhfYWR2dF9pbnN0YW5jZXNfOwotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18ub2ZmbG9hZGVkX3Jlc29sdXRpb25fb2ZfcHJpdmF0ZV9hZGRyZXNzXyA9Ci0gICAgICAgICAgYmFzZV92ZW5kb3JfY2FwYWJpbGl0aWVzLm9mZmxvYWRlZF9yZXNvbHV0aW9uX29mX3ByaXZhdGVfYWRkcmVzc187Ci0gICAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy50b3RhbF9zY2FuX3Jlc3VsdHNfc3RvcmFnZV8gPSBiYXNlX3ZlbmRvcl9jYXBhYmlsaXRpZXMudG90YWxfc2Nhbl9yZXN1bHRzX3N0b3JhZ2VfOwotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18ubWF4X2lya19saXN0X3N6XyA9IGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcy5tYXhfaXJrX2xpc3Rfc3pfOwotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18uZmlsdGVyaW5nX3N1cHBvcnRfID0gYmFzZV92ZW5kb3JfY2FwYWJpbGl0aWVzLmZpbHRlcmluZ19zdXBwb3J0XzsKLSAgICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLm1heF9maWx0ZXJfID0gYmFzZV92ZW5kb3JfY2FwYWJpbGl0aWVzLm1heF9maWx0ZXJfOwotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18uYWN0aXZpdHlfZW5lcmd5X2luZm9fc3VwcG9ydF8gPSBiYXNlX3ZlbmRvcl9jYXBhYmlsaXRpZXMuYWN0aXZpdHlfZW5lcmd5X2luZm9fc3VwcG9ydF87Ci0gICAgICBpZiAoY29tcGxldGVfdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18udmVyc2lvbl9zdXBwb3J0ZWRfID0gNTU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gdjAuOTUKLSAgICAgIGF1dG8gdjk1ID0gTGVHZXRWZW5kb3JDYXBhYmlsaXRpZXNDb21wbGV0ZTA5NVZpZXc6OkNyZWF0ZShjb21wbGV0ZV92aWV3KTsKLSAgICAgIGlmICghdjk1LklzVmFsaWQoKSkgewotICAgICAgICBMT0dfRVJST1IoImludmFsaWQgZGF0YSBmb3IgaGNpIHJlcXVpcmVtZW50cyB2MC45NSIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy52ZXJzaW9uX3N1cHBvcnRlZF8gPSB2OTUuR2V0VmVyc2lvblN1cHBvcnRlZCgpOwotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18udG90YWxfbnVtX29mX2FkdnRfdHJhY2tlZF8gPSB2OTUuR2V0VG90YWxOdW1PZkFkdnRUcmFja2VkKCk7Ci0gICAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5leHRlbmRlZF9zY2FuX3N1cHBvcnRfID0gdjk1LkdldEV4dGVuZGVkU2NhblN1cHBvcnQoKTsKLSAgICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkXyA9IHY5NS5HZXREZWJ1Z0xvZ2dpbmdTdXBwb3J0ZWQoKTsKLSAgICAgIGlmICh2ZW5kb3JfY2FwYWJpbGl0aWVzXy52ZXJzaW9uX3N1cHBvcnRlZF8gPD0gOTUgfHwgY29tcGxldGVfdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyB2MC45NgotICAgICAgYXV0byB2OTYgPSBMZUdldFZlbmRvckNhcGFiaWxpdGllc0NvbXBsZXRlMDk2Vmlldzo6Q3JlYXRlKHY5NSk7Ci0gICAgICBpZiAoIXY5Ni5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJpbnZhbGlkIGRhdGEgZm9yIGhjaSByZXF1aXJlbWVudHMgdjAuOTYiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgdmVuZG9yX2NhcGFiaWxpdGllc18ubGVfYWRkcmVzc19nZW5lcmF0aW9uX29mZmxvYWRpbmdfc3VwcG9ydF8gPSB2OTYuR2V0TGVBZGRyZXNzR2VuZXJhdGlvbk9mZmxvYWRpbmdTdXBwb3J0KCk7Ci0gICAgICBpZiAodmVuZG9yX2NhcGFiaWxpdGllc18udmVyc2lvbl9zdXBwb3J0ZWRfIDw9IDk2IHx8IGNvbXBsZXRlX3ZpZXcuR2V0UGF5bG9hZCgpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gdjAuOTgKLSAgICAgIGF1dG8gdjk4ID0gTGVHZXRWZW5kb3JDYXBhYmlsaXRpZXNDb21wbGV0ZTA5OFZpZXc6OkNyZWF0ZSh2OTYpOwotICAgICAgaWYgKCF2OTguSXNWYWxpZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiaW52YWxpZCBkYXRhIGZvciBoY2kgcmVxdWlyZW1lbnRzIHYwLjk4Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmEyZHBfc291cmNlX29mZmxvYWRfY2FwYWJpbGl0eV9tYXNrXyA9IHY5OC5HZXRBMmRwU291cmNlT2ZmbG9hZENhcGFiaWxpdHlNYXNrKCk7Ci0gICAgICB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5ibHVldG9vdGhfcXVhbGl0eV9yZXBvcnRfc3VwcG9ydF8gPSB2OTguR2V0Qmx1ZXRvb3RoUXVhbGl0eVJlcG9ydFN1cHBvcnQoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldF9ldmVudF9tYXNrKHVpbnQ2NF90IGV2ZW50X21hc2spIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U2V0RXZlbnRNYXNrQnVpbGRlcj4gcGFja2V0ID0gU2V0RXZlbnRNYXNrQnVpbGRlcjo6Q3JlYXRlKGV2ZW50X21hc2spOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpLCBtb2R1bGVfLkdldEhhbmRsZXIoKS0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpjaGVja19zdGF0dXM8U2V0RXZlbnRNYXNrQ29tcGxldGVWaWV3PikpOwotICB9Ci0KLSAgdm9pZCB3cml0ZV9sZV9ob3N0X3N1cHBvcnQoRW5hYmxlIGVuYWJsZSkgewotICAgIC8vIFNpbmNlIEJsdWV0b290aCBDb3JlIFNwZWMgNC4xLCB0aGlzIGJpdCBzaG91bGQgYmUgMCwgYnV0IHNvbWUgY29udHJvbGxlcnMgc3RpbGwgcmVxdWlyZSBpdAotICAgIEVuYWJsZSBzaW11bHRhbmVvdXNfbGVfaG9zdCA9IEVuYWJsZTo6RU5BQkxFRDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V3JpdGVMZUhvc3RTdXBwb3J0QnVpbGRlcj4gcGFja2V0ID0gV3JpdGVMZUhvc3RTdXBwb3J0QnVpbGRlcjo6Q3JlYXRlKGVuYWJsZSwgc2ltdWx0YW5lb3VzX2xlX2hvc3QpOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUocGFja2V0KSwKLSAgICAgICAgbW9kdWxlXy5HZXRIYW5kbGVyKCktPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmNoZWNrX3N0YXR1czxXcml0ZUxlSG9zdFN1cHBvcnRDb21wbGV0ZVZpZXc+KSk7Ci0gIH0KLQotICB2b2lkIHdyaXRlX3NpbXBsZV9wYWlyaW5nX21vZGUoRW5hYmxlIGVuYWJsZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxXcml0ZVNpbXBsZVBhaXJpbmdNb2RlQnVpbGRlcj4gcGFja2V0ID0gV3JpdGVTaW1wbGVQYWlyaW5nTW9kZUJ1aWxkZXI6OkNyZWF0ZShlbmFibGUpOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUocGFja2V0KSwKLSAgICAgICAgbW9kdWxlXy5HZXRIYW5kbGVyKCktPkJpbmRPbmNlT24odGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmNoZWNrX3N0YXR1czxXcml0ZVNpbXBsZVBhaXJpbmdNb2RlQ29tcGxldGVWaWV3PikpOwotICB9Ci0KLSAgdm9pZCByZXNldCgpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzZXRCdWlsZGVyPiBwYWNrZXQgPSBSZXNldEJ1aWxkZXI6OkNyZWF0ZSgpOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV8uR2V0SGFuZGxlcigpLT5CaW5kT25jZU9uKHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpjaGVja19zdGF0dXM8UmVzZXRDb21wbGV0ZVZpZXc+KSk7Ci0gIH0KLQotICB2b2lkIHNldF9ldmVudF9maWx0ZXIoc3RkOjp1bmlxdWVfcHRyPFNldEV2ZW50RmlsdGVyQnVpbGRlcj4gcGFja2V0KSB7Ci0gICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCksIG1vZHVsZV8uR2V0SGFuZGxlcigpLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmNoZWNrX3N0YXR1czxTZXRFdmVudEZpbHRlckNvbXBsZXRlVmlldz4pKTsKLSAgfQotCi0gIHZvaWQgd3JpdGVfbG9jYWxfbmFtZShzdGQ6OnN0cmluZyBsb2NhbF9uYW1lKSB7Ci0gICAgQVNTRVJUKGxvY2FsX25hbWUubGVuZ3RoKCkgPD0gMjQ4KTsKLSAgICAvLyBGaWxsIHJlbWFpbmluZyBjaGFyIHdpdGggMAotICAgIGxvY2FsX25hbWUuYXBwZW5kKHN0ZDo6c3RyaW5nKDI0OCAtIGxvY2FsX25hbWUubGVuZ3RoKCksICdcMCcpKTsKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI0OD4gbG9jYWxfbmFtZV9hcnJheTsKLSAgICBzdGQ6OmNvcHkoc3RkOjpiZWdpbihsb2NhbF9uYW1lKSwgc3RkOjplbmQobG9jYWxfbmFtZSksIHN0ZDo6YmVnaW4obG9jYWxfbmFtZV9hcnJheSkpOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdyaXRlTG9jYWxOYW1lQnVpbGRlcj4gcGFja2V0ID0gV3JpdGVMb2NhbE5hbWVCdWlsZGVyOjpDcmVhdGUobG9jYWxfbmFtZV9hcnJheSk7Ci0gICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCksIG1vZHVsZV8uR2V0SGFuZGxlcigpLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkNvbnRyb2xsZXI6OmltcGw6OmNoZWNrX3N0YXR1czxXcml0ZUxvY2FsTmFtZUNvbXBsZXRlVmlldz4pKTsKLSAgfQotCi0gIHZvaWQgaG9zdF9idWZmZXJfc2l6ZSh1aW50MTZfdCBob3N0X2FjbF9kYXRhX3BhY2tldF9sZW5ndGgsIHVpbnQ4X3QgaG9zdF9zeW5jaHJvbm91c19kYXRhX3BhY2tldF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBob3N0X3RvdGFsX251bV9hY2xfZGF0YV9wYWNrZXRzLCB1aW50MTZfdCBob3N0X3RvdGFsX251bV9zeW5jaHJvbm91c19kYXRhX3BhY2tldHMpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SG9zdEJ1ZmZlclNpemVCdWlsZGVyPiBwYWNrZXQgPQotICAgICAgICBIb3N0QnVmZmVyU2l6ZUJ1aWxkZXI6OkNyZWF0ZShob3N0X2FjbF9kYXRhX3BhY2tldF9sZW5ndGgsIGhvc3Rfc3luY2hyb25vdXNfZGF0YV9wYWNrZXRfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X3RvdGFsX251bV9hY2xfZGF0YV9wYWNrZXRzLCBob3N0X3RvdGFsX251bV9zeW5jaHJvbm91c19kYXRhX3BhY2tldHMpOwotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpLCBtb2R1bGVfLkdldEhhbmRsZXIoKS0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZDb250cm9sbGVyOjppbXBsOjpjaGVja19zdGF0dXM8SG9zdEJ1ZmZlclNpemVDb21wbGV0ZVZpZXc+KSk7Ci0gIH0KLQotICB2b2lkIGxlX3NldF9ldmVudF9tYXNrKHVpbnQ2NF90IGxlX2V2ZW50X21hc2spIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8TGVTZXRFdmVudE1hc2tCdWlsZGVyPiBwYWNrZXQgPSBMZVNldEV2ZW50TWFza0J1aWxkZXI6OkNyZWF0ZShsZV9ldmVudF9tYXNrKTsKLSAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSwgbW9kdWxlXy5HZXRIYW5kbGVyKCktPkJpbmRPbmNlT24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAmQ29udHJvbGxlcjo6aW1wbDo6Y2hlY2tfc3RhdHVzPExlU2V0RXZlbnRNYXNrQ29tcGxldGVWaWV3PikpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIHZvaWQgY2hlY2tfc3RhdHVzKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXNfdmlldyA9IFQ6OkNyZWF0ZSh2aWV3KTsKLSAgICBBU1NFUlQoc3RhdHVzX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBBU1NFUlQoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgPT0gRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgfQotCi0jZGVmaW5lIE9QX0NPREVfTUFQUElORyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjYXNlIE9wQ29kZTo6bmFtZTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50MTZfdCBpbmRleCA9ICh1aW50MTZfdClPcENvZGVJbmRleDo6bmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDE2X3QgYnl0ZV9pbmRleCA9IGluZGV4IC8gMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQxNl90IGJpdF9pbmRleCA9IGluZGV4ICUgMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBib29sIHN1cHBvcnRlZCA9IGxvY2FsX3N1cHBvcnRlZF9jb21tYW5kc19bYnl0ZV9pbmRleF0gJiAoMSA8PCBiaXRfaW5kZXgpOyBcCi0gICAgaWYgKCFzdXBwb3J0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgTE9HX0RFQlVHKCJ1bnN1cHBvcnRlZCBjb21tYW5kIG9wY29kZTogMHglMDR4IiwgKHVpbnQxNl90KU9wQ29kZTo6bmFtZSk7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHN1cHBvcnRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgYm9vbCBpc19zdXBwb3J0ZWQoT3BDb2RlIG9wX2NvZGUpIHsKLSAgICBzd2l0Y2ggKG9wX2NvZGUpIHsKLSAgICAgIE9QX0NPREVfTUFQUElORyhJTlFVSVJZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKElOUVVJUllfQ0FOQ0VMKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFBFUklPRElDX0lOUVVJUllfTU9ERSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhFWElUX1BFUklPRElDX0lOUVVJUllfTU9ERSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhDUkVBVEVfQ09OTkVDVElPTikKLSAgICAgIE9QX0NPREVfTUFQUElORyhESVNDT05ORUNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKENSRUFURV9DT05ORUNUSU9OX0NBTkNFTCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhBQ0NFUFRfQ09OTkVDVElPTl9SRVFVRVNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFSkVDVF9DT05ORUNUSU9OX1JFUVVFU1QpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTElOS19LRVlfUkVRVUVTVF9SRVBMWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFBJTl9DT0RFX1JFUVVFU1RfUkVQTFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUElOX0NPREVfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhDSEFOR0VfQ09OTkVDVElPTl9QQUNLRVRfVFlQRSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhBVVRIRU5USUNBVElPTl9SRVFVRVNURUQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU0VUX0NPTk5FQ1RJT05fRU5DUllQVElPTikKLSAgICAgIE9QX0NPREVfTUFQUElORyhDSEFOR0VfQ09OTkVDVElPTl9MSU5LX0tFWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhDRU5UUkFMX0xJTktfS0VZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFTU9URV9OQU1FX1JFUVVFU1QpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVNT1RFX05BTUVfUkVRVUVTVF9DQU5DRUwpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfUkVNT1RFX0VYVEVOREVEX0ZFQVRVUkVTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9DTE9DS19PRkZTRVQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MTVBfSEFORExFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKEhPTERfTU9ERSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhTTklGRl9NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKEVYSVRfU05JRkZfTU9ERSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhRT1NfU0VUVVApCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUk9MRV9ESVNDT1ZFUlkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU1dJVENIX1JPTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MSU5LX1BPTElDWV9TRVRUSU5HUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhXUklURV9MSU5LX1BPTElDWV9TRVRUSU5HUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0RFRkFVTFRfTElOS19QT0xJQ1lfU0VUVElOR1MpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhGTE9XX1NQRUNJRklDQVRJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU0VUX0VWRU5UX01BU0spCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVTRVQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU0VUX0VWRU5UX0ZJTFRFUikKLSAgICAgIE9QX0NPREVfTUFQUElORyhGTFVTSCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX1BJTl9UWVBFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1BJTl9UWVBFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfU1RPUkVEX0xJTktfS0VZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1NUT1JFRF9MSU5LX0tFWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhERUxFVEVfU1RPUkVEX0xJTktfS0VZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX0xPQ0FMX05BTUUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MT0NBTF9OQU1FKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhXUklURV9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfUEFHRV9USU1FT1VUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1BBR0VfVElNRU9VVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX1NDQU5fRU5BQkxFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1NDQU5fRU5BQkxFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfUEFHRV9TQ0FOX0FDVElWSVRZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1BBR0VfU0NBTl9BQ1RJVklUWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0lOUVVJUllfU0NBTl9BQ1RJVklUWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhXUklURV9JTlFVSVJZX1NDQU5fQUNUSVZJVFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9BVVRIRU5USUNBVElPTl9FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfQVVUSEVOVElDQVRJT05fRU5BQkxFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfQ0xBU1NfT0ZfREVWSUNFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX0NMQVNTX09GX0RFVklDRSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX1ZPSUNFX1NFVFRJTkcpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfVk9JQ0VfU0VUVElORykKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhXUklURV9OVU1fQlJPQURDQVNUX1JFVFJBTlNNSVRTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfSE9MRF9NT0RFX0FDVElWSVRZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX0hPTERfTU9ERV9BQ1RJVklUWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfU1lOQ0hST05PVVNfRkxPV19DT05UUk9MX0VOQUJMRSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhXUklURV9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFNFVF9DT05UUk9MTEVSX1RPX0hPU1RfRkxPV19DT05UUk9MKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKEhPU1RfQlVGRkVSX1NJWkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoSE9TVF9OVU1fQ09NUExFVEVEX1BBQ0tFVFMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9JQUMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9DVVJSRU5UX0lBQ19MQVApCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfQ1VSUkVOVF9JQUNfTEFQKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFNFVF9BRkhfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfSU5RVUlSWV9TQ0FOX1RZUEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfSU5RVUlSWV9TQ0FOX1RZUEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9JTlFVSVJZX01PREUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfSU5RVUlSWV9NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfUEFHRV9TQ0FOX1RZUEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfUEFHRV9TQ0FOX1RZUEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfQUZIX0NIQU5ORUxfQVNTRVNTTUVOVF9NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTikKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0xPQ0FMX0VYVEVOREVEX0ZFQVRVUkVTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfQlVGRkVSX1NJWkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9CRF9BRERSKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUikKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRVNFVF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTElOS19RVUFMSVRZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfUlNTSSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0FGSF9DSEFOTkVMX01BUCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0NMT0NLKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTE9PUEJBQ0tfTU9ERSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhXUklURV9MT09QQkFDS19NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKEVOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFNFVFVQX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9FWFRFTkRFRF9JTlFVSVJZX1JFU1BPTlNFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX0VYVEVOREVEX0lOUVVJUllfUkVTUE9OU0UpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVGUkVTSF9FTkNSWVBUSU9OX0tFWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhTTklGRl9TVUJSQVRJTkcpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9TSU1QTEVfUEFJUklOR19NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1NJTVBMRV9QQUlSSU5HX01PREUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MT0NBTF9PT0JfREFUQSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0lOUVVJUllfUkVTUE9OU0VfVFJBTlNNSVRfUE9XRVJfTEVWRUwpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfSU5RVUlSWV9UUkFOU01JVF9QT1dFUl9MRVZFTCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9SRVBMWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX05FR0FUSVZFX1JFUExZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFVTRVJfUEFTU0tFWV9SRVFVRVNUX1JFUExZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFVTRVJfUEFTU0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFTU9URV9PT0JfREFUQV9SRVFVRVNUX1JFUExZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1NJTVBMRV9QQUlSSU5HX0RFQlVHX01PREUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU0VORF9LRVlQUkVTU19OT1RJRklDQVRJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU0VUX0VWRU5UX01BU0tfUEFHRV8yKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKElPX0NBUEFCSUxJVFlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRU1PVEVfT09CX0VYVEVOREVEX0RBVEFfUkVRVUVTVF9SRVBMWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0VOQ1JZUFRJT05fS0VZX1NJWkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9EQVRBX0JMT0NLX1NJWkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MRV9IT1NUX1NVUFBPUlQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfTEVfSE9TVF9TVVBQT1JUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9FVkVOVF9NQVNLKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfQlVGRkVSX1NJWkVfVjEpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX1JBTkRPTV9BRERSRVNTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9BRFZFUlRJU0lOR19QQVJBTUVURVJTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfQURWRVJUSVNJTkdfUEhZU0lDQUxfQ0hBTk5FTF9UWF9QT1dFUikKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfQURWRVJUSVNJTkdfREFUQSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9BRFZFUlRJU0lOR19FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX1NDQU5fUEFSQU1FVEVSUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfU0NBTl9FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfQ1JFQVRFX0NPTk5FQ1RJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfQ09OTkVDVF9MSVNUX1NJWkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfQ0xFQVJfQ09OTkVDVF9MSVNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfQ09OTkVDVElPTl9VUERBVEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX0hPU1RfQ0hBTk5FTF9DTEFTU0lGSUNBVElPTikKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRUFEX0NIQU5ORUxfTUFQKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfUkVNT1RFX0ZFQVRVUkVTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0VOQ1JZUFQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkFORCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TVEFSVF9FTkNSWVBUSU9OKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0xPTkdfVEVSTV9LRVlfUkVRVUVTVF9SRVBMWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9MT05HX1RFUk1fS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9TVVBQT1JURURfU1RBVEVTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQ0VJVkVSX1RFU1QpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfVFJBTlNNSVRURVJfVEVTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9URVNUX0VORCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhFTkhBTkNFRF9TRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKEVOSEFOQ0VEX0FDQ0VQVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDU19WMSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoV1JJVEVfU0VDVVJFX0NPTk5FQ1RJT05TX0hPU1RfU1VQUE9SVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0xPQ0FMX09PQl9FWFRFTkRFRF9EQVRBKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFdSSVRFX1NFQ1VSRV9DT05ORUNUSU9OU19URVNUX01PREUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1RfUkVQTFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX0RBVEFfTEVOR1RIKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEgpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfV1JJVEVfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEgpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9MT0NBTF9QXzI1Nl9QVUJMSUNfS0VZX0NPTU1BTkQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfR0VORVJBVEVfREhLRVlfQ09NTUFORF9WMSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9BRERfREVWSUNFX1RPX1JFU09MVklOR19MSVNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9SRVNPTFZJTkdfTElTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9DTEVBUl9SRVNPTFZJTkdfTElTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRUFEX1JFU09MVklOR19MSVNUX1NJWkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9QRUVSX1JFU09MVkFCTEVfQUREUkVTUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRUFEX0xPQ0FMX1JFU09MVkFCTEVfQUREUkVTUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfQUREUkVTU19SRVNPTFVUSU9OX0VOQUJMRSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfUkVTT0xWQUJMRV9QUklWQVRFX0FERFJFU1NfVElNRU9VVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRUFEX01BWElNVU1fREFUQV9MRU5HVEgpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9QSFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX0RFRkFVTFRfUEhZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9QSFkpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfRU5IQU5DRURfUkVDRUlWRVJfVEVTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9FTkhBTkNFRF9UUkFOU01JVFRFUl9URVNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19SQU5ET01fQUREUkVTUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfREFUQSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfU0NBTl9SRVNQT05TRSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfRU5BQkxFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfTUFYSU1VTV9BRFZFUlRJU0lOR19EQVRBX0xFTkdUSCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRUFEX05VTUJFUl9PRl9TVVBQT1JURURfQURWRVJUSVNJTkdfU0VUUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRU1PVkVfQURWRVJUSVNJTkdfU0VUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0NMRUFSX0FEVkVSVElTSU5HX1NFVFMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1BBUkFNKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX0VYVEVOREVEX1NDQU5fUEFSQU1FVEVSUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfRVhURU5ERURfQ1JFQVRFX0NPTk5FQ1RJT04pCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkNfQ0FOQ0VMKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1BFUklPRElDX0FEVkVSVElTSU5HX1RFUk1JTkFURV9TWU5DKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0FERF9ERVZJQ0VfVE9fUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRU1PVkVfREVWSUNFX0ZST01fUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9DTEVBUl9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVF9TSVpFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfVFJBTlNNSVRfUE9XRVIpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9SRl9QQVRIX0NPTVBFTlNBVElPTl9QT1dFUikKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9XUklURV9SRl9QQVRIX0NPTVBFTlNBVElPTl9QT1dFUikKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfUFJJVkFDWV9NT0RFKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19SRUNFSVZFX0VOQUJMRSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1BFUklPRElDX0FEVkVSVElTSU5HX1NFVF9JTkZPX1RSQU5TRkVSKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNRVRFUlMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX0RFRkFVTFRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTUVURVJTKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0dFTkVSQVRFX0RIS0VZX0NPTU1BTkQpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfTU9ESUZZX1NMRUVQX0NMT0NLX0FDQ1VSQUNZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFQURfQlVGRkVSX1NJWkVfVjIpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9JU09fVFhfU1lOQykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfQ0lHX1BBUkFNRVRFUlMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX0NJR19QQVJBTUVURVJTX1RFU1QpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfQ1JFQVRFX0NJUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRU1PVkVfQ0lHKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0FDQ0VQVF9DSVNfUkVRVUVTVCkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9SRUpFQ1RfQ0lTX1JFUVVFU1QpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfQ1JFQVRFX0JJRykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9URVJNSU5BVEVfQklHKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0JJR19DUkVBVEVfU1lOQykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9CSUdfVEVSTUlOQVRFX1NZTkMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVRVUVTVF9QRUVSX1NDQSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRVUF9JU09fREFUQV9QQVRIKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1JFTU9WRV9JU09fREFUQV9QQVRIKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX1NFVF9IT1NUX0ZFQVRVUkUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9JU09fTElOS19RVUFMSVRZKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKExFX0VOSEFOQ0VEX1JFQURfVFJBTlNNSVRfUE9XRVJfTEVWRUwpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfUkVBRF9SRU1PVEVfVFJBTlNNSVRfUE9XRVJfTEVWRUwpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX1BBVEhfTE9TU19SRVBPUlRJTkdfUEFSQU1FVEVSUykKLSAgICAgIE9QX0NPREVfTUFQUElORyhMRV9TRVRfUEFUSF9MT1NTX1JFUE9SVElOR19FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoTEVfU0VUX1RSQU5TTUlUX1BPV0VSX1JFUE9SVElOR19FTkFCTEUpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoU0VUX0VDT1NZU1RFTV9CQVNFX0lOVEVSVkFMKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDU19WMikKLSAgICAgIE9QX0NPREVfTUFQUElORyhSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ19DQVBBQklMSVRJRVMpCi0gICAgICBPUF9DT0RFX01BUFBJTkcoUkVBRF9MT0NBTF9TVVBQT1JURURfQ09OVFJPTExFUl9ERUxBWSkKLSAgICAgIE9QX0NPREVfTUFQUElORyhDT05GSUdVUkVfREFUQV9QQVRIKQotICAgICAgT1BfQ09ERV9NQVBQSU5HKEVOSEFOQ0VEX0ZMVVNIKQotCi0gICAgICAvLyB2ZW5kb3Igc3BlY2lmaWMKLSAgICAgIGNhc2UgT3BDb2RlOjpMRV9HRVRfVkVORE9SX0NBUEFCSUxJVElFUzoKLSAgICAgICAgcmV0dXJuIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmlzX3N1cHBvcnRlZF8gPT0gMHgwMTsKLSAgICAgIGNhc2UgT3BDb2RlOjpMRV9NVUxUSV9BRFZUOgotICAgICAgICByZXR1cm4gdmVuZG9yX2NhcGFiaWxpdGllc18ubWF4X2FkdnRfaW5zdGFuY2VzXyAhPSAweDAwOwotICAgICAgY2FzZSBPcENvZGU6OkxFX0JBVENIX1NDQU46Ci0gICAgICAgIHJldHVybiB2ZW5kb3JfY2FwYWJpbGl0aWVzXy50b3RhbF9zY2FuX3Jlc3VsdHNfc3RvcmFnZV8gIT0gMHgwMDsKLSAgICAgIGNhc2UgT3BDb2RlOjpMRV9BRFZfRklMVEVSOgotICAgICAgICByZXR1cm4gdmVuZG9yX2NhcGFiaWxpdGllc18uZmlsdGVyaW5nX3N1cHBvcnRfID09IDB4MDE7Ci0gICAgICBjYXNlIE9wQ29kZTo6TEVfRU5FUkdZX0lORk86Ci0gICAgICAgIHJldHVybiB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5hY3Rpdml0eV9lbmVyZ3lfaW5mb19zdXBwb3J0XyA9PSAweDAxOwotICAgICAgY2FzZSBPcENvZGU6OkxFX0VYVEVOREVEX1NDQU5fUEFSQU1TOgotICAgICAgICByZXR1cm4gdmVuZG9yX2NhcGFiaWxpdGllc18uZXh0ZW5kZWRfc2Nhbl9zdXBwb3J0XyA9PSAweDAxOwotICAgICAgY2FzZSBPcENvZGU6OkNPTlRST0xMRVJfREVCVUdfSU5GTzoKLSAgICAgICAgcmV0dXJuIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkXyA9PSAweDAxOwotICAgICAgY2FzZSBPcENvZGU6OkNPTlRST0xMRVJfQTJEUF9PUENPREU6Ci0gICAgICAgIHJldHVybiB2ZW5kb3JfY2FwYWJpbGl0aWVzXy5hMmRwX3NvdXJjZV9vZmZsb2FkX2NhcGFiaWxpdHlfbWFza18gIT0gMHgwMDsKLSAgICAgIGNhc2UgT3BDb2RlOjpDT05UUk9MTEVSX0JRUjoKLSAgICAgICAgcmV0dXJuIHZlbmRvcl9jYXBhYmlsaXRpZXNfLmJsdWV0b290aF9xdWFsaXR5X3JlcG9ydF9zdXBwb3J0XyA9PSAweDAxOwotICAgICAgLy8gdW5kZWZpbmVkIGluIGxvY2FsX3N1cHBvcnRlZF9jb21tYW5kc18KLSAgICAgIGNhc2UgT3BDb2RlOjpSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT01NQU5EUzoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIE9wQ29kZTo6Tk9ORToKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSN1bmRlZiBPUF9DT0RFX01BUFBJTkcKLQotICBDb250cm9sbGVyJiBtb2R1bGVfOwotCi0gIEhjaUxheWVyKiBoY2lfOwotCi0gIENvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayBhY2xfY3JlZGl0c19jYWxsYmFja197fTsKLSAgQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrIGFjbF9tb25pdG9yX2NyZWRpdHNfY2FsbGJhY2tfe307Ci0gIExvY2FsVmVyc2lvbkluZm9ybWF0aW9uIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb25fOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDY0PiBsb2NhbF9zdXBwb3J0ZWRfY29tbWFuZHNfOwotICB1aW50OF90IG1heGltdW1fcGFnZV9udW1iZXJfOwotICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gZXh0ZW5kZWRfbG1wX2ZlYXR1cmVzX2FycmF5XzsKLSAgdWludDE2X3QgYWNsX2J1ZmZlcl9sZW5ndGhfID0gMDsKLSAgdWludDE2X3QgYWNsX2J1ZmZlcnNfID0gMDsKLSAgdWludDhfdCBzY29fYnVmZmVyX2xlbmd0aF8gPSAwOwotICB1aW50MTZfdCBzY29fYnVmZmVyc18gPSAwOwotICBBZGRyZXNzIG1hY19hZGRyZXNzXzsKLSAgc3RkOjpzdHJpbmcgbG9jYWxfbmFtZV87Ci0gIExlQnVmZmVyU2l6ZSBsZV9idWZmZXJfc2l6ZV87Ci0gIExlQnVmZmVyU2l6ZSBpc29fYnVmZmVyX3NpemVfOwotICB1aW50NjRfdCBsZV9sb2NhbF9zdXBwb3J0ZWRfZmVhdHVyZXNfOwotICB1aW50NjRfdCBsZV9zdXBwb3J0ZWRfc3RhdGVzXzsKLSAgdWludDhfdCBsZV9jb25uZWN0X2xpc3Rfc2l6ZV87Ci0gIHVpbnQ4X3QgbGVfcmVzb2x2aW5nX2xpc3Rfc2l6ZV87Ci0gIExlTWF4aW11bURhdGFMZW5ndGggbGVfbWF4aW11bV9kYXRhX2xlbmd0aF87Ci0gIHVpbnQxNl90IGxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGhfOwotICB1aW50MTZfdCBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aF87Ci0gIHVpbnQ4X3QgbGVfbnVtYmVyX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzXzsKLSAgdWludDhfdCBsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZV87Ci0gIFZlbmRvckNhcGFiaWxpdGllcyB2ZW5kb3JfY2FwYWJpbGl0aWVzXzsKLX07ICAvLyBuYW1lc3BhY2UgaGNpCi0KLUNvbnRyb2xsZXI6OkNvbnRyb2xsZXIoKSA6IGltcGxfKHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oKnRoaXMpKSB7fQotCi1Db250cm9sbGVyOjp+Q29udHJvbGxlcigpID0gZGVmYXVsdDsKLQotdm9pZCBDb250cm9sbGVyOjpSZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayhDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgY2IpIHsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6cmVnaXN0ZXJfY29tcGxldGVkX2FjbF9wYWNrZXRzX2NhbGxiYWNrLCBjYik7Ci19Ci0KLXZvaWQgQ29udHJvbGxlcjo6VW5yZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjaygpIHsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6dW5yZWdpc3Rlcl9jb21wbGV0ZWRfYWNsX3BhY2tldHNfY2FsbGJhY2spOwotfQotCi12b2lkIENvbnRyb2xsZXI6OlJlZ2lzdGVyQ29tcGxldGVkTW9uaXRvckFjbFBhY2tldHNDYWxsYmFjayhDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgY2IpIHsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6cmVnaXN0ZXJfY29tcGxldGVkX21vbml0b3JfYWNsX3BhY2tldHNfY2FsbGJhY2ssIGNiKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpVbnJlZ2lzdGVyQ29tcGxldGVkTW9uaXRvckFjbFBhY2tldHNDYWxsYmFjaygpIHsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6dW5yZWdpc3Rlcl9jb21wbGV0ZWRfbW9uaXRvcl9hY2xfcGFja2V0c19jYWxsYmFjayk7Ci19Ci0KLXN0ZDo6c3RyaW5nIENvbnRyb2xsZXI6OkdldExvY2FsTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sb2NhbF9uYW1lXzsKLX0KLQotTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24gQ29udHJvbGxlcjo6R2V0TG9jYWxWZXJzaW9uSW5mb3JtYXRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+bG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbl87Ci19Ci0KLSNkZWZpbmUgQklUKHgpICgweDFVTEwgPDwgKHgpKQotCi0jZGVmaW5lIExPQ0FMX0ZFQVRVUkVfQUNDRVNTT1IobmFtZSwgcGFnZSwgYml0KSBcCi0gIGJvb2wgQ29udHJvbGxlcjo6bmFtZSgpIGNvbnN0IHsgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEdldExvY2FsRmVhdHVyZXMocGFnZSkgJiBCSVQoYml0KTsgICBcCi0gIH0KLQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c1NpbXBsZVBhaXJpbmcsIDAsIDUxKQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c1NlY3VyZUNvbm5lY3Rpb25zLCAyLCA4KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c1NpbXVsdGFuZW91c0xlQnJFZHIsIDAsIDQ5KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0ludGVybGFjZWRJbnF1aXJ5U2NhbiwgMCwgMjgpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzUnNzaVdpdGhJbnF1aXJ5UmVzdWx0cywgMCwgMzApCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2UsIDAsIDQ4KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c1JvbGVTd2l0Y2gsIDAsIDUpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzM1Nsb3RQYWNrZXRzLCAwLCAwKQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0czVTbG90UGFja2V0cywgMCwgMSkKLUxPQ0FMX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNDbGFzc2ljMm1QaHksIDAsIDI1KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0NsYXNzaWMzbVBoeSwgMCwgMjYpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzM1Nsb3RFZHJQYWNrZXRzLCAwLCAzOSkKLUxPQ0FMX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHM1U2xvdEVkclBhY2tldHMsIDAsIDQwKQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c1NjbywgMCwgMTEpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzSHYyUGFja2V0cywgMCwgMTIpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzSHYzUGFja2V0cywgMCwgMTMpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzRXYzUGFja2V0cywgMCwgMzEpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzRXY0UGFja2V0cywgMCwgMzIpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzRXY1UGFja2V0cywgMCwgMzMpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzRXNjbzJtUGh5LCAwLCA0NSkKLUxPQ0FMX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNFc2NvM21QaHksIDAsIDQ2KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0czNTbG90RXNjb0VkclBhY2tldHMsIDAsIDQ3KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0hvbGRNb2RlLCAwLCA2KQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c1NuaWZmTW9kZSwgMCwgNykKLUxPQ0FMX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNQYXJrTW9kZSwgMCwgOCkKLUxPQ0FMX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNOb25GbHVzaGFibGVQYiwgMCwgNTQpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzU25pZmZTdWJyYXRpbmcsIDAsIDQxKQotTE9DQUxfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0VuY3J5cHRpb25QYXVzZSwgMCwgNDIpCi1MT0NBTF9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlLCAwLCAzOCkKLQotI2RlZmluZSBMT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKG5hbWUsIGJpdCkgXAotICBib29sIENvbnRyb2xsZXI6Om5hbWUoKSBjb25zdCB7ICAgICAgICAgICAgXAotICAgIHJldHVybiBHZXRMb2NhbExlRmVhdHVyZXMoKSAmIEJJVChiaXQpOyAgXAotICB9Ci0KLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVFbmNyeXB0aW9uLCAwKQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZUNvbm5lY3Rpb25QYXJhbWV0ZXJzUmVxdWVzdCwgMSkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVFeHRlbmRlZFJlamVjdCwgMikKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVQZXJpcGhlcmFsSW5pdGlhdGVkRmVhdHVyZXNFeGNoYW5nZSwgMykKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVQaW5nLCA0KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZURhdGFQYWNrZXRMZW5ndGhFeHRlbnNpb24sIDUpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlUHJpdmFjeSwgNikKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVFeHRlbmRlZFNjYW5uZXJGaWx0ZXJQb2xpY2llcywgNykKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGUybVBoeSwgOCkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVTdGFibGVNb2R1bGF0aW9uSW5kZXhUeCwgOSkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVTdGFibGVNb2R1bGF0aW9uSW5kZXhSeCwgMTApCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlQ29kZWRQaHksIDExKQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZUV4dGVuZGVkQWR2ZXJ0aXNpbmcsIDEyKQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmcsIDEzKQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZUNoYW5uZWxTZWxlY3Rpb25BbGdvcml0aG0yLCAxNCkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVQb3dlckNsYXNzMSwgMTUpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlTWluaW11bVVzZWRDaGFubmVscywgMTYpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlQ29ubmVjdGlvbkN0ZVJlcXVlc3QsIDE3KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZUNvbm5lY3Rpb25DdGVSZXNwb25zZSwgMTgpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlQ29ubmVjdGlvbmxlc3NDdGVUcmFuc21pdHRlciwgMTkpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlQ29ubmVjdGlvbmxlc3NDdGVSZWNlaXZlciwgMjApCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlQW50ZW5uYVN3aXRjaGluZ0R1cmluZ0N0ZVR4LCAyMSkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVBbnRlbm5hU3dpdGNoaW5nRHVyaW5nQ3RlUngsIDIyKQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVJlY2VpdmluZ0NvbnN0YW50VG9uZUV4dGVuc2lvbnMsIDIzKQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJTZW5kZXIsIDI0KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJSZWNpcGllbnQsIDI1KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVNsZWVwQ2xvY2tBY2N1cmFjeVVwZGF0ZXMsIDI2KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVJlbW90ZVB1YmxpY0tleVZhbGlkYXRpb24sIDI3KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtQ2VudHJhbCwgMjgpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1QZXJpcGhlcmFsLCAyOSkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVJc29jaHJvbm91c0Jyb2FkY2FzdGVyLCAzMCkKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVTeW5jaHJvbml6ZWRSZWNlaXZlciwgMzEpCi1MT0NBTF9MRV9GRUFUVVJFX0FDQ0VTU09SKFN1cHBvcnRzQmxlSXNvY2hyb25vdXNDaGFubmVsc0hvc3RTdXBwb3J0LCAzMikKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVQb3dlckNvbnRyb2xSZXF1ZXN0LCAzMykKLUxPQ0FMX0xFX0ZFQVRVUkVfQUNDRVNTT1IoU3VwcG9ydHNCbGVQb3dlckNoYW5nZUluZGljYXRpb24sIDM0KQotTE9DQUxfTEVfRkVBVFVSRV9BQ0NFU1NPUihTdXBwb3J0c0JsZVBhdGhMb3NzTW9uaXRvcmluZywgMzUpCi0KLXVpbnQ2NF90IENvbnRyb2xsZXI6OkdldExvY2FsRmVhdHVyZXModWludDhfdCBwYWdlX251bWJlcikgY29uc3QgewotICBpZiAocGFnZV9udW1iZXIgPD0gaW1wbF8tPm1heGltdW1fcGFnZV9udW1iZXJfKSB7Ci0gICAgcmV0dXJuIGltcGxfLT5leHRlbmRlZF9sbXBfZmVhdHVyZXNfYXJyYXlfW3BhZ2VfbnVtYmVyXTsKLSAgfQotICByZXR1cm4gMHgwMDsKLX0KLQotdWludDE2X3QgQ29udHJvbGxlcjo6R2V0QWNsUGFja2V0TGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPmFjbF9idWZmZXJfbGVuZ3RoXzsKLX0KLQotdWludDE2X3QgQ29udHJvbGxlcjo6R2V0TnVtQWNsUGFja2V0QnVmZmVycygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5hY2xfYnVmZmVyc187Ci19Ci0KLXVpbnQ4X3QgQ29udHJvbGxlcjo6R2V0U2NvUGFja2V0TGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPnNjb19idWZmZXJfbGVuZ3RoXzsKLX0KLQotdWludDE2X3QgQ29udHJvbGxlcjo6R2V0TnVtU2NvUGFja2V0QnVmZmVycygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5zY29fYnVmZmVyc187Ci19Ci0KLUFkZHJlc3MgQ29udHJvbGxlcjo6R2V0TWFjQWRkcmVzcygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5tYWNfYWRkcmVzc187Ci19Ci0KLXZvaWQgQ29udHJvbGxlcjo6U2V0RXZlbnRNYXNrKHVpbnQ2NF90IGV2ZW50X21hc2spIHsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6c2V0X2V2ZW50X21hc2ssIGV2ZW50X21hc2spOwotfQotCi12b2lkIENvbnRyb2xsZXI6OlJlc2V0KCkgewotICBDYWxsT24oaW1wbF8uZ2V0KCksICZpbXBsOjpyZXNldCk7Ci19Ci0KLXZvaWQgQ29udHJvbGxlcjo6U2V0RXZlbnRGaWx0ZXJDbGVhckFsbCgpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFNldEV2ZW50RmlsdGVyQ2xlYXJBbGxCdWlsZGVyPiBwYWNrZXQgPSBTZXRFdmVudEZpbHRlckNsZWFyQWxsQnVpbGRlcjo6Q3JlYXRlKCk7Ci0gIENhbGxPbihpbXBsXy5nZXQoKSwgJmltcGw6OnNldF9ldmVudF9maWx0ZXIsIHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRBbGxEZXZpY2VzKCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8U2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0QWxsRGV2aWNlc0J1aWxkZXI+IHBhY2tldCA9Ci0gICAgICBTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRBbGxEZXZpY2VzQnVpbGRlcjo6Q3JlYXRlKCk7Ci0gIENhbGxPbihpbXBsXy5nZXQoKSwgJmltcGw6OnNldF9ldmVudF9maWx0ZXIsIHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRDbGFzc09mRGV2aWNlKENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlX21hc2spIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdENsYXNzT2ZEZXZpY2VCdWlsZGVyPiBwYWNrZXQgPQotICAgICAgU2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0Q2xhc3NPZkRldmljZUJ1aWxkZXI6OkNyZWF0ZShjbGFzc19vZl9kZXZpY2UsIGNsYXNzX29mX2RldmljZV9tYXNrKTsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6c2V0X2V2ZW50X2ZpbHRlciwgc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIENvbnRyb2xsZXI6OlNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdEFkZHJlc3MoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRBZGRyZXNzQnVpbGRlcj4gcGFja2V0ID0KLSAgICAgIFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdEFkZHJlc3NCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcyk7Ci0gIENhbGxPbihpbXBsXy5nZXQoKSwgJmltcGw6OnNldF9ldmVudF9maWx0ZXIsIHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cEFsbERldmljZXMoQXV0b0FjY2VwdEZsYWcgYXV0b19hY2NlcHRfZmxhZykgewotICBzdGQ6OnVuaXF1ZV9wdHI8U2V0RXZlbnRGaWx0ZXJDb25uZWN0aW9uU2V0dXBBbGxEZXZpY2VzQnVpbGRlcj4gcGFja2V0ID0KLSAgICAgIFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQWxsRGV2aWNlc0J1aWxkZXI6OkNyZWF0ZShhdXRvX2FjY2VwdF9mbGFnKTsKLSAgQ2FsbE9uKGltcGxfLmdldCgpLCAmaW1wbDo6c2V0X2V2ZW50X2ZpbHRlciwgc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIENvbnRyb2xsZXI6OlNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQ2xhc3NPZkRldmljZShDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvQWNjZXB0RmxhZyBhdXRvX2FjY2VwdF9mbGFnKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cENsYXNzT2ZEZXZpY2VCdWlsZGVyPiBwYWNrZXQgPQotICAgICAgU2V0RXZlbnRGaWx0ZXJDb25uZWN0aW9uU2V0dXBDbGFzc09mRGV2aWNlQnVpbGRlcjo6Q3JlYXRlKGNsYXNzX29mX2RldmljZSwgY2xhc3Nfb2ZfZGV2aWNlX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19hY2NlcHRfZmxhZyk7Ci0gIENhbGxPbihpbXBsXy5nZXQoKSwgJmltcGw6OnNldF9ldmVudF9maWx0ZXIsIHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cEFkZHJlc3MoQWRkcmVzcyBhZGRyZXNzLCBBdXRvQWNjZXB0RmxhZyBhdXRvX2FjY2VwdF9mbGFnKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cEFkZHJlc3NCdWlsZGVyPiBwYWNrZXQgPQotICAgICAgU2V0RXZlbnRGaWx0ZXJDb25uZWN0aW9uU2V0dXBBZGRyZXNzQnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MsIGF1dG9fYWNjZXB0X2ZsYWcpOwotICBDYWxsT24oaW1wbF8uZ2V0KCksICZpbXBsOjpzZXRfZXZlbnRfZmlsdGVyLCBzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgQ29udHJvbGxlcjo6V3JpdGVMb2NhbE5hbWUoc3RkOjpzdHJpbmcgbG9jYWxfbmFtZSkgewotICBpbXBsXy0+bG9jYWxfbmFtZV8gPSBsb2NhbF9uYW1lOwotICBDYWxsT24oaW1wbF8uZ2V0KCksICZpbXBsOjp3cml0ZV9sb2NhbF9uYW1lLCBsb2NhbF9uYW1lKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpIb3N0QnVmZmVyU2l6ZSh1aW50MTZfdCBob3N0X2FjbF9kYXRhX3BhY2tldF9sZW5ndGgsIHVpbnQ4X3QgaG9zdF9zeW5jaHJvbm91c19kYXRhX3BhY2tldF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhvc3RfdG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhvc3RfdG90YWxfbnVtX3N5bmNocm9ub3VzX2RhdGFfcGFja2V0cykgewotICBDYWxsT24oCi0gICAgICBpbXBsXy5nZXQoKSwKLSAgICAgICZpbXBsOjpob3N0X2J1ZmZlcl9zaXplLAotICAgICAgaG9zdF9hY2xfZGF0YV9wYWNrZXRfbGVuZ3RoLAotICAgICAgaG9zdF9zeW5jaHJvbm91c19kYXRhX3BhY2tldF9sZW5ndGgsCi0gICAgICBob3N0X3RvdGFsX251bV9hY2xfZGF0YV9wYWNrZXRzLAotICAgICAgaG9zdF90b3RhbF9udW1fc3luY2hyb25vdXNfZGF0YV9wYWNrZXRzKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpMZVNldEV2ZW50TWFzayh1aW50NjRfdCBsZV9ldmVudF9tYXNrKSB7Ci0gIENhbGxPbihpbXBsXy5nZXQoKSwgJmltcGw6OmxlX3NldF9ldmVudF9tYXNrLCBsZV9ldmVudF9tYXNrKTsKLX0KLQotTGVCdWZmZXJTaXplIENvbnRyb2xsZXI6OkdldExlQnVmZmVyU2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9idWZmZXJfc2l6ZV87Ci19Ci0KLXVpbnQ2NF90IENvbnRyb2xsZXI6OkdldExvY2FsTGVGZWF0dXJlcygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9sb2NhbF9zdXBwb3J0ZWRfZmVhdHVyZXNfOwotfQotCi1MZUJ1ZmZlclNpemUgQ29udHJvbGxlcjo6R2V0Q29udHJvbGxlcklzb0J1ZmZlclNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+aXNvX2J1ZmZlcl9zaXplXzsKLX0KLQotdWludDY0X3QgQ29udHJvbGxlcjo6R2V0Q29udHJvbGxlckxlTG9jYWxTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9sb2NhbF9zdXBwb3J0ZWRfZmVhdHVyZXNfOwotfQotCi11aW50NjRfdCBDb250cm9sbGVyOjpHZXRMZVN1cHBvcnRlZFN0YXRlcygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9zdXBwb3J0ZWRfc3RhdGVzXzsKLX0KLQotdWludDhfdCBDb250cm9sbGVyOjpHZXRMZUNvbm5lY3RMaXN0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9jb25uZWN0X2xpc3Rfc2l6ZV87Ci19Ci0KLXVpbnQ4X3QgQ29udHJvbGxlcjo6R2V0TGVSZXNvbHZpbmdMaXN0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9yZXNvbHZpbmdfbGlzdF9zaXplXzsKLX0KLQotTGVNYXhpbXVtRGF0YUxlbmd0aCBDb250cm9sbGVyOjpHZXRMZU1heGltdW1EYXRhTGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPmxlX21heGltdW1fZGF0YV9sZW5ndGhfOwotfQotCi11aW50MTZfdCBDb250cm9sbGVyOjpHZXRMZU1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+bGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF87Ci19Ci0KLXVpbnQxNl90IENvbnRyb2xsZXI6OkdldExlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+bGVfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV9sZW5ndGhfOwotfQotCi11aW50OF90IENvbnRyb2xsZXI6OkdldExlTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcmlzaW5nU2V0cygpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5sZV9udW1iZXJfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHNfOwotfQotCi1WZW5kb3JDYXBhYmlsaXRpZXMgQ29udHJvbGxlcjo6R2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPnZlbmRvcl9jYXBhYmlsaXRpZXNfOwotfQotCi11aW50OF90IENvbnRyb2xsZXI6OkdldExlUGVyaW9kaWNBZHZlcnRpc2VyTGlzdFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+bGVfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemVfOwotfQotCi1ib29sIENvbnRyb2xsZXI6OklzU3VwcG9ydGVkKGJsdWV0b290aDo6aGNpOjpPcENvZGUgb3BfY29kZSkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPmlzX3N1cHBvcnRlZChvcF9jb2RlKTsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBDb250cm9sbGVyOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBDb250cm9sbGVyKCk7IH0pOwotCi12b2lkIENvbnRyb2xsZXI6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICBsaXN0LT5hZGQ8aGNpOjpIY2lMYXllcj4oKTsKLX0KLQotdm9pZCBDb250cm9sbGVyOjpTdGFydCgpIHsKLSAgaW1wbF8tPlN0YXJ0KEdldERlcGVuZGVuY3k8aGNpOjpIY2lMYXllcj4oKSk7Ci19Ci0KLXZvaWQgQ29udHJvbGxlcjo6U3RvcCgpIHsKLSAgaW1wbF8tPlN0b3AoKTsKLX0KLQotc3RkOjpzdHJpbmcgQ29udHJvbGxlcjo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiQ29udHJvbGxlciI7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvY29udHJvbGxlci5oIGIvZ2QvaGNpL2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwNjcyMy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvY29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2NvbnRleHR1YWxfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY2xhc3MgQ29udHJvbGxlciA6IHB1YmxpYyBNb2R1bGUgewotIHB1YmxpYzoKLSAgQ29udHJvbGxlcigpOwotICB2aXJ0dWFsIH5Db250cm9sbGVyKCk7Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDb250cm9sbGVyKTsKLQotICB1c2luZyBDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgPQotICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZCh1aW50MTZfdCAvKiBoYW5kbGUgKi8sIHVpbnQxNl90IC8qIG51bV9wYWNrZXRzICovKT47Ci0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayhDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgY2IpOwotCi0gIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQ29tcGxldGVkTW9uaXRvckFjbFBhY2tldHNDYWxsYmFjayhDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgY2IpOwotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlckNvbXBsZXRlZE1vbml0b3JBY2xQYWNrZXRzQ2FsbGJhY2soKTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldExvY2FsTmFtZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24gR2V0TG9jYWxWZXJzaW9uSW5mb3JtYXRpb24oKSBjb25zdDsKLQotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNTaW1wbGVQYWlyaW5nKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c1NlY3VyZUNvbm5lY3Rpb25zKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c1NpbXVsdGFuZW91c0xlQnJFZHIoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzSW50ZXJsYWNlZElucXVpcnlTY2FuKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c1Jzc2lXaXRoSW5xdWlyeVJlc3VsdHMoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2UoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzUm9sZVN3aXRjaCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHMzU2xvdFBhY2tldHMoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzNVNsb3RQYWNrZXRzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0NsYXNzaWMybVBoeSgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNDbGFzc2ljM21QaHkoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzM1Nsb3RFZHJQYWNrZXRzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0czVTbG90RWRyUGFja2V0cygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNTY28oKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzSHYyUGFja2V0cygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNIdjNQYWNrZXRzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0V2M1BhY2tldHMoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzRXY0UGFja2V0cygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNFdjVQYWNrZXRzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0VzY28ybVBoeSgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNFc2NvM21QaHkoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzM1Nsb3RFc2NvRWRyUGFja2V0cygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNIb2xkTW9kZSgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNTbmlmZk1vZGUoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzUGFya01vZGUoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzTm9uRmx1c2hhYmxlUGIoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzU25pZmZTdWJyYXRpbmcoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzRW5jcnlwdGlvblBhdXNlKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUVuY3J5cHRpb24oKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlQ29ubmVjdGlvblBhcmFtZXRlcnNSZXF1ZXN0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUV4dGVuZGVkUmVqZWN0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVBlcmlwaGVyYWxJbml0aWF0ZWRGZWF0dXJlc0V4Y2hhbmdlKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVBpbmcoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlRGF0YVBhY2tldExlbmd0aEV4dGVuc2lvbigpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVQcml2YWN5KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUV4dGVuZGVkU2Nhbm5lckZpbHRlclBvbGljaWVzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZTJtUGh5KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVN0YWJsZU1vZHVsYXRpb25JbmRleFR4KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVN0YWJsZU1vZHVsYXRpb25JbmRleFJ4KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUNvZGVkUGh5KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUV4dGVuZGVkQWR2ZXJ0aXNpbmcoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlUGVyaW9kaWNBZHZlcnRpc2luZygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVDaGFubmVsU2VsZWN0aW9uQWxnb3JpdGhtMigpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVQb3dlckNsYXNzMSgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVNaW5pbXVtVXNlZENoYW5uZWxzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUNvbm5lY3Rpb25DdGVSZXF1ZXN0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUNvbm5lY3Rpb25DdGVSZXNwb25zZSgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVDb25uZWN0aW9ubGVzc0N0ZVRyYW5zbWl0dGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUNvbm5lY3Rpb25sZXNzQ3RlUmVjZWl2ZXIoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlQW50ZW5uYVN3aXRjaGluZ0R1cmluZ0N0ZVR4KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUFudGVubmFTd2l0Y2hpbmdEdXJpbmdDdGVSeCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVSZWNlaXZpbmdDb25zdGFudFRvbmVFeHRlbnNpb25zKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJTZW5kZXIoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlUGVyaW9kaWNBZHZlcnRpc2luZ1N5bmNUcmFuc2ZlclJlY2lwaWVudCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVTbGVlcENsb2NrQWNjdXJhY3lVcGRhdGVzKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVJlbW90ZVB1YmxpY0tleVZhbGlkYXRpb24oKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1DZW50cmFsKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtUGVyaXBoZXJhbCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVJc29jaHJvbm91c0Jyb2FkY2FzdGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVN5bmNocm9uaXplZFJlY2VpdmVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZUlzb2Nocm9ub3VzQ2hhbm5lbHNIb3N0U3VwcG9ydCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVQb3dlckNvbnRyb2xSZXF1ZXN0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0JsZVBvd2VyQ2hhbmdlSW5kaWNhdGlvbigpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNCbGVQYXRoTG9zc01vbml0b3JpbmcoKSBjb25zdDsKLQotICB2aXJ0dWFsIHVpbnQxNl90IEdldEFjbFBhY2tldExlbmd0aCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDE2X3QgR2V0TnVtQWNsUGFja2V0QnVmZmVycygpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDhfdCBHZXRTY29QYWNrZXRMZW5ndGgoKSBjb25zdDsKLQotICB2aXJ0dWFsIHVpbnQxNl90IEdldE51bVNjb1BhY2tldEJ1ZmZlcnMoKSBjb25zdDsKLQotICB2aXJ0dWFsIEFkZHJlc3MgR2V0TWFjQWRkcmVzcygpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBTZXRFdmVudE1hc2sodWludDY0X3QgZXZlbnRfbWFzayk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlc2V0KCk7Ci0KLSAgdmlydHVhbCB2b2lkIFNldEV2ZW50RmlsdGVyQ2xlYXJBbGwoKTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0QWxsRGV2aWNlcygpOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRDbGFzc09mRGV2aWNlKENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZV9tYXNrKTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0QWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cEFsbERldmljZXMoQXV0b0FjY2VwdEZsYWcgYXV0b19hY2NlcHRfZmxhZyk7Ci0KLSAgdmlydHVhbCB2b2lkIFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQ2xhc3NPZkRldmljZShDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZV9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9BY2NlcHRGbGFnIGF1dG9fYWNjZXB0X2ZsYWcpOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cEFkZHJlc3MoQWRkcmVzcyBhZGRyZXNzLCBBdXRvQWNjZXB0RmxhZyBhdXRvX2FjY2VwdF9mbGFnKTsKLQotICB2aXJ0dWFsIHZvaWQgV3JpdGVMb2NhbE5hbWUoc3RkOjpzdHJpbmcgbG9jYWxfbmFtZSk7Ci0KLSAgdmlydHVhbCB2b2lkIEhvc3RCdWZmZXJTaXplKHVpbnQxNl90IGhvc3RfYWNsX2RhdGFfcGFja2V0X2xlbmd0aCwgdWludDhfdCBob3N0X3N5bmNocm9ub3VzX2RhdGFfcGFja2V0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhvc3RfdG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBob3N0X3RvdGFsX251bV9zeW5jaHJvbm91c19kYXRhX3BhY2tldHMpOwotCi0gIC8vIExFIGNvbnRyb2xsZXIgY29tbWFuZHMKLSAgdmlydHVhbCB2b2lkIExlU2V0RXZlbnRNYXNrKHVpbnQ2NF90IGxlX2V2ZW50X21hc2spOwotCi0gIHZpcnR1YWwgTGVCdWZmZXJTaXplIEdldExlQnVmZmVyU2l6ZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDY0X3QgR2V0TGVTdXBwb3J0ZWRTdGF0ZXMoKSBjb25zdDsKLQotICB2aXJ0dWFsIExlQnVmZmVyU2l6ZSBHZXRDb250cm9sbGVySXNvQnVmZmVyU2l6ZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDY0X3QgR2V0Q29udHJvbGxlckxlTG9jYWxTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDhfdCBHZXRMZUNvbm5lY3RMaXN0U2l6ZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDhfdCBHZXRMZVJlc29sdmluZ0xpc3RTaXplKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBMZU1heGltdW1EYXRhTGVuZ3RoIEdldExlTWF4aW11bURhdGFMZW5ndGgoKSBjb25zdDsKLQotICB2aXJ0dWFsIHVpbnQxNl90IEdldExlTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDE2X3QgR2V0TGVTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDhfdCBHZXRMZU51bWJlck9mU3VwcG9ydGVkQWR2ZXJpc2luZ1NldHMoKSBjb25zdDsKLQotICB2aXJ0dWFsIHVpbnQ4X3QgR2V0TGVQZXJpb2RpY0FkdmVydGlzZXJMaXN0U2l6ZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgVmVuZG9yQ2FwYWJpbGl0aWVzIEdldFZlbmRvckNhcGFiaWxpdGllcygpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBJc1N1cHBvcnRlZChPcENvZGUgb3BfY29kZSkgY29uc3Q7Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtEZWZhdWx0RXZlbnRNYXNrID0gMHgzZGJmZmZmZmZmZmZmZmZmOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtEZWZhdWx0TGVFdmVudE1hc2sgPSAweDAwMDAwMDAwNDEwMjFlN2Y7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHZpcnR1YWwgdWludDY0X3QgR2V0TG9jYWxGZWF0dXJlcyh1aW50OF90IHBhZ2VfbnVtYmVyKSBjb25zdDsKLSAgdmlydHVhbCB1aW50NjRfdCBHZXRMb2NhbExlRmVhdHVyZXMoKSBjb25zdDsKLQotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IGltcGxfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2NvbnRyb2xsZXJfbW9jay5oIGIvZ2QvaGNpL2NvbnRyb2xsZXJfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQ5YmE1Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jb250cm9sbGVyX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiY29tbW9uL2NvbnRleHR1YWxfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotLy8gVW5pdCB0ZXN0IGludGVyZmFjZXMKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tDb250cm9sbGVyIDogcHVibGljIENvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVnaXN0ZXJDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2ssIChDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgY2IpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgVW5yZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjaywgKCkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBSZWdpc3RlckNvbXBsZXRlZE1vbml0b3JBY2xQYWNrZXRzQ2FsbGJhY2ssIChDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2sgY2IpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgVW5yZWdpc3RlckNvbXBsZXRlZE1vbml0b3JBY2xQYWNrZXRzQ2FsbGJhY2ssICgpKTsKLSAgTU9DS19NRVRIT0Qoc3RkOjpzdHJpbmcsIEdldExvY2FsTmFtZSwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChMb2NhbFZlcnNpb25JbmZvcm1hdGlvbiwgR2V0TG9jYWxWZXJzaW9uSW5mb3JtYXRpb24sICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNTaW1wbGVQYWlyaW5nLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNTaW11bHRhbmVvdXNMZUJyRWRyLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzSW50ZXJsYWNlZElucXVpcnlTY2FuLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzUnNzaVdpdGhJbnF1aXJ5UmVzdWx0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0V4dGVuZGVkSW5xdWlyeVJlc3BvbnNlLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzUm9sZVN3aXRjaCwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0czNTbG90UGFja2V0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0czVTbG90UGFja2V0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0NsYXNzaWMybVBoeSwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0NsYXNzaWMzbVBoeSwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0czNTbG90RWRyUGFja2V0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0czVTbG90RWRyUGFja2V0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c1NjbywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0h2MlBhY2tldHMsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNIdjNQYWNrZXRzLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzRXYzUGFja2V0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0V2NFBhY2tldHMsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNFdjVQYWNrZXRzLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzRXNjbzJtUGh5LCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzRXNjbzNtUGh5LCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzM1Nsb3RFc2NvRWRyUGFja2V0cywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0hvbGRNb2RlLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzU25pZmZNb2RlLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzUGFya01vZGUsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNOb25GbHVzaGFibGVQYiwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c1NuaWZmU3VicmF0aW5nLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzRW5jcnlwdGlvblBhdXNlLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlUHJpdmFjeSwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0JsZVBhY2tldEV4dGVuc2lvbiwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0JsZUNvbm5lY3Rpb25QYXJhbWV0ZXJzUmVxdWVzdCwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0JsZTJtUGh5LCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlQ29kZWRQaHksICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNCbGVFeHRlbmRlZEFkdmVydGlzaW5nLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlUGVyaW9kaWNBZHZlcnRpc2luZywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0JsZVBlcmlwaGVyYWxJbml0aWF0ZWRGZWF0dXJlRXhjaGFuZ2UsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNCbGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdCwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJTZW5kZXIsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNCbGVQZXJpb2RpY0FkdmVydGlzaW5nU3luY1RyYW5zZmVyUmVjaXBpZW50LCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1DZW50cmFsLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1QZXJpcGhlcmFsLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFN1cHBvcnRzQmxlSXNvY2hyb25vdXNCcm9hZGNhc3RlciwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0JsZVN5bmNocm9uaXplZFJlY2VpdmVyLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKHVpbnQxNl90LCBHZXRBY2xQYWNrZXRMZW5ndGgsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDE2X3QsIEdldE51bUFjbFBhY2tldEJ1ZmZlcnMsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDhfdCwgR2V0U2NvUGFja2V0TGVuZ3RoLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKHVpbnQxNl90LCBHZXROdW1TY29QYWNrZXRCdWZmZXJzLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKEFkZHJlc3MsIEdldE1hY0FkZHJlc3MsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgU2V0RXZlbnRNYXNrLCAodWludDY0X3QgZXZlbnRfbWFzaykpOwotICBNT0NLX01FVEhPRCh2b2lkLCBSZXNldCwgKCkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBTZXRFdmVudEZpbHRlckNsZWFyQWxsLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdEFsbERldmljZXMsICgpKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICB2b2lkLAotICAgICAgU2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0Q2xhc3NPZkRldmljZSwKLSAgICAgIChDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZSwgQ2xhc3NPZkRldmljZSBjbGFzc19vZl9kZXZpY2VfbWFzaykpOwotICBNT0NLX01FVEhPRCh2b2lkLCBTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRBZGRyZXNzLCAoQWRkcmVzcyBhZGRyZXNzKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQWxsRGV2aWNlcywgKEF1dG9BY2NlcHRGbGFnIGF1dG9fYWNjZXB0X2ZsYWcpKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICB2b2lkLAotICAgICAgU2V0RXZlbnRGaWx0ZXJDb25uZWN0aW9uU2V0dXBDbGFzc09mRGV2aWNlLAotICAgICAgKENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlLCBDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZV9tYXNrLCBBdXRvQWNjZXB0RmxhZyBhdXRvX2FjY2VwdF9mbGFnKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQWRkcmVzcywgKEFkZHJlc3MgYWRkcmVzcywgQXV0b0FjY2VwdEZsYWcgYXV0b19hY2NlcHRfZmxhZykpOwotICBNT0NLX01FVEhPRCh2b2lkLCBXcml0ZUxvY2FsTmFtZSwgKHN0ZDo6c3RyaW5nIGxvY2FsX25hbWUpKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICB2b2lkLAotICAgICAgSG9zdEJ1ZmZlclNpemUsCi0gICAgICAodWludDE2X3QgaG9zdF9hY2xfZGF0YV9wYWNrZXRfbGVuZ3RoLAotICAgICAgIHVpbnQ4X3QgaG9zdF9zeW5jaHJvbm91c19kYXRhX3BhY2tldF9sZW5ndGgsCi0gICAgICAgdWludDE2X3QgaG9zdF90b3RhbF9udW1fYWNsX2RhdGFfcGFja2V0cywKLSAgICAgICB1aW50MTZfdCBob3N0X3RvdGFsX251bV9zeW5jaHJvbm91c19kYXRhX3BhY2tldHMpKTsKLSAgLy8gTEUgY29udHJvbGxlciBjb21tYW5kcwotICBNT0NLX01FVEhPRCh2b2lkLCBMZVNldEV2ZW50TWFzaywgKHVpbnQ2NF90IGxlX2V2ZW50X21hc2spKTsKLSAgTU9DS19NRVRIT0QoTGVCdWZmZXJTaXplLCBHZXRMZUJ1ZmZlclNpemUsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDY0X3QsIEdldExlU3VwcG9ydGVkU3RhdGVzLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKExlQnVmZmVyU2l6ZSwgR2V0Q29udHJvbGxlcklzb0J1ZmZlclNpemUsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDY0X3QsIEdldENvbnRyb2xsZXJMZUxvY2FsU3VwcG9ydGVkRmVhdHVyZXMsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDhfdCwgR2V0TGVDb25uZWN0TGlzdFNpemUsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDhfdCwgR2V0TGVSZXNvbHZpbmdMaXN0U2l6ZSwgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRChMZU1heGltdW1EYXRhTGVuZ3RoLCBHZXRMZU1heGltdW1EYXRhTGVuZ3RoLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKHVpbnQxNl90LCBHZXRMZU1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGgsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDE2X3QsIEdldExlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGgsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QodWludDhfdCwgR2V0TGVOdW1iZXJPZlN1cHBvcnRlZEFkdmVyaXNpbmdTZXRzLCAoKSwgKGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKHVpbnQ4X3QsIEdldExlUGVyaW9kaWNBZHZlcnRpc2VyTGlzdFNpemUsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoVmVuZG9yQ2FwYWJpbGl0aWVzLCBHZXRWZW5kb3JDYXBhYmlsaXRpZXMsICgpLCAoY29uc3QpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgSXNTdXBwb3J0ZWQsIChPcENvZGUgb3BfY29kZSksIChjb25zdCkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9jb250cm9sbGVyX3Rlc3QuY2MgYi9nZC9oY2kvY29udHJvbGxlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjFkZjlkLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9jb250cm9sbGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJjb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIHsKLQotdXNpbmcgY29tbW9uOjpCaWRpUXVldWU7Ci11c2luZyBjb21tb246OkJpZGlRdWV1ZUVuZDsKLXVzaW5nIHBhY2tldDo6a0xpdHRsZUVuZGlhbjsKLXVzaW5nIHBhY2tldDo6UGFja2V0VmlldzsKLXVzaW5nIHBhY2tldDo6UmF3QnVpbGRlcjsKLQotY29uc3RleHByIHVpbnQxNl90IGtIYW5kbGUxID0gMHgxMjM7Ci1jb25zdGV4cHIgdWludDE2X3Qga0NyZWRpdHMxID0gMHg3ODsKLWNvbnN0ZXhwciB1aW50MTZfdCBrSGFuZGxlMiA9IDB4NDU2OwotY29uc3RleHByIHVpbnQxNl90IGtDcmVkaXRzMiA9IDB4OWE7Ci11aW50MTZfdCBmZWF0dXJlX3NwZWNfdmVyc2lvbiA9IDU1OwotCi1QYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi1jbGFzcyBUZXN0SGNpTGF5ZXIgOiBwdWJsaWMgSGNpTGF5ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKCZUZXN0SGNpTGF5ZXI6OkhhbmRsZUNvbW1hbmQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgc3RkOjptb3ZlKGNvbW1hbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvbl9jb21wbGV0ZSkpKTsKLSAgfQotCi0gIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKGZhbHNlKSA8PCAiQ29udHJvbGxlciBwcm9wZXJ0aWVzIHNob3VsZCBub3QgZ2VuZXJhdGUgQ29tbWFuZCBTdGF0dXMiOwotICB9Ci0KLSAgdm9pZCBIYW5kbGVDb21tYW5kKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kX2J1aWxkZXIsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4gb25fY29tcGxldGUpIHsKLSAgICBhdXRvIHBhY2tldF92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoY29tbWFuZF9idWlsZGVyKSk7Ci0gICAgQ29tbWFuZFZpZXcgY29tbWFuZCA9IENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICAgIEFTU0VSVF9UUlVFKGNvbW1hbmQuSXNWYWxpZCgpKTsKLQotICAgIHVpbnQ4X3QgbnVtX3BhY2tldHMgPSAxOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBldmVudF9idWlsZGVyOwotICAgIHN3aXRjaCAoY29tbWFuZC5HZXRPcENvZGUoKSkgewotICAgICAgY2FzZSAoT3BDb2RlOjpSRUFEX0xPQ0FMX05BTUUpOiB7Ci0gICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMjQ4PiBsb2NhbF9uYW1lID0geydEJywgJ1UnLCAnVCcsICdcMCd9OwotICAgICAgICBldmVudF9idWlsZGVyID0gUmVhZExvY2FsTmFtZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGxvY2FsX25hbWUpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKE9wQ29kZTo6UkVBRF9MT0NBTF9WRVJTSU9OX0lORk9STUFUSU9OKTogewotICAgICAgICBMb2NhbFZlcnNpb25JbmZvcm1hdGlvbiBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uOwotICAgICAgICBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLmhjaV92ZXJzaW9uXyA9IEhjaVZlcnNpb246OlZfNV8wOwotICAgICAgICBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLmhjaV9yZXZpc2lvbl8gPSAweDEyMzQ7Ci0gICAgICAgIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3ZlcnNpb25fID0gTG1wVmVyc2lvbjo6Vl80XzI7Ci0gICAgICAgIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubWFudWZhY3R1cmVyX25hbWVfID0gMHhCQUQ7Ci0gICAgICAgIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3N1YnZlcnNpb25fID0gMHg1Njc4OwotICAgICAgICBldmVudF9idWlsZGVyID0gUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24pOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKE9wQ29kZTo6UkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFMpOiB7Ci0gICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgNjQ+IHN1cHBvcnRlZF9jb21tYW5kczsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzNzsgaSsrKSB7Ci0gICAgICAgICAgc3VwcG9ydGVkX2NvbW1hbmRzW2ldID0gMHhmZjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMzc7IGkgPCA2NDsgaSsrKSB7Ci0gICAgICAgICAgc3VwcG9ydGVkX2NvbW1hbmRzW2ldID0gMHgwMDsKLSAgICAgICAgfQotICAgICAgICBldmVudF9idWlsZGVyID0KLSAgICAgICAgICAgIFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgc3VwcG9ydGVkX2NvbW1hbmRzKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChPcENvZGU6OlJFQURfTE9DQUxfRVhURU5ERURfRkVBVFVSRVMpOiB7Ci0gICAgICAgIFJlYWRMb2NhbEV4dGVuZGVkRmVhdHVyZXNWaWV3IHJlYWRfY29tbWFuZCA9IFJlYWRMb2NhbEV4dGVuZGVkRmVhdHVyZXNWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHJlYWRfY29tbWFuZC5Jc1ZhbGlkKCkpOwotICAgICAgICB1aW50OF90IHBhZ2VfYnVtYmVyID0gcmVhZF9jb21tYW5kLkdldFBhZ2VOdW1iZXIoKTsKLSAgICAgICAgdWludDY0X3QgbG1wX2ZlYXR1cmVzID0gMHgwMTIzNDU2NzhhYmNkZWY7Ci0gICAgICAgIGxtcF9mZWF0dXJlcyArPSBwYWdlX2J1bWJlcjsKLSAgICAgICAgZXZlbnRfYnVpbGRlciA9IFJlYWRMb2NhbEV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBwYWdlX2J1bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyLCBsbXBfZmVhdHVyZXMpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKE9wQ29kZTo6UkVBRF9CVUZGRVJfU0laRSk6IHsKLSAgICAgICAgZXZlbnRfYnVpbGRlciA9IFJlYWRCdWZmZXJTaXplQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBhY2xfZGF0YV9wYWNrZXRfbGVuZ3RoLCBzeW5jaHJvbm91c19kYXRhX3BhY2tldF9sZW5ndGgsCi0gICAgICAgICAgICB0b3RhbF9udW1fYWNsX2RhdGFfcGFja2V0cywgdG90YWxfbnVtX3N5bmNocm9ub3VzX2RhdGFfcGFja2V0cyk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAoT3BDb2RlOjpSRUFEX0JEX0FERFIpOiB7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPSBSZWFkQmRBZGRyQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgQWRkcmVzczo6a0FueSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAoT3BDb2RlOjpMRV9SRUFEX0JVRkZFUl9TSVpFX1YxKTogewotICAgICAgICBMZUJ1ZmZlclNpemUgbGVfYnVmZmVyX3NpemU7Ci0gICAgICAgIGxlX2J1ZmZlcl9zaXplLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8gPSAweDE2OwotICAgICAgICBsZV9idWZmZXJfc2l6ZS50b3RhbF9udW1fbGVfcGFja2V0c18gPSAweDA4OwotICAgICAgICBldmVudF9idWlsZGVyID0gTGVSZWFkQnVmZmVyU2l6ZVYxQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgbGVfYnVmZmVyX3NpemUpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKE9wQ29kZTo6TEVfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVMpOiB7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPQotICAgICAgICAgICAgTGVSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDAxZjEyMzQ1Njc4OWFiYyk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAoT3BDb2RlOjpMRV9SRUFEX1NVUFBPUlRFRF9TVEFURVMpOiB7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPQotICAgICAgICAgICAgTGVSZWFkU3VwcG9ydGVkU3RhdGVzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgMHgwMDFmMTIzNDU2Nzg5YWJlKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChPcENvZGU6OkxFX1JFQURfTUFYSU1VTV9EQVRBX0xFTkdUSCk6IHsKLSAgICAgICAgTGVNYXhpbXVtRGF0YUxlbmd0aCBsZV9tYXhpbXVtX2RhdGFfbGVuZ3RoOwotICAgICAgICBsZV9tYXhpbXVtX2RhdGFfbGVuZ3RoLnN1cHBvcnRlZF9tYXhfdHhfb2N0ZXRzXyA9IDB4MTI7Ci0gICAgICAgIGxlX21heGltdW1fZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF90eF90aW1lXyA9IDB4MzQ7Ci0gICAgICAgIGxlX21heGltdW1fZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF9yeF9vY3RldHNfID0gMHg1NjsKLSAgICAgICAgbGVfbWF4aW11bV9kYXRhX2xlbmd0aC5zdXBwb3J0ZWRfbWF4X3J4X3RpbWVfID0gMHg3ODsKLSAgICAgICAgZXZlbnRfYnVpbGRlciA9Ci0gICAgICAgICAgICBMZVJlYWRNYXhpbXVtRGF0YUxlbmd0aENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGxlX21heGltdW1fZGF0YV9sZW5ndGgpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKE9wQ29kZTo6TEVfUkVBRF9NQVhJTVVNX0FEVkVSVElTSU5HX0RBVEFfTEVOR1RIKTogewotICAgICAgICBldmVudF9idWlsZGVyID0KLSAgICAgICAgICAgIExlUmVhZE1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGhDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCAweDA2NzIpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKE9wQ29kZTo6TEVfUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0FEVkVSVElTSU5HX1NFVFMpOiB7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPQotICAgICAgICAgICAgTGVSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcnRpc2luZ1NldHNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCAweEYwKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChPcENvZGU6OkxFX0dFVF9WRU5ET1JfQ0FQQUJJTElUSUVTKTogewotICAgICAgICBCYXNlVmVuZG9yQ2FwYWJpbGl0aWVzIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllczsKLSAgICAgICAgYmFzZV92ZW5kb3JfY2FwYWJpbGl0aWVzLm1heF9hZHZ0X2luc3RhbmNlc18gPSAweDEwOwotICAgICAgICBiYXNlX3ZlbmRvcl9jYXBhYmlsaXRpZXMub2ZmbG9hZGVkX3Jlc29sdXRpb25fb2ZfcHJpdmF0ZV9hZGRyZXNzXyA9IDB4MDE7Ci0gICAgICAgIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcy50b3RhbF9zY2FuX3Jlc3VsdHNfc3RvcmFnZV8gPSAweDI4MDA7Ci0gICAgICAgIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcy5tYXhfaXJrX2xpc3Rfc3pfID0gMHgyMDsKLSAgICAgICAgYmFzZV92ZW5kb3JfY2FwYWJpbGl0aWVzLmZpbHRlcmluZ19zdXBwb3J0XyA9IDB4MDE7Ci0gICAgICAgIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcy5tYXhfZmlsdGVyXyA9IDB4MTA7Ci0gICAgICAgIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcy5hY3Rpdml0eV9lbmVyZ3lfaW5mb19zdXBwb3J0XyA9IDB4MDE7Ci0KLSAgICAgICAgYXV0byBwYXlsb2FkID0gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPigpOwotICAgICAgICBpZiAoZmVhdHVyZV9zcGVjX3ZlcnNpb24gPiA1NSkgewotICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWRfYnl0ZXMgPSB7MHgyMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gICAgICAgICAgcGF5bG9hZC0+QWRkT2N0ZXRzMihmZWF0dXJlX3NwZWNfdmVyc2lvbik7Ci0gICAgICAgICAgcGF5bG9hZC0+QWRkT2N0ZXRzKHBheWxvYWRfYnl0ZXMpOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPSBMZUdldFZlbmRvckNhcGFiaWxpdGllc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcywgc3RkOjptb3ZlKHBheWxvYWQpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChPcENvZGU6OlNFVF9FVkVOVF9NQVNLKTogewotICAgICAgICBhdXRvIHZpZXcgPSBTZXRFdmVudE1hc2tWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgICAgICAgZXZlbnRfbWFzayA9IHZpZXcuR2V0RXZlbnRNYXNrKCk7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPSBTZXRFdmVudE1hc2tDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChPcENvZGU6OkxFX1NFVF9FVkVOVF9NQVNLKTogewotICAgICAgICBhdXRvIHZpZXcgPSBMZVNldEV2ZW50TWFza1ZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgICAgICAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBsZV9ldmVudF9tYXNrID0gdmlldy5HZXRMZUV2ZW50TWFzaygpOwotICAgICAgICBldmVudF9idWlsZGVyID0gTGVTZXRFdmVudE1hc2tDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgKE9wQ29kZTo6UkVTRVQpOgotICAgICAgY2FzZSAoT3BDb2RlOjpTRVRfRVZFTlRfRklMVEVSKToKLSAgICAgIGNhc2UgKE9wQ29kZTo6SE9TVF9CVUZGRVJfU0laRSk6Ci0gICAgICAgIGNvbW1hbmRfcXVldWVfLnB1c2goY29tbWFuZCk7Ci0gICAgICAgIG5vdF9lbXB0eV8ubm90aWZ5X2FsbCgpOwotICAgICAgICByZXR1cm47Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfSU5GTygiRHJvcHBpbmcgdW5oYW5kbGVkIHBhY2tldCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoZXZlbnRfYnVpbGRlcikpOwotICAgIEV2ZW50VmlldyBldmVudCA9IEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgQVNTRVJUX1RSVUUoZXZlbnQuSXNWYWxpZCgpKTsKLSAgICBDb21tYW5kQ29tcGxldGVWaWV3IGNvbW1hbmRfY29tcGxldGUgPSBDb21tYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoZXZlbnQpOwotICAgIEFTU0VSVF9UUlVFKGNvbW1hbmRfY29tcGxldGUuSXNWYWxpZCgpKTsKLSAgICBvbl9jb21wbGV0ZS5JbnZva2Uoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlIGV2ZW50X2NvZGUsIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9FUShldmVudF9jb2RlLCBFdmVudENvZGU6Ok5VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUykgPDwgIk9ubHkgTlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTIGlzIG5lZWRlZCI7Ci0gICAgbnVtYmVyX29mX2NvbXBsZXRlZF9wYWNrZXRzX2NhbGxiYWNrXyA9IGV2ZW50X2hhbmRsZXI7Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlIGV2ZW50X2NvZGUpIG92ZXJyaWRlIHsKLSAgICBFWFBFQ1RfRVEoZXZlbnRfY29kZSwgRXZlbnRDb2RlOjpOVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFMpIDw8ICJPbmx5IE5VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUyBpcyBuZWVkZWQiOwotICAgIG51bWJlcl9vZl9jb21wbGV0ZWRfcGFja2V0c19jYWxsYmFja18gPSB7fTsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdDcmVkaXQoKSB7Ci0gICAgc3RkOjp2ZWN0b3I8Q29tcGxldGVkUGFja2V0cz4gY29tcGxldGVkX3BhY2tldHM7Ci0gICAgQ29tcGxldGVkUGFja2V0cyBjcDsKLSAgICBjcC5ob3N0X251bV9vZl9jb21wbGV0ZWRfcGFja2V0c18gPSBrQ3JlZGl0czE7Ci0gICAgY3AuY29ubmVjdGlvbl9oYW5kbGVfID0ga0hhbmRsZTE7Ci0gICAgY29tcGxldGVkX3BhY2tldHMucHVzaF9iYWNrKGNwKTsKLSAgICBjcC5ob3N0X251bV9vZl9jb21wbGV0ZWRfcGFja2V0c18gPSBrQ3JlZGl0czI7Ci0gICAgY3AuY29ubmVjdGlvbl9oYW5kbGVfID0ga0hhbmRsZTI7Ci0gICAgY29tcGxldGVkX3BhY2tldHMucHVzaF9iYWNrKGNwKTsKLSAgICBhdXRvIGV2ZW50X2J1aWxkZXIgPSBOdW1iZXJPZkNvbXBsZXRlZFBhY2tldHNCdWlsZGVyOjpDcmVhdGUoY29tcGxldGVkX3BhY2tldHMpOwotICAgIGF1dG8gcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoZXZlbnRfYnVpbGRlcikpOwotICAgIEV2ZW50VmlldyBldmVudCA9IEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgQVNTRVJUX1RSVUUoZXZlbnQuSXNWYWxpZCgpKTsKLSAgICBudW1iZXJfb2ZfY29tcGxldGVkX3BhY2tldHNfY2FsbGJhY2tfLkludm9rZShldmVudCk7Ci0gIH0KLQotICBDb21tYW5kVmlldyBHZXRDb21tYW5kKE9wQ29kZSBvcF9jb2RlKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzMDAwKTsKLQotICAgIC8vIHdhaXQgZm9yIGNvbW1hbmQKLSAgICB3aGlsZSAoY29tbWFuZF9xdWV1ZV8uc2l6ZSgpID09IDApIHsKLSAgICAgIGlmIChub3RfZW1wdHlfLndhaXRfZm9yKGxvY2ssIHRpbWUpID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBFWFBFQ1RfVFJVRShjb21tYW5kX3F1ZXVlXy5zaXplKCkgPiAwKTsKLSAgICBpZiAoY29tbWFuZF9xdWV1ZV8uZW1wdHkoKSkgewotICAgICAgcmV0dXJuIENvbW1hbmRWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPihzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpKSk7Ci0gICAgfQotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQgPSBjb21tYW5kX3F1ZXVlXy5mcm9udCgpOwotICAgIEVYUEVDVF9FUShjb21tYW5kLkdldE9wQ29kZSgpLCBvcF9jb2RlKTsKLSAgICBjb21tYW5kX3F1ZXVlXy5wb3AoKTsKLSAgICByZXR1cm4gY29tbWFuZDsKLSAgfQotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7fQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLQotICBjb25zdGV4cHIgc3RhdGljIHVpbnQxNl90IGFjbF9kYXRhX3BhY2tldF9sZW5ndGggPSAxMDI0OwotICBjb25zdGV4cHIgc3RhdGljIHVpbnQ4X3Qgc3luY2hyb25vdXNfZGF0YV9wYWNrZXRfbGVuZ3RoID0gNjA7Ci0gIGNvbnN0ZXhwciBzdGF0aWMgdWludDE2X3QgdG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMgPSAxMDsKLSAgY29uc3RleHByIHN0YXRpYyB1aW50MTZfdCB0b3RhbF9udW1fc3luY2hyb25vdXNfZGF0YV9wYWNrZXRzID0gMTI7Ci0gIHVpbnQ2NF90IGV2ZW50X21hc2sgPSAwOwotICB1aW50NjRfdCBsZV9ldmVudF9tYXNrID0gMDsKLQotIHByaXZhdGU6Ci0gIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoRXZlbnRWaWV3KT4gbnVtYmVyX29mX2NvbXBsZXRlZF9wYWNrZXRzX2NhbGxiYWNrXzsKLSAgc3RkOjpxdWV1ZTxDb21tYW5kVmlldz4gY29tbWFuZF9xdWV1ZV87Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci0gIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG5vdF9lbXB0eV87Ci19OwotCi1jbGFzcyBDb250cm9sbGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6SW5pdEZsYWdzOjpTZXRBbGxGb3JUZXN0aW5nKCk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfID0gbmV3IFRlc3RIY2lMYXllcjsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZIY2lMYXllcjo6RmFjdG9yeSwgdGVzdF9oY2lfbGF5ZXJfKTsKLSAgICBjbGllbnRfaGFuZGxlcl8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0TW9kdWxlSGFuZGxlcigmSGNpTGF5ZXI6OkZhY3RvcnkpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PENvbnRyb2xsZXI+KCZ0aHJlYWRfKTsKLSAgICBjb250cm9sbGVyXyA9IHN0YXRpY19jYXN0PENvbnRyb2xsZXIqPihmYWtlX3JlZ2lzdHJ5Xy5HZXRNb2R1bGVVbmRlclRlc3QoJkNvbnRyb2xsZXI6OkZhY3RvcnkpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3RvcEFsbCgpOwotICB9Ci0KLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IGZha2VfcmVnaXN0cnlfOwotICBUZXN0SGNpTGF5ZXIqIHRlc3RfaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIG9zOjpUaHJlYWQmIHRocmVhZF8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0VGhyZWFkKCk7Ci0gIENvbnRyb2xsZXIqIGNvbnRyb2xsZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIHN0YXJ0dXBfdGVhcmRvd24pIHt9Ci0KLVRFU1RfRihDb250cm9sbGVyVGVzdCwgcmVhZF9jb250cm9sbGVyX2luZm8pIHsKLSAgQVNTRVJUX0VRKGNvbnRyb2xsZXJfLT5HZXRBY2xQYWNrZXRMZW5ndGgoKSwgdGVzdF9oY2lfbGF5ZXJfLT5hY2xfZGF0YV9wYWNrZXRfbGVuZ3RoKTsKLSAgQVNTRVJUX0VRKGNvbnRyb2xsZXJfLT5HZXROdW1BY2xQYWNrZXRCdWZmZXJzKCksIHRlc3RfaGNpX2xheWVyXy0+dG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMpOwotICBBU1NFUlRfRVEoY29udHJvbGxlcl8tPkdldFNjb1BhY2tldExlbmd0aCgpLCB0ZXN0X2hjaV9sYXllcl8tPnN5bmNocm9ub3VzX2RhdGFfcGFja2V0X2xlbmd0aCk7Ci0gIEFTU0VSVF9FUShjb250cm9sbGVyXy0+R2V0TnVtU2NvUGFja2V0QnVmZmVycygpLCB0ZXN0X2hjaV9sYXllcl8tPnRvdGFsX251bV9zeW5jaHJvbm91c19kYXRhX3BhY2tldHMpOwotICBBU1NFUlRfRVEoY29udHJvbGxlcl8tPkdldE1hY0FkZHJlc3MoKSwgQWRkcmVzczo6a0FueSk7Ci0gIExvY2FsVmVyc2lvbkluZm9ybWF0aW9uIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24gPSBjb250cm9sbGVyXy0+R2V0TG9jYWxWZXJzaW9uSW5mb3JtYXRpb24oKTsKLSAgQVNTRVJUX0VRKGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24uaGNpX3ZlcnNpb25fLCBIY2lWZXJzaW9uOjpWXzVfMCk7Ci0gIEFTU0VSVF9FUShsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLmhjaV9yZXZpc2lvbl8sIDB4MTIzNCk7Ci0gIEFTU0VSVF9FUShsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLmxtcF92ZXJzaW9uXywgTG1wVmVyc2lvbjo6Vl80XzIpOwotICBBU1NFUlRfRVEobG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbi5tYW51ZmFjdHVyZXJfbmFtZV8sIDB4QkFEKTsKLSAgQVNTRVJUX0VRKGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3N1YnZlcnNpb25fLCAweDU2NzgpOwotICBBU1NFUlRfRVEoY29udHJvbGxlcl8tPkdldExlQnVmZmVyU2l6ZSgpLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8sIDB4MTYpOwotICBBU1NFUlRfRVEoY29udHJvbGxlcl8tPkdldExlQnVmZmVyU2l6ZSgpLnRvdGFsX251bV9sZV9wYWNrZXRzXywgMHgwOCk7Ci0gIEFTU0VSVF9FUShjb250cm9sbGVyXy0+R2V0TGVTdXBwb3J0ZWRTdGF0ZXMoKSwgMHgwMDFmMTIzNDU2Nzg5YWJlKTsKLSAgQVNTRVJUX0VRKGNvbnRyb2xsZXJfLT5HZXRMZU1heGltdW1EYXRhTGVuZ3RoKCkuc3VwcG9ydGVkX21heF90eF9vY3RldHNfLCAweDEyKTsKLSAgQVNTRVJUX0VRKGNvbnRyb2xsZXJfLT5HZXRMZU1heGltdW1EYXRhTGVuZ3RoKCkuc3VwcG9ydGVkX21heF90eF90aW1lXywgMHgzNCk7Ci0gIEFTU0VSVF9FUShjb250cm9sbGVyXy0+R2V0TGVNYXhpbXVtRGF0YUxlbmd0aCgpLnN1cHBvcnRlZF9tYXhfcnhfb2N0ZXRzXywgMHg1Nik7Ci0gIEFTU0VSVF9FUShjb250cm9sbGVyXy0+R2V0TGVNYXhpbXVtRGF0YUxlbmd0aCgpLnN1cHBvcnRlZF9tYXhfcnhfdGltZV8sIDB4NzgpOwotICBBU1NFUlRfRVEoY29udHJvbGxlcl8tPkdldExlTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aCgpLCAweDA2NzIpOwotICBBU1NFUlRfRVEoY29udHJvbGxlcl8tPkdldExlTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcmlzaW5nU2V0cygpLCAweEYwKTsKLX0KLQotVEVTVF9GKENvbnRyb2xsZXJUZXN0LCByZWFkX3dyaXRlX2xvY2FsX25hbWUpIHsKLSAgQVNTRVJUX0VRKGNvbnRyb2xsZXJfLT5HZXRMb2NhbE5hbWUoKSwgIkRVVCIpOwotICBjb250cm9sbGVyXy0+V3JpdGVMb2NhbE5hbWUoIk5ldyBuYW1lIik7Ci0gIEFTU0VSVF9FUShjb250cm9sbGVyXy0+R2V0TG9jYWxOYW1lKCksICJOZXcgbmFtZSIpOwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIHNlbmRfc2V0X2V2ZW50X21hc2tfY29tbWFuZCkgewotICB1aW50NjRfdCBuZXdfZXZlbnRfbWFzayA9IHRlc3RfaGNpX2xheWVyXy0+ZXZlbnRfbWFzayAtIDE7Ci0gIGNvbnRyb2xsZXJfLT5TZXRFdmVudE1hc2sobmV3X2V2ZW50X21hc2spOwotICAvLyBTZW5kIGFub3RoZXIgY29tbWFuZCB0byBtYWtlIHN1cmUgaXQgd2FzIGFwcGxpZWQKLSAgY29udHJvbGxlcl8tPlJlc2V0KCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6UkVTRVQpOwotICBBU1NFUlRfRVEobmV3X2V2ZW50X21hc2ssIHRlc3RfaGNpX2xheWVyXy0+ZXZlbnRfbWFzayk7Ci19Ci0KLVRFU1RfRihDb250cm9sbGVyVGVzdCwgc2VuZF9yZXNldF9jb21tYW5kKSB7Ci0gIGNvbnRyb2xsZXJfLT5SZXNldCgpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OlJFU0VUKTsKLSAgYXV0byBjb21tYW5kID0gUmVzZXRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZC5Jc1ZhbGlkKCkpOwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIHNlbmRfc2V0X2V2ZW50X2ZpbHRlcl9jb21tYW5kKSB7Ci0gIGNvbnRyb2xsZXJfLT5TZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRBbGxEZXZpY2VzKCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6U0VUX0VWRU5UX0ZJTFRFUik7Ci0gIGF1dG8gc2V0X2V2ZW50X2ZpbHRlcl92aWV3MSA9IFNldEV2ZW50RmlsdGVyVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIGF1dG8gc2V0X2V2ZW50X2ZpbHRlcl9pbnF1aXJ5X3Jlc3VsdF92aWV3MSA9IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdFZpZXc6OkNyZWF0ZShzZXRfZXZlbnRfZmlsdGVyX3ZpZXcxKTsKLSAgYXV0byBjb21tYW5kMSA9IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdEFsbERldmljZXNWaWV3OjpDcmVhdGUoc2V0X2V2ZW50X2ZpbHRlcl9pbnF1aXJ5X3Jlc3VsdF92aWV3MSk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmQxLklzVmFsaWQoKSk7Ci0KLSAgQ2xhc3NPZkRldmljZSBjbGFzc19vZl9kZXZpY2UoezB4YWIsIDB4Y2QsIDB4ZWZ9KTsKLSAgQ2xhc3NPZkRldmljZSBjbGFzc19vZl9kZXZpY2VfbWFzayh7MHgxMiwgMHgzNCwgMHg1Nn0pOwotICBjb250cm9sbGVyXy0+U2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0Q2xhc3NPZkRldmljZShjbGFzc19vZl9kZXZpY2UsIGNsYXNzX29mX2RldmljZV9tYXNrKTsKLSAgcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6U0VUX0VWRU5UX0ZJTFRFUik7Ci0gIGF1dG8gc2V0X2V2ZW50X2ZpbHRlcl92aWV3MiA9IFNldEV2ZW50RmlsdGVyVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIGF1dG8gc2V0X2V2ZW50X2ZpbHRlcl9pbnF1aXJ5X3Jlc3VsdF92aWV3MiA9IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdFZpZXc6OkNyZWF0ZShzZXRfZXZlbnRfZmlsdGVyX3ZpZXcyKTsKLSAgYXV0byBjb21tYW5kMiA9IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdENsYXNzT2ZEZXZpY2VWaWV3OjpDcmVhdGUoc2V0X2V2ZW50X2ZpbHRlcl9pbnF1aXJ5X3Jlc3VsdF92aWV3Mik7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmQyLklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kMi5HZXRDbGFzc09mRGV2aWNlKCksIGNsYXNzX29mX2RldmljZSk7Ci0KLSAgQWRkcmVzcyBiZGFkZHIoezB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OWEsIDB4YmN9KTsKLSAgY29udHJvbGxlcl8tPlNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQWRkcmVzcyhiZGFkZHIsIEF1dG9BY2NlcHRGbGFnOjpBVVRPX0FDQ0VQVF9PTl9ST0xFX1NXSVRDSF9FTkFCTEVEKTsKLSAgcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6U0VUX0VWRU5UX0ZJTFRFUik7Ci0gIGF1dG8gc2V0X2V2ZW50X2ZpbHRlcl92aWV3MyA9IFNldEV2ZW50RmlsdGVyVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIGF1dG8gc2V0X2V2ZW50X2ZpbHRlcl9jb25uZWN0aW9uX3NldHVwX3ZpZXcgPSBTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cFZpZXc6OkNyZWF0ZShzZXRfZXZlbnRfZmlsdGVyX3ZpZXczKTsKLSAgYXV0byBjb21tYW5kMyA9IFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQWRkcmVzc1ZpZXc6OkNyZWF0ZShzZXRfZXZlbnRfZmlsdGVyX2Nvbm5lY3Rpb25fc2V0dXBfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmQzLklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kMy5HZXRBZGRyZXNzKCksIGJkYWRkcik7Ci19Ci0KLVRFU1RfRihDb250cm9sbGVyVGVzdCwgc2VuZF9ob3N0X2J1ZmZlcl9zaXplX2NvbW1hbmQpIHsKLSAgY29udHJvbGxlcl8tPkhvc3RCdWZmZXJTaXplKDB4RkYwMCwgMHhGMSwgMHhGRjAyLCAweEZGMDMpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkhPU1RfQlVGRkVSX1NJWkUpOwotICBhdXRvIGNvbW1hbmQgPSBIb3N0QnVmZmVyU2l6ZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfVFJVRShjb21tYW5kLklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kLkdldEhvc3RBY2xEYXRhUGFja2V0TGVuZ3RoKCksIDB4RkYwMCk7Ci0gIEFTU0VSVF9FUShjb21tYW5kLkdldEhvc3RTeW5jaHJvbm91c0RhdGFQYWNrZXRMZW5ndGgoKSwgMHhGMSk7Ci0gIEFTU0VSVF9FUShjb21tYW5kLkdldEhvc3RUb3RhbE51bUFjbERhdGFQYWNrZXRzKCksIDB4RkYwMik7Ci0gIEFTU0VSVF9FUShjb21tYW5kLkdldEhvc3RUb3RhbE51bVN5bmNocm9ub3VzRGF0YVBhY2tldHMoKSwgMHhGRjAzKTsKLX0KLQotVEVTVF9GKENvbnRyb2xsZXJUZXN0LCBzZW5kX2xlX3NldF9ldmVudF9tYXNrX2NvbW1hbmQpIHsKLSAgdWludDY0X3QgbmV3X2xlX2V2ZW50X21hc2sgPSB0ZXN0X2hjaV9sYXllcl8tPmV2ZW50X21hc2sgLSAxOwotICBjb250cm9sbGVyXy0+TGVTZXRFdmVudE1hc2sobmV3X2xlX2V2ZW50X21hc2spOwotICAvLyBTZW5kIGFub3RoZXIgY29tbWFuZCB0byBtYWtlIHN1cmUgaXQgd2FzIGFwcGxpZWQKLSAgY29udHJvbGxlcl8tPlJlc2V0KCk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6UkVTRVQpOwotICBBU1NFUlRfRVEobmV3X2xlX2V2ZW50X21hc2ssIHRlc3RfaGNpX2xheWVyXy0+bGVfZXZlbnRfbWFzayk7Ci19Ci0KLVRFU1RfRihDb250cm9sbGVyVGVzdCwgaXNfc3VwcG9ydGVkX3Rlc3QpIHsKLSAgQVNTRVJUX1RSVUUoY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKE9wQ29kZTo6SU5RVUlSWSkpOwotICBBU1NFUlRfVFJVRShjb250cm9sbGVyXy0+SXNTdXBwb3J0ZWQoT3BDb2RlOjpSRUpFQ1RfQ09OTkVDVElPTl9SRVFVRVNUKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkFDQ0VQVF9DT05ORUNUSU9OX1JFUVVFU1QpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX1JFTU9WRV9BRFZFUlRJU0lOR19TRVQpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX0NMRUFSX0FEVkVSVElTSU5HX1NFVFMpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19QQVJBTSkpOwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIGZlYXR1cmVfc3BlY192ZXJzaW9uXzA1NV90ZXN0KSB7Ci0gIEVYUEVDVF9FUShjb250cm9sbGVyXy0+R2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCkudmVyc2lvbl9zdXBwb3J0ZWRfLCA1NSk7Ci0gIEVYUEVDVF9UUlVFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX01VTFRJX0FEVlQpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkNPTlRST0xMRVJfREVCVUdfSU5GTykpOwotICBFWFBFQ1RfRkFMU0UoY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKE9wQ29kZTo6Q09OVFJPTExFUl9BMkRQX09QQ09ERSkpOwotICBmZWF0dXJlX3NwZWNfdmVyc2lvbiA9IDk1OwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIGZlYXR1cmVfc3BlY192ZXJzaW9uXzA5NV90ZXN0KSB7Ci0gIEVYUEVDVF9FUShjb250cm9sbGVyXy0+R2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCkudmVyc2lvbl9zdXBwb3J0ZWRfLCA5NSk7Ci0gIEVYUEVDVF9UUlVFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX01VTFRJX0FEVlQpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkNPTlRST0xMRVJfREVCVUdfSU5GTykpOwotICBFWFBFQ1RfRkFMU0UoY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKE9wQ29kZTo6Q09OVFJPTExFUl9BMkRQX09QQ09ERSkpOwotICBmZWF0dXJlX3NwZWNfdmVyc2lvbiA9IDk2OwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIGZlYXR1cmVfc3BlY192ZXJzaW9uXzA5Nl90ZXN0KSB7Ci0gIEVYUEVDVF9FUShjb250cm9sbGVyXy0+R2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCkudmVyc2lvbl9zdXBwb3J0ZWRfLCA5Nik7Ci0gIEVYUEVDVF9UUlVFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX01VTFRJX0FEVlQpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkNPTlRST0xMRVJfREVCVUdfSU5GTykpOwotICBFWFBFQ1RfRkFMU0UoY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKE9wQ29kZTo6Q09OVFJPTExFUl9BMkRQX09QQ09ERSkpOwotICBmZWF0dXJlX3NwZWNfdmVyc2lvbiA9IDk4OwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIGZlYXR1cmVfc3BlY192ZXJzaW9uXzA5OF90ZXN0KSB7Ci0gIEVYUEVDVF9FUShjb250cm9sbGVyXy0+R2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCkudmVyc2lvbl9zdXBwb3J0ZWRfLCA5OCk7Ci0gIEVYUEVDVF9UUlVFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkxFX01VTFRJX0FEVlQpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbnRyb2xsZXJfLT5Jc1N1cHBvcnRlZChPcENvZGU6OkNPTlRST0xMRVJfREVCVUdfSU5GTykpOwotICBFWFBFQ1RfVFJVRShjb250cm9sbGVyXy0+SXNTdXBwb3J0ZWQoT3BDb2RlOjpDT05UUk9MTEVSX0EyRFBfT1BDT0RFKSk7Ci19Ci0KLXN0ZDo6cHJvbWlzZTx2b2lkPiBjcmVkaXRzMV9zZXQ7Ci1zdGQ6OnByb21pc2U8dm9pZD4gY3JlZGl0czJfc2V0OwotCi12b2lkIENoZWNrUmVjZWl2ZWRDcmVkaXRzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY3JlZGl0cykgewotICBzd2l0Y2ggKGhhbmRsZSkgewotICAgIGNhc2UgKGtIYW5kbGUxKToKLSAgICAgIEFTU0VSVF9FUShrQ3JlZGl0czEsIGNyZWRpdHMpOwotICAgICAgY3JlZGl0czFfc2V0LnNldF92YWx1ZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAoa0hhbmRsZTIpOgotICAgICAgQVNTRVJUX0VRKGtDcmVkaXRzMiwgY3JlZGl0cyk7Ci0gICAgICBjcmVkaXRzMl9zZXQuc2V0X3ZhbHVlKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUX0xPRyhmYWxzZSwgIlVua25vd24gaGFuZGxlIDB4JTBoeCB3aXRoIDB4JTBoeCBjcmVkaXRzIiwgaGFuZGxlLCBjcmVkaXRzKTsKLSAgfQotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIGFjbENyZWRpdENhbGxiYWNrc1Rlc3QpIHsKLSAgY29udHJvbGxlcl8tPlJlZ2lzdGVyQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKGNsaWVudF9oYW5kbGVyXy0+QmluZCgmQ2hlY2tSZWNlaXZlZENyZWRpdHMpKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nQ3JlZGl0KCk7Ci0KLSAgY3JlZGl0czFfc2V0LmdldF9mdXR1cmUoKS53YWl0KCk7Ci0gIGNyZWRpdHMyX3NldC5nZXRfZnV0dXJlKCkud2FpdCgpOwotfQotCi1URVNUX0YoQ29udHJvbGxlclRlc3QsIGFjbENyZWRpdENhbGxiYWNrTGlzdGVuZXJVbnJlZ2lzdGVyZWQpIHsKLSAgb3M6OlRocmVhZCB0aHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gIG9zOjpIYW5kbGVyIGhhbmRsZXIoJnRocmVhZCk7Ci0gIGNvbnRyb2xsZXJfLT5SZWdpc3RlckNvbXBsZXRlZEFjbFBhY2tldHNDYWxsYmFjayhoYW5kbGVyLkJpbmQoJkNoZWNrUmVjZWl2ZWRDcmVkaXRzKSk7Ci0KLSAgaGFuZGxlci5DbGVhcigpOwotICBoYW5kbGVyLldhaXRVbnRpbFN0b3BwZWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKLSAgY29udHJvbGxlcl8tPlVucmVnaXN0ZXJDb21wbGV0ZWRBY2xQYWNrZXRzQ2FsbGJhY2soKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nQ3JlZGl0KCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9lbnVtX2hlbHBlci5oIGIvZ2QvaGNpL2VudW1faGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYmMzYzcuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2VudW1faGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLS8vIERlZmluZSBuZXcgZW51bXMgb3IgcGFyc2VycyBmb3IgZXhpc3RpbmcgZW51bXMKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLS8vIE11c3QgYmUgMGIwMCwgMGIwMSwgMGIxMCwgYW5kIDBiMTEgYXMgdGhpcyBpcyBhIGJpdCBtYXNrCi1lbnVtIERldmljZVR5cGUgeyBVTktOT1dOID0gMCwgQlJfRURSID0gMSwgTEUgPSAyLCBEVUFMID0gMyB9OwotCi0vLyBTY2FuIG1vZGUgZnJvbSBsZWdhY3kgc3RhY2ssIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIGhjaTo6U2NhbkVuYWJsZQotZW51bSBMZWdhY3lTY2FuTW9kZSB7IEJUX1NDQU5fTU9ERV9OT05FID0gMCwgQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFID0gMSwgQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSA9IDIgfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotCi0vLyBNdXN0IGJlIGRlZmluZWQgaW4gYmx1ZXRvb3RoIG5hbWVzcGFjZQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZV92PFQsIGhjaTo6RGV2aWNlVHlwZT4sIGludD46OnR5cGUgPSAwPgotc3RkOjpvcHRpb25hbDxoY2k6OkRldmljZVR5cGU+IEZyb21MZWdhY3lDb25maWdTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBhdXRvIHJhd192YWx1ZSA9IGNvbW1vbjo6SW50NjRGcm9tU3RyaW5nKHN0cik7Ci0gIGlmICghcmF3X3ZhbHVlKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAoKnJhd192YWx1ZSA8IGhjaTo6RGV2aWNlVHlwZTo6VU5LTk9XTiB8fCAqcmF3X3ZhbHVlID4gaGNpOjpEZXZpY2VUeXBlOjpEVUFMKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8aGNpOjpEZXZpY2VUeXBlPigqcmF3X3ZhbHVlKTsKLX0KLQotLy8gTXVzdCBiZSBkZWZpbmVkIGluIGJsdWV0b290aCBuYW1lc3BhY2UKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWVfdjxULCBoY2k6OkFkZHJlc3NUeXBlPiwgaW50Pjo6dHlwZSA9IDA+Ci1zdGQ6Om9wdGlvbmFsPGhjaTo6QWRkcmVzc1R5cGU+IEZyb21MZWdhY3lDb25maWdTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBhdXRvIHJhd192YWx1ZSA9IGNvbW1vbjo6SW50NjRGcm9tU3RyaW5nKHN0cik7Ci0gIGlmICghcmF3X3ZhbHVlKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAoKnJhd192YWx1ZSA8IHN0YXRpY19jYXN0PGludDY0X3Q+KGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUykgfHwKLSAgICAgICpyYXdfdmFsdWUgPiBzdGF0aWNfY2FzdDxpbnQ2NF90PihoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fSURFTlRJVFlfQUREUkVTUykpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxoY2k6OkFkZHJlc3NUeXBlPigqcmF3X3ZhbHVlKTsKLX0KLQotLy8gTXVzdCBiZSBkZWZpbmVkIGluIGJsdWV0b290aCBuYW1lc3BhY2UKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWVfdjxULCBoY2k6OktleVR5cGU+LCBpbnQ+Ojp0eXBlID0gMD4KLXN0ZDo6b3B0aW9uYWw8aGNpOjpLZXlUeXBlPiBGcm9tTGVnYWN5Q29uZmlnU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgYXV0byByYXdfdmFsdWUgPSBjb21tb246OkludDY0RnJvbVN0cmluZyhzdHIpOwotICBpZiAoIXJhd192YWx1ZSkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgaWYgKCpyYXdfdmFsdWUgPCBzdGF0aWNfY2FzdDxpbnQ2NF90PihoY2k6OktleVR5cGU6OkNPTUJJTkFUSU9OKSB8fAotICAgICAgKnJhd192YWx1ZSA+IHN0YXRpY19jYXN0PGludDY0X3Q+KGhjaTo6S2V5VHlwZTo6QVVUSEVOVElDQVRFRF9QMjU2KSkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGhjaTo6S2V5VHlwZT4oKnJhd192YWx1ZSk7Ci19Ci0KLS8vIE11c3QgYmUgZGVmaW5lZCBpbiBibHVldG9vdGggbmFtZXNwYWNlCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lX3Y8VCwgaGNpOjpMZWdhY3lTY2FuTW9kZT4sIGludD46OnR5cGUgPSAwPgotc3RkOjpvcHRpb25hbDxoY2k6OkxlZ2FjeVNjYW5Nb2RlPiBGcm9tTGVnYWN5Q29uZmlnU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgYXV0byByYXdfdmFsdWUgPSBjb21tb246OkludDY0RnJvbVN0cmluZyhzdHIpOwotICBpZiAoIXJhd192YWx1ZSkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgaWYgKCpyYXdfdmFsdWUgPCBzdGF0aWNfY2FzdDxpbnQ2NF90PihoY2k6OkxlZ2FjeVNjYW5Nb2RlOjpCVF9TQ0FOX01PREVfTk9ORSkgfHwKLSAgICAgICpyYXdfdmFsdWUgPiBzdGF0aWNfY2FzdDxpbnQ2NF90PihoY2k6OkxlZ2FjeVNjYW5Nb2RlOjpCVF9TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFKSkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGhjaTo6TGVnYWN5U2Nhbk1vZGU+KCpyYXdfdmFsdWUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUuY2MgYi9nZC9oY2kvZmFjYWRlL2FjbF9tYW5hZ2VyX2ZhY2FkZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyM2Q5Zi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZmFjYWRlL2FjbF9tYW5hZ2VyX2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUuaCIKLQotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImdycGMvZ3JwY19ldmVudF9xdWV1ZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2NsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgImhjaS9mYWNhZGUvYWNsX21hbmFnZXJfZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2FjbF9tYW5hZ2VyX2ZhY2FkZS5wYi5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi11c2luZyA6OmdycGM6OlNlcnZlckFzeW5jUmVzcG9uc2VXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckFzeW5jV3JpdGVyOwotdXNpbmcgOjpncnBjOjpTZXJ2ZXJDb250ZXh0OwotCi11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLXVzaW5nIGFjbF9tYW5hZ2VyOjpDbGFzc2ljQWNsQ29ubmVjdGlvbjsKLXVzaW5nIGFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uQ2FsbGJhY2tzOwotdXNpbmcgYWNsX21hbmFnZXI6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOwotCi1jbGFzcyBBY2xNYW5hZ2VyRmFjYWRlU2VydmljZSA6IHB1YmxpYyBBY2xNYW5hZ2VyRmFjYWRlOjpTZXJ2aWNlLCBwdWJsaWMgQ29ubmVjdGlvbkNhbGxiYWNrcyB7Ci0gcHVibGljOgotICBBY2xNYW5hZ2VyRmFjYWRlU2VydmljZShBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlciwgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcikKLSAgICAgIDogYWNsX21hbmFnZXJfKGFjbF9tYW5hZ2VyKSwgZmFjYWRlX2hhbmRsZXJfKGZhY2FkZV9oYW5kbGVyKSB7Ci0gICAgYWNsX21hbmFnZXJfLT5SZWdpc3RlckNhbGxiYWNrcyh0aGlzLCBmYWNhZGVfaGFuZGxlcl8pOwotICB9Ci0KLSAgfkFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlKCkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhhY2xfY29ubmVjdGlvbnNfbXV0ZXhfKTsKLSAgICBmb3IgKGF1dG8mIGNvbm5lY3Rpb24gOiBhY2xfY29ubmVjdGlvbnNfKSB7Ci0gICAgICBjb25uZWN0aW9uLnNlY29uZC5jb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICB9Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBDcmVhdGVDb25uZWN0aW9uKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgQ29ubmVjdGlvbk1zZyogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPENvbm5lY3Rpb25FdmVudD4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIEFkZHJlc3MgcGVlcjsKLSAgICBBU1NFUlQoQWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUNvbm5lY3Rpb24ocGVlcik7Ci0gICAgaWYgKHBlcl9jb25uZWN0aW9uX2V2ZW50c18uc2l6ZSgpID4gY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpSRVNPVVJDRV9FWEhBVVNURUQsICJPbmx5IG9uZSBvdXRzdGFuZGluZyByZXF1ZXN0IGlzIHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBwZXJfY29ubmVjdGlvbl9ldmVudHNfLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxDb25uZWN0aW9uRXZlbnQ+PigKLSAgICAgICAgc3RkOjpzdHJpbmcoImNvbm5lY3Rpb24gYXR0ZW1wdCAiKSArIHN0ZDo6dG9fc3RyaW5nKGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0XykpKTsKLSAgICByZXR1cm4gcGVyX2Nvbm5lY3Rpb25fZXZlbnRzX1tjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF9dLT5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBEaXNjb25uZWN0KAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBIYW5kbGVNc2cqIHJlcXVlc3QsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGFjbF9jb25uZWN0aW9uc19tdXRleF8pOwotICAgIGF1dG8gY29ubmVjdGlvbiA9IGFjbF9jb25uZWN0aW9uc18uZmluZChyZXF1ZXN0LT5oYW5kbGUoKSk7Ci0gICAgaWYgKGNvbm5lY3Rpb24gPT0gYWNsX2Nvbm5lY3Rpb25zXy5lbmQoKSkgewotICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGhhbmRsZSIpOwotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6SU5WQUxJRF9BUkdVTUVOVCwgIkludmFsaWQgaGFuZGxlIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+RGlzY29ubmVjdChEaXNjb25uZWN0UmVhc29uOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04pOwotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICB9Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBBdXRoZW50aWNhdGlvblJlcXVlc3RlZCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgSGFuZGxlTXNnKiByZXF1ZXN0LCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhhY2xfY29ubmVjdGlvbnNfbXV0ZXhfKTsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIGlmIChjb25uZWN0aW9uID09IGFjbF9jb25uZWN0aW9uc18uZW5kKCkpIHsKLSAgICAgIExPR19FUlJPUigiSW52YWxpZCBoYW5kbGUiKTsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGhhbmRsZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPkF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKCk7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgIH0KLSAgfTsKLQotI2RlZmluZSBHRVRfQ09OTkVDVElPTih2aWV3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RkOjptYXA8dWludDE2X3QsIENvbm5lY3Rpb24+OjppdGVyYXRvciBjb25uZWN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghdmlldy5Jc1ZhbGlkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGhhbmRsZSIpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhhY2xfY29ubmVjdGlvbnNfbXV0ZXhfKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25uZWN0aW9uID0gYWNsX2Nvbm5lY3Rpb25zXy5maW5kKHZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpKTsgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvbm5lY3Rpb24gPT0gYWNsX2Nvbm5lY3Rpb25zXy5lbmQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6SU5WQUxJRF9BUkdVTUVOVCwgIkludmFsaWQgaGFuZGxlIik7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSAgOjpncnBjOjpTdGF0dXMgQ29ubmVjdGlvbkNvbW1hbmQoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBDb25uZWN0aW9uQ29tbWFuZE1zZyogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4oCi0gICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihyZXF1ZXN0LT5wYWNrZXQoKS5iZWdpbigpLCByZXF1ZXN0LT5wYWNrZXQoKS5lbmQoKSkpKSkpOwotICAgIGlmICghY29tbWFuZF92aWV3LklzVmFsaWQoKSkgewotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6SU5WQUxJRF9BUkdVTUVOVCwgIkludmFsaWQgY29tbWFuZCBwYWNrZXQiKTsKLSAgICB9Ci0gICAgc3dpdGNoIChjb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpIHsKLSAgICAgIGNhc2UgT3BDb2RlOjpBVVRIRU5USUNBVElPTl9SRVFVRVNURUQ6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oQXV0aGVudGljYXRpb25SZXF1ZXN0ZWRWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+QXV0aGVudGljYXRpb25SZXF1ZXN0ZWQoKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpESVNDT05ORUNUOiB7Ci0gICAgICAgIGF1dG8gdmlldyA9IERpc2Nvbm5lY3RWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KTsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04odmlldyk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+RGlzY29ubmVjdCh2aWV3LkdldFJlYXNvbigpKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpDSEFOR0VfQ09OTkVDVElPTl9QQUNLRVRfVFlQRTogewotICAgICAgICBhdXRvIHZpZXcgPSBDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZVZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpOwotICAgICAgICBHRVRfQ09OTkVDVElPTih2aWV3KTsKLSAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLmNvbm5lY3Rpb25fLT5DaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZSh2aWV3LkdldFBhY2tldFR5cGUoKSk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6U0VUX0NPTk5FQ1RJT05fRU5DUllQVElPTjogewotICAgICAgICBhdXRvIHZpZXcgPSBTZXRDb25uZWN0aW9uRW5jcnlwdGlvblZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpOwotICAgICAgICBHRVRfQ09OTkVDVElPTih2aWV3KTsKLSAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLmNvbm5lY3Rpb25fLT5TZXRDb25uZWN0aW9uRW5jcnlwdGlvbih2aWV3LkdldEVuY3J5cHRpb25FbmFibGUoKSk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6Q0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVk6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXkoKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpSRUFEX0NMT0NLX09GRlNFVDogewotICAgICAgICBHRVRfQ09OTkVDVElPTihSZWFkQ2xvY2tPZmZzZXRWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+UmVhZENsb2NrT2Zmc2V0KCk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6SE9MRF9NT0RFOiB7Ci0gICAgICAgIGF1dG8gdmlldyA9IEhvbGRNb2RlVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldyk7Ci0gICAgICAgIEdFVF9DT05ORUNUSU9OKHZpZXcpOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPkhvbGRNb2RlKHZpZXcuR2V0SG9sZE1vZGVNYXhJbnRlcnZhbCgpLCB2aWV3LkdldEhvbGRNb2RlTWluSW50ZXJ2YWwoKSk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6U05JRkZfTU9ERTogewotICAgICAgICBhdXRvIHZpZXcgPSBTbmlmZk1vZGVWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KTsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04odmlldyk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+U25pZmZNb2RlKAotICAgICAgICAgICAgdmlldy5HZXRTbmlmZk1heEludGVydmFsKCksIHZpZXcuR2V0U25pZmZNaW5JbnRlcnZhbCgpLCB2aWV3LkdldFNuaWZmQXR0ZW1wdCgpLCB2aWV3LkdldFNuaWZmVGltZW91dCgpKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpFWElUX1NOSUZGX01PREU6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oRXhpdFNuaWZmTW9kZVZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpKTsKLSAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLmNvbm5lY3Rpb25fLT5FeGl0U25pZmZNb2RlKCk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6RkxVU0g6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oRmx1c2hWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+Rmx1c2goKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpSRUFEX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUOiB7Ci0gICAgICAgIEdFVF9DT05ORUNUSU9OKFJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXRWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+UmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dCgpOwotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgICAgfQotICAgICAgY2FzZSBPcENvZGU6OldSSVRFX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUOiB7Ci0gICAgICAgIGF1dG8gdmlldyA9IFdyaXRlQXV0b21hdGljRmx1c2hUaW1lb3V0Vmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldyk7Ci0gICAgICAgIEdFVF9DT05ORUNUSU9OKHZpZXcpOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPldyaXRlQXV0b21hdGljRmx1c2hUaW1lb3V0KHZpZXcuR2V0Rmx1c2hUaW1lb3V0KCkpOwotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgICAgfQotICAgICAgY2FzZSBPcENvZGU6OlJFQURfVFJBTlNNSVRfUE9XRVJfTEVWRUw6IHsKLSAgICAgICAgYXV0byB2aWV3ID0gUmVhZFRyYW5zbWl0UG93ZXJMZXZlbFZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpOwotICAgICAgICBHRVRfQ09OTkVDVElPTih2aWV3KTsKLSAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLmNvbm5lY3Rpb25fLT5SZWFkVHJhbnNtaXRQb3dlckxldmVsKHZpZXcuR2V0VHJhbnNtaXRQb3dlckxldmVsVHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpSRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVDogewotICAgICAgICBHRVRfQ09OTkVDVElPTihSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dFZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpKTsKLSAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLmNvbm5lY3Rpb25fLT5SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCgpOwotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgICAgfQotICAgICAgY2FzZSBPcENvZGU6OldSSVRFX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVDogewotICAgICAgICBhdXRvIHZpZXcgPSBXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXRWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KTsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04odmlldyk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+V3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KHZpZXcuR2V0TGlua1N1cGVydmlzaW9uVGltZW91dCgpKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpSRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVI6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldykpOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPlJlYWRGYWlsZWRDb250YWN0Q291bnRlcigpOwotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgICAgfQotICAgICAgY2FzZSBPcENvZGU6OlJFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVI6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oUmVzZXRGYWlsZWRDb250YWN0Q291bnRlclZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpKTsKLSAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLmNvbm5lY3Rpb25fLT5SZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKCk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6UkVBRF9MSU5LX1FVQUxJVFk6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oUmVhZExpbmtRdWFsaXR5Vmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldykpOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPlJlYWRMaW5rUXVhbGl0eSgpOwotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgICAgfQotICAgICAgY2FzZSBPcENvZGU6OlJFQURfQUZIX0NIQU5ORUxfTUFQOiB7Ci0gICAgICAgIEdFVF9DT05ORUNUSU9OKFJlYWRBZmhDaGFubmVsTWFwVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldykpOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPlJlYWRBZmhDaGFubmVsTWFwKCk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6UkVBRF9SU1NJOiB7Ci0gICAgICAgIEdFVF9DT05ORUNUSU9OKFJlYWRSc3NpVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldykpOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPlJlYWRSc3NpKCk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6UkVBRF9DTE9DSzogewotICAgICAgICBhdXRvIHZpZXcgPSBSZWFkQ2xvY2tWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KTsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04odmlldyk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+UmVhZENsb2NrKHZpZXcuR2V0V2hpY2hDbG9jaygpKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGNhc2UgT3BDb2RlOjpSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OOiB7Ci0gICAgICAgIEdFVF9DT05ORUNUSU9OKFJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25WaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+UmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpOwotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgICAgfQotICAgICAgY2FzZSBPcENvZGU6OlJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFUzogewotICAgICAgICBHRVRfQ09OTkVDVElPTihSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXNWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+UmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzKCk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9wQ29kZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVM6IHsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04oUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KSk7Ci0gICAgICAgIHVpbnQ4X3QgcGFnZV9udW1iZXIgPSAwOwotICAgICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKHBhZ2VfbnVtYmVyKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGNvbW1hbmQgcGFja2V0Iik7Ci0gICAgfQotICB9Ci0jdW5kZWYgR0VUX0NPTk5FQ1RJT04KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaEluY29taW5nQ29ubmVjdGlvbigKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8Q29ubmVjdGlvbkV2ZW50Piogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgaWYgKHBlcl9jb25uZWN0aW9uX2V2ZW50c18uc2l6ZSgpID4gY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpSRVNPVVJDRV9FWEhBVVNURUQsICJPbmx5IG9uZSBvdXRzdGFuZGluZyBjb25uZWN0aW9uIGlzIHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBwZXJfY29ubmVjdGlvbl9ldmVudHNfLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxDb25uZWN0aW9uRXZlbnQ+PigKLSAgICAgICAgc3RkOjpzdHJpbmcoImluY29taW5nIGNvbm5lY3Rpb24gIikgKyBzdGQ6OnRvX3N0cmluZyhjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF8pKSk7Ci0gICAgcmV0dXJuIHBlcl9jb25uZWN0aW9uX2V2ZW50c19bY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfXS0+UnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2VuZEFjbERhdGEoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IEFjbERhdGEqIHJlcXVlc3QsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soYWNsX2Nvbm5lY3Rpb25zX211dGV4Xyk7Ci0gICAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gYWNsX2Nvbm5lY3Rpb25zXy5lbmQoKSkgewotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiSW52YWxpZCBoYW5kbGUiKTsKLSAgICAgIH0KLSAgICAgIC8vIFRPRE86IFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgY29ubmVjdGlvbiBtYXkgaGF2ZSBnb25lCi0gICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPkdldEFjbFF1ZXVlRW5kKCktPlJlZ2lzdGVyRW5xdWV1ZSgKLSAgICAgICAgICBmYWNhZGVfaGFuZGxlcl8sCi0gICAgICAgICAgY29tbW9uOjpCaW5kKAotICAgICAgICAgICAgICAmQWNsTWFuYWdlckZhY2FkZVNlcnZpY2U6OmVucXVldWVfcGFja2V0LAotICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChyZXF1ZXN0KSwKLSAgICAgICAgICAgICAgY29tbW9uOjpQYXNzZWQoc3RkOjptb3ZlKHByb21pc2UpKSkpOwotICAgICAgYXV0byBzdGF0dXMgPSBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSk7Ci0gICAgICBpZiAoc3RhdHVzICE9IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6UkVTT1VSQ0VfRVhIQVVTVEVELCAiQ2FuJ3Qgc2VuZCBwYWNrZXQiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gZW5xdWV1ZV9wYWNrZXQoY29uc3QgQWNsRGF0YSogcmVxdWVzdCwgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIEFTU0VSVF9MT0coY29ubmVjdGlvbiAhPSBhY2xfY29ubmVjdGlvbnNfLmVuZCgpLCAiaGFuZGxlICVkIiwgcmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKS0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmF3QnVpbGRlcj4gcGFja2V0ID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihzdGQ6OnZlY3Rvcjx1aW50OF90PihyZXF1ZXN0LT5wYXlsb2FkKCkuYmVnaW4oKSwgcmVxdWVzdC0+cGF5bG9hZCgpLmVuZCgpKSk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICByZXR1cm4gcGFja2V0OwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hBY2xEYXRhKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBIYW5kbGVNc2cqIHJlcXVlc3QsIDo6Z3JwYzo6U2VydmVyV3JpdGVyPEFjbERhdGE+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIGlmIChjb25uZWN0aW9uID09IGFjbF9jb25uZWN0aW9uc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGhhbmRsZSIpOwotICAgIH0KLSAgICByZXR1cm4gY29ubmVjdGlvbi0+c2Vjb25kLnBlbmRpbmdfYWNsX2RhdGFfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdWludDE2X3QgdG9faGFuZGxlKHVpbnQzMl90IGN1cnJlbnRfcmVxdWVzdCkgewotICAgIHJldHVybiAoY3VycmVudF9yZXF1ZXN0ICsgMHgxMCkgJSAweGUwMDsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgYnVpbGRlcl90b19zdHJpbmcoc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBidWlsZGVyKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7Ci0gICAgQml0SW5zZXJ0ZXIgYml0X2luc2VydGVyKGJ5dGVzKTsKLSAgICBidWlsZGVyLT5TZXJpYWxpemUoYml0X2luc2VydGVyKTsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoYnl0ZXMuYmVnaW4oKSwgYnl0ZXMuZW5kKCkpOwotICB9Ci0KLSAgdm9pZCBvbl9pbmNvbWluZ19hY2woc3RkOjpzaGFyZWRfcHRyPENsYXNzaWNBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgICBhdXRvIHBhY2tldCA9IGNvbm5lY3Rpb24tPkdldEFjbFF1ZXVlRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBhdXRvIGNvbm5lY3Rpb25fdHJhY2tlciA9IGFjbF9jb25uZWN0aW9uc18uZmluZChoYW5kbGUpOwotICAgIEFTU0VSVF9MT0coY29ubmVjdGlvbl90cmFja2VyICE9IGFjbF9jb25uZWN0aW9uc18uZW5kKCksICJoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIEFjbERhdGEgYWNsX2RhdGE7Ci0gICAgYWNsX2RhdGEuc2V0X2hhbmRsZShoYW5kbGUpOwotICAgIGFjbF9kYXRhLnNldF9wYXlsb2FkKHN0ZDo6c3RyaW5nKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSkpOwotICAgIGNvbm5lY3Rpb25fdHJhY2tlci0+c2Vjb25kLnBlbmRpbmdfYWNsX2RhdGFfLk9uSW5jb21pbmdFdmVudChhY2xfZGF0YSk7Ci0gIH0KLQotICB2b2lkIE9uQ29ubmVjdFN1Y2Nlc3Moc3RkOjp1bmlxdWVfcHRyPENsYXNzaWNBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGFjbF9jb25uZWN0aW9uc19tdXRleF8pOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGFzc2ljQWNsQ29ubmVjdGlvbj4gc2hhcmVkX2Nvbm5lY3Rpb24gPSBzdGQ6Om1vdmUoY29ubmVjdGlvbik7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gdG9faGFuZGxlKGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0Xyk7Ci0gICAgYWNsX2Nvbm5lY3Rpb25zXy5lbXBsYWNlKAotICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCi0gICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShoYW5kbGUpLAotICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlLCBzaGFyZWRfY29ubmVjdGlvbiwgcGVyX2Nvbm5lY3Rpb25fZXZlbnRzX1tjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF9dKSk7Ci0gICAgc2hhcmVkX2Nvbm5lY3Rpb24tPkdldEFjbFF1ZXVlRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgZmFjYWRlX2hhbmRsZXJfLAotICAgICAgICBjb21tb246OkJpbmQoJkFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlOjpvbl9pbmNvbWluZ19hY2wsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgc2hhcmVkX2Nvbm5lY3Rpb24sIGhhbmRsZSkpOwotICAgIGF1dG8gY2FsbGJhY2tzID0gYWNsX2Nvbm5lY3Rpb25zXy5maW5kKGhhbmRsZSktPnNlY29uZC5HZXRDYWxsYmFja3MoKTsKLSAgICBzaGFyZWRfY29ubmVjdGlvbi0+UmVnaXN0ZXJDYWxsYmFja3MoY2FsbGJhY2tzLCBmYWNhZGVfaGFuZGxlcl8pOwotICAgIGF1dG8gYWRkciA9IHNoYXJlZF9jb25uZWN0aW9uLT5HZXRBZGRyZXNzKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgICAgQ29ubmVjdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlLCBhZGRyLCBMaW5rVHlwZTo6QUNMLCBFbmFibGU6OkRJU0FCTEVEKTsKLSAgICBDb25uZWN0aW9uRXZlbnQgc3VjY2VzczsKLSAgICBzdWNjZXNzLnNldF9wYXlsb2FkKGJ1aWxkZXJfdG9fc3RyaW5nKHN0ZDo6bW92ZShidWlsZGVyKSkpOwotICAgIHBlcl9jb25uZWN0aW9uX2V2ZW50c19bY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfXS0+T25JbmNvbWluZ0V2ZW50KHN1Y2Nlc3MpOwotICAgIGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0XysrOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3RGYWlsKEFkZHJlc3MgYWRkcmVzcywgRXJyb3JDb2RlIHJlYXNvbikgb3ZlcnJpZGUgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gYnVpbGRlciA9Ci0gICAgICAgIENvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShyZWFzb24sIDAsIGFkZHJlc3MsIExpbmtUeXBlOjpBQ0wsIEVuYWJsZTo6RElTQUJMRUQpOwotICAgIENvbm5lY3Rpb25FdmVudCBmYWlsOwotICAgIGZhaWwuc2V0X3BheWxvYWQoYnVpbGRlcl90b19zdHJpbmcoc3RkOjptb3ZlKGJ1aWxkZXIpKSk7Ci0gICAgcGVyX2Nvbm5lY3Rpb25fZXZlbnRzX1tjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF9dLT5PbkluY29taW5nRXZlbnQoZmFpbCk7Ci0gICAgY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfKys7Ci0gIH0KLQotICB2b2lkIEhBQ0tfT25Fc2NvQ29ubmVjdFJlcXVlc3QoQWRkcmVzcyBhZGRyZXNzLCBDbGFzc09mRGV2aWNlIGNvZCkgb3ZlcnJpZGUgewotICAgIExPR19FUlJPUigiUmVtb3RlIEVTQ08gY29ubmVjdCByZXF1ZXN0IHVuaW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIHZvaWQgSEFDS19PblNjb0Nvbm5lY3RSZXF1ZXN0KEFkZHJlc3MgYWRkcmVzcywgQ2xhc3NPZkRldmljZSBjb2QpIG92ZXJyaWRlIHsKLSAgICBMT0dfRVJST1IoIlJlbW90ZSBTQ08gY29ubmVjdCByZXF1ZXN0IHVuaW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIGNsYXNzIENvbm5lY3Rpb24gOiBwdWJsaWMgQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MgewotICAgcHVibGljOgotICAgIENvbm5lY3Rpb24oCi0gICAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENsYXNzaWNBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uLAotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPENvbm5lY3Rpb25FdmVudD4+IGV2ZW50X3N0cmVhbSkKLSAgICAgICAgOiBoYW5kbGVfKGhhbmRsZSksIGNvbm5lY3Rpb25fKHN0ZDo6bW92ZShjb25uZWN0aW9uKSksIGV2ZW50X3N0cmVhbV8oc3RkOjptb3ZlKGV2ZW50X3N0cmVhbSkpIHt9Ci0KLSAgICBDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogR2V0Q2FsbGJhY2tzKCkgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgdm9pZCBPbkNlbnRyYWxMaW5rS2V5Q29tcGxldGUoS2V5RmxhZyBrZXlfZmxhZykgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oImtleV9mbGFnOiVzIiwgS2V5RmxhZ1RleHQoa2V5X2ZsYWcpLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHZvaWQgT25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIFJvbGUgbmV3X3JvbGUpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKCJuZXdfcm9sZTolZCIsICh1aW50OF90KW5ld19yb2xlKTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlKHVpbnQxNl90IGxpbmtfcG9saWN5X3NldHRpbmdzKSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygibGlua19wb2xpY3lfc2V0dGluZ3M6JWQiLCBsaW5rX3BvbGljeV9zZXR0aW5ncyk7Ci0gICAgfQotCi0gICAgdm9pZCBPbkNvbm5lY3Rpb25QYWNrZXRUeXBlQ2hhbmdlZCh1aW50MTZfdCBwYWNrZXRfdHlwZSkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uQ29ubmVjdGlvblBhY2tldFR5cGVDaGFuZ2VkIHBhY2tldF90eXBlOiVkIiwgcGFja2V0X3R5cGUpOwotICAgIH0KLQotICAgIHZvaWQgT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKCJPbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUiKTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uRW5jcnlwdGlvbkNoYW5nZShFbmNyeXB0aW9uRW5hYmxlZCBlbmFibGVkKSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygiT25Db25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWQgZW5hYmxlZDolZCIsICh1aW50OF90KWVuYWJsZWQpOwotICAgIH0KLQotICAgIHZvaWQgT25DaGFuZ2VDb25uZWN0aW9uTGlua0tleUNvbXBsZXRlKCkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZSIpOwotICAgIH07Ci0KLSAgICB2b2lkIE9uUmVhZENsb2NrT2Zmc2V0Q29tcGxldGUodWludDE2X3QgY2xvY2tfb2Zmc2V0KSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygiT25SZWFkQ2xvY2tPZmZzZXRDb21wbGV0ZSBjbG9ja19vZmZzZXQ6JWQiLCBjbG9ja19vZmZzZXQpOwotICAgIH07Ci0KLSAgICB2b2lkIE9uTW9kZUNoYW5nZShFcnJvckNvZGUgc3RhdHVzLCBNb2RlIGN1cnJlbnRfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKCJPbk1vZGVDaGFuZ2UgTW9kZTolZCwgaW50ZXJ2YWw6JWQiLCAodWludDhfdCljdXJyZW50X21vZGUsIGludGVydmFsKTsKLSAgICB9OwotCi0gICAgdm9pZCBPblNuaWZmU3VicmF0aW5nKAotICAgICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICAgIHVpbnQxNl90IG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKAotICAgICAgICAgICJPblNuaWZmU3VicmF0aW5nIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeTolZCwgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3k6JWQiCi0gICAgICAgICAgIiBtaW5pbXVtX3JlbW90ZV90aW1lb3V0OiVkIG1pbmltdW1fbG9jYWxfdGltZW91dDolZCIsCi0gICAgICAgICAgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LAotICAgICAgICAgIG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgICAgICAgIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgbWluaW11bV9sb2NhbF90aW1lb3V0KTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uUW9zU2V0dXBDb21wbGV0ZSgKLSAgICAgICAgU2VydmljZVR5cGUgc2VydmljZV90eXBlLAotICAgICAgICB1aW50MzJfdCB0b2tlbl9yYXRlLAotICAgICAgICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICAiT25Rb3NTZXR1cENvbXBsZXRlIHNlcnZpY2VfdHlwZTolZCwgdG9rZW5fcmF0ZTolZCwgcGVha19iYW5kd2lkdGg6JWQsIGxhdGVuY3k6JWQsIGRlbGF5X3ZhcmlhdGlvbjolZCIsCi0gICAgICAgICAgKHVpbnQ4X3Qpc2VydmljZV90eXBlLAotICAgICAgICAgIHRva2VuX3JhdGUsCi0gICAgICAgICAgcGVha19iYW5kd2lkdGgsCi0gICAgICAgICAgbGF0ZW5jeSwKLSAgICAgICAgICBkZWxheV92YXJpYXRpb24pOwotICAgIH0KLQotICAgIHZvaWQgT25GbG93U3BlY2lmaWNhdGlvbkNvbXBsZXRlKAotICAgICAgICBGbG93RGlyZWN0aW9uIGZsb3dfZGlyZWN0aW9uLAotICAgICAgICBTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsCi0gICAgICAgIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgIHVpbnQzMl90IHRva2VuX2J1Y2tldF9zaXplLAotICAgICAgICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgdWludDMyX3QgYWNjZXNzX2xhdGVuY3kpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKAotICAgICAgICAgICJPbkZsb3dTcGVjaWZpY2F0aW9uQ29tcGxldGUgZmxvd19kaXJlY3Rpb246JWQuIHNlcnZpY2VfdHlwZTolZCwgdG9rZW5fcmF0ZTolZCwgdG9rZW5fYnVja2V0X3NpemU6JWQsICIKLSAgICAgICAgICAicGVha19iYW5kd2lkdGg6JWQsIGFjY2Vzc19sYXRlbmN5OiVkIiwKLSAgICAgICAgICAodWludDhfdClmbG93X2RpcmVjdGlvbiwKLSAgICAgICAgICAodWludDhfdClzZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgdG9rZW5fcmF0ZSwKLSAgICAgICAgICB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgICAgICBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgICBhY2Nlc3NfbGF0ZW5jeSk7Ci0gICAgfQotCi0gICAgdm9pZCBPbkZsdXNoT2NjdXJyZWQoKSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygiT25GbHVzaE9jY3VycmVkIik7Ci0gICAgfQotCi0gICAgdm9pZCBPblJvbGVEaXNjb3ZlcnlDb21wbGV0ZShSb2xlIGN1cnJlbnRfcm9sZSkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uUm9sZURpc2NvdmVyeUNvbXBsZXRlIGN1cnJlbnRfcm9sZTolZCIsICh1aW50OF90KWN1cnJlbnRfcm9sZSk7Ci0gICAgfQotCi0gICAgdm9pZCBPblJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXRDb21wbGV0ZSh1aW50MTZfdCBmbHVzaF90aW1lb3V0KSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygiT25SZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGUgZmx1c2hfdGltZW91dDolZCIsIGZsdXNoX3RpbWVvdXQpOwotICAgIH0KLQotICAgIHZvaWQgT25SZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUodWludDhfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uUmVhZFRyYW5zbWl0UG93ZXJMZXZlbENvbXBsZXRlIHRyYW5zbWl0X3Bvd2VyX2xldmVsOiVkIiwgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpOwotICAgIH0KLQotICAgIHZvaWQgT25SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlKHVpbnQxNl90IGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXRDb21wbGV0ZSBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQ6JWQiLCBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQpOwotICAgIH0KLQotICAgIHZvaWQgT25SZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZSh1aW50MTZfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygiT25SZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZSBmYWlsZWRfY29udGFjdF9jb3VudGVyOiVkIiwgZmFpbGVkX2NvbnRhY3RfY291bnRlcik7Ci0gICAgfQotCi0gICAgdm9pZCBPblJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlKHVpbnQ4X3QgbGlua19xdWFsaXR5KSBvdmVycmlkZSB7Ci0gICAgICBMT0dfSU5GTygiT25SZWFkTGlua1F1YWxpdHlDb21wbGV0ZSBsaW5rX3F1YWxpdHk6JWQiLCBsaW5rX3F1YWxpdHkpOwotICAgIH0KLQotICAgIHZvaWQgT25SZWFkQWZoQ2hhbm5lbE1hcENvbXBsZXRlKEFmaE1vZGUgYWZoX21vZGUsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTA+IGFmaF9jaGFubmVsX21hcCkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uUmVhZEFmaENoYW5uZWxNYXBDb21wbGV0ZSBhZmhfbW9kZTolZCIsICh1aW50OF90KWFmaF9tb2RlKTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uUmVhZFJzc2lDb21wbGV0ZSh1aW50OF90IHJzc2kpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKCJPblJlYWRSc3NpQ29tcGxldGUgcnNzaTolZCIsIHJzc2kpOwotICAgIH0KLQotICAgIHZvaWQgT25SZWFkQ2xvY2tDb21wbGV0ZSh1aW50MzJfdCBjbG9jaywgdWludDE2X3QgYWNjdXJhY3kpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKCJPblJlYWRDbG9ja0NvbXBsZXRlIGNsb2NrOiVkLCBhY2N1cmFjeTolZCIsIGNsb2NrLCBhY2N1cmFjeSk7Ci0gICAgfQotCi0gICAgdm9pZCBPbkRpc2Nvbm5lY3Rpb24oRXJyb3JDb2RlIHJlYXNvbikgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oIk9uRGlzY29ubmVjdGlvbiByZWFzb246ICVzIiwgRXJyb3JDb2RlVGV4dChyZWFzb24pLmNfc3RyKCkpOwotICAgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgICAgICBEaXNjb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCByZWFzb24pOwotICAgICAgQ29ubmVjdGlvbkV2ZW50IGRpc2Nvbm5lY3Rpb247Ci0gICAgICBkaXNjb25uZWN0aW9uLnNldF9wYXlsb2FkKGJ1aWxkZXJfdG9fc3RyaW5nKHN0ZDo6bW92ZShidWlsZGVyKSkpOwotICAgICAgZXZlbnRfc3RyZWFtXy0+T25JbmNvbWluZ0V2ZW50KGRpc2Nvbm5lY3Rpb24pOwotICAgIH0KLSAgICB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKAotICAgICAgICBoY2k6OkVycm9yQ29kZSBlcnJvcl9zdGF0dXMsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbikgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgIk9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlIGxtcF92ZXJzaW9uOiVoaHUgbWFudWZhY3R1cmVyX25hbWU6JWh1IHN1Yl92ZXJzaW9uOiVodSIsCi0gICAgICAgICAgbG1wX3ZlcnNpb24sCi0gICAgICAgICAgbWFudWZhY3R1cmVyX25hbWUsCi0gICAgICAgICAgc3ViX3ZlcnNpb24pOwotICAgIH0KLSAgICB2b2lkIE9uUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGUodWludDY0X3QgZmVhdHVyZXMpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKCJPblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlIGZlYXR1cmVzOjB4JWx4Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oZmVhdHVyZXMpKTsKLSAgICB9Ci0gICAgdm9pZCBPblJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzQ29tcGxldGUoCi0gICAgICAgIHVpbnQ4X3QgcGFnZV9udW1iZXIsIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcykgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgIk9uUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZSBwYWdlX251bWJlcjolaGh1IG1heF9wYWdlX251bWJlcjolaGh1IGZlYXR1cmVzOjB4JWx4IiwKLSAgICAgICAgICBwYWdlX251bWJlciwKLSAgICAgICAgICBtYXhfcGFnZV9udW1iZXIsCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oZmVhdHVyZXMpKTsKLSAgICB9Ci0KLSAgICB1aW50MTZfdCBoYW5kbGVfOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGFzc2ljQWNsQ29ubmVjdGlvbj4gY29ubmVjdGlvbl87Ci0gICAgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxDb25uZWN0aW9uRXZlbnQ+PiBldmVudF9zdHJlYW1fOwotICAgIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxBY2xEYXRhPiBwZW5kaW5nX2FjbF9kYXRhX3tzdGQ6OnN0cmluZygiUGVuZGluZ0FjbERhdGEiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGhhbmRsZV8pfTsKLSAgfTsKLQotIHByaXZhdGU6Ci0gIEFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyXzsKLSAgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcl87Ci0gIG11dGFibGUgc3RkOjptdXRleCBhY2xfY29ubmVjdGlvbnNfbXV0ZXhfOwotICBzdGQ6Om1hcDx1aW50MTZfdCwgQ29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb25zXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxDb25uZWN0aW9uRXZlbnQ+Pj4gcGVyX2Nvbm5lY3Rpb25fZXZlbnRzXzsKLSAgdWludDMyX3QgY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfezB9OwotfTsKLQotdm9pZCBBY2xNYW5hZ2VyRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxBY2xNYW5hZ2VyPigpOwotfQotCi12b2lkIEFjbE1hbmFnZXJGYWNhZGVNb2R1bGU6OlN0YXJ0KCkgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RhcnQoKTsKLSAgc2VydmljZV8gPSBuZXcgQWNsTWFuYWdlckZhY2FkZVNlcnZpY2UoR2V0RGVwZW5kZW5jeTxBY2xNYW5hZ2VyPigpLCBHZXRIYW5kbGVyKCkpOwotfQotCi12b2lkIEFjbE1hbmFnZXJGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIGRlbGV0ZSBzZXJ2aWNlXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKTsKLX0KLQotOjpncnBjOjpTZXJ2aWNlKiBBY2xNYW5hZ2VyRmFjYWRlTW9kdWxlOjpHZXRTZXJ2aWNlKCkgY29uc3QgewotICByZXR1cm4gc2VydmljZV87Ci19Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgQWNsTWFuYWdlckZhY2FkZU1vZHVsZTo6RmFjdG9yeSA9Ci0gICAgOjpibHVldG9vdGg6Ok1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgQWNsTWFuYWdlckZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUuaCBiL2dkL2hjaS9mYWNhZGUvYWNsX21hbmFnZXJfZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTUzZGUuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLWNsYXNzIEFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlOwotCi1jbGFzcyBBY2xNYW5hZ2VyRmFjYWRlTW9kdWxlIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotICA6OmdycGM6OlNlcnZpY2UqIEdldFNlcnZpY2UoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIEFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmYWNhZGUKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvYWNsX21hbmFnZXJfZmFjYWRlLnByb3RvIGIvZ2QvaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGExODMuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9hY2xfbWFuYWdlcl9mYWNhZGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGguaGNpOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byI7Ci0KLXNlcnZpY2UgQWNsTWFuYWdlckZhY2FkZSB7Ci0gIHJwYyBDcmVhdGVDb25uZWN0aW9uKENvbm5lY3Rpb25Nc2cpIHJldHVybnMgKHN0cmVhbSBDb25uZWN0aW9uRXZlbnQpIHt9Ci0gIHJwYyBDYW5jZWxDb25uZWN0aW9uKENvbm5lY3Rpb25Nc2cpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIERpc2Nvbm5lY3QoSGFuZGxlTXNnKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBXcml0ZURlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MoUG9saWN5TXNnKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBBdXRoZW50aWNhdGlvblJlcXVlc3RlZChIYW5kbGVNc2cpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIENvbm5lY3Rpb25Db21tYW5kKENvbm5lY3Rpb25Db21tYW5kTXNnKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTd2l0Y2hSb2xlKFJvbGVNc2cpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNlbmRBY2xEYXRhKEFjbERhdGEpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEZldGNoQWNsRGF0YShIYW5kbGVNc2cpIHJldHVybnMgKHN0cmVhbSBBY2xEYXRhKSB7fQotICBycGMgRmV0Y2hJbmNvbWluZ0Nvbm5lY3Rpb24oZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gQ29ubmVjdGlvbkV2ZW50KSB7fQotfQotCi1tZXNzYWdlIEhhbmRsZU1zZyB7Ci0gIHVpbnQzMiBoYW5kbGUgPSAxOwotfQotCi1tZXNzYWdlIENvbm5lY3Rpb25Nc2cgewotICBieXRlcyBhZGRyZXNzID0gMTsKLX0KLQotbWVzc2FnZSBQb2xpY3lNc2cgewotICB1aW50MzIgcG9saWN5ID0gMTsKLX0KLQotZW51bSBOZXdSb2xlIHsKLSAgQ0VOVFJBTCA9IDA7Ci0gIFBFUklQSEVSQUwgPSAxOwotfQotCi1tZXNzYWdlIFJvbGVNc2cgewotICBieXRlcyBhZGRyZXNzID0gMTsKLSAgTmV3Um9sZSByb2xlID0gMjsKLX0KLQotbWVzc2FnZSBDb25uZWN0aW9uQ29tbWFuZE1zZyB7Ci0gIGJ5dGVzIHBhY2tldCA9IDE7Ci19Ci0KLW1lc3NhZ2UgQ29ubmVjdGlvbkV2ZW50IHsKLSAgYnl0ZXMgcGF5bG9hZCA9IDE7Ci19Ci0KLW1lc3NhZ2UgQWNsRGF0YSB7Ci0gIHVpbnQzMiBoYW5kbGUgPSAxOwotICBieXRlcyBwYXlsb2FkID0gMjsKLX0KZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvY29udHJvbGxlcl9mYWNhZGUuY2MgYi9nZC9oY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI2NmUyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mYWNhZGUvY29udHJvbGxlcl9mYWNhZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9mYWNhZGUvY29udHJvbGxlcl9mYWNhZGUuaCIKLQotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi9ibG9ja2luZ19xdWV1ZS5oIgotI2luY2x1ZGUgImdycGMvZ3JwY19ldmVudF9xdWV1ZS5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLnBiLmgiCi0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgQ29udHJvbGxlckZhY2FkZVNlcnZpY2UgOiBwdWJsaWMgQ29udHJvbGxlckZhY2FkZTo6U2VydmljZSB7Ci0gcHVibGljOgotICBDb250cm9sbGVyRmFjYWRlU2VydmljZShDb250cm9sbGVyKiBjb250cm9sbGVyLCA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXIqKSA6IGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpIHt9Ci0KLSAgOjpncnBjOjpTdGF0dXMgR2V0TWFjQWRkcmVzcyg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc01zZyogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBBZGRyZXNzIGxvY2FsX2FkZHJlc3MgPSBjb250cm9sbGVyXy0+R2V0TWFjQWRkcmVzcygpOwotICAgIHJlc3BvbnNlLT5zZXRfYWRkcmVzcyhsb2NhbF9hZGRyZXNzLlRvU3RyaW5nKCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBHZXRMb2NhbE5hbWUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZU1zZyogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnN0cmluZyBsb2NhbF9uYW1lID0gY29udHJvbGxlcl8tPkdldExvY2FsTmFtZSgpOwotICAgIHJlc3BvbnNlLT5zZXRfbmFtZShsb2NhbF9uYW1lKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgV3JpdGVMb2NhbE5hbWUoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBOYW1lTXNnKiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGNvbnRyb2xsZXJfLT5Xcml0ZUxvY2FsTmFtZShyZXF1ZXN0LT5uYW1lKCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBJc1N1cHBvcnRlZENvbW1hbmQoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IE9wQ29kZU1zZyogcmVxdWVzdCwgU3VwcG9ydGVkTXNnKiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGJvb2wgcmV0ID0gY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKHN0YXRpY19jYXN0PE9wQ29kZT4ocmVxdWVzdC0+b3BfY29kZSgpKSk7Ci0gICAgcmVzcG9uc2UtPnNldF9zdXBwb3J0ZWQocmV0KTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSNkZWZpbmUgU1VQUE9SVEVEX0FQSShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDo6Z3JwYzo6U3RhdHVzIG5hbWUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LCBTdXBwb3J0ZWRNc2cqIHJlc3BvbnNlKSBvdmVycmlkZSB7IFwKLSAgICByZXNwb25zZS0+c2V0X3N1cHBvcnRlZChjb250cm9sbGVyXy0+bmFtZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c1NpbXBsZVBhaXJpbmcpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucykKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c1NpbXVsdGFuZW91c0xlQnJFZHIpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNJbnRlcmxhY2VkSW5xdWlyeVNjYW4pCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNSc3NpV2l0aElucXVpcnlSZXN1bHRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2UpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNSb2xlU3dpdGNoKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzM1Nsb3RQYWNrZXRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzNVNsb3RQYWNrZXRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQ2xhc3NpYzJtUGh5KQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQ2xhc3NpYzNtUGh5KQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzM1Nsb3RFZHJQYWNrZXRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzNVNsb3RFZHJQYWNrZXRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzU2NvKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzSHYyUGFja2V0cykKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0h2M1BhY2tldHMpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNFdjNQYWNrZXRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzRXY0UGFja2V0cykKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0V2NVBhY2tldHMpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNFc2NvMm1QaHkpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNFc2NvM21QaHkpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHMzU2xvdEVzY29FZHJQYWNrZXRzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzSG9sZE1vZGUpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNTbmlmZk1vZGUpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNQYXJrTW9kZSkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c05vbkZsdXNoYWJsZVBiKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzU25pZmZTdWJyYXRpbmcpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNFbmNyeXB0aW9uUGF1c2UpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGUpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVFbmNyeXB0aW9uKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlQ29ubmVjdGlvblBhcmFtZXRlcnNSZXF1ZXN0KQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlRXh0ZW5kZWRSZWplY3QpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVQZXJpcGhlcmFsSW5pdGlhdGVkRmVhdHVyZXNFeGNoYW5nZSkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVBpbmcpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVEYXRhUGFja2V0TGVuZ3RoRXh0ZW5zaW9uKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlUHJpdmFjeSkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZUV4dGVuZGVkU2Nhbm5lckZpbHRlclBvbGljaWVzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlMm1QaHkpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVTdGFibGVNb2R1bGF0aW9uSW5kZXhUeCkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVN0YWJsZU1vZHVsYXRpb25JbmRleFJ4KQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlQ29kZWRQaHkpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVFeHRlbmRlZEFkdmVydGlzaW5nKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlUGVyaW9kaWNBZHZlcnRpc2luZykKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZUNoYW5uZWxTZWxlY3Rpb25BbGdvcml0aG0yKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlUG93ZXJDbGFzczEpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVNaW5pbXVtVXNlZENoYW5uZWxzKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlQ29ubmVjdGlvbkN0ZVJlcXVlc3QpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVDb25uZWN0aW9uQ3RlUmVzcG9uc2UpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVDb25uZWN0aW9ubGVzc0N0ZVRyYW5zbWl0dGVyKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlQ29ubmVjdGlvbmxlc3NDdGVSZWNlaXZlcikKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZUFudGVubmFTd2l0Y2hpbmdEdXJpbmdDdGVUeCkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZUFudGVubmFTd2l0Y2hpbmdEdXJpbmdDdGVSeCkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVJlY2VpdmluZ0NvbnN0YW50VG9uZUV4dGVuc2lvbnMpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVQZXJpb2RpY0FkdmVydGlzaW5nU3luY1RyYW5zZmVyU2VuZGVyKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlUGVyaW9kaWNBZHZlcnRpc2luZ1N5bmNUcmFuc2ZlclJlY2lwaWVudCkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVNsZWVwQ2xvY2tBY2N1cmFjeVVwZGF0ZXMpCi0gIFNVUFBPUlRFRF9BUEkoU3VwcG9ydHNCbGVSZW1vdGVQdWJsaWNLZXlWYWxpZGF0aW9uKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1DZW50cmFsKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1QZXJpcGhlcmFsKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlSXNvY2hyb25vdXNCcm9hZGNhc3RlcikKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVN5bmNocm9uaXplZFJlY2VpdmVyKQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlSXNvY2hyb25vdXNDaGFubmVsc0hvc3RTdXBwb3J0KQotICBTVVBQT1JURURfQVBJKFN1cHBvcnRzQmxlUG93ZXJDb250cm9sUmVxdWVzdCkKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVBvd2VyQ2hhbmdlSW5kaWNhdGlvbikKLSAgU1VQUE9SVEVEX0FQSShTdXBwb3J0c0JsZVBhdGhMb3NzTW9uaXRvcmluZykKLQotICA6OmdycGM6OlN0YXR1cyBHZXRMZU51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LCBTaW5nbGVWYWx1ZU1zZyogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICB1aW50OF90IHJldCA9IGNvbnRyb2xsZXJfLT5HZXRMZU51bWJlck9mU3VwcG9ydGVkQWR2ZXJpc2luZ1NldHMoKTsKLSAgICByZXNwb25zZS0+c2V0X3ZhbHVlKHJldCk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQ29udHJvbGxlciogY29udHJvbGxlcl87Ci19OwotCi12b2lkIENvbnRyb2xsZXJGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhsaXN0KTsKLSAgbGlzdC0+YWRkPENvbnRyb2xsZXI+KCk7Ci19Ci0KLXZvaWQgQ29udHJvbGxlckZhY2FkZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IG5ldyBDb250cm9sbGVyRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PENvbnRyb2xsZXI+KCksIEdldEhhbmRsZXIoKSk7Ci19Ci0KLXZvaWQgQ29udHJvbGxlckZhY2FkZU1vZHVsZTo6U3RvcCgpIHsKLSAgZGVsZXRlIHNlcnZpY2VfOwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RvcCgpOwotfQotCi06OmdycGM6OlNlcnZpY2UqIENvbnRyb2xsZXJGYWNhZGVNb2R1bGU6OkdldFNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBDb250cm9sbGVyRmFjYWRlTW9kdWxlOjpGYWN0b3J5ID0KLSAgICA6OmJsdWV0b290aDo6TW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBDb250cm9sbGVyRmFjYWRlTW9kdWxlKCk7IH0pOwotCi19ICAvLyBuYW1lc3BhY2UgZmFjYWRlCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLmggYi9nZC9oY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzdmMzguLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9jb250cm9sbGVyX2ZhY2FkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxncnBjKysvZ3JwYysrLmg+Ci0KLSNpbmNsdWRlICJncnBjL2dycGNfbW9kdWxlLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBmYWNhZGUgewotCi1jbGFzcyBDb250cm9sbGVyRmFjYWRlU2VydmljZTsKLQotY2xhc3MgQ29udHJvbGxlckZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgOjpncnBjOjpTZXJ2aWNlKiBHZXRTZXJ2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDb250cm9sbGVyRmFjYWRlU2VydmljZSogc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZmFjYWRlCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLnByb3RvIGIvZ2QvaGNpL2ZhY2FkZS9jb250cm9sbGVyX2ZhY2FkZS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlYjVkOC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZmFjYWRlL2NvbnRyb2xsZXJfZmFjYWRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotc3ludGF4ID0gInByb3RvMyI7Ci0KLXBhY2thZ2UgYmx1ZXRvb3RoLmhjaTsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotCi1zZXJ2aWNlIENvbnRyb2xsZXJGYWNhZGUgewotICBycGMgR2V0TWFjQWRkcmVzcyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKEFkZHJlc3NNc2cpIHt9Ci0gIHJwYyBXcml0ZUxvY2FsTmFtZShOYW1lTXNnKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBHZXRMb2NhbE5hbWUoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChOYW1lTXNnKSB7fQotICBycGMgSXNTdXBwb3J0ZWRDb21tYW5kKE9wQ29kZU1zZykgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgR2V0TGVOdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFNpbmdsZVZhbHVlTXNnKSB7fQotICBycGMgU3VwcG9ydHNTaW1wbGVQYWlyaW5nKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzU2ltdWx0YW5lb3VzTGVCckVkcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzSW50ZXJsYWNlZElucXVpcnlTY2FuKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNSc3NpV2l0aElucXVpcnlSZXN1bHRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNFeHRlbmRlZElucXVpcnlSZXNwb25zZShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzUm9sZVN3aXRjaChnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzM1Nsb3RQYWNrZXRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHM1U2xvdFBhY2tldHMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0NsYXNzaWMybVBoeShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQ2xhc3NpYzNtUGh5KGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHMzU2xvdEVkclBhY2tldHMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0czVTbG90RWRyUGFja2V0cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzU2NvKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNIdjJQYWNrZXRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNIdjNQYWNrZXRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNFdjNQYWNrZXRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNFdjRQYWNrZXRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNFdjVQYWNrZXRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNFc2NvMm1QaHkoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0VzY28zbVBoeShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzM1Nsb3RFc2NvRWRyUGFja2V0cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzSG9sZE1vZGUoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c1NuaWZmTW9kZShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzUGFya01vZGUoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c05vbkZsdXNoYWJsZVBiKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNTbmlmZlN1YnJhdGluZyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzRW5jcnlwdGlvblBhdXNlKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGUoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZUVuY3J5cHRpb24oZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZUNvbm5lY3Rpb25QYXJhbWV0ZXJzUmVxdWVzdChnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlRXh0ZW5kZWRSZWplY3QoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVBlcmlwaGVyYWxJbml0aWF0ZWRGZWF0dXJlc0V4Y2hhbmdlKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVQaW5nKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVEYXRhUGFja2V0TGVuZ3RoRXh0ZW5zaW9uKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVQcml2YWN5KGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVFeHRlbmRlZFNjYW5uZXJGaWx0ZXJQb2xpY2llcyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlMm1QaHkoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVN0YWJsZU1vZHVsYXRpb25JbmRleFR4KGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVTdGFibGVNb2R1bGF0aW9uSW5kZXhSeChnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlQ29kZWRQaHkoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZUV4dGVuZGVkQWR2ZXJ0aXNpbmcoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmcoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZUNoYW5uZWxTZWxlY3Rpb25BbGdvcml0aG0yKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVQb3dlckNsYXNzMShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlTWluaW11bVVzZWRDaGFubmVscyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlQ29ubmVjdGlvbkN0ZVJlcXVlc3QoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZUNvbm5lY3Rpb25DdGVSZXNwb25zZShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlQ29ubmVjdGlvbmxlc3NDdGVUcmFuc21pdHRlcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlQ29ubmVjdGlvbmxlc3NDdGVSZWNlaXZlcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlQW50ZW5uYVN3aXRjaGluZ0R1cmluZ0N0ZVR4KGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVBbnRlbm5hU3dpdGNoaW5nRHVyaW5nQ3RlUngoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVJlY2VpdmluZ0NvbnN0YW50VG9uZUV4dGVuc2lvbnMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJTZW5kZXIoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJSZWNpcGllbnQoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVNsZWVwQ2xvY2tBY2N1cmFjeVVwZGF0ZXMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVJlbW90ZVB1YmxpY0tleVZhbGlkYXRpb24oZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtQ2VudHJhbChnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlQ29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW1QZXJpcGhlcmFsKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVJc29jaHJvbm91c0Jyb2FkY2FzdGVyKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVTeW5jaHJvbml6ZWRSZWNlaXZlcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLSAgcnBjIFN1cHBvcnRzQmxlSXNvY2hyb25vdXNDaGFubmVsc0hvc3RTdXBwb3J0KGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVQb3dlckNvbnRyb2xSZXF1ZXN0KGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoU3VwcG9ydGVkTXNnKSB7fQotICBycGMgU3VwcG9ydHNCbGVQb3dlckNoYW5nZUluZGljYXRpb24oZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChTdXBwb3J0ZWRNc2cpIHt9Ci0gIHJwYyBTdXBwb3J0c0JsZVBhdGhMb3NzTW9uaXRvcmluZyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKFN1cHBvcnRlZE1zZykge30KLX0KLQotbWVzc2FnZSBBZGRyZXNzTXNnIHsKLSAgYnl0ZXMgYWRkcmVzcyA9IDE7Ci19Ci0KLW1lc3NhZ2UgTmFtZU1zZyB7Ci0gIGJ5dGVzIG5hbWUgPSAxOwotfQotCi1tZXNzYWdlIE9wQ29kZU1zZyB7Ci0gIHVpbnQzMiBvcF9jb2RlID0gMTsKLX0KLQotbWVzc2FnZSBTdXBwb3J0ZWRNc2cgewotICBib29sIHN1cHBvcnRlZCA9IDE7Ci19Ci0KLW1lc3NhZ2UgU2luZ2xlVmFsdWVNc2cgewotICB1aW50NjQgdmFsdWUgPSAxOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvZmFjYWRlLmNjIGIvZ2QvaGNpL2ZhY2FkZS9mYWNhZGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDQ1OWQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9mYWNhZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9mYWNhZGUvZmFjYWRlLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImdycGMvZ3JwY19ldmVudF9xdWV1ZS5oIgotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9oY2lfZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgSGNpRmFjYWRlU2VydmljZSA6IHB1YmxpYyBIY2lGYWNhZGU6OlNlcnZpY2UgewotIHB1YmxpYzoKLSAgSGNpRmFjYWRlU2VydmljZShIY2lMYXllciogaGNpX2xheWVyLCBDb250cm9sbGVyKiBjb250cm9sbGVyLCA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyKQotICAgICAgOiBoY2lfbGF5ZXJfKGhjaV9sYXllciksIGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpLCBmYWNhZGVfaGFuZGxlcl8oZmFjYWRlX2hhbmRsZXIpIHt9Ci0KLSAgdmlydHVhbCB+SGNpRmFjYWRlU2VydmljZSgpIHsKLSAgICBpZiAodW5yZWdpc3Rlcl9hY2xfZGVxdWV1ZV8pIHsKLSAgICAgIGhjaV9sYXllcl8tPkdldEFjbFF1ZXVlRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgfQotICAgIGlmICh3YWl0aW5nX2FjbF9wYWNrZXRfICE9IG51bGxwdHIpIHsKLSAgICAgIGhjaV9sYXllcl8tPkdldEFjbFF1ZXVlRW5kKCktPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgICBpZiAod2FpdGluZ19hY2xfcGFja2V0XyAhPSBudWxscHRyKSB7Ci0gICAgICAgIHdhaXRpbmdfYWNsX3BhY2tldF8ucmVzZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBUZXN0Q29tbWFuZEJ1aWxkZXIgOiBwdWJsaWMgQ29tbWFuZEJ1aWxkZXIgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IFRlc3RDb21tYW5kQnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcykgOiBDb21tYW5kQnVpbGRlcihPcENvZGU6Ok5PTkUpLCBieXRlc18oc3RkOjptb3ZlKGJ5dGVzKSkge30KLSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgIHJldHVybiBieXRlc18uc2l6ZSgpOwotICAgIH0KLSAgICB2b2lkIFNlcmlhbGl6ZShCaXRJbnNlcnRlciYgYml0X2luc2VydGVyKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICBmb3IgKGF1dG8mJiBiIDogYnl0ZXNfKSB7Ci0gICAgICAgIGJpdF9pbnNlcnRlci5pbnNlcnRfYnl0ZShiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXNfOwotICB9OwotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmRDb21tYW5kKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YSogY29tbWFuZCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBwYXlsb2FkID0gc3RkOjp2ZWN0b3I8dWludDhfdD4oY29tbWFuZC0+cGF5bG9hZCgpLmJlZ2luKCksIGNvbW1hbmQtPnBheWxvYWQoKS5lbmQoKSk7Ci0gICAgYXV0byBwYWNrZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPFRlc3RDb21tYW5kQnVpbGRlcj4ocGF5bG9hZCk7Ci0gICAgYXV0byBvcGNvZGUgPSBzdGF0aWNfY2FzdDxjb25zdCBibHVldG9vdGg6OmhjaTo6T3BDb2RlPihwYXlsb2FkLmF0KDEpIDw8IDggfCBwYXlsb2FkLmF0KDApKTsKLSAgICBpZiAoQ2hlY2tlcjo6SXNDb21tYW5kU3RhdHVzT3Bjb2RlKG9wY29kZSkpIHsKLSAgICAgIGhjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpLCBmYWNhZGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkhjaUZhY2FkZVNlcnZpY2U6Om9uX3N0YXR1cykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSwgZmFjYWRlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZIY2lGYWNhZGVTZXJ2aWNlOjpvbl9jb21wbGV0ZSkpOwotICAgIH0KLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgUmVxdWVzdEV2ZW50KAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OmhjaTo6RXZlbnRSZXF1ZXN0KiBldmVudCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpX2xheWVyXy0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICAgIHN0YXRpY19jYXN0PEV2ZW50Q29kZT4oZXZlbnQtPmNvZGUoKSksIGZhY2FkZV9oYW5kbGVyXy0+QmluZE9uKHRoaXMsICZIY2lGYWNhZGVTZXJ2aWNlOjpvbl9ldmVudCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBSZXF1ZXN0TGVTdWJldmVudCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpoY2k6OkV2ZW50UmVxdWVzdCogZXZlbnQsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaV9sYXllcl8tPlJlZ2lzdGVyTGVFdmVudEhhbmRsZXIoCi0gICAgICAgIHN0YXRpY19jYXN0PFN1YmV2ZW50Q29kZT4oZXZlbnQtPmNvZGUoKSksIGZhY2FkZV9oYW5kbGVyXy0+QmluZE9uKHRoaXMsICZIY2lGYWNhZGVTZXJ2aWNlOjpvbl9sZV9zdWJldmVudCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTdHJlYW1FdmVudHMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBwZW5kaW5nX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9OwotCi0gIDo6Z3JwYzo6U3RhdHVzIFN0cmVhbUxlU3ViZXZlbnRzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGE+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gcGVuZGluZ19sZV9ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfTsKLQotICBjbGFzcyBUZXN0QWNsQnVpbGRlciA6IHB1YmxpYyBBY2xCdWlsZGVyIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBUZXN0QWNsQnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkKQotICAgICAgICA6IEFjbEJ1aWxkZXIoMHhiYWQsIFBhY2tldEJvdW5kYXJ5RmxhZzo6Q09OVElOVUlOR19GUkFHTUVOVCwgQnJvYWRjYXN0RmxhZzo6QUNUSVZFX1BFUklQSEVSQUxfQlJPQURDQVNUKSwKLSAgICAgICAgICBieXRlc18oc3RkOjptb3ZlKHBheWxvYWQpKSB7fQotCi0gICAgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICByZXR1cm4gYnl0ZXNfLnNpemUoKTsKLSAgICB9Ci0gICAgdm9pZCBTZXJpYWxpemUoQml0SW5zZXJ0ZXImIGJpdF9pbnNlcnRlcikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgZm9yIChhdXRvJiYgYiA6IGJ5dGVzXykgewotICAgICAgICBiaXRfaW5zZXJ0ZXIuaW5zZXJ0X2J5dGUoYik7Ci0gICAgICB9Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzXzsKLSAgfTsKLQotICA6OmdycGM6OlN0YXR1cyBTZW5kQWNsKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YSogYWNsLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICB3YWl0aW5nX2FjbF9wYWNrZXRfID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUZXN0QWNsQnVpbGRlcj4oc3RkOjp2ZWN0b3I8dWludDhfdD4oYWNsLT5wYXlsb2FkKCkuYmVnaW4oKSwgYWNsLT5wYXlsb2FkKCkuZW5kKCkpKTsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gZW5xdWV1ZWQ7Ci0gICAgYXV0byBmdXR1cmUgPSBlbnF1ZXVlZC5nZXRfZnV0dXJlKCk7Ci0gICAgaWYgKCFjb21wbGV0ZWRfcGFja2V0c19jYWxsYmFja19yZWdpc3RlcmVkXykgewotICAgICAgY29udHJvbGxlcl8tPlJlZ2lzdGVyQ29tcGxldGVkQWNsUGFja2V0c0NhbGxiYWNrKAotICAgICAgICAgIGZhY2FkZV9oYW5kbGVyXy0+QmluZChbXSh1aW50MTZfdCwgdWludDE2X3QpIHsgLyogZG8gbm90aGluZyAqLyB9KSk7Ci0gICAgICBjb21wbGV0ZWRfcGFja2V0c19jYWxsYmFja19yZWdpc3RlcmVkXyA9IHRydWU7Ci0gICAgfQotICAgIGhjaV9sYXllcl8tPkdldEFjbFF1ZXVlRW5kKCktPlJlZ2lzdGVyRW5xdWV1ZSgKLSAgICAgICAgZmFjYWRlX2hhbmRsZXJfLAotICAgICAgICBjb21tb246OkJpbmQoJkhjaUZhY2FkZVNlcnZpY2U6OmhhbmRsZV9lbnF1ZXVlX2FjbCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBjb21tb246OlVucmV0YWluZWQoJmVucXVldWVkKSkpOwotICAgIGF1dG8gcmVzdWx0ID0gZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7Ci0gICAgQVNTRVJUKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkgPT0gcmVzdWx0KTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU3RyZWFtQWNsKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGE+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICBoY2lfbGF5ZXJfLT5HZXRBY2xRdWV1ZUVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgIGZhY2FkZV9oYW5kbGVyXywgY29tbW9uOjpCaW5kKCZIY2lGYWNhZGVTZXJ2aWNlOjpvbl9hY2xfcmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIHVucmVnaXN0ZXJfYWNsX2RlcXVldWVfID0gdHJ1ZTsKLSAgICByZXR1cm4gcGVuZGluZ19hY2xfZXZlbnRzXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8QWNsQnVpbGRlcj4gaGFuZGxlX2VucXVldWVfYWNsKHN0ZDo6cHJvbWlzZTx2b2lkPiogcHJvbWlzZSkgewotICAgIHByb21pc2UtPnNldF92YWx1ZSgpOwotICAgIGhjaV9sYXllcl8tPkdldEFjbFF1ZXVlRW5kKCktPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgcmV0dXJuIHN0ZDo6bW92ZSh3YWl0aW5nX2FjbF9wYWNrZXRfKTsKLSAgfQotCi0gIHZvaWQgb25fYWNsX3JlYWR5KCkgewotICAgIGF1dG8gYWNsX3B0ciA9IGhjaV9sYXllcl8tPkdldEFjbFF1ZXVlRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBBU1NFUlQoYWNsX3B0ciAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQoYWNsX3B0ci0+SXNWYWxpZCgpKTsKLSAgICBMT0dfSU5GTygiR290IGFuIEFjbCBtZXNzYWdlIGZvciBoYW5kbGUgMHglaHgiLCBhY2xfcHRyLT5HZXRIYW5kbGUoKSk7Ci0gICAgOjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YSBpbmNvbWluZzsKLSAgICBpbmNvbWluZy5zZXRfcGF5bG9hZChzdGQ6OnN0cmluZyhhY2xfcHRyLT5iZWdpbigpLCBhY2xfcHRyLT5lbmQoKSkpOwotICAgIHBlbmRpbmdfYWNsX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KHN0ZDo6bW92ZShpbmNvbWluZykpOwotICB9Ci0KLSAgdm9pZCBvbl9ldmVudChoY2k6OkV2ZW50VmlldyB2aWV3KSB7Ci0gICAgQVNTRVJUKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBMT0dfSU5GTygiR290IGFuIEV2ZW50ICVzIiwgRXZlbnRDb2RlVGV4dCh2aWV3LkdldEV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgICA6OmJsdWV0b290aDo6ZmFjYWRlOjpEYXRhIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLnNldF9wYXlsb2FkKHN0ZDo6c3RyaW5nKHZpZXcuYmVnaW4oKSwgdmlldy5lbmQoKSkpOwotICAgIHBlbmRpbmdfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gIH0KLQotICB2b2lkIG9uX2xlX3N1YmV2ZW50KGhjaTo6TGVNZXRhRXZlbnRWaWV3IHZpZXcpIHsKLSAgICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICAgIExPR19JTkZPKCJHb3QgYW4gTEUgRXZlbnQgJXMiLCBTdWJldmVudENvZGVUZXh0KHZpZXcuR2V0U3ViZXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotICAgIDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGEgcmVzcG9uc2U7Ci0gICAgcmVzcG9uc2Uuc2V0X3BheWxvYWQoc3RkOjpzdHJpbmcodmlldy5iZWdpbigpLCB2aWV3LmVuZCgpKSk7Ci0gICAgcGVuZGluZ19sZV9ldmVudHNfLk9uSW5jb21pbmdFdmVudChzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgfQotCi0gIHZvaWQgb25fY29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICAgIExPR19JTkZPKCJHb3QgYSBDb21tYW5kIGNvbXBsZXRlICVzIiwgT3BDb2RlVGV4dCh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkuY19zdHIoKSk7Ci0gICAgOjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YSByZXNwb25zZTsKLSAgICByZXNwb25zZS5zZXRfcGF5bG9hZChzdGQ6OnN0cmluZyh2aWV3LmJlZ2luKCksIHZpZXcuZW5kKCkpKTsKLSAgICBwZW5kaW5nX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICB9Ci0KLSAgdm9pZCBvbl9zdGF0dXMoaGNpOjpDb21tYW5kU3RhdHVzVmlldyB2aWV3KSB7Ci0gICAgQVNTRVJUKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBMT0dfSU5GTygiR290IGEgQ29tbWFuZCBzdGF0dXMgJXMiLCBPcENvZGVUZXh0KHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpKTsKLSAgICA6OmJsdWV0b290aDo6ZmFjYWRlOjpEYXRhIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLnNldF9wYXlsb2FkKHN0ZDo6c3RyaW5nKHZpZXcuYmVnaW4oKSwgdmlldy5lbmQoKSkpOwotICAgIHBlbmRpbmdfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gIH0KLQotICBIY2lMYXllciogaGNpX2xheWVyXzsKLSAgQ29udHJvbGxlciogY29udHJvbGxlcl87Ci0gIDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogZmFjYWRlX2hhbmRsZXJfOwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8OjpibHVldG9vdGg6OmZhY2FkZTo6RGF0YT4gcGVuZGluZ19ldmVudHNfeyJTdHJlYW1FdmVudHMifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGE+IHBlbmRpbmdfbGVfZXZlbnRzX3siU3RyZWFtTGVTdWJldmVudHMifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkRhdGE+IHBlbmRpbmdfYWNsX2V2ZW50c197IlN0cmVhbUFjbCJ9OwotICBib29sIHVucmVnaXN0ZXJfYWNsX2RlcXVldWVfe2ZhbHNlfTsKLSAgc3RkOjp1bmlxdWVfcHRyPFRlc3RBY2xCdWlsZGVyPiB3YWl0aW5nX2FjbF9wYWNrZXRfOwotICBib29sIGNvbXBsZXRlZF9wYWNrZXRzX2NhbGxiYWNrX3JlZ2lzdGVyZWRfe2ZhbHNlfTsKLX07Ci0KLXZvaWQgSGNpRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxIY2lMYXllcj4oKTsKLSAgbGlzdC0+YWRkPENvbnRyb2xsZXI+KCk7Ci19Ci0KLXZvaWQgSGNpRmFjYWRlTW9kdWxlOjpTdGFydCgpIHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0YXJ0KCk7Ci0gIHNlcnZpY2VfID0gbmV3IEhjaUZhY2FkZVNlcnZpY2UoR2V0RGVwZW5kZW5jeTxIY2lMYXllcj4oKSwgR2V0RGVwZW5kZW5jeTxDb250cm9sbGVyPigpLCBHZXRIYW5kbGVyKCkpOwotfQotCi12b2lkIEhjaUZhY2FkZU1vZHVsZTo6U3RvcCgpIHsKLSAgZGVsZXRlIHNlcnZpY2VfOwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RvcCgpOwotfQotCi06OmdycGM6OlNlcnZpY2UqIEhjaUZhY2FkZU1vZHVsZTo6R2V0U2VydmljZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNlcnZpY2VfOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEhjaUZhY2FkZU1vZHVsZTo6RmFjdG9yeSA9IDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEhjaUZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9mYWNhZGUuaCBiL2dkL2hjaS9mYWNhZGUvZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWMzNjIuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9mYWNhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBmYWNhZGUgewotCi1jbGFzcyBIY2lGYWNhZGVTZXJ2aWNlOwotCi1jbGFzcyBIY2lGYWNhZGVNb2R1bGUgOiBwdWJsaWMgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgSGNpRmFjYWRlU2VydmljZSogc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZmFjYWRlCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvZmFjYWRlL2hjaV9mYWNhZGUucHJvdG8gYi9nZC9oY2kvZmFjYWRlL2hjaV9mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjVhNDUuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9oY2lfZmFjYWRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotc3ludGF4ID0gInByb3RvMyI7Ci0KLXBhY2thZ2UgYmx1ZXRvb3RoLmhjaTsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotaW1wb3J0ICJmYWNhZGUvY29tbW9uLnByb3RvIjsKLQotc2VydmljZSBIY2lGYWNhZGUgewotICBycGMgU2VuZENvbW1hbmQoZmFjYWRlLkRhdGEpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLQotICBycGMgUmVxdWVzdEV2ZW50KEV2ZW50UmVxdWVzdCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU3RyZWFtRXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIGZhY2FkZS5EYXRhKSB7fQotCi0gIHJwYyBSZXF1ZXN0TGVTdWJldmVudChFdmVudFJlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFN0cmVhbUxlU3ViZXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIGZhY2FkZS5EYXRhKSB7fQotCi0gIHJwYyBTZW5kQWNsKGZhY2FkZS5EYXRhKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTdHJlYW1BY2woZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gZmFjYWRlLkRhdGEpIHt9Ci19Ci0KLW1lc3NhZ2UgRXZlbnRSZXF1ZXN0IHsKLSAgdWludDMyIGNvZGUgPSAxOwotfQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUuY2MgYi9nZC9oY2kvZmFjYWRlL2xlX2FjbF9tYW5hZ2VyX2ZhY2FkZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjNmFhYy4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZmFjYWRlL2xlX2FjbF9tYW5hZ2VyX2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUuaCIKLQotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImdycGMvZ3JwY19ldmVudF9xdWV1ZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImhjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2xlX2FjbF9tYW5hZ2VyX2ZhY2FkZS5wYi5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi11c2luZyA6OmdycGM6OlNlcnZlckFzeW5jUmVzcG9uc2VXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckFzeW5jV3JpdGVyOwotdXNpbmcgOjpncnBjOjpTZXJ2ZXJDb250ZXh0OwotCi11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLXVzaW5nIGFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb247Ci11c2luZyBhY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzOwotdXNpbmcgYWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3M7Ci0KLWNsYXNzIExlQWNsTWFuYWdlckZhY2FkZVNlcnZpY2UgOiBwdWJsaWMgTGVBY2xNYW5hZ2VyRmFjYWRlOjpTZXJ2aWNlLCBwdWJsaWMgTGVDb25uZWN0aW9uQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIExlQWNsTWFuYWdlckZhY2FkZVNlcnZpY2UoQWNsTWFuYWdlciogYWNsX21hbmFnZXIsIDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogZmFjYWRlX2hhbmRsZXIpCi0gICAgICA6IGFjbF9tYW5hZ2VyXyhhY2xfbWFuYWdlciksIGZhY2FkZV9oYW5kbGVyXyhmYWNhZGVfaGFuZGxlcikgewotICAgIGFjbF9tYW5hZ2VyXy0+UmVnaXN0ZXJMZUNhbGxiYWNrcyh0aGlzLCBmYWNhZGVfaGFuZGxlcl8pOwotICB9Ci0KLSAgfkxlQWNsTWFuYWdlckZhY2FkZVNlcnZpY2UoKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGFjbF9jb25uZWN0aW9uc19tdXRleF8pOwotICAgIGZvciAoYXV0byYgY29ubiA6IGFjbF9jb25uZWN0aW9uc18pIHsKLSAgICAgIGlmIChjb25uLnNlY29uZC5jb25uZWN0aW9uXyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNvbm4uc2Vjb25kLmNvbm5lY3Rpb25fLT5HZXRBY2xRdWV1ZUVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgICAgICBjb25uLnNlY29uZC5jb25uZWN0aW9uXy5yZXNldCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIENyZWF0ZUNvbm5lY3Rpb24oCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxMZUNvbm5lY3Rpb25FdmVudD4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIEFkZHJlc3MgcGVlcl9hZGRyZXNzOwotICAgIEFTU0VSVChBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPmFkZHJlc3MoKS5hZGRyZXNzKCksIHBlZXJfYWRkcmVzcykpOwotICAgIEFkZHJlc3NXaXRoVHlwZSBwZWVyKHBlZXJfYWRkcmVzcywgc3RhdGljX2Nhc3Q8QWRkcmVzc1R5cGU+KHJlcXVlc3QtPnR5cGUoKSkpOwotICAgIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlTGVDb25uZWN0aW9uKHBlZXIsIC8qIGlzX2RpcmVjdCAqLyB0cnVlKTsKLSAgICBpZiAocGVyX2Nvbm5lY3Rpb25fZXZlbnRzXy5zaXplKCkgPiBjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF8pIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlJFU09VUkNFX0VYSEFVU1RFRCwgIk9ubHkgb25lIG91dHN0YW5kaW5nIHJlcXVlc3QgaXMgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIHBlcl9jb25uZWN0aW9uX2V2ZW50c18uZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8OjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPExlQ29ubmVjdGlvbkV2ZW50Pj4oCi0gICAgICAgIHN0ZDo6c3RyaW5nKCJjb25uZWN0aW9uIGF0dGVtcHQgIikgKyBzdGQ6OnRvX3N0cmluZyhjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF8pKSk7Ci0gICAgcmV0dXJuIHBlcl9jb25uZWN0aW9uX2V2ZW50c19bY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfXS0+UnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgQ3JlYXRlQmFja2dyb3VuZEFuZERpcmVjdENvbm5lY3Rpb24oCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxMZUNvbm5lY3Rpb25FdmVudD4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIEFkZHJlc3MgcGVlcl9hZGRyZXNzOwotICAgIEFTU0VSVChBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPmFkZHJlc3MoKS5hZGRyZXNzKCksIHBlZXJfYWRkcmVzcykpOwotICAgIEFkZHJlc3NXaXRoVHlwZSBwZWVyKHBlZXJfYWRkcmVzcywgc3RhdGljX2Nhc3Q8QWRkcmVzc1R5cGU+KHJlcXVlc3QtPnR5cGUoKSkpOwotICAgIC8vIENyZWF0ZSBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gZmlyc3QKLSAgICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUxlQ29ubmVjdGlvbihwZWVyLCAvKiBpc19kaXJlY3QgKi8gZmFsc2UpOwotICAgIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlTGVDb25uZWN0aW9uKHBlZXIsIC8qIGlzX2RpcmVjdCAqLyB0cnVlKTsKLSAgICB3YWl0X2Zvcl9iYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fY29tcGxldGUgPSB0cnVlOwotICAgIGlmIChwZXJfY29ubmVjdGlvbl9ldmVudHNfLnNpemUoKSA+IGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0XykgewotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6UkVTT1VSQ0VfRVhIQVVTVEVELCAiT25seSBvbmUgb3V0c3RhbmRpbmcgcmVxdWVzdCBpcyBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0gICAgcGVyX2Nvbm5lY3Rpb25fZXZlbnRzXy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTw6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8TGVDb25uZWN0aW9uRXZlbnQ+PigKLSAgICAgICAgc3RkOjpzdHJpbmcoImNvbm5lY3Rpb24gYXR0ZW1wdCAiKSArIHN0ZDo6dG9fc3RyaW5nKGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0XykpKTsKLSAgICByZXR1cm4gcGVyX2Nvbm5lY3Rpb25fZXZlbnRzX1tjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF9dLT5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBDYW5jZWxDb25uZWN0aW9uKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OmZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKiByZXF1ZXN0LAotICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgQWRkcmVzcyBwZWVyX2FkZHJlc3M7Ci0gICAgQVNTRVJUKEFkZHJlc3M6OkZyb21TdHJpbmcocmVxdWVzdC0+YWRkcmVzcygpLmFkZHJlc3MoKSwgcGVlcl9hZGRyZXNzKSk7Ci0gICAgQWRkcmVzc1dpdGhUeXBlIHBlZXIocGVlcl9hZGRyZXNzLCBzdGF0aWNfY2FzdDxBZGRyZXNzVHlwZT4ocmVxdWVzdC0+dHlwZSgpKSk7Ci0gICAgaWYgKHBlcl9jb25uZWN0aW9uX2V2ZW50c18uc2l6ZSgpID09IGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0XykgewotICAgICAgLy8gVG9kbzogQ2hlY2sgdGhhdCB0aGUgYWRkcmVzcyBtYXRjaGVzIGFuIG91dHN0YW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdAotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6SU5WQUxJRF9BUkdVTUVOVCwgIk5vIG1hdGNoaW5nIG91dHN0YW5kaW5nIGNvbm5lY3Rpb24iKTsKLSAgICB9Ci0gICAgYWNsX21hbmFnZXJfLT5DYW5jZWxMZUNvbm5lY3QocGVlcik7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIERpc2Nvbm5lY3QoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBMZUhhbmRsZU1zZyogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhhY2xfY29ubmVjdGlvbnNfbXV0ZXhfKTsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIGlmIChjb25uZWN0aW9uID09IGFjbF9jb25uZWN0aW9uc18uZW5kKCkpIHsKLSAgICAgIExPR19FUlJPUigiSW52YWxpZCBoYW5kbGUiKTsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGhhbmRsZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25uZWN0aW9uLT5zZWNvbmQuY29ubmVjdGlvbl8tPkRpc2Nvbm5lY3QoRGlzY29ubmVjdFJlYXNvbjo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKTsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gICAgfQotICB9Ci0KLSNkZWZpbmUgR0VUX0NPTk5FQ1RJT04odmlldykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0ZDo6bWFwPHVpbnQxNl90LCBDb25uZWN0aW9uPjo6aXRlcmF0b3IgY29ubmVjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIXZpZXcuSXNWYWxpZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiSW52YWxpZCBoYW5kbGUiKTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soYWNsX2Nvbm5lY3Rpb25zX211dGV4Xyk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29ubmVjdGlvbiA9IGFjbF9jb25uZWN0aW9uc18uZmluZCh2aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSk7ICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb25uZWN0aW9uID09IGFjbF9jb25uZWN0aW9uc18uZW5kKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGhhbmRsZSIpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0gIDo6Z3JwYzo6U3RhdHVzIENvbm5lY3Rpb25Db21tYW5kKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgTGVDb25uZWN0aW9uQ29tbWFuZE1zZyogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4oCi0gICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihyZXF1ZXN0LT5wYWNrZXQoKS5iZWdpbigpLCByZXF1ZXN0LT5wYWNrZXQoKS5lbmQoKSkpKSkpOwotICAgIGlmICghY29tbWFuZF92aWV3LklzVmFsaWQoKSkgewotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6SU5WQUxJRF9BUkdVTUVOVCwgIkludmFsaWQgY29tbWFuZCBwYWNrZXQiKTsKLSAgICB9Ci0gICAgc3dpdGNoIChjb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpIHsKLSAgICAgIGNhc2UgT3BDb2RlOjpESVNDT05ORUNUOiB7Ci0gICAgICAgIGF1dG8gdmlldyA9IERpc2Nvbm5lY3RWaWV3OjpDcmVhdGUoY29tbWFuZF92aWV3KTsKLSAgICAgICAgR0VUX0NPTk5FQ1RJT04odmlldyk7Ci0gICAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+RGlzY29ubmVjdCh2aWV3LkdldFJlYXNvbigpKTsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJJbnZhbGlkIGNvbW1hbmQgcGFja2V0Iik7Ci0gICAgfQotICB9Ci0jdW5kZWYgR0VUX0NPTk5FQ1RJT04KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaEluY29taW5nQ29ubmVjdGlvbigKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8TGVDb25uZWN0aW9uRXZlbnQ+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICBpZiAocGVyX2Nvbm5lY3Rpb25fZXZlbnRzXy5zaXplKCkgPiBjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF8pIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlJFU09VUkNFX0VYSEFVU1RFRCwgIk9ubHkgb25lIG91dHN0YW5kaW5nIGNvbm5lY3Rpb24gaXMgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIHBlcl9jb25uZWN0aW9uX2V2ZW50c18uZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8OjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPExlQ29ubmVjdGlvbkV2ZW50Pj4oCi0gICAgICAgIHN0ZDo6c3RyaW5nKCJpbmNvbWluZyBjb25uZWN0aW9uICIpICsgc3RkOjp0b19zdHJpbmcoY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfKSkpOwotICAgIHJldHVybiBwZXJfY29ubmVjdGlvbl9ldmVudHNfW2N1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0X10tPlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmRBY2xEYXRhKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBMZUFjbERhdGEqIHJlcXVlc3QsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soYWNsX2Nvbm5lY3Rpb25zX211dGV4Xyk7Ci0gICAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gYWNsX2Nvbm5lY3Rpb25zXy5lbmQoKSkgewotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiSW52YWxpZCBoYW5kbGUiKTsKLSAgICAgIH0KLSAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKS0+UmVnaXN0ZXJFbnF1ZXVlKAotICAgICAgICAgIGZhY2FkZV9oYW5kbGVyXywKLSAgICAgICAgICBjb21tb246OkJpbmQoCi0gICAgICAgICAgICAgICZMZUFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlOjplbnF1ZXVlX3BhY2tldCwKLSAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQocmVxdWVzdCksCi0gICAgICAgICAgICAgIGNvbW1vbjo6UGFzc2VkKHN0ZDo6bW92ZShwcm9taXNlKSkpKTsKLSAgICAgIGF1dG8gc3RhdHVzID0gZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCkpOwotICAgICAgaWYgKHN0YXR1cyAhPSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OlJFU09VUkNFX0VYSEFVU1RFRCwgIkNhbid0IHNlbmQgcGFja2V0Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IGVucXVldWVfcGFja2V0KGNvbnN0IExlQWNsRGF0YSogcmVxdWVzdCwgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBhY2xfY29ubmVjdGlvbnNfLmZpbmQocmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIEFTU0VSVF9MT0coY29ubmVjdGlvbiAhPSBhY2xfY29ubmVjdGlvbnNfLmVuZCgpLCAiaGFuZGxlICVkIiwgcmVxdWVzdC0+aGFuZGxlKCkpOwotICAgIGNvbm5lY3Rpb24tPnNlY29uZC5jb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKS0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmF3QnVpbGRlcj4gcGFja2V0ID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihzdGQ6OnZlY3Rvcjx1aW50OF90PihyZXF1ZXN0LT5wYXlsb2FkKCkuYmVnaW4oKSwgcmVxdWVzdC0+cGF5bG9hZCgpLmVuZCgpKSk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICByZXR1cm4gcGFja2V0OwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hBY2xEYXRhKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBMZUhhbmRsZU1zZyogcmVxdWVzdCwgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8TGVBY2xEYXRhPiogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjb25uZWN0aW9uID0gYWNsX2Nvbm5lY3Rpb25zXy5maW5kKHJlcXVlc3QtPmhhbmRsZSgpKTsKLSAgICBpZiAoY29ubmVjdGlvbiA9PSBhY2xfY29ubmVjdGlvbnNfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiSW52YWxpZCBoYW5kbGUiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb24tPnNlY29uZC5wZW5kaW5nX2FjbF9kYXRhXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIGJ1aWxkZXJfdG9fc3RyaW5nKHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gYnVpbGRlcikgewotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzOwotICAgIEJpdEluc2VydGVyIGJpdF9pbnNlcnRlcihieXRlcyk7Ci0gICAgYnVpbGRlci0+U2VyaWFsaXplKGJpdF9pbnNlcnRlcik7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ5dGVzLmJlZ2luKCksIGJ5dGVzLmVuZCgpKTsKLSAgfQotCi0gIHZvaWQgb25faW5jb21pbmdfYWNsKHN0ZDo6c2hhcmVkX3B0cjxMZUFjbENvbm5lY3Rpb24+IGNvbm5lY3Rpb24sIHVpbnQxNl90IGhhbmRsZSkgewotICAgIGF1dG8gcGFja2V0ID0gY29ubmVjdGlvbi0+R2V0QWNsUXVldWVFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICAgIGF1dG8gY29ubmVjdGlvbl90cmFja2VyID0gYWNsX2Nvbm5lY3Rpb25zXy5maW5kKGhhbmRsZSk7Ci0gICAgQVNTRVJUX0xPRyhjb25uZWN0aW9uX3RyYWNrZXIgIT0gYWNsX2Nvbm5lY3Rpb25zXy5lbmQoKSwgImhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgTGVBY2xEYXRhIGFjbF9kYXRhOwotICAgIGFjbF9kYXRhLnNldF9oYW5kbGUoaGFuZGxlKTsKLSAgICBhY2xfZGF0YS5zZXRfcGF5bG9hZChzdGQ6OnN0cmluZyhwYWNrZXQtPmJlZ2luKCksIHBhY2tldC0+ZW5kKCkpKTsKLSAgICBjb25uZWN0aW9uX3RyYWNrZXItPnNlY29uZC5wZW5kaW5nX2FjbF9kYXRhXy5PbkluY29taW5nRXZlbnQoYWNsX2RhdGEpOwotICB9Ci0KLSAgdm9pZCBPbkxlQ29ubmVjdFN1Y2Nlc3MoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLCBzdGQ6OnVuaXF1ZV9wdHI8TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uKSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIiVzIiwgYWRkcmVzc193aXRoX3R5cGUuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhhY2xfY29ubmVjdGlvbnNfbXV0ZXhfKTsKLSAgICBhdXRvIGFkZHIgPSBhZGRyZXNzX3dpdGhfdHlwZS5HZXRBZGRyZXNzKCk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPExlQWNsQ29ubmVjdGlvbj4gc2hhcmVkX2Nvbm5lY3Rpb24gPSBzdGQ6Om1vdmUoY29ubmVjdGlvbik7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gc2hhcmVkX2Nvbm5lY3Rpb24tPkdldEhhbmRsZSgpOwotICAgIGFjbF9jb25uZWN0aW9uc18uZW1wbGFjZSgKLSAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAotICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlKSwKLSAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGhhbmRsZSwgc2hhcmVkX2Nvbm5lY3Rpb24sIHBlcl9jb25uZWN0aW9uX2V2ZW50c19bY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfXSkpOwotICAgIHNoYXJlZF9jb25uZWN0aW9uLT5HZXRBY2xRdWV1ZUVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgIGZhY2FkZV9oYW5kbGVyXywKLSAgICAgICAgY29tbW9uOjpCaW5kKCZMZUFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlOjpvbl9pbmNvbWluZ19hY2wsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgc2hhcmVkX2Nvbm5lY3Rpb24sIGhhbmRsZSkpOwotICAgIGF1dG8gY2FsbGJhY2tzID0gYWNsX2Nvbm5lY3Rpb25zXy5maW5kKGhhbmRsZSktPnNlY29uZC5HZXRDYWxsYmFja3MoKTsKLSAgICBzaGFyZWRfY29ubmVjdGlvbi0+UmVnaXN0ZXJDYWxsYmFja3MoY2FsbGJhY2tzLCBmYWNhZGVfaGFuZGxlcl8pOwotICAgIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gYnVpbGRlciA9IExlQ29ubmVjdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgUm9sZTo6Q0VOVFJBTCwKLSAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZS5HZXRBZGRyZXNzVHlwZSgpLAotICAgICAgICAgIGFkZHIsCi0gICAgICAgICAgMSwKLSAgICAgICAgICAyLAotICAgICAgICAgIDMsCi0gICAgICAgICAgQ2xvY2tBY2N1cmFjeTo6UFBNXzIwKTsKLSAgICAgIExlQ29ubmVjdGlvbkV2ZW50IHN1Y2Nlc3M7Ci0gICAgICBzdWNjZXNzLnNldF9wYXlsb2FkKGJ1aWxkZXJfdG9fc3RyaW5nKHN0ZDo6bW92ZShidWlsZGVyKSkpOwotICAgICAgcGVyX2Nvbm5lY3Rpb25fZXZlbnRzX1tjdXJyZW50X2Nvbm5lY3Rpb25fcmVxdWVzdF9dLT5PbkluY29taW5nRXZlbnQoc3VjY2Vzcyk7Ci0gICAgfQotICAgIHdhaXRfZm9yX2JhY2tncm91bmRfY29ubmVjdGlvbl9jb21wbGV0ZSA9IGZhbHNlOwotICAgIGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0XysrOwotICB9Ci0KLSAgdm9pZCBPbkxlQ29ubmVjdEZhaWwoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MsIEVycm9yQ29kZSByZWFzb24pIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIgPSBMZUNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgcmVhc29uLCAwLCBSb2xlOjpDRU5UUkFMLCBhZGRyZXNzLkdldEFkZHJlc3NUeXBlKCksIGFkZHJlc3MuR2V0QWRkcmVzcygpLCAwLCAwLCAwLCBDbG9ja0FjY3VyYWN5OjpQUE1fMjApOwotICAgIExlQ29ubmVjdGlvbkV2ZW50IGZhaWw7Ci0gICAgZmFpbC5zZXRfcGF5bG9hZChidWlsZGVyX3RvX3N0cmluZyhzdGQ6Om1vdmUoYnVpbGRlcikpKTsKLSAgICBwZXJfY29ubmVjdGlvbl9ldmVudHNfW2N1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0X10tPk9uSW5jb21pbmdFdmVudChmYWlsKTsKLSAgICBpZiAoIXdhaXRfZm9yX2JhY2tncm91bmRfY29ubmVjdGlvbl9jb21wbGV0ZSkgewotICAgICAgY3VycmVudF9jb25uZWN0aW9uX3JlcXVlc3RfKys7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgQ29ubmVjdGlvbiA6IHB1YmxpYyBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIHsKLSAgIHB1YmxpYzoKLSAgICBDb25uZWN0aW9uKAotICAgICAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMZUFjbENvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCi0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8TGVDb25uZWN0aW9uRXZlbnQ+PiBldmVudF9zdHJlYW0pCi0gICAgICAgIDogaGFuZGxlXyhoYW5kbGUpLCBjb25uZWN0aW9uXyhzdGQ6Om1vdmUoY29ubmVjdGlvbikpLCBldmVudF9zdHJlYW1fKHN0ZDo6bW92ZShldmVudF9zdHJlYW0pKSB7fQotICAgIHZvaWQgT25Db25uZWN0aW9uVXBkYXRlKAotICAgICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpIG92ZXJyaWRlIHsKLSAgICAgIExPR19JTkZPKAotICAgICAgICAgICJpbnRlcnZhbDogMHglaHgsIGxhdGVuY3k6IDB4JWh4LCB0aW1lb3V0IDB4JWh4IiwKLSAgICAgICAgICBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICAgIGNvbm5lY3Rpb25fbGF0ZW5jeSwKLSAgICAgICAgICBzdXBlcnZpc2lvbl90aW1lb3V0KTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uRGF0YUxlbmd0aENoYW5nZSh1aW50MTZfdCB0eF9vY3RldHMsIHVpbnQxNl90IHR4X3RpbWUsIHVpbnQxNl90IHJ4X29jdGV0cywgdWludDE2X3QgcnhfdGltZSkgb3ZlcnJpZGUgewotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgInR4X29jdGV0czogMHglaHgsIHR4X3RpbWU6IDB4JWh4LCByeF9vY3RldHMgMHglaHgsIHJ4X3RpbWUgMHglaHgiLCB0eF9vY3RldHMsIHR4X3RpbWUsIHJ4X29jdGV0cywgcnhfdGltZSk7Ci0gICAgfQotCi0gICAgdm9pZCBPblBoeVVwZGF0ZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHkpIG92ZXJyaWRlIHt9Ci0gICAgdm9pZCBPbkxvY2FsQWRkcmVzc1VwZGF0ZShBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIG92ZXJyaWRlIHt9Ci0gICAgdm9pZCBPbkRpc2Nvbm5lY3Rpb24oRXJyb3JDb2RlIHJlYXNvbikgb3ZlcnJpZGUgewotICAgICAgc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgICAgICBEaXNjb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGVfLCByZWFzb24pOwotICAgICAgTGVDb25uZWN0aW9uRXZlbnQgZGlzY29ubmVjdGlvbjsKLSAgICAgIGRpc2Nvbm5lY3Rpb24uc2V0X3BheWxvYWQoYnVpbGRlcl90b19zdHJpbmcoc3RkOjptb3ZlKGJ1aWxkZXIpKSk7Ci0gICAgICBldmVudF9zdHJlYW1fLT5PbkluY29taW5nRXZlbnQoZGlzY29ubmVjdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSgKLSAgICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSBvdmVycmlkZSB7fQotCi0gICAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogR2V0Q2FsbGJhY2tzKCkgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgdWludDE2X3QgaGFuZGxlXzsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uXzsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPExlQ29ubmVjdGlvbkV2ZW50Pj4gZXZlbnRfc3RyZWFtXzsKLSAgICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8TGVBY2xEYXRhPiBwZW5kaW5nX2FjbF9kYXRhX3tzdGQ6OnN0cmluZygiUGVuZGluZ0FjbERhdGEiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoaGFuZGxlXyl9OwotICB9OwotCi0gcHJpdmF0ZToKLSAgQWNsTWFuYWdlciogYWNsX21hbmFnZXJfOwotICA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyXzsKLSAgbXV0YWJsZSBzdGQ6Om11dGV4IGFjbF9jb25uZWN0aW9uc19tdXRleF87Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8TGVDb25uZWN0aW9uRXZlbnQ+Pj4gcGVyX2Nvbm5lY3Rpb25fZXZlbnRzXzsKLSAgc3RkOjptYXA8dWludDE2X3QsIENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uc187Ci0gIHVpbnQzMl90IGN1cnJlbnRfY29ubmVjdGlvbl9yZXF1ZXN0X3swfTsKLSAgYm9vbCB3YWl0X2Zvcl9iYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fY29tcGxldGUgPSBmYWxzZTsKLX07Ci0KLXZvaWQgTGVBY2xNYW5hZ2VyRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxBY2xNYW5hZ2VyPigpOwotfQotCi12b2lkIExlQWNsTWFuYWdlckZhY2FkZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IG5ldyBMZUFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlKEdldERlcGVuZGVuY3k8QWNsTWFuYWdlcj4oKSwgR2V0SGFuZGxlcigpKTsKLX0KLQotdm9pZCBMZUFjbE1hbmFnZXJGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIGRlbGV0ZSBzZXJ2aWNlXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKTsKLX0KLQotOjpncnBjOjpTZXJ2aWNlKiBMZUFjbE1hbmFnZXJGYWNhZGVNb2R1bGU6OkdldFNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBMZUFjbE1hbmFnZXJGYWNhZGVNb2R1bGU6OkZhY3RvcnkgPQotICAgIDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IExlQWNsTWFuYWdlckZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUuaCBiL2dkL2hjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDM1ZmUuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLWNsYXNzIExlQWNsTWFuYWdlckZhY2FkZVNlcnZpY2U7Ci0KLWNsYXNzIExlQWNsTWFuYWdlckZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgOjpncnBjOjpTZXJ2aWNlKiBHZXRTZXJ2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBMZUFjbE1hbmFnZXJGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmYWNhZGUKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvbGVfYWNsX21hbmFnZXJfZmFjYWRlLnByb3RvIGIvZ2QvaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmI2YzIuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9sZV9hY2xfbWFuYWdlcl9mYWNhZGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGguaGNpOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byI7Ci1pbXBvcnQgImZhY2FkZS9jb21tb24ucHJvdG8iOwotCi1zZXJ2aWNlIExlQWNsTWFuYWdlckZhY2FkZSB7Ci0gIHJwYyBDcmVhdGVDb25uZWN0aW9uKGJsdWV0b290aC5mYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKSByZXR1cm5zIChzdHJlYW0gTGVDb25uZWN0aW9uRXZlbnQpIHt9Ci0gIHJwYyBDcmVhdGVCYWNrZ3JvdW5kQW5kRGlyZWN0Q29ubmVjdGlvbihibHVldG9vdGguZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSkKLSAgICAgIHJldHVybnMgKHN0cmVhbSBMZUNvbm5lY3Rpb25FdmVudCkge30KLSAgcnBjIENhbmNlbENvbm5lY3Rpb24oYmx1ZXRvb3RoLmZhY2FkZS5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIERpc2Nvbm5lY3QoTGVIYW5kbGVNc2cpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIENvbm5lY3Rpb25Db21tYW5kKExlQ29ubmVjdGlvbkNvbW1hbmRNc2cpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNlbmRBY2xEYXRhKExlQWNsRGF0YSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgRmV0Y2hBY2xEYXRhKExlSGFuZGxlTXNnKSByZXR1cm5zIChzdHJlYW0gTGVBY2xEYXRhKSB7fQotICBycGMgRmV0Y2hJbmNvbWluZ0Nvbm5lY3Rpb24oZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gTGVDb25uZWN0aW9uRXZlbnQpIHt9Ci19Ci0KLW1lc3NhZ2UgTGVIYW5kbGVNc2cgewotICB1aW50MzIgaGFuZGxlID0gMTsKLX0KLQotbWVzc2FnZSBMZUNvbm5lY3Rpb25FdmVudCB7Ci0gIGJ5dGVzIHBheWxvYWQgPSAxOwotfQotCi1tZXNzYWdlIExlQ29ubmVjdGlvbkNvbW1hbmRNc2cgewotICBieXRlcyBwYWNrZXQgPSAxOwotfQotCi1tZXNzYWdlIExlQWNsRGF0YSB7Ci0gIHVpbnQzMiBoYW5kbGUgPSAxOwotICBieXRlcyBwYXlsb2FkID0gMjsKLX0KLQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5jYyBiL2dkL2hjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGQyZGEuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmlkaV9xdWV1ZS5oIgotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX2V2ZW50X3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2xlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2xlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlLmgiCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5wYi5oIgotI2luY2x1ZGUgImhjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotdXNpbmcgOjpncnBjOjpTZXJ2ZXJBc3luY1Jlc3BvbnNlV3JpdGVyOwotdXNpbmcgOjpncnBjOjpTZXJ2ZXJBc3luY1dyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQ29udGV4dDsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyV3JpdGVyOwotdXNpbmcgOjpncnBjOjpTdGF0dXM7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkJsdWV0b290aEFkZHJlc3M7Ci11c2luZyA6OmJsdWV0b290aDo6ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzVHlwZUVudW07Ci0KLWhjaTo6R2FwRGF0YSBHYXBEYXRhRnJvbVByb3RvKGNvbnN0IEdhcERhdGFNc2cmIGdhcF9kYXRhX3Byb3RvKSB7Ci0gIGhjaTo6R2FwRGF0YSBnYXBfZGF0YTsKLSAgYXV0byBkYXRhX2NvcHkgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihnYXBfZGF0YV9wcm90by5kYXRhKCkuYmVnaW4oKSwgZ2FwX2RhdGFfcHJvdG8uZGF0YSgpLmVuZCgpKTsKLSAgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4gcGFja2V0KGRhdGFfY29weSk7Ci0gIGF1dG8gYWZ0ZXIgPSBoY2k6OkdhcERhdGE6OlBhcnNlKCZnYXBfZGF0YSwgcGFja2V0LmJlZ2luKCkpOwotICBBU1NFUlQoYWZ0ZXIgIT0gcGFja2V0LmJlZ2luKCkpOwotICByZXR1cm4gZ2FwX2RhdGE7Ci19Ci0KLWJvb2wgQWR2ZXJ0aXNpbmdDb25maWdGcm9tUHJvdG8oY29uc3QgQWR2ZXJ0aXNpbmdDb25maWcmIGNvbmZpZ19wcm90bywgaGNpOjpFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnKiBjb25maWcpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBlbGVtIDogY29uZmlnX3Byb3RvLmFkdmVydGlzZW1lbnQoKSkgewotICAgIGNvbmZpZy0+YWR2ZXJ0aXNlbWVudC5wdXNoX2JhY2soR2FwRGF0YUZyb21Qcm90byhlbGVtKSk7Ci0gIH0KLQotICBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiBjb25maWdfcHJvdG8uc2Nhbl9yZXNwb25zZSgpKSB7Ci0gICAgY29uZmlnLT5zY2FuX3Jlc3BvbnNlLnB1c2hfYmFjayhHYXBEYXRhRnJvbVByb3RvKGVsZW0pKTsKLSAgfQotCi0gIGlmIChjb25maWdfcHJvdG8uaW50ZXJ2YWxfbWluKCkgPiBVSU5UMTZfTUFYIHx8IGNvbmZpZ19wcm90by5pbnRlcnZhbF9taW4oKSA8IDApIHsKLSAgICBMT0dfV0FSTigiQmFkIGludGVydmFsX21pbjogJWQiLCBjb25maWdfcHJvdG8uaW50ZXJ2YWxfbWluKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb25maWctPmludGVydmFsX21pbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb25maWdfcHJvdG8uaW50ZXJ2YWxfbWluKCkpOwotCi0gIGlmIChjb25maWdfcHJvdG8uaW50ZXJ2YWxfbWF4KCkgPiBVSU5UMTZfTUFYIHx8IGNvbmZpZ19wcm90by5pbnRlcnZhbF9tYXgoKSA8IDApIHsKLSAgICBMT0dfV0FSTigiQmFkIGludGVydmFsX21heDogJWQiLCBjb25maWdfcHJvdG8uaW50ZXJ2YWxfbWF4KCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb25maWctPmludGVydmFsX21heCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb25maWdfcHJvdG8uaW50ZXJ2YWxfbWF4KCkpOwotCi0gIGNvbmZpZy0+YWR2ZXJ0aXNpbmdfdHlwZSA9IHN0YXRpY19jYXN0PGhjaTo6QWR2ZXJ0aXNpbmdUeXBlPihjb25maWdfcHJvdG8uYWR2ZXJ0aXNpbmdfdHlwZSgpKTsKLQotICBjb25maWctPm93bl9hZGRyZXNzX3R5cGUgPSBzdGF0aWNfY2FzdDw6OmJsdWV0b290aDo6aGNpOjpPd25BZGRyZXNzVHlwZT4oY29uZmlnX3Byb3RvLm93bl9hZGRyZXNzX3R5cGUoKSk7Ci0KLSAgY29uZmlnLT5wZWVyX2FkZHJlc3NfdHlwZSA9IHN0YXRpY19jYXN0PDo6Ymx1ZXRvb3RoOjpoY2k6OlBlZXJBZGRyZXNzVHlwZT4oY29uZmlnX3Byb3RvLnBlZXJfYWRkcmVzc190eXBlKCkpOwotCi0gIGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhjb25maWdfcHJvdG8ucGVlcl9hZGRyZXNzKCkuYWRkcmVzcygpLCBjb25maWctPnBlZXJfYWRkcmVzcyk7Ci0KLSAgaWYgKGNvbmZpZ19wcm90by5jaGFubmVsX21hcCgpID4gVUlOVDhfTUFYIHx8IGNvbmZpZ19wcm90by5jaGFubmVsX21hcCgpIDwgMCkgewotICAgIExPR19XQVJOKCJCYWQgY2hhbm5lbF9tYXA6ICVkIiwgY29uZmlnX3Byb3RvLmNoYW5uZWxfbWFwKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb25maWctPmNoYW5uZWxfbWFwID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnX3Byb3RvLmNoYW5uZWxfbWFwKCkpOwotCi0gIGlmIChjb25maWdfcHJvdG8udHhfcG93ZXIoKSA+IFVJTlQ4X01BWCB8fCBjb25maWdfcHJvdG8udHhfcG93ZXIoKSA8IDApIHsKLSAgICBMT0dfV0FSTigiQmFkIHR4X3Bvd2VyOiAlZCIsIGNvbmZpZ19wcm90by50eF9wb3dlcigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25maWctPmZpbHRlcl9wb2xpY3kgPSBzdGF0aWNfY2FzdDxoY2k6OkFkdmVydGlzaW5nRmlsdGVyUG9saWN5Pihjb25maWdfcHJvdG8uZmlsdGVyX3BvbGljeSgpKTsKLQotICBjb25maWctPnR4X3Bvd2VyID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnX3Byb3RvLnR4X3Bvd2VyKCkpOwotCi0gIGNvbmZpZy0+bGVnYWN5X3BkdXMgPSB0cnVlOwotCi0gIGF1dG8gYWR2ZXJ0aXNpbmdfdHlwZSA9IHN0YXRpY19jYXN0PDo6Ymx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nVHlwZT4oY29uZmlnX3Byb3RvLmFkdmVydGlzaW5nX3R5cGUoKSk7Ci0KLSAgc3dpdGNoIChhZHZlcnRpc2luZ190eXBlKSB7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9JTkQ6IHsKLSAgICAgIGNvbmZpZy0+Y29ubmVjdGFibGUgPSB0cnVlOwotICAgICAgY29uZmlnLT5zY2FubmFibGUgPSB0cnVlOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9ESVJFQ1RfSU5EOiB7Ci0gICAgICBjb25maWctPmNvbm5lY3RhYmxlID0gdHJ1ZTsKLSAgICAgIGNvbmZpZy0+ZGlyZWN0ZWQgPSB0cnVlOwotICAgICAgY29uZmlnLT5oaWdoX2R1dHlfZGlyZWN0ZWRfY29ubmVjdGFibGUgPSB0cnVlOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9TQ0FOX0lORDogewotICAgICAgY29uZmlnLT5zY2FubmFibGUgPSB0cnVlOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9OT05DT05OX0lORDogewotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9ESVJFQ1RfSU5EX0xPVzogewotICAgICAgY29uZmlnLT5kaXJlY3RlZCA9IHRydWU7Ci0gICAgICBjb25maWctPmNvbm5lY3RhYmxlID0gdHJ1ZTsKLSAgICB9IGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZ0Zyb21Qcm90bygKLSAgICBjb25zdCBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnJiBjb25maWdfcHJvdG8sIGhjaTo6RXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZyogY29uZmlnKSB7Ci0gIGlmICghQWR2ZXJ0aXNpbmdDb25maWdGcm9tUHJvdG8oY29uZmlnX3Byb3RvLmFkdmVydGlzaW5nX2NvbmZpZygpLCBjb25maWcpKSB7Ci0gICAgTE9HX1dBUk4oIkVycm9yIHBhcnNpbmcgYWR2ZXJ0aXNpbmcgY29uZmlnIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbmZpZy0+Y29ubmVjdGFibGUgPSBjb25maWdfcHJvdG8uY29ubmVjdGFibGUoKTsKLSAgY29uZmlnLT5zY2FubmFibGUgPSBjb25maWdfcHJvdG8uc2Nhbm5hYmxlKCk7Ci0gIGNvbmZpZy0+ZGlyZWN0ZWQgPSBjb25maWdfcHJvdG8uZGlyZWN0ZWQoKTsKLSAgY29uZmlnLT5oaWdoX2R1dHlfZGlyZWN0ZWRfY29ubmVjdGFibGUgPSBjb25maWdfcHJvdG8uaGlnaF9kdXR5X2RpcmVjdGVkX2Nvbm5lY3RhYmxlKCk7Ci0gIGNvbmZpZy0+bGVnYWN5X3BkdXMgPSBjb25maWdfcHJvdG8ubGVnYWN5X3BkdXMoKTsKLSAgY29uZmlnLT5hbm9ueW1vdXMgPSBjb25maWdfcHJvdG8uYW5vbnltb3VzKCk7Ci0gIGNvbmZpZy0+aW5jbHVkZV90eF9wb3dlciA9IGNvbmZpZ19wcm90by5pbmNsdWRlX3R4X3Bvd2VyKCk7Ci0gIGNvbmZpZy0+dXNlX2xlX2NvZGVkX3BoeSA9IGNvbmZpZ19wcm90by51c2VfbGVfY29kZWRfcGh5KCk7Ci0gIGNvbmZpZy0+c2Vjb25kYXJ5X21heF9za2lwID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnX3Byb3RvLnNlY29uZGFyeV9tYXhfc2tpcCgpKTsKLSAgY29uZmlnLT5zZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5ID0gc3RhdGljX2Nhc3Q8aGNpOjpTZWNvbmRhcnlQaHlUeXBlPihjb25maWdfcHJvdG8uc2Vjb25kYXJ5X2FkdmVydGlzaW5nX3BoeSgpKTsKLSAgY29uZmlnLT5zaWQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWdfcHJvdG8uc2lkKCkpOwotICBjb25maWctPmVuYWJsZV9zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9ucyA9Ci0gICAgICBzdGF0aWNfY2FzdDxoY2k6OkVuYWJsZT4oY29uZmlnX3Byb3RvLmVuYWJsZV9zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9ucygpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnNGcm9tUHJvdG8oCi0gICAgY29uc3QgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMmIGNvbmZpZ19wcm90bywgaGNpOjpQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyogY29uZmlnKSB7Ci0gIGlmIChjb25maWdfcHJvdG8ubWluX2ludGVydmFsKCkgPiBVSU5UMTZfTUFYIHx8IGNvbmZpZ19wcm90by5taW5faW50ZXJ2YWwoKSA8IDApIHsKLSAgICBMT0dfV0FSTigiQmFkIGludGVydmFsX21pbjogJWQiLCBjb25maWdfcHJvdG8ubWluX2ludGVydmFsKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb25maWctPm1pbl9pbnRlcnZhbCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb25maWdfcHJvdG8ubWluX2ludGVydmFsKCkpOwotICBpZiAoY29uZmlnX3Byb3RvLm1heF9pbnRlcnZhbCgpID4gVUlOVDE2X01BWCB8fCBjb25maWdfcHJvdG8ubWF4X2ludGVydmFsKCkgPCAwKSB7Ci0gICAgTE9HX1dBUk4oIkJhZCBpbnRlcnZhbF9tYXg6ICVkIiwgY29uZmlnX3Byb3RvLm1heF9pbnRlcnZhbCgpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY29uZmlnLT5tYXhfaW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29uZmlnX3Byb3RvLm1heF9pbnRlcnZhbCgpKTsKLSAgY29uZmlnLT5wcm9wZXJ0aWVzID0KLSAgICAgIHN0YXRpY19jYXN0PGhjaTo6UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnM6OkFkdmVydGlzaW5nUHJvcGVydHk+KGNvbmZpZ19wcm90by5hZHZlcnRpc2luZ19wcm9wZXJ0eSgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNsYXNzIExlQWR2ZXJ0aXNlciB7Ci0gcHVibGljOgotICBMZUFkdmVydGlzZXIoaGNpOjpBZHZlcnRpc2luZ0NvbmZpZyBjb25maWcpIDogY29uZmlnXyhzdGQ6Om1vdmUoY29uZmlnKSkge30KLQotICB2b2lkIFNjYW5DYWxsYmFjayhBZGRyZXNzIGFkZHJlc3MsIEFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSkge30KLQotICB2b2lkIFRlcm1pbmF0ZWRDYWxsYmFjayhFcnJvckNvZGUgZXJyb3JfY29kZSwgdWludDhfdCwgdWludDhfdCkge30KLQotICBoY2k6OkFkdmVydGlzZXJJZCBHZXRBZHZlcnRpc2VySWQoKSB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotCi0gIHZvaWQgU2V0QWR2ZXJ0aXNlcklkKGhjaTo6QWR2ZXJ0aXNlcklkIGlkKSB7Ci0gICAgaWRfID0gaWQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGhjaTo6QWR2ZXJ0aXNlcklkIGlkXyA9IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkOwotICBoY2k6OkFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZ187Ci19OwotCi1jbGFzcyBMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZVNlcnZpY2UgOiBwdWJsaWMgTGVBZHZlcnRpc2luZ01hbmFnZXJGYWNhZGU6OlNlcnZpY2UsIEFkdmVydGlzaW5nQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTGVBZHZlcnRpc2luZ01hbmFnZXJGYWNhZGVTZXJ2aWNlKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyKiBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyLCBvczo6SGFuZGxlciogZmFjYWRlX2hhbmRsZXIpCi0gICAgICA6IGxlX2FkdmVydGlzaW5nX21hbmFnZXJfKGxlX2FkdmVydGlzaW5nX21hbmFnZXIpLCBmYWNhZGVfaGFuZGxlcl8oZmFjYWRlX2hhbmRsZXIpIHsKLSAgICBBU1NFUlQobGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGZhY2FkZV9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIENyZWF0ZUFkdmVydGlzZXIoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBDcmVhdGVBZHZlcnRpc2VyUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVBZHZlcnRpc2VyUmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZyA9IHt9OwotICAgIGlmICghQWR2ZXJ0aXNpbmdDb25maWdGcm9tUHJvdG8ocmVxdWVzdC0+Y29uZmlnKCksICZjb25maWcpKSB7Ci0gICAgICBMT0dfV0FSTigiRXJyb3IgcGFyc2luZyBhZHZlcnRpc2luZyBjb25maWcgJXMiLCByZXF1ZXN0LT5TZXJpYWxpemVBc1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmVzcG9uc2UtPnNldF9hZHZlcnRpc2VyX2lkKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkKTsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJFcnJvciB3aGlsZSBwYXJzaW5nIGFkdmVydGlzaW5nIGNvbmZpZyIpOwotICAgIH0KLSAgICBMZUFkdmVydGlzZXIgbGVfYWR2ZXJ0aXNlcihjb25maWcpOwotICAgIGF1dG8gYWR2ZXJ0aXNlcl9pZCA9IGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIoCi0gICAgICAgIDAsCi0gICAgICAgIGNvbmZpZywKLSAgICAgICAgY29tbW9uOjpCaW5kKCZMZUFkdmVydGlzZXI6OlNjYW5DYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKCZsZV9hZHZlcnRpc2VyKSksCi0gICAgICAgIGNvbW1vbjo6QmluZCgmTGVBZHZlcnRpc2VyOjpUZXJtaW5hdGVkQ2FsbGJhY2ssIGNvbW1vbjo6VW5yZXRhaW5lZCgmbGVfYWR2ZXJ0aXNlcikpLAotICAgICAgICAwLAotICAgICAgICAwLAotICAgICAgICBmYWNhZGVfaGFuZGxlcl8pOwotICAgIGlmIChhZHZlcnRpc2VyX2lkICE9IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkKSB7Ci0gICAgICBsZV9hZHZlcnRpc2VyLlNldEFkdmVydGlzZXJJZChhZHZlcnRpc2VyX2lkKTsKLSAgICAgIGxlX2FkdmVydGlzZXJzXy5wdXNoX2JhY2sobGVfYWR2ZXJ0aXNlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19XQVJOKCJGYWlsZWQgdG8gY3JlYXRlIGFkdmVydGlzZXIiKTsKLSAgICB9Ci0gICAgcmVzcG9uc2UtPnNldF9hZHZlcnRpc2VyX2lkKGFkdmVydGlzZXJfaWQpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBFeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkQ3JlYXRlQWR2ZXJ0aXNlclJlc3BvbnNlKiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6RXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZyBjb25maWcgPSB7fTsKLSAgICBpZiAoIUV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWdGcm9tUHJvdG8ocmVxdWVzdC0+Y29uZmlnKCksICZjb25maWcpKSB7Ci0gICAgICBMT0dfV0FSTigiRXJyb3IgcGFyc2luZyBhZHZlcnRpc2luZyBjb25maWcgJXMiLCByZXF1ZXN0LT5TZXJpYWxpemVBc1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmVzcG9uc2UtPnNldF9hZHZlcnRpc2VyX2lkKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkKTsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJFcnJvciB3aGlsZSBwYXJzaW5nIGFkdmVydGlzaW5nIGNvbmZpZyIpOwotICAgIH0KLSAgICBMZUFkdmVydGlzZXIgbGVfYWR2ZXJ0aXNlcihjb25maWcpOwotICAgIGF1dG8gYWR2ZXJ0aXNlcl9pZCA9IGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIoCi0gICAgICAgIDAsCi0gICAgICAgIGNvbmZpZywKLSAgICAgICAgY29tbW9uOjpCaW5kKCZMZUFkdmVydGlzZXI6OlNjYW5DYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKCZsZV9hZHZlcnRpc2VyKSksCi0gICAgICAgIGNvbW1vbjo6QmluZCgmTGVBZHZlcnRpc2VyOjpUZXJtaW5hdGVkQ2FsbGJhY2ssIGNvbW1vbjo6VW5yZXRhaW5lZCgmbGVfYWR2ZXJ0aXNlcikpLAotICAgICAgICAwLAotICAgICAgICAwLAotICAgICAgICBmYWNhZGVfaGFuZGxlcl8pOwotICAgIGlmIChhZHZlcnRpc2VyX2lkICE9IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkKSB7Ci0gICAgICBsZV9hZHZlcnRpc2VyLlNldEFkdmVydGlzZXJJZChhZHZlcnRpc2VyX2lkKTsKLSAgICAgIGxlX2FkdmVydGlzZXJzXy5wdXNoX2JhY2sobGVfYWR2ZXJ0aXNlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19XQVJOKCJGYWlsZWQgdG8gY3JlYXRlIGFkdmVydGlzZXIiKTsKLSAgICB9Ci0gICAgcmVzcG9uc2UtPnNldF9hZHZlcnRpc2VyX2lkKGFkdmVydGlzZXJfaWQpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBFbmFibGVBZHZlcnRpc2VyKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgRW5hYmxlQWR2ZXJ0aXNlclJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVBZHZlcnRpc2VyKHJlcXVlc3QtPmFkdmVydGlzZXJfaWQoKSwgcmVxdWVzdC0+ZW5hYmxlKCksIDAsIDApOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXREYXRhKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBTZXREYXRhUmVxdWVzdCogcmVxdWVzdCwgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBhZHZlcnRpc2luZ19kYXRhID0ge307Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbGVtIDogcmVxdWVzdC0+ZGF0YSgpKSB7Ci0gICAgICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhHYXBEYXRhRnJvbVByb3RvKGVsZW0pKTsKLSAgICB9Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEocmVxdWVzdC0+YWR2ZXJ0aXNlcl9pZCgpLCByZXF1ZXN0LT5zZXRfc2Nhbl9yc3AoKSwgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNldFBhcmFtZXRlcnMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBTZXRQYXJhbWV0ZXJzUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZyA9IHt9OwotICAgIGlmICghQWR2ZXJ0aXNpbmdDb25maWdGcm9tUHJvdG8ocmVxdWVzdC0+Y29uZmlnKCksICZjb25maWcpKSB7Ci0gICAgICBMT0dfV0FSTigiRXJyb3IgcGFyc2luZyBhZHZlcnRpc2luZyBjb25maWcgJXMiLCByZXF1ZXN0LT5TZXJpYWxpemVBc1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6SU5WQUxJRF9BUkdVTUVOVCwgIkVycm9yIHdoaWxlIHBhcnNpbmcgYWR2ZXJ0aXNpbmcgY29uZmlnIik7Ci0gICAgfQotICAgIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXRQYXJhbWV0ZXJzKHJlcXVlc3QtPmFkdmVydGlzZXJfaWQoKSwgY29uZmlnKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2V0UGVyaW9kaWNQYXJhbWV0ZXJzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgU2V0UGVyaW9kaWNQYXJhbWV0ZXJzUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyBjb25maWcgPSB7fTsKLSAgICBpZiAoIVBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzRnJvbVByb3RvKHJlcXVlc3QtPmNvbmZpZygpLCAmY29uZmlnKSkgewotICAgICAgTE9HX1dBUk4oIkVycm9yIHBhcnNpbmcgcGVyaW9kaWMgYWR2ZXJ0aXNpbmcgcGFyYW1ldGVycyAlcyIsIHJlcXVlc3QtPlNlcmlhbGl6ZUFzU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoCi0gICAgICAgICAgOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiRXJyb3Igd2hpbGUgcGFyc2luZyBwZXJpb2RpYyBhZHZlcnRpc2luZyBwYXJhbWV0ZXJzIik7Ci0gICAgfQotICAgIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXRQZXJpb2RpY1BhcmFtZXRlcnMocmVxdWVzdC0+YWR2ZXJ0aXNlcl9pZCgpLCBjb25maWcpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRQZXJpb2RpY0RhdGEoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBTZXRQZXJpb2RpY0RhdGFSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBhZHZlcnRpc2luZ19kYXRhID0ge307Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbGVtIDogcmVxdWVzdC0+ZGF0YSgpKSB7Ci0gICAgICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhHYXBEYXRhRnJvbVByb3RvKGVsZW0pKTsKLSAgICB9Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldFBlcmlvZGljRGF0YShyZXF1ZXN0LT5hZHZlcnRpc2VyX2lkKCksIGFkdmVydGlzaW5nX2RhdGEpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBFbmFibGVQZXJpb2RpY0FkdmVydGlzaW5nKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgRW5hYmxlUGVyaW9kaWNBZHZlcnRpc2luZ1JlcXVlc3QqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVQZXJpb2RpY0FkdmVydGlzaW5nKHJlcXVlc3QtPmFkdmVydGlzZXJfaWQoKSwgcmVxdWVzdC0+ZW5hYmxlKCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBHZXRPd25BZGRyZXNzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgR2V0T3duQWRkcmVzc1JlcXVlc3QqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5HZXRPd25BZGRyZXNzKHJlcXVlc3QtPmFkdmVydGlzZXJfaWQoKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TnVtYmVyT2ZBZHZlcnRpc2luZ0luc3RhbmNlc1Jlc3BvbnNlKiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHJlc3BvbnNlLT5zZXRfbnVtX2FkdmVydGlzaW5nX2luc3RhbmNlcyhsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+R2V0TnVtYmVyT2ZBZHZlcnRpc2luZ0luc3RhbmNlcygpKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgUmVtb3ZlQWR2ZXJ0aXNlcig6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFJlbW92ZUFkdmVydGlzZXJSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaWYgKHJlcXVlc3QtPmFkdmVydGlzZXJfaWQoKSA9PSBMZUFkdmVydGlzaW5nTWFuYWdlcjo6a0ludmFsaWRJZCkgewotICAgICAgTE9HX1dBUk4oIkludmFsaWQgYWR2ZXJ0aXNlciBJRCAlZCIsIHJlcXVlc3QtPmFkdmVydGlzZXJfaWQoKSk7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpJTlZBTElEX0FSR1VNRU5ULCAiSW52bGlkIGFkdmVydGlzZXIgSUQgcmVjZWl2ZWQiKTsKLSAgICB9Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlJlbW92ZUFkdmVydGlzZXIocmVxdWVzdC0+YWR2ZXJ0aXNlcl9pZCgpKTsKLSAgICBmb3IgKGF1dG8gaXRlciA9IGxlX2FkdmVydGlzZXJzXy5iZWdpbigpOyBpdGVyICE9IGxlX2FkdmVydGlzZXJzXy5lbmQoKTspIHsKLSAgICAgIGlmIChpdGVyLT5HZXRBZHZlcnRpc2VySWQoKSA9PSByZXF1ZXN0LT5hZHZlcnRpc2VyX2lkKCkpIHsKLSAgICAgICAgaXRlciA9IGxlX2FkdmVydGlzZXJzXy5lcmFzZShpdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICsraXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEZldGNoQ2FsbGJhY2tFdmVudHMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8QWR2ZXJ0aXNpbmdDYWxsYmFja01zZz4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5SZWdpc3RlckFkdmVydGlzaW5nQ2FsbGJhY2sodGhpcyk7Ci0gICAgcmV0dXJuIGNhbGxiYWNrX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hBZGRyZXNzRXZlbnRzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPEFkZHJlc3NNc2c+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYWRkcmVzc19ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfQotCi0gIHZvaWQgT25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoaW50IHJlZ19pZCwgdWludDhfdCBhZHZlcnRpc2VyX2lkLCBpbnQ4X3QgdHhfcG93ZXIsIEFkdmVydGlzaW5nU3RhdHVzIHN0YXR1cykgewotICAgIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2cgbXNnOwotICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlOjpBRFZFUlRJU0lOR19TRVRfU1RBUlRFRCk7Ci0gICAgbXNnLnNldF9hZHZlcnRpc2VyX2lkKGFkdmVydGlzZXJfaWQpOwotICAgIG1zZy5zZXRfc3RhdHVzKHN0YXRpY19jYXN0PGZhY2FkZTo6QWR2ZXJ0aXNpbmdTdGF0dXM+KHN0YXR1cykpOwotICAgIG1zZy5zZXRfZGF0YShyZWdfaWQpOwotICAgIGNhbGxiYWNrX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KG1zZyk7Ci0gIH07Ci0KLSAgdm9pZCBPbkFkdmVydGlzaW5nRW5hYmxlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLCB1aW50OF90IHN0YXR1cykgewotICAgIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2cgbXNnOwotICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlOjpBRFZFUlRJU0lOR19FTkFCTEVEKTsKLSAgICBtc2cuc2V0X2FkdmVydGlzZXJfaWQoYWR2ZXJ0aXNlcl9pZCk7Ci0gICAgbXNnLnNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8ZmFjYWRlOjpBZHZlcnRpc2luZ1N0YXR1cz4oc3RhdHVzKSk7Ci0gICAgbXNnLnNldF9kYXRhKGVuYWJsZSA/IDEgOiAwKTsKLSAgICBjYWxsYmFja19ldmVudHNfLk9uSW5jb21pbmdFdmVudChtc2cpOwotICB9OwotCi0gIHZvaWQgT25BZHZlcnRpc2luZ0RhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgewotICAgIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2cgbXNnOwotICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlOjpBRFZFUlRJU0lOR19EQVRBX1NFVCk7Ci0gICAgbXNnLnNldF9hZHZlcnRpc2VyX2lkKGFkdmVydGlzZXJfaWQpOwotICAgIG1zZy5zZXRfc3RhdHVzKHN0YXRpY19jYXN0PGZhY2FkZTo6QWR2ZXJ0aXNpbmdTdGF0dXM+KHN0YXR1cykpOwotICAgIGNhbGxiYWNrX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KG1zZyk7Ci0gIH07Ci0KLSAgdm9pZCBPblNjYW5SZXNwb25zZURhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgewotICAgIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2cgbXNnOwotICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlOjpTQ0FOX1JFU1BPTlNFX0RBVEFfU0VUKTsKLSAgICBtc2cuc2V0X2FkdmVydGlzZXJfaWQoYWR2ZXJ0aXNlcl9pZCk7Ci0gICAgbXNnLnNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8ZmFjYWRlOjpBZHZlcnRpc2luZ1N0YXR1cz4oc3RhdHVzKSk7Ci0gICAgY2FsbGJhY2tfZXZlbnRzXy5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgfTsKLQotICB2b2lkIE9uQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIGludDhfdCB0eF9wb3dlciwgdWludDhfdCBzdGF0dXMpIHsKLSAgICBBZHZlcnRpc2luZ0NhbGxiYWNrTXNnIG1zZzsKLSAgICBtc2cuc2V0X21lc3NhZ2VfdHlwZShBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZTo6QURWRVJUSVNJTkdfUEFSQU1FVEVSU19VUERBVEVEKTsKLSAgICBtc2cuc2V0X2FkdmVydGlzZXJfaWQoYWR2ZXJ0aXNlcl9pZCk7Ci0gICAgbXNnLnNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8ZmFjYWRlOjpBZHZlcnRpc2luZ1N0YXR1cz4oc3RhdHVzKSk7Ci0gICAgY2FsbGJhY2tfZXZlbnRzXy5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgfTsKLQotICB2b2lkIE9uUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICBBZHZlcnRpc2luZ0NhbGxiYWNrTXNnIG1zZzsKLSAgICBtc2cuc2V0X21lc3NhZ2VfdHlwZShBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZTo6UEVSSU9ESUNfQURWRVJUSVNJTkdfUEFSQU1FVEVSU19VUERBVEVEKTsKLSAgICBtc2cuc2V0X2FkdmVydGlzZXJfaWQoYWR2ZXJ0aXNlcl9pZCk7Ci0gICAgbXNnLnNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8ZmFjYWRlOjpBZHZlcnRpc2luZ1N0YXR1cz4oc3RhdHVzKSk7Ci0gICAgY2FsbGJhY2tfZXZlbnRzXy5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgfTsKLQotICB2b2lkIE9uUGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgewotICAgIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2cgbXNnOwotICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlOjpQRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBX1NFVCk7Ci0gICAgbXNnLnNldF9hZHZlcnRpc2VyX2lkKGFkdmVydGlzZXJfaWQpOwotICAgIG1zZy5zZXRfc3RhdHVzKHN0YXRpY19jYXN0PGZhY2FkZTo6QWR2ZXJ0aXNpbmdTdGF0dXM+KHN0YXR1cykpOwotICAgIGNhbGxiYWNrX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KG1zZyk7Ci0gIH07Ci0KLSAgdm9pZCBPblBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgQWR2ZXJ0aXNpbmdDYWxsYmFja01zZyBtc2c7Ci0gICAgbXNnLnNldF9tZXNzYWdlX3R5cGUoQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGU6OlBFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRUQpOwotICAgIG1zZy5zZXRfYWR2ZXJ0aXNlcl9pZChhZHZlcnRpc2VyX2lkKTsKLSAgICBtc2cuc2V0X3N0YXR1cyhzdGF0aWNfY2FzdDxmYWNhZGU6OkFkdmVydGlzaW5nU3RhdHVzPihzdGF0dXMpKTsKLSAgICBjYWxsYmFja19ldmVudHNfLk9uSW5jb21pbmdFdmVudChtc2cpOwotICB9OwotCi0gIHZvaWQgT25Pd25BZGRyZXNzUmVhZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIHVpbnQ4X3QgYWRkcmVzc190eXBlLCBBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBMT0dfSU5GTygiT25Pd25BZGRyZXNzUmVhZCBBZGRyZXNzOiVzLCBhZGRyZXNzX3R5cGU6JWQiLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgYWRkcmVzc190eXBlKTsKLSAgICBBZGRyZXNzTXNnIG1zZzsKLSAgICBtc2cuc2V0X21lc3NhZ2VfdHlwZShBZHZlcnRpc2luZ0NhbGxiYWNrTXNnVHlwZTo6T1dOX0FERFJFU1NfUkVBRCk7Ci0gICAgbXNnLnNldF9hZHZlcnRpc2VyX2lkKGFkdmVydGlzZXJfaWQpOwotICAgIGJsdWV0b290aDo6ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUgZmFjYWRlX2FkZHJlc3M7Ci0gICAgZmFjYWRlX2FkZHJlc3MubXV0YWJsZV9hZGRyZXNzKCktPnNldF9hZGRyZXNzKGFkZHJlc3MuVG9TdHJpbmcoKSk7Ci0gICAgZmFjYWRlX2FkZHJlc3Muc2V0X3R5cGUoc3RhdGljX2Nhc3Q8ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzVHlwZUVudW0+KGFkZHJlc3NfdHlwZSkpOwotICAgICptc2cubXV0YWJsZV9hZGRyZXNzKCkgPSBmYWNhZGVfYWRkcmVzczsKLSAgICBhZGRyZXNzX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KG1zZyk7Ci0gIH07Ci0KLSAgc3RkOjp2ZWN0b3I8TGVBZHZlcnRpc2VyPiBsZV9hZHZlcnRpc2Vyc187Ci0gIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyKiBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXzsKLSAgb3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPEFkdmVydGlzaW5nQ2FsbGJhY2tNc2c+IGNhbGxiYWNrX2V2ZW50c197ImNhbGxiYWNrIGV2ZW50cyJ9OwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8QWRkcmVzc01zZz4gYWRkcmVzc19ldmVudHNfeyJhZGRyZXNzIGV2ZW50cyJ9OwotfTsKLQotdm9pZCBMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKGxpc3QpOwotICBsaXN0LT5hZGQ8aGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlcj4oKTsKLX0KLQotdm9pZCBMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IG5ldyBMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZVNlcnZpY2UoR2V0RGVwZW5kZW5jeTxoY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyPigpLCBHZXRIYW5kbGVyKCkpOwotfQotCi12b2lkIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyRmFjYWRlTW9kdWxlOjpTdG9wKCkgewotICBkZWxldGUgc2VydmljZV87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdG9wKCk7Ci19Ci0KLTo6Z3JwYzo6U2VydmljZSogTGVBZHZlcnRpc2luZ01hbmFnZXJGYWNhZGVNb2R1bGU6OkdldFNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZU1vZHVsZTo6RmFjdG9yeSA9Ci0gICAgOjpibHVldG9vdGg6Ok1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgTGVBZHZlcnRpc2luZ01hbmFnZXJGYWNhZGVNb2R1bGUoKTsgfSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBmYWNhZGUKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUuaCBiL2dkL2hjaS9mYWNhZGUvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZjQzZS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZmFjYWRlL2xlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxncnBjKysvZ3JwYysrLmg+Ci0KLSNpbmNsdWRlICJncnBjL2dycGNfbW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgTGVBZHZlcnRpc2luZ01hbmFnZXJGYWNhZGVTZXJ2aWNlOwotCi1jbGFzcyBMZUFkdmVydGlzaW5nTWFuYWdlckZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLQotICA6OmdycGM6OlNlcnZpY2UqIEdldFNlcnZpY2UoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyRmFjYWRlU2VydmljZSogc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZmFjYWRlCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvZmFjYWRlL2xlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlLnByb3RvIGIvZ2QvaGNpL2ZhY2FkZS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2YWY5NS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZmFjYWRlL2xlX2FkdmVydGlzaW5nX21hbmFnZXJfZmFjYWRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGJsdWV0b290aC5oY2kuZmFjYWRlOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byI7Ci1pbXBvcnQgImZhY2FkZS9jb21tb24ucHJvdG8iOwotCi1zZXJ2aWNlIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyRmFjYWRlIHsKLSAgcnBjIENyZWF0ZUFkdmVydGlzZXIoQ3JlYXRlQWR2ZXJ0aXNlclJlcXVlc3QpIHJldHVybnMgKENyZWF0ZUFkdmVydGlzZXJSZXNwb25zZSkge30KLSAgcnBjIEV4dGVuZGVkQ3JlYXRlQWR2ZXJ0aXNlcihFeHRlbmRlZENyZWF0ZUFkdmVydGlzZXJSZXF1ZXN0KSByZXR1cm5zIChFeHRlbmRlZENyZWF0ZUFkdmVydGlzZXJSZXNwb25zZSkge30KLSAgcnBjIEVuYWJsZUFkdmVydGlzZXIoRW5hYmxlQWR2ZXJ0aXNlclJlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNldERhdGEoU2V0RGF0YVJlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNldFBhcmFtZXRlcnMoU2V0UGFyYW1ldGVyc1JlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNldFBlcmlvZGljUGFyYW1ldGVycyhTZXRQZXJpb2RpY1BhcmFtZXRlcnNSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZXRQZXJpb2RpY0RhdGEoU2V0UGVyaW9kaWNEYXRhUmVxdWVzdCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgRW5hYmxlUGVyaW9kaWNBZHZlcnRpc2luZyhFbmFibGVQZXJpb2RpY0FkdmVydGlzaW5nUmVxdWVzdCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgR2V0T3duQWRkcmVzcyhHZXRPd25BZGRyZXNzUmVxdWVzdCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgR2V0TnVtYmVyT2ZBZHZlcnRpc2luZ0luc3RhbmNlcyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKEdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXNSZXNwb25zZSkge30KLSAgcnBjIFJlbW92ZUFkdmVydGlzZXIoUmVtb3ZlQWR2ZXJ0aXNlclJlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEZldGNoQ2FsbGJhY2tFdmVudHMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gQWR2ZXJ0aXNpbmdDYWxsYmFja01zZykge30KLSAgcnBjIEZldGNoQWRkcmVzc0V2ZW50cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBBZGRyZXNzTXNnKSB7fQotfQotCi1tZXNzYWdlIEdhcERhdGFNc2cgewotICBieXRlcyBkYXRhID0gMTsKLX0KLQotZW51bSBBZHZlcnRpc2luZ0V2ZW50VHlwZSB7Ci0gIEFEVl9JTkQgPSAweDA7Ci0gIEFEVl9ESVJFQ1RfSU5EID0gMHgxOwotICBBRFZfU0NBTl9JTkQgPSAweDI7Ci0gIEFEVl9OT05DT05OX0lORCA9IDB4MzsKLSAgQURWX0RJUkVDVF9JTkRfTE9XID0gMHg0OwotfQotCi1lbnVtIEFkdmVydGlzaW5nRmlsdGVyUG9saWN5IHsKLSAgQUxMX0RFVklDRVMgPSAweDA7Ci0gIExJU1RFRF9TQ0FOID0gMHgxOwotICBMSVNURURfQ09OTkVDVCA9IDB4MjsKLSAgTElTVEVEX1NDQU5fQU5EX0NPTk5FQ1QgPSAweDM7Ci19OwotCi1lbnVtIEFkdmVydGlzaW5nUHJvcGVydHkgewotICBOT05FID0gMHgwMDsKLSAgSU5DTFVERV9UWF9QT1dFUiA9IDB4MDY7Ci19OwotCi1lbnVtIEFkdmVydGlzaW5nU3RhdHVzIHsKLSAgQURWX1NVQ0NFU1MgPSAweDAwOwotICBBRFZfREFUQV9UT09fTEFSR0UgPSAweDAxOwotICBBRFZfVE9PX01BTllfQURWRVJUSVNFUlMgPSAweDAyOwotICBBRFZfQUxSRUFEWV9TVEFSVEVEID0gMHgwMzsKLSAgQURWX0lOVEVSTkFMX0VSUk9SID0gMHgwNDsKLSAgQURWX0ZFQVRVUkVfVU5TVVBQT1JURUQgPSAweDA1OwotfTsKLQotbWVzc2FnZSBBZHZlcnRpc2luZ0NvbmZpZyB7Ci0gIHJlcGVhdGVkIEdhcERhdGFNc2cgYWR2ZXJ0aXNlbWVudCA9IDE7Ci0gIHJlcGVhdGVkIEdhcERhdGFNc2cgc2Nhbl9yZXNwb25zZSA9IDI7Ci0gIC8vIFVuaXQ6IG51bWJlciBvZiBCbHVldG9vdGggc2xvdHMgaW4gMC4xMjUgbXMgaW5jcmVtZW50Ci0gIGludDMyIGludGVydmFsX21pbiA9IDQ7Ci0gIC8vIFVuaXQ6IG51bWJlciBvZiBCbHVldG9vdGggc2xvdHMgaW4gMC4xMjUgbXMgaW5jcmVtZW50Ci0gIGludDMyIGludGVydmFsX21heCA9IDU7Ci0gIEFkdmVydGlzaW5nRXZlbnRUeXBlIGFkdmVydGlzaW5nX3R5cGUgPSA2OwotICBibHVldG9vdGguZmFjYWRlLkJsdWV0b290aE93bkFkZHJlc3NUeXBlRW51bSBvd25fYWRkcmVzc190eXBlID0gNzsKLSAgYmx1ZXRvb3RoLmZhY2FkZS5CbHVldG9vdGhQZWVyQWRkcmVzc1R5cGVFbnVtIHBlZXJfYWRkcmVzc190eXBlID0gODsKLSAgYmx1ZXRvb3RoLmZhY2FkZS5CbHVldG9vdGhBZGRyZXNzIHBlZXJfYWRkcmVzcyA9IDk7Ci0gIGludDMyIGNoYW5uZWxfbWFwID0gMTA7Ci0gIEFkdmVydGlzaW5nRmlsdGVyUG9saWN5IGZpbHRlcl9wb2xpY3kgPSAxMTsKLSAgaW50MzIgdHhfcG93ZXIgPSAxMjsKLX0KLQotbWVzc2FnZSBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIHsKLSAgQWR2ZXJ0aXNpbmdDb25maWcgYWR2ZXJ0aXNpbmdfY29uZmlnID0gMTsKLSAgYm9vbCBjb25uZWN0YWJsZSA9IDI7Ci0gIGJvb2wgc2Nhbm5hYmxlID0gMzsKLSAgYm9vbCBkaXJlY3RlZCA9IDQ7Ci0gIGJvb2wgaGlnaF9kdXR5X2RpcmVjdGVkX2Nvbm5lY3RhYmxlID0gNTsKLSAgYm9vbCBsZWdhY3lfcGR1cyA9IDY7Ci0gIGJvb2wgYW5vbnltb3VzID0gNzsKLSAgYm9vbCBpbmNsdWRlX3R4X3Bvd2VyID0gODsKLSAgYm9vbCB1c2VfbGVfY29kZWRfcGh5ID0gOTsKLSAgaW50MzIgc2Vjb25kYXJ5X21heF9za2lwID0gMTA7Ci0gIGludDMyIHNlY29uZGFyeV9hZHZlcnRpc2luZ19waHkgPSAxMTsKLSAgaW50MzIgc2lkID0gMTI7Ci0gIGJvb2wgZW5hYmxlX3NjYW5fcmVxdWVzdF9ub3RpZmljYXRpb25zID0gMTM7Ci19Ci0KLW1lc3NhZ2UgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgewotICBpbnQzMiBtaW5faW50ZXJ2YWwgPSAxOwotICBpbnQzMiBtYXhfaW50ZXJ2YWwgPSAyOwotICBBZHZlcnRpc2luZ1Byb3BlcnR5IGFkdmVydGlzaW5nX3Byb3BlcnR5ID0gMzsKLX0KLQotbWVzc2FnZSBDcmVhdGVBZHZlcnRpc2VyUmVxdWVzdCB7Ci0gIEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZyA9IDE7Ci19Ci0KLW1lc3NhZ2UgQ3JlYXRlQWR2ZXJ0aXNlclJlc3BvbnNlIHsKLSAgLy8gLTEgb24gZXJyb3IKLSAgaW50MzIgYWR2ZXJ0aXNlcl9pZCA9IDE7Ci19Ci0KLW1lc3NhZ2UgRXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyUmVxdWVzdCB7Ci0gIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlnID0gMTsKLX0KLQotbWVzc2FnZSBFeHRlbmRlZENyZWF0ZUFkdmVydGlzZXJSZXNwb25zZSB7Ci0gIC8vIC0xIG9uIGVycm9yCi0gIGludDMyIGFkdmVydGlzZXJfaWQgPSAxOwotfQotCi1tZXNzYWdlIEVuYWJsZUFkdmVydGlzZXJSZXF1ZXN0IHsKLSAgaW50MzIgYWR2ZXJ0aXNlcl9pZCA9IDE7Ci0gIGJvb2wgZW5hYmxlID0gMjsKLX0KLQotbWVzc2FnZSBTZXREYXRhUmVxdWVzdCB7Ci0gIGludDMyIGFkdmVydGlzZXJfaWQgPSAxOwotICBib29sIHNldF9zY2FuX3JzcCA9IDI7Ci0gIHJlcGVhdGVkIEdhcERhdGFNc2cgZGF0YSA9IDM7Ci19Ci0KLW1lc3NhZ2UgU2V0UGFyYW1ldGVyc1JlcXVlc3QgewotICBpbnQzMiBhZHZlcnRpc2VyX2lkID0gMTsKLSAgQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlnID0gMjsKLX0KLQotbWVzc2FnZSBTZXRQZXJpb2RpY1BhcmFtZXRlcnNSZXF1ZXN0IHsKLSAgaW50MzIgYWR2ZXJ0aXNlcl9pZCA9IDE7Ci0gIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIGNvbmZpZyA9IDI7Ci19Ci0KLW1lc3NhZ2UgU2V0UGVyaW9kaWNEYXRhUmVxdWVzdCB7Ci0gIGludDMyIGFkdmVydGlzZXJfaWQgPSAxOwotICByZXBlYXRlZCBHYXBEYXRhTXNnIGRhdGEgPSAyOwotfQotCi1tZXNzYWdlIEVuYWJsZVBlcmlvZGljQWR2ZXJ0aXNpbmdSZXF1ZXN0IHsKLSAgaW50MzIgYWR2ZXJ0aXNlcl9pZCA9IDE7Ci0gIGJvb2wgZW5hYmxlID0gMjsKLX0KLQotbWVzc2FnZSBHZXRPd25BZGRyZXNzUmVxdWVzdCB7Ci0gIGludDMyIGFkdmVydGlzZXJfaWQgPSAxOwotfQotCi1tZXNzYWdlIEdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXNSZXNwb25zZSB7Ci0gIGludDMyIG51bV9hZHZlcnRpc2luZ19pbnN0YW5jZXMgPSAxOwotfQotCi1tZXNzYWdlIFJlbW92ZUFkdmVydGlzZXJSZXF1ZXN0IHsKLSAgaW50MzIgYWR2ZXJ0aXNlcl9pZCA9IDE7Ci19Ci0KLWVudW0gQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGUgewotICBBRFZFUlRJU0lOR19TRVRfU1RBUlRFRCA9IDA7Ci0gIEFEVkVSVElTSU5HX0VOQUJMRUQgPSAxOwotICBBRFZFUlRJU0lOR19EQVRBX1NFVCA9IDI7Ci0gIFNDQU5fUkVTUE9OU0VfREFUQV9TRVQgPSAzOwotICBBRFZFUlRJU0lOR19QQVJBTUVURVJTX1VQREFURUQgPSA0OwotICBQRVJJT0RJQ19BRFZFUlRJU0lOR19QQVJBTUVURVJTX1VQREFURUQgPSA1OwotICBQRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBX1NFVCA9IDY7Ci0gIFBFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRUQgPSA3OwotICBPV05fQUREUkVTU19SRUFEID0gODsKLX0KLQotbWVzc2FnZSBBZHZlcnRpc2luZ0NhbGxiYWNrTXNnIHsKLSAgQWR2ZXJ0aXNpbmdDYWxsYmFja01zZ1R5cGUgbWVzc2FnZV90eXBlID0gMTsKLSAgdWludDMyIGFkdmVydGlzZXJfaWQgPSAyOwotICBBZHZlcnRpc2luZ1N0YXR1cyBzdGF0dXMgPSAzOwotICB1aW50MzIgZGF0YSA9IDQ7Ci19Ci0KLW1lc3NhZ2UgQWRkcmVzc01zZyB7Ci0gIEFkdmVydGlzaW5nQ2FsbGJhY2tNc2dUeXBlIG1lc3NhZ2VfdHlwZSA9IDE7Ci0gIHVpbnQzMiBhZHZlcnRpc2VyX2lkID0gMjsKLSAgYmx1ZXRvb3RoLmZhY2FkZS5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcyA9IDM7Ci19CmRpZmYgLS1naXQgYS9nZC9oY2kvZmFjYWRlL2xlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5jYyBiL2dkL2hjaS9mYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTliM2RiLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvZmFjYWRlL2xlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5oIgotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX2V2ZW50X3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuZ3JwYy5wYi5oIgotI2luY2x1ZGUgImhjaS9mYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLnBiLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgTGVJbml0aWF0b3JBZGRyZXNzRmFjYWRlU2VydmljZSA6IHB1YmxpYyBMZUluaXRpYXRvckFkZHJlc3NGYWNhZGU6OlNlcnZpY2UgewotIHB1YmxpYzoKLSAgTGVJbml0aWF0b3JBZGRyZXNzRmFjYWRlU2VydmljZShBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlciwgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcikKLSAgICAgIDogYWNsX21hbmFnZXJfKGFjbF9tYW5hZ2VyKSwKLSAgICAgICAgYWRkcmVzc19tYW5hZ2VyXyhhY2xfbWFuYWdlcl8tPkdldExlQWRkcmVzc01hbmFnZXIoKSksCi0gICAgICAgIGZhY2FkZV9oYW5kbGVyXyhmYWNhZGVfaGFuZGxlcikgewotICAgIEFTU0VSVChmYWNhZGVfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgUHJpdmFjeVBvbGljeSogcmVxdWVzdCwgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgQWRkcmVzcyBhZGRyZXNzID0gQWRkcmVzczo6a0VtcHR5OwotICAgIExlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3kgYWRkcmVzc19wb2xpY3kgPQotICAgICAgICBzdGF0aWNfY2FzdDxMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5PihyZXF1ZXN0LT5hZGRyZXNzX3BvbGljeSgpKTsKLSAgICBpZiAoYWRkcmVzc19wb2xpY3kgPT0gTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1NUQVRJQ19BRERSRVNTKSB7Ci0gICAgICBBU1NFUlQoQWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzX3dpdGhfdHlwZSgpLmFkZHJlc3MoKS5hZGRyZXNzKCksIGFkZHJlc3MpKTsKLSAgICB9Ci0gICAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKGFkZHJlc3MsIHN0YXRpY19jYXN0PEFkZHJlc3NUeXBlPihyZXF1ZXN0LT5hZGRyZXNzX3dpdGhfdHlwZSgpLnR5cGUoKSkpOwotICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IGlyayA9IHt9OwotICAgIGF1dG8gcmVxdWVzdF9pcmtfbGVuZ3RoID0gcmVxdWVzdC0+cm90YXRpb25faXJrKCkuZW5kKCkgLSByZXF1ZXN0LT5yb3RhdGlvbl9pcmsoKS5iZWdpbigpOwotICAgIGlmIChyZXF1ZXN0X2lya19sZW5ndGggPT0gY3J5cHRvX3Rvb2xib3g6Ok9DVEVUMTZfTEVOKSB7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpcmtfZGF0YShyZXF1ZXN0LT5yb3RhdGlvbl9pcmsoKS5iZWdpbigpLCByZXF1ZXN0LT5yb3RhdGlvbl9pcmsoKS5lbmQoKSk7Ci0gICAgICBzdGQ6OmNvcHlfbihpcmtfZGF0YS5iZWdpbigpLCBjcnlwdG9fdG9vbGJveDo6T0NURVQxNl9MRU4sIGlyay5iZWdpbigpKTsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUKHJlcXVlc3RfaXJrX2xlbmd0aCA9PSAwKTsKLSAgICB9Ci0gICAgYXV0byBtaW5pbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHJlcXVlc3QtPm1pbmltdW1fcm90YXRpb25fdGltZSgpKTsKLSAgICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMocmVxdWVzdC0+bWF4aW11bV9yb3RhdGlvbl90aW1lKCkpOwotICAgIGFjbF9tYW5hZ2VyXy0+U2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoCi0gICAgICAgIGFkZHJlc3NfcG9saWN5LCBhZGRyZXNzX3dpdGhfdHlwZSwgbWluaW11bV9yb3RhdGlvbl90aW1lLCBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBHZXRDdXJyZW50SW5pdGlhdG9yQWRkcmVzcygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmJsdWV0b290aDo6ZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgQWRkcmVzc1dpdGhUeXBlIGN1cnJlbnQgPSBhZGRyZXNzX21hbmFnZXJfLT5HZXRDdXJyZW50QWRkcmVzcygpOwotICAgIGF1dG8gYmx1ZXRvb3RoX2FkZHJlc3MgPSBuZXcgOjpibHVldG9vdGg6OmZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzcygpOwotICAgIGJsdWV0b290aF9hZGRyZXNzLT5zZXRfYWRkcmVzcyhjdXJyZW50LkdldEFkZHJlc3MoKS5Ub1N0cmluZygpKTsKLSAgICByZXNwb25zZS0+c2V0X3R5cGUoc3RhdGljX2Nhc3Q8OjpibHVldG9vdGg6OmZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtPihjdXJyZW50LkdldEFkZHJlc3NUeXBlKCkpKTsKLSAgICByZXNwb25zZS0+c2V0X2FsbG9jYXRlZF9hZGRyZXNzKGJsdWV0b290aF9hZGRyZXNzKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgR2V0QW5vdGhlckFkZHJlc3MoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpibHVldG9vdGg6OmZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIEFkZHJlc3NXaXRoVHlwZSBhbm90aGVyID0gYWRkcmVzc19tYW5hZ2VyXy0+R2V0QW5vdGhlckFkZHJlc3MoKTsKLSAgICBhdXRvIGJsdWV0b290aF9hZGRyZXNzID0gbmV3IDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkJsdWV0b290aEFkZHJlc3MoKTsKLSAgICBibHVldG9vdGhfYWRkcmVzcy0+c2V0X2FkZHJlc3MoYW5vdGhlci5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKSk7Ci0gICAgcmVzcG9uc2UtPnNldF90eXBlKHN0YXRpY19jYXN0PDo6Ymx1ZXRvb3RoOjpmYWNhZGU6OkJsdWV0b290aEFkZHJlc3NUeXBlRW51bT4oYW5vdGhlci5HZXRBZGRyZXNzVHlwZSgpKSk7Ci0gICAgcmVzcG9uc2UtPnNldF9hbGxvY2F0ZWRfYWRkcmVzcyhibHVldG9vdGhfYWRkcmVzcyk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQWNsTWFuYWdlciogYWNsX21hbmFnZXJfOwotICBMZUFkZHJlc3NNYW5hZ2VyKiBhZGRyZXNzX21hbmFnZXJfOwotICA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyXzsKLX07Ci0KLXZvaWQgTGVJbml0aWF0b3JBZGRyZXNzRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxBY2xNYW5hZ2VyPigpOwotfQotCi12b2lkIExlSW5pdGlhdG9yQWRkcmVzc0ZhY2FkZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IG5ldyBMZUluaXRpYXRvckFkZHJlc3NGYWNhZGVTZXJ2aWNlKEdldERlcGVuZGVuY3k8QWNsTWFuYWdlcj4oKSwgR2V0SGFuZGxlcigpKTsKLX0KLQotdm9pZCBMZUluaXRpYXRvckFkZHJlc3NGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIGRlbGV0ZSBzZXJ2aWNlXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKTsKLX0KLQotOjpncnBjOjpTZXJ2aWNlKiBMZUluaXRpYXRvckFkZHJlc3NGYWNhZGVNb2R1bGU6OkdldFNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBMZUluaXRpYXRvckFkZHJlc3NGYWNhZGVNb2R1bGU6OkZhY3RvcnkgPQotICAgIDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IExlSW5pdGlhdG9yQWRkcmVzc0ZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuaCBiL2dkL2hjaS9mYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzhjNjQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLWNsYXNzIExlSW5pdGlhdG9yQWRkcmVzc0ZhY2FkZVNlcnZpY2U7Ci0KLWNsYXNzIExlSW5pdGlhdG9yQWRkcmVzc0ZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgOjpncnBjOjpTZXJ2aWNlKiBHZXRTZXJ2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBMZUluaXRpYXRvckFkZHJlc3NGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmYWNhZGUKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLnByb3RvIGIvZ2QvaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWVlYTIuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGguaGNpOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byI7Ci1pbXBvcnQgImZhY2FkZS9jb21tb24ucHJvdG8iOwotCi1zZXJ2aWNlIExlSW5pdGlhdG9yQWRkcmVzc0ZhY2FkZSB7Ci0gIHJwYyBTZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcyhQcml2YWN5UG9saWN5KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBHZXRDdXJyZW50SW5pdGlhdG9yQWRkcmVzcyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKGJsdWV0b290aC5mYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKSB7fQotICBycGMgR2V0QW5vdGhlckFkZHJlc3MoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChibHVldG9vdGguZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSkge30KLX0KLQotZW51bSBBZGRyZXNzUG9saWN5IHsKLSAgUE9MSUNZX05PVF9TRVQgPSAweDAwOwotICBVU0VfUFVCTElDX0FERFJFU1MgPSAweDAxOwotICBVU0VfU1RBVElDX0FERFJFU1MgPSAweDAyOwotICBVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUyA9IDB4MDM7Ci0gIFVTRV9SRVNPTFZBQkxFX0FERFJFU1MgPSAweDA0OwotfQotCi1tZXNzYWdlIFByaXZhY3lQb2xpY3kgewotICBBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5ID0gMTsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSA9IDI7Ci0gIGJ5dGVzIHJvdGF0aW9uX2lyayA9IDM7Ci0gIHVpbnQ2NCBtaW5pbXVtX3JvdGF0aW9uX3RpbWUgPSA0OwotICB1aW50NjQgbWF4aW11bV9yb3RhdGlvbl90aW1lID0gNTsKLX0KZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvbGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGUuY2MgYi9nZC9oY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQyNTE3Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mYWNhZGUvbGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9sZV9zY2FubmluZ19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJncnBjL2dycGNfZXZlbnRfcXVldWUuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJoY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLmgiCi0jaW5jbHVkZSAiaGNpL2ZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5wYi5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci11c2luZyA6OmdycGM6OlNlcnZlcldyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U3RhdHVzOwotCi1jbGFzcyBMZVNjYW5uaW5nTWFuYWdlckZhY2FkZVNlcnZpY2UgOiBwdWJsaWMgTGVTY2FubmluZ01hbmFnZXJGYWNhZGU6OlNlcnZpY2UsIFNjYW5uaW5nQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTGVTY2FubmluZ01hbmFnZXJGYWNhZGVTZXJ2aWNlKExlU2Nhbm5pbmdNYW5hZ2VyKiBsZV9zY2FubmluZ19tYW5hZ2VyLCBvczo6SGFuZGxlciogZmFjYWRlX2hhbmRsZXIpCi0gICAgICA6IGxlX3NjYW5uaW5nX21hbmFnZXJfKGxlX3NjYW5uaW5nX21hbmFnZXIpLCBmYWNhZGVfaGFuZGxlcl8oZmFjYWRlX2hhbmRsZXIpIHsKLSAgICBBU1NFUlQobGVfc2Nhbm5pbmdfbWFuYWdlcl8gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGZhY2FkZV9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgICBsZV9zY2FubmluZ19tYW5hZ2VyXy0+UmVnaXN0ZXJTY2FubmluZ0NhbGxiYWNrKHRoaXMpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgUmVnaXN0ZXJTY2FubmVyKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgUmVnaXN0ZXJTY2FubmVyUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgdWludDMyX3QgdXVpZF9yYXcgPSByZXF1ZXN0LT51dWlkKCk7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OlV1aWQgdXVpZCA9IGJsdWV0b290aDo6aGNpOjpVdWlkOjpGcm9tMzJCaXQodXVpZF9yYXcpOwotICAgIGxlX3NjYW5uaW5nX21hbmFnZXJfLT5SZWdpc3RlclNjYW5uZXIodXVpZCk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFVucmVnaXN0ZXIoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFVucmVnaXN0ZXJSZXF1ZXN0KiByZXF1ZXN0LCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGxlX3NjYW5uaW5nX21hbmFnZXJfLT5VbnJlZ2lzdGVyKHJlcXVlc3QtPnNjYW5uZXJfaWQoKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNjYW4oCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFNjYW5SZXF1ZXN0KiByZXF1ZXN0LCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGxlX3NjYW5uaW5nX21hbmFnZXJfLT5TY2FuKHJlcXVlc3QtPnN0YXJ0KCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRTY2FuUGFyYW1ldGVycygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IFNldFNjYW5QYXJhbWV0ZXJzUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBzY2FuX3R5cGUgPSBzdGF0aWNfY2FzdDxoY2k6OkxlU2NhblR5cGU+KHJlcXVlc3QtPnNjYW5fdHlwZSgpKTsKLSAgICBsZV9zY2FubmluZ19tYW5hZ2VyXy0+U2V0U2NhblBhcmFtZXRlcnMoCi0gICAgICAgIHJlcXVlc3QtPnNjYW5uZXJfaWQoKSwgc2Nhbl90eXBlLCByZXF1ZXN0LT5zY2FuX2ludGVydmFsKCksIHJlcXVlc3QtPnNjYW5fd2luZG93KCkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaENhbGxiYWNrRXZlbnRzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPFNjYW5uaW5nQ2FsbGJhY2tNc2c+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gY2FsbGJhY2tfZXZlbnRzXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaEFkdmVydGlzaW5nUmVwb3J0cygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxBZHZlcnRpc2luZ1JlcG9ydE1zZz4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBhZHZlcnRpc2luZ19yZXBvcnRzXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICB2b2lkIE9uU2Nhbm5lclJlZ2lzdGVyZWQoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OlV1aWQgYXBwX3V1aWQsIFNjYW5uZXJJZCBzY2FubmVyX2lkLCBTY2FubmluZ1N0YXR1cyBzdGF0dXMpIHsKLSAgICBTY2FubmluZ0NhbGxiYWNrTXNnIG1zZzsKLSAgICBtc2cuc2V0X21lc3NhZ2VfdHlwZShTY2FubmluZ0NhbGxiYWNrTXNnVHlwZTo6U0NBTk5FUl9SRUdJU1RFUkVEKTsKLSAgICBtc2cuc2V0X3N0YXR1cyhzdGF0aWNfY2FzdDxmYWNhZGU6OlNjYW5uaW5nU3RhdHVzPihzdGF0dXMpKTsKLSAgICBtc2cuc2V0X2RhdGEoYXBwX3V1aWQuQXMzMkJpdCgpKTsKLSAgICBjYWxsYmFja19ldmVudHNfLk9uSW5jb21pbmdFdmVudChtc2cpOwotICB9OwotCi0gIHZvaWQgT25TZXRTY2FubmVyUGFyYW1ldGVyQ29tcGxldGUoU2Nhbm5lcklkIHNjYW5uZXJfaWQsIFNjYW5uaW5nU3RhdHVzIHN0YXR1cykgewotICAgIFNjYW5uaW5nQ2FsbGJhY2tNc2cgbXNnOwotICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKFNjYW5uaW5nQ2FsbGJhY2tNc2dUeXBlOjpTRVRfU0NBTk5FUl9QQVJBTUVURVJfQ09NUExFVEUpOwotICAgIG1zZy5zZXRfc3RhdHVzKHN0YXRpY19jYXN0PGZhY2FkZTo6U2Nhbm5pbmdTdGF0dXM+KHN0YXR1cykpOwotICAgIG1zZy5zZXRfZGF0YShzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2Nhbm5lcl9pZCkpOwotICAgIGNhbGxiYWNrX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KG1zZyk7Ci0gIH07Ci0KLSAgdm9pZCBPblNjYW5SZXN1bHQoCi0gICAgICB1aW50MTZfdCBldmVudF90eXBlLAotICAgICAgdWludDhfdCBhZGRyZXNzX3R5cGUsCi0gICAgICBBZGRyZXNzIGFkZHJlc3MsCi0gICAgICB1aW50OF90IHByaW1hcnlfcGh5LAotICAgICAgdWludDhfdCBzZWNvbmRhcnlfcGh5LAotICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsCi0gICAgICBpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICBpbnQ4X3QgcnNzaSwKLSAgICAgIHVpbnQxNl90IHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNpbmdfZGF0YSkgewotICAgIEFkdmVydGlzaW5nUmVwb3J0TXNnIGFkdmVydGlzaW5nX3JlcG9ydF9tc2c7Ci0gICAgc3RkOjp2ZWN0b3I8TGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0PiBhZHZlcnRpc2VtZW50czsKLSAgICBMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdSZXBvcnQgbGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfcmVwb3J0OwotICAgIGxlX2V4dGVuZGVkX2FkdmVydGlzaW5nX3JlcG9ydC5hZGRyZXNzX3R5cGVfID0gKERpcmVjdEFkdmVydGlzaW5nQWRkcmVzc1R5cGUpYWRkcmVzc190eXBlOwotICAgIGxlX2V4dGVuZGVkX2FkdmVydGlzaW5nX3JlcG9ydC5hZGRyZXNzXyA9IGFkZHJlc3M7Ci0gICAgbGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfcmVwb3J0LmFkdmVydGlzaW5nX2RhdGFfID0gYWR2ZXJ0aXNpbmdfZGF0YTsKLSAgICBsZV9leHRlbmRlZF9hZHZlcnRpc2luZ19yZXBvcnQucnNzaV8gPSByc3NpOwotICAgIGFkdmVydGlzZW1lbnRzLnB1c2hfYmFjayhsZV9leHRlbmRlZF9hZHZlcnRpc2luZ19yZXBvcnQpOwotCi0gICAgYXV0byBidWlsZGVyID0gTGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0QnVpbGRlcjo6Q3JlYXRlKGFkdmVydGlzZW1lbnRzKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlczsKLSAgICBCaXRJbnNlcnRlciBiaXRfaW5zZXJ0ZXIoYnl0ZXMpOwotICAgIGJ1aWxkZXItPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotICAgIGFkdmVydGlzaW5nX3JlcG9ydF9tc2cuc2V0X2V2ZW50KHN0ZDo6c3RyaW5nKGJ5dGVzLmJlZ2luKCksIGJ5dGVzLmVuZCgpKSk7Ci0gICAgYWR2ZXJ0aXNpbmdfcmVwb3J0c18uT25JbmNvbWluZ0V2ZW50KHN0ZDo6bW92ZShhZHZlcnRpc2luZ19yZXBvcnRfbXNnKSk7Ci0gIH07Ci0gIHZvaWQgT25UcmFja0FkdkZvdW5kTG9zdChBZHZlcnRpc2luZ0ZpbHRlck9uRm91bmRPbkxvc3RJbmZvIG9uX2ZvdW5kX29uX2xvc3RfaW5mbyl7fTsKLSAgdm9pZCBPbkJhdGNoU2NhblJlcG9ydHMoaW50IGNsaWVudF9pZiwgaW50IHN0YXR1cywgaW50IHJlcG9ydF9mb3JtYXQsIGludCBudW1fcmVjb3Jkcywgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSl7fTsKLSAgdm9pZCBPbkJhdGNoU2NhblRocmVzaG9sZENyb3NzZWQoaW50IGNsaWVudF9pZil7fTsKLSAgdm9pZCBPblRpbWVvdXQoKXt9OwotICB2b2lkIE9uRmlsdGVyRW5hYmxlKEVuYWJsZSBlbmFibGUsIHVpbnQ4X3Qgc3RhdHVzKXt9OwotICB2b2lkIE9uRmlsdGVyUGFyYW1TZXR1cCh1aW50OF90IGF2YWlsYWJsZV9zcGFjZXMsIEFwY2ZBY3Rpb24gYWN0aW9uLCB1aW50OF90IHN0YXR1cyl7fTsKLSAgdm9pZCBPbkZpbHRlckNvbmZpZ0NhbGxiYWNrKAotICAgICAgQXBjZkZpbHRlclR5cGUgZmlsdGVyX3R5cGUsIHVpbnQ4X3QgYXZhaWxhYmxlX3NwYWNlcywgQXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3Qgc3RhdHVzKXt9OwotCi0gIExlU2Nhbm5pbmdNYW5hZ2VyKiBsZV9zY2FubmluZ19tYW5hZ2VyXzsKLSAgb3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPEFkdmVydGlzaW5nUmVwb3J0TXNnPiBhZHZlcnRpc2luZ19yZXBvcnRzX3siYWR2ZXJ0aXNpbmcgcmVwb3J0cyJ9OwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8U2Nhbm5pbmdDYWxsYmFja01zZz4gY2FsbGJhY2tfZXZlbnRzX3siY2FsbGJhY2sgZXZlbnRzIn07Ci19OwotCi12b2lkIExlU2Nhbm5pbmdNYW5hZ2VyRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxoY2k6OkxlU2Nhbm5pbmdNYW5hZ2VyPigpOwotfQotCi12b2lkIExlU2Nhbm5pbmdNYW5hZ2VyRmFjYWRlTW9kdWxlOjpTdGFydCgpIHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0YXJ0KCk7Ci0gIHNlcnZpY2VfID0gbmV3IExlU2Nhbm5pbmdNYW5hZ2VyRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PGhjaTo6TGVTY2FubmluZ01hbmFnZXI+KCksIEdldEhhbmRsZXIoKSk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXJGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIGRlbGV0ZSBzZXJ2aWNlXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKTsKLX0KLQotOjpncnBjOjpTZXJ2aWNlKiBMZVNjYW5uaW5nTWFuYWdlckZhY2FkZU1vZHVsZTo6R2V0U2VydmljZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNlcnZpY2VfOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IExlU2Nhbm5pbmdNYW5hZ2VyRmFjYWRlTW9kdWxlOjpGYWN0b3J5ID0KLSAgICA6OmJsdWV0b290aDo6TW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBMZVNjYW5uaW5nTWFuYWdlckZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2ZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5oIGIvZ2QvaGNpL2ZhY2FkZS9sZV9zY2FubmluZ19tYW5hZ2VyX2ZhY2FkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWVjMmNmLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mYWNhZGUvbGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdycGMrKy9ncnBjKysuaD4KLQotI2luY2x1ZGUgImdycGMvZ3JwY19tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBmYWNhZGUgewotCi1jbGFzcyBMZVNjYW5uaW5nTWFuYWdlckZhY2FkZVNlcnZpY2U7Ci0KLWNsYXNzIExlU2Nhbm5pbmdNYW5hZ2VyRmFjYWRlTW9kdWxlIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgTGVTY2FubmluZ01hbmFnZXJGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmYWNhZGUKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9mYWNhZGUvbGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGUucHJvdG8gYi9nZC9oY2kvZmFjYWRlL2xlX3NjYW5uaW5nX21hbmFnZXJfZmFjYWRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhlZjU2Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mYWNhZGUvbGVfc2Nhbm5pbmdfbWFuYWdlcl9mYWNhZGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGguaGNpLmZhY2FkZTsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotCi1zZXJ2aWNlIExlU2Nhbm5pbmdNYW5hZ2VyRmFjYWRlIHsKLSAgcnBjIFJlZ2lzdGVyU2Nhbm5lcihSZWdpc3RlclNjYW5uZXJSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBVbnJlZ2lzdGVyKFVucmVnaXN0ZXJSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTY2FuKFNjYW5SZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZXRTY2FuUGFyYW1ldGVycyhTZXRTY2FuUGFyYW1ldGVyc1JlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEZldGNoQ2FsbGJhY2tFdmVudHMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gU2Nhbm5pbmdDYWxsYmFja01zZykge30KLSAgcnBjIEZldGNoQWR2ZXJ0aXNpbmdSZXBvcnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIEFkdmVydGlzaW5nUmVwb3J0TXNnKSB7fQotfQotCi1lbnVtIExlU2NhblR5cGUgewotICBQQVNTSVZFID0gMHgwOwotICBBQ1RJVkUgPSAweDE7Ci19Ci0KLWVudW0gU2Nhbm5pbmdDYWxsYmFja01zZ1R5cGUgewotICBTQ0FOTkVSX1JFR0lTVEVSRUQgPSAwOwotICBTRVRfU0NBTk5FUl9QQVJBTUVURVJfQ09NUExFVEUgPSAxOwotICBTQ0FOX1JFU1VMVCA9IDI7Ci0gIFRSQUNLX0FEVl9GT1VORF9MT1NUID0gMzsKLSAgQkFUQ0hfU0NBTl9SRVBPUlRTID0gNDsKLSAgQkFUQ0hfU0NBTl9USFJFU0hPTERfQ1JPU1NFRCA9IDU7Ci0gIFRJTUVPVVQgPSA2OwotICBGSUxURVJfRU5BQkxFID0gNzsKLSAgRklMVEVSX1BBUkFNRVRFUl9TRVRVUCA9IDg7Ci0gIEZJTFRFUl9DT05GSUcgPSA5OwotfQotCi1lbnVtIFNjYW5uaW5nU3RhdHVzIHsKLSAgU0NBTl9TVUNDRVNTID0gMHgwMDsKLSAgU0NBTl9OT19SRVNPVVJDRVMgPSAweDgwOwotICBTQ0FOX0lOVEVSTkFMX0VSUk9SID0gMHg4NTsKLSAgU0NBTl9JTExFR0FMX1BBUkFNRVRFUiA9IDB4ODc7Ci19OwotCi1tZXNzYWdlIFJlZ2lzdGVyU2Nhbm5lclJlcXVlc3QgewotICB1aW50MzIgdXVpZCA9IDE7Ci19Ci0KLW1lc3NhZ2UgVW5yZWdpc3RlclJlcXVlc3QgewotICB1aW50MzIgc2Nhbm5lcl9pZCA9IDE7Ci19Ci0KLW1lc3NhZ2UgU2NhblJlcXVlc3QgewotICBib29sIHN0YXJ0ID0gMTsKLX0KLQotbWVzc2FnZSBTZXRTY2FuUGFyYW1ldGVyc1JlcXVlc3QgewotICB1aW50MzIgc2Nhbm5lcl9pZCA9IDE7Ci0gIExlU2NhblR5cGUgc2Nhbl90eXBlID0gMjsKLSAgdWludDMyIHNjYW5faW50ZXJ2YWwgPSAzOwotICB1aW50MzIgc2Nhbl93aW5kb3cgPSA0OwotfQotCi1tZXNzYWdlIEFkdmVydGlzaW5nUmVwb3J0TXNnIHsKLSAgYnl0ZXMgZXZlbnQgPSAxOwotfQotCi1tZXNzYWdlIFNjYW5uaW5nQ2FsbGJhY2tNc2cgewotICBTY2FubmluZ0NhbGxiYWNrTXNnVHlwZSBtZXNzYWdlX3R5cGUgPSAxOwotICBTY2FubmluZ1N0YXR1cyBzdGF0dXMgPSAyOwotICB1aW50MzIgZGF0YSA9IDM7Ci19CmRpZmYgLS1naXQgYS9nZC9oY2kvZnV6ei9hY2xfbWFuYWdlcl9mdXp6X3Rlc3QuY2MgYi9nZC9oY2kvZnV6ei9hY2xfbWFuYWdlcl9mdXp6X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmIzYmIuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2Z1enovYWNsX21hbmFnZXJfZnV6el90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImZ1enovaGVscGVycy5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImhjaS9mdXp6L2Z1enpfaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2Z1enovZmFrZV90aW1lcmZkLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0KLXVzaW5nIGJsdWV0b290aDo6RnV6elRlc3RNb2R1bGVSZWdpc3RyeTsKLXVzaW5nIGJsdWV0b290aDo6ZnV6ejo6R2V0QXJiaXRyYXJ5Qnl0ZXM7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6QWNsTWFuYWdlcjsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpIY2lMYXllcjsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpmdXp6OjpGdXp6SGNpTGF5ZXI7Ci11c2luZyBibHVldG9vdGg6Om9zOjpmdXp6OjpmYWtlX3RpbWVyZmRfYWR2YW5jZTsKLXVzaW5nIGJsdWV0b290aDo6b3M6OmZ1eno6OmZha2VfdGltZXJmZF9jYXBfYXQ7Ci11c2luZyBibHVldG9vdGg6Om9zOjpmdXp6OjpmYWtlX3RpbWVyZmRfcmVzZXQ7Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKLQotICBzdGF0aWMgRnV6elRlc3RNb2R1bGVSZWdpc3RyeSBtb2R1bGVSZWdpc3RyeSA9IEZ1enpUZXN0TW9kdWxlUmVnaXN0cnkoKTsKLSAgRnV6ekhjaUxheWVyKiBmdXp6SGNpID0gbW9kdWxlUmVnaXN0cnkuSW5qZWN0PEZ1enpIY2lMYXllcj4oJkhjaUxheWVyOjpGYWN0b3J5KTsKLSAgZnV6ekhjaS0+VHVybk9uQXV0b1JlcGx5KCZkYXRhUHJvdmlkZXIpOwotICBtb2R1bGVSZWdpc3RyeS5TdGFydDxBY2xNYW5hZ2VyPigpOwotICBmdXp6SGNpLT5UdXJuT2ZmQXV0b1JlcGx5KCk7Ci0KLSAgd2hpbGUgKGRhdGFQcm92aWRlci5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKLSAgICBjb25zdCB1aW50OF90IGFjdGlvbiA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDIpOwotICAgIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGZha2VfdGltZXJmZF9hZHZhbmNlKGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgZnV6ekhjaS0+aW5qZWN0QXJiaXRyYXJ5KGRhdGFQcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIG1vZHVsZVJlZ2lzdHJ5LldhaXRGb3JJZGxlQW5kU3RvcEFsbCgpOwotICBmYWtlX3RpbWVyZmRfcmVzZXQoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nZC9oY2kvZnV6ei9mdXp6X2hjaV9sYXllci5jYyBiL2dkL2hjaS9mdXp6L2Z1enpfaGNpX2xheWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ5NjBkLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mdXp6L2Z1enpfaGNpX2xheWVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvZnV6ei9mdXp6X2hjaV9sYXllci5oIgotI2luY2x1ZGUgImZ1enovaGVscGVycy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZ1enogewotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrOwotdXNpbmcgYmx1ZXRvb3RoOjpmdXp6OjpHZXRBcmJpdHJhcnlCeXRlczsKLXVzaW5nIGJsdWV0b290aDo6ZnV6ejo6SW52b2tlSWZWYWxpZDsKLQotaGNpOjpTZWN1cml0eUludGVyZmFjZSogRnV6ekhjaUxheWVyOjpHZXRTZWN1cml0eUludGVyZmFjZShDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIHsKLSAgcmV0dXJuICZzZWN1cml0eV9pbnRlcmZhY2VfOwotfQotCi1oY2k6OkxlU2VjdXJpdHlJbnRlcmZhY2UqIEZ1enpIY2lMYXllcjo6R2V0TGVTZWN1cml0eUludGVyZmFjZSgKLSAgICBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkxlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIHsKLSAgcmV0dXJuICZsZV9zZWN1cml0eV9pbnRlcmZhY2VfOwotfQotCi1oY2k6OkFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIEZ1enpIY2lMYXllcjo6R2V0QWNsQ29ubmVjdGlvbkludGVyZmFjZSgKLSAgICBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIsCi0gICAgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQodWludDE2X3QsIGhjaTo6RXJyb3JDb2RlKT4gb25fZGlzY29ubmVjdCwKLSAgICBDb250ZXh0dWFsQ2FsbGJhY2s8Ci0gICAgICAgIHZvaWQoaGNpOjpFcnJvckNvZGUsIHVpbnQxNl90LCB1aW50OF90IHZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbik+Ci0gICAgICAgIG9uX3JlYWRfcmVtb3RlX3ZlcnNpb24pIHsKLSAgcmV0dXJuICZhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfOwotfQotCi1oY2k6OkxlQWNsQ29ubmVjdGlvbkludGVyZmFjZSogRnV6ekhjaUxheWVyOjpHZXRMZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UoCi0gICAgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyLAotICAgIENvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90LCBoY2k6OkVycm9yQ29kZSk+IG9uX2Rpc2Nvbm5lY3QsCi0gICAgQ29udGV4dHVhbENhbGxiYWNrPAotICAgICAgICB2b2lkKGhjaTo6RXJyb3JDb2RlLCB1aW50MTZfdCwgdWludDhfdCB2ZXJzaW9uLCB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3ViX3ZlcnNpb24pPgotICAgICAgICBvbl9yZWFkX3JlbW90ZV92ZXJzaW9uKSB7Ci0gIHJldHVybiAmbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXzsKLX0KLQotaGNpOjpMZUFkdmVydGlzaW5nSW50ZXJmYWNlKiBGdXp6SGNpTGF5ZXI6OkdldExlQWR2ZXJ0aXNpbmdJbnRlcmZhY2UoCi0gICAgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSB7Ci0gIHJldHVybiAmbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXzsKLX0KLQotaGNpOjpMZVNjYW5uaW5nSW50ZXJmYWNlKiBGdXp6SGNpTGF5ZXI6OkdldExlU2Nhbm5pbmdJbnRlcmZhY2UoCi0gICAgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSB7Ci0gIHJldHVybiAmbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXzsKLX0KLQotaGNpOjpMZUlzb0ludGVyZmFjZSogRnV6ekhjaUxheWVyOjpHZXRMZUlzb0ludGVyZmFjZShDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkxlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIHsKLSAgcmV0dXJuICZsZV9pc29faW50ZXJmYWNlXzsKLX0KLQotdm9pZCBGdXp6SGNpTGF5ZXI6OlN0YXJ0KCkgewotICBhY2xfZGV2X251bGxfID0gbmV3IG9zOjpmdXp6OjpEZXZOdWxsUXVldWU8QWNsQnVpbGRlcj4oYWNsX3F1ZXVlXy5HZXREb3duRW5kKCksIEdldEhhbmRsZXIoKSk7Ci0gIGFjbF9kZXZfbnVsbF8tPlN0YXJ0KCk7Ci0gIGFjbF9pbmplY3RfID0gbmV3IG9zOjpmdXp6OjpGdXp6SW5qZWN0UXVldWU8QWNsVmlldz4oYWNsX3F1ZXVlXy5HZXREb3duRW5kKCksIEdldEhhbmRsZXIoKSk7Ci19Ci0KLXZvaWQgRnV6ekhjaUxheWVyOjpTdG9wKCkgewotICBhY2xfZGV2X251bGxfLT5TdG9wKCk7Ci0gIGRlbGV0ZSBhY2xfZGV2X251bGxfOwotICBkZWxldGUgYWNsX2luamVjdF87Ci19Ci0KLXZvaWQgRnV6ekhjaUxheWVyOjppbmplY3RBcmJpdHJhcnkoRnV6emVkRGF0YVByb3ZpZGVyJiBmZHApIHsKLSAgY29uc3QgdWludDhfdCBhY3Rpb24gPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZSgwLCAxMyk7Ci0gIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5qZWN0QWNsRGF0YShHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbmplY3RDb21tYW5kQ29tcGxldGUoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgaW5qZWN0Q29tbWFuZFN0YXR1cyhHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbmplY3RFdmVudChmZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgaW5qZWN0TGVFdmVudChmZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgaW5qZWN0U2VjdXJpdHlFdmVudChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICBpbmplY3RMZVNlY3VyaXR5RXZlbnQoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgaW5qZWN0QWNsRXZlbnQoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OgotICAgICAgaW5qZWN0QWNsRGlzY29ubmVjdChmZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMDoKLSAgICAgIGluamVjdExlQWNsRXZlbnQoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMToKLSAgICAgIGluamVjdExlQWNsRGlzY29ubmVjdChmZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIGluamVjdExlQWR2ZXJ0aXNpbmdFdmVudChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEzOgotICAgICAgaW5qZWN0TGVTY2FubmluZ0V2ZW50KEdldEFyYml0cmFyeUJ5dGVzKCZmZHApKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRnV6ekhjaUxheWVyOjppbmplY3RBY2xEYXRhKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgQ09OU1RSVUNUX1ZBTElEX1VOSVFVRV9PVEhFUldJU0VfQkFJTChoY2k6OkFjbFZpZXcsIHBhY2tldCwgZGF0YSk7Ci0gIGFjbF9pbmplY3RfLT5JbmplY3Qoc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0Q29tbWFuZENvbXBsZXRlKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgSW52b2tlSWZWYWxpZDxoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXc+KHN0ZDo6bW92ZShvbl9jb21tYW5kX2NvbXBsZXRlXyksIGRhdGEpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0Q29tbWFuZFN0YXR1cyhzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIEludm9rZUlmVmFsaWQ8aGNpOjpDb21tYW5kU3RhdHVzVmlldz4oc3RkOjptb3ZlKG9uX2NvbW1hbmRfc3RhdHVzXyksIGRhdGEpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0RXZlbnQoRnV6emVkRGF0YVByb3ZpZGVyJiBmZHApIHsKLSAgYXV0byBoYW5kbGVyX3BhaXIgPSBldmVudF9oYW5kbGVyc18uZmluZChzdGF0aWNfY2FzdDxFdmVudENvZGU+KGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKSkpOwotICBpZiAoaGFuZGxlcl9wYWlyICE9IGV2ZW50X2hhbmRsZXJzXy5lbmQoKSkgewotICAgIEludm9rZUlmVmFsaWQ8RXZlbnRWaWV3PihoYW5kbGVyX3BhaXItPnNlY29uZCwgR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICB9Ci19Ci0KLXZvaWQgRnV6ekhjaUxheWVyOjppbmplY3RMZUV2ZW50KEZ1enplZERhdGFQcm92aWRlciYgZmRwKSB7Ci0gIGF1dG8gaGFuZGxlcl9wYWlyID0gbGVfZXZlbnRfaGFuZGxlcnNfLmZpbmQoc3RhdGljX2Nhc3Q8U3ViZXZlbnRDb2RlPihmZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCkpKTsKLSAgaWYgKGhhbmRsZXJfcGFpciAhPSBsZV9ldmVudF9oYW5kbGVyc18uZW5kKCkpIHsKLSAgICBJbnZva2VJZlZhbGlkPExlTWV0YUV2ZW50Vmlldz4oaGFuZGxlcl9wYWlyLT5zZWNvbmQsIEdldEFyYml0cmFyeUJ5dGVzKCZmZHApKTsKLSAgfQotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0U2VjdXJpdHlFdmVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIEludm9rZUlmVmFsaWQ8RXZlbnRWaWV3PihzZWN1cml0eV9ldmVudF9oYW5kbGVyXywgZGF0YSk7Ci19Ci0KLXZvaWQgRnV6ekhjaUxheWVyOjppbmplY3RMZVNlY3VyaXR5RXZlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBJbnZva2VJZlZhbGlkPExlTWV0YUV2ZW50Vmlldz4obGVfc2VjdXJpdHlfZXZlbnRfaGFuZGxlcl8sIGRhdGEpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0QWNsRXZlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBJbnZva2VJZlZhbGlkPEV2ZW50Vmlldz4oYWNsX2V2ZW50X2hhbmRsZXJfLCBkYXRhKTsKLX0KLQotdm9pZCBGdXp6SGNpTGF5ZXI6OmluamVjdEFjbERpc2Nvbm5lY3QoRnV6emVkRGF0YVByb3ZpZGVyJiBmZHApIHsKLSAgYWNsX29uX2Rpc2Nvbm5lY3RfLkludm9rZUlmTm90RW1wdHkoZmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGNpOjpFcnJvckNvZGU+KGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKSkpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0TGVBY2xFdmVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIEludm9rZUlmVmFsaWQ8TGVNZXRhRXZlbnRWaWV3PihsZV9hY2xfZXZlbnRfaGFuZGxlcl8sIGRhdGEpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0TGVBY2xEaXNjb25uZWN0KEZ1enplZERhdGFQcm92aWRlciYgZmRwKSB7Ci0gIGxlX2FjbF9vbl9kaXNjb25uZWN0Xy5JbnZva2VJZk5vdEVtcHR5KGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhjaTo6RXJyb3JDb2RlPihmZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCkpKTsKLX0KLQotdm9pZCBGdXp6SGNpTGF5ZXI6OmluamVjdExlQWR2ZXJ0aXNpbmdFdmVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIEludm9rZUlmVmFsaWQ8TGVNZXRhRXZlbnRWaWV3PihsZV9hZHZlcnRpc2luZ19ldmVudF9oYW5kbGVyXywgZGF0YSk7Ci19Ci0KLXZvaWQgRnV6ekhjaUxheWVyOjppbmplY3RMZVNjYW5uaW5nRXZlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBJbnZva2VJZlZhbGlkPExlTWV0YUV2ZW50Vmlldz4obGVfc2Nhbm5pbmdfZXZlbnRfaGFuZGxlcl8sIGRhdGEpOwotfQotCi12b2lkIEZ1enpIY2lMYXllcjo6aW5qZWN0TGVJc29FdmVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIEludm9rZUlmVmFsaWQ8TGVNZXRhRXZlbnRWaWV3PihsZV9pc29fZXZlbnRfaGFuZGxlcl8sIGRhdGEpOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEZ1enpIY2lMYXllcjo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgRnV6ekhjaUxheWVyKCk7IH0pOwotCi19ICAvLyBuYW1lc3BhY2UgZnV6egotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2Z1enovZnV6el9oY2lfbGF5ZXIuaCBiL2dkL2hjaS9mdXp6L2Z1enpfaGNpX2xheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWUzOWQuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2Z1enovZnV6el9oY2lfbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9jb21tYW5kX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJvcy9mdXp6L2Rldl9udWxsX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3MvZnV6ei9mdXp6X2luamVjdF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgImZ1enovaGVscGVycy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIGZ1enogewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEZ1enpDb21tYW5kSW50ZXJmYWNlIDogcHVibGljIENvbW1hbmRJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8VD4gY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUge30KLQotICB2b2lkIEVucXVldWVDb21tYW5kKHN0ZDo6dW5pcXVlX3B0cjxUPiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXcpPiBvbl9zdGF0dXMpIG92ZXJyaWRlIHt9Ci19OwotCi1jbGFzcyBGdXp6SGNpTGF5ZXIgOiBwdWJsaWMgSGNpTGF5ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBUdXJuT25BdXRvUmVwbHkoRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIHsKLSAgICBhdXRvX3JlcGx5X2ZkcCA9IGZkcDsKLSAgfQotCi0gIHZvaWQgVHVybk9mZkF1dG9SZXBseSgpIHsKLSAgICBhdXRvX3JlcGx5X2ZkcCA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIEVucXVldWVDb21tYW5kKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIG9uX2NvbW1hbmRfY29tcGxldGVfID0gc3RkOjptb3ZlKG9uX2NvbXBsZXRlKTsKLSAgICBpZiAoYXV0b19yZXBseV9mZHAgIT0gbnVsbHB0cikgewotICAgICAgaW5qZWN0Q29tbWFuZENvbXBsZXRlKGJsdWV0b290aDo6ZnV6ejo6R2V0QXJiaXRyYXJ5Qnl0ZXMoYXV0b19yZXBseV9mZHApKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEVucXVldWVDb21tYW5kKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykgb3ZlcnJpZGUgewotICAgIG9uX2NvbW1hbmRfc3RhdHVzXyA9IHN0ZDo6bW92ZShvbl9zdGF0dXMpOwotICAgIGlmIChhdXRvX3JlcGx5X2ZkcCAhPSBudWxscHRyKSB7Ci0gICAgICBpbmplY3RDb21tYW5kU3RhdHVzKGJsdWV0b290aDo6ZnV6ejo6R2V0QXJiaXRyYXJ5Qnl0ZXMoYXV0b19yZXBseV9mZHApKTsKLSAgICB9Ci0gIH0KLQotICBjb21tb246OkJpZGlRdWV1ZUVuZDxoY2k6OkFjbEJ1aWxkZXIsIGhjaTo6QWNsVmlldz4qIEdldEFjbFF1ZXVlRW5kKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBhY2xfcXVldWVfLkdldFVwRW5kKCk7Ci0gIH0KLQotICBjb21tb246OkJpZGlRdWV1ZUVuZDxoY2k6Oklzb0J1aWxkZXIsIGhjaTo6SXNvVmlldz4qIEdldElzb1F1ZXVlRW5kKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBpc29fcXVldWVfLkdldFVwRW5kKCk7Ci0gIH0KLQotICBjb21tb246OkJpZGlRdWV1ZUVuZDxoY2k6OlNjb0J1aWxkZXIsIGhjaTo6U2NvVmlldz4qIEdldFNjb1F1ZXVlRW5kKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBzY29fcXVldWVfLkdldFVwRW5kKCk7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKGhjaTo6RXZlbnRDb2RlIGV2ZW50LCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6RXZlbnRWaWV3KT4gaGFuZGxlcikgb3ZlcnJpZGUgewotICAgIGV2ZW50X2hhbmRsZXJzX1tldmVudF0gPSBoYW5kbGVyOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGhjaTo6RXZlbnRDb2RlIGV2ZW50KSBvdmVycmlkZSB7Ci0gICAgYXV0byBpdCA9IGV2ZW50X2hhbmRsZXJzXy5maW5kKGV2ZW50KTsKLSAgICBpZiAoaXQgIT0gZXZlbnRfaGFuZGxlcnNfLmVuZCgpKSB7Ci0gICAgICBldmVudF9oYW5kbGVyc18uZXJhc2UoaXQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihoY2k6OlN1YmV2ZW50Q29kZSBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpMZU1ldGFFdmVudFZpZXcpPiBoYW5kbGVyKSBvdmVycmlkZSB7Ci0gICAgbGVfZXZlbnRfaGFuZGxlcnNfW2V2ZW50XSA9IGhhbmRsZXI7Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihoY2k6OlN1YmV2ZW50Q29kZSBldmVudCkgb3ZlcnJpZGUgewotICAgIGF1dG8gaXQgPSBsZV9ldmVudF9oYW5kbGVyc18uZmluZChldmVudCk7Ci0gICAgaWYgKGl0ICE9IGxlX2V2ZW50X2hhbmRsZXJzXy5lbmQoKSkgewotICAgICAgbGVfZXZlbnRfaGFuZGxlcnNfLmVyYXNlKGl0KTsKLSAgICB9Ci0gIH0KLQotICBoY2k6OlNlY3VyaXR5SW50ZXJmYWNlKiBHZXRTZWN1cml0eUludGVyZmFjZShjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6RXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgb3ZlcnJpZGU7Ci0KLSAgaGNpOjpMZVNlY3VyaXR5SW50ZXJmYWNlKiBHZXRMZVNlY3VyaXR5SW50ZXJmYWNlKAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkxlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIG92ZXJyaWRlOwotCi0gIGhjaTo6QWNsQ29ubmVjdGlvbkludGVyZmFjZSogR2V0QWNsQ29ubmVjdGlvbkludGVyZmFjZSgKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyLAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZCh1aW50MTZfdCwgaGNpOjpFcnJvckNvZGUpPiBvbl9kaXNjb25uZWN0LAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50MTZfdCwgdWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90KT4KLSAgICAgICAgICBvbl9yZWFkX3JlbW90ZV92ZXJzaW9uKSBvdmVycmlkZTsKLQotICBoY2k6OkxlQWNsQ29ubmVjdGlvbkludGVyZmFjZSogR2V0TGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlKAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkxlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90LCBoY2k6OkVycm9yQ29kZSk+IG9uX2Rpc2Nvbm5lY3QsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIHVpbnQxNl90LCB1aW50OF90LCB1aW50MTZfdCwgdWludDE2X3QpPgotICAgICAgICAgIG9uX3JlYWRfcmVtb3RlX3ZlcnNpb24pIG92ZXJyaWRlOwotCi0gIGhjaTo6TGVBZHZlcnRpc2luZ0ludGVyZmFjZSogR2V0TGVBZHZlcnRpc2luZ0ludGVyZmFjZSgKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSBvdmVycmlkZTsKLQotICBoY2k6OkxlU2Nhbm5pbmdJbnRlcmZhY2UqIEdldExlU2Nhbm5pbmdJbnRlcmZhY2UoCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6TGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgb3ZlcnJpZGU7Ci0KLSAgaGNpOjpMZUlzb0ludGVyZmFjZSogR2V0TGVJc29JbnRlcmZhY2UoY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSBvdmVycmlkZTsKLQotICB2b2lkIGluamVjdEFyYml0cmFyeShGdXp6ZWREYXRhUHJvdmlkZXImIGZkcCk7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJGdXp6SGNpTGF5ZXIiOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlIHt9Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICB2b2lkIGluamVjdEFjbERhdGEoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0KLSAgdm9pZCBpbmplY3RDb21tYW5kQ29tcGxldGUoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0gIHZvaWQgaW5qZWN0Q29tbWFuZFN0YXR1cyhzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLQotICB2b2lkIGluamVjdEV2ZW50KEZ1enplZERhdGFQcm92aWRlciYgZmRwKTsKLSAgdm9pZCBpbmplY3RMZUV2ZW50KEZ1enplZERhdGFQcm92aWRlciYgZmRwKTsKLQotICB2b2lkIGluamVjdFNlY3VyaXR5RXZlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0gIHZvaWQgaW5qZWN0TGVTZWN1cml0eUV2ZW50KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotCi0gIHZvaWQgaW5qZWN0QWNsRXZlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0gIHZvaWQgaW5qZWN0QWNsRGlzY29ubmVjdChGdXp6ZWREYXRhUHJvdmlkZXImIGZkcCk7Ci0gIHZvaWQgaW5qZWN0TGVBY2xFdmVudChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RMZUFjbERpc2Nvbm5lY3QoRnV6emVkRGF0YVByb3ZpZGVyJiBmZHApOwotCi0gIHZvaWQgaW5qZWN0TGVBZHZlcnRpc2luZ0V2ZW50KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotCi0gIHZvaWQgaW5qZWN0TGVTY2FubmluZ0V2ZW50KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotICB2b2lkIGluamVjdExlSXNvRXZlbnQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0KLSAgRnV6emVkRGF0YVByb3ZpZGVyKiBhdXRvX3JlcGx5X2ZkcDsKLQotICBjb21tb246OkJpZGlRdWV1ZTxoY2k6OkFjbFZpZXcsIGhjaTo6QWNsQnVpbGRlcj4gYWNsX3F1ZXVlX3szfTsKLSAgY29tbW9uOjpCaWRpUXVldWU8aGNpOjpTY29WaWV3LCBoY2k6OlNjb0J1aWxkZXI+IHNjb19xdWV1ZV97M307Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPGhjaTo6SXNvVmlldywgaGNpOjpJc29CdWlsZGVyPiBpc29fcXVldWVfezN9OwotICBvczo6ZnV6ejo6RGV2TnVsbFF1ZXVlPEFjbEJ1aWxkZXI+KiBhY2xfZGV2X251bGxfOwotICBvczo6ZnV6ejo6RnV6ekluamVjdFF1ZXVlPEFjbFZpZXc+KiBhY2xfaW5qZWN0XzsKLQotICBGdXp6Q29tbWFuZEludGVyZmFjZTxBY2xDb21tYW5kQnVpbGRlcj4gYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlX3t9OwotICBGdXp6Q29tbWFuZEludGVyZmFjZTxBY2xDb21tYW5kQnVpbGRlcj4gbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlX3t9OwotICBGdXp6Q29tbWFuZEludGVyZmFjZTxTZWN1cml0eUNvbW1hbmRCdWlsZGVyPiBzZWN1cml0eV9pbnRlcmZhY2Vfe307Ci0gIEZ1enpDb21tYW5kSW50ZXJmYWNlPExlU2VjdXJpdHlDb21tYW5kQnVpbGRlcj4gbGVfc2VjdXJpdHlfaW50ZXJmYWNlX3t9OwotICBGdXp6Q29tbWFuZEludGVyZmFjZTxMZUFkdmVydGlzaW5nQ29tbWFuZEJ1aWxkZXI+IGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV97fTsKLSAgRnV6ekNvbW1hbmRJbnRlcmZhY2U8TGVTY2FubmluZ0NvbW1hbmRCdWlsZGVyPiBsZV9zY2FubmluZ19pbnRlcmZhY2Vfe307Ci0gIEZ1enpDb21tYW5kSW50ZXJmYWNlPExlSXNvQ29tbWFuZEJ1aWxkZXI+IGxlX2lzb19pbnRlcmZhY2Vfe307Ci0KLSAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3KT4gb25fY29tbWFuZF9jb21wbGV0ZV87Ci0gIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXcpPiBvbl9jb21tYW5kX3N0YXR1c187Ci0KLSAgc3RkOjptYXA8aGNpOjpFdmVudENvZGUsIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpFdmVudFZpZXcpPj4gZXZlbnRfaGFuZGxlcnNfOwotICBzdGQ6Om1hcDxoY2k6OlN1YmV2ZW50Q29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkxlTWV0YUV2ZW50Vmlldyk+PiBsZV9ldmVudF9oYW5kbGVyc187Ci0KLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkV2ZW50Vmlldyk+IHNlY3VyaXR5X2V2ZW50X2hhbmRsZXJfOwotICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6TGVNZXRhRXZlbnRWaWV3KT4gbGVfc2VjdXJpdHlfZXZlbnRfaGFuZGxlcl87Ci0gIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpFdmVudFZpZXcpPiBhY2xfZXZlbnRfaGFuZGxlcl87Ci0gIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQodWludDE2X3QsIGhjaTo6RXJyb3JDb2RlKT4gYWNsX29uX2Rpc2Nvbm5lY3RfOwotICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6TGVNZXRhRXZlbnRWaWV3KT4gbGVfYWNsX2V2ZW50X2hhbmRsZXJfOwotICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90LCBoY2k6OkVycm9yQ29kZSk+IGxlX2FjbF9vbl9kaXNjb25uZWN0XzsKLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkxlTWV0YUV2ZW50Vmlldyk+IGxlX2FkdmVydGlzaW5nX2V2ZW50X2hhbmRsZXJfOwotICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6TGVNZXRhRXZlbnRWaWV3KT4gbGVfc2Nhbm5pbmdfZXZlbnRfaGFuZGxlcl87Ci0gIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpMZU1ldGFFdmVudFZpZXcpPiBsZV9pc29fZXZlbnRfaGFuZGxlcl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnV6egotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2Z1enovaGNpX2xheWVyX2Z1enpfY2xpZW50LmNjIGIvZ2QvaGNpL2Z1enovaGNpX2xheWVyX2Z1enpfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE5ZGY0Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mdXp6L2hjaV9sYXllcl9mdXp6X2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2Z1enovaGNpX2xheWVyX2Z1enpfY2xpZW50LmgiCi0jaW5jbHVkZSAiZnV6ei9oZWxwZXJzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZnV6eiB7Ci11c2luZyBibHVldG9vdGg6OmZ1eno6OkdldEFyYml0cmFyeUJ5dGVzOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFjbFZpZXc7Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgSGNpTGF5ZXJGdXp6Q2xpZW50OjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBIY2lMYXllckZ1enpDbGllbnQoKTsgfSk7Ci0KLXZvaWQgSGNpTGF5ZXJGdXp6Q2xpZW50OjpTdGFydCgpIHsKLSAgaGNpXyA9IEdldERlcGVuZGVuY3k8aGNpOjpIY2lMYXllcj4oKTsKLSAgYWNsRGV2TnVsbF8gPSBuZXcgb3M6OmZ1eno6OkRldk51bGxRdWV1ZTxBY2xWaWV3PihoY2lfLT5HZXRBY2xRdWV1ZUVuZCgpLCBHZXRIYW5kbGVyKCkpOwotICBhY2xEZXZOdWxsXy0+U3RhcnQoKTsKLSAgYWNsSW5qZWN0XyA9IG5ldyBvczo6ZnV6ejo6RnV6ekluamVjdFF1ZXVlPEFjbEJ1aWxkZXI+KGhjaV8tPkdldEFjbFF1ZXVlRW5kKCksIEdldEhhbmRsZXIoKSk7Ci0KLSAgLy8gQ2FuJ3QgZG8gc2VjdXJpdHkgcmlnaHQgbm93LCBkdWUgdG8gdGhlIEVuY3J5cHRpb24gQ2hhbmdlIGNvbmZsaWN0IGJldHdlZW4gQUNMIG1hbmFnZXIgJiBzZWN1cml0eQotICAvLyBzZWN1cml0eV9pbnRlcmZhY2VfID0gaGNpXy0+R2V0U2VjdXJpdHlJbnRlcmZhY2UoY29tbW9uOjpCaW5kKFtdKEV2ZW50Vmlldyl7fSksIEdldEhhbmRsZXIoKSk7Ci0gIGxlX3NlY3VyaXR5X2ludGVyZmFjZV8gPSBoY2lfLT5HZXRMZVNlY3VyaXR5SW50ZXJmYWNlKEdldEhhbmRsZXIoKS0+QmluZChbXShMZU1ldGFFdmVudFZpZXcpIHt9KSk7Ci0gIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8gPSBoY2lfLT5HZXRBY2xDb25uZWN0aW9uSW50ZXJmYWNlKAotICAgICAgR2V0SGFuZGxlcigpLT5CaW5kKFtdKEV2ZW50Vmlldykge30pLAotICAgICAgR2V0SGFuZGxlcigpLT5CaW5kKFtdKHVpbnQxNl90LCBoY2k6OkVycm9yQ29kZSkge30pLAotICAgICAgR2V0SGFuZGxlcigpLT5CaW5kKFtdKGhjaTo6RXJyb3JDb2RlLCB1aW50MTZfdCwgdWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90KSB7fSkpOwotICBsZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfID0gaGNpXy0+R2V0TGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlKAotICAgICAgR2V0SGFuZGxlcigpLT5CaW5kKFtdKExlTWV0YUV2ZW50Vmlldykge30pLAotICAgICAgR2V0SGFuZGxlcigpLT5CaW5kKFtdKHVpbnQxNl90LCBoY2k6OkVycm9yQ29kZSkge30pLAotICAgICAgR2V0SGFuZGxlcigpLT5CaW5kKFtdKGhjaTo6RXJyb3JDb2RlLCB1aW50MTZfdCwgdWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90KSB7fSkpOwotICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfID0gaGNpXy0+R2V0TGVBZHZlcnRpc2luZ0ludGVyZmFjZShHZXRIYW5kbGVyKCktPkJpbmQoW10oTGVNZXRhRXZlbnRWaWV3KSB7fSkpOwotICBsZV9zY2FubmluZ19pbnRlcmZhY2VfID0gaGNpXy0+R2V0TGVTY2FubmluZ0ludGVyZmFjZShHZXRIYW5kbGVyKCktPkJpbmQoW10oTGVNZXRhRXZlbnRWaWV3KSB7fSkpOwotfQotCi12b2lkIEhjaUxheWVyRnV6ekNsaWVudDo6U3RvcCgpIHsKLSAgYWNsRGV2TnVsbF8tPlN0b3AoKTsKLSAgZGVsZXRlIGFjbERldk51bGxfOwotICBkZWxldGUgYWNsSW5qZWN0XzsKLX0KLQotdm9pZCBIY2lMYXllckZ1enpDbGllbnQ6OmluamVjdEFyYml0cmFyeShGdXp6ZWREYXRhUHJvdmlkZXImIGZkcCkgewotICBjb25zdCB1aW50OF90IGFjdGlvbiA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDgpOwotICBzd2l0Y2ggKGFjdGlvbikgewotICAgIGNhc2UgMToKLSAgICAgIGluamVjdEFjbERhdGEoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW5qZWN0SGNpQ29tbWFuZChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAvLyBUT0RPOiBpbmplY3RTZWN1cml0eUNvbW1hbmQoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5qZWN0TGVTZWN1cml0eUNvbW1hbmQoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgaW5qZWN0QWNsQ29ubmVjdGlvbkNvbW1hbmQoR2V0QXJiaXRyYXJ5Qnl0ZXMoJmZkcCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgaW5qZWN0TGVBY2xDb25uZWN0aW9uQ29tbWFuZChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICBpbmplY3RMZUFkdmVydGlzaW5nQ29tbWFuZChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBpbmplY3RMZVNjYW5uaW5nQ29tbWFuZChHZXRBcmJpdHJhcnlCeXRlcygmZmRwKSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIEhjaUxheWVyRnV6ekNsaWVudDo6aW5qZWN0QWNsRGF0YShzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIGhjaTo6QWNsVmlldyBhY2xQYWNrZXQgPSBoY2k6OkFjbFZpZXc6OkZyb21CeXRlcyhkYXRhKTsKLSAgaWYgKCFhY2xQYWNrZXQuSXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYWNsSW5qZWN0Xy0+SW5qZWN0KEFjbEJ1aWxkZXI6OkZyb21WaWV3KGFjbFBhY2tldCkpOwotfQotCi12b2lkIEhjaUxheWVyRnV6ekNsaWVudDo6aW5qZWN0SGNpQ29tbWFuZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIGluamVjdF9jb21tYW5kPENvbW1hbmRWaWV3LCBDb21tYW5kQnVpbGRlcj4oZGF0YSwgaGNpXyk7Ci19Ci0KLXZvaWQgSGNpTGF5ZXJGdXp6Q2xpZW50OjppbmplY3RTZWN1cml0eUNvbW1hbmQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBpbmplY3RfY29tbWFuZDxTZWN1cml0eUNvbW1hbmRWaWV3LCBTZWN1cml0eUNvbW1hbmRCdWlsZGVyPihkYXRhLCBzZWN1cml0eV9pbnRlcmZhY2VfKTsKLX0KLQotdm9pZCBIY2lMYXllckZ1enpDbGllbnQ6OmluamVjdExlU2VjdXJpdHlDb21tYW5kKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgaW5qZWN0X2NvbW1hbmQ8TGVTZWN1cml0eUNvbW1hbmRWaWV3LCBMZVNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+KGRhdGEsIGxlX3NlY3VyaXR5X2ludGVyZmFjZV8pOwotfQotCi12b2lkIEhjaUxheWVyRnV6ekNsaWVudDo6aW5qZWN0QWNsQ29ubmVjdGlvbkNvbW1hbmQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBpbmplY3RfY29tbWFuZDxBY2xDb21tYW5kVmlldywgQWNsQ29tbWFuZEJ1aWxkZXI+KGRhdGEsIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV8pOwotfQotCi12b2lkIEhjaUxheWVyRnV6ekNsaWVudDo6aW5qZWN0TGVBY2xDb25uZWN0aW9uQ29tbWFuZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIGluamVjdF9jb21tYW5kPEFjbENvbW1hbmRWaWV3LCBBY2xDb21tYW5kQnVpbGRlcj4oZGF0YSwgbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXyk7Ci19Ci0KLXZvaWQgSGNpTGF5ZXJGdXp6Q2xpZW50OjppbmplY3RMZUFkdmVydGlzaW5nQ29tbWFuZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gIGluamVjdF9jb21tYW5kPExlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldywgTGVBZHZlcnRpc2luZ0NvbW1hbmRCdWlsZGVyPihkYXRhLCBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfKTsKLX0KLQotdm9pZCBIY2lMYXllckZ1enpDbGllbnQ6OmluamVjdExlU2Nhbm5pbmdDb21tYW5kKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgaW5qZWN0X2NvbW1hbmQ8TGVTY2FubmluZ0NvbW1hbmRWaWV3LCBMZVNjYW5uaW5nQ29tbWFuZEJ1aWxkZXI+KGRhdGEsIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZnV6egotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2Z1enovaGNpX2xheWVyX2Z1enpfY2xpZW50LmggYi9nZC9oY2kvZnV6ei9oY2lfbGF5ZXJfZnV6el9jbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3NjNjZS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZnV6ei9oY2lfbGF5ZXJfZnV6el9jbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiaGNpL2Z1enovc3RhdHVzX3ZzX2NvbXBsZXRlX2NvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2Z1enovZGV2X251bGxfcXVldWUuaCIKLSNpbmNsdWRlICJvcy9mdXp6L2Z1enpfaW5qZWN0X3F1ZXVlLmgiCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZnV6eiB7Ci0KLWNsYXNzIEhjaUxheWVyRnV6ekNsaWVudCA6IHB1YmxpYyBNb2R1bGUgewotIHB1YmxpYzoKLSAgSGNpTGF5ZXJGdXp6Q2xpZW50KCkgOiBNb2R1bGUoKSB7fQotCi0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBpbmplY3RBcmJpdHJhcnkoRnV6emVkRGF0YVByb3ZpZGVyJiBmZHApOwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgbGlzdC0+YWRkPGhjaTo6SGNpTGF5ZXI+KCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiAiRGV2TnVsbEhjaSI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgaW5qZWN0QWNsRGF0YShzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RIY2lDb21tYW5kKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotICB2b2lkIGluamVjdFNlY3VyaXR5Q29tbWFuZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RMZVNlY3VyaXR5Q29tbWFuZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RBY2xDb25uZWN0aW9uQ29tbWFuZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLSAgdm9pZCBpbmplY3RMZUFjbENvbm5lY3Rpb25Db21tYW5kKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotICB2b2lkIGluamVjdExlQWR2ZXJ0aXNpbmdDb21tYW5kKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotICB2b2lkIGluamVjdExlU2Nhbm5pbmdDb21tYW5kKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUVklFVywgdHlwZW5hbWUgVEJVSUxERVI+Ci0gIHZvaWQgaW5qZWN0X2NvbW1hbmQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSwgQ29tbWFuZEludGVyZmFjZTxUQlVJTERFUj4qIGludGVyZmFjZSkgewotICAgIFRWSUVXIGNvbW1hbmRQYWNrZXQgPSBUVklFVzo6RnJvbUJ5dGVzKGRhdGEpOwotICAgIGlmICghY29tbWFuZFBhY2tldC5Jc1ZhbGlkKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodXNlc19jb21tYW5kX3N0YXR1cyhjb21tYW5kUGFja2V0LkdldE9wQ29kZSgpKSkgewotICAgICAgaW50ZXJmYWNlLT5FbnF1ZXVlQ29tbWFuZChUQlVJTERFUjo6RnJvbVZpZXcoY29tbWFuZFBhY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZXIoKS0+QmluZE9uY2UoW10oQ29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7fSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbnRlcmZhY2UtPkVucXVldWVDb21tYW5kKFRCVUlMREVSOjpGcm9tVmlldyhjb21tYW5kUGFja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0SGFuZGxlcigpLT5CaW5kT25jZShbXShDb21tYW5kQ29tcGxldGVWaWV3IHN0YXR1cykge30pKTsKLSAgICB9Ci0gIH0KLQotICBoY2k6OkhjaUxheWVyKiBoY2lfID0gbnVsbHB0cjsKLSAgb3M6OmZ1eno6OkRldk51bGxRdWV1ZTxBY2xWaWV3PiogYWNsRGV2TnVsbF87Ci0gIG9zOjpmdXp6OjpGdXp6SW5qZWN0UXVldWU8QWNsQnVpbGRlcj4qIGFjbEluamVjdF87Ci0KLSAgU2VjdXJpdHlJbnRlcmZhY2UqIHNlY3VyaXR5X2ludGVyZmFjZV87Ci0gIExlU2VjdXJpdHlJbnRlcmZhY2UqIGxlX3NlY3VyaXR5X2ludGVyZmFjZV87Ci0gIEFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIGFjbF9jb25uZWN0aW9uX2ludGVyZmFjZV87Ci0gIExlQWNsQ29ubmVjdGlvbkludGVyZmFjZSogbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlXzsKLSAgTGVBZHZlcnRpc2luZ0ludGVyZmFjZSogbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXzsKLSAgTGVTY2FubmluZ0ludGVyZmFjZSogbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmdXp6Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvZnV6ei9oY2lfbGF5ZXJfZnV6el90ZXN0LmNjIGIvZ2QvaGNpL2Z1enovaGNpX2xheWVyX2Z1enpfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMjdkOC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZnV6ei9oY2lfbGF5ZXJfZnV6el90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImZ1enovaGVscGVycy5oIgotI2luY2x1ZGUgImhhbC9mdXp6L2Z1enpfaGNpX2hhbC5oIgotI2luY2x1ZGUgImhjaS9mdXp6L2hjaV9sYXllcl9mdXp6X2NsaWVudC5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9mdXp6L2Zha2VfdGltZXJmZC5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi11c2luZyBibHVldG9vdGg6OkZ1enpUZXN0TW9kdWxlUmVnaXN0cnk7Ci11c2luZyBibHVldG9vdGg6OmZ1eno6OkdldEFyYml0cmFyeUJ5dGVzOwotdXNpbmcgYmx1ZXRvb3RoOjpoYWw6OkhjaUhhbDsKLXVzaW5nIGJsdWV0b290aDo6aGFsOjpmdXp6OjpGdXp6SGNpSGFsOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OmZ1eno6OkhjaUxheWVyRnV6ekNsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6b3M6OmZ1eno6OmZha2VfdGltZXJmZF9hZHZhbmNlOwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6ZnV6ejo6ZmFrZV90aW1lcmZkX2NhcF9hdDsKLXVzaW5nIGJsdWV0b290aDo6b3M6OmZ1eno6OmZha2VfdGltZXJmZF9yZXNldDsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOwotICBmYWtlX3RpbWVyZmRfY2FwX2F0KDE5OTkpOyAgLy8gcHJldmVudCBjb21tYW5kIHRpbWVvdXRzCi0KLSAgc3RhdGljIEZ1enpUZXN0TW9kdWxlUmVnaXN0cnkgbW9kdWxlUmVnaXN0cnkgPSBGdXp6VGVzdE1vZHVsZVJlZ2lzdHJ5KCk7Ci0gIEZ1enpIY2lIYWwqIGZ1enpIYWwgPSBtb2R1bGVSZWdpc3RyeS5JbmplY3Q8RnV6ekhjaUhhbD4oJkhjaUhhbDo6RmFjdG9yeSk7Ci0gIEhjaUxheWVyRnV6ekNsaWVudCogZnV6ekNsaWVudCA9IG1vZHVsZVJlZ2lzdHJ5LlN0YXJ0PEhjaUxheWVyRnV6ekNsaWVudD4oKTsKLQotICB3aGlsZSAoZGF0YVByb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCkgewotICAgIGNvbnN0IHVpbnQ4X3QgYWN0aW9uID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2UoMCwgNSk7Ci0gICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgZmFrZV90aW1lcmZkX2FkdmFuY2UoZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBmdXp6SGFsLT5pbmplY3RBcmJpdHJhcnkoZGF0YVByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIGZ1enpDbGllbnQtPmluamVjdEFyYml0cmFyeShkYXRhUHJvdmlkZXIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBtb2R1bGVSZWdpc3RyeS5XYWl0Rm9ySWRsZUFuZFN0b3BBbGwoKTsKLSAgZmFrZV90aW1lcmZkX3Jlc2V0KCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2Z1enovc3RhdHVzX3ZzX2NvbXBsZXRlX2NvbW1hbmRzLmNjIGIvZ2QvaGNpL2Z1enovc3RhdHVzX3ZzX2NvbXBsZXRlX2NvbW1hbmRzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRhNWZmLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9mdXp6L3N0YXR1c192c19jb21wbGV0ZV9jb21tYW5kcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvZnV6ei9zdGF0dXNfdnNfY29tcGxldGVfY29tbWFuZHMuaCIKLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZnV6eiB7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpoY2k6Ok9wQ29kZTsKLQotY29uc3RleHByIE9wQ29kZSBTdGF0dXNPcENvZGVzW10gPSB7Ci0gICAgT3BDb2RlOjpSRVNFVCwKLX07Ci0KLXN0YXRpYyBzdGQ6Om1hcDxPcENvZGUsIGJvb2w+IGNvbW1hbmRzX3RoYXRfdXNlX3N0YXR1czsKLQotc3RhdGljIHZvaWQgbWF5YmVfcG9wdWxhdGVfbGlzdCgpIHsKLSAgaWYgKCFjb21tYW5kc190aGF0X3VzZV9zdGF0dXMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoT3BDb2RlIGNvZGUgOiBTdGF0dXNPcENvZGVzKSB7Ci0gICAgY29tbWFuZHNfdGhhdF91c2Vfc3RhdHVzW2NvZGVdID0gdHJ1ZTsKLSAgfQotfQotCi1ib29sIHVzZXNfY29tbWFuZF9zdGF0dXMoT3BDb2RlIGNvZGUpIHsKLSAgbWF5YmVfcG9wdWxhdGVfbGlzdCgpOwotICByZXR1cm4gY29tbWFuZHNfdGhhdF91c2Vfc3RhdHVzLmZpbmQoY29kZSkgIT0gY29tbWFuZHNfdGhhdF91c2Vfc3RhdHVzLmVuZCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZnV6egotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2Z1enovc3RhdHVzX3ZzX2NvbXBsZXRlX2NvbW1hbmRzLmggYi9nZC9oY2kvZnV6ei9zdGF0dXNfdnNfY29tcGxldGVfY29tbWFuZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwY2U1ZS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvZnV6ei9zdGF0dXNfdnNfY29tcGxldGVfY29tbWFuZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgZnV6eiB7Ci0KLWJvb2wgdXNlc19jb21tYW5kX3N0YXR1cyhoY2k6Ok9wQ29kZSBjb2RlKTsKLQotfQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2hjaV9hY2xfbWFuYWdlci5mYnMgYi9nZC9oY2kvaGNpX2FjbF9tYW5hZ2VyLmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0ODFlYi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvaGNpX2FjbF9tYW5hZ2VyLmZicworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotbmFtZXNwYWNlIGJsdWV0b290aC5oY2k7Ci0KLWF0dHJpYnV0ZSAicHJpdmFjeSI7Ci0KLXRhYmxlIEFjbE1hbmFnZXJEYXRhIHsKLSAgICB0aXRsZTpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotfQotCi1yb290X3R5cGUgQWNsTWFuYWdlckRhdGE7CmRpZmYgLS1naXQgYS9nZC9oY2kvaGNpX2xheWVyLmNjIGIvZ2QvaGNpL2hjaV9sYXllci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzOTgzNi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvaGNpX2xheWVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0b3Bfd2F0Y2guaCIKLSNpbmNsdWRlICJoY2kvaGNpX21ldHJpY3NfbG9nZ2luZy5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0jaW5jbHVkZSAib3MvbWV0cmljcy5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF9idWlsZGVyLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9zdG9yYWdlX21vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkJpbmRPbjsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpCaW5kT25jZTsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpDb21tYW5kQnVpbGRlcjsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpDb21tYW5kQ29tcGxldGVWaWV3OwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRTdGF0dXNWaWV3OwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50VmlldzsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpMZU1ldGFFdmVudFZpZXc7Ci11c2luZyBibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgY29tbW9uOjpCaWRpUXVldWU7Ci11c2luZyBjb21tb246OkJpZGlRdWV1ZUVuZDsKLXVzaW5nIGhjaTo6T3BDb2RlOwotdXNpbmcgaGNpOjpSZXNldENvbXBsZXRlVmlldzsKLXVzaW5nIG9zOjpBbGFybTsKLXVzaW5nIG9zOjpIYW5kbGVyOwotdXNpbmcgc3RkOjptb3ZlOwotdXNpbmcgc3RkOjp1bmlxdWVfcHRyOwotCi1zdGF0aWMgdm9pZCBmYWlsX2lmX3Jlc2V0X2NvbXBsZXRlX25vdF9zdWNjZXNzKENvbW1hbmRDb21wbGV0ZVZpZXcgY29tcGxldGUpIHsKLSAgYXV0byByZXNldF9jb21wbGV0ZSA9IFJlc2V0Q29tcGxldGVWaWV3OjpDcmVhdGUoY29tcGxldGUpOwotICBBU1NFUlQocmVzZXRfY29tcGxldGUuSXNWYWxpZCgpKTsKLSAgQVNTRVJUKHJlc2V0X2NvbXBsZXRlLkdldFN0YXR1cygpID09IEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFib3J0X2FmdGVyX3RpbWVfb3V0KE9wQ29kZSBvcF9jb2RlKSB7Ci0gIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY0hjaVRpbWVvdXRFdmVudChzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3BfY29kZSkpOwotICBBU1NFUlRfTE9HKGZhbHNlLCAiRG9uZSB3YWl0aW5nIGZvciBkZWJ1ZyBpbmZvcm1hdGlvbiBhZnRlciBIQ0kgdGltZW91dCAoJXMpIiwgT3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpKTsKLX0KLQotY2xhc3MgQ29tbWFuZFF1ZXVlRW50cnkgewotIHB1YmxpYzoKLSAgQ29tbWFuZFF1ZXVlRW50cnkoCi0gICAgICB1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kX3BhY2tldCwgQ29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZV9mdW5jdGlvbikKLSAgICAgIDogY29tbWFuZChtb3ZlKGNvbW1hbmRfcGFja2V0KSksIHdhaXRpbmdfZm9yX3N0YXR1c18oZmFsc2UpLCBvbl9jb21wbGV0ZShtb3ZlKG9uX2NvbXBsZXRlX2Z1bmN0aW9uKSkge30KLQotICBDb21tYW5kUXVldWVFbnRyeSgKLSAgICAgIHVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmRfcGFja2V0LCBDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZFN0YXR1c1ZpZXcpPiBvbl9zdGF0dXNfZnVuY3Rpb24pCi0gICAgICA6IGNvbW1hbmQobW92ZShjb21tYW5kX3BhY2tldCkpLCB3YWl0aW5nX2Zvcl9zdGF0dXNfKHRydWUpLCBvbl9zdGF0dXMobW92ZShvbl9zdGF0dXNfZnVuY3Rpb24pKSB7fQotCi0gIHVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQ7Ci0gIHVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+IGNvbW1hbmRfdmlldzsKLQotICBib29sIHdhaXRpbmdfZm9yX3N0YXR1c187Ci0gIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1czsKLSAgQ29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFZpZXc+Ci0gIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChUVmlldyk+KiBHZXRDYWxsYmFjaygpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHRlbXBsYXRlIDw+Ci0gIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+KiBHZXRDYWxsYmFjazxDb21tYW5kU3RhdHVzVmlldz4oKSB7Ci0gICAgcmV0dXJuICZvbl9zdGF0dXM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8PgotICBDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZENvbXBsZXRlVmlldyk+KiBHZXRDYWxsYmFjazxDb21tYW5kQ29tcGxldGVWaWV3PigpIHsKLSAgICByZXR1cm4gJm9uX2NvbXBsZXRlOwotICB9Ci19OwotCi1zdHJ1Y3QgSGNpTGF5ZXI6OmltcGwgewotICBpbXBsKGhhbDo6SGNpSGFsKiBoYWwsIEhjaUxheWVyJiBtb2R1bGUpIDogaGFsXyhoYWwpLCBtb2R1bGVfKG1vZHVsZSkgewotICAgIGhjaV90aW1lb3V0X2FsYXJtXyA9IG5ldyBBbGFybShtb2R1bGUuR2V0SGFuZGxlcigpKTsKLSAgfQotCi0gIH5pbXBsKCkgewotICAgIGluY29taW5nX2FjbF9idWZmZXJfLkNsZWFyKCk7Ci0gICAgaW5jb21pbmdfc2NvX2J1ZmZlcl8uQ2xlYXIoKTsKLSAgICBpbmNvbWluZ19pc29fYnVmZmVyXy5DbGVhcigpOwotICAgIGlmIChoY2lfdGltZW91dF9hbGFybV8gIT0gbnVsbHB0cikgewotICAgICAgZGVsZXRlIGhjaV90aW1lb3V0X2FsYXJtXzsKLSAgICB9Ci0gICAgaWYgKGhjaV9hYm9ydF9hbGFybV8gIT0gbnVsbHB0cikgewotICAgICAgZGVsZXRlIGhjaV9hYm9ydF9hbGFybV87Ci0gICAgfQotICAgIGNvbW1hbmRfcXVldWVfLmNsZWFyKCk7Ci0gIH0KLQotICB2b2lkIGRyb3AoRXZlbnRWaWV3IGV2ZW50KSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nIGV2ZW50ICVzIiwgRXZlbnRDb2RlVGV4dChldmVudC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci0gIH0KLQotICB2b2lkIG9uX291dGJvdW5kX2FjbF9yZWFkeSgpIHsKLSAgICBhdXRvIHBhY2tldCA9IGFjbF9xdWV1ZV8uR2V0RG93bkVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7Ci0gICAgQml0SW5zZXJ0ZXIgYmkoYnl0ZXMpOwotICAgIHBhY2tldC0+U2VyaWFsaXplKGJpKTsKLSAgICBoYWxfLT5zZW5kQWNsRGF0YShieXRlcyk7Ci0gIH0KLQotICB2b2lkIG9uX291dGJvdW5kX3Njb19yZWFkeSgpIHsKLSAgICBhdXRvIHBhY2tldCA9IHNjb19xdWV1ZV8uR2V0RG93bkVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7Ci0gICAgQml0SW5zZXJ0ZXIgYmkoYnl0ZXMpOwotICAgIHBhY2tldC0+U2VyaWFsaXplKGJpKTsKLSAgICBoYWxfLT5zZW5kU2NvRGF0YShieXRlcyk7Ci0gIH0KLQotICB2b2lkIG9uX291dGJvdW5kX2lzb19yZWFkeSgpIHsKLSAgICBhdXRvIHBhY2tldCA9IGlzb19xdWV1ZV8uR2V0RG93bkVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7Ci0gICAgQml0SW5zZXJ0ZXIgYmkoYnl0ZXMpOwotICAgIHBhY2tldC0+U2VyaWFsaXplKGJpKTsKLSAgICBoYWxfLT5zZW5kSXNvRGF0YShieXRlcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFJlc3BvbnNlPgotICB2b2lkIGVucXVldWVfY29tbWFuZCh1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kLCBDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoVFJlc3BvbnNlKT4gb25fcmVzcG9uc2UpIHsKLSAgICBjb21tYW5kX3F1ZXVlXy5lbXBsYWNlX2JhY2sobW92ZShjb21tYW5kKSwgbW92ZShvbl9yZXNwb25zZSkpOwotICAgIHNlbmRfbmV4dF9jb21tYW5kKCk7Ci0gIH0KLQotICB2b2lkIG9uX2NvbW1hbmRfc3RhdHVzKEV2ZW50VmlldyBldmVudCkgewotICAgIENvbW1hbmRTdGF0dXNWaWV3IHJlc3BvbnNlX3ZpZXcgPSBDb21tYW5kU3RhdHVzVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlQocmVzcG9uc2Vfdmlldy5Jc1ZhbGlkKCkpOwotICAgIE9wQ29kZSBvcF9jb2RlID0gcmVzcG9uc2Vfdmlldy5HZXRDb21tYW5kT3BDb2RlKCk7Ci0gICAgRXJyb3JDb2RlIHN0YXR1cyA9IHJlc3BvbnNlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAiUmVjZWl2ZWQgVU5FWFBFQ1RFRCBjb21tYW5kIHN0YXR1czolcyBvcGNvZGU6MHglMDJoeCAoJXMpIiwKLSAgICAgICAgICBFcnJvckNvZGVUZXh0KHN0YXR1cykuY19zdHIoKSwKLSAgICAgICAgICBvcF9jb2RlLAotICAgICAgICAgIE9wQ29kZVRleHQob3BfY29kZSkuY19zdHIoKSk7Ci0gICAgfQotICAgIGhhbmRsZV9jb21tYW5kX3Jlc3BvbnNlPENvbW1hbmRTdGF0dXNWaWV3PihldmVudCwgInN0YXR1cyIpOwotICB9Ci0KLSAgdm9pZCBvbl9jb21tYW5kX2NvbXBsZXRlKEV2ZW50VmlldyBldmVudCkgewotICAgIGhhbmRsZV9jb21tYW5kX3Jlc3BvbnNlPENvbW1hbmRDb21wbGV0ZVZpZXc+KGV2ZW50LCAiY29tcGxldGUiKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUUmVzcG9uc2U+Ci0gIHZvaWQgaGFuZGxlX2NvbW1hbmRfcmVzcG9uc2UoRXZlbnRWaWV3IGV2ZW50LCBzdGQ6OnN0cmluZyBsb2dnaW5nX2lkKSB7Ci0gICAgVFJlc3BvbnNlIHJlc3BvbnNlX3ZpZXcgPSBUUmVzcG9uc2U6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUKHJlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBjb21tYW5kX2NyZWRpdHNfID0gcmVzcG9uc2Vfdmlldy5HZXROdW1IY2lDb21tYW5kUGFja2V0cygpOwotICAgIE9wQ29kZSBvcF9jb2RlID0gcmVzcG9uc2Vfdmlldy5HZXRDb21tYW5kT3BDb2RlKCk7Ci0gICAgaWYgKG9wX2NvZGUgPT0gT3BDb2RlOjpOT05FKSB7Ci0gICAgICBzZW5kX25leHRfY29tbWFuZCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBib29sIGlzX3N0YXR1cyA9IGxvZ2dpbmdfaWQgPT0gInN0YXR1cyI7Ci0KLSAgICBBU1NFUlRfTE9HKCFjb21tYW5kX3F1ZXVlXy5lbXB0eSgpLCAiVW5leHBlY3RlZCAlcyBldmVudCB3aXRoIE9wQ29kZSAweCUwMmh4ICglcykiLCBsb2dnaW5nX2lkLmNfc3RyKCksIG9wX2NvZGUsCi0gICAgICAgICAgICAgICBPcENvZGVUZXh0KG9wX2NvZGUpLmNfc3RyKCkpOwotICAgIEFTU0VSVF9MT0cod2FpdGluZ19jb21tYW5kXyA9PSBvcF9jb2RlLCAiV2FpdGluZyBmb3IgMHglMDJoeCAoJXMpLCBnb3QgMHglMDJoeCAoJXMpIiwgd2FpdGluZ19jb21tYW5kXywKLSAgICAgICAgICAgICAgIE9wQ29kZVRleHQod2FpdGluZ19jb21tYW5kXykuY19zdHIoKSwgb3BfY29kZSwgT3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpKTsKLSAgICBBU1NFUlRfTE9HKGNvbW1hbmRfcXVldWVfLmZyb250KCkud2FpdGluZ19mb3Jfc3RhdHVzXyA9PSBpc19zdGF0dXMsICIweCUwMmh4ICglcykgd2FzIG5vdCBleHBlY3RpbmcgJXMgZXZlbnQiLAotICAgICAgICAgICAgICAgb3BfY29kZSwgT3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpLCBsb2dnaW5nX2lkLmNfc3RyKCkpOwotCi0gICAgY29tbWFuZF9xdWV1ZV8uZnJvbnQoKS5HZXRDYWxsYmFjazxUUmVzcG9uc2U+KCktPkludm9rZShtb3ZlKHJlc3BvbnNlX3ZpZXcpKTsKLSAgICBjb21tYW5kX3F1ZXVlXy5wb3BfZnJvbnQoKTsKLSAgICB3YWl0aW5nX2NvbW1hbmRfID0gT3BDb2RlOjpOT05FOwotICAgIGlmIChoY2lfdGltZW91dF9hbGFybV8gIT0gbnVsbHB0cikgewotICAgICAgaGNpX3RpbWVvdXRfYWxhcm1fLT5DYW5jZWwoKTsKLSAgICAgIHNlbmRfbmV4dF9jb21tYW5kKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvbl9oY2lfdGltZW91dChPcENvZGUgb3BfY29kZSkgewotICAgIGNvbW1vbjo6U3RvcFdhdGNoOjpEdW1wU3RvcFdhdGNoTG9nKCk7Ci0gICAgTE9HX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgMHglMDJoeCAoJXMpIiwgb3BfY29kZSwgT3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpKTsKLSAgICAvLyBUT0RPOiBMb2dNZXRyaWNIY2lUaW1lb3V0RXZlbnQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG9wX2NvZGUpKTsKLQotICAgIExPR19FUlJPUigiRmx1c2hpbmcgJXpkIHdhaXRpbmcgY29tbWFuZHMiLCBjb21tYW5kX3F1ZXVlXy5zaXplKCkpOwotICAgIC8vIENsZWFyIGFueSB3YWl0aW5nIGNvbW1hbmRzICh0aGVyZSBpcyBhbiBhYm9ydCBjb21pbmcgYW55d2F5KQotICAgIGNvbW1hbmRfcXVldWVfLmNsZWFyKCk7Ci0gICAgY29tbWFuZF9jcmVkaXRzXyA9IDE7Ci0gICAgd2FpdGluZ19jb21tYW5kXyA9IE9wQ29kZTo6Tk9ORTsKLSAgICBlbnF1ZXVlX2NvbW1hbmQoCi0gICAgICAgIENvbnRyb2xsZXJEZWJ1Z0luZm9CdWlsZGVyOjpDcmVhdGUoKSwgbW9kdWxlXy5HZXRIYW5kbGVyKCktPkJpbmRPbmNlKCZmYWlsX2lmX3Jlc2V0X2NvbXBsZXRlX25vdF9zdWNjZXNzKSk7Ci0gICAgLy8gRG9uJ3QgdGltZSBvdXQgZm9yIHRoaXMgb25lOwotICAgIGlmIChoY2lfdGltZW91dF9hbGFybV8gIT0gbnVsbHB0cikgewotICAgICAgaGNpX3RpbWVvdXRfYWxhcm1fLT5DYW5jZWwoKTsKLSAgICAgIGRlbGV0ZSBoY2lfdGltZW91dF9hbGFybV87Ci0gICAgICBoY2lfdGltZW91dF9hbGFybV8gPSBudWxscHRyOwotICAgIH0KLSAgICBpZiAoaGNpX2Fib3J0X2FsYXJtXyA9PSBudWxscHRyKSB7Ci0gICAgICBoY2lfYWJvcnRfYWxhcm1fID0gbmV3IEFsYXJtKG1vZHVsZV8uR2V0SGFuZGxlcigpKTsKLSAgICAgIGhjaV9hYm9ydF9hbGFybV8tPlNjaGVkdWxlKEJpbmRPbmNlKCZhYm9ydF9hZnRlcl90aW1lX291dCwgb3BfY29kZSksIGtIY2lUaW1lb3V0UmVzdGFydE1zKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBzY2hlZHVsIGFib3J0IHRpbWVyIik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZW5kX25leHRfY29tbWFuZCgpIHsKLSAgICBpZiAoY29tbWFuZF9jcmVkaXRzXyA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh3YWl0aW5nX2NvbW1hbmRfICE9IE9wQ29kZTo6Tk9ORSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY29tbWFuZF9xdWV1ZV8uc2l6ZSgpID09IDApIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gICAgQml0SW5zZXJ0ZXIgYmkoKmJ5dGVzKTsKLSAgICBjb21tYW5kX3F1ZXVlXy5mcm9udCgpLmNvbW1hbmQtPlNlcmlhbGl6ZShiaSk7Ci0gICAgaGFsXy0+c2VuZEhjaUNvbW1hbmQoKmJ5dGVzKTsKLQotICAgIGF1dG8gY21kX3ZpZXcgPSBDb21tYW5kVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4oYnl0ZXMpKTsKLSAgICBBU1NFUlQoY21kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBPcENvZGUgb3BfY29kZSA9IGNtZF92aWV3LkdldE9wQ29kZSgpOwotICAgIGNvbW1hbmRfcXVldWVfLmZyb250KCkuY29tbWFuZF92aWV3ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21tYW5kVmlldz4oc3RkOjptb3ZlKGNtZF92aWV3KSk7Ci0gICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9jb21tYW5kX3N0YXR1cyhjb21tYW5kX3F1ZXVlXy5mcm9udCgpLmNvbW1hbmRfdmlldywgRXJyb3JDb2RlOjpTVEFUVVNfVU5LTk9XTik7Ci0gICAgbG9nX2NsYXNzaWNfcGFpcmluZ19jb21tYW5kX3N0YXR1cyhjb21tYW5kX3F1ZXVlXy5mcm9udCgpLmNvbW1hbmRfdmlldywgRXJyb3JDb2RlOjpTVEFUVVNfVU5LTk9XTik7Ci0gICAgd2FpdGluZ19jb21tYW5kXyA9IG9wX2NvZGU7Ci0gICAgY29tbWFuZF9jcmVkaXRzXyA9IDA7ICAvLyBPbmx5IGFsbG93IG9uZSBvdXRzdGFuZGluZyBjb21tYW5kCi0gICAgaWYgKGhjaV90aW1lb3V0X2FsYXJtXyAhPSBudWxscHRyKSB7Ci0gICAgICBoY2lfdGltZW91dF9hbGFybV8tPlNjaGVkdWxlKEJpbmRPbmNlKCZpbXBsOjpvbl9oY2lfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBvcF9jb2RlKSwga0hjaVRpbWVvdXRNcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19XQVJOKCIlcyBzZW50IHdpdGhvdXQgYW4gaGNpLXRpbWVvdXQgdGltZXIiLCBPcENvZGVUZXh0KG9wX2NvZGUpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfZXZlbnQoRXZlbnRDb2RlIGV2ZW50LCBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBoYW5kbGVyKSB7Ci0gICAgQVNTRVJUX0xPRygKLSAgICAgICAgZXZlbnQgIT0gRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5ULAotICAgICAgICAiQ2FuIG5vdCByZWdpc3RlciBoYW5kbGVyIGZvciAlMDJoaHggKCVzKSIsCi0gICAgICAgIEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCwKLSAgICAgICAgRXZlbnRDb2RlVGV4dChFdmVudENvZGU6OkxFX01FVEFfRVZFTlQpLmNfc3RyKCkpOwotICAgIEFTU0VSVF9MT0coZXZlbnRfaGFuZGxlcnNfLmNvdW50KGV2ZW50KSA9PSAwLCAiQ2FuIG5vdCByZWdpc3RlciBhIHNlY29uZCBoYW5kbGVyIGZvciAlMDJoaHggKCVzKSIsIGV2ZW50LAotICAgICAgICAgICAgICAgRXZlbnRDb2RlVGV4dChldmVudCkuY19zdHIoKSk7Ci0gICAgZXZlbnRfaGFuZGxlcnNfW2V2ZW50XSA9IGhhbmRsZXI7Ci0gIH0KLQotICB2b2lkIHVucmVnaXN0ZXJfZXZlbnQoRXZlbnRDb2RlIGV2ZW50KSB7Ci0gICAgZXZlbnRfaGFuZGxlcnNfLmVyYXNlKGV2ZW50KTsKLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfbGVfbWV0YV9ldmVudChDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBoYW5kbGVyKSB7Ci0gICAgQVNTRVJUX0xPRygKLSAgICAgICAgZXZlbnRfaGFuZGxlcnNfLmNvdW50KEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkgPT0gMCwKLSAgICAgICAgIkNhbiBub3QgcmVnaXN0ZXIgYSBzZWNvbmQgaGFuZGxlciBmb3IgJTAyaGh4ICglcykiLAotICAgICAgICBFdmVudENvZGU6OkxFX01FVEFfRVZFTlQsCi0gICAgICAgIEV2ZW50Q29kZVRleHQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKS5jX3N0cigpKTsKLSAgICBldmVudF9oYW5kbGVyc19bRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UXSA9IGhhbmRsZXI7Ci0gIH0KLQotICB2b2lkIHVucmVnaXN0ZXJfbGVfbWV0YV9ldmVudCgpIHsKLSAgICB1bnJlZ2lzdGVyX2V2ZW50KEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCk7Ci0gIH0KLQotICB2b2lkIHJlZ2lzdGVyX2xlX2V2ZW50KFN1YmV2ZW50Q29kZSBldmVudCwgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gaGFuZGxlcikgewotICAgIEFTU0VSVF9MT0coc3ViZXZlbnRfaGFuZGxlcnNfLmNvdW50KGV2ZW50KSA9PSAwLCAiQ2FuIG5vdCByZWdpc3RlciBhIHNlY29uZCBoYW5kbGVyIGZvciAlMDJoaHggKCVzKSIsIGV2ZW50LAotICAgICAgICAgICAgICAgU3ViZXZlbnRDb2RlVGV4dChldmVudCkuY19zdHIoKSk7Ci0gICAgc3ViZXZlbnRfaGFuZGxlcnNfW2V2ZW50XSA9IGhhbmRsZXI7Ci0gIH0KLQotICB2b2lkIHVucmVnaXN0ZXJfbGVfZXZlbnQoU3ViZXZlbnRDb2RlIGV2ZW50KSB7Ci0gICAgc3ViZXZlbnRfaGFuZGxlcnNfLmVyYXNlKHN1YmV2ZW50X2hhbmRsZXJzXy5maW5kKGV2ZW50KSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBhYm9ydF9hZnRlcl9yb290X2luZmxhbW1hdGlvbih1aW50OF90IHZzZV9lcnJvcikgewotICAgIEFTU0VSVF9MT0coZmFsc2UsICJSb290IGluZmxhbW1hdGlvbiB3aXRoIHJlYXNvbiAweCUwMmhoeCIsIHZzZV9lcnJvcik7Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9yb290X2luZmxhbW1hdGlvbih1aW50OF90IHZzZV9lcnJvcl9yZWFzb24pIHsKLSAgICBMT0dfRVJST1IoIlJlY2VpdmVkIGEgUm9vdCBJbmZsYW1tYXRpb24gRXZlbnQgdmVuZG9yIHJlYXNvbiAweCUwMmhoeCwgc2NoZWR1bGluZyBhbiBhYm9ydCIsCi0gICAgICAgICAgICAgIHZzZV9lcnJvcl9yZWFzb24pOwotICAgIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY0JsdWV0b290aEhhbENyYXNoUmVhc29uKEFkZHJlc3M6OmtFbXB0eSwgMCwgdnNlX2Vycm9yX3JlYXNvbik7Ci0gICAgLy8gQWRkIExvZ2dpbmcgZm9yIGNyYXNoIHJlYXNvbgotICAgIGlmIChoY2lfdGltZW91dF9hbGFybV8gIT0gbnVsbHB0cikgewotICAgICAgaGNpX3RpbWVvdXRfYWxhcm1fLT5DYW5jZWwoKTsKLSAgICAgIGRlbGV0ZSBoY2lfdGltZW91dF9hbGFybV87Ci0gICAgICBoY2lfdGltZW91dF9hbGFybV8gPSBudWxscHRyOwotICAgIH0KLSAgICBpZiAoaGNpX2Fib3J0X2FsYXJtXyA9PSBudWxscHRyKSB7Ci0gICAgICBoY2lfYWJvcnRfYWxhcm1fID0gbmV3IEFsYXJtKG1vZHVsZV8uR2V0SGFuZGxlcigpKTsKLSAgICAgIGhjaV9hYm9ydF9hbGFybV8tPlNjaGVkdWxlKEJpbmRPbmNlKCZhYm9ydF9hZnRlcl9yb290X2luZmxhbW1hdGlvbiwgdnNlX2Vycm9yX3JlYXNvbiksIGtIY2lUaW1lb3V0UmVzdGFydE1zKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX1dBUk4oIkFib3J0IHRpbWVyIGFscmVhZHkgc2NoZWR1bGVkIik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvbl9oY2lfZXZlbnQoRXZlbnRWaWV3IGV2ZW50KSB7Ci0gICAgQVNTRVJUKGV2ZW50LklzVmFsaWQoKSk7Ci0gICAgaWYgKGNvbW1hbmRfcXVldWVfLmVtcHR5KCkpIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kVmlldz4gbm9fd2FpdGluZ19jb21tYW5ke251bGxwdHJ9OwotICAgICAgbG9nX2hjaV9ldmVudChub193YWl0aW5nX2NvbW1hbmQsIGV2ZW50LCBtb2R1bGVfLkdldERlcGVuZGVuY3k8c3RvcmFnZTo6U3RvcmFnZU1vZHVsZT4oKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxvZ19oY2lfZXZlbnQoY29tbWFuZF9xdWV1ZV8uZnJvbnQoKS5jb21tYW5kX3ZpZXcsIGV2ZW50LCBtb2R1bGVfLkdldERlcGVuZGVuY3k8c3RvcmFnZTo6U3RvcmFnZU1vZHVsZT4oKSk7Ci0gICAgfQotICAgIEV2ZW50Q29kZSBldmVudF9jb2RlID0gZXZlbnQuR2V0RXZlbnRDb2RlKCk7Ci0gICAgLy8gUm9vdCBJbmZsYW1hdGlvbiBpcyBhIHNwZWNpYWwgY2FzZSwgc2luY2UgaXQgYWJvcnRzIGhlcmUKLSAgICBpZiAoZXZlbnRfY29kZSA9PSBFdmVudENvZGU6OlZFTkRPUl9TUEVDSUZJQykgewotICAgICAgYXV0byB2aWV3ID0gVmVuZG9yU3BlY2lmaWNFdmVudFZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICAgICAgaWYgKHZpZXcuR2V0U3ViZXZlbnRDb2RlKCkgPT0gVnNlU3ViZXZlbnRDb2RlOjpCUVJfRVZFTlQpIHsKLSAgICAgICAgYXV0byBicXJfcXVhbGl0eV92aWV3ID0gQnFyTGlua1F1YWxpdHlFdmVudFZpZXc6OkNyZWF0ZShCcXJFdmVudFZpZXc6OkNyZWF0ZSh2aWV3KSk7Ci0gICAgICAgIGF1dG8gaW5mbGFtbWF0aW9uID0gQnFyUm9vdEluZmxhbW1hdGlvbkV2ZW50Vmlldzo6Q3JlYXRlKGJxcl9xdWFsaXR5X3ZpZXcpOwotICAgICAgICBpZiAoYnFyX3F1YWxpdHlfdmlldy5Jc1ZhbGlkKCkgJiYgaW5mbGFtbWF0aW9uLklzVmFsaWQoKSkgewotICAgICAgICAgIGhhbmRsZV9yb290X2luZmxhbW1hdGlvbihpbmZsYW1tYXRpb24uR2V0VmVuZG9yU3BlY2lmaWNFcnJvckNvZGUoKSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChldmVudF9oYW5kbGVyc18uZmluZChldmVudF9jb2RlKSA9PSBldmVudF9oYW5kbGVyc18uZW5kKCkpIHsKLSAgICAgIExPR19XQVJOKCJVbmhhbmRsZWQgZXZlbnQgb2YgdHlwZSAweCUwMmhoeCAoJXMpIiwgZXZlbnRfY29kZSwgRXZlbnRDb2RlVGV4dChldmVudF9jb2RlKS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXZlbnRfaGFuZGxlcnNfW2V2ZW50X2NvZGVdLkludm9rZShldmVudCk7Ci0gIH0KLQotICB2b2lkIG9uX2xlX21ldGFfZXZlbnQoRXZlbnRWaWV3IGV2ZW50KSB7Ci0gICAgTGVNZXRhRXZlbnRWaWV3IG1ldGFfZXZlbnRfdmlldyA9IExlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlQobWV0YV9ldmVudF92aWV3LklzVmFsaWQoKSk7Ci0gICAgU3ViZXZlbnRDb2RlIHN1YmV2ZW50X2NvZGUgPSBtZXRhX2V2ZW50X3ZpZXcuR2V0U3ViZXZlbnRDb2RlKCk7Ci0gICAgaWYgKHN1YmV2ZW50X2hhbmRsZXJzXy5maW5kKHN1YmV2ZW50X2NvZGUpID09IHN1YmV2ZW50X2hhbmRsZXJzXy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIlVuaGFuZGxlZCBsZSBzdWJldmVudCBvZiB0eXBlIDB4JTAyaGh4ICglcykiLCBzdWJldmVudF9jb2RlLCBTdWJldmVudENvZGVUZXh0KHN1YmV2ZW50X2NvZGUpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdWJldmVudF9oYW5kbGVyc19bc3ViZXZlbnRfY29kZV0uSW52b2tlKG1ldGFfZXZlbnRfdmlldyk7Ci0gIH0KLQotICBoYWw6OkhjaUhhbCogaGFsXzsKLSAgSGNpTGF5ZXImIG1vZHVsZV87Ci0KLSAgLy8gQ29tbWFuZCBIYW5kbGluZwotICBzdGQ6Omxpc3Q8Q29tbWFuZFF1ZXVlRW50cnk+IGNvbW1hbmRfcXVldWVfOwotCi0gIHN0ZDo6bWFwPEV2ZW50Q29kZSwgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoRXZlbnRWaWV3KT4+IGV2ZW50X2hhbmRsZXJzXzsKLSAgc3RkOjptYXA8U3ViZXZlbnRDb2RlLCBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChMZU1ldGFFdmVudFZpZXcpPj4gc3ViZXZlbnRfaGFuZGxlcnNfOwotICBPcENvZGUgd2FpdGluZ19jb21tYW5kX3tPcENvZGU6Ok5PTkV9OwotICB1aW50OF90IGNvbW1hbmRfY3JlZGl0c197MX07ICAvLyBTZW5kIHJlc2V0IGZpcnN0Ci0gIEFsYXJtKiBoY2lfdGltZW91dF9hbGFybV97bnVsbHB0cn07Ci0gIEFsYXJtKiBoY2lfYWJvcnRfYWxhcm1fe251bGxwdHJ9OwotCi0gIC8vIEFjbCBwYWNrZXRzCi0gIEJpZGlRdWV1ZTxBY2xWaWV3LCBBY2xCdWlsZGVyPiBhY2xfcXVldWVfezMgLyogVE9ETzogU2V0IHF1ZXVlIGRlcHRoICovfTsKLSAgb3M6OkVucXVldWVCdWZmZXI8QWNsVmlldz4gaW5jb21pbmdfYWNsX2J1ZmZlcl97YWNsX3F1ZXVlXy5HZXREb3duRW5kKCl9OwotCi0gIC8vIFNDTyBwYWNrZXRzCi0gIEJpZGlRdWV1ZTxTY29WaWV3LCBTY29CdWlsZGVyPiBzY29fcXVldWVfezMgLyogVE9ETzogU2V0IHF1ZXVlIGRlcHRoICovfTsKLSAgb3M6OkVucXVldWVCdWZmZXI8U2NvVmlldz4gaW5jb21pbmdfc2NvX2J1ZmZlcl97c2NvX3F1ZXVlXy5HZXREb3duRW5kKCl9OwotCi0gIC8vIElTTyBwYWNrZXRzCi0gIEJpZGlRdWV1ZTxJc29WaWV3LCBJc29CdWlsZGVyPiBpc29fcXVldWVfezMgLyogVE9ETzogU2V0IHF1ZXVlIGRlcHRoICovfTsKLSAgb3M6OkVucXVldWVCdWZmZXI8SXNvVmlldz4gaW5jb21pbmdfaXNvX2J1ZmZlcl97aXNvX3F1ZXVlXy5HZXREb3duRW5kKCl9OwotfTsKLQotLy8gQWxsIGZ1bmN0aW9ucyBoZXJlIGFyZSBydW5uaW5nIG9uIHRoZSBIQUwgdGhyZWFkCi1zdHJ1Y3QgSGNpTGF5ZXI6OmhhbF9jYWxsYmFja3MgOiBwdWJsaWMgaGFsOjpIY2lIYWxDYWxsYmFja3MgewotICBoYWxfY2FsbGJhY2tzKEhjaUxheWVyJiBtb2R1bGUpIDogbW9kdWxlXyhtb2R1bGUpIHt9Ci0KLSAgdm9pZCBoY2lFdmVudFJlY2VpdmVkKGhhbDo6SGNpUGFja2V0IGV2ZW50X2J5dGVzKSBvdmVycmlkZSB7Ci0gICAgYXV0byBwYWNrZXQgPSBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPihzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihldmVudF9ieXRlcykpOwotICAgIEV2ZW50VmlldyBldmVudCA9IEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgbW9kdWxlXy5DYWxsT24obW9kdWxlXy5pbXBsXywgJmltcGw6Om9uX2hjaV9ldmVudCwgbW92ZShldmVudCkpOwotICB9Ci0KLSAgdm9pZCBhY2xEYXRhUmVjZWl2ZWQoaGFsOjpIY2lQYWNrZXQgZGF0YV9ieXRlcykgb3ZlcnJpZGUgewotICAgIGF1dG8gcGFja2V0ID0gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4obW92ZShkYXRhX2J5dGVzKSkpOwotICAgIGF1dG8gYWNsID0gc3RkOjptYWtlX3VuaXF1ZTxBY2xWaWV3PihBY2xWaWV3OjpDcmVhdGUocGFja2V0KSk7Ci0gICAgbW9kdWxlXy5pbXBsXy0+aW5jb21pbmdfYWNsX2J1ZmZlcl8uRW5xdWV1ZShtb3ZlKGFjbCksIG1vZHVsZV8uR2V0SGFuZGxlcigpKTsKLSAgfQotCi0gIHZvaWQgc2NvRGF0YVJlY2VpdmVkKGhhbDo6SGNpUGFja2V0IGRhdGFfYnl0ZXMpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHBhY2tldCA9IHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KG1vdmUoZGF0YV9ieXRlcykpKTsKLSAgICBhdXRvIHNjbyA9IHN0ZDo6bWFrZV91bmlxdWU8U2NvVmlldz4oU2NvVmlldzo6Q3JlYXRlKHBhY2tldCkpOwotICAgIG1vZHVsZV8uaW1wbF8tPmluY29taW5nX3Njb19idWZmZXJfLkVucXVldWUobW92ZShzY28pLCBtb2R1bGVfLkdldEhhbmRsZXIoKSk7Ci0gIH0KLQotICB2b2lkIGlzb0RhdGFSZWNlaXZlZChoYWw6OkhjaVBhY2tldCBkYXRhX2J5dGVzKSBvdmVycmlkZSB7Ci0gICAgYXV0byBwYWNrZXQgPSBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPihzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pihtb3ZlKGRhdGFfYnl0ZXMpKSk7Ci0gICAgYXV0byBpc28gPSBzdGQ6Om1ha2VfdW5pcXVlPElzb1ZpZXc+KElzb1ZpZXc6OkNyZWF0ZShwYWNrZXQpKTsKLSAgICBtb2R1bGVfLmltcGxfLT5pbmNvbWluZ19pc29fYnVmZmVyXy5FbnF1ZXVlKG1vdmUoaXNvKSwgbW9kdWxlXy5HZXRIYW5kbGVyKCkpOwotICB9Ci0KLSAgSGNpTGF5ZXImIG1vZHVsZV87Ci19OwotCi1IY2lMYXllcjo6SGNpTGF5ZXIoKSA6IGltcGxfKG51bGxwdHIpLCBoYWxfY2FsbGJhY2tzXyhudWxscHRyKSB7fQotCi1IY2lMYXllcjo6fkhjaUxheWVyKCkgewotfQotCi1jb21tb246OkJpZGlRdWV1ZUVuZDxBY2xCdWlsZGVyLCBBY2xWaWV3PiogSGNpTGF5ZXI6OkdldEFjbFF1ZXVlRW5kKCkgewotICByZXR1cm4gaW1wbF8tPmFjbF9xdWV1ZV8uR2V0VXBFbmQoKTsKLX0KLQotY29tbW9uOjpCaWRpUXVldWVFbmQ8U2NvQnVpbGRlciwgU2NvVmlldz4qIEhjaUxheWVyOjpHZXRTY29RdWV1ZUVuZCgpIHsKLSAgcmV0dXJuIGltcGxfLT5zY29fcXVldWVfLkdldFVwRW5kKCk7Ci19Ci0KLWNvbW1vbjo6QmlkaVF1ZXVlRW5kPElzb0J1aWxkZXIsIElzb1ZpZXc+KiBIY2lMYXllcjo6R2V0SXNvUXVldWVFbmQoKSB7Ci0gIHJldHVybiBpbXBsXy0+aXNvX3F1ZXVlXy5HZXRVcEVuZCgpOwotfQotCi12b2lkIEhjaUxheWVyOjpFbnF1ZXVlQ29tbWFuZCgKLSAgICB1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kLCBDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZENvbXBsZXRlVmlldyk+IG9uX2NvbXBsZXRlKSB7Ci0gIENhbGxPbihpbXBsXywgJmltcGw6OmVucXVldWVfY29tbWFuZDxDb21tYW5kQ29tcGxldGVWaWV3PiwgbW92ZShjb21tYW5kKSwgbW92ZShvbl9jb21wbGV0ZSkpOwotfQotCi12b2lkIEhjaUxheWVyOjpFbnF1ZXVlQ29tbWFuZCgKLSAgICB1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kLCBDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZFN0YXR1c1ZpZXcpPiBvbl9zdGF0dXMpIHsKLSAgQ2FsbE9uKGltcGxfLCAmaW1wbDo6ZW5xdWV1ZV9jb21tYW5kPENvbW1hbmRTdGF0dXNWaWV3PiwgbW92ZShjb21tYW5kKSwgbW92ZShvbl9zdGF0dXMpKTsKLX0KLQotdm9pZCBIY2lMYXllcjo6UmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlIGV2ZW50LCBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBoYW5kbGVyKSB7Ci0gIENhbGxPbihpbXBsXywgJmltcGw6OnJlZ2lzdGVyX2V2ZW50LCBldmVudCwgaGFuZGxlcik7Ci19Ci0KLXZvaWQgSGNpTGF5ZXI6OlJlZ2lzdGVyTGVNZXRhRXZlbnRIYW5kbGVyKENvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+IGhhbmRsZXIpIHsKLSAgQ2FsbE9uKGltcGxfLCAmaW1wbDo6cmVnaXN0ZXJfbGVfbWV0YV9ldmVudCwgaGFuZGxlcik7Ci19Ci0KLXZvaWQgSGNpTGF5ZXI6OlVucmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlIGV2ZW50KSB7Ci0gIENhbGxPbihpbXBsXywgJmltcGw6OnVucmVnaXN0ZXJfZXZlbnQsIGV2ZW50KTsKLX0KLQotdm9pZCBIY2lMYXllcjo6UmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihTdWJldmVudENvZGUgZXZlbnQsIENvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+IGhhbmRsZXIpIHsKLSAgQ2FsbE9uKGltcGxfLCAmaW1wbDo6cmVnaXN0ZXJfbGVfZXZlbnQsIGV2ZW50LCBoYW5kbGVyKTsKLX0KLQotdm9pZCBIY2lMYXllcjo6VW5yZWdpc3RlckxlRXZlbnRIYW5kbGVyKFN1YmV2ZW50Q29kZSBldmVudCkgewotICBDYWxsT24oaW1wbF8sICZpbXBsOjp1bnJlZ2lzdGVyX2xlX2V2ZW50LCBldmVudCk7Ci19Ci0KLXZvaWQgSGNpTGF5ZXI6Om9uX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUoRXZlbnRWaWV3IGV2ZW50X3ZpZXcpIHsKLSAgYXV0byBkaXNjb25uZWN0aW9uX3ZpZXcgPSBEaXNjb25uZWN0aW9uQ29tcGxldGVWaWV3OjpDcmVhdGUoZXZlbnRfdmlldyk7Ci0gIGlmICghZGlzY29ubmVjdGlvbl92aWV3LklzVmFsaWQoKSkgewotICAgIExPR19JTkZPKCJEcm9wcGluZyBpbnZhbGlkIGRpc2Nvbm5lY3Rpb24gcGFja2V0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgaGFuZGxlID0gZGlzY29ubmVjdGlvbl92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgRXJyb3JDb2RlIHJlYXNvbiA9IGRpc2Nvbm5lY3Rpb25fdmlldy5HZXRSZWFzb24oKTsKLSAgRGlzY29ubmVjdChoYW5kbGUsIHJlYXNvbik7Ci19Ci0KLXZvaWQgSGNpTGF5ZXI6OkRpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCBFcnJvckNvZGUgcmVhc29uKSB7Ci0gIGZvciAoYXV0byBjYWxsYmFjayA6IGRpc2Nvbm5lY3RfaGFuZGxlcnNfKSB7Ci0gICAgY2FsbGJhY2suSW52b2tlKGhhbmRsZSwgcmVhc29uKTsKLSAgfQotfQotCi12b2lkIEhjaUxheWVyOjpvbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlKEV2ZW50VmlldyBldmVudF92aWV3KSB7Ci0gIGF1dG8gdmlldyA9IFJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudF92aWV3KTsKLSAgQVNTRVJUX0xPRyh2aWV3LklzVmFsaWQoKSwgIlJlYWQgcmVtb3RlIHZlcnNpb24gaW5mb3JtYXRpb24gcGFja2V0IGludmFsaWQiKTsKLSAgUmVhZFJlbW90ZVZlcnNpb24oCi0gICAgICB2aWV3LkdldFN0YXR1cygpLAotICAgICAgdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCksCi0gICAgICB2aWV3LkdldFZlcnNpb24oKSwKLSAgICAgIHZpZXcuR2V0TWFudWZhY3R1cmVyTmFtZSgpLAotICAgICAgdmlldy5HZXRTdWJWZXJzaW9uKCkpOwotfQotCi12b2lkIEhjaUxheWVyOjpSZWFkUmVtb3RlVmVyc2lvbigKLSAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSB7Ci0gIGZvciAoYXV0byBjYWxsYmFjayA6IHJlYWRfcmVtb3RlX3ZlcnNpb25faGFuZGxlcnNfKSB7Ci0gICAgY2FsbGJhY2suSW52b2tlKGhjaV9zdGF0dXMsIGhhbmRsZSwgdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgfQotfQotCi1BY2xDb25uZWN0aW9uSW50ZXJmYWNlKiBIY2lMYXllcjo6R2V0QWNsQ29ubmVjdGlvbkludGVyZmFjZSgKLSAgICBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyLAotICAgIENvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90LCBFcnJvckNvZGUpPiBvbl9kaXNjb25uZWN0LAotICAgIENvbnRleHR1YWxDYWxsYmFjazwKLSAgICAgICAgdm9pZChoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCB1aW50MTZfdCwgdWludDhfdCB2ZXJzaW9uLCB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3ViX3ZlcnNpb24pPgotICAgICAgICBvbl9yZWFkX3JlbW90ZV92ZXJzaW9uKSB7Ci0gIGZvciAoY29uc3QgYXV0byBldmVudCA6IEFjbENvbm5lY3Rpb25FdmVudHMpIHsKLSAgICBSZWdpc3RlckV2ZW50SGFuZGxlcihldmVudCwgZXZlbnRfaGFuZGxlcik7Ci0gIH0KLSAgZGlzY29ubmVjdF9oYW5kbGVyc18ucHVzaF9iYWNrKG9uX2Rpc2Nvbm5lY3QpOwotICByZWFkX3JlbW90ZV92ZXJzaW9uX2hhbmRsZXJzXy5wdXNoX2JhY2sob25fcmVhZF9yZW1vdGVfdmVyc2lvbik7Ci0gIHJldHVybiAmYWNsX2Nvbm5lY3Rpb25fbWFuYWdlcl9pbnRlcmZhY2VfOwotfQotCi1MZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UqIEhjaUxheWVyOjpHZXRMZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UoCi0gICAgQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlciwKLSAgICBDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZCh1aW50MTZfdCwgRXJyb3JDb2RlKT4gb25fZGlzY29ubmVjdCwKLSAgICBDb250ZXh0dWFsQ2FsbGJhY2s8Ci0gICAgICAgIHZvaWQoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDE2X3QsIHVpbnQ4X3QgdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKT4KLSAgICAgICAgb25fcmVhZF9yZW1vdGVfdmVyc2lvbikgewotICBmb3IgKGNvbnN0IGF1dG8gZXZlbnQgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50RXZlbnRzKSB7Ci0gICAgUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihldmVudCwgZXZlbnRfaGFuZGxlcik7Ci0gIH0KLSAgZGlzY29ubmVjdF9oYW5kbGVyc18ucHVzaF9iYWNrKG9uX2Rpc2Nvbm5lY3QpOwotICByZWFkX3JlbW90ZV92ZXJzaW9uX2hhbmRsZXJzXy5wdXNoX2JhY2sob25fcmVhZF9yZW1vdGVfdmVyc2lvbik7Ci0gIHJldHVybiAmbGVfYWNsX2Nvbm5lY3Rpb25fbWFuYWdlcl9pbnRlcmZhY2VfOwotfQotCi1TZWN1cml0eUludGVyZmFjZSogSGNpTGF5ZXI6OkdldFNlY3VyaXR5SW50ZXJmYWNlKENvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIHsKLSAgZm9yIChjb25zdCBhdXRvIGV2ZW50IDogU2VjdXJpdHlFdmVudHMpIHsKLSAgICBSZWdpc3RlckV2ZW50SGFuZGxlcihldmVudCwgZXZlbnRfaGFuZGxlcik7Ci0gIH0KLSAgcmV0dXJuICZzZWN1cml0eV9pbnRlcmZhY2U7Ci19Ci0KLUxlU2VjdXJpdHlJbnRlcmZhY2UqIEhjaUxheWVyOjpHZXRMZVNlY3VyaXR5SW50ZXJmYWNlKENvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIHsKLSAgZm9yIChjb25zdCBhdXRvIHN1YmV2ZW50IDogTGVTZWN1cml0eUV2ZW50cykgewotICAgIFJlZ2lzdGVyTGVFdmVudEhhbmRsZXIoc3ViZXZlbnQsIGV2ZW50X2hhbmRsZXIpOwotICB9Ci0gIHJldHVybiAmbGVfc2VjdXJpdHlfaW50ZXJmYWNlOwotfQotCi1MZUFkdmVydGlzaW5nSW50ZXJmYWNlKiBIY2lMYXllcjo6R2V0TGVBZHZlcnRpc2luZ0ludGVyZmFjZShDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSB7Ci0gIGZvciAoY29uc3QgYXV0byBzdWJldmVudCA6IExlQWR2ZXJ0aXNpbmdFdmVudHMpIHsKLSAgICBSZWdpc3RlckxlRXZlbnRIYW5kbGVyKHN1YmV2ZW50LCBldmVudF9oYW5kbGVyKTsKLSAgfQotICByZXR1cm4gJmxlX2FkdmVydGlzaW5nX2ludGVyZmFjZTsKLX0KLQotTGVTY2FubmluZ0ludGVyZmFjZSogSGNpTGF5ZXI6OkdldExlU2Nhbm5pbmdJbnRlcmZhY2UoQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgewotICBmb3IgKGNvbnN0IGF1dG8gc3ViZXZlbnQgOiBMZVNjYW5uaW5nRXZlbnRzKSB7Ci0gICAgUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihzdWJldmVudCwgZXZlbnRfaGFuZGxlcik7Ci0gIH0KLSAgcmV0dXJuICZsZV9zY2FubmluZ19pbnRlcmZhY2U7Ci19Ci0KLUxlSXNvSW50ZXJmYWNlKiBIY2lMYXllcjo6R2V0TGVJc29JbnRlcmZhY2UoQ29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgewotICBmb3IgKGNvbnN0IGF1dG8gc3ViZXZlbnQgOiBMZUlzb0V2ZW50cykgewotICAgIFJlZ2lzdGVyTGVFdmVudEhhbmRsZXIoc3ViZXZlbnQsIGV2ZW50X2hhbmRsZXIpOwotICB9Ci0gIHJldHVybiAmbGVfaXNvX2ludGVyZmFjZTsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBIY2lMYXllcjo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgSGNpTGF5ZXIoKTsgfSk7Ci0KLXZvaWQgSGNpTGF5ZXI6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICBsaXN0LT5hZGQ8aGFsOjpIY2lIYWw+KCk7Ci0gIGxpc3QtPmFkZDxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpOwotfQotCi12b2lkIEhjaUxheWVyOjpTdGFydCgpIHsKLSAgYXV0byBoYWwgPSBHZXREZXBlbmRlbmN5PGhhbDo6SGNpSGFsPigpOwotICBpbXBsXyA9IG5ldyBpbXBsKGhhbCwgKnRoaXMpOwotICBoYWxfY2FsbGJhY2tzXyA9IG5ldyBoYWxfY2FsbGJhY2tzKCp0aGlzKTsKLQotICBIYW5kbGVyKiBoYW5kbGVyID0gR2V0SGFuZGxlcigpOwotICBpbXBsXy0+YWNsX3F1ZXVlXy5HZXREb3duRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZShoYW5kbGVyLCBCaW5kT24oaW1wbF8sICZpbXBsOjpvbl9vdXRib3VuZF9hY2xfcmVhZHkpKTsKLSAgaW1wbF8tPnNjb19xdWV1ZV8uR2V0RG93bkVuZCgpLT5SZWdpc3RlckRlcXVldWUoaGFuZGxlciwgQmluZE9uKGltcGxfLCAmaW1wbDo6b25fb3V0Ym91bmRfc2NvX3JlYWR5KSk7Ci0gIGltcGxfLT5pc29fcXVldWVfLkdldERvd25FbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKGhhbmRsZXIsIEJpbmRPbihpbXBsXywgJmltcGw6Om9uX291dGJvdW5kX2lzb19yZWFkeSkpOwotICBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGU6OkNPTU1BTkRfQ09NUExFVEUsIGhhbmRsZXItPkJpbmRPbihpbXBsXywgJmltcGw6Om9uX2NvbW1hbmRfY29tcGxldGUpKTsKLSAgUmVnaXN0ZXJFdmVudEhhbmRsZXIoRXZlbnRDb2RlOjpDT01NQU5EX1NUQVRVUywgaGFuZGxlci0+QmluZE9uKGltcGxfLCAmaW1wbDo6b25fY29tbWFuZF9zdGF0dXMpKTsKLSAgUmVnaXN0ZXJMZU1ldGFFdmVudEhhbmRsZXIoaGFuZGxlci0+QmluZE9uKGltcGxfLCAmaW1wbDo6b25fbGVfbWV0YV9ldmVudCkpOwotICBpZiAoYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX2FjbF9pc19lbmFibGVkKCkgfHwgYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX2wyY2FwX2lzX2VuYWJsZWQoKSkgewotICAgIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKAotICAgICAgICBFdmVudENvZGU6OkRJU0NPTk5FQ1RJT05fQ09NUExFVEUsIGhhbmRsZXItPkJpbmRPbih0aGlzLCAmSGNpTGF5ZXI6Om9uX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUpKTsKLSAgICBSZWdpc3RlckV2ZW50SGFuZGxlcigKLSAgICAgICAgRXZlbnRDb2RlOjpSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OX0NPTVBMRVRFLAotICAgICAgICBoYW5kbGVyLT5CaW5kT24odGhpcywgJkhjaUxheWVyOjpvbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlKSk7Ci0gIH0KLSAgYXV0byBkcm9wX3BhY2tldCA9IGhhbmRsZXItPkJpbmRPbihpbXBsXywgJmltcGw6OmRyb3ApOwotICBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGU6OlBBR0VfU0NBTl9SRVBFVElUSU9OX01PREVfQ0hBTkdFLCBkcm9wX3BhY2tldCk7Ci0gIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZTo6TUFYX1NMT1RTX0NIQU5HRSwgZHJvcF9wYWNrZXQpOwotCi0gIEVucXVldWVDb21tYW5kKFJlc2V0QnVpbGRlcjo6Q3JlYXRlKCksIGhhbmRsZXItPkJpbmRPbmNlKCZmYWlsX2lmX3Jlc2V0X2NvbXBsZXRlX25vdF9zdWNjZXNzKSk7Ci0gIGhhbC0+cmVnaXN0ZXJJbmNvbWluZ1BhY2tldENhbGxiYWNrKGhhbF9jYWxsYmFja3NfKTsKLX0KLQotdm9pZCBIY2lMYXllcjo6U3RvcCgpIHsKLSAgYXV0byBoYWwgPSBHZXREZXBlbmRlbmN5PGhhbDo6SGNpSGFsPigpOwotICBoYWwtPnVucmVnaXN0ZXJJbmNvbWluZ1BhY2tldENhbGxiYWNrKCk7Ci0gIGRlbGV0ZSBoYWxfY2FsbGJhY2tzXzsKLQotICBpbXBsXy0+YWNsX3F1ZXVlXy5HZXREb3duRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gIGltcGxfLT5zY29fcXVldWVfLkdldERvd25FbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgaW1wbF8tPmlzb19xdWV1ZV8uR2V0RG93bkVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICBkZWxldGUgaW1wbF87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9oY2lfbGF5ZXIuaCBiL2dkL2hjaS9oY2lfbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4MzBiMS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvaGNpX2xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYWRkcmVzcy5oIgotI2luY2x1ZGUgImNsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NvbnRleHR1YWxfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgImhjaS9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJoY2kvbGVfYWNsX2Nvbm5lY3Rpb25faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGNpL2xlX2FkdmVydGlzaW5nX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhjaS9sZV9pc29faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGNpL2xlX3NjYW5uaW5nX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhjaS9sZV9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvdXRpbHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY2xhc3MgSGNpTGF5ZXIgOiBwdWJsaWMgTW9kdWxlLCBwdWJsaWMgQ29tbWFuZEludGVyZmFjZTxDb21tYW5kQnVpbGRlcj4gewotICAvLyBMSU5ULklmQ2hhbmdlCi0gcHVibGljOgotICBIY2lMYXllcigpOwotICB2aXJ0dWFsIH5IY2lMYXllcigpOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSGNpTGF5ZXIpOwotCi0gIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4gb25fY29tcGxldGUpIG92ZXJyaWRlOwotCi0gIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBjb21tb246OkJpZGlRdWV1ZUVuZDxBY2xCdWlsZGVyLCBBY2xWaWV3PiogR2V0QWNsUXVldWVFbmQoKTsKLQotICB2aXJ0dWFsIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPFNjb0J1aWxkZXIsIFNjb1ZpZXc+KiBHZXRTY29RdWV1ZUVuZCgpOwotCi0gIHZpcnR1YWwgY29tbW9uOjpCaWRpUXVldWVFbmQ8SXNvQnVpbGRlciwgSXNvVmlldz4qIEdldElzb1F1ZXVlRW5kKCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZSBldmVudF9jb2RlLCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZSBldmVudF9jb2RlKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKTsKLQotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlckxlRXZlbnRIYW5kbGVyKFN1YmV2ZW50Q29kZSBzdWJldmVudF9jb2RlKTsKLQotICB2aXJ0dWFsIFNlY3VyaXR5SW50ZXJmYWNlKiBHZXRTZWN1cml0eUludGVyZmFjZShjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgTGVTZWN1cml0eUludGVyZmFjZSogR2V0TGVTZWN1cml0eUludGVyZmFjZShjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgQWNsQ29ubmVjdGlvbkludGVyZmFjZSogR2V0QWNsQ29ubmVjdGlvbkludGVyZmFjZSgKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlciwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQodWludDE2X3QsIGhjaTo6RXJyb3JDb2RlKT4gb25fZGlzY29ubmVjdCwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpFcnJvckNvZGUsIHVpbnQxNl90LCB1aW50OF90LCB1aW50MTZfdCwgdWludDE2X3QpPgotICAgICAgICAgIG9uX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUpOwotCi0gIHZpcnR1YWwgTGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlKiBHZXRMZUFjbENvbm5lY3Rpb25JbnRlcmZhY2UoCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90LCBoY2k6OkVycm9yQ29kZSk+IG9uX2Rpc2Nvbm5lY3QsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6RXJyb3JDb2RlLCB1aW50MTZfdCwgdWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90KT4KLSAgICAgICAgICBvbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlKTsKLQotICB2aXJ0dWFsIExlQWR2ZXJ0aXNpbmdJbnRlcmZhY2UqIEdldExlQWR2ZXJ0aXNpbmdJbnRlcmZhY2UoCi0gICAgICBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgTGVTY2FubmluZ0ludGVyZmFjZSogR2V0TGVTY2FubmluZ0ludGVyZmFjZShjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgTGVJc29JbnRlcmZhY2UqIEdldExlSXNvSW50ZXJmYWNlKGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcik7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJIY2kgTGF5ZXIiOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGtIY2lUaW1lb3V0TXMgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMDApOwotICBzdGF0aWMgY29uc3RleHByIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga0hjaVRpbWVvdXRSZXN0YXJ0TXMgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMDApOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIExJTlQuVGhlbkNoYW5nZShmdXp6L2Z1enpfaGNpX2xheWVyLmgpCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCBFcnJvckNvZGUgcmVhc29uKTsKLSAgdmlydHVhbCB2b2lkIFJlYWRSZW1vdGVWZXJzaW9uKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IHZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbik7Ci0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckxlTWV0YUV2ZW50SGFuZGxlcihjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGltcGw7Ci0gIHN0cnVjdCBoYWxfY2FsbGJhY2tzOwotICBpbXBsKiBpbXBsXzsKLSAgaGFsX2NhbGxiYWNrcyogaGFsX2NhbGxiYWNrc187Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIENvbW1hbmRJbnRlcmZhY2VJbXBsIDogcHVibGljIENvbW1hbmRJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IENvbW1hbmRJbnRlcmZhY2VJbXBsKEhjaUxheWVyJiBoY2kpIDogaGNpXyhoY2kpIHt9Ci0gICAgfkNvbW1hbmRJbnRlcmZhY2VJbXBsKCkgPSBkZWZhdWx0OwotCi0gICAgdm9pZCBFbnF1ZXVlQ29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8VD4gY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgICAgaGNpXy5FbnF1ZXVlQ29tbWFuZChtb3ZlKGNvbW1hbmQpLCBzdGQ6Om1vdmUob25fY29tcGxldGUpKTsKLSAgICB9Ci0KLSAgICB2b2lkIEVucXVldWVDb21tYW5kKHN0ZDo6dW5pcXVlX3B0cjxUPiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZFN0YXR1c1ZpZXcpPiBvbl9zdGF0dXMpIG92ZXJyaWRlIHsKLSAgICAgIGhjaV8uRW5xdWV1ZUNvbW1hbmQobW92ZShjb21tYW5kKSwgc3RkOjptb3ZlKG9uX3N0YXR1cykpOwotICAgIH0KLSAgICBIY2lMYXllciYgaGNpXzsKLSAgfTsKLQotICBzdGQ6Omxpc3Q8Y29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZCh1aW50MTZfdCwgRXJyb3JDb2RlKT4+IGRpc2Nvbm5lY3RfaGFuZGxlcnNfOwotICBzdGQ6Omxpc3Q8Y29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkVycm9yQ29kZSwgdWludDE2X3QsIHVpbnQ4X3QsIHVpbnQxNl90LCB1aW50MTZfdCk+PgotICAgICAgcmVhZF9yZW1vdGVfdmVyc2lvbl9oYW5kbGVyc187Ci0gIHZvaWQgb25fZGlzY29ubmVjdGlvbl9jb21wbGV0ZShFdmVudFZpZXcgZXZlbnRfdmlldyk7Ci0gIHZvaWQgb25fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZShFdmVudFZpZXcgZXZlbnRfdmlldyk7Ci0KLSAgLy8gSW50ZXJmYWNlcwotICBDb21tYW5kSW50ZXJmYWNlSW1wbDxBY2xDb21tYW5kQnVpbGRlcj4gYWNsX2Nvbm5lY3Rpb25fbWFuYWdlcl9pbnRlcmZhY2Vfeyp0aGlzfTsKLSAgQ29tbWFuZEludGVyZmFjZUltcGw8QWNsQ29tbWFuZEJ1aWxkZXI+IGxlX2FjbF9jb25uZWN0aW9uX21hbmFnZXJfaW50ZXJmYWNlX3sqdGhpc307Ci0gIENvbW1hbmRJbnRlcmZhY2VJbXBsPFNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+IHNlY3VyaXR5X2ludGVyZmFjZXsqdGhpc307Ci0gIENvbW1hbmRJbnRlcmZhY2VJbXBsPExlU2VjdXJpdHlDb21tYW5kQnVpbGRlcj4gbGVfc2VjdXJpdHlfaW50ZXJmYWNleyp0aGlzfTsKLSAgQ29tbWFuZEludGVyZmFjZUltcGw8TGVBZHZlcnRpc2luZ0NvbW1hbmRCdWlsZGVyPiBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2V7KnRoaXN9OwotICBDb21tYW5kSW50ZXJmYWNlSW1wbDxMZVNjYW5uaW5nQ29tbWFuZEJ1aWxkZXI+IGxlX3NjYW5uaW5nX2ludGVyZmFjZXsqdGhpc307Ci0gIENvbW1hbmRJbnRlcmZhY2VJbXBsPExlSXNvQ29tbWFuZEJ1aWxkZXI+IGxlX2lzb19pbnRlcmZhY2V7KnRoaXN9OwotfTsKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9oY2lfbGF5ZXJfdGVzdC5jYyBiL2dkL2hjaS9oY2lfbGF5ZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhYWVhYS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvaGNpX2xheWVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpvczo6VGhyZWFkOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIHsKLXZlY3Rvcjx1aW50OF90PiBpbmZvcm1hdGlvbl9yZXF1ZXN0ID0gewotICAgIDB4ZmUsCi0gICAgMHgyZSwKLSAgICAweDBhLAotICAgIDB4MDAsCi0gICAgMHgwNiwKLSAgICAweDAwLAotICAgIDB4MDEsCi0gICAgMHgwMCwKLSAgICAweDBhLAotICAgIDB4MDIsCi0gICAgMHgwMiwKLSAgICAweDAwLAotICAgIDB4MDIsCi0gICAgMHgwMCwKLX07Ci0vLyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAuLi4KLXZlY3Rvcjx1aW50OF90PiBjb3VudGluZ19ieXRlczsKLS8vIDB4RkYsIDB4RkUsIDB4RkQsIDB4RkMsIC4uLgotdmVjdG9yPHVpbnQ4X3Q+IGNvdW50aW5nX2Rvd25fYnl0ZXM7Ci1jb25zdCBzaXplX3QgY291bnRfc2l6ZSA9IDB4ODsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGtUaW1lb3V0ID0gSGNpTGF5ZXI6OmtIY2lUaW1lb3V0TXMgLyAyOwotY29uc3RleHByIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga0FjbFRpbWVvdXQgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApOwotCi1jbGFzcyBUZXN0SGNpSGFsIDogcHVibGljIGhhbDo6SGNpSGFsIHsKLSBwdWJsaWM6Ci0gIFRlc3RIY2lIYWwoKSA6IGhhbDo6SGNpSGFsKCkge30KLQotICB+VGVzdEhjaUhhbCgpIHsKLSAgICBBU1NFUlRfTE9HKGNhbGxiYWNrcyA9PSBudWxscHRyLCAidW5yZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soKSBtdXN0IGJlIGNhbGxlZCIpOwotICB9Ci0KLSAgdm9pZCByZWdpc3RlckluY29taW5nUGFja2V0Q2FsbGJhY2soaGFsOjpIY2lIYWxDYWxsYmFja3MqIGNhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgY2FsbGJhY2tzID0gY2FsbGJhY2s7Ci0gIH0KLQotICB2b2lkIHVucmVnaXN0ZXJJbmNvbWluZ1BhY2tldENhbGxiYWNrKCkgb3ZlcnJpZGUgewotICAgIGNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIHNlbmRIY2lDb21tYW5kKGhhbDo6SGNpUGFja2V0IGNvbW1hbmQpIG92ZXJyaWRlIHsKLSAgICBvdXRnb2luZ19jb21tYW5kc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShjb21tYW5kKSk7Ci0gICAgaWYgKHNlbnRfY29tbWFuZF9wcm9taXNlXyAhPSBudWxscHRyKSB7Ci0gICAgICBhdXRvIHByb21pc2UgPSBzdGQ6Om1vdmUoc2VudF9jb21tYW5kX3Byb21pc2VfKTsKLSAgICAgIHNlbnRfY29tbWFuZF9wcm9taXNlXy5yZXNldCgpOwotICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZW5kQWNsRGF0YShoYWw6OkhjaVBhY2tldCBkYXRhKSBvdmVycmlkZSB7Ci0gICAgb3V0Z29pbmdfYWNsXy5wdXNoX2JhY2soc3RkOjptb3ZlKGRhdGEpKTsKLSAgICBpZiAoc2VudF9hY2xfcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgYXV0byBwcm9taXNlID0gc3RkOjptb3ZlKHNlbnRfYWNsX3Byb21pc2VfKTsKLSAgICAgIHNlbnRfYWNsX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNlbmRTY29EYXRhKGhhbDo6SGNpUGFja2V0IGRhdGEpIG92ZXJyaWRlIHsKLSAgICBvdXRnb2luZ19zY29fLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0KLSAgdm9pZCBzZW5kSXNvRGF0YShoYWw6OkhjaVBhY2tldCBkYXRhKSBvdmVycmlkZSB7Ci0gICAgb3V0Z29pbmdfaXNvXy5wdXNoX2JhY2soc3RkOjptb3ZlKGRhdGEpKTsKLSAgICBpZiAoc2VudF9pc29fcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgYXV0byBwcm9taXNlID0gc3RkOjptb3ZlKHNlbnRfaXNvX3Byb21pc2VfKTsKLSAgICAgIHNlbnRfaXNvX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBoYWw6OkhjaUhhbENhbGxiYWNrcyogY2FsbGJhY2tzID0gbnVsbHB0cjsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoaGFsOjpIY2lQYWNrZXQgZGF0YSkgewotICAgIGF1dG8gc2hhcmVkID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oZGF0YSk7Ci0gICAgcmV0dXJuIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4oc2hhcmVkKTsKLSAgfQotCi0gIHNpemVfdCBHZXROdW1TZW50Q29tbWFuZHMoKSB7Ci0gICAgcmV0dXJuIG91dGdvaW5nX2NvbW1hbmRzXy5zaXplKCk7Ci0gIH0KLQotICBzdGQ6OmZ1dHVyZTx2b2lkPiBHZXRTZW50Q29tbWFuZEZ1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKHNlbnRfY29tbWFuZF9wcm9taXNlXyA9PSBudWxscHRyLCAiUHJvbWlzZXMgcHJvbWlzZXMgLi4uIE9ubHkgb25lIGF0IGEgdGltZSIpOwotICAgIHNlbnRfY29tbWFuZF9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHJldHVybiBzZW50X2NvbW1hbmRfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgfQotCi0gIENvbW1hbmRWaWV3IEdldFNlbnRDb21tYW5kKCkgewotICAgIGF1dG8gcGFja2V0dmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKG91dGdvaW5nX2NvbW1hbmRzXy5mcm9udCgpKSk7Ci0gICAgb3V0Z29pbmdfY29tbWFuZHNfLnBvcF9mcm9udCgpOwotICAgIHJldHVybiBDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldHZpZXcpOwotICB9Ci0KLSAgc3RkOjpmdXR1cmU8dm9pZD4gR2V0U2VudEFjbEZ1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKHNlbnRfYWNsX3Byb21pc2VfID09IG51bGxwdHIsICJQcm9taXNlcyBwcm9taXNlcyAuLi4gT25seSBvbmUgYXQgYSB0aW1lIik7Ci0gICAgc2VudF9hY2xfcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICByZXR1cm4gc2VudF9hY2xfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gR2V0U2VudEFjbCgpIHsKLSAgICBhdXRvIHBhY2tldHZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShvdXRnb2luZ19hY2xfLmZyb250KCkpKTsKLSAgICBvdXRnb2luZ19hY2xfLnBvcF9mcm9udCgpOwotICAgIHJldHVybiBwYWNrZXR2aWV3OwotICB9Ci0KLSAgc3RkOjpmdXR1cmU8dm9pZD4gR2V0U2VudElzb0Z1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKHNlbnRfaXNvX3Byb21pc2VfID09IG51bGxwdHIsICJQcm9taXNlcyBwcm9taXNlcyAuLi4gT25seSBvbmUgYXQgYSB0aW1lIik7Ci0gICAgc2VudF9pc29fcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICByZXR1cm4gc2VudF9pc29fcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gR2V0U2VudElzbygpIHsKLSAgICBhdXRvIHBhY2tldHZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShvdXRnb2luZ19pc29fLmZyb250KCkpKTsKLSAgICBvdXRnb2luZ19pc29fLnBvcF9mcm9udCgpOwotICAgIHJldHVybiBwYWNrZXR2aWV3OwotICB9Ci0KLSAgdm9pZCBTdGFydCgpIHt9Ci0KLSAgdm9pZCBTdG9wKCkge30KLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCopIGNvbnN0IHt9Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJUZXN0SGNpSGFsIik7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJpdmF0ZToKLSAgc3RkOjpsaXN0PGhhbDo6SGNpUGFja2V0PiBvdXRnb2luZ19jb21tYW5kc187Ci0gIHN0ZDo6bGlzdDxoYWw6OkhjaVBhY2tldD4gb3V0Z29pbmdfYWNsXzsKLSAgc3RkOjpsaXN0PGhhbDo6SGNpUGFja2V0PiBvdXRnb2luZ19zY29fOwotICBzdGQ6Omxpc3Q8aGFsOjpIY2lQYWNrZXQ+IG91dGdvaW5nX2lzb187Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+IHNlbnRfY29tbWFuZF9wcm9taXNlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gc2VudF9hY2xfcHJvbWlzZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+IHNlbnRfaXNvX3Byb21pc2VfOwotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBUZXN0SGNpSGFsOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBUZXN0SGNpSGFsKCk7IH0pOwotCi1jbGFzcyBEZXBlbmRzT25IY2kgOiBwdWJsaWMgTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIERlcGVuZHNPbkhjaSgpIDogTW9kdWxlKCkge30KLQotICB2b2lkIFNlbmRIY2lDb21tYW5kRXhwZWN0aW5nU3RhdHVzKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZCkgewotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUoY29tbWFuZCksIEdldEhhbmRsZXIoKS0+QmluZE9uY2VPbih0aGlzLCAmRGVwZW5kc09uSGNpOjpoYW5kbGVfZXZlbnQ8Q29tbWFuZFN0YXR1c1ZpZXc+KSk7Ci0gIH0KLQotICB2b2lkIFNlbmRIY2lDb21tYW5kRXhwZWN0aW5nQ29tcGxldGUoc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kKSB7Ci0gICAgaGNpXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIHN0ZDo6bW92ZShjb21tYW5kKSwgR2V0SGFuZGxlcigpLT5CaW5kT25jZU9uKHRoaXMsICZEZXBlbmRzT25IY2k6OmhhbmRsZV9ldmVudDxDb21tYW5kQ29tcGxldGVWaWV3PikpOwotICB9Ci0KLSAgdm9pZCBTZW5kU2VjdXJpdHlDb21tYW5kRXhwZWN0aW5nQ29tcGxldGUoc3RkOjp1bmlxdWVfcHRyPFNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpIHsKLSAgICBpZiAoc2VjdXJpdHlfaW50ZXJmYWNlXyA9PSBudWxscHRyKSB7Ci0gICAgICBzZWN1cml0eV9pbnRlcmZhY2VfID0KLSAgICAgICAgICBoY2lfLT5HZXRTZWN1cml0eUludGVyZmFjZShHZXRIYW5kbGVyKCktPkJpbmRPbih0aGlzLCAmRGVwZW5kc09uSGNpOjpoYW5kbGVfZXZlbnQ8RXZlbnRWaWV3PikpOwotICAgIH0KLSAgICBoY2lfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgc3RkOjptb3ZlKGNvbW1hbmQpLCBHZXRIYW5kbGVyKCktPkJpbmRPbmNlT24odGhpcywgJkRlcGVuZHNPbkhjaTo6aGFuZGxlX2V2ZW50PENvbW1hbmRDb21wbGV0ZVZpZXc+KSk7Ci0gIH0KLQotICB2b2lkIFNlbmRMZVNlY3VyaXR5Q29tbWFuZEV4cGVjdGluZ0NvbXBsZXRlKHN0ZDo6dW5pcXVlX3B0cjxMZVNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpIHsKLSAgICBpZiAobGVfc2VjdXJpdHlfaW50ZXJmYWNlXyA9PSBudWxscHRyKSB7Ci0gICAgICBsZV9zZWN1cml0eV9pbnRlcmZhY2VfID0KLSAgICAgICAgICBoY2lfLT5HZXRMZVNlY3VyaXR5SW50ZXJmYWNlKEdldEhhbmRsZXIoKS0+QmluZE9uKHRoaXMsICZEZXBlbmRzT25IY2k6OmhhbmRsZV9ldmVudDxMZU1ldGFFdmVudFZpZXc+KSk7Ci0gICAgfQotICAgIGhjaV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUoY29tbWFuZCksIEdldEhhbmRsZXIoKS0+QmluZE9uY2VPbih0aGlzLCAmRGVwZW5kc09uSGNpOjpoYW5kbGVfZXZlbnQ8Q29tbWFuZENvbXBsZXRlVmlldz4pKTsKLSAgfQotCi0gIHZvaWQgU2VuZEFjbERhdGEoc3RkOjp1bmlxdWVfcHRyPEFjbEJ1aWxkZXI+IGFjbCkgewotICAgIG91dGdvaW5nX2FjbF8ucHVzaChzdGQ6Om1vdmUoYWNsKSk7Ci0gICAgYXV0byBxdWV1ZV9lbmQgPSBoY2lfLT5HZXRBY2xRdWV1ZUVuZCgpOwotICAgIHF1ZXVlX2VuZC0+UmVnaXN0ZXJFbnF1ZXVlKEdldEhhbmRsZXIoKSwgY29tbW9uOjpCaW5kKCZEZXBlbmRzT25IY2k6OmhhbmRsZV9lbnF1ZXVlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgU2VuZElzb0RhdGEoc3RkOjp1bmlxdWVfcHRyPElzb0J1aWxkZXI+IGlzbykgewotICAgIG91dGdvaW5nX2lzb18ucHVzaChzdGQ6Om1vdmUoaXNvKSk7Ci0gICAgYXV0byBxdWV1ZV9lbmQgPSBoY2lfLT5HZXRJc29RdWV1ZUVuZCgpOwotICAgIHF1ZXVlX2VuZC0+UmVnaXN0ZXJFbnF1ZXVlKEdldEhhbmRsZXIoKSwgY29tbW9uOjpCaW5kKCZEZXBlbmRzT25IY2k6OmhhbmRsZV9lbnF1ZXVlX2lzbywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLQotICBzdGQ6OmZ1dHVyZTx2b2lkPiBHZXRSZWNlaXZlZEV2ZW50RnV0dXJlKCkgewotICAgIEFTU0VSVF9MT0coZXZlbnRfcHJvbWlzZV8gPT0gbnVsbHB0ciwgIlByb21pc2VzIHByb21pc2VzIC4uLiBPbmx5IG9uZSBhdCBhIHRpbWUiKTsKLSAgICBldmVudF9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgIHJldHVybiBldmVudF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICB9Ci0KLSAgRXZlbnRWaWV3IEdldFJlY2VpdmVkRXZlbnQoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobGlzdF9wcm90ZWN0b3JfKTsKLSAgICBFdmVudFZpZXcgcGFja2V0dmlldyA9IGluY29taW5nX2V2ZW50c18uZnJvbnQoKTsKLSAgICBpbmNvbWluZ19ldmVudHNfLnBvcF9mcm9udCgpOwotICAgIHJldHVybiBwYWNrZXR2aWV3OwotICB9Ci0KLSAgc3RkOjpmdXR1cmU8dm9pZD4gR2V0UmVjZWl2ZWRBY2xGdXR1cmUoKSB7Ci0gICAgQVNTRVJUX0xPRyhhY2xfcHJvbWlzZV8gPT0gbnVsbHB0ciwgIlByb21pc2VzIHByb21pc2VzIC4uLiBPbmx5IG9uZSBhdCBhIHRpbWUiKTsKLSAgICBhY2xfcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICByZXR1cm4gYWNsX3Byb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gIH0KLQotICBzaXplX3QgR2V0TnVtUmVjZWl2ZWRBY2xQYWNrZXRzKCkgewotICAgIHJldHVybiBpbmNvbWluZ19hY2xfcGFja2V0c18uc2l6ZSgpOwotICB9Ci0KLSAgQWNsVmlldyBHZXRSZWNlaXZlZEFjbCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsaXN0X3Byb3RlY3Rvcl8pOwotICAgIEFjbFZpZXcgcGFja2V0dmlldyA9IGluY29taW5nX2FjbF9wYWNrZXRzXy5mcm9udCgpOwotICAgIGluY29taW5nX2FjbF9wYWNrZXRzXy5wb3BfZnJvbnQoKTsKLSAgICByZXR1cm4gcGFja2V0dmlldzsKLSAgfQotCi0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IEdldFJlY2VpdmVkSXNvRnV0dXJlKCkgewotICAgIEFTU0VSVF9MT0coaXNvX3Byb21pc2VfID09IG51bGxwdHIsICJQcm9taXNlcyBwcm9taXNlcyAuLi4gT25seSBvbmUgYXQgYSB0aW1lIik7Ci0gICAgaXNvX3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgcmV0dXJuIGlzb19wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICB9Ci0KLSAgc2l6ZV90IEdldE51bVJlY2VpdmVkSXNvUGFja2V0cygpIHsKLSAgICByZXR1cm4gaW5jb21pbmdfaXNvX3BhY2tldHNfLnNpemUoKTsKLSAgfQotCi0gIElzb1ZpZXcgR2V0UmVjZWl2ZWRJc28oKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobGlzdF9wcm90ZWN0b3JfKTsKLSAgICBJc29WaWV3IHBhY2tldHZpZXcgPSBpbmNvbWluZ19pc29fcGFja2V0c18uZnJvbnQoKTsKLSAgICBpbmNvbWluZ19pc29fcGFja2V0c18ucG9wX2Zyb250KCk7Ci0gICAgcmV0dXJuIHBhY2tldHZpZXc7Ci0gIH0KLQotICB2b2lkIFN0YXJ0KCkgewotICAgIGhjaV8gPSBHZXREZXBlbmRlbmN5PEhjaUxheWVyPigpOwotICAgIGhjaV8tPlJlZ2lzdGVyRXZlbnRIYW5kbGVyKAotICAgICAgICBFdmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEUsIEdldEhhbmRsZXIoKS0+QmluZE9uKHRoaXMsICZEZXBlbmRzT25IY2k6OmhhbmRsZV9ldmVudDxFdmVudFZpZXc+KSk7Ci0gICAgaGNpXy0+UmVnaXN0ZXJMZUV2ZW50SGFuZGxlcigKLSAgICAgICAgU3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFLCBHZXRIYW5kbGVyKCktPkJpbmRPbih0aGlzLCAmRGVwZW5kc09uSGNpOjpoYW5kbGVfZXZlbnQ8TGVNZXRhRXZlbnRWaWV3PikpOwotICAgIGhjaV8tPkdldEFjbFF1ZXVlRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgR2V0SGFuZGxlcigpLCBjb21tb246OkJpbmQoJkRlcGVuZHNPbkhjaTo6aGFuZGxlX2FjbCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgaGNpXy0+R2V0SXNvUXVldWVFbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBHZXRIYW5kbGVyKCksIGNvbW1vbjo6QmluZCgmRGVwZW5kc09uSGNpOjpoYW5kbGVfaXNvLCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIHsKLSAgICBoY2lfLT5HZXRBY2xRdWV1ZUVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIGhjaV8tPkdldElzb1F1ZXVlRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gIH0KLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgewotICAgIGxpc3QtPmFkZDxIY2lMYXllcj4oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiRGVwZW5kc09uSGNpIik7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJpdmF0ZToKLSAgSGNpTGF5ZXIqIGhjaV8gPSBudWxscHRyOwotICBjb25zdCBTZWN1cml0eUludGVyZmFjZSogc2VjdXJpdHlfaW50ZXJmYWNlXzsKLSAgY29uc3QgTGVTZWN1cml0eUludGVyZmFjZSogbGVfc2VjdXJpdHlfaW50ZXJmYWNlXzsKLSAgc3RkOjpsaXN0PEV2ZW50Vmlldz4gaW5jb21pbmdfZXZlbnRzXzsKLSAgc3RkOjpsaXN0PEFjbFZpZXc+IGluY29taW5nX2FjbF9wYWNrZXRzXzsKLSAgc3RkOjpsaXN0PElzb1ZpZXc+IGluY29taW5nX2lzb19wYWNrZXRzXzsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gZXZlbnRfcHJvbWlzZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+IGFjbF9wcm9taXNlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gaXNvX3Byb21pc2VfOwotICAvKiBUaGlzIG11dGV4IGlzIHByb3RlY3RpbmcgbGlzdHMgYWJvdmUgZnJvbSBiZWluZyBwdXNoZWQvcG9wcGVkIGZyb20gZGlmZmVyZW50IHRocmVhZHMgYXQgc2FtZSB0aW1lICovCi0gIHN0ZDo6bXV0ZXggbGlzdF9wcm90ZWN0b3JfOwotCi0gIHZvaWQgaGFuZGxlX2FjbCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsaXN0X3Byb3RlY3Rvcl8pOwotICAgIGF1dG8gYWNsX3B0ciA9IGhjaV8tPkdldEFjbFF1ZXVlRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBpbmNvbWluZ19hY2xfcGFja2V0c18ucHVzaF9iYWNrKCphY2xfcHRyKTsKLSAgICBpZiAoYWNsX3Byb21pc2VfICE9IG51bGxwdHIpIHsKLSAgICAgIGF1dG8gcHJvbWlzZSA9IHN0ZDo6bW92ZShhY2xfcHJvbWlzZV8pOwotICAgICAgYWNsX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdm9pZCBoYW5kbGVfZXZlbnQoVCBldmVudCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxpc3RfcHJvdGVjdG9yXyk7Ci0gICAgaW5jb21pbmdfZXZlbnRzXy5wdXNoX2JhY2soZXZlbnQpOwotICAgIGlmIChldmVudF9wcm9taXNlXyAhPSBudWxscHRyKSB7Ci0gICAgICBhdXRvIHByb21pc2UgPSBzdGQ6Om1vdmUoZXZlbnRfcHJvbWlzZV8pOwotICAgICAgZXZlbnRfcHJvbWlzZV8ucmVzZXQoKTsKLSAgICAgIHByb21pc2UtPnNldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgaGFuZGxlX2lzbygpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsaXN0X3Byb3RlY3Rvcl8pOwotICAgIGF1dG8gaXNvX3B0ciA9IGhjaV8tPkdldElzb1F1ZXVlRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBpbmNvbWluZ19pc29fcGFja2V0c18ucHVzaF9iYWNrKCppc29fcHRyKTsKLSAgICBpZiAoaXNvX3Byb21pc2VfICE9IG51bGxwdHIpIHsKLSAgICAgIGF1dG8gcHJvbWlzZSA9IHN0ZDo6bW92ZShpc29fcHJvbWlzZV8pOwotICAgICAgaXNvX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxBY2xCdWlsZGVyPj4gb3V0Z29pbmdfYWNsXzsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8QWNsQnVpbGRlcj4gaGFuZGxlX2VucXVldWUoKSB7Ci0gICAgaGNpXy0+R2V0QWNsUXVldWVFbmQoKS0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBhdXRvIGFjbCA9IHN0ZDo6bW92ZShvdXRnb2luZ19hY2xfLmZyb250KCkpOwotICAgIG91dGdvaW5nX2FjbF8ucG9wKCk7Ci0gICAgcmV0dXJuIGFjbDsKLSAgfQotCi0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPElzb0J1aWxkZXI+PiBvdXRnb2luZ19pc29fOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxJc29CdWlsZGVyPiBoYW5kbGVfZW5xdWV1ZV9pc28oKSB7Ci0gICAgaGNpXy0+R2V0SXNvUXVldWVFbmQoKS0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBhdXRvIGlzbyA9IHN0ZDo6bW92ZShvdXRnb2luZ19pc29fLmZyb250KCkpOwotICAgIG91dGdvaW5nX2lzb18ucG9wKCk7Ci0gICAgcmV0dXJuIGlzbzsKLSAgfQotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBEZXBlbmRzT25IY2k6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IERlcGVuZHNPbkhjaSgpOyB9KTsKLQotY2xhc3MgSGNpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBjb3VudGluZ19ieXRlcy5yZXNlcnZlKGNvdW50X3NpemUpOwotICAgIGNvdW50aW5nX2Rvd25fYnl0ZXMucmVzZXJ2ZShjb3VudF9zaXplKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X3NpemU7IGkrKykgewotICAgICAgY291bnRpbmdfYnl0ZXMucHVzaF9iYWNrKGkpOwotICAgICAgY291bnRpbmdfZG93bl9ieXRlcy5wdXNoX2JhY2sofmkpOwotICAgIH0KLSAgICBoYWwgPSBuZXcgVGVzdEhjaUhhbCgpOwotCi0gICAgYXV0byBjb21tYW5kX2Z1dHVyZSA9IGhhbC0+R2V0U2VudENvbW1hbmRGdXR1cmUoKTsKLQotICAgIGZha2VfcmVnaXN0cnlfLkluamVjdFRlc3RNb2R1bGUoJmhhbDo6SGNpSGFsOjpGYWN0b3J5LCBoYWwpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PERlcGVuZHNPbkhjaT4oJmZha2VfcmVnaXN0cnlfLkdldFRlc3RUaHJlYWQoKSk7Ci0gICAgaGNpID0gc3RhdGljX2Nhc3Q8SGNpTGF5ZXIqPihmYWtlX3JlZ2lzdHJ5Xy5HZXRNb2R1bGVVbmRlclRlc3QoJkhjaUxheWVyOjpGYWN0b3J5KSk7Ci0gICAgdXBwZXIgPSBzdGF0aWNfY2FzdDxEZXBlbmRzT25IY2kqPihmYWtlX3JlZ2lzdHJ5Xy5HZXRNb2R1bGVVbmRlclRlc3QoJkRlcGVuZHNPbkhjaTo6RmFjdG9yeSkpOwotICAgIEFTU0VSVF9UUlVFKGZha2VfcmVnaXN0cnlfLklzU3RhcnRlZDxIY2lMYXllcj4oKSk7Ci0KLSAgICBhdXRvIHJlc2V0X3NlbnRfc3RhdHVzID0gY29tbWFuZF9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICAgIEFTU0VSVF9FUShyZXNldF9zZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0KLSAgICAvLyBWZXJpZnkgdGhhdCByZXNldCB3YXMgcmVjZWl2ZWQKLSAgICBBU1NFUlRfRVEoMSwgaGFsLT5HZXROdW1TZW50Q29tbWFuZHMoKSk7Ci0KLSAgICBhdXRvIHNlbnRfY29tbWFuZCA9IGhhbC0+R2V0U2VudENvbW1hbmQoKTsKLSAgICBhdXRvIHJlc2V0X3ZpZXcgPSBSZXNldFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHNlbnRfY29tbWFuZCkpOwotICAgIEFTU0VSVF9UUlVFKHJlc2V0X3ZpZXcuSXNWYWxpZCgpKTsKLQotICAgIC8vIFZlcmlmeSB0aGF0IG9ubHkgb25lIHdhcyBzZW50Ci0gICAgQVNTRVJUX0VRKDAsIGhhbC0+R2V0TnVtU2VudENvbW1hbmRzKCkpOwotCi0gICAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgZXZlbnQKLSAgICB1aW50OF90IG51bV9wYWNrZXRzID0gMTsKLSAgICBFcnJvckNvZGUgZXJyb3JfY29kZSA9IEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgICBoYWwtPmNhbGxiYWNrcy0+aGNpRXZlbnRSZWNlaXZlZChHZXRQYWNrZXRCeXRlcyhSZXNldENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBlcnJvcl9jb2RlKSkpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZXRQYWNrZXRCeXRlcyhzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGFja2V0KSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7Ci0gICAgQml0SW5zZXJ0ZXIgaShieXRlcyk7Ci0gICAgYnl0ZXMucmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gICAgcGFja2V0LT5TZXJpYWxpemUoaSk7Ci0gICAgcmV0dXJuIGJ5dGVzOwotICB9Ci0KLSAgRGVwZW5kc09uSGNpKiB1cHBlciA9IG51bGxwdHI7Ci0gIFRlc3RIY2lIYWwqIGhhbCA9IG51bGxwdHI7Ci0gIEhjaUxheWVyKiBoY2kgPSBudWxscHRyOwotICBUZXN0TW9kdWxlUmVnaXN0cnkgZmFrZV9yZWdpc3RyeV87Ci19OwotCi1URVNUX0YoSGNpVGVzdCwgaW5pdEFuZENsb3NlKSB7fQotCi1URVNUX0YoSGNpVGVzdCwgbGVNZXRhRXZlbnQpIHsKLSAgYXV0byBldmVudF9mdXR1cmUgPSB1cHBlci0+R2V0UmVjZWl2ZWRFdmVudEZ1dHVyZSgpOwotCi0gIC8vIFNlbmQgYW4gTEUgZXZlbnQKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgdWludDE2X3QgaGFuZGxlID0gMHgxMjM7Ci0gIFJvbGUgcm9sZSA9IFJvbGU6OkNFTlRSQUw7Ci0gIEFkZHJlc3NUeXBlIHBlZXJfYWRkcmVzc190eXBlID0gQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLSAgQWRkcmVzcyBwZWVyX2FkZHJlc3MgPSBBZGRyZXNzOjprQW55OwotICB1aW50MTZfdCBjb25uX2ludGVydmFsID0gMHgwQUJDOwotICB1aW50MTZfdCBjb25uX2xhdGVuY3kgPSAweDAxMjM7Ci0gIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQgPSAweDBCMDU7Ci0gIENsb2NrQWNjdXJhY3kgY2VudHJhbF9jbG9ja19hY2N1cmFjeSA9IENsb2NrQWNjdXJhY3k6OlBQTV81MDsKLSAgaGFsLT5jYWxsYmFja3MtPmhjaUV2ZW50UmVjZWl2ZWQoR2V0UGFja2V0Qnl0ZXMoTGVDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsCi0gICAgICBoYW5kbGUsCi0gICAgICByb2xlLAotICAgICAgcGVlcl9hZGRyZXNzX3R5cGUsCi0gICAgICBwZWVyX2FkZHJlc3MsCi0gICAgICBjb25uX2ludGVydmFsLAotICAgICAgY29ubl9sYXRlbmN5LAotICAgICAgc3VwZXJ2aXNpb25fdGltZW91dCwKLSAgICAgIGNlbnRyYWxfY2xvY2tfYWNjdXJhY3kpKSk7Ci0KLSAgLy8gV2FpdCBmb3IgdGhlIGV2ZW50Ci0gIGF1dG8gZXZlbnRfc3RhdHVzID0gZXZlbnRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGV2ZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0KLSAgYXV0byBldmVudCA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50KCk7Ci0gIEFTU0VSVF9UUlVFKExlQ29ubmVjdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKExlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKEV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KSkpLklzVmFsaWQoKSk7Ci19Ci0KLVRFU1RfRihIY2lUZXN0LCBoY2lUaW1lT3V0KSB7Ci0gIGF1dG8gZXZlbnRfZnV0dXJlID0gdXBwZXItPkdldFJlY2VpdmVkRXZlbnRGdXR1cmUoKTsKLSAgYXV0byByZXNldF9jb21tYW5kX2Z1dHVyZSA9IGhhbC0+R2V0U2VudENvbW1hbmRGdXR1cmUoKTsKLSAgdXBwZXItPlNlbmRIY2lDb21tYW5kRXhwZWN0aW5nQ29tcGxldGUoUmVzZXRCdWlsZGVyOjpDcmVhdGUoKSk7Ci0gIGF1dG8gcmVzZXRfY29tbWFuZF9zZW50X3N0YXR1cyA9IHJlc2V0X2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKHJlc2V0X2NvbW1hbmRfc2VudF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBhdXRvIHJlc2V0ID0gaGFsLT5HZXRTZW50Q29tbWFuZCgpOwotICBBU1NFUlRfVFJVRShyZXNldC5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEocmVzZXQuR2V0T3BDb2RlKCksIE9wQ29kZTo6UkVTRVQpOwotCi0gIGF1dG8gZGVidWdfY29tbWFuZF9mdXR1cmUgPSBoYWwtPkdldFNlbnRDb21tYW5kRnV0dXJlKCk7Ci0gIGF1dG8gZXZlbnRfc3RhdHVzID0gZXZlbnRfZnV0dXJlLndhaXRfZm9yKEhjaUxheWVyOjprSGNpVGltZW91dE1zKTsKLSAgQVNTRVJUX05FKGV2ZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIGF1dG8gZGVidWdfY29tbWFuZF9zZW50X3N0YXR1cyA9IGRlYnVnX2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGRlYnVnX2NvbW1hbmRfc2VudF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBhdXRvIGRlYnVnID0gaGFsLT5HZXRTZW50Q29tbWFuZCgpOwotICBBU1NFUlRfVFJVRShkZWJ1Zy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoZGVidWcuR2V0T3BDb2RlKCksIE9wQ29kZTo6Q09OVFJPTExFUl9ERUJVR19JTkZPKTsKLX0KLQotVEVTVF9GKEhjaVRlc3QsIG5vT3BDcmVkaXRzKSB7Ci0gIEFTU0VSVF9FUSgwLCBoYWwtPkdldE51bVNlbnRDb21tYW5kcygpKTsKLQotICAvLyBTZW5kIDAgY3JlZGl0cwotICB1aW50OF90IG51bV9wYWNrZXRzID0gMDsKLSAgaGFsLT5jYWxsYmFja3MtPmhjaUV2ZW50UmVjZWl2ZWQoR2V0UGFja2V0Qnl0ZXMoTm9Db21tYW5kQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMpKSk7Ci0KLSAgYXV0byBjb21tYW5kX2Z1dHVyZSA9IGhhbC0+R2V0U2VudENvbW1hbmRGdXR1cmUoKTsKLSAgdXBwZXItPlNlbmRIY2lDb21tYW5kRXhwZWN0aW5nQ29tcGxldGUoUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQnVpbGRlcjo6Q3JlYXRlKCkpOwotCi0gIC8vIFZlcmlmeSB0aGF0IG5vdGhpbmcgd2FzIHNlbnQKLSAgQVNTRVJUX0VRKDAsIGhhbC0+R2V0TnVtU2VudENvbW1hbmRzKCkpOwotCi0gIG51bV9wYWNrZXRzID0gMTsKLSAgaGFsLT5jYWxsYmFja3MtPmhjaUV2ZW50UmVjZWl2ZWQoR2V0UGFja2V0Qnl0ZXMoTm9Db21tYW5kQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMpKSk7Ci0KLSAgYXV0byBjb21tYW5kX3NlbnRfc3RhdHVzID0gY29tbWFuZF9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICBBU1NFUlRfRVEoY29tbWFuZF9zZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgb25lIHdhcyBzZW50Ci0gIEFTU0VSVF9FUSgxLCBoYWwtPkdldE51bVNlbnRDb21tYW5kcygpKTsKLQotICBhdXRvIGV2ZW50X2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50RnV0dXJlKCk7Ci0KLSAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgZXZlbnQKLSAgRXJyb3JDb2RlIGVycm9yX2NvZGUgPSBFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIExvY2FsVmVyc2lvbkluZm9ybWF0aW9uIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb247Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24uaGNpX3ZlcnNpb25fID0gSGNpVmVyc2lvbjo6Vl81XzA7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24uaGNpX3JldmlzaW9uXyA9IDB4MTIzNDsKLSAgbG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbi5sbXBfdmVyc2lvbl8gPSBMbXBWZXJzaW9uOjpWXzRfMjsKLSAgbG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbi5tYW51ZmFjdHVyZXJfbmFtZV8gPSAweEJBRDsKLSAgbG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbi5sbXBfc3VidmVyc2lvbl8gPSAweDU2Nzg7Ci0gIGhhbC0+Y2FsbGJhY2tzLT5oY2lFdmVudFJlY2VpdmVkKEdldFBhY2tldEJ5dGVzKAotICAgICAgUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIGVycm9yX2NvZGUsIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24pKSk7Ci0KLSAgLy8gV2FpdCBmb3IgdGhlIGV2ZW50Ci0gIGF1dG8gZXZlbnRfc3RhdHVzID0gZXZlbnRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGV2ZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0KLSAgYXV0byBldmVudCA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50KCk7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGVWaWV3OjpDcmVhdGUoQ29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKEV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KSkpLklzVmFsaWQoKSk7Ci19Ci0KLVRFU1RfRihIY2lUZXN0LCBjcmVkaXRzVGVzdCkgewotICBBU1NFUlRfRVEoMCwgaGFsLT5HZXROdW1TZW50Q29tbWFuZHMoKSk7Ci0KLSAgYXV0byBjb21tYW5kX2Z1dHVyZSA9IGhhbC0+R2V0U2VudENvbW1hbmRGdXR1cmUoKTsKLQotICAvLyBTZW5kIGFsbCB0aHJlZSBjb21tYW5kcwotICB1cHBlci0+U2VuZEhjaUNvbW1hbmRFeHBlY3RpbmdDb21wbGV0ZShSZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb25CdWlsZGVyOjpDcmVhdGUoKSk7Ci0gIHVwcGVyLT5TZW5kSGNpQ29tbWFuZEV4cGVjdGluZ0NvbXBsZXRlKFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzQnVpbGRlcjo6Q3JlYXRlKCkpOwotICB1cHBlci0+U2VuZEhjaUNvbW1hbmRFeHBlY3RpbmdDb21wbGV0ZShSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZSgpKTsKLQotICBhdXRvIGNvbW1hbmRfc2VudF9zdGF0dXMgPSBjb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3NlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgZmlyc3Qgb25lIGlzIHNlbnQKLSAgQVNTRVJUX0VRKDEsIGhhbC0+R2V0TnVtU2VudENvbW1hbmRzKCkpOwotCi0gIGF1dG8gc2VudF9jb21tYW5kID0gaGFsLT5HZXRTZW50Q29tbWFuZCgpOwotICBhdXRvIHZlcnNpb25fdmlldyA9IFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvblZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHNlbnRfY29tbWFuZCkpOwotICBBU1NFUlRfVFJVRSh2ZXJzaW9uX3ZpZXcuSXNWYWxpZCgpKTsKLQotICAvLyBWZXJpZnkgdGhhdCBvbmx5IG9uZSB3YXMgc2VudAotICBBU1NFUlRfRVEoMCwgaGFsLT5HZXROdW1TZW50Q29tbWFuZHMoKSk7Ci0KLSAgLy8gR2V0IGEgbmV3IGZ1dHVyZQotICBhdXRvIGV2ZW50X2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50RnV0dXJlKCk7Ci0KLSAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgZXZlbnQKLSAgdWludDhfdCBudW1fcGFja2V0cyA9IDE7Ci0gIEVycm9yQ29kZSBlcnJvcl9jb2RlID0gRXJyb3JDb2RlOjpTVUNDRVNTOwotICBMb2NhbFZlcnNpb25JbmZvcm1hdGlvbiBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uOwotICBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLmhjaV92ZXJzaW9uXyA9IEhjaVZlcnNpb246OlZfNV8wOwotICBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLmhjaV9yZXZpc2lvbl8gPSAweDEyMzQ7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3ZlcnNpb25fID0gTG1wVmVyc2lvbjo6Vl80XzI7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubWFudWZhY3R1cmVyX25hbWVfID0gMHhCQUQ7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3N1YnZlcnNpb25fID0gMHg1Njc4OwotICBoYWwtPmNhbGxiYWNrcy0+aGNpRXZlbnRSZWNlaXZlZChHZXRQYWNrZXRCeXRlcygKLSAgICAgIFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBlcnJvcl9jb2RlLCBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uKSkpOwotCi0gIC8vIFdhaXQgZm9yIHRoZSBldmVudAotICBhdXRvIGV2ZW50X3N0YXR1cyA9IGV2ZW50X2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShldmVudF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotCi0gIGF1dG8gZXZlbnQgPSB1cHBlci0+R2V0UmVjZWl2ZWRFdmVudCgpOwotICBBU1NFUlRfVFJVRSgKLSAgICAgIFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKENvbW1hbmRDb21wbGV0ZVZpZXc6OkNyZWF0ZShFdmVudFZpZXc6OkNyZWF0ZShldmVudCkpKS5Jc1ZhbGlkKCkpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgb25lIGlzIHNlbnQKLSAgY29tbWFuZF9zZW50X3N0YXR1cyA9IGNvbW1hbmRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGNvbW1hbmRfc2VudF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBBU1NFUlRfRVEoMSwgaGFsLT5HZXROdW1TZW50Q29tbWFuZHMoKSk7Ci0KLSAgc2VudF9jb21tYW5kID0gaGFsLT5HZXRTZW50Q29tbWFuZCgpOwotICBhdXRvIHN1cHBvcnRlZF9jb21tYW5kc192aWV3ID0gUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHNWaWV3OjpDcmVhdGUoQ29tbWFuZFZpZXc6OkNyZWF0ZShzZW50X2NvbW1hbmQpKTsKLSAgQVNTRVJUX1RSVUUoc3VwcG9ydGVkX2NvbW1hbmRzX3ZpZXcuSXNWYWxpZCgpKTsKLQotICAvLyBWZXJpZnkgdGhhdCBvbmx5IG9uZSB3YXMgc2VudAotICBBU1NFUlRfRVEoMCwgaGFsLT5HZXROdW1TZW50Q29tbWFuZHMoKSk7Ci0gIGV2ZW50X2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50RnV0dXJlKCk7Ci0gIGNvbW1hbmRfZnV0dXJlID0gaGFsLT5HZXRTZW50Q29tbWFuZEZ1dHVyZSgpOwotCi0gIC8vIFNlbmQgdGhlIHJlc3BvbnNlIGV2ZW50Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgNjQ+IHN1cHBvcnRlZF9jb21tYW5kczsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgIHN1cHBvcnRlZF9jb21tYW5kc1tpXSA9IGk7Ci0gIH0KLSAgaGFsLT5jYWxsYmFja3MtPmhjaUV2ZW50UmVjZWl2ZWQoCi0gICAgICBHZXRQYWNrZXRCeXRlcyhSZWFkTG9jYWxTdXBwb3J0ZWRDb21tYW5kc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKG51bV9wYWNrZXRzLCBlcnJvcl9jb2RlLCBzdXBwb3J0ZWRfY29tbWFuZHMpKSk7Ci0gIC8vIFdhaXQgZm9yIHRoZSBldmVudAotICBldmVudF9zdGF0dXMgPSBldmVudF9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICBBU1NFUlRfRVEoZXZlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICBldmVudCA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50KCk7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHNDb21wbGV0ZVZpZXc6OkNyZWF0ZShDb21tYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoRXZlbnRWaWV3OjpDcmVhdGUoZXZlbnQpKSkuSXNWYWxpZCgpKTsKLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHRoaXJkIG9uZSBpcyBzZW50Ci0gIGNvbW1hbmRfc2VudF9zdGF0dXMgPSBjb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3NlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgQVNTRVJUX0VRKDEsIGhhbC0+R2V0TnVtU2VudENvbW1hbmRzKCkpOwotCi0gIHNlbnRfY29tbWFuZCA9IGhhbC0+R2V0U2VudENvbW1hbmQoKTsKLSAgYXV0byBzdXBwb3J0ZWRfZmVhdHVyZXNfdmlldyA9IFJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUoc2VudF9jb21tYW5kKSk7Ci0gIEFTU0VSVF9UUlVFKHN1cHBvcnRlZF9mZWF0dXJlc192aWV3LklzVmFsaWQoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgb25seSBvbmUgd2FzIHNlbnQKLSAgQVNTRVJUX0VRKDAsIGhhbC0+R2V0TnVtU2VudENvbW1hbmRzKCkpOwotICBldmVudF9mdXR1cmUgPSB1cHBlci0+R2V0UmVjZWl2ZWRFdmVudEZ1dHVyZSgpOwotCi0gIC8vIFNlbmQgdGhlIHJlc3BvbnNlIGV2ZW50Ci0gIHVpbnQ2NF90IGxtcF9mZWF0dXJlcyA9IDB4MDEyMzQ1Njc4YWJjZGVmOwotICBoYWwtPmNhbGxiYWNrcy0+aGNpRXZlbnRSZWNlaXZlZCgKLSAgICAgIEdldFBhY2tldEJ5dGVzKFJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUobnVtX3BhY2tldHMsIGVycm9yX2NvZGUsIGxtcF9mZWF0dXJlcykpKTsKLQotICAvLyBXYWl0IGZvciB0aGUgZXZlbnQKLSAgZXZlbnRfc3RhdHVzID0gZXZlbnRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGV2ZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIGV2ZW50ID0gdXBwZXItPkdldFJlY2VpdmVkRXZlbnQoKTsKLSAgQVNTRVJUX1RSVUUoCi0gICAgICBSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlVmlldzo6Q3JlYXRlKENvbW1hbmRDb21wbGV0ZVZpZXc6OkNyZWF0ZShFdmVudFZpZXc6OkNyZWF0ZShldmVudCkpKS5Jc1ZhbGlkKCkpOwotfQotCi1URVNUX0YoSGNpVGVzdCwgbGVTZWN1cml0eUludGVyZmFjZVRlc3QpIHsKLSAgLy8gU2VuZCBMZVJhbmQgdG8gdGhlIGNvbnRyb2xsZXIKLSAgYXV0byBjb21tYW5kX2Z1dHVyZSA9IGhhbC0+R2V0U2VudENvbW1hbmRGdXR1cmUoKTsKLSAgdXBwZXItPlNlbmRMZVNlY3VyaXR5Q29tbWFuZEV4cGVjdGluZ0NvbXBsZXRlKExlUmFuZEJ1aWxkZXI6OkNyZWF0ZSgpKTsKLQotICBhdXRvIGNvbW1hbmRfc2VudF9zdGF0dXMgPSBjb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3NlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICAvLyBDaGVjayB0aGUgY29tbWFuZAotICBhdXRvIHNlbnRfY29tbWFuZCA9IGhhbC0+R2V0U2VudENvbW1hbmQoKTsKLSAgQVNTRVJUX0xUKDAsIHNlbnRfY29tbWFuZC5zaXplKCkpOwotICBMZVJhbmRWaWV3IHZpZXcgPSBMZVJhbmRWaWV3OjpDcmVhdGUoTGVTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoQ29tbWFuZFZpZXc6OkNyZWF0ZShzZW50X2NvbW1hbmQpKSk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLQotICAvLyBTZW5kIGEgQ29tbWFuZCBDb21wbGV0ZSB0byB0aGUgaG9zdAotICBhdXRvIGV2ZW50X2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50RnV0dXJlKCk7Ci0gIHVpbnQ4X3QgbnVtX3BhY2tldHMgPSAxOwotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpTVUNDRVNTOwotICB1aW50NjRfdCByYW5kID0gMHgwMTIzNDU2Nzg5YWJjZGVmOwotICBoYWwtPmNhbGxiYWNrcy0+aGNpRXZlbnRSZWNlaXZlZChHZXRQYWNrZXRCeXRlcyhMZVJhbmRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgc3RhdHVzLCByYW5kKSkpOwotCi0gIC8vIFZlcmlmeSB0aGUgZXZlbnQKLSAgYXV0byBldmVudF9zdGF0dXMgPSBldmVudF9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICBBU1NFUlRfRVEoZXZlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgYXV0byBldmVudCA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50KCk7Ci0gIEFTU0VSVF9UUlVFKGV2ZW50LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShFdmVudENvZGU6OkNPTU1BTkRfQ09NUExFVEUsIGV2ZW50LkdldEV2ZW50Q29kZSgpKTsKLSAgQVNTRVJUX1RSVUUoTGVSYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoQ29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KSkuSXNWYWxpZCgpKTsKLX0KLQotVEVTVF9GKEhjaVRlc3QsIHNlY3VyaXR5SW50ZXJmYWNlc1Rlc3QpIHsKLSAgLy8gU2VuZCBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlIHRvIHRoZSBjb250cm9sbGVyCi0gIGF1dG8gY29tbWFuZF9mdXR1cmUgPSBoYWwtPkdldFNlbnRDb21tYW5kRnV0dXJlKCk7Ci0gIEVuYWJsZSBlbmFibGUgPSBFbmFibGU6OkVOQUJMRUQ7Ci0gIHVwcGVyLT5TZW5kU2VjdXJpdHlDb21tYW5kRXhwZWN0aW5nQ29tcGxldGUoV3JpdGVTaW1wbGVQYWlyaW5nTW9kZUJ1aWxkZXI6OkNyZWF0ZShlbmFibGUpKTsKLQotICBhdXRvIGNvbW1hbmRfc2VudF9zdGF0dXMgPSBjb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3NlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICAvLyBDaGVjayB0aGUgY29tbWFuZAotICBhdXRvIHNlbnRfY29tbWFuZCA9IGhhbC0+R2V0U2VudENvbW1hbmQoKTsKLSAgQVNTRVJUX0xUKDAsIHNlbnRfY29tbWFuZC5zaXplKCkpOwotICBhdXRvIHZpZXcgPSBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlVmlldzo6Q3JlYXRlKFNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHNlbnRfY29tbWFuZCkpKTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotCi0gIC8vIFNlbmQgYSBDb21tYW5kIENvbXBsZXRlIHRvIHRoZSBob3N0Ci0gIGF1dG8gZXZlbnRfZnV0dXJlID0gdXBwZXItPkdldFJlY2VpdmVkRXZlbnRGdXR1cmUoKTsKLSAgdWludDhfdCBudW1fcGFja2V0cyA9IDE7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGhhbC0+Y2FsbGJhY2tzLT5oY2lFdmVudFJlY2VpdmVkKEdldFBhY2tldEJ5dGVzKFdyaXRlU2ltcGxlUGFpcmluZ01vZGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShudW1fcGFja2V0cywgc3RhdHVzKSkpOwotCi0gIC8vIFZlcmlmeSB0aGUgZXZlbnQKLSAgYXV0byBldmVudF9zdGF0dXMgPSBldmVudF9mdXR1cmUud2FpdF9mb3Ioa1RpbWVvdXQpOwotICBBU1NFUlRfRVEoZXZlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgYXV0byBldmVudCA9IHVwcGVyLT5HZXRSZWNlaXZlZEV2ZW50KCk7Ci0gIEFTU0VSVF9UUlVFKGV2ZW50LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShFdmVudENvZGU6OkNPTU1BTkRfQ09NUExFVEUsIGV2ZW50LkdldEV2ZW50Q29kZSgpKTsKLSAgQVNTRVJUX1RSVUUoV3JpdGVTaW1wbGVQYWlyaW5nTW9kZUNvbXBsZXRlVmlldzo6Q3JlYXRlKENvbW1hbmRDb21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCkpLklzVmFsaWQoKSk7Ci19Ci0KLVRFU1RfRihIY2lUZXN0LCBjcmVhdGVDb25uZWN0aW9uVGVzdCkgewotICAvLyBTZW5kIENyZWF0ZUNvbm5lY3Rpb24gdG8gdGhlIGNvbnRyb2xsZXIKLSAgYXV0byBjb21tYW5kX2Z1dHVyZSA9IGhhbC0+R2V0U2VudENvbW1hbmRGdXR1cmUoKTsKLSAgQWRkcmVzcyBiZF9hZGRyOwotICBBU1NFUlRfVFJVRShBZGRyZXNzOjpGcm9tU3RyaW5nKCJBMTpBMjpBMzpBNDpBNTpBNiIsIGJkX2FkZHIpKTsKLSAgdWludDE2X3QgcGFja2V0X3R5cGUgPSAweDEyMzQ7Ci0gIFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSA9IFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGU6OlIwOwotICB1aW50MTZfdCBjbG9ja19vZmZzZXQgPSAweDM0NTY7Ci0gIENsb2NrT2Zmc2V0VmFsaWQgY2xvY2tfb2Zmc2V0X3ZhbGlkID0gQ2xvY2tPZmZzZXRWYWxpZDo6VkFMSUQ7Ci0gIENyZWF0ZUNvbm5lY3Rpb25Sb2xlU3dpdGNoIGFsbG93X3JvbGVfc3dpdGNoID0gQ3JlYXRlQ29ubmVjdGlvblJvbGVTd2l0Y2g6OkFMTE9XX1JPTEVfU1dJVENIOwotICB1cHBlci0+U2VuZEhjaUNvbW1hbmRFeHBlY3RpbmdTdGF0dXMoQ3JlYXRlQ29ubmVjdGlvbkJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGJkX2FkZHIsIHBhY2tldF90eXBlLCBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlLCBjbG9ja19vZmZzZXQsIGNsb2NrX29mZnNldF92YWxpZCwgYWxsb3dfcm9sZV9zd2l0Y2gpKTsKLQotICBhdXRvIGNvbW1hbmRfc2VudF9zdGF0dXMgPSBjb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihrVGltZW91dCk7Ci0gIEFTU0VSVF9FUShjb21tYW5kX3NlbnRfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLQotICAvLyBDaGVjayB0aGUgY29tbWFuZAotICBhdXRvIHNlbnRfY29tbWFuZCA9IGhhbC0+R2V0U2VudENvbW1hbmQoKTsKLSAgQVNTRVJUX0xUKDAsIHNlbnRfY29tbWFuZC5zaXplKCkpOwotICBDcmVhdGVDb25uZWN0aW9uVmlldyB2aWV3ID0gQ3JlYXRlQ29ubmVjdGlvblZpZXc6OkNyZWF0ZSgKLSAgICAgIENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUoc2VudF9jb21tYW5kKSkpKTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoYmRfYWRkciwgdmlldy5HZXRCZEFkZHIoKSk7Ci0gIEFTU0VSVF9FUShwYWNrZXRfdHlwZSwgdmlldy5HZXRQYWNrZXRUeXBlKCkpOwotICBBU1NFUlRfRVEocGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSwgdmlldy5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCkpOwotICBBU1NFUlRfRVEoY2xvY2tfb2Zmc2V0LCB2aWV3LkdldENsb2NrT2Zmc2V0KCkpOwotICBBU1NFUlRfRVEoY2xvY2tfb2Zmc2V0X3ZhbGlkLCB2aWV3LkdldENsb2NrT2Zmc2V0VmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShhbGxvd19yb2xlX3N3aXRjaCwgdmlldy5HZXRBbGxvd1JvbGVTd2l0Y2goKSk7Ci0KLSAgLy8gU2VuZCBhIENvbW1hbmQgU3RhdHVzIHRvIHRoZSBob3N0Ci0gIGF1dG8gZXZlbnRfZnV0dXJlID0gdXBwZXItPkdldFJlY2VpdmVkRXZlbnRGdXR1cmUoKTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgdWludDE2X3QgaGFuZGxlID0gMHgxMjM7Ci0gIExpbmtUeXBlIGxpbmtfdHlwZSA9IExpbmtUeXBlOjpBQ0w7Ci0gIEVuYWJsZSBlbmNyeXB0aW9uX2VuYWJsZWQgPSBFbmFibGU6OkRJU0FCTEVEOwotICBoYWwtPmNhbGxiYWNrcy0+aGNpRXZlbnRSZWNlaXZlZChHZXRQYWNrZXRCeXRlcyhDcmVhdGVDb25uZWN0aW9uU3RhdHVzQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgMSkpKTsKLQotICAvLyBWZXJpZnkgdGhlIGV2ZW50Ci0gIGF1dG8gZXZlbnRfc3RhdHVzID0gZXZlbnRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGV2ZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIGF1dG8gZXZlbnQgPSB1cHBlci0+R2V0UmVjZWl2ZWRFdmVudCgpOwotICBBU1NFUlRfVFJVRShldmVudC5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoRXZlbnRDb2RlOjpDT01NQU5EX1NUQVRVUywgZXZlbnQuR2V0RXZlbnRDb2RlKCkpOwotCi0gIC8vIFNlbmQgYSBDb25uZWN0aW9uQ29tcGxldGUgdG8gdGhlIGhvc3QKLSAgZXZlbnRfZnV0dXJlID0gdXBwZXItPkdldFJlY2VpdmVkRXZlbnRGdXR1cmUoKTsKLSAgaGFsLT5jYWxsYmFja3MtPmhjaUV2ZW50UmVjZWl2ZWQoCi0gICAgICBHZXRQYWNrZXRCeXRlcyhDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoc3RhdHVzLCBoYW5kbGUsIGJkX2FkZHIsIGxpbmtfdHlwZSwgZW5jcnlwdGlvbl9lbmFibGVkKSkpOwotCi0gIC8vIFZlcmlmeSB0aGUgZXZlbnQKLSAgZXZlbnRfc3RhdHVzID0gZXZlbnRfZnV0dXJlLndhaXRfZm9yKGtUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGV2ZW50X3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIGV2ZW50ID0gdXBwZXItPkdldFJlY2VpdmVkRXZlbnQoKTsKLSAgQVNTRVJUX1RSVUUoZXZlbnQuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKEV2ZW50Q29kZTo6Q09OTkVDVElPTl9DT01QTEVURSwgZXZlbnQuR2V0RXZlbnRDb2RlKCkpOwotICBDb25uZWN0aW9uQ29tcGxldGVWaWV3IGNvbm5lY3Rpb25fY29tcGxldGVfdmlldyA9IENvbm5lY3Rpb25Db21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCk7Ci0gIEFTU0VSVF9UUlVFKGNvbm5lY3Rpb25fY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoc3RhdHVzLCBjb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpOwotICBBU1NFUlRfRVEoaGFuZGxlLCBjb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpKTsKLSAgQVNTRVJUX0VRKGxpbmtfdHlwZSwgY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LkdldExpbmtUeXBlKCkpOwotICBBU1NFUlRfRVEoZW5jcnlwdGlvbl9lbmFibGVkLCBjb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0RW5jcnlwdGlvbkVuYWJsZWQoKSk7Ci0KLSAgLy8gU2VuZCBhbiBBQ0wgcGFja2V0IGZyb20gdGhlIHJlbW90ZQotICBQYWNrZXRCb3VuZGFyeUZsYWcgcGFja2V0X2JvdW5kYXJ5X2ZsYWcgPSBQYWNrZXRCb3VuZGFyeUZsYWc6OkZJUlNUX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFOwotICBCcm9hZGNhc3RGbGFnIGJyb2FkY2FzdF9mbGFnID0gQnJvYWRjYXN0RmxhZzo6UE9JTlRfVE9fUE9JTlQ7Ci0gIGF1dG8gYWNsX3BheWxvYWQgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KCk7Ci0gIGFjbF9wYXlsb2FkLT5BZGRBZGRyZXNzKGJkX2FkZHIpOwotICBhY2xfcGF5bG9hZC0+QWRkT2N0ZXRzMihoYW5kbGUpOwotICBhdXRvIGluY29taW5nX2FjbF9mdXR1cmUgPSB1cHBlci0+R2V0UmVjZWl2ZWRBY2xGdXR1cmUoKTsKLSAgaGFsLT5jYWxsYmFja3MtPmFjbERhdGFSZWNlaXZlZCgKLSAgICAgIEdldFBhY2tldEJ5dGVzKEFjbEJ1aWxkZXI6OkNyZWF0ZShoYW5kbGUsIHBhY2tldF9ib3VuZGFyeV9mbGFnLCBicm9hZGNhc3RfZmxhZywgc3RkOjptb3ZlKGFjbF9wYXlsb2FkKSkpKTsKLQotICAvLyBWZXJpZnkgdGhlIEFDTCBwYWNrZXQKLSAgYXV0byBpbmNvbWluZ19hY2xfc3RhdHVzID0gaW5jb21pbmdfYWNsX2Z1dHVyZS53YWl0X2ZvcihrQWNsVGltZW91dCk7Ci0gIEFTU0VSVF9FUShpbmNvbWluZ19hY2xfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgYXV0byBhY2xfdmlldyA9IHVwcGVyLT5HZXRSZWNlaXZlZEFjbCgpOwotICBBU1NFUlRfVFJVRShhY2xfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoYmRfYWRkci5sZW5ndGgoKSArIHNpemVvZihoYW5kbGUpLCBhY2xfdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpKTsKLSAgYXV0byBpdHIgPSBhY2xfdmlldy5HZXRQYXlsb2FkKCkuYmVnaW4oKTsKLSAgQVNTRVJUX0VRKGJkX2FkZHIsIGl0ci5leHRyYWN0PEFkZHJlc3M+KCkpOwotICBBU1NFUlRfRVEoaGFuZGxlLCBpdHIuZXh0cmFjdDx1aW50MTZfdD4oKSk7Ci0KLSAgLy8gU2VuZCBhbiBBQ0wgcGFja2V0IGZyb20gRGVwZW5kc09uSGNpCi0gIFBhY2tldEJvdW5kYXJ5RmxhZyBwYWNrZXRfYm91bmRhcnlfZmxhZzIgPSBQYWNrZXRCb3VuZGFyeUZsYWc6OkZJUlNUX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFOwotICBCcm9hZGNhc3RGbGFnIGJyb2FkY2FzdF9mbGFnMiA9IEJyb2FkY2FzdEZsYWc6OlBPSU5UX1RPX1BPSU5UOwotICBhdXRvIGFjbF9wYXlsb2FkMiA9IHN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4oKTsKLSAgYWNsX3BheWxvYWQyLT5BZGRPY3RldHMyKGhhbmRsZSk7Ci0gIGFjbF9wYXlsb2FkMi0+QWRkQWRkcmVzcyhiZF9hZGRyKTsKLSAgYXV0byBzZW50X2FjbF9mdXR1cmUgPSBoYWwtPkdldFNlbnRBY2xGdXR1cmUoKTsKLSAgdXBwZXItPlNlbmRBY2xEYXRhKEFjbEJ1aWxkZXI6OkNyZWF0ZShoYW5kbGUsIHBhY2tldF9ib3VuZGFyeV9mbGFnMiwgYnJvYWRjYXN0X2ZsYWcyLCBzdGQ6Om1vdmUoYWNsX3BheWxvYWQyKSkpOwotCi0gIC8vIFZlcmlmeSB0aGUgQUNMIHBhY2tldAotICBhdXRvIHNlbnRfYWNsX3N0YXR1cyA9IHNlbnRfYWNsX2Z1dHVyZS53YWl0X2ZvcihrQWNsVGltZW91dCk7Ci0gIEFTU0VSVF9FUShzZW50X2FjbF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBhdXRvIHNlbnRfYWNsID0gaGFsLT5HZXRTZW50QWNsKCk7Ci0gIEFTU0VSVF9MVCgwLCBzZW50X2FjbC5zaXplKCkpOwotICBBY2xWaWV3IHNlbnRfYWNsX3ZpZXcgPSBBY2xWaWV3OjpDcmVhdGUoc2VudF9hY2wpOwotICBBU1NFUlRfVFJVRShzZW50X2FjbF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShiZF9hZGRyLmxlbmd0aCgpICsgc2l6ZW9mKGhhbmRsZSksIHNlbnRfYWNsX3ZpZXcuR2V0UGF5bG9hZCgpLnNpemUoKSk7Ci0gIGF1dG8gc2VudF9pdHIgPSBzZW50X2FjbF92aWV3LkdldFBheWxvYWQoKS5iZWdpbigpOwotICBBU1NFUlRfRVEoaGFuZGxlLCBzZW50X2l0ci5leHRyYWN0PHVpbnQxNl90PigpKTsKLSAgQVNTRVJUX0VRKGJkX2FkZHIsIHNlbnRfaXRyLmV4dHJhY3Q8QWRkcmVzcz4oKSk7Ci19Ci0KLVRFU1RfRihIY2lUZXN0LCByZWNlaXZlTXVsdGlwbGVBY2xQYWNrZXRzKSB7Ci0gIEFkZHJlc3MgYmRfYWRkcjsKLSAgQVNTRVJUX1RSVUUoQWRkcmVzczo6RnJvbVN0cmluZygiQTE6QTI6QTM6QTQ6QTU6QTYiLCBiZF9hZGRyKSk7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDB4MDAwMTsKLSAgY29uc3QgdWludDE2X3QgbnVtX3BhY2tldHMgPSAxMDA7Ci0gIFBhY2tldEJvdW5kYXJ5RmxhZyBwYWNrZXRfYm91bmRhcnlfZmxhZyA9IFBhY2tldEJvdW5kYXJ5RmxhZzo6RklSU1RfQVVUT01BVElDQUxMWV9GTFVTSEFCTEU7Ci0gIEJyb2FkY2FzdEZsYWcgYnJvYWRjYXN0X2ZsYWcgPSBCcm9hZGNhc3RGbGFnOjpQT0lOVF9UT19QT0lOVDsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IG51bV9wYWNrZXRzOyBpKyspIHsKLSAgICBhdXRvIGFjbF9wYXlsb2FkID0gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPigpOwotICAgIGFjbF9wYXlsb2FkLT5BZGRBZGRyZXNzKGJkX2FkZHIpOwotICAgIGFjbF9wYXlsb2FkLT5BZGRPY3RldHMyKGhhbmRsZSk7Ci0gICAgYWNsX3BheWxvYWQtPkFkZE9jdGV0czIoaSk7Ci0gICAgaGFsLT5jYWxsYmFja3MtPmFjbERhdGFSZWNlaXZlZCgKLSAgICAgICAgR2V0UGFja2V0Qnl0ZXMoQWNsQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZSwgcGFja2V0X2JvdW5kYXJ5X2ZsYWcsIGJyb2FkY2FzdF9mbGFnLCBzdGQ6Om1vdmUoYWNsX3BheWxvYWQpKSkpOwotICB9Ci0gIGF1dG8gaW5jb21pbmdfYWNsX2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEFjbEZ1dHVyZSgpOwotICB1aW50MTZfdCByZWNlaXZlZF9wYWNrZXRzID0gMDsKLSAgd2hpbGUgKHJlY2VpdmVkX3BhY2tldHMgPCBudW1fcGFja2V0cyAtIDEpIHsKLSAgICBzaXplX3QgbnVtX3Jjdl9wYWNrZXRzID0gdXBwZXItPkdldE51bVJlY2VpdmVkQWNsUGFja2V0cygpOwotICAgIGlmIChudW1fcmN2X3BhY2tldHMgPT0gMCkgewotICAgICAgYXV0byBpbmNvbWluZ19hY2xfc3RhdHVzID0gaW5jb21pbmdfYWNsX2Z1dHVyZS53YWl0X2ZvcihrQWNsVGltZW91dCk7Ci0gICAgICAvLyBHZXQgdGhlIG5leHQgZnV0dXJlLgotICAgICAgQVNTRVJUX0VRKGluY29taW5nX2FjbF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICAgICAgaW5jb21pbmdfYWNsX2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEFjbEZ1dHVyZSgpOwotICAgICAgbnVtX3Jjdl9wYWNrZXRzID0gdXBwZXItPkdldE51bVJlY2VpdmVkQWNsUGFja2V0cygpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9yY3ZfcGFja2V0czsgaSsrKSB7Ci0gICAgICBhdXRvIGFjbF92aWV3ID0gdXBwZXItPkdldFJlY2VpdmVkQWNsKCk7Ci0gICAgICBBU1NFUlRfVFJVRShhY2xfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUX0VRKGJkX2FkZHIubGVuZ3RoKCkgKyBzaXplb2YoaGFuZGxlKSArIHNpemVvZihyZWNlaXZlZF9wYWNrZXRzKSwgYWNsX3ZpZXcuR2V0UGF5bG9hZCgpLnNpemUoKSk7Ci0gICAgICBhdXRvIGl0ciA9IGFjbF92aWV3LkdldFBheWxvYWQoKS5iZWdpbigpOwotICAgICAgQVNTRVJUX0VRKGJkX2FkZHIsIGl0ci5leHRyYWN0PEFkZHJlc3M+KCkpOwotICAgICAgQVNTRVJUX0VRKGhhbmRsZSwgaXRyLmV4dHJhY3Q8dWludDE2X3Q+KCkpOwotICAgICAgQVNTRVJUX0VRKHJlY2VpdmVkX3BhY2tldHMsIGl0ci5leHRyYWN0PHVpbnQxNl90PigpKTsKLSAgICAgIHJlY2VpdmVkX3BhY2tldHMgKz0gMTsKLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmdXR1cmUgd2FzIGFscmVhZHkgZnVsZmlsbGVkLgotICBhdXRvIGFjbF9yYWNlX3N0YXR1cyA9IGluY29taW5nX2FjbF9mdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKSk7Ci0gIGlmIChhY2xfcmFjZV9zdGF0dXMgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgewotICAgIC8vIEdldCB0aGUgbmV4dCBmdXR1cmUuCi0gICAgaW5jb21pbmdfYWNsX2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZEFjbEZ1dHVyZSgpOwotICB9Ci0KLSAgLy8gT25lIGxhc3QgcGFja2V0IHRvIG1ha2Ugc3VyZSB0aGV5IHdlcmUgYWxsIHNlbnQuICBBbHJlYWR5IGdvdCB0aGUgZnV0dXJlLgotICBhdXRvIGFjbF9wYXlsb2FkID0gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPigpOwotICBhY2xfcGF5bG9hZC0+QWRkQWRkcmVzcyhiZF9hZGRyKTsKLSAgYWNsX3BheWxvYWQtPkFkZE9jdGV0czIoaGFuZGxlKTsKLSAgYWNsX3BheWxvYWQtPkFkZE9jdGV0czIobnVtX3BhY2tldHMpOwotICBoYWwtPmNhbGxiYWNrcy0+YWNsRGF0YVJlY2VpdmVkKAotICAgICAgR2V0UGFja2V0Qnl0ZXMoQWNsQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZSwgcGFja2V0X2JvdW5kYXJ5X2ZsYWcsIGJyb2FkY2FzdF9mbGFnLCBzdGQ6Om1vdmUoYWNsX3BheWxvYWQpKSkpOwotICBhdXRvIGluY29taW5nX2FjbF9zdGF0dXMgPSBpbmNvbWluZ19hY2xfZnV0dXJlLndhaXRfZm9yKGtBY2xUaW1lb3V0KTsKLSAgQVNTRVJUX0VRKGluY29taW5nX2FjbF9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBhdXRvIGFjbF92aWV3ID0gdXBwZXItPkdldFJlY2VpdmVkQWNsKCk7Ci0gIEFTU0VSVF9UUlVFKGFjbF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShiZF9hZGRyLmxlbmd0aCgpICsgc2l6ZW9mKGhhbmRsZSkgKyBzaXplb2YocmVjZWl2ZWRfcGFja2V0cyksIGFjbF92aWV3LkdldFBheWxvYWQoKS5zaXplKCkpOwotICBhdXRvIGl0ciA9IGFjbF92aWV3LkdldFBheWxvYWQoKS5iZWdpbigpOwotICBBU1NFUlRfRVEoYmRfYWRkciwgaXRyLmV4dHJhY3Q8QWRkcmVzcz4oKSk7Ci0gIEFTU0VSVF9FUShoYW5kbGUsIGl0ci5leHRyYWN0PHVpbnQxNl90PigpKTsKLSAgQVNTRVJUX0VRKHJlY2VpdmVkX3BhY2tldHMsIGl0ci5leHRyYWN0PHVpbnQxNl90PigpKTsKLX0KLQotVEVTVF9GKEhjaVRlc3QsIHJlY2VpdmVNdWx0aXBsZUlzb1BhY2tldHMpIHsKLSAgdWludDE2X3QgaGFuZGxlID0gMHgwMDAxOwotICBjb25zdCB1aW50MTZfdCBudW1fcGFja2V0cyA9IDEwMDsKLSAgSXNvUGFja2V0Qm91bmRhcnlGbGFnIHBhY2tldF9ib3VuZGFyeV9mbGFnID0gSXNvUGFja2V0Qm91bmRhcnlGbGFnOjpDT01QTEVURV9TRFU7Ci0gIFRpbWVTdGFtcEZsYWcgdGltZXN0YW1wX2ZsYWcgPSBUaW1lU3RhbXBGbGFnOjpOT1RfUFJFU0VOVDsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IG51bV9wYWNrZXRzOyBpKyspIHsKLSAgICBhdXRvIGlzb19wYXlsb2FkID0gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPigpOwotICAgIGlzb19wYXlsb2FkLT5BZGRPY3RldHMyKGhhbmRsZSk7Ci0gICAgaXNvX3BheWxvYWQtPkFkZE9jdGV0czIoaSk7Ci0gICAgaGFsLT5jYWxsYmFja3MtPmlzb0RhdGFSZWNlaXZlZCgKLSAgICAgICAgR2V0UGFja2V0Qnl0ZXMoSXNvQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZSwgcGFja2V0X2JvdW5kYXJ5X2ZsYWcsIHRpbWVzdGFtcF9mbGFnLCBzdGQ6Om1vdmUoaXNvX3BheWxvYWQpKSkpOwotICB9Ci0gIGF1dG8gaW5jb21pbmdfaXNvX2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZElzb0Z1dHVyZSgpOwotICB1aW50MTZfdCByZWNlaXZlZF9wYWNrZXRzID0gMDsKLSAgd2hpbGUgKHJlY2VpdmVkX3BhY2tldHMgPCBudW1fcGFja2V0cyAtIDEpIHsKLSAgICBzaXplX3QgbnVtX3Jjdl9wYWNrZXRzID0gdXBwZXItPkdldE51bVJlY2VpdmVkSXNvUGFja2V0cygpOwotICAgIGlmIChudW1fcmN2X3BhY2tldHMgPT0gMCkgewotICAgICAgYXV0byBpbmNvbWluZ19pc29fc3RhdHVzID0gaW5jb21pbmdfaXNvX2Z1dHVyZS53YWl0X2ZvcihrQWNsVGltZW91dCk7Ci0gICAgICAvLyBHZXQgdGhlIG5leHQgZnV0dXJlLgotICAgICAgQVNTRVJUX0VRKGluY29taW5nX2lzb19zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICAgICAgaW5jb21pbmdfaXNvX2Z1dHVyZSA9IHVwcGVyLT5HZXRSZWNlaXZlZElzb0Z1dHVyZSgpOwotICAgICAgbnVtX3Jjdl9wYWNrZXRzID0gdXBwZXItPkdldE51bVJlY2VpdmVkSXNvUGFja2V0cygpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9yY3ZfcGFja2V0czsgaSsrKSB7Ci0gICAgICBhdXRvIGlzb192aWV3ID0gdXBwZXItPkdldFJlY2VpdmVkSXNvKCk7Ci0gICAgICBBU1NFUlRfVFJVRShpc29fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUX0VRKHNpemVvZihoYW5kbGUpICsgc2l6ZW9mKHJlY2VpdmVkX3BhY2tldHMpLCBpc29fdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpKTsKLSAgICAgIGF1dG8gaXRyID0gaXNvX3ZpZXcuR2V0UGF5bG9hZCgpLmJlZ2luKCk7Ci0gICAgICBBU1NFUlRfRVEoaGFuZGxlLCBpdHIuZXh0cmFjdDx1aW50MTZfdD4oKSk7Ci0gICAgICBBU1NFUlRfRVEocmVjZWl2ZWRfcGFja2V0cywgaXRyLmV4dHJhY3Q8dWludDE2X3Q+KCkpOwotICAgICAgcmVjZWl2ZWRfcGFja2V0cyArPSAxOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGZ1dHVyZSB3YXMgYWxyZWFkeSBmdWxmaWxsZWQuCi0gIGF1dG8gaXNvX3JhY2Vfc3RhdHVzID0gaW5jb21pbmdfaXNvX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEpKTsKLSAgaWYgKGlzb19yYWNlX3N0YXR1cyA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7Ci0gICAgLy8gR2V0IHRoZSBuZXh0IGZ1dHVyZS4KLSAgICBpbmNvbWluZ19pc29fZnV0dXJlID0gdXBwZXItPkdldFJlY2VpdmVkSXNvRnV0dXJlKCk7Ci0gIH0KLQotICAvLyBPbmUgbGFzdCBwYWNrZXQgdG8gbWFrZSBzdXJlIHRoZXkgd2VyZSBhbGwgc2VudC4gIEFscmVhZHkgZ290IHRoZSBmdXR1cmUuCi0gIGF1dG8gaXNvX3BheWxvYWQgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KCk7Ci0gIGlzb19wYXlsb2FkLT5BZGRPY3RldHMyKGhhbmRsZSk7Ci0gIGlzb19wYXlsb2FkLT5BZGRPY3RldHMyKG51bV9wYWNrZXRzKTsKLSAgaGFsLT5jYWxsYmFja3MtPmlzb0RhdGFSZWNlaXZlZCgKLSAgICAgIEdldFBhY2tldEJ5dGVzKElzb0J1aWxkZXI6OkNyZWF0ZShoYW5kbGUsIHBhY2tldF9ib3VuZGFyeV9mbGFnLCB0aW1lc3RhbXBfZmxhZywgc3RkOjptb3ZlKGlzb19wYXlsb2FkKSkpKTsKLSAgYXV0byBpbmNvbWluZ19pc29fc3RhdHVzID0gaW5jb21pbmdfaXNvX2Z1dHVyZS53YWl0X2ZvcihrQWNsVGltZW91dCk7Ci0gIEFTU0VSVF9FUShpbmNvbWluZ19pc29fc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgYXV0byBpc29fdmlldyA9IHVwcGVyLT5HZXRSZWNlaXZlZElzbygpOwotICBBU1NFUlRfVFJVRShpc29fdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoc2l6ZW9mKGhhbmRsZSkgKyBzaXplb2YocmVjZWl2ZWRfcGFja2V0cyksIGlzb192aWV3LkdldFBheWxvYWQoKS5zaXplKCkpOwotICBhdXRvIGl0ciA9IGlzb192aWV3LkdldFBheWxvYWQoKS5iZWdpbigpOwotICBBU1NFUlRfRVEoaGFuZGxlLCBpdHIuZXh0cmFjdDx1aW50MTZfdD4oKSk7Ci0gIEFTU0VSVF9FUShyZWNlaXZlZF9wYWNrZXRzLCBpdHIuZXh0cmFjdDx1aW50MTZfdD4oKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvaGNpX21ldHJpY3NfbG9nZ2luZy5jYyBiL2dkL2hjaS9oY2lfbWV0cmljc19sb2dnaW5nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDI1MGUyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9oY2lfbWV0cmljc19sb2dnaW5nLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24vc3RyaW5ncy5oIgotI2luY2x1ZGUgImhjaS9oY2lfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAib3MvbWV0cmljcy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXZvaWQgbG9nX2hjaV9ldmVudCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+JiBjb21tYW5kX3ZpZXcsIEV2ZW50VmlldyBldmVudF92aWV3LCBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZSkgewotICBBU1NFUlQoZXZlbnRfdmlldy5Jc1ZhbGlkKCkpOwotICBFdmVudENvZGUgZXZlbnRfY29kZSA9IGV2ZW50X3ZpZXcuR2V0RXZlbnRDb2RlKCk7Ci0gIHN3aXRjaCAoZXZlbnRfY29kZSkgewotICAgIGNhc2UgRXZlbnRDb2RlOjpDT01NQU5EX0NPTVBMRVRFOiB7Ci0gICAgICBDb21tYW5kQ29tcGxldGVWaWV3IGNvbXBsZXRlX3ZpZXcgPSBDb21tYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoZXZlbnRfdmlldyk7Ci0gICAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpID09IE9wQ29kZTo6Tk9ORSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBBU1NFUlQoY29tbWFuZF92aWV3LT5Jc1ZhbGlkKCkpOwotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9jb21tYW5kX2NvbXBsZXRlKGV2ZW50X3ZpZXcsIGNvbW1hbmRfdmlldyk7Ci0gICAgICBsb2dfY2xhc3NpY19wYWlyaW5nX2NvbW1hbmRfY29tcGxldGUoZXZlbnRfdmlldywgY29tbWFuZF92aWV3KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6Q09NTUFORF9TVEFUVVM6IHsKLSAgICAgIENvbW1hbmRTdGF0dXNWaWV3IHJlc3BvbnNlX3ZpZXcgPSBDb21tYW5kU3RhdHVzVmlldzo6Q3JlYXRlKGV2ZW50X3ZpZXcpOwotICAgICAgQVNTRVJUKHJlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGlmIChyZXNwb25zZV92aWV3LkdldENvbW1hbmRPcENvZGUoKSA9PSBPcENvZGU6Ok5PTkUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgQVNTRVJUKGNvbW1hbmRfdmlldy0+SXNWYWxpZCgpKTsKLSAgICAgIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fY29tbWFuZF9zdGF0dXMoY29tbWFuZF92aWV3LCByZXNwb25zZV92aWV3LkdldFN0YXR1cygpKTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfY29tbWFuZF9zdGF0dXMoY29tbWFuZF92aWV3LCByZXNwb25zZV92aWV3LkdldFN0YXR1cygpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVDogewotICAgICAgTGVNZXRhRXZlbnRWaWV3IGxlX21ldGFfZXZlbnRfdmlldyA9IExlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50X3ZpZXcpOwotICAgICAgQVNTRVJUKGxlX21ldGFfZXZlbnRfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudF9sZV9tZXRhKGxlX21ldGFfZXZlbnRfdmlldyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fb3RoZXJfaGNpX2V2ZW50KGV2ZW50X3ZpZXcsIHN0b3JhZ2VfbW9kdWxlKTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfb3RoZXJfaGNpX2V2ZW50KGV2ZW50X3ZpZXcpOwotICB9Ci19Ci12b2lkIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fY29tbWFuZF9zdGF0dXMoc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRWaWV3PiYgY29tbWFuZF92aWV3LCBFcnJvckNvZGUgc3RhdHVzKSB7Ci0gIC8vIGdldCBvcF9jb2RlCi0gIEFTU0VSVChjb21tYW5kX3ZpZXctPklzVmFsaWQoKSk7Ci0gIE9wQ29kZSBvcF9jb2RlID0gY29tbWFuZF92aWV3LT5HZXRPcENvZGUoKTsKLQotICAvLyBpbml0IHBhcmFtZXRlcnMgdG8gbG9nCi0gIEFkZHJlc3MgYWRkcmVzcyA9IEFkZHJlc3M6OmtFbXB0eTsKLSAgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUgPSBibHVldG9vdGg6Om9zOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGU7Ci0gIHVpbnQxNl90IHJlYXNvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQpOwotICBzdGF0aWMgdWludDE2X3Qga1Vua25vd25CbGVFdnQgPSBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6QkxFX0VWVF9VTktOT1dOOwotICB1aW50MTZfdCBldmVudF9jb2RlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkVWVF9DT01NQU5EX1NUQVRVUzsKLSAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX1VOS05PV047Ci0gIHVpbnQxNl90IGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV047Ci0KLSAgLy8gZ2V0IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXcKLSAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldyBjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3ID0KLSAgICAgIENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKCpjb21tYW5kX3ZpZXcpKTsKLSAgQVNTRVJUKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgc3dpdGNoIChvcF9jb2RlKSB7Ci0gICAgY2FzZSBPcENvZGU6OkNSRUFURV9DT05ORUNUSU9OOiB7Ci0gICAgICBhdXRvIGNyZWF0ZV9jb25uZWN0aW9uX3ZpZXcgPSBDcmVhdGVDb25uZWN0aW9uVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQoY3JlYXRlX2Nvbm5lY3Rpb25fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGNyZWF0ZV9jb25uZWN0aW9uX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9PVVRHT0lORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICBhdXRvIGNyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF92aWV3ID0KLSAgICAgICAgICBDcmVhdGVDb25uZWN0aW9uQ2FuY2VsVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQoY3JlYXRlX2Nvbm5lY3Rpb25fY2FuY2VsX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBjcmVhdGVfY29ubmVjdGlvbl9jYW5jZWxfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HOwotICAgICAgbGlua190eXBlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpESVNDT05ORUNUOiB7Ci0gICAgICBhdXRvIGRpc2Nvbm5lY3RfdmlldyA9IERpc2Nvbm5lY3RWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChkaXNjb25uZWN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlID0gZGlzY29ubmVjdF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICAgIHJlYXNvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihkaXNjb25uZWN0X3ZpZXcuR2V0UmVhc29uKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpTRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OOiB7Ci0gICAgICBhdXRvIHNldHVwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldyA9IFNldHVwU3luY2hyb25vdXNDb25uZWN0aW9uVmlldzo6Q3JlYXRlKAotICAgICAgICAgIFNjb0Nvbm5lY3Rpb25Db21tYW5kVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSkpOwotICAgICAgQVNTRVJUKHNldHVwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgY29ubmVjdGlvbl9oYW5kbGUgPSBzZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgICAgZGlyZWN0aW9uID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fT1VUR09JTkc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OkVOSEFOQ0VEX1NFVFVQX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT046IHsKLSAgICAgIGF1dG8gZW5oYW5jZWRfc2V0dXBfc3luY2hyb25vdXNfY29ubmVjdGlvbl92aWV3ID0gRW5oYW5jZWRTZXR1cFN5bmNocm9ub3VzQ29ubmVjdGlvblZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBTY29Db25uZWN0aW9uQ29tbWFuZFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldykpKTsKLSAgICAgIEFTU0VSVChlbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlID0gZW5oYW5jZWRfc2V0dXBfc3luY2hyb25vdXNfY29ubmVjdGlvbl92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpBQ0NFUFRfQ09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBhdXRvIGFjY2VwdF9jb25uZWN0aW9uX3JlcXVlc3RfdmlldyA9Ci0gICAgICAgICAgQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChhY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBhY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6QUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT046IHsKLSAgICAgIGF1dG8gYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldyA9IEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvblZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBTY29Db25uZWN0aW9uQ29tbWFuZFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldykpKTsKLSAgICAgIEFTU0VSVChhY2NlcHRfc3luY2hyb25vdXNfY29ubmVjdGlvbl92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpFTkhBTkNFRF9BQ0NFUFRfU1lOQ0hST05PVVNfQ09OTkVDVElPTjogewotICAgICAgYXV0byBlbmhhbmNlZF9hY2NlcHRfc3luY2hyb25vdXNfY29ubmVjdGlvbl92aWV3ID0gRW5oYW5jZWRBY2NlcHRTeW5jaHJvbm91c0Nvbm5lY3Rpb25WaWV3OjpDcmVhdGUoCi0gICAgICAgICAgU2NvQ29ubmVjdGlvbkNvbW1hbmRWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKSk7Ci0gICAgICBBU1NFUlQoZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGVuaGFuY2VkX2FjY2VwdF9zeW5jaHJvbm91c19jb25uZWN0aW9uX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6UkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVDogewotICAgICAgYXV0byByZWplY3RfY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcgPQotICAgICAgICAgIFJlamVjdENvbm5lY3Rpb25SZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQocmVqZWN0X2Nvbm5lY3Rpb25fcmVxdWVzdF92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gcmVqZWN0X2Nvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldEJkQWRkcigpOwotICAgICAgcmVhc29uID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHJlamVjdF9jb25uZWN0aW9uX3JlcXVlc3Rfdmlldy5HZXRSZWFzb24oKSk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6UkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT046IHsKLSAgICAgIGF1dG8gcmVqZWN0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldyA9IFJlamVjdFN5bmNocm9ub3VzQ29ubmVjdGlvblZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBTY29Db25uZWN0aW9uQ29tbWFuZFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldykpKTsKLSAgICAgIEFTU0VSVChyZWplY3Rfc3luY2hyb25vdXNfY29ubmVjdGlvbl92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gcmVqZWN0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb25fdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIHJlYXNvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWplY3Rfc3luY2hyb25vdXNfY29ubmVjdGlvbl92aWV3LkdldFJlYXNvbigpKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMRV9DUkVBVEVfQ09OTkVDVElPTjogewotICAgICAgYXV0byBsZV9jcmVhdGVfY29ubmVjdGlvbl92aWV3ID0gTGVDcmVhdGVDb25uZWN0aW9uVmlldzo6Q3JlYXRlKAotICAgICAgICAgIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSkpOwotICAgICAgQVNTRVJUKGxlX2NyZWF0ZV9jb25uZWN0aW9uX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHVpbnQ4X3QgaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kgPSBzdGF0aWNfY2FzdDx1aW50OF90PihsZV9jcmVhdGVfY29ubmVjdGlvbl92aWV3LkdldEluaXRpYXRvckZpbHRlclBvbGljeSgpKTsKLSAgICAgIGlmIChpbml0aWF0b3JfZmlsdGVyX3BvbGljeSAhPSAweDAwICYmIHN0YXR1cyA9PSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYWRkcmVzcyA9IGxlX2NyZWF0ZV9jb25uZWN0aW9uX3ZpZXcuR2V0UGVlckFkZHJlc3MoKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HOwotICAgICAgbGlua190eXBlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTjogewotICAgICAgYXV0byBsZV9leHRlbmRlZF9jcmVhdGVfY29ubmVjdGlvbl92aWV3ID0gTGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoCi0gICAgICAgICAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKSk7Ci0gICAgICBBU1NFUlQobGVfZXh0ZW5kZWRfY3JlYXRlX2Nvbm5lY3Rpb25fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgdWludDhfdCBpbml0aWF0b3JfZmlsdGVyX3BvbGljeSA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4obGVfZXh0ZW5kZWRfY3JlYXRlX2Nvbm5lY3Rpb25fdmlldy5HZXRJbml0aWF0b3JGaWx0ZXJQb2xpY3koKSk7Ci0gICAgICBpZiAoaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kgIT0gMHgwMCAmJiBzdGF0dXMgPT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGFkZHJlc3MgPSBsZV9leHRlbmRlZF9jcmVhdGVfY29ubmVjdGlvbl92aWV3LkdldFBlZXJBZGRyZXNzKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9PVVRHT0lORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6TEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICBhdXRvIGxlX2NyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF92aWV3ID0gTGVDcmVhdGVDb25uZWN0aW9uQ2FuY2VsVmlldzo6Q3JlYXRlKAotICAgICAgICAgIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSkpOwotICAgICAgQVNTRVJUKGxlX2NyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBpZiAoc3RhdHVzID09IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9PVVRHT0lORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6TEVfQ0xFQVJfQ09OTkVDVF9MSVNUOiB7Ci0gICAgICBhdXRvIGxlX2NsZWFyX2Nvbm5lY3RfbGlzdF92aWV3ID0gTGVDbGVhckNvbm5lY3RMaXN0Vmlldzo6Q3JlYXRlKAotICAgICAgICAgIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSkpOwotICAgICAgQVNTRVJUKGxlX2NsZWFyX2Nvbm5lY3RfbGlzdF92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1Q6IHsKLSAgICAgIGF1dG8gbGVfYWRkX2RldmljZV90b19jb25uZWN0X2xpc3RfdmlldyA9IExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldykpKTsKLSAgICAgIEFTU0VSVChsZV9hZGRfZGV2aWNlX3RvX2Nvbm5lY3RfbGlzdF92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gbGVfYWRkX2RldmljZV90b19jb25uZWN0X2xpc3Rfdmlldy5HZXRBZGRyZXNzKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6TEVfUkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVDogewotICAgICAgYXV0byBsZV9yZW1vdmVfZGV2aWNlX2Zyb21fY29ubmVjdF9saXN0X3ZpZXcgPSBMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldykpKTsKLSAgICAgIEFTU0VSVChsZV9yZW1vdmVfZGV2aWNlX2Zyb21fY29ubmVjdF9saXN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBsZV9yZW1vdmVfZGV2aWNlX2Zyb21fY29ubmVjdF9saXN0X3ZpZXcuR2V0QWRkcmVzcygpOwotICAgICAgZGlyZWN0aW9uID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fSU5DT01JTkc7Ci0gICAgICBsaW5rX3R5cGUgPSBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0w7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotICBvczo6TG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgICAgJmFkZHJlc3MsCi0gICAgICBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgIGRpcmVjdGlvbiwKLSAgICAgIGxpbmtfdHlwZSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihvcF9jb2RlKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihldmVudF9jb2RlKSwKLSAgICAgIGtVbmtub3duQmxlRXZ0LAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHN0YXR1cyksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4ocmVhc29uKSk7Ci19Ci0KLXZvaWQgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9jb21tYW5kX2NvbXBsZXRlKEV2ZW50VmlldyBldmVudF92aWV3LCBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+JiBjb21tYW5kX3ZpZXcpIHsKLSAgQ29tbWFuZENvbXBsZXRlVmlldyBjb21tYW5kX2NvbXBsZXRlX3ZpZXcgPSBDb21tYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGV2ZW50X3ZpZXcpKTsKLSAgQVNTRVJUKGNvbW1hbmRfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICBPcENvZGUgb3BfY29kZSA9IGNvbW1hbmRfY29tcGxldGVfdmlldy5HZXRDb21tYW5kT3BDb2RlKCk7Ci0KLSAgLy8gaW5pdCBwYXJhbWV0ZXJzIHRvIGxvZwotICBBZGRyZXNzIGFkZHJlc3MgPSBBZGRyZXNzOjprRW1wdHk7Ci0gIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlID0gYmx1ZXRvb3RoOjpvczo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlOwotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpVTktOT1dOX0hDSV9DT01NQU5EOwotICBFcnJvckNvZGUgcmVhc29uID0gRXJyb3JDb2RlOjpVTktOT1dOX0hDSV9DT01NQU5EOwotICBzdGF0aWMgdWludDE2X3Qga1Vua25vd25CbGVFdnQgPSBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6QkxFX0VWVF9VTktOT1dOOwotICB1aW50MTZfdCBldmVudF9jb2RlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkVWVF9DT01NQU5EX0NPTVBMRVRFOwotICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fVU5LTk9XTjsKLSAgdWludDE2X3QgbGlua190eXBlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfVU5LTk9XTjsKLQotICAvLyBnZXQgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldwotICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3IGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcgPQotICAgICAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUoKmNvbW1hbmRfdmlldykpOwotICBBU1NFUlQoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHN3aXRjaCAob3BfY29kZSkgewotICAgIGNhc2UgT3BDb2RlOjpMRV9DTEVBUl9DT05ORUNUX0xJU1Q6IHsKLSAgICAgIGF1dG8gbGVfY2xlYXJfY29ubmVjdF9saXN0X3ZpZXcgPSBMZUNsZWFyQ29ubmVjdExpc3RWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKSk7Ci0gICAgICBBU1NFUlQobGVfY2xlYXJfY29ubmVjdF9saXN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HOwotICAgICAgbGlua190eXBlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMRV9BRERfREVWSUNFX1RPX0NPTk5FQ1RfTElTVDogewotICAgICAgYXV0byBsZV9hZGRfZGV2aWNlX3RvX2Nvbm5lY3RfbGlzdF92aWV3ID0gTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Vmlldzo6Q3JlYXRlKAotICAgICAgICAgIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSkpOwotICAgICAgQVNTRVJUKGxlX2FkZF9kZXZpY2VfdG9fY29ubmVjdF9saXN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBsZV9hZGRfZGV2aWNlX3RvX2Nvbm5lY3RfbGlzdF92aWV3LkdldEFkZHJlc3MoKTsKLSAgICAgIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HOwotICAgICAgbGlua190eXBlID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMRV9SRU1PVkVfREVWSUNFX0ZST01fQ09OTkVDVF9MSVNUOiB7Ci0gICAgICBhdXRvIGxlX3JlbW92ZV9kZXZpY2VfZnJvbV9jb25uZWN0X2xpc3RfdmlldyA9IExlUmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0Vmlldzo6Q3JlYXRlKAotICAgICAgICAgIExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb25uZWN0aW9uX21hbmFnZW1lbnRfY29tbWFuZF92aWV3KSkpOwotICAgICAgQVNTRVJUKGxlX3JlbW92ZV9kZXZpY2VfZnJvbV9jb25uZWN0X2xpc3Rfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGxlX3JlbW92ZV9kZXZpY2VfZnJvbV9jb25uZWN0X2xpc3Rfdmlldy5HZXRBZGRyZXNzKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6Q1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICBhdXRvIGNyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF9jb21wbGV0ZV92aWV3ID0KLSAgICAgICAgICBDcmVhdGVDb25uZWN0aW9uQ2FuY2VsQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKGNyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gY3JlYXRlX2Nvbm5lY3Rpb25fY2FuY2VsX2NvbXBsZXRlX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9PVVRHT0lORzsKLSAgICAgIGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTDsKLSAgICAgIHN0YXR1cyA9IGNyZWF0ZV9jb25uZWN0aW9uX2NhbmNlbF9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMRV9DUkVBVEVfQ09OTkVDVElPTl9DQU5DRUw6IHsKLSAgICAgIGF1dG8gbGVfY3JlYXRlX2Nvbm5lY3Rpb25fY2FuY2VsX2NvbXBsZXRlX3ZpZXcgPQotICAgICAgICAgIExlQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbENvbXBsZXRlVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChsZV9jcmVhdGVfY29ubmVjdGlvbl9jYW5jZWxfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgZGlyZWN0aW9uID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fT1VUR09JTkc7Ci0gICAgICBsaW5rX3R5cGUgPSBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0w7Ci0gICAgICBzdGF0dXMgPSBsZV9jcmVhdGVfY29ubmVjdGlvbl9jYW5jZWxfY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICB9Ci0gIG9zOjpMb2dNZXRyaWNMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQoCi0gICAgICAmYWRkcmVzcywKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgZGlyZWN0aW9uLAotICAgICAgbGlua190eXBlLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG9wX2NvZGUpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGV2ZW50X2NvZGUpLAotICAgICAga1Vua25vd25CbGVFdnQsCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc3RhdHVzKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWFzb24pKTsKLX0KLQotdm9pZCBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX290aGVyX2hjaV9ldmVudChFdmVudFZpZXcgcGFja2V0LCBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZSkgewotICBFdmVudENvZGUgZXZlbnRfY29kZSA9IHBhY2tldC5HZXRFdmVudENvZGUoKTsKLSAgQWRkcmVzcyBhZGRyZXNzID0gQWRkcmVzczo6a0VtcHR5OwotICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSA9IGJsdWV0b290aDo6b3M6OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZTsKLSAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiA9IGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX1VOS05PV047Ci0gIHVpbnQxNl90IGxpbmtfdHlwZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV047Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQ7Ci0gIEVycm9yQ29kZSByZWFzb24gPSBFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQ7Ci0gIHVpbnQzMl90IGNtZCA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpDTURfVU5LTk9XTjsKLSAgc3dpdGNoIChldmVudF9jb2RlKSB7Ci0gICAgY2FzZSBFdmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEU6IHsKLSAgICAgIGF1dG8gY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3ID0gQ29ubmVjdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChjb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBjb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBjb25uZWN0aW9uX2hhbmRsZSA9IGNvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgICBsaW5rX3R5cGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LkdldExpbmtUeXBlKCkpOwotICAgICAgc3RhdHVzID0gY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotCi0gICAgICAvLyBiZXNpZGVzIGxvZyBsaW5rIGxheWVyIGNvbm5lY3Rpb24gZXZlbnRzLCBhbHNvIGxvZyByZW1vdGUgZGV2aWNlIG1hbnVmYWN0dXJlciBpbmZvCi0gICAgICBsb2dfcmVtb3RlX2RldmljZV9pbmZvcm1hdGlvbihhZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSwgc3RhdHVzLCBzdG9yYWdlX21vZHVsZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudENvZGU6OkNPTk5FQ1RJT05fUkVRVUVTVDogewotICAgICAgYXV0byBjb25uZWN0aW9uX3JlcXVlc3RfdmlldyA9IENvbm5lY3Rpb25SZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChjb25uZWN0aW9uX3JlcXVlc3Rfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGNvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldEJkQWRkcigpOwotICAgICAgbGlua190eXBlID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldExpbmtUeXBlKCkpOwotICAgICAgZGlyZWN0aW9uID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fSU5DT01JTkc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudENvZGU6OkRJU0NPTk5FQ1RJT05fQ09NUExFVEU6IHsKLSAgICAgIGF1dG8gZGlzY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3ID0gRGlzY29ubmVjdGlvbkNvbXBsZXRlVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChkaXNjb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IGRpc2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlID0gZGlzY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICAgIHJlYXNvbiA9IGRpc2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRSZWFzb24oKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6U1lOQ0hST05PVVNfQ09OTkVDVElPTl9DT01QTEVURTogewotICAgICAgYXV0byBzeW5jaHJvbm91c19jb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcgPSBTeW5jaHJvbm91c0Nvbm5lY3Rpb25Db21wbGV0ZVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgICBBU1NFUlQoc3luY2hyb25vdXNfY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBjb25uZWN0aW9uX2hhbmRsZSA9IHN5bmNocm9ub3VzX2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgICBhZGRyZXNzID0gc3luY2hyb25vdXNfY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LkdldEJkQWRkcigpOwotICAgICAgbGlua190eXBlID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHN5bmNocm9ub3VzX2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRMaW5rVHlwZSgpKTsKLSAgICAgIHN0YXR1cyA9IHN5bmNocm9ub3VzX2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6U1lOQ0hST05PVVNfQ09OTkVDVElPTl9DSEFOR0VEOiB7Ci0gICAgICBhdXRvIHN5bmNocm9ub3VzX2Nvbm5lY3Rpb25fY2hhbmdlZF92aWV3ID0gU3luY2hyb25vdXNDb25uZWN0aW9uQ2hhbmdlZFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgICBBU1NFUlQoc3luY2hyb25vdXNfY29ubmVjdGlvbl9jaGFuZ2VkX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IHN5bmNocm9ub3VzX2Nvbm5lY3Rpb25fY2hhbmdlZF92aWV3LkdldFN0YXR1cygpOwotICAgICAgY29ubmVjdGlvbl9oYW5kbGUgPSBzeW5jaHJvbm91c19jb25uZWN0aW9uX2NoYW5nZWRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotICBvczo6TG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgICAgJmFkZHJlc3MsCi0gICAgICBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgIGRpcmVjdGlvbiwKLSAgICAgIGxpbmtfdHlwZSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihjbWQpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGV2ZW50X2NvZGUpLAotICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkJMRV9FVlRfVU5LTk9XTiwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0dXMpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHJlYXNvbikpOwotfQotCi12b2lkIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnRfbGVfbWV0YShMZU1ldGFFdmVudFZpZXcgbGVfbWV0YV9ldmVudF92aWV3KSB7Ci0gIFN1YmV2ZW50Q29kZSBsZUV2dCA9IGxlX21ldGFfZXZlbnRfdmlldy5HZXRTdWJldmVudENvZGUoKTsKLSAgYXV0byBsZV9jb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcgPSBMZUNvbm5lY3Rpb25Db21wbGV0ZVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUobGVfbWV0YV9ldmVudF92aWV3KSk7Ci0gIGlmICghbGVfY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgYWxsIGxlIG1ldGEgZXZlbnRzLiBPbmx5IG5lZWQgdG8gcHJvY2VzcyBsZSBjb25uZWN0aW9uIGNvbXBsZXRlLgotICAgIHJldHVybjsKLSAgfQotICBBU1NFUlQobGVfY29ubmVjdGlvbl9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gIC8vIGluaXQgcGFyYW1ldGVycyB0byBsb2cKLSAgRXZlbnRDb2RlIGV2ZW50X2NvZGUgPSBFdmVudENvZGU6OkxFX01FVEFfRVZFTlQ7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IGxlX2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRQZWVyQWRkcmVzcygpOwotICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSA9IGxlX2Nvbm5lY3Rpb25fY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9VTktOT1dOOwotICB1aW50MTZfdCBsaW5rX3R5cGUgPSBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0w7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBsZV9jb25uZWN0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gIEVycm9yQ29kZSByZWFzb24gPSBFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQ7Ci0gIHVpbnQzMl90IGNtZCA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpDTURfVU5LTk9XTjsKLQotICBvczo6TG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgICAgJmFkZHJlc3MsCi0gICAgICBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgIGRpcmVjdGlvbiwKLSAgICAgIGxpbmtfdHlwZSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihjbWQpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGV2ZW50X2NvZGUpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGxlRXZ0KSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0dXMpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHJlYXNvbikpOwotfQotCi12b2lkIGxvZ19jbGFzc2ljX3BhaXJpbmdfb3RoZXJfaGNpX2V2ZW50KEV2ZW50VmlldyBwYWNrZXQpIHsKLSAgRXZlbnRDb2RlIGV2ZW50X2NvZGUgPSBwYWNrZXQuR2V0RXZlbnRDb2RlKCk7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IEFkZHJlc3M6OmtFbXB0eTsKLSAgdWludDMyX3QgY21kID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkNNRF9VTktOT1dOOwotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpVTktOT1dOX0hDSV9DT01NQU5EOwotICBFcnJvckNvZGUgcmVhc29uID0gRXJyb3JDb2RlOjpVTktOT1dOX0hDSV9DT01NQU5EOwotICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSA9IGJsdWV0b290aDo6b3M6OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZTsKLSAgaW50NjRfdCB2YWx1ZSA9IDA7Ci0KLSAgc3dpdGNoIChldmVudF9jb2RlKSB7Ci0gICAgY2FzZSBFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVDogewotICAgICAgSW9DYXBhYmlsaXR5UmVxdWVzdFZpZXcgaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X3ZpZXcgPSBJb0NhcGFiaWxpdHlSZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChpb19jYXBhYmlsaXR5X3JlcXVlc3Rfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGlvX2NhcGFiaWxpdHlfcmVxdWVzdF92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFOiB7Ci0gICAgICBJb0NhcGFiaWxpdHlSZXNwb25zZVZpZXcgaW9fY2FwYWJpbGl0eV9yZXNwb25zZV92aWV3ID0gSW9DYXBhYmlsaXR5UmVzcG9uc2VWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHBhY2tldCkpOwotICAgICAgQVNTRVJUKGlvX2NhcGFiaWxpdHlfcmVzcG9uc2Vfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGlvX2NhcGFiaWxpdHlfcmVzcG9uc2Vfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6TElOS19LRVlfUkVRVUVTVDogewotICAgICAgTGlua0tleVJlcXVlc3RWaWV3IGxpbmtfa2V5X3JlcXVlc3RfdmlldyA9IExpbmtLZXlSZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChsaW5rX2tleV9yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBsaW5rX2tleV9yZXF1ZXN0X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudENvZGU6OkxJTktfS0VZX05PVElGSUNBVElPTjogewotICAgICAgTGlua0tleU5vdGlmaWNhdGlvblZpZXcgbGlua19rZXlfbm90aWZpY2F0aW9uX3ZpZXcgPSBMaW5rS2V5Tm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChsaW5rX2tleV9ub3RpZmljYXRpb25fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGxpbmtfa2V5X25vdGlmaWNhdGlvbl92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRXZlbnRDb2RlOjpVU0VSX1BBU1NLRVlfUkVRVUVTVDogewotICAgICAgVXNlclBhc3NrZXlSZXF1ZXN0VmlldyB1c2VyX3Bhc3NrZXlfcmVxdWVzdF92aWV3ID0gVXNlclBhc3NrZXlSZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVCh1c2VyX3Bhc3NrZXlfcmVxdWVzdF92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gdXNlcl9wYXNza2V5X3JlcXVlc3Rfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX05PVElGSUNBVElPTjogewotICAgICAgVXNlclBhc3NrZXlOb3RpZmljYXRpb25WaWV3IHVzZXJfcGFzc2tleV9ub3RpZmljYXRpb25fdmlldyA9IFVzZXJQYXNza2V5Tm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVCh1c2VyX3Bhc3NrZXlfbm90aWZpY2F0aW9uX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSB1c2VyX3Bhc3NrZXlfbm90aWZpY2F0aW9uX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudENvZGU6OlVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1Q6IHsKLSAgICAgIFVzZXJDb25maXJtYXRpb25SZXF1ZXN0VmlldyB1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X3ZpZXcgPSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgICBBU1NFUlQodXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRXZlbnRDb2RlOjpLRVlQUkVTU19OT1RJRklDQVRJT046IHsKLSAgICAgIEtleXByZXNzTm90aWZpY2F0aW9uVmlldyBrZXlwcmVzc19ub3RpZmljYXRpb25fdmlldyA9IEtleXByZXNzTm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIEFTU0VSVChrZXlwcmVzc19ub3RpZmljYXRpb25fdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGtleXByZXNzX25vdGlmaWNhdGlvbl92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRXZlbnRDb2RlOjpSRU1PVEVfT09CX0RBVEFfUkVRVUVTVDogewotICAgICAgUmVtb3RlT29iRGF0YVJlcXVlc3RWaWV3IHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X3ZpZXcgPSBSZW1vdGVPb2JEYXRhUmVxdWVzdFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgICBBU1NFUlQocmVtb3RlX29vYl9kYXRhX3JlcXVlc3Rfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFOiB7Ci0gICAgICBTaW1wbGVQYWlyaW5nQ29tcGxldGVWaWV3IHNpbXBsZV9wYWlyaW5nX2NvbXBsZXRlX3ZpZXcgPSBTaW1wbGVQYWlyaW5nQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHBhY2tldCkpOwotICAgICAgQVNTRVJUKHNpbXBsZV9wYWlyaW5nX2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBzaW1wbGVfcGFpcmluZ19jb21wbGV0ZV92aWV3LkdldEJkQWRkcigpOwotICAgICAgc3RhdHVzID0gc2ltcGxlX3BhaXJpbmdfY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50Q29kZTo6UkVNT1RFX05BTUVfUkVRVUVTVF9DT01QTEVURTogewotICAgICAgUmVtb3RlTmFtZVJlcXVlc3RDb21wbGV0ZVZpZXcgcmVtb3RlX25hbWVfcmVxdWVzdF9jb21wbGV0ZV92aWV3ID0gUmVtb3RlTmFtZVJlcXVlc3RDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgICBBU1NFUlQocmVtb3RlX25hbWVfcmVxdWVzdF9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gcmVtb3RlX25hbWVfcmVxdWVzdF9jb21wbGV0ZV92aWV3LkdldEJkQWRkcigpOwotICAgICAgc3RhdHVzID0gcmVtb3RlX25hbWVfcmVxdWVzdF9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRXZlbnRDb2RlOjpBVVRIRU5USUNBVElPTl9DT01QTEVURTogewotICAgICAgQXV0aGVudGljYXRpb25Db21wbGV0ZVZpZXcgYXV0aGVudGljYXRpb25fY29tcGxldGVfdmlldyA9IEF1dGhlbnRpY2F0aW9uQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHBhY2tldCkpOwotICAgICAgQVNTRVJUKGF1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IGF1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBjb25uZWN0aW9uX2hhbmRsZSA9IGF1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRXZlbnRDb2RlOjpFTkNSWVBUSU9OX0NIQU5HRTogewotICAgICAgRW5jcnlwdGlvbkNoYW5nZVZpZXcgZW5jcnlwdGlvbl9jaGFuZ2VfdmlldyA9IEVuY3J5cHRpb25DaGFuZ2VWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHBhY2tldCkpOwotICAgICAgQVNTRVJUKGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBjb25uZWN0aW9uX2hhbmRsZSA9IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICAgICAgdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihlbmNyeXB0aW9uX2NoYW5nZV92aWV3LkdldEVuY3J5cHRpb25FbmFibGVkKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLSAgb3M6OkxvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgICBhZGRyZXNzLAotICAgICAgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY21kKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihldmVudF9jb2RlKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0dXMpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHJlYXNvbiksCi0gICAgICB2YWx1ZSk7Ci19Ci0KLXZvaWQgbG9nX2NsYXNzaWNfcGFpcmluZ19jb21tYW5kX3N0YXR1cyhzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+JiBjb21tYW5kX3ZpZXcsIEVycm9yQ29kZSBzdGF0dXMpIHsKLSAgLy8gZ2V0IG9wX2NvZGUKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy0+SXNWYWxpZCgpKTsKLSAgT3BDb2RlIG9wX2NvZGUgPSBjb21tYW5kX3ZpZXctPkdldE9wQ29kZSgpOwotCi0gIC8vIGluaXQgcGFyYW1ldGVycwotICBBZGRyZXNzIGFkZHJlc3MgPSBBZGRyZXNzOjprRW1wdHk7Ci0gIEVycm9yQ29kZSByZWFzb24gPSBFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQ7Ci0gIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlID0gYmx1ZXRvb3RoOjpvczo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlOwotICBpbnQ2NF90IHZhbHVlID0gMDsKLSAgdWludDE2X3QgZXZlbnRfY29kZSA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpFVlRfQ09NTUFORF9TVEFUVVM7Ci0KLSAgLy8gY3JlYXRlIFNlY3VyaXR5Q29tbWFuZFZpZXcKLSAgU2VjdXJpdHlDb21tYW5kVmlldyBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoKmNvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVChzZWN1cml0eV9jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICAvLyBjcmVhdGUgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldwotICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3IGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcgPQotICAgICAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUoKmNvbW1hbmRfdmlldykpOwotICBBU1NFUlQoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIC8vIGNyZWF0ZSBEaXNjb3ZlcnlDb21tYW5kVmlldwotICBEaXNjb3ZlcnlDb21tYW5kVmlldyBkaXNjb3ZlcnlfY29tbWFuZF92aWV3ID0gRGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZSgqY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUKGRpc2NvdmVyeV9jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBzd2l0Y2ggKG9wX2NvZGUpIHsKLSAgICBjYXNlIE9wQ29kZTo6UkVBRF9MT0NBTF9PT0JfREFUQTogewotICAgICAgUmVhZExvY2FsT29iRGF0YVZpZXcgcmVhZF9sb2NhbF9vb2JfZGF0YV92aWV3ID0gUmVhZExvY2FsT29iRGF0YVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQocmVhZF9sb2NhbF9vb2JfZGF0YV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OldSSVRFX1NJTVBMRV9QQUlSSU5HX01PREU6IHsKLSAgICAgIFdyaXRlU2ltcGxlUGFpcmluZ01vZGVWaWV3IHdyaXRlX3NpbXBsZV9wYWlyaW5nX21vZGVfdmlldwotICAgICAgPSBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVCh3cml0ZV9zaW1wbGVfcGFpcmluZ19tb2RlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4od3JpdGVfc2ltcGxlX3BhaXJpbmdfbW9kZV92aWV3LkdldFNpbXBsZVBhaXJpbmdNb2RlKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpXUklURV9TRUNVUkVfQ09OTkVDVElPTlNfSE9TVF9TVVBQT1JUOiB7Ci0gICAgICBXcml0ZVNlY3VyZUNvbm5lY3Rpb25zSG9zdFN1cHBvcnRWaWV3IHdyaXRlX3NlY3VyZV9jb25uZWN0aW9uc19ob3N0X3N1cHBvcnRfdmlldwotICAgICAgPSBXcml0ZVNlY3VyZUNvbm5lY3Rpb25zSG9zdFN1cHBvcnRWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHdyaXRlX3NlY3VyZV9jb25uZWN0aW9uc19ob3N0X3N1cHBvcnRfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih3cml0ZV9zZWN1cmVfY29ubmVjdGlvbnNfaG9zdF9zdXBwb3J0X3ZpZXcuR2V0U2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydCgpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6QVVUSEVOVElDQVRJT05fUkVRVUVTVEVEOiB7Ci0gICAgICBBdXRoZW50aWNhdGlvblJlcXVlc3RlZFZpZXcgYXV0aGVudGljYXRpb25fcmVxdWVzdGVkX3ZpZXcKLSAgICAgID0gQXV0aGVudGljYXRpb25SZXF1ZXN0ZWRWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChhdXRoZW50aWNhdGlvbl9yZXF1ZXN0ZWRfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgY29ubmVjdGlvbl9oYW5kbGUgPSBhdXRoZW50aWNhdGlvbl9yZXF1ZXN0ZWRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OlNFVF9DT05ORUNUSU9OX0VOQ1JZUFRJT046IHsKLSAgICAgIFNldENvbm5lY3Rpb25FbmNyeXB0aW9uVmlldyBzZXRfY29ubmVjdGlvbl9lbmNyeXB0aW9uX3ZpZXcKLSAgICAgID0gU2V0Q29ubmVjdGlvbkVuY3J5cHRpb25WaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChzZXRfY29ubmVjdGlvbl9lbmNyeXB0aW9uX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlID0gc2V0X2Nvbm5lY3Rpb25fZW5jcnlwdGlvbl92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgICAgIHZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2V0X2Nvbm5lY3Rpb25fZW5jcnlwdGlvbl92aWV3LkdldEVuY3J5cHRpb25FbmFibGUoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OkRFTEVURV9TVE9SRURfTElOS19LRVk6IHsKLSAgICAgIERlbGV0ZVN0b3JlZExpbmtLZXlWaWV3IGRlbGV0ZV9zdG9yZWRfbGlua19rZXlfdmlldwotICAgICAgPSBEZWxldGVTdG9yZWRMaW5rS2V5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChkZWxldGVfc3RvcmVkX2xpbmtfa2V5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBkZWxldGVfc3RvcmVkX2xpbmtfa2V5X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICB2YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGRlbGV0ZV9zdG9yZWRfbGlua19rZXlfdmlldy5HZXREZWxldGVBbGxGbGFnKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpSRU1PVEVfTkFNRV9SRVFVRVNUOiB7Ci0gICAgICBSZW1vdGVOYW1lUmVxdWVzdFZpZXcgcmVtb3RlX25hbWVfcmVxdWVzdF92aWV3ID0gUmVtb3RlTmFtZVJlcXVlc3RWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGRpc2NvdmVyeV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChyZW1vdGVfbmFtZV9yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSByZW1vdGVfbmFtZV9yZXF1ZXN0X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OlJFTU9URV9OQU1FX1JFUVVFU1RfQ0FOQ0VMOiB7Ci0gICAgICBSZW1vdGVOYW1lUmVxdWVzdENhbmNlbFZpZXcgcmVtb3RlX25hbWVfcmVxdWVzdF9jYW5jZWxfdmlldwotICAgICAgPSBSZW1vdGVOYW1lUmVxdWVzdENhbmNlbFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoZGlzY292ZXJ5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHJlbW90ZV9uYW1lX3JlcXVlc3RfY2FuY2VsX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSByZW1vdGVfbmFtZV9yZXF1ZXN0X2NhbmNlbF92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMSU5LX0tFWV9SRVFVRVNUX1JFUExZOiB7Ci0gICAgICBMaW5rS2V5UmVxdWVzdFJlcGx5VmlldyBsaW5rX2tleV9yZXF1ZXN0X3JlcGx5X3ZpZXcKLSAgICAgID0gTGlua0tleVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQobGlua19rZXlfcmVxdWVzdF9yZXBseV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gbGlua19rZXlfcmVxdWVzdF9yZXBseV92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZOiB7Ci0gICAgICBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3IGxpbmtfa2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldwotICAgICAgPSBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKGxpbmtfa2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGxpbmtfa2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZOiB7Ci0gICAgICBJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3IGlvX2NhcGFiaWxpdHlfcmVxdWVzdF9yZXBseV92aWV3Ci0gICAgICA9IElvQ2FwYWJpbGl0eVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQoaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBpb19jYXBhYmlsaXR5X3JlcXVlc3RfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9SRVBMWTogewotICAgICAgVXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseVZpZXcgdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF9yZXBseQotICAgICAgPSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVCh1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF9yZXBseS5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9ORUdBVElWRV9SRVBMWTogewotICAgICAgVXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5VmlldyB1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5Ci0gICAgICA9IFVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQodXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF9uZWdhdGl2ZV9yZXBseS5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IHVzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfbmVnYXRpdmVfcmVwbHkuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OlVTRVJfUEFTU0tFWV9SRVFVRVNUX1JFUExZOiB7Ci0gICAgICBVc2VyUGFzc2tleVJlcXVlc3RSZXBseVZpZXcgdXNlcl9wYXNza2V5X3JlcXVlc3RfcmVwbHkKLSAgICAgID0gVXNlclBhc3NrZXlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHVzZXJfcGFzc2tleV9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gdXNlcl9wYXNza2V5X3JlcXVlc3RfcmVwbHkuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OlVTRVJfUEFTU0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZOiB7Ci0gICAgICBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5VmlldyB1c2VyX3Bhc3NrZXlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseQotICAgICAgPSBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVCh1c2VyX3Bhc3NrZXlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseS5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IHVzZXJfcGFzc2tleV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpSRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9SRVBMWTogewotICAgICAgUmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseVZpZXcgcmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfcmVwbHlfdmlldwotICAgICAgPSBSZW1vdGVPb2JEYXRhUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChyZW1vdGVfb29iX2RhdGFfcmVxdWVzdF9yZXBseV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gcmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFk6IHsKLSAgICAgIFJlbW90ZU9vYkRhdGFSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXcgcmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldwotICAgICAgPSBSZW1vdGVPb2JEYXRhUmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSByZW1vdGVfb29iX2RhdGFfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFk6IHsKLSAgICAgIElvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5VmlldyBpb19jYXBhYmlsaXR5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldwotICAgICAgPSBJb0NhcGFiaWxpdHlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQoaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBpb19jYXBhYmlsaXR5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIHJlYXNvbiA9IGlvX2NhcGFiaWxpdHlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV92aWV3LkdldFJlYXNvbigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLSAgb3M6OkxvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgICBhZGRyZXNzLAotICAgICAgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3BfY29kZSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZXZlbnRfY29kZSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc3RhdHVzKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWFzb24pLAotICAgICAgdmFsdWUpOwotfQotCi12b2lkIGxvZ19jbGFzc2ljX3BhaXJpbmdfY29tbWFuZF9jb21wbGV0ZShFdmVudFZpZXcgZXZlbnRfdmlldywgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRWaWV3PiYgY29tbWFuZF92aWV3KSB7Ci0KLSAgLy8gZ2V0IG9wX2NvZGUKLSAgQ29tbWFuZENvbXBsZXRlVmlldyBjb21tYW5kX2NvbXBsZXRlX3ZpZXcgPSBDb21tYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGV2ZW50X3ZpZXcpKTsKLSAgQVNTRVJUKGNvbW1hbmRfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICBPcENvZGUgb3BfY29kZSA9IGNvbW1hbmRfY29tcGxldGVfdmlldy5HZXRDb21tYW5kT3BDb2RlKCk7Ci0KLSAgLy8gaW5pdCBwYXJhbWV0ZXJzCi0gIEFkZHJlc3MgYWRkcmVzcyA9IEFkZHJlc3M6OmtFbXB0eTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IEVycm9yQ29kZTo6VU5LTk9XTl9IQ0lfQ09NTUFORDsKLSAgRXJyb3JDb2RlIHJlYXNvbiA9IEVycm9yQ29kZTo6VU5LTk9XTl9IQ0lfQ09NTUFORDsKLSAgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUgPSBibHVldG9vdGg6Om9zOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGU7Ci0gIGludDY0X3QgdmFsdWUgPSAwOwotICBFdmVudENvZGUgZXZlbnRfY29kZSA9IEV2ZW50Q29kZTo6Q09NTUFORF9DT01QTEVURTsKLQotICAvLyBnZXQgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldwotICBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3IGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jb21tYW5kX3ZpZXcgPQotICAgICAgQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUoKmNvbW1hbmRfdmlldykpOwotICBBU1NFUlQoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIC8vIGNyZWF0ZSBTZWN1cml0eUNvbW1hbmRWaWV3Ci0gIFNlY3VyaXR5Q29tbWFuZFZpZXcgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gU2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKCpjb21tYW5kX3ZpZXcpOwotICBBU1NFUlQoc2VjdXJpdHlfY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgc3dpdGNoIChvcF9jb2RlKSB7Ci0gICAgY2FzZSBPcENvZGU6OkRFTEVURV9TVE9SRURfTElOS19LRVk6IHsKLSAgICAgIGF1dG8gZGVsZXRlX3N0b3JlZF9saW5rX2tleV9jb21wbGV0ZV92aWV3ID0gRGVsZXRlU3RvcmVkTGlua0tleUNvbXBsZXRlVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChkZWxldGVfc3RvcmVkX2xpbmtfa2V5X2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IGRlbGV0ZV9zdG9yZWRfbGlua19rZXlfY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6UkVBRF9MT0NBTF9PT0JfREFUQTogewotICAgICAgYXV0byByZWFkX2xvY2FsX29vYl9kYXRhX2NvbXBsZXRlX3ZpZXcgPSBSZWFkTG9jYWxPb2JEYXRhQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHJlYWRfbG9jYWxfb29iX2RhdGFfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gcmVhZF9sb2NhbF9vb2JfZGF0YV9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpXUklURV9TSU1QTEVfUEFJUklOR19NT0RFOiB7Ci0gICAgICBhdXRvIHdyaXRlX3NpbXBsZV9wYWlyaW5nX21vZGVfY29tcGxldGVfdmlldyA9IFdyaXRlU2ltcGxlUGFpcmluZ01vZGVDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZV92aWV3KSk7Ci0gICAgICBBU1NFUlQod3JpdGVfc2ltcGxlX3BhaXJpbmdfbW9kZV9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBzdGF0dXMgPSB3cml0ZV9zaW1wbGVfcGFpcmluZ19tb2RlX2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OldSSVRFX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQ6IHsKLSAgICAgIGF1dG8gd3JpdGVfc2VjdXJlX2Nvbm5lY3Rpb25zX2hvc3Rfc3VwcG9ydF9jb21wbGV0ZV92aWV3ID0gV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHdyaXRlX3NlY3VyZV9jb25uZWN0aW9uc19ob3N0X3N1cHBvcnRfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gd3JpdGVfc2VjdXJlX2Nvbm5lY3Rpb25zX2hvc3Rfc3VwcG9ydF9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpSRUFEX0VOQ1JZUFRJT05fS0VZX1NJWkU6IHsKLSAgICAgIGF1dG8gcmVhZF9lbmNyeXB0aW9uX2tleV9zaXplX2NvbXBsZXRlX3ZpZXcgPSBSZWFkRW5jcnlwdGlvbktleVNpemVDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZV92aWV3KSk7Ci0gICAgICBBU1NFUlQocmVhZF9lbmNyeXB0aW9uX2tleV9zaXplX2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IHJlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZV9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgY29ubmVjdGlvbl9oYW5kbGUgPSByZWFkX2VuY3J5cHRpb25fa2V5X3NpemVfY29tcGxldGVfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gICAgICB2YWx1ZSA9IHJlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZV9jb21wbGV0ZV92aWV3LkdldEtleVNpemUoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9SRVBMWTogewotICAgICAgYXV0byBsaW5rX2tleV9yZXF1ZXN0X3JlcGx5X2NvbXBsZXRlX3ZpZXcgPSBMaW5rS2V5UmVxdWVzdFJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKGxpbmtfa2V5X3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gbGlua19rZXlfcmVxdWVzdF9yZXBseV9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYXV0byBsaW5rX2tleV9yZXF1ZXN0X3JlcGx5X3ZpZXcgPSBMaW5rS2V5UmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVChsaW5rX2tleV9yZXF1ZXN0X3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBsaW5rX2tleV9yZXF1ZXN0X3JlcGx5X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFk6IHsKLSAgICAgIGF1dG8gbGlua19rZXlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV9jb21wbGV0ZV92aWV3ID0gTGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKGxpbmtfa2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gbGlua19rZXlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYXV0byBsaW5rX2tleV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcgPSBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKGxpbmtfa2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IGxpbmtfa2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZOiB7Ci0gICAgICBhdXRvIGlvX2NhcGFiaWxpdHlfcmVxdWVzdF9yZXBseV9jb21wbGV0ZV92aWV3ID0gSW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKGlvX2NhcGFiaWxpdHlfcmVxdWVzdF9yZXBseV9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBzdGF0dXMgPSBpb19jYXBhYmlsaXR5X3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGF1dG8gaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X3JlcGx5X3ZpZXcgPSBJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKGlvX2NhcGFiaWxpdHlfcmVxdWVzdF9yZXBseV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X3JlcGx5X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWTogewotICAgICAgYXV0byBpb19jYXBhYmlsaXR5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfY29tcGxldGVfdmlldyA9IElvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKGlvX2NhcGFiaWxpdHlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV9jb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBzdGF0dXMgPSBpb19jYXBhYmlsaXR5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGF1dG8gaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcgPSBJb0NhcGFiaWxpdHlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQoaW9fY2FwYWJpbGl0eV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSBpb19jYXBhYmlsaXR5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9SRVBMWTogewotICAgICAgYXV0byB1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X3JlcGx5X2NvbXBsZXRlX3ZpZXcgPSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHVzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF9yZXBseV9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYXV0byB1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X3JlcGx5X3ZpZXcgPSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVCh1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSB1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X3JlcGx5X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OlVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFk6IHsKLSAgICAgIGF1dG8gdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV9jb21wbGV0ZV92aWV3ID0gVXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHVzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV9jb21wbGV0ZV92aWV3LkdldFN0YXR1cygpOwotICAgICAgYXV0byB1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcgPSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHVzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IHVzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6VVNFUl9QQVNTS0VZX1JFUVVFU1RfUkVQTFk6IHsKLSAgICAgIGF1dG8gdXNlcl9wYXNza2V5X3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldyA9IFVzZXJQYXNza2V5UmVxdWVzdFJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHVzZXJfcGFzc2tleV9yZXF1ZXN0X3JlcGx5X2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IHVzZXJfcGFzc2tleV9yZXF1ZXN0X3JlcGx5X2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBhdXRvIHVzZXJfcGFzc2tleV9yZXF1ZXN0X3JlcGx5X3ZpZXcgPSBVc2VyUGFzc2tleVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoc2VjdXJpdHlfY29tbWFuZF92aWV3KSk7Ci0gICAgICBBU1NFUlQodXNlcl9wYXNza2V5X3JlcXVlc3RfcmVwbHlfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgYWRkcmVzcyA9IHVzZXJfcGFzc2tleV9yZXF1ZXN0X3JlcGx5X3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPcENvZGU6OlVTRVJfUEFTU0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZOiB7Ci0gICAgICBhdXRvIHVzZXJfcGFzc2tleV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X2NvbXBsZXRlX3ZpZXcgPSBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHVzZXJfcGFzc2tleV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IHVzZXJfcGFzc2tleV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBhdXRvIHVzZXJfcGFzc2tleV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcgPSBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpKTsKLSAgICAgIEFTU0VSVCh1c2VyX3Bhc3NrZXlfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICBhZGRyZXNzID0gdXNlcl9wYXNza2V5X3JlcXVlc3RfbmVnYXRpdmVfcmVwbHlfdmlldy5HZXRCZEFkZHIoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE9wQ29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFk6IHsKLSAgICAgIGF1dG8gcmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldyA9IFJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHlDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZV92aWV3KSk7Ci0gICAgICBBU1NFUlQocmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgc3RhdHVzID0gcmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfcmVwbHlfY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKTsKLSAgICAgIGF1dG8gcmVtb3RlX29vYl9kYXRhX3JlcXVlc3RfcmVwbHlfdmlldyA9IFJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSByZW1vdGVfb29iX2RhdGFfcmVxdWVzdF9yZXBseV92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT3BDb2RlOjpSRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9ORUdBVElWRV9SRVBMWTogewotICAgICAgYXV0byByZW1vdGVfb29iX2RhdGFfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV9jb21wbGV0ZV92aWV3ID0gUmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfdmlldykpOwotICAgICAgQVNTRVJUKHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X2NvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIHN0YXR1cyA9IHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X2NvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCk7Ci0gICAgICBhdXRvIHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcgPSBSZW1vdGVPb2JEYXRhUmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKHNlY3VyaXR5X2NvbW1hbmRfdmlldykpOwotICAgICAgQVNTRVJUKHJlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgIGFkZHJlc3MgPSByZW1vdGVfb29iX2RhdGFfcmVxdWVzdF9uZWdhdGl2ZV9yZXBseV92aWV3LkdldEJkQWRkcigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLSAgb3M6OkxvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgICBhZGRyZXNzLAotICAgICAgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3BfY29kZSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZXZlbnRfY29kZSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc3RhdHVzKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWFzb24pLAotICAgICAgdmFsdWUpOwotfQotCi12b2lkIGxvZ19yZW1vdGVfZGV2aWNlX2luZm9ybWF0aW9uKAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLCBFcnJvckNvZGUgc3RhdHVzLCBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZSkgewotICBpZiAoYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3Qgc3RvcmFnZTo6RGV2aWNlIGRldmljZSA9IHN0b3JhZ2VfbW9kdWxlLT5HZXREZXZpY2VCeUxlZ2FjeUtleShhZGRyZXNzKTsKLSAgLy8gbG9nIE1hbnVmYWN0dXJlckluZm8KLSAgc3RkOjpzdHJpbmdzdHJlYW0gc2RwX2RpX3ZlbmRvcl9pZF9zb3VyY2U7Ci0gIC8vIFtOIC0gbmF0aXZlXTo6U0RQOjpbRElQIC0gRGV2aWNlIElEIFByb2ZpbGVdCi0gIHNkcF9kaV92ZW5kb3JfaWRfc291cmNlIDw8ICJOOlNEUDo6RElQOjoiIDw8IGNvbW1vbjo6VG9IZXhTdHJpbmcoZGV2aWNlLkdldFNkcERpVmVuZG9ySWRTb3VyY2UoKS52YWx1ZV9vcigwKSkuY19zdHIoKTsKLSAgb3M6OkxvZ01ldHJpY01hbnVmYWN0dXJlckluZm8oCi0gICAgICBhZGRyZXNzLAotICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEZXZpY2VJbmZvU3JjRW51bTo6REVWSUNFX0lORk9fSU5URVJOQUwsCi0gICAgICBzZHBfZGlfdmVuZG9yX2lkX3NvdXJjZS5zdHIoKSwKLSAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcoZGV2aWNlLkdldFNkcERpTWFudWZhY3R1cmVyKCkudmFsdWVfb3IoMCkpLmNfc3RyKCksCi0gICAgICBjb21tb246OlRvSGV4U3RyaW5nKGRldmljZS5HZXRTZHBEaU1vZGVsKCkudmFsdWVfb3IoMCkpLmNfc3RyKCksCi0gICAgICBjb21tb246OlRvSGV4U3RyaW5nKGRldmljZS5HZXRTZHBEaUhhcmR3YXJlVmVyc2lvbigpLnZhbHVlX29yKDApKS5jX3N0cigpLAotICAgICAgIiIpOwotCi0gIC8vIGxvZyBSZW1vdGVWZXJzaW9uSW5mbwotICBvczo6TG9nTWV0cmljUmVtb3RlVmVyc2lvbkluZm8oCi0gICAgICBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0dXMpLAotICAgICAgZGV2aWNlLkdldExtcFZlcnNpb24oKS52YWx1ZV9vcigtMSksCi0gICAgICBkZXZpY2UuR2V0TWFudWZhY3R1cmVyQ29kZSgpLnZhbHVlX29yKC0xKSwKLSAgICAgIGRldmljZS5HZXRMbXBTdWJWZXJzaW9uKCkudmFsdWVfb3IoLTEpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2hjaS9oY2lfbWV0cmljc19sb2dnaW5nLmggYi9nZC9oY2kvaGNpX21ldHJpY3NfbG9nZ2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWY5YzI4Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9oY2lfbWV0cmljc19sb2dnaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgInN0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLXZvaWQgbG9nX2hjaV9ldmVudCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+JiBjb21tYW5kX3ZpZXcsIEV2ZW50VmlldyBwYWNrZXQsIHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGUqIHN0b3JhZ2VfbW9kdWxlKTsKLXZvaWQgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9jb21tYW5kX3N0YXR1cyhzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+JiBjb21tYW5kX3ZpZXcsIEVycm9yQ29kZSBzdGF0dXMpOwotdm9pZCBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2NvbW1hbmRfY29tcGxldGUoRXZlbnRWaWV3IGV2ZW50LCBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFZpZXc+JiBjb21tYW5kX3ZpZXcpOwotdm9pZCBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50X2xlX21ldGEoTGVNZXRhRXZlbnRWaWV3IGxlX21ldGFfZXZlbnRfdmlldyk7Ci12b2lkIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fb3RoZXJfaGNpX2V2ZW50KEV2ZW50VmlldyBwYWNrZXQsIHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGUqIHN0b3JhZ2VfbW9kdWxlKTsKLQotdm9pZCBsb2dfY2xhc3NpY19wYWlyaW5nX2NvbW1hbmRfc3RhdHVzKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kVmlldz4mIGNvbW1hbmRfdmlldywgRXJyb3JDb2RlIHN0YXR1cyk7Ci12b2lkIGxvZ19jbGFzc2ljX3BhaXJpbmdfY29tbWFuZF9jb21wbGV0ZShFdmVudFZpZXcgZXZlbnQsIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kVmlldz4mIGNvbW1hbmRfdmlldyk7Ci12b2lkIGxvZ19jbGFzc2ljX3BhaXJpbmdfb3RoZXJfaGNpX2V2ZW50KEV2ZW50VmlldyBwYWNrZXQpOwotCi12b2lkIGxvZ19yZW1vdGVfZGV2aWNlX2luZm9ybWF0aW9uKAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLCBFcnJvckNvZGUgc3RhdHVzLCBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZSk7Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2hjaV9wYWNrZXRzLnBkbCBiL2dkL2hjaS9oY2lfcGFja2V0cy5wZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDBiMjIuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2hjaV9wYWNrZXRzLnBkbAorKysgL2Rldi9udWxsCkBAIC0xLDU4MzMgKzAsMCBAQAotbGl0dGxlX2VuZGlhbl9wYWNrZXRzCi0KLWN1c3RvbV9maWVsZCBBZGRyZXNzIDogNDggImhjaS8iCi1jdXN0b21fZmllbGQgQ2xhc3NPZkRldmljZSA6IDI0ICJoY2kvIgotCi1lbnVtIEVuYWJsZSA6IDggewotICBESVNBQkxFRCA9IDB4MDAsCi0gIEVOQUJMRUQgPSAweDAxLAotfQotCi0vLyBodHRwczovL3d3dy5ibHVldG9vdGguY29tL3NwZWNpZmljYXRpb25zL2Fzc2lnbmVkLW51bWJlcnMvZ2VuZXJpYy1hY2Nlc3MtcHJvZmlsZQotZW51bSBHYXBEYXRhVHlwZSA6IDggewotICBJTlZBTElEID0gMHgwMCwKLSAgRkxBR1MgPSAweDAxLAotICBJTkNPTVBMRVRFX0xJU1RfMTZfQklUX1VVSURTID0gMHgwMiwKLSAgQ09NUExFVEVfTElTVF8xNl9CSVRfVVVJRFMgPSAweDAzLAotICBJTkNPTVBMRVRFX0xJU1RfMzJfQklUX1VVSURTID0gMHgwNCwKLSAgQ09NUExFVEVfTElTVF8zMl9CSVRfVVVJRFMgPSAweDA1LAotICBJTkNPTVBMRVRFX0xJU1RfMTI4X0JJVF9VVUlEUyA9IDB4MDYsCi0gIENPTVBMRVRFX0xJU1RfMTI4X0JJVF9VVUlEUyA9IDB4MDcsCi0gIFNIT1JURU5FRF9MT0NBTF9OQU1FID0gMHgwOCwKLSAgQ09NUExFVEVfTE9DQUxfTkFNRSA9IDB4MDksCi0gIFRYX1BPV0VSX0xFVkVMID0gMHgwQSwKLSAgQ0xBU1NfT0ZfREVWSUNFID0gMHgwRCwKLSAgU0lNUExFX1BBSVJJTkdfSEFTSF9DID0gMHgwRSwKLSAgU0lNUExFX1BBSVJJTkdfUkFORE9NSVpFUl9SID0gMHgwRiwKLSAgREVWSUNFX0lEID0gMHgxMCwKLSAgU0VDVVJJVFlfTUFOQUdFUl9PT0JfRkxBR1MgPSAweDExLAotICBTTEFWRV9DT05ORUNUSU9OX0lOVEVSVkFMX1JBTkdFID0gMHgxMiwKLSAgTElTVF8xNkJJVF9TRVJWSUNFX1NPTElDSVRBVElPTl9VVUlEUyA9IDB4MTQsCi0gIExJU1RfMTI4QklUX1NFUlZJQ0VfU09MSUNJVEFUSU9OX1VVSURTID0gMHgxNSwKLSAgU0VSVklDRV9EQVRBXzE2X0JJVF9VVUlEUyA9IDB4MTYsCi0gIFBVQkxJQ19UQVJHRVRfQUREUkVTUyA9IDB4MTcsCi0gIFJBTkRPTV9UQVJHRVRfQUREUkVTUyA9IDB4MTgsCi0gIEFQUEVBUkFOQ0UgPSAweDE5LAotICBBRFZFUlRJU0lOR19JTlRFUlZBTCA9IDB4MUEsCi0gIExFX0JMVUVUT09USF9ERVZJQ0VfQUREUkVTUyA9IDB4MUIsCi0gIExFX1JPTEUgPSAweDFDLAotICBTSU1QTEVfUEFJUklOR19IQVNIX0NfMjU2ID0gMHgxRCwKLSAgU0lNUExFX1BBSVJJTkdfUkFORE9NSVpFUl9SXzI1NiA9IDB4MUUsCi0gIExJU1RfMzJCSVRfU0VSVklDRV9TT0xJQ0lUQVRJT05fVVVJRFMgPSAweDFGLAotICBTRVJWSUNFX0RBVEFfMzJfQklUX1VVSURTID0gMHgyMCwKLSAgU0VSVklDRV9EQVRBXzEyOF9CSVRfVVVJRFMgPSAweDIxLAotICBMRV9TRUNVUkVfQ09OTkVDVElPTlNfQ09ORklSTUFUSU9OX1ZBTFVFID0gMHgyMiwKLSAgTEVfU0VDVVJFX0NPTk5FQ1RJT05TX1JBTkRPTV9WQUxVRSA9IDB4MjMsCi0gIFVSSSA9IDB4MjQsCi0gIElORE9PUl9QT1NJVElPTklORyA9IDB4MjUsCi0gIFRSQU5TUE9SVF9ESVNDT1ZFUllfREFUQSA9IDB4MjYsCi0gIExFX1NVUFBPUlRFRF9GRUFUVVJFUyA9IDB4MjcsCi0gIENIQU5ORUxfTUFQX1VQREFURV9JTkRJQ0FUSU9OID0gMHgyOCwKLSAgTUVTSF9QQl9BRFYgPSAweDI5LAotICBNRVNIX01FU1NBR0UgPSAweDJBLAotICBNRVNIX0JFQUNPTiA9IDB4MkIsCi0gIEJJR19JTkZPID0gMHgyQywKLSAgQlJPQURDQVNUX0NPREUgPSAweDJELAotICBUSFJFRV9EX0lORk9STUFUSU9OX0RBVEEgPSAweDNELAotICBNQU5VRkFDVFVSRVJfU1BFQ0lGSUNfREFUQSA9IDB4RkYsCi19Ci0KLXN0cnVjdCBHYXBEYXRhIHsKLSAgX3NpemVfKGRhdGEpIDogOCwgLy8gSW5jbHVkaW5nIG9uZSBieXRlIGZvciBkYXRhX3R5cGUKLSAgZGF0YV90eXBlIDogR2FwRGF0YVR5cGUsCi0gIGRhdGEgOiA4WysxKjhdLAotfQotCi0vLyBIQ0kgQUNMIFBhY2tldHMKLQotZW51bSBQYWNrZXRCb3VuZGFyeUZsYWcgOiAyIHsKLSAgRklSU1RfTk9OX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFID0gMCwKLSAgQ09OVElOVUlOR19GUkFHTUVOVCA9IDEsCi0gIEZJUlNUX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFID0gMiwKLX0KLQotZW51bSBCcm9hZGNhc3RGbGFnIDogMiB7Ci0gIFBPSU5UX1RPX1BPSU5UID0gMCwKLSAgQUNUSVZFX1BFUklQSEVSQUxfQlJPQURDQVNUID0gMSwKLX0KLQotcGFja2V0IEFjbCB7Ci0gIGhhbmRsZSA6IDEyLAotICBwYWNrZXRfYm91bmRhcnlfZmxhZyA6IFBhY2tldEJvdW5kYXJ5RmxhZywKLSAgYnJvYWRjYXN0X2ZsYWcgOiBCcm9hZGNhc3RGbGFnLAotICBfc2l6ZV8oX3BheWxvYWRfKSA6IDE2LAotICBfcGF5bG9hZF8sCi19Ci0KLS8vIEhDSSBTQ08gUGFja2V0cwotCi1lbnVtIFBhY2tldFN0YXR1c0ZsYWcgOiAyIHsKLSAgQ09SUkVDVExZX1JFQ0VJVkVEID0gMCwKLSAgUE9TU0lCTFlfSU5DT01QTEVURSA9IDEsCi0gIE5PX0RBVEEgPSAyLAotICBQQVJUSUFMTFlfTE9TVCA9IDMsCi19Ci0KLXBhY2tldCBTY28gewotICBoYW5kbGUgOiAxMiwKLSAgcGFja2V0X3N0YXR1c19mbGFnIDogUGFja2V0U3RhdHVzRmxhZywKLSAgX3Jlc2VydmVkXyA6IDIsIC8vIEJyb2FkY2FzdEZsYWcKLSAgX3NpemVfKGRhdGEpIDogOCwKLSAgZGF0YSA6IDhbXSwKLX0KLQotLy8gSENJIENvbW1hbmQgUGFja2V0cwotCi1lbnVtIE9wQ29kZSA6IDE2IHsKLSAgTk9ORSA9IDB4MDAwMCwKLQotICAvLyBMSU5LX0NPTlRST0wKLSAgSU5RVUlSWSA9IDB4MDQwMSwKLSAgSU5RVUlSWV9DQU5DRUwgPSAweDA0MDIsCi0gIFBFUklPRElDX0lOUVVJUllfTU9ERSA9IDB4MDQwMywKLSAgRVhJVF9QRVJJT0RJQ19JTlFVSVJZX01PREUgPSAweDA0MDQsCi0gIENSRUFURV9DT05ORUNUSU9OID0gMHgwNDA1LAotICBESVNDT05ORUNUID0gMHgwNDA2LAotICBDUkVBVEVfQ09OTkVDVElPTl9DQU5DRUwgPSAweDA0MDgsCi0gIEFDQ0VQVF9DT05ORUNUSU9OX1JFUVVFU1QgPSAweDA0MDksCi0gIFJFSkVDVF9DT05ORUNUSU9OX1JFUVVFU1QgPSAweDA0MEEsCi0gIExJTktfS0VZX1JFUVVFU1RfUkVQTFkgPSAweDA0MEIsCi0gIExJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAweDA0MEMsCi0gIFBJTl9DT0RFX1JFUVVFU1RfUkVQTFkgPSAweDA0MEQsCi0gIFBJTl9DT0RFX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAweDA0MEUsCi0gIENIQU5HRV9DT05ORUNUSU9OX1BBQ0tFVF9UWVBFID0gMHgwNDBGLAotICBBVVRIRU5USUNBVElPTl9SRVFVRVNURUQgPSAweDA0MTEsCi0gIFNFVF9DT05ORUNUSU9OX0VOQ1JZUFRJT04gPSAweDA0MTMsCi0gIENIQU5HRV9DT05ORUNUSU9OX0xJTktfS0VZID0gMHgwNDE1LAotICBDRU5UUkFMX0xJTktfS0VZID0gMHgwNDE3LAotICBSRU1PVEVfTkFNRV9SRVFVRVNUID0gMHgwNDE5LAotICBSRU1PVEVfTkFNRV9SRVFVRVNUX0NBTkNFTCA9IDB4MDQxQSwKLSAgUkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTID0gMHgwNDFCLAotICBSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUyA9IDB4MDQxQywKLSAgUkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTiA9IDB4MDQxRCwKLSAgUkVBRF9DTE9DS19PRkZTRVQgPSAweDA0MUYsCi0gIFJFQURfTE1QX0hBTkRMRSA9IDB4MDQyMCwKLSAgU0VUVVBfU1lOQ0hST05PVVNfQ09OTkVDVElPTiA9IDB4MDQyOCwKLSAgQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04gPSAweDA0MjksCi0gIFJFSkVDVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OID0gMHgwNDJBLAotICBJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFkgPSAweDA0MkIsCi0gIFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFkgPSAweDA0MkMsCi0gIFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAweDA0MkQsCi0gIFVTRVJfUEFTU0tFWV9SRVFVRVNUX1JFUExZID0gMHgwNDJFLAotICBVU0VSX1BBU1NLRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSA9IDB4MDQyRiwKLSAgUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFkgPSAweDA0MzAsCi0gIFJFTU9URV9PT0JfREFUQV9SRVFVRVNUX05FR0FUSVZFX1JFUExZID0gMHgwNDMzLAotICBJT19DQVBBQklMSVRZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAweDA0MzQsCi0gIEVOSEFOQ0VEX1NFVFVQX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04gPSAweDA0M0QsCi0gIEVOSEFOQ0VEX0FDQ0VQVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OID0gMHgwNDNFLAotICBSRU1PVEVfT09CX0VYVEVOREVEX0RBVEFfUkVRVUVTVF9SRVBMWSA9IDB4MDQ0NSwKLQotICAvLyBMSU5LX1BPTElDWQotICBIT0xEX01PREUgPSAweDA4MDEsCi0gIFNOSUZGX01PREUgPSAweDA4MDMsCi0gIEVYSVRfU05JRkZfTU9ERSA9IDB4MDgwNCwKLSAgUU9TX1NFVFVQID0gMHgwODA3LAotICBST0xFX0RJU0NPVkVSWSA9IDB4MDgwOSwKLSAgU1dJVENIX1JPTEUgPSAweDA4MEIsCi0gIFJFQURfTElOS19QT0xJQ1lfU0VUVElOR1MgPSAweDA4MEMsCi0gIFdSSVRFX0xJTktfUE9MSUNZX1NFVFRJTkdTID0gMHgwODBELAotICBSRUFEX0RFRkFVTFRfTElOS19QT0xJQ1lfU0VUVElOR1MgPSAweDA4MEUsCi0gIFdSSVRFX0RFRkFVTFRfTElOS19QT0xJQ1lfU0VUVElOR1MgPSAweDA4MEYsCi0gIEZMT1dfU1BFQ0lGSUNBVElPTiA9IDB4MDgxMCwKLSAgU05JRkZfU1VCUkFUSU5HID0gMHgwODExLAotCi0gIC8vIENPTlRST0xMRVJfQU5EX0JBU0VCQU5ECi0gIFNFVF9FVkVOVF9NQVNLID0gMHgwQzAxLAotICBSRVNFVCA9IDB4MEMwMywKLSAgU0VUX0VWRU5UX0ZJTFRFUiA9IDB4MEMwNSwKLSAgRkxVU0ggPSAweDBDMDgsCi0gIFJFQURfUElOX1RZUEUgPSAweDBDMDksCi0gIFdSSVRFX1BJTl9UWVBFID0gMHgwQzBBLAotICBSRUFEX1NUT1JFRF9MSU5LX0tFWSA9IDB4MEMwRCwKLSAgV1JJVEVfU1RPUkVEX0xJTktfS0VZID0gMHgwQzExLAotICBERUxFVEVfU1RPUkVEX0xJTktfS0VZID0gMHgwQzEyLAotICBXUklURV9MT0NBTF9OQU1FID0gMHgwQzEzLAotICBSRUFEX0xPQ0FMX05BTUUgPSAweDBDMTQsCi0gIFJFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCA9IDB4MEMxNSwKLSAgV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCA9IDB4MEMxNiwKLSAgUkVBRF9QQUdFX1RJTUVPVVQgPSAweDBDMTcsCi0gIFdSSVRFX1BBR0VfVElNRU9VVCA9IDB4MEMxOCwKLSAgUkVBRF9TQ0FOX0VOQUJMRSA9IDB4MEMxOSwKLSAgV1JJVEVfU0NBTl9FTkFCTEUgPSAweDBDMUEsCi0gIFJFQURfUEFHRV9TQ0FOX0FDVElWSVRZID0gMHgwQzFCLAotICBXUklURV9QQUdFX1NDQU5fQUNUSVZJVFkgPSAweDBDMUMsCi0gIFJFQURfSU5RVUlSWV9TQ0FOX0FDVElWSVRZID0gMHgwQzFELAotICBXUklURV9JTlFVSVJZX1NDQU5fQUNUSVZJVFkgPSAweDBDMUUsCi0gIFJFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFID0gMHgwQzFGLAotICBXUklURV9BVVRIRU5USUNBVElPTl9FTkFCTEUgPSAweDBDMjAsCi0gIFJFQURfQ0xBU1NfT0ZfREVWSUNFID0gMHgwQzIzLAotICBXUklURV9DTEFTU19PRl9ERVZJQ0UgPSAweDBDMjQsCi0gIFJFQURfVk9JQ0VfU0VUVElORyA9IDB4MEMyNSwKLSAgV1JJVEVfVk9JQ0VfU0VUVElORyA9IDB4MEMyNiwKLSAgUkVBRF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCA9IDB4MEMyNywKLSAgV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQgPSAweDBDMjgsCi0gIFJFQURfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUyA9IDB4MEMyOSwKLSAgV1JJVEVfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUyA9IDB4MEMyQSwKLSAgUkVBRF9IT0xEX01PREVfQUNUSVZJVFkgPSAweDBDMkIsCi0gIFdSSVRFX0hPTERfTU9ERV9BQ1RJVklUWSA9IDB4MEMyQywKLSAgUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTCA9IDB4MEMyRCwKLSAgUkVBRF9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFID0gMHgwQzJFLAotICBXUklURV9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFID0gMHgwQzJGLAotICBTRVRfQ09OVFJPTExFUl9UT19IT1NUX0ZMT1dfQ09OVFJPTCA9IDB4MEMzMSwKLSAgSE9TVF9CVUZGRVJfU0laRSA9IDB4MEMzMywKLSAgSE9TVF9OVU1fQ09NUExFVEVEX1BBQ0tFVFMgPSAweDBDMzUsCi0gIFJFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUID0gMHgwQzM2LAotICBXUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQgPSAweDBDMzcsCi0gIFJFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9JQUMgPSAweDBDMzgsCi0gIFJFQURfQ1VSUkVOVF9JQUNfTEFQID0gMHgwQzM5LAotICBXUklURV9DVVJSRU5UX0lBQ19MQVAgPSAweDBDM0EsCi0gIFNFVF9BRkhfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OID0gMHgwQzNGLAotICBSRUFEX0lOUVVJUllfU0NBTl9UWVBFID0gMHgwQzQyLAotICBXUklURV9JTlFVSVJZX1NDQU5fVFlQRSA9IDB4MEM0MywKLSAgUkVBRF9JTlFVSVJZX01PREUgPSAweDBDNDQsCi0gIFdSSVRFX0lOUVVJUllfTU9ERSA9IDB4MEM0NSwKLSAgUkVBRF9QQUdFX1NDQU5fVFlQRSA9IDB4MEM0NiwKLSAgV1JJVEVfUEFHRV9TQ0FOX1RZUEUgPSAweDBDNDcsCi0gIFJFQURfQUZIX0NIQU5ORUxfQVNTRVNTTUVOVF9NT0RFID0gMHgwQzQ4LAotICBXUklURV9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUgPSAweDBDNDksCi0gIFJFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRSA9IDB4MEM1MSwKLSAgV1JJVEVfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRSA9IDB4MEM1MiwKLSAgUkVGUkVTSF9FTkNSWVBUSU9OX0tFWSA9IDB4MEM1MywKLSAgUkVBRF9TSU1QTEVfUEFJUklOR19NT0RFID0gMHgwQzU1LAotICBXUklURV9TSU1QTEVfUEFJUklOR19NT0RFID0gMHgwQzU2LAotICBSRUFEX0xPQ0FMX09PQl9EQVRBID0gMHgwQzU3LAotICBSRUFEX0lOUVVJUllfUkVTUE9OU0VfVFJBTlNNSVRfUE9XRVJfTEVWRUwgPSAweDBDNTgsCi0gIFdSSVRFX0lOUVVJUllfVFJBTlNNSVRfUE9XRVJfTEVWRUwgPSAweDBDNTksCi0gIEVOSEFOQ0VEX0ZMVVNIID0gMHgwQzVGLAotICBTRU5EX0tFWVBSRVNTX05PVElGSUNBVElPTiA9IDB4MEM2MCwKLQotICAvLyBBbGxvdyBzdGFja3MgdG8gZGlzYWJsZSBBTVAgZXZlbnRzCi0gIFNFVF9FVkVOVF9NQVNLX1BBR0VfMiA9IDB4MEM2MywKLQotICBSRUFEX0xFX0hPU1RfU1VQUE9SVCA9IDB4MEM2QywKLSAgV1JJVEVfTEVfSE9TVF9TVVBQT1JUID0gMHgwQzZELAotCi0gIFJFQURfU0VDVVJFX0NPTk5FQ1RJT05TX0hPU1RfU1VQUE9SVCA9IDB4MEM3OSwKLSAgV1JJVEVfU0VDVVJFX0NPTk5FQ1RJT05TX0hPU1RfU1VQUE9SVCA9IDB4MEM3QSwKLSAgUkVBRF9MT0NBTF9PT0JfRVhURU5ERURfREFUQSA9IDB4MEM3RCwKLSAgU0VUX0VDT1NZU1RFTV9CQVNFX0lOVEVSVkFMID0gMHgwQzgyLAotICBDT05GSUdVUkVfREFUQV9QQVRIID0gMHgwQzgzLAotCi0gIC8vIElORk9STUFUSU9OQUxfUEFSQU1FVEVSUwotICBSRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT04gPSAweDEwMDEsCi0gIFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPTU1BTkRTID0gMHgxMDAyLAotICBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUyA9IDB4MTAwMywKLSAgUkVBRF9MT0NBTF9FWFRFTkRFRF9GRUFUVVJFUyA9IDB4MTAwNCwKLSAgUkVBRF9CVUZGRVJfU0laRSA9IDB4MTAwNSwKLSAgUkVBRF9CRF9BRERSID0gMHgxMDA5LAotICBSRUFEX0RBVEFfQkxPQ0tfU0laRSA9IDB4MTAwQSwKLSAgUkVBRF9MT0NBTF9TVVBQT1JURURfQ09ERUNTX1YxID0gMHgxMDBCLAotICBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfVjIgPSAweDEwMEQsCi0gIFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDX0NBUEFCSUxJVElFUyA9IDB4MTAwRSwKLSAgUkVBRF9MT0NBTF9TVVBQT1JURURfQ09OVFJPTExFUl9ERUxBWSA9IDB4MTAwRiwKLQotICAvLyBTVEFUVVNfUEFSQU1FVEVSUwotICBSRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIgPSAweDE0MDEsCi0gIFJFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIgPSAweDE0MDIsCi0gIFJFQURfTElOS19RVUFMSVRZID0gMHgxNDAzLAotICBSRUFEX1JTU0kgPSAweDE0MDUsCi0gIFJFQURfQUZIX0NIQU5ORUxfTUFQID0gMHgxNDA2LAotICBSRUFEX0NMT0NLID0gMHgxNDA3LAotICBSRUFEX0VOQ1JZUFRJT05fS0VZX1NJWkUgPSAweDE0MDgsCi0KLSAgLy8gVEVTVElORwotICBSRUFEX0xPT1BCQUNLX01PREUgPSAweDE4MDEsCi0gIFdSSVRFX0xPT1BCQUNLX01PREUgPSAweDE4MDIsCi0gIEVOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFID0gMHgxODAzLAotICBXUklURV9TSU1QTEVfUEFJUklOR19ERUJVR19NT0RFID0gMHgxODA0LAotICBXUklURV9TRUNVUkVfQ09OTkVDVElPTlNfVEVTVF9NT0RFID0gMHgxODBBLAotCi0gIC8vIExFX0NPTlRST0xMRVIKLSAgTEVfU0VUX0VWRU5UX01BU0sgPSAweDIwMDEsCi0gIExFX1JFQURfQlVGRkVSX1NJWkVfVjEgPSAweDIwMDIsCi0gIExFX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTID0gMHgyMDAzLAotICBMRV9TRVRfUkFORE9NX0FERFJFU1MgPSAweDIwMDUsCi0gIExFX1NFVF9BRFZFUlRJU0lOR19QQVJBTUVURVJTID0gMHgyMDA2LAotICBMRV9SRUFEX0FEVkVSVElTSU5HX1BIWVNJQ0FMX0NIQU5ORUxfVFhfUE9XRVIgPSAweDIwMDcsCi0gIExFX1NFVF9BRFZFUlRJU0lOR19EQVRBID0gMHgyMDA4LAotICBMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBID0gMHgyMDA5LAotICBMRV9TRVRfQURWRVJUSVNJTkdfRU5BQkxFID0gMHgyMDBBLAotICBMRV9TRVRfU0NBTl9QQVJBTUVURVJTID0gMHgyMDBCLAotICBMRV9TRVRfU0NBTl9FTkFCTEUgPSAweDIwMEMsCi0gIExFX0NSRUFURV9DT05ORUNUSU9OID0gMHgyMDBELAotICBMRV9DUkVBVEVfQ09OTkVDVElPTl9DQU5DRUwgPSAweDIwMEUsCi0gIExFX1JFQURfQ09OTkVDVF9MSVNUX1NJWkUgPSAweDIwMEYsCi0gIExFX0NMRUFSX0NPTk5FQ1RfTElTVCA9IDB4MjAxMCwKLSAgTEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QgPSAweDIwMTEsCi0gIExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QgPSAweDIwMTIsCi0gIExFX0NPTk5FQ1RJT05fVVBEQVRFID0gMHgyMDEzLAotICBMRV9TRVRfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OID0gMHgyMDE0LAotICBMRV9SRUFEX0NIQU5ORUxfTUFQID0gMHgyMDE1LAotICBMRV9SRUFEX1JFTU9URV9GRUFUVVJFUyA9IDB4MjAxNiwKLSAgTEVfRU5DUllQVCA9IDB4MjAxNywKLSAgTEVfUkFORCA9IDB4MjAxOCwKLSAgTEVfU1RBUlRfRU5DUllQVElPTiA9IDB4MjAxOSwKLSAgTEVfTE9OR19URVJNX0tFWV9SRVFVRVNUX1JFUExZID0gMHgyMDFBLAotICBMRV9MT05HX1RFUk1fS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAweDIwMUIsCi0gIExFX1JFQURfU1VQUE9SVEVEX1NUQVRFUyA9IDB4MjAxQywKLSAgTEVfUkVDRUlWRVJfVEVTVCA9IDB4MjAxRCwKLSAgTEVfVFJBTlNNSVRURVJfVEVTVCA9IDB4MjAxRSwKLSAgTEVfVEVTVF9FTkQgPSAweDIwMUYsCi0gIExFX1JFTU9URV9DT05ORUNUSU9OX1BBUkFNRVRFUl9SRVFVRVNUX1JFUExZID0gMHgyMDIwLAotICBMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSA9IDB4MjAyMSwKLQotICBMRV9TRVRfREFUQV9MRU5HVEggPSAweDIwMjIsCi0gIExFX1JFQURfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEggPSAweDIwMjMsCi0gIExFX1dSSVRFX1NVR0dFU1RFRF9ERUZBVUxUX0RBVEFfTEVOR1RIID0gMHgyMDI0LAotICBMRV9SRUFEX0xPQ0FMX1BfMjU2X1BVQkxJQ19LRVlfQ09NTUFORCA9IDB4MjAyNSwKLSAgTEVfR0VORVJBVEVfREhLRVlfQ09NTUFORF9WMSA9IDB4MjAyNiwKLSAgTEVfQUREX0RFVklDRV9UT19SRVNPTFZJTkdfTElTVCA9IDB4MjAyNywKLSAgTEVfUkVNT1ZFX0RFVklDRV9GUk9NX1JFU09MVklOR19MSVNUID0gMHgyMDI4LAotICBMRV9DTEVBUl9SRVNPTFZJTkdfTElTVCA9IDB4MjAyOSwKLSAgTEVfUkVBRF9SRVNPTFZJTkdfTElTVF9TSVpFID0gMHgyMDJBLAotICBMRV9SRUFEX1BFRVJfUkVTT0xWQUJMRV9BRERSRVNTID0gMHgyMDJCLAotICBMRV9SRUFEX0xPQ0FMX1JFU09MVkFCTEVfQUREUkVTUyA9IDB4MjAyQywKLSAgTEVfU0VUX0FERFJFU1NfUkVTT0xVVElPTl9FTkFCTEUgPSAweDIwMkQsCi0gIExFX1NFVF9SRVNPTFZBQkxFX1BSSVZBVEVfQUREUkVTU19USU1FT1VUID0gMHgyMDJFLAotICBMRV9SRUFEX01BWElNVU1fREFUQV9MRU5HVEggPSAweDIwMkYsCi0gIExFX1JFQURfUEhZID0gMHgyMDMwLAotICBMRV9TRVRfREVGQVVMVF9QSFkgPSAweDIwMzEsCi0gIExFX1NFVF9QSFkgPSAweDIwMzIsCi0gIExFX0VOSEFOQ0VEX1JFQ0VJVkVSX1RFU1QgPSAweDIwMzMsCi0gIExFX0VOSEFOQ0VEX1RSQU5TTUlUVEVSX1RFU1QgPSAweDIwMzQsCi0gIExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19SQU5ET01fQUREUkVTUyA9IDB4MjAzNSwKLSAgTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMgPSAweDIwMzYsCi0gIExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19EQVRBID0gMHgyMDM3LAotICBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfU0NBTl9SRVNQT05TRSA9IDB4MjAzOCwKLSAgTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSA9IDB4MjAzOSwKLSAgTEVfUkVBRF9NQVhJTVVNX0FEVkVSVElTSU5HX0RBVEFfTEVOR1RIID0gMHgyMDNBLAotICBMRV9SRUFEX05VTUJFUl9PRl9TVVBQT1JURURfQURWRVJUSVNJTkdfU0VUUyA9IDB4MjAzQiwKLSAgTEVfUkVNT1ZFX0FEVkVSVElTSU5HX1NFVCA9IDB4MjAzQywKLSAgTEVfQ0xFQVJfQURWRVJUSVNJTkdfU0VUUyA9IDB4MjAzRCwKLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1BBUkFNID0gMHgyMDNFLAotICBMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfREFUQSA9IDB4MjAzRiwKLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSA9IDB4MjA0MCwKLSAgTEVfU0VUX0VYVEVOREVEX1NDQU5fUEFSQU1FVEVSUyA9IDB4MjA0MSwKLSAgTEVfU0VUX0VYVEVOREVEX1NDQU5fRU5BQkxFID0gMHgyMDQyLAotICBMRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTiA9IDB4MjA0MywKLSAgTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkMgPSAweDIwNDQsCi0gIExFX1BFUklPRElDX0FEVkVSVElTSU5HX0NSRUFURV9TWU5DX0NBTkNFTCA9IDB4MjA0NSwKLSAgTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfVEVSTUlOQVRFX1NZTkMgPSAweDIwNDYsCi0gIExFX0FERF9ERVZJQ0VfVE9fUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVCA9IDB4MjA0NywKLSAgTEVfUkVNT1ZFX0RFVklDRV9GUk9NX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1QgPSAweDIwNDgsCi0gIExFX0NMRUFSX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1QgPSAweDIwNDksCi0gIExFX1JFQURfUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVF9TSVpFID0gMHgyMDRBLAotICBMRV9SRUFEX1RSQU5TTUlUX1BPV0VSID0gMHgyMDRCLAotICBMRV9SRUFEX1JGX1BBVEhfQ09NUEVOU0FUSU9OX1BPV0VSID0gMHgyMDRDLAotICBMRV9XUklURV9SRl9QQVRIX0NPTVBFTlNBVElPTl9QT1dFUiA9IDB4MjA0RCwKLSAgTEVfU0VUX1BSSVZBQ1lfTU9ERSA9IDB4MjA0RSwKLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1JFQ0VJVkVfRU5BQkxFID0gMHgyMDU5LAotICBMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSID0gMHgyMDVBLAotICBMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TRVRfSU5GT19UUkFOU0ZFUiA9IDB4MjA1QiwKLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU1FVEVSUyA9IDB4MjA1QywKLSAgTEVfU0VUX0RFRkFVTFRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTUVURVJTID0gMHgyMDVELAotICBMRV9HRU5FUkFURV9ESEtFWV9DT01NQU5EID0gMHgyMDVFLAotICBMRV9NT0RJRllfU0xFRVBfQ0xPQ0tfQUNDVVJBQ1kgPSAweDIwNUYsCi0gIExFX1JFQURfQlVGRkVSX1NJWkVfVjIgPSAweDIwNjAsCi0gIExFX1JFQURfSVNPX1RYX1NZTkMgPSAweDIwNjEsCi0gIExFX1NFVF9DSUdfUEFSQU1FVEVSUyA9IDB4MjA2MiwKLSAgTEVfU0VUX0NJR19QQVJBTUVURVJTX1RFU1QgPSAweDIwNjMsCi0gIExFX0NSRUFURV9DSVMgPSAweDIwNjQsCi0gIExFX1JFTU9WRV9DSUcgPSAweDIwNjUsCi0gIExFX0FDQ0VQVF9DSVNfUkVRVUVTVCA9IDB4MjA2NiwKLSAgTEVfUkVKRUNUX0NJU19SRVFVRVNUID0gMHgyMDY3LAotICBMRV9DUkVBVEVfQklHID0gMHgyMDY4LAotICBMRV9URVJNSU5BVEVfQklHID0gMHgyMDZBLAotICBMRV9CSUdfQ1JFQVRFX1NZTkMgPSAweDIwNkIsCi0gIExFX0JJR19URVJNSU5BVEVfU1lOQyA9IDB4MjA2QywKLSAgTEVfUkVRVUVTVF9QRUVSX1NDQSA9IDB4MjA2RCwKLSAgTEVfU0VUVVBfSVNPX0RBVEFfUEFUSCA9IDB4MjA2RSwKLSAgTEVfUkVNT1ZFX0lTT19EQVRBX1BBVEggPSAweDIwNkYsCi0gIExFX1NFVF9IT1NUX0ZFQVRVUkUgPSAweDIwNzQsCi0gIExFX1JFQURfSVNPX0xJTktfUVVBTElUWSA9IDB4MjA3NSwKLSAgTEVfRU5IQU5DRURfUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTCA9IDB4MjA3NiwKLSAgTEVfUkVBRF9SRU1PVEVfVFJBTlNNSVRfUE9XRVJfTEVWRUwgPSAweDIwNzcsCi0gIExFX1NFVF9QQVRIX0xPU1NfUkVQT1JUSU5HX1BBUkFNRVRFUlMgPSAweDIwNzgsCi0gIExFX1NFVF9QQVRIX0xPU1NfUkVQT1JUSU5HX0VOQUJMRSA9IDB4MjA3OSwKLSAgTEVfU0VUX1RSQU5TTUlUX1BPV0VSX1JFUE9SVElOR19FTkFCTEUgPSAweDIwN0EsCi0KLSAgLy8gVkVORE9SX1NQRUNJRklDCi0gIExFX0dFVF9WRU5ET1JfQ0FQQUJJTElUSUVTID0gMHhGRDUzLAotICBMRV9NVUxUSV9BRFZUID0gMHhGRDU0LAotICBMRV9CQVRDSF9TQ0FOID0gMHhGRDU2LAotICBMRV9BRFZfRklMVEVSID0gMHhGRDU3LAotICBMRV9FTkVSR1lfSU5GTyA9IDB4RkQ1OSwKLSAgTEVfRVhURU5ERURfU0NBTl9QQVJBTVMgPSAweEZENUEsCi0gIENPTlRST0xMRVJfREVCVUdfSU5GTyA9IDB4RkQ1QiwKLSAgQ09OVFJPTExFUl9BMkRQX09QQ09ERSA9IDB4RkQ1RCwKLSAgQ09OVFJPTExFUl9CUVIgPSAweEZENUUsCi19Ci0KLS8vIEZvciBtYXBwaW5nIExvY2FsIFN1cHBvcnRlZCBDb21tYW5kcyBjb21tYW5kCi0vLyBWYWx1ZSA9IE9jdGV0ICogMTAgKyBiaXQKLWVudW0gT3BDb2RlSW5kZXggOiAxNiB7Ci0gIElOUVVJUlkgPSAwLAotICBJTlFVSVJZX0NBTkNFTCA9IDEsCi0gIFBFUklPRElDX0lOUVVJUllfTU9ERSA9IDIsCi0gIEVYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFID0gMywKLSAgQ1JFQVRFX0NPTk5FQ1RJT04gPSA0LAotICBESVNDT05ORUNUID0gNSwKLSAgQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMID0gNywKLSAgQUNDRVBUX0NPTk5FQ1RJT05fUkVRVUVTVCA9IDEwLAotICBSRUpFQ1RfQ09OTkVDVElPTl9SRVFVRVNUID0gMTEsCi0gIExJTktfS0VZX1JFUVVFU1RfUkVQTFkgPSAxMiwKLSAgTElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSA9IDEzLAotICBQSU5fQ09ERV9SRVFVRVNUX1JFUExZID0gMTQsCi0gIFBJTl9DT0RFX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAxNSwKLSAgQ0hBTkdFX0NPTk5FQ1RJT05fUEFDS0VUX1RZUEUgPSAxNiwKLSAgQVVUSEVOVElDQVRJT05fUkVRVUVTVEVEID0gMTcsCi0gIFNFVF9DT05ORUNUSU9OX0VOQ1JZUFRJT04gPSAyMCwKLSAgQ0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVkgPSAyMSwKLSAgQ0VOVFJBTF9MSU5LX0tFWSA9IDIyLAotICBSRU1PVEVfTkFNRV9SRVFVRVNUID0gMjMsCi0gIFJFTU9URV9OQU1FX1JFUVVFU1RfQ0FOQ0VMID0gMjQsCi0gIFJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFUyA9IDI1LAotICBSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUyA9IDI2LAotICBSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OID0gMjcsCi0gIFJFQURfQ0xPQ0tfT0ZGU0VUID0gMzAsCi0gIFJFQURfTE1QX0hBTkRMRSA9IDMxLAotICBIT0xEX01PREUgPSA0MSwKLSAgU05JRkZfTU9ERSA9IDQyLAotICBFWElUX1NOSUZGX01PREUgPSA0MywKLSAgUU9TX1NFVFVQID0gNDYsCi0gIFJPTEVfRElTQ09WRVJZID0gNDcsCi0gIFNXSVRDSF9ST0xFID0gNTAsCi0gIFJFQURfTElOS19QT0xJQ1lfU0VUVElOR1MgPSA1MSwKLSAgV1JJVEVfTElOS19QT0xJQ1lfU0VUVElOR1MgPSA1MiwKLSAgUkVBRF9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTID0gNTMsCi0gIFdSSVRFX0RFRkFVTFRfTElOS19QT0xJQ1lfU0VUVElOR1MgPSA1NCwKLSAgRkxPV19TUEVDSUZJQ0FUSU9OID0gNTUsCi0gIFNFVF9FVkVOVF9NQVNLID0gNTYsCi0gIFJFU0VUID0gNTcsCi0gIFNFVF9FVkVOVF9GSUxURVIgPSA2MCwKLSAgRkxVU0ggPSA2MSwKLSAgUkVBRF9QSU5fVFlQRSA9IDYyLAotICBXUklURV9QSU5fVFlQRSA9IDYzLAotICBSRUFEX1NUT1JFRF9MSU5LX0tFWSA9IDY1LAotICBXUklURV9TVE9SRURfTElOS19LRVkgPSA2NiwKLSAgREVMRVRFX1NUT1JFRF9MSU5LX0tFWSA9IDY3LAotICBXUklURV9MT0NBTF9OQU1FID0gNzAsCi0gIFJFQURfTE9DQUxfTkFNRSA9IDcxLAotICBSRUFEX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQgPSA3MiwKLSAgV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCA9IDczLAotICBSRUFEX1BBR0VfVElNRU9VVCA9IDc0LAotICBXUklURV9QQUdFX1RJTUVPVVQgPSA3NSwKLSAgUkVBRF9TQ0FOX0VOQUJMRSA9IDc2LAotICBXUklURV9TQ0FOX0VOQUJMRSA9IDc3LAotICBSRUFEX1BBR0VfU0NBTl9BQ1RJVklUWSA9IDgwLAotICBXUklURV9QQUdFX1NDQU5fQUNUSVZJVFkgPSA4MSwKLSAgUkVBRF9JTlFVSVJZX1NDQU5fQUNUSVZJVFkgPSA4MiwKLSAgV1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZID0gODMsCi0gIFJFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFID0gODQsCi0gIFdSSVRFX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRSA9IDg1LAotICBSRUFEX0NMQVNTX09GX0RFVklDRSA9IDkwLAotICBXUklURV9DTEFTU19PRl9ERVZJQ0UgPSA5MSwKLSAgUkVBRF9WT0lDRV9TRVRUSU5HID0gOTIsCi0gIFdSSVRFX1ZPSUNFX1NFVFRJTkcgPSA5MywKLSAgUkVBRF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCA9IDk0LAotICBXUklURV9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCA9IDk1LAotICBSRUFEX05VTV9CUk9BRENBU1RfUkVUUkFOU01JVFMgPSA5NiwKLSAgV1JJVEVfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUyA9IDk3LAotICBSRUFEX0hPTERfTU9ERV9BQ1RJVklUWSA9IDEwMCwKLSAgV1JJVEVfSE9MRF9NT0RFX0FDVElWSVRZID0gMTAxLAotICBSRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMID0gMTAyLAotICBSRUFEX1NZTkNIUk9OT1VTX0ZMT1dfQ09OVFJPTF9FTkFCTEUgPSAxMDMsCi0gIFdSSVRFX1NZTkNIUk9OT1VTX0ZMT1dfQ09OVFJPTF9FTkFCTEUgPSAxMDQsCi0gIFNFVF9DT05UUk9MTEVSX1RPX0hPU1RfRkxPV19DT05UUk9MID0gMTA1LAotICBIT1NUX0JVRkZFUl9TSVpFID0gMTA2LAotICBIT1NUX05VTV9DT01QTEVURURfUEFDS0VUUyA9IDEwNywKLSAgUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQgPSAxMTAsCi0gIFdSSVRFX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVCA9IDExMSwKLSAgUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0lBQyA9IDExMiwKLSAgUkVBRF9DVVJSRU5UX0lBQ19MQVAgPSAxMTMsCi0gIFdSSVRFX0NVUlJFTlRfSUFDX0xBUCA9IDExNCwKLSAgU0VUX0FGSF9IT1NUX0NIQU5ORUxfQ0xBU1NJRklDQVRJT04gPSAxMjEsCi0gIFJFQURfSU5RVUlSWV9TQ0FOX1RZUEUgPSAxMjQsCi0gIFdSSVRFX0lOUVVJUllfU0NBTl9UWVBFID0gMTI1LAotICBSRUFEX0lOUVVJUllfTU9ERSA9IDEyNiwKLSAgV1JJVEVfSU5RVUlSWV9NT0RFID0gMTI3LAotICBSRUFEX1BBR0VfU0NBTl9UWVBFID0gMTMwLAotICBXUklURV9QQUdFX1NDQU5fVFlQRSA9IDEzMSwKLSAgUkVBRF9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUgPSAxMzIsCi0gIFdSSVRFX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERSA9IDEzMywKLSAgUkVBRF9MT0NBTF9WRVJTSU9OX0lORk9STUFUSU9OID0gMTQzLAotICBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUyA9IDE0NSwKLSAgUkVBRF9MT0NBTF9FWFRFTkRFRF9GRUFUVVJFUyA9IDE0NiwKLSAgUkVBRF9CVUZGRVJfU0laRSA9IDE0NywKLSAgUkVBRF9CRF9BRERSID0gMTUxLAotICBSRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIgPSAxNTIsCi0gIFJFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIgPSAxNTMsCi0gIFJFQURfTElOS19RVUFMSVRZID0gMTU0LAotICBSRUFEX1JTU0kgPSAxNTUsCi0gIFJFQURfQUZIX0NIQU5ORUxfTUFQID0gMTU2LAotICBSRUFEX0NMT0NLID0gMTU3LAotICBSRUFEX0xPT1BCQUNLX01PREUgPSAxNjAsCi0gIFdSSVRFX0xPT1BCQUNLX01PREUgPSAxNjEsCi0gIEVOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFID0gMTYyLAotICBTRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OID0gMTYzLAotICBBQ0NFUFRfU1lOQ0hST05PVVNfQ09OTkVDVElPTiA9IDE2NCwKLSAgUkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04gPSAxNjUsCi0gIFJFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRSA9IDE3MCwKLSAgV1JJVEVfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRSA9IDE3MSwKLSAgUkVGUkVTSF9FTkNSWVBUSU9OX0tFWSA9IDE3MiwKLSAgU05JRkZfU1VCUkFUSU5HID0gMTc0LAotICBSRUFEX1NJTVBMRV9QQUlSSU5HX01PREUgPSAxNzUsCi0gIFdSSVRFX1NJTVBMRV9QQUlSSU5HX01PREUgPSAxNzYsCi0gIFJFQURfTE9DQUxfT09CX0RBVEEgPSAxNzcsCi0gIFJFQURfSU5RVUlSWV9SRVNQT05TRV9UUkFOU01JVF9QT1dFUl9MRVZFTCA9IDE4MCwKLSAgV1JJVEVfSU5RVUlSWV9UUkFOU01JVF9QT1dFUl9MRVZFTCA9IDE4MSwKLSAgSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZID0gMTg3LAotICBVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZID0gMTkwLAotICBVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX05FR0FUSVZFX1JFUExZID0gMTkxLAotICBVU0VSX1BBU1NLRVlfUkVRVUVTVF9SRVBMWSA9IDE5MiwKLSAgVVNFUl9QQVNTS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAxOTMsCi0gIFJFTU9URV9PT0JfREFUQV9SRVFVRVNUX1JFUExZID0gMTk0LAotICBXUklURV9TSU1QTEVfUEFJUklOR19ERUJVR19NT0RFID0gMTk1LAotICBFTkhBTkNFRF9GTFVTSCA9IDE5NiwKLSAgUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAxOTcsCi0gIFNFTkRfS0VZUFJFU1NfTk9USUZJQ0FUSU9OID0gMjAyLAotICBJT19DQVBBQklMSVRZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAyMDMsCi0gIFJFQURfRU5DUllQVElPTl9LRVlfU0laRSA9IDIwNCwKLSAgU0VUX0VWRU5UX01BU0tfUEFHRV8yID0gMjIyLAotICBSRUFEX0RBVEFfQkxPQ0tfU0laRSA9IDIzMiwKLSAgUkVBRF9MRV9IT1NUX1NVUFBPUlQgPSAyNDUsCi0gIFdSSVRFX0xFX0hPU1RfU1VQUE9SVCA9IDI0NiwKLSAgTEVfU0VUX0VWRU5UX01BU0sgPSAyNTAsCi0gIExFX1JFQURfQlVGRkVSX1NJWkVfVjEgPSAyNTEsCi0gIExFX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTID0gMjUyLAotICBMRV9TRVRfUkFORE9NX0FERFJFU1MgPSAyNTQsCi0gIExFX1NFVF9BRFZFUlRJU0lOR19QQVJBTUVURVJTID0gMjU1LAotICBMRV9SRUFEX0FEVkVSVElTSU5HX1BIWVNJQ0FMX0NIQU5ORUxfVFhfUE9XRVIgPSAyNTYsCi0gIExFX1NFVF9BRFZFUlRJU0lOR19EQVRBID0gMjU3LAotICBMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBID0gMjYwLAotICBMRV9TRVRfQURWRVJUSVNJTkdfRU5BQkxFID0gMjYxLAotICBMRV9TRVRfU0NBTl9QQVJBTUVURVJTID0gMjYyLAotICBMRV9TRVRfU0NBTl9FTkFCTEUgPSAyNjMsCi0gIExFX0NSRUFURV9DT05ORUNUSU9OID0gMjY0LAotICBMRV9DUkVBVEVfQ09OTkVDVElPTl9DQU5DRUwgPSAyNjUsCi0gIExFX1JFQURfQ09OTkVDVF9MSVNUX1NJWkUgPSAyNjYsCi0gIExFX0NMRUFSX0NPTk5FQ1RfTElTVCA9IDI2NywKLSAgTEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QgPSAyNzAsCi0gIExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QgPSAyNzEsCi0gIExFX0NPTk5FQ1RJT05fVVBEQVRFID0gMjcyLAotICBMRV9TRVRfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OID0gMjczLAotICBMRV9SRUFEX0NIQU5ORUxfTUFQID0gMjc0LAotICBMRV9SRUFEX1JFTU9URV9GRUFUVVJFUyA9IDI3NSwKLSAgTEVfRU5DUllQVCA9IDI3NiwKLSAgTEVfUkFORCA9IDI3NywKLSAgTEVfU1RBUlRfRU5DUllQVElPTiA9IDI4MCwKLSAgTEVfTE9OR19URVJNX0tFWV9SRVFVRVNUX1JFUExZID0gMjgxLAotICBMRV9MT05HX1RFUk1fS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkgPSAyODIsCi0gIExFX1JFQURfU1VQUE9SVEVEX1NUQVRFUyA9IDI4MywKLSAgTEVfUkVDRUlWRVJfVEVTVCA9IDI4NCwKLSAgTEVfVFJBTlNNSVRURVJfVEVTVCA9IDI4NSwKLSAgTEVfVEVTVF9FTkQgPSAyODYsCi0gIEVOSEFOQ0VEX1NFVFVQX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04gPSAyOTMsCi0gIEVOSEFOQ0VEX0FDQ0VQVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OID0gMjk0LAotICBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfVjEgPSAyOTUsCi0gIFJFTU9URV9PT0JfRVhURU5ERURfREFUQV9SRVFVRVNUX1JFUExZID0gMzIxLAotICBSRUFEX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQgPSAzMjIsCi0gIFdSSVRFX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQgPSAzMjMsCi0gIFJFQURfTE9DQUxfT09CX0VYVEVOREVEX0RBVEEgPSAzMjYsCi0gIFdSSVRFX1NFQ1VSRV9DT05ORUNUSU9OU19URVNUX01PREUgPSAzMjcsCi0gIExFX1JFTU9URV9DT05ORUNUSU9OX1BBUkFNRVRFUl9SRVFVRVNUX1JFUExZID0gMzM0LAotICBMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSA9IDMzNSwKLSAgTEVfU0VUX0RBVEFfTEVOR1RIID0gMzM2LAotICBMRV9SRUFEX1NVR0dFU1RFRF9ERUZBVUxUX0RBVEFfTEVOR1RIID0gMzM3LAotICBMRV9XUklURV9TVUdHRVNURURfREVGQVVMVF9EQVRBX0xFTkdUSCA9IDM0MCwKLSAgTEVfUkVBRF9MT0NBTF9QXzI1Nl9QVUJMSUNfS0VZX0NPTU1BTkQgPSAzNDEsCi0gIExFX0dFTkVSQVRFX0RIS0VZX0NPTU1BTkRfVjEgPSAzNDIsCi0gIExFX0FERF9ERVZJQ0VfVE9fUkVTT0xWSU5HX0xJU1QgPSAzNDMsCi0gIExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9SRVNPTFZJTkdfTElTVCA9IDM0NCwKLSAgTEVfQ0xFQVJfUkVTT0xWSU5HX0xJU1QgPSAzNDUsCi0gIExFX1JFQURfUkVTT0xWSU5HX0xJU1RfU0laRSA9IDM0NiwKLSAgTEVfUkVBRF9QRUVSX1JFU09MVkFCTEVfQUREUkVTUyA9IDM0NywKLSAgTEVfUkVBRF9MT0NBTF9SRVNPTFZBQkxFX0FERFJFU1MgPSAzNTAsCi0gIExFX1NFVF9BRERSRVNTX1JFU09MVVRJT05fRU5BQkxFID0gMzUxLAotICBMRV9TRVRfUkVTT0xWQUJMRV9QUklWQVRFX0FERFJFU1NfVElNRU9VVCA9IDM1MiwKLSAgTEVfUkVBRF9NQVhJTVVNX0RBVEFfTEVOR1RIID0gMzUzLAotICBMRV9SRUFEX1BIWSA9IDM1NCwKLSAgTEVfU0VUX0RFRkFVTFRfUEhZID0gMzU1LAotICBMRV9TRVRfUEhZID0gMzU2LAotICBMRV9FTkhBTkNFRF9SRUNFSVZFUl9URVNUID0gMzU3LAotICBMRV9FTkhBTkNFRF9UUkFOU01JVFRFUl9URVNUID0gMzYwLAotICBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUkFORE9NX0FERFJFU1MgPSAzNjEsCi0gIExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19QQVJBTUVURVJTID0gMzYyLAotICBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfREFUQSA9IDM2MywKLSAgTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1NDQU5fUkVTUE9OU0UgPSAzNjQsCi0gIExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19FTkFCTEUgPSAzNjUsCi0gIExFX1JFQURfTUFYSU1VTV9BRFZFUlRJU0lOR19EQVRBX0xFTkdUSCA9IDM2NiwKLSAgTEVfUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0FEVkVSVElTSU5HX1NFVFMgPSAzNjcsCi0gIExFX1JFTU9WRV9BRFZFUlRJU0lOR19TRVQgPSAzNzAsCi0gIExFX0NMRUFSX0FEVkVSVElTSU5HX1NFVFMgPSAzNzEsCi0gIExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19QQVJBTSA9IDM3MiwKLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0RBVEEgPSAzNzMsCi0gIExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19FTkFCTEUgPSAzNzQsCi0gIExFX1NFVF9FWFRFTkRFRF9TQ0FOX1BBUkFNRVRFUlMgPSAzNzUsCi0gIExFX1NFVF9FWFRFTkRFRF9TQ0FOX0VOQUJMRSA9IDM3NiwKLSAgTEVfRVhURU5ERURfQ1JFQVRFX0NPTk5FQ1RJT04gPSAzNzcsCi0gIExFX1BFUklPRElDX0FEVkVSVElTSU5HX0NSRUFURV9TWU5DID0gMzgwLAotICBMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQ19DQU5DRUwgPSAzODEsCi0gIExFX1BFUklPRElDX0FEVkVSVElTSU5HX1RFUk1JTkFURV9TWU5DID0gMzgyLAotICBMRV9BRERfREVWSUNFX1RPX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1QgPSAzODMsCi0gIExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUID0gMzg0LAotICBMRV9DTEVBUl9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUID0gMzg1LAotICBMRV9SRUFEX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1RfU0laRSA9IDM4NiwKLSAgTEVfUkVBRF9UUkFOU01JVF9QT1dFUiA9IDM4NywKLSAgTEVfUkVBRF9SRl9QQVRIX0NPTVBFTlNBVElPTl9QT1dFUiA9IDM5MCwKLSAgTEVfV1JJVEVfUkZfUEFUSF9DT01QRU5TQVRJT05fUE9XRVIgPSAzOTEsCi0gIExFX1NFVF9QUklWQUNZX01PREUgPSAzOTIsCi0KLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1JFQ0VJVkVfRU5BQkxFID0gNDA1LAotICBMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSID0gNDA2LAotICBMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TRVRfSU5GT19UUkFOU0ZFUiA9IDQwNywKLSAgTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU1FVEVSUyA9IDQxMCwKLSAgTEVfU0VUX0RFRkFVTFRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTUVURVJTID0gNDExLAotICBMRV9HRU5FUkFURV9ESEtFWV9DT01NQU5EID0gNDEyLAotICBMRV9NT0RJRllfU0xFRVBfQ0xPQ0tfQUNDVVJBQ1kgPSA0MTQsCi0gIExFX1JFQURfQlVGRkVSX1NJWkVfVjIgPSA0MTUsCi0gIExFX1JFQURfSVNPX1RYX1NZTkMgPSA0MTYsCi0gIExFX1NFVF9DSUdfUEFSQU1FVEVSUyA9IDQxNywKLSAgTEVfU0VUX0NJR19QQVJBTUVURVJTX1RFU1QgPSA0MTgsCi0gIExFX0NSRUFURV9DSVMgPSA0MjEsCi0gIExFX1JFTU9WRV9DSUcgPSA0MjIsCi0gIExFX0FDQ0VQVF9DSVNfUkVRVUVTVCA9IDQyMywKLSAgTEVfUkVKRUNUX0NJU19SRVFVRVNUID0gNDI0LAotICBMRV9DUkVBVEVfQklHID0gNDI1LAotICBMRV9URVJNSU5BVEVfQklHID0gNDI3LAotICBMRV9CSUdfQ1JFQVRFX1NZTkMgPSA0MzAsCi0gIExFX0JJR19URVJNSU5BVEVfU1lOQyA9IDQzMSwKLSAgTEVfUkVRVUVTVF9QRUVSX1NDQSA9IDQzMiwKLSAgTEVfU0VUVVBfSVNPX0RBVEFfUEFUSCA9IDQzMywKLSAgTEVfUkVNT1ZFX0lTT19EQVRBX1BBVEggPSA0MzQsCi0gIExFX1NFVF9IT1NUX0ZFQVRVUkUgPSA0NDEsCi0gIExFX1JFQURfSVNPX0xJTktfUVVBTElUWSA9IDQ0MiwKLSAgTEVfRU5IQU5DRURfUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTCA9IDQ0MywKLSAgTEVfUkVBRF9SRU1PVEVfVFJBTlNNSVRfUE9XRVJfTEVWRUwgPSA0NDQsCi0gIExFX1NFVF9QQVRIX0xPU1NfUkVQT1JUSU5HX1BBUkFNRVRFUlMgPSA0NDUsCi0gIExFX1NFVF9QQVRIX0xPU1NfUkVQT1JUSU5HX0VOQUJMRSA9IDQ0NiwKLSAgTEVfU0VUX1RSQU5TTUlUX1BPV0VSX1JFUE9SVElOR19FTkFCTEUgPSA0NDcsCi0gIFNFVF9FQ09TWVNURU1fQkFTRV9JTlRFUlZBTCA9IDQ1MSwKLSAgUkVBRF9MT0NBTF9TVVBQT1JURURfQ09ERUNTX1YyID0gNDUyLAotICBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ19DQVBBQklMSVRJRVMgPSA0NTMsCi0gIFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPTlRST0xMRVJfREVMQVkgPSA0NTQsCi0gIENPTkZJR1VSRV9EQVRBX1BBVEggPSA0NTUsCi19Ci0KLXBhY2tldCBDb21tYW5kIHsKLSAgb3BfY29kZSA6IE9wQ29kZSwKLSAgX3NpemVfKF9wYXlsb2FkXykgOiA4LAotICBfcGF5bG9hZF8sCi19Ci0KLS8vIFBhY2tldHMgZm9yIGludGVyZmFjZXMKLQotcGFja2V0IERpc2NvdmVyeUNvbW1hbmQgOiBDb21tYW5kIHsgX3BheWxvYWRfLCB9Ci1wYWNrZXQgQWNsQ29tbWFuZCA6IENvbW1hbmQgeyBfcGF5bG9hZF8sIH0KLXBhY2tldCBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgOiBBY2xDb21tYW5kIHsgX3BheWxvYWRfLCB9Ci1wYWNrZXQgU2VjdXJpdHlDb21tYW5kIDogQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotcGFja2V0IFNjb0Nvbm5lY3Rpb25Db21tYW5kIDogQWNsQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotcGFja2V0IExlQWR2ZXJ0aXNpbmdDb21tYW5kIDogQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotcGFja2V0IExlU2Nhbm5pbmdDb21tYW5kIDogQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotcGFja2V0IExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIDogQWNsQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotcGFja2V0IExlU2VjdXJpdHlDb21tYW5kIDogQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotcGFja2V0IExlSXNvQ29tbWFuZCA6IENvbW1hbmQgeyBfcGF5bG9hZF8sIH0KLXBhY2tldCBWZW5kb3JDb21tYW5kIDogQ29tbWFuZCB7IF9wYXlsb2FkXywgfQotCi0vLyBIQ0kgRXZlbnQgUGFja2V0cwotCi1lbnVtIEV2ZW50Q29kZSA6IDggewotICBJTlFVSVJZX0NPTVBMRVRFID0gMHgwMSwKLSAgSU5RVUlSWV9SRVNVTFQgPSAweDAyLAotICBDT05ORUNUSU9OX0NPTVBMRVRFID0gMHgwMywKLSAgQ09OTkVDVElPTl9SRVFVRVNUID0gMHgwNCwKLSAgRElTQ09OTkVDVElPTl9DT01QTEVURSA9IDB4MDUsCi0gIEFVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFID0gMHgwNiwKLSAgUkVNT1RFX05BTUVfUkVRVUVTVF9DT01QTEVURSA9IDB4MDcsCi0gIEVOQ1JZUFRJT05fQ0hBTkdFID0gMHgwOCwKLSAgQ0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVlfQ09NUExFVEUgPSAweDA5LAotICBDRU5UUkFMX0xJTktfS0VZX0NPTVBMRVRFID0gMHgwQSwKLSAgUkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTX0NPTVBMRVRFID0gMHgwQiwKLSAgUkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTl9DT01QTEVURSA9IDB4MEMsCi0gIFFPU19TRVRVUF9DT01QTEVURSA9IDB4MEQsCi0gIENPTU1BTkRfQ09NUExFVEUgPSAweDBFLAotICBDT01NQU5EX1NUQVRVUyA9IDB4MEYsCi0gIEhBUkRXQVJFX0VSUk9SID0gMHgxMCwKLSAgRkxVU0hfT0NDVVJSRUQgPSAweDExLAotICBST0xFX0NIQU5HRSA9IDB4MTIsCi0gIE5VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUyA9IDB4MTMsCi0gIE1PREVfQ0hBTkdFID0gMHgxNCwKLSAgUkVUVVJOX0xJTktfS0VZUyA9IDB4MTUsCi0gIFBJTl9DT0RFX1JFUVVFU1QgPSAweDE2LAotICBMSU5LX0tFWV9SRVFVRVNUID0gMHgxNywKLSAgTElOS19LRVlfTk9USUZJQ0FUSU9OID0gMHgxOCwKLSAgTE9PUEJBQ0tfQ09NTUFORCA9IDB4MTksCi0gIERBVEFfQlVGRkVSX09WRVJGTE9XID0gMHgxQSwKLSAgTUFYX1NMT1RTX0NIQU5HRSA9IDB4MUIsCi0gIFJFQURfQ0xPQ0tfT0ZGU0VUX0NPTVBMRVRFID0gMHgxQywKLSAgQ09OTkVDVElPTl9QQUNLRVRfVFlQRV9DSEFOR0VEID0gMHgxRCwKLSAgUU9TX1ZJT0xBVElPTiA9IDB4MUUsCi0gIFBBR0VfU0NBTl9SRVBFVElUSU9OX01PREVfQ0hBTkdFID0gMHgyMCwKLSAgRkxPV19TUEVDSUZJQ0FUSU9OX0NPTVBMRVRFID0gMHgyMSwKLSAgSU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJID0gMHgyMiwKLSAgUkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVNfQ09NUExFVEUgPSAweDIzLAotICBTWU5DSFJPTk9VU19DT05ORUNUSU9OX0NPTVBMRVRFID0gMHgyQywKLSAgU1lOQ0hST05PVVNfQ09OTkVDVElPTl9DSEFOR0VEID0gMHgyRCwKLSAgU05JRkZfU1VCUkFUSU5HID0gMHgyRSwKLSAgRVhURU5ERURfSU5RVUlSWV9SRVNVTFQgPSAweDJGLAotICBFTkNSWVBUSU9OX0tFWV9SRUZSRVNIX0NPTVBMRVRFID0gMHgzMCwKLSAgSU9fQ0FQQUJJTElUWV9SRVFVRVNUID0gMHgzMSwKLSAgSU9fQ0FQQUJJTElUWV9SRVNQT05TRSA9IDB4MzIsCi0gIFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1QgPSAweDMzLAotICBVU0VSX1BBU1NLRVlfUkVRVUVTVCA9IDB4MzQsCi0gIFJFTU9URV9PT0JfREFUQV9SRVFVRVNUID0gMHgzNSwKLSAgU0lNUExFX1BBSVJJTkdfQ09NUExFVEUgPSAweDM2LAotICBMSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ0hBTkdFRCA9IDB4MzgsCi0gIEVOSEFOQ0VEX0ZMVVNIX0NPTVBMRVRFID0gMHgzOSwKLSAgVVNFUl9QQVNTS0VZX05PVElGSUNBVElPTiA9IDB4M0IsCi0gIEtFWVBSRVNTX05PVElGSUNBVElPTiA9IDB4M0MsCi0gIFJFTU9URV9IT1NUX1NVUFBPUlRFRF9GRUFUVVJFU19OT1RJRklDQVRJT04gPSAweDNELAotICBMRV9NRVRBX0VWRU5UID0gMHgzZSwKLSAgTlVNQkVSX09GX0NPTVBMRVRFRF9EQVRBX0JMT0NLUyA9IDB4NDgsCi0gIFZFTkRPUl9TUEVDSUZJQyA9IDB4RkYsCi19Ci0KLXBhY2tldCBFdmVudCB7Ci0gIGV2ZW50X2NvZGUgOiBFdmVudENvZGUsCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogOCwKLSAgX3BheWxvYWRfLAotfQotCi0vLyBMRSBFdmVudHMKLQotZW51bSBTdWJldmVudENvZGUgOiA4IHsKLSAgQ09OTkVDVElPTl9DT01QTEVURSA9IDB4MDEsCi0gIEFEVkVSVElTSU5HX1JFUE9SVCA9IDB4MDIsCi0gIENPTk5FQ1RJT05fVVBEQVRFX0NPTVBMRVRFID0gMHgwMywKLSAgUkVBRF9SRU1PVEVfRkVBVFVSRVNfQ09NUExFVEUgPSAweDA0LAotICBMT05HX1RFUk1fS0VZX1JFUVVFU1QgPSAweDA1LAotICBSRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVCA9IDB4MDYsCi0gIERBVEFfTEVOR1RIX0NIQU5HRSA9IDB4MDcsCi0gIFJFQURfTE9DQUxfUDI1Nl9QVUJMSUNfS0VZX0NPTVBMRVRFID0gMHgwOCwKLSAgR0VORVJBVEVfREhLRVlfQ09NUExFVEUgPSAweDA5LAotICBFTkhBTkNFRF9DT05ORUNUSU9OX0NPTVBMRVRFID0gMHgwYSwKLSAgRElSRUNURURfQURWRVJUSVNJTkdfUkVQT1JUID0gMHgwYiwKLSAgUEhZX1VQREFURV9DT01QTEVURSA9IDB4MGMsCi0gIEVYVEVOREVEX0FEVkVSVElTSU5HX1JFUE9SVCA9IDB4MEQsCi0gIFBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfRVNUQUJMSVNIRUQgPSAweDBFLAotICBQRVJJT0RJQ19BRFZFUlRJU0lOR19SRVBPUlQgPSAweDBGLAotICBQRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX0xPU1QgPSAweDEwLAotICBTQ0FOX1RJTUVPVVQgPSAweDExLAotICBBRFZFUlRJU0lOR19TRVRfVEVSTUlOQVRFRCA9IDB4MTIsCi0gIFNDQU5fUkVRVUVTVF9SRUNFSVZFRCA9IDB4MTMsCi0gIENIQU5ORUxfU0VMRUNUSU9OX0FMR09SSVRITSA9IDB4MTQsCi0gIENPTk5FQ1RJT05MRVNTX0lRX1JFUE9SVCA9IDB4MTUsCi0gIENPTk5FQ1RJT05fSVFfUkVQT1JUID0gMHgxNiwKLSAgQ1RFX1JFUVVFU1RfRkFJTEVEID0gMHgxNywKLSAgUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9SRUNFSVZFRCA9IDB4MTgsCi0gIENJU19FU1RBQkxJU0hFRCA9IDB4MTksCi0gIENJU19SRVFVRVNUID0gMHgxQSwKLSAgQ1JFQVRFX0JJR19DT01QTEVURSA9IDB4MUIsCi0gIFRFUk1JTkFURV9CSUdfQ09NUExFVEUgPSAweDFDLAotICBCSUdfU1lOQ19FU1RBQkxJU0hFRCA9IDB4MUQsCi0gIEJJR19TWU5DX0xPU1QgPSAweDFFLAotICBSRVFVRVNUX1BFRVJfU0NBX0NPTVBMRVRFID0gMHgxRiwKLSAgUEFUSF9MT1NTX1RIUkVTSE9MRCA9IDB4MjAsCi0gIFRSQU5TTUlUX1BPV0VSX1JFUE9SVElORyA9IDB4MjEsCi0gIEJJR19JTkZPX0FEVkVSVElTSU5HX1JFUE9SVCA9IDB4MjIsCi19Ci0KLS8vIFZlbmRvciBzcGVjaWZpYyBldmVudHMKLWVudW0gVnNlU3ViZXZlbnRDb2RlIDogOCB7Ci0gIEJMRV9USFJFU0hPTEQgPSAweDU0LAotICBCTEVfVFJBQ0tJTkcgPSAweDU2LAotICBERUJVR19JTkZPID0gMHg1NywKLSAgQlFSX0VWRU5UID0gMHg1OCwKLX0KLQotLy8gQ29tbW9uIGRlZmluaXRpb25zIGZvciBjb21tYW5kcyBhbmQgZXZlbnRzCi0KLWVudW0gRmVhdHVyZUZsYWcgOiAxIHsKLSAgVU5TVVBQT1JURUQgPSAwLAotICBTVVBQT1JURUQgPSAxLAotfQotCi1lbnVtIEVycm9yQ29kZTogOCB7Ci0gIFNUQVRVU19VTktOT1dOID0gMHhGRiwKLSAgU1VDQ0VTUyA9IDB4MDAsCi0gIFVOS05PV05fSENJX0NPTU1BTkQgPSAweDAxLAotICBVTktOT1dOX0NPTk5FQ1RJT04gPSAweDAyLAotICBIQVJEV0FSRV9GQUlMVVJFID0gMHgwMywKLSAgUEFHRV9USU1FT1VUID0gMHgwNCwKLSAgQVVUSEVOVElDQVRJT05fRkFJTFVSRSA9IDB4MDUsCi0gIFBJTl9PUl9LRVlfTUlTU0lORyA9IDB4MDYsCi0gIE1FTU9SWV9DQVBBQ0lUWV9FWENFRURFRCA9IDB4MDcsCi0gIENPTk5FQ1RJT05fVElNRU9VVCA9IDB4MDgsCi0gIENPTk5FQ1RJT05fTElNSVRfRVhDRUVERUQgPSAweDA5LAotICBTWU5DSFJPTk9VU19DT05ORUNUSU9OX0xJTUlUX0VYQ0VFREVEID0gMHgwQSwKLSAgQ09OTkVDVElPTl9BTFJFQURZX0VYSVNUUyA9IDB4MEIsCi0gIENPTU1BTkRfRElTQUxMT1dFRCA9IDB4MEMsCi0gIENPTk5FQ1RJT05fUkVKRUNURURfTElNSVRFRF9SRVNPVVJDRVMgPSAweDBELAotICBDT05ORUNUSU9OX1JFSkVDVEVEX1NFQ1VSSVRZX1JFQVNPTlMgPSAweDBFLAotICBDT05ORUNUSU9OX1JFSkVDVEVEX1VOQUNDRVBUQUJMRV9CRF9BRERSID0gMHgwRiwKLSAgQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCA9IDB4MTAsCi0gIFVOU1VQT1JURURfRkVBVFVSRV9PUl9QQVJBTUVURVJfVkFMVUUgPSAweDExLAotICBJTlZBTElEX0hDSV9DT01NQU5EX1BBUkFNRVRFUlMgPSAweDEyLAotICBSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04gPSAweDEzLAotICBSRU1PVEVfREVWSUNFX1RFUk1JTkFURURfQ09OTkVDVElPTl9MT1dfUkVTT1VSQ0VTID0gMHgxNCwKLSAgUkVNT1RFX0RFVklDRV9URVJNSU5BVEVEX0NPTk5FQ1RJT05fUE9XRVJfT0ZGID0gMHgxNSwKLSAgQ09OTkVDVElPTl9URVJNSU5BVEVEX0JZX0xPQ0FMX0hPU1QgPSAweDE2LAotICBSRVBFQVRFRF9BVFRFTVBUUyA9IDB4MTcsCi0gIFBBSVJJTkdfTk9UX0FMTE9XRUQgPSAweDE4LAotICBVTktOT1dOX0xNUF9QRFUgPSAweDE5LAotICBVTlNVUFBPUlRFRF9SRU1PVEVfT1JfTE1QX0ZFQVRVUkUgPSAweDFBLAotICBTQ09fT0ZGU0VUX1JFSkVDVEVEID0gMHgxQiwKLSAgU0NPX0lOVEVSVkFMX1JFSkVDVEVEID0gMHgxQywKLSAgU0NPX0FJUl9NT0RFX1JFSkVDVEVEID0gMHgxRCwKLSAgSU5WQUxJRF9MTVBfT1JfTExfUEFSQU1FVEVSUyA9IDB4MUUsCi0gIFVOU1BFQ0lGSUVEX0VSUk9SID0gMHgxRiwKLSAgVU5TVVBQT1JURURfTE1QX09SX0xMX1BBUkFNRVRFUiA9IDB4MjAsCi0gIFJPTEVfQ0hBTkdFX05PVF9BTExPV0VEID0gMHgyMSwKLSAgTElOS19MQVlFUl9DT0xMSVNJT04gPSAweDIzLAotICBFTkNSWVBUSU9OX01PREVfTk9UX0FDQ0VQVEFCTEUgPSAweDI1LAotICBST0xFX1NXSVRDSF9GQUlMRUQgPSAweDM1LAotICBDT05UUk9MTEVSX0JVU1kgPSAweDNBLAotICBDT05ORUNUSU9OX0ZBSUxFRF9FU1RBQkxJU0hNRU5UID0gMHgzRSwKLX0KLQotLy8gRXZlbnRzIHRoYXQgYXJlIGRlZmluZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIGNvbW1hbmRzCi0KLXBhY2tldCBDb21tYW5kQ29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IENPTU1BTkRfQ09NUExFVEUpIHsKLSAgbnVtX2hjaV9jb21tYW5kX3BhY2tldHMgOiA4LAotICBjb21tYW5kX29wX2NvZGUgOiBPcENvZGUsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IENvbW1hbmRTdGF0dXMgOiBFdmVudCAoZXZlbnRfY29kZSA9IENPTU1BTkRfU1RBVFVTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwgLy8gU1VDQ0VTUyBtZWFucyBQRU5ESU5HCi0gIG51bV9oY2lfY29tbWFuZF9wYWNrZXRzIDogOCwKLSAgY29tbWFuZF9vcF9jb2RlIDogT3BDb2RlLAotICBfcGF5bG9hZF8sCi19Ci0KLSAgLy8gQ3JlZGl0cwotcGFja2V0IE5vQ29tbWFuZENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBOT05FKSB7Ci19Ci0KLXN0cnVjdCBMYXAgeyAvLyBMb3dlciBBZGRyZXNzIFBhcnQKLSAgbGFwIDogNiwKLSAgX3Jlc2VydmVkXyA6IDIsCi0gIF9maXhlZF8gPSAweDllOGIgOiAxNiwKLX0KLQotICAvLyBMSU5LX0NPTlRST0wKLXBhY2tldCBJbnF1aXJ5IDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IElOUVVJUlkpIHsKLSAgbGFwIDogTGFwLAotICBpbnF1aXJ5X2xlbmd0aCA6IDgsIC8vIDB4MSAtIDB4MzAgKHRpbWVzIDEuMjhzKQotICBudW1fcmVzcG9uc2VzIDogOCwgLy8gMHgwMCB1bmxpbWl0ZWQKLX0KLQotdGVzdCBJbnF1aXJ5IHsKLSAgIlx4MDFceDA0XHgwNVx4MzNceDhiXHg5ZVx4YWFceGJiIiwKLX0KLQotcGFja2V0IElucXVpcnlTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBJTlFVSVJZKSB7Ci19Ci0KLXRlc3QgSW5xdWlyeVN0YXR1cyB7Ci0gICJceDBmXHgwNFx4MDBceDAxXHgwMVx4MDQiLAotfQotCi1wYWNrZXQgSW5xdWlyeUNhbmNlbCA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBJTlFVSVJZX0NBTkNFTCkgewotfQotCi10ZXN0IElucXVpcnlDYW5jZWwgewotICAiXHgwMlx4MDRceDAwIiwKLX0KLQotcGFja2V0IElucXVpcnlDYW5jZWxDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gSU5RVUlSWV9DQU5DRUwpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi10ZXN0IElucXVpcnlDYW5jZWxDb21wbGV0ZSB7Ci0gICJceDBlXHgwNFx4MDFceDAyXHgwNFx4MDAiLAotfQotCi1wYWNrZXQgUGVyaW9kaWNJbnF1aXJ5TW9kZSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBQRVJJT0RJQ19JTlFVSVJZX01PREUpIHsKLSAgbWF4X3BlcmlvZF9sZW5ndGggOiAxNiwgLy8gUmFuZ2UgMHgwMDAzIHRvIDB4ZmZmZiAodGltZXMgMS4yOHMpCi0gIG1pbl9wZXJpb2RfbGVuZ3RoIDogMTYsIC8vIFJhbmdlIDB4MDAwMiB0byAweGZmZmUgKHRpbWVzIDEuMjhzKQotICBsYXAgOiBMYXAsCi0gIGlucXVpcnlfbGVuZ3RoIDogOCwgLy8gMHgxIC0gMHgzMCAodGltZXMgMS4yOHMpCi0gIG51bV9yZXNwb25zZXMgOiA4LCAvLyAweDAwIHVubGltaXRlZAotfQotCi10ZXN0IFBlcmlvZGljSW5xdWlyeU1vZGUgewotICAiXHgwM1x4MDRceDA5XHgxMlx4MzRceDU2XHg3OFx4MTFceDhiXHg5ZVx4OWFceGJjIiwKLX0KLQotcGFja2V0IFBlcmlvZGljSW5xdWlyeU1vZGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUEVSSU9ESUNfSU5RVUlSWV9NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBQZXJpb2RpY0lucXVpcnlNb2RlQ29tcGxldGUgewotICAiXHgwZVx4MDRceDAxXHgwM1x4MDRceDAwIiwKLX0KLQotcGFja2V0IEV4aXRQZXJpb2RpY0lucXVpcnlNb2RlIDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IEVYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFKSB7Ci19Ci0KLXRlc3QgRXhpdFBlcmlvZGljSW5xdWlyeU1vZGUgewotICAiXHgwNFx4MDRceDAwIiwKLX0KLQotcGFja2V0IEV4aXRQZXJpb2RpY0lucXVpcnlNb2RlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IEVYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBFeGl0UGVyaW9kaWNJbnF1aXJ5TW9kZUNvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4MDRceDA0XHgwMCIsCi19Ci0KLWVudW0gUGFnZVNjYW5SZXBldGl0aW9uTW9kZSA6IDggewotICBSMCA9IDB4MDAsCi0gIFIxID0gMHgwMSwKLSAgUjIgPSAweDAyLAotfQotCi1lbnVtIENsb2NrT2Zmc2V0VmFsaWQgOiAxIHsKLSAgSU5WQUxJRCA9IDAsCi0gIFZBTElEID0gMSwKLX0KLQotZW51bSBDcmVhdGVDb25uZWN0aW9uUm9sZVN3aXRjaCA6IDggewotICBSRU1BSU5fQ0VOVFJBTCA9IDB4MDAsCi0gIEFMTE9XX1JPTEVfU1dJVENIID0gMHgwMSwKLX0KLQotcGFja2V0IENyZWF0ZUNvbm5lY3Rpb24gOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBDUkVBVEVfQ09OTkVDVElPTikgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgcGFja2V0X3R5cGUgOiAxNiwKLSAgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSA6IFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUsCi0gIF9yZXNlcnZlZF8gOiA4LAotICBjbG9ja19vZmZzZXQgOiAxNSwKLSAgY2xvY2tfb2Zmc2V0X3ZhbGlkIDogQ2xvY2tPZmZzZXRWYWxpZCwKLSAgYWxsb3dfcm9sZV9zd2l0Y2ggOiBDcmVhdGVDb25uZWN0aW9uUm9sZVN3aXRjaCwKLX0KLQotcGFja2V0IENyZWF0ZUNvbm5lY3Rpb25TdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBDUkVBVEVfQ09OTkVDVElPTikgewotfQotCi1lbnVtIERpc2Nvbm5lY3RSZWFzb24gOiA4IHsKLSAgQVVUSEVOVElDQVRJT05fRkFJTFVSRSA9IDB4MDUsCi0gIFJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTiA9IDB4MTMsCi0gIFJFTU9URV9ERVZJQ0VfVEVSTUlOQVRFRF9DT05ORUNUSU9OX0xPV19SRVNPVVJDRVMgPSAweDE0LAotICBSRU1PVEVfREVWSUNFX1RFUk1JTkFURURfQ09OTkVDVElPTl9QT1dFUl9PRkYgPSAweDE1LAotICBVTlNVUFBPUlRFRF9SRU1PVEVfRkVBVFVSRSA9IDB4MUEsCi0gIFBBSVJJTkdfV0lUSF9VTklUX0tFWV9OT1RfU1VQUE9SVEVEID0gMHgyOSwKLSAgVU5BQ0NFUFRBQkxFX0NPTk5FQ1RJT05fUEFSQU1FVEVSUyA9IDB4M0IsCi19Ci0KLXBhY2tldCBEaXNjb25uZWN0IDogQWNsQ29tbWFuZCAob3BfY29kZSA9IERJU0NPTk5FQ1QpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHJlYXNvbiA6IERpc2Nvbm5lY3RSZWFzb24sCi19Ci0KLXBhY2tldCBEaXNjb25uZWN0U3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gRElTQ09OTkVDVCkgewotfQotCi1wYWNrZXQgQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbCA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IENSRUFURV9DT05ORUNUSU9OX0NBTkNFTCkgewotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotcGFja2V0IENyZWF0ZUNvbm5lY3Rpb25DYW5jZWxDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLWVudW0gQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlIDogOCB7Ci0gIEJFQ09NRV9DRU5UUkFMID0gMHgwMCwKLSAgUkVNQUlOX1BFUklQSEVSQUwgPSAweDAxLAotfQotCi1wYWNrZXQgQWNjZXB0Q29ubmVjdGlvblJlcXVlc3QgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBBQ0NFUFRfQ09OTkVDVElPTl9SRVFVRVNUKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICByb2xlIDogQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlLAotfQotCi1wYWNrZXQgQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBBQ0NFUFRfQ09OTkVDVElPTl9SRVFVRVNUKSB7Ci19Ci0KLWVudW0gUmVqZWN0Q29ubmVjdGlvblJlYXNvbiA6IDggewotICBMSU1JVEVEX1JFU09VUkNFUyA9IDB4MEQsCi0gIFNFQ1VSSVRZX1JFQVNPTlMgPSAweDBFLAotICBVTkFDQ0VQVEFCTEVfQkRfQUREUiA9IDB4MEYsCi19Ci0KLXBhY2tldCBSZWplY3RDb25uZWN0aW9uUmVxdWVzdCA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFJFSkVDVF9DT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIHJlYXNvbiA6IFJlamVjdENvbm5lY3Rpb25SZWFzb24sCi19Ci0KLXBhY2tldCBSZWplY3RDb25uZWN0aW9uUmVxdWVzdFN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IFJFSkVDVF9DT05ORUNUSU9OX1JFUVVFU1QpIHsKLX0KLQotcGFja2V0IExpbmtLZXlSZXF1ZXN0UmVwbHkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMSU5LX0tFWV9SRVFVRVNUX1JFUExZKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICBsaW5rX2tleSA6IDhbMTZdLAotfQotCi1wYWNrZXQgTGlua0tleVJlcXVlc3RSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMSU5LX0tFWV9SRVFVRVNUX1JFUExZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgTGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotcGFja2V0IFBpbkNvZGVSZXF1ZXN0UmVwbHkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBQSU5fQ09ERV9SRVFVRVNUX1JFUExZKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICBwaW5fY29kZV9sZW5ndGggOiA1LCAvLyAweDAxIC0gMHgxMAotICBfcmVzZXJ2ZWRfIDogMywKLSAgcGluX2NvZGUgOiA4WzE2XSwgLy8gc3RyaW5nIHBhcmFtZXRlciwgZmlyc3Qgb2N0ZXQgZmlyc3QKLX0KLQotcGFja2V0IFBpbkNvZGVSZXF1ZXN0UmVwbHlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUElOX0NPREVfUkVRVUVTVF9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgUGluQ29kZVJlcXVlc3ROZWdhdGl2ZVJlcGx5IDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gUElOX0NPREVfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSkgewotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotcGFja2V0IFBpbkNvZGVSZXF1ZXN0TmVnYXRpdmVSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBQSU5fQ09ERV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZSA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IENIQU5HRV9DT05ORUNUSU9OX1BBQ0tFVF9UWVBFKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBwYWNrZXRfdHlwZSA6IDE2LAotfQotCi1wYWNrZXQgQ2hhbmdlQ29ubmVjdGlvblBhY2tldFR5cGVTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBDSEFOR0VfQ09OTkVDVElPTl9QQUNLRVRfVFlQRSkgewotfQotCi1wYWNrZXQgQXV0aGVudGljYXRpb25SZXF1ZXN0ZWQgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBBVVRIRU5USUNBVElPTl9SRVFVRVNURUQpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBBdXRoZW50aWNhdGlvblJlcXVlc3RlZFN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IEFVVEhFTlRJQ0FUSU9OX1JFUVVFU1RFRCkgewotfQotCi1wYWNrZXQgU2V0Q29ubmVjdGlvbkVuY3J5cHRpb24gOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBTRVRfQ09OTkVDVElPTl9FTkNSWVBUSU9OKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBlbmNyeXB0aW9uX2VuYWJsZSA6IEVuYWJsZSwKLX0KLQotcGFja2V0IFNldENvbm5lY3Rpb25FbmNyeXB0aW9uU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gU0VUX0NPTk5FQ1RJT05fRU5DUllQVElPTikgewotfQotCi1wYWNrZXQgQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXkgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBDSEFOR0VfQ09OTkVDVElPTl9MSU5LX0tFWSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5U3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gQ0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVkpIHsKLX0KLQotZW51bSBLZXlGbGFnIDogOCB7Ci0gIFNFTUlfUEVSTUFORU5UID0gMHgwMCwKLSAgVEVNUE9SQVJZID0gMHgwMSwKLX0KLQotcGFja2V0IENlbnRyYWxMaW5rS2V5IDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gQ0VOVFJBTF9MSU5LX0tFWSkgewotICBrZXlfZmxhZyA6IEtleUZsYWcsCi19Ci0KLXBhY2tldCBDZW50cmFsTGlua0tleVN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IENFTlRSQUxfTElOS19LRVkpIHsKLX0KLQotcGFja2V0IFJlbW90ZU5hbWVSZXF1ZXN0IDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFJFTU9URV9OQU1FX1JFUVVFU1QpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUgOiBQYWdlU2NhblJlcGV0aXRpb25Nb2RlLAotICBfcmVzZXJ2ZWRfIDogOCwKLSAgY2xvY2tfb2Zmc2V0IDogMTUsCi0gIGNsb2NrX29mZnNldF92YWxpZCA6IENsb2NrT2Zmc2V0VmFsaWQsCi19Ci0KLXBhY2tldCBSZW1vdGVOYW1lUmVxdWVzdFN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IFJFTU9URV9OQU1FX1JFUVVFU1QpIHsKLX0KLQotcGFja2V0IFJlbW90ZU5hbWVSZXF1ZXN0Q2FuY2VsIDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFJFTU9URV9OQU1FX1JFUVVFU1RfQ0FOQ0VMKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgUmVtb3RlTmFtZVJlcXVlc3RDYW5jZWxDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVNT1RFX05BTUVfUkVRVUVTVF9DQU5DRUwpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFUykgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc1N0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFUykgewotfQotCi1wYWNrZXQgUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXMgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUykgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGFnZV9udW1iZXIgOiA4LAotfQotCi1wYWNrZXQgUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUykgewotfQotCi1wYWNrZXQgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbiA6IEFjbENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvblN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT04pIHsKLX0KLQotcGFja2V0IFJlYWRDbG9ja09mZnNldCA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFJFQURfQ0xPQ0tfT0ZGU0VUKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVhZENsb2NrT2Zmc2V0U3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9DTE9DS19PRkZTRVQpIHsKLX0KLQotcGFja2V0IFJlYWRMbXBIYW5kbGUgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xNUF9IQU5ETEUpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBSZWFkTG1wSGFuZGxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfTE1QX0hBTkRMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsbXBfaGFuZGxlIDogOCwKLSAgX3Jlc2VydmVkXyA6IDMyLAotfQotCi1wYWNrZXQgU2V0dXBTeW5jaHJvbm91c0Nvbm5lY3Rpb24gOiBTY29Db25uZWN0aW9uQ29tbWFuZCAob3BfY29kZSA9IFNFVFVQX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHRyYW5zbWl0X2JhbmR3aWR0aCA6IDMyLAotICByZWNlaXZlX2JhbmR3aWR0aCA6IDMyLAotICBtYXhfbGF0ZW5jeSA6IDE2LCAvLyAwLTMgcmVzZXJ2ZWQsIDB4RkZGRiA9IGRvbid0IGNhcmUKLSAgdm9pY2Vfc2V0dGluZyA6IDEwLAotICBfcmVzZXJ2ZWRfIDogNiwKLSAgcmV0cmFuc21pc3Npb25fZWZmb3J0IDogOCwKLSAgcGFja2V0X3R5cGUgOiAxNiwKLX0KLQotcGFja2V0IFNldHVwU3luY2hyb25vdXNDb25uZWN0aW9uU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gU0VUVVBfU1lOQ0hST05PVVNfQ09OTkVDVElPTikgewotfQotCi1wYWNrZXQgQWNjZXB0U3luY2hyb25vdXNDb25uZWN0aW9uIDogU2NvQ29ubmVjdGlvbkNvbW1hbmQgKG9wX2NvZGUgPSBBQ0NFUFRfU1lOQ0hST05PVVNfQ09OTkVDVElPTikgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgdHJhbnNtaXRfYmFuZHdpZHRoIDogMzIsCi0gIHJlY2VpdmVfYmFuZHdpZHRoIDogMzIsCi0gIG1heF9sYXRlbmN5IDogMTYsIC8vIDAtMyByZXNlcnZlZCwgMHhGRkZGID0gZG9uJ3QgY2FyZQotICB2b2ljZV9zZXR0aW5nIDogMTAsCi0gIF9yZXNlcnZlZF8gOiA2LAotICByZXRyYW5zbWlzc2lvbl9lZmZvcnQgOiA4LAotICBwYWNrZXRfdHlwZSA6IDE2LAotfQotCi1wYWNrZXQgQWNjZXB0U3luY2hyb25vdXNDb25uZWN0aW9uU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pIHsKLX0KLQotcGFja2V0IFJlamVjdFN5bmNocm9ub3VzQ29ubmVjdGlvbiA6IFNjb0Nvbm5lY3Rpb25Db21tYW5kIChvcF9jb2RlID0gUkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIHJlYXNvbiA6IFJlamVjdENvbm5lY3Rpb25SZWFzb24sCi19Ci0KLXBhY2tldCBSZWplY3RTeW5jaHJvbm91c0Nvbm5lY3Rpb25TdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBSRUpFQ1RfU1lOQ0hST05PVVNfQ09OTkVDVElPTikgewotfQotCi1lbnVtIElvQ2FwYWJpbGl0eSA6IDggewotICBESVNQTEFZX09OTFkgPSAweDAwLAotICBESVNQTEFZX1lFU19OTyA9IDB4MDEsCi0gIEtFWUJPQVJEX09OTFkgPSAweDAyLAotICBOT19JTlBVVF9OT19PVVRQVVQgPSAweDAzLAotfQotCi1lbnVtIE9vYkRhdGFQcmVzZW50IDogOCB7Ci0gIE5PVF9QUkVTRU5UID0gMHgwMCwKLSAgUF8xOTJfUFJFU0VOVCA9IDB4MDEsCi0gIFBfMjU2X1BSRVNFTlQgPSAweDAyLAotICBQXzE5Ml9BTkRfMjU2X1BSRVNFTlQgPSAweDAzLAotfQotCi1lbnVtIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIDogOCB7Ci0gIE5PX0JPTkRJTkcgPSAweDAwLAotICBOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTiA9IDB4MDEsCi0gIERFRElDQVRFRF9CT05ESU5HID0gMHgwMiwKLSAgREVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OID0gMHgwMywKLSAgR0VORVJBTF9CT05ESU5HID0gMHgwNCwKLSAgR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTiA9IDB4MDUsCi19Ci0KLXBhY2tldCBJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGlvX2NhcGFiaWxpdHkgOiBJb0NhcGFiaWxpdHksCi0gIG9vYl9wcmVzZW50IDogT29iRGF0YVByZXNlbnQsCi0gIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA6IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLAotfQotCi1wYWNrZXQgSW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IElPX0NBUEFCSUxJVFlfUkVRVUVTVF9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgVXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotcGFja2V0IFVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9ORUdBVElWRV9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgVXNlclBhc3NrZXlSZXF1ZXN0UmVwbHkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBVU0VSX1BBU1NLRVlfUkVRVUVTVF9SRVBMWSkgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgbnVtZXJpY192YWx1ZSA6IDMyLCAvLyAwMDAwMDAtOTk5OTk5IGRlY2ltYWwgb3IgMHgwLTB4RjQyM0YKLX0KLQotcGFja2V0IFVzZXJQYXNza2V5UmVxdWVzdFJlcGx5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFVTRVJfUEFTU0tFWV9SRVFVRVNUX1JFUExZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5IDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gVVNFUl9QQVNTS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFVTRVJfUEFTU0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBSZW1vdGVPb2JEYXRhUmVxdWVzdFJlcGx5IDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGMgOiA4WzE2XSwKLSAgciA6IDhbMTZdLAotfQotCi1wYWNrZXQgUmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgUmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5IDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBSZW1vdGVPb2JEYXRhUmVxdWVzdE5lZ2F0aXZlUmVwbHlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotcGFja2V0IElvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5IDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gSU9fQ0FQQUJJTElUWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICByZWFzb24gOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBJb0NhcGFiaWxpdHlSZXF1ZXN0TmVnYXRpdmVSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBJT19DQVBBQklMSVRZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiZF9hZGRyIDogQWRkcmVzcywKLX0KLQotZW51bSBTY29Db2RpbmdGb3JtYXRWYWx1ZXMgOiA4IHsKLSAgVUxBV19MT05HID0gMHgwMCwKLSAgQUxBV19MT05HID0gMHgwMSwKLSAgQ1ZTRCA9IDB4MDIsCi0gIFRSQU5TUEFSRU5UID0gMHgwMywKLSAgTElORUFSX1BDTSA9IDB4MDQsCi0gIE1TQkMgPSAweDA1LAotICBMQzMgPSAweDA2LAotICBWRU5ET1JfU1BFQ0lGSUMgPSAweEZGLAotfQotCi1zdHJ1Y3QgU2NvQ29kaW5nRm9ybWF0IHsKLSAgY29kaW5nX2Zvcm1hdCA6IFNjb0NvZGluZ0Zvcm1hdFZhbHVlcywKLSAgY29tcGFueV9pZCA6IDE2LAotICB2ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQgOiAxNiwKLX0KLQotZW51bSBTY29QY21EYXRhRm9ybWF0IDogOCB7Ci0gIE5PVF9VU0VEID0gMHgwMCwKLSAgT05FU19DT01QTEVNRU5UID0gMHgwMSwKLSAgVFdPU19DT01QTEVNRU5UID0gMHgwMiwKLSAgU0lHTl9NQUdOSVRVREUgPSAweDAzLAotICBVTlNJR05FRCA9IDB4MDQsCi19Ci0KLWVudW0gU2NvRGF0YVBhdGggOiA4IHsKLSAgSENJID0gMHgwMCwKLSAgLy8gMHgwMSB0byAweEZFIGFyZSBMb2dpY2FsX0NoYW5uZWxfTnVtYmVyLgotICAvLyBUaGUgbWVhbmluZyBvZiB0aGUgbG9naWNhbCBjaGFubmVscyB3aWxsIGJlIHZlbmRvciBzcGVjaWZpYy4KLSAgLy8gSW4gR0QgYW5kIGxlZ2FjeSBBbmRyb2lkIEJsdWV0b290aCBzdGFjaywgd2UgdXNlIGNoYW5uZWwgMHgwMSBmb3IgaGFyZHdhcmUKLSAgLy8gb2ZmbG9hZGVkIFNDTyBlbmNvZGluZwotICBHRF9QQ00gPSAweDAxLAotICBBVURJT19URVNUX01PREUgPSAweEZGLAotfQotCi1lbnVtIFN5bmNocm9ub3VzUGFja2V0VHlwZUJpdHMgOiAxNiB7Ci0gIEhWMV9BTExPV0VEID0gMHgwMDAwLAotICBIVjJfQUxMT1dFRCA9IDB4MDAwMSwKLSAgSFYzX0FMTE9XRUQgPSAweDAwMDIsCi0gIEVWM19BTExPV0VEID0gMHgwMDA0LAotICBFVjRfQUxMT1dFRCA9IDB4MDAwOCwKLSAgRVY1X0FMTE9XRUQgPSAweDAwMTAsCi0gIE5PXzJfRVYzX0FMTE9XRUQgPSAweDAwMjAsCi0gIE5PXzNfRVYzX0FMTE9XRUQgPSAweDAwNDAsCi0gIE5PXzJfRVY1X0FMTE9XRUQgPSAweDAwODAsCi0gIE5PXzNfRVY1X0FMTE9XRUQgPSAweDAxMDAsCi19Ci0KLWVudW0gUmV0cmFuc21pc3Npb25FZmZvcnQgOiA4IHsKLSAgTk9fUkVUUkFOU01JU1NJT04gPSAweDAwLAotICBPUFRJTUlaRURfRk9SX1BPV0VSID0gMHgwMSwKLSAgT1BUSU1JWkVEX0ZPUl9MSU5LX1FVQUxJVFkgPSAweDAyLAotICBET19OT1RfQ0FSRSA9IDB4RkYsCi19Ci0KLXBhY2tldCBFbmhhbmNlZFNldHVwU3luY2hyb25vdXNDb25uZWN0aW9uIDogU2NvQ29ubmVjdGlvbkNvbW1hbmQgKG9wX2NvZGUgPSBFTkhBTkNFRF9TRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIC8vIE5leHQgdHdvIGl0ZW1zCi0gIC8vIFsweDAwMDAwMDAwLCAweEZGRkZGRkZFXSBCYW5kd2lkdGggaW4gb2N0ZXRzIHBlciBzZWNvbmQuCi0gIC8vIFsweEZGRkZGRkZGXTogRG9uJ3QgY2FyZQotICB0cmFuc21pdF9iYW5kd2lkdGhfb2N0ZXRzX3Blcl9zZWNvbmQgOiAzMiwKLSAgcmVjZWl2ZV9iYW5kd2lkdGhfb2N0ZXRzX3Blcl9zZWNvbmQgOiAzMiwKLSAgdHJhbnNtaXRfY29kaW5nX2Zvcm1hdCA6IFNjb0NvZGluZ0Zvcm1hdCwKLSAgcmVjZWl2ZV9jb2RpbmdfZm9ybWF0IDogU2NvQ29kaW5nRm9ybWF0LAotICAvLyBOZXh0IHR3byBpdGVtcwotICAvLyBbMHgwMDAxLCAweEZGRkZdOiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIG92ZXItdGhlLWFpciBlbmNvZGVkIGZyYW1lIGluCi0gIC8vICAgICAgICAgICAgICAgICAgIG9jdGV0cy4KLSAgdHJhbnNtaXRfY29kZWNfZnJhbWVfc2l6ZSA6IDE2LAotICByZWNlaXZlX2NvZGVjX2ZyYW1lX3NpemUgOiAxNiwKLSAgLy8gTmV4dCB0d28gaXRlbXMKLSAgLy8gSG9zdCB0byBDb250cm9sbGVyIG5vbWluYWwgZGF0YSByYXRlIGluIG9jdGV0cyBwZXIgc2Vjb25kLgotICBpbnB1dF9iYW5kd2lkdGhfb2N0ZXRzX3Blcl9zZWNvbmQgOiAzMiwKLSAgb3V0cHV0X2JhbmR3aWR0aF9vY3RldHNfcGVyX3NlY29uZCA6IDMyLAotICBpbnB1dF9jb2RpbmdfZm9ybWF0IDogU2NvQ29kaW5nRm9ybWF0LAotICBvdXRwdXRfY29kaW5nX2Zvcm1hdCA6IFNjb0NvZGluZ0Zvcm1hdCwKLSAgLy8gTmV4dCB0d28gaXRlbXMKLSAgLy8gU2l6ZSwgaW4gYml0cywgb2YgdGhlIHNhbXBsZSBvciBmcmFtZWQgZGF0YQotICBpbnB1dF9jb2RlZF9kYXRhX2JpdHMgOiAxNiwKLSAgb3V0cHV0X2NvZGVkX2RhdGFfYml0cyA6IDE2LAotICBpbnB1dF9wY21fZGF0YV9mb3JtYXQgOiBTY29QY21EYXRhRm9ybWF0LAotICBvdXRwdXRfcGNtX2RhdGFfZm9ybWF0IDogU2NvUGNtRGF0YUZvcm1hdCwKLSAgLy8gTmV4dCB0d28gaXRlbXMKLSAgLy8gVGhlIG51bWJlciBvZiBiaXQgcG9zaXRpb25zIHdpdGhpbiBhbiBhdWRpbyBzYW1wbGUgdGhhdCB0aGUgTVNCIG9mIHRoZQotICAvLyBzYW1wbGUgaXMgYXdheSBmcm9tIHN0YXJ0aW5nIGF0IHRoZSBNU0Igb2YgdGhlIGRhdGEuCi0gIGlucHV0X3BjbV9zYW1wbGVfcGF5bG9hZF9tc2JfcG9zaXRpb24gOiA4LAotICBvdXRwdXRfcGNtX3NhbXBsZV9wYXlsb2FkX21zYl9wb3NpdGlvbiA6IDgsCi0gIGlucHV0X2RhdGFfcGF0aCA6IFNjb0RhdGFQYXRoLAotICBvdXRwdXRfZGF0YV9wYXRoIDogU2NvRGF0YVBhdGgsCi0gIC8vIE5leHQgdHdvIGl0ZW1zCi0gIC8vIFsxLCAyNTVdIFRoZSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIHVuaXQgb2YgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBIb3N0Ci0gIC8vICAgICAgICAgIG92ZXIgdGhlIGF1ZGlvIGRhdGEgdHJhbnNwb3J0LgotICAvLyBbMF0gTm90IGFwcGxpY2FibGUgKGltcGxpZWQgYnkgdGhlIGNob2ljZSBvZiBhdWRpbyBkYXRhIHRyYW5zcG9ydCkKLSAgaW5wdXRfdHJhbnNwb3J0X3VuaXRfYml0cyA6IDgsCi0gIG91dHB1dF90cmFuc3BvcnRfdW5pdF9iaXRzIDogOCwKLSAgLy8gWzB4MDAwNCwgMHhGRkZFXTogaW4gbWlsbGlzZWNvbmRzCi0gIC8vICAgICBVcHBlciBsaW1pdCByZXByZXNlbnQgdGhlIHN1bSBvZiB0aGUgc3luY2hyb25vdXMgaW50ZXJ2YWwgYW5kIHRoZSBzaXplCi0gIC8vICAgICBvZiB0aGUgZVNDTyB3aW5kb3csIHdoZXJlIHRoZSBlU0NPIHdpbmRvdyBpcyByZXNlcnZlZCBzbG90cyBwbHVzIHRoZQotICAvLyAgICAgcmV0cmFuc21pc3Npb24gd2luZG93Ci0gIC8vIFsweEZGRkZdOiBkb24ndCBjYXJlCi0gIG1heF9sYXRlbmN5X21zOiAxNiwKLSAgcGFja2V0X3R5cGUgOiAxNiwgLy8gT3IgdG9nZXRoZXIgU3luY2hyb25vdXNQYWNrZXRUeXBlQml0cwotICByZXRyYW5zbWlzc2lvbl9lZmZvcnQgOiBSZXRyYW5zbWlzc2lvbkVmZm9ydCwKLX0KLQotcGFja2V0IEVuaGFuY2VkU2V0dXBTeW5jaHJvbm91c0Nvbm5lY3Rpb25TdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBFTkhBTkNFRF9TRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OKSB7Ci19Ci0KLXBhY2tldCBFbmhhbmNlZEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvbiA6IFNjb0Nvbm5lY3Rpb25Db21tYW5kIChvcF9jb2RlID0gRU5IQU5DRURfQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT04pIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIC8vIE5leHQgdHdvIGl0ZW1zCi0gIC8vIFsweDAwMDAwMDAwLCAweEZGRkZGRkZFXSBCYW5kd2lkdGggaW4gb2N0ZXRzIHBlciBzZWNvbmQuCi0gIC8vIFsweEZGRkZGRkZGXTogRG9uJ3QgY2FyZQotICB0cmFuc21pdF9iYW5kd2lkdGggOiAzMiwKLSAgcmVjZWl2ZV9iYW5kd2lkdGggOiAzMiwKLSAgdHJhbnNtaXRfY29kaW5nX2Zvcm1hdCA6IFNjb0NvZGluZ0Zvcm1hdCwKLSAgcmVjZWl2ZV9jb2RpbmdfZm9ybWF0IDogU2NvQ29kaW5nRm9ybWF0LAotICAvLyBOZXh0IHR3byBpdGVtcwotICAvLyBbMHgwMDAxLCAweEZGRkZdOiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIG92ZXItdGhlLWFpciBlbmNvZGVkIGZyYW1lIGluCi0gIC8vICAgICAgICAgICAgICAgICAgIG9jdGV0cy4KLSAgdHJhbnNtaXRfY29kZWNfZnJhbWVfc2l6ZSA6IDE2LAotICByZWNlaXZlX2NvZGVjX2ZyYW1lX3NpemUgOiAxNiwKLSAgLy8gTmV4dCB0d28gaXRlbXMKLSAgLy8gSG9zdCB0byBDb250cm9sbGVyIG5vbWluYWwgZGF0YSByYXRlIGluIG9jdGV0cyBwZXIgc2Vjb25kLgotICBpbnB1dF9iYW5kd2lkdGggOiAzMiwKLSAgb3V0cHV0X2JhbmR3aWR0aCA6IDMyLAotICBpbnB1dF9jb2RpbmdfZm9ybWF0IDogU2NvQ29kaW5nRm9ybWF0LAotICBvdXRwdXRfY29kaW5nX2Zvcm1hdCA6IFNjb0NvZGluZ0Zvcm1hdCwKLSAgLy8gTmV4dCB0d28gaXRlbXMKLSAgLy8gU2l6ZSwgaW4gYml0cywgb2YgdGhlIHNhbXBsZSBvciBmcmFtZWQgZGF0YQotICBpbnB1dF9jb2RlZF9kYXRhX2JpdHMgOiAxNiwKLSAgb3V0cHV0X2NvZGVkX2RhdGFfYml0cyA6IDE2LAotICBpbnB1dF9wY21fZGF0YV9mb3JtYXQgOiBTY29QY21EYXRhRm9ybWF0LAotICBvdXRwdXRfcGNtX2RhdGFfZm9ybWF0IDogU2NvUGNtRGF0YUZvcm1hdCwKLSAgLy8gTmV4dCB0d28gaXRlbXMKLSAgLy8gVGhlIG51bWJlciBvZiBiaXQgcG9zaXRpb25zIHdpdGhpbiBhbiBhdWRpbyBzYW1wbGUgdGhhdCB0aGUgTVNCIG9mIHRoZQotICAvLyBzYW1wbGUgaXMgYXdheSBmcm9tIHN0YXJ0aW5nIGF0IHRoZSBNU0Igb2YgdGhlIGRhdGEuCi0gIGlucHV0X3BjbV9zYW1wbGVfcGF5bG9hZF9tc2JfcG9zaXRpb24gOiA4LAotICBvdXRwdXRfcGNtX3NhbXBsZV9wYXlsb2FkX21zYl9wb3NpdGlvbiA6IDgsCi0gIGlucHV0X2RhdGFfcGF0aCA6IFNjb0RhdGFQYXRoLAotICBvdXRwdXRfZGF0YV9wYXRoIDogU2NvRGF0YVBhdGgsCi0gIC8vIE5leHQgdHdvIGl0ZW1zCi0gIC8vIFsxLCAyNTVdIFRoZSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIHVuaXQgb2YgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBIb3N0Ci0gIC8vICAgICAgICAgIG92ZXIgdGhlIGF1ZGlvIGRhdGEgdHJhbnNwb3J0LgotICAvLyBbMF0gTm90IGFwcGxpY2FibGUgKGltcGxpZWQgYnkgdGhlIGNob2ljZSBvZiBhdWRpbyBkYXRhIHRyYW5zcG9ydCkKLSAgaW5wdXRfdHJhbnNwb3J0X3VuaXRfYml0cyA6IDgsCi0gIG91dHB1dF90cmFuc3BvcnRfdW5pdF9iaXRzIDogOCwKLSAgLy8gWzB4MDAwNCwgMHhGRkZFXTogaW4gbWlsbGlzZWNvbmRzCi0gIC8vICAgICBVcHBlciBsaW1pdCByZXByZXNlbnQgdGhlIHN1bSBvZiB0aGUgc3luY2hyb25vdXMgaW50ZXJ2YWwgYW5kIHRoZSBzaXplCi0gIC8vICAgICBvZiB0aGUgZVNDTyB3aW5kb3csIHdoZXJlIHRoZSBlU0NPIHdpbmRvdyBpcyByZXNlcnZlZCBzbG90cyBwbHVzIHRoZQotICAvLyAgICAgcmV0cmFuc21pc3Npb24gd2luZG93Ci0gIC8vIFsweEZGRkZdOiBkb24ndCBjYXJlCi0gIG1heF9sYXRlbmN5IDogMTYsCi0gIHBhY2tldF90eXBlIDogMTYsIC8vIE9yIHRvZ2V0aGVyIFN5bmNocm9ub3VzUGFja2V0VHlwZUJpdHMKLSAgcmV0cmFuc21pc3Npb25fZWZmb3J0IDogUmV0cmFuc21pc3Npb25FZmZvcnQsCi19Ci0KLXBhY2tldCBFbmhhbmNlZEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvblN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IEVOSEFOQ0VEX0FDQ0VQVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OKSB7Ci19Ci0KLXBhY2tldCBSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBSRU1PVEVfT09CX0VYVEVOREVEX0RBVEFfUkVRVUVTVF9SRVBMWSkgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgY18xOTIgOiA4WzE2XSwKLSAgcl8xOTIgOiA4WzE2XSwKLSAgY18yNTYgOiA4WzE2XSwKLSAgcl8yNTYgOiA4WzE2XSwKLX0KLQotcGFja2V0IFJlbW90ZU9vYkV4dGVuZGVkRGF0YVJlcXVlc3RSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRU1PVEVfT09CX0VYVEVOREVEX0RBVEFfUkVRVUVTVF9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi0KLSAgLy8gTElOS19QT0xJQ1kKLXBhY2tldCBIb2xkTW9kZSA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IEhPTERfTU9ERSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgaG9sZF9tb2RlX21heF9pbnRlcnZhbDogMTYsIC8vIDB4MDAwMi0weEZGRkUgKDEuMjVtcy00MC45cykKLSAgaG9sZF9tb2RlX21pbl9pbnRlcnZhbDogMTYsIC8vIDB4MDAwMi0weEZGRkUgKDEuMjVtcy00MC45cykKLX0KLQotcGFja2V0IEhvbGRNb2RlU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gSE9MRF9NT0RFKSB7Ci19Ci0KLQotcGFja2V0IFNuaWZmTW9kZSA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFNOSUZGX01PREUpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHNuaWZmX21heF9pbnRlcnZhbDogMTYsIC8vIDB4MDAwMi0weEZGRkUgKDEuMjVtcy00MC45cykKLSAgc25pZmZfbWluX2ludGVydmFsOiAxNiwgLy8gMHgwMDAyLTB4RkZGRSAoMS4yNW1zLTQwLjlzKQotICBzbmlmZl9hdHRlbXB0OiAxNiwgLy8gMHgwMDAxLTB4N0ZGRiAoMS4yNW1zLTQwLjlzKQotICBzbmlmZl90aW1lb3V0OiAxNiwgLy8gMHgwMDAwLTB4N0ZGRiAoMG1zLTQwLjlzKQotfQotCi1wYWNrZXQgU25pZmZNb2RlU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gU05JRkZfTU9ERSkgewotfQotCi0KLXBhY2tldCBFeGl0U25pZmZNb2RlIDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gRVhJVF9TTklGRl9NT0RFKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgRXhpdFNuaWZmTW9kZVN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IEVYSVRfU05JRkZfTU9ERSkgewotfQotCi1lbnVtIFNlcnZpY2VUeXBlIDogOCB7Ci0gIE5PX1RSQUZGSUMgPSAweDAwLAotICBCRVNUX0VGRk9SVCA9IDB4MDEsCi0gIEdVQVJBTlRFRUQgPSAweDAyLAotfQotCi1wYWNrZXQgUW9zU2V0dXAgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBRT1NfU0VUVVApIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIF9yZXNlcnZlZF8gOiA4LAotICBzZXJ2aWNlX3R5cGUgOiBTZXJ2aWNlVHlwZSwKLSAgdG9rZW5fcmF0ZSA6IDMyLCAvLyBPY3RldHMvcwotICBwZWFrX2JhbmR3aWR0aCA6IDMyLCAvLyBPY3RldHMvcwotICBsYXRlbmN5IDogMzIsIC8vIE9jdGV0cy9zCi0gIGRlbGF5X3ZhcmlhdGlvbiA6IDMyLCAvLyBtaWNyb3NlY29uZHMKLX0KLQotcGFja2V0IFFvc1NldHVwU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gUU9TX1NFVFVQKSB7Ci19Ci0KLXBhY2tldCBSb2xlRGlzY292ZXJ5IDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gUk9MRV9ESVNDT1ZFUlkpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLWVudW0gUm9sZSA6IDggewotICBDRU5UUkFMID0gMHgwMCwKLSAgUEVSSVBIRVJBTCA9IDB4MDEsCi19Ci0KLXBhY2tldCBSb2xlRGlzY292ZXJ5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJPTEVfRElTQ09WRVJZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGN1cnJlbnRfcm9sZSA6IFJvbGUsCi19Ci0KLXBhY2tldCBTd2l0Y2hSb2xlIDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gU1dJVENIX1JPTEUpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIHJvbGUgOiBSb2xlLAotfQotCi1wYWNrZXQgU3dpdGNoUm9sZVN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IFNXSVRDSF9ST0xFKSB7Ci19Ci0KLQotcGFja2V0IFJlYWRMaW5rUG9saWN5U2V0dGluZ3MgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xJTktfUE9MSUNZX1NFVFRJTkdTKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1lbnVtIExpbmtQb2xpY3kgOiAxNiB7Ci0gIEVOQUJMRV9ST0xFX1NXSVRDSCA9IDB4MDEsCi0gIEVOQUJMRV9IT0xEX01PREUgPSAweDAyLAotICBFTkFCTEVfU05JRkZfTU9ERSA9IDB4MDQsCi0gIEVOQUJMRV9QQVJLX01PREUgPSAweDA4LCAvLyBkZXByZWNhdGVkIGFmdGVyIDUuMAotfQotCi1wYWNrZXQgUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xJTktfUE9MSUNZX1NFVFRJTkdTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGxpbmtfcG9saWN5X3NldHRpbmdzIDogMTYsCi19Ci0KLXBhY2tldCBXcml0ZUxpbmtQb2xpY3lTZXR0aW5ncyA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX0xJTktfUE9MSUNZX1NFVFRJTkdTKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsaW5rX3BvbGljeV9zZXR0aW5ncyA6IDE2LAotfQotCi1wYWNrZXQgV3JpdGVMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfTElOS19QT0xJQ1lfU0VUVElOR1MpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzIDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gUkVBRF9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTKSB7Ci19Ci0KLXBhY2tldCBSZWFkRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0RFRkFVTFRfTElOS19QT0xJQ1lfU0VUVElOR1MpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBkZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzIDogMTYsCi19Ci0KLXBhY2tldCBXcml0ZURlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTKSB7Ci0gIGRlZmF1bHRfbGlua19wb2xpY3lfc2V0dGluZ3MgOiAxNiwKLX0KLQotcGFja2V0IFdyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBGbG93RGlyZWN0aW9uIDogOCB7Ci0gIE9VVEdPSU5HX0ZMT1cgPSAweDAwLAotICBJTkNPTUlOR19GTE9XID0gMHgwMSwKLX0KLQotcGFja2V0IEZsb3dTcGVjaWZpY2F0aW9uIDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gRkxPV19TUEVDSUZJQ0FUSU9OKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBfcmVzZXJ2ZWRfIDogOCwKLSAgZmxvd19kaXJlY3Rpb24gOiBGbG93RGlyZWN0aW9uLAotICBzZXJ2aWNlX3R5cGUgOiBTZXJ2aWNlVHlwZSwKLSAgdG9rZW5fcmF0ZSA6IDMyLCAvLyBPY3RldHMvcwotICB0b2tlbl9idWNrZXRfc2l6ZSA6IDMyLAotICBwZWFrX2JhbmR3aWR0aCA6IDMyLCAvLyBPY3RldHMvcwotICBhY2Nlc3NfbGF0ZW5jeSA6IDMyLCAvLyBPY3RldHMvcwotfQotCi1wYWNrZXQgRmxvd1NwZWNpZmljYXRpb25TdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBGTE9XX1NQRUNJRklDQVRJT04pIHsKLX0KLQotcGFja2V0IFNuaWZmU3VicmF0aW5nIDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gU05JRkZfU1VCUkFUSU5HKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBtYXhpbXVtX2xhdGVuY3kgOiAxNiwgIC8vIDB4MDAwMi0weEZGRkUgKDEuMjVtcy00MC45cykKLSAgbWluaW11bV9yZW1vdGVfdGltZW91dCA6IDE2LCAvLyAweDAwMDAtMHhGRkZFICgwLTQwLjlzKQotICBtaW5pbXVtX2xvY2FsX3RpbWVvdXQ6IDE2LCAvLyAweDAwMDAtMHhGRkZFICgwLTQwLjlzKQotfQotCi1wYWNrZXQgU25pZmZTdWJyYXRpbmdDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gU05JRkZfU1VCUkFUSU5HKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLSAgLy8gQ09OVFJPTExFUl9BTkRfQkFTRUJBTkQKLXBhY2tldCBTZXRFdmVudE1hc2sgOiBDb21tYW5kIChvcF9jb2RlID0gU0VUX0VWRU5UX01BU0spIHsKLSAgZXZlbnRfbWFzayA6IDY0LAotfQotCi1wYWNrZXQgU2V0RXZlbnRNYXNrQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFNFVF9FVkVOVF9NQVNLKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFJlc2V0IDogQ29tbWFuZCAob3BfY29kZSA9IFJFU0VUKSB7Ci19Ci0KLXRlc3QgUmVzZXQgewotICAiXHgwM1x4MGNceDAwIiwKLX0KLQotcGFja2V0IFJlc2V0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFU0VUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBSZXNldENvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4MDNceDBjXHgwMCIsCi0gICJceDBlXHgwNFx4MDFceDAzXHgwY1x4MDEiLCAvLyB1bmtub3duIGNvbW1hbmQKLX0KLQotZW51bSBGaWx0ZXJUeXBlIDogOCB7Ci0gIENMRUFSX0FMTF9GSUxURVJTID0gMHgwMCwKLSAgSU5RVUlSWV9SRVNVTFQgPSAweDAxLAotICBDT05ORUNUSU9OX1NFVFVQID0gMHgwMiwKLX0KLQotcGFja2V0IFNldEV2ZW50RmlsdGVyIDogQ29tbWFuZCAob3BfY29kZSA9IFNFVF9FVkVOVF9GSUxURVIpIHsKLSAgZmlsdGVyX3R5cGUgOiBGaWx0ZXJUeXBlLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBTZXRFdmVudEZpbHRlckNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBTRVRfRVZFTlRfRklMVEVSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFNldEV2ZW50RmlsdGVyQ2xlYXJBbGwgOiBTZXRFdmVudEZpbHRlciAoZmlsdGVyX3R5cGUgPSBDTEVBUl9BTExfRklMVEVSUykgewotfQotCi1lbnVtIEZpbHRlckNvbmRpdGlvblR5cGUgOiA4IHsKLSAgQUxMX0RFVklDRVMgPSAweDAwLAotICBDTEFTU19PRl9ERVZJQ0UgPSAweDAxLAotICBBRERSRVNTID0gMHgwMiwKLX0KLQotcGFja2V0IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdCA6IFNldEV2ZW50RmlsdGVyIChmaWx0ZXJfdHlwZSA9IElOUVVJUllfUkVTVUxUKSB7Ci0gIGZpbHRlcl9jb25kaXRpb25fdHlwZSA6IEZpbHRlckNvbmRpdGlvblR5cGUsCi0gIF9ib2R5XywKLX0KLQotcGFja2V0IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdEFsbERldmljZXMgOiBTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHQgKGZpbHRlcl9jb25kaXRpb25fdHlwZSA9IEFMTF9ERVZJQ0VTKSB7Ci19Ci0KLXBhY2tldCBTZXRFdmVudEZpbHRlcklucXVpcnlSZXN1bHRDbGFzc09mRGV2aWNlIDogU2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0IChmaWx0ZXJfY29uZGl0aW9uX3R5cGUgPSBDTEFTU19PRl9ERVZJQ0UpIHsKLSAgY2xhc3Nfb2ZfZGV2aWNlIDogQ2xhc3NPZkRldmljZSwKLSAgY2xhc3Nfb2ZfZGV2aWNlX21hc2sgOiBDbGFzc09mRGV2aWNlLAotfQotCi1wYWNrZXQgU2V0RXZlbnRGaWx0ZXJJbnF1aXJ5UmVzdWx0QWRkcmVzcyA6IFNldEV2ZW50RmlsdGVySW5xdWlyeVJlc3VsdCAoZmlsdGVyX2NvbmRpdGlvbl90eXBlID0gQUREUkVTUykgewotICBhZGRyZXNzIDogQWRkcmVzcywKLX0KLQotcGFja2V0IFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwIDogU2V0RXZlbnRGaWx0ZXIgKGZpbHRlcl90eXBlID0gQ09OTkVDVElPTl9TRVRVUCkgewotICBmaWx0ZXJfY29uZGl0aW9uX3R5cGUgOiBGaWx0ZXJDb25kaXRpb25UeXBlLAotICBfYm9keV8sCi19Ci0KLWVudW0gQXV0b0FjY2VwdEZsYWcgOiA4IHsKLSAgQVVUT19BQ0NFUFRfT0ZGID0gMHgwMSwKLSAgQVVUT19BQ0NFUFRfT05fUk9MRV9TV0lUQ0hfRElTQUJMRUQgPSAweDAyLAotICBBVVRPX0FDQ0VQVF9PTl9ST0xFX1NXSVRDSF9FTkFCTEVEID0gMHgwMywKLX0KLQotcGFja2V0IFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwQWxsRGV2aWNlcyA6IFNldEV2ZW50RmlsdGVyQ29ubmVjdGlvblNldHVwIChmaWx0ZXJfY29uZGl0aW9uX3R5cGUgPSBBTExfREVWSUNFUykgewotICBhdXRvX2FjY2VwdF9mbGFnIDogQXV0b0FjY2VwdEZsYWcsCi19Ci0KLXBhY2tldCBTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cENsYXNzT2ZEZXZpY2UgOiBTZXRFdmVudEZpbHRlckNvbm5lY3Rpb25TZXR1cCAoZmlsdGVyX2NvbmRpdGlvbl90eXBlID0gQ0xBU1NfT0ZfREVWSUNFKSB7Ci0gIGNsYXNzX29mX2RldmljZSA6IENsYXNzT2ZEZXZpY2UsCi0gIGNsYXNzX29mX2RldmljZV9tYXNrIDogQ2xhc3NPZkRldmljZSwKLSAgYXV0b19hY2NlcHRfZmxhZyA6IEF1dG9BY2NlcHRGbGFnLAotfQotCi1wYWNrZXQgU2V0RXZlbnRGaWx0ZXJDb25uZWN0aW9uU2V0dXBBZGRyZXNzIDogU2V0RXZlbnRGaWx0ZXJDb25uZWN0aW9uU2V0dXAgKGZpbHRlcl9jb25kaXRpb25fdHlwZSA9IEFERFJFU1MpIHsKLSAgYWRkcmVzcyA6IEFkZHJlc3MsCi0gIGF1dG9fYWNjZXB0X2ZsYWcgOiBBdXRvQWNjZXB0RmxhZywKLX0KLQotcGFja2V0IEZsdXNoIDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gRkxVU0gpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBGbHVzaENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBGTFVTSCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1lbnVtIFBpblR5cGUgOiA4IHsKLSAgVkFSSUFCTEUgPSAwLAotICBGSVhFRCA9IDEsCi19Ci0KLXBhY2tldCBSZWFkUGluVHlwZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1BJTl9UWVBFKSB7Ci19Ci0KLXBhY2tldCBSZWFkUGluVHlwZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX1BJTl9UWVBFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgcGluX3R5cGUgOiBQaW5UeXBlLAotfQotCi1wYWNrZXQgV3JpdGVQaW5UeXBlIDogQ29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1BJTl9UWVBFKSB7Ci0gIHBpbl90eXBlIDogUGluVHlwZSwKLX0KLQotcGFja2V0IFdyaXRlUGluVHlwZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9QSU5fVFlQRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLWVudW0gUmVhZFN0b3JlZExpbmtLZXlSZWFkQWxsRmxhZyA6IDggewotICBTUEVDSUZJRURfQkRfQUREUiA9IDB4MDAsCi0gIEFMTCA9IDB4MDEsCi19Ci0KLXBhY2tldCBSZWFkU3RvcmVkTGlua0tleSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFJFQURfU1RPUkVEX0xJTktfS0VZKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICByZWFkX2FsbF9mbGFnIDogUmVhZFN0b3JlZExpbmtLZXlSZWFkQWxsRmxhZywKLX0KLQotcGFja2V0IFJlYWRTdG9yZWRMaW5rS2V5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfU1RPUkVEX0xJTktfS0VZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbWF4X251bV9rZXlzIDogMTYsCi0gIG51bV9rZXlzX3JlYWQgOiAxNiwKLX0KLQotc3RydWN0IEtleUFuZEFkZHJlc3MgewotICBhZGRyZXNzIDogQWRkcmVzcywKLSAgbGlua19rZXkgOiA4WzE2XSwKLX0KLQotcGFja2V0IFdyaXRlU3RvcmVkTGlua0tleSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1NUT1JFRF9MSU5LX0tFWSkgewotICBfY291bnRfKGtleXNfdG9fd3JpdGUpIDogOCwgLy8gMHgwMS0weDBCCi0gIGtleXNfdG9fd3JpdGUgOiBLZXlBbmRBZGRyZXNzW10sCi19Ci0KLXBhY2tldCBXcml0ZVN0b3JlZExpbmtLZXlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfU1RPUkVEX0xJTktfS0VZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbnVtX2tleXNfd3JpdHRlbiA6IDgsCi19Ci0KLWVudW0gRGVsZXRlU3RvcmVkTGlua0tleURlbGV0ZUFsbEZsYWcgOiA4IHsKLSAgU1BFQ0lGSUVEX0JEX0FERFIgPSAweDAwLAotICBBTEwgPSAweDAxLAotfQotCi1wYWNrZXQgRGVsZXRlU3RvcmVkTGlua0tleSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IERFTEVURV9TVE9SRURfTElOS19LRVkpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGRlbGV0ZV9hbGxfZmxhZyA6IERlbGV0ZVN0b3JlZExpbmtLZXlEZWxldGVBbGxGbGFnLAotfQotCi1wYWNrZXQgRGVsZXRlU3RvcmVkTGlua0tleUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBERUxFVEVfU1RPUkVEX0xJTktfS0VZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbnVtX2tleXNfZGVsZXRlZCA6IDE2LAotfQotCi1wYWNrZXQgV3JpdGVMb2NhbE5hbWUgOiBDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfTE9DQUxfTkFNRSkgewotICBsb2NhbF9uYW1lIDogOFsyNDhdLCAvLyBOdWxsLXRlcm1pbmF0ZWQgVVRGLTggZW5jb2RlZCBuYW1lCi19Ci0KLXBhY2tldCBXcml0ZUxvY2FsTmFtZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9MT0NBTF9OQU1FKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFJlYWRMb2NhbE5hbWUgOiBDb21tYW5kIChvcF9jb2RlID0gUkVBRF9MT0NBTF9OQU1FKSB7Ci19Ci0KLXBhY2tldCBSZWFkTG9jYWxOYW1lQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfTE9DQUxfTkFNRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGxvY2FsX25hbWUgOiA4WzI0OF0sIC8vIE51bGwtdGVybWluYXRlZCBVVEYtOCBlbmNvZGVkIG5hbWUKLX0KLQotcGFja2V0IFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dCA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFJFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCkgewotfQotCi1wYWNrZXQgUmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5fYWNjZXB0X3RpbWVvdXQgOiAxNiwgLy8gMHgwMDAxIHRvIDB4QjU0MCAoTiAqIDAuNjI1IG1zKSAwLjYyNSBtcyB0byAyOSBzCi19Ci0KLXBhY2tldCBXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0IDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCkgewotICBjb25uX2FjY2VwdF90aW1lb3V0IDogMTYsIC8vIDB4MDAwMSB0byAweEI1NDAgKE4gKiAwLjYyNSBtcykgMC42MjUgbXMgdG8gMjkgcywgRGVmYXVsdCAweDFGQTAsIDUuMDZzCi19Ci0KLXBhY2tldCBXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgUmVhZFBhZ2VUaW1lb3V0IDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFJFQURfUEFHRV9USU1FT1VUKSB7Ci19Ci0KLXRlc3QgUmVhZFBhZ2VUaW1lb3V0IHsKLSAgIlx4MTdceDBjXHgwMCIsCi19Ci0KLXBhY2tldCBSZWFkUGFnZVRpbWVvdXRDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9QQUdFX1RJTUVPVVQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBwYWdlX3RpbWVvdXQgOiAxNiwKLX0KLQotdGVzdCBSZWFkUGFnZVRpbWVvdXRDb21wbGV0ZSB7Ci0gICJceDBlXHgwNlx4MDFceDE3XHgwY1x4MDBceDExXHgyMiIsCi19Ci0KLXBhY2tldCBXcml0ZVBhZ2VUaW1lb3V0IDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1BBR0VfVElNRU9VVCkgewotICBwYWdlX3RpbWVvdXQgOiAxNiwKLX0KLQotdGVzdCBXcml0ZVBhZ2VUaW1lb3V0IHsKLSAgIlx4MThceDBjXHgwMlx4MDBceDIwIiwKLX0KLQotcGFja2V0IFdyaXRlUGFnZVRpbWVvdXRDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfUEFHRV9USU1FT1VUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBXcml0ZVBhZ2VUaW1lb3V0Q29tcGxldGUgewotICAiXHgwZVx4MDRceDAxXHgxOFx4MGNceDAwIiwKLX0KLQotZW51bSBTY2FuRW5hYmxlIDogOCB7Ci0gIE5PX1NDQU5TID0gMHgwMCwKLSAgSU5RVUlSWV9TQ0FOX09OTFkgPSAweDAxLAotICBQQUdFX1NDQU5fT05MWSA9IDB4MDIsCi0gIElOUVVJUllfQU5EX1BBR0VfU0NBTiA9IDB4MDMsCi19Ci0KLXBhY2tldCBSZWFkU2NhbkVuYWJsZSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1NDQU5fRU5BQkxFKSB7Ci19Ci0KLXBhY2tldCBSZWFkU2NhbkVuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX1NDQU5fRU5BQkxFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgc2Nhbl9lbmFibGUgOiBTY2FuRW5hYmxlLAotfQotCi1wYWNrZXQgV3JpdGVTY2FuRW5hYmxlIDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1NDQU5fRU5BQkxFKSB7Ci0gIHNjYW5fZW5hYmxlIDogU2NhbkVuYWJsZSwKLX0KLQotcGFja2V0IFdyaXRlU2NhbkVuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9TQ0FOX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBSZWFkUGFnZVNjYW5BY3Rpdml0eSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1BBR0VfU0NBTl9BQ1RJVklUWSkgewotfQotCi1wYWNrZXQgUmVhZFBhZ2VTY2FuQWN0aXZpdHlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9QQUdFX1NDQU5fQUNUSVZJVFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBwYWdlX3NjYW5faW50ZXJ2YWwgOiAxNiwgLy8gUmFuZ2U6IDB4MDAxMiB0byAweDEwMDA7IG9ubHkgZXZlbiB2YWx1ZXMgYXJlIHZhbGlkICogMHg2MjUgbXMKLSAgcGFnZV9zY2FuX3dpbmRvdyA6IDE2LCAvLyAweDAwMTEgdG8gUGFnZVNjYW5JbnRlcnZhbAotfQotCi1wYWNrZXQgV3JpdGVQYWdlU2NhbkFjdGl2aXR5IDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1BBR0VfU0NBTl9BQ1RJVklUWSkgewotICBwYWdlX3NjYW5faW50ZXJ2YWwgOiAxNiwgLy8gUmFuZ2U6IDB4MDAxMiB0byAweDEwMDA7IG9ubHkgZXZlbiB2YWx1ZXMgYXJlIHZhbGlkICogMHg2MjUgbXMKLSAgcGFnZV9zY2FuX3dpbmRvdyA6IDE2LCAvLyAweDAwMTEgdG8gUGFnZVNjYW5JbnRlcnZhbAotfQotCi1wYWNrZXQgV3JpdGVQYWdlU2NhbkFjdGl2aXR5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX1BBR0VfU0NBTl9BQ1RJVklUWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBSZWFkSW5xdWlyeVNjYW5BY3Rpdml0eSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0lOUVVJUllfU0NBTl9BQ1RJVklUWSkgewotfQotCi10ZXN0IFJlYWRJbnF1aXJ5U2NhbkFjdGl2aXR5IHsKLSAgIlx4MWRceDBjXHgwMCIsCi19Ci0KLXBhY2tldCBSZWFkSW5xdWlyeVNjYW5BY3Rpdml0eUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0lOUVVJUllfU0NBTl9BQ1RJVklUWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGlucXVpcnlfc2Nhbl9pbnRlcnZhbCA6IDE2LCAvLyBSYW5nZTogMHgwMDEyIHRvIDB4MTAwMDsgb25seSBldmVuIHZhbHVlcyBhcmUgdmFsaWQgKiAweDYyNSBtcwotICBpbnF1aXJ5X3NjYW5fd2luZG93IDogMTYsIC8vIFJhbmdlOiAweDAwMTEgdG8gMHgxMDAwCi19Ci0KLXRlc3QgUmVhZElucXVpcnlTY2FuQWN0aXZpdHlDb21wbGV0ZSB7Ci0gICJceDBlXHgwOFx4MDFceDFkXHgwY1x4MDBceGFhXHhiYlx4Y2NceGRkIiwKLX0KLQotcGFja2V0IFdyaXRlSW5xdWlyeVNjYW5BY3Rpdml0eSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9JTlFVSVJZX1NDQU5fQUNUSVZJVFkpIHsKLSAgaW5xdWlyeV9zY2FuX2ludGVydmFsIDogMTYsIC8vIFJhbmdlOiAweDAwMTIgdG8gMHgxMDAwOyBvbmx5IGV2ZW4gdmFsdWVzIGFyZSB2YWxpZCAqIDB4NjI1IG1zCi0gIGlucXVpcnlfc2Nhbl93aW5kb3cgOiAxNiwgLy8gUmFuZ2U6IDB4MDAxMSB0byAweDEwMDAKLX0KLQotdGVzdCBXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHkgewotICAiXHgxZVx4MGNceDA0XHgwMFx4MDhceDEyXHgwMCIsCi19Ci0KLXBhY2tldCBXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlDb21wbGV0ZSB7Ci0gICJceDBlXHgwNFx4MDFceDFlXHgwY1x4MDAiLAotfQotCi1lbnVtIEF1dGhlbnRpY2F0aW9uRW5hYmxlIDogOCB7Ci0gIE5PVF9SRVFVSVJFRCA9IDB4MDAsCi0gIFJFUVVJUkVEID0gMHgwMSwKLX0KLQotcGFja2V0IFJlYWRBdXRoZW50aWNhdGlvbkVuYWJsZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRSkgewotfQotCi1wYWNrZXQgUmVhZEF1dGhlbnRpY2F0aW9uRW5hYmxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYXV0aGVudGljYXRpb25fZW5hYmxlIDogQXV0aGVudGljYXRpb25FbmFibGUsCi19Ci0KLXBhY2tldCBXcml0ZUF1dGhlbnRpY2F0aW9uRW5hYmxlIDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfQVVUSEVOVElDQVRJT05fRU5BQkxFKSB7Ci0gIGF1dGhlbnRpY2F0aW9uX2VuYWJsZSA6IEF1dGhlbnRpY2F0aW9uRW5hYmxlLAotfQotCi1wYWNrZXQgV3JpdGVBdXRoZW50aWNhdGlvbkVuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9BVVRIRU5USUNBVElPTl9FTkFCTEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgUmVhZENsYXNzT2ZEZXZpY2UgOiBEaXNjb3ZlcnlDb21tYW5kIChvcF9jb2RlID0gUkVBRF9DTEFTU19PRl9ERVZJQ0UpIHsKLX0KLQotcGFja2V0IFJlYWRDbGFzc09mRGV2aWNlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfQ0xBU1NfT0ZfREVWSUNFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY2xhc3Nfb2ZfZGV2aWNlIDogQ2xhc3NPZkRldmljZSwKLX0KLQotcGFja2V0IFdyaXRlQ2xhc3NPZkRldmljZSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9DTEFTU19PRl9ERVZJQ0UpIHsKLSAgY2xhc3Nfb2ZfZGV2aWNlIDogQ2xhc3NPZkRldmljZSwKLX0KLQotcGFja2V0IFdyaXRlQ2xhc3NPZkRldmljZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9DTEFTU19PRl9ERVZJQ0UpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgUmVhZFZvaWNlU2V0dGluZyA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1ZPSUNFX1NFVFRJTkcpIHsKLX0KLQotcGFja2V0IFJlYWRWb2ljZVNldHRpbmdDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9WT0lDRV9TRVRUSU5HKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgdm9pY2Vfc2V0dGluZyA6IDEwLAotICBfcmVzZXJ2ZWRfIDogNiwKLX0KLQotcGFja2V0IFdyaXRlVm9pY2VTZXR0aW5nIDogQ29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1ZPSUNFX1NFVFRJTkcpIHsKLSAgdm9pY2Vfc2V0dGluZyA6IDEwLAotICBfcmVzZXJ2ZWRfIDogNiwKLX0KLQotcGFja2V0IFdyaXRlVm9pY2VTZXR0aW5nQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX1ZPSUNFX1NFVFRJTkcpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dCA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFJFQURfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBSZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgZmx1c2hfdGltZW91dCA6IDE2LAotfQotCi1wYWNrZXQgV3JpdGVBdXRvbWF0aWNGbHVzaFRpbWVvdXQgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgZmx1c2hfdGltZW91dCA6IDE2LCAvLyAweDAwMDAtMHgwN0ZGIERlZmF1bHQgMHgwMDAwIChObyBBdXRvbWF0aWMgRmx1c2gpCi19Ci0KLXBhY2tldCBXcml0ZUF1dG9tYXRpY0ZsdXNoVGltZW91dENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVhZE51bUJyb2FkY2FzdFJldHJhbnNtaXRzIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUykgewotfQotCi1wYWNrZXQgUmVhZE51bUJyb2FkY2FzdFJldHJhbnNtaXRzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIG51bV9icm9hZGNhc3RfcmV0cmFuc21pc3Npb25zIDogOCwKLX0KLQotcGFja2V0IFdyaXRlTnVtQnJvYWRjYXN0UmV0cmFuc21pdHMgOiBDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlUUykgewotICBudW1fYnJvYWRjYXN0X3JldHJhbnNtaXNzaW9ucyA6IDgsCi19Ci0KLXBhY2tldCBXcml0ZU51bUJyb2FkY2FzdFJldHJhbnNtaXRzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX05VTV9CUk9BRENBU1RfUkVUUkFOU01JVFMpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1lbnVtIEhvbGRNb2RlQWN0aXZpdHkgOiA4IHsKLSAgTUFJTlRBSU5fQ1VSUkVOVF9QT1dFUl9TVEFURSA9IDB4MDAsCi0gIFNVU1BFTkRfUEFHRV9TQ0FOID0gMHgwMSwKLSAgU1VTUEVORF9JTlFVSVJZX1NDQU4gPSAweDAyLAotICBTVVNQRU5EX1BFUklPRElDX0lOUVVJUlkgPSAweDAzLAotfQotCi1wYWNrZXQgUmVhZEhvbGRNb2RlQWN0aXZpdHkgOiBDb21tYW5kIChvcF9jb2RlID0gUkVBRF9IT0xEX01PREVfQUNUSVZJVFkpIHsKLX0KLQotcGFja2V0IFJlYWRIb2xkTW9kZUFjdGl2aXR5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfSE9MRF9NT0RFX0FDVElWSVRZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgaG9sZF9tb2RlX2FjdGl2aXR5IDogSG9sZE1vZGVBY3Rpdml0eSwKLX0KLQotcGFja2V0IFdyaXRlSG9sZE1vZGVBY3Rpdml0eSA6IENvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9IT0xEX01PREVfQUNUSVZJVFkpIHsKLSAgaG9sZF9tb2RlX2FjdGl2aXR5IDogSG9sZE1vZGVBY3Rpdml0eSwKLX0KLQotcGFja2V0IFdyaXRlSG9sZE1vZGVBY3Rpdml0eUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9IT0xEX01PREVfQUNUSVZJVFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1lbnVtIFRyYW5zbWl0UG93ZXJMZXZlbFR5cGUgOiA4IHsKLSAgQ1VSUkVOVCA9IDB4MDAsCi0gIE1BWElNVU0gPSAweDAxLAotfQotCi1wYWNrZXQgUmVhZFRyYW5zbWl0UG93ZXJMZXZlbCA6IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IFJFQURfVFJBTlNNSVRfUE9XRVJfTEVWRUwpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHRyYW5zbWl0X3Bvd2VyX2xldmVsX3R5cGUgOiBUcmFuc21pdFBvd2VyTGV2ZWxUeXBlLAotCi19Ci0KLXBhY2tldCBSZWFkVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfVFJBTlNNSVRfUE9XRVJfTEVWRUwpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgdHJhbnNtaXRfcG93ZXJfbGV2ZWwgOiA4LAotfQotCi1wYWNrZXQgUmVhZFN5bmNocm9ub3VzRmxvd0NvbnRyb2xFbmFibGUgOiBDb21tYW5kIChvcF9jb2RlID0gUkVBRF9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFKSB7Ci19Ci0KLXBhY2tldCBSZWFkU3luY2hyb25vdXNGbG93Q29udHJvbEVuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX1NZTkNIUk9OT1VTX0ZMT1dfQ09OVFJPTF9FTkFCTEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBlbmFibGUgOiBFbmFibGUsCi19Ci0KLXBhY2tldCBXcml0ZVN5bmNocm9ub3VzRmxvd0NvbnRyb2xFbmFibGUgOiBDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfU1lOQ0hST05PVVNfRkxPV19DT05UUk9MX0VOQUJMRSkgewotICBlbmFibGUgOiBFbmFibGUsCi19Ci0KLXBhY2tldCBXcml0ZVN5bmNocm9ub3VzRmxvd0NvbnRyb2xFbmFibGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfU1lOQ0hST05PVVNfRkxPV19DT05UUk9MX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBTZXRDb250cm9sbGVyVG9Ib3N0Rmxvd0NvbnRyb2wgOiBDb21tYW5kIChvcF9jb2RlID0gU0VUX0NPTlRST0xMRVJfVE9fSE9TVF9GTE9XX0NPTlRST0wpIHsKLSAgYWNsIDogMSwKLSAgc3luY2hyb25vdXMgOiAxLAotICBfcmVzZXJ2ZWRfIDogNiwKLX0KLQotcGFja2V0IFNldENvbnRyb2xsZXJUb0hvc3RGbG93Q29udHJvbENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBTRVRfQ09OVFJPTExFUl9UT19IT1NUX0ZMT1dfQ09OVFJPTCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBIb3N0QnVmZmVyU2l6ZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBIT1NUX0JVRkZFUl9TSVpFKSB7Ci0gIGhvc3RfYWNsX2RhdGFfcGFja2V0X2xlbmd0aCA6IDE2LAotICBob3N0X3N5bmNocm9ub3VzX2RhdGFfcGFja2V0X2xlbmd0aCA6IDgsCi0gIGhvc3RfdG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMgOiAxNiwKLSAgaG9zdF90b3RhbF9udW1fc3luY2hyb25vdXNfZGF0YV9wYWNrZXRzIDogMTYsCi19Ci0KLXRlc3QgSG9zdEJ1ZmZlclNpemUgewotICAiXHgzM1x4MGNceDA3XHg5Ylx4MDZceGZmXHgxNFx4MDBceDBhXHgwMCIsCi19Ci0KLXBhY2tldCBIb3N0QnVmZmVyU2l6ZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBIT1NUX0JVRkZFUl9TSVpFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBIb3N0QnVmZmVyU2l6ZUNvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4MzNceDBjXHgwMCIsCi19Ci0KLXN0cnVjdCBDb21wbGV0ZWRQYWNrZXRzIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGhvc3RfbnVtX29mX2NvbXBsZXRlZF9wYWNrZXRzIDogMTYsCi19Ci0KLXBhY2tldCBIb3N0TnVtQ29tcGxldGVkUGFja2V0cyA6IENvbW1hbmQgKG9wX2NvZGUgPSBIT1NUX05VTV9DT01QTEVURURfUEFDS0VUUykgewotICBfY291bnRfKGNvbXBsZXRlZF9wYWNrZXRzKSA6IDgsCi0gIGNvbXBsZXRlZF9wYWNrZXRzIDogQ29tcGxldGVkUGFja2V0c1tdLAotfQotCi1wYWNrZXQgSG9zdE51bUNvbXBsZXRlZFBhY2tldHNFcnJvciA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gSE9TVF9OVU1fQ09NUExFVEVEX1BBQ0tFVFMpIHsKLSAgZXJyb3JfY29kZSA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0IDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQgOiAxNiwgLy8gMHgwMDEtMHhGRkZGICgwLjYyNW1zLTQwLjlzKQotfQotCi1wYWNrZXQgV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0IDogQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQgOiAxNiwgLy8gMHgwMDEtMHhGRkZGICgwLjYyNW1zLTQwLjlzKQotfQotCi1wYWNrZXQgV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVhZE51bWJlck9mU3VwcG9ydGVkSWFjIDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFJFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9JQUMpIHsKLX0KLQotdGVzdCBSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWMgewotICAiXHgzOFx4MGNceDAwIiwKLX0KLQotcGFja2V0IFJlYWROdW1iZXJPZlN1cHBvcnRlZElhY0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX05VTUJFUl9PRl9TVVBQT1JURURfSUFDKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbnVtX3N1cHBvcnRfaWFjIDogOCwKLX0KLQotdGVzdCBSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWNDb21wbGV0ZSB7Ci0gICJceDBlXHgwNVx4MDFceDM4XHgwY1x4MDBceDk5IiwKLX0KLQotcGFja2V0IFJlYWRDdXJyZW50SWFjTGFwIDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFJFQURfQ1VSUkVOVF9JQUNfTEFQKSB7Ci19Ci0KLXRlc3QgUmVhZEN1cnJlbnRJYWNMYXAgewotICAiXHgzOVx4MGNceDAwIiwKLX0KLQotcGFja2V0IFJlYWRDdXJyZW50SWFjTGFwQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfQ1VSUkVOVF9JQUNfTEFQKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgX2NvdW50XyhsYXBzX3RvX3JlYWQpIDogOCwKLSAgbGFwc190b19yZWFkIDogTGFwW10sCi19Ci0KLXRlc3QgUmVhZEN1cnJlbnRJYWNMYXBDb21wbGV0ZSB7Ci0gICJceDBlXHgwYlx4MDFceDM5XHgwY1x4MDBceDAyXHgxMVx4OGJceDllXHgyMlx4OGJceDllIiwKLX0KLQotcGFja2V0IFdyaXRlQ3VycmVudElhY0xhcCA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9DVVJSRU5UX0lBQ19MQVApIHsKLSAgX2NvdW50XyhsYXBzX3RvX3dyaXRlKSA6IDgsCi0gIGxhcHNfdG9fd3JpdGUgOiBMYXBbXSwKLX0KLQotdGVzdCBXcml0ZUN1cnJlbnRJYWNMYXAgewotICAiXHgzYVx4MGNceDA3XHgwMlx4MTFceDhiXHg5ZVx4MjJceDhiXHg5ZSIsCi19Ci0KLXBhY2tldCBXcml0ZUN1cnJlbnRJYWNMYXBDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfQ1VSUkVOVF9JQUNfTEFQKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBXcml0ZUN1cnJlbnRJYWNMYXBDb21wbGV0ZSB7Ci0gICJceDBlXHgwNFx4MDFceDNhXHgwY1x4MDAiLAotfQotCi1wYWNrZXQgU2V0QWZoSG9zdENoYW5uZWxDbGFzc2lmaWNhdGlvbiA6IENvbW1hbmQgKG9wX2NvZGUgPSBTRVRfQUZIX0hPU1RfQ0hBTk5FTF9DTEFTU0lGSUNBVElPTikgewotICBhZmhfaG9zdF9jaGFubmVsX2NsYXNzaWZpY2F0aW9uIDogOFsxMF0sCi19Ci0KLXBhY2tldCBTZXRBZmhIb3N0Q2hhbm5lbENsYXNzaWZpY2F0aW9uQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFNFVF9BRkhfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBJbnF1aXJ5U2NhblR5cGUgOiA4IHsKLSAgU1RBTkRBUkQgPSAweDAwLAotICBJTlRFUkxBQ0VEID0gMHgwMSwKLX0KLQotcGFja2V0IFJlYWRJbnF1aXJ5U2NhblR5cGUgOiBEaXNjb3ZlcnlDb21tYW5kIChvcF9jb2RlID0gUkVBRF9JTlFVSVJZX1NDQU5fVFlQRSkgewotfQotCi1wYWNrZXQgUmVhZElucXVpcnlTY2FuVHlwZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0lOUVVJUllfU0NBTl9UWVBFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgaW5xdWlyeV9zY2FuX3R5cGUgOiBJbnF1aXJ5U2NhblR5cGUsCi19Ci0KLXBhY2tldCBXcml0ZUlucXVpcnlTY2FuVHlwZSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9JTlFVSVJZX1NDQU5fVFlQRSkgewotICBpbnF1aXJ5X3NjYW5fdHlwZSA6IElucXVpcnlTY2FuVHlwZSwKLX0KLQotcGFja2V0IFdyaXRlSW5xdWlyeVNjYW5UeXBlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX0lOUVVJUllfU0NBTl9UWVBFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBJbnF1aXJ5TW9kZSA6IDggewotICBTVEFOREFSRCA9IDB4MDAsCi0gIFJTU0kgPSAweDAxLAotICBSU1NJX09SX0VYVEVOREVEID0gMHgwMiwKLX0KLQotcGFja2V0IFJlYWRJbnF1aXJ5TW9kZSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0lOUVVJUllfTU9ERSkgewotfQotCi1wYWNrZXQgUmVhZElucXVpcnlNb2RlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfSU5RVUlSWV9NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgaW5xdWlyeV9tb2RlIDogSW5xdWlyeU1vZGUsCi19Ci0KLXBhY2tldCBXcml0ZUlucXVpcnlNb2RlIDogRGlzY292ZXJ5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX0lOUVVJUllfTU9ERSkgewotICBpbnF1aXJ5X21vZGUgOiBJbnF1aXJ5TW9kZSwKLX0KLQotcGFja2V0IFdyaXRlSW5xdWlyeU1vZGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfSU5RVUlSWV9NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBQYWdlU2NhblR5cGUgOiA4IHsKLSAgU1RBTkRBUkQgPSAweDAwLAotICBJTlRFUkxBQ0VEID0gMHgwMSwKLX0KLQotcGFja2V0IFJlYWRQYWdlU2NhblR5cGUgOiBEaXNjb3ZlcnlDb21tYW5kIChvcF9jb2RlID0gUkVBRF9QQUdFX1NDQU5fVFlQRSkgewotfQotCi1wYWNrZXQgUmVhZFBhZ2VTY2FuVHlwZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX1BBR0VfU0NBTl9UWVBFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgcGFnZV9zY2FuX3R5cGUgOiBQYWdlU2NhblR5cGUsCi19Ci0KLXBhY2tldCBXcml0ZVBhZ2VTY2FuVHlwZSA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9QQUdFX1NDQU5fVFlQRSkgewotICBwYWdlX3NjYW5fdHlwZSA6IFBhZ2VTY2FuVHlwZSwKLX0KLQotcGFja2V0IFdyaXRlUGFnZVNjYW5UeXBlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX1BBR0VfU0NBTl9UWVBFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFJlYWRBZmhDaGFubmVsQXNzZXNzbWVudE1vZGUgOiBDb21tYW5kIChvcF9jb2RlID0gUkVBRF9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUpIHsKLX0KLQotcGFja2V0IFJlYWRBZmhDaGFubmVsQXNzZXNzbWVudE1vZGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb250cm9sbGVyX2NoYW5uZWxfYXNzZXNzbWVudCA6IEVuYWJsZSwKLX0KLQotcGFja2V0IFdyaXRlQWZoQ2hhbm5lbEFzc2Vzc21lbnRNb2RlIDogQ29tbWFuZCAob3BfY29kZSA9IFdSSVRFX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERSkgewotICBjb250cm9sbGVyX2NoYW5uZWxfYXNzZXNzbWVudCA6IEVuYWJsZSwKLX0KLQotcGFja2V0IFdyaXRlQWZoQ2hhbm5lbEFzc2Vzc21lbnRNb2RlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLWVudW0gRmVjUmVxdWlyZWQgOiA4IHsKLSAgTk9UX1JFUVVJUkVEID0gMHgwMCwKLSAgUkVRVUlSRUQgPSAweDAxLAotfQotCi1wYWNrZXQgUmVhZEV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRSkgewotfQotCi1wYWNrZXQgUmVhZEV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGZlY19yZXF1aXJlZCA6IEZlY1JlcXVpcmVkLAotICBleHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlIDogR2FwRGF0YVtdLAotfQotCi1wYWNrZXQgV3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9FWFRFTkRFRF9JTlFVSVJZX1JFU1BPTlNFKSB7Ci0gIGZlY19yZXF1aXJlZCA6IEZlY1JlcXVpcmVkLAotICBleHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlIDogR2FwRGF0YVtdLAotICBfcGFkZGluZ19bMjQwXSwgLy8gWmVybyBwYWRkaW5nIEdhcERhdGFbXSB0byBiZSAyNDAgb2N0ZXRzCi19Ci0KLXBhY2tldCBXcml0ZUV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX0VYVEVOREVEX0lOUVVJUllfUkVTUE9OU0UpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgUmVmcmVzaEVuY3J5cHRpb25LZXkgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBSRUZSRVNIX0VOQ1JZUFRJT05fS0VZKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVmcmVzaEVuY3J5cHRpb25LZXlTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBSRUZSRVNIX0VOQ1JZUFRJT05fS0VZKSB7Ci19Ci0KLXBhY2tldCBSZWFkU2ltcGxlUGFpcmluZ01vZGUgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1NJTVBMRV9QQUlSSU5HX01PREUpIHsKLX0KLQotcGFja2V0IFJlYWRTaW1wbGVQYWlyaW5nTW9kZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX1NJTVBMRV9QQUlSSU5HX01PREUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBzaW1wbGVfcGFpcmluZ19tb2RlIDogRW5hYmxlLAotfQotCi1wYWNrZXQgV3JpdGVTaW1wbGVQYWlyaW5nTW9kZSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1NJTVBMRV9QQUlSSU5HX01PREUpIHsKLSAgc2ltcGxlX3BhaXJpbmdfbW9kZSA6IEVuYWJsZSwKLX0KLQotdGVzdCBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlIHsKLSAgIlx4NTZceDBjXHgwMVx4MDEiLAotfQotCi1wYWNrZXQgV3JpdGVTaW1wbGVQYWlyaW5nTW9kZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9TSU1QTEVfUEFJUklOR19NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlQ29tcGxldGUgewotICAiXHgwZVx4MDRceDAxXHg1Nlx4MGNceDAwIiwKLX0KLQotcGFja2V0IFJlYWRMb2NhbE9vYkRhdGEgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xPQ0FMX09PQl9EQVRBKSB7Ci19Ci0KLXBhY2tldCBSZWFkTG9jYWxPb2JEYXRhQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfTE9DQUxfT09CX0RBVEEpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjIDogOFsxNl0sCi0gIHIgOiA4WzE2XSwKLX0KLQotcGFja2V0IFJlYWRJbnF1aXJ5UmVzcG9uc2VUcmFuc21pdFBvd2VyTGV2ZWwgOiBEaXNjb3ZlcnlDb21tYW5kIChvcF9jb2RlID0gUkVBRF9JTlFVSVJZX1JFU1BPTlNFX1RSQU5TTUlUX1BPV0VSX0xFVkVMKSB7Ci19Ci0KLXBhY2tldCBSZWFkSW5xdWlyeVJlc3BvbnNlVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfSU5RVUlSWV9SRVNQT05TRV9UUkFOU01JVF9QT1dFUl9MRVZFTCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIHR4X3Bvd2VyIDogOCwgLy8gKC03MGRCbSB0byAyMGRCbSkKLX0KLQotcGFja2V0IFdyaXRlSW5xdWlyeVRyYW5zbWl0UG93ZXJMZXZlbCA6IERpc2NvdmVyeUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9JTlFVSVJZX1RSQU5TTUlUX1BPV0VSX0xFVkVMKSB7Ci0gIHR4X3Bvd2VyIDogOCwKLX0KLQotcGFja2V0IFdyaXRlSW5xdWlyeVJlc3BvbnNlVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX0lOUVVJUllfVFJBTlNNSVRfUE9XRVJfTEVWRUwpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1lbnVtIEtleXByZXNzTm90aWZpY2F0aW9uVHlwZSA6IDggewotICBFTlRSWV9TVEFSVEVEID0gMCwKLSAgRElHSVRfRU5URVJFRCA9IDEsCi0gIERJR0lUX0VSQVNFRCA9IDIsCi0gIENMRUFSRUQgPSAzLAotICBFTlRSWV9DT01QTEVURUQgPSA0LAotfQotCi1wYWNrZXQgU2VuZEtleXByZXNzTm90aWZpY2F0aW9uIDogU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gU0VORF9LRVlQUkVTU19OT1RJRklDQVRJT04pIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIG5vdGlmaWNhdGlvbl90eXBlIDogS2V5cHJlc3NOb3RpZmljYXRpb25UeXBlLAotfQotCi1wYWNrZXQgU2VuZEtleXByZXNzTm90aWZpY2F0aW9uQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFNFTkRfS0VZUFJFU1NfTk9USUZJQ0FUSU9OKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBSZWFkTGVIb3N0U3VwcG9ydCA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xFX0hPU1RfU1VQUE9SVCkgewotfQotCi1wYWNrZXQgUmVhZExlSG9zdFN1cHBvcnRDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9MRV9IT1NUX1NVUFBPUlQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBsZV9zdXBwb3J0ZWRfaG9zdCA6IEVuYWJsZSwKLSAgX3Jlc2VydmVkXyA6IDgsIC8vIHNpbXVsdGFuZW91c19sZV9ob3N0IHJlc2VydmVkIHNpbmNlIDQuMQotfQotCi1wYWNrZXQgV3JpdGVMZUhvc3RTdXBwb3J0IDogQ29tbWFuZCAob3BfY29kZSA9IFdSSVRFX0xFX0hPU1RfU1VQUE9SVCkgewotICBsZV9zdXBwb3J0ZWRfaG9zdCA6IEVuYWJsZSwKLSAgc2ltdWx0YW5lb3VzX2xlX2hvc3QgOiBFbmFibGUsICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoaXMgc2hvdWxkIGJlIDB4MDAgc2luY2UgNC4xCi19Ci0KLXRlc3QgV3JpdGVMZUhvc3RTdXBwb3J0IHsKLSAgIlx4NmRceDBjXHgwMlx4MDFceDAxIiwKLX0KLQotcGFja2V0IFdyaXRlTGVIb3N0U3VwcG9ydENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9MRV9IT1NUX1NVUFBPUlQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi10ZXN0IFdyaXRlTGVIb3N0U3VwcG9ydENvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4NmRceDBjXHgwMCIsCi19Ci0KLXBhY2tldCBSZWFkU2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydCA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQpIHsKLX0KLQotcGFja2V0IFJlYWRTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfU0VDVVJFX0NPTk5FQ1RJT05TX0hPU1RfU1VQUE9SVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIHNlY3VyZV9jb25uZWN0aW9uc19ob3N0X3N1cHBvcnQgOiBFbmFibGUsCi19Ci0KLXBhY2tldCBXcml0ZVNlY3VyZUNvbm5lY3Rpb25zSG9zdFN1cHBvcnQgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9TRUNVUkVfQ09OTkVDVElPTlNfSE9TVF9TVVBQT1JUKSB7Ci0gIHNlY3VyZV9jb25uZWN0aW9uc19ob3N0X3N1cHBvcnQgOiBFbmFibGUsCi19Ci0KLXRlc3QgV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0IHsKLSAgIlx4N2FceDBjXHgwMVx4MDEiLAotfQotCi1wYWNrZXQgV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFdSSVRFX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi10ZXN0IFdyaXRlU2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydENvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4N2FceDBjXHgwMCIsCi19Ci0KLXBhY2tldCBSZWFkTG9jYWxPb2JFeHRlbmRlZERhdGEgOiBTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xPQ0FMX09PQl9FWFRFTkRFRF9EQVRBKSB7Ci19Ci0KLXBhY2tldCBSZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9MT0NBTF9PT0JfRVhURU5ERURfREFUQSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNfMTkyIDogOFsxNl0sCi0gIHJfMTkyIDogOFsxNl0sCi0gIGNfMjU2IDogOFsxNl0sCi0gIHJfMjU2IDogOFsxNl0sCi19Ci0KLXBhY2tldCBTZXRFY29zeXN0ZW1CYXNlSW50ZXJ2YWwgOiBDb21tYW5kIChvcF9jb2RlID0gU0VUX0VDT1NZU1RFTV9CQVNFX0lOVEVSVkFMKSB7Ci0gIGludGVydmFsIDogMTYsCi19Ci0KLXBhY2tldCBTZXRFY29zeXN0ZW1CYXNlSW50ZXJ2YWxDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gU0VUX0VDT1NZU1RFTV9CQVNFX0lOVEVSVkFMKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBEYXRhUGF0aERpcmVjdGlvbiA6IDggewotICBJTlBVVCA9IDAsCi0gIE9VVFBVVCA9IDEsCi19Ci0KLXBhY2tldCBDb25maWd1cmVEYXRhUGF0aCA6IENvbW1hbmQgKG9wX2NvZGUgPSBDT05GSUdVUkVfREFUQV9QQVRIKSB7Ci0gIGRhdGFfcGF0aF9kaXJlY3Rpb24gOiBEYXRhUGF0aERpcmVjdGlvbiwKLSAgZGF0YV9wYXRoX2lkIDogOCwKLSAgX3NpemVfKHZlbmRvcl9zcGVjaWZpY19jb25maWcpIDogOCwKLSAgdmVuZG9yX3NwZWNpZmljX2NvbmZpZyA6IDhbXSwKLX0KLQotcGFja2V0IENvbmZpZ3VyZURhdGFQYXRoQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IENPTkZJR1VSRV9EQVRBX1BBVEgpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi0KLSAgLy8gSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTCi1wYWNrZXQgUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTikgewotfQotCi10ZXN0IFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbiB7Ci0gICJceDAxXHgxMFx4MDAiLAotfQotCi1lbnVtIEhjaVZlcnNpb24gOiA4IHsKLSAgVl8xXzBCID0gMHgwMCwKLSAgVl8xXzEgPSAweDAxLAotICBWXzFfMiA9IDB4MDIsCi0gIFZfMl8wID0gMHgwMywgLy8gICsgRURSCi0gIFZfMl8xID0gMHgwNCwgLy8gICsgRURSCi0gIFZfM18wID0gMHgwNSwgLy8gICsgSFMKLSAgVl80XzAgPSAweDA2LAotICBWXzRfMSA9IDB4MDcsCi0gIFZfNF8yID0gMHgwOCwKLSAgVl81XzAgPSAweDA5LAotICBWXzVfMSA9IDB4MGEsCi0gIFZfNV8yID0gMHgwYiwKLX0KLQotZW51bSBMbXBWZXJzaW9uIDogOCB7Ci0gIFZfMV8wQiA9IDB4MDAsIC8vIHdpdGhkcmF3bgotICBWXzFfMSA9IDB4MDEsIC8vIHdpdGhkcmF3bgotICBWXzFfMiA9IDB4MDIsIC8vIHdpdGhkcmF3bgotICBWXzJfMCA9IDB4MDMsIC8vICArIEVEUgotICBWXzJfMSA9IDB4MDQsIC8vICArIEVEUgotICBWXzNfMCA9IDB4MDUsIC8vICArIEhTCi0gIFZfNF8wID0gMHgwNiwKLSAgVl80XzEgPSAweDA3LAotICBWXzRfMiA9IDB4MDgsCi0gIFZfNV8wID0gMHgwOSwKLSAgVl81XzEgPSAweDBhLAotICBWXzVfMiA9IDB4MGIsCi19Ci0KLXN0cnVjdCBMb2NhbFZlcnNpb25JbmZvcm1hdGlvbiB7Ci0gIGhjaV92ZXJzaW9uIDogSGNpVmVyc2lvbiwKLSAgaGNpX3JldmlzaW9uIDogMTYsCi0gIGxtcF92ZXJzaW9uIDogTG1wVmVyc2lvbiwKLSAgbWFudWZhY3R1cmVyX25hbWUgOiAxNiwKLSAgbG1wX3N1YnZlcnNpb24gOiAxNiwKLX0KLQotcGFja2V0IFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT04pIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uIDogTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24sCi19Ci0KLXRlc3QgUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUgewotICAiXHgwZVx4MGNceDAxXHgwMVx4MTBceDAwXHgwOVx4MDBceDAwXHgwOVx4MWRceDAwXHhiZVx4MDIiLAotfQotCi1wYWNrZXQgUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHMgOiBDb21tYW5kIChvcF9jb2RlID0gUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFMpIHsKLX0KLQotdGVzdCBSZWFkTG9jYWxTdXBwb3J0ZWRDb21tYW5kcyB7Ci0gICJceDAyXHgxMFx4MDAiLAotfQotCi1wYWNrZXQgUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHNDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFMpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBzdXBwb3J0ZWRfY29tbWFuZHMgOiA4WzY0XSwKLX0KLQotdGVzdCBSZWFkTG9jYWxTdXBwb3J0ZWRDb21tYW5kc0NvbXBsZXRlIHsKLSAgIlx4MGVceDQ0XHgwMVx4MDJceDEwXHgwMFx4ZmZceGZmXHhmZlx4MDNceGNlXHhmZlx4ZWZceGZmXHhmZlx4ZmZceGZmXHg3Zlx4ZjJceDBmXHhlOFx4ZmVceDNmXHhmN1x4ODNceGZmXHgxY1x4MDBceDAwXHgwMFx4NjFceGZmXHhmZlx4ZmZceDdmXHhiZVx4MjBceGY1XHhmZlx4ZjBceGZmXHhmZlx4ZmZceGZmXHhmZlx4MDdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotfQotCi1wYWNrZXQgUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMgOiBDb21tYW5kIChvcF9jb2RlID0gUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVMpIHsKLX0KLQotcGFja2V0IFJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbG1wX2ZlYXR1cmVzIDogNjQsCi19Ci0KLXBhY2tldCBSZWFkTG9jYWxFeHRlbmRlZEZlYXR1cmVzIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfTE9DQUxfRVhURU5ERURfRkVBVFVSRVMpIHsKLSAgcGFnZV9udW1iZXIgOiA4LAotfQotCi10ZXN0IFJlYWRMb2NhbEV4dGVuZGVkRmVhdHVyZXMgewotICAiXHgwNFx4MTBceDAxXHgwMCIsCi0gICJceDA0XHgxMFx4MDFceDAxIiwKLSAgIlx4MDRceDEwXHgwMVx4MDIiLAotfQotCi1wYWNrZXQgUmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xPQ0FMX0VYVEVOREVEX0ZFQVRVUkVTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgcGFnZV9udW1iZXIgOiA4LAotICBtYXhpbXVtX3BhZ2VfbnVtYmVyIDogOCwKLSAgZXh0ZW5kZWRfbG1wX2ZlYXR1cmVzIDogNjQsCi19Ci0KLXRlc3QgUmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0NvbXBsZXRlIHsKLSAgIlx4MGVceDBlXHgwMVx4MDRceDEwXHgwMFx4MDBceDAyXHhmZlx4ZmVceDhmXHhmZVx4ZDhceDNmXHg1Ylx4ODciLAotICAiXHgwZVx4MGVceDAxXHgwNFx4MTBceDAwXHgwMVx4MDJceDA3XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0gICJceDBlXHgwZVx4MDFceDA0XHgxMFx4MDBceDAyXHgwMlx4NDVceDAzXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLX0KLQotcGFja2V0IFJlYWRCdWZmZXJTaXplIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfQlVGRkVSX1NJWkUpIHsKLX0KLQotdGVzdCBSZWFkQnVmZmVyU2l6ZSB7Ci0gICJceDA1XHgxMFx4MDAiLAotfQotCi1wYWNrZXQgUmVhZEJ1ZmZlclNpemVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9CVUZGRVJfU0laRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGFjbF9kYXRhX3BhY2tldF9sZW5ndGggOiAxNiwKLSAgc3luY2hyb25vdXNfZGF0YV9wYWNrZXRfbGVuZ3RoIDogOCwKLSAgdG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMgOiAxNiwKLSAgdG90YWxfbnVtX3N5bmNocm9ub3VzX2RhdGFfcGFja2V0cyA6IDE2LAotfQotCi10ZXN0IFJlYWRCdWZmZXJTaXplQ29tcGxldGUgewotICAiXHgwZVx4MGJceDAxXHgwNVx4MTBceDAwXHgwMFx4MDRceDNjXHgwN1x4MDBceDA4XHgwMCIsCi19Ci0KLXBhY2tldCBSZWFkQmRBZGRyIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfQkRfQUREUikgewotfQotCi10ZXN0IFJlYWRCZEFkZHIgewotICAiXHgwOVx4MTBceDAwIiwKLX0KLQotcGFja2V0IFJlYWRCZEFkZHJDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9CRF9BRERSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXRlc3QgUmVhZEJkQWRkckNvbXBsZXRlIHsKLSAgIlx4MGVceDBhXHgwMVx4MDlceDEwXHgwMFx4MTRceDhlXHg2MVx4NWZceDM2XHg4OCIsCi19Ci0KLXBhY2tldCBSZWFkRGF0YUJsb2NrU2l6ZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0RBVEFfQkxPQ0tfU0laRSkgewotfQotCi1wYWNrZXQgUmVhZERhdGFCbG9ja1NpemVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9EQVRBX0JMT0NLX1NJWkUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBtYXhfYWNsX2RhdGFfcGFja2V0X2xlbmd0aCA6IDE2LAotICBkYXRhX2Jsb2NrX2xlbmd0aCA6IDE2LAotICB0b3RhbF9udW1fZGF0YV9ibG9ja3MgOiAxNiwKLX0KLQotcGFja2V0IFJlYWRMb2NhbFN1cHBvcnRlZENvZGVjc1YxIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDU19WMSkgewotfQotCi1wYWNrZXQgUmVhZExvY2FsU3VwcG9ydGVkQ29kZWNzVjFDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9MT0NBTF9TVVBQT1JURURfQ09ERUNTX1YxKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgX3NpemVfKHN1cHBvcnRlZF9jb2RlY3MpIDogOCwKLSAgc3VwcG9ydGVkX2NvZGVjcyA6IDhbXSwKLSAgX3NpemVfKHZlbmRvcl9zcGVjaWZpY19jb2RlY3MpIDogOCwKLSAgdmVuZG9yX3NwZWNpZmljX2NvZGVjcyA6IDMyW10sCi19Ci0KLXBhY2tldCBSZWFkTG9jYWxTdXBwb3J0ZWRDb2RlY3NWMiA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfVjIpIHsKLX0KLQotZ3JvdXAgQ29kZWNUcmFuc3BvcnQgewotICBicl9lZHIgOiAxLAotICBicl9lZHJfc2NvX2FuZF9lc2NvIDogMSwKLSAgbGVfY2lzIDogMSwKLSAgbGVfYmlzIDogMSwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXN0cnVjdCBDb2RlY0NvbmZpZ3VyYXRpb24gewotICBjb2RlY19pZCA6IDgsCi0gIENvZGVjVHJhbnNwb3J0LAotfQotCi1zdHJ1Y3QgVmVuZG9yQ29kZWNDb25maWd1cmF0aW9uIHsKLSAgY29tcGFueV9pZCA6IDE2LAotICBjb2RlY192ZW5kb3JfaWQgOiAxNiwKLSAgQ29kZWNUcmFuc3BvcnQsCi19Ci0KLXBhY2tldCBSZWFkTG9jYWxTdXBwb3J0ZWRDb2RlY3NWMkNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfVjIpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBfc2l6ZV8oc3VwcG9ydGVkX2NvZGVjcykgOiA4LAotICBzdXBwb3J0ZWRfY29kZWNzIDogQ29kZWNDb25maWd1cmF0aW9uW10sCi0gIF9zaXplXyh2ZW5kb3Jfc3BlY2lmaWNfY29kZWNzKSA6IDgsCi0gIHZlbmRvcl9zcGVjaWZpY19jb2RlY3MgOiBWZW5kb3JDb2RlY0NvbmZpZ3VyYXRpb25bXSwKLX0KLQotcGFja2V0IFJlYWRMb2NhbFN1cHBvcnRlZENvZGVjQ2FwYWJpbGl0aWVzIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDX0NBUEFCSUxJVElFUykgewotICBjb2RlY19pZCA6IDgsCi0gIGNvbXBhbnlfaWQgOiAxNiwKLSAgY29kZWNfdmVuZG9yX2lkIDogMTYsCi0gIENvZGVjVHJhbnNwb3J0LAotICBkaXJlY3Rpb24gOiBEYXRhUGF0aERpcmVjdGlvbiwKLX0KLQotc3RydWN0IENvZGVjQ2FwYWJpbGl0eSB7Ci0gIF9zaXplXyhjYXBhYmlsaXR5KSA6IDgsCi0gIGNhcGFiaWxpdHkgOiA4W10sCi19Ci0KLXBhY2tldCBSZWFkTG9jYWxTdXBwb3J0ZWRDb2RlY0NhcGFiaWxpdGllc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ19DQVBBQklMSVRJRVMpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBfY291bnRfKGNvZGVjX2NhcGFiaWxpdGllcykgOiA4LAotICBjb2RlY19jYXBhYmlsaXRpZXMgOiBDb2RlY0NhcGFiaWxpdHlbXSwKLX0KLQotcGFja2V0IFJlYWRMb2NhbFN1cHBvcnRlZENvbnRyb2xsZXJEZWxheSA6IENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT05UUk9MTEVSX0RFTEFZKSB7Ci0gIGNvZGVjX2lkIDogOCwKLSAgY29tcGFueV9pZCA6IDE2LAotICBjb2RlY192ZW5kb3JfaWQgOiAxNiwKLSAgQ29kZWNUcmFuc3BvcnQsCi0gIGRpcmVjdGlvbiA6IERhdGFQYXRoRGlyZWN0aW9uLAotICBfc2l6ZV8oY29kZWNfY29uZmlndXJhdGlvbikgOiA4LAotICBjb2RlY19jb25maWd1cmF0aW9uIDogOFtdLAotfQotCi1wYWNrZXQgUmVhZExvY2FsU3VwcG9ydGVkQ29udHJvbGxlckRlbGF5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPTlRST0xMRVJfREVMQVkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBtaW5fY29udHJvbGxlcl9kZWxheSA6IDI0LAotICBtYXhfY29udHJvbGxlcl9kZWxheSA6IDI0LAotfQotCi0KLSAgLy8gU1RBVFVTX1BBUkFNRVRFUlMKLXBhY2tldCBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXIgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGZhaWxlZF9jb250YWN0X2NvdW50ZXIgOiAxNiwKLX0KLQotcGFja2V0IFJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXIgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRVNFVF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVzZXRGYWlsZWRDb250YWN0Q291bnRlckNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRVNFVF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBSZWFkTGlua1F1YWxpdHkgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0xJTktfUVVBTElUWSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xJTktfUVVBTElUWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsaW5rX3F1YWxpdHkgOiA4LAotfQotCi1wYWNrZXQgUmVhZFJzc2kgOiBBY2xDb21tYW5kIChvcF9jb2RlID0gUkVBRF9SU1NJKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgUmVhZFJzc2lDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9SU1NJKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHJzc2kgOiA4LAotfQotCi1wYWNrZXQgUmVhZEFmaENoYW5uZWxNYXAgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0FGSF9DSEFOTkVMX01BUCkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotZW51bSBBZmhNb2RlIDogOCB7Ci0gIEFGSF9ESVNBQkxFRCA9IDB4MDAsCi0gIEFGSF9FTkFCTEVEID0gMHgwMSwKLX0KLQotcGFja2V0IFJlYWRBZmhDaGFubmVsTWFwQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IFJFQURfQUZIX0NIQU5ORUxfTUFQKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGFmaF9tb2RlIDogQWZoTW9kZSwKLSAgYWZoX2NoYW5uZWxfbWFwIDogOFsxMF0sCi19Ci0KLQotZW51bSBXaGljaENsb2NrIDogOCB7Ci0gIExPQ0FMID0gMHgwMCwKLSAgUElDT05FVCA9IDB4MDEsCi19Ci0KLXBhY2tldCBSZWFkQ2xvY2sgOiBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBSRUFEX0NMT0NLKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICB3aGljaF9jbG9jayA6IFdoaWNoQ2xvY2ssCi19Ci0KLXBhY2tldCBSZWFkQ2xvY2tDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gUkVBRF9DTE9DSykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBjbG9jayA6IDI4LAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgYWNjdXJhY3kgOiAxNiwKLX0KLQotcGFja2V0IFJlYWRFbmNyeXB0aW9uS2V5U2l6ZSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFJFQURfRU5DUllQVElPTl9LRVlfU0laRSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFJlYWRFbmNyeXB0aW9uS2V5U2l6ZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0VOQ1JZUFRJT05fS0VZX1NJWkUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAga2V5X3NpemUgOiA4LAotfQotCi0gIC8vIFRFU1RJTkcKLWVudW0gTG9vcGJhY2tNb2RlIDogOCB7Ci0gIE5PX0xPT1BCQUNLID0gMHgwMCwKLSAgRU5BQkxFX0xPQ0FMID0gMHgwMSwKLSAgRU5BQkxFX1JFTU9URSA9IDB4MDIsCi19Ci0KLXBhY2tldCBSZWFkTG9vcGJhY2tNb2RlIDogQ29tbWFuZCAob3BfY29kZSA9IFJFQURfTE9PUEJBQ0tfTU9ERSkgewotfQotCi1wYWNrZXQgUmVhZExvb3BiYWNrTW9kZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBSRUFEX0xPT1BCQUNLX01PREUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBsb29wYmFja19tb2RlIDogTG9vcGJhY2tNb2RlLAotfQotCi1wYWNrZXQgV3JpdGVMb29wYmFja01vZGUgOiBDb21tYW5kIChvcF9jb2RlID0gV1JJVEVfTE9PUEJBQ0tfTU9ERSkgewotICBsb29wYmFja19tb2RlIDogTG9vcGJhY2tNb2RlLAotfQotCi1wYWNrZXQgV3JpdGVMb29wYmFja01vZGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfTE9PUEJBQ0tfTU9ERSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBFbmFibGVEZXZpY2VVbmRlclRlc3RNb2RlIDogQ29tbWFuZCAob3BfY29kZSA9IEVOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFKSB7Ci19Ci0KLXBhY2tldCBFbmFibGVEZXZpY2VVbmRlclRlc3RNb2RlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IEVOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFdyaXRlU2ltcGxlUGFpcmluZ0RlYnVnTW9kZSA6IFNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IFdSSVRFX1NJTVBMRV9QQUlSSU5HX0RFQlVHX01PREUpIHsKLSAgc2ltcGxlX3BhaXJpbmdfZGVidWdfbW9kZSA6IEVuYWJsZSwKLX0KLQotcGFja2V0IFdyaXRlU2ltcGxlUGFpcmluZ0RlYnVnTW9kZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBXUklURV9TSU1QTEVfUEFJUklOR19ERUJVR19NT0RFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IFdyaXRlU2VjdXJlQ29ubmVjdGlvbnNUZXN0TW9kZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBXUklURV9TRUNVUkVfQ09OTkVDVElPTlNfVEVTVF9NT0RFKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBkbTFfYWNsdV9tb2RlIDogRW5hYmxlLAotICBlc2NvX2xvb3BiYWNrX21vZGUgOiBFbmFibGUsCi19Ci0KLXBhY2tldCBXcml0ZVNlY3VyZUNvbm5lY3Rpb25zVGVzdE1vZGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gV1JJVEVfU0VDVVJFX0NPTk5FQ1RJT05TX1RFU1RfTU9ERSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLSAgLy8gTEVfQ09OVFJPTExFUgotcGFja2V0IExlU2V0RXZlbnRNYXNrIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FVkVOVF9NQVNLKSB7Ci0gIGxlX2V2ZW50X21hc2sgOiA2NCwKLX0KLQotcGFja2V0IExlU2V0RXZlbnRNYXNrQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9FVkVOVF9NQVNLKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVhZEJ1ZmZlclNpemVWMSA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX0JVRkZFUl9TSVpFX1YxKSB7Ci19Ci0KLXN0cnVjdCBMZUJ1ZmZlclNpemUgewotICBsZV9kYXRhX3BhY2tldF9sZW5ndGggOiAxNiwKLSAgdG90YWxfbnVtX2xlX3BhY2tldHMgOiA4LAotfQotCi10ZXN0IExlUmVhZEJ1ZmZlclNpemVWMSB7Ci0gICJceDAyXHgyMFx4MDAiLAotfQotCi1wYWNrZXQgTGVSZWFkQnVmZmVyU2l6ZVYxQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQURfQlVGRkVSX1NJWkVfVjEpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBsZV9idWZmZXJfc2l6ZSA6IExlQnVmZmVyU2l6ZSwKLX0KLQotdGVzdCBMZVJlYWRCdWZmZXJTaXplVjFDb21wbGV0ZSB7Ci0gICJceDBlXHgwN1x4MDFceDAyXHgyMFx4MDBceGZiXHgwMFx4MTAiLAotfQotCi1wYWNrZXQgTGVSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlcyA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUykgewotfQotCi1wYWNrZXQgTGVSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGxlX2ZlYXR1cmVzIDogNjQsCi19Ci0KLXBhY2tldCBMZVNldFJhbmRvbUFkZHJlc3MgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9SQU5ET01fQUREUkVTUykgewotICByYW5kb21fYWRkcmVzcyA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBMZVNldFJhbmRvbUFkZHJlc3NDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX1JBTkRPTV9BRERSRVNTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBBZHZlcnRpc2luZ0ZpbHRlclBvbGljeSA6IDIgewotICBBTExfREVWSUNFUyA9IDAsIC8vIERlZmF1bHQKLSAgTElTVEVEX1NDQU4gPSAxLAotICBMSVNURURfQ09OTkVDVCA9IDIsCi0gIExJU1RFRF9TQ0FOX0FORF9DT05ORUNUID0gMywKLX0KLQotZW51bSBQZWVyQWRkcmVzc1R5cGUgOiA4IHsKLSAgUFVCTElDX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTID0gMHgwMCwKLSAgUkFORE9NX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTID0gMHgwMSwKLX0KLQotZW51bSBBZHZlcnRpc2luZ1R5cGUgOiA4IHsKLSAgQURWX0lORCA9IDB4MDAsCi0gIEFEVl9ESVJFQ1RfSU5EID0gMHgwMSwKLSAgQURWX1NDQU5fSU5EID0gMHgwMiwKLSAgQURWX05PTkNPTk5fSU5EID0gMHgwMywKLSAgQURWX0RJUkVDVF9JTkRfTE9XID0gMHgwNCwKLX0KLQotZW51bSBBZGRyZXNzVHlwZSA6IDggewotICBQVUJMSUNfREVWSUNFX0FERFJFU1MgPSAweDAwLAotICBSQU5ET01fREVWSUNFX0FERFJFU1MgPSAweDAxLAotICBQVUJMSUNfSURFTlRJVFlfQUREUkVTUyA9IDB4MDIsCi0gIFJBTkRPTV9JREVOVElUWV9BRERSRVNTID0gMHgwMywKLX0KLQotZW51bSBPd25BZGRyZXNzVHlwZSA6IDggewotICBQVUJMSUNfREVWSUNFX0FERFJFU1MgPSAweDAwLAotICBSQU5ET01fREVWSUNFX0FERFJFU1MgPSAweDAxLAotICBSRVNPTFZBQkxFX09SX1BVQkxJQ19BRERSRVNTID0gMHgwMiwKLSAgUkVTT0xWQUJMRV9PUl9SQU5ET01fQUREUkVTUyA9IDB4MDMsCi19Ci0KLXBhY2tldCBMZVNldEFkdmVydGlzaW5nUGFyYW1ldGVycyA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMpIHsKLSAgaW50ZXJ2YWxfbWluIDogMTYsCi0gIGludGVydmFsX21heCA6IDE2LAotICBhZHZ0X3R5cGUgOiBBZHZlcnRpc2luZ1R5cGUsCi0gIG93bl9hZGRyZXNzX3R5cGUgOiBPd25BZGRyZXNzVHlwZSwKLSAgcGVlcl9hZGRyZXNzX3R5cGUgOiBQZWVyQWRkcmVzc1R5cGUsCi0gIHBlZXJfYWRkcmVzcyA6IEFkZHJlc3MsCi0gIGNoYW5uZWxfbWFwIDogOCwKLSAgZmlsdGVyX3BvbGljeSA6IEFkdmVydGlzaW5nRmlsdGVyUG9saWN5LAotICBfcmVzZXJ2ZWRfIDogNiwKLX0KLQotcGFja2V0IExlU2V0QWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9BRFZFUlRJU0lOR19QQVJBTUVURVJTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVhZEFkdmVydGlzaW5nUGh5c2ljYWxDaGFubmVsVHhQb3dlciA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9BRFZFUlRJU0lOR19QSFlTSUNBTF9DSEFOTkVMX1RYX1BPV0VSKSB7Ci19Ci0KLXBhY2tldCBMZVJlYWRBZHZlcnRpc2luZ1BoeXNpY2FsQ2hhbm5lbFR4UG93ZXJDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVBRF9BRFZFUlRJU0lOR19QSFlTSUNBTF9DSEFOTkVMX1RYX1BPV0VSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgdHJhbnNtaXRfcG93ZXJfbGV2ZWwgOiA4LCAvLyAoLTEyN2RCbSB0byAyMGRCbSkgQWNjdXJhY3k6ICsvLTRkQgotfQotCi1wYWNrZXQgTGVTZXRBZHZlcnRpc2luZ0RhdGEgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9BRFZFUlRJU0lOR19EQVRBKSB7Ci0gIF9zaXplXyhhZHZlcnRpc2luZ19kYXRhKSA6IDgsCi0gIGFkdmVydGlzaW5nX2RhdGEgOiBHYXBEYXRhW10sCi0gIF9wYWRkaW5nX1szMV0sIC8vIFplcm8gcGFkZGluZyB0byAzMSBieXRlcyBvZiBhZHZlcnRpc2luZ19kYXRhCi19Ci0KLXBhY2tldCBMZVNldEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfQURWRVJUSVNJTkdfREFUQSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVNldFNjYW5SZXNwb25zZURhdGEgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9TQ0FOX1JFU1BPTlNFX0RBVEEpIHsKLSAgX3NpemVfKGFkdmVydGlzaW5nX2RhdGEpIDogOCwKLSAgYWR2ZXJ0aXNpbmdfZGF0YSA6IEdhcERhdGFbXSwKLSAgX3BhZGRpbmdfWzMxXSwgLy8gWmVybyBwYWRkaW5nIHRvIDMxIGJ5dGVzIG9mIGFkdmVydGlzaW5nX2RhdGEKLX0KLQotcGFja2V0IExlU2V0U2NhblJlc3BvbnNlRGF0YUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlU2V0QWR2ZXJ0aXNpbmdFbmFibGUgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9BRFZFUlRJU0lOR19FTkFCTEUpIHsKLSAgYWR2ZXJ0aXNpbmdfZW5hYmxlIDogRW5hYmxlLCAvLyBEZWZhdWx0IERJU0FCTEVECi19Ci0KLXBhY2tldCBMZVNldEFkdmVydGlzaW5nRW5hYmxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9BRFZFUlRJU0lOR19FTkFCTEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1lbnVtIExlU2NhblR5cGUgOiA4IHsKLSAgUEFTU0lWRSA9IDB4MDAsIC8vIERlZmF1bHQKLSAgQUNUSVZFID0gMHgwMSwKLX0KLQotZW51bSBMZVNjYW5uaW5nRmlsdGVyUG9saWN5IDogOCB7Ci0gIEFDQ0VQVF9BTEwgPSAweDAwLCAvLyBEZWZhdWx0Ci0gIENPTk5FQ1RfTElTVF9PTkxZID0gMHgwMSwKLSAgQ0hFQ0tfSU5JVElBVE9SU19JREVOVElUWSA9IDB4MDIsCi0gIENPTk5FQ1RfTElTVF9BTkRfSU5JVElBVE9SU19JREVOVElUWSA9IDB4MDMsCi19Ci0KLXBhY2tldCBMZVNldFNjYW5QYXJhbWV0ZXJzIDogTGVTY2FubmluZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfU0NBTl9QQVJBTUVURVJTKSB7Ci0gIGxlX3NjYW5fdHlwZSA6IExlU2NhblR5cGUsCi0gIGxlX3NjYW5faW50ZXJ2YWwgOiAxNiwgLy8gMHgwMDA0LTB4NDAwMCBEZWZhdWx0IDB4MTAgKDEwbXMpCi0gIGxlX3NjYW5fd2luZG93IDogMTYsIC8vIERlZmF1bHQgMHgxMCAoMTBtcykKLSAgb3duX2FkZHJlc3NfdHlwZSA6IE93bkFkZHJlc3NUeXBlLAotICBzY2FubmluZ19maWx0ZXJfcG9saWN5IDogTGVTY2FubmluZ0ZpbHRlclBvbGljeSwKLX0KLQotdGVzdCBMZVNldFNjYW5QYXJhbWV0ZXJzIHsKLSAgIlx4MGJceDIwXHgwN1x4MDFceDEyXHgwMFx4MTJceDAwXHgwMVx4MDAiLAotfQotCi1wYWNrZXQgTGVTZXRTY2FuUGFyYW1ldGVyc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfU0NBTl9QQVJBTUVURVJTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlU2V0U2NhbkVuYWJsZSA6IExlU2Nhbm5pbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1NDQU5fRU5BQkxFKSB7Ci0gIGxlX3NjYW5fZW5hYmxlIDogRW5hYmxlLAotICBmaWx0ZXJfZHVwbGljYXRlcyA6IEVuYWJsZSwKLX0KLQotdGVzdCBMZVNldFNjYW5FbmFibGUgewotICAiXHgwY1x4MjBceDAyXHgwMVx4MDAiLAotfQotCi1wYWNrZXQgTGVTZXRTY2FuRW5hYmxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9TQ0FOX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLWVudW0gSW5pdGlhdG9yRmlsdGVyUG9saWN5IDogOCB7Ci0gIFVTRV9QRUVSX0FERFJFU1MgPSAweDAwLAotICBVU0VfQ09OTkVDVF9MSVNUID0gMHgwMSwKLX0KLQotcGFja2V0IExlQ3JlYXRlQ29ubmVjdGlvbiA6IExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gTEVfQ1JFQVRFX0NPTk5FQ1RJT04pIHsKLSAgbGVfc2Nhbl9pbnRlcnZhbCA6IDE2LCAvLyAweDAwMDQtMHg0MDAwCi0gIGxlX3NjYW5fd2luZG93IDogMTYsIC8vIDwgPSBMZVNjYW5JbnRlcnZhbAotICBpbml0aWF0b3JfZmlsdGVyX3BvbGljeSA6IEluaXRpYXRvckZpbHRlclBvbGljeSwKLSAgcGVlcl9hZGRyZXNzX3R5cGUgOiBBZGRyZXNzVHlwZSwKLSAgcGVlcl9hZGRyZXNzIDogQWRkcmVzcywKLSAgb3duX2FkZHJlc3NfdHlwZSA6IE93bkFkZHJlc3NUeXBlLAotICBjb25uX2ludGVydmFsX21pbiA6IDE2LCAvLyAweDAwMDYtMHgwQzgwICg3LjVtcyB0byA0cykKLSAgY29ubl9pbnRlcnZhbF9tYXggOiAxNiwgLy8gMHgwMDA2LTB4MEM4MCAoNy41bXMgdG8gNHMpCi0gIGNvbm5fbGF0ZW5jeSA6IDE2LCAvLyAweDAwMDYtMHgwMUYzCi0gIHN1cGVydmlzaW9uX3RpbWVvdXQgOiAxNiwgLy8gMHgwMEEgdG8gMHgwQzgwICgxMDBtcyB0byAzMnMpCi0gIG1pbmltdW1fY2VfbGVuZ3RoIDogMTYsIC8vIDAuNjI1bXMKLSAgbWF4aW11bV9jZV9sZW5ndGggOiAxNiwgLy8gMC42MjVtcwotfQotCi1wYWNrZXQgTGVDcmVhdGVDb25uZWN0aW9uU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gTEVfQ1JFQVRFX0NPTk5FQ1RJT04pIHsKLX0KLQotcGFja2V0IExlQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbCA6IExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gTEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMKSB7Ci19Ci0KLXBhY2tldCBMZUNyZWF0ZUNvbm5lY3Rpb25DYW5jZWxDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVhZENvbm5lY3RMaXN0U2l6ZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX0NPTk5FQ1RfTElTVF9TSVpFKSB7Ci19Ci0KLXRlc3QgTGVSZWFkQ29ubmVjdExpc3RTaXplIHsKLSAgIlx4MGZceDIwXHgwMCIsCi19Ci0KLXBhY2tldCBMZVJlYWRDb25uZWN0TGlzdFNpemVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVBRF9DT05ORUNUX0xJU1RfU0laRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3RfbGlzdF9zaXplIDogOCwKLX0KLQotdGVzdCBMZVJlYWRDb25uZWN0TGlzdFNpemVDb21wbGV0ZSB7Ci0gICJceDBlXHgwNVx4MDFceDBmXHgyMFx4MDBceDgwIiwKLX0KLQotcGFja2V0IExlQ2xlYXJDb25uZWN0TGlzdCA6IExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gTEVfQ0xFQVJfQ09OTkVDVF9MSVNUKSB7Ci19Ci0KLXBhY2tldCBMZUNsZWFyQ29ubmVjdExpc3RDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfQ0xFQVJfQ09OTkVDVF9MSVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBDb25uZWN0TGlzdEFkZHJlc3NUeXBlIDogOCB7Ci0gIFBVQkxJQyA9IDB4MDAsCi0gIFJBTkRPTSA9IDB4MDEsCi0gIEFOT05ZTU9VU19BRFZFUlRJU0VSUyA9IDB4RkYsCi19Ci0KLXBhY2tldCBMZUFkZERldmljZVRvQ29ubmVjdExpc3QgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKSB7Ci0gIGFkZHJlc3NfdHlwZSA6IENvbm5lY3RMaXN0QWRkcmVzc1R5cGUsCi0gIGFkZHJlc3MgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0IDogTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRU1PVkVfREVWSUNFX0ZST01fQ09OTkVDVF9MSVNUKSB7Ci0gIGFkZHJlc3NfdHlwZSA6IENvbm5lY3RMaXN0QWRkcmVzc1R5cGUsCi0gIGFkZHJlc3MgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgTGVSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3RDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZUNvbm5lY3Rpb25VcGRhdGUgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX0NPTk5FQ1RJT05fVVBEQVRFKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBjb25uX2ludGVydmFsX21pbiA6IDE2LCAvLyAweDAwMDYtMHgwQzgwICg3LjVtcyB0byA0cykKLSAgY29ubl9pbnRlcnZhbF9tYXggOiAxNiwgLy8gMHgwMDA2LTB4MEM4MCAoNy41bXMgdG8gNHMpCi0gIGNvbm5fbGF0ZW5jeSA6IDE2LCAvLyAweDAwMDYtMHgwMUYzCi0gIHN1cGVydmlzaW9uX3RpbWVvdXQgOiAxNiwgLy8gMHgwMEEgdG8gMHgwQzgwICgxMDBtcyB0byAzMnMpCi0gIG1pbmltdW1fY2VfbGVuZ3RoIDogMTYsIC8vIDAuNjI1bXMKLSAgbWF4aW11bV9jZV9sZW5ndGggOiAxNiwgLy8gMC42MjVtcwotfQotCi1wYWNrZXQgTGVDb25uZWN0aW9uVXBkYXRlU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gTEVfQ09OTkVDVElPTl9VUERBVEUpIHsKLX0KLQotcGFja2V0IExlU2V0SG9zdENoYW5uZWxDbGFzc2lmaWNhdGlvbiA6IExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX0hPU1RfQ0hBTk5FTF9DTEFTU0lGSUNBVElPTikgewotICBjaGFubmVsX21hcCA6IDhbNV0sCi19Ci0KLXBhY2tldCBMZVNldEhvc3RDaGFubmVsQ2xhc3NpZmljYXRpb25Db21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX0hPU1RfQ0hBTk5FTF9DTEFTU0lGSUNBVElPTikgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVJlYWRDaGFubmVsTWFwIDogTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX0NIQU5ORUxfTUFQKSB7Ci19Ci0KLXBhY2tldCBMZVJlYWRDaGFubmVsTWFwQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQURfQ0hBTk5FTF9NQVApIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgY2hhbm5lbF9tYXAgOiA4WzVdLAotfQotCi1wYWNrZXQgTGVSZWFkUmVtb3RlRmVhdHVyZXMgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX1JFQURfUkVNT1RFX0ZFQVRVUkVTKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVSZWFkUmVtb3RlRmVhdHVyZXNTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1JFTU9URV9GRUFUVVJFUykgewotfQotCi1wYWNrZXQgTGVFbmNyeXB0IDogTGVTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMRV9FTkNSWVBUKSB7Ci0gIGtleSA6IDhbMTZdLAotICBwbGFpbnRleHRfZGF0YSA6IDhbMTZdLAotfQotCi1wYWNrZXQgTGVFbmNyeXB0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX0VOQ1JZUFQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBlbmNyeXB0ZWRfZGF0YSA6IDhbMTZdLAotfQotCi1wYWNrZXQgTGVSYW5kIDogTGVTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMRV9SQU5EKSB7Ci19Ci0KLXBhY2tldCBMZVJhbmRDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkFORCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIHJhbmRvbV9udW1iZXIgOiA2NCwKLX0KLQotcGFja2V0IExlU3RhcnRFbmNyeXB0aW9uIDogTGVTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMRV9TVEFSVF9FTkNSWVBUSU9OKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlOiAxNiwKLSAgcmFuZDogOFs4XSwKLSAgZWRpdjogMTYsCi0gIGx0azogOFsxNl0sCi19Ci0KLXBhY2tldCBMZVN0YXJ0RW5jcnlwdGlvblN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NUQVJUX0VOQ1JZUFRJT04pIHsKLX0KLQotcGFja2V0IExlTG9uZ1Rlcm1LZXlSZXF1ZXN0UmVwbHkgOiBMZVNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IExFX0xPTkdfVEVSTV9LRVlfUkVRVUVTVF9SRVBMWSkgewotICBjb25uZWN0aW9uX2hhbmRsZTogMTYsCi0gIGxvbmdfdGVybV9rZXk6IDhbMTZdLAotfQotCi1wYWNrZXQgTGVMb25nVGVybUtleVJlcXVlc3RSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9MT05HX1RFUk1fS0VZX1JFUVVFU1RfUkVQTFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IExlTG9uZ1Rlcm1LZXlSZXF1ZXN0TmVnYXRpdmVSZXBseSA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfTE9OR19URVJNX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX0xPTkdfVEVSTV9LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVSZWFkU3VwcG9ydGVkU3RhdGVzIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1JFQURfU1VQUE9SVEVEX1NUQVRFUykgewotfQotCi1wYWNrZXQgTGVSZWFkU3VwcG9ydGVkU3RhdGVzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQURfU1VQUE9SVEVEX1NUQVRFUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGxlX3N0YXRlcyA6IDY0LAotfQotCi1wYWNrZXQgTGVSZWNlaXZlclRlc3QgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUkVDRUlWRVJfVEVTVCkgewotICByeF9jaGFubmVsIDogOCwKLX0KLQotcGFja2V0IExlUmVjZWl2ZXJUZXN0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQ0VJVkVSX1RFU1QpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1lbnVtIExlVGVzdFBheWxvYWQgOiA4IHsKLSAgUFJCUzkgPSAweDAwLAotICBSRVBFQVRFRF9GMCA9IDB4MDEsCi0gIFJFUEVBVEVEX0FBID0gMHgwMiwKLSAgUFJCUzE1ID0gMHgwMywKLSAgUkVQRUFURURfRkYgPSAweDA0LAotICBSRVBFQVRFRF8wMCA9IDB4MDUsCi0gIFJFUEVBVEVEXzBGID0gMHgwNiwKLSAgUkVQRUFURURfNTUgPSAweDA3LAotfQotCi1wYWNrZXQgTGVUcmFuc21pdHRlclRlc3QgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfVFJBTlNNSVRURVJfVEVTVCkgewotICB0eF9jaGFubmVsIDogOCwKLSAgdGVzdF9kYXRhX2xlbmd0aCA6IDgsCi0gIHBhY2tldF9wYXlsb2FkIDogTGVUZXN0UGF5bG9hZCwKLX0KLQotcGFja2V0IExlVHJhbnNtaXR0ZXJUZXN0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1RSQU5TTUlUVEVSX1RFU1QpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVUZXN0RW5kIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1RFU1RfRU5EKSB7Ci19Ci0KLXBhY2tldCBMZVRlc3RFbmRDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfVEVTVF9FTkQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdFJlcGx5IDogTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9SRVBMWSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgaW50ZXJ2YWxfbWluIDogMTYsIC8vIDB4MDAwNi0weDBDODAgKDcuNW1zIHRvIDRzKQotICBpbnRlcnZhbF9tYXggOiAxNiwgLy8gMHgwMDA2LTB4MEM4MCAoNy41bXMgdG8gNHMpCi0gIGxhdGVuY3kgOiAxNiwgLy8gMHgwMDA2LTB4MDFGMwotICB0aW1lb3V0IDogMTYsIC8vIDB4MDBBIHRvIDB4MEM4MCAoMTAwbXMgdG8gMzJzKQotICBtaW5pbXVtX2NlX2xlbmd0aCA6IDE2LCAvLyAwLjYyNW1zCi0gIG1heGltdW1fY2VfbGVuZ3RoIDogMTYsIC8vIDAuNjI1bXMKLX0KLQotcGFja2V0IExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdE5lZ2F0aXZlUmVwbHkgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX1JFTU9URV9DT05ORUNUSU9OX1BBUkFNRVRFUl9SRVFVRVNUX05FR0FUSVZFX1JFUExZKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICByZWFzb24gOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVJlbW90ZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0TmVnYXRpdmVSZXBseUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVTZXREYXRhTGVuZ3RoIDogTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfREFUQV9MRU5HVEgpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHR4X29jdGV0cyA6IDE2LCAvLyBwYXlsb2FkIG9jdGV0cyBwZXIgc2luZ2xlIFBEVSAweDFCIHRvIDB4MDBGQgotICB0eF90aW1lIDogMTYsIC8vIG1pY3Jvc2Vjb25kcyB1c2VkIHRvIHRyYW5zbWl0IGEgc2luZ2xlIFBEVSAweDAxNDggdG8gMHg0MjkwCi19Ci0KLXBhY2tldCBMZVNldERhdGFMZW5ndGhDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX0RBVEFfTEVOR1RIKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBMZVJlYWRTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aCA6IExlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9TVUdHRVNURURfREVGQVVMVF9EQVRBX0xFTkdUSCkgewotfQotCi1wYWNrZXQgTGVSZWFkU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGhDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVBRF9TVUdHRVNURURfREVGQVVMVF9EQVRBX0xFTkdUSCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIHR4X29jdGV0cyA6IDE2LCAvLyBwYXlsb2FkIG9jdGV0cyBwZXIgc2luZ2xlIFBEVSAweDFCIHRvIDB4MDBGQgotICB0eF90aW1lIDogMTYsIC8vIG1pY3Jvc2Vjb25kcyB1c2VkIHRvIHRyYW5zbWl0IGEgc2luZ2xlIFBEVSAweDAxNDggdG8gMHg0MjkwCi19Ci0KLXBhY2tldCBMZVdyaXRlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGggOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX1dSSVRFX1NVR0dFU1RFRF9ERUZBVUxUX0RBVEFfTEVOR1RIKSB7Ci0gIHR4X29jdGV0cyA6IDE2LCAvLyBwYXlsb2FkIG9jdGV0cyBwZXIgc2luZ2xlIFBEVSAweDFCIHRvIDB4MDBGQgotICB0eF90aW1lIDogMTYsIC8vIG1pY3Jvc2Vjb25kcyB1c2VkIHRvIHRyYW5zbWl0IGEgc2luZ2xlIFBEVSAweDAxNDggdG8gMHg0MjkwCi19Ci0KLXBhY2tldCBMZVdyaXRlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGhDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfV1JJVEVfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEgpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVSZWFkTG9jYWxQMjU2UHVibGljS2V5Q29tbWFuZCA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9MT0NBTF9QXzI1Nl9QVUJMSUNfS0VZX0NPTU1BTkQpIHsKLX0KLQotcGFja2V0IExlUmVhZExvY2FsUDI1NlB1YmxpY0tleUNvbW1hbmRTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX0xPQ0FMX1BfMjU2X1BVQkxJQ19LRVlfQ09NTUFORCkgewotfQotCi1wYWNrZXQgTGVHZW5lcmF0ZURoa2V5VjFDb21tYW5kIDogTGVTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMRV9HRU5FUkFURV9ESEtFWV9DT01NQU5EX1YxKSB7Ci0gIHJlbW90ZV9wXzI1Nl9wdWJsaWNfa2V5IDogOFs2NF0sCi19Ci0KLXBhY2tldCBMZUdlbmVyYXRlRGhrZXlWMUNvbW1hbmRTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9HRU5FUkFURV9ESEtFWV9DT01NQU5EX1YxKSB7Ci19Ci0KLXBhY2tldCBMZUFkZERldmljZVRvUmVzb2x2aW5nTGlzdCA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfQUREX0RFVklDRV9UT19SRVNPTFZJTkdfTElTVCkgewotICBwZWVyX2lkZW50aXR5X2FkZHJlc3NfdHlwZSA6IFBlZXJBZGRyZXNzVHlwZSwKLSAgcGVlcl9pZGVudGl0eV9hZGRyZXNzIDogQWRkcmVzcywKLSAgcGVlcl9pcmsgOiA4WzE2XSwKLSAgbG9jYWxfaXJrIDogOFsxNl0sCi19Ci0KLXBhY2tldCBMZUFkZERldmljZVRvUmVzb2x2aW5nTGlzdENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9BRERfREVWSUNFX1RPX1JFU09MVklOR19MSVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3QgOiBMZVNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9SRVNPTFZJTkdfTElTVCkgewotICBwZWVyX2lkZW50aXR5X2FkZHJlc3NfdHlwZSA6IFBlZXJBZGRyZXNzVHlwZSwKLSAgcGVlcl9pZGVudGl0eV9hZGRyZXNzIDogQWRkcmVzcywKLX0KLQotcGFja2V0IExlUmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3RDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVNT1ZFX0RFVklDRV9GUk9NX1JFU09MVklOR19MSVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlQ2xlYXJSZXNvbHZpbmdMaXN0IDogTGVTZWN1cml0eUNvbW1hbmQgKG9wX2NvZGUgPSBMRV9DTEVBUl9SRVNPTFZJTkdfTElTVCkgewotfQotCi1wYWNrZXQgTGVDbGVhclJlc29sdmluZ0xpc3RDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfQ0xFQVJfUkVTT0xWSU5HX0xJU1QpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVSZWFkUmVzb2x2aW5nTGlzdFNpemUgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9SRVNPTFZJTkdfTElTVF9TSVpFKSB7Ci19Ci0KLXBhY2tldCBMZVJlYWRSZXNvbHZpbmdMaXN0U2l6ZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1JFU09MVklOR19MSVNUX1NJWkUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICByZXNvbHZpbmdfbGlzdF9zaXplIDogOCwKLX0KLQotcGFja2V0IExlUmVhZFBlZXJSZXNvbHZhYmxlQWRkcmVzcyA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9QRUVSX1JFU09MVkFCTEVfQUREUkVTUykgewotICBwZWVyX2lkZW50aXR5X2FkZHJlc3NfdHlwZSA6IFBlZXJBZGRyZXNzVHlwZSwKLSAgcGVlcl9pZGVudGl0eV9hZGRyZXNzIDogQWRkcmVzcywKLX0KLQotcGFja2V0IExlUmVhZFBlZXJSZXNvbHZhYmxlQWRkcmVzc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1BFRVJfUkVTT0xWQUJMRV9BRERSRVNTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgcGVlcl9yZXNvbHZhYmxlX2FkZHJlc3MgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgTGVSZWFkTG9jYWxSZXNvbHZhYmxlQWRkcmVzcyA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9MT0NBTF9SRVNPTFZBQkxFX0FERFJFU1MpIHsKLSAgcGVlcl9pZGVudGl0eV9hZGRyZXNzX3R5cGUgOiBQZWVyQWRkcmVzc1R5cGUsCi0gIHBlZXJfaWRlbnRpdHlfYWRkcmVzcyA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBMZVJlYWRMb2NhbFJlc29sdmFibGVBZGRyZXNzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQURfTE9DQUxfUkVTT0xWQUJMRV9BRERSRVNTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbG9jYWxfcmVzb2x2YWJsZV9hZGRyZXNzIDogQWRkcmVzcywKLX0KLQotcGFja2V0IExlU2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGUgOiBMZVNlY3VyaXR5Q29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9BRERSRVNTX1JFU09MVVRJT05fRU5BQkxFKSB7Ci0gIGFkZHJlc3NfcmVzb2x1dGlvbl9lbmFibGUgOiBFbmFibGUsCi19Ci0KLXBhY2tldCBMZVNldEFkZHJlc3NSZXNvbHV0aW9uRW5hYmxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9BRERSRVNTX1JFU09MVVRJT05fRU5BQkxFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlU2V0UmVzb2x2YWJsZVByaXZhdGVBZGRyZXNzVGltZW91dCA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1JFU09MVkFCTEVfUFJJVkFURV9BRERSRVNTX1RJTUVPVVQpIHsKLSAgcnBhX3RpbWVvdXQgOiAxNiwgLy8gUlBBX1RpbWVvdXQgbWVhc3VyZWQgaW4gc2Vjb25kcyAweDAwMDEgdG8gMHhBMUI4IDFzIHRvIDExLjUgaG91cnMKLX0KLQotcGFja2V0IExlU2V0UmVzb2x2YWJsZVByaXZhdGVBZGRyZXNzVGltZW91dENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfUkVTT0xWQUJMRV9QUklWQVRFX0FERFJFU1NfVElNRU9VVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVJlYWRNYXhpbXVtRGF0YUxlbmd0aCA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX01BWElNVU1fREFUQV9MRU5HVEgpIHsKLX0KLQotc3RydWN0IExlTWF4aW11bURhdGFMZW5ndGggewotICBzdXBwb3J0ZWRfbWF4X3R4X29jdGV0cyA6IDE2LAotICBzdXBwb3J0ZWRfbWF4X3R4X3RpbWU6IDE2LAotICBzdXBwb3J0ZWRfbWF4X3J4X29jdGV0cyA6IDE2LAotICBzdXBwb3J0ZWRfbWF4X3J4X3RpbWU6IDE2LAotfQotCi1wYWNrZXQgTGVSZWFkTWF4aW11bURhdGFMZW5ndGhDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVBRF9NQVhJTVVNX0RBVEFfTEVOR1RIKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbGVfbWF4aW11bV9kYXRhX2xlbmd0aCA6IExlTWF4aW11bURhdGFMZW5ndGgsCi19Ci0KLXBhY2tldCBMZVJlYWRQaHkgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX1JFQURfUEhZKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1lbnVtIFBoeVR5cGUgOiA4IHsKLSAgTEVfMU0gPSAweDAxLAotICBMRV8yTSA9IDB4MDIsCi0gIExFX0NPREVEID0gMHgwMywKLX0KLQotcGFja2V0IExlUmVhZFBoeUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1BIWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICB0eF9waHkgOiBQaHlUeXBlLAotICByeF9waHkgOiBQaHlUeXBlLAotfQotCi1wYWNrZXQgTGVTZXREZWZhdWx0UGh5IDogTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfREVGQVVMVF9QSFkpIHsKLSAgYWxsX3BoeXNfbm9fdHJhbnNtaXRfcHJlZmVyZW5jZSA6IDEsCi0gIGFsbF9waHlzX25vX3JlY2VpdmVfcHJlZmVyZW5jZSA6IDEsCi0gIF9yZXNlcnZlZF8gOiA2LAotICB0eF9waHlzX2JpdG1hc2sgOiAzLAotICBfcmVzZXJ2ZWRfIDogNSwKLSAgcnhfcGh5c19iaXRtYXNrIDogMywKLSAgX3Jlc2VydmVkXyA6IDUsCi19Ci0KLXBhY2tldCBMZVNldERlZmF1bHRQaHlDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX0RFRkFVTFRfUEhZKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotZW51bSBQaHlPcHRpb25zIDogOCB7Ci0gIE5PX1BSRUZFUkVOQ0UgPSAweDAwLAotICBTXzIgPSAweDAxLAotICBTXzggPSAweDAyLAotfQotCi1wYWNrZXQgTGVTZXRQaHkgOiBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9QSFkpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGFsbF9waHlzX25vX3RyYW5zbWl0X3ByZWZlcmVuY2UgOiAxLAotICBhbGxfcGh5c19ub19yZWNlaXZlX3ByZWZlcmVuY2UgOiAxLAotICBfcmVzZXJ2ZWRfIDogNiwKLSAgdHhfcGh5c19iaXRtYXNrIDogMywKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIHJ4X3BoeXNfYml0bWFzayA6IDMsCi0gIF9yZXNlcnZlZF8gOiA1LAotICBwaHlfb3B0aW9ucyA6IFBoeU9wdGlvbnMsCi19Ci0KLXBhY2tldCBMZVNldFBoeVN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9QSFkpIHsKLX0KLQotZW51bSBNb2R1bGF0aW9uSW5kZXggOiA4IHsKLSAgU1RBTkRBUkQgPSAweDAwLAotICBTVEFCTEUgPSAweDAxLAotfQotCi1wYWNrZXQgTGVFbmhhbmNlZFJlY2VpdmVyVGVzdCA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9FTkhBTkNFRF9SRUNFSVZFUl9URVNUKSB7Ci0gIHJ4X2NoYW5uZWwgOiA4LAotICBwaHkgOiBQaHlUeXBlLAotICBtb2R1bGF0aW9uX2luZGV4IDogTW9kdWxhdGlvbkluZGV4LAotfQotCi1wYWNrZXQgTGVFbmhhbmNlZFJlY2VpdmVyVGVzdENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9FTkhBTkNFRF9SRUNFSVZFUl9URVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlRW5oYW5jZWRUcmFuc21pdHRlclRlc3QgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfRU5IQU5DRURfVFJBTlNNSVRURVJfVEVTVCkgewotICB0eF9jaGFubmVsIDogOCwKLSAgdGVzdF9kYXRhX2xlbmd0aCA6IDgsCi0gIHBhY2tldF9wYXlsb2FkIDogTGVUZXN0UGF5bG9hZCwKLSAgcGh5IDogUGh5VHlwZSwKLX0KLQotcGFja2V0IExlRW5oYW5jZWRUcmFuc21pdHRlclRlc3RDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfRU5IQU5DRURfVFJBTlNNSVRURVJfVEVTVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzIDogTGVBZHZlcnRpc2luZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUkFORE9NX0FERFJFU1MpIHsKLSAgYWR2ZXJ0aXNpbmdfaGFuZGxlIDogOCwKLSAgYWR2ZXJ0aXNpbmdfcmFuZG9tX2FkZHJlc3MgOiBBZGRyZXNzLAotfQotCi10ZXN0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3MgewotICAiXHgzNVx4MjBceDA3XHgwMFx4NzdceDU4XHhlYlx4ZDNceDFjXHg2ZSIsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19SQU5ET01fQUREUkVTUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXRlc3QgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0NvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4MzVceDIwXHgwMCIsCi19Ci0KLS8vIFRoZSBsb3dlciA0IGJpdHMgb2YgdGhlIGFkdmVydGlzaW5nIGV2ZW50IHByb3BlcnRpZXMKLWVudW0gTGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzIDogNCB7Ci0gIEFEVl9JTkQgPSAweDMsCi0gIEFEVl9ESVJFQ1RfSU5EX0xPVyA9IDB4NSwKLSAgQURWX0RJUkVDVF9JTkRfSElHSCA9IDB4RCwKLSAgQURWX1NDQU5fSU5EID0gMHgyLAotICBBRFZfTk9OQ09OTl9JTkQgPSAwLAotfQotCi1lbnVtIFByaW1hcnlQaHlUeXBlIDogOCB7Ci0gIExFXzFNID0gMHgwMSwKLSAgTEVfQ09ERUQgPSAweDAzLAotfQotCi1lbnVtIFNlY29uZGFyeVBoeVR5cGUgOiA4IHsKLSAgTk9fUEFDS0VUUyA9IDB4MDAsCi0gIExFXzFNID0gMHgwMSwKLSAgTEVfMk0gPSAweDAyLAotICBMRV9DT0RFRCA9IDB4MDMsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdMZWdhY3lQYXJhbWV0ZXJzIDogTGVBZHZlcnRpc2luZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUykgewotICBhZHZlcnRpc2luZ19oYW5kbGUgOiA4LAotICBhZHZlcnRpc2luZ19ldmVudF9sZWdhY3lfcHJvcGVydGllcyA6IExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcywKLSAgX2ZpeGVkXyA9IDB4MSA6IDEsIC8vIGxlZ2FjeSBiaXQgc2V0Ci0gIF9yZXNlcnZlZF8gOiAxMSwgLy8gYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcwotICBwcmltYXJ5X2FkdmVydGlzaW5nX2ludGVydmFsX21pbiA6IDI0LCAvLyAweDIwIC0gMHhGRkZGRkYgTiAqIDAuNjI1IG1zCi0gIHByaW1hcnlfYWR2ZXJ0aXNpbmdfaW50ZXJ2YWxfbWF4IDogMjQsIC8vIDB4MjAgLSAweEZGRkZGRiBOICogMC42MjUgbXMKLSAgcHJpbWFyeV9hZHZlcnRpc2luZ19jaGFubmVsX21hcCA6IDMsICAvLyBiaXQgMCAtIENoYW5uZWwgMzcsIGJpdCAxIC0gMzgsIGJpdCAyIC0gMzkKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIG93bl9hZGRyZXNzX3R5cGUgOiBPd25BZGRyZXNzVHlwZSwKLSAgcGVlcl9hZGRyZXNzX3R5cGUgOiBQZWVyQWRkcmVzc1R5cGUsCi0gIHBlZXJfYWRkcmVzcyA6IEFkZHJlc3MsCi0gIGFkdmVydGlzaW5nX2ZpbHRlcl9wb2xpY3kgOiBBZHZlcnRpc2luZ0ZpbHRlclBvbGljeSwKLSAgX3Jlc2VydmVkXyA6IDYsCi0gIGFkdmVydGlzaW5nX3R4X3Bvd2VyIDogOCwgLy8gLTEyNyB0byArMjAsIDB4N0YgLSBubyBwcmVmZXJlbmNlCi0gIF9maXhlZF8gPSAweDEgOiA4LCAvLyBQcmltYXJ5UGh5VHlwZSBMRV8xTQotICBfcmVzZXJ2ZWRfIDogOCwgLy8gc2Vjb25kYXJ5X2FkdmVydGlzaW5nX21heF9za2lwCi0gIF9maXhlZF8gPSAweDEgOiA4LCAvLyBzZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5IExFXzFNCi0gIGFkdmVydGlzaW5nX3NpZCA6IDgsIC8vIFNJRCBzdWJmaWVsZCBmcm9tIHRoZSBBREkgZmllbGQgb2YgdGhlIFBEVQotICBzY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uX2VuYWJsZSA6IEVuYWJsZSwKLX0KLQotdGVzdCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdMZWdhY3lQYXJhbWV0ZXJzIHsKLSAgIlx4MzZceDIwXHgxOVx4MDBceDEzXHgwMFx4OTBceDAxXHgwMFx4YzJceDAxXHgwMFx4MDdceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGY5XHgwMVx4MDBceDAxXHgwMVx4MDAiLAotICAiXHgzNlx4MjBceDE5XHgwMVx4MTNceDAwXHg5MFx4MDFceDAwXHhjMlx4MDFceDAwXHgwN1x4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjlceDAxXHgwMFx4MDFceDAxXHgwMCIsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIDogTGVBZHZlcnRpc2luZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUykgewotICBhZHZlcnRpc2luZ19oYW5kbGUgOiA4LAotICBhZHZlcnRpc2luZ19ldmVudF9sZWdhY3lfcHJvcGVydGllcyA6IDQsCi0gIF9maXhlZF8gPSAwIDogMSwgLy8gbGVnYWN5IGJpdCBjbGVhcmVkCi0gIGFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgOiAzLAotICBfcmVzZXJ2ZWRfIDogOCwKLSAgcHJpbWFyeV9hZHZlcnRpc2luZ19pbnRlcnZhbF9taW4gOiAyNCwgLy8gMHgyMCAtIDB4RkZGRkZGIE4gKiAwLjYyNSBtcwotICBwcmltYXJ5X2FkdmVydGlzaW5nX2ludGVydmFsX21heCA6IDI0LCAvLyAweDIwIC0gMHhGRkZGRkYgTiAqIDAuNjI1IG1zCi0gIHByaW1hcnlfYWR2ZXJ0aXNpbmdfY2hhbm5lbF9tYXAgOiAzLCAgLy8gYml0IDAgLSBDaGFubmVsIDM3LCBiaXQgMSAtIDM4LCBiaXQgMiAtIDM5Ci0gIF9yZXNlcnZlZF8gOiA1LAotICBvd25fYWRkcmVzc190eXBlIDogT3duQWRkcmVzc1R5cGUsCi0gIHBlZXJfYWRkcmVzc190eXBlIDogUGVlckFkZHJlc3NUeXBlLAotICBwZWVyX2FkZHJlc3MgOiBBZGRyZXNzLAotICBhZHZlcnRpc2luZ19maWx0ZXJfcG9saWN5IDogQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3ksCi0gIF9yZXNlcnZlZF8gOiA2LAotICBhZHZlcnRpc2luZ190eF9wb3dlciA6IDgsIC8vIC0xMjcgdG8gKzIwLCAweDdGIC0gbm8gcHJlZmVyZW5jZQotICBwcmltYXJ5X2FkdmVydGlzaW5nX3BoeSA6IFByaW1hcnlQaHlUeXBlLAotICBzZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfbWF4X3NraXAgOiA4LCAvLyAxIHRvIDI1NSwgMHgwMCAtIEFVWF9BRFZfSU5EIHNlbnQgYmVmb3JlIG5leHQgYWR2ZXJ0aXNpbmcgZXZlbnQKLSAgc2Vjb25kYXJ5X2FkdmVydGlzaW5nX3BoeSA6IFNlY29uZGFyeVBoeVR5cGUsCi0gIGFkdmVydGlzaW5nX3NpZCA6IDgsIC8vIFNJRCBzdWJmaWVsZCBmcm9tIHRoZSBBREkgZmllbGQgb2YgdGhlIFBEVQotICBzY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uX2VuYWJsZSA6IEVuYWJsZSwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnNDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBzZWxlY3RlZF90eF9wb3dlciA6IDgsIC8vIC0xMjcgdG8gKzIwCi19Ci0KLWVudW0gT3BlcmF0aW9uIDogMyB7Ci0gIElOVEVSTUVESUFURV9GUkFHTUVOVCA9IDAsCi0gIEZJUlNUX0ZSQUdNRU5UID0gMSwKLSAgTEFTVF9GUkFHTUVOVCA9IDIsCi0gIENPTVBMRVRFX0FEVkVSVElTRU1FTlQgPSAzLAotICBVTkNIQU5HRURfREFUQSA9IDQsCi19Ci0KLWVudW0gRnJhZ21lbnRQcmVmZXJlbmNlIDogMSB7Ci0gIENPTlRST0xMRVJfTUFZX0ZSQUdNRU5UID0gMCwKLSAgQ09OVFJPTExFUl9TSE9VTERfTk9UID0gMSwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGEgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19EQVRBKSB7Ci0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi0gIG9wZXJhdGlvbiA6IE9wZXJhdGlvbiwKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIGZyYWdtZW50X3ByZWZlcmVuY2UgOiBGcmFnbWVudFByZWZlcmVuY2UsCi0gIF9yZXNlcnZlZF8gOiA3LAotICBfc2l6ZV8oYWR2ZXJ0aXNpbmdfZGF0YSkgOiA4LAotICBhZHZlcnRpc2luZ19kYXRhIDogR2FwRGF0YVtdLAotfQotCi10ZXN0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGEgewotICAiXHgzN1x4MjBceDEyXHgwMFx4MDNceDAxXHgwZVx4MDJceDAxXHgwMlx4MGFceDA5XHg1MFx4NjlceDc4XHg2NVx4NmNceDIwXHgzM1x4MjBceDU4IiwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGFSYXcgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19EQVRBKSB7Ci0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi0gIG9wZXJhdGlvbiA6IE9wZXJhdGlvbiwKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIGZyYWdtZW50X3ByZWZlcmVuY2UgOiBGcmFnbWVudFByZWZlcmVuY2UsCi0gIF9yZXNlcnZlZF8gOiA3LAotICBfc2l6ZV8oYWR2ZXJ0aXNpbmdfZGF0YSkgOiA4LAotICBhZHZlcnRpc2luZ19kYXRhIDogOFtdLAotfQotCi1wYWNrZXQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfREFUQSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXRlc3QgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlIHsKLSAgIlx4MGVceDA0XHgwMVx4MzdceDIwXHgwMCIsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdTY2FuUmVzcG9uc2UgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19TQ0FOX1JFU1BPTlNFKSB7Ci0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi0gIG9wZXJhdGlvbiA6IE9wZXJhdGlvbiwKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIGZyYWdtZW50X3ByZWZlcmVuY2UgOiBGcmFnbWVudFByZWZlcmVuY2UsCi0gIF9yZXNlcnZlZF8gOiA3LAotICBfc2l6ZV8oc2Nhbl9yZXNwb25zZV9kYXRhKSA6IDgsCi0gIHNjYW5fcmVzcG9uc2VfZGF0YSA6IEdhcERhdGFbXSwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZVJhdyA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1NDQU5fUkVTUE9OU0UpIHsKLSAgYWR2ZXJ0aXNpbmdfaGFuZGxlIDogOCwKLSAgb3BlcmF0aW9uIDogT3BlcmF0aW9uLAotICBfcmVzZXJ2ZWRfIDogNSwKLSAgZnJhZ21lbnRfcHJlZmVyZW5jZSA6IEZyYWdtZW50UHJlZmVyZW5jZSwKLSAgX3Jlc2VydmVkXyA6IDcsCi0gIF9zaXplXyhzY2FuX3Jlc3BvbnNlX2RhdGEpIDogOCwKLSAgc2Nhbl9yZXNwb25zZV9kYXRhIDogOFtdLAotfQotCi1wYWNrZXQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19TQ0FOX1JFU1BPTlNFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZURpc2FibGVBbGwgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19FTkFCTEUpIHsKLSAgX2ZpeGVkXyA9IDB4MDAgOiA4LCAvLyBFbmFibGU6OkRJU0FCTEVECi0gIF9maXhlZF8gPSAweDAwIDogOCwgLy8gRGlzYWJsZSBhbGwgc2V0cwotfQotCi1zdHJ1Y3QgRW5hYmxlZFNldCB7Ci0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi0gIGR1cmF0aW9uIDogMTYsCi0gIG1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMgOiA4LAotfQotCi1zdHJ1Y3QgRGlzYWJsZWRTZXQgewotICBhZHZlcnRpc2luZ19oYW5kbGUgOiA4LAotICBfZml4ZWRfID0gMHgwMCA6IDE2LCAvLyBkdXJhdGlvbgotICBfZml4ZWRfID0gMHgwMCA6IDgsIC8vIG1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0Rpc2FibGUgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19FTkFCTEUpIHsKLSAgX2ZpeGVkXyA9IDB4MDAgOiA4LCAvLyBFbmFibGU6OkRJU0FCTEVECi0gIF9jb3VudF8oZGlzYWJsZWRfc2V0cykgOiA4LAotICBkaXNhYmxlZF9zZXRzIDogRGlzYWJsZWRTZXRbXSwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZSA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSkgewotICBlbmFibGUgOiBFbmFibGUsCi0gIF9jb3VudF8oZW5hYmxlZF9zZXRzKSA6IDgsCi0gIGVuYWJsZWRfc2V0cyA6IEVuYWJsZWRTZXRbXSwKLX0KLQotdGVzdCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGUgewotICAiXHgzOVx4MjBceDA2XHgwMFx4MDFceDAxXHgwMFx4MDBceDAwIiwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfRU5BQkxFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZSB7Ci0gICJceDBlXHgwNFx4MDFceDM5XHgyMFx4MDAiLAotfQotCi1wYWNrZXQgTGVSZWFkTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aCA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX01BWElNVU1fQURWRVJUSVNJTkdfREFUQV9MRU5HVEgpIHsKLX0KLQotcGFja2V0IExlUmVhZE1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGhDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVBRF9NQVhJTVVNX0FEVkVSVElTSU5HX0RBVEFfTEVOR1RIKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aCA6IDE2LAotfQotCi1wYWNrZXQgTGVSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcnRpc2luZ1NldHMgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0FEVkVSVElTSU5HX1NFVFMpIHsKLX0KLQotcGFja2V0IExlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9BRFZFUlRJU0lOR19TRVRTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgbnVtYmVyX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzIDogOCwKLX0KLQotcGFja2V0IExlUmVtb3ZlQWR2ZXJ0aXNpbmdTZXQgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1JFTU9WRV9BRFZFUlRJU0lOR19TRVQpIHsKLSAgYWR2ZXJ0aXNpbmdfaGFuZGxlIDogOCwKLX0KLQotdGVzdCBMZVJlbW92ZUFkdmVydGlzaW5nU2V0IHsKLSAgIlx4M2NceDIwXHgwMVx4MDEiLAotfQotCi1wYWNrZXQgTGVSZW1vdmVBZHZlcnRpc2luZ1NldENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRU1PVkVfQURWRVJUSVNJTkdfU0VUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotdGVzdCBMZVJlbW92ZUFkdmVydGlzaW5nU2V0Q29tcGxldGUgewotICAiXHgwZVx4MDRceDAxXHgzY1x4MjBceDAwIiwKLX0KLQotcGFja2V0IExlQ2xlYXJBZHZlcnRpc2luZ1NldHMgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX0NMRUFSX0FEVkVSVElTSU5HX1NFVFMpIHsKLX0KLQotcGFja2V0IExlQ2xlYXJBZHZlcnRpc2luZ1NldHNDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfQ0xFQVJfQURWRVJUSVNJTkdfU0VUUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbSA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1BBUkFNKSB7Ci0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi0gIHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsX21pbiA6IDE2LCAvLyAweDAwNiB0byAweEZGRkYgKDcuNSBtcyB0byA4MnMpCi0gIHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsX21heCA6IDE2LCAvLyAweDAwNiB0byAweEZGRkYgKDcuNSBtcyB0byA4MnMpCi0gIF9yZXNlcnZlZF8gOiA2LAotICBpbmNsdWRlX3R4X3Bvd2VyIDogMSwKLSAgX3Jlc2VydmVkXyA6IDksCi19Ci0KLXBhY2tldCBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfUEFSQU0pIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YSA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0RBVEEpIHsKLSAgYWR2ZXJ0aXNpbmdfaGFuZGxlIDogOCwKLSAgb3BlcmF0aW9uIDogT3BlcmF0aW9uLAotICBfcmVzZXJ2ZWRfIDogNSwKLSAgX3NpemVfKHNjYW5fcmVzcG9uc2VfZGF0YSkgOiA4LAotICBzY2FuX3Jlc3BvbnNlX2RhdGEgOiBHYXBEYXRhW10sCi19Ci0KLXBhY2tldCBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZSA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSkgewotICBlbmFibGUgOiBFbmFibGUsCi0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi19Ci0KLXBhY2tldCBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXN0cnVjdCBQaHlTY2FuUGFyYW1ldGVycyB7Ci0gIGxlX3NjYW5fdHlwZSA6IExlU2NhblR5cGUsCi0gIGxlX3NjYW5faW50ZXJ2YWwgOiAxNiwgLy8gMHgwMDA0LTB4RkZGRiBEZWZhdWx0IDB4MTAgKDEwbXMpCi0gIGxlX3NjYW5fd2luZG93IDogMTYsIC8vIDB4MDA0LTB4RkZGRiBEZWZhdWx0IDB4MTAgKDEwbXMpCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnMgOiBMZVNjYW5uaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9FWFRFTkRFRF9TQ0FOX1BBUkFNRVRFUlMpIHsKLSAgb3duX2FkZHJlc3NfdHlwZSA6IE93bkFkZHJlc3NUeXBlLAotICBzY2FubmluZ19maWx0ZXJfcG9saWN5IDogTGVTY2FubmluZ0ZpbHRlclBvbGljeSwKLSAgc2Nhbm5pbmdfcGh5cyA6IDgsCi0gIHBhcmFtZXRlcnMgOiBQaHlTY2FuUGFyYW1ldGVyc1tdLAotfQotCi10ZXN0IExlU2V0RXh0ZW5kZWRTY2FuUGFyYW1ldGVycyB7Ci0gICJceDQxXHgyMFx4MDhceDAxXHgwMFx4MDFceDAxXHgxMlx4MDBceDEyXHgwMCIsCi0gICJceDQxXHgyMFx4MDhceDAxXHgwMFx4MDFceDAxXHg5OVx4MTlceDk5XHgxOSIsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnNDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX0VYVEVOREVEX1NDQU5fUEFSQU1FVEVSUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXRlc3QgTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQ29tcGxldGUgewotICAiXHgwZVx4MDRceDAxXHg0MVx4MjBceDAwIiwKLX0KLQotZW51bSBGaWx0ZXJEdXBsaWNhdGVzIDogOCB7Ci0gIERJU0FCTEVEID0gMCwKLSAgRU5BQkxFRCA9IDEsCi0gIFJFU0VUX0VBQ0hfUEVSSU9EID0gMiwKLX0KLQotcGFja2V0IExlU2V0RXh0ZW5kZWRTY2FuRW5hYmxlIDogTGVTY2FubmluZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpIHsKLSAgZW5hYmxlIDogRW5hYmxlLAotICBmaWx0ZXJfZHVwbGljYXRlcyA6IEZpbHRlckR1cGxpY2F0ZXMsCi0gIGR1cmF0aW9uIDogMTYsIC8vIDAgLSBTY2FuIGNvbnRpbnVvdXNseSwgIE4gKiAxMCBtcwotICBwZXJpb2QgOiAxNiwgLy8gMCAtIFNjYW4gY29udGludW91c2x5LCAgTiAqIDEuMjggc2VjCi19Ci0KLXRlc3QgTGVTZXRFeHRlbmRlZFNjYW5FbmFibGUgewotICAiXHg0Mlx4MjBceDA2XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwIiwKLSAgIlx4NDJceDIwXHgwNlx4MDBceDAxXHgwMFx4MDBceDAwXHgwMCIsCi19Ci0KLXBhY2tldCBMZVNldEV4dGVuZGVkU2NhbkVuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi10ZXN0IExlU2V0RXh0ZW5kZWRTY2FuRW5hYmxlQ29tcGxldGUgewotICAiXHgwZVx4MDRceDAxXHg0Mlx4MjBceDAwIiwKLX0KLQotc3RydWN0IExlQ3JlYXRlQ29ublBoeVNjYW5QYXJhbWV0ZXJzIHsKLSAgc2Nhbl9pbnRlcnZhbCA6IDE2LCAvLyAweDAwMDQtMHhGRkZGCi0gIHNjYW5fd2luZG93IDogMTYsIC8vIDwgPSBMZVNjYW5JbnRlcnZhbAotICBjb25uX2ludGVydmFsX21pbiA6IDE2LCAvLyAweDAwMDYtMHgwQzgwICg3LjVtcyB0byA0cykKLSAgY29ubl9pbnRlcnZhbF9tYXggOiAxNiwgLy8gMHgwMDA2LTB4MEM4MCAoNy41bXMgdG8gNHMpCi0gIGNvbm5fbGF0ZW5jeSA6IDE2LCAvLyAweDAwMDYtMHgwMUYzCi0gIHN1cGVydmlzaW9uX3RpbWVvdXQgOiAxNiwgLy8gMHgwMEEgdG8gMHgwQzgwICgxMDBtcyB0byAzMnMpCi0gIG1pbl9jZV9sZW5ndGggOiAxNiwgLy8gMC42MjVtcwotICBtYXhfY2VfbGVuZ3RoIDogMTYsIC8vIDAuNjI1bXMKLX0KLQotcGFja2V0IExlRXh0ZW5kZWRDcmVhdGVDb25uZWN0aW9uIDogTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmQgKG9wX2NvZGUgPSBMRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTikgewotICBpbml0aWF0b3JfZmlsdGVyX3BvbGljeSA6IEluaXRpYXRvckZpbHRlclBvbGljeSwKLSAgb3duX2FkZHJlc3NfdHlwZSA6IE93bkFkZHJlc3NUeXBlLAotICBwZWVyX2FkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICBwZWVyX2FkZHJlc3MgOiBBZGRyZXNzLAotICBpbml0aWF0aW5nX3BoeXMgOiA4LAotICBwaHlfc2Nhbl9wYXJhbWV0ZXJzIDogTGVDcmVhdGVDb25uUGh5U2NhblBhcmFtZXRlcnNbXSwKLX0KLQotdGVzdCBMZUV4dGVuZGVkQ3JlYXRlQ29ubmVjdGlvbiB7Ci0gICJceDQzXHgyMFx4MmFceDAxXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAzXHgwMFx4MDhceDMwXHgwMFx4MThceDAwXHgyOFx4MDBceDAwXHgwMFx4ZjRceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDA4XHgzMFx4MDBceDE4XHgwMFx4MjhceDAwXHgwMFx4MDBceGY0XHgwMVx4MDBceDAwXHgwMFx4MDAiLAotfQotCi1wYWNrZXQgTGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25TdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTikgewotfQotCi1wYWNrZXQgTGVQZXJpb2RpY0FkdmVydGlzaW5nQ3JlYXRlU3luYyA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkMpIHsKLSAgX3BheWxvYWRfLCAgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLXBhY2tldCBMZVBlcmlvZGljQWR2ZXJ0aXNpbmdDcmVhdGVTeW5jU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkMpIHsKLX0KLQotcGFja2V0IExlUGVyaW9kaWNBZHZlcnRpc2luZ0NyZWF0ZVN5bmNDYW5jZWwgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1BFUklPRElDX0FEVkVSVElTSU5HX0NSRUFURV9TWU5DX0NBTkNFTCkgewotICBfcGF5bG9hZF8sICAvLyBwbGFjZWhvbGRlciAodW5pbXBsZW1lbnRlZCkKLX0KLQotcGFja2V0IExlUGVyaW9kaWNBZHZlcnRpc2luZ0NyZWF0ZVN5bmNDYW5jZWxDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkNfQ0FOQ0VMKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUGVyaW9kaWNBZHZlcnRpc2luZ1Rlcm1pbmF0ZVN5bmMgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1BFUklPRElDX0FEVkVSVElTSU5HX1RFUk1JTkFURV9TWU5DKSB7Ci0gIF9wYXlsb2FkXywgIC8vIHBsYWNlaG9sZGVyICh1bmltcGxlbWVudGVkKQotfQotCi1wYWNrZXQgTGVQZXJpb2RpY0FkdmVydGlzaW5nVGVybWluYXRlU3luY0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19URVJNSU5BVEVfU1lOQykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLWVudW0gQWR2ZXJ0aXNpbmdBZGRyZXNzVHlwZSA6IDggewotICBQVUJMSUNfQUREUkVTUyA9IDB4MDAsCi0gIFJBTkRPTV9BRERSRVNTID0gMHgwMSwKLX0KLQotcGFja2V0IExlQWRkRGV2aWNlVG9QZXJpb2RpY0FkdmVydGlzaW5nTGlzdCA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfQUREX0RFVklDRV9UT19QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUKSB7Ci0gIGFkdmVydGlzaW5nX2FkZHJlc3NfdHlwZSA6IEFkdmVydGlzaW5nQWRkcmVzc1R5cGUsCi0gIGFkdmVydGlzZXJfYWRkcmVzcyA6IEFkZHJlc3MsCi0gIGFkdmVydGlzaW5nX3NpZCA6IDQsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVBZGREZXZpY2VUb1BlcmlvZGljQWR2ZXJ0aXNpbmdMaXN0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX0FERF9ERVZJQ0VfVE9fUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVJlbW92ZURldmljZUZyb21QZXJpb2RpY0FkdmVydGlzaW5nTGlzdCA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfUkVNT1ZFX0RFVklDRV9GUk9NX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1QpIHsKLSAgX3BheWxvYWRfLCAgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLXBhY2tldCBMZVJlbW92ZURldmljZUZyb21QZXJpb2RpY0FkdmVydGlzaW5nTGlzdENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRU1PVkVfREVWSUNFX0ZST01fUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZUNsZWFyUGVyaW9kaWNBZHZlcnRpc2luZ0xpc3QgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX0NMRUFSX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1QpIHsKLX0KLQotcGFja2V0IExlQ2xlYXJQZXJpb2RpY0FkdmVydGlzaW5nTGlzdENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9DTEVBUl9QRVJJT0RJQ19BRFZFUlRJU0lOR19MSVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVhZFBlcmlvZGljQWR2ZXJ0aXNlckxpc3RTaXplIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1JFQURfUEVSSU9ESUNfQURWRVJUSVNJTkdfTElTVF9TSVpFKSB7Ci19Ci0KLXBhY2tldCBMZVJlYWRQZXJpb2RpY0FkdmVydGlzZXJMaXN0U2l6ZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1BFUklPRElDX0FEVkVSVElTSU5HX0xJU1RfU0laRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIHBlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplIDogOCwKLX0KLQotcGFja2V0IExlUmVhZFRyYW5zbWl0UG93ZXIgOiBMZUFkdmVydGlzaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX1JFQURfVFJBTlNNSVRfUE9XRVIpIHsKLX0KLQotcGFja2V0IExlUmVhZFRyYW5zbWl0UG93ZXJDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUkVBRF9UUkFOU01JVF9QT1dFUikgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIG1pbl90eF9wb3dlcl9kYm0gOiA4LAotICBtYXhfdHhfcG93ZXJfZGJtIDogOCwKLX0KLQotcGFja2V0IExlUmVhZFJmUGF0aENvbXBlbnNhdGlvblBvd2VyIDogTGVBZHZlcnRpc2luZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX1JGX1BBVEhfQ09NUEVOU0FUSU9OX1BPV0VSKSB7Ci19Ci0KLXBhY2tldCBMZVJlYWRSZlBhdGhDb21wZW5zYXRpb25Qb3dlckNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1JGX1BBVEhfQ09NUEVOU0FUSU9OX1BPV0VSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgcmZfdHhfcGF0aF9jb21wZW5zYXRpb25fdGVudGhzX2RiIDogMTYsCi0gIHJmX3J4X3BhdGhfY29tcGVuc2F0aW9uX3RlbnRoc19kYiA6IDE2LAotfQotCi1wYWNrZXQgTGVXcml0ZVJmUGF0aENvbXBlbnNhdGlvblBvd2VyIDogTGVBZHZlcnRpc2luZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9XUklURV9SRl9QQVRIX0NPTVBFTlNBVElPTl9QT1dFUikgewotICByZl90eF9wYXRoX2NvbXBlbnNhdGlvbl90ZW50aHNfZGIgOiAxNiwKLSAgcmZfcnhfcGF0aF9jb21wZW5zYXRpb25fdGVudGhzX2RiIDogMTYsCi19Ci0KLXBhY2tldCBMZVdyaXRlUmZQYXRoQ29tcGVuc2F0aW9uUG93ZXJDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfV1JJVEVfUkZfUEFUSF9DT01QRU5TQVRJT05fUE9XRVIpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1lbnVtIFByaXZhY3lNb2RlIDogOCB7Ci0gIE5FVFdPUksgPSAwLAotICBERVZJQ0UgPSAxLAotfQotCi1wYWNrZXQgTGVTZXRQcml2YWN5TW9kZSA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1BSSVZBQ1lfTU9ERSkgewotICBwZWVyX2lkZW50aXR5X2FkZHJlc3NfdHlwZSA6IFBlZXJBZGRyZXNzVHlwZSwKLSAgcGVlcl9pZGVudGl0eV9hZGRyZXNzIDogQWRkcmVzcywKLSAgcHJpdmFjeV9tb2RlIDogUHJpdmFjeU1vZGUsCi19Ci0KLXBhY2tldCBMZVNldFByaXZhY3lNb2RlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9QUklWQUNZX01PREUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nUmVjZWl2ZUVuYWJsZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfUkVDRUlWRV9FTkFCTEUpIHsKLSAgc3luY19oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGVuYWJsZSA6IDgsCi19Ci0KLXBhY2tldCBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdSZWNlaXZlRW5hYmxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19SRUNFSVZFX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXIgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUikgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgc2VydmljZV9kYXRhIDogMTYsCi0gIHN5bmNfaGFuZGxlOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBMZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUikgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVQZXJpb2RpY0FkdmVydGlzaW5nU2V0SW5mb1RyYW5zZmVyIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1BFUklPRElDX0FEVkVSVElTSU5HX1NFVF9JTkZPX1RSQU5TRkVSKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBzZXJ2aWNlX2RhdGEgOiAxNiwKLSAgYWR2ZXJ0aXNpbmdfaGFuZGxlOiA4LAotfQotCi1wYWNrZXQgTGVQZXJpb2RpY0FkdmVydGlzaW5nU2V0SW5mb1RyYW5zZmVyQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1BFUklPRElDX0FEVkVSVElTSU5HX1NFVF9JTkZPX1RSQU5TRkVSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLWVudW0gU3luY1RyYW5zZmVyTW9kZSA6IDggewotICBOT19TWU5DID0gMCwKLSAgU0VORF9TWU5DX1JFQ0VJVkVEX0RJU0FCTEVfUkVQT1JUUyA9IDEsCi0gIFNFTkRfU1lOQ19SRUNFSVZFRF9TRU5EX1JFUE9SVFMgPSAyLAotfQotCi1wYWNrZXQgTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nU3luY1RyYW5zZmVyUGFyYW1ldGVycyA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTUVURVJTKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBtb2RlIDogU3luY1RyYW5zZmVyTW9kZSwKLSAgc2tpcDogMTYsCi0gIHN5bmNfdGltZW91dCA6IDE2LAotICBjdGVfdHlwZSA6IDgsCi19Ci0KLXBhY2tldCBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJQYXJhbWV0ZXJzQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNRVRFUlMpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IExlU2V0RGVmYXVsdFBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJQYXJhbWV0ZXJzIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9ERUZBVUxUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU1FVEVSUykgewotICBtb2RlIDogU3luY1RyYW5zZmVyTW9kZSwKLSAgc2tpcDogMTYsCi0gIHN5bmNfdGltZW91dCA6IDE2LAotICBjdGVfdHlwZSA6IDgsCi19Ci0KLXBhY2tldCBMZVNldERlZmF1bHRQZXJpb2RpY0FkdmVydGlzaW5nU3luY1RyYW5zZmVyUGFyYW1ldGVyc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfREVGQVVMVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNRVRFUlMpIHsKLX0KLQotZW51bSBVc2VEZWJ1Z0tleSA6IDggewotICBVU0VfR0VORVJBVEVEX0tFWSA9IDAsCi0gIFVTRV9ERUJVR19LRVkgPSAxLAotfQotCi1wYWNrZXQgTGVHZW5lcmF0ZURoa2V5Q29tbWFuZCA6IExlU2VjdXJpdHlDb21tYW5kIChvcF9jb2RlID0gTEVfR0VORVJBVEVfREhLRVlfQ09NTUFORCkgewotICByZW1vdGVfcF8yNTZfcHVibGljX2tleSA6IDhbNjRdLAotICBrZXlfdHlwZSA6IFVzZURlYnVnS2V5LAotfQotCi1wYWNrZXQgTGVHZW5lcmF0ZURoa2V5Q29tbWFuZFN0YXR1cyA6IENvbW1hbmRTdGF0dXMgKGNvbW1hbmRfb3BfY29kZSA9IExFX0dFTkVSQVRFX0RIS0VZX0NPTU1BTkQpIHsKLX0KLQotZW51bSBTY2FBY3Rpb24gOiA4IHsKLSAgTU9SRV9BQ0NVUkFURV9DTE9DSyA9IDAsCi0gIExFU1NfQUNDVVJBVEVfQ0xPQ0sgPSAxLAotfQotCi1wYWNrZXQgTGVNb2RpZnlTbGVlcENsb2NrQWNjdXJhY3kgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfTU9ESUZZX1NMRUVQX0NMT0NLX0FDQ1VSQUNZKSB7Ci0gIGFjdGlvbiA6IFNjYUFjdGlvbiwKLX0KLQotcGFja2V0IExlTW9kaWZ5U2xlZXBDbG9ja0FjY3VyYWN5Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX01PRElGWV9TTEVFUF9DTE9DS19BQ0NVUkFDWSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVJlYWRCdWZmZXJTaXplVjIgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9CVUZGRVJfU0laRV9WMikgewotfQotCi1wYWNrZXQgTGVSZWFkQnVmZmVyU2l6ZVYyQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFQURfQlVGRkVSX1NJWkVfVjIpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBsZV9idWZmZXJfc2l6ZSA6IExlQnVmZmVyU2l6ZSwKLSAgaXNvX2J1ZmZlcl9zaXplIDogTGVCdWZmZXJTaXplLAotfQotCi1wYWNrZXQgTGVSZWFkSXNvVHhTeW5jIDogTGVJc29Db21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9JU09fVFhfU1lOQykgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IExlUmVhZElzb1R4U3luY0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX0lTT19UWF9TWU5DKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyIDogMTYsCi0gIHRpbWVzdGFtcCA6IDMyLAotICB0aW1lX29mZnNldCA6IDI0LAotfQotCi1zdHJ1Y3QgQ2lzUGFyYW1ldGVyc0NvbmZpZyB7Ci0gIGNpc19pZCA6IDgsCi0gIG1heF9zZHVfbV90b19zIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBtYXhfc2R1X3NfdG9fbSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGh5X21fdG9fcyA6IDMsCi0gIF9yZXNlcnZlZF8gOiA1LAotICBwaHlfc190b19tIDogMywKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIHJ0bl9tX3RvX3MgOiA0LAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcnRuX3NfdG9fbSA6IDQsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1lbnVtIFBhY2tpbmcgOiA4IHsKLSAgU0VRVUVOVElBTCA9IDAsCi0gIElOVEVSTEVBVkVEID0gMSwKLX0KLQotZW51bSBDbG9ja0FjY3VyYWN5IDogOCB7Ci0gIFBQTV81MDAgPSAweDAwLAotICBQUE1fMjUwID0gMHgwMSwKLSAgUFBNXzE1MCA9IDB4MDIsCi0gIFBQTV8xMDAgPSAweDAzLAotICBQUE1fNzUgPSAweDA0LAotICBQUE1fNTAgPSAweDA1LAotICBQUE1fMzAgPSAweDA2LAotICBQUE1fMjAgPSAweDA3LAotfQotCi1wYWNrZXQgTGVTZXRDaWdQYXJhbWV0ZXJzIDogTGVJc29Db21tYW5kIChvcF9jb2RlID0gTEVfU0VUX0NJR19QQVJBTUVURVJTKSB7Ci0gIGNpZ19pZCA6IDgsCi0gIHNkdV9pbnRlcnZhbF9tX3RvX3MgOiAyNCwKLSAgc2R1X2ludGVydmFsX3NfdG9fbSA6IDI0LAotICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSA6IENsb2NrQWNjdXJhY3ksCi0gIHBhY2tpbmcgOiBQYWNraW5nLAotICBmcmFtaW5nIDogRW5hYmxlLAotICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zIDogMTYsCi0gIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20gOiAxNiwKLSAgX2NvdW50XyhjaXNfY29uZmlnKSA6IDgsCi0gIGNpc19jb25maWcgOiBDaXNQYXJhbWV0ZXJzQ29uZmlnW10sCi19Ci0KLXBhY2tldCBMZVNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX0NJR19QQVJBTUVURVJTKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY2lnX2lkIDogOCwKLSAgX2NvdW50Xyhjb25uZWN0aW9uX2hhbmRsZSkgOiA4LAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDE2W10sCi19Ci0KLXN0cnVjdCBMZUNpc1BhcmFtZXRlcnNUZXN0Q29uZmlnIHsKLSAgY2lzX2lkIDogOCwKLSAgbnNlIDogOCwKLSAgbWF4X3NkdV9tX3RvX3MgOiAxNiwKLSAgbWF4X3NkdV9zX3RvX20gOiAxNiwKLSAgbWF4X3BkdV9tX3RvX3MgOiAxNiwKLSAgbWF4X3BkdV9zX3RvX20gOiAxNiwKLSAgcGh5X21fdG9fcyA6IDgsCi0gIHBoeV9zX3RvX20gOiA4LAotICBibl9tX3RvX3MgOiA4LAotICBibl9zX3RvX20gOiA4LAotfQotCi1wYWNrZXQgTGVTZXRDaWdQYXJhbWV0ZXJzVGVzdCA6IExlSXNvQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9DSUdfUEFSQU1FVEVSU19URVNUKSB7Ci0gIGNpZ19pZCA6IDgsCi0gIHNkdV9pbnRlcnZhbF9tX3RvX3MgOiAyNCwKLSAgc2R1X2ludGVydmFsX3NfdG9fbSA6IDI0LAotICBmdF9tX3RvX3MgOiA4LAotICBmdF9zX3RvX20gOiA4LAotICBpc29faW50ZXJ2YWwgOiAxNiwKLSAgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3kgOiBDbG9ja0FjY3VyYWN5LAotICBwYWNraW5nIDogUGFja2luZywKLSAgZnJhbWluZyA6IEVuYWJsZSwKLSAgX2NvdW50XyhjaXNfY29uZmlnKSA6IDgsCi0gIGNpc19jb25maWcgOiBMZUNpc1BhcmFtZXRlcnNUZXN0Q29uZmlnW10sCi19Ci0KLXBhY2tldCBMZVNldENpZ1BhcmFtZXRlcnNUZXN0Q29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9DSUdfUEFSQU1FVEVSU19URVNUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY2lnX2lkIDogOCwKLSAgX2NvdW50Xyhjb25uZWN0aW9uX2hhbmRsZSkgOiA4LAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDE2W10sCi19Ci0KLXN0cnVjdCBDcmVhdGVDaXNDb25maWcgewotICBjaXNfY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGFjbF9jb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IExlQ3JlYXRlQ2lzIDogTGVJc29Db21tYW5kIChvcF9jb2RlID0gTEVfQ1JFQVRFX0NJUykgewotICBfY291bnRfKGNpc19jb25maWcpIDogOCwKLSAgY2lzX2NvbmZpZyA6IENyZWF0ZUNpc0NvbmZpZ1tdLAotfQotCi1wYWNrZXQgTGVDcmVhdGVDaXNTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9DUkVBVEVfQ0lTKSB7Ci19Ci0KLXBhY2tldCBMZVJlbW92ZUNpZyA6IExlSXNvQ29tbWFuZCAob3BfY29kZSA9IExFX1JFTU9WRV9DSUcpIHsKLSAgY2lnX2lkIDogOCwKLX0KLQotcGFja2V0IExlUmVtb3ZlQ2lnQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFTU9WRV9DSUcpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjaWdfaWQgOiA4LAotfQotCi1wYWNrZXQgTGVBY2NlcHRDaXNSZXF1ZXN0IDogTGVJc29Db21tYW5kIChvcF9jb2RlID0gTEVfQUNDRVBUX0NJU19SRVFVRVNUKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVBY2NlcHRDaXNSZXF1ZXN0U3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gTEVfQUNDRVBUX0NJU19SRVFVRVNUKSB7Ci19Ci0KLXBhY2tldCBMZVJlamVjdENpc1JlcXVlc3QgOiBMZUlzb0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUpFQ1RfQ0lTX1JFUVVFU1QpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHJlYXNvbiA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlUmVqZWN0Q2lzUmVxdWVzdENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUpFQ1RfQ0lTX1JFUVVFU1QpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IExlQ3JlYXRlQmlnIDogTGVJc29Db21tYW5kIChvcF9jb2RlID0gTEVfQ1JFQVRFX0JJRykgewotICBiaWdfaGFuZGxlIDogOCwKLSAgYWR2ZXJ0aXNpbmdfaGFuZGxlIDogOCwKLSAgbnVtX2JpcyA6IDgsCi0gIHNkdV9pbnRlcnZhbCA6IDI0LAotICBtYXhfc2R1IDogMTYsCi0gIG1heF90cmFuc3BvcnRfbGF0ZW5jeSA6IDE2LAotICBydG4gOiA0LAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGh5IDogU2Vjb25kYXJ5UGh5VHlwZSwKLSAgcGFja2luZyA6IFBhY2tpbmcsCi0gIGZyYW1pbmcgOiBFbmFibGUsCi0gIGVuY3J5cHRpb24gOiBFbmFibGUsCi0gIGJyb2FkY2FzdF9jb2RlOiAxNltdLAotfQotCi1wYWNrZXQgTGVDcmVhdGVCaWdTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9DUkVBVEVfQklHKSB7Ci19Ci0KLXBhY2tldCBMZVRlcm1pbmF0ZUJpZyA6IExlSXNvQ29tbWFuZCAob3BfY29kZSA9IExFX1RFUk1JTkFURV9CSUcpIHsKLSAgYmlnX2hhbmRsZSA6IDgsCi0gIHJlYXNvbiA6IEVycm9yQ29kZSwKLX0KLQotcGFja2V0IExlVGVybWluYXRlQmlnU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gTEVfVEVSTUlOQVRFX0JJRykgewotfQotCi1wYWNrZXQgTGVCaWdDcmVhdGVTeW5jIDogTGVJc29Db21tYW5kIChvcF9jb2RlID0gTEVfQklHX0NSRUFURV9TWU5DKSB7Ci0gIGJpZ19oYW5kbGUgOiA4LAotICBzeW5jX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgZW5jcnlwdGlvbiA6IEVuYWJsZSwKLSAgYnJvYWRjYXN0X2NvZGUgOiAxNltdLAotICBtc2UgOiA1LAotICBfcmVzZXJ2ZWRfIDogMywKLSAgYmlnX3N5bmNfdGltZW91dCA6IDE2LAotICBfY291bnRfKGJpcykgOiA4LAotICBiaXMgOiA4W10sCi19Ci0KLXBhY2tldCBMZUJpZ0NyZWF0ZVN5bmNTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9CSUdfQ1JFQVRFX1NZTkMpIHsKLX0KLQotcGFja2V0IExlQmlnVGVybWluYXRlU3luYyA6IExlSXNvQ29tbWFuZCAob3BfY29kZSA9IExFX0JJR19URVJNSU5BVEVfU1lOQykgewotICBiaWdfaGFuZGxlIDogOCwKLX0KLQotcGFja2V0IExlQmlnVGVybWluYXRlU3luY0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9CSUdfVEVSTUlOQVRFX1NZTkMpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiaWdfaGFuZGxlIDogOCwKLX0KLQotcGFja2V0IExlUmVxdWVzdFBlZXJTY2EgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUkVRVUVTVF9QRUVSX1NDQSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IExlUmVxdWVzdFBlZXJTY2FTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRVFVRVNUX1BFRVJfU0NBKSB7Ci19Ci0KLXBhY2tldCBMZVNldHVwSXNvRGF0YVBhdGggOiBMZUlzb0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRVUF9JU09fREFUQV9QQVRIKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBkYXRhX3BhdGhfZGlyZWN0aW9uIDogRGF0YVBhdGhEaXJlY3Rpb24sCi0gIGRhdGFfcGF0aF9pZCA6IDgsCi0gIGNvZGVjX2lkIDogNDAsCi0gIGNvbnRyb2xsZXJfZGVsYXkgOiAyNCwKLSAgX2NvdW50Xyhjb2RlY19jb25maWd1cmF0aW9uKSA6IDgsCi0gIGNvZGVjX2NvbmZpZ3VyYXRpb24gOiA4W10sCi19Ci0KLXBhY2tldCBMZVNldHVwSXNvRGF0YVBhdGhDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUVVBfSVNPX0RBVEFfUEFUSCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVSZW1vdmVJc29EYXRhUGF0aCA6IExlSXNvQ29tbWFuZCAob3BfY29kZSA9IExFX1JFTU9WRV9JU09fREFUQV9QQVRIKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBkYXRhX3BhdGhfZGlyZWN0aW9uIDogRGF0YVBhdGhEaXJlY3Rpb24sCi19Ci0KLXBhY2tldCBMZVJlbW92ZUlzb0RhdGFQYXRoQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1JFTU9WRV9JU09fREFUQV9QQVRIKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLWVudW0gTGVIb3N0RmVhdHVyZUJpdHMgOiA4IHsKLSAgQ09OTkVDVEVEX0lTT19TVFJFQU1fSE9TVF9TVVBQT1JUID0gMzIsCi19Ci0KLXBhY2tldCBMZVNldEhvc3RGZWF0dXJlIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9IT1NUX0ZFQVRVUkUpIHsKLSAgYml0X251bWJlciA6IExlSG9zdEZlYXR1cmVCaXRzLAotICBiaXRfdmFsdWU6ICBFbmFibGUsCi19Ci0KLXBhY2tldCBMZVNldEhvc3RGZWF0dXJlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9IT1NUX0ZFQVRVUkUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVSZWFkSXNvTGlua1F1YWxpdHkgOiBMZUlzb0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9SRUFEX0lTT19MSU5LX1FVQUxJVFkpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBMZVJlYWRJc29MaW5rUXVhbGl0eUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX0lTT19MSU5LX1FVQUxJVFkpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgdHhfdW5hY2tlZF9wYWNrZXRzIDogMzIsCi0gIHR4X2ZsdXNoZWRfcGFja2V0cyA6IDMyLAotICB0eF9sYXN0X3N1YmV2ZW50X3BhY2tldHMgOiAzMiwKLSAgcmV0cmFuc21pdHRlZF9wYWNrZXRzIDogMzIsCi0gIGNyY19lcnJvcl9wYWNrZXRzIDogMzIsCi0gIHJ4X3VucmVjZWl2ZWRfcGFja2V0cyA6IDMyLAotICBkdXBsaWNhdGVfcGFja2V0cyA6IDMyLAotfQotCi1wYWNrZXQgTGVFbmhhbmNlZFJlYWRUcmFuc21pdFBvd2VyTGV2ZWwgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfRU5IQU5DRURfUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTCkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGh5IDogOCwKLX0KLQotZW51bSBQaHlXaXRoQ29kZWRTcGVjaWZpZWQgOiA4IHsKLSAgTEVfMU0gPSAxLAotICBMRV8yTSA9IDIsCi0gIExFX0NPREVEX1NfOCA9IDMsCi0gIExFX0NPREVEX1NfMiA9IDQsCi19Ci0KLXBhY2tldCBMZUVuaGFuY2VkUmVhZFRyYW5zbWl0UG93ZXJMZXZlbENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9FTkhBTkNFRF9SRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHBoeSA6IFBoeVdpdGhDb2RlZFNwZWNpZmllZCwKLSAgY3VycmVudF90cmFuc21pdF9wb3dlcl9sZXZlbCA6IDgsCi0gIG1heF90cmFuc21pdF9wb3dlcl9sZXZlbCA6IDgsCi19Ci0KLXBhY2tldCBMZVJlYWRSZW1vdGVUcmFuc21pdFBvd2VyTGV2ZWwgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfUkVBRF9SRU1PVEVfVFJBTlNNSVRfUE9XRVJfTEVWRUwpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHBoeSA6IDgsCi19Ci0KLXBhY2tldCBMZVJlYWRSZW1vdGVUcmFuc21pdFBvd2VyTGV2ZWxTdGF0dXMgOiBDb21tYW5kU3RhdHVzIChjb21tYW5kX29wX2NvZGUgPSBMRV9SRUFEX1JFTU9URV9UUkFOU01JVF9QT1dFUl9MRVZFTCkgewotfQotCi1wYWNrZXQgTGVTZXRQYXRoTG9zc1JlcG9ydGluZ1BhcmFtZXRlcnMgOiBDb21tYW5kIChvcF9jb2RlID0gTEVfU0VUX1BBVEhfTE9TU19SRVBPUlRJTkdfUEFSQU1FVEVSUykgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgaGlnaF90aHJlc2hvbGQgOiA4LAotICBoaWdoX2h5c3RlcmVzaXMgOiA4LAotICBsb3dfdGhyZXNob2xkIDogOCwKLSAgbG93X2h5c3RlcmVzaXMgOiA4LAotICBtaW5fdGltZV9zcGVudCA6IDE2LAotfQotCi1wYWNrZXQgTGVTZXRQYXRoTG9zc1JlcG9ydGluZ1BhcmFtZXRlcnNDb21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfU0VUX1BBVEhfTE9TU19SRVBPUlRJTkdfUEFSQU1FVEVSUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVTZXRQYXRoTG9zc1JlcG9ydGluZ0VuYWJsZSA6IENvbW1hbmQgKG9wX2NvZGUgPSBMRV9TRVRfUEFUSF9MT1NTX1JFUE9SVElOR19FTkFCTEUpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGVuYWJsZSA6IDgsCi19Ci0KLXBhY2tldCBMZVNldFBhdGhMb3NzUmVwb3J0aW5nRW5hYmxlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IExFX1NFVF9QQVRIX0xPU1NfUkVQT1JUSU5HX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgTGVTZXRUcmFuc21pdFBvd2VyUmVwb3J0aW5nRW5hYmxlIDogQ29tbWFuZCAob3BfY29kZSA9IExFX1NFVF9UUkFOU01JVF9QT1dFUl9SRVBPUlRJTkdfRU5BQkxFKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsb2NhbF9lbmFibGUgOiA4LAotICByZW1vdGVfZW5hYmxlIDogOCwKLX0KLQotcGFja2V0IExlU2V0VHJhbnNtaXRQb3dlclJlcG9ydGluZ0VuYWJsZUNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9TRVRfVFJBTlNNSVRfUE9XRVJfUkVQT1JUSU5HX0VOQUJMRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi0gIC8vIFZFTkRPUl9TUEVDSUZJQwotcGFja2V0IExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzIDogVmVuZG9yQ29tbWFuZCAob3BfY29kZSA9IExFX0dFVF9WRU5ET1JfQ0FQQUJJTElUSUVTKSB7Ci19Ci0KLXRlc3QgTGVHZXRWZW5kb3JDYXBhYmlsaXRpZXMgewotICAiXHg1M1x4ZmRceDAwIiwKLX0KLQotc3RydWN0IFZlbmRvckNhcGFiaWxpdGllcyB7Ci0gIGlzX3N1cHBvcnRlZCA6IDgsCi0gIG1heF9hZHZ0X2luc3RhbmNlczogOCwKLSAgb2ZmbG9hZGVkX3Jlc29sdXRpb25fb2ZfcHJpdmF0ZV9hZGRyZXNzIDogOCwKLSAgdG90YWxfc2Nhbl9yZXN1bHRzX3N0b3JhZ2U6IDE2LAotICBtYXhfaXJrX2xpc3Rfc3o6IDgsCi0gIGZpbHRlcmluZ19zdXBwb3J0OiA4LAotICBtYXhfZmlsdGVyOiA4LAotICBhY3Rpdml0eV9lbmVyZ3lfaW5mb19zdXBwb3J0OiA4LAotICB2ZXJzaW9uX3N1cHBvcnRlZDogMTYsCi0gIHRvdGFsX251bV9vZl9hZHZ0X3RyYWNrZWQ6IDE2LAotICBleHRlbmRlZF9zY2FuX3N1cHBvcnQ6IDgsCi0gIGRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkOiA4LAotICBsZV9hZGRyZXNzX2dlbmVyYXRpb25fb2ZmbG9hZGluZ19zdXBwb3J0OiA4LAotICBhMmRwX3NvdXJjZV9vZmZsb2FkX2NhcGFiaWxpdHlfbWFzazogMzIsCi0gIGJsdWV0b290aF9xdWFsaXR5X3JlcG9ydF9zdXBwb3J0OiA4Ci19Ci0KLXN0cnVjdCBCYXNlVmVuZG9yQ2FwYWJpbGl0aWVzIHsKLSAgbWF4X2FkdnRfaW5zdGFuY2VzOiA4LAotICBvZmZsb2FkZWRfcmVzb2x1dGlvbl9vZl9wcml2YXRlX2FkZHJlc3MgOiA4LAotICB0b3RhbF9zY2FuX3Jlc3VsdHNfc3RvcmFnZTogMTYsCi0gIG1heF9pcmtfbGlzdF9zejogOCwKLSAgZmlsdGVyaW5nX3N1cHBvcnQ6IDgsCi0gIG1heF9maWx0ZXI6IDgsCi0gIGFjdGl2aXR5X2VuZXJneV9pbmZvX3N1cHBvcnQ6IDgsCi19Ci0KLXBhY2tldCBMZUdldFZlbmRvckNhcGFiaWxpdGllc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9HRVRfVkVORE9SX0NBUEFCSUxJVElFUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJhc2VfdmVuZG9yX2NhcGFiaWxpdGllcyA6IEJhc2VWZW5kb3JDYXBhYmlsaXRpZXMsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzQ29tcGxldGUwOTUgOiBMZUdldFZlbmRvckNhcGFiaWxpdGllc0NvbXBsZXRlIHsKLSAgdmVyc2lvbl9zdXBwb3J0ZWQ6IDE2LAotICB0b3RhbF9udW1fb2ZfYWR2dF90cmFja2VkOiAxNiwKLSAgZXh0ZW5kZWRfc2Nhbl9zdXBwb3J0OiA4LAotICBkZWJ1Z19sb2dnaW5nX3N1cHBvcnRlZDogOCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgTGVHZXRWZW5kb3JDYXBhYmlsaXRpZXNDb21wbGV0ZTA5NiA6IExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzQ29tcGxldGUwOTUgewotICBsZV9hZGRyZXNzX2dlbmVyYXRpb25fb2ZmbG9hZGluZ19zdXBwb3J0OiA4LAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBMZUdldFZlbmRvckNhcGFiaWxpdGllc0NvbXBsZXRlMDk4IDogTGVHZXRWZW5kb3JDYXBhYmlsaXRpZXNDb21wbGV0ZTA5NiB7Ci0gIGEyZHBfc291cmNlX29mZmxvYWRfY2FwYWJpbGl0eV9tYXNrOiAzMiwKLSAgYmx1ZXRvb3RoX3F1YWxpdHlfcmVwb3J0X3N1cHBvcnQ6IDgKLX0KLQotZW51bSBTdWJPY2YgOiA4IHsKLSAgU0VUX1BBUkFNID0gMHgwMSwKLSAgU0VUX0RBVEEgPSAweDAyLAotICBTRVRfU0NBTl9SRVNQID0gMHgwMywKLSAgU0VUX1JBTkRPTV9BRERSID0gMHgwNCwKLSAgU0VUX0VOQUJMRSA9IDB4MDUsCi19Ci0KLXBhY2tldCBMZU11bHRpQWR2dCA6IExlQWR2ZXJ0aXNpbmdDb21tYW5kIChvcF9jb2RlID0gTEVfTVVMVElfQURWVCkgewotICBzdWJfY21kIDogU3ViT2NmLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBMZU11bHRpQWR2dENvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9NVUxUSV9BRFZUKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgc3ViX2NtZCA6IFN1Yk9jZiwKLX0KLQotcGFja2V0IExlTXVsdGlBZHZ0UGFyYW0gOiBMZU11bHRpQWR2dCAoc3ViX2NtZCA9IFNFVF9QQVJBTSkgewotICBpbnRlcnZhbF9taW4gOiAxNiwKLSAgaW50ZXJ2YWxfbWF4IDogMTYsCi0gIGFkdnRfdHlwZSA6IEFkdmVydGlzaW5nVHlwZSwKLSAgb3duX2FkZHJlc3NfdHlwZSA6IE93bkFkZHJlc3NUeXBlLAotICBvd25fYWRkcmVzcyA6IEFkZHJlc3MsCi0gIHBlZXJfYWRkcmVzc190eXBlIDogUGVlckFkZHJlc3NUeXBlLAotICBwZWVyX2FkZHJlc3MgOiBBZGRyZXNzLAotICBjaGFubmVsX21hcCA6IDgsCi0gIGZpbHRlcl9wb2xpY3kgOiBBZHZlcnRpc2luZ0ZpbHRlclBvbGljeSwKLSAgX3Jlc2VydmVkXyA6IDYsCi0gIGluc3RhbmNlIDogOCwKLSAgdHhfcG93ZXIgOiA4LAotfQotCi1wYWNrZXQgTGVNdWx0aUFkdnRQYXJhbUNvbXBsZXRlIDogTGVNdWx0aUFkdnRDb21wbGV0ZSAoc3ViX2NtZCA9IFNFVF9QQVJBTSkgewotfQotCi1wYWNrZXQgTGVNdWx0aUFkdnRTZXREYXRhIDogTGVNdWx0aUFkdnQgKHN1Yl9jbWQgPSBTRVRfREFUQSkgewotICBfc2l6ZV8oYWR2ZXJ0aXNpbmdfZGF0YSkgOiA4LAotICBhZHZlcnRpc2luZ19kYXRhIDogR2FwRGF0YVtdLAotICBfcGFkZGluZ19bMzFdLCAvLyBaZXJvIHBhZGRpbmcgdG8gMzEgYnl0ZXMgb2YgYWR2ZXJ0aXNpbmdfZGF0YQotICBhZHZlcnRpc2luZ19pbnN0YW5jZSA6IDgsCi19Ci0KLXBhY2tldCBMZU11bHRpQWR2dFNldERhdGFDb21wbGV0ZSA6IExlTXVsdGlBZHZ0Q29tcGxldGUgKHN1Yl9jbWQgPSBTRVRfREFUQSkgewotfQotCi1wYWNrZXQgTGVNdWx0aUFkdnRTZXRTY2FuUmVzcCA6IExlTXVsdGlBZHZ0IChzdWJfY21kID0gU0VUX1NDQU5fUkVTUCkgewotICBfc2l6ZV8oYWR2ZXJ0aXNpbmdfZGF0YSkgOiA4LAotICBhZHZlcnRpc2luZ19kYXRhIDogR2FwRGF0YVtdLAotICBfcGFkZGluZ19bMzFdLCAvLyBaZXJvIHBhZGRpbmcgdG8gMzEgYnl0ZXMgb2YgYWR2ZXJ0aXNpbmdfZGF0YQotICBhZHZlcnRpc2luZ19pbnN0YW5jZSA6IDgsCi19Ci0KLXBhY2tldCBMZU11bHRpQWR2dFNldFNjYW5SZXNwQ29tcGxldGUgOiBMZU11bHRpQWR2dENvbXBsZXRlIChzdWJfY21kID0gU0VUX1NDQU5fUkVTUCkgewotfQotCi1wYWNrZXQgTGVNdWx0aUFkdnRTZXRSYW5kb21BZGRyIDogTGVNdWx0aUFkdnQgKHN1Yl9jbWQgPSBTRVRfUkFORE9NX0FERFIpIHsKLSAgcmFuZG9tX2FkZHJlc3MgOiBBZGRyZXNzLAotICBhZHZlcnRpc2luZ19pbnN0YW5jZSA6IDgsCi19Ci0KLXBhY2tldCBMZU11bHRpQWR2dFNldFJhbmRvbUFkZHJDb21wbGV0ZSA6IExlTXVsdGlBZHZ0Q29tcGxldGUgKHN1Yl9jbWQgPSBTRVRfUkFORE9NX0FERFIpIHsKLX0KLQotcGFja2V0IExlTXVsdGlBZHZ0U2V0RW5hYmxlIDogTGVNdWx0aUFkdnQgKHN1Yl9jbWQgPSBTRVRfRU5BQkxFKSB7Ci0gIGFkdmVydGlzaW5nX2VuYWJsZSA6IEVuYWJsZSwgLy8gRGVmYXVsdCBESVNBQkxFRAotICBhZHZlcnRpc2luZ19pbnN0YW5jZSA6IDgsCi19Ci0KLXBhY2tldCBMZU11bHRpQWR2dFNldEVuYWJsZUNvbXBsZXRlIDogTGVNdWx0aUFkdnRDb21wbGV0ZSAoc3ViX2NtZCA9IFNFVF9FTkFCTEUpIHsKLX0KLQotZW51bSBCYXRjaFNjYW5PcGNvZGUgOiA4IHsKLSAgRU5BQkxFID0gMHgwMSwKLSAgU0VUX1NUT1JBR0VfUEFSQU1FVEVSUyA9IDB4MDIsCi0gIFNFVF9TQ0FOX1BBUkFNRVRFUlMgPSAweDAzLAotICBSRUFEX1JFU1VMVF9QQVJBTUVURVJTID0gMHgwNCwKLX0KLQotLy8gaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9ibHVldG9vdGgvaGNpX3JlcXVpcmVtZW50cyNiYXRjaGluZy1vZi1zY2FuLXJlc3VsdHMKLXBhY2tldCBMZUJhdGNoU2NhbiA6IExlU2Nhbm5pbmdDb21tYW5kIChvcF9jb2RlID0gTEVfQkFUQ0hfU0NBTikgewotICBiYXRjaF9zY2FuX29wY29kZSA6IEJhdGNoU2Nhbk9wY29kZSwKLSAgX2JvZHlfLAotfQotCi1wYWNrZXQgTGVCYXRjaFNjYW5Db21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfQkFUQ0hfU0NBTikgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJhdGNoX3NjYW5fb3Bjb2RlIDogQmF0Y2hTY2FuT3Bjb2RlLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBMZUJhdGNoU2NhbkVuYWJsZSA6IExlQmF0Y2hTY2FuIChiYXRjaF9zY2FuX29wY29kZSA9IEVOQUJMRSkgewotICBlbmFibGUgOiBFbmFibGUsCi19Ci0KLXBhY2tldCBMZUJhdGNoU2NhbkVuYWJsZUNvbXBsZXRlIDogTGVCYXRjaFNjYW5Db21wbGV0ZSAoYmF0Y2hfc2Nhbl9vcGNvZGUgPSBFTkFCTEUpIHsKLX0KLQotcGFja2V0IExlQmF0Y2hTY2FuU2V0U3RvcmFnZVBhcmFtZXRlcnMgOiBMZUJhdGNoU2NhbiAoYmF0Y2hfc2Nhbl9vcGNvZGUgPSBTRVRfU1RPUkFHRV9QQVJBTUVURVJTKSB7Ci0gIGJhdGNoX3NjYW5fZnVsbF9tYXhfcGVyY2VudGFnZSA6IDgsCi0gIGJhdGNoX3NjYW5fdHJ1bmNhdGVkX21heF9wZXJjZW50YWdlIDogOCwKLSAgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkX3BlcmNlbnRhZ2UgOiA4LAotfQotCi1wYWNrZXQgTGVCYXRjaFNjYW5TZXRTdG9yYWdlUGFyYW1ldGVyc0NvbXBsZXRlIDogTGVCYXRjaFNjYW5Db21wbGV0ZSAoYmF0Y2hfc2Nhbl9vcGNvZGUgPSBTRVRfU1RPUkFHRV9QQVJBTUVURVJTKSB7Ci19Ci0KLWVudW0gQmF0Y2hTY2FuRGlzY2FyZFJ1bGUgOiA4IHsKLSAgT0xERVNUID0gMHgwMCwKLSAgV0VBS0VTVF9SU1NJID0gMHgwMSwKLX0KLQotcGFja2V0IExlQmF0Y2hTY2FuU2V0U2NhblBhcmFtZXRlcnMgOiBMZUJhdGNoU2NhbiAoYmF0Y2hfc2Nhbl9vcGNvZGUgPSBTRVRfU0NBTl9QQVJBTUVURVJTKSB7Ci0gIHRydW5jYXRlZF9tb2RlX2VuYWJsZWQgOiAxLAotICBmdWxsX21vZGVfZW5hYmxlZCA6IDEsCi0gIF9yZXNlcnZlZF8gOiA2LAotICBkdXR5X2N5Y2xlX3NjYW5fd2luZG93X3Nsb3RzIDogMzIsCi0gIGR1dHlfY3ljbGVfc2Nhbl9pbnRlcnZhbF9zbG90cyA6IDMyLAotICBvd25fYWRkcmVzc190eXBlIDogQWR2ZXJ0aXNpbmdBZGRyZXNzVHlwZSwKLSAgYmF0Y2hfc2Nhbl9kaXNjYXJkX3J1bGUgOiBCYXRjaFNjYW5EaXNjYXJkUnVsZSwKLX0KLQotcGFja2V0IExlQmF0Y2hTY2FuU2V0U2NhblBhcmFtZXRlcnNDb21wbGV0ZSA6IExlQmF0Y2hTY2FuQ29tcGxldGUgKGJhdGNoX3NjYW5fb3Bjb2RlID0gU0VUX1NDQU5fUEFSQU1FVEVSUykgewotfQotCi1lbnVtIEJhdGNoU2NhbkRhdGFSZWFkIDogOCB7Ci0gIFRSVU5DQVRFRF9NT0RFX0RBVEEgPSAweDAxLAotICBGVUxMX01PREVfREFUQSA9IDB4MDIsCi19Ci0KLXBhY2tldCBMZUJhdGNoU2NhblJlYWRSZXN1bHRQYXJhbWV0ZXJzIDogTGVCYXRjaFNjYW4gKGJhdGNoX3NjYW5fb3Bjb2RlID0gUkVBRF9SRVNVTFRfUEFSQU1FVEVSUykgewotICBiYXRjaF9zY2FuX2RhdGFfcmVhZCA6IEJhdGNoU2NhbkRhdGFSZWFkLAotfQotCi1wYWNrZXQgTGVCYXRjaFNjYW5SZWFkUmVzdWx0UGFyYW1ldGVyc0NvbXBsZXRlUmF3IDogTGVCYXRjaFNjYW5Db21wbGV0ZSAoYmF0Y2hfc2Nhbl9vcGNvZGUgPSBSRUFEX1JFU1VMVF9QQVJBTUVURVJTKSB7Ci0gIGJhdGNoX3NjYW5fZGF0YV9yZWFkIDogQmF0Y2hTY2FuRGF0YVJlYWQsCi0gIG51bV9vZl9yZWNvcmRzIDogOCwKLSAgcmF3X2RhdGEgOiA4W10sCi19Ci0KLXBhY2tldCBMZUJhdGNoU2NhblJlYWRSZXN1bHRQYXJhbWV0ZXJzQ29tcGxldGUgOiBMZUJhdGNoU2NhbkNvbXBsZXRlIChiYXRjaF9zY2FuX29wY29kZSA9IFJFQURfUkVTVUxUX1BBUkFNRVRFUlMpIHsKLSAgYmF0Y2hfc2Nhbl9kYXRhX3JlYWQgOiBCYXRjaFNjYW5EYXRhUmVhZCwKLSAgX2JvZHlfLAotfQotCi1zdHJ1Y3QgVHJ1bmNhdGVkUmVzdWx0IHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGFkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICB0eF9wb3dlciA6IDgsCi0gIHJzc2kgOiA4LAotICB0aW1lc3RhbXAgOiAxNiwKLX0KLQotcGFja2V0IExlQmF0Y2hTY2FuUmVhZFRydW5jYXRlZFJlc3VsdFBhcmFtZXRlcnNDb21wbGV0ZSA6IExlQmF0Y2hTY2FuUmVhZFJlc3VsdFBhcmFtZXRlcnNDb21wbGV0ZSAoYmF0Y2hfc2Nhbl9kYXRhX3JlYWQgPSBUUlVOQ0FURURfTU9ERV9EQVRBKSB7Ci0gIF9jb3VudF8ocmVzdWx0cykgOiA4LAotICByZXN1bHRzIDogVHJ1bmNhdGVkUmVzdWx0W10sCi19Ci0KLXN0cnVjdCBGdWxsUmVzdWx0IHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGFkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICB0eF9wb3dlciA6IDgsCi0gIHJzc2kgOiA4LAotICB0aW1lc3RhbXAgOiAxNiwKLSAgX3NpemVfKGFkdl9wYWNrZXQpIDogOCwKLSAgYWR2X3BhY2tldCA6IDhbXSwKLSAgX3NpemVfKHNjYW5fcmVzcG9uc2UpIDogOCwKLSAgc2Nhbl9yZXNwb25zZSA6IDhbXSwKLX0KLQotcGFja2V0IExlQmF0Y2hTY2FuUmVhZEZ1bGxSZXN1bHRQYXJhbWV0ZXJzQ29tcGxldGUgOiBMZUJhdGNoU2NhblJlYWRSZXN1bHRQYXJhbWV0ZXJzQ29tcGxldGUgKGJhdGNoX3NjYW5fZGF0YV9yZWFkID0gRlVMTF9NT0RFX0RBVEEpIHsKLSAgX2NvdW50XyhyZXN1bHRzKSA6IDgsCi0gIHJlc3VsdHMgOiBGdWxsUmVzdWx0W10sCi19Ci0KLWVudW0gQXBjZk9wY29kZSA6IDggewotICBFTkFCTEUgPSAweDAwLAotICBTRVRfRklMVEVSSU5HX1BBUkFNRVRFUlMgPSAweDAxLAotICBCUk9BRENBU1RFUl9BRERSRVNTID0gMHgwMiwKLSAgU0VSVklDRV9VVUlEID0gMHgwMywKLSAgU0VSVklDRV9TT0xJQ0lUQVRJT05fVVVJRCA9IDB4MDQsCi0gIExPQ0FMX05BTUUgPSAweDA1LAotICBNQU5VRkFDVFVSRVJfREFUQSA9IDB4MDYsCi0gIFNFUlZJQ0VfREFUQSA9IDB4MDcsCi19Ci0KLS8vIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYmx1ZXRvb3RoL2hjaV9yZXF1aXJlbWVudHMjYWR2ZXJ0aXNpbmctcGFja2V0LWNvbnRlbnQtZmlsdGVyCi1wYWNrZXQgTGVBZHZGaWx0ZXIgOiBMZVNjYW5uaW5nQ29tbWFuZCAob3BfY29kZSA9IExFX0FEVl9GSUxURVIpIHsKLSAgYXBjZl9vcGNvZGUgOiBBcGNmT3Bjb2RlLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBMZUFkdkZpbHRlckNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9BRFZfRklMVEVSKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYXBjZl9vcGNvZGUgOiBBcGNmT3Bjb2RlLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBMZUFkdkZpbHRlckVuYWJsZSA6IExlQWR2RmlsdGVyIChhcGNmX29wY29kZSA9IEVOQUJMRSkgewotICBhcGNmX2VuYWJsZSA6IEVuYWJsZSwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyRW5hYmxlQ29tcGxldGUgOiBMZUFkdkZpbHRlckNvbXBsZXRlIChhcGNmX29wY29kZSA9IEVOQUJMRSkgewotICBhcGNmX2VuYWJsZSA6IEVuYWJsZSwKLX0KLQotZW51bSBBcGNmQWN0aW9uIDogOCB7Ci0gIEFERCA9IDB4MDAsCi0gIERFTEVURSA9IDB4MDEsCi0gIENMRUFSID0gMHgwMiwKLX0KLQotZW51bSBEZWxpdmVyeU1vZGUgOiA4IHsKLSAgSU1NRURJQVRFID0gMHgwMCwKLSAgT05GT1VORCA9IDB4MDEsCi0gIEJBVENIRUQgPSAweDAyLAotfQotCi0vLyBCaXQgbWFza3MgZm9yIHRoZSBzZWxlY3RlZCBmZWF0dXJlcwotZW51bSBBcGNmRmlsdGVyVHlwZSA6IDggewotICBCUk9BRENBU1RFUl9BRERSRVNTID0gMHgwMCwKLSAgU0VSVklDRV9EQVRBX0NIQU5HRSA9IDB4MDEsCi0gIFNFUlZJQ0VfVVVJRCA9IDB4MDIsCi0gIFNFUlZJQ0VfU09MSUNJVEFUSU9OX1VVSUQgPSAweDAzLAotICBMT0NBTF9OQU1FID0gMHgwNCwKLSAgTUFOVUZBQ1RVUkVSX0RBVEEgPSAweDA1LAotICBTRVJWSUNFX0RBVEEgPSAweDA2LAotfQotCi1wYWNrZXQgTGVBZHZGaWx0ZXJTZXRGaWx0ZXJpbmdQYXJhbWV0ZXJzIDogTGVBZHZGaWx0ZXIgKGFwY2Zfb3Bjb2RlID0gU0VUX0ZJTFRFUklOR19QQVJBTUVURVJTKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgX2JvZHlfLAotfQotCi1wYWNrZXQgTGVBZHZGaWx0ZXJBZGRGaWx0ZXJpbmdQYXJhbWV0ZXJzIDogTGVBZHZGaWx0ZXJTZXRGaWx0ZXJpbmdQYXJhbWV0ZXJzIChhcGNmX2FjdGlvbiA9IEFERCkgewotICBhcGNmX2ZpbHRlcl9pbmRleCA6IDgsCi0gIGFwY2ZfZmVhdHVyZV9zZWxlY3Rpb24gOiAxNiwKLSAgYXBjZl9saXN0X2xvZ2ljX3R5cGUgOiAxNiwKLSAgYXBjZl9maWx0ZXJfbG9naWNfdHlwZSA6IDgsCi0gIHJzc2lfaGlnaF90aHJlc2ggOiA4LAotICBkZWxpdmVyeV9tb2RlIDogRGVsaXZlcnlNb2RlLAotICBvbmZvdW5kX3RpbWVvdXQgOiAxNiwKLSAgb25mb3VuZF90aW1lb3V0X2NudCA6IDgsCi0gIHJzc2lfbG93X3RocmVzaCA6IDgsCi0gIG9ubG9zdF90aW1lb3V0IDogMTYsCi0gIG51bV9vZl90cmFja2luZ19lbnRyaWVzIDogMTYsCi19Ci0KLXBhY2tldCBMZUFkdkZpbHRlckRlbGV0ZUZpbHRlcmluZ1BhcmFtZXRlcnMgOiBMZUFkdkZpbHRlclNldEZpbHRlcmluZ1BhcmFtZXRlcnMgKGFwY2ZfYWN0aW9uID0gREVMRVRFKSB7Ci0gIGFwY2ZfZmlsdGVyX2luZGV4IDogOCwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyQ2xlYXJGaWx0ZXJpbmdQYXJhbWV0ZXJzIDogTGVBZHZGaWx0ZXJTZXRGaWx0ZXJpbmdQYXJhbWV0ZXJzIChhcGNmX2FjdGlvbiA9IENMRUFSKSB7Ci19Ci0KLXBhY2tldCBMZUFkdkZpbHRlclNldEZpbHRlcmluZ1BhcmFtZXRlcnNDb21wbGV0ZSA6IExlQWR2RmlsdGVyQ29tcGxldGUgKGFwY2Zfb3Bjb2RlID0gU0VUX0ZJTFRFUklOR19QQVJBTUVURVJTKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9hdmFpbGFibGVfc3BhY2VzIDogOCwKLX0KLQotZW51bSBBcGNmQXBwbGljYXRpb25BZGRyZXNzVHlwZSA6IDggewotICBQVUJMSUMgPSAweDAwLAotICBSQU5ET00gPSAweDAxLAotICBOT1RfQVBQTElDQUJMRSA9IDB4MDIsCi19Ci0KLXBhY2tldCBMZUFkdkZpbHRlckJyb2FkY2FzdGVyQWRkcmVzcyA6IExlQWR2RmlsdGVyIChhcGNmX29wY29kZSA9IEJST0FEQ0FTVEVSX0FERFJFU1MpIHsKLSAgYXBjZl9hY3Rpb24gOiBBcGNmQWN0aW9uLAotICBhcGNmX2ZpbHRlcl9pbmRleCA6IDgsCi0gIGFwY2ZfYnJvYWRjYXN0ZXJfYWRkcmVzcyA6IEFkZHJlc3MsCi0gIGFwY2ZfYXBwbGljYXRpb25fYWRkcmVzc190eXBlIDogQXBjZkFwcGxpY2F0aW9uQWRkcmVzc1R5cGUsCi19Ci0KLXBhY2tldCBMZUFkdkZpbHRlckNsZWFyQnJvYWRjYXN0ZXJBZGRyZXNzIDogTGVBZHZGaWx0ZXIgKGFwY2Zfb3Bjb2RlID0gQlJPQURDQVNURVJfQUREUkVTUykgewotICBfZml4ZWRfID0gMHgwMiA6IDgsCi0gIGFwY2ZfZmlsdGVyX2luZGV4IDogOCwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyQnJvYWRjYXN0ZXJBZGRyZXNzQ29tcGxldGUgOiBMZUFkdkZpbHRlckNvbXBsZXRlIChhcGNmX29wY29kZSA9IEJST0FEQ0FTVEVSX0FERFJFU1MpIHsKLSAgYXBjZl9hY3Rpb24gOiBBcGNmQWN0aW9uLAotICBhcGNmX2F2YWlsYWJsZV9zcGFjZXMgOiA4LAotfQotCi0KLXBhY2tldCBMZUFkdkZpbHRlclNlcnZpY2VVdWlkIDogTGVBZHZGaWx0ZXIgKGFwY2Zfb3Bjb2RlID0gU0VSVklDRV9VVUlEKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9maWx0ZXJfaW5kZXggOiA4LAotICBhY3BmX3V1aWRfZGF0YSA6IDhbXSwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyU2VydmljZVV1aWRDb21wbGV0ZSA6IExlQWR2RmlsdGVyQ29tcGxldGUgKGFwY2Zfb3Bjb2RlID0gU0VSVklDRV9VVUlEKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9hdmFpbGFibGVfc3BhY2VzIDogOCwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyU29saWNpdGF0aW9uVXVpZCA6IExlQWR2RmlsdGVyIChhcGNmX29wY29kZSA9IFNFUlZJQ0VfU09MSUNJVEFUSU9OX1VVSUQpIHsKLSAgYXBjZl9hY3Rpb24gOiBBcGNmQWN0aW9uLAotICBhcGNmX2ZpbHRlcl9pbmRleCA6IDgsCi0gIGFjcGZfdXVpZF9kYXRhIDogOFtdLAotfQotCi1wYWNrZXQgTGVBZHZGaWx0ZXJTb2xpY2l0YXRpb25VdWlkQ29tcGxldGUgOiBMZUFkdkZpbHRlckNvbXBsZXRlIChhcGNmX29wY29kZSA9IFNFUlZJQ0VfU09MSUNJVEFUSU9OX1VVSUQpIHsKLSAgYXBjZl9hY3Rpb24gOiBBcGNmQWN0aW9uLAotICBhcGNmX2F2YWlsYWJsZV9zcGFjZXMgOiA4LAotfQotCi1wYWNrZXQgTGVBZHZGaWx0ZXJMb2NhbE5hbWUgOiBMZUFkdkZpbHRlciAoYXBjZl9vcGNvZGUgPSBMT0NBTF9OQU1FKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9maWx0ZXJfaW5kZXggOiA4LAotICBhcGNmX2xvY2FsX25hbWUgOiA4W10sCi19Ci0KLXBhY2tldCBMZUFkdkZpbHRlckxvY2FsTmFtZUNvbXBsZXRlIDogTGVBZHZGaWx0ZXJDb21wbGV0ZSAoYXBjZl9vcGNvZGUgPSBMT0NBTF9OQU1FKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9hdmFpbGFibGVfc3BhY2VzIDogOCwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyTWFudWZhY3R1cmVyRGF0YSA6IExlQWR2RmlsdGVyIChhcGNmX29wY29kZSA9IE1BTlVGQUNUVVJFUl9EQVRBKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9maWx0ZXJfaW5kZXggOiA4LAotICBhcGNmX21hbnVmYWN0dXJlcl9kYXRhIDogOFtdLAotfQotCi1wYWNrZXQgTGVBZHZGaWx0ZXJNYW51ZmFjdHVyZXJEYXRhQ29tcGxldGUgOiBMZUFkdkZpbHRlckNvbXBsZXRlIChhcGNmX29wY29kZSA9IE1BTlVGQUNUVVJFUl9EQVRBKSB7Ci0gIGFwY2ZfYWN0aW9uIDogQXBjZkFjdGlvbiwKLSAgYXBjZl9hdmFpbGFibGVfc3BhY2VzIDogOCwKLX0KLQotcGFja2V0IExlQWR2RmlsdGVyU2VydmljZURhdGEgOiBMZUFkdkZpbHRlciAoYXBjZl9vcGNvZGUgPSBTRVJWSUNFX0RBVEEpIHsKLSAgYXBjZl9hY3Rpb24gOiBBcGNmQWN0aW9uLAotICBhcGNmX2ZpbHRlcl9pbmRleCA6IDgsCi0gIGFwY2Zfc2VydmljZV9kYXRhIDogOFtdLAotfQotCi1wYWNrZXQgTGVBZHZGaWx0ZXJTZXJ2aWNlRGF0YUNvbXBsZXRlIDogTGVBZHZGaWx0ZXJDb21wbGV0ZSAoYXBjZl9vcGNvZGUgPSBTRVJWSUNFX0RBVEEpIHsKLSAgYXBjZl9hY3Rpb24gOiBBcGNmQWN0aW9uLAotICBhcGNmX2F2YWlsYWJsZV9zcGFjZXMgOiA4LAotfQotCi1wYWNrZXQgTGVFbmVyZ3lJbmZvIDogVmVuZG9yQ29tbWFuZCAob3BfY29kZSA9IExFX0VORVJHWV9JTkZPKSB7Ci19Ci0KLXBhY2tldCBMZUVuZXJneUluZm9Db21wbGV0ZSA6IENvbW1hbmRDb21wbGV0ZSAoY29tbWFuZF9vcF9jb2RlID0gTEVfRU5FUkdZX0lORk8pIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICB0b3RhbF90eF90aW1lX21zIDogMzIsCi0gIHRvdGFsX3J4X3RpbWVfbXMgOiAzMiwKLSAgdG90YWxfaWRsZV90aW1lX21zIDogMzIsCi0gIHRvdGFsX2VuZXJneV91c2VkX21hX3ZfbXMgOiAzMiwKLX0KLQotcGFja2V0IExlRXh0ZW5kZWRTY2FuUGFyYW1zIDogTGVTY2FubmluZ0NvbW1hbmQgKG9wX2NvZGUgPSBMRV9FWFRFTkRFRF9TQ0FOX1BBUkFNUykgewotICBsZV9zY2FuX3R5cGUgOiBMZVNjYW5UeXBlLAotICBsZV9zY2FuX2ludGVydmFsIDogMzIsIC8vIDB4MDAwNC0weDQwMDAgRGVmYXVsdCAweDEwICgxMG1zKQotICBsZV9zY2FuX3dpbmRvdyA6IDMyLCAvLyBEZWZhdWx0IDB4MTAgKDEwbXMpCi0gIG93bl9hZGRyZXNzX3R5cGUgOiBPd25BZGRyZXNzVHlwZSwKLSAgc2Nhbm5pbmdfZmlsdGVyX3BvbGljeSA6IExlU2Nhbm5pbmdGaWx0ZXJQb2xpY3ksCi19Ci0KLXBhY2tldCBMZUV4dGVuZGVkU2NhblBhcmFtc0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBMRV9FWFRFTkRFRF9TQ0FOX1BBUkFNUykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBDb250cm9sbGVyRGVidWdJbmZvIDogVmVuZG9yQ29tbWFuZCAob3BfY29kZSA9IENPTlRST0xMRVJfREVCVUdfSU5GTykgewotfQotCi1wYWNrZXQgQ29udHJvbGxlckRlYnVnSW5mb0NvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBDT05UUk9MTEVSX0RFQlVHX0lORk8pIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgQ29udHJvbGxlckEyRFBPcGNvZGUgOiBWZW5kb3JDb21tYW5kIChvcF9jb2RlID0gQ09OVFJPTExFUl9BMkRQX09QQ09ERSkgewotICBfcGF5bG9hZF8sICAvLyBwbGFjZWhvbGRlciAodW5pbXBsZW1lbnRlZCkKLX0KLQotcGFja2V0IENvbnRyb2xsZXJBMkRQT3Bjb2RlQ29tcGxldGUgOiBDb21tYW5kQ29tcGxldGUgKGNvbW1hbmRfb3BfY29kZSA9IENPTlRST0xMRVJfQTJEUF9PUENPREUpIHsKLSAgX3BheWxvYWRfLCAgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLWVudW0gQnFyUmVwb3J0QWN0aW9uIDogOCB7Ci0gIEFERCA9IDB4MDAsCi0gIERFTEVURSA9IDB4MDEsCi0gIENMRUFSID0gMHgwMiwKLX0KLQotcGFja2V0IENvbnRyb2xsZXJCcXIgOiBWZW5kb3JDb21tYW5kKG9wX2NvZGUgPSBDT05UUk9MTEVSX0JRUikgewotICBicXJfcmVwb3J0X2FjdGlvbiA6IEJxclJlcG9ydEFjdGlvbiwKLSAgYnFyX3F1YWxpdHlfZXZlbnRfbWFzayA6IDMyLAotICBicXJfbWluaW11bV9yZXBvcnRfaW50ZXJ2YWwgOiAxNiwKLX0KLQotdGVzdCBDb250cm9sbGVyQnFyIHsKLSAgIlx4NWVceGZkXHgwN1x4MDBceDFmXHgwMFx4MDdceDAwXHg4OFx4MTMiLAotfQotCi1wYWNrZXQgQ29udHJvbGxlckJxckNvbXBsZXRlIDogQ29tbWFuZENvbXBsZXRlIChjb21tYW5kX29wX2NvZGUgPSBDT05UUk9MTEVSX0JRUikgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGN1cnJlbnRfcXVhbGl0eV9ldmVudF9tYXNrIDogMzIKLX0KLQotdGVzdCBDb250cm9sbGVyQnFyQ29tcGxldGUgewotICAiXHgwZVx4MDhceDAxXHg1ZVx4ZmRceDAwXHgxZlx4MDBceDA3XHgwMCIsCi19Ci0KLS8vIEhDSSBFdmVudCBQYWNrZXRzCi0KLXBhY2tldCBJbnF1aXJ5Q29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IElOUVVJUllfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotfQotCi1zdHJ1Y3QgSW5xdWlyeVJlc3VsdCB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlIDogUGFnZVNjYW5SZXBldGl0aW9uTW9kZSwKLSAgX3Jlc2VydmVkXyA6IDgsCi0gIF9yZXNlcnZlZF8gOiA4LAotICBjbGFzc19vZl9kZXZpY2UgOiBDbGFzc09mRGV2aWNlLAotICBjbG9ja19vZmZzZXQgOiAxNSwKLSAgX3Jlc2VydmVkXyA6IDEsCi19Ci0KLXBhY2tldCBJbnF1aXJ5UmVzdWx0IDogRXZlbnQgKGV2ZW50X2NvZGUgPSBJTlFVSVJZX1JFU1VMVCkgewotICBfY291bnRfKGlucXVpcnlfcmVzdWx0cykgOiA4LAotICBpbnF1aXJ5X3Jlc3VsdHMgOiBJbnF1aXJ5UmVzdWx0W10sCi19Ci0KLWVudW0gTGlua1R5cGUgOiA4IHsKLSAgU0NPID0gMHgwMCwKLSAgQUNMID0gMHgwMSwKLX0KLQotcGFja2V0IENvbm5lY3Rpb25Db21wbGV0ZSA6IEV2ZW50IChldmVudF9jb2RlID0gQ09OTkVDVElPTl9DT01QTEVURSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgbGlua190eXBlIDogTGlua1R5cGUsCi0gIGVuY3J5cHRpb25fZW5hYmxlZCA6IEVuYWJsZSwKLX0KLQotZW51bSBDb25uZWN0aW9uUmVxdWVzdExpbmtUeXBlIDogOCB7Ci0gIFVOS05PV04gPSAweEZGLAotICBTQ08gPSAweDAwLAotICBBQ0wgPSAweDAxLAotICBFU0NPID0gMHgwMiwKLX0KLQotcGFja2V0IENvbm5lY3Rpb25SZXF1ZXN0IDogRXZlbnQgKGV2ZW50X2NvZGUgPSBDT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGNsYXNzX29mX2RldmljZSA6IENsYXNzT2ZEZXZpY2UsCi0gIGxpbmtfdHlwZSA6IENvbm5lY3Rpb25SZXF1ZXN0TGlua1R5cGUsCi19Ci0KLXBhY2tldCBEaXNjb25uZWN0aW9uQ29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IERJU0NPTk5FQ1RJT05fQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcmVhc29uIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgQXV0aGVudGljYXRpb25Db21wbGV0ZSA6IEV2ZW50IChldmVudF9jb2RlID0gQVVUSEVOVElDQVRJT05fQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFJlbW90ZU5hbWVSZXF1ZXN0Q29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IFJFTU9URV9OQU1FX1JFUVVFU1RfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgcmVtb3RlX25hbWUgOiA4WzI0OF0sIC8vIFVURi04IGVuY29kZWQgdXNlci1mcmllbmRseSBkZXNjcmlwdGl2ZSBuYW1lCi19Ci0KLWVudW0gRW5jcnlwdGlvbkVuYWJsZWQgOiA4IHsKLSAgT0ZGID0gMHgwMCwKLSAgT04gPSAweDAxLCAvLyBFMCBmb3IgQlIvRURSIGFuZCBBRVMtQ0NNIGZvciBMRQotICBCUl9FRFJfQUVTX0NDTSA9IDB4MDIsCi19Ci0KLXBhY2tldCBFbmNyeXB0aW9uQ2hhbmdlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBFTkNSWVBUSU9OX0NIQU5HRSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBlbmNyeXB0aW9uX2VuYWJsZWQgOiBFbmNyeXB0aW9uRW5hYmxlZCwKLX0KLQotcGFja2V0IENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IENIQU5HRV9DT05ORUNUSU9OX0xJTktfS0VZX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBDZW50cmFsTGlua0tleUNvbXBsZXRlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBDRU5UUkFMX0xJTktfS0VZX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGtleV9mbGFnIDogS2V5RmxhZywKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVNfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgbG1wX2ZlYXR1cmVzIDogNjQsCi19Ci0KLXBhY2tldCBSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IFJFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT05fQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgdmVyc2lvbiA6IDgsCi0gIG1hbnVmYWN0dXJlcl9uYW1lIDogMTYsCi0gIHN1Yl92ZXJzaW9uIDogMTYsCi19Ci0KLXBhY2tldCBRb3NTZXR1cENvbXBsZXRlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBRT1NfU0VUVVBfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgX3Jlc2VydmVkXyA6IDgsCi0gIHNlcnZpY2VfdHlwZSA6IFNlcnZpY2VUeXBlLAotICB0b2tlbl9yYXRlIDogMzIsIC8vIE9jdGV0cy9zCi0gIHBlYWtfYmFuZHdpZHRoIDogMzIsIC8vIE9jdGV0cy9zCi0gIGxhdGVuY3kgOiAzMiwgLy8gT2N0ZXRzL3MKLSAgZGVsYXlfdmFyaWF0aW9uIDogMzIsIC8vIG1pY3Jvc2Vjb25kcwotfQotCi0vLyBDb21tYW5kIENvbXBsZXRlIGFuZCBDb21tYW5kIFN0YXR1cyBFdmVudHMgYXJlIGltcGxlbWVudGVkIGFib3ZlIENvbW1hbmRzLgotCi1wYWNrZXQgSGFyZHdhcmVFcnJvciA6IEV2ZW50IChldmVudF9jb2RlID0gSEFSRFdBUkVfRVJST1IpIHsKLSAgaGFyZHdhcmVfY29kZSA6IDgsCi19Ci0KLXBhY2tldCBGbHVzaE9jY3VycmVkIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBGTFVTSF9PQ0NVUlJFRCkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFJvbGVDaGFuZ2UgOiBFdmVudCAoZXZlbnRfY29kZSA9IFJPTEVfQ0hBTkdFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIG5ld19yb2xlIDogUm9sZSwKLX0KLQotcGFja2V0IE51bWJlck9mQ29tcGxldGVkUGFja2V0cyA6IEV2ZW50IChldmVudF9jb2RlID0gTlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTKSB7Ci0gIF9jb3VudF8oY29tcGxldGVkX3BhY2tldHMpIDogOCwKLSAgY29tcGxldGVkX3BhY2tldHMgOiBDb21wbGV0ZWRQYWNrZXRzW10sCi19Ci0KLWVudW0gTW9kZSA6IDggewotICBBQ1RJVkUgPSAweDAwLAotICBIT0xEID0gMHgwMSwKLSAgU05JRkYgPSAweDAyLAotfQotCi1wYWNrZXQgTW9kZUNoYW5nZSA6IEV2ZW50IChldmVudF9jb2RlID0gTU9ERV9DSEFOR0UpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgY3VycmVudF9tb2RlIDogTW9kZSwKLSAgaW50ZXJ2YWwgOiAxNiwgLy8gMHgwMDIgLSAweEZGRkUgKDEuMjVtcyAtIDQwLjlzKQotfQotCi1zdHJ1Y3QgWmVyb0tleUFuZEFkZHJlc3MgewotICBhZGRyZXNzIDogQWRkcmVzcywKLSAgX2ZpeGVkXyA9IDAgOiA2NCwKLSAgX2ZpeGVkXyA9IDAgOiA2NCwKLX0KLQotcGFja2V0IFJldHVybkxpbmtLZXlzIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBSRVRVUk5fTElOS19LRVlTKSB7Ci0gIF9jb3VudF8oa2V5cykgOiA4LAotICBrZXlzIDogWmVyb0tleUFuZEFkZHJlc3NbXSwKLX0KLQotcGFja2V0IFBpbkNvZGVSZXF1ZXN0IDogRXZlbnQgKGV2ZW50X2NvZGUgPSBQSU5fQ09ERV9SRVFVRVNUKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgTGlua0tleVJlcXVlc3QgOiBFdmVudCAoZXZlbnRfY29kZSA9IExJTktfS0VZX1JFUVVFU1QpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLWVudW0gS2V5VHlwZSA6IDggewotICBDT01CSU5BVElPTiA9IDB4MDAsCi0gIERFQlVHX0NPTUJJTkFUSU9OID0gMHgwMywKLSAgVU5BVVRIRU5USUNBVEVEX1AxOTIgPSAweDA0LAotICBBVVRIRU5USUNBVEVEX1AxOTIgPSAweDA1LAotICBDSEFOR0VEID0gMHgwNiwKLSAgVU5BVVRIRU5USUNBVEVEX1AyNTYgPSAweDA3LAotICBBVVRIRU5USUNBVEVEX1AyNTYgPSAweDA4LAotfQotCi1wYWNrZXQgTGlua0tleU5vdGlmaWNhdGlvbiA6IEV2ZW50IChldmVudF9jb2RlID0gTElOS19LRVlfTk9USUZJQ0FUSU9OKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICBsaW5rX2tleSA6IDhbMTZdLAotICBrZXlfdHlwZSA6IEtleVR5cGUsCi19Ci0KLXBhY2tldCBMb29wYmFja0NvbW1hbmQgOiBFdmVudCAoZXZlbnRfY29kZSA9IExPT1BCQUNLX0NPTU1BTkQpIHsKLSAgX3BheWxvYWRfLCAvLyBDb21tYW5kIHBhY2tldCwgdHJ1bmNhdGVkIGlmIGl0IHdhcyBsb25nZXIgdGhhbiAyNTIgYnl0ZXMKLX0KLQotcGFja2V0IERhdGFCdWZmZXJPdmVyZmxvdyA6IEV2ZW50IChldmVudF9jb2RlID0gREFUQV9CVUZGRVJfT1ZFUkZMT1cpIHsKLSAgbGlua190eXBlIDogTGlua1R5cGUsCi19Ci0KLXBhY2tldCBNYXhTbG90c0NoYW5nZSA6IEV2ZW50IChldmVudF9jb2RlID0gTUFYX1NMT1RTX0NIQU5HRSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgbG1wX21heF9zbG90cyA6IDgsCi19Ci0KLXBhY2tldCBSZWFkQ2xvY2tPZmZzZXRDb21wbGV0ZSA6IEV2ZW50IChldmVudF9jb2RlID0gUkVBRF9DTE9DS19PRkZTRVRfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgY2xvY2tfb2Zmc2V0IDogMTUsCi0gIF9yZXNlcnZlZF8gOiAxLAotfQotCi1wYWNrZXQgQ29ubmVjdGlvblBhY2tldFR5cGVDaGFuZ2VkIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBDT05ORUNUSU9OX1BBQ0tFVF9UWVBFX0NIQU5HRUQpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGFja2V0X3R5cGUgOiAxNiwKLX0KLQotcGFja2V0IFFvc1Zpb2xhdGlvbiA6IEV2ZW50IChldmVudF9jb2RlID0gUU9TX1ZJT0xBVElPTikgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGVDaGFuZ2UgOiBFdmVudCAoZXZlbnRfY29kZSA9IFBBR0VfU0NBTl9SRVBFVElUSU9OX01PREVfQ0hBTkdFKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlIDogUGFnZVNjYW5SZXBldGl0aW9uTW9kZSwKLX0KLQotcGFja2V0IEZsb3dTcGVjaWZpY2F0aW9uQ29tcGxldGUgOiBFdmVudCAoZXZlbnRfY29kZSA9IEZMT1dfU1BFQ0lGSUNBVElPTl9DT01QTEVURSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBfcmVzZXJ2ZWRfIDogOCwKLSAgZmxvd19kaXJlY3Rpb24gOiBGbG93RGlyZWN0aW9uLAotICBzZXJ2aWNlX3R5cGUgOiBTZXJ2aWNlVHlwZSwKLSAgdG9rZW5fcmF0ZSA6IDMyLCAvLyBPY3RldHMvcwotICB0b2tlbl9idWNrZXRfc2l6ZSA6IDMyLAotICBwZWFrX2JhbmR3aWR0aCA6IDMyLCAvLyBPY3RldHMvcwotICBhY2Nlc3NfbGF0ZW5jeSA6IDMyLCAvLyBPY3RldHMvcwotfQotCi1zdHJ1Y3QgSW5xdWlyeVJlc3VsdFdpdGhSc3NpIHsKLSAgYWRkcmVzcyA6IEFkZHJlc3MsCi0gIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUgOiBQYWdlU2NhblJlcGV0aXRpb25Nb2RlLAotICBfcmVzZXJ2ZWRfIDogOCwKLSAgY2xhc3Nfb2ZfZGV2aWNlIDogQ2xhc3NPZkRldmljZSwKLSAgY2xvY2tfb2Zmc2V0IDogMTUsCi0gIF9yZXNlcnZlZF8gOiAxLAotICByc3NpIDogOCwKLX0KLQotcGFja2V0IElucXVpcnlSZXN1bHRXaXRoUnNzaSA6IEV2ZW50IChldmVudF9jb2RlID0gSU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJKSB7Ci0gIF9jb3VudF8oaW5xdWlyeV9yZXN1bHRzKSA6IDgsCi0gIGlucXVpcnlfcmVzdWx0cyA6IElucXVpcnlSZXN1bHRXaXRoUnNzaVtdLAotfQotCi1wYWNrZXQgUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZSA6IEV2ZW50IChldmVudF9jb2RlID0gUkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVNfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGFnZV9udW1iZXIgOiA4LAotICBtYXhpbXVtX3BhZ2VfbnVtYmVyIDogOCwKLSAgZXh0ZW5kZWRfbG1wX2ZlYXR1cmVzIDogNjQsCi19Ci0KLWVudW0gU2NvTGlua1R5cGUgOiA4IHsKLSAgU0NPID0gMHgwMCwKLSAgRVNDTyA9IDB4MDIsCi19Ci0KLWVudW0gU2NvQWlyTW9kZSA6IDggewotICBVTEFXX0xPRyA9IDB4MDAsCi0gIEFMQVdfTE9HID0gMHgwMSwKLSAgQ1ZTRCA9IDB4MDIsCi0gIFRSQU5TUEFSRU5UID0gMHgwMywKLX0KLQotcGFja2V0IFN5bmNocm9ub3VzQ29ubmVjdGlvbkNvbXBsZXRlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBTWU5DSFJPTk9VU19DT05ORUNUSU9OX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgIF9yZXNlcnZlZF8gOiA0LAotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgbGlua190eXBlIDogU2NvTGlua1R5cGUsCi0gIC8vIFRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZVNDTyBpbnN0YW50cyBtZWFzdXJlZCBpbiBzbG90cy4KLSAgLy8gZVNDTyBvbmx5LCBTaGFsbCBiZSB6ZXJvIGZvciBTQ08gbGlua3MuCi0gIHRyYW5zbWlzc2lvbl9pbnRlcnZhbF9zbG90cyA6IDgsCi0gIC8vIFRoZSBzaXplIG9mIHRoZSByZXRyYW5zbWlzc2lvbiB3aW5kb3cgbWVhc3VyZWQgaW4gc2xvdHMuCi0gIC8vIGVTQ08gb25seS4gU2hhbGwgYmUgemVybyBmb3IgU0NPIGxpbmtzLgotICByZXRyYW5zbWlzc2lvbl93aW5kb3dfc2xvdHMgOiA4LAotICAvLyBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVTQ08gcGF5bG9hZCBpbiB0aGUgcmVjZWl2ZSBkaXJlY3Rpb24uCi0gIC8vIGVTQ08gb25seS4gU2hhbGwgYmUgemVybyBmb3IgU0NPIGxpbmtzLgotICByeF9wYWNrZXRfbGVuZ3RoIDogMTYsCi0gIC8vIExlbmd0aCBpbiBieXRlcyBvZiB0aGUgZVNDTyBwYXlsb2FkIGluIHRoZSB0cmFuc21pdCBkaXJlY3Rpb24uCi0gIC8vIGVTQ08gb25seS4gU2hhbGwgYmUgemVybyBmb3IgU0NPIGxpbmtzLgotICB0eF9wYWNrZXRfbGVuZ3RoIDogMTYsCi0gIGFpcl9tb2RlIDogU2NvQWlyTW9kZSwKLX0KLQotcGFja2V0IFN5bmNocm9ub3VzQ29ubmVjdGlvbkNoYW5nZWQgOiBFdmVudCAoZXZlbnRfY29kZSA9IFNZTkNIUk9OT1VTX0NPTk5FQ1RJT05fQ0hBTkdFRCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gICBfcmVzZXJ2ZWRfIDogNCwKLSAgLy8gVGltZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBlU0NPIGluc3RhbnRzIG1lYXN1cmVkIGluIHNsb3RzLgotICAvLyBlU0NPIG9ubHksIFNoYWxsIGJlIHplcm8gZm9yIFNDTyBsaW5rcy4KLSAgdHJhbnNtaXNzaW9uX2ludGVydmFsX3Nsb3RzIDogOCwKLSAgLy8gVGltZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBTQ08vZVNDTyBpbnN0YW50cyBtZWFzdXJlZCBpbiBzbG90cy4KLSAgcmV0cmFuc21pc3Npb25fd2luZG93X3Nsb3RzIDogOCwKLSAgLy8gTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBTQ08vZVNDTyBwYXlsb2FkIGluIHRoZSByZWNlaXZlIGRpcmVjdGlvbi4KLSAgcnhfcGFja2V0X2xlbmd0aCA6IDE2LAotICAvLyBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIFNDTy9lU0NPIHBheWxvYWQgaW4gdGhlIHRyYW5zbWl0IGRpcmVjdGlvbi4KLSAgdHhfcGFja2V0X2xlbmd0aCA6IDE2LAotfQotCi1wYWNrZXQgU25pZmZTdWJyYXRpbmdFdmVudCA6IEV2ZW50IChldmVudF9jb2RlID0gU05JRkZfU1VCUkFUSU5HKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSA6IDE2LCAvLyAweDAwMCAtIDB4RkZGRSAoMHMgLSA0MC45cykKLSAgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3kgOiAxNiwgLy8gMHgwMDAgLSAweEZGRkUgKDBzIC0gNDAuOXMpCi0gIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQgOiAxNiwgLy8gMHgwMDAgLSAweEZGRkUgKDBzIC0gNDAuOXMpCi0gIG1pbmltdW1fbG9jYWxfdGltZW91dCA6IDE2LCAvLyAweDAwMCAtIDB4RkZGRSAoMHMgLSA0MC45cykKLX0KLQotcGFja2V0IEV4dGVuZGVkSW5xdWlyeVJlc3VsdCA6IEV2ZW50IChldmVudF9jb2RlID0gRVhURU5ERURfSU5RVUlSWV9SRVNVTFQpIHsKLSAgX2ZpeGVkXyA9IDB4MDEgOiA4LAotICBhZGRyZXNzIDogQWRkcmVzcywKLSAgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSA6IFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUsCi0gIF9yZXNlcnZlZF8gOiA4LAotICBjbGFzc19vZl9kZXZpY2UgOiBDbGFzc09mRGV2aWNlLAotICBjbG9ja19vZmZzZXQgOiAxNSwKLSAgX3Jlc2VydmVkXyA6IDEsCi0gIHJzc2kgOiA4LAotICBleHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlIDogR2FwRGF0YVtdLAotICAvLyBFeHRlbmRlZCBpbnF1aXJ5IFJlc3VsdCBpcyBhbHdheXMgMjU1IGJ5dGVzIGxvbmcKLSAgLy8gcGFkZGVkIEdhcERhdGEgd2l0aCB6ZXJvZXMgYXMgbmVjZXNzYXJ5Ci0gIC8vIFJlZmVyIHRvIEJMVUVUT09USCBDT1JFIFNQRUNJRklDQVRJT04gVmVyc2lvbiA1LjIgfCBWb2wgMywgUGFydCBDIFNlY3Rpb24gOCBvbiBwYWdlIDEzNDAKLSAgX3BhZGRpbmdfWzI0MF0sCi19Ci0KLXBhY2tldCBFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBFTkNSWVBUSU9OX0tFWV9SRUZSRVNIX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBJb0NhcGFiaWxpdHlSZXF1ZXN0IDogRXZlbnQgKGV2ZW50X2NvZGUgPSBJT19DQVBBQklMSVRZX1JFUVVFU1QpIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi19Ci0KLXBhY2tldCBJb0NhcGFiaWxpdHlSZXNwb25zZSA6IEV2ZW50IChldmVudF9jb2RlID0gSU9fQ0FQQUJJTElUWV9SRVNQT05TRSkgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgaW9fY2FwYWJpbGl0eSA6IElvQ2FwYWJpbGl0eSwKLSAgb29iX2RhdGFfcHJlc2VudCA6IE9vYkRhdGFQcmVzZW50LAotICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMgOiBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cywKLX0KLQotcGFja2V0IFVzZXJDb25maXJtYXRpb25SZXF1ZXN0IDogRXZlbnQgKGV2ZW50X2NvZGUgPSBVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotICBudW1lcmljX3ZhbHVlIDogMjAsIC8vIDB4MDAwMDAtMHhGNDIzRiAoMDAwMDAwIC0gOTk5OTk5KQotICBfcmVzZXJ2ZWRfIDogMTIsCi19Ci0KLXBhY2tldCBVc2VyUGFzc2tleVJlcXVlc3QgOiBFdmVudCAoZXZlbnRfY29kZSA9IFVTRVJfUEFTU0tFWV9SRVFVRVNUKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgUmVtb3RlT29iRGF0YVJlcXVlc3QgOiBFdmVudCAoZXZlbnRfY29kZSA9IFJFTU9URV9PT0JfREFUQV9SRVFVRVNUKSB7Ci0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgU2ltcGxlUGFpcmluZ0NvbXBsZXRlIDogRXZlbnQgKGV2ZW50X2NvZGUgPSBTSU1QTEVfUEFJUklOR19DT01QTEVURSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgTGlua1N1cGVydmlzaW9uVGltZW91dENoYW5nZWQgOiBFdmVudCAoZXZlbnRfY29kZSA9IExJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DSEFOR0VEKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQgOiAxNiwgLy8gMHgwMDEtMHhGRkZGICgwLjYyNW1zLTQwLjlzKQotfQotCi1lbnVtIEZsdXNoYWJsZVBhY2tldFR5cGUgOiA4IHsKLSAgQVVUT01BVElDQUxMWV9GTFVTSEFCTEVfT05MWSA9IDAsCi19Ci0KLXBhY2tldCBFbmhhbmNlZEZsdXNoIDogQ29tbWFuZCAob3BfY29kZSA9IEVOSEFOQ0VEX0ZMVVNIKSB7Ci0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBwYWNrZXRfdHlwZSA6IEZsdXNoYWJsZVBhY2tldFR5cGUsCi19Ci0KLXBhY2tldCBFbmhhbmNlZEZsdXNoU3RhdHVzIDogQ29tbWFuZFN0YXR1cyAoY29tbWFuZF9vcF9jb2RlID0gRU5IQU5DRURfRkxVU0gpIHsKLX0KLQotcGFja2V0IEVuaGFuY2VkRmx1c2hDb21wbGV0ZSA6IEV2ZW50IChldmVudF9jb2RlID0gRU5IQU5DRURfRkxVU0hfQ09NUExFVEUpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi19Ci0KLXBhY2tldCBVc2VyUGFzc2tleU5vdGlmaWNhdGlvbiA6IEV2ZW50IChldmVudF9jb2RlID0gVVNFUl9QQVNTS0VZX05PVElGSUNBVElPTikgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgcGFzc2tleSA6IDIwLCAvLyAweDAwMDAwLTB4RjQyM0YgKDAwMDAwMCAtIDk5OTk5OSkKLSAgX3Jlc2VydmVkXyA6IDEyLAotfQotCi1wYWNrZXQgS2V5cHJlc3NOb3RpZmljYXRpb24gOiBFdmVudCAoZXZlbnRfY29kZSA9IEtFWVBSRVNTX05PVElGSUNBVElPTikgewotICBiZF9hZGRyIDogQWRkcmVzcywKLSAgbm90aWZpY2F0aW9uX3R5cGUgOiBLZXlwcmVzc05vdGlmaWNhdGlvblR5cGUsCi19Ci0KLXBhY2tldCBSZW1vdGVIb3N0U3VwcG9ydGVkRmVhdHVyZXNOb3RpZmljYXRpb24gOiBFdmVudCAoZXZlbnRfY29kZSA9IFJFTU9URV9IT1NUX1NVUFBPUlRFRF9GRUFUVVJFU19OT1RJRklDQVRJT04pIHsKLSAgYmRfYWRkciA6IEFkZHJlc3MsCi0gIGhvc3Rfc3VwcG9ydGVkX2ZlYXR1cmVzIDogNjQsCi19Ci0KLXBhY2tldCBMZU1ldGFFdmVudCA6IEV2ZW50IChldmVudF9jb2RlID0gTEVfTUVUQV9FVkVOVCkgewotICBzdWJldmVudF9jb2RlIDogU3ViZXZlbnRDb2RlLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBOdW1iZXJPZkNvbXBsZXRlZERhdGFCbG9ja3MgOiBFdmVudCAoZXZlbnRfY29kZSA9IE5VTUJFUl9PRl9DT01QTEVURURfREFUQV9CTE9DS1MpIHsKLSAgdG90YWxfbnVtX2RhdGFfYmxvY2tzIDogMTYsCi0gIF9wYXlsb2FkXywgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLS8vIExFIEV2ZW50cwotcGFja2V0IExlQ29ubmVjdGlvbkNvbXBsZXRlIDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBDT05ORUNUSU9OX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHJvbGUgOiBSb2xlLAotICBwZWVyX2FkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICBwZWVyX2FkZHJlc3MgOiBBZGRyZXNzLAotICBjb25uX2ludGVydmFsIDogMTYsIC8vIDB4MDA2IC0gMHgwQzgwICg3LjVtcyAtIDQwMDBtcykKLSAgY29ubl9sYXRlbmN5IDogMTYsICAvLyBOdW1iZXIgb2YgY29ubmVjdGlvbiBldmVudHMKLSAgc3VwZXJ2aXNpb25fdGltZW91dCA6IDE2LCAgLy8gMHgwMDBBIHRvIDB4MEM4MCAoMTAwbXMgdG8gMzJzKQotICBjZW50cmFsX2Nsb2NrX2FjY3VyYWN5IDogQ2xvY2tBY2N1cmFjeSwKLX0KLQotZW51bSBBZHZlcnRpc2luZ0V2ZW50VHlwZSA6IDggewotICBBRFZfSU5EID0gMHgwMCwKLSAgQURWX0RJUkVDVF9JTkQgPSAweDAxLAotICBBRFZfU0NBTl9JTkQgPSAweDAyLAotICBBRFZfTk9OQ09OTl9JTkQgPSAweDAzLAotICBTQ0FOX1JFU1BPTlNFID0gMHgwNCwKLX0KLQotc3RydWN0IExlQWR2ZXJ0aXNpbmdSZXBvcnQgewotICBldmVudF90eXBlIDogQWR2ZXJ0aXNpbmdFdmVudFR5cGUsCi0gIGFkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICBhZGRyZXNzIDogQWRkcmVzcywKLSAgX3NpemVfKGFkdmVydGlzaW5nX2RhdGEpIDogOCwKLSAgYWR2ZXJ0aXNpbmdfZGF0YSA6IEdhcERhdGFbXSwKLSAgcnNzaSA6IDgsCi19Ci0KLXBhY2tldCBMZUFkdmVydGlzaW5nUmVwb3J0IDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBBRFZFUlRJU0lOR19SRVBPUlQpIHsKLSAgX2NvdW50XyhhZHZlcnRpc2luZ19yZXBvcnRzKSA6IDgsCi0gIGFkdmVydGlzaW5nX3JlcG9ydHMgOiBMZUFkdmVydGlzaW5nUmVwb3J0W10sCi19Ci0KLXN0cnVjdCBMZUFkdmVydGlzaW5nUmVwb3J0UmF3IHsKLSAgZXZlbnRfdHlwZSA6IEFkdmVydGlzaW5nRXZlbnRUeXBlLAotICBhZGRyZXNzX3R5cGUgOiBBZGRyZXNzVHlwZSwKLSAgYWRkcmVzcyA6IEFkZHJlc3MsCi0gIF9zaXplXyhhZHZlcnRpc2luZ19kYXRhKSA6IDgsCi0gIGFkdmVydGlzaW5nX2RhdGEgOiA4W10sCi0gIHJzc2kgOiA4LAotfQotCi1wYWNrZXQgTGVBZHZlcnRpc2luZ1JlcG9ydFJhdyA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gQURWRVJUSVNJTkdfUkVQT1JUKSB7Ci0gIF9jb3VudF8oYWR2ZXJ0aXNpbmdfcmVwb3J0cykgOiA4LAotICBhZHZlcnRpc2luZ19yZXBvcnRzIDogTGVBZHZlcnRpc2luZ1JlcG9ydFJhd1tdLAotfQotCi1wYWNrZXQgTGVDb25uZWN0aW9uVXBkYXRlQ29tcGxldGUgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IENPTk5FQ1RJT05fVVBEQVRFX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGNvbm5faW50ZXJ2YWwgOiAxNiwgLy8gMHgwMDYgLSAweDBDODAgKDcuNW1zIC0gNDAwMG1zKQotICBjb25uX2xhdGVuY3kgOiAxNiwgIC8vIE51bWJlciBvZiBjb25uZWN0aW9uIGV2ZW50cwotICBzdXBlcnZpc2lvbl90aW1lb3V0IDogMTYsICAvLyAweDAwMEEgdG8gMHgwQzgwICgxMDBtcyB0byAzMnMpCi19Ci0KLXBhY2tldCBMZVJlYWRSZW1vdGVGZWF0dXJlc0NvbXBsZXRlIDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBSRUFEX1JFTU9URV9GRUFUVVJFU19DT01QTEVURSkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBsZV9mZWF0dXJlcyA6IDY0LAotfQotCi1wYWNrZXQgTGVMb25nVGVybUtleVJlcXVlc3QgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IExPTkdfVEVSTV9LRVlfUkVRVUVTVCkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcmFuZG9tX251bWJlciA6IDhbOF0sCi0gIGVuY3J5cHRlZF9kaXZlcnNpZmllciA6IDE2LAotfQotCi1wYWNrZXQgTGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1QpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGludGVydmFsX21pbiA6IDE2LCAvLyAweDAwNiAtIDB4MEM4MCAoNy41bXMgLSA0cykKLSAgaW50ZXJ2YWxfbWF4IDogMTYsIC8vIDB4MDA2IC0gMHgwQzgwICg3LjVtcyAtIDRzKQotICBsYXRlbmN5IDogMTYsICAvLyBOdW1iZXIgb2YgY29ubmVjdGlvbiBldmVudHMgKDB4MDAwMCB0byAweDAxZjMgKDQ5OSkKLSAgdGltZW91dCA6IDE2LCAgLy8gMHgwMDBBIHRvIDB4MEM4MCAoMTAwbXMgdG8gMzJzKQotfQotCi1wYWNrZXQgTGVEYXRhTGVuZ3RoQ2hhbmdlIDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBEQVRBX0xFTkdUSF9DSEFOR0UpIHsKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIG1heF90eF9vY3RldHMgOiAxNiwgLy8gMHgwMDFCIC0gMHgwMEZCCi0gIG1heF90eF90aW1lIDogMTYsIC8vIDB4MDE0OCAtIDB4NDI5MAotICBtYXhfcnhfb2N0ZXRzIDogMTYsIC8vIDB4MDAxQiAtIDB4MDBGQgotICBtYXhfcnhfdGltZSA6IDE2LCAvLyAweDAxNDggLSAweDQyOTAKLX0KLQotcGFja2V0IFJlYWRMb2NhbFAyNTZQdWJsaWNLZXlDb21wbGV0ZSA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUkVBRF9MT0NBTF9QMjU2X1BVQkxJQ19LRVlfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBsb2NhbF9wXzI1Nl9wdWJsaWNfa2V5IDogOFs2NF0sCi19Ci0KLXBhY2tldCBHZW5lcmF0ZURoS2V5Q29tcGxldGUgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IEdFTkVSQVRFX0RIS0VZX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgZGhfa2V5IDogOFszMl0sCi19Ci0KLXBhY2tldCBMZUVuaGFuY2VkQ29ubmVjdGlvbkNvbXBsZXRlIDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBFTkhBTkNFRF9DT05ORUNUSU9OX0NPTVBMRVRFKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIHJvbGUgOiBSb2xlLAotICBwZWVyX2FkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICBwZWVyX2FkZHJlc3MgOiBBZGRyZXNzLAotICBsb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcmVzcyA6IEFkZHJlc3MsCi0gIHBlZXJfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHJlc3MgOiBBZGRyZXNzLAotICBjb25uX2ludGVydmFsIDogMTYsIC8vIDB4MDA2IC0gMHgwQzgwICg3LjVtcyAtIDQwMDBtcykKLSAgY29ubl9sYXRlbmN5IDogMTYsICAvLyBOdW1iZXIgb2YgY29ubmVjdGlvbiBldmVudHMKLSAgc3VwZXJ2aXNpb25fdGltZW91dCA6IDE2LCAgLy8gMHgwMDBBIHRvIDB4MEM4MCAoMTAwbXMgdG8gMzJzKQotICBjZW50cmFsX2Nsb2NrX2FjY3VyYWN5IDogQ2xvY2tBY2N1cmFjeSwKLX0KLQotZW51bSBEaXJlY3RBZHZlcnRpc2luZ0FkZHJlc3NUeXBlIDogOCB7Ci0gIFBVQkxJQ19ERVZJQ0VfQUREUkVTUyA9IDB4MDAsCi0gIFJBTkRPTV9ERVZJQ0VfQUREUkVTUyA9IDB4MDEsCi0gIFBVQkxJQ19JREVOVElUWV9BRERSRVNTID0gMHgwMiwKLSAgUkFORE9NX0lERU5USVRZX0FERFJFU1MgPSAweDAzLAotICBDT05UUk9MTEVSX1VOQUJMRV9UT19SRVNPTFZFID0gMHhGRSwKLSAgTk9fQUREUkVTUyA9IDB4RkYsCi19Ci0KLWVudW0gRGlyZWN0QWR2ZXJ0aXNpbmdFdmVudFR5cGUgOiA4IHsKLSAgQURWX0RJUkVDVF9JTkQgPSAweDAxLAotfQotCi1lbnVtIERpcmVjdEFkZHJlc3NUeXBlIDogOCB7Ci0gIFJBTkRPTV9ERVZJQ0VfQUREUkVTUyA9IDB4MDEsCi19Ci0KLXN0cnVjdCBMZURpcmVjdGVkQWR2ZXJ0aXNpbmdSZXBvcnQgewotICBldmVudF90eXBlIDogRGlyZWN0QWR2ZXJ0aXNpbmdFdmVudFR5cGUsCi0gIGFkZHJlc3NfdHlwZSA6IERpcmVjdEFkdmVydGlzaW5nQWRkcmVzc1R5cGUsCi0gIGFkZHJlc3MgOiBBZGRyZXNzLAotICBkaXJlY3RfYWRkcmVzc190eXBlIDogRGlyZWN0QWRkcmVzc1R5cGUsCi0gIGRpcmVjdF9hZGRyZXNzIDogQWRkcmVzcywKLSAgcnNzaSA6IDgsCi19Ci0KLXBhY2tldCBMZURpcmVjdGVkQWR2ZXJ0aXNpbmdSZXBvcnQgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IERJUkVDVEVEX0FEVkVSVElTSU5HX1JFUE9SVCkgewotICBfY291bnRfKGFkdmVydGlzaW5nX3JlcG9ydHMpIDogOCwKLSAgYWR2ZXJ0aXNpbmdfcmVwb3J0cyA6IExlRGlyZWN0ZWRBZHZlcnRpc2luZ1JlcG9ydFtdLAotfQotCi1wYWNrZXQgTGVQaHlVcGRhdGVDb21wbGV0ZSA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUEhZX1VQREFURV9DT01QTEVURSkgewotICAgIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICAgIF9yZXNlcnZlZF8gOiA0LAotICAgIHR4X3BoeSA6IDgsCi0gICAgcnhfcGh5IDogOCwKLX0KLQotZW51bSBEYXRhU3RhdHVzIDogMiB7Ci0gIENPTVBMRVRFID0gMHgwLAotICBDT05USU5VSU5HID0gMHgxLAotICBUUlVOQ0FURUQgPSAweDIsCi0gIFJFU0VSVkVEID0gMHgzLAotfQotCi1zdHJ1Y3QgTGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0IHsKLSAgY29ubmVjdGFibGUgOiAxLAotICBzY2FubmFibGUgOiAxLAotICBkaXJlY3RlZCA6IDEsCi0gIHNjYW5fcmVzcG9uc2UgOiAxLAotICBsZWdhY3kgOiAxLAotICBkYXRhX3N0YXR1cyA6IERhdGFTdGF0dXMsCi0gIF9yZXNlcnZlZF8gOiA5LAotICBhZGRyZXNzX3R5cGUgOiBEaXJlY3RBZHZlcnRpc2luZ0FkZHJlc3NUeXBlLAotICBhZGRyZXNzIDogQWRkcmVzcywKLSAgcHJpbWFyeV9waHkgOiBQcmltYXJ5UGh5VHlwZSwKLSAgc2Vjb25kYXJ5X3BoeSA6IFNlY29uZGFyeVBoeVR5cGUsCi0gIGFkdmVydGlzaW5nX3NpZCA6IDgsIC8vIFNJRCBzdWJmaWVsZCBpbiB0aGUgQURJIGZpZWxkCi0gIHR4X3Bvd2VyIDogOCwKLSAgcnNzaSA6IDgsIC8vIC0xMjcgdG8gKzIwICgweDdGIG1lYW5zIG5vdCBhdmFpbGFibGUpCi0gIHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsIDogMTYsIC8vIDB4MDA2IHRvIDB4RkZGRiAoNy41IG1zIHRvIDgycykKLSAgZGlyZWN0X2FkZHJlc3NfdHlwZSA6IERpcmVjdEFkdmVydGlzaW5nQWRkcmVzc1R5cGUsCi0gIGRpcmVjdF9hZGRyZXNzIDogQWRkcmVzcywKLSAgX3NpemVfKGFkdmVydGlzaW5nX2RhdGEpIDogOCwKLSAgYWR2ZXJ0aXNpbmdfZGF0YSA6IDhbXSwKLX0KLQotcGFja2V0IExlRXh0ZW5kZWRBZHZlcnRpc2luZ1JlcG9ydCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gRVhURU5ERURfQURWRVJUSVNJTkdfUkVQT1JUKSB7Ci0gIF9jb3VudF8oYWR2ZXJ0aXNpbmdfcmVwb3J0cykgOiA4LAotICBhZHZlcnRpc2luZ19yZXBvcnRzIDogTGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0W10sCi19Ci0KLXBhY2tldCBMZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jRXN0YWJsaXNoZWQgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IFBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfRVNUQUJMSVNIRUQpIHsKLSAgX3BheWxvYWRfLCAvLyBwbGFjZWhvbGRlciAodW5pbXBsZW1lbnRlZCkKLX0KLQotcGFja2V0IExlUGVyaW9kaWNBZHZlcnRpc2luZ1JlcG9ydCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUEVSSU9ESUNfQURWRVJUSVNJTkdfUkVQT1JUKSB7Ci0gIF9wYXlsb2FkXywgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLXBhY2tldCBMZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jTG9zdCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19MT1NUKSB7Ci0gIF9wYXlsb2FkXywgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLXBhY2tldCBMZVNjYW5UaW1lb3V0IDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBTQ0FOX1RJTUVPVVQpIHsKLX0KLQotcGFja2V0IExlQWR2ZXJ0aXNpbmdTZXRUZXJtaW5hdGVkIDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBBRFZFUlRJU0lOR19TRVRfVEVSTUlOQVRFRCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGFkdmVydGlzaW5nX2hhbmRsZSA6IDgsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBudW1fY29tcGxldGVkX2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50cyA6IDgsCi19Ci0KLXBhY2tldCBMZVNjYW5SZXF1ZXN0UmVjZWl2ZWQgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IFNDQU5fUkVRVUVTVF9SRUNFSVZFRCkgewotICBhZHZlcnRpc2luZ19oYW5kbGUgOiA4LAotICBzY2FubmVyX2FkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICBzY2FubmVyX2FkZHJlc3MgOiBBZGRyZXNzLAotfQotCi1lbnVtIENoYW5uZWxTZWxlY3Rpb25BbGdvcml0aG0gOiA4IHsKLSAgQUxHT1JJVEhNXzEgPSAwLAotICBBTEdPUklUSE1fMiA9IDEsCi19Ci0KLXBhY2tldCBMZUNoYW5uZWxTZWxlY3Rpb25BbGdvcml0aG0gOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IENIQU5ORUxfU0VMRUNUSU9OX0FMR09SSVRITSkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgY2hhbm5lbF9zZWxlY3Rpb25fYWxnb3JpdGhtIDogQ2hhbm5lbFNlbGVjdGlvbkFsZ29yaXRobSwKLX0KLQotcGFja2V0IExlQ29ubmVjdGlvbmxlc3NJcVJlcG9ydCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gQ09OTkVDVElPTkxFU1NfSVFfUkVQT1JUKSB7Ci0gIF9wYXlsb2FkXywgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLXBhY2tldCBMZUNvbm5lY3Rpb25JcVJlcG9ydCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gQ09OTkVDVElPTl9JUV9SRVBPUlQpIHsKLSAgX3BheWxvYWRfLCAvLyBwbGFjZWhvbGRlciAodW5pbXBsZW1lbnRlZCkKLX0KLQotcGFja2V0IExlQ3RlUmVxdWVzdEZhaWxlZCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gQ1RFX1JFUVVFU1RfRkFJTEVEKSB7Ci0gIF9wYXlsb2FkXywgLy8gcGxhY2Vob2xkZXIgKHVuaW1wbGVtZW50ZWQpCi19Ci0KLXBhY2tldCBMZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJSZWNlaXZlZCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9SRUNFSVZFRCkgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBzZXJ2aWNlX2RhdGEgOiAxNiwKLSAgc3luY19oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGFkdmVydGlzaW5nX3NpZCA6IDQsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBhZHZlcnRpc2VyX2FkZHJlc3NfdHlwZSA6IEFkZHJlc3NUeXBlLAotICBhZHZlcnRpc2VyX2FkZHJlc3MgOiBBZGRyZXNzLAotICBhZHZlcnRpc2VyX3BoeSA6IFNlY29uZGFyeVBoeVR5cGUsCi0gIHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsIDogMTYsCi0gIGFkdmVydGlzZXJfY2xvY2tfYWNjdXJhY3kgOiBDbG9ja0FjY3VyYWN5LAotfQotCi1wYWNrZXQgTGVDaXNFc3RhYmxpc2hlZCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gQ0lTX0VTVEFCTElTSEVEKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGNpZ19zeW5jX2RlbGF5IDogMjQsCi0gIGNpc19zeW5jX2RlbGF5IDogMjQsCi0gIHRyYW5zcG9ydF9sYXRlbmN5X21fdG9fcyA6IDI0LAotICB0cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20gOiAyNCwKLSAgcGh5X21fdG9fcyA6IFNlY29uZGFyeVBoeVR5cGUsCi0gIHBoeV9zX3RvX20gOiBTZWNvbmRhcnlQaHlUeXBlLAotICBuc2UgOiA4LAotICBibl9tX3RvX3MgOiA0LAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgYm5fc190b19tIDogNCwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGZ0X21fdG9fcyA6IDgsCi0gIGZ0X3NfdG9fbSA6IDgsCi0gIG1heF9wZHVfbV90b19zIDogOCwKLSAgX3Jlc2VydmVkXyA6IDgsCi0gIG1heF9wZHVfc190b19tIDogOCwKLSAgX3Jlc2VydmVkXyA6IDgsCi0gIGlzb19pbnRlcnZhbCA6IDE2LAotfQotCi1wYWNrZXQgTGVDaXNSZXF1ZXN0IDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBDSVNfUkVRVUVTVCkgewotICBhY2xfY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGNpc19jb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgY2lnX2lkIDogOCwKLSAgY2lzX2lkIDogOCwKLX0KLQotcGFja2V0IExlQ3JlYXRlQmlnQ29tcGxldGUgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IENSRUFURV9CSUdfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBiaWdfaGFuZGxlIDogOCwKLSAgYmlnX3N5bmNfZGVsYXkgOiAyNCwKLSAgdHJhbnNwb3J0X2xhdGVuY3lfYmlnOiAyNCwKLSAgcGh5IDogU2Vjb25kYXJ5UGh5VHlwZSwKLSAgbnNlIDogOCwKLSAgYm4gOiA4LAotICBwdG8gOiA4LAotICBpcmMgOiA4LAotICBtYXhfcGR1IDogMTYsCi0gIGlzb19pbnRlcnZhbCA6IDE2LAotICBfc2l6ZV8oY29ubmVjdGlvbl9oYW5kbGUpIDogOCwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxNltdLAotfQotCi1wYWNrZXQgTGVUZXJtaW5hdGVCaWdDb21wbGV0ZSA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gVEVSTUlOQVRFX0JJR19DT01QTEVURSkgewotICBiaWdfaGFuZGxlIDogOCwKLSAgcmVhc29uIDogRXJyb3JDb2RlLAotfQotCi1wYWNrZXQgTGVCaWdTeW5jRXN0YWJsaXNoZWQgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IEJJR19TWU5DX0VTVEFCTElTSEVEKSB7Ci0gIHN0YXR1cyA6IEVycm9yQ29kZSwKLSAgYmlnX2hhbmRsZSA6IDgsCi0gIHRyYW5zcG9ydF9sYXRlbmN5X2JpZyA6IDI0LAotICBuc2UgOiA4LAotICBibiA6IDgsCi0gIHB0byA6IDgsCi0gIGlyYyA6IDgsCi0gIG1heF9wZHUgOiAxNiwKLSAgaXNvX2ludGVydmFsIDogMTYsCi0gIF9zaXplXyhjb25uZWN0aW9uX2hhbmRsZSkgOiA4LAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDE2W10sCi19Ci0KLXBhY2tldCBMZUJpZ1N5bmNMb3N0IDogTGVNZXRhRXZlbnQgKHN1YmV2ZW50X2NvZGUgPSBCSUdfU1lOQ19MT1NUKSB7Ci0gIGJpZ19oYW5kbGUgOiA4LAotICByZWFzb24gOiBFcnJvckNvZGUsCi19Ci0KLXBhY2tldCBMZVJlcXVlc3RQZWVyU2NhQ29tcGxldGUgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IFJFUVVFU1RfUEVFUl9TQ0FfQ09NUExFVEUpIHsKLSAgc3RhdHVzIDogRXJyb3JDb2RlLAotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgcGVlcl9jbG9ja19hY2N1cmFjeSA6IENsb2NrQWNjdXJhY3ksCi19Ci0KLWVudW0gUGF0aExvc3Nab25lIDogOCB7Ci0gIExPVyA9IDAsCi0gIE1JRCA9IDEsCi0gIEhJR0ggPSAyLAotfQotCi1wYWNrZXQgTGVQYXRoTG9zc1RocmVzaG9sZCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gUEFUSF9MT1NTX1RIUkVTSE9MRCkgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgY3VycmVudF9wYXRoX2xvc3MgOiA4LAotICB6b25lX2VudGVyZWQgOiBQYXRoTG9zc1pvbmUsCi19Ci0KLXBhY2tldCBMZVRyYW5zbWl0UG93ZXJSZXBvcnRpbmcgOiBMZU1ldGFFdmVudCAoc3ViZXZlbnRfY29kZSA9IFRSQU5TTUlUX1BPV0VSX1JFUE9SVElORykgewotICBzdGF0dXMgOiBFcnJvckNvZGUsCi0gIGNvbm5lY3Rpb25faGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICByZWFzb24gOiA4LAotICBwaHkgOiA4LAotICB0cmFuc21pdF9wb3dlcl9sZXZlbCA6IDgsCi0gIHRyYW5zbWl0X3Bvd2VyX2xldmVsX2ZsYWcgOiA4LAotICBkZWx0YSA6IDgsCi19Ci0KLXBhY2tldCBMZUJpZ0luZm9BZHZlcnRpc2luZ1JlcG9ydCA6IExlTWV0YUV2ZW50IChzdWJldmVudF9jb2RlID0gQklHX0lORk9fQURWRVJUSVNJTkdfUkVQT1JUKSB7Ci0gIHN5bmNfaGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBudW1fYmlzIDogOCwKLSAgbnNlIDogOCwKLSAgaXNvX2ludGVydmFsIDogMTYsCi0gIGJuIDogOCwKLSAgcHRvIDogOCwKLSAgaXJjIDogOCwKLSAgbWF4X3BkdSA6IDE2LAotICBzZHVfaW50ZXJ2YWwgOiAyNCwKLSAgbWF4X3NkdSA6IDE2LAotICBwaHkgOiBTZWNvbmRhcnlQaHlUeXBlLAotICBmcmFtaW5nIDogRW5hYmxlLAotICBlbmNyeXB0aW9uIDogRW5hYmxlLAotfQotCi0vLyBWZW5kb3Igc3BlY2lmaWMgZXZlbnRzCi0KLXBhY2tldCBWZW5kb3JTcGVjaWZpY0V2ZW50IDogRXZlbnQgKGV2ZW50X2NvZGUgPSBWRU5ET1JfU1BFQ0lGSUMpIHsKLSAgc3ViZXZlbnRfY29kZSA6IFZzZVN1YmV2ZW50Q29kZSwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgU3RvcmFnZVRocmVzaG9sZEJyZWFjaEV2ZW50IDogVmVuZG9yU3BlY2lmaWNFdmVudCAoc3ViZXZlbnRfY29kZSA9IEJMRV9USFJFU0hPTEQpIHsKLX0KLQotZW51bSBBZHZ0SW5mb1ByZXNlbnQgOiA4IHsKLSAgQURWVF9JTkZPX1BSRVNFTlQgPSAweDAwLAotICBOT19BRFZUX0lORk9fUFJFU0VOVCA9IDB4MDEsCi19Ci0KLXBhY2tldCBMRUFkdmVydGlzZW1lbnRUcmFja2luZ0V2ZW50IDogVmVuZG9yU3BlY2lmaWNFdmVudCAoc3ViZXZlbnRfY29kZSA9IEJMRV9UUkFDS0lORykgewotICBhcGNmX2ZpbHRlcl9pbmRleCA6IDgsCi0gIGFkdmVydGlzZXJfc3RhdGUgOiA4LAotICBhZHZ0X2luZm9fcHJlc2VudCA6IEFkdnRJbmZvUHJlc2VudCwKLSAgYWR2ZXJ0aXNlcl9hZGRyZXNzIDogQWRkcmVzcywKLSAgYWR2ZXJ0aXNlcl9hZGRyZXNzX3R5cGUgOiA4LAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBMRUFkdmVydGlzZW1lbnRUcmFja2luZ1dpdGhJbmZvRXZlbnQgOiBMRUFkdmVydGlzZW1lbnRUcmFja2luZ0V2ZW50IHsKLSAgdHhfcG93ZXIgOiA4LAotICByc3NpIDogOCwKLSAgdGltZXN0YW1wIDogMTYsCi0gIF9zaXplXyhhZHZfcGFja2V0KSA6IDgsCi0gIGFkdl9wYWNrZXQgOiA4W10sCi0gIF9zaXplXyhzY2FuX3Jlc3BvbnNlKSA6IDgsCi0gIHNjYW5fcmVzcG9uc2UgOiA4W10sCi19Ci0KLWVudW0gUXVhbGl0eVJlcG9ydElkIDogOCB7Ci0gIE1PTklUT1JfTU9ERSA9IDB4MDEsCi0gIEFQUFJPQUNIX0xTVE8gPSAweDAyLAotICBBMkRQX0FVRElPX0NIT1BQWSA9IDB4MDMsCi0gIFNDT19WT0lDRV9DSE9QUFkgPSAweDA0LAotICBST09UX0lORkxBTU1BVElPTiA9IDB4MDUsCi0gIExNUF9MTF9NRVNTQUdFX1RSQUNFID0gMHgxMSwKLSAgQlRfU0NIRURVTElOR19UUkFDRSA9IDB4MTIsCi0gIENPTlRST0xMRVJfREJHX0lORk8gPSAweDEzLAotfQotCi1wYWNrZXQgQnFyRXZlbnQgOiBWZW5kb3JTcGVjaWZpY0V2ZW50IChzdWJldmVudF9jb2RlID0gQlFSX0VWRU5UKSB7Ci0gIHF1YWxpdHlfcmVwb3J0X2lkIDogUXVhbGl0eVJlcG9ydElkLAotICBfcGF5bG9hZF8sCi19Ci0KLWVudW0gQnFyUGFja2V0VHlwZSA6IDggewotICBUWVBFX0lEID0gMHgwMSwKLSAgVFlQRV9OVUxMID0gMHgwMiwKLSAgVFlQRV9QT0xMID0gMHgwMywKLSAgVFlQRV9GSFMgPSAweDA0LAotICBUWVBFX0hWMSA9IDB4MDUsCi0gIFRZUEVfSFYyID0gMHgwNiwKLSAgVFlQRV9IVjMgPSAweDA3LAotICBUWVBFX0RWID0gMHgwOCwKLSAgVFlQRV9FVjMgPSAweDA5LAotICBUWVBFX0VWNCA9IDB4MEEsCi0gIFRZUEVfRVY1ID0gMHgwQiwKLSAgVFlQRV8yRVYzID0gMHgwQywKLSAgVFlQRV8yRVY1ID0gMHgwRCwKLSAgVFlQRV8zRVYzID0gMHgwRSwKLSAgVFlQRV8zRVY1ID0gMHgwRiwKLSAgVFlQRV9ETTEgPSAweDEwLAotICBUWVBFX0RIMSA9IDB4MTEsCi0gIFRZUEVfRE0zID0gMHgxMiwKLSAgVFlQRV9ESDMgPSAweDEzLAotICBUWVBFX0RNNSA9IDB4MTQsCi0gIFRZUEVfREg1ID0gMHgxNSwKLSAgVFlQRV9BVVgxID0gMHgxNiwKLSAgVFlQRV8yREgxID0gMHgxNywKLSAgVFlQRV8yREgzID0gMHgxOCwKLSAgVFlQRV8yREg1ID0gMHgxOSwKLSAgVFlQRV8zREgxID0gMHgxQSwKLSAgVFlQRV8zREgzID0gMHgxQiwKLSAgVFlQRV8zREg1ID0gMHgxQywKLX0KLQotcGFja2V0IEJxckxpbmtRdWFsaXR5RXZlbnQgOiBCcXJFdmVudCB7Ci0gIHBhY2tldF90eXBlIDogQnFyUGFja2V0VHlwZSwKLSAgY29ubmVjdGlvbl9oYW5kbGUgOiAxMiwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIGNvbm5lY3Rpb25fcm9sZSA6IFJvbGUsCi0gIHR4X3Bvd2VyX2xldmVsIDogOCwKLSAgcnNzaSA6IDgsCi0gIHNuciA6IDgsCi0gIHVudXNlZF9hZmhfY2hhbm5lbF9jb3VudCA6IDgsCi0gIGFmaF9zZWxlY3RfdW5pZGVhbF9jaGFubmVsX2NvdW50IDogOCwKLSAgbHN0byA6IDE2LAotICBjb25uZWN0aW9uX3BpY29uZXRfY2xvY2sgOiAzMiwKLSAgcmV0cmFuc21pc3Npb25fY291bnQgOiAzMiwKLSAgbm9fcnhfY291bnQgOiAzMiwKLSAgbmFrX2NvdW50IDogMzIsCi0gIGxhc3RfdHhfYWNrX3RpbWVzdGFtcCA6IDMyLAotICBmbG93X29mZl9jb3VudCA6IDMyLAotICBsYXN0X2Zsb3dfb25fdGltZXN0YW1wIDogMzIsCi0gIGJ1ZmZlcl9vdmVyZmxvd19ieXRlcyA6IDMyLAotICBidWZmZXJfdW5kZXJmbG93X2J5dGVzIDogMzIsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IEJxck1vbml0b3JNb2RlRXZlbnQgOiBCcXJMaW5rUXVhbGl0eUV2ZW50IChxdWFsaXR5X3JlcG9ydF9pZCA9IE1PTklUT1JfTU9ERSkgewotIF9wYXlsb2FkXywgLy8gdmVuZG9yIHNwZWNpZmljIHBhcmFtZXRlcgotfQotCi1wYWNrZXQgQnFyQXBwcm9hY2hMc3RvRXZlbnQgOiBCcXJMaW5rUXVhbGl0eUV2ZW50IChxdWFsaXR5X3JlcG9ydF9pZCA9IEFQUFJPQUNIX0xTVE8pIHsKLSBfcGF5bG9hZF8sIC8vIHZlbmRvciBzcGVjaWZpYyBwYXJhbWV0ZXIKLX0KLQotcGFja2V0IEJxckEyZHBBdWRpb0Nob3BweUV2ZW50IDogQnFyTGlua1F1YWxpdHlFdmVudCAocXVhbGl0eV9yZXBvcnRfaWQgPSBBMkRQX0FVRElPX0NIT1BQWSkgewotICBfcGF5bG9hZF8sIC8vIHZlbmRvciBzcGVjaWZpYyBwYXJhbWV0ZXIKLX0KLQotcGFja2V0IEJxclNjb1ZvaWNlQ2hvcHB5RXZlbnQgOiBCcXJMaW5rUXVhbGl0eUV2ZW50IChxdWFsaXR5X3JlcG9ydF9pZCA9IFNDT19WT0lDRV9DSE9QUFkpIHsKLSBfcGF5bG9hZF8sIC8vIHZlbmRvciBzcGVjaWZpYyBwYXJhbWV0ZXIKLX0KLQotcGFja2V0IEJxclJvb3RJbmZsYW1tYXRpb25FdmVudCA6IEJxckV2ZW50IChxdWFsaXR5X3JlcG9ydF9pZCA9IFJPT1RfSU5GTEFNTUFUSU9OKSB7Ci0gIGVycm9yX2NvZGUgOiA4LAotICB2ZW5kb3Jfc3BlY2lmaWNfZXJyb3JfY29kZSA6IDgsCi0gIF9wYXlsb2FkXywgLy8gdmVuZG9yIHNwZWNpZmljIHBhcmFtZXRlcgotfQotCi1wYWNrZXQgQnFyTG9nRHVtcEV2ZW50IDogQnFyRXZlbnQgewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgQnFyTG1wTGxNZXNzYWdlVHJhY2VFdmVudCA6IEJxckxvZ0R1bXBFdmVudCAocXVhbGl0eV9yZXBvcnRfaWQgPSBMTVBfTExfTUVTU0FHRV9UUkFDRSkgewotICBfcGF5bG9hZF8sIC8vIHZlbmRvciBzcGVjaWZpYyBwYXJhbWV0ZXIKLX0KLQotcGFja2V0IEJxckJ0U2NoZWR1bGluZ1RyYWNlRXZlbnQgOiBCcXJMb2dEdW1wRXZlbnQgKHF1YWxpdHlfcmVwb3J0X2lkID0gQlRfU0NIRURVTElOR19UUkFDRSkgewotIF9wYXlsb2FkXywgLy8gdmVuZG9yIHNwZWNpZmljIHBhcmFtZXRlcgotfQotCi1wYWNrZXQgQnFyQ29udHJvbGxlckRiZ0luZm9FdmVudCA6IEJxckxvZ0R1bXBFdmVudCAocXVhbGl0eV9yZXBvcnRfaWQgPSBDT05UUk9MTEVSX0RCR19JTkZPKSB7Ci0gX3BheWxvYWRfLCAvLyB2ZW5kb3Igc3BlY2lmaWMgcGFyYW1ldGVyCi19Ci0KLS8vIElzb2Nocm9ub3VzIEFkYXB0YXRpb24gTGF5ZXIKLQotZW51bSBJc29QYWNrZXRCb3VuZGFyeUZsYWcgOiAyIHsKLSAgRklSU1RfRlJBR01FTlQgPSAwLAotICBDT05USU5VQVRJT05fRlJBR01FTlQgPSAxLAotICBDT01QTEVURV9TRFUgPSAyLAotICBMQVNUX0ZSQUdNRU5UID0gMywKLX0KLQotZW51bSBUaW1lU3RhbXBGbGFnIDogMSB7Ci0gIE5PVF9QUkVTRU5UID0gMCwKLSAgUFJFU0VOVCA9IDEsCi19Ci0KLXBhY2tldCBJc28gewotICBjb25uZWN0aW9uX2hhbmRsZSA6IDEyLAotICBwYl9mbGFnIDogSXNvUGFja2V0Qm91bmRhcnlGbGFnLAotICB0c19mbGFnIDogVGltZVN0YW1wRmxhZywKLSAgX3Jlc2VydmVkXyA6IDEsCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogMTQsCi0gIF9yZXNlcnZlZF8gOiAyLAotICBfcGF5bG9hZF8sCi19Ci0KLWVudW0gSXNvUGFja2V0U3RhdHVzRmxhZyA6IDIgewotICBWQUxJRCA9IDAsCi0gIFBPU1NJQkxZX0lOVkFMSUQgPSAxLAotICBMT1NUX0RBVEEgPSAyLAotfQotCi1wYWNrZXQgSXNvV2l0aFRpbWVzdGFtcCA6IElzbyAodHNfZmxhZyA9IFBSRVNFTlQpIHsKLSAgdGltZV9zdGFtcCA6IDMyLAotICBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyIDogMTYsCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogMTIsIC8vIGlzb19zZHVfbGVuZ3RoCi0gIF9yZXNlcnZlZF8gOiAyLAotICBwYWNrZXRfc3RhdHVzX2ZsYWcgOiBJc29QYWNrZXRTdGF0dXNGbGFnLAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBJc29XaXRob3V0VGltZXN0YW1wIDogSXNvICh0c19mbGFnID0gTk9UX1BSRVNFTlQpIHsKLSAgcGFja2V0X3NlcXVlbmNlX251bWJlciA6IDE2LAotICBfc2l6ZV8oX3BheWxvYWRfKSA6IDEyLCAvLyBpc29fc2R1X2xlbmd0aAotICBfcmVzZXJ2ZWRfIDogMiwKLSAgcGFja2V0X3N0YXR1c19mbGFnIDogSXNvUGFja2V0U3RhdHVzRmxhZywKLSAgX3BheWxvYWRfLAotfQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2hjaV9wYWNrZXRzX2Z1enpfdGVzdC5jYyBiL2dkL2hjaS9oY2lfcGFja2V0c19mdXp6X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzQyODYuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2hjaV9wYWNrZXRzX2Z1enpfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIFBBQ0tFVF9GVVpaX1RFU1RJTkcKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotc3RkOjp2ZWN0b3I8dm9pZCAoKikoY29uc3QgdWludDhfdCosIHNpemVfdCk+IGhjaV9wYWNrZXRfZnV6el90ZXN0czsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZXNldFJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1Jlc2V0Q29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZWFkQnVmZmVyU2l6ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWRCdWZmZXJTaXplQ29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9Ib3N0QnVmZmVyU2l6ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX0hvc3RCdWZmZXJTaXplQ29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb25SZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWRCZEFkZHJSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZWFkQmRBZGRyQ29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZWFkTG9jYWxTdXBwb3J0ZWRDb21tYW5kc1JlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzQ29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9Xcml0ZVNpbXBsZVBhaXJpbmdNb2RlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVTaW1wbGVQYWlyaW5nTW9kZUNvbXBsZXRlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVMZUhvc3RTdXBwb3J0UmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVMZUhvc3RTdXBwb3J0Q29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9SZWFkTG9jYWxFeHRlbmRlZEZlYXR1cmVzUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfUmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0NvbXBsZXRlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0UmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0Q29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9MZVJlYWRDb25uZWN0TGlzdFNpemVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9MZVJlYWRDb25uZWN0TGlzdFNpemVDb21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX0xlUmVhZEJ1ZmZlclNpemVWMVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX0xlUmVhZEJ1ZmZlclNpemVWMUNvbXBsZXRlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVDdXJyZW50SWFjTGFwUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVDdXJyZW50SWFjTGFwQ29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9Xcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9Xcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlDb21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWRJbnF1aXJ5U2NhbkFjdGl2aXR5UmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfUmVhZElucXVpcnlTY2FuQWN0aXZpdHlDb21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWRDdXJyZW50SWFjTGFwUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfUmVhZEN1cnJlbnRJYWNMYXBDb21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWROdW1iZXJPZlN1cHBvcnRlZElhY1JlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1JlYWROdW1iZXJPZlN1cHBvcnRlZElhY0NvbXBsZXRlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfUmVhZFBhZ2VUaW1lb3V0UmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfUmVhZFBhZ2VUaW1lb3V0Q29tcGxldGVSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9Xcml0ZVBhZ2VUaW1lb3V0UmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfV3JpdGVQYWdlVGltZW91dENvbXBsZXRlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfSW5xdWlyeVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX0lucXVpcnlTdGF0dXNSZWZsZWN0aW9uRnV6elRlc3QoaGNpX3BhY2tldF9mdXp6X3Rlc3RzKTsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9JbnF1aXJ5Q2FuY2VsUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfSW5xdWlyeUNhbmNlbENvbXBsZXRlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfUGVyaW9kaWNJbnF1aXJ5TW9kZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX1BlcmlvZGljSW5xdWlyeU1vZGVDb21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi1ERUZJTkVfQU5EX1JFR0lTVEVSX0V4aXRQZXJpb2RpY0lucXVpcnlNb2RlUmVmbGVjdGlvbkZ1enpUZXN0KGhjaV9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfRXhpdFBlcmlvZGljSW5xdWlyeU1vZGVDb21wbGV0ZVJlZmxlY3Rpb25GdXp6VGVzdChoY2lfcGFja2V0X2Z1enpfdGVzdHMpOwotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLXZvaWQgUnVuSGNpUGFja2V0RnV6elRlc3QoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKGRhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICBmb3IgKGF1dG8gdGVzdF9mdW5jdGlvbiA6IGJsdWV0b290aDo6aGNpOjpoY2lfcGFja2V0X2Z1enpfdGVzdHMpIHsKLSAgICB0ZXN0X2Z1bmN0aW9uKGRhdGEsIHNpemUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZC9oY2kvaGNpX3BhY2tldHNfdGVzdC5jYyBiL2dkL2hjaS9oY2lfcGFja2V0c190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk2MzM1Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9oY2lfcGFja2V0c190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2RlZmluZSBQQUNLRVRfVEVTVElORyAgLy8gSW5zdGFudGlhdGUgdGhlIHRlc3RzIGluIHRoZSBwYWNrZXQgZmlsZXMKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gcGl4ZWxfM194bF93cml0ZV9leHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlewotICAgIDB4NTIsIDB4MGMsIDB4ZjEsIDB4MDEsIDB4MGIsIDB4MDksIDB4NTAsIDB4NjksIDB4NzgsIDB4NjUsIDB4NmMsIDB4MjAsIDB4MzMsIDB4MjAsIDB4NTgsIDB4NGMsIDB4MTksIDB4MDMsIDB4MDUsCi0gICAgMHgxMSwgMHgwYSwgMHgxMSwgMHgwYywgMHgxMSwgMHgwZSwgMHgxMSwgMHgxMiwgMHgxMSwgMHgxNSwgMHgxMSwgMHgxNiwgMHgxMSwgMHgxZiwgMHgxMSwgMHgyZCwgMHgxMSwgMHgyZiwgMHgxMSwKLSAgICAweDAwLCAweDEyLCAweDMyLCAweDExLCAweDAxLCAweDA1LCAweDgxLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBwaXhlbF8zX3hsX3dyaXRlX2V4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2Vfbm9fdXVpZHN7Ci0gICAgMHg1MiwgMHgwYywgMHhmMSwgMHgwMSwgMHgwYiwgMHgwOSwgMHg1MCwgMHg2OSwgMHg3OCwgMHg2NSwgMHg2YywgMHgyMCwgMHgzMywgMHgyMCwgMHg1OCwgMHg0YywgMHgwMSwgMHgwMywgMHgwMSwKLSAgICAweDA1LCAweDgxLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBpeGVsXzNfeGxfd3JpdGVfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZV9ub191dWlkc19qdXN0X2VpcnsKLSAgICBwaXhlbF8zX3hsX3dyaXRlX2V4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2Vfbm9fdXVpZHMuYmVnaW4oKSArIDQsICAvLyBza2lwIGNvbW1hbmQsIHNpemUsIGFuZCBmZWNfcmVxdWlyZWQKLSAgICBwaXhlbF8zX3hsX3dyaXRlX2V4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2Vfbm9fdXVpZHMuZW5kKCl9OwotCi1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0V3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZSkgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHZpZXdfYnl0ZXMgPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4ocGl4ZWxfM194bF93cml0ZV9leHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlKTsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHZpZXdfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBXcml0ZUV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGdhcF9kYXRhID0gdmlldy5HZXRFeHRlbmRlZElucXVpcnlSZXNwb25zZSgpOwotICBBU1NFUlRfR0UoZ2FwX2RhdGEuc2l6ZSgpLCA0KTsKLSAgQVNTRVJUX0VRKGdhcF9kYXRhWzBdLmRhdGFfdHlwZV8sIEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FKTsKLSAgQVNTRVJUX0VRKGdhcF9kYXRhWzBdLmRhdGFfLnNpemUoKSwgMTApOwotICBBU1NFUlRfRVEoZ2FwX2RhdGFbMV0uZGF0YV90eXBlXywgR2FwRGF0YVR5cGU6OkNPTVBMRVRFX0xJU1RfMTZfQklUX1VVSURTKTsKLSAgQVNTRVJUX0VRKGdhcF9kYXRhWzFdLmRhdGFfLnNpemUoKSwgMjQpOwotICBBU1NFUlRfRVEoZ2FwX2RhdGFbMl0uZGF0YV90eXBlXywgR2FwRGF0YVR5cGU6OkNPTVBMRVRFX0xJU1RfMzJfQklUX1VVSURTKTsKLSAgQVNTRVJUX0VRKGdhcF9kYXRhWzJdLmRhdGFfLnNpemUoKSwgMCk7Ci0gIEFTU0VSVF9FUShnYXBfZGF0YVszXS5kYXRhX3R5cGVfLCBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTElTVF8xMjhfQklUX1VVSURTKTsKLSAgQVNTRVJUX0VRKGdhcF9kYXRhWzNdLmRhdGFfLnNpemUoKSwgMTI4KTsKLQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBub19wYWRkaW5ne2dhcF9kYXRhLmJlZ2luKCksIGdhcF9kYXRhLmJlZ2luKCkgKyA0fTsKLSAgYXV0byBidWlsZGVyID0gV3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSh2aWV3LkdldEZlY1JlcXVpcmVkKCksIG5vX3BhZGRpbmcpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZShpdCk7Ci0KLSAgRVhQRUNUX0VRKHBhY2tldF9ieXRlcy0+c2l6ZSgpLCB2aWV3X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZpZXdfYnl0ZXMtPnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+YXQoaSksIHZpZXdfYnl0ZXMtPmF0KGkpKTsKLSAgfQotfQotCi0vLyAgVE9ETzogUmV2aXNpdCByZWZsZWN0aW9uIHRlc3RzIGZvciBFSVIKLS8vIERFRklORV9BTkRfSU5TVEFOVElBVEVfV3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZVJlZmxlY3Rpb25UZXN0KHBpeGVsXzNfeGxfd3JpdGVfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZSwKLS8vIHBpeGVsXzNfeGxfd3JpdGVfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZV9ub191dWlkcyk7Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3NldF9zY2FuX3BhcmFtZXRlcnN7Ci0gICAgMHgwYiwgMHgyMCwgMHgwNywgMHgwMSwgMHgxMiwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMSwgMHgwMCwKLX07Ci1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0TGVTZXRTY2FuUGFyYW1ldGVycykgewotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGxlX3NldF9zY2FuX3BhcmFtZXRlcnMpKTsKLSAgYXV0byB2aWV3ID0gTGVTZXRTY2FuUGFyYW1ldGVyc1ZpZXc6OkNyZWF0ZShMZVNjYW5uaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotCi0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKExlU2NhblR5cGU6OkFDVElWRSwgdmlldy5HZXRMZVNjYW5UeXBlKCkpOwotICBBU1NFUlRfRVEoMHgxMiwgdmlldy5HZXRMZVNjYW5JbnRlcnZhbCgpKTsKLSAgQVNTRVJUX0VRKDB4MTIsIHZpZXcuR2V0TGVTY2FuV2luZG93KCkpOwotICBBU1NFUlRfRVEoT3duQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUywgdmlldy5HZXRPd25BZGRyZXNzVHlwZSgpKTsKLSAgQVNTRVJUX0VRKExlU2Nhbm5pbmdGaWx0ZXJQb2xpY3k6OkFDQ0VQVF9BTEwsIHZpZXcuR2V0U2Nhbm5pbmdGaWx0ZXJQb2xpY3koKSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3NldF9zY2FuX2VuYWJsZXsKLSAgICAweDBjLCAweDIwLCAweDAyLCAweDAxLCAweDAwLAotfTsKLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZVNldFNjYW5FbmFibGUpIHsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihsZV9zZXRfc2Nhbl9lbmFibGUpKTsKLSAgYXV0byB2aWV3ID0gTGVTZXRTY2FuRW5hYmxlVmlldzo6Q3JlYXRlKExlU2Nhbm5pbmdDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKSk7Ci0KLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoRW5hYmxlOjpFTkFCTEVELCB2aWV3LkdldExlU2NhbkVuYWJsZSgpKTsKLSAgQVNTRVJUX0VRKEVuYWJsZTo6RElTQUJMRUQsIHZpZXcuR2V0RmlsdGVyRHVwbGljYXRlcygpKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfZ2V0X3ZlbmRvcl9jYXBhYmlsaXRpZXN7Ci0gICAgMHg1MywKLSAgICAweGZkLAotICAgIDB4MDAsCi19OwotVEVTVChIY2lQYWNrZXRzVGVzdCwgdGVzdExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzKSB7Ci0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcoc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4obGVfZ2V0X3ZlbmRvcl9jYXBhYmlsaXRpZXMpKTsKLSAgYXV0byB2aWV3ID0gTGVHZXRWZW5kb3JDYXBhYmlsaXRpZXNWaWV3OjpDcmVhdGUoVmVuZG9yQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotCi0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfZ2V0X3ZlbmRvcl9jYXBhYmlsaXRpZXNfY29tcGxldGV7Ci0gICAgMHgwZSwgMHgwYywgMHgwMSwgMHg1MywgMHhmZCwgMHgwMCwgMHgwNSwgMHgwMSwgMHgwMCwgMHgwNCwgMHg4MCwgMHgwMSwgMHgxMCwgMHgwMSwKLX07Ci1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0TGVHZXRWZW5kb3JDYXBhYmlsaXRpZXNDb21wbGV0ZSkgewotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KAotICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4obGVfZ2V0X3ZlbmRvcl9jYXBhYmlsaXRpZXNfY29tcGxldGUpKTsKLSAgYXV0byB2aWV3ID0KLSAgICAgIExlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzQ29tcGxldGVWaWV3OjpDcmVhdGUoQ29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotCi0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBiYXNlX2NhcGFiaWxpdGllcyA9IHZpZXcuR2V0QmFzZVZlbmRvckNhcGFiaWxpdGllcygpOwotICBBU1NFUlRfRVEoNSwgYmFzZV9jYXBhYmlsaXRpZXMubWF4X2FkdnRfaW5zdGFuY2VzXyk7Ci0gIEFTU0VSVF9FUSgxLCBiYXNlX2NhcGFiaWxpdGllcy5vZmZsb2FkZWRfcmVzb2x1dGlvbl9vZl9wcml2YXRlX2FkZHJlc3NfKTsKLSAgQVNTRVJUX0VRKDEwMjQsIGJhc2VfY2FwYWJpbGl0aWVzLnRvdGFsX3NjYW5fcmVzdWx0c19zdG9yYWdlXyk7Ci0gIEFTU0VSVF9FUSgxMjgsIGJhc2VfY2FwYWJpbGl0aWVzLm1heF9pcmtfbGlzdF9zel8pOwotICBBU1NFUlRfRVEoMSwgYmFzZV9jYXBhYmlsaXRpZXMuZmlsdGVyaW5nX3N1cHBvcnRfKTsKLSAgQVNTRVJUX0VRKDE2LCBiYXNlX2NhcGFiaWxpdGllcy5tYXhfZmlsdGVyXyk7Ci0gIEFTU0VSVF9FUSgxLCBiYXNlX2NhcGFiaWxpdGllcy5hY3Rpdml0eV9lbmVyZ3lfaW5mb19zdXBwb3J0Xyk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3NldF9leHRlbmRlZF9zY2FuX3BhcmFtZXRlcnN7Ci0gICAgMHg0MSwgMHgyMCwgMHgwOCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMSwgMHgxMiwgMHgwMCwgMHgxMiwgMHgwMCwKLX07Ci0KLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnMpIHsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihsZV9zZXRfZXh0ZW5kZWRfc2Nhbl9wYXJhbWV0ZXJzKSk7Ci0gIGF1dG8gdmlldyA9Ci0gICAgICBMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnNWaWV3OjpDcmVhdGUoTGVTY2FubmluZ0NvbW1hbmRWaWV3OjpDcmVhdGUoQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpKTsKLQotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUSgxLCB2aWV3LkdldFNjYW5uaW5nUGh5cygpKTsKLSAgYXV0byBwYXJhbXMgPSB2aWV3LkdldFBhcmFtZXRlcnMoKTsKLSAgQVNTRVJUX0VRKDEsIHBhcmFtcy5zaXplKCkpOwotICBBU1NFUlRfRVEoTGVTY2FuVHlwZTo6QUNUSVZFLCBwYXJhbXNbMF0ubGVfc2Nhbl90eXBlXyk7Ci0gIEFTU0VSVF9FUSgxOCwgcGFyYW1zWzBdLmxlX3NjYW5faW50ZXJ2YWxfKTsKLSAgQVNTRVJUX0VRKDE4LCBwYXJhbXNbMF0ubGVfc2Nhbl93aW5kb3dfKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfc2V0X2V4dGVuZGVkX3NjYW5fcGFyYW1ldGVyc182NTUzewotICAgIDB4NDEsIDB4MjAsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDEsIDB4OTksIDB4MTksIDB4OTksIDB4MTksCi19OwotCi1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0TGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzXzY1NTMpIHsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldygKLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGxlX3NldF9leHRlbmRlZF9zY2FuX3BhcmFtZXRlcnNfNjU1MykpOwotICBhdXRvIHZpZXcgPQotICAgICAgTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzVmlldzo6Q3JlYXRlKExlU2Nhbm5pbmdDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKSk7Ci0KLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoMSwgdmlldy5HZXRTY2FubmluZ1BoeXMoKSk7Ci0gIGF1dG8gcGFyYW1zID0gdmlldy5HZXRQYXJhbWV0ZXJzKCk7Ci0gIEFTU0VSVF9FUSgxLCBwYXJhbXMuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKExlU2NhblR5cGU6OkFDVElWRSwgcGFyYW1zWzBdLmxlX3NjYW5fdHlwZV8pOwotICBBU1NFUlRfRVEoNjU1MywgcGFyYW1zWzBdLmxlX3NjYW5faW50ZXJ2YWxfKTsKLSAgQVNTRVJUX0VRKDY1NTMsIHBhcmFtc1swXS5sZV9zY2FuX3dpbmRvd18pOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9zZXRfZXh0ZW5kZWRfc2Nhbl9lbmFibGV7Ci0gICAgMHg0MiwgMHgyMCwgMHgwNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLX07Ci0KLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZVNldEV4dGVuZGVkU2NhbkVuYWJsZSkgewotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGxlX3NldF9leHRlbmRlZF9zY2FuX2VuYWJsZSkpOwotICBhdXRvIHZpZXcgPQotICAgICAgTGVTZXRFeHRlbmRlZFNjYW5FbmFibGVWaWV3OjpDcmVhdGUoTGVTY2FubmluZ0NvbW1hbmRWaWV3OjpDcmVhdGUoQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpKTsKLQotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShGaWx0ZXJEdXBsaWNhdGVzOjpESVNBQkxFRCwgdmlldy5HZXRGaWx0ZXJEdXBsaWNhdGVzKCkpOwotICBBU1NFUlRfRVEoRW5hYmxlOjpFTkFCTEVELCB2aWV3LkdldEVuYWJsZSgpKTsKLSAgQVNTRVJUX0VRKDAsIHZpZXcuR2V0RHVyYXRpb24oKSk7Ci0gIEFTU0VSVF9FUSgwLCB2aWV3LkdldFBlcmlvZCgpKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfc2V0X2V4dGVuZGVkX3NjYW5fZW5hYmxlX2Rpc2FibGV7Ci0gICAgMHg0MiwgMHgyMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLX07Ci0KLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZVNldEV4dGVuZGVkU2NhbkVuYWJsZURpc2FibGUpIHsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldygKLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGxlX3NldF9leHRlbmRlZF9zY2FuX2VuYWJsZV9kaXNhYmxlKSk7Ci0gIGF1dG8gdmlldyA9Ci0gICAgICBMZVNldEV4dGVuZGVkU2NhbkVuYWJsZVZpZXc6OkNyZWF0ZShMZVNjYW5uaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotCi0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKEZpbHRlckR1cGxpY2F0ZXM6OkVOQUJMRUQsIHZpZXcuR2V0RmlsdGVyRHVwbGljYXRlcygpKTsKLSAgQVNTRVJUX0VRKEVuYWJsZTo6RElTQUJMRUQsIHZpZXcuR2V0RW5hYmxlKCkpOwotICBBU1NFUlRfRVEoMCwgdmlldy5HZXREdXJhdGlvbigpKTsKLSAgQVNTRVJUX0VRKDAsIHZpZXcuR2V0UGVyaW9kKCkpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9leHRlbmRlZF9jcmVhdGVfY29ubmVjdGlvbiA9IHsKLSAgICAweDQzLCAweDIwLCAweDJhLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDA4LAotICAgIDB4MzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwOCwgMHgzMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZUV4dGVuZGVkQ3JlYXRlQ29ubmVjdGlvbikgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihsZV9leHRlbmRlZF9jcmVhdGVfY29ubmVjdGlvbik7Ci0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gTGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoCi0gICAgICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKSkpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19yYW5kb21fYWRkcmVzcyA9IHsKLSAgICAweDM1LCAweDIwLCAweDA3LCAweDAwLCAweDc3LCAweDU4LCAweGViLCAweGQzLCAweDFjLCAweDZlLAotfTsKLQotVEVTVChIY2lQYWNrZXRzVGVzdCwgdGVzdExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3MpIHsKLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4obGVfc2V0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3JhbmRvbV9hZGRyZXNzKTsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzVmlldzo6Q3JlYXRlKAotICAgICAgTGVBZHZlcnRpc2luZ0NvbW1hbmRWaWV3OjpDcmVhdGUoQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpKTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICB1aW50OF90IHJhbmRvbV9hZGRyZXNzX2J5dGVzW10gPSB7MHg3NywgMHg1OCwgMHhlYiwgMHhkMywgMHgxYywgMHg2ZX07Ci0gIEFTU0VSVF9FUSgwLCB2aWV3LkdldEFkdmVydGlzaW5nSGFuZGxlKCkpOwotICBBU1NFUlRfRVEoQWRkcmVzcyhyYW5kb21fYWRkcmVzc19ieXRlcyksIHZpZXcuR2V0QWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzKCkpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9zZXRfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZGF0YXsKLSAgICAweDM3LCAweDIwLCAweDEyLCAweDAwLCAweDAzLCAweDAxLCAweDBlLCAweDAyLCAweDAxLCAweDAyLCAweDBhLAotICAgIDB4MDksIDB4NTAsIDB4NjksIDB4NzgsIDB4NjUsIDB4NmMsIDB4MjAsIDB4MzMsIDB4MjAsIDB4NTgsCi19OwotVEVTVChIY2lQYWNrZXRzVGVzdCwgdGVzdExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGEpIHsKLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4obGVfc2V0X2V4dGVuZGVkX2FkdmVydGlzaW5nX2RhdGEpOwotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGFSYXdWaWV3OjpDcmVhdGUoCi0gICAgICBMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUSgwLCB2aWV3LkdldEFkdmVydGlzaW5nSGFuZGxlKCkpOwotICBBU1NFUlRfRVEoT3BlcmF0aW9uOjpDT01QTEVURV9BRFZFUlRJU0VNRU5ULCB2aWV3LkdldE9wZXJhdGlvbigpKTsKLSAgQVNTRVJUX0VRKEZyYWdtZW50UHJlZmVyZW5jZTo6Q09OVFJPTExFUl9TSE9VTERfTk9ULCB2aWV3LkdldEZyYWdtZW50UHJlZmVyZW5jZSgpKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNpbmdfZGF0YXsKLSAgICAgIDB4MDIsIDB4MDEsIDB4MDIsIDB4MGEsIDB4MDksIDB4NTAsIDB4NjksIDB4NzgsIDB4NjUsIDB4NmMsIDB4MjAsIDB4MzMsIDB4MjAsIDB4NTgsCi0gIH07Ci0gIEFTU0VSVF9FUShhZHZlcnRpc2luZ19kYXRhLCB2aWV3LkdldEFkdmVydGlzaW5nRGF0YSgpKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfc2V0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3BhcmFtZXRlcnNfc2V0XzB7Ci0gICAgMHgzNiwgMHgyMCwgMHgxOSwgMHgwMCwgMHgxMywgMHgwMCwgMHg5MCwgMHgwMSwgMHgwMCwgMHhjMiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMSwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY5LCAweDAxLCAweDAwLCAweDAxLCAweDAxLCAweDAwLAotfTsKLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzTGVnYWN5U2V0MCkgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihsZV9zZXRfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfcGFyYW1ldGVyc19zZXRfMCk7Ci0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc1ZpZXc6OkNyZWF0ZSgKLSAgICAgIExlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKSk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKDAsIHZpZXcuR2V0QWR2ZXJ0aXNpbmdIYW5kbGUoKSk7Ci0gIEFTU0VSVF9FUSg0MDAsIHZpZXcuR2V0UHJpbWFyeUFkdmVydGlzaW5nSW50ZXJ2YWxNaW4oKSk7Ci0gIEFTU0VSVF9FUSg0NTAsIHZpZXcuR2V0UHJpbWFyeUFkdmVydGlzaW5nSW50ZXJ2YWxNYXgoKSk7Ci0gIEFTU0VSVF9FUSgweDcsIHZpZXcuR2V0UHJpbWFyeUFkdmVydGlzaW5nQ2hhbm5lbE1hcCgpKTsKLSAgQVNTRVJUX0VRKE93bkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MsIHZpZXcuR2V0T3duQWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShQZWVyQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywgdmlldy5HZXRQZWVyQWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShBZGRyZXNzOjprRW1wdHksIHZpZXcuR2V0UGVlckFkZHJlc3MoKSk7Ci0gIEFTU0VSVF9FUShBZHZlcnRpc2luZ0ZpbHRlclBvbGljeTo6QUxMX0RFVklDRVMsIHZpZXcuR2V0QWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3koKSk7Ci0gIEFTU0VSVF9FUSgxLCB2aWV3LkdldEFkdmVydGlzaW5nU2lkKCkpOwotICBBU1NFUlRfRVEoRW5hYmxlOjpESVNBQkxFRCwgdmlldy5HZXRTY2FuUmVxdWVzdE5vdGlmaWNhdGlvbkVuYWJsZSgpKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfc2V0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3BhcmFtZXRlcnNfc2V0XzF7Ci0gICAgMHgzNiwgMHgyMCwgMHgxOSwgMHgwMSwgMHgxMywgMHgwMCwgMHg5MCwgMHgwMSwgMHgwMCwgMHhjMiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMSwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY5LCAweDAxLCAweDAwLCAweDAxLCAweDAxLCAweDAwLAotfTsKLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzU2V0MSkgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihsZV9zZXRfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfcGFyYW1ldGVyc19zZXRfMSk7Ci0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc1ZpZXc6OkNyZWF0ZSgKLSAgICAgIExlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKSk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKDEsIHZpZXcuR2V0QWR2ZXJ0aXNpbmdIYW5kbGUoKSk7Ci0gIEFTU0VSVF9FUSg0MDAsIHZpZXcuR2V0UHJpbWFyeUFkdmVydGlzaW5nSW50ZXJ2YWxNaW4oKSk7Ci0gIEFTU0VSVF9FUSg0NTAsIHZpZXcuR2V0UHJpbWFyeUFkdmVydGlzaW5nSW50ZXJ2YWxNYXgoKSk7Ci0gIEFTU0VSVF9FUSgweDcsIHZpZXcuR2V0UHJpbWFyeUFkdmVydGlzaW5nQ2hhbm5lbE1hcCgpKTsKLSAgQVNTRVJUX0VRKE93bkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MsIHZpZXcuR2V0T3duQWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShQZWVyQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywgdmlldy5HZXRQZWVyQWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShBZGRyZXNzOjprRW1wdHksIHZpZXcuR2V0UGVlckFkZHJlc3MoKSk7Ci0gIEFTU0VSVF9FUShBZHZlcnRpc2luZ0ZpbHRlclBvbGljeTo6QUxMX0RFVklDRVMsIHZpZXcuR2V0QWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3koKSk7Ci0gIEFTU0VSVF9FUSgxLCB2aWV3LkdldEFkdmVydGlzaW5nU2lkKCkpOwotICBBU1NFUlRfRVEoRW5hYmxlOjpESVNBQkxFRCwgdmlldy5HZXRTY2FuUmVxdWVzdE5vdGlmaWNhdGlvbkVuYWJsZSgpKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfc2V0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3BhcmFtZXRlcnNfY29tcGxldGV7MHgwZSwgMHgwNSwgMHgwMSwgMHgzNiwgMHgyMCwgMHgwMCwgMHhmNX07Ci1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVyc0NvbXBsZXRlKSB7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGxlX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19wYXJhbWV0ZXJzX2NvbXBsZXRlKTsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzQ29tcGxldGVWaWV3OjpDcmVhdGUoCi0gICAgICBDb21tYW5kQ29tcGxldGVWaWV3OjpDcmVhdGUoRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpKSk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KC0xMSksIHZpZXcuR2V0U2VsZWN0ZWRUeFBvd2VyKCkpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9yZW1vdmVfYWR2ZXJ0aXNpbmdfc2V0XzF7Ci0gICAgMHgzYywKLSAgICAweDIwLAotICAgIDB4MDEsCi0gICAgMHgwMSwKLX07Ci1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0TGVSZW1vdmVBZHZlcnRpc2luZ1NldDEpIHsKLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4obGVfcmVtb3ZlX2FkdmVydGlzaW5nX3NldF8xKTsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPQotICAgICAgTGVSZW1vdmVBZHZlcnRpc2luZ1NldFZpZXc6OkNyZWF0ZShMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUSgxLCB2aWV3LkdldEFkdmVydGlzaW5nSGFuZGxlKCkpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9zZXRfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZGlzYWJsZV8xewotICAgIDB4MzksIDB4MjAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi19OwotVEVTVChIY2lQYWNrZXRzVGVzdCwgdGVzdExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0Rpc2FibGUxKSB7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGxlX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19kaXNhYmxlXzEpOwotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0Rpc2FibGVWaWV3OjpDcmVhdGUoCi0gICAgICBMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSkpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gZGlzYWJsZWRfc2V0ID0gdmlldy5HZXREaXNhYmxlZFNldHMoKTsKLSAgQVNTRVJUX0VRKDEsIGRpc2FibGVkX3NldC5zaXplKCkpOwotICBBU1NFUlRfRVEoMSwgZGlzYWJsZWRfc2V0WzBdLmFkdmVydGlzaW5nX2hhbmRsZV8pOwotfQotCi1URVNUKEhjaVBhY2tldHNUZXN0LCB0ZXN0TGVTZXRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyTGVuZ3RoKSB7Ci0gIEdhcERhdGEgZ2FwX2RhdGE7Ci0gIGdhcF9kYXRhLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZ2FwX2RhdGEuZGF0YV8gPSBzdGQ6OnZlY3Rvcjx1aW50OF90Pih7J0EnLCAnICcsICdnJywgJ28nLCAnbycsICdkJywgJyAnLCAnbicsICdhJywgJ20nLCAnZSd9KTsKLSAgYXV0byBidWlsZGVyID0gTGVTZXRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyOjpDcmVhdGUoe2dhcF9kYXRhfSk7Ci0gIEFTU0VSVF9FUSgyIC8qb3Bjb2RlKi8gKyAxIC8qIHBhcmFtZXRlciBzaXplICovICsgMSAvKiBkYXRhX2xlbmd0aCAqLyArIDMxIC8qIGRhdGEgKi8sIGJ1aWxkZXItPnNpemUoKSk7Ci0KLSAgYXV0byBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBwYWNrZXRfYnl0ZXMtPnJlc2VydmUoYnVpbGRlci0+c2l6ZSgpKTsKLSAgQml0SW5zZXJ0ZXIgYml0X2luc2VydGVyKCpwYWNrZXRfYnl0ZXMpOwotICBidWlsZGVyLT5TZXJpYWxpemUoYml0X2luc2VydGVyKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4ocGFja2V0X2J5dGVzKSkpOwotICBBU1NFUlRfVFJVRShjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKDEgLyogZGF0YV9sZW5ndGggKi8gKyAzMSAvKiBkYXRhICovLCBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLnNpemUoKSk7Ci0gIGF1dG8gdmlldyA9IExlU2V0QWR2ZXJ0aXNpbmdEYXRhVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLX0KLQotVEVTVChIY2lQYWNrZXRzVGVzdCwgdGVzdExlU2V0U2NhblJlc3BvbnNlRGF0YUJ1aWxkZXJMZW5ndGgpIHsKLSAgR2FwRGF0YSBnYXBfZGF0YTsKLSAgZ2FwX2RhdGEuZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICBnYXBfZGF0YS5kYXRhXyA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHsnQScsICcgJywgJ2cnLCAnbycsICdvJywgJ2QnLCAnICcsICduJywgJ2EnLCAnbScsICdlJ30pOwotICBhdXRvIGJ1aWxkZXIgPSBMZVNldFNjYW5SZXNwb25zZURhdGFCdWlsZGVyOjpDcmVhdGUoe2dhcF9kYXRhfSk7Ci0gIEFTU0VSVF9FUSgyIC8qb3Bjb2RlKi8gKyAxIC8qIHBhcmFtZXRlciBzaXplICovICsgMSAvKmRhdGFfbGVuZ3RoICovICsgMzEgLyogZGF0YSAqLywgYnVpbGRlci0+c2l6ZSgpKTsKLQotICBhdXRvIHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIHBhY2tldF9ieXRlcy0+cmVzZXJ2ZShidWlsZGVyLT5zaXplKCkpOwotICBCaXRJbnNlcnRlciBiaXRfaW5zZXJ0ZXIoKnBhY2tldF9ieXRlcyk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IExlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPihwYWNrZXRfYnl0ZXMpKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoMSAvKiBkYXRhX2xlbmd0aCAqLyArIDMxIC8qIGRhdGEgKi8sIGNvbW1hbmRfdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpKTsKLSAgYXV0byB2aWV3ID0gTGVTZXRTY2FuUmVzcG9uc2VEYXRhVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLX0KLQotVEVTVChIY2lQYWNrZXRzVGVzdCwgdGVzdExlTXVsdGlBZHZTZXRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyTGVuZ3RoKSB7Ci0gIEdhcERhdGEgZ2FwX2RhdGE7Ci0gIGdhcF9kYXRhLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZ2FwX2RhdGEuZGF0YV8gPSBzdGQ6OnZlY3Rvcjx1aW50OF90Pih7J0EnLCAnICcsICdnJywgJ28nLCAnbycsICdkJywgJyAnLCAnbicsICdhJywgJ20nLCAnZSd9KTsKLSAgdWludDhfdCBzZXQgPSAzOwotICBhdXRvIGJ1aWxkZXIgPSBMZU11bHRpQWR2dFNldERhdGFCdWlsZGVyOjpDcmVhdGUoe2dhcF9kYXRhfSwgc2V0KTsKLQotICBhdXRvIHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIHBhY2tldF9ieXRlcy0+cmVzZXJ2ZShidWlsZGVyLT5zaXplKCkpOwotICBCaXRJbnNlcnRlciBiaXRfaW5zZXJ0ZXIoKnBhY2tldF9ieXRlcyk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IExlTXVsdGlBZHZ0U2V0RGF0YVZpZXc6OkNyZWF0ZShMZU11bHRpQWR2dFZpZXc6OkNyZWF0ZSgKLSAgICAgIExlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKENvbW1hbmRWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPihwYWNrZXRfYnl0ZXMpKSkpKTsKLSAgQVNTRVJUX1RSVUUoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gdmlldyA9IExlTXVsdGlBZHZ0U2V0RGF0YVZpZXc6OkNyZWF0ZShjb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuR2V0QWR2ZXJ0aXNpbmdEYXRhKCkuc2l6ZSgpID4gMCk7Ci0gIEFTU0VSVF9FUSh2aWV3LkdldEFkdmVydGlzaW5nRGF0YSgpWzBdLmRhdGFfLCBnYXBfZGF0YS5kYXRhXyk7Ci0gIEFTU0VSVF9FUSh2aWV3LkdldEFkdmVydGlzaW5nSW5zdGFuY2UoKSwgMyk7Ci19Ci0KLVRFU1QoSGNpUGFja2V0c1Rlc3QsIHRlc3RMZU11bHRpQWR2U2V0U2NhblJlc3BvbnNlRGF0YUJ1aWxkZXJMZW5ndGgpIHsKLSAgR2FwRGF0YSBnYXBfZGF0YTsKLSAgZ2FwX2RhdGEuZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICBnYXBfZGF0YS5kYXRhXyA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHsnQScsICcgJywgJ2cnLCAnbycsICdvJywgJ2QnLCAnICcsICduJywgJ2EnLCAnbScsICdlJ30pOwotICB1aW50OF90IHNldCA9IDM7Ci0gIGF1dG8gYnVpbGRlciA9IExlTXVsdGlBZHZ0U2V0U2NhblJlc3BCdWlsZGVyOjpDcmVhdGUoe2dhcF9kYXRhfSwgc2V0KTsKLQotICBhdXRvIHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIHBhY2tldF9ieXRlcy0+cmVzZXJ2ZShidWlsZGVyLT5zaXplKCkpOwotICBCaXRJbnNlcnRlciBiaXRfaW5zZXJ0ZXIoKnBhY2tldF9ieXRlcyk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9IExlTXVsdGlBZHZ0U2V0U2NhblJlc3BWaWV3OjpDcmVhdGUoTGVNdWx0aUFkdnRWaWV3OjpDcmVhdGUoCi0gICAgICBMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShDb21tYW5kVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4ocGFja2V0X2J5dGVzKSkpKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHZpZXcgPSBMZU11bHRpQWR2dFNldFNjYW5SZXNwVmlldzo6Q3JlYXRlKGNvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKHZpZXcuR2V0QWR2ZXJ0aXNpbmdEYXRhKClbMF0uZGF0YV8sIGdhcF9kYXRhLmRhdGFfKTsKLSAgQVNTRVJUX0VRKHZpZXcuR2V0QWR2ZXJ0aXNpbmdJbnN0YW5jZSgpLCAzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2xlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZS5oIGIvZ2QvaGNpL2xlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjFhOTQ4Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9sZV9hY2xfY29ubmVjdGlvbl9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2NvbW1hbmRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNvbnN0ZXhwciBTdWJldmVudENvZGUgTGVDb25uZWN0aW9uTWFuYWdlbWVudEV2ZW50c1tdID0gewotICAgIFN1YmV2ZW50Q29kZTo6Q09OTkVDVElPTl9DT01QTEVURSwKLSAgICBTdWJldmVudENvZGU6OkVOSEFOQ0VEX0NPTk5FQ1RJT05fQ09NUExFVEUsCi0gICAgU3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX1VQREFURV9DT01QTEVURSwKLSAgICBTdWJldmVudENvZGU6OlBIWV9VUERBVEVfQ09NUExFVEUsCi0gICAgU3ViZXZlbnRDb2RlOjpEQVRBX0xFTkdUSF9DSEFOR0UsCi0gICAgU3ViZXZlbnRDb2RlOjpSRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVCwKLX07Ci0KLXR5cGVkZWYgQ29tbWFuZEludGVyZmFjZTxBY2xDb21tYW5kQnVpbGRlcj4gTGVBY2xDb25uZWN0aW9uSW50ZXJmYWNlOwotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmNjIGIvZ2QvaGNpL2xlX2FkZHJlc3NfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiM2VjNi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy9yYW5kLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBCTEVfQUREUl9NQVNLID0gMHhjMHU7Ci0KLUxlQWRkcmVzc01hbmFnZXI6OkxlQWRkcmVzc01hbmFnZXIoCi0gICAgY29tbW9uOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4pPiBlbnF1ZXVlX2NvbW1hbmQsCi0gICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsCi0gICAgQWRkcmVzcyBwdWJsaWNfYWRkcmVzcywKLSAgICB1aW50OF90IGNvbm5lY3RfbGlzdF9zaXplLAotICAgIHVpbnQ4X3QgcmVzb2x2aW5nX2xpc3Rfc2l6ZSkKLSAgICA6IGVucXVldWVfY29tbWFuZF8oZW5xdWV1ZV9jb21tYW5kKSwKLSAgICAgIGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgcHVibGljX2FkZHJlc3NfKHB1YmxpY19hZGRyZXNzKSwKLSAgICAgIGNvbm5lY3RfbGlzdF9zaXplXyhjb25uZWN0X2xpc3Rfc2l6ZSksCi0gICAgICByZXNvbHZpbmdfbGlzdF9zaXplXyhyZXNvbHZpbmdfbGlzdF9zaXplKXt9OwotCi1MZUFkZHJlc3NNYW5hZ2VyOjp+TGVBZGRyZXNzTWFuYWdlcigpIHsKLSAgaWYgKGFkZHJlc3Nfcm90YXRpb25fYWxhcm1fICE9IG51bGxwdHIpIHsKLSAgICBhZGRyZXNzX3JvdGF0aW9uX2FsYXJtXy0+Q2FuY2VsKCk7Ci0gICAgYWRkcmVzc19yb3RhdGlvbl9hbGFybV8ucmVzZXQoKTsKLSAgfQotfQotCi0vLyBBYm9ydHMgaWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCi12b2lkIExlQWRkcmVzc01hbmFnZXI6OlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKAotICAgIEFkZHJlc3NQb2xpY3kgYWRkcmVzc19wb2xpY3ksCi0gICAgQWRkcmVzc1dpdGhUeXBlIGZpeGVkX2FkZHJlc3MsCi0gICAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcm90YXRpb25faXJrLAotICAgIGJvb2wgc3VwcG9ydHNfYmxlX3ByaXZhY3ksCi0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsCi0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpIHsKLSAgQVNTRVJUKGFkZHJlc3NfcG9saWN5XyA9PSBBZGRyZXNzUG9saWN5OjpQT0xJQ1lfTk9UX1NFVCk7Ci0gIEFTU0VSVChhZGRyZXNzX3BvbGljeSAhPSBBZGRyZXNzUG9saWN5OjpQT0xJQ1lfTk9UX1NFVCk7Ci0gIEFTU0VSVF9MT0cocmVnaXN0ZXJlZF9jbGllbnRzXy5lbXB0eSgpLCAiUG9saWN5IG11c3QgYmUgc2V0IGJlZm9yZSBjbGllbnRzIGFyZSByZWdpc3RlcmVkLiIpOwotICBhZGRyZXNzX3BvbGljeV8gPSBhZGRyZXNzX3BvbGljeTsKLSAgc3VwcG9ydHNfYmxlX3ByaXZhY3lfID0gc3VwcG9ydHNfYmxlX3ByaXZhY3k7Ci0gIExPR19JTkZPKCJTZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcyB3aXRoIHBvbGljeSAlZCIsIGFkZHJlc3NfcG9saWN5KTsKLQotICBzd2l0Y2ggKGFkZHJlc3NfcG9saWN5XykgewotICAgIGNhc2UgQWRkcmVzc1BvbGljeTo6VVNFX1BVQkxJQ19BRERSRVNTOgotICAgICAgbGVfYWRkcmVzc18gPSBBZGRyZXNzV2l0aFR5cGUocHVibGljX2FkZHJlc3NfLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgICAgIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZMZUFkZHJlc3NNYW5hZ2VyOjpyZXN1bWVfcmVnaXN0ZXJlZF9jbGllbnRzKS5JbnZva2UoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWRkcmVzc1BvbGljeTo6VVNFX1NUQVRJQ19BRERSRVNTOiB7Ci0gICAgICBhdXRvIGFkZHIgPSBmaXhlZF9hZGRyZXNzLkdldEFkZHJlc3MoKTsKLSAgICAgIGF1dG8gYWRkcmVzcyA9IGFkZHIuYWRkcmVzczsKLSAgICAgIC8vIFRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBzdGF0aWMgYWRkcmVzcyBzaGFsbCBiZSBlcXVhbCB0byAxCi0gICAgICBBU1NFUlRfTE9HKChhZGRyZXNzWzVdICYgQkxFX0FERFJfTUFTSykgPT0gQkxFX0FERFJfTUFTSywgIlRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIHNoYWxsIGJlIGVxdWFsIHRvIDEiKTsKLSAgICAgIC8vIEJpdHMgb2YgdGhlIHJhbmRvbSBwYXJ0IG9mIHRoZSBhZGRyZXNzIHNoYWxsIG5vdCBiZSBhbGwgMSBvciBhbGwgMAotICAgICAgaWYgKChhZGRyZXNzWzBdID09IDB4MDAgJiYgYWRkcmVzc1sxXSA9PSAweDAwICYmIGFkZHJlc3NbMl0gPT0gMHgwMCAmJiBhZGRyZXNzWzNdID09IDB4MDAgJiYgYWRkcmVzc1s0XSA9PSAweDAwICYmCi0gICAgICAgICAgIGFkZHJlc3NbNV0gPT0gQkxFX0FERFJfTUFTSykgfHwKLSAgICAgICAgICAoYWRkcmVzc1swXSA9PSAweEZGICYmIGFkZHJlc3NbMV0gPT0gMHhGRiAmJiBhZGRyZXNzWzJdID09IDB4RkYgJiYgYWRkcmVzc1szXSA9PSAweEZGICYmIGFkZHJlc3NbNF0gPT0gMHhGRiAmJgotICAgICAgICAgICBhZGRyZXNzWzVdID09IDB4RkYpKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkJpdHMgb2YgdGhlIHJhbmRvbSBwYXJ0IG9mIHRoZSBhZGRyZXNzIHNoYWxsIG5vdCBiZSBhbGwgMSBvciBhbGwgMCIpOwotICAgICAgfQotICAgICAgbGVfYWRkcmVzc18gPSBmaXhlZF9hZGRyZXNzOwotICAgICAgYXV0byBwYWNrZXQgPSBoY2k6OkxlU2V0UmFuZG9tQWRkcmVzc0J1aWxkZXI6OkNyZWF0ZShsZV9hZGRyZXNzXy5HZXRBZGRyZXNzKCkpOwotICAgICAgaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShlbnF1ZXVlX2NvbW1hbmRfLCBzdGQ6Om1vdmUocGFja2V0KSkpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUzoKLSAgICBjYXNlIEFkZHJlc3NQb2xpY3k6OlVTRV9SRVNPTFZBQkxFX0FERFJFU1M6Ci0gICAgICBsZV9hZGRyZXNzXyA9IGZpeGVkX2FkZHJlc3M7Ci0gICAgICByb3RhdGlvbl9pcmtfID0gcm90YXRpb25faXJrOwotICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lXyA9IG1pbmltdW1fcm90YXRpb25fdGltZTsKLSAgICAgIG1heGltdW1fcm90YXRpb25fdGltZV8gPSBtYXhpbXVtX3JvdGF0aW9uX3RpbWU7Ci0gICAgICBhZGRyZXNzX3JvdGF0aW9uX2FsYXJtXyA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkFsYXJtPihoYW5kbGVyXyk7Ci0gICAgICBzZXRfcmFuZG9tX2FkZHJlc3MoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWRkcmVzc1BvbGljeTo6UE9MSUNZX05PVF9TRVQ6Ci0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIHBhcmFtZXRlcnMiKTsKLSAgfQotfQotCi0vLyBUT0RPKGpwYXdsb3dza2kpOiByZW1vdmUgb25jZSB3ZSBoYXZlIGNvbmZpZyBmaWxlIGFic3RyYWN0aW9uIGluIGNlcnQgdGVzdHMKLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6U2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3NGb3JUZXN0KAotICAgIEFkZHJlc3NQb2xpY3kgYWRkcmVzc19wb2xpY3ksCi0gICAgQWRkcmVzc1dpdGhUeXBlIGZpeGVkX2FkZHJlc3MsCi0gICAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcm90YXRpb25faXJrLAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWF4aW11bV9yb3RhdGlvbl90aW1lKSB7Ci0gIEFTU0VSVChhZGRyZXNzX3BvbGljeSAhPSBBZGRyZXNzUG9saWN5OjpQT0xJQ1lfTk9UX1NFVCk7Ci0gIEFTU0VSVF9MT0cocmVnaXN0ZXJlZF9jbGllbnRzXy5lbXB0eSgpLCAiUG9saWN5IG11c3QgYmUgc2V0IGJlZm9yZSBjbGllbnRzIGFyZSByZWdpc3RlcmVkLiIpOwotICBhZGRyZXNzX3BvbGljeV8gPSBhZGRyZXNzX3BvbGljeTsKLQotICBzd2l0Y2ggKGFkZHJlc3NfcG9saWN5XykgewotICAgIGNhc2UgQWRkcmVzc1BvbGljeTo6VVNFX1BVQkxJQ19BRERSRVNTOgotICAgICAgbGVfYWRkcmVzc18gPSBmaXhlZF9hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBZGRyZXNzUG9saWN5OjpVU0VfU1RBVElDX0FERFJFU1M6IHsKLSAgICAgIGF1dG8gYWRkciA9IGZpeGVkX2FkZHJlc3MuR2V0QWRkcmVzcygpOwotICAgICAgYXV0byBhZGRyZXNzID0gYWRkci5hZGRyZXNzOwotICAgICAgLy8gVGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHN0YXRpYyBhZGRyZXNzIHNoYWxsIGJlIGVxdWFsIHRvIDEKLSAgICAgIEFTU0VSVF9MT0coKGFkZHJlc3NbNV0gJiBCTEVfQUREUl9NQVNLKSA9PSBCTEVfQUREUl9NQVNLLCAiVGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMgc2hhbGwgYmUgZXF1YWwgdG8gMSIpOwotICAgICAgLy8gQml0cyBvZiB0aGUgcmFuZG9tIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc2hhbGwgbm90IGJlIGFsbCAxIG9yIGFsbCAwCi0gICAgICBpZiAoKGFkZHJlc3NbMF0gPT0gMHgwMCAmJiBhZGRyZXNzWzFdID09IDB4MDAgJiYgYWRkcmVzc1syXSA9PSAweDAwICYmIGFkZHJlc3NbM10gPT0gMHgwMCAmJiBhZGRyZXNzWzRdID09IDB4MDAgJiYKLSAgICAgICAgICAgYWRkcmVzc1s1XSA9PSBCTEVfQUREUl9NQVNLKSB8fAotICAgICAgICAgIChhZGRyZXNzWzBdID09IDB4RkYgJiYgYWRkcmVzc1sxXSA9PSAweEZGICYmIGFkZHJlc3NbMl0gPT0gMHhGRiAmJiBhZGRyZXNzWzNdID09IDB4RkYgJiYgYWRkcmVzc1s0XSA9PSAweEZGICYmCi0gICAgICAgICAgIGFkZHJlc3NbNV0gPT0gMHhGRikpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQml0cyBvZiB0aGUgcmFuZG9tIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc2hhbGwgbm90IGJlIGFsbCAxIG9yIGFsbCAwIik7Ci0gICAgICB9Ci0gICAgICBsZV9hZGRyZXNzXyA9IGZpeGVkX2FkZHJlc3M7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6TGVTZXRSYW5kb21BZGRyZXNzQnVpbGRlcjo6Q3JlYXRlKGxlX2FkZHJlc3NfLkdldEFkZHJlc3MoKSk7Ci0gICAgICBoYW5kbGVyXy0+Q2FsbChlbnF1ZXVlX2NvbW1hbmRfLCBzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFkZHJlc3NQb2xpY3k6OlVTRV9OT05fUkVTT0xWQUJMRV9BRERSRVNTOgotICAgIGNhc2UgQWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUzoKLSAgICAgIHJvdGF0aW9uX2lya18gPSByb3RhdGlvbl9pcms7Ci0gICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWVfID0gbWluaW11bV9yb3RhdGlvbl90aW1lOwotICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lXyA9IG1heGltdW1fcm90YXRpb25fdGltZTsKLSAgICAgIGFkZHJlc3Nfcm90YXRpb25fYWxhcm1fID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6QWxhcm0+KGhhbmRsZXJfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWRkcmVzc1BvbGljeTo6UE9MSUNZX05PVF9TRVQ6Ci0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIHBhcmFtZXRlcnMiKTsKLSAgfQotfQotTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeSBMZUFkZHJlc3NNYW5hZ2VyOjpHZXRBZGRyZXNzUG9saWN5KCkgewotICByZXR1cm4gYWRkcmVzc19wb2xpY3lfOwotfQotCi1MZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IExlQWRkcmVzc01hbmFnZXI6OlJlZ2lzdGVyKExlQWRkcmVzc01hbmFnZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkxlQWRkcmVzc01hbmFnZXI6OnJlZ2lzdGVyX2NsaWVudCwgY2FsbGJhY2spLkludm9rZSgpOwotICByZXR1cm4gYWRkcmVzc19wb2xpY3lfOwotfQotCi12b2lkIExlQWRkcmVzc01hbmFnZXI6OnJlZ2lzdGVyX2NsaWVudChMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIHJlZ2lzdGVyZWRfY2xpZW50c18uaW5zZXJ0KHN0ZDo6cGFpcjxMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqLCBDbGllbnRTdGF0ZT4oY2FsbGJhY2ssIENsaWVudFN0YXRlOjpSRVNVTUVEKSk7Ci0gIGlmIChhZGRyZXNzX3BvbGljeV8gPT0gQWRkcmVzc1BvbGljeTo6UE9MSUNZX05PVF9TRVQpIHsKLSAgICBMT0dfSU5GTygiYWRkcmVzcyBwb2xpY3kgaXNuJ3Qgc2V0IHlldCwgcGF1c2UgY2xpZW50cyBhbmQgcmV0dXJuIik7Ci0gICAgcGF1c2VfcmVnaXN0ZXJlZF9jbGllbnRzKCk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKAotICAgICAgYWRkcmVzc19wb2xpY3lfID09IEFkZHJlc3NQb2xpY3k6OlVTRV9SRVNPTFZBQkxFX0FERFJFU1MgfHwKLSAgICAgIGFkZHJlc3NfcG9saWN5XyA9PSBBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgIGlmIChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfYWNsX2lzX2VuYWJsZWQoKSB8fCBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfbDJjYXBfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICBpZiAocmVnaXN0ZXJlZF9jbGllbnRzXy5zaXplKCkgPT0gMSkgewotICAgICAgICBzY2hlZHVsZV9yb3RhdGVfcmFuZG9tX2FkZHJlc3MoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJlcGFyZV90b19yb3RhdGUoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBMZUFkZHJlc3NNYW5hZ2VyOjpVbnJlZ2lzdGVyKExlQWRkcmVzc01hbmFnZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkxlQWRkcmVzc01hbmFnZXI6OnVucmVnaXN0ZXJfY2xpZW50LCBjYWxsYmFjaykuSW52b2tlKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6dW5yZWdpc3Rlcl9jbGllbnQoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjaykgewotICByZWdpc3RlcmVkX2NsaWVudHNfLmVyYXNlKGNhbGxiYWNrKTsKLSAgaWYgKHJlZ2lzdGVyZWRfY2xpZW50c18uZW1wdHkoKSAmJiBhZGRyZXNzX3JvdGF0aW9uX2FsYXJtXyAhPSBudWxscHRyKSB7Ci0gICAgYWRkcmVzc19yb3RhdGlvbl9hbGFybV8tPkNhbmNlbCgpOwotICB9Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6QWNrUGF1c2UoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjaykgewotICBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmTGVBZGRyZXNzTWFuYWdlcjo6YWNrX3BhdXNlLCBjYWxsYmFjaykuSW52b2tlKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6QWNrUmVzdW1lKExlQWRkcmVzc01hbmFnZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkxlQWRkcmVzc01hbmFnZXI6OmFja19yZXN1bWUsIGNhbGxiYWNrKS5JbnZva2UoKTsKLX0KLQotQWRkcmVzc1dpdGhUeXBlIExlQWRkcmVzc01hbmFnZXI6OkdldEN1cnJlbnRBZGRyZXNzKCkgewotICBBU1NFUlQoYWRkcmVzc19wb2xpY3lfICE9IEFkZHJlc3NQb2xpY3k6OlBPTElDWV9OT1RfU0VUKTsKLSAgcmV0dXJuIGxlX2FkZHJlc3NfOwotfQotCi1BZGRyZXNzV2l0aFR5cGUgTGVBZGRyZXNzTWFuYWdlcjo6R2V0QW5vdGhlckFkZHJlc3MoKSB7Ci0gIEFTU0VSVCgKLSAgICAgIGFkZHJlc3NfcG9saWN5XyA9PSBBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUyB8fAotICAgICAgYWRkcmVzc19wb2xpY3lfID09IEFkZHJlc3NQb2xpY3k6OlVTRV9SRVNPTFZBQkxFX0FERFJFU1MpOwotICBoY2k6OkFkZHJlc3MgYWRkcmVzcyA9IGdlbmVyYXRlX3JwYSgpOwotICBhdXRvIHJhbmRvbV9hZGRyZXNzID0gQWRkcmVzc1dpdGhUeXBlKGFkZHJlc3MsIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICByZXR1cm4gcmFuZG9tX2FkZHJlc3M7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6cGF1c2VfcmVnaXN0ZXJlZF9jbGllbnRzKCkgewotICBmb3IgKGF1dG8mIGNsaWVudCA6IHJlZ2lzdGVyZWRfY2xpZW50c18pIHsKLSAgICBpZiAoY2xpZW50LnNlY29uZCAhPSBDbGllbnRTdGF0ZTo6UEFVU0VEICYmIGNsaWVudC5zZWNvbmQgIT0gQ2xpZW50U3RhdGU6OldBSVRJTkdfRk9SX1BBVVNFKSB7Ci0gICAgICBjbGllbnQuc2Vjb25kID0gQ2xpZW50U3RhdGU6OldBSVRJTkdfRk9SX1BBVVNFOwotICAgICAgY2xpZW50LmZpcnN0LT5PblBhdXNlKCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6cHVzaF9jb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotICBwYXVzZV9yZWdpc3RlcmVkX2NsaWVudHMoKTsKLSAgY2FjaGVkX2NvbW1hbmRzXy5wdXNoKHN0ZDo6bW92ZShjb21tYW5kKSk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6YWNrX3BhdXNlKExlQWRkcmVzc01hbmFnZXJDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgQVNTRVJUKHJlZ2lzdGVyZWRfY2xpZW50c18uZmluZChjYWxsYmFjaykgIT0gcmVnaXN0ZXJlZF9jbGllbnRzXy5lbmQoKSk7Ci0gIHJlZ2lzdGVyZWRfY2xpZW50c18uZmluZChjYWxsYmFjayktPnNlY29uZCA9IENsaWVudFN0YXRlOjpQQVVTRUQ7Ci0gIGZvciAoYXV0byBjbGllbnQgOiByZWdpc3RlcmVkX2NsaWVudHNfKSB7Ci0gICAgaWYgKGNsaWVudC5zZWNvbmQgIT0gQ2xpZW50U3RhdGU6OlBBVVNFRCkgewotICAgICAgLy8gbWFrZSBzdXJlIGFsbCBjbGllbnQgcGF1c2VkCi0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgaWYgKGFkZHJlc3NfcG9saWN5XyAhPSBBZGRyZXNzUG9saWN5OjpQT0xJQ1lfTk9UX1NFVCkgewotICAgIGhhbmRsZV9uZXh0X2NvbW1hbmQoKTsKLSAgfQotfQotCi12b2lkIExlQWRkcmVzc01hbmFnZXI6OnJlc3VtZV9yZWdpc3RlcmVkX2NsaWVudHMoKSB7Ci0gIC8vIERvIG5vdCByZXN1bWUgY2xpZW50cyBpZiBjYWNoZWQgY29tbWFuZCBpcyBub3QgZW1wdHkKLSAgaWYgKCFjYWNoZWRfY29tbWFuZHNfLmVtcHR5KCkpIHsKLSAgICBoYW5kbGVfbmV4dF9jb21tYW5kKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChhdXRvJiBjbGllbnQgOiByZWdpc3RlcmVkX2NsaWVudHNfKSB7Ci0gICAgY2xpZW50LnNlY29uZCA9IENsaWVudFN0YXRlOjpXQUlUSU5HX0ZPUl9SRVNVTUU7Ci0gICAgY2xpZW50LmZpcnN0LT5PblJlc3VtZSgpOwotICB9Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6YWNrX3Jlc3VtZShMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gIEFTU0VSVChyZWdpc3RlcmVkX2NsaWVudHNfLmZpbmQoY2FsbGJhY2spICE9IHJlZ2lzdGVyZWRfY2xpZW50c18uZW5kKCkpOwotICByZWdpc3RlcmVkX2NsaWVudHNfLmZpbmQoY2FsbGJhY2spLT5zZWNvbmQgPSBDbGllbnRTdGF0ZTo6UkVTVU1FRDsKLX0KLQotdm9pZCBMZUFkZHJlc3NNYW5hZ2VyOjpwcmVwYXJlX3RvX3JvdGF0ZSgpIHsKLSAgQ29tbWFuZCBjb21tYW5kID0ge0NvbW1hbmRUeXBlOjpST1RBVEVfUkFORE9NX0FERFJFU1MsIG51bGxwdHJ9OwotICBjYWNoZWRfY29tbWFuZHNfLnB1c2goc3RkOjptb3ZlKGNvbW1hbmQpKTsKLSAgcGF1c2VfcmVnaXN0ZXJlZF9jbGllbnRzKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6c2NoZWR1bGVfcm90YXRlX3JhbmRvbV9hZGRyZXNzKCkgewotICBhZGRyZXNzX3JvdGF0aW9uX2FsYXJtXy0+U2NoZWR1bGUoCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZMZUFkZHJlc3NNYW5hZ2VyOjpwcmVwYXJlX3RvX3JvdGF0ZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIEdldE5leHRQcml2YXRlQWRkcmVzc0ludGVydmFsTXMoKSk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6c2V0X3JhbmRvbV9hZGRyZXNzKCkgewotICBpZiAoYWRkcmVzc19wb2xpY3lfICE9IEFkZHJlc3NQb2xpY3k6OlVTRV9SRVNPTFZBQkxFX0FERFJFU1MgJiYKLSAgICAgIGFkZHJlc3NfcG9saWN5XyAhPSBBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgYWRkcmVzcyBwb2xpY3khIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaGNpOjpBZGRyZXNzIGFkZHJlc3M7Ci0gIGlmIChhZGRyZXNzX3BvbGljeV8gPT0gQWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgIGFkZHJlc3MgPSBnZW5lcmF0ZV9ycGEoKTsKLSAgfSBlbHNlIHsKLSAgICBhZGRyZXNzID0gZ2VuZXJhdGVfbnJwYSgpOwotICB9Ci0gIGF1dG8gcGFja2V0ID0gaGNpOjpMZVNldFJhbmRvbUFkZHJlc3NCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcyk7Ci0gIGVucXVldWVfY29tbWFuZF8uUnVuKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgY2FjaGVkX2FkZHJlc3NfID0gQWRkcmVzc1dpdGhUeXBlKGFkZHJlc3MsIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotfQotCi12b2lkIExlQWRkcmVzc01hbmFnZXI6OnJvdGF0ZV9yYW5kb21fYWRkcmVzcygpIHsKLSAgaWYgKGFkZHJlc3NfcG9saWN5XyAhPSBBZGRyZXNzUG9saWN5OjpVU0VfUkVTT0xWQUJMRV9BRERSRVNTICYmCi0gICAgICBhZGRyZXNzX3BvbGljeV8gIT0gQWRkcmVzc1BvbGljeTo6VVNFX05PTl9SRVNPTFZBQkxFX0FERFJFU1MpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIGFkZHJlc3MgcG9saWN5ISIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNjaGVkdWxlX3JvdGF0ZV9yYW5kb21fYWRkcmVzcygpOwotICBzZXRfcmFuZG9tX2FkZHJlc3MoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgUmVzb2x2YWJsZSBQcml2YXRlIEFkZHJlc3MgKFJQQSkgZnJvbSBJZGVudGl0eQotICogUmVzb2x2aW5nIEtleSB8aXJrfCBhbmQgfHByYW5kfCovCi1oY2k6OkFkZHJlc3MgTGVBZGRyZXNzTWFuYWdlcjo6Z2VuZXJhdGVfcnBhKCkgewotICAvLyBtb3N0IHNpZ25pZmljYW50IGJpdCwgYml0NywgYml0NiBpcyAwMSB0byBiZSByZXNvbHZhYmxlIHJhbmRvbQotICAvLyBCaXRzIG9mIHRoZSByYW5kb20gcGFydCBvZiBwcmFuZCBzaGFsbCBub3QgYmUgYWxsIDEgb3IgYWxsIDAKLSAgc3RkOjphcnJheTx1aW50OF90LCAzPiBwcmFuZCA9IG9zOjpHZW5lcmF0ZVJhbmRvbTwzPigpOwotICBjb25zdGV4cHIgdWludDhfdCBCTEVfUkVTT0xWRV9BRERSX01TQiA9IDB4NDA7Ci0gIHByYW5kWzJdICY9IH5CTEVfQUREUl9NQVNLOwotICBpZiAoKHByYW5kWzBdID09IDB4MDAgJiYgcHJhbmRbMV0gPT0gMHgwMCAmJiBwcmFuZFsyXSA9PSAweDAwKSB8fAotICAgICAgKHByYW5kWzBdID09IDB4RkYgJiYgcHJhbmRbMV0gPT0gMHhGRiAmJiBwcmFuZFsyXSA9PSAweDNGKSkgewotICAgIHByYW5kWzBdID0gKHVpbnQ4X3QpKG9zOjpHZW5lcmF0ZVJhbmRvbSgpICUgMHhGRSArIDEpOwotICB9Ci0gIHByYW5kWzJdIHw9IEJMRV9SRVNPTFZFX0FERFJfTVNCOwotCi0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzOwotICBhZGRyZXNzLmFkZHJlc3NbM10gPSBwcmFuZFswXTsKLSAgYWRkcmVzcy5hZGRyZXNzWzRdID0gcHJhbmRbMV07Ci0gIGFkZHJlc3MuYWRkcmVzc1s1XSA9IHByYW5kWzJdOwotCi0gIC8qIGVuY3J5cHQgd2l0aCBJUksgKi8KLSAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcCA9IGNyeXB0b190b29sYm94OjphZXNfMTI4KHJvdGF0aW9uX2lya18sIHByYW5kLmRhdGEoKSwgMyk7Ci0KLSAgLyogc2V0IGhhc2ggdG8gYmUgTFNCIG9mIHJwQWRkcmVzcyAqLwotICBhZGRyZXNzLmFkZHJlc3NbMF0gPSBwWzBdOwotICBhZGRyZXNzLmFkZHJlc3NbMV0gPSBwWzFdOwotICBhZGRyZXNzLmFkZHJlc3NbMl0gPSBwWzJdOwotICByZXR1cm4gYWRkcmVzczsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgTk9OLVJlc29sdmFibGUgUHJpdmF0ZSBBZGRyZXNzIChOUlBBKQotaGNpOjpBZGRyZXNzIExlQWRkcmVzc01hbmFnZXI6OmdlbmVyYXRlX25ycGEoKSB7Ci0gIC8vIFRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhZGRyZXNzIHNoYWxsIGJlIGVxdWFsIHRvIDAKLSAgLy8gQml0cyBvZiB0aGUgcmFuZG9tIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc2hhbGwgbm90IGJlIGFsbCAxIG9yIGFsbCAwCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgNj4gcmFuZG9tID0gb3M6OkdlbmVyYXRlUmFuZG9tPDY+KCk7Ci0gIHJhbmRvbVs1XSAmPSB+QkxFX0FERFJfTUFTSzsKLSAgaWYgKChyYW5kb21bMF0gPT0gMHgwMCAmJiByYW5kb21bMV0gPT0gMHgwMCAmJiByYW5kb21bMl0gPT0gMHgwMCAmJiByYW5kb21bM10gPT0gMHgwMCAmJiByYW5kb21bNF0gPT0gMHgwMCAmJgotICAgICAgIHJhbmRvbVs1XSA9PSAweDAwKSB8fAotICAgICAgKHJhbmRvbVswXSA9PSAweEZGICYmIHJhbmRvbVsxXSA9PSAweEZGICYmIHJhbmRvbVsyXSA9PSAweEZGICYmIHJhbmRvbVszXSA9PSAweEZGICYmIHJhbmRvbVs0XSA9PSAweEZGICYmCi0gICAgICAgcmFuZG9tWzVdID09IDB4M0YpKSB7Ci0gICAgcmFuZG9tWzBdID0gKHVpbnQ4X3QpKG9zOjpHZW5lcmF0ZVJhbmRvbSgpICUgMHhGRSArIDEpOwotICB9Ci0KLSAgaGNpOjpBZGRyZXNzIGFkZHJlc3M7Ci0gIGFkZHJlc3MuRnJvbU9jdGV0cyhyYW5kb20uZGF0YSgpKTsKLQotICAvLyB0aGUgYWRkcmVzcyBzaGFsbCBub3QgYmUgZXF1YWwgdG8gdGhlIHB1YmxpYyBhZGRyZXNzCi0gIHdoaWxlIChhZGRyZXNzID09IHB1YmxpY19hZGRyZXNzXykgewotICAgIGFkZHJlc3MuYWRkcmVzc1swXSA9ICh1aW50OF90KShvczo6R2VuZXJhdGVSYW5kb20oKSAlIDB4RkUgKyAxKTsKLSAgfQotCi0gIHJldHVybiBhZGRyZXNzOwotfQotCi1zdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIExlQWRkcmVzc01hbmFnZXI6OkdldE5leHRQcml2YXRlQWRkcmVzc0ludGVydmFsTXMoKSB7Ci0gIGF1dG8gaW50ZXJ2YWxfcmFuZG9tX3BhcnRfbWF4X21zID0gbWF4aW11bV9yb3RhdGlvbl90aW1lXyAtIG1pbmltdW1fcm90YXRpb25fdGltZV87Ci0gIGF1dG8gcmFuZG9tX21zID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhvczo6R2VuZXJhdGVSYW5kb20oKSkgJSAoaW50ZXJ2YWxfcmFuZG9tX3BhcnRfbWF4X21zKTsKLSAgcmV0dXJuIG1pbmltdW1fcm90YXRpb25fdGltZV8gKyByYW5kb21fbXM7Ci19Ci0KLXVpbnQ4X3QgTGVBZGRyZXNzTWFuYWdlcjo6R2V0Q29ubmVjdExpc3RTaXplKCkgewotICByZXR1cm4gY29ubmVjdF9saXN0X3NpemVfOwotfQotCi11aW50OF90IExlQWRkcmVzc01hbmFnZXI6OkdldFJlc29sdmluZ0xpc3RTaXplKCkgewotICByZXR1cm4gcmVzb2x2aW5nX2xpc3Rfc2l6ZV87Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6aGFuZGxlX25leHRfY29tbWFuZCgpIHsKLSAgZm9yIChhdXRvIGNsaWVudCA6IHJlZ2lzdGVyZWRfY2xpZW50c18pIHsKLSAgICBpZiAoY2xpZW50LnNlY29uZCAhPSBDbGllbnRTdGF0ZTo6UEFVU0VEKSB7Ci0gICAgICAvLyBtYWtlIHN1cmUgYWxsIGNsaWVudCBwYXVzZWQsIGlmIG5vdCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHRyaWdnZXIgYWdhaW4gYnkgYWNrX3BhdXNlCi0gICAgICBMT0dfSU5GTygid2FpdGluZyBmb3IgYWNrX3BhdXNlLCByZXR1cm4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBBU1NFUlQoIWNhY2hlZF9jb21tYW5kc18uZW1wdHkoKSk7Ci0gIGF1dG8gY29tbWFuZCA9IHN0ZDo6bW92ZShjYWNoZWRfY29tbWFuZHNfLmZyb250KCkpOwotICBjYWNoZWRfY29tbWFuZHNfLnBvcCgpOwotCi0gIGlmIChjb21tYW5kLmNvbW1hbmRfdHlwZSA9PSBDb21tYW5kVHlwZTo6Uk9UQVRFX1JBTkRPTV9BRERSRVNTKSB7Ci0gICAgcm90YXRlX3JhbmRvbV9hZGRyZXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgZW5xdWV1ZV9jb21tYW5kXy5SdW4oc3RkOjptb3ZlKGNvbW1hbmQuY29tbWFuZF9wYWNrZXQpKTsKLSAgfQotfQotCi12b2lkIExlQWRkcmVzc01hbmFnZXI6OkFkZERldmljZVRvQ29ubmVjdExpc3QoCi0gICAgQ29ubmVjdExpc3RBZGRyZXNzVHlwZSBjb25uZWN0X2xpc3RfYWRkcmVzc190eXBlLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyZXNzKSB7Ci0gIGF1dG8gcGFja2V0X2J1aWxkZXIgPSBoY2k6OkxlQWRkRGV2aWNlVG9Db25uZWN0TGlzdEJ1aWxkZXI6OkNyZWF0ZShjb25uZWN0X2xpc3RfYWRkcmVzc190eXBlLCBhZGRyZXNzKTsKLSAgQ29tbWFuZCBjb21tYW5kID0ge0NvbW1hbmRUeXBlOjpBRERfREVWSUNFX1RPX0NPTk5FQ1RfTElTVCwgc3RkOjptb3ZlKHBhY2tldF9idWlsZGVyKX07Ci0gIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZMZUFkZHJlc3NNYW5hZ2VyOjpwdXNoX2NvbW1hbmQsIHN0ZDo6bW92ZShjb21tYW5kKSkuSW52b2tlKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6QWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KAotICAgIFBlZXJBZGRyZXNzVHlwZSBwZWVyX2lkZW50aXR5X2FkZHJlc3NfdHlwZSwKLSAgICBBZGRyZXNzIHBlZXJfaWRlbnRpdHlfYWRkcmVzcywKLSAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgcGVlcl9pcmssCi0gICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGxvY2FsX2lyaykgewotICAvLyBEaXNhYmxlIEFkZHJlc3MgcmVzb2x1dGlvbgotICBhdXRvIGRpc2FibGVfYnVpbGRlciA9IGhjaTo6TGVTZXRBZGRyZXNzUmVzb2x1dGlvbkVuYWJsZUJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVuYWJsZTo6RElTQUJMRUQpOwotICBDb21tYW5kIGRpc2FibGUgPSB7Q29tbWFuZFR5cGU6OlNFVF9BRERSRVNTX1JFU09MVVRJT05fRU5BQkxFLCBzdGQ6Om1vdmUoZGlzYWJsZV9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoZGlzYWJsZSkpOwotCi0gIGF1dG8gcGFja2V0X2J1aWxkZXIgPSBoY2k6OkxlQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcGVlcl9pZGVudGl0eV9hZGRyZXNzX3R5cGUsIHBlZXJfaWRlbnRpdHlfYWRkcmVzcywgcGVlcl9pcmssIGxvY2FsX2lyayk7Ci0gIENvbW1hbmQgY29tbWFuZCA9IHtDb21tYW5kVHlwZTo6QUREX0RFVklDRV9UT19SRVNPTFZJTkdfTElTVCwgc3RkOjptb3ZlKHBhY2tldF9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoY29tbWFuZCkpOwotCi0gIGlmIChzdXBwb3J0c19ibGVfcHJpdmFjeV8pIHsKLSAgICBhdXRvIHBhY2tldF9idWlsZGVyID0KLSAgICAgICAgaGNpOjpMZVNldFByaXZhY3lNb2RlQnVpbGRlcjo6Q3JlYXRlKHBlZXJfaWRlbnRpdHlfYWRkcmVzc190eXBlLCBwZWVyX2lkZW50aXR5X2FkZHJlc3MsIFByaXZhY3lNb2RlOjpERVZJQ0UpOwotICAgIENvbW1hbmQgY29tbWFuZCA9IHtDb21tYW5kVHlwZTo6TEVfU0VUX1BSSVZBQ1lfTU9ERSwgc3RkOjptb3ZlKHBhY2tldF9idWlsZGVyKX07Ci0gICAgY2FjaGVkX2NvbW1hbmRzXy5wdXNoKHN0ZDo6bW92ZShjb21tYW5kKSk7Ci0gIH0KLQotICAvLyBFbmFibGUgQWRkcmVzcyByZXNvbHV0aW9uCi0gIGF1dG8gZW5hYmxlX2J1aWxkZXIgPSBoY2k6OkxlU2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGVCdWlsZGVyOjpDcmVhdGUoaGNpOjpFbmFibGU6OkVOQUJMRUQpOwotICBDb21tYW5kIGVuYWJsZSA9IHtDb21tYW5kVHlwZTo6U0VUX0FERFJFU1NfUkVTT0xVVElPTl9FTkFCTEUsIHN0ZDo6bW92ZShlbmFibGVfYnVpbGRlcil9OwotICBjYWNoZWRfY29tbWFuZHNfLnB1c2goc3RkOjptb3ZlKGVuYWJsZSkpOwotCi0gIHBhdXNlX3JlZ2lzdGVyZWRfY2xpZW50cygpOwotfQotCi12b2lkIExlQWRkcmVzc01hbmFnZXI6OlJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdCgKLSAgICBDb25uZWN0TGlzdEFkZHJlc3NUeXBlIGNvbm5lY3RfbGlzdF9hZGRyZXNzX3R5cGUsIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIGFkZHJlc3MpIHsKLSAgYXV0byBwYWNrZXRfYnVpbGRlciA9IGhjaTo6TGVSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3RCdWlsZGVyOjpDcmVhdGUoY29ubmVjdF9saXN0X2FkZHJlc3NfdHlwZSwgYWRkcmVzcyk7Ci0gIENvbW1hbmQgY29tbWFuZCA9IHtDb21tYW5kVHlwZTo6UkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVCwgc3RkOjptb3ZlKHBhY2tldF9idWlsZGVyKX07Ci0gIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZMZUFkZHJlc3NNYW5hZ2VyOjpwdXNoX2NvbW1hbmQsIHN0ZDo6bW92ZShjb21tYW5kKSkuSW52b2tlKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6UmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3QoCi0gICAgUGVlckFkZHJlc3NUeXBlIHBlZXJfaWRlbnRpdHlfYWRkcmVzc190eXBlLCBBZGRyZXNzIHBlZXJfaWRlbnRpdHlfYWRkcmVzcykgewotICAvLyBEaXNhYmxlIEFkZHJlc3MgcmVzb2x1dGlvbgotICBhdXRvIGRpc2FibGVfYnVpbGRlciA9IGhjaTo6TGVTZXRBZGRyZXNzUmVzb2x1dGlvbkVuYWJsZUJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVuYWJsZTo6RElTQUJMRUQpOwotICBDb21tYW5kIGRpc2FibGUgPSB7Q29tbWFuZFR5cGU6OlNFVF9BRERSRVNTX1JFU09MVVRJT05fRU5BQkxFLCBzdGQ6Om1vdmUoZGlzYWJsZV9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoZGlzYWJsZSkpOwotCi0gIGF1dG8gcGFja2V0X2J1aWxkZXIgPQotICAgICAgaGNpOjpMZVJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0QnVpbGRlcjo6Q3JlYXRlKHBlZXJfaWRlbnRpdHlfYWRkcmVzc190eXBlLCBwZWVyX2lkZW50aXR5X2FkZHJlc3MpOwotICBDb21tYW5kIGNvbW1hbmQgPSB7Q29tbWFuZFR5cGU6OlJFTU9WRV9ERVZJQ0VfRlJPTV9SRVNPTFZJTkdfTElTVCwgc3RkOjptb3ZlKHBhY2tldF9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoY29tbWFuZCkpOwotCi0gIC8vIEVuYWJsZSBBZGRyZXNzIHJlc29sdXRpb24KLSAgYXV0byBlbmFibGVfYnVpbGRlciA9IGhjaTo6TGVTZXRBZGRyZXNzUmVzb2x1dGlvbkVuYWJsZUJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVuYWJsZTo6RU5BQkxFRCk7Ci0gIENvbW1hbmQgZW5hYmxlID0ge0NvbW1hbmRUeXBlOjpTRVRfQUREUkVTU19SRVNPTFVUSU9OX0VOQUJMRSwgc3RkOjptb3ZlKGVuYWJsZV9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoZW5hYmxlKSk7Ci0KLSAgcGF1c2VfcmVnaXN0ZXJlZF9jbGllbnRzKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6Q2xlYXJDb25uZWN0TGlzdCgpIHsKLSAgYXV0byBwYWNrZXRfYnVpbGRlciA9IGhjaTo6TGVDbGVhckNvbm5lY3RMaXN0QnVpbGRlcjo6Q3JlYXRlKCk7Ci0gIENvbW1hbmQgY29tbWFuZCA9IHtDb21tYW5kVHlwZTo6Q0xFQVJfQ09OTkVDVF9MSVNULCBzdGQ6Om1vdmUocGFja2V0X2J1aWxkZXIpfTsKLSAgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkxlQWRkcmVzc01hbmFnZXI6OnB1c2hfY29tbWFuZCwgc3RkOjptb3ZlKGNvbW1hbmQpKS5JbnZva2UoKTsKLX0KLQotdm9pZCBMZUFkZHJlc3NNYW5hZ2VyOjpDbGVhclJlc29sdmluZ0xpc3QoKSB7Ci0gIC8vIERpc2FibGUgQWRkcmVzcyByZXNvbHV0aW9uCi0gIGF1dG8gZGlzYWJsZV9idWlsZGVyID0gaGNpOjpMZVNldEFkZHJlc3NSZXNvbHV0aW9uRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKGhjaTo6RW5hYmxlOjpESVNBQkxFRCk7Ci0gIENvbW1hbmQgZGlzYWJsZSA9IHtDb21tYW5kVHlwZTo6U0VUX0FERFJFU1NfUkVTT0xVVElPTl9FTkFCTEUsIHN0ZDo6bW92ZShkaXNhYmxlX2J1aWxkZXIpfTsKLSAgY2FjaGVkX2NvbW1hbmRzXy5wdXNoKHN0ZDo6bW92ZShkaXNhYmxlKSk7Ci0KLSAgYXV0byBwYWNrZXRfYnVpbGRlciA9IGhjaTo6TGVDbGVhclJlc29sdmluZ0xpc3RCdWlsZGVyOjpDcmVhdGUoKTsKLSAgQ29tbWFuZCBjb21tYW5kID0ge0NvbW1hbmRUeXBlOjpDTEVBUl9SRVNPTFZJTkdfTElTVCwgc3RkOjptb3ZlKHBhY2tldF9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoY29tbWFuZCkpOwotCi0gIC8vIEVuYWJsZSBBZGRyZXNzIHJlc29sdXRpb24KLSAgYXV0byBlbmFibGVfYnVpbGRlciA9IGhjaTo6TGVTZXRBZGRyZXNzUmVzb2x1dGlvbkVuYWJsZUJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVuYWJsZTo6RU5BQkxFRCk7Ci0gIENvbW1hbmQgZW5hYmxlID0ge0NvbW1hbmRUeXBlOjpTRVRfQUREUkVTU19SRVNPTFVUSU9OX0VOQUJMRSwgc3RkOjptb3ZlKGVuYWJsZV9idWlsZGVyKX07Ci0gIGNhY2hlZF9jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUoZW5hYmxlKSk7Ci0KLSAgcGF1c2VfcmVnaXN0ZXJlZF9jbGllbnRzKCk7Ci19Ci0KLXZvaWQgTGVBZGRyZXNzTWFuYWdlcjo6T25Db21tYW5kQ29tcGxldGUoYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICBpZiAoIXZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGggaW52YWxpZCBwYWNrZXQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjpzdHJpbmcgb3BfY29kZSA9IE9wQ29kZVRleHQodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpOwotICBMT0dfSU5GTygiUmVjZWl2ZWQgY29tbWFuZCBjb21wbGV0ZSB3aXRoIG9wX2NvZGUgJXMiLCBvcF9jb2RlLmNfc3RyKCkpOwotCi0gIC8vIFRoZSBjb21tYW5kIHdhcyBzZW50IGJlZm9yZSBhbnkgY2xpZW50IHJlZ2lzdGVyZWQsIHdlIGNhbiBtYWtlIHN1cmUgYWxsIHRoZSBjbGllbnRzIHBhdXNlZCB3aGVuIGNvbW1hbmQgY29tcGxldGUuCi0gIGlmICh2aWV3LkdldENvbW1hbmRPcENvZGUoKSA9PSBPcENvZGU6OkxFX1NFVF9SQU5ET01fQUREUkVTUykgewotICAgIGlmIChhZGRyZXNzX3BvbGljeV8gPT0gQWRkcmVzc1BvbGljeTo6VVNFX1NUQVRJQ19BRERSRVNTKSB7Ci0gICAgICBMT0dfSU5GTygiUmVjZWl2ZWQgTEVfU0VUX1JBTkRPTV9BRERSRVNTIGNvbXBsZXRlIGFuZCBBZGRyZXNzIHBvbGljeSBpcyBVU0VfU1RBVElDX0FERFJFU1MsIHJldHVybiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVNldFJhbmRvbUFkZHJlc3NDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBpZiAoIWNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIExFX1NFVF9SQU5ET01fQUREUkVTUyBjb21wbGV0ZSB3aXRoIGludmFsaWQgcGFja2V0Iik7Ci0gICAgfSBlbHNlIGlmIChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSAmJiBjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJSZWNlaXZlZCBMRV9TRVRfUkFORE9NX0FERFJFU1MgY29tcGxldGUgd2l0aCBzdGF0dXMgJXMiLCBFcnJvckNvZGVUZXh0KGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfSU5GTygidXBkYXRlIHJhbmRvbSBhZGRyZXNzIDogJXMiLCBjYWNoZWRfYWRkcmVzc18uR2V0QWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBsZV9hZGRyZXNzXyA9IGNhY2hlZF9hZGRyZXNzXzsKLSAgICB9Ci0gIH0KLQotICBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmTGVBZGRyZXNzTWFuYWdlcjo6Y2hlY2tfY2FjaGVkX2NvbW1hbmRzKS5JbnZva2UoKTsKLX0KLQotdm9pZCBMZUFkZHJlc3NNYW5hZ2VyOjpjaGVja19jYWNoZWRfY29tbWFuZHMoKSB7Ci0gIGZvciAoYXV0byBjbGllbnQgOiByZWdpc3RlcmVkX2NsaWVudHNfKSB7Ci0gICAgaWYgKGNsaWVudC5zZWNvbmQgIT0gQ2xpZW50U3RhdGU6OlBBVVNFRCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIGlmIChjYWNoZWRfY29tbWFuZHNfLmVtcHR5KCkpIHsKLSAgICByZXN1bWVfcmVnaXN0ZXJlZF9jbGllbnRzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgaGFuZGxlX25leHRfY29tbWFuZCgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9sZV9hZGRyZXNzX21hbmFnZXIuaCBiL2dkL2hjaS9sZV9hZGRyZXNzX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhYTExZi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJvcy9hbGFybS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jbGFzcyBMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+TGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIHZvaWQgT25QYXVzZSgpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVzdW1lKCkgPSAwOwotfTsKLQotY2xhc3MgTGVBZGRyZXNzTWFuYWdlciB7Ci0gcHVibGljOgotICBMZUFkZHJlc3NNYW5hZ2VyKAotICAgICAgY29tbW9uOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4pPiBlbnF1ZXVlX2NvbW1hbmQsCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgIEFkZHJlc3MgcHVibGljX2FkZHJlc3MsCi0gICAgICB1aW50OF90IGNvbm5lY3RfbGlzdF9zaXplLAotICAgICAgdWludDhfdCByZXNvbHZpbmdfbGlzdF9zaXplKTsKLSAgdmlydHVhbCB+TGVBZGRyZXNzTWFuYWdlcigpOwotCi0gIGVudW0gQWRkcmVzc1BvbGljeSB7Ci0gICAgUE9MSUNZX05PVF9TRVQsCi0gICAgVVNFX1BVQkxJQ19BRERSRVNTLAotICAgIFVTRV9TVEFUSUNfQUREUkVTUywKLSAgICBVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUywKLSAgICBVU0VfUkVTT0xWQUJMRV9BRERSRVNTCi0gIH07Ci0KLSAgLy8gQWJvcnRzIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZQotICB2b2lkIFNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKAotICAgICAgQWRkcmVzc1BvbGljeSBhZGRyZXNzX3BvbGljeSwKLSAgICAgIEFkZHJlc3NXaXRoVHlwZSBmaXhlZF9hZGRyZXNzLAotICAgICAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcm90YXRpb25faXJrLAotICAgICAgYm9vbCBzdXBwb3J0c19ibGVfcHJpdmFjeSwKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotICAvLyBUT0RPKGpwYXdsb3dza2kpOiByZW1vdmUgb25jZSB3ZSBoYXZlIGNvbmZpZyBmaWxlIGFic3RyYWN0aW9uIGluIGNlcnQgdGVzdHMKLSAgdm9pZCBTZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzc0ZvclRlc3QoCi0gICAgICBBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgICAgQWRkcmVzc1dpdGhUeXBlIGZpeGVkX2FkZHJlc3MsCi0gICAgICBjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNiByb3RhdGlvbl9pcmssCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWF4aW11bV9yb3RhdGlvbl90aW1lKTsKLSAgQWRkcmVzc1BvbGljeSBHZXRBZGRyZXNzUG9saWN5KCk7Ci0gIHZvaWQgQWNrUGF1c2UoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjayk7Ci0gIHZvaWQgQWNrUmVzdW1lKExlQWRkcmVzc01hbmFnZXJDYWxsYmFjayogY2FsbGJhY2spOwotICB2aXJ0dWFsIEFkZHJlc3NQb2xpY3kgUmVnaXN0ZXIoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjayk7Ci0gIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyKExlQWRkcmVzc01hbmFnZXJDYWxsYmFjayogY2FsbGJhY2spOwotICB2aXJ0dWFsIEFkZHJlc3NXaXRoVHlwZSBHZXRDdXJyZW50QWRkcmVzcygpOyAgLy8gV2hhdCB3YXMgc2V0IGluIFNldFJhbmRvbUFkZHJlc3MoKQotICB2aXJ0dWFsIEFkZHJlc3NXaXRoVHlwZSBHZXRBbm90aGVyQWRkcmVzcygpOyAgLy8gQSBuZXcgcmFuZG9tIGFkZHJlc3Mgd2l0aG91dCByb3RhdGluZy4KLQotICB1aW50OF90IEdldENvbm5lY3RMaXN0U2l6ZSgpOwotICB1aW50OF90IEdldFJlc29sdmluZ0xpc3RTaXplKCk7Ci0gIHZvaWQgQWRkRGV2aWNlVG9Db25uZWN0TGlzdChDb25uZWN0TGlzdEFkZHJlc3NUeXBlIGNvbm5lY3RfbGlzdF9hZGRyZXNzX3R5cGUsIEFkZHJlc3MgYWRkcmVzcyk7Ci0gIHZvaWQgQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KAotICAgICAgUGVlckFkZHJlc3NUeXBlIHBlZXJfaWRlbnRpdHlfYWRkcmVzc190eXBlLAotICAgICAgQWRkcmVzcyBwZWVyX2lkZW50aXR5X2FkZHJlc3MsCi0gICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgcGVlcl9pcmssCi0gICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgbG9jYWxfaXJrKTsKLSAgdm9pZCBSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3QoQ29ubmVjdExpc3RBZGRyZXNzVHlwZSBjb25uZWN0X2xpc3RfYWRkcmVzc190eXBlLCBBZGRyZXNzIGFkZHJlc3MpOwotICB2b2lkIFJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KFBlZXJBZGRyZXNzVHlwZSBwZWVyX2lkZW50aXR5X2FkZHJlc3NfdHlwZSwgQWRkcmVzcyBwZWVyX2lkZW50aXR5X2FkZHJlc3MpOwotICB2b2lkIENsZWFyQ29ubmVjdExpc3QoKTsKLSAgdm9pZCBDbGVhclJlc29sdmluZ0xpc3QoKTsKLSAgdm9pZCBPbkNvbW1hbmRDb21wbGV0ZShDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpOwotICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIEdldE5leHRQcml2YXRlQWRkcmVzc0ludGVydmFsTXMoKTsKLQotIHByaXZhdGU6Ci0gIGVudW0gQ2xpZW50U3RhdGUgewotICAgIFdBSVRJTkdfRk9SX1BBVVNFLAotICAgIFBBVVNFRCwKLSAgICBXQUlUSU5HX0ZPUl9SRVNVTUUsCi0gICAgUkVTVU1FRCwKLSAgfTsKLQotICBlbnVtIENvbW1hbmRUeXBlIHsKLSAgICBST1RBVEVfUkFORE9NX0FERFJFU1MsCi0gICAgQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QsCi0gICAgUkVNT1ZFX0RFVklDRV9GUk9NX0NPTk5FQ1RfTElTVCwKLSAgICBDTEVBUl9DT05ORUNUX0xJU1QsCi0gICAgQUREX0RFVklDRV9UT19SRVNPTFZJTkdfTElTVCwKLSAgICBSRU1PVkVfREVWSUNFX0ZST01fUkVTT0xWSU5HX0xJU1QsCi0gICAgQ0xFQVJfUkVTT0xWSU5HX0xJU1QsCi0gICAgU0VUX0FERFJFU1NfUkVTT0xVVElPTl9FTkFCTEUsCi0gICAgTEVfU0VUX1BSSVZBQ1lfTU9ERQotICB9OwotCi0gIHN0cnVjdCBDb21tYW5kIHsKLSAgICBDb21tYW5kVHlwZSBjb21tYW5kX3R5cGU7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kX3BhY2tldDsKLSAgfTsKLQotICB2b2lkIHBhdXNlX3JlZ2lzdGVyZWRfY2xpZW50cygpOwotICB2b2lkIHB1c2hfY29tbWFuZChDb21tYW5kIGNvbW1hbmQpOwotICB2b2lkIGFja19wYXVzZShMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqIGNhbGxiYWNrKTsKLSAgdm9pZCByZXN1bWVfcmVnaXN0ZXJlZF9jbGllbnRzKCk7Ci0gIHZvaWQgYWNrX3Jlc3VtZShMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqIGNhbGxiYWNrKTsKLSAgdm9pZCByZWdpc3Rlcl9jbGllbnQoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjayk7Ci0gIHZvaWQgdW5yZWdpc3Rlcl9jbGllbnQoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjayk7Ci0gIHZvaWQgcHJlcGFyZV90b19yb3RhdGUoKTsKLSAgdm9pZCByb3RhdGVfcmFuZG9tX2FkZHJlc3MoKTsKLSAgdm9pZCBzY2hlZHVsZV9yb3RhdGVfcmFuZG9tX2FkZHJlc3MoKTsKLSAgdm9pZCBzZXRfcmFuZG9tX2FkZHJlc3MoKTsKLSAgaGNpOjpBZGRyZXNzIGdlbmVyYXRlX3JwYSgpOwotICBoY2k6OkFkZHJlc3MgZ2VuZXJhdGVfbnJwYSgpOwotICB2b2lkIGhhbmRsZV9uZXh0X2NvbW1hbmQoKTsKLSAgdm9pZCBjaGVja19jYWNoZWRfY29tbWFuZHMoKTsKLQotICBjb21tb246OkNhbGxiYWNrPHZvaWQoc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPik+IGVucXVldWVfY29tbWFuZF87Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgc3RkOjptYXA8TGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiwgQ2xpZW50U3RhdGU+IHJlZ2lzdGVyZWRfY2xpZW50c187Ci0KLSAgQWRkcmVzc1BvbGljeSBhZGRyZXNzX3BvbGljeV8gPSBBZGRyZXNzUG9saWN5OjpQT0xJQ1lfTk9UX1NFVDsKLSAgQWRkcmVzc1dpdGhUeXBlIGxlX2FkZHJlc3NfOwotICBBZGRyZXNzV2l0aFR5cGUgY2FjaGVkX2FkZHJlc3NfOwotICBBZGRyZXNzIHB1YmxpY19hZGRyZXNzXzsKLSAgc3RkOjp1bmlxdWVfcHRyPG9zOjpBbGFybT4gYWRkcmVzc19yb3RhdGlvbl9hbGFybV87Ci0gIGNyeXB0b190b29sYm94OjpPY3RldDE2IHJvdGF0aW9uX2lya187Ci0gIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lXzsKLSAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWVfOwotICB1aW50OF90IGNvbm5lY3RfbGlzdF9zaXplXzsKLSAgdWludDhfdCByZXNvbHZpbmdfbGlzdF9zaXplXzsKLSAgc3RkOjpxdWV1ZTxDb21tYW5kPiBjYWNoZWRfY29tbWFuZHNfOwotICBib29sIHN1cHBvcnRzX2JsZV9wcml2YWN5X3tmYWxzZX07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfYWRkcmVzc19tYW5hZ2VyX3Rlc3QuY2MgYi9nZC9oY2kvbGVfYWRkcmVzc19tYW5hZ2VyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODUyMzMuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2xlX2FkZHJlc3NfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotdXNpbmcgOjpibHVldG9vdGg6OmNyeXB0b190b29sYm94OjpPY3RldDE2OwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpUaHJlYWQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXVzaW5nIHBhY2tldDo6a0xpdHRsZUVuZGlhbjsKLXVzaW5nIHBhY2tldDo6UGFja2V0VmlldzsKLXVzaW5nIHBhY2tldDo6UmF3QnVpbGRlcjsKLQotUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBHZXRQYWNrZXRWaWV3KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGkoKmJ5dGVzKTsKLSAgYnl0ZXMtPnJlc2VydmUocGFja2V0LT5zaXplKCkpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpKTsKLSAgcmV0dXJuIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KGJ5dGVzKTsKLX0KLQotY2xhc3MgVGVzdEhjaUxheWVyIDogcHVibGljIEhjaUxheWVyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4gb25fY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIGNvbW1hbmRfcXVldWVfLnB1c2goc3RkOjptb3ZlKGNvbW1hbmQpKTsKLSAgICBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKG9uX2NvbXBsZXRlKSk7Ci0gICAgaWYgKGNvbW1hbmRfcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgY29tbWFuZF9wcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgICBjb21tYW5kX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTZXRDb21tYW5kRnV0dXJlKCkgewotICAgIEFTU0VSVF9MT0coY29tbWFuZF9wcm9taXNlXyA9PSBudWxscHRyLCAiUHJvbWlzZXMsIFByb21pc2VzLCAuLi4gT25seSBvbmUgYXQgYSB0aW1lLiIpOwotICAgIGNvbW1hbmRfcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTx2b2lkPj4oKTsKLSAgICBjb21tYW5kX2Z1dHVyZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6ZnV0dXJlPHZvaWQ+Pihjb21tYW5kX3Byb21pc2VfLT5nZXRfZnV0dXJlKCkpOwotICB9Ci0KLSAgQ29tbWFuZFZpZXcgR2V0TGFzdENvbW1hbmQoKSB7Ci0gICAgaWYgKGNvbW1hbmRfcXVldWVfLnNpemUoKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gQ29tbWFuZFZpZXc6OkNyZWF0ZShQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpKTsKLSAgICB9Ci0gICAgYXV0byBsYXN0ID0gc3RkOjptb3ZlKGNvbW1hbmRfcXVldWVfLmZyb250KCkpOwotICAgIGNvbW1hbmRfcXVldWVfLnBvcCgpOwotICAgIHJldHVybiBDb21tYW5kVmlldzo6Q3JlYXRlKEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3QpKSk7Ci0gIH0KLQotICBDb21tYW5kVmlldyBHZXRDb21tYW5kKE9wQ29kZSBvcF9jb2RlKSB7Ci0gICAgaWYgKCFjb21tYW5kX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgICAgaWYgKGNvbW1hbmRfZnV0dXJlXyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNvbW1hbmRfZnV0dXJlXy5yZXNldCgpOwotICAgICAgICBjb21tYW5kX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb21tYW5kX2Z1dHVyZV8gIT0gbnVsbHB0cikgewotICAgICAgYXV0byByZXN1bHQgPSBjb21tYW5kX2Z1dHVyZV8tPndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCkpOwotICAgICAgRVhQRUNUX05FKHN0ZDo6ZnV0dXJlX3N0YXR1czo6dGltZW91dCwgcmVzdWx0KTsKLSAgICB9Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBBU1NFUlRfTE9HKAotICAgICAgICAhY29tbWFuZF9xdWV1ZV8uZW1wdHkoKSwgIkV4cGVjdGluZyBjb21tYW5kICVzIGJ1dCBjb21tYW5kIHF1ZXVlIHdhcyBlbXB0eSIsIE9wQ29kZVRleHQob3BfY29kZSkuY19zdHIoKSk7Ci0gICAgQ29tbWFuZFZpZXcgY29tbWFuZF9wYWNrZXRfdmlldyA9IEdldExhc3RDb21tYW5kKCk7Ci0gICAgRVhQRUNUX1RSVUUoY29tbWFuZF9wYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEVYUEVDVF9FUShjb21tYW5kX3BhY2tldF92aWV3LkdldE9wQ29kZSgpLCBvcF9jb2RlKTsKLSAgICByZXR1cm4gY29tbWFuZF9wYWNrZXRfdmlldzsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdFdmVudChzdGQ6OnVuaXF1ZV9wdHI8RXZlbnRCdWlsZGVyPiBldmVudF9idWlsZGVyKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShldmVudF9idWlsZGVyKSk7Ci0gICAgRXZlbnRWaWV3IGV2ZW50ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfVFJVRShldmVudC5Jc1ZhbGlkKCkpOwotICAgIENvbW1hbmRDb21wbGV0ZUNhbGxiYWNrKGV2ZW50KTsKLSAgfQotCi0gIHZvaWQgQ29tbWFuZENvbXBsZXRlQ2FsbGJhY2soRXZlbnRWaWV3IGV2ZW50KSB7Ci0gICAgQ29tbWFuZENvbXBsZXRlVmlldyBjb21wbGV0ZV92aWV3ID0gQ29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlRfVFJVRShjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2tzLmZyb250KCkpLkludm9rZShjb21wbGV0ZV92aWV3KTsKLSAgICBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5wb3BfZnJvbnQoKTsKLSAgfQotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7fQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLQotIHByaXZhdGU6Ci0gIHN0ZDo6bGlzdDxjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4+IGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2tzOwotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4+IGNvbW1hbmRfcXVldWVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBjb21tYW5kX3Byb21pc2VfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpmdXR1cmU8dm9pZD4+IGNvbW1hbmRfZnV0dXJlXzsKLSAgbXV0YWJsZSBzdGQ6Om11dGV4IG11dGV4XzsKLX07Ci0KLWNsYXNzIFJvdGF0b3JDbGllbnQgOiBwdWJsaWMgTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIFJvdGF0b3JDbGllbnQoTGVBZGRyZXNzTWFuYWdlciogbGVfYWRkcmVzc19tYW5hZ2VyLCBzaXplX3QgaWQpIDogbGVfYWRkcmVzc19tYW5hZ2VyXyhsZV9hZGRyZXNzX21hbmFnZXIpLCBpZF8oaWQpe307Ci0KLSAgdm9pZCBPblBhdXNlKCkgewotICAgIHBhdXNlZCA9IHRydWU7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWNrUGF1c2UodGhpcyk7Ci0gIH0KLQotICB2b2lkIE9uUmVzdW1lKCkgewotICAgIHBhdXNlZCA9IGZhbHNlOwotICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkFja1Jlc3VtZSh0aGlzKTsKLSAgICBpZiAocmVzdW1lX3Byb21pc2VfICE9IG51bGxwdHIpIHsKLSAgICAgIHJlc3VtZV9wcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgICByZXN1bWVfcHJvbWlzZV8ucmVzZXQoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdhaXRGb3JSZXN1bWUoKSB7Ci0gICAgaWYgKHBhdXNlZCkgewotICAgICAgcmVzdW1lX3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgICBhdXRvIHJlc3VtZV9mdXR1cmUgPSByZXN1bWVfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgICAgIGF1dG8gcmVzdWx0ID0gcmVzdW1lX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKTsKLSAgICAgIEVYUEVDVF9ORShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnRpbWVvdXQsIHJlc3VsdCk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBwYXVzZWR7ZmFsc2V9OwotICBMZUFkZHJlc3NNYW5hZ2VyKiBsZV9hZGRyZXNzX21hbmFnZXJfOwotICBzaXplX3QgaWRfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiByZXN1bWVfcHJvbWlzZV87Ci19OwotCi1jbGFzcyBMZUFkZHJlc3NNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBIYW5kbGVyKHRocmVhZF8pOwotICAgIHRlc3RfaGNpX2xheWVyXyA9IG5ldyBUZXN0SGNpTGF5ZXI7Ci0gICAgQWRkcmVzcyBhZGRyZXNzKHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fSk7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXyA9IG5ldyBMZUFkZHJlc3NNYW5hZ2VyKAotICAgICAgICBjb21tb246OkJpbmQoJkxlQWRkcmVzc01hbmFnZXJUZXN0OjplbnF1ZXVlX2NvbW1hbmQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksIGhhbmRsZXJfLCBhZGRyZXNzLCAweDNGLCAweDNGKTsKLSAgICBBbGxvY2F0ZUNsaWVudHMoMSk7Ci0gIH0KLQotICB2b2lkIHN5bmNfaGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpKTsKLSAgICBhdXRvIGZ1dHVyZV9zdGF0dXMgPSBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwotICAgIEVYUEVDVF9FUShmdXR1cmVfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgc3luY19oYW5kbGVyKGhhbmRsZXJfKTsKLSAgICBkZWxldGUgbGVfYWRkcmVzc19tYW5hZ2VyXzsKLSAgICBkZWxldGUgdGVzdF9oY2lfbGF5ZXJfOwotICAgIGhhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBoYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIHZvaWQgQWxsb2NhdGVDbGllbnRzKHNpemVfdCBudW1fY2xpZW50cykgewotICAgIHNpemVfdCBmaXJzdF9pZCA9IGNsaWVudHMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2NsaWVudHM7IGkrKykgewotICAgICAgY2xpZW50cy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxSb3RhdG9yQ2xpZW50PihsZV9hZGRyZXNzX21hbmFnZXJfLCBmaXJzdF9pZCArIGkpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGVucXVldWVfY29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmRfcGFja2V0KSB7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgc3RkOjptb3ZlKGNvbW1hbmRfcGFja2V0KSwKLSAgICAgICAgaGFuZGxlcl8tPkJpbmRPbmNlKCZMZUFkZHJlc3NNYW5hZ2VyOjpPbkNvbW1hbmRDb21wbGV0ZSwgY29tbW9uOjpVbnJldGFpbmVkKGxlX2FkZHJlc3NfbWFuYWdlcl8pKSk7Ci0gIH0KLQotICBUaHJlYWQqIHRocmVhZF87Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotICBUZXN0SGNpTGF5ZXIqIHRlc3RfaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIExlQWRkcmVzc01hbmFnZXIqIGxlX2FkZHJlc3NfbWFuYWdlcl87Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSb3RhdG9yQ2xpZW50Pj4gY2xpZW50czsKLX07Ci0KLVRFU1RfRihMZUFkZHJlc3NNYW5hZ2VyVGVzdCwgc3RhcnR1cF90ZWFyZG93bikge30KLQotVEVTVF9GKExlQWRkcmVzc01hbmFnZXJUZXN0LCByZWdpc3Rlcl91bnJlZ2lzdGVyX2NhbGxiYWNrKSB7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKGNsaWVudHNbMF0uZ2V0KCkpOwotICBzeW5jX2hhbmRsZXIoaGFuZGxlcl8pOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5VbnJlZ2lzdGVyKGNsaWVudHNbMF0uZ2V0KCkpOwotICBzeW5jX2hhbmRsZXIoaGFuZGxlcl8pOwotfQotCi1URVNUX0YoTGVBZGRyZXNzTWFuYWdlclRlc3QsIHJvdGF0b3JfYWRkcmVzc19mb3Jfc2luZ2xlX2NsaWVudCkgewotICBPY3RldDE2IGlyayA9IHsweGVjLCAweDAyLCAweDM0LCAweGEzLCAweDU3LCAweGM4LCAweGFkLCAweDA1LCAweDM0LCAweDEwLCAweDEwLCAweGE2LCAweDBhLCAweDM5LCAweDdkLCAweDlifTsKLSAgYXV0byBtaW5pbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApOwotICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAwMCk7Ci0gIEFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcyhBZGRyZXNzOjprRW1wdHksIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgIExlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3k6OlVTRV9SRVNPTFZBQkxFX0FERFJFU1MsCi0gICAgICByZW1vdGVfYWRkcmVzcywKLSAgICAgIGlyaywKLSAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgIG1heGltdW1fcm90YXRpb25fdGltZSk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKGNsaWVudHNbMF0uZ2V0KCkpOwotICBzeW5jX2hhbmRsZXIoaGFuZGxlcl8pOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfUkFORE9NX0FERFJFU1MpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRSYW5kb21BZGRyZXNzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIGNsaWVudHNbMF0uZ2V0KCktPldhaXRGb3JSZXN1bWUoKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+VW5yZWdpc3RlcihjbGllbnRzWzBdLmdldCgpKTsKLSAgc3luY19oYW5kbGVyKGhhbmRsZXJfKTsKLX0KLQotVEVTVF9GKExlQWRkcmVzc01hbmFnZXJUZXN0LCByb3RhdG9yX25vbl9yZXNvbHZhYmxlX2FkZHJlc3NfZm9yX3NpbmdsZV9jbGllbnQpIHsKLSAgT2N0ZXQxNiBpcmsgPSB7fTsKLSAgYXV0byBtaW5pbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApOwotICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAwMCk7Ci0gIEFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcyhBZGRyZXNzOjprRW1wdHksIEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgIExlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3k6OlVTRV9OT05fUkVTT0xWQUJMRV9BRERSRVNTLAotICAgICAgcmVtb3RlX2FkZHJlc3MsCi0gICAgICBpcmssCi0gICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsCi0gICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5SZWdpc3RlcihjbGllbnRzWzBdLmdldCgpKTsKLSAgc3luY19oYW5kbGVyKGhhbmRsZXJfKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1JBTkRPTV9BRERSRVNTKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0UmFuZG9tQWRkcmVzc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBjbGllbnRzWzBdLmdldCgpLT5XYWl0Rm9yUmVzdW1lKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIoY2xpZW50c1swXS5nZXQoKSk7Ci0gIHN5bmNfaGFuZGxlcihoYW5kbGVyXyk7Ci19Ci0KLS8vIFRPRE8gaGFuZGxlIHRoZSBjYXNlICJyZWdpc3RlciBkdXJpbmcgcm90YXRlX3JhbmRvbV9hZGRyZXNzIiBhbmQgZW5hYmxlIHRoaXMKLVRFU1RfRihMZUFkZHJlc3NNYW5hZ2VyVGVzdCwgRElTQUJMRURfcm90YXRvcl9hZGRyZXNzX2Zvcl9tdWx0aXBsZV9jbGllbnRzKSB7Ci0gIEFsbG9jYXRlQ2xpZW50cygyKTsKLSAgT2N0ZXQxNiBpcmsgPSB7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwgMHgzNCwgMHgxMCwgMHgxMCwgMHhhNiwgMHgwYSwgMHgzOSwgMHg3ZCwgMHg5Yn07Ci0gIGF1dG8gbWluaW11bV9yb3RhdGlvbl90aW1lID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKTsKLSAgYXV0byBtYXhpbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMwMDApOwotICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3MoQWRkcmVzczo6a0VtcHR5LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+U2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoCi0gICAgICBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfUkVTT0xWQUJMRV9BRERSRVNTLAotICAgICAgcmVtb3RlX2FkZHJlc3MsCi0gICAgICBpcmssCi0gICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsCi0gICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5SZWdpc3RlcihjbGllbnRzWzBdLmdldCgpKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+UmVnaXN0ZXIoY2xpZW50c1sxXS5nZXQoKSk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKGNsaWVudHNbMl0uZ2V0KCkpOwotICBzeW5jX2hhbmRsZXIoaGFuZGxlcl8pOwotCi0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIoY2xpZW50c1swXS5nZXQoKSk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIoY2xpZW50c1sxXS5nZXQoKSk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIoY2xpZW50c1syXS5nZXQoKSk7Ci0gIHN5bmNfaGFuZGxlcihoYW5kbGVyXyk7Ci19Ci0KLWNsYXNzIExlQWRkcmVzc01hbmFnZXJXaXRoU2luZ2xlQ2xpZW50VGVzdCA6IHB1YmxpYyBMZUFkZHJlc3NNYW5hZ2VyVGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M6OlNldEFsbEZvclRlc3RpbmcoKTsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBIYW5kbGVyKHRocmVhZF8pOwotICAgIHRlc3RfaGNpX2xheWVyXyA9IG5ldyBUZXN0SGNpTGF5ZXI7Ci0gICAgQWRkcmVzcyBhZGRyZXNzKHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fSk7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXyA9IG5ldyBMZUFkZHJlc3NNYW5hZ2VyKAotICAgICAgICBjb21tb246OkJpbmQoJkxlQWRkcmVzc01hbmFnZXJXaXRoU2luZ2xlQ2xpZW50VGVzdDo6ZW5xdWV1ZV9jb21tYW5kLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBoYW5kbGVyXywKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgMHgzRiwKLSAgICAgICAgMHgzRik7Ci0gICAgQWxsb2NhdGVDbGllbnRzKDEpOwotCi0gICAgT2N0ZXQxNiBpcmsgPSB7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwgMHgzNCwgMHgxMCwgMHgxMCwgMHhhNiwgMHgwYSwgMHgzOSwgMHg3ZCwgMHg5Yn07Ci0gICAgYXV0byBtaW5pbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApOwotICAgIGF1dG8gbWF4aW11bV9yb3RhdGlvbl90aW1lID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzMDAwKTsKLSAgICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3MoQWRkcmVzczo6a0VtcHR5LCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgICAgTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUywKLSAgICAgICAgcmVtb3RlX2FkZHJlc3MsCi0gICAgICAgIGlyaywKLSAgICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotCi0gICAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+UmVnaXN0ZXIoY2xpZW50c1swXS5nZXQoKSk7Ci0gICAgc3luY19oYW5kbGVyKGhhbmRsZXJfKTsKLSAgICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfUkFORE9NX0FERFJFU1MpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldFJhbmRvbUFkZHJlc3NDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgweDAxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgfQotCi0gIHZvaWQgZW5xdWV1ZV9jb21tYW5kKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZF9wYWNrZXQpIHsKLSAgICB0ZXN0X2hjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBzdGQ6Om1vdmUoY29tbWFuZF9wYWNrZXQpLAotICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2UoJkxlQWRkcmVzc01hbmFnZXI6Ok9uQ29tbWFuZENvbXBsZXRlLCBjb21tb246OlVucmV0YWluZWQobGVfYWRkcmVzc19tYW5hZ2VyXykpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+VW5yZWdpc3RlcihjbGllbnRzWzBdLmdldCgpKTsKLSAgICBzeW5jX2hhbmRsZXIoaGFuZGxlcl8pOwotICAgIGRlbGV0ZSBsZV9hZGRyZXNzX21hbmFnZXJfOwotICAgIGRlbGV0ZSB0ZXN0X2hjaV9sYXllcl87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci19OwotCi1URVNUX0YoTGVBZGRyZXNzTWFuYWdlcldpdGhTaW5nbGVDbGllbnRUZXN0LCBhZGRfZGV2aWNlX3RvX2Nvbm5lY3RfbGlzdCkgewotICBBZGRyZXNzIGFkZHJlc3M7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcoIjAxOjAyOjAzOjA0OjA1OjA2IiwgYWRkcmVzcyk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5BZGREZXZpY2VUb0Nvbm5lY3RMaXN0KENvbm5lY3RMaXN0QWRkcmVzc1R5cGU6OlJBTkRPTSwgYWRkcmVzcyk7Ci0gIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QpOwotICBhdXRvIHBhY2tldF92aWV3ID0KLSAgICAgIExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdFZpZXc6OkNyZWF0ZShMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldCkpKTsKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKENvbm5lY3RMaXN0QWRkcmVzc1R5cGU6OlJBTkRPTSwgcGFja2V0X3ZpZXcuR2V0QWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShhZGRyZXNzLCBwYWNrZXRfdmlldy5HZXRBZGRyZXNzKCkpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUFkZERldmljZVRvQ29ubmVjdExpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgweDAxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgY2xpZW50c1swXS5nZXQoKS0+V2FpdEZvclJlc3VtZSgpOwotfQotCi1URVNUX0YoTGVBZGRyZXNzTWFuYWdlcldpdGhTaW5nbGVDbGllbnRUZXN0LCByZW1vdmVfZGV2aWNlX2Zyb21fY29ubmVjdF9saXN0KSB7Ci0gIEFkZHJlc3MgYWRkcmVzczsKLSAgQWRkcmVzczo6RnJvbVN0cmluZygiMDE6MDI6MDM6MDQ6MDU6MDYiLCBhZGRyZXNzKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkFkZERldmljZVRvQ29ubmVjdExpc3QoQ29ubmVjdExpc3RBZGRyZXNzVHlwZTo6UkFORE9NLCBhZGRyZXNzKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19DT05ORUNUX0xJU1QpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdChDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpSQU5ET00sIGFkZHJlc3MpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QpOwotICBhdXRvIHBhY2tldF92aWV3ID0gTGVSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3RWaWV3OjpDcmVhdGUoCi0gICAgICBMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldCkpKTsKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKENvbm5lY3RMaXN0QWRkcmVzc1R5cGU6OlJBTkRPTSwgcGFja2V0X3ZpZXcuR2V0QWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShhZGRyZXNzLCBwYWNrZXRfdmlldy5HZXRBZGRyZXNzKCkpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgweDAxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgY2xpZW50c1swXS5nZXQoKS0+V2FpdEZvclJlc3VtZSgpOwotfQotCi1URVNUX0YoTGVBZGRyZXNzTWFuYWdlcldpdGhTaW5nbGVDbGllbnRUZXN0LCBjbGVhcl9jb25uZWN0X2xpc3QpIHsKLSAgQWRkcmVzcyBhZGRyZXNzOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMTowMjowMzowNDowNTowNiIsIGFkZHJlc3MpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWRkRGV2aWNlVG9Db25uZWN0TGlzdChDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpSQU5ET00sIGFkZHJlc3MpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9BRERfREVWSUNFX1RPX0NPTk5FQ1RfTElTVCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUFkZERldmljZVRvQ29ubmVjdExpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgweDAxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+Q2xlYXJDb25uZWN0TGlzdCgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9DTEVBUl9DT05ORUNUX0xJU1QpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVDbGVhckNvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIGNsaWVudHNbMF0uZ2V0KCktPldhaXRGb3JSZXN1bWUoKTsKLX0KLQotVEVTVF9GKExlQWRkcmVzc01hbmFnZXJXaXRoU2luZ2xlQ2xpZW50VGVzdCwgYWRkX2RldmljZV90b19yZXNvbHZpbmdfbGlzdCkgewotICBBZGRyZXNzIGFkZHJlc3M7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcoIjAxOjAyOjAzOjA0OjA1OjA2IiwgYWRkcmVzcyk7Ci0gIE9jdGV0MTYgcGVlcl9pcmsgPSB7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwgMHgzNCwgMHgxMCwgMHgxMCwgMHhhNiwgMHgwYSwgMHgzOSwgMHg3ZCwgMHg5Yn07Ci0gIE9jdGV0MTYgbG9jYWxfaXJrID0gezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTB9OwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KAotICAgICAgUGVlckFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX09SX0lERU5USVRZX0FERFJFU1MsIGFkZHJlc3MsIHBlZXJfaXJrLCBsb2NhbF9pcmspOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fUkVTT0xWSU5HX0xJU1QpOwotICBhdXRvIHBhY2tldF92aWV3ID0gTGVBZGREZXZpY2VUb1Jlc29sdmluZ0xpc3RWaWV3OjpDcmVhdGUoTGVTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0KSk7Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShQZWVyQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUywgcGFja2V0X3ZpZXcuR2V0UGVlcklkZW50aXR5QWRkcmVzc1R5cGUoKSk7Ci0gIEFTU0VSVF9FUShhZGRyZXNzLCBwYWNrZXRfdmlldy5HZXRQZWVySWRlbnRpdHlBZGRyZXNzKCkpOwotICBBU1NFUlRfRVEocGVlcl9pcmssIHBhY2tldF92aWV3LkdldFBlZXJJcmsoKSk7Ci0gIEFTU0VSVF9FUShsb2NhbF9pcmssIHBhY2tldF92aWV3LkdldExvY2FsSXJrKCkpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUFkZERldmljZVRvUmVzb2x2aW5nTGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBjbGllbnRzWzBdLmdldCgpLT5XYWl0Rm9yUmVzdW1lKCk7Ci19Ci0KLVRFU1RfRihMZUFkZHJlc3NNYW5hZ2VyV2l0aFNpbmdsZUNsaWVudFRlc3QsIHJlbW92ZV9kZXZpY2VfZnJvbV9yZXNvbHZpbmdfbGlzdCkgewotICBBZGRyZXNzIGFkZHJlc3M7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcoIjAxOjAyOjAzOjA0OjA1OjA2IiwgYWRkcmVzcyk7Ci0gIE9jdGV0MTYgcGVlcl9pcmsgPSB7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwgMHgzNCwgMHgxMCwgMHgxMCwgMHhhNiwgMHgwYSwgMHgzOSwgMHg3ZCwgMHg5Yn07Ci0gIE9jdGV0MTYgbG9jYWxfaXJrID0gezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTB9OwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KAotICAgICAgUGVlckFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX09SX0lERU5USVRZX0FERFJFU1MsIGFkZHJlc3MsIHBlZXJfaXJrLCBsb2NhbF9pcmspOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9BRERfREVWSUNFX1RPX1JFU09MVklOR19MSVNUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KFBlZXJBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTLCBhZGRyZXNzKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9SRU1PVkVfREVWSUNFX0ZST01fUkVTT0xWSU5HX0xJU1QpOwotICBhdXRvIHBhY2tldF92aWV3ID0gTGVSZW1vdmVEZXZpY2VGcm9tUmVzb2x2aW5nTGlzdFZpZXc6OkNyZWF0ZShMZVNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKTsKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKFBlZXJBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTLCBwYWNrZXRfdmlldy5HZXRQZWVySWRlbnRpdHlBZGRyZXNzVHlwZSgpKTsKLSAgQVNTRVJUX0VRKGFkZHJlc3MsIHBhY2tldF92aWV3LkdldFBlZXJJZGVudGl0eUFkZHJlc3MoKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIGNsaWVudHNbMF0uZ2V0KCktPldhaXRGb3JSZXN1bWUoKTsKLX0KLQotVEVTVF9GKExlQWRkcmVzc01hbmFnZXJXaXRoU2luZ2xlQ2xpZW50VGVzdCwgY2xlYXJfcmVzb2x2aW5nX2xpc3QpIHsKLSAgQWRkcmVzcyBhZGRyZXNzOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMTowMjowMzowNDowNTowNiIsIGFkZHJlc3MpOwotICBPY3RldDE2IHBlZXJfaXJrID0gezB4ZWMsIDB4MDIsIDB4MzQsIDB4YTMsIDB4NTcsIDB4YzgsIDB4YWQsIDB4MDUsIDB4MzQsIDB4MTAsIDB4MTAsIDB4YTYsIDB4MGEsIDB4MzksIDB4N2QsIDB4OWJ9OwotICBPY3RldDE2IGxvY2FsX2lyayA9IHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwfTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkFkZERldmljZVRvUmVzb2x2aW5nTGlzdCgKLSAgICAgIFBlZXJBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9PUl9JREVOVElUWV9BRERSRVNTLCBhZGRyZXNzLCBwZWVyX2lyaywgbG9jYWxfaXJrKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfQUREX0RFVklDRV9UT19SRVNPTFZJTkdfTElTVCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUFkZERldmljZVRvUmVzb2x2aW5nTGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9hZGRyZXNzX21hbmFnZXJfLT5DbGVhclJlc29sdmluZ0xpc3QoKTsKLSAgYXV0byBwYWNrZXQgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9DTEVBUl9SRVNPTFZJTkdfTElTVCk7Ci0gIGF1dG8gcGFja2V0X3ZpZXcgPSBMZUNsZWFyUmVzb2x2aW5nTGlzdFZpZXc6OkNyZWF0ZShMZVNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKTsKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQ2xlYXJSZXNvbHZpbmdMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMHgwMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIGNsaWVudHNbMF0uZ2V0KCktPldhaXRGb3JSZXN1bWUoKTsKLX0KLQotVEVTVF9GKExlQWRkcmVzc01hbmFnZXJXaXRoU2luZ2xlQ2xpZW50VGVzdCwgcmVnaXN0ZXJfZHVyaW5nX2NvbW1hbmRfY29tcGxldGUpIHsKLSAgQWRkcmVzcyBhZGRyZXNzOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMTowMjowMzowNDowNTowNiIsIGFkZHJlc3MpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWRkRGV2aWNlVG9Db25uZWN0TGlzdChDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpSQU5ET00sIGFkZHJlc3MpOwotICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNUKTsKLSAgYXV0byBwYWNrZXRfdmlldyA9Ci0gICAgICBMZUFkZERldmljZVRvQ29ubmVjdExpc3RWaWV3OjpDcmVhdGUoTGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXQpKSk7Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShDb25uZWN0TGlzdEFkZHJlc3NUeXBlOjpSQU5ET00sIHBhY2tldF92aWV3LkdldEFkZHJlc3NUeXBlKCkpOwotICBBU1NFUlRfRVEoYWRkcmVzcywgcGFja2V0X3ZpZXcuR2V0QWRkcmVzcygpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKDB4MDEsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIEFsbG9jYXRlQ2xpZW50cygxKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKGNsaWVudHNbMV0uZ2V0KCkpOwotICBjbGllbnRzWzBdLmdldCgpLT5XYWl0Rm9yUmVzdW1lKCk7Ci0gIGNsaWVudHNbMV0uZ2V0KCktPldhaXRGb3JSZXN1bWUoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2xlX2FkdmVydGlzaW5nX2ludGVyZmFjZS5oIGIvZ2QvaGNpL2xlX2FkdmVydGlzaW5nX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE5YzQyLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2NvbW1hbmRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNvbnN0ZXhwciBoY2k6OlN1YmV2ZW50Q29kZSBMZUFkdmVydGlzaW5nRXZlbnRzW10gPSB7Ci0gICAgaGNpOjpTdWJldmVudENvZGU6OlNDQU5fUkVRVUVTVF9SRUNFSVZFRCwKLSAgICBoY2k6OlN1YmV2ZW50Q29kZTo6QURWRVJUSVNJTkdfU0VUX1RFUk1JTkFURUQsCi19OwotCi10eXBlZGVmIENvbW1hbmRJbnRlcmZhY2U8TGVBZHZlcnRpc2luZ0NvbW1hbmRCdWlsZGVyPiBMZUFkdmVydGlzaW5nSW50ZXJmYWNlOwotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5jYyBiL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2OGM5Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgImhjaS9sZV9hZHZlcnRpc2luZ19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy9zeXN0ZW1fcHJvcGVydGllcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jb25zdCBNb2R1bGVGYWN0b3J5IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBMZUFkdmVydGlzaW5nTWFuYWdlcigpOyB9KTsKLQotZW51bSBjbGFzcyBBZHZlcnRpc2luZ0FwaVR5cGUgewotICBMRUdBQ1kgPSAxLAotICBBTkRST0lEX0hDSSA9IDIsCi0gIEVYVEVOREVEID0gMywKLX07Ci0KLWVudW0gY2xhc3MgQWR2ZXJ0aXNpbmdGbGFnIDogdWludDhfdCB7Ci0gIExFX0xJTUlURURfRElTQ09WRVJBQkxFID0gMHgwMSwKLSAgTEVfR0VORVJBTF9ESVNDT1ZFUkFCTEUgPSAweDAyLAotICBCUl9FRFJfTk9UX1NVUFBPUlRFRCA9IDB4MDQsCi0gIFNJTVVMVEFORU9VU19MRV9BTkRfQlJfRURSX0NPTlRST0xMRVIgPSAweDA4LAotICBTSU1VTFRBTkVPVVNfTEVfQU5EX0JSX0VEUl9IT1NUID0gMHgxMCwKLX07Ci0KLXN0cnVjdCBBZHZlcnRpc2VyIHsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXI7Ci0gIEFkZHJlc3NXaXRoVHlwZSBjdXJyZW50X2FkZHJlc3M7Ci0gIGNvbW1vbjo6Q2FsbGJhY2s8dm9pZChBZGRyZXNzLCBBZGRyZXNzVHlwZSk+IHNjYW5fY2FsbGJhY2s7Ci0gIGNvbW1vbjo6Q2FsbGJhY2s8dm9pZChFcnJvckNvZGUsIHVpbnQ4X3QsIHVpbnQ4X3QpPiBzZXRfdGVybWluYXRlZF9jYWxsYmFjazsKLSAgaW50OF90IHR4X3Bvd2VyOwotICB1aW50MTZfdCBkdXJhdGlvbjsKLSAgdWludDhfdCBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzOwotICBib29sIHN0YXJ0ZWQgPSBmYWxzZTsKLSAgYm9vbCBjb25uZWN0YWJsZSA9IGZhbHNlOwotICBzdGQ6OnVuaXF1ZV9wdHI8b3M6OkFsYXJtPiBhZGRyZXNzX3JvdGF0aW9uX2FsYXJtOwotfTsKLQotRXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZzo6RXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZyhjb25zdCBBZHZlcnRpc2luZ0NvbmZpZyYgY29uZmlnKSA6IEFkdmVydGlzaW5nQ29uZmlnKGNvbmZpZykgewotICBzd2l0Y2ggKGNvbmZpZy5hZHZlcnRpc2luZ190eXBlKSB7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9JTkQ6Ci0gICAgICBjb25uZWN0YWJsZSA9IHRydWU7Ci0gICAgICBzY2FubmFibGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9ESVJFQ1RfSU5EOgotICAgICAgY29ubmVjdGFibGUgPSB0cnVlOwotICAgICAgZGlyZWN0ZWQgPSB0cnVlOwotICAgICAgaGlnaF9kdXR5X2RpcmVjdGVkX2Nvbm5lY3RhYmxlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfU0NBTl9JTkQ6Ci0gICAgICBzY2FubmFibGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9OT05DT05OX0lORDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfRElSRUNUX0lORF9MT1c6Ci0gICAgICBjb25uZWN0YWJsZSA9IHRydWU7Ci0gICAgICBkaXJlY3RlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIlVua25vd24gZXZlbnQgdHlwZSIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RydWN0IExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjppbXBsIDogcHVibGljIGJsdWV0b290aDo6aGNpOjpMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sgewotICBpbXBsKE1vZHVsZSogbW9kdWxlKSA6IG1vZHVsZV8obW9kdWxlKSwgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXyhudWxscHRyKSwgbnVtX2luc3RhbmNlc18oMCkge30KLQotICB+aW1wbCgpIHsKLSAgICBpZiAoYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWQpIHsKLSAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlVucmVnaXN0ZXIodGhpcyk7Ci0gICAgfQotICAgIGFkdmVydGlzaW5nX3NldHNfLmNsZWFyKCk7Ci0gIH0KLQotICB2b2lkIHN0YXJ0KG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBoY2k6OkhjaUxheWVyKiBoY2lfbGF5ZXIsIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgICAgICAgICBoY2k6OkFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyKSB7Ci0gICAgbW9kdWxlX2hhbmRsZXJfID0gaGFuZGxlcjsKLSAgICBoY2lfbGF5ZXJfID0gaGNpX2xheWVyOwotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgICBsZV9tYXhpbXVtX2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoXyA9IGNvbnRyb2xsZXJfLT5HZXRMZU1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGgoKTsKLSAgICBhY2xfbWFuYWdlcl8gPSBhY2xfbWFuYWdlcjsKLSAgICBsZV9hZGRyZXNzX21hbmFnZXJfID0gYWNsX21hbmFnZXItPkdldExlQWRkcmVzc01hbmFnZXIoKTsKLSAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfID0KLSAgICAgICAgaGNpX2xheWVyXy0+R2V0TGVBZHZlcnRpc2luZ0ludGVyZmFjZShtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbih0aGlzLCAmTGVBZHZlcnRpc2luZ01hbmFnZXI6OmltcGw6OmhhbmRsZV9ldmVudCkpOwotICAgIG51bV9pbnN0YW5jZXNfID0gY29udHJvbGxlcl8tPkdldExlTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcmlzaW5nU2V0cygpOwotICAgIGVuYWJsZWRfc2V0c18gPSBzdGQ6OnZlY3RvcjxFbmFibGVkU2V0PihudW1faW5zdGFuY2VzXyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmFibGVkX3NldHNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICBlbmFibGVkX3NldHNfW2ldLmFkdmVydGlzaW5nX2hhbmRsZV8gPSBrSW52YWxpZEhhbmRsZTsKLSAgICB9Ci0KLSAgICBpZiAoY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKGhjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUykpIHsKLSAgICAgIGFkdmVydGlzaW5nX2FwaV90eXBlXyA9IEFkdmVydGlzaW5nQXBpVHlwZTo6RVhURU5ERUQ7Ci0gICAgfSBlbHNlIGlmIChjb250cm9sbGVyXy0+SXNTdXBwb3J0ZWQoaGNpOjpPcENvZGU6OkxFX01VTFRJX0FEVlQpKSB7Ci0gICAgICBhZHZlcnRpc2luZ19hcGlfdHlwZV8gPSBBZHZlcnRpc2luZ0FwaVR5cGU6OkFORFJPSURfSENJOwotICAgIH0gZWxzZSB7Ci0gICAgICBhZHZlcnRpc2luZ19hcGlfdHlwZV8gPSBBZHZlcnRpc2luZ0FwaVR5cGU6OkxFR0FDWTsKLSAgICAgIGludCB2ZW5kb3JfdmVyc2lvbiA9IG9zOjpHZXRBbmRyb2lkVmVuZG9yUmVsZWFzZVZlcnNpb24oKTsKLSAgICAgIGlmICh2ZW5kb3JfdmVyc2lvbiAhPSAwICYmIHZlbmRvcl92ZXJzaW9uIDw9IDExICYmIG9zOjpJc1Jvb3RDYW5hbEVuYWJsZWQoKSkgewotICAgICAgICBMT0dfSU5GTygiTGVSZWFkQWR2ZXJ0aXNpbmdQaHlzaWNhbENoYW5uZWxUeFBvd2VyIGlzIG5vdCBzdXBwb3J0ZWQgb24gQW5kcm9pZCBSIFJvb3RDYW5hbCwgZGVmYXVsdCB0byAwIik7Ci0gICAgICAgIGxlX3BoeXNpY2FsX2NoYW5uZWxfdHhfcG93ZXJfID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgTGVSZWFkQWR2ZXJ0aXNpbmdQaHlzaWNhbENoYW5uZWxUeFBvd2VyQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgICBoYW5kbGVyLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9yZWFkX2FkdmVydGlzaW5nX3BoeXNpY2FsX2NoYW5uZWxfdHhfcG93ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzaXplX3QgR2V0TnVtYmVyT2ZBZHZlcnRpc2luZ0luc3RhbmNlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtX2luc3RhbmNlc187Ci0gIH0KLQotICBBZHZlcnRpc2luZ0FwaVR5cGUgZ2V0X2FkdmVydGlzaW5nX2FwaV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBhZHZlcnRpc2luZ19hcGlfdHlwZV87Ci0gIH0KLQotICB2b2lkIHJlZ2lzdGVyX2FkdmVydGlzaW5nX2NhbGxiYWNrKEFkdmVydGlzaW5nQ2FsbGJhY2sqIGFkdmVydGlzaW5nX2NhbGxiYWNrKSB7Ci0gICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyA9IGFkdmVydGlzaW5nX2NhbGxiYWNrOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfZXZlbnQoTGVNZXRhRXZlbnRWaWV3IGV2ZW50KSB7Ci0gICAgc3dpdGNoIChldmVudC5HZXRTdWJldmVudENvZGUoKSkgewotICAgICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6U0NBTl9SRVFVRVNUX1JFQ0VJVkVEOgotICAgICAgICBoYW5kbGVfc2Nhbl9yZXF1ZXN0KExlU2NhblJlcXVlc3RSZWNlaXZlZFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkFEVkVSVElTSU5HX1NFVF9URVJNSU5BVEVEOgotICAgICAgICBoYW5kbGVfc2V0X3Rlcm1pbmF0ZWQoTGVBZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWRWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfSU5GTygiVW5rbm93biBzdWJldmVudCBpbiBzY2FubmVyICVzIiwgaGNpOjpTdWJldmVudENvZGVUZXh0KGV2ZW50LkdldFN1YmV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9zY2FuX3JlcXVlc3QoTGVTY2FuUmVxdWVzdFJlY2VpdmVkVmlldyBldmVudF92aWV3KSB7Ci0gICAgaWYgKCFldmVudF92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0lORk8oIkRyb3BwaW5nIGludmFsaWQgc2NhbiByZXF1ZXN0IGV2ZW50Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlZ2lzdGVyZWRfaGFuZGxlcl8tPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2Uoc2Nhbl9jYWxsYmFja18sIGV2ZW50X3ZpZXcuR2V0U2Nhbm5lckFkZHJlc3MoKSwgZXZlbnRfdmlldy5HZXRTY2FubmVyQWRkcmVzc1R5cGUoKSkpOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfc2V0X3Rlcm1pbmF0ZWQoTGVBZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWRWaWV3IGV2ZW50X3ZpZXcpIHsKLSAgICBpZiAoIWV2ZW50X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfSU5GTygiRHJvcHBpbmcgaW52YWxpZCBhZHZlcnRpc2luZyBldmVudCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCA9IGV2ZW50X3ZpZXcuR2V0QWR2ZXJ0aXNpbmdIYW5kbGUoKTsKLQotICAgIGlmIChhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5hZGRyZXNzX3JvdGF0aW9uX2FsYXJtICE9IG51bGxwdHIpIHsKLSAgICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkZHJlc3Nfcm90YXRpb25fYWxhcm0tPkNhbmNlbCgpOwotICAgICAgYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uYWRkcmVzc19yb3RhdGlvbl9hbGFybS5yZXNldCgpOwotICAgIH0KLSAgICBlbmFibGVkX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkdmVydGlzaW5nX2hhbmRsZV8gPSBrSW52YWxpZEhhbmRsZTsKLQotICAgIEFkZHJlc3NXaXRoVHlwZSBhZHZlcnRpc2VyX2FkZHJlc3MgPSBhZHZlcnRpc2luZ19zZXRzX1tldmVudF92aWV3LkdldEFkdmVydGlzaW5nSGFuZGxlKCldLmN1cnJlbnRfYWRkcmVzczsKLQotICAgIGFjbF9tYW5hZ2VyXy0+T25BZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWQoCi0gICAgICAgIGV2ZW50X3ZpZXcuR2V0U3RhdHVzKCksIGV2ZW50X3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpLCBhZHZlcnRpc2VyX2FkZHJlc3MpOwotICB9Ci0KLSAgQWR2ZXJ0aXNlcklkIGFsbG9jYXRlX2FkdmVydGlzZXIoKSB7Ci0gICAgQWR2ZXJ0aXNlcklkIGlkID0gMDsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2soaWRfbXV0ZXhfKTsKLSAgICAgIHdoaWxlIChpZCA8IG51bV9pbnN0YW5jZXNfICYmIGFkdmVydGlzaW5nX3NldHNfLmNvdW50KGlkKSAhPSAwKSB7Ci0gICAgICAgIGlkKys7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpZCA9PSBudW1faW5zdGFuY2VzXykgewotICAgICAgcmV0dXJuIGtJbnZhbGlkSWQ7Ci0gICAgfQotICAgIHJldHVybiBpZDsKLSAgfQotCi0gIHZvaWQgcmVtb3ZlX2FkdmVydGlzZXIoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQpIHsKLSAgICBzdG9wX2FkdmVydGlzaW5nKGFkdmVydGlzZXJfaWQpOwotICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhpZF9tdXRleF8pOwotICAgIGlmIChhZHZlcnRpc2luZ19zZXRzXy5jb3VudChhZHZlcnRpc2VyX2lkKSA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChhZHZlcnRpc2luZ19zZXRzXy5lbXB0eSgpICYmIGFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkKSB7Ci0gICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5VbnJlZ2lzdGVyKHRoaXMpOwotICAgICAgYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgIHBhdXNlZCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAoYWR2ZXJ0aXNpbmdfYXBpX3R5cGVfID09IEFkdmVydGlzaW5nQXBpVHlwZTo6RVhURU5ERUQpIHsKLSAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIGhjaTo6TGVSZW1vdmVBZHZlcnRpc2luZ1NldEJ1aWxkZXI6OkNyZWF0ZShhZHZlcnRpc2VyX2lkKSwKLSAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlKGltcGw6OmNoZWNrX3N0YXR1czxMZVJlbW92ZUFkdmVydGlzaW5nU2V0Q29tcGxldGVWaWV3PikpOwotCi0gICAgICBpZiAoYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uYWRkcmVzc19yb3RhdGlvbl9hbGFybSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkZHJlc3Nfcm90YXRpb25fYWxhcm0tPkNhbmNlbCgpOwotICAgICAgICBhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5hZGRyZXNzX3JvdGF0aW9uX2FsYXJtLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFkdmVydGlzaW5nX3NldHNfLmVyYXNlKGFkdmVydGlzZXJfaWQpOwotICB9Ci0KLSAgdm9pZCBjcmVhdGVfYWR2ZXJ0aXNlcigKLSAgICAgIEFkdmVydGlzZXJJZCBpZCwKLSAgICAgIGNvbnN0IEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZywKLSAgICAgIGNvbnN0IGNvbW1vbjo6Q2FsbGJhY2s8dm9pZChBZGRyZXNzLCBBZGRyZXNzVHlwZSk+JiBzY2FuX2NhbGxiYWNrLAotICAgICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEVycm9yQ29kZSwgdWludDhfdCwgdWludDhfdCk+JiBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywKLSAgICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gICAgYWR2ZXJ0aXNpbmdfc2V0c19baWRdLnNjYW5fY2FsbGJhY2sgPSBzY2FuX2NhbGxiYWNrOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5zZXRfdGVybWluYXRlZF9jYWxsYmFjayA9IHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICBhZHZlcnRpc2luZ19zZXRzX1tpZF0uY3VycmVudF9hZGRyZXNzID0gQWRkcmVzc1dpdGhUeXBle307Ci0KLSAgICBpZiAoIWFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkKSB7Ci0gICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5SZWdpc3Rlcih0aGlzKTsKLSAgICAgIGFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFkdmVydGlzaW5nX2FwaV90eXBlXykgewotICAgICAgY2FzZSAoQWR2ZXJ0aXNpbmdBcGlUeXBlOjpMRUdBQ1kpOiB7Ci0gICAgICAgIHNldF9wYXJhbWV0ZXJzKGlkLCBjb25maWcpOwotICAgICAgICBpZiAoY29uZmlnLmFkdmVydGlzaW5nX3R5cGUgPT0gQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfSU5EIHx8Ci0gICAgICAgICAgICBjb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSA9PSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9OT05DT05OX0lORCkgewotICAgICAgICAgIHNldF9kYXRhKGlkLCB0cnVlLCBjb25maWcuc2Nhbl9yZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0X2RhdGEoaWQsIGZhbHNlLCBjb25maWcuYWR2ZXJ0aXNlbWVudCk7Ci0gICAgICAgIGF1dG8gYWRkcmVzc19wb2xpY3kgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRBZGRyZXNzUG9saWN5KCk7Ci0gICAgICAgIGlmIChhZGRyZXNzX3BvbGljeSA9PSBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUyB8fAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3kgPT0gTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5jdXJyZW50X2FkZHJlc3MgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRBbm90aGVyQWRkcmVzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5jdXJyZW50X2FkZHJlc3MgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRDdXJyZW50QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcGF1c2VkKSB7Ci0gICAgICAgICAgZW5hYmxlX2FkdmVydGlzZXIoaWQsIHRydWUsIDAsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVuYWJsZWRfc2V0c19baWRdLmFkdmVydGlzaW5nX2hhbmRsZV8gPSBpZDsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6QU5EUk9JRF9IQ0kpOiB7Ci0gICAgICAgIGF1dG8gYWRkcmVzc19wb2xpY3kgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRBZGRyZXNzUG9saWN5KCk7Ci0gICAgICAgIGlmIChhZGRyZXNzX3BvbGljeSA9PSBMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfTk9OX1JFU09MVkFCTEVfQUREUkVTUyB8fAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3kgPT0gTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5jdXJyZW50X2FkZHJlc3MgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRBbm90aGVyQWRkcmVzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5jdXJyZW50X2FkZHJlc3MgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRDdXJyZW50QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHNldF9wYXJhbWV0ZXJzKGlkLCBjb25maWcpOwotICAgICAgICBpZiAoY29uZmlnLmFkdmVydGlzaW5nX3R5cGUgPT0gQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfSU5EIHx8Ci0gICAgICAgICAgICBjb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSA9PSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9OT05DT05OX0lORCkgewotICAgICAgICAgIHNldF9kYXRhKGlkLCB0cnVlLCBjb25maWcuc2Nhbl9yZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0X2RhdGEoaWQsIGZhbHNlLCBjb25maWcuYWR2ZXJ0aXNlbWVudCk7Ci0gICAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZU11bHRpQWR2dFNldFJhbmRvbUFkZHJCdWlsZGVyOjpDcmVhdGUoYWR2ZXJ0aXNpbmdfc2V0c19baWRdLmN1cnJlbnRfYWRkcmVzcy5HZXRBZGRyZXNzKCksIGlkKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzPExlTXVsdGlBZHZ0Q29tcGxldGVWaWV3PikpOwotICAgICAgICBpZiAoIXBhdXNlZCkgewotICAgICAgICAgIGVuYWJsZV9hZHZlcnRpc2VyKGlkLCB0cnVlLCAwLCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlbmFibGVkX3NldHNfW2lkXS5hZHZlcnRpc2luZ19oYW5kbGVfID0gaWQ7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChBZHZlcnRpc2luZ0FwaVR5cGU6OkVYVEVOREVEKTogewotICAgICAgICBMT0dfV0FSTigiVW5leHBlY3RlZCBBZHZlcnRpc2luZ0FwaVR5cGUgRVhURU5ERUQiKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBjcmVhdGVfZXh0ZW5kZWRfYWR2ZXJ0aXNlcigKLSAgICAgIGludCByZWdfaWQsCi0gICAgICBBZHZlcnRpc2VySWQgaWQsCi0gICAgICBjb25zdCBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZywKLSAgICAgIGNvbnN0IGNvbW1vbjo6Q2FsbGJhY2s8dm9pZChBZGRyZXNzLCBBZGRyZXNzVHlwZSk+JiBzY2FuX2NhbGxiYWNrLAotICAgICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEVycm9yQ29kZSwgdWludDhfdCwgdWludDhfdCk+JiBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywKLSAgICAgIHVpbnQxNl90IGR1cmF0aW9uLAotICAgICAgdWludDhfdCBtYXhfZXh0X2Fkdl9ldmVudHMsCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIGlkX21hcF9baWRdID0gcmVnX2lkOwotCi0gICAgaWYgKGFkdmVydGlzaW5nX2FwaV90eXBlXyAhPSBBZHZlcnRpc2luZ0FwaVR5cGU6OkVYVEVOREVEKSB7Ci0gICAgICBjcmVhdGVfYWR2ZXJ0aXNlcihpZCwgY29uZmlnLCBzY2FuX2NhbGxiYWNrLCBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywgaGFuZGxlcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYWR2ZXJ0aXNpbmdfc2V0c19baWRdLnNjYW5fY2FsbGJhY2sgPSBzY2FuX2NhbGxiYWNrOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5zZXRfdGVybWluYXRlZF9jYWxsYmFjayA9IHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5kdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzID0gbWF4X2V4dF9hZHZfZXZlbnRzOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5oYW5kbGVyID0gaGFuZGxlcjsKLQotICAgIHNldF9wYXJhbWV0ZXJzKGlkLCBjb25maWcpOwotCi0gICAgYXV0byBhZGRyZXNzX3BvbGljeSA9IGxlX2FkZHJlc3NfbWFuYWdlcl8tPkdldEFkZHJlc3NQb2xpY3koKTsKLSAgICBpZiAoY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPT0gT3duQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUykgewotICAgICAgaWYgKGFkZHJlc3NfcG9saWN5ID09IExlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3k6OlVTRV9OT05fUkVTT0xWQUJMRV9BRERSRVNTIHx8Ci0gICAgICAgICAgYWRkcmVzc19wb2xpY3kgPT0gTGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUykgewotICAgICAgICBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUgPSBsZV9hZGRyZXNzX21hbmFnZXJfLT5HZXRBbm90aGVyQWRkcmVzcygpOwotICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0J1aWxkZXI6OkNyZWF0ZShpZCwgYWRkcmVzc193aXRoX3R5cGUuR2V0QWRkcmVzcygpKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICZpbXBsOjpvbl9zZXRfYWR2ZXJ0aXNpbmdfc2V0X3JhbmRvbV9hZGRyZXNzX2NvbXBsZXRlPAotICAgICAgICAgICAgICAgICAgICBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdSYW5kb21BZGRyZXNzQ29tcGxldGVWaWV3PiwKLSAgICAgICAgICAgICAgICBpZCwKLSAgICAgICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZSkpOwotCi0gICAgICAgIC8vIHN0YXJ0IHRpbWVyIGZvciByYW5kb20gYWRkcmVzcwotICAgICAgICBhZHZlcnRpc2luZ19zZXRzX1tpZF0uYWRkcmVzc19yb3RhdGlvbl9hbGFybSA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkFsYXJtPihtb2R1bGVfaGFuZGxlcl8pOwotICAgICAgICBhZHZlcnRpc2luZ19zZXRzX1tpZF0uYWRkcmVzc19yb3RhdGlvbl9hbGFybS0+U2NoZWR1bGUoCi0gICAgICAgICAgICBjb21tb246OkJpbmRPbmNlKCZpbXBsOjpzZXRfYWR2ZXJ0aXNpbmdfc2V0X3JhbmRvbV9hZGRyZXNzLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIGlkKSwKLSAgICAgICAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkdldE5leHRQcml2YXRlQWRkcmVzc0ludGVydmFsTXMoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhZHZlcnRpc2luZ19zZXRzX1tpZF0uY3VycmVudF9hZGRyZXNzID0gbGVfYWRkcmVzc19tYW5hZ2VyXy0+R2V0Q3VycmVudEFkZHJlc3MoKTsKLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3NCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgaWQsIGFkdmVydGlzaW5nX3NldHNfW2lkXS5jdXJyZW50X2FkZHJlc3MuR2V0QWRkcmVzcygpKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzPExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3NDb21wbGV0ZVZpZXc+KSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS5jdXJyZW50X2FkZHJlc3MgPQotICAgICAgICAgIEFkZHJlc3NXaXRoVHlwZShjb250cm9sbGVyXy0+R2V0TWFjQWRkcmVzcygpLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy5hZHZlcnRpc2luZ190eXBlID09IEFkdmVydGlzaW5nVHlwZTo6QURWX0lORCB8fAotICAgICAgICBjb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSA9PSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9OT05DT05OX0lORCkgewotICAgICAgc2V0X2RhdGEoaWQsIHRydWUsIGNvbmZpZy5zY2FuX3Jlc3BvbnNlKTsKLSAgICB9Ci0gICAgc2V0X2RhdGEoaWQsIGZhbHNlLCBjb25maWcuYWR2ZXJ0aXNlbWVudCk7Ci0KLSAgICBpZiAoIWNvbmZpZy5wZXJpb2RpY19kYXRhLmVtcHR5KCkpIHsKLSAgICAgIHNldF9wZXJpb2RpY19wYXJhbWV0ZXIoaWQsIGNvbmZpZy5wZXJpb2RpY19hZHZlcnRpc2luZ19wYXJhbWV0ZXJzKTsKLSAgICAgIHNldF9wZXJpb2RpY19kYXRhKGlkLCBjb25maWcucGVyaW9kaWNfZGF0YSk7Ci0gICAgICBlbmFibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmcoaWQsIHRydWUpOwotICAgIH0KLQotICAgIGlmICghcGF1c2VkKSB7Ci0gICAgICBlbmFibGVfYWR2ZXJ0aXNlcihpZCwgdHJ1ZSwgZHVyYXRpb24sIG1heF9leHRfYWR2X2V2ZW50cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVuYWJsZWRTZXQgY3Vycl9zZXQ7Ci0gICAgICBjdXJyX3NldC5hZHZlcnRpc2luZ19oYW5kbGVfID0gaWQ7Ci0gICAgICBjdXJyX3NldC5kdXJhdGlvbl8gPSBkdXJhdGlvbjsKLSAgICAgIGN1cnJfc2V0Lm1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHNfID0gbWF4X2V4dF9hZHZfZXZlbnRzOwotICAgICAgc3RkOjp2ZWN0b3I8RW5hYmxlZFNldD4gZW5hYmxlZF9zZXRzID0ge2N1cnJfc2V0fTsKLSAgICAgIGVuYWJsZWRfc2V0c19baWRdID0gY3Vycl9zZXQ7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzdG9wX2FkdmVydGlzaW5nKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkKSB7Ci0gICAgaWYgKGFkdmVydGlzaW5nX3NldHNfLmZpbmQoYWR2ZXJ0aXNlcl9pZCkgPT0gYWR2ZXJ0aXNpbmdfc2V0c18uZW5kKCkpIHsKLSAgICAgIExPR19JTkZPKCJVbmtub3duIGFkdmVydGlzaW5nIHNldCAldSIsIGFkdmVydGlzZXJfaWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbmFibGVkU2V0IGN1cnJfc2V0OwotICAgIGN1cnJfc2V0LmFkdmVydGlzaW5nX2hhbmRsZV8gPSBhZHZlcnRpc2VyX2lkOwotICAgIHN0ZDo6dmVjdG9yPEVuYWJsZWRTZXQ+IGVuYWJsZWRfdmVjdG9ye2N1cnJfc2V0fTsKLQotICAgIC8vIElmIGFkdmVydGlzaW5nIG9yIHBlcmlvZGljIGFkdmVydGlzaW5nIG9uIHRoZSBhZHZlcnRpc2luZyBzZXQgaXMgZW5hYmxlZCwKLSAgICAvLyB0aGVuIHRoZSBDb250cm9sbGVyIHdpbGwgcmV0dXJuIHRoZSBlcnJvciBjb2RlIENvbW1hbmQgRGlzYWxsb3dlZCAoMHgwQykuCi0gICAgLy8gVGh1cywgd2Ugc2hvdWxkIGRpc2FibGUgaXQgYmVmb3JlIHJlbW92aW5nIGl0LgotICAgIHN3aXRjaCAoYWR2ZXJ0aXNpbmdfYXBpX3R5cGVfKSB7Ci0gICAgICBjYXNlIChBZHZlcnRpc2luZ0FwaVR5cGU6OkxFR0FDWSk6Ci0gICAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZVNldEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKEVuYWJsZTo6RElTQUJMRUQpLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZShpbXBsOjpjaGVja19zdGF0dXM8TGVTZXRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlVmlldz4pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIChBZHZlcnRpc2luZ0FwaVR5cGU6OkFORFJPSURfSENJKToKLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlTXVsdGlBZHZ0U2V0RW5hYmxlQnVpbGRlcjo6Q3JlYXRlKEVuYWJsZTo6RElTQUJMRUQsIGFkdmVydGlzZXJfaWQpLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZShpbXBsOjpjaGVja19zdGF0dXM8TGVNdWx0aUFkdnRDb21wbGV0ZVZpZXc+KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAoQWR2ZXJ0aXNpbmdBcGlUeXBlOjpFWFRFTkRFRCk6IHsKLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXI6OkNyZWF0ZShFbmFibGU6OkRJU0FCTEVELCBlbmFibGVkX3ZlY3RvciksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlKGltcGw6OmNoZWNrX3N0YXR1czxMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZVZpZXc+KSk7Ci0KLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXI6OkNyZWF0ZShFbmFibGU6OkRJU0FCTEVELCBhZHZlcnRpc2VyX2lkKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzPExlU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlVmlldz4pKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKGlkX211dGV4Xyk7Ci0gICAgZW5hYmxlZF9zZXRzX1thZHZlcnRpc2VyX2lkXS5hZHZlcnRpc2luZ19oYW5kbGVfID0ga0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICB2b2lkIHNldF9hZHZlcnRpc2luZ19zZXRfcmFuZG9tX2FkZHJlc3MoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQpIHsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHRyaWdnZXIgYnkgZW5hYmxlZCBhZHZlcnRpc2luZyBzZXQKLSAgICBpZiAoZW5hYmxlZF9zZXRzX1thZHZlcnRpc2VyX2lkXS5hZHZlcnRpc2luZ19oYW5kbGVfID09IGtJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICBpZiAoYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uYWRkcmVzc19yb3RhdGlvbl9hbGFybSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkZHJlc3Nfcm90YXRpb25fYWxhcm0tPkNhbmNlbCgpOwotICAgICAgICBhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5hZGRyZXNzX3JvdGF0aW9uX2FsYXJtLnJlc2V0KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVE9ETyBoYW5kbGUgZHVyYXRpb24gYW5kIG1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHNfCi0gICAgRW5hYmxlZFNldCBjdXJyX3NldDsKLSAgICBjdXJyX3NldC5hZHZlcnRpc2luZ19oYW5kbGVfID0gYWR2ZXJ0aXNlcl9pZDsKLSAgICBjdXJyX3NldC5kdXJhdGlvbl8gPSBhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5kdXJhdGlvbjsKLSAgICBjdXJyX3NldC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzXyA9IGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLm1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHM7Ci0gICAgc3RkOjp2ZWN0b3I8RW5hYmxlZFNldD4gZW5hYmxlZF9zZXRzID0ge2N1cnJfc2V0fTsKLQotICAgIC8vIEZvciBjb25uZWN0YWJsZSBhZHZlcnRpc2luZywgd2Ugc2hvdWxkIGRpc2FibGUgaXQgZmlyc3QKLSAgICBpZiAoYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uY29ubmVjdGFibGUpIHsKLSAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIGhjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKEVuYWJsZTo6RElTQUJMRUQsIGVuYWJsZWRfc2V0cyksCi0gICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZShpbXBsOjpjaGVja19zdGF0dXM8TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQ29tcGxldGVWaWV3PikpOwotICAgIH0KLQotICAgIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSA9IGxlX2FkZHJlc3NfbWFuYWdlcl8tPkdldEFub3RoZXJBZGRyZXNzKCk7Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIGhjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0J1aWxkZXI6OkNyZWF0ZShhZHZlcnRpc2VyX2lkLCBhZGRyZXNzX3dpdGhfdHlwZS5HZXRBZGRyZXNzKCkpLAotICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24oCi0gICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgJmltcGw6Om9uX3NldF9hZHZlcnRpc2luZ19zZXRfcmFuZG9tX2FkZHJlc3NfY29tcGxldGU8TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0NvbXBsZXRlVmlldz4sCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGUpKTsKLQotICAgIGlmIChhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5jb25uZWN0YWJsZSkgewotICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgaGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVELCBlbmFibGVkX3NldHMpLAotICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzPExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlVmlldz4pKTsKLSAgICB9Ci0KLSAgICBhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5hZGRyZXNzX3JvdGF0aW9uX2FsYXJtLT5TY2hlZHVsZSgKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmaW1wbDo6c2V0X2FkdmVydGlzaW5nX3NldF9yYW5kb21fYWRkcmVzcywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBhZHZlcnRpc2VyX2lkKSwKLSAgICAgICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+R2V0TmV4dFByaXZhdGVBZGRyZXNzSW50ZXJ2YWxNcygpKTsKLSAgfQotCi0gIHZvaWQgZ2V0X293bl9hZGRyZXNzKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkKSB7Ci0gICAgaWYgKGFkdmVydGlzaW5nX3NldHNfLmZpbmQoYWR2ZXJ0aXNlcl9pZCkgPT0gYWR2ZXJ0aXNpbmdfc2V0c18uZW5kKCkpIHsKLSAgICAgIExPR19JTkZPKCJVbmtub3duIGFkdmVydGlzaW5nIGlkICV1IiwgYWR2ZXJ0aXNlcl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gY3VycmVudF9hZGRyZXNzID0gYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uY3VycmVudF9hZGRyZXNzOwotICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uT3duQWRkcmVzc1JlYWQoCi0gICAgICAgIGFkdmVydGlzZXJfaWQsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cnJlbnRfYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpKSwgY3VycmVudF9hZGRyZXNzLkdldEFkZHJlc3MoKSk7Ci0gIH0KLQotICB2b2lkIHNldF9wYXJhbWV0ZXJzKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZykgewotICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLmNvbm5lY3RhYmxlID0gY29uZmlnLmNvbm5lY3RhYmxlOwotICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLnR4X3Bvd2VyID0gY29uZmlnLnR4X3Bvd2VyOwotCi0gICAgc3dpdGNoIChhZHZlcnRpc2luZ19hcGlfdHlwZV8pIHsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6TEVHQUNZKTogewotICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVTZXRBZHZlcnRpc2luZ1BhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgY29uZmlnLmludGVydmFsX21pbiwKLSAgICAgICAgICAgICAgICBjb25maWcuaW50ZXJ2YWxfbWF4LAotICAgICAgICAgICAgICAgIGNvbmZpZy5hZHZlcnRpc2luZ190eXBlLAotICAgICAgICAgICAgICAgIGNvbmZpZy5vd25fYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICAgIGNvbmZpZy5wZWVyX2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICBjb25maWcucGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hcCwKLSAgICAgICAgICAgICAgICBjb25maWcuZmlsdGVyX3BvbGljeSksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24oCi0gICAgICAgICAgICAgICAgdGhpcywgJmltcGw6OmNoZWNrX3N0YXR1c193aXRoX2lkPExlU2V0QWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzQ29tcGxldGVWaWV3PiwgYWR2ZXJ0aXNlcl9pZCkpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6QU5EUk9JRF9IQ0kpOiB7Ci0gICAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZU11bHRpQWR2dFBhcmFtQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIGNvbmZpZy5pbnRlcnZhbF9taW4sCi0gICAgICAgICAgICAgICAgY29uZmlnLmludGVydmFsX21heCwKLSAgICAgICAgICAgICAgICBjb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSwKLSAgICAgICAgICAgICAgICBjb25maWcub3duX2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5jdXJyZW50X2FkZHJlc3MuR2V0QWRkcmVzcygpLAotICAgICAgICAgICAgICAgIGNvbmZpZy5wZWVyX2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICBjb25maWcucGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hcCwKLSAgICAgICAgICAgICAgICBjb25maWcuZmlsdGVyX3BvbGljeSwKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgICAgIGNvbmZpZy50eF9wb3dlciksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6OmNoZWNrX3N0YXR1c193aXRoX2lkPExlTXVsdGlBZHZ0Q29tcGxldGVWaWV3PiwgYWR2ZXJ0aXNlcl9pZCkpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6RVhURU5ERUQpOiB7Ci0gICAgICAgIC8vIHNpZCBtdXN0IGJlIGluIHJhbmdlIDB4MDAgdG8gMHgwRi4gU2luY2Ugbm8gY29udHJvbGxlciBzdXBwb3J0cyBtb3JlIHRoYW4KLSAgICAgICAgLy8gMTYgYWR2ZXJ0aXNlcnMsIGl0J3Mgc2FmZSB0byBtYWtlIHNpZCBlcXVhbCB0byBpZC4KLSAgICAgICAgY29uZmlnLnNpZCA9IGFkdmVydGlzZXJfaWQgJSBrQWR2ZXJ0aXNpbmdTZXRJZE1hc2s7Ci0KLSAgICAgICAgaWYgKGNvbmZpZy5sZWdhY3lfcGR1cykgewotICAgICAgICAgIExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllcyBsZWdhY3lfcHJvcGVydGllcyA9IExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllczo6QURWX0lORDsKLSAgICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RhYmxlICYmIGNvbmZpZy5kaXJlY3RlZCkgewotICAgICAgICAgICAgaWYgKGNvbmZpZy5oaWdoX2R1dHlfZGlyZWN0ZWRfY29ubmVjdGFibGUpIHsKLSAgICAgICAgICAgICAgbGVnYWN5X3Byb3BlcnRpZXMgPSBMZWdhY3lBZHZlcnRpc2luZ1Byb3BlcnRpZXM6OkFEVl9ESVJFQ1RfSU5EX0hJR0g7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBsZWdhY3lfcHJvcGVydGllcyA9IExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllczo6QURWX0RJUkVDVF9JTkRfTE9XOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29uZmlnLnNjYW5uYWJsZSAmJiAhY29uZmlnLmNvbm5lY3RhYmxlKSB7Ci0gICAgICAgICAgICBsZWdhY3lfcHJvcGVydGllcyA9IExlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllczo6QURWX1NDQU5fSU5EOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIWNvbmZpZy5zY2FubmFibGUgJiYgIWNvbmZpZy5jb25uZWN0YWJsZSkgewotICAgICAgICAgICAgbGVnYWN5X3Byb3BlcnRpZXMgPSBMZWdhY3lBZHZlcnRpc2luZ1Byb3BlcnRpZXM6OkFEVl9OT05DT05OX0lORDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICBsZWdhY3lfcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgIGNvbmZpZy5pbnRlcnZhbF9taW4sCi0gICAgICAgICAgICAgICAgICBjb25maWcuaW50ZXJ2YWxfbWF4LAotICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFwLAotICAgICAgICAgICAgICAgICAgY29uZmlnLm93bl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICBjb25maWcucGVlcl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICBjb25maWcucGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICBjb25maWcudHhfcG93ZXIsCi0gICAgICAgICAgICAgICAgICBjb25maWcuc2lkLAotICAgICAgICAgICAgICAgICAgY29uZmlnLmVuYWJsZV9zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9ucyksCi0gICAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAmaW1wbDo6b25fc2V0X2V4dGVuZGVkX2FkdmVydGlzaW5nX3BhcmFtZXRlcnNfY29tcGxldGU8Ci0gICAgICAgICAgICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVyc0NvbXBsZXRlVmlldz4sCi0gICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdWludDhfdCBsZWdhY3lfcHJvcGVydGllcyA9IChjb25maWcuY29ubmVjdGFibGUgPyAweDEgOiAweDAwKSB8IChjb25maWcuc2Nhbm5hYmxlID8gMHgyIDogMHgwMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLmRpcmVjdGVkID8gMHg0IDogMHgwMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLmhpZ2hfZHV0eV9kaXJlY3RlZF9jb25uZWN0YWJsZSA/IDB4OCA6IDB4MDApOwotICAgICAgICAgIHVpbnQ4X3QgZXh0ZW5kZWRfcHJvcGVydGllcyA9IChjb25maWcuYW5vbnltb3VzID8gMHgyMCA6IDB4MDApIHwgKGNvbmZpZy5pbmNsdWRlX3R4X3Bvd2VyID8gMHg0MCA6IDB4MDApOwotICAgICAgICAgIGV4dGVuZGVkX3Byb3BlcnRpZXMgPSBleHRlbmRlZF9wcm9wZXJ0aWVzID4+IDU7Ci0KLSAgICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgICAgaGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgIGxlZ2FjeV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgIGNvbmZpZy5pbnRlcnZhbF9taW4sCi0gICAgICAgICAgICAgICAgICBjb25maWcuaW50ZXJ2YWxfbWF4LAotICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFwLAotICAgICAgICAgICAgICAgICAgY29uZmlnLm93bl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICBjb25maWcucGVlcl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICBjb25maWcucGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICBjb25maWcudHhfcG93ZXIsCi0gICAgICAgICAgICAgICAgICAoY29uZmlnLnVzZV9sZV9jb2RlZF9waHkgPyBQcmltYXJ5UGh5VHlwZTo6TEVfQ09ERUQgOiBQcmltYXJ5UGh5VHlwZTo6TEVfMU0pLAotICAgICAgICAgICAgICAgICAgY29uZmlnLnNlY29uZGFyeV9tYXhfc2tpcCwKLSAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5LAotICAgICAgICAgICAgICAgICAgY29uZmlnLnNpZCwKLSAgICAgICAgICAgICAgICAgIGNvbmZpZy5lbmFibGVfc2Nhbl9yZXF1ZXN0X25vdGlmaWNhdGlvbnMpLAotICAgICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24oCi0gICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgJmltcGw6Om9uX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19wYXJhbWV0ZXJzX2NvbXBsZXRlPAotICAgICAgICAgICAgICAgICAgICAgIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnNDb21wbGV0ZVZpZXc+LAotICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X2RhdGEoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQsIGJvb2wgc2V0X3NjYW5fcnNwLCBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBkYXRhKSB7Ci0gICAgaWYgKCFzZXRfc2Nhbl9yc3AgJiYgYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uY29ubmVjdGFibGUpIHsKLSAgICAgIEdhcERhdGEgZ2FwX2RhdGE7Ci0gICAgICBnYXBfZGF0YS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkZMQUdTOwotICAgICAgaWYgKGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLmR1cmF0aW9uID09IDApIHsKLSAgICAgICAgZ2FwX2RhdGEuZGF0YV8ucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFkdmVydGlzaW5nRmxhZzo6TEVfR0VORVJBTF9ESVNDT1ZFUkFCTEUpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdhcF9kYXRhLmRhdGFfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihBZHZlcnRpc2luZ0ZsYWc6OkxFX0xJTUlURURfRElTQ09WRVJBQkxFKSk7Ci0gICAgICB9Ci0gICAgICBkYXRhLmluc2VydChkYXRhLmJlZ2luKCksIGdhcF9kYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBGaW5kIGFuZCBmaWxsIFRYIFBvd2VyIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuCi0gICAgZm9yIChhdXRvJiBnYXBfZGF0YSA6IGRhdGEpIHsKLSAgICAgIGlmIChnYXBfZGF0YS5kYXRhX3R5cGVfID09IEdhcERhdGFUeXBlOjpUWF9QT1dFUl9MRVZFTCkgewotICAgICAgICBnYXBfZGF0YS5kYXRhX1swXSA9IGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLnR4X3Bvd2VyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFkdmVydGlzaW5nX2FwaV90eXBlXykgewotICAgICAgY2FzZSAoQWR2ZXJ0aXNpbmdBcGlUeXBlOjpMRUdBQ1kpOiB7Ci0gICAgICAgIGlmIChzZXRfc2Nhbl9yc3ApIHsKLSAgICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgICAgaGNpOjpMZVNldFNjYW5SZXNwb25zZURhdGFCdWlsZGVyOjpDcmVhdGUoZGF0YSksCi0gICAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgIHRoaXMsICZpbXBsOjpjaGVja19zdGF0dXNfd2l0aF9pZDxMZVNldFNjYW5SZXNwb25zZURhdGFDb21wbGV0ZVZpZXc+LCBhZHZlcnRpc2VyX2lkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICAgIGhjaTo6TGVTZXRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyOjpDcmVhdGUoZGF0YSksCi0gICAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgIHRoaXMsICZpbXBsOjpjaGVja19zdGF0dXNfd2l0aF9pZDxMZVNldEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlVmlldz4sIGFkdmVydGlzZXJfaWQpKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6QU5EUk9JRF9IQ0kpOiB7Ci0gICAgICAgIGlmIChzZXRfc2Nhbl9yc3ApIHsKLSAgICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgICAgaGNpOjpMZU11bHRpQWR2dFNldFNjYW5SZXNwQnVpbGRlcjo6Q3JlYXRlKGRhdGEsIGFkdmVydGlzZXJfaWQpLAotICAgICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6OmNoZWNrX3N0YXR1c193aXRoX2lkPExlTXVsdGlBZHZ0Q29tcGxldGVWaWV3PiwgYWR2ZXJ0aXNlcl9pZCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgICBoY2k6OkxlTXVsdGlBZHZ0U2V0RGF0YUJ1aWxkZXI6OkNyZWF0ZShkYXRhLCBhZHZlcnRpc2VyX2lkKSwKLSAgICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpjaGVja19zdGF0dXNfd2l0aF9pZDxMZU11bHRpQWR2dENvbXBsZXRlVmlldz4sIGFkdmVydGlzZXJfaWQpKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6RVhURU5ERUQpOiB7Ci0gICAgICAgIHVpbnQxNl90IGRhdGFfbGVuID0gMDsKLSAgICAgICAgLy8gY2hlY2sgZGF0YSBzaXplCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgICAgIGlmIChkYXRhW2ldLnNpemUoKSA+IGtMZU1heGltdW1GcmFnbWVudExlbmd0aCkgewotICAgICAgICAgICAgTE9HX1dBUk4oIkFEIGRhdGEgbGVuIHNoYWxsIG5vdCBncmVhdGVyIHRoYW4gJWQiLCBrTGVNYXhpbXVtRnJhZ21lbnRMZW5ndGgpOwotICAgICAgICAgICAgaWYgKGFkdmVydGlzaW5nX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICBpZiAoc2V0X3NjYW5fcnNwKSB7Ci0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25TY2FuUmVzcG9uc2VEYXRhU2V0KAotICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6SU5URVJOQUxfRVJST1IpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uQWR2ZXJ0aXNpbmdEYXRhU2V0KAotICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6SU5URVJOQUxfRVJST1IpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGRhdGFfbGVuICs9IGRhdGFbaV0uc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGFfbGVuID4gbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF8pIHsKLSAgICAgICAgICBMT0dfV0FSTigKLSAgICAgICAgICAgICAgImFkdmVydGlzaW5nIGRhdGEgbGVuIGV4Y2VlZHMgbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF8gJWQiLAotICAgICAgICAgICAgICBsZV9tYXhpbXVtX2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoXyk7Ci0gICAgICAgICAgaWYgKGFkdmVydGlzaW5nX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaWYgKHNldF9zY2FuX3JzcCkgewotICAgICAgICAgICAgICBhZHZlcnRpc2luZ19jYWxsYmFja3NfLT5PblNjYW5SZXNwb25zZURhdGFTZXQoCi0gICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6REFUQV9UT09fTEFSR0UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25BZHZlcnRpc2luZ0RhdGFTZXQoCi0gICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6REFUQV9UT09fTEFSR0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YV9sZW4gPD0ga0xlTWF4aW11bUZyYWdtZW50TGVuZ3RoKSB7Ci0gICAgICAgICAgc2VuZF9kYXRhX2ZyYWdtZW50KGFkdmVydGlzZXJfaWQsIHNldF9zY2FuX3JzcCwgZGF0YSwgT3BlcmF0aW9uOjpDT01QTEVURV9BRFZFUlRJU0VNRU5UKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBzdWJfZGF0YTsKLSAgICAgICAgICB1aW50MTZfdCBzdWJfZGF0YV9sZW4gPSAwOwotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBPcGVyYXRpb246OkZJUlNUX0ZSQUdNRU5UOwotCi0gICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3ViX2RhdGFfbGVuICsgZGF0YVtpXS5zaXplKCkgPiBrTGVNYXhpbXVtRnJhZ21lbnRMZW5ndGgpIHsKLSAgICAgICAgICAgICAgc2VuZF9kYXRhX2ZyYWdtZW50KGFkdmVydGlzZXJfaWQsIHNldF9zY2FuX3JzcCwgc3ViX2RhdGEsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgIG9wZXJhdGlvbiA9IE9wZXJhdGlvbjo6SU5URVJNRURJQVRFX0ZSQUdNRU5UOwotICAgICAgICAgICAgICBzdWJfZGF0YV9sZW4gPSAwOwotICAgICAgICAgICAgICBzdWJfZGF0YS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3ViX2RhdGEucHVzaF9iYWNrKGRhdGFbaV0pOwotICAgICAgICAgICAgc3ViX2RhdGFfbGVuICs9IGRhdGFbaV0uc2l6ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzZW5kX2RhdGFfZnJhZ21lbnQoYWR2ZXJ0aXNlcl9pZCwgc2V0X3NjYW5fcnNwLCBzdWJfZGF0YSwgT3BlcmF0aW9uOjpMQVNUX0ZSQUdNRU5UKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNlbmRfZGF0YV9mcmFnbWVudCgKLSAgICAgIEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBib29sIHNldF9zY2FuX3JzcCwgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gZGF0YSwgT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgIGlmIChvcGVyYXRpb24gPT0gT3BlcmF0aW9uOjpDT01QTEVURV9BRFZFUlRJU0VNRU5UIHx8IG9wZXJhdGlvbiA9PSBPcGVyYXRpb246OkxBU1RfRlJBR01FTlQpIHsKLSAgICAgIGlmIChzZXRfc2Nhbl9yc3ApIHsKLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBvcGVyYXRpb24sIGtGcmFnbWVudF9wcmVmZXJlbmNlLCBkYXRhKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICB0aGlzLCAmaW1wbDo6Y2hlY2tfc3RhdHVzX3dpdGhfaWQ8TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQ29tcGxldGVWaWV3PiwgYWR2ZXJ0aXNlcl9pZCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyOjpDcmVhdGUoYWR2ZXJ0aXNlcl9pZCwgb3BlcmF0aW9uLCBrRnJhZ21lbnRfcHJlZmVyZW5jZSwgZGF0YSksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24oCi0gICAgICAgICAgICAgICAgdGhpcywgJmltcGw6OmNoZWNrX3N0YXR1c193aXRoX2lkPExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGFDb21wbGV0ZVZpZXc+LCBhZHZlcnRpc2VyX2lkKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEZvciBmaXJzdCBhbmQgaW50ZXJtZWRpYXRlIGZyYWdtZW50LCBkbyBub3QgdHJpZ2dlciBhZHZlcnRpc2luZ19jYWxsYmFja3NfLgotICAgICAgaWYgKHNldF9zY2FuX3JzcCkgewotICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsIG9wZXJhdGlvbiwga0ZyYWdtZW50X3ByZWZlcmVuY2UsIGRhdGEpLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZShpbXBsOjpjaGVja19zdGF0dXM8TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQ29tcGxldGVWaWV3PikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGFCdWlsZGVyOjpDcmVhdGUoYWR2ZXJ0aXNlcl9pZCwgb3BlcmF0aW9uLCBrRnJhZ21lbnRfcHJlZmVyZW5jZSwgZGF0YSksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlKGltcGw6OmNoZWNrX3N0YXR1czxMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGVWaWV3PikpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgZW5hYmxlX2FkdmVydGlzZXIoCi0gICAgICBBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsIHVpbnQxNl90IGR1cmF0aW9uLCB1aW50OF90IG1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMpIHsKLSAgICBFbmFibGVkU2V0IGN1cnJfc2V0OwotICAgIGN1cnJfc2V0LmFkdmVydGlzaW5nX2hhbmRsZV8gPSBhZHZlcnRpc2VyX2lkOwotICAgIGN1cnJfc2V0LmR1cmF0aW9uXyA9IGR1cmF0aW9uOwotICAgIGN1cnJfc2V0Lm1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHNfID0gbWF4X2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50czsKLSAgICBzdGQ6OnZlY3RvcjxFbmFibGVkU2V0PiBlbmFibGVkX3NldHMgPSB7Y3Vycl9zZXR9OwotICAgIEVuYWJsZSBlbmFibGVfdmFsdWUgPSBlbmFibGUgPyBFbmFibGU6OkVOQUJMRUQgOiBFbmFibGU6OkRJU0FCTEVEOwotCi0gICAgc3dpdGNoIChhZHZlcnRpc2luZ19hcGlfdHlwZV8pIHsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6TEVHQUNZKTogewotICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVTZXRBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXI6OkNyZWF0ZShlbmFibGVfdmFsdWUpLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgJmltcGw6Om9uX3NldF9hZHZlcnRpc2luZ19lbmFibGVfY29tcGxldGU8TGVTZXRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlVmlldz4sCi0gICAgICAgICAgICAgICAgZW5hYmxlLAotICAgICAgICAgICAgICAgIGVuYWJsZWRfc2V0cykpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6QU5EUk9JRF9IQ0kpOiB7Ci0gICAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZU11bHRpQWR2dFNldEVuYWJsZUJ1aWxkZXI6OkNyZWF0ZShlbmFibGVfdmFsdWUsIGFkdmVydGlzZXJfaWQpLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICAgIHRoaXMsICZpbXBsOjpvbl9zZXRfYWR2ZXJ0aXNpbmdfZW5hYmxlX2NvbXBsZXRlPExlTXVsdGlBZHZ0Q29tcGxldGVWaWV3PiwgZW5hYmxlLCBlbmFibGVkX3NldHMpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChBZHZlcnRpc2luZ0FwaVR5cGU6OkVYVEVOREVEKTogewotICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKGVuYWJsZV92YWx1ZSwgZW5hYmxlZF9zZXRzKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICZpbXBsOjpvbl9zZXRfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZW5hYmxlX2NvbXBsZXRlPExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlVmlldz4sCi0gICAgICAgICAgICAgICAgZW5hYmxlLAotICAgICAgICAgICAgICAgIGVuYWJsZWRfc2V0cykpOwotICAgICAgfSBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICBlbmFibGVkX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkdmVydGlzaW5nX2hhbmRsZV8gPSBhZHZlcnRpc2VyX2lkOwotICAgICAgYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uZHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLm1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMgPSBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbmFibGVkX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkdmVydGlzaW5nX2hhbmRsZV8gPSBrSW52YWxpZEhhbmRsZTsKLSAgICAgIGlmIChhZHZlcnRpc2luZ19zZXRzX1thZHZlcnRpc2VyX2lkXS5hZGRyZXNzX3JvdGF0aW9uX2FsYXJtICE9IG51bGxwdHIpIHsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uYWRkcmVzc19yb3RhdGlvbl9hbGFybS0+Q2FuY2VsKCk7Ci0gICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2FkdmVydGlzZXJfaWRdLmFkZHJlc3Nfcm90YXRpb25fYWxhcm0ucmVzZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldF9wZXJpb2RpY19wYXJhbWV0ZXIoCi0gICAgICBBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZCwgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfcGFyYW1ldGVycykgewotICAgIHVpbnQ4X3QgaW5jbHVkZV90eF9wb3dlciA9IHBlcmlvZGljX2FkdmVydGlzaW5nX3BhcmFtZXRlcnMucHJvcGVydGllcyA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzOjpBZHZlcnRpc2luZ1Byb3BlcnR5OjpJTkNMVURFX1RYX1BPV0VSOwotCi0gICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIGhjaTo6TGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1CdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfcGFyYW1ldGVycy5taW5faW50ZXJ2YWwsCi0gICAgICAgICAgICBwZXJpb2RpY19hZHZlcnRpc2luZ19wYXJhbWV0ZXJzLm1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgIGluY2x1ZGVfdHhfcG93ZXIpLAotICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24oCi0gICAgICAgICAgICB0aGlzLCAmaW1wbDo6Y2hlY2tfc3RhdHVzX3dpdGhfaWQ8TGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1Db21wbGV0ZVZpZXc+LCBhZHZlcnRpc2VyX2lkKSk7Ci0gIH0KLQotICB2b2lkIHNldF9wZXJpb2RpY19kYXRhKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBkYXRhKSB7Ci0gICAgdWludDE2X3QgZGF0YV9sZW4gPSAwOwotICAgIC8vIGNoZWNrIGRhdGEgc2l6ZQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGRhdGFbaV0uc2l6ZSgpID4ga0xlTWF4aW11bUZyYWdtZW50TGVuZ3RoKSB7Ci0gICAgICAgIExPR19XQVJOKCJBRCBkYXRhIGxlbiBzaGFsbCBub3QgZ3JlYXRlciB0aGFuICVkIiwga0xlTWF4aW11bUZyYWdtZW50TGVuZ3RoKTsKLSAgICAgICAgaWYgKGFkdmVydGlzaW5nX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgewotICAgICAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uUGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFTZXQoCi0gICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpJTlRFUk5BTF9FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZGF0YV9sZW4gKz0gZGF0YVtpXS5zaXplKCk7Ci0gICAgfQotCi0gICAgaWYgKGRhdGFfbGVuID4gbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF8pIHsKLSAgICAgIExPR19XQVJOKAotICAgICAgICAgICJhZHZlcnRpc2luZyBkYXRhIGxlbiBleGNlZWRzIGxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGhfICVkIiwgbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF8pOwotICAgICAgaWYgKGFkdmVydGlzaW5nX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgewotICAgICAgICBhZHZlcnRpc2luZ19jYWxsYmFja3NfLT5PblBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhU2V0KAotICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OkRBVEFfVE9PX0xBUkdFKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZGF0YV9sZW4gPD0ga0xlTWF4aW11bUZyYWdtZW50TGVuZ3RoKSB7Ci0gICAgICBzZW5kX3BlcmlvZGljX2RhdGFfZnJhZ21lbnQoYWR2ZXJ0aXNlcl9pZCwgZGF0YSwgT3BlcmF0aW9uOjpDT01QTEVURV9BRFZFUlRJU0VNRU5UKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gc3ViX2RhdGE7Ci0gICAgICB1aW50MTZfdCBzdWJfZGF0YV9sZW4gPSAwOwotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IE9wZXJhdGlvbjo6RklSU1RfRlJBR01FTlQ7Ci0KLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3ViX2RhdGFfbGVuICsgZGF0YVtpXS5zaXplKCkgPiBrTGVNYXhpbXVtRnJhZ21lbnRMZW5ndGgpIHsKLSAgICAgICAgICBzZW5kX3BlcmlvZGljX2RhdGFfZnJhZ21lbnQoYWR2ZXJ0aXNlcl9pZCwgc3ViX2RhdGEsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgb3BlcmF0aW9uID0gT3BlcmF0aW9uOjpJTlRFUk1FRElBVEVfRlJBR01FTlQ7Ci0gICAgICAgICAgc3ViX2RhdGFfbGVuID0gMDsKLSAgICAgICAgICBzdWJfZGF0YS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHN1Yl9kYXRhLnB1c2hfYmFjayhkYXRhW2ldKTsKLSAgICAgICAgc3ViX2RhdGFfbGVuICs9IGRhdGFbaV0uc2l6ZSgpOwotICAgICAgfQotICAgICAgc2VuZF9wZXJpb2RpY19kYXRhX2ZyYWdtZW50KGFkdmVydGlzZXJfaWQsIHN1Yl9kYXRhLCBPcGVyYXRpb246OkxBU1RfRlJBR01FTlQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2VuZF9wZXJpb2RpY19kYXRhX2ZyYWdtZW50KEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBkYXRhLCBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgaWYgKG9wZXJhdGlvbiA9PSBPcGVyYXRpb246OkNPTVBMRVRFX0FEVkVSVElTRU1FTlQgfHwgb3BlcmF0aW9uID09IE9wZXJhdGlvbjo6TEFTVF9GUkFHTUVOVCkgewotICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgaGNpOjpMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhQnVpbGRlcjo6Q3JlYXRlKGFkdmVydGlzZXJfaWQsIG9wZXJhdGlvbiwgZGF0YSksCi0gICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICB0aGlzLCAmaW1wbDo6Y2hlY2tfc3RhdHVzX3dpdGhfaWQ8TGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YUNvbXBsZXRlVmlldz4sIGFkdmVydGlzZXJfaWQpKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gRm9yIGZpcnN0IGFuZCBpbnRlcm1lZGlhdGUgZnJhZ21lbnQsIGRvIG5vdCB0cmlnZ2VyIGFkdmVydGlzaW5nX2NhbGxiYWNrc18uCi0gICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICBoY2k6OkxlU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFCdWlsZGVyOjpDcmVhdGUoYWR2ZXJ0aXNlcl9pZCwgb3BlcmF0aW9uLCBkYXRhKSwKLSAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlKGltcGw6OmNoZWNrX3N0YXR1czxMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGVWaWV3PikpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgZW5hYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBib29sIGVuYWJsZSkgewotICAgIEVuYWJsZSBlbmFibGVfdmFsdWUgPSBlbmFibGUgPyBFbmFibGU6OkVOQUJMRUQgOiBFbmFibGU6OkRJU0FCTEVEOwotCi0gICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIGhjaTo6TGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKGVuYWJsZV92YWx1ZSwgYWR2ZXJ0aXNlcl9pZCksCi0gICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAmaW1wbDo6b25fc2V0X3BlcmlvZGljX2FkdmVydGlzaW5nX2VuYWJsZV9jb21wbGV0ZTxMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZVZpZXc+LAotICAgICAgICAgICAgZW5hYmxlLAotICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpOwotICB9Ci0KLSAgdm9pZCBPblBhdXNlKCkgb3ZlcnJpZGUgewotICAgIHBhdXNlZCA9IHRydWU7Ci0gICAgaWYgKCFhZHZlcnRpc2luZ19zZXRzXy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxFbmFibGVkU2V0PiBlbmFibGVkX3NldHMgPSB7fTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5hYmxlZF9zZXRzXy5zaXplKCk7IGkrKykgewotICAgICAgICBFbmFibGVkU2V0IGN1cnJfc2V0ID0gZW5hYmxlZF9zZXRzX1tpXTsKLSAgICAgICAgaWYgKGVuYWJsZWRfc2V0c19baV0uYWR2ZXJ0aXNpbmdfaGFuZGxlXyAhPSBrSW52YWxpZEhhbmRsZSkgewotICAgICAgICAgIGVuYWJsZWRfc2V0cy5wdXNoX2JhY2soZW5hYmxlZF9zZXRzX1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChhZHZlcnRpc2luZ19hcGlfdHlwZV8pIHsKLSAgICAgICAgY2FzZSAoQWR2ZXJ0aXNpbmdBcGlUeXBlOjpMRUdBQ1kpOiB7Ci0gICAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICAgIGhjaTo6TGVTZXRBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXI6OkNyZWF0ZShFbmFibGU6OkRJU0FCTEVEKSwKLSAgICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICZpbXBsOjpvbl9zZXRfYWR2ZXJ0aXNpbmdfZW5hYmxlX2NvbXBsZXRlPExlU2V0QWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZVZpZXc+LAotICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICBlbmFibGVkX3NldHMpKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSAoQWR2ZXJ0aXNpbmdBcGlUeXBlOjpBTkRST0lEX0hDSSk6IHsKLSAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuYWJsZWRfc2V0c18uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgaWQgPSBlbmFibGVkX3NldHNfW2ldLmFkdmVydGlzaW5nX2hhbmRsZV87Ci0gICAgICAgICAgICBpZiAoaWQgIT0ga0ludmFsaWRIYW5kbGUpIHsKLSAgICAgICAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICBoY2k6OkxlTXVsdGlBZHZ0U2V0RW5hYmxlQnVpbGRlcjo6Q3JlYXRlKEVuYWJsZTo6RElTQUJMRUQsIGlkKSwKLSAgICAgICAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzPExlTXVsdGlBZHZ0Q29tcGxldGVWaWV3PikpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSAoQWR2ZXJ0aXNpbmdBcGlUeXBlOjpFWFRFTkRFRCk6IHsKLSAgICAgICAgICBpZiAoZW5hYmxlZF9zZXRzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICBoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUJ1aWxkZXI6OkNyZWF0ZShFbmFibGU6OkRJU0FCTEVELCBlbmFibGVkX3NldHMpLAotICAgICAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgJmltcGw6Om9uX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19lbmFibGVfY29tcGxldGU8TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQ29tcGxldGVWaWV3PiwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRfc2V0cykpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXy0+QWNrUGF1c2UodGhpcyk7Ci0gIH0KLQotICB2b2lkIE9uUmVzdW1lKCkgb3ZlcnJpZGUgewotICAgIHBhdXNlZCA9IGZhbHNlOwotICAgIGlmICghYWR2ZXJ0aXNpbmdfc2V0c18uZW1wdHkoKSkgewotICAgICAgc3RkOjp2ZWN0b3I8RW5hYmxlZFNldD4gZW5hYmxlZF9zZXRzID0ge307Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuYWJsZWRfc2V0c18uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRW5hYmxlZFNldCBjdXJyX3NldCA9IGVuYWJsZWRfc2V0c19baV07Ci0gICAgICAgIGlmIChlbmFibGVkX3NldHNfW2ldLmFkdmVydGlzaW5nX2hhbmRsZV8gIT0ga0ludmFsaWRIYW5kbGUpIHsKLSAgICAgICAgICBlbmFibGVkX3NldHMucHVzaF9iYWNrKGVuYWJsZWRfc2V0c19baV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHN3aXRjaCAoYWR2ZXJ0aXNpbmdfYXBpX3R5cGVfKSB7Ci0gICAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6TEVHQUNZKTogewotICAgICAgICAgIGxlX2FkdmVydGlzaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgICBoY2k6OkxlU2V0QWR2ZXJ0aXNpbmdFbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVEKSwKLSAgICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICZpbXBsOjpvbl9zZXRfYWR2ZXJ0aXNpbmdfZW5hYmxlX2NvbXBsZXRlPExlU2V0QWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZVZpZXc+LAotICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgIGVuYWJsZWRfc2V0cykpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIChBZHZlcnRpc2luZ0FwaVR5cGU6OkFORFJPSURfSENJKTogewotICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5hYmxlZF9zZXRzXy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgdWludDhfdCBpZCA9IGVuYWJsZWRfc2V0c19baV0uYWR2ZXJ0aXNpbmdfaGFuZGxlXzsKLSAgICAgICAgICAgIGlmIChpZCAhPSBrSW52YWxpZEhhbmRsZSkgewotICAgICAgICAgICAgICBsZV9hZHZlcnRpc2luZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgIGhjaTo6TGVNdWx0aUFkdnRTZXRFbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVELCBpZCksCi0gICAgICAgICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlKGltcGw6OmNoZWNrX3N0YXR1czxMZU11bHRpQWR2dENvbXBsZXRlVmlldz4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgKEFkdmVydGlzaW5nQXBpVHlwZTo6RVhURU5ERUQpOiB7Ci0gICAgICAgICAgaWYgKGVuYWJsZWRfc2V0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgaGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVELCBlbmFibGVkX3NldHMpLAotICAgICAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgJmltcGw6Om9uX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19lbmFibGVfY29tcGxldGU8TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlQ29tcGxldGVWaWV3PiwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlZF9zZXRzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5BY2tSZXN1bWUodGhpcyk7Ci0gIH0KLQotICBjb21tb246OkNhbGxiYWNrPHZvaWQoQWRkcmVzcywgQWRkcmVzc1R5cGUpPiBzY2FuX2NhbGxiYWNrXzsKLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFcnJvckNvZGUsIHVpbnQxNl90LCBoY2k6OkFkZHJlc3NXaXRoVHlwZSk+IHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrX3t9OwotICBBZHZlcnRpc2luZ0NhbGxiYWNrKiBhZHZlcnRpc2luZ19jYWxsYmFja3NfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIHJlZ2lzdGVyZWRfaGFuZGxlcl97bnVsbHB0cn07Ci0gIE1vZHVsZSogbW9kdWxlXzsKLSAgb3M6OkhhbmRsZXIqIG1vZHVsZV9oYW5kbGVyXzsKLSAgaGNpOjpIY2lMYXllciogaGNpX2xheWVyXzsKLSAgaGNpOjpDb250cm9sbGVyKiBjb250cm9sbGVyXzsKLSAgdWludDE2X3QgbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF87Ci0gIGludDhfdCBsZV9waHlzaWNhbF9jaGFubmVsX3R4X3Bvd2VyXyA9IDA7Ci0gIGhjaTo6TGVBZHZlcnRpc2luZ0ludGVyZmFjZSogbGVfYWR2ZXJ0aXNpbmdfaW50ZXJmYWNlXzsKLSAgc3RkOjptYXA8QWR2ZXJ0aXNlcklkLCBBZHZlcnRpc2VyPiBhZHZlcnRpc2luZ19zZXRzXzsKLSAgaGNpOjpMZUFkZHJlc3NNYW5hZ2VyKiBsZV9hZGRyZXNzX21hbmFnZXJfOwotICBoY2k6OkFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyXzsKLSAgYm9vbCBhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICBib29sIHBhdXNlZCA9IGZhbHNlOwotCi0gIHN0ZDo6bXV0ZXggaWRfbXV0ZXhfOwotICBzaXplX3QgbnVtX2luc3RhbmNlc187Ci0gIHN0ZDo6dmVjdG9yPGhjaTo6RW5hYmxlZFNldD4gZW5hYmxlZF9zZXRzXzsKLSAgc3RkOjptYXA8dWludDhfdCwgaW50PiBpZF9tYXBfOwotCi0gIEFkdmVydGlzaW5nQXBpVHlwZSBhZHZlcnRpc2luZ19hcGlfdHlwZV97MH07Ci0KLSAgdm9pZCBvbl9yZWFkX2FkdmVydGlzaW5nX3BoeXNpY2FsX2NoYW5uZWxfdHhfcG93ZXIoQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVSZWFkQWR2ZXJ0aXNpbmdQaHlzaWNhbENoYW5uZWxUeFBvd2VyQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgaWYgKCFjb21wbGV0ZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgYXV0byBwYXlsb2FkID0gdmlldy5HZXRQYXlsb2FkKCk7Ci0gICAgICBpZiAocGF5bG9hZC5zaXplKCkgPT0gMSAmJiBwYXlsb2FkWzBdID09IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEVycm9yQ29kZTo6VU5LTk9XTl9IQ0lfQ09NTUFORCkpIHsKLSAgICAgICAgTE9HX0lORk8oIlVua25vd24gY29tbWFuZCwgbm90IHNldHRpbmcgdHggcG93ZXIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0lORk8oIkdvdCBhIGNvbW1hbmQgY29tcGxldGUgd2l0aCBzdGF0dXMgJXMiLCBFcnJvckNvZGVUZXh0KGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZV9waHlzaWNhbF9jaGFubmVsX3R4X3Bvd2VyXyA9IGNvbXBsZXRlX3ZpZXcuR2V0VHJhbnNtaXRQb3dlckxldmVsKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVmlldz4KLSAgdm9pZCBvbl9zZXRfYWR2ZXJ0aXNpbmdfZW5hYmxlX2NvbXBsZXRlKGJvb2wgZW5hYmxlLCBzdGQ6OnZlY3RvcjxFbmFibGVkU2V0PiBlbmFibGVkX3NldHMsIENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXMgYWR2ZXJ0aXNpbmdfc3RhdHVzID0gQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1M7Ci0gICAgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBMT0dfSU5GTygiR290IGEgY29tbWFuZCBjb21wbGV0ZSB3aXRoIHN0YXR1cyAlcyIsIEVycm9yQ29kZVRleHQoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSkuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKGFkdmVydGlzaW5nX2NhbGxiYWNrc18gPT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKEVuYWJsZWRTZXQgZW5hYmxlZF9zZXQgOiBlbmFibGVkX3NldHMpIHsKLSAgICAgIGJvb2wgc3RhcnRlZCA9IGFkdmVydGlzaW5nX3NldHNfW2VuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZV9dLnN0YXJ0ZWQ7Ci0gICAgICB1aW50OF90IGlkID0gZW5hYmxlZF9zZXQuYWR2ZXJ0aXNpbmdfaGFuZGxlXzsKLSAgICAgIGlmIChpZCA9PSBrSW52YWxpZEhhbmRsZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0YXJ0ZWQpIHsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25BZHZlcnRpc2luZ0VuYWJsZWQoaWQsIGVuYWJsZSwgYWR2ZXJ0aXNpbmdfc3RhdHVzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCByZWdfaWQgPSBpZF9tYXBfW2lkXTsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfc2V0c19bZW5hYmxlZF9zZXQuYWR2ZXJ0aXNpbmdfaGFuZGxlX10uc3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uQWR2ZXJ0aXNpbmdTZXRTdGFydGVkKHJlZ19pZCwgaWQsIGxlX3BoeXNpY2FsX2NoYW5uZWxfdHhfcG93ZXJfLCBhZHZlcnRpc2luZ19zdGF0dXMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBWaWV3PgotICB2b2lkIG9uX3NldF9leHRlbmRlZF9hZHZlcnRpc2luZ19lbmFibGVfY29tcGxldGUoCi0gICAgICBib29sIGVuYWJsZSwgc3RkOjp2ZWN0b3I8RW5hYmxlZFNldD4gZW5hYmxlZF9zZXRzLCBDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXMgYWR2ZXJ0aXNpbmdfc3RhdHVzID0gQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1M7Ci0gICAgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBMT0dfSU5GTygiR290IGEgY29tbWFuZCBjb21wbGV0ZSB3aXRoIHN0YXR1cyAlcyIsIEVycm9yQ29kZVRleHQoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSkuY19zdHIoKSk7Ci0gICAgICBhZHZlcnRpc2luZ19zdGF0dXMgPSBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKGFkdmVydGlzaW5nX2NhbGxiYWNrc18gPT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoRW5hYmxlZFNldCBlbmFibGVkX3NldCA6IGVuYWJsZWRfc2V0cykgewotICAgICAgaW50OF90IHR4X3Bvd2VyID0gYWR2ZXJ0aXNpbmdfc2V0c19bZW5hYmxlZF9zZXQuYWR2ZXJ0aXNpbmdfaGFuZGxlX10udHhfcG93ZXI7Ci0gICAgICBib29sIHN0YXJ0ZWQgPSBhZHZlcnRpc2luZ19zZXRzX1tlbmFibGVkX3NldC5hZHZlcnRpc2luZ19oYW5kbGVfXS5zdGFydGVkOwotICAgICAgdWludDhfdCBpZCA9IGVuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZV87Ci0gICAgICBpZiAoaWQgPT0ga0ludmFsaWRIYW5kbGUpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdGFydGVkKSB7Ci0gICAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uQWR2ZXJ0aXNpbmdFbmFibGVkKGlkLCBlbmFibGUsIGFkdmVydGlzaW5nX3N0YXR1cyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQgcmVnX2lkID0gaWRfbWFwX1tpZF07Ci0gICAgICAgIGFkdmVydGlzaW5nX3NldHNfW2VuYWJsZWRfc2V0LmFkdmVydGlzaW5nX2hhbmRsZV9dLnN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBhZHZlcnRpc2luZ19jYWxsYmFja3NfLT5PbkFkdmVydGlzaW5nU2V0U3RhcnRlZChyZWdfaWQsIGlkLCB0eF9wb3dlciwgYWR2ZXJ0aXNpbmdfc3RhdHVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVmlldz4KLSAgdm9pZCBvbl9zZXRfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfcGFyYW1ldGVyc19jb21wbGV0ZShBZHZlcnRpc2VySWQgaWQsIENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVyc0NvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXMgYWR2ZXJ0aXNpbmdfc3RhdHVzID0gQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1M7Ci0gICAgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBMT0dfSU5GTygiR290IGEgY29tbWFuZCBjb21wbGV0ZSB3aXRoIHN0YXR1cyAlcyIsIEVycm9yQ29kZVRleHQoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSkuY19zdHIoKSk7Ci0gICAgICBhZHZlcnRpc2luZ19zdGF0dXMgPSBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgfQotICAgIGFkdmVydGlzaW5nX3NldHNfW2lkXS50eF9wb3dlciA9IGNvbXBsZXRlX3ZpZXcuR2V0U2VsZWN0ZWRUeFBvd2VyKCk7Ci0KLSAgICBpZiAoYWR2ZXJ0aXNpbmdfc2V0c19baWRdLnN0YXJ0ZWQpIHsKLSAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZChpZCwgYWR2ZXJ0aXNpbmdfc2V0c19baWRdLnR4X3Bvd2VyLCBhZHZlcnRpc2luZ19zdGF0dXMpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBWaWV3PgotICB2b2lkIG9uX3NldF9wZXJpb2RpY19hZHZlcnRpc2luZ19lbmFibGVfY29tcGxldGUoYm9vbCBlbmFibGUsIEFkdmVydGlzZXJJZCBpZCwgQ29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gICAgQVNTRVJUKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZVNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzIGFkdmVydGlzaW5nX3N0YXR1cyA9IEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTOwotICAgIGlmIChjb21wbGV0ZV92aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0lORk8oIkdvdCBhIGNvbW1hbmQgY29tcGxldGUgd2l0aCBzdGF0dXMgJXMiLCBFcnJvckNvZGVUZXh0KGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCkpOwotICAgICAgYWR2ZXJ0aXNpbmdfc3RhdHVzID0gQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChhZHZlcnRpc2luZ19jYWxsYmFja3NfID09IG51bGxwdHIgfHwgIWFkdmVydGlzaW5nX3NldHNfW2lkXS5zdGFydGVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25QZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlZChpZCwgZW5hYmxlLCBhZHZlcnRpc2luZ19zdGF0dXMpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFZpZXc+Ci0gIHZvaWQgb25fc2V0X2FkdmVydGlzaW5nX3NldF9yYW5kb21fYWRkcmVzc19jb21wbGV0ZSgKLSAgICAgIEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc0NvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgaWYgKGNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBMT0dfSU5GTygiR290IGEgY29tbWFuZCBjb21wbGV0ZSB3aXRoIHN0YXR1cyAlcyIsIEVycm9yQ29kZVRleHQoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSkuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19JTkZPKAotICAgICAgICAgICJ1cGRhdGUgcmFuZG9tIGFkZHJlc3MgZm9yIGFkdmVydGlzaW5nIHNldCAlZCA6ICVzIiwKLSAgICAgICAgICBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgYWR2ZXJ0aXNpbmdfc2V0c19bYWR2ZXJ0aXNlcl9pZF0uY3VycmVudF9hZGRyZXNzID0gYWRkcmVzc193aXRoX3R5cGU7Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFZpZXc+Ci0gIHZvaWQgY2hlY2tfc3RhdHVzX3dpdGhfaWQoQWR2ZXJ0aXNlcklkIGlkLCBDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICAgIGF1dG8gc3RhdHVzX3ZpZXcgPSBWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgaWYgKHN0YXR1c192aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgIkdvdCBhIENvbW1hbmQgY29tcGxldGUgJXMsIHN0YXR1cyAlcyIsCi0gICAgICAgICAgT3BDb2RlVGV4dCh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkuY19zdHIoKSwKLSAgICAgICAgICBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXMgYWR2ZXJ0aXNpbmdfc3RhdHVzID0gQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1M7Ci0gICAgaWYgKHN0YXR1c192aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0lORk8oIkdvdCBhIGNvbW1hbmQgY29tcGxldGUgd2l0aCBzdGF0dXMgJXMiLCBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICAgIGFkdmVydGlzaW5nX3N0YXR1cyA9IEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBEbyBub3QgdHJpZ2dlciBjYWxsYmFjayBpZiB0aGUgYWR2ZXJ0aXNlciBub3Qgc3RhdGVkIHlldAotICAgIGlmIChhZHZlcnRpc2luZ19jYWxsYmFja3NfID09IG51bGxwdHIgfHwgIWFkdmVydGlzaW5nX3NldHNfW2lkXS5zdGFydGVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgT3BDb2RlIG9wY29kZSA9IHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpOwotCi0gICAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICAgIGNhc2UgT3BDb2RlOjpMRV9TRVRfQURWRVJUSVNJTkdfUEFSQU1FVEVSUzoKLSAgICAgICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25BZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkKGlkLCBsZV9waHlzaWNhbF9jaGFubmVsX3R4X3Bvd2VyXywgYWR2ZXJ0aXNpbmdfc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9wQ29kZTo6TEVfU0VUX0FEVkVSVElTSU5HX0RBVEE6Ci0gICAgICBjYXNlIE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0RBVEE6Ci0gICAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uQWR2ZXJ0aXNpbmdEYXRhU2V0KGlkLCBhZHZlcnRpc2luZ19zdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT3BDb2RlOjpMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBOgotICAgICAgY2FzZSBPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19TQ0FOX1JFU1BPTlNFOgotICAgICAgICBhZHZlcnRpc2luZ19jYWxsYmFja3NfLT5PblNjYW5SZXNwb25zZURhdGFTZXQoaWQsIGFkdmVydGlzaW5nX3N0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPcENvZGU6OkxFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19QQVJBTToKLSAgICAgICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25QZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQoaWQsIGFkdmVydGlzaW5nX3N0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPcENvZGU6OkxFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBOgotICAgICAgICBhZHZlcnRpc2luZ19jYWxsYmFja3NfLT5PblBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhU2V0KGlkLCBhZHZlcnRpc2luZ19zdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT3BDb2RlOjpMRV9NVUxUSV9BRFZUOiB7Ci0gICAgICAgIGF1dG8gY29tbWFuZF92aWV3ID0gTGVNdWx0aUFkdnRDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgICAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBhdXRvIHN1Yl9vcGNvZGUgPSBjb21tYW5kX3ZpZXcuR2V0U3ViQ21kKCk7Ci0gICAgICAgIHN3aXRjaCAoc3ViX29wY29kZSkgewotICAgICAgICAgIGNhc2UgU3ViT2NmOjpTRVRfUEFSQU06Ci0gICAgICAgICAgICBhZHZlcnRpc2luZ19jYWxsYmFja3NfLT5PbkFkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQoCi0gICAgICAgICAgICAgICAgaWQsIGxlX3BoeXNpY2FsX2NoYW5uZWxfdHhfcG93ZXJfLCBhZHZlcnRpc2luZ19zdGF0dXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBTdWJPY2Y6OlNFVF9EQVRBOgotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXy0+T25BZHZlcnRpc2luZ0RhdGFTZXQoaWQsIGFkdmVydGlzaW5nX3N0YXR1cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFN1Yk9jZjo6U0VUX1NDQU5fUkVTUDoKLSAgICAgICAgICAgIGFkdmVydGlzaW5nX2NhbGxiYWNrc18tPk9uU2NhblJlc3BvbnNlRGF0YVNldChpZCwgYWR2ZXJ0aXNpbmdfc3RhdHVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfV0FSTigiVW5leHBlY3RlZCBzdWIgZXZlbnQgdHlwZSAlcyIsIFN1Yk9jZlRleHQoY29tbWFuZF92aWV3LkdldFN1YkNtZCgpKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19XQVJOKCJVbmV4cGVjdGVkIGV2ZW50IHR5cGUgJXMiLCBPcENvZGVUZXh0KHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVmlldz4KLSAgc3RhdGljIHZvaWQgY2hlY2tfc3RhdHVzKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXNfdmlldyA9IFZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICBBU1NFUlQoc3RhdHVzX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBpZiAoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICAiR290IGEgQ29tbWFuZCBjb21wbGV0ZSAlcywgc3RhdHVzICVzIiwKLSAgICAgICAgICBPcENvZGVUZXh0KHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpLAotICAgICAgICAgIEVycm9yQ29kZVRleHQoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfTsKLQotTGVBZHZlcnRpc2luZ01hbmFnZXI6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyKCkgewotICBwaW1wbF8gPSBzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KHRoaXMpOwotfQotCi12b2lkIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgbGlzdC0+YWRkPGhjaTo6SGNpTGF5ZXI+KCk7Ci0gIGxpc3QtPmFkZDxoY2k6OkNvbnRyb2xsZXI+KCk7Ci0gIGxpc3QtPmFkZDxoY2k6OkFjbE1hbmFnZXI+KCk7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2luZ01hbmFnZXI6OlN0YXJ0KCkgewotICBwaW1wbF8tPnN0YXJ0KEdldEhhbmRsZXIoKSwgR2V0RGVwZW5kZW5jeTxoY2k6OkhjaUxheWVyPigpLCBHZXREZXBlbmRlbmN5PGhjaTo6Q29udHJvbGxlcj4oKSwKLSAgICAgICAgICAgICAgICBHZXREZXBlbmRlbmN5PEFjbE1hbmFnZXI+KCkpOwotfQotCi12b2lkIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpTdG9wKCkgewotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotc3RkOjpzdHJpbmcgTGVBZHZlcnRpc2luZ01hbmFnZXI6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIkxlIEFkdmVydGlzaW5nIE1hbmFnZXIiOwotfQotCi1zaXplX3QgTGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXMoKSBjb25zdCB7Ci0gIHJldHVybiBwaW1wbF8tPkdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXMoKTsKLX0KLQotQWR2ZXJ0aXNlcklkIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpjcmVhdGVfYWR2ZXJ0aXNlcigKLSAgICBjb25zdCBBZHZlcnRpc2luZ0NvbmZpZyBjb25maWcsCi0gICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEFkZHJlc3MsIEFkZHJlc3NUeXBlKT4mIHNjYW5fY2FsbGJhY2ssCi0gICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEVycm9yQ29kZSwgdWludDhfdCwgdWludDhfdCk+JiBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywKLSAgICBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBpZiAoY29uZmlnLnBlZXJfYWRkcmVzcyA9PSBBZGRyZXNzOjprRW1wdHkpIHsKLSAgICBpZiAoY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPT0gaGNpOjpPd25BZGRyZXNzVHlwZTo6UkVTT0xWQUJMRV9PUl9QVUJMSUNfQUREUkVTUyB8fAotICAgICAgICBjb25maWcub3duX2FkZHJlc3NfdHlwZSA9PSBoY2k6Ok93bkFkZHJlc3NUeXBlOjpSRVNPTFZBQkxFX09SX1JBTkRPTV9BRERSRVNTKSB7Ci0gICAgICBMT0dfV0FSTigiUGVlciBhZGRyZXNzIGNhbiBub3QgYmUgZW1wdHkiKTsKLSAgICAgIHJldHVybiBrSW52YWxpZElkOwotICAgIH0KLSAgICBpZiAoY29uZmlnLmFkdmVydGlzaW5nX3R5cGUgPT0gaGNpOjpBZHZlcnRpc2luZ1R5cGU6OkFEVl9ESVJFQ1RfSU5EIHx8Ci0gICAgICAgIGNvbmZpZy5hZHZlcnRpc2luZ190eXBlID09IGhjaTo6QWR2ZXJ0aXNpbmdUeXBlOjpBRFZfRElSRUNUX0lORF9MT1cpIHsKLSAgICAgIExPR19XQVJOKCJQZWVyIGFkZHJlc3MgY2FuIG5vdCBiZSBlbXB0eSBmb3IgZGlyZWN0ZWQgYWR2ZXJ0aXNpbmciKTsKLSAgICAgIHJldHVybiBrSW52YWxpZElkOwotICAgIH0KLSAgfQotICBBZHZlcnRpc2VySWQgaWQgPSBwaW1wbF8tPmFsbG9jYXRlX2FkdmVydGlzZXIoKTsKLSAgaWYgKGlkID09IGtJbnZhbGlkSWQpIHsKLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgR2V0SGFuZGxlcigpLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmltcGw6OmNyZWF0ZV9hZHZlcnRpc2VyLCBjb21tb246OlVucmV0YWluZWQocGltcGxfLmdldCgpKSwgaWQsIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9jYWxsYmFjaywgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2ssIGhhbmRsZXIpKTsKLSAgcmV0dXJuIGlkOwotfQotCi1BZHZlcnRpc2VySWQgTGVBZHZlcnRpc2luZ01hbmFnZXI6OkV4dGVuZGVkQ3JlYXRlQWR2ZXJ0aXNlcigKLSAgICBpbnQgcmVnX2lkLAotICAgIGNvbnN0IEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlnLAotICAgIGNvbnN0IGNvbW1vbjo6Q2FsbGJhY2s8dm9pZChBZGRyZXNzLCBBZGRyZXNzVHlwZSk+JiBzY2FuX2NhbGxiYWNrLAotICAgIGNvbnN0IGNvbW1vbjo6Q2FsbGJhY2s8dm9pZChFcnJvckNvZGUsIHVpbnQ4X3QsIHVpbnQ4X3QpPiYgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2ssCi0gICAgdWludDE2X3QgZHVyYXRpb24sCi0gICAgdWludDhfdCBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzLAotICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIEFkdmVydGlzaW5nQXBpVHlwZSBhZHZlcnRpc2luZ19hcGlfdHlwZSA9IHBpbXBsXy0+Z2V0X2FkdmVydGlzaW5nX2FwaV90eXBlKCk7Ci0gIGlmIChhZHZlcnRpc2luZ19hcGlfdHlwZSAhPSBBZHZlcnRpc2luZ0FwaVR5cGU6OkVYVEVOREVEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZV9hZHZlcnRpc2VyKGNvbmZpZywgc2Nhbl9jYWxsYmFjaywgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2ssIGhhbmRsZXIpOwotICB9OwotCi0gIGlmIChjb25maWcuZGlyZWN0ZWQpIHsKLSAgICBpZiAoY29uZmlnLnBlZXJfYWRkcmVzcyA9PSBBZGRyZXNzOjprRW1wdHkpIHsKLSAgICAgIExPR19JTkZPKCJQZWVyIGFkZHJlc3MgY2FuIG5vdCBiZSBlbXB0eSBmb3IgZGlyZWN0ZWQgYWR2ZXJ0aXNpbmciKTsKLSAgICAgIHJldHVybiBrSW52YWxpZElkOwotICAgIH0KLSAgfQotICBpZiAoY29uZmlnLmNoYW5uZWxfbWFwID09IDApIHsKLSAgICBMT0dfSU5GTygiQXQgbGVhc3Qgb25lIGNoYW5uZWwgbXVzdCBiZSBzZXQgaW4gdGhlIG1hcCIpOwotICAgIHJldHVybiBrSW52YWxpZElkOwotICB9Ci0gIGlmICghY29uZmlnLmxlZ2FjeV9wZHVzKSB7Ci0gICAgaWYgKGNvbmZpZy5jb25uZWN0YWJsZSAmJiBjb25maWcuc2Nhbm5hYmxlKSB7Ci0gICAgICBMT0dfSU5GTygiRXh0ZW5kZWQgYWR2ZXJ0aXNpbmcgUERVcyBjYW4gbm90IGJlIGNvbm5lY3RhYmxlIGFuZCBzY2FubmFibGUiKTsKLSAgICAgIHJldHVybiBrSW52YWxpZElkOwotICAgIH0KLSAgICBpZiAoY29uZmlnLmhpZ2hfZHV0eV9kaXJlY3RlZF9jb25uZWN0YWJsZSkgewotICAgICAgTE9HX0lORk8oIkV4dGVuZGVkIGFkdmVydGlzaW5nIFBEVXMgY2FuIG5vdCBiZSBoaWdoIGR1dHkgY3ljbGUiKTsKLSAgICAgIHJldHVybiBrSW52YWxpZElkOwotICAgIH0KLSAgfQotICBpZiAoY29uZmlnLmludGVydmFsX21pbiA+IGNvbmZpZy5pbnRlcnZhbF9tYXgpIHsKLSAgICBMT0dfSU5GTygiQWR2ZXJ0aXNpbmcgaW50ZXJ2YWw6IG1pbiAoJWh1KSA+IG1heCAoJWh1KSIsIGNvbmZpZy5pbnRlcnZhbF9taW4sIGNvbmZpZy5pbnRlcnZhbF9tYXgpOwotICAgIHJldHVybiBrSW52YWxpZElkOwotICB9Ci0gIEFkdmVydGlzZXJJZCBpZCA9IHBpbXBsXy0+YWxsb2NhdGVfYWR2ZXJ0aXNlcigpOwotICBpZiAoaWQgPT0ga0ludmFsaWRJZCkgewotICAgIHJldHVybiBpZDsKLSAgfQotICBDYWxsT24oCi0gICAgICBwaW1wbF8uZ2V0KCksCi0gICAgICAmaW1wbDo6Y3JlYXRlX2V4dGVuZGVkX2FkdmVydGlzZXIsCi0gICAgICByZWdfaWQsCi0gICAgICBpZCwKLSAgICAgIGNvbmZpZywKLSAgICAgIHNjYW5fY2FsbGJhY2ssCi0gICAgICBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywKLSAgICAgIGR1cmF0aW9uLAotICAgICAgbWF4X2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50cywKLSAgICAgIGhhbmRsZXIpOwotICByZXR1cm4gaWQ7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldE93bkFkZHJlc3ModWludDhfdCBhZHZlcnRpc2VyX2lkKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpnZXRfb3duX2FkZHJlc3MsIGFkdmVydGlzZXJfaWQpOwotfQotCi12b2lkIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpTZXRQYXJhbWV0ZXJzKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZykgewotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6c2V0X3BhcmFtZXRlcnMsIGFkdmVydGlzZXJfaWQsIGNvbmZpZyk7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2luZ01hbmFnZXI6OlNldERhdGEoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQsIGJvb2wgc2V0X3NjYW5fcnNwLCBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBkYXRhKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpzZXRfZGF0YSwgYWR2ZXJ0aXNlcl9pZCwgc2V0X3NjYW5fcnNwLCBkYXRhKTsKLX0KLQotdm9pZCBMZUFkdmVydGlzaW5nTWFuYWdlcjo6RW5hYmxlQWR2ZXJ0aXNlcigKLSAgICBBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsIHVpbnQxNl90IGR1cmF0aW9uLCB1aW50OF90IG1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMpIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6OmVuYWJsZV9hZHZlcnRpc2VyLCBhZHZlcnRpc2VyX2lkLCBlbmFibGUsIGR1cmF0aW9uLCBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzKTsKLX0KLQotdm9pZCBMZUFkdmVydGlzaW5nTWFuYWdlcjo6U2V0UGVyaW9kaWNQYXJhbWV0ZXJzKAotICAgIEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyBwZXJpb2RpY19hZHZlcnRpc2luZ19wYXJhbWV0ZXJzKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpzZXRfcGVyaW9kaWNfcGFyYW1ldGVyLCBhZHZlcnRpc2VyX2lkLCBwZXJpb2RpY19hZHZlcnRpc2luZ19wYXJhbWV0ZXJzKTsKLX0KLQotdm9pZCBMZUFkdmVydGlzaW5nTWFuYWdlcjo6U2V0UGVyaW9kaWNEYXRhKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBkYXRhKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpzZXRfcGVyaW9kaWNfZGF0YSwgYWR2ZXJ0aXNlcl9pZCwgZGF0YSk7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2luZ01hbmFnZXI6OkVuYWJsZVBlcmlvZGljQWR2ZXJ0aXNpbmcoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjplbmFibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmcsIGFkdmVydGlzZXJfaWQsIGVuYWJsZSk7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2luZ01hbmFnZXI6OlJlbW92ZUFkdmVydGlzZXIoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQpIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6OnJlbW92ZV9hZHZlcnRpc2VyLCBhZHZlcnRpc2VyX2lkKTsKLX0KLQotdm9pZCBMZUFkdmVydGlzaW5nTWFuYWdlcjo6UmVnaXN0ZXJBZHZlcnRpc2luZ0NhbGxiYWNrKEFkdmVydGlzaW5nQ2FsbGJhY2sqIGFkdmVydGlzaW5nX2NhbGxiYWNrKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpyZWdpc3Rlcl9hZHZlcnRpc2luZ19jYWxsYmFjaywgYWR2ZXJ0aXNpbmdfY2FsbGJhY2spOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIGIvZ2QvaGNpL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNDBmYi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jbGFzcyBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyB7Ci0gcHVibGljOgotICB1aW50MTZfdCBtaW5faW50ZXJ2YWw7Ci0gIHVpbnQxNl90IG1heF9pbnRlcnZhbDsKLSAgdWludDE2X3QgcHJvcGVydGllczsKLSAgZW51bSBBZHZlcnRpc2luZ1Byb3BlcnR5IHsgSU5DTFVERV9UWF9QT1dFUiA9IDB4MDYgfTsKLX07Ci0KLWNsYXNzIEFkdmVydGlzaW5nQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGFkdmVydGlzZW1lbnQ7Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IHNjYW5fcmVzcG9uc2U7Ci0gIHVpbnQxNl90IGludGVydmFsX21pbjsKLSAgdWludDE2X3QgaW50ZXJ2YWxfbWF4OwotICBBZHZlcnRpc2luZ1R5cGUgYWR2ZXJ0aXNpbmdfdHlwZTsKLSAgT3duQWRkcmVzc1R5cGUgb3duX2FkZHJlc3NfdHlwZTsKLSAgUGVlckFkZHJlc3NUeXBlIHBlZXJfYWRkcmVzc190eXBlOwotICBBZGRyZXNzIHBlZXJfYWRkcmVzczsKLSAgdWludDhfdCBjaGFubmVsX21hcDsKLSAgQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kgZmlsdGVyX3BvbGljeTsKLSAgdWludDhfdCB0eF9wb3dlcjsgIC8vIC0xMjcgdG8gKzIwICgweDdmIGlzIG5vIHByZWZlcmVuY2UpCi19OwotCi1jbGFzcyBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIDogcHVibGljIEFkdmVydGlzaW5nQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIGJvb2wgY29ubmVjdGFibGUgPSBmYWxzZTsKLSAgYm9vbCBzY2FubmFibGUgPSBmYWxzZTsKLSAgYm9vbCBkaXJlY3RlZCA9IGZhbHNlOwotICBib29sIGhpZ2hfZHV0eV9kaXJlY3RlZF9jb25uZWN0YWJsZSA9IGZhbHNlOwotICBib29sIGxlZ2FjeV9wZHVzID0gZmFsc2U7Ci0gIGJvb2wgYW5vbnltb3VzID0gZmFsc2U7Ci0gIGJvb2wgaW5jbHVkZV90eF9wb3dlciA9IGZhbHNlOwotICBib29sIHVzZV9sZV9jb2RlZF9waHk7ICAgICAgIC8vIFByaW1hcnkgYWR2ZXJ0aXNlbWVudCBQSFkgaXMgTEUgQ29kZWQKLSAgdWludDhfdCBzZWNvbmRhcnlfbWF4X3NraXA7ICAvLyBtYXhpbXVtIGFkdmVydGlzaW5nIGV2ZW50cyB0byBiZSBza2lwcGVkLCAweDAgc2VuZCBBVVhfQURWX0lORCBwcmlvciBvdCB0aGUgbmV4dCBldmVudAotICBTZWNvbmRhcnlQaHlUeXBlIHNlY29uZGFyeV9hZHZlcnRpc2luZ19waHk7Ci0gIHVpbnQ4X3Qgc2lkID0gMHgwMDsKLSAgRW5hYmxlIGVuYWJsZV9zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9ucyA9IEVuYWJsZTo6RElTQUJMRUQ7Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IHBlcmlvZGljX2RhdGE7Ci0gIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHBlcmlvZGljX2FkdmVydGlzaW5nX3BhcmFtZXRlcnM7Ci0gIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcoKSA9IGRlZmF1bHQ7Ci0gIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcoY29uc3QgQWR2ZXJ0aXNpbmdDb25maWcmIGNvbmZpZyk7Ci19OwotCi11c2luZyBBZHZlcnRpc2VySWQgPSB1aW50OF90OwotCi1jbGFzcyBBZHZlcnRpc2luZ0NhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIGVudW0gQWR2ZXJ0aXNpbmdTdGF0dXMgewotICAgIFNVQ0NFU1MsCi0gICAgREFUQV9UT09fTEFSR0UsCi0gICAgVE9PX01BTllfQURWRVJUSVNFUlMsCi0gICAgQUxSRUFEWV9TVEFSVEVELAotICAgIElOVEVSTkFMX0VSUk9SLAotICAgIEZFQVRVUkVfVU5TVVBQT1JURUQKLSAgfTsKLQotICB2aXJ0dWFsIH5BZHZlcnRpc2luZ0NhbGxiYWNrKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIHZvaWQgT25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoCi0gICAgICBpbnQgcmVnX2lkLCB1aW50OF90IGFkdmVydGlzZXJfaWQsIGludDhfdCB0eF9wb3dlciwgQWR2ZXJ0aXNpbmdTdGF0dXMgc3RhdHVzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkFkdmVydGlzaW5nRW5hYmxlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25BZHZlcnRpc2luZ0RhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TY2FuUmVzcG9uc2VEYXRhU2V0KHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIGludDhfdCB0eF9wb3dlciwgdWludDhfdCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25QZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25Pd25BZGRyZXNzUmVhZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIHVpbnQ4X3QgYWRkcmVzc190eXBlLCBBZGRyZXNzIGFkZHJlc3MpID0gMDsKLX07Ci0KLWNsYXNzIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyIDogcHVibGljIGJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgQWR2ZXJ0aXNlcklkIGtJbnZhbGlkSWQgPSAweEZGOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0ludmFsaWRIYW5kbGUgPSAweEZGOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0FkdmVydGlzaW5nU2V0SWRNYXNrID0gMHgwRjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrTGVNYXhpbXVtRnJhZ21lbnRMZW5ndGggPSAyNTE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgRnJhZ21lbnRQcmVmZXJlbmNlIGtGcmFnbWVudF9wcmVmZXJlbmNlID0gRnJhZ21lbnRQcmVmZXJlbmNlOjpDT05UUk9MTEVSX1NIT1VMRF9OT1Q7Ci0gIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyKCk7Ci0KLSAgc2l6ZV90IEdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXMoKSBjb25zdDsKLQotICBBZHZlcnRpc2VySWQgRXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyKAotICAgICAgaW50IHJlZ19pZCwKLSAgICAgIGNvbnN0IEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlnLAotICAgICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEFkZHJlc3MsIEFkZHJlc3NUeXBlKT4mIHNjYW5fY2FsbGJhY2ssCi0gICAgICBjb25zdCBjb21tb246OkNhbGxiYWNrPHZvaWQoRXJyb3JDb2RlLCB1aW50OF90LCB1aW50OF90KT4mIHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrLAotICAgICAgdWludDE2X3QgZHVyYXRpb24sCi0gICAgICB1aW50OF90IG1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMsCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgdm9pZCBHZXRPd25BZGRyZXNzKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCk7Ci0KLSAgdm9pZCBTZXRQYXJhbWV0ZXJzKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGNvbmZpZyk7Ci0KLSAgdm9pZCBTZXREYXRhKEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkLCBib29sIHNldF9zY2FuX3JzcCwgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gZGF0YSk7Ci0KLSAgdm9pZCBFbmFibGVBZHZlcnRpc2VyKAotICAgICAgQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLCB1aW50MTZfdCBkdXJhdGlvbiwgdWludDhfdCBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzKTsKLQotICB2b2lkIFNldFBlcmlvZGljUGFyYW1ldGVycyhBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZCwgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfcGFyYW1ldGVycyk7Ci0KLSAgdm9pZCBTZXRQZXJpb2RpY0RhdGEoQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWQsIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGRhdGEpOwotCi0gIHZvaWQgRW5hYmxlUGVyaW9kaWNBZHZlcnRpc2luZyhBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUpOwotCi0gIHZvaWQgUmVtb3ZlQWR2ZXJ0aXNlcihBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZCk7Ci0KLSAgdm9pZCBSZWdpc3RlckFkdmVydGlzaW5nQ2FsbGJhY2soQWR2ZXJ0aXNpbmdDYWxsYmFjayogYWR2ZXJ0aXNpbmdfY2FsbGJhY2spOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIFJldHVybiAtMSBpZiB0aGUgYWR2ZXJ0aXNlciB3YXMgbm90IGNyZWF0ZWQsIG90aGVyd2lzZSB0aGUgYWR2ZXJ0aXNlciBJRC4KLSAgQWR2ZXJ0aXNlcklkIGNyZWF0ZV9hZHZlcnRpc2VyKAotICAgICAgY29uc3QgQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlnLAotICAgICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEFkZHJlc3MsIEFkZHJlc3NUeXBlKT4mIHNjYW5fY2FsbGJhY2ssCi0gICAgICBjb25zdCBjb21tb246OkNhbGxiYWNrPHZvaWQoRXJyb3JDb2RlLCB1aW50OF90LCB1aW50OF90KT4mIHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrLAotICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX21vY2suaCBiL2dkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlOTc2My4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotLy8gVW5pdCB0ZXN0IGludGVyZmFjZXMKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXN0cnVjdCBMZUFkdmVydGlzaW5nTWFuYWdlcjo6aW1wbCA6IHB1YmxpYyBibHVldG9vdGg6OmhjaTo6TGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrIHt9OwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGhjaTo6QWR2ZXJ0aXNlcklkOwotdXNpbmcgaGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlcjsKLQotY2xhc3MgTW9ja0xlQWR2ZXJ0aXNpbmdNYW5hZ2VyIDogcHVibGljIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHNpemVfdCwgR2V0TnVtYmVyT2ZBZHZlcnRpc2luZ0luc3RhbmNlcywgKCksIChjb25zdCkpOwotICBNT0NLX01FVEhPRCgKLSAgICAgIEFkdmVydGlzZXJJZCwKLSAgICAgIEV4dGVuZGVkQ3JlYXRlQWR2ZXJ0aXNlciwKLSAgICAgIChpbnQgcmVnSWQsCi0gICAgICAgY29uc3QgRXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZywKLSAgICAgICBjb25zdCBjb21tb246OkNhbGxiYWNrPHZvaWQoQWRkcmVzcywgQWRkcmVzc1R5cGUpPiYsCi0gICAgICAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEVycm9yQ29kZSwgdWludDhfdCwgdWludDhfdCk+JiwKLSAgICAgICB1aW50MTZfdCwKLSAgICAgICB1aW50OF90LAotICAgICAgIG9zOjpIYW5kbGVyKikpOwotICBNT0NLX01FVEhPRCh2b2lkLCBSZW1vdmVBZHZlcnRpc2VyLCAoQWR2ZXJ0aXNlcklkKSk7Ci0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0LmNjIGIvZ2QvaGNpL2xlX2FkdmVydGlzaW5nX21hbmFnZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiODkyMS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJoY2kvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHBhY2tldDo6a0xpdHRsZUVuZGlhbjsKLXVzaW5nIHBhY2tldDo6UGFja2V0VmlldzsKLXVzaW5nIHBhY2tldDo6UmF3QnVpbGRlcjsKLQotUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBHZXRQYWNrZXRWaWV3KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGkoKmJ5dGVzKTsKLSAgYnl0ZXMtPnJlc2VydmUocGFja2V0LT5zaXplKCkpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpKTsKLSAgcmV0dXJuIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KGJ5dGVzKTsKLX0KLQotY2xhc3MgVGVzdENvbnRyb2xsZXIgOiBwdWJsaWMgQ29udHJvbGxlciB7Ci0gcHVibGljOgotICBib29sIElzU3VwcG9ydGVkKE9wQ29kZSBvcF9jb2RlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN1cHBvcnRlZF9vcGNvZGVzXy5jb3VudChvcF9jb2RlKSA9PSAxOwotICB9Ci0KLSAgdm9pZCBBZGRTdXBwb3J0ZWQoT3BDb2RlIG9wX2NvZGUpIHsKLSAgICBzdXBwb3J0ZWRfb3Bjb2Rlc18uaW5zZXJ0KG9wX2NvZGUpOwotICB9Ci0KLSAgdWludDhfdCBHZXRMZU51bWJlck9mU3VwcG9ydGVkQWR2ZXJpc2luZ1NldHMoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIG51bV9hZHZlcnRpc2VyczsKLSAgfQotCi0gIHVpbnQxNl90IEdldExlTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gMHgwNjcyOwotICB9Ci0KLSAgdWludDhfdCBudW1fYWR2ZXJ0aXNlcnN7MH07Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7fQotICB2b2lkIFN0b3AoKSBvdmVycmlkZSB7fQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgb3ZlcnJpZGUge30KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2V0PE9wQ29kZT4gc3VwcG9ydGVkX29wY29kZXNfe307Ci19OwotCi1jbGFzcyBUZXN0SGNpTGF5ZXIgOiBwdWJsaWMgSGNpTGF5ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRTdGF0dXNWaWV3KT4gb25fc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgYXV0byBwYWNrZXRfdmlldyA9IENvbW1hbmRWaWV3OjpDcmVhdGUoR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoY29tbWFuZCkpKTsKLSAgICBBU1NFUlRfVFJVRShwYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgY29tbWFuZF9xdWV1ZV8ucHVzaF9iYWNrKHBhY2tldF92aWV3KTsKLSAgICBjb21tYW5kX3N0YXR1c19jYWxsYmFja3MucHVzaF9iYWNrKHN0ZDo6bW92ZShvbl9zdGF0dXMpKTsKLSAgICBpZiAoY29tbWFuZF9wcm9taXNlXyAhPSBudWxscHRyICYmCi0gICAgICAgIChjb21tYW5kX29wX2NvZGVfID09IE9wQ29kZTo6Tk9ORSB8fCBjb21tYW5kX29wX2NvZGVfID09IHBhY2tldF92aWV3LkdldE9wQ29kZSgpKSkgewotICAgICAgaWYgKGNvbW1hbmRfb3BfY29kZV8gPT0gT3BDb2RlOjpMRV9NVUxUSV9BRFZUICYmIGNvbW1hbmRfc3ViX29jZl8gIT0gU3ViT2NmOjpTRVRfRU5BQkxFKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGNvbW1hbmRfcHJvbWlzZV8tPnNldF92YWx1ZShjb21tYW5kX3F1ZXVlXy5zaXplKCkpOwotICAgICAgY29tbWFuZF9wcm9taXNlXy5yZXNldCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4gb25fY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHBhY2tldF92aWV3ID0gQ29tbWFuZFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShjb21tYW5kKSkpOwotICAgIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBjb21tYW5kX3F1ZXVlXy5wdXNoX2JhY2socGFja2V0X3ZpZXcpOwotICAgIGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2tzLnB1c2hfYmFjayhzdGQ6Om1vdmUob25fY29tcGxldGUpKTsKLSAgICBpZiAoY29tbWFuZF9wcm9taXNlXyAhPSBudWxscHRyICYmCi0gICAgICAgIChjb21tYW5kX29wX2NvZGVfID09IE9wQ29kZTo6Tk9ORSB8fCBjb21tYW5kX29wX2NvZGVfID09IHBhY2tldF92aWV3LkdldE9wQ29kZSgpKSkgewotICAgICAgaWYgKGNvbW1hbmRfb3BfY29kZV8gPT0gT3BDb2RlOjpMRV9NVUxUSV9BRFZUKSB7Ci0gICAgICAgIGF1dG8gc3ViX3ZpZXcgPSBMZU11bHRpQWR2dFZpZXc6OkNyZWF0ZShMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfdmlldykpOwotICAgICAgICBBU1NFUlRfVFJVRShzdWJfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBpZiAoc3ViX3ZpZXcuR2V0U3ViQ21kKCkgIT0gY29tbWFuZF9zdWJfb2NmXykgewotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29tbWFuZF9wcm9taXNlXy0+c2V0X3ZhbHVlKGNvbW1hbmRfcXVldWVfLnNpemUoKSk7Ci0gICAgICBjb21tYW5kX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTZXRDb21tYW5kRnV0dXJlKE9wQ29kZSBvcF9jb2RlID0gT3BDb2RlOjpOT05FKSB7Ci0gICAgQVNTRVJUX0xPRyhjb21tYW5kX3Byb21pc2VfID09IG51bGxwdHIsICJQcm9taXNlcywgUHJvbWlzZXMsIC4uLiBPbmx5IG9uZSBhdCBhIHRpbWUuIik7Ci0gICAgY29tbWFuZF9vcF9jb2RlXyA9IG9wX2NvZGU7Ci0gICAgY29tbWFuZF9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHNpemVfdD4+KCk7Ci0gICAgY29tbWFuZF9mdXR1cmVfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OmZ1dHVyZTxzaXplX3Q+Pihjb21tYW5kX3Byb21pc2VfLT5nZXRfZnV0dXJlKCkpOwotICB9Ci0KLSAgdm9pZCBSZXNldENvbW1hbmRGdXR1cmUoKSB7Ci0gICAgaWYgKGNvbW1hbmRfZnV0dXJlXyAhPSBudWxscHRyKSB7Ci0gICAgICBjb21tYW5kX2Z1dHVyZV8ucmVzZXQoKTsKLSAgICAgIGNvbW1hbmRfcHJvbWlzZV8ucmVzZXQoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNldFN1YkNvbW1hbmRGdXR1cmUoU3ViT2NmIHN1Yl9vY2YpIHsKLSAgICBBU1NFUlRfTE9HKGNvbW1hbmRfcHJvbWlzZV8gPT0gbnVsbHB0ciwgIlByb21pc2VzIHByb21pc2VzIC4uLiBPbmx5IG9uZSBhdCBhIHRpbWUiKTsKLSAgICBjb21tYW5kX29wX2NvZGVfID0gT3BDb2RlOjpMRV9NVUxUSV9BRFZUOwotICAgIGNvbW1hbmRfc3ViX29jZl8gPSBzdWJfb2NmOwotICAgIGNvbW1hbmRfcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTxzaXplX3Q+PigpOwotICAgIGNvbW1hbmRfZnV0dXJlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpmdXR1cmU8c2l6ZV90Pj4oY29tbWFuZF9wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpKTsKLSAgfQotCi0gIENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXcgR2V0Q29tbWFuZChPcENvZGUgb3BfY29kZSkgewotICAgIGlmICghY29tbWFuZF9xdWV1ZV8uZW1wdHkoKSkgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICAgIGlmIChjb21tYW5kX2Z1dHVyZV8gIT0gbnVsbHB0cikgewotICAgICAgICBjb21tYW5kX2Z1dHVyZV8ucmVzZXQoKTsKLSAgICAgICAgY29tbWFuZF9wcm9taXNlXy5yZXNldCgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29tbWFuZF9mdXR1cmVfICE9IG51bGxwdHIpIHsKLSAgICAgIGF1dG8gcmVzdWx0ID0gY29tbWFuZF9mdXR1cmVfLT53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKTsKLSAgICAgIEVYUEVDVF9ORShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnRpbWVvdXQsIHJlc3VsdCk7Ci0gICAgfQotICAgIEFTU0VSVF9MT0coCi0gICAgICAgICFjb21tYW5kX3F1ZXVlXy5lbXB0eSgpLCAiRXhwZWN0aW5nIGNvbW1hbmQgJXMgYnV0IGNvbW1hbmQgcXVldWUgd2FzIGVtcHR5IiwgT3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpKTsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIENvbW1hbmRWaWV3IGNvbW1hbmRfcGFja2V0X3ZpZXcgPSBDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcXVldWVfLmZyb250KCkpOwotICAgIGNvbW1hbmRfcXVldWVfLnBvcF9mcm9udCgpOwotICAgIGF1dG8gY29tbWFuZCA9IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0X3ZpZXcpKTsKLSAgICBFWFBFQ1RfVFJVRShjb21tYW5kLklzVmFsaWQoKSk7Ci0gICAgRVhQRUNUX0VRKGNvbW1hbmQuR2V0T3BDb2RlKCksIG9wX2NvZGUpOwotCi0gICAgcmV0dXJuIGNvbW1hbmQ7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZSBldmVudF9jb2RlLCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+IGV2ZW50X2hhbmRsZXIpIG92ZXJyaWRlIHsKLSAgICByZWdpc3RlcmVkX2V2ZW50c19bZXZlbnRfY29kZV0gPSBldmVudF9oYW5kbGVyOwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckxlRXZlbnRIYW5kbGVyKFN1YmV2ZW50Q29kZSBzdWJldmVudF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChMZU1ldGFFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSBvdmVycmlkZSB7Ci0gICAgcmVnaXN0ZXJlZF9sZV9ldmVudHNfW3N1YmV2ZW50X2NvZGVdID0gZXZlbnRfaGFuZGxlcjsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdFdmVudChzdGQ6OnVuaXF1ZV9wdHI8RXZlbnRCdWlsZGVyPiBldmVudF9idWlsZGVyKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShldmVudF9idWlsZGVyKSk7Ci0gICAgRXZlbnRWaWV3IGV2ZW50ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfVFJVRShldmVudC5Jc1ZhbGlkKCkpOwotICAgIEV2ZW50Q29kZSBldmVudF9jb2RlID0gZXZlbnQuR2V0RXZlbnRDb2RlKCk7Ci0gICAgQVNTRVJUX05FKHJlZ2lzdGVyZWRfZXZlbnRzXy5maW5kKGV2ZW50X2NvZGUpLCByZWdpc3RlcmVkX2V2ZW50c18uZW5kKCkpIDw8IEV2ZW50Q29kZVRleHQoZXZlbnRfY29kZSk7Ci0gICAgcmVnaXN0ZXJlZF9ldmVudHNfW2V2ZW50X2NvZGVdLkludm9rZShldmVudCk7Ci0gIH0KLQotICB2b2lkIEluY29taW5nTGVNZXRhRXZlbnQoc3RkOjp1bmlxdWVfcHRyPExlTWV0YUV2ZW50QnVpbGRlcj4gZXZlbnRfYnVpbGRlcikgewotICAgIGF1dG8gcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoZXZlbnRfYnVpbGRlcikpOwotICAgIEV2ZW50VmlldyBldmVudCA9IEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgTGVNZXRhRXZlbnRWaWV3IG1ldGFfZXZlbnRfdmlldyA9IExlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlRfVFJVRShtZXRhX2V2ZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSA9IG1ldGFfZXZlbnRfdmlldy5HZXRTdWJldmVudENvZGUoKTsKLSAgICBBU1NFUlRfTkUocmVnaXN0ZXJlZF9sZV9ldmVudHNfLmZpbmQoc3ViZXZlbnRfY29kZSksIHJlZ2lzdGVyZWRfbGVfZXZlbnRzXy5lbmQoKSkKLSAgICAgICAgPDwgU3ViZXZlbnRDb2RlVGV4dChzdWJldmVudF9jb2RlKTsKLSAgICByZWdpc3RlcmVkX2xlX2V2ZW50c19bc3ViZXZlbnRfY29kZV0uSW52b2tlKG1ldGFfZXZlbnRfdmlldyk7Ci0gIH0KLQotICB2b2lkIENvbW1hbmRDb21wbGV0ZUNhbGxiYWNrKEV2ZW50VmlldyBldmVudCkgewotICAgIENvbW1hbmRDb21wbGV0ZVZpZXcgY29tcGxldGVfdmlldyA9IENvbW1hbmRDb21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUX1RSVUUoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5mcm9udCgpKS5JbnZva2UoY29tcGxldGVfdmlldyk7Ci0gICAgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFja3MucG9wX2Zyb250KCk7Ci0gIH0KLQotICB2b2lkIENvbW1hbmRTdGF0dXNDYWxsYmFjayhFdmVudFZpZXcgZXZlbnQpIHsKLSAgICBDb21tYW5kU3RhdHVzVmlldyBzdGF0dXNfdmlldyA9IENvbW1hbmRTdGF0dXNWaWV3OjpDcmVhdGUoZXZlbnQpOwotICAgIEFTU0VSVF9UUlVFKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgc3RkOjptb3ZlKGNvbW1hbmRfc3RhdHVzX2NhbGxiYWNrcy5mcm9udCgpKS5JbnZva2Uoc3RhdHVzX3ZpZXcpOwotICAgIGNvbW1hbmRfc3RhdHVzX2NhbGxiYWNrcy5wb3BfZnJvbnQoKTsKLSAgfQotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBvdmVycmlkZSB7fQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUgewotICAgIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZTo6Q09NTUFORF9DT01QTEVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRIYW5kbGVyKCktPkJpbmRPbih0aGlzLCAmVGVzdEhjaUxheWVyOjpDb21tYW5kQ29tcGxldGVDYWxsYmFjaykpOwotICAgIFJlZ2lzdGVyRXZlbnRIYW5kbGVyKEV2ZW50Q29kZTo6Q09NTUFORF9TVEFUVVMsIEdldEhhbmRsZXIoKS0+QmluZE9uKHRoaXMsICZUZXN0SGNpTGF5ZXI6OkNvbW1hbmRTdGF0dXNDYWxsYmFjaykpOwotICB9Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHt9Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDxFdmVudENvZGUsIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoRXZlbnRWaWV3KT4+IHJlZ2lzdGVyZWRfZXZlbnRzXzsKLSAgc3RkOjptYXA8U3ViZXZlbnRDb2RlLCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKExlTWV0YUV2ZW50Vmlldyk+PiByZWdpc3RlcmVkX2xlX2V2ZW50c187Ci0gIHN0ZDo6bGlzdDxjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kQ29tcGxldGVWaWV3KT4+IGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2tzOwotICBzdGQ6Omxpc3Q8Y29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZFN0YXR1c1ZpZXcpPj4gY29tbWFuZF9zdGF0dXNfY2FsbGJhY2tzOwotCi0gIHN0ZDo6bGlzdDxDb21tYW5kVmlldz4gY29tbWFuZF9xdWV1ZV87Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8c2l6ZV90Pj4gY29tbWFuZF9wcm9taXNlX3t9OwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpmdXR1cmU8c2l6ZV90Pj4gY29tbWFuZF9mdXR1cmVfe307Ci0gIE9wQ29kZSBjb21tYW5kX29wX2NvZGVfOwotICBTdWJPY2YgY29tbWFuZF9zdWJfb2NmXzsKLX07Ci0KLWNsYXNzIFRlc3RMZUFkZHJlc3NNYW5hZ2VyIDogcHVibGljIExlQWRkcmVzc01hbmFnZXIgewotIHB1YmxpYzoKLSAgVGVzdExlQWRkcmVzc01hbmFnZXIoCi0gICAgICBjb21tb246OkNhbGxiYWNrPHZvaWQoc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPik+IGVucXVldWVfY29tbWFuZCwKLSAgICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgQWRkcmVzcyBwdWJsaWNfYWRkcmVzcywKLSAgICAgIHVpbnQ4X3QgY29ubmVjdF9saXN0X3NpemUsCi0gICAgICB1aW50OF90IHJlc29sdmluZ19saXN0X3NpemUpCi0gICAgICA6IExlQWRkcmVzc01hbmFnZXIoZW5xdWV1ZV9jb21tYW5kLCBoYW5kbGVyLCBwdWJsaWNfYWRkcmVzcywgY29ubmVjdF9saXN0X3NpemUsIHJlc29sdmluZ19saXN0X3NpemUpIHt9Ci0KLSAgQWRkcmVzc1BvbGljeSBSZWdpc3RlcihMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqIGNhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIEFkZHJlc3NQb2xpY3k6OlVTRV9TVEFUSUNfQUREUkVTUzsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlcihMZUFkZHJlc3NNYW5hZ2VyQ2FsbGJhY2sqIGNhbGxiYWNrKSBvdmVycmlkZSB7fQotCi0gIEFkZHJlc3NXaXRoVHlwZSBHZXRBbm90aGVyQWRkcmVzcygpIG92ZXJyaWRlIHsKLSAgICBoY2k6OkFkZHJlc3MgYWRkcmVzczsKLSAgICBBZGRyZXNzOjpGcm9tU3RyaW5nKCIwNTowNDowMzowMjowMTowMCIsIGFkZHJlc3MpOwotICAgIGF1dG8gcmFuZG9tX2FkZHJlc3MgPSBBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcywgQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUyk7Ci0gICAgcmV0dXJuIHJhbmRvbV9hZGRyZXNzOwotICB9Ci0KLSAgQWRkcmVzc1dpdGhUeXBlIEdldEN1cnJlbnRBZGRyZXNzKCkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzOwotICAgIEFkZHJlc3M6OkZyb21TdHJpbmcoIjA1OjA0OjAzOjAyOjAxOjAwIiwgYWRkcmVzcyk7Ci0gICAgYXV0byByYW5kb21fYWRkcmVzcyA9IEFkZHJlc3NXaXRoVHlwZShhZGRyZXNzLCBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgICByZXR1cm4gcmFuZG9tX2FkZHJlc3M7Ci0gIH0KLX07Ci0KLWNsYXNzIFRlc3RBY2xNYW5hZ2VyIDogcHVibGljIEFjbE1hbmFnZXIgewotIHB1YmxpYzoKLSAgTGVBZGRyZXNzTWFuYWdlciogR2V0TGVBZGRyZXNzTWFuYWdlcigpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gdGVzdF9sZV9hZGRyZXNzX21hbmFnZXJfOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgICBBZGRyZXNzIGFkZHJlc3MoezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9KTsKLSAgICB0ZXN0X2xlX2FkZHJlc3NfbWFuYWdlcl8gPSBuZXcgVGVzdExlQWRkcmVzc01hbmFnZXIoCi0gICAgICAgIGNvbW1vbjo6QmluZCgmVGVzdEFjbE1hbmFnZXI6OmVucXVldWVfY29tbWFuZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgaGFuZGxlcl8sIGFkZHJlc3MsIDB4M0YsIDB4M0YpOwotICB9Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSB0ZXN0X2xlX2FkZHJlc3NfbWFuYWdlcl87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBTZXRSYW5kb21BZGRyZXNzKEFkZHJlc3MgYWRkcmVzcykge30KLQotICB2b2lkIGVucXVldWVfY29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmRfcGFja2V0KXt9OwotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF87Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgVGVzdExlQWRkcmVzc01hbmFnZXIqIHRlc3RfbGVfYWRkcmVzc19tYW5hZ2VyXzsKLX07Ci0KLWNsYXNzIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZXN0X2hjaV9sYXllcl8gPSBuZXcgVGVzdEhjaUxheWVyOyAgLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIHRvIHJlZ2lzdHJ5Ci0gICAgdGVzdF9jb250cm9sbGVyXyA9IG5ldyBUZXN0Q29udHJvbGxlcjsKLSAgICB0ZXN0X2FjbF9tYW5hZ2VyXyA9IG5ldyBUZXN0QWNsTWFuYWdlcjsKLSAgICB0ZXN0X2NvbnRyb2xsZXJfLT5BZGRTdXBwb3J0ZWQocGFyYW1fb3Bjb2RlXyk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmSGNpTGF5ZXI6OkZhY3RvcnksIHRlc3RfaGNpX2xheWVyXyk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmQ29udHJvbGxlcjo6RmFjdG9yeSwgdGVzdF9jb250cm9sbGVyXyk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmQWNsTWFuYWdlcjo6RmFjdG9yeSwgdGVzdF9hY2xfbWFuYWdlcl8pOwotICAgIGNsaWVudF9oYW5kbGVyXyA9IGZha2VfcmVnaXN0cnlfLkdldFRlc3RNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSk7Ci0gICAgQVNTRVJUX05FKGNsaWVudF9oYW5kbGVyXywgbnVsbHB0cik7Ci0gICAgdGVzdF9jb250cm9sbGVyXy0+bnVtX2FkdmVydGlzZXJzID0gMTsKLSAgICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXyA9IGZha2VfcmVnaXN0cnlfLlN0YXJ0PExlQWR2ZXJ0aXNpbmdNYW5hZ2VyPigmdGhyZWFkXyk7Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlJlZ2lzdGVyQWR2ZXJ0aXNpbmdDYWxsYmFjaygmbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpGYWN0b3J5LCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3RvcEFsbCgpOwotICB9Ci0KLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IGZha2VfcmVnaXN0cnlfOwotICBUZXN0SGNpTGF5ZXIqIHRlc3RfaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIFRlc3RDb250cm9sbGVyKiB0ZXN0X2NvbnRyb2xsZXJfID0gbnVsbHB0cjsKLSAgVGVzdEFjbE1hbmFnZXIqIHRlc3RfYWNsX21hbmFnZXJfID0gbnVsbHB0cjsKLSAgb3M6OlRocmVhZCYgdGhyZWFkXyA9IGZha2VfcmVnaXN0cnlfLkdldFRlc3RUaHJlYWQoKTsKLSAgTGVBZHZlcnRpc2luZ01hbmFnZXIqIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0KLSAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEFkZHJlc3MsIEFkZHJlc3NUeXBlKT4gc2Nhbl9jYWxsYmFjayA9Ci0gICAgICBjb21tb246OkJpbmQoJkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6b25fc2NhbiwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKTsKLSAgY29uc3QgY29tbW9uOjpDYWxsYmFjazx2b2lkKEVycm9yQ29kZSwgdWludDhfdCwgdWludDhfdCk+IHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrID0KLSAgICAgIGNvbW1vbjo6QmluZCgmTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0Ojpvbl9zZXRfdGVybWluYXRlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKTsKLQotICBzdGQ6OmZ1dHVyZTxBZGRyZXNzPiBHZXRPblNjYW5Qcm9taXNlKCkgewotICAgIEFTU0VSVF9MT0coYWRkcmVzc19wcm9taXNlXyA9PSBudWxscHRyLCAiUHJvbWlzZXMgcHJvbWlzZXMgLi4uIE9ubHkgb25lIGF0IGEgdGltZSIpOwotICAgIGFkZHJlc3NfcHJvbWlzZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6cHJvbWlzZTxBZGRyZXNzPj4oKTsKLSAgICByZXR1cm4gYWRkcmVzc19wcm9taXNlXy0+Z2V0X2Z1dHVyZSgpOwotICB9Ci0gIHZvaWQgb25fc2NhbihBZGRyZXNzIGFkZHJlc3MsIEFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSkgewotICAgIGlmIChhZGRyZXNzX3Byb21pc2VfID09IG51bGxwdHIpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYWRkcmVzc19wcm9taXNlXy0+c2V0X3ZhbHVlKGFkZHJlc3MpOwotICAgIGFkZHJlc3NfcHJvbWlzZV8ucmVzZXQoKTsKLSAgfQotCi0gIHN0ZDo6ZnV0dXJlPEVycm9yQ29kZT4gR2V0U2V0VGVybWluYXRlZFByb21pc2UoKSB7Ci0gICAgQVNTRVJUX0xPRyhzZXRfdGVybWluYXRlZF9wcm9taXNlXyA9PSBudWxscHRyLCAiUHJvbWlzZXMgcHJvbWlzZXMgLi4uIE9ubHkgb25lIGF0IGEgdGltZSIpOwotICAgIHNldF90ZXJtaW5hdGVkX3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8RXJyb3JDb2RlPj4oKTsKLSAgICByZXR1cm4gc2V0X3Rlcm1pbmF0ZWRfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgfQotICB2b2lkIG9uX3NldF90ZXJtaW5hdGVkKEVycm9yQ29kZSBlcnJvcl9jb2RlLCB1aW50OF90LCB1aW50OF90KSB7Ci0gICAgaWYgKHNldF90ZXJtaW5hdGVkX3Byb21pc2VfICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0X3Rlcm1pbmF0ZWRfcHJvbWlzZV8tPnNldF92YWx1ZShlcnJvcl9jb2RlKTsKLSAgICBzZXRfdGVybWluYXRlZF9wcm9taXNlXy5yZXNldCgpOwotICB9Ci0KLSAgdm9pZCBzeW5jX2NsaWVudF9oYW5kbGVyKCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgY2xpZW50X2hhbmRsZXJfLT5DYWxsKGNvbW1vbjo6QmluZE9uY2UoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLCBjb21tb246OlVucmV0YWluZWQoJnByb21pc2UpKSk7Ci0gICAgYXV0byBmdXR1cmVfc3RhdHVzID0gZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKLSAgICBBU1NFUlRfRVEoZnV0dXJlX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPEFkZHJlc3M+PiBhZGRyZXNzX3Byb21pc2Vfe307Ci0gIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8RXJyb3JDb2RlPj4gc2V0X3Rlcm1pbmF0ZWRfcHJvbWlzZV97fTsKLQotICBPcENvZGUgcGFyYW1fb3Bjb2RlX3tPcENvZGU6OkxFX1NFVF9BRFZFUlRJU0lOR19QQVJBTUVURVJTfTsKLQotICBjbGFzcyBNb2NrQWR2ZXJ0aXNpbmdDYWxsYmFjayA6IHB1YmxpYyBBZHZlcnRpc2luZ0NhbGxiYWNrIHsKLSAgIHB1YmxpYzoKLSAgICBNT0NLX01FVEhPRDQoCi0gICAgICAgIE9uQWR2ZXJ0aXNpbmdTZXRTdGFydGVkLCB2b2lkKGludCByZWdfaWQsIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgaW50OF90IHR4X3Bvd2VyLCBBZHZlcnRpc2luZ1N0YXR1cyBzdGF0dXMpKTsKLSAgICBNT0NLX01FVEhPRDMoT25BZHZlcnRpc2luZ0VuYWJsZWQsIHZvaWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCBib29sIGVuYWJsZSwgdWludDhfdCBzdGF0dXMpKTsKLSAgICBNT0NLX01FVEhPRDIoT25BZHZlcnRpc2luZ0RhdGFTZXQsIHZvaWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykpOwotICAgIE1PQ0tfTUVUSE9EMihPblNjYW5SZXNwb25zZURhdGFTZXQsIHZvaWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykpOwotICAgIE1PQ0tfTUVUSE9EMyhPbkFkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQsIHZvaWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCBpbnQ4X3QgdHhfcG93ZXIsIHVpbnQ4X3Qgc3RhdHVzKSk7Ci0gICAgTU9DS19NRVRIT0QyKE9uUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkLCB2b2lkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpKTsKLSAgICBNT0NLX01FVEhPRDIoT25QZXJpb2RpY0FkdmVydGlzaW5nRGF0YVNldCwgdm9pZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIHVpbnQ4X3Qgc3RhdHVzKSk7Ci0gICAgTU9DS19NRVRIT0QzKE9uUGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZWQsIHZvaWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCBib29sIGVuYWJsZSwgdWludDhfdCBzdGF0dXMpKTsKLSAgICBNT0NLX01FVEhPRDMoT25Pd25BZGRyZXNzUmVhZCwgdm9pZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIHVpbnQ4X3QgYWRkcmVzc190eXBlLCBBZGRyZXNzIGFkZHJlc3MpKTsKLSAgfSBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXzsKLX07Ci0KLWNsYXNzIExlQWR2ZXJ0aXNpbmdBUElUZXN0IDogcHVibGljIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U2V0VXAoKTsKLQotICAgIC8vIHN0YXJ0IGFkdmVydGlzaW5nIHNldAotICAgIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgYWR2ZXJ0aXNpbmdfY29uZmlne307Ci0gICAgYWR2ZXJ0aXNpbmdfY29uZmlnLmFkdmVydGlzaW5nX3R5cGUgPSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9JTkQ7Ci0gICAgYWR2ZXJ0aXNpbmdfY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPSBPd25BZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOwotICAgIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGdhcF9kYXRhe307Ci0gICAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpGTEFHUzsKLSAgICBkYXRhX2l0ZW0uZGF0YV8gPSB7MHgzNH07Ci0gICAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gICAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgICBkYXRhX2l0ZW0uZGF0YV8gPSB7J3InLCAnYScsICduJywgJ2QnLCAnbycsICdtJywgJyAnLCAnZCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnfTsKLSAgICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNlbWVudCA9IGdhcF9kYXRhOwotICAgIGFkdmVydGlzaW5nX2NvbmZpZy5zY2FuX3Jlc3BvbnNlID0gZ2FwX2RhdGE7Ci0KLSAgICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgICBhZHZlcnRpc2VyX2lkXyA9IGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIoCi0gICAgICAgIDB4MDAsIGFkdmVydGlzaW5nX2NvbmZpZywgc2Nhbl9jYWxsYmFjaywgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2ssIDAsIDAsIGNsaWVudF9oYW5kbGVyXyk7Ci0gICAgQVNTRVJUX05FKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkLCBhZHZlcnRpc2VyX2lkXyk7Ci0gICAgRVhQRUNUX0NBTEwoCi0gICAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgICBPbkFkdmVydGlzaW5nU2V0U3RhcnRlZCgweDAwLCBhZHZlcnRpc2VyX2lkXywgMHgwMCwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgICBzdGQ6OnZlY3RvcjxPcENvZGU+IGFkdl9vcGNvZGVzID0gewotICAgICAgICBPcENvZGU6OkxFX1JFQURfQURWRVJUSVNJTkdfUEhZU0lDQUxfQ0hBTk5FTF9UWF9QT1dFUiwKLSAgICAgICAgT3BDb2RlOjpMRV9TRVRfQURWRVJUSVNJTkdfUEFSQU1FVEVSUywKLSAgICAgICAgT3BDb2RlOjpMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBLAotICAgICAgICBPcENvZGU6OkxFX1NFVF9BRFZFUlRJU0lOR19EQVRBLAotICAgICAgICBPcENvZGU6OkxFX1NFVF9BRFZFUlRJU0lOR19FTkFCTEUsCi0gICAgfTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzdWNjZXNzX3ZlY3RvcntzdGF0aWNfY2FzdDx1aW50OF90PihFcnJvckNvZGU6OlNVQ0NFU1MpfTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkdl9vcGNvZGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhdXRvIHBhY2tldF92aWV3ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKGFkdl9vcGNvZGVzW2ldKTsKLSAgICAgIENvbW1hbmRWaWV3IGNvbW1hbmRfcGFja2V0X3ZpZXcgPSBDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF92aWV3KTsKLSAgICAgIGlmIChhZHZfb3Bjb2Rlc1tpXSA9PSBPcENvZGU6OkxFX1JFQURfQURWRVJUSVNJTkdfUEhZU0lDQUxfQ0hBTk5FTF9UWF9QT1dFUikgewotICAgICAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICAgICAgICBMZVJlYWRBZHZlcnRpc2luZ1BoeXNpY2FsQ2hhbm5lbFR4UG93ZXJDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDApKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgICAgICAgIENvbW1hbmRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBhZHZfb3Bjb2Rlc1tpXSwgc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihzdWNjZXNzX3ZlY3RvcikpKTsKLSAgICAgIH0KLSAgICAgIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICAgIH0KLSAgICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5SZXNldENvbW1hbmRGdXR1cmUoKTsKLSAgfQotCi0gIEFkdmVydGlzZXJJZCBhZHZlcnRpc2VyX2lkXzsKLX07Ci0KLWNsYXNzIExlQW5kcm9pZEhjaUFkdmVydGlzaW5nTWFuYWdlclRlc3QgOiBwdWJsaWMgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgcGFyYW1fb3Bjb2RlXyA9IE9wQ29kZTo6TEVfTVVMVElfQURWVDsKLSAgICBMZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlNldFVwKCk7Ci0gICAgdGVzdF9jb250cm9sbGVyXy0+bnVtX2FkdmVydGlzZXJzID0gMzsKLSAgfQotfTsKLQotY2xhc3MgTGVBbmRyb2lkSGNpQWR2ZXJ0aXNpbmdBUElUZXN0IDogcHVibGljIExlQW5kcm9pZEhjaUFkdmVydGlzaW5nTWFuYWdlclRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBMZUFuZHJvaWRIY2lBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXRVcCgpOwotCi0gICAgRXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZyBhZHZlcnRpc2luZ19jb25maWd7fTsKLSAgICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSA9IEFkdmVydGlzaW5nVHlwZTo6QURWX0lORDsKLSAgICBhZHZlcnRpc2luZ19jb25maWcub3duX2FkZHJlc3NfdHlwZSA9IE93bkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gICAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gZ2FwX2RhdGF7fTsKLSAgICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICAgIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkZMQUdTOwotICAgIGRhdGFfaXRlbS5kYXRhXyA9IHsweDM0fTsKLSAgICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICAgIGRhdGFfaXRlbS5kYXRhXyA9IHsncicsICdhJywgJ24nLCAnZCcsICdvJywgJ20nLCAnICcsICdkJywgJ2UnLCAndicsICdpJywgJ2MnLCAnZSd9OwotICAgIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICAgIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2VtZW50ID0gZ2FwX2RhdGE7Ci0gICAgYWR2ZXJ0aXNpbmdfY29uZmlnLnNjYW5fcmVzcG9uc2UgPSBnYXBfZGF0YTsKLQotICAgIHRlc3RfaGNpX2xheWVyXy0+U2V0U3ViQ29tbWFuZEZ1dHVyZShTdWJPY2Y6OlNFVF9QQVJBTSk7Ci0gICAgYWR2ZXJ0aXNlcl9pZF8gPSBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+RXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyKAotICAgICAgICAweDAwLCBhZHZlcnRpc2luZ19jb25maWcsIHNjYW5fY2FsbGJhY2ssIHNldF90ZXJtaW5hdGVkX2NhbGxiYWNrLCAwLCAwLCBjbGllbnRfaGFuZGxlcl8pOwotICAgIEFTU0VSVF9ORShMZUFkdmVydGlzaW5nTWFuYWdlcjo6a0ludmFsaWRJZCwgYWR2ZXJ0aXNlcl9pZF8pOwotICAgIHN0ZDo6dmVjdG9yPFN1Yk9jZj4gc3ViX29jZiA9IHsKLSAgICAgICAgU3ViT2NmOjpTRVRfUEFSQU0sCi0gICAgICAgIFN1Yk9jZjo6U0VUX0RBVEEsCi0gICAgICAgIFN1Yk9jZjo6U0VUX1NDQU5fUkVTUCwKLSAgICAgICAgU3ViT2NmOjpTRVRfUkFORE9NX0FERFIsCi0gICAgICAgIFN1Yk9jZjo6U0VUX0VOQUJMRSwKLSAgICB9OwotICAgIEVYUEVDVF9DQUxMKAotICAgICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgICAgT25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoMCwgYWR2ZXJ0aXNlcl9pZF8sIDAsIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJfb2NmLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX01VTFRJX0FEVlQpOwotICAgICAgYXV0byBzdWJfcGFja2V0ID0gTGVNdWx0aUFkdnRWaWV3OjpDcmVhdGUoTGVBZHZlcnRpc2luZ0NvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0KSk7Ci0gICAgICBBU1NFUlRfVFJVRShzdWJfcGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVNdWx0aUFkdnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIHN1Yl9vY2ZbaV0pKTsKLSAgICAgIGlmICgoaSArIDEpIDwgc3ViX29jZi5zaXplKCkpIHsKLSAgICAgICAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRTdWJDb21tYW5kRnV0dXJlKHN1Yl9vY2ZbaSArIDFdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3luY19jbGllbnRfaGFuZGxlcigpOwotICB9Ci0KLSAgQWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWRfOwotfTsKLQotY2xhc3MgTGVFeHRlbmRlZEFkdmVydGlzaW5nTWFuYWdlclRlc3QgOiBwdWJsaWMgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgcGFyYW1fb3Bjb2RlXyA9IE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlM7Ci0gICAgTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXRVcCgpOwotICAgIHRlc3RfY29udHJvbGxlcl8tPm51bV9hZHZlcnRpc2VycyA9IDU7Ci0gIH0KLX07Ci0KLWNsYXNzIExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QgOiBwdWJsaWMgTGVFeHRlbmRlZEFkdmVydGlzaW5nTWFuYWdlclRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U2V0VXAoKTsKLQotICAgIC8vIHN0YXJ0IGFkdmVydGlzaW5nIHNldAotICAgIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgYWR2ZXJ0aXNpbmdfY29uZmlne307Ci0gICAgYWR2ZXJ0aXNpbmdfY29uZmlnLmFkdmVydGlzaW5nX3R5cGUgPSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9JTkQ7Ci0gICAgYWR2ZXJ0aXNpbmdfY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPSBPd25BZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOwotICAgIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGdhcF9kYXRhe307Ci0gICAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpGTEFHUzsKLSAgICBkYXRhX2l0ZW0uZGF0YV8gPSB7MHgzNH07Ci0gICAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gICAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgICBkYXRhX2l0ZW0uZGF0YV8gPSB7J3InLCAnYScsICduJywgJ2QnLCAnbycsICdtJywgJyAnLCAnZCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnfTsKLSAgICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNlbWVudCA9IGdhcF9kYXRhOwotICAgIGFkdmVydGlzaW5nX2NvbmZpZy5zY2FuX3Jlc3BvbnNlID0gZ2FwX2RhdGE7Ci0gICAgYWR2ZXJ0aXNpbmdfY29uZmlnLmNoYW5uZWxfbWFwID0gMTsKLSAgICBhZHZlcnRpc2luZ19jb25maWcuc2lkID0gMHgwMTsKLQotICAgIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICAgIGFkdmVydGlzZXJfaWRfID0gbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPkV4dGVuZGVkQ3JlYXRlQWR2ZXJ0aXNlcigKLSAgICAgICAgMHgwMCwgYWR2ZXJ0aXNpbmdfY29uZmlnLCBzY2FuX2NhbGxiYWNrLCBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywgMCwgMCwgY2xpZW50X2hhbmRsZXJfKTsKLSAgICBBU1NFUlRfTkUoTGVBZHZlcnRpc2luZ01hbmFnZXI6OmtJbnZhbGlkSWQsIGFkdmVydGlzZXJfaWRfKTsKLSAgICBFWFBFQ1RfQ0FMTCgKLSAgICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICAgIE9uQWR2ZXJ0aXNpbmdTZXRTdGFydGVkKDB4MDAsIGFkdmVydGlzZXJfaWRfLCAtMjMsIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gICAgc3RkOjp2ZWN0b3I8T3BDb2RlPiBhZHZfb3Bjb2RlcyA9IHsKLSAgICAgICAgT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUywKLSAgICAgICAgT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfU0NBTl9SRVNQT05TRSwKLSAgICAgICAgT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfREFUQSwKLSAgICAgICAgT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfRU5BQkxFLAotICAgIH07Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3VjY2Vzc192ZWN0b3J7c3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpTVUNDRVNTKX07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZHZfb3Bjb2Rlcy5zaXplKCk7IGkrKykgewotICAgICAgYXV0byBwYWNrZXRfdmlldyA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChhZHZfb3Bjb2Rlc1tpXSk7Ci0gICAgICBDb21tYW5kVmlldyBjb21tYW5kX3BhY2tldF92aWV3ID0gQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfdmlldyk7Ci0gICAgICBhdXRvIGNvbW1hbmQgPSBDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoQWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldF92aWV3KSk7Ci0gICAgICBpZiAoYWR2X29wY29kZXNbaV0gPT0gT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUykgewotICAgICAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVyc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgdWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTLCBzdGF0aWNfY2FzdDx1aW50OF90PigtMjMpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICAgICAgICBDb21tYW5kQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgYWR2X29wY29kZXNbaV0sIHN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4oc3VjY2Vzc192ZWN0b3IpKSk7Ci0gICAgICB9Ci0gICAgICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgICB9Ci0gICAgc3luY19jbGllbnRfaGFuZGxlcigpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+UmVzZXRDb21tYW5kRnV0dXJlKCk7Ci0gIH0KLQotICBBZHZlcnRpc2VySWQgYWR2ZXJ0aXNlcl9pZF87Ci19OwotCi1URVNUX0YoTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0LCBzdGFydHVwX3RlYXJkb3duKSB7fQotCi1URVNUX0YoTGVBbmRyb2lkSGNpQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgc3RhcnR1cF90ZWFyZG93bikge30KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ01hbmFnZXJUZXN0LCBzdGFydHVwX3RlYXJkb3duKSB7fQotCi1URVNUX0YoTGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0LCBjcmVhdGVfYWR2ZXJ0aXNlcl90ZXN0KSB7Ci0gIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgYWR2ZXJ0aXNpbmdfY29uZmlne307Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2luZ190eXBlID0gQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfSU5EOwotICBhZHZlcnRpc2luZ19jb25maWcub3duX2FkZHJlc3NfdHlwZSA9IE93bkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGdhcF9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVte307Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkZMQUdTOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7MHgzNH07Ci0gIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7J3InLCAnYScsICduJywgJ2QnLCAnbycsICdtJywgJyAnLCAnZCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnfTsKLSAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2VtZW50ID0gZ2FwX2RhdGE7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5zY2FuX3Jlc3BvbnNlID0gZ2FwX2RhdGE7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGF1dG8gaWQgPSBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+RXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyKAotICAgICAgMHgwMCwgYWR2ZXJ0aXNpbmdfY29uZmlnLCBzY2FuX2NhbGxiYWNrLCBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywgMCwgMCwgY2xpZW50X2hhbmRsZXJfKTsKLSAgQVNTRVJUX05FKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkLCBpZCk7Ci0gIHN0ZDo6dmVjdG9yPE9wQ29kZT4gYWR2X29wY29kZXMgPSB7Ci0gICAgICBPcENvZGU6OkxFX1JFQURfQURWRVJUSVNJTkdfUEhZU0lDQUxfQ0hBTk5FTF9UWF9QT1dFUiwKLSAgICAgIE9wQ29kZTo6TEVfU0VUX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMsCi0gICAgICBPcENvZGU6OkxFX1NFVF9TQ0FOX1JFU1BPTlNFX0RBVEEsCi0gICAgICBPcENvZGU6OkxFX1NFVF9BRFZFUlRJU0lOR19EQVRBLAotICAgICAgT3BDb2RlOjpMRV9TRVRfQURWRVJUSVNJTkdfRU5BQkxFLAotICB9OwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoMHgwMCwgaWQsIDB4MDAsIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN1Y2Nlc3NfdmVjdG9ye3N0YXRpY19jYXN0PHVpbnQ4X3Q+KEVycm9yQ29kZTo6U1VDQ0VTUyl9OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkdl9vcGNvZGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byBwYWNrZXRfdmlldyA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChhZHZfb3Bjb2Rlc1tpXSk7Ci0gICAgQ29tbWFuZFZpZXcgY29tbWFuZF9wYWNrZXRfdmlldyA9IENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICAgIGF1dG8gY29tbWFuZCA9IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0X3ZpZXcpKTsKLSAgICBpZiAoYWR2X29wY29kZXNbaV0gPT0gT3BDb2RlOjpMRV9SRUFEX0FEVkVSVElTSU5HX1BIWVNJQ0FMX0NIQU5ORUxfVFhfUE9XRVIpIHsKLSAgICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgICAgICBMZVJlYWRBZHZlcnRpc2luZ1BoeXNpY2FsQ2hhbm5lbFR4UG93ZXJDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDApKTsKLSAgICB9IGVsc2UgewotICAgICAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgICAgIENvbW1hbmRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBhZHZfb3Bjb2Rlc1tpXSwgc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihzdWNjZXNzX3ZlY3RvcikpKTsKLSAgICB9Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIH0KLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotCi0gIC8vIERpc2FibGUgdGhlIGFkdmVydGlzZXIKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlJlbW92ZUFkdmVydGlzZXIoaWQpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfQURWRVJUSVNJTkdfRU5BQkxFKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVBbmRyb2lkSGNpQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgY3JlYXRlX2FkdmVydGlzZXJfdGVzdCkgewotICBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGFkdmVydGlzaW5nX2NvbmZpZ3t9OwotICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSA9IEFkdmVydGlzaW5nVHlwZTo6QURWX0lORDsKLSAgYWR2ZXJ0aXNpbmdfY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPSBPd25BZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOwotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBnYXBfZGF0YXt9OwotICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpGTEFHUzsKLSAgZGF0YV9pdGVtLmRhdGFfID0gezB4MzR9OwotICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZGF0YV9pdGVtLmRhdGFfID0geydyJywgJ2EnLCAnbicsICdkJywgJ28nLCAnbScsICcgJywgJ2QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJ307Ci0gIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNlbWVudCA9IGdhcF9kYXRhOwotICBhZHZlcnRpc2luZ19jb25maWcuc2Nhbl9yZXNwb25zZSA9IGdhcF9kYXRhOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0U3ViQ29tbWFuZEZ1dHVyZShTdWJPY2Y6OlNFVF9QQVJBTSk7Ci0gIGF1dG8gaWQgPSBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+RXh0ZW5kZWRDcmVhdGVBZHZlcnRpc2VyKAotICAgICAgMHgwMCwgYWR2ZXJ0aXNpbmdfY29uZmlnLCBzY2FuX2NhbGxiYWNrLCBzZXRfdGVybWluYXRlZF9jYWxsYmFjaywgMCwgMCwgY2xpZW50X2hhbmRsZXJfKTsKLSAgQVNTRVJUX05FKExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkLCBpZCk7Ci0gIHN0ZDo6dmVjdG9yPFN1Yk9jZj4gc3ViX29jZiA9IHsKLSAgICAgIFN1Yk9jZjo6U0VUX1BBUkFNLCBTdWJPY2Y6OlNFVF9EQVRBLCBTdWJPY2Y6OlNFVF9TQ0FOX1JFU1AsIFN1Yk9jZjo6U0VUX1JBTkRPTV9BRERSLCBTdWJPY2Y6OlNFVF9FTkFCTEUsCi0gIH07Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sIE9uQWR2ZXJ0aXNpbmdTZXRTdGFydGVkKDAsIGlkLCAwLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1Yl9vY2Yuc2l6ZSgpOyBpKyspIHsKLSAgICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX01VTFRJX0FEVlQpOwotICAgIGF1dG8gc3ViX3BhY2tldCA9IExlTXVsdGlBZHZ0Vmlldzo6Q3JlYXRlKExlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldCkpOwotICAgIEFTU0VSVF9UUlVFKHN1Yl9wYWNrZXQuSXNWYWxpZCgpKTsKLSAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVNdWx0aUFkdnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIHN1Yl9vY2ZbaV0pKTsKLSAgICBpZiAoKGkgKyAxKSA8IHN1Yl9vY2Yuc2l6ZSgpKSB7Ci0gICAgICB0ZXN0X2hjaV9sYXllcl8tPlNldFN1YkNvbW1hbmRGdXR1cmUoc3ViX29jZltpICsgMV0pOwotICAgIH0KLSAgfQotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gRGlzYWJsZSB0aGUgYWR2ZXJ0aXNlcgotICB0ZXN0X2hjaV9sYXllcl8tPlNldFN1YkNvbW1hbmRGdXR1cmUoU3ViT2NmOjpTRVRfRU5BQkxFKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlJlbW92ZUFkdmVydGlzZXIoaWQpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9NVUxUSV9BRFZUKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlTXVsdGlBZHZ0U2V0RW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ01hbmFnZXJUZXN0LCBjcmVhdGVfYWR2ZXJ0aXNlcl90ZXN0KSB7Ci0gIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgYWR2ZXJ0aXNpbmdfY29uZmlne307Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2luZ190eXBlID0gQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfSU5EOwotICBhZHZlcnRpc2luZ19jb25maWcub3duX2FkZHJlc3NfdHlwZSA9IE93bkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGdhcF9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVte307Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkZMQUdTOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7MHgzNH07Ci0gIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7J3InLCAnYScsICduJywgJ2QnLCAnbycsICdtJywgJyAnLCAnZCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnfTsKLSAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2VtZW50ID0gZ2FwX2RhdGE7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5zY2FuX3Jlc3BvbnNlID0gZ2FwX2RhdGE7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5jaGFubmVsX21hcCA9IDE7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5zaWQgPSAweDAxOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBhdXRvIGlkID0gbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPkV4dGVuZGVkQ3JlYXRlQWR2ZXJ0aXNlcigKLSAgICAgIDB4MDAsIGFkdmVydGlzaW5nX2NvbmZpZywgc2Nhbl9jYWxsYmFjaywgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2ssIDAsIDAsIGNsaWVudF9oYW5kbGVyXyk7Ci0gIEFTU0VSVF9ORShMZUFkdmVydGlzaW5nTWFuYWdlcjo6a0ludmFsaWRJZCwgaWQpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoMHgwMCwgaWQsIC0yMywgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgc3RkOjp2ZWN0b3I8T3BDb2RlPiBhZHZfb3Bjb2RlcyA9IHsKLSAgICAgIE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMsCi0gICAgICBPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19TQ0FOX1JFU1BPTlNFLAotICAgICAgT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfREFUQSwKLSAgICAgIE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSwKLSAgfTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3VjY2Vzc192ZWN0b3J7c3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpTVUNDRVNTKX07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWR2X29wY29kZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBhdXRvIHBhY2tldF92aWV3ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKGFkdl9vcGNvZGVzW2ldKTsKLSAgICBDb21tYW5kVmlldyBjb21tYW5kX3BhY2tldF92aWV3ID0gQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfdmlldyk7Ci0gICAgYXV0byBjb21tYW5kID0gQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKEFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXRfdmlldykpOwotICAgIGlmIChhZHZfb3Bjb2Rlc1tpXSA9PSBPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19QQVJBTUVURVJTKSB7Ci0gICAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVyc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUywgc3RhdGljX2Nhc3Q8dWludDhfdD4oLTIzKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICAgICAgQ29tbWFuZENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIGFkdl9vcGNvZGVzW2ldLCBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KHN1Y2Nlc3NfdmVjdG9yKSkpOwotICAgIH0KLSAgICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgfQotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gUmVtb3ZlIHRoZSBhZHZlcnRpc2VyCi0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5SZW1vdmVBZHZlcnRpc2VyKGlkKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfRU5BQkxFKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1JFTU9WRV9BRFZFUlRJU0lOR19TRVQpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUFkdmVydGlzaW5nQVBJVGVzdCwgc3RhcnR1cF90ZWFyZG93bikge30KLQotVEVTVF9GKExlQW5kcm9pZEhjaUFkdmVydGlzaW5nQVBJVGVzdCwgc3RhcnR1cF90ZWFyZG93bikge30KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QsIHN0YXJ0dXBfdGVhcmRvd24pIHt9Ci0KLVRFU1RfRihMZUFkdmVydGlzaW5nQVBJVGVzdCwgc2V0X3BhcmFtZXRlcikgewotICBFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnIGFkdmVydGlzaW5nX2NvbmZpZ3t9OwotICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNpbmdfdHlwZSA9IEFkdmVydGlzaW5nVHlwZTo6QURWX0lORDsKLSAgYWR2ZXJ0aXNpbmdfY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPSBPd25BZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOwotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBnYXBfZGF0YXt9OwotICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7J3InLCAnYScsICduJywgJ2QnLCAnbycsICdtJywgJyAnLCAnZCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnfTsKLSAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2VtZW50ID0gZ2FwX2RhdGE7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5jaGFubmVsX21hcCA9IDE7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+U2V0UGFyYW1ldGVycyhhZHZlcnRpc2VyX2lkXywgYWR2ZXJ0aXNpbmdfY29uZmlnKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkKGFkdmVydGlzZXJfaWRfLCAweDAwLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRBZHZlcnRpc2luZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVBbmRyb2lkSGNpQWR2ZXJ0aXNpbmdBUElUZXN0LCBzZXRfcGFyYW1ldGVyKSB7Ci0gIEV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgYWR2ZXJ0aXNpbmdfY29uZmlne307Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5hZHZlcnRpc2luZ190eXBlID0gQWR2ZXJ0aXNpbmdUeXBlOjpBRFZfSU5EOwotICBhZHZlcnRpc2luZ19jb25maWcub3duX2FkZHJlc3NfdHlwZSA9IE93bkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGdhcF9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVte307Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkNPTVBMRVRFX0xPQ0FMX05BTUU7Ci0gIGRhdGFfaXRlbS5kYXRhXyA9IHsncicsICdhJywgJ24nLCAnZCcsICdvJywgJ20nLCAnICcsICdkJywgJ2UnLCAndicsICdpJywgJ2MnLCAnZSd9OwotICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgYWR2ZXJ0aXNpbmdfY29uZmlnLmFkdmVydGlzZW1lbnQgPSBnYXBfZGF0YTsKLSAgYWR2ZXJ0aXNpbmdfY29uZmlnLmNoYW5uZWxfbWFwID0gMTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRTdWJDb21tYW5kRnV0dXJlKFN1Yk9jZjo6U0VUX1BBUkFNKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldFBhcmFtZXRlcnMoYWR2ZXJ0aXNlcl9pZF8sIGFkdmVydGlzaW5nX2NvbmZpZyk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX01VTFRJX0FEVlQpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkKGFkdmVydGlzZXJfaWRfLCAweDAwLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVNdWx0aUFkdnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIFN1Yk9jZjo6U0VUX1BBUkFNKSk7Ci0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9wYXJhbWV0ZXIpIHsKLSAgRXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZyBhZHZlcnRpc2luZ19jb25maWd7fTsKLSAgYWR2ZXJ0aXNpbmdfY29uZmlnLmFkdmVydGlzaW5nX3R5cGUgPSBBZHZlcnRpc2luZ1R5cGU6OkFEVl9JTkQ7Ci0gIGFkdmVydGlzaW5nX2NvbmZpZy5vd25fYWRkcmVzc190eXBlID0gT3duQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gZ2FwX2RhdGF7fTsKLSAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZGF0YV9pdGVtLmRhdGFfID0geydyJywgJ2EnLCAnbicsICdkJywgJ28nLCAnbScsICcgJywgJ2QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJ307Ci0gIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICBhZHZlcnRpc2luZ19jb25maWcuYWR2ZXJ0aXNlbWVudCA9IGdhcF9kYXRhOwotICBhZHZlcnRpc2luZ19jb25maWcuY2hhbm5lbF9tYXAgPSAxOwotICBhZHZlcnRpc2luZ19jb25maWcuc2lkID0gMHgwMTsKLSAgYWR2ZXJ0aXNpbmdfY29uZmlnLnR4X3Bvd2VyID0gMHgwODsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXRQYXJhbWV0ZXJzKGFkdmVydGlzZXJfaWRfLCBhZHZlcnRpc2luZ19jb25maWcpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUEFSQU1FVEVSUyk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPbkFkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQoYWR2ZXJ0aXNlcl9pZF8sIDB4MDgsIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIDB4MDgpKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9kYXRhX3Rlc3QpIHsKLSAgLy8gU2V0IGFkdmVydGlzaW5nIGRhdGEKLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gYWR2ZXJ0aXNpbmdfZGF0YXt9OwotICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpUWF9QT1dFUl9MRVZFTDsKLSAgZGF0YV9pdGVtLmRhdGFfID0gezB4MDB9OwotICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlLCBhZHZlcnRpc2luZ19kYXRhKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0FEVkVSVElTSU5HX0RBVEEpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ0RhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gU2V0IHNjYW4gcmVzcG9uc2UgZGF0YQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiByZXNwb25zZV9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVtMnt9OwotICBkYXRhX2l0ZW0yLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZGF0YV9pdGVtMi5kYXRhXyA9IHsndCcsICdlJywgJ3MnLCAndCcsICcgJywgJ2QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJ307Ci0gIHJlc3BvbnNlX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbTIpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIHRydWUsIHJlc3BvbnNlX2RhdGEpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfU0NBTl9SRVNQT05TRV9EQVRBKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uU2NhblJlc3BvbnNlRGF0YVNldChhZHZlcnRpc2VyX2lkXywgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0U2NhblJlc3BvbnNlRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdBUElUZXN0LCBzZXRfZGF0YV90ZXN0KSB7Ci0gIC8vIFNldCBhZHZlcnRpc2luZyBkYXRhCi0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGFkdmVydGlzaW5nX2RhdGF7fTsKLSAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6VFhfUE9XRVJfTEVWRUw7Ci0gIGRhdGFfaXRlbS5kYXRhXyA9IHsweDAwfTsKLSAgYWR2ZXJ0aXNpbmdfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXREYXRhKGFkdmVydGlzZXJfaWRfLCBmYWxzZSwgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19EQVRBKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uQWR2ZXJ0aXNpbmdEYXRhU2V0KGFkdmVydGlzZXJfaWRfLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gU2V0IHNjYW4gcmVzcG9uc2UgZGF0YQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiByZXNwb25zZV9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVtMnt9OwotICBkYXRhX2l0ZW0yLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZGF0YV9pdGVtMi5kYXRhXyA9IHsndCcsICdlJywgJ3MnLCAndCcsICcgJywgJ2QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJ307Ci0gIHJlc3BvbnNlX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbTIpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIHRydWUsIHJlc3BvbnNlX2RhdGEpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfU0NBTl9SRVNQT05TRSk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPblNjYW5SZXNwb25zZURhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUFuZHJvaWRIY2lBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9kYXRhX3Rlc3QpIHsKLSAgLy8gU2V0IGFkdmVydGlzaW5nIGRhdGEKLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gYWR2ZXJ0aXNpbmdfZGF0YXt9OwotICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpUWF9QT1dFUl9MRVZFTDsKLSAgZGF0YV9pdGVtLmRhdGFfID0gezB4MDB9OwotICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldFN1YkNvbW1hbmRGdXR1cmUoU3ViT2NmOjpTRVRfREFUQSk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXREYXRhKGFkdmVydGlzZXJfaWRfLCBmYWxzZSwgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX01VTFRJX0FEVlQpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ0RhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZU11bHRpQWR2dENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUywgU3ViT2NmOjpTRVRfREFUQSkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gU2V0IHNjYW4gcmVzcG9uc2UgZGF0YQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiByZXNwb25zZV9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVtMnt9OwotICBkYXRhX2l0ZW0yLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZGF0YV9pdGVtMi5kYXRhXyA9IHsndCcsICdlJywgJ3MnLCAndCcsICcgJywgJ2QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJ307Ci0gIHJlc3BvbnNlX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbTIpOwotICB0ZXN0X2hjaV9sYXllcl8tPlNldFN1YkNvbW1hbmRGdXR1cmUoU3ViT2NmOjpTRVRfU0NBTl9SRVNQKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIHRydWUsIHJlc3BvbnNlX2RhdGEpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9NVUxUSV9BRFZUKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uU2NhblJlc3BvbnNlRGF0YVNldChhZHZlcnRpc2VyX2lkXywgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgTGVNdWx0aUFkdnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIFN1Yk9jZjo6U0VUX1NDQU5fUkVTUCkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdBUElUZXN0LCBzZXRfZGF0YV9mcmFnbWVudHNfdGVzdCkgewotICAvLyBTZXQgYWR2ZXJ0aXNpbmcgZGF0YQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBhZHZlcnRpc2luZ19kYXRhe307Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgIEdhcERhdGEgZGF0YV9pdGVte307Ci0gICAgZGF0YV9pdGVtLmRhdGFfLnB1c2hfYmFjaygweGRhKTsKLSAgICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpTRVJWSUNFX0RBVEFfMTI4X0JJVF9VVUlEUzsKLSAgICB1aW50OF90IHV1aWRbMTZdID0gezB4ZjAsIDB4MzQsIDB4OWIsIDB4NWYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIGl9OwotICAgIHN0ZDo6Y29weV9uKHV1aWQsIDE2LCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YV9pdGVtLmRhdGFfKSk7Ci0gICAgdWludDhfdCBzZXJ2aWNlX2RhdGFbMjAwXTsKLSAgICBzdGQ6OmNvcHlfbihzZXJ2aWNlX2RhdGEsIDIwMCwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGFfaXRlbS5kYXRhXykpOwotICAgIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIH0KLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlLCBhZHZlcnRpc2luZ19kYXRhKTsKLQotICAvLyBGaXJzdCBmcmFnbWVudAotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0RBVEEpOwotCi0gIC8vIEludGVybWVkaWF0ZSBmcmFnbWVudAotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0RBVEEpOwotCi0gIC8vIExhc3QgZnJhZ21lbnQKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19EQVRBKTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ0RhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVFeHRlbmRlZEFkdmVydGlzaW5nQVBJVGVzdCwgc2V0X3NjYW5fcmVzcG9uc2VfZnJhZ21lbnRzX3Rlc3QpIHsKLSAgLy8gU2V0IGFkdmVydGlzaW5nIGRhdGEKLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gYWR2ZXJ0aXNpbmdfZGF0YXt9OwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICAgIGRhdGFfaXRlbS5kYXRhXy5wdXNoX2JhY2soMHhmYSk7Ci0gICAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6U0VSVklDRV9EQVRBXzEyOF9CSVRfVVVJRFM7Ci0gICAgdWludDhfdCB1dWlkWzE2XSA9IHsweGYwLCAweDM0LCAweDliLCAweDVmLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCBpfTsKLSAgICBzdGQ6OmNvcHlfbih1dWlkLCAxNiwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGFfaXRlbS5kYXRhXykpOwotICAgIHVpbnQ4X3Qgc2VydmljZV9kYXRhWzIzMl07Ci0gICAgc3RkOjpjb3B5X24oc2VydmljZV9kYXRhLCAyMzIsIHN0ZDo6YmFja19pbnNlcnRlcihkYXRhX2l0ZW0uZGF0YV8pKTsKLSAgICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICB9Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXREYXRhKGFkdmVydGlzZXJfaWRfLCB0cnVlLCBhZHZlcnRpc2luZ19kYXRhKTsKLQotICAvLyBGaXJzdCBmcmFnbWVudAotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1NDQU5fUkVTUE9OU0UpOwotCi0gIC8vIEludGVybWVkaWF0ZSBmcmFnbWVudAotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1NDQU5fUkVTUE9OU0UpOwotCi0gIC8vIExhc3QgZnJhZ21lbnQKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19TQ0FOX1JFU1BPTlNFKTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25TY2FuUmVzcG9uc2VEYXRhU2V0KGFkdmVydGlzZXJfaWRfLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdTY2FuUmVzcG9uc2VDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9kYXRhX3dpdGhfaW52YWxpZF9hZF9zdHJ1Y3R1cmUpIHsKLSAgLy8gU2V0IGFkdmVydGlzaW5nIGRhdGEgd2l0aCBBRCBzdHJ1Y3R1cmUgdGhhdCBsZW5ndGggZ3JlYXRlciB0aGFuIDI1MQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBhZHZlcnRpc2luZ19kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVte307Ci0gIGRhdGFfaXRlbS5kYXRhXy5wdXNoX2JhY2soMHhmYik7Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OlNFUlZJQ0VfREFUQV8xMjhfQklUX1VVSURTOwotICB1aW50OF90IHV1aWRbMTZdID0gezB4ZjAsIDB4MzQsIDB4OWIsIDB4NWYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDB9OwotICBzdGQ6OmNvcHlfbih1dWlkLCAxNiwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGFfaXRlbS5kYXRhXykpOwotICB1aW50OF90IHNlcnZpY2VfZGF0YVsyMzNdOwotICBzdGQ6OmNvcHlfbihzZXJ2aWNlX2RhdGEsIDIzMywgc3RkOjpiYWNrX2luc2VydGVyKGRhdGFfaXRlbS5kYXRhXykpOwotICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPbkFkdmVydGlzaW5nRGF0YVNldChhZHZlcnRpc2VyX2lkXywgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OklOVEVSTkFMX0VSUk9SKSk7Ci0KLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlLCBhZHZlcnRpc2luZ19kYXRhKTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25TY2FuUmVzcG9uc2VEYXRhU2V0KGFkdmVydGlzZXJfaWRfLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6SU5URVJOQUxfRVJST1IpKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldERhdGEoYWR2ZXJ0aXNlcl9pZF8sIHRydWUsIGFkdmVydGlzaW5nX2RhdGEpOwotCi0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9kYXRhX3dpdGhfaW52YWxpZF9sZW5ndGgpIHsKLSAgLy8gU2V0IGFkdmVydGlzaW5nIGRhdGEgd2l0aCBkYXRhIHRoYXQgZ3JlYXRlciB0aGFuIGxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGhfCi0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGFkdmVydGlzaW5nX2RhdGF7fTsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgIEdhcERhdGEgZGF0YV9pdGVte307Ci0gICAgZGF0YV9pdGVtLmRhdGFfLnB1c2hfYmFjaygweGZiKTsKLSAgICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpTRVJWSUNFX0RBVEFfMTI4X0JJVF9VVUlEUzsKLSAgICB1aW50OF90IHV1aWRbMTZdID0gezB4ZjAsIDB4MzQsIDB4OWIsIDB4NWYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIGl9OwotICAgIHN0ZDo6Y29weV9uKHV1aWQsIDE2LCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YV9pdGVtLmRhdGFfKSk7Ci0gICAgdWludDhfdCBzZXJ2aWNlX2RhdGFbMjAwXTsKLSAgICBzdGQ6OmNvcHlfbihzZXJ2aWNlX2RhdGEsIDIwMCwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGFfaXRlbS5kYXRhXykpOwotICAgIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIH0KLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ0RhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpEQVRBX1RPT19MQVJHRSkpOwotICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+U2V0RGF0YShhZHZlcnRpc2VyX2lkXywgZmFsc2UsIGFkdmVydGlzaW5nX2RhdGEpOwotCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPblNjYW5SZXNwb25zZURhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpEQVRBX1RPT19MQVJHRSkpOwotICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+U2V0RGF0YShhZHZlcnRpc2VyX2lkXywgdHJ1ZSwgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0KLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVBZHZlcnRpc2luZ0FQSVRlc3QsIGRpc2FibGVfZW5hYmxlX2FkdmVydGlzZXJfdGVzdCkgewotICAvLyBkaXNhYmxlIGFkdmVydGlzZXIKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVBZHZlcnRpc2VyKGFkdmVydGlzZXJfaWRfLCBmYWxzZSwgMHgwMCwgMHgwMCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9BRFZFUlRJU0lOR19FTkFCTEUpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25BZHZlcnRpc2luZ0VuYWJsZWQoYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gZW5hYmxlIGFkdmVydGlzZXIKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVBZHZlcnRpc2VyKGFkdmVydGlzZXJfaWRfLCB0cnVlLCAweDAwLCAweDAwKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0FEVkVSVElTSU5HX0VOQUJMRSk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPbkFkdmVydGlzaW5nRW5hYmxlZChhZHZlcnRpc2VyX2lkXywgdHJ1ZSwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0QWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVBbmRyb2lkSGNpQWR2ZXJ0aXNpbmdBUElUZXN0LCBkaXNhYmxlX2VuYWJsZV9hZHZlcnRpc2VyX3Rlc3QpIHsKLSAgLy8gZGlzYWJsZSBhZHZlcnRpc2VyCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0U3ViQ29tbWFuZEZ1dHVyZShTdWJPY2Y6OlNFVF9FTkFCTEUpOwotICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+RW5hYmxlQWR2ZXJ0aXNlcihhZHZlcnRpc2VyX2lkXywgZmFsc2UsIDB4MDAsIDB4MDApOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9NVUxUSV9BRFZUKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uQWR2ZXJ0aXNpbmdFbmFibGVkKGFkdmVydGlzZXJfaWRfLCBmYWxzZSwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgTGVNdWx0aUFkdnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIFN1Yk9jZjo6U0VUX0VOQUJMRSkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gZW5hYmxlIGFkdmVydGlzZXIKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRTdWJDb21tYW5kRnV0dXJlKFN1Yk9jZjo6U0VUX0VOQUJMRSk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVBZHZlcnRpc2VyKGFkdmVydGlzZXJfaWRfLCB0cnVlLCAweDAwLCAweDAwKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfTVVMVElfQURWVCk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPbkFkdmVydGlzaW5nRW5hYmxlZChhZHZlcnRpc2VyX2lkXywgdHJ1ZSwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgTGVNdWx0aUFkdnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIFN1Yk9jZjo6U0VUX0VOQUJMRSkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdBUElUZXN0LCBkaXNhYmxlX2VuYWJsZV9hZHZlcnRpc2VyX3Rlc3QpIHsKLSAgLy8gZGlzYWJsZSBhZHZlcnRpc2VyCi0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+RW5hYmxlQWR2ZXJ0aXNlcihhZHZlcnRpc2VyX2lkXywgZmFsc2UsIDB4MDAsIDB4MDApOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfRU5BQkxFKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uQWR2ZXJ0aXNpbmdFbmFibGVkKGFkdmVydGlzZXJfaWRfLCBmYWxzZSwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gZW5hYmxlIGFkdmVydGlzZXIKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVBZHZlcnRpc2VyKGFkdmVydGlzZXJfaWRfLCB0cnVlLCAweDAwLCAweDAwKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPbkFkdmVydGlzaW5nRW5hYmxlZChhZHZlcnRpc2VyX2lkXywgdHJ1ZSwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdBUElUZXN0LCBzZXRfcGVyaW9kaWNfcGFyYW1ldGVyKSB7Ci0gIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIGFkdmVydGlzaW5nX2NvbmZpZ3t9OwotICBhZHZlcnRpc2luZ19jb25maWcubWF4X2ludGVydmFsID0gMHgxMDAwOwotICBhZHZlcnRpc2luZ19jb25maWcubWluX2ludGVydmFsID0gMHgwMDA2OwotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldFBlcmlvZGljUGFyYW1ldGVycyhhZHZlcnRpc2VyX2lkXywgYWR2ZXJ0aXNpbmdfY29uZmlnKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1BBUkFNKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkKGFkdmVydGlzZXJfaWRfLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVFeHRlbmRlZEFkdmVydGlzaW5nQVBJVGVzdCwgc2V0X3BlcmlvZGljX2RhdGFfdGVzdCkgewotICAvLyBTZXQgYWR2ZXJ0aXNpbmcgZGF0YQotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBhZHZlcnRpc2luZ19kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVte307Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OlRYX1BPV0VSX0xFVkVMOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7MHgwMH07Ci0gIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyXy0+U2V0UGVyaW9kaWNEYXRhKGFkdmVydGlzZXJfaWRfLCBhZHZlcnRpc2luZ19kYXRhKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0RBVEEpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIG1vY2tfYWR2ZXJ0aXNpbmdfY2FsbGJhY2tfLAotICAgICAgT25QZXJpb2RpY0FkdmVydGlzaW5nRGF0YVNldChhZHZlcnRpc2VyX2lkXywgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVFeHRlbmRlZEFkdmVydGlzaW5nQVBJVGVzdCwgc2V0X3BlcmlvZGljX2RhdGFfZnJhZ21lbnRzX3Rlc3QpIHsKLSAgLy8gU2V0IGFkdmVydGlzaW5nIGRhdGEKLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gYWR2ZXJ0aXNpbmdfZGF0YXt9OwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICAgIGRhdGFfaXRlbS5kYXRhXy5wdXNoX2JhY2soMHhmYSk7Ci0gICAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6U0VSVklDRV9EQVRBXzEyOF9CSVRfVVVJRFM7Ci0gICAgdWludDhfdCB1dWlkWzE2XSA9IHsweGYwLCAweDM0LCAweDliLCAweDVmLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCBpfTsKLSAgICBzdGQ6OmNvcHlfbih1dWlkLCAxNiwgc3RkOjpiYWNrX2luc2VydGVyKGRhdGFfaXRlbS5kYXRhXykpOwotICAgIHVpbnQ4X3Qgc2VydmljZV9kYXRhWzIzMl07Ci0gICAgc3RkOjpjb3B5X24oc2VydmljZV9kYXRhLCAyMzIsIHN0ZDo6YmFja19pbnNlcnRlcihkYXRhX2l0ZW0uZGF0YV8pKTsKLSAgICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICB9Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXRQZXJpb2RpY0RhdGEoYWR2ZXJ0aXNlcl9pZF8sIGFkdmVydGlzaW5nX2RhdGEpOwotCi0gIC8vIEZpcnN0IGZyYWdtZW50Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfREFUQSk7Ci0KLSAgLy8gSW50ZXJtZWRpYXRlIGZyYWdtZW50Ci0gIHRlc3RfaGNpX2xheWVyXy0+U2V0Q29tbWFuZEZ1dHVyZSgpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfREFUQSk7Ci0KLSAgLy8gTGFzdCBmcmFnbWVudAotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0RBVEEpOwotCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPblBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhU2V0KGFkdmVydGlzZXJfaWRfLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9wZXJvZGljX2RhdGFfd2l0aF9pbnZhbGlkX2FkX3N0cnVjdHVyZSkgewotICAvLyBTZXQgYWR2ZXJ0aXNpbmcgZGF0YSB3aXRoIEFEIHN0cnVjdHVyZSB0aGF0IGxlbmd0aCBncmVhdGVyIHRoYW4gMjUxCi0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGFkdmVydGlzaW5nX2RhdGF7fTsKLSAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgZGF0YV9pdGVtLmRhdGFfLnB1c2hfYmFjaygweGZiKTsKLSAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6U0VSVklDRV9EQVRBXzEyOF9CSVRfVVVJRFM7Ci0gIHVpbnQ4X3QgdXVpZFsxNl0gPSB7MHhmMCwgMHgzNCwgMHg5YiwgMHg1ZiwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMH07Ci0gIHN0ZDo6Y29weV9uKHV1aWQsIDE2LCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YV9pdGVtLmRhdGFfKSk7Ci0gIHVpbnQ4X3Qgc2VydmljZV9kYXRhWzIzM107Ci0gIHN0ZDo6Y29weV9uKHNlcnZpY2VfZGF0YSwgMjMzLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YV9pdGVtLmRhdGFfKSk7Ci0gIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICBtb2NrX2FkdmVydGlzaW5nX2NhbGxiYWNrXywKLSAgICAgIE9uUGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFTZXQoYWR2ZXJ0aXNlcl9pZF8sIEFkdmVydGlzaW5nQ2FsbGJhY2s6OkFkdmVydGlzaW5nU3RhdHVzOjpJTlRFUk5BTF9FUlJPUikpOwotCi0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5TZXRQZXJpb2RpY0RhdGEoYWR2ZXJ0aXNlcl9pZF8sIGFkdmVydGlzaW5nX2RhdGEpOwotCi0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRBZHZlcnRpc2luZ0FQSVRlc3QsIHNldF9wZXJvZGljX2RhdGFfd2l0aF9pbnZhbGlkX2xlbmd0aCkgewotICAvLyBTZXQgYWR2ZXJ0aXNpbmcgZGF0YSB3aXRoIGRhdGEgdGhhdCBncmVhdGVyIHRoYW4gbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aF8KLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gYWR2ZXJ0aXNpbmdfZGF0YXt9OwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgICBkYXRhX2l0ZW0uZGF0YV8ucHVzaF9iYWNrKDB4ZmIpOwotICAgIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OlNFUlZJQ0VfREFUQV8xMjhfQklUX1VVSURTOwotICAgIHVpbnQ4X3QgdXVpZFsxNl0gPSB7MHhmMCwgMHgzNCwgMHg5YiwgMHg1ZiwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgaX07Ci0gICAgc3RkOjpjb3B5X24odXVpZCwgMTYsIHN0ZDo6YmFja19pbnNlcnRlcihkYXRhX2l0ZW0uZGF0YV8pKTsKLSAgICB1aW50OF90IHNlcnZpY2VfZGF0YVsyMDBdOwotICAgIHN0ZDo6Y29weV9uKHNlcnZpY2VfZGF0YSwgMjAwLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZGF0YV9pdGVtLmRhdGFfKSk7Ci0gICAgYWR2ZXJ0aXNpbmdfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgfQotCi0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPblBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhU2V0KGFkdmVydGlzZXJfaWRfLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6REFUQV9UT09fTEFSR0UpKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPlNldFBlcmlvZGljRGF0YShhZHZlcnRpc2VyX2lkXywgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0KLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVFeHRlbmRlZEFkdmVydGlzaW5nQVBJVGVzdCwgZGlzYWJsZV9lbmFibGVfcGVyaW9kaWNfYWR2ZXJ0aXNlcl90ZXN0KSB7Ci0gIC8vIGRpc2FibGUgYWR2ZXJ0aXNlcgotICB0ZXN0X2hjaV9sYXllcl8tPlNldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl8tPkVuYWJsZVBlcmlvZGljQWR2ZXJ0aXNpbmcoYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPblBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVkKGFkdmVydGlzZXJfaWRfLCBmYWxzZSwgQWR2ZXJ0aXNpbmdDYWxsYmFjazo6QWR2ZXJ0aXNpbmdTdGF0dXM6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KExlU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci0KLSAgLy8gZW5hYmxlIGFkdmVydGlzZXIKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX2FkdmVydGlzaW5nX21hbmFnZXJfLT5FbmFibGVQZXJpb2RpY0FkdmVydGlzaW5nKGFkdmVydGlzZXJfaWRfLCB0cnVlKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKE9wQ29kZTo6TEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgbW9ja19hZHZlcnRpc2luZ19jYWxsYmFja18sCi0gICAgICBPblBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVkKGFkdmVydGlzZXJfaWRfLCB0cnVlLCBBZHZlcnRpc2luZ0NhbGxiYWNrOjpBZHZlcnRpc2luZ1N0YXR1czo6U1VDQ0VTUykpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRQZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIHN5bmNfY2xpZW50X2hhbmRsZXIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfaXNvX2ludGVyZmFjZS5oIGIvZ2QvaGNpL2xlX2lzb19pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhOGEzMS4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfaXNvX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvY29tbWFuZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY29uc3RleHByIGhjaTo6U3ViZXZlbnRDb2RlIExlSXNvRXZlbnRzW10gPSB7Ci0gICAgaGNpOjpTdWJldmVudENvZGU6OkNJU19FU1RBQkxJU0hFRCwKLSAgICBoY2k6OlN1YmV2ZW50Q29kZTo6Q0lTX1JFUVVFU1QsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OkNSRUFURV9CSUdfQ09NUExFVEUsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OlRFUk1JTkFURV9CSUdfQ09NUExFVEUsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OkJJR19TWU5DX0VTVEFCTElTSEVELAotICAgIGhjaTo6U3ViZXZlbnRDb2RlOjpCSUdfU1lOQ19MT1NULAotICAgIGhjaTo6U3ViZXZlbnRDb2RlOjpCSUdfSU5GT19BRFZFUlRJU0lOR19SRVBPUlQsCi19OwotCi10eXBlZGVmIENvbW1hbmRJbnRlcmZhY2U8TGVJc29Db21tYW5kQnVpbGRlcj4gTGVJc29JbnRlcmZhY2U7Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfc2Nhbm5pbmdfaW50ZXJmYWNlLmggYi9nZC9oY2kvbGVfc2Nhbm5pbmdfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDFhYjEuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2xlX3NjYW5uaW5nX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvY29tbWFuZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY29uc3RleHByIGhjaTo6U3ViZXZlbnRDb2RlIExlU2Nhbm5pbmdFdmVudHNbXSA9IHsKLSAgICBoY2k6OlN1YmV2ZW50Q29kZTo6U0NBTl9USU1FT1VULAotICAgIGhjaTo6U3ViZXZlbnRDb2RlOjpBRFZFUlRJU0lOR19SRVBPUlQsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OkRJUkVDVEVEX0FEVkVSVElTSU5HX1JFUE9SVCwKLSAgICBoY2k6OlN1YmV2ZW50Q29kZTo6RVhURU5ERURfQURWRVJUSVNJTkdfUkVQT1JULAotICAgIGhjaTo6U3ViZXZlbnRDb2RlOjpQRVJJT0RJQ19BRFZFUlRJU0lOR19SRVBPUlQsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfRVNUQUJMSVNIRUQsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfTE9TVCwKLX07Ci0KLXR5cGVkZWYgQ29tbWFuZEludGVyZmFjZTxMZVNjYW5uaW5nQ29tbWFuZEJ1aWxkZXI+IExlU2Nhbm5pbmdJbnRlcmZhY2U7Ci19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlci5jYyBiL2dkL2hjaS9sZV9zY2FubmluZ19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDE3YTg1Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9sZV9zY2FubmluZ19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJoY2kvbGVfc2Nhbm5pbmdfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGNpL2xlX3NjYW5uaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvdmVuZG9yX3NwZWNpZmljX2V2ZW50X21hbmFnZXIuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVTY2FuV2luZG93TWluID0gMHgwMDA0OwotY29uc3RleHByIHVpbnQxNl90IGtMZVNjYW5XaW5kb3dNYXggPSAweDQwMDA7Ci1jb25zdGV4cHIgdWludDE2X3Qga0RlZmF1bHRMZUV4dGVuZGVkU2NhbldpbmRvdyA9IDQ4MDA7Ci1jb25zdGV4cHIgdWludDE2X3Qga0xlRXh0ZW5kZWRTY2FuV2luZG93TWF4ID0gMHhGRkZGOwotY29uc3RleHByIHVpbnQxNl90IGtMZVNjYW5JbnRlcnZhbE1pbiA9IDB4MDAwNDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVTY2FuSW50ZXJ2YWxNYXggPSAweDQwMDA7Ci1jb25zdGV4cHIgdWludDE2X3Qga0RlZmF1bHRMZUV4dGVuZGVkU2NhbkludGVydmFsID0gNDgwMDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVFeHRlbmRlZFNjYW5JbnRlcnZhbE1heCA9IDB4RkZGRjsKLQotY29uc3RleHByIHVpbnQ4X3Qga1NjYW5uYWJsZUJpdCA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBrRGlyZWN0ZWRCaXQgPSAyOwotY29uc3RleHByIHVpbnQ4X3Qga1NjYW5SZXNwb25zZUJpdCA9IDM7Ci1jb25zdGV4cHIgdWludDhfdCBrTGVnYWN5Qml0ID0gNDsKLWNvbnN0ZXhwciB1aW50OF90IGtEYXRhU3RhdHVzQml0cyA9IDU7Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgTGVTY2FubmluZ01hbmFnZXI6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IExlU2Nhbm5pbmdNYW5hZ2VyKCk7IH0pOwotCi1lbnVtIGNsYXNzIFNjYW5BcGlUeXBlIHsKLSAgTEVHQUNZID0gMSwKLSAgQU5EUk9JRF9IQ0kgPSAyLAotICBFWFRFTkRFRCA9IDMsCi19OwotCi1zdHJ1Y3QgU2Nhbm5lciB7Ci0gIFV1aWQgYXBwX3V1aWQ7Ci0gIGJvb2wgaW5fdXNlOwotfTsKLQotY2xhc3MgQWR2ZXJ0aXNpbmdDYWNoZSB7Ci0gcHVibGljOgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgU2V0KGNvbnN0IEFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBhdXRvIGl0ID0gRmluZChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgaWYgKGl0ICE9IGl0ZW1zLmVuZCgpKSB7Ci0gICAgICBpdC0+ZGF0YSA9IHN0ZDo6bW92ZShkYXRhKTsKLSAgICAgIHJldHVybiBpdC0+ZGF0YTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbXMuc2l6ZSgpID4gY2FjaGVfbWF4KSB7Ci0gICAgICBpdGVtcy5wb3BfYmFjaygpOwotICAgIH0KLQotICAgIGl0ZW1zLmVtcGxhY2VfZnJvbnQoYWRkcmVzc193aXRoX3R5cGUsIHN0ZDo6bW92ZShkYXRhKSk7Ci0gICAgcmV0dXJuIGl0ZW1zLmZyb250KCkuZGF0YTsKLSAgfQotCi0gIGJvb2wgRXhpc3QoY29uc3QgQWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzX3dpdGhfdHlwZSkgewotICAgIGF1dG8gaXQgPSBGaW5kKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgICBpZiAoaXQgPT0gaXRlbXMuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgQXBwZW5kKGNvbnN0IEFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBhdXRvIGl0ID0gRmluZChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgaWYgKGl0ICE9IGl0ZW1zLmVuZCgpKSB7Ci0gICAgICBpdC0+ZGF0YS5pbnNlcnQoaXQtPmRhdGEuZW5kKCksIGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7Ci0gICAgICByZXR1cm4gaXQtPmRhdGE7Ci0gICAgfQotCi0gICAgaWYgKGl0ZW1zLnNpemUoKSA+IGNhY2hlX21heCkgewotICAgICAgaXRlbXMucG9wX2JhY2soKTsKLSAgICB9Ci0KLSAgICBpdGVtcy5lbXBsYWNlX2Zyb250KGFkZHJlc3Nfd2l0aF90eXBlLCBzdGQ6Om1vdmUoZGF0YSkpOwotICAgIHJldHVybiBpdGVtcy5mcm9udCgpLmRhdGE7Ci0gIH0KLQotICAvKiBDbGVhciBkYXRhIGZvciBkZXZpY2UgfGFkZHJfdHlwZSwgYWRkcnwgKi8KLSAgdm9pZCBDbGVhcihBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBhdXRvIGl0ID0gRmluZChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgaWYgKGl0ICE9IGl0ZW1zLmVuZCgpKSB7Ci0gICAgICBpdGVtcy5lcmFzZShpdCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDbGVhckFsbCgpIHsKLSAgICBpdGVtcy5jbGVhcigpOwotICB9Ci0KLSAgc3RydWN0IEl0ZW0gewotICAgIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOwotCi0gICAgSXRlbShjb25zdCBBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3Nfd2l0aF90eXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKQotICAgICAgICA6IGFkZHJlc3Nfd2l0aF90eXBlKGFkZHJlc3Nfd2l0aF90eXBlKSwgZGF0YShkYXRhKSB7fQotICB9OwotCi0gIHN0ZDo6bGlzdDxJdGVtPjo6aXRlcmF0b3IgRmluZChjb25zdCBBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gaXRlbXMuYmVnaW4oKTsgaXQgIT0gaXRlbXMuZW5kKCk7IGl0KyspIHsKLSAgICAgIGlmIChpdC0+YWRkcmVzc193aXRoX3R5cGUgPT0gYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICAgICAgcmV0dXJuIGl0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaXRlbXMuZW5kKCk7Ci0gIH0KLQotICAvKiB3ZSBrZWVwIG1heGltdW0gNyBkZXZpY2VzIGluIHRoZSBjYWNoZSAqLwotICBjb25zdCBzaXplX3QgY2FjaGVfbWF4ID0gMTAwMDsKLSAgc3RkOjpsaXN0PEl0ZW0+IGl0ZW1zOwotfTsKLQotY2xhc3MgTnVsbFNjYW5uaW5nQ2FsbGJhY2sgOiBwdWJsaWMgU2Nhbm5pbmdDYWxsYmFjayB7Ci0gIHZvaWQgT25TY2FubmVyUmVnaXN0ZXJlZChjb25zdCBibHVldG9vdGg6OmhjaTo6VXVpZCBhcHBfdXVpZCwgU2Nhbm5lcklkIHNjYW5uZXJfaWQsIFNjYW5uaW5nU3RhdHVzIHN0YXR1cykgewotICAgIExPR19JTkZPKCJPblNjYW5uZXJSZWdpc3RlcmVkIGluIE51bGxTY2FubmluZ0NhbGxiYWNrIik7Ci0gIH0KLSAgdm9pZCBPblNldFNjYW5uZXJQYXJhbWV0ZXJDb21wbGV0ZShTY2FubmVySWQgc2Nhbm5lcl9pZCwgU2Nhbm5pbmdTdGF0dXMgc3RhdHVzKSB7Ci0gICAgTE9HX0lORk8oIk9uU2V0U2Nhbm5lclBhcmFtZXRlckNvbXBsZXRlIGluIE51bGxTY2FubmluZ0NhbGxiYWNrIik7Ci0gIH0KLSAgdm9pZCBPblNjYW5SZXN1bHQoCi0gICAgICB1aW50MTZfdCBldmVudF90eXBlLAotICAgICAgdWludDhfdCBhZGRyZXNzX3R5cGUsCi0gICAgICBBZGRyZXNzIGFkZHJlc3MsCi0gICAgICB1aW50OF90IHByaW1hcnlfcGh5LAotICAgICAgdWludDhfdCBzZWNvbmRhcnlfcGh5LAotICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsCi0gICAgICBpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICBpbnQ4X3QgcnNzaSwKLSAgICAgIHVpbnQxNl90IHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNpbmdfZGF0YSkgewotICAgIExPR19JTkZPKCJPblNjYW5SZXN1bHQgaW4gTnVsbFNjYW5uaW5nQ2FsbGJhY2siKTsKLSAgfQotICB2b2lkIE9uVHJhY2tBZHZGb3VuZExvc3QoQWR2ZXJ0aXNpbmdGaWx0ZXJPbkZvdW5kT25Mb3N0SW5mbyBvbl9mb3VuZF9vbl9sb3N0X2luZm8pIHsKLSAgICBMT0dfSU5GTygiT25UcmFja0FkdkZvdW5kTG9zdCBpbiBOdWxsU2Nhbm5pbmdDYWxsYmFjayIpOwotICB9Ci0gIHZvaWQgT25CYXRjaFNjYW5SZXBvcnRzKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsIGludCByZXBvcnRfZm9ybWF0LCBpbnQgbnVtX3JlY29yZHMsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBMT0dfSU5GTygiT25CYXRjaFNjYW5SZXBvcnRzIGluIE51bGxTY2FubmluZ0NhbGxiYWNrIik7Ci0gIH0KLSAgdm9pZCBPbkJhdGNoU2NhblRocmVzaG9sZENyb3NzZWQoaW50IGNsaWVudF9pZikgewotICAgIExPR19JTkZPKCJPbkJhdGNoU2NhblRocmVzaG9sZENyb3NzZWQgaW4gTnVsbFNjYW5uaW5nQ2FsbGJhY2siKTsKLSAgfQotICB2b2lkIE9uVGltZW91dCgpIHsKLSAgICBMT0dfSU5GTygiT25UaW1lb3V0IGluIE51bGxTY2FubmluZ0NhbGxiYWNrIik7Ci0gIH0KLSAgdm9pZCBPbkZpbHRlckVuYWJsZShFbmFibGUgZW5hYmxlLCB1aW50OF90IHN0YXR1cykgewotICAgIExPR19JTkZPKCJPbkZpbHRlckVuYWJsZSBpbiBOdWxsU2Nhbm5pbmdDYWxsYmFjayIpOwotICB9Ci0gIHZvaWQgT25GaWx0ZXJQYXJhbVNldHVwKHVpbnQ4X3QgYXZhaWxhYmxlX3NwYWNlcywgQXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgTE9HX0lORk8oIk9uRmlsdGVyUGFyYW1TZXR1cCBpbiBOdWxsU2Nhbm5pbmdDYWxsYmFjayIpOwotICB9Ci0gIHZvaWQgT25GaWx0ZXJDb25maWdDYWxsYmFjaygKLSAgICAgIEFwY2ZGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCB1aW50OF90IGF2YWlsYWJsZV9zcGFjZXMsIEFwY2ZBY3Rpb24gYWN0aW9uLCB1aW50OF90IHN0YXR1cykgewotICAgIExPR19JTkZPKCJPbkZpbHRlckNvbmZpZ0NhbGxiYWNrIGluIE51bGxTY2FubmluZ0NhbGxiYWNrIik7Ci0gIH0KLX07Ci0KLWVudW0gY2xhc3MgQmF0Y2hTY2FuU3RhdGUgewotICBFUlJPUl9TVEFURSA9IDAsCi0gIEVOQUJMRV9DQUxMRUQgPSAxLAotICBFTkFCTEVEX1NUQVRFID0gMiwKLSAgRElTQUJMRV9DQUxMRUQgPSAzLAotICBESVNBQkxFRF9TVEFURSA9IDQsCi19OwotCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFX0RJU0FCTEUgMAotI2RlZmluZSBCVE1fQkxFX0JBVENIX1NDQU5fTU9ERV9QQVNTIDEKLSNkZWZpbmUgQlRNX0JMRV9CQVRDSF9TQ0FOX01PREVfQUNUSSAyCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFX1BBU1NfQUNUSSAzCi0KLXN0cnVjdCBCYXRjaFNjYW5Db25maWcgewotICBCYXRjaFNjYW5TdGF0ZSBjdXJyZW50X3N0YXRlOwotICBCYXRjaFNjYW5Nb2RlIHNjYW5fbW9kZTsKLSAgdWludDMyX3Qgc2Nhbl9pbnRlcnZhbDsKLSAgdWludDMyX3Qgc2Nhbl93aW5kb3c7Ci0gIEJhdGNoU2NhbkRpc2NhcmRSdWxlIGRpc2NhcmRfcnVsZTsKLSAgU2Nhbm5lcklkIHJlZl92YWx1ZTsKLX07Ci0KLXN0cnVjdCBMZVNjYW5uaW5nTWFuYWdlcjo6aW1wbCA6IHB1YmxpYyBibHVldG9vdGg6OmhjaTo6TGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrIHsKLSAgaW1wbChNb2R1bGUqIG1vZHVsZSkgOiBtb2R1bGVfKG1vZHVsZSksIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8obnVsbHB0cikge30KLQotICB+aW1wbCgpIHsKLSAgICBpZiAoYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWRfKSB7Ci0gICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5VbnJlZ2lzdGVyKHRoaXMpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc3RhcnQoCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllciwKLSAgICAgIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXIsCi0gICAgICBoY2k6OlZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyKiB2ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlcikgewotICAgIG1vZHVsZV9oYW5kbGVyXyA9IGhhbmRsZXI7Ci0gICAgaGNpX2xheWVyXyA9IGhjaV9sYXllcjsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgdmVuZG9yX3NwZWNpZmljX2V2ZW50X21hbmFnZXJfID0gdmVuZG9yX3NwZWNpZmljX2V2ZW50X21hbmFnZXI7Ci0gICAgbGVfYWRkcmVzc19tYW5hZ2VyXyA9IGFjbF9tYW5hZ2VyLT5HZXRMZUFkZHJlc3NNYW5hZ2VyKCk7Ci0gICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXyA9IGhjaV9sYXllcl8tPkdldExlU2Nhbm5pbmdJbnRlcmZhY2UoCi0gICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uKHRoaXMsICZMZVNjYW5uaW5nTWFuYWdlcjo6aW1wbDo6aGFuZGxlX3NjYW5fcmVzdWx0cykpOwotICAgIGlmIChjb250cm9sbGVyXy0+SXNTdXBwb3J0ZWQoT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfU0NBTl9QQVJBTUVURVJTKSkgewotICAgICAgYXBpX3R5cGVfID0gU2NhbkFwaVR5cGU6OkVYVEVOREVEOwotICAgICAgaW50ZXJ2YWxfbXNfID0ga0RlZmF1bHRMZUV4dGVuZGVkU2NhbkludGVydmFsOwotICAgICAgd2luZG93X21zXyA9IGtEZWZhdWx0TGVFeHRlbmRlZFNjYW5XaW5kb3c7Ci0gICAgfSBlbHNlIGlmIChjb250cm9sbGVyXy0+SXNTdXBwb3J0ZWQoT3BDb2RlOjpMRV9FWFRFTkRFRF9TQ0FOX1BBUkFNUykpIHsKLSAgICAgIGFwaV90eXBlXyA9IFNjYW5BcGlUeXBlOjpBTkRST0lEX0hDSTsKLSAgICB9IGVsc2UgewotICAgICAgYXBpX3R5cGVfID0gU2NhbkFwaVR5cGU6OkxFR0FDWTsKLSAgICB9Ci0gICAgaXNfZmlsdGVyX3N1cHBvcnRfID0gY29udHJvbGxlcl8tPklzU3VwcG9ydGVkKE9wQ29kZTo6TEVfQURWX0ZJTFRFUik7Ci0gICAgaXNfYmF0Y2hfc2Nhbl9zdXBwb3J0XyA9IGNvbnRyb2xsZXItPklzU3VwcG9ydGVkKE9wQ29kZTo6TEVfQkFUQ0hfU0NBTik7Ci0gICAgaWYgKGlzX2JhdGNoX3NjYW5fc3VwcG9ydF8pIHsKLSAgICAgIHZlbmRvcl9zcGVjaWZpY19ldmVudF9tYW5hZ2VyXy0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICAgICAgVnNlU3ViZXZlbnRDb2RlOjpCTEVfVEhSRVNIT0xELCBoYW5kbGVyLT5CaW5kT24odGhpcywgJkxlU2Nhbm5pbmdNYW5hZ2VyOjppbXBsOjpvbl9zdG9yYWdlX3RocmVzaG9sZF9icmVhY2gpKTsKLSAgICAgIHZlbmRvcl9zcGVjaWZpY19ldmVudF9tYW5hZ2VyXy0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICAgICAgVnNlU3ViZXZlbnRDb2RlOjpCTEVfVFJBQ0tJTkcsIGhhbmRsZXItPkJpbmRPbih0aGlzLCAmTGVTY2FubmluZ01hbmFnZXI6OmltcGw6Om9uX2FkdmVydGlzZW1lbnRfdHJhY2tpbmcpKTsKLSAgICB9Ci0gICAgc2Nhbm5lcnNfID0gc3RkOjp2ZWN0b3I8U2Nhbm5lcj4oa01heEFwcE51bSArIDEpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Nhbm5lcnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICBzY2FubmVyc19baV0uYXBwX3V1aWQgPSBVdWlkOjprRW1wdHk7Ci0gICAgICBzY2FubmVyc19baV0uaW5fdXNlID0gZmFsc2U7Ci0gICAgfQotICAgIGJhdGNoX3NjYW5fY29uZmlnXy5jdXJyZW50X3N0YXRlID0gQmF0Y2hTY2FuU3RhdGU6OkRJU0FCTEVEX1NUQVRFOwotICAgIGJhdGNoX3NjYW5fY29uZmlnXy5yZWZfdmFsdWUgPSBrSW52YWxpZFNjYW5uZXJJZDsKLSAgICBjb25maWd1cmVfc2NhbigpOwotICB9Ci0KLSAgdm9pZCBzdG9wKCkgewotICAgIGZvciAoYXV0byBzdWJldmVudF9jb2RlIDogTGVTY2FubmluZ0V2ZW50cykgewotICAgICAgaGNpX2xheWVyXy0+VW5yZWdpc3RlckxlRXZlbnRIYW5kbGVyKHN1YmV2ZW50X2NvZGUpOwotICAgIH0KLSAgICBpZiAoaXNfYmF0Y2hfc2Nhbl9zdXBwb3J0XykgewotICAgICAgLy8gVE9ETyBpbXBsZXRlIHZzZSBtb2R1bGUKLSAgICAgIC8vIGhjaV9sYXllcl8tPlVucmVnaXN0ZXJWZXNFdmVudEhhbmRsZXIoVnNlU3ViZXZlbnRDb2RlOjpCTEVfVEhSRVNIT0xEKTsKLSAgICAgIC8vIGhjaV9sYXllcl8tPlVucmVnaXN0ZXJWZXNFdmVudEhhbmRsZXIoVnNlU3ViZXZlbnRDb2RlOjpCTEVfVFJBQ0tJTkcpOwotICAgIH0KLSAgICBiYXRjaF9zY2FuX2NvbmZpZ18uY3VycmVudF9zdGF0ZSA9IEJhdGNoU2NhblN0YXRlOjpESVNBQkxFRF9TVEFURTsKLSAgICBiYXRjaF9zY2FuX2NvbmZpZ18ucmVmX3ZhbHVlID0ga0ludmFsaWRTY2FubmVySWQ7Ci0gICAgc2Nhbm5pbmdfY2FsbGJhY2tzXyA9ICZudWxsX3NjYW5uaW5nX2NhbGxiYWNrXzsKLSAgfQotCi0gIHZvaWQgaGFuZGxlX3NjYW5fcmVzdWx0cyhMZU1ldGFFdmVudFZpZXcgZXZlbnQpIHsKLSAgICBzd2l0Y2ggKGV2ZW50LkdldFN1YmV2ZW50Q29kZSgpKSB7Ci0gICAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpBRFZFUlRJU0lOR19SRVBPUlQ6Ci0gICAgICAgIGhhbmRsZV9hZHZlcnRpc2luZ19yZXBvcnQoTGVBZHZlcnRpc2luZ1JlcG9ydFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpTdWJldmVudENvZGU6OkRJUkVDVEVEX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICAgICAgaGFuZGxlX2RpcmVjdGVkX2FkdmVydGlzaW5nX3JlcG9ydChMZURpcmVjdGVkQWR2ZXJ0aXNpbmdSZXBvcnRWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6U3ViZXZlbnRDb2RlOjpFWFRFTkRFRF9BRFZFUlRJU0lOR19SRVBPUlQ6Ci0gICAgICAgIGhhbmRsZV9leHRlbmRlZF9hZHZlcnRpc2luZ19yZXBvcnQoTGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0Vmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OlN1YmV2ZW50Q29kZTo6U0NBTl9USU1FT1VUOgotICAgICAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PblRpbWVvdXQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGFkdmVydGlzaW5nIHN1YmV2ZW50ICVzIiwgaGNpOjpTdWJldmVudENvZGVUZXh0KGV2ZW50LkdldFN1YmV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICBzdHJ1Y3QgRXh0ZW5kZWRFdmVudFR5cGVPcHRpb25zIHsKLSAgICBib29sIGNvbm5lY3RhYmxle2ZhbHNlfTsKLSAgICBib29sIHNjYW5uYWJsZXtmYWxzZX07Ci0gICAgYm9vbCBkaXJlY3RlZHtmYWxzZX07Ci0gICAgYm9vbCBzY2FuX3Jlc3BvbnNle2ZhbHNlfTsKLSAgICBib29sIGxlZ2FjeXtmYWxzZX07Ci0gICAgYm9vbCBjb250aW51aW5ne2ZhbHNlfTsKLSAgICBib29sIHRydW5jYXRlZHtmYWxzZX07Ci0gIH07Ci0KLSAgdm9pZCB0cmFuc2Zvcm1fdG9fZXh0ZW5kZWRfZXZlbnRfdHlwZSh1aW50MTZfdCogZXh0ZW5kZWRfZXZlbnRfdHlwZSwgRXh0ZW5kZWRFdmVudFR5cGVPcHRpb25zIG8pIHsKLSAgICBBU1NFUlQoZXh0ZW5kZWRfZXZlbnRfdHlwZSAhPSBudWxscHRyKTsKLSAgICAqZXh0ZW5kZWRfZXZlbnRfdHlwZSA9IChvLmNvbm5lY3RhYmxlID8gMHgwMDAxIDw8IDAgOiAwKSB8IChvLnNjYW5uYWJsZSA/IDB4MDAwMSA8PCAxIDogMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG8uZGlyZWN0ZWQgPyAweDAwMDEgPDwgMiA6IDApIHwgKG8uc2Nhbl9yZXNwb25zZSA/IDB4MDAwMSA8PCAzIDogMCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG8ubGVnYWN5ID8gMHgwMDAxIDw8IDQgOiAwKSB8IChvLmNvbnRpbnVpbmcgPyAweDAwMDEgPDwgNSA6IDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLnRydW5jYXRlZCA/IDB4MDAwMSA8PCA2IDogMCk7Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9hZHZlcnRpc2luZ19yZXBvcnQoTGVBZHZlcnRpc2luZ1JlcG9ydFZpZXcgZXZlbnRfdmlldykgewotICAgIGlmICghZXZlbnRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19JTkZPKCJEcm9wcGluZyBpbnZhbGlkIGFkdmVydGlzaW5nIGV2ZW50Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPExlQWR2ZXJ0aXNpbmdSZXBvcnQ+IHJlcG9ydHMgPSBldmVudF92aWV3LkdldEFkdmVydGlzaW5nUmVwb3J0cygpOwotICAgIGlmIChyZXBvcnRzLmVtcHR5KCkpIHsKLSAgICAgIExPR19JTkZPKCJaZXJvIHJlc3VsdHMgaW4gYWR2ZXJ0aXNpbmcgZXZlbnQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKExlQWR2ZXJ0aXNpbmdSZXBvcnQgcmVwb3J0IDogcmVwb3J0cykgewotICAgICAgdWludDE2X3QgZXh0ZW5kZWRfZXZlbnRfdHlwZSA9IDA7Ci0gICAgICBzd2l0Y2ggKHJlcG9ydC5ldmVudF90eXBlXykgewotICAgICAgICBjYXNlIGhjaTo6QWR2ZXJ0aXNpbmdFdmVudFR5cGU6OkFEVl9JTkQ6Ci0gICAgICAgICAgdHJhbnNmb3JtX3RvX2V4dGVuZGVkX2V2ZW50X3R5cGUoCi0gICAgICAgICAgICAgICZleHRlbmRlZF9ldmVudF90eXBlLCB7LmNvbm5lY3RhYmxlID0gdHJ1ZSwgLnNjYW5uYWJsZSA9IHRydWUsIC5sZWdhY3kgPSB0cnVlfSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGNpOjpBZHZlcnRpc2luZ0V2ZW50VHlwZTo6QURWX0RJUkVDVF9JTkQ6Ci0gICAgICAgICAgdHJhbnNmb3JtX3RvX2V4dGVuZGVkX2V2ZW50X3R5cGUoCi0gICAgICAgICAgICAgICZleHRlbmRlZF9ldmVudF90eXBlLCB7LmNvbm5lY3RhYmxlID0gdHJ1ZSwgLmRpcmVjdGVkID0gdHJ1ZSwgLmxlZ2FjeSA9IHRydWV9KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBoY2k6OkFkdmVydGlzaW5nRXZlbnRUeXBlOjpBRFZfU0NBTl9JTkQ6Ci0gICAgICAgICAgdHJhbnNmb3JtX3RvX2V4dGVuZGVkX2V2ZW50X3R5cGUoJmV4dGVuZGVkX2V2ZW50X3R5cGUsIHsuc2Nhbm5hYmxlID0gdHJ1ZSwgLmxlZ2FjeSA9IHRydWV9KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBoY2k6OkFkdmVydGlzaW5nRXZlbnRUeXBlOjpBRFZfTk9OQ09OTl9JTkQ6Ci0gICAgICAgICAgdHJhbnNmb3JtX3RvX2V4dGVuZGVkX2V2ZW50X3R5cGUoJmV4dGVuZGVkX2V2ZW50X3R5cGUsIHsubGVnYWN5ID0gdHJ1ZX0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhjaTo6QWR2ZXJ0aXNpbmdFdmVudFR5cGU6OlNDQU5fUkVTUE9OU0U6Ci0gICAgICAgICAgdHJhbnNmb3JtX3RvX2V4dGVuZGVkX2V2ZW50X3R5cGUoCi0gICAgICAgICAgICAgICZleHRlbmRlZF9ldmVudF90eXBlLCB7LmNvbm5lY3RhYmxlID0gdHJ1ZSwgLnNjYW5uYWJsZSA9IHRydWUsIC5zY2FuX3Jlc3BvbnNlID0gdHJ1ZSwgLmxlZ2FjeSA9IHRydWV9KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiVW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTolZCIsICh1aW50MTZfdClyZXBvcnQuZXZlbnRfdHlwZV8pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNpbmdfZGF0YSA9IHt9OwotICAgICAgZm9yIChhdXRvIGdhcF9kYXRhIDogcmVwb3J0LmFkdmVydGlzaW5nX2RhdGFfKSB7Ci0gICAgICAgIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKCh1aW50OF90KWdhcF9kYXRhLnNpemUoKSAtIDEpOwotICAgICAgICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjaygodWludDhfdClnYXBfZGF0YS5kYXRhX3R5cGVfKTsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YS5pbnNlcnQoYWR2ZXJ0aXNpbmdfZGF0YS5lbmQoKSwgZ2FwX2RhdGEuZGF0YV8uYmVnaW4oKSwgZ2FwX2RhdGEuZGF0YV8uZW5kKCkpOwotICAgICAgfQotCi0gICAgICBwcm9jZXNzX2FkdmVydGlzaW5nX3BhY2thZ2VfY29udGVudCgKLSAgICAgICAgICBleHRlbmRlZF9ldmVudF90eXBlLAotICAgICAgICAgICh1aW50OF90KXJlcG9ydC5hZGRyZXNzX3R5cGVfLAotICAgICAgICAgIHJlcG9ydC5hZGRyZXNzXywKLSAgICAgICAgICAodWludDhfdClQcmltYXJ5UGh5VHlwZTo6TEVfMU0sCi0gICAgICAgICAgKHVpbnQ4X3QpU2Vjb25kYXJ5UGh5VHlwZTo6Tk9fUEFDS0VUUywKLSAgICAgICAgICBrQWR2ZXJ0aXNpbmdEYXRhSW5mb05vdFByZXNlbnQsCi0gICAgICAgICAga1R4UG93ZXJJbmZvcm1hdGlvbk5vdFByZXNlbnQsCi0gICAgICAgICAgcmVwb3J0LnJzc2lfLAotICAgICAgICAgIGtOb3RQZXJpb2RpY0FkdmVydGlzZW1lbnQsCi0gICAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBoYW5kbGVfZGlyZWN0ZWRfYWR2ZXJ0aXNpbmdfcmVwb3J0KExlRGlyZWN0ZWRBZHZlcnRpc2luZ1JlcG9ydFZpZXcgZXZlbnRfdmlldykgewotICAgIGlmICghZXZlbnRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19JTkZPKCJEcm9wcGluZyBpbnZhbGlkIGFkdmVydGlzaW5nIGV2ZW50Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPExlRGlyZWN0ZWRBZHZlcnRpc2luZ1JlcG9ydD4gcmVwb3J0cyA9IGV2ZW50X3ZpZXcuR2V0QWR2ZXJ0aXNpbmdSZXBvcnRzKCk7Ci0gICAgaWYgKHJlcG9ydHMuZW1wdHkoKSkgewotICAgICAgTE9HX0lORk8oIlplcm8gcmVzdWx0cyBpbiBhZHZlcnRpc2luZyBldmVudCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MTZfdCBleHRlbmRlZF9ldmVudF90eXBlID0gMDsKLSAgICB0cmFuc2Zvcm1fdG9fZXh0ZW5kZWRfZXZlbnRfdHlwZSgmZXh0ZW5kZWRfZXZlbnRfdHlwZSwgey5jb25uZWN0YWJsZSA9IHRydWUsIC5kaXJlY3RlZCA9IHRydWUsIC5sZWdhY3kgPSB0cnVlfSk7Ci0gICAgLy8gVE9ETzogcGFyc2UgcmVwb3J0Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9leHRlbmRlZF9hZHZlcnRpc2luZ19yZXBvcnQoTGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0VmlldyBldmVudF92aWV3KSB7Ci0gICAgaWYgKCFldmVudF92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0lORk8oIkRyb3BwaW5nIGludmFsaWQgYWR2ZXJ0aXNpbmcgZXZlbnQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8TGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0PiByZXBvcnRzID0gZXZlbnRfdmlldy5HZXRBZHZlcnRpc2luZ1JlcG9ydHMoKTsKLSAgICBpZiAocmVwb3J0cy5lbXB0eSgpKSB7Ci0gICAgICBMT0dfSU5GTygiWmVybyByZXN1bHRzIGluIGFkdmVydGlzaW5nIGV2ZW50Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdSZXBvcnQgcmVwb3J0IDogcmVwb3J0cykgewotICAgICAgdWludDE2X3QgZXZlbnRfdHlwZSA9IHJlcG9ydC5jb25uZWN0YWJsZV8gfCAocmVwb3J0LnNjYW5uYWJsZV8gPDwga1NjYW5uYWJsZUJpdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnQuZGlyZWN0ZWRfIDw8IGtEaXJlY3RlZEJpdCkgfCAocmVwb3J0LnNjYW5fcmVzcG9uc2VfIDw8IGtTY2FuUmVzcG9uc2VCaXQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0LmxlZ2FjeV8gPDwga0xlZ2FjeUJpdCkgfCAoKHVpbnQxNl90KXJlcG9ydC5kYXRhX3N0YXR1c18gPDwga0RhdGFTdGF0dXNCaXRzKTsKLSAgICAgIHByb2Nlc3NfYWR2ZXJ0aXNpbmdfcGFja2FnZV9jb250ZW50KAotICAgICAgICAgIGV2ZW50X3R5cGUsCi0gICAgICAgICAgKHVpbnQ4X3QpcmVwb3J0LmFkZHJlc3NfdHlwZV8sCi0gICAgICAgICAgcmVwb3J0LmFkZHJlc3NfLAotICAgICAgICAgICh1aW50OF90KXJlcG9ydC5wcmltYXJ5X3BoeV8sCi0gICAgICAgICAgKHVpbnQ4X3QpcmVwb3J0LnNlY29uZGFyeV9waHlfLAotICAgICAgICAgIHJlcG9ydC5hZHZlcnRpc2luZ19zaWRfLAotICAgICAgICAgIHJlcG9ydC50eF9wb3dlcl8sCi0gICAgICAgICAgcmVwb3J0LnJzc2lfLAotICAgICAgICAgIHJlcG9ydC5wZXJpb2RpY19hZHZlcnRpc2luZ19pbnRlcnZhbF8sCi0gICAgICAgICAgcmVwb3J0LmFkdmVydGlzaW5nX2RhdGFfKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHByb2Nlc3NfYWR2ZXJ0aXNpbmdfcGFja2FnZV9jb250ZW50KAotICAgICAgdWludDE2X3QgZXZlbnRfdHlwZSwKLSAgICAgIHVpbnQ4X3QgYWRkcmVzc190eXBlLAotICAgICAgQWRkcmVzcyBhZGRyZXNzLAotICAgICAgdWludDhfdCBwcmltYXJ5X3BoeSwKLSAgICAgIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwKLSAgICAgIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLAotICAgICAgaW50OF90IHR4X3Bvd2VyLAotICAgICAgaW50OF90IHJzc2ksCi0gICAgICB1aW50MTZfdCBwZXJpb2RpY19hZHZlcnRpc2luZ19pbnRlcnZhbCwKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEpIHsKLSAgICBib29sIGlzX3NjYW5uYWJsZSA9IGV2ZW50X3R5cGUgJiAoMSA8PCBrU2Nhbm5hYmxlQml0KTsKLSAgICBib29sIGlzX3NjYW5fcmVzcG9uc2UgPSBldmVudF90eXBlICYgKDEgPDwga1NjYW5SZXNwb25zZUJpdCk7Ci0gICAgYm9vbCBpc19sZWdhY3kgPSBldmVudF90eXBlICYgKDEgPDwga0xlZ2FjeUJpdCk7Ci0KLSAgICBpZiAoYWRkcmVzc190eXBlID09ICh1aW50OF90KURpcmVjdEFkdmVydGlzaW5nQWRkcmVzc1R5cGU6Ok5PX0FERFJFU1MpIHsKLSAgICAgIHNjYW5uaW5nX2NhbGxiYWNrc18tPk9uU2NhblJlc3VsdCgKLSAgICAgICAgICBldmVudF90eXBlLAotICAgICAgICAgIGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgIHByaW1hcnlfcGh5LAotICAgICAgICAgIHNlY29uZGFyeV9waHksCi0gICAgICAgICAgYWR2ZXJ0aXNpbmdfc2lkLAotICAgICAgICAgIHR4X3Bvd2VyLAotICAgICAgICAgIHJzc2ksCi0gICAgICAgICAgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfaW50ZXJ2YWwsCi0gICAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChhZGRyZXNzID09IEFkZHJlc3M6OmtFbXB0eSkgewotICAgICAgTE9HX1dBUk4oIlJlY2VpdmUgbm9uLWFub255bW91cyBhZHZlcnRpc2luZyByZXBvcnQgd2l0aCBlbXB0eSBhZGRyZXNzLCBza2lwISIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZShhZGRyZXNzLCAoQWRkcmVzc1R5cGUpYWRkcmVzc190eXBlKTsKLQotICAgIGlmIChpc19sZWdhY3kgJiYgaXNfc2Nhbl9yZXNwb25zZSAmJiAhYWR2ZXJ0aXNpbmdfY2FjaGVfLkV4aXN0KGFkZHJlc3Nfd2l0aF90eXBlKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgaXNfc3RhcnQgPSBpc19sZWdhY3kgJiYgaXNfc2Nhbm5hYmxlICYmICFpc19zY2FuX3Jlc3BvbnNlOwotCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29uc3QmIGFkdl9kYXRhID0gaXNfc3RhcnQgPyBhZHZlcnRpc2luZ19jYWNoZV8uU2V0KGFkZHJlc3Nfd2l0aF90eXBlLCBhZHZlcnRpc2luZ19kYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWR2ZXJ0aXNpbmdfY2FjaGVfLkFwcGVuZChhZGRyZXNzX3dpdGhfdHlwZSwgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0KLSAgICB1aW50OF90IGRhdGFfc3RhdHVzID0gZXZlbnRfdHlwZSA+PiBrRGF0YVN0YXR1c0JpdHM7Ci0gICAgaWYgKGRhdGFfc3RhdHVzID09ICh1aW50OF90KURhdGFTdGF0dXM6OkNPTlRJTlVJTkcpIHsKLSAgICAgIC8vIFdhaXRpbmcgZm9yIHdob2xlIGRhdGEKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoaXNfc2Nhbm5hYmxlICYmICFpc19zY2FuX3Jlc3BvbnNlKSB7Ci0gICAgICAvLyBXYWl0aW5nIGZvciBzY2FuIHJlc3BvbnNlCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25TY2FuUmVzdWx0KAotICAgICAgICBldmVudF90eXBlLAotICAgICAgICBhZGRyZXNzX3R5cGUsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW1hcnlfcGh5LAotICAgICAgICBzZWNvbmRhcnlfcGh5LAotICAgICAgICBhZHZlcnRpc2luZ19zaWQsCi0gICAgICAgIHR4X3Bvd2VyLAotICAgICAgICByc3NpLAotICAgICAgICBwZXJpb2RpY19hZHZlcnRpc2luZ19pbnRlcnZhbCwKLSAgICAgICAgYWR2X2RhdGEpOwotCi0gICAgYWR2ZXJ0aXNpbmdfY2FjaGVfLkNsZWFyKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgfQotCi0gIHZvaWQgY29uZmlndXJlX3NjYW4oKSB7Ci0gICAgc3RkOjp2ZWN0b3I8UGh5U2NhblBhcmFtZXRlcnM+IHBhcmFtZXRlcl92ZWN0b3I7Ci0gICAgUGh5U2NhblBhcmFtZXRlcnMgcGh5X3NjYW5fcGFyYW1ldGVyczsKLSAgICBwaHlfc2Nhbl9wYXJhbWV0ZXJzLmxlX3NjYW5fd2luZG93XyA9IHdpbmRvd19tc187Ci0gICAgcGh5X3NjYW5fcGFyYW1ldGVycy5sZV9zY2FuX2ludGVydmFsXyA9IGludGVydmFsX21zXzsKLSAgICBwaHlfc2Nhbl9wYXJhbWV0ZXJzLmxlX3NjYW5fdHlwZV8gPSBsZV9zY2FuX3R5cGVfOwotICAgIHBhcmFtZXRlcl92ZWN0b3IucHVzaF9iYWNrKHBoeV9zY2FuX3BhcmFtZXRlcnMpOwotICAgIHVpbnQ4X3QgcGh5c19pbl91c2UgPSAxOwotCi0gICAgLy8gVGhlIEhvc3Qgc2hhbGwgbm90IGlzc3VlIHNldCBzY2FuIHBhcmFtZXRlciBjb21tYW5kIHdoZW4gc2Nhbm5pbmcgaXMgZW5hYmxlZAotICAgIHN0b3Bfc2NhbigpOwotCi0gICAgaWYgKGxlX2FkZHJlc3NfbWFuYWdlcl8tPkdldEFkZHJlc3NQb2xpY3koKSAhPSBMZUFkZHJlc3NNYW5hZ2VyOjpVU0VfUFVCTElDX0FERFJFU1MpIHsKLSAgICAgIG93bl9hZGRyZXNzX3R5cGVfID0gT3duQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUzsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFwaV90eXBlXykgewotICAgICAgY2FzZSBTY2FuQXBpVHlwZTo6RVhURU5ERUQ6Ci0gICAgICAgIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZV8sIGZpbHRlcl9wb2xpY3lfLCBwaHlzX2luX3VzZSwgcGFyYW1ldGVyX3ZlY3RvciksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX3NldF9zY2FuX3BhcmFtZXRlcl9jb21wbGV0ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU2NhbkFwaVR5cGU6OkFORFJPSURfSENJOgotICAgICAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVFeHRlbmRlZFNjYW5QYXJhbXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgbGVfc2Nhbl90eXBlXywgaW50ZXJ2YWxfbXNfLCB3aW5kb3dfbXNfLCBvd25fYWRkcmVzc190eXBlXywgZmlsdGVyX3BvbGljeV8pLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9zZXRfc2Nhbl9wYXJhbWV0ZXJfY29tcGxldGUpKTsKLQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU2NhbkFwaVR5cGU6OkxFR0FDWToKLSAgICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0U2NhblBhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgbGVfc2Nhbl90eXBlXywgaW50ZXJ2YWxfbXNfLCB3aW5kb3dfbXNfLCBvd25fYWRkcmVzc190eXBlXywgZmlsdGVyX3BvbGljeV8pLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9zZXRfc2Nhbl9wYXJhbWV0ZXJfY29tcGxldGUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZWdpc3Rlcl9zY2FubmVyKGNvbnN0IFV1aWQgYXBwX3V1aWQpIHsKLSAgICBmb3IgKHVpbnQ4X3QgaSA9IDE7IGkgPD0ga01heEFwcE51bTsgaSsrKSB7Ci0gICAgICBpZiAoc2Nhbm5lcnNfW2ldLmluX3VzZSAmJiBzY2FubmVyc19baV0uYXBwX3V1aWQgPT0gYXBwX3V1aWQpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJBcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQgJXMiLCBhcHBfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PblNjYW5uZXJSZWdpc3RlcmVkKGFwcF91dWlkLCAweDAwLCBTY2FubmluZ0NhbGxiYWNrOjpTY2FubmluZ1N0YXR1czo6SU5URVJOQUxfRVJST1IpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gdmFsaWQgdmFsdWUgb2Ygc2Nhbm5lciBpZCA6IDEgfiBrTWF4QXBwTnVtCi0gICAgZm9yICh1aW50OF90IGkgPSAxOyBpIDw9IGtNYXhBcHBOdW07IGkrKykgewotICAgICAgaWYgKCFzY2FubmVyc19baV0uaW5fdXNlKSB7Ci0gICAgICAgIHNjYW5uZXJzX1tpXS5hcHBfdXVpZCA9IGFwcF91dWlkOwotICAgICAgICBzY2FubmVyc19baV0uaW5fdXNlID0gdHJ1ZTsKLSAgICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25TY2FubmVyUmVnaXN0ZXJlZChhcHBfdXVpZCwgaSwgU2Nhbm5pbmdDYWxsYmFjazo6U2Nhbm5pbmdTdGF0dXM6OlNVQ0NFU1MpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gcmVnaXN0ZXIgc2Nhbm5lciwgbWF4IGNsaWVudCByZWFjaGVkOiVkIiwga01heEFwcE51bSk7Ci0gICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25TY2FubmVyUmVnaXN0ZXJlZChhcHBfdXVpZCwgMHgwMCwgU2Nhbm5pbmdDYWxsYmFjazo6U2Nhbm5pbmdTdGF0dXM6Ok5PX1JFU09VUkNFUyk7Ci0gIH0KLQotICB2b2lkIHVucmVnaXN0ZXJfc2Nhbm5lcihTY2FubmVySWQgc2Nhbm5lcl9pZCkgewotICAgIGlmIChzY2FubmVyX2lkIDw9IDAgfHwgc2Nhbm5lcl9pZCA+IGtNYXhBcHBOdW0pIHsKLSAgICAgIExPR19XQVJOKCJJbnZhbGlkIHNjYW5uZXIgaWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc2Nhbm5lcnNfW3NjYW5uZXJfaWRdLmluX3VzZSkgewotICAgICAgc2Nhbm5lcnNfW3NjYW5uZXJfaWRdLmluX3VzZSA9IGZhbHNlOwotICAgICAgc2Nhbm5lcnNfW3NjYW5uZXJfaWRdLmFwcF91dWlkID0gVXVpZDo6a0VtcHR5OwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfV0FSTigiVW5yZWdpc3RlciBzY2FubmVyIHdpdGggdW51c2VkIHNjYW5uZXIgaWQiKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNjYW4oYm9vbCBzdGFydCkgewotICAgIGlmIChzdGFydCkgewotICAgICAgY29uZmlndXJlX3NjYW4oKTsKLSAgICAgIHN0YXJ0X3NjYW4oKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGFkZHJlc3NfbWFuYWdlcl9yZWdpc3RlcmVkXykgewotICAgICAgICBsZV9hZGRyZXNzX21hbmFnZXJfLT5VbnJlZ2lzdGVyKHRoaXMpOwotICAgICAgICBhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHN0b3Bfc2NhbigpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc3RhcnRfc2NhbigpIHsKLSAgICAvLyBJZiB3ZSByZWNlaXZlIHN0YXJ0X3NjYW4gZHVyaW5nIHBhdXNlZCwgc2V0IHNjYW5fb25fcmVzdW1lXyB0byB0cnVlCi0gICAgaWYgKHBhdXNlZF8pIHsKLSAgICAgIHNjYW5fb25fcmVzdW1lXyA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlzX3NjYW5uaW5nXyA9IHRydWU7Ci0gICAgaWYgKCFhZGRyZXNzX21hbmFnZXJfcmVnaXN0ZXJlZF8pIHsKLSAgICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPlJlZ2lzdGVyKHRoaXMpOwotICAgICAgYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFwaV90eXBlXykgewotICAgICAgY2FzZSBTY2FuQXBpVHlwZTo6RVhURU5ERUQ6Ci0gICAgICAgIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZVNldEV4dGVuZGVkU2NhbkVuYWJsZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBFbmFibGU6OkVOQUJMRUQsIEZpbHRlckR1cGxpY2F0ZXM6OkRJU0FCTEVEIC8qIGZpbHRlciBkdXBsaWNhdGVzICovLCAwLCAwKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTY2FuQXBpVHlwZTo6QU5EUk9JRF9IQ0k6Ci0gICAgICBjYXNlIFNjYW5BcGlUeXBlOjpMRUdBQ1k6Ci0gICAgICAgIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgICAgaGNpOjpMZVNldFNjYW5FbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVELCBFbmFibGU6OkRJU0FCTEVEIC8qIGZpbHRlciBkdXBsaWNhdGVzICovKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc3RvcF9zY2FuKCkgewotICAgIGlmICghaXNfc2Nhbm5pbmdfKSB7Ci0gICAgICBMT0dfSU5GTygiU2Nhbm5pbmcgYWxyZWFkeSBzdG9wcGVkLCByZXR1cm4hIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlzX3NjYW5uaW5nXyA9IGZhbHNlOwotCi0gICAgc3dpdGNoIChhcGlfdHlwZV8pIHsKLSAgICAgIGNhc2UgU2NhbkFwaVR5cGU6OkVYVEVOREVEOgotICAgICAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIGhjaTo6TGVTZXRFeHRlbmRlZFNjYW5FbmFibGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgRW5hYmxlOjpESVNBQkxFRCwgRmlsdGVyRHVwbGljYXRlczo6RElTQUJMRUQgLyogZmlsdGVyIGR1cGxpY2F0ZXMgKi8sIDAsIDApLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZShpbXBsOjpjaGVja19zdGF0dXMpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNjYW5BcGlUeXBlOjpBTkRST0lEX0hDSToKLSAgICAgIGNhc2UgU2NhbkFwaVR5cGU6OkxFR0FDWToKLSAgICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBoY2k6OkxlU2V0U2NhbkVuYWJsZUJ1aWxkZXI6OkNyZWF0ZShFbmFibGU6OkRJU0FCTEVELCBFbmFibGU6OkRJU0FCTEVEIC8qIGZpbHRlciBkdXBsaWNhdGVzICovKSwKLSAgICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2UoaW1wbDo6Y2hlY2tfc3RhdHVzKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X3NjYW5fcGFyYW1ldGVycyhTY2FubmVySWQgc2Nhbm5lcl9pZCwgTGVTY2FuVHlwZSBzY2FuX3R5cGUsIHVpbnQxNl90IHNjYW5faW50ZXJ2YWwsIHVpbnQxNl90IHNjYW5fd2luZG93KSB7Ci0gICAgdWludDMyX3QgbWF4X3NjYW5faW50ZXJ2YWwgPSBrTGVTY2FuSW50ZXJ2YWxNYXg7Ci0gICAgdWludDMyX3QgbWF4X3NjYW5fd2luZG93ID0ga0xlU2NhbldpbmRvd01heDsKLSAgICBpZiAoYXBpX3R5cGVfID09IFNjYW5BcGlUeXBlOjpFWFRFTkRFRCkgewotICAgICAgbWF4X3NjYW5faW50ZXJ2YWwgPSBrTGVFeHRlbmRlZFNjYW5JbnRlcnZhbE1heDsKLSAgICAgIG1heF9zY2FuX3dpbmRvdyA9IGtMZUV4dGVuZGVkU2NhbldpbmRvd01heDsKLSAgICB9Ci0KLSAgICBpZiAoc2Nhbl90eXBlICE9IExlU2NhblR5cGU6OkFDVElWRSAmJiBzY2FuX3R5cGUgIT0gTGVTY2FuVHlwZTo6UEFTU0lWRSkgewotICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIHNjYW4gdHlwZSIpOwotICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25TZXRTY2FubmVyUGFyYW1ldGVyQ29tcGxldGUoCi0gICAgICAgICAgc2Nhbm5lcl9pZCwgU2Nhbm5pbmdDYWxsYmFjazo6U2Nhbm5pbmdTdGF0dXM6OklMTEVHQUxfUEFSQU1FVEVSKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHNjYW5faW50ZXJ2YWwgPiBtYXhfc2Nhbl9pbnRlcnZhbCB8fCBzY2FuX2ludGVydmFsIDwga0xlU2NhbkludGVydmFsTWluKSB7Ci0gICAgICBMT0dfRVJST1IoIkludmFsaWQgc2Nhbl9pbnRlcnZhbCAlZCIsIHNjYW5faW50ZXJ2YWwpOwotICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25TZXRTY2FubmVyUGFyYW1ldGVyQ29tcGxldGUoCi0gICAgICAgICAgc2Nhbm5lcl9pZCwgU2Nhbm5pbmdDYWxsYmFjazo6U2Nhbm5pbmdTdGF0dXM6OklMTEVHQUxfUEFSQU1FVEVSKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHNjYW5fd2luZG93ID4gbWF4X3NjYW5fd2luZG93IHx8IHNjYW5fd2luZG93IDwga0xlU2NhbldpbmRvd01pbikgewotICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIHNjYW5fd2luZG93ICVkIiwgc2Nhbl93aW5kb3cpOwotICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25TZXRTY2FubmVyUGFyYW1ldGVyQ29tcGxldGUoCi0gICAgICAgICAgc2Nhbm5lcl9pZCwgU2Nhbm5pbmdDYWxsYmFjazo6U2Nhbm5pbmdTdGF0dXM6OklMTEVHQUxfUEFSQU1FVEVSKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbGVfc2Nhbl90eXBlXyA9IHNjYW5fdHlwZTsKLSAgICBpbnRlcnZhbF9tc18gPSBzY2FuX2ludGVydmFsOwotICAgIHdpbmRvd19tc18gPSBzY2FuX3dpbmRvdzsKLSAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PblNldFNjYW5uZXJQYXJhbWV0ZXJDb21wbGV0ZShzY2FubmVyX2lkLCBTY2FubmluZ0NhbGxiYWNrOjpTVUNDRVNTKTsKLSAgfQotCi0gIHZvaWQgc2Nhbl9maWx0ZXJfZW5hYmxlKGJvb2wgZW5hYmxlKSB7Ci0gICAgaWYgKCFpc19maWx0ZXJfc3VwcG9ydF8pIHsKLSAgICAgIExPR19XQVJOKCJBZHZlcnRpc2luZyBmaWx0ZXIgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVuYWJsZSBhcGNmX2VuYWJsZSA9IGVuYWJsZSA/IEVuYWJsZTo6RU5BQkxFRCA6IEVuYWJsZTo6RElTQUJMRUQ7Ci0gICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIExlQWR2RmlsdGVyRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKGFwY2ZfZW5hYmxlKSwKLSAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9hZHZlcnRpc2luZ19maWx0ZXJfY29tcGxldGUpKTsKLSAgfQotCi0gIHZvaWQgc2Nhbl9maWx0ZXJfcGFyYW1ldGVyX3NldHVwKAotICAgICAgQXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3QgZmlsdGVyX2luZGV4LCBBZHZlcnRpc2luZ0ZpbHRlclBhcmFtZXRlciBhZHZlcnRpc2luZ19maWx0ZXJfcGFyYW1ldGVyKSB7Ci0gICAgaWYgKCFpc19maWx0ZXJfc3VwcG9ydF8pIHsKLSAgICAgIExPR19XQVJOKCJBZHZlcnRpc2luZyBmaWx0ZXIgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgICBjYXNlIEFwY2ZBY3Rpb246OkFERDoKLSAgICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgICBMZUFkdkZpbHRlckFkZEZpbHRlcmluZ1BhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgZmlsdGVyX2luZGV4LAotICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIuZmVhdHVyZV9zZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5saXN0X2xvZ2ljX3R5cGUsCi0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5maWx0ZXJfbG9naWNfdHlwZSwKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19maWx0ZXJfcGFyYW1ldGVyLnJzc2lfaGlnaF90aHJlc2gsCi0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5kZWxpdmVyeV9tb2RlLAotICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIub25mb3VuZF90aW1lb3V0LAotICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIub25mb3VuZF90aW1lb3V0X2NudCwKLSAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19maWx0ZXJfcGFyYW1ldGVyLnJzc2lfbG93X3RocmVzLAotICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIub25sb3N0X3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5udW1fb2ZfdHJhY2tpbmdfZW50cmllcyksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX2FkdmVydGlzaW5nX2ZpbHRlcl9jb21wbGV0ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQXBjZkFjdGlvbjo6REVMRVRFOgotICAgICAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIExlQWR2RmlsdGVyRGVsZXRlRmlsdGVyaW5nUGFyYW1ldGVyc0J1aWxkZXI6OkNyZWF0ZShmaWx0ZXJfaW5kZXgpLAotICAgICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9hZHZlcnRpc2luZ19maWx0ZXJfY29tcGxldGUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFwY2ZBY3Rpb246OkNMRUFSOgotICAgICAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICAgIExlQWR2RmlsdGVyQ2xlYXJGaWx0ZXJpbmdQYXJhbWV0ZXJzQnVpbGRlcjo6Q3JlYXRlKCksCi0gICAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX2FkdmVydGlzaW5nX2ZpbHRlcl9jb21wbGV0ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19FUlJPUigiVW5rbm93biBhY3Rpb24gdHlwZTogJWQiLCAodWludDE2X3QpYWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzY2FuX2ZpbHRlcl9hZGQodWludDhfdCBmaWx0ZXJfaW5kZXgsIHN0ZDo6dmVjdG9yPEFkdmVydGlzaW5nUGFja2V0Q29udGVudEZpbHRlckNvbW1hbmQ+IGZpbHRlcnMpIHsKLSAgICBpZiAoIWlzX2ZpbHRlcl9zdXBwb3J0XykgewotICAgICAgTE9HX1dBUk4oIkFkdmVydGlzaW5nIGZpbHRlciBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQXBjZkFjdGlvbiBhcGNmX2FjdGlvbiA9IEFwY2ZBY3Rpb246OkFERDsKLSAgICBmb3IgKGF1dG8gZmlsdGVyIDogZmlsdGVycykgewotICAgICAgLyogSWYgZGF0YSBpcyBwYXNzZWQsIGJvdGggbWFzayBhbmQgZGF0YSBoYXZlIHRvIGJlIHRoZSBzYW1lIGxlbmd0aCAqLwotICAgICAgaWYgKGZpbHRlci5kYXRhLnNpemUoKSAhPSBmaWx0ZXIuZGF0YV9tYXNrLnNpemUoKSAmJiBmaWx0ZXIuZGF0YS5zaXplKCkgIT0gMCAmJiBmaWx0ZXIuZGF0YV9tYXNrLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigiZGF0YSBhbmQgZGF0YV9tYXNrIGFyZSBvZiBkaWZmZXJlbnQgc2l6ZSIpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChmaWx0ZXIuZmlsdGVyX3R5cGUpIHsKLSAgICAgICAgY2FzZSBBcGNmRmlsdGVyVHlwZTo6QlJPQURDQVNURVJfQUREUkVTUzogewotICAgICAgICAgIHVwZGF0ZV9hZGRyZXNzX2ZpbHRlcihhcGNmX2FjdGlvbiwgZmlsdGVyX2luZGV4LCBmaWx0ZXIuYWRkcmVzcywgZmlsdGVyLmFwcGxpY2F0aW9uX2FkZHJlc3NfdHlwZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBBcGNmRmlsdGVyVHlwZTo6U0VSVklDRV9VVUlEOgotICAgICAgICBjYXNlIEFwY2ZGaWx0ZXJUeXBlOjpTRVJWSUNFX1NPTElDSVRBVElPTl9VVUlEOiB7Ci0gICAgICAgICAgdXBkYXRlX3V1aWRfZmlsdGVyKGFwY2ZfYWN0aW9uLCBmaWx0ZXJfaW5kZXgsIGZpbHRlci5maWx0ZXJfdHlwZSwgZmlsdGVyLnV1aWQsIGZpbHRlci51dWlkX21hc2spOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQXBjZkZpbHRlclR5cGU6OkxPQ0FMX05BTUU6IHsKLSAgICAgICAgICB1cGRhdGVfbG9jYWxfbmFtZV9maWx0ZXIoYXBjZl9hY3Rpb24sIGZpbHRlcl9pbmRleCwgZmlsdGVyLm5hbWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQXBjZkZpbHRlclR5cGU6Ok1BTlVGQUNUVVJFUl9EQVRBOiB7Ci0gICAgICAgICAgdXBkYXRlX21hbnVmYWN0dXJlcl9kYXRhX2ZpbHRlcigKLSAgICAgICAgICAgICAgYXBjZl9hY3Rpb24sIGZpbHRlcl9pbmRleCwgZmlsdGVyLmNvbXBhbnksIGZpbHRlci5jb21wYW55X21hc2ssIGZpbHRlci5kYXRhLCBmaWx0ZXIuZGF0YV9tYXNrKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEFwY2ZGaWx0ZXJUeXBlOjpTRVJWSUNFX0RBVEE6IHsKLSAgICAgICAgICB1cGRhdGVfc2VydmljZV9kYXRhX2ZpbHRlcihhcGNmX2FjdGlvbiwgZmlsdGVyX2luZGV4LCBmaWx0ZXIuZGF0YSwgZmlsdGVyLmRhdGFfbWFzayk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfRVJST1IoIlVua25vd24gZmlsdGVyIHR5cGU6ICVkIiwgKHVpbnQxNl90KWZpbHRlci5maWx0ZXJfdHlwZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB1cGRhdGVfYWRkcmVzc19maWx0ZXIoCi0gICAgICBBcGNmQWN0aW9uIGFjdGlvbiwgdWludDhfdCBmaWx0ZXJfaW5kZXgsIEFkZHJlc3MgYWRkcmVzcywgQXBjZkFwcGxpY2F0aW9uQWRkcmVzc1R5cGUgYWRkcmVzc190eXBlKSB7Ci0gICAgaWYgKGFjdGlvbiAhPSBBcGNmQWN0aW9uOjpDTEVBUikgewotICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVBZHZGaWx0ZXJCcm9hZGNhc3RlckFkZHJlc3NCdWlsZGVyOjpDcmVhdGUoYWN0aW9uLCBmaWx0ZXJfaW5kZXgsIGFkZHJlc3MsIGFkZHJlc3NfdHlwZSksCi0gICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9hZHZlcnRpc2luZ19maWx0ZXJfY29tcGxldGUpKTsKLSAgICB9IGVsc2UgewotICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVBZHZGaWx0ZXJDbGVhckJyb2FkY2FzdGVyQWRkcmVzc0J1aWxkZXI6OkNyZWF0ZShmaWx0ZXJfaW5kZXgpLAotICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6b25fYWR2ZXJ0aXNpbmdfZmlsdGVyX2NvbXBsZXRlKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB1cGRhdGVfdXVpZF9maWx0ZXIoCi0gICAgICBBcGNmQWN0aW9uIGFjdGlvbiwgdWludDhfdCBmaWx0ZXJfaW5kZXgsIEFwY2ZGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCBVdWlkIHV1aWQsIFV1aWQgdXVpZF9tYXNrKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29tYmluZWRfZGF0YSA9IHt9OwotICAgIGlmIChhY3Rpb24gIT0gQXBjZkFjdGlvbjo6Q0xFQVIpIHsKLSAgICAgIHVpbnQ4X3QgdXVpZF9sZW4gPSB1dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0gICAgICBpZiAodXVpZF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgICAgdWludDE2X3QgZGF0YSA9IHV1aWQuQXMxNkJpdCgpOwotICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdClkYXRhKTsKLSAgICAgICAgY29tYmluZWRfZGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKGRhdGEgPj4gOCkpOwotICAgICAgfSBlbHNlIGlmICh1dWlkX2xlbiA9PSBVdWlkOjprTnVtQnl0ZXMzMikgewotICAgICAgICB1aW50MTZfdCBkYXRhID0gdXVpZC5BczMyQml0KCk7Ci0gICAgICAgIGNvbWJpbmVkX2RhdGEucHVzaF9iYWNrKCh1aW50OF90KWRhdGEpOwotICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdCkoZGF0YSA+PiA4KSk7Ci0gICAgICAgIGNvbWJpbmVkX2RhdGEucHVzaF9iYWNrKCh1aW50OF90KShkYXRhID4+IDE2KSk7Ci0gICAgICAgIGNvbWJpbmVkX2RhdGEucHVzaF9iYWNrKCh1aW50OF90KShkYXRhID4+IDI0KSk7Ci0gICAgICB9IGVsc2UgaWYgKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgICBhdXRvIGRhdGEgPSB1dWlkLlRvMTI4Qml0TEUoKTsKLSAgICAgICAgY29tYmluZWRfZGF0YS5pbnNlcnQoY29tYmluZWRfZGF0YS5lbmQoKSwgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19FUlJPUigiaWxsZWdhbCBVVUlEIGxlbmd0aDogJWQiLCAodWludDE2X3QpdXVpZF9sZW4pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmICghdXVpZF9tYXNrLklzRW1wdHkoKSkgewotICAgICAgICBpZiAodXVpZF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgICAgICB1aW50MTZfdCBkYXRhID0gdXVpZF9tYXNrLkFzMTZCaXQoKTsKLSAgICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdClkYXRhKTsKLSAgICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdCkoZGF0YSA+PiA4KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodXVpZF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMzIpIHsKLSAgICAgICAgICB1aW50MTZfdCBkYXRhID0gdXVpZF9tYXNrLkFzMzJCaXQoKTsKLSAgICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdClkYXRhKTsKLSAgICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdCkoZGF0YSA+PiA4KSk7Ci0gICAgICAgICAgY29tYmluZWRfZGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKGRhdGEgPj4gMTYpKTsKLSAgICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdCkoZGF0YSA+PiAyNCkpOwotICAgICAgICB9IGVsc2UgaWYgKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgICAgIGF1dG8gZGF0YSA9IHV1aWRfbWFzay5UbzEyOEJpdExFKCk7Ci0gICAgICAgICAgY29tYmluZWRfZGF0YS5pbnNlcnQoY29tYmluZWRfZGF0YS5lbmQoKSwgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSh1dWlkX2xlbiwgMHhGRik7Ci0gICAgICAgIGNvbWJpbmVkX2RhdGEuaW5zZXJ0KGNvbWJpbmVkX2RhdGEuZW5kKCksIGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZpbHRlcl90eXBlID09IEFwY2ZGaWx0ZXJUeXBlOjpTRVJWSUNFX1VVSUQpIHsKLSAgICAgIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlQWR2RmlsdGVyU2VydmljZVV1aWRCdWlsZGVyOjpDcmVhdGUoYWN0aW9uLCBmaWx0ZXJfaW5kZXgsIGNvbWJpbmVkX2RhdGEpLAotICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6b25fYWR2ZXJ0aXNpbmdfZmlsdGVyX2NvbXBsZXRlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxlX3NjYW5uaW5nX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICAgIExlQWR2RmlsdGVyU29saWNpdGF0aW9uVXVpZEJ1aWxkZXI6OkNyZWF0ZShhY3Rpb24sIGZpbHRlcl9pbmRleCwgY29tYmluZWRfZGF0YSksCi0gICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9hZHZlcnRpc2luZ19maWx0ZXJfY29tcGxldGUpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHVwZGF0ZV9sb2NhbF9uYW1lX2ZpbHRlcihBcGNmQWN0aW9uIGFjdGlvbiwgdWludDhfdCBmaWx0ZXJfaW5kZXgsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5hbWUpIHsKLSAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgTGVBZHZGaWx0ZXJMb2NhbE5hbWVCdWlsZGVyOjpDcmVhdGUoYWN0aW9uLCBmaWx0ZXJfaW5kZXgsIG5hbWUpLAotICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX2FkdmVydGlzaW5nX2ZpbHRlcl9jb21wbGV0ZSkpOwotICB9Ci0KLSAgdm9pZCB1cGRhdGVfbWFudWZhY3R1cmVyX2RhdGFfZmlsdGVyKAotICAgICAgQXBjZkFjdGlvbiBhY3Rpb24sCi0gICAgICB1aW50OF90IGZpbHRlcl9pbmRleCwKLSAgICAgIHVpbnQxNl90IGNvbXBhbnlfaWQsCi0gICAgICB1aW50MTZfdCBjb21wYW55X2lkX21hc2ssCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9tYXNrKSB7Ci0gICAgaWYgKGRhdGEuc2l6ZSgpICE9IGRhdGFfbWFzay5zaXplKCkpIHsKLSAgICAgIExPR19FUlJPUigibWFudWZhY3R1cmVyIGRhdGEgbWFzayBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgbWFudWZhY3R1cmVyIGRhdGEiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29tYmluZWRfZGF0YSA9IHt9OwotICAgIGlmIChhY3Rpb24gIT0gQXBjZkFjdGlvbjo6Q0xFQVIpIHsKLSAgICAgIGNvbWJpbmVkX2RhdGEucHVzaF9iYWNrKCh1aW50OF90KWNvbXBhbnlfaWQpOwotICAgICAgY29tYmluZWRfZGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpKGNvbXBhbnlfaWQgPj4gOCkpOwotICAgICAgaWYgKGRhdGEuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgY29tYmluZWRfZGF0YS5pbnNlcnQoY29tYmluZWRfZGF0YS5lbmQoKSwgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChjb21wYW55X2lkX21hc2sgIT0gMCkgewotICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdCljb21wYW55X2lkX21hc2spOwotICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygodWludDhfdCkoY29tcGFueV9pZF9tYXNrID4+IDgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbWJpbmVkX2RhdGEucHVzaF9iYWNrKDB4RkYpOwotICAgICAgICBjb21iaW5lZF9kYXRhLnB1c2hfYmFjaygweEZGKTsKLSAgICAgIH0KLSAgICAgIGlmIChkYXRhX21hc2suc2l6ZSgpICE9IDApIHsKLSAgICAgICAgY29tYmluZWRfZGF0YS5pbnNlcnQoY29tYmluZWRfZGF0YS5lbmQoKSwgZGF0YV9tYXNrLmJlZ2luKCksIGRhdGFfbWFzay5lbmQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIExlQWR2RmlsdGVyTWFudWZhY3R1cmVyRGF0YUJ1aWxkZXI6OkNyZWF0ZShhY3Rpb24sIGZpbHRlcl9pbmRleCwgY29tYmluZWRfZGF0YSksCi0gICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6b25fYWR2ZXJ0aXNpbmdfZmlsdGVyX2NvbXBsZXRlKSk7Ci0gIH0KLQotICB2b2lkIHVwZGF0ZV9zZXJ2aWNlX2RhdGFfZmlsdGVyKAotICAgICAgQXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3QgZmlsdGVyX2luZGV4LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX21hc2spIHsKLSAgICBpZiAoZGF0YS5zaXplKCkgIT0gZGF0YV9tYXNrLnNpemUoKSkgewotICAgICAgTE9HX0VSUk9SKCJzZXJ2aWNlIGRhdGEgbWFzayBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgc2VydmljZSBkYXRhIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbWJpbmVkX2RhdGEgPSB7fTsKLSAgICBpZiAoYWN0aW9uICE9IEFwY2ZBY3Rpb246OkNMRUFSICYmIGRhdGEuc2l6ZSgpICE9IDApIHsKLSAgICAgIGNvbWJpbmVkX2RhdGEuaW5zZXJ0KGNvbWJpbmVkX2RhdGEuZW5kKCksIGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7Ci0gICAgICBjb21iaW5lZF9kYXRhLmluc2VydChjb21iaW5lZF9kYXRhLmVuZCgpLCBkYXRhX21hc2suYmVnaW4oKSwgZGF0YV9tYXNrLmVuZCgpKTsKLSAgICB9Ci0KLSAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgTGVBZHZGaWx0ZXJTZXJ2aWNlRGF0YUJ1aWxkZXI6OkNyZWF0ZShhY3Rpb24sIGZpbHRlcl9pbmRleCwgY29tYmluZWRfZGF0YSksCi0gICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6b25fYWR2ZXJ0aXNpbmdfZmlsdGVyX2NvbXBsZXRlKSk7Ci0gIH0KLQotICB2b2lkIGJhdGNoX3NjYW5fc2V0X3N0b3JhZ2VfcGFyYW1ldGVyKAotICAgICAgdWludDhfdCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgICAgdWludDhfdCBiYXRjaF9zY2FuX3RydW5jYXRlZF9tYXgsCi0gICAgICB1aW50OF90IGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCwKLSAgICAgIFNjYW5uZXJJZCBzY2FubmVyX2lkKSB7Ci0gICAgaWYgKCFpc19iYXRjaF9zY2FuX3N1cHBvcnRfKSB7Ci0gICAgICBMT0dfV0FSTigiQmF0Y2ggc2NhbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIHNjYW5uZXIgaWQgZm9yIE9uQmF0Y2hTY2FuVGhyZXNob2xkQ3Jvc3NlZAotICAgIGJhdGNoX3NjYW5fY29uZmlnXy5yZWZfdmFsdWUgPSBzY2FubmVyX2lkOwotCi0gICAgaWYgKGJhdGNoX3NjYW5fY29uZmlnXy5jdXJyZW50X3N0YXRlID09IEJhdGNoU2NhblN0YXRlOjpFUlJPUl9TVEFURSB8fAotICAgICAgICBiYXRjaF9zY2FuX2NvbmZpZ18uY3VycmVudF9zdGF0ZSA9PSBCYXRjaFNjYW5TdGF0ZTo6RElTQUJMRURfU1RBVEUgfHwKLSAgICAgICAgYmF0Y2hfc2Nhbl9jb25maWdfLmN1cnJlbnRfc3RhdGUgPT0gQmF0Y2hTY2FuU3RhdGU6OkRJU0FCTEVfQ0FMTEVEKSB7Ci0gICAgICBiYXRjaF9zY2FuX2NvbmZpZ18uY3VycmVudF9zdGF0ZSA9IEJhdGNoU2NhblN0YXRlOjpFTkFCTEVfQ0FMTEVEOwotICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVCYXRjaFNjYW5FbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVEKSwKLSAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX2JhdGNoX3NjYW5fZW5hYmxlX2NvbXBsZXRlKSk7Ci0gICAgfQotCi0gICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIExlQmF0Y2hTY2FuU2V0U3RvcmFnZVBhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBiYXRjaF9zY2FuX2Z1bGxfbWF4LCBiYXRjaF9zY2FuX3RydW5jYXRlZF9tYXgsIGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCksCi0gICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6b25fYmF0Y2hfc2Nhbl9jb21wbGV0ZSkpOwotICB9Ci0KLSAgdm9pZCBiYXRjaF9zY2FuX2VuYWJsZSgKLSAgICAgIEJhdGNoU2Nhbk1vZGUgc2Nhbl9tb2RlLAotICAgICAgdWludDMyX3QgZHV0eV9jeWNsZV9zY2FuX3dpbmRvd19zbG90cywKLSAgICAgIHVpbnQzMl90IGR1dHlfY3ljbGVfc2Nhbl9pbnRlcnZhbF9zbG90cywKLSAgICAgIEJhdGNoU2NhbkRpc2NhcmRSdWxlIGJhdGNoX3NjYW5fZGlzY2FyZF9ydWxlKSB7Ci0gICAgaWYgKCFpc19iYXRjaF9zY2FuX3N1cHBvcnRfKSB7Ci0gICAgICBMT0dfV0FSTigiQmF0Y2ggc2NhbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJhdGNoX3NjYW5fY29uZmlnXy5jdXJyZW50X3N0YXRlID09IEJhdGNoU2NhblN0YXRlOjpFUlJPUl9TVEFURSB8fAotICAgICAgICBiYXRjaF9zY2FuX2NvbmZpZ18uY3VycmVudF9zdGF0ZSA9PSBCYXRjaFNjYW5TdGF0ZTo6RElTQUJMRURfU1RBVEUgfHwKLSAgICAgICAgYmF0Y2hfc2Nhbl9jb25maWdfLmN1cnJlbnRfc3RhdGUgPT0gQmF0Y2hTY2FuU3RhdGU6OkRJU0FCTEVfQ0FMTEVEKSB7Ci0gICAgICBiYXRjaF9zY2FuX2NvbmZpZ18uY3VycmVudF9zdGF0ZSA9IEJhdGNoU2NhblN0YXRlOjpFTkFCTEVfQ0FMTEVEOwotICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVCYXRjaFNjYW5FbmFibGVCdWlsZGVyOjpDcmVhdGUoRW5hYmxlOjpFTkFCTEVEKSwKLSAgICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX2JhdGNoX3NjYW5fZW5hYmxlX2NvbXBsZXRlKSk7Ci0gICAgfQotCi0gICAgYmF0Y2hfc2Nhbl9jb25maWdfLnNjYW5fbW9kZSA9IHNjYW5fbW9kZTsKLSAgICBiYXRjaF9zY2FuX2NvbmZpZ18uc2Nhbl9pbnRlcnZhbCA9IGR1dHlfY3ljbGVfc2Nhbl9pbnRlcnZhbF9zbG90czsKLSAgICBiYXRjaF9zY2FuX2NvbmZpZ18uc2Nhbl93aW5kb3cgPSBkdXR5X2N5Y2xlX3NjYW5fd2luZG93X3Nsb3RzOwotICAgIGJhdGNoX3NjYW5fY29uZmlnXy5kaXNjYXJkX3J1bGUgPSBiYXRjaF9zY2FuX2Rpc2NhcmRfcnVsZTsKLSAgICAvKiBUaGlzIGNvbW1hbmQgc3RhcnRzIGJhdGNoIHNjYW5uaW5nLCBpZiBlbmFibGVkICovCi0gICAgYmF0Y2hfc2Nhbl9zZXRfc2Nhbl9wYXJhbWV0ZXIoCi0gICAgICAgIHNjYW5fbW9kZSwgZHV0eV9jeWNsZV9zY2FuX3dpbmRvd19zbG90cywgZHV0eV9jeWNsZV9zY2FuX2ludGVydmFsX3Nsb3RzLCBiYXRjaF9zY2FuX2Rpc2NhcmRfcnVsZSk7Ci0gIH0KLQotICB2b2lkIGJhdGNoX3NjYW5fZGlzYWJsZSgpIHsKLSAgICBpZiAoIWlzX2JhdGNoX3NjYW5fc3VwcG9ydF8pIHsKLSAgICAgIExPR19XQVJOKCJCYXRjaCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYmF0Y2hfc2Nhbl9jb25maWdfLmN1cnJlbnRfc3RhdGUgPSBCYXRjaFNjYW5TdGF0ZTo6RElTQUJMRV9DQUxMRUQ7Ci0gICAgYmF0Y2hfc2Nhbl9zZXRfc2Nhbl9wYXJhbWV0ZXIoCi0gICAgICAgIEJhdGNoU2Nhbk1vZGU6OkRJU0FCTEUsCi0gICAgICAgIGJhdGNoX3NjYW5fY29uZmlnXy5zY2FuX3dpbmRvdywKLSAgICAgICAgYmF0Y2hfc2Nhbl9jb25maWdfLnNjYW5faW50ZXJ2YWwsCi0gICAgICAgIGJhdGNoX3NjYW5fY29uZmlnXy5kaXNjYXJkX3J1bGUpOwotICB9Ci0KLSAgdm9pZCBiYXRjaF9zY2FuX3NldF9zY2FuX3BhcmFtZXRlcigKLSAgICAgIEJhdGNoU2Nhbk1vZGUgc2Nhbl9tb2RlLAotICAgICAgdWludDMyX3QgZHV0eV9jeWNsZV9zY2FuX3dpbmRvd19zbG90cywKLSAgICAgIHVpbnQzMl90IGR1dHlfY3ljbGVfc2Nhbl9pbnRlcnZhbF9zbG90cywKLSAgICAgIEJhdGNoU2NhbkRpc2NhcmRSdWxlIGJhdGNoX3NjYW5fZGlzY2FyZF9ydWxlKSB7Ci0gICAgaWYgKCFpc19iYXRjaF9zY2FuX3N1cHBvcnRfKSB7Ci0gICAgICBMT0dfV0FSTigiQmF0Y2ggc2NhbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkdmVydGlzaW5nQWRkcmVzc1R5cGUgb3duX2FkZHJlc3NfdHlwZSA9IEFkdmVydGlzaW5nQWRkcmVzc1R5cGU6OlBVQkxJQ19BRERSRVNTOwotICAgIGlmIChvd25fYWRkcmVzc190eXBlXyA9PSBPd25BZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTIHx8Ci0gICAgICAgIG93bl9hZGRyZXNzX3R5cGVfID09IE93bkFkZHJlc3NUeXBlOjpSRVNPTFZBQkxFX09SX1JBTkRPTV9BRERSRVNTKSB7Ci0gICAgICBvd25fYWRkcmVzc190eXBlID0gQWR2ZXJ0aXNpbmdBZGRyZXNzVHlwZTo6UkFORE9NX0FERFJFU1M7Ci0gICAgfQotICAgIHVpbnQ4X3QgdHJ1bmNhdGVkX21vZGVfZW5hYmxlZCA9IDB4MDA7Ci0gICAgdWludDhfdCBmdWxsX21vZGVfZW5hYmxlZCA9IDB4MDA7Ci0gICAgaWYgKHNjYW5fbW9kZSA9PSBCYXRjaFNjYW5Nb2RlOjpUUlVOQ0FURUQgfHwgc2Nhbl9tb2RlID09IEJhdGNoU2Nhbk1vZGU6OlRSVU5DQVRFRF9BTkRfRlVMTCkgewotICAgICAgdHJ1bmNhdGVkX21vZGVfZW5hYmxlZCA9IDB4MDE7Ci0gICAgfQotICAgIGlmIChzY2FuX21vZGUgPT0gQmF0Y2hTY2FuTW9kZTo6RlVMTCB8fCBzY2FuX21vZGUgPT0gQmF0Y2hTY2FuTW9kZTo6VFJVTkNBVEVEX0FORF9GVUxMKSB7Ci0gICAgICBmdWxsX21vZGVfZW5hYmxlZCA9IDB4MDE7Ci0gICAgfQotCi0gICAgaWYgKHNjYW5fbW9kZSA9PSBCYXRjaFNjYW5Nb2RlOjpESVNBQkxFKSB7Ci0gICAgICBsZV9zY2FubmluZ19pbnRlcmZhY2VfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgICBMZUJhdGNoU2NhblNldFNjYW5QYXJhbWV0ZXJzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICB0cnVuY2F0ZWRfbW9kZV9lbmFibGVkLAotICAgICAgICAgICAgICBmdWxsX21vZGVfZW5hYmxlZCwKLSAgICAgICAgICAgICAgZHV0eV9jeWNsZV9zY2FuX3dpbmRvd19zbG90cywKLSAgICAgICAgICAgICAgZHV0eV9jeWNsZV9zY2FuX2ludGVydmFsX3Nsb3RzLAotICAgICAgICAgICAgICBvd25fYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICBiYXRjaF9zY2FuX2Rpc2NhcmRfcnVsZSksCi0gICAgICAgICAgbW9kdWxlX2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpvbl9iYXRjaF9zY2FuX2Rpc2FibGVfY29tcGxldGUpKTsKLSAgICB9IGVsc2UgewotICAgICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgICAgTGVCYXRjaFNjYW5TZXRTY2FuUGFyYW1ldGVyc0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgdHJ1bmNhdGVkX21vZGVfZW5hYmxlZCwKLSAgICAgICAgICAgICAgZnVsbF9tb2RlX2VuYWJsZWQsCi0gICAgICAgICAgICAgIGR1dHlfY3ljbGVfc2Nhbl93aW5kb3dfc2xvdHMsCi0gICAgICAgICAgICAgIGR1dHlfY3ljbGVfc2Nhbl9pbnRlcnZhbF9zbG90cywKLSAgICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgYmF0Y2hfc2Nhbl9kaXNjYXJkX3J1bGUpLAotICAgICAgICAgIG1vZHVsZV9oYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6b25fYmF0Y2hfc2Nhbl9jb21wbGV0ZSkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYmF0Y2hfc2Nhbl9yZWFkX3Jlc3VsdHMoU2Nhbm5lcklkIHNjYW5uZXJfaWQsIHVpbnQxNl90IHRvdGFsX251bV9vZl9yZWNvcmRzLCBCYXRjaFNjYW5Nb2RlIHNjYW5fbW9kZSkgewotICAgIGlmICghaXNfYmF0Y2hfc2Nhbl9zdXBwb3J0XykgewotICAgICAgTE9HX1dBUk4oIkJhdGNoIHNjYW4gaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgaW50IHN0YXR1cyA9IHN0YXRpY19jYXN0PGludD4oRXJyb3JDb2RlOjpVTlNVUE9SVEVEX0ZFQVRVUkVfT1JfUEFSQU1FVEVSX1ZBTFVFKTsKLSAgICAgIHNjYW5uaW5nX2NhbGxiYWNrc18tPk9uQmF0Y2hTY2FuUmVwb3J0cyhzY2FubmVyX2lkLCBzdGF0dXMsIDAsIDAsIHt9KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc2Nhbl9tb2RlICE9IEJhdGNoU2Nhbk1vZGU6OkZVTEwgJiYgc2Nhbl9tb2RlICE9IEJhdGNoU2Nhbk1vZGU6OlRSVU5DQVRFRCkgewotICAgICAgTE9HX1dBUk4oIkludmFsaWQgc2NhbiBtb2RlICVkIiwgKHVpbnQxNl90KXNjYW5fbW9kZSk7Ci0gICAgICBpbnQgc3RhdHVzID0gc3RhdGljX2Nhc3Q8aW50PihFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUyk7Ci0gICAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PbkJhdGNoU2NhblJlcG9ydHMoc2Nhbm5lcl9pZCwgc3RhdHVzLCAwLCAwLCB7fSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJhdGNoX3NjYW5fcmVzdWx0X2NhY2hlXy5maW5kKHNjYW5uZXJfaWQpID09IGJhdGNoX3NjYW5fcmVzdWx0X2NhY2hlXy5lbmQoKSkgewotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZW1wdHlfZGF0YSA9IHt9OwotICAgICAgYmF0Y2hfc2Nhbl9yZXN1bHRfY2FjaGVfLmVtcGxhY2Uoc2Nhbm5lcl9pZCwgZW1wdHlfZGF0YSk7Ci0gICAgfQotCi0gICAgbGVfc2Nhbm5pbmdfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIExlQmF0Y2hTY2FuUmVhZFJlc3VsdFBhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoc3RhdGljX2Nhc3Q8QmF0Y2hTY2FuRGF0YVJlYWQ+KHNjYW5fbW9kZSkpLAotICAgICAgICBtb2R1bGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Om9uX2JhdGNoX3NjYW5fcmVhZF9yZXN1bHRfY29tcGxldGUsIHNjYW5uZXJfaWQsIHRvdGFsX251bV9vZl9yZWNvcmRzKSk7Ci0gIH0KLQotICB2b2lkIHRyYWNrX2FkdmVydGlzZXIoU2Nhbm5lcklkIHNjYW5uZXJfaWQpIHsKLSAgICBpZiAoIWlzX2JhdGNoX3NjYW5fc3VwcG9ydF8pIHsKLSAgICAgIExPR19XQVJOKCJCYXRjaCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIEFkdmVydGlzaW5nRmlsdGVyT25Gb3VuZE9uTG9zdEluZm8gb25fZm91bmRfb25fbG9zdF9pbmZvID0ge307Ci0gICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uc2Nhbm5lcl9pZCA9IHNjYW5uZXJfaWQ7Ci0gICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9pbmZvX3ByZXNlbnQgPSBBZHZ0SW5mb1ByZXNlbnQ6Ok5PX0FEVlRfSU5GT19QUkVTRU5UOwotICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25UcmFja0FkdkZvdW5kTG9zdChvbl9mb3VuZF9vbl9sb3N0X2luZm8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB0cmFja2VyX2lkID0gc2Nhbm5lcl9pZDsKLSAgfQotCi0gIHZvaWQgcmVnaXN0ZXJfc2Nhbm5pbmdfY2FsbGJhY2soU2Nhbm5pbmdDYWxsYmFjayogc2Nhbm5pbmdfY2FsbGJhY2tzKSB7Ci0gICAgc2Nhbm5pbmdfY2FsbGJhY2tzXyA9IHNjYW5uaW5nX2NhbGxiYWNrczsKLSAgfQotCi0gIHZvaWQgb25fc2V0X3NjYW5fcGFyYW1ldGVyX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIHN3aXRjaCAodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpIHsKLSAgICAgIGNhc2UgKE9wQ29kZTo6TEVfU0VUX1NDQU5fUEFSQU1FVEVSUyk6IHsKLSAgICAgICAgYXV0byBzdGF0dXNfdmlldyA9IExlU2V0U2NhblBhcmFtZXRlcnNDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgICAgQVNTRVJUKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgICAgIGlmIChzdGF0dXNfdmlldy5HZXRTdGF0dXMoKSAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgICAgICBMT0dfSU5GTygKLSAgICAgICAgICAgICAgIlJlY2VpdmUgc2V0IHNjYW4gcGFyYW1ldGVyIGNvbXBsZXRlIHdpdGggZXJyb3IgY29kZSAlcyIsIEVycm9yQ29kZVRleHQoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAoT3BDb2RlOjpMRV9FWFRFTkRFRF9TQ0FOX1BBUkFNUyk6IHsKLSAgICAgICAgYXV0byBzdGF0dXNfdmlldyA9IExlRXh0ZW5kZWRTY2FuUGFyYW1zQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICAgIEFTU0VSVChzdGF0dXNfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBpZiAoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgICAgICJSZWNlaXZlIGV4dGVuZGVkIHNjYW4gcGFyYW1ldGVyIGNvbXBsZXRlIHdpdGggZXJyb3IgY29kZSAlcyIsCi0gICAgICAgICAgICAgIEVycm9yQ29kZVRleHQoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAoT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfU0NBTl9QQVJBTUVURVJTKTogewotICAgICAgICBhdXRvIHN0YXR1c192aWV3ID0gTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICAgIEFTU0VSVChzdGF0dXNfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBpZiAoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgICAgICJSZWNlaXZlIHNldCBleHRlbmRlZCBzY2FuIHBhcmFtZXRlciBjb21wbGV0ZSB3aXRoIGVycm9yIGNvZGUgJXMiLAotICAgICAgICAgICAgICBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuaGFuZGxlZCBldmVudCAlcyIsIE9wQ29kZVRleHQodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fYWR2ZXJ0aXNpbmdfZmlsdGVyX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXNfdmlldyA9IExlQWR2RmlsdGVyQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgaWYgKHN0YXR1c192aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgIkdvdCBhIENvbW1hbmQgY29tcGxldGUgJXMsIHN0YXR1cyAlcyIsCi0gICAgICAgICAgT3BDb2RlVGV4dCh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkuY19zdHIoKSwKLSAgICAgICAgICBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBBcGNmT3Bjb2RlIGFwY2Zfb3Bjb2RlID0gc3RhdHVzX3ZpZXcuR2V0QXBjZk9wY29kZSgpOwotICAgIHN3aXRjaCAoYXBjZl9vcGNvZGUpIHsKLSAgICAgIGNhc2UgQXBjZk9wY29kZTo6RU5BQkxFOiB7Ci0gICAgICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlQWR2RmlsdGVyRW5hYmxlQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RhdHVzX3ZpZXcpOwotICAgICAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PbkZpbHRlckVuYWJsZShjb21wbGV0ZV92aWV3LkdldEFwY2ZFbmFibGUoKSwgKHVpbnQ4X3QpY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBBcGNmT3Bjb2RlOjpTRVRfRklMVEVSSU5HX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVBZHZGaWx0ZXJTZXRGaWx0ZXJpbmdQYXJhbWV0ZXJzQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RhdHVzX3ZpZXcpOwotICAgICAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PbkZpbHRlclBhcmFtU2V0dXAoCi0gICAgICAgICAgICBjb21wbGV0ZV92aWV3LkdldEFwY2ZBdmFpbGFibGVTcGFjZXMoKSwgY29tcGxldGVfdmlldy5HZXRBcGNmQWN0aW9uKCksICh1aW50OF90KWNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQXBjZk9wY29kZTo6QlJPQURDQVNURVJfQUREUkVTUzogewotICAgICAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZUFkdkZpbHRlckJyb2FkY2FzdGVyQWRkcmVzc0NvbXBsZXRlVmlldzo6Q3JlYXRlKHN0YXR1c192aWV3KTsKLSAgICAgICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25GaWx0ZXJDb25maWdDYWxsYmFjaygKLSAgICAgICAgICAgIEFwY2ZGaWx0ZXJUeXBlOjpCUk9BRENBU1RFUl9BRERSRVNTLAotICAgICAgICAgICAgY29tcGxldGVfdmlldy5HZXRBcGNmQXZhaWxhYmxlU3BhY2VzKCksCi0gICAgICAgICAgICBjb21wbGV0ZV92aWV3LkdldEFwY2ZBY3Rpb24oKSwKLSAgICAgICAgICAgICh1aW50OF90KWNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQXBjZk9wY29kZTo6U0VSVklDRV9VVUlEOiB7Ci0gICAgICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlQWR2RmlsdGVyU2VydmljZVV1aWRDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGF0dXNfdmlldyk7Ci0gICAgICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICAgIHNjYW5uaW5nX2NhbGxiYWNrc18tPk9uRmlsdGVyQ29uZmlnQ2FsbGJhY2soCi0gICAgICAgICAgICBBcGNmRmlsdGVyVHlwZTo6U0VSVklDRV9VVUlELAotICAgICAgICAgICAgY29tcGxldGVfdmlldy5HZXRBcGNmQXZhaWxhYmxlU3BhY2VzKCksCi0gICAgICAgICAgICBjb21wbGV0ZV92aWV3LkdldEFwY2ZBY3Rpb24oKSwKLSAgICAgICAgICAgICh1aW50OF90KWNvbXBsZXRlX3ZpZXcuR2V0U3RhdHVzKCkpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQXBjZk9wY29kZTo6U0VSVklDRV9TT0xJQ0lUQVRJT05fVVVJRDogewotICAgICAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZUFkdkZpbHRlclNvbGljaXRhdGlvblV1aWRDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGF0dXNfdmlldyk7Ci0gICAgICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICAgIHNjYW5uaW5nX2NhbGxiYWNrc18tPk9uRmlsdGVyQ29uZmlnQ2FsbGJhY2soCi0gICAgICAgICAgICBBcGNmRmlsdGVyVHlwZTo6U0VSVklDRV9TT0xJQ0lUQVRJT05fVVVJRCwKLSAgICAgICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0QXBjZkF2YWlsYWJsZVNwYWNlcygpLAotICAgICAgICAgICAgY29tcGxldGVfdmlldy5HZXRBcGNmQWN0aW9uKCksCi0gICAgICAgICAgICAodWludDhfdCljb21wbGV0ZV92aWV3LkdldFN0YXR1cygpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFwY2ZPcGNvZGU6OkxPQ0FMX05BTUU6IHsKLSAgICAgICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVBZHZGaWx0ZXJMb2NhbE5hbWVDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGF0dXNfdmlldyk7Ci0gICAgICAgIEFTU0VSVChjb21wbGV0ZV92aWV3LklzVmFsaWQoKSk7Ci0gICAgICAgIHNjYW5uaW5nX2NhbGxiYWNrc18tPk9uRmlsdGVyQ29uZmlnQ2FsbGJhY2soCi0gICAgICAgICAgICBBcGNmRmlsdGVyVHlwZTo6TE9DQUxfTkFNRSwKLSAgICAgICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0QXBjZkF2YWlsYWJsZVNwYWNlcygpLAotICAgICAgICAgICAgY29tcGxldGVfdmlldy5HZXRBcGNmQWN0aW9uKCksCi0gICAgICAgICAgICAodWludDhfdCljb21wbGV0ZV92aWV3LkdldFN0YXR1cygpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFwY2ZPcGNvZGU6Ok1BTlVGQUNUVVJFUl9EQVRBOiB7Ci0gICAgICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlQWR2RmlsdGVyTWFudWZhY3R1cmVyRGF0YUNvbXBsZXRlVmlldzo6Q3JlYXRlKHN0YXR1c192aWV3KTsKLSAgICAgICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25GaWx0ZXJDb25maWdDYWxsYmFjaygKLSAgICAgICAgICAgIEFwY2ZGaWx0ZXJUeXBlOjpNQU5VRkFDVFVSRVJfREFUQSwKLSAgICAgICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0QXBjZkF2YWlsYWJsZVNwYWNlcygpLAotICAgICAgICAgICAgY29tcGxldGVfdmlldy5HZXRBcGNmQWN0aW9uKCksCi0gICAgICAgICAgICAodWludDhfdCljb21wbGV0ZV92aWV3LkdldFN0YXR1cygpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFwY2ZPcGNvZGU6OlNFUlZJQ0VfREFUQTogewotICAgICAgICBhdXRvIGNvbXBsZXRlX3ZpZXcgPSBMZUFkdkZpbHRlclNlcnZpY2VEYXRhQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RhdHVzX3ZpZXcpOwotICAgICAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBzY2FubmluZ19jYWxsYmFja3NfLT5PbkZpbHRlckNvbmZpZ0NhbGxiYWNrKAotICAgICAgICAgICAgQXBjZkZpbHRlclR5cGU6OlNFUlZJQ0VfREFUQSwKLSAgICAgICAgICAgIGNvbXBsZXRlX3ZpZXcuR2V0QXBjZkF2YWlsYWJsZVNwYWNlcygpLAotICAgICAgICAgICAgY29tcGxldGVfdmlldy5HZXRBcGNmQWN0aW9uKCksCi0gICAgICAgICAgICAodWludDhfdCljb21wbGV0ZV92aWV3LkdldFN0YXR1cygpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfV0FSTigiVW5leHBlY3RlZCBldmVudCB0eXBlICVzIiwgT3BDb2RlVGV4dCh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvbl9iYXRjaF9zY2FuX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXNfdmlldyA9IExlQmF0Y2hTY2FuQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgaWYgKHN0YXR1c192aWV3LkdldFN0YXR1cygpICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgIkdvdCBhIENvbW1hbmQgY29tcGxldGUgJXMsIHN0YXR1cyAlcywgYmF0Y2hfc2Nhbl9vcGNvZGUgJXMiLAotICAgICAgICAgIE9wQ29kZVRleHQodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpLmNfc3RyKCksCi0gICAgICAgICAgRXJyb3JDb2RlVGV4dChzdGF0dXNfdmlldy5HZXRTdGF0dXMoKSkuY19zdHIoKSwKLSAgICAgICAgICBCYXRjaFNjYW5PcGNvZGVUZXh0KHN0YXR1c192aWV3LkdldEJhdGNoU2Nhbk9wY29kZSgpKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9uX2JhdGNoX3NjYW5fZW5hYmxlX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXNfdmlldyA9IExlQmF0Y2hTY2FuQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVCYXRjaFNjYW5FbmFibGVDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGF0dXNfdmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBpZiAoc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgIT0gRXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICBMT0dfSU5GTygiR290IGJhdGNoIHNjYW4gZW5hYmxlIGNvbXBsZXRlLCBzdGF0dXMgJXMiLCBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICAgIGJhdGNoX3NjYW5fY29uZmlnXy5jdXJyZW50X3N0YXRlID0gQmF0Y2hTY2FuU3RhdGU6OkVSUk9SX1NUQVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICBiYXRjaF9zY2FuX2NvbmZpZ18uY3VycmVudF9zdGF0ZSA9IEJhdGNoU2NhblN0YXRlOjpFTkFCTEVEX1NUQVRFOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fYmF0Y2hfc2Nhbl9kaXNhYmxlX2NvbXBsZXRlKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBzdGF0dXNfdmlldyA9IExlQmF0Y2hTY2FuQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgQVNTRVJUKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgYXV0byBjb21wbGV0ZV92aWV3ID0gTGVCYXRjaFNjYW5TZXRTY2FuUGFyYW1ldGVyc0NvbXBsZXRlVmlldzo6Q3JlYXRlKHN0YXR1c192aWV3KTsKLSAgICBBU1NFUlQoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEFTU0VSVChzdGF0dXNfdmlldy5HZXRTdGF0dXMoKSA9PSBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgIGJhdGNoX3NjYW5fY29uZmlnXy5jdXJyZW50X3N0YXRlID0gQmF0Y2hTY2FuU3RhdGU6OkRJU0FCTEVEX1NUQVRFOwotICB9Ci0KLSAgdm9pZCBvbl9iYXRjaF9zY2FuX3JlYWRfcmVzdWx0X2NvbXBsZXRlKAotICAgICAgU2Nhbm5lcklkIHNjYW5uZXJfaWQsIHVpbnQxNl90IHRvdGFsX251bV9vZl9yZWNvcmRzLCBDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICAgIGF1dG8gc3RhdHVzX3ZpZXcgPSBMZUJhdGNoU2NhbkNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgIEFTU0VSVChzdGF0dXNfdmlldy5Jc1ZhbGlkKCkpOwotICAgIGF1dG8gY29tcGxldGVfdmlldyA9IExlQmF0Y2hTY2FuUmVhZFJlc3VsdFBhcmFtZXRlcnNDb21wbGV0ZVJhd1ZpZXc6OkNyZWF0ZShzdGF0dXNfdmlldyk7Ci0gICAgQVNTRVJUKGNvbXBsZXRlX3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBpZiAoY29tcGxldGVfdmlldy5HZXRTdGF0dXMoKSAhPSBFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIExPR19JTkZPKCJHb3QgYmF0Y2ggc2NhbiByZWFkIHJlc3VsdCBjb21wbGV0ZSwgc3RhdHVzICVzIiwgRXJyb3JDb2RlVGV4dChzdGF0dXNfdmlldy5HZXRTdGF0dXMoKSkuY19zdHIoKSk7Ci0gICAgfQotICAgIHVpbnQ4X3QgbnVtX29mX3JlY29yZHMgPSBjb21wbGV0ZV92aWV3LkdldE51bU9mUmVjb3JkcygpOwotICAgIGF1dG8gcmVwb3J0X2Zvcm1hdCA9IGNvbXBsZXRlX3ZpZXcuR2V0QmF0Y2hTY2FuRGF0YVJlYWQoKTsKLSAgICBpZiAobnVtX29mX3JlY29yZHMgPT0gMCkgewotICAgICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25CYXRjaFNjYW5SZXBvcnRzKAotICAgICAgICAgIHNjYW5uZXJfaWQsIDB4MDAsIChpbnQpcmVwb3J0X2Zvcm1hdCwgdG90YWxfbnVtX29mX3JlY29yZHMsIGJhdGNoX3NjYW5fcmVzdWx0X2NhY2hlX1tzY2FubmVyX2lkXSk7Ci0gICAgICBiYXRjaF9zY2FuX3Jlc3VsdF9jYWNoZV8uZXJhc2Uoc2Nhbm5lcl9pZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF1dG8gcmF3X2RhdGEgPSBjb21wbGV0ZV92aWV3LkdldFJhd0RhdGEoKTsKLSAgICAgIGJhdGNoX3NjYW5fcmVzdWx0X2NhY2hlX1tzY2FubmVyX2lkXS5pbnNlcnQoCi0gICAgICAgICAgYmF0Y2hfc2Nhbl9yZXN1bHRfY2FjaGVfW3NjYW5uZXJfaWRdLmVuZCgpLCByYXdfZGF0YS5iZWdpbigpLCByYXdfZGF0YS5lbmQoKSk7Ci0gICAgICB0b3RhbF9udW1fb2ZfcmVjb3JkcyArPSBudW1fb2ZfcmVjb3JkczsKLSAgICAgIGJhdGNoX3NjYW5fcmVhZF9yZXN1bHRzKHNjYW5uZXJfaWQsIHRvdGFsX251bV9vZl9yZWNvcmRzLCBzdGF0aWNfY2FzdDxCYXRjaFNjYW5Nb2RlPihyZXBvcnRfZm9ybWF0KSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvbl9zdG9yYWdlX3RocmVzaG9sZF9icmVhY2goVmVuZG9yU3BlY2lmaWNFdmVudFZpZXcgZXZlbnQpIHsKLSAgICBpZiAoYmF0Y2hfc2Nhbl9jb25maWdfLnJlZl92YWx1ZSA9PSBrSW52YWxpZFNjYW5uZXJJZCkgewotICAgICAgTE9HX1dBUk4oInN0b3JhZ2UgdGhyZXNob2xkIHdhcyBub3Qgc2V0ICEhIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHNjYW5uaW5nX2NhbGxiYWNrc18tPk9uQmF0Y2hTY2FuVGhyZXNob2xkQ3Jvc3NlZChzdGF0aWNfY2FzdDxpbnQ+KGJhdGNoX3NjYW5fY29uZmlnXy5yZWZfdmFsdWUpKTsKLSAgfQotCi0gIHZvaWQgb25fYWR2ZXJ0aXNlbWVudF90cmFja2luZyhWZW5kb3JTcGVjaWZpY0V2ZW50VmlldyBldmVudCkgewotICAgIGlmICh0cmFja2VyX2lkID09IGtJbnZhbGlkU2Nhbm5lcklkKSB7Ci0gICAgICBMT0dfV0FSTigiQWR2ZXJ0aXNlbWVudCB0cmFjayBpcyBub3QgcmVnaXN0ZXIiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXV0byB2aWV3ID0gTEVBZHZlcnRpc2VtZW50VHJhY2tpbmdFdmVudFZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBBZHZlcnRpc2luZ0ZpbHRlck9uRm91bmRPbkxvc3RJbmZvIG9uX2ZvdW5kX29uX2xvc3RfaW5mbyA9IHt9OwotICAgIG9uX2ZvdW5kX29uX2xvc3RfaW5mby5zY2FubmVyX2lkID0gdHJhY2tlcl9pZDsKLSAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uZmlsdGVyX2luZGV4ID0gdmlldy5HZXRBcGNmRmlsdGVySW5kZXgoKTsKLSAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9zdGF0ZSA9IHZpZXcuR2V0QWR2ZXJ0aXNlclN0YXRlKCk7Ci0gICAgb25fZm91bmRfb25fbG9zdF9pbmZvLmFkdmVydGlzZXJfYWRkcmVzcyA9IHZpZXcuR2V0QWR2ZXJ0aXNlckFkZHJlc3MoKTsKLSAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9hZGRyZXNzX3R5cGUgPSB2aWV3LkdldEFkdmVydGlzZXJBZGRyZXNzVHlwZSgpOwotICAgIG9uX2ZvdW5kX29uX2xvc3RfaW5mby5hZHZlcnRpc2VyX2luZm9fcHJlc2VudCA9IHZpZXcuR2V0QWR2dEluZm9QcmVzZW50KCk7Ci0gICAgLyogRXh0cmFjdCB0aGUgYWR2IGluZm8gZGV0YWlscyAqLwotICAgIGlmIChvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9pbmZvX3ByZXNlbnQgPT0gQWR2dEluZm9QcmVzZW50OjpBRFZUX0lORk9fUFJFU0VOVCkgewotICAgICAgYXV0byBpbmZvX3ZpZXcgPSBMRUFkdmVydGlzZW1lbnRUcmFja2luZ1dpdGhJbmZvRXZlbnRWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQoaW5mb192aWV3LklzVmFsaWQoKSk7Ci0gICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8udHhfcG93ZXIgPSBpbmZvX3ZpZXcuR2V0VHhQb3dlcigpOwotICAgICAgb25fZm91bmRfb25fbG9zdF9pbmZvLnJzc2kgPSBpbmZvX3ZpZXcuR2V0UnNzaSgpOwotICAgICAgb25fZm91bmRfb25fbG9zdF9pbmZvLnRpbWVfc3RhbXAgPSBpbmZvX3ZpZXcuR2V0VGltZXN0YW1wKCk7Ci0gICAgICBhdXRvIGFkdl9kYXRhID0gaW5mb192aWV3LkdldEFkdlBhY2tldCgpOwotICAgICAgb25fZm91bmRfb25fbG9zdF9pbmZvLmFkdl9wYWNrZXQucmVzZXJ2ZShhZHZfZGF0YS5zaXplKCkpOwotICAgICAgb25fZm91bmRfb25fbG9zdF9pbmZvLmFkdl9wYWNrZXQuaW5zZXJ0KG9uX2ZvdW5kX29uX2xvc3RfaW5mby5hZHZfcGFja2V0LmVuZCgpLCBhZHZfZGF0YS5iZWdpbigpLCBhZHZfZGF0YS5lbmQoKSk7Ci0gICAgICBhdXRvIHNjYW5fcnNwX2RhdGEgPSBpbmZvX3ZpZXcuR2V0U2NhblJlc3BvbnNlKCk7Ci0gICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uc2Nhbl9yZXNwb25zZS5yZXNlcnZlKHNjYW5fcnNwX2RhdGEuc2l6ZSgpKTsKLSAgICAgIG9uX2ZvdW5kX29uX2xvc3RfaW5mby5zY2FuX3Jlc3BvbnNlLmluc2VydCgKLSAgICAgICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uc2Nhbl9yZXNwb25zZS5lbmQoKSwgc2Nhbl9yc3BfZGF0YS5iZWdpbigpLCBzY2FuX3JzcF9kYXRhLmVuZCgpKTsKLSAgICB9Ci0gICAgc2Nhbm5pbmdfY2FsbGJhY2tzXy0+T25UcmFja0FkdkZvdW5kTG9zdChvbl9mb3VuZF9vbl9sb3N0X2luZm8pOwotICB9Ci0KLSAgdm9pZCBPblBhdXNlKCkgb3ZlcnJpZGUgewotICAgIHBhdXNlZF8gPSB0cnVlOwotICAgIHNjYW5fb25fcmVzdW1lXyA9IGlzX3NjYW5uaW5nXzsKLSAgICBzdG9wX3NjYW4oKTsKLSAgICBhY2tfcGF1c2UoKTsKLSAgfQotCi0gIHZvaWQgYWNrX3BhdXNlKCkgewotICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkFja1BhdXNlKHRoaXMpOwotICB9Ci0KLSAgdm9pZCBPblJlc3VtZSgpIG92ZXJyaWRlIHsKLSAgICBwYXVzZWRfID0gZmFsc2U7Ci0gICAgaWYgKHNjYW5fb25fcmVzdW1lXyA9PSB0cnVlKSB7Ci0gICAgICBzdGFydF9zY2FuKCk7Ci0gICAgfQotICAgIGxlX2FkZHJlc3NfbWFuYWdlcl8tPkFja1Jlc3VtZSh0aGlzKTsKLSAgfQotCi0gIFNjYW5BcGlUeXBlIGFwaV90eXBlXzsKLQotICBNb2R1bGUqIG1vZHVsZV87Ci0gIG9zOjpIYW5kbGVyKiBtb2R1bGVfaGFuZGxlcl87Ci0gIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllcl87Ci0gIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlcl87Ci0gIGhjaTo6VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIqIHZlbmRvcl9zcGVjaWZpY19ldmVudF9tYW5hZ2VyXzsKLSAgaGNpOjpMZVNjYW5uaW5nSW50ZXJmYWNlKiBsZV9zY2FubmluZ19pbnRlcmZhY2VfOwotICBoY2k6OkxlQWRkcmVzc01hbmFnZXIqIGxlX2FkZHJlc3NfbWFuYWdlcl87Ci0gIGJvb2wgYWRkcmVzc19tYW5hZ2VyX3JlZ2lzdGVyZWRfID0gZmFsc2U7Ci0gIE51bGxTY2FubmluZ0NhbGxiYWNrIG51bGxfc2Nhbm5pbmdfY2FsbGJhY2tfOwotICBTY2FubmluZ0NhbGxiYWNrKiBzY2FubmluZ19jYWxsYmFja3NfID0gJm51bGxfc2Nhbm5pbmdfY2FsbGJhY2tfOwotICBzdGQ6OnZlY3RvcjxTY2FubmVyPiBzY2FubmVyc187Ci0gIGJvb2wgaXNfc2Nhbm5pbmdfID0gZmFsc2U7Ci0gIGJvb2wgc2Nhbl9vbl9yZXN1bWVfID0gZmFsc2U7Ci0gIGJvb2wgcGF1c2VkXyA9IGZhbHNlOwotICBBZHZlcnRpc2luZ0NhY2hlIGFkdmVydGlzaW5nX2NhY2hlXzsKLSAgYm9vbCBpc19maWx0ZXJfc3VwcG9ydF8gPSBmYWxzZTsKLSAgYm9vbCBpc19iYXRjaF9zY2FuX3N1cHBvcnRfID0gZmFsc2U7Ci0KLSAgTGVTY2FuVHlwZSBsZV9zY2FuX3R5cGVfID0gTGVTY2FuVHlwZTo6QUNUSVZFOwotICB1aW50MzJfdCBpbnRlcnZhbF9tc197MTAwMH07Ci0gIHVpbnQxNl90IHdpbmRvd19tc197MTAwMH07Ci0gIE93bkFkZHJlc3NUeXBlIG93bl9hZGRyZXNzX3R5cGVfe093bkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9OwotICBMZVNjYW5uaW5nRmlsdGVyUG9saWN5IGZpbHRlcl9wb2xpY3lfe0xlU2Nhbm5pbmdGaWx0ZXJQb2xpY3k6OkFDQ0VQVF9BTEx9OwotICBCYXRjaFNjYW5Db25maWcgYmF0Y2hfc2Nhbl9jb25maWdfOwotICBzdGQ6Om1hcDxTY2FubmVySWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBiYXRjaF9zY2FuX3Jlc3VsdF9jYWNoZV87Ci0gIFNjYW5uZXJJZCB0cmFja2VyX2lkID0ga0ludmFsaWRTY2FubmVySWQ7Ci0KLSAgc3RhdGljIHZvaWQgY2hlY2tfc3RhdHVzKENvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICAgIHN3aXRjaCAodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpIHsKLSAgICAgIGNhc2UgKE9wQ29kZTo6TEVfU0VUX1NDQU5fRU5BQkxFKTogewotICAgICAgICBhdXRvIHN0YXR1c192aWV3ID0gTGVTZXRTY2FuRW5hYmxlQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICAgIEFTU0VSVChzdGF0dXNfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgICAgc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAgICAgIlJlY2VpdmUgc2V0IHNjYW4gZW5hYmxlIHdpdGggZXJyb3IgY29kZSAlcyIsCi0gICAgICAgICAgICBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9TQ0FOX0VOQUJMRSk6IHsKLSAgICAgICAgYXV0byBzdGF0dXNfdmlldyA9IExlU2V0RXh0ZW5kZWRTY2FuRW5hYmxlQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICAgIEFTU0VSVChzdGF0dXNfdmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICBBU1NFUlRfTE9HKAotICAgICAgICAgICAgc3RhdHVzX3ZpZXcuR2V0U3RhdHVzKCkgPT0gRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAgICAgIlJlY2VpdmUgc2V0IGV4dGVuZGVkIHNjYW4gZW5hYmxlIHdpdGggZXJyb3IgY29kZSAlcyIsCi0gICAgICAgICAgICBFcnJvckNvZGVUZXh0KHN0YXR1c192aWV3LkdldFN0YXR1cygpKS5jX3N0cigpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmhhbmRsZWQgZXZlbnQgJXMiLCBPcENvZGVUZXh0KHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX07Ci0KLUxlU2Nhbm5pbmdNYW5hZ2VyOjpMZVNjYW5uaW5nTWFuYWdlcigpIHsKLSAgcGltcGxfID0gc3RkOjptYWtlX3VuaXF1ZTxpbXBsPih0aGlzKTsKLX0KLQotdm9pZCBMZVNjYW5uaW5nTWFuYWdlcjo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxoY2k6OkhjaUxheWVyPigpOwotICBsaXN0LT5hZGQ8aGNpOjpWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcj4oKTsKLSAgbGlzdC0+YWRkPGhjaTo6Q29udHJvbGxlcj4oKTsKLSAgbGlzdC0+YWRkPGhjaTo6QWNsTWFuYWdlcj4oKTsKLX0KLQotdm9pZCBMZVNjYW5uaW5nTWFuYWdlcjo6U3RhcnQoKSB7Ci0gIHBpbXBsXy0+c3RhcnQoCi0gICAgICBHZXRIYW5kbGVyKCksCi0gICAgICBHZXREZXBlbmRlbmN5PGhjaTo6SGNpTGF5ZXI+KCksCi0gICAgICBHZXREZXBlbmRlbmN5PGhjaTo6Q29udHJvbGxlcj4oKSwKLSAgICAgIEdldERlcGVuZGVuY3k8QWNsTWFuYWdlcj4oKSwKLSAgICAgIEdldERlcGVuZGVuY3k8VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXI+KCkpOwotfQotCi12b2lkIExlU2Nhbm5pbmdNYW5hZ2VyOjpTdG9wKCkgewotICBwaW1wbF8tPnN0b3AoKTsKLSAgcGltcGxfLnJlc2V0KCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIExlU2Nhbm5pbmdNYW5hZ2VyOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICJMZSBTY2FubmluZyBNYW5hZ2VyIjsKLX0KLQotdm9pZCBMZVNjYW5uaW5nTWFuYWdlcjo6UmVnaXN0ZXJTY2FubmVyKFV1aWQgYXBwX3V1aWQpIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6OnJlZ2lzdGVyX3NjYW5uZXIsIGFwcF91dWlkKTsKLX0KLQotdm9pZCBMZVNjYW5uaW5nTWFuYWdlcjo6VW5yZWdpc3RlcihTY2FubmVySWQgc2Nhbm5lcl9pZCkgewotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6dW5yZWdpc3Rlcl9zY2FubmVyLCBzY2FubmVyX2lkKTsKLX0KLQotdm9pZCBMZVNjYW5uaW5nTWFuYWdlcjo6U2Nhbihib29sIHN0YXJ0KSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpzY2FuLCBzdGFydCk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXI6OlNldFNjYW5QYXJhbWV0ZXJzKAotICAgIFNjYW5uZXJJZCBzY2FubmVyX2lkLCBMZVNjYW5UeXBlIHNjYW5fdHlwZSwgdWludDE2X3Qgc2Nhbl9pbnRlcnZhbCwgdWludDE2X3Qgc2Nhbl93aW5kb3cpIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6OnNldF9zY2FuX3BhcmFtZXRlcnMsIHNjYW5uZXJfaWQsIHNjYW5fdHlwZSwgc2Nhbl9pbnRlcnZhbCwgc2Nhbl93aW5kb3cpOwotfQotCi12b2lkIExlU2Nhbm5pbmdNYW5hZ2VyOjpTY2FuRmlsdGVyRW5hYmxlKGJvb2wgZW5hYmxlKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpzY2FuX2ZpbHRlcl9lbmFibGUsIGVuYWJsZSk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXI6OlNjYW5GaWx0ZXJQYXJhbWV0ZXJTZXR1cCgKLSAgICBBcGNmQWN0aW9uIGFjdGlvbiwgdWludDhfdCBmaWx0ZXJfaW5kZXgsIEFkdmVydGlzaW5nRmlsdGVyUGFyYW1ldGVyIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIpIHsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJmltcGw6OnNjYW5fZmlsdGVyX3BhcmFtZXRlcl9zZXR1cCwgYWN0aW9uLCBmaWx0ZXJfaW5kZXgsIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIpOwotfQotCi12b2lkIExlU2Nhbm5pbmdNYW5hZ2VyOjpTY2FuRmlsdGVyQWRkKAotICAgIHVpbnQ4X3QgZmlsdGVyX2luZGV4LCBzdGQ6OnZlY3RvcjxBZHZlcnRpc2luZ1BhY2tldENvbnRlbnRGaWx0ZXJDb21tYW5kPiBmaWx0ZXJzKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpzY2FuX2ZpbHRlcl9hZGQsIGZpbHRlcl9pbmRleCwgZmlsdGVycyk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXI6OkJhdGNoU2NhbkNvbmlmZ1N0b3JhZ2UoCi0gICAgdWludDhfdCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY2F0ZWRfbWF4LAotICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAotICAgIFNjYW5uZXJJZCBzY2FubmVyX2lkKSB7Ci0gIENhbGxPbigKLSAgICAgIHBpbXBsXy5nZXQoKSwKLSAgICAgICZpbXBsOjpiYXRjaF9zY2FuX3NldF9zdG9yYWdlX3BhcmFtZXRlciwKLSAgICAgIGJhdGNoX3NjYW5fZnVsbF9tYXgsCi0gICAgICBiYXRjaF9zY2FuX3RydW5jYXRlZF9tYXgsCi0gICAgICBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQsCi0gICAgICBzY2FubmVyX2lkKTsKLX0KLQotdm9pZCBMZVNjYW5uaW5nTWFuYWdlcjo6QmF0Y2hTY2FuRW5hYmxlKAotICAgIEJhdGNoU2Nhbk1vZGUgc2Nhbl9tb2RlLAotICAgIHVpbnQzMl90IGR1dHlfY3ljbGVfc2Nhbl93aW5kb3dfc2xvdHMsCi0gICAgdWludDMyX3QgZHV0eV9jeWNsZV9zY2FuX2ludGVydmFsX3Nsb3RzLAotICAgIEJhdGNoU2NhbkRpc2NhcmRSdWxlIGJhdGNoX3NjYW5fZGlzY2FyZF9ydWxlKSB7Ci0gIENhbGxPbigKLSAgICAgIHBpbXBsXy5nZXQoKSwKLSAgICAgICZpbXBsOjpiYXRjaF9zY2FuX2VuYWJsZSwKLSAgICAgIHNjYW5fbW9kZSwKLSAgICAgIGR1dHlfY3ljbGVfc2Nhbl93aW5kb3dfc2xvdHMsCi0gICAgICBkdXR5X2N5Y2xlX3NjYW5faW50ZXJ2YWxfc2xvdHMsCi0gICAgICBiYXRjaF9zY2FuX2Rpc2NhcmRfcnVsZSk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXI6OkJhdGNoU2NhbkRpc2FibGUoKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpiYXRjaF9zY2FuX2Rpc2FibGUpOwotfQotCi12b2lkIExlU2Nhbm5pbmdNYW5hZ2VyOjpCYXRjaFNjYW5SZWFkUmVwb3J0KFNjYW5uZXJJZCBzY2FubmVyX2lkLCBCYXRjaFNjYW5Nb2RlIHNjYW5fbW9kZSkgewotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6YmF0Y2hfc2Nhbl9yZWFkX3Jlc3VsdHMsIHNjYW5uZXJfaWQsIDAsIHNjYW5fbW9kZSk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXI6OlRyYWNrQWR2ZXJ0aXNlcihTY2FubmVySWQgc2Nhbm5lcl9pZCkgewotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6dHJhY2tfYWR2ZXJ0aXNlciwgc2Nhbm5lcl9pZCk7Ci19Ci0KLXZvaWQgTGVTY2FubmluZ01hbmFnZXI6OlJlZ2lzdGVyU2Nhbm5pbmdDYWxsYmFjayhTY2FubmluZ0NhbGxiYWNrKiBzY2FubmluZ19jYWxsYmFjaykgewotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6cmVnaXN0ZXJfc2Nhbm5pbmdfY2FsbGJhY2ssIHNjYW5uaW5nX2NhbGxiYWNrKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL2xlX3NjYW5uaW5nX21hbmFnZXIuaCBiL2dkL2hjaS9sZV9zY2FubmluZ19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTAzNjYuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL2xlX3NjYW5uaW5nX21hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJoY2kvdXVpZC5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi11c2luZyBTY2FubmVySWQgPSB1aW50OF90OwotCi1jbGFzcyBBZHZlcnRpc2luZ0ZpbHRlck9uRm91bmRPbkxvc3RJbmZvIHsKLSBwdWJsaWM6Ci0gIHVpbnQ4X3Qgc2Nhbm5lcl9pZDsKLSAgdWludDhfdCBmaWx0ZXJfaW5kZXg7Ci0gIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9zdGF0ZTsKLSAgQWR2dEluZm9QcmVzZW50IGFkdmVydGlzZXJfaW5mb19wcmVzZW50OwotICBBZGRyZXNzIGFkdmVydGlzZXJfYWRkcmVzczsKLSAgdWludDhfdCBhZHZlcnRpc2VyX2FkZHJlc3NfdHlwZTsKLSAgdWludDhfdCB0eF9wb3dlcjsKLSAgaW50OF90IHJzc2k7Ci0gIHVpbnQxNl90IHRpbWVfc3RhbXA7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9wYWNrZXQ7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2U7Ci19OwotCi1jbGFzcyBTY2FubmluZ0NhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIGVudW0gU2Nhbm5pbmdTdGF0dXMgewotICAgIFNVQ0NFU1MsCi0gICAgTk9fUkVTT1VSQ0VTID0gMHg4MCwKLSAgICBJTlRFUk5BTF9FUlJPUiA9IDB4ODUsCi0gICAgSUxMRUdBTF9QQVJBTUVURVIgPSAweDg3LAotICB9OwotCi0gIHZpcnR1YWwgflNjYW5uaW5nQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgdm9pZCBPblNjYW5uZXJSZWdpc3RlcmVkKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OlV1aWQgYXBwX3V1aWQsIFNjYW5uZXJJZCBzY2FubmVyX2lkLCBTY2FubmluZ1N0YXR1cyBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uU2V0U2Nhbm5lclBhcmFtZXRlckNvbXBsZXRlKFNjYW5uZXJJZCBzY2FubmVyX2lkLCBTY2FubmluZ1N0YXR1cyBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uU2NhblJlc3VsdCgKLSAgICAgIHVpbnQxNl90IGV2ZW50X3R5cGUsCi0gICAgICB1aW50OF90IGFkZHJlc3NfdHlwZSwKLSAgICAgIEFkZHJlc3MgYWRkcmVzcywKLSAgICAgIHVpbnQ4X3QgcHJpbWFyeV9waHksCi0gICAgICB1aW50OF90IHNlY29uZGFyeV9waHksCi0gICAgICB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwKLSAgICAgIGludDhfdCB0eF9wb3dlciwKLSAgICAgIGludDhfdCByc3NpLAotICAgICAgdWludDE2X3QgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfaW50ZXJ2YWwsCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2luZ19kYXRhKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblRyYWNrQWR2Rm91bmRMb3N0KEFkdmVydGlzaW5nRmlsdGVyT25Gb3VuZE9uTG9zdEluZm8gb25fZm91bmRfb25fbG9zdF9pbmZvKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkJhdGNoU2NhblJlcG9ydHMoCi0gICAgICBpbnQgY2xpZW50X2lmLCBpbnQgc3RhdHVzLCBpbnQgcmVwb3J0X2Zvcm1hdCwgaW50IG51bV9yZWNvcmRzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkJhdGNoU2NhblRocmVzaG9sZENyb3NzZWQoaW50IGNsaWVudF9pZikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25UaW1lb3V0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25GaWx0ZXJFbmFibGUoRW5hYmxlIGVuYWJsZSwgdWludDhfdCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRmlsdGVyUGFyYW1TZXR1cCh1aW50OF90IGF2YWlsYWJsZV9zcGFjZXMsIEFwY2ZBY3Rpb24gYWN0aW9uLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25GaWx0ZXJDb25maWdDYWxsYmFjaygKLSAgICAgIEFwY2ZGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCB1aW50OF90IGF2YWlsYWJsZV9zcGFjZXMsIEFwY2ZBY3Rpb24gYWN0aW9uLCB1aW50OF90IHN0YXR1cykgPSAwOwotfTsKLQotY2xhc3MgQWR2ZXJ0aXNpbmdQYWNrZXRDb250ZW50RmlsdGVyQ29tbWFuZCB7Ci0gcHVibGljOgotICBBcGNmRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZTsKLSAgQWRkcmVzcyBhZGRyZXNzOwotICBBcGNmQXBwbGljYXRpb25BZGRyZXNzVHlwZSBhcHBsaWNhdGlvbl9hZGRyZXNzX3R5cGU7Ci0gIFV1aWQgdXVpZDsKLSAgVXVpZCB1dWlkX21hc2s7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5hbWU7Ci0gIHVpbnQxNl90IGNvbXBhbnk7Ci0gIHVpbnQxNl90IGNvbXBhbnlfbWFzazsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9tYXNrOwotfTsKLQotY2xhc3MgQWR2ZXJ0aXNpbmdGaWx0ZXJQYXJhbWV0ZXIgewotIHB1YmxpYzoKLSAgdWludDE2X3QgZmVhdHVyZV9zZWxlY3Rpb247Ci0gIHVpbnQxNl90IGxpc3RfbG9naWNfdHlwZTsKLSAgdWludDhfdCBmaWx0ZXJfbG9naWNfdHlwZTsKLSAgdWludDhfdCByc3NpX2hpZ2hfdGhyZXNoOwotICBEZWxpdmVyeU1vZGUgZGVsaXZlcnlfbW9kZTsKLSAgdWludDE2X3Qgb25mb3VuZF90aW1lb3V0OwotICB1aW50OF90IG9uZm91bmRfdGltZW91dF9jbnQ7Ci0gIHVpbnQ4X3QgcnNzaV9sb3dfdGhyZXM7Ci0gIHVpbnQxNl90IG9ubG9zdF90aW1lb3V0OwotICB1aW50MTZfdCBudW1fb2ZfdHJhY2tpbmdfZW50cmllczsKLX07Ci0KLWVudW0gY2xhc3MgQmF0Y2hTY2FuTW9kZSA6IHVpbnQ4X3QgewotICBESVNBQkxFID0gMCwKLSAgVFJVTkNBVEVEID0gMSwKLSAgRlVMTCA9IDIsCi0gIFRSVU5DQVRFRF9BTkRfRlVMTCA9IDMsCi19OwotCi1jbGFzcyBMZVNjYW5uaW5nTWFuYWdlciA6IHB1YmxpYyBibHVldG9vdGg6Ok1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga01heEFwcE51bSA9IDMyOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0FkdmVydGlzaW5nRGF0YUluZm9Ob3RQcmVzZW50ID0gMHhmZjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtUeFBvd2VySW5mb3JtYXRpb25Ob3RQcmVzZW50ID0gMHg3ZjsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtOb3RQZXJpb2RpY0FkdmVydGlzZW1lbnQgPSAweDAwOwotICBzdGF0aWMgY29uc3RleHByIFNjYW5uZXJJZCBrSW52YWxpZFNjYW5uZXJJZCA9IDB4RkY7Ci0gIExlU2Nhbm5pbmdNYW5hZ2VyKCk7Ci0KLSAgdm9pZCBSZWdpc3RlclNjYW5uZXIoY29uc3QgVXVpZCBhcHBfdXVpZCk7Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyKFNjYW5uZXJJZCBzY2FubmVyX2lkKTsKLQotICB2b2lkIFNjYW4oYm9vbCBzdGFydCk7Ci0KLSAgdm9pZCBTZXRTY2FuUGFyYW1ldGVycyhTY2FubmVySWQgc2Nhbm5lcl9pZCwgTGVTY2FuVHlwZSBzY2FuX3R5cGUsIHVpbnQxNl90IHNjYW5faW50ZXJ2YWwsIHVpbnQxNl90IHNjYW5fd2luZG93KTsKLQotICAvKiBTY2FuIGZpbHRlciAqLwotICB2b2lkIFNjYW5GaWx0ZXJFbmFibGUoYm9vbCBlbmFibGUpOwotCi0gIHZvaWQgU2NhbkZpbHRlclBhcmFtZXRlclNldHVwKAotICAgICAgQXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3QgZmlsdGVyX2luZGV4LCBBZHZlcnRpc2luZ0ZpbHRlclBhcmFtZXRlciBhZHZlcnRpc2luZ19maWx0ZXJfcGFyYW1ldGVyKTsKLQotICB2b2lkIFNjYW5GaWx0ZXJBZGQodWludDhfdCBmaWx0ZXJfaW5kZXgsIHN0ZDo6dmVjdG9yPEFkdmVydGlzaW5nUGFja2V0Q29udGVudEZpbHRlckNvbW1hbmQ+IGZpbHRlcnMpOwotCi0gIC8qQmF0Y2ggU2NhbiovCi0gIHZvaWQgQmF0Y2hTY2FuQ29uaWZnU3RvcmFnZSgKLSAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9mdWxsX21heCwKLSAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY2F0ZWRfbWF4LAotICAgICAgdWludDhfdCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQsCi0gICAgICBTY2FubmVySWQgc2Nhbm5lcl9pZCk7Ci0gIHZvaWQgQmF0Y2hTY2FuRW5hYmxlKAotICAgICAgQmF0Y2hTY2FuTW9kZSBzY2FuX21vZGUsCi0gICAgICB1aW50MzJfdCBkdXR5X2N5Y2xlX3NjYW5fd2luZG93X3Nsb3RzLAotICAgICAgdWludDMyX3QgZHV0eV9jeWNsZV9zY2FuX2ludGVydmFsX3Nsb3RzLAotICAgICAgQmF0Y2hTY2FuRGlzY2FyZFJ1bGUgYmF0Y2hfc2Nhbl9kaXNjYXJkX3J1bGUpOwotICB2b2lkIEJhdGNoU2NhbkRpc2FibGUoKTsKLSAgdm9pZCBCYXRjaFNjYW5SZWFkUmVwb3J0KFNjYW5uZXJJZCBzY2FubmVyX2lkLCBCYXRjaFNjYW5Nb2RlIHNjYW5fbW9kZSk7Ci0KLSAgdm9pZCBUcmFja0FkdmVydGlzZXIoU2Nhbm5lcklkIHNjYW5uZXJfaWQpOwotCi0gIHZvaWQgUmVnaXN0ZXJTY2FubmluZ0NhbGxiYWNrKFNjYW5uaW5nQ2FsbGJhY2sqIHNjYW5uaW5nX2NhbGxiYWNrKTsKLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExlU2Nhbm5pbmdNYW5hZ2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3QuY2MgYi9nZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWU2NDQ5Li4wMDAwMDAwCi0tLSBhL2dkL2hjaS9sZV9zY2FubmluZ19tYW5hZ2VyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJoY2kvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvbGVfc2Nhbm5pbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIHsKLQotdXNpbmcgcGFja2V0OjprTGl0dGxlRW5kaWFuOwotdXNpbmcgcGFja2V0OjpQYWNrZXRWaWV3OwotdXNpbmcgcGFja2V0OjpSYXdCdWlsZGVyOwotCi1QYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi1jbGFzcyBUZXN0Q29udHJvbGxlciA6IHB1YmxpYyBDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIGJvb2wgSXNTdXBwb3J0ZWQoT3BDb2RlIG9wX2NvZGUpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3VwcG9ydGVkX29wY29kZXNfLmNvdW50KG9wX2NvZGUpID09IDE7Ci0gIH0KLQotICB2b2lkIEFkZFN1cHBvcnRlZChPcENvZGUgb3BfY29kZSkgewotICAgIHN1cHBvcnRlZF9vcGNvZGVzXy5pbnNlcnQob3BfY29kZSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBvdmVycmlkZSB7fQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzZXQ8T3BDb2RlPiBzdXBwb3J0ZWRfb3Bjb2Rlc197fTsKLX07Ci0KLWNsYXNzIFRlc3RIY2lMYXllciA6IHB1YmxpYyBIY2lMYXllciB7Ci0gcHVibGljOgotICB2b2lkIEVucXVldWVDb21tYW5kKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZFN0YXR1c1ZpZXcpPiBvbl9zdGF0dXMpIG92ZXJyaWRlIHsKLSAgICBjb21tYW5kX3F1ZXVlXy5wdXNoKHN0ZDo6bW92ZShjb21tYW5kKSk7Ci0gICAgY29tbWFuZF9zdGF0dXNfY2FsbGJhY2tzLnB1c2hfYmFjayhzdGQ6Om1vdmUob25fc3RhdHVzKSk7Ci0gICAgaWYgKGNvbW1hbmRfcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgY29tbWFuZF9wcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgICBjb21tYW5kX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIGNvbW1hbmRfcXVldWVfLnB1c2goc3RkOjptb3ZlKGNvbW1hbmQpKTsKLSAgICBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKG9uX2NvbXBsZXRlKSk7Ci0gICAgaWYgKGNvbW1hbmRfcHJvbWlzZV8gIT0gbnVsbHB0cikgewotICAgICAgY29tbWFuZF9wcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgICBjb21tYW5kX3Byb21pc2VfLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpmdXR1cmU8dm9pZD4gR2V0Q29tbWFuZEZ1dHVyZSgpIHsKLSAgICBBU1NFUlRfTE9HKGNvbW1hbmRfcHJvbWlzZV8gPT0gbnVsbHB0ciwgIlByb21pc2VzIHByb21pc2VzIC4uLiBPbmx5IG9uZSBhdCBhIHRpbWUiKTsKLSAgICBjb21tYW5kX3Byb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgcmV0dXJuIGNvbW1hbmRfcHJvbWlzZV8tPmdldF9mdXR1cmUoKTsKLSAgfQotCi0gIENvbW1hbmRWaWV3IEdldExhc3RDb21tYW5kKCkgewotICAgIGlmIChjb21tYW5kX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gQ29tbWFuZFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KG51bGxwdHIpKTsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBsYXN0ID0gc3RkOjptb3ZlKGNvbW1hbmRfcXVldWVfLmZyb250KCkpOwotICAgICAgY29tbWFuZF9xdWV1ZV8ucG9wKCk7Ci0gICAgICByZXR1cm4gQ29tbWFuZFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0KSkpOwotICAgIH0KLSAgfQotCi0gIENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXcgR2V0Q29tbWFuZChPcENvZGUgb3BfY29kZSkgewotICAgIENvbW1hbmRWaWV3IGNvbW1hbmRfcGFja2V0X3ZpZXcgPSBHZXRMYXN0Q29tbWFuZCgpOwotICAgIGF1dG8gY29tbWFuZCA9IENvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZShBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0X3ZpZXcpKTsKLSAgICBFWFBFQ1RfVFJVRShjb21tYW5kLklzVmFsaWQoKSk7Ci0gICAgRVhQRUNUX0VRKGNvbW1hbmQuR2V0T3BDb2RlKCksIG9wX2NvZGUpOwotICAgIHJldHVybiBjb21tYW5kOwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGUgZXZlbnRfY29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSBvdmVycmlkZSB7Ci0gICAgcmVnaXN0ZXJlZF9ldmVudHNfW2V2ZW50X2NvZGVdID0gZXZlbnRfaGFuZGxlcjsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGUgZXZlbnRfY29kZSkgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfZXZlbnRzXy5lcmFzZShldmVudF9jb2RlKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoTGVNZXRhRXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfbGVfZXZlbnRzX1tzdWJldmVudF9jb2RlXSA9IGV2ZW50X2hhbmRsZXI7Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXJMZUV2ZW50SGFuZGxlcihTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSkgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfbGVfZXZlbnRzXy5lcmFzZShzdWJldmVudF9jb2RlKTsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdFdmVudChzdGQ6OnVuaXF1ZV9wdHI8RXZlbnRCdWlsZGVyPiBldmVudF9idWlsZGVyKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShldmVudF9idWlsZGVyKSk7Ci0gICAgRXZlbnRWaWV3IGV2ZW50ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfVFJVRShldmVudC5Jc1ZhbGlkKCkpOwotICAgIEV2ZW50Q29kZSBldmVudF9jb2RlID0gZXZlbnQuR2V0RXZlbnRDb2RlKCk7Ci0gICAgQVNTRVJUX05FKHJlZ2lzdGVyZWRfZXZlbnRzXy5maW5kKGV2ZW50X2NvZGUpLCByZWdpc3RlcmVkX2V2ZW50c18uZW5kKCkpIDw8IEV2ZW50Q29kZVRleHQoZXZlbnRfY29kZSk7Ci0gICAgcmVnaXN0ZXJlZF9ldmVudHNfW2V2ZW50X2NvZGVdLkludm9rZShldmVudCk7Ci0gIH0KLQotICB2b2lkIEluY29taW5nTGVNZXRhRXZlbnQoc3RkOjp1bmlxdWVfcHRyPExlTWV0YUV2ZW50QnVpbGRlcj4gZXZlbnRfYnVpbGRlcikgewotICAgIGF1dG8gcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoZXZlbnRfYnVpbGRlcikpOwotICAgIEV2ZW50VmlldyBldmVudCA9IEV2ZW50Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgTGVNZXRhRXZlbnRWaWV3IG1ldGFfZXZlbnRfdmlldyA9IExlTWV0YUV2ZW50Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlRfVFJVRShtZXRhX2V2ZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSA9IG1ldGFfZXZlbnRfdmlldy5HZXRTdWJldmVudENvZGUoKTsKLSAgICBBU1NFUlRfTkUocmVnaXN0ZXJlZF9sZV9ldmVudHNfLmZpbmQoc3ViZXZlbnRfY29kZSksIHJlZ2lzdGVyZWRfbGVfZXZlbnRzXy5lbmQoKSkKLSAgICAgICAgPDwgU3ViZXZlbnRDb2RlVGV4dChzdWJldmVudF9jb2RlKTsKLSAgICByZWdpc3RlcmVkX2xlX2V2ZW50c19bc3ViZXZlbnRfY29kZV0uSW52b2tlKG1ldGFfZXZlbnRfdmlldyk7Ci0gIH0KLQotICB2b2lkIENvbW1hbmRDb21wbGV0ZUNhbGxiYWNrKEV2ZW50VmlldyBldmVudCkgewotICAgIENvbW1hbmRDb21wbGV0ZVZpZXcgY29tcGxldGVfdmlldyA9IENvbW1hbmRDb21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUX1RSVUUoY29tcGxldGVfdmlldy5Jc1ZhbGlkKCkpOwotICAgIEFTU0VSVF9ORShjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5zaXplKCksIDApOwotICAgIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrcy5mcm9udCgpKS5JbnZva2UoY29tcGxldGVfdmlldyk7Ci0gICAgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFja3MucG9wX2Zyb250KCk7Ci0gIH0KLQotICB2b2lkIENvbW1hbmRTdGF0dXNDYWxsYmFjayhFdmVudFZpZXcgZXZlbnQpIHsKLSAgICBDb21tYW5kU3RhdHVzVmlldyBzdGF0dXNfdmlldyA9IENvbW1hbmRTdGF0dXNWaWV3OjpDcmVhdGUoZXZlbnQpOwotICAgIEFTU0VSVF9UUlVFKHN0YXR1c192aWV3LklzVmFsaWQoKSk7Ci0gICAgQVNTRVJUX05FKGNvbW1hbmRfc3RhdHVzX2NhbGxiYWNrcy5zaXplKCksIDApOwotICAgIHN0ZDo6bW92ZShjb21tYW5kX3N0YXR1c19jYWxsYmFja3MuZnJvbnQoKSkuSW52b2tlKHN0YXR1c192aWV3KTsKLSAgICBjb21tYW5kX3N0YXR1c19jYWxsYmFja3MucG9wX2Zyb250KCk7Ci0gIH0KLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHsKLSAgICBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGU6OkNPTU1BTkRfQ09NUExFVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0SGFuZGxlcigpLT5CaW5kT24odGhpcywgJlRlc3RIY2lMYXllcjo6Q29tbWFuZENvbXBsZXRlQ2FsbGJhY2spKTsKLSAgICBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGU6OkNPTU1BTkRfU1RBVFVTLCBHZXRIYW5kbGVyKCktPkJpbmRPbih0aGlzLCAmVGVzdEhjaUxheWVyOjpDb21tYW5kU3RhdHVzQ2FsbGJhY2spKTsKLSAgfQotICB2b2lkIFN0b3AoKSBvdmVycmlkZSB7fQotCi0gcHJpdmF0ZToKLSAgc3RkOjptYXA8RXZlbnRDb2RlLCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKEV2ZW50Vmlldyk+PiByZWdpc3RlcmVkX2V2ZW50c187Ci0gIHN0ZDo6bWFwPFN1YmV2ZW50Q29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChMZU1ldGFFdmVudFZpZXcpPj4gcmVnaXN0ZXJlZF9sZV9ldmVudHNfOwotICBzdGQ6Omxpc3Q8Y29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZENvbXBsZXRlVmlldyk+PiBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrczsKLSAgc3RkOjpsaXN0PGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRTdGF0dXNWaWV3KT4+IGNvbW1hbmRfc3RhdHVzX2NhbGxiYWNrczsKLQotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4+IGNvbW1hbmRfcXVldWVfOwotICBtdXRhYmxlIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBjb21tYW5kX3Byb21pc2Vfe307Ci19OwotCi1jbGFzcyBUZXN0TGVBZGRyZXNzTWFuYWdlciA6IHB1YmxpYyBMZUFkZHJlc3NNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIFRlc3RMZUFkZHJlc3NNYW5hZ2VyKAotICAgICAgY29tbW9uOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kQnVpbGRlcj4pPiBlbnF1ZXVlX2NvbW1hbmQsCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgIEFkZHJlc3MgcHVibGljX2FkZHJlc3MsCi0gICAgICB1aW50OF90IGNvbm5lY3RfbGlzdF9zaXplLAotICAgICAgdWludDhfdCByZXNvbHZpbmdfbGlzdF9zaXplKQotICAgICAgOiBMZUFkZHJlc3NNYW5hZ2VyKGVucXVldWVfY29tbWFuZCwgaGFuZGxlciwgcHVibGljX2FkZHJlc3MsIGNvbm5lY3RfbGlzdF9zaXplLCByZXNvbHZpbmdfbGlzdF9zaXplKSB7fQotCi0gIEFkZHJlc3NQb2xpY3kgUmVnaXN0ZXIoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjaykgb3ZlcnJpZGUgewotICAgIHJldHVybiBBZGRyZXNzUG9saWN5OjpVU0VfU1RBVElDX0FERFJFU1M7Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXIoTGVBZGRyZXNzTWFuYWdlckNhbGxiYWNrKiBjYWxsYmFjaykgb3ZlcnJpZGUge30KLX07Ci0KLWNsYXNzIFRlc3RBY2xNYW5hZ2VyIDogcHVibGljIEFjbE1hbmFnZXIgewotIHB1YmxpYzoKLSAgTGVBZGRyZXNzTWFuYWdlciogR2V0TGVBZGRyZXNzTWFuYWdlcigpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gdGVzdF9sZV9hZGRyZXNzX21hbmFnZXJfOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgICBBZGRyZXNzIGFkZHJlc3MoezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9KTsKLSAgICB0ZXN0X2xlX2FkZHJlc3NfbWFuYWdlcl8gPSBuZXcgVGVzdExlQWRkcmVzc01hbmFnZXIoCi0gICAgICAgIGNvbW1vbjo6QmluZCgmVGVzdEFjbE1hbmFnZXI6OmVucXVldWVfY29tbWFuZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgaGFuZGxlcl8sIGFkZHJlc3MsIDB4M0YsIDB4M0YpOwotICB9Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSB0ZXN0X2xlX2FkZHJlc3NfbWFuYWdlcl87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBTZXRSYW5kb21BZGRyZXNzKEFkZHJlc3MgYWRkcmVzcykge30KLQotICB2b2lkIGVucXVldWVfY29tbWFuZChzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmRfcGFja2V0KXt9OwotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF87Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgVGVzdExlQWRkcmVzc01hbmFnZXIqIHRlc3RfbGVfYWRkcmVzc19tYW5hZ2VyXzsKLX07Ci0KLWNsYXNzIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZXN0X2hjaV9sYXllcl8gPSBuZXcgVGVzdEhjaUxheWVyOyAgLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIHRvIHJlZ2lzdHJ5Ci0gICAgdGVzdF9jb250cm9sbGVyXyA9IG5ldyBUZXN0Q29udHJvbGxlcjsKLSAgICB0ZXN0X2NvbnRyb2xsZXJfLT5BZGRTdXBwb3J0ZWQocGFyYW1fb3Bjb2RlXyk7Ci0gICAgaWYgKGlzX2ZpbHRlcl9zdXBwb3J0XykgewotICAgICAgdGVzdF9jb250cm9sbGVyXy0+QWRkU3VwcG9ydGVkKE9wQ29kZTo6TEVfQURWX0ZJTFRFUik7Ci0gICAgfQotICAgIGlmIChpc19iYXRjaF9zY2FuX3N1cHBvcnRfKSB7Ci0gICAgICB0ZXN0X2NvbnRyb2xsZXJfLT5BZGRTdXBwb3J0ZWQoT3BDb2RlOjpMRV9CQVRDSF9TQ0FOKTsKLSAgICB9Ci0gICAgdGVzdF9hY2xfbWFuYWdlcl8gPSBuZXcgVGVzdEFjbE1hbmFnZXI7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmSGNpTGF5ZXI6OkZhY3RvcnksIHRlc3RfaGNpX2xheWVyXyk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmQ29udHJvbGxlcjo6RmFjdG9yeSwgdGVzdF9jb250cm9sbGVyXyk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmQWNsTWFuYWdlcjo6RmFjdG9yeSwgdGVzdF9hY2xfbWFuYWdlcl8pOwotICAgIGNsaWVudF9oYW5kbGVyXyA9IGZha2VfcmVnaXN0cnlfLkdldFRlc3RNb2R1bGVIYW5kbGVyKCZIY2lMYXllcjo6RmFjdG9yeSk7Ci0gICAgc3RkOjpmdXR1cmU8dm9pZD4gY29uZmlnX2Z1dHVyZSA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZEZ1dHVyZSgpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PExlU2Nhbm5pbmdNYW5hZ2VyPigmdGhyZWFkXyk7Ci0gICAgbGVfc2Nhbm5pbmdfbWFuYWdlciA9Ci0gICAgICAgIHN0YXRpY19jYXN0PExlU2Nhbm5pbmdNYW5hZ2VyKj4oZmFrZV9yZWdpc3RyeV8uR2V0TW9kdWxlVW5kZXJUZXN0KCZMZVNjYW5uaW5nTWFuYWdlcjo6RmFjdG9yeSkpOwotICAgIGF1dG8gcmVzdWx0ID0gY29uZmlnX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6ZHVyYXRpb24oc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSkpOwotICAgIEFTU0VSVF9FUShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LCByZXN1bHQpOwotICAgIGF1dG8gcGFja2V0ID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kKGVuYWJsZV9vcGNvZGVfKTsKLSAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRTY2FuRW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gICAgY29uZmlnX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6ZHVyYXRpb24oc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSkpOwotICAgIEFTU0VSVF9FUShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LCByZXN1bHQpOwotICAgIEhhbmRsZUNvbmZpZ3VyYXRpb24oKTsKLSAgICBsZV9zY2FubmluZ19tYW5hZ2VyLT5SZWdpc3RlclNjYW5uaW5nQ2FsbGJhY2soJm1vY2tfY2FsbGJhY2tzXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGZha2VfcmVnaXN0cnlfLlN5bmNocm9uaXplTW9kdWxlSGFuZGxlcigmTGVTY2FubmluZ01hbmFnZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlQ29uZmlndXJhdGlvbigpIHsKLSAgICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9TQ0FOX1BBUkFNRVRFUlMpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldFNjYW5QYXJhbWV0ZXJzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoMSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0gIH0KLQotICB2b2lkIHN5bmNfY2xpZW50X2hhbmRsZXIoKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICBjbGllbnRfaGFuZGxlcl8tPkNhbGwoY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpKTsKLSAgICBhdXRvIGZ1dHVyZV9zdGF0dXMgPSBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwotICAgIEFTU0VSVF9FUShmdXR1cmVfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgfQotCi0gIFRlc3RNb2R1bGVSZWdpc3RyeSBmYWtlX3JlZ2lzdHJ5XzsKLSAgVGVzdEhjaUxheWVyKiB0ZXN0X2hjaV9sYXllcl8gPSBudWxscHRyOwotICBUZXN0Q29udHJvbGxlciogdGVzdF9jb250cm9sbGVyXyA9IG51bGxwdHI7Ci0gIFRlc3RBY2xNYW5hZ2VyKiB0ZXN0X2FjbF9tYW5hZ2VyXyA9IG51bGxwdHI7Ci0gIG9zOjpUaHJlYWQmIHRocmVhZF8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0VGhyZWFkKCk7Ci0gIExlU2Nhbm5pbmdNYW5hZ2VyKiBsZV9zY2FubmluZ19tYW5hZ2VyID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0KLSAgY2xhc3MgTW9ja0NhbGxiYWNrcyA6IHB1YmxpYyBibHVldG9vdGg6OmhjaTo6U2Nhbm5pbmdDYWxsYmFjayB7Ci0gICBwdWJsaWM6Ci0gICAgTU9DS19NRVRIT0QoCi0gICAgICAgIHZvaWQsCi0gICAgICAgIE9uU2Nhbm5lclJlZ2lzdGVyZWQsCi0gICAgICAgIChjb25zdCBibHVldG9vdGg6OmhjaTo6VXVpZCBhcHBfdXVpZCwgU2Nhbm5lcklkIHNjYW5uZXJfaWQsIFNjYW5uaW5nU3RhdHVzIHN0YXR1cyksCi0gICAgICAgIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKHZvaWQsIE9uU2V0U2Nhbm5lclBhcmFtZXRlckNvbXBsZXRlLCAoU2Nhbm5lcklkIHNjYW5uZXJfaWQsIFNjYW5uaW5nU3RhdHVzIHN0YXR1cyksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKAotICAgICAgICB2b2lkLAotICAgICAgICBPblNjYW5SZXN1bHQsCi0gICAgICAgICh1aW50MTZfdCBldmVudF90eXBlLAotICAgICAgICAgdWludDhfdCBhZGRyZXNzX3R5cGUsCi0gICAgICAgICBBZGRyZXNzIGFkZHJlc3MsCi0gICAgICAgICB1aW50OF90IHByaW1hcnlfcGh5LAotICAgICAgICAgdWludDhfdCBzZWNvbmRhcnlfcGh5LAotICAgICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsCi0gICAgICAgICBpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICAgICBpbnQ4X3QgcnNzaSwKLSAgICAgICAgIHVpbnQxNl90IHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsLAotICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNpbmdfZGF0YSksCi0gICAgICAgIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKAotICAgICAgICB2b2lkLAotICAgICAgICBPblRyYWNrQWR2Rm91bmRMb3N0LAotICAgICAgICAoYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nRmlsdGVyT25Gb3VuZE9uTG9zdEluZm8gb25fZm91bmRfb25fbG9zdF9pbmZvKSwKLSAgICAgICAgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0QoCi0gICAgICAgIHZvaWQsCi0gICAgICAgIE9uQmF0Y2hTY2FuUmVwb3J0cywKLSAgICAgICAgKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsIGludCByZXBvcnRfZm9ybWF0LCBpbnQgbnVtX3JlY29yZHMsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpLAotICAgICAgICAob3ZlcnJpZGUpKTsKLSAgICBNT0NLX01FVEhPRCh2b2lkLCBPbkJhdGNoU2NhblRocmVzaG9sZENyb3NzZWQsIChpbnQgY2xpZW50X2lmKSwgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0Qodm9pZCwgT25UaW1lb3V0LCAoKSwgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0Qodm9pZCwgT25GaWx0ZXJFbmFibGUsIChFbmFibGUgZW5hYmxlLCB1aW50OF90IHN0YXR1cyksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKHZvaWQsIE9uRmlsdGVyUGFyYW1TZXR1cCwgKHVpbnQ4X3QgYXZhaWxhYmxlX3NwYWNlcywgQXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3Qgc3RhdHVzKSwgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0QoCi0gICAgICAgIHZvaWQsCi0gICAgICAgIE9uRmlsdGVyQ29uZmlnQ2FsbGJhY2ssCi0gICAgICAgIChBcGNmRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgdWludDhfdCBhdmFpbGFibGVfc3BhY2VzLCBBcGNmQWN0aW9uIGFjdGlvbiwgdWludDhfdCBzdGF0dXMpLAotICAgICAgICAob3ZlcnJpZGUpKTsKLSAgfSBtb2NrX2NhbGxiYWNrc187Ci0KLSAgT3BDb2RlIHBhcmFtX29wY29kZV97T3BDb2RlOjpMRV9TRVRfQURWRVJUSVNJTkdfUEFSQU1FVEVSU307Ci0gIE9wQ29kZSBlbmFibGVfb3Bjb2RlX3tPcENvZGU6OkxFX1NFVF9TQ0FOX0VOQUJMRX07Ci0gIGJvb2wgaXNfZmlsdGVyX3N1cHBvcnRfID0gZmFsc2U7Ci0gIGJvb2wgaXNfYmF0Y2hfc2Nhbl9zdXBwb3J0XyA9IGZhbHNlOwotfTsKLQotY2xhc3MgTGVBbmRyb2lkSGNpU2Nhbm5pbmdNYW5hZ2VyVGVzdCA6IHB1YmxpYyBMZVNjYW5uaW5nTWFuYWdlclRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBwYXJhbV9vcGNvZGVfID0gT3BDb2RlOjpMRV9FWFRFTkRFRF9TQ0FOX1BBUkFNUzsKLSAgICBpc19maWx0ZXJfc3VwcG9ydF8gPSB0cnVlOwotICAgIGlzX2JhdGNoX3NjYW5fc3VwcG9ydF8gPSB0cnVlOwotICAgIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdDo6U2V0VXAoKTsKLSAgICB0ZXN0X2NvbnRyb2xsZXJfLT5BZGRTdXBwb3J0ZWQoT3BDb2RlOjpMRV9BRFZfRklMVEVSKTsKLSAgfQotCi0gIHZvaWQgSGFuZGxlQ29uZmlndXJhdGlvbigpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX0VYVEVOREVEX1NDQU5fUEFSQU1TKTsKLSAgICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVFeHRlbmRlZFNjYW5QYXJhbXNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgfQotfTsKLQotY2xhc3MgTGVFeHRlbmRlZFNjYW5uaW5nTWFuYWdlclRlc3QgOiBwdWJsaWMgTGVTY2FubmluZ01hbmFnZXJUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgcGFyYW1fb3Bjb2RlXyA9IE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX1NDQU5fUEFSQU1FVEVSUzsKLSAgICBlbmFibGVfb3Bjb2RlXyA9IE9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX1NDQU5fRU5BQkxFOwotICAgIExlU2Nhbm5pbmdNYW5hZ2VyVGVzdDo6U2V0VXAoKTsKLSAgfQotCi0gIHZvaWQgSGFuZGxlQ29uZmlndXJhdGlvbigpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHBhY2tldCA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9TQ0FOX1BBUkFNRVRFUlMpOwotICAgIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgxLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgfQotfTsKLQotVEVTVF9GKExlU2Nhbm5pbmdNYW5hZ2VyVGVzdCwgc3RhcnR1cF90ZWFyZG93bikge30KLQotVEVTVF9GKExlU2Nhbm5pbmdNYW5hZ2VyVGVzdCwgc3RhcnRfc2Nhbl90ZXN0KSB7Ci0gIGF1dG8gbmV4dF9jb21tYW5kX2Z1dHVyZSA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9zY2FubmluZ19tYW5hZ2VyLT5TY2FuKHRydWUpOwotCi0gIGF1dG8gcmVzdWx0ID0gbmV4dF9jb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6ZHVyYXRpb24oc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKSk7Ci0gIEFTU0VSVF9FUShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LCByZXN1bHQpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRTY2FuRW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgTGVBZHZlcnRpc2luZ1JlcG9ydCByZXBvcnR7fTsKLSAgcmVwb3J0LmV2ZW50X3R5cGVfID0gQWR2ZXJ0aXNpbmdFdmVudFR5cGU6OkFEVl9ESVJFQ1RfSU5EOwotICByZXBvcnQuYWRkcmVzc190eXBlXyA9IEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcoIjEyOjM0OjU2Ojc4OjlhOmJjIiwgcmVwb3J0LmFkZHJlc3NfKTsKLSAgc3RkOjp2ZWN0b3I8R2FwRGF0YT4gZ2FwX2RhdGF7fTsKLSAgR2FwRGF0YSBkYXRhX2l0ZW17fTsKLSAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6RkxBR1M7Ci0gIGRhdGFfaXRlbS5kYXRhXyA9IHsweDM0fTsKLSAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkNPTVBMRVRFX0xPQ0FMX05BTUU7Ci0gIGRhdGFfaXRlbS5kYXRhXyA9IHsncicsICdhJywgJ24nLCAnZCcsICdvJywgJ20nLCAnICcsICdkJywgJ2UnLCAndicsICdpJywgJ2MnLCAnZSd9OwotICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgcmVwb3J0LmFkdmVydGlzaW5nX2RhdGFfID0gZ2FwX2RhdGE7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFja3NfLCBPblNjYW5SZXN1bHQpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdMZU1ldGFFdmVudChMZUFkdmVydGlzaW5nUmVwb3J0QnVpbGRlcjo6Q3JlYXRlKHtyZXBvcnR9KSk7Ci19Ci0KLVRFU1RfRihMZUFuZHJvaWRIY2lTY2FubmluZ01hbmFnZXJUZXN0LCBzdGFydF9zY2FuX3Rlc3QpIHsKLSAgYXV0byBuZXh0X2NvbW1hbmRfZnV0dXJlID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX3NjYW5uaW5nX21hbmFnZXItPlNjYW4odHJ1ZSk7Ci0KLSAgYXV0byByZXN1bHQgPSBuZXh0X2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIHJlc3VsdCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldFNjYW5FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLQotICBMZUFkdmVydGlzaW5nUmVwb3J0IHJlcG9ydHt9OwotICByZXBvcnQuZXZlbnRfdHlwZV8gPSBBZHZlcnRpc2luZ0V2ZW50VHlwZTo6QURWX0RJUkVDVF9JTkQ7Ci0gIHJlcG9ydC5hZGRyZXNzX3R5cGVfID0gQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLSAgQWRkcmVzczo6RnJvbVN0cmluZygiMTI6MzQ6NTY6Nzg6OWE6YmMiLCByZXBvcnQuYWRkcmVzc18pOwotICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBnYXBfZGF0YXt9OwotICBHYXBEYXRhIGRhdGFfaXRlbXt9OwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpGTEFHUzsKLSAgZGF0YV9pdGVtLmRhdGFfID0gezB4MzR9OwotICBnYXBfZGF0YS5wdXNoX2JhY2soZGF0YV9pdGVtKTsKLSAgZGF0YV9pdGVtLmRhdGFfdHlwZV8gPSBHYXBEYXRhVHlwZTo6Q09NUExFVEVfTE9DQUxfTkFNRTsKLSAgZGF0YV9pdGVtLmRhdGFfID0geydyJywgJ2EnLCAnbicsICdkJywgJ28nLCAnbScsICcgJywgJ2QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJ307Ci0gIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICByZXBvcnQuYWR2ZXJ0aXNpbmdfZGF0YV8gPSBnYXBfZGF0YTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2NhbGxiYWNrc18sIE9uU2NhblJlc3VsdCk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0xlTWV0YUV2ZW50KExlQWR2ZXJ0aXNpbmdSZXBvcnRCdWlsZGVyOjpDcmVhdGUoe3JlcG9ydH0pKTsKLX0KLQotVEVTVF9GKExlQW5kcm9pZEhjaVNjYW5uaW5nTWFuYWdlclRlc3QsIHNjYW5fZmlsdGVyX2VuYWJsZV90ZXN0KSB7Ci0gIGF1dG8gbmV4dF9jb21tYW5kX2Z1dHVyZSA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9zY2FubmluZ19tYW5hZ2VyLT5TY2FuRmlsdGVyRW5hYmxlKHRydWUpOwotICBhdXRvIHJlc3VsdCA9IG5leHRfY29tbWFuZF9mdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OmR1cmF0aW9uKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSkpOwotICBBU1NFUlRfRVEoc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwgcmVzdWx0KTsKLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFja3NfLCBPbkZpbHRlckVuYWJsZSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIExlQWR2RmlsdGVyRW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTLCBFbmFibGU6OkVOQUJMRUQpKTsKLSAgc3luY19jbGllbnRfaGFuZGxlcigpOwotfQotCi1URVNUX0YoTGVBbmRyb2lkSGNpU2Nhbm5pbmdNYW5hZ2VyVGVzdCwgc2Nhbl9maWx0ZXJfcGFyYW1ldGVyX3Rlc3QpIHsKLSAgYXV0byBuZXh0X2NvbW1hbmRfZnV0dXJlID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kRnV0dXJlKCk7Ci0gIEFkdmVydGlzaW5nRmlsdGVyUGFyYW1ldGVyIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXJ7fTsKLSAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5kZWxpdmVyeV9tb2RlID0gRGVsaXZlcnlNb2RlOjpJTU1FRElBVEU7Ci0gIGxlX3NjYW5uaW5nX21hbmFnZXItPlNjYW5GaWx0ZXJQYXJhbWV0ZXJTZXR1cChBcGNmQWN0aW9uOjpBREQsIDB4MDEsIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIpOwotICBhdXRvIHJlc3VsdCA9IG5leHRfY29tbWFuZF9mdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OmR1cmF0aW9uKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSkpOwotICBBU1NFUlRfRVEoc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwgcmVzdWx0KTsKLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFja3NfLCBPbkZpbHRlclBhcmFtU2V0dXApOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBMZUFkdkZpbHRlclNldEZpbHRlcmluZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIEFwY2ZBY3Rpb246OkFERCwgMHgwYSkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUFuZHJvaWRIY2lTY2FubmluZ01hbmFnZXJUZXN0LCBzY2FuX2ZpbHRlcl9hZGRfdGVzdCkgewotICBhdXRvIG5leHRfY29tbWFuZF9mdXR1cmUgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmRGdXR1cmUoKTsKLSAgc3RkOjp2ZWN0b3I8QWR2ZXJ0aXNpbmdQYWNrZXRDb250ZW50RmlsdGVyQ29tbWFuZD4gZmlsdGVycyA9IHt9OwotICBBZHZlcnRpc2luZ1BhY2tldENvbnRlbnRGaWx0ZXJDb21tYW5kIGZpbHRlcnt9OwotICBmaWx0ZXIuZmlsdGVyX3R5cGUgPSBBcGNmRmlsdGVyVHlwZTo6QlJPQURDQVNURVJfQUREUkVTUzsKLSAgZmlsdGVyLmFkZHJlc3MgPSBBZGRyZXNzOjprRW1wdHk7Ci0gIGZpbHRlci5hcHBsaWNhdGlvbl9hZGRyZXNzX3R5cGUgPSBBcGNmQXBwbGljYXRpb25BZGRyZXNzVHlwZTo6UkFORE9NOwotICBmaWx0ZXJzLnB1c2hfYmFjayhmaWx0ZXIpOwotICBsZV9zY2FubmluZ19tYW5hZ2VyLT5TY2FuRmlsdGVyQWRkKDB4MDEsIGZpbHRlcnMpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NhbGxiYWNrc18sIE9uRmlsdGVyQ29uZmlnQ2FsbGJhY2spOwotICBhdXRvIHJlc3VsdCA9IG5leHRfY29tbWFuZF9mdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OmR1cmF0aW9uKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSkpOwotICBBU1NFUlRfRVEoc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwgcmVzdWx0KTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgTGVBZHZGaWx0ZXJCcm9hZGNhc3RlckFkZHJlc3NDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIEFwY2ZBY3Rpb246OkFERCwgMHgwYSkpOwotICBzeW5jX2NsaWVudF9oYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihMZUFuZHJvaWRIY2lTY2FubmluZ01hbmFnZXJUZXN0LCByZWFkX2JhdGNoX3NjYW5fcmVzdWx0KSB7Ci0gIC8vIEVuYWJsZSBiYXRjaCBzY2FuIGZlYXR1cmUKLSAgYXV0byBuZXh0X2NvbW1hbmRfZnV0dXJlID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX3NjYW5uaW5nX21hbmFnZXItPkJhdGNoU2NhbkNvbmlmZ1N0b3JhZ2UoMTAwLCAwLCA5NSwgMHgwMCk7Ci0gIGF1dG8gcmVzdWx0ID0gbmV4dF9jb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6ZHVyYXRpb24oc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKSk7Ci0gIEFTU0VSVF9FUShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LCByZXN1bHQpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVCYXRjaFNjYW5FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgTGVCYXRjaFNjYW5TZXRTdG9yYWdlUGFyYW1ldGVyc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHVpbnQ4X3R7MX0sIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotCi0gIC8vIEVuYWJsZSBiYXRjaCBzY2FuCi0gIG5leHRfY29tbWFuZF9mdXR1cmUgPSB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmRGdXR1cmUoKTsKLSAgbGVfc2Nhbm5pbmdfbWFuYWdlci0+QmF0Y2hTY2FuRW5hYmxlKEJhdGNoU2Nhbk1vZGU6OkZVTEwsIDI0MDAsIDI0MDAsIEJhdGNoU2NhbkRpc2NhcmRSdWxlOjpPTERFU1QpOwotICByZXN1bHQgPSBuZXh0X2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIHJlc3VsdCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUJhdGNoU2NhblNldFNjYW5QYXJhbWV0ZXJzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgLy8gUmVhZCBiYXRjaCBzY2FuIGRhdGEKLSAgbmV4dF9jb21tYW5kX2Z1dHVyZSA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZEZ1dHVyZSgpOwotICBsZV9zY2FubmluZ19tYW5hZ2VyLT5CYXRjaFNjYW5SZWFkUmVwb3J0KDB4MDEsIEJhdGNoU2Nhbk1vZGU6OkZVTEwpOwotICByZXN1bHQgPSBuZXh0X2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIHJlc3VsdCk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jYWxsYmFja3NfLCBPbkJhdGNoU2NhblJlcG9ydHMpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYXdfZGF0YSA9IHsweDVjLCAweDFmLCAweGEyLCAweGMzLCAweDYzLCAweDVkLCAweDAxLCAweGY1LCAweGIzLCAweDVlLCAweDAwLCAweDBjLCAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAyLCAweDA1LCAweDA5LCAweDZkLCAweDc2LCAweDM4LCAweDc2LCAweDAyLCAweDBhLCAweGY1LCAweDAwfTsKLSAgbmV4dF9jb21tYW5kX2Z1dHVyZSA9IHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZEZ1dHVyZSgpOwotICAvLyBXZSB3aWxsIHNlbmQgcmVhZCBjb21tYW5kIHdoaWxlIG51bV9vZl9yZWNvcmQgIT0gMAotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVCYXRjaFNjYW5SZWFkUmVzdWx0UGFyYW1ldGVyc0NvbXBsZXRlUmF3QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgdWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTLCBCYXRjaFNjYW5EYXRhUmVhZDo6RlVMTF9NT0RFX0RBVEEsIDEsIHJhd19kYXRhKSk7Ci0gIHJlc3VsdCA9IG5leHRfY29tbWFuZF9mdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OmR1cmF0aW9uKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSkpOwotICBBU1NFUlRfRVEoc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwgcmVzdWx0KTsKLQotICAvLyBPbkJhdGNoU2NhblJlcG9ydHMgd2lsbCBiZSB0cmlnZ2VyIHdoZW4gbnVtX29mX3JlY29yZCA9PSAwCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZUJhdGNoU2NhblJlYWRSZXN1bHRQYXJhbWV0ZXJzQ29tcGxldGVSYXdCdWlsZGVyOjpDcmVhdGUoCi0gICAgICB1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MsIEJhdGNoU2NhbkRhdGFSZWFkOjpGVUxMX01PREVfREFUQSwgMCwge30pKTsKLX0KLQotVEVTVF9GKExlRXh0ZW5kZWRTY2FubmluZ01hbmFnZXJUZXN0LCBzdGFydF9zY2FuX3Rlc3QpIHsKLSAgYXV0byBuZXh0X2NvbW1hbmRfZnV0dXJlID0gdGVzdF9oY2lfbGF5ZXJfLT5HZXRDb21tYW5kRnV0dXJlKCk7Ci0gIGxlX3NjYW5uaW5nX21hbmFnZXItPlNjYW4odHJ1ZSk7Ci0KLSAgYXV0byByZXN1bHQgPSBuZXh0X2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIHJlc3VsdCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9TQ0FOX0VOQUJMRSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldFNjYW5FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLQotICByZXN1bHQgPSBuZXh0X2NvbW1hbmRfZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpKTsKLSAgQVNTRVJUX0VRKHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksIHJlc3VsdCk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+R2V0Q29tbWFuZChPcENvZGU6OkxFX1NFVF9FWFRFTkRFRF9TQ0FOX1BBUkFNRVRFUlMpOwotICB0ZXN0X2hjaV9sYXllcl8tPkluY29taW5nRXZlbnQoTGVTZXRFeHRlbmRlZFNjYW5QYXJhbWV0ZXJzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUodWludDhfdHsxfSwgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci0KLSAgcmVzdWx0ID0gbmV4dF9jb21tYW5kX2Z1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6ZHVyYXRpb24oc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKSk7Ci0gIEFTU0VSVF9FUShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LCByZXN1bHQpOwotICB0ZXN0X2hjaV9sYXllcl8tPkdldENvbW1hbmQoT3BDb2RlOjpMRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChMZVNldFNjYW5FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSh1aW50OF90ezF9LCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLQotICBMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdSZXBvcnQgcmVwb3J0e307Ci0gIHJlcG9ydC5jb25uZWN0YWJsZV8gPSAxOwotICByZXBvcnQuc2Nhbm5hYmxlXyA9IDA7Ci0gIHJlcG9ydC5hZGRyZXNzX3R5cGVfID0gRGlyZWN0QWR2ZXJ0aXNpbmdBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKCIxMjozNDo1Njo3ODo5YTpiYyIsIHJlcG9ydC5hZGRyZXNzXyk7Ci0gIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGdhcF9kYXRhe307Ci0gIEdhcERhdGEgZGF0YV9pdGVte307Ci0gIGRhdGFfaXRlbS5kYXRhX3R5cGVfID0gR2FwRGF0YVR5cGU6OkZMQUdTOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7MHgzNH07Ci0gIGdhcF9kYXRhLnB1c2hfYmFjayhkYXRhX2l0ZW0pOwotICBkYXRhX2l0ZW0uZGF0YV90eXBlXyA9IEdhcERhdGFUeXBlOjpDT01QTEVURV9MT0NBTF9OQU1FOwotICBkYXRhX2l0ZW0uZGF0YV8gPSB7J3InLCAnYScsICduJywgJ2QnLCAnbycsICdtJywgJyAnLCAnZCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnfTsKLSAgZ2FwX2RhdGEucHVzaF9iYWNrKGRhdGFfaXRlbSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEgPSB7fTsKLSAgZm9yIChhdXRvIGRhdGEgOiBnYXBfZGF0YSkgewotICAgIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKCh1aW50OF90KWRhdGEuc2l6ZSgpIC0gMSk7Ci0gICAgYWR2ZXJ0aXNpbmdfZGF0YS5wdXNoX2JhY2soKHVpbnQ4X3QpZGF0YS5kYXRhX3R5cGVfKTsKLSAgICBhZHZlcnRpc2luZ19kYXRhLmluc2VydChhZHZlcnRpc2luZ19kYXRhLmVuZCgpLCBkYXRhLmRhdGFfLmJlZ2luKCksIGRhdGEuZGF0YV8uZW5kKCkpOwotICB9Ci0KLSAgcmVwb3J0LmFkdmVydGlzaW5nX2RhdGFfID0gYWR2ZXJ0aXNpbmdfZGF0YTsKLQotICBFWFBFQ1RfQ0FMTChtb2NrX2NhbGxiYWNrc18sIE9uU2NhblJlc3VsdCk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5JbmNvbWluZ0xlTWV0YUV2ZW50KExlRXh0ZW5kZWRBZHZlcnRpc2luZ1JlcG9ydEJ1aWxkZXI6OkNyZWF0ZSh7cmVwb3J0fSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9sZV9zZWN1cml0eV9pbnRlcmZhY2UuaCBiL2dkL2hjaS9sZV9zZWN1cml0eV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExZTYyZC4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGVfc2VjdXJpdHlfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9jb21tYW5kX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jb25zdGV4cHIgaGNpOjpTdWJldmVudENvZGUgTGVTZWN1cml0eUV2ZW50c1tdID0gewotICAgIGhjaTo6U3ViZXZlbnRDb2RlOjpMT05HX1RFUk1fS0VZX1JFUVVFU1QsCi0gICAgaGNpOjpTdWJldmVudENvZGU6OlJFQURfTE9DQUxfUDI1Nl9QVUJMSUNfS0VZX0NPTVBMRVRFLAotICAgIGhjaTo6U3ViZXZlbnRDb2RlOjpHRU5FUkFURV9ESEtFWV9DT01QTEVURSwKLX07Ci0KLXR5cGVkZWYgQ29tbWFuZEludGVyZmFjZTxMZVNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+IExlU2VjdXJpdHlJbnRlcmZhY2U7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2hjaS9saW5rX2tleS5jYyBiL2dkL2hjaS9saW5rX2tleS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwNzRiYi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGlua19rZXkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpL2xpbmtfa2V5LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNvbnN0IExpbmtLZXkga0V4YW1wbGVMaW5rS2V5ewotICAgIHsweDRDLCAweDY4LCAweDM4LCAweDQxLCAweDM5LCAweGY1LCAweDc0LCAweGQ4LCAweDM2LCAweGJjLCAweGYzLCAweDRlLCAweDlkLCAweGZiLCAweDAxLCAweGJmfX07Ci19Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvaGNpL2xpbmtfa2V5LmggYi9nZC9oY2kvbGlua19rZXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NzNlNi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvbGlua19rZXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImNvbW1vbi9ieXRlX2FycmF5LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLS8vIGNvbnZlbmllbmNlIHR5cGUgZm9yIDEyOCBiaXQgbGluayBrZXlzCi11c2luZyBMaW5rS2V5ID0gY29tbW9uOjpCeXRlQXJyYXk8MTY+OwotCi0vLyBleGFtcGxlIGxpbmsga2V5IGZyb20gQmx1ZXRvb3RoIHNwZWMsIGRvIG5vdCB1c2UgaW4gcmVhbCBkZXZpY2UKLWV4dGVybiBjb25zdCBMaW5rS2V5IGtFeGFtcGxlTGlua0tleTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2hjaS9zZWN1cml0eV9pbnRlcmZhY2UuaCBiL2dkL2hjaS9zZWN1cml0eV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjMzA4NjYuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL3NlY3VyaXR5X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvY29tbWFuZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotY29uc3RleHByIGhjaTo6RXZlbnRDb2RlIFNlY3VyaXR5RXZlbnRzW10gPSB7Ci0gICAgaGNpOjpFdmVudENvZGU6OkVOQ1JZUFRJT05fQ0hBTkdFLAotICAgIGhjaTo6RXZlbnRDb2RlOjpDSEFOR0VfQ09OTkVDVElPTl9MSU5LX0tFWV9DT01QTEVURSwKLSAgICBoY2k6OkV2ZW50Q29kZTo6Q0VOVFJBTF9MSU5LX0tFWV9DT01QTEVURSwKLSAgICBoY2k6OkV2ZW50Q29kZTo6UkVUVVJOX0xJTktfS0VZUywKLSAgICBoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVCwKLSAgICBoY2k6OkV2ZW50Q29kZTo6TElOS19LRVlfUkVRVUVTVCwKLSAgICBoY2k6OkV2ZW50Q29kZTo6TElOS19LRVlfTk9USUZJQ0FUSU9OLAotICAgIGhjaTo6RXZlbnRDb2RlOjpFTkNSWVBUSU9OX0tFWV9SRUZSRVNIX0NPTVBMRVRFLAotICAgIGhjaTo6RXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1QsCi0gICAgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVTUE9OU0UsCi0gICAgaGNpOjpFdmVudENvZGU6OlJFTU9URV9PT0JfREFUQV9SRVFVRVNULAotICAgIGhjaTo6RXZlbnRDb2RlOjpTSU1QTEVfUEFJUklOR19DT01QTEVURSwKLSAgICBoY2k6OkV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX05PVElGSUNBVElPTiwKLSAgICBoY2k6OkV2ZW50Q29kZTo6S0VZUFJFU1NfTk9USUZJQ0FUSU9OLAotICAgIGhjaTo6RXZlbnRDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNULAotICAgIGhjaTo6RXZlbnRDb2RlOjpVU0VSX1BBU1NLRVlfUkVRVUVTVCwKLSAgICBoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX0hPU1RfU1VQUE9SVEVEX0ZFQVRVUkVTX05PVElGSUNBVElPTiwKLX07Ci0KLXR5cGVkZWYgQ29tbWFuZEludGVyZmFjZTxTZWN1cml0eUNvbW1hbmRCdWlsZGVyPiBTZWN1cml0eUludGVyZmFjZTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL3V1aWQuY2MgYi9nZC9oY2kvdXVpZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxYmMyYi4uMDAwMDAwMAotLS0gYS9nZC9oY2kvdXVpZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImhjaS91dWlkLmgiCi0KLSNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotdXNpbmcgVVVJRDEyOEJpdCA9IFV1aWQ6OlVVSUQxMjhCaXQ7Ci0KLWNvbnN0IFV1aWQgVXVpZDo6a0VtcHR5ID0gVXVpZDo6RnJvbTEyOEJpdEJFKFVVSUQxMjhCaXR7ezB4MDB9fSk7Ci0KLW5hbWVzcGFjZSB7Ci1VdWlkIGtCYXNlID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFVVSUQxMjhCaXR7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9fSk7Ci19ICAvLyBuYW1lc3BhY2UKLQotc2l6ZV90IFV1aWQ6OkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgY29uc3QgewotICBpZiAobWVtY21wKHV1LmRhdGEoKSArIGtOdW1CeXRlczMyLCBrQmFzZS51dS5kYXRhKCkgKyBrTnVtQnl0ZXMzMiwga051bUJ5dGVzMTI4IC0ga051bUJ5dGVzMzIpICE9IDApIHsKLSAgICByZXR1cm4ga051bUJ5dGVzMTI4OwotICB9Ci0KLSAgaWYgKHV1WzBdID09IDAgJiYgdXVbMV0gPT0gMCkgewotICAgIHJldHVybiBrTnVtQnl0ZXMxNjsKLSAgfQotCi0gIHJldHVybiBrTnVtQnl0ZXMzMjsKLX0KLQotYm9vbCBVdWlkOjpJczE2Qml0KCkgY29uc3QgewotICByZXR1cm4gR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSA9PSBrTnVtQnl0ZXMxNjsKLX0KLQotdWludDE2X3QgVXVpZDo6QXMxNkJpdCgpIGNvbnN0IHsKLSAgcmV0dXJuICgoKHVpbnQxNl90KXV1WzJdKSA8PCA4KSArIHV1WzNdOwotfQotCi11aW50MzJfdCBVdWlkOjpBczMyQml0KCkgY29uc3QgewotICByZXR1cm4gKCgodWludDMyX3QpdXVbMF0pIDw8IDI0KSArICgoKHVpbnQzMl90KXV1WzFdKSA8PCAxNikgKyAoKCh1aW50MzJfdCl1dVsyXSkgPDwgOCkgKyB1dVszXTsKLX0KLQotc3RkOjpvcHRpb25hbDxVdWlkPiBVdWlkOjpGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB1dWlkKSB7Ci0gIGlmICh1dWlkLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0KLSAgVXVpZCByZXQgPSBrQmFzZTsKLSAgdWludDhfdCogcCA9IHJldC51dS5kYXRhKCk7Ci0gIGlmICh1dWlkLnNpemUoKSA9PSBrU3RyaW5nMTI4Qml0TGVuKSB7Ci0gICAgaWYgKHV1aWRbOF0gIT0gJy0nIHx8IHV1aWRbMTNdICE9ICctJyB8fCB1dWlkWzE4XSAhPSAnLScgfHwgdXVpZFsyM10gIT0gJy0nKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLQotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZigKLSAgICAgICAgdXVpZC5jX3N0cigpLAotICAgICAgICAiJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4LSUwMmhoeCUwMmhoeC0lMDJoaHglMDJoaHgiCi0gICAgICAgICItJTAyaGh4JTAyaGh4LSUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCVuIiwKLSAgICAgICAgJnBbMF0sCi0gICAgICAgICZwWzFdLAotICAgICAgICAmcFsyXSwKLSAgICAgICAgJnBbM10sCi0gICAgICAgICZwWzRdLAotICAgICAgICAmcFs1XSwKLSAgICAgICAgJnBbNl0sCi0gICAgICAgICZwWzddLAotICAgICAgICAmcFs4XSwKLSAgICAgICAgJnBbOV0sCi0gICAgICAgICZwWzEwXSwKLSAgICAgICAgJnBbMTFdLAotICAgICAgICAmcFsxMl0sCi0gICAgICAgICZwWzEzXSwKLSAgICAgICAgJnBbMTRdLAotICAgICAgICAmcFsxNV0sCi0gICAgICAgICZjKTsKLSAgICBpZiAocmMgIT0gMTYpIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICAgIGlmIChjICE9IGtTdHJpbmcxMjhCaXRMZW4pIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodXVpZC5zaXplKCkgPT0gOCkgewotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZih1dWlkLmNfc3RyKCksICIlMDJoaHglMDJoaHglMDJoaHglMDJoaHglbiIsICZwWzBdLCAmcFsxXSwgJnBbMl0sICZwWzNdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDQpIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICAgIGlmIChjICE9IDgpIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodXVpZC5zaXplKCkgPT0gNCkgewotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZih1dWlkLmNfc3RyKCksICIlMDJoaHglMDJoaHglbiIsICZwWzJdLCAmcFszXSwgJmMpOwotICAgIGlmIChyYyAhPSAyKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICBpZiAoYyAhPSA0KSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RkOjpvcHRpb25hbDxVdWlkPiBVdWlkOjpGcm9tTGVnYWN5Q29uZmlnU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB1dWlkKSB7Ci0gIHJldHVybiBGcm9tU3RyaW5nKHV1aWQpOwotfQotCi1VdWlkIFV1aWQ6OkZyb20xNkJpdCh1aW50MTZfdCB1dWlkMTYpIHsKLSAgVXVpZCB1ID0ga0Jhc2U7Ci0KLSAgdS51dVsyXSA9ICh1aW50OF90KSgoMHhGRjAwICYgdXVpZDE2KSA+PiA4KTsKLSAgdS51dVszXSA9ICh1aW50OF90KSgweDAwRkYgJiB1dWlkMTYpOwotICByZXR1cm4gdTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tMzJCaXQodWludDMyX3QgdXVpZDMyKSB7Ci0gIFV1aWQgdSA9IGtCYXNlOwotCi0gIHUudXVbMF0gPSAodWludDhfdCkoKDB4RkYwMDAwMDAgJiB1dWlkMzIpID4+IDI0KTsKLSAgdS51dVsxXSA9ICh1aW50OF90KSgoMHgwMEZGMDAwMCAmIHV1aWQzMikgPj4gMTYpOwotICB1LnV1WzJdID0gKHVpbnQ4X3QpKCgweDAwMDBGRjAwICYgdXVpZDMyKSA+PiA4KTsKLSAgdS51dVszXSA9ICh1aW50OF90KSgweDAwMDAwMEZGICYgdXVpZDMyKTsKLSAgcmV0dXJuIHU7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTEyOEJpdEJFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpIHsKLSAgVVVJRDEyOEJpdCB0bXA7Ci0gIG1lbWNweSh0bXAuZGF0YSgpLCB1dWlkLCBrTnVtQnl0ZXMxMjgpOwotICByZXR1cm4gRnJvbTEyOEJpdEJFKHRtcCk7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTEyOEJpdExFKGNvbnN0IFVVSUQxMjhCaXQmIHV1aWQpIHsKLSAgVXVpZCB1OwotICBzdGQ6OnJldmVyc2VfY29weSh1dWlkLmRhdGEoKSwgdXVpZC5kYXRhKCkgKyBrTnVtQnl0ZXMxMjgsIHUudXUuYmVnaW4oKSk7Ci0gIHJldHVybiB1OwotfQotCi1VdWlkIFV1aWQ6OkZyb20xMjhCaXRMRShjb25zdCB1aW50OF90KiB1dWlkKSB7Ci0gIFVVSUQxMjhCaXQgdG1wOwotICBtZW1jcHkodG1wLmRhdGEoKSwgdXVpZCwga051bUJ5dGVzMTI4KTsKLSAgcmV0dXJuIEZyb20xMjhCaXRMRSh0bXApOwotfQotCi1VVUlEMTI4Qml0IFV1aWQ6OlRvMTI4Qml0TEUoKSBjb25zdCB7Ci0gIFVVSUQxMjhCaXQgbGU7Ci0gIHN0ZDo6cmV2ZXJzZV9jb3B5KHV1LmRhdGEoKSwgdXUuZGF0YSgpICsga051bUJ5dGVzMTI4LCBsZS5iZWdpbigpKTsKLSAgcmV0dXJuIGxlOwotfQotCi1jb25zdCBVVUlEMTI4Qml0JiBVdWlkOjpUbzEyOEJpdEJFKCkgY29uc3QgewotICByZXR1cm4gdXU7Ci19Ci0KLVV1aWQgVXVpZDo6R2V0UmFuZG9tKCkgewotICBVdWlkIHV1aWQ7Ci0gIFJBTkRfYnl0ZXModXVpZC51dS5kYXRhKCksIHV1aWQudXUuc2l6ZSgpKTsKLSAgcmV0dXJuIHV1aWQ7Ci19Ci0KLWJvb2wgVXVpZDo6SXNFbXB0eSgpIGNvbnN0IHsKLSAgcmV0dXJuICp0aGlzID09IGtFbXB0eTsKLX0KLQotYm9vbCBVdWlkOjpvcGVyYXRvcjwoY29uc3QgVXVpZCYgcmhzKSBjb25zdCB7Ci0gIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKHV1LmJlZ2luKCksIHV1LmVuZCgpLCByaHMudXUuYmVnaW4oKSwgcmhzLnV1LmVuZCgpKTsKLX0KLQotYm9vbCBVdWlkOjpvcGVyYXRvcj09KGNvbnN0IFV1aWQmIHJocykgY29uc3QgewotICByZXR1cm4gdXUgPT0gcmhzLnV1OwotfQotCi1ib29sIFV1aWQ6Om9wZXJhdG9yIT0oY29uc3QgVXVpZCYgcmhzKSBjb25zdCB7Ci0gIHJldHVybiB1dSAhPSByaHMudXU7Ci19Ci0KLXN0ZDo6c3RyaW5nIFV1aWQ6OlRvU3RyaW5nKCkgY29uc3QgewotICBjaGFyIGJ1ZltrU3RyaW5nMTI4Qml0TGVuICsgMV0gPSB7fTsKLSAgc3RkOjpzbnByaW50ZigKLSAgICAgIGJ1ZiwKLSAgICAgIHNpemVvZihidWYpLAotICAgICAgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgIHV1WzBdLAotICAgICAgdXVbMV0sCi0gICAgICB1dVsyXSwKLSAgICAgIHV1WzNdLAotICAgICAgdXVbNF0sCi0gICAgICB1dVs1XSwKLSAgICAgIHV1WzZdLAotICAgICAgdXVbN10sCi0gICAgICB1dVs4XSwKLSAgICAgIHV1WzldLAotICAgICAgdXVbMTBdLAotICAgICAgdXVbMTFdLAotICAgICAgdXVbMTJdLAotICAgICAgdXVbMTNdLAotICAgICAgdXVbMTRdLAotICAgICAgdXVbMTVdKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1Zik7Ci19Ci0KLXN0ZDo6c3RyaW5nIFV1aWQ6OlRvTGVnYWN5Q29uZmlnU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gVG9TdHJpbmcoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaGNpL3V1aWQuaCBiL2dkL2hjaS91dWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOGExNDIuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL3V1aWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0b3JhZ2Uvc2VyaWFsaXphYmxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgaGNpIHsKLQotLy8gVGhpcyBjbGFzcyBpcyByZXByZXNlbnRpbmcgQmx1ZXRvb3RoIFVVSURzIGFjcm9zcyB3aG9sZSBzdGFjay4KLS8vIEhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBlbmRpYW5uZXNzIHJ1bGVzOgotLy8gMS4gVVVJRCBpcyBpbnRlcm5hbGx5IGtlcHQgYXMgYXMgQmlnIEVuZGlhbi4KLS8vIDIuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIHVwcGVyIGxheWVycywgSmF2YSBvciBCaW5kZXIsIGFyZSBCaWcgRW5kaWFuLgotLy8gMy4gQnl0ZXMgcmVwcmVzZW50aW5nIFVVSUQgY29taW5nIGZyb20gbG93ZXIgbGF5ZXIsIEhDSSBwYWNrZXRzLCBhcmUgTGl0dGxlIEVuZGlhbi4KLS8vIDQuIFVVSUQgaW4gc3RvcmFnZSBpcyBhbHdheXMgc3RyaW5nLgotY2xhc3MgVXVpZCBmaW5hbCA6IHB1YmxpYyBzdG9yYWdlOjpTZXJpYWxpemFibGU8VXVpZD4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUJ5dGVzMTI4ID0gMTY7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczMyID0gNDsKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUJ5dGVzMTYgPSAyOwotCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtTdHJpbmcxMjhCaXRMZW4gPSAzNjsKLQotICBzdGF0aWMgY29uc3QgVXVpZCBrRW1wdHk7ICAvLyAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAKLQotICB1c2luZyBVVUlEMTI4Qml0ID0gc3RkOjphcnJheTx1aW50OF90LCBrTnVtQnl0ZXMxMjg+OwotCi0gIFV1aWQoKSA9IGRlZmF1bHQ7Ci0KLSAgaW5saW5lIHVpbnQ4X3QqIGRhdGEoKSB7Ci0gICAgcmV0dXJuIHV1LmRhdGEoKTsKLSAgfQotCi0gIGlubGluZSBjb25zdCB1aW50OF90KiBkYXRhKCkgY29uc3QgewotICAgIHJldHVybiB1dS5kYXRhKCk7Ci0gIH0KLQotICAvLyBzdG9yYWdlOjpTZXJpYWxpemFibGUgbWV0aG9kcwotICAvLyBDb252ZXJ0cyBzdHJpbmcgcmVwcmVzZW50aW5nIDEyOCwgMzIsIG9yIDE2IGJpdCBVVUlEIGluCi0gIC8vIHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCwgeHh4eHh4eHgsIG9yIHh4eHggZm9ybWF0IHRvIFVVSUQuCi0gIC8vIHJldHVybiB1dWlkIG9uIHN1Y2Nlc3MsIHN0ZDo6bnVsbG9wdCBvdGhlcndpc2UKLSAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8VXVpZD4gRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgdXVpZCk7Ci0gIHN0YXRpYyBzdGQ6Om9wdGlvbmFsPFV1aWQ+IEZyb21MZWdhY3lDb25maWdTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHV1aWQpOwotICAvLyBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBVVUlEIGluCi0gIC8vIHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCBmb3JtYXQsIGxvd2VyY2FzZS4KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9MZWdhY3lDb25maWdTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcmFuZG9tIDEyOC1iaXQgVVVJRC4KLSAgc3RhdGljIFV1aWQgR2V0UmFuZG9tKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2hvcnRlc3QgcG9zc2libGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlEIGluIGJ5dGVzLiBFaXRoZXIKLSAgLy8ga051bUJ5dGVzMTYsIGtOdW1CeXRlczMyLCBvciBrTnVtQnl0ZXMxMjgKLSAgc2l6ZV90IEdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgVVVJRCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgMTYgYml0LgotICBib29sIElzMTZCaXQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIDE2IGJpdCBMaXR0bGUgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVVJRC4gVXNlCi0gIC8vIEdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgb3IgSXMxNkJpdCgpIGJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZC4KLSAgdWludDE2X3QgQXMxNkJpdCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMzIgYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlELiBVc2UKLSAgLy8gR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBiZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QuCi0gIHVpbnQzMl90IEFzMzJCaXQoKSBjb25zdDsKLQotICAvLyBDb252ZXJ0cyAxNmJpdCBMaXR0bGUgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIFVVSUQgdG8gVVVJRAotICBzdGF0aWMgVXVpZCBGcm9tMTZCaXQodWludDE2X3QgdXVpZDE2Yml0KTsKLQotICAvLyBDb252ZXJ0cyAzMmJpdCBMaXR0bGUgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIFVVSUQgdG8gVVVJRAotICBzdGF0aWMgVXVpZCBGcm9tMzJCaXQodWludDMyX3QgdXVpZDMyYml0KTsKLQotICAvLyBDb252ZXJ0cyAxMjggYml0IEJpZyBFbmRpYW4gYXJyYXkgcmVwcmVzZW50aW5nIFVVSUQgdG8gVVVJRC4KLSAgc3RhdGljIFV1aWQgRnJvbTEyOEJpdEJFKGNvbnN0IFVVSUQxMjhCaXQmIHV1aWQpIHsKLSAgICBVdWlkIHUodXVpZCk7Ci0gICAgcmV0dXJuIHU7Ci0gIH0KLQotICAvLyBDb252ZXJ0cyAxMjggYml0IEJpZyBFbmRpYW4gYXJyYXkgcmVwcmVzZW50aW5nIFVVSUQgdG8gVVVJRC4gfHV1aWR8IHBvaW50cwotICAvLyB0byBiZWdpbm5pbmcgb2YgYXJyYXkuCi0gIHN0YXRpYyBVdWlkIEZyb20xMjhCaXRCRShjb25zdCB1aW50OF90KiB1dWlkKTsKLQotICAvLyBDb252ZXJ0cyAxMjggYml0IExpdHRsZSBFbmRpYW4gYXJyYXkgcmVwcmVzZW50aW5nIFVVSUQgdG8gVVVJRC4KLSAgc3RhdGljIFV1aWQgRnJvbTEyOEJpdExFKGNvbnN0IFVVSUQxMjhCaXQmIHV1aWQpOwotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgTGl0dGxlIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELiB8dXVpZHwKLSAgLy8gcG9pbnRzIHRvIGJlZ2lubmluZyBvZiBhcnJheS4KLSAgc3RhdGljIFV1aWQgRnJvbTEyOEJpdExFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpOwotCi0gIC8vIFJldHVybnMgMTI4IGJpdCBMaXR0bGUgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVVJRAotICBVVUlEMTI4Qml0IFRvMTI4Qml0TEUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIDEyOCBiaXQgQmlnIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQKLSAgY29uc3QgVVVJRDEyOEJpdCYgVG8xMjhCaXRCRSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFVVSUQgaXMgZXF1YWwgdG8ga0VtcHR5Ci0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0OwotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFV1aWQmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVdWlkJiByaHMpIGNvbnN0OwotICBib29sIG9wZXJhdG9yIT0oY29uc3QgVXVpZCYgcmhzKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0ZXhwciBVdWlkKGNvbnN0IFVVSUQxMjhCaXQmIHZhbCkgOiB1dXt2YWx9IHt9OwotCi0gIC8vIE5ldHdvcmstYnl0ZS1vcmRlcmVkIElEIChCaWcgRW5kaWFuKS4KLSAgVVVJRDEyOEJpdCB1dSA9IHt9OwotfTsKLX0gIC8vIG5hbWVzcGFjZSBoY2kKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IGJsdWV0b290aDo6aGNpOjpVdWlkJiBhKSB7Ci0gIG9zIDw8IGEuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi0vLyBDdXN0b20gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgYmx1ZXRvb3RoOjpVVUlEIGNhbiBiZSB1c2VkIGFzIGEga2V5Ci0vLyBpbiBzdGQ6OnVub3JkZXJlZF9tYXAuCi1uYW1lc3BhY2Ugc3RkIHsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGJsdWV0b290aDo6aGNpOjpVdWlkPiB7Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OlV1aWQmIGtleSkgY29uc3QgewotICAgIGNvbnN0IGF1dG8mIHV1aWRfYnl0ZXMgPSBrZXkuVG8xMjhCaXRCRSgpOwotICAgIHN0ZDo6aGFzaDxzdGQ6OnN0cmluZz4gaGFzaF9mbjsKLSAgICByZXR1cm4gaGFzaF9mbihzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih1dWlkX2J5dGVzLmRhdGEoKSksIHV1aWRfYnl0ZXMuc2l6ZSgpKSk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGQKZGlmZiAtLWdpdCBhL2dkL2hjaS91dWlkX3VuaXR0ZXN0LmNjIGIvZ2QvaGNpL3V1aWRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWIyZDMuLjAwMDAwMDAKLS0tIGEvZ2QvaGNpL3V1aWRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImhjaS91dWlkLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OlV1aWQ7Ci0KLXN0YXRpYyBjb25zdCBVdWlkIE9ORVMgPSBVdWlkOjpGcm9tMTI4Qml0QkUoCi0gICAgVXVpZDo6VVVJRDEyOEJpdHt7MHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMX19KTsKLQotc3RhdGljIGNvbnN0IFV1aWQgU0VRVUVOVElBTCA9IFV1aWQ6OkZyb20xMjhCaXRCRSgKLSAgICBVdWlkOjpVVUlEMTI4Qml0e3sweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweGFiLCAweGNkLCAweGVmLCAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5fX0pOwotCi1zdGF0aWMgY29uc3QgVXVpZCBrQmFzZSA9IFV1aWQ6OkZyb20xMjhCaXRCRSgKLSAgICBVdWlkOjpVVUlEMTI4Qml0e3sweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifX0pOwotCi1URVNUKFV1aWRUZXN0LCBJc0VtcHR5KSB7Ci0gIEFTU0VSVF9UUlVFKFV1aWQ6OmtFbXB0eS5Jc0VtcHR5KCkpOwotICBBU1NFUlRfRkFMU0Uoa0Jhc2UuSXNFbXB0eSgpKTsKLX0KLQotVEVTVChVdWlkVGVzdCwgR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUpIHsKLSAgQVNTRVJUX1RSVUUoVXVpZDo6a051bUJ5dGVzMTYgPT0ga0Jhc2UuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSk7Ci0gIEFTU0VSVF9UUlVFKFV1aWQ6OmtOdW1CeXRlczMyID09IFV1aWQ6OkZyb20zMkJpdCgweDAxMjM0NTY3KS5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpKTsKLSAgQVNTRVJUX1RSVUUoVXVpZDo6a051bUJ5dGVzMTI4ID09IFV1aWQ6OmtFbXB0eS5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpKTsKLX0KLQotVEVTVChVdWlkVGVzdCwgQXMxNkJpdCkgewotICAvLyBFdmVuIHRob3VnaCB0aGlzIGlzIGlzIG5vdCAxNmJpdCBVVUlELCB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgcHJvcGVyIGJpdHMKLSAgQVNTRVJUX0VRKCh1aW50MTZfdCkweDExMTEsIE9ORVMuQXMxNkJpdCgpKTsKLSAgQVNTRVJUX0VRKCh1aW50MTZfdCkweDQ1NjcsIFNFUVVFTlRJQUwuQXMxNkJpdCgpKTsKLSAgQVNTRVJUX0VRKCh1aW50MTZfdCkweDAwMDAsIGtCYXNlLkFzMTZCaXQoKSk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIEFzMzJCaXQpIHsKLSAgLy8gRXZlbiB0aG91Z2ggdGhpcyBpcyBpcyBub3QgMzJiaXQgVVVJRCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHByb3BlciBiaXRzCi0gIEFTU0VSVF9FUSgodWludDMyX3QpMHgxMTExMTExMSwgT05FUy5BczMyQml0KCkpOwotICBBU1NFUlRfRVEoKHVpbnQzMl90KTB4MDEyMzQ1NjcsIFNFUVVFTlRJQUwuQXMzMkJpdCgpKTsKLSAgQVNTRVJUX0VRKCh1aW50MzJfdCkweDAwMDAwMDAwLCBrQmFzZS5BczMyQml0KCkpOwotICBBU1NFUlRfRVEoKHVpbnQzMl90KTB4MTIzNDU2NzgsIFV1aWQ6OkZyb20zMkJpdCgweDEyMzQ1Njc4KS5BczMyQml0KCkpOwotfQotCi1URVNUKFV1aWRUZXN0LCBJczE2Qml0KSB7Ci0gIEFTU0VSVF9GQUxTRShPTkVTLklzMTZCaXQoKSk7Ci0gIEFTU0VSVF9GQUxTRShTRVFVRU5USUFMLklzMTZCaXQoKSk7Ci0gIEFTU0VSVF9UUlVFKGtCYXNlLklzMTZCaXQoKSk7Ci0gIGF1dG8gdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIjFhZTgiKTsKLSAgQVNTRVJUX1RSVUUodXVpZCk7Ci0gIEFTU0VSVF9UUlVFKHV1aWQtPklzMTZCaXQoKSk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIEZyb20xNkJpdCkgewotICBBU1NFUlRfRVEoVXVpZDo6RnJvbTE2Qml0KDB4MDAwMCksIGtCYXNlKTsKLQotICBjb25zdCB1aW50OF90IHUyW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIFV1aWQgdXVpZCA9IFV1aWQ6OkZyb20xNkJpdCgweDAwMDEpOwotICBBU1NFUlRfVFJVRShtZW1jbXAodXVpZC5kYXRhKCksIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgwMCwgMHgwMCwgMHg1NSwgMHgzZSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIHV1aWQgPSBVdWlkOjpGcm9tMTZCaXQoMHg1NTNlKTsKLSAgQVNTRVJUX1RSVUUobWVtY21wKHV1aWQuZGF0YSgpLCB1Mywgc2l6ZW9mKHUzKSkgPT0gMCk7Ci0KLSAgY29uc3QgdWludDhfdCB1NFtdID0gezB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9OwotICB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KDB4ZmZmZik7Ci0gIEFTU0VSVF9UUlVFKG1lbWNtcCh1dWlkLmRhdGEoKSwgdTQsIHNpemVvZih1NCkpID09IDApOwotfQotCi1URVNUKFV1aWRUZXN0LCBGcm9tMzJCaXQpIHsKLSAgQVNTRVJUX0VRKFV1aWQ6OkZyb20zMkJpdCgweDAwMDAwMDAwKSwga0Jhc2UpOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTJbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTMyQml0KDB4MDAwMDAwMDEpOwotICBBU1NFUlRfVFJVRShtZW1jbXAodXVpZC5kYXRhKCksIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgzMywgMHg0NCwgMHg1NSwgMHgzZSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIHV1aWQgPSBVdWlkOjpGcm9tMzJCaXQoMHgzMzQ0NTUzZSk7Ci0gIEFTU0VSVF9UUlVFKG1lbWNtcCh1dWlkLmRhdGEoKSwgdTMsIHNpemVvZih1MykpID09IDApOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTRbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgdXVpZCA9IFV1aWQ6OkZyb20zMkJpdCgweGZmZmZmZmZmKTsKLSAgQVNTRVJUX1RSVUUobWVtY21wKHV1aWQuZGF0YSgpLCB1NCwgc2l6ZW9mKHU0KSkgPT0gMCk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIFRvU3RyaW5nKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIFVVSURfQkFTRV9TVFIgPSAiMDAwMDAwMDAtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgVVVJRF9FTVBfU1RSID0gIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCI7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIFVVSURfT05FU19TVFIgPSAiMTExMTExMTEtMTExMS0xMTExLTExMTEtMTExMTExMTExMTExIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgVVVJRF9TRVFfU1RSID0gIjAxMjM0NTY3LTg5YWItY2RlZi1hYmNkLWVmMDEyMzQ1Njc4OSI7Ci0KLSAgQVNTRVJUX0VRKFVVSURfQkFTRV9TVFIsIGtCYXNlLlRvU3RyaW5nKCkpOwotICBBU1NFUlRfRVEoVVVJRF9FTVBfU1RSLCBVdWlkOjprRW1wdHkuVG9TdHJpbmcoKSk7Ci0gIEFTU0VSVF9FUShVVUlEX09ORVNfU1RSLCBPTkVTLlRvU3RyaW5nKCkpOwotICBBU1NFUlRfRVEoVVVJRF9TRVFfU1RSLCBTRVFVRU5USUFMLlRvU3RyaW5nKCkpOwotCi0gIFV1aWQgdXVpZCA9IFV1aWQ6OkZyb20zMkJpdCgweDEyMzQ1Njc4KTsKLSAgQVNTRVJUX0VRKCIxMjM0NTY3OC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiLCB1dWlkLlRvU3RyaW5nKCkpOwotfQotCi1URVNUKFV1aWRUZXN0LCB0ZXN0X3N0cmluZ190b191dWlkKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgdTFbXSA9IHsweGUzLCAweDljLCAweDYyLCAweDg1LCAweDg2LCAweDdmLCAweDRiLCAweDFkLCAweDlkLCAweGIwLCAweDM1LCAweGZiLCAweGQ5LCAweGFlLCAweGJmLCAweDIyfTsKLSAgYXV0byB1dWlkID0gVXVpZDo6RnJvbVN0cmluZygiZTM5YzYyODUtODY3Zi00YjFkLTlkYjAtMzVmYmQ5YWViZjIyIik7Ci0gIEFTU0VSVF9UUlVFKHV1aWQpOwotICBBU1NFUlRfVFJVRShtZW1jbXAodXVpZC0+ZGF0YSgpLCB1MSwgc2l6ZW9mKHUxKSkgPT0gMCk7Ci0KLSAgY29uc3QgdWludDhfdCB1MltdID0gezB4MDAsIDB4MDAsIDB4MWEsIDB4ZTgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9OwotICB1dWlkID0gVXVpZDo6RnJvbVN0cmluZygiMUFlOCIpOwotICBBU1NFUlRfVFJVRSh1dWlkKTsKLSAgQVNTRVJUX1RSVUUobWVtY21wKHV1aWQtPmRhdGEoKSwgdTIsIHNpemVvZih1MikpID09IDApOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTNbXSA9IHsweDEyLCAweDM0LCAweDExLCAweDI4LCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIjEyMzQxMTI4Iik7Ci0gIEFTU0VSVF9UUlVFKHV1aWQpOwotICBBU1NFUlRfVFJVRShtZW1jbXAodXVpZC0+ZGF0YSgpLCB1Mywgc2l6ZW9mKHUzKSkgPT0gMCk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIHRlc3Rfc3RyaW5nX3RvX3V1aWRfaW52YWxpZCkgewotICBBU1NFUlRfRkFMU0UoVXVpZDo6RnJvbVN0cmluZygiVGhpcyBpcyBub3QgYSBVVUlEIikpOwotICBBU1NFUlRfRkFMU0UoVXVpZDo6RnJvbVN0cmluZygiMTEyMTIiKSk7Ci0gIEFTU0VSVF9GQUxTRShVdWlkOjpGcm9tU3RyaW5nKCIxMTIxICIpKTsKLSAgQVNTRVJUX0ZBTFNFKFV1aWQ6OkZyb21TdHJpbmcoIkFHRkUiKSk7Ci0gIEFTU0VSVF9GQUxTRShVdWlkOjpGcm9tU3RyaW5nKCJBQkZHIikpOwotICBBU1NFUlRfRkFMU0UoVXVpZDo6RnJvbVN0cmluZygiZTM5YzYyODU4NjdmMTRiMWQ5ZGIwMzVmYmQ5YWViZjIyIikpOwotICBBU1NFUlRfRkFMU0UoVXVpZDo6RnJvbVN0cmluZygiMTIyMzQ1NjctODlhYi1jZGVmLWFiY2QtZWYwMTIzNDU2N1paIikpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvZ2QvaGNpL3ZlbmRvcl9zcGVjaWZpY19ldmVudF9tYW5hZ2VyLmNjIGIvZ2QvaGNpL3ZlbmRvcl9zcGVjaWZpY19ldmVudF9tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDYxNzFkLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS92ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgImhjaS92ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5oIgotCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgVmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXI6OkZhY3RvcnkgPQotICAgIE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgVmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIoKTsgfSk7Ci0KLXN0cnVjdCBWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcjo6aW1wbCB7Ci0gIGltcGwoTW9kdWxlKiBtb2R1bGUpIDogbW9kdWxlXyhtb2R1bGUpe307Ci0KLSAgfmltcGwoKSB7fQotCi0gIHZvaWQgc3RhcnQob3M6OkhhbmRsZXIqIGhhbmRsZXIsIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllciwgaGNpOjpDb250cm9sbGVyKiBjb250cm9sbGVyKSB7Ci0gICAgbW9kdWxlX2hhbmRsZXJfID0gaGFuZGxlcjsKLSAgICBoY2lfbGF5ZXJfID0gaGNpX2xheWVyOwotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgICBoY2lfbGF5ZXJfLT5SZWdpc3RlckV2ZW50SGFuZGxlcigKLSAgICAgICAgRXZlbnRDb2RlOjpWRU5ET1JfU1BFQ0lGSUMsIGhhbmRsZXItPkJpbmRPbih0aGlzLCAmVmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXI6OmltcGw6Om9uX3ZlbmRvcl9zcGVjaWZpY19ldmVudCkpOwotICAgIHZlbmRvcl9jYXBhYmlsaXRpZXNfID0gY29udHJvbGxlci0+R2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCk7Ci0gIH0KLQotICB2b2lkIHN0b3AoKSB7fQotCi0gIHZvaWQgcmVnaXN0ZXJfZXZlbnQoVnNlU3ViZXZlbnRDb2RlIGV2ZW50LCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKFZlbmRvclNwZWNpZmljRXZlbnRWaWV3KT4gaGFuZGxlcikgewotICAgIEFTU0VSVF9MT0coCi0gICAgICAgIHN1YmV2ZW50X2hhbmRsZXJzXy5jb3VudChldmVudCkgPT0gMCwKLSAgICAgICAgIkNhbiBub3QgcmVnaXN0ZXIgYSBzZWNvbmQgaGFuZGxlciBmb3IgJTAyaGh4ICglcykiLAotICAgICAgICBldmVudCwKLSAgICAgICAgVnNlU3ViZXZlbnRDb2RlVGV4dChldmVudCkuY19zdHIoKSk7Ci0gICAgc3ViZXZlbnRfaGFuZGxlcnNfW2V2ZW50XSA9IGhhbmRsZXI7Ci0gIH0KLQotICB2b2lkIHVucmVnaXN0ZXJfZXZlbnQoVnNlU3ViZXZlbnRDb2RlIGV2ZW50KSB7Ci0gICAgc3ViZXZlbnRfaGFuZGxlcnNfLmVyYXNlKHN1YmV2ZW50X2hhbmRsZXJzXy5maW5kKGV2ZW50KSk7Ci0gIH0KLQotICBib29sIGNoZWNrX2V2ZW50X3N1cHBvcnRlZChWc2VTdWJldmVudENvZGUgZXZlbnQpIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBjYXNlIChWc2VTdWJldmVudENvZGU6OkJMRV9USFJFU0hPTEQpOiB7Ci0gICAgICAgIGlmICh2ZW5kb3JfY2FwYWJpbGl0aWVzXy50b3RhbF9zY2FuX3Jlc3VsdHNfc3RvcmFnZV8gPiAwKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIChWc2VTdWJldmVudENvZGU6OkJMRV9UUkFDS0lORyk6IHsKLSAgICAgICAgaWYgKHZlbmRvcl9jYXBhYmlsaXRpZXNfLnRvdGFsX251bV9vZl9hZHZ0X3RyYWNrZWRfID4gMCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAoVnNlU3ViZXZlbnRDb2RlOjpERUJVR19JTkZPKTogewotICAgICAgICByZXR1cm4gdmVuZG9yX2NhcGFiaWxpdGllc18uZGVidWdfbG9nZ2luZ19zdXBwb3J0ZWRfOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgKFZzZVN1YmV2ZW50Q29kZTo6QlFSX0VWRU5UKTogewotICAgICAgICByZXR1cm4gdmVuZG9yX2NhcGFiaWxpdGllc18uYmx1ZXRvb3RoX3F1YWxpdHlfcmVwb3J0X3N1cHBvcnRfOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19XQVJOKCJVbmhhbmRsZWQgZXZlbnQgJXMiLCBWc2VTdWJldmVudENvZGVUZXh0KGV2ZW50KS5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBvbl92ZW5kb3Jfc3BlY2lmaWNfZXZlbnQoRXZlbnRWaWV3IGV2ZW50X3ZpZXcpIHsKLSAgICBhdXRvIHZlbmRvcl9zcGVjaWZpY19ldmVudF92aWV3ID0gVmVuZG9yU3BlY2lmaWNFdmVudFZpZXc6OkNyZWF0ZShldmVudF92aWV3KTsKLSAgICBBU1NFUlQodmVuZG9yX3NwZWNpZmljX2V2ZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgICBWc2VTdWJldmVudENvZGUgdnNlX3N1YmV2ZW50X2NvZGUgPSB2ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfdmlldy5HZXRTdWJldmVudENvZGUoKTsKLSAgICBpZiAoc3ViZXZlbnRfaGFuZGxlcnNfLmZpbmQodnNlX3N1YmV2ZW50X2NvZGUpID09IHN1YmV2ZW50X2hhbmRsZXJzXy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIlVuaGFuZGxlZCB2ZW5kb3Igc3BlY2lmaWMgZXZlbnQgb2YgdHlwZSAweCUwMmhoeCIsIHZzZV9zdWJldmVudF9jb2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3ViZXZlbnRfaGFuZGxlcnNfW3ZzZV9zdWJldmVudF9jb2RlXS5JbnZva2UodmVuZG9yX3NwZWNpZmljX2V2ZW50X3ZpZXcpOwotICB9Ci0KLSAgTW9kdWxlKiBtb2R1bGVfOwotICBvczo6SGFuZGxlciogbW9kdWxlX2hhbmRsZXJfOwotICBoY2k6OkhjaUxheWVyKiBoY2lfbGF5ZXJfOwotICBoY2k6OkNvbnRyb2xsZXIqIGNvbnRyb2xsZXJfOwotICBWZW5kb3JDYXBhYmlsaXRpZXMgdmVuZG9yX2NhcGFiaWxpdGllc187Ci0gIHN0ZDo6bWFwPFZzZVN1YmV2ZW50Q29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChWZW5kb3JTcGVjaWZpY0V2ZW50Vmlldyk+PiBzdWJldmVudF9oYW5kbGVyc187Ci19OwotCi1WZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcjo6VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIoKSB7Ci0gIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4odGhpcyk7Ci19Ci0KLXZvaWQgVmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXI6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICBsaXN0LT5hZGQ8aGNpOjpIY2lMYXllcj4oKTsKLSAgbGlzdC0+YWRkPGhjaTo6Q29udHJvbGxlcj4oKTsKLX0KLQotdm9pZCBWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcjo6U3RhcnQoKSB7Ci0gIHBpbXBsXy0+c3RhcnQoR2V0SGFuZGxlcigpLCBHZXREZXBlbmRlbmN5PGhjaTo6SGNpTGF5ZXI+KCksIEdldERlcGVuZGVuY3k8aGNpOjpDb250cm9sbGVyPigpKTsKLX0KLQotdm9pZCBWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcjo6U3RvcCgpIHsKLSAgcGltcGxfLT5zdG9wKCk7Ci0gIHBpbXBsXy5yZXNldCgpOwotfQotCi1zdGQ6OnN0cmluZyBWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcjo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiVmVuZG9yIFNwZWNpZmljIEV2ZW50IE1hbmFnZXIiOwotfQotCi12b2lkIFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyOjpSZWdpc3RlckV2ZW50SGFuZGxlcigKLSAgICBWc2VTdWJldmVudENvZGUgZXZlbnQsIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoVmVuZG9yU3BlY2lmaWNFdmVudFZpZXcpPiBoYW5kbGVyKSB7Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZpbXBsOjpyZWdpc3Rlcl9ldmVudCwgZXZlbnQsIGhhbmRsZXIpOwotfQotCi12b2lkIFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyOjpVbnJlZ2lzdGVyRXZlbnRIYW5kbGVyKFZzZVN1YmV2ZW50Q29kZSBldmVudCkgewotICBDYWxsT24ocGltcGxfLmdldCgpLCAmaW1wbDo6dW5yZWdpc3Rlcl9ldmVudCwgZXZlbnQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9oY2kvdmVuZG9yX3NwZWNpZmljX2V2ZW50X21hbmFnZXIuaCBiL2dkL2hjaS92ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTBmMzMzLi4wMDAwMDAwCi0tLSBhL2dkL2hjaS92ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLWNsYXNzIFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyIDogcHVibGljIGJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyKCk7Ci0KLSAgdm9pZCBSZWdpc3RlckV2ZW50SGFuZGxlcihWc2VTdWJldmVudENvZGUgZXZlbnQsIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoVmVuZG9yU3BlY2lmaWNFdmVudFZpZXcpPiBoYW5kbGVyKTsKLQotICB2b2lkIFVucmVnaXN0ZXJFdmVudEhhbmRsZXIoVnNlU3ViZXZlbnRDb2RlIGV2ZW50KTsKLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2lzby9BbmRyb2lkLmJwIGIvZ2QvaXNvL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDdjMzkuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhJc29Tb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0JICAgICJpc29fbWFuYWdlci5jYyIsCi0JICAgICJpc29fbW9kdWxlLmNjIiwKLQkgICAgImludGVybmFsL2lzb19tYW5hZ2VyX2ltcGwuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aElzb1Rlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlX2lzb19sYXllciIsCi0gICAgc3JjczogWwotICAgICAgICAiZmFjYWRlLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvaXNvL2NlcnQvY2VydF9sZV9pc28ucHkgYi9nZC9pc28vY2VydC9jZXJ0X2xlX2lzby5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwNDM2NC4uMDAwMDAwMAotLS0gYS9nZC9pc28vY2VydC9jZXJ0X2xlX2lzby5weQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC5weV9sZV9pc28gaW1wb3J0IFB5TGVJc28KLWltcG9ydCBibHVldG9vdGhfcGFja2V0c19weXRob24zIGFzIGJ0X3BhY2tldHMKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgbDJjYXBfcGFja2V0cwotCi0KLWNsYXNzIENlcnRMZUlzbyhDbG9zYWJsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGV2aWNlKToKLSAgICAgICAgc2VsZi5fZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYuX2xlX2lzbyA9IFB5TGVJc28oZGV2aWNlKQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBsb2dnaW5nLmluZm8oIkRVVDogY2xvc2UiKQotICAgICAgICBzZWxmLl9sZV9pc28uY2xvc2UoKQotCi0gICAgZGVmIGxlX3NldF9jaWdfcGFyYW1ldGVycyhzZWxmLCBjaWdfaWQsIHNkdV9pbnRlcnZhbF9tX3RvX3MsIHNkdV9pbnRlcnZhbF9zX3RvX20sIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2luZywgZnJhbWluZywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwgY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3NkdV9tX3RvX3MsIG1heF9zZHVfc190b19tLCBwaHlfbV90b19zLCBwaHlfc190b19tLCBydG5fbV90b19zLCBydG5fc190b19tKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2xlX2lzby5sZV9zZXRfY2lnX3BhcmFtZXRlcnMoCi0gICAgICAgICAgICBjaWdfaWQsIHNkdV9pbnRlcnZhbF9tX3RvX3MsIHNkdV9pbnRlcnZhbF9zX3RvX20sIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LCBwYWNraW5nLCBmcmFtaW5nLAotICAgICAgICAgICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwgY2lzX2lkLCBtYXhfc2R1X21fdG9fcywgbWF4X3NkdV9zX3RvX20sCi0gICAgICAgICAgICBwaHlfbV90b19zLCBwaHlfc190b19tLCBydG5fbV90b19zLCBydG5fc190b19tKQotCi0gICAgZGVmIGxlX3NldF9jaWdfcGFyYW1ldGVyc190ZXN0KHNlbGYsIGNpZ19pZCwgc2R1X2ludGVydmFsX21fdG9fcywgc2R1X2ludGVydmFsX3NfdG9fbSwgZnRfbV90b19zLCBmdF9zX3RvX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb19pbnRlcnZhbCwgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksIHBhY2tpbmcsIGZyYW1pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sIGNpc19jb25maWdzKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2xlX2lzby5sZV9zZXRfY2lnX3BhcmFtZXRlcnNfdGVzdChjaWdfaWQsIHNkdV9pbnRlcnZhbF9tX3RvX3MsIHNkdV9pbnRlcnZhbF9zX3RvX20sIGZ0X21fdG9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdF9zX3RvX20sIGlzb19pbnRlcnZhbCwgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksIHBhY2tpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tLCBjaXNfY29uZmlncykKLQotICAgIGRlZiB3YWl0X2xlX3NldF9jaWdfcGFyYW1ldGVyc19jb21wbGV0ZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2xlX2lzby53YWl0X2xlX3NldF9jaWdfcGFyYW1ldGVyc19jb21wbGV0ZSgpCi0KLSAgICBkZWYgbGVfY3JldGF0ZV9jaXMoc2VsZiwgY2lzX2FuZF9hY2xfaGFuZGxlX2FycmF5KToKLSAgICAgICAgc2VsZi5fbGVfaXNvLmxlX2NyZWF0ZV9jaXMoY2lzX2FuZF9hY2xfaGFuZGxlX2FycmF5KQotCi0gICAgZGVmIHdhaXRfbGVfY2lzX2VzdGFibGlzaGVkKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fbGVfaXNvLndhaXRfbGVfY2lzX2VzdGFibGlzaGVkKCkKZGlmZiAtLWdpdCBhL2dkL2lzby9jZXJ0L2xlX2lzb190ZXN0LnB5IGIvZ2QvaXNvL2NlcnQvbGVfaXNvX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDMxNDQuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2NlcnQvbGVfaXNvX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jCi0jICAgQ29weXJpZ2h0IDIwMjEgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gY2VydC5nZF9iYXNlX3Rlc3QgaW1wb3J0IEdkQmFzZVRlc3RDbGFzcwotZnJvbSBpc28uY2VydC5sZV9pc29fdGVzdF9saWIgaW1wb3J0IExlSXNvVGVzdEJhc2UKLQotCi1jbGFzcyBMZUlzb1Rlc3QoR2RCYXNlVGVzdENsYXNzLCBMZUlzb1Rlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0wyQ0FQJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfdGVzdChzZWxmKQotICAgICAgICBMZUlzb1Rlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMZUlzb1Rlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKZGlmZiAtLWdpdCBhL2dkL2lzby9jZXJ0L2xlX2lzb190ZXN0X2xpYi5weSBiL2dkL2lzby9jZXJ0L2xlX2lzb190ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiNmEwYS4uMDAwMDAwMAotLS0gYS9nZC9pc28vY2VydC9sZV9pc29fdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDIxIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgdGltZQotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgSGNpTWF0Y2hlcnMsIElzb01hdGNoZXJzLCBMMmNhcE1hdGNoZXJzCi1mcm9tIGNlcnQubWV0YWRhdGEgaW1wb3J0IG1ldGFkYXRhCi1mcm9tIGNlcnQucHlfaGNpIGltcG9ydCBQeUhjaQotZnJvbSBjZXJ0LnB5X2wyY2FwIGltcG9ydCBQeUxlTDJjYXAKLWZyb20gY2VydC5weV9sZV9pc28gaW1wb3J0IFB5TGVJc28KLWZyb20gY2VydC5weV9sZV9pc28gaW1wb3J0IENpc1Rlc3RQYXJhbWV0ZXJzCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQotZnJvbSBmYWNhZGUgaW1wb3J0IGNvbW1vbl9wYjIgYXMgY29tbW9uCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGNvbnRyb2xsZXJfZmFjYWRlX3BiMiBhcyBjb250cm9sbGVyX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZV9wYjIgYXMgbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZV9wYjIgYXMgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi1mcm9tIG5laWdoYm9yLmZhY2FkZSBpbXBvcnQgZmFjYWRlX3BiMiBhcyBuZWlnaGJvcl9mYWNhZGUKLWZyb20gbDJjYXAubGUuY2VydC5jZXJ0X2xlX2wyY2FwIGltcG9ydCBDZXJ0TGVMMmNhcAotZnJvbSBpc28uY2VydC5jZXJ0X2xlX2lzbyBpbXBvcnQgQ2VydExlSXNvCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzCi0KLQotY2xhc3MgTGVJc29UZXN0QmFzZSgpOgotICAgICIiIgotICAgICAgICBDb2xsZWN0aW9uIG9mIHRlc3RzIHRoYXQgZWFjaCBzYW1wbGUgcmVzdWx0cyBmcm9tCi0gICAgICAgIGRpZmZlcmVudCAodW5pcXVlKSBjb21iaW5hdGlvbnMgb2YgaW8gY2FwYWJpbGl0aWVzLCBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudHMsIGFuZCBvb2IgZGF0YS4KLSAgICAiIiIKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIHNlbGYuZHV0ID0gZHV0Ci0gICAgICAgIHNlbGYuY2VydCA9IGNlcnQKLQotICAgICAgICBzZWxmLmR1dF9sMmNhcCA9IFB5TGVMMmNhcChzZWxmLmR1dCkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwID0gQ2VydExlTDJjYXAoc2VsZi5jZXJ0KQotICAgICAgICBzZWxmLmR1dF9hZGRyZXNzID0gY29tbW9uLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcyhiJ0QwOjA1OjA0OjAzOjAyOjAxJykpLCB0eXBlPWNvbW1vbi5SQU5ET01fREVWSUNFX0FERFJFU1MpCi0gICAgICAgIHNlbGYuY2VydF9hZGRyZXNzID0gY29tbW9uLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1ieXRlcyhiJ0MwOjExOkZGOkFBOjMzOjIyJykpLCB0eXBlPWNvbW1vbi5SQU5ET01fREVWSUNFX0FERFJFU1MpCi0gICAgICAgIGR1dF9wcml2YWN5X3BvbGljeSA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3k9bGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLkFkZHJlc3NQb2xpY3kuVVNFX1NUQVRJQ19BRERSRVNTLAotICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGU9c2VsZi5kdXRfYWRkcmVzcywKLSAgICAgICAgICAgIHJvdGF0aW9uX2lyaz1iJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnLAotICAgICAgICAgICAgbWluaW11bV9yb3RhdGlvbl90aW1lPTAsCi0gICAgICAgICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWU9MCkKLSAgICAgICAgc2VsZi5kdXRfbDJjYXAuX2RldmljZS5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MoZHV0X3ByaXZhY3lfcG9saWN5KQotICAgICAgICBwcml2YWN5X3BvbGljeSA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3k9bGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLkFkZHJlc3NQb2xpY3kuVVNFX1NUQVRJQ19BRERSRVNTLAotICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGU9c2VsZi5jZXJ0X2FkZHJlc3MsCi0gICAgICAgICAgICByb3RhdGlvbl9pcms9YidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJywKLSAgICAgICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZT0wLAotICAgICAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lPTApCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5fZGV2aWNlLmhjaV9sZV9pbml0aWF0b3JfYWRkcmVzcy5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcyhwcml2YWN5X3BvbGljeSkKLQotICAgICAgICBzZWxmLmR1dF9pc28gPSBQeUxlSXNvKHNlbGYuZHV0KQotICAgICAgICBzZWxmLmNlcnRfaXNvID0gQ2VydExlSXNvKHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9pc28uY2xvc2UoKQotICAgICAgICBzZWxmLmNlcnRfaXNvLmNsb3NlKCkKLQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuY2xvc2UoKQotICAgICAgICBzZWxmLmR1dF9sMmNhcC5jbG9zZSgpCi0KLSAgICAjY2VydCBiZWNvbWVzIGNlbnRyYWwgb2YgY29ubmVjdGlvbiwgZHV0IHBlcmlwaGVyYWwKLSAgICBkZWYgX3NldHVwX2xpbmtfZnJvbV9jZXJ0KHNlbGYpOgotICAgICAgICAjIERVVCBBZHZlcnRpc2VzCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9UaGVfRFVUJykpCi0gICAgICAgIGdhcF9kYXRhID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkdhcERhdGFNc2coZGF0YT1ieXRlcyhnYXBfbmFtZS5TZXJpYWxpemUoKSkpCi0gICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0NvbmZpZygKLSAgICAgICAgICAgIGFkdmVydGlzZW1lbnQ9W2dhcF9kYXRhXSwKLSAgICAgICAgICAgIGludGVydmFsX21pbj01MTIsCi0gICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfdHlwZT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdFdmVudFR5cGUuQURWX0lORCwKLSAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9Y29tbW9uLlVTRV9SQU5ET01fREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMpCi0gICAgICAgIHJlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQ3JlYXRlQWR2ZXJ0aXNlclJlcXVlc3QoY29uZmlnPWNvbmZpZykKLSAgICAgICAgY3JlYXRlX3Jlc3BvbnNlID0gc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuY29ubmVjdF9sZV9hY2woc2VsZi5kdXRfYWRkcmVzcykKLQotICAgIGRlZiBfc2V0dXBfY2lzX2Zyb21fY2VydChzZWxmLCBjaWdfaWQsIHNkdV9pbnRlcnZhbF9tX3RvX3MsIHNkdV9pbnRlcnZhbF9zX3RvX20sIGZ0X21fdG9fcywgZnRfc190b19tLCBpc29faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LCBwYWNraW5nLCBmcmFtaW5nLCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tLCBjaXNfY29uZmlncyk6Ci0gICAgICAgIHNlbGYuY2VydF9pc28ubGVfc2V0X2NpZ19wYXJhbWV0ZXJzX3Rlc3QoY2lnX2lkLCBzZHVfaW50ZXJ2YWxfbV90b19zLCBzZHVfaW50ZXJ2YWxfc190b19tLCBmdF9tX3RvX3MsIGZ0X3NfdG9fbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29faW50ZXJ2YWwsIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LCBwYWNraW5nLCBmcmFtaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzX2NvbmZpZ3MpCi0KLSAgICAgICAgY2lzX2hhbmRsZXMgPSBzZWxmLmNlcnRfaXNvLndhaXRfbGVfc2V0X2NpZ19wYXJhbWV0ZXJzX2NvbXBsZXRlKCkKLQotICAgICAgICBjaXNfaGFuZGxlID0gY2lzX2hhbmRsZXNbMF0KLQotICAgICAgICBhY2xfY29ubmVjdGlvbl9oYW5kbGUgPSBzZWxmLmNlcnRfbDJjYXAuX2xlX2FjbC5oYW5kbGUKLSAgICAgICAgc2VsZi5jZXJ0X2lzby5sZV9jcmV0YXRlX2NpcyhbKGNpc19oYW5kbGUsIGFjbF9jb25uZWN0aW9uX2hhbmRsZSldKQotICAgICAgICBkdXRfY2lzX3N0cmVhbSA9IHNlbGYuZHV0X2lzby53YWl0X2xlX2Npc19lc3RhYmxpc2hlZCgpCi0gICAgICAgIGNlcnRfY2lzX3N0cmVhbSA9IHNlbGYuY2VydF9pc28ud2FpdF9sZV9jaXNfZXN0YWJsaXNoZWQoKQotICAgICAgICByZXR1cm4gKGR1dF9jaXNfc3RyZWFtLCBjZXJ0X2Npc19zdHJlYW0pCi0KLSAgICBkZWYgc2tpcF9pZl9pc29fbm90X3N1cHBvcnRlZChzZWxmKToKLSAgICAgICAgc3VwcG9ydGVkID0gc2VsZi5kdXQuaGNpX2NvbnRyb2xsZXIuSXNTdXBwb3J0ZWRDb21tYW5kKAotICAgICAgICAgICAgY29udHJvbGxlcl9mYWNhZGUuT3BDb2RlTXNnKG9wX2NvZGU9aW50KGhjaV9wYWNrZXRzLk9wQ29kZS5MRV9TRVRfQ0lHX1BBUkFNRVRFUlMpKSkKLSAgICAgICAgaWYgKG5vdCBzdXBwb3J0ZWQuc3VwcG9ydGVkKToKLSAgICAgICAgICAgIGFzc2VydHMuc2tpcCgiU2tpcHBpbmcgdGhpcyB0ZXN0LiAgVGhlIGNoaXAgZG9lc24ndCBzdXBwb3J0IExFIElTTyIpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJJQUwvQ0lTL1VORi9TTEEvQlYtMDEtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9ImNvbm5lY3RlZCBpc29jaHJvbm91cyBzdHJlYW0sIHVuZnJhbWVkIGRhdGEsIHBlcmlwaGVyYWwgcm9sZSIpCi0gICAgZGVmIHRlc3RfaXNvX2Npc191bmZfc2xhX2J2XzAxX2Moc2VsZik6Ci0gICAgICAgIHNlbGYuc2tpcF9pZl9pc29fbm90X3N1cHBvcnRlZCgpCi0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBjYW4gc2VuZCBhbiBTRFUgd2l0aCBsZW5ndGgg4omkIHRoZSBJc29jaHJvbm91cyBQRFUgbGVuZ3RoLgotICAgICAgICAiIiIKLSAgICAgICAgY2lnX2lkID0gMHgwMQotICAgICAgICBzZHVfaW50ZXJ2YWxfbV90b19zID0gMAotICAgICAgICBzZHVfaW50ZXJ2YWxfc190b19tID0gMHgxODZhCi0gICAgICAgIGZ0X21fdG9fcyA9IDAKLSAgICAgICAgZnRfc190b19tID0gMQotICAgICAgICBpc29faW50ZXJ2YWwgPSAweDBBCi0gICAgICAgIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5ID0gMAotICAgICAgICBwYWNraW5nID0gMAotICAgICAgICBmcmFtaW5nID0gMAotICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zID0gMAotICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tID0gMAotICAgICAgICBjaXNfY29uZmlncyA9IFsKLSAgICAgICAgICAgIENpc1Rlc3RQYXJhbWV0ZXJzKAotICAgICAgICAgICAgICAgIGNpc19pZD0weDAxLAotICAgICAgICAgICAgICAgIG5zZT0yLAotICAgICAgICAgICAgICAgIG1heF9zZHVfbV90b19zPTEwMCwKLSAgICAgICAgICAgICAgICBtYXhfc2R1X3NfdG9fbT0xMDAsCi0gICAgICAgICAgICAgICAgbWF4X3BkdV9tX3RvX3M9MTAwLAotICAgICAgICAgICAgICAgIG1heF9wZHVfc190b19tPTEwMCwKLSAgICAgICAgICAgICAgICBwaHlfbV90b19zPTB4MDIsCi0gICAgICAgICAgICAgICAgcGh5X3NfdG9fbT0weDAwLAotICAgICAgICAgICAgICAgIGJuX21fdG9fcz0wLAotICAgICAgICAgICAgICAgIGJuX3NfdG9fbT0yLAotICAgICAgICAgICAgKQotICAgICAgICBdCi0KLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2Npc19zdHJlYW0sIGNlcnRfY2lzX3N0cmVhbSkgPSBzZWxmLl9zZXR1cF9jaXNfZnJvbV9jZXJ0KAotICAgICAgICAgICAgY2lnX2lkLCBzZHVfaW50ZXJ2YWxfbV90b19zLCBzZHVfaW50ZXJ2YWxfc190b19tLCBmdF9tX3RvX3MsIGZ0X3NfdG9fbSwgaXNvX2ludGVydmFsLAotICAgICAgICAgICAgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksIHBhY2tpbmcsIGZyYW1pbmcsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICAgICAgICBjaXNfY29uZmlncykKLSAgICAgICAgZHV0X2Npc19zdHJlYW0uc2VuZChiJ2FiY2RlZmdoJyAqIDEwKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2lzX3N0cmVhbSkuZW1pdHMoSXNvTWF0Y2hlcnMuRGF0YShiJ2FiY2RlZmdoJyAqIDEwKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IklBTC9DSVMvVU5GL1NMQS9CVi0yNS1DIiwKLSAgICAgICAgcHRzX3Rlc3RfbmFtZT0iY29ubmVjdGVkIGlzb2Nocm9ub3VzIHN0cmVhbSwgdW5mcmFtZWQgZGF0YSwgcGVyaXBoZXJhbCByb2xlIikKLSAgICBkZWYgdGVzdF9pc29fY2lzX3VuZl9zbGFfYnZfMjVfYyhzZWxmKToKLSAgICAgICAgc2VsZi5za2lwX2lmX2lzb19ub3Rfc3VwcG9ydGVkKCkKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGNhbiBzZW5kIGFuIFNEVSB3aXRoIGxlbmd0aCDiiaQgdGhlIElzb2Nocm9ub3VzIFBEVSBsZW5ndGguCi0gICAgICAgICIiIgotICAgICAgICBjaWdfaWQgPSAweDAxCi0gICAgICAgIHNkdV9pbnRlcnZhbF9tX3RvX3MgPSAweDc1MzAKLSAgICAgICAgc2R1X2ludGVydmFsX3NfdG9fbSA9IDB4NzUzMAotICAgICAgICBmdF9tX3RvX3MgPSAzCi0gICAgICAgIGZ0X3NfdG9fbSA9IDIKLSAgICAgICAgaXNvX2ludGVydmFsID0gMHgxOAotICAgICAgICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSA9IDAKLSAgICAgICAgcGFja2luZyA9IDAKLSAgICAgICAgZnJhbWluZyA9IDAKLSAgICAgICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcyA9IDAKLSAgICAgICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSA9IDAKLSAgICAgICAgY2lzX2NvbmZpZ3MgPSBbCi0gICAgICAgICAgICBDaXNUZXN0UGFyYW1ldGVycygKLSAgICAgICAgICAgICAgICBjaXNfaWQ9MHgwMSwKLSAgICAgICAgICAgICAgICBuc2U9NSwKLSAgICAgICAgICAgICAgICBtYXhfc2R1X21fdG9fcz0xMDAsCi0gICAgICAgICAgICAgICAgbWF4X3NkdV9zX3RvX209MTAwLAotICAgICAgICAgICAgICAgIG1heF9wZHVfbV90b19zPTEwMCwKLSAgICAgICAgICAgICAgICBtYXhfcGR1X3NfdG9fbT0xMDAsCi0gICAgICAgICAgICAgICAgcGh5X21fdG9fcz0weDAyLAotICAgICAgICAgICAgICAgIHBoeV9zX3RvX209MHgwMCwKLSAgICAgICAgICAgICAgICBibl9tX3RvX3M9MywKLSAgICAgICAgICAgICAgICBibl9zX3RvX209MSwKLSAgICAgICAgICAgICkKLSAgICAgICAgXQotCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaXNfc3RyZWFtLCBjZXJ0X2Npc19zdHJlYW0pID0gc2VsZi5fc2V0dXBfY2lzX2Zyb21fY2VydCgKLSAgICAgICAgICAgIGNpZ19pZCwgc2R1X2ludGVydmFsX21fdG9fcywgc2R1X2ludGVydmFsX3NfdG9fbSwgZnRfbV90b19zLCBmdF9zX3RvX20sIGlzb19pbnRlcnZhbCwKLSAgICAgICAgICAgIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LCBwYWNraW5nLCBmcmFtaW5nLCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tLAotICAgICAgICAgICAgY2lzX2NvbmZpZ3MpCi0gICAgICAgIGR1dF9jaXNfc3RyZWFtLnNlbmQoYidhYmNkZWZnaCcgKiAxMCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2Npc19zdHJlYW0pLmVtaXRzKElzb01hdGNoZXJzLkRhdGEoYidhYmNkZWZnaCcgKiAxMCkpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJJQUwvQ0lTL0ZSQS9TTEEvQlYtMDMtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9ImNvbm5lY3RlZCBpc29jaHJvbm91cyBzdHJlYW0sIGZyYW1lZCBkYXRhLCBwZXJpcGhlcmFsIHJvbGUiKQotICAgIGRlZiB0ZXN0X2lzb19jaXNfZnJhX3NsYV9idl8wM19jKHNlbGYpOgotICAgICAgICBzZWxmLnNraXBfaWZfaXNvX25vdF9zdXBwb3J0ZWQoKQotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIHNlbmQgYW4gU0RVIHdpdGggbGVuZ3RoIOKJpCB0aGUgSXNvY2hyb25vdXMgUERVIGxlbmd0aC4KLSAgICAgICAgIiIiCi0gICAgICAgIGNpZ19pZCA9IDB4MDEKLSAgICAgICAgc2R1X2ludGVydmFsX21fdG9fcyA9IDB4MDAwMAotICAgICAgICBzZHVfaW50ZXJ2YWxfc190b19tID0gMHg0ZTMwCi0gICAgICAgIGZ0X21fdG9fcyA9IDAKLSAgICAgICAgZnRfc190b19tID0gMgotICAgICAgICBpc29faW50ZXJ2YWwgPSAweDE0Ci0gICAgICAgIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5ID0gMAotICAgICAgICBwYWNraW5nID0gMAotICAgICAgICBmcmFtaW5nID0gMQotICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zID0gMAotICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tID0gMAotICAgICAgICBjaXNfY29uZmlncyA9IFsKLSAgICAgICAgICAgIENpc1Rlc3RQYXJhbWV0ZXJzKAotICAgICAgICAgICAgICAgIGNpc19pZD0weDAxLAotICAgICAgICAgICAgICAgIG5zZT00LAotICAgICAgICAgICAgICAgIG1heF9zZHVfbV90b19zPTEwMCwKLSAgICAgICAgICAgICAgICBtYXhfc2R1X3NfdG9fbT0xMDAsCi0gICAgICAgICAgICAgICAgbWF4X3BkdV9tX3RvX3M9MTAwLAotICAgICAgICAgICAgICAgIG1heF9wZHVfc190b19tPTEwMCwKLSAgICAgICAgICAgICAgICBwaHlfbV90b19zPTB4MDIsCi0gICAgICAgICAgICAgICAgcGh5X3NfdG9fbT0weDAwLAotICAgICAgICAgICAgICAgIGJuX21fdG9fcz0wLAotICAgICAgICAgICAgICAgIGJuX3NfdG9fbT0yLAotICAgICAgICAgICAgKQotICAgICAgICBdCi0KLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2Npc19zdHJlYW0sIGNlcnRfY2lzX3N0cmVhbSkgPSBzZWxmLl9zZXR1cF9jaXNfZnJvbV9jZXJ0KAotICAgICAgICAgICAgY2lnX2lkLCBzZHVfaW50ZXJ2YWxfbV90b19zLCBzZHVfaW50ZXJ2YWxfc190b19tLCBmdF9tX3RvX3MsIGZ0X3NfdG9fbSwgaXNvX2ludGVydmFsLAotICAgICAgICAgICAgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksIHBhY2tpbmcsIGZyYW1pbmcsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICAgICAgICBjaXNfY29uZmlncykKLSAgICAgICAgZHV0X2Npc19zdHJlYW0uc2VuZChiJ2FiY2RlZmdoJyAqIDEwKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2lzX3N0cmVhbSkuZW1pdHMoSXNvTWF0Y2hlcnMuRGF0YShiJ2FiY2RlZmdoJyAqIDEwKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IklBTC9DSVMvRlJBL1NMQS9CVi0yNi1DIiwKLSAgICAgICAgcHRzX3Rlc3RfbmFtZT0iY29ubmVjdGVkIGlzb2Nocm9ub3VzIHN0cmVhbSwgZnJhbWVkIGRhdGEsIHBlcmlwaGVyYWwgcm9sZSIpCi0gICAgZGVmIHRlc3RfaXNvX2Npc19mcmFfc2xhX2J2XzI2X2Moc2VsZik6Ci0gICAgICAgIHNlbGYuc2tpcF9pZl9pc29fbm90X3N1cHBvcnRlZCgpCi0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBjYW4gc2VuZCBhbiBTRFUgd2l0aCBsZW5ndGgg4omkIHRoZSBJc29jaHJvbm91cyBQRFUgbGVuZ3RoLgotICAgICAgICAiIiIKLSAgICAgICAgY2lnX2lkID0gMHgwMQotICAgICAgICBzZHVfaW50ZXJ2YWxfbV90b19zID0gMHgxNEQ1Ci0gICAgICAgIHNkdV9pbnRlcnZhbF9zX3RvX20gPSAweDE0RDUKLSAgICAgICAgZnRfbV90b19zID0gMQotICAgICAgICBmdF9zX3RvX20gPSAxCi0gICAgICAgIGlzb19pbnRlcnZhbCA9IDB4MDgKLSAgICAgICAgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3kgPSAwCi0gICAgICAgIHBhY2tpbmcgPSAwCi0gICAgICAgIGZyYW1pbmcgPSAxCi0gICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MgPSAwCi0gICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20gPSAwCi0gICAgICAgIGNpc19jb25maWdzID0gWwotICAgICAgICAgICAgQ2lzVGVzdFBhcmFtZXRlcnMoCi0gICAgICAgICAgICAgICAgY2lzX2lkPTB4MDEsCi0gICAgICAgICAgICAgICAgbnNlPTIsCi0gICAgICAgICAgICAgICAgbWF4X3NkdV9tX3RvX3M9MTAwLAotICAgICAgICAgICAgICAgIG1heF9zZHVfc190b19tPTEwMCwKLSAgICAgICAgICAgICAgICBtYXhfcGR1X21fdG9fcz0xMDAsCi0gICAgICAgICAgICAgICAgbWF4X3BkdV9zX3RvX209MTAwLAotICAgICAgICAgICAgICAgIHBoeV9tX3RvX3M9MHgwMiwKLSAgICAgICAgICAgICAgICBwaHlfc190b19tPTB4MDAsCi0gICAgICAgICAgICAgICAgYm5fbV90b19zPTEsCi0gICAgICAgICAgICAgICAgYm5fc190b19tPTEsCi0gICAgICAgICAgICApCi0gICAgICAgIF0KLQotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2lzX3N0cmVhbSwgY2VydF9jaXNfc3RyZWFtKSA9IHNlbGYuX3NldHVwX2Npc19mcm9tX2NlcnQoCi0gICAgICAgICAgICBjaWdfaWQsIHNkdV9pbnRlcnZhbF9tX3RvX3MsIHNkdV9pbnRlcnZhbF9zX3RvX20sIGZ0X21fdG9fcywgZnRfc190b19tLCBpc29faW50ZXJ2YWwsCi0gICAgICAgICAgICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwgcGFja2luZywgZnJhbWluZywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICAgICAgICAgIGNpc19jb25maWdzKQotICAgICAgICBkdXRfY2lzX3N0cmVhbS5zZW5kKGInYWJjZGVmZ2gnICogMTApCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaXNfc3RyZWFtKS5lbWl0cyhJc29NYXRjaGVycy5EYXRhKGInYWJjZGVmZ2gnICogMTApKQpkaWZmIC0tZ2l0IGEvZ2QvaXNvL2ZhY2FkZS5jYyBiL2dkL2lzby9mYWNhZGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmY4ZmUuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgImlzby9mYWNhZGUuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9jb250ZXh0dWFsX2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX2V2ZW50X3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAiaGNpL2xlX2FkZHJlc3NfbWFuYWdlci5oIgotI2luY2x1ZGUgImlzby9mYWNhZGUuZ3JwYy5wYi5oIgotI2luY2x1ZGUgImlzby9pc29fbW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6QWNsTWFuYWdlcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaXNvIHsKLQotY2xhc3MgSXNvTW9kdWxlRmFjYWRlU2VydmljZSA6IHB1YmxpYyBJc29Nb2R1bGVGYWNhZGU6OlNlcnZpY2UgewotIHB1YmxpYzoKLSAgSXNvTW9kdWxlRmFjYWRlU2VydmljZShJc29Nb2R1bGUqIGlzb19tb2R1bGUsIEFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyLCA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXIqIGlzb19oYW5kbGVyKQotICAgICAgOiBpc29fbW9kdWxlXyhpc29fbW9kdWxlKSwgYWNsX21hbmFnZXJfKGFjbF9tYW5hZ2VyKSwgaXNvX2hhbmRsZXJfKGlzb19oYW5kbGVyKSB7Ci0gICAgQVNTRVJUKGlzb19tb2R1bGVfKTsKLSAgICBBU1NFUlQoaXNvX2hhbmRsZXJfKTsKLQotICAgIGlzb19tb2R1bGVfLT5HZXRJc29NYW5hZ2VyKCktPlJlZ2lzdGVySXNvRXN0YWJsaXNoZWRDYWxsYmFjayhpc29faGFuZGxlcl8tPkJpbmQoCi0gICAgICAgIFtdKDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxMZUlzb0V2ZW50c01zZz4qIGxlX2lzb19ldmVudHNfLCB1aW50MTZfdCBjaXNfY29ubmVjdGlvbl9oYW5kbGUpIHsKLSAgICAgICAgICBMZUlzb0V2ZW50c01zZyBtc2c7Ci0gICAgICAgICAgbXNnLnNldF9tZXNzYWdlX3R5cGUoSXNvTXNnVHlwZTo6SVNPX0NJU19FU1RBQkxJU0hFRCk7Ci0gICAgICAgICAgbXNnLmFkZF9jaXNfaGFuZGxlKGNpc19jb25uZWN0aW9uX2hhbmRsZSk7Ci0gICAgICAgICAgbGVfaXNvX2V2ZW50c18tPk9uSW5jb21pbmdFdmVudChtc2cpOwotICAgICAgICB9LAotICAgICAgICAmbGVfaXNvX2V2ZW50c18pKTsKLQotICAgIGlzb19tb2R1bGVfLT5HZXRJc29NYW5hZ2VyKCktPlJlZ2lzdGVySXNvRGF0YUNhbGxiYWNrKAotICAgICAgICBpc29faGFuZGxlcl8tPkJpbmRPbih0aGlzLCAmSXNvTW9kdWxlRmFjYWRlU2VydmljZTo6T25Jc29QYWNrZXRSZWNlaXZlZCkpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgTGVTZXRDaWdQYXJhbWV0ZXJzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6Omlzbzo6TGVTZXRDaWdQYXJhbWV0ZXJzUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp2ZWN0b3I8aGNpOjpDaXNQYXJhbWV0ZXJzQ29uZmlnPiBjaXNfY29uZmlnOwotCi0gICAgaGNpOjpDaXNQYXJhbWV0ZXJzQ29uZmlnIGNmZzsKLSAgICBjZmcuY2lzX2lkXyA9IHJlcXVlc3QtPmNpc19pZCgpOwotICAgIGNmZy5tYXhfc2R1X21fdG9fc18gPSByZXF1ZXN0LT5tYXhfc2R1X21fdG9fcygpOwotICAgIGNmZy5tYXhfc2R1X3NfdG9fbV8gPSByZXF1ZXN0LT5tYXhfc2R1X3NfdG9fbSgpOwotICAgIGNmZy5waHlfbV90b19zXyA9IHJlcXVlc3QtPnBoeV9tX3RvX3MoKTsKLSAgICBjZmcucGh5X3NfdG9fbV8gPSByZXF1ZXN0LT5waHlfc190b19tKCk7Ci0gICAgY2ZnLnJ0bl9tX3RvX3NfID0gcmVxdWVzdC0+cnRuX21fdG9fcygpOwotICAgIGNmZy5ydG5fc190b19tXyA9IHJlcXVlc3QtPnJ0bl9zX3RvX20oKTsKLQotICAgIGNpc19jb25maWcucHVzaF9iYWNrKGNmZyk7Ci0KLSAgICBpc29fbW9kdWxlXy0+R2V0SXNvTWFuYWdlcigpLT5TZXRDaWdQYXJhbWV0ZXJzKAotICAgICAgICByZXF1ZXN0LT5jaWdfaWQoKSwKLSAgICAgICAgcmVxdWVzdC0+c2R1X2ludGVydmFsX21fdG9fcygpLAotICAgICAgICByZXF1ZXN0LT5zZHVfaW50ZXJ2YWxfc190b19tKCksCi0gICAgICAgIHN0YXRpY19jYXN0PGhjaTo6Q2xvY2tBY2N1cmFjeT4ocmVxdWVzdC0+cGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3koKSksCi0gICAgICAgIHN0YXRpY19jYXN0PGhjaTo6UGFja2luZz4ocmVxdWVzdC0+cGFja2luZygpKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8aGNpOjpFbmFibGU+KHJlcXVlc3QtPmZyYW1pbmcoKSksCi0gICAgICAgIHJlcXVlc3QtPm1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MoKSwKLSAgICAgICAgcmVxdWVzdC0+bWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSgpLAotICAgICAgICBjaXNfY29uZmlnLAotICAgICAgICBpc29faGFuZGxlcl8tPkJpbmRPbmNlKAotICAgICAgICAgICAgW10oOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPExlSXNvRXZlbnRzTXNnPiogbGVfaXNvX2V2ZW50c18sIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb25uX2hhbmRsZXMpIHsKLSAgICAgICAgICAgICAgTGVJc29FdmVudHNNc2cgbXNnOwotCi0gICAgICAgICAgICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKElzb01zZ1R5cGU6OklTT19QQVJBTUVURVJTX1NFVF9DT01QTEVURSk7Ci0gICAgICAgICAgICAgIGZvciAoY29uc3QgdWludDE2X3QgY29ubl9oYW5kbGUgOiBjb25uX2hhbmRsZXMpIHsKLSAgICAgICAgICAgICAgICBtc2cuYWRkX2Npc19oYW5kbGUoY29ubl9oYW5kbGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxlX2lzb19ldmVudHNfLT5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAmbGVfaXNvX2V2ZW50c18pKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgTGVTZXRDaWdQYXJhbWV0ZXJzVGVzdCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjppc286OkxlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3RvcjxoY2k6OkxlQ2lzUGFyYW1ldGVyc1Rlc3RDb25maWc+IGNpc19jb25maWc7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGNjIDogcmVxdWVzdC0+Y2lzX2NvbmZpZ3MoKSkgewotICAgICAgaGNpOjpMZUNpc1BhcmFtZXRlcnNUZXN0Q29uZmlnIGNmZzsKLSAgICAgIGNmZy5jaXNfaWRfID0gY2MuY2lzX2lkKCk7Ci0gICAgICBjZmcubnNlXyA9IGNjLm5zZSgpOwotICAgICAgY2ZnLm1heF9zZHVfbV90b19zXyA9IGNjLm1heF9zZHVfbV90b19zKCk7Ci0gICAgICBjZmcubWF4X3NkdV9zX3RvX21fID0gY2MubWF4X3NkdV9zX3RvX20oKTsKLSAgICAgIGNmZy5tYXhfcGR1X21fdG9fc18gPSBjYy5tYXhfcGR1X21fdG9fcygpOwotICAgICAgY2ZnLm1heF9wZHVfc190b19tXyA9IGNjLm1heF9wZHVfc190b19tKCk7Ci0gICAgICBjZmcucGh5X21fdG9fc18gPSBjYy5waHlfbV90b19zKCk7Ci0gICAgICBjZmcucGh5X3NfdG9fbV8gPSBjYy5waHlfc190b19tKCk7Ci0gICAgICBjZmcuYm5fbV90b19zXyA9IGNjLmJuX21fdG9fcygpOwotICAgICAgY2ZnLmJuX3NfdG9fbV8gPSBjYy5ibl9zX3RvX20oKTsKLSAgICAgIGNpc19jb25maWcucHVzaF9iYWNrKGNmZyk7Ci0gICAgfQotICAgIGlzb19tb2R1bGVfLT5HZXRJc29NYW5hZ2VyKCktPlNldENpZ1BhcmFtZXRlcnNUZXN0KAotICAgICAgICByZXF1ZXN0LT5jaWdfaWQoKSwKLSAgICAgICAgcmVxdWVzdC0+c2R1X2ludGVydmFsX21fdG9fcygpLAotICAgICAgICByZXF1ZXN0LT5zZHVfaW50ZXJ2YWxfc190b19tKCksCi0gICAgICAgIHJlcXVlc3QtPmZ0X21fdG9fcygpLAotICAgICAgICByZXF1ZXN0LT5mdF9zX3RvX20oKSwKLSAgICAgICAgcmVxdWVzdC0+aXNvX2ludGVydmFsKCksCi0gICAgICAgIHN0YXRpY19jYXN0PGhjaTo6Q2xvY2tBY2N1cmFjeT4ocmVxdWVzdC0+cGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3koKSksCi0gICAgICAgIHN0YXRpY19jYXN0PGhjaTo6UGFja2luZz4ocmVxdWVzdC0+cGFja2luZygpKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8aGNpOjpFbmFibGU+KHJlcXVlc3QtPmZyYW1pbmcoKSksCi0gICAgICAgIHJlcXVlc3QtPm1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MoKSwKLSAgICAgICAgcmVxdWVzdC0+bWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSgpLAotICAgICAgICBjaXNfY29uZmlnLAotICAgICAgICBpc29faGFuZGxlcl8tPkJpbmRPbmNlKAotICAgICAgICAgICAgW10oOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPExlSXNvRXZlbnRzTXNnPiogbGVfaXNvX2V2ZW50c18sIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb25uX2hhbmRsZXMpIHsKLSAgICAgICAgICAgICAgTGVJc29FdmVudHNNc2cgbXNnOwotCi0gICAgICAgICAgICAgIG1zZy5zZXRfbWVzc2FnZV90eXBlKElzb01zZ1R5cGU6OklTT19QQVJBTUVURVJTX1NFVF9DT01QTEVURSk7Ci0gICAgICAgICAgICAgIGZvciAoY29uc3QgdWludDE2X3QgY29ubl9oYW5kbGUgOiBjb25uX2hhbmRsZXMpIHsKLSAgICAgICAgICAgICAgICBtc2cuYWRkX2Npc19oYW5kbGUoY29ubl9oYW5kbGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxlX2lzb19ldmVudHNfLT5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAmbGVfaXNvX2V2ZW50c18pKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgTGVDcmVhdGVDaXMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6aXNvOjpMZUNyZWF0ZUNpc1JlcXVlc3QqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiBjcmVhdGVfY2lzX3BhcmFtczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGhhbmRsZV9wYWlyIDogcmVxdWVzdC0+aGFuZGxlX3BhaXIoKSkgewotICAgICAgY3JlYXRlX2Npc19wYXJhbXMucHVzaF9iYWNrKAotICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyPHVpbnQxNl90LCB1aW50MTZfdD4oaGFuZGxlX3BhaXIuY2lzX2hhbmRsZSgpLCBoYW5kbGVfcGFpci5hY2xfaGFuZGxlKCkpKTsKLSAgICB9Ci0gICAgaXNvX21vZHVsZV8tPkdldElzb01hbmFnZXIoKS0+TGVDcmVhdGVDaXMoY3JlYXRlX2Npc19wYXJhbXMpOwotCi0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEZldGNoSXNvRGF0YSgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgTGVDaXNIYW5kbGVNc2cqIHJlcXVlc3QsIDo6Z3JwYzo6U2VydmVyV3JpdGVyPElzb1BhY2tldD4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBsZV9pc29fZGF0YV8uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hJc29FdmVudHMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPExlSXNvRXZlbnRzTXNnPiogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGxlX2lzb19ldmVudHNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmRJc29QYWNrZXQoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6aXNvOjpJc29QYWNrZXQqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldChyZXF1ZXN0LT5wYXlsb2FkKCkuYmVnaW4oKSwgcmVxdWVzdC0+cGF5bG9hZCgpLmVuZCgpKTsKLSAgICBpc29fbW9kdWxlXy0+R2V0SXNvTWFuYWdlcigpLT5TZW5kSXNvUGFja2V0KHJlcXVlc3QtPmhhbmRsZSgpLCBwYWNrZXQpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICB2b2lkIE9uSXNvUGFja2V0UmVjZWl2ZWQoc3RkOjp1bmlxdWVfcHRyPGhjaTo6SXNvVmlldz4gaXNvX3ZpZXcpIHsKLSAgICBBU1NFUlQoaXNvX3ZpZXctPklzVmFsaWQoKSk7Ci0KLSAgICBJc29QYWNrZXQgcGFja2V0OwotICAgIHBhY2tldC5zZXRfaGFuZGxlKGlzb192aWV3LT5HZXRDb25uZWN0aW9uSGFuZGxlKCkpOwotCi0gICAgaWYgKGlzb192aWV3LT5HZXRUc0ZsYWcoKSA9PSBoY2k6OlRpbWVTdGFtcEZsYWc6Ok5PVF9QUkVTRU5UKSB7Ci0gICAgICBoY2k6Oklzb1dpdGhvdXRUaW1lc3RhbXBWaWV3IG50cyA9IGhjaTo6SXNvV2l0aG91dFRpbWVzdGFtcFZpZXc6OkNyZWF0ZSgqaXNvX3ZpZXcpOwotICAgICAgQVNTRVJUKG50cy5Jc1ZhbGlkKCkpOwotCi0gICAgICBhdXRvIGRhdGFfdmVjID0gbnRzLkdldFBheWxvYWQoKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSBzdGQ6OnN0cmluZyhkYXRhX3ZlYy5iZWdpbigpLCBkYXRhX3ZlYy5lbmQoKSk7Ci0gICAgICBwYWNrZXQuc2V0X3BheWxvYWQoZGF0YSk7Ci0gICAgICBsZV9pc29fZGF0YV8uT25JbmNvbWluZ0V2ZW50KHBhY2tldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGhjaTo6SXNvV2l0aFRpbWVzdGFtcFZpZXcgdHN2ID0gaGNpOjpJc29XaXRoVGltZXN0YW1wVmlldzo6Q3JlYXRlKCppc29fdmlldyk7Ci0gICAgICBBU1NFUlQodHN2LklzVmFsaWQoKSk7Ci0KLSAgICAgIGF1dG8gZGF0YV92ZWMgPSB0c3YuR2V0UGF5bG9hZCgpOwotICAgICAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKGRhdGFfdmVjLmJlZ2luKCksIGRhdGFfdmVjLmVuZCgpKTsKLSAgICAgIHBhY2tldC5zZXRfcGF5bG9hZChkYXRhKTsKLSAgICAgIGxlX2lzb19kYXRhXy5PbkluY29taW5nRXZlbnQocGFja2V0KTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIElzb01vZHVsZSogaXNvX21vZHVsZV87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxMZUlzb0V2ZW50c01zZz4gbGVfaXNvX2V2ZW50c197IkxFIElTTyBldmVudHMifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPElzb1BhY2tldD4gbGVfaXNvX2RhdGFfeyJMRSBJU08gZGF0YSJ9OwotICBBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlcl8gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogaXNvX2hhbmRsZXJfOwotfTsKLQotdm9pZCBJc29Nb2R1bGVGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhsaXN0KTsKLSAgbGlzdC0+YWRkPElzb01vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPEFjbE1hbmFnZXI+KCk7Ci19Ci0KLXZvaWQgSXNvTW9kdWxlRmFjYWRlTW9kdWxlOjpTdGFydCgpIHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0YXJ0KCk7Ci0gIHNlcnZpY2VfID0gbmV3IElzb01vZHVsZUZhY2FkZVNlcnZpY2UoR2V0RGVwZW5kZW5jeTxJc29Nb2R1bGU+KCksIEdldERlcGVuZGVuY3k8QWNsTWFuYWdlcj4oKSwgR2V0SGFuZGxlcigpKTsKLX0KLQotdm9pZCBJc29Nb2R1bGVGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIGRlbGV0ZSBzZXJ2aWNlXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKTsKLX0KLQotOjpncnBjOjpTZXJ2aWNlKiBJc29Nb2R1bGVGYWNhZGVNb2R1bGU6OkdldFNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBJc29Nb2R1bGVGYWNhZGVNb2R1bGU6OkZhY3RvcnkgPQotICAgIDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IElzb01vZHVsZUZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGlzbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaXNvL2ZhY2FkZS5oIGIvZ2QvaXNvL2ZhY2FkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWE1ZDhkLi4wMDAwMDAwCi0tLSBhL2dkL2lzby9mYWNhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdycGMrKy9ncnBjKysuaD4KLQotI2luY2x1ZGUgImdycGMvZ3JwY19tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaXNvIHsKLQotY2xhc3MgSXNvTW9kdWxlRmFjYWRlU2VydmljZTsKLQotY2xhc3MgSXNvTW9kdWxlRmFjYWRlTW9kdWxlIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotICA6OmdycGM6OlNlcnZpY2UqIEdldFNlcnZpY2UoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIElzb01vZHVsZUZhY2FkZVNlcnZpY2UqIHNlcnZpY2VfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlzbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvaXNvL2ZhY2FkZS5wcm90byBiL2dkL2lzby9mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjlkMjcuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2ZhY2FkZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGJsdWV0b290aC5pc287Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIjsKLWltcG9ydCAiZmFjYWRlL2NvbW1vbi5wcm90byI7Ci0KLXNlcnZpY2UgSXNvTW9kdWxlRmFjYWRlIHsKLSAgcnBjIExlU2V0Q2lnUGFyYW1ldGVycyhMZVNldENpZ1BhcmFtZXRlcnNSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBMZVNldENpZ1BhcmFtZXRlcnNUZXN0KExlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBMZUNyZWF0ZUNpcyhMZUNyZWF0ZUNpc1JlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEZldGNoSXNvRGF0YShMZUNpc0hhbmRsZU1zZykgcmV0dXJucyAoc3RyZWFtIElzb1BhY2tldCkge30KLSAgcnBjIEZldGNoSXNvRXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIExlSXNvRXZlbnRzTXNnKSB7fQotICBycGMgU2VuZElzb1BhY2tldChJc29QYWNrZXQpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLX0KLQotbWVzc2FnZSBJc29QYWNrZXQgewotICB1aW50MzIgaGFuZGxlID0gMTsKLSAgYnl0ZXMgcGF5bG9hZCA9IDM7Ci19Ci0KLW1lc3NhZ2UgTGVTZXRDaWdQYXJhbWV0ZXJzUmVxdWVzdCB7Ci0gIHVpbnQzMiBjaWdfaWQgPSAxOwotICB1aW50MzIgc2R1X2ludGVydmFsX21fdG9fcyA9IDI7Ci0gIHVpbnQzMiBzZHVfaW50ZXJ2YWxfc190b19tID0gMzsKLSAgdWludDMyIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5ID0gNDsKLSAgdWludDMyIHBhY2tpbmcgPSA1OwotICB1aW50MzIgZnJhbWluZyA9IDY7Ci0gIHVpbnQzMiBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zID0gNzsKLSAgdWludDMyIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20gPSA4OwotICB1aW50MzIgY2lzX2lkID0gOTsKLSAgdWludDMyIG1heF9zZHVfbV90b19zID0gMTA7Ci0gIHVpbnQzMiBtYXhfc2R1X3NfdG9fbSA9IDExOwotICB1aW50MzIgcGh5X21fdG9fcyA9IDEyOwotICB1aW50MzIgcGh5X3NfdG9fbSA9IDEzOwotICB1aW50MzIgcnRuX21fdG9fcyA9IDE0OwotICB1aW50MzIgcnRuX3NfdG9fbSA9IDE1OwotfQotCi1tZXNzYWdlIExlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RSZXF1ZXN0IHsKLSAgdWludDMyIGNpZ19pZCA9IDE7Ci0gIHVpbnQzMiBzZHVfaW50ZXJ2YWxfbV90b19zID0gMjsKLSAgdWludDMyIHNkdV9pbnRlcnZhbF9zX3RvX20gPSAzOwotICB1aW50MzIgZnRfbV90b19zID0gNDsKLSAgdWludDMyIGZ0X3NfdG9fbSA9IDU7Ci0gIHVpbnQzMiBpc29faW50ZXJ2YWwgPSA2OwotICB1aW50MzIgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3kgPSA3OwotICB1aW50MzIgcGFja2luZyA9IDg7Ci0gIHVpbnQzMiBmcmFtaW5nID0gOTsKLSAgdWludDMyIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MgPSAxMDsKLSAgdWludDMyIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20gPSAxMTsKLQotICBtZXNzYWdlIExlQ2lzUGFyYW1ldGVyc1Rlc3RDb25maWcgewotICAgIHVpbnQzMiBjaXNfaWQgPSAxOwotICAgIHVpbnQzMiBuc2UgPSAyOwotICAgIHVpbnQzMiBtYXhfc2R1X21fdG9fcyA9IDM7Ci0gICAgdWludDMyIG1heF9zZHVfc190b19tID0gNDsKLSAgICB1aW50MzIgbWF4X3BkdV9tX3RvX3MgPSA1OwotICAgIHVpbnQzMiBtYXhfcGR1X3NfdG9fbSA9IDY7Ci0gICAgdWludDMyIHBoeV9tX3RvX3MgPSA3OwotICAgIHVpbnQzMiBwaHlfc190b19tID0gODsKLSAgICB1aW50MzIgYm5fbV90b19zID0gOTsKLSAgICB1aW50MzIgYm5fc190b19tID0gMTA7Ci0gIH0KLQotICByZXBlYXRlZCBMZUNpc1BhcmFtZXRlcnNUZXN0Q29uZmlnIGNpc19jb25maWdzID0gMTI7Ci19Ci0KLW1lc3NhZ2UgTGVDcmVhdGVDaXNSZXF1ZXN0IHsKLSAgbWVzc2FnZSBIYW5kbGVQYWlyIHsKLSAgICB1aW50MzIgY2lzX2hhbmRsZSA9IDE7Ci0gICAgdWludDMyIGFjbF9oYW5kbGUgPSAyOwotICB9Ci0KLSAgcmVwZWF0ZWQgSGFuZGxlUGFpciBoYW5kbGVfcGFpciA9IDE7Ci19Ci0KLWVudW0gSXNvTXNnVHlwZSB7Ci0gIElTT19QQVJBTUVURVJTX1NFVF9DT01QTEVURSA9IDA7Ci0gIElTT19DSVNfRVNUQUJMSVNIRUQgPSAxOwotfQotCi1tZXNzYWdlIExlSXNvRXZlbnRzTXNnIHsKLSAgSXNvTXNnVHlwZSBtZXNzYWdlX3R5cGUgPSAxOwotICByZXBlYXRlZCB1aW50MzIgY2lzX2hhbmRsZSA9IDI7Ci19Ci0KLW1lc3NhZ2UgTGVDaXNIYW5kbGVNc2cgewotICB1aW50MzIgaGFuZGxlID0gMTsKLX0KZGlmZiAtLWdpdCBhL2dkL2lzby9pbnRlcm5hbC9pc29fbWFuYWdlcl9pbXBsLmNjIGIvZ2QvaXNvL2ludGVybmFsL2lzb19tYW5hZ2VyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTM4NTguLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2ludGVybmFsL2lzb19tYW5hZ2VyX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI2luY2x1ZGUgImlzb19tYW5hZ2VyX2ltcGwuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiaXNvL2lzb19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBpc28gewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6Oklzb0J1aWxkZXI7Ci0KLUlzb01hbmFnZXJJbXBsOjpJc29NYW5hZ2VySW1wbChvczo6SGFuZGxlciogaXNvX2hhbmRsZXIsIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllciwgaGNpOjpDb250cm9sbGVyKiBjb250cm9sbGVyKQotICAgIDogaXNvX2hhbmRsZXJfKGlzb19oYW5kbGVyKSwKLSAgICAgIGhjaV9sYXllcl8oaGNpX2xheWVyKSwKLSAgICAgIGhjaV9sZV9pc29faW50ZXJmYWNlXyhoY2lfbGF5ZXItPkdldExlSXNvSW50ZXJmYWNlKGlzb19oYW5kbGVyXy0+QmluZE9uKHRoaXMsICZJc29NYW5hZ2VySW1wbDo6T25IY2lMZUV2ZW50KSkpLAotICAgICAgY29udHJvbGxlcl8oY29udHJvbGxlcikgewotICBoY2lfbGF5ZXJfLT5HZXRJc29RdWV1ZUVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICBpc29faGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmSXNvTWFuYWdlckltcGw6Ok9uSW5jb21pbmdQYWNrZXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBpc29fZW5xdWV1ZV9idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6RW5xdWV1ZUJ1ZmZlcjxJc29CdWlsZGVyPj4oaGNpX2xheWVyXy0+R2V0SXNvUXVldWVFbmQoKSk7Ci19Ci0KLUlzb01hbmFnZXJJbXBsOjp+SXNvTWFuYWdlckltcGwoKSB7Ci0gIGhjaV9sYXllcl8tPkdldElzb1F1ZXVlRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gIGlzb19lbnF1ZXVlX2J1ZmZlcl8gPSBudWxscHRyOwotfQotCi12b2lkIElzb01hbmFnZXJJbXBsOjpPbkhjaUxlRXZlbnQoaGNpOjpMZU1ldGFFdmVudFZpZXcgZXZlbnQpIHsKLSAgaGNpOjpTdWJldmVudENvZGUgY29kZSA9IGV2ZW50LkdldFN1YmV2ZW50Q29kZSgpOwotCi0gIGlmIChjb2RlID09IGhjaTo6U3ViZXZlbnRDb2RlOjpDSVNfRVNUQUJMSVNIRUQpIHsKLSAgICBoY2k6OkxlQ2lzRXN0YWJsaXNoZWRWaWV3IGxlX2Npc19lc3RhYmxpc2hlZF92aWV3ID0gaGNpOjpMZUNpc0VzdGFibGlzaGVkVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBpZiAoIWxlX2Npc19lc3RhYmxpc2hlZF92aWV3LklzVmFsaWQoKSkgewotICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIExlQ2lzRXN0YWJsaXNoZWRWaWV3IHBhY2tldCByZWNlaXZlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNpc19lc3RhYmxpc2hlZF9jYWxsYmFjay5JbnZva2UobGVfY2lzX2VzdGFibGlzaGVkX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAoY29kZSA9PSBoY2k6OlN1YmV2ZW50Q29kZTo6Q0lTX1JFUVVFU1QpIHsKLSAgICBoY2k6OkxlQ2lzUmVxdWVzdFZpZXcgbGVfY2lzX3JlcXVlc3RfdmlldyA9IGhjaTo6TGVDaXNSZXF1ZXN0Vmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBpZiAoIWxlX2Npc19yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIkludmFsaWQgTGVDaXNSZXF1ZXN0VmlldyBwYWNrZXQgcmVjZWl2ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBoY2lfbGVfaXNvX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgICBoY2k6OkxlQWNjZXB0Q2lzUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShsZV9jaXNfcmVxdWVzdF92aWV3LkdldENpc0Nvbm5lY3Rpb25IYW5kbGUoKSksCi0gICAgICAgIGlzb19oYW5kbGVyXy0+QmluZE9uY2UoW10oaGNpOjpDb21tYW5kU3RhdHVzVmlldyBjb21tYW5kX3N0YXR1cykgewotICAgICAgICAgIExPR19JTkZPKCJjb21tYW5kX3N0YXR1cz0laGh1ICIsIGNvbW1hbmRfc3RhdHVzLkdldFN0YXR1cygpKTsKLSAgICAgICAgfSkpOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HX0VSUk9SKCJVbmhhbmRsZWQgSENJIExFIElTTyBldmVudCwgY29kZSAlcyIsIGhjaTo6U3ViZXZlbnRDb2RlVGV4dChjb2RlKS5jX3N0cigpKTsKLSAgQVNTRVJUX0xPRyhmYWxzZSwgIlVuaGFuZGxlZCBIQ0kgTEUgSVNPIGV2ZW50Iik7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlckltcGw6OlNldENpZ1BhcmFtZXRlcnMoCi0gICAgdWludDhfdCBjaWdfaWQsCi0gICAgdWludDMyX3Qgc2R1X2ludGVydmFsX21fdG9fcywKLSAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfc190b19tLAotICAgIGhjaTo6Q2xvY2tBY2N1cmFjeSBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICBoY2k6OlBhY2tpbmcgcGFja2luZywKLSAgICBoY2k6OkVuYWJsZSBmcmFtaW5nLAotICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsCi0gICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxoY2k6OkNpc1BhcmFtZXRlcnNDb25maWc+JiBjaXNfY29uZmlncywKLSAgICBTZXRDaWdQYXJhbWV0ZXJzQ2FsbGJhY2sgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaykgewotICBoY2lfbGVfaXNvX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpMZVNldENpZ1BhcmFtZXRlcnNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgY2lnX2lkLAotICAgICAgICAgIHNkdV9pbnRlcnZhbF9tX3RvX3MsCi0gICAgICAgICAgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgICAgICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICAgICAgICBwYWNraW5nLAotICAgICAgICAgIGZyYW1pbmcsCi0gICAgICAgICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tLAotICAgICAgICAgIGNpc19jb25maWdzKSwKLSAgICAgIGlzb19oYW5kbGVyXy0+QmluZE9uY2UoCi0gICAgICAgICAgJklzb01hbmFnZXJJbXBsOjpTZXRDaWdQYXJhbWV0ZXJzQ29tcGxldGUsCi0gICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgIGNpZ19pZCwKLSAgICAgICAgICBjaXNfY29uZmlncywKLSAgICAgICAgICBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaykpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VySW1wbDo6U2V0Q2lnUGFyYW1ldGVyc0NvbXBsZXRlKAotICAgIHVpbnQ4X3QgY2lnX2lkLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhjaTo6Q2lzUGFyYW1ldGVyc0NvbmZpZz4mIGNpc19jb25maWdzLAotICAgIFNldENpZ1BhcmFtZXRlcnNDYWxsYmFjayBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrLAotICAgIGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyBjb21tYW5kX2NvbXBsZXRlKSB7Ci0gIEFTU0VSVChjb21tYW5kX2NvbXBsZXRlLklzVmFsaWQoKSk7Ci0KLSAgaGNpOjpMZVNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZVZpZXcgc2V0Q2lnUGFyYW1zQ29tcGxldGUgPQotICAgICAgaGNpOjpMZVNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZVZpZXc6OkNyZWF0ZShjb21tYW5kX2NvbXBsZXRlKTsKLSAgQVNTRVJUKHNldENpZ1BhcmFtc0NvbXBsZXRlLklzVmFsaWQoKSk7Ci0KLSAgaWYgKHNldENpZ1BhcmFtc0NvbXBsZXRlLkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgdWludDhfdCBjaWdfaWRfYmFja19mcm9tX2N0cmwgPSBzZXRDaWdQYXJhbXNDb21wbGV0ZS5HZXRDaWdJZCgpOwotICAgIGF1dG8gY29ubl9oYW5kbGVzID0gc2V0Q2lnUGFyYW1zQ29tcGxldGUuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotCi0gICAgQVNTRVJUKGNpZ19pZF9iYWNrX2Zyb21fY3RybCA9PSBjaWdfaWQpOwotICAgIEFTU0VSVChjb25uX2hhbmRsZXMuc2l6ZSgpID09IGNpc19jb25maWdzLnNpemUoKSk7Ci0KLSAgICBhdXRvIGNpc19pdCA9IGNpc19jb25maWdzLmJlZ2luKCk7Ci0gICAgYXV0byBoYW5kbGVfaXQgPSBjb25uX2hhbmRsZXMuYmVnaW4oKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBoYW5kbGVzOwotICAgIHdoaWxlIChjaXNfaXQgIT0gY2lzX2NvbmZpZ3MuZW5kKCkpIHsKLSAgICAgIGlzb19jb25uZWN0aW9uc18ucHVzaF9iYWNrKHsKLSAgICAgICAgICAuY2lnX2lkID0gY2lnX2lkLAotICAgICAgICAgIC5jaXNfaWQgPSBjaXNfaXQtPmNpc19pZF8sCi0gICAgICAgICAgLmNvbm5lY3Rpb25faGFuZGxlID0gKmhhbmRsZV9pdCwKLSAgICAgIH0pOwotCi0gICAgICBoYW5kbGVzLnB1c2hfYmFjaygqaGFuZGxlX2l0KTsKLQotICAgICAgY2lzX2l0Kys7Ci0gICAgICBoYW5kbGVfaXQrKzsKLSAgICB9Ci0KLSAgICBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrLkludm9rZShoYW5kbGVzKTsKLSAgfQotfQotCi12b2lkIElzb01hbmFnZXJJbXBsOjpTZXRDaWdQYXJhbWV0ZXJzVGVzdCgKLSAgICB1aW50OF90IGNpZ19pZCwKLSAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgIHVpbnQzMl90IHNkdV9pbnRlcnZhbF9zX3RvX20sCi0gICAgdWludDhfdCBmdF9tX3RvX3MsCi0gICAgdWludDhfdCBmdF9zX3RvX20sCi0gICAgdWludDE2X3QgaXNvX2ludGVydmFsLAotICAgIGhjaTo6Q2xvY2tBY2N1cmFjeSBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICBoY2k6OlBhY2tpbmcgcGFja2luZywKLSAgICBoY2k6OkVuYWJsZSBmcmFtaW5nLAotICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsCi0gICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxoY2k6OkxlQ2lzUGFyYW1ldGVyc1Rlc3RDb25maWc+JiBjaXNfdGVzdF9jb25maWdzLAotICAgIFNldENpZ1BhcmFtZXRlcnNDYWxsYmFjayBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrKSB7Ci0gIGhjaV9sZV9pc29faW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBoY2k6OkxlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgY2lnX2lkLAotICAgICAgICAgIHNkdV9pbnRlcnZhbF9tX3RvX3MsCi0gICAgICAgICAgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgICAgICBmdF9tX3RvX3MsCi0gICAgICAgICAgZnRfc190b19tLAotICAgICAgICAgIGlzb19pbnRlcnZhbCwKLSAgICAgICAgICBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICAgICAgICBwYWNraW5nLAotICAgICAgICAgIGZyYW1pbmcsCi0gICAgICAgICAgY2lzX3Rlc3RfY29uZmlncyksCi0gICAgICBpc29faGFuZGxlcl8tPkJpbmRPbmNlKAotICAgICAgICAgICZJc29NYW5hZ2VySW1wbDo6U2V0Q2lnUGFyYW1ldGVyc1Rlc3RDb21wbGV0ZSwKLSAgICAgICAgICBjb21tb246OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgY2lnX2lkLAotICAgICAgICAgIGNpc190ZXN0X2NvbmZpZ3MsCi0gICAgICAgICAgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2spKSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlckltcGw6OlNldENpZ1BhcmFtZXRlcnNUZXN0Q29tcGxldGUoCi0gICAgdWludDhfdCBjaWdfaWQsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGNpOjpMZUNpc1BhcmFtZXRlcnNUZXN0Q29uZmlnPiYgY2lzX2NvbmZpZ3MsCi0gICAgU2V0Q2lnUGFyYW1ldGVyc0NhbGxiYWNrIGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2ssCi0gICAgaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IGNvbW1hbmRfY29tcGxldGUpIHsKLSAgQVNTRVJUKGNvbW1hbmRfY29tcGxldGUuSXNWYWxpZCgpKTsKLQotICBoY2k6OkxlU2V0Q2lnUGFyYW1ldGVyc1Rlc3RDb21wbGV0ZVZpZXcgc2V0Q2lnUGFyYW1zQ29tcGxldGUgPQotICAgICAgaGNpOjpMZVNldENpZ1BhcmFtZXRlcnNUZXN0Q29tcGxldGVWaWV3OjpDcmVhdGUoY29tbWFuZF9jb21wbGV0ZSk7Ci0gIEFTU0VSVChzZXRDaWdQYXJhbXNDb21wbGV0ZS5Jc1ZhbGlkKCkpOwotCi0gIGlmIChzZXRDaWdQYXJhbXNDb21wbGV0ZS5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgIHVpbnQ4X3QgY2lnX2lkX2JhY2tfZnJvbV9jdHJsID0gc2V0Q2lnUGFyYW1zQ29tcGxldGUuR2V0Q2lnSWQoKTsKLSAgICBhdXRvIGNvbm5faGFuZGxlcyA9IHNldENpZ1BhcmFtc0NvbXBsZXRlLkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLQotICAgIEFTU0VSVChjaWdfaWRfYmFja19mcm9tX2N0cmwgPT0gY2lnX2lkKTsKLSAgICBBU1NFUlQoY29ubl9oYW5kbGVzLnNpemUoKSA9PSBjaXNfY29uZmlncy5zaXplKCkpOwotCi0gICAgYXV0byBjaXNfaXQgPSBjaXNfY29uZmlncy5iZWdpbigpOwotICAgIGF1dG8gaGFuZGxlX2l0ID0gY29ubl9oYW5kbGVzLmJlZ2luKCk7Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gaGFuZGxlczsKLSAgICB3aGlsZSAoY2lzX2l0ICE9IGNpc19jb25maWdzLmVuZCgpKSB7Ci0gICAgICBpc29fY29ubmVjdGlvbnNfLnB1c2hfYmFjayh7Ci0gICAgICAgICAgLmNpZ19pZCA9IGNpZ19pZCwKLSAgICAgICAgICAuY2lzX2lkID0gY2lzX2l0LT5jaXNfaWRfLAotICAgICAgICAgIC5jb25uZWN0aW9uX2hhbmRsZSA9ICpoYW5kbGVfaXQsCi0gICAgICB9KTsKLQotICAgICAgaGFuZGxlcy5wdXNoX2JhY2soKmhhbmRsZV9pdCk7Ci0KLSAgICAgIGNpc19pdCsrOwotICAgICAgaGFuZGxlX2l0Kys7Ci0gICAgfQotCi0gICAgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjay5JbnZva2UoaGFuZGxlcyk7Ci0gIH0KLX0KLQotdm9pZCBJc29NYW5hZ2VySW1wbDo6TGVDcmVhdGVDaXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4+IGNpc19hbmRfYWNsX2hhbmRsZXMpIHsKLSAgc3RkOjp2ZWN0b3I8aGNpOjpDcmVhdGVDaXNDb25maWc+IGNpc19jb25maWdzOwotCi0gIGZvciAoY29uc3QgYXV0byYgaGFuZGxlX3BhaXIgOiBjaXNfYW5kX2FjbF9oYW5kbGVzKSB7Ci0gICAgaGNpOjpDcmVhdGVDaXNDb25maWcgY29uZmlnOwotICAgIGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfID0gaGFuZGxlX3BhaXIuZmlyc3Q7Ci0gICAgY29uZmlnLmFjbF9jb25uZWN0aW9uX2hhbmRsZV8gPSBoYW5kbGVfcGFpci5zZWNvbmQ7Ci0gICAgY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNvbmZpZyk7Ci0gIH0KLQotICBoY2lfbGVfaXNvX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpMZUNyZWF0ZUNpc0J1aWxkZXI6OkNyZWF0ZShjaXNfY29uZmlncyksIGlzb19oYW5kbGVyXy0+QmluZE9uY2UoW10oaGNpOjpDb21tYW5kU3RhdHVzVmlldyBjb21tYW5kX3N0YXR1cykgewotICAgICAgICBMT0dfSU5GTygiY29tbWFuZF9zdGF0dXM9JWhodSAiLCBjb21tYW5kX3N0YXR1cy5HZXRTdGF0dXMoKSk7Ci0gICAgICB9KSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlckltcGw6OlJlbW92ZUNpZyh1aW50OF90IGNpZ19pZCkgewotICBBU1NFUlQoSXNLbm93bkNpZyhjaWdfaWQpKTsKLQotICBoY2lfbGVfaXNvX2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpMZVJlbW92ZUNpZ0J1aWxkZXI6OkNyZWF0ZShjaWdfaWQpLAotICAgICAgaXNvX2hhbmRsZXJfLT5CaW5kT25jZSgmSXNvTWFuYWdlckltcGw6OlJlbW92ZUNpZ0NvbXBsZXRlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VySW1wbDo6UmVtb3ZlQ2lnQ29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IGNvbW1hbmRfY29tcGxldGUpIHsKLSAgQVNTRVJUKGNvbW1hbmRfY29tcGxldGUuSXNWYWxpZCgpKTsKLQotICBoY2k6OkxlUmVtb3ZlQ2lnQ29tcGxldGVWaWV3IHJlbW92ZUNpZ0NvbXBsZXRlID0gaGNpOjpMZVJlbW92ZUNpZ0NvbXBsZXRlVmlldzo6Q3JlYXRlKGNvbW1hbmRfY29tcGxldGUpOwotICBBU1NFUlQocmVtb3ZlQ2lnQ29tcGxldGUuSXNWYWxpZCgpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VySW1wbDo6U2VuZElzb1BhY2tldCh1aW50MTZfdCBjaXNfaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQpIHsKLSAgYXV0byBidWlsZGVyID0gaGNpOjpJc29XaXRob3V0VGltZXN0YW1wQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgY2lzX2hhbmRsZSwKLSAgICAgIGhjaTo6SXNvUGFja2V0Qm91bmRhcnlGbGFnOjpDT01QTEVURV9TRFUsCi0gICAgICAwIC8qIHNlcXVlbmNlX251bWJlciovLAotICAgICAgaGNpOjpJc29QYWNrZXRTdGF0dXNGbGFnOjpWQUxJRCwKLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KHBhY2tldCkpOwotICBMT0dfSU5GTygiJWMlYyIsIHBhY2tldFswXSwgcGFja2V0WzFdKTsKLSAgaXNvX2VucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGlzb19oYW5kbGVyXyk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlckltcGw6Ok9uSW5jb21pbmdQYWNrZXQoKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxoY2k6Oklzb1ZpZXc+IHBhY2tldCA9IGhjaV9sYXllcl8tPkdldElzb1F1ZXVlRW5kKCktPlRyeURlcXVldWUoKTsKLSAgaXNvX2RhdGFfY2FsbGJhY2suSW52b2tlKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgaXNvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9pc28vaW50ZXJuYWwvaXNvX21hbmFnZXJfaW1wbC5oIGIvZ2QvaXNvL2ludGVybmFsL2lzb19tYW5hZ2VyX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5NzAyNTAuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2ludGVybmFsL2lzb19tYW5hZ2VyX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGlzbyB7Ci11c2luZyBTZXRDaWdQYXJhbWV0ZXJzQ2FsbGJhY2sgPSBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChzdGQ6OnZlY3Rvcjx1aW50MTZfdD4pPjsKLXVzaW5nIENpc0VzdGFibGlzaGVkQ2FsbGJhY2sgPSBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKHVpbnQxNl90KT47Ci11c2luZyBJc29EYXRhQ2FsbGJhY2sgPSBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxoY2k6Oklzb1ZpZXc+KT47Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXN0cnVjdCBJc29jaHJvbm91c0Nvbm5lY3Rpb24gewotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZTsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotfTsKLQotY2xhc3MgSXNvTWFuYWdlckltcGwgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSXNvTWFuYWdlckltcGwob3M6OkhhbmRsZXIqIGlzb19oYW5kbGVyLCBoY2k6OkhjaUxheWVyKiBoY2lfbGF5ZXIsIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlcik7Ci0gIH5Jc29NYW5hZ2VySW1wbCgpOwotCi0gIHZvaWQgUmVnaXN0ZXJJc29Fc3RhYmxpc2hlZENhbGxiYWNrKENpc0VzdGFibGlzaGVkQ2FsbGJhY2sgY2IpIHsKLSAgICB0aGlzLT5jaXNfZXN0YWJsaXNoZWRfY2FsbGJhY2sgPSBjYjsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJJc29EYXRhQ2FsbGJhY2soSXNvRGF0YUNhbGxiYWNrIGNiKSB7Ci0gICAgdGhpcy0+aXNvX2RhdGFfY2FsbGJhY2sgPSBjYjsKLSAgfQotCi0gIHZvaWQgT25IY2lMZUV2ZW50KGhjaTo6TGVNZXRhRXZlbnRWaWV3IGV2ZW50KTsKLQotICB2b2lkIFNldENpZ1BhcmFtZXRlcnMoCi0gICAgICB1aW50OF90IGNpZ19pZCwKLSAgICAgIHVpbnQzMl90IHNkdV9pbnRlcnZhbF9tX3RvX3MsCi0gICAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfc190b19tLAotICAgICAgaGNpOjpDbG9ja0FjY3VyYWN5IHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LAotICAgICAgaGNpOjpQYWNraW5nIHBhY2tpbmcsCi0gICAgICBoY2k6OkVuYWJsZSBmcmFtaW5nLAotICAgICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoY2k6OkNpc1BhcmFtZXRlcnNDb25maWc+JiBjaXNfY29uZmlnLAotICAgICAgU2V0Q2lnUGFyYW1ldGVyc0NhbGxiYWNrIGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2spOwotICB2b2lkIFNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZSgKLSAgICAgIHVpbnQ4X3QgY2lnX2lkLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGNpOjpDaXNQYXJhbWV0ZXJzQ29uZmlnPiYgY2lzX2NvbmZpZ3MsCi0gICAgICBTZXRDaWdQYXJhbWV0ZXJzQ2FsbGJhY2sgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaywKLSAgICAgIGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyBjb21tYW5kX2NvbXBsZXRlKTsKLQotICB2b2lkIFNldENpZ1BhcmFtZXRlcnNUZXN0KAotICAgICAgdWludDhfdCBjaWdfaWQsCi0gICAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgIHVpbnQ4X3QgZnRfbV90b19zLAotICAgICAgdWludDhfdCBmdF9zX3RvX20sCi0gICAgICB1aW50MTZfdCBpc29faW50ZXJ2YWwsCi0gICAgICBoY2k6OkNsb2NrQWNjdXJhY3kgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksCi0gICAgICBoY2k6OlBhY2tpbmcgcGFja2luZywKLSAgICAgIGhjaTo6RW5hYmxlIGZyYW1pbmcsCi0gICAgICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhjaTo6TGVDaXNQYXJhbWV0ZXJzVGVzdENvbmZpZz4mIGNpc19jb25maWcsCi0gICAgICBTZXRDaWdQYXJhbWV0ZXJzQ2FsbGJhY2sgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjayk7Ci0gIHZvaWQgU2V0Q2lnUGFyYW1ldGVyc1Rlc3RDb21wbGV0ZSgKLSAgICAgIHVpbnQ4X3QgY2lnX2lkLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGNpOjpMZUNpc1BhcmFtZXRlcnNUZXN0Q29uZmlnPiYgY2lzX2NvbmZpZ3MsCi0gICAgICBTZXRDaWdQYXJhbWV0ZXJzQ2FsbGJhY2sgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaywKLSAgICAgIGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyBjb21tYW5kX2NvbXBsZXRlKTsKLQotICB2b2lkIExlQ3JlYXRlQ2lzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiBjaXNfYW5kX2FjbF9oYW5kbGVzKTsKLQotICB2b2lkIFJlbW92ZUNpZyh1aW50OF90IGNpZ19pZCk7Ci0gIHZvaWQgUmVtb3ZlQ2lnQ29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IGNvbW1hbmRfY29tcGxldGUpOwotCi0gIHZvaWQgU2VuZElzb1BhY2tldCh1aW50MTZfdCBjaXNfaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQpOwotICB2b2lkIE9uSW5jb21pbmdQYWNrZXQoKTsKLQotICBib29sIElzS25vd25DaWcodWludDhfdCBjaWdfaWQpIHsKLSAgICByZXR1cm4gZmluZF9pZihpc29fY29ubmVjdGlvbnNfLmJlZ2luKCksIGlzb19jb25uZWN0aW9uc18uZW5kKCksIFtjaWdfaWRdKGNvbnN0IElzb2Nocm9ub3VzQ29ubmVjdGlvbiYgYykgewotICAgICAgICAgICAgIHJldHVybiBjLmNpZ19pZCA9PSBjaWdfaWQ7Ci0gICAgICAgICAgIH0pICE9IGlzb19jb25uZWN0aW9uc18uZW5kKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBpc29faGFuZGxlcl87Ci0gIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllcl87Ci0gIGhjaTo6TGVJc29JbnRlcmZhY2UqIGhjaV9sZV9pc29faW50ZXJmYWNlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPG9zOjpFbnF1ZXVlQnVmZmVyPGJsdWV0b290aDo6aGNpOjpJc29CdWlsZGVyPj4gaXNvX2VucXVldWVfYnVmZmVyXzsKLSAgaGNpOjpDb250cm9sbGVyKiBjb250cm9sbGVyXyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAgc3RkOjpsaXN0PElzb2Nocm9ub3VzQ29ubmVjdGlvbj4gaXNvX2Nvbm5lY3Rpb25zXzsKLSAgQ2lzRXN0YWJsaXNoZWRDYWxsYmFjayBjaXNfZXN0YWJsaXNoZWRfY2FsbGJhY2s7Ci0gIElzb0RhdGFDYWxsYmFjayBpc29fZGF0YV9jYWxsYmFjazsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBpc28KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2lzby9pc29fbWFuYWdlci5jYyBiL2dkL2lzby9pc29fbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3MmJhZS4uMDAwMDAwMAotLS0gYS9nZC9pc28vaXNvX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI2luY2x1ZGUgImlzb19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaXNvIHsKLQotdm9pZCBJc29NYW5hZ2VyOjpSZWdpc3Rlcklzb0VzdGFibGlzaGVkQ2FsbGJhY2soQ2lzRXN0YWJsaXNoZWRDYWxsYmFjayBjYikgewotICBpc29faGFuZGxlcl8tPkNhbGxPbihpc29fbWFuYWdlcl9pbXBsXywgJmludGVybmFsOjpJc29NYW5hZ2VySW1wbDo6UmVnaXN0ZXJJc29Fc3RhYmxpc2hlZENhbGxiYWNrLCBjYik7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6UmVnaXN0ZXJJc29EYXRhQ2FsbGJhY2soSXNvRGF0YUNhbGxiYWNrIGNiKSB7Ci0gIGlzb19oYW5kbGVyXy0+Q2FsbE9uKGlzb19tYW5hZ2VyX2ltcGxfLCAmaW50ZXJuYWw6Oklzb01hbmFnZXJJbXBsOjpSZWdpc3Rlcklzb0RhdGFDYWxsYmFjaywgY2IpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlNldENpZ1BhcmFtZXRlcnMoCi0gICAgdWludDhfdCBjaWdfaWQsCi0gICAgdWludDMyX3Qgc2R1X2ludGVydmFsX21fdG9fcywKLSAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfc190b19tLAotICAgIGhjaTo6Q2xvY2tBY2N1cmFjeSBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICBoY2k6OlBhY2tpbmcgcGFja2luZywKLSAgICBoY2k6OkVuYWJsZSBmcmFtaW5nLAotICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsCi0gICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICBzdGQ6OnZlY3RvcjxoY2k6OkNpc1BhcmFtZXRlcnNDb25maWc+IGNpc19jb25maWcsCi0gICAgU2V0Q2lnUGFyYW1ldGVyc0NhbGxiYWNrIGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2spIHsKLSAgaXNvX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICBpc29fbWFuYWdlcl9pbXBsXywKLSAgICAgICZpbnRlcm5hbDo6SXNvTWFuYWdlckltcGw6OlNldENpZ1BhcmFtZXRlcnMsCi0gICAgICBjaWdfaWQsCi0gICAgICBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LAotICAgICAgcGFja2luZywKLSAgICAgIGZyYW1pbmcsCi0gICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICAgIGNpc19jb25maWcsCi0gICAgICBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaykpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlNldENpZ1BhcmFtZXRlcnNUZXN0KAotICAgIHVpbnQ4X3QgY2lnX2lkLAotICAgIHVpbnQzMl90IHNkdV9pbnRlcnZhbF9tX3RvX3MsCi0gICAgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICB1aW50OF90IGZ0X21fdG9fcywKLSAgICB1aW50OF90IGZ0X3NfdG9fbSwKLSAgICB1aW50MTZfdCBpc29faW50ZXJ2YWwsCi0gICAgaGNpOjpDbG9ja0FjY3VyYWN5IHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LAotICAgIGhjaTo6UGFja2luZyBwYWNraW5nLAotICAgIGhjaTo6RW5hYmxlIGZyYW1pbmcsCi0gICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tLAotICAgIHN0ZDo6dmVjdG9yPGhjaTo6TGVDaXNQYXJhbWV0ZXJzVGVzdENvbmZpZz4gY2lzX2NvbmZpZywKLSAgICBTZXRDaWdQYXJhbWV0ZXJzQ2FsbGJhY2sgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaykgewotICBpc29faGFuZGxlcl8tPkNhbGxPbigKLSAgICAgIGlzb19tYW5hZ2VyX2ltcGxfLAotICAgICAgJmludGVybmFsOjpJc29NYW5hZ2VySW1wbDo6U2V0Q2lnUGFyYW1ldGVyc1Rlc3QsCi0gICAgICBjaWdfaWQsCi0gICAgICBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgIGZ0X21fdG9fcywKLSAgICAgIGZ0X3NfdG9fbSwKLSAgICAgIGlzb19pbnRlcnZhbCwKLSAgICAgIHBlcmlwaGVyYWxzX2Nsb2NrX2FjY3VyYWN5LAotICAgICAgcGFja2luZywKLSAgICAgIGZyYW1pbmcsCi0gICAgICBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICAgIGNpc19jb25maWcsCi0gICAgICBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaykpOwotfQotCi12b2lkIElzb01hbmFnZXI6OkxlQ3JlYXRlQ2lzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiBjaXNfYW5kX2FjbF9oYW5kbGVzKSB7Ci0gIGlzb19oYW5kbGVyXy0+Q2FsbE9uKGlzb19tYW5hZ2VyX2ltcGxfLCAmaW50ZXJuYWw6Oklzb01hbmFnZXJJbXBsOjpMZUNyZWF0ZUNpcywgY2lzX2FuZF9hY2xfaGFuZGxlcyk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6UmVtb3ZlQ2lnKHVpbnQ4X3QgY2lnX2lkKSB7Ci0gIGlzb19oYW5kbGVyXy0+Q2FsbE9uKGlzb19tYW5hZ2VyX2ltcGxfLCAmaW50ZXJuYWw6Oklzb01hbmFnZXJJbXBsOjpSZW1vdmVDaWcsIGNpZ19pZCk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6U2VuZElzb1BhY2tldCh1aW50MTZfdCBjaXNfaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQpIHsKLSAgaXNvX2hhbmRsZXJfLT5DYWxsT24oaXNvX21hbmFnZXJfaW1wbF8sICZpbnRlcm5hbDo6SXNvTWFuYWdlckltcGw6OlNlbmRJc29QYWNrZXQsIGNpc19oYW5kbGUsIHBhY2tldCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpc28KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2lzby9pc29fbWFuYWdlci5oIGIvZ2QvaXNvL2lzb19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODQwNWMuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2lzb19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImlzby9pbnRlcm5hbC9pc29fbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBpc28gewotdXNpbmcgU2V0Q2lnUGFyYW1ldGVyc0NhbGxiYWNrID0gY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoc3RkOjp2ZWN0b3I8dWludDE2X3Q+IC8qIGNvbm5lY3Rpbm8gaGFuZGxlcyovKT47Ci11c2luZyBDaXNFc3RhYmxpc2hlZENhbGxiYWNrID0gY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZCh1aW50MTZfdCk+OwotdXNpbmcgSXNvRGF0YUNhbGxiYWNrID0gY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpJc29WaWV3Pik+OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGlzbyBhdHRyaWJ1dGVzLCBwYWlyaW5nLCBib25kaW5nIG9mIGRldmljZXMsIGFuZCB0aGUKLSAqIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBvZiBjb21tdW5pY2F0aW9ucy4KLSAqLwotY2xhc3MgSXNvTWFuYWdlciB7Ci0gcHVibGljOgotICBmcmllbmQgY2xhc3MgSXNvTW9kdWxlOwotCi0gIHZvaWQgUmVnaXN0ZXJJc29Fc3RhYmxpc2hlZENhbGxiYWNrKENpc0VzdGFibGlzaGVkQ2FsbGJhY2sgY2IpOwotICB2b2lkIFJlZ2lzdGVySXNvRGF0YUNhbGxiYWNrKElzb0RhdGFDYWxsYmFjayBjYik7Ci0KLSAgdm9pZCBTZXRDaWdQYXJhbWV0ZXJzKAotICAgICAgdWludDhfdCBjaWdfaWQsCi0gICAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgIGhjaTo6Q2xvY2tBY2N1cmFjeSBwZXJpcGhlcmFsc19jbG9ja19hY2N1cmFjeSwKLSAgICAgIGhjaTo6UGFja2luZyBwYWNraW5nLAotICAgICAgaGNpOjpFbmFibGUgZnJhbWluZywKLSAgICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsCi0gICAgICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tLAotICAgICAgc3RkOjp2ZWN0b3I8aGNpOjpDaXNQYXJhbWV0ZXJzQ29uZmlnPiBjaXNfY29uZmlnLAotICAgICAgU2V0Q2lnUGFyYW1ldGVyc0NhbGxiYWNrIGNvbW1hbmRfY29tcGxldGVfY2FsbGJhY2spOwotICB2b2lkIFNldENpZ1BhcmFtZXRlcnNUZXN0KAotICAgICAgdWludDhfdCBjaWdfaWQsCi0gICAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgIHVpbnQ4X3QgZnRfbV90b19zLAotICAgICAgdWludDhfdCBmdF9zX3RvX20sCi0gICAgICB1aW50MTZfdCBpc29faW50ZXJ2YWwsCi0gICAgICBoY2k6OkNsb2NrQWNjdXJhY3kgcGVyaXBoZXJhbHNfY2xvY2tfYWNjdXJhY3ksCi0gICAgICBoY2k6OlBhY2tpbmcgcGFja2luZywKLSAgICAgIGhjaTo6RW5hYmxlIGZyYW1pbmcsCi0gICAgICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICAgIHN0ZDo6dmVjdG9yPGhjaTo6TGVDaXNQYXJhbWV0ZXJzVGVzdENvbmZpZz4gY2lzX2NvbmZpZywKLSAgICAgIFNldENpZ1BhcmFtZXRlcnNDYWxsYmFjayBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrKTsKLQotICB2b2lkIExlQ3JlYXRlQ2lzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiBjaXNfYW5kX2FjbF9oYW5kbGVzKTsKLSAgdm9pZCBSZW1vdmVDaWcodWludDhfdCBjaWdfaWQpOwotCi0gIHZvaWQgU2VuZElzb1BhY2tldCh1aW50MTZfdCBjaXNfaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQpOwotCi0gcHJvdGVjdGVkOgotICBJc29NYW5hZ2VyKG9zOjpIYW5kbGVyKiBpc29faGFuZGxlciwgaW50ZXJuYWw6Oklzb01hbmFnZXJJbXBsKiBpc29fbWFuYWdlcl9pbXBsKQotICAgICAgOiBpc29faGFuZGxlcl8oaXNvX2hhbmRsZXIpLCBpc29fbWFuYWdlcl9pbXBsXyhpc29fbWFuYWdlcl9pbXBsKSB7fQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIGlzb19oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIGludGVybmFsOjpJc29NYW5hZ2VySW1wbCogaXNvX21hbmFnZXJfaW1wbF87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihJc29NYW5hZ2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpc28KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2lzby9pc29fbW9kdWxlLmNjIGIvZ2QvaXNvL2lzb19tb2R1bGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDk5NjcuLjAwMDAwMDAKLS0tIGEvZ2QvaXNvL2lzb19tb2R1bGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImlzbyIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaXNvL2lzb19tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaXNvIHsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBJc29Nb2R1bGU6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IElzb01vZHVsZSgpOyB9KTsKLQotc3RydWN0IElzb01vZHVsZTo6aW1wbCB7Ci0gIGltcGwob3M6OkhhbmRsZXIqIGlzb19oYW5kbGVyLCBoY2k6OkhjaUxheWVyKiBoY2lfbGF5ZXIsIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlcikKLSAgICAgIDogaXNvX2hhbmRsZXJfKGlzb19oYW5kbGVyKSwgaGNpX2xheWVyXyhoY2lfbGF5ZXIpLCBjb250cm9sbGVyXyhjb250cm9sbGVyKSB7fQotCi0gIG9zOjpIYW5kbGVyKiBpc29faGFuZGxlcl87Ci0gIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllcl87Ci0gIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlcl87Ci0KLSAgaW50ZXJuYWw6Oklzb01hbmFnZXJJbXBsIGlzb19tYW5hZ2VyX2ltcGx7aXNvX2hhbmRsZXJfLCBoY2lfbGF5ZXJfLCBjb250cm9sbGVyX307Ci19OwotCi12b2lkIElzb01vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxoY2k6OkhjaUxheWVyPigpOwotICBsaXN0LT5hZGQ8aGNpOjpDb250cm9sbGVyPigpOwotfQotCi12b2lkIElzb01vZHVsZTo6U3RhcnQoKSB7Ci0gIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oR2V0SGFuZGxlcigpLCBHZXREZXBlbmRlbmN5PGhjaTo6SGNpTGF5ZXI+KCksIEdldERlcGVuZGVuY3k8aGNpOjpDb250cm9sbGVyPigpKTsKLX0KLQotdm9pZCBJc29Nb2R1bGU6OlN0b3AoKSB7Ci0gIHBpbXBsXy5yZXNldCgpOwotfQotCi1zdGQ6OnN0cmluZyBJc29Nb2R1bGU6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIklzbyBNb2R1bGUiOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8SXNvTWFuYWdlcj4gSXNvTW9kdWxlOjpHZXRJc29NYW5hZ2VyKCkgewotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPElzb01hbmFnZXI+KG5ldyBJc29NYW5hZ2VyKHBpbXBsXy0+aXNvX2hhbmRsZXJfLCAmcGltcGxfLT5pc29fbWFuYWdlcl9pbXBsKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpc28KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2lzby9pc29fbW9kdWxlLmggYi9nZC9pc28vaXNvX21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGI4ODBjLi4wMDAwMDAwCi0tLSBhL2dkL2lzby9pc29fbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJpc28vaXNvX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaXNvIHsKLQotY2xhc3MgSXNvTW9kdWxlIDogcHVibGljIGJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIElzb01vZHVsZSgpID0gZGVmYXVsdDsKLSAgfklzb01vZHVsZSgpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogR2V0IHRoZSBhcGkgdG8gdGhlIElzb01hbmFnZXIKLSAgICovCi0gIHN0ZDo6dW5pcXVlX3B0cjxJc29NYW5hZ2VyPiBHZXRJc29NYW5hZ2VyKCk7Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLQotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihJc29Nb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlzbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvQW5kcm9pZC5icCBiL2dkL2wyY2FwL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZWMzYTYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhMMmNhcFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZjcy5jYyIsCi0gICAgICAgICJjbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmNjIiwKLSAgICAgICAgImNsYXNzaWMvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuY2MiLAotICAgICAgICAiY2xhc3NpYy9maXhlZF9jaGFubmVsLmNjIiwKLSAgICAgICAgImNsYXNzaWMvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmNjIiwKLSAgICAgICAgImNsYXNzaWMvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmNjIiwKLSAgICAgICAgImNsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjIiwKLSAgICAgICAgImNsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmNjIiwKLSAgICAgICAgImNsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5jYyIsCi0gICAgICAgICJjbGFzc2ljL2ludGVybmFsL2xpbmsuY2MiLAotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuY2MiLAotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9zaWduYWxsaW5nX21hbmFnZXIuY2MiLAotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9kdW1wc3lzX2hlbHBlci5jYyIsCi0gICAgICAgICJjbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmNjIiwKLSAgICAgICAgImR5bmFtaWNfY2hhbm5lbC5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9iYXNpY19tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjIiwKLSAgICAgICAgImludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmNjIiwKLSAgICAgICAgImludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmNjIiwKLSAgICAgICAgImludGVybmFsL2VuaGFuY2VkX3JldHJhbnNtaXNzaW9uX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuY2MiLAotICAgICAgICAiaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjIiwKLSAgICAgICAgImludGVybmFsL3JlY2VpdmVyLmNjIiwKLSAgICAgICAgImludGVybmFsL3NjaGVkdWxlcl9maWZvLmNjIiwKLSAgICAgICAgImludGVybmFsL3NlbmRlci5jYyIsCi0gICAgICAgICJsZS9keW5hbWljX2NoYW5uZWwuY2MiLAotICAgICAgICAibGUvZHluYW1pY19jaGFubmVsX21hbmFnZXIuY2MiLAotICAgICAgICAibGUvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuY2MiLAotICAgICAgICAibGUvZml4ZWRfY2hhbm5lbC5jYyIsCi0gICAgICAgICJsZS9maXhlZF9jaGFubmVsX21hbmFnZXIuY2MiLAotICAgICAgICAibGUvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmNjIiwKLSAgICAgICAgImxlL2xpbmtfb3B0aW9ucy5jYyIsCi0gICAgICAgICJsZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MiLAotICAgICAgICAibGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmNjIiwKLSAgICAgICAgImxlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MiLAotICAgICAgICAibGUvaW50ZXJuYWwvbGluay5jYyIsCi0gICAgICAgICJsZS9pbnRlcm5hbC9saW5rX21hbmFnZXIuY2MiLAotICAgICAgICAibGUvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmNjIiwKLSAgICAgICAgImxlL2wyY2FwX2xlX21vZHVsZS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoTDJjYXBUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX3Rlc3QuY2MiLAotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGxfdGVzdC5jYyIsCi0gICAgICAgICJjbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX3Rlc3QuY2MiLAotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9saW5rX3Rlc3QuY2MiLAotICAgICAgICAiY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXJfdGVzdC5jYyIsCi0gICAgICAgICJjbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlcl90ZXN0LmNjIiwKLSAgICAgICAgImludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXJfdGVzdC5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX3Rlc3QuY2MiLAotICAgICAgICAiaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGxfdGVzdC5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyX3Rlc3QuY2MiLAotICAgICAgICAiaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfdGVzdC5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9sZV9jcmVkaXRfYmFzZWRfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXJfdGVzdC5jYyIsCi0gICAgICAgICJpbnRlcm5hbC9yZWNlaXZlcl90ZXN0LmNjIiwKLSAgICAgICAgImludGVybmFsL3NjaGVkdWxlcl9maWZvX3Rlc3QuY2MiLAotICAgICAgICAiaW50ZXJuYWwvc2VuZGVyX3Rlc3QuY2MiLAotICAgICAgICAibGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjIiwKLSAgICAgICAgImxlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbF90ZXN0LmNjIiwKLSAgICAgICAgImxlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX3Rlc3QuY2MiLAotICAgICAgICAibGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyX3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEwyY2FwVW5pdFRlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJsMmNhcF9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJzaWduYWxfaWRfdGVzdC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlX2wyY2FwX2xheWVyIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjbGFzc2ljL2ZhY2FkZS5jYyIsCi0gICAgICAgICJsZS9mYWNhZGUuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEwyY2FwRnV6elRlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJpbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX2Z1enpfdGVzdC5jYyIsCi0gICAgICAgICJsMmNhcF9wYWNrZXRfZnV6el90ZXN0LmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvQlVJTEQuZ24gYi9nZC9sMmNhcC9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzNTBmNS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1zb3VyY2Vfc2V0KCJCbHVldG9vdGhMMmNhcFNvdXJjZXMiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImNsYXNzaWMvZHluYW1pY19jaGFubmVsX21hbmFnZXIuY2MiLAotICAgICJjbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmNjIiwKLSAgICAiY2xhc3NpYy9maXhlZF9jaGFubmVsLmNjIiwKLSAgICAiY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXIuY2MiLAotICAgICJjbGFzc2ljL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5jYyIsCi0gICAgImNsYXNzaWMvaW50ZXJuYWwvZHVtcHN5c19oZWxwZXIuY2MiLAotICAgICJjbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5jYyIsCi0gICAgImNsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmNjIiwKLSAgICAiY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjIiwKLSAgICAiY2xhc3NpYy9pbnRlcm5hbC9saW5rLmNjIiwKLSAgICAiY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuY2MiLAotICAgICJjbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5jYyIsCi0gICAgImNsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuY2MiLAotICAgICJkeW5hbWljX2NoYW5uZWwuY2MiLAotICAgICJmY3MuY2MiLAotICAgICJpbnRlcm5hbC9iYXNpY19tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjIiwKLSAgICAiaW50ZXJuYWwvZGF0YV9waXBlbGluZV9tYW5hZ2VyLmNjIiwKLSAgICAiaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2FsbG9jYXRvci5jYyIsCi0gICAgImludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmNjIiwKLSAgICAiaW50ZXJuYWwvZW5oYW5jZWRfcmV0cmFuc21pc3Npb25fbW9kZV9jaGFubmVsX2RhdGFfY29udHJvbGxlci5jYyIsCi0gICAgImludGVybmFsL2xlX2NyZWRpdF9iYXNlZF9jaGFubmVsX2RhdGFfY29udHJvbGxlci5jYyIsCi0gICAgImludGVybmFsL3JlY2VpdmVyLmNjIiwKLSAgICAiaW50ZXJuYWwvc2NoZWR1bGVyX2ZpZm8uY2MiLAotICAgICJpbnRlcm5hbC9zZW5kZXIuY2MiLAotICAgICJsZS9keW5hbWljX2NoYW5uZWwuY2MiLAotICAgICJsZS9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5jYyIsCi0gICAgImxlL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmNjIiwKLSAgICAibGUvZml4ZWRfY2hhbm5lbC5jYyIsCi0gICAgImxlL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5jYyIsCi0gICAgImxlL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5jYyIsCi0gICAgImxlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5jYyIsCi0gICAgImxlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5jYyIsCi0gICAgImxlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MiLAotICAgICJsZS9pbnRlcm5hbC9saW5rLmNjIiwKLSAgICAibGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmNjIiwKLSAgICAibGUvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmNjIiwKLSAgICAibGUvbDJjYXBfbGVfbW9kdWxlLmNjIiwKLSAgICAibGUvbGlua19vcHRpb25zLmNjIiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotICBkZXBzID0gWyAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiIF0KLX0KZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NpZC5oIGIvZ2QvbDJjYXAvY2lkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjFhYmIuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLQotdXNpbmcgQ2lkID0gdWludDE2X3Q7Ci0KLWNvbnN0ZXhwciBDaWQga0ludmFsaWRDaWQgPSAwOwotY29uc3RleHByIENpZCBrRmlyc3RGaXhlZENoYW5uZWwgPSAxOwotY29uc3RleHByIENpZCBrTGFzdEZpeGVkQ2hhbm5lbCA9IDYzOwotY29uc3RleHByIENpZCBrRmlyc3REeW5hbWljQ2hhbm5lbCA9IGtMYXN0Rml4ZWRDaGFubmVsICsgMTsKLWNvbnN0ZXhwciBDaWQga0xhc3REeW5hbWljQ2hhbm5lbCA9ICh1aW50MTZfdCkoMHhmZmZmKTsKLQotY29uc3RleHByIENpZCBrQ2xhc3NpY1NpZ25hbGxpbmdDaWQgPSAxOwotY29uc3RleHByIENpZCBrQ29ubmVjdGlvbmxlc3NDaWQgPSAyOwotY29uc3RleHByIENpZCBrTGVBdHRyaWJ1dGVDaWQgPSA0OwotY29uc3RleHByIENpZCBrTGVTaWduYWxsaW5nQ2lkID0gNTsKLWNvbnN0ZXhwciBDaWQga1NtcENpZCA9IDY7Ci1jb25zdGV4cHIgQ2lkIGtTbXBCckNpZCA9IDc7Ci0KLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9jZXJ0L2NlcnRfbDJjYXAucHkgYi9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvY2VydF9sMmNhcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlMDliOC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvY2VydF9sMmNhcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMjAgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBsb2dnaW5nCi0KLWZyb20gY2VydC5iZWhhdmlvciBpbXBvcnQgSUhhc0JlaGF2aW9ycywgU2luZ2xlQXJndW1lbnRCZWhhdmlvciwgUmVwbHlTdGFnZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC5weV9hY2xfbWFuYWdlciBpbXBvcnQgUHlBY2xNYW5hZ2VyCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWltcG9ydCBibHVldG9vdGhfcGFja2V0c19weXRob24zIGFzIGJ0X3BhY2tldHMKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgbDJjYXBfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBSYXdCdWlsZGVyCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgQ29tbWFuZENvZGUKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5sMmNhcF9wYWNrZXRzIGltcG9ydCBGaW5hbAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmwyY2FwX3BhY2tldHMgaW1wb3J0IFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHkKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5sMmNhcF9wYWNrZXRzIGltcG9ydCBTdXBlcnZpc29yeUZ1bmN0aW9uCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgUG9sbAotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmwyY2FwX3BhY2tldHMgaW1wb3J0IEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0Ci1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBGaWx0ZXJpbmdFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgSUV2ZW50U3RyZWFtCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEwyY2FwTWF0Y2hlcnMKLWZyb20gY2VydC5jYXB0dXJlcyBpbXBvcnQgTDJjYXBDYXB0dXJlcwotCi0KLWNsYXNzIENlcnRMMmNhcENoYW5uZWwoSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UsIHNjaWQsIGRjaWQsIGFjbF9zdHJlYW0sIGFjbCwgY29udHJvbF9jaGFubmVsLCBmY3M9Tm9uZSk6Ci0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9zY2lkID0gc2NpZAotICAgICAgICBzZWxmLl9kY2lkID0gZGNpZAotICAgICAgICBzZWxmLl9hY2xfc3RyZWFtID0gYWNsX3N0cmVhbQotICAgICAgICBzZWxmLl9hY2wgPSBhY2wKLSAgICAgICAgc2VsZi5fY29udHJvbF9jaGFubmVsID0gY29udHJvbF9jaGFubmVsCi0gICAgICAgIHNlbGYuX2NvbmZpZ19yc3BfcmVjZWl2ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLl9jb25maWdfcnNwX3NlbnQgPSBGYWxzZQotICAgICAgICBpZiBmY3MgPT0gbDJjYXBfcGFja2V0cy5GY3NUeXBlLkRFRkFVTFQ6Ci0gICAgICAgICAgICBzZWxmLl9vdXJfYWNsX3ZpZXcgPSBGaWx0ZXJpbmdFdmVudFN0cmVhbShhY2xfc3RyZWFtLCBMMmNhcE1hdGNoZXJzLkV4dHJhY3RCYXNpY0ZyYW1lV2l0aEZjcyhzY2lkKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuX291cl9hY2xfdmlldyA9IEZpbHRlcmluZ0V2ZW50U3RyZWFtKGFjbF9zdHJlYW0sIEwyY2FwTWF0Y2hlcnMuRXh0cmFjdEJhc2ljRnJhbWUoc2NpZCkpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fb3VyX2FjbF92aWV3LmdldF9ldmVudF9xdWV1ZSgpCi0KLSAgICBkZWYgaXNfY29uZmlndXJlZChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ19yc3BfcmVjZWl2ZWQgYW5kIHNlbGYuX2NvbmZpZ19yc3Bfc2VudAotCi0gICAgZGVmIHNlbmQoc2VsZiwgcGFja2V0KToKLSAgICAgICAgZnJhbWUgPSBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVCdWlsZGVyKHNlbGYuX2RjaWQsIHBhY2tldCkKLSAgICAgICAgc2VsZi5fYWNsLnNlbmQoZnJhbWUuU2VyaWFsaXplKCkpCi0KLSAgICBkZWYgc2VuZF9pX2ZyYW1lKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICB0eF9zZXEsCi0gICAgICAgICAgICAgICAgICAgICByZXFfc2VxLAotICAgICAgICAgICAgICAgICAgICAgZj1GaW5hbC5OT1RfU0VULAotICAgICAgICAgICAgICAgICAgICAgc2FyPVNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHkuVU5TRUdNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICBwYXlsb2FkPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICBmY3M9RmFsc2UpOgotICAgICAgICBpZiBmY3MgPT0gbDJjYXBfcGFja2V0cy5GY3NUeXBlLkRFRkFVTFQ6Ci0gICAgICAgICAgICBmcmFtZSA9IGwyY2FwX3BhY2tldHMuRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjc0J1aWxkZXIoc2VsZi5fZGNpZCwgdHhfc2VxLCBmLCByZXFfc2VxLCBzYXIsIHBheWxvYWQpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmcmFtZSA9IGwyY2FwX3BhY2tldHMuRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lQnVpbGRlcihzZWxmLl9kY2lkLCB0eF9zZXEsIGYsIHJlcV9zZXEsIHNhciwgcGF5bG9hZCkKLSAgICAgICAgc2VsZi5fYWNsLnNlbmQoZnJhbWUuU2VyaWFsaXplKCkpCi0KLSAgICBkZWYgc2VuZF9zX2ZyYW1lKHNlbGYsIHJlcV9zZXEsIHM9U3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUNFSVZFUl9SRUFEWSwgcD1Qb2xsLk5PVF9TRVQsIGY9RmluYWwuTk9UX1NFVCk6Ci0gICAgICAgIGZyYW1lID0gbDJjYXBfcGFja2V0cy5FbmhhbmNlZFN1cGVydmlzb3J5RnJhbWVCdWlsZGVyKHNlbGYuX2RjaWQsIHMsIHAsIGYsIHJlcV9zZXEpCi0gICAgICAgIHNlbGYuX2FjbC5zZW5kKGZyYW1lLlNlcmlhbGl6ZSgpKQotCi0gICAgZGVmIGNvbmZpZ19yZXF1ZXN0X2Zvcl9tZShzZWxmKToKLSAgICAgICAgcmV0dXJuIEwyY2FwTWF0Y2hlcnMuQ29uZmlndXJhdGlvblJlcXVlc3Qoc2VsZi5fc2NpZCkKLQotICAgIGRlZiBzZW5kX2NvbmZpZ3VyZV9yZXF1ZXN0KHNlbGYsIG9wdGlvbnMsIHNpZD0yLCBjb250aW51YXRpb249bDJjYXBfcGFja2V0cy5Db250aW51YXRpb24uRU5EKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9zY2lkKS5pc05vdEVxdWFsVG8oMSkKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuQ29uZmlndXJhdGlvblJlcXVlc3RCdWlsZGVyKHNpZCwgc2VsZi5fZGNpZCwgY29udGludWF0aW9uLCBvcHRpb25zKQotICAgICAgICBzZWxmLl9jb250cm9sX2NoYW5uZWwuc2VuZChyZXF1ZXN0KQotCi0gICAgZGVmIF9zZW5kX2luZm9ybWF0aW9uX3JlcXVlc3Qoc2VsZiwgdHlwZSk6Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5fc2NpZCkuaXNFcXVhbFRvKDEpCi0gICAgICAgIHNpZ25hbF9pZCA9IDMKLSAgICAgICAgaW5mb3JtYXRpb25fcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXF1ZXN0QnVpbGRlcihzaWduYWxfaWQsIHR5cGUpCi0gICAgICAgIHNlbGYuc2VuZChpbmZvcm1hdGlvbl9yZXF1ZXN0KQotCi0gICAgZGVmIHNlbmRfZXh0ZW5kZWRfZmVhdHVyZXNfcmVxdWVzdChzZWxmKToKLSAgICAgICAgc2VsZi5fc2VuZF9pbmZvcm1hdGlvbl9yZXF1ZXN0KEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlLkVYVEVOREVEX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLQotICAgIGRlZiB2ZXJpZnlfY29uZmlndXJhdGlvbl9yZXF1ZXN0X2FuZF9yZXNwb25kKHNlbGYsIHJlc3VsdD1Db25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQuU1VDQ0VTUywgb3B0aW9ucz1Ob25lKToKLSAgICAgICAgcmVxdWVzdF9jYXB0dXJlID0gTDJjYXBDYXB0dXJlcy5Db25maWd1cmF0aW9uUmVxdWVzdChzZWxmLl9zY2lkKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2NvbnRyb2xfY2hhbm5lbCkuZW1pdHMocmVxdWVzdF9jYXB0dXJlKQotICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdF9jYXB0dXJlLmdldCgpCi0gICAgICAgIHNpZCA9IHJlcXVlc3QuR2V0SWRlbnRpZmllcigpCi0gICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIG9wdGlvbnMgPSBbXQotICAgICAgICBjb25maWdfcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkNvbmZpZ3VyYXRpb25SZXNwb25zZUJ1aWxkZXIoc2lkLCBzZWxmLl9kY2lkLCBsMmNhcF9wYWNrZXRzLkNvbnRpbnVhdGlvbi5FTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIG9wdGlvbnMpCi0gICAgICAgIHNlbGYuX2NvbnRyb2xfY2hhbm5lbC5zZW5kKGNvbmZpZ19yZXNwb25zZSkKLQotICAgIGRlZiBzZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzdWx0PUNvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTLCBvcHRpb25zPU5vbmUpOgotICAgICAgICBzaWQgPSByZXF1ZXN0LkdldElkZW50aWZpZXIoKQotICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICBvcHRpb25zID0gW10KLSAgICAgICAgY29uZmlnX3Jlc3BvbnNlID0gbDJjYXBfcGFja2V0cy5Db25maWd1cmF0aW9uUmVzcG9uc2VCdWlsZGVyKHNpZCwgc2VsZi5fZGNpZCwgbDJjYXBfcGFja2V0cy5Db250aW51YXRpb24uRU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBvcHRpb25zKQotICAgICAgICBzZWxmLl9jb250cm9sX2NoYW5uZWwuc2VuZChjb25maWdfcmVzcG9uc2UpCi0gICAgICAgIHNlbGYuX2NvbmZpZ19yc3Bfc2VudCA9IFRydWUKLQotICAgIGRlZiB2ZXJpZnlfY29uZmlndXJhdGlvbl9yZXNwb25zZShzZWxmLCByZXN1bHQ9Q29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0LlNVQ0NFU1MpOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2NvbnRyb2xfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5Db25maWd1cmF0aW9uUmVzcG9uc2UocmVzdWx0KSkKLQotICAgIGRlZiBkaXNjb25uZWN0X2FuZF92ZXJpZnkoc2VsZik6Ci0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5fc2NpZCkuaXNOb3RFcXVhbFRvKDEpCi0gICAgICAgIHNlbGYuX2NvbnRyb2xfY2hhbm5lbC5zZW5kKGwyY2FwX3BhY2tldHMuRGlzY29ubmVjdGlvblJlcXVlc3RCdWlsZGVyKDEsIHNlbGYuX2RjaWQsIHNlbGYuX3NjaWQpKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5fY29udHJvbF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkRpc2Nvbm5lY3Rpb25SZXNwb25zZShzZWxmLl9zY2lkLCBzZWxmLl9kY2lkKSkKLQotICAgIGRlZiB2ZXJpZnlfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2NvbnRyb2xfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5EaXNjb25uZWN0aW9uUmVxdWVzdChzZWxmLl9kY2lkLCBzZWxmLl9zY2lkKSkKLQotCi1jbGFzcyBDZXJ0TDJjYXBDb250cm9sQ2hhbm5lbEJlaGF2aW9ycyhvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6Ci0gICAgICAgIHNlbGYub25fY29uZmlnX3JlcV9iZWhhdmlvciA9IFNpbmdsZUFyZ3VtZW50QmVoYXZpb3IoCi0gICAgICAgICAgICBsYW1iZGE6IENlcnRMMmNhcENvbnRyb2xDaGFubmVsQmVoYXZpb3JzLkNlcnRSZXBseVN0YWdlKHBhcmVudCkpCi0KLSAgICBkZWYgb25fY29uZmlnX3JlcShzZWxmLCBtYXRjaGVyKToKLSAgICAgICAgcmV0dXJuIHNlbGYub25fY29uZmlnX3JlcV9iZWhhdmlvci5iZWdpbihtYXRjaGVyKQotCi0gICAgY2xhc3MgQ2VydFJlcGx5U3RhZ2UoUmVwbHlTdGFnZSk6Ci0KLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6Ci0gICAgICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotCi0gICAgICAgIGRlZiBzZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2Uoc2VsZiwgcmVzdWx0PUNvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTLCBvcHRpb25zPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5fY29tbWl0KGxhbWJkYSByZXF1ZXN0OiBzZWxmLl9zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UocmVxdWVzdCwgcmVzdWx0LCBvcHRpb25zKSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmCi0KLSAgICAgICAgZGVmIF9zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzdWx0PUNvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTLCBvcHRpb25zPU5vbmUpOgotICAgICAgICAgICAgZGNpZCA9IHJlcXVlc3QuR2V0RGVzdGluYXRpb25DaWQoKQotICAgICAgICAgICAgaWYgZGNpZCBub3QgaW4gc2VsZi5wYXJlbnQuc2NpZF90b19jaGFubmVsOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiUmVjZWl2ZWQgY29uZmlnIHJlcXVlc3Qgd2l0aCB1bmtub3duIGRjaWQiKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgc2VsZi5wYXJlbnQuc2NpZF90b19jaGFubmVsW2RjaWRdLnNlbmRfY29uZmlndXJhdGlvbl9yZXNwb25zZShyZXF1ZXN0LCByZXN1bHQsIG9wdGlvbnMpCi0KLQotY2xhc3MgQ2VydEwyY2FwKENsb3NhYmxlLCBJSGFzQmVoYXZpb3JzKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UpOgotICAgICAgICBzZWxmLl9kZXZpY2UgPSBkZXZpY2UKLSAgICAgICAgc2VsZi5fYWNsX21hbmFnZXIgPSBQeUFjbE1hbmFnZXIoZGV2aWNlKQotICAgICAgICBzZWxmLl9hY2wgPSBOb25lCi0KLSAgICAgICAgc2VsZi5jb250cm9sX3RhYmxlID0gewotICAgICAgICAgICAgQ29tbWFuZENvZGUuQ09OTkVDVElPTl9SRVNQT05TRTogc2VsZi5fb25fY29ubmVjdGlvbl9yZXNwb25zZV9kZWZhdWx0LAotICAgICAgICAgICAgQ29tbWFuZENvZGUuQ09ORklHVVJBVElPTl9SRVFVRVNUOiBzZWxmLl9vbl9jb25maWd1cmF0aW9uX3JlcXVlc3RfZGVmYXVsdCwKLSAgICAgICAgICAgIENvbW1hbmRDb2RlLkNPTkZJR1VSQVRJT05fUkVTUE9OU0U6IHNlbGYuX29uX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2VfZGVmYXVsdCwKLSAgICAgICAgICAgIENvbW1hbmRDb2RlLkRJU0NPTk5FQ1RJT05fUkVRVUVTVDogc2VsZi5fb25fZGlzY29ubmVjdGlvbl9yZXF1ZXN0X2RlZmF1bHQsCi0gICAgICAgICAgICBDb21tYW5kQ29kZS5ESVNDT05ORUNUSU9OX1JFU1BPTlNFOiBzZWxmLl9vbl9kaXNjb25uZWN0aW9uX3Jlc3BvbnNlX2RlZmF1bHQsCi0gICAgICAgICAgICBDb21tYW5kQ29kZS5JTkZPUk1BVElPTl9SRVFVRVNUOiBzZWxmLl9vbl9pbmZvcm1hdGlvbl9yZXF1ZXN0X2RlZmF1bHQsCi0gICAgICAgICAgICBDb21tYW5kQ29kZS5JTkZPUk1BVElPTl9SRVNQT05TRTogc2VsZi5fb25faW5mb3JtYXRpb25fcmVzcG9uc2VfZGVmYXVsdAotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi5zY2lkX3RvX2NoYW5uZWwgPSB7fQotCi0gICAgICAgIHNlbGYuc3VwcG9ydF9lcnRtID0gVHJ1ZQotICAgICAgICBzZWxmLnN1cHBvcnRfZmNzID0gVHJ1ZQotCi0gICAgICAgIHNlbGYuX2NvbnRyb2xfYmVoYXZpb3JzID0gQ2VydEwyY2FwQ29udHJvbENoYW5uZWxCZWhhdmlvcnMoc2VsZikKLSAgICAgICAgc2VsZi5fY29udHJvbF9iZWhhdmlvcnMub25fY29uZmlnX3JlcV9iZWhhdmlvci5zZXRfZGVmYXVsdChzZWxmLl9zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2VfZGVmYXVsdCkKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5fYWNsX21hbmFnZXIuY2xvc2UoKQotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5fYWNsKQotCi0gICAgZGVmIGdldF9iZWhhdmlvcnMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9jb250cm9sX2JlaGF2aW9ycwotCi0gICAgZGVmIGNvbm5lY3RfYWNsKHNlbGYsIHJlbW90ZV9hZGRyKToKLSAgICAgICAgc2VsZi5fYWNsX21hbmFnZXIuaW5pdGlhdGVfY29ubmVjdGlvbihyZW1vdGVfYWRkcikKLSAgICAgICAgc2VsZi5fYWNsID0gc2VsZi5fYWNsX21hbmFnZXIuY29tcGxldGVfb3V0Z29pbmdfY29ubmVjdGlvbigpCi0gICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsID0gQ2VydEwyY2FwQ2hhbm5lbCgKLSAgICAgICAgICAgIHNlbGYuX2RldmljZSwgMSwgMSwgc2VsZi5fYWNsLmFjbF9zdHJlYW0sIHNlbGYuX2FjbCwgY29udHJvbF9jaGFubmVsPU5vbmUpCi0gICAgICAgIHNlbGYuX2FjbC5hY2xfc3RyZWFtLnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYuX2hhbmRsZV9jb250cm9sX3BhY2tldCkKLQotICAgIGRlZiBhY2NlcHRfaW5jb21pbmdfY29ubmVjdGlvbihzZWxmKToKLSAgICAgICAgc2VsZi5fYWNsX21hbmFnZXIubGlzdGVuX2Zvcl9hbl9pbmNvbWluZ19jb25uZWN0aW9uKCkKLSAgICAgICAgc2VsZi5fYWNsID0gc2VsZi5fYWNsX21hbmFnZXIuY29tcGxldGVfaW5jb21pbmdfY29ubmVjdGlvbigpCi0KLSAgICBkZWYgb3Blbl9jaGFubmVsKHNlbGYsIHNpZ25hbF9pZCwgcHNtLCBzY2lkLCBmY3M9Tm9uZSk6Ci0gICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsLnNlbmQobDJjYXBfcGFja2V0cy5Db25uZWN0aW9uUmVxdWVzdEJ1aWxkZXIoc2lnbmFsX2lkLCBwc20sIHNjaWQpKQotCi0gICAgICAgIHJlc3BvbnNlID0gTDJjYXBDYXB0dXJlcy5Db25uZWN0aW9uUmVzcG9uc2Uoc2NpZCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNvbnRyb2xfY2hhbm5lbCkuZW1pdHMocmVzcG9uc2UpCi0gICAgICAgIGNoYW5uZWwgPSBDZXJ0TDJjYXBDaGFubmVsKHNlbGYuX2RldmljZSwgc2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0KCkuR2V0RGVzdGluYXRpb25DaWQoKSwgc2VsZi5fYWNsLmFjbF9zdHJlYW0sIHNlbGYuX2FjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sX2NoYW5uZWwsIGZjcykKLSAgICAgICAgc2VsZi5zY2lkX3RvX2NoYW5uZWxbc2NpZF0gPSBjaGFubmVsCi0KLSAgICAgICAgcmV0dXJuIGNoYW5uZWwKLQotICAgIGRlZiB2ZXJpZnlfYW5kX3Jlc3BvbmRfb3Blbl9jaGFubmVsX2Zyb21fcmVtb3RlKHNlbGYsIHBzbT0weDMzLCBzY2lkPU5vbmUsIGZjcz1Ob25lKToKLQotICAgICAgICByZXF1ZXN0ID0gTDJjYXBDYXB0dXJlcy5Db25uZWN0aW9uUmVxdWVzdChwc20pCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jb250cm9sX2NoYW5uZWwpLmVtaXRzKHJlcXVlc3QpCi0KLSAgICAgICAgc2lkID0gcmVxdWVzdC5nZXQoKS5HZXRJZGVudGlmaWVyKCkKLSAgICAgICAgZGNpZCA9IHJlcXVlc3QuZ2V0KCkuR2V0U291cmNlQ2lkKCkKLSAgICAgICAgaWYgc2NpZCBpcyBOb25lIG9yIHNjaWQgaW4gc2VsZi5zY2lkX3RvX2NoYW5uZWw6Ci0gICAgICAgICAgICBzY2lkID0gZGNpZAotICAgICAgICBjaGFubmVsID0gQ2VydEwyY2FwQ2hhbm5lbChzZWxmLl9kZXZpY2UsIHNjaWQsIGRjaWQsIHNlbGYuX2FjbC5hY2xfc3RyZWFtLCBzZWxmLl9hY2wsIHNlbGYuY29udHJvbF9jaGFubmVsLCBmY3MpCi0gICAgICAgIHNlbGYuc2NpZF90b19jaGFubmVsW3NjaWRdID0gY2hhbm5lbAotCi0gICAgICAgIGNvbm5lY3Rpb25fcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25SZXNwb25zZUJ1aWxkZXIoCi0gICAgICAgICAgICBzaWQsIHNjaWQsIGRjaWQsIGwyY2FwX3BhY2tldHMuQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LlNVQ0NFU1MsCi0gICAgICAgICAgICBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25SZXNwb25zZVN0YXR1cy5OT19GVVJUSEVSX0lORk9STUFUSU9OX0FWQUlMQUJMRSkKLSAgICAgICAgc2VsZi5jb250cm9sX2NoYW5uZWwuc2VuZChjb25uZWN0aW9uX3Jlc3BvbnNlKQotCi0gICAgICAgIHJldHVybiBjaGFubmVsCi0KLSAgICBkZWYgdmVyaWZ5X2FuZF9yZXNwb25kX29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZV9hbmRfc2VuZF9jb25maWdfcmVxKHNlbGYsIHBzbT0weDMzKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSBhIGNvbm5lY3Rpb24gcmVxdWVzdCwgYW5kIHNlbmQgYSBjb21ibyBwYWNrZXQgb2YgY29ubmVjdGlvbiByZXNwb25zZSBhbmQgY29uZmlndXJhdGlvbiByZXF1ZXN0Ci0gICAgICAgICIiIgotICAgICAgICByZXF1ZXN0ID0gTDJjYXBDYXB0dXJlcy5Db25uZWN0aW9uUmVxdWVzdChwc20pCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jb250cm9sX2NoYW5uZWwpLmVtaXRzKHJlcXVlc3QpCi0KLSAgICAgICAgc2lkID0gcmVxdWVzdC5nZXQoKS5HZXRJZGVudGlmaWVyKCkKLSAgICAgICAgZGNpZCA9IHJlcXVlc3QuZ2V0KCkuR2V0U291cmNlQ2lkKCkKLSAgICAgICAgc2NpZCA9IGRjaWQKLSAgICAgICAgY2hhbm5lbCA9IENlcnRMMmNhcENoYW5uZWwoc2VsZi5fZGV2aWNlLCBzY2lkLCBkY2lkLCBzZWxmLl9hY2wuYWNsX3N0cmVhbSwgc2VsZi5fYWNsLCBzZWxmLmNvbnRyb2xfY2hhbm5lbCkKLSAgICAgICAgc2VsZi5zY2lkX3RvX2NoYW5uZWxbc2NpZF0gPSBjaGFubmVsCi0KLSAgICAgICAgIyBDb25uZWN0aW9uIHJlc3BvbnNlIGFuZCBjb25maWcgcmVxdWVzdCBjb21ibyBwYWNrZXQKLSAgICAgICAgY29ubl9yc3BfYW5kX2NvbmZpZ19yZXEgPSBSYXdCdWlsZGVyKFsKLSAgICAgICAgICAgIDB4MDMsIHNpZCwgMHgwOCwgMHgwMCwgZGNpZCwgMHgwMCwgZGNpZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgc2lkICsgMSwgMHgwNCwgMHgwMCwgZGNpZCwKLSAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAKLSAgICAgICAgXSkKLSAgICAgICAgc2VsZi5jb250cm9sX2NoYW5uZWwuc2VuZChjb25uX3JzcF9hbmRfY29uZmlnX3JlcSkKLQotICAgICAgICByZXR1cm4gY2hhbm5lbAotCi0gICAgIyBwcmVmZXIgdG8gdXNlIGNoYW5uZWwgYWJzdHJhY3Rpb24gaW5zdGVhZCwgaWYgYXQgYWxsIHBvc3NpYmxlCi0gICAgZGVmIHNlbmRfYWNsKHNlbGYsIHBhY2tldCk6Ci0gICAgICAgIHNlbGYuX2FjbC5zZW5kKHBhY2tldC5TZXJpYWxpemUoKSkKLQotICAgIGRlZiBnZXRfY29udHJvbF9jaGFubmVsKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5jb250cm9sX2NoYW5uZWwKLQotICAgICMgRGlzYWJsZSBFUlRNIHdoZW4gZXhjaGFuZ2UgZXh0ZW5lZCBmZWF0dXJlCi0gICAgZGVmIGNsYWltX2VydG1fdW5zdXBwb3J0ZWQoc2VsZik6Ci0gICAgICAgIHNlbGYuc3VwcG9ydF9lcnRtID0gRmFsc2UKLQotICAgIGRlZiBfb25fY29ubmVjdGlvbl9yZXNwb25zZV9kZWZhdWx0KHNlbGYsIGwyY2FwX2NvbnRyb2xfdmlldyk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBfb25fY29uZmlndXJhdGlvbl9yZXF1ZXN0X2RlZmF1bHQoc2VsZiwgbDJjYXBfY29udHJvbF92aWV3KToKLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3KGwyY2FwX2NvbnRyb2xfdmlldykKLSAgICAgICAgZGNpZCA9IHJlcXVlc3QuR2V0RGVzdGluYXRpb25DaWQoKQotICAgICAgICBpZiBkY2lkIG5vdCBpbiBzZWxmLnNjaWRfdG9fY2hhbm5lbDoKLSAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiUmVjZWl2ZWQgY29uZmlnIHJlcXVlc3Qgd2l0aCB1bmtub3duIGRjaWQiKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuX2NvbnRyb2xfYmVoYXZpb3JzLm9uX2NvbmZpZ19yZXFfYmVoYXZpb3IucnVuKHJlcXVlc3QpCi0KLSAgICBkZWYgX3NlbmRfY29uZmlndXJhdGlvbl9yZXNwb25zZV9kZWZhdWx0KHNlbGYsIGNhcHR1cmVkX3JlcXVlc3Rfdmlldyk6Ci0gICAgICAgIGRjaWQgPSBjYXB0dXJlZF9yZXF1ZXN0X3ZpZXcuR2V0RGVzdGluYXRpb25DaWQoKQotICAgICAgICBpZiBkY2lkIG5vdCBpbiBzZWxmLnNjaWRfdG9fY2hhbm5lbDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnNjaWRfdG9fY2hhbm5lbFtkY2lkXS5zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UoY2FwdHVyZWRfcmVxdWVzdF92aWV3KQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBjb25maWdfb3B0aW9uX2Jhc2ljX2V4cGxpY2l0KG10dT02NDIpOgotICAgICAgICBtdHVfb3B0ID0gbDJjYXBfcGFja2V0cy5NdHVDb25maWd1cmF0aW9uT3B0aW9uKCkKLSAgICAgICAgbXR1X29wdC5tdHUgPSBtdHUKLSAgICAgICAgcmZjX29wdCA9IGwyY2FwX3BhY2tldHMuUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbENvbmZpZ3VyYXRpb25PcHRpb24oKQotICAgICAgICByZmNfb3B0Lm1vZGUgPSBsMmNhcF9wYWNrZXRzLlJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uLkwyQ0FQX0JBU0lDCi0gICAgICAgIHJldHVybiBbbXR1X29wdCwgcmZjX29wdF0KLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgY29uZmlnX29wdGlvbl9tdHVfZXhwbGljaXQobXR1PTY0Mik6Ci0gICAgICAgIG10dV9vcHQgPSBsMmNhcF9wYWNrZXRzLk10dUNvbmZpZ3VyYXRpb25PcHRpb24oKQotICAgICAgICBtdHVfb3B0Lm10dSA9IG10dQotICAgICAgICByZXR1cm4gW210dV9vcHRdCi0KLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIGNvbmZpZ19vcHRpb25fZXJ0bShtdHU9NjQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNzPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdHJhbnNtaXQ9MTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtcHM9MTAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3dpbmRvd19zaXplPTEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl90aW1lX291dD0yMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fdGltZV9vdXQ9MTAwMCk6Ci0gICAgICAgIHJlc3VsdCA9IFtdCi0gICAgICAgIG10dV9vcHQgPSBsMmNhcF9wYWNrZXRzLk10dUNvbmZpZ3VyYXRpb25PcHRpb24oKQotICAgICAgICBtdHVfb3B0Lm10dSA9IG10dQotICAgICAgICByZXN1bHQuYXBwZW5kKG10dV9vcHQpCi0gICAgICAgIGlmIGZjcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGZjc19vcHQgPSBsMmNhcF9wYWNrZXRzLkZyYW1lQ2hlY2tTZXF1ZW5jZU9wdGlvbigpCi0gICAgICAgICAgICBmY3Nfb3B0LmZjc190eXBlID0gZmNzCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGZjc19vcHQpCi0gICAgICAgIHJmY19vcHQgPSBsMmNhcF9wYWNrZXRzLlJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uKCkKLSAgICAgICAgcmZjX29wdC5tb2RlID0gbDJjYXBfcGFja2V0cy5SZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZU9wdGlvbi5FTkhBTkNFRF9SRVRSQU5TTUlTU0lPTgotICAgICAgICByZmNfb3B0LnR4X3dpbmRvd19zaXplID0gdHhfd2luZG93X3NpemUKLSAgICAgICAgcmZjX29wdC5tYXhfdHJhbnNtaXQgPSBtYXhfdHJhbnNtaXQKLSAgICAgICAgcmZjX29wdC5yZXRyYW5zbWlzc2lvbl90aW1lX291dCA9IHJldHJhbnNtaXNzaW9uX3RpbWVfb3V0Ci0gICAgICAgIHJmY19vcHQubW9uaXRvcl90aW1lX291dCA9IG1vbml0b3JfdGltZV9vdXQKLSAgICAgICAgcmZjX29wdC5tYXhpbXVtX3BkdV9zaXplID0gbXBzCi0gICAgICAgIHJlc3VsdC5hcHBlbmQocmZjX29wdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBjb25maWdfb3B0aW9uX2VydG1fd2l0aF9tYXhfdHJhbnNtaXRfb25lKCk6Ci0gICAgICAgIHJldHVybiBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKG1heF90cmFuc21pdD0xKQotCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBjb25maWdfb3B0aW9uX2VydG1fd2l0aF9tcHMobXBzPTEwMTApOgotICAgICAgICByZXR1cm4gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShtcHM9bXBzKQotCi0gICAgZGVmIF9vbl9jb25maWd1cmF0aW9uX3Jlc3BvbnNlX2RlZmF1bHQoc2VsZiwgbDJjYXBfY29udHJvbF92aWV3KToKLSAgICAgICAgcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkNvbmZpZ3VyYXRpb25SZXNwb25zZVZpZXcobDJjYXBfY29udHJvbF92aWV3KQotICAgICAgICBzY2lkID0gcmVzcG9uc2UuR2V0U291cmNlQ2lkKCkKLSAgICAgICAgaWYgc2NpZCBub3QgaW4gc2VsZi5zY2lkX3RvX2NoYW5uZWw6Ci0gICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIlJlY2VpdmVkIGNvbmZpZyByZXF1ZXN0IHdpdGggdW5rbm93biBkY2lkIikKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICByZXN1bHQgPSByZXNwb25zZS5HZXRSZXN1bHQoKQotICAgICAgICBpZiByZXN1bHQgPT0gQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0LlNVQ0NFU1M6Ci0gICAgICAgICAgICBzZWxmLnNjaWRfdG9fY2hhbm5lbFtzY2lkXS5fY29uZmlnX3JzcF9yZWNlaXZlZCA9IFRydWUKLQotICAgIGRlZiBfb25fZGlzY29ubmVjdGlvbl9yZXF1ZXN0X2RlZmF1bHQoc2VsZiwgbDJjYXBfY29udHJvbF92aWV3KToKLSAgICAgICAgZGlzY29ubmVjdGlvbl9yZXF1ZXN0ID0gbDJjYXBfcGFja2V0cy5EaXNjb25uZWN0aW9uUmVxdWVzdFZpZXcobDJjYXBfY29udHJvbF92aWV3KQotICAgICAgICBzaWQgPSBkaXNjb25uZWN0aW9uX3JlcXVlc3QuR2V0SWRlbnRpZmllcigpCi0gICAgICAgIHNjaWQgPSBkaXNjb25uZWN0aW9uX3JlcXVlc3QuR2V0U291cmNlQ2lkKCkKLSAgICAgICAgZGNpZCA9IGRpc2Nvbm5lY3Rpb25fcmVxdWVzdC5HZXREZXN0aW5hdGlvbkNpZCgpCi0gICAgICAgIGRpc2Nvbm5lY3Rpb25fcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkRpc2Nvbm5lY3Rpb25SZXNwb25zZUJ1aWxkZXIoc2lkLCBkY2lkLCBzY2lkKQotICAgICAgICBzZWxmLmNvbnRyb2xfY2hhbm5lbC5zZW5kKGRpc2Nvbm5lY3Rpb25fcmVzcG9uc2UpCi0KLSAgICBkZWYgX29uX2Rpc2Nvbm5lY3Rpb25fcmVzcG9uc2VfZGVmYXVsdChzZWxmLCBsMmNhcF9jb250cm9sX3ZpZXcpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgX29uX2luZm9ybWF0aW9uX3JlcXVlc3RfZGVmYXVsdChzZWxmLCBsMmNhcF9jb250cm9sX3ZpZXcpOgotICAgICAgICBpbmZvcm1hdGlvbl9yZXF1ZXN0ID0gbDJjYXBfcGFja2V0cy5JbmZvcm1hdGlvblJlcXVlc3RWaWV3KGwyY2FwX2NvbnRyb2xfdmlldykKLSAgICAgICAgc2lkID0gaW5mb3JtYXRpb25fcmVxdWVzdC5HZXRJZGVudGlmaWVyKCkKLSAgICAgICAgaW5mb3JtYXRpb25fdHlwZSA9IGluZm9ybWF0aW9uX3JlcXVlc3QuR2V0SW5mb1R5cGUoKQotICAgICAgICBpZiBpbmZvcm1hdGlvbl90eXBlID09IGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUuQ09OTkVDVElPTkxFU1NfTVRVOgotICAgICAgICAgICAgcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkluZm9ybWF0aW9uUmVzcG9uc2VDb25uZWN0aW9ubGVzc010dUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgc2lkLCBsMmNhcF9wYWNrZXRzLkluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdC5TVUNDRVNTLCAxMDApCi0gICAgICAgICAgICBzZWxmLmNvbnRyb2xfY2hhbm5lbC5zZW5kKHJlc3BvbnNlKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIGluZm9ybWF0aW9uX3R5cGUgPT0gbDJjYXBfcGFja2V0cy5JbmZvcm1hdGlvblJlcXVlc3RJbmZvVHlwZS5FWFRFTkRFRF9GRUFUVVJFU19TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXNwb25zZSA9IGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXNwb25zZUV4dGVuZGVkRmVhdHVyZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgIHNpZCwgbDJjYXBfcGFja2V0cy5JbmZvcm1hdGlvblJlcXVlc3RSZXN1bHQuU1VDQ0VTUywgMCwgMCwgMCwgc2VsZi5zdXBwb3J0X2VydG0sIDAsIHNlbGYuc3VwcG9ydF9mY3MsIDAsCi0gICAgICAgICAgICAgICAgMCwgMCwgMCwgMCkKLSAgICAgICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsLnNlbmQocmVzcG9uc2UpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgaW5mb3JtYXRpb25fdHlwZSA9PSBsMmNhcF9wYWNrZXRzLkluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlLkZJWEVEX0NIQU5ORUxTX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIHJlc3BvbnNlID0gbDJjYXBfcGFja2V0cy5JbmZvcm1hdGlvblJlc3BvbnNlRml4ZWRDaGFubmVsc0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgc2lkLCBsMmNhcF9wYWNrZXRzLkluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdC5TVUNDRVNTLCAyKQotICAgICAgICAgICAgc2VsZi5jb250cm9sX2NoYW5uZWwuc2VuZChyZXNwb25zZSkKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgZGVmIF9vbl9pbmZvcm1hdGlvbl9yZXNwb25zZV9kZWZhdWx0KHNlbGYsIGwyY2FwX2NvbnRyb2xfdmlldyk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiBfaGFuZGxlX2NvbnRyb2xfcGFja2V0KHNlbGYsIGwyY2FwX3BhY2tldCk6Ci0gICAgICAgIHBhY2tldF9ieXRlcyA9IGwyY2FwX3BhY2tldC5wYXlsb2FkCi0gICAgICAgIGwyY2FwX3ZpZXcgPSBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVWaWV3KGJ0X3BhY2tldHMuUGFja2V0Vmlld0xpdHRsZUVuZGlhbihsaXN0KHBhY2tldF9ieXRlcykpKQotICAgICAgICBpZiBsMmNhcF92aWV3LkdldENoYW5uZWxJZCgpICE9IDE6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgbDJjYXBfY29udHJvbF92aWV3ID0gbDJjYXBfcGFja2V0cy5Db250cm9sVmlldyhsMmNhcF92aWV3LkdldFBheWxvYWQoKSkKLSAgICAgICAgZm4gPSBzZWxmLmNvbnRyb2xfdGFibGUuZ2V0KGwyY2FwX2NvbnRyb2xfdmlldy5HZXRDb2RlKCkpCi0gICAgICAgIGlmIGZuIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZm4obDJjYXBfY29udHJvbF92aWV3KQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9jZXJ0L2wyY2FwX3BlcmZvcm1hbmNlX3Rlc3QucHkgYi9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvbDJjYXBfcGVyZm9ybWFuY2VfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhODQ3Ny4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvbDJjYXBfcGVyZm9ybWFuY2VfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIGwyY2FwLmNsYXNzaWMuY2VydC5sMmNhcF9wZXJmb3JtYW5jZV90ZXN0X2xpYiBpbXBvcnQgTDJjYXBQZXJmb3JtYW5jZVRlc3RCYXNlCi0KLQotY2xhc3MgTDJjYXBQZXJmb3JtYW5jZVRlc3QoR2RCYXNlVGVzdENsYXNzLCBMMmNhcFBlcmZvcm1hbmNlVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nTDJDQVAnLCBjZXJ0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIEwyY2FwUGVyZm9ybWFuY2VUZXN0QmFzZS5zZXR1cF90ZXN0KHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgTDJjYXBQZXJmb3JtYW5jZVRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9sMmNhcF9wZXJmb3JtYW5jZV90ZXN0X2xpYi5weSBiL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9sMmNhcF9wZXJmb3JtYW5jZV90ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwYWEyMy4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvbDJjYXBfcGVyZm9ybWFuY2VfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZWRlbHRhCi0KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgUmF3QnVpbGRlcgotZnJvbSBjZXJ0Lm1hdGNoZXJzIGltcG9ydCBMMmNhcE1hdGNoZXJzCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gY2VydC5wZXJmb3JtYW5jZV90ZXN0X2xvZ2dlciBpbXBvcnQgUGVyZm9ybWFuY2VUZXN0TG9nZ2VyCi1mcm9tIGwyY2FwLmNsYXNzaWMuY2VydC5jZXJ0X2wyY2FwIGltcG9ydCBDZXJ0TDJjYXAKLWZyb20gbDJjYXAuY2xhc3NpYy5jZXJ0LmwyY2FwX3Rlc3RfbGliIGltcG9ydCBHZW5lcmFsTDJjYXBUZXN0QmFzZQotZnJvbSBsMmNhcC5jbGFzc2ljLmZhY2FkZV9wYjIgaW1wb3J0IFJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgRmNzVHlwZQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmwyY2FwX3BhY2tldHMgaW1wb3J0IFN1cGVydmlzb3J5RnVuY3Rpb24KLQotCi1jbGFzcyBMMmNhcFBlcmZvcm1hbmNlVGVzdEJhc2UoR2VuZXJhbEwyY2FwVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZiwgZHV0LCBjZXJ0KToKLSAgICAgICAgR2VuZXJhbEwyY2FwVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBkdXQsIGNlcnQpCi0gICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIgPSBQZXJmb3JtYW5jZVRlc3RMb2dnZXIoKQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdlbmVyYWxMMmNhcFRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLQotICAgIGRlZiBfYmFzaWNfbW9kZV90eChzZWxmLCBtdHUsIHBhY2tldHMpOgotICAgICAgICAiIiIKLSAgICAgICAgU2VuZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwYWNrZXRzIGFuZCByZXR1cm4gdGhlIHRpbWUgaW50ZXJ2YWwgaW4gbXMuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgpCi0gICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuc3RhcnRfaW50ZXJ2YWwoIlRYIikKLSAgICAgICAgZm9yIF8gaW4gcmFuZ2UocGFja2V0cyk6Ci0gICAgICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYScgKiBtdHUpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuRGF0YShiJ2EnICogbXR1KSwgYXRfbGVhc3RfdGltZXM9cGFja2V0cywgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz02MCkpCi0gICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuZW5kX2ludGVydmFsKCJUWCIpCi0KLSAgICAgICAgZHVyYXRpb24gPSBzZWxmLnBlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLmdldF9kdXJhdGlvbl9vZl9pbnRlcnZhbHMoIlRYIilbMF0KLSAgICAgICAgc2VsZi5sb2cuaW5mbygiRHVyYXRpb246ICVzIiAlIHN0cihkdXJhdGlvbikpCi0KLSAgICAgICAgcmV0dXJuIGR1cmF0aW9uCi0KLSAgICBkZWYgX2Jhc2ljX21vZGVfdHhfZml4ZWRfaW50ZXJ2YWwoc2VsZiwgbXR1LCBpbnRlcnZhbD10aW1lZGVsdGEoc2Vjb25kcz0xMCksIGJhdGNoX3NpemU9MjApOgotICAgICAgICAiIiIKLSAgICAgICAgU2VuZCBwYWNrZXRzIGFzIG11Y2ggYXMgcG9zc2libGUgb3ZlciBhIGNlcnRhaW4gaW50ZXJ2YWwsIGFuZCByZXR1cm4gdGhlCi0gICAgICAgIG51bWJlciBvZiBwYWNrZXRzIHNlbnQKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLSAgICAgICAgc3RhcnRfdGltZSA9IGRhdGV0aW1lLm5vdygpCi0gICAgICAgIGVuZF90aW1lID0gc3RhcnRfdGltZSArIGludGVydmFsCi0gICAgICAgIHBhY2tldHNfc2VudCA9IDAKLSAgICAgICAgd2hpbGUgZGF0ZXRpbWUubm93KCkgPCBlbmRfdGltZToKLSAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGJhdGNoX3NpemUpOgotICAgICAgICAgICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhJyAqIG10dSkKLSAgICAgICAgICAgIHBhY2tldHNfc2VudCArPSBiYXRjaF9zaXplCi0gICAgICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5EYXRhKGInYScgKiBtdHUpLCBhdF9sZWFzdF90aW1lcz1iYXRjaF9zaXplKQotCi0gICAgICAgIHJldHVybiBwYWNrZXRzX3NlbnQKLQotICAgIGRlZiBfYmFzaWNfbW9kZV9yeChzZWxmLCBtdHUsIHBhY2tldHMpOgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgpCi0gICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuc3RhcnRfaW50ZXJ2YWwoIlJYIikKLSAgICAgICAgZGF0YSA9IGIiYSIgKiBtdHUKLSAgICAgICAgZGF0YV9wYWNrZXQgPSBSYXdCdWlsZGVyKFt4IGZvciB4IGluIGRhdGFdKQotICAgICAgICBmb3IgXyBpbiByYW5nZShwYWNrZXRzKToKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kKGRhdGFfcGFja2V0KQotICAgICAgICBhc3NlcnRUaGF0KGR1dF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFJhd0RhdGEoZGF0YSksIGF0X2xlYXN0X3RpbWVzPXBhY2tldHMsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9NjApKQotICAgICAgICBzZWxmLnBlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLmVuZF9pbnRlcnZhbCgiUlgiKQotCi0gICAgICAgIGR1cmF0aW9uID0gc2VsZi5wZXJmb3JtYW5jZV90ZXN0X2xvZ2dlci5nZXRfZHVyYXRpb25fb2ZfaW50ZXJ2YWxzKCJSWCIpWzBdCi0gICAgICAgIHNlbGYubG9nLmluZm8oIkR1cmF0aW9uOiAlcyIgJSBzdHIoZHVyYXRpb24pKQotCi0gICAgZGVmIF9lcnRtX21vZGVfdHgoc2VsZiwgbXR1LCBwYWNrZXRzLCB0eF93aW5kb3dfc2l6ZT0xMCk6Ci0gICAgICAgICIiIgotICAgICAgICBTZW5kIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBhY2tldHMgYW5kIHJldHVybiB0aGUgdGltZSBpbnRlcnZhbCBpbiBtcy4KLSAgICAgICAgIiIiCi0gICAgICAgICMgTWFrZSBzdXJlIHRoYXQgbnVtYmVyIG9mIHBhY2tldHMgaXMgYSBtdWx0aXBsZSBvZiB0eF93aW5kb3dfc2l6ZQotICAgICAgICBwYWNrZXRzID0gcGFja2V0cyAvLyB0eF93aW5kb3dfc2l6ZSAqIHR4X3dpbmRvd19zaXplCi0gICAgICAgICMgRm9yIEVSVE0gVFggdGVzdCwgd2UgaGF2ZSB0byBkbyBpdCBzZXF1ZW50aWFsbHkgYmVjYXVzZSBjZXJ0IG5lZWRzIHRvIGFjawotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIHR4X3dpbmRvd19zaXplPXR4X3dpbmRvd19zaXplKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sCi0gICAgICAgICAgICBmY3M9RmNzVHlwZS5OT19GQ1MsCi0gICAgICAgICAgICByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLAotICAgICAgICAgICAgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBzZWxmLnBlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLnN0YXJ0X2ludGVydmFsKCJUWCIpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKHBhY2tldHMpOgotICAgICAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2EnICogbXR1KQotICAgICAgICAgICAgaWYgaSAlIHR4X3dpbmRvd19zaXplID09IHR4X3dpbmRvd19zaXplIC0gMToKLSAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUocGF5bG9hZD1iJ2EnICogbXR1KSwgYXRfbGVhc3RfdGltZXM9dHhfd2luZG93X3NpemUpCi0gICAgICAgICAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfc19mcmFtZShyZXFfc2VxPShpICsgMSkgJSA2NCwgcz1TdXBlcnZpc29yeUZ1bmN0aW9uLlJFQ0VJVkVSX1JFQURZKQotCi0gICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuZW5kX2ludGVydmFsKCJUWCIpCi0KLSAgICAgICAgZHVyYXRpb24gPSBzZWxmLnBlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLmdldF9kdXJhdGlvbl9vZl9pbnRlcnZhbHMoIlRYIilbMF0KLSAgICAgICAgc2VsZi5sb2cuaW5mbygiRHVyYXRpb246ICVzIiAlIHN0cihkdXJhdGlvbikpCi0KLSAgICAgICAgcmV0dXJuIGR1cmF0aW9uCi0KLSAgICBkZWYgX2VydG1fbW9kZV9yeChzZWxmLCBtdHUsIHBhY2tldHMsIHR4X3dpbmRvd19zaXplPTEwKToKLSAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBudW1iZXIgb2YgcGFja2V0cyBpcyBhIG11bHRpcGxlIG9mIHR4X3dpbmRvd19zaXplCi0gICAgICAgIHBhY2tldHMgPSBwYWNrZXRzIC8vIHR4X3dpbmRvd19zaXplICogdHhfd2luZG93X3NpemUKLQotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIHR4X3dpbmRvd19zaXplPXR4X3dpbmRvd19zaXplKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sCi0gICAgICAgICAgICBmY3M9RmNzVHlwZS5OT19GQ1MsCi0gICAgICAgICAgICByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLAotICAgICAgICAgICAgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBkYXRhID0gYiJhIiAqIG10dQotICAgICAgICBkYXRhX3BhY2tldCA9IFJhd0J1aWxkZXIoW3ggZm9yIHggaW4gZGF0YV0pCi0gICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuc3RhcnRfaW50ZXJ2YWwoIlJYIikKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGFja2V0cyk6Ci0gICAgICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT1pICUgNjQsIHJlcV9zZXE9MCwgcGF5bG9hZD1kYXRhX3BhY2tldCkKLSAgICAgICAgICAgIGlmIGkgJSB0eF93aW5kb3dfc2l6ZSA9PSAodHhfd2luZG93X3NpemUgLSAxKToKLSAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT0oaSArIDEpICUgNjQpKQotICAgICAgICBzZWxmLnBlcmZvcm1hbmNlX3Rlc3RfbG9nZ2VyLmVuZF9pbnRlcnZhbCgiUlgiKQotCi0gICAgICAgIGR1cmF0aW9uID0gc2VsZi5wZXJmb3JtYW5jZV90ZXN0X2xvZ2dlci5nZXRfZHVyYXRpb25fb2ZfaW50ZXJ2YWxzKCJSWCIpWzBdCi0gICAgICAgIHNlbGYubG9nLmluZm8oIkR1cmF0aW9uOiAlcyIgJSBzdHIoZHVyYXRpb24pKQotCi0gICAgZGVmIHRlc3RfYmFzaWNfbW9kZV90eF82NzJfMTAwKHNlbGYpOgotICAgICAgICBkdXJhdGlvbiA9IHNlbGYuX2Jhc2ljX21vZGVfdHgoNjcyLCAxMDApCi0gICAgICAgIGFzc2VydFRoYXQoZHVyYXRpb24pLmlzV2l0aGluKHRpbWVkZWx0YShzZWNvbmRzPTIpKQotCi0gICAgZGVmIHRlc3RfYmFzaWNfbW9kZV90eF8xMDBfMTAwKHNlbGYpOgotICAgICAgICBkdXJhdGlvbiA9IHNlbGYuX2Jhc2ljX21vZGVfdHgoMTAwLCAxMDApCi0gICAgICAgIGFzc2VydFRoYXQoZHVyYXRpb24pLmlzV2l0aGluKHRpbWVkZWx0YShzZWNvbmRzPTIpKQotCi0gICAgZGVmIHRlc3RfZXJ0bV9tb2RlX3R4XzY3Ml8xMDAoc2VsZik6Ci0gICAgICAgIGR1cmF0aW9uID0gc2VsZi5fZXJ0bV9tb2RlX3R4KDY3MiwgMTAwKQotICAgICAgICBhc3NlcnRUaGF0KGR1cmF0aW9uKS5pc1dpdGhpbih0aW1lZGVsdGEoc2Vjb25kcz01KSkKLQotICAgIGRlZiB0ZXN0X2Jhc2ljX21vZGVfcnhfNjcyXzEwMChzZWxmKToKLSAgICAgICAgc2VsZi5fYmFzaWNfbW9kZV9yeCg2NzIsIDEwMCkKLQotICAgIGRlZiB0ZXN0X2VydG1fbW9kZV9yeF82NzJfMTAwKHNlbGYpOgotICAgICAgICBzZWxmLl9lcnRtX21vZGVfcngoNjcyLCAxMDApCi0KLSAgICBkZWYgdGVzdF9iYXNpY19tb2RlX2VuZF90b19lbmRfbGF0ZW5jeShzZWxmKToKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotCi0gICAgICAgIGRhdGEgPSBiImEiICogMTAwCi0gICAgICAgIGRhdGFfcGFja2V0ID0gUmF3QnVpbGRlcihbeCBmb3IgeCBpbiBkYXRhXSkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKLSAgICAgICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuc3RhcnRfaW50ZXJ2YWwoIlJYIikKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kKGRhdGFfcGFja2V0KQotICAgICAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkUmF3RGF0YShkYXRhKSkKLSAgICAgICAgICAgIHNlbGYucGVyZm9ybWFuY2VfdGVzdF9sb2dnZXIuZW5kX2ludGVydmFsKCJSWCIpCi0gICAgICAgIGR1cmF0aW9uID0gc2VsZi5wZXJmb3JtYW5jZV90ZXN0X2xvZ2dlci5nZXRfZHVyYXRpb25fb2ZfaW50ZXJ2YWxzKCJSWCIpCi0gICAgICAgIG1lYW4gPSBzdW0oZHVyYXRpb24sIHRpbWVkZWx0YSgpKSAvIGxlbihkdXJhdGlvbikKLSAgICAgICAgc2VsZi5sb2cuaW5mbygiTWVhbjogJXMiICUgc3RyKG1lYW4pKQotCi0gICAgZGVmIHRlc3RfYmFzaWNfbW9kZV9udW1iZXJfb2ZfcGFja2V0c18xMF9zZWNvbmRzXzY3MihzZWxmKToKLSAgICAgICAgbnVtYmVyX3BhY2tldHMgPSBzZWxmLl9iYXNpY19tb2RlX3R4X2ZpeGVkX2ludGVydmFsKDY3MikKLSAgICAgICAgIyBSZXF1aXJpbmcgdGhhdCA1MDAgcGFja2V0cyAoMjBtcyBwZXJpb2Qgb24gYXZlcmFnZSkgYXJlIHNlbnQKLSAgICAgICAgc2VsZi5sb2cuaW5mbygiUGFja2V0cyBzZW50OiAlZCIgJSBudW1iZXJfcGFja2V0cykKLSAgICAgICAgYXNzZXJ0VGhhdChudW1iZXJfcGFja2V0cyA+IDUwMCkuaXNUcnVlKCkKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9sMmNhcF90ZXN0LnB5IGIvZ2QvbDJjYXAvY2xhc3NpYy9jZXJ0L2wyY2FwX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTU3MzQuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9jZXJ0L2wyY2FwX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZyb20gY2VydC5nZF9iYXNlX3Rlc3QgaW1wb3J0IEdkQmFzZVRlc3RDbGFzcwotZnJvbSBsMmNhcC5jbGFzc2ljLmNlcnQubDJjYXBfdGVzdF9saWIgaW1wb3J0IEwyY2FwVGVzdEJhc2UKLQotCi1jbGFzcyBMMmNhcFRlc3QoR2RCYXNlVGVzdENsYXNzLCBMMmNhcFRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0wyQ0FQJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfdGVzdChzZWxmKQotICAgICAgICBMMmNhcFRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBMMmNhcFRlc3RCYXNlLnRlYXJkb3duX3Rlc3Qoc2VsZikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnRlYXJkb3duX3Rlc3Qoc2VsZikKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9sMmNhcF90ZXN0X2xpYi5weSBiL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9sMmNhcF90ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxYWFlMi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvbDJjYXBfdGVzdF9saWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg2ICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi0KLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBsMmNhcF9wYWNrZXRzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IFJhd0J1aWxkZXIKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5sMmNhcF9wYWNrZXRzIGltcG9ydCBGY3NUeXBlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgRmluYWwKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5sMmNhcF9wYWNrZXRzIGltcG9ydCBQb2xsCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmwyY2FwX3BhY2tldHMgaW1wb3J0IFN1cGVydmlzb3J5RnVuY3Rpb24KLWZyb20gY2VydC5iZWhhdmlvciBpbXBvcnQgd2hlbiwgYW55dGhpbmcsIHdhaXRfdW50aWwKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEwyY2FwTWF0Y2hlcnMKLWZyb20gY2VydC5tZXRhZGF0YSBpbXBvcnQgbWV0YWRhdGEKLWZyb20gY2VydC5weV9sMmNhcCBpbXBvcnQgUHlMMmNhcAotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotZnJvbSBsMmNhcC5jbGFzc2ljLmNlcnQuY2VydF9sMmNhcCBpbXBvcnQgQ2VydEwyY2FwCi1mcm9tIGwyY2FwLmNsYXNzaWMuZmFjYWRlX3BiMiBpbXBvcnQgUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUKLWZyb20gbmVpZ2hib3IuZmFjYWRlIGltcG9ydCBmYWNhZGVfcGIyIGFzIG5laWdoYm9yX2ZhY2FkZQotCi0jIEFzc2VtYmxlIGEgc2FtcGxlIHBhY2tldC4KLVNBTVBMRV9QQUNLRVRfREFUQSA9IGIiXHgxOVx4MjZceDA4XHgxNyIKLVNBTVBMRV9QQUNLRVQgPSBSYXdCdWlsZGVyKFt4IGZvciB4IGluIFNBTVBMRV9QQUNLRVRfREFUQV0pCi0KLQotY2xhc3MgR2VuZXJhbEwyY2FwVGVzdEJhc2UoKToKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIHNlbGYuZHV0ID0gZHV0Ci0gICAgICAgIHNlbGYuY2VydCA9IGNlcnQKLQotICAgICAgICBzZWxmLmR1dF9hZGRyZXNzID0gc2VsZi5kdXQuaGNpX2NvbnRyb2xsZXIuR2V0TWFjQWRkcmVzc1NpbXBsZSgpCi0gICAgICAgIGNlcnRfYWRkcmVzcyA9IGNvbW1vbl9wYjIuQmx1ZXRvb3RoQWRkcmVzcygKLSAgICAgICAgICAgIGFkZHJlc3M9c2VsZi5jZXJ0LmNvbnRyb2xsZXJfcmVhZF9vbmx5X3Byb3BlcnR5LlJlYWRMb2NhbEFkZHJlc3MoZW1wdHlfcHJvdG8uRW1wdHkoKSkuYWRkcmVzcykKLQotICAgICAgICBzZWxmLmR1dF9sMmNhcCA9IFB5TDJjYXAoc2VsZi5kdXQsIGNlcnRfYWRkcmVzcykKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwID0gQ2VydEwyY2FwKHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuY2xvc2UoKQotICAgICAgICBzZWxmLmR1dF9sMmNhcC5jbG9zZSgpCi0KLSAgICBkZWYgX3NldHVwX2xpbmtfZnJvbV9jZXJ0KHNlbGYpOgotICAgICAgICBzZWxmLmR1dC5uZWlnaGJvci5FbmFibGVQYWdlU2NhbihuZWlnaGJvcl9mYWNhZGUuRW5hYmxlTXNnKGVuYWJsZWQ9VHJ1ZSkpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5jb25uZWN0X2FjbChzZWxmLmR1dF9hZGRyZXNzKQotCi0gICAgZGVmIF9vcGVuX3VuY29uZmlndXJlZF9jaGFubmVsX2Zyb21fY2VydChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsX2lkPTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lkPTB4MDEwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbT0weDMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5CQVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjcz1Ob25lKToKLQotICAgICAgICBkdXRfY2hhbm5lbCA9IHNlbGYuZHV0X2wyY2FwLnJlZ2lzdGVyX2R5bmFtaWNfY2hhbm5lbChwc20sIG1vZGUpCi0gICAgICAgIGNlcnRfY2hhbm5lbCA9IHNlbGYuY2VydF9sMmNhcC5vcGVuX2NoYW5uZWwoc2lnbmFsX2lkLCBwc20sIHNjaWQsIGZjcz1mY3MpCi0KLSAgICAgICAgcmV0dXJuIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKQotCi0gICAgZGVmIF9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbF9pZD0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lkPTB4MDEwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNtPTB4MzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuQkFTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjcz1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfY29uZmlnX29wdGlvbnM9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNwX2NvbmZpZ19vcHRpb25zPU5vbmUpOgotICAgICAgICByZXF1ZXN0X21hdGNoZXIgPSBMMmNhcE1hdGNoZXJzLkNvbmZpZ3VyYXRpb25SZXF1ZXN0VmlldyhzY2lkKQotICAgICAgICBpZiByc3BfY29uZmlnX29wdGlvbnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB3aGVuKHNlbGYuY2VydF9sMmNhcCkub25fY29uZmlnX3JlcShyZXF1ZXN0X21hdGNoZXIpLnRoZW4oKS5zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UoCi0gICAgICAgICAgICAgICAgb3B0aW9ucz1yc3BfY29uZmlnX29wdGlvbnMpCi0gICAgICAgIGlmIHJzcF9jb25maWdfb3B0aW9ucyBpcyBOb25lIGFuZCBmY3MgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB3aGVuKHNlbGYuY2VydF9sMmNhcCkub25fY29uZmlnX3JlcShyZXF1ZXN0X21hdGNoZXIpLnRoZW4oKS5zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UoCi0gICAgICAgICAgICAgICAgb3B0aW9ucz1DZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1mY3MpKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fdW5jb25maWd1cmVkX2NoYW5uZWxfZnJvbV9jZXJ0KHNpZ25hbF9pZCwgc2NpZCwgcHNtLCBtb2RlLCBmY3MpCi0gICAgICAgIGlmIHJlcV9jb25maWdfb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmVxX2NvbmZpZ19vcHRpb25zID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bSgKLSAgICAgICAgICAgICAgICBmY3M9ZmNzKSBpZiBtb2RlID09IFJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0gZWxzZSBbXQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2NvbmZpZ3VyZV9yZXF1ZXN0KHJlcV9jb25maWdfb3B0aW9ucykKLQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UoKQotCi0gICAgICAgIHdhaXRfdW50aWwoc2VsZi5jZXJ0X2wyY2FwKS5vbl9jb25maWdfcmVxKHJlcXVlc3RfbWF0Y2hlcikudGltZXMoMSkKLQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbC5pc19jb25maWd1cmVkKCkpLmlzVHJ1ZSgpCi0KLSAgICAgICAgcmV0dXJuIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKQotCi0gICAgZGVmIF9vcGVuX2NoYW5uZWxfZnJvbV9kdXQoc2VsZiwgcHNtPTB4MzMsIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuQkFTSUMpOgotICAgICAgICBkdXRfY2hhbm5lbF9mdXR1cmUgPSBzZWxmLmR1dF9sMmNhcC5jb25uZWN0X2R5bmFtaWNfY2hhbm5lbF90b19jZXJ0KHBzbSwgbW9kZSkKLSAgICAgICAgY2VydF9jaGFubmVsID0gc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9hbmRfcmVzcG9uZF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUocHNtKQotICAgICAgICBkdXRfY2hhbm5lbCA9IGR1dF9jaGFubmVsX2Z1dHVyZS5nZXRfY2hhbm5lbCgpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9jb25maWd1cmF0aW9uX3JlcXVlc3RfYW5kX3Jlc3BvbmQoKQotICAgICAgICBvdXRnb2luZ19jb25maWcgPSBbXQotICAgICAgICBpZiBtb2RlID09IFJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE06Ci0gICAgICAgICAgICBvdXRnb2luZ19jb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY29uZmlndXJlX3JlcXVlc3Qob3V0Z29pbmdfY29uZmlnKQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UoKQotCi0gICAgICAgIHJldHVybiAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkKLQotCi1jbGFzcyBMMmNhcFRlc3RCYXNlKEdlbmVyYWxMMmNhcFRlc3RCYXNlKToKLQotICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZHluYW1pY19jaGFubmVsX2FuZF9zZW5kX2RhdGEoc2VsZik6Ci0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuRGF0YShiJ2FiYycpKQotCi0gICAgZGVmIHRlc3RfcmVjZWl2ZV9wYWNrZXRfZnJvbV91bmtub3duX2NoYW5uZWwoc2VsZik6Ci0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHNjaWQ9MHg0MSwgcHNtPTB4MzMpCi0KLSAgICAgICAgaV9mcmFtZSA9IGwyY2FwX3BhY2tldHMuRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lQnVpbGRlcigKLSAgICAgICAgICAgIDB4OTksIDAsIEZpbmFsLk5PVF9TRVQsIDEsIGwyY2FwX3BhY2tldHMuU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseS5VTlNFR01FTlRFRCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLnNlbmRfYWNsKGlfZnJhbWUpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0c05vbmUoTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT00KSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xKSkKLQotICAgIGRlZiB0ZXN0X29wZW5fdHdvX2NoYW5uZWxzKHNlbGYpOgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydChzaWduYWxfaWQ9MSwgc2NpZD0weDQxLCBwc209MHg0MSkKLSAgICAgICAgc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydChzaWduYWxfaWQ9Miwgc2NpZD0weDQzLCBwc209MHg0MykKLQotICAgIGRlZiB0ZXN0X2Nvbm5lY3RfYW5kX3NlbmRfZGF0YV9lcnRtX25vX3NlZ21lbnRhdGlvbihzZWxmKToKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIGZjcz1GY3NUeXBlLk5PX0ZDUykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJyAqIDM0KQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTAsIHBheWxvYWQ9YidhYmMnICogMzQpKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPTAsIHJlcV9zZXE9MSwgcGF5bG9hZD1TQU1QTEVfUEFDS0VUKQotICAgICAgICAjIHRvZG8gdmVyaWZ5IHJlY2VpdmVkPwotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0VEL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJSZXF1ZXN0IENvbm5lY3Rpb24iKQotICAgIGRlZiB0ZXN0X2Jhc2ljX29wZXJhdGlvbl9yZXF1ZXN0X2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gcmVxdWVzdCB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IGZvcgotICAgICAgICBhbiBMMkNBUCBkYXRhIGNoYW5uZWwgYW5kIGluaXRpYXRlIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fZHV0KCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NFRC9CVi0wMy1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VuZCBkYXRhIikKLSAgICBkZWYgdGVzdF9zZW5kX2RhdGEoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gc2VuZCBEQVRBCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgpCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidoZWxsbycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkRhdGEoYidoZWxsbycpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0VEL0JWLTA0LUMiLCBwdHNfdGVzdF9uYW1lPSJEaXNjb25uZWN0IikKLSAgICBkZWYgdGVzdF9kaXNjb25uZWN0KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIGRpc2Nvbm5lY3QgdGhlIGRhdGEgY2hhbm5lbAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotICAgICAgICBkdXRfY2hhbm5lbC5jbG9zZV9jaGFubmVsKCkKLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9kaXNjb25uZWN0X3JlcXVlc3QoKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0VEL0JWLTA1LUMiLCBwdHNfdGVzdF9uYW1lPSJBY2NlcHQgY29ubmVjdGlvbiIpCi0gICAgZGVmIHRlc3RfYWNjZXB0X2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBBbHNvIHZlcmlmeSB0aGF0IERVVCBjYW4gc2VuZCA0OCBieXRlcyBQRFUgKG1pbmltYWwgTVRVKQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYScgKiA0OCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuRGF0YShiJ2EnICogNDgpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0VEL0JWLTA3LUMiLCBwdHNfdGVzdF9uYW1lPSJBY2NlcHQgRGlzY29ubmVjdCIpCi0gICAgZGVmIHRlc3RfYWNjZXB0X2Rpc2Nvbm5lY3Qoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gcmVzcG9uZCB0byB0aGUgcmVxdWVzdCB0byBkaXNjb25uZWN0IHRoZQotICAgICAgICBkYXRhIGNoYW5uZWwKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLSAgICAgICAgY2VydF9jaGFubmVsLmRpc2Nvbm5lY3RfYW5kX3ZlcmlmeSgpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0NPUy9DRUQvQlYtMDgtQyIsIHB0c190ZXN0X25hbWU9IkRpc2Nvbm5lY3Qgb24gVGltZW91dCIpCi0gICAgZGVmIHRlc3RfZGlzY29ubmVjdF9vbl90aW1lb3V0KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBkaXNjb25uZWN0cyB0aGUgZGF0YSBjaGFubmVsIGFuZCBzaHV0cyBkb3duIHRoaXMKLSAgICAgICAgY2hhbm5lbCBpZiBubyByZXNwb25zZSBvY2N1cnMKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX3VuY29uZmlndXJlZF9jaGFubmVsX2Zyb21fY2VydCgpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpKS5lbWl0c05vbmUoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLkNvbmZpZ3VyYXRpb25SZXNwb25zZSgpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTMpKQotICAgICAgICAjIFRPRE86IFZlcmlmeSB0aGF0IElVVCBzZW5kcyBkaXNjb25uZWN0IHJlcXVlc3QgKG5vdCBtYW5kYXRlZCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NFRC9CVi0wOS1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVjZWl2ZSBNdWx0aS1Db21tYW5kIFBhY2tldCIpCi0gICAgZGVmIHRlc3RfcmVjZWl2ZV9tdWx0aV9jb21tYW5kX3BhY2tldChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byByZWNlaXZlIG1vcmUgdGhhbiBvbmUgc2lnbmFsaW5nIGNvbW1hbmQgaW4gb25lIEwyQ0FQCi0gICAgICAgIHBhY2tldC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBwc20gPSAweDMzCi0gICAgICAgIHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfZHluYW1pY19jaGFubmVsX3RvX2NlcnQocHNtKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAudmVyaWZ5X2FuZF9yZXNwb25kX29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZV9hbmRfc2VuZF9jb25maWdfcmVxKHBzbSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuQ29uZmlndXJhdGlvblJlc3BvbnNlKCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0NPUy9DRUQvQlYtMTEtQyIsIHB0c190ZXN0X25hbWU9IkNvbmZpZ3VyZSBNVFUgc2l6ZSIpCi0gICAgZGVmIHRlc3RfY29uZmlndXJlX210dV9zaXplKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIGNvbmZpZ3VyZSB0aGUgc3VwcG9ydGVkIE1UVSBzaXplCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fdW5jb25maWd1cmVkX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY29uZmlndXJlX3JlcXVlc3QoQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fbXR1X2V4cGxpY2l0KDY3MikpCi0gICAgICAgIGNlcnRfY2hhbm5lbC52ZXJpZnlfY29uZmlndXJhdGlvbl9yZXF1ZXN0X2FuZF9yZXNwb25kKCkKLSAgICAgICAgIyBUT0RPOiBQcm9iYWJseSByZW1vdmUgdmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVxdWVzdF9hbmRfcmVzcG9uZAotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0ZEL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJDb250aW51YXRpb24gRmxhZyIpCi0gICAgZGVmIHRlc3RfY29udGludWF0aW9uX2ZsYWcoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBpcyBhYmxlIHRvIHJlY2VpdmUgY29uZmlndXJhdGlvbiByZXF1ZXN0cyB0aGF0IGhhdmUgdGhlCi0gICAgICAgIGNvbnRpbnVhdGlvbiBmbGFnIHNldAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fdW5jb25maWd1cmVkX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLQotICAgICAgICAjIFNlbmQgY29uZmlndXJhdGlvbiByZXF1ZXN0IHdpdGggQ09OVElOVUUKLSAgICAgICAgbXR1X29wdCA9IGwyY2FwX3BhY2tldHMuTXR1Q29uZmlndXJhdGlvbk9wdGlvbigpCi0gICAgICAgIG10dV9vcHQubXR1ID0gMHgxMjM0Ci0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2NvbmZpZ3VyZV9yZXF1ZXN0KFttdHVfb3B0XSwgMiwgbDJjYXBfcGFja2V0cy5Db250aW51YXRpb24uQ09OVElOVUUpCi0KLSAgICAgICAgZmx1c2hfdGltZW91dF9vcHRpb24gPSBsMmNhcF9wYWNrZXRzLkZsdXNoVGltZW91dENvbmZpZ3VyYXRpb25PcHRpb24oKQotICAgICAgICBmbHVzaF90aW1lb3V0X29wdGlvbi5mbHVzaF90aW1lb3V0ID0gNjU1MzUKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY29uZmlndXJlX3JlcXVlc3QoW2ZsdXNoX3RpbWVvdXRfb3B0aW9uXSwgMywgbDJjYXBfcGFja2V0cy5Db250aW51YXRpb24uRU5EKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoTDJjYXBNYXRjaGVycy5Db25maWd1cmF0aW9uUmVzcG9uc2UoKSwgYXRfbGVhc3RfdGltZXM9MikKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NGRC9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iTmVnb3RpYXRpb24gd2l0aCBSZWplY3QiKQotICAgIGRlZiB0ZXN0X3JldHJ5X2NvbmZpZ19hZnRlcl9yZWplY3Rpb24oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gcGVyZm9ybSBuZWdvdGlhdGlvbiB3aGlsZSB0aGUgTG93ZXIKLSAgICAgICAgVGVzdGVyIHJlamVjdHMgdGhlIHByb3Bvc2VkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHZhbHVlcwotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICBzY2lkID0gMHg0MQotICAgICAgICB3aGVuKHNlbGYuY2VydF9sMmNhcCkub25fY29uZmlnX3JlcSgKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3KHNjaWQpKS50aGVuKCkuc2VuZF9jb25maWd1cmF0aW9uX3Jlc3BvbnNlKAotICAgICAgICAgICAgICAgIHJlc3VsdD1sMmNhcF9wYWNrZXRzLkNvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdC5VTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUywKLSAgICAgICAgICAgICAgICBvcHRpb25zPUNlcnRMMmNhcC5jb25maWdfb3B0aW9uX210dV9leHBsaWNpdCgyMDApKS5zZW5kX2NvbmZpZ3VyYXRpb25fcmVzcG9uc2Uob3B0aW9ucz1bXSkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl91bmNvbmZpZ3VyZWRfY2hhbm5lbF9mcm9tX2NlcnQoc2NpZD1zY2lkKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoTDJjYXBNYXRjaGVycy5Db25maWd1cmF0aW9uUmVxdWVzdCgpLCBhdF9sZWFzdF90aW1lcz0yKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0ZEL0JWLTAzLUMiLCBwdHNfdGVzdF9uYW1lPSJTZW5kIFJlcXVlc3RlZCBPcHRpb25zIikKLSAgICBkZWYgdGVzdF9zZW5kX3JlcXVlc3RlZF9vcHRpb25zKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBjYW4gcmVjZWl2ZSBhIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCB3aXRoIG5vIG9wdGlvbnMKLSAgICAgICAgYW5kIHNlbmQgdGhlIHJlcXVlc3RlZCBvcHRpb25zIHRvIHRoZSBMb3dlciBUZXN0ZXIKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydChzY2lkPTB4NDEsIHBzbT0weDMzKQotCi0gICAgICAgICMgVE9ETyhoc3opIGltcGxlbWVudCBtZSEKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NGRC9CVi0wOC1DIiwgcHRzX3Rlc3RfbmFtZT0iTm9uLWJsb2NraW5nIENvbmZpZyBSZXNwb25zZSIpCi0gICAgZGVmIHRlc3Rfbm9uX2Jsb2NraW5nX2NvbmZpZ19yZXNwb25zZShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgZG9lcyBub3QgYmxvY2sgdHJhbnNtaXR0aW5nIEwyQ0FQX0NvbmZpZ1JzcCB3aGlsZQotICAgICAgICB3YWl0aW5nIGZvciBMMkNBUF9Db25maWdSc3AgZnJvbSB0aGUgTG93ZXIgVGVzdGVyCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl91bmNvbmZpZ3VyZWRfY2hhbm5lbF9mcm9tX2NlcnQoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2NvbmZpZ3VyZV9yZXF1ZXN0KFtdKQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UoKQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVxdWVzdF9hbmRfcmVzcG9uZCgpCi0KLSAgICAgICAgIyBUT0RPKGhzeikgaW1wbGVtZW50IG1lIQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0ZEL0JWLTA5LUMiLCBwdHNfdGVzdF9uYW1lPSJNYW5kYXRvcnkgNDggQnl0ZSBNVFUiKQotICAgIGRlZiB0ZXN0X21hbmRhdG9yeV80OF9ieXRlX210dShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIHN1cHBvcnQgbWFuZGF0b3J5IDQ4IGJ5dGUgTVRVCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwKLSAgICAgICAgIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHJlcV9jb25maWdfb3B0aW9ucz1DZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9tdHVfZXhwbGljaXQoNDgpKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYiJhIiAqIDQ0KQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5EYXRhKGIiYSIgKiA0NCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0NPUy9DRkQvQlYtMTEtQyIsIHB0c190ZXN0X25hbWU9Ik5lZ290aWF0aW9uIG9mIFVuc3VwcG9ydGVkIFBhcmFtZXRlciIpCi0gICAgZGVmIHRlc3RfbmVnb3RpYXRpb25fb2ZfdW5zdXBwb3J0ZWRfcGFyYW1ldGVyKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBjYW4gbmVnb3RpYXRlIHdoZW4gdGhlIExvd2VyIFRlc3RlciBwcm9wb3NlcyBhbiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCi0gICAgICAgIHBhcmFtZXRlciB2YWx1ZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl91bmNvbmZpZ3VyZWRfY2hhbm5lbF9mcm9tX2NlcnQoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2NvbmZpZ3VyZV9yZXF1ZXN0KENlcnRMMmNhcC5jb25maWdfb3B0aW9uX210dV9leHBsaWNpdCgyMCkpCi0gICAgICAgICMgSW52YWxpZCBiZWNhdXNlIG1pbmltdW0gaXMgNDgKLQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UobDJjYXBfcGFja2V0cy5Db25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQuVU5BQ0NFUFRBQkxFX1BBUkFNRVRFUlMpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0NPUy9DRkQvQlYtMTItQyIsIHB0c190ZXN0X25hbWU9IlVua25vd24gT3B0aW9uIFJlc3BvbnNlIikKLSAgICBkZWYgdGVzdF9jb25maWdfdW5rbm93bl9vcHRpb25zX3dpdGhfaGludChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIGdpdmUgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgd2hlbiB0aGUgTG93ZXIKLSAgICAgICAgVGVzdGVyIHByb3Bvc2VzIGFueSBudW1iZXIgb2YgdW5rbm93biBvcHRpb25zIHRoYXQgYXJlIG9wdGlvbmFsCi0gICAgICAgIE5PVEU6IEluIEdEIHN0YWNrLCBFeHRlbmRlZFdpbmRvd1NpemVPcHRpb24gaW4gdW5zdXBwb3J0ZWQKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX3VuY29uZmlndXJlZF9jaGFubmVsX2Zyb21fY2VydCgpCi0KLSAgICAgICAgdW5rbm93bl9vcHRfaGludCA9IGwyY2FwX3BhY2tldHMuRXh0ZW5kZWRXaW5kb3dTaXplT3B0aW9uKCkKLSAgICAgICAgdW5rbm93bl9vcHRfaGludC5tYXhfd2luZG93X3NpemUgPSAyMAotICAgICAgICB1bmtub3duX29wdF9oaW50LmlzX2hpbnQgPSBsMmNhcF9wYWNrZXRzLkNvbmZpZ3VyYXRpb25PcHRpb25Jc0hpbnQuT1BUSU9OX0lTX0FfSElOVAotCi0gICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2NvbmZpZ3VyZV9yZXF1ZXN0KFt1bmtub3duX29wdF9oaW50XSAqIGkpCi0gICAgICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UobDJjYXBfcGFja2V0cy5Db25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQuU1VDQ0VTUykKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NGRC9CVi0xNC1DIiwgcHRzX3Rlc3RfbmFtZT0iVW5rbm93biBNYW5kYXRvcnkgT3B0aW9ucyBSZXF1ZXN0IikKLSAgICBkZWYgdGVzdF91bmtub3duX21hbmRhdG9yeV9vcHRpb25zX3JlcXVlc3Qoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGNhbiBnaXZlIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIHdoZW4gdGhlIExvd2VyCi0gICAgICAgIFRlc3RlciBwcm9wb3NlcyBhbnkgbnVtYmVyIG9mIHVua25vd24gb3B0aW9ucyB3aGVyZSBhdCBsZWFzdCBvbmUgaXMKLSAgICAgICAgbWFuZGF0b3J5LgotICAgICAgICBOb3RlOiBHRCBzdGFjayBkb2Vzbid0IHN1cHBvcnQgZXh0ZW5kZWQgd2luZG93IHNpemUuIEZvciBvdGhlciBzdGFja3MsCi0gICAgICAgICAgICAgIHdlIG1heSBuZWVkIHRvIHVzZSBzb21lIG90aGVyIGNvbmZpZyBvcHRpb24KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX3VuY29uZmlndXJlZF9jaGFubmVsX2Zyb21fY2VydChzY2lkPTB4NDEsIHBzbT0weDMzKQotCi0gICAgICAgIHVua25vd25fb3B0ID0gbDJjYXBfcGFja2V0cy5FeHRlbmRlZFdpbmRvd1NpemVPcHRpb24oKQotICAgICAgICB1bmtub3duX29wdC5tYXhfd2luZG93X3NpemUgPSAyMAotCi0gICAgICAgIHVua25vd25fb3B0X2hpbnQgPSBsMmNhcF9wYWNrZXRzLkV4dGVuZGVkV2luZG93U2l6ZU9wdGlvbigpCi0gICAgICAgIHVua25vd25fb3B0X2hpbnQubWF4X3dpbmRvd19zaXplID0gMjAKLSAgICAgICAgdW5rbm93bl9vcHRfaGludC5pc19oaW50ID0gbDJjYXBfcGFja2V0cy5Db25maWd1cmF0aW9uT3B0aW9uSXNIaW50Lk9QVElPTl9JU19BX0hJTlQKLQotICAgICAgICBjb25maWd1cmF0aW9uX29wdGlvbl9hdHRlbXB0cyA9IFtbdW5rbm93bl9vcHRdLCBbdW5rbm93bl9vcHQsIHVua25vd25fb3B0X2hpbnRdLCBbCi0gICAgICAgICAgICB1bmtub3duX29wdCwgdW5rbm93bl9vcHQsIHVua25vd25fb3B0Ci0gICAgICAgIF0sIFt1bmtub3duX29wdCwgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHRfaGludCwKLSAgICAgICAgICAgIHVua25vd25fb3B0XSwgW3Vua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0XSwgWwotICAgICAgICAgICAgICAgIHVua25vd25fb3B0LCB1bmtub3duX29wdF9oaW50LCB1bmtub3duX29wdF9oaW50LCB1bmtub3duX29wdCwgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHRfaGludAotICAgICAgICAgICAgXSwgW3Vua25vd25fb3B0LCB1bmtub3duX29wdCwgdW5rbm93bl9vcHQsIHVua25vd25fb3B0LCB1bmtub3duX29wdCwgdW5rbm93bl9vcHQsIHVua25vd25fb3B0XSwgWwotICAgICAgICAgICAgICAgIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsCi0gICAgICAgICAgICAgICAgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHQKLSAgICAgICAgICAgIF0sIFsKLSAgICAgICAgICAgICAgICB1bmtub3duX29wdF9oaW50LCB1bmtub3duX29wdF9oaW50LCB1bmtub3duX29wdF9oaW50LCB1bmtub3duX29wdF9oaW50LCB1bmtub3duX29wdF9oaW50LAotICAgICAgICAgICAgICAgIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0LCB1bmtub3duX29wdAotICAgICAgICAgICAgXSwgWwotICAgICAgICAgICAgICAgIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsIHVua25vd25fb3B0X2hpbnQsCi0gICAgICAgICAgICAgICAgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHRfaGludCwgdW5rbm93bl9vcHQKLSAgICAgICAgICAgIF1dCi0KLSAgICAgICAgZm9yIG9wdGlvbl9saXN0IGluIGNvbmZpZ3VyYXRpb25fb3B0aW9uX2F0dGVtcHRzOgotICAgICAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY29uZmlndXJlX3JlcXVlc3Qob3B0aW9uX2xpc3QpCi0gICAgICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2NvbmZpZ3VyYXRpb25fcmVzcG9uc2UobDJjYXBfcGFja2V0cy5Db25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQuVU5LTk9XTl9PUFRJT05TKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvRUNIL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJSZXNwb25kIHRvIEVjaG8gUmVxdWVzdCIpCi0gICAgZGVmIHRlc3RfcmVzcG9uZF90b19lY2hvX3JlcXVlc3Qoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHJlc3BvbmRzIHRvIGFuIGVjaG8gcmVxdWVzdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgZWNob19yZXF1ZXN0ID0gbDJjYXBfcGFja2V0cy5FY2hvUmVxdWVzdEJ1aWxkZXIoMTAwLCBSYXdCdWlsZGVyKFsxLCAyLCAzXSkpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkuc2VuZChlY2hvX3JlcXVlc3QpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkVjaG9SZXNwb25zZSgpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0VEL0JJLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJSZWplY3QgVW5rbm93biBDb21tYW5kIikKLSAgICBkZWYgdGVzdF9yZWplY3RfdW5rbm93bl9jb21tYW5kKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCByZWplY3RzIGFuIHVua25vd24gc2lnbmFsaW5nIGNvbW1hbmQKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAjIENvbW1hbmQgY29kZSBmZiwgU2lnbmFsIGlkIDAxLCBzaXplIDAwMDAKLSAgICAgICAgaW52YWxpZF9jb21tYW5kX3BhY2tldCA9IFJhd0J1aWxkZXIoWzB4ZmYsIDB4MDEsIDB4MDAsIDB4MDBdKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpLnNlbmQoaW52YWxpZF9jb21tYW5kX3BhY2tldCkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuQ29tbWFuZFJlamVjdCgpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvSUVYL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJRdWVyeSBmb3IgMS4yIEZlYXR1cmVzIikKLSAgICBkZWYgdGVzdF9xdWVyeV9mb3JfMV8yX2ZlYXR1cmVzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCB0cmFuc21pdHMgYW4gaW5mb3JtYXRpb24gcmVxdWVzdCBjb21tYW5kIHRvIHNvbGljaXQKLSAgICAgICAgaWYgdGhlIHJlbW90ZSBkZXZpY2Ugc3VwcG9ydHMgU3BlY2lmaWNhdGlvbiAxLjIgZmVhdHVyZXMuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLkluZm9ybWF0aW9uUmVxdWVzdFdpdGhUeXBlKAotICAgICAgICAgICAgICAgIGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUuRVhURU5ERURfRkVBVFVSRVNfU1VQUE9SVEVEKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0lFWC9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVzcG9uZCB3aXRoIDEuMiBGZWF0dXJlcyIpCi0gICAgZGVmIHRlc3RfcmVzcG9uZF93aXRoXzFfMl9mZWF0dXJlcyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgcmVzcG9uZHMgdG8gYW4gaW5mb3JtYXRpb24gcmVxdWVzdCBjb21tYW5kCi0gICAgICAgIHNvbGljaXRpbmcgZm9yIFNwZWNpZmljYXRpb24gMS4yIGZlYXR1cmVzCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIGNvbnRyb2xfY2hhbm5lbCA9IHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkKLQotICAgICAgICBjb250cm9sX2NoYW5uZWwuc2VuZF9leHRlbmRlZF9mZWF0dXJlc19yZXF1ZXN0KCkKLQotICAgICAgICBhc3NlcnRUaGF0KGNvbnRyb2xfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JbmZvcm1hdGlvblJlc3BvbnNlRXh0ZW5kZWRGZWF0dXJlcygpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvRVhGL0JWLTAxLUMiLAotICAgICAgICBwdHNfdGVzdF9uYW1lPSJFeHRlbmRlZCBGZWF0dXJlcyBJbmZvcm1hdGlvbiBSZXNwb25zZSBmb3IgIgotICAgICAgICAiRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gTW9kZSIpCi0gICAgZGVmIHRlc3RfZXh0ZW5kZWRfZmVhdHVyZV9pbmZvX3Jlc3BvbnNlX2VydG0oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gZm9ybWF0IGFuIEluZm9ybWF0aW9uIFJlc3BvbnNlIGZvciB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgdHlwZSBvZiBFeHRlbmRlZCBGZWF0dXJlcyB0aGF0IGNvcnJlY3RseSBpZGVudGlmaWVzIHRoYXQgRW5oYW5jZWQKLSAgICAgICAgUmV0cmFuc21pc3Npb24gTW9kZSBpcyBsb2NhbGx5IHN1cHBvcnRlZAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICBjb250cm9sX2NoYW5uZWwgPSBzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpCi0KLSAgICAgICAgY29udHJvbF9jaGFubmVsLnNlbmRfZXh0ZW5kZWRfZmVhdHVyZXNfcmVxdWVzdCgpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChjb250cm9sX2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSW5mb3JtYXRpb25SZXNwb25zZUV4dGVuZGVkRmVhdHVyZXMoc3VwcG9ydHNfZXJ0bT1UcnVlKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IkwyQ0FQL0VYRi9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iRXh0ZW5kZWQgRmVhdHVyZXMgSW5mb3JtYXRpb24gUmVzcG9uc2UgZm9yICIKLSAgICAgICAgIlN0cmVhbWluZyBNb2RlIikKLSAgICBkZWYgdGVzdF9leHRlbmRlZF9mZWF0dXJlX2luZm9fcmVzcG9uc2Vfc3RyZWFtaW5nKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIGZvcm1hdCBhbiBJbmZvcm1hdGlvbiBSZXNwb25zZSBmb3IgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgIHR5cGUgb2YgRXh0ZW5kZWQgRmVhdHVyZXMgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGF0IFN0cmVhbWluZyBNb2RlCi0gICAgICAgIGlzIGxvY2FsbHkgc3VwcG9ydGVkCi0gICAgICAgICIiIgotICAgICAgICBhc3NlcnRzLnNraXAoIlN0cmVhbWluZyBub3Qgc3VwcG9ydGVkIikKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICBjb250cm9sX2NoYW5uZWwgPSBzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpCi0KLSAgICAgICAgY29udHJvbF9jaGFubmVsLnNlbmRfZXh0ZW5kZWRfZmVhdHVyZXNfcmVxdWVzdCgpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChjb250cm9sX2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSW5mb3JtYXRpb25SZXNwb25zZUV4dGVuZGVkRmVhdHVyZXMoc3VwcG9ydHNfc3RyZWFtaW5nPVRydWUpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9FWEYvQlYtMDMtQyIsIHB0c190ZXN0X25hbWU9IkV4dGVuZGVkIEZlYXR1cmVzIEluZm9ybWF0aW9uIFJlc3BvbnNlIGZvciBGQ1MgIiAiT3B0aW9uIikKLSAgICBkZWYgdGVzdF9leHRlbmRlZF9mZWF0dXJlX2luZm9fcmVzcG9uc2VfZmNzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIGZvcm1hdCBhbiBJbmZvcm1hdGlvbiBSZXNwb25zZSBmb3IgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgIHR5cGUgb2YgRXh0ZW5kZWQgRmVhdHVyZXMgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGF0IHRoZSBGQ1MgT3B0aW9uCi0gICAgICAgIGlzIGxvY2FsbHkgc3VwcG9ydGVkLgotCi0gICAgICAgIE5vdGU6IFRoaXMgaXMgbm90IG1hbmRhdGVkIGJ5IEwyQ0FQIFNwZWMKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgY29udHJvbF9jaGFubmVsID0gc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKQotCi0gICAgICAgIGNvbnRyb2xfY2hhbm5lbC5zZW5kX2V4dGVuZGVkX2ZlYXR1cmVzX3JlcXVlc3QoKQotCi0gICAgICAgIGFzc2VydFRoYXQoY29udHJvbF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkluZm9ybWF0aW9uUmVzcG9uc2VFeHRlbmRlZEZlYXR1cmVzKHN1cHBvcnRzX2Zjcz1UcnVlKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IkwyQ0FQL0VYRi9CVi0wNS1DIiwgcHRzX3Rlc3RfbmFtZT0iRXh0ZW5kZWQgRmVhdHVyZXMgSW5mb3JtYXRpb24gUmVzcG9uc2UgZm9yIEZpeGVkICIKLSAgICAgICAgIkNoYW5uZWxzIikKLSAgICBkZWYgdGVzdF9leHRlbmRlZF9mZWF0dXJlX2luZm9fcmVzcG9uc2VfZml4ZWRfY2hhbm5lbHMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gZm9ybWF0IGFuIEluZm9ybWF0aW9uIFJlc3BvbnNlIGZvciB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgdHlwZSBvZiBFeHRlbmRlZCBGZWF0dXJlcyB0aGF0IGNvcnJlY3RseSBpZGVudGlmaWVzIHRoYXQgdGhlIEZpeGVkCi0gICAgICAgIENoYW5uZWxzIG9wdGlvbiBpcyBsb2NhbGx5IHN1cHBvcnRlZAotCi0gICAgICAgIE5vdGU6IFRoaXMgaXMgbm90IG1hbmRhdGVkIGJ5IEwyQ0FQIFNwZWMKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgY29udHJvbF9jaGFubmVsID0gc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKQotCi0gICAgICAgIGNvbnRyb2xfY2hhbm5lbC5zZW5kX2V4dGVuZGVkX2ZlYXR1cmVzX3JlcXVlc3QoKQotCi0gICAgICAgIGFzc2VydFRoYXQoY29udHJvbF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSW5mb3JtYXRpb25SZXNwb25zZUV4dGVuZGVkRmVhdHVyZXMoc3VwcG9ydHNfZml4ZWRfY2hhbm5lbHM9VHJ1ZSkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0ZJWC9CVi0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iRml4ZWQgQ2hhbm5lbHMgU3VwcG9ydGVkIEluZm9ybWF0aW9uIFJlcXVlc3QiKQotICAgIGRlZiB0ZXN0X2ZpeGVkX2NoYW5uZWxzX3N1cHBvcnRlZF9pbmZvcm1hdGlvbl9yZXF1ZXN0KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBjYW4gc2VuZCBhbiBJbmZvcm1hdGlvbiBSZXF1ZXN0IGZvciB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgdHlwZSBvZiBGaXhlZCBDaGFubmVscyBTdXBwb3J0ZWQuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLkluZm9ybWF0aW9uUmVxdWVzdFdpdGhUeXBlKGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUuRklYRURfQ0hBTk5FTFNfU1VQUE9SVEVEKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRk9DL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJJVVQgSW5pdGlhdGVkIENvbmZpZ3VyYXRpb24gb2YgdGhlIEZDUyBPcHRpb24iKQotICAgIGRlZiB0ZXN0X2NvbmZpZ19jaGFubmVsX25vdF91c2VfRkNTKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIGNvbmZpZ3VyZSBhIGNoYW5uZWwgdG8gbm90IHVzZSBGQ1MgaW4gSS9TLWZyYW1lcy4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCBmY3M9RmNzVHlwZS5OT19GQ1MpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9MCwgcGF5bG9hZD1iJ2FiYycpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9GT0MvQlYtMDItQyIsIHB0c190ZXN0X25hbWU9Ikxvd2VyIFRlc3RlciBFeHBsaWNpdGx5IFJlcXVlc3RzIEZDUyBzaG91bGQgYmUgIiAiVXNlZCIpCi0gICAgZGVmIHRlc3RfZXhwbGljaXRseV9yZXF1ZXN0X3VzZV9GQ1Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIGluY2x1ZGUgdGhlIEZDUyBpbiBJL1MtZnJhbWVzIGlmIHRoZSBMb3dlciBUZXN0ZXIKLSAgICAgICAgZXhwbGljaXRseSByZXF1ZXN0cyB0aGF0IEZDUyBzaG91bGQgYmUgdXNlZAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIGZjcz1GY3NUeXBlLkRFRkFVTFQpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZVdpdGhGY3MocGF5bG9hZD1iImFiYyIpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9GT0MvQlYtMDMtQyIsIHB0c190ZXN0X25hbWU9Ikxvd2VyIFRlc3RlciBJbXBsaWNpdGx5IFJlcXVlc3RzIEZDUyBzaG91bGQgYmUgIiAiVXNlZCIpCi0gICAgZGVmIHRlc3RfaW1wbGljaXRseV9yZXF1ZXN0X3VzZV9GQ1Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIGluY2x1ZGUgdGhlIEZDUyBpbiBJL1MtZnJhbWVzIGlmIHRoZSBMb3dlciBUZXN0ZXIKLSAgICAgICAgaW1wbGljaXRseSByZXF1ZXN0cyB0aGF0IEZDUyBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLAotICAgICAgICAgICAgZmNzPUZjc1R5cGUuREVGQVVMVCwKLSAgICAgICAgICAgIHJlcV9jb25maWdfb3B0aW9ucz1DZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUykpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZVdpdGhGY3MocGF5bG9hZD1iImFiYyIpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9PRlMvQlYtMDEtQyIsIHB0c190ZXN0X25hbWU9IlNlbmRpbmcgSS1GcmFtZXMgd2l0aG91dCBGQ1MgZm9yIEVSVE0iKQotICAgIGRlZiB0ZXN0X3NlbmRpbmdfaV9mcmFtZXNfd2l0aG91dF9mY3NfZm9yX2VydG0oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBGQ1MgaW4gSS1mcmFtZXMuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgZmNzPUZjc1R5cGUuTk9fRkNTKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTAsIHBheWxvYWQ9YiJhYmMiKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvT0ZTL0JWLTAyLUMiLCBwdHNfdGVzdF9uYW1lPSJSZWNlaXZpbmcgSS1GcmFtZXMgd2l0aG91dCBGQ1MgZm9yIEVSVE0iKQotICAgIGRlZiB0ZXN0X3JlY2VpdmluZ19pX2ZyYW1lc193aXRob3V0X2Zjc19mb3JfZXJ0bShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIGNhbiBoYW5kbGUgSS1mcmFtZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgRkNTLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIGZjcz1GY3NUeXBlLk5PX0ZDUykKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0wLCByZXFfc2VxPTAsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkUmF3RGF0YShTQU1QTEVfUEFDS0VUX0RBVEEpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9PRlMvQlYtMDUtQyIsIHB0c190ZXN0X25hbWU9IlNlbmRpbmcgSS1GcmFtZXMgd2l0aCBGQ1MgZm9yIEVSVE0iKQotICAgIGRlZiB0ZXN0X3NlbmRpbmdfaV9mcmFtZXNfd2l0aF9mY3NfZm9yX2VydG0oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBkb2VzIGluY2x1ZGUgdGhlIEZDUyBpbiBJLWZyYW1lcy4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCBmY3M9RmNzVHlwZS5ERUZBVUxUKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWVXaXRoRmNzKHR4X3NlcT0wLCBwYXlsb2FkPWIiYWJjIikpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL09GUy9CVi0wNi1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVjZWl2aW5nIEktRnJhbWVzIHdpdGggRkNTIGZvciBFUlRNIikKLSAgICBkZWYgdGVzdF9yZWNlaXZpbmdfaV9mcmFtZXNfd2l0aF9mY3NfZm9yX2VydG0oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gaGFuZGxlIEktZnJhbWVzIHRoYXQgZG8gY29udGFpbiB0aGUgRkNTLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIGZjcz1GY3NUeXBlLkRFRkFVTFQpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9MCwgcmVxX3NlcT0wLCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQsIGZjcz1GY3NUeXBlLkRFRkFVTFQpCi0gICAgICAgIGFzc2VydFRoYXQoZHV0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFJhd0RhdGEoU0FNUExFX1BBQ0tFVF9EQVRBKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJUcmFuc21pdCBJLWZyYW1lcyIpCi0gICAgZGVmIHRlc3RfdHJhbnNtaXRfaV9mcmFtZXMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gc2VuZCBjb3JyZWN0bHkgZm9ybWF0dGVkIHNlcXVlbnRpYWwgSS1mcmFtZXMgd2l0aAotICAgICAgICB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmhhbmNlZCBjb250cm9sIGZpZWxkcyAoU0FSLCBGLWJpdCwgUmVxU2VxLAotICAgICAgICBUeFNlcSkKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCBmY3M9RmNzVHlwZS5OT19GQ1MpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9MCwgcGF5bG9hZD1iImFiYyIpKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPTAsIHJlcV9zZXE9MSwgcGF5bG9hZD1TQU1QTEVfUEFDS0VUKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YiJhYmMiKSkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0xLCByZXFfc2VxPTIsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuUGFydGlhbERhdGEoYiJhYmMiKSkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0yLCByZXFfc2VxPTMsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTAyLUMiLCBwdHNfdGVzdF9uYW1lPSJSZWNlaXZlIEktRnJhbWVzIikKLSAgICBkZWYgdGVzdF9yZWNlaXZlX2lfZnJhbWVzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIHJlY2VpdmUgaW4tc2VxdWVuY2UgdmFsaWQgSS1mcmFtZXMgYW5kIGRlbGl2ZXIgTDJDQVAKLSAgICAgICAgU0RVcyB0byB0aGUgVXBwZXIgVGVzdGVyCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgZmNzPUZjc1R5cGUuTk9fRkNTKQotCi0gICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgotICAgICAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9aSwgcmVxX3NlcT0wLCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQpCi0gICAgICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT1pICsgMSkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9MywgcmVxX3NlcT0wLCBzYXI9U2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseS5TVEFSVCwgcGF5bG9hZD1TQU1QTEVfUEFDS0VUKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT00KSkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKAotICAgICAgICAgICAgdHhfc2VxPTQsIHJlcV9zZXE9MCwgc2FyPVNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHkuQ09OVElOVUFUSU9OLCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlNGcmFtZShyZXFfc2VxPTUpKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPTUsIHJlcV9zZXE9MCwgc2FyPVNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHkuRU5ELCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlNGcmFtZShyZXFfc2VxPTYpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9FUk0vQlYtMDMtQyIsIHB0c190ZXN0X25hbWU9IkFja25vd2xlZGdpbmcgUmVjZWl2ZWQgSS1GcmFtZXMiKQotICAgIGRlZiB0ZXN0X2Fja25vd2xlZGdpbmdfcmVjZWl2ZWRfaV9mcmFtZXMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBzZW5kcyBTLWZyYW1lIFtSUl0gd2l0aCB0aGUgUG9sbCBiaXQgbm90IHNldCB0bwotICAgICAgICBhY2tub3dsZWRnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIExvd2VyIFRlc3RlcgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIGZjcz1GY3NUeXBlLk5PX0ZDUykKLQotICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPWksIHJlcV9zZXE9MCwgcGF5bG9hZD1TQU1QTEVfUEFDS0VUKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuU0ZyYW1lKHJlcV9zZXE9aSArIDEpKQotCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0c05vbmUoTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT00KSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0wNS1DIiwKLSAgICAgICAgcHRzX3Rlc3RfbmFtZT0iUmVzdW1lIFRyYW5zbWl0dGluZyBJLUZyYW1lcyB3aGVuIGFuIFMtRnJhbWUgW1JSXSAiCi0gICAgICAgICJpcyBSZWNlaXZlZCIpCi0gICAgZGVmIHRlc3RfcmVzdW1lX3RyYW5zbWl0dGluZ193aGVuX3JlY2VpdmVkX3JyKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgd2lsbCBjZWFzZSB0cmFuc21pc3Npb24gb2YgSS1mcmFtZXMgd2hlbiB0aGUgbmVnb3RpYXRlZAotICAgICAgICBUeFdpbmRvdyBpcyBmdWxsLiBWZXJpZnkgdGhlIElVVCB3aWxsIHJlc3VtZSB0cmFuc21pc3Npb24gb2YgSS1mcmFtZXMKLSAgICAgICAgd2hlbiBhbiBTLWZyYW1lIFtSUl0gaXMgcmVjZWl2ZWQgdGhhdCBhY2tub3dsZWRnZXMgcHJldmlvdXNseSBzZW50Ci0gICAgICAgIEktZnJhbWVzCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIHR4X3dpbmRvd19zaXplPTEpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2RlZicpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0wLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0c05vbmUoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YidkZWYnKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0zKSkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9zX2ZyYW1lKHJlcV9zZXE9MSwgZj1GaW5hbC5QT0xMX1JFU1BPTlNFKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTA2LUMiLCBwdHNfdGVzdF9uYW1lPSJSZXN1bWUgVHJhbnNtaXR0aW5nIEktRnJhbWVzIHdoZW4gYW4gSS1GcmFtZSBpcyAiCi0gICAgICAgICJSZWNlaXZlZCIpCi0gICAgZGVmIHRlc3RfcmVzdW1lX3RyYW5zbWl0dGluZ193aGVuX2Fja25vd2xlZGdlX3ByZXZpb3VzbHlfc2VudChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHdpbGwgY2Vhc2UgdHJhbnNtaXNzaW9uIG9mIEktZnJhbWVzIHdoZW4gdGhlIG5lZ290aWF0ZWQKLSAgICAgICAgVHhXaW5kb3cgaXMgZnVsbC4gVmVyaWZ5IHRoZSBJVVQgd2lsbCByZXN1bWUgdHJhbnNtaXNzaW9uIG9mIEktZnJhbWVzCi0gICAgICAgIHdoZW4gYW4gSS1mcmFtZSBpcyByZWNlaXZlZCB0aGF0IGFja25vd2xlZGdlcyBwcmV2aW91c2x5IHNlbnQgSS1mcmFtZXMKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgdHhfd2luZG93X3NpemU9MSkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLCByc3BfY29uZmlnX29wdGlvbnM9Y29uZmlnKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInZGVmJykKLQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTAsIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzTm9uZSgKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0xLCBwYXlsb2FkPWInYWJjJyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MC41KSkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0wLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YidkZWYnKSkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0xLCByZXFfc2VxPTIsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTA3LUMiLCBwdHNfdGVzdF9uYW1lPSJTZW5kIFMtRnJhbWUgW1JOUl0iKQotICAgIGRlZiB0ZXN0X3NlbmRfc19mcmFtZV9ybnIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBzZW5kcyBhbiBTLWZyYW1lIFtSTlJdIHdoZW4gaXQgZGV0ZWN0cyBsb2NhbCBidXN5IGNvbmRpdGlvbgotICAgICAgICBOT1RFOiBJbiBHRCBzdGFjaywgd2UgZW50ZXIgbG9jYWwgYnVzeSBjb25kaXRpb24gaWYgY2xpZW50IGRvZXNuJ3QgZGVxdWV1ZQotICAgICAgICBhbmQgcGFja2V0cyBhcmUgYWNjdW11bGF0aW5nIGluIGJ1ZmZlcgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIGNvbmZpZyA9IENlcnRMMmNhcC5jb25maWdfb3B0aW9uX2VydG0oZmNzPUZjc1R5cGUuTk9fRkNTLCB0eF93aW5kb3dfc2l6ZT0xMCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLAotICAgICAgICAgICAgZmNzPUZjc1R5cGUuTk9fRkNTLAotICAgICAgICAgICAgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywKLSAgICAgICAgICAgIHJzcF9jb25maWdfb3B0aW9ucz1jb25maWcpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9MCwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0wLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZXRfdHJhZmZpY19wYXVzZWQoVHJ1ZSkKLQotICAgICAgICAjIEFsbG93IDEgYWRkaXRpb25hbCBwYWNrZXQgaW4gY2hhbm5lbCBxdWV1ZSBidWZmZXIKLSAgICAgICAgYnVmZmVyX3NpemUgPSBzZWxmLmR1dF9sMmNhcC5nZXRfY2hhbm5lbF9xdWV1ZV9idWZmZXJfc2l6ZSgpICsgMQotCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGJ1ZmZlcl9zaXplKToKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPWkgKyAxLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlNGcmFtZShzPWwyY2FwX3BhY2tldHMuU3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUNFSVZFUl9SRUFEWSkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9YnVmZmVyX3NpemUgKyAxLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuU0ZyYW1lKHM9bDJjYXBfcGFja2V0cy5TdXBlcnZpc29yeUZ1bmN0aW9uLlJFQ0VJVkVSX05PVF9SRUFEWSkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0wOC1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VuZCBTLUZyYW1lIFtSUl0gd2l0aCBQb2xsIEJpdCBTZXQiKQotICAgIGRlZiB0ZXN0X3RyYW5zbWl0X3NfZnJhbWVfcnJfd2l0aF9wb2xsX2JpdF9zZXQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBzZW5kcyBhbiBTLWZyYW1lIFtSUl0gd2l0aCB0aGUgUG9sbCBiaXQgc2V0IHdoZW4gaXRzCi0gICAgICAgIHJldHJhbnNtaXNzaW9uIHRpbWVyIGV4cGlyZXMuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIHJldHJhbnNtaXNzaW9uX3RpbWVfb3V0PTE1MDApCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwKLSAgICAgICAgICAgIGZjcz1GY3NUeXBlLk5PX0ZDUywKLSAgICAgICAgICAgIHJlcV9jb25maWdfb3B0aW9ucz1jb25maWcsCi0gICAgICAgICAgICByc3BfY29uZmlnX29wdGlvbnM9Y29uZmlnKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocD1sMmNhcF9wYWNrZXRzLlBvbGwuUE9MTCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0wOS1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VuZCBTLUZyYW1lIFtSUl0gd2l0aCBGaW5hbCBCaXQgU2V0IikKLSAgICBkZWYgdGVzdF90cmFuc21pdF9zX2ZyYW1lX3JyX3dpdGhfZmluYWxfYml0X3NldChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHJlc3BvbmRzIHdpdGggYW4gUy1mcmFtZSBbUlJdIHdpdGggdGhlIEZpbmFsIGJpdCBzZXQKLSAgICAgICAgYWZ0ZXIgcmVjZWl2aW5nIGFuIFMtZnJhbWUgW1JSXSB3aXRoIHRoZSBQb2xsIGJpdCBzZXQKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCBmY3M9RmNzVHlwZS5OT19GQ1MpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfc19mcmFtZShyZXFfc2VxPTAsIHA9UG9sbC5QT0xMKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUoZj1GaW5hbC5QT0xMX1JFU1BPTlNFKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTEwLUMiLCBwdHNfdGVzdF9uYW1lPSJSZXRyYW5zbWl0IFMtRnJhbWUgW1JSXSB3aXRoIEZpbmFsIEJpdCBTZXQiKQotICAgIGRlZiB0ZXN0X3JldHJhbnNtaXRfc19mcmFtZV9ycl93aXRoX3BvbGxfYml0X3NldChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHdpbGwgcmV0cmFuc21pdCB0aGUgUy1mcmFtZSBbUlJdIHdpdGggdGhlIFBvbGwgYml0IHNldAotICAgICAgICB3aGVuIHRoZSBNb25pdG9yIFRpbWVyIGV4cGlyZXMKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCBmY3M9RmNzVHlwZS5OT19GQ1MpCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9MCwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT0wLCBwPVBvbGwuUE9MTCwgZj1GaW5hbC5OT1RfU0VUKSkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfc19mcmFtZShyZXFfc2VxPTEsIGY9RmluYWwuUE9MTF9SRVNQT05TRSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTExLUMiLCBwdHNfdGVzdF9uYW1lPSJTLUZyYW1lIFRyYW5zbWlzc2lvbnMgRXhjZWVkIE1heFRyYW5zbWl0IikKLSAgICBkZWYgdGVzdF9zX2ZyYW1lX3RyYW5zbWlzc2lvbnNfZXhjZWVkX21heF90cmFuc21pdChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHdpbGwgY2xvc2UgdGhlIGNoYW5uZWwgd2hlbiB0aGUgTW9uaXRvciBUaW1lciBleHBpcmVzLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIGNvbmZpZyA9IENlcnRMMmNhcC5jb25maWdfb3B0aW9uX2VydG0oZmNzPUZjc1R5cGUuTk9fRkNTLCB0eF93aW5kb3dfc2l6ZT0xLCBtYXhfdHJhbnNtaXQ9MSwgbW9uaXRvcl90aW1lX291dD0xMCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLCByc3BfY29uZmlnX29wdGlvbnM9Y29uZmlnKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2Rpc2Nvbm5lY3RfcmVxdWVzdCgpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0xMi1DIiwgcHRzX3Rlc3RfbmFtZT0iSS1GcmFtZSBUcmFuc21pc3Npb25zIEV4Y2VlZCBNYXhUcmFuc21pdCIpCi0gICAgZGVmIHRlc3RfaV9mcmFtZV90cmFuc21pc3Npb25zX2V4Y2VlZF9tYXhfdHJhbnNtaXQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIGNsb3NlIHRoZSBjaGFubmVsIHdoZW4gaXQgcmVjZWl2ZXMgYW4gUy1mcmFtZSBbUlJdCi0gICAgICAgIHdpdGggdGhlIGZpbmFsIGJpdCBzZXQgdGhhdCBkb2VzIG5vdCBhY2tub3dsZWRnZSB0aGUgcHJldmlvdXMgSS1mcmFtZQotICAgICAgICBzZW50IGJ5IHRoZSBJVVQKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgdHhfd2luZG93X3NpemU9MSwgbWF4X3RyYW5zbWl0PTEpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0wKSwgTDJjYXBNYXRjaGVycy5TRnJhbWUocD1Qb2xsLlBPTEwpKS5pbk9yZGVyKCkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9zX2ZyYW1lKHJlcV9zZXE9MCwgZj1GaW5hbC5QT0xMX1JFU1BPTlNFKQotICAgICAgICBjZXJ0X2NoYW5uZWwudmVyaWZ5X2Rpc2Nvbm5lY3RfcmVxdWVzdCgpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0xMy1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVzcG9uZCB0byBTLUZyYW1lIFtSRUpdIikKLSAgICBkZWYgdGVzdF9yZXNwb25kX3RvX3JlaihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHJldHJhbnNtaXRzIEktZnJhbWVzIHN0YXJ0aW5nIGZyb20gdGhlIHNlcXVlbmNlIG51bWJlcgotICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIFMtZnJhbWUgW1JFSl0KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgdHhfd2luZG93X3NpemU9MiwgbWF4X3RyYW5zbWl0PTIpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0wLCBwYXlsb2FkPWInYWJjJyksIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0xLCBwYXlsb2FkPWInYWJjJykpLmluT3JkZXIoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0wLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uUkVKRUNUKQotCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0wLCBwYXlsb2FkPWInYWJjJyksIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0xLCBwYXlsb2FkPWInYWJjJykpLmluT3JkZXIoKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9FUk0vQlYtMTQtQyIsIHB0c190ZXN0X25hbWU9IlJlc3BvbmQgdG8gUy1GcmFtZSBbU1JFSl0gUE9MTCBCaXQgU2V0IikKLSAgICBkZWYgdGVzdF9yZXNwb25kX3RvX3NyZWpfcF9zZXQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCByZXNwb25kcyB3aXRoIHRoZSBjb3JyZWN0IEktZnJhbWUgd2hlbiBzZW50IGFuIFNSRUoKLSAgICAgICAgZnJhbWUuIFZlcmlmeSB0aGF0IHRoZSBJVVQgcHJvY2Vzc2VzIHRoZSBhY2tub3dsZWRnbWVudCBvZiBwcmV2aW91c2x5Ci0gICAgICAgIHVuYWNrbm93bGVkZ2VkIEktZnJhbWVzCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIG1heF90cmFuc21pdD0yLCB0eF93aW5kb3dfc2l6ZT0zKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIHJlcV9jb25maWdfb3B0aW9ucz1jb25maWcsIHJzcF9jb25maWdfb3B0aW9ucz1jb25maWcpCi0KLSAgICAgICAgZm9yIF8gaW4gcmFuZ2UoNCk6Ci0gICAgICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTAsIHBheWxvYWQ9YidhYmMnKSwgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YidhYmMnKSwKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0yLCBwYXlsb2FkPWInYWJjJykpLmluT3JkZXIoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0xLCBwPVBvbGwuUE9MTCwgcz1TdXBlcnZpc29yeUZ1bmN0aW9uLlNFTEVDVF9SRUpFQ1QpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YidhYmMnLCBmPUZpbmFsLlBPTExfUkVTUE9OU0UpLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTMsIHBheWxvYWQ9YidhYmMnKSkuaW5PcmRlcigpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0xNS1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVzcG9uZCB0byBTLUZyYW1lIFtTUkVKXSBQT0xMIEJpdCBDbGVhciIpCi0gICAgZGVmIHRlc3RfcmVzcG9uZF90b19zcmVqX3BfY2xlYXIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCByZXNwb25kcyB3aXRoIHRoZSBjb3JyZWN0IEktZnJhbWUgd2hlbiBzZW50IGFuIFNSRUogZnJhbWUKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgbWF4X3RyYW5zbWl0PTIsIHR4X3dpbmRvd19zaXplPTMpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIHJlcV9jb25maWdfb3B0aW9ucz1jb25maWcsIHJzcF9jb25maWdfb3B0aW9ucz1jb25maWcpCi0KLSAgICAgICAgZm9yIF8gaW4gcmFuZ2UoNCk6Ci0gICAgICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTAsIHBheWxvYWQ9YidhYmMnKSwgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YidhYmMnKSwKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0yLCBwYXlsb2FkPWInYWJjJykpLmluT3JkZXIoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0xLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uU0VMRUNUX1JFSkVDVCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0xLCBwYXlsb2FkPWInYWJjJywgZj1GaW5hbC5OT1RfU0VUKSkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfc19mcmFtZShyZXFfc2VxPTMsIHM9U3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUNFSVZFUl9SRUFEWSkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0zLCBwYXlsb2FkPWInYWJjJywgZj1GaW5hbC5OT1RfU0VUKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTE2LUMiLCBwdHNfdGVzdF9uYW1lPSJTZW5kIFMtRnJhbWUgW1JFSl0iKQotICAgIGRlZiB0ZXN0X3NlbmRfc19mcmFtZV9yZWooc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gc2VuZCBhbiBTLUZyYW1lIFtSRUpdIGFmdGVyIHJlY2VpdmluZyBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgSS1GcmFtZXMKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgdHhfd2luZG93X3NpemUgPSA0Ci0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIHR4X3dpbmRvd19zaXplPXR4X3dpbmRvd19zaXplKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLCByc3BfY29uZmlnX29wdGlvbnM9Y29uZmlnKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPTAsIHJlcV9zZXE9MCwgZj1GaW5hbC5OT1RfU0VULCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPTIsIHJlcV9zZXE9MCwgZj1GaW5hbC5OT1RfU0VULCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5TRnJhbWUocmVxX3NlcT0xLCBmPUZpbmFsLk5PVF9TRVQsIHM9U3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUpFQ1QsIHA9UG9sbC5OT1RfU0VUKSkKLQotICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCB0eF93aW5kb3dfc2l6ZSk6Ci0gICAgICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT1pLCByZXFfc2VxPTAsIGY9RmluYWwuTk9UX1NFVCwgcGF5bG9hZD1TQU1QTEVfUEFDS0VUKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLlNGcmFtZShyZXFfc2VxPWkgKyAxLCBmPUZpbmFsLk5PVF9TRVQsIHM9U3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUNFSVZFUl9SRUFEWSkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0xOC1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVjZWl2ZSBTLUZyYW1lIFtSUl0gRmluYWwgQml0ID0gMSIpCi0gICAgZGVmIHRlc3RfcmVjZWl2ZV9zX2ZyYW1lX3JyX2ZpbmFsX2JpdF9zZXQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIHJldHJhbnNtaXQgYW55IHByZXZpb3VzbHkgc2VudCBJLWZyYW1lcwotICAgICAgICB1bmFja25vd2xlZGdlZCBieSByZWNlaXB0IG9mIGFuIFMtRnJhbWUgW1JSXSB3aXRoIHRoZSBGaW5hbCBCaXQgc2V0Ci0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgY29uZmlnID0gQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bShmY3M9RmNzVHlwZS5OT19GQ1MsIHJldHJhbnNtaXNzaW9uX3RpbWVfb3V0PTE1MDApCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocD1sMmNhcF9wYWNrZXRzLlBvbGwuUE9MTCkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfc19mcmFtZShyZXFfc2VxPTAsIGY9RmluYWwuUE9MTF9SRVNQT05TRSkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0wKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JWLTE5LUMiLCBwdHNfdGVzdF9uYW1lPSJSZWNlaXZlIEktRnJhbWUgRmluYWwgQml0ID0gMSIpCi0gICAgZGVmIHRlc3RfcmVjZWl2ZV9pX2ZyYW1lX2ZpbmFsX2JpdF9zZXQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIHJldHJhbnNtaXQgYW55IHByZXZpb3VzbHkgc2VudCBJLWZyYW1lcwotICAgICAgICB1bmFja25vd2xlZGdlZCBieSByZWNlaXB0IG9mIGFuIEktZnJhbWUgd2l0aCB0aGUgZmluYWwgYml0IHNldAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIGNvbmZpZyA9IENlcnRMMmNhcC5jb25maWdfb3B0aW9uX2VydG0oZmNzPUZjc1R5cGUuTk9fRkNTLCByZXRyYW5zbWlzc2lvbl90aW1lX291dD0xNTAwKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLCByc3BfY29uZmlnX29wdGlvbnM9Y29uZmlnKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocD1Qb2xsLlBPTEwpKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPTAsIHJlcV9zZXE9MCwgZj1GaW5hbC5QT0xMX1JFU1BPTlNFLCBwYXlsb2FkPVNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9MCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0yMC1DIiwgcHRzX3Rlc3RfbmFtZT0iRW50ZXIgUmVtb3RlIEJ1c3kgQ29uZGl0aW9uIikKLSAgICBkZWYgdGVzdF9yZWNlaXZlX3JucihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHdpbGwgbm90IHJldHJhbnNtaXQgYW55IEktZnJhbWVzIHdoZW4gaXQgcmVjZWl2ZXMgYQotICAgICAgICByZW1vdGUgYnVzeSBpbmRpY2F0aW9uIGZyb20gdGhlIExvd2VyIFRlc3RlciAoUy1mcmFtZSBbUk5SXSkKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgcmV0cmFuc21pc3Npb25fdGltZV9vdXQ9MTUwMCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuU0ZyYW1lKHA9bDJjYXBfcGFja2V0cy5Qb2xsLlBPTEwpKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0wLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uUkVDRUlWRVJfTk9UX1JFQURZLCBmPUZpbmFsLlBPTExfUkVTUE9OU0UpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0c05vbmUoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTApLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTMpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9FUk0vQlYtMjItQyIsIHB0c190ZXN0X25hbWU9IkV4aXQgTG9jYWwgQnVzeSBDb25kaXRpb24iKQotICAgIGRlZiB0ZXN0X2V4aXRfbG9jYWxfYnVzeV9jb25kaXRpb24oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBzZW5kcyBhbiBTLWZyYW1lIFtSUl0gUG9sbCA9IDEgd2hlbiB0aGUgbG9jYWwgYnVzeSBjb25kaXRpb24gaXMgY2xlYXJlZAotICAgICAgICBOT1RFOiBJbiBHRCBzdGFjaywgd2UgZW50ZXIgbG9jYWwgYnVzeSBjb25kaXRpb24gaWYgY2xpZW50IGRvZXNuJ3QgZGVxdWV1ZQotICAgICAgICBhbmQgcGFja2V0cyBhcmUgYWNjdW11bGF0aW5nIGluIGJ1ZmZlcgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIGNvbmZpZyA9IENlcnRMMmNhcC5jb25maWdfb3B0aW9uX2VydG0oZmNzPUZjc1R5cGUuTk9fRkNTLCB0eF93aW5kb3dfc2l6ZT0xMCkKLQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLAotICAgICAgICAgICAgZmNzPUZjc1R5cGUuTk9fRkNTLAotICAgICAgICAgICAgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywKLSAgICAgICAgICAgIHJzcF9jb25maWdfb3B0aW9ucz1jb25maWcpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9MCwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0wLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZXRfdHJhZmZpY19wYXVzZWQoVHJ1ZSkKLQotICAgICAgICAjIEFsbG93IDEgYWRkaXRpb25hbCBwYWNrZXQgaW4gY2hhbm5lbCBxdWV1ZSBidWZmZXIKLSAgICAgICAgYnVmZmVyX3NpemUgPSBzZWxmLmR1dF9sMmNhcC5nZXRfY2hhbm5lbF9xdWV1ZV9idWZmZXJfc2l6ZSgpICsgMQotCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGJ1ZmZlcl9zaXplKToKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2lfZnJhbWUodHhfc2VxPWkgKyAxLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlNGcmFtZShzPWwyY2FwX3BhY2tldHMuU3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUNFSVZFUl9SRUFEWSkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9YnVmZmVyX3NpemUgKyAxLCByZXFfc2VxPTEsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuU0ZyYW1lKHM9bDJjYXBfcGFja2V0cy5TdXBlcnZpc29yeUZ1bmN0aW9uLlJFQ0VJVkVSX05PVF9SRUFEWSkpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2V0X3RyYWZmaWNfcGF1c2VkKEZhbHNlKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLlNGcmFtZShzPWwyY2FwX3BhY2tldHMuU3VwZXJ2aXNvcnlGdW5jdGlvbi5SRUNFSVZFUl9SRUFEWSwgcD1sMmNhcF9wYWNrZXRzLlBvbGwuUE9MTCkpCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUoMSwgZj1sMmNhcF9wYWNrZXRzLkZpbmFsLlBPTExfUkVTUE9OU0UpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CVi0yMy1DIiwgcHRzX3Rlc3RfbmFtZT0iVHJhbnNtaXQgSS1GcmFtZXMgdXNpbmcgU0FSIikKLSAgICBkZWYgdGVzdF90cmFuc21pdF9pX2ZyYW1lc191c2luZ19zYXIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gc2VuZCBjb3JyZWN0bHkgZm9ybWF0dGVkIHNlcXVlbnRpYWwgSS1mcmFtZXMgd2l0aAotICAgICAgICB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmhhbmNlZCBjb250cm9sIGZpZWxkcyAoU0FSLCBGLWJpdCwgUmVxU2VxLAotICAgICAgICBUeFNlcSkgd2hlbiBwZXJmb3JtaW5nIFNBUi4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgbXBzPTExKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KAotICAgICAgICAgICAgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNLCByZXFfY29uZmlnX29wdGlvbnM9Y29uZmlnLCByc3BfY29uZmlnX29wdGlvbnM9Y29uZmlnKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmNhYmNhYmMnKQotICAgICAgICAjIEZpcnN0IElGcmFtZSBzaG91bGQgY29udGFpbiBTRFUgc2l6ZSBhZnRlciBjb250cm9sIGZpZWxkCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lU3RhcnQodHhfc2VxPTAsIHBheWxvYWQ9YidhYmMnKSwgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEsIHBheWxvYWQ9YidhYmMnKSwKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0yLCBwYXlsb2FkPWInYWJjJykpLmluT3JkZXIoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0zLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uUkVDRUlWRVJfUkVBRFkpCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2RlZmRlZmRlZicpCi0gICAgICAgICMgRmlyc3QgSUZyYW1lIHNob3VsZCBjb250YWluIFNEVSBzaXplIGFmdGVyIGNvbnRyb2wgZmllbGQKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWVTdGFydCh0eF9zZXE9MywgcGF5bG9hZD1iJ2RlZicpLCBMMmNhcE1hdGNoZXJzLklGcmFtZSh0eF9zZXE9NCwgcGF5bG9hZD1iJ2RlZicpLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTUsIHBheWxvYWQ9YidkZWYnKSkuaW5PcmRlcigpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0VSTS9CSS0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iUy1GcmFtZSBbUkVKXSBMb3N0IG9yIENvcnJ1cHRlZCIpCi0gICAgZGVmIHRlc3Rfc2VudF9yZWpfbG9zdChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIGNhbiBoYW5kbGUgcmVjZWlwdCBvZiBhbiBTLT1mcmFtZSBbUlJdIFBvbGwgPSAxIGlmIHRoZQotICAgICAgICBTLWZyYW1lIFtSRUpdIHNlbnQgZnJvbSB0aGUgSVVUIGlzIGxvc3QKLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgZXJ0bV90eF93aW5kb3dfc2l6ZSA9IDUKLQotICAgICAgICBjb25maWcgPSBDZXJ0TDJjYXAuY29uZmlnX29wdGlvbl9lcnRtKGZjcz1GY3NUeXBlLk5PX0ZDUywgdHhfd2luZG93X3NpemU9ZXJ0bV90eF93aW5kb3dfc2l6ZSkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgcmVxX2NvbmZpZ19vcHRpb25zPWNvbmZpZywgcnNwX2NvbmZpZ19vcHRpb25zPWNvbmZpZykKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT0wLCByZXFfc2VxPTAsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuU0ZyYW1lKHJlcV9zZXE9MSkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9ZXJ0bV90eF93aW5kb3dfc2l6ZSAtIDEsIHJlcV9zZXE9MCwgcGF5bG9hZD1TQU1QTEVfUEFDS0VUKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5TRnJhbWUocz1TdXBlcnZpc29yeUZ1bmN0aW9uLlJFSkVDVCkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfc19mcmFtZShyZXFfc2VxPTAsIHA9UG9sbC5QT0xMKQotCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlNGcmFtZShyZXFfc2VxPTEsIGY9bDJjYXBfcGFja2V0cy5GaW5hbC5QT0xMX1JFU1BPTlNFKSkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgZXJ0bV90eF93aW5kb3dfc2l6ZSk6Ci0gICAgICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9pX2ZyYW1lKHR4X3NlcT1pLCByZXFfc2VxPTAsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLSAgICAgICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlNGcmFtZShyZXFfc2VxPWkgKyAxKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JJLTAzLUMiLCBwdHNfdGVzdF9uYW1lPSJIYW5kbGUgRHVwbGljYXRlIFMtRnJhbWUgW1NSRUpdIikKLSAgICBkZWYgdGVzdF9oYW5kbGVfZHVwbGljYXRlX3NyZWooc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIG9ubHkgcmV0cmFuc21pdCB0aGUgcmVxdWVzdGVkIEktZnJhbWUgb25jZSBhZnRlcgotICAgICAgICByZWNlaXZpbmcgYSBkdXBsaWNhdGUgU1JFSgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sIGZjcz1GY3NUeXBlLk5PX0ZDUykKLQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuSUZyYW1lKHR4X3NlcT0wKSwgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEpLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5TRnJhbWUocD1Qb2xsLlBPTEwpKS5pbk9yZGVyKCkKLQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9zX2ZyYW1lKHJlcV9zZXE9MCwgcz1TdXBlcnZpc29yeUZ1bmN0aW9uLlNFTEVDVF9SRUpFQ1QpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0c05vbmUodGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0wLjUpKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0wLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uU0VMRUNUX1JFSkVDVCwgZj1GaW5hbC5QT0xMX1JFU1BPTlNFKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTApKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JJLTA0LUMiLAotICAgICAgICBwdHNfdGVzdF9uYW1lPSJIYW5kbGUgUmVjZWlwdCBvZiBTLUZyYW1lIFtSRUpdIGFuZCBTLUZyYW1lICIKLSAgICAgICAgIltSUiwgRj0xXSB0aGF0IEJvdGggUmVxdWlyZSBSZXRyYW5zbWlzc2lvbiBvZiB0aGUgIgotICAgICAgICAiU2FtZSBJLUZyYW1lcyIpCi0gICAgZGVmIHRlc3RfaGFuZGxlX3JlY2VpcHRfcmVqX2FuZF9ycl93aXRoX2Zfc2V0KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgd2lsbCBvbmx5IHJldHJhbnNtaXQgdGhlIHJlcXVlc3RlZCBJLWZyYW1lcyBvbmNlIGFmdGVyCi0gICAgICAgIHJlY2VpdmluZyBhbiBTLWZyYW1lIFtSRUpdIGZvbGxvd2VkIGJ5IGFuIFMtZnJhbWUgW1JSXSB3aXRoIHRoZSBGaW5hbAotICAgICAgICBiaXQgc2V0IHRoYXQgaW5kaWNhdGVzIHRoZSBzYW1lIEktZnJhbWVzIHNob3VsZCBiZSByZXRyYW5zbWl0dGVkCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgZmNzPUZjc1R5cGUuTk9fRkNTKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTApLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEpLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5TRnJhbWUocD1sMmNhcF9wYWNrZXRzLlBvbGwuUE9MTCkpLmluT3JkZXIoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0wLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uUkVKRUNUKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHNOb25lKHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MC41KSkKLQotICAgICAgICAjIFNlbmQgUlIgd2l0aCBGIHNldAotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9zX2ZyYW1lKHJlcV9zZXE9MCwgcz1TdXBlcnZpc29yeUZ1bmN0aW9uLlJFSkVDVCwgZj1GaW5hbC5QT0xMX1JFU1BPTlNFKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTApKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvRVJNL0JJLTA1LUMiLAotICAgICAgICBwdHNfdGVzdF9uYW1lPSJIYW5kbGUgcmVjZWlwdCBvZiBTLUZyYW1lIFtSRUpdIGFuZCBJLUZyYW1lIFtGPTFdICIKLSAgICAgICAgInRoYXQgQm90aCBSZXF1aXJlIFJldHJhbnNtaXNzaW9uIG9mIHRoZSBTYW1lICIKLSAgICAgICAgIkktRnJhbWVzIikKLSAgICBkZWYgdGVzdF9oYW5kbGVfcmVqX2FuZF9pX2ZyYW1lX3dpdGhfZl9zZXQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIG9ubHkgcmV0cmFuc21pdCB0aGUgcmVxdWVzdGVkIEktZnJhbWVzIG9uY2UgYWZ0ZXIKLSAgICAgICAgcmVjZWl2aW5nIGFuIFMtZnJhbWUgW1JFSl0gZm9sbG93ZWQgYnkgYW4gSS1mcmFtZSB3aXRoIHRoZSBGaW5hbCBiaXQKLSAgICAgICAgc2V0IHRoYXQgaW5kaWNhdGVzIHRoZSBzYW1lIEktZnJhbWVzIHNob3VsZCBiZSByZXRyYW5zbWl0dGVkCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydCgKLSAgICAgICAgICAgIG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSwgZmNzPUZjc1R5cGUuTk9fRkNTKQotCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidhYmMnKQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInYWJjJykKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTApLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEpLAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5TRnJhbWUocD1sMmNhcF9wYWNrZXRzLlBvbGwuUE9MTCkpLmluT3JkZXIoKQotCi0gICAgICAgICMgU2VuZCBTUkVKIHdpdGggRiBub3Qgc2V0Ci0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX3NfZnJhbWUocmVxX3NlcT0wLCBzPVN1cGVydmlzb3J5RnVuY3Rpb24uU0VMRUNUX1JFSkVDVCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzTm9uZSh0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTAuNSkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfaV9mcmFtZSh0eF9zZXE9MCwgcmVxX3NlcT0wLCBmPUZpbmFsLlBPTExfUkVTUE9OU0UsIHBheWxvYWQ9U0FNUExFX1BBQ0tFVCkKLQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTApKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5JRnJhbWUodHhfc2VxPTEpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvQ01DL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJJVVQgSW5pdGlhdGVkIENvbmZpZ3VyYXRpb24gb2YgRW5oYW5jZWQgIgotICAgICAgICAiUmV0cmFuc21pc3Npb24gTW9kZSIpCi0gICAgZGVmIHRlc3RfaW5pdGlhdGVkX2NvbmZpZ3VyYXRpb25fcmVxdWVzdF9lcnRtKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIHNlbmQgYSBDb25maWd1cmF0aW9uIFJlcXVlc3QgY29tbWFuZCBjb250YWluaW5nIHRoZQotICAgICAgICBGJkVDIG9wdGlvbiB0aGF0IHNwZWNpZmllcyBFbmhhbmNlZCBSZXRyYW5zbWlzc2lvbiBNb2RlCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgc2VsZi5fb3Blbl91bmNvbmZpZ3VyZWRfY2hhbm5lbF9mcm9tX2NlcnQoc2NpZD0weDQxLCBwc209MHgzMywgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoTDJjYXBNYXRjaGVycy5Db25maWd1cmF0aW9uUmVxdWVzdFdpdGhFcnRtKCkpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJMMkNBUC9DTUMvQlYtMDItQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9Ikxvd2VyIFRlc3RlciBJbml0aWF0ZWQgQ29uZmlndXJhdGlvbiBvZiBFbmhhbmNlZCAiCi0gICAgICAgICJSZXRyYW5zbWlzc2lvbiBNb2RlIikKLSAgICBkZWYgdGVzdF9yZXNwb25kX2NvbmZpZ3VyYXRpb25fcmVxdWVzdF9lcnRtKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIGFjY2VwdCBhIENvbmZpZ3VyYXRpb24gUmVxdWVzdCBmcm9tIHRoZSBMb3dlciBUZXN0ZXIKLSAgICAgICAgY29udGFpbmluZyBhbiBGJkVDIG9wdGlvbiB0aGF0IHNwZWNpZmllcyBFbmhhbmNlZCBSZXRyYW5zbWlzc2lvbiBNb2RlCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0KLSAgICAgICAgc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fZHV0KHBzbT0weDMzLCBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0pCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJMMkNBUC9DTUMvQlYtMTItQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IkVSVE0gTm90IFN1cHBvcnRlZCBieSBMb3dlciBUZXN0ZXIgZm9yIE1hbmRhdG9yeSAiCi0gICAgICAgICJFUlRNIGNoYW5uZWwiKQotICAgIGRlZiB0ZXN0X3Jlc3BvbmRfbm90X3N1cHBvcnRfZXJ0bV93aGVuX3VzaW5nX21hbmRhdG9yeV9lcnRtKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVGhlIElVVCBpcyBpbml0aWF0aW5nIGNvbm5lY3Rpb24gb2YgYW4gTDJDQVAgY2hhbm5lbCB0aGF0IG1hbmRhdGVzIHVzZQotICAgICAgICBvZiBFUlRNLiBWZXJpZnkgdGhlIElVVCB3aWxsIG5vdCBhdHRlbXB0IHRvIGNvbmZpZ3VyZSB0aGUgY29ubmVjdGlvbiB0bwotICAgICAgICBFUlRNIGlmIHRoZSBMb3dlciBUZXN0ZXIgaGFzIG5vdCBpbmRpY2F0ZWQgc3VwcG9ydCBmb3IgRVJUTSBpbiB0aGUKLSAgICAgICAgSW5mb3JtYXRpb24gUmVzcG9uc2UgW0V4dGVuZGVkIEZlYXR1cmVzXQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuY2xhaW1fZXJ0bV91bnN1cHBvcnRlZCgpCi0gICAgICAgIGR1dF9jaGFubmVsX2Z1dHVyZSA9IHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfZHluYW1pY19jaGFubmVsX3RvX2NlcnQoCi0gICAgICAgICAgICBwc209MHgzMywgbW9kZT1SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkpLmVtaXRzTm9uZSgKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuQ29ubmVjdGlvblJlcXVlc3QoMHgzMyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MykpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJMMkNBUC9DTUMvQkktMDEtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IkZhaWxlZCBDb25maWd1cmF0aW9uIG9mIEVuaGFuY2VkIFJldHJhbnNtaXNzaW9uICIKLSAgICAgICAgIk1vZGUgd2hlbiB1c2Ugb2YgdGhlIE1vZGUgaXMgTWFuZGF0b3J5XSIpCi0gICAgZGVmIHRlc3RfY29uZmlnX3Jlc3BvbmRfYmFzaWNfbW9kZV93aGVuX3VzaW5nX21hbmRhdG9yeV9lcnRtKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgV2hlbiBjcmVhdGluZyBhIGNvbm5lY3Rpb24gZm9yIGEgUFNNIHRoYXQgbWFuZGF0ZXMgdGhlIHVzZSBvZiBFUlRNCi0gICAgICAgIHZlcmlmeSB0aGUgSVVUIGNhbiBoYW5kbGUgcmVjZWlwdCAoY2xvc2UgdGhlIGNoYW5uZWwgaW4gYWNjb3JkYW5jZSB3aXRoCi0gICAgICAgIHRoZSBzcGVjaWZpY2F0aW9uKSBvZiBhIENvbmZpZ3VyZSBSZXNwb25zZSBpbmRpY2F0aW5nIHRoZSBwZWVyIEwyQ0FQCi0gICAgICAgIGVudGl0eSBkb2VzbuKAmXQgd2lzaCB0byB1c2UgRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gTW9kZSAoQ29uZmlndXJlCi0gICAgICAgIFJlc3BvbnNlIFJlc3VsdCA9IFJlamVjdCBVbmFjY2VwdGFibGUgUGFyYW1ldGVycykKLSAgICAgICAgIiIiCi0KLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoCi0gICAgICAgICAgICBtb2RlPVJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0sCi0gICAgICAgICAgICByZXFfY29uZmlnX29wdGlvbnM9Q2VydEwyY2FwLmNvbmZpZ19vcHRpb25fZXJ0bSgpLAotICAgICAgICAgICAgcnNwX2NvbmZpZ19vcHRpb25zPUNlcnRMMmNhcC5jb25maWdfb3B0aW9uX2Jhc2ljX2V4cGxpY2l0KCkpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9kaXNjb25uZWN0X3JlcXVlc3QoKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvQ01DL0JJLTAyLUMiLAotICAgICAgICBwdHNfdGVzdF9uYW1lPSJDb25maWd1cmF0aW9uIE1vZGUgbWlzbWF0Y2ggd2hlbiB1c2Ugb2YgRW5oYW5jZWQgIgotICAgICAgICAiUmV0cmFuc21pc3Npb24gTW9kZSBpcyBNYW5kYXRvcnkiKQotICAgIGRlZiB0ZXN0X2NvbmZpZ19yZXF1ZXN0X2Jhc2ljX21vZGVfd2hlbl91c2luZ19tYW5kYXRvcnlfZXJ0bShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFdoZW4gY3JlYXRpbmcgYSBjb25uZWN0aW9uIGZvciBhIFBTTSB0aGF0IG1hbmRhdGVzIHRoZSB1c2Ugb2YgRVJUTSwKLSAgICAgICAgdmVyaWZ5IHRoZSBJVVQgd2lsbCBjbG9zZSB0aGUgY2hhbm5lbCBpZiB0aGUgTG93ZXIgVGVzdGVyIGF0dGVtcHRzIHRvCi0gICAgICAgIGNvbmZpZ3VyZSBCYXNpYyBNb2RlLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fdW5jb25maWd1cmVkX2NoYW5uZWxfZnJvbV9jZXJ0KG1vZGU9UmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY29uZmlndXJlX3JlcXVlc3QoQ2VydEwyY2FwLmNvbmZpZ19vcHRpb25fYmFzaWNfZXhwbGljaXQoKSkKLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9kaXNjb25uZWN0X3JlcXVlc3QoKQotCi0gICAgZGVmIHRlc3RfaW5pdGlhdGVfY29ubmVjdGlvbl9mb3Jfc2VjdXJpdHkoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBUaGlzIHdpbGwgdGVzdCB0aGUgUHlMMmNhcCBBUEkgZm9yIGluaXRpYXRpbmcgYSBjb25uZWN0aW9uIGZvciBzZWN1cml0eQotICAgICAgICB2aWEgdGhlIHNlY3VyaXR5IGFwaQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5kdXQubmVpZ2hib3IuRW5hYmxlUGFnZVNjYW4obmVpZ2hib3JfZmFjYWRlLkVuYWJsZU1zZyhlbmFibGVkPVRydWUpKQotICAgICAgICBzZWxmLmNlcnQubmVpZ2hib3IuRW5hYmxlUGFnZVNjYW4obmVpZ2hib3JfZmFjYWRlLkVuYWJsZU1zZyhlbmFibGVkPVRydWUpKQotICAgICAgICBzZWxmLmR1dF9sMmNhcC5pbml0aWF0ZV9jb25uZWN0aW9uX2Zvcl9zZWN1cml0eSgpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5hY2NlcHRfaW5jb21pbmdfY29ubmVjdGlvbigpCi0gICAgICAgIHNlbGYuZHV0X2wyY2FwLnZlcmlmeV9zZWN1cml0eV9jb25uZWN0aW9uKCkKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9wdHNfbDJjYXBfdGVzdC5weSBiL2dkL2wyY2FwL2NsYXNzaWMvY2VydC9wdHNfbDJjYXBfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZWQ0ZS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2NlcnQvcHRzX2wyY2FwX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi1pbXBvcnQgdGltZQotCi1mcm9tIGNlcnQucHRzX2Jhc2VfdGVzdCBpbXBvcnQgUFRTQmFzZVRlc3RDbGFzcwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyCi1mcm9tIGZhY2FkZSBpbXBvcnQgcm9vdHNlcnZpY2VfcGIyIGFzIGZhY2FkZV9yb290c2VydmljZV9wYjIKLWZyb20gbDJjYXAuY2xhc3NpYyBpbXBvcnQgZmFjYWRlX3BiMiBhcyBsMmNhcF9mYWNhZGVfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyCi1mcm9tIG5laWdoYm9yLmZhY2FkZSBpbXBvcnQgZmFjYWRlX3BiMiBhcyBuZWlnaGJvcl9mYWNhZGUKLQotCi1jbGFzcyBQVFNMMmNhcFRlc3QoUFRTQmFzZVRlc3RDbGFzcyk6Ci0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdCA9IHNlbGYuZ2RfZGV2aWNlc1swXQotCi0gICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3Qucm9vdHNlcnZpY2UuU3RhcnRTdGFjaygKLSAgICAgICAgICAgIGZhY2FkZV9yb290c2VydmljZV9wYjIuU3RhcnRTdGFja1JlcXVlc3QoCi0gICAgICAgICAgICAgICAgbW9kdWxlX3VuZGVyX3Rlc3Q9ZmFjYWRlX3Jvb3RzZXJ2aWNlX3BiMi5CbHVldG9vdGhNb2R1bGUuVmFsdWUoJ0wyQ0FQJyksKSkKLQotICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LndhaXRfY2hhbm5lbF9yZWFkeSgpCi0KLSAgICAgICAgZHV0X2FkZHJlc3MgPSBzZWxmLmRldmljZV91bmRlcl90ZXN0LmNvbnRyb2xsZXJfcmVhZF9vbmx5X3Byb3BlcnR5LlJlYWRMb2NhbEFkZHJlc3MoZW1wdHlfcGIyLkVtcHR5KCkpLmFkZHJlc3MKLSAgICAgICAgcHRzX2FkZHJlc3MgPSBzZWxmLmNvbnRyb2xsZXJfY29uZmlncy5nZXQoJ3B0c19hZGRyZXNzJykubG93ZXIoKQotICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmFkZHJlc3MgPSBkdXRfYWRkcmVzcwotCi0gICAgICAgIHNlbGYuZHV0X2FkZHJlc3MgPSBjb21tb25fcGIyLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1zZWxmLmRldmljZV91bmRlcl90ZXN0LmFkZHJlc3MpCi0gICAgICAgIHNlbGYucHRzX2FkZHJlc3MgPSBjb21tb25fcGIyLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1zdHIuZW5jb2RlKHB0c19hZGRyZXNzKSkKLQotICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0Lm5laWdoYm9yLkVuYWJsZVBhZ2VTY2FuKG5laWdoYm9yX2ZhY2FkZS5FbmFibGVNc2coZW5hYmxlZD1UcnVlKSkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LnJvb3RzZXJ2aWNlLlN0b3BTdGFjayhmYWNhZGVfcm9vdHNlcnZpY2VfcGIyLlN0b3BTdGFja1JlcXVlc3QoKSkKLQotICAgIGRlZiBfZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKHNlbGYpOgotICAgICAgICByZXR1cm4gRXZlbnRTdHJlYW0oc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5GZXRjaENvbm5lY3Rpb25Db21wbGV0ZShlbXB0eV9wYjIuRW1wdHkoKSkpCi0KLSAgICBkZWYgX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbShzZWxmKToKLSAgICAgICAgcmV0dXJuIEV2ZW50U3RyZWFtKHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuRmV0Y2hDb25uZWN0aW9uQ2xvc2UoZW1wdHlfcGIyLkVtcHR5KCkpKQotCi0gICAgZGVmIF9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShzZWxmLCBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIHRpbWVvdXQ9MzApOgotICAgICAgICBkdXRfY29ubmVjdGlvbl9zdHJlYW0uYXNzZXJ0X2V2ZW50X29jY3VycygKLSAgICAgICAgICAgIGxhbWJkYSBkZXZpY2U6IGRldmljZS5yZW1vdGUuYWRkcmVzcyA9PSBzZWxmLnB0c19hZGRyZXNzLmFkZHJlc3MsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9dGltZW91dCkpCi0KLSAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKHNlbGYsIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSwgdGltZW91dD0zMCk6Ci0gICAgICAgIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbS5hc3NlcnRfZXZlbnRfb2NjdXJzKAotICAgICAgICAgICAgbGFtYmRhIGRldmljZTogZGV2aWNlLnJlbW90ZS5hZGRyZXNzID09IHNlbGYucHRzX2FkZHJlc3MuYWRkcmVzcywgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz10aW1lb3V0KSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0lFWF9CVl8wMV9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvQ09TL0lFWC9CVi0wMS1DIFtRdWVyeSBmb3IgMS4yIEZlYXR1cmVzXQotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHRyYW5zbWl0cyBhbiBpbmZvcm1hdGlvbiByZXF1ZXN0IGNvbW1hbmQgdG8gc29saWNpdCBpZiB0aGUgcmVtb3RlIGRldmljZSBzdXBwb3J0cwotICAgICAgICBTcGVjaWZpY2F0aW9uIDEuMiBmZWF0dXJlcy4KLSAgICAgICAgIiIiCi0gICAgICAgIHBzbSA9IDEKLSAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5PcGVuQ2hhbm5lbChsMmNhcF9mYWNhZGVfcGIyLk9wZW5DaGFubmVsUmVxdWVzdChyZW1vdGU9c2VsZi5wdHNfYWRkcmVzcywgcHNtPXBzbSkpCi0gICAgICAgIHRpbWUuc2xlZXAoNSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0lFWF9CVl8wMl9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvQ09TL0lFWC9CVi0wMi1DIFtSZXNwb25kIHdpdGggMS4yIEZlYXR1cmVzXQotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHJlc3BvbmRzIHRvIGFuIGluZm9ybWF0aW9uIHJlcXVlc3QgY29tbWFuZCBzb2xpY2l0aW5nIGZvciBTcGVjaWZpY2F0aW9uIDEuMgotICAgICAgICBmZWF0dXJlcy4KLSAgICAgICAgIiIiCi0gICAgICAgIHBzbSA9IDEKLSAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTQotICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1yZXRyYW5zbWlzc2lvbl9tb2RlKSkKLSAgICAgICAgdGltZS5zbGVlcCgyMCkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VYRl9CVl8wMV9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVhGL0JWLTAxLUMgW0V4dGVuZGVkIEZlYXR1cmVzIEluZm9ybWF0aW9uIFJlc3BvbnNlIGZvciBFbmhhbmNlZCBSZXRyYW5zbWlzc2lvbiBNb2RlXQotICAgICAgICBWZXJpZnkgdGhlIElVVCBjYW4gZm9ybWF0IGFuIEluZm9ybWF0aW9uIFJlc3BvbnNlIGZvciB0aGUgaW5mb3JtYXRpb24gdHlwZSBvZiBFeHRlbmRlZCBGZWF0dXJlcyB0aGF0Ci0gICAgICAgIGNvcnJlY3RseSBpZGVudGlmaWVzIHRoYXQgRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gTW9kZSBpcyBsb2NhbGx5IHN1cHBvcnRlZC4KLQotICAgICAgICAiIiIKLSAgICAgICAgcHNtID0gMQotICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICB0aW1lLnNsZWVwKDUpCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9FWEZfQlZfMDNfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0VYRi9CVi0wMy1DIFtFeHRlbmRlZCBGZWF0dXJlcyBJbmZvcm1hdGlvbiBSZXNwb25zZSBmb3IgRkNTIE9wdGlvbl0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIGZvcm1hdCBhbiBJbmZvcm1hdGlvbiBSZXNwb25zZSBmb3IgdGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgRXh0ZW5kZWQgRmVhdHVyZXMgdGhhdAotICAgICAgICBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGF0IHRoZSBGQ1MgT3B0aW9uIGlzIGxvY2FsbHkgc3VwcG9ydGVkLgotICAgICAgICAiIiIKLSAgICAgICAgcHNtID0gMQotICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICB0aW1lLnNsZWVwKDUpCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9DTUNfQlZfMDFfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0NNQy9CVi0wMS1DIFtJVVQgSW5pdGlhdGVkIENvbmZpZ3VyYXRpb24gb2YgRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gTW9kZV0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIHNlbmQgYSBDb25maWd1cmF0aW9uIFJlcXVlc3QgY29tbWFuZCBjb250YWluaW5nIHRoZSBGJkVDIG9wdGlvbiB0aGF0IHNwZWNpZmllcwotICAgICAgICBFbmhhbmNlZCBSZXRyYW5zbWlzc2lvbiBNb2RlLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9DTUNfQlZfMDJfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0NNQy9CVi0wMi1DIFtMb3dlciBUZXN0ZXIgSW5pdGlhdGVkIENvbmZpZ3VyYXRpb24gb2YgRW5oYW5jZWQgUmV0cmFuc21pc3Npb24gTW9kZV0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIGFjY2VwdCBhIENvbmZpZ3VyYXRpb24gUmVxdWVzdCBmcm9tIHRoZSBMb3dlciBUZXN0ZXIgY29udGFpbmluZyBhbiBGJkVDIG9wdGlvbgotICAgICAgICB0aGF0IHNwZWNpZmllcyBFbmhhbmNlZCBSZXRyYW5zbWlzc2lvbiBNb2RlLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9FUk1fQlZfMDFfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0VSTS9CVi0wMS1DIFtUcmFuc21pdCBJLWZyYW1lc10KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIHNlbmQgY29ycmVjdGx5IGZvcm1hdHRlZCBzZXF1ZW50aWFsIEktZnJhbWVzIHdpdGggdmFsaWQgdmFsdWVzIGZvciB0aGUgZW5oYW5jZWQKLSAgICAgICAgY29udHJvbCBmaWVsZHMgKFNBUiwgRi1iaXQsIFJlcVNlcSwgVHhTZXEpLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLSAgICAgICAgICAgIHJldHJhbnNtaXNzaW9uX21vZGUgPSBsMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0KLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1yZXRyYW5zbWlzc2lvbl9tb2RlKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2VuZER5bmFtaWNDaGFubmVsUGFja2V0KAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuRHluYW1pY0NoYW5uZWxQYWNrZXQocHNtPXBzbSwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CVl8wMl9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JWLTAyLUMgW1JlY2VpdmUgSS1GcmFtZXNdCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIGNhbiByZWNlaXZlIGluLXNlcXVlbmNlIHZhbGlkIEktZnJhbWVzIGFuZCBkZWxpdmVyIEwyQ0FQIFNEVXMgdG8gdGhlIFVwcGVyIFRlc3RlcgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLSAgICAgICAgICAgIHJldHJhbnNtaXNzaW9uX21vZGUgPSBsMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0KLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1yZXRyYW5zbWlzc2lvbl9tb2RlKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CVl8wM19DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JWLTAzLUMgW0Fja25vd2xlZGdpbmcgUmVjZWl2ZWQgSS1GcmFtZXNdCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfRVJNX0JWXzA1X0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9FUk0vQlYtMDUtQyBbUmVzdW1lIFRyYW5zbWl0dGluZyBJLUZyYW1lcyB3aGVuIGFuIFMtRnJhbWUgW1JSXSBpcyBSZWNlaXZlZF0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgd2lsbCBjZWFzZSB0cmFuc21pc3Npb24gb2YgSS1mcmFtZXMgd2hlbiB0aGUgbmVnb3RpYXRlZCBUeFdpbmRvdyBpcyBmdWxsLiBWZXJpZnkgdGhlCi0gICAgICAgIElVVCB3aWxsIHJlc3VtZSB0cmFuc21pc3Npb24gb2YgSS1mcmFtZXMgd2hlbiBhbiBTLWZyYW1lIFtSUl0gaXMgcmVjZWl2ZWQgdGhhdCBhY2tub3dsZWRnZXMKLSAgICAgICAgcHJldmlvdXNseSBzZW50IEktZnJhbWVzLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgcHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1sMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0pKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CVl8wNl9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JWLTA2LUMgW1Jlc3VtZSBUcmFuc21pdHRpbmcgSS1GcmFtZXMgd2hlbiBhbiBJLUZyYW1lIGlzIFJlY2VpdmVkXQotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIGNlYXNlIHRyYW5zbWlzc2lvbiBvZiBJLWZyYW1lcyB3aGVuIHRoZSBuZWdvdGlhdGVkIFR4V2luZG93IGlzIGZ1bGwuIFZlcmlmeSB0aGUKLSAgICAgICAgSVVUIHdpbGwgcmVzdW1lIHRyYW5zbWlzc2lvbiBvZiBJLWZyYW1lcyB3aGVuIGFuIEktZnJhbWUgaXMgcmVjZWl2ZWQgdGhhdCBhY2tub3dsZWRnZXMgcHJldmlvdXNseQotICAgICAgICBzZW50IEktZnJhbWVzLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgcHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1sMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0pKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CVl8wOF9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JWLTA4LUMgW1NlbmQgUy1GcmFtZSBbUlJdIHdpdGggUG9sbCBCaXQgU2V0XQotICAgICAgICBWZXJpZnkgdGhlIElVVCBzZW5kcyBhbiBTLWZyYW1lIFtSUl0gd2l0aCB0aGUgUG9sbCBiaXQgc2V0IHdoZW4gaXRzIHJldHJhbnNtaXNzaW9uIHRpbWVyIGV4cGlyZXMuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9FUk1fQlZfMDlfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0VSTS9CVi0wOS1DIFtTZW5kIFMtZnJhbWUgW1JSXSB3aXRoIEZpbmFsIEJpdCBTZXRdCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIHJlc3BvbmRzIHdpdGggYW4gUy1mcmFtZSBbUlJdIHdpdGggdGhlIEZpbmFsIGJpdCBzZXQgYWZ0ZXIgcmVjZWl2aW5nIGFuIFMtZnJhbWUgW1JSXQotICAgICAgICB3aXRoIHRoZSBQb2xsIGJpdCBzZXQuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfRVJNX0JWXzEwX0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgTDJDQVAvRVJNL0JWLTEwLUMgW1JldHJhbnNtaXQgUy1GcmFtZSBbUlJdIHdpdGggUG9sbCBCaXQgU2V0XQotICAgICAgVmVyaWZ5IHRoZSBJVVQgd2lsbCByZXRyYW5zbWl0IHRoZSBTLWZyYW1lIFtSUl0gd2l0aCB0aGUgUG9sbCBiaXQgc2V0IHdoZW4gdGhlIE1vbml0b3IgVGltZXIgZXhwaXJlcy4KLSAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9FUk1fQlZfMTNfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0VSTS9CVi0xMy1DIFtSZXNwb25kIHRvIFMtRnJhbWUgW1JFSl1dCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICBwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPWwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2VuZER5bmFtaWNDaGFubmVsUGFja2V0KAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuRHluYW1pY0NoYW5uZWxQYWNrZXQocHNtPXBzbSwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfRVJNX0JWXzE2X0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgTDJDQVAvRVJNL0JWLTE2LUMgW1NlbmQgUy1GcmFtZSBbUkVKXV0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgY2FuIHNlbmQgYW4gUy1mcmFtZSBbUkVKXSBhZnRlciByZWNlaXZpbmcgb3V0IG9mIHNlcXVlbmNlIEktZnJhbWVzLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgcHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1sMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0pKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtLCB0aW1lb3V0PTYwKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfRVJNX0JWXzE4X0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9FUk0vQlYtMTgtQyBbUmVjZWl2ZSBTLUZyYW1lIFtSUl0gRmluYWwgQml0ID0gMV0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgd2lsbCByZXRyYW5zbWl0IGFueSBwcmV2aW91c2x5IHNlbnQgSS1mcmFtZXMgdW5hY2tub3dsZWRnZWQgYnkgcmVjZWlwdCBvZiBhbiBTLUZyYW1lCi0gICAgICAgIFtSUl0gd2l0aCB0aGUgRmluYWwgQml0IHNldC4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CVl8xOV9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JWLTE5LUMgW1JlY2VpdmUgSS1GcmFtZSBGaW5hbCBCaXQgPSAxXQotICAgICAgICBWZXJpZnkgdGhlIElVVCB3aWxsIHJldHJhbnNtaXQgYW55IHByZXZpb3VzbHkgc2VudCBJLWZyYW1lcyB1bmFja25vd2xlZGdlZCBieSByZWNlaXB0IG9mIGFuIEktZnJhbWUKLSAgICAgICAgd2l0aCB0aGUgZmluYWwgYml0IHNldC4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CVl8yMF9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JWLTIwLUMgW0VudGVyIFJlbW90ZSBCdXN5IENvbmRpdGlvbl0KLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgd2lsbCBub3QgcmV0cmFuc21pdCBhbnkgSS1mcmFtZXMgd2hlbiBpdCByZWNlaXZlcyBhIHJlbW90ZSBidXN5IGluZGljYXRpb24gZnJvbSB0aGUKLSAgICAgICAgTG93ZXIgVGVzdGVyIChTLWZyYW1lIFtSTlJdKS4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0NPU19DRURfQlZfMDFfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0NPUy9DRUQvQlYtMDEtQyBbUmVxdWVzdCBDb25uZWN0aW9uXQotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gcmVxdWVzdCB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IGZvciBhbiBMMkNBUCBkYXRhIGNoYW5uZWwgYW5kCi0gICAgICAgIGluaXRpYXRlIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLk9wZW5DaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuT3BlbkNoYW5uZWxSZXF1ZXN0KHJlbW90ZT1zZWxmLnB0c19hZGRyZXNzLCBwc209cHNtKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5DbG9zZUNoYW5uZWwobDJjYXBfZmFjYWRlX3BiMi5DbG9zZUNoYW5uZWxSZXF1ZXN0KHBzbT1wc20pKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfQ09TX0NFRF9CVl8wM19DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvQ09TL0NFRC9CVi0wMy1DIFtTZW5kIERhdGFdCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byBzZW5kIERBVEEuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuQkFTSUMKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1yZXRyYW5zbWlzc2lvbl9tb2RlKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJyAqIDM0KSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0NPU19DRURfQlZfMDRfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0NPUy9DRUQvQlYtMDQtQyBbRGlzY29ubmVjdF0KLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIGRpc2Nvbm5lY3QgdGhlIGRhdGEgY2hhbm5lbC4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5CQVNJQwotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgdGltZS5zbGVlcCgyKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5DbG9zZUNoYW5uZWwobDJjYXBfZmFjYWRlX3BiMi5DbG9zZUNoYW5uZWxSZXF1ZXN0KHBzbT1wc20pKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfQ09TX0NFRF9CVl8wNV9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvQ09TL0NFRC9CVi0wNS1DIFtBY2NlcHQgQ29ubmVjdGlvbl0KLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIGRpc2Nvbm5lY3QgdGhlIGRhdGEgY2hhbm5lbC4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5CQVNJQwotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfQ09TX0NFRF9CVl8wN19DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvQ09TL0NFRC9CVi0wNy1DIFtBY2NlcHQgRGlzY29ubmVjdF0KLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIHJlc3BvbmQgdG8gdGhlIHJlcXVlc3QgdG8gZGlzY29ubmVjdCB0aGUgZGF0YSBjaGFubmVsLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLSAgICAgICAgICAgIHJldHJhbnNtaXNzaW9uX21vZGUgPSBsMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkJBU0lDCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9DT1NfQ0VEX0JWXzA4X0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9DT1MvQ0VEL0JWLTA4LUMgW0Rpc2Nvbm5lY3Qgb24gVGltZW91dF0KLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBkaXNjb25uZWN0cyB0aGUgZGF0YSBjaGFubmVsIGFuZCBzaHV0cyBkb3duIHRoaXMgY2hhbm5lbCBpZiBubyByZXNwb25zZSBvY2N1cnMKLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5CQVNJQwotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgdGltZS5zbGVlcCgxMjApCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9DT1NfQ0VEX0JWXzA5X0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9DT1MvQ0VEL0JWLTA5LUMgW1JlY2VpdmUgTXVsdGktQ29tbWFuZCBQYWNrZXRdCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byByZWNlaXZlIG1vcmUgdGhhbiBvbmUgc2lnbmFsaW5nIGNvbW1hbmQgaW4gb25lIEwyQ0FQIHBhY2tldC4KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0gICAgICAgICAgICByZXRyYW5zbWlzc2lvbl9tb2RlID0gbDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5CQVNJQwotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfQ09TX0NFRF9CVl8xMV9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvQ09TL0NFRC9CVi0xMS1DIFtDb25maWd1cmUgTVRVIFNpemVdCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byBjb25maWd1cmUgdGhlIHN1cHBvcnRlZCBNVFUgc2l6ZQotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLSAgICAgICAgICAgIHJldHJhbnNtaXNzaW9uX21vZGUgPSBsMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkJBU0lDCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9DT1NfQ0VEX0JJXzAxX0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9DT1MvQ0VEL0JJLTAxLUMgW1JlamVjdCBVbmtub3duIENvbW1hbmRdCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgcmVqZWN0cyBhbiB1bmtub3duIHNpZ25hbGluZyBjb21tYW5kLgotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLSAgICAgICAgICAgIHJldHJhbnNtaXNzaW9uX21vZGUgPSBsMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkJBU0lDCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNldER5bmFtaWNDaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9cmV0cmFuc21pc3Npb25fbW9kZSkpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jb21wbGV0ZShkdXRfY29ubmVjdGlvbl9zdHJlYW0pCi0gICAgICAgICAgICB0aW1lLnNsZWVwKDUpCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9DT1NfQ0ZEX0JWXzAzX0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9DT1MvQ0ZEL0JWLTAzLUMgW1NlbmQgUmVxdWVzdGVkIE9wdGlvbnNdCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIHJlY2VpdmUgYSBjb25maWd1cmF0aW9uIHJlcXVlc3Qgd2l0aCBubyBvcHRpb25zIGFuZCBzZW5kIHRoZSByZXF1ZXN0ZWQKLSAgICAgICAgb3B0aW9ucyB0byB0aGUgTG93ZXIgVGVzdGVyCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuQkFTSUMKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QocHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1yZXRyYW5zbWlzc2lvbl9tb2RlKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0NPU19DRkRfQlZfMDhfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0NPUy9DRkQvQlYtMDgtQyBbTm9uLWJsb2NraW5nIENvbmZpZyBSZXNwb25zZV0KLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBkb2VzIG5vdCBibG9jayB0cmFuc21pdHRpbmcgTDJDQVBfQ29uZmlnUnNwIHdoaWxlIHdhaXRpbmcgZm9yIEwyQ0FQX0NvbmZpZ1JzcAotICAgICAgICBmcm9tIHRoZSBMb3dlciBUZXN0ZXIuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLk9wZW5DaGFubmVsKAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuT3BlbkNoYW5uZWxSZXF1ZXN0KHJlbW90ZT1zZWxmLnB0c19hZGRyZXNzLCBwc209cHNtKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuQ2xvc2VDaGFubmVsKGwyY2FwX2ZhY2FkZV9wYjIuQ2xvc2VDaGFubmVsUmVxdWVzdChwc209cHNtKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKLQotICAgIGRlZiB0ZXN0X0wyQ0FQX0VSTV9CSV8wMV9DKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgTDJDQVAvRVJNL0JJLTAxLUMgW1MtRnJhbWUgW1JFSl0gTG9zdCBvciBDb3JydXB0ZWRdCi0gICAgICAgIFZlcmlmeSB0aGUgSVVUIGNhbiBoYW5kbGUgcmVjZWlwdCBvZiBhbiBTLT1mcmFtZSBbUlJdIFBvbGwgPSAxIGlmIHRoZSBTLWZyYW1lIFtSRUpdIHNlbnQgZnJvbSB0aGUgSVVUCi0gICAgICAgIGlzIGxvc3QuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYuX2R1dF9jb25uZWN0aW9uX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX3N0cmVhbSwgXAotICAgICAgICAgICAgc2VsZi5fZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtOgotICAgICAgICAgICAgcHNtID0gMQotICAgICAgICAgICAgcmV0cmFuc21pc3Npb25fbW9kZSA9IGwyY2FwX2ZhY2FkZV9wYjIuUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGUuRVJUTQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdChwc209cHNtLCByZXRyYW5zbWlzc2lvbl9tb2RlPXJldHJhbnNtaXNzaW9uX21vZGUpKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY2xvc2UoZHV0X2Nvbm5lY3Rpb25fY2xvc2Vfc3RyZWFtKQotCi0gICAgZGVmIHRlc3RfTDJDQVBfRVJNX0JJXzAzX0Moc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9FUk0vQkktMDMtQyBbSGFuZGxlIER1cGxpY2F0ZSBTLUZyYW1lIFtTUkVKXV0KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0KLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgIHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9bDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2VuZER5bmFtaWNDaGFubmVsUGFja2V0KAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuRHluYW1pY0NoYW5uZWxQYWNrZXQocHNtPXBzbSwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9FUk1fQklfMDRfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0VSTS9CSS0wNC1DIFtIYW5kbGUgUmVjZWlwdCBvZiBTLUZyYW1lIFtSRUpdIGFuZCBTLUZyYW1lIFtSUiwgRj0xXQotICAgICAgICB0aGF0IEJvdGggUmVxdWlyZSBSZXRyYW5zbWlzc2lvbiBvZiB0aGUgU2FtZSBJLUZyYW1lc10KLSAgICAgICAgIiIiCi0gICAgICAgIHdpdGggc2VsZi5fZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKCkgYXMgZHV0X2Nvbm5lY3Rpb25fc3RyZWFtLCBcCi0gICAgICAgICAgICBzZWxmLl9kdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW06Ci0gICAgICAgICAgICBwc20gPSAxCi0KLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2V0RHluYW1pY0NoYW5uZWwoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5TZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgIHBzbT1wc20sIHJldHJhbnNtaXNzaW9uX21vZGU9bDJjYXBfZmFjYWRlX3BiMi5SZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZS5FUlRNKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2NvbXBsZXRlKGR1dF9jb25uZWN0aW9uX3N0cmVhbSkKLSAgICAgICAgICAgIHNlbGYuZGV2aWNlX3VuZGVyX3Rlc3QubDJjYXAuU2VuZER5bmFtaWNDaGFubmVsUGFja2V0KAotICAgICAgICAgICAgICAgIGwyY2FwX2ZhY2FkZV9wYjIuRHluYW1pY0NoYW5uZWxQYWNrZXQocHNtPXBzbSwgcGF5bG9hZD1iJ2FiYycpKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9jbG9zZShkdXRfY29ubmVjdGlvbl9jbG9zZV9zdHJlYW0pCi0KLSAgICBkZWYgdGVzdF9MMkNBUF9FUk1fQklfMDVfQyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0VSTS9CSS0wNS1DIFtIYW5kbGUgcmVjZWlwdCBvZiBTLUZyYW1lIFtSRUpdIGFuZCBJLUZyYW1lIFtGPTFdIHRoYXQKLSAgICAgICAgQm90aCBSZXF1aXJlIFJldHJhbnNtaXNzaW9uIG9mIHRoZSBTYW1lIEktRnJhbWVzXQotICAgICAgICAiIiIKLSAgICAgICAgd2l0aCBzZWxmLl9kdXRfY29ubmVjdGlvbl9zdHJlYW0oKSBhcyBkdXRfY29ubmVjdGlvbl9zdHJlYW0sIFwKLSAgICAgICAgICAgIHNlbGYuX2R1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSgpIGFzIGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbToKLSAgICAgICAgICAgIHBzbSA9IDEKLQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZXREeW5hbWljQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgcHNtPXBzbSwgcmV0cmFuc21pc3Npb25fbW9kZT1sMmNhcF9mYWNhZGVfcGIyLlJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlLkVSVE0pKQotICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fY29tcGxldGUoZHV0X2Nvbm5lY3Rpb25fc3RyZWFtKQotICAgICAgICAgICAgc2VsZi5kZXZpY2VfdW5kZXJfdGVzdC5sMmNhcC5TZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoCi0gICAgICAgICAgICAgICAgbDJjYXBfZmFjYWRlX3BiMi5EeW5hbWljQ2hhbm5lbFBhY2tldChwc209cHNtLCBwYXlsb2FkPWInYWJjJykpCi0gICAgICAgICAgICBzZWxmLmRldmljZV91bmRlcl90ZXN0LmwyY2FwLlNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCgKLSAgICAgICAgICAgICAgICBsMmNhcF9mYWNhZGVfcGIyLkR5bmFtaWNDaGFubmVsUGFja2V0KHBzbT1wc20sIHBheWxvYWQ9YidhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2Nsb3NlKGR1dF9jb25uZWN0aW9uX2Nsb3NlX3N0cmVhbSkKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsLmggYi9nZC9sMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ1YTgyLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2R5bmFtaWNfY2hhbm5lbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLXVzaW5nIER5bmFtaWNDaGFubmVsID0gbDJjYXA6OkR5bmFtaWNDaGFubmVsOwotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9jb25maWd1cmF0aW9uX29wdGlvbi5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfY29uZmlndXJhdGlvbl9vcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ZGUyOS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9jb25maWd1cmF0aW9uX29wdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9tdHUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gT3B0aW9uIHNwZWNpZmllZCBieSBMMkNBUCBDaGFubmVsIHVzZXIgb24gYSBkeW5hbWljIGNoYW5uZWwuIEwyQ0FQIG1vZHVsZSB3aWxsIGNvbmZpZ3VyZSB0aGUgY2hhbm5lbAotICogYmFzZWQgb24gdXNlciBwcm92aWRlZCBvcHRpb24uCi0gKi8KLXN0cnVjdCBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gewotICBlbnVtIGNsYXNzIFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlIHsKLSAgICBMMkNBUF9CQVNJQywKLSAgICBFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTiwKLSAgICBFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTl9PUFRJT05BTCwKLSAgfTsKLSAgLyoqCi0gICAqIFJldHJhbnNtaXNzaW9uIGFuZCBmbG93IGNvbnRyb2wgbW9kZS4gQ3VycmVudGx5IEwyQ0FQX0JBU0lDIGFuZCBFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTi4KLSAgICogSWYgdGhlIHJlbW90ZSBkb2Vzbid0IHN1cHBvcnQgYSBtb2RlLCBpdCBtaWdodCBmYWxsIGJhY2sgdG8gYmFzaWMsIGFzIHRoaXMgaXMgYSBuZWdvdGlhYmxlIG9wdGlvbi4KLSAgICovCi0gIFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlIGNoYW5uZWxfbW9kZSA9IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlOjpMMkNBUF9CQVNJQzsKLQotICAvKioKLSAgICogTWF4aW11bSBTRFUgc2l6ZSB0aGF0IHRoZSBMMkNBUCBDaGFubmVsIHVzZXIgaXMgYWJsZSB0byBwcm9jZXNzLgotICAgKi8KLSAgTXR1IGluY29taW5nX210dSA9IGtEZWZhdWx0Q2xhc3NpY010dTsKLQotICAvKioKLSAgICogTWluaW11bSBNVFUgdGhhdCB3ZSBlbmZvcmNlIHRoZSByZW1vdGUgY2hhbm5lbCB0byBoYXZlCi0gICAqLwotICBNdHUgbWluaW1hbF9yZW1vdGVfbXR1ID0ga01pbmltdW1DbGFzc2ljTXR1OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsX21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjAwODYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLXZvaWQgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0Q2hhbm5lbCgKLSAgICBoY2k6OkFkZHJlc3MgZGV2aWNlLAotICAgIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWd1cmF0aW9uX29wdGlvbiwKLSAgICBQc20gcHNtLAotICAgIE9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW4sCi0gICAgT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrIG9uX2ZhaWxfY2FsbGJhY2spIHsKLSAgaW50ZXJuYWw6Okxpbms6OlBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19jb25uZWN0aW9uewotICAgICAgLm9uX29wZW5fY2FsbGJhY2tfID0gc3RkOjptb3ZlKG9uX2Nvbm5lY3Rpb25fb3BlbiksCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fZmFpbF9jYWxsYmFjayksCi0gICAgICAuY29uZmlndXJhdGlvbl8gPSBjb25maWd1cmF0aW9uX29wdGlvbiwKLSAgfTsKLSAgbDJjYXBfbGF5ZXJfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgIGxpbmtfbWFuYWdlcl8sICZpbnRlcm5hbDo6TGlua01hbmFnZXI6OkNvbm5lY3REeW5hbWljQ2hhbm5lbFNlcnZpY2VzLCBkZXZpY2UsIHN0ZDo6bW92ZShwZW5kaW5nX2Nvbm5lY3Rpb24pLCBwc20pOwotfQotCi12b2lkIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0ZXJTZXJ2aWNlKAotICAgIFBzbSBwc20sCi0gICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICAgIGNvbnN0IGNsYXNzaWM6OlNlY3VyaXR5UG9saWN5JiBzZWN1cml0eV9wb2xpY3ksCi0gICAgT25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSwKLSAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuKSB7Ci0gIGludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsOjpQZW5kaW5nUmVnaXN0cmF0aW9uIHBlbmRpbmdfcmVnaXN0cmF0aW9uewotICAgICAgLnNlY3VyaXR5X3BvbGljeV8gPSBzZWN1cml0eV9wb2xpY3ksCi0gICAgICAub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShvbl9yZWdpc3RyYXRpb25fY29tcGxldGUpLAotICAgICAgLm9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fY29ubmVjdGlvbl9vcGVuKSwKLSAgICAgIC5jb25maWd1cmF0aW9uXyA9IGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICB9OwotICBsMmNhcF9sYXllcl9oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgc2VydmljZV9tYW5hZ2VyXywgJmludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6UmVnaXN0ZXIsIHBzbSwgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCBiL2dkL2wyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlM2FlZS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiY29tbW9uL2NvbnRleHR1YWxfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfY29uZmlndXJhdGlvbl9vcHRpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9zZWN1cml0eV9wb2xpY3kuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLWNsYXNzIEwyY2FwQ2xhc3NpY01vZHVsZTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIExpbmtNYW5hZ2VyOwotY2xhc3MgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotY2xhc3MgRHluYW1pY0NoYW5uZWxNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIGVudW0gY2xhc3MgQ29ubmVjdGlvblJlc3VsdENvZGUgewotICAgIFNVQ0NFU1MgPSAwLAotICAgIEZBSUxfTk9fU0VSVklDRV9SRUdJU1RFUkVEID0gMSwgIC8vIE5vIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZAotICAgIEZBSUxfSENJX0VSUk9SID0gMiwgICAgICAgICAgICAgIC8vIFNlZSBoY2lfZXJyb3IKLSAgICBGQUlMX0wyQ0FQX0VSUk9SID0gMywgICAgICAgICAgICAvLyBTZWUgbDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQKLSAgICBGQUlMX1JFTU9URV9OT1RfU1VQUE9SVCA9IDQsICAgICAvLyBSZW1vdGUgbm90IHN1cHBvcnQgcmVxdWlyZWQgcmV0YW5zbWlzc2lvbiBhbmQgZmxvdyBjb250cm9sIG1vZGUKLSAgICBGQUlMX1NFQ1VSSVRZX0JMT0NLID0gNSwgICAgICAgICAvLyBDYW5ub3QgZW5oYW5jZSByZXF1aXJlZCBzZWN1cml0eSBsZXZlbAotICB9OwotCi0gIHN0cnVjdCBDb25uZWN0aW9uUmVzdWx0IHsKLSAgICBDb25uZWN0aW9uUmVzdWx0Q29kZSBjb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gQ29ubmVjdGlvblJlc3VsdENvZGU6OlNVQ0NFU1M7Ci0gICAgaGNpOjpFcnJvckNvZGUgaGNpX2Vycm9yID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gICAgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0IGwyY2FwX2Nvbm5lY3Rpb25fcmVzcG9uc2VfcmVzdWx0ID0gQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpTVUNDRVNTOwotICB9OwotCi0gIHVzaW5nIE9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayA9IGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbm5lY3Rpb25SZXN1bHQgcmVzdWx0KT47Ci0KLSAgdXNpbmcgT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrID0gY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWw+KT47Ci0KLSAgZW51bSBjbGFzcyBSZWdpc3RyYXRpb25SZXN1bHQgewotICAgIFNVQ0NFU1MgPSAwLAotICAgIEZBSUxfRFVQTElDQVRFX1NFUlZJQ0UgPSAxLCAgLy8gRHVwbGljYXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZvciB0aGUgc2FtZSBQU00KLSAgICBGQUlMX0lOVkFMSURfU0VSVklDRSA9IDIsICAgIC8vIEludmFsaWQgUFNNCi0gIH07Ci0KLSAgdXNpbmcgT25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrID0KLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKFJlZ2lzdHJhdGlvblJlc3VsdCwgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsU2VydmljZT4pPjsKLQotICAvKioKLSAgICogQ29ubmVjdCB0byBhIER5bmFtaWMgY2hhbm5lbCBvbiBhIHJlbW90ZSBkZXZpY2UKLSAgICoKLSAgICogLSBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMKLSAgICogLSBXaGVuIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgY29ubmVjdGlvbiBmYWlscyBpbW1lZGlhdGVseQotICAgKiAtIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCwgbWV0aG9kIGNhbGxlciBzaG91bGQgd2FpdCBmb3Igb25fZmFpbF9jYWxsYmFjayBvciBvbl9vcGVuX2NhbGxiYWNrCi0gICAqIC0gSWYgYW4gQUNMIGNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGFuIEFDTCBjb25uZWN0aW9uCi0gICAqIC0gSWYgSENJIGNvbm5lY3Rpb24gZmFpbGVkLCBvbl9mYWlsX2NhbGxiYWNrIHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggRkFJTF9IQ0lfRVJST1IKLSAgICogLSBJZiBEeW5hbWljIGNoYW5uZWwgb24gYSByZW1vdGUgZGV2aWNlIGlzIGFscmVhZHkgcmVwb3J0ZWQgYXMgY29ubmVjdGVkIHZpYSBvbl9vcGVuX2NhbGxiYWNrLCBpdCB3b24ndCBiZQotICAgKiAgIHJlcG9ydGVkIGFnYWluCi0gICAqCi0gICAqIEBwYXJhbSBkZXZpY2U6IFJlbW90ZSBkZXZpY2UgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBwc206IFNlcnZpY2UgUFNNIHRvIGNvbm5lY3QuIFBTTSBpcyBkZWZpbmVkIGluIENvcmUgc3BlYyBWb2wgMyBQYXJ0IEEgNC4yLgotICAgKiBAcGFyYW0gb25fb3Blbl9jYWxsYmFjazogQSBjYWxsYmFjayB0byBpbmRpY2F0ZSBzdWNjZXNzIG9mIGEgY29ubmVjdGlvbiBpbml0aWF0ZWQgZnJvbSBhIHJlbW90ZSBkZXZpY2UuCi0gICAqIEBwYXJhbSBvbl9mYWlsX2NhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGluZGljYXRlIGNvbm5lY3Rpb24gZmFpbHVyZSBhbG9uZyB3aXRoIGEgc3RhdHVzIGNvZGUuCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uX29wdGlvbjogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhpcyBjaGFubmVsCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdENoYW5uZWwoCi0gICAgICBoY2k6OkFkZHJlc3MgZGV2aWNlLAotICAgICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICAgICAgUHNtIHBzbSwKLSAgICAgIE9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW4sCi0gICAgICBPbkNvbm5lY3Rpb25GYWlsdXJlQ2FsbGJhY2sgb25fZmFpbF9jYWxsYmFjayk7Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byByZWNlaXZlIGluY29taW5nIGNvbm5lY3Rpb25zIGJvdW5kIHRvIGEgc3BlY2lmaWMgY2hhbm5lbC4KLSAgICoKLSAgICogLSBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMuCi0gICAqIC0gV2hlbiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIHJlZ2lzdHJhdGlvbiBmYWlscyBpbW1lZGlhdGVseS4KLSAgICogLSBXaGVuIHRydWUgaXMgcmV0dXJuZWQsIG1ldGhvZCBjYWxsZXIgc2hvdWxkIHdhaXQgZm9yIG9uX3NlcnZpY2VfcmVnaXN0ZXJlZCBjYWxsYmFjayB0aGF0IGNvbnRhaW5zIGEKLSAgICogICBEeW5hbWljQ2hhbm5lbFNlcnZpY2Ugb2JqZWN0LiBUaGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIGNhbiBiZSBtYW5hZ2VkIGZyb20gdGhhdCBvYmplY3QuCi0gICAqIC0gSWYgYSBQU00gaXMgYWxyZWFkeSByZWdpc3RlcmVkIG9yIHNvbWUgb3RoZXIgZXJyb3IgaGFwcGVucywgb25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlIHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggYQotICAgKiAgIG5vbi1TVUNDRVNTIHZhbHVlCi0gICAqIC0gQWZ0ZXIgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQsIGEgRHluYW1pY0NoYW5uZWwgaXMgZGVsaXZlcmVkIHRocm91Z2ggb25fb3Blbl9jYWxsYmFjayB3aGVuIHRoZSByZW1vdGUKLSAgICogICBpbml0aWF0ZXMgYSBjaGFubmVsIG9wZW4gYW5kIGNoYW5uZWwgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotICAgKiAtIG9uX29wZW5fY2FsbGJhY2ssIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYWZ0ZXIgb25fc2VydmljZV9yZWdpc3RlcmVkIGNhbGxiYWNrCi0gICAqCi0gICAqIEBwYXJhbSBzZWN1cml0eV9wb2xpY3k6IFRoZSBzZWN1cml0eSBwb2xpY3kgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBwc206IFNlcnZpY2UgUFNNIHRvIHJlZ2lzdGVyLiBQU00gaXMgZGVmaW5lZCBpbiBDb3JlIHNwZWMgVm9sIDMgUGFydCBBIDQuMi4KLSAgICogQHBhcmFtIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZTogQSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGUgc2VydmljZSBzZXR1cCBoYXMgY29tcGxldGVkLiBJZiB0aGUgcmV0dXJuIHN0YXR1cyBpcwotICAgKiAgICAgICAgbm90IFNVQ0NFU1MsIGl0IG1lYW5zIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgZHVlIHRvIHJlYXNvbnMgbGlrZSBQU00gYWxyZWFkeSB0YWtlCi0gICAqIEBwYXJhbSBvbl9vcGVuX2NhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb2YgYSBjb25uZWN0aW9uIGluaXRpYXRlZCBmcm9tIGEgcmVtb3RlIGRldmljZS4KLSAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25fb3B0aW9uOiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIGNoYW5uZWwKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlclNlcnZpY2UoCi0gICAgICBQc20gcHNtLAotICAgICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICAgICAgY29uc3QgU2VjdXJpdHlQb2xpY3kmIHNlY3VyaXR5X3BvbGljeSwKLSAgICAgIE9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUsCi0gICAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuKTsKLQotICBmcmllbmQgY2xhc3MgTDJjYXBDbGFzc2ljTW9kdWxlOwotCi0gIHZpcnR1YWwgfkR5bmFtaWNDaGFubmVsTWFuYWdlcigpID0gZGVmYXVsdDsKLQotIHByb3RlY3RlZDoKLSAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyKCkgPSBkZWZhdWx0OwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGNvbnN0cnVjdG9yIGlzIG5vdCB0byBiZSB1c2VkIGJ5IHVzZXIgY29kZQotICBEeW5hbWljQ2hhbm5lbE1hbmFnZXIoaW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBzZXJ2aWNlX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TGlua01hbmFnZXIqIGxpbmtfbWFuYWdlciwgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXIpCi0gICAgICA6IHNlcnZpY2VfbWFuYWdlcl8oc2VydmljZV9tYW5hZ2VyKSwgbGlua19tYW5hZ2VyXyhsaW5rX21hbmFnZXIpLCBsMmNhcF9sYXllcl9oYW5kbGVyXyhsMmNhcF9sYXllcl9oYW5kbGVyKSB7Ci0gICAgQVNTRVJUKHNlcnZpY2VfbWFuYWdlcl8gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGxpbmtfbWFuYWdlcl8gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGwyY2FwX2xheWVyX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICB9Ci0gIGludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogc2VydmljZV9tYW5hZ2VyXyA9IG51bGxwdHI7Ci0gIGludGVybmFsOjpMaW5rTWFuYWdlciogbGlua19tYW5hZ2VyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9sYXllcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEeW5hbWljQ2hhbm5lbE1hbmFnZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmRmZWUuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLXZvaWQgRHluYW1pY0NoYW5uZWxTZXJ2aWNlOjpVbnJlZ2lzdGVyKE9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgb25fdW5yZWdpc3RlcmVkKSB7Ci0gIEFTU0VSVF9MT0cobWFuYWdlcl8gIT0gbnVsbHB0ciwgInRoaXMgc2VydmljZSBpcyBpbnZhbGlkIik7Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICBtYW5hZ2VyXywgJmludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6VW5yZWdpc3RlciwgcHNtXywgc3RkOjptb3ZlKG9uX3VucmVnaXN0ZXJlZCkpOwotfQotCi1Qc20gRHluYW1pY0NoYW5uZWxTZXJ2aWNlOjpHZXRQc20oKSBjb25zdCB7Ci0gIHJldHVybiBwc21fOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmggYi9nZC9sMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOThkYjEuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vY29udGV4dHVhbF9jYWxsYmFjay5oIgotI2luY2x1ZGUgImwyY2FwL3BzbS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci19Ci0KLWNsYXNzIER5bmFtaWNDaGFubmVsU2VydmljZSB7Ci0gcHVibGljOgotICBEeW5hbWljQ2hhbm5lbFNlcnZpY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdXNpbmcgT25VbnJlZ2lzdGVyZWRDYWxsYmFjayA9IGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKCk+OwotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVyIGEgc2VydmljZSBmcm9tIEwyQ0FQIG1vZHVsZS4gVGhpcyBvcGVyYXRpb24gY2Fubm90IGZhaWwuCi0gICAqIEFsbCBjaGFubmVscyBvcGVuZWQgZm9yIHRoaXMgc2VydmljZSB3aWxsIGJlIGNsb3NlZC4KLSAgICoKLSAgICogQHBhcmFtIG9uX3VucmVnaXN0ZXJlZCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHVucmVnaXN0cmF0aW9uIGlzIGNvbXBsZXRlCi0gICAqLwotICB2b2lkIFVucmVnaXN0ZXIoT25VbnJlZ2lzdGVyZWRDYWxsYmFjayBvbl91bnJlZ2lzdGVyZWQpOwotCi0gIGZyaWVuZCBpbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci0KLSAgUHNtIEdldFBzbSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBEeW5hbWljQ2hhbm5lbFNlcnZpY2UoUHNtIHBzbSwgaW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBtYW5hZ2VyLCBvczo6SGFuZGxlciogaGFuZGxlcikKLSAgICAgIDogcHNtXyhwc20pLCBtYW5hZ2VyXyhtYW5hZ2VyKSwgbDJjYXBfbGF5ZXJfaGFuZGxlcl8oaGFuZGxlcikgewotICAgIEFTU0VSVChJc1BzbVZhbGlkKHBzbSkpOwotICAgIEFTU0VSVChtYW5hZ2VyXyAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQobDJjYXBfbGF5ZXJfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFBzbSBwc21fID0ga0RlZmF1bHRQc207Ci0gIGludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogbWFuYWdlcl8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcl87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEeW5hbWljQ2hhbm5lbFNlcnZpY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9mYWNhZGUuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ZhY2FkZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjNjQ1Ni4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJncnBjL2dycGNfZXZlbnRfcXVldWUuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZhY2FkZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotdXNpbmcgOjpncnBjOjpTZXJ2ZXJBc3luY1Jlc3BvbnNlV3JpdGVyOwotdXNpbmcgOjpncnBjOjpTZXJ2ZXJBc3luY1dyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQ29udGV4dDsKLQotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1jbGFzcyBMMmNhcENsYXNzaWNNb2R1bGVGYWNhZGVTZXJ2aWNlIDogcHVibGljIEwyY2FwQ2xhc3NpY01vZHVsZUZhY2FkZTo6U2VydmljZSwgcHVibGljIExpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIEwyY2FwQ2xhc3NpY01vZHVsZUZhY2FkZVNlcnZpY2UoTDJjYXBDbGFzc2ljTW9kdWxlKiBsMmNhcF9sYXllciwgb3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyKQotICAgICAgOiBsMmNhcF9sYXllcl8obDJjYXBfbGF5ZXIpLCBmYWNhZGVfaGFuZGxlcl8oZmFjYWRlX2hhbmRsZXIpLCBzZWN1cml0eV9pbnRlcmZhY2VfKG51bGxwdHIpIHsKLSAgICBBU1NFUlQobDJjYXBfbGF5ZXJfICE9IG51bGxwdHIpOwotICAgIEFTU0VSVChmYWNhZGVfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaENvbm5lY3Rpb25Db21wbGV0ZSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPGNsYXNzaWM6OkNvbm5lY3Rpb25Db21wbGV0ZUV2ZW50Piogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHBlbmRpbmdfY29ubmVjdGlvbl9jb21wbGV0ZV8uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hDb25uZWN0aW9uQ2xvc2UoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxjbGFzc2ljOjpDb25uZWN0aW9uQ2xvc2VFdmVudD4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBwZW5kaW5nX2Nvbm5lY3Rpb25fY2xvc2VfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IER5bmFtaWNDaGFubmVsUGFja2V0KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9tYXBfbXV0ZXhfKTsKLSAgICBpZiAoZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmZpbmQocmVxdWVzdC0+cHNtKCkpID09IGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5lbmQoKSkgewotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6RkFJTEVEX1BSRUNPTkRJVElPTiwgIlBzbSBub3QgcmVnaXN0ZXJlZCIpOwotICAgIH0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQocmVxdWVzdC0+cGF5bG9hZCgpLmJlZ2luKCksIHJlcXVlc3QtPnBheWxvYWQoKS5lbmQoKSk7Ci0gICAgaWYgKCFkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF9bcmVxdWVzdC0+cHNtKCldLT5TZW5kUGFja2V0KHBhY2tldCkpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OkZBSUxFRF9QUkVDT05ESVRJT04sICJDaGFubmVsIG5vdCBvcGVuIik7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBPcGVuQ2hhbm5lbCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6T3BlbkNoYW5uZWxSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGF1dG8gc2VydmljZV9oZWxwZXIgPSBkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uZmluZChyZXF1ZXN0LT5wc20oKSk7Ci0gICAgaWYgKHNlcnZpY2VfaGVscGVyID09IGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5lbmQoKSkgewotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6RkFJTEVEX1BSRUNPTkRJVElPTiwgIlBzbSBub3QgcmVnaXN0ZXJlZCIpOwotICAgIH0KLSAgICBoY2k6OkFkZHJlc3MgcGVlcjsKLSAgICBBU1NFUlQoaGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPnJlbW90ZSgpLmFkZHJlc3MoKSwgcGVlcikpOwotICAgIGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1tyZXF1ZXN0LT5wc20oKV0tPkNvbm5lY3QocGVlcik7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIENsb3NlQ2hhbm5lbCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OkNsb3NlQ2hhbm5lbFJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGF1dG8gcHNtID0gcmVxdWVzdC0+cHNtKCk7Ci0gICAgaWYgKGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5maW5kKHJlcXVlc3QtPnBzbSgpKSA9PSBkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uZW5kKCkpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OkZBSUxFRF9QUkVDT05ESVRJT04sICJQc20gbm90IHJlZ2lzdGVyZWQiKTsKLSAgICB9Ci0gICAgZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPkRpc2Nvbm5lY3QoKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hMMmNhcERhdGEoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxjbGFzc2ljOjpMMmNhcFBhY2tldD4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIGF1dG8gc3RhdHVzID0gcGVuZGluZ19sMmNhcF9kYXRhXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2V0RHluYW1pY0NoYW5uZWwoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBTZXRFbmFibGVEeW5hbWljQ2hhbm5lbFJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5lbXBsYWNlKAotICAgICAgICByZXF1ZXN0LT5wc20oKSwgc3RkOjptYWtlX3VuaXF1ZTxMMmNhcER5bmFtaWNDaGFubmVsSGVscGVyPih0aGlzLCBsMmNhcF9sYXllcl8sIGZhY2FkZV9oYW5kbGVyXywgcmVxdWVzdC0+cHNtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnJldHJhbnNtaXNzaW9uX21vZGUoKSkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRUcmFmZmljUGF1c2VkKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgU2V0VHJhZmZpY1BhdXNlZFJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBhdXRvIHBzbSA9IHJlcXVlc3QtPnBzbSgpOwotICAgIGlmIChkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uZmluZChyZXF1ZXN0LT5wc20oKSkgPT0gZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiUHNtIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgfQotICAgIGlmIChyZXF1ZXN0LT5wYXVzZWQoKSkgewotICAgICAgZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPlN1c3BlbmREZXF1ZXVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dLT5SZXN1bWVEZXF1ZXVlKCk7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBHZXRDaGFubmVsUXVldWVEZXB0aCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENoYW5uZWxRdWV1ZURlcHRoUmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgLy8gVXNlIHRoZSB2YWx1ZSBrQ2hhbm5lbFF1ZXVlU2l6ZSAoNSkgaW4gaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGwuaAotICAgIHJlc3BvbnNlLT5zZXRfc2l6ZSg1KTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgSW5pdGlhdGVDb25uZWN0aW9uRm9yU2VjdXJpdHkoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBmYWNhZGU6OkJsdWV0b290aEFkZHJlc3MqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBwZWVyOwotICAgIEFTU0VSVChoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcocmVxdWVzdC0+YWRkcmVzcygpLCBwZWVyKSk7Ci0gICAgb3V0Z29pbmdfcGFpcmluZ19yZW1vdGVfZGV2aWNlc18uaW5zZXJ0KHBlZXIpOwotICAgIHNlY3VyaXR5X2ludGVyZmFjZV8tPkluaXRpYXRlQ29ubmVjdGlvbkZvclNlY3VyaXR5KHBlZXIpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICB2b2lkIFNlY3VyaXR5Q29ubmVjdGlvbkV2ZW50T2NjdXJyZWQoCi0gICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCBoY2k6OkFkZHJlc3MgcmVtb3RlLCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VDYWxsYmFja0V2ZW50VHlwZSBldmVudF90eXBlKSB7Ci0gICAgTGlua1NlY3VyaXR5SW50ZXJmYWNlQ2FsbGJhY2tFdmVudCBtc2c7Ci0gICAgbXNnLm11dGFibGVfYWRkcmVzcygpLT5zZXRfYWRkcmVzcyhyZW1vdGUuVG9TdHJpbmcoKSk7Ci0gICAgbXNnLnNldF9ldmVudF90eXBlKGV2ZW50X3R5cGUpOwotICAgIHNlY3VyaXR5X2Nvbm5lY3Rpb25fZXZlbnRzXy5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEZldGNoU2VjdXJpdHlDb25uZWN0aW9uRXZlbnRzKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnQ+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICBzZWN1cml0eV9pbnRlcmZhY2VfID0gbDJjYXBfbGF5ZXJfLT5HZXRTZWN1cml0eUludGVyZmFjZShmYWNhZGVfaGFuZGxlcl8sIHRoaXMpOwotICAgIHJldHVybiBzZWN1cml0eV9jb25uZWN0aW9uX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2VjdXJpdHlMaW5rSG9sZCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IGZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzcyogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpBZGRyZXNzIHBlZXI7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBhdXRvIGVudHJ5ID0gc2VjdXJpdHlfbGlua19tYXBfLmZpbmQocGVlcik7Ci0gICAgaWYgKGVudHJ5ID09IHNlY3VyaXR5X2xpbmtfbWFwXy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIlVua25vd24gYWRkcmVzcyAnJXMnIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbnRyeS0+c2Vjb25kLT5Ib2xkKCk7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZWN1cml0eUxpbmtFbnN1cmVBdXRoZW50aWNhdGVkKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzKiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBoY2k6OkFkZHJlc3MgcGVlcjsKLSAgICBBU1NFUlQoaGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPmFkZHJlc3MoKSwgcGVlcikpOwotICAgIGF1dG8gZW50cnkgPSBzZWN1cml0eV9saW5rX21hcF8uZmluZChwZWVyKTsKLSAgICBpZiAoZW50cnkgPT0gc2VjdXJpdHlfbGlua19tYXBfLmVuZCgpKSB7Ci0gICAgICBMT0dfV0FSTigiVW5rbm93biBhZGRyZXNzICclcyciLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVudHJ5LT5zZWNvbmQtPkVuc3VyZUF1dGhlbnRpY2F0ZWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlY3VyaXR5TGlua1JlbGVhc2UoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBmYWNhZGU6OkJsdWV0b290aEFkZHJlc3MqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBwZWVyOwotICAgIEFTU0VSVChoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcocmVxdWVzdC0+YWRkcmVzcygpLCBwZWVyKSk7Ci0gICAgb3V0Z29pbmdfcGFpcmluZ19yZW1vdGVfZGV2aWNlc18uZXJhc2UocGVlcik7Ci0gICAgYXV0byBlbnRyeSA9IHNlY3VyaXR5X2xpbmtfbWFwXy5maW5kKHBlZXIpOwotICAgIGlmIChlbnRyeSA9PSBzZWN1cml0eV9saW5rX21hcF8uZW5kKCkpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGFkZHJlc3MgJyVzJyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgZW50cnktPnNlY29uZC0+UmVsZWFzZSgpOwotICAgIH0KLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2VjdXJpdHlMaW5rRGlzY29ubmVjdCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IGZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzcyogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpBZGRyZXNzIHBlZXI7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBvdXRnb2luZ19wYWlyaW5nX3JlbW90ZV9kZXZpY2VzXy5lcmFzZShwZWVyKTsKLSAgICBhdXRvIGVudHJ5ID0gc2VjdXJpdHlfbGlua19tYXBfLmZpbmQocGVlcik7Ci0gICAgaWYgKGVudHJ5ID09IHNlY3VyaXR5X2xpbmtfbWFwXy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIlVua25vd24gYWRkcmVzcyAnJXMnIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbnRyeS0+c2Vjb25kLT5EaXNjb25uZWN0KCk7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICB2b2lkIE9uTGlua0Nvbm5lY3RlZChzdGQ6OnVuaXF1ZV9wdHI8TGlua1NlY3VyaXR5SW50ZXJmYWNlPiBsaW5rKSBvdmVycmlkZSB7Ci0gICAgYXV0byByZW1vdGUgPSBsaW5rLT5HZXRSZW1vdGVBZGRyZXNzKCk7Ci0gICAgaWYgKG91dGdvaW5nX3BhaXJpbmdfcmVtb3RlX2RldmljZXNfLmNvdW50KHJlbW90ZSkgPT0gMSkgewotICAgICAgbGluay0+SG9sZCgpOwotICAgICAgbGluay0+RW5zdXJlQXV0aGVudGljYXRlZCgpOwotICAgICAgb3V0Z29pbmdfcGFpcmluZ19yZW1vdGVfZGV2aWNlc18uZXJhc2UocmVtb3RlKTsKLSAgICB9Ci0gICAgc2VjdXJpdHlfbGlua19tYXBfLmVtcGxhY2UocmVtb3RlLCBzdGQ6Om1vdmUobGluaykpOwotICAgIFNlY3VyaXR5Q29ubmVjdGlvbkV2ZW50T2NjdXJyZWQoCi0gICAgICAgIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCByZW1vdGUsIExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnRUeXBlOjpPTl9DT05ORUNURUQpOwotICB9Ci0KLSAgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoaGNpOjpBZGRyZXNzIHJlbW90ZSkgb3ZlcnJpZGUgewotICAgIGF1dG8gZW50cnkgPSBzZWN1cml0eV9saW5rX21hcF8uZmluZChyZW1vdGUpOwotICAgIGlmIChlbnRyeSA9PSBzZWN1cml0eV9saW5rX21hcF8uZW5kKCkpIHsKLSAgICAgIExPR19XQVJOKCJVbmtub3duIGFkZHJlc3MgJyVzJyIsIHJlbW90ZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbnRyeS0+c2Vjb25kLnJlc2V0KCk7Ci0gICAgc2VjdXJpdHlfbGlua19tYXBfLmVyYXNlKGVudHJ5KTsKLSAgICBTZWN1cml0eUNvbm5lY3Rpb25FdmVudE9jY3VycmVkKAotICAgICAgICBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgcmVtb3RlLCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VDYWxsYmFja0V2ZW50VHlwZTo6T05fRElTQ09OTkVDVEVEKTsKLSAgfQotCi0gIHZvaWQgT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6QWRkcmVzcyByZW1vdGUpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGVudHJ5ID0gc2VjdXJpdHlfbGlua19tYXBfLmZpbmQocmVtb3RlKTsKLSAgICBpZiAoZW50cnkgIT0gc2VjdXJpdHlfbGlua19tYXBfLmVuZCgpKSB7Ci0gICAgICBlbnRyeS0+c2Vjb25kLT5FbnN1cmVFbmNyeXB0ZWQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU2VjdXJpdHlDb25uZWN0aW9uRXZlbnRPY2N1cnJlZCgKLSAgICAgICAgaGNpX3N0YXR1cywgcmVtb3RlLCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VDYWxsYmFja0V2ZW50VHlwZTo6T05fQVVUSEVOVElDQVRJT05fQ09NUExFVEUpOwotICB9Ci0KLSAgdm9pZCBPbkVuY3J5cHRpb25DaGFuZ2UoaGNpOjpBZGRyZXNzIHJlbW90ZSwgYm9vbCBlbmNyeXB0ZWQpIG92ZXJyaWRlIHsKLSAgICBTZWN1cml0eUNvbm5lY3Rpb25FdmVudE9jY3VycmVkKAotICAgICAgICBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgcmVtb3RlLCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VDYWxsYmFja0V2ZW50VHlwZTo6T05fRU5DUllQVElPTl9DSEFOR0UpOwotICB9Ci0KLSAgY2xhc3MgTDJjYXBEeW5hbWljQ2hhbm5lbEhlbHBlciB7Ci0gICBwdWJsaWM6Ci0gICAgTDJjYXBEeW5hbWljQ2hhbm5lbEhlbHBlcihMMmNhcENsYXNzaWNNb2R1bGVGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlLCBMMmNhcENsYXNzaWNNb2R1bGUqIGwyY2FwX2xheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsIFBzbSBwc20sIFJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlIG1vZGUpCi0gICAgICAgIDogZmFjYWRlX3NlcnZpY2VfKHNlcnZpY2UpLCBsMmNhcF9sYXllcl8obDJjYXBfbGF5ZXIpLCBoYW5kbGVyXyhoYW5kbGVyKSwgcHNtXyhwc20pLCBtb2RlXyhtb2RlKSB7Ci0gICAgICBkeW5hbWljX2NoYW5uZWxfbWFuYWdlcl8gPSBsMmNhcF9sYXllcl8tPkdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpOwotICAgICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uID0ge307Ci0gICAgICBjb25maWd1cmF0aW9uX29wdGlvbi5jaGFubmVsX21vZGUgPSAoRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uOjpSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZSltb2RlOwotICAgICAgZHluYW1pY19jaGFubmVsX21hbmFnZXJfLT5SZWdpc3RlclNlcnZpY2UoCi0gICAgICAgICAgcHNtLAotICAgICAgICAgIGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICAgICAgICAgIFNlY3VyaXR5UG9saWN5OjpfU0RQX09OTFlfTk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LLAotICAgICAgICAgIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZMMmNhcER5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9sMmNhcF9zZXJ2aWNlX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSksCi0gICAgICAgICAgaGFuZGxlcl8tPkJpbmRPbih0aGlzLCAmTDJjYXBEeW5hbWljQ2hhbm5lbEhlbHBlcjo6b25fY29ubmVjdGlvbl9vcGVuKSk7Ci0gICAgfQotCi0gICAgfkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXIoKSB7Ci0gICAgICBpZiAoZGVxdWV1ZV9yZWdpc3RlcmVkXykgewotICAgICAgICBjaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgICAgICBjaGFubmVsXyA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8ucmVzZXQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbm5lY3QoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICAgIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWd1cmF0aW9uX29wdGlvbiA9IGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24oKTsKLSAgICAgIGNvbmZpZ3VyYXRpb25fb3B0aW9uLmNoYW5uZWxfbW9kZSA9IChEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb246OlJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlKW1vZGVfOwotCi0gICAgICBkeW5hbWljX2NoYW5uZWxfbWFuYWdlcl8tPkNvbm5lY3RDaGFubmVsKAotICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgY29uZmlndXJhdGlvbl9vcHRpb24sCi0gICAgICAgICAgcHNtXywKLSAgICAgICAgICBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZMMmNhcER5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9jb25uZWN0aW9uX29wZW4pLAotICAgICAgICAgIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZMMmNhcER5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9jb25uZWN0X2ZhaWwpKTsKLSAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhjaGFubmVsX29wZW5fY3ZfbXV0ZXhfKTsKLSAgICAgIGlmICghY2hhbm5lbF9vcGVuX2N2Xy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6c2Vjb25kcygyKSwgW3RoaXNdIHsgcmV0dXJuIGNoYW5uZWxfICE9IG51bGxwdHI7IH0pKSB7Ci0gICAgICAgIExPR19XQVJOKCJDaGFubmVsIGlzIG5vdCBvcGVuIGZvciBwc20gJWQiLCBwc21fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIERpc2Nvbm5lY3QoKSB7Ci0gICAgICBpZiAoY2hhbm5lbF8gPT0gbnVsbHB0cikgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9vcGVuX2N2X211dGV4Xyk7Ci0gICAgICAgIGlmICghY2hhbm5lbF9vcGVuX2N2Xy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6c2Vjb25kcygyKSwgW3RoaXNdIHsgcmV0dXJuIGNoYW5uZWxfICE9IG51bGxwdHI7IH0pKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIkNoYW5uZWwgaXMgbm90IG9wZW4gZm9yIHBzbSAlZCIsIHBzbV8pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2hhbm5lbF8tPkNsb3NlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBvbl9sMmNhcF9zZXJ2aWNlX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZShEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdCByZWdpc3RyYXRpb25fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsU2VydmljZT4gc2VydmljZSkge30KLQotICAgIC8vIGludm9rZWQgZnJvbSBGYWNhZGUgSGFuZGxlcgotICAgIHZvaWQgb25fY29ubmVjdGlvbl9vcGVuKHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgQ29ubmVjdGlvbkNvbXBsZXRlRXZlbnQgZXZlbnQ7Ci0gICAgICBldmVudC5tdXRhYmxlX3JlbW90ZSgpLT5zZXRfYWRkcmVzcyhjaGFubmVsLT5HZXREZXZpY2UoKS5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKSk7Ci0gICAgICBmYWNhZGVfc2VydmljZV8tPnBlbmRpbmdfY29ubmVjdGlvbl9jb21wbGV0ZV8uT25JbmNvbWluZ0V2ZW50KGV2ZW50KTsKLSAgICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgICBjaGFubmVsXyA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgZW5xdWV1ZV9idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6RW5xdWV1ZUJ1ZmZlcjxCYXNlUGFja2V0QnVpbGRlcj4+KGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCkpOwotICAgICAgfQotICAgICAgY2hhbm5lbF9vcGVuX2N2Xy5ub3RpZnlfYWxsKCk7Ci0gICAgICBjaGFubmVsXy0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICAgICAgZmFjYWRlX3NlcnZpY2VfLT5mYWNhZGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2Nsb3NlX2NhbGxiYWNrKSk7Ci0gICAgICBkZXF1ZXVlX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgICAgIGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgICBmYWNhZGVfc2VydmljZV8tPmZhY2FkZV9oYW5kbGVyXywKLSAgICAgICAgICBjb21tb246OkJpbmQoJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2luY29taW5nX3BhY2tldCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbl9jbG9zZV9jYWxsYmFjayhoY2k6OkVycm9yQ29kZSBlcnJvcl9jb2RlKSB7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhjaGFubmVsX29wZW5fY3ZfbXV0ZXhfKTsKLSAgICAgICAgaWYgKGRlcXVldWVfcmVnaXN0ZXJlZF8uZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICAgICAgY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2xhc3NpYzo6Q29ubmVjdGlvbkNsb3NlRXZlbnQgZXZlbnQ7Ci0gICAgICBldmVudC5tdXRhYmxlX3JlbW90ZSgpLT5zZXRfYWRkcmVzcyhjaGFubmVsXy0+R2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpLlRvU3RyaW5nKCkpOwotICAgICAgZXZlbnQuc2V0X3JlYXNvbihzdGF0aWNfY2FzdDx1aW50MzJfdD4oZXJyb3JfY29kZSkpOwotICAgICAgZmFjYWRlX3NlcnZpY2VfLT5wZW5kaW5nX2Nvbm5lY3Rpb25fY2xvc2VfLk9uSW5jb21pbmdFdmVudChldmVudCk7Ci0gICAgICBjaGFubmVsXyA9IG51bGxwdHI7Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8ucmVzZXQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIFN1c3BlbmREZXF1ZXVlKCkgewotICAgICAgaWYgKGRlcXVldWVfcmVnaXN0ZXJlZF8uZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICAgIGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBSZXN1bWVEZXF1ZXVlKCkgewotICAgICAgaWYgKCFkZXF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKHRydWUpKSB7Ci0gICAgICAgIGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgICAgIGZhY2FkZV9zZXJ2aWNlXy0+ZmFjYWRlX2hhbmRsZXJfLAotICAgICAgICAgICAgY29tbW9uOjpCaW5kKCZMMmNhcER5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9pbmNvbWluZ19wYWNrZXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25fY29ubmVjdF9mYWlsKER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHt9Ci0KLSAgICB2b2lkIG9uX2luY29taW5nX3BhY2tldCgpIHsKLSAgICAgIGF1dG8gcGFja2V0ID0gY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICAgICAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0gICAgICBMMmNhcFBhY2tldCBsMmNhcF9kYXRhOwotICAgICAgbDJjYXBfZGF0YS5zZXRfcHNtKHBzbV8pOwotICAgICAgbDJjYXBfZGF0YS5zZXRfcGF5bG9hZChkYXRhKTsKLSAgICAgIGZhY2FkZV9zZXJ2aWNlXy0+cGVuZGluZ19sMmNhcF9kYXRhXy5PbkluY29taW5nRXZlbnQobDJjYXBfZGF0YSk7Ci0gICAgfQotCi0gICAgYm9vbCBTZW5kUGFja2V0KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCkgewotICAgICAgaWYgKGNoYW5uZWxfID09IG51bGxwdHIpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgICBpZiAoIWNoYW5uZWxfb3Blbl9jdl8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86OnNlY29uZHMoMiksIFt0aGlzXSB7IHJldHVybiBjaGFubmVsXyAhPSBudWxscHRyOyB9KSkgewotICAgICAgICAgIExPR19XQVJOKCJDaGFubmVsIGlzIG5vdCBvcGVuIik7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhdXRvIHBhY2tldF9vbmUgPSBzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UmF3QnVpbGRlcj4oMjAwMCk7Ci0gICAgICBwYWNrZXRfb25lLT5BZGRPY3RldHMocGFja2V0KTsKLSAgICAgIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUocGFja2V0X29uZSksIGhhbmRsZXJfKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBMMmNhcENsYXNzaWNNb2R1bGVGYWNhZGVTZXJ2aWNlKiBmYWNhZGVfc2VydmljZV87Ci0gICAgTDJjYXBDbGFzc2ljTW9kdWxlKiBsMmNhcF9sYXllcl87Ci0gICAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbE1hbmFnZXI+IGR5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxTZXJ2aWNlPiBzZXJ2aWNlXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWw+IGNoYW5uZWxfID0gbnVsbHB0cjsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8b3M6OkVucXVldWVCdWZmZXI8QmFzZVBhY2tldEJ1aWxkZXI+PiBlbnF1ZXVlX2J1ZmZlcl8gPSBudWxscHRyOwotICAgIFBzbSBwc21fOwotICAgIFJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlIG1vZGVfID0gUmV0cmFuc21pc3Npb25GbG93Q29udHJvbE1vZGU6OkJBU0lDOwotICAgIHN0ZDo6YXRvbWljX2Jvb2wgZGVxdWV1ZV9yZWdpc3RlcmVkXyA9IGZhbHNlOwotICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNoYW5uZWxfb3Blbl9jdl87Ci0gICAgc3RkOjptdXRleCBjaGFubmVsX29wZW5fY3ZfbXV0ZXhfOwotICB9OwotCi0gIEwyY2FwQ2xhc3NpY01vZHVsZSogbDJjYXBfbGF5ZXJfOwotICA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyXzsKLSAgc3RkOjptdXRleCBjaGFubmVsX21hcF9tdXRleF87Ci0gIHN0ZDo6bWFwPFBzbSwgc3RkOjp1bmlxdWVfcHRyPEwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI+PiBkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxjbGFzc2ljOjpDb25uZWN0aW9uQ29tcGxldGVFdmVudD4gcGVuZGluZ19jb25uZWN0aW9uX2NvbXBsZXRlX3sKLSAgICAgICJGZXRjaENvbm5lY3Rpb25Db21wbGV0ZSJ9OwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0V2ZW50UXVldWU8Y2xhc3NpYzo6Q29ubmVjdGlvbkNsb3NlRXZlbnQ+IHBlbmRpbmdfY29ubmVjdGlvbl9jbG9zZV97IkZldGNoQ29ubmVjdGlvbkNsb3NlIn07Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxMMmNhcFBhY2tldD4gcGVuZGluZ19sMmNhcF9kYXRhX3siRmV0Y2hMMmNhcERhdGEifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnQ+IHNlY3VyaXR5X2Nvbm5lY3Rpb25fZXZlbnRzX3sKLSAgICAgICJTZWN1cml0eSBDb25uZWN0aW9uIEV2ZW50cyJ9OwotICBTZWN1cml0eUludGVyZmFjZSogc2VjdXJpdHlfaW50ZXJmYWNlXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpjbGFzc2ljOjpMaW5rU2VjdXJpdHlJbnRlcmZhY2U+PiBzZWN1cml0eV9saW5rX21hcF87Ci0gIHN0ZDo6c2V0PGhjaTo6QWRkcmVzcz4gb3V0Z29pbmdfcGFpcmluZ19yZW1vdGVfZGV2aWNlc187Ci19OwotCi12b2lkIEwyY2FwQ2xhc3NpY01vZHVsZUZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKGxpc3QpOwotICBsaXN0LT5hZGQ8bDJjYXA6OmNsYXNzaWM6OkwyY2FwQ2xhc3NpY01vZHVsZT4oKTsKLX0KLQotdm9pZCBMMmNhcENsYXNzaWNNb2R1bGVGYWNhZGVNb2R1bGU6OlN0YXJ0KCkgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RhcnQoKTsKLSAgc2VydmljZV8gPSBuZXcgTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PGwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGU+KCksIEdldEhhbmRsZXIoKSk7Ci19Ci0KLXZvaWQgTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlTW9kdWxlOjpTdG9wKCkgewotICBkZWxldGUgc2VydmljZV87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdG9wKCk7Ci19Ci0KLTo6Z3JwYzo6U2VydmljZSogTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlTW9kdWxlOjpHZXRTZXJ2aWNlKCkgY29uc3QgewotICByZXR1cm4gc2VydmljZV87Ci19Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlTW9kdWxlOjpGYWN0b3J5ID0KLSAgICA6OmJsdWV0b290aDo6TW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBMMmNhcENsYXNzaWNNb2R1bGVGYWNhZGVNb2R1bGUoKTsgfSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZmFjYWRlLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ZhY2FkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk5ZDFlLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZmFjYWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxncnBjKysvZ3JwYysrLmg+Ci0KLSNpbmNsdWRlICJncnBjL2dycGNfbW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLQotY2xhc3MgTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlU2VydmljZTsKLQotY2xhc3MgTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlTW9kdWxlIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgTDJjYXBDbGFzc2ljTW9kdWxlRmFjYWRlU2VydmljZSogc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ZhY2FkZS5wcm90byBiL2dkL2wyY2FwL2NsYXNzaWMvZmFjYWRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2MyMDRmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZmFjYWRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGJsdWV0b290aC5sMmNhcC5jbGFzc2ljOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byI7Ci1pbXBvcnQgImZhY2FkZS9jb21tb24ucHJvdG8iOwotCi1zZXJ2aWNlIEwyY2FwQ2xhc3NpY01vZHVsZUZhY2FkZSB7Ci0gIHJwYyBGZXRjaENvbm5lY3Rpb25Db21wbGV0ZShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBDb25uZWN0aW9uQ29tcGxldGVFdmVudCkgewotICAgIC8vIFRlc3RpbmcgQW5kcm9pZCBCbHVldG9vdGggc3RhY2sgb25seS4gT3B0aW9uYWwgZm9yIG90aGVyIHN0YWNrLgotICB9Ci0gIHJwYyBGZXRjaENvbm5lY3Rpb25DbG9zZShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBDb25uZWN0aW9uQ2xvc2VFdmVudCkgewotICAgIC8vIFRlc3RpbmcgQW5kcm9pZCBCbHVldG9vdGggc3RhY2sgb25seS4gT3B0aW9uYWwgZm9yIG90aGVyIHN0YWNrLgotICB9Ci0gIHJwYyBPcGVuQ2hhbm5lbChPcGVuQ2hhbm5lbFJlcXVlc3QpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIENsb3NlQ2hhbm5lbChDbG9zZUNoYW5uZWxSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBGZXRjaEwyY2FwRGF0YShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBMMmNhcFBhY2tldCkge30KLSAgcnBjIFNldER5bmFtaWNDaGFubmVsKFNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2VuZER5bmFtaWNDaGFubmVsUGFja2V0KER5bmFtaWNDaGFubmVsUGFja2V0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZXRUcmFmZmljUGF1c2VkKFNldFRyYWZmaWNQYXVzZWRSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBHZXRDaGFubmVsUXVldWVEZXB0aChnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKEdldENoYW5uZWxRdWV1ZURlcHRoUmVzcG9uc2UpIHsKLSAgICAvLyBHZXQgdGhlIGJ1ZmZlciBzaXplIG9mIGNoYW5uZWwgcXVldWUgZW5kIGZvciBMMkNBUCB1c2VyIChob3cgbWFueSBwYWNrZXRzIHdlIGNhbiBidWZmZXIKLSAgICAvLyBiZWZvcmUgTDJDQVAgdXNlciBkZXF1ZXVlcy4KLSAgfQotICBycGMgSW5pdGlhdGVDb25uZWN0aW9uRm9yU2VjdXJpdHkoZmFjYWRlLkJsdWV0b290aEFkZHJlc3MpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEZldGNoU2VjdXJpdHlDb25uZWN0aW9uRXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnQpIHt9Ci0gIHJwYyBTZWN1cml0eUxpbmtFbnN1cmVBdXRoZW50aWNhdGVkKGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZWN1cml0eUxpbmtIb2xkKGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZWN1cml0eUxpbmtEaXNjb25uZWN0KGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZWN1cml0eUxpbmtSZWxlYXNlKGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci19Ci0KLWVudW0gTGlua1NlY3VyaXR5SW50ZXJmYWNlQ2FsbGJhY2tFdmVudFR5cGUgewotICBPTl9DT05ORUNURUQgPSAwOwotICBPTl9ESVNDT05ORUNURUQgPSAxOwotICBPTl9BVVRIRU5USUNBVElPTl9DT01QTEVURSA9IDI7Ci0gIE9OX0VOQ1JZUFRJT05fQ0hBTkdFID0gMzsKLSAgT05fUkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPID0gNDsKLSAgT05fUkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVMgPSA1OwotfQotCi1tZXNzYWdlIExpbmtTZWN1cml0eUludGVyZmFjZUNhbGxiYWNrRXZlbnQgewotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzcyBhZGRyZXNzID0gMTsKLSAgTGlua1NlY3VyaXR5SW50ZXJmYWNlQ2FsbGJhY2tFdmVudFR5cGUgZXZlbnRfdHlwZSA9IDI7Ci19Ci0KLW1lc3NhZ2UgUmVnaXN0ZXJDaGFubmVsUmVxdWVzdCB7Ci0gIHVpbnQzMiBjaGFubmVsID0gMTsKLX0KLQotbWVzc2FnZSBDb25uZWN0aW9uQ29tcGxldGVFdmVudCB7Ci0gIGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzIHJlbW90ZSA9IDE7Ci19Ci0KLW1lc3NhZ2UgQ29ubmVjdGlvbkNsb3NlRXZlbnQgewotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzcyByZW1vdGUgPSAxOwotICB1aW50MzIgcmVhc29uID0gMjsKLX0KLQotZW51bSBSZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZSB7Ci0gIEJBU0lDID0gMDsKLSAgRVJUTSA9IDE7Ci0gIEVSVE1fT1BUSU9OQUwgPSAyOwotfQotCi1tZXNzYWdlIE9wZW5DaGFubmVsUmVxdWVzdCB7Ci0gIGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzIHJlbW90ZSA9IDE7Ci0gIHVpbnQzMiBwc20gPSAyOwotICBSZXRyYW5zbWlzc2lvbkZsb3dDb250cm9sTW9kZSBtb2RlID0gMzsKLX0KLQotbWVzc2FnZSBDbG9zZUNoYW5uZWxSZXF1ZXN0IHsKLSAgdWludDMyIHBzbSA9IDE7Ci19Ci0KLWVudW0gQ2hhbm5lbFNpZ25hbEV2ZW50VHlwZSB7Ci0gIE9QRU4gPSAwOwotICBDTE9TRSA9IDE7Ci0gIENPTkZJR1VSRSA9IDI7Ci19Ci0KLW1lc3NhZ2UgQ2hhbm5lbFNpZ25hbEV2ZW50IHsKLSAgdWludDMyIGNpZCA9IDE7Ci0gIENoYW5uZWxTaWduYWxFdmVudFR5cGUgdHlwZSA9IDI7Ci19Ci0KLWVudW0gU2VuZEwyY2FwUGFja2V0UmVzdWx0VHlwZSB7Ci0gIE9LID0gMDsKLSAgQkFEX0NJRCA9IDE7Ci19Ci0KLW1lc3NhZ2UgU2VuZEwyY2FwUGFja2V0UmVzdWx0IHsKLSAgU2VuZEwyY2FwUGFja2V0UmVzdWx0VHlwZSByZXN1bHRfdHlwZSA9IDE7Ci19Ci0KLW1lc3NhZ2UgTDJjYXBQYWNrZXQgewotICBvbmVvZiBjaGFubmVsX3R5cGUgewotICAgIHVpbnQzMiBwc20gPSAxOwotICAgIHVpbnQzMiBmaXhlZF9jaWQgPSAyOwotICB9Ci0gIGJ5dGVzIHBheWxvYWQgPSAzOwotfQotCi1tZXNzYWdlIFNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCB7Ci0gIHVpbnQzMiBwc20gPSAxOwotICBib29sIGVuYWJsZSA9IDI7Ci0gIFJldHJhbnNtaXNzaW9uRmxvd0NvbnRyb2xNb2RlIHJldHJhbnNtaXNzaW9uX21vZGUgPSAzOwotfQotCi1tZXNzYWdlIER5bmFtaWNDaGFubmVsUGFja2V0IHsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3MgcmVtb3RlID0gMTsKLSAgdWludDMyIHBzbSA9IDI7Ci0gIGJ5dGVzIHBheWxvYWQgPSAzOwotfQotCi1tZXNzYWdlIFNldFRyYWZmaWNQYXVzZWRSZXF1ZXN0IHsKLSAgYm9vbCBwYXVzZWQgPSAxOwotICB1aW50MzIgcHNtID0gMjsKLX0KLQotbWVzc2FnZSBHZXRDaGFubmVsUXVldWVEZXB0aFJlc3BvbnNlIHsKLSAgdWludDMyIHNpemUgPSAxOwotfQotCi1lbnVtIENsYXNzaWNTZWN1cml0eVBvbGljeSB7Ci0gIEVOQ1JZUFRFRF9UUkFOU1BPUlQgPSAwOwotICBBVVRIRU5USUNBVEVEX0VOQ1JZUFRFRF9UUkFOU1BPUlQgPSAxOwotICBCRVNUID0gMjsKLSAgX1NEUF9PTkxZX05PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSyA9IDM7Ci19CmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MGQxMTkuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1oY2k6OkFkZHJlc3MgRml4ZWRDaGFubmVsOjpHZXREZXZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+R2V0RGV2aWNlKCk7Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsOjpSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyLCBGaXhlZENoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjaykgewotICBsMmNhcF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbDo6UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2ssIGltcGxfLCB1c2VyX2hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG9uX2Nsb3NlX2NhbGxiYWNrKSkpOwotfQotCi12b2lkIEZpeGVkQ2hhbm5lbDo6QWNxdWlyZSgpIHsKLSAgbDJjYXBfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbEltcGw6OkFjcXVpcmUsIGltcGxfKSk7Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsOjpSZWxlYXNlKCkgewotICBsMmNhcF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbDo6UmVsZWFzZSwgaW1wbF8pKTsKLX0KLQotY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlciwgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+KgotRml4ZWRDaGFubmVsOjpHZXRRdWV1ZVVwRW5kKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPkdldFF1ZXVlVXBFbmQoKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuaCBiL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjg4ZTNkLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgRml4ZWRDaGFubmVsSW1wbDsKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vKioKLSAqIEwyQ0FQIGZpeGVkIGNoYW5uZWwgb2JqZWN0LiBXaGVuIGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkLCBpdCBtdXN0IGJlCi0gKiBhY3F1aXJlZCB0aHJvdWdoIGNhbGxpbmcge0BsaW5rIEZpeGVkQ2hhbm5lbCNBY3F1aXJlKCl9IHdpdGhpbiBYIHNlY29uZHMuCi0gKiBPdGhlcndpc2UsIHtAbGluayBGaXhlZENoYW5uZWwjUmVsZWFzZSgpfSB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5LgotICoKLSAqLwotY2xhc3MgRml4ZWRDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIC8vIFNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IG1vZHVsZXMgdGhhdCBoYXZlIGFjY2VzcyB0byBMaW5rTWFuYWdlcgotICBGaXhlZENoYW5uZWwoc3RkOjpzaGFyZWRfcHRyPGludGVybmFsOjpGaXhlZENoYW5uZWxJbXBsPiBpbXBsLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcikKLSAgICAgIDogaW1wbF8oc3RkOjptb3ZlKGltcGwpKSwgbDJjYXBfaGFuZGxlcl8obDJjYXBfaGFuZGxlcikgewotICAgIEFTU0VSVChpbXBsXyAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQobDJjYXBfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLQotICBoY2k6OkFkZHJlc3MgR2V0RGV2aWNlKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGNsb3NlIGNhbGxiYWNrLiBJZiBjbG9zZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCB3aGVuIGEgY2hhbm5lbCBpcyBjbG9zZWQsIHRoZSBjaGFubmVsJ3MgcmVzb3VyY2Ugd2lsbAotICAgKiBvbmx5IGJlIGZyZWVkIGFmdGVyIG9uX2Nsb3NlIGNhbGxiYWNrIGlzIGludm9rZWQuIE90aGVyd2lzZSwgaWYgbm8gb25fY2xvc2UgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgdGhlIGNoYW5uZWwncwotICAgKiByZXNvdXJjZSB3aWxsIGJlIGZyZWVkIGltbWVkaWF0ZWx5IGFmdGVyIGNsb3NpbmcuCi0gICAqCi0gICAqIEBwYXJhbSB1c2VyX2hhbmRsZXIgVGhlIGhhbmRsZXIgdXNlZCB0byBpbnZva2UgdGhlIGNhbGxiYWNrIG9uCi0gICAqIEBwYXJhbSBvbl9jbG9zZV9jYWxsYmFjayBUaGUgY2FsbGJhY2sgaW52b2tlZCB1cG9uIGNoYW5uZWwgY2xvc2luZy4KLSAgICovCi0gIHVzaW5nIE9uQ2xvc2VDYWxsYmFjayA9IGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQoaGNpOjpFcnJvckNvZGUpPjsKLSAgdm9pZCBSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyLCBPbkNsb3NlQ2FsbGJhY2sgb25fY2xvc2VfY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgRml4ZWQgQ2hhbm5lbCBpcyBiZWluZyB1c2VkLiBUaGlzIHdpbGwgcHJldmVudCBBQ0wgY29ubmVjdGlvbiBmcm9tIGJlaW5nIGRpc2Nvbm5lY3RlZC4KLSAgICovCi0gIHZvaWQgQWNxdWlyZSgpOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgRml4ZWQgQ2hhbm5lbCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZC4gQUNMIGNvbm5lY3Rpb24gd2lsbCBiZSBkaXNjb25uZWN0ZWQgYWZ0ZXIKLSAgICoga0xpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQgaWYgbm8gb3RoZXIgRHluYW1pY0NoYW5uZWwgaXMgY29ubmVjdGVkIG9yIG5vIG90aGVyIEZpeGVkIENoYW5uZWwgaXMgIHVzaW5nIHRoaXMKLSAgICogQUNMIGNvbm5lY3Rpb24uIEhvd2V2ZXIgYSBtb2R1bGUgY2FuIHN0aWxsIHJlY2VpdmUgZGF0YSBvbiB0aGlzIGNoYW5uZWwgYXMgbG9uZyBhcyBpdCByZW1haW5zIG9wZW4uCi0gICAqLwotICB2b2lkIFJlbGVhc2UoKTsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgZGF0YSBjaGFubmVsIHF1ZXVlIHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KLSAgICoKLSAgICoge0BzZWUgQmlkaVF1ZXVlRW5kfQotICAgKgotICAgKiBAcmV0dXJuIFRoZSB1cHBlciBlbmQgb2YgYSBiaS1kaXJlY3Rpb25hbCBxdWV1ZS4KLSAgICovCi0gIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXIsIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+PiogR2V0UXVldWVVcEVuZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPGludGVybmFsOjpGaXhlZENoYW5uZWxJbXBsPiBpbXBsXzsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXIuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlNzhiZC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLWJvb2wgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdFNlcnZpY2VzKGhjaTo6QWRkcmVzcyBkZXZpY2UsIE9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgaW50ZXJuYWw6OkxpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnsKLSAgICAgIC5oYW5kbGVyXyA9IGhhbmRsZXIsCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fZmFpbF9jYWxsYmFjayksCi0gIH07Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpMaW5rTWFuYWdlcjo6Q29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChsaW5rX21hbmFnZXJfKSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0ZXJTZXJ2aWNlKENpZCBjaWQsIE9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBpbnRlcm5hbDo6Rml4ZWRDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAudXNlcl9oYW5kbGVyXyA9IGhhbmRsZXIsCi0gICAgICAub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShvbl9yZWdpc3RyYXRpb25fY29tcGxldGUpLAotICAgICAgLm9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fY29ubmVjdGlvbl9vcGVuKX07Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlJlZ2lzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZXJ2aWNlX21hbmFnZXJfKSwgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbikpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzI4NWU3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1jbGFzcyBMMmNhcENsYXNzaWNNb2R1bGU7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLWNsYXNzIE1vY2tGaXhlZENoYW5uZWxNYW5hZ2VyOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgTGlua01hbmFnZXI7Ci1jbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotY2xhc3MgRml4ZWRDaGFubmVsTWFuYWdlciB7Ci0gcHVibGljOgotICBlbnVtIGNsYXNzIENvbm5lY3Rpb25SZXN1bHRDb2RlIHsKLSAgICBTVUNDRVNTID0gMCwKLSAgICBGQUlMX05PX1NFUlZJQ0VfUkVHSVNURVJFRCA9IDEsICAgICAgLy8gTm8gc2VydmljZSBpcyByZWdpc3RlcmVkCi0gICAgRkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMID0gMiwgIC8vIEFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGFscmVhZHkgaGF2ZSBhIGNoYW5uZWwKLSAgICBGQUlMX0hDSV9FUlJPUiA9IDMsICAgICAgICAgICAgICAgICAgLy8gU2VlIGhjaV9lcnJvcgotICB9OwotCi0gIHN0cnVjdCBDb25uZWN0aW9uUmVzdWx0IHsKLSAgICBDb25uZWN0aW9uUmVzdWx0Q29kZSBjb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gQ29ubmVjdGlvblJlc3VsdENvZGU6OlNVQ0NFU1M7Ci0gICAgaGNpOjpFcnJvckNvZGUgaGNpX2Vycm9yID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIH07Ci0gIC8qKgotICAgKiBPbkNvbm5lY3Rpb25GYWlsdXJlQ2FsbGJhY2soc3RkOjpzdHJpbmcgZmFpbHVyZV9yZWFzb24pOwotICAgKi8KLSAgdXNpbmcgT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrID0gY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCk+OwotCi0gIC8qKgotICAgKiBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2soRml4ZWRDaGFubmVsIGNoYW5uZWwpOwotICAgKi8KLSAgdXNpbmcgT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrID0gY29tbW9uOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+KT47Ci0KLSAgZW51bSBjbGFzcyBSZWdpc3RyYXRpb25SZXN1bHQgewotICAgIFNVQ0NFU1MgPSAwLAotICAgIEZBSUxfRFVQTElDQVRFX1NFUlZJQ0UgPSAxLCAgLy8gRHVwbGljYXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZvciB0aGUgc2FtZSBDSUQKLSAgICBGQUlMX0lOVkFMSURfU0VSVklDRSA9IDIsICAgIC8vIEludmFsaWQgQ0lECi0gIH07Ci0KLSAgLyoqCi0gICAqIE9uUmVnaXN0cmF0aW9uRmFpbHVyZUNhbGxiYWNrKFJlZ2lzdHJhdGlvblJlc3VsdCByZXN1bHQsIEZpeGVkQ2hhbm5lbFNlcnZpY2Ugc2VydmljZSk7Ci0gICAqLwotICB1c2luZyBPblJlZ2lzdHJhdGlvbkNvbXBsZXRlQ2FsbGJhY2sgPQotICAgICAgY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChSZWdpc3RyYXRpb25SZXN1bHQsIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxTZXJ2aWNlPik+OwotCi0gIC8qKgotICAgKiBDb25uZWN0IHRvIEFMTCBmaXhlZCBjaGFubmVscyBvbiBhIHJlbW90ZSBkZXZpY2UKLSAgICoKLSAgICogLSBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMKLSAgICogLSBXaGVuIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgY29ubmVjdGlvbiBmYWlscyBpbW1lZGlhdGVseQotICAgKiAtIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCwgbWV0aG9kIGNhbGxlciBzaG91bGQgd2FpdCBmb3Igb25fZmFpbF9jYWxsYmFjayBvciBvbl9vcGVuX2NhbGxiYWNrIHJlZ2lzdGVyZWQgdGhyb3VnaAotICAgKiAgIFJlZ2lzdGVyU2VydmljZSgpIEFQSS4KLSAgICogLSBJZiBhbiBBQ0wgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYW4gQUNMIGNvbm5lY3Rpb24uIEFzIGEgcmVzdWx0LCBvbl9vcGVuX2NhbGxiYWNrCi0gICAqICAgc3VwcGxpZWQgdGhyb3VnaCBSZWdpc3RlclNlcnZpY2UoKSB3aWxsIGJlIHRyaWdnZXJlZCB0byBwcm92aWRlIHRoZSBhY3R1YWwgRml4ZWRDaGFubmVsIG9iamVjdHMKLSAgICogLSBJZiBIQ0kgY29ubmVjdGlvbiBmYWlsZWQsIG9uX2ZhaWxfY2FsbGJhY2sgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBGQUlMX0hDSV9FUlJPUgotICAgKiAtIElmIGZpeGVkIGNoYW5uZWwgb24gYSByZW1vdGUgZGV2aWNlIGlzIGFscmVhZHkgcmVwb3J0ZWQgYXMgY29ubmVjdGVkIHZpYSBvbl9vcGVuX2NhbGxiYWNrIGFuZCBoYXMgYmVlbiBhY3F1aXJlZAotICAgKiAgIHZpYSBGaXhlZENoYW5uZWwjQWNxdWlyZSgpIEFQSSwgaXQgd29uJ3QgYmUgcmVwb3J0ZWQgYWdhaW4KLSAgICogLSBJZiBubyBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQsIG9uX2ZhaWxfY2FsbGJhY2sgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBGQUlMX05PX1NFUlZJQ0VfUkVHSVNURVJFRAotICAgKiAtIElmIHRoZXJlIGlzIGFuIEFDTCBjb25uZWN0aW9uIGFuZCBjaGFubmVscyBmb3IgZWFjaCBzZXJ2aWNlIGlzIGFsbG9jYXRlZCwgb25fZmFpbF9jYWxsYmFjayB3aWxsIGJlIHRyaWdnZXJlZCB3aXRoCi0gICAqICAgRkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMCi0gICAqCi0gICAqIE5PVEU6Ci0gICAqIFRoaXMgY2FsbCB3aWxsIGluaXRpYXRlIGFuIGVmZm9ydCB0byBjb25uZWN0IGFsbCBmaXhlZCBjaGFubmVsIHNlcnZpY2VzIG9uIGEgcmVtb3RlIGRldmljZS4KLSAgICogRHVlIHRvIHRoZSBjb25uZWN0aW9ubGVzcyBuYXR1cmUgb2YgZml4ZWQgY2hhbm5lbHMsIGFsbCBmaXhlZCBjaGFubmVscyB3aWxsIGJlIGNvbm5lY3RlZCB0b2dldGhlci4KLSAgICogSWYgYSBmaXhlZCBjaGFubmVsIHNlcnZpY2UgZG9lcyBub3QgbmVlZCBhIHBhcnRpY3VsYXIgZml4ZWQgY2hhbm5lbC4gSXQgc2hvdWxkIHJlbGVhc2UgdGhlIHJlY2VpdmVkCi0gICAqIGNoYW5uZWwgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVjZWl2aW5nIG9uX29wZW5fY2FsbGJhY2sgdmlhIEZpeGVkQ2hhbm5lbCNSZWxlYXNlKCkKLSAgICoKLSAgICogQSBtb2R1bGUgY2FsbGluZyBDb25uZWN0U2VydmljZXMoKSBtdXN0IGhhdmUgY2FsbGVkIFJlZ2lzdGVyU2VydmljZSgpIGJlZm9yZS4KLSAgICogVGhlIGNhbGxiYWNrIHdpbGwgY29tZSBiYWNrIGZyb20gb25fb3Blbl9jYWxsYmFjayBpbiB0aGUgc2VydmljZSB0aGF0IGlzIHJlZ2lzdGVyZWQKLSAgICoKLSAgICogQHBhcmFtIGRldmljZTogUmVtb3RlIGRldmljZSB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4KLSAgICogQHBhcmFtIG9uX2ZhaWxfY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gaW5kaWNhdGUgY29ubmVjdGlvbiBmYWlsdXJlIGFsb25nIHdpdGggYSBzdGF0dXMgY29kZS4KLSAgICogQHBhcmFtIGhhbmRsZXI6IFRoZSBoYW5kbGVyIGNvbnRleHQgaW4gd2hpY2ggdG8gZXhlY3V0ZSB0aGUgQGNhbGxiYWNrIHBhcmFtZXRlcnMuCi0gICAqCi0gICAqIFJldHVybnM6IHRydWUgaWYgY29ubmVjdGlvbiB3YXMgYWJsZSB0byBiZSBpbml0aWF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBDb25uZWN0U2VydmljZXMoaGNpOjpBZGRyZXNzIGRldmljZSwgT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrIG9uX2ZhaWxfY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKTsKLQotICAvKioKLSAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIHJlY2VpdmUgaW5jb21pbmcgY29ubmVjdGlvbnMgYm91bmQgdG8gYSBzcGVjaWZpYyBjaGFubmVsLgotICAgKgotICAgKiAtIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KLSAgICogLSBXaGVuIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgcmVnaXN0cmF0aW9uIGZhaWxzIGltbWVkaWF0ZWx5LgotICAgKiAtIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCwgbWV0aG9kIGNhbGxlciBzaG91bGQgd2FpdCBmb3Igb25fc2VydmljZV9yZWdpc3RlcmVkIGNhbGxiYWNrIHRoYXQgY29udGFpbnMgYQotICAgKiAgIEZpeGVkQ2hhbm5lbFNlcnZpY2Ugb2JqZWN0LiBUaGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIGNhbiBiZSBtYW5hZ2VkIGZyb20gdGhhdCBvYmplY3QuCi0gICAqIC0gSWYgYSBDSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG9yIHNvbWUgb3RoZXIgZXJyb3IgaGFwcGVucywgb25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlIHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggYQotICAgKiAgIG5vbi1TVUNDRVNTIHZhbHVlCi0gICAqIC0gQWZ0ZXIgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQsIGFueSBjbGFzc2ljIEFDTCBjb25uZWN0aW9uIHdpbGwgY3JlYXRlIGEgRml4ZWRDaGFubmVsIG9iamVjdCB0aGF0IGlzCi0gICAqICAgZGVsaXZlcmVkIHRocm91Z2ggb25fb3Blbl9jYWxsYmFjawotICAgKiAtIG9uX29wZW5fY2FsbGJhY2ssIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYWZ0ZXIgb25fc2VydmljZV9yZWdpc3RlcmVkIGNhbGxiYWNrCi0gICAqCi0gICAqIEBwYXJhbSBjaWQ6ICBjaWQgdXNlZCB0byByZWNlaXZlIGluY29taW5nIGNvbm5lY3Rpb25zCi0gICAqIEBwYXJhbSBvbl9yZWdpc3RyYXRpb25fY29tcGxldGU6IEEgY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhlIHNlcnZpY2Ugc2V0dXAgaGFzIGNvbXBsZXRlZC4gSWYgdGhlIHJldHVybiBzdGF0dXMgaXMKLSAgICogICAgICAgIG5vdCBTVUNDRVNTLCBpdCBtZWFucyBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkIGR1ZSB0byByZWFzb25zIGxpa2UgQ0lEIGFscmVhZHkgdGFrZQotICAgKiBAcGFyYW0gb25fb3Blbl9jYWxsYmFjazogQSBjYWxsYmFjayB0byBpbmRpY2F0ZSBzdWNjZXNzIG9mIGEgY29ubmVjdGlvbiBpbml0aWF0ZWQgZnJvbSBhIHJlbW90ZSBkZXZpY2UuCi0gICAqIEBwYXJhbSBoYW5kbGVyOiBUaGUgaGFuZGxlciBjb250ZXh0IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIEBjYWxsYmFjayBwYXJhbWV0ZXIuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgUmVnaXN0ZXJTZXJ2aWNlKENpZCBjaWQsIE9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrIG9uX2Nvbm5lY3Rpb25fb3Blbiwgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotCi0gIHZpcnR1YWwgfkZpeGVkQ2hhbm5lbE1hbmFnZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgZnJpZW5kIGNsYXNzIEwyY2FwQ2xhc3NpY01vZHVsZTsKLSAgZnJpZW5kIGNsYXNzIHRlc3Rpbmc6Ok1vY2tGaXhlZENoYW5uZWxNYW5hZ2VyOwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGNvbnN0cnVjdG9yIGlzIG5vdCB0byBiZSB1c2VkIGJ5IHVzZXIgY29kZQotICBGaXhlZENoYW5uZWxNYW5hZ2VyKGludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIHNlcnZpY2VfbWFuYWdlciwgaW50ZXJuYWw6OkxpbmtNYW5hZ2VyKiBsaW5rX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXIpCi0gICAgICA6IHNlcnZpY2VfbWFuYWdlcl8oc2VydmljZV9tYW5hZ2VyKSwgbGlua19tYW5hZ2VyXyhsaW5rX21hbmFnZXIpLCBsMmNhcF9sYXllcl9oYW5kbGVyXyhsMmNhcF9sYXllcl9oYW5kbGVyKSB7fQotCi0gIGludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIHNlcnZpY2VfbWFuYWdlcl8gPSBudWxscHRyOwotICBpbnRlcm5hbDo6TGlua01hbmFnZXIqIGxpbmtfbWFuYWdlcl8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRml4ZWRDaGFubmVsTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlcl9tb2NrLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlcl9tb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzIxM2UuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXJfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tGaXhlZENoYW5uZWxNYW5hZ2VyIDogcHVibGljIEZpeGVkQ2hhbm5lbE1hbmFnZXIgewotIHB1YmxpYzoKLSAgTW9ja0ZpeGVkQ2hhbm5lbE1hbmFnZXIoKSA6IEZpeGVkQ2hhbm5lbE1hbmFnZXIobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cil7fTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgQ29ubmVjdFNlcnZpY2VzLAotICAgICAgICAgICAgICAoaGNpOjpBZGRyZXNzIGRldmljZSwgT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrIG9uX2ZhaWxfY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIFJlZ2lzdGVyU2VydmljZSwKLSAgICAgICAgICAgICAgKENpZCBjaWQsIE9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUsCi0gICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuLCBvczo6SGFuZGxlciogaGFuZGxlciksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9tb2NrLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdlNzc2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbF9tb2NrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tGaXhlZENoYW5uZWwgOiBwdWJsaWMgRml4ZWRDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIE1vY2tGaXhlZENoYW5uZWwoKSA6IEZpeGVkQ2hhbm5lbChudWxscHRyLCBudWxscHRyKXt9OwotICBNT0NLX01FVEhPRCh2b2lkLCBBY3F1aXJlLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlbGVhc2UsICgpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2ssIChvczo6SGFuZGxlciAqIGhhbmRsZXIsIE9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjaykpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmNjIGIvZ2QvbDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTk3N2QuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLXZvaWQgRml4ZWRDaGFubmVsU2VydmljZTo6VW5yZWdpc3RlcihPblVucmVnaXN0ZXJlZENhbGxiYWNrIG9uX3VucmVnaXN0ZXJlZCwgb3M6OkhhbmRsZXIqIG9uX3VucmVnaXN0ZXJlZF9oYW5kbGVyKSB7Ci0gIEFTU0VSVF9MT0cobWFuYWdlcl8gIT0gbnVsbHB0ciwgInRoaXMgc2VydmljZSBpcyBpbnZhbGlkIik7Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlVucmVnaXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKG1hbmFnZXJfKSwgY2lkXywgc3RkOjptb3ZlKG9uX3VucmVnaXN0ZXJlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdW5yZWdpc3RlcmVkX2hhbmRsZXIpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWQyMTNiLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotY2xhc3MgRml4ZWRDaGFubmVsU2VydmljZSB7Ci0gcHVibGljOgotICBGaXhlZENoYW5uZWxTZXJ2aWNlKCkgPSBkZWZhdWx0OwotCi0gIHVzaW5nIE9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgPSBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKCk+OwotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVyIGEgc2VydmljZSBmcm9tIEwyQ0FQIG1vZHVsZS4gVGhpcyBvcGVyYXRpb24gY2Fubm90IGZhaWwuCi0gICAqIEFsbCBjaGFubmVscyBvcGVuZWQgZm9yIHRoaXMgc2VydmljZSB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgKgotICAgKiBAcGFyYW0gb25fdW5yZWdpc3RlcmVkIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdW5yZWdpc3RyYXRpb24gaXMgY29tcGxldGUKLSAgICovCi0gIHZvaWQgVW5yZWdpc3RlcihPblVucmVnaXN0ZXJlZENhbGxiYWNrIG9uX3VucmVnaXN0ZXJlZCwgb3M6OkhhbmRsZXIqIG9uX3VucmVnaXN0ZXJlZF9oYW5kbGVyKTsKLQotICBmcmllbmQgaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLQotIHByaXZhdGU6Ci0gIEZpeGVkQ2hhbm5lbFNlcnZpY2UoQ2lkIGNpZCwgaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogbWFuYWdlciwgb3M6OkhhbmRsZXIqIGhhbmRsZXIpCi0gICAgICA6IGNpZF8oY2lkKSwgbWFuYWdlcl8obWFuYWdlciksIGwyY2FwX2xheWVyX2hhbmRsZXJfKGhhbmRsZXIpIHt9Ci0gIENpZCBjaWRfID0ga0ludmFsaWRDaWQ7Ci0gIGludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIG1hbmFnZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXJfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRml4ZWRDaGFubmVsU2VydmljZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tb2NrLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OTVjZDEuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2VfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlIDogcHVibGljIEZpeGVkQ2hhbm5lbFNlcnZpY2UgewotIHB1YmxpYzoKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2UoKSA6IEZpeGVkQ2hhbm5lbFNlcnZpY2UoKXt9OwotICBNT0NLX01FVEhPRCh2b2lkLCBVbnJlZ2lzdGVyLCAoT25VbnJlZ2lzdGVyZWRDYWxsYmFjayBvbl91bnJlZ2lzdGVyZWQsIG9zOjpIYW5kbGVyKiBvbl91bnJlZ2lzdGVyZWRfaGFuZGxlcikpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvY2hhbm5lbF9jb25maWd1cmF0aW9uX3N0YXRlLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2NoYW5uZWxfY29uZmlndXJhdGlvbl9zdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWU5MDVlLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvY2hhbm5lbF9jb25maWd1cmF0aW9uX3N0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9tdHUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RydWN0IENoYW5uZWxDb25maWd1cmF0aW9uU3RhdGUgewotIHB1YmxpYzoKLSAgZW51bSBTdGF0ZSB7Ci0gICAgLyoqCi0gICAgICogZm9yIHRoZSBpbml0aWF0b3IgcGF0aCwgYSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgYnV0IGEgcG9zaXRpdmUgcmVzcG9uc2UgaGFzIG5vdCB5ZXQgYmVlbiByZWNlaXZlZCwgYW5kIGZvciB0aGUKLSAgICAgKiBhY2NlcHRvciBwYXRoLCBhIHJlcXVlc3Qgd2l0aCBhY2NlcHRhYmxlIG9wdGlvbnMgaGFzIG5vdCB5ZXQgYmVlbiByZWNlaXZlZC4KLSAgICAgKi8KLSAgICBXQUlUX0NPTkZJR19SRVFfUlNQLAotICAgIC8qKgotICAgICAqIHRoZSBhY2NlcHRvciBwYXRoIGlzIGNvbXBsZXRlIGFmdGVyIGhhdmluZyByZXNwb25kZWQgdG8gYWNjZXB0YWJsZSBvcHRpb25zLCBidXQgZm9yIHRoZSBpbml0aWF0b3IgcGF0aCwgYQotICAgICAqIHBvc2l0aXZlIHJlc3BvbnNlIG9uIHRoZSByZWNlbnQgcmVxdWVzdCBoYXMgbm90IHlldCBiZWVuIHJlY2VpdmVkLgotICAgICAqLwotICAgIFdBSVRfQ09ORklHX1JTUCwKLSAgICAvKioKLSAgICAgKiB0aGUgaW5pdGlhdG9yIHBhdGggaXMgY29tcGxldGUgYWZ0ZXIgaGF2aW5nIHJlY2VpdmVkIGEgcG9zaXRpdmUgcmVzcG9uc2UsIGJ1dCBmb3IgdGhlIGFjY2VwdG9yIHBhdGgsIGEgcmVxdWVzdAotICAgICAqIHdpdGggYWNjZXB0YWJsZSBvcHRpb25zIGhhcyBub3QgeWV0IGJlZW4gcmVjZWl2ZWQuCi0gICAgICovCi0gICAgV0FJVF9DT05GSUdfUkVRLAotICAgIC8qKgotICAgICAqIENvbmZpZ3VyYXRpb24gaXMgY29tcGxldGUKLSAgICAgKi8KLSAgICBDT05GSUdVUkVELAotICB9OwotICBTdGF0ZSBzdGF0ZV8gPSBTdGF0ZTo6V0FJVF9DT05GSUdfUkVRX1JTUDsKLQotICBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZU9wdGlvbiByZXRyYW5zbWlzc2lvbl9hbmRfZmxvd19jb250cm9sX21vZGVfOwotICBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sQ29uZmlndXJhdGlvbk9wdGlvbiBsb2NhbF9yZXRyYW5zbWlzc2lvbl9hbmRfZmxvd19jb250cm9sXzsKLSAgUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbENvbmZpZ3VyYXRpb25PcHRpb24gcmVtb3RlX3JldHJhbnNtaXNzaW9uX2FuZF9mbG93X2NvbnRyb2xfOwotICBGY3NUeXBlIGZjc190eXBlXyA9IEZjc1R5cGU6OkRFRkFVTFQ7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R1bXBzeXNfaGVscGVyLmNjIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9kdW1wc3lzX2hlbHBlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZDY5MC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R1bXBzeXNfaGVscGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHVtcHN5c19oZWxwZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGluay5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcF9jbGFzc2ljX21vZHVsZV9nZW5lcmF0ZWQuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OkR1bXBzeXNIZWxwZXI6OkR1bXBzeXNIZWxwZXIoY29uc3QgTGlua01hbmFnZXImIGxpbmtfbWFuYWdlcikKLSAgICA6IGxpbmtfbWFuYWdlcl8obGlua19tYW5hZ2VyKSB7fQotCi1zdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OkNoYW5uZWxEYXRhPj4KLWJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpEdW1wc3lzSGVscGVyOjpEdW1wQWN0aXZlRHluYW1pY0NoYW5uZWxzKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlciwKLSAgICBjb25zdCBsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsQWxsb2NhdG9yJiBjaGFubmVsX2FsbG9jYXRvcikgY29uc3QgewotICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OkNoYW5uZWxEYXRhPj4gY2hhbm5lbF9vZmZzZXRzOwotCi0gIGZvciAoYXV0byBpdCA9IGNoYW5uZWxfYWxsb2NhdG9yLmNoYW5uZWxzXy5jYmVnaW4oKTsgaXQgIT0gY2hhbm5lbF9hbGxvY2F0b3IuY2hhbm5lbHNfLmNlbmQoKTsgKytpdCkgewotICAgIENoYW5uZWxEYXRhQnVpbGRlciBidWlsZGVyKCpmYl9idWlsZGVyKTsKLSAgICBidWlsZGVyLmFkZF9jaWQoaXQtPmZpcnN0KTsKLSAgICBjaGFubmVsX29mZnNldHMucHVzaF9iYWNrKGJ1aWxkZXIuRmluaXNoKCkpOwotICB9Ci0gIHJldHVybiBjaGFubmVsX29mZnNldHM7Ci19Ci0KLXN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8OjpibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpDaGFubmVsRGF0YT4+Ci1ibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6RHVtcHN5c0hlbHBlcjo6RHVtcEFjdGl2ZUZpeGVkQ2hhbm5lbHMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyLAotICAgIGNvbnN0IGJsdWV0b290aDo6bDJjYXA6OmludGVybmFsOjpGaXhlZENoYW5uZWxBbGxvY2F0b3I8Ci0gICAgICAgIGJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpGaXhlZENoYW5uZWxJbXBsLAotICAgICAgICBibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6TGluaz4mIGNoYW5uZWxfYWxsb2NhdG9yKSBjb25zdCB7Ci0gIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8Ymx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6Q2hhbm5lbERhdGE+PiBjaGFubmVsX29mZnNldHM7Ci0KLSAgZm9yIChhdXRvIGl0ID0gY2hhbm5lbF9hbGxvY2F0b3IuY2hhbm5lbHNfLmNiZWdpbigpOyBpdCAhPSBjaGFubmVsX2FsbG9jYXRvci5jaGFubmVsc18uY2VuZCgpOyArK2l0KSB7Ci0gICAgQ2hhbm5lbERhdGFCdWlsZGVyIGJ1aWxkZXIoKmZiX2J1aWxkZXIpOwotICAgIGJ1aWxkZXIuYWRkX2NpZChpdC0+Zmlyc3QpOwotICAgIGNoYW5uZWxfb2Zmc2V0cy5wdXNoX2JhY2soYnVpbGRlci5GaW5pc2goKSk7Ci0gIH0KLSAgcmV0dXJuIGNoYW5uZWxfb2Zmc2V0czsKLX0KLQotc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpMaW5rRGF0YT4+Ci1ibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6RHVtcHN5c0hlbHBlcjo6RHVtcEFjdGl2ZUxpbmtzKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlcikgY29uc3QgewotICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzLCBMaW5rPiogbGlua3MgPSAmbGlua19tYW5hZ2VyXy5saW5rc187Ci0KLSAgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMaW5rRGF0YT4+IGxpbmtfb2Zmc2V0czsKLQotICBmb3IgKGF1dG8gaXQgPSBsaW5rcy0+Y2JlZ2luKCk7IGl0ICE9IGxpbmtzLT5jZW5kKCk7ICsraXQpIHsKLSAgICBhdXRvIGxpbmtfYWRkcmVzcyA9IGZiX2J1aWxkZXItPkNyZWF0ZVN0cmluZyhpdC0+c2Vjb25kLlRvU3RyaW5nKCkpOwotICAgIGF1dG8gZHluYW1pY19jaGFubmVsX29mZnNldHMgPSBEdW1wQWN0aXZlRHluYW1pY0NoYW5uZWxzKGZiX2J1aWxkZXIsIGl0LT5zZWNvbmQuZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8pOwotICAgIGF1dG8gZHluYW1pY19jaGFubmVscyA9IGZiX2J1aWxkZXItPkNyZWF0ZVZlY3RvcihkeW5hbWljX2NoYW5uZWxfb2Zmc2V0cyk7Ci0KLSAgICBhdXRvIGZpeGVkX2NoYW5uZWxfb2Zmc2V0cyA9IER1bXBBY3RpdmVGaXhlZENoYW5uZWxzKGZiX2J1aWxkZXIsIGl0LT5zZWNvbmQuZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfKTsKLSAgICBhdXRvIGZpeGVkX2NoYW5uZWxzID0gZmJfYnVpbGRlci0+Q3JlYXRlVmVjdG9yKGZpeGVkX2NoYW5uZWxfb2Zmc2V0cyk7Ci0KLSAgICBMaW5rRGF0YUJ1aWxkZXIgYnVpbGRlcigqZmJfYnVpbGRlcik7Ci0gICAgYnVpbGRlci5hZGRfYWRkcmVzcyhsaW5rX2FkZHJlc3MpOwotICAgIGJ1aWxkZXIuYWRkX2R5bmFtaWNfY2hhbm5lbHMoZHluYW1pY19jaGFubmVscyk7Ci0gICAgYnVpbGRlci5hZGRfZml4ZWRfY2hhbm5lbHMoZml4ZWRfY2hhbm5lbHMpOwotICAgIGxpbmtfb2Zmc2V0cy5wdXNoX2JhY2soYnVpbGRlci5GaW5pc2goKSk7Ci0gIH0KLSAgcmV0dXJuIGxpbmtfb2Zmc2V0czsKLX0KZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHVtcHN5c19oZWxwZXIuaCBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHVtcHN5c19oZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0OTE3Yi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R1bXBzeXNfaGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsMmNhcF9jbGFzc2ljX21vZHVsZV9nZW5lcmF0ZWQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgRHVtcHN5c0hlbHBlciB7Ci0gcHVibGljOgotICBEdW1wc3lzSGVscGVyKGNvbnN0IExpbmtNYW5hZ2VyJiBsaW5rX21hbmFnZXIpOwotCi0gIHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2hhbm5lbERhdGE+PiBEdW1wQWN0aXZlRHluYW1pY0NoYW5uZWxzKAotICAgICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyLAotICAgICAgY29uc3QgbDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEFsbG9jYXRvciYgY2hhbm5lbF9hbGxvY2F0b3IpIGNvbnN0OwotICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PENoYW5uZWxEYXRhPj4gRHVtcEFjdGl2ZUZpeGVkQ2hhbm5lbHMoCi0gICAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGZiX2J1aWxkZXIsCi0gICAgICBjb25zdCBsMmNhcDo6aW50ZXJuYWw6OkZpeGVkQ2hhbm5lbEFsbG9jYXRvcjxGaXhlZENoYW5uZWxJbXBsLCBMaW5rPiYgY2hhbm5lbF9hbGxvY2F0b3IpIGNvbnN0OwotICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PExpbmtEYXRhPj4gRHVtcEFjdGl2ZUxpbmtzKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBMaW5rTWFuYWdlciYgbGlua19tYW5hZ2VyXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0NGM3Yi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfY29uZmlndXJhdGlvbl9vcHRpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvc2VjdXJpdHlfcG9saWN5LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkR5bmFtaWNDaGFubmVsU2VydmljZUltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RydWN0IFBlbmRpbmdSZWdpc3RyYXRpb24gewotICAgIG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgICBjbGFzc2ljOjpTZWN1cml0eVBvbGljeSBzZWN1cml0eV9wb2xpY3lfOwotICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6T25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja187Ci0gICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXzsKLSAgICBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gY29uZmlndXJhdGlvbl87Ci0gIH07Ci0KLSAgdmlydHVhbCB2b2lkIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfLkludm9rZShzdGQ6Om1vdmUoY2hhbm5lbCkpOwotICB9Ci0KLSAgdmlydHVhbCBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gR2V0Q29uZmlnT3B0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBjb25maWdfb3B0aW9uXzsKLSAgfQotCi0gIHZpcnR1YWwgU2VjdXJpdHlQb2xpY3kgR2V0U2VjdXJpdHlQb2xpY3koKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNlY3VyaXR5X3BvbGljeV87Ci0gIH0KLQotICBmcmllbmQgY2xhc3MgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIHByb3RlY3RlZCBhY2Nlc3MgZm9yIG1vY2tpbmcKLSAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCgKLSAgICAgIGNsYXNzaWM6OlNlY3VyaXR5UG9saWN5IHNlY3VyaXR5X3BvbGljeSwKLSAgICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6T25Db25uZWN0aW9uT3BlbkNhbGxiYWNrIG9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFjaywKLSAgICAgIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWdfb3B0aW9uKQotICAgICAgOiBzZWN1cml0eV9wb2xpY3lfKHNlY3VyaXR5X3BvbGljeSksCi0gICAgICAgIG9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFja18oc3RkOjptb3ZlKG9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFjaykpLAotICAgICAgICBjb25maWdfb3B0aW9uXyhjb25maWdfb3B0aW9uKSB7fQotCi0gcHJpdmF0ZToKLSAgY2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgc2VjdXJpdHlfcG9saWN5XzsKLSAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXzsKLSAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ19vcHRpb25fOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5ODQxZS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0R5bmFtaWNDaGFubmVsU2VydmljZUltcGwgOiBwdWJsaWMgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCB7Ci0gcHVibGljOgotICBNb2NrRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCgpIDogRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCh7fSwge30sIHt9KSB7fQotICBNT0NLX01FVEhPRChTZWN1cml0eVBvbGljeSwgR2V0U2VjdXJpdHlQb2xpY3ksICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWE0ZjdlLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9wc20uaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdm9pZCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6UmVnaXN0ZXIoUHNtIHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb24pIHsKLSAgaWYgKCFJc1BzbVZhbGlkKHBzbSkpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxTZXJ2aWNlPiBpbnZhbGlkX3NlcnZpY2UobmV3IER5bmFtaWNDaGFubmVsU2VydmljZSgpKTsKLSAgICBwZW5kaW5nX3JlZ2lzdHJhdGlvbi5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfLkludm9rZSgKLSAgICAgICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OkZBSUxfSU5WQUxJRF9TRVJWSUNFLCBzdGQ6Om1vdmUoaW52YWxpZF9zZXJ2aWNlKSk7Ci0gIH0gZWxzZSBpZiAoSXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsU2VydmljZT4gaW52YWxpZF9zZXJ2aWNlKG5ldyBEeW5hbWljQ2hhbm5lbFNlcnZpY2UoKSk7Ci0gICAgcGVuZGluZ19yZWdpc3RyYXRpb24ub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXy5JbnZva2UoCi0gICAgICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpGQUlMX0RVUExJQ0FURV9TRVJWSUNFLCBzdGQ6Om1vdmUoaW52YWxpZF9zZXJ2aWNlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc2VydmljZV9tYXBfLnRyeV9lbXBsYWNlKAotICAgICAgICBwc20sCi0gICAgICAgIER5bmFtaWNDaGFubmVsU2VydmljZUltcGwoCi0gICAgICAgICAgICBwZW5kaW5nX3JlZ2lzdHJhdGlvbi5zZWN1cml0eV9wb2xpY3lfLAotICAgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uLm9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFja18pLAotICAgICAgICAgICAgcGVuZGluZ19yZWdpc3RyYXRpb24uY29uZmlndXJhdGlvbl8pKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxTZXJ2aWNlPiB1c2VyX3NlcnZpY2UobmV3IER5bmFtaWNDaGFubmVsU2VydmljZShwc20sIHRoaXMsIGwyY2FwX2xheWVyX2hhbmRsZXJfKSk7Ci0gICAgcGVuZGluZ19yZWdpc3RyYXRpb24ub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXy5JbnZva2UoCi0gICAgICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTLCBzdGQ6Om1vdmUodXNlcl9zZXJ2aWNlKSk7Ci0gIH0KLX0KLQotdm9pZCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6VW5yZWdpc3RlcihQc20gcHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2U6Ok9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgaWYgKElzU2VydmljZVJlZ2lzdGVyZWQocHNtKSkgewotICAgIHNlcnZpY2VfbWFwXy5lcmFzZShwc20pOwotICAgIGNhbGxiYWNrLkludm9rZSgpOwotICB9IGVsc2UgewotICAgIExPR19FUlJPUigic2VydmljZSBub3QgcmVnaXN0ZXJlZCBwc206JWQiLCBwc20pOwotICB9Ci19Ci0KLWJvb2wgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OklzU2VydmljZVJlZ2lzdGVyZWQoUHNtIHBzbSkgY29uc3QgewotICByZXR1cm4gc2VydmljZV9tYXBfLmZpbmQocHNtKSAhPSBzZXJ2aWNlX21hcF8uZW5kKCk7Ci19Ci0KLUR5bmFtaWNDaGFubmVsU2VydmljZUltcGwqIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpHZXRTZXJ2aWNlKFBzbSBwc20pIHsKLSAgQVNTRVJUKElzU2VydmljZVJlZ2lzdGVyZWQocHNtKSk7Ci0gIHJldHVybiAmc2VydmljZV9tYXBfLmZpbmQocHNtKS0+c2Vjb25kOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsKj4+IER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpHZXRSZWdpc3RlcmVkU2VydmljZXMoKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxQc20sIER5bmFtaWNDaGFubmVsU2VydmljZUltcGwqPj4gcmVzdWx0czsKLSAgZm9yIChhdXRvJiBlbGVtIDogc2VydmljZV9tYXBfKSB7Ci0gICAgcmVzdWx0cy5lbXBsYWNlX2JhY2soZWxlbS5maXJzdCwgJmVsZW0uc2Vjb25kKTsKLSAgfQotICByZXR1cm4gcmVzdWx0czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0ZDcwYS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbChvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcikKLSAgICAgIDogbDJjYXBfbGF5ZXJfaGFuZGxlcl8obDJjYXBfbGF5ZXJfaGFuZGxlcikge30KLQotICB2aXJ0dWFsIH5EeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCgpID0gZGVmYXVsdDsKLSAgLy8KLSAgLy8gQWxsIEFQSXMgbXVzdCBiZSBpbnZva2VkIGluIEwyQ0FQIGxheWVyIGhhbmRsZXIKLSAgLy8KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyKFBzbSBwc20sIER5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb24pOwotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlcihQc20gcHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2U6Ok9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgY2FsbGJhY2spOwotICB2aXJ0dWFsIGJvb2wgSXNTZXJ2aWNlUmVnaXN0ZXJlZChQc20gcHNtKSBjb25zdDsKLSAgdmlydHVhbCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsKiBHZXRTZXJ2aWNlKFBzbSBwc20pOwotCi0gIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFBzbSwgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCo+PiBHZXRSZWdpc3RlcmVkU2VydmljZXMoKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBpcyBzZXQgYnkgU2VjdXJpdHlNYW5hZ2VyIHRocm91Z2ggTDJjYXBNb2R1bGUKLSAgdm9pZCBTZXRTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UqIGltcGwpIHsKLSAgICBzZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2VfID0gaW1wbDsKLSAgfQotCi0gIHZpcnR1YWwgU2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSogR2V0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgpIHsKLSAgICByZXR1cm4gc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFBzbSwgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbD4gc2VydmljZV9tYXBfOwotICBTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKiBzZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaCBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNWQyOS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGwuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgOiBwdWJsaWMgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgewotIHB1YmxpYzoKLSAgTW9ja0R5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKCkgOiBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbChudWxscHRyKSB7fQotICBNT0NLX01FVEhPRCh2b2lkLCBSZWdpc3RlciwgKFBzbSBwc20sIER5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb24pLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgVW5yZWdpc3RlciwgKFBzbSBwc20sIER5bmFtaWNDaGFubmVsU2VydmljZTo6T25VbnJlZ2lzdGVyZWRDYWxsYmFjayBjYWxsYmFjayksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChib29sLCBJc1NlcnZpY2VSZWdpc3RlcmVkLCAoUHNtIHBzbSksIChjb25zdCwgb3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCosIEdldFNlcnZpY2UsIChQc20gcHNtKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsKj4+KSwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UqLCBHZXRTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlLCAoKSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfdGVzdC5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGVjZDMwLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotY2xhc3MgTDJjYXBEeW5hbWljU2VydmljZU1hbmFnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB+TDJjYXBEeW5hbWljU2VydmljZU1hbmFnZXJUZXN0KCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgT25TZXJ2aWNlUmVnaXN0ZXJlZChib29sIGV4cGVjdF9zdWNjZXNzLCBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxTZXJ2aWNlPiB1c2VyX3NlcnZpY2UpIHsKLSAgICBFWFBFQ1RfRVEocmVzdWx0ID09IER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTLCBleHBlY3Rfc3VjY2Vzcyk7Ci0gICAgc2VydmljZV9yZWdpc3RlcmVkXyA9IGV4cGVjdF9zdWNjZXNzOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIHVzZXJfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbDJjYXBfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbWFuYWdlcl8gPSBuZXcgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGx7bDJjYXBfaGFuZGxlcl99OwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgbWFuYWdlcl87Ci0gICAgbDJjYXBfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGwyY2FwX2hhbmRsZXJfOwotICAgIHVzZXJfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIHVzZXJfaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICB2b2lkIHN5bmNfdXNlcl9oYW5kbGVyKCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgdXNlcl9oYW5kbGVyXy0+Q2FsbE9uKCZwcm9taXNlLCAmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUpOwotICAgIGF1dG8gZnV0dXJlX3N0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Ci0gICAgRVhQRUNUX0VRKGZ1dHVyZV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICB9Ci0KLSAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIG1hbmFnZXJfID0gbnVsbHB0cjsKLSAgb3M6OlRocmVhZCogdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfID0gbnVsbHB0cjsKLQotICBib29sIHNlcnZpY2VfcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLX07Ci0KLVRFU1RfRihMMmNhcER5bmFtaWNTZXJ2aWNlTWFuYWdlclRlc3QsIHJlZ2lzdGVyX2FuZF91bnJlZ2lzdGVyX2NsYXNzaWNfZHluYW1pY19jaGFubmVsKSB7Ci0gIER5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAudXNlcl9oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcl8sCi0gICAgICAuc2VjdXJpdHlfcG9saWN5XyA9IFNlY3VyaXR5UG9saWN5OjpfU0RQX09OTFlfTk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LLAotICAgICAgLm9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja18gPQotICAgICAgICAgIHVzZXJfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkwyY2FwRHluYW1pY1NlcnZpY2VNYW5hZ2VyVGVzdDo6T25TZXJ2aWNlUmVnaXN0ZXJlZCwgdHJ1ZSl9OwotICBDaWQgY2lkID0ga1NtcEJyQ2lkOwotICBFWFBFQ1RfRkFMU0UobWFuYWdlcl8tPklzU2VydmljZVJlZ2lzdGVyZWQoY2lkKSk7Ci0gIG1hbmFnZXJfLT5SZWdpc3RlcihjaWQsIHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbikpOwotICBFWFBFQ1RfVFJVRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLSAgc3luY191c2VyX2hhbmRsZXIoKTsKLSAgRVhQRUNUX1RSVUUoc2VydmljZV9yZWdpc3RlcmVkXyk7Ci0gIG1hbmFnZXJfLT5VbnJlZ2lzdGVyKGNpZCwgdXNlcl9oYW5kbGVyXy0+QmluZE9uY2UoW10ge30pKTsKLSAgRVhQRUNUX0ZBTFNFKG1hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpOwotfQotCi1URVNUX0YoTDJjYXBEeW5hbWljU2VydmljZU1hbmFnZXJUZXN0LCByZWdpc3Rlcl9jbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9iYWRfY2lkKSB7Ci0gIER5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAuc2VjdXJpdHlfcG9saWN5XyA9IFNlY3VyaXR5UG9saWN5OjpfU0RQX09OTFlfTk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LLAotICAgICAgLm9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja18gPQotICAgICAgICAgIHVzZXJfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkwyY2FwRHluYW1pY1NlcnZpY2VNYW5hZ2VyVGVzdDo6T25TZXJ2aWNlUmVnaXN0ZXJlZCwgZmFsc2UpfTsKLSAgQ2lkIGNpZCA9IDB4MTAwMDsKLSAgRVhQRUNUX0ZBTFNFKG1hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpOwotICBtYW5hZ2VyXy0+UmVnaXN0ZXIoY2lkLCBzdGQ6Om1vdmUocGVuZGluZ19yZWdpc3RyYXRpb24pKTsKLSAgRVhQRUNUX0ZBTFNFKG1hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpOwotICBzeW5jX3VzZXJfaGFuZGxlcigpOwotICBFWFBFQ1RfRkFMU0Uoc2VydmljZV9yZWdpc3RlcmVkXyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc1ZjY2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGluay5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotRml4ZWRDaGFubmVsSW1wbDo6Rml4ZWRDaGFubmVsSW1wbChDaWQgY2lkLCBMaW5rKiBsaW5rLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcikKLSAgICA6IGNpZF8oY2lkKSwgZGV2aWNlXyhsaW5rLT5HZXREZXZpY2UoKSksIGxpbmtfKGxpbmspLCBsMmNhcF9oYW5kbGVyXyhsMmNhcF9oYW5kbGVyKSB7Ci0gIEFTU0VSVF9MT0coY2lkXyA+PSBrRmlyc3RGaXhlZENoYW5uZWwgJiYgY2lkXyA8PSBrTGFzdEZpeGVkQ2hhbm5lbCwgIkludmFsaWQgY2lkOiAlZCIsIGNpZF8pOwotICBBU1NFUlQobGlua18gIT0gbnVsbHB0cik7Ci0gIEFTU0VSVChsMmNhcF9oYW5kbGVyXyAhPSBudWxscHRyKTsKLX0KLQotdm9pZCBGaXhlZENoYW5uZWxJbXBsOjpSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZENoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjaykgewotICBBU1NFUlRfTE9HKHVzZXJfaGFuZGxlcl8gPT0gbnVsbHB0ciwgIk9uQ2xvc2VDYWxsYmFjayBjYW4gb25seSBiZSByZWdpc3RlcmVkIG9uY2UiKTsKLSAgLy8gSWYgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZCwgY2FsbCB0aGUgY2FsbGJhY2sgaW1tZWRpYXRlbHkgd2l0aG91dCBzYXZpbmcgaXQKLSAgaWYgKGNsb3NlZF8pIHsKLSAgICB1c2VyX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZShzdGQ6Om1vdmUob25fY2xvc2VfY2FsbGJhY2spLCBjbG9zZV9yZWFzb25fKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVzZXJfaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXI7Ci0gIG9uX2Nsb3NlX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShvbl9jbG9zZV9jYWxsYmFjayk7Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsSW1wbDo6T25DbG9zZWQoaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7Ci0gIEFTU0VSVF9MT0coIWNsb3NlZF8sICJEZXZpY2UgJXMgQ2lkIDB4JXggY2xvc2VkIHR3aWNlLCBvbGQgc3RhdHVzIDB4JXgsIG5ldyBzdGF0dXMgMHgleCIsIGRldmljZV8uVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgIGNpZF8sIHN0YXRpY19jYXN0PGludD4oY2xvc2VfcmVhc29uXyksIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7Ci0gIGNsb3NlZF8gPSB0cnVlOwotICBjbG9zZV9yZWFzb25fID0gc3RhdHVzOwotICBhY3F1aXJlZF8gPSBmYWxzZTsKLSAgbGlua18gPSBudWxscHRyOwotICBsMmNhcF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIGlmICh1c2VyX2hhbmRsZXJfID09IG51bGxwdHIpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gT24gY2xvc2UgY2FsbGJhY2sgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UKLSAgdXNlcl9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShvbl9jbG9zZV9jYWxsYmFja18pLCBzdGF0dXMpKTsKLSAgdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIG9uX2Nsb3NlX2NhbGxiYWNrXy5SZXNldCgpOwotfQotCi12b2lkIEZpeGVkQ2hhbm5lbEltcGw6OkFjcXVpcmUoKSB7Ci0gIEFTU0VSVF9MT0codXNlcl9oYW5kbGVyXyAhPSBudWxscHRyLCAiTXVzdCByZWdpc3RlciBPbkNsb3NlQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgYW55IG1ldGhvZHMiKTsKLSAgaWYgKGNsb3NlZF8pIHsKLSAgICBMT0dfV0FSTigiJXMgaXMgYWxyZWFkeSBjbG9zZWQiLCBUb1N0cmluZygpLmNfc3RyKCkpOwotICAgIEFTU0VSVCghYWNxdWlyZWRfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGFjcXVpcmVkXykgewotICAgIExPR19JTkZPKCIlcyB3YXMgYWxyZWFkeSBhY3F1aXJlZCIsIFRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFjcXVpcmVkXyA9IHRydWU7Ci0gIGxpbmtfLT5SZWZyZXNoUmVmQ291bnQoKTsKLX0KLQotdm9pZCBGaXhlZENoYW5uZWxJbXBsOjpSZWxlYXNlKCkgewotICBBU1NFUlRfTE9HKHVzZXJfaGFuZGxlcl8gIT0gbnVsbHB0ciwgIk11c3QgcmVnaXN0ZXIgT25DbG9zZUNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIGFueSBtZXRob2RzIik7Ci0gIGlmIChjbG9zZWRfKSB7Ci0gICAgTE9HX1dBUk4oIiVzIGlzIGFscmVhZHkgY2xvc2VkIiwgVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBBU1NFUlQoIWFjcXVpcmVkXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghYWNxdWlyZWRfKSB7Ci0gICAgTE9HX0lORk8oIiVzIHdhcyBhbHJlYWR5IHJlbGVhc2VkIiwgVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYWNxdWlyZWRfID0gZmFsc2U7Ci0gIGxpbmtfLT5SZWZyZXNoUmVmQ291bnQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0ZTlmMS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMaW5rOwotCi1jbGFzcyBGaXhlZENoYW5uZWxJbXBsIDogcHVibGljIGwyY2FwOjppbnRlcm5hbDo6Q2hhbm5lbEltcGwgewotIHB1YmxpYzoKLSAgRml4ZWRDaGFubmVsSW1wbChDaWQgY2lkLCBMaW5rKiBsaW5rLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcik7Ci0KLSAgdmlydHVhbCB+Rml4ZWRDaGFubmVsSW1wbCgpID0gZGVmYXVsdDsKLQotICBoY2k6OkFkZHJlc3MgR2V0RGV2aWNlKCkgY29uc3QgewotICAgIHJldHVybiBkZXZpY2VfLkdldEFkZHJlc3MoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyLCBGaXhlZENoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjayk7Ci0KLSAgdmlydHVhbCB2b2lkIEFjcXVpcmUoKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOwotCi0gIHZpcnR1YWwgYm9vbCBJc0FjcXVpcmVkKCkgY29uc3QgewotICAgIHJldHVybiBhY3F1aXJlZF87Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgT25DbG9zZWQoaGNpOjpFcnJvckNvZGUgc3RhdHVzKTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCAiRGV2aWNlICIgPDwgZGV2aWNlXyA8PCAiIENpZCAweCIgPDwgc3RkOjpoZXggPDwgY2lkXzsKLSAgICByZXR1cm4gc3Muc3RyKCk7Ci0gIH0KLQotICBjb21tb246OkJpZGlRdWV1ZUVuZDxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyLCBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPj4qIEdldFF1ZXVlVXBFbmQoKSB7Ci0gICAgcmV0dXJuIGNoYW5uZWxfcXVldWVfLkdldFVwRW5kKCk7Ci0gIH0KLQotICBjb21tb246OkJpZGlRdWV1ZUVuZDxwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPiwgcGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4qIEdldFF1ZXVlRG93bkVuZCgpIHsKLSAgICByZXR1cm4gY2hhbm5lbF9xdWV1ZV8uR2V0RG93bkVuZCgpOwotICB9Ci0KLSAgQ2lkIEdldENpZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2lkXzsKLSAgfQotCi0gIENpZCBHZXRSZW1vdGVDaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNpZF87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIENvbnN0cnVjdG9yIHN0YXRlcwotICAvLyBGb3IgbG9nZ2luZyBwdXJwb3NlIG9ubHkKLSAgY29uc3QgQ2lkIGNpZF87Ci0gIC8vIEZvciBsb2dnaW5nIHB1cnBvc2Ugb25seQotICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2VfOwotICAvLyBOZWVkZWQgdG8gaGFuZGxlIEFjcXVpcmUoKSBhbmQgUmVsZWFzZSgpCi0gIExpbmsqIGxpbmtfOwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl87Ci0KLSAgLy8gVXNlciBzdXBwb3J0ZWQgc3RhdGVzCi0gIG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgRml4ZWRDaGFubmVsOjpPbkNsb3NlQ2FsbGJhY2sgb25fY2xvc2VfY2FsbGJhY2tfe307Ci0KLSAgLy8gSW50ZXJuYWwgc3RhdGVzCi0gIGJvb2wgYWNxdWlyZWRfID0gZmFsc2U7Ci0gIGJvb2wgY2xvc2VkXyA9IGZhbHNlOwotICBoY2k6OkVycm9yQ29kZSBjbG9zZV9yZWFzb25fID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtDaGFubmVsUXVldWVTaXplID0gMTA7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+LCBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBjaGFubmVsX3F1ZXVlX3sKLSAgICAgIGtDaGFubmVsUXVldWVTaXplfTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRml4ZWRDaGFubmVsSW1wbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX21vY2suaCBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYmY1MS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbF9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotLy8gVW5pdCB0ZXN0IGludGVyZmFjZXMKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tGaXhlZENoYW5uZWxJbXBsIDogcHVibGljIEZpeGVkQ2hhbm5lbEltcGwgewotIHB1YmxpYzoKLSAgTW9ja0ZpeGVkQ2hhbm5lbEltcGwoQ2lkIGNpZCwgTGluayogbGluaywgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIpIDogRml4ZWRDaGFubmVsSW1wbChjaWQsIGxpbmssIGwyY2FwX2hhbmRsZXIpIHt9Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrLAotICAgICAgICAgICAgICAob3M6OkhhbmRsZXIgKiB1c2VyX2hhbmRsZXIsIEZpeGVkQ2hhbm5lbDo6T25DbG9zZUNhbGxiYWNrIG9uX2Nsb3NlX2NhbGxiYWNrKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIEFjcXVpcmUsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVsZWFzZSwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChib29sLCBJc0FjcXVpcmVkLCAoKSwgKG92ZXJyaWRlLCBjb25zdCkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBPbkNsb3NlZCwgKGhjaTo6RXJyb3JDb2RlIHN0YXR1cyksIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX3Rlc3QuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQzNzk4Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotCi0jaW5jbHVkZSAiY29tbW9uL3Rlc3RpbmcvYmluZF90ZXN0X3V0aWwuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi11c2luZyBsMmNhcDo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tQYXJhbWV0ZXJQcm92aWRlcjsKLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2tMaW5rOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLWNsYXNzIEwyY2FwQ2xhc3NpY0ZpeGVkQ2hhbm5lbEltcGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTeW5jSGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgbDJjYXBfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGwyY2FwX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBsMmNhcF9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0ZpeGVkQ2hhbm5lbEltcGxUZXN0LCBnZXRfZGV2aWNlKSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9FUShkZXZpY2UuR2V0QWRkcmVzcygpLCBmaXhlZF9jaGFubmVsX2ltcGwuR2V0RGV2aWNlKCkpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QsIGNsb3NlX3RyaWdnZXJzX2NhbGxiYWNrKSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgaGNpOjpFcnJvckNvZGUgbXlfc3RhdHVzID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGZpeGVkX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IG15X3N0YXR1cyA9IHN0YXR1czsgfSkpOwotCi0gIC8vIENoYW5uZWwgY2xvc3VyZSBzaG91bGQgdHJpZ2dlciBzdWNoIGNhbGxiYWNrCi0gIGZpeGVkX2NoYW5uZWxfaW1wbC5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKTsKLSAgU3luY0hhbmRsZXIodXNlcl9oYW5kbGVyLmdldCgpKTsKLSAgRVhQRUNUX0VRKGhjaTo6RXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04sIG15X3N0YXR1cyk7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QsIHJlZ2lzdGVyX2NhbGxiYWNrX2FmdGVyX2Nsb3NlX3Nob3VsZF9jYWxsX2ltbWVkaWF0ZWx5KSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gQ2hhbm5lbCBjbG9zdXJlIHNob3VsZCBkbyBub3RoaW5nCi0gIGZpeGVkX2NoYW5uZWxfaW1wbC5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKTsKLQotICAvLyBSZWdpc3RlciBvbiBjbG9zZSBjYWxsYmFjayBzaG91bGQgdHJpZ2dlciBjYWxsYmFjayBpbW1lZGlhdGVseQotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotICBoY2k6OkVycm9yQ29kZSBteV9zdGF0dXMgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgZml4ZWRfY2hhbm5lbF9pbXBsLlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyLmdldCgpLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgbXlfc3RhdHVzID0gc3RhdHVzOyB9KSk7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlci5nZXQoKSk7Ci0gIEVYUEVDVF9FUShoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OLCBteV9zdGF0dXMpOwotCi0gIHVzZXJfaGFuZGxlci0+Q2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0ZpeGVkQ2hhbm5lbEltcGxUZXN0LCBjbG9zZV90d2ljZV9zaG91bGRfZmFpbCkgewotICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgaGNpOjpFcnJvckNvZGUgbXlfc3RhdHVzID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGZpeGVkX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IG15X3N0YXR1cyA9IHN0YXR1czsgfSkpOwotCi0gIC8vIENoYW5uZWwgY2xvc3VyZSBzaG91bGQgdHJpZ2dlciBzdWNoIGNhbGxiYWNrCi0gIGZpeGVkX2NoYW5uZWxfaW1wbC5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKTsKLSAgU3luY0hhbmRsZXIodXNlcl9oYW5kbGVyLmdldCgpKTsKLSAgRVhQRUNUX0VRKGhjaTo6RXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04sIG15X3N0YXR1cyk7Ci0KLSAgLy8gMm5kIE9uQ2xvc2UoKSBjYWxsYmFjayBzaG91bGQgZmFpbAotICBFWFBFQ1RfREVBVEgoZml4ZWRfY2hhbm5lbF9pbXBsLk9uQ2xvc2VkKGhjaTo6RXJyb3JDb2RlOjpQQUdFX1RJTUVPVVQpLCAiLiphc3NlcnRpb24gXCchY2xvc2VkX1wnIGZhaWxlZC4qIik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QsIG11bHRpcGxlX3JlZ2lzdHJhdGlvbl9zaG91bGRfZmFpbCkgewotICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgaGNpOjpFcnJvckNvZGUgbXlfc3RhdHVzID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGZpeGVkX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IG15X3N0YXR1cyA9IHN0YXR1czsgfSkpOwotCi0gIEVYUEVDVF9ERUFUSChmaXhlZF9jaGFubmVsX2ltcGwuUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2sodXNlcl9oYW5kbGVyLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6QmluZE9uY2UoW10oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IEZBSUwoKTsgfSkpLAotICAgICAgICAgICAgICAgIi4qT25DbG9zZUNhbGxiYWNrIGNhbiBvbmx5IGJlIHJlZ2lzdGVyZWQgb25jZS4qIik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QsIGNhbGxfYWNxdWlyZV9iZWZvcmVfcmVnaXN0cmF0aW9uX3Nob3VsZF9mYWlsKSB7Ci0gIDo6dGVzdGluZzo6RkxBR1NfZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSA9ICJ0aHJlYWRzYWZlIjsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyOwotICBFWFBFQ1RfQ0FMTChtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwgR2V0Q2xhc3NpY0xpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpKTsKLSAgdGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uKiBtb2NrX2FjbF9jb25uZWN0aW9uID0gbmV3IHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbigpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19hY2xfY29ubmVjdGlvbiwgR2V0QWRkcmVzcygpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIGwyY2FwX2hhbmRsZXJfKSkuVGltZXMoMSk7Ci0gIE1vY2tMaW5rIG1vY2tfY2xhc3NpY19saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+KG1vY2tfYWNsX2Nvbm5lY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIExpbmtNYW5hZ2VyICovKTsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNle2hjaTo6QWRkcmVzc3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsYXNzaWNfbGluaywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgRml4ZWRDaGFubmVsSW1wbCBmaXhlZF9jaGFubmVsX2ltcGwoa1NtcEJyQ2lkLCAmbW9ja19jbGFzc2ljX2xpbmssIGwyY2FwX2hhbmRsZXJfKTsKLSAgRVhQRUNUX0RFQVRIKGZpeGVkX2NoYW5uZWxfaW1wbC5BY3F1aXJlKCksICIuKk11c3QgcmVnaXN0ZXIgT25DbG9zZUNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIGFueSBtZXRob2RzLioiKTsKLX0KLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0ZpeGVkQ2hhbm5lbEltcGxUZXN0LCBjYWxsX3JlbGVhc2VfYmVmb3JlX3JlZ2lzdHJhdGlvbl9zaG91bGRfZmFpbCkgewotICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9ERUFUSChmaXhlZF9jaGFubmVsX2ltcGwuUmVsZWFzZSgpLCAiLipNdXN0IHJlZ2lzdGVyIE9uQ2xvc2VDYWxsYmFjayBiZWZvcmUgY2FsbGluZyBhbnkgbWV0aG9kcy4qIik7Ci19Ci0KLVRFU1RfRihMMmNhcENsYXNzaWNGaXhlZENoYW5uZWxJbXBsVGVzdCwgdGVzdF9hY3F1aXJlX3JlbGVhc2VfY2hhbm5lbCkgewotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLCBHZXRDbGFzc2ljTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCgpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwgR2V0Q2xhc3NpY0xpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpKTsKLSAgdGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uKiBtb2NrX2FjbF9jb25uZWN0aW9uID0gbmV3IHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbigpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19hY2xfY29ubmVjdGlvbiwgR2V0QWRkcmVzcygpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIGwyY2FwX2hhbmRsZXJfKSkuVGltZXMoMSk7Ci0gIE1vY2tMaW5rIG1vY2tfY2xhc3NpY19saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+KG1vY2tfYWNsX2Nvbm5lY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIExpbmtNYW5hZ2VyICovKTsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNle2hjaTo6QWRkcmVzc3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsYXNzaWNfbGluaywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgRml4ZWRDaGFubmVsSW1wbCBmaXhlZF9jaGFubmVsX2ltcGwoa1NtcEJyQ2lkLCAmbW9ja19jbGFzc2ljX2xpbmssIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBSZWdpc3RlciBvbiBjbG9zZSBjYWxsYmFjawotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotICBoY2k6OkVycm9yQ29kZSBteV9zdGF0dXMgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgZml4ZWRfY2hhbm5lbF9pbXBsLlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyLmdldCgpLAotICAgICAgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJm15X3N0YXR1c10oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IG15X3N0YXR1cyA9IHN0YXR1czsgfSkpOwotCi0gIC8vIERlZmF1bHQgc2hvdWxkIGJlIGZhbHNlCi0gIEVYUEVDVF9GQUxTRShmaXhlZF9jaGFubmVsX2ltcGwuSXNBY3F1aXJlZCgpKTsKLQotICAvLyBTaG91bGQgYmUgY2FsbGVkIDIgdGltZXMgYWZ0ZXIgQWNxdWlyZSgpIGFuZCBSZWxlYXNlKCkKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIFJlZnJlc2hSZWZDb3VudCgpKS5UaW1lcygyKTsKLQotICBmaXhlZF9jaGFubmVsX2ltcGwuQWNxdWlyZSgpOwotICBFWFBFQ1RfVFJVRShmaXhlZF9jaGFubmVsX2ltcGwuSXNBY3F1aXJlZCgpKTsKLQotICBmaXhlZF9jaGFubmVsX2ltcGwuUmVsZWFzZSgpOwotICBFWFBFQ1RfRkFMU0UoZml4ZWRfY2hhbm5lbF9pbXBsLklzQWNxdWlyZWQoKSk7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRDaGFubmVsSW1wbFRlc3QsIHRlc3RfYWNxdWlyZV9hZnRlcl9jbG9zZSkgewotICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSk7Ci0gIHRlc3Rpbmc6Ok1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciAqLyk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXtoY2k6OkFkZHJlc3N7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfY2xhc3NpY19saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgaGNpOjpFcnJvckNvZGUgbXlfc3RhdHVzID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBmaXhlZF9jaGFubmVsX2ltcGwuUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2sodXNlcl9oYW5kbGVyLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3N0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKLQotICAvLyBDaGFubmVsIGNsb3N1cmUgc2hvdWxkIHRyaWdnZXIgc3VjaCBjYWxsYmFjawotICBmaXhlZF9jaGFubmVsX2ltcGwuT25DbG9zZWQoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlci5nZXQoKSk7Ci0gIGF1dG8gZnV0dXJlX3N0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgRVhQRUNUX0VRKGhjaTo6RXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04sIG15X3N0YXR1cyk7Ci0KLSAgLy8gUmVsZWFzZSBvciBBY3F1aXJlIGFmdGVyIGNsb3Npbmcgc2hvdWxkIGNyYXNoCi0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19saW5rLCBSZWZyZXNoUmVmQ291bnQoKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9GQUxTRShmaXhlZF9jaGFubmVsX2ltcGwuSXNBY3F1aXJlZCgpKTsKLSAgRVhQRUNUX0RFQVRIKGZpeGVkX2NoYW5uZWxfaW1wbC5BY3F1aXJlKCksICIuKk11c3QgcmVnaXN0ZXIgT25DbG9zZUNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIGFueSBtZXRob2RzLioiKTsKLQotICB1c2VyX2hhbmRsZXItPkNsZWFyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbC5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY5ODNmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5GaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCgpID0gZGVmYXVsdDsKLQotICBzdHJ1Y3QgUGVuZGluZ1JlZ2lzdHJhdGlvbiB7Ci0gICAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfOwotICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfOwotICB9OwotCi0gIHZpcnR1YWwgdm9pZCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgIHVzZXJfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfLCBzdGQ6Om1vdmUoY2hhbm5lbCkpKTsKLSAgfQotCi0gIGZyaWVuZCBjbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIHByb3RlY3RlZCBhY2Nlc3MgZm9yIG1vY2tpbmcKLSAgRml4ZWRDaGFubmVsU2VydmljZUltcGwob3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6T25Db25uZWN0aW9uT3BlbkNhbGxiYWNrIG9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFjaykKLSAgICAgIDogdXNlcl9oYW5kbGVyXyh1c2VyX2hhbmRsZXIpLCBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfKHN0ZDo6bW92ZShvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2spKSB7fQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbF9tb2NrLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlYjA5NC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9pbXBsX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIDogcHVibGljIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIHsKLSBwdWJsaWM6Ci0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCgpIDogRml4ZWRDaGFubmVsU2VydmljZUltcGwobnVsbHB0ciwgRml4ZWRDaGFubmVsTWFuYWdlcjo6T25Db25uZWN0aW9uT3BlbkNhbGxiYWNrKCkpIHt9Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIE5vdGlmeUNoYW5uZWxDcmVhdGlvbiwgKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpLCAob3ZlcnJpZGUpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTc5NzAuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbC5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6UmVnaXN0ZXIoQ2lkIGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbDo6UGVuZGluZ1JlZ2lzdHJhdGlvbiBwZW5kaW5nX3JlZ2lzdHJhdGlvbikgewotICBpZiAoY2lkIDwga0ZpcnN0Rml4ZWRDaGFubmVsIHx8IGNpZCA+IGtMYXN0Rml4ZWRDaGFubmVsIHx8IGNpZCA9PSBrQ2xhc3NpY1NpZ25hbGxpbmdDaWQpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsU2VydmljZT4gaW52YWxpZF9zZXJ2aWNlKG5ldyBGaXhlZENoYW5uZWxTZXJ2aWNlKCkpOwotICAgIHBlbmRpbmdfcmVnaXN0cmF0aW9uLnVzZXJfaGFuZGxlcl8tPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2Uoc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uLm9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja18pLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdDo6RkFJTF9JTlZBTElEX1NFUlZJQ0UsIHN0ZDo6bW92ZShpbnZhbGlkX3NlcnZpY2UpKSk7Ci0gIH0gZWxzZSBpZiAoSXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbFNlcnZpY2U+IGludmFsaWRfc2VydmljZShuZXcgRml4ZWRDaGFubmVsU2VydmljZSgpKTsKLSAgICBwZW5kaW5nX3JlZ2lzdHJhdGlvbi51c2VyX2hhbmRsZXJfLT5Qb3N0KAotICAgICAgICBjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbi5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OkZBSUxfRFVQTElDQVRFX1NFUlZJQ0UsIHN0ZDo6bW92ZShpbnZhbGlkX3NlcnZpY2UpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc2VydmljZV9tYXBfLnRyeV9lbXBsYWNlKGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsU2VydmljZUltcGwocGVuZGluZ19yZWdpc3RyYXRpb24udXNlcl9oYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uLm9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFja18pKSk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbFNlcnZpY2U+IHVzZXJfc2VydmljZShuZXcgRml4ZWRDaGFubmVsU2VydmljZShjaWQsIHRoaXMsIGwyY2FwX2xheWVyX2hhbmRsZXJfKSk7Ci0gICAgcGVuZGluZ19yZWdpc3RyYXRpb24udXNlcl9oYW5kbGVyXy0+UG9zdCgKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZShzdGQ6Om1vdmUocGVuZGluZ19yZWdpc3RyYXRpb24ub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTLCBzdGQ6Om1vdmUodXNlcl9zZXJ2aWNlKSkpOwotICB9Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpVbnJlZ2lzdGVyKENpZCBjaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2U6Ok9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBpZiAoSXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKSB7Ci0gICAgc2VydmljZV9tYXBfLmVyYXNlKGNpZCk7Ci0gICAgaGFuZGxlci0+UG9zdChzdGQ6Om1vdmUoY2FsbGJhY2spKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoInNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQgY2lkOiVkIiwgY2lkKTsKLSAgfQotfQotCi1ib29sIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6SXNTZXJ2aWNlUmVnaXN0ZXJlZChDaWQgY2lkKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlX21hcF8uZmluZChjaWQpICE9IHNlcnZpY2VfbWFwXy5lbmQoKTsKLX0KLQotRml4ZWRDaGFubmVsU2VydmljZUltcGwqIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6R2V0U2VydmljZShDaWQgY2lkKSB7Ci0gIEFTU0VSVChJc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpOwotICByZXR1cm4gJnNlcnZpY2VfbWFwXy5maW5kKGNpZCktPnNlY29uZDsKLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGwqPj4gRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpHZXRSZWdpc3RlcmVkU2VydmljZXMoKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKj4+IHJlc3VsdHM7Ci0gIGZvciAoYXV0byYgZWxlbSA6IHNlcnZpY2VfbWFwXykgewotICAgIHJlc3VsdHMuZW1wbGFjZV9iYWNrKGVsZW0uZmlyc3QsICZlbGVtLnNlY29uZCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdHM7Ci19Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdGV4cHIgdWludDY0X3Qga1NpZ25hbGxpbmdDaGFubmVsTWFzayA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDY0X3Qga0Nvbm5lY3Rpb25sZXNzUmVjZXB0aW9uTWFzayA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDY0X3Qga0JyRWRyU2VjdXJpdHlNYW5hZ2VyID0gMHg4MDsKLX0gIC8vIG5hbWVzcGFjZQotCi11aW50NjRfdCBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OkdldFN1cHBvcnRlZEZpeGVkQ2hhbm5lbE1hc2soKSB7Ci0gIHVpbnQ2NF90IHJlc3VsdCA9IDA7Ci0gIHJlc3VsdCB8PSBrU2lnbmFsbGluZ0NoYW5uZWxNYXNrOyAgLy8gU2lnbmFsbGluZyBjaGFubmVsIGlzIG1hbmRhdG9yeQotICBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiBzZXJ2aWNlX21hcF8pIHsKLSAgICBDaWQgY2lkID0gZWxlbS5maXJzdDsKLSAgICBzd2l0Y2ggKGNpZCkgewotICAgICAgY2FzZSBrQ29ubmVjdGlvbmxlc3NDaWQ6Ci0gICAgICAgIHJlc3VsdCB8PSBrQ29ubmVjdGlvbmxlc3NSZWNlcHRpb25NYXNrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIGNhc2Uga1NtcEJyQ2lkOgotICAgICAgICByZXN1bHQgfD0ga0JyRWRyU2VjdXJpdHlNYW5hZ2VyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19XQVJOKCJVbmtub3duIGZpeGVkIGNoYW5uZWwgaXMgcmVnaXN0ZXJlZDogMHgleCIsIGNpZCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFkMjFkLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9pbXBsLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKG9zOjpIYW5kbGVyKiBsMmNhcF9sYXllcl9oYW5kbGVyKQotICAgICAgOiBsMmNhcF9sYXllcl9oYW5kbGVyXyhsMmNhcF9sYXllcl9oYW5kbGVyKSB7fQotICB2aXJ0dWFsIH5GaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQWxsIEFQSXMgbXVzdCBiZSBpbnZva2VkIGluIEwyQ0FQIGxheWVyIGhhbmRsZXIKLQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXIoQ2lkIGNpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb24pOwotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlcihDaWQgY2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlOjpPblVucmVnaXN0ZXJlZENhbGxiYWNrIGNhbGxiYWNrLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0gIHZpcnR1YWwgYm9vbCBJc1NlcnZpY2VSZWdpc3RlcmVkKENpZCBjaWQpIGNvbnN0OwotICB2aXJ0dWFsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKiBHZXRTZXJ2aWNlKENpZCBjaWQpOwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKj4+IEdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotICB2aXJ0dWFsIHVpbnQ2NF90IEdldFN1cHBvcnRlZEZpeGVkQ2hhbm5lbE1hc2soKTsKLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9sYXllcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsPiBzZXJ2aWNlX21hcF87Ci19OwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfbW9jay5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYTRjZi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIDogcHVibGljIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCB7Ci0gcHVibGljOgotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKCkgOiBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwobnVsbHB0cikge30KLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVnaXN0ZXIsIChDaWQgY2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbDo6UGVuZGluZ1JlZ2lzdHJhdGlvbiBwZW5kaW5nX3JlZ2lzdHJhdGlvbiksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBVbnJlZ2lzdGVyLCAoQ2lkIGNpZCwgRml4ZWRDaGFubmVsU2VydmljZTo6T25VbnJlZ2lzdGVyZWRDYWxsYmFjayBjYWxsYmFjaywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgSXNTZXJ2aWNlUmVnaXN0ZXJlZCwgKENpZCBjaWQpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKiwgR2V0U2VydmljZSwgKENpZCBjaWQpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKj4+KSwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzLCAoKSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDVkOGFmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMMmNhcENsYXNzaWNGaXhlZFNlcnZpY2VNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgfkwyY2FwQ2xhc3NpY0ZpeGVkU2VydmljZU1hbmFnZXJUZXN0KCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgT25TZXJ2aWNlUmVnaXN0ZXJlZChib29sIGV4cGVjdF9zdWNjZXNzLCBGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbFNlcnZpY2U+IHVzZXJfc2VydmljZSkgewotICAgIEVYUEVDVF9FUShyZXN1bHQgPT0gRml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTLCBleHBlY3Rfc3VjY2Vzcyk7Ci0gICAgc2VydmljZV9yZWdpc3RlcmVkXyA9IGV4cGVjdF9zdWNjZXNzOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgbWFuYWdlcl8gPSBuZXcgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBse251bGxwdHJ9OwotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICB1c2VyX2hhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICB1c2VyX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSB1c2VyX2hhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICAgIGRlbGV0ZSBtYW5hZ2VyXzsKLSAgfQotCi0gIHZvaWQgc3luY191c2VyX2hhbmRsZXIoKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgICB1c2VyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLCBjb21tb246OlVucmV0YWluZWQoJnByb21pc2UpKSk7Ci0gICAgZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMykpOwotICB9Ci0KLSAgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBtYW5hZ2VyXyA9IG51bGxwdHI7Ci0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0KLSAgYm9vbCBzZXJ2aWNlX3JlZ2lzdGVyZWRfID0gZmFsc2U7Ci19OwotCi1URVNUX0YoTDJjYXBDbGFzc2ljRml4ZWRTZXJ2aWNlTWFuYWdlclRlc3QsIHJlZ2lzdGVyX2FuZF91bnJlZ2lzdGVyX2NsYXNzaWNfZml4ZWRfY2hhbm5lbCkgewotICBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbDo6UGVuZGluZ1JlZ2lzdHJhdGlvbiBwZW5kaW5nX3JlZ2lzdHJhdGlvbnsKLSAgICAgIC51c2VyX2hhbmRsZXJfID0gdXNlcl9oYW5kbGVyXywKLSAgICAgIC5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfID0KLSAgICAgICAgICBjb21tb246OkJpbmRPbmNlKCZMMmNhcENsYXNzaWNGaXhlZFNlcnZpY2VNYW5hZ2VyVGVzdDo6T25TZXJ2aWNlUmVnaXN0ZXJlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCB0cnVlKX07Ci0gIENpZCBjaWQgPSBrU21wQnJDaWQ7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLSAgbWFuYWdlcl8tPlJlZ2lzdGVyKGNpZCwgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpOwotICBzeW5jX3VzZXJfaGFuZGxlcigpOwotICBFWFBFQ1RfVFJVRShzZXJ2aWNlX3JlZ2lzdGVyZWRfKTsKLSAgbWFuYWdlcl8tPlVucmVnaXN0ZXIoY2lkLCBjb21tb246OkJpbmRPbmNlKFtdIHt9KSwgdXNlcl9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLX0KLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0ZpeGVkU2VydmljZU1hbmFnZXJUZXN0LCByZWdpc3Rlcl9jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfYmFkX2NpZCkgewotICBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbDo6UGVuZGluZ1JlZ2lzdHJhdGlvbiBwZW5kaW5nX3JlZ2lzdHJhdGlvbnsKLSAgICAgIC51c2VyX2hhbmRsZXJfID0gdXNlcl9oYW5kbGVyXywKLSAgICAgIC5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfID0KLSAgICAgICAgICBjb21tb246OkJpbmRPbmNlKCZMMmNhcENsYXNzaWNGaXhlZFNlcnZpY2VNYW5hZ2VyVGVzdDo6T25TZXJ2aWNlUmVnaXN0ZXJlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBmYWxzZSl9OwotICBDaWQgY2lkID0gMHgxMDAwOwotICBFWFBFQ1RfRkFMU0UobWFuYWdlcl8tPklzU2VydmljZVJlZ2lzdGVyZWQoY2lkKSk7Ci0gIG1hbmFnZXJfLT5SZWdpc3RlcihjaWQsIHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbikpOwotICBFWFBFQ1RfRkFMU0UobWFuYWdlcl8tPklzU2VydmljZVJlZ2lzdGVyZWQoY2lkKSk7Ci0gIHN5bmNfdXNlcl9oYW5kbGVyKCk7Ci0gIEVYUEVDVF9GQUxTRShzZXJ2aWNlX3JlZ2lzdGVyZWRfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDRmMGQuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaCIKLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jbGFzc2ljX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9wYXJhbWV0ZXJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJvcy9hbGFybS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi11c2luZyBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZSA9IER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6UmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU7Ci11c2luZyBDb25uZWN0aW9uUmVzdWx0ID0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0OwotdXNpbmcgQ29ubmVjdGlvblJlc3VsdENvZGUgPSBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHRDb2RlOwotCi1MaW5rOjpMaW5rKAotICAgIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpDbGFzc2ljQWNsQ29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb24sCi0gICAgbDJjYXA6OmludGVybmFsOjpQYXJhbWV0ZXJQcm92aWRlciogcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBkeW5hbWljX3NlcnZpY2VfbWFuYWdlciwKLSAgICBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGZpeGVkX3NlcnZpY2VfbWFuYWdlciwKLSAgICBMaW5rTWFuYWdlciogbGlua19tYW5hZ2VyKQotICAgIDogbDJjYXBfaGFuZGxlcl8obDJjYXBfaGFuZGxlciksCi0gICAgICBhY2xfY29ubmVjdGlvbl8oc3RkOjptb3ZlKGFjbF9jb25uZWN0aW9uKSksCi0gICAgICBkYXRhX3BpcGVsaW5lX21hbmFnZXJfKGwyY2FwX2hhbmRsZXIsIHRoaXMsIGFjbF9jb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKSksCi0gICAgICBwYXJhbWV0ZXJfcHJvdmlkZXJfKHBhcmFtZXRlcl9wcm92aWRlciksCi0gICAgICBkeW5hbWljX3NlcnZpY2VfbWFuYWdlcl8oZHluYW1pY19zZXJ2aWNlX21hbmFnZXIpLAotICAgICAgZml4ZWRfc2VydmljZV9tYW5hZ2VyXyhmaXhlZF9zZXJ2aWNlX21hbmFnZXIpLAotICAgICAgbGlua19tYW5hZ2VyXyhsaW5rX21hbmFnZXIpLAotICAgICAgc2lnbmFsbGluZ19tYW5hZ2VyXygKLSAgICAgICAgICBsMmNhcF9oYW5kbGVyXywKLSAgICAgICAgICB0aGlzLAotICAgICAgICAgICZkYXRhX3BpcGVsaW5lX21hbmFnZXJfLAotICAgICAgICAgIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXywKLSAgICAgICAgICAmZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8sCi0gICAgICAgICAgZml4ZWRfc2VydmljZV9tYW5hZ2VyXyksCi0gICAgICBhY2xfaGFuZGxlXyhhY2xfY29ubmVjdGlvbl8tPkdldEhhbmRsZSgpKSB7Ci0gIEFTU0VSVChsMmNhcF9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgQVNTRVJUKGFjbF9jb25uZWN0aW9uXyAhPSBudWxscHRyKTsKLSAgQVNTRVJUKHBhcmFtZXRlcl9wcm92aWRlcl8gIT0gbnVsbHB0cik7Ci0gIGxpbmtfaWRsZV9kaXNjb25uZWN0X2FsYXJtXy5TY2hlZHVsZShjb21tb246OkJpbmRPbmNlKCZMaW5rOjpEaXNjb25uZWN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3Byb3ZpZGVyXy0+R2V0Q2xhc3NpY0xpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSk7Ci0gIGFjbF9jb25uZWN0aW9uXy0+UmVnaXN0ZXJDYWxsYmFja3ModGhpcywgbDJjYXBfaGFuZGxlcl8pOwotfQotCi12b2lkIExpbms6Ok9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgewotICBzaWduYWxsaW5nX21hbmFnZXJfLkNhbmNlbEFsYXJtKCk7Ci0gIGZpeGVkX2NoYW5uZWxfYWxsb2NhdG9yXy5PbkFjbERpc2Nvbm5lY3RlZChzdGF0dXMpOwotICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5PbkFjbERpc2Nvbm5lY3RlZChzdGF0dXMpOwotICBDb25uZWN0aW9uUmVzdWx0IHJlc3VsdHsKLSAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gQ29ubmVjdGlvblJlc3VsdENvZGU6OkZBSUxfSENJX0VSUk9SLAotICAgICAgLmhjaV9lcnJvciA9IHN0YXR1cywKLSAgICAgIC5sMmNhcF9jb25uZWN0aW9uX3Jlc3BvbnNlX3Jlc3VsdCA9IENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdDo6U1VDQ0VTUywKLSAgfTsKLSAgd2hpbGUgKCFsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfLmVtcHR5KCkpIHsKLSAgICBhdXRvIGVudHJ5ID0gbG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5iZWdpbigpOwotICAgIE5vdGlmeUNoYW5uZWxGYWlsKGVudHJ5LT5maXJzdCwgcmVzdWx0KTsKLSAgfQotfQotCi12b2lkIExpbms6OkRpc2Nvbm5lY3QoKSB7Ci0gIGFjbF9jb25uZWN0aW9uXy0+RGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb246OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci19Ci0KLXZvaWQgTGluazo6RW5jcnlwdCgpIHsKLSAgaWYgKGVuY3J5cHRpb25fZW5hYmxlZF8gPT0gaGNpOjpFbmNyeXB0aW9uRW5hYmxlZDo6T0ZGKSB7Ci0gICAgYWNsX2Nvbm5lY3Rpb25fLT5TZXRDb25uZWN0aW9uRW5jcnlwdGlvbihoY2k6OkVuYWJsZTo6RU5BQkxFRCk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rOjpBdXRoZW50aWNhdGUoKSB7Ci0gIGlmICghSXNBdXRoZW50aWNhdGVkKCkgJiYgIWhhc19yZXF1ZXN0ZWRfYXV0aGVudGljYXRpb25fKSB7Ci0gICAgaGFzX3JlcXVlc3RlZF9hdXRoZW50aWNhdGlvbl8gPSB0cnVlOwotICAgIGFjbF9jb25uZWN0aW9uXy0+QXV0aGVudGljYXRpb25SZXF1ZXN0ZWQoKTsKLSAgfQotfQotCi1ib29sIExpbms6OklzQXV0aGVudGljYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGVuY3J5cHRpb25fZW5hYmxlZF8gIT0gaGNpOjpFbmNyeXB0aW9uRW5hYmxlZDo6T0ZGOwotfQotCi12b2lkIExpbms6OlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24oKSB7Ci0gIGFjbF9jb25uZWN0aW9uXy0+UmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpOwotfQotCi12b2lkIExpbms6OlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcygpIHsKLSAgYWNsX2Nvbm5lY3Rpb25fLT5SZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoKTsKLX0KLQotdm9pZCBMaW5rOjpSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcyh1aW50OF90IHBhZ2VfbnVtYmVyKSB7Ci0gIGFjbF9jb25uZWN0aW9uXy0+UmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXMocGFnZV9udW1iZXIpOwotfQotCi12b2lkIExpbms6OlJlYWRDbG9ja09mZnNldCgpIHsKLSAgYWNsX2Nvbm5lY3Rpb25fLT5SZWFkQ2xvY2tPZmZzZXQoKTsKLX0KLQotdm9pZCBMaW5rOjpBY3F1aXJlU2VjdXJpdHlIb2xkKCkgewotICB1c2VkX2J5X3NlY3VyaXR5X21vZHVsZV8gPSB0cnVlOwotICBSZWZyZXNoUmVmQ291bnQoKTsKLX0KLXZvaWQgTGluazo6UmVsZWFzZVNlY3VyaXR5SG9sZCgpIHsKLSAgdXNlZF9ieV9zZWN1cml0eV9tb2R1bGVfID0gZmFsc2U7Ci0gIFJlZnJlc2hSZWZDb3VudCgpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Rml4ZWRDaGFubmVsSW1wbD4gTGluazo6QWxsb2NhdGVGaXhlZENoYW5uZWwoQ2lkIGNpZCkgewotICBhdXRvIGNoYW5uZWwgPSBmaXhlZF9jaGFubmVsX2FsbG9jYXRvcl8uQWxsb2NhdGVDaGFubmVsKGNpZCk7Ci0gIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8uQXR0YWNoQ2hhbm5lbChjaWQsIGNoYW5uZWwsIGwyY2FwOjppbnRlcm5hbDo6RGF0YVBpcGVsaW5lTWFuYWdlcjo6Q2hhbm5lbE1vZGU6OkJBU0lDKTsKLSAgcmV0dXJuIGNoYW5uZWw7Ci19Ci0KLWJvb2wgTGluazo6SXNGaXhlZENoYW5uZWxBbGxvY2F0ZWQoQ2lkIGNpZCkgewotICByZXR1cm4gZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfLklzQ2hhbm5lbEFsbG9jYXRlZChjaWQpOwotfQotCi1DaWQgTGluazo6UmVzZXJ2ZUR5bmFtaWNDaGFubmVsKCkgewotICByZXR1cm4gZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uUmVzZXJ2ZUNoYW5uZWwoKTsKLX0KLQotdm9pZCBMaW5rOjpTZW5kQ29ubmVjdGlvblJlcXVlc3QoUHNtIHBzbSwgQ2lkIGxvY2FsX2NpZCkgewotICBzaWduYWxsaW5nX21hbmFnZXJfLlNlbmRDb25uZWN0aW9uUmVxdWVzdChwc20sIGxvY2FsX2NpZCk7Ci19Ci0KLXZvaWQgTGluazo6U2VuZENvbm5lY3Rpb25SZXF1ZXN0KFBzbSBwc20sIENpZCBsb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24pIHsKLSAgaWYgKHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24uY29uZmlndXJhdGlvbl8uY2hhbm5lbF9tb2RlID09Ci0gICAgICAgICAgUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU6OkVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OICYmCi0gICAgICAhcmVtb3RlX2V4dGVuZGVkX2ZlYXR1cmVfcmVjZWl2ZWRfKSB7Ci0gICAgcGVuZGluZ19keW5hbWljX3BzbV9saXN0Xy5wdXNoX2JhY2socHNtKTsKLSAgICBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jYWxsYmFja19saXN0Xy5wdXNoX2JhY2soc3RkOjptb3ZlKHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24pKTsKLSAgICBMT0dfSU5GTygiV2lsbCBjb25uZWN0IGFmdGVyIGluZm9ybWF0aW9uIHJlc3BvbnNlIEVSVE0gZmVhdHVyZSBzdXBwb3J0IGlzIHJlY2VpdmVkIik7Ci0gICAgZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uRnJlZUNoYW5uZWwobG9jYWxfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAocGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbi5jb25maWd1cmF0aW9uXy5jaGFubmVsX21vZGUgPT0KLSAgICAgICAgICAgICAgICAgUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU6OkVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OICYmCi0gICAgICAgICAgICAgIUdldFJlbW90ZVN1cHBvcnRzRXJ0bSgpKSB7Ci0gICAgTE9HX1dBUk4oIlJlbW90ZSBkb2Vzbid0IHN1cHBvcnQgRVJUTS4gRHJvcHBpbmcgY29ubmVjdGlvbiByZXF1ZXN0Iik7Ci0gICAgQ29ubmVjdGlvblJlc3VsdCByZXN1bHR7Ci0gICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gQ29ubmVjdGlvblJlc3VsdENvZGU6OkZBSUxfUkVNT1RFX05PVF9TVVBQT1JULAotICAgIH07Ci0gICAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbi5vbl9mYWlsX2NhbGxiYWNrXy5JbnZva2UocmVzdWx0KTsKLSAgICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5GcmVlQ2hhbm5lbChsb2NhbF9jaWQpOwotICAgIHJldHVybjsKLSAgfSBlbHNlIHsKLSAgICBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfW2xvY2FsX2NpZF0gPSBzdGQ6Om1vdmUocGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbik7Ci0gICAgc2lnbmFsbGluZ19tYW5hZ2VyXy5TZW5kQ29ubmVjdGlvblJlcXVlc3QocHNtLCBsb2NhbF9jaWQpOwotICB9Ci19Ci0KLXZvaWQgTGluazo6U2V0Q2hhbm5lbFR4UHJpb3JpdHkoQ2lkIGxvY2FsX2NpZCwgYm9vbCBoaWdoX3ByaW9yaXR5KSB7Ci0gIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8uU2V0Q2hhbm5lbFR4UHJpb3JpdHkobG9jYWxfY2lkLCBoaWdoX3ByaW9yaXR5KTsKLX0KLQotdm9pZCBMaW5rOjpTZXRQZW5kaW5nRHluYW1pY0NoYW5uZWxzKHN0ZDo6bGlzdDxQc20+IHBzbV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uPiBjYWxsYmFja19saXN0KSB7Ci0gIEFTU0VSVChwc21fbGlzdC5zaXplKCkgPT0gY2FsbGJhY2tfbGlzdC5zaXplKCkpOwotICBwZW5kaW5nX2R5bmFtaWNfcHNtX2xpc3RfID0gc3RkOjptb3ZlKHBzbV9saXN0KTsKLSAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY2FsbGJhY2tfbGlzdF8gPSBzdGQ6Om1vdmUoY2FsbGJhY2tfbGlzdCk7Ci19Ci0KLXZvaWQgTGluazo6Y29ubmVjdF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHMoKSB7Ci0gIGF1dG8gcHNtID0gcGVuZGluZ19keW5hbWljX3BzbV9saXN0Xy5iZWdpbigpOwotICBhdXRvIGNhbGxiYWNrID0gcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY2FsbGJhY2tfbGlzdF8uYmVnaW4oKTsKLSAgd2hpbGUgKHBzbSAhPSBwZW5kaW5nX2R5bmFtaWNfcHNtX2xpc3RfLmVuZCgpKSB7Ci0gICAgU2VuZENvbm5lY3Rpb25SZXF1ZXN0KCpwc20sIFJlc2VydmVEeW5hbWljQ2hhbm5lbCgpLCBzdGQ6Om1vdmUoKmNhbGxiYWNrKSk7Ci0gICAgcHNtKys7Ci0gICAgY2FsbGJhY2srKzsKLSAgfQotfQotCi12b2lkIExpbms6OnNlbmRfcGVuZGluZ19jb25maWd1cmF0aW9uX3JlcXVlc3RzKCkgewotICBmb3IgKGF1dG8gbG9jYWxfY2lkIDogcGVuZGluZ19vdXRnb2luZ19jb25maWd1cmF0aW9uX3JlcXVlc3RfbGlzdF8pIHsKLSAgICBzaWduYWxsaW5nX21hbmFnZXJfLlNlbmRJbml0aWFsQ29uZmlnUmVxdWVzdChsb2NhbF9jaWQpOwotICB9Ci0gIHBlbmRpbmdfb3V0Z29pbmdfY29uZmlndXJhdGlvbl9yZXF1ZXN0X2xpc3RfLmNsZWFyKCk7Ci19Ci0KLXZvaWQgTGluazo6T25PdXRnb2luZ0Nvbm5lY3Rpb25SZXF1ZXN0RmFpbChDaWQgbG9jYWxfY2lkLCBDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgewotICBpZiAobG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5maW5kKGxvY2FsX2NpZCkgIT0KLSAgICAgIGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZW5kKCkpIHsKLSAgICBOb3RpZnlDaGFubmVsRmFpbChsb2NhbF9jaWQsIHJlc3VsdCk7Ci0gIH0KLSAgZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uRnJlZUNoYW5uZWwobG9jYWxfY2lkKTsKLX0KLQotdm9pZCBMaW5rOjpTZW5kSW5pdGlhbENvbmZpZ1JlcXVlc3RPclF1ZXVlKENpZCBsb2NhbF9jaWQpIHsKLSAgaWYgKHJlbW90ZV9leHRlbmRlZF9mZWF0dXJlX3JlY2VpdmVkXykgewotICAgIHNpZ25hbGxpbmdfbWFuYWdlcl8uU2VuZEluaXRpYWxDb25maWdSZXF1ZXN0KGxvY2FsX2NpZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcGVuZGluZ19vdXRnb2luZ19jb25maWd1cmF0aW9uX3JlcXVlc3RfbGlzdF8ucHVzaF9iYWNrKGxvY2FsX2NpZCk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rOjpTZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoQ2lkIGxvY2FsX2NpZCwgQ2lkIHJlbW90ZV9jaWQpIHsKLSAgc2lnbmFsbGluZ19tYW5hZ2VyXy5TZW5kRGlzY29ubmVjdGlvblJlcXVlc3QobG9jYWxfY2lkLCByZW1vdGVfY2lkKTsKLX0KLQotdm9pZCBMaW5rOjpTZW5kSW5mb3JtYXRpb25SZXF1ZXN0KEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlIHR5cGUpIHsKLSAgc2lnbmFsbGluZ19tYW5hZ2VyXy5TZW5kSW5mb3JtYXRpb25SZXF1ZXN0KHR5cGUpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8bDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEltcGw+IExpbms6OkFsbG9jYXRlRHluYW1pY0NoYW5uZWwoUHNtIHBzbSwgQ2lkIHJlbW90ZV9jaWQpIHsKLSAgYXV0byBjaGFubmVsID0gZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uQWxsb2NhdGVDaGFubmVsKHBzbSwgcmVtb3RlX2NpZCk7Ci0gIGlmIChjaGFubmVsICE9IG51bGxwdHIpIHsKLSAgICBSZWZyZXNoUmVmQ291bnQoKTsKLSAgICBjaGFubmVsLT5sb2NhbF9pbml0aWF0ZWRfID0gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGNoYW5uZWw7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsSW1wbD4gTGluazo6QWxsb2NhdGVSZXNlcnZlZER5bmFtaWNDaGFubmVsKENpZCByZXNlcnZlZF9jaWQsIFBzbSBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaWQgcmVtb3RlX2NpZCkgewotICBhdXRvIGNoYW5uZWwgPSBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5BbGxvY2F0ZVJlc2VydmVkQ2hhbm5lbChyZXNlcnZlZF9jaWQsIHBzbSwgcmVtb3RlX2NpZCk7Ci0gIGlmIChjaGFubmVsICE9IG51bGxwdHIpIHsKLSAgICBSZWZyZXNoUmVmQ291bnQoKTsKLSAgfQotICBjaGFubmVsLT5sb2NhbF9pbml0aWF0ZWRfID0gdHJ1ZTsKLSAgcmV0dXJuIGNoYW5uZWw7Ci19Ci0KLWNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBMaW5rOjpHZXRDb25maWd1cmF0aW9uRm9ySW5pdGlhbENvbmZpZ3VyYXRpb24oQ2lkIGNpZCkgewotICBBU1NFUlQobG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5maW5kKGNpZCkgIT0KLSAgICAgICAgIGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZW5kKCkpOwotICByZXR1cm4gbG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwX1tjaWRdLmNvbmZpZ3VyYXRpb25fOwotfQotCi12b2lkIExpbms6OkZyZWVEeW5hbWljQ2hhbm5lbChDaWQgY2lkKSB7Ci0gIGlmIChkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5GaW5kQ2hhbm5lbEJ5Q2lkKGNpZCkgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsKLSAgfQotICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5GcmVlQ2hhbm5lbChjaWQpOwotICBSZWZyZXNoUmVmQ291bnQoKTsKLX0KLQotdm9pZCBMaW5rOjpSZWZyZXNoUmVmQ291bnQoKSB7Ci0gIGludCByZWZfY291bnQgPSAwOwotICByZWZfY291bnQgKz0gZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfLkdldFJlZkNvdW50KCk7Ci0gIHJlZl9jb3VudCArPSBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5OdW1iZXJPZkNoYW5uZWxzKCk7Ci0gIGlmICh1c2VkX2J5X3NlY3VyaXR5X21vZHVsZV8pIHsKLSAgICByZWZfY291bnQgKz0gMTsKLSAgfQotICBBU1NFUlRfTE9HKHJlZl9jb3VudCA+PSAwLCAicmVmX2NvdW50ICVkIGlzIGxlc3MgdGhhbiAwIiwgcmVmX2NvdW50KTsKLSAgaWYgKHJlZl9jb3VudCA+IDApIHsKLSAgICBsaW5rX2lkbGVfZGlzY29ubmVjdF9hbGFybV8uQ2FuY2VsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgbGlua19pZGxlX2Rpc2Nvbm5lY3RfYWxhcm1fLlNjaGVkdWxlKGNvbW1vbjo6QmluZE9uY2UoJkxpbms6OkRpc2Nvbm5lY3QsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9wcm92aWRlcl8tPkdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpOwotICB9Ci19Ci0KLXZvaWQgTGluazo6Tm90aWZ5Q2hhbm5lbENyZWF0aW9uKENpZCBjaWQsIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbD4gdXNlcl9jaGFubmVsKSB7Ci0gIEFTU0VSVChsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfLmZpbmQoY2lkKSAhPQotICAgICAgICAgbG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5lbmQoKSk7Ci0gIGF1dG8mIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24gPSBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfW2NpZF07Ci0gIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24ub25fb3Blbl9jYWxsYmFja18uSW52b2tlKHN0ZDo6bW92ZSh1c2VyX2NoYW5uZWwpKTsKLSAgbG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5lcmFzZShjaWQpOwotfQotCi12b2lkIExpbms6Ok5vdGlmeUNoYW5uZWxGYWlsKENpZCBjaWQsIENvbm5lY3Rpb25SZXN1bHQgcmVzdWx0KSB7Ci0gIEFTU0VSVChsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfLmZpbmQoY2lkKSAhPQotICAgICAgICAgbG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5lbmQoKSk7Ci0gIGF1dG8mIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24gPSBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfW2NpZF07Ci0gIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24ub25fZmFpbF9jYWxsYmFja18uSW52b2tlKHJlc3VsdCk7Ci0gIGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZXJhc2UoY2lkKTsKLX0KLQotdm9pZCBMaW5rOjpTZXRSZW1vdGVDb25uZWN0aW9ubGVzc010dShNdHUgbXR1KSB7Ci0gIHJlbW90ZV9jb25uZWN0aW9ubGVzc19tdHVfID0gbXR1OwotfQotCi1NdHUgTGluazo6R2V0UmVtb3RlQ29ubmVjdGlvbmxlc3NNdHUoKSBjb25zdCB7Ci0gIHJldHVybiByZW1vdGVfY29ubmVjdGlvbmxlc3NfbXR1XzsKLX0KLQotYm9vbCBMaW5rOjpHZXRSZW1vdGVTdXBwb3J0c0VydG0oKSBjb25zdCB7Ci0gIHJldHVybiByZW1vdGVfc3VwcG9ydHNfZXJ0bV87Ci19Ci0KLWJvb2wgTGluazo6R2V0UmVtb3RlU3VwcG9ydHNGY3MoKSBjb25zdCB7Ci0gIHJldHVybiByZW1vdGVfc3VwcG9ydHNfZmNzXzsKLX0KLQotdm9pZCBMaW5rOjpPblJlbW90ZUV4dGVuZGVkRmVhdHVyZVJlY2VpdmVkKGJvb2wgZXJ0bV9zdXBwb3J0ZWQsIGJvb2wgZmNzX3N1cHBvcnRlZCkgewotICByZW1vdGVfc3VwcG9ydHNfZXJ0bV8gPSBlcnRtX3N1cHBvcnRlZDsKLSAgcmVtb3RlX3N1cHBvcnRzX2Zjc18gPSBmY3Nfc3VwcG9ydGVkOwotICByZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZV9yZWNlaXZlZF8gPSB0cnVlOwotICBjb25uZWN0X3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVscygpOwotICBzZW5kX3BlbmRpbmdfY29uZmlndXJhdGlvbl9yZXF1ZXN0cygpOwotfQotCi12b2lkIExpbms6Ok9uQ29ubmVjdGlvblBhY2tldFR5cGVDaGFuZ2VkKHVpbnQxNl90IHBhY2tldF90eXBlKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIHBhY2tldF90eXBlOiV4IiwgX19mdW5jX18sIHBhY2tldF90eXBlKTsKLX0KLQotdm9pZCBMaW5rOjpPbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cykgewotICBsaW5rX21hbmFnZXJfLT5PbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoaGNpX3N0YXR1cywgR2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpKTsKLX0KLQotdm9pZCBMaW5rOjpPbkVuY3J5cHRpb25DaGFuZ2UoaGNpOjpFbmNyeXB0aW9uRW5hYmxlZCBlbmFibGVkKSB7Ci0gIGVuY3J5cHRpb25fZW5hYmxlZF8gPSBlbmFibGVkOwotICBsaW5rX21hbmFnZXJfLT5PbkVuY3J5cHRpb25DaGFuZ2UoR2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpLCBlbmFibGVkKTsKLSAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IGVuY3J5cHRpb25fY2hhbmdlX2xpc3RlbmVyXykgewotICAgIHNpZ25hbGxpbmdfbWFuYWdlcl8ub25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9vdXRnb2luZygKLSAgICAgICAgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpTZWN1cml0eUVuZm9yY2VtZW50VHlwZTo6RU5DUllQVElPTiwKLSAgICAgICAgbGlzdGVuZXIucHNtLAotICAgICAgICBsaXN0ZW5lci5jaWQsCi0gICAgICAgIGVuYWJsZWQgIT0gaGNpOjpFbmNyeXB0aW9uRW5hYmxlZDo6T0ZGKTsKLSAgfQotfQotCi12b2lkIExpbms6Ok9uQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZSgpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgTGluazo6T25SZWFkQ2xvY2tPZmZzZXRDb21wbGV0ZSh1aW50MTZfdCBjbG9ja19vZmZzZXQpIHsKLSAgbGlua19tYW5hZ2VyXy0+T25SZWFkQ2xvY2tPZmZzZXQoR2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpLCBjbG9ja19vZmZzZXQpOwotfQotCi12b2lkIExpbms6Ok9uTW9kZUNoYW5nZShoY2k6OkVycm9yQ29kZSBzdGF0dXMsIGhjaTo6TW9kZSBjdXJyZW50X21vZGUsIHVpbnQxNl90IGludGVydmFsKSB7Ci0gIGxpbmtfbWFuYWdlcl8tPk9uTW9kZUNoYW5nZShzdGF0dXMsIEdldERldmljZSgpLkdldEFkZHJlc3MoKSwgY3VycmVudF9tb2RlLCBpbnRlcnZhbCk7Ci19Ci0KLXZvaWQgTGluazo6T25TbmlmZlN1YnJhdGluZygKLSAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCkgewotICBsaW5rX21hbmFnZXJfLT5PblNuaWZmU3VicmF0aW5nKAotICAgICAgaGNpX3N0YXR1cywKLSAgICAgIEdldERldmljZSgpLkdldEFkZHJlc3MoKSwKLSAgICAgIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgIG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgICAgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgIG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci19Ci0KLXZvaWQgTGluazo6T25Rb3NTZXR1cENvbXBsZXRlKGhjaTo6U2VydmljZVR5cGUgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3ksIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbikgewotICBMT0dfSU5GTygKLSAgICAgICJVTklNUExFTUVOVEVEICVzIHNlcnZpY2VfdHlwZTolcyB0b2tlbl9yYXRlOiVkIHBlYWtfYmFuZHdpZHRoOiVkIGxhdGVuY3k6JWQgZGVsYXlfdmFyaXRhdGlvbjolZCIsCi0gICAgICBfX2Z1bmNfXywKLSAgICAgIGhjaTo6U2VydmljZVR5cGVUZXh0KHNlcnZpY2VfdHlwZSkuY19zdHIoKSwKLSAgICAgIHRva2VuX3JhdGUsCi0gICAgICBwZWFrX2JhbmR3aWR0aCwKLSAgICAgIGxhdGVuY3ksCi0gICAgICBkZWxheV92YXJpYXRpb24pOwotfQotdm9pZCBMaW5rOjpPbkZsb3dTcGVjaWZpY2F0aW9uQ29tcGxldGUoaGNpOjpGbG93RGlyZWN0aW9uIGZsb3dfZGlyZWN0aW9uLCBoY2k6OlNlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRva2VuX3JhdGUsIHVpbnQzMl90IHRva2VuX2J1Y2tldF9zaXplLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjY2Vzc19sYXRlbmN5KSB7Ci0gIExPR19JTkZPKAotICAgICAgIlVOSU1QTEVNRU5URUQgJXMgZmxvd19kaXJlY3Rpb246JXMgc2VydmljZV90eXBlOiVzIHRva2VuX3JhdGU6JWQgdG9rZW5fYnVja2V0X3NpemU6JWQgcGVha19iYW5kd2lkdGg6JWQgIgotICAgICAgImFjY2Vzc19sYXRlbmN5OiVkIiwKLSAgICAgIF9fZnVuY19fLAotICAgICAgaGNpOjpGbG93RGlyZWN0aW9uVGV4dChmbG93X2RpcmVjdGlvbikuY19zdHIoKSwKLSAgICAgIGhjaTo6U2VydmljZVR5cGVUZXh0KHNlcnZpY2VfdHlwZSkuY19zdHIoKSwKLSAgICAgIHRva2VuX3JhdGUsCi0gICAgICB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgIHBlYWtfYmFuZHdpZHRoLAotICAgICAgYWNjZXNzX2xhdGVuY3kpOwotfQotdm9pZCBMaW5rOjpPbkZsdXNoT2NjdXJyZWQoKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotdm9pZCBMaW5rOjpPblJvbGVEaXNjb3ZlcnlDb21wbGV0ZShoY2k6OlJvbGUgY3VycmVudF9yb2xlKSB7Ci0gIHJvbGVfID0gY3VycmVudF9yb2xlOwotfQotdm9pZCBMaW5rOjpPblJlYWRMaW5rUG9saWN5U2V0dGluZ3NDb21wbGV0ZSh1aW50MTZfdCBsaW5rX3BvbGljeV9zZXR0aW5ncykgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBsaW5rX3BvbGljeV9zZXR0aW5nczoweCV4IiwgX19mdW5jX18sIGxpbmtfcG9saWN5X3NldHRpbmdzKTsKLX0KLXZvaWQgTGluazo6T25SZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Q29tcGxldGUodWludDE2X3QgZmx1c2hfdGltZW91dCkgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBmbHVzaF90aW1lb3V0OiVkIiwgX19mdW5jX18sIGZsdXNoX3RpbWVvdXQpOwotfQotdm9pZCBMaW5rOjpPblJlYWRUcmFuc21pdFBvd2VyTGV2ZWxDb21wbGV0ZSh1aW50OF90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIHRyYW5zbWl0X3Bvd2VyX2xldmVsOiVkIiwgX19mdW5jX18sIHRyYW5zbWl0X3Bvd2VyX2xldmVsKTsKLX0KLXZvaWQgTGluazo6T25SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlKHVpbnQxNl90IGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCkgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBsaW5rX3N1cGVydmlzaW9uX3RpbWVvdXQ6JWQiLCBfX2Z1bmNfXywgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KTsKLX0KLXZvaWQgTGluazo6T25SZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZSh1aW50MTZfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzZmFpbGVkX2NvbnRhY3RfY291bnRlcjolaHUiLCBfX2Z1bmNfXywgZmFpbGVkX2NvbnRhY3RfY291bnRlcik7Ci19Ci12b2lkIExpbms6Ok9uUmVhZExpbmtRdWFsaXR5Q29tcGxldGUodWludDhfdCBsaW5rX3F1YWxpdHkpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgbGlua19xdWFsaXR5OiVoaHUiLCBfX2Z1bmNfXywgbGlua19xdWFsaXR5KTsKLX0KLXZvaWQgTGluazo6T25SZWFkQWZoQ2hhbm5lbE1hcENvbXBsZXRlKGhjaTo6QWZoTW9kZSBhZmhfbW9kZSwgc3RkOjphcnJheTx1aW50OF90LCAxMD4gYWZoX2NoYW5uZWxfbWFwKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGFmaF9tb2RlOiVzIiwgX19mdW5jX18sIGhjaTo6QWZoTW9kZVRleHQoYWZoX21vZGUpLmNfc3RyKCkpOwotfQotdm9pZCBMaW5rOjpPblJlYWRSc3NpQ29tcGxldGUodWludDhfdCByc3NpKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIHJzc2k6JWhoZCIsIF9fZnVuY19fLCByc3NpKTsKLX0KLXZvaWQgTGluazo6T25SZWFkQ2xvY2tDb21wbGV0ZSh1aW50MzJfdCBjbG9jaywgdWludDE2X3QgYWNjdXJhY3kpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgY2xvY2s6JXUgYWNjdXJhY3k6JWh1IiwgX19mdW5jX18sIGNsb2NrLCBhY2N1cmFjeSk7Ci19Ci12b2lkIExpbms6Ok9uQ2VudHJhbExpbmtLZXlDb21wbGV0ZShoY2k6OktleUZsYWcga2V5X2ZsYWcpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQga2V5X2ZsYWc6JXMiLCBoY2k6OktleUZsYWdUZXh0KGtleV9mbGFnKS5jX3N0cigpKTsKLX0KLXZvaWQgTGluazo6T25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6Um9sZSBuZXdfcm9sZSkgewotICByb2xlXyA9IG5ld19yb2xlOwotICBsaW5rX21hbmFnZXJfLT5PblJvbGVDaGFuZ2UoaGNpX3N0YXR1cywgR2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpLCBuZXdfcm9sZSk7Ci19Ci12b2lkIExpbms6Ok9uRGlzY29ubmVjdGlvbihoY2k6OkVycm9yQ29kZSByZWFzb24pIHsKLSAgT25BY2xEaXNjb25uZWN0ZWQocmVhc29uKTsKLSAgbGlua19tYW5hZ2VyXy0+T25EaXNjb25uZWN0KEdldERldmljZSgpLkdldEFkZHJlc3MoKSwgcmVhc29uKTsKLX0KLXZvaWQgTGluazo6T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUoCi0gICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSB7Ci0gIExPR19JTkZPKAotICAgICAgIlVOSU1QTEVNRU5URUQgaGNpX3N0YXR1czolcyBsbXBfdmVyc2lvbjolaGh1IG1hbnVmYWN0dXJlcl9uYW1lOiVodSBzdWJfdmVyc2lvbjolaHUiLAotICAgICAgRXJyb3JDb2RlVGV4dChoY2lfc3RhdHVzKS5jX3N0cigpLAotICAgICAgbG1wX3ZlcnNpb24sCi0gICAgICBtYW51ZmFjdHVyZXJfbmFtZSwKLSAgICAgIHN1Yl92ZXJzaW9uKTsKLSAgbGlua19tYW5hZ2VyXy0+T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKAotICAgICAgaGNpX3N0YXR1cywgR2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpLCBsbXBfdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLX0KLXZvaWQgTGluazo6T25SZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXNDb21wbGV0ZSh1aW50NjRfdCBmZWF0dXJlcykgewotICBMT0dfSU5GTygicGFnZV9udW1iZXI6JWhodSBmZWF0dXJlczoweCVseCIsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDApLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihmZWF0dXJlcykpOwotICBsaW5rX21hbmFnZXJfLT5PblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyhHZXREZXZpY2UoKS5HZXRBZGRyZXNzKCksIGZlYXR1cmVzKTsKLX0KLQotdm9pZCBMaW5rOjpPblJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzQ29tcGxldGUodWludDhfdCBwYWdlX251bWJlciwgdWludDhfdCBtYXhfcGFnZV9udW1iZXIsIHVpbnQ2NF90IGZlYXR1cmVzKSB7Ci0gIExPR19JTkZPKAotICAgICAgInBhZ2VfbnVtYmVyOiVoaHUgbWF4X3BhZ2VfbnVtYmVyOiVoaHUgZmVhdHVyZXM6MHglbHgiLAotICAgICAgcGFnZV9udW1iZXIsCi0gICAgICBtYXhfcGFnZV9udW1iZXIsCi0gICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihmZWF0dXJlcykpOwotICBsaW5rX21hbmFnZXJfLT5PblJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKEdldERldmljZSgpLkdldEFkZHJlc3MoKSwgcGFnZV9udW1iZXIsIG1heF9wYWdlX251bWJlciwgZmVhdHVyZXMpOwotfQotCi12b2lkIExpbms6OkFkZEVuY3J5cHRpb25DaGFuZ2VMaXN0ZW5lcihFbmNyeXB0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgZW5jcnlwdGlvbl9jaGFuZ2VfbGlzdGVuZXJfLnB1c2hfYmFjayhsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgTGluazo6T25QZW5kaW5nUGFja2V0Q2hhbmdlKENpZCBsb2NhbF9jaWQsIGJvb2wgaGFzX3BhY2tldCkgewotICBpZiAoaGFzX3BhY2tldCkgewotICAgIHJlbWFpbmluZ19wYWNrZXRzX3RvX2JlX3NlbnRfKys7Ci0gIH0gZWxzZSB7Ci0gICAgcmVtYWluaW5nX3BhY2tldHNfdG9fYmVfc2VudF8tLTsKLSAgfQotICBpZiAobGlua19tYW5hZ2VyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19tYW5hZ2VyXy0+T25QZW5kaW5nUGFja2V0Q2hhbmdlKEdldERldmljZSgpLkdldEFkZHJlc3MoKSwgcmVtYWluaW5nX3BhY2tldHNfdG9fYmVfc2VudF8pOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViMTdhOS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jbGFzc2ljX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfY29uZmlndXJhdGlvbl9vcHRpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9zZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9kYXRhX3BpcGVsaW5lX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2lsaW5rLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAib3MvYWxhcm0uaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAic2lnbmFsbGluZ19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIExpbmtNYW5hZ2VyOwotY2xhc3MgRHVtcHN5c0hlbHBlcjsKLQotY2xhc3MgTGluayA6IHB1YmxpYyBsMmNhcDo6aW50ZXJuYWw6OklMaW5rLCBwdWJsaWMgaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgTGluayhvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlciwgc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkNsYXNzaWNBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbiwKLSAgICAgICBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKiBwYXJhbWV0ZXJfcHJvdmlkZXIsCi0gICAgICAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyLCBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGZpeGVkX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgICBMaW5rTWFuYWdlciogbGlua19tYW5hZ2VyKTsKLQotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBHZXREZXZpY2UoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHthY2xfY29ubmVjdGlvbl8tPkdldEFkZHJlc3MoKSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfTsKLSAgfQotCi0gIHN0cnVjdCBQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHsKLSAgICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fb3Blbl9jYWxsYmFja187Ci0gICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25GYWlsdXJlQ2FsbGJhY2sgb25fZmFpbF9jYWxsYmFja187Ci0gICAgY2xhc3NpYzo6RHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fOwotICB9OwotCi0gIHN0cnVjdCBQZW5kaW5nQXV0aGVudGljYXRlRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHsKLSAgICBQc20gcHNtXzsKLSAgICBDaWQgY2lkXzsKLSAgICBQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fOwotICB9OwotCi0gIC8vIEFDTCBtZXRob2RzCi0KLSAgdmlydHVhbCB2b2lkIE9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlIHN0YXR1cyk7Ci0KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QoKTsKLQotICB2aXJ0dWFsIHZvaWQgRW5jcnlwdCgpOwotCi0gIHZpcnR1YWwgdm9pZCBBdXRoZW50aWNhdGUoKTsKLQotICB2aXJ0dWFsIGJvb2wgSXNBdXRoZW50aWNhdGVkKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIFJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24oKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzKCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKHVpbnQ4X3QgcGFnZV9udW1iZXIpOwotCi0gIHZpcnR1YWwgdm9pZCBSZWFkQ2xvY2tPZmZzZXQoKTsKLQotICAvLyBJbmNyZWFzZSB0aGUgbGluayB1c2FnZSByZWZjb3VudCB0byBlbnN1cmUgdGhlIGxpbmsgd29uJ3QgYmUgZGlzY29ubmVjdGVkIHdoZW4gU2VjdXJpdHlNb2R1bGUgbmVlZHMgaXQKLSAgdmlydHVhbCB2b2lkIEFjcXVpcmVTZWN1cml0eUhvbGQoKTsKLQotICAvLyBEZWNyZWFzZSB0aGUgbGluayB1c2FnZSByZWZjb3VudCB3aGVuIFNlY3VyaXR5TW9kdWxlIG5vIGxvbmdlciBuZWVkcyBpdAotICB2aXJ0dWFsIHZvaWQgUmVsZWFzZVNlY3VyaXR5SG9sZCgpOwotCi0gIC8vIEZpeGVkQ2hhbm5lbCBtZXRob2RzCi0KLSAgc3RkOjpzaGFyZWRfcHRyPEZpeGVkQ2hhbm5lbEltcGw+IEFsbG9jYXRlRml4ZWRDaGFubmVsKENpZCBjaWQpOwotCi0gIHZpcnR1YWwgYm9vbCBJc0ZpeGVkQ2hhbm5lbEFsbG9jYXRlZChDaWQgY2lkKTsKLQotICAvLyBEeW5hbWljQ2hhbm5lbCBtZXRob2RzCi0KLSAgdmlydHVhbCBDaWQgUmVzZXJ2ZUR5bmFtaWNDaGFubmVsKCk7Ci0KLSAgdmlydHVhbCB2b2lkIFNlbmRDb25uZWN0aW9uUmVxdWVzdChQc20gcHNtLCBDaWQgbG9jYWxfY2lkKTsKLSAgdmlydHVhbCB2b2lkIFNlbmRDb25uZWN0aW9uUmVxdWVzdChQc20gcHNtLCBDaWQgbG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbik7Ci0gIHZvaWQgU2V0Q2hhbm5lbFR4UHJpb3JpdHkoQ2lkIGxvY2FsX2NpZCwgYm9vbCBoaWdoX3ByaW9yaXR5KSBvdmVycmlkZTsKLQotICAvLyBXaGVuIGEgTGluayBpcyBlc3RhYmxpc2hlZCwgTGlua01hbmFnZXIgbm90aWZpZXMgcGVuZGluZyBkeW5hbWljIGNoYW5uZWxzIHRvIGNvbm5lY3QKLSAgdmlydHVhbCB2b2lkIFNldFBlbmRpbmdEeW5hbWljQ2hhbm5lbHMoc3RkOjpsaXN0PFBzbT4gcHNtX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uPiBjYWxsYmFja19saXN0KTsKLQotICAvLyBJbnZva2VkIGJ5IHNpZ25hbGxpbmcgbWFuYWdlciB0byBpbmRpY2F0ZSBhbiBvdXRnb2luZyBjb25uZWN0aW9uIHJlcXVlc3QgZmFpbGVkIGFuZCBsaW5rIHNoYWxsIGZyZWUgcmVzb3VyY2VzCi0gIHZpcnR1YWwgdm9pZCBPbk91dGdvaW5nQ29ubmVjdGlvblJlcXVlc3RGYWlsKENpZCBsb2NhbF9jaWQsIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpOwotCi0gIHZpcnR1YWwgdm9pZCBTZW5kSW5pdGlhbENvbmZpZ1JlcXVlc3RPclF1ZXVlKENpZCBsb2NhbF9jaWQpOwotCi0gIHZpcnR1YWwgdm9pZCBTZW5kSW5mb3JtYXRpb25SZXF1ZXN0KEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlIHR5cGUpOwotCi0gIHZpcnR1YWwgdm9pZCBTZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoQ2lkIGxvY2FsX2NpZCwgQ2lkIHJlbW90ZV9jaWQpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiBBbGxvY2F0ZUR5bmFtaWNDaGFubmVsKFBzbSBwc20sIENpZCByZW1vdGVfY2lkKTsKLQotICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsSW1wbD4gQWxsb2NhdGVSZXNlcnZlZER5bmFtaWNDaGFubmVsKENpZCByZXNlcnZlZF9jaWQsIFBzbSBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lkIHJlbW90ZV9jaWQpOwotCi0gIHZpcnR1YWwgY2xhc3NpYzo6RHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIEdldENvbmZpZ3VyYXRpb25Gb3JJbml0aWFsQ29uZmlndXJhdGlvbihDaWQgY2lkKTsKLQotICB2aXJ0dWFsIHZvaWQgRnJlZUR5bmFtaWNDaGFubmVsKENpZCBjaWQpOwotCi0gIC8vIENoZWNrIGhvdyBtYW55IGNoYW5uZWxzIGFyZSBhY3F1aXJlZCBvciBpbiB1c2UsIGlmIHplcm8sIHN0YXJ0IHRlYXIgZG93biB0aW1lciwgaWYgbm9uLXplcm8sIGNhbmNlbCB0ZWFyIGRvd24gdGltZXIKLSAgdmlydHVhbCB2b2lkIFJlZnJlc2hSZWZDb3VudCgpOwotCi0gIHZpcnR1YWwgdm9pZCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oQ2lkIGNpZCwgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsPiBjaGFubmVsKTsKLSAgdmlydHVhbCB2b2lkIE5vdGlmeUNoYW5uZWxGYWlsKENpZCBjaWQsIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpOwotCi0gIC8vIEluZm9ybWF0aW9uIHJlY2VpdmVkIGZyb20gc2lnbmFsaW5nIGNoYW5uZWwKLSAgdmlydHVhbCB2b2lkIFNldFJlbW90ZUNvbm5lY3Rpb25sZXNzTXR1KE10dSBtdHUpOwotICB2aXJ0dWFsIE10dSBHZXRSZW1vdGVDb25uZWN0aW9ubGVzc010dSgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgR2V0UmVtb3RlU3VwcG9ydHNFcnRtKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBHZXRSZW1vdGVTdXBwb3J0c0ZjcygpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgT25SZW1vdGVFeHRlbmRlZEZlYXR1cmVSZWNlaXZlZChib29sIGVydG1fc3VwcG9ydGVkLCBib29sIGZjc19zdXBwb3J0ZWQpOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldERldmljZSgpLlRvU3RyaW5nKCk7Ci0gIH0KLQotICB2b2lkIFNlbmRMZUNyZWRpdChDaWQgbG9jYWxfY2lkLCB1aW50MTZfdCBjcmVkaXQpIG92ZXJyaWRlIHt9Ci0KLSAgLy8gQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MKLSAgdm9pZCBPbkNvbm5lY3Rpb25QYWNrZXRUeXBlQ2hhbmdlZCh1aW50MTZfdCBwYWNrZXRfdHlwZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMpIG92ZXJyaWRlOwotICB2b2lkIE9uRW5jcnlwdGlvbkNoYW5nZShoY2k6OkVuY3J5cHRpb25FbmFibGVkIGVuYWJsZWQpIG92ZXJyaWRlOwotICB2b2lkIE9uQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZSgpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVhZENsb2NrT2Zmc2V0Q29tcGxldGUodWludDE2X3QgY2xvY2tfb2Zmc2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPbk1vZGVDaGFuZ2UoaGNpOjpFcnJvckNvZGUgc3RhdHVzLCBoY2k6Ok1vZGUgY3VycmVudF9tb2RlLCB1aW50MTZfdCBpbnRlcnZhbCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TbmlmZlN1YnJhdGluZygKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIG92ZXJyaWRlOwotICB2b2lkIE9uUW9zU2V0dXBDb21wbGV0ZShoY2k6OlNlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSwgdWludDMyX3QgdG9rZW5fcmF0ZSwgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25GbG93U3BlY2lmaWNhdGlvbkNvbXBsZXRlKGhjaTo6Rmxvd0RpcmVjdGlvbiBmbG93X2RpcmVjdGlvbiwgaGNpOjpTZXJ2aWNlVHlwZSBzZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRva2VuX3JhdGUsIHVpbnQzMl90IHRva2VuX2J1Y2tldF9zaXplLCB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWNjZXNzX2xhdGVuY3kpIG92ZXJyaWRlOwotICB2b2lkIE9uRmx1c2hPY2N1cnJlZCgpIG92ZXJyaWRlOwotICB2b2lkIE9uUm9sZURpc2NvdmVyeUNvbXBsZXRlKGhjaTo6Um9sZSBjdXJyZW50X3JvbGUpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVhZExpbmtQb2xpY3lTZXR0aW5nc0NvbXBsZXRlKHVpbnQxNl90IGxpbmtfcG9saWN5X3NldHRpbmdzKSBvdmVycmlkZTsKLSAgdm9pZCBPblJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXRDb21wbGV0ZSh1aW50MTZfdCBmbHVzaF90aW1lb3V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlYWRUcmFuc21pdFBvd2VyTGV2ZWxDb21wbGV0ZSh1aW50OF90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSBvdmVycmlkZTsKLSAgdm9pZCBPblJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0Q29tcGxldGUodWludDE2X3QgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlYWRGYWlsZWRDb250YWN0Q291bnRlckNvbXBsZXRlKHVpbnQxNl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVhZExpbmtRdWFsaXR5Q29tcGxldGUodWludDhfdCBsaW5rX3F1YWxpdHkpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVhZEFmaENoYW5uZWxNYXBDb21wbGV0ZShoY2k6OkFmaE1vZGUgYWZoX21vZGUsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTA+IGFmaF9jaGFubmVsX21hcCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWFkUnNzaUNvbXBsZXRlKHVpbnQ4X3QgcnNzaSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWFkQ2xvY2tDb21wbGV0ZSh1aW50MzJfdCBjbG9jaywgdWludDE2X3QgYWNjdXJhY3kpIG92ZXJyaWRlOwotICB2b2lkIE9uQ2VudHJhbExpbmtLZXlDb21wbGV0ZShoY2k6OktleUZsYWcga2V5X2ZsYWcpIG92ZXJyaWRlOwotICB2b2lkIE9uUm9sZUNoYW5nZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCBoY2k6OlJvbGUgbmV3X3JvbGUpIG92ZXJyaWRlOwotICB2b2lkIE9uRGlzY29ubmVjdGlvbihoY2k6OkVycm9yQ29kZSByZWFzb24pIG92ZXJyaWRlOwotICB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKTsKLSAgdm9pZCBPblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlKHVpbnQ2NF90IGZlYXR1cmVzKTsKLSAgdm9pZCBPblJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzQ29tcGxldGUodWludDhfdCBwYWdlX251bWJlciwgdWludDhfdCBtYXhfcGFnZV9udW1iZXIsIHVpbnQ2NF90IGZlYXR1cmVzKTsKLQotICBzdHJ1Y3QgRW5jcnlwdGlvbkNoYW5nZUxpc3RlbmVyIHsKLSAgICBDaWQgY2lkOwotICAgIFBzbSBwc207Ci0gIH07Ci0gIHZvaWQgQWRkRW5jcnlwdGlvbkNoYW5nZUxpc3RlbmVyKEVuY3J5cHRpb25DaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgdWludDE2X3QgR2V0QWNsSGFuZGxlKCkgY29uc3QgewotICAgIHJldHVybiBhY2xfaGFuZGxlXzsKLSAgfQotCi0gIGhjaTo6Um9sZSBHZXRSb2xlKCkgY29uc3QgewotICAgIHJldHVybiByb2xlXzsKLSAgfQotCi0gIHZvaWQgT25QZW5kaW5nUGFja2V0Q2hhbmdlKENpZCBsb2NhbF9jaWQsIGJvb2wgaGFzX3BhY2tldCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgRHVtcHN5c0hlbHBlcjsKLSAgdm9pZCBjb25uZWN0X3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVscygpOwotICB2b2lkIHNlbmRfcGVuZGluZ19jb25maWd1cmF0aW9uX3JlcXVlc3RzKCk7Ci0KLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotICBsMmNhcDo6aW50ZXJuYWw6OkZpeGVkQ2hhbm5lbEFsbG9jYXRvcjxGaXhlZENoYW5uZWxJbXBsLCBMaW5rPiBmaXhlZF9jaGFubmVsX2FsbG9jYXRvcl97dGhpcywgbDJjYXBfaGFuZGxlcl99OwotICBsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsQWxsb2NhdG9yIGR5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3Jfe3RoaXMsIGwyY2FwX2hhbmRsZXJffTsKLSAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkNsYXNzaWNBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbl87Ci0gIGwyY2FwOjppbnRlcm5hbDo6RGF0YVBpcGVsaW5lTWFuYWdlciBkYXRhX3BpcGVsaW5lX21hbmFnZXJfOwotICBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKiBwYXJhbWV0ZXJfcHJvdmlkZXJfOwotICBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfOwotICBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGZpeGVkX3NlcnZpY2VfbWFuYWdlcl87Ci0gIExpbmtNYW5hZ2VyKiBsaW5rX21hbmFnZXJfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Q2lkLCBQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uPiBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfOwotICBvczo6QWxhcm0gbGlua19pZGxlX2Rpc2Nvbm5lY3RfYWxhcm1fe2wyY2FwX2hhbmRsZXJffTsKLSAgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyIHNpZ25hbGxpbmdfbWFuYWdlcl87Ci0gIHVpbnQxNl90IGFjbF9oYW5kbGVfOwotICBNdHUgcmVtb3RlX2Nvbm5lY3Rpb25sZXNzX210dV8gPSBrTWluaW11bUNsYXNzaWNNdHU7Ci0gIGhjaTo6Um9sZSByb2xlXyA9IGhjaTo6Um9sZTo6Q0VOVFJBTDsKLSAgYm9vbCByZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZV9yZWNlaXZlZF8gPSBmYWxzZTsKLSAgYm9vbCByZW1vdGVfc3VwcG9ydHNfZXJ0bV8gPSBmYWxzZTsKLSAgYm9vbCByZW1vdGVfc3VwcG9ydHNfZmNzXyA9IGZhbHNlOwotICBoY2k6OkVuY3J5cHRpb25FbmFibGVkIGVuY3J5cHRpb25fZW5hYmxlZF8gPSBoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpPRkY7Ci0gIHN0ZDo6bGlzdDxQc20+IHBlbmRpbmdfZHluYW1pY19wc21fbGlzdF87Ci0gIHN0ZDo6bGlzdDxMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uPiBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jYWxsYmFja19saXN0XzsKLSAgc3RkOjpsaXN0PHVpbnQxNl90PiBwZW5kaW5nX291dGdvaW5nX2NvbmZpZ3VyYXRpb25fcmVxdWVzdF9saXN0XzsKLSAgYm9vbCB1c2VkX2J5X3NlY3VyaXR5X21vZHVsZV8gPSBmYWxzZTsKLSAgYm9vbCBoYXNfcmVxdWVzdGVkX2F1dGhlbnRpY2F0aW9uXyA9IGZhbHNlOwotICBzdGQ6Omxpc3Q8RW5jcnlwdGlvbkNoYW5nZUxpc3RlbmVyPiBlbmNyeXB0aW9uX2NoYW5nZV9saXN0ZW5lcl87Ci0gIHN0ZDo6YXRvbWljX2ludCByZW1haW5pbmdfcGFja2V0c190b19iZV9zZW50XyA9IDA7Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMaW5rKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuY2MgYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmZjQ2MS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9jbGFzc19vZl9kZXZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdm9pZCBMaW5rTWFuYWdlcjo6Q29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzKGhjaTo6QWRkcmVzcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24pIHsKLSAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHNlcnZpY2UgcmVnaXN0ZXJlZAotICBhdXRvIGZpeGVkX2NoYW5uZWxfc2VydmljZXMgPSBmaXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl8tPkdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotICBpZiAoZml4ZWRfY2hhbm5lbF9zZXJ2aWNlcy5lbXB0eSgpKSB7Ci0gICAgLy8gSWYgc28sIHJldHVybiBlcnJvcgotICAgIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uLmhhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbi5vbl9mYWlsX2NhbGxiYWNrXyksCi0gICAgICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHR7Ci0gICAgICAgICAgICAuY29ubmVjdGlvbl9yZXN1bHRfY29kZSA9IEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHRDb2RlOjpGQUlMX05PX1NFUlZJQ0VfUkVHSVNURVJFRH0pKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBkZXZpY2UgaGFzIGFuIEFDTCBjb25uZWN0aW9uCi0gIGF1dG8qIGxpbmsgPSBHZXRMaW5rKGRldmljZSk7Ci0gIGlmIChsaW5rICE9IG51bGxwdHIpIHsKLSAgICAvLyBJZiBkZXZpY2UgYWxyZWFkeSBoYXZlIGFuIEFDTCBjb25uZWN0aW9uCi0gICAgLy8gQ2hlY2sgaWYgYWxsIHJlZ2lzdGVyZWQgc2VydmljZXMgaGF2ZSBhbiBhbGxvY2F0ZWQgY2hhbm5lbCBhbmQgYWxsb2NhdGUgb25lIGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZAotICAgIGludCBudW1fbmV3X2NoYW5uZWxzID0gMDsKLSAgICBmb3IgKGF1dG8mIGZpeGVkX2NoYW5uZWxfc2VydmljZSA6IGZpeGVkX2NoYW5uZWxfc2VydmljZXMpIHsKLSAgICAgIGlmIChsaW5rLT5Jc0ZpeGVkQ2hhbm5lbEFsbG9jYXRlZChmaXhlZF9jaGFubmVsX3NlcnZpY2UuZmlyc3QpKSB7Ci0gICAgICAgIC8vIFRoaXMgY2hhbm5lbCBpcyBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgdGhpcyBsaW5rLCBkbyBub3QgYWxsb2NhdGVkIHR3aWNlCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gQWxsb2NhdGUgY2hhbm5lbCBmb3IgbmV3bHkgcmVnaXN0ZXJlZCBmaXhlZCBjaGFubmVscwotICAgICAgYXV0byBmaXhlZF9jaGFubmVsX2ltcGwgPSBsaW5rLT5BbGxvY2F0ZUZpeGVkQ2hhbm5lbChmaXhlZF9jaGFubmVsX3NlcnZpY2UuZmlyc3QpOwotICAgICAgZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLnNlY29uZC0+Tm90aWZ5Q2hhbm5lbENyZWF0aW9uKAotICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Rml4ZWRDaGFubmVsPihmaXhlZF9jaGFubmVsX2ltcGwsIGwyY2FwX2hhbmRsZXJfKSk7Ci0gICAgICBudW1fbmV3X2NoYW5uZWxzKys7Ci0gICAgfQotICAgIC8vIERlY2xhcmUgY29ubmVjdGlvbiBmYWlsdXJlIGlmIG5vIG5ldyBjaGFubmVscyBhcmUgY3JlYXRlZAotICAgIGlmIChudW1fbmV3X2NoYW5uZWxzID09IDApIHsKLSAgICAgIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uLmhhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uLm9uX2ZhaWxfY2FsbGJhY2tfKSwKLSAgICAgICAgICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0ewotICAgICAgICAgICAgICAuY29ubmVjdGlvbl9yZXN1bHRfY29kZSA9IEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHRDb2RlOjpGQUlMX0FMTF9TRVJWSUNFU19IQVZFX0NIQU5ORUx9KSk7Ci0gICAgfQotICAgIC8vIE5vIG5lZWQgdG8gY3JlYXRlIEFDTCBjb25uZWN0aW9uLCByZXR1cm4gd2l0aG91dCBzYXZpbmcgYW55IHBlbmRpbmcgY29ubmVjdGlvbnMKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gSWYgbm90LCBjcmVhdGUgbmV3IEFDTCBjb25uZWN0aW9uCi0gIC8vIEFkZCByZXF1ZXN0IHRvIHBlbmRpbmcgbGluayBsaXN0IGZpcnN0Ci0gIGF1dG8gcGVuZGluZ19saW5rID0gcGVuZGluZ19saW5rc18uZmluZChkZXZpY2UpOwotICBpZiAocGVuZGluZ19saW5rID09IHBlbmRpbmdfbGlua3NfLmVuZCgpKSB7Ci0gICAgLy8gQ3JlYXRlIHBlbmRpbmcgbGluayBpZiBub3QgZXhpc3QKLSAgICBwZW5kaW5nX2xpbmtzXy50cnlfZW1wbGFjZShkZXZpY2UpOwotICAgIHBlbmRpbmdfbGluayA9IHBlbmRpbmdfbGlua3NfLmZpbmQoZGV2aWNlKTsKLSAgfQotICBwZW5kaW5nX2xpbmstPnNlY29uZC5wZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnNfLnB1c2hfYmFjayhzdGQ6Om1vdmUocGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24pKTsKLSAgLy8gVGhlbiBjcmVhdGUgbmV3IEFDTCBjb25uZWN0aW9uCi0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlQ29ubmVjdGlvbihkZXZpY2UpOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpDb25uZWN0RHluYW1pY0NoYW5uZWxTZXJ2aWNlcygKLSAgICBoY2k6OkFkZHJlc3MgZGV2aWNlLCBMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24sIFBzbSBwc20pIHsKLSAgaWYgKCFJc1BzbVZhbGlkKHBzbSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byogbGluayA9IEdldExpbmsoZGV2aWNlKTsKLSAgaWYgKGxpbmsgPT0gbnVsbHB0cikgewotICAgIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlQ29ubmVjdGlvbihkZXZpY2UpOwotICAgIGlmIChwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfLmZpbmQoZGV2aWNlKSAhPSBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfLmVuZCgpKSB7Ci0gICAgICBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfW2RldmljZV0ucHVzaF9iYWNrKHBzbSk7Ci0gICAgICBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfY2FsbGJhY2tzX1tkZXZpY2VdLnB1c2hfYmFjayhzdGQ6Om1vdmUocGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbikpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfW2RldmljZV0gPSB7cHNtfTsKLSAgICAgIHBlbmRpbmdfZHluYW1pY19jaGFubmVsc19jYWxsYmFja3NfW2RldmljZV0ucHVzaF9iYWNrKHN0ZDo6bW92ZShwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBsaW5rLT5TZW5kQ29ubmVjdGlvblJlcXVlc3QocHNtLCBsaW5rLT5SZXNlcnZlRHluYW1pY0NoYW5uZWwoKSwgc3RkOjptb3ZlKHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24pKTsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6SW5pdGlhdGVDb25uZWN0aW9uRm9yU2VjdXJpdHkoaGNpOjpBZGRyZXNzIHJlbW90ZSkgewotICBhdXRvKiBsaW5rID0gR2V0TGluayhyZW1vdGUpOwotICBpZiAobGluayAhPSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCJMaW5rIGFscmVhZHkgZXhpc3RzIGZvciAlcyIsIHJlbW90ZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci0gIGFjbF9tYW5hZ2VyXy0+Q3JlYXRlQ29ubmVjdGlvbihyZW1vdGUpOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpSZWdpc3RlckxpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgbGlua19zZWN1cml0eV9pbnRlcmZhY2VfbGlzdGVuZXJfaGFuZGxlcl8gPSBoYW5kbGVyOwotICBsaW5rX3NlY3VyaXR5X2ludGVyZmFjZV9saXN0ZW5lcl8gPSBsaXN0ZW5lcjsKLX0KLQotTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIqIExpbmtNYW5hZ2VyOjpHZXRMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lcigpIHsKLSAgcmV0dXJuIGxpbmtfc2VjdXJpdHlfaW50ZXJmYWNlX2xpc3RlbmVyXzsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6UmVnaXN0ZXJMaW5rUHJvcGVydHlMaXN0ZW5lcihvczo6SGFuZGxlciogaGFuZGxlciwgTGlua1Byb3BlcnR5TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8gPSBoYW5kbGVyOwotICBsaW5rX3Byb3BlcnR5X2xpc3RlbmVyXyA9IGxpc3RlbmVyOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpPblBlbmRpbmdQYWNrZXRDaGFuZ2UoaGNpOjpBZGRyZXNzIHJlbW90ZSwgaW50IG51bV9wYWNrZXRzKSB7Ci0gIGlmIChkaXNjb25uZWN0ZWRfbGlua3NfLmNvdW50KHJlbW90ZSkgIT0gMCAmJiBudW1fcGFja2V0cyA9PSAwKSB7Ci0gICAgbGlua3NfLmVyYXNlKHJlbW90ZSk7Ci0gICAgbGlua3Nfd2l0aF9wZW5kaW5nX3BhY2tldHNfLmVyYXNlKHJlbW90ZSk7Ci0gIH0gZWxzZSBpZiAobnVtX3BhY2tldHMgIT0gMCkgewotICAgIGxpbmtzX3dpdGhfcGVuZGluZ19wYWNrZXRzXy5lbXBsYWNlKHJlbW90ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbGlua3Nfd2l0aF9wZW5kaW5nX3BhY2tldHNfLmVyYXNlKHJlbW90ZSk7Ci0gIH0KLX0KLQotTGluayogTGlua01hbmFnZXI6OkdldExpbmsoY29uc3QgaGNpOjpBZGRyZXNzIGRldmljZSkgewotICBpZiAobGlua3NfLmZpbmQoZGV2aWNlKSA9PSBsaW5rc18uZW5kKCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gJmxpbmtzXy5maW5kKGRldmljZSktPnNlY29uZDsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfaG9sZChoY2k6OkFkZHJlc3MgcmVtb3RlKSB7Ci0gIGF1dG8gbGluayA9IEdldExpbmsocmVtb3RlKTsKLSAgaWYgKGxpbmsgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZW1vdGUgaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxpbmstPkFjcXVpcmVTZWN1cml0eUhvbGQoKTsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfcmVsZWFzZShoY2k6OkFkZHJlc3MgcmVtb3RlKSB7Ci0gIGF1dG8gbGluayA9IEdldExpbmsocmVtb3RlKTsKLSAgaWYgKGxpbmsgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZW1vdGUgaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxpbmstPlJlbGVhc2VTZWN1cml0eUhvbGQoKTsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfZGlzY29ubmVjdChoY2k6OkFkZHJlc3MgcmVtb3RlKSB7Ci0gIGF1dG8gbGluayA9IEdldExpbmsocmVtb3RlKTsKLSAgaWYgKGxpbmsgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZW1vdGUgaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxpbmstPkRpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfZW5zdXJlX2F1dGhlbnRpY2F0ZWQoaGNpOjpBZGRyZXNzIHJlbW90ZSkgewotICBhdXRvIGxpbmsgPSBHZXRMaW5rKHJlbW90ZSk7Ci0gIGlmIChsaW5rID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiUmVtb3RlIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgIHJldHVybjsKLSAgfQotICBsaW5rLT5BdXRoZW50aWNhdGUoKTsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfZW5zdXJlX2VuY3J5cHRlZChoY2k6OkFkZHJlc3MgcmVtb3RlKSB7Ci0gIGF1dG8gbGluayA9IEdldExpbmsocmVtb3RlKTsKLSAgaWYgKGxpbmsgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZW1vdGUgaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxpbmstPkVuY3J5cHQoKTsKLX0KLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIExpbmtTZWN1cml0eUludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHRoZSBTZWN1cml0eU1vZHVsZSB0byBhY2Nlc3Mgc29tZSBsaW5rIGZ1bmN0aW9uYWxpdGllcy4KLSAqIE5vdGU6IEFsbCBwdWJsaWMgbWV0aG9kcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYXJlIGludm9rZWQgZnJvbSBleHRlcm5hbCBjb250ZXh0LgotICovCi1jbGFzcyBMaW5rU2VjdXJpdHlJbnRlcmZhY2VJbXBsIDogcHVibGljIExpbmtTZWN1cml0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICBMaW5rU2VjdXJpdHlJbnRlcmZhY2VJbXBsKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBMaW5rTWFuYWdlciogbGlua19tYW5hZ2VyLCBMaW5rKiBsaW5rKQotICAgICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwKLSAgICAgICAgbGlua19tYW5hZ2VyXyhsaW5rX21hbmFnZXIpLAotICAgICAgICByZW1vdGVfKGxpbmstPkdldERldmljZSgpLkdldEFkZHJlc3MoKSksCi0gICAgICAgIGFjbF9oYW5kbGVfKGxpbmstPkdldEFjbEhhbmRsZSgpKSB7fQotCi0gIGhjaTo6QWRkcmVzcyBHZXRSZW1vdGVBZGRyZXNzKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiByZW1vdGVfOwotICB9Ci0KLSAgdm9pZCBIb2xkKCkgb3ZlcnJpZGUgewotICAgIGhhbmRsZXJfLT5DYWxsT24obGlua19tYW5hZ2VyXywgJkxpbmtNYW5hZ2VyOjpoYW5kbGVfbGlua19zZWN1cml0eV9ob2xkLCByZW1vdGVfKTsKLSAgfQotCi0gIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsKLSAgICBoYW5kbGVyXy0+Q2FsbE9uKGxpbmtfbWFuYWdlcl8sICZMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfcmVsZWFzZSwgcmVtb3RlXyk7Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QoKSBvdmVycmlkZSB7Ci0gICAgaGFuZGxlcl8tPkNhbGxPbihsaW5rX21hbmFnZXJfLCAmTGlua01hbmFnZXI6OmhhbmRsZV9saW5rX3NlY3VyaXR5X2Rpc2Nvbm5lY3QsIHJlbW90ZV8pOwotICB9Ci0KLSAgdm9pZCBFbnN1cmVBdXRoZW50aWNhdGVkKCkgb3ZlcnJpZGUgewotICAgIGhhbmRsZXJfLT5DYWxsT24obGlua19tYW5hZ2VyXywgJkxpbmtNYW5hZ2VyOjpoYW5kbGVfbGlua19zZWN1cml0eV9lbnN1cmVfYXV0aGVudGljYXRlZCwgcmVtb3RlXyk7Ci0gIH0KLQotICB2b2lkIEVuc3VyZUVuY3J5cHRlZCgpIG92ZXJyaWRlIHsKLSAgICBoYW5kbGVyXy0+Q2FsbE9uKGxpbmtfbWFuYWdlcl8sICZMaW5rTWFuYWdlcjo6aGFuZGxlX2xpbmtfc2VjdXJpdHlfZW5zdXJlX2VuY3J5cHRlZCwgcmVtb3RlXyk7Ci0gIH0KLQotICB1aW50MTZfdCBHZXRBY2xIYW5kbGUoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGFjbF9oYW5kbGVfOwotICB9Ci0KLSAgaGNpOjpSb2xlIEdldFJvbGUoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGxpbmtfbWFuYWdlcl8tPkdldExpbmsocmVtb3RlXyktPkdldFJvbGUoKTsKLSAgfQotCi0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgTGlua01hbmFnZXIqIGxpbmtfbWFuYWdlcl87Ci0gIGhjaTo6QWRkcmVzcyByZW1vdGVfOwotICB1aW50MTZfdCBhY2xfaGFuZGxlXzsKLX07Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uQ29ubmVjdFN1Y2Nlc3Moc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkNsYXNzaWNBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbikgewotICAvLyBTYW1lIGxpbmsgc2hvdWxkIG5vdCBiZSBjb25uZWN0ZWQgdHdpY2UKLSAgaGNpOjpBZGRyZXNzIGRldmljZSA9IGFjbF9jb25uZWN0aW9uLT5HZXRBZGRyZXNzKCk7Ci0gIEFTU0VSVF9MT0coR2V0TGluayhkZXZpY2UpID09IG51bGxwdHIsICIlcyBpcyBjb25uZWN0ZWQgdHdpY2Ugd2l0aG91dCBkaXNjb25uZWN0aW9uIiwKLSAgICAgICAgICAgICBhY2xfY29ubmVjdGlvbi0+R2V0QWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGxpbmtzXy50cnlfZW1wbGFjZShkZXZpY2UsIGwyY2FwX2hhbmRsZXJfLCBzdGQ6Om1vdmUoYWNsX2Nvbm5lY3Rpb24pLCBwYXJhbWV0ZXJfcHJvdmlkZXJfLAotICAgICAgICAgICAgICAgICAgICAgZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl8sIGZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXywgdGhpcyk7Ci0gIGF1dG8qIGxpbmsgPSBHZXRMaW5rKGRldmljZSk7Ci0gIEFTU0VSVChsaW5rICE9IG51bGxwdHIpOwotICBsaW5rLT5TZW5kSW5mb3JtYXRpb25SZXF1ZXN0KEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlOjpFWFRFTkRFRF9GRUFUVVJFU19TVVBQT1JURUQpOwotICBsaW5rLT5TZW5kSW5mb3JtYXRpb25SZXF1ZXN0KEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlOjpGSVhFRF9DSEFOTkVMU19TVVBQT1JURUQpOwotICBsaW5rLT5SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKCk7Ci0gIGxpbmstPlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcygpOwotICBsaW5rLT5SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygxKTsKLQotICAvLyBBbGxvY2F0ZSBhbmQgZGlzdHJpYnV0ZSBjaGFubmVscyBmb3IgYWxsIHJlZ2lzdGVyZWQgZml4ZWQgY2hhbm5lbCBzZXJ2aWNlcwotICBhdXRvIGZpeGVkX2NoYW5uZWxfc2VydmljZXMgPSBmaXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl8tPkdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotICBmb3IgKGF1dG8mIGZpeGVkX2NoYW5uZWxfc2VydmljZSA6IGZpeGVkX2NoYW5uZWxfc2VydmljZXMpIHsKLSAgICBhdXRvIGZpeGVkX2NoYW5uZWxfaW1wbCA9IGxpbmstPkFsbG9jYXRlRml4ZWRDaGFubmVsKGZpeGVkX2NoYW5uZWxfc2VydmljZS5maXJzdCk7Ci0gICAgZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLnNlY29uZC0+Tm90aWZ5Q2hhbm5lbENyZWF0aW9uKAotICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZpeGVkQ2hhbm5lbD4oZml4ZWRfY2hhbm5lbF9pbXBsLCBsMmNhcF9oYW5kbGVyXykpOwotICB9Ci0gIGlmIChwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfLmZpbmQoZGV2aWNlKSAhPSBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfLmVuZCgpKSB7Ci0gICAgYXV0byBwc21fbGlzdCA9IHBlbmRpbmdfZHluYW1pY19jaGFubmVsc19bZGV2aWNlXTsKLSAgICBhdXRvJiBjYWxsYmFja19saXN0ID0gcGVuZGluZ19keW5hbWljX2NoYW5uZWxzX2NhbGxiYWNrc19bZGV2aWNlXTsKLSAgICBsaW5rLT5TZXRQZW5kaW5nRHluYW1pY0NoYW5uZWxzKHBzbV9saXN0LCBzdGQ6Om1vdmUoY2FsbGJhY2tfbGlzdCkpOwotICAgIHBlbmRpbmdfZHluYW1pY19jaGFubmVsc18uZXJhc2UoZGV2aWNlKTsKLSAgICBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfY2FsbGJhY2tzXy5lcmFzZShkZXZpY2UpOwotICB9Ci0gIC8vIE5vdGlmeSBsaW5rIHByb3BlcnR5IGxpc3RlbmVyCi0gIGlmIChsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICAgIGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfLCAmTGlua1Byb3BlcnR5TGlzdGVuZXI6Ok9uTGlua0Nvbm5lY3RlZCwgZGV2aWNlLCBsaW5rLT5HZXRBY2xIYW5kbGUoKSk7Ci0gIH0KLQotICAvLyBOb3RpZnkgc2VjdXJpdHkgbWFuYWdlcgotICBpZiAobGlua19zZWN1cml0eV9pbnRlcmZhY2VfbGlzdGVuZXJfaGFuZGxlcl8gIT0gbnVsbHB0cikgewotICAgIGxpbmtfc2VjdXJpdHlfaW50ZXJmYWNlX2xpc3RlbmVyX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICAgIGxpbmtfc2VjdXJpdHlfaW50ZXJmYWNlX2xpc3RlbmVyXywKLSAgICAgICAgJkxpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyOjpPbkxpbmtDb25uZWN0ZWQsCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8TGlua1NlY3VyaXR5SW50ZXJmYWNlSW1wbD4obDJjYXBfaGFuZGxlcl8sIHRoaXMsIGxpbmspKTsKLSAgfQotCi0gIC8vIFJlbW92ZSBkZXZpY2UgZnJvbSBwZW5kaW5nIGxpbmtzIGxpc3QsIGlmIGFueQotICBwZW5kaW5nX2xpbmtzXy5lcmFzZShkZXZpY2UpOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpPbkNvbm5lY3RGYWlsKGhjaTo6QWRkcmVzcyBkZXZpY2UsIGhjaTo6RXJyb3JDb2RlIHJlYXNvbikgewotICAvLyBOb3RpZnkgYWxsIHBlbmRpbmcgbGlua3MgZm9yIHRoaXMgZGV2aWNlCi0gIGF1dG8gcGVuZGluZ19saW5rID0gcGVuZGluZ19saW5rc18uZmluZChkZXZpY2UpOwotICBpZiAocGVuZGluZ19saW5rID09IHBlbmRpbmdfbGlua3NfLmVuZCgpKSB7Ci0gICAgLy8gVGhlcmUgaXMgbm8gcGVuZGluZyBsaW5rLCBleGl0Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJDb25uZWN0aW9uIHRvICVzIGZhaWxlZCB3aXRob3V0IGEgcGVuZGluZyBsaW5rOyByZWFzb246ICVzIiwKLSAgICAgICAgZGV2aWNlLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgaGNpOjpFcnJvckNvZGVUZXh0KHJlYXNvbikuY19zdHIoKSk7Ci0gICAgaWYgKHBlbmRpbmdfZHluYW1pY19jaGFubmVsc19jYWxsYmFja3NfLmZpbmQoZGV2aWNlKSAhPSBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfY2FsbGJhY2tzXy5lbmQoKSkgewotICAgICAgZm9yIChMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uJiBjYWxsYmFja3MgOiBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbHNfY2FsbGJhY2tzX1tkZXZpY2VdKSB7Ci0gICAgICAgIGNhbGxiYWNrcy5vbl9mYWlsX2NhbGxiYWNrXy5JbnZva2UoRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0ewotICAgICAgICAgICAgLmhjaV9lcnJvciA9IGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1RJTUVPVVQsCi0gICAgICAgIH0pOwotICAgICAgfQotICAgICAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxzXy5lcmFzZShkZXZpY2UpOwotICAgICAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxzX2NhbGxiYWNrc18uZXJhc2UoZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAoYXV0byYgcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24gOiBwZW5kaW5nX2xpbmstPnNlY29uZC5wZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnNfKSB7Ci0gICAgcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24uaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uLm9uX2ZhaWxfY2FsbGJhY2tfKSwKLSAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdHsKLSAgICAgICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdENvZGU6OkZBSUxfSENJX0VSUk9SLCAuaGNpX2Vycm9yID0gcmVhc29ufSkpOwotICB9Ci0gIC8vIFJlbW92ZSBlbnRyeSBpbiBwZW5kaW5nIGxpbmsgbGlzdAotICBwZW5kaW5nX2xpbmtzXy5lcmFzZShwZW5kaW5nX2xpbmspOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpIQUNLX09uRXNjb0Nvbm5lY3RSZXF1ZXN0KGhjaTo6QWRkcmVzcyBkZXZpY2UsIGhjaTo6Q2xhc3NPZkRldmljZSBjb2QpIHsKLSAgTE9HX0VSUk9SKCJSZW1vdGUgRVNDTyBjb25uZWN0IHJlcXVlc3QgdW5pbXBsZW1lbnRlZCIpOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpIQUNLX09uU2NvQ29ubmVjdFJlcXVlc3QoaGNpOjpBZGRyZXNzIGRldmljZSwgaGNpOjpDbGFzc09mRGV2aWNlIGNvZCkgewotICBMT0dfRVJST1IoIlJlbW90ZSBTQ08gY29ubmVjdCByZXF1ZXN0IHVuaW1wbGVtZW50ZWQiKTsKLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6T25EaXNjb25uZWN0KGhjaTo6QWRkcmVzcyBkZXZpY2UsIGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgewotICBhdXRvKiBsaW5rID0gR2V0TGluayhkZXZpY2UpOwotICBBU1NFUlRfTE9HKGxpbmsgIT0gbnVsbHB0ciwgIkRldmljZSAlcyBpcyBkaXNjb25uZWN0ZWQgd2l0aCByZWFzb24gMHgleCwgYnV0IG5vdCBpbiBsb2NhbCBkYXRhYmFzZSIsCi0gICAgICAgICAgICAgZGV2aWNlLlRvU3RyaW5nKCkuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3RhdHVzKSk7Ci0gIGlmIChsaW5rX3NlY3VyaXR5X2ludGVyZmFjZV9saXN0ZW5lcl9oYW5kbGVyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19zZWN1cml0eV9pbnRlcmZhY2VfbGlzdGVuZXJfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgICAgbGlua19zZWN1cml0eV9pbnRlcmZhY2VfbGlzdGVuZXJfLCAmTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXI6Ok9uTGlua0Rpc2Nvbm5lY3RlZCwgZGV2aWNlKTsKLSAgfQotICBpZiAobGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXy0+Q2FsbE9uKGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfLCAmTGlua1Byb3BlcnR5TGlzdGVuZXI6Ok9uTGlua0Rpc2Nvbm5lY3RlZCwgZGV2aWNlKTsKLSAgfQotCi0gIGlmIChsaW5rc193aXRoX3BlbmRpbmdfcGFja2V0c18uY291bnQoZGV2aWNlKSAhPSAwKSB7Ci0gICAgZGlzY29ubmVjdGVkX2xpbmtzXy5lbXBsYWNlKGRldmljZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbGlua3NfLmVyYXNlKGRldmljZSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6T25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6QWRkcmVzcyBkZXZpY2UpIHsKLSAgaWYgKGxpbmtfc2VjdXJpdHlfaW50ZXJmYWNlX2xpc3RlbmVyX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBsaW5rX3NlY3VyaXR5X2ludGVyZmFjZV9saXN0ZW5lcl9oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgICBsaW5rX3NlY3VyaXR5X2ludGVyZmFjZV9saXN0ZW5lcl8sCi0gICAgICAgICZMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lcjo6T25BdXRoZW50aWNhdGlvbkNvbXBsZXRlLAotICAgICAgICBoY2lfc3RhdHVzLAotICAgICAgICBkZXZpY2UpOwotICB9Ci19Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uRW5jcnlwdGlvbkNoYW5nZShoY2k6OkFkZHJlc3MgZGV2aWNlLCBoY2k6OkVuY3J5cHRpb25FbmFibGVkIGVuYWJsZWQpIHsKLSAgaWYgKGxpbmtfc2VjdXJpdHlfaW50ZXJmYWNlX2xpc3RlbmVyX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBsaW5rX3NlY3VyaXR5X2ludGVyZmFjZV9saXN0ZW5lcl9oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgICBsaW5rX3NlY3VyaXR5X2ludGVyZmFjZV9saXN0ZW5lcl8sCi0gICAgICAgICZMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lcjo6T25FbmNyeXB0aW9uQ2hhbmdlLAotICAgICAgICBkZXZpY2UsCi0gICAgICAgIGVuYWJsZWQgPT0gaGNpOjpFbmNyeXB0aW9uRW5hYmxlZDo6T04gfHwgZW5hYmxlZCA9PSBoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpCUl9FRFJfQUVTX0NDTSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKAotICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgaGNpOjpBZGRyZXNzIGRldmljZSwKLSAgICB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLAotICAgIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSB7Ci0gIGlmIChsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICAgIGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfLAotICAgICAgICAmTGlua1Byb3BlcnR5TGlzdGVuZXI6Ok9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbiwKLSAgICAgICAgaGNpX3N0YXR1cywKLSAgICAgICAgZGV2aWNlLAotICAgICAgICBsbXBfdmVyc2lvbiwKLSAgICAgICAgbWFudWZhY3R1cmVyX25hbWUsCi0gICAgICAgIHN1Yl92ZXJzaW9uKTsKLSAgfQotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpPblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyhoY2k6OkFkZHJlc3MgZGV2aWNlLCB1aW50NjRfdCBmZWF0dXJlcykgewotICBpZiAobGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgICBsaW5rX3Byb3BlcnR5X2xpc3RlbmVyXywgJkxpbmtQcm9wZXJ0eUxpc3RlbmVyOjpPblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcywgZGV2aWNlLCBmZWF0dXJlcyk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6T25SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygKLSAgICBoY2k6OkFkZHJlc3MgZGV2aWNlLCB1aW50OF90IHBhZ2VfbnVtYmVyLCB1aW50OF90IG1heF9wYWdlX251bWJlciwgdWludDY0X3QgZmVhdHVyZXMpIHsKLSAgaWYgKGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8gIT0gbnVsbHB0cikgewotICAgIGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgICAgbGlua19wcm9wZXJ0eV9saXN0ZW5lcl8sCi0gICAgICAgICZMaW5rUHJvcGVydHlMaXN0ZW5lcjo6T25SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcywKLSAgICAgICAgZGV2aWNlLAotICAgICAgICBwYWdlX251bWJlciwKLSAgICAgICAgbWF4X3BhZ2VfbnVtYmVyLAotICAgICAgICBmZWF0dXJlcyk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6T25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6QWRkcmVzcyByZW1vdGUsIGhjaTo6Um9sZSByb2xlKSB7Ci0gIGlmIChsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICAgIGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfLCAmTGlua1Byb3BlcnR5TGlzdGVuZXI6Ok9uUm9sZUNoYW5nZSwgaGNpX3N0YXR1cywgcmVtb3RlLCByb2xlKTsKLSAgfQotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpPblJlYWRDbG9ja09mZnNldChoY2k6OkFkZHJlc3MgcmVtb3RlLCB1aW50MTZfdCBjbG9ja19vZmZzZXQpIHsKLSAgaWYgKGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8gIT0gbnVsbHB0cikgewotICAgIGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgICAgbGlua19wcm9wZXJ0eV9saXN0ZW5lcl8sICZMaW5rUHJvcGVydHlMaXN0ZW5lcjo6T25SZWFkQ2xvY2tPZmZzZXQsIHJlbW90ZSwgY2xvY2tfb2Zmc2V0KTsKLSAgfQotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpPbk1vZGVDaGFuZ2UoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgaGNpOjpBZGRyZXNzIHJlbW90ZSwgaGNpOjpNb2RlIG1vZGUsIHVpbnQxNl90IGludGVydmFsKSB7Ci0gIGlmIChsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBsaW5rX3Byb3BlcnR5X2NhbGxiYWNrX2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICAgIGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfLCAmTGlua1Byb3BlcnR5TGlzdGVuZXI6Ok9uTW9kZUNoYW5nZSwgaGNpX3N0YXR1cywgcmVtb3RlLCBtb2RlLCBpbnRlcnZhbCk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTWFuYWdlcjo6T25TbmlmZlN1YnJhdGluZygKLSAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgIGhjaTo6QWRkcmVzcyByZW1vdGUsCi0gICAgdWludDE2X3QgbWF4X3R4X2xhdCwKLSAgICB1aW50MTZfdCBtYXhfcnhfbGF0LAotICAgIHVpbnQxNl90IG1pbl9yZW1vdGVfdGltZW91dCwKLSAgICB1aW50MTZfdCBtaW5fbG9jYWxfdGltZW91dCkgewotICBpZiAobGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgICBsaW5rX3Byb3BlcnR5X2xpc3RlbmVyXywKLSAgICAgICAgJkxpbmtQcm9wZXJ0eUxpc3RlbmVyOjpPblNuaWZmU3VicmF0aW5nLAotICAgICAgICBoY2lfc3RhdHVzLAotICAgICAgICByZW1vdGUsCi0gICAgICAgIG1heF90eF9sYXQsCi0gICAgICAgIG1heF9yeF9sYXQsCi0gICAgICAgIG1pbl9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgbWluX2xvY2FsX3RpbWVvdXQpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWIwZjUuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9jbGFzc19vZl9kZXZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGluay5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbGlua19wcm9wZXJ0eV9saXN0ZW5lci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbGlua19zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9wYXJhbWV0ZXJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIER1bXBzeXNIZWxwZXI7Ci0KLWNsYXNzIExpbmtNYW5hZ2VyIDogcHVibGljIGhjaTo6YWNsX21hbmFnZXI6OkNvbm5lY3Rpb25DYWxsYmFja3MgewotIHB1YmxpYzoKLSAgTGlua01hbmFnZXIob3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIsIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXIsCi0gICAgICAgICAgICAgIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsCi0gICAgICAgICAgICAgIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBkeW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLAotICAgICAgICAgICAgICBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKiBwYXJhbWV0ZXJfcHJvdmlkZXIpCi0gICAgICA6IGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpLCBhY2xfbWFuYWdlcl8oYWNsX21hbmFnZXIpLAotICAgICAgICBmaXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl8oZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIpLAotICAgICAgICBkeW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXyhkeW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyKSwgcGFyYW1ldGVyX3Byb3ZpZGVyXyhwYXJhbWV0ZXJfcHJvdmlkZXIpIHsKLSAgICBhY2xfbWFuYWdlcl8tPlJlZ2lzdGVyQ2FsbGJhY2tzKHRoaXMsIGwyY2FwX2hhbmRsZXJfKTsKLSAgfQotCi0gIHN0cnVjdCBQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiB7Ci0gICAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrXzsKLSAgfTsKLQotICBzdHJ1Y3QgUGVuZGluZ0xpbmsgewotICAgIHN0ZDo6dmVjdG9yPFBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uPiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnNfOwotICB9OwotCi0gIC8vIEFDTCBtZXRob2RzCi0KLSAgTGluayogR2V0TGluayhoY2k6OkFkZHJlc3MgZGV2aWNlKTsKLSAgdm9pZCBPbkNvbm5lY3RTdWNjZXNzKHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpDbGFzc2ljQWNsQ29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb24pIG92ZXJyaWRlOwotICB2b2lkIE9uQ29ubmVjdEZhaWwoaGNpOjpBZGRyZXNzIGRldmljZSwgaGNpOjpFcnJvckNvZGUgcmVhc29uKSBvdmVycmlkZTsKLQotICB2b2lkIEhBQ0tfT25Fc2NvQ29ubmVjdFJlcXVlc3QoaGNpOjpBZGRyZXNzLCBoY2k6OkNsYXNzT2ZEZXZpY2UpIG92ZXJyaWRlOwotICB2b2lkIEhBQ0tfT25TY29Db25uZWN0UmVxdWVzdChoY2k6OkFkZHJlc3MsIGhjaTo6Q2xhc3NPZkRldmljZSkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIE9uRGlzY29ubmVjdChoY2k6OkFkZHJlc3MgZGV2aWNlLCBoY2k6OkVycm9yQ29kZSBzdGF0dXMpOwotICB2b2lkIE9uQXV0aGVudGljYXRpb25Db21wbGV0ZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCBoY2k6OkFkZHJlc3MgZGV2aWNlKTsKLSAgdm9pZCBPbkVuY3J5cHRpb25DaGFuZ2UoaGNpOjpBZGRyZXNzIGRldmljZSwgaGNpOjpFbmNyeXB0aW9uRW5hYmxlZCBlbmFibGVkKTsKLSAgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24oCi0gICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgaGNpOjpBZGRyZXNzIGRldmljZSwKLSAgICAgIHVpbnQ4X3QgbG1wX3ZlcnNpb24sCi0gICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwKLSAgICAgIHVpbnQxNl90IHN1Yl92ZXJzaW9uKTsKLSAgdm9pZCBPblJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyhoY2k6OkFkZHJlc3MgZGV2aWNlLCB1aW50NjRfdCBmZWF0dXJlcyk7Ci0gIHZvaWQgT25SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygKLSAgICAgIGhjaTo6QWRkcmVzcyBkZXZpY2UsIHVpbnQ4X3QgcGFnZV9udW1iZXIsIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcyk7Ci0gIHZvaWQgT25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6QWRkcmVzcyByZW1vdGUsIGhjaTo6Um9sZSByb2xlKTsKLSAgdm9pZCBPblJlYWRDbG9ja09mZnNldChoY2k6OkFkZHJlc3MgcmVtb3RlLCB1aW50MTZfdCBjbG9ja19vZmZzZXQpOwotICB2b2lkIE9uTW9kZUNoYW5nZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCBoY2k6OkFkZHJlc3MgcmVtb3RlLCBoY2k6Ok1vZGUgbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpOwotICB2b2lkIE9uU25pZmZTdWJyYXRpbmcoCi0gICAgICBoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgaGNpOjpBZGRyZXNzIHJlbW90ZSwKLSAgICAgIHVpbnQxNl90IG1heF90eF9sYXQsCi0gICAgICB1aW50MTZfdCBtYXhfcnhfbGF0LAotICAgICAgdWludDE2X3QgbWluX3JlbW90ZV90aW1lb3V0LAotICAgICAgdWludDE2X3QgbWluX2xvY2FsX3RpbWVvdXQpOwotCi0gIC8vIEZpeGVkQ2hhbm5lbE1hbmFnZXIgbWV0aG9kcwotCi0gIHZvaWQgQ29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzKGhjaTo6QWRkcmVzcyBkZXZpY2UsIFBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKTsKLQotICAvLyBEeW5hbWljQ2hhbm5lbE1hbmFnZXIgbWV0aG9kcwotCi0gIHZvaWQgQ29ubmVjdER5bmFtaWNDaGFubmVsU2VydmljZXMoCi0gICAgICBoY2k6OkFkZHJlc3MgZGV2aWNlLCBMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfY29ubmVjdGlvbiwgUHNtIHBzbSk7Ci0KLSAgLy8gRm9yIFNlY3VyaXR5TW9kdWxlIHRvIGluaXRpYXRlIGFuIEFDTCBsaW5rCi0gIHZvaWQgSW5pdGlhdGVDb25uZWN0aW9uRm9yU2VjdXJpdHkoaGNpOjpBZGRyZXNzIHJlbW90ZSk7Ci0KLSAgLy8gTGlua01hbmFnZXIgd2lsbCBoYW5kbGUgc2VuZGluZyBPbkxpbmtDb25uZWN0ZWQoKSBjYWxsYmFjayBhbmQgY29uc3RydWN0IGEgTGlua1NlY3VyaXR5SW50ZXJmYWNlIHByb3h5LgotICB2b2lkIFJlZ2lzdGVyTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgLy8gRm9yIHRoZSBsaW5rIHRvIGdldCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lcgotICBMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lciogR2V0TGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIoKTsKLQotICAvLyBSZWdpc3RlcmxpbmsgY2FsbGJhY2tzCi0gIHZvaWQgUmVnaXN0ZXJMaW5rUHJvcGVydHlMaXN0ZW5lcihvczo6SGFuZGxlciogaGFuZGxlciwgTGlua1Byb3BlcnR5TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvLyBSZXBvcnRlZCBieSBsaW5rIHRvIGluZGljYXRlIGhvdyBtYW55IHBlbmRpbmcgcGFja2V0cyBhcmUgcmVtYWluaW5nIHRvIGJlIHNldC4KLSAgLy8gSWYgdGhlcmUgaXMgYW55dGhpbmcgb3V0c3RhbmRpbmcsIGRvbid0IGRlbGV0ZSBsaW5rCi0gIHZvaWQgT25QZW5kaW5nUGFja2V0Q2hhbmdlKGhjaTo6QWRkcmVzcyByZW1vdGUsIGludCBudW1fcGFja2V0cyk7Ci0KLSBwcml2YXRlOgotICAvLyBIYW5kbGVzIHJlcXVlc3RzIGZyb20gTGlua1NlY3VyaXR5SW50ZXJmYWNlCi0gIGZyaWVuZCBjbGFzcyBMaW5rU2VjdXJpdHlJbnRlcmZhY2VJbXBsOwotICBmcmllbmQgY2xhc3MgRHVtcHN5c0hlbHBlcjsKLSAgdm9pZCBoYW5kbGVfbGlua19zZWN1cml0eV9ob2xkKGhjaTo6QWRkcmVzcyByZW1vdGUpOwotICB2b2lkIGhhbmRsZV9saW5rX3NlY3VyaXR5X3JlbGVhc2UoaGNpOjpBZGRyZXNzIHJlbW90ZSk7Ci0gIHZvaWQgaGFuZGxlX2xpbmtfc2VjdXJpdHlfZGlzY29ubmVjdChoY2k6OkFkZHJlc3MgcmVtb3RlKTsKLSAgdm9pZCBoYW5kbGVfbGlua19zZWN1cml0eV9lbnN1cmVfYXV0aGVudGljYXRlZChoY2k6OkFkZHJlc3MgcmVtb3RlKTsKLSAgdm9pZCBoYW5kbGVfbGlua19zZWN1cml0eV9lbnN1cmVfZW5jcnlwdGVkKGhjaTo6QWRkcmVzcyByZW1vdGUpOwotCi0gIC8vIERlcGVuZGVuY2llcwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl87Ci0gIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXJfOwotICBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXzsKLSAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfOwotICBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKiBwYXJhbWV0ZXJfcHJvdmlkZXJfOwotCi0gIC8vIEludGVybmFsIHN0YXRlcwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzLCBQZW5kaW5nTGluaz4gcGVuZGluZ19saW5rc187Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxoY2k6OkFkZHJlc3MsIExpbms+IGxpbmtzXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjpsaXN0PFBzbT4+IHBlbmRpbmdfZHluYW1pY19jaGFubmVsc187Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxoY2k6OkFkZHJlc3MsIHN0ZDo6bGlzdDxMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uPj4KLSAgICAgIHBlbmRpbmdfZHluYW1pY19jaGFubmVsc19jYWxsYmFja3NfOwotICBvczo6SGFuZGxlciogbGlua19zZWN1cml0eV9pbnRlcmZhY2VfbGlzdGVuZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lciogbGlua19zZWN1cml0eV9pbnRlcmZhY2VfbGlzdGVuZXJfID0gbnVsbHB0cjsKLSAgTGlua1Byb3BlcnR5TGlzdGVuZXIqIGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8gPSBudWxscHRyOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8aGNpOjpBZGRyZXNzPiBkaXNjb25uZWN0ZWRfbGlua3NfOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8aGNpOjpBZGRyZXNzPiBsaW5rc193aXRoX3BlbmRpbmdfcGFja2V0c187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExpbmtNYW5hZ2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXJfdGVzdC5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tYW5hZ2VyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWUwZGQuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi90ZXN0aW5nL2JpbmRfdGVzdF91dGlsLmgiCi0jaW5jbHVkZSAiZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXJfbW9jay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9maXhlZF9jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyX21vY2suaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgewotCi11c2luZyBoY2k6OnRlc3Rpbmc6Ok1vY2tBY2xNYW5hZ2VyOwotdXNpbmcgaGNpOjp0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb247Ci11c2luZyBsMmNhcDo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tQYXJhbWV0ZXJQcm92aWRlcjsKLXVzaW5nIDo6dGVzdGluZzo6XzsgIC8vIE1hdGNoZXIgdG8gYW55IHZhbHVlCi11c2luZyA6OnRlc3Rpbmc6OkJ5TW92ZTsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpNb2NrRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbDsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2tEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbDsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKLQotY29uc3RleHByIHN0YXRpYyBhdXRvIGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0TG9uZyA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCk7Ci1jb25zdGV4cHIgc3RhdGljIGF1dG8ga1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCk7Ci0KLWNsYXNzIEwyY2FwQ2xhc3NpY0xpbmtNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgU3luY0hhbmRsZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGhhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpKTsKLSAgICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgbDJjYXBfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfID0gbmV3IE1vY2tQYXJhbWV0ZXJQcm92aWRlcjsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfLCBHZXRDbGFzc2ljTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dExvbmcpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXzsKLSAgICBsMmNhcF9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgbDJjYXBfaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICBvczo6VGhyZWFkKiB0aHJlYWRfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyKiBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0xpbmtNYW5hZ2VyVGVzdCwgY29ubmVjdF9maXhlZF9jaGFubmVsX3NlcnZpY2Vfd2l0aG91dF9hY2wpIHsKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCBtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXI7Ci0gIE1vY2tEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCBtb2NrX2NsYXNzaWNfZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcjsKLSAgU2VjdXJpdHlFbmZvcmNlbWVudFJlamVjdEFsbEltcGwgc2VjdXJpdHlfbW9kdWxlX2ltcGw7Ci0gIE1vY2tEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsIHNlcnZpY2U7Ci0gIE9OX0NBTEwoc2VydmljZSwgR2V0U2VjdXJpdHlQb2xpY3koKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybihTZWN1cml0eVBvbGljeTo6X1NEUF9PTkxZX05PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSykpOwotCi0gIE9OX0NBTEwobW9ja19jbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsIEdldFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigmc2VjdXJpdHlfbW9kdWxlX2ltcGwpKTsKLSAgTW9ja0FjbE1hbmFnZXIgbW9ja19hY2xfbWFuYWdlcjsKLSAgaGNpOjpBZGRyZXNzIGRldmljZXt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotCi0gIC8vIFN0ZXAgMTogVmVyaWZ5IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiB3aXRoIEhDSQotICBoY2k6OmFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uQ2FsbGJhY2tzKiBoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MgPSBudWxscHRyOwotICBvczo6SGFuZGxlciogaGNpX2NhbGxiYWNrX2hhbmRsZXIgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MpLCBTYXZlQXJnPDE+KCZoY2lfY2FsbGJhY2tfaGFuZGxlcikpKTsKLSAgT05fQ0FMTChtb2NrX2NsYXNzaWNfZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0U2VydmljZShfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oJnNlcnZpY2UpKTsKLSAgTGlua01hbmFnZXIgY2xhc3NpY19saW5rX21hbmFnZXIobDJjYXBfaGFuZGxlcl8sICZtb2NrX2FjbF9tYW5hZ2VyLCAmbW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9ja19jbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyk7Ci0gIEVYUEVDVF9FUShoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MsICZjbGFzc2ljX2xpbmtfbWFuYWdlcik7Ci0gIEVYUEVDVF9FUShoY2lfY2FsbGJhY2tfaGFuZGxlciwgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIGZha2Ugc2VydmljZXMKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIG1vY2tfc2VydmljZV8xLCBtb2NrX3NlcnZpY2VfMjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGwqPj4gcmVzdWx0czsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa1NtcEJyQ2lkLCAmbW9ja19zZXJ2aWNlXzEpOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrQ29ubmVjdGlvbmxlc3NDaWQsICZtb2NrX3NlcnZpY2VfMik7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihyZXN1bHRzKSk7Ci0KLSAgLy8gU3RlcCAyOiBDb25uZWN0IHRvIGZpeGVkIGNoYW5uZWwgd2l0aG91dCBBQ0wgY29ubmVjdGlvbiBzaG91bGQgdHJpZ2dlciBBQ0wgY29ubmVjdGlvbiBwcm9jZXNzCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIENyZWF0ZUNvbm5lY3Rpb24oZGV2aWNlKSkuVGltZXMoMSk7Ci0gIExpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnsKLSAgICAgIC5oYW5kbGVyXyA9IHVzZXJfaGFuZGxlci5nZXQoKSwKLSAgICAgIC5vbl9mYWlsX2NhbGxiYWNrXyA9IGNvbW1vbjo6QmluZE9uY2UoW10oRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsgRkFJTCgpOyB9KX07Ci0gIGNsYXNzaWNfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhkZXZpY2UsIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikpOwotCi0gIC8vIFN0ZXAgMzogQUNMIGNvbm5lY3Rpb24gc3VjY2VzcyBldmVudCBzaG91bGQgdHJpZ2dlciBjaGFubmVsIGNyZWF0aW9uIGZvciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+KCk7Ci0gIEVYUEVDVF9DQUxMKCphY2xfY29ubmVjdGlvbiwgR2V0QWRkcmVzcygpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEVYUEVDVF9DQUxMKCphY2xfY29ubmVjdGlvbiwgUmVnaXN0ZXJDYWxsYmFja3MoXywgbDJjYXBfaGFuZGxlcl8pKS5UaW1lcygxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbF8xLCBjaGFubmVsXzI7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlXzEsIHByb21pc2VfMjsKLSAgYXV0byBmdXR1cmVfMSA9IHByb21pc2VfMS5nZXRfZnV0dXJlKCk7Ci0gIGF1dG8gZnV0dXJlXzIgPSBwcm9taXNlXzIuZ2V0X2Z1dHVyZSgpOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMSwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFsmY2hhbm5lbF8xLCAmcHJvbWlzZV8xXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWxfMSA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgcHJvbWlzZV8xLnNldF92YWx1ZSgpOwotICAgICAgfSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8yLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoWyZjaGFubmVsXzIsICZwcm9taXNlXzJdKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbF8yID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgICBwcm9taXNlXzIuc2V0X3ZhbHVlKCk7Ci0gICAgICB9KTsKLSAgaGNpX2NhbGxiYWNrX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrczo6T25Db25uZWN0U3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQoaGNpX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgc3RkOjptb3ZlKGFjbF9jb25uZWN0aW9uKSkpOwotICBTeW5jSGFuZGxlcihoY2lfY2FsbGJhY2tfaGFuZGxlcik7Ci0gIGF1dG8gZnV0dXJlXzFfc3RhdHVzID0gZnV0dXJlXzEud2FpdF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfMV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBFWFBFQ1RfTkUoY2hhbm5lbF8xLCBudWxscHRyKTsKLSAgYXV0byBmdXR1cmVfMl9zdGF0dXMgPSBmdXR1cmVfMi53YWl0X2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KTsKLSAgRVhQRUNUX0VRKGZ1dHVyZV8yX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIEVYUEVDVF9ORShjaGFubmVsXzIsIG51bGxwdHIpOwotCi0gIC8vIFN0ZXAgNDogQ2FsbGluZyBDb25uZWN0U2VydmljZXMoKSB0byB0aGUgc2FtZSBkZXZpY2Ugd2lsbCBubyB0cmlnZ2VyIGFub3RoZXIgY29ubmVjdGlvbiBhdHRlbXB0Ci0gIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgbXlfcmVzdWx0OwotICBMaW5rTWFuYWdlcjo6UGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb25fMnsKLSAgICAgIC5oYW5kbGVyXyA9IHVzZXJfaGFuZGxlci5nZXQoKSwKLSAgICAgIC5vbl9mYWlsX2NhbGxiYWNrXyA9IGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoCi0gICAgICAgICAgWyZteV9yZXN1bHRdKEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgcmVzdWx0KSB7IG15X3Jlc3VsdCA9IHJlc3VsdDsgfSl9OwotICBjbGFzc2ljX2xpbmtfbWFuYWdlci5Db25uZWN0Rml4ZWRDaGFubmVsU2VydmljZXMoZGV2aWNlLCBzdGQ6Om1vdmUocGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb25fMikpOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXIuZ2V0KCkpOwotICBFWFBFQ1RfRVEobXlfcmVzdWx0LmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUsCi0gICAgICAgICAgICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMKTsKLQotICAvLyBTdGVwIDU6IFJlZ2lzdGVyIG5ldyBzZXJ2aWNlIHdpbGwgY2F1c2UgbmV3IGNoYW5uZWxzIHRvIGJlIGNyZWF0ZWQgZHVyaW5nIENvbm5lY3RTZXJ2aWNlcygpCi0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCBtb2NrX3NlcnZpY2VfMzsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa1NtcEJyQ2lkICsgMSwgJm1vY2tfc2VydmljZV8zKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLCBHZXRSZWdpc3RlcmVkU2VydmljZXMoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHJlc3VsdHMpKTsKLSAgTGlua01hbmFnZXI6OlBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uXzN7Ci0gICAgICAuaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXIuZ2V0KCksCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBjb21tb246OkJpbmRPbmNlKFtdKEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgcmVzdWx0KSB7IEZBSUwoKTsgfSl9OwotICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsXzM7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8zLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpLldpbGxPbmNlKFsmY2hhbm5lbF8zXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgY2hhbm5lbF8zID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICB9KTsKLSAgY2xhc3NpY19saW5rX21hbmFnZXIuQ29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzKGRldmljZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uXzMpKTsKLSAgRVhQRUNUX05FKGNoYW5uZWxfMywgbnVsbHB0cik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotCi0gIGNsYXNzaWNfbGlua19tYW5hZ2VyLk9uRGlzY29ubmVjdChkZXZpY2UsIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLX0KLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0xpbmtNYW5hZ2VyVGVzdCwgY29ubmVjdF9maXhlZF9jaGFubmVsX3NlcnZpY2Vfd2l0aG91dF9hY2xfd2l0aF9ub19zZXJ2aWNlKSB7Ci0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgbW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyOwotICBNb2NrQWNsTWFuYWdlciBtb2NrX2FjbF9tYW5hZ2VyOwotICBoY2k6OkFkZHJlc3MgZGV2aWNle3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIGF1dG8gdXNlcl9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6SGFuZGxlcj4odGhyZWFkXyk7Ci0KLSAgLy8gU3RlcCAxOiBWZXJpZnkgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHdpdGggSENJCi0gIGhjaTo6YWNsX21hbmFnZXI6OkNvbm5lY3Rpb25DYWxsYmFja3MqIGhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoY2lfY2FsbGJhY2tfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIFNhdmVBcmc8MT4oJmhjaV9jYWxsYmFja19oYW5kbGVyKSkpOwotICBMaW5rTWFuYWdlciBjbGFzc2ljX2xpbmtfbWFuYWdlcihsMmNhcF9oYW5kbGVyXywgJm1vY2tfYWNsX21hbmFnZXIsICZtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyk7Ci0gIEVYUEVDVF9FUShoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MsICZjbGFzc2ljX2xpbmtfbWFuYWdlcik7Ci0gIEVYUEVDVF9FUShoY2lfY2FsbGJhY2tfaGFuZGxlciwgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIE1ha2Ugc3VyZSBubyBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGwqPj4gcmVzdWx0czsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLCBHZXRSZWdpc3RlcmVkU2VydmljZXMoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHJlc3VsdHMpKTsKLQotICAvLyBTdGVwIDI6IENvbm5lY3QgdG8gZml4ZWQgY2hhbm5lbCB3aXRob3V0IGFueSBzZXJ2aWNlIHJlZ2lzdGVyZWQgd2lsbCByZXN1bHQgaW4gZmFpbHVyZQotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBDcmVhdGVDb25uZWN0aW9uKGRldmljZSkpLlRpbWVzKDApOwotICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IG15X3Jlc3VsdDsKLSAgTGlua01hbmFnZXI6OlBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uewotICAgICAgLmhhbmRsZXJfID0gdXNlcl9oYW5kbGVyLmdldCgpLAotICAgICAgLm9uX2ZhaWxfY2FsbGJhY2tfID0gY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKLSAgICAgICAgICBbJm15X3Jlc3VsdF0oRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsgbXlfcmVzdWx0ID0gcmVzdWx0OyB9KX07Ci0gIGNsYXNzaWNfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhkZXZpY2UsIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikpOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXIuZ2V0KCkpOwotICBFWFBFQ1RfRVEobXlfcmVzdWx0LmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUsIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHRDb2RlOjpGQUlMX05PX1NFUlZJQ0VfUkVHSVNURVJFRCk7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljTGlua01hbmFnZXJUZXN0LCBjb25uZWN0X2ZpeGVkX2NoYW5uZWxfc2VydmljZV93aXRob3V0X2FjbF93aXRoX2hjaV9mYWlsdXJlKSB7Ci0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgbW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyOwotICBNb2NrQWNsTWFuYWdlciBtb2NrX2FjbF9tYW5hZ2VyOwotICBoY2k6OkFkZHJlc3MgZGV2aWNle3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIGF1dG8gdXNlcl9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6SGFuZGxlcj4odGhyZWFkXyk7Ci0KLSAgLy8gU3RlcCAxOiBWZXJpZnkgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHdpdGggSENJCi0gIGhjaTo6YWNsX21hbmFnZXI6OkNvbm5lY3Rpb25DYWxsYmFja3MqIGhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoY2lfY2FsbGJhY2tfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIFNhdmVBcmc8MT4oJmhjaV9jYWxsYmFja19oYW5kbGVyKSkpOwotICBMaW5rTWFuYWdlciBjbGFzc2ljX2xpbmtfbWFuYWdlcihsMmNhcF9oYW5kbGVyXywgJm1vY2tfYWNsX21hbmFnZXIsICZtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyk7Ci0gIEVYUEVDVF9FUShoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MsICZjbGFzc2ljX2xpbmtfbWFuYWdlcik7Ci0gIEVYUEVDVF9FUShoY2lfY2FsbGJhY2tfaGFuZGxlciwgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIGZha2Ugc2VydmljZXMKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIG1vY2tfc2VydmljZV8xOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrU21wQnJDaWQsICZtb2NrX3NlcnZpY2VfMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihyZXN1bHRzKSk7Ci0KLSAgLy8gU3RlcCAyOiBDb25uZWN0IHRvIGZpeGVkIGNoYW5uZWwgd2l0aG91dCBBQ0wgY29ubmVjdGlvbiBzaG91bGQgdHJpZ2dlciBBQ0wgY29ubmVjdGlvbiBwcm9jZXNzCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIENyZWF0ZUNvbm5lY3Rpb24oZGV2aWNlKSkuVGltZXMoMSk7Ci0gIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgbXlfcmVzdWx0OwotICBMaW5rTWFuYWdlcjo6UGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAuaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXIuZ2V0KCksCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAotICAgICAgICAgIFsmbXlfcmVzdWx0XShGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgeyBteV9yZXN1bHQgPSByZXN1bHQ7IH0pfTsKLSAgY2xhc3NpY19saW5rX21hbmFnZXIuQ29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzKGRldmljZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0KLSAgLy8gU3RlcCAzOiBBQ0wgY29ubmVjdGlvbiBmYWlsdXJlIGV2ZW50IHNob3VsZCB0cmlnZ2VyIGNvbm5lY3Rpb24gZmFpbHVyZSBjYWxsYmFjawotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMSwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKS5UaW1lcygwKTsKLSAgaGNpX2NhbGxiYWNrX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrczo6T25Db25uZWN0RmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQoaGNpX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6RXJyb3JDb2RlOjpQQUdFX1RJTUVPVVQpKTsKLSAgU3luY0hhbmRsZXIoaGNpX2NhbGxiYWNrX2hhbmRsZXIpOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXIuZ2V0KCkpOwotICBFWFBFQ1RfRVEobXlfcmVzdWx0LmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUsIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHRDb2RlOjpGQUlMX0hDSV9FUlJPUik7Ci0gIEVYUEVDVF9FUShteV9yZXN1bHQuaGNpX2Vycm9yLCBoY2k6OkVycm9yQ29kZTo6UEFHRV9USU1FT1VUKTsKLQotICB1c2VyX2hhbmRsZXItPkNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcENsYXNzaWNMaW5rTWFuYWdlclRlc3QsIG5vdF9hY3F1aXJpbmdfY2hhbm5lbHNfc2hvdWxkX2Rpc2Nvbm5lY3RfYWNsX2FmdGVyX3RpbWVvdXQpIHsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXywgR2V0Q2xhc3NpY0xpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpKTsKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCBtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXI7Ci0gIE1vY2tBY2xNYW5hZ2VyIG1vY2tfYWNsX21hbmFnZXI7Ci0gIGhjaTo6QWRkcmVzcyBkZXZpY2V7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLQotICAvLyBTdGVwIDE6IFZlcmlmeSBjYWxsYmFjayByZWdpc3RyYXRpb24gd2l0aCBIQ0kKLSAgaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrcyogaGNpX2Nvbm5lY3Rpb25fY2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGhjaV9jYWxsYmFja19oYW5kbGVyID0gbnVsbHB0cjsKLSAgRVhQRUNUX0NBTEwobW9ja19hY2xfbWFuYWdlciwgUmVnaXN0ZXJDYWxsYmFja3MoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmaGNpX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgU2F2ZUFyZzwxPigmaGNpX2NhbGxiYWNrX2hhbmRsZXIpKSk7Ci0gIExpbmtNYW5hZ2VyIGNsYXNzaWNfbGlua19tYW5hZ2VyKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19hY2xfbWFuYWdlciwgJm1vY2tfY2xhc3NpY19maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfKTsKLSAgRVhQRUNUX0VRKGhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcywgJmNsYXNzaWNfbGlua19tYW5hZ2VyKTsKLSAgRVhQRUNUX0VRKGhjaV9jYWxsYmFja19oYW5kbGVyLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgZmFrZSBzZXJ2aWNlcwotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZUltcGwgbW9ja19zZXJ2aWNlXzEsIG1vY2tfc2VydmljZV8yOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrU21wQnJDaWQsICZtb2NrX3NlcnZpY2VfMSk7Ci0gIHJlc3VsdHMuZW1wbGFjZV9iYWNrKGtDb25uZWN0aW9ubGVzc0NpZCwgJm1vY2tfc2VydmljZV8yKTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLCBHZXRSZWdpc3RlcmVkU2VydmljZXMoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHJlc3VsdHMpKTsKLQotICAvLyBTdGVwIDI6IENvbm5lY3QgdG8gZml4ZWQgY2hhbm5lbCB3aXRob3V0IEFDTCBjb25uZWN0aW9uIHNob3VsZCB0cmlnZ2VyIEFDTCBjb25uZWN0aW9uIHByb2Nlc3MKLSAgRVhQRUNUX0NBTEwobW9ja19hY2xfbWFuYWdlciwgQ3JlYXRlQ29ubmVjdGlvbihkZXZpY2UpKS5UaW1lcygxKTsKLSAgTGlua01hbmFnZXI6OlBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uewotICAgICAgLmhhbmRsZXJfID0gdXNlcl9oYW5kbGVyLmdldCgpLAotICAgICAgLm9uX2ZhaWxfY2FsbGJhY2tfID0gY29tbW9uOjpCaW5kT25jZShbXShGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgeyBGQUlMKCk7IH0pfTsKLSAgY2xhc3NpY19saW5rX21hbmFnZXIuQ29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzKGRldmljZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0KLSAgLy8gU3RlcCAzOiBBQ0wgY29ubmVjdGlvbiBzdWNjZXNzIGV2ZW50IHNob3VsZCB0cmlnZ2VyIGNoYW5uZWwgY3JlYXRpb24gZm9yIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzCi0gIGF1dG8qIHJhd19hY2xfY29ubmVjdGlvbiA9IG5ldyBNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPE1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb24ocmF3X2FjbF9jb25uZWN0aW9uKTsKLSAgRVhQRUNUX0NBTEwoKmFjbF9jb25uZWN0aW9uLCBHZXRBZGRyZXNzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgRVhQRUNUX0NBTEwoKmFjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBsMmNhcF9oYW5kbGVyXykpLlRpbWVzKDEpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsXzEsIGNoYW5uZWxfMjsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2VfMSwgcHJvbWlzZV8yOwotICBhdXRvIGZ1dHVyZV8xID0gcHJvbWlzZV8xLmdldF9mdXR1cmUoKTsKLSAgYXV0byBmdXR1cmVfMiA9IHByb21pc2VfMi5nZXRfZnV0dXJlKCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8xLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoWyZjaGFubmVsXzEsICZwcm9taXNlXzFdKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbF8xID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgICBwcm9taXNlXzEuc2V0X3ZhbHVlKCk7Ci0gICAgICB9KTsKLSAgRVhQRUNUX0NBTEwobW9ja19zZXJ2aWNlXzIsIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShbJmNoYW5uZWxfMiwgJnByb21pc2VfMl0oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsXzIgPSBzdGQ6Om1vdmUoY2hhbm5lbCk7Ci0gICAgICAgIHByb21pc2VfMi5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotICBoY2lfY2FsbGJhY2tfaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZoY2k6OmFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkNvbm5lY3RTdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MpLCBzdGQ6Om1vdmUoYWNsX2Nvbm5lY3Rpb24pKSk7Ci0gIFN5bmNIYW5kbGVyKGhjaV9jYWxsYmFja19oYW5kbGVyKTsKLSAgYXV0byBmdXR1cmVfMV9zdGF0dXMgPSBmdXR1cmVfMS53YWl0X2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KTsKLSAgRVhQRUNUX0VRKGZ1dHVyZV8xX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIEVYUEVDVF9ORShjaGFubmVsXzEsIG51bGxwdHIpOwotICBhdXRvIGZ1dHVyZV8yX3N0YXR1cyA9IGZ1dHVyZV8yLndhaXRfZm9yKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpOwotICBFWFBFQ1RfRVEoZnV0dXJlXzJfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgRVhQRUNUX05FKGNoYW5uZWxfMiwgbnVsbHB0cik7Ci0gIGhjaTo6RXJyb3JDb2RlIHN0YXR1c18xID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGNoYW5uZWxfMS0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICB1c2VyX2hhbmRsZXIuZ2V0KCksIGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBzdGF0dXNfMSA9IHN0YXR1czsgfSkpOwotICBoY2k6OkVycm9yQ29kZSBzdGF0dXNfMiA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBjaGFubmVsXzItPlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyLmdldCgpLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgc3RhdHVzXzIgPSBzdGF0dXM7IH0pKTsKLQotICAvLyBTdGVwIDQ6IExlYXZlIGNoYW5uZWwgSURMRSBsb25nIGVub3VnaCwgdGhleSB3aWxsIGRpc2Nvbm5lY3QKLSAgRVhQRUNUX0NBTEwoKnJhd19hY2xfY29ubmVjdGlvbiwgRGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb246OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTikpLlRpbWVzKDEpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCAqIDEuMik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljTGlua01hbmFnZXJUZXN0LCBhY3F1aXJpbmdfY2hhbm5lbHNfc2hvdWxkX25vdF9kaXNjb25uZWN0X2FjbF9hZnRlcl90aW1lb3V0KSB7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8sIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KSk7Ci0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgbW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyOwotICBNb2NrQWNsTWFuYWdlciBtb2NrX2FjbF9tYW5hZ2VyOwotICBoY2k6OkFkZHJlc3MgZGV2aWNle3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIGF1dG8gdXNlcl9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6SGFuZGxlcj4odGhyZWFkXyk7Ci0KLSAgLy8gU3RlcCAxOiBWZXJpZnkgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHdpdGggSENJCi0gIGhjaTo6YWNsX21hbmFnZXI6OkNvbm5lY3Rpb25DYWxsYmFja3MqIGhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoY2lfY2FsbGJhY2tfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIFNhdmVBcmc8MT4oJmhjaV9jYWxsYmFja19oYW5kbGVyKSkpOwotICBMaW5rTWFuYWdlciBjbGFzc2ljX2xpbmtfbWFuYWdlcihsMmNhcF9oYW5kbGVyXywgJm1vY2tfYWNsX21hbmFnZXIsICZtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyk7Ci0gIEVYUEVDVF9FUShoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MsICZjbGFzc2ljX2xpbmtfbWFuYWdlcik7Ci0gIEVYUEVDVF9FUShoY2lfY2FsbGJhY2tfaGFuZGxlciwgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIGZha2Ugc2VydmljZXMKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIG1vY2tfc2VydmljZV8xLCBtb2NrX3NlcnZpY2VfMjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGwqPj4gcmVzdWx0czsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa1NtcEJyQ2lkLCAmbW9ja19zZXJ2aWNlXzEpOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrQ29ubmVjdGlvbmxlc3NDaWQsICZtb2NrX3NlcnZpY2VfMik7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihyZXN1bHRzKSk7Ci0KLSAgLy8gU3RlcCAyOiBDb25uZWN0IHRvIGZpeGVkIGNoYW5uZWwgd2l0aG91dCBBQ0wgY29ubmVjdGlvbiBzaG91bGQgdHJpZ2dlciBBQ0wgY29ubmVjdGlvbiBwcm9jZXNzCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIENyZWF0ZUNvbm5lY3Rpb24oZGV2aWNlKSkuVGltZXMoMSk7Ci0gIExpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnsKLSAgICAgIC5oYW5kbGVyXyA9IHVzZXJfaGFuZGxlci5nZXQoKSwKLSAgICAgIC5vbl9mYWlsX2NhbGxiYWNrXyA9IGNvbW1vbjo6QmluZE9uY2UoW10oRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsgRkFJTCgpOyB9KX07Ci0gIGNsYXNzaWNfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhkZXZpY2UsIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikpOwotCi0gIC8vIFN0ZXAgMzogQUNMIGNvbm5lY3Rpb24gc3VjY2VzcyBldmVudCBzaG91bGQgdHJpZ2dlciBjaGFubmVsIGNyZWF0aW9uIGZvciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcwotICBhdXRvKiByYXdfYWNsX2Nvbm5lY3Rpb24gPSBuZXcgTW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uKHJhd19hY2xfY29ubmVjdGlvbik7Ci0gIEVYUEVDVF9DQUxMKCphY2xfY29ubmVjdGlvbiwgR2V0QWRkcmVzcygpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEVYUEVDVF9DQUxMKCphY2xfY29ubmVjdGlvbiwgUmVnaXN0ZXJDYWxsYmFja3MoXywgbDJjYXBfaGFuZGxlcl8pKS5UaW1lcygxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbF8xLCBjaGFubmVsXzI7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlXzEsIHByb21pc2VfMjsKLSAgYXV0byBmdXR1cmVfMSA9IHByb21pc2VfMS5nZXRfZnV0dXJlKCk7Ci0gIGF1dG8gZnV0dXJlXzIgPSBwcm9taXNlXzIuZ2V0X2Z1dHVyZSgpOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMSwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFsmY2hhbm5lbF8xLCAmcHJvbWlzZV8xXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWxfMSA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgcHJvbWlzZV8xLnNldF92YWx1ZSgpOwotICAgICAgfSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8yLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoWyZjaGFubmVsXzIsICZwcm9taXNlXzJdKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbF8yID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgICBwcm9taXNlXzIuc2V0X3ZhbHVlKCk7Ci0gICAgICB9KTsKLSAgaGNpX2NhbGxiYWNrX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrczo6T25Db25uZWN0U3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQoaGNpX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgc3RkOjptb3ZlKGFjbF9jb25uZWN0aW9uKSkpOwotICBTeW5jSGFuZGxlcihoY2lfY2FsbGJhY2tfaGFuZGxlcik7Ci0gIGF1dG8gZnV0dXJlXzFfc3RhdHVzID0gZnV0dXJlXzEud2FpdF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfMV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBFWFBFQ1RfTkUoY2hhbm5lbF8xLCBudWxscHRyKTsKLSAgYXV0byBmdXR1cmVfMl9zdGF0dXMgPSBmdXR1cmVfMi53YWl0X2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KTsKLSAgRVhQRUNUX0VRKGZ1dHVyZV8yX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIEVYUEVDVF9ORShjaGFubmVsXzIsIG51bGxwdHIpOwotICBoY2k6OkVycm9yQ29kZSBzdGF0dXNfMSA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBjaGFubmVsXzEtPlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyLmdldCgpLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgc3RhdHVzXzEgPSBzdGF0dXM7IH0pKTsKLSAgaGNpOjpFcnJvckNvZGUgc3RhdHVzXzIgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgY2hhbm5lbF8yLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IHN0YXR1c18yID0gc3RhdHVzOyB9KSk7Ci0KLSAgY2hhbm5lbF8xLT5BY3F1aXJlKCk7Ci0KLSAgLy8gU3RlcCA0OiBMZWF2ZSBjaGFubmVsIElETEUsIGl0IHdvbid0IGRpc2Nvbm5lY3QgdG8gZHVlIGFjcXVpcmVkIGNoYW5uZWwgMQotICBFWFBFQ1RfQ0FMTCgqcmF3X2FjbF9jb25uZWN0aW9uLCBEaXNjb25uZWN0KGhjaTo6RGlzY29ubmVjdFJlYXNvbjo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKSkuVGltZXMoMCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0ICogMik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljTGlua01hbmFnZXJUZXN0LCBhY3F1aXJpbmdfYW5kX3JlbGVhc2luZ19jaGFubmVsc19zaG91bGRfZXZlbnR1YWxseV9kaXNjb25uZWN0X2FjbCkgewotICBFWFBFQ1RfQ0FMTCgqbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfLCBHZXRDbGFzc2ljTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCkpOwotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIG1vY2tfY2xhc3NpY19maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcjsKLSAgTW9ja0FjbE1hbmFnZXIgbW9ja19hY2xfbWFuYWdlcjsKLSAgaGNpOjpBZGRyZXNzIGRldmljZXt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotCi0gIC8vIFN0ZXAgMTogVmVyaWZ5IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiB3aXRoIEhDSQotICBoY2k6OmFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uQ2FsbGJhY2tzKiBoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MgPSBudWxscHRyOwotICBvczo6SGFuZGxlciogaGNpX2NhbGxiYWNrX2hhbmRsZXIgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZoY2lfY29ubmVjdGlvbl9jYWxsYmFja3MpLCBTYXZlQXJnPDE+KCZoY2lfY2FsbGJhY2tfaGFuZGxlcikpKTsKLSAgTGlua01hbmFnZXIgY2xhc3NpY19saW5rX21hbmFnZXIobDJjYXBfaGFuZGxlcl8sICZtb2NrX2FjbF9tYW5hZ2VyLCAmbW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8pOwotICBFWFBFQ1RfRVEoaGNpX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLCAmY2xhc3NpY19saW5rX21hbmFnZXIpOwotICBFWFBFQ1RfRVEoaGNpX2NhbGxiYWNrX2hhbmRsZXIsIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBSZWdpc3RlciBmYWtlIHNlcnZpY2VzCi0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCBtb2NrX3NlcnZpY2VfMSwgbW9ja19zZXJ2aWNlXzI7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKj4+IHJlc3VsdHM7Ci0gIHJlc3VsdHMuZW1wbGFjZV9iYWNrKGtTbXBCckNpZCwgJm1vY2tfc2VydmljZV8xKTsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa0Nvbm5lY3Rpb25sZXNzQ2lkLCAmbW9ja19zZXJ2aWNlXzIpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsIEdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4ocmVzdWx0cykpOwotCi0gIC8vIFN0ZXAgMjogQ29ubmVjdCB0byBmaXhlZCBjaGFubmVsIHdpdGhvdXQgQUNMIGNvbm5lY3Rpb24gc2hvdWxkIHRyaWdnZXIgQUNMIGNvbm5lY3Rpb24gcHJvY2VzcwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBDcmVhdGVDb25uZWN0aW9uKGRldmljZSkpLlRpbWVzKDEpOwotICBMaW5rTWFuYWdlcjo6UGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAuaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXIuZ2V0KCksCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBjb21tb246OkJpbmRPbmNlKFtdKEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgcmVzdWx0KSB7IEZBSUwoKTsgfSl9OwotICBjbGFzc2ljX2xpbmtfbWFuYWdlci5Db25uZWN0Rml4ZWRDaGFubmVsU2VydmljZXMoZGV2aWNlLCBzdGQ6Om1vdmUocGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24pKTsKLQotICAvLyBTdGVwIDM6IEFDTCBjb25uZWN0aW9uIHN1Y2Nlc3MgZXZlbnQgc2hvdWxkIHRyaWdnZXIgY2hhbm5lbCBjcmVhdGlvbiBmb3IgYWxsIHJlZ2lzdGVyZWQgc2VydmljZXMKLSAgYXV0byogcmF3X2FjbF9jb25uZWN0aW9uID0gbmV3IE1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbihyYXdfYWNsX2Nvbm5lY3Rpb24pOwotICBFWFBFQ1RfQ0FMTCgqYWNsX2Nvbm5lY3Rpb24sIEdldEFkZHJlc3MoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBFWFBFQ1RfQ0FMTCgqYWNsX2Nvbm5lY3Rpb24sIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIGwyY2FwX2hhbmRsZXJfKSkuVGltZXMoMSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWxfMSwgY2hhbm5lbF8yOwotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZV8xLCBwcm9taXNlXzI7Ci0gIGF1dG8gZnV0dXJlXzEgPSBwcm9taXNlXzEuZ2V0X2Z1dHVyZSgpOwotICBhdXRvIGZ1dHVyZV8yID0gcHJvbWlzZV8yLmdldF9mdXR1cmUoKTsKLSAgRVhQRUNUX0NBTEwobW9ja19zZXJ2aWNlXzEsIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShbJmNoYW5uZWxfMSwgJnByb21pc2VfMV0oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsXzEgPSBzdGQ6Om1vdmUoY2hhbm5lbCk7Ci0gICAgICAgIHByb21pc2VfMS5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMiwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFsmY2hhbm5lbF8yLCAmcHJvbWlzZV8yXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWxfMiA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgcHJvbWlzZV8yLnNldF92YWx1ZSgpOwotICAgICAgfSk7Ci0gIGhjaV9jYWxsYmFja19oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmhjaTo6YWNsX21hbmFnZXI6OkNvbm5lY3Rpb25DYWxsYmFja3M6Ok9uQ29ubmVjdFN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGhjaV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIHN0ZDo6bW92ZShhY2xfY29ubmVjdGlvbikpKTsKLSAgU3luY0hhbmRsZXIoaGNpX2NhbGxiYWNrX2hhbmRsZXIpOwotICBhdXRvIGZ1dHVyZV8xX3N0YXR1cyA9IGZ1dHVyZV8xLndhaXRfZm9yKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpOwotICBFWFBFQ1RfRVEoZnV0dXJlXzFfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgRVhQRUNUX05FKGNoYW5uZWxfMSwgbnVsbHB0cik7Ci0gIGF1dG8gZnV0dXJlXzJfc3RhdHVzID0gZnV0dXJlXzIud2FpdF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfMl9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBFWFBFQ1RfTkUoY2hhbm5lbF8yLCBudWxscHRyKTsKLSAgaGNpOjpFcnJvckNvZGUgc3RhdHVzXzEgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgY2hhbm5lbF8xLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IHN0YXR1c18xID0gc3RhdHVzOyB9KSk7Ci0gIGhjaTo6RXJyb3JDb2RlIHN0YXR1c18yID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGNoYW5uZWxfMi0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICB1c2VyX2hhbmRsZXIuZ2V0KCksIGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBzdGF0dXNfMiA9IHN0YXR1czsgfSkpOwotCi0gIGNoYW5uZWxfMS0+QWNxdWlyZSgpOwotCi0gIC8vIFN0ZXAgNDogTGVhdmUgY2hhbm5lbCBJRExFLCBpdCB3b24ndCBkaXNjb25uZWN0IHRvIGR1ZSBhY3F1aXJlZCBjaGFubmVsIDEKLSAgRVhQRUNUX0NBTEwoKnJhd19hY2xfY29ubmVjdGlvbiwgRGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb246OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTikpLlRpbWVzKDApOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCAqIDIpOwotCi0gIC8vIFN0ZXAgNTogTGVhdmUgY2hhbm5lbCBJRExFIGxvbmcgZW5vdWdoLCB0aGV5IHdpbGwgZGlzY29ubmVjdAotICBjaGFubmVsXzEtPlJlbGVhc2UoKTsKLSAgRVhQRUNUX0NBTEwoKnJhd19hY2xfY29ubmVjdGlvbiwgRGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb246OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTikpLlRpbWVzKDEpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCAqIDEuMik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21vY2suaCBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjAyZWUuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlcl9tb2NrLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfbW9jay5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotLy8gVW5pdCB0ZXN0IGludGVyZmFjZXMKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGhjaTo6dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uOwotCi1jbGFzcyBNb2NrTGluayA6IHB1YmxpYyBMaW5rIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1vY2tMaW5rKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKiBwYXJhbWV0ZXJfcHJvdmlkZXIpCi0gICAgICA6IExpbmsoaGFuZGxlciwgc3RkOjptYWtlX3VuaXF1ZTxNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+KCksIHBhcmFtZXRlcl9wcm92aWRlciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cil7fTsKLSAgZXhwbGljaXQgTW9ja0xpbmsob3M6OkhhbmRsZXIqIGhhbmRsZXIsIGwyY2FwOjppbnRlcm5hbDo6UGFyYW1ldGVyUHJvdmlkZXIqIHBhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkNsYXNzaWNBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbiwgTGlua01hbmFnZXIqIGxpbmtfbWFuYWdlcikKLSAgICAgIDogTGluayhoYW5kbGVyLCBzdGQ6Om1vdmUoYWNsX2Nvbm5lY3Rpb24pLCBwYXJhbWV0ZXJfcHJvdmlkZXIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpe307Ci0gIE1PQ0tfTUVUSE9EKGhjaTo6QWRkcmVzc1dpdGhUeXBlLCBHZXREZXZpY2UsICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIE9uQWNsRGlzY29ubmVjdGVkLCAoaGNpOjpFcnJvckNvZGUgc3RhdHVzKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIERpc2Nvbm5lY3QsICgpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qoc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiwgQWxsb2NhdGVEeW5hbWljQ2hhbm5lbCwgKFBzbSBwc20sIENpZCBjaWQpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQotICBNT0NLX01FVEhPRChib29sLCBJc0ZpeGVkQ2hhbm5lbEFsbG9jYXRlZCwgKENpZCBjaWQpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVmcmVzaFJlZkNvdW50LCAoKSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfdGVzdC5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQ2ZGM3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaCIKLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlcl9tb2NrLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay1uaWNlLXN0cmljdC5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotdXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciBQc20ga1BzbSA9IDEyMzsKLWNvbnN0ZXhwciBDaWQga0NpZCA9IDQ1NjsKLQotdXNpbmcgY2xhc3NpYzo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsOwotdXNpbmcgY2xhc3NpYzo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLXVzaW5nIGhjaTo6dGVzdGluZzo6TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uOwotdXNpbmcgbDJjYXA6OmludGVybmFsOjp0ZXN0aW5nOjpNb2NrUGFyYW1ldGVyUHJvdmlkZXI7Ci11c2luZyB0ZXN0aW5nOjpNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOwotCi1jbGFzcyBMMmNhcENsYXNzaWNMaW5rVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBPbk9wZW4oc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgb25fb3Blbl9wcm9taXNlXy5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgT25GYWlsKER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsKLSAgICBvbl9mYWlsX3Byb21pc2VfLnNldF92YWx1ZSgpOwotICB9Ci0KLSAgdm9pZCBPbkRlcXVldWVDYWxsYmFja0ZvclRlc3QoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBkYXRhID0gcmF3X2FjbF9jb25uZWN0aW9uXy0+YWNsX3F1ZXVlXy5HZXREb3duRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICBkZXF1ZXVlX3Byb21pc2VfLnNldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRW5xdWV1ZUNhbGxiYWNrRm9yVGVzdCgpIHsKLSAgICByYXdfYWNsX2Nvbm5lY3Rpb25fLT5hY2xfcXVldWVfLkdldERvd25FbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBoYW5kbGVyXywgY29tbW9uOjpCaW5kKCZMMmNhcENsYXNzaWNMaW5rVGVzdDo6T25EZXF1ZXVlQ2FsbGJhY2tGb3JUZXN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgRGVxdWV1ZUNhbGxiYWNrKCkgewotICAgIHJhd19hY2xfY29ubmVjdGlvbl8tPmFjbF9xdWV1ZV8uR2V0RG93bkVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGhhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICAgIHNpZ25hbGxpbmdfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0KLSAgICByYXdfYWNsX2Nvbm5lY3Rpb25fID0gbmV3IE5pY2VNb2NrPE1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbj4oKTsKLSAgICBsaW5rXyA9IG5ldyBMaW5rKHNpZ25hbGxpbmdfaGFuZGxlcl8sIHN0ZDo6dW5pcXVlX3B0cjxNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+KHJhd19hY2xfY29ubmVjdGlvbl8pLAotICAgICAgICAgICAgICAgICAgICAgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXywgJm1vY2tfY2xhc3NpY19keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXywKLSAgICAgICAgICAgICAgICAgICAgICZtb2NrX2NsYXNzaWNfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfLCBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIGxpbmtfOwotCi0gICAgc2lnbmFsbGluZ19oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgc2lnbmFsbGluZ19oYW5kbGVyXzsKLQotICAgIGhhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBoYW5kbGVyXzsKLQotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgb3M6OlRocmVhZCogdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBzaWduYWxsaW5nX2hhbmRsZXJfID0gbnVsbHB0cjsKLQotICBNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24qIHJhd19hY2xfY29ubmVjdGlvbl8gPSBudWxscHRyOwotICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbl87Ci0KLSAgTmljZU1vY2s8TW9ja1BhcmFtZXRlclByb3ZpZGVyPiBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl87Ci0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgbW9ja19jbGFzc2ljX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXzsKLSAgTW9ja0R5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIG1vY2tfY2xhc3NpY19keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXzsKLSAgU2VjdXJpdHlFbmZvcmNlbWVudFJlamVjdEFsbEltcGwgc2VjdXJpdHlfbW9kdWxlX2ltcGxfOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBvbl9vcGVuX3Byb21pc2VfOwotICBzdGQ6OnByb21pc2U8dm9pZD4gb25fZmFpbF9wcm9taXNlXzsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGRlcXVldWVfcHJvbWlzZV87Ci0KLSAgTGluayogbGlua187Ci19OwotCi1URVNUX0YoTDJjYXBDbGFzc2ljTGlua1Rlc3QsIHBlbmRpbmdfY2hhbm5lbHNfZ2V0X25vdGlmaWVkX29uX2FjbF9kaXNjb25uZWN0KSB7Ci0gIEVucXVldWVDYWxsYmFja0ZvclRlc3QoKTsKLQotICBMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAub25fb3Blbl9jYWxsYmFja18gPSBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZMMmNhcENsYXNzaWNMaW5rVGVzdDo6T25PcGVuKSwKLSAgICAgIC5vbl9mYWlsX2NhbGxiYWNrXyA9IGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZMMmNhcENsYXNzaWNMaW5rVGVzdDo6T25GYWlsKSwKLSAgICAgIC5jb25maWd1cmF0aW9uXyA9IER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbigpLAotICB9OwotICBhdXRvIGZ1dHVyZSA9IG9uX2ZhaWxfcHJvbWlzZV8uZ2V0X2Z1dHVyZSgpOwotCi0gIE1vY2tEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsIHNlcnZpY2U7Ci0gIE9OX0NBTEwoc2VydmljZSwgR2V0U2VjdXJpdHlQb2xpY3koKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KDo6dGVzdGluZzo6UmV0dXJuKFNlY3VyaXR5UG9saWN5OjpfU0RQX09OTFlfTk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LKSk7Ci0KLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfLCBHZXRTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKCkpCi0gICAgICAuV2lsbE9uY2UoOjp0ZXN0aW5nOjpSZXR1cm4oJnNlY3VyaXR5X21vZHVsZV9pbXBsXykpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsYXNzaWNfZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl8sIEdldFNlcnZpY2UoOjp0ZXN0aW5nOjpfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseSg6OnRlc3Rpbmc6OlJldHVybigmc2VydmljZSkpOwotCi0gIGxpbmtfLT5TZW5kQ29ubmVjdGlvblJlcXVlc3Qoa1BzbSwga0NpZCwgc3RkOjptb3ZlKHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24pKTsKLSAgbGlua18tPk9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlOjpVTktOT1dOX0hDSV9DT01NQU5EKTsKLSAgZnV0dXJlLndhaXQoKTsKLQotICBhdXRvIGRlcXVldWVfZnV0dXJlID0gZGVxdWV1ZV9wcm9taXNlXy5nZXRfZnV0dXJlKCk7Ci0gIGRlcXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRGVxdWV1ZUNhbGxiYWNrKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5jYyBiL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg3OTc1Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5oIgotCi0jaW5jbHVkZSA8Y2hyb25vPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2NoYW5uZWxfY29uZmlndXJhdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGluay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLXN0YXRpYyBjb25zdGV4cHIgYXV0byBrVGltZW91dCA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDMpOwotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8Q29udHJvbFZpZXc+IEdldENvbW1hbmRzRnJvbVBhY2tldFZpZXcoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXQpIHsKLSAgc2l6ZV90IGN1cnIgPSAwOwotICBzaXplX3QgZW5kID0gcGFja2V0LnNpemUoKTsKLSAgc3RkOjp2ZWN0b3I8Q29udHJvbFZpZXc+IHJlc3VsdDsKLSAgd2hpbGUgKGN1cnIgPCBlbmQpIHsKLSAgICBhdXRvIHN1Yl92aWV3ID0gcGFja2V0LkdldExpdHRsZUVuZGlhblN1YnZpZXcoY3VyciwgZW5kKTsKLSAgICBhdXRvIGNvbnRyb2wgPSBDb250cm9sVmlldzo6Q3JlYXRlKHN1Yl92aWV3KTsKLSAgICBpZiAoIWNvbnRyb2wuSXNWYWxpZCgpKSB7Ci0gICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIHJlc3VsdC5wdXNoX2JhY2soY29udHJvbCk7Ci0gICAgY3VyciArPSAxICsgMSArIDIgKyBjb250cm9sLkdldFBheWxvYWQoKS5zaXplKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmsqIGxpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcDo6aW50ZXJuYWw6OkRhdGFQaXBlbGluZU1hbmFnZXIqIGRhdGFfcGlwZWxpbmVfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBkeW5hbWljX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxBbGxvY2F0b3IqIGNoYW5uZWxfYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBmaXhlZF9zZXJ2aWNlX21hbmFnZXIpCi0gICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgbGlua18obGluayksIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8oZGF0YV9waXBlbGluZV9tYW5hZ2VyKSwKLSAgICAgIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXyhkeW5hbWljX3NlcnZpY2VfbWFuYWdlciksIGNoYW5uZWxfYWxsb2NhdG9yXyhjaGFubmVsX2FsbG9jYXRvciksCi0gICAgICBmaXhlZF9zZXJ2aWNlX21hbmFnZXJfKGZpeGVkX3NlcnZpY2VfbWFuYWdlciksIGFsYXJtXyhoYW5kbGVyKSB7Ci0gIEFTU0VSVChoYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgQVNTRVJUKGxpbmtfICE9IG51bGxwdHIpOwotICBzaWduYWxsaW5nX2NoYW5uZWxfID0gbGlua18tPkFsbG9jYXRlRml4ZWRDaGFubmVsKGtDbGFzc2ljU2lnbmFsbGluZ0NpZCk7Ci0gIHNpZ25hbGxpbmdfY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpvbl9pbmNvbWluZ19wYWNrZXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBlbnF1ZXVlX2J1ZmZlcl8gPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxvczo6RW5xdWV1ZUJ1ZmZlcjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4oc2lnbmFsbGluZ19jaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpKTsKLX0KLQotQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjp+Q2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyKCkgewotICBhbGFybV8uQ2FuY2VsKCk7Ci0gIHNpZ25hbGxpbmdfY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgc2lnbmFsbGluZ19jaGFubmVsXyA9IG51bGxwdHI7Ci0gIGVucXVldWVfYnVmZmVyXy0+Q2xlYXIoKTsKLSAgZW5xdWV1ZV9idWZmZXJfLnJlc2V0KCk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpPbkNvbW1hbmRSZWplY3QoQ29tbWFuZFJlamVjdFZpZXcgY29tbWFuZF9yZWplY3RfdmlldykgewotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gIT0gY29tbWFuZF9yZWplY3Rfdmlldy5HZXRJZGVudGlmaWVyKCkpIHsKLSAgICBMT0dfV0FSTigiVW5leHBlY3RlZCBjb21tYW5kIHJlamVjdDogbm8gcGVuZGluZyByZXF1ZXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXyA9PSBDb21tYW5kQ29kZTo6SU5GT1JNQVRJT05fUkVRVUVTVCAmJgotICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLmluZm9fdHlwZV8gPT0gSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGU6OkVYVEVOREVEX0ZFQVRVUkVTX1NVUFBPUlRFRCkgewotICAgIGxpbmtfLT5PblJlbW90ZUV4dGVuZGVkRmVhdHVyZVJlY2VpdmVkKGZhbHNlLCBmYWxzZSk7Ci0gIH0KLSAgYWxhcm1fLkNhbmNlbCgpOwotICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLQotICBMT0dfSU5GTygiQ29tbWFuZCByZWplY3RlZCIpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6U2VuZENvbm5lY3Rpb25SZXF1ZXN0KFBzbSBwc20sIENpZCBsb2NhbF9jaWQpIHsKLSAgZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKCktPkVuZm9yY2UoCi0gICAgICBsaW5rXy0+R2V0RGV2aWNlKCksCi0gICAgICBkeW5hbWljX3NlcnZpY2VfbWFuYWdlcl8tPkdldFNlcnZpY2UocHNtKS0+R2V0U2VjdXJpdHlQb2xpY3koKSwKLSAgICAgIGhhbmRsZXJfLT5CaW5kT25jZU9uKAotICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgJkNsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6b25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9vdXRnb2luZywKLSAgICAgICAgICBTZWN1cml0eUVuZm9yY2VtZW50VHlwZTo6TElOS19LRVksCi0gICAgICAgICAgcHNtLAotICAgICAgICAgIGxvY2FsX2NpZCkpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6b25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9vdXRnb2luZygKLSAgICBTZWN1cml0eUVuZm9yY2VtZW50VHlwZSB0eXBlLCBQc20gcHNtLCBDaWQgbG9jYWxfY2lkLCBib29sIHJlc3VsdCkgewotICBpZiAoZW5xdWV1ZV9idWZmZXJfLmdldCgpID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIkdvdCBzZWN1cml0eSByZXN1bHQgY2FsbGJhY2sgYWZ0ZXIgZGVsZXRpb24iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBMT0dfV0FSTigiU2VjdXJpdHkgcmVxdWlyZW1lbnQgY2FuJ3QgYmUgc2F0aXNmaWVkLiBEcm9wcGluZyBjb25uZWN0aW9uIHJlcXVlc3QiKTsKLSAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgY29ubmVjdGlvbl9yZXN1bHR7Ci0gICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9TRUNVUklUWV9CTE9DSywKLSAgICAgICAgLmhjaV9lcnJvciA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAubDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQgPSBDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6Ok5PX1JFU09VUkNFU19BVkFJTEFCTEUsCi0gICAgfTsKLSAgICBsaW5rXy0+T25PdXRnb2luZ0Nvbm5lY3Rpb25SZXF1ZXN0RmFpbChsb2NhbF9jaWQsIGNvbm5lY3Rpb25fcmVzdWx0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHR5cGUgPT0gU2VjdXJpdHlFbmZvcmNlbWVudFR5cGU6OkxJTktfS0VZICYmICFsaW5rXy0+SXNBdXRoZW50aWNhdGVkKCkgJiYKLSAgICAgIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VydmljZShwc20pLT5HZXRTZWN1cml0eVBvbGljeSgpICE9Ci0gICAgICAgICAgU2VjdXJpdHlQb2xpY3k6Ol9TRFBfT05MWV9OT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0spIHsKLSAgICBsaW5rXy0+RW5jcnlwdCgpOwotICAgIC8vIFRPRE8oYi8xNzEyNTM3MjEpOiBJZiB3ZSBjYW4gcmVjZWl2ZSBFTkNSWVBUSU9OX0NIQU5HRSBldmVudCwgd2UgY2FuIHNlbmQgY29tbWFuZCBhZnRlciBjYWxsYmFjayBpcyByZWNlaXZlZC4KLSAgfQotCi0gIFBlbmRpbmdDb21tYW5kIHBlbmRpbmdfY29tbWFuZCA9IHtuZXh0X3NpZ25hbF9pZF8sIENvbW1hbmRDb2RlOjpDT05ORUNUSU9OX1JFUVVFU1QsIHBzbSwgbG9jYWxfY2lkLCB7fSwge30sIHt9fTsKLSAgbmV4dF9zaWduYWxfaWRfKys7Ci0gIHBlbmRpbmdfY29tbWFuZHNfLnB1c2goc3RkOjptb3ZlKHBlbmRpbmdfY29tbWFuZCkpOwotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gPT0ga0ludmFsaWRTaWduYWxJZCkgewotICAgIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICB9Ci19Ci0KLXZvaWQgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpzZW5kX2NvbmZpZ3VyYXRpb25fcmVxdWVzdChDaWQgcmVtb3RlX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhdGlvbk9wdGlvbj4+IGNvbmZpZykgewotICBQZW5kaW5nQ29tbWFuZCBwZW5kaW5nX2NvbW1hbmQgPSB7bmV4dF9zaWduYWxfaWRfLCAgQ29tbWFuZENvZGU6OkNPTkZJR1VSQVRJT05fUkVRVUVTVCwge30sIHt9LCByZW1vdGVfY2lkLCB7fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjb25maWcpfTsKLSAgbmV4dF9zaWduYWxfaWRfKys7Ci0gIHBlbmRpbmdfY29tbWFuZHNfLnB1c2goc3RkOjptb3ZlKHBlbmRpbmdfY29tbWFuZCkpOwotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gPT0ga0ludmFsaWRTaWduYWxJZCkgewotICAgIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICB9Ci19Ci0KLXZvaWQgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpTZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoQ2lkIGxvY2FsX2NpZCwgQ2lkIHJlbW90ZV9jaWQpIHsKLSAgUGVuZGluZ0NvbW1hbmQgcGVuZGluZ19jb21tYW5kID0gewotICAgICAgbmV4dF9zaWduYWxfaWRfLCBDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNULCB7fSwgbG9jYWxfY2lkLCByZW1vdGVfY2lkLCB7fSwge319OwotICBuZXh0X3NpZ25hbF9pZF8rKzsKLSAgcGVuZGluZ19jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUocGVuZGluZ19jb21tYW5kKSk7Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyA9PSBrSW52YWxpZFNpZ25hbElkKSB7Ci0gICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gIH0KLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6OlNlbmRJbmZvcm1hdGlvblJlcXVlc3QoSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUgdHlwZSkgewotICBQZW5kaW5nQ29tbWFuZCBwZW5kaW5nX2NvbW1hbmQgPSB7bmV4dF9zaWduYWxfaWRfLCBDb21tYW5kQ29kZTo6SU5GT1JNQVRJT05fUkVRVUVTVCwge30sIHt9LCB7fSwgdHlwZSwge319OwotICBuZXh0X3NpZ25hbF9pZF8rKzsKLSAgcGVuZGluZ19jb21tYW5kc18ucHVzaChzdGQ6Om1vdmUocGVuZGluZ19jb21tYW5kKSk7Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyA9PSBrSW52YWxpZFNpZ25hbElkKSB7Ci0gICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gIH0KLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6OlNlbmRFY2hvUmVxdWVzdChzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBwYXlsb2FkKSB7Ci0gIExPR19XQVJOKCJOb3Qgc3VwcG9ydGVkIik7Ci19Ci0KLXZvaWQgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpDYW5jZWxBbGFybSgpIHsKLSAgYWxhcm1fLkNhbmNlbCgpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6T25Db25uZWN0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIFBzbSBwc20sIENpZCByZW1vdGVfY2lkKSB7Ci0gIGlmICghSXNQc21WYWxpZChwc20pKSB7Ci0gICAgTE9HX1dBUk4oIkludmFsaWQgcHNtIHJlY2VpdmVkIGZyb20gcmVtb3RlIHBzbTolZCByZW1vdGVfY2lkOiVkIiwgcHNtLCByZW1vdGVfY2lkKTsKLSAgICBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2Uoc2lnbmFsX2lkLCByZW1vdGVfY2lkLCBrSW52YWxpZENpZCwgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpQU01fTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzOjpOT19GVVJUSEVSX0lORk9STUFUSU9OX0FWQUlMQUJMRSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJlbW90ZV9jaWQgPT0ga0ludmFsaWRDaWQpIHsKLSAgICBMT0dfV0FSTigiSW52YWxpZCByZW1vdGUgY2lkIHJlY2VpdmVkIGZyb20gcmVtb3RlIHBzbTolZCByZW1vdGVfY2lkOiVkIiwgcHNtLCByZW1vdGVfY2lkKTsKLSAgICBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2Uoc2lnbmFsX2lkLCByZW1vdGVfY2lkLCBrSW52YWxpZENpZCwgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpJTlZBTElEX0NJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzOjpOT19GVVJUSEVSX0lORk9STUFUSU9OX0FWQUlMQUJMRSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIFRPRE8oemFjaG92ZXJmbG93KTogYWRkIGJhY2sgaW4gd2l0aCBwb2xpY3kKLSAgaWYgKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNQc21Vc2VkKHBzbSkpIHsKLSAgICBMT0dfV0FSTigiUHNtIGFscmVhZHkgZXhpc3RzIik7Ci0gICAgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHNpZ25hbF9pZCwgcmVtb3RlX2NpZCwga0ludmFsaWRDaWQsIENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdDo6UFNNX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SZXNwb25zZVN0YXR1czo6Tk9fRlVSVEhFUl9JTkZPUk1BVElPTl9BVkFJTEFCTEUpOwotICAgIHJldHVybjsKLSAgfQotICAqLwotCi0gIGlmICghZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKHBzbSkpIHsKLSAgICBMT0dfSU5GTygiU2VydmljZSBmb3IgdGhpcyBwc20gKCVkKSBpcyBub3QgcmVnaXN0ZXJlZCIsIHBzbSk7Ci0gICAgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHNpZ25hbF9pZCwgcmVtb3RlX2NpZCwga0ludmFsaWRDaWQsIENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdDo6UFNNX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SZXNwb25zZVN0YXR1czo6Tk9fRlVSVEhFUl9JTkZPUk1BVElPTl9BVkFJTEFCTEUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgpLT5FbmZvcmNlKAotICAgICAgbGlua18tPkdldERldmljZSgpLAotICAgICAgZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZXJ2aWNlKHBzbSktPkdldFNlY3VyaXR5UG9saWN5KCksCi0gICAgICBoYW5kbGVyXy0+QmluZE9uY2VPbigKLSAgICAgICAgICB0aGlzLCAmQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpvbl9zZWN1cml0eV9yZXN1bHRfZm9yX2luY29taW5nLCBwc20sIHJlbW90ZV9jaWQsIHNpZ25hbF9pZCkpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6b25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9pbmNvbWluZygKLSAgICBQc20gcHNtLCBDaWQgcmVtb3RlX2NpZCwgU2lnbmFsSWQgc2lnbmFsX2lkLCBib29sIHJlc3VsdCkgewotICBpZiAoZW5xdWV1ZV9idWZmZXJfLmdldCgpID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIkdvdCBzZWN1cml0eSByZXN1bHQgY2FsbGJhY2sgYWZ0ZXIgZGVsZXRpb24iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2UoCi0gICAgICAgIHNpZ25hbF9pZCwKLSAgICAgICAgcmVtb3RlX2NpZCwKLSAgICAgICAgMCwKLSAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpTRUNVUklUWV9CTE9DSywKLSAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzOjpOT19GVVJUSEVSX0lORk9STUFUSU9OX0FWQUlMQUJMRSk7Ci0gICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IGNvbm5lY3Rpb25fcmVzdWx0ewotICAgICAgICAuY29ubmVjdGlvbl9yZXN1bHRfY29kZSA9IER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdENvZGU6OkZBSUxfU0VDVVJJVFlfQkxPQ0ssCi0gICAgICAgIC5oY2lfZXJyb3IgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgICAgLmwyY2FwX2Nvbm5lY3Rpb25fcmVzcG9uc2VfcmVzdWx0ID0gQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpOT19SRVNPVVJDRVNfQVZBSUxBQkxFLAotICAgIH07Ci0gICAgbGlua18tPk9uT3V0Z29pbmdDb25uZWN0aW9uUmVxdWVzdEZhaWwoMCwgY29ubmVjdGlvbl9yZXN1bHQpOwotICB9Ci0KLSAgYXV0byBuZXdfY2hhbm5lbCA9IGxpbmtfLT5BbGxvY2F0ZUR5bmFtaWNDaGFubmVsKHBzbSwgcmVtb3RlX2NpZCk7Ci0gIGlmIChuZXdfY2hhbm5lbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIkNhbid0IGFsbG9jYXRlIGR5bmFtaWMgY2hhbm5lbCIpOwotICAgIHJldHVybjsKLSAgfQotICBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2UoCi0gICAgICBzaWduYWxfaWQsCi0gICAgICByZW1vdGVfY2lkLAotICAgICAgbmV3X2NoYW5uZWwtPkdldENpZCgpLAotICAgICAgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpTVUNDRVNTLAotICAgICAgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzOjpOT19GVVJUSEVSX0lORk9STUFUSU9OX0FWQUlMQUJMRSk7Ci0KLSAgbGlua18tPlNlbmRJbml0aWFsQ29uZmlnUmVxdWVzdE9yUXVldWUobmV3X2NoYW5uZWwtPkdldENpZCgpKTsKLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Ok9uQ29ubmVjdGlvblJlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIHJlbW90ZV9jaWQsIENpZCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0IHJlc3VsdCwgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzIHN0YXR1cykgewotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gIT0gc2lnbmFsX2lkIHx8Ci0gICAgICBjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXyAhPSBDb21tYW5kQ29kZTo6Q09OTkVDVElPTl9SRVFVRVNUKSB7Ci0gICAgTE9HX1dBUk4oIlVuZXhwZWN0ZWQgcmVzcG9uc2U6IG5vIHBlbmRpbmcgcmVxdWVzdC4gRXhwZWN0ZWQgc2lnbmFsIGlkICVkIHR5cGUgJXMsIGdvdCAlZCIsCi0gICAgICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8uVmFsdWUoKSwgQ29tbWFuZENvZGVUZXh0KGNvbW1hbmRfanVzdF9zZW50Xy5jb21tYW5kX2NvZGVfKS5kYXRhKCksCi0gICAgICAgICAgICAgc2lnbmFsX2lkLlZhbHVlKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNvdXJjZV9jaWRfICE9IGNpZCkgewotICAgIExPR19XQVJOKCJTQ0lEIGRvZXNuJ3QgbWF0Y2g6IGV4cGVjdGVkICVkLCByZWNlaXZlZCAlZCIsIGNvbW1hbmRfanVzdF9zZW50Xy5zb3VyY2VfY2lkXywgY2lkKTsKLSAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHJlc3VsdCA9PSBDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6OlBFTkRJTkcpIHsKLSAgICBhbGFybV8uU2NoZWR1bGUoY29tbW9uOjpCaW5kT25jZSgmQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpvbl9jb21tYW5kX3RpbWVvdXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgIGtUaW1lb3V0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyA9IGtJbnZhbGlkU2lnbmFsSWQ7Ci0gIGFsYXJtXy5DYW5jZWwoKTsKLSAgaWYgKHJlc3VsdCAhPSBDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgY29ubmVjdGlvbl9yZXN1bHR7Ci0gICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9MMkNBUF9FUlJPUiwKLSAgICAgICAgLmhjaV9lcnJvciA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAubDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQgPSByZXN1bHQsCi0gICAgfTsKLSAgICBsaW5rXy0+T25PdXRnb2luZ0Nvbm5lY3Rpb25SZXF1ZXN0RmFpbChjaWQsIGNvbm5lY3Rpb25fcmVzdWx0KTsKLSAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgUHNtIHBlbmRpbmdfcHNtID0gY29tbWFuZF9qdXN0X3NlbnRfLnBzbV87Ci0gIGF1dG8gbmV3X2NoYW5uZWwgPSBsaW5rXy0+QWxsb2NhdGVSZXNlcnZlZER5bmFtaWNDaGFubmVsKGNpZCwgcGVuZGluZ19wc20sIHJlbW90ZV9jaWQpOwotICBpZiAobmV3X2NoYW5uZWwgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJDYW4ndCBhbGxvY2F0ZSBkeW5hbWljIGNoYW5uZWwiKTsKLSAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgY29ubmVjdGlvbl9yZXN1bHR7Ci0gICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9MMkNBUF9FUlJPUiwKLSAgICAgICAgLmhjaV9lcnJvciA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAubDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQgPSBDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6Ok5PX1JFU09VUkNFU19BVkFJTEFCTEUsCi0gICAgfTsKLSAgICBsaW5rXy0+T25PdXRnb2luZ0Nvbm5lY3Rpb25SZXF1ZXN0RmFpbChjaWQsIGNvbm5lY3Rpb25fcmVzdWx0KTsKLSAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsaW5rXy0+U2VuZEluaXRpYWxDb25maWdSZXF1ZXN0T3JRdWV1ZShjaWQpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6T25Db25maWd1cmF0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIENpZCBjaWQsIENvbnRpbnVhdGlvbiBpc19jb250aW51YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhdGlvbk9wdGlvbj4+IG9wdGlvbnMpIHsKLSAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbEJ5Q2lkKGNpZCk7Ci0gIGlmIChjaGFubmVsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiQ29uZmlndXJhdGlvbiByZXF1ZXN0IGZvciBhbiB1bmtub3duIGNoYW5uZWwiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvJiBjb25maWd1cmF0aW9uX3N0YXRlID0gY2hhbm5lbF9jb25maWd1cmF0aW9uX1tjaWRdOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhdGlvbk9wdGlvbj4+IHJzcF9vcHRpb25zOwotICBDb25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQgcmVzdWx0ID0gQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0OjpTVUNDRVNTOwotICBhdXRvIHJlbW90ZV9yZmNfbW9kZSA9IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uOjpMMkNBUF9CQVNJQzsKLQotICBhdXRvIGluaXRpYWxfY29uZmlnX29wdGlvbiA9IGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VydmljZShjaGFubmVsLT5HZXRQc20oKSktPkdldENvbmZpZ09wdGlvbigpOwotCi0gIGZvciAoYXV0byYgb3B0aW9uIDogb3B0aW9ucykgewotICAgIHN3aXRjaCAob3B0aW9uLT50eXBlXykgewotICAgICAgY2FzZSBDb25maWd1cmF0aW9uT3B0aW9uVHlwZTo6TVRVOiB7Ci0gICAgICAgIGF1dG8qIGNvbmZpZyA9IE10dUNvbmZpZ3VyYXRpb25PcHRpb246OlNwZWNpYWxpemUob3B0aW9uLmdldCgpKTsKLSAgICAgICAgaWYgKGNvbmZpZy0+bXR1XyA8IGluaXRpYWxfY29uZmlnX29wdGlvbi5taW5pbWFsX3JlbW90ZV9tdHUpIHsKLSAgICAgICAgICBMT0dfV0FSTigiQ29uZmlndXJhdGlvbiByZXF1ZXN0IHdpdGggdW5hY2NlcHRhYmxlIE1UVSIpOwotICAgICAgICAgIGNvbmZpZy0+bXR1XyA9IGluaXRpYWxfY29uZmlnX29wdGlvbi5taW5pbWFsX3JlbW90ZV9tdHU7Ci0gICAgICAgICAgcmVzdWx0ID0gQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0OjpVTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUzsKLSAgICAgICAgfQotICAgICAgICByc3Bfb3B0aW9ucy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxNdHVDb25maWd1cmF0aW9uT3B0aW9uPigqY29uZmlnKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDb25maWd1cmF0aW9uT3B0aW9uVHlwZTo6RkxVU0hfVElNRU9VVDogewotICAgICAgICBhdXRvKiBjb25maWcgPSBGbHVzaFRpbWVvdXRDb25maWd1cmF0aW9uT3B0aW9uOjpTcGVjaWFsaXplKG9wdGlvbi5nZXQoKSk7Ci0gICAgICAgIHJzcF9vcHRpb25zLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEZsdXNoVGltZW91dENvbmZpZ3VyYXRpb25PcHRpb24+KCpjb25maWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvbmZpZ3VyYXRpb25PcHRpb25UeXBlOjpSRVRSQU5TTUlTU0lPTl9BTkRfRkxPV19DT05UUk9MOiB7Ci0gICAgICAgIGF1dG8qIGNvbmZpZyA9IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uOjpTcGVjaWFsaXplKG9wdGlvbi5nZXQoKSk7Ci0gICAgICAgIHJlbW90ZV9yZmNfbW9kZSA9IGNvbmZpZy0+bW9kZV87Ci0gICAgICAgIGlmIChjb25maWctPm1vZGVfID09IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uOjpFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTikgewotICAgICAgICAgIGlmIChjb25maWctPnJldHJhbnNtaXNzaW9uX3RpbWVfb3V0XyA9PSAwKSB7Ci0gICAgICAgICAgICBjb25maWctPnJldHJhbnNtaXNzaW9uX3RpbWVfb3V0XyA9IDIwMDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjb25maWctPm1vbml0b3JfdGltZV9vdXRfID09IDApIHsKLSAgICAgICAgICAgIGNvbmZpZy0+bW9uaXRvcl90aW1lX291dF8gPSAxMjAwMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlndXJhdGlvbl9zdGF0ZS5yZW1vdGVfcmV0cmFuc21pc3Npb25fYW5kX2Zsb3dfY29udHJvbF8gPSAqY29uZmlnOwotICAgICAgICBjb25maWd1cmF0aW9uX3N0YXRlLnJldHJhbnNtaXNzaW9uX2FuZF9mbG93X2NvbnRyb2xfbW9kZV8gPSBjb25maWctPm1vZGVfOwotICAgICAgICByc3Bfb3B0aW9ucy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sQ29uZmlndXJhdGlvbk9wdGlvbj4oKmNvbmZpZykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ29uZmlndXJhdGlvbk9wdGlvblR5cGU6OkZSQU1FX0NIRUNLX1NFUVVFTkNFOiB7Ci0gICAgICAgIC8vIFdlIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSBGQ1Mgb3Igbm90IHdoZW4gd2Ugc2VuZCBjb25maWcgcmVxdWVzdAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChvcHRpb24tPmlzX2hpbnRfICE9IENvbmZpZ3VyYXRpb25PcHRpb25Jc0hpbnQ6Ok9QVElPTl9JU19BX0hJTlQpIHsKLSAgICAgICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgc29tZSB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uIG9wdGlvbjogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG9wdGlvbi0+dHlwZV8pKTsKLSAgICAgICAgICBhdXRvIHJlc3BvbnNlID0KLSAgICAgICAgICAgICAgQ29uZmlndXJhdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKHNpZ25hbF9pZC5WYWx1ZSgpLCBjaGFubmVsLT5HZXRSZW1vdGVDaWQoKSwgaXNfY29udGludWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0OjpVTktOT1dOX09QVElPTlMsIHt9KTsKLSAgICAgICAgICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKHJlc3BvbnNlKSwgaGFuZGxlcl8pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVtb3RlX3JmY19tb2RlID09IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uOjpMMkNBUF9CQVNJQyAmJgotICAgICAgaW5pdGlhbF9jb25maWdfb3B0aW9uLmNoYW5uZWxfbW9kZSA9PQotICAgICAgICAgIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6UmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU6OkVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OKSB7Ci0gICAgTE9HX1dBUk4oIkVSVE0gbWFuZGF0b3J5IG5vdCBhbGxvdyBtb2RlIGNvbmZpZ3VyYXRpb24sIGRpc2Nvbm5lY3QgY2hhbm5lbC4iKTsKLSAgICBTZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoY2hhbm5lbC0+R2V0Q2lkKCksIGNoYW5uZWwtPkdldFJlbW90ZUNpZCgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY29uZmlndXJhdGlvbl9zdGF0ZS5zdGF0ZV8gPT0gQ2hhbm5lbENvbmZpZ3VyYXRpb25TdGF0ZTo6U3RhdGU6OldBSVRfQ09ORklHX1JFUSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbD4gdXNlcl9jaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxEeW5hbWljQ2hhbm5lbD4oY2hhbm5lbCwgaGFuZGxlcl8pOwotICAgIGlmIChjaGFubmVsLT5sb2NhbF9pbml0aWF0ZWRfKSB7Ci0gICAgICBsaW5rXy0+Tm90aWZ5Q2hhbm5lbENyZWF0aW9uKGNpZCwgc3RkOjptb3ZlKHVzZXJfY2hhbm5lbCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkeW5hbWljX3NlcnZpY2VfbWFuYWdlcl8tPkdldFNlcnZpY2UoY2hhbm5lbC0+R2V0UHNtKCkpLT5Ob3RpZnlDaGFubmVsQ3JlYXRpb24oc3RkOjptb3ZlKHVzZXJfY2hhbm5lbCkpOwotICAgIH0KLSAgICBjb25maWd1cmF0aW9uX3N0YXRlLnN0YXRlXyA9IENoYW5uZWxDb25maWd1cmF0aW9uU3RhdGU6OlN0YXRlOjpDT05GSUdVUkVEOwotICAgIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8tPkF0dGFjaENoYW5uZWwoY2lkLCBjaGFubmVsLCBsMmNhcDo6aW50ZXJuYWw6OkRhdGFQaXBlbGluZU1hbmFnZXI6OkNoYW5uZWxNb2RlOjpCQVNJQyk7Ci0gICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy0+VXBkYXRlQ2xhc3NpY0NvbmZpZ3VyYXRpb24oY2lkLCBjb25maWd1cmF0aW9uX3N0YXRlKTsKLSAgfSBlbHNlIGlmIChjb25maWd1cmF0aW9uX3N0YXRlLnN0YXRlXyA9PSBDaGFubmVsQ29uZmlndXJhdGlvblN0YXRlOjpTdGF0ZTo6V0FJVF9DT05GSUdfUkVRX1JTUCkgewotICAgIGNvbmZpZ3VyYXRpb25fc3RhdGUuc3RhdGVfID0gQ2hhbm5lbENvbmZpZ3VyYXRpb25TdGF0ZTo6U3RhdGU6OldBSVRfQ09ORklHX1JTUDsKLSAgfQotCi0gIGF1dG8gcmVzcG9uc2UgPSBDb25maWd1cmF0aW9uUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoc2lnbmFsX2lkLlZhbHVlKCksIGNoYW5uZWwtPkdldFJlbW90ZUNpZCgpLCBpc19jb250aW51YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBzdGQ6Om1vdmUocnNwX29wdGlvbnMpKTsKLSAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShyZXNwb25zZSksIGhhbmRsZXJfKTsKLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6OlNlbmRJbml0aWFsQ29uZmlnUmVxdWVzdChDaWQgbG9jYWxfY2lkKSB7Ci0gIGF1dG8gY2hhbm5lbCA9IGNoYW5uZWxfYWxsb2NhdG9yXy0+RmluZENoYW5uZWxCeUNpZChsb2NhbF9jaWQpOwotICBhdXRvIHBzbSA9IGNoYW5uZWwtPkdldFBzbSgpOwotICBhdXRvJiBjb25maWd1cmF0aW9uX3N0YXRlID0gY2hhbm5lbF9jb25maWd1cmF0aW9uX1tsb2NhbF9jaWRdOwotICBhdXRvKiBzZXJ2aWNlID0gZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZXJ2aWNlKHBzbSk7Ci0gIGF1dG8gaW5pdGlhbF9jb25maWcgPSBzZXJ2aWNlLT5HZXRDb25maWdPcHRpb24oKTsKLQotICBhdXRvIG10dV9jb25maWd1cmF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxNdHVDb25maWd1cmF0aW9uT3B0aW9uPigpOwotICBtdHVfY29uZmlndXJhdGlvbi0+bXR1XyA9IGluaXRpYWxfY29uZmlnLmluY29taW5nX210dTsKLQotICBhdXRvIGZjc19vcHRpb24gPSBzdGQ6Om1ha2VfdW5pcXVlPEZyYW1lQ2hlY2tTZXF1ZW5jZU9wdGlvbj4oKTsKLSAgZmNzX29wdGlvbi0+ZmNzX3R5cGVfID0gRmNzVHlwZTo6Tk9fRkNTOwotICBjb25maWd1cmF0aW9uX3N0YXRlLmZjc190eXBlXyA9IEZjc1R5cGU6Ok5PX0ZDUzsKLSAgaWYgKGxpbmtfLT5HZXRSZW1vdGVTdXBwb3J0c0ZjcygpKSB7Ci0gICAgZmNzX29wdGlvbi0+ZmNzX3R5cGVfID0gRmNzVHlwZTo6REVGQVVMVDsKLSAgICBjb25maWd1cmF0aW9uX3N0YXRlLmZjc190eXBlXyA9IEZjc1R5cGU6OkRFRkFVTFQ7Ci0gIH0KLQotICBhdXRvIHJldHJhbnNtaXNzaW9uX2Zsb3dfY29udHJvbF9jb25maWd1cmF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sQ29uZmlndXJhdGlvbk9wdGlvbj4oKTsKLSAgc3dpdGNoIChpbml0aWFsX2NvbmZpZy5jaGFubmVsX21vZGUpIHsKLSAgICBjYXNlIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6UmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU6OkwyQ0FQX0JBU0lDOgotICAgICAgcmV0cmFuc21pc3Npb25fZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24tPm1vZGVfID0gUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGVPcHRpb246OkwyQ0FQX0JBU0lDOwotICAgICAgY29uZmlndXJhdGlvbl9zdGF0ZS5yZXRyYW5zbWlzc2lvbl9hbmRfZmxvd19jb250cm9sX21vZGVfID0gUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGVPcHRpb246OkwyQ0FQX0JBU0lDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb246OlJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlOjpFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTjoKLSAgICBjYXNlIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6UmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU6OkVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OX09QVElPTkFMOgotICAgICAgcmV0cmFuc21pc3Npb25fZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24tPm1vZGVfID0KLSAgICAgICAgICBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZU9wdGlvbjo6RU5IQU5DRURfUkVUUkFOU01JU1NJT047Ci0gICAgICBjb25maWd1cmF0aW9uX3N0YXRlLnJldHJhbnNtaXNzaW9uX2FuZF9mbG93X2NvbnRyb2xfbW9kZV8gPQotICAgICAgICAgIFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uOjpFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTjsKLSAgICAgIC8vIFRPRE86IERlY2lkZSB3aGVyZSB0byBwdXQgaW5pdGlhbCB2YWx1ZXMKLSAgICAgIHJldHJhbnNtaXNzaW9uX2Zsb3dfY29udHJvbF9jb25maWd1cmF0aW9uLT50eF93aW5kb3dfc2l6ZV8gPSAxMDsKLSAgICAgIHJldHJhbnNtaXNzaW9uX2Zsb3dfY29udHJvbF9jb25maWd1cmF0aW9uLT5tYXhfdHJhbnNtaXRfID0gMjA7Ci0gICAgICByZXRyYW5zbWlzc2lvbl9mbG93X2NvbnRyb2xfY29uZmlndXJhdGlvbi0+cmV0cmFuc21pc3Npb25fdGltZV9vdXRfID0gMjAwMDsKLSAgICAgIHJldHJhbnNtaXNzaW9uX2Zsb3dfY29udHJvbF9jb25maWd1cmF0aW9uLT5tb25pdG9yX3RpbWVfb3V0XyA9IDEyMDAwOwotICAgICAgcmV0cmFuc21pc3Npb25fZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24tPm1heGltdW1fcGR1X3NpemVfID0gMTAxMDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGNvbmZpZ3VyYXRpb25fc3RhdGUubG9jYWxfcmV0cmFuc21pc3Npb25fYW5kX2Zsb3dfY29udHJvbF8gPSAqcmV0cmFuc21pc3Npb25fZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb247Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYXRpb25PcHRpb24+PiBjb25maWc7Ci0gIGNvbmZpZy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG10dV9jb25maWd1cmF0aW9uKSk7Ci0gIGlmIChpbml0aWFsX2NvbmZpZy5jaGFubmVsX21vZGUgIT0gRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uOjpSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZTo6TDJDQVBfQkFTSUMpIHsKLSAgICBjb25maWcuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyZXRyYW5zbWlzc2lvbl9mbG93X2NvbnRyb2xfY29uZmlndXJhdGlvbikpOwotICAgIGNvbmZpZy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGZjc19vcHRpb24pKTsKLSAgfQotICBzZW5kX2NvbmZpZ3VyYXRpb25fcmVxdWVzdChjaGFubmVsLT5HZXRSZW1vdGVDaWQoKSwgc3RkOjptb3ZlKGNvbmZpZykpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6bmVnb3RpYXRlX2NvbmZpZ3VyYXRpb24oQ2lkIGNpZCwgQ29udGludWF0aW9uIGlzX2NvbnRpbnVhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhdGlvbk9wdGlvbj4+IG9wdGlvbnMpIHsKLSAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbEJ5Q2lkKGNpZCk7Ci0gIGF1dG8mIGNvbmZpZ3VyYXRpb25fc3RhdGUgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb25fW2NoYW5uZWwtPkdldENpZCgpXTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYXRpb25PcHRpb24+PiBuZWdvdGlhdGlvbl9jb25maWc7Ci0gIGJvb2wgY2FuX25lZ290aWF0ZSA9IGZhbHNlOwotICBmb3IgKGF1dG8mIG9wdGlvbiA6IG9wdGlvbnMpIHsKLSAgICBzd2l0Y2ggKG9wdGlvbi0+dHlwZV8pIHsKLSAgICAgIGNhc2UgQ29uZmlndXJhdGlvbk9wdGlvblR5cGU6Ok1UVTogewotICAgICAgICAvLyBNVFUgaXMgbm9uLW5lZ290aWFibGUgb3B0aW9uLiBVc2UgZGVmYXVsdCBtdHUgc2l6ZQotICAgICAgICBhdXRvIG10dV9jb25maWd1cmF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxNdHVDb25maWd1cmF0aW9uT3B0aW9uPigpOwotICAgICAgICBtdHVfY29uZmlndXJhdGlvbi0+bXR1XyA9IGtEZWZhdWx0Q2xhc3NpY010dTsKLSAgICAgICAgbmVnb3RpYXRpb25fY29uZmlnLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUobXR1X2NvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgY2FuX25lZ290aWF0ZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDb25maWd1cmF0aW9uT3B0aW9uVHlwZTo6RlJBTUVfQ0hFQ0tfU0VRVUVOQ0U6Ci0gICAgICBjYXNlIENvbmZpZ3VyYXRpb25PcHRpb25UeXBlOjpGTFVTSF9USU1FT1VUOiB7Ci0gICAgICAgIC8vIFRPRE86IEhhbmRsZSB0aGVzZSB0d28gY29uZmlndXJhdGlvbiBvcHRpb25zIG5lZ290aWF0aW9uLgotICAgICAgICBjYW5fbmVnb3RpYXRlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvbmZpZ3VyYXRpb25PcHRpb25UeXBlOjpSRVRSQU5TTUlTU0lPTl9BTkRfRkxPV19DT05UUk9MOiB7Ci0gICAgICAgIGF1dG8qIGNvbmZpZyA9IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uOjpTcGVjaWFsaXplKG9wdGlvbi5nZXQoKSk7Ci0gICAgICAgIGlmIChjb25maWctPm1vZGVfID09IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uOjpFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTikgewotICAgICAgICAgIGNvbmZpZ3VyYXRpb25fc3RhdGUucmV0cmFuc21pc3Npb25fYW5kX2Zsb3dfY29udHJvbF9tb2RlXyA9IGNvbmZpZy0+bW9kZV87Ci0gICAgICAgICAgY29uZmlndXJhdGlvbl9zdGF0ZS5sb2NhbF9yZXRyYW5zbWlzc2lvbl9hbmRfZmxvd19jb250cm9sXyA9ICpjb25maWc7Ci0gICAgICAgICAgbmVnb3RpYXRpb25fY29uZmlnLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uPigqY29uZmlnKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5tb2RlXyA9PSBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZU9wdGlvbjo6TDJDQVBfQkFTSUMpIHsKLSAgICAgICAgICBhdXRvIGluaXRpYWxfY29uZmlnX29wdGlvbiA9IGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VydmljZShjaGFubmVsLT5HZXRQc20oKSktPkdldENvbmZpZ09wdGlvbigpOwotICAgICAgICAgIGlmIChpbml0aWFsX2NvbmZpZ19vcHRpb24uY2hhbm5lbF9tb2RlID09Ci0gICAgICAgICAgICAgIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6UmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGU6OkVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OKSB7Ci0gICAgICAgICAgICAvLyBFUlRNIG1hbmRhdG9yeSBpcyBub3QgYWxsb3cgbmVnb3RpYXRpbmcgb2YgcmV0cmFuc21pc3Npb24gYW5kIGZsb3cgY29udHJvbCBtb2RlLCBkaXNjb25uZWN0IGNoYW5uZWwKLSAgICAgICAgICAgIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChjaGFubmVsLT5HZXRDaWQoKSwgY2hhbm5lbC0+R2V0UmVtb3RlQ2lkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbF9jb25maWdfb3B0aW9uLmNoYW5uZWxfbW9kZSA9PQotICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uOjpSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZTo6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRU5IQU5DRURfUkVUUkFOU01JU1NJT05fT1BUSU9OQUwpIHsKLSAgICAgICAgICAgIGNhbl9uZWdvdGlhdGUgPSB0cnVlOwotICAgICAgICAgICAgbmVnb3RpYXRpb25fY29uZmlnLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uPigqY29uZmlnKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIE5vdCBzdXBwb3J0IG90aGVyIHJldHJhbnNtaXNzaW9uIGFuZCBmbG93IGNvbnRyb2wgbW9kZSwgZGlzY29ubmVjdCBjaGFubmVsLgotICAgICAgICAgIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChjaGFubmVsLT5HZXRDaWQoKSwgY2hhbm5lbC0+R2V0UmVtb3RlQ2lkKCkpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBzb21lIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uOiAlZCIsIHN0YXRpY19jYXN0PGludD4ob3B0aW9uLT50eXBlXykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGlmIChjYW5fbmVnb3RpYXRlKSB7Ci0gICAgc2VuZF9jb25maWd1cmF0aW9uX3JlcXVlc3QoY2hhbm5lbC0+R2V0UmVtb3RlQ2lkKCksIHN0ZDo6bW92ZShuZWdvdGlhdGlvbl9jb25maWcpKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiTm8gc3VnZ2VzdGVkIHBhcmFtZXRlciByZWNlaXZlZCIpOwotICB9Ci19Ci0KLXZvaWQgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpPbkNvbmZpZ3VyYXRpb25SZXNwb25zZShTaWduYWxJZCBzaWduYWxfaWQsIENpZCBjaWQsIENvbnRpbnVhdGlvbiBpc19jb250aW51YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhdGlvbk9wdGlvbj4+IG9wdGlvbnMpIHsKLSAgaWYgKGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfICE9IHNpZ25hbF9pZCB8fAotICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8gIT0gQ29tbWFuZENvZGU6OkNPTkZJR1VSQVRJT05fUkVRVUVTVCkgewotICAgIExPR19XQVJOKCJVbmV4cGVjdGVkIHJlc3BvbnNlOiBubyBwZW5kaW5nIHJlcXVlc3QuIEV4cGVjdGVkIHNpZ25hbCBpZCAlZCB0eXBlICVzLCBnb3QgJWQiLAotICAgICAgICAgICAgIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfLlZhbHVlKCksIENvbW1hbmRDb2RlVGV4dChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXykuZGF0YSgpLAotICAgICAgICAgICAgIHNpZ25hbF9pZC5WYWx1ZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIGNoYW5uZWwgPSBjaGFubmVsX2FsbG9jYXRvcl8tPkZpbmRDaGFubmVsQnlDaWQoY2lkKTsKLSAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJDb25maWd1cmF0aW9uIHJlcXVlc3QgZm9yIGFuIHVua25vd24gY2hhbm5lbCIpOwotICAgIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIENvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdDo6UkVKRUNURUQ6Ci0gICAgY2FzZSBDb25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQ6OlVOS05PV05fT1BUSU9OUzoKLSAgICBjYXNlIENvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdDo6RkxPV19TUEVDX1JFSkVDVEVEOgotICAgICAgTE9HX1dBUk4oIkNvbmZpZ3VyYXRpb24gcmVzcG9uc2Ugbm90IFNVQ0NFU1M6ICVzIiwgQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0VGV4dChyZXN1bHQpLmNfc3RyKCkpOwotICAgICAgYWxhcm1fLkNhbmNlbCgpOwotICAgICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIENvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdDo6UEVORElORzoKLSAgICAgIGFsYXJtXy5TY2hlZHVsZShjb21tb246OkJpbmRPbmNlKCZDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICBrVGltZW91dCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIENvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdDo6VU5BQ0NFUFRBQkxFX1BBUkFNRVRFUlM6Ci0gICAgICBMT0dfSU5GTygiQ29uZmlndXJhdGlvbiByZXNwb25zZSB3aXRoIHVuYWNjZXB0YWJsZSBwYXJhbWV0ZXJzIik7Ci0gICAgICBhbGFybV8uQ2FuY2VsKCk7Ci0gICAgICBuZWdvdGlhdGVfY29uZmlndXJhdGlvbihjaWQsIGlzX2NvbnRpbnVhdGlvbiwgc3RkOjptb3ZlKG9wdGlvbnMpKTsKLSAgICAgIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBDb25maWd1cmF0aW9uUmVzcG9uc2VSZXN1bHQ6OlNVQ0NFU1M6Ci0gICAgICBicmVhazsKLSAgfQotICBhdXRvJiBjb25maWd1cmF0aW9uX3N0YXRlID0gY2hhbm5lbF9jb25maWd1cmF0aW9uX1tjaGFubmVsLT5HZXRDaWQoKV07Ci0KLSAgZm9yIChhdXRvJiBvcHRpb24gOiBvcHRpb25zKSB7Ci0gICAgc3dpdGNoIChvcHRpb24tPnR5cGVfKSB7Ci0gICAgICBjYXNlIENvbmZpZ3VyYXRpb25PcHRpb25UeXBlOjpNVFU6IHsKLSAgICAgICAgLy8gU2luY2UgdGhleSBhY2NlcHRlZCBvdXIgTVRVLCBubyBuZWVkIHRvIHJlYWQgdGhlIG5ldyB2YWx1ZS4KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENvbmZpZ3VyYXRpb25PcHRpb25UeXBlOjpGTFVTSF9USU1FT1VUOiB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDb25maWd1cmF0aW9uT3B0aW9uVHlwZTo6UkVUUkFOU01JU1NJT05fQU5EX0ZMT1dfQ09OVFJPTDogewotICAgICAgICBhdXRvIGNvbmZpZyA9IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uOjpTcGVjaWFsaXplKG9wdGlvbi5nZXQoKSk7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uX3N0YXRlLnJldHJhbnNtaXNzaW9uX2FuZF9mbG93X2NvbnRyb2xfbW9kZV8gIT0gY29uZmlnLT5tb2RlXykgewotICAgICAgICAgIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChjaWQsIGNoYW5uZWwtPkdldFJlbW90ZUNpZCgpKTsKLSAgICAgICAgICBhbGFybV8uQ2FuY2VsKCk7Ci0gICAgICAgICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25fc3RhdGUubG9jYWxfcmV0cmFuc21pc3Npb25fYW5kX2Zsb3dfY29udHJvbF8gPSAqY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ29uZmlndXJhdGlvbk9wdGlvblR5cGU6OkZSQU1FX0NIRUNLX1NFUVVFTkNFOiB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25fc3RhdGUuZmNzX3R5cGVfID0gRnJhbWVDaGVja1NlcXVlbmNlT3B0aW9uOjpTcGVjaWFsaXplKG9wdGlvbi5nZXQoKSktPmZjc190eXBlXzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgc29tZSB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uIG9wdGlvbjogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG9wdGlvbi0+dHlwZV8pKTsKLSAgICAgICAgYWxhcm1fLkNhbmNlbCgpOwotICAgICAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIGlmIChjb25maWd1cmF0aW9uX3N0YXRlLnN0YXRlXyA9PSBDaGFubmVsQ29uZmlndXJhdGlvblN0YXRlOjpTdGF0ZTo6V0FJVF9DT05GSUdfUlNQKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsPiB1c2VyX2NoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPER5bmFtaWNDaGFubmVsPihjaGFubmVsLCBoYW5kbGVyXyk7Ci0gICAgaWYgKGNoYW5uZWwtPmxvY2FsX2luaXRpYXRlZF8pIHsKLSAgICAgIGxpbmtfLT5Ob3RpZnlDaGFubmVsQ3JlYXRpb24oY2lkLCBzdGQ6Om1vdmUodXNlcl9jaGFubmVsKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VydmljZShjaGFubmVsLT5HZXRQc20oKSktPk5vdGlmeUNoYW5uZWxDcmVhdGlvbihzdGQ6Om1vdmUodXNlcl9jaGFubmVsKSk7Ci0gICAgfQotICAgIGNvbmZpZ3VyYXRpb25fc3RhdGUuc3RhdGVfID0gQ2hhbm5lbENvbmZpZ3VyYXRpb25TdGF0ZTo6U3RhdGU6OkNPTkZJR1VSRUQ7Ci0gICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy0+QXR0YWNoQ2hhbm5lbChjaWQsIGNoYW5uZWwsIGwyY2FwOjppbnRlcm5hbDo6RGF0YVBpcGVsaW5lTWFuYWdlcjo6Q2hhbm5lbE1vZGU6OkJBU0lDKTsKLSAgICBkYXRhX3BpcGVsaW5lX21hbmFnZXJfLT5VcGRhdGVDbGFzc2ljQ29uZmlndXJhdGlvbihjaWQsIGNvbmZpZ3VyYXRpb25fc3RhdGUpOwotICB9IGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25fc3RhdGUuc3RhdGVfID09IENoYW5uZWxDb25maWd1cmF0aW9uU3RhdGU6OlN0YXRlOjpXQUlUX0NPTkZJR19SRVFfUlNQKSB7Ci0gICAgY29uZmlndXJhdGlvbl9zdGF0ZS5zdGF0ZV8gPSBDaGFubmVsQ29uZmlndXJhdGlvblN0YXRlOjpTdGF0ZTo6V0FJVF9DT05GSUdfUkVROwotICB9Ci0KLSAgYWxhcm1fLkNhbmNlbCgpOwotICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Ok9uRGlzY29ubmVjdGlvblJlcXVlc3QoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgY2lkLCBDaWQgcmVtb3RlX2NpZCkgewotICAvLyBUT0RPOiBjaGVjayBjaWQgbWF0Y2gKLSAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbEJ5Q2lkKGNpZCk7Ci0gIGlmIChjaGFubmVsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiRGlzY29ubmVjdCByZXF1ZXN0IGZvciBhbiB1bmtub3duIGNoYW5uZWwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBidWlsZGVyID0gRGlzY29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKHNpZ25hbF9pZC5WYWx1ZSgpLCBjaWQsIHJlbW90ZV9jaWQpOwotICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKGJ1aWxkZXIpLCBoYW5kbGVyXyk7Ci0gIGNoYW5uZWwtPk9uQ2xvc2VkKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgYXV0byYgY29uZmlndXJhdGlvbl9zdGF0ZSA9IGNoYW5uZWxfY29uZmlndXJhdGlvbl9bY2hhbm5lbC0+R2V0Q2lkKCldOwotICBpZiAoY29uZmlndXJhdGlvbl9zdGF0ZS5zdGF0ZV8gPT0gY29uZmlndXJhdGlvbl9zdGF0ZS5DT05GSUdVUkVEKSB7Ci0gICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy0+RGV0YWNoQ2hhbm5lbChjaWQpOwotICB9Ci0gIGxpbmtfLT5GcmVlRHluYW1pY0NoYW5uZWwoY2lkKTsKLSAgY2hhbm5lbF9jb25maWd1cmF0aW9uXy5lcmFzZShjaWQpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6T25EaXNjb25uZWN0aW9uUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgcmVtb3RlX2NpZCwgQ2lkIGNpZCkgewotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gIT0gc2lnbmFsX2lkIHx8Ci0gICAgICBjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXyAhPSBDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNUKSB7Ci0gICAgTE9HX1dBUk4oIlVuZXhwZWN0ZWQgcmVzcG9uc2U6IG5vIHBlbmRpbmcgcmVxdWVzdC4gRXhwZWN0ZWQgc2lnbmFsIGlkICVkIHR5cGUgJXMsIGdvdCAlZCIsCi0gICAgICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8uVmFsdWUoKSwgQ29tbWFuZENvZGVUZXh0KGNvbW1hbmRfanVzdF9zZW50Xy5jb21tYW5kX2NvZGVfKS5kYXRhKCksCi0gICAgICAgICAgICAgc2lnbmFsX2lkLlZhbHVlKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFsYXJtXy5DYW5jZWwoKTsKLQotICBhdXRvIGNoYW5uZWwgPSBjaGFubmVsX2FsbG9jYXRvcl8tPkZpbmRDaGFubmVsQnlDaWQoY2lkKTsKLSAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJEaXNjb25uZWN0IHJlc3BvbnNlIGZvciBhbiB1bmtub3duIGNoYW5uZWwiKTsKLSAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjaGFubmVsLT5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIGF1dG8mIGNvbmZpZ3VyYXRpb25fc3RhdGUgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb25fW2NpZF07Ci0gIGlmIChjb25maWd1cmF0aW9uX3N0YXRlLnN0YXRlXyA9PSBjb25maWd1cmF0aW9uX3N0YXRlLkNPTkZJR1VSRUQpIHsKLSAgICBkYXRhX3BpcGVsaW5lX21hbmFnZXJfLT5EZXRhY2hDaGFubmVsKGNpZCk7Ci0gIH0KLSAgbGlua18tPkZyZWVEeW5hbWljQ2hhbm5lbChjaWQpOwotICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgY2hhbm5lbF9jb25maWd1cmF0aW9uXy5lcmFzZShjaWQpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6T25FY2hvUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIGNvbnN0IFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4mIHBhY2tldCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfdmVjdG9ye3BhY2tldC5iZWdpbigpLCBwYWNrZXQuZW5kKCl9OwotICBhdXRvIHJhd19idWlsZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxwYWNrZXQ6OlJhd0J1aWxkZXI+KCk7Ci0gIHJhd19idWlsZGVyLT5BZGRPY3RldHMocGFja2V0X3ZlY3Rvcik7Ci0gIGF1dG8gYnVpbGRlciA9IEVjaG9SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZShzaWduYWxfaWQuVmFsdWUoKSwgc3RkOjptb3ZlKHJhd19idWlsZGVyKSk7Ci0gIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGhhbmRsZXJfKTsKLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Ok9uRWNob1Jlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgY29uc3QgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiYgcGFja2V0KSB7Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyAhPSBzaWduYWxfaWQgfHwgY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8gIT0gQ29tbWFuZENvZGU6OkVDSE9fUkVRVUVTVCkgewotICAgIExPR19XQVJOKCJVbmV4cGVjdGVkIHJlc3BvbnNlOiBubyBwZW5kaW5nIHJlcXVlc3QuIEV4cGVjdGVkIHNpZ25hbCBpZCAlZCB0eXBlICVzLCBnb3QgJWQiLAotICAgICAgICAgICAgIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfLlZhbHVlKCksIENvbW1hbmRDb2RlVGV4dChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXykuZGF0YSgpLAotICAgICAgICAgICAgIHNpZ25hbF9pZC5WYWx1ZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgTE9HX0lORk8oIkVjaG8gcmVzcG9uc2UgcmVjZWl2ZWQiKTsKLSAgYWxhcm1fLkNhbmNlbCgpOwotICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Ok9uSW5mb3JtYXRpb25SZXF1ZXN0KFNpZ25hbElkIHNpZ25hbF9pZCwgSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlOjpDT05ORUNUSU9OTEVTU19NVFU6IHsKLSAgICAgIGF1dG8gcmVzcG9uc2UgPSBJbmZvcm1hdGlvblJlc3BvbnNlQ29ubmVjdGlvbmxlc3NNdHVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgc2lnbmFsX2lkLlZhbHVlKCksIEluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdDo6U1VDQ0VTUywga0RlZmF1bHRDbGFzc2ljTXR1KTsKLSAgICAgIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUocmVzcG9uc2UpLCBoYW5kbGVyXyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBJbmZvcm1hdGlvblJlcXVlc3RJbmZvVHlwZTo6RVhURU5ERURfRkVBVFVSRVNfU1VQUE9SVEVEOiB7Ci0gICAgICBhdXRvIHJlc3BvbnNlID0gSW5mb3JtYXRpb25SZXNwb25zZUV4dGVuZGVkRmVhdHVyZXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgc2lnbmFsX2lkLlZhbHVlKCksIEluZm9ybWF0aW9uUmVxdWVzdFJlc3VsdDo6U1VDQ0VTUywgMCwgMCwgMCwgMSAvKiBFUlRNICovLCAwIC8qIFN0cmVhbWluZyBtb2RlICovLAotICAgICAgICAgIDEgLyogRkNTICovLCAwLCAxIC8qIEZpeGVkIENoYW5uZWxzICovLCAwLCAwLCAwIC8qIENPQyAqLyk7Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKHJlc3BvbnNlKSwgaGFuZGxlcl8pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGU6OkZJWEVEX0NIQU5ORUxTX1NVUFBPUlRFRDogewotICAgICAgYXV0byByZXNwb25zZSA9IEluZm9ybWF0aW9uUmVzcG9uc2VGaXhlZENoYW5uZWxzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIHNpZ25hbF9pZC5WYWx1ZSgpLCBJbmZvcm1hdGlvblJlcXVlc3RSZXN1bHQ6OlNVQ0NFU1MsIGZpeGVkX3NlcnZpY2VfbWFuYWdlcl8tPkdldFN1cHBvcnRlZEZpeGVkQ2hhbm5lbE1hc2soKSk7Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKHJlc3BvbnNlKSwgaGFuZGxlcl8pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpPbkluZm9ybWF0aW9uUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBjb25zdCBJbmZvcm1hdGlvblJlc3BvbnNlVmlldyYgcmVzcG9uc2UpIHsKLSAgaWYgKGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfICE9IHNpZ25hbF9pZCB8fAotICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8gIT0gQ29tbWFuZENvZGU6OklORk9STUFUSU9OX1JFUVVFU1QpIHsKLSAgICBMT0dfV0FSTigiVW5leHBlY3RlZCByZXNwb25zZTogbm8gcGVuZGluZyByZXF1ZXN0LiBFeHBlY3RlZCBzaWduYWwgaWQgJWQgdHlwZSAlcywgZ290ICVkIiwKLSAgICAgICAgICAgICBjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXy5WYWx1ZSgpLCBDb21tYW5kQ29kZVRleHQoY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8pLmRhdGEoKSwKLSAgICAgICAgICAgICBzaWduYWxfaWQuVmFsdWUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byB0eXBlID0gcmVzcG9uc2UuR2V0SW5mb1R5cGUoKTsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBJbmZvcm1hdGlvblJlcXVlc3RJbmZvVHlwZTo6Q09OTkVDVElPTkxFU1NfTVRVOiB7Ci0gICAgICBhdXRvIHZpZXcgPSBJbmZvcm1hdGlvblJlc3BvbnNlQ29ubmVjdGlvbmxlc3NNdHVWaWV3OjpDcmVhdGUocmVzcG9uc2UpOwotICAgICAgaWYgKCF2aWV3LklzVmFsaWQoKSkgewotICAgICAgICBMT0dfV0FSTigiSW52YWxpZCBJbmZvcm1hdGlvblJlc3BvbnNlQ29ubmVjdGlvbmxlc3NNdHUgcmVjZWl2ZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbGlua18tPlNldFJlbW90ZUNvbm5lY3Rpb25sZXNzTXR1KHZpZXcuR2V0Q29ubmVjdGlvbmxlc3NNdHUoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBJbmZvcm1hdGlvblJlcXVlc3RJbmZvVHlwZTo6RVhURU5ERURfRkVBVFVSRVNfU1VQUE9SVEVEOiB7Ci0gICAgICBhdXRvIHZpZXcgPSBJbmZvcm1hdGlvblJlc3BvbnNlRXh0ZW5kZWRGZWF0dXJlc1ZpZXc6OkNyZWF0ZShyZXNwb25zZSk7Ci0gICAgICBpZiAoIXZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIExPR19XQVJOKCJJbnZhbGlkIEluZm9ybWF0aW9uUmVzcG9uc2VFeHRlbmRlZEZlYXR1cmVzIHJlY2VpdmVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGxpbmtfLT5PblJlbW90ZUV4dGVuZGVkRmVhdHVyZVJlY2VpdmVkKHZpZXcuR2V0RW5oYW5jZWRSZXRyYW5zbWlzc2lvbk1vZGUoKSwgdmlldy5HZXRGY3NPcHRpb24oKSk7Ci0gICAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IG90aGVyIHBhcmFtZXRlcnMKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlOjpGSVhFRF9DSEFOTkVMU19TVVBQT1JURUQ6IHsKLSAgICAgIGF1dG8gdmlldyA9IEluZm9ybWF0aW9uUmVzcG9uc2VGaXhlZENoYW5uZWxzVmlldzo6Q3JlYXRlKHJlc3BvbnNlKTsKLSAgICAgIGlmICghdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgTE9HX1dBUk4oIkludmFsaWQgSW5mb3JtYXRpb25SZXNwb25zZUZpeGVkQ2hhbm5lbCByZWNlaXZlZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvLyBXZSBkb24ndCB1c2UgZml4ZWQgY2hhbm5lbHMgKGNvbm5lY3Rpb25sZXNzIG9yIEJSL0VEUiBzZWN1cml0eSkgZm9yIG5vdyBzbyB3ZSBkb24ndCBjYXJlCi0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBhbGFybV8uQ2FuY2VsKCk7Ci0gIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6b25faW5jb21pbmdfcGFja2V0KCkgewotICBhdXRvIHBhY2tldCA9IHNpZ25hbGxpbmdfY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICBhdXRvIGNvbW1hbmRfbGlzdCA9IEdldENvbW1hbmRzRnJvbVBhY2tldFZpZXcoKnBhY2tldCk7Ci0gIGZvciAoYXV0byYgY29tbWFuZCA6IGNvbW1hbmRfbGlzdCkgewotICAgIGhhbmRsZV9vbmVfY29tbWFuZChjb21tYW5kKTsKLSAgfQotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6aGFuZGxlX29uZV9jb21tYW5kKENvbnRyb2xWaWV3IGNvbnRyb2xfcGFja2V0X3ZpZXcpIHsKLSAgaWYgKCFjb250cm9sX3BhY2tldF92aWV3LklzVmFsaWQoKSkgewotICAgIExPR19XQVJOKCJJbnZhbGlkIHNpZ25hbGxpbmcgcGFja2V0IHJlY2VpdmVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gY29kZSA9IGNvbnRyb2xfcGFja2V0X3ZpZXcuR2V0Q29kZSgpOwotICBzd2l0Y2ggKGNvZGUpIHsKLSAgICBjYXNlIENvbW1hbmRDb2RlOjpDT01NQU5EX1JFSkVDVDogewotICAgICAgQ29tbWFuZFJlamVjdFZpZXcgY29tbWFuZF9yZWplY3RfdmlldyA9IENvbW1hbmRSZWplY3RWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIWNvbW1hbmRfcmVqZWN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uQ29tbWFuZFJlamVjdChjb21tYW5kX3JlamVjdF92aWV3KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6Q09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBDb25uZWN0aW9uUmVxdWVzdFZpZXcgY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcgPSBDb25uZWN0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3KTsKLSAgICAgIGlmICghY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uQ29ubmVjdGlvblJlcXVlc3QoY29udHJvbF9wYWNrZXRfdmlldy5HZXRJZGVudGlmaWVyKCksIGNvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldFBzbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3JlcXVlc3Rfdmlldy5HZXRTb3VyY2VDaWQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkNPTk5FQ1RJT05fUkVTUE9OU0U6IHsKLSAgICAgIENvbm5lY3Rpb25SZXNwb25zZVZpZXcgY29ubmVjdGlvbl9yZXNwb25zZV92aWV3ID0gQ29ubmVjdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uQ29ubmVjdGlvblJlc3BvbnNlKGNvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRJZGVudGlmaWVyKCksIGNvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXREZXN0aW5hdGlvbkNpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9yZXNwb25zZV92aWV3LkdldFNvdXJjZUNpZCgpLCBjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuR2V0UmVzdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuR2V0U3RhdHVzKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENvbW1hbmRDb2RlOjpDT05GSUdVUkFUSU9OX1JFUVVFU1Q6IHsKLSAgICAgIENvbmZpZ3VyYXRpb25SZXF1ZXN0VmlldyBjb25maWd1cmF0aW9uX3JlcXVlc3RfdmlldyA9IENvbmZpZ3VyYXRpb25SZXF1ZXN0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFjb25maWd1cmF0aW9uX3JlcXVlc3Rfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgT25Db25maWd1cmF0aW9uUmVxdWVzdChjb25maWd1cmF0aW9uX3JlcXVlc3Rfdmlldy5HZXRJZGVudGlmaWVyKCksIGNvbmZpZ3VyYXRpb25fcmVxdWVzdF92aWV3LkdldERlc3RpbmF0aW9uQ2lkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fcmVxdWVzdF92aWV3LkdldENvbnRpbnVhdGlvbigpLCBjb25maWd1cmF0aW9uX3JlcXVlc3Rfdmlldy5HZXRDb25maWcoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkNPTkZJR1VSQVRJT05fUkVTUE9OU0U6IHsKLSAgICAgIENvbmZpZ3VyYXRpb25SZXNwb25zZVZpZXcgY29uZmlndXJhdGlvbl9yZXNwb25zZV92aWV3ID0gQ29uZmlndXJhdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFjb25maWd1cmF0aW9uX3Jlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uQ29uZmlndXJhdGlvblJlc3BvbnNlKGNvbmZpZ3VyYXRpb25fcmVzcG9uc2Vfdmlldy5HZXRJZGVudGlmaWVyKCksIGNvbmZpZ3VyYXRpb25fcmVzcG9uc2Vfdmlldy5HZXRTb3VyY2VDaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fcmVzcG9uc2Vfdmlldy5HZXRDb250aW51YXRpb24oKSwgY29uZmlndXJhdGlvbl9yZXNwb25zZV92aWV3LkdldFJlc3VsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbl9yZXNwb25zZV92aWV3LkdldENvbmZpZygpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBEaXNjb25uZWN0aW9uUmVxdWVzdFZpZXcgZGlzY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcgPSBEaXNjb25uZWN0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3KTsKLSAgICAgIGlmICghZGlzY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uRGlzY29ubmVjdGlvblJlcXVlc3QoZGlzY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0SWRlbnRpZmllcigpLCBkaXNjb25uZWN0aW9uX3JlcXVlc3Rfdmlldy5HZXREZXN0aW5hdGlvbkNpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW9uX3JlcXVlc3Rfdmlldy5HZXRTb3VyY2VDaWQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkRJU0NPTk5FQ1RJT05fUkVTUE9OU0U6IHsKLSAgICAgIERpc2Nvbm5lY3Rpb25SZXNwb25zZVZpZXcgZGlzY29ubmVjdGlvbl9yZXNwb25zZV92aWV3ID0gRGlzY29ubmVjdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFkaXNjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uRGlzY29ubmVjdGlvblJlc3BvbnNlKGRpc2Nvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRJZGVudGlmaWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuR2V0RGVzdGluYXRpb25DaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRTb3VyY2VDaWQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkVDSE9fUkVRVUVTVDogewotICAgICAgRWNob1JlcXVlc3RWaWV3IGVjaG9fcmVxdWVzdF92aWV3ID0gRWNob1JlcXVlc3RWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIWVjaG9fcmVxdWVzdF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkVjaG9SZXF1ZXN0KGVjaG9fcmVxdWVzdF92aWV3LkdldElkZW50aWZpZXIoKSwgZWNob19yZXF1ZXN0X3ZpZXcuR2V0UGF5bG9hZCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6RUNIT19SRVNQT05TRTogewotICAgICAgRWNob1Jlc3BvbnNlVmlldyBlY2hvX3Jlc3BvbnNlX3ZpZXcgPSBFY2hvUmVzcG9uc2VWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIWVjaG9fcmVzcG9uc2Vfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgT25FY2hvUmVzcG9uc2UoZWNob19yZXNwb25zZV92aWV3LkdldElkZW50aWZpZXIoKSwgZWNob19yZXNwb25zZV92aWV3LkdldFBheWxvYWQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OklORk9STUFUSU9OX1JFUVVFU1Q6IHsKLSAgICAgIEluZm9ybWF0aW9uUmVxdWVzdFZpZXcgaW5mb3JtYXRpb25fcmVxdWVzdF92aWV3ID0gSW5mb3JtYXRpb25SZXF1ZXN0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFpbmZvcm1hdGlvbl9yZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uSW5mb3JtYXRpb25SZXF1ZXN0KGluZm9ybWF0aW9uX3JlcXVlc3Rfdmlldy5HZXRJZGVudGlmaWVyKCksIGluZm9ybWF0aW9uX3JlcXVlc3Rfdmlldy5HZXRJbmZvVHlwZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6SU5GT1JNQVRJT05fUkVTUE9OU0U6IHsKLSAgICAgIEluZm9ybWF0aW9uUmVzcG9uc2VWaWV3IGluZm9ybWF0aW9uX3Jlc3BvbnNlX3ZpZXcgPSBJbmZvcm1hdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFpbmZvcm1hdGlvbl9yZXNwb25zZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkluZm9ybWF0aW9uUmVzcG9uc2UoaW5mb3JtYXRpb25fcmVzcG9uc2Vfdmlldy5HZXRJZGVudGlmaWVyKCksIGluZm9ybWF0aW9uX3Jlc3BvbnNlX3ZpZXcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENvbW1hbmRDb2RlOjpDUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0VmlldyByZXF1ZXN0X3ZpZXcgPSBDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFyZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6Q1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVTUE9OU0U6IHsKLSAgICAgIENyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlVmlldyByZXNwb25zZV92aWV3ID0gQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIXJlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6Q1JFRElUX0JBU0VEX1JFQ09ORklHVVJFX1JFUVVFU1Q6IHsKLSAgICAgIENyZWRpdEJhc2VkUmVjb25maWd1cmVSZXF1ZXN0VmlldyByZXF1ZXN0X3ZpZXcgPSBDcmVkaXRCYXNlZFJlY29uZmlndXJlUmVxdWVzdFZpZXc6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3KTsKLSAgICAgIGlmICghcmVxdWVzdF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkNSRURJVF9CQVNFRF9SRUNPTkZJR1VSRV9SRVNQT05TRTogewotICAgICAgQ3JlZGl0QmFzZWRSZWNvbmZpZ3VyZVJlc3BvbnNlVmlldyByZXNwb25zZV92aWV3ID0KLSAgICAgICAgICBDcmVkaXRCYXNlZFJlY29uZmlndXJlUmVzcG9uc2VWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIXJlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6RkxPV19DT05UUk9MX0NSRURJVDogewotICAgICAgRmxvd0NvbnRyb2xDcmVkaXRWaWV3IGNyZWRpdF92aWV3ID0gRmxvd0NvbnRyb2xDcmVkaXRWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIWNyZWRpdF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigiVW5oYW5kbGVkIGV2ZW50IDB4JXgiLCBzdGF0aWNfY2FzdDxpbnQ+KGNvZGUpKTsKLSAgICAgIGF1dG8gYnVpbGRlciA9IENvbW1hbmRSZWplY3ROb3RVbmRlcnN0b29kQnVpbGRlcjo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcuR2V0SWRlbnRpZmllcigpKTsKLSAgICAgIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGhhbmRsZXJfKTsKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6c2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIHJlbW90ZV9jaWQsIENpZCBsb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SZXNwb25zZVN0YXR1cyBzdGF0dXMpIHsKLSAgYXV0byBidWlsZGVyID0gQ29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKHNpZ25hbF9pZC5WYWx1ZSgpLCBsb2NhbF9jaWQsIHJlbW90ZV9jaWQsIHJlc3VsdCwgc3RhdHVzKTsKLSAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotfQotCi12b2lkIENsYXNzaWNTaWduYWxsaW5nTWFuYWdlcjo6b25fY29tbWFuZF90aW1lb3V0KCkgewotICBMT0dfV0FSTigiUmVzcG9uc2UgdGltZSBvdXQiKTsKLSAgaWYgKGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfID09IGtJbnZhbGlkU2lnbmFsSWQpIHsKLSAgICBMT0dfRVJST1IoIk5vIHBlbmRpbmcgY29tbWFuZCIpOwotICAgIHJldHVybjsKLSAgfQotICBMT0dfV0FSTigiUmVzcG9uc2UgdGltZSBvdXQgZm9yICVzIiwgQ29tbWFuZENvZGVUZXh0KGNvbW1hbmRfanVzdF9zZW50Xy5jb21tYW5kX2NvZGVfKS5jX3N0cigpKTsKLSAgc3dpdGNoIChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXykgewotICAgIGNhc2UgQ29tbWFuZENvZGU6OkNPTk5FQ1RJT05fUkVRVUVTVDogewotICAgICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IGNvbm5lY3Rpb25fcmVzdWx0ewotICAgICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9MMkNBUF9FUlJPUiwKLSAgICAgICAgICAuaGNpX2Vycm9yID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAgICAgLmwyY2FwX2Nvbm5lY3Rpb25fcmVzcG9uc2VfcmVzdWx0ID0gQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpOT19SRVNPVVJDRVNfQVZBSUxBQkxFLAotICAgICAgfTsKLSAgICAgIGxpbmtfLT5Pbk91dGdvaW5nQ29ubmVjdGlvblJlcXVlc3RGYWlsKGNvbW1hbmRfanVzdF9zZW50Xy5zb3VyY2VfY2lkXywgY29ubmVjdGlvbl9yZXN1bHQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkNPTkZJR1VSQVRJT05fUkVRVUVTVDogewotICAgICAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbEJ5UmVtb3RlQ2lkKGNvbW1hbmRfanVzdF9zZW50Xy5kZXN0aW5hdGlvbl9jaWRfKTsKLSAgICAgIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChjaGFubmVsLT5HZXRDaWQoKSwgY2hhbm5lbC0+R2V0UmVtb3RlQ2lkKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENvbW1hbmRDb2RlOjpJTkZPUk1BVElPTl9SRVFVRVNUOiB7Ci0gICAgICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLmluZm9fdHlwZV8gPT0gSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGU6OkVYVEVOREVEX0ZFQVRVUkVTX1NVUFBPUlRFRCkgewotICAgICAgICBsaW5rXy0+T25SZW1vdGVFeHRlbmRlZEZlYXR1cmVSZWNlaXZlZChmYWxzZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLX0KLQotdm9pZCBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6OmhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpIHsKLSAgY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gPSBrSW52YWxpZFNpZ25hbElkOwotICBpZiAocGVuZGluZ19jb21tYW5kc18uZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotICBjb21tYW5kX2p1c3Rfc2VudF8gPSBzdGQ6Om1vdmUocGVuZGluZ19jb21tYW5kc18uZnJvbnQoKSk7Ci0gIHBlbmRpbmdfY29tbWFuZHNfLnBvcCgpOwotCi0gIGF1dG8gc2lnbmFsX2lkID0gY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF87Ci0gIGF1dG8gcHNtID0gY29tbWFuZF9qdXN0X3NlbnRfLnBzbV87Ci0gIGF1dG8gc291cmNlX2NpZCA9IGNvbW1hbmRfanVzdF9zZW50Xy5zb3VyY2VfY2lkXzsKLSAgYXV0byBkZXN0aW5hdGlvbl9jaWQgPSBjb21tYW5kX2p1c3Rfc2VudF8uZGVzdGluYXRpb25fY2lkXzsKLSAgYXV0byBpbmZvX3R5cGUgPSBjb21tYW5kX2p1c3Rfc2VudF8uaW5mb190eXBlXzsKLSAgYXV0byBjb25maWcgPSBzdGQ6Om1vdmUoY29tbWFuZF9qdXN0X3NlbnRfLmNvbmZpZ18pOwotICBzd2l0Y2ggKGNvbW1hbmRfanVzdF9zZW50Xy5jb21tYW5kX2NvZGVfKSB7Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6Q09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBhdXRvIGJ1aWxkZXIgPSBDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShzaWduYWxfaWQuVmFsdWUoKSwgcHNtLCBzb3VyY2VfY2lkKTsKLSAgICAgIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGhhbmRsZXJfKTsKLSAgICAgIGFsYXJtXy5TY2hlZHVsZShjb21tb246OkJpbmRPbmNlKCZDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICBrVGltZW91dCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDb21tYW5kQ29kZTo6Q09ORklHVVJBVElPTl9SRVFVRVNUOiB7Ci0gICAgICBhdXRvIGJ1aWxkZXIgPQotICAgICAgICAgIENvbmZpZ3VyYXRpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKHNpZ25hbF9pZC5WYWx1ZSgpLCBkZXN0aW5hdGlvbl9jaWQsIENvbnRpbnVhdGlvbjo6RU5ELCBzdGQ6Om1vdmUoY29uZmlnKSk7Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKGJ1aWxkZXIpLCBoYW5kbGVyXyk7Ci0gICAgICBhbGFybV8uU2NoZWR1bGUoY29tbW9uOjpCaW5kT25jZSgmQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpvbl9jb21tYW5kX3RpbWVvdXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgICAga1RpbWVvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OkRJU0NPTk5FQ1RJT05fUkVRVUVTVDogewotICAgICAgYXV0byBidWlsZGVyID0gRGlzY29ubmVjdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoc2lnbmFsX2lkLlZhbHVlKCksIGRlc3RpbmF0aW9uX2NpZCwgc291cmNlX2NpZCk7Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKGJ1aWxkZXIpLCBoYW5kbGVyXyk7Ci0gICAgICBhbGFybV8uU2NoZWR1bGUoY29tbW9uOjpCaW5kT25jZSgmQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyOjpvbl9jb21tYW5kX3RpbWVvdXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgICAga1RpbWVvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ29tbWFuZENvZGU6OklORk9STUFUSU9OX1JFUVVFU1Q6IHsKLSAgICAgIGF1dG8gYnVpbGRlciA9IEluZm9ybWF0aW9uUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShzaWduYWxfaWQuVmFsdWUoKSwgaW5mb190eXBlKTsKLSAgICAgIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGhhbmRsZXJfKTsKLSAgICAgIGFsYXJtXy5TY2hlZHVsZShjb21tb246OkJpbmRPbmNlKCZDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICBrVGltZW91dCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCJVbnN1cHBvcnRlZCBjb21tYW5kIGNvZGUgMHgleCIsIHN0YXRpY19jYXN0PGludD4oY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8pKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmggYi9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjYzN2FlLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvY2hhbm5lbF9jb25maWd1cmF0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAibDJjYXAvc2lnbmFsX2lkLmgiCi0jaW5jbHVkZSAib3MvYWxhcm0uaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RydWN0IFBlbmRpbmdDb21tYW5kIHsKLSAgU2lnbmFsSWQgc2lnbmFsX2lkXyA9IGtJbnZhbGlkU2lnbmFsSWQ7Ci0gIENvbW1hbmRDb2RlIGNvbW1hbmRfY29kZV87Ci0gIFBzbSBwc21fOwotICBDaWQgc291cmNlX2NpZF87Ci0gIENpZCBkZXN0aW5hdGlvbl9jaWRfOwotICBJbmZvcm1hdGlvblJlcXVlc3RJbmZvVHlwZSBpbmZvX3R5cGVfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhdGlvbk9wdGlvbj4+IGNvbmZpZ187Ci19OwotCi1jbGFzcyBMaW5rOwotCi1jbGFzcyBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXIgewotIHB1YmxpYzoKLSAgQ2xhc3NpY1NpZ25hbGxpbmdNYW5hZ2VyKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBMaW5rKiBsaW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXA6OmludGVybmFsOjpEYXRhUGlwZWxpbmVNYW5hZ2VyKiBkYXRhX3BpcGVsaW5lX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2ljOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEFsbG9jYXRvciogY2hhbm5lbF9hbGxvY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2ljOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBmaXhlZF9zZXJ2aWNlX21hbmFnZXIpOwotCi0gIHZpcnR1YWwgfkNsYXNzaWNTaWduYWxsaW5nTWFuYWdlcigpOwotCi0gIHZvaWQgT25Db21tYW5kUmVqZWN0KENvbW1hbmRSZWplY3RWaWV3IGNvbW1hbmRfcmVqZWN0X3ZpZXcpOwotCi0gIHZvaWQgU2VuZENvbm5lY3Rpb25SZXF1ZXN0KFBzbSBwc20sIENpZCBsb2NhbF9jaWQpOwotCi0gIHZvaWQgU2VuZEluaXRpYWxDb25maWdSZXF1ZXN0KENpZCBsb2NhbF9jaWQpOwotCi0gIHZvaWQgU2VuZERpc2Nvbm5lY3Rpb25SZXF1ZXN0KENpZCBsb2NhbF9jaWQsIENpZCByZW1vdGVfY2lkKTsKLQotICB2b2lkIFNlbmRJbmZvcm1hdGlvblJlcXVlc3QoSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUgdHlwZSk7Ci0KLSAgdm9pZCBTZW5kRWNob1JlcXVlc3Qoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6UmF3QnVpbGRlcj4gcGF5bG9hZCk7Ci0KLSAgdm9pZCBDYW5jZWxBbGFybSgpOwotCi0gIHZvaWQgT25Db25uZWN0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIFBzbSBwc20sIENpZCByZW1vdGVfY2lkKTsKLQotICB2b2lkIE9uQ29ubmVjdGlvblJlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIHJlbW90ZV9jaWQsIENpZCBjaWQsIENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzIHN0YXR1cyk7Ci0KLSAgdm9pZCBPbkRpc2Nvbm5lY3Rpb25SZXF1ZXN0KFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIGNpZCwgQ2lkIHJlbW90ZV9jaWQpOwotCi0gIHZvaWQgT25EaXNjb25uZWN0aW9uUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgY2lkLCBDaWQgcmVtb3RlX2NpZCk7Ci0KLSAgdm9pZCBPbkNvbmZpZ3VyYXRpb25SZXF1ZXN0KFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIGNpZCwgQ29udGludWF0aW9uIGlzX2NvbnRpbnVhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmF0aW9uT3B0aW9uPj4pOwotCi0gIHZvaWQgT25Db25maWd1cmF0aW9uUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgY2lkLCBDb250aW51YXRpb24gaXNfY29udGludWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25SZXNwb25zZVJlc3VsdCByZXN1bHQsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmF0aW9uT3B0aW9uPj4pOwotCi0gIHZvaWQgT25FY2hvUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIGNvbnN0IFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4mIHBhY2tldCk7Ci0KLSAgdm9pZCBPbkVjaG9SZXNwb25zZShTaWduYWxJZCBzaWduYWxfaWQsIGNvbnN0IFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4mIHBhY2tldCk7Ci0KLSAgdm9pZCBPbkluZm9ybWF0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlIHR5cGUpOwotCi0gIHZvaWQgT25JbmZvcm1hdGlvblJlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgY29uc3QgSW5mb3JtYXRpb25SZXNwb25zZVZpZXcmIHJlc3BvbnNlKTsKLQotICBlbnVtIGNsYXNzIFNlY3VyaXR5RW5mb3JjZW1lbnRUeXBlIHsKLSAgICBMSU5LX0tFWSwKLSAgICBFTkNSWVBUSU9OLAotICB9OwotICB2b2lkIG9uX3NlY3VyaXR5X3Jlc3VsdF9mb3Jfb3V0Z29pbmcoU2VjdXJpdHlFbmZvcmNlbWVudFR5cGUgdHlwZSwgUHNtIHBzbSwgQ2lkIGxvY2FsX2NpZCwgYm9vbCByZXN1bHQpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBvbl9pbmNvbWluZ19wYWNrZXQoKTsKLSAgdm9pZCBoYW5kbGVfb25lX2NvbW1hbmQoQ29udHJvbFZpZXcgY29udHJvbF92aWV3KTsKLSAgdm9pZCBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgcmVtb3RlX2NpZCwgQ2lkIGxvY2FsX2NpZCwgQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgb25fY29tbWFuZF90aW1lb3V0KCk7Ci0gIHZvaWQgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0KLSAgdm9pZCBuZWdvdGlhdGVfY29uZmlndXJhdGlvbihDaWQgY2lkLCBDb250aW51YXRpb24gaXNfY29udGludWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmF0aW9uT3B0aW9uPj4pOwotCi0gIHZvaWQgc2VuZF9jb25maWd1cmF0aW9uX3JlcXVlc3QoQ2lkIHJlbW90ZV9jaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmF0aW9uT3B0aW9uPj4gY29uZmlnKTsKLSAgdm9pZCBvbl9zZWN1cml0eV9yZXN1bHRfZm9yX2luY29taW5nKFBzbSBwc20sIENpZCByZW1vdGVfY2lkLCBTaWduYWxJZCBzaWduYWxfaWQsIGJvb2wgcmVzdWx0KTsKLQotICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gIExpbmsqIGxpbmtfOwotICBsMmNhcDo6aW50ZXJuYWw6OkRhdGFQaXBlbGluZU1hbmFnZXIqIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxjbGFzc2ljOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbD4gc2lnbmFsbGluZ19jaGFubmVsXzsKLSAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXzsKLSAgbDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEFsbG9jYXRvciogY2hhbm5lbF9hbGxvY2F0b3JfOwotICBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGZpeGVkX3NlcnZpY2VfbWFuYWdlcl87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxvczo6RW5xdWV1ZUJ1ZmZlcjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4gZW5xdWV1ZV9idWZmZXJfOwotICBzdGQ6OnF1ZXVlPFBlbmRpbmdDb21tYW5kPiBwZW5kaW5nX2NvbW1hbmRzXzsKLSAgUGVuZGluZ0NvbW1hbmQgY29tbWFuZF9qdXN0X3NlbnRfOwotICBvczo6QWxhcm0gYWxhcm1fOwotICBTaWduYWxJZCBuZXh0X3NpZ25hbF9pZF8gPSBrSW5pdGlhbFNpZ25hbElkOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Q2lkLCBDaGFubmVsQ29uZmlndXJhdGlvblN0YXRlPiBjaGFubmVsX2NvbmZpZ3VyYXRpb25fOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlcl90ZXN0LmNjIGIvZ2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9zaWduYWxsaW5nX21hbmFnZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5YjQ0NS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotY2xhc3MgTDJjYXBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTeW5jSGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBsMmNhcF9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgbDJjYXBfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGwyY2FwX2hhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgb3M6OlRocmVhZCogdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoTDJjYXBDbGFzc2ljU2lnbmFsbGluZ01hbmFnZXJUZXN0LCBwcmVjb25kaXRpb24pIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmNjIGIvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MzM3My4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgImwyY2FwMiIKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmlkaV9xdWV1ZS5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHVtcHN5c19oZWxwZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlci5oIgotI2luY2x1ZGUgImwyY2FwX2NsYXNzaWNfbW9kdWxlX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEwyY2FwQ2xhc3NpY01vZHVsZTo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgTDJjYXBDbGFzc2ljTW9kdWxlKCk7IH0pOwotCi1zdGF0aWMgU2VjdXJpdHlFbmZvcmNlbWVudFJlamVjdEFsbEltcGwgZGVmYXVsdF9zZWN1cml0eV9tb2R1bGVfaW1wbF87Ci0KLXN0cnVjdCBMMmNhcENsYXNzaWNNb2R1bGU6OmltcGwgewotICBpbXBsKG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyLCBoY2k6OkFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyKQotICAgICAgOiBsMmNhcF9oYW5kbGVyXyhsMmNhcF9oYW5kbGVyKSwgYWNsX21hbmFnZXJfKGFjbF9tYW5hZ2VyKSB7Ci0gICAgZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsXy5TZXRTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKCZkZWZhdWx0X3NlY3VyaXR5X21vZHVsZV9pbXBsXyk7Ci0gICAgZHVtcHN5c19oZWxwZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxpbnRlcm5hbDo6RHVtcHN5c0hlbHBlcj4obGlua19tYW5hZ2VyXyk7Ci0gIH0KLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotICBoY2k6OkFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyXzsKLSAgbDJjYXA6OmludGVybmFsOjpQYXJhbWV0ZXJQcm92aWRlciBwYXJhbWV0ZXJfcHJvdmlkZXJfOwotICBpbnRlcm5hbDo6Rml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIGZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfe2wyY2FwX2hhbmRsZXJffTsKLSAgaW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIGR5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF97bDJjYXBfaGFuZGxlcl99OwotICBpbnRlcm5hbDo6TGlua01hbmFnZXIgbGlua19tYW5hZ2VyX3tsMmNhcF9oYW5kbGVyXywgYWNsX21hbmFnZXJfLCAmZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkeW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfLCAmcGFyYW1ldGVyX3Byb3ZpZGVyX307Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbnRlcm5hbDo6RHVtcHN5c0hlbHBlcj4gZHVtcHN5c19oZWxwZXJfOwotCi0gIHN0cnVjdCBTZWN1cml0eUludGVyZmFjZUltcGwgOiBwdWJsaWMgU2VjdXJpdHlJbnRlcmZhY2UgewotICAgIFNlY3VyaXR5SW50ZXJmYWNlSW1wbChpbXBsKiBtb2R1bGVfaW1wbCkgOiBtb2R1bGVfaW1wbF8obW9kdWxlX2ltcGwpIHt9Ci0KLSAgICB2b2lkIFJlZ2lzdGVyTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyKiBsaXN0ZW5lcikgewotICAgICAgQVNTRVJUKCFyZWdpc3RlcmVkXyk7Ci0gICAgICBtb2R1bGVfaW1wbF8tPmxpbmtfbWFuYWdlcl8uUmVnaXN0ZXJMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lcihoYW5kbGVyLCBsaXN0ZW5lcik7Ci0gICAgICByZWdpc3RlcmVkXyA9IHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCBJbml0aWF0ZUNvbm5lY3Rpb25Gb3JTZWN1cml0eShoY2k6OkFkZHJlc3MgcmVtb3RlKSBvdmVycmlkZSB7Ci0gICAgICBBU1NFUlQocmVnaXN0ZXJlZF8pOwotICAgICAgbW9kdWxlX2ltcGxfLT5saW5rX21hbmFnZXJfLkluaXRpYXRlQ29ubmVjdGlvbkZvclNlY3VyaXR5KHJlbW90ZSk7Ci0gICAgfQotCi0gICAgdm9pZCBVbnJlZ2lzdGVyKCkgb3ZlcnJpZGUgewotICAgICAgQVNTRVJUKHJlZ2lzdGVyZWRfKTsKLSAgICAgIG1vZHVsZV9pbXBsXy0+bGlua19tYW5hZ2VyXy5SZWdpc3RlckxpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyKG51bGxwdHIsIG51bGxwdHIpOwotICAgICAgcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLSAgICB9Ci0gICAgaW1wbCogbW9kdWxlX2ltcGxfOwotICAgIGJvb2wgcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLSAgfSBzZWN1cml0eV9pbnRlcmZhY2VfaW1wbF97dGhpc307Ci0KLSAgdm9pZCBEdW1wKAotICAgICAgc3RkOjpwcm9taXNlPGZsYXRidWZmZXJzOjpPZmZzZXQ8TDJjYXBDbGFzc2ljTW9kdWxlRGF0YT4+IHByb21pc2UsCi0gICAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGZiX2J1aWxkZXIpIGNvbnN0OwotfTsKLQotTDJjYXBDbGFzc2ljTW9kdWxlOjpMMmNhcENsYXNzaWNNb2R1bGUoKSB7fQotCi1MMmNhcENsYXNzaWNNb2R1bGU6On5MMmNhcENsYXNzaWNNb2R1bGUoKSB7fQotCi12b2lkIEwyY2FwQ2xhc3NpY01vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxoY2k6OkFjbE1hbmFnZXI+KCk7Ci19Ci0KLXZvaWQgTDJjYXBDbGFzc2ljTW9kdWxlOjpTdGFydCgpIHsKLSAgcGltcGxfID0gc3RkOjptYWtlX3VuaXF1ZTxpbXBsPihHZXRIYW5kbGVyKCksIEdldERlcGVuZGVuY3k8aGNpOjpBY2xNYW5hZ2VyPigpKTsKLX0KLQotdm9pZCBMMmNhcENsYXNzaWNNb2R1bGU6OlN0b3AoKSB7Ci0gIHBpbXBsXy5yZXNldCgpOwotfQotCi1zdGQ6OnN0cmluZyBMMmNhcENsYXNzaWNNb2R1bGU6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIkwyY2FwIENsYXNzaWMgTW9kdWxlIjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbE1hbmFnZXI+IEwyY2FwQ2xhc3NpY01vZHVsZTo6R2V0Rml4ZWRDaGFubmVsTWFuYWdlcigpIHsKLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxNYW5hZ2VyPihuZXcgRml4ZWRDaGFubmVsTWFuYWdlcigmcGltcGxfLT5maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGltcGxfLT5saW5rX21hbmFnZXJfLCBwaW1wbF8tPmwyY2FwX2hhbmRsZXJfKSk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbE1hbmFnZXI+IEwyY2FwQ2xhc3NpY01vZHVsZTo6R2V0RHluYW1pY0NoYW5uZWxNYW5hZ2VyKCkgewotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsTWFuYWdlcj4obmV3IER5bmFtaWNDaGFubmVsTWFuYWdlcigKLSAgICAgICZwaW1wbF8tPmR5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF8sICZwaW1wbF8tPmxpbmtfbWFuYWdlcl8sIHBpbXBsXy0+bDJjYXBfaGFuZGxlcl8pKTsKLX0KLQotdm9pZCBMMmNhcENsYXNzaWNNb2R1bGU6OkluamVjdFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoCi0gICAgU2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSogc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlKSB7Ci0gIGlmIChzZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIHBpbXBsXy0+ZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsXy5TZXRTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKHNlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcGltcGxfLT5keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfLlNldFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoJmRlZmF1bHRfc2VjdXJpdHlfbW9kdWxlX2ltcGxfKTsKLSAgfQotfQotCi1TZWN1cml0eUludGVyZmFjZSogTDJjYXBDbGFzc2ljTW9kdWxlOjpHZXRTZWN1cml0eUludGVyZmFjZSgKLSAgICBvczo6SGFuZGxlciogaGFuZGxlciwgTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIHBpbXBsXy0+c2VjdXJpdHlfaW50ZXJmYWNlX2ltcGxfLlJlZ2lzdGVyTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIoaGFuZGxlciwgbGlzdGVuZXIpOwotICByZXR1cm4gJnBpbXBsXy0+c2VjdXJpdHlfaW50ZXJmYWNlX2ltcGxfOwotfQotCi12b2lkIEwyY2FwQ2xhc3NpY01vZHVsZTo6U2V0TGlua1Byb3BlcnR5TGlzdGVuZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtQcm9wZXJ0eUxpc3RlbmVyKiBsaXN0ZW5lcikgewotICBwaW1wbF8tPmxpbmtfbWFuYWdlcl8uUmVnaXN0ZXJMaW5rUHJvcGVydHlMaXN0ZW5lcihoYW5kbGVyLCBsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgTDJjYXBDbGFzc2ljTW9kdWxlOjppbXBsOjpEdW1wKAotICAgIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEwyY2FwQ2xhc3NpY01vZHVsZURhdGE+PiBwcm9taXNlLAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlcikgY29uc3QgewotICBhdXRvIHRpdGxlID0gZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKCItLS0tLSBMMmNhcCBDbGFzc2ljIER1bXBzeXMgLS0tLS0iKTsKLQotICBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PGJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OkxpbmtEYXRhPj4gbGlua19vZmZzZXRzID0KLSAgICAgIGR1bXBzeXNfaGVscGVyXy0+RHVtcEFjdGl2ZUxpbmtzKGZiX2J1aWxkZXIpOwotCi0gIGF1dG8gYWN0aXZlX2xpbmtzID0gZmJfYnVpbGRlci0+Q3JlYXRlVmVjdG9yKGxpbmtfb2Zmc2V0cyk7Ci0KLSAgTDJjYXBDbGFzc2ljTW9kdWxlRGF0YUJ1aWxkZXIgYnVpbGRlcigqZmJfYnVpbGRlcik7Ci0gIGJ1aWxkZXIuYWRkX3RpdGxlKHRpdGxlKTsKLSAgYnVpbGRlci5hZGRfYWN0aXZlX2xpbmtzKGFjdGl2ZV9saW5rcyk7Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8TDJjYXBDbGFzc2ljTW9kdWxlRGF0YT4gZHVtcHN5c19kYXRhID0gYnVpbGRlci5GaW5pc2goKTsKLQotICBwcm9taXNlLnNldF92YWx1ZShkdW1wc3lzX2RhdGEpOwotfQotCi1EdW1wc3lzRGF0YUZpbmlzaGVyIEwyY2FwQ2xhc3NpY01vZHVsZTo6R2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSBjb25zdCB7Ci0gIEFTU0VSVChmYl9idWlsZGVyICE9IG51bGxwdHIpOwotCi0gIHN0ZDo6cHJvbWlzZTxmbGF0YnVmZmVyczo6T2Zmc2V0PEwyY2FwQ2xhc3NpY01vZHVsZURhdGE+PiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBwaW1wbF8tPkR1bXAoc3RkOjptb3ZlKHByb21pc2UpLCBmYl9idWlsZGVyKTsKLQotICBhdXRvIGR1bXBzeXNfZGF0YSA9IGZ1dHVyZS5nZXQoKTsKLQotICByZXR1cm4gW2R1bXBzeXNfZGF0YV0oRHVtcHN5c0RhdGFCdWlsZGVyKiBkdW1wc3lzX2J1aWxkZXIpIHsKLSAgICBkdW1wc3lzX2J1aWxkZXItPmFkZF9sMmNhcF9jbGFzc2ljX2R1bXBzeXNfZGF0YShkdW1wc3lzX2RhdGEpOwotICB9OwotfQotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmZicyBiL2dkL2wyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWExMDI0Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuZmJzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotbmFtZXNwYWNlIGJsdWV0b290aC5sMmNhcC5jbGFzc2ljOwotCi1hdHRyaWJ1dGUgInByaXZhY3kiOwotCi10YWJsZSBDaGFubmVsRGF0YSB7Ci0gIGNpZDppbnQ7Ci19Ci0KLXRhYmxlIExpbmtEYXRhIHsKLSAgYWRkcmVzczpzdHJpbmc7Ci0gIGR5bmFtaWNfY2hhbm5lbHM6W0NoYW5uZWxEYXRhXTsKLSAgZml4ZWRfY2hhbm5lbHM6W0NoYW5uZWxEYXRhXTsKLX0KLQotdGFibGUgTDJjYXBDbGFzc2ljTW9kdWxlRGF0YSB7Ci0gICAgdGl0bGU6c3RyaW5nIChwcml2YWN5OiJBbnkiKTsKLSAgICBhY3RpdmVfbGlua3M6W0xpbmtEYXRhXSAocHJpdmFjeToiQW55Iik7Ci19Ci0KLXJvb3RfdHlwZSBMMmNhcENsYXNzaWNNb2R1bGVEYXRhOwpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjJmMDM5Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbGlua19wcm9wZXJ0eV9saXN0ZW5lci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbGlua19zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL3NlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLWNsYXNzIFNlY3VyaXR5TW9kdWxlOwotfQotCi1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi1jbGFzcyBMMmNhcENsYXNzaWNNb2R1bGUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgTDJjYXBDbGFzc2ljTW9kdWxlKCk7Ci0gIHZpcnR1YWwgfkwyY2FwQ2xhc3NpY01vZHVsZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFwaSB0byB0aGUgY2xhc3NpYyBmaXhlZCBjaGFubmVsIGwyY2FwIG1vZHVsZQotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsTWFuYWdlcj4gR2V0Rml4ZWRDaGFubmVsTWFuYWdlcigpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFwaSB0byB0aGUgY2xhc3NpYyBkeW5hbWljIGNoYW5uZWwgbDJjYXAgbW9kdWxlCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbE1hbmFnZXI+IEdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0gIC8qKgotICAgKiBPbmx5IGZvciB0aGUgY2xhc3NpYyBzZWN1cml0eSBtb2R1bGUgdG8gaW5qZWN0IGZ1bmN0aW9uYWxpdHkgdG8gZW5mb3JjZSBzZWN1cml0eSBsZXZlbCBmb3IgYSBjb25uZWN0aW9uLiBXaGVuCi0gICAqIGNsYXNzaWMgc2VjdXJpdHkgbW9kdWxlIGlzIHN0b3BwaW5nLCBpbmplY3QgbnVsbHB0ci4gTm90ZTogV2UgZXhwZWN0IHRoaXMgb25seSB0byBiZSBjYWxsZWQgZHVyaW5nIHN0YWNrIHN0YXJ0dXAuCi0gICAqIFRoaXMgaXMgbm90IHN5bmNocm9uaXplZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBJbmplY3RTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UqIHNlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaW50ZXJmYWNlIGZvciBTZWN1cml0eSBNb2R1bGUgdG8gYWNjZXNzIGxpbmsgZnVuY3Rpb24uCi0gICAqIFNlY3VyaXR5IE1vZHVsZSBuZWVkcyB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yIEFDTCBsaW5rIGNvbm5lY3RlZCBhbmQgZGlzY29ubmVjdGVkLiBXaGVuIGNvbm5lY3RlZCwgZWl0aGVyIGJ5Ci0gICAqIGluY29taW5nIG9yIGJ5IG91dGdvaW5nIGNvbm5lY3Rpb24gcmVxdWVzdCwgU2VjdXJpdHkgTW9kdWxlIHJlY2VpdmVzIGEgTGlua1NlY3VyaXR5SW50ZXJmYWNlIHByb3h5LCB3aGljaCBjYW4gYmUKLSAgICogdXNlZCB0byBhY2Nlc3Mgc29tZSBsaW5rIGZ1bmN0aW9ubGl0aWVzLgotICAgKi8KLSAgdmlydHVhbCBTZWN1cml0eUludGVyZmFjZSogR2V0U2VjdXJpdHlJbnRlcmZhY2Uob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgZnJpZW5kIHNlY3VyaXR5OjpTZWN1cml0eU1vZHVsZTsKLQotICAvKioKLSAgICogU2V0IHRoZSBsaW5rIHByb3BlcnR5IGxpc3RlbmVyLgotICAgKiBUaGlzIGlzIG5vdCBzeW5jaHJvbml6ZWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgU2V0TGlua1Byb3BlcnR5TGlzdGVuZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtQcm9wZXJ0eUxpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotICBEdW1wc3lzRGF0YUZpbmlzaGVyIEdldER1bXBzeXNEYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogYnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAvLyBNb2R1bGUKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBpbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW1wbD4gcGltcGxfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMMmNhcENsYXNzaWNNb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZV9tb2NrLmggYi9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1Mjg1NC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tMMmNhcENsYXNzaWNNb2R1bGUgOiBwdWJsaWMgTDJjYXBDbGFzc2ljTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxNYW5hZ2VyPiwgR2V0Rml4ZWRDaGFubmVsTWFuYWdlciwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxNYW5hZ2VyPiwgR2V0RHluYW1pY0NoYW5uZWxNYW5hZ2VyLCAoKSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvY2xhc3NpYy9saW5rX3Byb3BlcnR5X2xpc3RlbmVyLmggYi9nZC9sMmNhcC9jbGFzc2ljL2xpbmtfcHJvcGVydHlfbGlzdGVuZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4NTA3NC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2xpbmtfcHJvcGVydHlfbGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGNsYXNzaWMgewotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGxpc3RlbmVyIGludGVyZmFjZSBmb3IgbGluayBwcm9wZXJ0eSBjYWxsYmFja3MuCi0gKi8KLWNsYXNzIExpbmtQcm9wZXJ0eUxpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkxpbmtQcm9wZXJ0eUxpc3RlbmVyKCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gYW4gQUNMIGxpbmsgaXMgY29ubmVjdGVkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uTGlua0Nvbm5lY3RlZChoY2k6OkFkZHJlc3MgcmVtb3RlLCB1aW50MTZfdCBoYW5kbGUpIHt9Ci0KLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiBhbiBBQ0wgbGluayBpcyBkaXNjb25uZWN0ZWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25MaW5rRGlzY29ubmVjdGVkKGhjaTo6QWRkcmVzcyByZW1vdGUpIHt9Ci0KLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiByZWNlaXZlZCByZW1vdGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBsaW5rCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywKLSAgICAgIGhjaTo6QWRkcmVzcyByZW1vdGUsCi0gICAgICB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsCi0gICAgICB1aW50MTZfdCBzdWJfdmVyc2lvbikge30KLQotICAvKioKLSAgICogSW52b2tlZCB3aGVuIHJlY2VpdmVkIHJlbW90ZSBmZWF0dXJlcyBhbmQgcmVtb3RlIHN1cHBvcnRlZCBmZWF0dXJlcyBmb3IgYSBnaXZlbiBsaW5rCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25SZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoaGNpOjpBZGRyZXNzIHJlbW90ZSwgdWludDY0X3QgZmVhdHVyZXMpIHt9Ci0KLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiByZWNlaXZlZCByZW1vdGUgZmVhdHVyZXMgYW5kIHJlbW90ZSBleHRlbmRlZCBmZWF0dXJlcyBmb3IgYSBnaXZlbiBsaW5rCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygKLSAgICAgIGhjaTo6QWRkcmVzcyByZW1vdGUsIHVpbnQ4X3QgcGFnZV9udW1iZXIsIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcykge30KLQotICAvKioKLSAgICogSW52b2tlZCB3aGVuIHJlY2VpdmVkIHJvbGUgY2hhbmdlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6QWRkcmVzcyByZW1vdGUsIGhjaTo6Um9sZSByb2xlKSB7fQotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gcmVjZWl2ZWQgY2xvY2sgb2Zmc2V0Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25SZWFkQ2xvY2tPZmZzZXQoaGNpOjpBZGRyZXNzIHJlbW90ZSwgdWludDE2X3QgY2xvY2tfb2Zmc2V0KSB7fQotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gcmVjZWl2ZWQgbW9kZSBjaGFuZ2UKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbk1vZGVDaGFuZ2UoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgaGNpOjpBZGRyZXNzIHJlbW90ZSwgaGNpOjpNb2RlIG1vZGUsIHVpbnQxNl90IGludGVydmFsKSB7fQotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gcmVjZWl2ZWQgc25pZmYgc3VicmF0aW5nCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25TbmlmZlN1YnJhdGluZygKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICBoY2k6OkFkZHJlc3MgcmVtb3RlLAotICAgICAgdWludDE2X3QgbWF4X3R4X2xhdCwKLSAgICAgIHVpbnQxNl90IG1heF9yeF9sYXQsCi0gICAgICB1aW50MTZfdCBtaW5fcmVtb3RlX3RpbWVvdXQsCi0gICAgICB1aW50MTZfdCBtaW5fbG9jYWxfdGltZW91dCkge30KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvbGlua19zZWN1cml0eV9pbnRlcmZhY2UuaCBiL2dkL2wyY2FwL2NsYXNzaWMvbGlua19zZWN1cml0eV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmYWM2Mi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL2xpbmtfc2VjdXJpdHlfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgY2xhc3NpYyB7Ci0KLS8qKgotICogVGhpcyBpcyBhIHByb3h5IGZvciBTZWN1cml0eSBNb2R1bGUgdG8gdW5yZWdpc3RlciBpdHNlbGYsIG9yIHRvIGluaXRpYXRlIGxpbmsgY29ubmVjdGlvbi4KLSAqLwotY2xhc3MgU2VjdXJpdHlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+U2VjdXJpdHlJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIFBhZ2UgYSByZW1vdGUgZGV2aWNlIGZvciBBQ0wgY29ubmVjdGlvbiwgd2hlbiBTZWN1cml0eSBNb2R1bGUgbmVlZHMgaXQgZm9yIHBhaXJpbmcuIFdoZW4gdGhlIHJlbW90ZSBkZXZpY2UgaXMKLSAgICogY29ubmVjdGVkLCBTZWN1cml0eSBNb2R1bGUgd2lsbCByZWNlaXZlIGEgY2FsbGJhY2sgdGhyb3VnaCBMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lci4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBJbml0aWF0ZUNvbm5lY3Rpb25Gb3JTZWN1cml0eShoY2k6OkFkZHJlc3MgcmVtb3RlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFVucmVnaXN0ZXIgdGhlIHNlY3VyaXR5IGludGVyZmFjZSBhbmQgdGhlIExpbmtTZWN1cml0eUludGVyZmFjZUxpc3RlbmVyLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXIoKSA9IDA7Ci19OwotCi0vKioKLSAqIFRoaXMgaXMgYSBwcm94eSBmb3IgU2VjdXJpdHkgTW9kdWxlIHRvIGFjY2VzcyBzb21lIGxpbmsgZnVuY3Rpb24uIFRoaXMgb2JqZWN0IGlzIHBhc3NlZCB0byBTZWN1cml0eSBNb2R1bGUgd2hlbiBhCi0gKiBsaW5rIGlzIGVzdGFibGlzaGVkLgotICovCi1jbGFzcyBMaW5rU2VjdXJpdHlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+TGlua1NlY3VyaXR5SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgaGNpOjpBZGRyZXNzIEdldFJlbW90ZUFkZHJlc3MoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEhvbGQgdGhlIEFDTCBsaW5rIGNvbm5lY3Rpb24uIERvbid0IGRpc2Nvbm5lY3QgdGhlIGxpbmsgdW50aWwgUmVsZWFzZSgpIGlzIGNhbGxlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBIb2xkKCkgPSAwOwotCi0gIC8qKgotICAgKiBSZWxlYXNlIHRoZSBBQ0wgbGluayBjb25uZWN0aW9uLiBUaGlzIGRvZXNuJ3QgZ3VhcmFudGVlIGxpbmsgZGlzY29ubmVjdGlvbiwgaWYgb3RoZXIgTDJjYXAgc2VydmljZXMgYXJlIHVzaW5nIHRoZQotICAgKiBsaW5rLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBBQ0wgbGluayB0byBkaXNjb25uZWN0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlIHBhaXJpbmcgdG8gSENJIGxheWVyLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIEVuc3VyZUF1dGhlbnRpY2F0ZWQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGVuY3J5cHRpb24gb24gYW4gYXV0aGVudGljYXRlZCBsaW5rIChub3QgbmVjZXNzYXJpbHkgTUlUTSBsaW5rIGtleSkuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgRW5zdXJlRW5jcnlwdGVkKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDE2X3QgR2V0QWNsSGFuZGxlKCkgPSAwOwotCi0gIHZpcnR1YWwgaGNpOjpSb2xlIEdldFJvbGUoKSB7Ci0gICAgcmV0dXJuIGhjaTo6Um9sZTo6Q0VOVFJBTDsKLSAgfQotfTsKLQotY2xhc3MgTGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+TGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIEVhY2ggdGltZSB3aGVuIGFuIEFDTCBsaW5rIGlzIGNvbm5lY3RlZCwgc2VjdXJpdHkgbWFuYWdlciByZWNlaXZlcyB0aGlzIGNhbGxiYWNrIHRvIHVzZSBMaW5rU2VjdXJpdHlJbnRlcmZhY2UKLSAgICogZnVuY3Rpb25zLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uTGlua0Nvbm5lY3RlZChzdGQ6OnVuaXF1ZV9wdHI8TGlua1NlY3VyaXR5SW50ZXJmYWNlPikge30KLQotICAvKioKLSAgICogV2hlbiBhbiBBQ0wgbGluayBpcyBkaXNjb25uZWN0ZWQsIHNlY3VyaXR5IG1hbmFnZXIgcmVjZWl2ZXMgdGhpcyBjYWxsYmFjay4gVGhlIGNvcnJlc3BvbmRpbmcgTGlua1NlY3VyaXR5SW50ZXJmYWNlCi0gICAqIGlzIGludmFsaWRhdGVkIHRoZW4uCi0gICAqIEBwYXJhbSByZW1vdGUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoaGNpOjpBZGRyZXNzIHJlbW90ZSkge30KLQotICAvKioKLSAgICogSW52b2tlZCB3aGVuIEF1dGhlbnRpY2F0aW9uQ29tcGxldGUgZXZlbnQgaXMgcmVjZWl2ZWQgZm9yIGEgZ2l2ZW4gbGluawotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uQXV0aGVudGljYXRpb25Db21wbGV0ZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCBoY2k6OkFkZHJlc3MgcmVtb3RlKSB7fQotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gRW5jcnlwdGlvbkNoYW5nZSBldmVudCBpcyByZWNlaXZlZCBmb3IgYSBnaXZlbiBsaW5rCi0gICAqIEBwYXJhbSBlbmNyeXB0ZWQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkVuY3J5cHRpb25DaGFuZ2UoaGNpOjpBZGRyZXNzIHJlbW90ZSwgYm9vbCBlbmNyeXB0ZWQpIHt9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9jbGFzc2ljL3NlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZS5oIGIvZ2QvbDJjYXAvY2xhc3NpYy9zZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNWM3YS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9jbGFzc2ljL3NlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vY29udGV4dHVhbF9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvc2VjdXJpdHlfcG9saWN5LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBTZWN1cml0eSBNb2R1bGUgdG8gaW1wbGVtZW50LgotICovCi1jbGFzcyBTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdXNpbmcgUmVzdWx0Q2FsbGJhY2sgPSBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChib29sKT47Ci0KLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiBMMkNBUCBuZWVkcyB0byBvcGVuIGEgY2hhbm5lbCB3aXRoIGdpdmVuIHNlY3VyaXR5IHJlcXVpcmVtZW50LiBXaGVuIHRoZSBTZWN1cml0eSBNb2R1bGUgc2F0aXNmaWVzIHRoZQotICAgKiByZXF1aXJlZCBzZWN1cml0eSBsZXZlbCwgb3IgY2Fubm90IHNhdGlzZnkgYXQgYWxsLCBpbnZva2UgdGhlIHJlc3VsdF9jYWxsYmFjay4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBFbmZvcmNlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgU2VjdXJpdHlQb2xpY3kgcG9saWN5LCBSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spID0gMDsKLX07Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGNhbm5vdCBzYXRpc2Z5IGFueSBzZWN1cml0eSBsZXZlbCBleGNlcHQKLSAqIF9TRFBfT05MWV9OT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0suCi0gKi8KLWNsYXNzIFNlY3VyaXR5RW5mb3JjZW1lbnRSZWplY3RBbGxJbXBsIDogcHVibGljIFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdm9pZCBFbmZvcmNlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgU2VjdXJpdHlQb2xpY3kgcG9saWN5LCBSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spIG92ZXJyaWRlIHsKLSAgICBpZiAocG9saWN5ID09IFNlY3VyaXR5UG9saWN5OjpfU0RQX09OTFlfTk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LKSB7Ci0gICAgICByZXN1bHRfY2FsbGJhY2suSW52b2tlSWZOb3RFbXB0eSh0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0X2NhbGxiYWNrLkludm9rZUlmTm90RW1wdHkoZmFsc2UpOwotICAgIH0KLSAgfQotfTsKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2NsYXNzaWMvc2VjdXJpdHlfcG9saWN5LmggYi9nZC9sMmNhcC9jbGFzc2ljL3NlY3VyaXR5X3BvbGljeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGUyOTdmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2NsYXNzaWMvc2VjdXJpdHlfcG9saWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLQotZW51bSBjbGFzcyBTZWN1cml0eVBvbGljeSB7Ci0gIC8vIFByZWRlZmluZWQgc2VjdXJpdHkgcG9saWNpZXMgZm9yIHVzZXIgdG8gcGljawotCi0gIC8vIEp1c3QgZW5jcnlwdGlvbiwgYnV0IG5vIE1JVE0KLSAgRU5DUllQVEVEX1RSQU5TUE9SVCwKLQotICAvLyBJbXBsaWNpdGx5IE1JVE0gcHJvdGVjdGVkCi0gIEFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVCwKLQotICAvLyBTYW1lIGFzIEFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVAotICBCRVNULAotCi0gIC8vIE5vIHNlY3VyaXR5IGVuZm9yY2VkLiBTRFAgb25seS4KLSAgX1NEUF9PTkxZX05PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSywKLQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNsYXNzaWMKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvZHluYW1pY19jaGFubmVsLmNjIGIvZ2QvbDJjYXAvZHluYW1pY19jaGFubmVsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDlhZWQ3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2R5bmFtaWNfY2hhbm5lbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9keW5hbWljX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLQotaGNpOjpBZGRyZXNzV2l0aFR5cGUgRHluYW1pY0NoYW5uZWw6OkdldERldmljZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5HZXREZXZpY2UoKTsKLX0KLQotdm9pZCBEeW5hbWljQ2hhbm5lbDo6UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soRHluYW1pY0NoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjaykgewotICBsMmNhcF9oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgaW1wbF8uZ2V0KCksICZsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsSW1wbDo6UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2ssIHN0ZDo6bW92ZShvbl9jbG9zZV9jYWxsYmFjaykpOwotfQotCi12b2lkIER5bmFtaWNDaGFubmVsOjpDbG9zZSgpIHsKLSAgbDJjYXBfaGFuZGxlcl8tPkNhbGxPbihpbXBsXy5nZXQoKSwgJmwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsOjpDbG9zZSk7Ci19Ci0KLWNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXIsIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+PioKLUR5bmFtaWNDaGFubmVsOjpHZXRRdWV1ZVVwRW5kKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPkdldFF1ZXVlVXBFbmQoKTsKLX0KLQotQ2lkIER5bmFtaWNDaGFubmVsOjpIQUNLX0dldFJlbW90ZUNpZCgpIHsKLSAgcmV0dXJuIGltcGxfLT5HZXRSZW1vdGVDaWQoKTsKLX0KLQotdm9pZCBEeW5hbWljQ2hhbm5lbDo6SEFDS19TZXRDaGFubmVsVHhQcmlvcml0eShib29sIGhpZ2hfcHJpb3JpdHkpIHsKLSAgcmV0dXJuIGltcGxfLT5TZXRDaGFubmVsVHhQcmlvcml0eShoaWdoX3ByaW9yaXR5KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9keW5hbWljX2NoYW5uZWwuaCBiL2dkL2wyY2FwL2R5bmFtaWNfY2hhbm5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTRlNzUwLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2R5bmFtaWNfY2hhbm5lbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgRHluYW1pY0NoYW5uZWxJbXBsOwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8qKgotICogTDJDQVAgRHluYW1pYyBjaGFubmVsIG9iamVjdC4gVXNlciBuZWVkcyB0byBjYWxsIENsb3NlKCkgd2hlbiB1c2VyIG5vIGxvbmdlciB3YW50cyB0byB1c2UgaXQuIE90aGVyd2lzZSB0aGUgbGluawotICogd29uJ3QgYmUgZGlzY29ubmVjdGVkLgotICovCi1jbGFzcyBEeW5hbWljQ2hhbm5lbCB7Ci0gcHVibGljOgotICAvLyBTaG91bGQgb25seSBiZSBjb25zdHJ1Y3RlZCBieSBtb2R1bGVzIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gTGlua01hbmFnZXIKLSAgRHluYW1pY0NoYW5uZWwoc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiBpbXBsLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcikKLSAgICAgIDogaW1wbF8oc3RkOjptb3ZlKGltcGwpKSwgbDJjYXBfaGFuZGxlcl8obDJjYXBfaGFuZGxlcikgewotICAgIEFTU0VSVChpbXBsXyAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQobDJjYXBfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLQotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBHZXREZXZpY2UoKSBjb25zdDsKLQotICAvKioKLSAgICogUmVnaXN0ZXIgY2xvc2UgY2FsbGJhY2suIElmIGNsb3NlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIHdoZW4gYSBjaGFubmVsIGlzIGNsb3NlZCwgdGhlIGNoYW5uZWwncyByZXNvdXJjZSB3aWxsCi0gICAqIG9ubHkgYmUgZnJlZWQgYWZ0ZXIgb25fY2xvc2UgY2FsbGJhY2sgaXMgaW52b2tlZC4gT3RoZXJ3aXNlLCBpZiBubyBvbl9jbG9zZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCB0aGUgY2hhbm5lbCdzCi0gICAqIHJlc291cmNlIHdpbGwgYmUgZnJlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2xvc2luZy4KLSAgICoKLSAgICogQHBhcmFtIG9uX2Nsb3NlX2NhbGxiYWNrIFRoZSBjYWxsYmFjayBpbnZva2VkIHVwb24gY2hhbm5lbCBjbG9zaW5nLgotICAgKi8KLSAgdXNpbmcgT25DbG9zZUNhbGxiYWNrID0gY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpFcnJvckNvZGUpPjsKLSAgdm9pZCBSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhPbkNsb3NlQ2FsbGJhY2sgb25fY2xvc2VfY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgRHluYW1pYyBDaGFubmVsIHNob3VsZCBiZSBjbG9zZWQuIE9uQ2xvc2VDYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2hlbiBjaGFubmVsIGNsb3NlIGlzIGRvbmUuCi0gICAqIEwyY2F5IGxheWVyIG1heSB0ZXJtaW5hdGUgdGhpcyBBQ0wgY29ubmVjdGlvbiB0byBmcmVlIHRoZSByZXNvdXJjZSBhZnRlciBjaGFubmVsIGlzIGNsb3NlZC4KLSAgICovCi0gIHZvaWQgQ2xvc2UoKTsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgZGF0YSBjaGFubmVsIHF1ZXVlIHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KLSAgICoKLSAgICoge0BzZWUgQmlkaVF1ZXVlRW5kfQotICAgKgotICAgKiBAcmV0dXJuIFRoZSB1cHBlciBlbmQgb2YgYSBiaS1kaXJlY3Rpb25hbCBxdWV1ZS4KLSAgICovCi0gIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXIsIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+PiogR2V0UXVldWVVcEVuZCgpIGNvbnN0OwotCi0gIENpZCBIQUNLX0dldFJlbW90ZUNpZCgpOwotCi0gIC8qKgotICAgKiBVc2VkIGJ5IEEyZHAgc29mdHdhcmUgZW5jb2RpbmcgdG8gcHJpb3JpdGl6ZSBUeCBvZiB0aGlzIGNoYW5uZWwKLSAgICogQHBhcmFtIGhpZ2hfcHJpb3JpdHkKLSAgICovCi0gIHZvaWQgSEFDS19TZXRDaGFubmVsVHhQcmlvcml0eShib29sIGhpZ2hfcHJpb3JpdHkpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiBpbXBsXzsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9mY3MuY2MgYi9nZC9sMmNhcC9mY3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDc4Y2MuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvZmNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2Zjcy5oIgotCi1uYW1lc3BhY2UgewotLy8gVGFibGUgZm9yIG9wdGltaXppbmcgdGhlIENSQyBjYWxjdWxhdGlvbiwgd2hpY2ggaXMgYSBiaXR3aXNlIG9wZXJhdGlvbi4KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBjcmN0YWJbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4YzBjMSwgMHhjMTgxLCAweDAxNDAsIDB4YzMwMSwgMHgwM2MwLCAweDAyODAsIDB4YzI0MSwgMHhjNjAxLCAweDA2YzAsIDB4MDc4MCwgMHhjNzQxLCAweDA1MDAsIDB4YzVjMSwKLSAgICAweGM0ODEsIDB4MDQ0MCwgMHhjYzAxLCAweDBjYzAsIDB4MGQ4MCwgMHhjZDQxLCAweDBmMDAsIDB4Y2ZjMSwgMHhjZTgxLCAweDBlNDAsIDB4MGEwMCwgMHhjYWMxLCAweGNiODEsIDB4MGI0MCwKLSAgICAweGM5MDEsIDB4MDljMCwgMHgwODgwLCAweGM4NDEsIDB4ZDgwMSwgMHgxOGMwLCAweDE5ODAsIDB4ZDk0MSwgMHgxYjAwLCAweGRiYzEsIDB4ZGE4MSwgMHgxYTQwLCAweDFlMDAsIDB4ZGVjMSwKLSAgICAweGRmODEsIDB4MWY0MCwgMHhkZDAxLCAweDFkYzAsIDB4MWM4MCwgMHhkYzQxLCAweDE0MDAsIDB4ZDRjMSwgMHhkNTgxLCAweDE1NDAsIDB4ZDcwMSwgMHgxN2MwLCAweDE2ODAsIDB4ZDY0MSwKLSAgICAweGQyMDEsIDB4MTJjMCwgMHgxMzgwLCAweGQzNDEsIDB4MTEwMCwgMHhkMWMxLCAweGQwODEsIDB4MTA0MCwgMHhmMDAxLCAweDMwYzAsIDB4MzE4MCwgMHhmMTQxLCAweDMzMDAsIDB4ZjNjMSwKLSAgICAweGYyODEsIDB4MzI0MCwgMHgzNjAwLCAweGY2YzEsIDB4Zjc4MSwgMHgzNzQwLCAweGY1MDEsIDB4MzVjMCwgMHgzNDgwLCAweGY0NDEsIDB4M2MwMCwgMHhmY2MxLCAweGZkODEsIDB4M2Q0MCwKLSAgICAweGZmMDEsIDB4M2ZjMCwgMHgzZTgwLCAweGZlNDEsIDB4ZmEwMSwgMHgzYWMwLCAweDNiODAsIDB4ZmI0MSwgMHgzOTAwLCAweGY5YzEsIDB4Zjg4MSwgMHgzODQwLCAweDI4MDAsIDB4ZThjMSwKLSAgICAweGU5ODEsIDB4Mjk0MCwgMHhlYjAxLCAweDJiYzAsIDB4MmE4MCwgMHhlYTQxLCAweGVlMDEsIDB4MmVjMCwgMHgyZjgwLCAweGVmNDEsIDB4MmQwMCwgMHhlZGMxLCAweGVjODEsIDB4MmM0MCwKLSAgICAweGU0MDEsIDB4MjRjMCwgMHgyNTgwLCAweGU1NDEsIDB4MjcwMCwgMHhlN2MxLCAweGU2ODEsIDB4MjY0MCwgMHgyMjAwLCAweGUyYzEsIDB4ZTM4MSwgMHgyMzQwLCAweGUxMDEsIDB4MjFjMCwKLSAgICAweDIwODAsIDB4ZTA0MSwgMHhhMDAxLCAweDYwYzAsIDB4NjE4MCwgMHhhMTQxLCAweDYzMDAsIDB4YTNjMSwgMHhhMjgxLCAweDYyNDAsIDB4NjYwMCwgMHhhNmMxLCAweGE3ODEsIDB4Njc0MCwKLSAgICAweGE1MDEsIDB4NjVjMCwgMHg2NDgwLCAweGE0NDEsIDB4NmMwMCwgMHhhY2MxLCAweGFkODEsIDB4NmQ0MCwgMHhhZjAxLCAweDZmYzAsIDB4NmU4MCwgMHhhZTQxLCAweGFhMDEsIDB4NmFjMCwKLSAgICAweDZiODAsIDB4YWI0MSwgMHg2OTAwLCAweGE5YzEsIDB4YTg4MSwgMHg2ODQwLCAweDc4MDAsIDB4YjhjMSwgMHhiOTgxLCAweDc5NDAsIDB4YmIwMSwgMHg3YmMwLCAweDdhODAsIDB4YmE0MSwKLSAgICAweGJlMDEsIDB4N2VjMCwgMHg3ZjgwLCAweGJmNDEsIDB4N2QwMCwgMHhiZGMxLCAweGJjODEsIDB4N2M0MCwgMHhiNDAxLCAweDc0YzAsIDB4NzU4MCwgMHhiNTQxLCAweDc3MDAsIDB4YjdjMSwKLSAgICAweGI2ODEsIDB4NzY0MCwgMHg3MjAwLCAweGIyYzEsIDB4YjM4MSwgMHg3MzQwLCAweGIxMDEsIDB4NzFjMCwgMHg3MDgwLCAweGIwNDEsIDB4NTAwMCwgMHg5MGMxLCAweDkxODEsIDB4NTE0MCwKLSAgICAweDkzMDEsIDB4NTNjMCwgMHg1MjgwLCAweDkyNDEsIDB4OTYwMSwgMHg1NmMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1YzEsIDB4OTQ4MSwgMHg1NDQwLCAweDljMDEsIDB4NWNjMCwKLSAgICAweDVkODAsIDB4OWQ0MSwgMHg1ZjAwLCAweDlmYzEsIDB4OWU4MSwgMHg1ZTQwLCAweDVhMDAsIDB4OWFjMSwgMHg5YjgxLCAweDViNDAsIDB4OTkwMSwgMHg1OWMwLCAweDU4ODAsIDB4OTg0MSwKLSAgICAweDg4MDEsIDB4NDhjMCwgMHg0OTgwLCAweDg5NDEsIDB4NGIwMCwgMHg4YmMxLCAweDhhODEsIDB4NGE0MCwgMHg0ZTAwLCAweDhlYzEsIDB4OGY4MSwgMHg0ZjQwLCAweDhkMDEsIDB4NGRjMCwKLSAgICAweDRjODAsIDB4OGM0MSwgMHg0NDAwLCAweDg0YzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdjMCwgMHg0NjgwLCAweDg2NDEsIDB4ODIwMSwgMHg0MmMwLCAweDQzODAsIDB4ODM0MSwKLSAgICAweDQxMDAsIDB4ODFjMSwgMHg4MDgxLCAweDQwNDAsCi19OwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLQotdm9pZCBGY3M6OkluaXRpYWxpemUoKSB7Ci0gIGNyYyA9IDA7Ci19Ci0KLXZvaWQgRmNzOjpBZGRCeXRlKHVpbnQ4X3QgYnl0ZSkgewotICBjcmMgPSAoKGNyYyA+PiA4KSAmIDB4MDBmZikgXiBjcmN0YWJbKGNyYyAmIDB4MDBmZikgXiBieXRlXTsKLX0KLQotdWludDE2X3QgRmNzOjpHZXRDaGVja3N1bSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNyYzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9mY3MuaCBiL2dkL2wyY2FwL2Zjcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjdmYTlkLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2Zjcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci0KLS8vIEZyYW1lIENoZWNrIFNlcXVlbmNlIGZyb20gdGhlIEwyQ0FQIHNwZWMuCi1jbGFzcyBGY3MgewotIHB1YmxpYzoKLSAgdm9pZCBJbml0aWFsaXplKCk7Ci0KLSAgdm9pZCBBZGRCeXRlKHVpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDE2X3QgR2V0Q2hlY2tzdW0oKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHVpbnQxNl90IGNyYzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvZnV6ei9BbmRyb2lkLmJwIGIvZ2QvbDJjYXAvZnV6ei9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDkwN2RiLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2Z1enovQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJibHVldG9vdGhfZ2RfbDJjYXBfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJnZF9mdXp6X2RlZmF1bHRzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL3N5cyIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2RtIiwKLSAgICAgICAgInN5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svbDJjYXAiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2EyZHAiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2J0bSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svYXZkdCIsCi0gICAgICAgICJzeXN0ZW0vYnQvdWRydi9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGlmL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvY28iLAotICAgICAgICAic3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC92bmQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2VtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC91dGlscy9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9zZWN1cml0eS9rZXlzdG9yZS9pbmNsdWRlIiwKLSAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMva2V5bWFzdGVyLzQuMC9zdXBwb3J0L2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiY2hhbm5lbF9mdXp6X2NvbnRyb2xsZXIuY2MiLAotICAgICAgICAiZnV6el9sMmNhcC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnRlIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvZnV6ei9jaGFubmVsX2Z1enpfY29udHJvbGxlci5jYyBiL2dkL2wyY2FwL2Z1enovY2hhbm5lbF9mdXp6X2NvbnRyb2xsZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxNzM4Y2MuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvZnV6ei9jaGFubmVsX2Z1enpfY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyBBdXRob3JzOiBjb3JiaW4uc291ZmZyYW50QGxldmlhdGhhbnNlY3VyaXR5LmNvbQotLy8gICAgICAgICAgZHlsYW4ua2F0ekBsZXZpYXRoYW5zZWN1cml0eS5jb20KLQotI2luY2x1ZGUgImNoYW5uZWxfZnV6el9jb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotdXNpbmcgbDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpGaXhlZENoYW5uZWxJbXBsOwotdXNpbmcgbDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEltcGw7Ci11c2luZyBvczo6SGFuZGxlcjsKLQotQ2hhbm5lbEZ1enpDb250cm9sbGVyOjpDaGFubmVsRnV6ekNvbnRyb2xsZXIoSGFuZGxlciogbDJjYXBfaGFuZGxlciwgc3RkOjpzaGFyZWRfcHRyPER5bmFtaWNDaGFubmVsSW1wbD4gY2hhbikgewotICBFbnF1ZXVlVHlwZSogcXVldWUgPSByZWludGVycHJldF9jYXN0PEVucXVldWVUeXBlKj4oY2hhbi0+R2V0UXVldWVVcEVuZCgpKTsKLSAgY2hhbm5lbEluamVjdF8gPSBzdGQ6Om1ha2Vfc2hhcmVkPENoYW5uZWxGdXp6UXVldWVUeXBlPihxdWV1ZSwgbDJjYXBfaGFuZGxlcik7Ci19Ci0KLUNoYW5uZWxGdXp6Q29udHJvbGxlcjo6Q2hhbm5lbEZ1enpDb250cm9sbGVyKEhhbmRsZXIqIGwyY2FwX2hhbmRsZXIsIHN0ZDo6c2hhcmVkX3B0cjxGaXhlZENoYW5uZWxJbXBsPiBjaGFuKSB7Ci0gIEVucXVldWVUeXBlKiBxdWV1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RW5xdWV1ZVR5cGUqPihjaGFuLT5HZXRRdWV1ZVVwRW5kKCkpOwotICBjaGFubmVsSW5qZWN0XyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2hhbm5lbEZ1enpRdWV1ZVR5cGU+KHF1ZXVlLCBsMmNhcF9oYW5kbGVyKTsKLX0KLQotdm9pZCBDaGFubmVsRnV6ekNvbnRyb2xsZXI6OmluamVjdEZyYW1lKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgQ09OU1RSVUNUX1ZBTElEX1VOSVFVRV9PVEhFUldJU0VfQkFJTChsMmNhcDo6QmFzaWNGcmFtZVZpZXcsIHBhY2tldCwgZGF0YSk7Ci0gIGNoYW5uZWxJbmplY3RfLT5JbmplY3Qoc3RkOjptb3ZlKHBhY2tldCkpOwotfQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvZnV6ei9jaGFubmVsX2Z1enpfY29udHJvbGxlci5oIGIvZ2QvbDJjYXAvZnV6ei9jaGFubmVsX2Z1enpfY29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGUyMDI2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2Z1enovY2hhbm5lbF9mdXp6X2NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyBBdXRob3JzOiBjb3JiaW4uc291ZmZyYW50QGxldmlhdGhhbnNlY3VyaXR5LmNvbQotLy8gICAgICAgICAgZHlsYW4ua2F0ekBsZXZpYXRoYW5zZWN1cml0eS5jb20KLQotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSAiZ2QvZnV6ei9oZWxwZXJzLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy9mdXp6L2Z1enpfaW5qZWN0X3F1ZXVlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotdHlwZWRlZiBvczo6SVF1ZXVlRW5xdWV1ZTxwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPj4gRW5xdWV1ZVR5cGU7Ci10eXBlZGVmIG9zOjpmdXp6OjpGdXp6SW5qZWN0UXVldWU8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+IENoYW5uZWxGdXp6UXVldWVUeXBlOwotCi1jbGFzcyBDaGFubmVsRnV6ekNvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgQ2hhbm5lbEZ1enpDb250cm9sbGVyKG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyLCBzdGQ6OnNoYXJlZF9wdHI8bDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEltcGw+IGNoYW4pOwotCi0gIENoYW5uZWxGdXp6Q29udHJvbGxlcihvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlciwgc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbD4gY2hhbik7Ci0KLSAgdm9pZCBpbmplY3RQYWNrZXREYXRhKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotCi0gIHZvaWQgaW5qZWN0RnJhbWUoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnNoYXJlZF9wdHI8Q2hhbm5lbEZ1enpRdWV1ZVR5cGU+IGNoYW5uZWxJbmplY3RfOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2Z1enovZnV6el9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5oIGIvZ2QvbDJjYXAvZnV6ei9mdXp6X2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyYjUyOTEuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvZnV6ei9mdXp6X2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8gQXV0aG9yczogY29yYmluLnNvdWZmcmFudEBsZXZpYXRoYW5zZWN1cml0eS5jb20KLS8vICAgICAgICAgIGR5bGFuLmthdHpAbGV2aWF0aGFuc2VjdXJpdHkuY29tCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z2QvbDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oPgotI2luY2x1ZGUgPGdkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfaW1wbC5oPgotI2luY2x1ZGUgPGdkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmg+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9jb25maWd1cmF0aW9uX29wdGlvbi5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL3NlY3VyaXR5X3BvbGljeS5oIgotI2luY2x1ZGUgImwyY2FwL3BzbS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotI2luY2x1ZGUgImZ1enpfZHluYW1pY19jaGFubmVsX21hbmFnZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLW5hbWVzcGFjZSB7Ci1jbGFzcyBGdXp6RHluYW1pY0NoYW5uZWxNYW5hZ2VyIDogcHVibGljIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXIgewotIHB1YmxpYzoKLSAgdm9pZCBDb25uZWN0Q2hhbm5lbCgKLSAgICAgIGhjaTo6QWRkcmVzcyBkZXZpY2UsCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICAgICAgbDJjYXA6OlBzbSBwc20sCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fb3Blbl9jYWxsYmFjaywKLSAgICAgIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgaW1wbF8uQ29ubmVjdENoYW5uZWwoZGV2aWNlLCBjb25maWd1cmF0aW9uX29wdGlvbiwgcHNtLCBzdGQ6Om1vdmUob25fb3Blbl9jYWxsYmFjayksIHN0ZDo6bW92ZShvbl9mYWlsX2NhbGxiYWNrKSk7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyU2VydmljZSgKLSAgICAgIGwyY2FwOjpQc20gcHNtLAotICAgICAgbDJjYXA6OmNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWd1cmF0aW9uX29wdGlvbiwKLSAgICAgIGNvbnN0IGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeSYgc2VjdXJpdHlfcG9saWN5LAotICAgICAgbDJjYXA6OmNsYXNzaWM6OkR5bmFtaWNDaGFubmVsTWFuYWdlcjo6T25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSwKLSAgICAgIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9vcGVuX2NhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgaW1wbF8uUmVnaXN0ZXJTZXJ2aWNlKAotICAgICAgICBwc20sIGNvbmZpZ3VyYXRpb25fb3B0aW9uLCBzZWN1cml0eV9wb2xpY3ksIHN0ZDo6bW92ZShvbl9yZWdpc3RyYXRpb25fY29tcGxldGUpLCBzdGQ6Om1vdmUob25fb3Blbl9jYWxsYmFjaykpOwotICB9Ci0gIEZ1enpEeW5hbWljQ2hhbm5lbE1hbmFnZXIoRnV6ekR5bmFtaWNDaGFubmVsTWFuYWdlckltcGwmIGltcGwpIDogaW1wbF8oaW1wbCkge30KLSAgRnV6ekR5bmFtaWNDaGFubmVsTWFuYWdlckltcGwmIGltcGxfOwotfTsKLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2Z1enovZnV6el9keW5hbWljX2NoYW5uZWxfbWFuYWdlcl9pbXBsLmggYi9nZC9sMmNhcC9mdXp6L2Z1enpfZHluYW1pY19jaGFubmVsX21hbmFnZXJfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OTYyYzY1Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2Z1enovZnV6el9keW5hbWljX2NoYW5uZWxfbWFuYWdlcl9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCi0vLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdkL2wyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmg+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfY29uZmlndXJhdGlvbl9vcHRpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9zZWN1cml0eV9wb2xpY3kuaCIKLSNpbmNsdWRlICJsMmNhcC9wc20uaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotbmFtZXNwYWNlIHsKLWNsYXNzIEZ1enpEeW5hbWljQ2hhbm5lbE1hbmFnZXJJbXBsIHsKLSBwdWJsaWM6Ci0gIHZvaWQgQ29ubmVjdENoYW5uZWwoCi0gICAgICBoY2k6OkFkZHJlc3MgZGV2aWNlLAotICAgICAgbDJjYXA6OmNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWd1cmF0aW9uX29wdGlvbiwKLSAgICAgIGwyY2FwOjpQc20sCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fb3Blbl9jYWxsYmFjaywKLSAgICAgIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrKSB7Ci0gICAgY29ubmVjdGlvbnNfKys7Ci0gICAgb25fb3Blbl9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fb3Blbl9jYWxsYmFjayk7Ci0gICAgb25fZmFpbF9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fZmFpbF9jYWxsYmFjayk7Ci0KLSAgICBjb25uZWN0ZWRfcHJvbWlzZV8uc2V0X3ZhbHVlKCk7Ci0gIH0KLSAgaW50IGNvbm5lY3Rpb25zX3swfTsKLQotICB2b2lkIFJlZ2lzdGVyU2VydmljZSgKLSAgICAgIGwyY2FwOjpQc20sCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uLAotICAgICAgY29uc3QgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5JiwKLSAgICAgIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUsCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fb3Blbl9jYWxsYmFjaykgewotICAgIHNlcnZpY2VzXysrOwotICAgIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV8gPSBzdGQ6Om1vdmUob25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlKTsKLSAgICBvbl9vcGVuX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShvbl9vcGVuX2NhbGxiYWNrKTsKLQotICAgIHJlZ2lzdGVyX3Byb21pc2VfLnNldF92YWx1ZSgpOwotICB9Ci0gIGludCBzZXJ2aWNlc197MH07Ci0KLSAgdm9pZCBTZXRDb25uZWN0aW9uRnV0dXJlKCkgewotICAgIGNvbm5lY3RlZF9wcm9taXNlXyA9IHN0ZDo6cHJvbWlzZTx2b2lkPigpOwotICB9Ci0KLSAgdm9pZCBXYWl0Q29ubmVjdGlvbkZ1dHVyZSgpIHsKLSAgICBjb25uZWN0ZWRfZnV0dXJlXyA9IGNvbm5lY3RlZF9wcm9taXNlXy5nZXRfZnV0dXJlKCk7Ci0gICAgY29ubmVjdGVkX2Z1dHVyZV8ud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBTZXRSZWdpc3RyYXRpb25GdXR1cmUoKSB7Ci0gICAgcmVnaXN0ZXJfcHJvbWlzZV8gPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgfQotCi0gIHZvaWQgV2FpdFJlZ2lzdHJhdGlvbkZ1dHVyZSgpIHsKLSAgICByZWdpc3Rlcl9mdXR1cmVfID0gcmVnaXN0ZXJfcHJvbWlzZV8uZ2V0X2Z1dHVyZSgpOwotICAgIHJlZ2lzdGVyX2Z1dHVyZV8ud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBTZXRDb25uZWN0aW9uT25GYWlsKGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgcmVzdWx0LCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIHN0ZDo6bW92ZShvbl9mYWlsX2NhbGxiYWNrXykuSW52b2tlKHJlc3VsdCk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgU2V0Q29ubmVjdGlvbk9uT3BlbihzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OkR5bmFtaWNDaGFubmVsPiBjaGFubmVsLCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIHN0ZDo6bW92ZShvbl9vcGVuX2NhbGxiYWNrXykuSW52b2tlKHN0ZDo6bW92ZShjaGFubmVsKSk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGVfe307Ci0gIGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9vcGVuX2NhbGxiYWNrX3t9OwotICBsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25GYWlsdXJlQ2FsbGJhY2sgb25fZmFpbF9jYWxsYmFja197fTsKLQotICBGdXp6RHluYW1pY0NoYW5uZWxNYW5hZ2VySW1wbCgpID0gZGVmYXVsdDsKLSAgfkZ1enpEeW5hbWljQ2hhbm5lbE1hbmFnZXJJbXBsKCkgPSBkZWZhdWx0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGNvbm5lY3RlZF9wcm9taXNlXzsKLSAgc3RkOjpmdXR1cmU8dm9pZD4gY29ubmVjdGVkX2Z1dHVyZV87Ci0KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlZ2lzdGVyX3Byb21pc2VfOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiByZWdpc3Rlcl9mdXR1cmVfOwotfTsKLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2Z1enovZnV6el9sMmNhcC5jYyBiL2dkL2wyY2FwL2Z1enovZnV6el9sMmNhcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2FlYmUwYy4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9mdXp6L2Z1enpfbDJjYXAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCi0vLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgPGhjaS9hZGRyZXNzLmg+Ci0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLSNpbmNsdWRlICJjaGFubmVsX2Z1enpfY29udHJvbGxlci5oIgotI2luY2x1ZGUgInNoaW1fbDJjYXAuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci11c2luZyBoY2k6OkFkZHJlc3M7Ci11c2luZyBoY2k6OkFkZHJlc3NUeXBlOwotdXNpbmcgaGNpOjphY2xfbWFuYWdlcjo6QWNsQ29ubmVjdGlvbjsKLXVzaW5nIGhjaTo6YWNsX21hbmFnZXI6OkNsYXNzaWNBY2xDb25uZWN0aW9uOwotdXNpbmcgbDJjYXA6OkNpZDsKLXVzaW5nIGwyY2FwOjpQc207Ci11c2luZyBsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6Okxpbms7Ci0KLXVzaW5nIHNoaW06OlNoaW1MMmNhcEZ1eno7Ci0KLWNsYXNzIEZha2VDb21tYW5kSW50ZXJmYWNlIDogcHVibGljIGhjaTo6Q29tbWFuZEludGVyZmFjZTxoY2k6OkFjbENvbW1hbmRCdWlsZGVyPiB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgRW5xdWV1ZUNvbW1hbmQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpBY2xDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyk+IG9uX2NvbXBsZXRlKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkFjbENvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykge30KLX0gZmFrZV9jb21tYW5kX2ludGVyZmFjZTsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOwotICBTaGltTDJjYXBGdXp6IGwyc2hpbSgmZmRwKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZGRyZXNzVmFscyA9IGZkcC5Db25zdW1lQnl0ZXM8dWludDhfdD4oQWRkcmVzczo6a0xlbmd0aCk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRoZSBhZGRyZXNzIGlzIGFsd2F5cyBhdCBsZWFzdCBrTGVuZ3RoLgotICB3aGlsZSAoYWRkcmVzc1ZhbHMuc2l6ZSgpIDwgQWRkcmVzczo6a0xlbmd0aCkgewotICAgIGFkZHJlc3NWYWxzLnB1c2hfYmFjaygwKTsKLSAgfQotICBBZGRyZXNzIG15QWRkcmVzczsKLSAgbXlBZGRyZXNzLkZyb21PY3RldHMoYWRkcmVzc1ZhbHMuZGF0YSgpKTsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc1dpdGhUeXBlID0gaGNpOjpBZGRyZXNzV2l0aFR5cGUobXlBZGRyZXNzLCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLQotICAvLyBBc3NvY2lhdGUgYSBDbGFzc2ljQWNsQ29ubmVjdGlvbiBzbyB0aGF0IHdlIGNhbiBncmFiIGEgbGluay4KLSAgYXV0byB0aHJvd2F3YXlfcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEFjbENvbm5lY3Rpb246OlF1ZXVlPigxMCk7Ci0gIGwyc2hpbS5saW5rX21hbmFnZXItPk9uQ29ubmVjdFN1Y2Nlc3Moc3RkOjp1bmlxdWVfcHRyPENsYXNzaWNBY2xDb25uZWN0aW9uPigKLSAgICAgIG5ldyBDbGFzc2ljQWNsQ29ubmVjdGlvbih0aHJvd2F3YXlfcXVldWUsICZmYWtlX2NvbW1hbmRfaW50ZXJmYWNlLCAwLCBteUFkZHJlc3MpKSk7Ci0gIExpbmsqIGxpbmsgPSBsMnNoaW0ubGlua19tYW5hZ2VyLT5HZXRMaW5rKG15QWRkcmVzcyk7Ci0KLSAgLy8gMHgwMDAxLTB4MDA3RiBGaXhlZCwgMHgwMDgwLTB4MDBGRiBEeW5hbWljCi0gIFtbbWF5YmVfdW51c2VkXV0gdWludDE2X3QgcHNtID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDE2X3Q+KDB4MDAwMSwgMHgwMDdGKTsKLSAgcHNtID0gMHgwMTAxdSBeIDB4MDEwMHU7Ci0gIHVpbnQxNl90IGR5bmFtaWNQc20gPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMHgwMDgwLCAweDAwRkYpOwotICBkeW5hbWljUHNtID0gMHgwMTAxdSBeIDB4MDEwMHU7Ci0KLSAgLy8gT3BlbiBhIGNvbm5lY3Rpb24gYW5kIGFzc2lnbiBhbiBJRAotICBDaWQgZml4ZWRDaWQgPSBsMmNhcDo6a0xlU2lnbmFsbGluZ0NpZDsKLQotICAvLyBGaXhlZCBjaGFubmVscyBtdXN0IGJlIGFjcXVpcmVkLgotICBhdXRvIGZpeGVkQ2hhbm5lbCA9IGxpbmstPkFsbG9jYXRlRml4ZWRDaGFubmVsKGZpeGVkQ2lkKTsKLSAgZml4ZWRDaGFubmVsLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhsMnNoaW0uaGFuZGxlcl8uZ2V0KCksIGNvbW1vbjo6QmluZE9uY2UoW10oaGNpOjpFcnJvckNvZGUpIHt9KSk7Ci0gIGZpeGVkQ2hhbm5lbC0+QWNxdWlyZSgpOwotICBDaGFubmVsRnV6ekNvbnRyb2xsZXIgZml4ZWRDaGFubmVsQ29udHJvbGxlcihsMnNoaW0uaGFuZGxlcl8uZ2V0KCksIGZpeGVkQ2hhbm5lbCk7Ci0gIC8vIEdlbmVyYXRlIGEgdmFsaWQgZHluYW1pYyBjaGFubmVsIElECi0gIENpZCBkeW5hbWljQ2lkID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDE2X3Q+KGwyY2FwOjprRmlyc3REeW5hbWljQ2hhbm5lbCwgbDJjYXA6OmtMYXN0RHluYW1pY0NoYW5uZWwpOwotICBhdXRvIGR5bmFtaWNDaGFubmVsID0gbGluay0+QWxsb2NhdGVEeW5hbWljQ2hhbm5lbChkeW5hbWljUHNtLCBkeW5hbWljQ2lkKTsKLSAgQ2hhbm5lbEZ1enpDb250cm9sbGVyIGR5bmFtaWNDaGFubmVsQ29udHJvbGxlcihsMnNoaW0uaGFuZGxlcl8uZ2V0KCksIGR5bmFtaWNDaGFubmVsKTsKLQotICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMCkgewotICAgIC8vIEFyZSB3ZSB1c2luZyB0aGUgZHluYW1pYyBxdWV1ZT8KLSAgICBib29sIGR5bmFtaWMgPSBmZHAuQ29uc3VtZUJvb2woKTsKLQotICAgIC8vIENvbnN1bWUgYXQgbW9zdCBVSU5UMTZfTUFYIG9yIHJlbWFpbmluZ19ieXRlcywgd2hhdGV2ZXIgaXMgc21hbGxlci4KLSAgICB1aW50MTZfdCBwYWNrZXRTaXplID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHN0ZDo6bWluKHN0YXRpY19jYXN0PHNpemVfdD4oZmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSksIGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgPSBmZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KHBhY2tldFNpemUpOwotICAgIGlmIChkeW5hbWljKSB7Ci0gICAgICBkeW5hbWljQ2hhbm5lbENvbnRyb2xsZXIuaW5qZWN0RnJhbWUoZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpeGVkQ2hhbm5lbENvbnRyb2xsZXIuaW5qZWN0RnJhbWUoZGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2xlYW51cCBzdHVmZi4KLSAgZml4ZWRDaGFubmVsLT5SZWxlYXNlKCk7Ci0gIGR5bmFtaWNDaGFubmVsLT5DbG9zZSgpOwotICBsMnNoaW0uc3RvcFJlZ2lzdHJ5KCk7Ci0gIGxpbmstPk9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgbDJzaGltLmxpbmtfbWFuYWdlci0+T25EaXNjb25uZWN0KG15QWRkcmVzcywgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICByZXR1cm4gMDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2Z1enovZnV6el9sMmNhcF9jbGFzc2ljX21vZHVsZS5oIGIvZ2QvbDJjYXAvZnV6ei9mdXp6X2wyY2FwX2NsYXNzaWNfbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwZmU3NDYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvZnV6ei9mdXp6X2wyY2FwX2NsYXNzaWNfbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8gQXV0aG9yczogY29yYmluLnNvdWZmcmFudEBsZXZpYXRoYW5zZWN1cml0eS5jb20KLS8vICAgICAgICAgIGR5bGFuLmthdHpAbGV2aWF0aGFuc2VjdXJpdHkuY29tCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuaCIKLQotI2luY2x1ZGUgImZ1enpfZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJmdXp6X2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyX2ltcGwuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci1uYW1lc3BhY2UgewotY2xhc3MgRnV6ekwyY2FwQ2xhc3NpY01vZHVsZSA6IHB1YmxpYyBsMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6Y2xhc3NpYzo6RHluYW1pY0NoYW5uZWxNYW5hZ2VyPiBHZXREeW5hbWljQ2hhbm5lbE1hbmFnZXIoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RnV6ekR5bmFtaWNDaGFubmVsTWFuYWdlcj4oKmltcGxfKTsKLSAgfQotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KikgY29uc3Qgb3ZlcnJpZGUge30KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8RnV6ekR5bmFtaWNDaGFubmVsTWFuYWdlckltcGw+IGltcGxfOwotfTsKLQotdm9pZCBGdXp6TDJjYXBDbGFzc2ljTW9kdWxlOjpTdGFydCgpIHsKLSAgaW1wbF8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZ1enpEeW5hbWljQ2hhbm5lbE1hbmFnZXJJbXBsPigpOwotfQotCi12b2lkIEZ1enpMMmNhcENsYXNzaWNNb2R1bGU6OlN0b3AoKSB7Ci0gIGltcGxfLnJlc2V0KCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9mdXp6L3NoaW1fbDJjYXAuaCBiL2dkL2wyY2FwL2Z1enovc2hpbV9sMmNhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDU5Zjg2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2Z1enovc2hpbV9sMmNhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyBBdXRob3JzOiBjb3JiaW4uc291ZmZyYW50QGxldmlhdGhhbnNlY3VyaXR5LmNvbQotLy8gICAgICAgICAgZHlsYW4ua2F0ekBsZXZpYXRoYW5zZWN1cml0eS5jb20KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8Z2QvbDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaD4KLSNpbmNsdWRlIDxnZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaD4KLSNpbmNsdWRlIDxnZC9sMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbWFuYWdlci5oPgotI2luY2x1ZGUgPGdkL2wyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlci5oPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoY2kvZnV6ei9mdXp6X2hjaV9sYXllci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbDJjYXBfY2xhc3NpY19tb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlICJmdXp6X2wyY2FwX2NsYXNzaWNfbW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2Ugc2hpbSB7Ci1uYW1lc3BhY2UgewotY2xhc3MgU2hpbUwyY2FwRnV6eiB7Ci0gcHVibGljOgotICB1aW50MTZfdCBDcmVhdGVDb25uZWN0aW9uKHVpbnQxNl90IHBzbSwgaGNpOjpBZGRyZXNzIGRldmljZV9hZGRyZXNzKSB7Ci0gICAgc3RkOjpwcm9taXNlPHVpbnQxNl90PiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0KLSAgICBmdXp6X2wyY2FwX2NsYXNzaWNfbW9kdWxlXy0+R2V0RHluYW1pY0NoYW5uZWxNYW5hZ2VyKCktPkNvbm5lY3RDaGFubmVsKAotICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAge30sCi0gICAgICAgIHBzbSwKLSAgICAgICAgaGFuZGxlcl8tPkJpbmRPbih0aGlzLCAmU2hpbUwyY2FwRnV6ejo6T25Db25uZWN0aW9uQ29tcGxldGUpLAotICAgICAgICBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmU2hpbUwyY2FwRnV6ejo6T25Db25uZWN0aW9uRmFpbCkpOwotCi0gICAgcmV0dXJuIGZ1dHVyZS5nZXQoKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uQ29tcGxldGUoc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbD4gY2hhbm5lbCkge30KLQotICB2b2lkIE9uQ29ubmVjdGlvbkZhaWwobDJjYXA6OmNsYXNzaWM6OkR5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHt9Ci0KLSAgU2hpbUwyY2FwRnV6eihGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICAgIGhjaTo6ZnV6ejo6RnV6ekhjaUxheWVyKiBmdXp6SGNpID0gZmFrZV9yZWdpc3RyeV8uSW5qZWN0PGhjaTo6ZnV6ejo6RnV6ekhjaUxheWVyPigmaGNpOjpIY2lMYXllcjo6RmFjdG9yeSk7Ci0gICAgZnV6el9sMmNhcF9jbGFzc2ljX21vZHVsZV8gPSBuZXcgRnV6ekwyY2FwQ2xhc3NpY01vZHVsZSgpOwotICAgIGZha2VfcmVnaXN0cnlfLkluamVjdFRlc3RNb2R1bGUoJmwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGU6OkZhY3RvcnksIGZ1enpfbDJjYXBfY2xhc3NpY19tb2R1bGVfKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdGFydDxsMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlPigpOwotCi0gICAgLy8gVGhlIGF1dG9yZXBseSBpcyBuZWVkZWQgdG8gcHJldmVudCBpdCBmcm9tIGhhbmdpbmcuCi0gICAgZnV6ekhjaS0+VHVybk9uQXV0b1JlcGx5KGZkcCk7Ci0gICAgYWNsX21hbmFnZXJfID0gZmFrZV9yZWdpc3RyeV8uU3RhcnQ8aGNpOjpBY2xNYW5hZ2VyPigpOwotICAgIGZ1enpIY2ktPlR1cm5PZmZBdXRvUmVwbHkoKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgTGlua01hbmFnZXIKLSAgICBoYW5kbGVyXyA9IHN0ZDo6dW5pcXVlX3B0cjxvczo6SGFuZGxlcj4obmV3IG9zOjpIYW5kbGVyKCZ0aHJlYWRfKSk7Ci0gICAgZHluYW1pY19jaGFubmVsX2ltcGwgPSBzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbD4oCi0gICAgICAgIG5ldyBsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKGhhbmRsZXJfLmdldCgpKSk7Ci0gICAgZml4ZWRfY2hhbm5lbF9pbXBsID0gc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsPigKLSAgICAgICAgbmV3IGwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKGhhbmRsZXJfLmdldCgpKSk7Ci0gICAgcGFyYW1ldGVyX3Byb3ZpZGVyID0gc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjppbnRlcm5hbDo6UGFyYW1ldGVyUHJvdmlkZXI+KG5ldyBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKCkpOwotICAgIGxpbmtfbWFuYWdlciA9IHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OkxpbmtNYW5hZ2VyPihuZXcgbDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpMaW5rTWFuYWdlcigKLSAgICAgICAgaGFuZGxlcl8uZ2V0KCksIGFjbF9tYW5hZ2VyXywgZml4ZWRfY2hhbm5lbF9pbXBsLmdldCgpLCBkeW5hbWljX2NoYW5uZWxfaW1wbC5nZXQoKSwgcGFyYW1ldGVyX3Byb3ZpZGVyLmdldCgpKSk7Ci0gIH0KLQotICB+U2hpbUwyY2FwRnV6eigpIHsKLSAgICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgfQotCi0gIHZvaWQgc3RvcFJlZ2lzdHJ5KCkgewotICAgIGZha2VfcmVnaXN0cnlfLldhaXRGb3JJZGxlQW5kU3RvcEFsbCgpOwotICB9Ci0KLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGNvbm5lY3Rpb25fY29tcGxldGVfcHJvbWlzZV87Ci0KLSAgRnV6ekwyY2FwQ2xhc3NpY01vZHVsZSogZnV6el9sMmNhcF9jbGFzc2ljX21vZHVsZV97bnVsbHB0cn07Ci0gIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXJfe251bGxwdHJ9OwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxvczo6SGFuZGxlcj4gaGFuZGxlcl87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OkZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbD4gZml4ZWRfY2hhbm5lbF9pbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbD4gZHluYW1pY19jaGFubmVsX2ltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OkxpbmtNYW5hZ2VyPiBsaW5rX21hbmFnZXI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyPiBwYXJhbWV0ZXJfcHJvdmlkZXI7Ci0KLSBwcml2YXRlOgotICBGdXp6VGVzdE1vZHVsZVJlZ2lzdHJ5IGZha2VfcmVnaXN0cnlfOwotICBvczo6VGhyZWFkJiB0aHJlYWRfID0gZmFrZV9yZWdpc3RyeV8uR2V0VGVzdFRocmVhZCgpOwotfTsKLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuY2MgYi9nZC9sMmNhcC9pbnRlcm5hbC9iYXNpY19tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGViZmFiLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvYmFzaWNfbW9kZV9jaGFubmVsX2RhdGFfY29udHJvbGxlci5oIgotCi0jaW5jbHVkZSAibDJjYXAvbDJjYXBfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1CYXNpY01vZGVEYXRhQ29udHJvbGxlcjo6QmFzaWNNb2RlRGF0YUNvbnRyb2xsZXIoQ2lkIGNpZCwgQ2lkIHJlbW90ZV9jaWQsIFVwcGVyUXVldWVEb3duRW5kKiBjaGFubmVsX3F1ZXVlX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczo6SGFuZGxlciogaGFuZGxlciwgU2NoZWR1bGVyKiBzY2hlZHVsZXIpCi0gICAgOiBjaWRfKGNpZCksIHJlbW90ZV9jaWRfKHJlbW90ZV9jaWQpLCBlbnF1ZXVlX2J1ZmZlcl8oY2hhbm5lbF9xdWV1ZV9lbmQpLCBoYW5kbGVyXyhoYW5kbGVyKSwgc2NoZWR1bGVyXyhzY2hlZHVsZXIpIHsKLX0KLQotQmFzaWNNb2RlRGF0YUNvbnRyb2xsZXI6On5CYXNpY01vZGVEYXRhQ29udHJvbGxlcigpIHsKLSAgZW5xdWV1ZV9idWZmZXJfLkNsZWFyKCk7Ci19Ci0KLXZvaWQgQmFzaWNNb2RlRGF0YUNvbnRyb2xsZXI6Ok9uU2R1KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBzZHUpIHsKLSAgYXV0byBsMmNhcF9pbmZvcm1hdGlvbiA9IEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUocmVtb3RlX2NpZF8sIHN0ZDo6bW92ZShzZHUpKTsKLSAgcGR1X3F1ZXVlXy5lbXBsYWNlKHN0ZDo6bW92ZShsMmNhcF9pbmZvcm1hdGlvbikpOwotICBzY2hlZHVsZXJfLT5PblBhY2tldHNSZWFkeShjaWRfLCAxKTsKLX0KLQotdm9pZCBCYXNpY01vZGVEYXRhQ29udHJvbGxlcjo6T25QZHUocGFja2V0OjpQYWNrZXRWaWV3PHRydWU+IHBkdSkgewotICBhdXRvIGJhc2ljX2ZyYW1lX3ZpZXcgPSBCYXNpY0ZyYW1lVmlldzo6Q3JlYXRlKHBkdSk7Ci0gIGlmICghYmFzaWNfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBmcmFtZSIpOwotICAgIHJldHVybjsKLSAgfQotICBlbnF1ZXVlX2J1ZmZlcl8uRW5xdWV1ZShzdGQ6Om1ha2VfdW5pcXVlPFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4+KGJhc2ljX2ZyYW1lX3ZpZXcuR2V0UGF5bG9hZCgpKSwgaGFuZGxlcl8pOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gQmFzaWNNb2RlRGF0YUNvbnRyb2xsZXI6OkdldE5leHRQYWNrZXQoKSB7Ci0gIGF1dG8gbmV4dCA9IHN0ZDo6bW92ZShwZHVfcXVldWVfLmZyb250KCkpOwotICBwZHVfcXVldWVfLnBvcCgpOwotICByZXR1cm4gbmV4dDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaCBiL2dkL2wyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0ZTUwOC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9iYXNpY19tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmlkaV9xdWV1ZS5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3NjaGVkdWxlci5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9tdHUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBCYXNpY01vZGVEYXRhQ29udHJvbGxlciA6IHB1YmxpYyBEYXRhQ29udHJvbGxlciB7Ci0gcHVibGljOgotICB1c2luZyBVcHBlckVucXVldWUgPSBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPjsKLSAgdXNpbmcgVXBwZXJEZXF1ZXVlID0gcGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcjsKLSAgdXNpbmcgVXBwZXJRdWV1ZURvd25FbmQgPSBjb21tb246OkJpZGlRdWV1ZUVuZDxVcHBlckVucXVldWUsIFVwcGVyRGVxdWV1ZT47Ci0gIEJhc2ljTW9kZURhdGFDb250cm9sbGVyKENpZCBjaWQsIENpZCByZW1vdGVfY2lkLCBVcHBlclF1ZXVlRG93bkVuZCogY2hhbm5lbF9xdWV1ZV9lbmQsIG9zOjpIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZXIqIHNjaGVkdWxlcik7Ci0KLSAgfkJhc2ljTW9kZURhdGFDb250cm9sbGVyKCk7Ci0KLSAgdm9pZCBPblNkdShzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gc2R1KSBvdmVycmlkZTsKLQotICB2b2lkIE9uUGR1KHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBwZHUpIG92ZXJyaWRlOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBHZXROZXh0UGFja2V0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBFbmFibGVGY3MoYm9vbCBlbmFibGVkKSBvdmVycmlkZSB7fQotICB2b2lkIFNldFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xPcHRpb25zKGNvbnN0IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uJiBvcHRpb24pIG92ZXJyaWRlIHt9Ci0KLSBwcml2YXRlOgotICBDaWQgY2lkXzsKLSAgQ2lkIHJlbW90ZV9jaWRfOwotICBvczo6RW5xdWV1ZUJ1ZmZlcjxVcHBlckVucXVldWU+IGVucXVldWVfYnVmZmVyXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4gcGR1X3F1ZXVlXzsKLSAgU2NoZWR1bGVyKiBzY2hlZHVsZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXJfdGVzdC5jYyBiL2dkL2wyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjYzU2ZC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9iYXNpY19tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfbW9jay5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IENyZWF0ZVNkdShzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkKSB7Ci0gIGF1dG8gcmF3X2J1aWxkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UmF3QnVpbGRlcj4oKTsKLSAgcmF3X2J1aWxkZXItPkFkZE9jdGV0cyhwYXlsb2FkKTsKLSAgcmV0dXJuIHJhd19idWlsZGVyOwotfQotCi1QYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi12b2lkIHN5bmNfaGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMwMCkpOwotICBFWFBFQ1RfRVEoc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLX0KLQotY2xhc3MgQmFzaWNNb2RlRGF0YUNvbnRyb2xsZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICB1c2VyX2hhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICAgIHF1ZXVlX2hhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBxdWV1ZV9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICB1c2VyX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBxdWV1ZV9oYW5kbGVyXzsKLSAgICBkZWxldGUgdXNlcl9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBxdWV1ZV9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoQmFzaWNNb2RlRGF0YUNvbnRyb2xsZXJUZXN0LCB0cmFuc21pdCkgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgQmFzaWNNb2RlRGF0YUNvbnRyb2xsZXIgY29udHJvbGxlcnsxLCAxLCBjaGFubmVsX3F1ZXVlLkdldERvd25FbmQoKSwgcXVldWVfaGFuZGxlcl8sICZzY2hlZHVsZXJ9OwotICBFWFBFQ1RfQ0FMTChzY2hlZHVsZXIsIE9uUGFja2V0c1JlYWR5KDEsIDEpKTsKLSAgY29udHJvbGxlci5PblNkdShDcmVhdGVTZHUoeydhJywgJ2InLCAnYycsICdkJ30pKTsKLSAgYXV0byBuZXh0X3BhY2tldCA9IGNvbnRyb2xsZXIuR2V0TmV4dFBhY2tldCgpOwotICBFWFBFQ1RfTkUobmV4dF9wYWNrZXQsIG51bGxwdHIpOwotICBhdXRvIHZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShuZXh0X3BhY2tldCkpOwotICBhdXRvIHBkdV92aWV3ID0gQmFzaWNGcmFtZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgRVhQRUNUX1RSVUUocGR1X3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYXlsb2FkID0gcGR1X3ZpZXcuR2V0UGF5bG9hZCgpOwotICBzdGQ6OnN0cmluZyBkYXRhID0gc3RkOjpzdHJpbmcocGF5bG9hZC5iZWdpbigpLCBwYXlsb2FkLmVuZCgpKTsKLSAgRVhQRUNUX0VRKGRhdGEsICJhYmNkIik7Ci19Ci0KLVRFU1RfRihCYXNpY01vZGVEYXRhQ29udHJvbGxlclRlc3QsIHJlY2VpdmUpIHsKLSAgY29tbW9uOjpCaWRpUXVldWU8U2NoZWR1bGVyOjpVcHBlckVucXVldWUsIFNjaGVkdWxlcjo6VXBwZXJEZXF1ZXVlPiBjaGFubmVsX3F1ZXVlezEwfTsKLSAgdGVzdGluZzo6TW9ja1NjaGVkdWxlciBzY2hlZHVsZXI7Ci0gIEJhc2ljTW9kZURhdGFDb250cm9sbGVyIGNvbnRyb2xsZXJ7MSwgMSwgY2hhbm5lbF9xdWV1ZS5HZXREb3duRW5kKCksIHF1ZXVlX2hhbmRsZXJfLCAmc2NoZWR1bGVyfTsKLSAgYXV0byBiYXNlX3ZpZXcgPSBHZXRQYWNrZXRWaWV3KEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUoMSwgQ3JlYXRlU2R1KHsnYScsICdiJywgJ2MnLCAnZCd9KSkpOwotICBjb250cm9sbGVyLk9uUGR1KGJhc2Vfdmlldyk7Ci0gIHN5bmNfaGFuZGxlcihxdWV1ZV9oYW5kbGVyXyk7Ci0gIGF1dG8gcGFja2V0X3ZpZXcgPSBjaGFubmVsX3F1ZXVlLkdldFVwRW5kKCktPlRyeURlcXVldWUoKTsKLSAgRVhQRUNUX05FKHBhY2tldF92aWV3LCBudWxscHRyKTsKLSAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBhY2tldF92aWV3LT5iZWdpbigpLCBwYWNrZXRfdmlldy0+ZW5kKCkpOwotICBFWFBFQ1RfRVEoZGF0YSwgImFiY2QiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3YTE1Zi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBTZW5kZXI7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgaW50ZXJuYWwgY2hhbm5lbCBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBDaGFubmVsSW1wbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5DaGFubmVsSW1wbCgpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBxdWV1ZSBlbmQgZm9yIHVwcGVyIGxheWVyIChMMkNBUCB1c2VyKQotICAgKi8KLSAgdmlydHVhbCBjb21tb246OkJpZGlRdWV1ZUVuZDxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyLCBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPj4qCi0gIEdldFF1ZXVlVXBFbmQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcXVldWUgZW5kIGZvciBsb3dlciBsYXllciAoc2VuZGVyIGFuZCByZWNlaXZlcikKLSAgICovCi0gIHZpcnR1YWwgY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4sIHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+KgotICBHZXRRdWV1ZURvd25FbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCBDaWQgR2V0Q2lkKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgQ2lkIEdldFJlbW90ZUNpZCgpIGNvbnN0ID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGxfbW9jay5oIGIvZ2QvbDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzMDQ4Ny4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGxfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrQ2hhbm5lbEltcGwgOiBwdWJsaWMgQ2hhbm5lbEltcGwgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKGNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXIsIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+PiopLAotICAgICAgICAgICAgICBHZXRRdWV1ZVVwRW5kLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChjb21tb246OkJpZGlRdWV1ZUVuZDxwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPiwgcGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4qKSwKLSAgICAgICAgICAgICAgR2V0UXVldWVEb3duRW5kLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKENpZCwgR2V0Q2lkLCAoKSwgKGNvbnN0LCBvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChDaWQsIEdldFJlbW90ZUNpZCwgKCksIChjb25zdCwgb3ZlcnJpZGUpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvZGF0YV9jb250cm9sbGVyLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9kYXRhX2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3YzJlNS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9kYXRhX2NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAibDJjYXAvbDJjYXBfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldC9iYXNlX3BhY2tldF9idWlsZGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF92aWV3LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIERhdGFDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkRhdGFDb250cm9sbGVyKCkgPSBkZWZhdWx0OwotCi0gIC8vIFNEVSAtPiBQRFVzIGFuZCBub3RpZnkgU2NoZWR1bGVyCi0gIHZpcnR1YWwgdm9pZCBPblNkdShzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gc2R1KSA9IDA7Ci0KLSAgLy8gUERVcyAtPiBTRFUgYW5kIGVucXVldWUgdG8gY2hhbm5lbCBxdWV1ZSBlbmQKLSAgdmlydHVhbCB2b2lkIE9uUGR1KHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBwZHUpID0gMDsKLQotICAvLyBVc2VkIGJ5IFNjaGVkdWxlciB0byBnZXQgbmV4dCBQRFUKLSAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gR2V0TmV4dFBhY2tldCgpID0gMDsKLQotICAvLyBTZXQgRkNTIG1vZGUuIFRoaXMgb25seSBhcHBsaWVzIHRvIHNvbWUgbW9kZXMgKEVSVE0pLgotICB2aXJ0dWFsIHZvaWQgRW5hYmxlRmNzKGJvb2wgZW5hYmxlZCkgPSAwOwotCi0gIC8vIFNldCByZXRyYW5zbWlzc2lvbiBhbmQgZmxvdyBjb250cm9sLiBJZ25vcmUgdGhlIG1vZGUgb3B0aW9uIGJlY2F1c2UgZWFjaCBEYXRhQ29udHJvbGxlciBvbmx5IGhhbmRsZXMgb25lIG1vZGUuCi0gIC8vIFRoaXMgb25seSBhcHBsaWVzIHRvIHNvbWUgbW9kZXMgKEVSVE0pLgotICB2aXJ0dWFsIHZvaWQgU2V0UmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE9wdGlvbnMoCi0gICAgICBjb25zdCBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sQ29uZmlndXJhdGlvbk9wdGlvbiYgb3B0aW9uKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvZGF0YV9jb250cm9sbGVyX21vY2suaCBiL2dkL2wyY2FwL2ludGVybmFsL2RhdGFfY29udHJvbGxlcl9tb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzFjNjguLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvZGF0YV9jb250cm9sbGVyX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZGF0YV9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0RhdGFDb250cm9sbGVyIDogcHVibGljIERhdGFDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIE9uU2R1LCAoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+KSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIE9uUGR1LCAocGFja2V0OjpQYWNrZXRWaWV3PHRydWU+KSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiwgR2V0TmV4dFBhY2tldCwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBFbmFibGVGY3MsIChib29sKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xPcHRpb25zLCAoY29uc3QgUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbENvbmZpZ3VyYXRpb25PcHRpb24mKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5jYyBiL2dkL2wyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmZTg5Yi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9kYXRhX3BpcGVsaW5lX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3NlbmRlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIERhdGFQaXBlbGluZU1hbmFnZXI6OkF0dGFjaENoYW5uZWwoQ2lkIGNpZCwgc3RkOjpzaGFyZWRfcHRyPENoYW5uZWxJbXBsPiBjaGFubmVsLCBDaGFubmVsTW9kZSBtb2RlKSB7Ci0gIEFTU0VSVChzZW5kZXJfbWFwXy5maW5kKGNpZCkgPT0gc2VuZGVyX21hcF8uZW5kKCkpOwotICBzZW5kZXJfbWFwXy5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGNpZCksCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGhhbmRsZXJfLCBsaW5rXywgc2NoZWR1bGVyXy5nZXQoKSwgY2hhbm5lbCwgbW9kZSkpOwotfQotCi12b2lkIERhdGFQaXBlbGluZU1hbmFnZXI6OkRldGFjaENoYW5uZWwoQ2lkIGNpZCkgewotICBBU1NFUlQoc2VuZGVyX21hcF8uZmluZChjaWQpICE9IHNlbmRlcl9tYXBfLmVuZCgpKTsKLSAgc2VuZGVyX21hcF8uZXJhc2UoY2lkKTsKLSAgc2NoZWR1bGVyXy0+UmVtb3ZlQ2hhbm5lbChjaWQpOwotICBzY2hlZHVsZXJfLT5TZXRDaGFubmVsVHhQcmlvcml0eShjaWQsIGZhbHNlKTsKLX0KLQotRGF0YUNvbnRyb2xsZXIqIERhdGFQaXBlbGluZU1hbmFnZXI6OkdldERhdGFDb250cm9sbGVyKENpZCBjaWQpIHsKLSAgaWYgKHNlbmRlcl9tYXBfLmZpbmQoY2lkKSA9PSBzZW5kZXJfbWFwXy5lbmQoKSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9OwotICByZXR1cm4gc2VuZGVyX21hcF8uZmluZChjaWQpLT5zZWNvbmQuR2V0RGF0YUNvbnRyb2xsZXIoKTsKLX0KLQotdm9pZCBEYXRhUGlwZWxpbmVNYW5hZ2VyOjpPblBhY2tldFNlbnQoQ2lkIGNpZCkgewotICBBU1NFUlQoc2VuZGVyX21hcF8uZmluZChjaWQpICE9IHNlbmRlcl9tYXBfLmVuZCgpKTsKLSAgc2VuZGVyX21hcF8uZmluZChjaWQpLT5zZWNvbmQuT25QYWNrZXRTZW50KCk7Ci19Ci0KLXZvaWQgRGF0YVBpcGVsaW5lTWFuYWdlcjo6VXBkYXRlQ2xhc3NpY0NvbmZpZ3VyYXRpb24oQ2lkIGNpZCwgY2xhc3NpYzo6aW50ZXJuYWw6OkNoYW5uZWxDb25maWd1cmF0aW9uU3RhdGUgY29uZmlnKSB7Ci0gIEFTU0VSVChzZW5kZXJfbWFwXy5maW5kKGNpZCkgIT0gc2VuZGVyX21hcF8uZW5kKCkpOwotICBzZW5kZXJfbWFwXy5maW5kKGNpZCktPnNlY29uZC5VcGRhdGVDbGFzc2ljQ29uZmlndXJhdGlvbihjb25maWcpOwotfQotCi12b2lkIERhdGFQaXBlbGluZU1hbmFnZXI6OlNldENoYW5uZWxUeFByaW9yaXR5KENpZCBjaWQsIGJvb2wgaGlnaF9wcmlvcml0eSkgewotICBBU1NFUlQoc2VuZGVyX21hcF8uZmluZChjaWQpICE9IHNlbmRlcl9tYXBfLmVuZCgpKTsKLSAgc2NoZWR1bGVyXy0+U2V0Q2hhbm5lbFR4UHJpb3JpdHkoY2lkLCBoaWdoX3ByaW9yaXR5KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIGIvZ2QvbDJjYXAvaW50ZXJuYWwvZGF0YV9waXBlbGluZV9tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGY0OWUuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvZGF0YV9waXBlbGluZV9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImRhdGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvY2hhbm5lbF9jb25maWd1cmF0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcmVjZWl2ZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9tdHUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgSUxpbms7Ci0KLS8qKgotICogTWFuYWdlcyBkYXRhIHBpcGVsaW5lIGZyb20gY2hhbm5lbCBxdWV1ZSBlbmQgdG8gbGluayBxdWV1ZSBlbmQsIHBlciBsaW5rLgotICogQ29udGFpbnMgYSBTY2hlZHVsZXIgYW5kIFJlY2VpdmVyIHBlciBsaW5rLgotICogQ29udGFpbnMgYSBTZW5kZXIgYW5kIGl0cyBjb3JyZXNwb25kaW5nIERhdGFDb250cm9sbGVyIHBlciBhdHRhY2hlZCBjaGFubmVsLgotICovCi1jbGFzcyBEYXRhUGlwZWxpbmVNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIFVwcGVyRW5xdWV1ZSA9IHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+OwotICB1c2luZyBVcHBlckRlcXVldWUgPSBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyOwotICB1c2luZyBVcHBlclF1ZXVlRG93bkVuZCA9IGNvbW1vbjo6QmlkaVF1ZXVlRW5kPFVwcGVyRW5xdWV1ZSwgVXBwZXJEZXF1ZXVlPjsKLSAgdXNpbmcgTG93ZXJFbnF1ZXVlID0gVXBwZXJEZXF1ZXVlOwotICB1c2luZyBMb3dlckRlcXVldWUgPSBVcHBlckVucXVldWU7Ci0gIHVzaW5nIExvd2VyUXVldWVVcEVuZCA9IGNvbW1vbjo6QmlkaVF1ZXVlRW5kPExvd2VyRW5xdWV1ZSwgTG93ZXJEZXF1ZXVlPjsKLQotICBEYXRhUGlwZWxpbmVNYW5hZ2VyKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBJTGluayogbGluaywgTG93ZXJRdWV1ZVVwRW5kKiBsaW5rX3F1ZXVlX3VwX2VuZCkKLSAgICAgIDogaGFuZGxlcl8oaGFuZGxlciksIGxpbmtfKGxpbmspLCBzY2hlZHVsZXJfKHN0ZDo6bWFrZV91bmlxdWU8Rmlmbz4odGhpcywgbGlua19xdWV1ZV91cF9lbmQsIGhhbmRsZXIpKSwKLSAgICAgICAgcmVjZWl2ZXJfKGxpbmtfcXVldWVfdXBfZW5kLCBoYW5kbGVyLCB0aGlzKSB7fQotCi0gIHVzaW5nIENoYW5uZWxNb2RlID0gU2VuZGVyOjpDaGFubmVsTW9kZTsKLQotICB2aXJ0dWFsIHZvaWQgQXR0YWNoQ2hhbm5lbChDaWQgY2lkLCBzdGQ6OnNoYXJlZF9wdHI8Q2hhbm5lbEltcGw+IGNoYW5uZWwsIENoYW5uZWxNb2RlIG1vZGUpOwotICB2aXJ0dWFsIHZvaWQgRGV0YWNoQ2hhbm5lbChDaWQgY2lkKTsKLSAgdmlydHVhbCBEYXRhQ29udHJvbGxlciogR2V0RGF0YUNvbnRyb2xsZXIoQ2lkIGNpZCk7Ci0gIHZpcnR1YWwgdm9pZCBPblBhY2tldFNlbnQoQ2lkIGNpZCk7Ci0gIHZpcnR1YWwgdm9pZCBVcGRhdGVDbGFzc2ljQ29uZmlndXJhdGlvbihDaWQgY2lkLCBjbGFzc2ljOjppbnRlcm5hbDo6Q2hhbm5lbENvbmZpZ3VyYXRpb25TdGF0ZSBjb25maWcpOwotICB2aXJ0dWFsIHZvaWQgU2V0Q2hhbm5lbFR4UHJpb3JpdHkoQ2lkIGNpZCwgYm9vbCBoaWdoX3ByaW9yaXR5KTsKLSAgdmlydHVhbCB+RGF0YVBpcGVsaW5lTWFuYWdlcigpID0gZGVmYXVsdDsKLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgSUxpbmsqIGxpbmtfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Q2lkLCBTZW5kZXI+IHNlbmRlcl9tYXBfOwotICBzdGQ6OnVuaXF1ZV9wdHI8U2NoZWR1bGVyPiBzY2hlZHVsZXJfOwotICBSZWNlaXZlciByZWNlaXZlcl87Ci19OwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlcl9tb2NrLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9kYXRhX3BpcGVsaW5lX21hbmFnZXJfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZiOTI2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlcl9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIgotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZGF0YV9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0RhdGFQaXBlbGluZU1hbmFnZXIgOiBwdWJsaWMgRGF0YVBpcGVsaW5lTWFuYWdlciB7Ci0gcHVibGljOgotICBNb2NrRGF0YVBpcGVsaW5lTWFuYWdlcihvczo6SGFuZGxlciogaGFuZGxlciwgTG93ZXJRdWV1ZVVwRW5kKiBsaW5rX3F1ZXVlX3VwX2VuZCkKLSAgICAgIDogRGF0YVBpcGVsaW5lTWFuYWdlcihoYW5kbGVyLCBudWxscHRyLCBsaW5rX3F1ZXVlX3VwX2VuZCkge30KLSAgTU9DS19NRVRIT0Qodm9pZCwgQXR0YWNoQ2hhbm5lbCwgKENpZCwgc3RkOjpzaGFyZWRfcHRyPENoYW5uZWxJbXBsPiwgQ2hhbm5lbE1vZGUpLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgRGV0YWNoQ2hhbm5lbCwgKENpZCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChEYXRhQ29udHJvbGxlciosIEdldERhdGFDb250cm9sbGVyLCAoQ2lkKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIE9uUGFja2V0U2VudCwgKENpZCksIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmNjIGIvZ2QvbDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2FsbG9jYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxMjQ5Mi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9pbnRlcm5hbC9saW5rLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9zZWN1cml0eV9wb2xpY3kuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RkOjpzaGFyZWRfcHRyPER5bmFtaWNDaGFubmVsSW1wbD4gRHluYW1pY0NoYW5uZWxBbGxvY2F0b3I6OkFsbG9jYXRlQ2hhbm5lbChQc20gcHNtLCBDaWQgcmVtb3RlX2NpZCkgewotICBpZiAodXNlZF9yZW1vdGVfY2lkXy5maW5kKHJlbW90ZV9jaWQpICE9IHVzZWRfcmVtb3RlX2NpZF8uZW5kKCkpIHsKLSAgICBMT0dfSU5GTygiUmVtb3RlIGNpZCAweCV4IGlzIHVzZWQiLCByZW1vdGVfY2lkKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBDaWQgY2lkID0ga0ZpcnN0RHluYW1pY0NoYW5uZWw7Ci0gIGZvciAoOyBjaWQgPD0ga0xhc3REeW5hbWljQ2hhbm5lbDsgY2lkKyspIHsKLSAgICBpZiAodXNlZF9jaWRfLmZpbmQoY2lkKSA9PSB1c2VkX2NpZF8uZW5kKCkpIGJyZWFrOwotICB9Ci0gIGlmIChjaWQgPiBrTGFzdER5bmFtaWNDaGFubmVsKSB7Ci0gICAgTE9HX1dBUk4oIkFsbCBjaWQgYXJlIHVzZWQiKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBhdXRvIGVsZW0gPQotICAgICAgY2hhbm5lbHNfLnRyeV9lbXBsYWNlKGNpZCwgc3RkOjptYWtlX3NoYXJlZDxEeW5hbWljQ2hhbm5lbEltcGw+KHBzbSwgY2lkLCByZW1vdGVfY2lkLCBsaW5rXywgbDJjYXBfaGFuZGxlcl8pKTsKLSAgQVNTRVJUX0xPRyhlbGVtLnNlY29uZCwgIkZhaWxlZCB0byBjcmVhdGUgY2hhbm5lbCBmb3IgcHNtIDB4JXggZGV2aWNlICVzIiwgcHNtLAotICAgICAgICAgICAgIGxpbmtfLT5HZXREZXZpY2UoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBBU1NFUlQoZWxlbS5maXJzdC0+c2Vjb25kICE9IG51bGxwdHIpOwotICB1c2VkX3JlbW90ZV9jaWRfLmluc2VydChyZW1vdGVfY2lkKTsKLSAgdXNlZF9jaWRfLmluc2VydChjaWQpOwotICByZXR1cm4gZWxlbS5maXJzdC0+c2Vjb25kOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8RHluYW1pY0NoYW5uZWxJbXBsPiBEeW5hbWljQ2hhbm5lbEFsbG9jYXRvcjo6QWxsb2NhdGVSZXNlcnZlZENoYW5uZWwoQ2lkIHJlc2VydmVkX2NpZCwgUHNtIHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaWQgcmVtb3RlX2NpZCkgewotICBpZiAodXNlZF9yZW1vdGVfY2lkXy5maW5kKHJlbW90ZV9jaWQpICE9IHVzZWRfcmVtb3RlX2NpZF8uZW5kKCkpIHsKLSAgICBMT0dfSU5GTygiUmVtb3RlIGNpZCAweCV4IGlzIHVzZWQiLCByZW1vdGVfY2lkKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBhdXRvIGVsZW0gPSBjaGFubmVsc18udHJ5X2VtcGxhY2UoCi0gICAgICByZXNlcnZlZF9jaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8RHluYW1pY0NoYW5uZWxJbXBsPihwc20sIHJlc2VydmVkX2NpZCwgcmVtb3RlX2NpZCwgbGlua18sIGwyY2FwX2hhbmRsZXJfKSk7Ci0gIEFTU0VSVF9MT0coZWxlbS5zZWNvbmQsICJGYWlsZWQgdG8gY3JlYXRlIGNoYW5uZWwgZm9yIHBzbSAweCV4IGRldmljZSAlcyIsIHBzbSwKLSAgICAgICAgICAgICBsaW5rXy0+R2V0RGV2aWNlKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgQVNTRVJUKGVsZW0uZmlyc3QtPnNlY29uZCAhPSBudWxscHRyKTsKLSAgdXNlZF9yZW1vdGVfY2lkXy5pbnNlcnQocmVtb3RlX2NpZCk7Ci0gIHJldHVybiBlbGVtLmZpcnN0LT5zZWNvbmQ7Ci19Ci0KLUNpZCBEeW5hbWljQ2hhbm5lbEFsbG9jYXRvcjo6UmVzZXJ2ZUNoYW5uZWwoKSB7Ci0gIENpZCBjaWQgPSBrRmlyc3REeW5hbWljQ2hhbm5lbDsKLSAgZm9yICg7IGNpZCA8PSBrTGFzdER5bmFtaWNDaGFubmVsOyBjaWQrKykgewotICAgIGlmICh1c2VkX2NpZF8uZmluZChjaWQpID09IHVzZWRfY2lkXy5lbmQoKSkgYnJlYWs7Ci0gIH0KLSAgaWYgKGNpZCA+IGtMYXN0RHluYW1pY0NoYW5uZWwpIHsKLSAgICBMT0dfV0FSTigiQWxsIGNpZCBhcmUgdXNlZCIpOwotICAgIHJldHVybiBrSW52YWxpZENpZDsKLSAgfQotICB1c2VkX2NpZF8uaW5zZXJ0KGNpZCk7Ci0gIHJldHVybiBjaWQ7Ci19Ci0KLXZvaWQgRHluYW1pY0NoYW5uZWxBbGxvY2F0b3I6OkZyZWVDaGFubmVsKENpZCBjaWQpIHsKLSAgdXNlZF9jaWRfLmVyYXNlKGNpZCk7Ci0gIGF1dG8gY2hhbm5lbCA9IEZpbmRDaGFubmVsQnlDaWQoY2lkKTsKLSAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgewotICAgIExPR19JTkZPKCJDaGFubmVsIGlzIG5vdCBpbiB1c2U6IGNpZCAlZCwgZGV2aWNlICVzIiwgY2lkLCBsaW5rXy0+R2V0RGV2aWNlKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdXNlZF9yZW1vdGVfY2lkXy5lcmFzZShjaGFubmVsLT5HZXRSZW1vdGVDaWQoKSk7Ci0gIGNoYW5uZWxzXy5lcmFzZShjaWQpOwotfQotCi1ib29sIER5bmFtaWNDaGFubmVsQWxsb2NhdG9yOjpJc1BzbVVzZWQoUHNtIHBzbSkgY29uc3QgewotICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5uZWwgOiBjaGFubmVsc18pIHsKLSAgICBpZiAoY2hhbm5lbC5zZWNvbmQtPkdldFBzbSgpID09IHBzbSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPER5bmFtaWNDaGFubmVsSW1wbD4gRHluYW1pY0NoYW5uZWxBbGxvY2F0b3I6OkZpbmRDaGFubmVsQnlDaWQoQ2lkIGNpZCkgewotICBpZiAoY2hhbm5lbHNfLmZpbmQoY2lkKSA9PSBjaGFubmVsc18uZW5kKCkpIHsKLSAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBjaWQgJWQiLCBjaWQpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBjaGFubmVsc18uZmluZChjaWQpLT5zZWNvbmQ7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxEeW5hbWljQ2hhbm5lbEltcGw+IER5bmFtaWNDaGFubmVsQWxsb2NhdG9yOjpGaW5kQ2hhbm5lbEJ5UmVtb3RlQ2lkKENpZCByZW1vdGVfY2lkKSB7Ci0gIGZvciAoYXV0byYgY2hhbm5lbCA6IGNoYW5uZWxzXykgewotICAgIGlmIChjaGFubmVsLnNlY29uZC0+R2V0UmVtb3RlQ2lkKCkgPT0gcmVtb3RlX2NpZCkgewotICAgICAgcmV0dXJuIGNoYW5uZWwuc2Vjb25kOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotc2l6ZV90IER5bmFtaWNDaGFubmVsQWxsb2NhdG9yOjpOdW1iZXJPZkNoYW5uZWxzKCkgY29uc3QgewotICByZXR1cm4gY2hhbm5lbHNfLnNpemUoKTsKLX0KLQotdm9pZCBEeW5hbWljQ2hhbm5lbEFsbG9jYXRvcjo6T25BY2xEaXNjb25uZWN0ZWQoaGNpOjpFcnJvckNvZGUgcmVhc29uKSB7Ci0gIGZvciAoYXV0byYgZWxlbSA6IGNoYW5uZWxzXykgewotICAgIGVsZW0uc2Vjb25kLT5PbkNsb3NlZChyZWFzb24pOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTZkNDQuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2FsbG9jYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL3NlY3VyaXR5X3BvbGljeS5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2lsaW5rLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci0KLW5hbWVzcGFjZSBjbGFzc2ljIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBEdW1wc3lzSGVscGVyOwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgY2xhc3NpYwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBEeW5hbWljQ2hhbm5lbEltcGw7Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3Iga2VlcGluZyBjaGFubmVscyBpbiBhIExpbmsuIEl0IGFsbG9jYXRlcyBhbmQgZnJlZXMgQ2hhbm5lbCBvYmplY3QsIGFuZCBzdXBwb3J0cyBxdWVyeWluZyB3aGV0aGVyIGEKLS8vIGNoYW5uZWwgaXMgaW4gdXNlCi1jbGFzcyBEeW5hbWljQ2hhbm5lbEFsbG9jYXRvciB7Ci0gcHVibGljOgotICBEeW5hbWljQ2hhbm5lbEFsbG9jYXRvcihsMmNhcDo6aW50ZXJuYWw6OklMaW5rKiBsaW5rLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcikKLSAgICAgIDogbGlua18obGluayksIGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpIHsKLSAgICBBU1NFUlQobGlua18gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGwyY2FwX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICB9Ci0KLSAgLy8gQWxsb2NhdGVzIGEgY2hhbm5lbC4gSWYgcHNtIGlzIHVzZWQsIE9SIHRoZSByZW1vdGUgY2lkIGFscmVhZHkgZXhpc3RzLCByZXR1cm4gbnVsbHB0ci4KLSAgLy8gTk9URTogVGhlIHJldHVybmVkIER5bmFtaWNDaGFubmVsSW1wbCBvYmplY3QgaXMgc3RpbGwgb3duZWQgYnkgdGhlIGNoYW5uZWwgYWxsb2NhdG9yLCBOT1QgdGhlIGNsaWVudC4KLSAgc3RkOjpzaGFyZWRfcHRyPER5bmFtaWNDaGFubmVsSW1wbD4gQWxsb2NhdGVDaGFubmVsKFBzbSBwc20sIENpZCByZW1vdGVfY2lkKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8RHluYW1pY0NoYW5uZWxJbXBsPiBBbGxvY2F0ZVJlc2VydmVkQ2hhbm5lbChDaWQgcmVzZXJ2ZWRfY2lkLCBQc20gcHNtLCBDaWQgcmVtb3RlX2NpZCk7Ci0KLSAgLy8gR2l2ZXMgYW4gdW51c2VkIENpZCB0byBiZSB1c2VkIGZvciBvcGVuaW5nIGEgY2hhbm5lbC4gSWYgYSBjaGFubmVsIGlzIHVzZWQsIGNhbGwgQWxsb2NhdGVSZXNlcnZlZENoYW5uZWwuIElmIG5vCi0gIC8vIGxvbmdlciBuZWVkZWQsIHVzZSBGcmVlQ2hhbm5lbC4KLSAgQ2lkIFJlc2VydmVDaGFubmVsKCk7Ci0KLSAgLy8gRnJlZXMgYSBjaGFubmVsIChleGlzdGluZyBvciByZXNlcnZlZCkKLSAgdm9pZCBGcmVlQ2hhbm5lbChDaWQgY2lkKTsKLQotICBib29sIElzUHNtVXNlZChQc20gcHNtKSBjb25zdDsKLQotICBzdGQ6OnNoYXJlZF9wdHI8RHluYW1pY0NoYW5uZWxJbXBsPiBGaW5kQ2hhbm5lbEJ5Q2lkKENpZCBjaWQpOwotICBzdGQ6OnNoYXJlZF9wdHI8RHluYW1pY0NoYW5uZWxJbXBsPiBGaW5kQ2hhbm5lbEJ5UmVtb3RlQ2lkKENpZCBjaWQpOwotCi0gIC8vIFJldHVybnMgbnVtYmVyIG9mIG9wZW4sIGJ1dCBub3QgcmVzZXJ2ZWQgY2hhbm5lbHMKLSAgc2l6ZV90IE51bWJlck9mQ2hhbm5lbHMoKSBjb25zdDsKLQotICB2b2lkIE9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OmludGVybmFsOjpEdW1wc3lzSGVscGVyOwotICBsMmNhcDo6aW50ZXJuYWw6OklMaW5rKiBsaW5rXzsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8Q2lkPiB1c2VkX2NpZF87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxDaWQsIHN0ZDo6c2hhcmVkX3B0cjxEeW5hbWljQ2hhbm5lbEltcGw+PiBjaGFubmVsc187Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDxDaWQ+IHVzZWRfcmVtb3RlX2NpZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl9mdXp6X3Rlc3QuY2MgYi9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX2Z1enpfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NjA4Ni4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX2Z1enpfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9wYXJhbWV0ZXJfcHJvdmlkZXJfbW9jay5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdXNpbmcgY2xhc3NpYzo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tMaW5rOwotdXNpbmcgaGNpOjp0ZXN0aW5nOjpNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb247Ci11c2luZyBsMmNhcDo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tQYXJhbWV0ZXJQcm92aWRlcjsKLXVzaW5nIGwyY2FwOjppbnRlcm5hbDo6dGVzdGluZzo6TW9ja1NjaGVkdWxlcjsKLXVzaW5nIDo6dGVzdGluZzo6TmljZU1vY2s7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLQotY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTU307Ci0KLWNsYXNzIEwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsQWxsb2NhdG9yRnV6elRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBSdW5UZXN0cyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIFNldFVwKCk7Ci0gICAgVGVzdFByZWNvbmRpdGlvbihkYXRhLCBzaXplKTsKLSAgICBUZWFyRG93bigpOwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldFVwKCkgewotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgICBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8gPSBuZXcgTmljZU1vY2s8TW9ja1BhcmFtZXRlclByb3ZpZGVyPigpOwotICAgIG1vY2tfY2xhc3NpY19saW5rXyA9IG5ldyBOaWNlTW9jazxNb2NrTGluaz4oaGFuZGxlcl8sIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8TmljZU1vY2s8TW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uPj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tfY2xhc3NpY19saW5rXywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgICBjaGFubmVsX2FsbG9jYXRvcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPER5bmFtaWNDaGFubmVsQWxsb2NhdG9yPihtb2NrX2NsYXNzaWNfbGlua18sIGhhbmRsZXJfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgY2hhbm5lbF9hbGxvY2F0b3JfLnJlc2V0KCk7Ci0gICAgZGVsZXRlIG1vY2tfY2xhc3NpY19saW5rXzsKLSAgICBkZWxldGUgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfOwotICAgIGhhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBoYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIHZvaWQgVGVzdFByZWNvbmRpdGlvbihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplICE9IDIpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUHNtIHBzbSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFBzbSo+KGRhdGEpOwotICAgIEVYUEVDVF9GQUxTRShjaGFubmVsX2FsbG9jYXRvcl8tPklzUHNtVXNlZChwc20pKTsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF97bnVsbHB0cn07Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyX3tudWxscHRyfTsKLSAgTmljZU1vY2s8TW9ja1BhcmFtZXRlclByb3ZpZGVyPiogbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfe251bGxwdHJ9OwotICBOaWNlTW9jazxNb2NrTGluaz4qIG1vY2tfY2xhc3NpY19saW5rX3tudWxscHRyfTsKLSAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsQWxsb2NhdG9yPiBjaGFubmVsX2FsbG9jYXRvcl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi12b2lkIFJ1bkwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsQWxsb2NhdG9yRnV6elRlc3QoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgYmx1ZXRvb3RoOjpsMmNhcDo6aW50ZXJuYWw6OkwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsQWxsb2NhdG9yRnV6elRlc3QgdGVzdDsKLSAgdGVzdC5SdW5UZXN0cyhkYXRhLCBzaXplKTsKLX0KZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3JfdGVzdC5jYyBiL2dkL2wyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3JfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2ZTJjNC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvbGlua19tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyX21vY2suaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdXNpbmcgY2xhc3NpYzo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tMaW5rOwotdXNpbmcgbDJjYXA6OmludGVybmFsOjp0ZXN0aW5nOjpNb2NrUGFyYW1ldGVyUHJvdmlkZXI7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLQotY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTU307Ci0KLWNsYXNzIEwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsQWxsb2NhdG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfID0gbmV3IE1vY2tQYXJhbWV0ZXJQcm92aWRlcigpOwotICAgIG1vY2tfY2xhc3NpY19saW5rXyA9IG5ldyBNb2NrTGluayhoYW5kbGVyXywgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19jbGFzc2ljX2xpbmtfLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICAgIGNoYW5uZWxfYWxsb2NhdG9yXyA9IHN0ZDo6bWFrZV91bmlxdWU8RHluYW1pY0NoYW5uZWxBbGxvY2F0b3I+KG1vY2tfY2xhc3NpY19saW5rXywgaGFuZGxlcl8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjaGFubmVsX2FsbG9jYXRvcl8ucmVzZXQoKTsKLSAgICBkZWxldGUgbW9ja19jbGFzc2ljX2xpbmtfOwotICAgIGRlbGV0ZSBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgb3M6OlRocmVhZCogdGhyZWFkX3tudWxscHRyfTsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfe251bGxwdHJ9OwotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIqIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyX3tudWxscHRyfTsKLSAgTW9ja0xpbmsqIG1vY2tfY2xhc3NpY19saW5rX3tudWxscHRyfTsKLSAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsQWxsb2NhdG9yPiBjaGFubmVsX2FsbG9jYXRvcl87Ci19OwotCi1URVNUX0YoTDJjYXBDbGFzc2ljRHluYW1pY0NoYW5uZWxBbGxvY2F0b3JUZXN0LCBwcmVjb25kaXRpb24pIHsKLSAgUHNtIHBzbSA9IDB4MDM7Ci0gIEVYUEVDVF9GQUxTRShjaGFubmVsX2FsbG9jYXRvcl8tPklzUHNtVXNlZChwc20pKTsKLX0KLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsQWxsb2NhdG9yVGVzdCwgYWxsb2NhdGVfYW5kX2ZyZWVfY2hhbm5lbCkgewotICBQc20gcHNtID0gMHgwMzsKLSAgQ2lkIHJlbW90ZV9jaWQgPSBrRmlyc3REeW5hbWljQ2hhbm5lbDsKLSAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5BbGxvY2F0ZUNoYW5uZWwocHNtLCByZW1vdGVfY2lkKTsKLSAgQ2lkIGxvY2FsX2NpZCA9IGNoYW5uZWwtPkdldENpZCgpOwotICBFWFBFQ1RfVFJVRShjaGFubmVsX2FsbG9jYXRvcl8tPklzUHNtVXNlZChwc20pKTsKLSAgRVhQRUNUX0VRKGNoYW5uZWwsIGNoYW5uZWxfYWxsb2NhdG9yXy0+RmluZENoYW5uZWxCeUNpZChsb2NhbF9jaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoY2hhbm5lbF9hbGxvY2F0b3JfLT5GcmVlQ2hhbm5lbChsb2NhbF9jaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNQc21Vc2VkKHBzbSkpOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRHluYW1pY0NoYW5uZWxBbGxvY2F0b3JUZXN0LCByZXNlcnZlX2NoYW5uZWwpIHsKLSAgUHNtIHBzbSA9IDB4MDM7Ci0gIENpZCByZW1vdGVfY2lkID0ga0ZpcnN0RHluYW1pY0NoYW5uZWw7Ci0gIENpZCByZXNlcnZlZCA9IGNoYW5uZWxfYWxsb2NhdG9yXy0+UmVzZXJ2ZUNoYW5uZWwoKTsKLSAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5BbGxvY2F0ZVJlc2VydmVkQ2hhbm5lbChyZXNlcnZlZCwgcHNtLCByZW1vdGVfY2lkKTsKLSAgQ2lkIGxvY2FsX2NpZCA9IGNoYW5uZWwtPkdldENpZCgpOwotICBFWFBFQ1RfRVEobG9jYWxfY2lkLCByZXNlcnZlZCk7Ci0gIEVYUEVDVF9UUlVFKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNQc21Vc2VkKHBzbSkpOwotICBFWFBFQ1RfRVEoY2hhbm5lbCwgY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbEJ5Q2lkKGxvY2FsX2NpZCkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShjaGFubmVsX2FsbG9jYXRvcl8tPkZyZWVDaGFubmVsKGxvY2FsX2NpZCkpOwotICBFWFBFQ1RfRkFMU0UoY2hhbm5lbF9hbGxvY2F0b3JfLT5Jc1BzbVVzZWQocHNtKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbC5jYyBiL2dkL2wyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNlY2M1Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmsuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL3NlY3VyaXR5X3BvbGljeS5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvc2VuZGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1EeW5hbWljQ2hhbm5lbEltcGw6OkR5bmFtaWNDaGFubmVsSW1wbChQc20gcHNtLCBDaWQgY2lkLCBDaWQgcmVtb3RlX2NpZCwgbDJjYXA6OmludGVybmFsOjpJTGluayogbGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyKQotICAgIDogcHNtXyhwc20pLCBjaWRfKGNpZCksIHJlbW90ZV9jaWRfKHJlbW90ZV9jaWQpLCBsaW5rXyhsaW5rKSwgbDJjYXBfaGFuZGxlcl8obDJjYXBfaGFuZGxlciksCi0gICAgICBkZXZpY2VfKGxpbmstPkdldERldmljZSgpKSB7Ci0gIEFTU0VSVChjaWRfID4gMCk7Ci0gIEFTU0VSVChyZW1vdGVfY2lkXyA+IDApOwotICBBU1NFUlQobGlua18gIT0gbnVsbHB0cik7Ci0gIEFTU0VSVChsMmNhcF9oYW5kbGVyXyAhPSBudWxscHRyKTsKLX0KLQotaGNpOjpBZGRyZXNzV2l0aFR5cGUgRHluYW1pY0NoYW5uZWxJbXBsOjpHZXREZXZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBkZXZpY2VfOwotfQotCi12b2lkIER5bmFtaWNDaGFubmVsSW1wbDo6UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soRHluYW1pY0NoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjaykgewotICBBU1NFUlRfTE9HKG9uX2Nsb3NlX2NhbGxiYWNrXy5Jc0VtcHR5KCksICJPbkNsb3NlQ2FsbGJhY2sgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZCBvbmNlIik7Ci0gIC8vIElmIGNoYW5uZWwgaXMgYWxyZWFkeSBjbG9zZWQsIGNhbGwgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5IHdpdGhvdXQgc2F2aW5nIGl0Ci0gIGlmIChjbG9zZWRfKSB7Ci0gICAgb25fY2xvc2VfY2FsbGJhY2suSW52b2tlKGNsb3NlX3JlYXNvbl8pOwotICAgIHJldHVybjsKLSAgfQotICBvbl9jbG9zZV9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fY2xvc2VfY2FsbGJhY2spOwotfQotCi12b2lkIER5bmFtaWNDaGFubmVsSW1wbDo6Q2xvc2UoKSB7Ci0gIGlmIChsaW5rXyA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCJDaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxpbmtfLT5TZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoY2lkXywgcmVtb3RlX2NpZF8pOwotfQotCi12b2lkIER5bmFtaWNDaGFubmVsSW1wbDo6T25DbG9zZWQoaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7Ci0gIEFTU0VSVF9MT0coIWNsb3NlZF8sICJEZXZpY2UgJXMgQ2lkIDB4JXggY2xvc2VkIHR3aWNlLCBvbGQgc3RhdHVzIDB4JXgsIG5ldyBzdGF0dXMgMHgleCIsIGRldmljZV8uVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgIGNpZF8sIHN0YXRpY19jYXN0PGludD4oY2xvc2VfcmVhc29uXyksIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7Ci0gIGNsb3NlZF8gPSB0cnVlOwotICBjbG9zZV9yZWFzb25fID0gc3RhdHVzOwotICBsaW5rXyA9IG51bGxwdHI7Ci0gIGwyY2FwX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgb25fY2xvc2VfY2FsbGJhY2tfLkludm9rZUlmTm90RW1wdHkoY2xvc2VfcmVhc29uXyk7Ci0gIG9uX2Nsb3NlX2NhbGxiYWNrXyA9IHt9OwotfQotCi1zdGQ6OnN0cmluZyBEeW5hbWljQ2hhbm5lbEltcGw6OlRvU3RyaW5nKCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJEZXZpY2UgIiA8PCBkZXZpY2VfIDw8ICJQc20gMHgiIDw8IHN0ZDo6aGV4IDw8IHBzbV8gPDwgIiBDaWQgMHgiIDw8IHN0ZDo6aGV4IDw8IGNpZF87Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDEyZmZmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9keW5hbWljX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9pbGluay5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9tdHUuaCIKLSNpbmNsdWRlICJsMmNhcC9wc20uaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIER5bmFtaWNDaGFubmVsSW1wbCA6IHB1YmxpYyBsMmNhcDo6aW50ZXJuYWw6OkNoYW5uZWxJbXBsIHsKLSBwdWJsaWM6Ci0gIER5bmFtaWNDaGFubmVsSW1wbChQc20gcHNtLCBDaWQgY2lkLCBDaWQgcmVtb3RlX2NpZCwgbDJjYXA6OmludGVybmFsOjpJTGluayogbGluaywgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgfkR5bmFtaWNDaGFubmVsSW1wbCgpID0gZGVmYXVsdDsKLQotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBHZXREZXZpY2UoKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soRHluYW1pY0NoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjayk7Ci0KLSAgdmlydHVhbCB2b2lkIENsb3NlKCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkNsb3NlZChoY2k6OkVycm9yQ29kZSBzdGF0dXMpOwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCk7Ci0KLSAgY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlciwgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+KiBHZXRRdWV1ZVVwRW5kKCkgewotICAgIHJldHVybiBjaGFubmVsX3F1ZXVlXy5HZXRVcEVuZCgpOwotICB9Ci0KLSAgY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4sIHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+KiBHZXRRdWV1ZURvd25FbmQoKSB7Ci0gICAgcmV0dXJuIGNoYW5uZWxfcXVldWVfLkdldERvd25FbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgQ2lkIEdldENpZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2lkXzsKLSAgfQotCi0gIHZpcnR1YWwgQ2lkIEdldFJlbW90ZUNpZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVtb3RlX2NpZF87Ci0gIH0KLQotICB2aXJ0dWFsIFBzbSBHZXRQc20oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHBzbV87Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgU2V0Q2hhbm5lbFR4UHJpb3JpdHkoYm9vbCBoaWdoX3ByaW9yaXR5KSB7Ci0gICAgbGlua18tPlNldENoYW5uZWxUeFByaW9yaXR5KGNpZF8sIGhpZ2hfcHJpb3JpdHkpOwotICB9Ci0KLSAgLy8gVE9ETyhjbWFudG9uKSBEbyBzb21ldGhpbmcgYSBsaXR0bGUgYml0IGJldHRlciB0aGFuIHRoaXMKLSAgYm9vbCBsb2NhbF9pbml0aWF0ZWRfe2ZhbHNlfTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IFBzbSBwc21fOwotICBjb25zdCBDaWQgY2lkXzsKLSAgY29uc3QgQ2lkIHJlbW90ZV9jaWRfOwotICBsMmNhcDo6aW50ZXJuYWw6OklMaW5rKiBsaW5rXzsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2VfOwotCi0gIC8vIFVzZXIgc3VwcG9ydGVkIHN0YXRlcwotICBEeW5hbWljQ2hhbm5lbDo6T25DbG9zZUNhbGxiYWNrIG9uX2Nsb3NlX2NhbGxiYWNrX3t9OwotCi0gIC8vIEludGVybmFsIHN0YXRlcwotICBib29sIGNsb3NlZF8gPSBmYWxzZTsKLSAgaGNpOjpFcnJvckNvZGUgY2xvc2VfcmVhc29uXyA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrQ2hhbm5lbFF1ZXVlU2l6ZSA9IDU7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+LCBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBjaGFubmVsX3F1ZXVlX3sKLSAgICAgIGtDaGFubmVsUXVldWVTaXplfTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRHluYW1pY0NoYW5uZWxJbXBsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbF90ZXN0LmNjIGIvZ2QvbDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGxfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2OTg2OS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbC5oIgotCi0jaW5jbHVkZSAiY29tbW9uL3Rlc3RpbmcvYmluZF90ZXN0X3V0aWwuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi11c2luZyBjbGFzc2ljOjppbnRlcm5hbDo6dGVzdGluZzo6TW9ja0xpbms7Ci11c2luZyBsMmNhcDo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tQYXJhbWV0ZXJQcm92aWRlcjsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1jbGFzcyBMMmNhcENsYXNzaWNEeW5hbWljQ2hhbm5lbEltcGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTeW5jSGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBsMmNhcF9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgbDJjYXBfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGwyY2FwX2hhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgb3M6OlRocmVhZCogdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1jbGFzcyBTdGF0dXNDYXB0dXJlIHsKLSBwdWJsaWM6Ci0gIGhjaTo6RXJyb3JDb2RlIHZhbHVlID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIHZvaWQgY2FwdHVyZShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsKLSAgICB2YWx1ZSA9IHN0YXR1czsKLSAgfQotfTsKLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsSW1wbFRlc3QsIGdldF9kZXZpY2UpIHsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyKTsKLSAgY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTU307Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19saW5rLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBEeW5hbWljQ2hhbm5lbEltcGwgZHluYW1pY19jaGFubmVsX2ltcGwoMHgwMSwga0ZpcnN0RHluYW1pY0NoYW5uZWwsIGtGaXJzdER5bmFtaWNDaGFubmVsLCAmbW9ja19jbGFzc2ljX2xpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcF9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9FUShkZXZpY2UsIGR5bmFtaWNfY2hhbm5lbF9pbXBsLkdldERldmljZSgpKTsKLX0KLQotVEVTVF9GKEwyY2FwQ2xhc3NpY0R5bmFtaWNDaGFubmVsSW1wbFRlc3QsIGNsb3NlX3RyaWdnZXJzX2NhbGxiYWNrKSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgTW9ja0xpbmsgbW9ja19jbGFzc2ljX2xpbmsobDJjYXBfaGFuZGxlcl8sICZtb2NrX3BhcmFtZXRlcl9wcm92aWRlcik7Ci0gIGNvbnN0IGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXt7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2NsYXNzaWNfbGluaywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgRHluYW1pY0NoYW5uZWxJbXBsIGR5bmFtaWNfY2hhbm5lbF9pbXBsKDB4MDEsIGtGaXJzdER5bmFtaWNDaGFubmVsLCBrRmlyc3REeW5hbWljQ2hhbm5lbCwgJm1vY2tfY2xhc3NpY19saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIG9uIGNsb3NlIGNhbGxiYWNrCi0gIGF1dG8gdXNlcl9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6SGFuZGxlcj4odGhyZWFkXyk7Ci0gIFN0YXR1c0NhcHR1cmUqIG15X3N0YXR1cyA9IG5ldyBTdGF0dXNDYXB0dXJlKCk7Ci0gIGR5bmFtaWNfY2hhbm5lbF9pbXBsLlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKHVzZXJfaGFuZGxlci0+QmluZE9uY2VPbihteV9zdGF0dXMsICZTdGF0dXNDYXB0dXJlOjpjYXB0dXJlKSk7Ci0KLSAgLy8gQ2hhbm5lbCBjbG9zdXJlIHNob3VsZCB0cmlnZ2VyIHN1Y2ggY2FsbGJhY2sKLSAgZHluYW1pY19jaGFubmVsX2ltcGwuT25DbG9zZWQoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlci5nZXQoKSk7Ci0gIEVYUEVDVF9FUShoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OLCBteV9zdGF0dXMtPnZhbHVlKTsKLQotICB1c2VyX2hhbmRsZXItPkNsZWFyKCk7Ci0gIGRlbGV0ZSBteV9zdGF0dXM7Ci19Ci0KLVRFU1RfRihMMmNhcENsYXNzaWNEeW5hbWljQ2hhbm5lbEltcGxUZXN0LCByZWdpc3Rlcl9jYWxsYmFja19hZnRlcl9jbG9zZV9zaG91bGRfY2FsbF9pbW1lZGlhdGVseSkgewotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXI7Ci0gIE1vY2tMaW5rIG1vY2tfY2xhc3NpY19saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIpOwotICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2V7e3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX0sIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIER5bmFtaWNDaGFubmVsSW1wbCBkeW5hbWljX2NoYW5uZWxfaW1wbCgweDAxLCBrRmlyc3REeW5hbWljQ2hhbm5lbCwga0ZpcnN0RHluYW1pY0NoYW5uZWwsICZtb2NrX2NsYXNzaWNfbGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBDaGFubmVsIGNsb3N1cmUgc2hvdWxkIGRvIG5vdGhpbmcKLSAgZHluYW1pY19jaGFubmVsX2ltcGwuT25DbG9zZWQoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sgc2hvdWxkIHRyaWdnZXIgY2FsbGJhY2sgaW1tZWRpYXRlbHkKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgU3RhdHVzQ2FwdHVyZSogbXlfc3RhdHVzID0gbmV3IFN0YXR1c0NhcHR1cmUoKTsKLSAgZHluYW1pY19jaGFubmVsX2ltcGwuUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2sodXNlcl9oYW5kbGVyLT5CaW5kT25jZU9uKG15X3N0YXR1cywgJlN0YXR1c0NhcHR1cmU6OmNhcHR1cmUpKTsKLQotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXIuZ2V0KCkpOwotICBFWFBFQ1RfRVEoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTiwgbXlfc3RhdHVzLT52YWx1ZSk7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotICBkZWxldGUgbXlfc3RhdHVzOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRHluYW1pY0NoYW5uZWxJbXBsVGVzdCwgY2xvc2VfdHdpY2Vfc2hvdWxkX2ZhaWwpIHsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyOwotICBNb2NrTGluayBtb2NrX2NsYXNzaWNfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyKTsKLSAgY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTU307Ci0gIEVYUEVDVF9DQUxMKG1vY2tfY2xhc3NpY19saW5rLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBEeW5hbWljQ2hhbm5lbEltcGwgZHluYW1pY19jaGFubmVsX2ltcGwoMHgwMSwga0ZpcnN0RHluYW1pY0NoYW5uZWwsIGtGaXJzdER5bmFtaWNDaGFubmVsLCAmbW9ja19jbGFzc2ljX2xpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgU3RhdHVzQ2FwdHVyZSogbXlfc3RhdHVzID0gbmV3IFN0YXR1c0NhcHR1cmUoKTsKLSAgZHluYW1pY19jaGFubmVsX2ltcGwuUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2sodXNlcl9oYW5kbGVyLT5CaW5kT25jZU9uKG15X3N0YXR1cywgJlN0YXR1c0NhcHR1cmU6OmNhcHR1cmUpKTsKLQotICAvLyBDaGFubmVsIGNsb3N1cmUgc2hvdWxkIHRyaWdnZXIgc3VjaCBjYWxsYmFjawotICBkeW5hbWljX2NoYW5uZWxfaW1wbC5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKTsKLSAgU3luY0hhbmRsZXIodXNlcl9oYW5kbGVyLmdldCgpKTsKLSAgRVhQRUNUX0VRKGhjaTo6RXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04sIG15X3N0YXR1cy0+dmFsdWUpOwotCi0gIC8vIDJuZCBPbkNsb3NlKCkgY2FsbGJhY2sgc2hvdWxkIGZhaWwKLSAgRVhQRUNUX0RFQVRIKGR5bmFtaWNfY2hhbm5lbF9pbXBsLk9uQ2xvc2VkKGhjaTo6RXJyb3JDb2RlOjpQQUdFX1RJTUVPVVQpLCAiLipPbkNsb3NlZC4qIik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotICBkZWxldGUgbXlfc3RhdHVzOwotfQotCi1URVNUX0YoTDJjYXBDbGFzc2ljRHluYW1pY0NoYW5uZWxJbXBsVGVzdCwgbXVsdGlwbGVfcmVnaXN0ZXJhdGlvbl9zaG91bGRfZmFpbCkgewotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXI7Ci0gIE1vY2tMaW5rIG1vY2tfY2xhc3NpY19saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIpOwotICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2V7e3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX0sIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19JREVOVElUWV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19jbGFzc2ljX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIER5bmFtaWNDaGFubmVsSW1wbCBkeW5hbWljX2NoYW5uZWxfaW1wbCgweDAxLCBrRmlyc3REeW5hbWljQ2hhbm5lbCwga0ZpcnN0RHluYW1pY0NoYW5uZWwsICZtb2NrX2NsYXNzaWNfbGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBSZWdpc3RlciBvbiBjbG9zZSBjYWxsYmFjawotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotICBTdGF0dXNDYXB0dXJlKiBteV9zdGF0dXMgPSBuZXcgU3RhdHVzQ2FwdHVyZSgpOwotICBkeW5hbWljX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayh1c2VyX2hhbmRsZXItPkJpbmRPbmNlT24obXlfc3RhdHVzLCAmU3RhdHVzQ2FwdHVyZTo6Y2FwdHVyZSkpOwotCi0gIEVYUEVDVF9ERUFUSCgKLSAgICAgIGR5bmFtaWNfY2hhbm5lbF9pbXBsLlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKHVzZXJfaGFuZGxlci0+QmluZE9uY2UoW10oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IEZBSUwoKTsgfSkpLAotICAgICAgIi4qUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2suKiIpOwotCi0gIHVzZXJfaGFuZGxlci0+Q2xlYXIoKTsKLSAgZGVsZXRlIG15X3N0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2VuaGFuY2VkX3JldHJhbnNtaXNzaW9uX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuY2MgYi9nZC9sMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWMyM2U2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL2VuaGFuY2VkX3JldHJhbnNtaXNzaW9uX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9pbGluay5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0jaW5jbHVkZSAicGFja2V0L2ZyYWdtZW50aW5nX2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1FcnRtQ29udHJvbGxlcjo6RXJ0bUNvbnRyb2xsZXIoSUxpbmsqIGxpbmssIENpZCBjaWQsIENpZCByZW1vdGVfY2lkLCBVcHBlclF1ZXVlRG93bkVuZCogY2hhbm5lbF9xdWV1ZV9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsIFNjaGVkdWxlciogc2NoZWR1bGVyKQotICAgIDogbGlua18obGluayksIGNpZF8oY2lkKSwgcmVtb3RlX2NpZF8ocmVtb3RlX2NpZCksIGVucXVldWVfYnVmZmVyXyhjaGFubmVsX3F1ZXVlX2VuZCksIGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgc2NoZWR1bGVyXyhzY2hlZHVsZXIpLCBwaW1wbF8oc3RkOjptYWtlX3VuaXF1ZTxpbXBsPih0aGlzLCBoYW5kbGVyKSkge30KLQotRXJ0bUNvbnRyb2xsZXI6On5FcnRtQ29udHJvbGxlcigpIHsKLSAgZW5xdWV1ZV9idWZmZXJfLkNsZWFyKCk7Ci19Ci0KLXN0cnVjdCBFcnRtQ29udHJvbGxlcjo6aW1wbCB7Ci0gIGltcGwoRXJ0bUNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgICAgOiBjb250cm9sbGVyXyhjb250cm9sbGVyKSwgaGFuZGxlcl8oaGFuZGxlciksIHJldHJhbnNfdGltZXJfKGhhbmRsZXIpLCBtb25pdG9yX3RpbWVyXyhoYW5kbGVyKSB7fQotCi0gIEVydG1Db250cm9sbGVyKiBjb250cm9sbGVyXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotCi0gIC8vIFdlIGRvbid0IHN1cHBvcnQgZXh0ZW5kZWQgd2luZG93Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWF4VHhXaW4gPSA2NDsKLQotICAvLyBXZSBkb24ndCBzdXBwb3J0IHNlbmRpbmcgU1JFSgotICBzdGF0aWMgY29uc3RleHByIGJvb2wga1NlbmRTcmVqID0gZmFsc2U7Ci0KLSAgLy8gU3RhdGVzIChAc2VlIDguNi41LjIpOiBUcmFuc21pdHRlciBzdGF0ZSBhbmQgcmVjZWl2ZXIgc3RhdGUKLQotICBlbnVtIGNsYXNzIFR4U3RhdGUgewotICAgIFhNSVQsCi0gICAgV0FJVF9GLAotICB9OwotICBUeFN0YXRlIHR4X3N0YXRlXyA9IFR4U3RhdGU6OlhNSVQ7Ci0KLSAgZW51bSBjbGFzcyBSeFN0YXRlIHsKLSAgICBSRUNWLAotICAgIFJFSl9TRU5ULAotICAgIFNSRUpfU0VOVCwKLSAgfTsKLSAgUnhTdGF0ZSByeF9zdGF0ZV8gPSBSeFN0YXRlOjpSRUNWOwotCi0gIC8vIFZhcmlhYmxlcyBhbmQgVGltZXJzIChAc2VlIDguNi41LjMpCi0KLSAgdWludDhfdCB0eF9zZXFfID0gMDsKLSAgdWludDhfdCBuZXh0X3R4X3NlcV8gPSAwOwotICB1aW50OF90IGV4cGVjdGVkX2Fja19zZXFfID0gMDsKLSAgdWludDhfdCByZXFfc2VxXyA9IDA7Ci0gIHVpbnQ4X3QgZXhwZWN0ZWRfdHhfc2VxXyA9IDA7Ci0gIHVpbnQ4X3QgYnVmZmVyX3NlcV8gPSAwOwotCi0gIGJvb2wgcmVtb3RlX2J1c3lfID0gZmFsc2U7Ci0gIGJvb2wgbG9jYWxfYnVzeV8gPSBmYWxzZTsKLSAgaW50IHVuYWNrZWRfZnJhbWVzXyA9IDA7Ci0gIC8vIFRPRE86IEluc3RlYWQgb2YgaGF2aW5nIGEgbWFwLCB3ZSBtYXkgY29uc2lkZXIgYWJvdXQgYSBiZXR0ZXIgZGF0YSBzdHJ1Y3R1cmUKLSAgLy8gTWFwIGZyb20gVHhTZXEgdG8gKFNBUiwgU0RVIHNpemUgZm9yIFNUQVJUIHBhY2tldCwgaW5mb3JtYXRpb24gcGF5bG9hZCkKLSAgc3RkOjptYXA8dWludDhfdCwgc3RkOjp0dXBsZTxTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5LCB1aW50MTZfdCwgc3RkOjpzaGFyZWRfcHRyPHBhY2tldDo6UmF3QnVpbGRlcj4+PiB1bmFja2VkX2xpc3RfOwotICAvLyBTdG9yZXMgKFNBUiwgU0RVIHNpemUgZm9yIFNUQVJUIHBhY2tldCwgaW5mb3JtYXRpb24gcGF5bG9hZCkKLSAgc3RkOjpxdWV1ZTxzdGQ6OnR1cGxlPFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHksIHVpbnQxNl90LCBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPj4+IHBlbmRpbmdfZnJhbWVzXzsKLSAgaW50IHJldHJ5X2NvdW50XyA9IDA7Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QgLyogdHhfc2VxLCAqLywgaW50IC8qIGNvdW50ICovPiByZXRyeV9pX2ZyYW1lc187Ci0gIGJvb2wgcm5yX3NlbnRfID0gZmFsc2U7Ci0gIGJvb2wgcmVqX2FjdGlvbmVkXyA9IGZhbHNlOwotICBib29sIHNyZWpfYWN0aW9uZWRfID0gZmFsc2U7Ci0gIHVpbnQxNl90IHNyZWpfc2F2ZV9yZXFfc2VxXyA9IDA7Ci0gIGJvb2wgc2VuZF9yZWpfID0gZmFsc2U7Ci0gIGludCBidWZmZXJfc2VxX3NyZWpfID0gMDsKLSAgaW50IGZyYW1lc19zZW50XyA9IDA7Ci0gIG9zOjpBbGFybSByZXRyYW5zX3RpbWVyXzsKLSAgb3M6OkFsYXJtIG1vbml0b3JfdGltZXJfOwotCi0gIC8vIEV2ZW50cyAoQHNlZSA4LjYuNS40KQotCi0gIHZvaWQgZGF0YV9yZXF1ZXN0KFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHkgc2FyLCBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBwZHUsIHVpbnQxNl90IHNkdV9zaXplID0gMCkgewotICAgIC8vIE5vdGU6IHNkdV9zaXplIG9ubHkgYXBwbGllcyB0byBTVEFSVCBwYWNrZXQKLSAgICBpZiAodHhfc3RhdGVfID09IFR4U3RhdGU6OlhNSVQgJiYgIXJlbW90ZV9idXN5KCkgJiYgcmVtX3dpbmRvd19ub3RfZnVsbCgpKSB7Ci0gICAgICBzZW5kX2RhdGEoc2FyLCBzZHVfc2l6ZSwgc3RkOjptb3ZlKHBkdSkpOwotICAgIH0gZWxzZSBpZiAodHhfc3RhdGVfID09IFR4U3RhdGU6OlhNSVQgJiYgKHJlbW90ZV9idXN5KCkgfHwgcmVtX3dpbmRvd19mdWxsKCkpKSB7Ci0gICAgICBwZW5kX2RhdGEoc2FyLCBzZHVfc2l6ZSwgc3RkOjptb3ZlKHBkdSkpOwotICAgIH0gZWxzZSBpZiAodHhfc3RhdGVfID09IFR4U3RhdGU6OldBSVRfRikgewotICAgICAgcGVuZF9kYXRhKHNhciwgc2R1X3NpemUsIHN0ZDo6bW92ZShwZHUpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvY2FsX2J1c3lfZGV0ZWN0ZWQoKSB7Ci0gICAgbG9jYWxfYnVzeV8gPSB0cnVlOwotICB9Ci0KLSAgdm9pZCBsb2NhbF9idXN5X2NsZWFyKCkgewotICAgIGlmICh0eF9zdGF0ZV8gPT0gVHhTdGF0ZTo6WE1JVCAmJiBybnJfc2VudCgpKSB7Ci0gICAgICBsb2NhbF9idXN5XyA9IGZhbHNlOwotICAgICAgcm5yX3NlbnRfID0gZmFsc2U7Ci0gICAgICBzZW5kX3JyKFBvbGw6OlBPTEwpOwotICAgICAgcmV0cnlfY291bnRfID0gMTsKLSAgICAgIHN0b3BfcmV0cmFuc190aW1lcigpOwotICAgICAgc3RhcnRfbW9uaXRvcl90aW1lcigpOwotICAgIH0gZWxzZSBpZiAodHhfc3RhdGVfID09IFR4U3RhdGU6OlhNSVQpIHsKLSAgICAgIGxvY2FsX2J1c3lfID0gZmFsc2U7Ci0gICAgICBybnJfc2VudF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlY3ZfcmVxX3NlcV9hbmRfZl9iaXQodWludDhfdCByZXFfc2VxLCBGaW5hbCBmKSB7Ci0gICAgaWYgKHR4X3N0YXRlXyA9PSBUeFN0YXRlOjpYTUlUKSB7Ci0gICAgICBwcm9jZXNzX3JlcV9zZXEocmVxX3NlcSk7Ci0gICAgfSBlbHNlIGlmIChmID09IEZpbmFsOjpQT0xMX1JFU1BPTlNFKSB7Ci0gICAgICBwcm9jZXNzX3JlcV9zZXEocmVxX3NlcSk7Ci0gICAgICBzdG9wX21vbml0b3JfdGltZXIoKTsKLSAgICAgIGlmICh1bmFja2VkX2ZyYW1lc18gPiAwKSB7Ci0gICAgICAgIHN0YXJ0X3JldHJhbnNfdGltZXIoKTsKLSAgICAgIH0KLSAgICAgIHR4X3N0YXRlXyA9IFR4U3RhdGU6OlhNSVQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByb2Nlc3NfcmVxX3NlcShyZXFfc2VxKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlY3ZfZl9iaXQoRmluYWwgZikgewotICAgIGlmICh0eF9zdGF0ZV8gPT0gVHhTdGF0ZTo6V0FJVF9GICYmIGYgPT0gRmluYWw6OlBPTExfUkVTUE9OU0UpIHsKLSAgICAgIHN0b3BfbW9uaXRvcl90aW1lcigpOwotICAgICAgaWYgKHVuYWNrZWRfZnJhbWVzXyA+IDApIHsKLSAgICAgICAgc3RhcnRfcmV0cmFuc190aW1lcigpOwotICAgICAgfQotICAgICAgdHhfc3RhdGVfID0gVHhTdGF0ZTo6WE1JVDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJldHJhbnNfdGltZXJfZXhwaXJlcygpIHsKLSAgICBpZiAodHhfc3RhdGVfID09IFR4U3RhdGU6OlhNSVQpIHsKLSAgICAgIHNlbmRfcnJfb3Jfcm5yKFBvbGw6OlBPTEwpOwotICAgICAgLy8gc2VuZCByciBvciBybnIocD0xKQotICAgICAgcmV0cnlfY291bnRfID0gMTsKLSAgICAgIHN0YXJ0X21vbml0b3JfdGltZXIoKTsKLSAgICAgIHR4X3N0YXRlXyA9IFR4U3RhdGU6OldBSVRfRjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG1vbml0b3JfdGltZXJfZXhwaXJlcygpIHsKLSAgICBpZiAodHhfc3RhdGVfID09IFR4U3RhdGU6OldBSVRfRiAmJiByZXRyeV9jb3VudF9sZXNzX3RoYW5fbWF4X3RyYW5zbWl0KCkpIHsKLSAgICAgIHJldHJ5X2NvdW50XysrOwotICAgICAgc2VuZF9ycl9vcl9ybnIoUG9sbDo6UE9MTCk7Ci0gICAgICBzdGFydF9tb25pdG9yX3RpbWVyKCk7Ci0gICAgfSBlbHNlIGlmICh0eF9zdGF0ZV8gPT0gVHhTdGF0ZTo6V0FJVF9GKSB7Ci0gICAgICBMT0dfSU5GTygiQ2xvc2UgY2hhbm5lbCBiZWNhdXNlIG1heCB0cmFuc21pdCByZWFjaGVkIik7Ci0gICAgICBDbG9zZUNoYW5uZWwoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlY3ZfaV9mcmFtZShGaW5hbCBmLCB1aW50OF90IHR4X3NlcSwgdWludDhfdCByZXFfc2VxLCBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5IHNhciwgdWludDE2X3Qgc2R1X3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiYgcGF5bG9hZCkgewotICAgIGlmIChyeF9zdGF0ZV8gPT0gUnhTdGF0ZTo6UkVDVikgewotICAgICAgaWYgKGYgPT0gRmluYWw6Ok5PVF9TRVQgJiYgd2l0aF9leHBlY3RlZF90eF9zZXEodHhfc2VxKSAmJiB3aXRoX3ZhbGlkX3JlcV9zZXEocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSAmJgotICAgICAgICAgICFsb2NhbF9idXN5KCkpIHsKLSAgICAgICAgaW5jcmVtZW50X2V4cGVjdGVkX3R4X3NlcSgpOwotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgICBkYXRhX2luZGljYXRpb24oc2FyLCBzZHVfc2l6ZSwgcGF5bG9hZCk7Ci0gICAgICAgIHNlbmRfYWNrKEZpbmFsOjpOT1RfU0VUKTsKLSAgICAgIH0gZWxzZSBpZiAoZiA9PSBGaW5hbDo6UE9MTF9SRVNQT05TRSAmJiB3aXRoX2V4cGVjdGVkX3R4X3NlcSh0eF9zZXEpICYmIHdpdGhfdmFsaWRfcmVxX3NlcShyZXFfc2VxKSAmJgotICAgICAgICAgICAgICAgICB3aXRoX3ZhbGlkX2ZfYml0KGYpICYmICFsb2NhbF9idXN5KCkpIHsKLSAgICAgICAgaW5jcmVtZW50X2V4cGVjdGVkX3R4X3NlcSgpOwotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgICBkYXRhX2luZGljYXRpb24oc2FyLCBzZHVfc2l6ZSwgcGF5bG9hZCk7Ci0gICAgICAgIGlmICghcmVqX2FjdGlvbmVkXykgewotICAgICAgICAgIHJldHJhbnNtaXRfaV9mcmFtZXMocmVxX3NlcSk7Ci0gICAgICAgICAgc2VuZF9wZW5kaW5nX2lfZnJhbWVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVqX2FjdGlvbmVkXyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRfYWNrKEZpbmFsOjpOT1RfU0VUKTsKLSAgICAgIH0gZWxzZSBpZiAod2l0aF9kdXBsaWNhdGVfdHhfc2VxKHR4X3NlcSkgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikgJiYgIWxvY2FsX2J1c3koKSkgewotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX3VuZXhwZWN0ZWRfdHhfc2VxKHR4X3NlcSkgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikgJiYKLSAgICAgICAgICAgICAgICAgIWxvY2FsX2J1c3koKSkgewotICAgICAgICBpZiBjb25zdGV4cHIgKGtTZW5kU3JlaikgewotICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgICBzZW5kX3JlaigpOwotICAgICAgICAgIHJ4X3N0YXRlXyA9IFJ4U3RhdGU6OlJFSl9TRU5UOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHdpdGhfZXhwZWN0ZWRfdHhfc2VxKHR4X3NlcSkgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikgJiYgbG9jYWxfYnVzeSgpKSB7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIHN0b3JlX29yX2lnbm9yZSgpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX3ZhbGlkX3JlcV9zZXEocmVxX3NlcSkgJiYgbm90X3dpdGhfZXhwZWN0ZWRfdHhfc2VxKHR4X3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSAmJgotICAgICAgICAgICAgICAgICBsb2NhbF9idXN5KCkpIHsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgIH0gZWxzZSBpZiAoKHdpdGhfaW52YWxpZF90eF9zZXEodHhfc2VxKSAmJiBjb250cm9sbGVyXy0+bG9jYWxfdHhfd2luZG93XyA+IGtNYXhUeFdpbiAvIDIpIHx8Ci0gICAgICAgICAgICAgICAgIHdpdGhfaW52YWxpZF9yZXFfc2VxKHJlcV9zZXEpKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX2ludmFsaWRfdHhfc2VxKHR4X3NlcSkgJiYgY29udHJvbGxlcl8tPmxvY2FsX3R4X3dpbmRvd18gPD0ga01heFR4V2luIC8gMikgewotICAgICAgICAvLyBXZSBkZWNpZGVkIHRvIGlnbm9yZQotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnhfc3RhdGVfID09IFJ4U3RhdGU6OlJFSl9TRU5UKSB7Ci0gICAgICBpZiAoZiA9PSBGaW5hbDo6Tk9UX1NFVCAmJiB3aXRoX2V4cGVjdGVkX3R4X3NlcSh0eF9zZXEpICYmIHdpdGhfdmFsaWRfcmVxX3NlcShyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIGluY3JlbWVudF9leHBlY3RlZF90eF9zZXEoKTsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgZGF0YV9pbmRpY2F0aW9uKHNhciwgc2R1X3NpemUsIHBheWxvYWQpOwotICAgICAgICBzZW5kX2FjayhGaW5hbDo6Tk9UX1NFVCk7Ci0gICAgICAgIHJ4X3N0YXRlXyA9IFJ4U3RhdGU6OlJFQ1Y7Ci0gICAgICB9IGVsc2UgaWYgKGYgPT0gRmluYWw6OlBPTExfUkVTUE9OU0UgJiYgd2l0aF9leHBlY3RlZF90eF9zZXEodHhfc2VxKSAmJiB3aXRoX3ZhbGlkX3JlcV9zZXEocmVxX3NlcSkgJiYKLSAgICAgICAgICAgICAgICAgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICBpbmNyZW1lbnRfZXhwZWN0ZWRfdHhfc2VxKCk7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIGRhdGFfaW5kaWNhdGlvbihzYXIsIHNkdV9zaXplLCBwYXlsb2FkKTsKLSAgICAgICAgaWYgKCFyZWpfYWN0aW9uZWRfKSB7Ci0gICAgICAgICAgcmV0cmFuc21pdF9pX2ZyYW1lcyhyZXFfc2VxKTsKLSAgICAgICAgICBzZW5kX3BlbmRpbmdfaV9mcmFtZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWpfYWN0aW9uZWRfID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZF9hY2soRmluYWw6Ok5PVF9TRVQpOwotICAgICAgICByeF9zdGF0ZV8gPSBSeFN0YXRlOjpSRUNWOwotICAgICAgfSBlbHNlIGlmICh3aXRoX3VuZXhwZWN0ZWRfdHhfc2VxKHR4X3NlcSkgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJ4X3N0YXRlXyA9PSBSeFN0YXRlOjpTUkVKX1NFTlQpIHsKLSAgICAgIC8vIFNSRUogTk9UIFNVUFBPUlRFRAotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVjdl9ycih1aW50OF90IHJlcV9zZXEsIFBvbGwgcCA9IFBvbGw6Ok5PVF9TRVQsIEZpbmFsIGYgPSBGaW5hbDo6Tk9UX1NFVCkgewotICAgIGlmIChyeF9zdGF0ZV8gPT0gUnhTdGF0ZTo6UkVDVikgewotICAgICAgaWYgKHAgPT0gUG9sbDo6Tk9UX1NFVCAmJiBmID09IEZpbmFsOjpOT1RfU0VUICYmIHdpdGhfdmFsaWRfcmVxX3NlcShyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIGlmIChyZW1vdGVfYnVzeSgpICYmIHVuYWNrZWRfZnJhbWVzXyA+IDApIHsKLSAgICAgICAgICBzdGFydF9yZXRyYW5zX3RpbWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3RlX2J1c3lfID0gZmFsc2U7Ci0gICAgICAgIHNlbmRfcGVuZGluZ19pX2ZyYW1lcygpOwotICAgICAgfSBlbHNlIGlmIChmID09IEZpbmFsOjpQT0xMX1JFU1BPTlNFICYmIHdpdGhfdmFsaWRfcmVxX3NlcShyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHJlbW90ZV9idXN5XyA9IGZhbHNlOwotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgICBpZiAoIXJlal9hY3Rpb25lZF8pIHsKLSAgICAgICAgICByZXRyYW5zbWl0X2lfZnJhbWVzKHJlcV9zZXEsIHApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlal9hY3Rpb25lZF8gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzZW5kX3BlbmRpbmdfaV9mcmFtZXMoKTsKLSAgICAgIH0gZWxzZSBpZiAocCA9PSBQb2xsOjpQT0xMICYmIHdpdGhfdmFsaWRfcmVxX3NlcShyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIHNlbmRfaV9vcl9ycl9vcl9ybnIoRmluYWw6OlBPTExfUkVTUE9OU0UpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX2ludmFsaWRfcmVxX3NlcShyZXFfc2VxKSkgewotICAgICAgICBDbG9zZUNoYW5uZWwoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJ4X3N0YXRlXyA9PSBSeFN0YXRlOjpSRUpfU0VOVCkgewotICAgICAgaWYgKGYgPT0gRmluYWw6OlBPTExfUkVTUE9OU0UgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcmVtb3RlX2J1c3lfID0gZmFsc2U7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIGlmICghcmVqX2FjdGlvbmVkXykgewotICAgICAgICAgIHJldHJhbnNtaXRfaV9mcmFtZXMocmVxX3NlcSwgcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVqX2FjdGlvbmVkXyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRfcGVuZGluZ19pX2ZyYW1lcygpOwotICAgICAgfSBlbHNlIGlmIChwID09IFBvbGw6Ok5PVF9TRVQgJiYgZiA9PSBGaW5hbDo6Tk9UX1NFVCAmJiB3aXRoX3ZhbGlkX3JlcV9zZXEocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgICBpZiAocmVtb3RlX2J1c3koKSBhbmQgdW5hY2tlZF9mcmFtZXNfID4gMCkgewotICAgICAgICAgIHN0YXJ0X3JldHJhbnNfdGltZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICAgICAgc2VuZF9hY2soRmluYWw6Ok5PVF9TRVQpOwotICAgICAgfSBlbHNlIGlmIChwID09IFBvbGw6OlBPTEwgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgaWYgKHJlbW90ZV9idXN5KCkgYW5kIHVuYWNrZWRfZnJhbWVzXyA+IDApIHsKLSAgICAgICAgICBzdGFydF9yZXRyYW5zX3RpbWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3RlX2J1c3lfID0gZmFsc2U7Ci0gICAgICAgIHNlbmRfcnIoRmluYWw6OlBPTExfUkVTUE9OU0UpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX2ludmFsaWRfcmVxX3NlcShyZXFfc2VxKSkgewotICAgICAgICBDbG9zZUNoYW5uZWwoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJ4X3N0YXRlXyA9PSBSeFN0YXRlOjpTUkVKX1NFTlQpIHsKLSAgICAgIC8vIFNSRUogTk9UIFNVUFBPUlRFRAotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVjdl9yZWoodWludDhfdCByZXFfc2VxLCBQb2xsIHAgPSBQb2xsOjpOT1RfU0VULCBGaW5hbCBmID0gRmluYWw6Ok5PVF9TRVQpIHsKLSAgICBpZiAocnhfc3RhdGVfID09IFJ4U3RhdGU6OlJFQ1YpIHsKLSAgICAgIGlmIChmID09IEZpbmFsOjpOT1RfU0VUICYmIHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmCi0gICAgICAgICAgcmV0cnlfaV9mcmFtZXNfbGVzc190aGFuX21heF90cmFuc21pdChyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHJlbW90ZV9idXN5XyA9IGZhbHNlOwotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgICByZXRyYW5zbWl0X2lfZnJhbWVzKHJlcV9zZXEsIHApOwotICAgICAgICBzZW5kX3BlbmRpbmdfaV9mcmFtZXMoKTsKLSAgICAgICAgaWYgKHBfYml0X291dHN0YW5kaW5nKCkpIHsKLSAgICAgICAgICByZWpfYWN0aW9uZWRfID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChmID09IEZpbmFsOjpQT0xMX1JFU1BPTlNFICYmIHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmCi0gICAgICAgICAgICAgICAgIHJldHJ5X2lfZnJhbWVzX2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgaWYgKCFyZWpfYWN0aW9uZWRfKSB7Ci0gICAgICAgICAgcmV0cmFuc21pdF9pX2ZyYW1lcyhyZXFfc2VxLCBwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWpfYWN0aW9uZWRfID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZF9wZW5kaW5nX2lfZnJhbWVzKCk7Ci0gICAgICB9IGVsc2UgaWYgKHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmICFyZXRyeV9pX2ZyYW1lc19sZXNzX3RoYW5fbWF4X3RyYW5zbWl0KHJlcV9zZXEpKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX2ludmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnhfc3RhdGVfID09IFJ4U3RhdGU6OlJFSl9TRU5UKSB7Ci0gICAgICBpZiAoZiA9PSBGaW5hbDo6Tk9UX1NFVCAmJiB3aXRoX3ZhbGlkX3JlcV9zZXFfcmV0cmFucyhyZXFfc2VxKSAmJgotICAgICAgICAgIHJldHJ5X2lfZnJhbWVzX2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgcmV0cmFuc21pdF9pX2ZyYW1lcyhyZXFfc2VxLCBwKTsKLSAgICAgICAgc2VuZF9wZW5kaW5nX2lfZnJhbWVzKCk7Ci0gICAgICAgIGlmIChwX2JpdF9vdXRzdGFuZGluZygpKSB7Ci0gICAgICAgICAgcmVqX2FjdGlvbmVkXyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoZiA9PSBGaW5hbDo6UE9MTF9SRVNQT05TRSAmJiB3aXRoX3ZhbGlkX3JlcV9zZXFfcmV0cmFucyhyZXFfc2VxKSAmJgotICAgICAgICAgICAgICAgICByZXRyeV9pX2ZyYW1lc19sZXNzX3RoYW5fbWF4X3RyYW5zbWl0KHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcmVtb3RlX2J1c3lfID0gZmFsc2U7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIGlmICghcmVqX2FjdGlvbmVkXykgewotICAgICAgICAgIHJldHJhbnNtaXRfaV9mcmFtZXMocmVxX3NlcSwgcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVqX2FjdGlvbmVkXyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRfcGVuZGluZ19pX2ZyYW1lcygpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX3ZhbGlkX3JlcV9zZXFfcmV0cmFucyhyZXFfc2VxKSAmJiAhcmV0cnlfaV9mcmFtZXNfbGVzc190aGFuX21heF90cmFuc21pdChyZXFfc2VxKSkgewotICAgICAgICBDbG9zZUNoYW5uZWwoKTsKLSAgICAgIH0gZWxzZSBpZiAod2l0aF9pbnZhbGlkX3JlcV9zZXFfcmV0cmFucyhyZXFfc2VxKSkgewotICAgICAgICBDbG9zZUNoYW5uZWwoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJ4X3N0YXRlXyA9PSBSeFN0YXRlOjpTUkVKX1NFTlQpIHsKLSAgICAgIC8vIFNSRUogTk9UIFNVUFBPUlRFRAotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVjdl9ybnIodWludDhfdCByZXFfc2VxLCBQb2xsIHAgPSBQb2xsOjpOT1RfU0VULCBGaW5hbCBmID0gRmluYWw6Ok5PVF9TRVQpIHsKLSAgICBpZiAocnhfc3RhdGVfID09IFJ4U3RhdGU6OlJFQ1YpIHsKLSAgICAgIGlmIChwID09IFBvbGw6Ok5PVF9TRVQgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcmVtb3RlX2J1c3lfID0gdHJ1ZTsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgc3RvcF9yZXRyYW5zX3RpbWVyKCk7Ci0gICAgICB9IGVsc2UgaWYgKHAgPT0gUG9sbDo6UE9MTCAmJiB3aXRoX3ZhbGlkX3JlcV9zZXEocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICByZW1vdGVfYnVzeV8gPSB0cnVlOwotICAgICAgICBwYXNzX3RvX3R4KHJlcV9zZXEsIGYpOwotICAgICAgICBzdG9wX3JldHJhbnNfdGltZXIoKTsKLSAgICAgICAgc2VuZF9ycl9vcl9ybnIoUG9sbDo6Tk9UX1NFVCwgRmluYWw6OlBPTExfUkVTUE9OU0UpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX2ludmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnhfc3RhdGVfID09IFJ4U3RhdGU6OlJFSl9TRU5UKSB7Ci0gICAgICBpZiAocCA9PSBQb2xsOjpOT1RfU0VUICYmIHdpdGhfdmFsaWRfcmVxX3NlcShyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHJlbW90ZV9idXN5XyA9IHRydWU7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIHNlbmRfcnIoRmluYWw6OlBPTExfUkVTUE9OU0UpOwotICAgICAgfSBlbHNlIGlmIChwID09IFBvbGw6OlBPTEwgJiYgd2l0aF92YWxpZF9yZXFfc2VxKHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcmVtb3RlX2J1c3lfID0gdHJ1ZTsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgc2VuZF9ycihGaW5hbDo6Tk9UX1NFVCk7Ci0gICAgICB9IGVsc2UgaWYgKHdpdGhfaW52YWxpZF9yZXFfc2VxX3JldHJhbnMocmVxX3NlcSkpIHsKLSAgICAgICAgQ2xvc2VDaGFubmVsKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChyeF9zdGF0ZV8gPT0gUnhTdGF0ZTo6U1JFSl9TRU5UKSB7Ci0gICAgICAvLyBTUkVKIE5PVCBTVVBQT1JURUQKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlY3Zfc3Jlaih1aW50OF90IHJlcV9zZXEsIFBvbGwgcCA9IFBvbGw6Ok5PVF9TRVQsIEZpbmFsIGYgPSBGaW5hbDo6Tk9UX1NFVCkgewotICAgIGlmIChyeF9zdGF0ZV8gPT0gUnhTdGF0ZTo6UkVDVikgewotICAgICAgaWYgKHAgPT0gUG9sbDo6Tk9UX1NFVCAmJiBmID09IEZpbmFsOjpOT1RfU0VUICYmIHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmCi0gICAgICAgICAgcmV0cnlfaV9mcmFtZXNfbGVzc190aGFuX21heF90cmFuc21pdChyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHJlbW90ZV9idXN5XyA9IGZhbHNlOwotICAgICAgICBwYXNzX3RvX3R4X2ZfYml0KGYpOwotICAgICAgICByZXRyYW5zbWl0X3JlcXVlc3RlZF9pX2ZyYW1lKHJlcV9zZXEsIHApOwotICAgICAgICBpZiAocF9iaXRfb3V0c3RhbmRpbmcoKSkgewotICAgICAgICAgIHNyZWpfYWN0aW9uZWRfID0gdHJ1ZTsKLSAgICAgICAgICBzcmVqX3NhdmVfcmVxX3NlcV8gPSByZXFfc2VxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGYgPT0gRmluYWw6OlBPTExfUkVTUE9OU0UgJiYgd2l0aF92YWxpZF9yZXFfc2VxX3JldHJhbnMocmVxX3NlcSkgJiYKLSAgICAgICAgICAgICAgICAgcmV0cnlfaV9mcmFtZXNfbGVzc190aGFuX21heF90cmFuc21pdChyZXFfc2VxKSAmJiB3aXRoX3ZhbGlkX2ZfYml0KGYpKSB7Ci0gICAgICAgIHJlbW90ZV9idXN5XyA9IGZhbHNlOwotICAgICAgICBwYXNzX3RvX3R4X2ZfYml0KGYpOwotICAgICAgICBpZiAoc3Jlal9hY3Rpb25lZF8gJiYgc3Jlal9zYXZlX3JlcV9zZXFfID09IHJlcV9zZXEpIHsKLSAgICAgICAgICBzcmVqX2FjdGlvbmVkXyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHJhbnNtaXRfcmVxdWVzdGVkX2lfZnJhbWUocmVxX3NlcSwgcCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocCA9PSBQb2xsOjpQT0xMICYmIHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmCi0gICAgICAgICAgICAgICAgIHJldHJ5X2lfZnJhbWVzX2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICAgICAgcGFzc190b190eChyZXFfc2VxLCBmKTsKLSAgICAgICAgcmV0cmFuc21pdF9yZXF1ZXN0ZWRfaV9mcmFtZShyZXFfc2VxLCBwKTsKLSAgICAgICAgc2VuZF9wZW5kaW5nX2lfZnJhbWVzKCk7Ci0gICAgICAgIGlmIChwX2JpdF9vdXRzdGFuZGluZygpKSB7Ci0gICAgICAgICAgc3Jlal9hY3Rpb25lZF8gPSB0cnVlOwotICAgICAgICAgIHNyZWpfc2F2ZV9yZXFfc2VxXyA9IHJlcV9zZXE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAod2l0aF92YWxpZF9yZXFfc2VxX3JldHJhbnMocmVxX3NlcSkgJiYgIXJldHJ5X2lfZnJhbWVzX2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQocmVxX3NlcSkpIHsKLSAgICAgICAgQ2xvc2VDaGFubmVsKCk7Ci0gICAgICB9IGVsc2UgaWYgKHdpdGhfaW52YWxpZF9yZXFfc2VxX3JldHJhbnMocmVxX3NlcSkpIHsKLSAgICAgICAgQ2xvc2VDaGFubmVsKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChyeF9zdGF0ZV8gPT0gUnhTdGF0ZTo6UkVKX1NFTlQpIHsKLSAgICAgIGlmIChwID09IFBvbGw6Ok5PVF9TRVQgJiYgZiA9PSBGaW5hbDo6Tk9UX1NFVCAmJiB3aXRoX3ZhbGlkX3JlcV9zZXFfcmV0cmFucyhyZXFfc2VxKSAmJgotICAgICAgICAgIHJldHJ5X2lfZnJhbWVzX2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICAgICAgcGFzc190b190eF9mX2JpdChmKTsKLSAgICAgICAgcmV0cmFuc21pdF9yZXF1ZXN0ZWRfaV9mcmFtZShyZXFfc2VxLCBwKTsKLSAgICAgICAgaWYgKHBfYml0X291dHN0YW5kaW5nKCkpIHsKLSAgICAgICAgICBzcmVqX2FjdGlvbmVkXyA9IHRydWU7Ci0gICAgICAgICAgc3Jlal9zYXZlX3JlcV9zZXFfID0gcmVxX3NlcTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChmID09IEZpbmFsOjpQT0xMX1JFU1BPTlNFICYmIHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmCi0gICAgICAgICAgICAgICAgIHJldHJ5X2lfZnJhbWVzX2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQocmVxX3NlcSkgJiYgd2l0aF92YWxpZF9mX2JpdChmKSkgewotICAgICAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICAgICAgcGFzc190b190eF9mX2JpdChmKTsKLSAgICAgICAgaWYgKHNyZWpfYWN0aW9uZWRfICYmIHNyZWpfc2F2ZV9yZXFfc2VxXyA9PSByZXFfc2VxKSB7Ci0gICAgICAgICAgc3Jlal9hY3Rpb25lZF8gPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXRyYW5zbWl0X3JlcXVlc3RlZF9pX2ZyYW1lKHJlcV9zZXEsIHApOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHAgPT0gUG9sbDo6UE9MTCAmJiB3aXRoX3ZhbGlkX3JlcV9zZXFfcmV0cmFucyhyZXFfc2VxKSAmJgotICAgICAgICAgICAgICAgICByZXRyeV9pX2ZyYW1lc19sZXNzX3RoYW5fbWF4X3RyYW5zbWl0KHJlcV9zZXEpICYmIHdpdGhfdmFsaWRfZl9iaXQoZikpIHsKLSAgICAgICAgcmVtb3RlX2J1c3lfID0gZmFsc2U7Ci0gICAgICAgIHBhc3NfdG9fdHgocmVxX3NlcSwgZik7Ci0gICAgICAgIHJldHJhbnNtaXRfcmVxdWVzdGVkX2lfZnJhbWUocmVxX3NlcSwgcCk7Ci0gICAgICAgIHNlbmRfcGVuZGluZ19pX2ZyYW1lcygpOwotICAgICAgICBpZiAocF9iaXRfb3V0c3RhbmRpbmcoKSkgewotICAgICAgICAgIHNyZWpfYWN0aW9uZWRfID0gdHJ1ZTsKLSAgICAgICAgICBzcmVqX3NhdmVfcmVxX3NlcV8gPSByZXFfc2VxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHdpdGhfdmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpICYmICFyZXRyeV9pX2ZyYW1lc19sZXNzX3RoYW5fbWF4X3RyYW5zbWl0KHJlcV9zZXEpKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgfSBlbHNlIGlmICh3aXRoX2ludmFsaWRfcmVxX3NlcV9yZXRyYW5zKHJlcV9zZXEpKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocnhfc3RhdGVfID09IFJ4U3RhdGU6OlNSRUpfU0VOVCkgewotICAgICAgLy8gU1JFSiBOT1QgU1VQUE9SVEVECi0gICAgfQotICB9Ci0KLSAgLy8gQ29uZGl0aW9ucyAoQHNlZSA4LjYuNS41KQotICBib29sIHJlbW90ZV9idXN5KCkgewotICAgIHJldHVybiByZW1vdGVfYnVzeV87Ci0gIH0KLQotICBib29sIGxvY2FsX2J1c3koKSB7Ci0gICAgcmV0dXJuIGxvY2FsX2J1c3lfOwotICB9Ci0KLSAgYm9vbCByZW1fd2luZG93X25vdF9mdWxsKCkgewotICAgIHJldHVybiB1bmFja2VkX2ZyYW1lc18gPCBjb250cm9sbGVyXy0+cmVtb3RlX3R4X3dpbmRvd187Ci0gIH0KLQotICBib29sIHJlbV93aW5kb3dfZnVsbCgpIHsKLSAgICByZXR1cm4gdW5hY2tlZF9mcmFtZXNfID09IGNvbnRyb2xsZXJfLT5yZW1vdGVfdHhfd2luZG93XzsKLSAgfQotCi0gIGJvb2wgcm5yX3NlbnQoKSB7Ci0gICAgcmV0dXJuIHJucl9zZW50XzsKLSAgfQotCi0gIGJvb2wgcmV0cnlfaV9mcmFtZXNfbGVzc190aGFuX21heF90cmFuc21pdCh1aW50OF90IHJlcV9zZXEpIHsKLSAgICByZXR1cm4gcmV0cnlfaV9mcmFtZXNfW3JlcV9zZXFdIDwgY29udHJvbGxlcl8tPmxvY2FsX21heF90cmFuc21pdF87Ci0gIH0KLQotICBib29sIHJldHJ5X2NvdW50X2xlc3NfdGhhbl9tYXhfdHJhbnNtaXQoKSB7Ci0gICAgcmV0dXJuIHJldHJ5X2NvdW50XyA8IGNvbnRyb2xsZXJfLT5sb2NhbF9tYXhfdHJhbnNtaXRfOwotICB9Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIHNlcXVlbmNlIG51bWJlcnMgKHR4X3NlcSBvciByeF9zZXEpCi0gIGJvb2wgc2VxdWVuY2VfbGVzc190aGFuKHVpbnQ4X3QgeCwgdWludDhfdCB5KSB7Ci0gICAgLy8gQXNzdW1pbmcgdGhlIG1heGltdW0gb3ZlcmZsb3cgb2Ygc2VxdWVuY2UgbnVtYmVyIGlzIHRoZSBzYW1lIGFzIGxvY2FsX3R4X3dpbmRvd18gKDEwIGJ5IGRlZmF1bHQpLgotICAgIHJldHVybiB4IDwgeSB8fCBrTWF4VHhXaW4gLSAoeCAtIHkpIDwgY29udHJvbGxlcl8tPmxvY2FsX3R4X3dpbmRvd187Ci0gIH0KLQotICAvLyBDb21wYXJlcyB0d28gc2VxdWVuY2UgbnVtYmVycyAodHhfc2VxIG9yIHJ4X3NlcSkKLSAgYm9vbCBzZXF1ZW5jZV9sZXNzX3RoYW5fb3JfZXF1YWwodWludDhfdCB4LCB1aW50OF90IHkpIHsKLSAgICAvLyBBc3N1bWluZyB0aGUgbWF4aW11bSBvdmVyZmxvdyBvZiBzZXF1ZW5jZSBudW1iZXIgaXMgdGhlIHNhbWUgYXMgbG9jYWxfdHhfd2luZG93XyAoMTAgYnkgZGVmYXVsdCkuCi0gICAgcmV0dXJuIHggPD0geSB8fCBrTWF4VHhXaW4gLSAoeCAtIHkpIDw9IGNvbnRyb2xsZXJfLT5sb2NhbF90eF93aW5kb3dfOwotICB9Ci0KLSAgYm9vbCB3aXRoX2V4cGVjdGVkX3R4X3NlcSh1aW50OF90IHR4X3NlcSkgewotICAgIHJldHVybiB0eF9zZXEgPT0gZXhwZWN0ZWRfdHhfc2VxXzsKLSAgfQotCi0gIGJvb2wgd2l0aF92YWxpZF9yZXFfc2VxKHVpbnQ4X3QgcmVxX3NlcSkgewotICAgIHJldHVybiBzZXF1ZW5jZV9sZXNzX3RoYW5fb3JfZXF1YWwoZXhwZWN0ZWRfYWNrX3NlcV8sIHJlcV9zZXEpICYmCi0gICAgICAgICAgIHNlcXVlbmNlX2xlc3NfdGhhbl9vcl9lcXVhbChyZXFfc2VxLCBuZXh0X3R4X3NlcV8pOwotICB9Ci0KLSAgYm9vbCB3aXRoX3ZhbGlkX3JlcV9zZXFfcmV0cmFucyh1aW50OF90IHJlcV9zZXEpIHsKLSAgICByZXR1cm4gc2VxdWVuY2VfbGVzc190aGFuX29yX2VxdWFsKGV4cGVjdGVkX2Fja19zZXFfLCByZXFfc2VxKSAmJgotICAgICAgICAgICBzZXF1ZW5jZV9sZXNzX3RoYW5fb3JfZXF1YWwocmVxX3NlcSwgbmV4dF90eF9zZXFfKTsKLSAgfQotCi0gIGJvb2wgd2l0aF92YWxpZF9mX2JpdChGaW5hbCBmKSB7Ci0gICAgcmV0dXJuIGYgPT0gRmluYWw6Ok5PVF9TRVQgXiB0eF9zdGF0ZV8gPT0gVHhTdGF0ZTo6V0FJVF9GOwotICB9Ci0KLSAgYm9vbCB3aXRoX3VuZXhwZWN0ZWRfdHhfc2VxKHVpbnQ4X3QgdHhfc2VxKSB7Ci0gICAgcmV0dXJuIHNlcXVlbmNlX2xlc3NfdGhhbihleHBlY3RlZF90eF9zZXFfLCB0eF9zZXEpICYmCi0gICAgICAgICAgIHNlcXVlbmNlX2xlc3NfdGhhbl9vcl9lcXVhbCh0eF9zZXEsIGV4cGVjdGVkX3R4X3NlcV8gKyBjb250cm9sbGVyXy0+bG9jYWxfdHhfd2luZG93Xyk7Ci0gIH0KLQotICBib29sIHdpdGhfZHVwbGljYXRlX3R4X3NlcSh1aW50OF90IHR4X3NlcSkgewotICAgIHJldHVybiBzZXF1ZW5jZV9sZXNzX3RoYW4odHhfc2VxLCBleHBlY3RlZF90eF9zZXFfKSAmJgotICAgICAgICAgICBzZXF1ZW5jZV9sZXNzX3RoYW5fb3JfZXF1YWwoZXhwZWN0ZWRfdHhfc2VxXyAtIGNvbnRyb2xsZXJfLT5sb2NhbF90eF93aW5kb3dfLCB0eF9zZXEpOwotICB9Ci0KLSAgYm9vbCB3aXRoX2ludmFsaWRfdHhfc2VxKHVpbnQ4X3QgdHhfc2VxKSB7Ci0gICAgcmV0dXJuIHNlcXVlbmNlX2xlc3NfdGhhbih0eF9zZXEsIGV4cGVjdGVkX3R4X3NlcV8gLSBjb250cm9sbGVyXy0+bG9jYWxfdHhfd2luZG93XykgfHwKLSAgICAgICAgICAgc2VxdWVuY2VfbGVzc190aGFuKGV4cGVjdGVkX3R4X3NlcV8gKyBjb250cm9sbGVyXy0+bG9jYWxfdHhfd2luZG93XywgdHhfc2VxKTsKLSAgfQotCi0gIGJvb2wgd2l0aF9pbnZhbGlkX3JlcV9zZXEodWludDhfdCByZXFfc2VxKSB7Ci0gICAgcmV0dXJuIHNlcXVlbmNlX2xlc3NfdGhhbihyZXFfc2VxLCBleHBlY3RlZF9hY2tfc2VxXykgfHwgc2VxdWVuY2VfbGVzc190aGFuKG5leHRfdHhfc2VxXywgcmVxX3NlcSk7Ci0gIH0KLQotICBib29sIHdpdGhfaW52YWxpZF9yZXFfc2VxX3JldHJhbnModWludDhfdCByZXFfc2VxKSB7Ci0gICAgcmV0dXJuIHNlcXVlbmNlX2xlc3NfdGhhbihyZXFfc2VxLCBleHBlY3RlZF9hY2tfc2VxXykgfHwgc2VxdWVuY2VfbGVzc190aGFuKG5leHRfdHhfc2VxXywgcmVxX3NlcSk7Ci0gIH0KLQotICBib29sIG5vdF93aXRoX2V4cGVjdGVkX3R4X3NlcSh1aW50OF90IHR4X3NlcSkgewotICAgIHJldHVybiAhd2l0aF9pbnZhbGlkX3R4X3NlcSh0eF9zZXEpICYmICF3aXRoX2V4cGVjdGVkX3R4X3NlcSh0eF9zZXEpOwotICB9Ci0KLSAgYm9vbCB3aXRoX2V4cGVjdGVkX3R4X3NlcV9zcmVqKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBzZW5kX3JlcV9pc190cnVlKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBzcmVqX2xpc3RfaXNfb25lKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCB3aXRoX3VuZXhwZWN0ZWRfdHhfc2VxX3NyZWooKSB7Ci0gICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBzZW5kaW5nIFNSRUoKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIHdpdGhfZHVwbGljYXRlX3R4X3NlcV9zcmVqKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQWN0aW9ucyAoQHNlZSA4LjYuNS42KQotCi0gIHZvaWQgX3NlbmRfaV9mcmFtZShTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5IHNhciwgc3RkOjp1bmlxdWVfcHRyPENvcHlhYmxlUGFja2V0QnVpbGRlcj4gc2VnbWVudCwgdWludDhfdCByZXFfc2VxLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eF9zZXEsIHVpbnQxNl90IHNkdV9zaXplID0gMCwgRmluYWwgZiA9IEZpbmFsOjpOT1RfU0VUKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IGJ1aWxkZXI7Ci0gICAgaWYgKHNhciA9PSBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpTVEFSVCkgewotICAgICAgaWYgKGNvbnRyb2xsZXJfLT5mY3NfZW5hYmxlZF8pIHsKLSAgICAgICAgYnVpbGRlciA9IEVuaGFuY2VkSW5mb3JtYXRpb25TdGFydEZyYW1lV2l0aEZjc0J1aWxkZXI6OkNyZWF0ZShjb250cm9sbGVyXy0+cmVtb3RlX2NpZF8sIHR4X3NlcSwgZiwgcmVxX3NlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHVfc2l6ZSwgc3RkOjptb3ZlKHNlZ21lbnQpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1aWxkZXIgPSBFbmhhbmNlZEluZm9ybWF0aW9uU3RhcnRGcmFtZUJ1aWxkZXI6OkNyZWF0ZShjb250cm9sbGVyXy0+cmVtb3RlX2NpZF8sIHR4X3NlcSwgZiwgcmVxX3NlcSwgc2R1X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc2VnbWVudCkpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoY29udHJvbGxlcl8tPmZjc19lbmFibGVkXykgewotICAgICAgICBidWlsZGVyID0gRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjc0J1aWxkZXI6OkNyZWF0ZShjb250cm9sbGVyXy0+cmVtb3RlX2NpZF8sIHR4X3NlcSwgZiwgcmVxX3NlcSwgc2FyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc2VnbWVudCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVpbGRlciA9IEVuaGFuY2VkSW5mb3JtYXRpb25GcmFtZUJ1aWxkZXI6OkNyZWF0ZShjb250cm9sbGVyXy0+cmVtb3RlX2NpZF8sIHR4X3NlcSwgZiwgcmVxX3NlcSwgc2FyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzZWdtZW50KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbnRyb2xsZXJfLT5zZW5kX3BkdShzdGQ6Om1vdmUoYnVpbGRlcikpOwotICB9Ci0KLSAgdm9pZCBzZW5kX2RhdGEoU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSBzYXIsIHVpbnQxNl90IHNkdV9zaXplLCBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBzZWdtZW50LAotICAgICAgICAgICAgICAgICBGaW5hbCBmID0gRmluYWw6Ok5PVF9TRVQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBzaGFyZWRfc2VnbWVudChzZWdtZW50LnJlbGVhc2UoKSk7Ci0gICAgdW5hY2tlZF9saXN0Xy5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKG5leHRfdHhfc2VxXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzYXIsIHNkdV9zaXplLCBzaGFyZWRfc2VnbWVudCkpOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENvcHlhYmxlUGFja2V0QnVpbGRlcj4gY29weWFibGVfcGFja2V0X2J1aWxkZXIgPQotICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENvcHlhYmxlUGFja2V0QnVpbGRlcj4oc3RkOjpnZXQ8Mj4odW5hY2tlZF9saXN0Xy5maW5kKG5leHRfdHhfc2VxXyktPnNlY29uZCkpOwotICAgIF9zZW5kX2lfZnJhbWUoc2FyLCBzdGQ6Om1vdmUoY29weWFibGVfcGFja2V0X2J1aWxkZXIpLCBidWZmZXJfc2VxXywgbmV4dF90eF9zZXFfLCBzZHVfc2l6ZSwgZik7Ci0gICAgdW5hY2tlZF9mcmFtZXNfKys7Ci0gICAgZnJhbWVzX3NlbnRfKys7Ci0gICAgcmV0cnlfaV9mcmFtZXNfW25leHRfdHhfc2VxX10gPSAxOwotICAgIG5leHRfdHhfc2VxXyA9IChuZXh0X3R4X3NlcV8gKyAxKSAlIGtNYXhUeFdpbjsKLSAgICBzdGFydF9yZXRyYW5zX3RpbWVyKCk7Ci0gIH0KLQotICB2b2lkIHBlbmRfZGF0YShTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5IHNhciwgdWludDE2X3Qgc2R1X3NpemUsIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OlJhd0J1aWxkZXI+IGRhdGEpIHsKLSAgICBwZW5kaW5nX2ZyYW1lc18uZW1wbGFjZShzdGQ6Om1ha2VfdHVwbGUoc2FyLCBzZHVfc2l6ZSwgc3RkOjptb3ZlKGRhdGEpKSk7Ci0gIH0KLQotICB2b2lkIHByb2Nlc3NfcmVxX3NlcSh1aW50OF90IHJlcV9zZXEpIHsKLSAgICBmb3IgKGludCBpID0gZXhwZWN0ZWRfYWNrX3NlcV87IGkgPCByZXFfc2VxOyBpKyspIHsKLSAgICAgIHVuYWNrZWRfbGlzdF8uZXJhc2UoaSk7Ci0gICAgICByZXRyeV9pX2ZyYW1lc19baV0gPSAwOwotICAgIH0KLSAgICB1bmFja2VkX2ZyYW1lc18gLT0gKChyZXFfc2VxIC0gZXhwZWN0ZWRfYWNrX3NlcV8pICsga01heFR4V2luKSAlIGtNYXhUeFdpbjsKLSAgICBleHBlY3RlZF9hY2tfc2VxXyA9IHJlcV9zZXE7Ci0gICAgaWYgKHVuYWNrZWRfZnJhbWVzXyA9PSAwKSB7Ci0gICAgICBzdG9wX3JldHJhbnNfdGltZXIoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIF9zZW5kX3NfZnJhbWUoU3VwZXJ2aXNvcnlGdW5jdGlvbiBzLCB1aW50OF90IHJlcV9zZXEsIFBvbGwgcCwgRmluYWwgZikgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBidWlsZGVyOwotICAgIGlmIChjb250cm9sbGVyXy0+ZmNzX2VuYWJsZWRfKSB7Ci0gICAgICBidWlsZGVyID0gRW5oYW5jZWRTdXBlcnZpc29yeUZyYW1lV2l0aEZjc0J1aWxkZXI6OkNyZWF0ZShjb250cm9sbGVyXy0+cmVtb3RlX2NpZF8sIHMsIHAsIGYsIHJlcV9zZXEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBidWlsZGVyID0gRW5oYW5jZWRTdXBlcnZpc29yeUZyYW1lQnVpbGRlcjo6Q3JlYXRlKGNvbnRyb2xsZXJfLT5yZW1vdGVfY2lkXywgcywgcCwgZiwgcmVxX3NlcSk7Ci0gICAgfQotICAgIGNvbnRyb2xsZXJfLT5zZW5kX3BkdShzdGQ6Om1vdmUoYnVpbGRlcikpOwotICB9Ci0KLSAgdm9pZCBzZW5kX3JyKFBvbGwgcCkgewotICAgIF9zZW5kX3NfZnJhbWUoU3VwZXJ2aXNvcnlGdW5jdGlvbjo6UkVDRUlWRVJfUkVBRFksIGV4cGVjdGVkX3R4X3NlcV8sIHAsIEZpbmFsOjpOT1RfU0VUKTsKLSAgfQotCi0gIHZvaWQgc2VuZF9ycihGaW5hbCBmKSB7Ci0gICAgX3NlbmRfc19mcmFtZShTdXBlcnZpc29yeUZ1bmN0aW9uOjpSRUNFSVZFUl9SRUFEWSwgZXhwZWN0ZWRfdHhfc2VxXywgUG9sbDo6Tk9UX1NFVCwgZik7Ci0gIH0KLQotICB2b2lkIHNlbmRfcm5yKFBvbGwgcCkgewotICAgIF9zZW5kX3NfZnJhbWUoU3VwZXJ2aXNvcnlGdW5jdGlvbjo6UkVDRUlWRVJfTk9UX1JFQURZLCBleHBlY3RlZF90eF9zZXFfLCBwLCBGaW5hbDo6Tk9UX1NFVCk7Ci0gIH0KLQotICB2b2lkIHNlbmRfcm5yKEZpbmFsIGYpIHsKLSAgICBfc2VuZF9zX2ZyYW1lKFN1cGVydmlzb3J5RnVuY3Rpb246OlJFQ0VJVkVSX05PVF9SRUFEWSwgZXhwZWN0ZWRfdHhfc2VxXywgUG9sbDo6Tk9UX1NFVCwgZik7Ci0gICAgcm5yX3NlbnRfID0gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgc2VuZF9yZWooUG9sbCBwID0gUG9sbDo6Tk9UX1NFVCwgRmluYWwgZiA9IEZpbmFsOjpOT1RfU0VUKSB7Ci0gICAgX3NlbmRfc19mcmFtZShTdXBlcnZpc29yeUZ1bmN0aW9uOjpSRUpFQ1QsIGV4cGVjdGVkX3R4X3NlcV8sIHAsIGYpOwotICB9Ci0KLSAgdm9pZCBzZW5kX3JyX29yX3JucihQb2xsIHAgPSBQb2xsOjpOT1RfU0VULCBGaW5hbCBmID0gRmluYWw6Ok5PVF9TRVQpIHsKLSAgICBpZiAobG9jYWxfYnVzeSgpKSB7Ci0gICAgICBfc2VuZF9zX2ZyYW1lKFN1cGVydmlzb3J5RnVuY3Rpb246OlJFQ0VJVkVSX05PVF9SRUFEWSwgYnVmZmVyX3NlcV8sIHAsIGYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBfc2VuZF9zX2ZyYW1lKFN1cGVydmlzb3J5RnVuY3Rpb246OlJFQ0VJVkVSX1JFQURZLCBidWZmZXJfc2VxXywgcCwgZik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZW5kX2lfb3JfcnJfb3Jfcm5yKEZpbmFsIGYgPSBGaW5hbDo6UE9MTF9SRVNQT05TRSkgewotICAgIGF1dG8gZnJhbWVzX3NlbnQgPSAwOwotICAgIGlmIChsb2NhbF9idXN5KCkpIHsKLSAgICAgIHNlbmRfcm5yKEZpbmFsOjpQT0xMX1JFU1BPTlNFKTsKLSAgICB9Ci0gICAgaWYgKHJlbW90ZV9idXN5KCkgJiYgdW5hY2tlZF9mcmFtZXNfID4gMCkgewotICAgICAgc3RhcnRfcmV0cmFuc190aW1lcigpOwotICAgIH0KLSAgICByZW1vdGVfYnVzeV8gPSBmYWxzZTsKLSAgICBzZW5kX3BlbmRpbmdfaV9mcmFtZXMoZik7ICAvLyBUT0RPOiBPbmx5IGZpcnN0IGhhcyBmID0gMSwgb3RoZXIgZiA9IDAuIEFsc28gaW5jcmVhc2UgZnJhbWVzX3NlbnQKLSAgICBpZiAoIWxvY2FsX2J1c3koKSAmJiBmcmFtZXNfc2VudCA9PSAwKSB7Ci0gICAgICBzZW5kX3JyKEZpbmFsOjpQT0xMX1JFU1BPTlNFKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNlbmRfc3JlaigpIHsKLSAgICAvLyBTZW5kaW5nIFNSRUogaXMgbm90IHN1cHBvcnRlZAotICB9Ci0KLSAgdm9pZCBzdGFydF9yZXRyYW5zX3RpbWVyKCkgewotICAgIHJldHJhbnNfdGltZXJfLlNjaGVkdWxlKGNvbW1vbjo6QmluZE9uY2UoJmltcGw6OnJldHJhbnNfdGltZXJfZXhwaXJlcywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGNvbnRyb2xsZXJfLT5sb2NhbF9yZXRyYW5zbWl0X3RpbWVvdXRfbXNfKSk7Ci0gIH0KLQotICB2b2lkIHN0YXJ0X21vbml0b3JfdGltZXIoKSB7Ci0gICAgbW9uaXRvcl90aW1lcl8uU2NoZWR1bGUoY29tbW9uOjpCaW5kT25jZSgmaW1wbDo6bW9uaXRvcl90aW1lcl9leHBpcmVzLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoY29udHJvbGxlcl8tPmxvY2FsX21vbml0b3JfdGltZW91dF9tc18pKTsKLSAgfQotCi0gIHZvaWQgcGFzc190b190eCh1aW50OF90IHJlcV9zZXEsIEZpbmFsIGYpIHsKLSAgICByZWN2X3JlcV9zZXFfYW5kX2ZfYml0KHJlcV9zZXEsIGYpOwotICB9Ci0KLSAgdm9pZCBwYXNzX3RvX3R4X2ZfYml0KEZpbmFsIGYpIHsKLSAgICByZWN2X2ZfYml0KGYpOwotICB9Ci0KLSAgdm9pZCBkYXRhX2luZGljYXRpb24oU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSBzYXIsIHVpbnQxNl90IHNkdV9zaXplLCBjb25zdCBwYWNrZXQ6OlBhY2tldFZpZXc8dHJ1ZT4mIHNlZ21lbnQpIHsKLSAgICBjb250cm9sbGVyXy0+c3RhZ2VfZm9yX3JlYXNzZW1ibHkoc2FyLCBzZHVfc2l6ZSwgc2VnbWVudCk7Ci0gICAgYnVmZmVyX3NlcV8gPSAoYnVmZmVyX3NlcV8gKyAxKSAlIGtNYXhUeFdpbjsKLSAgfQotCi0gIHZvaWQgaW5jcmVtZW50X2V4cGVjdGVkX3R4X3NlcSgpIHsKLSAgICBleHBlY3RlZF90eF9zZXFfID0gKGV4cGVjdGVkX3R4X3NlcV8gKyAxKSAlIGtNYXhUeFdpbjsKLSAgfQotCi0gIHZvaWQgc3RvcF9yZXRyYW5zX3RpbWVyKCkgewotICAgIHJldHJhbnNfdGltZXJfLkNhbmNlbCgpOwotICB9Ci0KLSAgdm9pZCBzdG9wX21vbml0b3JfdGltZXIoKSB7Ci0gICAgbW9uaXRvcl90aW1lcl8uQ2FuY2VsKCk7Ci0gIH0KLQotICB2b2lkIHNlbmRfYWNrKEZpbmFsIGYgPSBGaW5hbDo6Tk9UX1NFVCkgewotICAgIGlmIChsb2NhbF9idXN5KCkpIHsKLSAgICAgIHNlbmRfcm5yKGYpOwotICAgIH0gZWxzZSBpZiAoIXJlbW90ZV9idXN5KCkgJiYgIXBlbmRpbmdfZnJhbWVzXy5lbXB0eSgpICYmIHJlbV93aW5kb3dfbm90X2Z1bGwoKSkgewotICAgICAgc2VuZF9wZW5kaW5nX2lfZnJhbWVzKGYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZW5kX3JyKGYpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgaW5pdF9zcmVqKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gIH0KLQotICB2b2lkIHNhdmVfaV9mcmFtZV9zcmVqKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gIH0KLQotICB2b2lkIHN0b3JlX29yX2lnbm9yZSgpIHsKLSAgICAvLyBXZSBjaG9vc2UgdG8gaWdub3JlLgotICB9Ci0KLSAgYm9vbCBwX2JpdF9vdXRzdGFuZGluZygpIHsKLSAgICByZXR1cm4gdHhfc3RhdGVfID09IFR4U3RhdGU6OldBSVRfRjsKLSAgfQotCi0gIHZvaWQgcmV0cmFuc21pdF9pX2ZyYW1lcyh1aW50OF90IHJlcV9zZXEsIFBvbGwgcCA9IFBvbGw6Ok5PVF9TRVQpIHsKLSAgICB1aW50OF90IGkgPSByZXFfc2VxOwotICAgIEZpbmFsIGYgPSAocCA9PSBQb2xsOjpOT1RfU0VUID8gRmluYWw6Ok5PVF9TRVQgOiBGaW5hbDo6UE9MTF9SRVNQT05TRSk7Ci0gICAgd2hpbGUgKHVuYWNrZWRfbGlzdF8uZmluZChpKSAhPSB1bmFja2VkX2xpc3RfLmVuZCgpKSB7Ci0gICAgICBpZiAocmV0cnlfaV9mcmFtZXNfW2ldID09IGNvbnRyb2xsZXJfLT5sb2NhbF9tYXhfdHJhbnNtaXRfKSB7Ci0gICAgICAgIENsb3NlQ2hhbm5lbCgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29weWFibGVQYWNrZXRCdWlsZGVyPiBjb3B5YWJsZV9wYWNrZXRfYnVpbGRlciA9Ci0gICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb3B5YWJsZVBhY2tldEJ1aWxkZXI+KHN0ZDo6Z2V0PDI+KHVuYWNrZWRfbGlzdF8uZmluZChpKS0+c2Vjb25kKSk7Ci0gICAgICBfc2VuZF9pX2ZyYW1lKHN0ZDo6Z2V0PDA+KHVuYWNrZWRfbGlzdF8uZmluZChpKS0+c2Vjb25kKSwgc3RkOjptb3ZlKGNvcHlhYmxlX3BhY2tldF9idWlsZGVyKSwgYnVmZmVyX3NlcV8sIGksCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDE+KHVuYWNrZWRfbGlzdF8uZmluZChpKS0+c2Vjb25kKSwgZik7Ci0gICAgICByZXRyeV9pX2ZyYW1lc19baV0rKzsKLSAgICAgIGZyYW1lc19zZW50XysrOwotICAgICAgZiA9IEZpbmFsOjpOT1RfU0VUOwotICAgICAgaSsrOwotICAgIH0KLSAgICBpZiAoaSAhPSByZXFfc2VxKSB7Ci0gICAgICBzdGFydF9yZXRyYW5zX3RpbWVyKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZXRyYW5zbWl0X3JlcXVlc3RlZF9pX2ZyYW1lKHVpbnQ4X3QgcmVxX3NlcSwgUG9sbCBwKSB7Ci0gICAgRmluYWwgZiA9IHAgPT0gUG9sbDo6UE9MTCA/IEZpbmFsOjpQT0xMX1JFU1BPTlNFIDogRmluYWw6Ok5PVF9TRVQ7Ci0gICAgaWYgKHVuYWNrZWRfbGlzdF8uZmluZChyZXFfc2VxKSA9PSB1bmFja2VkX2xpc3RfLmVuZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIGludmFsaWQgU1JFSiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29weWFibGVQYWNrZXRCdWlsZGVyPiBjb3B5YWJsZV9wYWNrZXRfYnVpbGRlciA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q29weWFibGVQYWNrZXRCdWlsZGVyPihzdGQ6OmdldDwyPih1bmFja2VkX2xpc3RfLmZpbmQocmVxX3NlcSktPnNlY29uZCkpOwotICAgIF9zZW5kX2lfZnJhbWUoc3RkOjpnZXQ8MD4odW5hY2tlZF9saXN0Xy5maW5kKHJlcV9zZXEpLT5zZWNvbmQpLCBzdGQ6Om1vdmUoY29weWFibGVfcGFja2V0X2J1aWxkZXIpLCBidWZmZXJfc2VxXywKLSAgICAgICAgICAgICAgICAgIHJlcV9zZXEsIHN0ZDo6Z2V0PDE+KHVuYWNrZWRfbGlzdF8uZmluZChyZXFfc2VxKS0+c2Vjb25kKSwgZik7Ci0gICAgcmV0cnlfaV9mcmFtZXNfW3JlcV9zZXFdKys7Ci0gICAgc3RhcnRfcmV0cmFuc190aW1lcigpOwotICB9Ci0KLSAgdm9pZCBzZW5kX3BlbmRpbmdfaV9mcmFtZXMoRmluYWwgZiA9IEZpbmFsOjpOT1RfU0VUKSB7Ci0gICAgaWYgKHBfYml0X291dHN0YW5kaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd2hpbGUgKHJlbV93aW5kb3dfbm90X2Z1bGwoKSAmJiAhcGVuZGluZ19mcmFtZXNfLmVtcHR5KCkpIHsKLSAgICAgIGF1dG8mIGZyYW1lID0gcGVuZGluZ19mcmFtZXNfLmZyb250KCk7Ci0gICAgICBzZW5kX2RhdGEoc3RkOjpnZXQ8MD4oZnJhbWUpLCBzdGQ6OmdldDwxPihmcmFtZSksIHN0ZDo6bW92ZShzdGQ6OmdldDwyPihmcmFtZSkpLCBmKTsKLSAgICAgIHBlbmRpbmdfZnJhbWVzXy5wb3AoKTsKLSAgICAgIGYgPSBGaW5hbDo6Tk9UX1NFVDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENsb3NlQ2hhbm5lbCgpIHsKLSAgICBjb250cm9sbGVyXy0+Y2xvc2VfY2hhbm5lbCgpOwotICB9Ci0KLSAgdm9pZCBwb3Bfc3Jlal9saXN0KCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gIH0KLQotICB2b2lkIGRhdGFfaW5kaWNhdGlvbl9zcmVqKCkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2VuZGluZyBTUkVKCi0gIH0KLX07Ci0KLS8vIFNlZ21lbnRhdGlvbiBpcyBoYW5kbGVkIGhlcmUKLXZvaWQgRXJ0bUNvbnRyb2xsZXI6Ok9uU2R1KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBzZHUpIHsKLSAgYXV0byBzZHVfc2l6ZSA9IHNkdS0+c2l6ZSgpOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPj4gc2VnbWVudHM7Ci0gIGF1dG8gc2l6ZV9lYWNoX3BhY2tldCA9IChyZW1vdGVfbXBzXyAtIDQgLyogYmFzaWMgTDJDQVAgaGVhZGVyICovIC0gMiAvKiBTRFUgbGVuZ3RoICovIC0gMiAvKiBFbmhhbmNlZCBjb250cm9sICovIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChmY3NfZW5hYmxlZF8gPyAyIDogMCkpOwotICBwYWNrZXQ6OkZyYWdtZW50aW5nSW5zZXJ0ZXIgZnJhZ21lbnRpbmdfaW5zZXJ0ZXIoc2l6ZV9lYWNoX3BhY2tldCwgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcihzZWdtZW50cykpOwotICBzZHUtPlNlcmlhbGl6ZShmcmFnbWVudGluZ19pbnNlcnRlcik7Ci0gIGZyYWdtZW50aW5nX2luc2VydGVyLmZpbmFsaXplKCk7Ci0gIGlmIChzZWdtZW50cy5zaXplKCkgPT0gMSkgewotICAgIHBpbXBsXy0+ZGF0YV9yZXF1ZXN0KFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OlVOU0VHTUVOVEVELCBzdGQ6Om1vdmUoc2VnbWVudHNbMF0pKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcGltcGxfLT5kYXRhX3JlcXVlc3QoU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6U1RBUlQsIHN0ZDo6bW92ZShzZWdtZW50c1swXSksIHNkdV9zaXplKTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzZWdtZW50cy5zaXplKCkgLSAxOyBpKyspIHsKLSAgICBwaW1wbF8tPmRhdGFfcmVxdWVzdChTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpDT05USU5VQVRJT04sIHN0ZDo6bW92ZShzZWdtZW50c1tpXSkpOwotICB9Ci0gIHBpbXBsXy0+ZGF0YV9yZXF1ZXN0KFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OkVORCwgc3RkOjptb3ZlKHNlZ21lbnRzLmJhY2soKSkpOwotfQotCi12b2lkIEVydG1Db250cm9sbGVyOjpPblBkdShwYWNrZXQ6OlBhY2tldFZpZXc8dHJ1ZT4gcGR1KSB7Ci0gIGlmIChmY3NfZW5hYmxlZF8pIHsKLSAgICBvbl9wZHVfZmNzKHBkdSk7Ci0gIH0gZWxzZSB7Ci0gICAgb25fcGR1X25vX2ZjcyhwZHUpOwotICB9Ci19Ci0KLXZvaWQgRXJ0bUNvbnRyb2xsZXI6Om9uX3BkdV9ub19mY3MoY29uc3QgcGFja2V0OjpQYWNrZXRWaWV3PHRydWU+JiBwZHUpIHsKLSAgYXV0byBiYXNpY19mcmFtZV92aWV3ID0gQmFzaWNGcmFtZVZpZXc6OkNyZWF0ZShwZHUpOwotICBpZiAoIWJhc2ljX2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gc3RhbmRhcmRfZnJhbWVfdmlldyA9IFN0YW5kYXJkRnJhbWVWaWV3OjpDcmVhdGUoYmFzaWNfZnJhbWVfdmlldyk7Ci0gIGlmICghc3RhbmRhcmRfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBmcmFtZSIpOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvIHR5cGUgPSBzdGFuZGFyZF9mcmFtZV92aWV3LkdldEZyYW1lVHlwZSgpOwotICBpZiAodHlwZSA9PSBGcmFtZVR5cGU6OklfRlJBTUUpIHsKLSAgICBhdXRvIGlfZnJhbWVfdmlldyA9IEVuaGFuY2VkSW5mb3JtYXRpb25GcmFtZVZpZXc6OkNyZWF0ZShzdGFuZGFyZF9mcmFtZV92aWV3KTsKLSAgICBpZiAoIWlfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIGZyYW1lIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEZpbmFsIGYgPSBpX2ZyYW1lX3ZpZXcuR2V0RigpOwotICAgIHVpbnQ4X3QgdHhfc2VxID0gaV9mcmFtZV92aWV3LkdldFR4U2VxKCk7Ci0gICAgdWludDhfdCByZXFfc2VxID0gaV9mcmFtZV92aWV3LkdldFJlcVNlcSgpOwotICAgIGF1dG8gc2FyID0gaV9mcmFtZV92aWV3LkdldFNhcigpOwotICAgIGlmIChzYXIgPT0gU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6U1RBUlQpIHsKLSAgICAgIGF1dG8gaV9mcmFtZV9zdGFydF92aWV3ID0gRW5oYW5jZWRJbmZvcm1hdGlvblN0YXJ0RnJhbWVWaWV3OjpDcmVhdGUoaV9mcmFtZV92aWV3KTsKLSAgICAgIGlmICghaV9mcmFtZV9zdGFydF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBJLUZyYW1lIFNUQVJUIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBpbXBsXy0+cmVjdl9pX2ZyYW1lKGYsIHR4X3NlcSwgcmVxX3NlcSwgc2FyLCBpX2ZyYW1lX3N0YXJ0X3ZpZXcuR2V0TDJjYXBTZHVMZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfZnJhbWVfc3RhcnRfdmlldy5HZXRQYXlsb2FkKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwaW1wbF8tPnJlY3ZfaV9mcmFtZShmLCB0eF9zZXEsIHJlcV9zZXEsIHNhciwgMCwgaV9mcmFtZV92aWV3LkdldFBheWxvYWQoKSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUgPT0gRnJhbWVUeXBlOjpTX0ZSQU1FKSB7Ci0gICAgYXV0byBzX2ZyYW1lX3ZpZXcgPSBFbmhhbmNlZFN1cGVydmlzb3J5RnJhbWVWaWV3OjpDcmVhdGUoc3RhbmRhcmRfZnJhbWVfdmlldyk7Ci0gICAgaWYgKCFzX2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBmcmFtZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvIHJlcV9zZXEgPSBzX2ZyYW1lX3ZpZXcuR2V0UmVxU2VxKCk7Ci0gICAgYXV0byBmID0gc19mcmFtZV92aWV3LkdldEYoKTsKLSAgICBhdXRvIHAgPSBzX2ZyYW1lX3ZpZXcuR2V0UCgpOwotICAgIHN3aXRjaCAoc19mcmFtZV92aWV3LkdldFMoKSkgewotICAgICAgY2FzZSBTdXBlcnZpc29yeUZ1bmN0aW9uOjpSRUNFSVZFUl9SRUFEWToKLSAgICAgICAgcGltcGxfLT5yZWN2X3JyKHJlcV9zZXEsIHAsIGYpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU3VwZXJ2aXNvcnlGdW5jdGlvbjo6UkVDRUlWRVJfTk9UX1JFQURZOgotICAgICAgICBwaW1wbF8tPnJlY3Zfcm5yKHJlcV9zZXEsIHAsIGYpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU3VwZXJ2aXNvcnlGdW5jdGlvbjo6UkVKRUNUOgotICAgICAgICBwaW1wbF8tPnJlY3ZfcmVqKHJlcV9zZXEsIHAsIGYpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU3VwZXJ2aXNvcnlGdW5jdGlvbjo6U0VMRUNUX1JFSkVDVDoKLSAgICAgICAgcGltcGxfLT5yZWN2X3NyZWoocmVxX3NlcSwgcCwgZik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBmcmFtZSIpOwotICB9Ci19Ci0KLXZvaWQgRXJ0bUNvbnRyb2xsZXI6Om9uX3BkdV9mY3MoY29uc3QgcGFja2V0OjpQYWNrZXRWaWV3PHRydWU+JiBwZHUpIHsKLSAgYXV0byBiYXNpY19mcmFtZV92aWV3ID0gQmFzaWNGcmFtZVdpdGhGY3NWaWV3OjpDcmVhdGUocGR1KTsKLSAgaWYgKCFiYXNpY19mcmFtZV92aWV3LklzVmFsaWQoKSkgewotICAgIHJldHVybjsKLSAgfQotICBhdXRvIHN0YW5kYXJkX2ZyYW1lX3ZpZXcgPSBTdGFuZGFyZEZyYW1lV2l0aEZjc1ZpZXc6OkNyZWF0ZShiYXNpY19mcmFtZV92aWV3KTsKLSAgaWYgKCFzdGFuZGFyZF9mcmFtZV92aWV3LklzVmFsaWQoKSkgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIGZyYW1lIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gdHlwZSA9IHN0YW5kYXJkX2ZyYW1lX3ZpZXcuR2V0RnJhbWVUeXBlKCk7Ci0gIGlmICh0eXBlID09IEZyYW1lVHlwZTo6SV9GUkFNRSkgewotICAgIGF1dG8gaV9mcmFtZV92aWV3ID0gRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjc1ZpZXc6OkNyZWF0ZShzdGFuZGFyZF9mcmFtZV92aWV3KTsKLSAgICBpZiAoIWlfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIGZyYW1lIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEZpbmFsIGYgPSBpX2ZyYW1lX3ZpZXcuR2V0RigpOwotICAgIHVpbnQ4X3QgdHhfc2VxID0gaV9mcmFtZV92aWV3LkdldFR4U2VxKCk7Ci0gICAgdWludDhfdCByZXFfc2VxID0gaV9mcmFtZV92aWV3LkdldFJlcVNlcSgpOwotICAgIGF1dG8gc2FyID0gaV9mcmFtZV92aWV3LkdldFNhcigpOwotICAgIGlmIChzYXIgPT0gU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6U1RBUlQpIHsKLSAgICAgIGF1dG8gaV9mcmFtZV9zdGFydF92aWV3ID0gRW5oYW5jZWRJbmZvcm1hdGlvblN0YXJ0RnJhbWVXaXRoRmNzVmlldzo6Q3JlYXRlKGlfZnJhbWVfdmlldyk7Ci0gICAgICBpZiAoIWlfZnJhbWVfc3RhcnRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgTE9HX1dBUk4oIlJlY2VpdmVkIGludmFsaWQgSS1GcmFtZSBTVEFSVCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwaW1wbF8tPnJlY3ZfaV9mcmFtZShmLCB0eF9zZXEsIHJlcV9zZXEsIHNhciwgaV9mcmFtZV9zdGFydF92aWV3LkdldEwyY2FwU2R1TGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpX2ZyYW1lX3N0YXJ0X3ZpZXcuR2V0UGF5bG9hZCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgcGltcGxfLT5yZWN2X2lfZnJhbWUoZiwgdHhfc2VxLCByZXFfc2VxLCBzYXIsIDAsIGlfZnJhbWVfdmlldy5HZXRQYXlsb2FkKCkpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlID09IEZyYW1lVHlwZTo6U19GUkFNRSkgewotICAgIGF1dG8gc19mcmFtZV92aWV3ID0gRW5oYW5jZWRTdXBlcnZpc29yeUZyYW1lV2l0aEZjc1ZpZXc6OkNyZWF0ZShzdGFuZGFyZF9mcmFtZV92aWV3KTsKLSAgICBpZiAoIXNfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIGZyYW1lIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gcmVxX3NlcSA9IHNfZnJhbWVfdmlldy5HZXRSZXFTZXEoKTsKLSAgICBhdXRvIGYgPSBzX2ZyYW1lX3ZpZXcuR2V0RigpOwotICAgIGF1dG8gcCA9IHNfZnJhbWVfdmlldy5HZXRQKCk7Ci0gICAgc3dpdGNoIChzX2ZyYW1lX3ZpZXcuR2V0UygpKSB7Ci0gICAgICBjYXNlIFN1cGVydmlzb3J5RnVuY3Rpb246OlJFQ0VJVkVSX1JFQURZOgotICAgICAgICBwaW1wbF8tPnJlY3ZfcnIocmVxX3NlcSwgcCwgZik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTdXBlcnZpc29yeUZ1bmN0aW9uOjpSRUNFSVZFUl9OT1RfUkVBRFk6Ci0gICAgICAgIHBpbXBsXy0+cmVjdl9ybnIocmVxX3NlcSwgcCwgZik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTdXBlcnZpc29yeUZ1bmN0aW9uOjpSRUpFQ1Q6Ci0gICAgICAgIHBpbXBsXy0+cmVjdl9yZWoocmVxX3NlcSwgcCwgZik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTdXBlcnZpc29yeUZ1bmN0aW9uOjpTRUxFQ1RfUkVKRUNUOgotICAgICAgICBwaW1wbF8tPnJlY3Zfc3JlaihyZXFfc2VxLCBwLCBmKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIGZyYW1lIik7Ci0gIH0KLX0KLQotc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IEVydG1Db250cm9sbGVyOjpHZXROZXh0UGFja2V0KCkgewotICBhdXRvIG5leHQgPSBzdGQ6Om1vdmUocGR1X3F1ZXVlXy5mcm9udCgpKTsKLSAgcGR1X3F1ZXVlXy5wb3AoKTsKLSAgcmV0dXJuIG5leHQ7Ci19Ci0KLXZvaWQgRXJ0bUNvbnRyb2xsZXI6OnN0YWdlX2Zvcl9yZWFzc2VtYmx5KFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHkgc2FyLCB1aW50MTZfdCBzZHVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tldDo6UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiYgcGF5bG9hZCkgewotICAvLyBJZiBFbnF1ZXVlQnVmZmVyIGhhcyBtb3JlIHRoYW4gMSBwYWNrZXRzLCB3ZSBjbGFpbSBMb2NhbEJ1c3ksIHVudGlsIHF1ZXVlIGlzIGVtcHR5Ci0gIGNvbnN0ZXhwciBzaXplX3Qga0VucXVldWVCdWZmZXJCdXN5VGhyZXNob2xkID0gMzsKLSAgc3dpdGNoIChzYXIpIHsKLSAgICBjYXNlIFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OlVOU0VHTUVOVEVEOgotICAgICAgaWYgKHNhcl9zdGF0ZV8gIT0gU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6RU5EKSB7Ci0gICAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIFNBUiIpOwotICAgICAgICBjbG9zZV9jaGFubmVsKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8vIFRPRE86IEVuZm9yY2UgTVRVCi0gICAgICBlbnF1ZXVlX2J1ZmZlcl8uRW5xdWV1ZShzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPj4ocGF5bG9hZCksIGhhbmRsZXJfKTsKLSAgICAgIGlmIChlbnF1ZXVlX2J1ZmZlcl8uU2l6ZSgpID09IGtFbnF1ZXVlQnVmZmVyQnVzeVRocmVzaG9sZCkgewotICAgICAgICBwaW1wbF8tPmxvY2FsX2J1c3lfZGV0ZWN0ZWQoKTsKLSAgICAgICAgZW5xdWV1ZV9idWZmZXJfLk5vdGlmeU9uRW1wdHkoY29tbW9uOjpCaW5kT25jZSgmaW1wbDo6bG9jYWxfYnVzeV9jbGVhciwgY29tbW9uOjpVbnJldGFpbmVkKHBpbXBsXy5nZXQoKSkpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6U1RBUlQ6Ci0gICAgICBpZiAoc2FyX3N0YXRlXyAhPSBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpFTkQpIHsKLSAgICAgICAgTE9HX1dBUk4oIlJlY2VpdmVkIGludmFsaWQgU0FSIik7Ci0gICAgICAgIGNsb3NlX2NoYW5uZWwoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgLy8gVE9ETzogRW5mb3JjZSBNVFUKLSAgICAgIHNhcl9zdGF0ZV8gPSBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpTVEFSVDsKLSAgICAgIHJlYXNzZW1ibHlfc3RhZ2VfID0gcGF5bG9hZDsKLSAgICAgIHJlbWFpbmluZ19zZHVfY29udGludWF0aW9uX3BhY2tldF9zaXplXyA9IHNkdV9zaXplIC0gcGF5bG9hZC5zaXplKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OkNPTlRJTlVBVElPTjoKLSAgICAgIGlmIChzYXJfc3RhdGVfID09IFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OkVORCkgewotICAgICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBTQVIiKTsKLSAgICAgICAgY2xvc2VfY2hhbm5lbCgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICByZWFzc2VtYmx5X3N0YWdlXy5BcHBlbmRQYWNrZXRWaWV3KHBheWxvYWQpOwotICAgICAgcmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfIC09IHBheWxvYWQuc2l6ZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpFTkQ6Ci0gICAgICBpZiAoc2FyX3N0YXRlXyA9PSBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpFTkQpIHsKLSAgICAgICAgTE9HX1dBUk4oIlJlY2VpdmVkIGludmFsaWQgU0FSIik7Ci0gICAgICAgIGNsb3NlX2NoYW5uZWwoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc2FyX3N0YXRlXyA9IFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OkVORDsKLSAgICAgIHJlbWFpbmluZ19zZHVfY29udGludWF0aW9uX3BhY2tldF9zaXplXyAtPSBwYXlsb2FkLnNpemUoKTsKLSAgICAgIGlmIChyZW1haW5pbmdfc2R1X2NvbnRpbnVhdGlvbl9wYWNrZXRfc2l6ZV8gIT0gMCkgewotICAgICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBFTkQgSS1GcmFtZSIpOwotICAgICAgICByZWFzc2VtYmx5X3N0YWdlXyA9Ci0gICAgICAgICAgICBQYWNrZXRWaWV3Rm9yUmVhc3NlbWJseShQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpKTsKLSAgICAgICAgcmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfID0gMDsKLSAgICAgICAgY2xvc2VfY2hhbm5lbCgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICByZWFzc2VtYmx5X3N0YWdlXy5BcHBlbmRQYWNrZXRWaWV3KHBheWxvYWQpOwotICAgICAgZW5xdWV1ZV9idWZmZXJfLkVucXVldWUoc3RkOjptYWtlX3VuaXF1ZTxwYWNrZXQ6OlBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4+KHJlYXNzZW1ibHlfc3RhZ2VfKSwgaGFuZGxlcl8pOwotICAgICAgaWYgKGVucXVldWVfYnVmZmVyXy5TaXplKCkgPT0ga0VucXVldWVCdWZmZXJCdXN5VGhyZXNob2xkKSB7Ci0gICAgICAgIHBpbXBsXy0+bG9jYWxfYnVzeV9kZXRlY3RlZCgpOwotICAgICAgICBlbnF1ZXVlX2J1ZmZlcl8uTm90aWZ5T25FbXB0eShjb21tb246OkJpbmRPbmNlKCZpbXBsOjpsb2NhbF9idXN5X2NsZWFyLCBjb21tb246OlVucmV0YWluZWQocGltcGxfLmdldCgpKSkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBFcnRtQ29udHJvbGxlcjo6RW5hYmxlRmNzKGJvb2wgZW5hYmxlZCkgewotICBmY3NfZW5hYmxlZF8gPSBlbmFibGVkOwotfQotCi12b2lkIEVydG1Db250cm9sbGVyOjpzZW5kX3BkdShzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGR1KSB7Ci0gIHBkdV9xdWV1ZV8uZW1wbGFjZShzdGQ6Om1vdmUocGR1KSk7Ci0gIHNjaGVkdWxlcl8tPk9uUGFja2V0c1JlYWR5KGNpZF8sIDEpOwotfQotCi12b2lkIEVydG1Db250cm9sbGVyOjpTZXRSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sT3B0aW9ucygKLSAgICBjb25zdCBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sQ29uZmlndXJhdGlvbk9wdGlvbiYgb3B0aW9uKSB7Ci0gIHJlbW90ZV90eF93aW5kb3dfID0gb3B0aW9uLnR4X3dpbmRvd19zaXplXzsKLSAgbG9jYWxfbWF4X3RyYW5zbWl0XyA9IG9wdGlvbi5tYXhfdHJhbnNtaXRfOwotICBsb2NhbF9yZXRyYW5zbWl0X3RpbWVvdXRfbXNfID0gb3B0aW9uLnJldHJhbnNtaXNzaW9uX3RpbWVfb3V0XzsKLSAgbG9jYWxfbW9uaXRvcl90aW1lb3V0X21zXyA9IG9wdGlvbi5tb25pdG9yX3RpbWVfb3V0XzsKLSAgcmVtb3RlX21wc18gPSBvcHRpb24ubWF4aW11bV9wZHVfc2l6ZV87Ci19Ci0KLXZvaWQgRXJ0bUNvbnRyb2xsZXI6OmNsb3NlX2NoYW5uZWwoKSB7Ci0gIGxpbmtfLT5TZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoY2lkXywgcmVtb3RlX2NpZF8pOwotfQotCi1zaXplX3QgRXJ0bUNvbnRyb2xsZXI6OkNvcHlhYmxlUGFja2V0QnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGJ1aWxkZXJfLT5zaXplKCk7Ci19Ci0KLXZvaWQgRXJ0bUNvbnRyb2xsZXI6OkNvcHlhYmxlUGFja2V0QnVpbGRlcjo6U2VyaWFsaXplKEJpdEluc2VydGVyJiBpdCkgY29uc3QgewotICBidWlsZGVyXy0+U2VyaWFsaXplKGl0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2VuaGFuY2VkX3JldHJhbnNtaXNzaW9uX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaCBiL2dkL2wyY2FwL2ludGVybmFsL2VuaGFuY2VkX3JldHJhbnNtaXNzaW9uX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwYzM2Mi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9kYXRhX2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibDJjYXAvbXR1LmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIElMaW5rOwotCi1jbGFzcyBFcnRtQ29udHJvbGxlciA6IHB1YmxpYyBEYXRhQ29udHJvbGxlciB7Ci0gcHVibGljOgotICB1c2luZyBVcHBlckVucXVldWUgPSBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPjsKLSAgdXNpbmcgVXBwZXJEZXF1ZXVlID0gcGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcjsKLSAgdXNpbmcgVXBwZXJRdWV1ZURvd25FbmQgPSBjb21tb246OkJpZGlRdWV1ZUVuZDxVcHBlckVucXVldWUsIFVwcGVyRGVxdWV1ZT47Ci0gIEVydG1Db250cm9sbGVyKElMaW5rKiBsaW5rLCBDaWQgY2lkLCBDaWQgcmVtb3RlX2NpZCwgVXBwZXJRdWV1ZURvd25FbmQqIGNoYW5uZWxfcXVldWVfZW5kLCBvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgU2NoZWR1bGVyKiBzY2hlZHVsZXIpOwotICB+RXJ0bUNvbnRyb2xsZXIoKTsKLSAgLy8gU2VnbWVudGF0aW9uIGlzIGhhbmRsZWQgaGVyZQotICB2b2lkIE9uU2R1KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBzZHUpIG92ZXJyaWRlOwotICB2b2lkIE9uUGR1KHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBwZHUpIG92ZXJyaWRlOwotICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gR2V0TmV4dFBhY2tldCgpIG92ZXJyaWRlOwotICB2b2lkIEVuYWJsZUZjcyhib29sIGVuYWJsZWQpIG92ZXJyaWRlOwotICB2b2lkIFNldFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xPcHRpb25zKGNvbnN0IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xDb25maWd1cmF0aW9uT3B0aW9uJiBvcHRpb24pIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgSUxpbmsqIGxpbmtfOwotICBDaWQgY2lkXzsKLSAgQ2lkIHJlbW90ZV9jaWRfOwotICBvczo6RW5xdWV1ZUJ1ZmZlcjxVcHBlckVucXVldWU+IGVucXVldWVfYnVmZmVyXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4gcGR1X3F1ZXVlXzsKLSAgU2NoZWR1bGVyKiBzY2hlZHVsZXJfOwotCi0gIC8vIENvbmZpZ3VyYXRpb24gb3B0aW9ucwotICBib29sIGZjc19lbmFibGVkXyA9IGZhbHNlOwotICB1aW50MTZfdCBsb2NhbF90eF93aW5kb3dfID0gMTA7Ci0gIHVpbnQxNl90IGxvY2FsX21heF90cmFuc21pdF8gPSAyMDsKLSAgdWludDE2X3QgbG9jYWxfcmV0cmFuc21pdF90aW1lb3V0X21zXyA9IDIwMDA7Ci0gIHVpbnQxNl90IGxvY2FsX21vbml0b3JfdGltZW91dF9tc18gPSAxMjAwMDsKLQotICB1aW50MTZfdCByZW1vdGVfdHhfd2luZG93XyA9IDEwOwotICB1aW50MTZfdCByZW1vdGVfbXBzXyA9IDEwMTA7Ci0KLSAgY2xhc3MgUGFja2V0Vmlld0ZvclJlYXNzZW1ibHkgOiBwdWJsaWMgcGFja2V0OjpQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHsKLSAgIHB1YmxpYzoKLSAgICBQYWNrZXRWaWV3Rm9yUmVhc3NlbWJseShjb25zdCBQYWNrZXRWaWV3JiBwYWNrZXRWaWV3KSA6IFBhY2tldFZpZXcocGFja2V0Vmlldykge30KLSAgICB2b2lkIEFwcGVuZFBhY2tldFZpZXcocGFja2V0OjpQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHRvX2FwcGVuZCkgewotICAgICAgQXBwZW5kKHRvX2FwcGVuZCk7Ci0gICAgfQotICB9OwotCi0gIGNsYXNzIENvcHlhYmxlUGFja2V0QnVpbGRlciA6IHB1YmxpYyBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyIHsKLSAgIHB1YmxpYzoKLSAgICBDb3B5YWJsZVBhY2tldEJ1aWxkZXIoc3RkOjpzaGFyZWRfcHRyPHBhY2tldDo6UmF3QnVpbGRlcj4gYnVpbGRlcikgOiBidWlsZGVyXyhzdGQ6Om1vdmUoYnVpbGRlcikpIHt9Ci0KLSAgICB2b2lkIFNlcmlhbGl6ZShCaXRJbnNlcnRlciYgaXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBzdGQ6OnNoYXJlZF9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBidWlsZGVyXzsKLSAgfTsKLQotICBQYWNrZXRWaWV3Rm9yUmVhc3NlbWJseSByZWFzc2VtYmx5X3N0YWdlX3tQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpfTsKLSAgU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSBzYXJfc3RhdGVfID0gU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6RU5EOwotICB1aW50MTZfdCByZW1haW5pbmdfc2R1X2NvbnRpbnVhdGlvbl9wYWNrZXRfc2l6ZV8gPSAwOwotCi0gIHZvaWQgc3RhZ2VfZm9yX3JlYXNzZW1ibHkoU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSBzYXIsIHVpbnQxNl90IHNkdV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tldDo6UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiYgcGF5bG9hZCk7Ci0gIHZvaWQgc2VuZF9wZHUoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBkdSk7Ci0KLSAgdm9pZCBjbG9zZV9jaGFubmVsKCk7Ci0KLSAgdm9pZCBvbl9wZHVfbm9fZmNzKGNvbnN0IHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiYgcGR1KTsKLSAgdm9pZCBvbl9wZHVfZmNzKGNvbnN0IHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiYgcGR1KTsKLQotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyX3Rlc3QuY2MgYi9nZC9sMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTM4OTguLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvZW5oYW5jZWRfcmV0cmFuc21pc3Npb25fbW9kZV9jaGFubmVsX2RhdGFfY29udHJvbGxlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvaWxpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3NjaGVkdWxlcl9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvbDJjYXBfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IENyZWF0ZVNkdShzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkKSB7Ci0gIGF1dG8gcmF3X2J1aWxkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UmF3QnVpbGRlcj4oKTsKLSAgcmF3X2J1aWxkZXItPkFkZE9jdGV0cyhwYXlsb2FkKTsKLSAgcmV0dXJuIHJhd19idWlsZGVyOwotfQotCi1QYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi12b2lkIHN5bmNfaGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMwMCkpOwotICBFWFBFQ1RfRVEoc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLX0KLQotY2xhc3MgRXJ0bURhdGFDb250cm9sbGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgdXNlcl9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgICBxdWV1ZV9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgcXVldWVfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgdXNlcl9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgcXVldWVfaGFuZGxlcl87Ci0gICAgZGVsZXRlIHVzZXJfaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICBvczo6VGhyZWFkKiB0aHJlYWRfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogcXVldWVfaGFuZGxlcl8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKEVydG1EYXRhQ29udHJvbGxlclRlc3QsIHRyYW5zbWl0X25vX2ZjcykgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbms7Ci0gIEVydG1Db250cm9sbGVyIGNvbnRyb2xsZXJ7JmxpbmssIDEsIDEsIGNoYW5uZWxfcXVldWUuR2V0RG93bkVuZCgpLCBxdWV1ZV9oYW5kbGVyXywgJnNjaGVkdWxlcn07Ci0gIEVYUEVDVF9DQUxMKHNjaGVkdWxlciwgT25QYWNrZXRzUmVhZHkoMSwgMSkpOwotICBjb250cm9sbGVyLk9uU2R1KENyZWF0ZVNkdSh7J2EnLCAnYicsICdjJywgJ2QnfSkpOwotICBhdXRvIG5leHRfcGFja2V0ID0gY29udHJvbGxlci5HZXROZXh0UGFja2V0KCk7Ci0gIEVYUEVDVF9ORShuZXh0X3BhY2tldCwgbnVsbHB0cik7Ci0gIGF1dG8gdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKG5leHRfcGFja2V0KSk7Ci0gIGF1dG8gcGR1X3ZpZXcgPSBCYXNpY0ZyYW1lVmlldzo6Q3JlYXRlKHZpZXcpOwotICBFWFBFQ1RfVFJVRShwZHVfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHN0YW5kYXJkX3ZpZXcgPSBTdGFuZGFyZEZyYW1lVmlldzo6Q3JlYXRlKHBkdV92aWV3KTsKLSAgRVhQRUNUX1RSVUUoc3RhbmRhcmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGlfZnJhbWVfdmlldyA9IEVuaGFuY2VkSW5mb3JtYXRpb25GcmFtZVZpZXc6OkNyZWF0ZShzdGFuZGFyZF92aWV3KTsKLSAgRVhQRUNUX1RSVUUoaV9mcmFtZV92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGF5bG9hZCA9IGlfZnJhbWVfdmlldy5HZXRQYXlsb2FkKCk7Ci0gIHN0ZDo6c3RyaW5nIGRhdGEgPSBzdGQ6OnN0cmluZyhwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpOwotICBFWFBFQ1RfRVEoZGF0YSwgImFiY2QiKTsKLSAgRVhQRUNUX0VRKGlfZnJhbWVfdmlldy5HZXRUeFNlcSgpLCAwKTsKLSAgRVhQRUNUX0VRKGlfZnJhbWVfdmlldy5HZXRSZXFTZXEoKSwgMCk7Ci19Ci0KLVRFU1RfRihFcnRtRGF0YUNvbnRyb2xsZXJUZXN0LCByZWNlaXZlX25vX2ZjcykgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbms7Ci0gIEVydG1Db250cm9sbGVyIGNvbnRyb2xsZXJ7JmxpbmssIDEsIDEsIGNoYW5uZWxfcXVldWUuR2V0RG93bkVuZCgpLCBxdWV1ZV9oYW5kbGVyXywgJnNjaGVkdWxlcn07Ci0gIGF1dG8gc2VnbWVudCA9IENyZWF0ZVNkdSh7J2EnLCAnYicsICdjJywgJ2QnfSk7Ci0gIGF1dG8gYnVpbGRlciA9IEVuaGFuY2VkSW5mb3JtYXRpb25GcmFtZUJ1aWxkZXI6OkNyZWF0ZSgxLCAwLCBGaW5hbDo6Tk9UX1NFVCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OlVOU0VHTUVOVEVELCBzdGQ6Om1vdmUoc2VnbWVudCkpOwotICBhdXRvIGJhc2VfdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGJ1aWxkZXIpKTsKLSAgY29udHJvbGxlci5PblBkdShiYXNlX3ZpZXcpOwotICBzeW5jX2hhbmRsZXIocXVldWVfaGFuZGxlcl8pOwotICBhdXRvIHBheWxvYWQgPSBjaGFubmVsX3F1ZXVlLkdldFVwRW5kKCktPlRyeURlcXVldWUoKTsKLSAgRVhQRUNUX05FKHBheWxvYWQsIG51bGxwdHIpOwotICBzdGQ6OnN0cmluZyBkYXRhID0gc3RkOjpzdHJpbmcocGF5bG9hZC0+YmVnaW4oKSwgcGF5bG9hZC0+ZW5kKCkpOwotICBFWFBFQ1RfRVEoZGF0YSwgImFiY2QiKTsKLX0KLQotVEVTVF9GKEVydG1EYXRhQ29udHJvbGxlclRlc3QsIHJlYXNzZW1ibGVfdmFsaWRfc2R1KSB7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPFNjaGVkdWxlcjo6VXBwZXJFbnF1ZXVlLCBTY2hlZHVsZXI6OlVwcGVyRGVxdWV1ZT4gY2hhbm5lbF9xdWV1ZXsxMH07Ci0gIHRlc3Rpbmc6Ok1vY2tTY2hlZHVsZXIgc2NoZWR1bGVyOwotICB0ZXN0aW5nOjpNb2NrSUxpbmsgbGluazsKLSAgRXJ0bUNvbnRyb2xsZXIgY29udHJvbGxlcnsmbGluaywgMSwgMSwgY2hhbm5lbF9xdWV1ZS5HZXREb3duRW5kKCksIHF1ZXVlX2hhbmRsZXJfLCAmc2NoZWR1bGVyfTsKLSAgYXV0byBzZWdtZW50MSA9IENyZWF0ZVNkdSh7J2EnfSk7Ci0gIGF1dG8gc2VnbWVudDIgPSBDcmVhdGVTZHUoeydiJywgJ2MnfSk7Ci0gIGF1dG8gc2VnbWVudDMgPSBDcmVhdGVTZHUoeydkJywgJ2UnLCAnZid9KTsKLSAgYXV0byBidWlsZGVyMSA9IEVuaGFuY2VkSW5mb3JtYXRpb25TdGFydEZyYW1lQnVpbGRlcjo6Q3JlYXRlKDEsIDAsIEZpbmFsOjpOT1RfU0VULCAwLCA2LCBzdGQ6Om1vdmUoc2VnbWVudDEpKTsKLSAgYXV0byBiYXNlX3ZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShidWlsZGVyMSkpOwotICBjb250cm9sbGVyLk9uUGR1KGJhc2Vfdmlldyk7Ci0gIGF1dG8gYnVpbGRlcjIgPSBFbmhhbmNlZEluZm9ybWF0aW9uRnJhbWVCdWlsZGVyOjpDcmVhdGUoMSwgMSwgRmluYWw6Ok5PVF9TRVQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6Q09OVElOVUFUSU9OLCBzdGQ6Om1vdmUoc2VnbWVudDIpKTsKLSAgYmFzZV92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoYnVpbGRlcjIpKTsKLSAgY29udHJvbGxlci5PblBkdShiYXNlX3ZpZXcpOwotICBhdXRvIGJ1aWxkZXIzID0gRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lQnVpbGRlcjo6Q3JlYXRlKDEsIDIsIEZpbmFsOjpOT1RfU0VULCAwLCBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpFTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHNlZ21lbnQzKSk7Ci0gIGJhc2VfdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGJ1aWxkZXIzKSk7Ci0gIGNvbnRyb2xsZXIuT25QZHUoYmFzZV92aWV3KTsKLSAgc3luY19oYW5kbGVyKHF1ZXVlX2hhbmRsZXJfKTsKLSAgYXV0byBwYXlsb2FkID0gY2hhbm5lbF9xdWV1ZS5HZXRVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gIEVYUEVDVF9ORShwYXlsb2FkLCBudWxscHRyKTsKLSAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBheWxvYWQtPmJlZ2luKCksIHBheWxvYWQtPmVuZCgpKTsKLSAgRVhQRUNUX0VRKGRhdGEsICJhYmNkZWYiKTsKLX0KLQotVEVTVF9GKEVydG1EYXRhQ29udHJvbGxlclRlc3QsIHJlYXNzZW1ibGVfaW52YWxpZF9zZHVfc2l6ZV9pbl9zdGFydF9mcmFtZV93aWxsX2Rpc2Nvbm5lY3QpIHsKLSAgY29tbW9uOjpCaWRpUXVldWU8U2NoZWR1bGVyOjpVcHBlckVucXVldWUsIFNjaGVkdWxlcjo6VXBwZXJEZXF1ZXVlPiBjaGFubmVsX3F1ZXVlezEwfTsKLSAgdGVzdGluZzo6TW9ja1NjaGVkdWxlciBzY2hlZHVsZXI7Ci0gIHRlc3Rpbmc6Ok1vY2tJTGluayBsaW5rOwotICBFcnRtQ29udHJvbGxlciBjb250cm9sbGVyeyZsaW5rLCAxLCAxLCBjaGFubmVsX3F1ZXVlLkdldERvd25FbmQoKSwgcXVldWVfaGFuZGxlcl8sICZzY2hlZHVsZXJ9OwotICBhdXRvIHNlZ21lbnQxID0gQ3JlYXRlU2R1KHsnYSd9KTsKLSAgYXV0byBzZWdtZW50MiA9IENyZWF0ZVNkdSh7J2InLCAnYyd9KTsKLSAgYXV0byBzZWdtZW50MyA9IENyZWF0ZVNkdSh7J2QnLCAnZScsICdmJ30pOwotICBhdXRvIGJ1aWxkZXIxID0gRW5oYW5jZWRJbmZvcm1hdGlvblN0YXJ0RnJhbWVCdWlsZGVyOjpDcmVhdGUoMSwgMCwgRmluYWw6Ok5PVF9TRVQsIDAsIDEwLCBzdGQ6Om1vdmUoc2VnbWVudDEpKTsKLSAgYXV0byBiYXNlX3ZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShidWlsZGVyMSkpOwotICBjb250cm9sbGVyLk9uUGR1KGJhc2Vfdmlldyk7Ci0gIGF1dG8gYnVpbGRlcjIgPSBFbmhhbmNlZEluZm9ybWF0aW9uRnJhbWVCdWlsZGVyOjpDcmVhdGUoMSwgMSwgRmluYWw6Ok5PVF9TRVQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseTo6Q09OVElOVUFUSU9OLCBzdGQ6Om1vdmUoc2VnbWVudDIpKTsKLSAgYmFzZV92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoYnVpbGRlcjIpKTsKLSAgY29udHJvbGxlci5PblBkdShiYXNlX3ZpZXcpOwotICBhdXRvIGJ1aWxkZXIzID0gRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lQnVpbGRlcjo6Q3JlYXRlKDEsIDIsIEZpbmFsOjpOT1RfU0VULCAwLCBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5OjpFTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHNlZ21lbnQzKSk7Ci0gIGJhc2VfdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGJ1aWxkZXIzKSk7Ci0gIEVYUEVDVF9DQUxMKGxpbmssIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdCgxLCAxKSk7Ci0gIGNvbnRyb2xsZXIuT25QZHUoYmFzZV92aWV3KTsKLSAgc3luY19oYW5kbGVyKHF1ZXVlX2hhbmRsZXJfKTsKLSAgYXV0byBwYXlsb2FkID0gY2hhbm5lbF9xdWV1ZS5HZXRVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gIEVYUEVDVF9FUShwYXlsb2FkLCBudWxscHRyKTsKLX0KLQotVEVTVF9GKEVydG1EYXRhQ29udHJvbGxlclRlc3QsIHRyYW5zbWl0X3dpdGhfZmNzKSB7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPFNjaGVkdWxlcjo6VXBwZXJFbnF1ZXVlLCBTY2hlZHVsZXI6OlVwcGVyRGVxdWV1ZT4gY2hhbm5lbF9xdWV1ZXsxMH07Ci0gIHRlc3Rpbmc6Ok1vY2tTY2hlZHVsZXIgc2NoZWR1bGVyOwotICB0ZXN0aW5nOjpNb2NrSUxpbmsgbGluazsKLSAgRXJ0bUNvbnRyb2xsZXIgY29udHJvbGxlcnsmbGluaywgMSwgMSwgY2hhbm5lbF9xdWV1ZS5HZXREb3duRW5kKCksIHF1ZXVlX2hhbmRsZXJfLCAmc2NoZWR1bGVyfTsKLSAgY29udHJvbGxlci5FbmFibGVGY3ModHJ1ZSk7Ci0gIEVYUEVDVF9DQUxMKHNjaGVkdWxlciwgT25QYWNrZXRzUmVhZHkoMSwgMSkpOwotICBjb250cm9sbGVyLk9uU2R1KENyZWF0ZVNkdSh7J2EnLCAnYicsICdjJywgJ2QnfSkpOwotICBhdXRvIG5leHRfcGFja2V0ID0gY29udHJvbGxlci5HZXROZXh0UGFja2V0KCk7Ci0gIEVYUEVDVF9ORShuZXh0X3BhY2tldCwgbnVsbHB0cik7Ci0gIGF1dG8gdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKG5leHRfcGFja2V0KSk7Ci0gIGF1dG8gcGR1X3ZpZXcgPSBCYXNpY0ZyYW1lV2l0aEZjc1ZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgRVhQRUNUX1RSVUUocGR1X3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBzdGFuZGFyZF92aWV3ID0gU3RhbmRhcmRGcmFtZVdpdGhGY3NWaWV3OjpDcmVhdGUocGR1X3ZpZXcpOwotICBFWFBFQ1RfVFJVRShzdGFuZGFyZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gaV9mcmFtZV92aWV3ID0gRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjc1ZpZXc6OkNyZWF0ZShzdGFuZGFyZF92aWV3KTsKLSAgRVhQRUNUX1RSVUUoaV9mcmFtZV92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGF5bG9hZCA9IGlfZnJhbWVfdmlldy5HZXRQYXlsb2FkKCk7Ci0gIHN0ZDo6c3RyaW5nIGRhdGEgPSBzdGQ6OnN0cmluZyhwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpOwotICBFWFBFQ1RfRVEoZGF0YSwgImFiY2QiKTsKLSAgRVhQRUNUX0VRKGlfZnJhbWVfdmlldy5HZXRUeFNlcSgpLCAwKTsKLSAgRVhQRUNUX0VRKGlfZnJhbWVfdmlldy5HZXRSZXFTZXEoKSwgMCk7Ci19Ci0KLVRFU1RfRihFcnRtRGF0YUNvbnRyb2xsZXJUZXN0LCByZWNlaXZlX3BhY2tldF93aXRoX2ZjcykgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbms7Ci0gIEVydG1Db250cm9sbGVyIGNvbnRyb2xsZXJ7JmxpbmssIDEsIDEsIGNoYW5uZWxfcXVldWUuR2V0RG93bkVuZCgpLCBxdWV1ZV9oYW5kbGVyXywgJnNjaGVkdWxlcn07Ci0gIGNvbnRyb2xsZXIuRW5hYmxlRmNzKHRydWUpOwotICBhdXRvIHNlZ21lbnQgPSBDcmVhdGVTZHUoeydhJywgJ2InLCAnYycsICdkJ30pOwotICBhdXRvIGJ1aWxkZXIgPSBFbmhhbmNlZEluZm9ybWF0aW9uRnJhbWVXaXRoRmNzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgMSwgMCwgRmluYWw6Ok5PVF9TRVQsIDAsIFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHk6OlVOU0VHTUVOVEVELCBzdGQ6Om1vdmUoc2VnbWVudCkpOwotICBhdXRvIGJhc2VfdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGJ1aWxkZXIpKTsKLSAgY29udHJvbGxlci5PblBkdShiYXNlX3ZpZXcpOwotICBzeW5jX2hhbmRsZXIocXVldWVfaGFuZGxlcl8pOwotICBhdXRvIHBheWxvYWQgPSBjaGFubmVsX3F1ZXVlLkdldFVwRW5kKCktPlRyeURlcXVldWUoKTsKLSAgRVhQRUNUX05FKHBheWxvYWQsIG51bGxwdHIpOwotICBzdGQ6OnN0cmluZyBkYXRhID0gc3RkOjpzdHJpbmcocGF5bG9hZC0+YmVnaW4oKSwgcGF5bG9hZC0+ZW5kKCkpOwotICBFWFBFQ1RfRVEoZGF0YSwgImFiY2QiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3IuaCBiL2dkL2wyY2FwL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfYWxsb2NhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTUxY2EuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLQotbmFtZXNwYWNlIGNsYXNzaWMgewotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIER1bXBzeXNIZWxwZXI7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3Iga2VlcGluZyBjaGFubmVscyBpbiBhIExpbmsuIEl0IGFsbG9jYXRlcyBhbmQgZnJlZXMgQ2hhbm5lbCBvYmplY3QsIGFuZCBzdXBwb3J0cyBxdWVyeWluZyB3aGV0aGVyIGEKLS8vIGNoYW5uZWwgaXMgaW4gdXNlCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRml4ZWRDaGFubmVsSW1wbFR5cGUsIHR5cGVuYW1lIExpbmtUeXBlPgotY2xhc3MgRml4ZWRDaGFubmVsQWxsb2NhdG9yIHsKLSBwdWJsaWM6Ci0gIEZpeGVkQ2hhbm5lbEFsbG9jYXRvcihMaW5rVHlwZSogbGluaywgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIpIDogbGlua18obGluayksIGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpIHsKLSAgICBBU1NFUlQobGlua18gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGwyY2FwX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICB9Ci0KLSAgdmlydHVhbCB+Rml4ZWRDaGFubmVsQWxsb2NhdG9yKCkgPSBkZWZhdWx0OwotCi0gIC8vIEFsbG9jYXRlcyBhIGNoYW5uZWwuIElmIGNpZCBpcyB1c2VkLCByZXR1cm4gbnVsbHB0ci4gTk9URTogVGhlIHJldHVybmVkIEJhc2VGaXhlZENoYW5uZWxJbXBsIG9iamVjdCBpcyBzdGlsbAotICAvLyBvd25lZCBieSB0aGUgY2hhbm5lbCBhbGxvY2F0b3IsIE5PVCB0aGUgY2xpZW50LgotICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxGaXhlZENoYW5uZWxJbXBsVHlwZT4gQWxsb2NhdGVDaGFubmVsKENpZCBjaWQpIHsKLSAgICBBU1NFUlRfTE9HKCFJc0NoYW5uZWxBbGxvY2F0ZWQoKGNpZCkpLCAiQ2lkIDB4JXggZm9yIGxpbmsgJXMgaXMgYWxyZWFkeSBpbiB1c2UiLCBjaWQsIGxpbmtfLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIEFTU0VSVF9MT0coY2lkID49IGtGaXJzdEZpeGVkQ2hhbm5lbCAmJiBjaWQgPD0ga0xhc3RGaXhlZENoYW5uZWwsICJDaWQgJWQgb3V0IG9mIGJvdW5kIiwgY2lkKTsKLSAgICBhdXRvIGVsZW0gPSBjaGFubmVsc18udHJ5X2VtcGxhY2UoY2lkLCBzdGQ6Om1ha2Vfc2hhcmVkPEZpeGVkQ2hhbm5lbEltcGxUeXBlPihjaWQsIGxpbmtfLCBsMmNhcF9oYW5kbGVyXykpOwotICAgIEFTU0VSVF9MT0coZWxlbS5zZWNvbmQsICJGYWlsZWQgdG8gY3JlYXRlIGNoYW5uZWwgZm9yIGNpZCAweCV4IGxpbmsgJXMiLCBjaWQsIGxpbmtfLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIEFTU0VSVChlbGVtLmZpcnN0LT5zZWNvbmQgIT0gbnVsbHB0cik7Ci0gICAgcmV0dXJuIGVsZW0uZmlyc3QtPnNlY29uZDsKLSAgfQotCi0gIC8vIEZyZWVzIGEgY2hhbm5lbC4gSWYgY2lkIGRvZXNuJ3QgZXhpc3QsIGl0IHdpbGwgY3Jhc2gKLSAgdmlydHVhbCB2b2lkIEZyZWVDaGFubmVsKENpZCBjaWQpIHsKLSAgICBBU1NFUlRfTE9HKElzQ2hhbm5lbEFsbG9jYXRlZChjaWQpLCAiQ2hhbm5lbCBpcyBub3QgaW4gdXNlOiBjaWQgJWQsIGxpbmsgJXMiLCBjaWQsIGxpbmtfLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGNoYW5uZWxzXy5lcmFzZShjaWQpOwotICB9Ci0KLSAgdmlydHVhbCBib29sIElzQ2hhbm5lbEFsbG9jYXRlZChDaWQgY2lkKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYW5uZWxzXy5maW5kKGNpZCkgIT0gY2hhbm5lbHNfLmVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Rml4ZWRDaGFubmVsSW1wbFR5cGU+IEZpbmRDaGFubmVsKENpZCBjaWQpIHsKLSAgICBBU1NFUlRfTE9HKElzQ2hhbm5lbEFsbG9jYXRlZChjaWQpLCAiQ2hhbm5lbCBpcyBub3QgaW4gdXNlOiBjaWQgJWQsIGxpbmsgJXMiLCBjaWQsIGxpbmtfLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBjaGFubmVsc18uZmluZChjaWQpLT5zZWNvbmQ7Ci0gIH0KLQotICB2aXJ0dWFsIHNpemVfdCBOdW1iZXJPZkNoYW5uZWxzKCkgY29uc3QgewotICAgIHJldHVybiBjaGFubmVsc18uc2l6ZSgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMpIHsKLSAgICBmb3IgKGF1dG8mIGVsZW0gOiBjaGFubmVsc18pIHsKLSAgICAgIGVsZW0uc2Vjb25kLT5PbkNsb3NlZChoY2lfc3RhdHVzKTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIGludCBHZXRSZWZDb3VudCgpIHsKLSAgICBpbnQgcmVmX2NvdW50ID0gMDsKLSAgICBmb3IgKGF1dG8mIGVsZW0gOiBjaGFubmVsc18pIHsKLSAgICAgIGlmIChlbGVtLnNlY29uZC0+SXNBY3F1aXJlZCgpKSB7Ci0gICAgICAgIHJlZl9jb3VudCsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVmX2NvdW50OwotICB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OkR1bXBzeXNIZWxwZXI7Ci0gIExpbmtUeXBlKiBsaW5rXzsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8Q2lkLCBzdGQ6OnNoYXJlZF9wdHI8Rml4ZWRDaGFubmVsSW1wbFR5cGU+PiBjaGFubmVsc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfdGVzdC5jYyBiL2dkL2wyY2FwL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfYWxsb2NhdG9yX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTVjYzcuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX21vY2suaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2xpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXVzaW5nIGwyY2FwOjpjbGFzc2ljOjppbnRlcm5hbDo6dGVzdGluZzo6TW9ja0ZpeGVkQ2hhbm5lbEltcGw7Ci11c2luZyBsMmNhcDo6Y2xhc3NpYzo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tMaW5rOwotdXNpbmcgdGVzdGluZzo6TW9ja1BhcmFtZXRlclByb3ZpZGVyOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLWNvbnN0IGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZXt7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1N9OwotCi1jbGFzcyBMMmNhcEZpeGVkQ2hhbm5lbEFsbG9jYXRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGhhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICAgIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyA9IG5ldyBNb2NrUGFyYW1ldGVyUHJvdmlkZXIoKTsKLSAgICBtb2NrX2NsYXNzaWNfbGlua18gPSBuZXcgTW9ja0xpbmsoaGFuZGxlcl8sIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tfY2xhc3NpY19saW5rXywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgICAvLyBVc2UgY2xhc3NpYyBhcyBhIHBsYWNlIGhvbGRlcgotICAgIGNoYW5uZWxfYWxsb2NhdG9yXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Rml4ZWRDaGFubmVsQWxsb2NhdG9yPE1vY2tGaXhlZENoYW5uZWxJbXBsLCBNb2NrTGluaz4+KG1vY2tfY2xhc3NpY19saW5rXywgaGFuZGxlcl8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjaGFubmVsX2FsbG9jYXRvcl8ucmVzZXQoKTsKLSAgICBkZWxldGUgbW9ja19jbGFzc2ljX2xpbmtfOwotICAgIGRlbGV0ZSBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgb3M6OlRocmVhZCogdGhyZWFkX3tudWxscHRyfTsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfe251bGxwdHJ9OwotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIqIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyX3tudWxscHRyfTsKLSAgTW9ja0xpbmsqIG1vY2tfY2xhc3NpY19saW5rX3tudWxscHRyfTsKLSAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbEFsbG9jYXRvcjxNb2NrRml4ZWRDaGFubmVsSW1wbCwgTW9ja0xpbms+PiBjaGFubmVsX2FsbG9jYXRvcl87Ci19OwotCi1URVNUX0YoTDJjYXBGaXhlZENoYW5uZWxBbGxvY2F0b3JUZXN0LCBwcmVjb25kaXRpb24pIHsKLSAgQ2lkIGNpZCA9IGtGaXJzdEZpeGVkQ2hhbm5lbDsKLSAgRVhQRUNUX0ZBTFNFKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNDaGFubmVsQWxsb2NhdGVkKGNpZCkpOwotfQotCi1URVNUX0YoTDJjYXBGaXhlZENoYW5uZWxBbGxvY2F0b3JUZXN0LCBhbGxvY2F0ZV9hbmRfZnJlZV9jaGFubmVsKSB7Ci0gIENpZCBjaWQgPSBrRmlyc3RGaXhlZENoYW5uZWw7Ci0gIGF1dG8gY2hhbm5lbCA9IGNoYW5uZWxfYWxsb2NhdG9yXy0+QWxsb2NhdGVDaGFubmVsKGNpZCk7Ci0gIEVYUEVDVF9UUlVFKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNDaGFubmVsQWxsb2NhdGVkKGNpZCkpOwotICBFWFBFQ1RfRVEoY2hhbm5lbCwgY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbChjaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoY2hhbm5lbF9hbGxvY2F0b3JfLT5GcmVlQ2hhbm5lbChjaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNDaGFubmVsQWxsb2NhdGVkKGNpZCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvaWxpbmsuaCBiL2dkL2wyY2FwL2ludGVybmFsL2lsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYWM3NzkuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvaWxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgbGluayAoQ2xhc3NpYyBBQ0wgYW5kIExFKQotICovCi1jbGFzcyBJTGluayB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JTGluaygpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChDaWQgbG9jYWxfY2lkLCBDaWQgcmVtb3RlX2NpZCkgPSAwOwotICB2aXJ0dWFsIGhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldERldmljZSgpIGNvbnN0ID0gMDsKLQotICAvLyBVc2VkIGJ5IHNlbmRlciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIGFueSBwZW5kaW5nIHBhY2tldCB0byBiZSBzZW50LgotICAvLyBJZiB0aGVyZSBpcyBwZW5kaW5nIHBhY2tldCwgZG9uJ3QgZGVsZXRlIHRoZSBsaW5rLgotICB2aXJ0dWFsIHZvaWQgT25QZW5kaW5nUGFja2V0Q2hhbmdlKENpZCBsb2NhbF9jaWQsIGJvb2wgaGFzX3BhY2tldCkge30KLQotICAvLyBUbyBiZSB1c2VkIGJ5IExFIGNyZWRpdCBiYXNlZCBjaGFubmVsIGRhdGEgY29udHJvbGxlciBvdmVyIExFIGxpbmsKLSAgdmlydHVhbCB2b2lkIFNlbmRMZUNyZWRpdChDaWQgbG9jYWxfY2lkLCB1aW50MTZfdCBjcmVkaXQpIHt9Ci0KLSAgLy8gVXNlZCBieSBBMmRwIHNvZnR3YXJlIGVuY29kaW5nCi0gIHZpcnR1YWwgdm9pZCBTZXRDaGFubmVsVHhQcmlvcml0eShDaWQgbG9jYWxfY2lkLCBib29sIGhpZ2hfcHJpb3JpdHkpIHt9Ci19OwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2lsaW5rX21vY2suaCBiL2dkL2wyY2FwL2ludGVybmFsL2lsaW5rX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNTBmNS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9pbGlua19tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2lsaW5rLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0lMaW5rIDogcHVibGljIElMaW5rIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKGhjaTo6QWRkcmVzc1dpdGhUeXBlLCBHZXREZXZpY2UsICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNlbmREaXNjb25uZWN0aW9uUmVxdWVzdCwgKENpZCwgQ2lkKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNlbmRMZUNyZWRpdCwgKENpZCwgdWludDE2X3QpLCAob3ZlcnJpZGUpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjIGIvZ2QvbDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjU4NjI2Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL2xlX2NyZWRpdF9iYXNlZF9jaGFubmVsX2RhdGFfY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvbGluay5oIgotI2luY2x1ZGUgInBhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlci5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1MZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXI6OkxlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlcihJTGluayogbGluaywgQ2lkIGNpZCwgQ2lkIHJlbW90ZV9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBlclF1ZXVlRG93bkVuZCogY2hhbm5lbF9xdWV1ZV9lbmQsIG9zOjpIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGVyKiBzY2hlZHVsZXIpCi0gICAgOiBjaWRfKGNpZCksIHJlbW90ZV9jaWRfKHJlbW90ZV9jaWQpLCBlbnF1ZXVlX2J1ZmZlcl8oY2hhbm5lbF9xdWV1ZV9lbmQpLCBoYW5kbGVyXyhoYW5kbGVyKSwgc2NoZWR1bGVyXyhzY2hlZHVsZXIpLAotICAgICAgbGlua18obGluaykge30KLQotdm9pZCBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXI6Ok9uU2R1KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBzZHUpIHsKLSAgYXV0byBzZHVfc2l6ZSA9IHNkdS0+c2l6ZSgpOwotICBpZiAoc2R1X3NpemUgPT0gMCkgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBlbXB0eSBTRFUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHNkdV9zaXplID4gbXR1XykgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBzZHVfc2l6ZSAlZCA+IG10dSAlZCIsIHN0YXRpY19jYXN0PGludD4oc2R1X3NpemUpLCBtdHVfKTsKLSAgfQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPj4gc2VnbWVudHM7Ci0gIC8vIFRPRE86IFdlIGRvbid0IG5lZWQgdG8gd2FzdGUgMiBieXRlcyBmb3IgY29udGludWF0aW9uIHNlZ21lbnQuCi0gIHBhY2tldDo6RnJhZ21lbnRpbmdJbnNlcnRlciBmcmFnbWVudGluZ19pbnNlcnRlcihtcHNfIC0gMiwgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcihzZWdtZW50cykpOwotICBzZHUtPlNlcmlhbGl6ZShmcmFnbWVudGluZ19pbnNlcnRlcik7Ci0gIGZyYWdtZW50aW5nX2luc2VydGVyLmZpbmFsaXplKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0ZyYW1lQnVpbGRlcj4gYnVpbGRlcjsKLSAgYnVpbGRlciA9IEZpcnN0TGVJbmZvcm1hdGlvbkZyYW1lQnVpbGRlcjo6Q3JlYXRlKHJlbW90ZV9jaWRfLCBzZHVfc2l6ZSwgc3RkOjptb3ZlKHNlZ21lbnRzWzBdKSk7Ci0gIHBkdV9xdWV1ZV8uZW1wbGFjZShzdGQ6Om1vdmUoYnVpbGRlcikpOwotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNlZ21lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgYnVpbGRlciA9IEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUocmVtb3RlX2NpZF8sIHN0ZDo6bW92ZShzZWdtZW50c1tpXSkpOwotICAgIHBkdV9xdWV1ZV8uZW1wbGFjZShzdGQ6Om1vdmUoYnVpbGRlcikpOwotICB9Ci0gIGlmIChjcmVkaXRzXyA+PSBzZWdtZW50cy5zaXplKCkpIHsKLSAgICBzY2hlZHVsZXJfLT5PblBhY2tldHNSZWFkeShjaWRfLCBzZWdtZW50cy5zaXplKCkpOwotICAgIGNyZWRpdHNfIC09IHNlZ21lbnRzLnNpemUoKTsKLSAgfSBlbHNlIGlmIChjcmVkaXRzXyA+IDApIHsKLSAgICBzY2hlZHVsZXJfLT5PblBhY2tldHNSZWFkeShjaWRfLCBjcmVkaXRzXyk7Ci0gICAgcGVuZGluZ19mcmFtZXNfY291bnRfICs9IChzZWdtZW50cy5zaXplKCkgLSBjcmVkaXRzXyk7Ci0gICAgY3JlZGl0c18gPSAwOwotICB9IGVsc2UgewotICAgIHBlbmRpbmdfZnJhbWVzX2NvdW50XyArPSBzZWdtZW50cy5zaXplKCk7Ci0gIH0KLX0KLQotdm9pZCBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXI6Ok9uUGR1KHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBwZHUpIHsKLSAgYXV0byBiYXNpY19mcmFtZV92aWV3ID0gQmFzaWNGcmFtZVZpZXc6OkNyZWF0ZShwZHUpOwotICBpZiAoIWJhc2ljX2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIGludmFsaWQgZnJhbWUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGJhc2ljX2ZyYW1lX3ZpZXcuc2l6ZSgpID4gbXBzXykgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBmcmFtZSBzaXplICVkID4gbXBzICVkLCBkcm9wcGluZyB0aGUgcGFja2V0Iiwgc3RhdGljX2Nhc3Q8aW50PihiYXNpY19mcmFtZV92aWV3LnNpemUoKSksIG1wc18pOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfID09IDApIHsKLSAgICBhdXRvIHN0YXJ0X2ZyYW1lX3ZpZXcgPSBGaXJzdExlSW5mb3JtYXRpb25GcmFtZVZpZXc6OkNyZWF0ZShiYXNpY19mcmFtZV92aWV3KTsKLSAgICBpZiAoIXN0YXJ0X2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICBMT0dfV0FSTigiUmVjZWl2ZWQgaW52YWxpZCBmcmFtZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvIHBheWxvYWQgPSBzdGFydF9mcmFtZV92aWV3LkdldFBheWxvYWQoKTsKLSAgICBhdXRvIHNkdV9zaXplID0gc3RhcnRfZnJhbWVfdmlldy5HZXRMMmNhcFNkdUxlbmd0aCgpOwotICAgIHJlbWFpbmluZ19zZHVfY29udGludWF0aW9uX3BhY2tldF9zaXplXyA9IHNkdV9zaXplIC0gcGF5bG9hZC5zaXplKCk7Ci0gICAgcmVhc3NlbWJseV9zdGFnZV8gPSBwYXlsb2FkOwotICB9IGVsc2UgewotICAgIGF1dG8gcGF5bG9hZCA9IGJhc2ljX2ZyYW1lX3ZpZXcuR2V0UGF5bG9hZCgpOwotICAgIHJlbWFpbmluZ19zZHVfY29udGludWF0aW9uX3BhY2tldF9zaXplXyAtPSBwYXlsb2FkLnNpemUoKTsKLSAgICByZWFzc2VtYmx5X3N0YWdlXy5BcHBlbmRQYWNrZXRWaWV3KHBheWxvYWQpOwotICB9Ci0gIGlmIChyZW1haW5pbmdfc2R1X2NvbnRpbnVhdGlvbl9wYWNrZXRfc2l6ZV8gPT0gMCkgewotICAgIGVucXVldWVfYnVmZmVyXy5FbnF1ZXVlKHN0ZDo6bWFrZV91bmlxdWU8UGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPj4ocmVhc3NlbWJseV9zdGFnZV8pLCBoYW5kbGVyXyk7Ci0gIH0gZWxzZSBpZiAocmVtYWluaW5nX3NkdV9jb250aW51YXRpb25fcGFja2V0X3NpemVfIDwgMCB8fCByZWFzc2VtYmx5X3N0YWdlXy5zaXplKCkgPiBtdHVfKSB7Ci0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIGxhcmdlciBTRFUgc2l6ZSB0aGFuIGV4cGVjdGVkIik7Ci0gICAgcmVhc3NlbWJseV9zdGFnZV8gPSBQYWNrZXRWaWV3Rm9yUmVhc3NlbWJseShQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCkpKTsKLSAgICByZW1haW5pbmdfc2R1X2NvbnRpbnVhdGlvbl9wYWNrZXRfc2l6ZV8gPSAwOwotICAgIGxpbmtfLT5TZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoY2lkXywgcmVtb3RlX2NpZF8pOwotICB9Ci0gIC8vIFRPRE86IEltcHJvdmUgdGhlIGxvZ2ljIGJ5IHNlbmRpbmcgY3JlZGl0IG9ubHkgYWZ0ZXIgdXNlciBkZXF1ZXVlZCB0aGUgU0RVCi0gIGxpbmtfLT5TZW5kTGVDcmVkaXQoY2lkXywgMSk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXI6OkdldE5leHRQYWNrZXQoKSB7Ci0gIEFTU0VSVCghcGR1X3F1ZXVlXy5lbXB0eSgpKTsKLSAgYXV0byBuZXh0ID0gc3RkOjptb3ZlKHBkdV9xdWV1ZV8uZnJvbnQoKSk7Ci0gIHBkdV9xdWV1ZV8ucG9wKCk7Ci0gIHJldHVybiBuZXh0OwotfQotCi12b2lkIExlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlcjo6U2V0TXR1KE10dSBtdHUpIHsKLSAgbXR1XyA9IG10dTsKLX0KLQotdm9pZCBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXI6OlNldE1wcyh1aW50MTZfdCBtcHMpIHsKLSAgbXBzXyA9IG1wczsKLX0KLQotdm9pZCBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXI6Ok9uQ3JlZGl0KHVpbnQxNl90IGNyZWRpdHMpIHsKLSAgaW50IHRvdGFsX2NyZWRpdHMgPSBjcmVkaXRzXyArIGNyZWRpdHM7Ci0gIGlmICh0b3RhbF9jcmVkaXRzID4gMHhmZmZmKSB7Ci0gICAgbGlua18tPlNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChjaWRfLCByZW1vdGVfY2lkXyk7Ci0gIH0KLSAgY3JlZGl0c18gPSB0b3RhbF9jcmVkaXRzOwotICBpZiAocGVuZGluZ19mcmFtZXNfY291bnRfID4gMCAmJiBjcmVkaXRzXyA+PSBwZW5kaW5nX2ZyYW1lc19jb3VudF8pIHsKLSAgICBzY2hlZHVsZXJfLT5PblBhY2tldHNSZWFkeShjaWRfLCBwZW5kaW5nX2ZyYW1lc19jb3VudF8pOwotICAgIHBlbmRpbmdfZnJhbWVzX2NvdW50XyA9IDA7Ci0gICAgY3JlZGl0c18gLT0gcGVuZGluZ19mcmFtZXNfY291bnRfOwotICB9IGVsc2UgaWYgKHBlbmRpbmdfZnJhbWVzX2NvdW50XyA+IDApIHsKLSAgICBzY2hlZHVsZXJfLT5PblBhY2tldHNSZWFkeShjaWRfLCBjcmVkaXRzXyk7Ci0gICAgcGVuZGluZ19mcmFtZXNfY291bnRfIC09IGNyZWRpdHNfOwotICAgIGNyZWRpdHNfID0gMDsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9sZV9jcmVkaXRfYmFzZWRfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5OThjNS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9sZV9jcmVkaXRfYmFzZWRfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZGF0YV9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvaWxpbmsuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibDJjYXAvbXR1LmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgTGVDcmVkaXRCYXNlZERhdGFDb250cm9sbGVyIDogcHVibGljIERhdGFDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIFVwcGVyRW5xdWV1ZSA9IHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+OwotICB1c2luZyBVcHBlckRlcXVldWUgPSBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyOwotICB1c2luZyBVcHBlclF1ZXVlRG93bkVuZCA9IGNvbW1vbjo6QmlkaVF1ZXVlRW5kPFVwcGVyRW5xdWV1ZSwgVXBwZXJEZXF1ZXVlPjsKLSAgTGVDcmVkaXRCYXNlZERhdGFDb250cm9sbGVyKElMaW5rKiBsaW5rLCBDaWQgY2lkLCBDaWQgcmVtb3RlX2NpZCwgVXBwZXJRdWV1ZURvd25FbmQqIGNoYW5uZWxfcXVldWVfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsIFNjaGVkdWxlciogc2NoZWR1bGVyKTsKLQotICB2b2lkIE9uU2R1KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBzZHUpIG92ZXJyaWRlOwotICB2b2lkIE9uUGR1KHBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBwZHUpIG92ZXJyaWRlOwotICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gR2V0TmV4dFBhY2tldCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgRW5hYmxlRmNzKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTZXRSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sT3B0aW9ucyhjb25zdCBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sQ29uZmlndXJhdGlvbk9wdGlvbiYgb3B0aW9uKSBvdmVycmlkZSB7fQotCi0gIC8vIFRPRE86IFNldCBNVFUgYW5kIE1QUyBmcm9tIHNpZ25hbGxpbmcgY2hhbm5lbAotICB2b2lkIFNldE10dShNdHUgbXR1KTsKLSAgdm9pZCBTZXRNcHModWludDE2X3QgbXBzKTsKLSAgLy8gVE9ETzogSGFuZGxlIGNyZWRpdHMKLSAgdm9pZCBPbkNyZWRpdCh1aW50MTZfdCBjcmVkaXRzKTsKLQotIHByaXZhdGU6Ci0gIENpZCBjaWRfOwotICBDaWQgcmVtb3RlX2NpZF87Ci0gIG9zOjpFbnF1ZXVlQnVmZmVyPFVwcGVyRW5xdWV1ZT4gZW5xdWV1ZV9idWZmZXJfOwotICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+PiBwZHVfcXVldWVfOwotICBTY2hlZHVsZXIqIHNjaGVkdWxlcl87Ci0gIElMaW5rKiBsaW5rXzsKLSAgTXR1IG10dV8gPSA1MTI7Ci0gIHVpbnQxNl90IG1wc18gPSAyNTE7Ci0gIHVpbnQxNl90IGNyZWRpdHNfID0gMDsKLSAgdWludDE2X3QgcGVuZGluZ19mcmFtZXNfY291bnRfID0gMDsKLQotICBjbGFzcyBQYWNrZXRWaWV3Rm9yUmVhc3NlbWJseSA6IHB1YmxpYyBwYWNrZXQ6OlBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gewotICAgcHVibGljOgotICAgIFBhY2tldFZpZXdGb3JSZWFzc2VtYmx5KGNvbnN0IFBhY2tldFZpZXcmIHBhY2tldFZpZXcpIDogUGFja2V0VmlldyhwYWNrZXRWaWV3KSB7fQotICAgIHZvaWQgQXBwZW5kUGFja2V0VmlldyhwYWNrZXQ6OlBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gdG9fYXBwZW5kKSB7Ci0gICAgICBBcHBlbmQodG9fYXBwZW5kKTsKLSAgICB9Ci0gIH07Ci0gIFBhY2tldFZpZXdGb3JSZWFzc2VtYmx5IHJlYXNzZW1ibHlfc3RhZ2Vfe1BhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4oc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKSl9OwotICB1aW50MTZfdCByZW1haW5pbmdfc2R1X2NvbnRpbnVhdGlvbl9wYWNrZXRfc2l6ZV8gPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL2xlX2NyZWRpdF9iYXNlZF9jaGFubmVsX2RhdGFfY29udHJvbGxlcl90ZXN0LmNjIGIvZ2QvbDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjNkZDIuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2xlX2NyZWRpdF9iYXNlZF9jaGFubmVsX2RhdGFfY29udHJvbGxlci5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2lsaW5rX21vY2suaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBDcmVhdGVTZHUoc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCkgewotICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxwYWNrZXQ6OlJhd0J1aWxkZXI+KHN0ZDo6bW92ZShwYXlsb2FkKSk7Ci19Ci0KLVBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gR2V0UGFja2V0VmlldyhzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGFja2V0KSB7Ci0gIGF1dG8gYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpKCpieXRlcyk7Ci0gIGJ5dGVzLT5yZXNlcnZlKHBhY2tldC0+c2l6ZSgpKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaSk7Ci0gIHJldHVybiBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPihieXRlcyk7Ci19Ci0KLXZvaWQgc3luY19oYW5kbGVyKG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBoYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLCBjb21tb246OlVucmV0YWluZWQoJnByb21pc2UpKSk7Ci0gIGF1dG8gc3RhdHVzID0gZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAwKSk7Ci0gIEVYUEVDVF9FUShzdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotfQotCi1jbGFzcyBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgb3M6OlRocmVhZCgidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICB1c2VyX2hhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICAgIHF1ZXVlX2hhbmRsZXJfID0gbmV3IG9zOjpIYW5kbGVyKHRocmVhZF8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBxdWV1ZV9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICB1c2VyX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBxdWV1ZV9oYW5kbGVyXzsKLSAgICBkZWxldGUgdXNlcl9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBxdWV1ZV9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoTGVDcmVkaXRCYXNlZERhdGFDb250cm9sbGVyVGVzdCwgdHJhbnNtaXRfdW5zZWdtZW50ZWQpIHsKLSAgY29tbW9uOjpCaWRpUXVldWU8U2NoZWR1bGVyOjpVcHBlckVucXVldWUsIFNjaGVkdWxlcjo6VXBwZXJEZXF1ZXVlPiBjaGFubmVsX3F1ZXVlezEwfTsKLSAgdGVzdGluZzo6TW9ja1NjaGVkdWxlciBzY2hlZHVsZXI7Ci0gIHRlc3Rpbmc6Ok1vY2tJTGluayBsaW5rOwotICBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXIgY29udHJvbGxlcnsmbGluaywgMHg0MSwgMHg0MSwgY2hhbm5lbF9xdWV1ZS5HZXREb3duRW5kKCksIHF1ZXVlX2hhbmRsZXJfLCAmc2NoZWR1bGVyfTsKLSAgY29udHJvbGxlci5PbkNyZWRpdCgxMCk7Ci0gIEVYUEVDVF9DQUxMKHNjaGVkdWxlciwgT25QYWNrZXRzUmVhZHkoMHg0MSwgMSkpOwotICBjb250cm9sbGVyLk9uU2R1KENyZWF0ZVNkdSh7J2EnLCAnYicsICdjJywgJ2QnfSkpOwotICBhdXRvIG5leHRfcGFja2V0ID0gY29udHJvbGxlci5HZXROZXh0UGFja2V0KCk7Ci0gIEVYUEVDVF9ORShuZXh0X3BhY2tldCwgbnVsbHB0cik7Ci0gIGF1dG8gdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKG5leHRfcGFja2V0KSk7Ci0gIGF1dG8gcGR1X3ZpZXcgPSBCYXNpY0ZyYW1lVmlldzo6Q3JlYXRlKHZpZXcpOwotICBFWFBFQ1RfVFJVRShwZHVfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGZpcnN0X2xlX2luZm9fdmlldyA9IEZpcnN0TGVJbmZvcm1hdGlvbkZyYW1lVmlldzo6Q3JlYXRlKHBkdV92aWV3KTsKLSAgRVhQRUNUX1RSVUUoZmlyc3RfbGVfaW5mb192aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGF5bG9hZCA9IGZpcnN0X2xlX2luZm9fdmlldy5HZXRQYXlsb2FkKCk7Ci0gIHN0ZDo6c3RyaW5nIGRhdGEgPSBzdGQ6OnN0cmluZyhwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpOwotICBFWFBFQ1RfRVEoZGF0YSwgImFiY2QiKTsKLX0KLQotVEVTVF9GKExlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlclRlc3QsIHRyYW5zbWl0X3NlZ21lbnRlZCkgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbms7Ci0gIExlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlciBjb250cm9sbGVyeyZsaW5rLCAweDQxLCAweDQxLCBjaGFubmVsX3F1ZXVlLkdldERvd25FbmQoKSwgcXVldWVfaGFuZGxlcl8sICZzY2hlZHVsZXJ9OwotICBjb250cm9sbGVyLk9uQ3JlZGl0KDEwKTsKLSAgY29udHJvbGxlci5TZXRNcHMoNCk7Ci0gIEVYUEVDVF9DQUxMKHNjaGVkdWxlciwgT25QYWNrZXRzUmVhZHkoMHg0MSwgMikpOwotICAvLyBTaG91bGQgYmUgZGl2aWRlZCBpbnRvICdhYicsIGFuZCAnY2QnCi0gIGNvbnRyb2xsZXIuT25TZHUoQ3JlYXRlU2R1KHsnYScsICdiJywgJ2MnLCAnZCd9KSk7Ci0gIGF1dG8gbmV4dF9wYWNrZXQgPSBjb250cm9sbGVyLkdldE5leHRQYWNrZXQoKTsKLSAgRVhQRUNUX05FKG5leHRfcGFja2V0LCBudWxscHRyKTsKLSAgYXV0byB2aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobmV4dF9wYWNrZXQpKTsKLSAgYXV0byBwZHVfdmlldyA9IEJhc2ljRnJhbWVWaWV3OjpDcmVhdGUodmlldyk7Ci0gIEVYUEVDVF9UUlVFKHBkdV92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gZmlyc3RfbGVfaW5mb192aWV3ID0gRmlyc3RMZUluZm9ybWF0aW9uRnJhbWVWaWV3OjpDcmVhdGUocGR1X3ZpZXcpOwotICBFWFBFQ1RfVFJVRShmaXJzdF9sZV9pbmZvX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYXlsb2FkID0gZmlyc3RfbGVfaW5mb192aWV3LkdldFBheWxvYWQoKTsKLSAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBheWxvYWQuYmVnaW4oKSwgcGF5bG9hZC5lbmQoKSk7Ci0gIEVYUEVDVF9FUShkYXRhLCAiYWIiKTsKLSAgRVhQRUNUX0VRKGZpcnN0X2xlX2luZm9fdmlldy5HZXRMMmNhcFNkdUxlbmd0aCgpLCA0KTsKLQotICBuZXh0X3BhY2tldCA9IGNvbnRyb2xsZXIuR2V0TmV4dFBhY2tldCgpOwotICBFWFBFQ1RfTkUobmV4dF9wYWNrZXQsIG51bGxwdHIpOwotICB2aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobmV4dF9wYWNrZXQpKTsKLSAgcGR1X3ZpZXcgPSBCYXNpY0ZyYW1lVmlldzo6Q3JlYXRlKHZpZXcpOwotICBFWFBFQ1RfVFJVRShwZHVfdmlldy5Jc1ZhbGlkKCkpOwotICBwYXlsb2FkID0gcGR1X3ZpZXcuR2V0UGF5bG9hZCgpOwotICBkYXRhID0gc3RkOjpzdHJpbmcocGF5bG9hZC5iZWdpbigpLCBwYXlsb2FkLmVuZCgpKTsKLSAgRVhQRUNUX0VRKGRhdGEsICJjZCIpOwotfQotCi1URVNUX0YoTGVDcmVkaXRCYXNlZERhdGFDb250cm9sbGVyVGVzdCwgcmVjZWl2ZV91bnNlZ21lbnRlZCkgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbms7Ci0gIExlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlciBjb250cm9sbGVyeyZsaW5rLCAweDQxLCAweDQxLCBjaGFubmVsX3F1ZXVlLkdldERvd25FbmQoKSwgcXVldWVfaGFuZGxlcl8sICZzY2hlZHVsZXJ9OwotICBjb250cm9sbGVyLk9uQ3JlZGl0KDEwKTsKLSAgYXV0byBzZWdtZW50ID0gQ3JlYXRlU2R1KHsnYScsICdiJywgJ2MnLCAnZCd9KTsKLSAgYXV0byBidWlsZGVyID0gRmlyc3RMZUluZm9ybWF0aW9uRnJhbWVCdWlsZGVyOjpDcmVhdGUoMHg0MSwgNCwgc3RkOjptb3ZlKHNlZ21lbnQpKTsKLSAgYXV0byBiYXNlX3ZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShidWlsZGVyKSk7Ci0gIGNvbnRyb2xsZXIuT25QZHUoYmFzZV92aWV3KTsKLSAgc3luY19oYW5kbGVyKHF1ZXVlX2hhbmRsZXJfKTsKLSAgYXV0byBwYXlsb2FkID0gY2hhbm5lbF9xdWV1ZS5HZXRVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gIEVYUEVDVF9ORShwYXlsb2FkLCBudWxscHRyKTsKLSAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBheWxvYWQtPmJlZ2luKCksIHBheWxvYWQtPmVuZCgpKTsKLSAgRVhQRUNUX0VRKGRhdGEsICJhYmNkIik7Ci19Ci0KLVRFU1RfRihMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXJUZXN0LCByZWNlaXZlX3NlZ21lbnRlZCkgewotICBjb21tb246OkJpZGlRdWV1ZTxTY2hlZHVsZXI6OlVwcGVyRW5xdWV1ZSwgU2NoZWR1bGVyOjpVcHBlckRlcXVldWU+IGNoYW5uZWxfcXVldWV7MTB9OwotICB0ZXN0aW5nOjpNb2NrU2NoZWR1bGVyIHNjaGVkdWxlcjsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbms7Ci0gIExlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlciBjb250cm9sbGVyeyZsaW5rLCAweDQxLCAweDQxLCBjaGFubmVsX3F1ZXVlLkdldERvd25FbmQoKSwgcXVldWVfaGFuZGxlcl8sICZzY2hlZHVsZXJ9OwotICBjb250cm9sbGVyLk9uQ3JlZGl0KDEwKTsKLSAgYXV0byBzZWdtZW50MSA9IENyZWF0ZVNkdSh7J2EnLCAnYicsICdjJywgJ2QnfSk7Ci0gIGF1dG8gYnVpbGRlcjEgPSBGaXJzdExlSW5mb3JtYXRpb25GcmFtZUJ1aWxkZXI6OkNyZWF0ZSgweDQxLCA3LCBzdGQ6Om1vdmUoc2VnbWVudDEpKTsKLSAgYXV0byBiYXNlX3ZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShidWlsZGVyMSkpOwotICBjb250cm9sbGVyLk9uUGR1KGJhc2Vfdmlldyk7Ci0gIGF1dG8gc2VnbWVudDIgPSBDcmVhdGVTZHUoeydlJywgJ2YnLCAnZyd9KTsKLSAgYXV0byBidWlsZGVyMiA9IEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUoMHg0MSwgc3RkOjptb3ZlKHNlZ21lbnQyKSk7Ci0gIGJhc2VfdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGJ1aWxkZXIyKSk7Ci0gIEVYUEVDVF9DQUxMKGxpbmssIFNlbmRMZUNyZWRpdCgweDQxLCAxKSk7Ci0gIGNvbnRyb2xsZXIuT25QZHUoYmFzZV92aWV3KTsKLSAgc3luY19oYW5kbGVyKHF1ZXVlX2hhbmRsZXJfKTsKLSAgYXV0byBwYXlsb2FkID0gY2hhbm5lbF9xdWV1ZS5HZXRVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gIEVYUEVDVF9ORShwYXlsb2FkLCBudWxscHRyKTsKLSAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBheWxvYWQtPmJlZ2luKCksIHBheWxvYWQtPmVuZCgpKTsKLSAgRVhQRUNUX0VRKGRhdGEsICJhYmNkZWZnIik7Ci19Ci0KLVRFU1RfRihMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXJUZXN0LCByZWNlaXZlX3NlZ21lbnRlZF93aXRoX3dyb25nX3NkdV9sZW5ndGgpIHsKLSAgY29tbW9uOjpCaWRpUXVldWU8U2NoZWR1bGVyOjpVcHBlckVucXVldWUsIFNjaGVkdWxlcjo6VXBwZXJEZXF1ZXVlPiBjaGFubmVsX3F1ZXVlezEwfTsKLSAgdGVzdGluZzo6TW9ja1NjaGVkdWxlciBzY2hlZHVsZXI7Ci0gIHRlc3Rpbmc6Ok1vY2tJTGluayBsaW5rOwotICBMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXIgY29udHJvbGxlcnsmbGluaywgMHg0MSwgMHg0MSwgY2hhbm5lbF9xdWV1ZS5HZXREb3duRW5kKCksIHF1ZXVlX2hhbmRsZXJfLCAmc2NoZWR1bGVyfTsKLSAgY29udHJvbGxlci5PbkNyZWRpdCgxMCk7Ci0gIGF1dG8gc2VnbWVudDEgPSBDcmVhdGVTZHUoeydhJywgJ2InLCAnYycsICdkJ30pOwotICBhdXRvIGJ1aWxkZXIxID0gRmlyc3RMZUluZm9ybWF0aW9uRnJhbWVCdWlsZGVyOjpDcmVhdGUoMHg0MSwgNSwgc3RkOjptb3ZlKHNlZ21lbnQxKSk7Ci0gIGF1dG8gYmFzZV92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUoYnVpbGRlcjEpKTsKLSAgY29udHJvbGxlci5PblBkdShiYXNlX3ZpZXcpOwotICBhdXRvIHNlZ21lbnQyID0gQ3JlYXRlU2R1KHsnZScsICdmJywgJ2cnfSk7Ci0gIGF1dG8gYnVpbGRlcjIgPSBCYXNpY0ZyYW1lQnVpbGRlcjo6Q3JlYXRlKDB4NDEsIHN0ZDo6bW92ZShzZWdtZW50MikpOwotICBiYXNlX3ZpZXcgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShidWlsZGVyMikpOwotICBjb250cm9sbGVyLk9uUGR1KGJhc2Vfdmlldyk7Ci0gIHN5bmNfaGFuZGxlcihxdWV1ZV9oYW5kbGVyXyk7Ci0gIGF1dG8gcGF5bG9hZCA9IGNoYW5uZWxfcXVldWUuR2V0VXBFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICBFWFBFQ1RfRVEocGF5bG9hZCwgbnVsbHB0cik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlci5oIGIvZ2QvbDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzAzMjIuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNocm9ubz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLyoqCi0gKiBBIGNsYXNzIHRoYXQgcHJvdmlkZSBjb25zdGFudCBwYXJhbWV0ZXJzIHRvIHRoZSBMMkNBUCBzdGFjawotICoKLSAqIEFsbCBtZXRob2RzIGFyZSB2aXJ0dWFsIHNvIHRoYXQgdGhleSBjYW4gYmUgb3ZlcnJpZGUgaW4gdW5pdCB0ZXN0cwotICovCi1jbGFzcyBQYXJhbWV0ZXJQcm92aWRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5QYXJhbWV0ZXJQcm92aWRlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkgewotICAgIHJldHVybiBzdGQ6OmNocm9ubzo6c2Vjb25kcygyMCk7Ci0gIH0KLSAgdmlydHVhbCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCgpIHsKLSAgICByZXR1cm4gc3RkOjpjaHJvbm86OnNlY29uZHMoMSk7Ci0gIH0KLSAgdmlydHVhbCB1aW50MTZfdCBHZXRMZU1wcygpIHsKLSAgICByZXR1cm4gMjUxOwotICB9Ci0gIHZpcnR1YWwgdWludDE2X3QgR2V0TGVJbml0aWFsQ3JlZGl0KCkgewotICAgIHJldHVybiAxMDA7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9wYXJhbWV0ZXJfcHJvdmlkZXJfbW9jay5oIGIvZ2QvbDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzY2Y4YS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9wYXJhbWV0ZXJfcHJvdmlkZXJfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja1BhcmFtZXRlclByb3ZpZGVyIDogcHVibGljIFBhcmFtZXRlclByb3ZpZGVyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIEdldENsYXNzaWNMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0LCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCwgKCksIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvcmVjZWl2ZXIuY2MgYi9nZC9sMmNhcC9pbnRlcm5hbC9yZWNlaXZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllMmU1NS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9yZWNlaXZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9yZWNlaXZlci5oIgotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9kYXRhX3BpcGVsaW5lX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF92aWV3LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1SZWNlaXZlcjo6UmVjZWl2ZXIoCi0gICAgTG93ZXJRdWV1ZVVwRW5kKiBsaW5rX3F1ZXVlX3VwX2VuZCwgb3M6OkhhbmRsZXIqIGhhbmRsZXIsIERhdGFQaXBlbGluZU1hbmFnZXIqIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8pCi0gICAgOiBsaW5rX3F1ZXVlX3VwX2VuZF8obGlua19xdWV1ZV91cF9lbmQpLAotICAgICAgaGFuZGxlcl8oaGFuZGxlciksCi0gICAgICBidWZmZXJfdGltZXJfKGhhbmRsZXIpLAotICAgICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXyhkYXRhX3BpcGVsaW5lX21hbmFnZXJfKSB7Ci0gIEFTU0VSVChsaW5rX3F1ZXVlX3VwX2VuZF8gIT0gbnVsbHB0ciAmJiBoYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgbGlua19xdWV1ZV91cF9lbmRfLT5SZWdpc3RlckRlcXVldWUoaGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6QmluZCgmUmVjZWl2ZXI6OmxpbmtfcXVldWVfZGVxdWV1ZV9jYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci19Ci0KLS8vIEludm9rZWQgZnJvbSBleHRlcm5hbCBoYW5kbGVyL3RocmVhZCAoTW9kdWxlUmVnaXN0cnkpCi1SZWNlaXZlcjo6flJlY2VpdmVyKCkgewotICBsaW5rX3F1ZXVlX3VwX2VuZF8tPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci19Ci0KLS8vIEludm9rZWQgZnJvbSBleHRlcm5hbCAoUXVldWUgUmVhY3RhYmxlKQotdm9pZCBSZWNlaXZlcjo6bGlua19xdWV1ZV9kZXF1ZXVlX2NhbGxiYWNrKCkgewotICBhdXRvIHBhY2tldCA9IGxpbmtfcXVldWVfdXBfZW5kXy0+VHJ5RGVxdWV1ZSgpOwotICBhdXRvIGJhc2ljX2ZyYW1lX3ZpZXcgPSBCYXNpY0ZyYW1lVmlldzo6Q3JlYXRlKCpwYWNrZXQpOwotICBpZiAoIWJhc2ljX2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIGFuIGludmFsaWQgYmFzaWMgZnJhbWUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ2lkIGNpZCA9IHN0YXRpY19jYXN0PENpZD4oYmFzaWNfZnJhbWVfdmlldy5HZXRDaGFubmVsSWQoKSk7Ci0gIGF1dG8qIGRhdGFfY29udHJvbGxlciA9IGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8tPkdldERhdGFDb250cm9sbGVyKGNpZCk7Ci0gIGlmIChkYXRhX2NvbnRyb2xsZXIgPT0gbnVsbHB0cikgewotICAgIC8vIFRPRE8oYi8xNTAxNzAyNzEpOiBCdWZmZXIgYSBmZXcgcGFja2V0cyBiZWZvcmUgZGF0YSBjb250cm9sbGVyIGlzIGF0dGFjaGVkCi0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIGEgcGFja2V0IHdpdGhvdXQgZGF0YSBjb250cm9sbGVyLiBjaWQ6ICVkIiwgY2lkKTsKLSAgICBidWZmZXJlZF9wYWNrZXRzXy5lbXBsYWNlKCpwYWNrZXQpOwotICAgIExPR19XQVJOKCJFbnF1ZXVlZCB0aGUgdW5leHBlY3RlZCBwYWNrZXQuIEN1cnJlbnQgcXVldWUgc2l6ZTogJXp1IiwgYnVmZmVyZWRfcGFja2V0c18uc2l6ZSgpKTsKLSAgICBidWZmZXJfdGltZXJfLlNjaGVkdWxlKAotICAgICAgICBjb21tb246OkJpbmRPbmNlKCZSZWNlaXZlcjo6Y2hlY2tfYnVmZmVyZWRfcGFja2V0cywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg1MDApKTsKLQotICAgIHJldHVybjsKLSAgfQotICBkYXRhX2NvbnRyb2xsZXItPk9uUGR1KCpwYWNrZXQpOwotfQotCi12b2lkIFJlY2VpdmVyOjpjaGVja19idWZmZXJlZF9wYWNrZXRzKCkgewotICB3aGlsZSAoIWJ1ZmZlcmVkX3BhY2tldHNfLmVtcHR5KCkpIHsKLSAgICBhdXRvIHBhY2tldCA9IGJ1ZmZlcmVkX3BhY2tldHNfLmZyb250KCk7Ci0gICAgYnVmZmVyZWRfcGFja2V0c18ucG9wKCk7Ci0gICAgYXV0byBiYXNpY19mcmFtZV92aWV3ID0gQmFzaWNGcmFtZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICAgIGlmICghYmFzaWNfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19XQVJOKCJSZWNlaXZlZCBhbiBpbnZhbGlkIGJhc2ljIGZyYW1lIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIENpZCBjaWQgPSBzdGF0aWNfY2FzdDxDaWQ+KGJhc2ljX2ZyYW1lX3ZpZXcuR2V0Q2hhbm5lbElkKCkpOwotICAgIGF1dG8qIGRhdGFfY29udHJvbGxlciA9IGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8tPkdldERhdGFDb250cm9sbGVyKGNpZCk7Ci0gICAgaWYgKGRhdGFfY29udHJvbGxlciA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfRVJST1IoIkRyb3BwaW5nIGEgcGFja2V0IHdpdGggaW52YWxpZCBjaWQ6ICVkIiwgY2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgZGF0YV9jb250cm9sbGVyLT5PblBkdShwYWNrZXQpOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvcmVjZWl2ZXIuaCBiL2dkL2wyY2FwL2ludGVybmFsL3JlY2VpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTc3ZGMuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvcmVjZWl2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAibDJjYXAvY2lkLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvc2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvbDJjYXBfcGFja2V0cy5oIgotI2luY2x1ZGUgImwyY2FwL210dS5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBEYXRhUGlwZWxpbmVNYW5hZ2VyOwotCi0vKioKLSAqIEhhbmRsZSByZWNlaXZpbmcgTDJDQVAgUERVcyBmcm9tIGxpbmsgcXVldWUgYW5kIGRpc3RyaWJ1dGUgdGhlbSBpbnRvIGludG8gY2hhbm5lbCBkYXRhIGNvbnRyb2xsZXJzLgotICogRGVxdWV1ZSBpbmNvbWluZyBwYWNrZXRzIGZyb20gTGlua1F1ZXVlVXBFbmQsIGFuZCBlbnF1ZXVlIGl0IHRvIENoYW5uZWxRdWV1ZURvd25FbmQuIE5vdGU6IElmIGEgY2hhbm5lbAotICogY2Fubm90IGRlcXVldWUgZnJvbSBDaGFubmVsUXVldWVEb3duRW5kIHNvIHRoYXQgdGhlIGJ1ZmZlciBmb3IgaW5jb21pbmcgcGFja2V0IGlzIGZ1bGwsIGZ1cnRoZXIgaW5jb21pbmcgcGFja2V0cyB3aWxsCi0gKiBiZSBkcm9wcGVkLgotICogVGhlIFJlYXNzZW1ibGVyIGtlZXBzIHRoZSByZWZlcmVuY2UgdG8gQ2hhbm5lbEltcGwgb2JqZWN0cywgYmVjYXVzZSBpdCBuZWVkcyB0byBjaGVjayBjaGFubmVsIG1vZGUgYW5kIHBhcmFtZXRlcnMuCi0gKiBUaGUgUmVhc3NlbWJsZXIgYWxzbyBrZWVwcyB0aGUgcmVmZXJlbmNlIHRvIFNjaGVkdWxlciwgdG8gZ2V0IFNlZ21lbnRlciBhbmQgc2VuZCBzaWduYWxzIChUeCwgUnggc2VxKSB0byBpdC4KLSAqLwotY2xhc3MgUmVjZWl2ZXIgewotIHB1YmxpYzoKLSAgdXNpbmcgVXBwZXJFbnF1ZXVlID0gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj47Ci0gIHVzaW5nIFVwcGVyRGVxdWV1ZSA9IHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI7Ci0gIHVzaW5nIFVwcGVyUXVldWVEb3duRW5kID0gY29tbW9uOjpCaWRpUXVldWVFbmQ8VXBwZXJFbnF1ZXVlLCBVcHBlckRlcXVldWU+OwotICB1c2luZyBMb3dlckVucXVldWUgPSBVcHBlckRlcXVldWU7Ci0gIHVzaW5nIExvd2VyRGVxdWV1ZSA9IFVwcGVyRW5xdWV1ZTsKLSAgdXNpbmcgTG93ZXJRdWV1ZVVwRW5kID0gY29tbW9uOjpCaWRpUXVldWVFbmQ8TG93ZXJFbnF1ZXVlLCBMb3dlckRlcXVldWU+OwotCi0gIFJlY2VpdmVyKExvd2VyUXVldWVVcEVuZCogbGlua19xdWV1ZV91cF9lbmQsIG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBEYXRhUGlwZWxpbmVNYW5hZ2VyKiBkYXRhX3BpcGVsaW5lX21hbmFnZXIpOwotICB+UmVjZWl2ZXIoKTsKLQotIHByaXZhdGU6Ci0gIExvd2VyUXVldWVVcEVuZCogbGlua19xdWV1ZV91cF9lbmRfOwotICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gIG9zOjpBbGFybSBidWZmZXJfdGltZXJfOwotICBzdGQ6OnF1ZXVlPExvd2VyRGVxdWV1ZT4gYnVmZmVyZWRfcGFja2V0c187Ci0gIERhdGFQaXBlbGluZU1hbmFnZXIqIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl87Ci0KLSAgdm9pZCBsaW5rX3F1ZXVlX2RlcXVldWVfY2FsbGJhY2soKTsKLSAgdm9pZCBjaGVja19idWZmZXJlZF9wYWNrZXRzKCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvcmVjZWl2ZXJfdGVzdC5jYyBiL2dkL2wyY2FwL2ludGVybmFsL3JlY2VpdmVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDFkMjIuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvcmVjZWl2ZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9yZWNlaXZlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2NoYW5uZWxfaW1wbF9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvbDJjYXBfcGFja2V0cy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHt9ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCBiL2dkL2wyY2FwL2ludGVybmFsL3NjaGVkdWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFiZjhlLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL3NjaGVkdWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2R5bmFtaWNfY2hhbm5lbF9jb25maWd1cmF0aW9uX29wdGlvbi5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3NlbmRlci5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vKioKLSAqIEhhbmRsZSB0aGUgc2NoZWR1bGluZyBvZiBwYWNrZXRzIHRocm91Z2ggdGhlIGwyY2FwIHN0YWNrLgotICogRm9yIGVhY2ggYXR0YWNoZWQgY2hhbm5lbCwgZGVxdWV1ZSBpdHMgb3V0Z29pbmcgcGFja2V0cyBhbmQgZW5xdWV1ZSBpdCB0byB0aGUgZ2l2ZW4gTGlua1F1ZXVlVXBFbmQsIGFjY29yZGluZyB0byBzb21lCi0gKiBwb2xpY3kgKGNpZCkuCi0gKgotICogTm90ZTogSWYgYSBjaGFubmVsIGNhbm5vdCBkZXF1ZXVlIGZyb20gQ2hhbm5lbFF1ZXVlRG93bkVuZCBzbyB0aGF0IHRoZSBidWZmZXIgZm9yIGluY29taW5nIHBhY2tldCBpcyBmdWxsLCBmdXJ0aGVyCi0gKiBpbmNvbWluZyBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZC4KLSAqLwotY2xhc3MgU2NoZWR1bGVyIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIFVwcGVyRW5xdWV1ZSA9IHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+OwotICB1c2luZyBVcHBlckRlcXVldWUgPSBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyOwotICB1c2luZyBVcHBlclF1ZXVlRG93bkVuZCA9IGNvbW1vbjo6QmlkaVF1ZXVlRW5kPFVwcGVyRW5xdWV1ZSwgVXBwZXJEZXF1ZXVlPjsKLSAgdXNpbmcgTG93ZXJFbnF1ZXVlID0gVXBwZXJEZXF1ZXVlOwotICB1c2luZyBMb3dlckRlcXVldWUgPSBVcHBlckVucXVldWU7Ci0gIHVzaW5nIExvd2VyUXVldWVVcEVuZCA9IGNvbW1vbjo6QmlkaVF1ZXVlRW5kPExvd2VyRW5xdWV1ZSwgTG93ZXJEZXF1ZXVlPjsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZnJvbSB0aGUgc2VuZGVyIHRvIGluZGljYXRlIHRoYXQgdGhlIHNjaGVkdWxlciBjb3VsZCBkZXF1ZXVlIG51bWJlcl9wYWNrZXRzIGZyb20gaXQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPblBhY2tldHNSZWFkeShDaWQgY2lkLCBpbnQgbnVtYmVyX3BhY2tldHMpIHt9Ci0KLSAgLyoqCi0gICAqIExldCB0aGUgc2NoZWR1bGVyIHNlbmQgdGhlIHNwZWNpZmllZCBjaWQgZmlyc3QuCi0gICAqIFVzZWQgYnkgQTJkcCBzb2Z0d2FyZSBlbmNvZGluZy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRDaGFubmVsVHhQcmlvcml0eShDaWQgY2lkLCBib29sIGhpZ2hfcHJpb3JpdHkpIHt9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBieSBkYXRhIGNvbnRyb2xsZXIgdG8gaW5kaWNhdGUgdGhhdCBhIGNoYW5uZWwgaXMgY2xvc2VkIGFuZCBwYWNrZXRzIHNob3VsZCBiZSBkcm9wcGVkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQ2hhbm5lbChDaWQgY2lkKSB7fQotCi0gIHZpcnR1YWwgflNjaGVkdWxlcigpID0gZGVmYXVsdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5jYyBiL2dkL2wyY2FwL2ludGVybmFsL3NjaGVkdWxlcl9maWZvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVlZjdhLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL3NjaGVkdWxlcl9maWZvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oIgotCi0jaW5jbHVkZSAiZHluYW1pY19jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9kYXRhX3BpcGVsaW5lX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLUZpZm86OkZpZm8oRGF0YVBpcGVsaW5lTWFuYWdlciogZGF0YV9waXBlbGluZV9tYW5hZ2VyLCBMb3dlclF1ZXVlVXBFbmQqIGxpbmtfcXVldWVfdXBfZW5kLCBvczo6SGFuZGxlciogaGFuZGxlcikKLSAgICA6IGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8oZGF0YV9waXBlbGluZV9tYW5hZ2VyKSwgbGlua19xdWV1ZV91cF9lbmRfKGxpbmtfcXVldWVfdXBfZW5kKSwgaGFuZGxlcl8oaGFuZGxlcikgewotICBBU1NFUlQobGlua19xdWV1ZV91cF9lbmRfICE9IG51bGxwdHIgJiYgaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci19Ci0KLS8vIEludm9rZWQgZnJvbSBzb21lIGV4dGVybmFsIEhhbmRsZXIgY29udGV4dAotRmlmbzo6fkZpZm8oKSB7Ci0gIC8vIFRPRE8oaHN6KTogbm90aWZ5IFNlbmRlciBkb24ndCBzZW5kIGNhbGxiYWNrIHRvIG1lCi0gIGlmIChsaW5rX3F1ZXVlX2VucXVldWVfcmVnaXN0ZXJlZF8uZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgbGlua19xdWV1ZV91cF9lbmRfLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICB9Ci19Ci0KLS8vIEludm9rZWQgd2l0aGluIEwyQ0FQIEhhbmRsZXIgY29udGV4dAotdm9pZCBGaWZvOjpPblBhY2tldHNSZWFkeShDaWQgY2lkLCBpbnQgbnVtYmVyX3BhY2tldHMpIHsKLSAgaWYgKG51bWJlcl9wYWNrZXRzID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50IHByaW9yaXR5ID0gaGlnaF9wcmlvcml0eV9jaWRzXy5jb3VudChjaWQpICE9IDA7Ci0gIG5leHRfdG9fZGVxdWV1ZV9hbmRfbnVtX3BhY2tldHMucHVzaChzdGQ6Om1ha2VfcGFpcihjaWQsIG51bWJlcl9wYWNrZXRzKSwgcHJpb3JpdHkpOwotICB0cnlfcmVnaXN0ZXJfbGlua19xdWV1ZV9lbnF1ZXVlKCk7Ci19Ci0KLS8vIEludm9rZWQgd2l0aGluIEwyQ0FQIEhhbmRsZXIgY29udGV4dAotdm9pZCBGaWZvOjpTZXRDaGFubmVsVHhQcmlvcml0eShDaWQgY2lkLCBib29sIGhpZ2hfcHJpb3JpdHkpIHsKLSAgaWYgKGhpZ2hfcHJpb3JpdHkpIHsKLSAgICBoaWdoX3ByaW9yaXR5X2NpZHNfLmVtcGxhY2UoY2lkKTsKLSAgfSBlbHNlIHsKLSAgICBoaWdoX3ByaW9yaXR5X2NpZHNfLmVyYXNlKGNpZCk7Ci0gIH0KLX0KLQotdm9pZCBGaWZvOjpSZW1vdmVDaGFubmVsKENpZCBjaWQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXh0X3RvX2RlcXVldWVfYW5kX251bV9wYWNrZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byYgY2hhbm5lbF9pZF9hbmRfbnVtYmVyX3BhY2tldHMgPSBuZXh0X3RvX2RlcXVldWVfYW5kX251bV9wYWNrZXRzLmZyb250KCk7Ci0gICAgaWYgKGNoYW5uZWxfaWRfYW5kX251bWJlcl9wYWNrZXRzLnNlY29uZCAhPSBjaWQpIHsKLSAgICAgIG5leHRfdG9fZGVxdWV1ZV9hbmRfbnVtX3BhY2tldHMucHVzaChjaGFubmVsX2lkX2FuZF9udW1iZXJfcGFja2V0cyk7Ci0gICAgfQotICAgIG5leHRfdG9fZGVxdWV1ZV9hbmRfbnVtX3BhY2tldHMucG9wKCk7Ci0gIH0KLSAgaWYgKG5leHRfdG9fZGVxdWV1ZV9hbmRfbnVtX3BhY2tldHMuZW1wdHkoKSAmJiBsaW5rX3F1ZXVlX2VucXVldWVfcmVnaXN0ZXJlZF8uZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgbGlua19xdWV1ZV91cF9lbmRfLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICB9Ci19Ci0KLS8vIEludm9rZWQgZnJvbSBzb21lIGV4dGVybmFsIFF1ZXVlIFJlYWN0YWJsZSBjb250ZXh0Ci1zdGQ6OnVuaXF1ZV9wdHI8Rmlmbzo6VXBwZXJEZXF1ZXVlPiBGaWZvOjpsaW5rX3F1ZXVlX2VucXVldWVfY2FsbGJhY2soKSB7Ci0gIEFTU0VSVCghbmV4dF90b19kZXF1ZXVlX2FuZF9udW1fcGFja2V0cy5lbXB0eSgpKTsKLSAgYXV0byYgY2hhbm5lbF9pZF9hbmRfbnVtYmVyX3BhY2tldHMgPSBuZXh0X3RvX2RlcXVldWVfYW5kX251bV9wYWNrZXRzLmZyb250KCk7Ci0gIGF1dG8gY2hhbm5lbF9pZCA9IGNoYW5uZWxfaWRfYW5kX251bWJlcl9wYWNrZXRzLmZpcnN0OwotICBjaGFubmVsX2lkX2FuZF9udW1iZXJfcGFja2V0cy5zZWNvbmQtLTsKLSAgaWYgKGNoYW5uZWxfaWRfYW5kX251bWJlcl9wYWNrZXRzLnNlY29uZCA9PSAwKSB7Ci0gICAgbmV4dF90b19kZXF1ZXVlX2FuZF9udW1fcGFja2V0cy5wb3AoKTsKLSAgfQotICBhdXRvIHBhY2tldCA9IGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8tPkdldERhdGFDb250cm9sbGVyKGNoYW5uZWxfaWQpLT5HZXROZXh0UGFja2V0KCk7Ci0KLSAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy0+T25QYWNrZXRTZW50KGNoYW5uZWxfaWQpOwotICBpZiAobmV4dF90b19kZXF1ZXVlX2FuZF9udW1fcGFja2V0cy5lbXB0eSgpICYmIGxpbmtfcXVldWVfZW5xdWV1ZV9yZWdpc3RlcmVkXy5leGNoYW5nZShmYWxzZSkpIHsKLSAgICBsaW5rX3F1ZXVlX3VwX2VuZF8tPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gIH0KLSAgcmV0dXJuIHBhY2tldDsKLX0KLQotdm9pZCBGaWZvOjp0cnlfcmVnaXN0ZXJfbGlua19xdWV1ZV9lbnF1ZXVlKCkgewotICBpZiAobGlua19xdWV1ZV9lbnF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKHRydWUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGxpbmtfcXVldWVfdXBfZW5kXy0+UmVnaXN0ZXJFbnF1ZXVlKGhhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OkJpbmQoJkZpZm86OmxpbmtfcXVldWVfZW5xdWV1ZV9jYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oIGIvZ2QvbDJjYXAvaW50ZXJuYWwvc2NoZWR1bGVyX2ZpZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhMjkyYy4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjb21tb24vbXVsdGlfcHJpb3JpdHlfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zZW5kZXIuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIERhdGFQaXBlbGluZU1hbmFnZXI7Ci0KLWNsYXNzIEZpZm8gOiBwdWJsaWMgU2NoZWR1bGVyIHsKLSBwdWJsaWM6Ci0gIEZpZm8oRGF0YVBpcGVsaW5lTWFuYWdlciogZGF0YV9waXBlbGluZV9tYW5hZ2VyLCBMb3dlclF1ZXVlVXBFbmQqIGxpbmtfcXVldWVfdXBfZW5kLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0gIH5GaWZvKCk7Ci0gIHZvaWQgT25QYWNrZXRzUmVhZHkoQ2lkIGNpZCwgaW50IG51bWJlcl9wYWNrZXRzKSBvdmVycmlkZTsKLSAgdm9pZCBTZXRDaGFubmVsVHhQcmlvcml0eShDaWQgY2lkLCBib29sIGhpZ2hfcHJpb3JpdHkpIG92ZXJyaWRlOwotICB2b2lkIFJlbW92ZUNoYW5uZWwoQ2lkIGNpZCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBEYXRhUGlwZWxpbmVNYW5hZ2VyKiBkYXRhX3BpcGVsaW5lX21hbmFnZXJfOwotICBMb3dlclF1ZXVlVXBFbmQqIGxpbmtfcXVldWVfdXBfZW5kXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICB1c2luZyBDaGFubmVsQW5kTnVtUGFja2V0cyA9IHN0ZDo6cGFpcjxDaWQsIGludD47Ci0gIGNvbW1vbjo6TXVsdGlQcmlvcml0eVF1ZXVlPENoYW5uZWxBbmROdW1QYWNrZXRzLCAyPiBuZXh0X3RvX2RlcXVldWVfYW5kX251bV9wYWNrZXRzOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8Q2lkPiBoaWdoX3ByaW9yaXR5X2NpZHNfOwotICBzdGQ6OmF0b21pY19ib29sIGxpbmtfcXVldWVfZW5xdWV1ZV9yZWdpc3RlcmVkXyA9IGZhbHNlOwotCi0gIHZvaWQgdHJ5X3JlZ2lzdGVyX2xpbmtfcXVldWVfZW5xdWV1ZSgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8TG93ZXJFbnF1ZXVlPiBsaW5rX3F1ZXVlX2VucXVldWVfY2FsbGJhY2soKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmb190ZXN0LmNjIGIvZ2QvbDJjYXAvaW50ZXJuYWwvc2NoZWR1bGVyX2ZpZm9fdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNTc5Zi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmb190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvY2hhbm5lbF9pbXBsX21vY2suaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9kYXRhX2NvbnRyb2xsZXJfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlcl9tb2NrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL21vY2tfcXVldWUuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1zdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gQ3JlYXRlU2R1KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWQpIHsKLSAgYXV0byByYXdfYnVpbGRlciA9IHN0ZDo6bWFrZV91bmlxdWU8cGFja2V0OjpSYXdCdWlsZGVyPigpOwotICByYXdfYnVpbGRlci0+QWRkT2N0ZXRzKHBheWxvYWQpOwotICByZXR1cm4gcmF3X2J1aWxkZXI7Ci19Ci0KLVBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gR2V0UGFja2V0VmlldyhzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGFja2V0KSB7Ci0gIGF1dG8gYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpKCpieXRlcyk7Ci0gIGJ5dGVzLT5yZXNlcnZlKHBhY2tldC0+c2l6ZSgpKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaSk7Ci0gIHJldHVybiBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPihieXRlcyk7Ci19Ci0KLWNsYXNzIE15RGF0YUNvbnRyb2xsZXIgOiBwdWJsaWMgdGVzdGluZzo6TW9ja0RhdGFDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gR2V0TmV4dFBhY2tldCgpIG92ZXJyaWRlIHsKLSAgICBhdXRvIG5leHQgPSBzdGQ6Om1vdmUobmV4dF9wYWNrZXRzLmZyb250KCkpOwotICAgIG5leHRfcGFja2V0cy5wb3AoKTsKLSAgICByZXR1cm4gbmV4dDsKLSAgfQotCi0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPj4gbmV4dF9wYWNrZXRzOwotfTsKLQotY2xhc3MgTDJjYXBTY2hlZHVsZXJGaWZvVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgcXVldWVfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfID0gbmV3IHRlc3Rpbmc6Ok1vY2tEYXRhUGlwZWxpbmVNYW5hZ2VyKHF1ZXVlX2hhbmRsZXJfLCAmcXVldWVfZW5kXyk7Ci0gICAgZmlmb18gPSBuZXcgRmlmbyhtb2NrX2RhdGFfcGlwZWxpbmVfbWFuYWdlcl8sICZxdWV1ZV9lbmRfLCBxdWV1ZV9oYW5kbGVyXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBmaWZvXzsKLSAgICBkZWxldGUgbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfOwotICAgIHF1ZXVlX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBxdWV1ZV9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogcXVldWVfaGFuZGxlcl8gPSBudWxscHRyOwotICBvczo6TW9ja0lRdWV1ZURlcXVldWU8U2NoZWR1bGVyOjpMb3dlckRlcXVldWU+IGRlcXVldWVfOwotICBvczo6TW9ja0lRdWV1ZUVucXVldWU8U2NoZWR1bGVyOjpMb3dlckVucXVldWU+IGVucXVldWVfOwotICBjb21tb246OkJpZGlRdWV1ZUVuZDxTY2hlZHVsZXI6Okxvd2VyRW5xdWV1ZSwgU2NoZWR1bGVyOjpMb3dlckRlcXVldWU+IHF1ZXVlX2VuZF97JmVucXVldWVfLCAmZGVxdWV1ZV99OwotICB0ZXN0aW5nOjpNb2NrRGF0YVBpcGVsaW5lTWFuYWdlciogbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfID0gbnVsbHB0cjsKLSAgTXlEYXRhQ29udHJvbGxlciBkYXRhX2NvbnRyb2xsZXJfMV87Ci0gIE15RGF0YUNvbnRyb2xsZXIgZGF0YV9jb250cm9sbGVyXzJfOwotICBGaWZvKiBmaWZvXyA9IG51bGxwdHI7Ci19OwotCi1URVNUX0YoTDJjYXBTY2hlZHVsZXJGaWZvVGVzdCwgc2VuZF9wYWNrZXQpIHsKLSAgYXV0byBmcmFtZSA9IEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUoMSwgQ3JlYXRlU2R1KHsnYScsICdiJywgJ2MnfSkpOwotICBkYXRhX2NvbnRyb2xsZXJfMV8ubmV4dF9wYWNrZXRzLnB1c2goc3RkOjptb3ZlKGZyYW1lKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2RhdGFfcGlwZWxpbmVfbWFuYWdlcl8sIEdldERhdGFDb250cm9sbGVyKF8pKS5XaWxsT25jZShSZXR1cm4oJmRhdGFfY29udHJvbGxlcl8xXykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfLCBPblBhY2tldFNlbnQoMSkpOwotICBmaWZvXy0+T25QYWNrZXRzUmVhZHkoMSwgMSk7Ci0gIGVucXVldWVfLnJ1bl9lbnF1ZXVlKCk7Ci0gIGF1dG8mJiBwYWNrZXQgPSBlbnF1ZXVlXy5lbnF1ZXVlZC5mcm9udCgpOwotICBhdXRvIHBhY2tldF92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gYmFzaWNfZnJhbWVfdmlldyA9IEJhc2ljRnJhbWVWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICBBU1NFUlRfVFJVRShiYXNpY19mcmFtZV92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShiYXNpY19mcmFtZV92aWV3LkdldENoYW5uZWxJZCgpLCAxKTsKLSAgYXV0byBwYXlsb2FkID0gYmFzaWNfZnJhbWVfdmlldy5HZXRQYXlsb2FkKCk7Ci0gIEFTU0VSVF9FUShzdGQ6OnN0cmluZyhwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpLCAiYWJjIik7Ci0gIGVucXVldWVfLmVucXVldWVkLnBvcCgpOwotfQotCi1URVNUX0YoTDJjYXBTY2hlZHVsZXJGaWZvVGVzdCwgcHJpb3JpdGl6ZV9jaGFubmVsKSB7Ci0gIGF1dG8gZnJhbWUgPSBCYXNpY0ZyYW1lQnVpbGRlcjo6Q3JlYXRlKDEsIENyZWF0ZVNkdSh7J2EnLCAnYicsICdjJ30pKTsKLSAgZGF0YV9jb250cm9sbGVyXzFfLm5leHRfcGFja2V0cy5wdXNoKHN0ZDo6bW92ZShmcmFtZSkpOwotICBmcmFtZSA9IEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUoMiwgQ3JlYXRlU2R1KHsnZCcsICdlJywgJ2YnfSkpOwotICBkYXRhX2NvbnRyb2xsZXJfMl8ubmV4dF9wYWNrZXRzLnB1c2goc3RkOjptb3ZlKGZyYW1lKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfZGF0YV9waXBlbGluZV9tYW5hZ2VyXywgR2V0RGF0YUNvbnRyb2xsZXIoMSkpLldpbGxSZXBlYXRlZGx5KFJldHVybigmZGF0YV9jb250cm9sbGVyXzFfKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2RhdGFfcGlwZWxpbmVfbWFuYWdlcl8sIEdldERhdGFDb250cm9sbGVyKDIpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oJmRhdGFfY29udHJvbGxlcl8yXykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfLCBPblBhY2tldFNlbnQoMSkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfLCBPblBhY2tldFNlbnQoMikpOwotICBmaWZvXy0+U2V0Q2hhbm5lbFR4UHJpb3JpdHkoMSwgdHJ1ZSk7Ci0gIGZpZm9fLT5PblBhY2tldHNSZWFkeSgyLCAxKTsKLSAgZmlmb18tPk9uUGFja2V0c1JlYWR5KDEsIDEpOwotICBlbnF1ZXVlXy5ydW5fZW5xdWV1ZSgyKTsKLSAgYXV0byBwYWNrZXQxID0gc3RkOjptb3ZlKGVucXVldWVfLmVucXVldWVkLmZyb250KCkpOwotICBhdXRvIHBhY2tldF92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUocGFja2V0MSkpOwotICBhdXRvIGJhc2ljX2ZyYW1lX3ZpZXcgPSBCYXNpY0ZyYW1lVmlldzo6Q3JlYXRlKHBhY2tldF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoYmFzaWNfZnJhbWVfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoYmFzaWNfZnJhbWVfdmlldy5HZXRDaGFubmVsSWQoKSwgMSk7Ci0gIGF1dG8gcGF5bG9hZCA9IGJhc2ljX2ZyYW1lX3ZpZXcuR2V0UGF5bG9hZCgpOwotICBBU1NFUlRfRVEoc3RkOjpzdHJpbmcocGF5bG9hZC5iZWdpbigpLCBwYXlsb2FkLmVuZCgpKSwgImFiYyIpOwotICBlbnF1ZXVlXy5lbnF1ZXVlZC5wb3AoKTsKLQotICBhdXRvIHBhY2tldDIgPSBzdGQ6Om1vdmUoZW5xdWV1ZV8uZW5xdWV1ZWQuZnJvbnQoKSk7Ci0gIHBhY2tldF92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUocGFja2V0MikpOwotICBiYXNpY19mcmFtZV92aWV3ID0gQmFzaWNGcmFtZVZpZXc6OkNyZWF0ZShwYWNrZXRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGJhc2ljX2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGJhc2ljX2ZyYW1lX3ZpZXcuR2V0Q2hhbm5lbElkKCksIDIpOwotICBwYXlsb2FkID0gYmFzaWNfZnJhbWVfdmlldy5HZXRQYXlsb2FkKCk7Ci0gIEFTU0VSVF9FUShzdGQ6OnN0cmluZyhwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpLCAiZGVmIik7Ci0gIGVucXVldWVfLmVucXVldWVkLnBvcCgpOwotfQotCi1URVNUX0YoTDJjYXBTY2hlZHVsZXJGaWZvVGVzdCwgcmVtb3ZlX2NoYW5uZWwpIHsKLSAgYXV0byBmcmFtZSA9IEJhc2ljRnJhbWVCdWlsZGVyOjpDcmVhdGUoMSwgQ3JlYXRlU2R1KHsnYScsICdiJywgJ2MnfSkpOwotICBkYXRhX2NvbnRyb2xsZXJfMV8ubmV4dF9wYWNrZXRzLnB1c2goc3RkOjptb3ZlKGZyYW1lKSk7Ci0gIGZyYW1lID0gQmFzaWNGcmFtZUJ1aWxkZXI6OkNyZWF0ZSgyLCBDcmVhdGVTZHUoeydkJywgJ2UnLCAnZid9KSk7Ci0gIGRhdGFfY29udHJvbGxlcl8yXy5uZXh0X3BhY2tldHMucHVzaChzdGQ6Om1vdmUoZnJhbWUpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19kYXRhX3BpcGVsaW5lX21hbmFnZXJfLCBHZXREYXRhQ29udHJvbGxlcigxKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKCZkYXRhX2NvbnRyb2xsZXJfMV8pKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfZGF0YV9waXBlbGluZV9tYW5hZ2VyXywgR2V0RGF0YUNvbnRyb2xsZXIoMikpLldpbGxSZXBlYXRlZGx5KFJldHVybigmZGF0YV9jb250cm9sbGVyXzJfKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2RhdGFfcGlwZWxpbmVfbWFuYWdlcl8sIE9uUGFja2V0U2VudCgyKSk7Ci0gIGZpZm9fLT5PblBhY2tldHNSZWFkeSgxLCAxKTsKLSAgZmlmb18tPk9uUGFja2V0c1JlYWR5KDIsIDEpOwotICBmaWZvXy0+UmVtb3ZlQ2hhbm5lbCgxKTsKLSAgZW5xdWV1ZV8ucnVuX2VucXVldWUoMSk7Ci0gIGF1dG8gcGFja2V0MSA9IHN0ZDo6bW92ZShlbnF1ZXVlXy5lbnF1ZXVlZC5mcm9udCgpKTsKLSAgYXV0byBwYWNrZXRfdmlldyA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKHBhY2tldDEpKTsKLSAgYXV0byBiYXNpY19mcmFtZV92aWV3ID0gQmFzaWNGcmFtZVZpZXc6OkNyZWF0ZShwYWNrZXRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGJhc2ljX2ZyYW1lX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGJhc2ljX2ZyYW1lX3ZpZXcuR2V0Q2hhbm5lbElkKCksIDIpOwotICBhdXRvIHBheWxvYWQgPSBiYXNpY19mcmFtZV92aWV3LkdldFBheWxvYWQoKTsKLSAgQVNTRVJUX0VRKHN0ZDo6c3RyaW5nKHBheWxvYWQuYmVnaW4oKSwgcGF5bG9hZC5lbmQoKSksICJkZWYiKTsKLSAgZW5xdWV1ZV8uZW5xdWV1ZWQucG9wKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL3NjaGVkdWxlcl9tb2NrLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFjNGQ3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2ludGVybmFsL3NjaGVkdWxlcl9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXIuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrU2NoZWR1bGVyIDogcHVibGljIFNjaGVkdWxlciB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRCh2b2lkLCBPblBhY2tldHNSZWFkeSwgKENpZCBjaWQsIGludCBudW1iZXJfcGFja2V0KSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL3NlbmRlci5jYyBiL2dkL2wyY2FwL2ludGVybmFsL3NlbmRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllZjcxNi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9pbnRlcm5hbC9zZW5kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2Jhc2ljX21vZGVfY2hhbm5lbF9kYXRhX2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9lbmhhbmNlZF9yZXRyYW5zbWlzc2lvbl9tb2RlX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvbGVfY3JlZGl0X2Jhc2VkX2NoYW5uZWxfZGF0YV9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvc2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvc2VuZGVyLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1TZW5kZXI6OlNlbmRlcihvczo6SGFuZGxlciogaGFuZGxlciwgSUxpbmsqIGxpbmssIFNjaGVkdWxlciogc2NoZWR1bGVyLCBzdGQ6OnNoYXJlZF9wdHI8Q2hhbm5lbEltcGw+IGNoYW5uZWwpCi0gICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgbGlua18obGluayksIHF1ZXVlX2VuZF8oY2hhbm5lbC0+R2V0UXVldWVEb3duRW5kKCkpLCBzY2hlZHVsZXJfKHNjaGVkdWxlciksCi0gICAgICBjaGFubmVsX2lkXyhjaGFubmVsLT5HZXRDaWQoKSksIHJlbW90ZV9jaGFubmVsX2lkXyhjaGFubmVsLT5HZXRSZW1vdGVDaWQoKSksCi0gICAgICBkYXRhX2NvbnRyb2xsZXJfKHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNNb2RlRGF0YUNvbnRyb2xsZXI+KGNoYW5uZWxfaWRfLCByZW1vdGVfY2hhbm5lbF9pZF8sIHF1ZXVlX2VuZF8sIGhhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXJfKSkgewotICB0cnlfcmVnaXN0ZXJfZGVxdWV1ZSgpOwotfQotCi1TZW5kZXI6OlNlbmRlcihvczo6SGFuZGxlciogaGFuZGxlciwgSUxpbmsqIGxpbmssIFNjaGVkdWxlciogc2NoZWR1bGVyLCBzdGQ6OnNoYXJlZF9wdHI8Q2hhbm5lbEltcGw+IGNoYW5uZWwsCi0gICAgICAgICAgICAgICBDaGFubmVsTW9kZSBtb2RlKQotICAgIDogaGFuZGxlcl8oaGFuZGxlciksIGxpbmtfKGxpbmspLCBxdWV1ZV9lbmRfKGNoYW5uZWwtPkdldFF1ZXVlRG93bkVuZCgpKSwgc2NoZWR1bGVyXyhzY2hlZHVsZXIpLAotICAgICAgY2hhbm5lbF9pZF8oY2hhbm5lbC0+R2V0Q2lkKCkpLCByZW1vdGVfY2hhbm5lbF9pZF8oY2hhbm5lbC0+R2V0UmVtb3RlQ2lkKCkpIHsKLSAgaWYgKG1vZGUgPT0gQ2hhbm5lbE1vZGU6OkJBU0lDKSB7Ci0gICAgZGF0YV9jb250cm9sbGVyXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNNb2RlRGF0YUNvbnRyb2xsZXI+KGNoYW5uZWxfaWRfLCByZW1vdGVfY2hhbm5lbF9pZF8sIHF1ZXVlX2VuZF8sIGhhbmRsZXJfLCBzY2hlZHVsZXJfKTsKLSAgfSBlbHNlIGlmIChtb2RlID09IENoYW5uZWxNb2RlOjpFUlRNKSB7Ci0gICAgZGF0YV9jb250cm9sbGVyXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RXJ0bUNvbnRyb2xsZXI+KGxpbmtfLCBjaGFubmVsX2lkXywgcmVtb3RlX2NoYW5uZWxfaWRfLCBxdWV1ZV9lbmRfLCBoYW5kbGVyXywgc2NoZWR1bGVyXyk7Ci0gIH0gZWxzZSBpZiAobW9kZSA9PSBDaGFubmVsTW9kZTo6TEVfQ1JFRElUX0JBU0VEKSB7Ci0gICAgZGF0YV9jb250cm9sbGVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8TGVDcmVkaXRCYXNlZERhdGFDb250cm9sbGVyPihsaW5rXywgY2hhbm5lbF9pZF8sIHJlbW90ZV9jaGFubmVsX2lkXywgcXVldWVfZW5kXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfLCBzY2hlZHVsZXJfKTsKLSAgfQotICB0cnlfcmVnaXN0ZXJfZGVxdWV1ZSgpOwotfQotCi1TZW5kZXI6On5TZW5kZXIoKSB7Ci0gIGlmIChpc19kZXF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKGZhbHNlKSkgewotICAgIHF1ZXVlX2VuZF8tPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gIH0KLX0KLQotdm9pZCBTZW5kZXI6Ok9uUGFja2V0U2VudCgpIHsKLSAgbGlua18tPk9uUGVuZGluZ1BhY2tldENoYW5nZShjaGFubmVsX2lkXywgZmFsc2UpOwotICB0cnlfcmVnaXN0ZXJfZGVxdWV1ZSgpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8U2VuZGVyOjpVcHBlckRlcXVldWU+IFNlbmRlcjo6R2V0TmV4dFBhY2tldCgpIHsKLSAgcmV0dXJuIGRhdGFfY29udHJvbGxlcl8tPkdldE5leHRQYWNrZXQoKTsKLX0KLQotRGF0YUNvbnRyb2xsZXIqIFNlbmRlcjo6R2V0RGF0YUNvbnRyb2xsZXIoKSB7Ci0gIHJldHVybiBkYXRhX2NvbnRyb2xsZXJfLmdldCgpOwotfQotCi12b2lkIFNlbmRlcjo6dHJ5X3JlZ2lzdGVyX2RlcXVldWUoKSB7Ci0gIGlmIChpc19kZXF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKHRydWUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHF1ZXVlX2VuZF8tPlJlZ2lzdGVyRGVxdWV1ZShoYW5kbGVyXywgY29tbW9uOjpCaW5kKCZTZW5kZXI6OmRlcXVldWVfY2FsbGJhY2ssIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotfQotCi0vLyBGcm9tIGV4dGVybmFsIGNvbnRleHQKLXZvaWQgU2VuZGVyOjpkZXF1ZXVlX2NhbGxiYWNrKCkgewotICBhdXRvIHBhY2tldCA9IHF1ZXVlX2VuZF8tPlRyeURlcXVldWUoKTsKLSAgQVNTRVJUKHBhY2tldCAhPSBudWxscHRyKTsKLSAgaGFuZGxlcl8tPlBvc3QoCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZEYXRhQ29udHJvbGxlcjo6T25TZHUsIGNvbW1vbjo6VW5yZXRhaW5lZChkYXRhX2NvbnRyb2xsZXJfLmdldCgpKSwgc3RkOjptb3ZlKHBhY2tldCkpKTsKLSAgaWYgKGlzX2RlcXVldWVfcmVnaXN0ZXJlZF8uZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgcXVldWVfZW5kXy0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgfQotICBsaW5rXy0+T25QZW5kaW5nUGFja2V0Q2hhbmdlKGNoYW5uZWxfaWRfLCB0cnVlKTsKLX0KLQotdm9pZCBTZW5kZXI6OlVwZGF0ZUNsYXNzaWNDb25maWd1cmF0aW9uKGNsYXNzaWM6OmludGVybmFsOjpDaGFubmVsQ29uZmlndXJhdGlvblN0YXRlIGNvbmZpZykgewotICBhdXRvIG1vZGUgPSBjb25maWcucmV0cmFuc21pc3Npb25fYW5kX2Zsb3dfY29udHJvbF9tb2RlXzsKLSAgaWYgKG1vZGUgPT0gbW9kZV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1vZGUgPT0gUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGVPcHRpb246OkwyQ0FQX0JBU0lDKSB7Ci0gICAgZGF0YV9jb250cm9sbGVyXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QmFzaWNNb2RlRGF0YUNvbnRyb2xsZXI+KGNoYW5uZWxfaWRfLCByZW1vdGVfY2hhbm5lbF9pZF8sIHF1ZXVlX2VuZF8sIGhhbmRsZXJfLCBzY2hlZHVsZXJfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1vZGUgPT0gUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGVPcHRpb246OkVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OKSB7Ci0gICAgZGF0YV9jb250cm9sbGVyXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RXJ0bUNvbnRyb2xsZXI+KGxpbmtfLCBjaGFubmVsX2lkXywgcmVtb3RlX2NoYW5uZWxfaWRfLCBxdWV1ZV9lbmRfLCBoYW5kbGVyXywgc2NoZWR1bGVyXyk7Ci0gICAgUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbENvbmZpZ3VyYXRpb25PcHRpb24gb3B0aW9uID0gY29uZmlnLmxvY2FsX3JldHJhbnNtaXNzaW9uX2FuZF9mbG93X2NvbnRyb2xfOwotICAgIG9wdGlvbi50eF93aW5kb3dfc2l6ZV8gPSBjb25maWcucmVtb3RlX3JldHJhbnNtaXNzaW9uX2FuZF9mbG93X2NvbnRyb2xfLnR4X3dpbmRvd19zaXplXzsKLSAgICBkYXRhX2NvbnRyb2xsZXJfLT5TZXRSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sT3B0aW9ucyhvcHRpb24pOwotICAgIGRhdGFfY29udHJvbGxlcl8tPkVuYWJsZUZjcyhjb25maWcuZmNzX3R5cGVfID09IEZjc1R5cGU6OkRFRkFVTFQpOwotICAgIHJldHVybjsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvaW50ZXJuYWwvc2VuZGVyLmggYi9nZC9sMmNhcC9pbnRlcm5hbC9zZW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1NDFhOTYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvc2VuZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJkYXRhX2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL2ludGVybmFsL2NoYW5uZWxfY29uZmlndXJhdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9tdHUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgU2NoZWR1bGVyOwotY2xhc3MgSUxpbms7Ci0KLS8qKgotICogQSBtaWRkbGUgbGF5ZXIgYmV0d2VlbiBMMkNBUCBjaGFubmVsIGFuZCBvdXRnb2luZyBwYWNrZXQgc2NoZWR1bGVyLgotICogRmV0Y2hlcyBkYXRhIChTRFUpIGZyb20gYW4gTDJDQVAgY2hhbm5lbCBxdWV1ZSBlbmQsIGhhbmRsZXMgTDJDQVAgc2VnbWVudGF0aW9uLCBhbmQgZ2l2ZXMgZGF0YSB0byBMMkNBUCBzY2hlZHVsZXIuCi0gKi8KLWNsYXNzIFNlbmRlciB7Ci0gcHVibGljOgotICB1c2luZyBVcHBlckVucXVldWUgPSBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPjsKLSAgdXNpbmcgVXBwZXJEZXF1ZXVlID0gcGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcjsKLSAgdXNpbmcgVXBwZXJRdWV1ZURvd25FbmQgPSBjb21tb246OkJpZGlRdWV1ZUVuZDxVcHBlckVucXVldWUsIFVwcGVyRGVxdWV1ZT47Ci0KLSAgZW51bSBjbGFzcyBDaGFubmVsTW9kZSB7Ci0gICAgQkFTSUMgPSAwLAotICAgIEVSVE0gPSAzLAotICAgIExFX0NSRURJVF9CQVNFRCA9IDEwLAotICB9OwotCi0gIFNlbmRlcihvczo6SGFuZGxlciogaGFuZGxlciwgSUxpbmsqIGxpbmssIFNjaGVkdWxlciogc2NoZWR1bGVyLCBzdGQ6OnNoYXJlZF9wdHI8Q2hhbm5lbEltcGw+IGNoYW5uZWwpOwotICBTZW5kZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIElMaW5rKiBsaW5rLCBTY2hlZHVsZXIqIHNjaGVkdWxlciwgc3RkOjpzaGFyZWRfcHRyPENoYW5uZWxJbXBsPiBjaGFubmVsLAotICAgICAgICAgQ2hhbm5lbE1vZGUgbW9kZSk7Ci0gIH5TZW5kZXIoKTsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZnJvbSBzY2hlZHVsZXIgdG8gaW5kaWNhdGUgdGhhdCBzY2hlZHVsZXIgYWxyZWFkeSBkZXF1ZXVlZCBhIHBhY2tldCBmcm9tIHNlbmRlcidzIHF1ZXVlLgotICAgKiBTZWdtZW50ZXIgY2FuIGNvbnRpbnVlIGRlcXVldWluZyBmcm9tIGNoYW5uZWwgcXVldWUgZW5kLgotICAgKi8KLSAgdm9pZCBPblBhY2tldFNlbnQoKTsKLQotICAvKioKLSAgICogQ2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIgdG8gcmV0dXJuIHRoZSBuZXh0IFBEVSB0byBiZSBzZW50Ci0gICAqLwotICBzdGQ6OnVuaXF1ZV9wdHI8VXBwZXJEZXF1ZXVlPiBHZXROZXh0UGFja2V0KCk7Ci0KLSAgdm9pZCBVcGRhdGVDbGFzc2ljQ29uZmlndXJhdGlvbihjbGFzc2ljOjppbnRlcm5hbDo6Q2hhbm5lbENvbmZpZ3VyYXRpb25TdGF0ZSBjb25maWcpOwotICBEYXRhQ29udHJvbGxlciogR2V0RGF0YUNvbnRyb2xsZXIoKTsKLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgSUxpbmsqIGxpbmtfOwotICBVcHBlclF1ZXVlRG93bkVuZCogcXVldWVfZW5kXzsKLSAgU2NoZWR1bGVyKiBzY2hlZHVsZXJfOwotICBjb25zdCBDaWQgY2hhbm5lbF9pZF87Ci0gIGNvbnN0IENpZCByZW1vdGVfY2hhbm5lbF9pZF87Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgaXNfZGVxdWV1ZV9yZWdpc3RlcmVkXyA9IGZhbHNlOwotICBSZXRyYW5zbWlzc2lvbkFuZEZsb3dDb250cm9sTW9kZU9wdGlvbiBtb2RlXyA9IFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlT3B0aW9uOjpMMkNBUF9CQVNJQzsKLSAgc3RkOjp1bmlxdWVfcHRyPERhdGFDb250cm9sbGVyPiBkYXRhX2NvbnRyb2xsZXJfOwotCi0gIHZvaWQgdHJ5X3JlZ2lzdGVyX2RlcXVldWUoKTsKLSAgdm9pZCBkZXF1ZXVlX2NhbGxiYWNrKCk7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2ludGVybmFsL3NlbmRlcl90ZXN0LmNjIGIvZ2QvbDJjYXAvaW50ZXJuYWwvc2VuZGVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTliMzEuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvaW50ZXJuYWwvc2VuZGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3NlbmRlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2NoYW5uZWxfaW1wbF9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvaWxpbmtfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3NjaGVkdWxlci5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLXN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBDcmVhdGVTZHUoc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCkgewotICBhdXRvIHJhd19idWlsZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxwYWNrZXQ6OlJhd0J1aWxkZXI+KCk7Ci0gIHJhd19idWlsZGVyLT5BZGRPY3RldHMocGF5bG9hZCk7Ci0gIHJldHVybiByYXdfYnVpbGRlcjsKLX0KLQotUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBHZXRQYWNrZXRWaWV3KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGkoKmJ5dGVzKTsKLSAgYnl0ZXMtPnJlc2VydmUocGFja2V0LT5zaXplKCkpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpKTsKLSAgcmV0dXJuIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KGJ5dGVzKTsKLX0KLQotY2xhc3MgRmFrZVNjaGVkdWxlciA6IHB1YmxpYyBTY2hlZHVsZXIgewotIHB1YmxpYzoKLSAgdm9pZCBPblBhY2tldHNSZWFkeShDaWQgY2lkLCBpbnQgbnVtYmVyX3BhY2tldHMpIG92ZXJyaWRlIHsKLSAgICBvbl9wYWNrZXRzX3JlYWR5XyhjaWQsIG51bWJlcl9wYWNrZXRzKTsKLSAgfQotCi0gIHZvaWQgU2V0T25QYWNrZXRzUmVhZHkoc3RkOjpmdW5jdGlvbjx2b2lkKENpZCBjaWQsIGludCBudW1iZXJfcGFja2V0cyk+IGNhbGxiYWNrKSB7Ci0gICAgb25fcGFja2V0c19yZWFkeV8gPSBjYWxsYmFjazsKLSAgfQotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQ2lkIGNpZCwgaW50IG51bWJlcl9wYWNrZXRzKT4gb25fcGFja2V0c19yZWFkeV87Ci19OwotCi1jbGFzcyBMMmNhcFNlbmRlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTZW5kZXI6OlVwcGVyRGVxdWV1ZT4gZW5xdWV1ZV9jYWxsYmFjaygpIHsKLSAgICBhdXRvIHBhY2tldF9vbmUgPSBDcmVhdGVTZHUoeydhJywgJ2InLCAnYyd9KTsKLSAgICBjaGFubmVsX3F1ZXVlXy5HZXRVcEVuZCgpLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICAgIHJldHVybiBwYWNrZXRfb25lOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIHVzZXJfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgcXVldWVfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbW9ja19jaGFubmVsXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8dGVzdGluZzo6TW9ja0NoYW5uZWxJbXBsPigpOwotICAgIEVYUEVDVF9DQUxMKCptb2NrX2NoYW5uZWxfLCBHZXRRdWV1ZURvd25FbmQoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGNoYW5uZWxfcXVldWVfLkdldERvd25FbmQoKSkpOwotICAgIEVYUEVDVF9DQUxMKCptb2NrX2NoYW5uZWxfLCBHZXRDaWQoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGNpZF8pKTsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19jaGFubmVsXywgR2V0UmVtb3RlQ2lkKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihjaWRfKSk7Ci0gICAgc2VuZGVyXyA9IG5ldyBTZW5kZXIocXVldWVfaGFuZGxlcl8sICZsaW5rXywgJnNjaGVkdWxlcl8sIG1vY2tfY2hhbm5lbF8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBxdWV1ZV9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICB1c2VyX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBzZW5kZXJfOwotICAgIGRlbGV0ZSBxdWV1ZV9oYW5kbGVyXzsKLSAgICBkZWxldGUgdXNlcl9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBxdWV1ZV9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPFNlbmRlcjo6VXBwZXJFbnF1ZXVlLCBTZW5kZXI6OlVwcGVyRGVxdWV1ZT4gY2hhbm5lbF9xdWV1ZV97MTB9OwotICBzdGQ6OnNoYXJlZF9wdHI8dGVzdGluZzo6TW9ja0NoYW5uZWxJbXBsPiBtb2NrX2NoYW5uZWxfOwotICBTZW5kZXIqIHNlbmRlcl8gPSBudWxscHRyOwotICBDaWQgY2lkXyA9IDB4NDE7Ci0gIEZha2VTY2hlZHVsZXIgc2NoZWR1bGVyXzsKLSAgdGVzdGluZzo6TW9ja0lMaW5rIGxpbmtfOwotfTsKLQotVEVTVF9GKEwyY2FwU2VuZGVyVGVzdCwgc2VuZF9wYWNrZXQpIHsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIHNjaGVkdWxlcl8uU2V0T25QYWNrZXRzUmVhZHkoWyZwcm9taXNlXShDaWQgY2lkLCBpbnQgbnVtYmVyX3BhY2tldHMpIHsgcHJvbWlzZS5zZXRfdmFsdWUoKTsgfSk7Ci0gIGNoYW5uZWxfcXVldWVfLkdldFVwRW5kKCktPlJlZ2lzdGVyRW5xdWV1ZSgKLSAgICAgIHF1ZXVlX2hhbmRsZXJfLCBjb21tb246OkJpbmQoJkwyY2FwU2VuZGVyVGVzdDo6ZW5xdWV1ZV9jYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIGF1dG8gc3RhdHVzID0gZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMykpOwotICBFWFBFQ1RfRVEoc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgYXV0byBwYWNrZXQgPSBzZW5kZXJfLT5HZXROZXh0UGFja2V0KCk7Ci0gIEVYUEVDVF9ORShwYWNrZXQsIG51bGxwdHIpOwotICBhdXRvIHBhY2tldF92aWV3ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gYmFzaWNfZnJhbWVfdmlldyA9IEJhc2ljRnJhbWVWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICBFWFBFQ1RfVFJVRShiYXNpY19mcmFtZV92aWV3LklzVmFsaWQoKSk7Ci0gIEVYUEVDVF9FUShiYXNpY19mcmFtZV92aWV3LkdldENoYW5uZWxJZCgpLCBjaWRfKTsKLSAgYXV0byBwYXlsb2FkID0gYmFzaWNfZnJhbWVfdmlldy5HZXRQYXlsb2FkKCk7Ci0gIHN0ZDo6c3RyaW5nIHBheWxvYWRfc3RyaW5nKHBheWxvYWQuYmVnaW4oKSwgcGF5bG9hZC5lbmQoKSk7Ci0gIEVYUEVDVF9FUShwYXlsb2FkX3N0cmluZywgImFiYyIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sMmNhcF9wYWNrZXRfZnV6el90ZXN0LmNjIGIvZ2QvbDJjYXAvbDJjYXBfcGFja2V0X2Z1enpfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiZDk2NS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sMmNhcF9wYWNrZXRfZnV6el90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBQQUNLRVRfRlVaWl9URVNUSU5HCi0jaW5jbHVkZSAibDJjYXAvbDJjYXBfcGFja2V0cy5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L2JpdF9pbnNlcnRlci5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi11c2luZyBibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXI7Ci11c2luZyBibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcjsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci0KLXN0ZDo6dmVjdG9yPHZvaWQgKCopKGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpPiBsMmNhcF9wYWNrZXRfZnV6el90ZXN0czsKLQotREVGSU5FX0FORF9SRUdJU1RFUl9FeHRlbmRlZEluZm9ybWF0aW9uU3RhcnRGcmFtZVJlZmxlY3Rpb25GdXp6VGVzdChsMmNhcF9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfU3RhbmRhcmRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjc1JlZmxlY3Rpb25GdXp6VGVzdChsMmNhcF9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfU3RhbmRhcmRTdXBlcnZpc29yeUZyYW1lV2l0aEZjc1JlZmxlY3Rpb25GdXp6VGVzdChsMmNhcF9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfR3JvdXBGcmFtZVJlZmxlY3Rpb25GdXp6VGVzdChsMmNhcF9wYWNrZXRfZnV6el90ZXN0cyk7Ci0KLURFRklORV9BTkRfUkVHSVNURVJfQ29uZmlndXJhdGlvblJlcXVlc3RSZWZsZWN0aW9uRnV6elRlc3QobDJjYXBfcGFja2V0X2Z1enpfdGVzdHMpOwotCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotdm9pZCBSdW5MMmNhcFBhY2tldEZ1enpUZXN0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA+IDY1NTM2IC8qIE1heCBBQ0wgcGFja2V0IHNpemUgKi8pIHJldHVybjsKLSAgZm9yIChhdXRvIHRlc3RfZnVuY3Rpb24gOiBibHVldG9vdGg6OmwyY2FwOjpsMmNhcF9wYWNrZXRfZnV6el90ZXN0cykgewotICAgIHRlc3RfZnVuY3Rpb24oZGF0YSwgc2l6ZSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sMmNhcF9wYWNrZXRfdGVzdC5jYyBiL2dkL2wyY2FwL2wyY2FwX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQxM2Y0Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2wyY2FwX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgUEFDS0VUX1RFU1RJTkcKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6cGFja2V0OjpCaXRJbnNlcnRlcjsKLXVzaW5nIGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gZXh0ZW5kZWRfaW5mb3JtYXRpb25fc3RhcnRfZnJhbWUgPSB7Ci0gICAgMHgwQiwgLyogRmlyc3Qgc2l6ZSBieXRlICovCi0gICAgMHgwMCwgLyogU2Vjb25kIHNpemUgYnl0ZSAqLwotICAgIDB4YzEsIC8qIEZpcnN0IENoYW5uZWxJZCBieXRlICovCi0gICAgMHhjMiwgLyoqLwotICAgIDB4NEEsIC8qIDB4MTIgUmVxU2VxLCBGaW5hbCwgSUZyYW1lICovCi0gICAgMHhEMCwgLyogMHgxMyBSZXFTZXEgKi8KLSAgICAweDg5LCAvKiAweDIxIFR4U2VxIHNhciA9IFNUQVJUICovCi0gICAgMHg4QywgLyogMHgyMyBUeFNlcSAgKi8KLSAgICAweDEwLCAvKiBmaXJzdCBsZW5ndGggYnl0ZSAqLwotICAgIDB4MTEsIC8qKi8KLSAgICAweDAxLCAvKiBmaXJzdCBwYXlsb2FkIGJ5dGUgKi8KLSAgICAweDAyLCAweDAzLCAweDA0LCAweDA1LAotfTsKLQotREVGSU5FX0FORF9JTlNUQU5USUFURV9FeHRlbmRlZEluZm9ybWF0aW9uU3RhcnRGcmFtZVJlZmxlY3Rpb25UZXN0KGV4dGVuZGVkX2luZm9ybWF0aW9uX3N0YXJ0X2ZyYW1lKTsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gaV9mcmFtZV93aXRoX2ZjcyA9IHsweDBFLCAweDAwLCAweDQwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDM4LCAweDYxfTsKLURFRklORV9BTkRfSU5TVEFOVElBVEVfU3RhbmRhcmRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjc1JlZmxlY3Rpb25UZXN0KGlfZnJhbWVfd2l0aF9mY3MpOwotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBycl9mcmFtZV93aXRoX2ZjcyA9IHsweDA0LCAweDAwLCAweDQwLCAweDAwLCAweDAxLCAweDAxLCAweEQ0LCAweDE0fTsKLURFRklORV9BTkRfSU5TVEFOVElBVEVfU3RhbmRhcmRTdXBlcnZpc29yeUZyYW1lV2l0aEZjc1JlZmxlY3Rpb25UZXN0KHJyX2ZyYW1lX3dpdGhfZmNzKTsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ19mcmFtZSA9IHsweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAyLCAweDAzfTsKLURFRklORV9BTkRfSU5TVEFOVElBVEVfR3JvdXBGcmFtZVJlZmxlY3Rpb25UZXN0KGdfZnJhbWUpOwotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25maWdfbXR1X3JlcXVlc3QgPSB7MHgwNCwgMHgwNSwgMHgwOCwgMHgwMCwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHhhMCwgMHgwMn07Ci1ERUZJTkVfQU5EX0lOU1RBTlRJQVRFX0NvbmZpZ3VyYXRpb25SZXF1ZXN0UmVmbGVjdGlvblRlc3QoY29uZmlnX210dV9yZXF1ZXN0KTsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gY29uZmlnX3JlcXVlc3Rfb25lX2RlZmluZWRfb3B0aW9uID0gezB4MDQsIDB4MDUsIDB4MDgsIDB4MDAsIDB4NDEsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgxMiwgMHgzNH07Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25maWdfcmVxdWVzdF90d29fZGVmaW5lZF9vcHRpb25zID0gezB4MDQsIDB4MDUsIDB4MGMsIDB4MDAsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDIsIDB4MTIsIDB4MzQsIDB4MDIsIDB4MDIsIDB4NTYsIDB4Nzh9Owotc3RkOjp2ZWN0b3I8dWludDhfdD4gY29uZmlnX3JlcXVlc3RfdHdvX3VuZGVmaW5lZF9vcHRpb25zID0gezB4MDQsIDB4MDUsIDB4MGUsIDB4MDAsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiwgMHgwMSwgMHgwMCwgMHg3ZSwgMHgwNCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMH07Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25maWdfcmVxdWVzdF9oaW50X29uZV9kZWZpbmVkX29wdGlvbiA9IHsweDA0LCAweDA1LCAweDA4LCAweDAwLCAweDQxLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHg4MSwgMHgwMiwgMHgxMiwgMHgzNH07Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25maWdfcmVxdWVzdF9oaW50X3R3b191bmRlZmluZWRfb3B0aW9ucyA9IHsweDA0LCAweDA1LCAweDBjLCAweDAwLCAweDQxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MCwgMHgwMiwgMHgwMSwgMHgwMCwgMHg5MSwgMHgwMiwgMHgxMSwgMHgxMX07Ci1URVNUKEwyY2FwUGFja2V0c1Rlc3QsIHRlc3RDb25maWdSZXF1ZXN0T3B0aW9ucykgewotICB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiB2aWV3X2J5dGVzID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oY29uZmlnX3JlcXVlc3Rfb25lX2RlZmluZWRfb3B0aW9uKTsKLQotICAgIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcodmlld19ieXRlcyk7Ci0gICAgYXV0byB2aWV3ID0gQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoQ29udHJvbFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpOwotICAgIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBBU1NFUlRfRVEoMSwgdmlldy5HZXRDb25maWcoKS5zaXplKCkpOwotICB9Ci0KLSAgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gdmlld19ieXRlcyA9Ci0gICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGNvbmZpZ19yZXF1ZXN0X3R3b19kZWZpbmVkX29wdGlvbnMpOwotCi0gICAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyh2aWV3X2J5dGVzKTsKLSAgICBhdXRvIHZpZXcgPSBDb25maWd1cmF0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShDb250cm9sVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KSk7Ci0gICAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICAgIEFTU0VSVF9FUSgyLCB2aWV3LkdldENvbmZpZygpLnNpemUoKSk7Ci0gIH0KLQotICB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiB2aWV3X2J5dGVzID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oY29uZmlnX3JlcXVlc3RfdHdvX3VuZGVmaW5lZF9vcHRpb25zKTsKLQotICAgIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcodmlld19ieXRlcyk7Ci0gICAgYXV0byB2aWV3ID0gQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoQ29udHJvbFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpOwotICAgIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBBU1NFUlRfRVEoMiwgdmlldy5HZXRDb25maWcoKS5zaXplKCkpOwotICB9Ci0KLSAgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gdmlld19ieXRlcyA9Ci0gICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGNvbmZpZ19yZXF1ZXN0X2hpbnRfb25lX2RlZmluZWRfb3B0aW9uKTsKLQotICAgIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcodmlld19ieXRlcyk7Ci0gICAgYXV0byB2aWV3ID0gQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoQ29udHJvbFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpOwotICAgIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBBU1NFUlRfRVEoMSwgdmlldy5HZXRDb25maWcoKS5zaXplKCkpOwotICB9Ci0KLSAgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gdmlld19ieXRlcyA9Ci0gICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGNvbmZpZ19yZXF1ZXN0X2hpbnRfdHdvX3VuZGVmaW5lZF9vcHRpb25zKTsKLQotICAgIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcodmlld19ieXRlcyk7Ci0gICAgYXV0byB2aWV3ID0gQ29uZmlndXJhdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoQ29udHJvbFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpOwotICAgIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgICBBU1NFUlRfRVEoMiwgdmlldy5HZXRDb25maWcoKS5zaXplKCkpOwotICB9Ci19Ci0KLURFRklORV9Db25maWd1cmF0aW9uUmVxdWVzdFJlZmxlY3Rpb25GdXp6VGVzdCgpOwotCi1URVNUKEwyY2FwRnV6elJlZ3Jlc3Npb25zLCBDb25maWd1cmF0aW9uUmVxdWVzdEZ1enpfNTY5MTU2NjA3NzI0NzQ4OCkgewotICB1aW50OF90IGJsdWV0b290aF9nZF9mdXp6X3Rlc3RfNTY5MTU2NjA3NzI0NzQ4OFtdID0gewotICAgICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgfTsKLSAgUnVuQ29uZmlndXJhdGlvblJlcXVlc3RSZWZsZWN0aW9uRnV6elRlc3QoYmx1ZXRvb3RoX2dkX2Z1enpfdGVzdF81NjkxNTY2MDc3MjQ3NDg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmx1ZXRvb3RoX2dkX2Z1enpfdGVzdF81NjkxNTY2MDc3MjQ3NDg4KSk7Ci19Ci0KLVRFU1QoTDJjYXBGdXp6UmVncmVzc2lvbnMsIENvbmZpZ3VyYXRpb25SZXF1ZXN0RnV6el81NzQ3OTIyMDYyODAyOTQ0KSB7Ci0gIHVpbnQ4X3QgYmx1ZXRvb3RoX2dkX2Z1enpfdGVzdF81NzQ3OTIyMDYyODAyOTQ0W10gPSB7Ci0gICAgICAweDA0LCAweDAyLCAweDAyLCAweDdmLCAweDNmLCAweDdmLCAweDNmLCAweDdlLCAweDdmLAotICB9OwotICBSdW5Db25maWd1cmF0aW9uUmVxdWVzdFJlZmxlY3Rpb25GdXp6VGVzdChibHVldG9vdGhfZ2RfZnV6el90ZXN0XzU3NDc5MjIwNjI4MDI5NDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihibHVldG9vdGhfZ2RfZnV6el90ZXN0XzU3NDc5MjIwNjI4MDI5NDQpKTsKLX0KLQotVEVTVChMMmNhcEZ1enpSZWdyZXNzaW9ucywgQ29uZmlndXJhdGlvblJlcXVlc3RGdXp6XzUyMDI3MDkyMzE2OTc5MjApIHsKLSAgdWludDhfdCBibHVldG9vdGhfZ2RfZnV6el90ZXN0XzU3NDc5MjIwNjI4MDI5NDRbXSA9IHsKLSAgICAgIDB4MDQsIDB4MDEsIDB4NDUsIDB4NDUsIDB4MDUsIDB4MDEsIDB4MDEsIDB4NDUsIDB4MDUsIDB4MDEsCi0gIH07Ci0KLSAgUnVuQ29uZmlndXJhdGlvblJlcXVlc3RSZWZsZWN0aW9uRnV6elRlc3QoYmx1ZXRvb3RoX2dkX2Z1enpfdGVzdF81NzQ3OTIyMDYyODAyOTQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYmx1ZXRvb3RoX2dkX2Z1enpfdGVzdF81NzQ3OTIyMDYyODAyOTQ0KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbDJjYXBfcGFja2V0cy5wZGwgYi9nZC9sMmNhcC9sMmNhcF9wYWNrZXRzLnBkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyMzVkYS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sMmNhcF9wYWNrZXRzLnBkbAorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi1saXR0bGVfZW5kaWFuX3BhY2tldHMKLQotY2hlY2tzdW0gRmNzIDogMTYgImwyY2FwLyIKLQotcGFja2V0IEJhc2ljRnJhbWUgewotICBfc2l6ZV8oX3BheWxvYWRfKSA6IDE2LAotICBjaGFubmVsX2lkIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IEJhc2ljRnJhbWVXaXRoRmNzIHsKLSAgX2NoZWNrc3VtX3N0YXJ0XyhmY3MpLAotICBfc2l6ZV8oX3BheWxvYWRfKSA6IDE2LAotICBjaGFubmVsX2lkIDogMTYsCi0gIF9wYXlsb2FkXyA6IFsrMio4XSwgLy8gSW5jbHVkZSBGY3MgaW4gdGhlIF9zaXplXwotICBmY3MgOiBGY3MsCi19Ci0KLWVudW0gQ29udGludWF0aW9uIDogMSB7Ci0gIEVORCA9IDAsCi0gIENPTlRJTlVFID0gMSwKLX0KLQotLy8gQ2hhbm5lbElkIDIgaXMgY29ubmVjdGlvbmxlc3MKLXBhY2tldCBHcm91cEZyYW1lIDogQmFzaWNGcmFtZSAoY2hhbm5lbF9pZCA9IDB4MDIpIHsKLSAgcHNtIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotZW51bSBGcmFtZVR5cGUgOiAxIHsKLSAgSV9GUkFNRSA9IDAsCi0gIFNfRlJBTUUgPSAxLAotfQotCi1lbnVtIFN1cGVydmlzb3J5RnVuY3Rpb24gOiAyIHsKLSAgUkVDRUlWRVJfUkVBRFkgPSAwLAotICBSRUpFQ1QgPSAxLAotICBSRUNFSVZFUl9OT1RfUkVBRFkgPSAyLAotICBTRUxFQ1RfUkVKRUNUID0gMywKLX0KLQotZW51bSBSZXRyYW5zbWlzc2lvbkRpc2FibGUgOiAxIHsKLSAgTk9STUFMID0gMCwKLSAgRElTQUJMRSA9IDEsCi19Ci0KLWVudW0gU2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSA6IDIgewotICBVTlNFR01FTlRFRCA9IDAsCi0gIFNUQVJUID0gMSwKLSAgRU5EID0gMiwKLSAgQ09OVElOVUFUSU9OID0gMywKLX0KLQotcGFja2V0IFN0YW5kYXJkRnJhbWUgOiBCYXNpY0ZyYW1lIHsKLSAgZnJhbWVfdHlwZSA6IEZyYW1lVHlwZSwKLSAgX2JvZHlfLAotfQotCi1wYWNrZXQgU3RhbmRhcmRGcmFtZVdpdGhGY3MgOiBCYXNpY0ZyYW1lV2l0aEZjcyB7Ci0gIGZyYW1lX3R5cGUgOiBGcmFtZVR5cGUsCi0gIF9ib2R5XywKLX0KLQotZ3JvdXAgU3RhbmRhcmRTdXBlcnZpc29yeUNvbnRyb2wgewotICBfZml4ZWRfID0gMCA6IDEsCi0gIHMgOiBTdXBlcnZpc29yeUZ1bmN0aW9uLAotICBfcmVzZXJ2ZWRfIDogMywKLSAgciA6IFJldHJhbnNtaXNzaW9uRGlzYWJsZSwKLSAgcmVxX3NlcSA6IDYsCi0gIF9yZXNlcnZlZF8gOiAyLAotfQotCi1ncm91cCBTdGFuZGFyZEluZm9ybWF0aW9uQ29udHJvbCB7Ci0gIHR4X3NlcSA6IDYsCi0gIHIgOiBSZXRyYW5zbWlzc2lvbkRpc2FibGUsCi0gIHJlcV9zZXEgOiA2LAotICBzYXIgOiBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5LAotfQotCi1wYWNrZXQgU3RhbmRhcmRTdXBlcnZpc29yeUZyYW1lIDogU3RhbmRhcmRGcmFtZSAoZnJhbWVfdHlwZSA9IFNfRlJBTUUpIHsKLSAgU3RhbmRhcmRTdXBlcnZpc29yeUNvbnRyb2wsCi19Ci0KLXBhY2tldCBTdGFuZGFyZFN1cGVydmlzb3J5RnJhbWVXaXRoRmNzIDogU3RhbmRhcmRGcmFtZVdpdGhGY3MgKGZyYW1lX3R5cGUgPSBTX0ZSQU1FKSB7Ci0gIFN0YW5kYXJkU3VwZXJ2aXNvcnlDb250cm9sLAotfQotCi1wYWNrZXQgU3RhbmRhcmRJbmZvcm1hdGlvbkZyYW1lIDogU3RhbmRhcmRGcmFtZSAoZnJhbWVfdHlwZSA9IElfRlJBTUUpIHsKLSAgU3RhbmRhcmRJbmZvcm1hdGlvbkNvbnRyb2wsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IFN0YW5kYXJkSW5mb3JtYXRpb25GcmFtZVdpdGhGY3MgOiBTdGFuZGFyZEZyYW1lV2l0aEZjcyAoZnJhbWVfdHlwZSA9IElfRlJBTUUpIHsKLSAgU3RhbmRhcmRJbmZvcm1hdGlvbkNvbnRyb2wsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IFN0YW5kYXJkSW5mb3JtYXRpb25TdGFydEZyYW1lIDogU3RhbmRhcmRJbmZvcm1hdGlvbkZyYW1lIChzYXIgPSBTVEFSVCkgewotICBsMmNhcF9zZHVfbGVuZ3RoIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IFN0YW5kYXJkSW5mb3JtYXRpb25TdGFydEZyYW1lV2l0aEZjcyA6IFN0YW5kYXJkSW5mb3JtYXRpb25GcmFtZVdpdGhGY3MgKHNhciA9IFNUQVJUKSB7Ci0gIGwyY2FwX3NkdV9sZW5ndGggOiAxNiwKLSAgX3BheWxvYWRfLAotfQotCi1lbnVtIFBvbGwgOiAxIHsKLSAgTk9UX1NFVCA9IDAsCi0gIFBPTEwgPSAxLAotfQotCi1lbnVtIEZpbmFsIDogMSB7Ci0gIE5PVF9TRVQgPSAwLAotICBQT0xMX1JFU1BPTlNFID0gMSwKLX0KLQotZ3JvdXAgRW5oYW5jZWRTdXBlcnZpc29yeUNvbnRyb2wgewotICBfZml4ZWRfID0gMCA6IDEsCi0gIHMgOiBTdXBlcnZpc29yeUZ1bmN0aW9uLAotICBwIDogUG9sbCwKLSAgX3Jlc2VydmVkXyA6IDIsCi0gIGYgOiBGaW5hbCwKLSAgcmVxX3NlcSA6IDYsCi0gIF9yZXNlcnZlZF8gOiAyLAotfQotCi1ncm91cCBFbmhhbmNlZEluZm9ybWF0aW9uQ29udHJvbCB7Ci0gIHR4X3NlcSA6IDYsCi0gIGYgOiBGaW5hbCwKLSAgcmVxX3NlcSA6IDYsCi0gIHNhciA6IFNlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHksCi19Ci0KLXBhY2tldCBFbmhhbmNlZFN1cGVydmlzb3J5RnJhbWUgOiBTdGFuZGFyZEZyYW1lIChmcmFtZV90eXBlID0gU19GUkFNRSkgewotICBFbmhhbmNlZFN1cGVydmlzb3J5Q29udHJvbCwKLX0KLQotcGFja2V0IEVuaGFuY2VkU3VwZXJ2aXNvcnlGcmFtZVdpdGhGY3MgOiBTdGFuZGFyZEZyYW1lV2l0aEZjcyAoZnJhbWVfdHlwZSA9IFNfRlJBTUUpIHsKLSAgRW5oYW5jZWRTdXBlcnZpc29yeUNvbnRyb2wsCi19Ci0KLXBhY2tldCBFbmhhbmNlZEluZm9ybWF0aW9uRnJhbWUgOiBTdGFuZGFyZEZyYW1lIChmcmFtZV90eXBlID0gSV9GUkFNRSkgewotICBFbmhhbmNlZEluZm9ybWF0aW9uQ29udHJvbCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjcyA6IFN0YW5kYXJkRnJhbWVXaXRoRmNzIChmcmFtZV90eXBlID0gSV9GUkFNRSkgewotICBFbmhhbmNlZEluZm9ybWF0aW9uQ29udHJvbCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgRW5oYW5jZWRJbmZvcm1hdGlvblN0YXJ0RnJhbWUgOiBFbmhhbmNlZEluZm9ybWF0aW9uRnJhbWUgKHNhciA9IFNUQVJUKSB7Ci0gIGwyY2FwX3NkdV9sZW5ndGggOiAxNiwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgRW5oYW5jZWRJbmZvcm1hdGlvblN0YXJ0RnJhbWVXaXRoRmNzIDogRW5oYW5jZWRJbmZvcm1hdGlvbkZyYW1lV2l0aEZjcyAoc2FyID0gU1RBUlQpIHsKLSAgbDJjYXBfc2R1X2xlbmd0aCA6IDE2LAotICBfcGF5bG9hZF8sCi19Ci0KLWdyb3VwIEV4dGVuZGVkU3VwZXJ2aXNvcnlDb250cm9sIHsKLSAgZiA6IEZpbmFsLAotICByZXFfc2VxIDogMTQsCi0gIHMgOiBTdXBlcnZpc29yeUZ1bmN0aW9uLAotICBwIDogUG9sbCwKLSAgX3Jlc2VydmVkXyA6IDUsCi0gIF9yZXNlcnZlZF8gOiA4LAotfQotCi1ncm91cCBFeHRlbmRlZEluZm9ybWF0aW9uQ29udHJvbCB7Ci0gIGYgOiBGaW5hbCwKLSAgcmVxX3NlcSA6IDE0LAotICBzYXIgOiBTZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5LAotICB0eF9zZXEgOiAxNCwKLX0KLQotcGFja2V0IEV4dGVuZGVkU3VwZXJ2aXNvcnlGcmFtZSA6IFN0YW5kYXJkRnJhbWUgKGZyYW1lX3R5cGUgPSBTX0ZSQU1FKSB7Ci0gIEV4dGVuZGVkU3VwZXJ2aXNvcnlDb250cm9sLAotfQotCi1wYWNrZXQgRXh0ZW5kZWRTdXBlcnZpc29yeUZyYW1lV2l0aEZjcyA6IFN0YW5kYXJkRnJhbWVXaXRoRmNzIChmcmFtZV90eXBlID0gU19GUkFNRSkgewotICBFeHRlbmRlZFN1cGVydmlzb3J5Q29udHJvbCwKLX0KLQotcGFja2V0IEV4dGVuZGVkSW5mb3JtYXRpb25GcmFtZSA6IFN0YW5kYXJkRnJhbWUgKGZyYW1lX3R5cGUgPSBJX0ZSQU1FKSB7Ci0gIEV4dGVuZGVkSW5mb3JtYXRpb25Db250cm9sLAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBFeHRlbmRlZEluZm9ybWF0aW9uRnJhbWVXaXRoRmNzIDogU3RhbmRhcmRGcmFtZVdpdGhGY3MgKGZyYW1lX3R5cGUgPSBJX0ZSQU1FKSB7Ci0gIEV4dGVuZGVkSW5mb3JtYXRpb25Db250cm9sLAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBFeHRlbmRlZEluZm9ybWF0aW9uU3RhcnRGcmFtZSA6IEV4dGVuZGVkSW5mb3JtYXRpb25GcmFtZSAoc2FyID0gU1RBUlQpIHsKLSAgbDJjYXBfc2R1X2xlbmd0aCA6IDE2LAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBFeHRlbmRlZEluZm9ybWF0aW9uU3RhcnRGcmFtZVdpdGhGY3MgOiBFeHRlbmRlZEluZm9ybWF0aW9uRnJhbWVXaXRoRmNzIChzYXIgPSBTVEFSVCkgewotICBsMmNhcF9zZHVfbGVuZ3RoIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IEZpcnN0TGVJbmZvcm1hdGlvbkZyYW1lIDogQmFzaWNGcmFtZSB7Ci0gIGwyY2FwX3NkdV9sZW5ndGggOiAxNiwKLSAgX3BheWxvYWRfLAotfQotCi1lbnVtIENvbW1hbmRDb2RlIDogOCB7Ci0gIENPTU1BTkRfUkVKRUNUID0gMHgwMSwKLSAgQ09OTkVDVElPTl9SRVFVRVNUID0gMHgwMiwKLSAgQ09OTkVDVElPTl9SRVNQT05TRSA9IDB4MDMsCi0gIENPTkZJR1VSQVRJT05fUkVRVUVTVCA9IDB4MDQsCi0gIENPTkZJR1VSQVRJT05fUkVTUE9OU0UgPSAweDA1LAotICBESVNDT05ORUNUSU9OX1JFUVVFU1QgPSAweDA2LAotICBESVNDT05ORUNUSU9OX1JFU1BPTlNFID0gMHgwNywKLSAgRUNIT19SRVFVRVNUID0gMHgwOCwKLSAgRUNIT19SRVNQT05TRSA9IDB4MDksCi0gIElORk9STUFUSU9OX1JFUVVFU1QgPSAweDBBLAotICBJTkZPUk1BVElPTl9SRVNQT05TRSA9IDB4MEIsCi0gIENSRUFURV9DSEFOTkVMX1JFUVVFU1QgPSAweDBDLAotICBDUkVBVEVfQ0hBTk5FTF9SRVNQT05TRSA9IDB4MEQsCi0gIE1PVkVfQ0hBTk5FTF9SRVFVRVNUID0gMHgwRSwKLSAgTU9WRV9DSEFOTkVMX1JFU1BPTlNFID0gMHgwRiwKLSAgTU9WRV9DSEFOTkVMX0NPTkZJUk1BVElPTl9SRVFVRVNUID0gMHgxMCwKLSAgTU9WRV9DSEFOTkVMX0NPTkZJUk1BVElPTl9SRVNQT05TRSA9IDB4MTEsCi0gIEZMT1dfQ09OVFJPTF9DUkVESVQgPSAweDE2LCAgLy8gQ29yZSA1LjIgQ09DCi0gIENSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QgPSAweDE3LAotICBDUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVNQT05TRSA9IDB4MTgsCi0gIENSRURJVF9CQVNFRF9SRUNPTkZJR1VSRV9SRVFVRVNUID0gMHgxOSwKLSAgQ1JFRElUX0JBU0VEX1JFQ09ORklHVVJFX1JFU1BPTlNFID0gMHgxQSwKLX0KLQotcGFja2V0IENvbnRyb2xGcmFtZSA6IEJhc2ljRnJhbWUgKGNoYW5uZWxfaWQgPSAweDAwMDEpIHsKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgQ29udHJvbCB7Ci0gIGNvZGUgOiBDb21tYW5kQ29kZSwKLSAgaWRlbnRpZmllciA6IDgsCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotZW51bSBDb21tYW5kUmVqZWN0UmVhc29uIDogMTYgewotICBDT01NQU5EX05PVF9VTkRFUlNUT09EID0gMHgwMDAwLAotICBTSUdOQUxJTkdfTVRVX0VYQ0VFREVEID0gMHgwMDAxLAotICBJTlZBTElEX0NJRF9JTl9SRVFVRVNUID0gMHgwMDAyLAotfQotCi1wYWNrZXQgQ29tbWFuZFJlamVjdCA6IENvbnRyb2wgKGNvZGUgPSBDT01NQU5EX1JFSkVDVCkgewotICByZWFzb24gOiBDb21tYW5kUmVqZWN0UmVhc29uLAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBDb21tYW5kUmVqZWN0Tm90VW5kZXJzdG9vZCA6IENvbW1hbmRSZWplY3QgKHJlYXNvbiA9IENPTU1BTkRfTk9UX1VOREVSU1RPT0QpIHsKLX0KLQotcGFja2V0IENvbW1hbmRSZWplY3RNdHVFeGNlZWRlZCA6IENvbW1hbmRSZWplY3QgKHJlYXNvbiA9IFNJR05BTElOR19NVFVfRVhDRUVERUQpIHsKLSAgYWN0dWFsX210dSA6IDE2LAotfQotCi1wYWNrZXQgQ29tbWFuZFJlamVjdEludmFsaWRDaWQgOiBDb21tYW5kUmVqZWN0IChyZWFzb24gPSBJTlZBTElEX0NJRF9JTl9SRVFVRVNUKSB7Ci0gIGxvY2FsX2NoYW5uZWwgOiAxNiwgLy8gUmVsYXRpdmUgdG8gdGhlIHNlbmRlciBvZiB0aGUgQ29tbWFuZFJlamVjdAotICByZW1vdGVfY2hhbm5lbCA6IDE2LAotfQotCi1wYWNrZXQgQ29ubmVjdGlvblJlcXVlc3QgOiBDb250cm9sIChjb2RlID0gQ09OTkVDVElPTl9SRVFVRVNUKSB7Ci0gIHBzbSA6IDE2LAotICBzb3VyY2VfY2lkIDogMTYsCi19Ci0KLWVudW0gQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0IDogMTYgewotICBTVUNDRVNTID0gMHgwMDAwLAotICBQRU5ESU5HID0gMHgwMDAxLAotICBQU01fTk9UX1NVUFBPUlRFRCA9IDB4MDAwMiwKLSAgU0VDVVJJVFlfQkxPQ0sgPSAweDAwMDMsCi0gIE5PX1JFU09VUkNFU19BVkFJTEFCTEUgPSAweDAwMDQsCi0gIElOVkFMSURfQ0lEID0gMHgwMDA2LAotICBTT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEID0gMHgwMDA3LAotfQotCi1lbnVtIENvbm5lY3Rpb25SZXNwb25zZVN0YXR1cyA6IDE2IHsKLSAgTk9fRlVSVEhFUl9JTkZPUk1BVElPTl9BVkFJTEFCTEUgPSAweDAwMDAsCi0gIEFVVEhFTlRJQ0FUSU9OX1BFTkRJTkcgPSAweDAwMDEsCi0gIEFVVEhPUklaQVRJT05fUEVORElORyA9IDB4MDAwMiwKLX0KLQotcGFja2V0IENvbm5lY3Rpb25SZXNwb25zZSA6IENvbnRyb2wgKGNvZGUgPSBDT05ORUNUSU9OX1JFU1BPTlNFKSB7Ci0gIGRlc3RpbmF0aW9uX2NpZCA6IDE2LAotICBzb3VyY2VfY2lkIDogMTYsCi0gIHJlc3VsdCA6IENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCwKLSAgc3RhdHVzIDogQ29ubmVjdGlvblJlc3BvbnNlU3RhdHVzLAotfQotCi1lbnVtIENvbmZpZ3VyYXRpb25PcHRpb25UeXBlIDogNyB7Ci0gIE1UVSA9IDB4MDEsCi0gIEZMVVNIX1RJTUVPVVQgPSAweDAyLAotICBRVUFMSVRZX09GX1NFUlZJQ0UgPSAweDAzLAotICBSRVRSQU5TTUlTU0lPTl9BTkRfRkxPV19DT05UUk9MID0gMHgwNCwKLSAgRlJBTUVfQ0hFQ0tfU0VRVUVOQ0UgPSAweDA1LAotICBFWFRFTkRFRF9GTE9XX1NQRUNJRklDQVRJT04gPSAweDA2LAotICBFWFRFTkRFRF9XSU5ET1dfU0laRSA9IDB4MDcsCi19Ci0KLWVudW0gQ29uZmlndXJhdGlvbk9wdGlvbklzSGludCA6IDEgewotICBPUFRJT05fTVVTVF9CRV9SRUNPR05JWkVEID0gMCwKLSAgT1BUSU9OX0lTX0FfSElOVCA9IDEsCi19Ci0KLXN0cnVjdCBDb25maWd1cmF0aW9uT3B0aW9uIHsKLSAgdHlwZSA6IENvbmZpZ3VyYXRpb25PcHRpb25UeXBlLAotICBpc19oaW50IDogQ29uZmlndXJhdGlvbk9wdGlvbklzSGludCwKLSAgX3NpemVfKF9ib2R5XykgOiA4LAotICBfYm9keV8sCi19Ci0KLXN0cnVjdCBNdHVDb25maWd1cmF0aW9uT3B0aW9uIDogQ29uZmlndXJhdGlvbk9wdGlvbiAodHlwZSA9IE1UVSkgewotICBtdHUgOiAxNiwKLX0KLQotc3RydWN0IEZsdXNoVGltZW91dENvbmZpZ3VyYXRpb25PcHRpb24gOiBDb25maWd1cmF0aW9uT3B0aW9uICh0eXBlID0gRkxVU0hfVElNRU9VVCkgewotICBmbHVzaF90aW1lb3V0IDogMTYsCi19Ci0KLWVudW0gUW9zU2VydmljZVR5cGUgOiA4IHsKLSAgTk9fVFJBRkZJQyA9IDB4MDAsCi0gIEJFU1RfRUZGT1JUID0gMHgwMSwgLy8gRGVmYXVsdAotICBHVUFSQU5URUVEID0gMHgwMiwKLX0KLQotc3RydWN0IFF1YWxpdHlPZlNlcnZpY2VDb25maWd1cmF0aW9uT3B0aW9uIDogQ29uZmlndXJhdGlvbk9wdGlvbiAodHlwZSA9IFFVQUxJVFlfT0ZfU0VSVklDRSkgewotICBfcmVzZXJ2ZWRfIDogOCwgLy8gRmxhZ3MKLSAgc2VydmljZV90eXBlIDogUW9zU2VydmljZVR5cGUsCi0gIHRva2VuX3JhdGUgOiAzMiwgICAgICAgICAvLyAwID0gaWdub3JlLCAweGZmZmZmZmZmID0gbWF4IGF2YWlsYWJsZQotICB0b2tlbl9idWNrZXRfc2l6ZSA6IDMyLCAgLy8gMCA9IGlnbm9yZSwgMHhmZmZmZmZmZiA9IG1heCBhdmFpbGFibGUKLSAgcGVha19iYW5kd2lkdGggOiAzMiwgICAgIC8vIE9jdGV0cy9zZWNvbmQgMCA9IGlnbm9yZQotICBsYXRlbmN5IDogMzIsICAgICAgICAgICAgLy8gbWljcm9zZWNvbmRzIDB4ZmZmZmZmZmYgPSBpZ25vcmUKLSAgZGVsYXlfdmFyaWF0aW9uIDogMzIsICAgIC8vIG1pY3Jvc2Vjb25kcyAweGZmZmZmZmZmID0gaWdub3JlCi19Ci0KLWVudW0gUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGVPcHRpb24gOiA4IHsKLSAgTDJDQVBfQkFTSUMgPSAweDAwLAotICBSRVRSQU5TTUlTU0lPTiA9IDB4MDEsCi0gIEZMT1dfQ09OVFJPTCA9IDB4MDIsCi0gIEVOSEFOQ0VEX1JFVFJBTlNNSVNTSU9OID0gMHgwMywKLSAgU1RSRUFNSU5HID0gMHgwNCwKLX0KLQotCi1zdHJ1Y3QgUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbENvbmZpZ3VyYXRpb25PcHRpb24gOiBDb25maWd1cmF0aW9uT3B0aW9uICh0eXBlID0gUkVUUkFOU01JU1NJT05fQU5EX0ZMT1dfQ09OVFJPTCkgewotICBtb2RlIDogUmV0cmFuc21pc3Npb25BbmRGbG93Q29udHJvbE1vZGVPcHRpb24sCi0gIHR4X3dpbmRvd19zaXplIDogOCwgLy8gMS0zMiBmb3IgRmxvdyBDb250cm9sIGFuZCBSZXRyYW5zbWlzc2lvbiwgMS02MyBmb3IgRW5oYW5jZWQKLSAgbWF4X3RyYW5zbWl0IDogOCwKLSAgcmV0cmFuc21pc3Npb25fdGltZV9vdXQgOiAxNiwKLSAgbW9uaXRvcl90aW1lX291dCA6IDE2LAotICBtYXhpbXVtX3BkdV9zaXplIDogMTYsCi19Ci0KLWVudW0gRmNzVHlwZSA6IDggewotICBOT19GQ1MgPSAwLAotICBERUZBVUxUID0gMSwgIC8vIDE2LWJpdCBGQ1MKLX0KLQotc3RydWN0IEZyYW1lQ2hlY2tTZXF1ZW5jZU9wdGlvbiA6IENvbmZpZ3VyYXRpb25PcHRpb24gKHR5cGUgPSBGUkFNRV9DSEVDS19TRVFVRU5DRSkgewotICBmY3NfdHlwZSA6IEZjc1R5cGUsCi19Ci0KLQotc3RydWN0IEV4dGVuZGVkRmxvd1NwZWNpZmljYXRpb25PcHRpb24gOiBDb25maWd1cmF0aW9uT3B0aW9uICh0eXBlID0gRVhURU5ERURfRkxPV19TUEVDSUZJQ0FUSU9OKSB7Ci0gIGlkZW50aWZpZXIgOiA4LCAvLyBEZWZhdWx0IDB4MDEsIG11c3QgYmUgMHgwMSBmb3IgRXh0ZW5kZWQgRmxvdy1CZXN0LUVmZm9ydAotICBzZXJ2aWNlX3R5cGUgOiBRb3NTZXJ2aWNlVHlwZSwKLSAgbWF4aW11bV9zZHVfc2l6ZSA6IDE2LCAvLyBPY3RldHMKLSAgc2R1X2ludGVyYXJyaXZhbF90aW1lIDogMzIsIC8vIGluIG1pY3Jvc2Vjb25kcwotICBhY2Nlc3NfbGF0ZW5jeSA6IDMyLCAvLyBpbiBtaWNyb3NlY29uZHMsIHdpdGhvdXQgSENJIGFuZCBzdGFjayBvdmVyaGVhZHMKLSAgZmx1c2hfdGltZW91dCA6IDMyLCAvLyBpbiBtaWNyb3NlY29uZHMgMHgwID0gbm8gcmV0cmFuc21pc3Npb25zIDB4RkZGRkZGRkYgPSBuZXZlciBmbHVzaGVkCi19Ci0KLXN0cnVjdCBFeHRlbmRlZFdpbmRvd1NpemVPcHRpb24gOiBDb25maWd1cmF0aW9uT3B0aW9uICh0eXBlID0gRVhURU5ERURfV0lORE9XX1NJWkUpIHsKLSAgbWF4X3dpbmRvd19zaXplIDogMTYsIC8vIDB4MDAwMCA9IFZhbGlkIGZvciBzdHJlYW1pbmcsIDB4MDAwMS0weDNGRkYgVmFsaWQgZm9yIEVuaGFuY2VkIFJldHJhbnNtaXNzaW9uCi19Ci0KLXBhY2tldCBDb25maWd1cmF0aW9uUmVxdWVzdCA6IENvbnRyb2wgKGNvZGUgPSBDT05GSUdVUkFUSU9OX1JFUVVFU1QpIHsKLSAgZGVzdGluYXRpb25fY2lkIDogMTYsCi0gIGNvbnRpbnVhdGlvbiA6IENvbnRpbnVhdGlvbiwKLSAgX3Jlc2VydmVkXyA6IDE1LAotICBjb25maWcgOiBDb25maWd1cmF0aW9uT3B0aW9uW10sCi19Ci0KLWVudW0gQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0IDogMTYgewotICBTVUNDRVNTID0gMHgwMDAwLAotICBVTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUyA9IDB4MDAwMSwKLSAgUkVKRUNURUQgPSAweDAwMDIsCi0gIFVOS05PV05fT1BUSU9OUyA9IDB4MDAwMywKLSAgUEVORElORyA9IDB4MDAwNCwKLSAgRkxPV19TUEVDX1JFSkVDVEVEID0gMHgwMDA1LAotfQotCi1wYWNrZXQgQ29uZmlndXJhdGlvblJlc3BvbnNlIDogQ29udHJvbCAoY29kZSA9IENPTkZJR1VSQVRJT05fUkVTUE9OU0UpIHsKLSAgc291cmNlX2NpZCA6IDE2LAotICBjb250aW51YXRpb24gOiBDb250aW51YXRpb24sCi0gIF9yZXNlcnZlZF8gOiAxNSwKLSAgcmVzdWx0IDogQ29uZmlndXJhdGlvblJlc3BvbnNlUmVzdWx0LAotICBjb25maWcgOiBDb25maWd1cmF0aW9uT3B0aW9uW10sCi19Ci0KLXBhY2tldCBEaXNjb25uZWN0aW9uUmVxdWVzdCA6IENvbnRyb2wgKGNvZGUgPSBESVNDT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgZGVzdGluYXRpb25fY2lkIDogMTYsCi0gIHNvdXJjZV9jaWQgOiAxNiwKLX0KLQotcGFja2V0IERpc2Nvbm5lY3Rpb25SZXNwb25zZSA6IENvbnRyb2wgKGNvZGUgPSBESVNDT05ORUNUSU9OX1JFU1BPTlNFKSB7Ci0gIGRlc3RpbmF0aW9uX2NpZCA6IDE2LAotICBzb3VyY2VfY2lkIDogMTYsCi19Ci0KLXBhY2tldCBFY2hvUmVxdWVzdCA6IENvbnRyb2wgKGNvZGUgPSBFQ0hPX1JFUVVFU1QpIHsKLSAgX3BheWxvYWRfLCAvLyBPcHRpb25hbCBhbmQgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKLX0KLQotcGFja2V0IEVjaG9SZXNwb25zZSA6IENvbnRyb2wgKGNvZGUgPSBFQ0hPX1JFU1BPTlNFKSB7Ci0gIF9wYXlsb2FkXywgLy8gT3B0aW9uYWwgYW5kIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCi19Ci0KLWVudW0gSW5mb3JtYXRpb25SZXF1ZXN0SW5mb1R5cGUgOiAxNiB7Ci0gIENPTk5FQ1RJT05MRVNTX01UVSA9IDB4MDAwMSwKLSAgRVhURU5ERURfRkVBVFVSRVNfU1VQUE9SVEVEID0gMHgwMDAyLAotICBGSVhFRF9DSEFOTkVMU19TVVBQT1JURUQgPSAweDAwMDMsCi19Ci0KLXBhY2tldCBJbmZvcm1hdGlvblJlcXVlc3QgOiBDb250cm9sIChjb2RlID0gSU5GT1JNQVRJT05fUkVRVUVTVCkgewotICBpbmZvX3R5cGUgOiBJbmZvcm1hdGlvblJlcXVlc3RJbmZvVHlwZSwKLX0KLQotZW51bSBJbmZvcm1hdGlvblJlcXVlc3RSZXN1bHQgOiAxNiB7Ci0gIFNVQ0NFU1MgPSAweDAwMDAsCi0gIE5PVF9TVVBQT1JURUQgPSAweDAwMDEsCi19Ci0KLXBhY2tldCBJbmZvcm1hdGlvblJlc3BvbnNlIDogQ29udHJvbCAoY29kZSA9IElORk9STUFUSU9OX1JFU1BPTlNFKSB7Ci0gIGluZm9fdHlwZSA6IEluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlLAotICByZXN1bHQgOiBJbmZvcm1hdGlvblJlcXVlc3RSZXN1bHQsCi0gIF9ib2R5XywKLX0KLQotcGFja2V0IEluZm9ybWF0aW9uUmVzcG9uc2VDb25uZWN0aW9ubGVzc010dSA6IEluZm9ybWF0aW9uUmVzcG9uc2UgKGluZm9fdHlwZSA9IENPTk5FQ1RJT05MRVNTX01UVSkgewotICBjb25uZWN0aW9ubGVzc19tdHUgOiAxNiwKLX0KLQotcGFja2V0IEluZm9ybWF0aW9uUmVzcG9uc2VFeHRlbmRlZEZlYXR1cmVzIDogSW5mb3JtYXRpb25SZXNwb25zZSAoaW5mb190eXBlID0gRVhURU5ERURfRkVBVFVSRVNfU1VQUE9SVEVEKSB7Ci0gIC8vIEV4dGVuZGVkRmVhdHVyZU1hc2sgOiAzMiwKLSAgZmxvd19jb250cm9sX21vZGUgOiAxLAotICByZXRyYW5zbWlzc2lvbl9tb2RlIDogMSwKLSAgYmlfZGlyZWN0aW9uYWxfcW9TIDogMSwKLSAgZW5oYW5jZWRfcmV0cmFuc21pc3Npb25fbW9kZSA6IDEsCi0gIHN0cmVhbWluZ19tb2RlIDogMSwKLSAgZmNzX29wdGlvbiA6IDEsCi0gIGV4dGVuZGVkX2Zsb3dfc3BlY2lmaWNhdGlvbl9mb3JfYnJfZWRyIDogMSwKLSAgZml4ZWRfY2hhbm5lbHMgOiAxLAotICBleHRlbmRlZF93aW5kb3dfc2l6ZSA6IDEsCi0gIHVuaWNhc3RfY29ubmVjdGlvbmxlc3NfZGF0YV9yZWNlcHRpb24gOiAxLAotICBlbmhhbmNlZF9jcmVkaXRfYmFzZWRfZmxvd19jb250cm9sX21vZGUgOiAxLAotICBfcmVzZXJ2ZWRfIDogMjEsCi19Ci0KLXBhY2tldCBJbmZvcm1hdGlvblJlc3BvbnNlRml4ZWRDaGFubmVscyA6IEluZm9ybWF0aW9uUmVzcG9uc2UgKGluZm9fdHlwZSA9IEZJWEVEX0NIQU5ORUxTX1NVUFBPUlRFRCkgewotICBmaXhlZF9jaGFubmVscyA6IDY0LCAvLyBiaXQgMCBtdXN0IGJlIDAsIGJpdCAxIG11c3QgYmUgMSwgYWxsIG90aGVycyAxID0gc3VwcG9ydGVkCi19Ci0KLXBhY2tldCBDcmVhdGVDaGFubmVsUmVxdWVzdCA6IENvbnRyb2wgKGNvZGUgPSBDUkVBVEVfQ0hBTk5FTF9SRVFVRVNUKSB7Ci0gIHBzbSA6IDE2LAotICBzb3VyY2VfY2lkIDogMTYsCi0gIGNvbnRyb2xsZXJfaWQgOiA4LAotfQotCi1lbnVtIENyZWF0ZUNoYW5uZWxSZXNwb25zZVJlc3VsdCA6IDE2IHsKLSAgU1VDQ0VTUyA9IDB4MDAwMCwKLSAgUEVORElORyA9IDB4MDAwMSwKLSAgUFNNX05PVF9TVVBQT1JURUQgPSAweDAwMDIsCi0gIFNFQ1VSSVRZX0JMT0NLID0gMHgwMDAzLAotICBOT19SRVNPVVJDRVNfQVZBSUxBQkxFID0gMHgwMDA0LAotICBDT05UUk9MTEVSX0lEX05PVF9TVVBQT1JURUQgPSAweDAwMDUsCi0gIElOVkFMSURfQ0lEID0gMHgwMDA2LAotICBTT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEID0gMHgwMDA3LAotfQotCi1lbnVtIENyZWF0ZUNoYW5uZWxSZXNwb25zZVN0YXR1cyA6IDE2IHsKLSAgTk9fRlVSVEhFUl9JTkZPUk1BVElPTl9BVkFJTEFCTEUgPSAweDAwMDAsCi0gIEFVVEhFTlRJQ0FUSU9OX1BFTkRJTkcgPSAweDAwMDEsCi0gIEFVVEhPUklaQVRJT05fUEVORElORyA9IDB4MDAwMiwKLX0KLQotcGFja2V0IENyZWF0ZUNoYW5uZWxSZXNwb25zZSA6IENvbnRyb2wgKGNvZGUgPSBDUkVBVEVfQ0hBTk5FTF9SRVNQT05TRSkgewotICBkZXN0aW5hdGlvbl9jaWQgOiAxNiwKLSAgc291cmNlX2NpZCA6IDE2LAotICByZXN1bHQgOiBDcmVhdGVDaGFubmVsUmVzcG9uc2VSZXN1bHQsCi0gIHN0YXR1cyA6IENyZWF0ZUNoYW5uZWxSZXNwb25zZVN0YXR1cywKLX0KLQotLy8gQU1QIE9ubHkgPwotcGFja2V0IE1vdmVDaGFubmVsUmVxdWVzdCA6IENvbnRyb2wgKGNvZGUgPSBNT1ZFX0NIQU5ORUxfUkVRVUVTVCkgewotICBpbml0aWF0b3JfY2lkIDogMTYsCi0gIGRlc3RfY29udHJvbGxlcl9pZCA6IDgsCi19Ci0KLWVudW0gTW92ZUNoYW5uZWxSZXNwb25zZVJlc3VsdCA6IDE2IHsKLSAgU1VDQ0VTUyA9IDB4MDAwMCwKLSAgUEVORElORyA9IDB4MDAwMSwKLSAgQ09OVFJPTExFUl9JRF9OT1RfU1VQUE9SVEVEID0gMHgwMDAyLAotICBORVdfQ09OVFJPTExFUl9JRF9JU19TQU1FID0gMHgwMDAzLAotICBDT05GSUdVUkFUSU9OX05PVF9TVVBQT1JURUQgPSAweDAwMDQsCi0gIENIQU5ORUxfQ09MTElTSU9OID0gMHgwMDA1LAotICBDSEFOTkVMX05PVF9BTExPV0VEX1RPX0JFX01PVkVEID0gMHgwMDA2LAotfQotCi1wYWNrZXQgTW92ZUNoYW5uZWxSZXNwb25zZSA6IENvbnRyb2wgKGNvZGUgPSBNT1ZFX0NIQU5ORUxfUkVTUE9OU0UpIHsKLSAgaW5pdGlhdG9yX2NpZCA6IDE2LAotICByZXN1bHQgOiBNb3ZlQ2hhbm5lbFJlc3BvbnNlUmVzdWx0LAotfQotCi1lbnVtIE1vdmVDaGFubmVsQ29uZmlybWF0aW9uUmVzdWx0IDogMTYgewotICBTVUNDRVNTID0gMHgwMDAwLAotICBGQUlMVVJFID0gMHgwMDAxLAotfQotCi1wYWNrZXQgTW92ZUNoYW5uZWxDb25maXJtYXRpb25SZXF1ZXN0IDogQ29udHJvbCAoY29kZSA9IE1PVkVfQ0hBTk5FTF9DT05GSVJNQVRJT05fUkVRVUVTVCkgewotICBpbml0aWF0b3JfY2lkIDogMTYsCi0gIHJlc3VsdCA6IE1vdmVDaGFubmVsQ29uZmlybWF0aW9uUmVzdWx0LAotfQotCi1wYWNrZXQgTW92ZUNoYW5uZWxDb25maXJtYXRpb25SZXNwb25zZSA6IENvbnRyb2wgKGNvZGUgPSBNT1ZFX0NIQU5ORUxfQ09ORklSTUFUSU9OX1JFU1BPTlNFKSB7Ci0gIGluaXRpYXRvcl9jaWQgOiAxNiwKLX0KLQotLy8gQ29yZSA1LjIgQ09DCi0KLXBhY2tldCBGbG93Q29udHJvbENyZWRpdCA6IENvbnRyb2wgKGNvZGUgPSBGTE9XX0NPTlRST0xfQ1JFRElUKSB7Ci0gIGNpZCA6IDE2LCAvLyBSZWNlaXZlcidzIGRlc3RpbmF0aW9uIENJRAotICBjcmVkaXRzIDogMTYsCi19Ci0KLXBhY2tldCBDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0IDogQ29udHJvbCAoY29kZSA9IENSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgc3BzbSA6IDE2LAotICBtdHUgOiAxNiwKLSAgbXBzIDogMTYsCi0gIGluaXRpYWxfY3JlZGl0cyA6IDE2LAotICBzb3VyY2VfY2lkIDogMTZbXSwKLX0KLQotZW51bSBDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCA6IDE2IHsKLSAgU1VDQ0VTUyA9IDB4MDAwMCwKLSAgU1BTTV9OT1RfU1VQUE9SVEVEID0gMHgwMDAyLAotICBTT01FX1JFRlVTRURfTk9fUkVTT1VSQ0VTX0FWQUlMQUJMRSA9IDB4MDAwNCwKLSAgQUxMX1JFRlVTRURfSU5TVUZGSUNJRU5UX0FVVEhFTlRJQ0FUSU9OID0gMHgwMDA1LAotICBBTExfUkVGVVNFRF9JTlNVRkZJQ0lFTlRfQVVUSE9SSVpBVElPTiA9IDB4MDAwNiwKLSAgQUxMX1JFRlVTRURfSU5TVUZGSUNJRU5UX0VOQ1JZUFRJT05fS0VZX1NJWkUgPSAweDAwMDcsCi0gIEFMTF9SRUZVU0VEX0lOU1VGRklDSUVOVF9FTkNSWVBUSU9OID0gMHgwMDA4LAotICBTT01FX1JFRlVTRURfSU5WQUxJRF9TT1VSQ0VfQ0lEID0gMHgwMDA5LAotICBTT01FX1JFRlVTRURfU09VUkNFX0NJRF9BTFJFQURZX0FMTE9DQVRFRCA9IDB4MDAwQSwKLSAgQUxMX1JFRlVTRURfVU5BQ0NFUFRBQkxFX1BBUkFNRVRFUlMgPSAweDAwMEIsCi0gIEFMTF9SRUZVU0VEX0lOVkFMSURfUEFSQU1FVEVSUyA9IDB4MDAwQywKLX0KLQotcGFja2V0IENyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlIDogQ29udHJvbCAoY29kZSA9IENSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFU1BPTlNFKSB7Ci0gIG10dSA6IDE2LAotICBtcHMgOiAxNiwKLSAgaW5pdGlhbF9jcmVkaXRzIDogMTYsCi0gIHJlc3VsdCA6IENyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LAotICBkZXN0aW5hdGlvbl9jaWQgOiAxNltdLAotfQotCi1wYWNrZXQgQ3JlZGl0QmFzZWRSZWNvbmZpZ3VyZVJlcXVlc3QgOiBDb250cm9sIChjb2RlID0gQ1JFRElUX0JBU0VEX1JFQ09ORklHVVJFX1JFUVVFU1QpIHsKLSAgbXR1IDogMTYsCi0gIG1wcyA6IDE2LAotICBkZXN0aW5hdGlvbl9jaWQgOiAxNltdLAotfQotCi1lbnVtIENyZWRpdEJhc2VkUmVjb25maWd1cmVSZXNwb25zZVJlc3VsdCA6IDE2IHsKLSAgU1VDQ0VTUyA9IDB4MDAwMCwKLSAgTVRVX05PVF9BTExPV0VEID0gMHgwMSwKLSAgTVBTX05PVF9BTExPV0VEID0gMHgwMiwKLSAgSU5WQUxJRF9ERVNUSU5BVElPTl9DSUQgPSAweDAzLAotICBVTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUyA9IDB4MDQsCi19Ci0KLXBhY2tldCBDcmVkaXRCYXNlZFJlY29uZmlndXJlUmVzcG9uc2UgOiBDb250cm9sIChjb2RlID0gQ1JFRElUX0JBU0VEX1JFQ09ORklHVVJFX1JFU1BPTlNFKSB7Ci0gIHJlc3VsdDogQ3JlZGl0QmFzZWRSZWNvbmZpZ3VyZVJlc3BvbnNlUmVzdWx0LAotfQotCi1lbnVtIExlQ29tbWFuZENvZGUgOiA4IHsKLSAgQ09NTUFORF9SRUpFQ1QgPSAweDAxLAotICBESVNDT05ORUNUSU9OX1JFUVVFU1QgPSAweDA2LAotICBESVNDT05ORUNUSU9OX1JFU1BPTlNFID0gMHgwNywKLSAgQ09OTkVDVElPTl9QQVJBTUVURVJfVVBEQVRFX1JFUVVFU1QgPSAweDEyLAotICBDT05ORUNUSU9OX1BBUkFNRVRFUl9VUERBVEVfUkVTUE9OU0UgPSAweDEzLAotICBMRV9DUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVFVRVNUID0gMHgxNCwKLSAgTEVfQ1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVTUE9OU0UgPSAweDE1LAotICBMRV9GTE9XX0NPTlRST0xfQ1JFRElUID0gMHgxNiwKLSAgQ1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVRVUVTVCA9IDB4MTcsICAvLyBDb3JlIDUuMiBDT0MKLSAgQ1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVTUE9OU0UgPSAweDE4LAotICBDUkVESVRfQkFTRURfUkVDT05GSUdVUkVfUkVRVUVTVCA9IDB4MTksCi0gIENSRURJVF9CQVNFRF9SRUNPTkZJR1VSRV9SRVNQT05TRSA9IDB4MUEsCi19Ci0KLXBhY2tldCBMZUNvbnRyb2xGcmFtZSA6IEJhc2ljRnJhbWUgKGNoYW5uZWxfaWQgPSAweDAwMDUpIHsKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgTGVDb250cm9sIHsKLSAgY29kZSA6IExlQ29tbWFuZENvZGUsCi0gIGlkZW50aWZpZXIgOiA4LCAvLyBNdXN0IGJlIG5vbi16ZXJvCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotCi1wYWNrZXQgTGVDb21tYW5kUmVqZWN0IDogTGVDb250cm9sIChjb2RlID0gQ09NTUFORF9SRUpFQ1QpIHsKLSAgcmVhc29uIDogQ29tbWFuZFJlamVjdFJlYXNvbiwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgTGVDb21tYW5kUmVqZWN0Tm90VW5kZXJzdG9vZCA6IExlQ29tbWFuZFJlamVjdCAocmVhc29uID0gQ09NTUFORF9OT1RfVU5ERVJTVE9PRCkgewotfQotCi1wYWNrZXQgTGVDb21tYW5kUmVqZWN0TXR1RXhjZWVkZWQgOiBMZUNvbW1hbmRSZWplY3QgKHJlYXNvbiA9IFNJR05BTElOR19NVFVfRVhDRUVERUQpIHsKLSAgYWN0dWFsX210dSA6IDE2LAotfQotCi1wYWNrZXQgTGVDb21tYW5kUmVqZWN0SW52YWxpZENpZCA6IExlQ29tbWFuZFJlamVjdCAocmVhc29uID0gSU5WQUxJRF9DSURfSU5fUkVRVUVTVCkgewotICBsb2NhbF9jaGFubmVsIDogMTYsIC8vIFJlbGF0aXZlIHRvIHRoZSBzZW5kZXIgb2YgdGhlIENvbW1hbmRSZWplY3QKLSAgcmVtb3RlX2NoYW5uZWwgOiAxNiwKLX0KLQotcGFja2V0IExlRGlzY29ubmVjdGlvblJlcXVlc3QgOiBMZUNvbnRyb2wgKGNvZGUgPSBESVNDT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgZGVzdGluYXRpb25fY2lkIDogMTYsCi0gIHNvdXJjZV9jaWQgOiAxNiwKLX0KLQotcGFja2V0IExlRGlzY29ubmVjdGlvblJlc3BvbnNlIDogTGVDb250cm9sIChjb2RlID0gRElTQ09OTkVDVElPTl9SRVNQT05TRSkgewotICBkZXN0aW5hdGlvbl9jaWQgOiAxNiwKLSAgc291cmNlX2NpZCA6IDE2LAotfQotCi1wYWNrZXQgQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlcXVlc3QgOiBMZUNvbnRyb2wgKGNvZGUgPSBDT05ORUNUSU9OX1BBUkFNRVRFUl9VUERBVEVfUkVRVUVTVCkgewotICBpbnRlcnZhbF9taW4gOiAxNiwKLSAgaW50ZXJ2YWxfbWF4IDogMTYsCi0gIHBlcmlwaGVyYWxfbGF0ZW5jeSA6IDE2LAotICB0aW1lb3V0X211bHRpcGxpZXIgOiAxNiwKLX0KLQotZW51bSBDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2VSZXN1bHQgOiAxNiB7Ci0gIEFDQ0VQVEVEID0gMCwKLSAgUkVKRUNURUQgPSAxLAotfQotCi1wYWNrZXQgQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlIDogTGVDb250cm9sIChjb2RlID0gQ09OTkVDVElPTl9QQVJBTUVURVJfVVBEQVRFX1JFU1BPTlNFKSB7Ci0gIHJlc3VsdCA6IENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVJlc3VsdCwKLX0KLQotcGFja2V0IExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVxdWVzdCA6IExlQ29udHJvbCAoY29kZSA9IExFX0NSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgbGVfcHNtIDogMTYsIC8vIDB4MDAwMS0weDAwN0YgRml4ZWQsIDB4MDA4MC0weDAwRkYgRHluYW1pYwotICBzb3VyY2VfY2lkIDogMTYsCi0gIG10dSA6IDE2LAotICBtcHMgOiAxNiwKLSAgaW5pdGlhbF9jcmVkaXRzIDogMTYsCi19Ci0KLWVudW0gTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCA6IDE2IHsKLSAgU1VDQ0VTUyA9IDB4MDAwMCwKLSAgTEVfUFNNX05PVF9TVVBQT1JURUQgPSAweDAwMDIsCi0gIE5PX1JFU09VUkNFU19BVkFJTEFCTEUgPSAweDAwMDQsCi0gIElOU1VGRklDSUVOVF9BVVRIRU5USUNBVElPTiA9IDB4MDAwNSwKLSAgSU5TVUZGSUNJRU5UX0FVVEhPUklaQVRJT04gPSAweDAwMDYsCi0gIElOU1VGRklDSUVOVF9FTkNSWVBUSU9OX0tFWV9TSVpFID0gMHgwMDA3LAotICBJTlNVRkZJQ0lFTlRfRU5DUllQVElPTiA9IDB4MDAwOCwKLSAgSU5WQUxJRF9TT1VSQ0VfQ0lEID0gMHgwMDA5LAotICBTT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEID0gMHgwMDBBLAotICBVTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUyA9IDB4MDAwQiwKLX0KLQotcGFja2V0IExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2UgOiBMZUNvbnRyb2wgKGNvZGUgPSBMRV9DUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVNQT05TRSkgewotICBkZXN0aW5hdGlvbl9jaWQgOiAxNiwKLSAgbXR1IDogMTYsCi0gIG1wcyA6IDE2LAotICBpbml0aWFsX2NyZWRpdHMgOiAxNiwKLSAgcmVzdWx0IDogTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCwKLX0KLQotcGFja2V0IExlRmxvd0NvbnRyb2xDcmVkaXQgOiBMZUNvbnRyb2wgKGNvZGUgPSBMRV9GTE9XX0NPTlRST0xfQ1JFRElUKSB7Ci0gIGNpZCA6IDE2LCAvLyBSZWNlaXZlcidzIGRlc3RpbmF0aW9uIENJRAotICBjcmVkaXRzIDogMTYsCi19Ci0KLXBhY2tldCBMZUVuaGFuY2VkQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVxdWVzdCA6IExlQ29udHJvbCAoY29kZSA9IENSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgc3BzbSA6IDE2LAotICBtdHUgOiAxNiwKLSAgbXBzIDogMTYsCi0gIGluaXRpYWxfY3JlZGl0cyA6IDE2LAotICBzb3VyY2VfY2lkIDogMTZbXSwKLX0KLQotcGFja2V0IExlRW5oYW5jZWRDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZSA6IExlQ29udHJvbCAoY29kZSA9IENSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFU1BPTlNFKSB7Ci0gIG10dSA6IDE2LAotICBtcHMgOiAxNiwKLSAgaW5pdGlhbF9jcmVkaXRzIDogMTYsCi0gIHJlc3VsdCA6IENyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LAotICBkZXN0aW5hdGlvbl9jaWQgOiAxNltdLAotfQotCi1wYWNrZXQgTGVFbmhhbmNlZENyZWRpdEJhc2VkUmVjb25maWd1cmVSZXF1ZXN0IDogTGVDb250cm9sIChjb2RlID0gQ1JFRElUX0JBU0VEX1JFQ09ORklHVVJFX1JFUVVFU1QpIHsKLSAgbXR1IDogMTYsCi0gIG1wcyA6IDE2LAotICBkZXN0aW5hdGlvbl9jaWQgOiAxNltdLAotfQotCi1wYWNrZXQgTGVFbmhhbmNlZENyZWRpdEJhc2VkUmVjb25maWd1cmVSZXNwb25zZSA6IExlQ29udHJvbCAoY29kZSA9IENSRURJVF9CQVNFRF9SRUNPTkZJR1VSRV9SRVNQT05TRSkgewotICByZXN1bHQ6IENyZWRpdEJhc2VkUmVjb25maWd1cmVSZXNwb25zZVJlc3VsdCwKLX0KZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2NlcnQvY2VydF9sZV9sMmNhcC5weSBiL2dkL2wyY2FwL2xlL2NlcnQvY2VydF9sZV9sMmNhcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2OTFhNi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9jZXJ0L2NlcnRfbGVfbDJjYXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IENsb3NhYmxlCi1mcm9tIGNlcnQuY2xvc2FibGUgaW1wb3J0IHNhZmVDbG9zZQotZnJvbSBjZXJ0LnB5X2xlX2FjbF9tYW5hZ2VyIGltcG9ydCBQeUxlQWNsTWFuYWdlcgotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1pbXBvcnQgYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBhcyBidF9wYWNrZXRzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGwyY2FwX3BhY2tldHMKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5sMmNhcF9wYWNrZXRzIGltcG9ydCBMZUNvbW1hbmRDb2RlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMubDJjYXBfcGFja2V0cyBpbXBvcnQgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdAotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRmlsdGVyaW5nRXZlbnRTdHJlYW0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IElFdmVudFN0cmVhbQotZnJvbSBjZXJ0Lm1hdGNoZXJzIGltcG9ydCBMMmNhcE1hdGNoZXJzCi1mcm9tIGNlcnQuY2FwdHVyZXMgaW1wb3J0IEwyY2FwQ2FwdHVyZXMKLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLQotCi1jbGFzcyBDZXJ0TGVMMmNhcENoYW5uZWwoSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UsIHNjaWQsIGRjaWQsIGFjbF9zdHJlYW0sIGFjbCwgY29udHJvbF9jaGFubmVsLCBpbml0aWFsX2NyZWRpdHM9MCk6Ci0gICAgICAgIHNlbGYuX2RldmljZSA9IGRldmljZQotICAgICAgICBzZWxmLl9zY2lkID0gc2NpZAotICAgICAgICBzZWxmLl9kY2lkID0gZGNpZAotICAgICAgICBzZWxmLl9hY2xfc3RyZWFtID0gYWNsX3N0cmVhbQotICAgICAgICBzZWxmLl9hY2wgPSBhY2wKLSAgICAgICAgc2VsZi5fY29udHJvbF9jaGFubmVsID0gY29udHJvbF9jaGFubmVsCi0gICAgICAgIHNlbGYuX291cl9hY2xfdmlldyA9IEZpbHRlcmluZ0V2ZW50U3RyZWFtKGFjbF9zdHJlYW0sIEwyY2FwTWF0Y2hlcnMuRXh0cmFjdEJhc2ljRnJhbWUoc2NpZCkpCi0gICAgICAgIHNlbGYuX2NyZWRpdHNfbGVmdCA9IGluaXRpYWxfY3JlZGl0cwotCi0gICAgZGVmIGdldF9ldmVudF9xdWV1ZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX291cl9hY2xfdmlldy5nZXRfZXZlbnRfcXVldWUoKQotCi0gICAgZGVmIHNlbmQoc2VsZiwgcGFja2V0KToKLSAgICAgICAgZnJhbWUgPSBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVCdWlsZGVyKHNlbGYuX2RjaWQsIHBhY2tldCkKLSAgICAgICAgc2VsZi5fYWNsLnNlbmQoZnJhbWUuU2VyaWFsaXplKCkpCi0gICAgICAgIHNlbGYuX2NyZWRpdHNfbGVmdCAtPSAxCi0KLSAgICBkZWYgc2VuZF9maXJzdF9sZV9pX2ZyYW1lKHNlbGYsIHNkdV9zaXplLCBwYWNrZXQpOgotICAgICAgICBmcmFtZSA9IGwyY2FwX3BhY2tldHMuRmlyc3RMZUluZm9ybWF0aW9uRnJhbWVCdWlsZGVyKHNlbGYuX2RjaWQsIHNkdV9zaXplLCBwYWNrZXQpCi0gICAgICAgIHNlbGYuX2FjbC5zZW5kKGZyYW1lLlNlcmlhbGl6ZSgpKQotICAgICAgICBzZWxmLl9jcmVkaXRzX2xlZnQgLT0gMQotCi0gICAgZGVmIGRpc2Nvbm5lY3RfYW5kX3ZlcmlmeShzZWxmKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9zY2lkKS5pc05vdEVxdWFsVG8oMSkKLSAgICAgICAgc2VsZi5fY29udHJvbF9jaGFubmVsLnNlbmQobDJjYXBfcGFja2V0cy5MZURpc2Nvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcigxLCBzZWxmLl9kY2lkLCBzZWxmLl9zY2lkKSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2NvbnRyb2xfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5MZURpc2Nvbm5lY3Rpb25SZXNwb25zZShzZWxmLl9zY2lkLCBzZWxmLl9kY2lkKSkKLQotICAgIGRlZiB2ZXJpZnlfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2NvbnRyb2xfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5MZURpc2Nvbm5lY3Rpb25SZXF1ZXN0KHNlbGYuX2RjaWQsIHNlbGYuX3NjaWQpKQotCi0gICAgZGVmIHNlbmRfY3JlZGl0cyhzZWxmLCBudW1fY3JlZGl0cyk6Ci0gICAgICAgIHNlbGYuX2NvbnRyb2xfY2hhbm5lbC5zZW5kKGwyY2FwX3BhY2tldHMuTGVGbG93Q29udHJvbENyZWRpdEJ1aWxkZXIoMiwgc2VsZi5fc2NpZCwgbnVtX2NyZWRpdHMpKQotCi0gICAgZGVmIGNyZWRpdHNfbGVmdChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWRpdHNfbGVmdAotCi0KLWNsYXNzIENlcnRMZUwyY2FwKENsb3NhYmxlKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UpOgotICAgICAgICBzZWxmLl9kZXZpY2UgPSBkZXZpY2UKLSAgICAgICAgc2VsZi5fbGVfYWNsX21hbmFnZXIgPSBQeUxlQWNsTWFuYWdlcihkZXZpY2UpCi0gICAgICAgIHNlbGYuX2xlX2FjbCA9IE5vbmUKLQotICAgICAgICBzZWxmLmNvbnRyb2xfdGFibGUgPSB7Ci0gICAgICAgICAgICBMZUNvbW1hbmRDb2RlLkRJU0NPTk5FQ1RJT05fUkVRVUVTVDogc2VsZi5fb25fZGlzY29ubmVjdGlvbl9yZXF1ZXN0X2RlZmF1bHQsCi0gICAgICAgICAgICBMZUNvbW1hbmRDb2RlLkRJU0NPTk5FQ1RJT05fUkVTUE9OU0U6IHNlbGYuX29uX2Rpc2Nvbm5lY3Rpb25fcmVzcG9uc2VfZGVmYXVsdCwKLSAgICAgICAgICAgIExlQ29tbWFuZENvZGUuTEVfRkxPV19DT05UUk9MX0NSRURJVDogc2VsZi5fb25fY3JlZGl0LAotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi5fY2lkX3RvX2NlcnRfY2hhbm5lbHMgPSB7fQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLl9sZV9hY2xfbWFuYWdlci5jbG9zZSgpCi0gICAgICAgIHNhZmVDbG9zZShzZWxmLl9sZV9hY2wpCi0KLSAgICBkZWYgY29ubmVjdF9sZV9hY2woc2VsZiwgcmVtb3RlX2FkZHIpOgotICAgICAgICBzZWxmLl9sZV9hY2wgPSBzZWxmLl9sZV9hY2xfbWFuYWdlci5jb25uZWN0X3RvX3JlbW90ZShyZW1vdGVfYWRkcikKLSAgICAgICAgc2VsZi5jb250cm9sX2NoYW5uZWwgPSBDZXJ0TGVMMmNhcENoYW5uZWwoCi0gICAgICAgICAgICBzZWxmLl9kZXZpY2UsIDUsIDUsIHNlbGYuX2dldF9hY2xfc3RyZWFtKCksIHNlbGYuX2xlX2FjbCwgY29udHJvbF9jaGFubmVsPU5vbmUpCi0gICAgICAgIHNlbGYuX2dldF9hY2xfc3RyZWFtKCkucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5faGFuZGxlX2NvbnRyb2xfcGFja2V0KQotCi0gICAgZGVmIHdhaXRfZm9yX2Nvbm5lY3Rpb24oc2VsZik6Ci0gICAgICAgIHNlbGYuX2xlX2FjbCA9IHNlbGYuX2xlX2FjbF9tYW5hZ2VyLndhaXRfZm9yX2Nvbm5lY3Rpb24oKQotICAgICAgICBzZWxmLmNvbnRyb2xfY2hhbm5lbCA9IENlcnRMZUwyY2FwQ2hhbm5lbCgKLSAgICAgICAgICAgIHNlbGYuX2RldmljZSwgNSwgNSwgc2VsZi5fZ2V0X2FjbF9zdHJlYW0oKSwgc2VsZi5fbGVfYWNsLCBjb250cm9sX2NoYW5uZWw9Tm9uZSkKLSAgICAgICAgc2VsZi5fZ2V0X2FjbF9zdHJlYW0oKS5yZWdpc3Rlcl9jYWxsYmFjayhzZWxmLl9oYW5kbGVfY29udHJvbF9wYWNrZXQpCi0KLSAgICBkZWYgb3Blbl9maXhlZF9jaGFubmVsKHNlbGYsIGNpZD00KToKLSAgICAgICAgY2hhbm5lbCA9IENlcnRMZUwyY2FwQ2hhbm5lbChzZWxmLl9kZXZpY2UsIGNpZCwgY2lkLCBzZWxmLl9nZXRfYWNsX3N0cmVhbSgpLCBzZWxmLl9sZV9hY2wsIE5vbmUsIDApCi0gICAgICAgIHJldHVybiBjaGFubmVsCi0KLSAgICBkZWYgb3Blbl9jaGFubmVsKHNlbGYsIHNpZ25hbF9pZCwgcHNtLCBzY2lkLCBtdHU9MTAwMCwgbXBzPTEwMCwgaW5pdGlhbF9jcmVkaXQ9Nik6Ci0gICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsLnNlbmQoCi0gICAgICAgICAgICBsMmNhcF9wYWNrZXRzLkxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXIoc2lnbmFsX2lkLCBwc20sIHNjaWQsIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdCkpCi0KLSAgICAgICAgcmVzcG9uc2UgPSBMMmNhcENhcHR1cmVzLkNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNvbnRyb2xfY2hhbm5lbCkuZW1pdHMocmVzcG9uc2UpCi0gICAgICAgIGNoYW5uZWwgPSBDZXJ0TGVMMmNhcENoYW5uZWwoc2VsZi5fZGV2aWNlLCBzY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldCgpLkdldERlc3RpbmF0aW9uQ2lkKCksIHNlbGYuX2dldF9hY2xfc3RyZWFtKCksIHNlbGYuX2xlX2FjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXQoKS5HZXRJbml0aWFsQ3JlZGl0cygpKQotICAgICAgICBzZWxmLl9jaWRfdG9fY2VydF9jaGFubmVsc1tzY2lkXSA9IGNoYW5uZWwKLSAgICAgICAgcmV0dXJuIGNoYW5uZWwKLQotICAgIGRlZiBvcGVuX2NoYW5uZWxfd2l0aF9leHBlY3RlZF9yZXN1bHQoc2VsZiwgcHNtPTB4MzMsIHJlc3VsdD1MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LlNVQ0NFU1MpOgotICAgICAgICBzZWxmLmNvbnRyb2xfY2hhbm5lbC5zZW5kKGwyY2FwX3BhY2tldHMuTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcigxLCBwc20sIDB4NDAsIDEwMDAsIDEwMCwgNikpCi0KLSAgICAgICAgcmVzcG9uc2UgPSBMMmNhcE1hdGNoZXJzLkNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlKHJlc3VsdCkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNvbnRyb2xfY2hhbm5lbCkuZW1pdHMocmVzcG9uc2UpCi0KLSAgICBkZWYgdmVyaWZ5X2FuZF9yZXNwb25kX29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZShzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbT0weDMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LlNVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyX3NjaWQ9Tm9uZSk6Ci0gICAgICAgIHJlcXVlc3QgPSBMMmNhcENhcHR1cmVzLkNyZWRpdEJhc2VkQ29ubmVjdGlvblJlcXVlc3QocHNtKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY29udHJvbF9jaGFubmVsKS5lbWl0cyhyZXF1ZXN0KQotICAgICAgICAoc2NpZCwgZGNpZCkgPSBzZWxmLl9yZXNwb25kX2Nvbm5lY3Rpb25fcmVxdWVzdF9kZWZhdWx0KHJlcXVlc3QuZ2V0KCksIHJlc3VsdCwgb3VyX3NjaWQpCi0gICAgICAgIGNoYW5uZWwgPSBDZXJ0TGVMMmNhcENoYW5uZWwoc2VsZi5fZGV2aWNlLCBzY2lkLCBkY2lkLCBzZWxmLl9nZXRfYWNsX3N0cmVhbSgpLCBzZWxmLl9sZV9hY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXQoKS5HZXRJbml0aWFsQ3JlZGl0cygpKQotICAgICAgICBzZWxmLl9jaWRfdG9fY2VydF9jaGFubmVsc1tzY2lkXSA9IGNoYW5uZWwKLSAgICAgICAgcmV0dXJuIGNoYW5uZWwKLQotICAgIGRlZiB2ZXJpZnlfYW5kX3JlamVjdF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUoc2VsZiwgcHNtPTB4MzMpOgotICAgICAgICByZXF1ZXN0ID0gTDJjYXBDYXB0dXJlcy5DcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0KHBzbSkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNvbnRyb2xfY2hhbm5lbCkuZW1pdHMocmVxdWVzdCkKLSAgICAgICAgc2lkID0gcmVxdWVzdC5nZXQoKS5HZXRJZGVudGlmaWVyKCkKLSAgICAgICAgcmVqZWN0ID0gbDJjYXBfcGFja2V0cy5MZUNvbW1hbmRSZWplY3ROb3RVbmRlcnN0b29kQnVpbGRlcihzaWQpCi0gICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsLnNlbmQocmVqZWN0KQotCi0gICAgZGVmIHZlcmlmeV9sZV9mbG93X2NvbnRyb2xfY3JlZGl0KHNlbGYsIGNoYW5uZWwpOgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY29udHJvbF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkxlRmxvd0NvbnRyb2xDcmVkaXQoY2hhbm5lbC5fZGNpZCkpCi0KLSAgICBkZWYgX3Jlc3BvbmRfY29ubmVjdGlvbl9yZXF1ZXN0X2RlZmF1bHQoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PUxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQuU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyX3NjaWQ9Tm9uZSk6Ci0gICAgICAgIHNpZCA9IHJlcXVlc3QuR2V0SWRlbnRpZmllcigpCi0gICAgICAgIHRoZWlyX3NjaWQgPSByZXF1ZXN0LkdldFNvdXJjZUNpZCgpCi0gICAgICAgIG10dSA9IHJlcXVlc3QuR2V0TXR1KCkKLSAgICAgICAgbXBzID0gcmVxdWVzdC5HZXRNcHMoKQotICAgICAgICBpbml0aWFsX2NyZWRpdHMgPSByZXF1ZXN0LkdldEluaXRpYWxDcmVkaXRzKCkKLSAgICAgICAgIyBJZiBvdXJfc2NpZCBpcyBub3Qgc3BlY2lmaWVkLCB3ZSB1c2UgdGhlIHNhbWUgdmFsdWUgLSB0aGVpciBzY2lkIGFzIHRoZWlyIHNjaWQKLSAgICAgICAgaWYgb3VyX3NjaWQgaXMgTm9uZToKLSAgICAgICAgICAgIG91cl9zY2lkID0gdGhlaXJfc2NpZAotICAgICAgICBvdXJfZGNpZCA9IHRoZWlyX3NjaWQKLSAgICAgICAgcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VCdWlsZGVyKHNpZCwgb3VyX3NjaWQsIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpCi0gICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsLnNlbmQocmVzcG9uc2UpCi0gICAgICAgIHJldHVybiAob3VyX3NjaWQsIG91cl9kY2lkKQotCi0gICAgZGVmIGdldF9jb250cm9sX2NoYW5uZWwoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmNvbnRyb2xfY2hhbm5lbAotCi0gICAgZGVmIF9nZXRfYWNsX3N0cmVhbShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2xlX2FjbC5hY2xfc3RyZWFtCi0KLSAgICBkZWYgX29uX2Rpc2Nvbm5lY3Rpb25fcmVxdWVzdF9kZWZhdWx0KHNlbGYsIHJlcXVlc3QpOgotICAgICAgICBkaXNjb25uZWN0aW9uX3JlcXVlc3QgPSBsMmNhcF9wYWNrZXRzLkxlRGlzY29ubmVjdGlvblJlcXVlc3RWaWV3KHJlcXVlc3QpCi0gICAgICAgIHNpZCA9IGRpc2Nvbm5lY3Rpb25fcmVxdWVzdC5HZXRJZGVudGlmaWVyKCkKLSAgICAgICAgc2NpZCA9IGRpc2Nvbm5lY3Rpb25fcmVxdWVzdC5HZXRTb3VyY2VDaWQoKQotICAgICAgICBkY2lkID0gZGlzY29ubmVjdGlvbl9yZXF1ZXN0LkdldERlc3RpbmF0aW9uQ2lkKCkKLSAgICAgICAgcmVzcG9uc2UgPSBsMmNhcF9wYWNrZXRzLkxlRGlzY29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcihzaWQsIGRjaWQsIHNjaWQpCi0gICAgICAgIHNlbGYuY29udHJvbF9jaGFubmVsLnNlbmQocmVzcG9uc2UpCi0KLSAgICBkZWYgX29uX2Rpc2Nvbm5lY3Rpb25fcmVzcG9uc2VfZGVmYXVsdChzZWxmLCByZXF1ZXN0KToKLSAgICAgICAgZGlzY29ubmVjdGlvbl9yZXNwb25zZSA9IGwyY2FwX3BhY2tldHMuTGVEaXNjb25uZWN0aW9uUmVzcG9uc2VWaWV3KHJlcXVlc3QpCi0KLSAgICBkZWYgX29uX2NyZWRpdChzZWxmLCBsMmNhcF9sZV9jb250cm9sX3ZpZXcpOgotICAgICAgICBjcmVkaXRfdmlldyA9IGwyY2FwX3BhY2tldHMuTGVGbG93Q29udHJvbENyZWRpdFZpZXcobDJjYXBfbGVfY29udHJvbF92aWV3KQotICAgICAgICBjaWQgPSBjcmVkaXRfdmlldy5HZXRDaWQoKQotICAgICAgICBpZiBjaWQgbm90IGluIHNlbGYuX2NpZF90b19jZXJ0X2NoYW5uZWxzOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuX2NpZF90b19jZXJ0X2NoYW5uZWxzW2NpZF0uX2NyZWRpdHNfbGVmdCArPSBjcmVkaXRfdmlldy5HZXRDcmVkaXRzKCkKLQotICAgIGRlZiBfaGFuZGxlX2NvbnRyb2xfcGFja2V0KHNlbGYsIGwyY2FwX3BhY2tldCk6Ci0gICAgICAgIHBhY2tldF9ieXRlcyA9IGwyY2FwX3BhY2tldC5wYXlsb2FkCi0gICAgICAgIGwyY2FwX3ZpZXcgPSBsMmNhcF9wYWNrZXRzLkJhc2ljRnJhbWVWaWV3KGJ0X3BhY2tldHMuUGFja2V0Vmlld0xpdHRsZUVuZGlhbihsaXN0KHBhY2tldF9ieXRlcykpKQotICAgICAgICBpZiBsMmNhcF92aWV3LkdldENoYW5uZWxJZCgpICE9IDU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgcmVxdWVzdCA9IGwyY2FwX3BhY2tldHMuTGVDb250cm9sVmlldyhsMmNhcF92aWV3LkdldFBheWxvYWQoKSkKLSAgICAgICAgZm4gPSBzZWxmLmNvbnRyb2xfdGFibGUuZ2V0KHJlcXVlc3QuR2V0Q29kZSgpKQotICAgICAgICBpZiBmbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGZuKHJlcXVlc3QpCi0gICAgICAgIHJldHVybgpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvY2VydC9kdWFsX2wyY2FwX3Rlc3QucHkgYi9nZC9sMmNhcC9sZS9jZXJ0L2R1YWxfbDJjYXBfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzNmI0Mi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9jZXJ0L2R1YWxfbDJjYXBfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIGwyY2FwLmxlLmNlcnQuZHVhbF9sMmNhcF90ZXN0X2xpYiBpbXBvcnQgRHVhbEwyY2FwVGVzdEJhc2UKLQotCi1jbGFzcyBEdWFsTDJjYXBUZXN0KEdkQmFzZVRlc3RDbGFzcywgRHVhbEwyY2FwVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nTDJDQVAnLCBjZXJ0X21vZHVsZT0nSENJX0lOVEVSRkFDRVMnKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIER1YWxMMmNhcFRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICBEdWFsTDJjYXBUZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9jZXJ0L2R1YWxfbDJjYXBfdGVzdF9saWIucHkgYi9nZC9sMmNhcC9sZS9jZXJ0L2R1YWxfbDJjYXBfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOWI0N2EuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvY2VydC9kdWFsX2wyY2FwX3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGNlcnQucHlfbDJjYXAgaW1wb3J0IFB5TGVMMmNhcCwgUHlMMmNhcAotZnJvbSBjZXJ0Lm1hdGNoZXJzIGltcG9ydCBMMmNhcE1hdGNoZXJzCi1mcm9tIGNlcnQubWV0YWRhdGEgaW1wb3J0IG1ldGFkYXRhCi1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfYWNsX21hbmFnZXJfZmFjYWRlX3BiMiBhcyBsZV9hY2xfbWFuYWdlcl9mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGVfcGIyIGFzIGxlX2FkdmVydGlzaW5nX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGVfcGIyIGFzIGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZQotaW1wb3J0IGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgYXMgYnRfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cywgbDJjYXBfcGFja2V0cwotZnJvbSBsMmNhcC5jbGFzc2ljLmNlcnQuY2VydF9sMmNhcCBpbXBvcnQgQ2VydEwyY2FwCi1mcm9tIGwyY2FwLmxlLmNlcnQuY2VydF9sZV9sMmNhcCBpbXBvcnQgQ2VydExlTDJjYXAKLWZyb20gbmVpZ2hib3IuZmFjYWRlIGltcG9ydCBmYWNhZGVfcGIyIGFzIG5laWdoYm9yX2ZhY2FkZQotCi0jIEFzc2VtYmxlIGEgc2FtcGxlIHBhY2tldC4KLVNBTVBMRV9QQUNLRVQgPSBidF9wYWNrZXRzLlJhd0J1aWxkZXIoWzB4MTksIDB4MjYsIDB4MDgsIDB4MTddKQotCi0KLWNsYXNzIER1YWxMMmNhcFRlc3RCYXNlKCk6Ci0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmLCBkdXQsIGNlcnQpOgotICAgICAgICBzZWxmLmR1dCA9IGR1dAotICAgICAgICBzZWxmLmNlcnQgPSBjZXJ0Ci0KLSAgICAgICAgc2VsZi5kdXRfYWRkcmVzcyA9IHNlbGYuZHV0LmhjaV9jb250cm9sbGVyLkdldE1hY0FkZHJlc3NTaW1wbGUoKQotICAgICAgICBjZXJ0X2FkZHJlc3MgPSBjb21tb24uQmx1ZXRvb3RoQWRkcmVzcygKLSAgICAgICAgICAgIGFkZHJlc3M9c2VsZi5jZXJ0LmNvbnRyb2xsZXJfcmVhZF9vbmx5X3Byb3BlcnR5LlJlYWRMb2NhbEFkZHJlc3MoZW1wdHlfcHJvdG8uRW1wdHkoKSkuYWRkcmVzcykKLQotICAgICAgICBzZWxmLmR1dF9sMmNhcCA9IFB5TDJjYXAoc2VsZi5kdXQsIGNlcnRfYWRkcmVzcykKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwID0gQ2VydEwyY2FwKHNlbGYuY2VydCkKLSAgICAgICAgc2VsZi5kdXRfbGVfbDJjYXAgPSBQeUxlTDJjYXAoc2VsZi5kdXQpCi0gICAgICAgIHNlbGYuY2VydF9sZV9sMmNhcCA9IENlcnRMZUwyY2FwKHNlbGYuY2VydCkKLSAgICAgICAgc2VsZi5kdXRfbGVfYWRkcmVzcyA9IGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidEMDowNTowNDowMzowMjowMScpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKQotICAgICAgICBzZWxmLmNlcnRfYWRkcmVzcyA9IGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidDMDoxMTpGRjpBQTozMzoyMicpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKQotICAgICAgICBkdXRfcHJpdmFjeV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPXNlbGYuZHV0X2xlX2FkZHJlc3MsCi0gICAgICAgICAgICByb3RhdGlvbl9pcms9YidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJywKLSAgICAgICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZT0wLAotICAgICAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lPTApCi0gICAgICAgIHNlbGYuZHV0X2wyY2FwLl9kZXZpY2UuaGNpX2xlX2luaXRpYXRvcl9hZGRyZXNzLlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKGR1dF9wcml2YWN5X3BvbGljeSkKLSAgICAgICAgcHJpdmFjeV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPXNlbGYuY2VydF9hZGRyZXNzLAotICAgICAgICAgICAgcm90YXRpb25faXJrPWInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcsCi0gICAgICAgICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWU9MCwKLSAgICAgICAgICAgIG1heGltdW1fcm90YXRpb25fdGltZT0wKQotICAgICAgICBzZWxmLmNlcnRfbGVfbDJjYXAuX2RldmljZS5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MocHJpdmFjeV9wb2xpY3kpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5jZXJ0X2xlX2wyY2FwLmNsb3NlKCkKLSAgICAgICAgc2VsZi5kdXRfbGVfbDJjYXAuY2xvc2UoKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuY2xvc2UoKQotICAgICAgICBzZWxmLmR1dF9sMmNhcC5jbG9zZSgpCi0KLSAgICBkZWYgX3NldHVwX2FjbF9saW5rX2Zyb21fY2VydChzZWxmKToKLSAgICAgICAgc2VsZi5kdXQubmVpZ2hib3IuRW5hYmxlUGFnZVNjYW4obmVpZ2hib3JfZmFjYWRlLkVuYWJsZU1zZyhlbmFibGVkPVRydWUpKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuY29ubmVjdF9hY2woc2VsZi5kdXRfYWRkcmVzcykKLQotICAgIGRlZiBfc2V0dXBfbGVfbGlua19mcm9tX2NlcnQoc2VsZik6Ci0gICAgICAgICMgRFVUIEFkdmVydGlzZXMKLSAgICAgICAgZ2FwX25hbWUgPSBoY2lfcGFja2V0cy5HYXBEYXRhKCkKLSAgICAgICAgZ2FwX25hbWUuZGF0YV90eXBlID0gaGNpX3BhY2tldHMuR2FwRGF0YVR5cGUuQ09NUExFVEVfTE9DQUxfTkFNRQotICAgICAgICBnYXBfbmFtZS5kYXRhID0gbGlzdChieXRlcyhiJ0ltX1RoZV9EVVQnKSkKLSAgICAgICAgZ2FwX2RhdGEgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuR2FwRGF0YU1zZyhkYXRhPWJ5dGVzKGdhcF9uYW1lLlNlcmlhbGl6ZSgpKSkKLSAgICAgICAgY29uZmlnID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nQ29uZmlnKAotICAgICAgICAgICAgYWR2ZXJ0aXNlbWVudD1bZ2FwX2RhdGFdLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWluPTUxMiwKLSAgICAgICAgICAgIGludGVydmFsX21heD03NjgsCi0gICAgICAgICAgICBhZHZlcnRpc2luZ190eXBlPWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0V2ZW50VHlwZS5BRFZfSU5ELAotICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZT1jb21tb24uVVNFX1JBTkRPTV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgIGNoYW5uZWxfbWFwPTcsCi0gICAgICAgICAgICBmaWx0ZXJfcG9saWN5PWxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0ZpbHRlclBvbGljeS5BTExfREVWSUNFUykKLSAgICAgICAgcmVxdWVzdCA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5DcmVhdGVBZHZlcnRpc2VyUmVxdWVzdChjb25maWc9Y29uZmlnKQotICAgICAgICBjcmVhdGVfcmVzcG9uc2UgPSBzZWxmLmR1dC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5DcmVhdGVBZHZlcnRpc2VyKHJlcXVlc3QpCi0gICAgICAgIHNlbGYuY2VydF9sZV9sMmNhcC5jb25uZWN0X2xlX2FjbChzZWxmLmR1dF9sZV9hZGRyZXNzKQotCi0gICAgZGVmIF9vcGVuX2xlX2NvY19mcm9tX2R1dChzZWxmLCBwc209MHgzMywgb3VyX3NjaWQ9Tm9uZSk6Ci0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuZHV0X2xlX2wyY2FwLmNvbm5lY3RfY29jX3RvX2NlcnQoc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbSkKLSAgICAgICAgY2VydF9jaGFubmVsID0gc2VsZi5jZXJ0X2xlX2wyY2FwLnZlcmlmeV9hbmRfcmVzcG9uZF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUocHNtPXBzbSwgb3VyX3NjaWQ9b3VyX3NjaWQpCi0gICAgICAgIGR1dF9jaGFubmVsID0gcmVzcG9uc2VfZnV0dXJlLmdldF9jaGFubmVsKCkKLSAgICAgICAgcmV0dXJuIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKQotCi0gICAgZGVmIF9vcGVuX2NoYW5uZWxfZnJvbV9kdXQoc2VsZiwgcHNtPTB4MzMsIG91cl9zY2lkPU5vbmUpOgotICAgICAgICBkdXRfY2hhbm5lbF9mdXR1cmUgPSBzZWxmLmR1dF9sMmNhcC5jb25uZWN0X2R5bmFtaWNfY2hhbm5lbF90b19jZXJ0KHBzbSkKLSAgICAgICAgY2VydF9jaGFubmVsID0gc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9hbmRfcmVzcG9uZF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUocHNtPXBzbSwgc2NpZD1vdXJfc2NpZCkKLSAgICAgICAgZHV0X2NoYW5uZWwgPSBkdXRfY2hhbm5lbF9mdXR1cmUuZ2V0X2NoYW5uZWwoKQotCi0gICAgICAgIGNlcnRfY2hhbm5lbC52ZXJpZnlfY29uZmlndXJhdGlvbl9yZXF1ZXN0X2FuZF9yZXNwb25kKCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY29uZmlndXJlX3JlcXVlc3QoW10pCi0gICAgICAgIGNlcnRfY2hhbm5lbC52ZXJpZnlfY29uZmlndXJhdGlvbl9yZXNwb25zZSgpCi0KLSAgICAgICAgcmV0dXJuIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKQotCi0gICAgZGVmIF9vcGVuX3VuY29uZmlndXJlZF9jaGFubmVsX2Zyb21fY2VydChzZWxmLCBzaWduYWxfaWQ9MSwgc2NpZD0weDAxMDEsIHBzbT0weDMzKToKLQotICAgICAgICBkdXRfY2hhbm5lbCA9IHNlbGYuZHV0X2wyY2FwLnJlZ2lzdGVyX2R5bmFtaWNfY2hhbm5lbChwc20pCi0gICAgICAgIGNlcnRfY2hhbm5lbCA9IHNlbGYuY2VydF9sMmNhcC5vcGVuX2NoYW5uZWwoc2lnbmFsX2lkLCBwc20sIHNjaWQpCi0KLSAgICAgICAgcmV0dXJuIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKQotCi0gICAgZGVmIF9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHNlbGYsIHNpZ25hbF9pZD0xLCBzY2lkPTB4MDEwMSwgcHNtPTB4MzMpOgotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX3VuY29uZmlndXJlZF9jaGFubmVsX2Zyb21fY2VydChzaWduYWxfaWQsIHNjaWQsIHBzbSkKLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9jb25maWd1cmF0aW9uX3JlcXVlc3RfYW5kX3Jlc3BvbmQoKQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9jb25maWd1cmVfcmVxdWVzdChbXSkKLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9jb25maWd1cmF0aW9uX3Jlc3BvbnNlKCkKLQotICAgICAgICByZXR1cm4gKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpCi0KLSAgICBkZWYgX29wZW5fbGVfY29jX2Zyb21fY2VydChzZWxmLCBzaWduYWxfaWQ9MSwgc2NpZD0weDAxMDEsIHBzbT0weDM1LCBtdHU9MTAwMCwgbXBzPTEwMCwgaW5pdGlhbF9jcmVkaXQ9Nik6Ci0KLSAgICAgICAgZHV0X2NoYW5uZWwgPSBzZWxmLmR1dF9sZV9sMmNhcC5yZWdpc3Rlcl9jb2Moc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbSkKLSAgICAgICAgY2VydF9jaGFubmVsID0gc2VsZi5jZXJ0X2xlX2wyY2FwLm9wZW5fY2hhbm5lbChzaWduYWxfaWQsIHBzbSwgc2NpZCwgbXR1LCBtcHMsIGluaXRpYWxfY3JlZGl0KQotCi0gICAgICAgIHJldHVybiAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0lEL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJSZWNlaXZpbmcgRENJRCBvdmVyIEJSL0VEUiBhbmQgTEUiKQotICAgIGRlZiB0ZXN0X3JlY2VpdmluZ19kY2lkX292ZXJfYnJlZHJfYW5kX2xlKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVGVzdCB0aGF0IHRoZSBMMkNBUCBlbnRpdHkgY2FuIHJlY2VpdmUgdGhlIHNhbWUgRENJRCBpbiBMMkNBUCBjb25uZWN0IHJlc3BvbnNlcyBvbiBib3RoIHRoZQotICAgICAgICBCUi9FRFIgYW5kIExFIGxpbmtzLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfYWNsX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgIyBUT0RPOiBXZSBzaG91bGQgbGV0IExFIHVzZSBwdWJsaWMgYWRkcmVzcywgc2FtZSBhcyBjbGFzc2ljIGxpbmsuCi0gICAgICAgICMgVE9ETzogVXBkYXRlIEFjbE1hbmFnZXI6OmltcGw6OmNyZWF0ZV9sZV9jb25uZWN0aW9uCi0gICAgICAgIHNlbGYuX3NldHVwX2xlX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fZHV0KDB4MzMsIDB4NzApCi0gICAgICAgIChsZV9kdXRfY2hhbm5lbCwgbGVfY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fbGVfY29jX2Zyb21fZHV0KDB4MzUsIDB4NzApCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkRhdGEoYidhYmMnKSkKLQotICAgICAgICBsZV9kdXRfY2hhbm5lbC5zZW5kKGInaGVsbG8nKQotICAgICAgICBhc3NlcnRUaGF0KGxlX2NlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5GaXJzdExlSUZyYW1lKGInaGVsbG8nLCBzZHVfc2l6ZT01KSkKLQotICAgICAgICBsZV9jZXJ0X2NoYW5uZWwuc2VuZF9maXJzdF9sZV9pX2ZyYW1lKDQsIFNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGFzc2VydFRoYXQobGVfZHV0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFJhd0RhdGEoYidceDE5XHgyNlx4MDhceDE3JykpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLmRpc2Nvbm5lY3RfYW5kX3ZlcmlmeSgpCi0gICAgICAgIGxlX2NlcnRfY2hhbm5lbC5kaXNjb25uZWN0X2FuZF92ZXJpZnkoKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DSUQvQlYtMDItQyIsIHB0c190ZXN0X25hbWU9IlJlY2VpdmluZyBTQ0lEIG92ZXIgQlIvRURSIGFuZCBMRSIpCi0gICAgZGVmIHRlc3RfcmVjZWl2aW5nX3NjaWRfb3Zlcl9icmVkcl9hbmRfbGUoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBUZXN0IHRoYXQgdGhlIEwyQ0FQIGVudGl0eSBjYW4gcmVjZWl2ZSB0aGUgc2FtZSBTQ0lEIGluIEwyQ0FQIGNvbm5lY3QgcmVxdWVzdHMgb24gYm90aCB0aGUKLSAgICAgICAgQlIvRURSIGFuZCBMRSBsaW5rcy4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2FjbF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgICMgVE9ETzogV2Ugc2hvdWxkIGxldCBMRSB1c2UgcHVibGljIGFkZHJlc3MsIHNhbWUgYXMgY2xhc3NpYyBsaW5rLgotICAgICAgICAjIFRPRE86IFVwZGF0ZSBBY2xNYW5hZ2VyOjppbXBsOjpjcmVhdGVfbGVfY29ubmVjdGlvbgotICAgICAgICBzZWxmLl9zZXR1cF9sZV9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoMHgzMywgMHg3MCkKLSAgICAgICAgKGxlX2R1dF9jaGFubmVsLCBsZV9jZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9sZV9jb2NfZnJvbV9jZXJ0KDB4MzUsIDB4NzApCi0KLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2FiYycpCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkRhdGEoYidhYmMnKSkKLQotICAgICAgICBsZV9kdXRfY2hhbm5lbC5zZW5kKGInaGVsbG8nKQotICAgICAgICBhc3NlcnRUaGF0KGxlX2NlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5GaXJzdExlSUZyYW1lKGInaGVsbG8nLCBzZHVfc2l6ZT01KSkKLQotICAgICAgICBsZV9jZXJ0X2NoYW5uZWwuc2VuZF9maXJzdF9sZV9pX2ZyYW1lKDQsIFNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGFzc2VydFRoYXQobGVfZHV0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFJhd0RhdGEoYidceDE5XHgyNlx4MDhceDE3JykpCi0KLSAgICAgICAgY2VydF9jaGFubmVsLmRpc2Nvbm5lY3RfYW5kX3ZlcmlmeSgpCi0gICAgICAgIGxlX2NlcnRfY2hhbm5lbC5kaXNjb25uZWN0X2FuZF92ZXJpZnkoKQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvY2VydC9sZV9sMmNhcF90ZXN0LnB5IGIvZ2QvbDJjYXAvbGUvY2VydC9sZV9sMmNhcF90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM4NjA3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2NlcnQvbGVfbDJjYXBfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIGwyY2FwLmxlLmNlcnQubGVfbDJjYXBfdGVzdF9saWIgaW1wb3J0IExlTDJjYXBUZXN0QmFzZQotCi0KLWNsYXNzIExlTDJjYXBUZXN0KEdkQmFzZVRlc3RDbGFzcywgTGVMMmNhcFRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J0wyQ0FQJywgY2VydF9tb2R1bGU9J0hDSV9JTlRFUkZBQ0VTJykKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfdGVzdChzZWxmKQotICAgICAgICBMZUwyY2FwVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIExlTDJjYXBUZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9jZXJ0L2xlX2wyY2FwX3Rlc3RfbGliLnB5IGIvZ2QvbDJjYXAvbGUvY2VydC9sZV9sMmNhcF90ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzNGUxNi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9jZXJ0L2xlX2wyY2FwX3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTcwICswLDAgQEAKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LnRydXRoIGltcG9ydCBhc3NlcnRUaGF0Ci1mcm9tIGNlcnQucHlfbDJjYXAgaW1wb3J0IFB5TGVMMmNhcAotZnJvbSBjZXJ0Lm1hdGNoZXJzIGltcG9ydCBMMmNhcE1hdGNoZXJzCi1mcm9tIGNlcnQubWV0YWRhdGEgaW1wb3J0IG1ldGFkYXRhCi1mcm9tIGZhY2FkZSBpbXBvcnQgY29tbW9uX3BiMiBhcyBjb21tb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfYWNsX21hbmFnZXJfZmFjYWRlX3BiMiBhcyBsZV9hY2xfbWFuYWdlcl9mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcl9mYWNhZGVfcGIyIGFzIGxlX2FkdmVydGlzaW5nX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGVfcGIyIGFzIGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZQotaW1wb3J0IGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgYXMgYnRfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cywgbDJjYXBfcGFja2V0cwotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zLmwyY2FwX3BhY2tldHMgaW1wb3J0IExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQKLWZyb20gbDJjYXAubGUuY2VydC5jZXJ0X2xlX2wyY2FwIGltcG9ydCBDZXJ0TGVMMmNhcAotZnJvbSBsMmNhcC5sZS5mYWNhZGVfcGIyIGltcG9ydCBTZWN1cml0eUxldmVsCi0KLSMgQXNzZW1ibGUgYSBzYW1wbGUgcGFja2V0LgotU0FNUExFX1BBQ0tFVCA9IGJ0X3BhY2tldHMuUmF3QnVpbGRlcihbMHgxOSwgMHgyNiwgMHgwOCwgMHgxN10pCi0KLQotY2xhc3MgTGVMMmNhcFRlc3RCYXNlKCk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdMMkNBUCcsIGNlcnRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmLCBkdXQsIGNlcnQpOgotICAgICAgICBzZWxmLmR1dCA9IGR1dAotICAgICAgICBzZWxmLmNlcnQgPSBjZXJ0Ci0KLSAgICAgICAgc2VsZi5kdXRfbDJjYXAgPSBQeUxlTDJjYXAoc2VsZi5kdXQpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcCA9IENlcnRMZUwyY2FwKHNlbGYuY2VydCkKLSAgICAgICAgc2VsZi5kdXRfYWRkcmVzcyA9IGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidEMDowNTowNDowMzowMjowMScpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKQotICAgICAgICBzZWxmLmNlcnRfYWRkcmVzcyA9IGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidDMDoxMTpGRjpBQTozMzoyMicpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKQotICAgICAgICBkdXRfcHJpdmFjeV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPXNlbGYuZHV0X2FkZHJlc3MsCi0gICAgICAgICAgICByb3RhdGlvbl9pcms9YidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJywKLSAgICAgICAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZT0wLAotICAgICAgICAgICAgbWF4aW11bV9yb3RhdGlvbl90aW1lPTApCi0gICAgICAgIHNlbGYuZHV0X2wyY2FwLl9kZXZpY2UuaGNpX2xlX2luaXRpYXRvcl9hZGRyZXNzLlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKGR1dF9wcml2YWN5X3BvbGljeSkKLSAgICAgICAgcHJpdmFjeV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9TVEFUSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPXNlbGYuY2VydF9hZGRyZXNzLAotICAgICAgICAgICAgcm90YXRpb25faXJrPWInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcsCi0gICAgICAgICAgICBtaW5pbXVtX3JvdGF0aW9uX3RpbWU9MCwKLSAgICAgICAgICAgIG1heGltdW1fcm90YXRpb25fdGltZT0wKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuX2RldmljZS5oY2lfbGVfaW5pdGlhdG9yX2FkZHJlc3MuU2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3MocHJpdmFjeV9wb2xpY3kpCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLmNsb3NlKCkKLSAgICAgICAgc2VsZi5kdXRfbDJjYXAuY2xvc2UoKQotCi0gICAgZGVmIF9zZXR1cF9saW5rX2Zyb21fY2VydChzZWxmKToKLSAgICAgICAgIyBEVVQgQWR2ZXJ0aXNlcwotICAgICAgICBnYXBfbmFtZSA9IGhjaV9wYWNrZXRzLkdhcERhdGEoKQotICAgICAgICBnYXBfbmFtZS5kYXRhX3R5cGUgPSBoY2lfcGFja2V0cy5HYXBEYXRhVHlwZS5DT01QTEVURV9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fVGhlX0RVVCcpKQotICAgICAgICBnYXBfZGF0YSA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5HYXBEYXRhTXNnKGRhdGE9Ynl0ZXMoZ2FwX25hbWUuU2VyaWFsaXplKCkpKQotICAgICAgICBjb25maWcgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdDb25maWcoCi0gICAgICAgICAgICBhZHZlcnRpc2VtZW50PVtnYXBfZGF0YV0sCi0gICAgICAgICAgICBpbnRlcnZhbF9taW49NTEyLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWF4PTc2OCwKLSAgICAgICAgICAgIGFkdmVydGlzaW5nX3R5cGU9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRXZlbnRUeXBlLkFEVl9JTkQsCi0gICAgICAgICAgICBvd25fYWRkcmVzc190eXBlPWNvbW1vbi5VU0VfUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgY2hhbm5lbF9tYXA9NywKLSAgICAgICAgICAgIGZpbHRlcl9wb2xpY3k9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTKQotICAgICAgICByZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkNyZWF0ZUFkdmVydGlzZXJSZXF1ZXN0KGNvbmZpZz1jb25maWcpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuZHV0LmhjaV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLkNyZWF0ZUFkdmVydGlzZXIocmVxdWVzdCkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLmNvbm5lY3RfbGVfYWNsKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICBkZWYgX3NldF9saW5rX2Zyb21fZHV0X2FuZF9vcGVuX2NoYW5uZWwoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsX2lkPTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWQ9MHgwMTAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc209MHgzMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXR1PTEwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wcz0xMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfY3JlZGl0PTYpOgotICAgICAgICAjIENlcnQgQWR2ZXJ0aXNlcwotICAgICAgICBnYXBfbmFtZSA9IGhjaV9wYWNrZXRzLkdhcERhdGEoKQotICAgICAgICBnYXBfbmFtZS5kYXRhX3R5cGUgPSBoY2lfcGFja2V0cy5HYXBEYXRhVHlwZS5DT01QTEVURV9MT0NBTF9OQU1FCi0gICAgICAgIGdhcF9uYW1lLmRhdGEgPSBsaXN0KGJ5dGVzKGInSW1fVGhlX0RVVCcpKQotICAgICAgICBnYXBfZGF0YSA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5HYXBEYXRhTXNnKGRhdGE9Ynl0ZXMoZ2FwX25hbWUuU2VyaWFsaXplKCkpKQotICAgICAgICBjb25maWcgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdDb25maWcoCi0gICAgICAgICAgICBhZHZlcnRpc2VtZW50PVtnYXBfZGF0YV0sCi0gICAgICAgICAgICBpbnRlcnZhbF9taW49NTEyLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWF4PTc2OCwKLSAgICAgICAgICAgIGFkdmVydGlzaW5nX3R5cGU9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRXZlbnRUeXBlLkFEVl9JTkQsCi0gICAgICAgICAgICBvd25fYWRkcmVzc190eXBlPWNvbW1vbi5VU0VfUkFORE9NX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgY2hhbm5lbF9tYXA9NywKLSAgICAgICAgICAgIGZpbHRlcl9wb2xpY3k9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTKQotICAgICAgICByZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkNyZWF0ZUFkdmVydGlzZXJSZXF1ZXN0KGNvbmZpZz1jb25maWcpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY2VydC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5DcmVhdGVBZHZlcnRpc2VyKHJlcXVlc3QpCi0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfY29jX3RvX2NlcnQoc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbSkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLndhaXRfZm9yX2Nvbm5lY3Rpb24oKQotICAgICAgICAjIFRPRE86IEN1cnJlbnRseSB3ZSBjYW4gb25seSBjb25uZWN0IGJ5IHVzaW5nIER5bmFtaWMgY2hhbm5lbCBBUEkuIFVzZSBmaXhlZCBjaGFubmVsIGluc3RlYWQuCi0gICAgICAgIGNlcnRfY2hhbm5lbCA9IHNlbGYuY2VydF9sMmNhcC52ZXJpZnlfYW5kX3Jlc3BvbmRfb3Blbl9jaGFubmVsX2Zyb21fcmVtb3RlKHBzbSkKLSAgICAgICAgZHV0X2NoYW5uZWwgPSByZXNwb25zZV9mdXR1cmUuZ2V0X2NoYW5uZWwoKQotICAgICAgICByZXR1cm4gKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpCi0KLSAgICBkZWYgX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoc2VsZiwgc2lnbmFsX2lkPTEsIHNjaWQ9MHgwMTAxLCBwc209MHgzMywgbXR1PTEwMDAsIG1wcz0xMDAsIGluaXRpYWxfY3JlZGl0PTYpOgotCi0gICAgICAgIGR1dF9jaGFubmVsID0gc2VsZi5kdXRfbDJjYXAucmVnaXN0ZXJfY29jKHNlbGYuY2VydF9hZGRyZXNzLCBwc20pCi0gICAgICAgIGNlcnRfY2hhbm5lbCA9IHNlbGYuY2VydF9sMmNhcC5vcGVuX2NoYW5uZWwoc2lnbmFsX2lkLCBwc20sIHNjaWQsIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdCkKLQotICAgICAgICByZXR1cm4gKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpCi0KLSAgICBkZWYgX29wZW5fY2hhbm5lbF9mcm9tX2R1dChzZWxmLCBwc209MHgzMyk6Ci0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfY29jX3RvX2NlcnQoc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbSkKLSAgICAgICAgY2VydF9jaGFubmVsID0gc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9hbmRfcmVzcG9uZF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUocHNtKQotICAgICAgICBkdXRfY2hhbm5lbCA9IHJlc3BvbnNlX2Z1dHVyZS5nZXRfY2hhbm5lbCgpCi0gICAgICAgIHJldHVybiAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkKLQotICAgIGRlZiBfb3Blbl9maXhlZF9jaGFubmVsKHNlbGYsIGNpZD00KToKLSAgICAgICAgZHV0X2NoYW5uZWwgPSBzZWxmLmR1dF9sMmNhcC5nZXRfZml4ZWRfY2hhbm5lbChjaWQpCi0gICAgICAgIGNlcnRfY2hhbm5lbCA9IHNlbGYuY2VydF9sMmNhcC5vcGVuX2ZpeGVkX2NoYW5uZWwoY2lkKQotICAgICAgICByZXR1cm4gKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpCi0KLSAgICBkZWYgdGVzdF9maXhlZF9jaGFubmVsX3NlbmQoc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0X2wyY2FwLmVuYWJsZV9maXhlZF9jaGFubmVsKDQpCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9maXhlZF9jaGFubmVsKDQpCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidoZWxsbycgKiA0MCkKLSAgICAgICAgYXNzZXJ0VGhhdChjZXJ0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuRGF0YShiJ2hlbGxvJyAqIDQwKSkKLQotICAgIGRlZiB0ZXN0X2ZpeGVkX2NoYW5uZWxfcmVjZWl2ZShzZWxmKToKLSAgICAgICAgc2VsZi5kdXRfbDJjYXAuZW5hYmxlX2ZpeGVkX2NoYW5uZWwoNCkKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2ZpeGVkX2NoYW5uZWwoNCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmQoU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkUmF3RGF0YShiJ1x4MTlceDI2XHgwOFx4MTcnKSkKLQotICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZnJvbV9kdXRfYW5kX29wZW5fZHluYW1pY19jaGFubmVsKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgSW50ZXJuYWwgdGVzdCBmb3IgR0Qgc3RhY2sgb25seQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0X2xpbmtfZnJvbV9kdXRfYW5kX29wZW5fY2hhbm5lbCgpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NQVS9CVi0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VuZCBDb25uZWN0aW9uIFBhcmFtZXRlciBVcGRhdGUgUmVxdWVzdCIpCi0gICAgZGVmIHRlc3Rfc2VuZF9jb25uZWN0aW9uX3BhcmFtZXRlcl91cGRhdGVfcmVxdWVzdChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byBzZW5kIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlciB1cGRhdGUgUmVxdWVzdCB0byBMb3dlciBUZXN0ZXIgd2hlbiBhY3RpbmcgYXMgYSBwZXJpcGhlcmFsIGRldmljZS4KLSAgICAgICAgTk9URTogVGhpcyBpcyBhbiBvcHRpb25hbCBmZWF0dXJlLiBBbHNvIGlmIGJvdGggTEwgY2VudHJhbCBhbmQgcGVyaXBoZXJhbCBzdXBwb3J0cyA0LjErIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHVwZGF0ZSwgdGhpcyBzaG91bGQgaGFwcGVuIGluIExMIG9ubHksIG5vdCBMMkNBUAotICAgICAgICBOT1RFOiBDdXJyZW50bHkgd2UgbmVlZCB0byBlc3RhYmxpc2ggYXQgbGVhc3Qgb25lIGR5bmFtaWMgY2hhbm5lbCB0byBhbGxvdyB1cGRhdGUuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2R1dCgpCi0gICAgICAgIHNlbGYuZHV0X2wyY2FwLnVwZGF0ZV9jb25uZWN0aW9uX3BhcmFtZXRlcigpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoTDJjYXBNYXRjaGVycy5MZUNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0KCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NQVS9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iQWNjZXB0IENvbm5lY3Rpb24gUGFyYW1ldGVyIFVwZGF0ZSBSZXF1ZXN0IikKLSAgICBkZWYgdGVzdF9hY2NlcHRfY29ubmVjdGlvbl9wYXJhbWV0ZXJfdXBkYXRlX3JlcXVlc3Qoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gcmVjZWl2ZSBhbmQgaGFuZGxlIGEgcmVxdWVzdCBmb3IgY29ubmVjdGlvbiBwYXJhbWV0ZXIgdXBkYXRlIHdoZW4gYWN0aW5nIGFzIGEgY2VudHJhbCBkZXZpY2UuCi0gICAgICAgIE5PVEU6IEN1cnJlbnRseSB3ZSBuZWVkIHRvIGVzdGFibGlzaCBhdCBsZWFzdCBvbmUgZHluYW1pYyBjaGFubmVsIHRvIGFsbG93IHVwZGF0ZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldF9saW5rX2Zyb21fZHV0X2FuZF9vcGVuX2NoYW5uZWwoKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpLnNlbmQoCi0gICAgICAgICAgICBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0QnVpbGRlcigyLCAweDEwLCAweDEwLCAweDBhLCAweDY0KSkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpKS5lbWl0cygKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuTGVDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2UoCi0gICAgICAgICAgICAgICAgbDJjYXBfcGFja2V0cy5Db25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2VSZXN1bHQuQUNDRVBURUQpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DUFUvQkktMDEtQyIsIHB0c190ZXN0X25hbWU9IlJlamVjdCBDb25uZWN0aW9uIFBhcmFtZXRlciBVcGRhdGUgUGFyYW1ldGVycyIpCi0gICAgZGVmIHRlc3RfcmVqZWN0X2Nvbm5lY3Rpb25fcGFyYW1ldGVyX3VwZGF0ZV9wYXJhbWV0ZXJzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIHJlamVjdCBhIHJlcXVlc3QgZm9yIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHVwZGF0ZSB3aXRoIGlsbGVnYWwgcGFyYW1ldGVycy4KLSAgICAgICAgTk9URTogQ3VycmVudGx5IHdlIG5lZWQgdG8gZXN0YWJsaXNoIGF0IGxlYXN0IG9uZSBkeW5hbWljIGNoYW5uZWwgdG8gYWxsb3cgdXBkYXRlLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0X2xpbmtfZnJvbV9kdXRfYW5kX29wZW5fY2hhbm5lbCgpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkuc2VuZCgKLSAgICAgICAgICAgIGwyY2FwX3BhY2tldHMuQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlcXVlc3RCdWlsZGVyKDIsIDB4MTAsIDB4MTAsIDUxMiwgMHg2NCkpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLkxlQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlKAotICAgICAgICAgICAgICAgIGwyY2FwX3BhY2tldHMuQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlUmVzdWx0LlJFSkVDVEVEKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ1BVL0JJLTAyLUMiLCBwdHNfdGVzdF9uYW1lPSJSZWplY3QgQ29ubmVjdGlvbiBQYXJhbWV0ZXIgVXBkYXRlIFJlcXVlc3QiKQotICAgIGRlZiB0ZXN0X3JlamVjdF9jb25uZWN0aW9uX3BhcmFtZXRlcl91cGRhdGVfcmVxdWVzdChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byByZWplY3QgYSByZXF1ZXN0IGZvciBjb25uZWN0aW9uIHBhcmFtZXRlciB1cGRhdGUgaW4gcGVyaXBoZXJhbCBtb2RlLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpLnNlbmQoCi0gICAgICAgICAgICBsMmNhcF9wYWNrZXRzLkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0QnVpbGRlcigyLCAweDEwLCAweDEwLCAweDBhLCAweDY0KSkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkxlQ29tbWFuZFJlamVjdCgpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9DT1MvQ0ZDL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJTZWdtZW50YXRpb24iKQotICAgIGRlZiB0ZXN0X3NlZ21lbnRhdGlvbihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIHNlbmQgZGF0YSBzZWdtZW50cyB3aGljaCBhcmUgbGFyZ2VyIHRoYW4gdGhlIExFIGZyYW1lIHNpemUuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQobXR1PTEwMDAsIG1wcz0xMDIpCi0gICAgICAgIGR1dF9jaGFubmVsLnNlbmQoYidoZWxsbycgKiAyMCArIGInd29ybGQnKQotICAgICAgICAjIFRoZSBmaXJzdCBMZUluZm9ybWF0aW9uIHBhY2tldCBjb250YWlucyAyIGJ5dGVzIG9mIFNEVSBzaXplLgotICAgICAgICAjIFRoZSBwYWNrZXQgaXMgZGl2aWRlZCBpbnRvIGZpcnN0IDEwMCBieXRlcyBmcm9tICdoZWxsb2hlbGxvLi4uLicKLSAgICAgICAgIyBhbmQgcmVtYWluaW5nIDUgYnl0ZXMgJ3dvcmxkJwotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLkZpcnN0TGVJRnJhbWUoYidoZWxsbycgKiAyMCwgc2R1X3NpemU9MTA1KSwgTDJjYXBNYXRjaGVycy5EYXRhKGInd29ybGQnKSkuaW5PcmRlcigpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0NPUy9DRkMvQlYtMDItQyIsIHB0c190ZXN0X25hbWU9Ik5vIFNlZ21lbnRhdGlvbiIpCi0gICAgZGVmIHRlc3Rfbm9fc2VnbWVudGF0aW9uKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBjYW4gc2VuZCBkYXRhIHNlZ21lbnRzIHdoaWNoIGRvIG5vdCByZXF1aXJlIHNlZ21lbnRhdGlvbi4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fY2VydChtdHU9MTAwMCwgbXBzPTIwMikKLSAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2hlbGxvJyAqIDQwKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5GaXJzdExlSUZyYW1lKGInaGVsbG8nICogNDAsIHNkdV9zaXplPTIwMCkpCi0KLSAgICBkZWYgdGVzdF9ub19zZWdtZW50YXRpb25fZHV0X2lzX2NlbnRyYWwoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBMMkNBUC9DT1MvQ0ZDL0JWLTAyLUMKLSAgICAgICAgIiIiCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX3NldF9saW5rX2Zyb21fZHV0X2FuZF9vcGVuX2NoYW5uZWwoKQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInaGVsbG8nICogNDApCi0gICAgICAgIGFzc2VydFRoYXQoY2VydF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkZpcnN0TGVJRnJhbWUoYidoZWxsbycgKiA0MCwgc2R1X3NpemU9MjAwKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NGQy9CVi0wMy1DIiwgcHRzX3Rlc3RfbmFtZT0iUmVhc3NlbWJsaW5nIikKLSAgICBkZWYgdGVzdF9yZWFzc2VtYmxpbmcoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGNhbiBjb3JyZWN0bHkgcmVhc3NlbWJsZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIExvd2VyIFRlc3RlciB3aGljaCBpcyBncmVhdGVyIHRoYW4gdGhlIElVVCBMRS1mcmFtZSBzaXplLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLSAgICAgICAgc2R1X3NpemVfZm9yX3R3b19zYW1wbGVfcGFja2V0ID0gOAotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9maXJzdF9sZV9pX2ZyYW1lKHNkdV9zaXplX2Zvcl90d29fc2FtcGxlX3BhY2tldCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmQoU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkUmF3RGF0YShiJ1x4MTlceDI2XHgwOFx4MTcnICogMikpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0NPUy9DRkMvQlYtMDQtQyIsIHB0c190ZXN0X25hbWU9IkRhdGEgUmVjZWl2aW5nIikKLSAgICBkZWYgdGVzdF9kYXRhX3JlY2VpdmluZyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIHJlY2VpdmUgdW5zZWdtZW50ZWQgZGF0YSBjb3JyZWN0bHkuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotICAgICAgICBjZXJ0X2NoYW5uZWwuc2VuZF9maXJzdF9sZV9pX2ZyYW1lKDQsIFNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGFzc2VydFRoYXQoZHV0X2NoYW5uZWwpLmVtaXRzKEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFJhd0RhdGEoYidceDE5XHgyNlx4MDhceDE3JykpCi0KLSAgICBkZWYgdGVzdF9kYXRhX3JlY2VpdmluZ19kdXRfaXNfY2VudHJhbChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIEwyQ0FQL0NPUy9DRkMvQlYtMDQtQwotICAgICAgICAiIiIKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fc2V0X2xpbmtfZnJvbV9kdXRfYW5kX29wZW5fY2hhbm5lbCgpCi0gICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2ZpcnN0X2xlX2lfZnJhbWUoNCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkUmF3RGF0YShiJ1x4MTlceDI2XHgwOFx4MTcnKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvQ09TL0NGQy9CVi0wNS1DIiwgcHRzX3Rlc3RfbmFtZT0iTXVsdGlwbGUgQ2hhbm5lbHMgd2l0aCBJbnRlcmxlYXZlZCBEYXRhIFN0cmVhbXMiKQotICAgIGRlZiB0ZXN0X211bHRpcGxlX2NoYW5uZWxzX3dpdGhfaW50ZXJsZWF2ZWRfZGF0YV9zdHJlYW1zKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgYW4gSVVUIGNhbiBjcmVhdGUgbXVsdGlwbGUgY2hhbm5lbHMgYW5kIHJlY2VpdmVzIGRhdGEgc3RyZWFtcyBvbiB0aGUgY2hhbm5lbHMgd2hlbiB0aGUgc3RyZWFtcyBhcmUgaW50ZXJsZWF2ZWQuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbF94LCBjZXJ0X2NoYW5uZWxfeCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHNpZ25hbF9pZD0xLCBzY2lkPTB4MDEwMywgcHNtPTB4MzMpCi0gICAgICAgIChkdXRfY2hhbm5lbF95LCBjZXJ0X2NoYW5uZWxfeSkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHNpZ25hbF9pZD0yLCBzY2lkPTB4MDEwNSwgcHNtPTB4MzUpCi0gICAgICAgIChkdXRfY2hhbm5lbF96LCBjZXJ0X2NoYW5uZWxfeikgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHNpZ25hbF9pZD0zLCBzY2lkPTB4MDEwNywgcHNtPTB4MzcpCi0gICAgICAgIGNlcnRfY2hhbm5lbF95LnNlbmRfZmlyc3RfbGVfaV9mcmFtZSg0LCBTQU1QTEVfUEFDS0VUKQotICAgICAgICBjZXJ0X2NoYW5uZWxfei5zZW5kX2ZpcnN0X2xlX2lfZnJhbWUoNCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgY2VydF9jaGFubmVsX3kuc2VuZF9maXJzdF9sZV9pX2ZyYW1lKDQsIFNBTVBMRV9QQUNLRVQpCi0gICAgICAgIGNlcnRfY2hhbm5lbF96LnNlbmRfZmlyc3RfbGVfaV9mcmFtZSg0LCBTQU1QTEVfUEFDS0VUKQotICAgICAgICBjZXJ0X2NoYW5uZWxfeS5zZW5kX2ZpcnN0X2xlX2lfZnJhbWUoNCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgIyBUT0RPOiBXZSBzaG91bGQgYXNzZXJ0IHR3byBldmVudHMgaW4gb3JkZXIsIGJ1dCBpdCBnb3Qgc3R1Y2sKLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbF95KS5lbWl0cyhMMmNhcE1hdGNoZXJzLlBhY2tldFBheWxvYWRSYXdEYXRhKGInXHgxOVx4MjZceDA4XHgxNycpLCBhdF9sZWFzdF90aW1lcz0zKQotICAgICAgICBhc3NlcnRUaGF0KGR1dF9jaGFubmVsX3opLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5QYWNrZXRQYXlsb2FkUmF3RGF0YShiJ1x4MTlceDI2XHgwOFx4MTcnKSwKLSAgICAgICAgICAgIEwyY2FwTWF0Y2hlcnMuUGFja2V0UGF5bG9hZFJhd0RhdGEoYidceDE5XHgyNlx4MDhceDE3JykpLmluT3JkZXIoKQotICAgICAgICBjZXJ0X2NoYW5uZWxfei5zZW5kX2ZpcnN0X2xlX2lfZnJhbWUoNCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgYXNzZXJ0VGhhdChkdXRfY2hhbm5lbF96KS5lbWl0cyhMMmNhcE1hdGNoZXJzLlBhY2tldFBheWxvYWRSYXdEYXRhKGInXHgxOVx4MjZceDA4XHgxNycpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9SRUovQkktMDEtQyIsIHB0c190ZXN0X25hbWU9IlJlamVjdCBVbmtub3duIENvbW1hbmQgaW4gTEUgU2lnbmFsaW5nIENoYW5uZWwiKQotICAgIGRlZiB0ZXN0X3JlamVjdF91bmtub3duX2NvbW1hbmRfaW5fbGVfc2lnbGluZ19jaGFubmVsKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIHJlamVjdCB1bmtub3duIGNvbW1hbmQuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkuc2VuZCgKLSAgICAgICAgICAgIGwyY2FwX3BhY2tldHMuSW5mb3JtYXRpb25SZXF1ZXN0QnVpbGRlcigKLSAgICAgICAgICAgICAgICAyLCBsMmNhcF9wYWNrZXRzLkluZm9ybWF0aW9uUmVxdWVzdEluZm9UeXBlLkVYVEVOREVEX0ZFQVRVUkVTX1NVUFBPUlRFRCkpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoTDJjYXBNYXRjaGVycy5MZUNvbW1hbmRSZWplY3QoKSkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvTEUvUkVKL0JJLTAyLUMiLCBwdHNfdGVzdF9uYW1lPSJDb21tYW5kIFJlamVjdCDigJMgUmVzZXJ2ZWQgUERVIENvZGVzIikKLSAgICBkZWYgdGVzdF9jb21tYW5kX3JlamVjdF9yZXNlcnZlZF9wZHVfY29kZXMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCBhbiBJVVQgcmVjZWl2aW5nIGEgUERVIHdpdGggYSByZXNlcnZlZCBjb21tYW5kIGNvZGUgc2VuZHMgYSBjb21tYW5kIHJlamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKS5zZW5kKGwyY2FwX3BhY2tldHMuTW92ZUNoYW5uZWxSZXF1ZXN0QnVpbGRlcigyLCAwLCAwKSkKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfbDJjYXAuZ2V0X2NvbnRyb2xfY2hhbm5lbCgpKS5lbWl0cyhMMmNhcE1hdGNoZXJzLkxlQ29tbWFuZFJlamVjdCgpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMDEtQyIsIHB0c190ZXN0X25hbWU9IkxFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgLSBMZWdhY3kgUGVlciIpCi0gICAgZGVmIHRlc3RfbGVfY3JlZGl0X2Jhc2VkX2Nvbm5lY3Rpb25fcmVxdWVzdF9sZWdhY3lfcGVlcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCBzZW5kaW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgdG8gYSBsZWdhY3kgcGVlciBhbmQgcmVjZWl2aW5nIGEgQ29tbWFuZCBSZWplY3QgZG9lcyBub3QgZXN0YWJsaXNoIHRoZSBjaGFubmVsLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICByZXNwb25zZV9mdXR1cmUgPSBzZWxmLmR1dF9sMmNhcC5jb25uZWN0X2NvY190b19jZXJ0KHNlbGYuY2VydF9hZGRyZXNzLCBwc209MHgzMykKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9hbmRfcmVqZWN0X29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZShwc209MHgzMykKLSAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZV9mdXR1cmUuZ2V0X3N0YXR1cygpKS5pc05vdEVxdWFsVG8oTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5TVUNDRVNTKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JWLTAyLUMiLCBwdHNfdGVzdF9uYW1lPSJMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXF1ZXN0IG9uIFN1cHBvcnRlZCBMRV9QU00iKQotICAgIGRlZiB0ZXN0X2xlX2NyZWRpdF9iYXNlZF9jb25uZWN0aW9uX3JlcXVlc3Rfb25fc3VwcG9ydGVkX2xlX3BzbShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCBzZW5kaW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgdG8gYSBwZWVyIHdpbGwgZXN0YWJsaXNoIHRoZSBjaGFubmVsIHVwb24gcmVjZWl2aW5nIHRoZSBMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXNwb25zZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgKGR1dF9jaGFubmVsLCBjZXJ0X2NoYW5uZWwpID0gc2VsZi5fb3Blbl9jaGFubmVsX2Zyb21fZHV0KCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfZmlyc3RfbGVfaV9mcmFtZSg0LCBTQU1QTEVfUEFDS0VUKQotICAgICAgICBhc3NlcnRUaGF0KGR1dF9jaGFubmVsKS5lbWl0cyhMMmNhcE1hdGNoZXJzLlBhY2tldFBheWxvYWRSYXdEYXRhKGInXHgxOVx4MjZceDA4XHgxNycpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JWLTAzLUMiLCBwdHNfdGVzdF9uYW1lPSJMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXNwb25zZSBvbiBTdXBwb3J0ZWQgTEVfUFNNIikKLSAgICBkZWYgdGVzdF9jcmVkaXRfYmFzZWRfY29ubmVjdGlvbl9yZXNwb25zZV9vbl9zdXBwb3J0ZWRfbGVfcHNtKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgYW4gSVVUIHJlY2VpdmluZyBhIHZhbGlkIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgZnJvbSBhIHBlZXIgd2lsbCBzZW5kIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlc3BvbnNlIGFuZCBlc3RhYmxpc2ggdGhlIGNoYW5uZWwuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotICAgICAgICBkdXRfY2hhbm5lbC5zZW5kKGInaGVsbG8nKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5GaXJzdExlSUZyYW1lKGInaGVsbG8nLCBzZHVfc2l6ZT01KSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0wNC1DIiwgcHRzX3Rlc3RfbmFtZT0iTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVxdWVzdCBvbiBhbiBVbnN1cHBvcnRlZCBMRV9QU00iKQotICAgIGRlZiB0ZXN0X2NyZWRpdF9iYXNlZF9jb25uZWN0aW9uX3JlcXVlc3Rfb25fYW5fdW5zdXBwb3J0ZWRfbGVfcHNtKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgYW4gSVVUIHNlbmRpbmcgYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVxdWVzdCBvbiBhbiB1bnN1cHBvcnRlZCBMRV9QU00gd2lsbCBub3QgZXN0YWJsaXNoIGEgY2hhbm5lbCB1cG9uIHJlY2VpdmluZyBhbiBMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXNwb25zZSByZWZ1c2luZyB0aGUgY29ubmVjdGlvbi4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgcmVzcG9uc2VfZnV0dXJlID0gc2VsZi5kdXRfbDJjYXAuY29ubmVjdF9jb2NfdG9fY2VydChzZWxmLmNlcnRfYWRkcmVzcywgcHNtPTB4MzMpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC52ZXJpZnlfYW5kX3Jlc3BvbmRfb3Blbl9jaGFubmVsX2Zyb21fcmVtb3RlKAotICAgICAgICAgICAgcHNtPTB4MzMsIHJlc3VsdD1MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LkxFX1BTTV9OT1RfU1VQUE9SVEVEKQotICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlX2Z1dHVyZS5nZXRfc3RhdHVzKCkpLmlzRXF1YWxUbyhMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LkxFX1BTTV9OT1RfU1VQUE9SVEVEKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JWLTA1LUMiLCBwdHNfdGVzdF9uYW1lPSJMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXF1ZXN0IC0gdW5zdXBwb3J0ZWQgTEVfUFNNIikKLSAgICBkZWYgdGVzdF9jcmVkaXRfYmFzZWRfY29ubmVjdGlvbl9yZXF1ZXN0X3Vuc3VwcG9ydGVkX2xlX3BzbShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCByZWNlaXZpbmcgYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVxdWVzdCBvbiBhbiB1bnN1cHBvcnRlZCBMRV9QU00gd2lsbCByZXNwb25kIHdpdGggYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVzcG9uc2UgcmVmdXNpbmcgdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkuc2VuZCgKLSAgICAgICAgICAgIGwyY2FwX3BhY2tldHMuTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcigxLCAweDM0LCAweDAxMDEsIDIwMDAsIDEwMDAsIDEwMDApKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9sMmNhcC5nZXRfY29udHJvbF9jaGFubmVsKCkpLmVtaXRzKAotICAgICAgICAgICAgTDJjYXBNYXRjaGVycy5DcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZSgKLSAgICAgICAgICAgICAgICByZXN1bHQ9TGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5MRV9QU01fTk9UX1NVUFBPUlRFRCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0wNi1DIiwgcHRzX3Rlc3RfbmFtZT0iQ3JlZGl0IEV4Y2hhbmdlIOKAkyBSZWNlaXZpbmcgSW5jcmVtZW50YWwgQ3JlZGl0cyIpCi0gICAgZGVmIHRlc3RfY3JlZGl0X2V4Y2hhbmdlX3JlY2VpdmluZ19pbmNyZW1lbnRhbF9jcmVkaXRzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoZSBJVVQgaGFuZGxlcyBmbG93IGNvbnRyb2wgY29ycmVjdGx5LCBieSBoYW5kbGluZyB0aGUgTEUgRmxvdyBDb250cm9sIENyZWRpdCBzZW50IGJ5IHRoZSBwZWVyLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KGluaXRpYWxfY3JlZGl0PTApCi0gICAgICAgIGZvciBfIGluIHJhbmdlKDQpOgotICAgICAgICAgICAgZHV0X2NoYW5uZWwuc2VuZChiJ2hlbGxvJykKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY3JlZGl0cygxKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5GaXJzdExlSUZyYW1lKGInaGVsbG8nLCBzZHVfc2l6ZT01KSkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY3JlZGl0cygxKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoTDJjYXBNYXRjaGVycy5GaXJzdExlSUZyYW1lKGInaGVsbG8nLCBzZHVfc2l6ZT01KSkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY3JlZGl0cygyKQotICAgICAgICBhc3NlcnRUaGF0KGNlcnRfY2hhbm5lbCkuZW1pdHMoCi0gICAgICAgICAgICBMMmNhcE1hdGNoZXJzLkZpcnN0TGVJRnJhbWUoYidoZWxsbycsIHNkdV9zaXplPTUpLCBMMmNhcE1hdGNoZXJzLkZpcnN0TGVJRnJhbWUoYidoZWxsbycsIHNkdV9zaXplPTUpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMDctQyIsIHB0c190ZXN0X25hbWU9IkNyZWRpdCBFeGNoYW5nZSDigJMgU2VuZGluZyBDcmVkaXRzIikKLSAgICBkZWYgdGVzdF9jcmVkaXRfZXhjaGFuZ2Vfc2VuZGluZ19jcmVkaXRzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBzZW5kcyBMRSBGbG93IENvbnRyb2wgQ3JlZGl0IHRvIHRoZSBwZWVyLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLSAgICAgICAgY3JlZGl0cyA9IGNlcnRfY2hhbm5lbC5jcmVkaXRzX2xlZnQoKQotICAgICAgICAjIE5vdGU6IERVVCBvbmx5IG5lZWRzIHRvIHNlbmQgY3JlZGl0IHdoZW4gQUxMIGNyZWRpdHMgYXJlIGNvbnN1bWVkLgotICAgICAgICAjIEhlcmUgd2UgZW5mb3JjZSB0aGF0IERVVCBzZW5kcyBjcmVkaXQgYWZ0ZXIgcmVjZWl2aW5nIDMgcGFja2V0cywgdG8KLSAgICAgICAgIyB0ZXN0IHdpdGhvdXQgc2VuZGluZyB0b28gbWFueSBwYWNrZXRzIChtYXkgdGFrZSB0b28gbG9uZykuCi0gICAgICAgICMgVGhpcyBiZWhhdmlvciBpcyBub3QgZXhwZWN0ZWQgZm9yIGFsbCBCbHVldG9vdGggc3RhY2tzLgotICAgICAgICBmb3IgXyBpbiByYW5nZShtaW4oY3JlZGl0cyArIDEsIDMpKToKLSAgICAgICAgICAgIGNlcnRfY2hhbm5lbC5zZW5kX2ZpcnN0X2xlX2lfZnJhbWUoNCwgU0FNUExFX1BBQ0tFVCkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9sZV9mbG93X2NvbnRyb2xfY3JlZGl0KGNlcnRfY2hhbm5lbCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JWLTA4LUMiLCBwdHNfdGVzdF9uYW1lPSJEaXNjb25uZWN0aW9uIFJlcXVlc3QiKQotICAgIGRlZiB0ZXN0X2Rpc2Nvbm5lY3Rpb25fcmVxdWVzdChzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgY2FuIGRpc2Nvbm5lY3QgdGhlIGNoYW5uZWwuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotICAgICAgICBkdXRfY2hhbm5lbC5jbG9zZV9jaGFubmVsKCkKLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9kaXNjb25uZWN0X3JlcXVlc3QoKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMDktQyIsIHB0c190ZXN0X25hbWU9IkRpc2Nvbm5lY3Rpb24gUmVzcG9uc2UiKQotICAgIGRlZiB0ZXN0X2Rpc2Nvbm5lY3Rpb25fcmVzcG9uc2Uoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHJlc3BvbmRzIGNvcnJlY3RseSB0byByZWNlcHRpb24gb2YgYSBEaXNjb25uZWN0aW9uIFJlcXVlc3QuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIChkdXRfY2hhbm5lbCwgY2VydF9jaGFubmVsKSA9IHNlbGYuX29wZW5fY2hhbm5lbF9mcm9tX2NlcnQoKQotICAgICAgICBjZXJ0X2NoYW5uZWwuZGlzY29ubmVjdF9hbmRfdmVyaWZ5KCkKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JWLTEwLUMiLCBwdHNfdGVzdF9uYW1lPSJTZWN1cml0eSAtIEluc3VmZmljaWVudCBBdXRoZW50aWNhdGlvbiDigJMgSW5pdGlhdG9yIikKLSAgICBkZWYgdGVzdF9zZWN1cml0eV9pbnN1ZmZpY2llbnRfYXV0aGVudGljYXRpb25faW5pdGlhdG9yKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBkb2VzIG5vdCBlc3RhYmxpc2ggdGhlIGNoYW5uZWwgdXBvbiByZWNlaXB0IG9mIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlc3BvbnNlIGluZGljYXRpbmcgdGhlIGNvbm5lY3Rpb24gd2FzIHJlZnVzZWQgd2l0aCBSZXN1bHQg4oCcMHgwMDA1IOKAkyBDb25uZWN0aW9uIFJlZnVzZWQg4oCTIEluc3VmZmljaWVudCBBdXRoZW50aWNhdGlvbiIuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfY29jX3RvX2NlcnQoc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbT0weDMzKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAudmVyaWZ5X2FuZF9yZXNwb25kX29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZSgKLSAgICAgICAgICAgIHBzbT0weDMzLCByZXN1bHQ9TGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5JTlNVRkZJQ0lFTlRfQVVUSEVOVElDQVRJT04pCi0gICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VfZnV0dXJlLmdldF9zdGF0dXMoKSkuaXNFcXVhbFRvKAotICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5JTlNVRkZJQ0lFTlRfQVVUSEVOVElDQVRJT04pCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0xMS1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VjdXJpdHkgLSBJbnN1ZmZpY2llbnQgQXV0aGVudGljYXRpb24g4oCTIFJlc3BvbmRlciIpCi0gICAgZGVmIHRlc3Rfc2VjdXJpdHlfaW5zdWZmaWNpZW50X2F1dGhlbnRpY2F0aW9uX3Jlc3BvbmRlcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCByZWZ1c2VzIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdXBvbiByZWNlcHRpb24gb2YgYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24KLVJlcXVlc3Qgd2hpY2ggZmFpbHMgdG8gc2F0aXNmeSBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudHMuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHBzbSA9IDB4MzMKLSAgICAgICAgc2VsZi5kdXRfbDJjYXAucmVnaXN0ZXJfY29jKHNlbGYuY2VydF9hZGRyZXNzLCBwc20sIFNlY3VyaXR5TGV2ZWwuQVVUSEVOVElDQVRFRF9QQUlSSU5HX1dJVEhfRU5DUllQVElPTikKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLm9wZW5fY2hhbm5lbF93aXRoX2V4cGVjdGVkX3Jlc3VsdCgKLSAgICAgICAgICAgIHBzbSwgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5JTlNVRkZJQ0lFTlRfQVVUSEVOVElDQVRJT04pCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0xMi1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VjdXJpdHkgLSBJbnN1ZmZpY2llbnQgQXV0aG9yaXphdGlvbiDigJMgSW5pdGlhdG9yIikKLSAgICBkZWYgdGVzdF9zZWN1cml0eV9pbnN1ZmZpY2llbnRfYXV0aG9yaXphdGlvbl9pbml0aWF0b3Ioc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGRvZXMgbm90IGVzdGFibGlzaCB0aGUgY2hhbm5lbCB1cG9uIHJlY2VpcHQgb2YgYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVzcG9uc2UgaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCB3aXRoIFJlc3VsdCDigJwweDAwMDYg4oCTIENvbm5lY3Rpb24gUmVmdXNlZCDigJMgSW5zdWZmaWNpZW50IEF1dGhvcml6YXRpb27igJ0uCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfY29jX3RvX2NlcnQoc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbT0weDMzKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAudmVyaWZ5X2FuZF9yZXNwb25kX29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZSgKLSAgICAgICAgICAgIHBzbT0weDMzLCByZXN1bHQ9TGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5JTlNVRkZJQ0lFTlRfQVVUSE9SSVpBVElPTikKLSAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZV9mdXR1cmUuZ2V0X3N0YXR1cygpKS5pc0VxdWFsVG8oCi0gICAgICAgICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LklOU1VGRklDSUVOVF9BVVRIT1JJWkFUSU9OKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMTMtQyIsIHB0c190ZXN0X25hbWU9IlNlY3VyaXR5IC0gSW5zdWZmaWNpZW50IEF1dGhvcml6YXRpb24g4oCTIFJlc3BvbmRlciIpCi0gICAgZGVmIHRlc3Rfc2VjdXJpdHlfaW5zdWZmaWNpZW50X2F1dGhvcml6YXRpb25fcmVzcG9uZGVyKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgYW4gSVVUIHJlZnVzZXMgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiB1cG9uIHJlY2VwdGlvbiBvZiBhbiBMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbgotICAgICAgICBSZXF1ZXN0IHdoaWNoIGZhaWxzIHRvIHNhdGlzZnkgYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICBwc20gPSAweDMzCi0gICAgICAgIHNlbGYuZHV0X2wyY2FwLnJlZ2lzdGVyX2NvYyhzZWxmLmNlcnRfYWRkcmVzcywgcHNtLCBTZWN1cml0eUxldmVsLkFVVEhPUklaQVRJT04pCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5vcGVuX2NoYW5uZWxfd2l0aF9leHBlY3RlZF9yZXN1bHQoCi0gICAgICAgICAgICBwc20sIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQuSU5TVUZGSUNJRU5UX0FVVEhPUklaQVRJT04pCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0xNC1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VjdXJpdHkgLSBJbnN1ZmZpY2llbnQgS2V5IFNpemUg4oCTIEluaXRpYXRvciIpCi0gICAgZGVmIHRlc3Rfc2VjdXJpdHlfaW5zdWZmaWNpZW50X2tleV9zaXplX2luaXRpYXRvcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgZG9lcyBub3QgZXN0YWJsaXNoIHRoZSBjaGFubmVsIHVwb24gcmVjZWlwdCBvZiBhbgotICAgICAgICBMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXNwb25zZSBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHdhcwotICAgICAgICByZWZ1c2VkIHdpdGggUmVzdWx0ICIweDAwMDcg4oCTIENvbm5lY3Rpb24gUmVmdXNlZCDigJMgSW5zdWZmaWNpZW50Ci0gICAgICAgIEVuY3J5cHRpb24gS2V5IFNpemUiLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICByZXNwb25zZV9mdXR1cmUgPSBzZWxmLmR1dF9sMmNhcC5jb25uZWN0X2NvY190b19jZXJ0KHNlbGYuY2VydF9hZGRyZXNzLCBwc209MHgzMykKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9hbmRfcmVzcG9uZF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUoCi0gICAgICAgICAgICBwc209MHgzMywgcmVzdWx0PUxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQuSU5TVUZGSUNJRU5UX0VOQ1JZUFRJT05fS0VZX1NJWkUpCi0gICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VfZnV0dXJlLmdldF9zdGF0dXMoKSkuaXNFcXVhbFRvKAotICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5JTlNVRkZJQ0lFTlRfRU5DUllQVElPTl9LRVlfU0laRSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0xNS1DIiwgcHRzX3Rlc3RfbmFtZT0iU2VjdXJpdHkgLSBJbnN1ZmZpY2llbnQgRW5jcnlwdGlvbiBLZXkgU2l6ZSDigJMgUmVzcG9uZGVyIikKLSAgICBkZWYgdGVzdF9zZWN1cml0eV9pbnN1ZmZpY2llbnRfZW5jcnlwdGlvbl9rZXlfc2l6ZV9yZXNwb25kZXIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCBhbiBJVVQgcmVmdXNlcyB0byBjcmVhdGUgYSBjb25uZWN0aW9uIHVwb24gcmVjZWlwdCBvZiBhbiBMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbgotICAgICAgICBSZXF1ZXN0IHdoaWNoIGZhaWxzIHRvIHNhdGlzZnkgRW5jcnlwdGlvbiBLZXkgU2l6ZSByZXF1aXJlbWVudHMuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHBzbSA9IDB4MzMKLSAgICAgICAgc2VsZi5kdXRfbDJjYXAucmVnaXN0ZXJfY29jKHNlbGYuY2VydF9hZGRyZXNzLCBwc20sIFNlY3VyaXR5TGV2ZWwuQVVUSEVOVElDQVRFRF9QQUlSSU5HX1dJVEhfMTI4X0JJVF9LRVkpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC5vcGVuX2NoYW5uZWxfd2l0aF9leHBlY3RlZF9yZXN1bHQoCi0gICAgICAgICAgICBwc20sIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQuSU5TVUZGSUNJRU5UX0VOQ1JZUFRJT05fS0VZX1NJWkUpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMTYtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IkxFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgLSByZWZ1c2UgZHVlIHRvIGluc3VmZmljaWVudCByZXNvdXJjZXMgLSBJbml0aWF0b3IiKQotICAgIGRlZiB0ZXN0X2xlX2Nvbm5lY3Rpb25fcmVxdWVzdF9pbnN1ZmZpY2llbnRfcmVzb3VyY2VzX2luaXRpYXRvcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCBzZW5kaW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgZG9lcwotICAgICAgICBub3QgZXN0YWJsaXNoIHRoZSBjaGFubmVsIHVwb24gcmVjZWl2aW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uCi0gICAgICAgIFJlc3BvbnNlIHJlZnVzaW5nIHRoZSBjb25uZWN0aW9uIHdpdGggcmVzdWx0ICIweDAwMDQg4oCTIENvbm5lY3Rpb24KLSAgICAgICAgcmVmdXNlZCDigJMgbm8gcmVzb3VyY2VzIGF2YWlsYWJsZSIuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9zZXR1cF9saW5rX2Zyb21fY2VydCgpCi0gICAgICAgIHJlc3BvbnNlX2Z1dHVyZSA9IHNlbGYuZHV0X2wyY2FwLmNvbm5lY3RfY29jX3RvX2NlcnQoc2VsZi5jZXJ0X2FkZHJlc3MsIHBzbT0weDMzKQotICAgICAgICBzZWxmLmNlcnRfbDJjYXAudmVyaWZ5X2FuZF9yZXNwb25kX29wZW5fY2hhbm5lbF9mcm9tX3JlbW90ZSgKLSAgICAgICAgICAgIHBzbT0weDMzLCByZXN1bHQ9TGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5OT19SRVNPVVJDRVNfQVZBSUxBQkxFKQotICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlX2Z1dHVyZS5nZXRfc3RhdHVzKCkpLmlzRXF1YWxUbyhMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0Lk5PX1JFU09VUkNFU19BVkFJTEFCTEUpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMTgtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IkxFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgLSByZWZ1c2VkIGR1ZSB0byBJbnZhbGlkIFNvdXJjZSBDSUQgLSBJbml0aWF0b3IiKQotICAgIGRlZiB0ZXN0X3JlcXVlc3RfcmVmdXNlZF9kdWVfdG9faW52YWxpZF9zb3VyY2VfY2lkX2luaXRpYXRvcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCBzZW5kaW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgZG9lcyBub3QgZXN0YWJsaXNoIHRoZSBjaGFubmVsIHVwb24gcmVjZWl2aW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlc3BvbnNlIHJlZnVzaW5nIHRoZSBjb25uZWN0aW9uIHdpdGggcmVzdWx0ICIweDAwMDkg4oCTIENvbm5lY3Rpb24gcmVmdXNlZCDigJMgSW52YWxpZCBTb3VyY2UgQ0lEIi4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgcmVzcG9uc2VfZnV0dXJlID0gc2VsZi5kdXRfbDJjYXAuY29ubmVjdF9jb2NfdG9fY2VydChzZWxmLmNlcnRfYWRkcmVzcywgcHNtPTB4MzMpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC52ZXJpZnlfYW5kX3Jlc3BvbmRfb3Blbl9jaGFubmVsX2Zyb21fcmVtb3RlKAotICAgICAgICAgICAgcHNtPTB4MzMsIHJlc3VsdD1MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LklOVkFMSURfU09VUkNFX0NJRCkKLSAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZV9mdXR1cmUuZ2V0X3N0YXR1cygpKS5pc0VxdWFsVG8oTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5JTlZBTElEX1NPVVJDRV9DSUQpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJMMkNBUC9MRS9DRkMvQlYtMTktQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IkxFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgLSByZWZ1c2VkIGR1ZSB0byBzb3VyY2UgQ0lEIGFscmVhZHkgYWxsb2NhdGVkIC0gSW5pdGlhdG9yIikKLSAgICBkZWYgdGVzdF9yZXF1ZXN0X3JlZnVzZWRfZHVlX3RvX3NvdXJjZV9jaWRfYWxyZWFkeV9hbGxvY2F0ZWRfaW5pdGlhdG9yKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgYW4gSVVUIHNlbmRpbmcgYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVxdWVzdCBkb2VzIG5vdCBlc3RhYmxpc2ggdGhlIGNoYW5uZWwgdXBvbiByZWNlaXZpbmcgYW4gTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVzcG9uc2UgcmVmdXNpbmcgdGhlIGNvbm5lY3Rpb24gd2l0aCByZXN1bHQgIjB4MDAwQSDigJMgQ29ubmVjdGlvbiByZWZ1c2VkIOKAkyBTb3VyY2UgQ0lEIGFscmVhZHkgYWxsb2NhdGVkIi4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3NldHVwX2xpbmtfZnJvbV9jZXJ0KCkKLSAgICAgICAgcmVzcG9uc2VfZnV0dXJlID0gc2VsZi5kdXRfbDJjYXAuY29ubmVjdF9jb2NfdG9fY2VydChzZWxmLmNlcnRfYWRkcmVzcywgcHNtPTB4MzMpCi0gICAgICAgIHNlbGYuY2VydF9sMmNhcC52ZXJpZnlfYW5kX3Jlc3BvbmRfb3Blbl9jaGFubmVsX2Zyb21fcmVtb3RlKAotICAgICAgICAgICAgcHNtPTB4MzMsIHJlc3VsdD1MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0LlNPVVJDRV9DSURfQUxSRUFEWV9BTExPQ0FURUQpCi0gICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VfZnV0dXJlLmdldF9zdGF0dXMoKSkuaXNFcXVhbFRvKAotICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5TT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JWLTIwLUMiLAotICAgICAgICBwdHNfdGVzdF9uYW1lPSJMRSBDcmVkaXQgQmFzZWQgQ29ubmVjdGlvbiBSZXNwb25zZSAtIHJlZnVzZWQgZHVlIHRvIFNvdXJjZSBDSUQgYWxyZWFkeSBhbGxvY2F0ZWQgLSBSZXNwb25kZXIiKQotICAgIGRlZiB0ZXN0X3JlcXVlc3RfcmVmdXNlZF9kdWVfdG9fc291cmNlX2NpZF9hbHJlYWR5X2FsbG9jYXRlZF9yZXNwb25kZXIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBWZXJpZnkgdGhhdCBhbiBJVVQgcmVjZWl2aW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgZm9yIGEgc2Vjb25kIGNoYW5uZWwgd2lsbCByZWZ1c2UgdGhlIGNvbm5lY3Rpb24gd2l0aCByZXN1bHQgIjB4MDAwQSAtIENvbm5lY3Rpb24gcmVmdXNlZCDigJMgU291cmNlIENJRCBhbHJlYWR5IGFsbG9jYXRlZCIgaWYgaXQgcmVjZWl2ZXMgYSBTb3VyY2UgQ0lEIHdoaWNoIGlzIGFscmVhZHkgaW4gdXNlLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KHBzbT0weDMzLCBzY2lkPTB4MDEwMSkKLSAgICAgICAgc2VsZi5kdXRfbDJjYXAucmVnaXN0ZXJfY29jKHNlbGYuY2VydF9hZGRyZXNzLCBwc209MHgzNSkKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKS5zZW5kKAotICAgICAgICAgICAgbDJjYXBfcGFja2V0cy5MZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlcXVlc3RCdWlsZGVyKDIsIDB4MzUsIDB4MDEwMSwgMTAwMCwgMTAwMCwgMTAwMCkpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X2wyY2FwLmdldF9jb250cm9sX2NoYW5uZWwoKSkuZW1pdHMoTDJjYXBNYXRjaGVycy5DcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVVzZWRDaWQoKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IkwyQ0FQL0xFL0NGQy9CVi0yMS1DIiwKLSAgICAgICAgcHRzX3Rlc3RfbmFtZT0iTEUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gUmVxdWVzdCAtIHJlZnVzZWQgZHVlIHRvIFVuYWNjZXB0YWJsZSBQYXJhbWV0ZXJzIC0gSW5pdGlhdG9yIikKLSAgICBkZWYgdGVzdF9yZXF1ZXN0X3JlZnVzZWRfZHVlX3RvX3VuYWNjZXB0YWJsZV9wYXJhbWV0ZXJzX2luaXRpYXRvcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgIFZlcmlmeSB0aGF0IGFuIElVVCBzZW5kaW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgZG9lcyBub3QgZXN0YWJsaXNoIHRoZSBjaGFubmVsIHVwb24gcmVjZWl2aW5nIGFuIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlc3BvbnNlIHJlZnVzaW5nIHRoZSBjb25uZWN0aW9uIHdpdGggcmVzdWx0ICIweDAwMEIg4oCTIENvbm5lY3Rpb24gcmVmdXNlZCDigJMgVW5hY2NlcHRhYmxlIFBhcmFtZXRlcnMiLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICByZXNwb25zZV9mdXR1cmUgPSBzZWxmLmR1dF9sMmNhcC5jb25uZWN0X2NvY190b19jZXJ0KHNlbGYuY2VydF9hZGRyZXNzLCBwc209MHgzMykKLSAgICAgICAgc2VsZi5jZXJ0X2wyY2FwLnZlcmlmeV9hbmRfcmVzcG9uZF9vcGVuX2NoYW5uZWxfZnJvbV9yZW1vdGUoCi0gICAgICAgICAgICBwc209MHgzMywgcmVzdWx0PUxlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQuVU5BQ0NFUFRBQkxFX1BBUkFNRVRFUlMpCi0gICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VfZnV0dXJlLmdldF9zdGF0dXMoKSkuaXNFcXVhbFRvKAotICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdC5VTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUykKLQotICAgIEBtZXRhZGF0YShwdHNfdGVzdF9pZD0iTDJDQVAvTEUvQ0ZDL0JJLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJDcmVkaXQgRXhjaGFuZ2Ug4oCTIEV4Y2VlZCBJbml0aWFsIENyZWRpdHMiKQotICAgIGRlZiB0ZXN0X2NyZWRpdF9leGNoYW5nZV9leGNlZWRfaW5pdGlhbF9jcmVkaXRzKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBkaXNjb25uZWN0cyB0aGUgTEUgRGF0YSBDaGFubmVsIHdoZW4gdGhlIGNyZWRpdCBjb3VudCBleGNlZWRzIDY1NTM1LgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fc2V0dXBfbGlua19mcm9tX2NlcnQoKQotICAgICAgICAoZHV0X2NoYW5uZWwsIGNlcnRfY2hhbm5lbCkgPSBzZWxmLl9vcGVuX2NoYW5uZWxfZnJvbV9jZXJ0KCkKLSAgICAgICAgY2VydF9jaGFubmVsLnNlbmRfY3JlZGl0cyg2NTUzNSkKLSAgICAgICAgY2VydF9jaGFubmVsLnZlcmlmeV9kaXNjb25uZWN0X3JlcXVlc3QoKQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsLmNjIGIvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhiNjVmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1MaW5rT3B0aW9ucyogRHluYW1pY0NoYW5uZWw6OkdldExpbmtPcHRpb25zKCkgewotICByZXR1cm4gbGlua18tPkdldExpbmtPcHRpb25zKCk7Ci19Ci0KLU10dSBEeW5hbWljQ2hhbm5lbDo6R2V0TXR1KCkgY29uc3QgewotICByZXR1cm4gbXR1XzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbC5oIGIvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OGQxMmEuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2R5bmFtaWNfY2hhbm5lbC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2xpbmtfb3B0aW9ucy5oIgotI2luY2x1ZGUgImwyY2FwL210dS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIExpbms7Ci19Ci0KLWNsYXNzIER5bmFtaWNDaGFubmVsIDogcHVibGljIGwyY2FwOjpEeW5hbWljQ2hhbm5lbCB7Ci0gcHVibGljOgotICBEeW5hbWljQ2hhbm5lbCgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsSW1wbD4gaW1wbCwKLSAgICAgIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyLAotICAgICAgaW50ZXJuYWw6OkxpbmsqIGxpbmssCi0gICAgICBNdHUgbXR1KQotICAgICAgOiBsMmNhcDo6RHluYW1pY0NoYW5uZWwoaW1wbCwgbDJjYXBfaGFuZGxlciksIGxpbmtfKGxpbmspLCBtdHVfKG10dSkge30KLQotICAvKioKLSAgICogR2V0IHRoZSBQcm94eSBmb3IgTDJDQVAgTGluayBPcHRpb25zLgotICAgKiBPbmx5IGZldyBzcGVjaWFsIEwyQ0FQIHVzZXJzIG5lZWQgdG8gdXNlIGl0LCBpbmNsdWRpbmcKLSAgICogSGVhcmluZyBBaWQgUHJvZmlsZSBhbmQgSmF2YSBBUEkuCi0gICAqLwotICBMaW5rT3B0aW9ucyogR2V0TGlua09wdGlvbnMoKTsKLQotICBNdHUgR2V0TXR1KCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBpbnRlcm5hbDo6TGluayogbGlua187Ci0gIE10dSBtdHVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9jb25maWd1cmF0aW9uX29wdGlvbi5oIGIvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsX2NvbmZpZ3VyYXRpb25fb3B0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGI2MGQuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsX2NvbmZpZ3VyYXRpb25fb3B0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL210dS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gT3B0aW9uIHNwZWNpZmllZCBieSBMMkNBUCBDaGFubmVsIHVzZXIgb24gYSBkeW5hbWljIGNoYW5uZWwuIEwyQ0FQIG1vZHVsZSB3aWxsIGNvbmZpZ3VyZSB0aGUgY2hhbm5lbAotICogYmFzZWQgb24gdXNlciBwcm92aWRlZCBvcHRpb24uCi0gKi8KLXN0cnVjdCBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gewotICAvKioKLSAgICogTWF4aW11bSBTRFUgc2l6ZSB0aGF0IHRoZSBMMkNBUCBDaGFubmVsIHVzZXIgaXMgYWJsZSB0byByZWNlaXZlIG9yIHNlbmQuIFdoZW4gdGhlIGNoYW5uZWwgaXMgY3JlYXRlZCwgdGhlIGFjdHVhbAotICAgKiBNVFUgaXMgdGhlIG1pbmltdW0gb2YgdGhlIHN1Z2dlc3RlZCBNVFUgYmV0d2VlbiB0d28gZGV2aWNlcy4KLSAgICovCi0gIE10dSBtdHUgPSBrRGVmYXVsdENsYXNzaWNNdHU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsX21hbmFnZXIuY2MgYi9nZC9sMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3ZTkyYy4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci0KLWJvb2wgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0Q2hhbm5lbChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLCBQc20gcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrIG9uX2ZhaWxfY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIGludGVybmFsOjpMaW5rOjpQZW5kaW5nRHluYW1pY0NoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAuaGFuZGxlcl8gPSBoYW5kbGVyLAotICAgICAgLm9uX29wZW5fY2FsbGJhY2tfID0gc3RkOjptb3ZlKG9uX2Nvbm5lY3Rpb25fb3BlbiksCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fZmFpbF9jYWxsYmFjayksCi0gICAgICAuY29uZmlndXJhdGlvbl8gPSBjb25maWd1cmF0aW9uX29wdGlvbiwKLSAgfTsKLSAgbDJjYXBfbGF5ZXJfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaW50ZXJuYWw6OkxpbmtNYW5hZ2VyOjpDb25uZWN0RHluYW1pY0NoYW5uZWxTZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQobGlua19tYW5hZ2VyXyksIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbiksIHBzbSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0ZXJTZXJ2aWNlKFBzbSBwc20sIER5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWd1cmF0aW9uX29wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VjdXJpdHlQb2xpY3kmIHNlY3VyaXR5X3BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrIG9uX2Nvbm5lY3Rpb25fb3Blbiwgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgaW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAudXNlcl9oYW5kbGVyXyA9IGhhbmRsZXIsCi0gICAgICAuc2VjdXJpdHlfcG9saWN5XyA9IHNlY3VyaXR5X3BvbGljeSwKLSAgICAgIC5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfID0gc3RkOjptb3ZlKG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSksCi0gICAgICAub25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShvbl9jb25uZWN0aW9uX29wZW4pLAotICAgICAgLmNvbmZpZ3VyYXRpb25fID0gY29uZmlndXJhdGlvbl9vcHRpb24sCi0gIH07Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6UmVnaXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHNlcnZpY2VfbWFuYWdlcl8pLCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uKSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCBiL2dkL2wyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzM0ZWYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfY29uZmlndXJhdGlvbl9vcHRpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgImwyY2FwL2xlL3NlY3VyaXR5X3BvbGljeS5oIgotI2luY2x1ZGUgImwyY2FwL3BzbS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotY2xhc3MgTDJjYXBMZU1vZHVsZTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIExpbmtNYW5hZ2VyOwotY2xhc3MgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotY2xhc3MgRHluYW1pY0NoYW5uZWxNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIGVudW0gY2xhc3MgQ29ubmVjdGlvblJlc3VsdENvZGUgewotICAgIFNVQ0NFU1MgPSAwLAotICAgIEZBSUxfTk9fU0VSVklDRV9SRUdJU1RFUkVEID0gMSwgIC8vIE5vIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZAotICAgIEZBSUxfSENJX0VSUk9SID0gMiwgICAgICAgICAgICAgIC8vIFNlZSBoY2lfZXJyb3IKLSAgICBGQUlMX0wyQ0FQX0VSUk9SID0gMywgICAgICAgICAgICAvLyBTZWUgbDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQKLSAgfTsKLQotICBzdHJ1Y3QgQ29ubmVjdGlvblJlc3VsdCB7Ci0gICAgQ29ubmVjdGlvblJlc3VsdENvZGUgY29ubmVjdGlvbl9yZXN1bHRfY29kZSA9IENvbm5lY3Rpb25SZXN1bHRDb2RlOjpTVUNDRVNTOwotICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9lcnJvciA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQgbDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQgPQotICAgICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpTVUNDRVNTOwotICB9OwotICAvKioKLSAgICogT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrKHN0ZDo6c3RyaW5nIGZhaWx1cmVfcmVhc29uKTsKLSAgICovCi0gIHVzaW5nIE9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayA9IGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQoQ29ubmVjdGlvblJlc3VsdCByZXN1bHQpPjsKLQotICAvKioKLSAgICogT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrKER5bmFtaWNDaGFubmVsIGNoYW5uZWwpOwotICAgKi8KLSAgdXNpbmcgT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrID0gY29tbW9uOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbD4pPjsKLQotICBlbnVtIGNsYXNzIFJlZ2lzdHJhdGlvblJlc3VsdCB7Ci0gICAgU1VDQ0VTUyA9IDAsCi0gICAgRkFJTF9EVVBMSUNBVEVfU0VSVklDRSA9IDEsICAvLyBEdXBsaWNhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZm9yIHRoZSBzYW1lIFBTTQotICAgIEZBSUxfSU5WQUxJRF9TRVJWSUNFID0gMiwgICAgLy8gSW52YWxpZCBQU00KLSAgfTsKLQotICAvKioKLSAgICogT25SZWdpc3RyYXRpb25GYWlsdXJlQ2FsbGJhY2soUmVnaXN0cmF0aW9uUmVzdWx0IHJlc3VsdCwgRHluYW1pY0NoYW5uZWxTZXJ2aWNlIHNlcnZpY2UpOwotICAgKi8KLSAgdXNpbmcgT25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrID0KLSAgICAgIGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQoUmVnaXN0cmF0aW9uUmVzdWx0LCBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxTZXJ2aWNlPik+OwotCi0gIC8qKgotICAgKiBDb25uZWN0IHRvIGEgRHluYW1pYyBjaGFubmVsIG9uIGEgcmVtb3RlIGRldmljZQotICAgKgotICAgKiAtIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cwotICAgKiAtIFdoZW4gZmFsc2UgaXMgcmV0dXJuZWQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIGltbWVkaWF0ZWx5Ci0gICAqIC0gV2hlbiB0cnVlIGlzIHJldHVybmVkLCBtZXRob2QgY2FsbGVyIHNob3VsZCB3YWl0IGZvciBvbl9mYWlsX2NhbGxiYWNrIG9yIG9uX29wZW5fY2FsbGJhY2sKLSAgICogLSBJZiBhbiBMRSBjb25uZWN0aW9uIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhbiBMRSBjb25uZWN0aW9uCi0gICAqIC0gSWYgSENJIGNvbm5lY3Rpb24gZmFpbGVkLCBvbl9mYWlsX2NhbGxiYWNrIHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggRkFJTF9IQ0lfRVJST1IKLSAgICogLSBJZiBEeW5hbWljIGNoYW5uZWwgb24gYSByZW1vdGUgZGV2aWNlIGlzIGFscmVhZHkgcmVwb3J0ZWQgYXMgY29ubmVjdGVkIHZpYSBvbl9vcGVuX2NhbGxiYWNrLCBpdCB3b24ndCBiZQotICAgKiAgIHJlcG9ydGVkIGFnYWluCi0gICAqCi0gICAqIEBwYXJhbSBkZXZpY2U6IFJlbW90ZSBkZXZpY2UgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBwc206IFNlcnZpY2UgUFNNIHRvIGNvbm5lY3QuIFBTTSBpcyBkZWZpbmVkIGluIENvcmUgc3BlYyBWb2wgMyBQYXJ0IEEgNC4yLgotICAgKiBAcGFyYW0gb25fb3Blbl9jYWxsYmFjazogQSBjYWxsYmFjayB0byBpbmRpY2F0ZSBzdWNjZXNzIG9mIGEgY29ubmVjdGlvbiBpbml0aWF0ZWQgZnJvbSBhIHJlbW90ZSBkZXZpY2UuCi0gICAqIEBwYXJhbSBvbl9mYWlsX2NhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGluZGljYXRlIGNvbm5lY3Rpb24gZmFpbHVyZSBhbG9uZyB3aXRoIGEgc3RhdHVzIGNvZGUuCi0gICAqIEBwYXJhbSBoYW5kbGVyOiBUaGUgaGFuZGxlciBjb250ZXh0IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIEBjYWxsYmFjayBwYXJhbWV0ZXJzLgotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbl9vcHRpb246IFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgY2hhbm5lbAotICAgKgotICAgKiBSZXR1cm5zOiB0cnVlIGlmIGNvbm5lY3Rpb24gd2FzIGFibGUgdG8gYmUgaW5pdGlhdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBib29sIENvbm5lY3RDaGFubmVsKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLCBQc20gcHNtLAotICAgICAgICAgICAgICAgICAgICAgIE9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW4sIE9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyKTsKLQotICAvKioKLSAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIHJlY2VpdmUgaW5jb21pbmcgY29ubmVjdGlvbnMgYm91bmQgdG8gYSBzcGVjaWZpYyBjaGFubmVsLgotICAgKgotICAgKiAtIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KLSAgICogLSBXaGVuIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgcmVnaXN0cmF0aW9uIGZhaWxzIGltbWVkaWF0ZWx5LgotICAgKiAtIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCwgbWV0aG9kIGNhbGxlciBzaG91bGQgd2FpdCBmb3Igb25fc2VydmljZV9yZWdpc3RlcmVkIGNhbGxiYWNrIHRoYXQgY29udGFpbnMgYQotICAgKiAgIER5bmFtaWNDaGFubmVsU2VydmljZSBvYmplY3QuIFRoZSByZWdpc3RlcmVkIHNlcnZpY2UgY2FuIGJlIG1hbmFnZWQgZnJvbSB0aGF0IG9iamVjdC4KLSAgICogLSBJZiBhIFBTTSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb3Igc29tZSBvdGhlciBlcnJvciBoYXBwZW5zLCBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBhCi0gICAqICAgbm9uLVNVQ0NFU1MgdmFsdWUKLSAgICogLSBBZnRlciBhIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCwgYSBEeW5hbWljQ2hhbm5lbCBpcyBkZWxpdmVyZWQgdGhyb3VnaCBvbl9vcGVuX2NhbGxiYWNrIHdoZW4gdGhlIHJlbW90ZQotICAgKiAgIGluaXRpYXRlcyBhIGNoYW5uZWwgb3BlbiBhbmQgY2hhbm5lbCBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0gICAqIC0gb25fb3Blbl9jYWxsYmFjaywgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhZnRlciBvbl9zZXJ2aWNlX3JlZ2lzdGVyZWQgY2FsbGJhY2sKLSAgICoKLSAgICogQHBhcmFtIHNlY3VyaXR5X3BvbGljeTogVGhlIHNlY3VyaXR5IHBvbGljeSB1c2VkIGZvciB0aGUgY29ubmVjdGlvbi4KLSAgICogQHBhcmFtIHBzbTogU2VydmljZSBQU00gdG8gcmVnaXN0ZXIuIFBTTSBpcyBkZWZpbmVkIGluIENvcmUgc3BlYyBWb2wgMyBQYXJ0IEEgNC4yLgotICAgKiBAcGFyYW0gb25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlOiBBIGNhbGxiYWNrIHRvIGluZGljYXRlIHRoZSBzZXJ2aWNlIHNldHVwIGhhcyBjb21wbGV0ZWQuIElmIHRoZSByZXR1cm4gc3RhdHVzIGlzCi0gICAqICAgICAgICBub3QgU1VDQ0VTUywgaXQgbWVhbnMgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZCBkdWUgdG8gcmVhc29ucyBsaWtlIFBTTSBhbHJlYWR5IHRha2UKLSAgICogQHBhcmFtIG9uX29wZW5fY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gaW5kaWNhdGUgc3VjY2VzcyBvZiBhIGNvbm5lY3Rpb24gaW5pdGlhdGVkIGZyb20gYSByZW1vdGUgZGV2aWNlLgotICAgKiBAcGFyYW0gaGFuZGxlcjogVGhlIGhhbmRsZXIgY29udGV4dCBpbiB3aGljaCB0byBleGVjdXRlIHRoZSBAY2FsbGJhY2sgcGFyYW1ldGVyLgotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbl9vcHRpb246IFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgY2hhbm5lbAotICAgKi8KLSAgYm9vbCBSZWdpc3RlclNlcnZpY2UoUHNtIHBzbSwgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWN1cml0eVBvbGljeSYgc2VjdXJpdHlfcG9saWN5LCBPblJlZ2lzdHJhdGlvbkNvbXBsZXRlQ2FsbGJhY2sgb25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgZnJpZW5kIGNsYXNzIEwyY2FwTGVNb2R1bGU7Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgY29uc3RydWN0b3IgaXMgbm90IHRvIGJlIHVzZWQgYnkgdXNlciBjb2RlCi0gIER5bmFtaWNDaGFubmVsTWFuYWdlcihpbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIHNlcnZpY2VfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpMaW5rTWFuYWdlciogbGlua19tYW5hZ2VyLCBvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcikKLSAgICAgIDogc2VydmljZV9tYW5hZ2VyXyhzZXJ2aWNlX21hbmFnZXIpLCBsaW5rX21hbmFnZXJfKGxpbmtfbWFuYWdlciksIGwyY2FwX2xheWVyX2hhbmRsZXJfKGwyY2FwX2xheWVyX2hhbmRsZXIpIHsKLSAgICBBU1NFUlQoc2VydmljZV9tYW5hZ2VyXyAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQobGlua19tYW5hZ2VyXyAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQobDJjYXBfbGF5ZXJfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLSAgaW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBzZXJ2aWNlX21hbmFnZXJfID0gbnVsbHB0cjsKLSAgaW50ZXJuYWw6OkxpbmtNYW5hZ2VyKiBsaW5rX21hbmFnZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKER5bmFtaWNDaGFubmVsTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuY2MgYi9nZC9sMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfc2VydmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkYjg4Mi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfc2VydmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oIgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotdm9pZCBEeW5hbWljQ2hhbm5lbFNlcnZpY2U6OlVucmVnaXN0ZXIoT25VbnJlZ2lzdGVyZWRDYWxsYmFjayBvbl91bnJlZ2lzdGVyZWQsIG9zOjpIYW5kbGVyKiBvbl91bnJlZ2lzdGVyZWRfaGFuZGxlcikgewotICBBU1NFUlRfTE9HKG1hbmFnZXJfICE9IG51bGxwdHIsICJ0aGlzIHNlcnZpY2UgaXMgaW52YWxpZCIpOwotICBsMmNhcF9sYXllcl9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlVucmVnaXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKG1hbmFnZXJfKSwgcHNtXywgc3RkOjptb3ZlKG9uX3VucmVnaXN0ZXJlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdW5yZWdpc3RlcmVkX2hhbmRsZXIpKTsKLX0KLQotUHNtIER5bmFtaWNDaGFubmVsU2VydmljZTo6R2V0UHNtKCkgY29uc3QgewotICByZXR1cm4gcHNtXzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmggYi9nZC9sMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OThjODg1Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImwyY2FwL3BzbS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOwotfQotCi1jbGFzcyBEeW5hbWljQ2hhbm5lbFNlcnZpY2UgewotIHB1YmxpYzoKLSAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlKCkgPSBkZWZhdWx0OwotCi0gIHVzaW5nIE9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgPSBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKCk+OwotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVyIGEgc2VydmljZSBmcm9tIEwyQ0FQIG1vZHVsZS4gVGhpcyBvcGVyYXRpb24gY2Fubm90IGZhaWwuCi0gICAqIEFsbCBjaGFubmVscyBvcGVuZWQgZm9yIHRoaXMgc2VydmljZSB3aWxsIGJlIGNsb3NlZC4KLSAgICoKLSAgICogQHBhcmFtIG9uX3VucmVnaXN0ZXJlZCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHVucmVnaXN0cmF0aW9uIGlzIGNvbXBsZXRlCi0gICAqLwotICB2b2lkIFVucmVnaXN0ZXIoT25VbnJlZ2lzdGVyZWRDYWxsYmFjayBvbl91bnJlZ2lzdGVyZWQsIG9zOjpIYW5kbGVyKiBvbl91bnJlZ2lzdGVyZWRfaGFuZGxlcik7Ci0KLSAgZnJpZW5kIGludGVybmFsOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLQotICBQc20gR2V0UHNtKCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIER5bmFtaWNDaGFubmVsU2VydmljZShQc20gcHNtLCBpbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIG1hbmFnZXIsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgICAgOiBwc21fKHBzbSksIG1hbmFnZXJfKG1hbmFnZXIpLCBsMmNhcF9sYXllcl9oYW5kbGVyXyhoYW5kbGVyKSB7Ci0gICAgQVNTRVJUKG1hbmFnZXJfICE9IG51bGxwdHIpOwotICAgIEFTU0VSVChsMmNhcF9sYXllcl9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgUHNtIHBzbV8gPSBrRGVmYXVsdFBzbTsKLSAgaW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBtYW5hZ2VyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9sYXllcl9oYW5kbGVyXzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKER5bmFtaWNDaGFubmVsU2VydmljZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZmFjYWRlLmNjIGIvZ2QvbDJjYXAvbGUvZmFjYWRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTg0MDI4Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ZhY2FkZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvbGUvZmFjYWRlLmgiCi0KLSNpbmNsdWRlICJncnBjL2dycGNfZXZlbnRfcXVldWUuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZmFjYWRlLmdycGMucGIuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9sMmNhcF9sZV9tb2R1bGUuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9zZWN1cml0eV9wb2xpY3kuaCIKLSNpbmNsdWRlICJsMmNhcC9wc20uaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotU2VjdXJpdHlQb2xpY3kgU2VjdXJpdHlMZXZlbFRvUG9saWN5KFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKLSAgc3dpdGNoIChsZXZlbCkgewotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6Tk9fU0VDVVJJVFk6Ci0gICAgICByZXR1cm4gU2VjdXJpdHlQb2xpY3k6Ok5PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSzsKLSAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OlVOQVVUSEVOVElDQVRFRF9QQUlSSU5HX1dJVEhfRU5DUllQVElPTjoKLSAgICAgIHJldHVybiBTZWN1cml0eVBvbGljeTo6RU5DUllQVEVEX1RSQU5TUE9SVDsKLSAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkFVVEhFTlRJQ0FURURfUEFJUklOR19XSVRIX0VOQ1JZUFRJT046Ci0gICAgICByZXR1cm4gU2VjdXJpdHlQb2xpY3k6OkFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVDsKLSAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkFVVEhFTlRJQ0FURURfUEFJUklOR19XSVRIXzEyOF9CSVRfS0VZOgotICAgICAgcmV0dXJuIFNlY3VyaXR5UG9saWN5OjpfTk9UX0ZPUl9ZT1VfX0FVVEhFTlRJQ0FURURfUEFJUklOR19XSVRIXzEyOF9CSVRfS0VZOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6QVVUSE9SSVpBVElPTjoKLSAgICAgIHJldHVybiBTZWN1cml0eVBvbGljeTo6X05PVF9GT1JfWU9VX19BVVRIT1JJWkFUSU9OOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gU2VjdXJpdHlQb2xpY3k6Ok5PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSzsKLSAgfQotfQotCi1zdGF0aWMgY29uc3RleHByIGF1dG8ga0NoYW5uZWxPcGVuVGltZW91dCA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDQpOwotCi1jbGFzcyBMMmNhcExlTW9kdWxlRmFjYWRlU2VydmljZSA6IHB1YmxpYyBMMmNhcExlTW9kdWxlRmFjYWRlOjpTZXJ2aWNlIHsKLSBwdWJsaWM6Ci0gIEwyY2FwTGVNb2R1bGVGYWNhZGVTZXJ2aWNlKEwyY2FwTGVNb2R1bGUqIGwyY2FwX2xheWVyLCBvczo6SGFuZGxlciogZmFjYWRlX2hhbmRsZXIpCi0gICAgICA6IGwyY2FwX2xheWVyXyhsMmNhcF9sYXllciksIGZhY2FkZV9oYW5kbGVyXyhmYWNhZGVfaGFuZGxlcikgewotICAgIEFTU0VSVChsMmNhcF9sYXllcl8gIT0gbnVsbHB0cik7Ci0gICAgQVNTRVJUKGZhY2FkZV9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEZldGNoTDJjYXBEYXRhKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8OjpibHVldG9vdGg6OmwyY2FwOjpsZTo6TDJjYXBQYWNrZXQ+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gcGVuZGluZ19sMmNhcF9kYXRhXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBPcGVuRHluYW1pY0NoYW5uZWwoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBPcGVuRHluYW1pY0NoYW5uZWxSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkR5bmFtaWNDaGFubmVsUmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBzZXJ2aWNlX2hlbHBlciA9IGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5maW5kKHJlcXVlc3QtPnBzbSgpKTsKLSAgICBpZiAoc2VydmljZV9oZWxwZXIgPT0gZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiUHNtIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgfQotICAgIGhjaTo6QWRkcmVzcyBwZWVyX2FkZHJlc3M7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5yZW1vdGUoKS5hZGRyZXNzKCkuYWRkcmVzcygpLCBwZWVyX2FkZHJlc3MpKTsKLSAgICAvLyBUT0RPOiBTdXBwb3J0IGRpZmZlcmVudCBhZGRyZXNzIHR5cGUKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBwZWVyKHBlZXJfYWRkcmVzcywgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgICBzZXJ2aWNlX2hlbHBlci0+c2Vjb25kLT5Db25uZWN0KHBlZXIpOwotICAgIHJlc3BvbnNlLT5zZXRfc3RhdHVzKAotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNlcnZpY2VfaGVscGVyLT5zZWNvbmQtPmNoYW5uZWxfb3Blbl9mYWlsX3JlYXNvbl8ubDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQpKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgQ2xvc2VEeW5hbWljQ2hhbm5lbCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IENsb3NlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBzZXJ2aWNlX2hlbHBlciA9IGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5maW5kKHJlcXVlc3QtPnBzbSgpKTsKLSAgICBpZiAoc2VydmljZV9oZWxwZXIgPT0gZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiUHNtIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgfQotICAgIGlmIChzZXJ2aWNlX2hlbHBlci0+c2Vjb25kLT5jaGFubmVsXyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiQ2hhbm5lbCBub3Qgb3BlbiIpOwotICAgIH0KLSAgICBhdXRvIGFkZHJlc3MgPSBzZXJ2aWNlX2hlbHBlci0+c2Vjb25kLT5jaGFubmVsXy0+R2V0RGV2aWNlKCkuR2V0QWRkcmVzcygpOwotICAgIGhjaTo6QWRkcmVzcyBwZWVyX2FkZHJlc3M7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5yZW1vdGUoKS5hZGRyZXNzKCkuYWRkcmVzcygpLCBwZWVyX2FkZHJlc3MpKTsKLSAgICBpZiAoYWRkcmVzcyAhPSBwZWVyX2FkZHJlc3MpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OkZBSUxFRF9QUkVDT05ESVRJT04sICJSZW1vdGUgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIik7Ci0gICAgfQotICAgIHNlcnZpY2VfaGVscGVyLT5zZWNvbmQtPmNoYW5uZWxfLT5DbG9zZSgpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXREeW5hbWljQ2hhbm5lbCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpsMmNhcDo6bGU6OlNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBpZiAocmVxdWVzdC0+ZW5hYmxlKCkpIHsKLSAgICAgIGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5lbXBsYWNlKHJlcXVlc3QtPnBzbSgpLCBzdGQ6Om1ha2VfdW5pcXVlPEwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBsMmNhcF9sYXllcl8sIGZhY2FkZV9oYW5kbGVyXywgcmVxdWVzdC0+cHNtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWxUb1BvbGljeShyZXF1ZXN0LT5zZWN1cml0eV9sZXZlbCgpKSkpOwotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBzZXJ2aWNlX2hlbHBlciA9IGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5maW5kKHJlcXVlc3QtPnBzbSgpKTsKLSAgICAgIGlmIChzZXJ2aWNlX2hlbHBlciA9PSBkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzKDo6Z3JwYzo6U3RhdHVzQ29kZTo6RkFJTEVEX1BSRUNPTkRJVElPTiwgIlBzbSBub3QgcmVnaXN0ZXJlZCIpOwotICAgICAgfQotICAgICAgc2VydmljZV9oZWxwZXItPnNlY29uZC0+c2VydmljZV8tPlVucmVnaXN0ZXIoY29tbW9uOjpCaW5kT25jZShbXSB7fSksIGZhY2FkZV9oYW5kbGVyXyk7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgIH0KLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmREeW5hbWljQ2hhbm5lbFBhY2tldCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmJsdWV0b290aDo6bDJjYXA6OmxlOjpEeW5hbWljQ2hhbm5lbFBhY2tldCogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfbWFwX211dGV4Xyk7Ci0gICAgaWYgKGR5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5maW5kKHJlcXVlc3QtPnBzbSgpKSA9PSBkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uZW5kKCkpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OkZBSUxFRF9QUkVDT05ESVRJT04sICJQc20gbm90IHJlZ2lzdGVyZWQiKTsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0KHJlcXVlc3QtPnBheWxvYWQoKS5iZWdpbigpLCByZXF1ZXN0LT5wYXlsb2FkKCkuZW5kKCkpOwotICAgIGlmICghZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3JlcXVlc3QtPnBzbSgpXS0+U2VuZFBhY2tldChwYWNrZXQpKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiQ2hhbm5lbCBub3Qgb3BlbiIpOwotICAgIH0KLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgY2xhc3MgTDJjYXBEeW5hbWljQ2hhbm5lbEhlbHBlciB7Ci0gICBwdWJsaWM6Ci0gICAgTDJjYXBEeW5hbWljQ2hhbm5lbEhlbHBlcihMMmNhcExlTW9kdWxlRmFjYWRlU2VydmljZSogc2VydmljZSwgTDJjYXBMZU1vZHVsZSogbDJjYXBfbGF5ZXIsIG9zOjpIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNtIHBzbSwgU2VjdXJpdHlQb2xpY3kgc2VjdXJpdHlfcG9saWN5KQotICAgICAgICA6IGZhY2FkZV9zZXJ2aWNlXyhzZXJ2aWNlKSwgbDJjYXBfbGF5ZXJfKGwyY2FwX2xheWVyKSwgaGFuZGxlcl8oaGFuZGxlciksIHBzbV8ocHNtKSB7Ci0gICAgICBkeW5hbWljX2NoYW5uZWxfbWFuYWdlcl8gPSBsMmNhcF9sYXllcl8tPkdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpOwotICAgICAgZHluYW1pY19jaGFubmVsX21hbmFnZXJfLT5SZWdpc3RlclNlcnZpY2UoCi0gICAgICAgICAgcHNtLCB7fSwgc2VjdXJpdHlfcG9saWN5LAotICAgICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2wyY2FwX3NlcnZpY2VfcmVnaXN0cmF0aW9uX2NvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICBjb21tb246OkJpbmQoJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2Nvbm5lY3Rpb25fb3BlbiwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgaGFuZGxlcl8pOwotICAgIH0KLQotICAgIH5MMmNhcER5bmFtaWNDaGFubmVsSGVscGVyKCkgewotICAgICAgaWYgKGNoYW5uZWxfICE9IG51bGxwdHIpIHsKLSAgICAgICAgY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICAgICAgY2hhbm5lbF8gPSBudWxscHRyOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgQ29ubmVjdChoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7Ci0gICAgICBkeW5hbWljX2NoYW5uZWxfbWFuYWdlcl8tPkNvbm5lY3RDaGFubmVsKAotICAgICAgICAgIGFkZHJlc3MsIHt9LCBwc21fLCBjb21tb246OkJpbmQoJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2Nvbm5lY3Rpb25fb3BlbiwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgICBjb21tb246OkJpbmQoJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2Nvbm5lY3RfZmFpbCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgaGFuZGxlcl8pOwotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgaWYgKCFjaGFubmVsX29wZW5fY3ZfLndhaXRfZm9yKGxvY2ssIGtDaGFubmVsT3BlblRpbWVvdXQsIFt0aGlzXSB7IHJldHVybiBjaGFubmVsXyAhPSBudWxscHRyOyB9KSkgewotICAgICAgICBMT0dfV0FSTigiQ2hhbm5lbCBpcyBub3Qgb3BlbiBmb3IgcHNtICVkIiwgcHNtXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbl9sMmNhcF9zZXJ2aWNlX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZShEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdCByZWdpc3RyYXRpb25fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsU2VydmljZT4gc2VydmljZSkgewotICAgICAgaWYgKHJlZ2lzdHJhdGlvbl9yZXN1bHQgIT0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlcnZpY2VfID0gc3RkOjptb3ZlKHNlcnZpY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGludm9rZWQgZnJvbSBGYWNhZGUgSGFuZGxlcgotICAgIHZvaWQgb25fY29ubmVjdGlvbl9vcGVuKHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9vcGVuX2N2X211dGV4Xyk7Ci0gICAgICAgIGNoYW5uZWxfID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgfQotICAgICAgY2hhbm5lbF9vcGVuX2N2Xy5ub3RpZnlfYWxsKCk7Ci0gICAgICBjaGFubmVsXy0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICAgICAgZmFjYWRlX3NlcnZpY2VfLT5mYWNhZGVfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJkwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX2Nsb3NlX2NhbGxiYWNrKSk7Ci0gICAgICBjaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgICAgZmFjYWRlX3NlcnZpY2VfLT5mYWNhZGVfaGFuZGxlcl8sCi0gICAgICAgICAgY29tbW9uOjpCaW5kKCZMMmNhcER5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9pbmNvbWluZ19wYWNrZXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIH0KLQotICAgIHZvaWQgb25fY2xvc2VfY2FsbGJhY2soaGNpOjpFcnJvckNvZGUgZXJyb3JfY29kZSkgewotICAgICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9vcGVuX2N2X211dGV4Xyk7Ci0gICAgICAgIGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgICB9Ci0gICAgICBjaGFubmVsXyA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdm9pZCBvbl9jb25uZWN0X2ZhaWwoRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgewotICAgICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9vcGVuX2N2X211dGV4Xyk7Ci0gICAgICAgIGNoYW5uZWxfID0gbnVsbHB0cjsKLSAgICAgICAgY2hhbm5lbF9vcGVuX2ZhaWxfcmVhc29uXyA9IHJlc3VsdDsKLSAgICAgIH0KLSAgICAgIGNoYW5uZWxfb3Blbl9jdl8ubm90aWZ5X2FsbCgpOwotICAgIH0KLQotICAgIHZvaWQgb25faW5jb21pbmdfcGFja2V0KCkgewotICAgICAgYXV0byBwYWNrZXQgPSBjaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBkYXRhID0gc3RkOjpzdHJpbmcocGFja2V0LT5iZWdpbigpLCBwYWNrZXQtPmVuZCgpKTsKLSAgICAgIEwyY2FwUGFja2V0IGwyY2FwX2RhdGE7Ci0gICAgICBsMmNhcF9kYXRhLnNldF9wc20ocHNtXyk7Ci0gICAgICBsMmNhcF9kYXRhLnNldF9wYXlsb2FkKGRhdGEpOwotICAgICAgZmFjYWRlX3NlcnZpY2VfLT5wZW5kaW5nX2wyY2FwX2RhdGFfLk9uSW5jb21pbmdFdmVudChsMmNhcF9kYXRhKTsKLSAgICB9Ci0KLSAgICBib29sIFNlbmRQYWNrZXQoc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0KSB7Ci0gICAgICBpZiAoY2hhbm5lbF8gPT0gbnVsbHB0cikgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9vcGVuX2N2X211dGV4Xyk7Ci0gICAgICAgIGlmICghY2hhbm5lbF9vcGVuX2N2Xy53YWl0X2Zvcihsb2NrLCBrQ2hhbm5lbE9wZW5UaW1lb3V0LCBbdGhpc10geyByZXR1cm4gY2hhbm5lbF8gIT0gbnVsbHB0cjsgfSkpIHsKLSAgICAgICAgICBMT0dfV0FSTigiQ2hhbm5lbCBpcyBub3Qgb3BlbiBmb3IgcHNtICVkIiwgcHNtXyk7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgICBjaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5SZWdpc3RlckVucXVldWUoCi0gICAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmTDJjYXBEeW5hbWljQ2hhbm5lbEhlbHBlcjo6ZW5xdWV1ZV9jYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlBhc3NlZChzdGQ6Om1vdmUocHJvbWlzZSkpKSk7Ci0gICAgICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMCkpOwotICAgICAgaWYgKHN0YXR1cyAhPSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7Ci0gICAgICAgIExPR19FUlJPUigiQ2FuJ3Qgc2VuZCBwYWNrZXQgYmVjYXVzZSB0aGUgcHJldmlvdXMgcGFja2V0IHdhc24ndCBzZW50IHlldCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gZW5xdWV1ZV9jYWxsYmFjayhzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgICAgIGF1dG8gcGFja2V0X29uZSA9IHN0ZDo6bWFrZV91bmlxdWU8cGFja2V0OjpSYXdCdWlsZGVyPigyMDAwKTsKLSAgICAgIHBhY2tldF9vbmUtPkFkZE9jdGV0cyhwYWNrZXQpOwotICAgICAgY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICAgIHByb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgICByZXR1cm4gcGFja2V0X29uZTsKLSAgICB9Ci0KLSAgICBMMmNhcExlTW9kdWxlRmFjYWRlU2VydmljZSogZmFjYWRlX3NlcnZpY2VfOwotICAgIEwyY2FwTGVNb2R1bGUqIGwyY2FwX2xheWVyXzsKLSAgICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsTWFuYWdlcj4gZHluYW1pY19jaGFubmVsX21hbmFnZXJfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbFNlcnZpY2U+IHNlcnZpY2VfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbD4gY2hhbm5lbF8gPSBudWxscHRyOwotICAgIFBzbSBwc21fOwotICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCBjaGFubmVsX29wZW5fZmFpbF9yZWFzb25fOwotICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNoYW5uZWxfb3Blbl9jdl87Ci0gICAgc3RkOjptdXRleCBjaGFubmVsX29wZW5fY3ZfbXV0ZXhfOwotICB9OwotCi0gIDo6Z3JwYzo6U3RhdHVzIFNldEZpeGVkQ2hhbm5lbCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFNldEVuYWJsZUZpeGVkQ2hhbm5lbFJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGlmIChyZXF1ZXN0LT5lbmFibGUoKSkgewotICAgICAgZml4ZWRfY2hhbm5lbF9oZWxwZXJfbWFwXy5lbXBsYWNlKHJlcXVlc3QtPmNpZCgpLCBzdGQ6Om1ha2VfdW5pcXVlPEwyY2FwRml4ZWRDaGFubmVsSGVscGVyPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGwyY2FwX2xheWVyXywgZmFjYWRlX2hhbmRsZXJfLCByZXF1ZXN0LT5jaWQoKSkpOwotICAgICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBzZXJ2aWNlX2hlbHBlciA9IGZpeGVkX2NoYW5uZWxfaGVscGVyX21hcF8uZmluZChyZXF1ZXN0LT5jaWQoKSk7Ci0gICAgICBpZiAoc2VydmljZV9oZWxwZXIgPT0gZml4ZWRfY2hhbm5lbF9oZWxwZXJfbWFwXy5lbmQoKSkgewotICAgICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiQ2lkIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgICB9Ci0gICAgICBzZXJ2aWNlX2hlbHBlci0+c2Vjb25kLT5jaGFubmVsXy0+UmVsZWFzZSgpOwotICAgICAgc2VydmljZV9oZWxwZXItPnNlY29uZC0+c2VydmljZV8tPlVucmVnaXN0ZXIoY29tbW9uOjpCaW5kT25jZShbXSB7fSksIGZhY2FkZV9oYW5kbGVyXyk7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICAgIH0KLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmRGaXhlZENoYW5uZWxQYWNrZXQoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBGaXhlZENoYW5uZWxQYWNrZXQqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9tYXBfbXV0ZXhfKTsKLSAgICBpZiAoZml4ZWRfY2hhbm5lbF9oZWxwZXJfbWFwXy5maW5kKHJlcXVlc3QtPmNpZCgpKSA9PSBmaXhlZF9jaGFubmVsX2hlbHBlcl9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gOjpncnBjOjpTdGF0dXMoOjpncnBjOjpTdGF0dXNDb2RlOjpGQUlMRURfUFJFQ09ORElUSU9OLCAiQ2lkIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldChyZXF1ZXN0LT5wYXlsb2FkKCkuYmVnaW4oKSwgcmVxdWVzdC0+cGF5bG9hZCgpLmVuZCgpKTsKLSAgICBpZiAoIWZpeGVkX2NoYW5uZWxfaGVscGVyX21hcF9bcmVxdWVzdC0+Y2lkKCldLT5TZW5kUGFja2V0KHBhY2tldCkpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OkZBSUxFRF9QUkVDT05ESVRJT04sICJDaGFubmVsIG5vdCBvcGVuIik7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICBjbGFzcyBMMmNhcEZpeGVkQ2hhbm5lbEhlbHBlciB7Ci0gICBwdWJsaWM6Ci0gICAgTDJjYXBGaXhlZENoYW5uZWxIZWxwZXIoTDJjYXBMZU1vZHVsZUZhY2FkZVNlcnZpY2UqIHNlcnZpY2UsIEwyY2FwTGVNb2R1bGUqIGwyY2FwX2xheWVyLCBvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaWQgY2lkKQotICAgICAgICA6IGZhY2FkZV9zZXJ2aWNlXyhzZXJ2aWNlKSwgbDJjYXBfbGF5ZXJfKGwyY2FwX2xheWVyKSwgaGFuZGxlcl8oaGFuZGxlciksIGNpZF8oY2lkKSB7Ci0gICAgICBmaXhlZF9jaGFubmVsX21hbmFnZXJfID0gbDJjYXBfbGF5ZXJfLT5HZXRGaXhlZENoYW5uZWxNYW5hZ2VyKCk7Ci0gICAgICBmaXhlZF9jaGFubmVsX21hbmFnZXJfLT5SZWdpc3RlclNlcnZpY2UoCi0gICAgICAgICAgY2lkXywKLSAgICAgICAgICBjb21tb246OkJpbmRPbmNlKCZMMmNhcEZpeGVkQ2hhbm5lbEhlbHBlcjo6b25fbDJjYXBfc2VydmljZV9yZWdpc3RyYXRpb25fY29tcGxldGUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgY29tbW9uOjpCaW5kKCZMMmNhcEZpeGVkQ2hhbm5lbEhlbHBlcjo6b25fY29ubmVjdGlvbl9vcGVuLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLCBoYW5kbGVyXyk7Ci0gICAgfQotCi0gICAgfkwyY2FwRml4ZWRDaGFubmVsSGVscGVyKCkgewotICAgICAgaWYgKGNoYW5uZWxfICE9IG51bGxwdHIpIHsKLSAgICAgICAgY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICAgICAgY2hhbm5lbF8tPlJlbGVhc2UoKTsKLSAgICAgICAgY2hhbm5lbF8gPSBudWxscHRyOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgQ29ubmVjdChoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7Ci0gICAgICBmaXhlZF9jaGFubmVsX21hbmFnZXJfLT5Db25uZWN0U2VydmljZXMoCi0gICAgICAgICAgYWRkcmVzcywgY29tbW9uOjpCaW5kT25jZSgmTDJjYXBGaXhlZENoYW5uZWxIZWxwZXI6Om9uX2Nvbm5lY3RfZmFpbCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgaGFuZGxlcl8pOwotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgaWYgKCFjaGFubmVsX29wZW5fY3ZfLndhaXRfZm9yKGxvY2ssIGtDaGFubmVsT3BlblRpbWVvdXQsIFt0aGlzXSB7IHJldHVybiBjaGFubmVsXyAhPSBudWxscHRyOyB9KSkgewotICAgICAgICBMT0dfV0FSTigiQ2hhbm5lbCBpcyBub3Qgb3BlbiBmb3IgY2lkICVkIiwgY2lkXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbl9sMmNhcF9zZXJ2aWNlX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZShGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQgcmVnaXN0cmF0aW9uX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxTZXJ2aWNlPiBzZXJ2aWNlKSB7Ci0gICAgICBpZiAocmVnaXN0cmF0aW9uX3Jlc3VsdCAhPSBGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlcnZpY2VfID0gc3RkOjptb3ZlKHNlcnZpY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGludm9rZWQgZnJvbSBGYWNhZGUgSGFuZGxlcgotICAgIHZvaWQgb25fY29ubmVjdGlvbl9vcGVuKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgICBjaGFubmVsXyA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgY2hhbm5lbF8tPlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZE9uY2UoJkwyY2FwRml4ZWRDaGFubmVsSGVscGVyOjpvbl9jbG9zZV9jYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gICAgICAgIGNoYW5uZWxfLT5BY3F1aXJlKCk7Ci0gICAgICB9Ci0gICAgICBjaGFubmVsX29wZW5fY3ZfLm5vdGlmeV9hbGwoKTsKLSAgICAgIGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgICBmYWNhZGVfc2VydmljZV8tPmZhY2FkZV9oYW5kbGVyXywKLSAgICAgICAgICBjb21tb246OkJpbmQoJkwyY2FwRml4ZWRDaGFubmVsSGVscGVyOjpvbl9pbmNvbWluZ19wYWNrZXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIH0KLQotICAgIHZvaWQgb25fY2xvc2VfY2FsbGJhY2soaGNpOjpFcnJvckNvZGUgZXJyb3JfY29kZSkgewotICAgICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soY2hhbm5lbF9vcGVuX2N2X211dGV4Xyk7Ci0gICAgICAgIGNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgICB9Ci0gICAgICBjaGFubmVsXyA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdm9pZCBvbl9jb25uZWN0X2ZhaWwoRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsKLSAgICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgICBjaGFubmVsXyA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBjaGFubmVsX29wZW5fY3ZfLm5vdGlmeV9hbGwoKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uX2luY29taW5nX3BhY2tldCgpIHsKLSAgICAgIGF1dG8gcGFja2V0ID0gY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICAgICAgc3RkOjpzdHJpbmcgZGF0YSA9IHN0ZDo6c3RyaW5nKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0gICAgICBMMmNhcFBhY2tldCBsMmNhcF9kYXRhOwotICAgICAgbDJjYXBfZGF0YS5zZXRfZml4ZWRfY2lkKGNpZF8pOwotICAgICAgbDJjYXBfZGF0YS5zZXRfcGF5bG9hZChkYXRhKTsKLSAgICAgIGZhY2FkZV9zZXJ2aWNlXy0+cGVuZGluZ19sMmNhcF9kYXRhXy5PbkluY29taW5nRXZlbnQobDJjYXBfZGF0YSk7Ci0gICAgfQotCi0gICAgYm9vbCBTZW5kUGFja2V0KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCkgewotICAgICAgaWYgKGNoYW5uZWxfID09IG51bGxwdHIpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGNoYW5uZWxfb3Blbl9jdl9tdXRleF8pOwotICAgICAgICBpZiAoIWNoYW5uZWxfb3Blbl9jdl8ud2FpdF9mb3IobG9jaywga0NoYW5uZWxPcGVuVGltZW91dCwgW3RoaXNdIHsgcmV0dXJuIGNoYW5uZWxfICE9IG51bGxwdHI7IH0pKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIkNoYW5uZWwgaXMgbm90IG9wZW4gZm9yIGNpZCAlZCIsIGNpZF8pOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgICAgY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+UmVnaXN0ZXJFbnF1ZXVlKAotICAgICAgICAgIGhhbmRsZXJfLCBjb21tb246OkJpbmQoJkwyY2FwRml4ZWRDaGFubmVsSGVscGVyOjplbnF1ZXVlX2NhbGxiYWNrLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6UGFzc2VkKHN0ZDo6bW92ZShwcm9taXNlKSkpKTsKLSAgICAgIGF1dG8gc3RhdHVzID0gZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNTAwKSk7Ci0gICAgICBpZiAoc3RhdHVzICE9IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDYW4ndCBzZW5kIHBhY2tldCBiZWNhdXNlIHRoZSBwcmV2aW91cyBwYWNrZXQgd2Fzbid0IHNlbnQgeWV0Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBlbnF1ZXVlX2NhbGxiYWNrKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgICAgYXV0byBwYWNrZXRfb25lID0gc3RkOjptYWtlX3VuaXF1ZTxwYWNrZXQ6OlJhd0J1aWxkZXI+KDIwMDApOwotICAgICAgcGFja2V0X29uZS0+QWRkT2N0ZXRzKHBhY2tldCk7Ci0gICAgICBjaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICAgICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgIHJldHVybiBwYWNrZXRfb25lOwotICAgIH0KLQotICAgIEwyY2FwTGVNb2R1bGVGYWNhZGVTZXJ2aWNlKiBmYWNhZGVfc2VydmljZV87Ci0gICAgTDJjYXBMZU1vZHVsZSogbDJjYXBfbGF5ZXJfOwotICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsTWFuYWdlcj4gZml4ZWRfY2hhbm5lbF9tYW5hZ2VyXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsU2VydmljZT4gc2VydmljZV87Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbF8gPSBudWxscHRyOwotICAgIENpZCBjaWRfOwotICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNoYW5uZWxfb3Blbl9jdl87Ci0gICAgc3RkOjptdXRleCBjaGFubmVsX29wZW5fY3ZfbXV0ZXhfOwotICB9OwotCi0gIDo6Z3JwYzo6U3RhdHVzIFNlbmRDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgQ29ubmVjdGlvblBhcmFtZXRlciogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBpZiAoZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OkZBSUxFRF9QUkVDT05ESVRJT04sICJOZWVkIHRvIG9wZW4gYXQgbGVhc3Qgb25lIGR5bmFtaWMgY2hhbm5lbCBmaXJzdCIpOwotICAgIH0KLSAgICBhdXRvJiBkeW5hbWljX2NoYW5uZWxfaGVscGVyID0gZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmJlZ2luKCktPnNlY29uZDsKLSAgICBkeW5hbWljX2NoYW5uZWxfaGVscGVyLT5jaGFubmVsXy0+R2V0TGlua09wdGlvbnMoKS0+VXBkYXRlQ29ubmVjdGlvblBhcmFtZXRlcigKLSAgICAgICAgcmVxdWVzdC0+Y29ubl9pbnRlcnZhbF9taW4oKSwgcmVxdWVzdC0+Y29ubl9pbnRlcnZhbF9tYXgoKSwgcmVxdWVzdC0+Y29ubl9sYXRlbmN5KCksCi0gICAgICAgIHJlcXVlc3QtPnN1cGVydmlzaW9uX3RpbWVvdXQoKSwgcmVxdWVzdC0+bWluX2NlX2xlbmd0aCgpLCByZXF1ZXN0LT5tYXhfY2VfbGVuZ3RoKCkpOwotCi0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIEwyY2FwTGVNb2R1bGUqIGwyY2FwX2xheWVyXzsKLSAgb3M6OkhhbmRsZXIqIGZhY2FkZV9oYW5kbGVyXzsKLSAgc3RkOjptdXRleCBjaGFubmVsX21hcF9tdXRleF87Ci0gIHN0ZDo6bWFwPFBzbSwgc3RkOjp1bmlxdWVfcHRyPEwyY2FwRHluYW1pY0NoYW5uZWxIZWxwZXI+PiBkeW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF87Ci0gIHN0ZDo6bWFwPENpZCwgc3RkOjp1bmlxdWVfcHRyPEwyY2FwRml4ZWRDaGFubmVsSGVscGVyPj4gZml4ZWRfY2hhbm5lbF9oZWxwZXJfbWFwXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPEwyY2FwUGFja2V0PiBwZW5kaW5nX2wyY2FwX2RhdGFfeyJGZXRjaEwyY2FwRGF0YSJ9OwotfTsKLQotdm9pZCBMMmNhcExlTW9kdWxlRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxsMmNhcDo6bGU6OkwyY2FwTGVNb2R1bGU+KCk7Ci19Ci0KLXZvaWQgTDJjYXBMZU1vZHVsZUZhY2FkZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IG5ldyBMMmNhcExlTW9kdWxlRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZT4oKSwgR2V0SGFuZGxlcigpKTsKLX0KLQotdm9pZCBMMmNhcExlTW9kdWxlRmFjYWRlTW9kdWxlOjpTdG9wKCkgewotICBkZWxldGUgc2VydmljZV87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdG9wKCk7Ci19Ci0KLTo6Z3JwYzo6U2VydmljZSogTDJjYXBMZU1vZHVsZUZhY2FkZU1vZHVsZTo6R2V0U2VydmljZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNlcnZpY2VfOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEwyY2FwTGVNb2R1bGVGYWNhZGVNb2R1bGU6OkZhY3RvcnkgPQotICAgIDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IEwyY2FwTGVNb2R1bGVGYWNhZGVNb2R1bGUoKTsgfSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9mYWNhZGUuaCBiL2dkL2wyY2FwL2xlL2ZhY2FkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY2OGMwLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ZhY2FkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotCi1jbGFzcyBMMmNhcExlTW9kdWxlRmFjYWRlU2VydmljZTsKLQotY2xhc3MgTDJjYXBMZU1vZHVsZUZhY2FkZU1vZHVsZSA6IHB1YmxpYyA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgOjpncnBjOjpTZXJ2aWNlKiBHZXRTZXJ2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBMMmNhcExlTW9kdWxlRmFjYWRlU2VydmljZSogc2VydmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZmFjYWRlLnByb3RvIGIvZ2QvbDJjYXAvbGUvZmFjYWRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI0ODQxLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ZhY2FkZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGJsdWV0b290aC5sMmNhcC5sZTsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotaW1wb3J0ICJmYWNhZGUvY29tbW9uLnByb3RvIjsKLQotc2VydmljZSBMMmNhcExlTW9kdWxlRmFjYWRlIHsKLSAgcnBjIEZldGNoTDJjYXBEYXRhKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIEwyY2FwUGFja2V0KSB7fQotICAvLyBJbml0aWF0ZSBhIGNyZWRpdCBiYXNlZCBjb25uZWN0aW9uIHJlcXVlc3QgYW5kIGJsb2NrIHVudGlsIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZvciB1cCB0byBzb21lIHRpbWVvdXQgKDJzKQotICBycGMgT3BlbkR5bmFtaWNDaGFubmVsKE9wZW5EeW5hbWljQ2hhbm5lbFJlcXVlc3QpIHJldHVybnMgKE9wZW5EeW5hbWljQ2hhbm5lbFJlc3BvbnNlKSB7fQotICBycGMgQ2xvc2VEeW5hbWljQ2hhbm5lbChDbG9zZUR5bmFtaWNDaGFubmVsUmVxdWVzdCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2V0RHluYW1pY0NoYW5uZWwoU2V0RW5hYmxlRHluYW1pY0NoYW5uZWxSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZW5kRHluYW1pY0NoYW5uZWxQYWNrZXQoRHluYW1pY0NoYW5uZWxQYWNrZXQpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNldEZpeGVkQ2hhbm5lbChTZXRFbmFibGVGaXhlZENoYW5uZWxSZXF1ZXN0KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZW5kRml4ZWRDaGFubmVsUGFja2V0KEZpeGVkQ2hhbm5lbFBhY2tldCkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2VuZENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGUoQ29ubmVjdGlvblBhcmFtZXRlcikgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotfQotCi1tZXNzYWdlIEwyY2FwUGFja2V0IHsKLSAgb25lb2YgY2hhbm5lbF90eXBlIHsKLSAgICB1aW50MzIgcHNtID0gMTsKLSAgICB1aW50MzIgZml4ZWRfY2lkID0gMjsKLSAgfQotICBieXRlcyBwYXlsb2FkID0gMzsKLX0KLQotbWVzc2FnZSBEeW5hbWljQ2hhbm5lbE9wZW5FdmVudCB7Ci0gIHVpbnQzMiBwc20gPSAxOwotICB1aW50MzIgY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQgPSAyOwotfQotCi1tZXNzYWdlIE9wZW5EeW5hbWljQ2hhbm5lbFJlcXVlc3QgewotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIHJlbW90ZSA9IDE7Ci0gIHVpbnQzMiBwc20gPSAyOwotfQotCi1tZXNzYWdlIE9wZW5EeW5hbWljQ2hhbm5lbFJlc3BvbnNlIHsKLSAgdWludDMyIHN0YXR1cyA9IDE7Ci19Ci0KLW1lc3NhZ2UgQ2xvc2VEeW5hbWljQ2hhbm5lbFJlcXVlc3QgewotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIHJlbW90ZSA9IDE7Ci0gIHVpbnQzMiBwc20gPSAyOwotfQotCi1lbnVtIFNlY3VyaXR5TGV2ZWwgewotICBOT19TRUNVUklUWSA9IDA7Ci0gIFVOQVVUSEVOVElDQVRFRF9QQUlSSU5HX1dJVEhfRU5DUllQVElPTiA9IDE7Ci0gIEFVVEhFTlRJQ0FURURfUEFJUklOR19XSVRIX0VOQ1JZUFRJT04gPSAyOwotICBBVVRIRU5USUNBVEVEX1BBSVJJTkdfV0lUSF8xMjhfQklUX0tFWSA9IDM7Ci0gIEFVVEhPUklaQVRJT04gPSA0OwotfQotCi1tZXNzYWdlIFNldEVuYWJsZUR5bmFtaWNDaGFubmVsUmVxdWVzdCB7Ci0gIHVpbnQzMiBwc20gPSAxOwotICBib29sIGVuYWJsZSA9IDI7Ci0gIFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlfbGV2ZWwgPSAzOwotfQotCi1tZXNzYWdlIER5bmFtaWNDaGFubmVsUGFja2V0IHsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSByZW1vdGUgPSAxOwotICB1aW50MzIgcHNtID0gMjsKLSAgYnl0ZXMgcGF5bG9hZCA9IDM7Ci19Ci0KLW1lc3NhZ2UgU2V0RW5hYmxlRml4ZWRDaGFubmVsUmVxdWVzdCB7Ci0gIHVpbnQzMiBjaWQgPSAxOwotICBib29sIGVuYWJsZSA9IDI7Ci19Ci0KLW1lc3NhZ2UgRml4ZWRDaGFubmVsUGFja2V0IHsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSByZW1vdGUgPSAxOwotICB1aW50MzIgY2lkID0gMjsKLSAgYnl0ZXMgcGF5bG9hZCA9IDM7Ci19Ci0KLW1lc3NhZ2UgQ29ubmVjdGlvblBhcmFtZXRlciB7Ci0gIHVpbnQzMiBjb25uX2ludGVydmFsX21pbiA9IDI7Ci0gIHVpbnQzMiBjb25uX2ludGVydmFsX21heCA9IDM7Ci0gIHVpbnQzMiBjb25uX2xhdGVuY3kgPSA0OwotICB1aW50MzIgc3VwZXJ2aXNpb25fdGltZW91dCA9IDU7Ci0gIHVpbnQzMiBtaW5fY2VfbGVuZ3RoID0gNjsKLSAgdWludDMyIG1heF9jZV9sZW5ndGggPSA3OwotfQpkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZml4ZWRfY2hhbm5lbC5jYyBiL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiM2ZkNGMuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvZml4ZWRfY2hhbm5lbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9maXhlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotaGNpOjpBZGRyZXNzV2l0aFR5cGUgRml4ZWRDaGFubmVsOjpHZXREZXZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+R2V0RGV2aWNlKCk7Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsOjpSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyLCBGaXhlZENoYW5uZWw6Ok9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjaykgewotICBsMmNhcF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbDo6UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2ssIGltcGxfLCB1c2VyX2hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG9uX2Nsb3NlX2NhbGxiYWNrKSkpOwotfQotCi12b2lkIEZpeGVkQ2hhbm5lbDo6QWNxdWlyZSgpIHsKLSAgbDJjYXBfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbEltcGw6OkFjcXVpcmUsIGltcGxfKSk7Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsOjpSZWxlYXNlKCkgewotICBsMmNhcF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbDo6UmVsZWFzZSwgaW1wbF8pKTsKLX0KLQotY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlciwgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+KgotRml4ZWRDaGFubmVsOjpHZXRRdWV1ZVVwRW5kKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPkdldFF1ZXVlVXBFbmQoKTsKLX0KLQotTGlua09wdGlvbnMqIEZpeGVkQ2hhbm5lbDo6R2V0TGlua09wdGlvbnMoKSB7Ci0gIHJldHVybiBpbXBsXy0+R2V0TGlua09wdGlvbnMoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWwuaCBiL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3Y2M5NC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9maXhlZF9jaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vYmlkaV9xdWV1ZS5oIgotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2xpbmtfb3B0aW9ucy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgRml4ZWRDaGFubmVsSW1wbDsKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vKioKLSAqIEwyQ0FQIGZpeGVkIGNoYW5uZWwgb2JqZWN0LiBXaGVuIGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkLCBpdCBtdXN0IGJlCi0gKiBhY3F1aXJlZCB0aHJvdWdoIGNhbGxpbmcge0BsaW5rIEZpeGVkQ2hhbm5lbCNBY3F1aXJlKCl9IHdpdGhpbiBYIHNlY29uZHMuCi0gKiBPdGhlcndpc2UsIHtAbGluayBGaXhlZENoYW5uZWwjUmVsZWFzZSgpfSB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5LgotICoKLSAqLwotY2xhc3MgRml4ZWRDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIC8vIFNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IG1vZHVsZXMgdGhhdCBoYXZlIGFjY2VzcyB0byBMaW5rTWFuYWdlcgotICBGaXhlZENoYW5uZWwoc3RkOjpzaGFyZWRfcHRyPGludGVybmFsOjpGaXhlZENoYW5uZWxJbXBsPiBpbXBsLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcikKLSAgICAgIDogaW1wbF8oc3RkOjptb3ZlKGltcGwpKSwgbDJjYXBfaGFuZGxlcl8obDJjYXBfaGFuZGxlcikgewotICAgIEFTU0VSVChpbXBsXyAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQobDJjYXBfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIH0KLQotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBHZXREZXZpY2UoKSBjb25zdDsKLQotICAvKioKLSAgICogUmVnaXN0ZXIgY2xvc2UgY2FsbGJhY2suIElmIGNsb3NlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIHdoZW4gYSBjaGFubmVsIGlzIGNsb3NlZCwgdGhlIGNoYW5uZWwncyByZXNvdXJjZSB3aWxsCi0gICAqIG9ubHkgYmUgZnJlZWQgYWZ0ZXIgb25fY2xvc2UgY2FsbGJhY2sgaXMgaW52b2tlZC4gT3RoZXJ3aXNlLCBpZiBubyBvbl9jbG9zZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCB0aGUgY2hhbm5lbCdzCi0gICAqIHJlc291cmNlIHdpbGwgYmUgZnJlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2xvc2luZy4KLSAgICoKLSAgICogQHBhcmFtIHVzZXJfaGFuZGxlciBUaGUgaGFuZGxlciB1c2VkIHRvIGludm9rZSB0aGUgY2FsbGJhY2sgb24KLSAgICogQHBhcmFtIG9uX2Nsb3NlX2NhbGxiYWNrIFRoZSBjYWxsYmFjayBpbnZva2VkIHVwb24gY2hhbm5lbCBjbG9zaW5nLgotICAgKi8KLSAgdXNpbmcgT25DbG9zZUNhbGxiYWNrID0gY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkVycm9yQ29kZSk+OwotICB2b2lkIFJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXIsIE9uQ2xvc2VDYWxsYmFjayBvbl9jbG9zZV9jYWxsYmFjayk7Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlIHRoYXQgdGhpcyBGaXhlZCBDaGFubmVsIGlzIGJlaW5nIHVzZWQuIFRoaXMgd2lsbCBwcmV2ZW50IEFDTCBjb25uZWN0aW9uIGZyb20gYmVpbmcgZGlzY29ubmVjdGVkLgotICAgKi8KLSAgdm9pZCBBY3F1aXJlKCk7Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlIHRoYXQgdGhpcyBGaXhlZCBDaGFubmVsIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkLiBBQ0wgY29ubmVjdGlvbiB3aWxsIGJlIGRpc2Nvbm5lY3RlZCBhZnRlcgotICAgKiBrTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCBpZiBubyBvdGhlciBEeW5hbWljQ2hhbm5lbCBpcyBjb25uZWN0ZWQgb3Igbm8gb3RoZXIgRml4ZWQgQ2hhbm5lbCBpcyAgdXNpbmcgdGhpcwotICAgKiBBQ0wgY29ubmVjdGlvbi4gSG93ZXZlciBhIG1vZHVsZSBjYW4gc3RpbGwgcmVjZWl2ZSBkYXRhIG9uIHRoaXMgY2hhbm5lbCBhcyBsb25nIGFzIGl0IHJlbWFpbnMgb3Blbi4KLSAgICovCi0gIHZvaWQgUmVsZWFzZSgpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBkYXRhIGNoYW5uZWwgcXVldWUgdG8gc2VuZCBhbmQgcmVjZWl2ZSBwYWNrZXRzLgotICAgKgotICAgKiB7QHNlZSBCaWRpUXVldWVFbmR9Ci0gICAqCi0gICAqIEByZXR1cm4gVGhlIHVwcGVyIGVuZCBvZiBhIGJpLWRpcmVjdGlvbmFsIHF1ZXVlLgotICAgKi8KLSAgY29tbW9uOjpCaWRpUXVldWVFbmQ8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlciwgcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+KiBHZXRRdWV1ZVVwRW5kKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgUHJveHkgZm9yIEwyQ0FQIExpbmsgT3B0aW9ucy4KLSAgICogT25seSBmZXcgc3BlY2lhbCBMMkNBUCB1c2VycyBuZWVkIHRvIHVzZSBpdCwgaW5jbHVkaW5nCi0gICAqIEdBVFQsIEhJRCBEZXZpY2UsIFNlY3VyaXR5IE1hbmFnZXIsIGFuZCBKYXZhIEFQSS4KLSAgICovCi0gIExpbmtPcHRpb25zKiBHZXRMaW5rT3B0aW9ucygpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPGludGVybmFsOjpGaXhlZENoYW5uZWxJbXBsPiBpbXBsXzsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5jYyBiL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjNDc2My4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9maXhlZF9jaGFubmVsX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci0KLWJvb2wgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdFNlcnZpY2VzKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Db25uZWN0aW9uRmFpbHVyZUNhbGxiYWNrIG9uX2ZhaWxfY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIGludGVybmFsOjpMaW5rTWFuYWdlcjo6UGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAuaGFuZGxlcl8gPSBoYW5kbGVyLAotICAgICAgLm9uX2ZhaWxfY2FsbGJhY2tfID0gc3RkOjptb3ZlKG9uX2ZhaWxfY2FsbGJhY2spLAotICB9OwotICBsMmNhcF9sYXllcl9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6TGlua01hbmFnZXI6OkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQobGlua19tYW5hZ2VyXyksIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0ZXJTZXJ2aWNlKENpZCBjaWQsIE9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBpbnRlcm5hbDo6Rml4ZWRDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAudXNlcl9oYW5kbGVyXyA9IGhhbmRsZXIsCi0gICAgICAub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyA9IHN0ZDo6bW92ZShvbl9yZWdpc3RyYXRpb25fY29tcGxldGUpLAotICAgICAgLm9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFja18gPSBzdGQ6Om1vdmUob25fY29ubmVjdGlvbl9vcGVuKX07Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlJlZ2lzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZXJ2aWNlX21hbmFnZXJfKSwgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbikpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9maXhlZF9jaGFubmVsX21hbmFnZXIuaCBiL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjA1OWFjLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ZpeGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci0KLWNsYXNzIEwyY2FwTGVNb2R1bGU7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBMaW5rTWFuYWdlcjsKLWNsYXNzIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1jbGFzcyBGaXhlZENoYW5uZWxNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIGVudW0gY2xhc3MgQ29ubmVjdGlvblJlc3VsdENvZGUgewotICAgIFNVQ0NFU1MgPSAwLAotICAgIEZBSUxfTk9fU0VSVklDRV9SRUdJU1RFUkVEID0gMSwgICAgICAvLyBObyBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQKLSAgICBGQUlMX0FMTF9TRVJWSUNFU19IQVZFX0NIQU5ORUwgPSAyLCAgLy8gQWxsIHJlZ2lzdGVyZWQgc2VydmljZXMgYWxyZWFkeSBoYXZlIGEgY2hhbm5lbAotICAgIEZBSUxfSENJX0VSUk9SID0gMywgICAgICAgICAgICAgICAgICAvLyBTZWUgaGNpX2Vycm9yCi0gIH07Ci0KLSAgc3RydWN0IENvbm5lY3Rpb25SZXN1bHQgewotICAgIENvbm5lY3Rpb25SZXN1bHRDb2RlIGNvbm5lY3Rpb25fcmVzdWx0X2NvZGUgPSBDb25uZWN0aW9uUmVzdWx0Q29kZTo6U1VDQ0VTUzsKLSAgICBoY2k6OkVycm9yQ29kZSBoY2lfZXJyb3IgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgfTsKLSAgLyoqCi0gICAqIE9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayhDb25uZWN0aW9uUmVzdWx0IGZhaWx1cmVfcmVhc29uKTsKLSAgICovCi0gIHVzaW5nIE9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayA9IGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQoQ29ubmVjdGlvblJlc3VsdCk+OwotCi0gIC8qKgotICAgKiBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2soRml4ZWRDaGFubmVsIGNoYW5uZWwpOwotICAgKi8KLSAgdXNpbmcgT25Db25uZWN0aW9uT3BlbkNhbGxiYWNrID0gY29tbW9uOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+KT47Ci0KLSAgZW51bSBjbGFzcyBSZWdpc3RyYXRpb25SZXN1bHQgewotICAgIFNVQ0NFU1MgPSAwLAotICAgIEZBSUxfRFVQTElDQVRFX1NFUlZJQ0UgPSAxLCAgLy8gRHVwbGljYXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZvciB0aGUgc2FtZSBDSUQKLSAgICBGQUlMX0lOVkFMSURfU0VSVklDRSA9IDIsICAgIC8vIEludmFsaWQgQ0lECi0gIH07Ci0KLSAgLyoqCi0gICAqIE9uUmVnaXN0cmF0aW9uRmFpbHVyZUNhbGxiYWNrKFJlZ2lzdHJhdGlvblJlc3VsdCByZXN1bHQsIEZpeGVkQ2hhbm5lbFNlcnZpY2Ugc2VydmljZSk7Ci0gICAqLwotICB1c2luZyBPblJlZ2lzdHJhdGlvbkNvbXBsZXRlQ2FsbGJhY2sgPQotICAgICAgY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChSZWdpc3RyYXRpb25SZXN1bHQsIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxTZXJ2aWNlPik+OwotCi0gIC8qKgotICAgKiBDb25uZWN0IHRvIEFMTCBmaXhlZCBjaGFubmVscyBvbiBhIHJlbW90ZSBkZXZpY2UKLSAgICoKLSAgICogLSBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMKLSAgICogLSBXaGVuIGZhbHNlIGlzIHJldHVybmVkLCB0aGUgY29ubmVjdGlvbiBmYWlscyBpbW1lZGlhdGVseQotICAgKiAtIFdoZW4gdHJ1ZSBpcyByZXR1cm5lZCwgbWV0aG9kIGNhbGxlciBzaG91bGQgd2FpdCBmb3Igb25fZmFpbF9jYWxsYmFjayBvciBvbl9vcGVuX2NhbGxiYWNrIHJlZ2lzdGVyZWQgdGhyb3VnaAotICAgKiAgIFJlZ2lzdGVyU2VydmljZSgpIEFQSS4KLSAgICogLSBJZiBhbiBBQ0wgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYW4gQUNMIGNvbm5lY3Rpb24uIEFzIGEgcmVzdWx0LCBvbl9vcGVuX2NhbGxiYWNrCi0gICAqICAgc3VwcGxpZWQgdGhyb3VnaCBSZWdpc3RlclNlcnZpY2UoKSB3aWxsIGJlIHRyaWdnZXJlZCB0byBwcm92aWRlIHRoZSBhY3R1YWwgRml4ZWRDaGFubmVsIG9iamVjdHMKLSAgICogLSBJZiBIQ0kgY29ubmVjdGlvbiBmYWlsZWQsIG9uX2ZhaWxfY2FsbGJhY2sgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBGQUlMX0hDSV9FUlJPUgotICAgKiAtIElmIGZpeGVkIGNoYW5uZWwgb24gYSByZW1vdGUgZGV2aWNlIGlzIGFscmVhZHkgcmVwb3J0ZWQgYXMgY29ubmVjdGVkIHZpYSBvbl9vcGVuX2NhbGxiYWNrIGFuZCBoYXMgYmVlbiBhY3F1aXJlZAotICAgKiAgIHZpYSBGaXhlZENoYW5uZWwjQWNxdWlyZSgpIEFQSSwgaXQgd29uJ3QgYmUgcmVwb3J0ZWQgYWdhaW4KLSAgICogLSBJZiBubyBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQsIG9uX2ZhaWxfY2FsbGJhY2sgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBGQUlMX05PX1NFUlZJQ0VfUkVHSVNURVJFRAotICAgKiAtIElmIHRoZXJlIGlzIGFuIEFDTCBjb25uZWN0aW9uIGFuZCBjaGFubmVscyBmb3IgZWFjaCBzZXJ2aWNlIGlzIGFsbG9jYXRlZCwgb25fZmFpbF9jYWxsYmFjayB3aWxsIGJlIHRyaWdnZXJlZCB3aXRoCi0gICAqICAgRkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMCi0gICAqCi0gICAqIE5PVEU6Ci0gICAqIFRoaXMgY2FsbCB3aWxsIGluaXRpYXRlIGFuIGVmZm9ydCB0byBjb25uZWN0IGFsbCBmaXhlZCBjaGFubmVsIHNlcnZpY2VzIG9uIGEgcmVtb3RlIGRldmljZS4KLSAgICogRHVlIHRvIHRoZSBjb25uZWN0aW9ubGVzcyBuYXR1cmUgb2YgZml4ZWQgY2hhbm5lbHMsIGFsbCBmaXhlZCBjaGFubmVscyB3aWxsIGJlIGNvbm5lY3RlZCB0b2dldGhlci4KLSAgICogSWYgYSBmaXhlZCBjaGFubmVsIHNlcnZpY2UgZG9lcyBub3QgbmVlZCBhIHBhcnRpY3VsYXIgZml4ZWQgY2hhbm5lbC4gSXQgc2hvdWxkIHJlbGVhc2UgdGhlIHJlY2VpdmVkCi0gICAqIGNoYW5uZWwgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVjZWl2aW5nIG9uX29wZW5fY2FsbGJhY2sgdmlhIEZpeGVkQ2hhbm5lbCNSZWxlYXNlKCkKLSAgICoKLSAgICogQSBtb2R1bGUgY2FsbGluZyBDb25uZWN0U2VydmljZXMoKSBtdXN0IGhhdmUgY2FsbGVkIFJlZ2lzdGVyU2VydmljZSgpIGJlZm9yZS4KLSAgICogVGhlIGNhbGxiYWNrIHdpbGwgY29tZSBiYWNrIGZyb20gb25fb3Blbl9jYWxsYmFjayBpbiB0aGUgc2VydmljZSB0aGF0IGlzIHJlZ2lzdGVyZWQKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3Nfd2l0aF90eXBlOiBSZW1vdGUgZGV2aWNlIHdpdGggdHlwZSB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4KLSAgICogQHBhcmFtIGFkZHJlc3NfdHlwZTogQWRkcmVzcyB0eXBlIG9mIHJlbW90ZSBkZXZpY2UKLSAgICogQHBhcmFtIG9uX2ZhaWxfY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gaW5kaWNhdGUgY29ubmVjdGlvbiBmYWlsdXJlIGFsb25nIHdpdGggYSBzdGF0dXMgY29kZS4KLSAgICogQHBhcmFtIGhhbmRsZXI6IFRoZSBoYW5kbGVyIGNvbnRleHQgaW4gd2hpY2ggdG8gZXhlY3V0ZSB0aGUgQGNhbGxiYWNrIHBhcmFtZXRlcnMuCi0gICAqCi0gICAqIFJldHVybnM6IHRydWUgaWYgY29ubmVjdGlvbiB3YXMgYWJsZSB0byBiZSBpbml0aWF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIGJvb2wgQ29ubmVjdFNlcnZpY2VzKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLCBPbkNvbm5lY3Rpb25GYWlsdXJlQ2FsbGJhY2sgb25fZmFpbF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotCi0gIC8qKgotICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gcmVjZWl2ZSBpbmNvbWluZyBjb25uZWN0aW9ucyBib3VuZCB0byBhIHNwZWNpZmljIGNoYW5uZWwuCi0gICAqCi0gICAqIC0gVGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLgotICAgKiAtIFdoZW4gZmFsc2UgaXMgcmV0dXJuZWQsIHRoZSByZWdpc3RyYXRpb24gZmFpbHMgaW1tZWRpYXRlbHkuCi0gICAqIC0gV2hlbiB0cnVlIGlzIHJldHVybmVkLCBtZXRob2QgY2FsbGVyIHNob3VsZCB3YWl0IGZvciBvbl9zZXJ2aWNlX3JlZ2lzdGVyZWQgY2FsbGJhY2sgdGhhdCBjb250YWlucyBhCi0gICAqICAgRml4ZWRDaGFubmVsU2VydmljZSBvYmplY3QuIFRoZSByZWdpc3RlcmVkIHNlcnZpY2UgY2FuIGJlIG1hbmFnZWQgZnJvbSB0aGF0IG9iamVjdC4KLSAgICogLSBJZiBhIENJRCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb3Igc29tZSBvdGhlciBlcnJvciBoYXBwZW5zLCBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCBhCi0gICAqICAgbm9uLVNVQ0NFU1MgdmFsdWUKLSAgICogLSBBZnRlciBhIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCwgYW55IExFIEFDTCBjb25uZWN0aW9uIHdpbGwgY3JlYXRlIGEgRml4ZWRDaGFubmVsIG9iamVjdCB0aGF0IGlzCi0gICAqICAgZGVsaXZlcmVkIHRocm91Z2ggb25fb3Blbl9jYWxsYmFjawotICAgKiAtIG9uX29wZW5fY2FsbGJhY2ssIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYWZ0ZXIgb25fc2VydmljZV9yZWdpc3RlcmVkIGNhbGxiYWNrCi0gICAqCi0gICAqIEBwYXJhbSBjaWQ6ICBjaWQgdXNlZCB0byByZWNlaXZlIGluY29taW5nIGNvbm5lY3Rpb25zCi0gICAqIEBwYXJhbSBvbl9yZWdpc3RyYXRpb25fY29tcGxldGU6IEEgY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhlIHNlcnZpY2Ugc2V0dXAgaGFzIGNvbXBsZXRlZC4gSWYgdGhlIHJldHVybiBzdGF0dXMgaXMKLSAgICogICAgICAgIG5vdCBTVUNDRVNTLCBpdCBtZWFucyBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkIGR1ZSB0byByZWFzb25zIGxpa2UgQ0lEIGFscmVhZHkgdGFrZQotICAgKiBAcGFyYW0gb25fb3Blbl9jYWxsYmFjazogQSBjYWxsYmFjayB0byBpbmRpY2F0ZSBzdWNjZXNzIG9mIGEgY29ubmVjdGlvbiBpbml0aWF0ZWQgZnJvbSBhIHJlbW90ZSBkZXZpY2UuCi0gICAqIEBwYXJhbSBoYW5kbGVyOiBUaGUgaGFuZGxlciBjb250ZXh0IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIEBjYWxsYmFjayBwYXJhbWV0ZXIuCi0gICAqLwotICBib29sIFJlZ2lzdGVyU2VydmljZShDaWQgY2lkLCBPblJlZ2lzdHJhdGlvbkNvbXBsZXRlQ2FsbGJhY2sgb25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICBPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgZnJpZW5kIGNsYXNzIEwyY2FwTGVNb2R1bGU7Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgY29uc3RydWN0b3IgaXMgbm90IHRvIGJlIHVzZWQgYnkgdXNlciBjb2RlCi0gIEZpeGVkQ2hhbm5lbE1hbmFnZXIoaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogc2VydmljZV9tYW5hZ2VyLCBpbnRlcm5hbDo6TGlua01hbmFnZXIqIGxpbmtfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcikKLSAgICAgIDogc2VydmljZV9tYW5hZ2VyXyhzZXJ2aWNlX21hbmFnZXIpLCBsaW5rX21hbmFnZXJfKGxpbmtfbWFuYWdlciksIGwyY2FwX2xheWVyX2hhbmRsZXJfKGwyY2FwX2xheWVyX2hhbmRsZXIpIHt9Ci0gIGludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIHNlcnZpY2VfbWFuYWdlcl8gPSBudWxscHRyOwotICBpbnRlcm5hbDo6TGlua01hbmFnZXIqIGxpbmtfbWFuYWdlcl8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRml4ZWRDaGFubmVsTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmNjIGIvZ2QvbDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhhNzQxLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci0KLXZvaWQgRml4ZWRDaGFubmVsU2VydmljZTo6VW5yZWdpc3RlcihPblVucmVnaXN0ZXJlZENhbGxiYWNrIG9uX3VucmVnaXN0ZXJlZCwgb3M6OkhhbmRsZXIqIG9uX3VucmVnaXN0ZXJlZF9oYW5kbGVyKSB7Ci0gIEFTU0VSVF9MT0cobWFuYWdlcl8gIT0gbnVsbHB0ciwgInRoaXMgc2VydmljZSBpcyBpbnZhbGlkIik7Ci0gIGwyY2FwX2xheWVyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlVucmVnaXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKG1hbmFnZXJfKSwgY2lkXywgc3RkOjptb3ZlKG9uX3VucmVnaXN0ZXJlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fdW5yZWdpc3RlcmVkX2hhbmRsZXIpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9maXhlZF9jaGFubmVsX3NlcnZpY2UuaCBiL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ1NTZlLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLX0KLQotY2xhc3MgRml4ZWRDaGFubmVsU2VydmljZSB7Ci0gcHVibGljOgotICBGaXhlZENoYW5uZWxTZXJ2aWNlKCkgPSBkZWZhdWx0OwotCi0gIHVzaW5nIE9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgPSBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKCk+OwotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVyIGEgc2VydmljZSBmcm9tIEwyQ0FQIG1vZHVsZS4gVGhpcyBvcGVyYXRpb24gY2Fubm90IGZhaWwuCi0gICAqIEFsbCBjaGFubmVscyBvcGVuZWQgZm9yIHRoaXMgc2VydmljZSB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgKgotICAgKiBAcGFyYW0gb25fdW5yZWdpc3RlcmVkIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdW5yZWdpc3RyYXRpb24gaXMgY29tcGxldGUKLSAgICovCi0gIHZvaWQgVW5yZWdpc3RlcihPblVucmVnaXN0ZXJlZENhbGxiYWNrIG9uX3VucmVnaXN0ZXJlZCwgb3M6OkhhbmRsZXIqIG9uX3VucmVnaXN0ZXJlZF9oYW5kbGVyKTsKLQotICBmcmllbmQgaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLQotIHByaXZhdGU6Ci0gIEZpeGVkQ2hhbm5lbFNlcnZpY2UoQ2lkIGNpZCwgaW50ZXJuYWw6OkZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogbWFuYWdlciwgb3M6OkhhbmRsZXIqIGhhbmRsZXIpCi0gICAgICA6IGNpZF8oY2lkKSwgbWFuYWdlcl8obWFuYWdlciksIGwyY2FwX2xheWVyX2hhbmRsZXJfKGhhbmRsZXIpIHt9Ci0gIENpZCBjaWRfID0ga0ludmFsaWRDaWQ7Ci0gIGludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIG1hbmFnZXJfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXJfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRml4ZWRDaGFubmVsU2VydmljZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfaW1wbC5oIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFmMDk0Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLQotI2luY2x1ZGUgImwyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9jb25maWd1cmF0aW9uX29wdGlvbi5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9zZWN1cml0eV9wb2xpY3kuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkR5bmFtaWNDaGFubmVsU2VydmljZUltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RydWN0IFBlbmRpbmdSZWdpc3RyYXRpb24gewotICAgIG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgICBTZWN1cml0eVBvbGljeSBzZWN1cml0eV9wb2xpY3lfOwotICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6T25SZWdpc3RyYXRpb25Db21wbGV0ZUNhbGxiYWNrIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja187Ci0gICAgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXzsKLSAgICBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gY29uZmlndXJhdGlvbl87Ci0gIH07Ci0KLSAgdmlydHVhbCB2b2lkIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICB1c2VyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2Uob25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXywgc3RkOjptb3ZlKGNoYW5uZWwpKSk7Ci0gIH0KLQotICBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gR2V0Q29uZmlnT3B0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBjb25maWdfb3B0aW9uXzsKLSAgfQotCi0gIFNlY3VyaXR5UG9saWN5IEdldFNlY3VyaXR5UG9saWN5KCkgewotICAgIHJldHVybiBzZWN1cml0eV9wb2xpY3lfOwotICB9Ci0KLSAgZnJpZW5kIGNsYXNzIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOwotCi0gcHJvdGVjdGVkOgotICAvLyBwcm90ZWN0ZWQgYWNjZXNzIGZvciBtb2NraW5nCi0gIER5bmFtaWNDaGFubmVsU2VydmljZUltcGwob3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ19vcHRpb24sIFNlY3VyaXR5UG9saWN5IHNlY3VyaXR5X3BvbGljeSkKLSAgICAgIDogdXNlcl9oYW5kbGVyXyh1c2VyX2hhbmRsZXIpLCBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfKHN0ZDo6bW92ZShvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2spKSwKLSAgICAgICAgY29uZmlnX29wdGlvbl8oY29uZmlnX29wdGlvbiksIHNlY3VyaXR5X3BvbGljeV8oc2VjdXJpdHlfcG9saWN5KSB7fQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfOwotICBEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gY29uZmlnX29wdGlvbl87Ci0gIFNlY3VyaXR5UG9saWN5IHNlY3VyaXR5X3BvbGljeV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsX21vY2suaCBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRmZWU4Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfaW1wbC5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotLy8gVW5pdCB0ZXN0IGludGVyZmFjZXMKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCA6IHB1YmxpYyBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKFNlY3VyaXR5UG9saWN5LCBHZXRTZWN1cml0eVBvbGljeSwgKCksIChjb25zdCwgb3ZlcnJpZGUpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MgYi9nZC9sMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODQ4ZjQuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpSZWdpc3RlcihQc20gcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbDo6UGVuZGluZ1JlZ2lzdHJhdGlvbiBwZW5kaW5nX3JlZ2lzdHJhdGlvbikgewotICBpZiAoSXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsU2VydmljZT4gaW52YWxpZF9zZXJ2aWNlKG5ldyBEeW5hbWljQ2hhbm5lbFNlcnZpY2UoKSk7Ci0gICAgcGVuZGluZ19yZWdpc3RyYXRpb24udXNlcl9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19yZWdpc3RyYXRpb24ub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyksCi0gICAgICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpGQUlMX0RVUExJQ0FURV9TRVJWSUNFLCBzdGQ6Om1vdmUoaW52YWxpZF9zZXJ2aWNlKSkpOwotICB9IGVsc2UgewotICAgIHNlcnZpY2VfbWFwXy50cnlfZW1wbGFjZSgKLSAgICAgICAgcHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsKHBlbmRpbmdfcmVnaXN0cmF0aW9uLnVzZXJfaGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19yZWdpc3RyYXRpb24ub25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3JlZ2lzdHJhdGlvbi5jb25maWd1cmF0aW9uXywgcGVuZGluZ19yZWdpc3RyYXRpb24uc2VjdXJpdHlfcG9saWN5XykpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbFNlcnZpY2U+IHVzZXJfc2VydmljZShuZXcgRHluYW1pY0NoYW5uZWxTZXJ2aWNlKHBzbSwgdGhpcywgbDJjYXBfbGF5ZXJfaGFuZGxlcl8pKTsKLSAgICBwZW5kaW5nX3JlZ2lzdHJhdGlvbi51c2VyX2hhbmRsZXJfLT5Qb3N0KAotICAgICAgICBjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbi5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdDo6U1VDQ0VTUywgc3RkOjptb3ZlKHVzZXJfc2VydmljZSkpKTsKLSAgfQotfQotCi12b2lkIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpVbnJlZ2lzdGVyKFBzbSBwc20sIER5bmFtaWNDaGFubmVsU2VydmljZTo6T25VbnJlZ2lzdGVyZWRDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgaWYgKElzU2VydmljZVJlZ2lzdGVyZWQocHNtKSkgewotICAgIHNlcnZpY2VfbWFwXy5lcmFzZShwc20pOwotICAgIGhhbmRsZXItPlBvc3Qoc3RkOjptb3ZlKGNhbGxiYWNrKSk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCJzZXJ2aWNlIG5vdCByZWdpc3RlcmVkIHBzbTolZCIsIHBzbSk7Ci0gIH0KLX0KLQotYm9vbCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDo6SXNTZXJ2aWNlUmVnaXN0ZXJlZChQc20gcHNtKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlX21hcF8uZmluZChwc20pICE9IHNlcnZpY2VfbWFwXy5lbmQoKTsKLX0KLQotRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCogRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OkdldFNlcnZpY2UoUHNtIHBzbSkgewotICBBU1NFUlQoSXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKTsKLSAgcmV0dXJuICZzZXJ2aWNlX21hcF8uZmluZChwc20pLT5zZWNvbmQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxQc20sIER5bmFtaWNDaGFubmVsU2VydmljZUltcGwqPj4gRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OkdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFBzbSwgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICBmb3IgKGF1dG8mIGVsZW0gOiBzZXJ2aWNlX21hcF8pIHsKLSAgICByZXN1bHRzLmVtcGxhY2VfYmFjayhlbGVtLmZpcnN0LCAmZWxlbS5zZWNvbmQpOwotICB9Ci0gIHJldHVybiByZXN1bHRzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk4NTNmLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAibDJjYXAvbGUvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvcHNtLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwob3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXIpCi0gICAgICA6IGwyY2FwX2xheWVyX2hhbmRsZXJfKGwyY2FwX2xheWVyX2hhbmRsZXIpIHt9Ci0KLSAgdmlydHVhbCB+RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwoKSA9IGRlZmF1bHQ7Ci0gIC8vCi0gIC8vIEFsbCBBUElzIG11c3QgYmUgaW52b2tlZCBpbiBMMkNBUCBsYXllciBoYW5kbGVyCi0gIC8vCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlcihQc20gcHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsOjpQZW5kaW5nUmVnaXN0cmF0aW9uIHBlbmRpbmdfcmVnaXN0cmF0aW9uKTsKLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXIoUHNtIHBzbSwgRHluYW1pY0NoYW5uZWxTZXJ2aWNlOjpPblVucmVnaXN0ZXJlZENhbGxiYWNrIGNhbGxiYWNrLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0gIHZpcnR1YWwgYm9vbCBJc1NlcnZpY2VSZWdpc3RlcmVkKFBzbSBwc20pIGNvbnN0OwotICB2aXJ0dWFsIER5bmFtaWNDaGFubmVsU2VydmljZUltcGwqIEdldFNlcnZpY2UoUHNtIHBzbSk7Ci0KLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UHNtLCBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsKj4+IEdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIGlzIHNldCBieSBTZWN1cml0eU1hbmFnZXIgdGhyb3VnaCBMMmNhcE1vZHVsZQotICB2b2lkIFNldFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoU2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSogaW1wbCkgewotICAgIHNlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZV8gPSBpbXBsOwotICB9Ci0KLSAgU2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSogR2V0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgpIHsKLSAgICByZXR1cm4gc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIGwyY2FwX2xheWVyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFBzbSwgRHluYW1pY0NoYW5uZWxTZXJ2aWNlSW1wbD4gc2VydmljZV9tYXBfOwotICBTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKiBzZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2VfOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfdGVzdC5jYyBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMTY1Ni4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2R5bmFtaWNfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZHluYW1pY19jaGFubmVsX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMMmNhcExlRHluYW1pY1NlcnZpY2VNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgfkwyY2FwTGVEeW5hbWljU2VydmljZU1hbmFnZXJUZXN0KCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgT25TZXJ2aWNlUmVnaXN0ZXJlZChib29sIGV4cGVjdF9zdWNjZXNzLCBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY0NoYW5uZWxTZXJ2aWNlPiB1c2VyX3NlcnZpY2UpIHsKLSAgICBFWFBFQ1RfRVEocmVzdWx0ID09IER5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTLCBleHBlY3Rfc3VjY2Vzcyk7Ci0gICAgc2VydmljZV9yZWdpc3RlcmVkXyA9IGV4cGVjdF9zdWNjZXNzOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBvczo6VGhyZWFkKCJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIHVzZXJfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbDJjYXBfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgbWFuYWdlcl8gPSBuZXcgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGx7bDJjYXBfaGFuZGxlcl99OwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgbWFuYWdlcl87Ci0gICAgbDJjYXBfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGwyY2FwX2hhbmRsZXJfOwotICAgIHVzZXJfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIHVzZXJfaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICB2b2lkIHN5bmNfdXNlcl9oYW5kbGVyKCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgdXNlcl9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKTsKLSAgfQotCi0gIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBtYW5hZ2VyXyA9IG51bGxwdHI7Ci0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0KLSAgYm9vbCBzZXJ2aWNlX3JlZ2lzdGVyZWRfID0gZmFsc2U7Ci19OwotCi1URVNUX0YoTDJjYXBMZUR5bmFtaWNTZXJ2aWNlTWFuYWdlclRlc3QsIHJlZ2lzdGVyX2FuZF91bnJlZ2lzdGVyX2xlX2R5bmFtaWNfY2hhbm5lbCkgewotICBEeW5hbWljQ2hhbm5lbFNlcnZpY2VJbXBsOjpQZW5kaW5nUmVnaXN0cmF0aW9uIHBlbmRpbmdfcmVnaXN0cmF0aW9uewotICAgICAgLnVzZXJfaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXJfLAotICAgICAgLnNlY3VyaXR5X3BvbGljeV8gPSBTZWN1cml0eVBvbGljeTo6Tk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LLAotICAgICAgLm9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja18gPQotICAgICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJkwyY2FwTGVEeW5hbWljU2VydmljZU1hbmFnZXJUZXN0OjpPblNlcnZpY2VSZWdpc3RlcmVkLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIHRydWUpfTsKLSAgUHNtIHBzbSA9IDB4NDE7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKTsKLSAgbWFuYWdlcl8tPlJlZ2lzdGVyKHBzbSwgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKHBzbSkpOwotICBzeW5jX3VzZXJfaGFuZGxlcigpOwotICBFWFBFQ1RfVFJVRShzZXJ2aWNlX3JlZ2lzdGVyZWRfKTsKLSAgbWFuYWdlcl8tPlVucmVnaXN0ZXIocHNtLCBjb21tb246OkJpbmRPbmNlKFtdIHt9KSwgdXNlcl9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVEeW5hbWljU2VydmljZU1hbmFnZXJUZXN0LCByZWdpc3Rlcl9sZV9keW5hbWljX2NoYW5uZWxfZXZlbl9udW1iZXJfcHNtKSB7Ci0gIER5bmFtaWNDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAudXNlcl9oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcl8sCi0gICAgICAuc2VjdXJpdHlfcG9saWN5XyA9IFNlY3VyaXR5UG9saWN5OjpOT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0ssCi0gICAgICAub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyA9Ci0gICAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmTDJjYXBMZUR5bmFtaWNTZXJ2aWNlTWFuYWdlclRlc3Q6Ok9uU2VydmljZVJlZ2lzdGVyZWQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgdHJ1ZSl9OwotICBQc20gcHNtID0gMHgwMTAwOwotICBFWFBFQ1RfRkFMU0UobWFuYWdlcl8tPklzU2VydmljZVJlZ2lzdGVyZWQocHNtKSk7Ci0gIG1hbmFnZXJfLT5SZWdpc3Rlcihwc20sIHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbikpOwotICBFWFBFQ1RfVFJVRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKTsKLSAgc3luY191c2VyX2hhbmRsZXIoKTsKLSAgRVhQRUNUX1RSVUUoc2VydmljZV9yZWdpc3RlcmVkXyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5jYyBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1ZGJmYS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvbGVfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotaGNpOjpSb2xlIEZpeGVkQ2hhbm5lbEltcGw6OkdldFJvbGUoKSBjb25zdCB7Ci0gIHJldHVybiBsaW5rXy0+R2V0Um9sZSgpOwotfQotCi1oY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24qIEZpeGVkQ2hhbm5lbEltcGw6OkdldEFjbENvbm5lY3Rpb24oKSBjb25zdCB7Ci0gIHJldHVybiBsaW5rXy0+R2V0QWNsQ29ubmVjdGlvbigpOwotfQotCi1GaXhlZENoYW5uZWxJbXBsOjpGaXhlZENoYW5uZWxJbXBsKENpZCBjaWQsIExpbmsqIGxpbmssIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyKQotICAgIDogY2lkXyhjaWQpLCBkZXZpY2VfKGxpbmstPkdldERldmljZSgpKSwgbGlua18obGluayksIGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpIHsKLSAgQVNTRVJUX0xPRyhjaWRfID49IGtGaXJzdEZpeGVkQ2hhbm5lbCAmJiBjaWRfIDw9IGtMYXN0Rml4ZWRDaGFubmVsLCAiSW52YWxpZCBjaWQ6ICVkIiwgY2lkXyk7Ci0gIEFTU0VSVChsaW5rXyAhPSBudWxscHRyKTsKLSAgQVNTRVJUKGwyY2FwX2hhbmRsZXJfICE9IG51bGxwdHIpOwotfQotCi12b2lkIEZpeGVkQ2hhbm5lbEltcGw6OlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkQ2hhbm5lbDo6T25DbG9zZUNhbGxiYWNrIG9uX2Nsb3NlX2NhbGxiYWNrKSB7Ci0gIEFTU0VSVF9MT0codXNlcl9oYW5kbGVyXyA9PSBudWxscHRyLCAiT25DbG9zZUNhbGxiYWNrIGNhbiBvbmx5IGJlIHJlZ2lzdGVyZWQgb25jZSIpOwotICAvLyBJZiBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLCBjYWxsIHRoZSBjYWxsYmFjayBpbW1lZGlhdGVseSB3aXRob3V0IHNhdmluZyBpdAotICBpZiAoY2xvc2VkXykgewotICAgIHVzZXJfaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShvbl9jbG9zZV9jYWxsYmFjayksIGNsb3NlX3JlYXNvbl8pKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdXNlcl9oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcjsKLSAgb25fY2xvc2VfY2FsbGJhY2tfID0gc3RkOjptb3ZlKG9uX2Nsb3NlX2NhbGxiYWNrKTsKLX0KLQotdm9pZCBGaXhlZENoYW5uZWxJbXBsOjpPbkNsb3NlZChoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsKLSAgQVNTRVJUX0xPRyghY2xvc2VkXywgIkRldmljZSAlcyBDaWQgMHgleCBjbG9zZWQgdHdpY2UsIG9sZCBzdGF0dXMgMHgleCwgbmV3IHN0YXR1cyAweCV4IiwgZGV2aWNlXy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgY2lkXywgc3RhdGljX2Nhc3Q8aW50PihjbG9zZV9yZWFzb25fKSwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKLSAgY2xvc2VkXyA9IHRydWU7Ci0gIGNsb3NlX3JlYXNvbl8gPSBzdGF0dXM7Ci0gIGFjcXVpcmVkXyA9IGZhbHNlOwotICBsaW5rXyA9IG51bGxwdHI7Ci0gIGwyY2FwX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgaWYgKHVzZXJfaGFuZGxlcl8gPT0gbnVsbHB0cikgewotICAgIHJldHVybjsKLSAgfQotICAvLyBPbiBjbG9zZSBjYWxsYmFjayBjYW4gb25seSBiZSBjYWxsZWQgb25jZQotICB1c2VyX2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2Uoc3RkOjptb3ZlKG9uX2Nsb3NlX2NhbGxiYWNrXyksIHN0YXR1cykpOwotICB1c2VyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgb25fY2xvc2VfY2FsbGJhY2tfLlJlc2V0KCk7Ci19Ci0KLXZvaWQgRml4ZWRDaGFubmVsSW1wbDo6QWNxdWlyZSgpIHsKLSAgQVNTRVJUX0xPRyh1c2VyX2hhbmRsZXJfICE9IG51bGxwdHIsICJNdXN0IHJlZ2lzdGVyIE9uQ2xvc2VDYWxsYmFjayBiZWZvcmUgY2FsbGluZyBhbnkgbWV0aG9kcyIpOwotICBpZiAoY2xvc2VkXykgewotICAgIExPR19XQVJOKCIlcyBpcyBhbHJlYWR5IGNsb3NlZCIsIFRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgQVNTRVJUKCFhY3F1aXJlZF8pOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoYWNxdWlyZWRfKSB7Ci0gICAgTE9HX0lORk8oIiVzIHdhcyBhbHJlYWR5IGFjcXVpcmVkIiwgVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYWNxdWlyZWRfID0gdHJ1ZTsKLSAgbGlua18tPlJlZnJlc2hSZWZDb3VudCgpOwotfQotCi12b2lkIEZpeGVkQ2hhbm5lbEltcGw6OlJlbGVhc2UoKSB7Ci0gIEFTU0VSVF9MT0codXNlcl9oYW5kbGVyXyAhPSBudWxscHRyLCAiTXVzdCByZWdpc3RlciBPbkNsb3NlQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgYW55IG1ldGhvZHMiKTsKLSAgaWYgKGNsb3NlZF8pIHsKLSAgICBMT0dfV0FSTigiJXMgaXMgYWxyZWFkeSBjbG9zZWQiLCBUb1N0cmluZygpLmNfc3RyKCkpOwotICAgIEFTU0VSVCghYWNxdWlyZWRfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFhY3F1aXJlZF8pIHsKLSAgICBMT0dfSU5GTygiJXMgd2FzIGFscmVhZHkgcmVsZWFzZWQiLCBUb1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBhY3F1aXJlZF8gPSBmYWxzZTsKLSAgbGlua18tPlJlZnJlc2hSZWZDb3VudCgpOwotfQotCi1DaWQgRml4ZWRDaGFubmVsSW1wbDo6R2V0Q2lkKCkgY29uc3QgewotICByZXR1cm4gY2lkXzsKLX0KLQotQ2lkIEZpeGVkQ2hhbm5lbEltcGw6OkdldFJlbW90ZUNpZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNpZF87Ci19Ci0KLUxpbmtPcHRpb25zKiBGaXhlZENoYW5uZWxJbXBsOjpHZXRMaW5rT3B0aW9ucygpIHsKLSAgcmV0dXJuIGxpbmtfLT5HZXRMaW5rT3B0aW9ucygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGZiM2EzLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvbGVfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9maXhlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvbGlua19vcHRpb25zLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgTGluazsKLQotY2xhc3MgRml4ZWRDaGFubmVsSW1wbCA6IHB1YmxpYyBsMmNhcDo6aW50ZXJuYWw6OkNoYW5uZWxJbXBsIHsKLSBwdWJsaWM6Ci0gIEZpeGVkQ2hhbm5lbEltcGwoQ2lkIGNpZCwgTGluayogbGluaywgb3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIpOwotCi0gIHZpcnR1YWwgfkZpeGVkQ2hhbm5lbEltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgR2V0RGV2aWNlKCkgY29uc3QgewotICAgIHJldHVybiBkZXZpY2VfOwotICB9Ci0KLSAgLyogUmV0dXJuIHRoZSByb2xlIHdlIGhhdmUgaW4gdGhlIGFzc29jaWF0ZWQgbGluayAqLwotICB2aXJ0dWFsIGhjaTo6Um9sZSBHZXRSb2xlKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBoY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24qIEdldEFjbENvbm5lY3Rpb24oKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2sob3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlciwgRml4ZWRDaGFubmVsOjpPbkNsb3NlQ2FsbGJhY2sgb25fY2xvc2VfY2FsbGJhY2spOwotCi0gIHZpcnR1YWwgdm9pZCBBY3F1aXJlKCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsKLQotICB2aXJ0dWFsIGJvb2wgSXNBY3F1aXJlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYWNxdWlyZWRfOwotICB9Ci0KLSAgQ2lkIEdldENpZCgpIGNvbnN0IG92ZXJyaWRlOwotICBDaWQgR2V0UmVtb3RlQ2lkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgdm9pZCBPbkNsb3NlZChoY2k6OkVycm9yQ29kZSBzdGF0dXMpOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJEZXZpY2UgIiA8PCBkZXZpY2VfIDw8ICIgQ2lkIDB4IiA8PCBzdGQ6OmhleCA8PCBjaWRfOwotICAgIHJldHVybiBzcy5zdHIoKTsKLSAgfQotCi0gIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXIsIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+PiogR2V0UXVldWVVcEVuZCgpIHsKLSAgICByZXR1cm4gY2hhbm5lbF9xdWV1ZV8uR2V0VXBFbmQoKTsKLSAgfQotCi0gIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+LCBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiogR2V0UXVldWVEb3duRW5kKCkgewotICAgIHJldHVybiBjaGFubmVsX3F1ZXVlXy5HZXREb3duRW5kKCk7Ci0gIH0KLQotICBMaW5rT3B0aW9ucyogR2V0TGlua09wdGlvbnMoKTsKLQotIHByaXZhdGU6Ci0gIC8vIENvbnN0cnVjdG9yIHN0YXRlcwotICAvLyBGb3IgbG9nZ2luZyBwdXJwb3NlIG9ubHkKLSAgY29uc3QgQ2lkIGNpZF87Ci0gIC8vIEZvciBsb2dnaW5nIHB1cnBvc2Ugb25seQotICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2VfOwotICAvLyBOZWVkZWQgdG8gaGFuZGxlIEFjcXVpcmUoKSBhbmQgUmVsZWFzZSgpCi0gIExpbmsqIGxpbmtfOwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl87Ci0KLSAgLy8gVXNlciBzdXBwb3J0ZWQgc3RhdGVzCi0gIG9zOjpIYW5kbGVyKiB1c2VyX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgRml4ZWRDaGFubmVsOjpPbkNsb3NlQ2FsbGJhY2sgb25fY2xvc2VfY2FsbGJhY2tfe307Ci0KLSAgLy8gSW50ZXJuYWwgc3RhdGVzCi0gIGJvb2wgYWNxdWlyZWRfID0gZmFsc2U7Ci0gIGJvb2wgY2xvc2VkXyA9IGZhbHNlOwotICBoY2k6OkVycm9yQ29kZSBjbG9zZV9yZWFzb25fID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtDaGFubmVsUXVldWVTaXplID0gMTA7Ci0gIGNvbW1vbjo6QmlkaVF1ZXVlPHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+LCBwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBjaGFubmVsX3F1ZXVlX3sKLSAgICAgIGtDaGFubmVsUXVldWVTaXplfTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRml4ZWRDaGFubmVsSW1wbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGxfbW9jay5oIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhYTdlNS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGxfbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tGaXhlZENoYW5uZWxJbXBsIDogcHVibGljIEZpeGVkQ2hhbm5lbEltcGwgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Qodm9pZCwgUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgIChvczo6SGFuZGxlciAqIHVzZXJfaGFuZGxlciwgRml4ZWRDaGFubmVsOjpPbkNsb3NlQ2FsbGJhY2sgb25fY2xvc2VfY2FsbGJhY2spLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgQWNxdWlyZSwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBSZWxlYXNlLCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIElzQWNxdWlyZWQsICgpLCAob3ZlcnJpZGUsIGNvbnN0KSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIE9uQ2xvc2VkLCAoaGNpOjpFcnJvckNvZGUgc3RhdHVzKSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbF90ZXN0LmNjIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWYyNzYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJjb21tb24vdGVzdGluZy9iaW5kX3Rlc3RfdXRpbC5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvbGlua19tb2NrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdXNpbmcgaGNpOjpBZGRyZXNzOwotdXNpbmcgaGNpOjpBZGRyZXNzV2l0aFR5cGU7Ci11c2luZyBsMmNhcDo6aW50ZXJuYWw6OnRlc3Rpbmc6Ok1vY2tQYXJhbWV0ZXJQcm92aWRlcjsKLXVzaW5nIHRlc3Rpbmc6Ok1vY2tMaW5rOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLWNsYXNzIEwyY2FwTGVGaXhlZENoYW5uZWxJbXBsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgU3luY0hhbmRsZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGhhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpKTsKLSAgICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgbDJjYXBfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGwyY2FwX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBsMmNhcF9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKEwyY2FwTGVGaXhlZENoYW5uZWxJbXBsVGVzdCwgZ2V0X2RldmljZSkgewotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLCBHZXRMZUxpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSkuVGltZXMoMSk7Ci0gIHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24qIG1vY2tfYWNsX2Nvbm5lY3Rpb24gPSBuZXcgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbigpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19hY2xfY29ubmVjdGlvbiwgR2V0UmVtb3RlQWRkcmVzcygpKS5UaW1lcygxKTsKLSAgTW9ja0xpbmsgbW9ja19sZV9saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbj4obW9ja19hY2xfY29ubmVjdGlvbiksIG51bGxwdHIgLyogTGlua01hbmFnZXIqICovKTsKLSAgQWRkcmVzc1dpdGhUeXBlIGRldmljZXt7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9saW5rLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBMT0dfSU5GTygiLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfbGVfbGluaywgbDJjYXBfaGFuZGxlcl8pOwotICBFWFBFQ1RfRVEoZGV2aWNlLCBmaXhlZF9jaGFubmVsX2ltcGwuR2V0RGV2aWNlKCkpOwotfQotCi1URVNUX0YoTDJjYXBMZUZpeGVkQ2hhbm5lbEltcGxUZXN0LCBjbG9zZV90cmlnZ2Vyc19jYWxsYmFjaykgewotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLCBHZXRMZUxpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSkuVGltZXMoMSk7Ci0gIHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24qIG1vY2tfYWNsX2Nvbm5lY3Rpb24gPSBuZXcgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbigpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19hY2xfY29ubmVjdGlvbiwgR2V0UmVtb3RlQWRkcmVzcygpKS5UaW1lcygxKTsKLSAgTW9ja0xpbmsgbW9ja19sZV9saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbj4obW9ja19hY2xfY29ubmVjdGlvbiksIG51bGxwdHIgLyogTGlua01hbmFnZXIqICovKTsKLSAgQWRkcmVzc1dpdGhUeXBlIGRldmljZXt7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9saW5rLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBGaXhlZENoYW5uZWxJbXBsIGZpeGVkX2NoYW5uZWxfaW1wbChrU21wQnJDaWQsICZtb2NrX2xlX2xpbmssIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBSZWdpc3RlciBvbiBjbG9zZSBjYWxsYmFjawotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotICBoY2k6OkVycm9yQ29kZSBteV9zdGF0dXMgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgZml4ZWRfY2hhbm5lbF9pbXBsLlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyLmdldCgpLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgbXlfc3RhdHVzID0gc3RhdHVzOyB9KSk7Ci0KLSAgLy8gQ2hhbm5lbCBjbG9zdXJlIHNob3VsZCB0cmlnZ2VyIHN1Y2ggY2FsbGJhY2sKLSAgZml4ZWRfY2hhbm5lbF9pbXBsLk9uQ2xvc2VkKGhjaTo6RXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04pOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXIuZ2V0KCkpOwotICBFWFBFQ1RfRVEoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTiwgbXlfc3RhdHVzKTsKLQotICB1c2VyX2hhbmRsZXItPkNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcExlRml4ZWRDaGFubmVsSW1wbFRlc3QsIHJlZ2lzdGVyX2NhbGxiYWNrX2FmdGVyX2Nsb3NlX3Nob3VsZF9jYWxsX2ltbWVkaWF0ZWx5KSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCgpKS5UaW1lcygxKTsKLSAgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uKCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBHZXRSZW1vdGVBZGRyZXNzKCkpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2xlX2xpbmsobDJjYXBfaGFuZGxlcl8sICZtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciogKi8pOwotICBBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfbGVfbGluaywgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIENoYW5uZWwgY2xvc3VyZSBzaG91bGQgZG8gbm90aGluZwotICBmaXhlZF9jaGFubmVsX2ltcGwuT25DbG9zZWQoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sgc2hvdWxkIHRyaWdnZXIgY2FsbGJhY2sgaW1tZWRpYXRlbHkKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgaGNpOjpFcnJvckNvZGUgbXlfc3RhdHVzID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGZpeGVkX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IG15X3N0YXR1cyA9IHN0YXR1czsgfSkpOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXIuZ2V0KCkpOwotICBFWFBFQ1RfRVEoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTiwgbXlfc3RhdHVzKTsKLQotICB1c2VyX2hhbmRsZXItPkNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcExlRml4ZWRDaGFubmVsSW1wbFRlc3QsIGNsb3NlX3R3aWNlX3Nob3VsZF9mYWlsKSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCgpKS5UaW1lcygxKTsKLSAgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uKCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBHZXRSZW1vdGVBZGRyZXNzKCkpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2xlX2xpbmsobDJjYXBfaGFuZGxlcl8sICZtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciogKi8pOwotICBBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfbGVfbGluaywgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIG9uIGNsb3NlIGNhbGxiYWNrCi0gIGF1dG8gdXNlcl9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6SGFuZGxlcj4odGhyZWFkXyk7Ci0gIGhjaTo6RXJyb3JDb2RlIG15X3N0YXR1cyA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBmaXhlZF9jaGFubmVsX2ltcGwuUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICB1c2VyX2hhbmRsZXIuZ2V0KCksIGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBteV9zdGF0dXMgPSBzdGF0dXM7IH0pKTsKLQotICAvLyBDaGFubmVsIGNsb3N1cmUgc2hvdWxkIHRyaWdnZXIgc3VjaCBjYWxsYmFjawotICBmaXhlZF9jaGFubmVsX2ltcGwuT25DbG9zZWQoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlci5nZXQoKSk7Ci0gIEVYUEVDVF9FUShoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OLCBteV9zdGF0dXMpOwotCi0gIC8vIDJuZCBPbkNsb3NlKCkgY2FsbGJhY2sgc2hvdWxkIGZhaWwKLSAgRVhQRUNUX0RFQVRIKGZpeGVkX2NoYW5uZWxfaW1wbC5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6UEFHRV9USU1FT1VUKSwgIi4qT25DbG9zZWQuKiIpOwotCi0gIHVzZXJfaGFuZGxlci0+Q2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVGaXhlZENoYW5uZWxJbXBsVGVzdCwgbXVsdGlwbGVfcmVnaXN0ZXJhdGlvbl9zaG91bGRfZmFpbCkgewotICBNb2NrUGFyYW1ldGVyUHJvdmlkZXIgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLCBHZXRMZUxpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSkuVGltZXMoMSk7Ci0gIHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24qIG1vY2tfYWNsX2Nvbm5lY3Rpb24gPSBuZXcgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbigpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19hY2xfY29ubmVjdGlvbiwgR2V0UmVtb3RlQWRkcmVzcygpKS5UaW1lcygxKTsKLSAgTW9ja0xpbmsgbW9ja19sZV9saW5rKGwyY2FwX2hhbmRsZXJfLCAmbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbj4obW9ja19hY2xfY29ubmVjdGlvbiksIG51bGxwdHIgLyogTGlua01hbmFnZXIqICovKTsKLSAgQWRkcmVzc1dpdGhUeXBlIGRldmljZXt7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfTsKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9saW5rLCBHZXREZXZpY2UoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGRldmljZSkpOwotICBGaXhlZENoYW5uZWxJbXBsIGZpeGVkX2NoYW5uZWxfaW1wbChrU21wQnJDaWQsICZtb2NrX2xlX2xpbmssIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBSZWdpc3RlciBvbiBjbG9zZSBjYWxsYmFjawotICBhdXRvIHVzZXJfaGFuZGxlciA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkhhbmRsZXI+KHRocmVhZF8pOwotICBoY2k6OkVycm9yQ29kZSBteV9zdGF0dXMgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgZml4ZWRfY2hhbm5lbF9pbXBsLlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyLmdldCgpLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgbXlfc3RhdHVzID0gc3RhdHVzOyB9KSk7Ci0KLSAgRVhQRUNUX0RFQVRIKGZpeGVkX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayh1c2VyX2hhbmRsZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpCaW5kT25jZShbXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgRkFJTCgpOyB9KSksCi0gICAgICAgICAgICAgICAiLipSZWdpc3Rlck9uQ2xvc2VDYWxsYmFjay4qIik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBMZUZpeGVkQ2hhbm5lbEltcGxUZXN0LCBjYWxsX2FjcXVpcmVfYmVmb3JlX3JlZ2lzdGVyYXRpb25fc2hvdWxkX2ZhaWwpIHsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyOwotICBFWFBFQ1RfQ0FMTChtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwgR2V0TGVMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpLlRpbWVzKDEpOwotICB0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uKiBtb2NrX2FjbF9jb25uZWN0aW9uID0gbmV3IHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldFJlbW90ZUFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIE1vY2tMaW5rIG1vY2tfbGVfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24+KG1vY2tfYWNsX2Nvbm5lY3Rpb24pLCBudWxscHRyIC8qIExpbmtNYW5hZ2VyKiAqLyk7Ci0gIEFkZHJlc3NXaXRoVHlwZSBkZXZpY2V7e3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX0sIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTU307Ci0gIEVYUEVDVF9DQUxMKG1vY2tfbGVfbGluaywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgRml4ZWRDaGFubmVsSW1wbCBmaXhlZF9jaGFubmVsX2ltcGwoa1NtcEJyQ2lkLCAmbW9ja19sZV9saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9ERUFUSChmaXhlZF9jaGFubmVsX2ltcGwuQWNxdWlyZSgpLCAiLipBY3F1aXJlLioiKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVGaXhlZENoYW5uZWxJbXBsVGVzdCwgY2FsbF9yZWxlYXNlX2JlZm9yZV9yZWdpc3RlcmF0aW9uX3Nob3VsZF9mYWlsKSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCgpKS5UaW1lcygxKTsKLSAgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uKCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBHZXRSZW1vdGVBZGRyZXNzKCkpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2xlX2xpbmsobDJjYXBfaGFuZGxlcl8sICZtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciogKi8pOwotICBBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfbGVfbGluaywgbDJjYXBfaGFuZGxlcl8pOwotICBFWFBFQ1RfREVBVEgoZml4ZWRfY2hhbm5lbF9pbXBsLlJlbGVhc2UoKSwgIi4qUmVsZWFzZS4qIik7Ci19Ci0KLVRFU1RfRihMMmNhcExlRml4ZWRDaGFubmVsSW1wbFRlc3QsIHRlc3RfYWNxdWlyZV9yZWxlYXNlX2NoYW5uZWwpIHsKLSAgTW9ja1BhcmFtZXRlclByb3ZpZGVyIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyOwotICBFWFBFQ1RfQ0FMTChtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwgR2V0TGVMaW5rSWRsZURpc2Nvbm5lY3RUaW1lb3V0KCkpLlRpbWVzKDEpOwotICB0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uKiBtb2NrX2FjbF9jb25uZWN0aW9uID0gbmV3IHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24oKTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfYWNsX2Nvbm5lY3Rpb24sIEdldFJlbW90ZUFkZHJlc3MoKSkuVGltZXMoMSk7Ci0gIE1vY2tMaW5rIG1vY2tfbGVfbGluayhsMmNhcF9oYW5kbGVyXywgJm1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHRlc3Rpbmc6Ok1vY2tMZUFjbENvbm5lY3Rpb24+KG1vY2tfYWNsX2Nvbm5lY3Rpb24pLCBudWxscHRyIC8qIExpbmtNYW5hZ2VyKiAqLyk7Ci0gIEFkZHJlc3NXaXRoVHlwZSBkZXZpY2V7e3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX0sIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTU307Ci0gIEVYUEVDVF9DQUxMKG1vY2tfbGVfbGluaywgR2V0RGV2aWNlKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihkZXZpY2UpKTsKLSAgRml4ZWRDaGFubmVsSW1wbCBmaXhlZF9jaGFubmVsX2ltcGwoa1NtcEJyQ2lkLCAmbW9ja19sZV9saW5rLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgb24gY2xvc2UgY2FsbGJhY2sKLSAgYXV0byB1c2VyX2hhbmRsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpIYW5kbGVyPih0aHJlYWRfKTsKLSAgaGNpOjpFcnJvckNvZGUgbXlfc3RhdHVzID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGZpeGVkX2NoYW5uZWxfaW1wbC5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlci5nZXQoKSwgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IG15X3N0YXR1cyA9IHN0YXR1czsgfSkpOwotCi0gIC8vIERlZmF1bHQgc2hvdWxkIGJlIGZhbHNlCi0gIEVYUEVDVF9GQUxTRShmaXhlZF9jaGFubmVsX2ltcGwuSXNBY3F1aXJlZCgpKTsKLQotICAvLyBTaG91bGQgYmUgY2FsbGVkIDIgdGltZXMgYWZ0ZXIgQWNxdWlyZSgpIGFuZCBSZWxlYXNlKCkKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9saW5rLCBSZWZyZXNoUmVmQ291bnQoKSkuVGltZXMoMik7Ci0KLSAgZml4ZWRfY2hhbm5lbF9pbXBsLkFjcXVpcmUoKTsKLSAgRVhQRUNUX1RSVUUoZml4ZWRfY2hhbm5lbF9pbXBsLklzQWNxdWlyZWQoKSk7Ci0KLSAgZml4ZWRfY2hhbm5lbF9pbXBsLlJlbGVhc2UoKTsKLSAgRVhQRUNUX0ZBTFNFKGZpeGVkX2NoYW5uZWxfaW1wbC5Jc0FjcXVpcmVkKCkpOwotCi0gIHVzZXJfaGFuZGxlci0+Q2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVGaXhlZENoYW5uZWxJbXBsVGVzdCwgdGVzdF9hY3F1aXJlX2FmdGVyX2Nsb3NlKSB7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcjsKLSAgRVhQRUNUX0NBTEwobW9ja19wYXJhbWV0ZXJfcHJvdmlkZXIsIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCgpKS5UaW1lcygxKTsKLSAgdGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbiogbW9ja19hY2xfY29ubmVjdGlvbiA9IG5ldyB0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uKCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2FjbF9jb25uZWN0aW9uLCBHZXRSZW1vdGVBZGRyZXNzKCkpLlRpbWVzKDEpOwotICBNb2NrTGluayBtb2NrX2xlX2xpbmsobDJjYXBfaGFuZGxlcl8sICZtb2NrX3BhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uPihtb2NrX2FjbF9jb25uZWN0aW9uKSwgbnVsbHB0ciAvKiBMaW5rTWFuYWdlciogKi8pOwotICBBZGRyZXNzV2l0aFR5cGUgZGV2aWNle3t7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9OwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2xpbmssIEdldERldmljZSgpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZGV2aWNlKSk7Ci0gIEZpeGVkQ2hhbm5lbEltcGwgZml4ZWRfY2hhbm5lbF9pbXBsKGtTbXBCckNpZCwgJm1vY2tfbGVfbGluaywgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIG9uIGNsb3NlIGNhbGxiYWNrCi0gIGF1dG8gdXNlcl9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6SGFuZGxlcj4odGhyZWFkXyk7Ci0gIGhjaTo6RXJyb3JDb2RlIG15X3N0YXR1cyA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBmaXhlZF9jaGFubmVsX2ltcGwuUmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICB1c2VyX2hhbmRsZXIuZ2V0KCksIGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBteV9zdGF0dXMgPSBzdGF0dXM7IH0pKTsKLQotICAvLyBDaGFubmVsIGNsb3N1cmUgc2hvdWxkIHRyaWdnZXIgc3VjaCBjYWxsYmFjawotICBmaXhlZF9jaGFubmVsX2ltcGwuT25DbG9zZWQoaGNpOjpFcnJvckNvZGU6OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTik7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlci5nZXQoKSk7Ci0gIEVYUEVDVF9FUShoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OLCBteV9zdGF0dXMpOwotCi0gIC8vIFJlbGVhc2Ugb3IgQWNxdWlyZSBhZnRlciBjbG9zaW5nIHNob3VsZCBjcmFzaAotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2xpbmssIFJlZnJlc2hSZWZDb3VudCgpKS5UaW1lcygwKTsKLSAgRVhQRUNUX0ZBTFNFKGZpeGVkX2NoYW5uZWxfaW1wbC5Jc0FjcXVpcmVkKCkpOwotICBFWFBFQ1RfREVBVEgoZml4ZWRfY2hhbm5lbF9pbXBsLkFjcXVpcmUoKSwgIi4qQWNxdWlyZS4qIik7Ci0KLSAgdXNlcl9oYW5kbGVyLT5DbGVhcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbC5oIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlZDc3Ny4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9maXhlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5GaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCgpID0gZGVmYXVsdDsKLQotICBzdHJ1Y3QgUGVuZGluZ1JlZ2lzdHJhdGlvbiB7Ci0gICAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uUmVnaXN0cmF0aW9uQ29tcGxldGVDYWxsYmFjayBvbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfOwotICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfOwotICB9OwotCi0gIHZpcnR1YWwgdm9pZCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgIHVzZXJfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfLCBzdGQ6Om1vdmUoY2hhbm5lbCkpKTsKLSAgfQotCi0gIGZyaWVuZCBjbGFzcyBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIHByb3RlY3RlZCBhY2Nlc3MgZm9yIG1vY2tpbmcKLSAgRml4ZWRDaGFubmVsU2VydmljZUltcGwob3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6T25Db25uZWN0aW9uT3BlbkNhbGxiYWNrIG9uX2Nvbm5lY3Rpb25fb3Blbl9jYWxsYmFjaykKLSAgICAgIDogdXNlcl9oYW5kbGVyXyh1c2VyX2hhbmRsZXIpLCBvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2tfKHN0ZDo6bW92ZShvbl9jb25uZWN0aW9uX29wZW5fY2FsbGJhY2spKSB7fQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpPbkNvbm5lY3Rpb25PcGVuQ2FsbGJhY2sgb25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9pbXBsX21vY2suaCBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExYjY1ZC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbF9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCA6IHB1YmxpYyBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCB7Ci0gcHVibGljOgotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZUltcGwoKSA6IEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKG51bGxwdHIsIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjaygpKSB7fQotICBNT0NLX01FVEhPRCh2b2lkLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24sIChzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSwgKG92ZXJyaWRlKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MgYi9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJkZTAwLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9jaWQuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfaW1wbC5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdm9pZCBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlJlZ2lzdGVyKENpZCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb24pIHsKLSAgaWYgKGNpZCA8IGtGaXJzdEZpeGVkQ2hhbm5lbCB8fCBjaWQgPiBrTGFzdEZpeGVkQ2hhbm5lbCB8fCBjaWQgPT0ga0xlU2lnbmFsbGluZ0NpZCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxTZXJ2aWNlPiBpbnZhbGlkX3NlcnZpY2UobmV3IEZpeGVkQ2hhbm5lbFNlcnZpY2UoKSk7Ci0gICAgcGVuZGluZ19yZWdpc3RyYXRpb24udXNlcl9oYW5kbGVyXy0+UG9zdCgKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZShzdGQ6Om1vdmUocGVuZGluZ19yZWdpc3RyYXRpb24ub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpGQUlMX0lOVkFMSURfU0VSVklDRSwgc3RkOjptb3ZlKGludmFsaWRfc2VydmljZSkpKTsKLSAgfSBlbHNlIGlmIChJc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsU2VydmljZT4gaW52YWxpZF9zZXJ2aWNlKG5ldyBGaXhlZENoYW5uZWxTZXJ2aWNlKCkpOwotICAgIHBlbmRpbmdfcmVnaXN0cmF0aW9uLnVzZXJfaGFuZGxlcl8tPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2Uoc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uLm9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZV9jYWxsYmFja18pLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdDo6RkFJTF9EVVBMSUNBVEVfU0VSVklDRSwgc3RkOjptb3ZlKGludmFsaWRfc2VydmljZSkpKTsKLSAgfSBlbHNlIHsKLSAgICBzZXJ2aWNlX21hcF8udHJ5X2VtcGxhY2UoY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbChwZW5kaW5nX3JlZ2lzdHJhdGlvbi51c2VyX2hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19yZWdpc3RyYXRpb24ub25fY29ubmVjdGlvbl9vcGVuX2NhbGxiYWNrXykpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsU2VydmljZT4gdXNlcl9zZXJ2aWNlKG5ldyBGaXhlZENoYW5uZWxTZXJ2aWNlKGNpZCwgdGhpcywgbDJjYXBfbGF5ZXJfaGFuZGxlcl8pKTsKLSAgICBwZW5kaW5nX3JlZ2lzdHJhdGlvbi51c2VyX2hhbmRsZXJfLT5Qb3N0KAotICAgICAgICBjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShwZW5kaW5nX3JlZ2lzdHJhdGlvbi5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OlNVQ0NFU1MsIHN0ZDo6bW92ZSh1c2VyX3NlcnZpY2UpKSk7Ci0gIH0KLX0KLQotdm9pZCBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OlVucmVnaXN0ZXIoQ2lkIGNpZCwgRml4ZWRDaGFubmVsU2VydmljZTo6T25VbnJlZ2lzdGVyZWRDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIGlmIChJc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpIHsKLSAgICBzZXJ2aWNlX21hcF8uZXJhc2UoY2lkKTsKLSAgICBoYW5kbGVyLT5Qb3N0KHN0ZDo6bW92ZShjYWxsYmFjaykpOwotICB9IGVsc2UgewotICAgIExPR19FUlJPUigic2VydmljZSBub3QgcmVnaXN0ZXJlZCBjaWQ6JWQiLCBjaWQpOwotICB9Ci19Ci0KLWJvb2wgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpJc1NlcnZpY2VSZWdpc3RlcmVkKENpZCBjaWQpIGNvbnN0IHsKLSAgcmV0dXJuIHNlcnZpY2VfbWFwXy5maW5kKGNpZCkgIT0gc2VydmljZV9tYXBfLmVuZCgpOwotfQotCi1GaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCogRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsOjpHZXRTZXJ2aWNlKENpZCBjaWQpIHsKLSAgQVNTRVJUKElzU2VydmljZVJlZ2lzdGVyZWQoY2lkKSk7Ci0gIHJldHVybiAmc2VydmljZV9tYXBfLmZpbmQoY2lkKS0+c2Vjb25kOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGw6OkdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGwqPj4gcmVzdWx0czsKLSAgZm9yIChhdXRvJiBlbGVtIDogc2VydmljZV9tYXBfKSB7Ci0gICAgcmVzdWx0cy5lbXBsYWNlX2JhY2soZWxlbS5maXJzdCwgJmVsZW0uc2Vjb25kKTsKLSAgfQotICByZXR1cm4gcmVzdWx0czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTdjMTkyLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9pbXBsLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbChvczo6SGFuZGxlciogbDJjYXBfbGF5ZXJfaGFuZGxlcikKLSAgICAgIDogbDJjYXBfbGF5ZXJfaGFuZGxlcl8obDJjYXBfbGF5ZXJfaGFuZGxlcikge30KLSAgdmlydHVhbCB+Rml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKCkgPSBkZWZhdWx0OwotCi0gIC8vIEFsbCBBUElzIG11c3QgYmUgaW52b2tlZCBpbiBMMkNBUCBsYXllciBoYW5kbGVyCi0KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyKENpZCBjaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsOjpQZW5kaW5nUmVnaXN0cmF0aW9uIHBlbmRpbmdfcmVnaXN0cmF0aW9uKTsKLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXIoQ2lkIGNpZCwgRml4ZWRDaGFubmVsU2VydmljZTo6T25VbnJlZ2lzdGVyZWRDYWxsYmFjayBjYWxsYmFjaywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotICB2aXJ0dWFsIGJvb2wgSXNTZXJ2aWNlUmVnaXN0ZXJlZChDaWQgY2lkKSBjb25zdDsKLSAgdmlydHVhbCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCogR2V0U2VydmljZShDaWQgY2lkKTsKLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiBHZXRSZWdpc3RlcmVkU2VydmljZXMoKTsKLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9sYXllcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsPiBzZXJ2aWNlX21hcF87Ci19OwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF9tb2NrLmggYi9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4NTk5Yi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCA6IHB1YmxpYyBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgewotIHB1YmxpYzoKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCgpIDogRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKG51bGxwdHIpIHt9Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlZ2lzdGVyLCAoQ2lkIGNpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb24pLCAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgVW5yZWdpc3RlciwgKENpZCBjaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2U6Ok9uVW5yZWdpc3RlcmVkQ2FsbGJhY2sgY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKGJvb2wsIElzU2VydmljZVJlZ2lzdGVyZWQsIChDaWQgY2lkKSwgKGNvbnN0LCBvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRChGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCosIEdldFNlcnZpY2UsIChDaWQgY2lkKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiksIEdldFJlZ2lzdGVyZWRTZXJ2aWNlcywgKCksIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhY2Y5ZC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ZpeGVkX2NoYW5uZWxfc2VydmljZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMMmNhcExlU2VydmljZU1hbmFnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB+TDJjYXBMZVNlcnZpY2VNYW5hZ2VyVGVzdCgpID0gZGVmYXVsdDsKLQotICB2b2lkIE9uU2VydmljZVJlZ2lzdGVyZWQoYm9vbCBleHBlY3Rfc3VjY2VzcywgRml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxTZXJ2aWNlPiB1c2VyX3NlcnZpY2UpIHsKLSAgICBFWFBFQ1RfRVEocmVzdWx0ID09IEZpeGVkQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdDo6U1VDQ0VTUywgZXhwZWN0X3N1Y2Nlc3MpOwotICAgIHNlcnZpY2VfcmVnaXN0ZXJlZF8gPSBleHBlY3Rfc3VjY2VzczsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1hbmFnZXJfID0gbmV3IEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbHtudWxscHRyfTsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgdXNlcl9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgdXNlcl9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgdXNlcl9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgICBkZWxldGUgbWFuYWdlcl87Ci0gIH0KLQotICB2b2lkIHN5bmNfdXNlcl9oYW5kbGVyKCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgdXNlcl9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKTsKLSAgfQotCi0gIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogbWFuYWdlcl8gPSBudWxscHRyOwotICBvczo6VGhyZWFkKiB0aHJlYWRfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaGFuZGxlcl8gPSBudWxscHRyOwotCi0gIGJvb2wgc2VydmljZV9yZWdpc3RlcmVkXyA9IGZhbHNlOwotfTsKLQotVEVTVF9GKEwyY2FwTGVTZXJ2aWNlTWFuYWdlclRlc3QsIHJlZ2lzdGVyX2FuZF91bnJlZ2lzdGVyX2xlX2ZpeGVkX2NoYW5uZWwpIHsKLSAgRml4ZWRDaGFubmVsU2VydmljZUltcGw6OlBlbmRpbmdSZWdpc3RyYXRpb24gcGVuZGluZ19yZWdpc3RyYXRpb257Ci0gICAgICAudXNlcl9oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcl8sCi0gICAgICAub25fcmVnaXN0cmF0aW9uX2NvbXBsZXRlX2NhbGxiYWNrXyA9Ci0gICAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmTDJjYXBMZVNlcnZpY2VNYW5hZ2VyVGVzdDo6T25TZXJ2aWNlUmVnaXN0ZXJlZCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCB0cnVlKX07Ci0gIENpZCBjaWQgPSBrU21wQnJDaWQ7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLSAgbWFuYWdlcl8tPlJlZ2lzdGVyKGNpZCwgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1hbmFnZXJfLT5Jc1NlcnZpY2VSZWdpc3RlcmVkKGNpZCkpOwotICBzeW5jX3VzZXJfaGFuZGxlcigpOwotICBFWFBFQ1RfVFJVRShzZXJ2aWNlX3JlZ2lzdGVyZWRfKTsKLSAgbWFuYWdlcl8tPlVucmVnaXN0ZXIoY2lkLCBjb21tb246OkJpbmRPbmNlKFtdIHt9KSwgdXNlcl9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVTZXJ2aWNlTWFuYWdlclRlc3QsIHJlZ2lzdGVyX2xlX2ZpeGVkX2NoYW5uZWxfYmFkX2NpZCkgewotICBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbDo6UGVuZGluZ1JlZ2lzdHJhdGlvbiBwZW5kaW5nX3JlZ2lzdHJhdGlvbnsKLSAgICAgIC51c2VyX2hhbmRsZXJfID0gdXNlcl9oYW5kbGVyXywKLSAgICAgIC5vbl9yZWdpc3RyYXRpb25fY29tcGxldGVfY2FsbGJhY2tfID0KLSAgICAgICAgICBjb21tb246OkJpbmRPbmNlKCZMMmNhcExlU2VydmljZU1hbmFnZXJUZXN0OjpPblNlcnZpY2VSZWdpc3RlcmVkLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIGZhbHNlKX07Ci0gIENpZCBjaWQgPSAweDEwMDA7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLSAgbWFuYWdlcl8tPlJlZ2lzdGVyKGNpZCwgc3RkOjptb3ZlKHBlbmRpbmdfcmVnaXN0cmF0aW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChjaWQpKTsKLSAgc3luY191c2VyX2hhbmRsZXIoKTsKLSAgRVhQRUNUX0ZBTFNFKHNlcnZpY2VfcmVnaXN0ZXJlZF8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9saW5rLmNjIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvbGluay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3NTliMi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9saW5rLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgiCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9wYXJhbWV0ZXJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9keW5hbWljX2NoYW5uZWxfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2xpbmtfbWFuYWdlci5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtEZWZhdWx0TWluaW11bUNlTGVuZ3RoID0gMHgwMDAyOwotc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrRGVmYXVsdE1heGltdW1DZUxlbmd0aCA9IDB4MEMwMDsKLQotTGluazo6TGluayhvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlciwgc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkxlQWNsQ29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb24sCi0gICAgICAgICAgIGwyY2FwOjppbnRlcm5hbDo6UGFyYW1ldGVyUHJvdmlkZXIqIHBhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICAgICAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyLAotICAgICAgICAgICBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGZpeGVkX3NlcnZpY2VfbWFuYWdlciwgTGlua01hbmFnZXIqIGxpbmtfbWFuYWdlcikKLSAgICA6IGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpLCBhY2xfY29ubmVjdGlvbl8oc3RkOjptb3ZlKGFjbF9jb25uZWN0aW9uKSksCi0gICAgICBkYXRhX3BpcGVsaW5lX21hbmFnZXJfKGwyY2FwX2hhbmRsZXIsIHRoaXMsIGFjbF9jb25uZWN0aW9uXy0+R2V0QWNsUXVldWVFbmQoKSksCi0gICAgICBwYXJhbWV0ZXJfcHJvdmlkZXJfKHBhcmFtZXRlcl9wcm92aWRlciksIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXyhkeW5hbWljX3NlcnZpY2VfbWFuYWdlciksCi0gICAgICBzaWduYWxsaW5nX21hbmFnZXJfKGwyY2FwX2hhbmRsZXJfLCB0aGlzLCAmZGF0YV9waXBlbGluZV9tYW5hZ2VyXywgZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8pLAotICAgICAgbGlua19tYW5hZ2VyXyhsaW5rX21hbmFnZXIpIHsKLSAgQVNTRVJUKGwyY2FwX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICBBU1NFUlQoYWNsX2Nvbm5lY3Rpb25fICE9IG51bGxwdHIpOwotICBBU1NFUlQocGFyYW1ldGVyX3Byb3ZpZGVyXyAhPSBudWxscHRyKTsKLSAgbGlua19pZGxlX2Rpc2Nvbm5lY3RfYWxhcm1fLlNjaGVkdWxlKGNvbW1vbjo6QmluZE9uY2UoJkxpbms6OkRpc2Nvbm5lY3QsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfcHJvdmlkZXJfLT5HZXRMZUxpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSk7Ci0gIGFjbF9jb25uZWN0aW9uXy0+UmVnaXN0ZXJDYWxsYmFja3ModGhpcywgbDJjYXBfaGFuZGxlcl8pOwotfQotCi12b2lkIExpbms6Ok9uQWNsRGlzY29ubmVjdGVkKGhjaTo6RXJyb3JDb2RlIHJlYXNvbikgewotICBmaXhlZF9jaGFubmVsX2FsbG9jYXRvcl8uT25BY2xEaXNjb25uZWN0ZWQoc3RhdGljX2Nhc3Q8aGNpOjpFcnJvckNvZGU+KHJlYXNvbikpOwotICBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5PbkFjbERpc2Nvbm5lY3RlZChzdGF0aWNfY2FzdDxoY2k6OkVycm9yQ29kZT4ocmVhc29uKSk7Ci19Ci0KLXZvaWQgTGluazo6T25EaXNjb25uZWN0aW9uKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgewotICBPbkFjbERpc2Nvbm5lY3RlZChzdGF0dXMpOwotCi0gIGxpbmtfbWFuYWdlcl8tPk9uRGlzY29ubmVjdChHZXRBY2xDb25uZWN0aW9uKCktPkdldFJlbW90ZUFkZHJlc3MoKSk7Ci19Ci0KLXZvaWQgTGluazo6T25Db25uZWN0aW9uVXBkYXRlKAotICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgdWludDE2X3QgY29ubmVjdGlvbl9pbnRlcnZhbCwKLSAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCkgewotICBMT0dfSU5GTygKLSAgICAgICJpbnRlcnZhbCAlaHggbGF0ZW5jeSAlaHggc3VwZXJ2aXNpb25fdGltZW91dCAlaHgiLCBjb25uZWN0aW9uX2ludGVydmFsLCBjb25uZWN0aW9uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpOwotICBpZiAodXBkYXRlX3JlcXVlc3Rfc2lnbmFsX2lkXyAhPSBrSW52YWxpZFNpZ25hbElkKSB7Ci0gICAgaGNpOjpFcnJvckNvZGUgcmVzdWx0ID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gICAgaWYgKGNvbm5lY3Rpb25faW50ZXJ2YWwgPiB1cGRhdGVfcmVxdWVzdF9pbnRlcnZhbF9tYXhfIHx8IGNvbm5lY3Rpb25faW50ZXJ2YWwgPCB1cGRhdGVfcmVxdWVzdF9pbnRlcnZhbF9taW5fIHx8Ci0gICAgICAgIGNvbm5lY3Rpb25fbGF0ZW5jeSAhPSB1cGRhdGVfcmVxdWVzdF9sYXRlbmN5XyB8fCBzdXBlcnZpc2lvbl90aW1lb3V0ICE9IHVwZGF0ZV9yZXF1ZXN0X3N1cGVydmlzaW9uX3RpbWVvdXRfKSB7Ci0gICAgICBMT0dfSU5GTygiUmVjZWl2ZWQgY29ubmVjdGlvbiB1cGRhdGUgY29tcGxldGUgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyB0aGF0IHByb3ZpZGVkIGJ5IHRoZSBIb3N0Iik7Ci0gICAgfQotCi0gICAgaWYgKCFDaGVja0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKGNvbm5lY3Rpb25faW50ZXJ2YWwsIGNvbm5lY3Rpb25faW50ZXJ2YWwsIGNvbm5lY3Rpb25fbGF0ZW5jeSwgc3VwZXJ2aXNpb25fdGltZW91dCkpIHsKLSAgICAgIHJlc3VsdCA9IGhjaTo6RXJyb3JDb2RlOjpVTlNQRUNJRklFRF9FUlJPUjsKLSAgICB9Ci0KLSAgICBvbl9jb25uZWN0aW9uX3VwZGF0ZV9jb21wbGV0ZSh1cGRhdGVfcmVxdWVzdF9zaWduYWxfaWRfLCByZXN1bHQpOwotICAgIHVwZGF0ZV9yZXF1ZXN0X3NpZ25hbF9pZF8gPSBrSW52YWxpZFNpZ25hbElkOwotICB9Ci19Ci0KLXZvaWQgTGluazo6T25EYXRhTGVuZ3RoQ2hhbmdlKHVpbnQxNl90IHR4X29jdGV0cywgdWludDE2X3QgdHhfdGltZSwgdWludDE2X3Qgcnhfb2N0ZXRzLCB1aW50MTZfdCByeF90aW1lKSB7Ci0gIExPR19JTkZPKCJ0eF9vY3RldHMgJWh4IHR4X3RpbWUgJWh4IHJ4X29jdGV0cyAlaHggcnhfdGltZSAlaHgiLCB0eF9vY3RldHMsIHR4X3RpbWUsIHJ4X29jdGV0cywgcnhfdGltZSk7Ci19Ci0KLXZvaWQgTGluazo6T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUoCi0gICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCBsbXBfdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSB7Ci0gIExPR19JTkZPKCJsbXBfdmVyc2lvbjolaGh1IG1hbnVmYWN0dXJlcl9uYW1lOiVodSBzdWJfdmVyc2lvbjolaHUiLCBsbXBfdmVyc2lvbiwgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgbGlua19tYW5hZ2VyXy0+T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUoCi0gICAgICBoY2lfc3RhdHVzLCBHZXREZXZpY2UoKSwgbG1wX3ZlcnNpb24sIG1hbnVmYWN0dXJlcl9uYW1lLCBzdWJfdmVyc2lvbik7Ci19Ci0KLXZvaWQgTGluazo6T25QaHlVcGRhdGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5KSB7fQotCi12b2lkIExpbms6Ok9uTG9jYWxBZGRyZXNzVXBkYXRlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIGFjbF9jb25uZWN0aW9uXy0+VXBkYXRlTG9jYWxBZGRyZXNzKGFkZHJlc3Nfd2l0aF90eXBlKTsKLX0KLQotdm9pZCBMaW5rOjpEaXNjb25uZWN0KCkgewotICBhY2xfY29ubmVjdGlvbl8tPkRpc2Nvbm5lY3QoaGNpOjpEaXNjb25uZWN0UmVhc29uOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04pOwotfQotCi12b2lkIExpbms6OlVwZGF0ZUNvbm5lY3Rpb25QYXJhbWV0ZXJGcm9tUmVtb3RlKFNpZ25hbElkIHNpZ25hbF9pZCwgdWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWF4LCB1aW50MTZfdCBjb25uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgYWNsX2Nvbm5lY3Rpb25fLT5MZUNvbm5lY3Rpb25VcGRhdGUoY29ubl9pbnRlcnZhbF9taW4sIGNvbm5faW50ZXJ2YWxfbWF4LCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0TWluaW11bUNlTGVuZ3RoLCBrRGVmYXVsdE1heGltdW1DZUxlbmd0aCk7Ci0gIHVwZGF0ZV9yZXF1ZXN0X3NpZ25hbF9pZF8gPSBzaWduYWxfaWQ7Ci0gIHVwZGF0ZV9yZXF1ZXN0X2ludGVydmFsX21pbl8gPSBjb25uX2ludGVydmFsX21pbjsKLSAgdXBkYXRlX3JlcXVlc3RfaW50ZXJ2YWxfbWF4XyA9IGNvbm5faW50ZXJ2YWxfbWF4OwotICB1cGRhdGVfcmVxdWVzdF9sYXRlbmN5XyA9IGNvbm5fbGF0ZW5jeTsKLSAgdXBkYXRlX3JlcXVlc3Rfc3VwZXJ2aXNpb25fdGltZW91dF8gPSBzdXBlcnZpc2lvbl90aW1lb3V0OwotfQotCi1ib29sIExpbms6OkNoZWNrQ29ubmVjdGlvblBhcmFtZXRlcnMoCi0gICAgdWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4sIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWF4LCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgaWYgKGNvbm5faW50ZXJ2YWxfbWluIDwgMHgwMDA2IHx8IGNvbm5faW50ZXJ2YWxfbWluID4gMHgwQzgwIHx8IGNvbm5faW50ZXJ2YWxfbWF4IDwgMHgwMDA2IHx8Ci0gICAgICBjb25uX2ludGVydmFsX21heCA+IDB4MEM4MCB8fCBjb25uX2xhdGVuY3kgPiAweDAxRjMgfHwgc3VwZXJ2aXNpb25fdGltZW91dCA8IDB4MDAwQSB8fAotICAgICAgc3VwZXJ2aXNpb25fdGltZW91dCA+IDB4MEM4MCkgewotICAgIExPR19FUlJPUigiSW52YWxpZCBwYXJhbWV0ZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUaGUgTWF4aW11bSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgd2lsbCBiZSBjb25uX2ludGVydmFsX21heCAqIDEuMjUgbXMKLSAgLy8gVGhlIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHdpbGwgYmUgZXhwZWN0ZWRfc3VwZXJ2aXNpb25fdGltZW91dCAqIDEwIG1zCi0gIC8vIFRoZSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBzaGFsbCBiZSBsYXJnZXIgdGhhbiAoMSArIExhdGVuY3kpICogSW50ZXJ2YWxfTWF4ICogMiwgd2hlcmUgSW50ZXJ2YWxfTWF4IGlzIGdpdmVuIGluCi0gIC8vIG1pbGxpc2Vjb25kcy4KLSAgdWludDMyX3Qgc3VwZXJ2aXNpb25fdGltZW91dF9taW4gPSAodWludDMyX3QpKDEgKyBjb25uX2xhdGVuY3kpICogY29ubl9pbnRlcnZhbF9tYXggKiAyICsgMTsKLSAgaWYgKHN1cGVydmlzaW9uX3RpbWVvdXQgKiA4IDwgc3VwZXJ2aXNpb25fdGltZW91dF9taW4gfHwgY29ubl9pbnRlcnZhbF9tYXggPCBjb25uX2ludGVydmFsX21pbikgewotICAgIExPR19FUlJPUigiSW52YWxpZCBwYXJhbWV0ZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMaW5rOjpTZW5kQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSh1aW50MTZfdCBjb25uX2ludGVydmFsX21pbiwgdWludDE2X3QgY29ubl9pbnRlcnZhbF9tYXgsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbmd0aCwgdWludDE2X3QgbWF4X2NlX2xlbmd0aCkgewotICBpZiAoYWNsX2Nvbm5lY3Rpb25fLT5HZXRSb2xlKCkgPT0gaGNpOjpSb2xlOjpQRVJJUEhFUkFMKSB7Ci0gICAgLy8gVE9ETzogSWYgYm90aCBMTCBjZW50cmFsIGFuZCBwZXJpcGhlcmFsIHN1cHBvcnQgNC4xLCB1c2UgSENJIGNvbW1hbmQgZGlyZWN0bHkKLSAgICBzaWduYWxsaW5nX21hbmFnZXJfLlNlbmRDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVxdWVzdChjb25uX2ludGVydmFsX21pbiwgY29ubl9pbnRlcnZhbF9tYXgsIGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc2lvbl90aW1lb3V0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYWNsX2Nvbm5lY3Rpb25fLT5MZUNvbm5lY3Rpb25VcGRhdGUoY29ubl9pbnRlcnZhbF9taW4sIGNvbm5faW50ZXJ2YWxfbWF4LCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9jZV9sZW5ndGgsIG1heF9jZV9sZW5ndGgpOwotICB1cGRhdGVfcmVxdWVzdF9zaWduYWxfaWRfID0ga0ludmFsaWRTaWduYWxJZDsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPEZpeGVkQ2hhbm5lbEltcGw+IExpbms6OkFsbG9jYXRlRml4ZWRDaGFubmVsKENpZCBjaWQsIFNlY3VyaXR5UG9saWN5IHNlY3VyaXR5X3BvbGljeSkgewotICBhdXRvIGNoYW5uZWwgPSBmaXhlZF9jaGFubmVsX2FsbG9jYXRvcl8uQWxsb2NhdGVDaGFubmVsKGNpZCk7Ci0gIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8uQXR0YWNoQ2hhbm5lbChjaWQsIGNoYW5uZWwsIGwyY2FwOjppbnRlcm5hbDo6RGF0YVBpcGVsaW5lTWFuYWdlcjo6Q2hhbm5lbE1vZGU6OkJBU0lDKTsKLSAgcmV0dXJuIGNoYW5uZWw7Ci19Ci0KLWJvb2wgTGluazo6SXNGaXhlZENoYW5uZWxBbGxvY2F0ZWQoQ2lkIGNpZCkgewotICByZXR1cm4gZml4ZWRfY2hhbm5lbF9hbGxvY2F0b3JfLklzQ2hhbm5lbEFsbG9jYXRlZChjaWQpOwotfQotCi1DaWQgTGluazo6UmVzZXJ2ZUR5bmFtaWNDaGFubmVsKCkgewotICByZXR1cm4gZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uUmVzZXJ2ZUNoYW5uZWwoKTsKLX0KLQotdm9pZCBMaW5rOjpTZW5kQ29ubmVjdGlvblJlcXVlc3QoUHNtIHBzbSwgUGVuZGluZ0R5bmFtaWNDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uKSB7Ci0gIGlmIChkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5Jc1BzbVVzZWQocHNtKSkgewotICAgIExPR19JTkZPKCJQc20gJWQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLCBwc20pOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvIHJlc2VydmVkX2NpZCA9IFJlc2VydmVEeW5hbWljQ2hhbm5lbCgpOwotICBhdXRvIG10dSA9IHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24uY29uZmlndXJhdGlvbl8ubXR1OwotICBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfW3Jlc2VydmVkX2NpZF0gPSBzdGQ6Om1vdmUocGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbik7Ci0gIHNpZ25hbGxpbmdfbWFuYWdlcl8uU2VuZENvbm5lY3Rpb25SZXF1ZXN0KHBzbSwgcmVzZXJ2ZWRfY2lkLCBtdHUpOwotfQotCi12b2lkIExpbms6OlNlbmREaXNjb25uZWN0aW9uUmVxdWVzdChDaWQgbG9jYWxfY2lkLCBDaWQgcmVtb3RlX2NpZCkgewotICBhdXRvIGNoYW5uZWwgPSBkeW5hbWljX2NoYW5uZWxfYWxsb2NhdG9yXy5GaW5kQ2hhbm5lbEJ5Q2lkKGxvY2FsX2NpZCk7Ci0gIGlmIChjaGFubmVsID09IG51bGxwdHIgfHwgY2hhbm5lbC0+R2V0UmVtb3RlQ2lkKCkgIT0gcmVtb3RlX2NpZCkgewotICAgIExPR19FUlJPUigiSW52YWxpZCBjaWQiKTsKLSAgfQotICBzaWduYWxsaW5nX21hbmFnZXJfLlNlbmREaXNjb25uZWN0UmVxdWVzdChsb2NhbF9jaWQsIHJlbW90ZV9jaWQpOwotfQotCi12b2lkIExpbms6Ok9uT3V0Z29pbmdDb25uZWN0aW9uUmVxdWVzdEZhaWwoQ2lkIGxvY2FsX2NpZCwgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCByZXNwb25zZV9yZXN1bHQpIHsKLSAgaWYgKGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZmluZChsb2NhbF9jaWQpICE9Ci0gICAgICBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfLmVuZCgpKSB7Ci0gICAgLy8gVE9ETyhoc3opOiBDdXJyZW50bHkgd2Ugb25seSBub3RpZnkgdGhlIGNsaWVudCB3aGVuIHRoZSByZW1vdGUgZGlkbid0IHNlbmQgY29ubmVjdGlvbiByZXNwb25zZSBTVUNDRVNTLgotICAgIC8vICBTaG91bGQgd2Ugbm90aWZ5IHRoZSBjbGllbnQgd2hlbiB0aGUgbGluayBmYWlsZWQgdG8gZXN0YWJsaXNoPwotICAgIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHR7Ci0gICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9MMkNBUF9FUlJPUiwKLSAgICAgICAgLmhjaV9lcnJvciA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAubDJjYXBfY29ubmVjdGlvbl9yZXNwb25zZV9yZXN1bHQgPSByZXNwb25zZV9yZXN1bHQsCi0gICAgfTsKLSAgICBOb3RpZnlDaGFubmVsRmFpbChsb2NhbF9jaWQsIHJlc3VsdCk7Ci0gIH0KLSAgZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uRnJlZUNoYW5uZWwobG9jYWxfY2lkKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiBMaW5rOjpBbGxvY2F0ZUR5bmFtaWNDaGFubmVsKFBzbSBwc20sIENpZCByZW1vdGVfY2lkKSB7Ci0gIGF1dG8gY2hhbm5lbCA9IGR5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3JfLkFsbG9jYXRlQ2hhbm5lbChwc20sIHJlbW90ZV9jaWQpOwotICBpZiAoY2hhbm5lbCAhPSBudWxscHRyKSB7Ci0gICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy5BdHRhY2hDaGFubmVsKGNoYW5uZWwtPkdldENpZCgpLCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcDo6aW50ZXJuYWw6OkRhdGFQaXBlbGluZU1hbmFnZXI6OkNoYW5uZWxNb2RlOjpMRV9DUkVESVRfQkFTRUQpOwotICAgIFJlZnJlc2hSZWZDb3VudCgpOwotICAgIGNoYW5uZWwtPmxvY2FsX2luaXRpYXRlZF8gPSBmYWxzZTsKLSAgfQotICByZXR1cm4gY2hhbm5lbDsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiBMaW5rOjpBbGxvY2F0ZVJlc2VydmVkRHluYW1pY0NoYW5uZWwoQ2lkIHJlc2VydmVkX2NpZCwgUHNtIHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpZCByZW1vdGVfY2lkKSB7Ci0gIGF1dG8gY2hhbm5lbCA9IGR5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3JfLkFsbG9jYXRlUmVzZXJ2ZWRDaGFubmVsKHJlc2VydmVkX2NpZCwgcHNtLCByZW1vdGVfY2lkKTsKLSAgaWYgKGNoYW5uZWwgIT0gbnVsbHB0cikgewotICAgIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8uQXR0YWNoQ2hhbm5lbChjaGFubmVsLT5HZXRDaWQoKSwgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXA6OmludGVybmFsOjpEYXRhUGlwZWxpbmVNYW5hZ2VyOjpDaGFubmVsTW9kZTo6TEVfQ1JFRElUX0JBU0VEKTsKLSAgICBSZWZyZXNoUmVmQ291bnQoKTsKLSAgICBjaGFubmVsLT5sb2NhbF9pbml0aWF0ZWRfID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gY2hhbm5lbDsKLX0KLQotdm9pZCBMaW5rOjpGcmVlRHluYW1pY0NoYW5uZWwoQ2lkIGNpZCkgewotICBpZiAoZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl8uRmluZENoYW5uZWxCeUNpZChjaWQpID09IG51bGxwdHIpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy5EZXRhY2hDaGFubmVsKGNpZCk7Ci0gIGR5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3JfLkZyZWVDaGFubmVsKGNpZCk7Ci0gIFJlZnJlc2hSZWZDb3VudCgpOwotfQotCi12b2lkIExpbms6OlJlZnJlc2hSZWZDb3VudCgpIHsKLSAgaW50IHJlZl9jb3VudCA9IDA7Ci0gIHJlZl9jb3VudCArPSBmaXhlZF9jaGFubmVsX2FsbG9jYXRvcl8uR2V0UmVmQ291bnQoKTsKLSAgcmVmX2NvdW50ICs9IGR5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3JfLk51bWJlck9mQ2hhbm5lbHMoKTsKLSAgQVNTRVJUX0xPRyhyZWZfY291bnQgPj0gMCwgInJlZl9jb3VudCAlZCBpcyBsZXNzIHRoYW4gMCIsIHJlZl9jb3VudCk7Ci0gIGlmIChyZWZfY291bnQgPiAwKSB7Ci0gICAgbGlua19pZGxlX2Rpc2Nvbm5lY3RfYWxhcm1fLkNhbmNlbCgpOwotICB9IGVsc2UgewotICAgIGxpbmtfaWRsZV9kaXNjb25uZWN0X2FsYXJtXy5TY2hlZHVsZShjb21tb246OkJpbmRPbmNlKCZMaW5rOjpEaXNjb25uZWN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfcHJvdmlkZXJfLT5HZXRMZUxpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQoKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rOjpOb3RpZnlDaGFubmVsQ3JlYXRpb24oQ2lkIGNpZCwgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsPiB1c2VyX2NoYW5uZWwpIHsKLSAgQVNTRVJUKGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZmluZChjaWQpICE9Ci0gICAgICAgICBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfLmVuZCgpKTsKLSAgYXV0byYgcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbiA9IGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF9bY2lkXTsKLSAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbi5oYW5kbGVyXy0+UG9zdCgKLSAgICAgIGNvbW1vbjo6QmluZE9uY2Uoc3RkOjptb3ZlKHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24ub25fb3Blbl9jYWxsYmFja18pLCBzdGQ6Om1vdmUodXNlcl9jaGFubmVsKSkpOwotICBsb2NhbF9jaWRfdG9fcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbl9tYXBfLmVyYXNlKGNpZCk7Ci19Ci0KLXZvaWQgTGluazo6Tm90aWZ5Q2hhbm5lbEZhaWwoQ2lkIGNpZCwgRHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgewotICBBU1NFUlQobG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwXy5maW5kKGNpZCkgIT0KLSAgICAgICAgIGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZW5kKCkpOwotICBhdXRvJiBwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uID0gbG9jYWxfY2lkX3RvX3BlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb25fbWFwX1tjaWRdOwotICAvLyBUT0RPKGNtYW50b24pIFBhc3MgcHJvcGVyIGNvbm5lY3Rpb24gZmFsdXJlIHJlc3VsdCB0byB1c2VyCi0gIHBlbmRpbmdfZHluYW1pY19jaGFubmVsX2Nvbm5lY3Rpb24uaGFuZGxlcl8tPlBvc3QoCi0gICAgICBjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uLm9uX2ZhaWxfY2FsbGJhY2tfKSwgcmVzdWx0KSk7Ci0gIGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF8uZXJhc2UoY2lkKTsKLX0KLQotdWludDE2X3QgTGluazo6R2V0TXBzKCkgY29uc3QgewotICByZXR1cm4gcGFyYW1ldGVyX3Byb3ZpZGVyXy0+R2V0TGVNcHMoKTsKLX0KLQotdWludDE2X3QgTGluazo6R2V0SW5pdGlhbENyZWRpdCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBhcmFtZXRlcl9wcm92aWRlcl8tPkdldExlSW5pdGlhbENyZWRpdCgpOwotfQotCi12b2lkIExpbms6OlNlbmRMZUNyZWRpdChDaWQgbG9jYWxfY2lkLCB1aW50MTZfdCBjcmVkaXQpIHsKLSAgc2lnbmFsbGluZ19tYW5hZ2VyXy5TZW5kQ3JlZGl0KGxvY2FsX2NpZCwgY3JlZGl0KTsKLX0KLQotdm9pZCBMaW5rOjpSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKCkgewotICBhY2xfY29ubmVjdGlvbl8tPlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24oKTsKLX0KLQotdm9pZCBMaW5rOjpvbl9jb25uZWN0aW9uX3VwZGF0ZV9jb21wbGV0ZShTaWduYWxJZCBzaWduYWxfaWQsIGhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUpIHsKLSAgaWYgKCFzaWduYWxfaWQuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX0lORk8oIkludmFsaWQgc2lnbmFsX2lkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVJlc3VsdCByZXN1bHQgPSAoZXJyb3JfY29kZSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVJlc3VsdDo6QUNDRVBURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVJlc3VsdDo6UkVKRUNURUQ7Ci0gIHNpZ25hbGxpbmdfbWFuYWdlcl8uU2VuZENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZShTaWduYWxJZCgpLCByZXN1bHQpOwotfQotCi12b2lkIExpbms6Ok9uUGVuZGluZ1BhY2tldENoYW5nZShDaWQgbG9jYWxfY2lkLCBib29sIGhhc19wYWNrZXQpIHsKLSAgaWYgKGhhc19wYWNrZXQpIHsKLSAgICByZW1haW5pbmdfcGFja2V0c190b19iZV9zZW50XysrOwotICB9IGVsc2UgewotICAgIHJlbWFpbmluZ19wYWNrZXRzX3RvX2JlX3NlbnRfLS07Ci0gIH0KLSAgbGlua19tYW5hZ2VyXy0+T25QZW5kaW5nUGFja2V0Q2hhbmdlKEdldERldmljZSgpLCByZW1haW5pbmdfcGFja2V0c190b19iZV9zZW50Xyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2xpbmsuaCBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2xpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4NzkzZS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9sZV9hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2lsaW5rLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvbGlua19vcHRpb25zLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAib3MvYWxhcm0uaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIExpbmtNYW5hZ2VyOwotCi1jbGFzcyBMaW5rIDogcHVibGljIGwyY2FwOjppbnRlcm5hbDo6SUxpbmssIHB1YmxpYyBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIExpbmsob3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIsIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uLAotICAgICAgIGwyY2FwOjppbnRlcm5hbDo6UGFyYW1ldGVyUHJvdmlkZXIqIHBhcmFtZXRlcl9wcm92aWRlciwKLSAgICAgICBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZHluYW1pY19zZXJ2aWNlX21hbmFnZXIsIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZml4ZWRfc2VydmljZV9tYW5hZ2VyLAotICAgICAgIExpbmtNYW5hZ2VyKiBsaW5rX21hbmFnZXIpOwotCi0gIH5MaW5rKCkgPSBkZWZhdWx0OwotCi0gIGlubGluZSBoY2k6OkFkZHJlc3NXaXRoVHlwZSBHZXREZXZpY2UoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGFjbF9jb25uZWN0aW9uXy0+R2V0UmVtb3RlQWRkcmVzcygpOwotICB9Ci0KLSAgc3RydWN0IFBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24gewotICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbk9wZW5DYWxsYmFjayBvbl9vcGVuX2NhbGxiYWNrXzsKLSAgICBEeW5hbWljQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrXzsKLSAgICBsZTo6RHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZ3VyYXRpb25fOwotICB9OwotCi0gIGlubGluZSB2aXJ0dWFsIGhjaTo6Um9sZSBHZXRSb2xlKCkgewotICAgIHJldHVybiBhY2xfY29ubmVjdGlvbl8tPkdldFJvbGUoKTsKLSAgfQotCi0gIGlubGluZSB2aXJ0dWFsIGhjaTo6YWNsX21hbmFnZXI6OkxlQWNsQ29ubmVjdGlvbiogR2V0QWNsQ29ubmVjdGlvbigpIHsKLSAgICByZXR1cm4gYWNsX2Nvbm5lY3Rpb25fLmdldCgpOwotICB9Ci0KLSAgLy8gQUNMIG1ldGhvZHMKLQotICB2aXJ0dWFsIHZvaWQgT25BY2xEaXNjb25uZWN0ZWQoaGNpOjpFcnJvckNvZGUgcmVhc29uKTsKLQotICB2b2lkIE9uRGlzY29ubmVjdGlvbihoY2k6OkVycm9yQ29kZSByZWFzb24pIG92ZXJyaWRlOwotCi0gIHZvaWQgT25Db25uZWN0aW9uVXBkYXRlKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywKLSAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25faW50ZXJ2YWwsCi0gICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0KSBvdmVycmlkZTsKLQotICB2b2lkIE9uRGF0YUxlbmd0aENoYW5nZSh1aW50MTZfdCB0eF9vY3RldHMsIHVpbnQxNl90IHR4X3RpbWUsIHVpbnQxNl90IHJ4X29jdGV0cywgdWludDE2X3QgcnhfdGltZSkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSgKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJfdmVyc2lvbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QaHlVcGRhdGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5KSBvdmVycmlkZTsKLQotICB2b2lkIE9uTG9jYWxBZGRyZXNzVXBkYXRlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdCgpOwotCi0gIC8vIEhhbmRsZXMgY29ubmVjdGlvbiBwYXJhbWV0ZXIgdXBkYXRlIHJlcXVlc3QgZnJvbSByZW1vdGUKLSAgdmlydHVhbCB2b2lkIFVwZGF0ZUNvbm5lY3Rpb25QYXJhbWV0ZXJGcm9tUmVtb3RlKFNpZ25hbElkIHNpZ25hbF9pZCwgdWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2ludGVydmFsX21heCwgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCk7Ci0gIHZpcnR1YWwgYm9vbCBDaGVja0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKAotICAgICAgdWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4sIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWF4LCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpOwotCi0gIHZpcnR1YWwgdm9pZCBTZW5kQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSh1aW50MTZfdCBjb25uX2ludGVydmFsX21pbiwgdWludDE2X3QgY29ubl9pbnRlcnZhbF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY2VfbGVuZ3RoLCB1aW50MTZfdCBtYXhfY2VfbGVuZ3RoKTsKLQotICAvLyBGaXhlZENoYW5uZWwgbWV0aG9kcwotCi0gIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEZpeGVkQ2hhbm5lbEltcGw+IEFsbG9jYXRlRml4ZWRDaGFubmVsKENpZCBjaWQsIFNlY3VyaXR5UG9saWN5IHNlY3VyaXR5X3BvbGljeSk7Ci0KLSAgdmlydHVhbCBib29sIElzRml4ZWRDaGFubmVsQWxsb2NhdGVkKENpZCBjaWQpOwotCi0gIC8vIER5bmFtaWNDaGFubmVsIG1ldGhvZHMKLQotICB2aXJ0dWFsIENpZCBSZXNlcnZlRHluYW1pY0NoYW5uZWwoKTsKLQotICB2aXJ0dWFsIHZvaWQgU2VuZENvbm5lY3Rpb25SZXF1ZXN0KFBzbSBwc20sIFBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbik7Ci0KLSAgdm9pZCBTZW5kRGlzY29ubmVjdGlvblJlcXVlc3QoQ2lkIGxvY2FsX2NpZCwgQ2lkIHJlbW90ZV9jaWQpIG92ZXJyaWRlOwotCi0gIC8vIEludm9rZWQgYnkgc2lnbmFsbGluZyBtYW5hZ2VyIHRvIGluZGljYXRlIGFuIG91dGdvaW5nIGNvbm5lY3Rpb24gcmVxdWVzdCBmYWlsZWQgYW5kIGxpbmsgc2hhbGwgZnJlZSByZXNvdXJjZXMKLSAgdmlydHVhbCB2b2lkIE9uT3V0Z29pbmdDb25uZWN0aW9uUmVxdWVzdEZhaWwoQ2lkIGxvY2FsX2NpZCwgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCByZXN1bHQpOwotCi0gIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxJbXBsPiBBbGxvY2F0ZUR5bmFtaWNDaGFubmVsKFBzbSBwc20sIENpZCByZW1vdGVfY2lkKTsKLQotICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxsMmNhcDo6aW50ZXJuYWw6OkR5bmFtaWNDaGFubmVsSW1wbD4gQWxsb2NhdGVSZXNlcnZlZER5bmFtaWNDaGFubmVsKENpZCByZXNlcnZlZF9jaWQsIFBzbSBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lkIHJlbW90ZV9jaWQpOwotCi0gIHZpcnR1YWwgdm9pZCBGcmVlRHluYW1pY0NoYW5uZWwoQ2lkIGNpZCk7Ci0KLSAgLy8gQ2hlY2sgaG93IG1hbnkgY2hhbm5lbHMgYXJlIGFjcXVpcmVkIG9yIGluIHVzZSwgaWYgemVybywgc3RhcnQgdGVhciBkb3duIHRpbWVyLCBpZiBub24temVybywgY2FuY2VsIHRlYXIgZG93biB0aW1lcgotICB2aXJ0dWFsIHZvaWQgUmVmcmVzaFJlZkNvdW50KCk7Ci0KLSAgdm9pZCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oQ2lkIGNpZCwgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsPiB1c2VyX2NoYW5uZWwpOwotICB2b2lkIE5vdGlmeUNoYW5uZWxGYWlsKENpZCBjaWQsIER5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIEdldERldmljZSgpLlRvU3RyaW5nKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQxNl90IEdldE1wcygpIGNvbnN0OwotCi0gIHZpcnR1YWwgdWludDE2X3QgR2V0SW5pdGlhbENyZWRpdCgpIGNvbnN0OwotCi0gIHZvaWQgU2VuZExlQ3JlZGl0KENpZCBsb2NhbF9jaWQsIHVpbnQxNl90IGNyZWRpdCkgb3ZlcnJpZGU7Ci0KLSAgTGlua09wdGlvbnMqIEdldExpbmtPcHRpb25zKCkgewotICAgIHJldHVybiAmbGlua19vcHRpb25zXzsKLSAgfQotCi0gIHZvaWQgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpOwotCi0gIHZvaWQgT25QZW5kaW5nUGFja2V0Q2hhbmdlKENpZCBsb2NhbF9jaWQsIGJvb2wgaGFzX3BhY2tldCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl87Ci0gIGwyY2FwOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsQWxsb2NhdG9yPEZpeGVkQ2hhbm5lbEltcGwsIExpbms+IGZpeGVkX2NoYW5uZWxfYWxsb2NhdG9yX3t0aGlzLCBsMmNhcF9oYW5kbGVyX307Ci0gIGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxBbGxvY2F0b3IgZHluYW1pY19jaGFubmVsX2FsbG9jYXRvcl97dGhpcywgbDJjYXBfaGFuZGxlcl99OwotICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjphY2xfbWFuYWdlcjo6TGVBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbl87Ci0gIGwyY2FwOjppbnRlcm5hbDo6RGF0YVBpcGVsaW5lTWFuYWdlciBkYXRhX3BpcGVsaW5lX21hbmFnZXJfOwotICBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyKiBwYXJhbWV0ZXJfcHJvdmlkZXJfOwotICBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfOwotICBMZVNpZ25hbGxpbmdNYW5hZ2VyIHNpZ25hbGxpbmdfbWFuYWdlcl87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxDaWQsIFBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24+IGxvY2FsX2NpZF90b19wZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uX21hcF87Ci0gIG9zOjpBbGFybSBsaW5rX2lkbGVfZGlzY29ubmVjdF9hbGFybV97bDJjYXBfaGFuZGxlcl99OwotICBMaW5rT3B0aW9ucyBsaW5rX29wdGlvbnNfe2FjbF9jb25uZWN0aW9uXy5nZXQoKSwgdGhpcywgbDJjYXBfaGFuZGxlcl99OwotICBMaW5rTWFuYWdlciogbGlua19tYW5hZ2VyXzsKLSAgU2lnbmFsSWQgdXBkYXRlX3JlcXVlc3Rfc2lnbmFsX2lkXyA9IGtJbnZhbGlkU2lnbmFsSWQ7Ci0gIHVpbnQxNl90IHVwZGF0ZV9yZXF1ZXN0X2ludGVydmFsX21pbl87Ci0gIHVpbnQxNl90IHVwZGF0ZV9yZXF1ZXN0X2ludGVydmFsX21heF87Ci0gIHVpbnQxNl90IHVwZGF0ZV9yZXF1ZXN0X2xhdGVuY3lfOwotICB1aW50MTZfdCB1cGRhdGVfcmVxdWVzdF9zdXBlcnZpc2lvbl90aW1lb3V0XzsKLSAgc3RkOjphdG9taWNfaW50IHJlbWFpbmluZ19wYWNrZXRzX3RvX2JlX3NlbnRfID0gMDsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExpbmspOwotCi0gIC8vIFJlY2VpdmVkIGNvbm5lY3Rpb24gdXBkYXRlIGNvbXBsZXRlIGZyb20gQUNMIG1hbmFnZXIuIFNpZ25hbElkIGlzIGJvdW5kIHRvIGEgdmFsaWQgbnVtYmVyIHdoZW4gd2UgbmVlZCB0byBzZW5kIGEKLSAgLy8gcmVzcG9uc2UgdG8gcmVtb3RlLiBJZiBTaWduYWxJZCBpcyBib3VuZCB0byBhbiBpbnZhbGlkIG51bWJlciwgd2UgZG9uJ3Qgc2VuZCBhIHJlc3BvbnNlIHRvIHJlbW90ZSwgYmVjYXVzZSB0aGUKLSAgLy8gY29ubmVjdGlvbiB1cGRhdGUgcmVxdWVzdCBpcyBub3QgZnJvbSByZW1vdGUgTEwgcGVyaXBoZXJhbC4KLSAgdm9pZCBvbl9jb25uZWN0aW9uX3VwZGF0ZV9jb21wbGV0ZShTaWduYWxJZCBzaWduYWxfaWQsIGhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmNjIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjY3N2EzLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2xpbmtfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9zY2hlZHVsZXJfZmlmby5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2xpbmsuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXZvaWQgTGlua01hbmFnZXI6OkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikgewotICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgc2VydmljZSByZWdpc3RlcmVkCi0gIGF1dG8gZml4ZWRfY2hhbm5lbF9zZXJ2aWNlcyA9IGZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXy0+R2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCk7Ci0gIGlmIChmaXhlZF9jaGFubmVsX3NlcnZpY2VzLmVtcHR5KCkpIHsKLSAgICAvLyBJZiBzbywgcmV0dXJuIGVycm9yCi0gICAgcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24uaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICAgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uLm9uX2ZhaWxfY2FsbGJhY2tfKSwKLSAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdHsKLSAgICAgICAgICAgIC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlID0gRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdENvZGU6OkZBSUxfTk9fU0VSVklDRV9SRUdJU1RFUkVEfSkpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBPdGhlcndpc2UsIGNoZWNrIGlmIGRldmljZSBoYXMgYW4gQUNMIGNvbm5lY3Rpb24KLSAgYXV0byogbGluayA9IEdldExpbmsoYWRkcmVzc193aXRoX3R5cGUpOwotICBpZiAobGluayAhPSBudWxscHRyKSB7Ci0gICAgLy8gSWYgZGV2aWNlIGFscmVhZHkgaGF2ZSBhbiBBQ0wgY29ubmVjdGlvbgotICAgIC8vIENoZWNrIGlmIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGhhdmUgYW4gYWxsb2NhdGVkIGNoYW5uZWwgYW5kIGFsbG9jYXRlIG9uZSBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQKLSAgICBpbnQgbnVtX25ld19jaGFubmVscyA9IDA7Ci0gICAgZm9yIChhdXRvJiBmaXhlZF9jaGFubmVsX3NlcnZpY2UgOiBmaXhlZF9jaGFubmVsX3NlcnZpY2VzKSB7Ci0gICAgICBpZiAobGluay0+SXNGaXhlZENoYW5uZWxBbGxvY2F0ZWQoZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmZpcnN0KSkgewotICAgICAgICAvLyBUaGlzIGNoYW5uZWwgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIHRoaXMgbGluaywgZG8gbm90IGFsbG9jYXRlZCB0d2ljZQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIEFsbG9jYXRlIGNoYW5uZWwgZm9yIG5ld2x5IHJlZ2lzdGVyZWQgZml4ZWQgY2hhbm5lbHMKLSAgICAgIGF1dG8gZml4ZWRfY2hhbm5lbF9pbXBsID0gbGluay0+QWxsb2NhdGVGaXhlZENoYW5uZWwoCi0gICAgICAgICAgZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmZpcnN0LCBTZWN1cml0eVBvbGljeTo6Tk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LKTsKLSAgICAgIGZpeGVkX2NoYW5uZWxfc2VydmljZS5zZWNvbmQtPk5vdGlmeUNoYW5uZWxDcmVhdGlvbigKLSAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZpeGVkQ2hhbm5lbD4oZml4ZWRfY2hhbm5lbF9pbXBsLCBsMmNhcF9oYW5kbGVyXykpOwotICAgICAgbnVtX25ld19jaGFubmVscysrOwotICAgIH0KLSAgICAvLyBEZWNsYXJlIGNvbm5lY3Rpb24gZmFpbHVyZSBpZiBubyBuZXcgY2hhbm5lbHMgYXJlIGNyZWF0ZWQKLSAgICBpZiAobnVtX25ld19jaGFubmVscyA9PSAwKSB7Ci0gICAgICBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbi5oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgICAgIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbi5vbl9mYWlsX2NhbGxiYWNrXyksCi0gICAgICAgICAgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdHsKLSAgICAgICAgICAgICAgLmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUgPSBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMfSkpOwotICAgIH0KLSAgICAvLyBObyBuZWVkIHRvIGNyZWF0ZSBBQ0wgY29ubmVjdGlvbiwgcmV0dXJuIHdpdGhvdXQgc2F2aW5nIGFueSBwZW5kaW5nIGNvbm5lY3Rpb25zCi0gICAgcmV0dXJuOwotICB9Ci0gIC8vIElmIG5vdCwgY3JlYXRlIG5ldyBBQ0wgY29ubmVjdGlvbgotICAvLyBBZGQgcmVxdWVzdCB0byBwZW5kaW5nIGxpbmsgbGlzdCBmaXJzdAotICBhdXRvIHBlbmRpbmdfbGluayA9IHBlbmRpbmdfbGlua3NfLmZpbmQoYWRkcmVzc193aXRoX3R5cGUpOwotICBpZiAocGVuZGluZ19saW5rID09IHBlbmRpbmdfbGlua3NfLmVuZCgpKSB7Ci0gICAgLy8gQ3JlYXRlIHBlbmRpbmcgbGluayBpZiBub3QgZXhpc3QKLSAgICBwZW5kaW5nX2xpbmtzXy50cnlfZW1wbGFjZShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgcGVuZGluZ19saW5rID0gcGVuZGluZ19saW5rc18uZmluZChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIH0KLSAgcGVuZGluZ19saW5rLT5zZWNvbmQucGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb25zXy5wdXNoX2JhY2soc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0gIC8vIFRoZW4gY3JlYXRlIG5ldyBBQ0wgY29ubmVjdGlvbgotICBhY2xfbWFuYWdlcl8tPkNyZWF0ZUxlQ29ubmVjdGlvbihhZGRyZXNzX3dpdGhfdHlwZSwgLyogaXNfZGlyZWN0ICovIHRydWUpOwotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpDb25uZWN0RHluYW1pY0NoYW5uZWxTZXJ2aWNlcygKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIExpbms6OlBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbiwgUHNtIHBzbSkgewotICBhdXRvKiBsaW5rID0gR2V0TGluayhkZXZpY2UpOwotICBpZiAobGluayA9PSBudWxscHRyKSB7Ci0gICAgYWNsX21hbmFnZXJfLT5DcmVhdGVMZUNvbm5lY3Rpb24oZGV2aWNlLCAvKiBpc19kaXJlY3QgKi8gdHJ1ZSk7Ci0gICAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxzX1tkZXZpY2VdLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwc20sIHN0ZDo6bW92ZShwZW5kaW5nX2R5bmFtaWNfY2hhbm5lbF9jb25uZWN0aW9uKSkpOwotICAgIHJldHVybjsKLSAgfQotICBsaW5rLT5TZW5kQ29ubmVjdGlvblJlcXVlc3QocHNtLCBzdGQ6Om1vdmUocGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbikpOwotfQotCi1MaW5rKiBMaW5rTWFuYWdlcjo6R2V0TGluayhoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgewotICBpZiAobGlua3NfLmZpbmQoYWRkcmVzc193aXRoX3R5cGUpID09IGxpbmtzXy5lbmQoKSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiAmbGlua3NfLmZpbmQoYWRkcmVzc193aXRoX3R5cGUpLT5zZWNvbmQ7Ci19Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uTGVDb25uZWN0U3VjY2VzcyhoY2k6OkFkZHJlc3NXaXRoVHlwZSBjb25uZWN0aW5nX2FkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uKSB7Ci0gIC8vIFNhbWUgbGluayBzaG91bGQgbm90IGJlIGNvbm5lY3RlZCB0d2ljZQotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBjb25uZWN0ZWRfYWRkcmVzc193aXRoX3R5cGUgPSBhY2xfY29ubmVjdGlvbi0+R2V0UmVtb3RlQWRkcmVzcygpOwotICB1aW50MTZfdCBoYW5kbGUgPSBhY2xfY29ubmVjdGlvbi0+R2V0SGFuZGxlKCk7Ci0gIEFTU0VSVF9MT0coR2V0TGluayhjb25uZWN0ZWRfYWRkcmVzc193aXRoX3R5cGUpID09IG51bGxwdHIsICIlcyBpcyBjb25uZWN0ZWQgdHdpY2Ugd2l0aG91dCBkaXNjb25uZWN0aW9uIiwKLSAgICAgICAgICAgICBhY2xfY29ubmVjdGlvbi0+R2V0UmVtb3RlQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGxpbmtzXy50cnlfZW1wbGFjZShjb25uZWN0ZWRfYWRkcmVzc193aXRoX3R5cGUsIGwyY2FwX2hhbmRsZXJfLCBzdGQ6Om1vdmUoYWNsX2Nvbm5lY3Rpb24pLCBwYXJhbWV0ZXJfcHJvdmlkZXJfLAotICAgICAgICAgICAgICAgICAgICAgZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl8sIGZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXywgdGhpcyk7Ci0gIGF1dG8qIGxpbmsgPSBHZXRMaW5rKGNvbm5lY3RlZF9hZGRyZXNzX3dpdGhfdHlwZSk7Ci0KLSAgaWYgKGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8gIT0gbnVsbHB0cikgewotICAgIGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgICAgbGlua19wcm9wZXJ0eV9saXN0ZW5lcl8sCi0gICAgICAgICZMaW5rUHJvcGVydHlMaXN0ZW5lcjo6T25MaW5rQ29ubmVjdGVkLAotICAgICAgICBjb25uZWN0ZWRfYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgIGhhbmRsZSwKLSAgICAgICAgbGluay0+R2V0Um9sZSgpKTsKLSAgfQotCi0gIC8vIFJlbW92ZSBkZXZpY2UgZnJvbSBwZW5kaW5nIGxpbmtzIGxpc3QsIGlmIGFueQotICBwZW5kaW5nX2xpbmtzXy5lcmFzZShjb25uZWN0aW5nX2FkZHJlc3Nfd2l0aF90eXBlKTsKLQotICBsaW5rLT5SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKCk7Ci19Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uTGVDb25uZWN0RmFpbChoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSwgaGNpOjpFcnJvckNvZGUgcmVhc29uKSB7Ci0gIC8vIE5vdGlmeSBhbGwgcGVuZGluZyBsaW5rcyBmb3IgdGhpcyBkZXZpY2UKLSAgYXV0byBwZW5kaW5nX2xpbmsgPSBwZW5kaW5nX2xpbmtzXy5maW5kKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgaWYgKHBlbmRpbmdfbGluayA9PSBwZW5kaW5nX2xpbmtzXy5lbmQoKSkgewotICAgIC8vIFRoZXJlIGlzIG5vIHBlbmRpbmcgbGluaywgZXhpdAotICAgIExPR19JTkZPKCJDb25uZWN0aW9uIHRvICVzIGZhaWxlZCB3aXRob3V0IGEgcGVuZGluZyBsaW5rIiwgYWRkcmVzc193aXRoX3R5cGUuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChhdXRvJiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbiA6IHBlbmRpbmdfbGluay0+c2Vjb25kLnBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uc18pIHsKLSAgICBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbi5oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgICBzdGQ6Om1vdmUocGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24ub25fZmFpbF9jYWxsYmFja18pLAotICAgICAgICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0ewotICAgICAgICAgICAgLmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUgPSBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9IQ0lfRVJST1IsIC5oY2lfZXJyb3IgPSByZWFzb259KSk7Ci0gIH0KLSAgLy8gUmVtb3ZlIGVudHJ5IGluIHBlbmRpbmcgbGluayBsaXN0Ci0gIHBlbmRpbmdfbGlua3NfLmVyYXNlKHBlbmRpbmdfbGluayk7Ci19Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uRGlzY29ubmVjdChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIGF1dG8qIGxpbmsgPSBHZXRMaW5rKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgQVNTRVJUX0xPRyhsaW5rICE9IG51bGxwdHIsICJEZXZpY2UgJXMgaXMgZGlzY29ubmVjdGVkIGJ1dCBub3QgaW4gbG9jYWwgZGF0YWJhc2UiLAotICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGlmIChsaW5rc193aXRoX3BlbmRpbmdfcGFja2V0c18uY291bnQoYWRkcmVzc193aXRoX3R5cGUpICE9IDApIHsKLSAgICBkaXNjb25uZWN0ZWRfbGlua3NfLmVtcGxhY2UoYWRkcmVzc193aXRoX3R5cGUpOwotICB9IGVsc2UgewotICAgIGxpbmtzXy5lcmFzZShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIH0KLQotICBpZiAobGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgICBsaW5rX3Byb3BlcnR5X2xpc3RlbmVyXywgJkxpbmtQcm9wZXJ0eUxpc3RlbmVyOjpPbkxpbmtEaXNjb25uZWN0ZWQsIGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgfQotfQotCi12b2lkIExpbmtNYW5hZ2VyOjpSZWdpc3RlckxpbmtQcm9wZXJ0eUxpc3RlbmVyKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBMaW5rUHJvcGVydHlMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgbGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXyA9IGhhbmRsZXI7Ci0gIGxpbmtfcHJvcGVydHlfbGlzdGVuZXJfID0gbGlzdGVuZXI7Ci19Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKAotICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwKLSAgICB1aW50MTZfdCBzdWJfdmVyc2lvbikgewotICBpZiAobGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXyAhPSBudWxscHRyKSB7Ci0gICAgbGlua19wcm9wZXJ0eV9jYWxsYmFja19oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgICBsaW5rX3Byb3BlcnR5X2xpc3RlbmVyXywKLSAgICAgICAgJkxpbmtQcm9wZXJ0eUxpc3RlbmVyOjpPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24sCi0gICAgICAgIGhjaV9zdGF0dXMsCi0gICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICBsbXBfdmVyc2lvbiwKLSAgICAgICAgbWFudWZhY3R1cmVyX25hbWUsCi0gICAgICAgIHN1Yl92ZXJzaW9uKTsKLSAgfQotCi0gIGF1dG8qIGxpbmsgPSBHZXRMaW5rKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgLy8gQWxsb2NhdGUgYW5kIGRpc3RyaWJ1dGUgY2hhbm5lbHMgZm9yIGFsbCByZWdpc3RlcmVkIGZpeGVkIGNoYW5uZWwgc2VydmljZXMKLSAgYXV0byBmaXhlZF9jaGFubmVsX3NlcnZpY2VzID0gZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfLT5HZXRSZWdpc3RlcmVkU2VydmljZXMoKTsKLSAgZm9yIChhdXRvJiBmaXhlZF9jaGFubmVsX3NlcnZpY2UgOiBmaXhlZF9jaGFubmVsX3NlcnZpY2VzKSB7Ci0gICAgYXV0byBmaXhlZF9jaGFubmVsX2ltcGwgPSBsaW5rLT5BbGxvY2F0ZUZpeGVkQ2hhbm5lbCgKLSAgICAgICAgZml4ZWRfY2hhbm5lbF9zZXJ2aWNlLmZpcnN0LCBTZWN1cml0eVBvbGljeTo6Tk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LKTsKLSAgICBmaXhlZF9jaGFubmVsX3NlcnZpY2Uuc2Vjb25kLT5Ob3RpZnlDaGFubmVsQ3JlYXRpb24oCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Rml4ZWRDaGFubmVsPihmaXhlZF9jaGFubmVsX2ltcGwsIGwyY2FwX2hhbmRsZXJfKSk7Ci0gIH0KLSAgaWYgKHBlbmRpbmdfZHluYW1pY19jaGFubmVsc18uZmluZChhZGRyZXNzX3dpdGhfdHlwZSkgIT0gcGVuZGluZ19keW5hbWljX2NoYW5uZWxzXy5lbmQoKSkgewotICAgIGZvciAoYXV0byYgcHNtX2NhbGxiYWNrIDogcGVuZGluZ19keW5hbWljX2NoYW5uZWxzX1thZGRyZXNzX3dpdGhfdHlwZV0pIHsKLSAgICAgIGxpbmstPlNlbmRDb25uZWN0aW9uUmVxdWVzdChwc21fY2FsbGJhY2suZmlyc3QsIHN0ZDo6bW92ZShwc21fY2FsbGJhY2suc2Vjb25kKSk7Ci0gICAgfQotICAgIHBlbmRpbmdfZHluYW1pY19jaGFubmVsc18uZXJhc2UoYWRkcmVzc193aXRoX3R5cGUpOwotICB9Ci19Ci0KLXZvaWQgTGlua01hbmFnZXI6Ok9uUGVuZGluZ1BhY2tldENoYW5nZShoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsIGludCBudW1fcGFja2V0cykgewotICBpZiAoZGlzY29ubmVjdGVkX2xpbmtzXy5jb3VudChyZW1vdGUpICE9IDAgJiYgbnVtX3BhY2tldHMgPT0gMCkgewotICAgIGxpbmtzXy5lcmFzZShyZW1vdGUpOwotICAgIGxpbmtzX3dpdGhfcGVuZGluZ19wYWNrZXRzXy5lcmFzZShyZW1vdGUpOwotICB9IGVsc2UgaWYgKG51bV9wYWNrZXRzICE9IDApIHsKLSAgICBsaW5rc193aXRoX3BlbmRpbmdfcGFja2V0c18uZW1wbGFjZShyZW1vdGUpOwotICB9IGVsc2UgewotICAgIGxpbmtzX3dpdGhfcGVuZGluZ19wYWNrZXRzXy5lcmFzZShyZW1vdGUpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2xpbmtfbWFuYWdlci5oIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZWMwNDYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvbGlua19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvbGVfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvc2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2xpbmsuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9saW5rX3Byb3BlcnR5X2xpc3RlbmVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMaW5rTWFuYWdlciA6IHB1YmxpYyBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3MgewotIHB1YmxpYzoKLSAgTGlua01hbmFnZXIoCi0gICAgICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlciwKLSAgICAgIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXIsCi0gICAgICBGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIHNlcnZpY2VfbWFuYWdlciwKLSAgICAgIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBkeW5hbWljX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgIGwyY2FwOjppbnRlcm5hbDo6UGFyYW1ldGVyUHJvdmlkZXIqIHBhcmFtZXRlcl9wcm92aWRlcikKLSAgICAgIDogbDJjYXBfaGFuZGxlcl8obDJjYXBfaGFuZGxlciksCi0gICAgICAgIGFjbF9tYW5hZ2VyXyhhY2xfbWFuYWdlciksCi0gICAgICAgIGZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXyhzZXJ2aWNlX21hbmFnZXIpLAotICAgICAgICBkeW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyXyhkeW5hbWljX3NlcnZpY2VfbWFuYWdlciksCi0gICAgICAgIHBhcmFtZXRlcl9wcm92aWRlcl8ocGFyYW1ldGVyX3Byb3ZpZGVyKSB7Ci0gICAgYWNsX21hbmFnZXJfLT5SZWdpc3RlckxlQ2FsbGJhY2tzKHRoaXMsIGwyY2FwX2hhbmRsZXJfKTsKLSAgfQotCi0gIHN0cnVjdCBQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiB7Ci0gICAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotICAgIEZpeGVkQ2hhbm5lbE1hbmFnZXI6Ok9uQ29ubmVjdGlvbkZhaWx1cmVDYWxsYmFjayBvbl9mYWlsX2NhbGxiYWNrXzsKLSAgfTsKLQotICBzdHJ1Y3QgUGVuZGluZ0xpbmsgewotICAgIHN0ZDo6dmVjdG9yPFBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uPiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnNfOwotICB9OwotCi0gIC8vIEFDTCBtZXRob2RzCi0KLSAgTGluayogR2V0TGluayhoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gIHZvaWQgT25MZUNvbm5lY3RTdWNjZXNzKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGNvbm5lY3RpbmdfYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uKSBvdmVycmlkZTsKLSAgdm9pZCBPbkxlQ29ubmVjdEZhaWwoaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIGhjaTo6RXJyb3JDb2RlIHJlYXNvbikgb3ZlcnJpZGU7Ci0KLSAgLy8gRml4ZWRDaGFubmVsTWFuYWdlciBtZXRob2RzCi0KLSAgdm9pZCBDb25uZWN0Rml4ZWRDaGFubmVsU2VydmljZXMoaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKTsKLQotICAvLyBEeW5hbWljQ2hhbm5lbE1hbmFnZXIgbWV0aG9kcwotCi0gIHZvaWQgQ29ubmVjdER5bmFtaWNDaGFubmVsU2VydmljZXMoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbms6OlBlbmRpbmdEeW5hbWljQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19keW5hbWljX2NoYW5uZWxfY29ubmVjdGlvbiwgUHNtIHBzbSk7Ci0KLSAgdm9pZCBPbkRpc2Nvbm5lY3QoaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUpOwotCi0gIC8vIExpbmsgbWV0aG9kcwotCi0gIHZvaWQgUmVnaXN0ZXJMaW5rUHJvcGVydHlMaXN0ZW5lcihvczo6SGFuZGxlciogaGFuZGxlciwgTGlua1Byb3BlcnR5TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKAotICAgICAgaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywKLSAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLAotICAgICAgdWludDE2X3Qgc3ViX3ZlcnNpb24pOwotCi0gIC8vIFJlcG9ydGVkIGJ5IGxpbmsgdG8gaW5kaWNhdGUgaG93IG1hbnkgcGVuZGluZyBwYWNrZXRzIGFyZSByZW1haW5pbmcgdG8gYmUgc2V0LgotICAvLyBJZiB0aGVyZSBpcyBhbnl0aGluZyBvdXRzdGFuZGluZywgZG9uJ3QgZGVsZXRlIGxpbmsKLSAgdm9pZCBPblBlbmRpbmdQYWNrZXRDaGFuZ2UoaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLCBpbnQgbnVtX3BhY2tldHMpOwotCi0gcHJpdmF0ZToKLSAgLy8gRGVwZW5kZW5jaWVzCi0gIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyXzsKLSAgaGNpOjpBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlcl87Ci0gIEZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfOwotICBEeW5hbWljQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCogZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl87Ci0gIGwyY2FwOjppbnRlcm5hbDo6UGFyYW1ldGVyUHJvdmlkZXIqIHBhcmFtZXRlcl9wcm92aWRlcl87Ci0KLSAgLy8gSW50ZXJuYWwgc3RhdGVzCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxoY2k6OkFkZHJlc3NXaXRoVHlwZSwgUGVuZGluZ0xpbms+IHBlbmRpbmdfbGlua3NfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzV2l0aFR5cGUsIExpbms+IGxpbmtzXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzc1dpdGhUeXBlLCBzdGQ6Omxpc3Q8c3RkOjpwYWlyPFBzbSwgTGluazo6UGVuZGluZ0R5bmFtaWNDaGFubmVsQ29ubmVjdGlvbj4+PgotICAgICAgcGVuZGluZ19keW5hbWljX2NoYW5uZWxzXzsKLSAgb3M6OkhhbmRsZXIqIGxpbmtfcHJvcGVydHlfY2FsbGJhY2tfaGFuZGxlcl8gPSBudWxscHRyOwotICBMaW5rUHJvcGVydHlMaXN0ZW5lciogbGlua19wcm9wZXJ0eV9saXN0ZW5lcl8gPSBudWxscHRyOwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8aGNpOjpBZGRyZXNzV2l0aFR5cGU+IGRpc2Nvbm5lY3RlZF9saW5rc187Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDxoY2k6OkFkZHJlc3NXaXRoVHlwZT4gbGlua3Nfd2l0aF9wZW5kaW5nX3BhY2tldHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMaW5rTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9saW5rX21hbmFnZXJfdGVzdC5jYyBiL2dkL2wyY2FwL2xlL2ludGVybmFsL2xpbmtfbWFuYWdlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzU4NWY3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2ludGVybmFsL2xpbmtfbWFuYWdlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi90ZXN0aW5nL2JpbmRfdGVzdF91dGlsLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyX21vY2suaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlcl9tb2NrLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvZml4ZWRfY2hhbm5lbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX2ltcGxfbW9jay5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfbW9jay5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgewotCi11c2luZyBoY2k6OnRlc3Rpbmc6Ok1vY2tBY2xNYW5hZ2VyOwotdXNpbmcgaGNpOjp0ZXN0aW5nOjpNb2NrTGVBY2xDb25uZWN0aW9uOwotdXNpbmcgbDJjYXA6OmludGVybmFsOjp0ZXN0aW5nOjpNb2NrUGFyYW1ldGVyUHJvdmlkZXI7Ci11c2luZyA6OnRlc3Rpbmc6Ol87ICAvLyBNYXRjaGVyIHRvIGFueSB2YWx1ZQotdXNpbmcgOjp0ZXN0aW5nOjpCeU1vdmU7Ci11c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6TW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsOwotdXNpbmcgdGVzdGluZzo6TW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwotCi1jb25zdGV4cHIgc3RhdGljIGF1dG8ga1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRMb25nID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKTsKLWNvbnN0ZXhwciBzdGF0aWMgYXV0byBrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0ID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKTsKLQotY2xhc3MgTDJjYXBMZUxpbmtNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgU3luY0hhbmRsZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGhhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpKTsKLSAgICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgbDJjYXBfaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0gICAgdXNlcl9oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLSAgICBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8gPSBuZXcgTW9ja1BhcmFtZXRlclByb3ZpZGVyOwotICAgIEVYUEVDVF9DQUxMKCptb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8sIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dExvbmcpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXzsKLSAgICBsMmNhcF9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgbDJjYXBfaGFuZGxlcl87Ci0gICAgdXNlcl9oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgdXNlcl9oYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIG9zOjpUaHJlYWQqIHRocmVhZF8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl8gPSBudWxscHRyOwotICBvczo6SGFuZGxlciogdXNlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIE1vY2tQYXJhbWV0ZXJQcm92aWRlciogbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfID0gbnVsbHB0cjsKLX07Ci0KLVRFU1RfRihMMmNhcExlTGlua01hbmFnZXJUZXN0LCBjb25uZWN0X2ZpeGVkX2NoYW5uZWxfc2VydmljZV93aXRob3V0X2FjbCkgewotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIG1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXI7Ci0gIE1vY2tBY2xNYW5hZ2VyIG1vY2tfYWNsX21hbmFnZXI7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotCi0gIC8vIFN0ZXAgMTogVmVyaWZ5IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiB3aXRoIEhDSQotICBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3MqIGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoY2lfY2FsbGJhY2tfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIFJlZ2lzdGVyTGVDYWxsYmFja3MoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgU2F2ZUFyZzwxPigmaGNpX2NhbGxiYWNrX2hhbmRsZXIpKSk7Ci0gIExpbmtNYW5hZ2VyIGxlX2xpbmtfbWFuYWdlcigKLSAgICAgIGwyY2FwX2hhbmRsZXJfLAotICAgICAgJm1vY2tfYWNsX21hbmFnZXIsCi0gICAgICAmbW9ja19sZV9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgIG51bGxwdHIsCi0gICAgICBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8pOwotICBFWFBFQ1RfRVEoaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLCAmbGVfbGlua19tYW5hZ2VyKTsKLSAgRVhQRUNUX0VRKGhjaV9jYWxsYmFja19oYW5kbGVyLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgZmFrZSBzZXJ2aWNlcwotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZUltcGwgbW9ja19zZXJ2aWNlXzEsIG1vY2tfc2VydmljZV8yOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrU21wQnJDaWQsICZtb2NrX3NlcnZpY2VfMSk7Ci0gIHJlc3VsdHMuZW1wbGFjZV9iYWNrKGtDb25uZWN0aW9ubGVzc0NpZCwgJm1vY2tfc2VydmljZV8yKTsKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihyZXN1bHRzKSk7Ci0KLSAgLy8gU3RlcCAyOiBDb25uZWN0IHRvIGZpeGVkIGNoYW5uZWwgd2l0aG91dCBBQ0wgY29ubmVjdGlvbiBzaG91bGQgdHJpZ2dlciBBQ0wgY29ubmVjdGlvbiBwcm9jZXNzCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIENyZWF0ZUxlQ29ubmVjdGlvbihhZGRyZXNzX3dpdGhfdHlwZSwgdHJ1ZSkpLlRpbWVzKDEpOwotICBMaW5rTWFuYWdlcjo6UGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAuaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXJfLAotICAgICAgLm9uX2ZhaWxfY2FsbGJhY2tfID0gY29tbW9uOjpCaW5kT25jZShbXShGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgeyBGQUlMKCk7IH0pfTsKLSAgbGVfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhhZGRyZXNzX3dpdGhfdHlwZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0KLSAgLy8gU3RlcCAzOiBBQ0wgY29ubmVjdGlvbiBzdWNjZXNzIGV2ZW50IHNob3VsZCB0cmlnZ2VyIGNoYW5uZWwgY3JlYXRpb24gZm9yIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzCi0gIHN0ZDo6dW5pcXVlX3B0cjxNb2NrTGVBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ja0xlQWNsQ29ubmVjdGlvbj4oKTsKLSAgRVhQRUNUX0NBTEwoKmFjbF9jb25uZWN0aW9uLCBHZXRSZW1vdGVBZGRyZXNzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihhZGRyZXNzX3dpdGhfdHlwZSkpOwotICBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBjb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyID0gbnVsbHB0cjsKLSAgRVhQRUNUX0NBTEwoKmFjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZjb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzKSwgU2F2ZUFyZzwxPigmY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXIpKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWxfMSwgY2hhbm5lbF8yOwotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZV8xLCBwcm9taXNlXzI7Ci0gIGF1dG8gZnV0dXJlXzEgPSBwcm9taXNlXzEuZ2V0X2Z1dHVyZSgpOwotICBhdXRvIGZ1dHVyZV8yID0gcHJvbWlzZV8yLmdldF9mdXR1cmUoKTsKLSAgRVhQRUNUX0NBTEwobW9ja19zZXJ2aWNlXzEsIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShbJmNoYW5uZWxfMSwgJnByb21pc2VfMV0oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsXzEgPSBzdGQ6Om1vdmUoY2hhbm5lbCk7Ci0gICAgICAgIHByb21pc2VfMS5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMiwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFsmY2hhbm5lbF8yLCAmcHJvbWlzZV8yXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWxfMiA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgcHJvbWlzZV8yLnNldF92YWx1ZSgpOwotICAgICAgfSk7Ci0gIGhjaV9jYWxsYmFja19oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmhjaTo6YWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbkNhbGxiYWNrczo6T25MZUNvbm5lY3RTdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChoY2lfbGVfY29ubmVjdGlvbl9jYWxsYmFja3MpLCBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoYWNsX2Nvbm5lY3Rpb24pKSk7Ci0gIFN5bmNIYW5kbGVyKGhjaV9jYWxsYmFja19oYW5kbGVyKTsKLSAgY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOjpPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChjb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzKSwKLSAgICAgIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgMCwKLSAgICAgIDAsCi0gICAgICAwKSk7Ci0gIGF1dG8gZnV0dXJlXzFfc3RhdHVzID0gZnV0dXJlXzEud2FpdF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfMV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBhdXRvIGZ1dHVyZV8yX3N0YXR1cyA9IGZ1dHVyZV8yLndhaXRfZm9yKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpOwotICBFWFBFQ1RfRVEoZnV0dXJlXzJfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgQVNTRVJUX05FKGNoYW5uZWxfMSwgbnVsbHB0cik7Ci0gIEFTU0VSVF9ORShjaGFubmVsXzIsIG51bGxwdHIpOwotCi0gIC8vIFN0ZXAgNDogQ2FsbGluZyBDb25uZWN0U2VydmljZXMoKSB0byB0aGUgc2FtZSBkZXZpY2Ugd2lsbCBub3QgdHJpZ2dlciBhbm90aGVyIGNvbm5lY3Rpb24gYXR0ZW1wdAotICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IG15X3Jlc3VsdDsKLSAgTGlua01hbmFnZXI6OlBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uXzJ7Ci0gICAgICAuaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXJfLAotICAgICAgLm9uX2ZhaWxfY2FsbGJhY2tfID0gY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZygKLSAgICAgICAgICBbJm15X3Jlc3VsdF0oRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsgbXlfcmVzdWx0ID0gcmVzdWx0OyB9KX07Ci0gIGxlX2xpbmtfbWFuYWdlci5Db25uZWN0Rml4ZWRDaGFubmVsU2VydmljZXMoYWRkcmVzc193aXRoX3R5cGUsIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbl8yKSk7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlcl8pOwotICBFWFBFQ1RfRVEobXlfcmVzdWx0LmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUsCi0gICAgICAgICAgICBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMKTsKLQotICAvLyBTdGVwIDU6IFJlZ2lzdGVyIG5ldyBzZXJ2aWNlIHdpbGwgY2F1c2UgbmV3IGNoYW5uZWxzIHRvIGJlIGNyZWF0ZWQgZHVyaW5nIENvbm5lY3RTZXJ2aWNlcygpCi0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCBtb2NrX3NlcnZpY2VfMzsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa1NtcEJyQ2lkICsgMSwgJm1vY2tfc2VydmljZV8zKTsKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihyZXN1bHRzKSk7Ci0gIExpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbl8zewotICAgICAgLmhhbmRsZXJfID0gdXNlcl9oYW5kbGVyXywKLSAgICAgIC5vbl9mYWlsX2NhbGxiYWNrXyA9IGNvbW1vbjo6QmluZE9uY2UoW10oRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsgRkFJTCgpOyB9KX07Ci0gIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWxfMzsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2VfMzsKLSAgYXV0byBmdXR1cmVfMyA9IHByb21pc2VfMy5nZXRfZnV0dXJlKCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8zLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoWyZjaGFubmVsXzMsICZwcm9taXNlXzNdKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbF8zID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgICBwcm9taXNlXzMuc2V0X3ZhbHVlKCk7Ci0gICAgICB9KTsKLSAgbGVfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhhZGRyZXNzX3dpdGhfdHlwZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uXzMpKTsKLSAgYXV0byBmdXR1cmVfM19zdGF0dXMgPSBmdXR1cmVfMy53YWl0X2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KTsKLSAgRVhQRUNUX0VRKGZ1dHVyZV8zX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIEVYUEVDVF9ORShjaGFubmVsXzMsIG51bGxwdHIpOwotCi0gIGNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrczo6T25EaXNjb25uZWN0aW9uLAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MpLCBoY2k6OkVycm9yQ29kZTo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKSk7Ci0gIFN5bmNIYW5kbGVyKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVMaW5rTWFuYWdlclRlc3QsIGNvbm5lY3RfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX3dpdGhvdXRfYWNsX3dpdGhfbm9fc2VydmljZSkgewotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIG1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXI7Ci0gIE1vY2tBY2xNYW5hZ2VyIG1vY2tfYWNsX21hbmFnZXI7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpOwotCi0gIC8vIFN0ZXAgMTogVmVyaWZ5IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiB3aXRoIEhDSQotICBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3MqIGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoY2lfY2FsbGJhY2tfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIFJlZ2lzdGVyTGVDYWxsYmFja3MoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgU2F2ZUFyZzwxPigmaGNpX2NhbGxiYWNrX2hhbmRsZXIpKSk7Ci0gIExpbmtNYW5hZ2VyIGxlX2xpbmtfbWFuYWdlcigKLSAgICAgIGwyY2FwX2hhbmRsZXJfLAotICAgICAgJm1vY2tfYWNsX21hbmFnZXIsCi0gICAgICAmbW9ja19sZV9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgIG51bGxwdHIsCi0gICAgICBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8pOwotICBFWFBFQ1RfRVEoaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLCAmbGVfbGlua19tYW5hZ2VyKTsKLSAgRVhQRUNUX0VRKGhjaV9jYWxsYmFja19oYW5kbGVyLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gTWFrZSBzdXJlIG5vIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZAotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLCBHZXRSZWdpc3RlcmVkU2VydmljZXMoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHJlc3VsdHMpKTsKLQotICAvLyBTdGVwIDI6IENvbm5lY3QgdG8gZml4ZWQgY2hhbm5lbCB3aXRob3V0IGFueSBzZXJ2aWNlIHJlZ2lzdGVyZWQgd2lsbCByZXN1bHQgaW4gZmFpbHVyZQotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBDcmVhdGVMZUNvbm5lY3Rpb24oYWRkcmVzc193aXRoX3R5cGUsIHRydWUpKS5UaW1lcygwKTsKLSAgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCBteV9yZXN1bHQ7Ci0gIExpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnsKLSAgICAgIC5oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcl8sCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAotICAgICAgICAgIFsmbXlfcmVzdWx0XShGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgeyBteV9yZXN1bHQgPSByZXN1bHQ7IH0pfTsKLSAgbGVfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhhZGRyZXNzX3dpdGhfdHlwZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlcl8pOwotICBFWFBFQ1RfRVEobXlfcmVzdWx0LmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUsIEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHRDb2RlOjpGQUlMX05PX1NFUlZJQ0VfUkVHSVNURVJFRCk7Ci0KLX0KLQotVEVTVF9GKEwyY2FwTGVMaW5rTWFuYWdlclRlc3QsIGNvbm5lY3RfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX3dpdGhvdXRfYWNsX3dpdGhfaGNpX2ZhaWx1cmUpIHsKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCBtb2NrX2xlX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyOwotICBNb2NrQWNsTWFuYWdlciBtb2NrX2FjbF9tYW5hZ2VyOwotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSh7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLQotICAvLyBTdGVwIDE6IFZlcmlmeSBjYWxsYmFjayByZWdpc3RyYXRpb24gd2l0aCBIQ0kKLSAgaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzKiBoY2lfbGVfY29ubmVjdGlvbl9jYWxsYmFja3MgPSBudWxscHRyOwotICBvczo6SGFuZGxlciogaGNpX2NhbGxiYWNrX2hhbmRsZXIgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBSZWdpc3RlckxlQ2FsbGJhY2tzKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIFNhdmVBcmc8MT4oJmhjaV9jYWxsYmFja19oYW5kbGVyKSkpOwotICBMaW5rTWFuYWdlciBsZV9saW5rX21hbmFnZXIoCi0gICAgICBsMmNhcF9oYW5kbGVyXywKLSAgICAgICZtb2NrX2FjbF9tYW5hZ2VyLAotICAgICAgJm1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsCi0gICAgICBudWxscHRyLAotICAgICAgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfKTsKLSAgRVhQRUNUX0VRKGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcywgJmxlX2xpbmtfbWFuYWdlcik7Ci0gIEVYUEVDVF9FUShoY2lfY2FsbGJhY2tfaGFuZGxlciwgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIGZha2Ugc2VydmljZXMKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIG1vY2tfc2VydmljZV8xOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrU21wQnJDaWQsICZtb2NrX3NlcnZpY2VfMSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsIEdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4ocmVzdWx0cykpOwotCi0gIC8vIFN0ZXAgMjogQ29ubmVjdCB0byBmaXhlZCBjaGFubmVsIHdpdGhvdXQgQUNMIGNvbm5lY3Rpb24gc2hvdWxkIHRyaWdnZXIgQUNMIGNvbm5lY3Rpb24gcHJvY2VzcwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBDcmVhdGVMZUNvbm5lY3Rpb24oYWRkcmVzc193aXRoX3R5cGUsIHRydWUpKS5UaW1lcygxKTsKLSAgRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCBteV9yZXN1bHQ7Ci0gIExpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnsKLSAgICAgIC5oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcl8sCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKAotICAgICAgICAgIFsmbXlfcmVzdWx0XShGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgeyBteV9yZXN1bHQgPSByZXN1bHQ7IH0pfTsKLSAgbGVfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhhZGRyZXNzX3dpdGhfdHlwZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0KLSAgLy8gU3RlcCAzOiBBQ0wgY29ubmVjdGlvbiBmYWlsdXJlIGV2ZW50IHNob3VsZCB0cmlnZ2VyIGNvbm5lY3Rpb24gZmFpbHVyZSBjYWxsYmFjawotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMSwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKS5UaW1lcygwKTsKLSAgaGNpX2NhbGxiYWNrX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkxlQ29ubmVjdEZhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6RXJyb3JDb2RlOjpQQUdFX1RJTUVPVVQpKTsKLSAgU3luY0hhbmRsZXIoaGNpX2NhbGxiYWNrX2hhbmRsZXIpOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXJfKTsKLSAgRVhQRUNUX0VRKG15X3Jlc3VsdC5jb25uZWN0aW9uX3Jlc3VsdF9jb2RlLCBGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9IQ0lfRVJST1IpOwotICBFWFBFQ1RfRVEobXlfcmVzdWx0LmhjaV9lcnJvciwgaGNpOjpFcnJvckNvZGU6OlBBR0VfVElNRU9VVCk7Ci19Ci0KLVRFU1RfRihMMmNhcExlTGlua01hbmFnZXJUZXN0LCBub3RfYWNxdWlyaW5nX2NoYW5uZWxzX3Nob3VsZF9kaXNjb25uZWN0X2FjbF9hZnRlcl90aW1lb3V0KSB7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8sIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCkpOwotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIG1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXI7Ci0gIE1vY2tBY2xNYW5hZ2VyIG1vY2tfYWNsX21hbmFnZXI7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotCi0gIC8vIFN0ZXAgMTogVmVyaWZ5IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiB3aXRoIEhDSQotICBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3MqIGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoY2lfY2FsbGJhY2tfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIFJlZ2lzdGVyTGVDYWxsYmFja3MoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgU2F2ZUFyZzwxPigmaGNpX2NhbGxiYWNrX2hhbmRsZXIpKSk7Ci0gIExpbmtNYW5hZ2VyIGxlX2xpbmtfbWFuYWdlcigKLSAgICAgIGwyY2FwX2hhbmRsZXJfLAotICAgICAgJm1vY2tfYWNsX21hbmFnZXIsCi0gICAgICAmbW9ja19sZV9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgIG51bGxwdHIsCi0gICAgICBtb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8pOwotICBFWFBFQ1RfRVEoaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLCAmbGVfbGlua19tYW5hZ2VyKTsKLSAgRVhQRUNUX0VRKGhjaV9jYWxsYmFja19oYW5kbGVyLCBsMmNhcF9oYW5kbGVyXyk7Ci0KLSAgLy8gUmVnaXN0ZXIgZmFrZSBzZXJ2aWNlcwotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZUltcGwgbW9ja19zZXJ2aWNlXzEsIG1vY2tfc2VydmljZV8yOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2lkLCBGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCo+PiByZXN1bHRzOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrU21wQnJDaWQsICZtb2NrX3NlcnZpY2VfMSk7Ci0gIHJlc3VsdHMuZW1wbGFjZV9iYWNrKGtDb25uZWN0aW9ubGVzc0NpZCwgJm1vY2tfc2VydmljZV8yKTsKLSAgRVhQRUNUX0NBTEwobW9ja19sZV9maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlciwgR2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihyZXN1bHRzKSk7Ci0KLSAgLy8gU3RlcCAyOiBDb25uZWN0IHRvIGZpeGVkIGNoYW5uZWwgd2l0aG91dCBBQ0wgY29ubmVjdGlvbiBzaG91bGQgdHJpZ2dlciBBQ0wgY29ubmVjdGlvbiBwcm9jZXNzCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWNsX21hbmFnZXIsIENyZWF0ZUxlQ29ubmVjdGlvbihhZGRyZXNzX3dpdGhfdHlwZSwgdHJ1ZSkpLlRpbWVzKDEpOwotICBMaW5rTWFuYWdlcjo6UGVuZGluZ0ZpeGVkQ2hhbm5lbENvbm5lY3Rpb24gcGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb257Ci0gICAgICAuaGFuZGxlcl8gPSB1c2VyX2hhbmRsZXJfLAotICAgICAgLm9uX2ZhaWxfY2FsbGJhY2tfID0gY29tbW9uOjpCaW5kT25jZShbXShGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgeyBGQUlMKCk7IH0pfTsKLSAgbGVfbGlua19tYW5hZ2VyLkNvbm5lY3RGaXhlZENoYW5uZWxTZXJ2aWNlcyhhZGRyZXNzX3dpdGhfdHlwZSwgc3RkOjptb3ZlKHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uKSk7Ci0KLSAgLy8gU3RlcCAzOiBBQ0wgY29ubmVjdGlvbiBzdWNjZXNzIGV2ZW50IHNob3VsZCB0cmlnZ2VyIGNoYW5uZWwgY3JlYXRpb24gZm9yIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzCi0gIGF1dG8qIHJhd19hY2xfY29ubmVjdGlvbiA9IG5ldyBNb2NrTGVBY2xDb25uZWN0aW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxNb2NrTGVBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbihyYXdfYWNsX2Nvbm5lY3Rpb24pOwotICBFWFBFQ1RfQ0FMTCgqYWNsX2Nvbm5lY3Rpb24sIEdldFJlbW90ZUFkZHJlc3MoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGFkZHJlc3Nfd2l0aF90eXBlKSk7Ci0gIGhjaTo6YWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MqIGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MgPSBudWxscHRyOwotICBvczo6SGFuZGxlciogY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXIgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTCgqYWNsX2Nvbm5lY3Rpb24sIFJlZ2lzdGVyQ2FsbGJhY2tzKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MpLCBTYXZlQXJnPDE+KCZjb25uZWN0aW9uX21hbmFnZW1lbnRfaGFuZGxlcikpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbF8xLCBjaGFubmVsXzI7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlXzEsIHByb21pc2VfMjsKLSAgYXV0byBmdXR1cmVfMSA9IHByb21pc2VfMS5nZXRfZnV0dXJlKCk7Ci0gIGF1dG8gZnV0dXJlXzIgPSBwcm9taXNlXzIuZ2V0X2Z1dHVyZSgpOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMSwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFsmY2hhbm5lbF8xLCAmcHJvbWlzZV8xXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWxfMSA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgcHJvbWlzZV8xLnNldF92YWx1ZSgpOwotICAgICAgfSk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8yLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoWyZjaGFubmVsXzIsICZwcm9taXNlXzJdKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbF8yID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgICBwcm9taXNlXzIuc2V0X3ZhbHVlKCk7Ci0gICAgICB9KTsKLSAgaGNpX2NhbGxiYWNrX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzOjpPbkxlQ29ubmVjdFN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShhY2xfY29ubmVjdGlvbikpKTsKLSAgU3luY0hhbmRsZXIoaGNpX2NhbGxiYWNrX2hhbmRsZXIpOwotICBjb25uZWN0aW9uX21hbmFnZW1lbnRfaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJmhjaTo6YWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3M6Ok9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlLAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MpLAotICAgICAgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAwLAotICAgICAgMCwKLSAgICAgIDApKTsKLSAgYXV0byBmdXR1cmVfMV9zdGF0dXMgPSBmdXR1cmVfMS53YWl0X2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KTsKLSAgRVhQRUNUX0VRKGZ1dHVyZV8xX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIEVYUEVDVF9ORShjaGFubmVsXzEsIG51bGxwdHIpOwotICBhdXRvIGZ1dHVyZV8yX3N0YXR1cyA9IGZ1dHVyZV8yLndhaXRfZm9yKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpOwotICBFWFBFQ1RfRVEoZnV0dXJlXzJfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgRVhQRUNUX05FKGNoYW5uZWxfMiwgbnVsbHB0cik7Ci0gIGhjaTo6RXJyb3JDb2RlIHN0YXR1c18xID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGNoYW5uZWxfMS0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICB1c2VyX2hhbmRsZXJfLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgc3RhdHVzXzEgPSBzdGF0dXM7IH0pKTsKLSAgaGNpOjpFcnJvckNvZGUgc3RhdHVzXzIgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgY2hhbm5lbF8yLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlcl8sIGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBzdGF0dXNfMiA9IHN0YXR1czsgfSkpOwotCi0gIC8vIFN0ZXAgNDogTGVhdmUgY2hhbm5lbCBJRExFIGxvbmcgZW5vdWdoLCB0aGV5IHdpbGwgZGlzY29ubmVjdAotICBFWFBFQ1RfQ0FMTCgqcmF3X2FjbF9jb25uZWN0aW9uLCBEaXNjb25uZWN0KGhjaTo6RGlzY29ubmVjdFJlYXNvbjo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKSkuVGltZXMoMSk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0ICogMS4yKTsKLSAgY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOjpPbkRpc2Nvbm5lY3Rpb24sCi0gICAgICBjb21tb246OlVucmV0YWluZWQoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcyksIGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1RFUk1JTkFURURfQllfTE9DQUxfSE9TVCkpOwotICBTeW5jSGFuZGxlcihjb25uZWN0aW9uX21hbmFnZW1lbnRfaGFuZGxlcik7Ci0KLSAgLy8gU3RlcCA1OiBMaW5rIGRpc2Nvbm5lY3Qgd2lsbCB0cmlnZ2VyIGFsbCBjYWxsYmFja3MKLSAgU3luY0hhbmRsZXIodXNlcl9oYW5kbGVyXyk7Ci0gIEVYUEVDVF9FUShoY2k6OkVycm9yQ29kZTo6Q09OTkVDVElPTl9URVJNSU5BVEVEX0JZX0xPQ0FMX0hPU1QsIHN0YXR1c18xKTsKLSAgRVhQRUNUX0VRKGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1RFUk1JTkFURURfQllfTE9DQUxfSE9TVCwgc3RhdHVzXzIpOwotfQotCi1URVNUX0YoTDJjYXBMZUxpbmtNYW5hZ2VyVGVzdCwgYWNxdWlyaW5nX2NoYW5uZWxzX3Nob3VsZF9ub3RfZGlzY29ubmVjdF9hY2xfYWZ0ZXJfdGltZW91dCkgewotICBFWFBFQ1RfQ0FMTCgqbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfLCBHZXRMZUxpbmtJZGxlRGlzY29ubmVjdFRpbWVvdXQpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpKTsKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VNYW5hZ2VySW1wbCBtb2NrX2xlX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyOwotICBNb2NrQWNsTWFuYWdlciBtb2NrX2FjbF9tYW5hZ2VyOwotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSh7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLQotICAvLyBTdGVwIDE6IFZlcmlmeSBjYWxsYmFjayByZWdpc3RyYXRpb24gd2l0aCBIQ0kKLSAgaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uQ2FsbGJhY2tzKiBoY2lfbGVfY29ubmVjdGlvbl9jYWxsYmFja3MgPSBudWxscHRyOwotICBvczo6SGFuZGxlciogaGNpX2NhbGxiYWNrX2hhbmRsZXIgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBSZWdpc3RlckxlQ2FsbGJhY2tzKF8sIF8pKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8MD4oJmhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcyksIFNhdmVBcmc8MT4oJmhjaV9jYWxsYmFja19oYW5kbGVyKSkpOwotICBMaW5rTWFuYWdlciBsZV9saW5rX21hbmFnZXIoCi0gICAgICBsMmNhcF9oYW5kbGVyXywKLSAgICAgICZtb2NrX2FjbF9tYW5hZ2VyLAotICAgICAgJm1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsCi0gICAgICBudWxscHRyLAotICAgICAgbW9ja19wYXJhbWV0ZXJfcHJvdmlkZXJfKTsKLSAgRVhQRUNUX0VRKGhjaV9sZV9jb25uZWN0aW9uX2NhbGxiYWNrcywgJmxlX2xpbmtfbWFuYWdlcik7Ci0gIEVYUEVDVF9FUShoY2lfY2FsbGJhY2tfaGFuZGxlciwgbDJjYXBfaGFuZGxlcl8pOwotCi0gIC8vIFJlZ2lzdGVyIGZha2Ugc2VydmljZXMKLSAgTW9ja0ZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsIG1vY2tfc2VydmljZV8xLCBtb2NrX3NlcnZpY2VfMjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENpZCwgRml4ZWRDaGFubmVsU2VydmljZUltcGwqPj4gcmVzdWx0czsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa1NtcEJyQ2lkLCAmbW9ja19zZXJ2aWNlXzEpOwotICByZXN1bHRzLmVtcGxhY2VfYmFjayhrQ29ubmVjdGlvbmxlc3NDaWQsICZtb2NrX3NlcnZpY2VfMik7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXIsIEdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4ocmVzdWx0cykpOwotCi0gIC8vIFN0ZXAgMjogQ29ubmVjdCB0byBmaXhlZCBjaGFubmVsIHdpdGhvdXQgQUNMIGNvbm5lY3Rpb24gc2hvdWxkIHRyaWdnZXIgQUNMIGNvbm5lY3Rpb24gcHJvY2VzcwotICBFWFBFQ1RfQ0FMTChtb2NrX2FjbF9tYW5hZ2VyLCBDcmVhdGVMZUNvbm5lY3Rpb24oYWRkcmVzc193aXRoX3R5cGUsIHRydWUpKS5UaW1lcygxKTsKLSAgTGlua01hbmFnZXI6OlBlbmRpbmdGaXhlZENoYW5uZWxDb25uZWN0aW9uIHBlbmRpbmdfZml4ZWRfY2hhbm5lbF9jb25uZWN0aW9uewotICAgICAgLmhhbmRsZXJfID0gdXNlcl9oYW5kbGVyXywKLSAgICAgIC5vbl9mYWlsX2NhbGxiYWNrXyA9IGNvbW1vbjo6QmluZE9uY2UoW10oRml4ZWRDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsgRkFJTCgpOyB9KX07Ci0gIGxlX2xpbmtfbWFuYWdlci5Db25uZWN0Rml4ZWRDaGFubmVsU2VydmljZXMoYWRkcmVzc193aXRoX3R5cGUsIHN0ZDo6bW92ZShwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbikpOwotCi0gIC8vIFN0ZXAgMzogQUNMIGNvbm5lY3Rpb24gc3VjY2VzcyBldmVudCBzaG91bGQgdHJpZ2dlciBjaGFubmVsIGNyZWF0aW9uIGZvciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcwotICBhdXRvKiByYXdfYWNsX2Nvbm5lY3Rpb24gPSBuZXcgTW9ja0xlQWNsQ29ubmVjdGlvbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0xlQWNsQ29ubmVjdGlvbj4gYWNsX2Nvbm5lY3Rpb24ocmF3X2FjbF9jb25uZWN0aW9uKTsKLSAgRVhQRUNUX0NBTEwoKmFjbF9jb25uZWN0aW9uLCBHZXRSZW1vdGVBZGRyZXNzKCkpLldpbGxSZXBlYXRlZGx5KFJldHVybihhZGRyZXNzX3dpdGhfdHlwZSkpOwotICBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBjb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyID0gbnVsbHB0cjsKLSAgRVhQRUNUX0NBTEwoKmFjbF9jb25uZWN0aW9uLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZjb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzKSwgU2F2ZUFyZzwxPigmY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXIpKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWxfMSwgY2hhbm5lbF8yOwotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZV8xLCBwcm9taXNlXzI7Ci0gIGF1dG8gZnV0dXJlXzEgPSBwcm9taXNlXzEuZ2V0X2Z1dHVyZSgpOwotICBhdXRvIGZ1dHVyZV8yID0gcHJvbWlzZV8yLmdldF9mdXR1cmUoKTsKLSAgRVhQRUNUX0NBTEwobW9ja19zZXJ2aWNlXzEsIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShbJmNoYW5uZWxfMSwgJnByb21pc2VfMV0oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsXzEgPSBzdGQ6Om1vdmUoY2hhbm5lbCk7Ci0gICAgICAgIHByb21pc2VfMS5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotICBFWFBFQ1RfQ0FMTChtb2NrX3NlcnZpY2VfMiwgTm90aWZ5Q2hhbm5lbENyZWF0aW9uKF8pKQotICAgICAgLldpbGxPbmNlKFsmY2hhbm5lbF8yLCAmcHJvbWlzZV8yXShzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgICAgIGNoYW5uZWxfMiA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgICAgICAgcHJvbWlzZV8yLnNldF92YWx1ZSgpOwotICAgICAgfSk7Ci0gIGhjaV9jYWxsYmFja19oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmhjaTo6YWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbkNhbGxiYWNrczo6T25MZUNvbm5lY3RTdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChoY2lfbGVfY29ubmVjdGlvbl9jYWxsYmFja3MpLCBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoYWNsX2Nvbm5lY3Rpb24pKSk7Ci0gIFN5bmNIYW5kbGVyKGhjaV9jYWxsYmFja19oYW5kbGVyKTsKLSAgY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOjpPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25Db21wbGV0ZSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChjb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzKSwKLSAgICAgIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgMCwKLSAgICAgIDAsCi0gICAgICAwKSk7Ci0gIGF1dG8gZnV0dXJlXzFfc3RhdHVzID0gZnV0dXJlXzEud2FpdF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfMV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBFWFBFQ1RfTkUoY2hhbm5lbF8xLCBudWxscHRyKTsKLSAgYXV0byBmdXR1cmVfMl9zdGF0dXMgPSBmdXR1cmVfMi53YWl0X2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0KTsKLSAgRVhQRUNUX0VRKGZ1dHVyZV8yX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gIEVYUEVDVF9ORShjaGFubmVsXzIsIG51bGxwdHIpOwotICBoY2k6OkVycm9yQ29kZSBzdGF0dXNfMSA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBjaGFubmVsXzEtPlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyXywgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IHN0YXR1c18xID0gc3RhdHVzOyB9KSk7Ci0gIGhjaTo6RXJyb3JDb2RlIHN0YXR1c18yID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGNoYW5uZWxfMi0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICB1c2VyX2hhbmRsZXJfLCBjb21tb246OnRlc3Rpbmc6OkJpbmRMYW1iZGFGb3JUZXN0aW5nKFsmXShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsgc3RhdHVzXzIgPSBzdGF0dXM7IH0pKTsKLQotICBjaGFubmVsXzEtPkFjcXVpcmUoKTsKLQotICAvLyBTdGVwIDQ6IGF2ZSBjaGFubmVsIElETEUsIGl0IHdvbid0IGRpc2Nvbm5lY3QgdG8gZHVlIGFjcXVpcmVkIGNoYW5uZWwgMQotICBFWFBFQ1RfQ0FMTCgqcmF3X2FjbF9jb25uZWN0aW9uLCBEaXNjb25uZWN0KGhjaTo6RGlzY29ubmVjdFJlYXNvbjo6UkVNT1RFX1VTRVJfVEVSTUlOQVRFRF9DT05ORUNUSU9OKSkuVGltZXMoMCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrVGVzdElkbGVEaXNjb25uZWN0VGltZW91dFNob3J0ICogMik7Ci0KLSAgLy8gU3RlcCA1OiBMaW5rIGRpc2Nvbm5lY3Qgd2lsbCB0cmlnZ2VyIGFsbCBjYWxsYmFja3MKLSAgY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzOjpPbkRpc2Nvbm5lY3Rpb24sCi0gICAgICBjb21tb246OlVucmV0YWluZWQoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcyksIGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1RFUk1JTkFURURfQllfTE9DQUxfSE9TVCkpOwotICBTeW5jSGFuZGxlcihjb25uZWN0aW9uX21hbmFnZW1lbnRfaGFuZGxlcik7Ci0gIFN5bmNIYW5kbGVyKHVzZXJfaGFuZGxlcl8pOwotICBFWFBFQ1RfRVEoaGNpOjpFcnJvckNvZGU6OkNPTk5FQ1RJT05fVEVSTUlOQVRFRF9CWV9MT0NBTF9IT1NULCBzdGF0dXNfMSk7Ci0gIEVYUEVDVF9FUShoY2k6OkVycm9yQ29kZTo6Q09OTkVDVElPTl9URVJNSU5BVEVEX0JZX0xPQ0FMX0hPU1QsIHN0YXR1c18yKTsKLX0KLQotVEVTVF9GKEwyY2FwTGVMaW5rTWFuYWdlclRlc3QsIGFjcXVpcmluZ19hbmRfcmVsZWFzaW5nX2NoYW5uZWxzX3Nob3VsZF9ldmVudHVhbGx5X2Rpc2Nvbm5lY3RfYWNsKSB7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX3BhcmFtZXRlcl9wcm92aWRlcl8sIEdldExlTGlua0lkbGVEaXNjb25uZWN0VGltZW91dCkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCkpOwotICBNb2NrRml4ZWRDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsIG1vY2tfbGVfZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXI7Ci0gIE1vY2tBY2xNYW5hZ2VyIG1vY2tfYWNsX21hbmFnZXI7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlKHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTUyk7Ci0KLSAgLy8gU3RlcCAxOiBWZXJpZnkgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHdpdGggSENJCi0gIGhjaTo6YWNsX21hbmFnZXI6OkxlQ29ubmVjdGlvbkNhbGxiYWNrcyogaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGhjaV9jYWxsYmFja19oYW5kbGVyID0gbnVsbHB0cjsKLSAgRVhQRUNUX0NBTEwobW9ja19hY2xfbWFuYWdlciwgUmVnaXN0ZXJMZUNhbGxiYWNrcyhfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZoY2lfbGVfY29ubmVjdGlvbl9jYWxsYmFja3MpLCBTYXZlQXJnPDE+KCZoY2lfY2FsbGJhY2tfaGFuZGxlcikpKTsKLSAgTGlua01hbmFnZXIgbGVfbGlua19tYW5hZ2VyKAotICAgICAgbDJjYXBfaGFuZGxlcl8sCi0gICAgICAmbW9ja19hY2xfbWFuYWdlciwKLSAgICAgICZtb2NrX2xlX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLAotICAgICAgbnVsbHB0ciwKLSAgICAgIG1vY2tfcGFyYW1ldGVyX3Byb3ZpZGVyXyk7Ci0gIEVYUEVDVF9FUShoY2lfbGVfY29ubmVjdGlvbl9jYWxsYmFja3MsICZsZV9saW5rX21hbmFnZXIpOwotICBFWFBFQ1RfRVEoaGNpX2NhbGxiYWNrX2hhbmRsZXIsIGwyY2FwX2hhbmRsZXJfKTsKLQotICAvLyBSZWdpc3RlciBmYWtlIHNlcnZpY2VzCi0gIE1vY2tGaXhlZENoYW5uZWxTZXJ2aWNlSW1wbCBtb2NrX3NlcnZpY2VfMSwgbW9ja19zZXJ2aWNlXzI7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaWQsIEZpeGVkQ2hhbm5lbFNlcnZpY2VJbXBsKj4+IHJlc3VsdHM7Ci0gIHJlc3VsdHMuZW1wbGFjZV9iYWNrKGtTbXBCckNpZCwgJm1vY2tfc2VydmljZV8xKTsKLSAgcmVzdWx0cy5lbXBsYWNlX2JhY2soa0Nvbm5lY3Rpb25sZXNzQ2lkLCAmbW9ja19zZXJ2aWNlXzIpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2xlX2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyLCBHZXRSZWdpc3RlcmVkU2VydmljZXMoKSkuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHJlc3VsdHMpKTsKLQotICAvLyBTdGVwIDI6IENvbm5lY3QgdG8gZml4ZWQgY2hhbm5lbCB3aXRob3V0IEFDTCBjb25uZWN0aW9uIHNob3VsZCB0cmlnZ2VyIEFDTCBjb25uZWN0aW9uIHByb2Nlc3MKLSAgRVhQRUNUX0NBTEwobW9ja19hY2xfbWFuYWdlciwgQ3JlYXRlTGVDb25uZWN0aW9uKGFkZHJlc3Nfd2l0aF90eXBlLCB0cnVlKSkuVGltZXMoMSk7Ci0gIExpbmtNYW5hZ2VyOjpQZW5kaW5nRml4ZWRDaGFubmVsQ29ubmVjdGlvbiBwZW5kaW5nX2ZpeGVkX2NoYW5uZWxfY29ubmVjdGlvbnsKLSAgICAgIC5oYW5kbGVyXyA9IHVzZXJfaGFuZGxlcl8sCi0gICAgICAub25fZmFpbF9jYWxsYmFja18gPSBjb21tb246OkJpbmRPbmNlKFtdKEZpeGVkQ2hhbm5lbE1hbmFnZXI6OkNvbm5lY3Rpb25SZXN1bHQgcmVzdWx0KSB7IEZBSUwoKTsgfSl9OwotICBsZV9saW5rX21hbmFnZXIuQ29ubmVjdEZpeGVkQ2hhbm5lbFNlcnZpY2VzKGFkZHJlc3Nfd2l0aF90eXBlLCBzdGQ6Om1vdmUocGVuZGluZ19maXhlZF9jaGFubmVsX2Nvbm5lY3Rpb24pKTsKLQotICAvLyBTdGVwIDM6IEFDTCBjb25uZWN0aW9uIHN1Y2Nlc3MgZXZlbnQgc2hvdWxkIHRyaWdnZXIgY2hhbm5lbCBjcmVhdGlvbiBmb3IgYWxsIHJlZ2lzdGVyZWQgc2VydmljZXMKLSAgYXV0byogcmF3X2FjbF9jb25uZWN0aW9uID0gbmV3IE1vY2tMZUFjbENvbm5lY3Rpb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPE1vY2tMZUFjbENvbm5lY3Rpb24+IGFjbF9jb25uZWN0aW9uKHJhd19hY2xfY29ubmVjdGlvbik7Ci0gIEVYUEVDVF9DQUxMKCphY2xfY29ubmVjdGlvbiwgR2V0UmVtb3RlQWRkcmVzcygpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oYWRkcmVzc193aXRoX3R5cGUpKTsKLSAgaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBjb25uZWN0aW9uX21hbmFnZW1lbnRfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9DQUxMKCphY2xfY29ubmVjdGlvbiwgUmVnaXN0ZXJDYWxsYmFja3MoXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwwPigmY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcyksIFNhdmVBcmc8MT4oJmNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyKSkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsPiBjaGFubmVsXzEsIGNoYW5uZWxfMjsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2VfMSwgcHJvbWlzZV8yOwotICBhdXRvIGZ1dHVyZV8xID0gcHJvbWlzZV8xLmdldF9mdXR1cmUoKTsKLSAgYXV0byBmdXR1cmVfMiA9IHByb21pc2VfMi5nZXRfZnV0dXJlKCk7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfc2VydmljZV8xLCBOb3RpZnlDaGFubmVsQ3JlYXRpb24oXykpCi0gICAgICAuV2lsbE9uY2UoWyZjaGFubmVsXzEsICZwcm9taXNlXzFdKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICAgICAgY2hhbm5lbF8xID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotICAgICAgICBwcm9taXNlXzEuc2V0X3ZhbHVlKCk7Ci0gICAgICB9KTsKLSAgRVhQRUNUX0NBTEwobW9ja19zZXJ2aWNlXzIsIE5vdGlmeUNoYW5uZWxDcmVhdGlvbihfKSkKLSAgICAgIC5XaWxsT25jZShbJmNoYW5uZWxfMiwgJnByb21pc2VfMl0oc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgICAgICBjaGFubmVsXzIgPSBzdGQ6Om1vdmUoY2hhbm5lbCk7Ci0gICAgICAgIHByb21pc2VfMi5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotICBoY2lfY2FsbGJhY2tfaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3M6Ok9uTGVDb25uZWN0U3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQoaGNpX2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKSwgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGFjbF9jb25uZWN0aW9uKSkpOwotICBTeW5jSGFuZGxlcihoY2lfY2FsbGJhY2tfaGFuZGxlcik7Ci0gIGNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrczo6T25SZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGUsCi0gICAgICBjb21tb246OlVucmV0YWluZWQoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcyksCi0gICAgICBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgIDAsCi0gICAgICAwLAotICAgICAgMCkpOwotICBhdXRvIGZ1dHVyZV8xX3N0YXR1cyA9IGZ1dHVyZV8xLndhaXRfZm9yKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQpOwotICBFWFBFQ1RfRVEoZnV0dXJlXzFfc3RhdHVzLCBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KTsKLSAgRVhQRUNUX05FKGNoYW5uZWxfMSwgbnVsbHB0cik7Ci0gIGF1dG8gZnV0dXJlXzJfc3RhdHVzID0gZnV0dXJlXzIud2FpdF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCk7Ci0gIEVYUEVDVF9FUShmdXR1cmVfMl9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICBFWFBFQ1RfTkUoY2hhbm5lbF8yLCBudWxscHRyKTsKLSAgaGNpOjpFcnJvckNvZGUgc3RhdHVzXzEgPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgY2hhbm5lbF8xLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHVzZXJfaGFuZGxlcl8sIGNvbW1vbjo6dGVzdGluZzo6QmluZExhbWJkYUZvclRlc3RpbmcoWyZdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBzdGF0dXNfMSA9IHN0YXR1czsgfSkpOwotICBoY2k6OkVycm9yQ29kZSBzdGF0dXNfMiA9IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTOwotICBjaGFubmVsXzItPlJlZ2lzdGVyT25DbG9zZUNhbGxiYWNrKAotICAgICAgdXNlcl9oYW5kbGVyXywgY29tbW9uOjp0ZXN0aW5nOjpCaW5kTGFtYmRhRm9yVGVzdGluZyhbJl0oaGNpOjpFcnJvckNvZGUgc3RhdHVzKSB7IHN0YXR1c18yID0gc3RhdHVzOyB9KSk7Ci0KLSAgY2hhbm5lbF8xLT5BY3F1aXJlKCk7Ci0KLSAgLy8gU3RlcCA0OiBhdmUgY2hhbm5lbCBJRExFLCBpdCB3b24ndCBkaXNjb25uZWN0IHRvIGR1ZSBhY3F1aXJlZCBjaGFubmVsIDEKLSAgRVhQRUNUX0NBTEwoKnJhd19hY2xfY29ubmVjdGlvbiwgRGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb246OlJFTU9URV9VU0VSX1RFUk1JTkFURURfQ09OTkVDVElPTikpLlRpbWVzKDApOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa1Rlc3RJZGxlRGlzY29ubmVjdFRpbWVvdXRTaG9ydCAqIDIpOwotCi0gIC8vIFN0ZXAgNTogYXZlIGNoYW5uZWwgSURMRSBsb25nIGVub3VnaCwgdGhleSB3aWxsIGRpc2Nvbm5lY3QKLSAgY2hhbm5lbF8xLT5SZWxlYXNlKCk7Ci0gIEVYUEVDVF9DQUxMKCpyYXdfYWNsX2Nvbm5lY3Rpb24sIERpc2Nvbm5lY3QoaGNpOjpEaXNjb25uZWN0UmVhc29uOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT04pKS5UaW1lcygxKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGtUZXN0SWRsZURpc2Nvbm5lY3RUaW1lb3V0U2hvcnQgKiAxLjIpOwotCi0gIC8vIFN0ZXAgNjogTGluayBkaXNjb25uZWN0IHdpbGwgdHJpZ2dlciBhbGwgY2FsbGJhY2tzCi0gIGNvbm5lY3Rpb25fbWFuYWdlbWVudF9oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrczo6T25EaXNjb25uZWN0aW9uLAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGNvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MpLCBoY2k6OkVycm9yQ29kZTo6Q09OTkVDVElPTl9URVJNSU5BVEVEX0JZX0xPQ0FMX0hPU1QpKTsKLSAgU3luY0hhbmRsZXIoY29ubmVjdGlvbl9tYW5hZ2VtZW50X2hhbmRsZXIpOwotICBTeW5jSGFuZGxlcih1c2VyX2hhbmRsZXJfKTsKLSAgRVhQRUNUX0VRKGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1RFUk1JTkFURURfQllfTE9DQUxfSE9TVCwgc3RhdHVzXzEpOwotICBFWFBFQ1RfRVEoaGNpOjpFcnJvckNvZGU6OkNPTk5FQ1RJT05fVEVSTUlOQVRFRF9CWV9MT0NBTF9IT1NULCBzdGF0dXNfMik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvbGlua19tb2NrLmggYi9nZC9sMmNhcC9sZS9pbnRlcm5hbC9saW5rX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNzRkZC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9saW5rX21vY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlcl9tb2NrLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAibDJjYXAvaW50ZXJuYWwvc2NoZWR1bGVyX21vY2suaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGhjaTo6dGVzdGluZzo6TW9ja0xlQWNsQ29ubmVjdGlvbjsKLQotY2xhc3MgTW9ja0xpbmsgOiBwdWJsaWMgTGluayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNb2NrTGluayhvczo6SGFuZGxlciogaGFuZGxlciwgbDJjYXA6OmludGVybmFsOjpQYXJhbWV0ZXJQcm92aWRlciogcGFyYW1ldGVyX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0xlQWNsQ29ubmVjdGlvbj4gbW9ja19hY2xfY29ubmVjdGlvbiwgTGlua01hbmFnZXIqIGxpbmtfbWFuYWdlcikKLSAgICAgIDogTGluayhoYW5kbGVyLCBzdGQ6Om1vdmUobW9ja19hY2xfY29ubmVjdGlvbiksIHBhcmFtZXRlcl9wcm92aWRlciwgbnVsbHB0ciwgbnVsbHB0ciwgbGlua19tYW5hZ2VyKSB7fQotCi0gIE1PQ0tfTUVUSE9EKGhjaTo6QWRkcmVzc1dpdGhUeXBlLCBHZXREZXZpY2UsICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKGhjaTo6Um9sZSwgR2V0Um9sZSwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBPbkFjbERpc2Nvbm5lY3RlZCwgKGhjaTo6RXJyb3JDb2RlIHN0YXR1cyksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBEaXNjb25uZWN0LCAoKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHN0ZDo6c2hhcmVkX3B0cjxGaXhlZENoYW5uZWxJbXBsPiwgQWxsb2NhdGVGaXhlZENoYW5uZWwsIChDaWQgY2lkLCBTZWN1cml0eVBvbGljeSBzZWN1cml0eV9wb2xpY3kpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgTU9DS19NRVRIT0QoYm9vbCwgSXNGaXhlZENoYW5uZWxBbGxvY2F0ZWQsIChDaWQgY2lkKSwgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlZnJlc2hSZWZDb3VudCwgKCksIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5jYyBiL2dkL2wyY2FwL2xlL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0ZjkwMC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9pbnRlcm5hbC9zaWduYWxsaW5nX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5oIgotCi0jaW5jbHVkZSA8Y2hyb25vPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9kYXRhX3BpcGVsaW5lX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9pbnRlcm5hbC9keW5hbWljX2NoYW5uZWxfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2xlX2NyZWRpdF9iYXNlZF9jaGFubmVsX2RhdGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY2FwL2wyY2FwX3BhY2tldHMuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdGF0aWMgY29uc3RleHByIGF1dG8ga1RpbWVvdXQgPSBzdGQ6OmNocm9ubzo6c2Vjb25kcygzKTsKLQotTGVTaWduYWxsaW5nTWFuYWdlcjo6TGVTaWduYWxsaW5nTWFuYWdlcihvczo6SGFuZGxlciogaGFuZGxlciwgTGluayogbGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXA6OmludGVybmFsOjpEYXRhUGlwZWxpbmVNYW5hZ2VyKiBkYXRhX3BpcGVsaW5lX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNDaGFubmVsU2VydmljZU1hbmFnZXJJbXBsKiBkeW5hbWljX3NlcnZpY2VfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEFsbG9jYXRvciogY2hhbm5lbF9hbGxvY2F0b3IpCi0gICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgbGlua18obGluayksIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8oZGF0YV9waXBlbGluZV9tYW5hZ2VyKSwKLSAgICAgIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXyhkeW5hbWljX3NlcnZpY2VfbWFuYWdlciksIGNoYW5uZWxfYWxsb2NhdG9yXyhjaGFubmVsX2FsbG9jYXRvciksIGFsYXJtXyhoYW5kbGVyKSB7Ci0gIEFTU0VSVChoYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgQVNTRVJUKGxpbmtfICE9IG51bGxwdHIpOwotICBzaWduYWxsaW5nX2NoYW5uZWxfID0KLSAgICAgIGxpbmtfLT5BbGxvY2F0ZUZpeGVkQ2hhbm5lbChrTGVTaWduYWxsaW5nQ2lkLCBTZWN1cml0eVBvbGljeTo6Tk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LKTsKLSAgc2lnbmFsbGluZ19jaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICBoYW5kbGVyXywgY29tbW9uOjpCaW5kKCZMZVNpZ25hbGxpbmdNYW5hZ2VyOjpvbl9pbmNvbWluZ19wYWNrZXQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBlbnF1ZXVlX2J1ZmZlcl8gPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxvczo6RW5xdWV1ZUJ1ZmZlcjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4oc2lnbmFsbGluZ19jaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpKTsKLX0KLQotTGVTaWduYWxsaW5nTWFuYWdlcjo6fkxlU2lnbmFsbGluZ01hbmFnZXIoKSB7Ci0gIGVucXVldWVfYnVmZmVyXy5yZXNldCgpOwotICBzaWduYWxsaW5nX2NoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gIHNpZ25hbGxpbmdfY2hhbm5lbF8gPSBudWxscHRyOwotfQotCi12b2lkIExlU2lnbmFsbGluZ01hbmFnZXI6OlNlbmRDb25uZWN0aW9uUmVxdWVzdChQc20gcHNtLCBDaWQgbG9jYWxfY2lkLCBNdHUgbXR1KSB7Ci0gIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgpLT5FbmZvcmNlKAotICAgICAgbGlua18tPkdldERldmljZSgpLAotICAgICAgZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZXJ2aWNlKHBzbSktPkdldFNlY3VyaXR5UG9saWN5KCksCi0gICAgICBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmTGVTaWduYWxsaW5nTWFuYWdlcjo6b25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9vdXRnb2luZywgcHNtLCBsb2NhbF9jaWQsIG10dSkpOwotfQotCi12b2lkIExlU2lnbmFsbGluZ01hbmFnZXI6Om9uX3NlY3VyaXR5X3Jlc3VsdF9mb3Jfb3V0Z29pbmcoUHNtIHBzbSwgQ2lkIGxvY2FsX2NpZCwgTXR1IG10dSwgYm9vbCByZXN1bHQpIHsKLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBMT0dfV0FSTigiU2VjdXJpdHkgcmVxdWlyZW1lbnQgY2FuJ3QgYmUgc2F0aXNmaWVkLiBEcm9wcGluZyBjb25uZWN0aW9uIHJlcXVlc3QiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBQZW5kaW5nQ29tbWFuZCBwZW5kaW5nX2NvbW1hbmQgPSBQZW5kaW5nQ29tbWFuZDo6Q3JlZGl0QmFzZWRDb25uZWN0aW9uUmVxdWVzdCgKLSAgICAgIG5leHRfc2lnbmFsX2lkXywgcHNtLCBsb2NhbF9jaWQsIG10dSwgbGlua18tPkdldE1wcygpLCBsaW5rXy0+R2V0SW5pdGlhbENyZWRpdCgpKTsKLSAgbmV4dF9zaWduYWxfaWRfKys7Ci0gIHBlbmRpbmdfY29tbWFuZHNfLnB1c2gocGVuZGluZ19jb21tYW5kKTsKLSAgaWYgKHBlbmRpbmdfY29tbWFuZHNfLnNpemUoKSA9PSAxKSB7Ci0gICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gIH0KLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpTZW5kRGlzY29ubmVjdFJlcXVlc3QoQ2lkIHNjaWQsIENpZCBkY2lkKSB7Ci0gIFBlbmRpbmdDb21tYW5kIHBlbmRpbmdfY29tbWFuZCA9IFBlbmRpbmdDb21tYW5kOjpEaXNjb25uZWN0aW9uUmVxdWVzdChuZXh0X3NpZ25hbF9pZF8sIHNjaWQsIGRjaWQpOwotICBuZXh0X3NpZ25hbF9pZF8rKzsKLSAgcGVuZGluZ19jb21tYW5kc18ucHVzaChwZW5kaW5nX2NvbW1hbmQpOwotICBpZiAocGVuZGluZ19jb21tYW5kc18uc2l6ZSgpID09IDEpIHsKLSAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgfQotfQotCi12b2lkIExlU2lnbmFsbGluZ01hbmFnZXI6OlNlbmRDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVxdWVzdCgKLSAgICB1aW50MTZfdCBpbnRlcnZhbF9taW4sIHVpbnQxNl90IGludGVydmFsX21heCwgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0X211bHRpcGxpZXIpIHsKLSAgUGVuZGluZ0NvbW1hbmQgcGVuZGluZ19jb21tYW5kID0gUGVuZGluZ0NvbW1hbmQ6OkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGUoCi0gICAgICBuZXh0X3NpZ25hbF9pZF8sIGludGVydmFsX21pbiwgaW50ZXJ2YWxfbWF4LCBwZXJpcGhlcmFsX2xhdGVuY3ksIHRpbWVvdXRfbXVsdGlwbGllcik7Ci0gIG5leHRfc2lnbmFsX2lkXysrOwotICBwZW5kaW5nX2NvbW1hbmRzXy5wdXNoKHBlbmRpbmdfY29tbWFuZCk7Ci0gIGlmIChwZW5kaW5nX2NvbW1hbmRzXy5zaXplKCkgPT0gMSkgewotICAgIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICB9Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6U2VuZENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZShTaWduYWxJZCBzaWduYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlUmVzdWx0IHJlc3VsdCkgewotICBhdXRvIGJ1aWxkZXIgPSBDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoc2lnbmFsX2lkLlZhbHVlKCksIHJlc3VsdCk7Ci0gIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGhhbmRsZXJfKTsKLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpTZW5kQ3JlZGl0KENpZCBsb2NhbF9jaWQsIHVpbnQxNl90IGNyZWRpdHMpIHsKLSAgYXV0byBidWlsZGVyID0gTGVGbG93Q29udHJvbENyZWRpdEJ1aWxkZXI6OkNyZWF0ZShuZXh0X3NpZ25hbF9pZF8uVmFsdWUoKSwgbG9jYWxfY2lkLCBjcmVkaXRzKTsKLSAgbmV4dF9zaWduYWxfaWRfKys7Ci0gIGVucXVldWVfYnVmZmVyXy0+RW5xdWV1ZShzdGQ6Om1vdmUoYnVpbGRlciksIGhhbmRsZXJfKTsKLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpTZW5kRW5oYW5jZWRDb25uZWN0aW9uUmVxdWVzdChQc20gcHNtLCBzdGQ6OnZlY3RvcjxDaWQ+IGxvY2FsX2NpZCwgTXR1IG10dSkge30KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpTZW5kRW5oYW5jZWRSZWNvbmZpZ3VyZVJlcXVlc3Qoc3RkOjp2ZWN0b3I8Q2lkPiBsb2NhbF9jaWQsIE10dSBtdHUpIHt9Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6Q2FuY2VsQWxhcm0oKSB7Ci0gIGFsYXJtXy5DYW5jZWwoKTsKLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpPbkNvbW1hbmRSZWplY3QoTGVDb21tYW5kUmVqZWN0VmlldyBjb21tYW5kX3JlamVjdF92aWV3KSB7Ci0gIGF1dG8gc2lnbmFsX2lkID0gY29tbWFuZF9yZWplY3Rfdmlldy5HZXRJZGVudGlmaWVyKCk7Ci0gIGlmIChzaWduYWxfaWQgIT0gY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8pIHsKLSAgICBMT0dfV0FSTigiVW5leHBlY3RlZCByZXNwb25zZTogbm8gcGVuZGluZyByZXF1ZXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFsYXJtXy5DYW5jZWwoKTsKLSAgaWYgKGNvbW1hbmRfanVzdF9zZW50Xy5jb21tYW5kX2NvZGVfID09IExlQ29tbWFuZENvZGU6OkxFX0NSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgICBsaW5rXy0+T25PdXRnb2luZ0Nvbm5lY3Rpb25SZXF1ZXN0RmFpbChjb21tYW5kX2p1c3Rfc2VudF8uc291cmNlX2NpZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdDo6Tk9fUkVTT1VSQ0VTX0FWQUlMQUJMRSk7Ci0gIH0KLSAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0KLSAgTE9HX1dBUk4oIkNvbW1hbmQgcmVqZWN0ZWQiKTsKLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpPbkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0KAotICAgIFNpZ25hbElkIHNpZ25hbF9pZCwKLSAgICB1aW50MTZfdCBpbnRlcnZhbF9taW4sCi0gICAgdWludDE2X3QgaW50ZXJ2YWxfbWF4LAotICAgIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICB1aW50MTZfdCB0aW1lb3V0X211bHRpcGxpZXIpIHsKLSAgaWYgKGxpbmtfLT5HZXRSb2xlKCkgPT0gaGNpOjpSb2xlOjpQRVJJUEhFUkFMKSB7Ci0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIHJlcXVlc3QgZnJvbSBMTCBjZW50cmFsIik7Ci0gICAgYXV0byBidWlsZGVyID0gTGVDb21tYW5kUmVqZWN0Tm90VW5kZXJzdG9vZEJ1aWxkZXI6OkNyZWF0ZShzaWduYWxfaWQuVmFsdWUoKSk7Ci0gICAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghbGlua18tPkNoZWNrQ29ubmVjdGlvblBhcmFtZXRlcnMoaW50ZXJ2YWxfbWluLCBpbnRlcnZhbF9tYXgsIHBlcmlwaGVyYWxfbGF0ZW5jeSwgdGltZW91dF9tdWx0aXBsaWVyKSkgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBpbnZhbGlkIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHVwZGF0ZSByZXF1ZXN0IGZyb20gTEwgY2VudHJhbCIpOwotICAgIGF1dG8gYnVpbGRlciA9IENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZShzaWduYWxfaWQuVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlUmVzdWx0OjpSRUpFQ1RFRCk7Ci0gICAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotICAgIHJldHVybjsKLSAgfQotICBsaW5rXy0+VXBkYXRlQ29ubmVjdGlvblBhcmFtZXRlckZyb21SZW1vdGUoCi0gICAgICBzaWduYWxfaWQsIGludGVydmFsX21pbiwgaW50ZXJ2YWxfbWF4LCBwZXJpcGhlcmFsX2xhdGVuY3ksIHRpbWVvdXRfbXVsdGlwbGllcik7Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6T25Db25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2VSZXN1bHQgcmVzdWx0KSB7Ci0gIGlmIChzaWduYWxfaWQgIT0gY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8pIHsKLSAgICBMT0dfV0FSTigiVW5leHBlY3RlZCByZXNwb25zZTogbm8gcGVuZGluZyByZXF1ZXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXyAhPSBMZUNvbW1hbmRDb2RlOjpDT05ORUNUSU9OX1BBUkFNRVRFUl9VUERBVEVfUkVRVUVTVCkgewotICAgIExPR19XQVJOKCJVbmV4cGVjdGVkIHJlc3BvbnNlOiBubyBwZW5kaW5nIHJlcXVlc3QiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYWxhcm1fLkNhbmNlbCgpOwotICBjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyA9IGtJbml0aWFsU2lnbmFsSWQ7Ci0gIGlmIChyZXN1bHQgIT0gQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlc3BvbnNlUmVzdWx0OjpBQ0NFUFRFRCkgewotICAgIExPR19FUlJPUigiQ29ubmVjdGlvbiBwYXJhbWV0ZXIgdXBkYXRlIGlzIG5vdCBhY2NlcHRlZCIpOwotICB9Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6T25Db25uZWN0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIFBzbSBwc20sIENpZCByZW1vdGVfY2lkLCBNdHUgbXR1LCB1aW50MTZfdCBtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW5pdGlhbF9jcmVkaXRzKSB7Ci0gIGlmIChyZW1vdGVfY2lkID09IGtJbnZhbGlkQ2lkKSB7Ci0gICAgTE9HX1dBUk4oIkludmFsaWQgcmVtb3RlIGNpZCByZWNlaXZlZCBmcm9tIHJlbW90ZSBwc206JWQgcmVtb3RlX2NpZDolZCIsIHBzbSwgcmVtb3RlX2NpZCk7Ci0gICAgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHNpZ25hbF9pZCwga0ludmFsaWRDaWQsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6OklOVkFMSURfU09VUkNFX0NJRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGNoYW5uZWxfYWxsb2NhdG9yXy0+SXNQc21Vc2VkKHBzbSkpIHsKLSAgICBMT0dfV0FSTigiUHNtIGFscmVhZHkgZXhpc3RzIik7Ci0gICAgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHNpZ25hbF9pZCwga0ludmFsaWRDaWQsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6OkxFX1BTTV9OT1RfU1VQUE9SVEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIWR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+SXNTZXJ2aWNlUmVnaXN0ZXJlZChwc20pKSB7Ci0gICAgTE9HX0lORk8oIlNlcnZpY2UgZm9yIHRoaXMgcHNtICglZCkgaXMgbm90IHJlZ2lzdGVyZWQiLCBwc20pOwotICAgIHNlbmRfY29ubmVjdGlvbl9yZXNwb25zZShzaWduYWxfaWQsIGtJbnZhbGlkQ2lkLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpMRV9QU01fTk9UX1NVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgUGVuZGluZ0Nvbm5lY3Rpb24gcGVuZGluZ3sKLSAgICAgIC5yZW1vdGVfY2lkID0gcmVtb3RlX2NpZCwKLSAgICAgIC5pbmNvbWluZ19zaWduYWxfaWQgPSBzaWduYWxfaWQsCi0gICAgICAuaW5pdGlhbF9jcmVkaXRzID0gaW5pdGlhbF9jcmVkaXRzLAotICAgICAgLm1heF9wZHVfc2l6ZSA9IG1wcywKLSAgICAgIC5tdHUgPSBtdHUsCi0gIH07Ci0gIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXy0+R2V0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgpLT5FbmZvcmNlKAotICAgICAgbGlua18tPkdldERldmljZSgpLAotICAgICAgZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZXJ2aWNlKHBzbSktPkdldFNlY3VyaXR5UG9saWN5KCksCi0gICAgICBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmTGVTaWduYWxsaW5nTWFuYWdlcjo6b25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9pbmNvbWluZywgcHNtLCBwZW5kaW5nKSk7Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6b25fc2VjdXJpdHlfcmVzdWx0X2Zvcl9pbmNvbWluZyhQc20gcHNtLCBQZW5kaW5nQ29ubmVjdGlvbiByZXF1ZXN0LCBib29sIHJlc3VsdCkgewotICBhdXRvIHNpZ25hbF9pZCA9IHJlcXVlc3QuaW5jb21pbmdfc2lnbmFsX2lkOwotICBhdXRvKiBzZXJ2aWNlID0gZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZXJ2aWNlKHBzbSk7Ci0gIGlmICghcmVzdWx0KSB7Ci0gICAgYXV0byBzZWN1cml0eV9wb2xpY3kgPSBzZXJ2aWNlLT5HZXRTZWN1cml0eVBvbGljeSgpOwotICAgIHN3aXRjaCAoc2VjdXJpdHlfcG9saWN5KSB7Ci0gICAgICBjYXNlIFNlY3VyaXR5UG9saWN5OjpOT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0s6Ci0gICAgICAgIExPR19FUlJPUigiSWYgbm8gc2VjdXJpdHkgcmVxdWlyZW1lbnQsIHdlIHNob3VsZCBuZXZlciBmYWlsIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTZWN1cml0eVBvbGljeTo6RU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgICAgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHNpZ25hbF9pZCwga0ludmFsaWRDaWQsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpJTlNVRkZJQ0lFTlRfQVVUSEVOVElDQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNlY3VyaXR5UG9saWN5OjpBVVRIRU5USUNBVEVEX0VOQ1JZUFRFRF9UUkFOU1BPUlQ6Ci0gICAgICBjYXNlIFNlY3VyaXR5UG9saWN5OjpCRVNUOgotICAgICAgICBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2Uoc2lnbmFsX2lkLCBrSW52YWxpZENpZCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6OklOU1VGRklDSUVOVF9BVVRIRU5USUNBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU2VjdXJpdHlQb2xpY3k6Ol9OT1RfRk9SX1lPVV9fQVVUSEVOVElDQVRFRF9QQUlSSU5HX1dJVEhfMTI4X0JJVF9LRVk6Ci0gICAgICAgIHNlbmRfY29ubmVjdGlvbl9yZXNwb25zZShzaWduYWxfaWQsIGtJbnZhbGlkQ2lkLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdDo6SU5TVUZGSUNJRU5UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNlY3VyaXR5UG9saWN5OjpfTk9UX0ZPUl9ZT1VfX0FVVEhPUklaQVRJT046Ci0gICAgICAgIHNlbmRfY29ubmVjdGlvbl9yZXNwb25zZShzaWduYWxfaWQsIGtJbnZhbGlkQ2lkLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdDo6SU5TVUZGSUNJRU5UX0FVVEhPUklaQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGF1dG8gY29uZmlnID0gc2VydmljZS0+R2V0Q29uZmlnT3B0aW9uKCk7Ci0gIGF1dG8gbG9jYWxfbXR1ID0gY29uZmlnLm10dTsKLSAgYXV0byBsb2NhbF9tcHMgPSBsaW5rXy0+R2V0TXBzKCk7Ci0KLSAgYXV0byBuZXdfY2hhbm5lbCA9IGxpbmtfLT5BbGxvY2F0ZUR5bmFtaWNDaGFubmVsKHBzbSwgcmVxdWVzdC5yZW1vdGVfY2lkKTsKLSAgaWYgKG5ld19jaGFubmVsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiQ2FuJ3QgYWxsb2NhdGUgZHluYW1pYyBjaGFubmVsIik7Ci0gICAgLy8gVE9ETzogV2UgbmVlZCB0byByZXNwb25kIHdpdGggdGhlIGNvcnJlY3QgcmVhc29uCi0gICAgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKHNpZ25hbF9pZCwga0ludmFsaWRDaWQsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6OlNPVVJDRV9DSURfQUxSRUFEWV9BTExPQ0FURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNlbmRfY29ubmVjdGlvbl9yZXNwb25zZShzaWduYWxfaWQsIG5ld19jaGFubmVsLT5HZXRDaWQoKSwgbG9jYWxfbXR1LCBsb2NhbF9tcHMsIGxpbmtfLT5HZXRJbml0aWFsQ3JlZGl0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpTVUNDRVNTKTsKLSAgYXV0byogZGF0YV9jb250cm9sbGVyID0gcmVpbnRlcnByZXRfY2FzdDxsMmNhcDo6aW50ZXJuYWw6OkxlQ3JlZGl0QmFzZWREYXRhQ29udHJvbGxlcio+KAotICAgICAgZGF0YV9waXBlbGluZV9tYW5hZ2VyXy0+R2V0RGF0YUNvbnRyb2xsZXIobmV3X2NoYW5uZWwtPkdldENpZCgpKSk7Ci0gIGF1dG8gYWN0dWFsX210dSA9IHN0ZDo6bWluKHJlcXVlc3QubXR1LCBsb2NhbF9tdHUpOwotICBkYXRhX2NvbnRyb2xsZXItPlNldE10dShhY3R1YWxfbXR1KTsKLSAgZGF0YV9jb250cm9sbGVyLT5TZXRNcHMoc3RkOjptaW4ocmVxdWVzdC5tYXhfcGR1X3NpemUsIGxvY2FsX21wcykpOwotICBkYXRhX2NvbnRyb2xsZXItPk9uQ3JlZGl0KHJlcXVlc3QuaW5pdGlhbF9jcmVkaXRzKTsKLSAgYXV0byB1c2VyX2NoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPER5bmFtaWNDaGFubmVsPihuZXdfY2hhbm5lbCwgaGFuZGxlcl8sIGxpbmtfLCBhY3R1YWxfbXR1KTsKLSAgZHluYW1pY19zZXJ2aWNlX21hbmFnZXJfLT5HZXRTZXJ2aWNlKHBzbSktPk5vdGlmeUNoYW5uZWxDcmVhdGlvbihzdGQ6Om1vdmUodXNlcl9jaGFubmVsKSk7Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6T25Db25uZWN0aW9uUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgcmVtb3RlX2NpZCwgTXR1IG10dSwgdWludDE2X3QgbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbml0aWFsX2NyZWRpdHMsIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQgcmVzdWx0KSB7Ci0gIGlmIChzaWduYWxfaWQgIT0gY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8pIHsKLSAgICBMT0dfV0FSTigiVW5leHBlY3RlZCByZXNwb25zZTogbm8gcGVuZGluZyByZXF1ZXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXyAhPSBMZUNvbW1hbmRDb2RlOjpMRV9DUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVFVRVNUKSB7Ci0gICAgTE9HX1dBUk4oIlVuZXhwZWN0ZWQgcmVzcG9uc2U6IG5vIHBlbmRpbmcgcmVxdWVzdCIpOwotICAgIHJldHVybjsKLSAgfQotICBhbGFybV8uQ2FuY2VsKCk7Ci0gIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfID0ga0luaXRpYWxTaWduYWxJZDsKLSAgaWYgKHJlc3VsdCAhPSBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgTE9HX1dBUk4oIkNvbm5lY3Rpb24gZmFpbGVkOiAlcyIsIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHRUZXh0KHJlc3VsdCkuZGF0YSgpKTsKLSAgICBsaW5rXy0+T25PdXRnb2luZ0Nvbm5lY3Rpb25SZXF1ZXN0RmFpbChjb21tYW5kX2p1c3Rfc2VudF8uc291cmNlX2NpZF8sIHJlc3VsdCk7Ci0gICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gbmV3X2NoYW5uZWwgPQotICAgICAgbGlua18tPkFsbG9jYXRlUmVzZXJ2ZWREeW5hbWljQ2hhbm5lbChjb21tYW5kX2p1c3Rfc2VudF8uc291cmNlX2NpZF8sIGNvbW1hbmRfanVzdF9zZW50Xy5wc21fLCByZW1vdGVfY2lkKTsKLSAgaWYgKG5ld19jaGFubmVsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiQ2FuJ3QgYWxsb2NhdGUgZHluYW1pYyBjaGFubmVsIik7Ci0gICAgbGlua18tPk9uT3V0Z29pbmdDb25uZWN0aW9uUmVxdWVzdEZhaWwoY29tbWFuZF9qdXN0X3NlbnRfLnNvdXJjZV9jaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6Ok5PX1JFU09VUkNFU19BVkFJTEFCTEUpOwotICAgIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvKiBkYXRhX2NvbnRyb2xsZXIgPSByZWludGVycHJldF9jYXN0PGwyY2FwOjppbnRlcm5hbDo6TGVDcmVkaXRCYXNlZERhdGFDb250cm9sbGVyKj4oCi0gICAgICBkYXRhX3BpcGVsaW5lX21hbmFnZXJfLT5HZXREYXRhQ29udHJvbGxlcihuZXdfY2hhbm5lbC0+R2V0Q2lkKCkpKTsKLSAgYXV0byBhY3R1YWxfbXR1ID0gc3RkOjptaW4obXR1LCBjb21tYW5kX2p1c3Rfc2VudF8ubXR1Xyk7Ci0gIGRhdGFfY29udHJvbGxlci0+U2V0TXR1KGFjdHVhbF9tdHUpOwotICBkYXRhX2NvbnRyb2xsZXItPlNldE1wcyhzdGQ6Om1pbihtcHMsIGNvbW1hbmRfanVzdF9zZW50Xy5tcHNfKSk7Ci0gIGRhdGFfY29udHJvbGxlci0+T25DcmVkaXQoaW5pdGlhbF9jcmVkaXRzKTsKLSAgc3RkOjp1bmlxdWVfcHRyPER5bmFtaWNDaGFubmVsPiB1c2VyX2NoYW5uZWwgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEeW5hbWljQ2hhbm5lbD4obmV3X2NoYW5uZWwsIGhhbmRsZXJfLCBsaW5rXywgYWN0dWFsX210dSk7Ci0gIGxpbmtfLT5Ob3RpZnlDaGFubmVsQ3JlYXRpb24obmV3X2NoYW5uZWwtPkdldENpZCgpLCBzdGQ6Om1vdmUodXNlcl9jaGFubmVsKSk7Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6T25EaXNjb25uZWN0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIENpZCBjaWQsIENpZCByZW1vdGVfY2lkKSB7Ci0gIGF1dG8gY2hhbm5lbCA9IGNoYW5uZWxfYWxsb2NhdG9yXy0+RmluZENoYW5uZWxCeUNpZChjaWQpOwotICBpZiAoY2hhbm5lbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIkRpc2Nvbm5lY3QgcmVxdWVzdCBmb3IgYW4gdW5rbm93biBjaGFubmVsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjaGFubmVsLT5HZXRSZW1vdGVDaWQoKSAhPSByZW1vdGVfY2lkKSB7Ci0gICAgTE9HX1dBUk4oIkRpc2Nvbm5lY3QgcmVxdWVzdCBmb3IgYW4gdW5tYXRjaGluZyBjaGFubmVsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gYnVpbGRlciA9IExlRGlzY29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKHNpZ25hbF9pZC5WYWx1ZSgpLCBjaWQsIHJlbW90ZV9jaWQpOwotICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKGJ1aWxkZXIpLCBoYW5kbGVyXyk7Ci0gIGNoYW5uZWwtPk9uQ2xvc2VkKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgbGlua18tPkZyZWVEeW5hbWljQ2hhbm5lbChjaWQpOwotfQotCi12b2lkIExlU2lnbmFsbGluZ01hbmFnZXI6Ok9uRGlzY29ubmVjdGlvblJlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIHJlbW90ZV9jaWQsIENpZCBjaWQpIHsKLSAgaWYgKHNpZ25hbF9pZCAhPSBjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyB8fAotICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8gIT0gTGVDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNUKSB7Ci0gICAgTE9HX1dBUk4oIlVuZXhwZWN0ZWQgcmVzcG9uc2U6IG5vIHBlbmRpbmcgcmVxdWVzdCIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoY29tbWFuZF9qdXN0X3NlbnRfLnNvdXJjZV9jaWRfICE9IGNpZCB8fCBjb21tYW5kX2p1c3Rfc2VudF8uZGVzdGluYXRpb25fY2lkXyAhPSByZW1vdGVfY2lkKSB7Ci0gICAgTE9HX1dBUk4oIlVuZXhwZWN0ZWQgcmVzcG9uc2U6IGNpZCBkb2Vzbid0IG1hdGNoLiBFeHBlY3RlZCBzY2lkICVkIGRjaWQgJWQsIGdvdCBzY2lkICVkIGRjaWQgJWQiLAotICAgICAgICAgICAgIGNvbW1hbmRfanVzdF9zZW50Xy5zb3VyY2VfY2lkXywgY29tbWFuZF9qdXN0X3NlbnRfLmRlc3RpbmF0aW9uX2NpZF8sIGNpZCwgcmVtb3RlX2NpZCk7Ci0gICAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFsYXJtXy5DYW5jZWwoKTsKLSAgY29tbWFuZF9qdXN0X3NlbnRfLnNpZ25hbF9pZF8gPSBrSW5pdGlhbFNpZ25hbElkOwotICBhdXRvIGNoYW5uZWwgPSBjaGFubmVsX2FsbG9jYXRvcl8tPkZpbmRDaGFubmVsQnlDaWQoY2lkKTsKLSAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJEaXNjb25uZWN0IHJlc3BvbnNlIGZvciBhbiB1bmtub3duIGNoYW5uZWwiKTsKLSAgICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjaGFubmVsLT5PbkNsb3NlZChoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIGxpbmtfLT5GcmVlRHluYW1pY0NoYW5uZWwoY2lkKTsKLSAgaGFuZGxlX3NlbmRfbmV4dF9jb21tYW5kKCk7Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6T25DcmVkaXQoQ2lkIHJlbW90ZV9jaWQsIHVpbnQxNl90IGNyZWRpdHMpIHsKLSAgYXV0byBjaGFubmVsID0gY2hhbm5lbF9hbGxvY2F0b3JfLT5GaW5kQ2hhbm5lbEJ5UmVtb3RlQ2lkKHJlbW90ZV9jaWQpOwotICBpZiAoY2hhbm5lbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIGNyZWRpdCBmb3IgaW52YWxpZCBjaWQgJWQiLCBjaGFubmVsLT5HZXRDaWQoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8qIGRhdGFfY29udHJvbGxlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bDJjYXA6OmludGVybmFsOjpMZUNyZWRpdEJhc2VkRGF0YUNvbnRyb2xsZXIqPigKLSAgICAgIGRhdGFfcGlwZWxpbmVfbWFuYWdlcl8tPkdldERhdGFDb250cm9sbGVyKGNoYW5uZWwtPkdldENpZCgpKSk7Ci0gIGRhdGFfY29udHJvbGxlci0+T25DcmVkaXQoY3JlZGl0cyk7Ci19Ci0KLXZvaWQgTGVTaWduYWxsaW5nTWFuYWdlcjo6b25faW5jb21pbmdfcGFja2V0KCkgewotICBhdXRvIHBhY2tldCA9IHNpZ25hbGxpbmdfY2hhbm5lbF8tPkdldFF1ZXVlVXBFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICBMZUNvbnRyb2xWaWV3IGNvbnRyb2xfcGFja2V0X3ZpZXcgPSBMZUNvbnRyb2xWaWV3OjpDcmVhdGUoKnBhY2tldCk7Ci0gIGlmICghY29udHJvbF9wYWNrZXRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICBMT0dfV0FSTigiSW52YWxpZCBzaWduYWxsaW5nIHBhY2tldCByZWNlaXZlZCIpOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvIGNvZGUgPSBjb250cm9sX3BhY2tldF92aWV3LkdldENvZGUoKTsKLSAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBMZUNvbW1hbmRDb2RlOjpDT01NQU5EX1JFSkVDVDogewotICAgICAgTGVDb21tYW5kUmVqZWN0VmlldyBjb21tYW5kX3JlamVjdF92aWV3ID0gTGVDb21tYW5kUmVqZWN0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFjb21tYW5kX3JlamVjdF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkNvbW1hbmRSZWplY3QoY29tbWFuZF9yZWplY3Rfdmlldyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBMZUNvbW1hbmRDb2RlOjpDT05ORUNUSU9OX1BBUkFNRVRFUl9VUERBVEVfUkVRVUVTVDogewotICAgICAgQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlcXVlc3RWaWV3IHBhcmFtZXRlcl91cGRhdGVfcmVxX3ZpZXcgPQotICAgICAgICAgIENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFwYXJhbWV0ZXJfdXBkYXRlX3JlcV92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0KAotICAgICAgICAgIHBhcmFtZXRlcl91cGRhdGVfcmVxX3ZpZXcuR2V0SWRlbnRpZmllcigpLAotICAgICAgICAgIHBhcmFtZXRlcl91cGRhdGVfcmVxX3ZpZXcuR2V0SW50ZXJ2YWxNaW4oKSwKLSAgICAgICAgICBwYXJhbWV0ZXJfdXBkYXRlX3JlcV92aWV3LkdldEludGVydmFsTWF4KCksCi0gICAgICAgICAgcGFyYW1ldGVyX3VwZGF0ZV9yZXFfdmlldy5HZXRQZXJpcGhlcmFsTGF0ZW5jeSgpLAotICAgICAgICAgIHBhcmFtZXRlcl91cGRhdGVfcmVxX3ZpZXcuR2V0VGltZW91dE11bHRpcGxpZXIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6Q09OTkVDVElPTl9QQVJBTUVURVJfVVBEQVRFX1JFU1BPTlNFOiB7Ci0gICAgICBDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2VWaWV3IHBhcmFtZXRlcl91cGRhdGVfcnNwX3ZpZXcgPQotICAgICAgICAgIENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVZpZXc6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3KTsKLSAgICAgIGlmICghcGFyYW1ldGVyX3VwZGF0ZV9yc3Bfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgT25Db25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlUmVzcG9uc2UocGFyYW1ldGVyX3VwZGF0ZV9yc3Bfdmlldy5HZXRJZGVudGlmaWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdXBkYXRlX3JzcF92aWV3LkdldFJlc3VsdCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBMZUNvbW1hbmRDb2RlOjpMRV9DUkVESVRfQkFTRURfQ09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlcXVlc3RWaWV3IGNvbm5lY3Rpb25fcmVxdWVzdF92aWV3ID0KLSAgICAgICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIWNvbm5lY3Rpb25fcmVxdWVzdF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkNvbm5lY3Rpb25SZXF1ZXN0KGNvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldElkZW50aWZpZXIoKSwgY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0TGVQc20oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0U291cmNlQ2lkKCksIGNvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldE10dSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3JlcXVlc3Rfdmlldy5HZXRNcHMoKSwgY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0SW5pdGlhbENyZWRpdHMoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6TEVfQ1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVTUE9OU0U6IHsKLSAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VWaWV3IGNvbm5lY3Rpb25fcmVzcG9uc2VfdmlldyA9Ci0gICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVZpZXc6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3KTsKLSAgICAgIGlmICghY29ubmVjdGlvbl9yZXNwb25zZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkNvbm5lY3Rpb25SZXNwb25zZShjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuR2V0SWRlbnRpZmllcigpLCBjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuR2V0RGVzdGluYXRpb25DaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRNdHUoKSwgY29ubmVjdGlvbl9yZXNwb25zZV92aWV3LkdldE1wcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9yZXNwb25zZV92aWV3LkdldEluaXRpYWxDcmVkaXRzKCksIGNvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRSZXN1bHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6TEVfRkxPV19DT05UUk9MX0NSRURJVDogewotICAgICAgTGVGbG93Q29udHJvbENyZWRpdFZpZXcgY3JlZGl0X3ZpZXcgPSBMZUZsb3dDb250cm9sQ3JlZGl0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFjcmVkaXRfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgT25DcmVkaXQoY3JlZGl0X3ZpZXcuR2V0Q2lkKCksIGNyZWRpdF92aWV3LkdldENyZWRpdHMoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBMZURpc2Nvbm5lY3Rpb25SZXF1ZXN0VmlldyBkaXNjb25uZWN0aW9uX3JlcXVlc3RfdmlldyA9IExlRGlzY29ubmVjdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIWRpc2Nvbm5lY3Rpb25fcmVxdWVzdF92aWV3LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBPbkRpc2Nvbm5lY3Rpb25SZXF1ZXN0KGRpc2Nvbm5lY3Rpb25fcmVxdWVzdF92aWV3LkdldElkZW50aWZpZXIoKSwgZGlzY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0RGVzdGluYXRpb25DaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGlvbl9yZXF1ZXN0X3ZpZXcuR2V0U291cmNlQ2lkKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIExlQ29tbWFuZENvZGU6OkRJU0NPTk5FQ1RJT05fUkVTUE9OU0U6IHsKLSAgICAgIExlRGlzY29ubmVjdGlvblJlc3BvbnNlVmlldyBkaXNjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcgPQotICAgICAgICAgIExlRGlzY29ubmVjdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFkaXNjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIE9uRGlzY29ubmVjdGlvblJlc3BvbnNlKGRpc2Nvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRJZGVudGlmaWVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW9uX3Jlc3BvbnNlX3ZpZXcuR2V0RGVzdGluYXRpb25DaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rpb25fcmVzcG9uc2Vfdmlldy5HZXRTb3VyY2VDaWQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6Q1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVRVUVTVDogewotICAgICAgTGVFbmhhbmNlZENyZWRpdEJhc2VkQ29ubmVjdGlvblJlcXVlc3RWaWV3IHJlcXVlc3RfdmlldyA9Ci0gICAgICAgICAgTGVFbmhhbmNlZENyZWRpdEJhc2VkQ29ubmVjdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIXJlcXVlc3Rfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIExlQ29tbWFuZENvZGU6OkNSRURJVF9CQVNFRF9DT05ORUNUSU9OX1JFU1BPTlNFOiB7Ci0gICAgICBMZUVuaGFuY2VkQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VWaWV3IHJlc3BvbnNlX3ZpZXcgPQotICAgICAgICAgIExlRW5oYW5jZWRDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVZpZXc6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3KTsKLSAgICAgIGlmICghcmVzcG9uc2Vfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIExlQ29tbWFuZENvZGU6OkNSRURJVF9CQVNFRF9SRUNPTkZJR1VSRV9SRVFVRVNUOiB7Ci0gICAgICBMZUVuaGFuY2VkQ3JlZGl0QmFzZWRSZWNvbmZpZ3VyZVJlcXVlc3RWaWV3IHJlcXVlc3RfdmlldyA9Ci0gICAgICAgICAgTGVFbmhhbmNlZENyZWRpdEJhc2VkUmVjb25maWd1cmVSZXF1ZXN0Vmlldzo6Q3JlYXRlKGNvbnRyb2xfcGFja2V0X3ZpZXcpOwotICAgICAgaWYgKCFyZXF1ZXN0X3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBMZUNvbW1hbmRDb2RlOjpDUkVESVRfQkFTRURfUkVDT05GSUdVUkVfUkVTUE9OU0U6IHsKLSAgICAgIExlRW5oYW5jZWRDcmVkaXRCYXNlZFJlY29uZmlndXJlUmVzcG9uc2VWaWV3IHJlc3BvbnNlX3ZpZXcgPQotICAgICAgICAgIExlRW5oYW5jZWRDcmVkaXRCYXNlZFJlY29uZmlndXJlUmVzcG9uc2VWaWV3OjpDcmVhdGUoY29udHJvbF9wYWNrZXRfdmlldyk7Ci0gICAgICBpZiAoIXJlc3BvbnNlX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCJVbmhhbmRsZWQgZXZlbnQgMHgleCIsIHN0YXRpY19jYXN0PGludD4oY29kZSkpOwotICAgICAgYXV0byBidWlsZGVyID0gTGVDb21tYW5kUmVqZWN0Tm90VW5kZXJzdG9vZEJ1aWxkZXI6OkNyZWF0ZShjb250cm9sX3BhY2tldF92aWV3LkdldElkZW50aWZpZXIoKSk7Ci0gICAgICBlbnF1ZXVlX2J1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKGJ1aWxkZXIpLCBoYW5kbGVyXyk7Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgbG9jYWxfY2lkLCBNdHUgbXR1LCB1aW50MTZfdCBtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbml0aWFsX2NyZWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQgcmVzdWx0KSB7Ci0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBMZUNyZWRpdEJhc2VkQ29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKHNpZ25hbF9pZC5WYWx1ZSgpLCBsb2NhbF9jaWQsIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdCwgcmVzdWx0KTsKLSAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotfQotCi12b2lkIExlU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCgpIHsKLSAgTE9HX1dBUk4oIlJlc3BvbnNlIHRpbWUgb3V0Iik7Ci0gIGlmIChjb21tYW5kX2p1c3Rfc2VudF8uc2lnbmFsX2lkXyA9PSBrSW52YWxpZFNpZ25hbElkKSB7Ci0gICAgTE9HX0VSUk9SKCJObyBwZW5kaW5nIGNvbW1hbmQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3dpdGNoIChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXykgewotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6Q09OTkVDVElPTl9QQVJBTUVURVJfVVBEQVRFX1JFUVVFU1Q6IHsKLSAgICAgIGxpbmtfLT5Pbk91dGdvaW5nQ29ubmVjdGlvblJlcXVlc3RGYWlsKGNvbW1hbmRfanVzdF9zZW50Xy5zb3VyY2VfY2lkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlQ3JlZGl0QmFzZWRDb25uZWN0aW9uUmVzcG9uc2VSZXN1bHQ6Ok5PX1JFU09VUkNFU19BVkFJTEFCTEUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKTsKLX0KLQotdm9pZCBMZVNpZ25hbGxpbmdNYW5hZ2VyOjpoYW5kbGVfc2VuZF9uZXh0X2NvbW1hbmQoKSB7Ci0gIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfID0ga0ludmFsaWRTaWduYWxJZDsKLSAgaWYgKHBlbmRpbmdfY29tbWFuZHNfLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb21tYW5kX2p1c3Rfc2VudF8gPSBwZW5kaW5nX2NvbW1hbmRzXy5mcm9udCgpOwotICBwZW5kaW5nX2NvbW1hbmRzXy5wb3AoKTsKLSAgc3dpdGNoIChjb21tYW5kX2p1c3Rfc2VudF8uY29tbWFuZF9jb2RlXykgewotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6TEVfQ1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVRVUVTVDogewotICAgICAgYXV0byBidWlsZGVyID0gTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfLlZhbHVlKCksIGNvbW1hbmRfanVzdF9zZW50Xy5wc21fLCBjb21tYW5kX2p1c3Rfc2VudF8uc291cmNlX2NpZF8sCi0gICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLm10dV8sIGNvbW1hbmRfanVzdF9zZW50Xy5tcHNfLCBjb21tYW5kX2p1c3Rfc2VudF8uY3JlZGl0c18pOwotICAgICAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotICAgICAgYWxhcm1fLlNjaGVkdWxlKGNvbW1vbjo6QmluZE9uY2UoJkxlU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwga1RpbWVvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNUOiB7Ci0gICAgICBhdXRvIGJ1aWxkZXIgPSBMZURpc2Nvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfLlZhbHVlKCksIGNvbW1hbmRfanVzdF9zZW50Xy5kZXN0aW5hdGlvbl9jaWRfLCBjb21tYW5kX2p1c3Rfc2VudF8uc291cmNlX2NpZF8pOwotICAgICAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotICAgICAgYWxhcm1fLlNjaGVkdWxlKGNvbW1vbjo6QmluZE9uY2UoJkxlU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwga1RpbWVvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTGVDb21tYW5kQ29kZTo6Q09OTkVDVElPTl9QQVJBTUVURVJfVVBEQVRFX1JFUVVFU1Q6IHsKLSAgICAgIGF1dG8gYnVpbGRlciA9IENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGNvbW1hbmRfanVzdF9zZW50Xy5zaWduYWxfaWRfLlZhbHVlKCksCi0gICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLmludGVydmFsX21pbl8sCi0gICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLmludGVydmFsX21heF8sCi0gICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLnBlcmlwaGVyYWxfbGF0ZW5jeV8sCi0gICAgICAgICAgY29tbWFuZF9qdXN0X3NlbnRfLnRpbWVvdXRfbXVsdGlwbGllcl8pOwotICAgICAgZW5xdWV1ZV9idWZmZXJfLT5FbnF1ZXVlKHN0ZDo6bW92ZShidWlsZGVyKSwgaGFuZGxlcl8pOwotICAgICAgYWxhcm1fLlNjaGVkdWxlKGNvbW1vbjo6QmluZE9uY2UoJkxlU2lnbmFsbGluZ01hbmFnZXI6Om9uX2NvbW1hbmRfdGltZW91dCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwga1RpbWVvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIExPR19XQVJOKCJVbnN1cHBvcnRlZCBjb21tYW5kIGNvZGUgMHgleCIsIHN0YXRpY19jYXN0PGludD4oY29tbWFuZF9qdXN0X3NlbnRfLmNvbW1hbmRfY29kZV8pKTsKLSAgICB9Ci0gIH0KLX0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2ludGVybmFsL3NpZ25hbGxpbmdfbWFuYWdlci5oIGIvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTNlMzIuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvaW50ZXJuYWwvc2lnbmFsbGluZ19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImwyY2FwL2NpZC5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2RhdGFfcGlwZWxpbmVfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsMmNhcC9sMmNhcF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9pbXBsLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvaW50ZXJuYWwvZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL210dS5oIgotI2luY2x1ZGUgImwyY2FwL3BzbS5oIgotI2luY2x1ZGUgImwyY2FwL3NpZ25hbF9pZC5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdHJ1Y3QgUGVuZGluZ0NvbW1hbmQgewotICBTaWduYWxJZCBzaWduYWxfaWRfID0ga0ludmFsaWRTaWduYWxJZDsKLSAgTGVDb21tYW5kQ29kZSBjb21tYW5kX2NvZGVfOwotICBQc20gcHNtXzsKLSAgQ2lkIHNvdXJjZV9jaWRfOwotICBDaWQgZGVzdGluYXRpb25fY2lkXzsKLSAgTXR1IG10dV87Ci0gIHVpbnQxNl90IG1wc187Ci0gIHVpbnQxNl90IGNyZWRpdHNfOwotICB1aW50MTZfdCBpbnRlcnZhbF9taW5fOwotICB1aW50MTZfdCBpbnRlcnZhbF9tYXhfOwotICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3lfOwotICB1aW50MTZfdCB0aW1lb3V0X211bHRpcGxpZXJfOwotCi0gIHN0YXRpYyBQZW5kaW5nQ29tbWFuZCBDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXF1ZXN0KFNpZ25hbElkIHNpZ25hbF9pZCwgUHNtIHBzbSwgQ2lkIHNjaWQsIE10dSBtdHUsIHVpbnQxNl90IG1wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW5pdGlhbF9jcmVkaXRzKSB7Ci0gICAgUGVuZGluZ0NvbW1hbmQgcGVuZGluZ19jb21tYW5kOwotICAgIHBlbmRpbmdfY29tbWFuZC5zaWduYWxfaWRfID0gc2lnbmFsX2lkOwotICAgIHBlbmRpbmdfY29tbWFuZC5jb21tYW5kX2NvZGVfID0gTGVDb21tYW5kQ29kZTo6TEVfQ1JFRElUX0JBU0VEX0NPTk5FQ1RJT05fUkVRVUVTVDsKLSAgICBwZW5kaW5nX2NvbW1hbmQucHNtXyA9IHBzbTsKLSAgICBwZW5kaW5nX2NvbW1hbmQuc291cmNlX2NpZF8gPSBzY2lkOwotICAgIHBlbmRpbmdfY29tbWFuZC5tdHVfID0gbXR1OwotICAgIHBlbmRpbmdfY29tbWFuZC5tcHNfID0gbXBzOwotICAgIHBlbmRpbmdfY29tbWFuZC5jcmVkaXRzXyA9IGluaXRpYWxfY3JlZGl0czsKLSAgICByZXR1cm4gcGVuZGluZ19jb21tYW5kOwotICB9Ci0KLSAgc3RhdGljIFBlbmRpbmdDb21tYW5kIERpc2Nvbm5lY3Rpb25SZXF1ZXN0KFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIHNjaWQsIENpZCBkY2lkKSB7Ci0gICAgUGVuZGluZ0NvbW1hbmQgcGVuZGluZ19jb21tYW5kOwotICAgIHBlbmRpbmdfY29tbWFuZC5zaWduYWxfaWRfID0gc2lnbmFsX2lkOwotICAgIHBlbmRpbmdfY29tbWFuZC5jb21tYW5kX2NvZGVfID0gTGVDb21tYW5kQ29kZTo6RElTQ09OTkVDVElPTl9SRVFVRVNUOwotICAgIHBlbmRpbmdfY29tbWFuZC5zb3VyY2VfY2lkXyA9IHNjaWQ7Ci0gICAgcGVuZGluZ19jb21tYW5kLmRlc3RpbmF0aW9uX2NpZF8gPSBkY2lkOwotICAgIHJldHVybiBwZW5kaW5nX2NvbW1hbmQ7Ci0gIH0KLQotICBzdGF0aWMgUGVuZGluZ0NvbW1hbmQgQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSgKLSAgICAgIFNpZ25hbElkIHNpZ25hbF9pZCwKLSAgICAgIHVpbnQxNl90IGludGVydmFsX21pbiwKLSAgICAgIHVpbnQxNl90IGludGVydmFsX21heCwKLSAgICAgIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICAgIHVpbnQxNl90IHRpbWVvdXRfbXVsdGlwbGllcikgewotICAgIFBlbmRpbmdDb21tYW5kIHBlbmRpbmdfY29tbWFuZDsKLSAgICBwZW5kaW5nX2NvbW1hbmQuc2lnbmFsX2lkXyA9IHNpZ25hbF9pZDsKLSAgICBwZW5kaW5nX2NvbW1hbmQuY29tbWFuZF9jb2RlXyA9IExlQ29tbWFuZENvZGU6OkNPTk5FQ1RJT05fUEFSQU1FVEVSX1VQREFURV9SRVFVRVNUOwotICAgIHBlbmRpbmdfY29tbWFuZC5pbnRlcnZhbF9taW5fID0gaW50ZXJ2YWxfbWluOwotICAgIHBlbmRpbmdfY29tbWFuZC5pbnRlcnZhbF9tYXhfID0gaW50ZXJ2YWxfbWF4OwotICAgIHBlbmRpbmdfY29tbWFuZC5wZXJpcGhlcmFsX2xhdGVuY3lfID0gcGVyaXBoZXJhbF9sYXRlbmN5OwotICAgIHBlbmRpbmdfY29tbWFuZC50aW1lb3V0X211bHRpcGxpZXJfID0gdGltZW91dF9tdWx0aXBsaWVyOwotICAgIHJldHVybiBwZW5kaW5nX2NvbW1hbmQ7Ci0gIH0KLX07Ci0KLWNsYXNzIExpbms7Ci0KLWNsYXNzIExlU2lnbmFsbGluZ01hbmFnZXIgewotIHB1YmxpYzoKLSAgTGVTaWduYWxsaW5nTWFuYWdlcihvczo6SGFuZGxlciogaGFuZGxlciwgTGluayogbGluaywgbDJjYXA6OmludGVybmFsOjpEYXRhUGlwZWxpbmVNYW5hZ2VyKiBkYXRhX3BpcGVsaW5lX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgIGwyY2FwOjppbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxBbGxvY2F0b3IqIGNoYW5uZWxfYWxsb2NhdG9yKTsKLQotICB2aXJ0dWFsIH5MZVNpZ25hbGxpbmdNYW5hZ2VyKCk7Ci0KLSAgdm9pZCBTZW5kQ29ubmVjdGlvblJlcXVlc3QoUHNtIHBzbSwgQ2lkIGxvY2FsX2NpZCwgTXR1IG10dSk7Ci0KLSAgdm9pZCBTZW5kRGlzY29ubmVjdFJlcXVlc3QoQ2lkIGxvY2FsX2NpZCwgQ2lkIHJlbW90ZV9jaWQpOwotCi0gIC8vIE5vdGU6IFNpbmNlIENvcmUgNC4xLCBMTCBwZXJpcGhlcmFsIGNhbiBzZW5kIHRoaXMgdGhyb3VnaCBIQ0kgY29tbWFuZC4KLSAgdm9pZCBTZW5kQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZVJlcXVlc3QoCi0gICAgICB1aW50MTZfdCBpbnRlcnZhbF9taW4sIHVpbnQxNl90IGludGVydmFsX21heCwgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0X211bHRpcGxpZXIpOwotCi0gIHZvaWQgU2VuZENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZShTaWduYWxJZCBzaWduYWxfaWQsIENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVJlc3VsdCByZXN1bHQpOwotCi0gIHZvaWQgU2VuZENyZWRpdChDaWQgbG9jYWxfY2lkLCB1aW50MTZfdCBjcmVkaXRzKTsKLQotICB2b2lkIFNlbmRFbmhhbmNlZENvbm5lY3Rpb25SZXF1ZXN0KFBzbSBwc20sIHN0ZDo6dmVjdG9yPENpZD4gbG9jYWxfY2lkLCBNdHUgbXR1KTsKLQotICB2b2lkIFNlbmRFbmhhbmNlZFJlY29uZmlndXJlUmVxdWVzdChzdGQ6OnZlY3RvcjxDaWQ+IGxvY2FsX2NpZCwgTXR1IG10dSk7Ci0KLSAgdm9pZCBDYW5jZWxBbGFybSgpOwotCi0gIHZvaWQgT25Db21tYW5kUmVqZWN0KExlQ29tbWFuZFJlamVjdFZpZXcgY29tbWFuZF9yZWplY3Rfdmlldyk7Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXF1ZXN0KAotICAgICAgU2lnbmFsSWQgc2lnbmFsX2lkLAotICAgICAgdWludDE2X3QgaW50ZXJ2YWxfbWluLAotICAgICAgdWludDE2X3QgaW50ZXJ2YWxfbWF4LAotICAgICAgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgdWludDE2X3QgdGltZW91dF9tdWx0aXBsaWVyKTsKLSAgdm9pZCBPbkNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZShTaWduYWxJZCBzaWduYWxfaWQsIENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVSZXNwb25zZVJlc3VsdCByZXN1bHQpOwotCi0gIHZvaWQgT25Db25uZWN0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIFBzbSBwc20sIENpZCByZW1vdGVfY2lkLCBNdHUgbXR1LCB1aW50MTZfdCBtcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbml0aWFsX2NyZWRpdHMpOwotCi0gIHZvaWQgT25Db25uZWN0aW9uUmVzcG9uc2UoU2lnbmFsSWQgc2lnbmFsX2lkLCBDaWQgcmVtb3RlX2NpZCwgTXR1IG10dSwgdWludDE2X3QgbXBzLCB1aW50MTZfdCBpbml0aWFsX2NyZWRpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCByZXN1bHQpOwotCi0gIHZvaWQgT25EaXNjb25uZWN0aW9uUmVxdWVzdChTaWduYWxJZCBzaWduYWxfaWQsIENpZCBjaWQsIENpZCByZW1vdGVfY2lkKTsKLQotICB2b2lkIE9uRGlzY29ubmVjdGlvblJlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIGNpZCwgQ2lkIHJlbW90ZV9jaWQpOwotCi0gIHZvaWQgT25DcmVkaXQoQ2lkIHJlbW90ZV9jaWQsIHVpbnQxNl90IGNyZWRpdHMpOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IFBlbmRpbmdDb25uZWN0aW9uIHsKLSAgICBDaWQgcmVtb3RlX2NpZDsKLSAgICBNdHUgbXR1OwotICAgIHVpbnQxNl90IG1heF9wZHVfc2l6ZTsKLSAgICB1aW50MTZfdCBpbml0aWFsX2NyZWRpdHM7Ci0gICAgU2lnbmFsSWQgaW5jb21pbmdfc2lnbmFsX2lkOwotICB9OwotCi0gIHZvaWQgb25faW5jb21pbmdfcGFja2V0KCk7Ci0gIHZvaWQgc2VuZF9jb25uZWN0aW9uX3Jlc3BvbnNlKFNpZ25hbElkIHNpZ25hbF9pZCwgQ2lkIGxvY2FsX2NpZCwgTXR1IG10dSwgdWludDE2X3QgbXBzLCB1aW50MTZfdCBpbml0aWFsX2NyZWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVDcmVkaXRCYXNlZENvbm5lY3Rpb25SZXNwb25zZVJlc3VsdCByZXN1bHQpOwotICB2b2lkIG9uX2NvbW1hbmRfdGltZW91dCgpOwotICB2b2lkIGhhbmRsZV9zZW5kX25leHRfY29tbWFuZCgpOwotICB2b2lkIG9uX3NlY3VyaXR5X3Jlc3VsdF9mb3JfaW5jb21pbmcoUHNtIHBzbSwgUGVuZGluZ0Nvbm5lY3Rpb24gcmVxdWVzdCwgYm9vbCByZXN1bHQpOwotICB2b2lkIG9uX3NlY3VyaXR5X3Jlc3VsdF9mb3Jfb3V0Z29pbmcoUHNtIHBzbSwgQ2lkIGxvY2FsX2NpZCwgTXR1IG10dSwgYm9vbCByZXN1bHQpOwotCi0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgTGluayogbGlua187Ci0gIGwyY2FwOjppbnRlcm5hbDo6RGF0YVBpcGVsaW5lTWFuYWdlciogZGF0YV9waXBlbGluZV9tYW5hZ2VyXzsKLSAgc3RkOjpzaGFyZWRfcHRyPGxlOjppbnRlcm5hbDo6Rml4ZWRDaGFubmVsSW1wbD4gc2lnbmFsbGluZ19jaGFubmVsXzsKLSAgRHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwqIGR5bmFtaWNfc2VydmljZV9tYW5hZ2VyXzsKLSAgbDJjYXA6OmludGVybmFsOjpEeW5hbWljQ2hhbm5lbEFsbG9jYXRvciogY2hhbm5lbF9hbGxvY2F0b3JfOwotICBzdGQ6OnVuaXF1ZV9wdHI8b3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+IGVucXVldWVfYnVmZmVyXzsKLSAgc3RkOjpxdWV1ZTxQZW5kaW5nQ29tbWFuZD4gcGVuZGluZ19jb21tYW5kc187Ci0gIFBlbmRpbmdDb21tYW5kIGNvbW1hbmRfanVzdF9zZW50XzsKLSAgb3M6OkFsYXJtIGFsYXJtXzsKLSAgU2lnbmFsSWQgbmV4dF9zaWduYWxfaWRfID0ga0luaXRpYWxTaWduYWxJZDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2wyY2FwX2xlX21vZHVsZS5jYyBiL2dkL2wyY2FwL2xlL2wyY2FwX2xlX21vZHVsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYjJmOC4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9sMmNhcF9sZV9tb2R1bGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImwyY2FwL2ludGVybmFsL3BhcmFtZXRlcl9wcm92aWRlci5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2R5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2ZpeGVkX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGwuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9pbnRlcm5hbC9saW5rX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9zZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9sMmNhcF9sZV9tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBMMmNhcExlTW9kdWxlOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBMMmNhcExlTW9kdWxlKCk7IH0pOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBjYW5ub3Qgc2F0aXNmeSBhbnkgc2VjdXJpdHkgbGV2ZWwgZXhjZXB0Ci0gKiBOT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0suCi0gKi8KLWNsYXNzIFNlY3VyaXR5RW5mb3JjZW1lbnRSZWplY3RBbGxJbXBsIDogcHVibGljIFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdm9pZCBFbmZvcmNlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgU2VjdXJpdHlQb2xpY3kgcG9saWN5LCBSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spIG92ZXJyaWRlIHsKLSAgICBpZiAocG9saWN5ID09IFNlY3VyaXR5UG9saWN5OjpOT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0spIHsKLSAgICAgIHJlc3VsdF9jYWxsYmFjay5JbnZva2VJZk5vdEVtcHR5KHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHRfY2FsbGJhY2suSW52b2tlSWZOb3RFbXB0eShmYWxzZSk7Ci0gICAgfQotICB9Ci19Owotc3RhdGljIFNlY3VyaXR5RW5mb3JjZW1lbnRSZWplY3RBbGxJbXBsIGRlZmF1bHRfc2VjdXJpdHlfbW9kdWxlX2ltcGxfOwotCi1zdHJ1Y3QgTDJjYXBMZU1vZHVsZTo6aW1wbCB7Ci0gIGltcGwob3M6OkhhbmRsZXIqIGwyY2FwX2hhbmRsZXIsIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXIpCi0gICAgICA6IGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpLCBhY2xfbWFuYWdlcl8oYWNsX21hbmFnZXIpIHsKLSAgICBkeW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfLlNldFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoJmRlZmF1bHRfc2VjdXJpdHlfbW9kdWxlX2ltcGxfKTsKLSAgfQotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcl87Ci0gIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXJfOwotICBsMmNhcDo6aW50ZXJuYWw6OlBhcmFtZXRlclByb3ZpZGVyIHBhcmFtZXRlcl9wcm92aWRlcl87Ci0gIGludGVybmFsOjpGaXhlZENoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgZml4ZWRfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF97bDJjYXBfaGFuZGxlcl99OwotICBpbnRlcm5hbDo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlTWFuYWdlckltcGwgZHluYW1pY19jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsX3tsMmNhcF9oYW5kbGVyX307Ci0gIGludGVybmFsOjpMaW5rTWFuYWdlciBsaW5rX21hbmFnZXJfe2wyY2FwX2hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2xfbWFuYWdlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbWV0ZXJfcHJvdmlkZXJffTsKLX07Ci0KLUwyY2FwTGVNb2R1bGU6OkwyY2FwTGVNb2R1bGUoKSB7fQotTDJjYXBMZU1vZHVsZTo6fkwyY2FwTGVNb2R1bGUoKSB7fQotCi12b2lkIEwyY2FwTGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICBsaXN0LT5hZGQ8aGNpOjpBY2xNYW5hZ2VyPigpOwotfQotCi12b2lkIEwyY2FwTGVNb2R1bGU6OlN0YXJ0KCkgewotICBwaW1wbF8gPSBzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KEdldEhhbmRsZXIoKSwgR2V0RGVwZW5kZW5jeTxoY2k6OkFjbE1hbmFnZXI+KCkpOwotfQotCi12b2lkIEwyY2FwTGVNb2R1bGU6OlN0b3AoKSB7Ci0gIHBpbXBsXy5yZXNldCgpOwotfQotCi1zdGQ6OnN0cmluZyBMMmNhcExlTW9kdWxlOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICJMMmNhcCBMZSBNb2R1bGUiOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDaGFubmVsTWFuYWdlcj4gTDJjYXBMZU1vZHVsZTo6R2V0Rml4ZWRDaGFubmVsTWFuYWdlcigpIHsKLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxNYW5hZ2VyPihuZXcgRml4ZWRDaGFubmVsTWFuYWdlcigmcGltcGxfLT5maXhlZF9jaGFubmVsX3NlcnZpY2VfbWFuYWdlcl9pbXBsXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGltcGxfLT5saW5rX21hbmFnZXJfLCBwaW1wbF8tPmwyY2FwX2hhbmRsZXJfKSk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbE1hbmFnZXI+IEwyY2FwTGVNb2R1bGU6OkdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpIHsKLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbE1hbmFnZXI+KG5ldyBEeW5hbWljQ2hhbm5lbE1hbmFnZXIoCi0gICAgICAmcGltcGxfLT5keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfLCAmcGltcGxfLT5saW5rX21hbmFnZXJfLCBwaW1wbF8tPmwyY2FwX2hhbmRsZXJfKSk7Ci19Ci0KLXZvaWQgTDJjYXBMZU1vZHVsZTo6SW5qZWN0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZShTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKiBzZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UpIHsKLSAgaWYgKHNlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgcGltcGxfLT5keW5hbWljX2NoYW5uZWxfc2VydmljZV9tYW5hZ2VyX2ltcGxfLlNldFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2Uoc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlKTsKLSAgfSBlbHNlIHsKLSAgICBwaW1wbF8tPmR5bmFtaWNfY2hhbm5lbF9zZXJ2aWNlX21hbmFnZXJfaW1wbF8uU2V0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgmZGVmYXVsdF9zZWN1cml0eV9tb2R1bGVfaW1wbF8pOwotICB9Ci19Ci0KLXZvaWQgTDJjYXBMZU1vZHVsZTo6U2V0TGlua1Byb3BlcnR5TGlzdGVuZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtQcm9wZXJ0eUxpc3RlbmVyKiBsaXN0ZW5lcikgewotICBwaW1wbF8tPmxpbmtfbWFuYWdlcl8uUmVnaXN0ZXJMaW5rUHJvcGVydHlMaXN0ZW5lcihoYW5kbGVyLCBsaXN0ZW5lcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9sMmNhcF9sZV9tb2R1bGUuaCBiL2dkL2wyY2FwL2xlL2wyY2FwX2xlX21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWNhYmQyLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2wyY2FwX2xlX21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAibDJjYXAvbGUvZHluYW1pY19jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9maXhlZF9jaGFubmVsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9saW5rX3Byb3BlcnR5X2xpc3RlbmVyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2Ugc2hpbSB7Ci12b2lkIEwyQ0FfVXNlTGVnYWN5U2VjdXJpdHlNb2R1bGUoKTsKLX0KLQotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLWNsYXNzIFNlY3VyaXR5TW9kdWxlOwotfQotCi1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotY2xhc3MgTDJjYXBMZU1vZHVsZSA6IHB1YmxpYyBibHVldG9vdGg6Ok1vZHVsZSB7Ci0gcHVibGljOgotICBMMmNhcExlTW9kdWxlKCk7Ci0gIHZpcnR1YWwgfkwyY2FwTGVNb2R1bGUoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBhcGkgdG8gdGhlIExFIGZpeGVkIGNoYW5uZWwgbDJjYXAgbW9kdWxlCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxNYW5hZ2VyPiBHZXRGaXhlZENoYW5uZWxNYW5hZ2VyKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYXBpIHRvIHRoZSBMRSBkeW5hbWljIGNoYW5uZWwgbDJjYXAgbW9kdWxlCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljQ2hhbm5lbE1hbmFnZXI+IEdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBpbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW1wbD4gcGltcGxfOwotCi0gIGZyaWVuZCBzZWN1cml0eTo6U2VjdXJpdHlNb2R1bGU7Ci0gIGZyaWVuZCB2b2lkIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Vc2VMZWdhY3lTZWN1cml0eU1vZHVsZSgpOwotCi0gIC8qKgotICAgKiBPbmx5IGZvciB0aGUgTEUgc2VjdXJpdHkgbW9kdWxlIHRvIGluamVjdCBmdW5jdGlvbmFsaXR5IHRvIGVuZm9yY2Ugc2VjdXJpdHkgbGV2ZWwgZm9yIGEgY29ubmVjdGlvbi4gV2hlbiBMRQotICAgKiBzZWN1cml0eSBtb2R1bGUgaXMgc3RvcHBpbmcsIGluamVjdCBudWxscHRyLiBOb3RlOiBXZSBleHBlY3QgdGhpcyBvbmx5IHRvIGJlIGNhbGxlZCBkdXJpbmcgc3RhY2sgc3RhcnR1cC4gVGhpcyBpcwotICAgKiBub3Qgc3luY2hyb25pemVkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIEluamVjdFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoU2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSogc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBsaW5rIHByb3BlcnR5IGxpc3RlbmVyLgotICAgKiBUaGlzIGlzIG5vdCBzeW5jaHJvbml6ZWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgU2V0TGlua1Byb3BlcnR5TGlzdGVuZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIExpbmtQcm9wZXJ0eUxpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEwyY2FwTGVNb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2wyY2FwX2xlX21vZHVsZV9tb2NrLmggYi9nZC9sMmNhcC9sZS9sMmNhcF9sZV9tb2R1bGVfbW9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdkZGIwLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2wyY2FwX2xlX21vZHVsZV9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJsMmNhcC9sZS9sMmNhcF9sZV9tb2R1bGUuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLS8vIFVuaXQgdGVzdCBpbnRlcmZhY2VzCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrTDJjYXBMZU1vZHVsZSA6IHB1YmxpYyBMMmNhcExlTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHN0ZDo6dW5pcXVlX3B0cjxGaXhlZENoYW5uZWxNYW5hZ2VyPiwgR2V0Rml4ZWRDaGFubmVsTWFuYWdlciwgKCksIChvdmVycmlkZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9saW5rX29wdGlvbnMuY2MgYi9nZC9sMmNhcC9sZS9saW5rX29wdGlvbnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjc0ZWUuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvbGlua19vcHRpb25zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwL2xlL2xpbmtfb3B0aW9ucy5oIgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2ludGVybmFsL2xpbmsuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotTGlua09wdGlvbnM6OkxpbmtPcHRpb25zKGhjaTo6YWNsX21hbmFnZXI6OkxlQWNsQ29ubmVjdGlvbiogYWNsX2Nvbm5lY3Rpb24sIGludGVybmFsOjpMaW5rKiBsaW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyKQotICAgIDogYWNsX2Nvbm5lY3Rpb25fKGFjbF9jb25uZWN0aW9uKSwgbGlua18obGluayksIGwyY2FwX2hhbmRsZXJfKGwyY2FwX2hhbmRsZXIpIHt9Ci0KLWhjaTo6Um9sZSBMaW5rT3B0aW9uczo6R2V0Um9sZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGFjbF9jb25uZWN0aW9uXy0+R2V0Um9sZSgpOwotfQotCi11aW50MTZfdCBMaW5rT3B0aW9uczo6R2V0SGFuZGxlKCkgY29uc3QgewotICByZXR1cm4gYWNsX2Nvbm5lY3Rpb25fLT5HZXRIYW5kbGUoKTsKLX0KLQotaGNpOjpBZGRyZXNzV2l0aFR5cGUgTGlua09wdGlvbnM6OkdldExvY2FsQWRkcmVzcygpIGNvbnN0IHsKLSAgcmV0dXJuIGFjbF9jb25uZWN0aW9uXy0+R2V0TG9jYWxBZGRyZXNzKCk7Ci19Ci0KLWJvb2wgTGlua09wdGlvbnM6OlVwZGF0ZUNvbm5lY3Rpb25QYXJhbWV0ZXIodWludDE2X3QgY29ubl9pbnRlcnZhbF9taW4sIHVpbnQxNl90IGNvbm5faW50ZXJ2YWxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW5ndGgpIHsKLSAgaWYgKGNvbm5faW50ZXJ2YWxfbWluIDwgMHgwMDA2IHx8IGNvbm5faW50ZXJ2YWxfbWluID4gMHgwQzgwIHx8IGNvbm5faW50ZXJ2YWxfbWF4IDwgMHgwMDA2IHx8Ci0gICAgICBjb25uX2ludGVydmFsX21heCA+IDB4MEM4MCB8fCBjb25uX2xhdGVuY3kgPiAweDAxRjMgfHwgc3VwZXJ2aXNpb25fdGltZW91dCA8IDB4MDAwQSB8fAotICAgICAgc3VwZXJ2aXNpb25fdGltZW91dCA+IDB4MEM4MCkgewotICAgIExPR19FUlJPUigiSW52YWxpZCBwYXJhbWV0ZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBsMmNhcF9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6TGluazo6U2VuZENvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGUsIGNvbW1vbjo6VW5yZXRhaW5lZChsaW5rXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9pbnRlcnZhbF9taW4sIGNvbm5faW50ZXJ2YWxfbWF4LCBjb25uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2NlX2xlbmd0aCwgbWF4X2NlX2xlbmd0aCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExpbmtPcHRpb25zOjpTZXRQaHkodWludDhfdCBhbGxfcGh5cywgdWludDhfdCB0eF9waHlzLCB1aW50OF90IHJ4X3BoeXMsIHVpbnQxNl90IHBoeV9vcHRpb25zKSB7Ci0gIExPR19FUlJPUigiTm90IGltcGxlbWVudGVkIik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGxlCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL2wyY2FwL2xlL2xpbmtfb3B0aW9ucy5oIGIvZ2QvbDJjYXAvbGUvbGlua19vcHRpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzI2ZGYuLjAwMDAwMDAKLS0tIGEvZ2QvbDJjYXAvbGUvbGlua19vcHRpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvbGVfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotY2xhc3MgTGluazsKLX0KLQotLyoqCi0gKiBQcm94eSBmb3IgTDJDQVAgdXNlciB0byBnZXQgc29tZSBsaW5rIGxheWVyIHByb3BlcnRpZXMgKGNvbm5lY3Rpb24gaGFuZGxlLCByb2xlKSwgYW5kIHNldCBsaW5rIGxheWVyIG9wdGlvbnMKLSAqIChjb25uZWN0aW9uIHBhcmFtZXRlciB1cGRhdGUsIHNldCBQSFkpLiBPbmx5IGZldyBzcGVjaWFsIEwyQ0FQIHVzZXJzIG5lZWQgdG8gdXNlIGl0LCBpbmNsdWRpbmcgU2VjdXJpdHkgTWFuYWdlciwKLSAqIEhlYXJpbmcgQWlkIFByb2ZpbGUsIEhJRCBQcm9maWxlLCBhbmQgSmF2YSBBUEkuCi0gKiBOb3RlOiBTZXR0aW5nIGxpbmsgbGF5ZXIgb3B0aW9ucyBhcHBsaWVzIHRvIHRoZSBMSU5LLCBub3Qgc2luZ2xlIENIQU5ORUwuCi0gKi8KLWNsYXNzIExpbmtPcHRpb25zIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBHZXQgTEwgUm9sZS4gTW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIE5PVCBrbm93IGl0cyBMTCByb2xlLgotICAgKi8KLSAgaGNpOjpSb2xlIEdldFJvbGUoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0IEFDTCBIYW5kbGUuIE1vc3QgYXBwbGljYXRpb25zIHNob3VsZCBOT1Qga25vdyBpdHMgQUNMIGhhbmRsZS4KLSAgICovCi0gIHVpbnQxNl90IEdldEhhbmRsZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBSZXR1cm4gTG9jYWwgYWRkcmVzcyB1c2VkIGZvciBpbml0aWF0aW9uIG9mIHRoaXMgY29ubmVjdGlvbi4KLSAgICovCi0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldExvY2FsQWRkcmVzcygpIGNvbnN0OwotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIExFIGxpbmsgbGF5ZXIgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLgotICAgKiBEZXBlbmRpbmcgb24gdGhlIGxpbmsgcm9sZSBhbmQgc3VwcG9ydGVkIGZlYXR1cmVzLCBtYXkgZGlyZWN0bHkgc2VuZCBIQ0kgY29tbWFuZCB0byB1cGRhdGUgbGluaywgb3Igc2VuZCBMMkNBUAotICAgKiByZXF1ZXN0IHRvIGFkdmlzZSB0aGUgcmVtb3RlLiBUaGUgdXBkYXRlZCBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYXJlIHN0aWxsIGRldGVybWluZWQgYnkgY29udHJvbGxlci4gSXQncyBhIGxpbmsKLSAgICogbGF5ZXIgY2hhbmdlIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcsIGFuZCBubyBob3N0IGxheWVyIGNoYW5nZSBzaG91bGQgYmUgb2JzZXJ2YWJsZSBieSB1c2VyLgotICAgKiBQYXJhbWV0ZXJzIGFyZSBkZWZpbmVkIGluIENvcmUgc3BlYyBIQ0kgNy44LjE4LgotICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSByZXF1ZXN0IGlzIHNlbnQgdG8gY29udHJvbGxlciB0aHJvdWdoIEhDSSBvciByZW1vdGUgdGhyb3VnaCBMMkNBUAotICAgKiAoVXNlIGl0IG9ubHkgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISkKLSAgICovCi0gIGJvb2wgVXBkYXRlQ29ubmVjdGlvblBhcmFtZXRlcih1aW50MTZfdCBjb25uX2ludGVydmFsX21pbiwgdWludDE2X3QgY29ubl9pbnRlcnZhbF9tYXgsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW5ndGgsIHVpbnQxNl90IG1heF9jZV9sZW5ndGgpOwotCi0gIC8qKgotICAgKiBTZXQgUEhZIHByZWZlcmVuY2UuIFRoZSBQSFkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJvbGxlci4KLSAgICogTm8gaG9zdCBsYXllciBjaGFuZ2Ugc2hvdWxkIGJlIG9ic2VydmFibGUgYnkgdXNlci4KLSAgICogUGFyYW1ldGVycyBhcmUgZGVmaW5lZCBpbiBDb3JlIHNwZWMgSENJIDcuOC40OS4KLSAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIGNvbnRyb2xsZXIgdGhyb3VnaCBIQ0kKLSAgICogKFVzZSBpdCBvbmx5IGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEpCi0gICAqLwotICBib29sIFNldFBoeSh1aW50OF90IGFsbF9waHlzLCB1aW50OF90IHR4X3BoeXMsIHVpbnQ4X3QgcnhfcGh5cywgdWludDE2X3QgcGh5X29wdGlvbnMpOwotCi0gIExpbmtPcHRpb25zKGhjaTo6YWNsX21hbmFnZXI6OkxlQWNsQ29ubmVjdGlvbiogYWNsX2Nvbm5lY3Rpb24sIGludGVybmFsOjpMaW5rKiBsaW5rLCBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcik7Ci0KLSBwcml2YXRlOgotICBoY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24qIGFjbF9jb25uZWN0aW9uXyA9IG51bGxwdHI7Ci0gIGludGVybmFsOjpMaW5rKiBsaW5rXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBsMmNhcF9oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvbGlua19wcm9wZXJ0eV9saXN0ZW5lci5oIGIvZ2QvbDJjYXAvbGUvbGlua19wcm9wZXJ0eV9saXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWYxNzViLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL2xpbmtfcHJvcGVydHlfbGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBsZSB7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbGlzdGVuZXIgaW50ZXJmYWNlIGZvciBsaW5rIHByb3BlcnR5IGNhbGxiYWNrcy4KLSAqLwotY2xhc3MgTGlua1Byb3BlcnR5TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+TGlua1Byb3BlcnR5TGlzdGVuZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiBhbiBBQ0wgbGluayBpcyBjb25uZWN0ZWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25MaW5rQ29ubmVjdGVkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgdWludDE2X3QgaGFuZGxlLCBoY2k6OlJvbGUgbXlfcm9sZSkge30KLQotICAvKioKLSAgICogSW52b2tlZCB3aGVuIGFuIEFDTCBsaW5rIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlKSB7fQotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gcmVjZWl2ZWQgcmVtb3RlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gbGluawotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigKLSAgICAgIGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsCi0gICAgICB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsCi0gICAgICB1aW50MTZfdCBzdWJfdmVyc2lvbikge30KLQotICAvKioKLSAgICogSW52b2tlZCB3aGVuIHJlY2VpdmVkIGNvbm5lY3Rpb24gdXBkYXRlIGZvciBhIGdpdmVuIGxpbmsKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkNvbm5lY3Rpb25VcGRhdGUoCi0gICAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsCi0gICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9sYXRlbmN5LAotICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCkge30KLQotICAvKioKLSAgICogSW52b2tlZCB3aGVuIHJlY2VpdmVkIFBIWSB1cGRhdGUgZm9yIGEgZ2l2ZW4gbGluawotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uUGh5VXBkYXRlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5KSB7fQotCi0gIC8qKgotICAgKiBJbnZva2VkIHdoZW4gcmVjZWl2ZWQgZGF0YSBsZW5ndGggZXhjaGFuZ2UgZm9yIGEgZ2l2ZW4gbGluawotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uRGF0YUxlbmd0aENoYW5nZSgKLSAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgdWludDE2X3QgdHhfb2N0ZXRzLCB1aW50MTZfdCB0eF90aW1lLCB1aW50MTZfdCByeF9vY3RldHMsIHVpbnQxNl90IHJ4X3RpbWUpIHt9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbGUKLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvbGUvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmggYi9nZC9sMmNhcC9sZS9zZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiYzBkNy4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9sZS9zZWN1cml0eV9lbmZvcmNlbWVudF9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY29tbW9uL2NvbnRleHR1YWxfY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJsMmNhcC9sZS9zZWN1cml0eV9wb2xpY3kuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotbmFtZXNwYWNlIGxlIHsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBTZWN1cml0eSBNb2R1bGUgdG8gaW1wbGVtZW50LgotICovCi1jbGFzcyBTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdXNpbmcgUmVzdWx0Q2FsbGJhY2sgPSBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChib29sKT47Ci0KLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiBMMkNBUCBuZWVkcyB0byBvcGVuIGEgY2hhbm5lbCB3aXRoIGdpdmVuIHNlY3VyaXR5IHJlcXVpcmVtZW50LiBXaGVuIHRoZSBTZWN1cml0eSBNb2R1bGUgc2F0aXNmaWVzIHRoZQotICAgKiByZXF1aXJlZCBzZWN1cml0eSBsZXZlbCwgb3IgY2Fubm90IHNhdGlzZnkgYXQgYWxsLCBpbnZva2UgdGhlIHJlc3VsdF9jYWxsYmFjay4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBFbmZvcmNlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgU2VjdXJpdHlQb2xpY3kgcG9saWN5LCBSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9sZS9zZWN1cml0eV9wb2xpY3kuaCBiL2dkL2wyY2FwL2xlL3NlY3VyaXR5X3BvbGljeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y3YjU3Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL2xlL3NlY3VyaXR5X3BvbGljeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci1uYW1lc3BhY2UgbGUgewotCi1lbnVtIGNsYXNzIFNlY3VyaXR5UG9saWN5IHsKLSAgLy8gUHJlZGVmaW5lZCBzZWN1cml0eSBwb2xpY2llcyBmb3IgdXNlciB0byBwaWNrCi0KLSAgLy8gTm8gc2VjdXJpdHkgZW5mb3JjZWQKLSAgTk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LLAotCi0gIC8vIEp1c3QgZW5jcnlwdGlvbiwgYnV0IG5vIE1JVE0KLSAgRU5DUllQVEVEX1RSQU5TUE9SVCwKLQotICAvLyBJbXBsaWNpdGx5IE1JVE0gcHJvdGVjdGVkCi0gIEFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVCwKLQotICAvLyBTYW1lIGFzIEFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVAotICBCRVNULAotCi0gIF9OT1RfRk9SX1lPVV9fQVVUSEVOVElDQVRFRF9QQUlSSU5HX1dJVEhfMTI4X0JJVF9LRVksCi0gIF9OT1RfRk9SX1lPVV9fQVVUSE9SSVpBVElPTiwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9tdHUuaCBiL2dkL2wyY2FwL210dS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTliYzY0Li4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL210dS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotCi11c2luZyBNdHUgPSB1aW50MTZfdDsKLQotY29uc3RleHByIE10dSBrTWluaW11bUNsYXNzaWNNdHUgPSA0ODsKLWNvbnN0ZXhwciBNdHUga01pbmltdW1MZU10dSA9IDIzOwotY29uc3RleHByIE10dSBrRGVmYXVsdENsYXNzaWNNdHUgPSA2NzI7Ci0KLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvcHNtLmggYi9nZC9sMmNhcC9wc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4OWU2Mi4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9wc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotCi11c2luZyBQc20gPSB1aW50MTZfdDsKLWNvbnN0ZXhwciBQc20ga0RlZmF1bHRQc20gPSAwOyAgLy8gSW52YWxpZCBQc20gYXMgYSBkZWZhdWx0IHZhbHVlCi0KLWNvbnN0ZXhwciBib29sIElzUHNtVmFsaWQoUHNtIHBzbSkgewotICAvLyBTZWUgQ29yZSBzcGVjIDUuMSBWb2wgMyBQYXJ0IEEgNC4yIGZvciBkZWZpbml0aW9uCi0gIHJldHVybiAocHNtICYgMHgwMTAxdSkgPT0gMHgwMDAxdTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9sMmNhcC9zaWduYWxfaWQuaCBiL2dkL2wyY2FwL3NpZ25hbF9pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDM3MmIxLi4wMDAwMDAwCi0tLSBhL2dkL2wyY2FwL3NpZ25hbF9pZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsMmNhcCB7Ci0KLXN0cnVjdCBTaWduYWxJZCB7Ci0gcHVibGljOgotICBjb25zdGV4cHIgU2lnbmFsSWQodWludDhfdCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gIGNvbnN0ZXhwciBTaWduYWxJZCgpIDogdmFsdWVfKDEpIHt9Ci0gIH5TaWduYWxJZCgpID0gZGVmYXVsdDsKLQotICB1aW50OF90IFZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICBib29sIElzVmFsaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXyAhPSAwOwotICB9Ci0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTaWduYWxJZCYgbGhzLCBjb25zdCBTaWduYWxJZCYgcmhzKTsKLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTaWduYWxJZCYgbGhzLCBjb25zdCBTaWduYWxJZCYgcmhzKTsKLQotICBzdHJ1Y3QgU2lnbmFsSWQmIG9wZXJhdG9yKysoKTsgICAgLy8gUHJlZml4IGluY3JlbWVudCBvcGVyYXRvci4KLSAgc3RydWN0IFNpZ25hbElkIG9wZXJhdG9yKysoaW50KTsgIC8vIFBvc3RmaXggaW5jcmVtZW50IG9wZXJhdG9yLgotICBzdHJ1Y3QgU2lnbmFsSWQmIG9wZXJhdG9yLS0oKTsgICAgLy8gUHJlZml4IGRlY3JlbWVudCBvcGVyYXRvci4KLSAgc3RydWN0IFNpZ25hbElkIG9wZXJhdG9yLS0oaW50KTsgIC8vIFBvc3RmaXggZGVjcmVtZW50IG9wZXJhdG9yLgotCi0gcHJpdmF0ZToKLSAgdWludDhfdCB2YWx1ZV87Ci19OwotCi1jb25zdGV4cHIgU2lnbmFsSWQga0ludmFsaWRTaWduYWxJZHswfTsKLWNvbnN0ZXhwciBTaWduYWxJZCBrSW5pdGlhbFNpZ25hbElkezF9OwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNpZ25hbElkJiBsaHMsIGNvbnN0IFNpZ25hbElkJiByaHMpIHsKLSAgcmV0dXJuIGxocy52YWx1ZV8gPT0gcmhzLnZhbHVlXzsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTaWduYWxJZCYgbGhzLCBjb25zdCBTaWduYWxJZCYgcmhzKSB7Ci0gIHJldHVybiAhKGxocyA9PSByaHMpOwotfQotCi1pbmxpbmUgc3RydWN0IFNpZ25hbElkJiBTaWduYWxJZDo6b3BlcmF0b3IrKygpIHsKLSAgdmFsdWVfKys7Ci0gIGlmICh2YWx1ZV8gPT0gMCkgdmFsdWVfKys7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotaW5saW5lIHN0cnVjdCBTaWduYWxJZCBTaWduYWxJZDo6b3BlcmF0b3IrKyhpbnQpIHsKLSAgc3RydWN0IFNpZ25hbElkIHRtcCA9ICp0aGlzOwotICArKyp0aGlzOwotICByZXR1cm4gdG1wOwotfQotCi1pbmxpbmUgc3RydWN0IFNpZ25hbElkJiBTaWduYWxJZDo6b3BlcmF0b3ItLSgpIHsKLSAgdmFsdWVfLS07Ci0gIGlmICh2YWx1ZV8gPT0gMCkgdmFsdWVfID0gMHhmZjsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1pbmxpbmUgc3RydWN0IFNpZ25hbElkIFNpZ25hbElkOjpvcGVyYXRvci0tKGludCkgewotICBzdHJ1Y3QgU2lnbmFsSWQgdG1wID0gKnRoaXM7Ci0gIC0tKnRoaXM7Ci0gIHJldHVybiB0bXA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsMmNhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbDJjYXAvc2lnbmFsX2lkX3Rlc3QuY2MgYi9nZC9sMmNhcC9zaWduYWxfaWRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5NTQyNS4uMDAwMDAwMAotLS0gYS9nZC9sMmNhcC9zaWduYWxfaWRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAibDJjYXAvc2lnbmFsX2lkLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGwyY2FwIHsKLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgdmFsaWRfdmFsdWVzKSB7Ci0gIGludCB2YWxpZCA9IDA7Ci0gIHVpbnQ4X3QgaSA9IDA7Ci0gIHdoaWxlICgrK2kgIT0gMCkgewotICAgIFNpZ25hbElkIHNpZ25hbF9pZChpKTsKLSAgICBpZiAoc2lnbmFsX2lkLklzVmFsaWQoKSkgewotICAgICAgdmFsaWQrKzsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUX1RSVUUodmFsaWQgPT0gMjU1KTsKLX0KLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgemVyb19pbnZhbGlkKSB7Ci0gIFNpZ25hbElkIHNpZ25hbF9pZCgwKTsKLSAgQVNTRVJUX0ZBTFNFKHNpZ25hbF9pZC5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKEwyY2FwU2lnbmFsSWRUZXN0LCBwcmVfaW5jcmVtZW50KSB7Ci0gIFNpZ25hbElkIHNpZ25hbF9pZCgwKTsKLSAgQVNTRVJUX0ZBTFNFKHNpZ25hbF9pZC5Jc1ZhbGlkKCkpOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSAhPSAweGZmOyArK2ksICsrc2lnbmFsX2lkKSB7Ci0gICAgQVNTRVJUX1RSVUUoaSA9PSBzaWduYWxfaWQuVmFsdWUoKSk7Ci0gIH0KLX0KLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgcG9zdF9pbmNyZW1lbnQpIHsKLSAgU2lnbmFsSWQgc2lnbmFsX2lkKDApOwotICBBU1NFUlRfRkFMU0Uoc2lnbmFsX2lkLklzVmFsaWQoKSk7Ci0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpICE9IDB4ZmY7IGkrKywgc2lnbmFsX2lkKyspIHsKLSAgICBBU1NFUlRfVFJVRShpID09IHNpZ25hbF9pZC5WYWx1ZSgpKTsKLSAgfQotfQotCi1URVNUKEwyY2FwU2lnbmFsSWRUZXN0LCBhbG1vc3Rfd3JhcF91cCkgewotICBTaWduYWxJZCBzaWduYWxfaWQoMCk7Ci0gIEFTU0VSVF9GQUxTRShzaWduYWxfaWQuSXNWYWxpZCgpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7Ci0gICAgc2lnbmFsX2lkKys7Ci0gIH0KLSAgQVNTRVJUX0VRKDB4ZmYsIHNpZ25hbF9pZC5WYWx1ZSgpKTsKLX0KLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgd3JhcF91cCkgewotICBTaWduYWxJZCBzaWduYWxfaWQoMCk7Ci0gIEFTU0VSVF9GQUxTRShzaWduYWxfaWQuSXNWYWxpZCgpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgc2lnbmFsX2lkKys7Ci0gIH0KLSAgQVNTRVJUX0VRKDEsIHNpZ25hbF9pZC5WYWx1ZSgpKTsKLX0KLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgcHJlX2RlY3JlbWVudCkgewotICBTaWduYWxJZCBzaWduYWxfaWQoMCk7Ci0gIEFTU0VSVF9GQUxTRShzaWduYWxfaWQuSXNWYWxpZCgpKTsKLQotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgIT0gMHhmZjsgLS1pLCAtLXNpZ25hbF9pZCkgewotICAgIEFTU0VSVF9UUlVFKGkgPT0gc2lnbmFsX2lkLlZhbHVlKCkpOwotICB9Ci19Ci0KLVRFU1QoTDJjYXBTaWduYWxJZFRlc3QsIHBvc3RfZGVjcmVtZW50KSB7Ci0gIFNpZ25hbElkIHNpZ25hbF9pZCgwKTsKLSAgQVNTRVJUX0ZBTFNFKHNpZ25hbF9pZC5Jc1ZhbGlkKCkpOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSAhPSAweGZmOyBpLS0sIHNpZ25hbF9pZC0tKSB7Ci0gICAgQVNTRVJUX1RSVUUoaSA9PSBzaWduYWxfaWQuVmFsdWUoKSk7Ci0gIH0KLX0KLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgYWxtb3N0X3dyYXBfZG93bikgewotICBTaWduYWxJZCBzaWduYWxfaWQoMCk7Ci0gIEFTU0VSVF9GQUxTRShzaWduYWxfaWQuSXNWYWxpZCgpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7Ci0gICAgc2lnbmFsX2lkLS07Ci0gIH0KLSAgQVNTRVJUX0VRKDEsIHNpZ25hbF9pZC5WYWx1ZSgpKTsKLX0KLQotVEVTVChMMmNhcFNpZ25hbElkVGVzdCwgd3JhcF9kb3duKSB7Ci0gIFNpZ25hbElkIHNpZ25hbF9pZCgwKTsKLSAgQVNTRVJUX0ZBTFNFKHNpZ25hbF9pZC5Jc1ZhbGlkKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICBzaWduYWxfaWQtLTsKLSAgfQotICBBU1NFUlRfRVEoMHhmZiwgc2lnbmFsX2lkLlZhbHVlKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL21vZHVsZS5jYyBiL2dkL21vZHVsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0NDQ4NS4uMDAwMDAwMAotLS0gYS9nZC9tb2R1bGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiQnRHZE1vZHVsZSIKLQotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgImNvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiZHVtcHN5cy9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAib3Mvd2FrZWxvY2tfbWFuYWdlci5oIgotCi11c2luZyA6OmJsdWV0b290aDo6b3M6OkhhbmRsZXI7Ci11c2luZyA6OmJsdWV0b290aDo6b3M6OlRocmVhZDsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpvczo6V2FrZWxvY2tNYW5hZ2VyOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY29uc3RleHByIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga01vZHVsZVN0b3BUaW1lb3V0ID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDAwKTsKLQotTW9kdWxlRmFjdG9yeTo6TW9kdWxlRmFjdG9yeShzdGQ6OmZ1bmN0aW9uPE1vZHVsZSooKT4gY3RvcikgOiBjdG9yXyhjdG9yKSB7Ci19Ci0KLUhhbmRsZXIqIE1vZHVsZTo6R2V0SGFuZGxlcigpIGNvbnN0IHsKLSAgQVNTRVJUX0xPRyhoYW5kbGVyXyAhPSBudWxscHRyLCAiQ2FuJ3QgZ2V0IGhhbmRsZXIgd2hlbiBpdCdzIG5vdCBzdGFydGVkIik7Ci0gIHJldHVybiBoYW5kbGVyXzsKLX0KLQotRHVtcHN5c0RhdGFGaW5pc2hlciBFbXB0eUR1bXBzeXNEYXRhRmluaXNoZXIgPSBbXShEdW1wc3lzRGF0YUJ1aWxkZXIqIGR1bXBzeXNfZGF0YV9idWlsZGVyKSB7fTsKLUR1bXBzeXNEYXRhRmluaXNoZXIgTW9kdWxlOjpHZXREdW1wc3lzRGF0YShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGJ1aWxkZXIpIGNvbnN0IHsKLSAgcmV0dXJuIEVtcHR5RHVtcHN5c0RhdGFGaW5pc2hlcjsKLX0KLQotY29uc3QgTW9kdWxlUmVnaXN0cnkqIE1vZHVsZTo6R2V0TW9kdWxlUmVnaXN0cnkoKSBjb25zdCB7Ci0gIHJldHVybiByZWdpc3RyeV87Ci19Ci0KLU1vZHVsZSogTW9kdWxlOjpHZXREZXBlbmRlbmN5KGNvbnN0IE1vZHVsZUZhY3RvcnkqIG1vZHVsZSkgY29uc3QgewotICBmb3IgKGF1dG8mIGRlcGVuZGVuY3kgOiBkZXBlbmRlbmNpZXNfLmxpc3RfKSB7Ci0gICAgaWYgKGRlcGVuZGVuY3kgPT0gbW9kdWxlKSB7Ci0gICAgICByZXR1cm4gcmVnaXN0cnlfLT5HZXQobW9kdWxlKTsKLSAgICB9Ci0gIH0KLQotICBBU1NFUlRfTE9HKGZhbHNlLCAiTW9kdWxlIHdhcyBub3QgbGlzdGVkIGFzIGEgZGVwZW5kZW5jeSBpbiBMaXN0RGVwZW5kZW5jaWVzIik7Ci19Ci0KLU1vZHVsZSogTW9kdWxlUmVnaXN0cnk6OkdldChjb25zdCBNb2R1bGVGYWN0b3J5KiBtb2R1bGUpIGNvbnN0IHsKLSAgYXV0byBpbnN0YW5jZSA9IHN0YXJ0ZWRfbW9kdWxlc18uZmluZChtb2R1bGUpOwotICBBU1NFUlRfTE9HKGluc3RhbmNlICE9IHN0YXJ0ZWRfbW9kdWxlc18uZW5kKCksICJSZXF1ZXN0IGZvciBtb2R1bGUgbm90IHN0YXJ0ZWQgdXAsIG1heWJlIG5vdCBpbiBTdGFydChNb2R1bGVMaXN0KT8iKTsKLSAgcmV0dXJuIGluc3RhbmNlLT5zZWNvbmQ7Ci19Ci0KLWJvb2wgTW9kdWxlUmVnaXN0cnk6OklzU3RhcnRlZChjb25zdCBNb2R1bGVGYWN0b3J5KiBtb2R1bGUpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXJ0ZWRfbW9kdWxlc18uZmluZChtb2R1bGUpICE9IHN0YXJ0ZWRfbW9kdWxlc18uZW5kKCk7Ci19Ci0KLXZvaWQgTW9kdWxlUmVnaXN0cnk6OlN0YXJ0KE1vZHVsZUxpc3QqIG1vZHVsZXMsIFRocmVhZCogdGhyZWFkKSB7Ci0gIGZvciAoYXV0byBpdCA9IG1vZHVsZXMtPmxpc3RfLmJlZ2luKCk7IGl0ICE9IG1vZHVsZXMtPmxpc3RfLmVuZCgpOyBpdCsrKSB7Ci0gICAgU3RhcnQoKml0LCB0aHJlYWQpOwotICB9Ci19Ci0KLXZvaWQgTW9kdWxlUmVnaXN0cnk6OnNldF9yZWdpc3RyeV9hbmRfaGFuZGxlcihNb2R1bGUqIGluc3RhbmNlLCBUaHJlYWQqIHRocmVhZCkgY29uc3QgewotICBpbnN0YW5jZS0+cmVnaXN0cnlfID0gdGhpczsKLSAgaW5zdGFuY2UtPmhhbmRsZXJfID0gbmV3IEhhbmRsZXIodGhyZWFkKTsKLX0KLQotTW9kdWxlKiBNb2R1bGVSZWdpc3RyeTo6U3RhcnQoY29uc3QgTW9kdWxlRmFjdG9yeSogbW9kdWxlLCBUaHJlYWQqIHRocmVhZCkgewotICBhdXRvIHN0YXJ0ZWRfaW5zdGFuY2UgPSBzdGFydGVkX21vZHVsZXNfLmZpbmQobW9kdWxlKTsKLSAgaWYgKHN0YXJ0ZWRfaW5zdGFuY2UgIT0gc3RhcnRlZF9tb2R1bGVzXy5lbmQoKSkgewotICAgIHJldHVybiBzdGFydGVkX2luc3RhbmNlLT5zZWNvbmQ7Ci0gIH0KLQotICBMT0dfREVCVUcoIkNvbnN0cnVjdGluZyBuZXh0IG1vZHVsZSIpOwotICBNb2R1bGUqIGluc3RhbmNlID0gbW9kdWxlLT5jdG9yXygpOwotICBsYXN0X2luc3RhbmNlXyA9ICJzdGFydGluZyAiICsgaW5zdGFuY2UtPlRvU3RyaW5nKCk7Ci0gIHNldF9yZWdpc3RyeV9hbmRfaGFuZGxlcihpbnN0YW5jZSwgdGhyZWFkKTsKLQotICBMT0dfREVCVUcoIlN0YXJ0aW5nIGRlcGVuZGVuY2llcyBvZiAlcyIsIGluc3RhbmNlLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBpbnN0YW5jZS0+TGlzdERlcGVuZGVuY2llcygmaW5zdGFuY2UtPmRlcGVuZGVuY2llc18pOwotICBTdGFydCgmaW5zdGFuY2UtPmRlcGVuZGVuY2llc18sIHRocmVhZCk7Ci0KLSAgTE9HX0RFQlVHKCJGaW5pc2hlZCBzdGFydGluZyBkZXBlbmRlbmNpZXMgYW5kIGNhbGxpbmcgU3RhcnQoKSBvZiAlcyIsIGluc3RhbmNlLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGluc3RhbmNlLT5TdGFydCgpOwotICBzdGFydF9vcmRlcl8ucHVzaF9iYWNrKG1vZHVsZSk7Ci0gIHN0YXJ0ZWRfbW9kdWxlc19bbW9kdWxlXSA9IGluc3RhbmNlOwotICBMT0dfREVCVUcoIlN0YXJ0ZWQgJXMiLCBpbnN0YW5jZS0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi12b2lkIE1vZHVsZVJlZ2lzdHJ5OjpTdG9wQWxsKCkgewotICAvLyBTaW5jZSBtb2R1bGVzIHdlcmUgYnJvdWdodCB1cCBpbiBkZXBlbmRlbmN5IG9yZGVyLCBpdCBpcyBzYWZlIHRvIHRlYXIgZG93biBieSBnb2luZyBpbiByZXZlcnNlIG9yZGVyLgotICBmb3IgKGF1dG8gaXQgPSBzdGFydF9vcmRlcl8ucmJlZ2luKCk7IGl0ICE9IHN0YXJ0X29yZGVyXy5yZW5kKCk7IGl0KyspIHsKLSAgICBhdXRvIGluc3RhbmNlID0gc3RhcnRlZF9tb2R1bGVzXy5maW5kKCppdCk7Ci0gICAgQVNTRVJUKGluc3RhbmNlICE9IHN0YXJ0ZWRfbW9kdWxlc18uZW5kKCkpOwotICAgIGxhc3RfaW5zdGFuY2VfID0gInN0b3BwaW5nICIgKyBpbnN0YW5jZS0+c2Vjb25kLT5Ub1N0cmluZygpOwotCi0gICAgLy8gQ2xlYXIgdGhlIGhhbmRsZXIgYmVmb3JlIHN0b3BwaW5nIHRoZSBtb2R1bGUgdG8gYWxsb3cgaXQgdG8gc2h1dCBkb3duIGdyYWNlZnVsbHkuCi0gICAgTE9HX0lORk8oIlN0b3BwaW5nIEhhbmRsZXIgb2YgTW9kdWxlICVzIiwgaW5zdGFuY2UtPnNlY29uZC0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBpbnN0YW5jZS0+c2Vjb25kLT5oYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBpbnN0YW5jZS0+c2Vjb25kLT5oYW5kbGVyXy0+V2FpdFVudGlsU3RvcHBlZChrTW9kdWxlU3RvcFRpbWVvdXQpOwotICAgIExPR19JTkZPKCJTdG9wcGluZyBNb2R1bGUgJXMiLCBpbnN0YW5jZS0+c2Vjb25kLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGluc3RhbmNlLT5zZWNvbmQtPlN0b3AoKTsKLSAgfQotICBmb3IgKGF1dG8gaXQgPSBzdGFydF9vcmRlcl8ucmJlZ2luKCk7IGl0ICE9IHN0YXJ0X29yZGVyXy5yZW5kKCk7IGl0KyspIHsKLSAgICBhdXRvIGluc3RhbmNlID0gc3RhcnRlZF9tb2R1bGVzXy5maW5kKCppdCk7Ci0gICAgQVNTRVJUKGluc3RhbmNlICE9IHN0YXJ0ZWRfbW9kdWxlc18uZW5kKCkpOwotICAgIGRlbGV0ZSBpbnN0YW5jZS0+c2Vjb25kLT5oYW5kbGVyXzsKLSAgICBkZWxldGUgaW5zdGFuY2UtPnNlY29uZDsKLSAgICBzdGFydGVkX21vZHVsZXNfLmVyYXNlKGluc3RhbmNlKTsKLSAgfQotCi0gIEFTU0VSVChzdGFydGVkX21vZHVsZXNfLmVtcHR5KCkpOwotICBzdGFydF9vcmRlcl8uY2xlYXIoKTsKLX0KLQotb3M6OkhhbmRsZXIqIE1vZHVsZVJlZ2lzdHJ5OjpHZXRNb2R1bGVIYW5kbGVyKGNvbnN0IE1vZHVsZUZhY3RvcnkqIG1vZHVsZSkgY29uc3QgewotICBhdXRvIHN0YXJ0ZWRfaW5zdGFuY2UgPSBzdGFydGVkX21vZHVsZXNfLmZpbmQobW9kdWxlKTsKLSAgaWYgKHN0YXJ0ZWRfaW5zdGFuY2UgIT0gc3RhcnRlZF9tb2R1bGVzXy5lbmQoKSkgewotICAgIHJldHVybiBzdGFydGVkX2luc3RhbmNlLT5zZWNvbmQtPkdldEhhbmRsZXIoKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBNb2R1bGVEdW1wZXI6OkR1bXBTdGF0ZShzdGQ6OnN0cmluZyogb3V0cHV0KSBjb25zdCB7Ci0gIEFTU0VSVChvdXRwdXQgIT0gbnVsbHB0cik7Ci0KLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIoMTAyNCk7Ci0gIGF1dG8gdGl0bGUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZyh0aXRsZV8pOwotCi0gIGF1dG8gaW5pdF9mbGFnc19vZmZzZXQgPSBkdW1wc3lzOjpJbml0RmxhZ3M6OkR1bXAoJmJ1aWxkZXIpOwotICBhdXRvIHdha2Vsb2NrX29mZnNldCA9IFdha2Vsb2NrTWFuYWdlcjo6R2V0KCkuR2V0RHVtcHN5c0RhdGEoJmJ1aWxkZXIpOwotCi0gIHN0ZDo6cXVldWU8RHVtcHN5c0RhdGFGaW5pc2hlcj4gcXVldWU7Ci0gIGZvciAoYXV0byBpdCA9IG1vZHVsZV9yZWdpc3RyeV8uc3RhcnRfb3JkZXJfLnJiZWdpbigpOyBpdCAhPSBtb2R1bGVfcmVnaXN0cnlfLnN0YXJ0X29yZGVyXy5yZW5kKCk7IGl0KyspIHsKLSAgICBhdXRvIGluc3RhbmNlID0gbW9kdWxlX3JlZ2lzdHJ5Xy5zdGFydGVkX21vZHVsZXNfLmZpbmQoKml0KTsKLSAgICBBU1NFUlQoaW5zdGFuY2UgIT0gbW9kdWxlX3JlZ2lzdHJ5Xy5zdGFydGVkX21vZHVsZXNfLmVuZCgpKTsKLSAgICBxdWV1ZS5wdXNoKGluc3RhbmNlLT5zZWNvbmQtPkdldER1bXBzeXNEYXRhKCZidWlsZGVyKSk7Ci0gIH0KLQotICBEdW1wc3lzRGF0YUJ1aWxkZXIgZGF0YV9idWlsZGVyKGJ1aWxkZXIpOwotICBkYXRhX2J1aWxkZXIuYWRkX3RpdGxlKHRpdGxlKTsKLSAgZGF0YV9idWlsZGVyLmFkZF9pbml0X2ZsYWdzKGluaXRfZmxhZ3Nfb2Zmc2V0KTsKLSAgZGF0YV9idWlsZGVyLmFkZF93YWtlbG9ja19tYW5hZ2VyX2RhdGEod2FrZWxvY2tfb2Zmc2V0KTsKLQotICB3aGlsZSAoIXF1ZXVlLmVtcHR5KCkpIHsKLSAgICBxdWV1ZS5mcm9udCgpKCZkYXRhX2J1aWxkZXIpOwotICAgIHF1ZXVlLnBvcCgpOwotICB9Ci0KLSAgYnVpbGRlci5GaW5pc2goZGF0YV9idWlsZGVyLkZpbmlzaCgpKTsKLSAgKm91dHB1dCA9IHN0ZDo6c3RyaW5nKGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpLCBidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSArIGJ1aWxkZXIuR2V0U2l6ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbW9kdWxlLmggYi9nZC9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjMDU2NC4uMDAwMDAwMAotLS0gYS9nZC9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmg+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImR1bXBzeXNfZGF0YV9nZW5lcmF0ZWQuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBNb2R1bGU7Ci1jbGFzcyBNb2R1bGVEdW1wZXI7Ci1jbGFzcyBNb2R1bGVSZWdpc3RyeTsKLWNsYXNzIFRlc3RNb2R1bGVSZWdpc3RyeTsKLWNsYXNzIEZ1enpUZXN0TW9kdWxlUmVnaXN0cnk7Ci0KLWNsYXNzIE1vZHVsZUZhY3RvcnkgewotIGZyaWVuZCBNb2R1bGVSZWdpc3RyeTsKLSBmcmllbmQgRnV6elRlc3RNb2R1bGVSZWdpc3RyeTsKLQotcHVibGljOgotIE1vZHVsZUZhY3Rvcnkoc3RkOjpmdW5jdGlvbjxNb2R1bGUqKCk+IGN0b3IpOwotCi1wcml2YXRlOgotIHN0ZDo6ZnVuY3Rpb248TW9kdWxlKigpPiBjdG9yXzsKLX07Ci0KLWNsYXNzIE1vZHVsZUxpc3QgewotIGZyaWVuZCBNb2R1bGU7Ci0gZnJpZW5kIE1vZHVsZVJlZ2lzdHJ5OwotCi1wdWJsaWM6Ci0gdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gdm9pZCBhZGQoKSB7Ci0gICBsaXN0Xy5wdXNoX2JhY2soJlQ6OkZhY3RvcnkpOwotIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPGNvbnN0IE1vZHVsZUZhY3RvcnkqPiBsaXN0XzsKLX07Ci0KLXVzaW5nIER1bXBzeXNEYXRhRmluaXNoZXIgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoRHVtcHN5c0RhdGFCdWlsZGVyKiBkdW1wc3lzX2RhdGFfYnVpbGRlcik+OwotCi0vLyBFYWNoIGxlYWYgbm9kZSBtb2R1bGUgbXVzdCBoYXZlIGEgZmFjdG9yeSBsaWtlIHNvOgotLy8KLS8vIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0vLwotLy8gd2hpY2ggd2lsbCBwcm92aWRlIGEgY29uc3RydWN0b3IgZm9yIHRoZSBtb2R1bGUgcmVnaXN0cnkgdG8gY2FsbC4KLS8vIFRoZSBtb2R1bGUgcmVnaXN0cnkgd2lsbCBhbHNvIHVzZSB0aGUgZmFjdG9yeSBhcyB0aGUgaWRlbnRpZmllcgotLy8gZm9yIHRoYXQgbW9kdWxlLgotY2xhc3MgTW9kdWxlIHsKLSAgZnJpZW5kIE1vZHVsZUR1bXBlcjsKLSAgZnJpZW5kIE1vZHVsZVJlZ2lzdHJ5OwotICBmcmllbmQgVGVzdE1vZHVsZVJlZ2lzdHJ5OwotCi0gcHVibGljOgotICB2aXJ0dWFsIH5Nb2R1bGUoKSA9IGRlZmF1bHQ7Ci0gcHJvdGVjdGVkOgotICAvLyBQb3B1bGF0ZSB0aGUgcHJvdmlkZWQgbGlzdCB3aXRoIG1vZHVsZXMgdGhhdCBtdXN0IHN0YXJ0IGJlZm9yZSB5b3VycwotICB2aXJ0dWFsIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCA9IDA7Ci0KLSAgLy8gWW91IGNhbiBncmFiIHlvdXIgc3RhcnRlZCBkZXBlbmRlbmNpZXMgZHVyaW5nIG9yIGFmdGVyIHRoaXMgY2FsbAotICAvLyB1c2luZyBHZXREZXBlbmRlbmN5KCksIG9yIGFjY2VzcyB0aGUgbW9kdWxlIHJlZ2lzdHJ5IHZpYSBHZXRNb2R1bGVSZWdpc3RyeSgpCi0gIHZpcnR1YWwgdm9pZCBTdGFydCgpID0gMDsKLQotICAvLyBSZWxlYXNlIGFsbCByZXNvdXJjZXMsIHlvdSdyZSBhYm91dCB0byBiZSBkZWxldGVkCi0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOwotCi0gIC8vIEdldCByZWxldmFudCBzdGF0ZSBkYXRhIGZyb20gdGhlIG1vZHVsZQotICB2aXJ0dWFsIER1bXBzeXNEYXRhRmluaXNoZXIgR2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBidWlsZGVyKSBjb25zdDsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgPSAwOwotCi0gIDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogR2V0SGFuZGxlcigpIGNvbnN0OwotCi0gIGNvbnN0IE1vZHVsZVJlZ2lzdHJ5KiBHZXRNb2R1bGVSZWdpc3RyeSgpIGNvbnN0OwotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBUKiBHZXREZXBlbmRlbmN5KCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oR2V0RGVwZW5kZW5jeSgmVDo6RmFjdG9yeSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIHZvaWQgQ2FsbChGdW5jdG9yJiYgZnVuY3RvciwgQXJncyYmLi4uIGFyZ3MpIHsKLSAgICBHZXRIYW5kbGVyKCktPkNhbGwoc3RkOjpmb3J3YXJkPEZ1bmN0b3I+KGZ1bmN0b3IpLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIHZvaWQgQ2FsbE9uKFQqIG9iaiwgRnVuY3RvciYmIGZ1bmN0b3IsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgR2V0SGFuZGxlcigpLT5DYWxsT24ob2JqLCBzdGQ6OmZvcndhcmQ8RnVuY3Rvcj4oZnVuY3RvciksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1vZHVsZSogR2V0RGVwZW5kZW5jeShjb25zdCBNb2R1bGVGYWN0b3J5KiBtb2R1bGUpIGNvbnN0OwotCi0gIDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogaGFuZGxlcl8gPSBudWxscHRyOwotICBNb2R1bGVMaXN0IGRlcGVuZGVuY2llc187Ci0gIGNvbnN0IE1vZHVsZVJlZ2lzdHJ5KiByZWdpc3RyeV87Ci19OwotCi1jbGFzcyBNb2R1bGVSZWdpc3RyeSB7Ci0gZnJpZW5kIE1vZHVsZTsKLSBmcmllbmQgTW9kdWxlRHVtcGVyOwotIGZyaWVuZCBjbGFzcyBTdGFja01hbmFnZXI7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgYm9vbCBJc1N0YXJ0ZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIElzU3RhcnRlZCgmVDo6RmFjdG9yeSk7Ci0gIH0KLQotICBib29sIElzU3RhcnRlZChjb25zdCBNb2R1bGVGYWN0b3J5KiBmYWN0b3J5KSBjb25zdDsKLQotICAvLyBTdGFydCBhbGwgdGhlIG1vZHVsZXMgb24gdGhpcyBsaXN0IGFuZCB0aGVpciBkZXBlbmRlbmNpZXMKLSAgLy8gaW4gZGVwZW5kZW5jeSBvcmRlcgotICB2b2lkIFN0YXJ0KE1vZHVsZUxpc3QqIG1vZHVsZXMsIDo6Ymx1ZXRvb3RoOjpvczo6VGhyZWFkKiB0aHJlYWQpOwotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBUKiBTdGFydCg6OmJsdWV0b290aDo6b3M6OlRocmVhZCogdGhyZWFkKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihTdGFydCgmVDo6RmFjdG9yeSwgdGhyZWFkKSk7Ci0gIH0KLQotICBNb2R1bGUqIFN0YXJ0KGNvbnN0IE1vZHVsZUZhY3RvcnkqIGlkLCA6OmJsdWV0b290aDo6b3M6OlRocmVhZCogdGhyZWFkKTsKLQotICAvLyBTdG9wIGFsbCBydW5uaW5nIG1vZHVsZXMgaW4gcmV2ZXJzZSBvcmRlciBvZiBzdGFydAotICB2b2lkIFN0b3BBbGwoKTsKLQotIHByb3RlY3RlZDoKLSAgTW9kdWxlKiBHZXQoY29uc3QgTW9kdWxlRmFjdG9yeSogbW9kdWxlKSBjb25zdDsKLQotICB2b2lkIHNldF9yZWdpc3RyeV9hbmRfaGFuZGxlcihNb2R1bGUqIGluc3RhbmNlLCA6OmJsdWV0b290aDo6b3M6OlRocmVhZCogdGhyZWFkKSBjb25zdDsKLQotICBvczo6SGFuZGxlciogR2V0TW9kdWxlSGFuZGxlcihjb25zdCBNb2R1bGVGYWN0b3J5KiBtb2R1bGUpIGNvbnN0OwotCi0gIHN0ZDo6bWFwPGNvbnN0IE1vZHVsZUZhY3RvcnkqLCBNb2R1bGUqPiBzdGFydGVkX21vZHVsZXNfOwotICBzdGQ6OnZlY3Rvcjxjb25zdCBNb2R1bGVGYWN0b3J5Kj4gc3RhcnRfb3JkZXJfOwotICBzdGQ6OnN0cmluZyBsYXN0X2luc3RhbmNlXzsKLX07Ci0KLWNsYXNzIE1vZHVsZUR1bXBlciB7Ci0gcHVibGljOgotICBNb2R1bGVEdW1wZXIoY29uc3QgTW9kdWxlUmVnaXN0cnkmIG1vZHVsZV9yZWdpc3RyeSwgY29uc3QgY2hhciogdGl0bGUpCi0gICAgICA6IG1vZHVsZV9yZWdpc3RyeV8obW9kdWxlX3JlZ2lzdHJ5KSwgdGl0bGVfKHRpdGxlKSB7fQotICB2b2lkIER1bXBTdGF0ZShzdGQ6OnN0cmluZyogb3V0cHV0KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1vZHVsZVJlZ2lzdHJ5JiBtb2R1bGVfcmVnaXN0cnlfOwotICBjb25zdCBzdGQ6OnN0cmluZyB0aXRsZV87Ci19OwotCi1jbGFzcyBUZXN0TW9kdWxlUmVnaXN0cnkgOiBwdWJsaWMgTW9kdWxlUmVnaXN0cnkgewotIHB1YmxpYzoKLSAgdm9pZCBJbmplY3RUZXN0TW9kdWxlKGNvbnN0IE1vZHVsZUZhY3RvcnkqIG1vZHVsZSwgTW9kdWxlKiBpbnN0YW5jZSkgewotICAgIHN0YXJ0X29yZGVyXy5wdXNoX2JhY2sobW9kdWxlKTsKLSAgICBzdGFydGVkX21vZHVsZXNfW21vZHVsZV0gPSBpbnN0YW5jZTsKLSAgICBzZXRfcmVnaXN0cnlfYW5kX2hhbmRsZXIoaW5zdGFuY2UsICZ0ZXN0X3RocmVhZCk7Ci0gICAgaW5zdGFuY2UtPlN0YXJ0KCk7Ci0gIH0KLQotICBNb2R1bGUqIEdldE1vZHVsZVVuZGVyVGVzdChjb25zdCBNb2R1bGVGYWN0b3J5KiBtb2R1bGUpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0KG1vZHVsZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgVCogR2V0TW9kdWxlVW5kZXJUZXN0KCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oR2V0TW9kdWxlVW5kZXJUZXN0KCZUOjpGYWN0b3J5KSk7Ci0gIH0KLQotICBvczo6SGFuZGxlciogR2V0VGVzdE1vZHVsZUhhbmRsZXIoY29uc3QgTW9kdWxlRmFjdG9yeSogbW9kdWxlKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldE1vZHVsZUhhbmRsZXIobW9kdWxlKTsKLSAgfQotCi0gIG9zOjpUaHJlYWQmIEdldFRlc3RUaHJlYWQoKSB7Ci0gICAgcmV0dXJuIHRlc3RfdGhyZWFkOwotICB9Ci0KLSAgYm9vbCBTeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoY29uc3QgTW9kdWxlRmFjdG9yeSogbW9kdWxlLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIGNvbnN0IHsKLSAgICByZXR1cm4gU3luY2hyb25pemVIYW5kbGVyKEdldFRlc3RNb2R1bGVIYW5kbGVyKG1vZHVsZSksIHRpbWVvdXQpOwotICB9Ci0KLSAgYm9vbCBTeW5jaHJvbml6ZUhhbmRsZXIob3M6OkhhbmRsZXIqIGhhbmRsZXIsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgY29uc3QgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIHJldHVybiBmdXR1cmUud2FpdF9mb3IodGltZW91dCkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgb3M6OlRocmVhZCB0ZXN0X3RocmVhZHsidGVzdF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMfTsKLX07Ci0KLWNsYXNzIEZ1enpUZXN0TW9kdWxlUmVnaXN0cnkgOiBwdWJsaWMgVGVzdE1vZHVsZVJlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBUKiBJbmplY3QoY29uc3QgTW9kdWxlRmFjdG9yeSogb3ZlcnJpZGluZykgewotICAgIE1vZHVsZSogaW5zdGFuY2UgPSBUOjpGYWN0b3J5LmN0b3JfKCk7Ci0gICAgSW5qZWN0VGVzdE1vZHVsZShvdmVycmlkaW5nLCBpbnN0YW5jZSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihpbnN0YW5jZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgVCogU3RhcnQoKSB7Ci0gICAgcmV0dXJuIE1vZHVsZVJlZ2lzdHJ5OjpTdGFydDxUPigmR2V0VGVzdFRocmVhZCgpKTsKLSAgfQotCi0gIHZvaWQgV2FpdEZvcklkbGVBbmRTdG9wQWxsKCkgewotICAgIGlmICghR2V0VGVzdFRocmVhZCgpLkdldFJlYWN0b3IoKS0+V2FpdEZvcklkbGUoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKSkgewotICAgICAgTE9HX0VSUk9SKCJpZGxlIHRpbWVkIG91dCIpOwotICAgIH0KLSAgICBTdG9wQWxsKCk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL21vZHVsZV91bml0dGVzdC5jYyBiL2dkL21vZHVsZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1YzA0YS4uMDAwMDAwMAotLS0gYS9nZC9tb2R1bGVfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm1vZHVsZV91bml0dGVzdF9nZW5lcmF0ZWQuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi11c2luZyA6OmJsdWV0b290aDo6b3M6OlRocmVhZDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBNb2R1bGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHRocmVhZF8gPSBuZXcgVGhyZWFkKCJ0ZXN0X3RocmVhZCIsIFRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgcmVnaXN0cnlfID0gbmV3IE1vZHVsZVJlZ2lzdHJ5KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSByZWdpc3RyeV87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICBNb2R1bGVSZWdpc3RyeSogcmVnaXN0cnlfOwotICBUaHJlYWQqIHRocmVhZF87Ci19OwotCi1vczo6SGFuZGxlciogdGVzdF9tb2R1bGVfbm9fZGVwZW5kZW5jeV9oYW5kbGVyID0gbnVsbHB0cjsKLQotY2xhc3MgVGVzdE1vZHVsZU5vRGVwZW5kZW5jeSA6IHB1YmxpYyBNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHt9Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHsKLSAgICAvLyBBIG1vZHVsZSBpcyBub3QgY29uc2lkZXJlZCBzdGFydGVkIHVudGlsIFN0YXJ0KCkgZmluaXNoZXMKLSAgICBFWFBFQ1RfRkFMU0UoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCkpOwotICAgIHRlc3RfbW9kdWxlX25vX2RlcGVuZGVuY3lfaGFuZGxlciA9IEdldEhhbmRsZXIoKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHsKLSAgICAvLyBBIG1vZHVsZSBpcyBub3QgY29uc2lkZXJlZCBzdG9wcGVkIHVudGlsIGFmdGVyIFN0b3AoKSBmaW5pc2hlcwotICAgIEVYUEVDVF9UUlVFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5PigpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiVGVzdE1vZHVsZU5vRGVwZW5kZW5jeSIpOwotICB9Ci19OwotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgewotICByZXR1cm4gbmV3IFRlc3RNb2R1bGVOb0RlcGVuZGVuY3koKTsKLX0pOwotCi1vczo6SGFuZGxlciogdGVzdF9tb2R1bGVfb25lX2RlcGVuZGVuY3lfaGFuZGxlciA9IG51bGxwdHI7Ci0KLWNsYXNzIFRlc3RNb2R1bGVPbmVEZXBlbmRlbmN5IDogcHVibGljIE1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICAgIGxpc3QtPmFkZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5PigpOwotICB9Ci0KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHsKLSAgICBFWFBFQ1RfVFJVRShHZXRNb2R1bGVSZWdpc3RyeSgpLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeT4oKSk7Ci0KLSAgICAvLyBBIG1vZHVsZSBpcyBub3QgY29uc2lkZXJlZCBzdGFydGVkIHVudGlsIFN0YXJ0KCkgZmluaXNoZXMKLSAgICBFWFBFQ1RfRkFMU0UoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVPbmVEZXBlbmRlbmN5PigpKTsKLSAgICB0ZXN0X21vZHVsZV9vbmVfZGVwZW5kZW5jeV9oYW5kbGVyID0gR2V0SGFuZGxlcigpOwotICB9Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5PigpKTsKLQotICAgIC8vIEEgbW9kdWxlIGlzIG5vdCBjb25zaWRlcmVkIHN0b3BwZWQgdW50aWwgYWZ0ZXIgU3RvcCgpIGZpbmlzaGVzCi0gICAgRVhQRUNUX1RSVUUoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVPbmVEZXBlbmRlbmN5PigpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiVGVzdE1vZHVsZU9uZURlcGVuZGVuY3kiKTsKLSAgfQotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBUZXN0TW9kdWxlT25lRGVwZW5kZW5jeTo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7Ci0gIHJldHVybiBuZXcgVGVzdE1vZHVsZU9uZURlcGVuZGVuY3koKTsKLX0pOwotCi0KLWNsYXNzIFRlc3RNb2R1bGVOb0RlcGVuZGVuY3lUd28gOiBwdWJsaWMgTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7fQotCi0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgLy8gQSBtb2R1bGUgaXMgbm90IGNvbnNpZGVyZWQgc3RhcnRlZCB1bnRpbCBTdGFydCgpIGZpbmlzaGVzCi0gICAgRVhQRUNUX0ZBTFNFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5VHdvPigpKTsKLSAgfQotCi0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHsKLSAgICAvLyBBIG1vZHVsZSBpcyBub3QgY29uc2lkZXJlZCBzdG9wcGVkIHVudGlsIGFmdGVyIFN0b3AoKSBmaW5pc2hlcwotICAgIEVYUEVDVF9UUlVFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5VHdvPigpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiVGVzdE1vZHVsZU5vRGVwZW5kZW5jeVR3byIpOwotICB9Ci19OwotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFRlc3RNb2R1bGVOb0RlcGVuZGVuY3lUd286OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgewotICByZXR1cm4gbmV3IFRlc3RNb2R1bGVOb0RlcGVuZGVuY3lUd28oKTsKLX0pOwotCi1jbGFzcyBUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzIDogcHVibGljIE1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICAgIGxpc3QtPmFkZDxUZXN0TW9kdWxlT25lRGVwZW5kZW5jeT4oKTsKLSAgICBsaXN0LT5hZGQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeVR3bz4oKTsKLSAgfQotCi0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgRVhQRUNUX1RSVUUoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVPbmVEZXBlbmRlbmN5PigpKTsKLSAgICBFWFBFQ1RfVFJVRShHZXRNb2R1bGVSZWdpc3RyeSgpLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeVR3bz4oKSk7Ci0KLSAgICAvLyBBIG1vZHVsZSBpcyBub3QgY29uc2lkZXJlZCBzdGFydGVkIHVudGlsIFN0YXJ0KCkgZmluaXNoZXMKLSAgICBFWFBFQ1RfRkFMU0UoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVUd29EZXBlbmRlbmNpZXM+KCkpOwotICB9Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlT25lRGVwZW5kZW5jeT4oKSk7Ci0gICAgRVhQRUNUX1RSVUUoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3lUd28+KCkpOwotCi0gICAgLy8gQSBtb2R1bGUgaXMgbm90IGNvbnNpZGVyZWQgc3RvcHBlZCB1bnRpbCBhZnRlciBTdG9wKCkgZmluaXNoZXMKLSAgICBFWFBFQ1RfVFJVRShHZXRNb2R1bGVSZWdpc3RyeSgpLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZVR3b0RlcGVuZGVuY2llcz4oKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlRlc3RNb2R1bGVUd29EZXBlbmRlbmNpZXMiKTsKLSAgfQotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsKLSAgcmV0dXJuIG5ldyBUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzKCk7Ci19KTsKLQotLy8gVG8gZ2VuZXJhdGUgbW9kdWxlIHVuaXR0ZXN0IGZsYXRidWZmZXIgaGVhZGVyczoKLS8vICQgZmxhdGMgLS1jcHAgbW9kdWxlX3VuaXR0ZXN0LmZicwotY2xhc3MgVGVzdE1vZHVsZUR1bXBTdGF0ZSA6IHB1YmxpYyBNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICBzdGQ6OnN0cmluZyB0ZXN0X3N0cmluZ197IkluaXRpYWwgVGVzdCBTdHJpbmcifTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgICBsaXN0LT5hZGQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeT4oKTsKLSAgfQotCi0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgRVhQRUNUX1RSVUUoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCkpOwotCi0gICAgLy8gQSBtb2R1bGUgaXMgbm90IGNvbnNpZGVyZWQgc3RhcnRlZCB1bnRpbCBTdGFydCgpIGZpbmlzaGVzCi0gICAgRVhQRUNUX0ZBTFNFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlRHVtcFN0YXRlPigpKTsKLSAgICB0ZXN0X21vZHVsZV9vbmVfZGVwZW5kZW5jeV9oYW5kbGVyID0gR2V0SGFuZGxlcigpOwotICB9Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKEdldE1vZHVsZVJlZ2lzdHJ5KCktPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5PigpKTsKLQotICAgIC8vIEEgbW9kdWxlIGlzIG5vdCBjb25zaWRlcmVkIHN0b3BwZWQgdW50aWwgYWZ0ZXIgU3RvcCgpIGZpbmlzaGVzCi0gICAgRVhQRUNUX1RSVUUoR2V0TW9kdWxlUmVnaXN0cnkoKS0+SXNTdGFydGVkPFRlc3RNb2R1bGVEdW1wU3RhdGU+KCkpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJUZXN0TW9kdWxlRHVtcFN0YXRlIik7Ci0gIH0KLQotICBEdW1wc3lzRGF0YUZpbmlzaGVyIEdldER1bXBzeXNEYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciogZmJfYnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewotICAgIGF1dG8gc3RyaW5nID0gZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKHRlc3Rfc3RyaW5nXy5jX3N0cigpKTsKLQotICAgIGF1dG8gYnVpbGRlciA9IE1vZHVsZVVuaXRUZXN0RGF0YUJ1aWxkZXIoKmZiX2J1aWxkZXIpOwotICAgIGJ1aWxkZXIuYWRkX3RpdGxlKHN0cmluZyk7Ci0gICAgYXV0byB0YWJsZSA9IGJ1aWxkZXIuRmluaXNoKCk7Ci0KLSAgICByZXR1cm4gW3RhYmxlXShEdW1wc3lzRGF0YUJ1aWxkZXIqIGJ1aWxkZXIpIHsgYnVpbGRlci0+YWRkX21vZHVsZV91bml0dGVzdF9kYXRhKHRhYmxlKTsgfTsKLSAgfQotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBUZXN0TW9kdWxlRHVtcFN0YXRlOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBUZXN0TW9kdWxlRHVtcFN0YXRlKCk7IH0pOwotCi1URVNUX0YoTW9kdWxlVGVzdCwgbm9fZGVwZW5kZW5jeSkgewotICBNb2R1bGVMaXN0IGxpc3Q7Ci0gIGxpc3QuYWRkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCk7Ci0gIHJlZ2lzdHJ5Xy0+U3RhcnQoJmxpc3QsIHRocmVhZF8pOwotCi0gIEVYUEVDVF9UUlVFKHJlZ2lzdHJ5Xy0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU9uZURlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeVR3bz4oKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzPigpKTsKLQotICByZWdpc3RyeV8tPlN0b3BBbGwoKTsKLQotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeT4oKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlT25lRGVwZW5kZW5jeT4oKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5VHdvPigpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZ2lzdHJ5Xy0+SXNTdGFydGVkPFRlc3RNb2R1bGVUd29EZXBlbmRlbmNpZXM+KCkpOwotfQotCi1URVNUX0YoTW9kdWxlVGVzdCwgb25lX2RlcGVuZGVuY3kpIHsKLSAgTW9kdWxlTGlzdCBsaXN0OwotICBsaXN0LmFkZDxUZXN0TW9kdWxlT25lRGVwZW5kZW5jeT4oKTsKLSAgcmVnaXN0cnlfLT5TdGFydCgmbGlzdCwgdGhyZWFkXyk7Ci0KLSAgRVhQRUNUX1RSVUUocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeT4oKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZ2lzdHJ5Xy0+SXNTdGFydGVkPFRlc3RNb2R1bGVPbmVEZXBlbmRlbmN5PigpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZ2lzdHJ5Xy0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3lUd28+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZVR3b0RlcGVuZGVuY2llcz4oKSk7Ci0KLSAgcmVnaXN0cnlfLT5TdG9wQWxsKCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHJlZ2lzdHJ5Xy0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU9uZURlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeVR3bz4oKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzPigpKTsKLX0KLQotVEVTVF9GKE1vZHVsZVRlc3QsIHR3b19kZXBlbmRlbmNpZXMpIHsKLSAgTW9kdWxlTGlzdCBsaXN0OwotICBsaXN0LmFkZDxUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzPigpOwotICByZWdpc3RyeV8tPlN0YXJ0KCZsaXN0LCB0aHJlYWRfKTsKLQotICBFWFBFQ1RfVFJVRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5PigpKTsKLSAgRVhQRUNUX1RSVUUocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU9uZURlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfVFJVRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlTm9EZXBlbmRlbmN5VHdvPigpKTsKLSAgRVhQRUNUX1RSVUUocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZVR3b0RlcGVuZGVuY2llcz4oKSk7Ci0KLSAgcmVnaXN0cnlfLT5TdG9wQWxsKCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHJlZ2lzdHJ5Xy0+SXNTdGFydGVkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU9uZURlcGVuZGVuY3k+KCkpOwotICBFWFBFQ1RfRkFMU0UocmVnaXN0cnlfLT5Jc1N0YXJ0ZWQ8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeVR3bz4oKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWdpc3RyeV8tPklzU3RhcnRlZDxUZXN0TW9kdWxlVHdvRGVwZW5kZW5jaWVzPigpKTsKLX0KLQotdm9pZCBwb3N0X3RvX21vZHVsZV9vbmVfaGFuZGxlcigpIHsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7Ci0gIHRlc3RfbW9kdWxlX29uZV9kZXBlbmRlbmN5X2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZShbXSB7IEZBSUwoKTsgfSkpOwotfQotCi1URVNUX0YoTW9kdWxlVGVzdCwgc2h1dGRvd25fd2l0aF91bmhhbmRsZWRfY2FsbGJhY2spIHsKLSAgTW9kdWxlTGlzdCBsaXN0OwotICBsaXN0LmFkZDxUZXN0TW9kdWxlT25lRGVwZW5kZW5jeT4oKTsKLSAgcmVnaXN0cnlfLT5TdGFydCgmbGlzdCwgdGhyZWFkXyk7Ci0gIHRlc3RfbW9kdWxlX25vX2RlcGVuZGVuY3lfaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZwb3N0X3RvX21vZHVsZV9vbmVfaGFuZGxlcikpOwotICByZWdpc3RyeV8tPlN0b3BBbGwoKTsKLX0KLQotVEVTVF9GKE1vZHVsZVRlc3QsIGR1bXBfc3RhdGUpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIHRpdGxlID0gIlRlc3QgRHVtcCBUaXRsZSI7Ci0gIE1vZHVsZUxpc3QgbGlzdDsKLSAgbGlzdC5hZGQ8VGVzdE1vZHVsZUR1bXBTdGF0ZT4oKTsKLSAgcmVnaXN0cnlfLT5TdGFydCgmbGlzdCwgdGhyZWFkXyk7Ci0KLSAgTW9kdWxlRHVtcGVyIGR1bXBlcigqcmVnaXN0cnlfLCB0aXRsZSk7Ci0KLSAgc3RkOjpzdHJpbmcgb3V0cHV0OwotICBkdW1wZXIuRHVtcFN0YXRlKCZvdXRwdXQpOwotCi0gIGF1dG8gZGF0YSA9IGZsYXRidWZmZXJzOjpHZXRSb290PER1bXBzeXNEYXRhPihvdXRwdXQuZGF0YSgpKTsKLSAgRVhQRUNUX1NUUkVRKHRpdGxlLCBkYXRhLT50aXRsZSgpLT5jX3N0cigpKTsKLQotICBhdXRvIHRlc3RfZGF0YSA9IGRhdGEtPm1vZHVsZV91bml0dGVzdF9kYXRhKCk7Ci0gIEVYUEVDVF9TVFJFUSgiSW5pdGlhbCBUZXN0IFN0cmluZyIsIHRlc3RfZGF0YS0+dGl0bGUoKS0+Y19zdHIoKSk7Ci0KLSAgVGVzdE1vZHVsZUR1bXBTdGF0ZSogdGVzdF9tb2R1bGUgPQotICAgICAgc3RhdGljX2Nhc3Q8VGVzdE1vZHVsZUR1bXBTdGF0ZSo+KHJlZ2lzdHJ5Xy0+U3RhcnQoJlRlc3RNb2R1bGVEdW1wU3RhdGU6OkZhY3RvcnksIG51bGxwdHIpKTsKLSAgdGVzdF9tb2R1bGUtPnRlc3Rfc3RyaW5nXyA9ICJBIFNlY29uZCBUZXN0IFN0cmluZyI7Ci0KLSAgZHVtcGVyLkR1bXBTdGF0ZSgmb3V0cHV0KTsKLQotICBkYXRhID0gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8RHVtcHN5c0RhdGE+KG91dHB1dC5kYXRhKCkpOwotICB0ZXN0X2RhdGEgPSBkYXRhLT5tb2R1bGVfdW5pdHRlc3RfZGF0YSgpOwotICBFWFBFQ1RfU1RSRVEoIkEgU2Vjb25kIFRlc3QgU3RyaW5nIiwgdGVzdF9kYXRhLT50aXRsZSgpLT5jX3N0cigpKTsKLQotICByZWdpc3RyeV8tPlN0b3BBbGwoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9tb2R1bGVfdW5pdHRlc3QuZmJzIGIvZ2QvbW9kdWxlX3VuaXR0ZXN0LmZicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYTFiNi4uMDAwMDAwMAotLS0gYS9nZC9tb2R1bGVfdW5pdHRlc3QuZmJzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gbW9kdWxlX3VuaXR0ZXN0Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoOwotCi1hdHRyaWJ1dGUgInByaXZhY3kiOwotCi10YWJsZSBNb2R1bGVVbml0VGVzdERhdGEgewotICAgIHRpdGxlOnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci19Ci0KLXJvb3RfdHlwZSBNb2R1bGVVbml0VGVzdERhdGE7CmRpZmYgLS1naXQgYS9nZC9tb2R1bGVfdW5pdHRlc3RfZ2VuZXJhdGVkLmggYi9nZC9tb2R1bGVfdW5pdHRlc3RfZ2VuZXJhdGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOWZkMzYuLjAwMDAwMDAKLS0tIGEvZ2QvbW9kdWxlX3VuaXR0ZXN0X2dlbmVyYXRlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSNpZm5kZWYgRkxBVEJVRkZFUlNfR0VORVJBVEVEX01PRFVMRVVOSVRURVNUX0JMVUVUT09USF9IXwotI2RlZmluZSBGTEFUQlVGRkVSU19HRU5FUkFURURfTU9EVUxFVU5JVFRFU1RfQkxVRVRPT1RIX0hfCi0KLSNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RydWN0IE1vZHVsZVVuaXRUZXN0RGF0YTsKLXN0cnVjdCBNb2R1bGVVbml0VGVzdERhdGFCdWlsZGVyOwotCi1zdHJ1Y3QgTW9kdWxlVW5pdFRlc3REYXRhIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgewotICB0eXBlZGVmIE1vZHVsZVVuaXRUZXN0RGF0YUJ1aWxkZXIgQnVpbGRlcjsKLSAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsgVlRfVElUTEUgPSA0IH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqIHRpdGxlKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcqPihWVF9USVRMRSk7Ci0gIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyJiB2ZXJpZmllcikgY29uc3QgewotICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJiBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RJVExFKSAmJiB2ZXJpZmllci5WZXJpZnlTdHJpbmcodGl0bGUoKSkgJiYKLSAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKLSAgfQotfTsKLQotc3RydWN0IE1vZHVsZVVuaXRUZXN0RGF0YUJ1aWxkZXIgewotICB0eXBlZGVmIE1vZHVsZVVuaXRUZXN0RGF0YSBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfdGl0bGUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiB0aXRsZSkgewotICAgIGZiYl8uQWRkT2Zmc2V0KE1vZHVsZVVuaXRUZXN0RGF0YTo6VlRfVElUTEUsIHRpdGxlKTsKLSAgfQotICBleHBsaWNpdCBNb2R1bGVVbml0VGVzdERhdGFCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgX2ZiYikgOiBmYmJfKF9mYmIpIHsKLSAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKLSAgfQotICBNb2R1bGVVbml0VGVzdERhdGFCdWlsZGVyJiBvcGVyYXRvcj0oY29uc3QgTW9kdWxlVW5pdFRlc3REYXRhQnVpbGRlciYpOwotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZHVsZVVuaXRUZXN0RGF0YT4gRmluaXNoKCkgewotICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kdWxlVW5pdFRlc3REYXRhPihlbmQpOwotICAgIHJldHVybiBvOwotICB9Ci19OwotCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2R1bGVVbml0VGVzdERhdGE+IENyZWF0ZU1vZHVsZVVuaXRUZXN0RGF0YSgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIF9mYmIsIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gdGl0bGUgPSAwKSB7Ci0gIE1vZHVsZVVuaXRUZXN0RGF0YUJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7Ci0gIGJ1aWxkZXJfLmFkZF90aXRsZSh0aXRsZSk7Ci0gIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKLX0KLQotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kdWxlVW5pdFRlc3REYXRhPiBDcmVhdGVNb2R1bGVVbml0VGVzdERhdGFEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyJiBfZmJiLCBjb25zdCBjaGFyKiB0aXRsZSA9IG51bGxwdHIpIHsKLSAgYXV0byB0aXRsZV9fID0gdGl0bGUgPyBfZmJiLkNyZWF0ZVN0cmluZyh0aXRsZSkgOiAwOwotICByZXR1cm4gYmx1ZXRvb3RoOjpDcmVhdGVNb2R1bGVVbml0VGVzdERhdGEoX2ZiYiwgdGl0bGVfXyk7Ci19Ci0KLWlubGluZSBjb25zdCBibHVldG9vdGg6Ok1vZHVsZVVuaXRUZXN0RGF0YSogR2V0TW9kdWxlVW5pdFRlc3REYXRhKGNvbnN0IHZvaWQqIGJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8Ymx1ZXRvb3RoOjpNb2R1bGVVbml0VGVzdERhdGE+KGJ1Zik7Ci19Ci0KLWlubGluZSBjb25zdCBibHVldG9vdGg6Ok1vZHVsZVVuaXRUZXN0RGF0YSogR2V0U2l6ZVByZWZpeGVkTW9kdWxlVW5pdFRlc3REYXRhKGNvbnN0IHZvaWQqIGJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8Ymx1ZXRvb3RoOjpNb2R1bGVVbml0VGVzdERhdGE+KGJ1Zik7Ci19Ci0KLWlubGluZSBib29sIFZlcmlmeU1vZHVsZVVuaXRUZXN0RGF0YUJ1ZmZlcihmbGF0YnVmZmVyczo6VmVyaWZpZXImIHZlcmlmaWVyKSB7Ci0gIHJldHVybiB2ZXJpZmllci5WZXJpZnlCdWZmZXI8Ymx1ZXRvb3RoOjpNb2R1bGVVbml0VGVzdERhdGE+KG51bGxwdHIpOwotfQotCi1pbmxpbmUgYm9vbCBWZXJpZnlTaXplUHJlZml4ZWRNb2R1bGVVbml0VGVzdERhdGFCdWZmZXIoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyJiB2ZXJpZmllcikgewotICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5U2l6ZVByZWZpeGVkQnVmZmVyPGJsdWV0b290aDo6TW9kdWxlVW5pdFRlc3REYXRhPihudWxscHRyKTsKLX0KLQotaW5saW5lIHZvaWQgRmluaXNoTW9kdWxlVW5pdFRlc3REYXRhQnVmZmVyKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciYgZmJiLCBmbGF0YnVmZmVyczo6T2Zmc2V0PGJsdWV0b290aDo6TW9kdWxlVW5pdFRlc3REYXRhPiByb290KSB7Ci0gIGZiYi5GaW5pc2gocm9vdCk7Ci19Ci0KLWlubGluZSB2b2lkIEZpbmlzaFNpemVQcmVmaXhlZE1vZHVsZVVuaXRUZXN0RGF0YUJ1ZmZlcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXImIGZiYiwgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxibHVldG9vdGg6Ok1vZHVsZVVuaXRUZXN0RGF0YT4gcm9vdCkgewotICBmYmIuRmluaXNoU2l6ZVByZWZpeGVkKHJvb3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLSNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfR0VORVJBVEVEX01PRFVMRVVOSVRURVNUX0JMVUVUT09USF9IXwpkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvQW5kcm9pZC5icCBiL2dkL25laWdoYm9yL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNmNmNzEuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aE5laWdoYm9yU291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAgICAgImNvbm5lY3RhYmlsaXR5LmNjIiwKLSAgICAgICAgICAgICJkaXNjb3ZlcmFiaWxpdHkuY2MiLAotICAgICAgICAgICAgImlucXVpcnkuY2MiLAotICAgICAgICAgICAgIm5hbWUuY2MiLAotICAgICAgICAgICAgIm5hbWVfZGIuY2MiLAotICAgICAgICAgICAgInBhZ2UuY2MiLAotICAgICAgICAgICAgInNjYW4uY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aE5laWdoYm9yVGVzdFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgICAgICJpbnF1aXJ5X3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEZhY2FkZV9uZWlnaGJvciIsCi0gICAgc3JjczogWwotICAgICAgICAiZmFjYWRlL2ZhY2FkZS5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL0JVSUxELmduIGIvZ2QvbmVpZ2hib3IvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTRkNzkuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotc291cmNlX3NldCgiQmx1ZXRvb3RoTmVpZ2hib3JTb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJjb25uZWN0YWJpbGl0eS5jYyIsCi0gICAgImRpc2NvdmVyYWJpbGl0eS5jYyIsCi0gICAgImlucXVpcnkuY2MiLAotICAgICJuYW1lLmNjIiwKLSAgICAibmFtZV9kYi5jYyIsCi0gICAgInBhZ2UuY2MiLAotICAgICJzY2FuLmNjIiwKLSAgXQotCi0gIGRlcHMgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRfZGVwcyIgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvY2VydC9uZWlnaGJvcl90ZXN0LnB5IGIvZ2QvbmVpZ2hib3IvY2VydC9uZWlnaGJvcl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzI4YjQ2Li4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL2NlcnQvbmVpZ2hib3JfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLWZyb20gY2VydC5nZF9iYXNlX3Rlc3QgaW1wb3J0IEdkQmFzZVRlc3RDbGFzcwotZnJvbSBuZWlnaGJvci5jZXJ0Lm5laWdoYm9yX3Rlc3RfbGliIGltcG9ydCBOZWlnaGJvclRlc3RCYXNlCi0KLQotY2xhc3MgTmVpZ2hib3JUZXN0KEdkQmFzZVRlc3RDbGFzcywgTmVpZ2hib3JUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdIQ0lfSU5URVJGQUNFUycsIGNlcnRfbW9kdWxlPSdIQ0knKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIE5laWdoYm9yVGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIE5laWdoYm9yVGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBHZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQpkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvY2VydC9uZWlnaGJvcl90ZXN0X2xpYi5weSBiL2dkL25laWdoYm9yL2NlcnQvbmVpZ2hib3JfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjUwZjguLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvY2VydC9uZWlnaGJvcl90ZXN0X2xpYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi0KLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgSGNpTWF0Y2hlcnMsIE5laWdoYm9yTWF0Y2hlcnMKLWZyb20gY2VydC5weV9oY2kgaW1wb3J0IFB5SGNpCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gbmVpZ2hib3IuY2VydC5weV9uZWlnaGJvciBpbXBvcnQgUHlOZWlnaGJvcgotZnJvbSBuZWlnaGJvci5mYWNhZGUgaW1wb3J0IGZhY2FkZV9wYjIgYXMgbmVpZ2hib3JfZmFjYWRlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuaGNpX3BhY2tldHMgaW1wb3J0IE9wQ29kZQotCi0KLWNsYXNzIE5laWdoYm9yVGVzdEJhc2UoKToKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIHNlbGYuY2VydF9oY2kgPSBQeUhjaShjZXJ0LCBhY2xfc3RyZWFtaW5nPVRydWUpCi0gICAgICAgIHNlbGYuY2VydF9oY2kuc2VuZF9jb21tYW5kKGhjaV9wYWNrZXRzLldyaXRlU2NhbkVuYWJsZUJ1aWxkZXIoaGNpX3BhY2tldHMuU2NhbkVuYWJsZS5JTlFVSVJZX0FORF9QQUdFX1NDQU4pKQotICAgICAgICBzZWxmLmNlcnRfbmFtZSA9IGInSW1fQV9DZXJ0JwotICAgICAgICBzZWxmLmNlcnRfYWRkcmVzcyA9IHNlbGYuY2VydF9oY2kucmVhZF9vd25fYWRkcmVzcygpCi0gICAgICAgIHNlbGYuY2VydF9uYW1lICs9IGInQCcgKyBzZWxmLmNlcnRfYWRkcmVzcy5lbmNvZGUoJ3V0ZjgnKQotICAgICAgICBzZWxmLmR1dF9uZWlnaGJvciA9IFB5TmVpZ2hib3IoZHV0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuY2VydF9oY2kuY2xvc2UoKQotCi0gICAgZGVmIF9zZXRfbmFtZShzZWxmKToKLSAgICAgICAgcGFkZGVkX25hbWUgPSBzZWxmLmNlcnRfbmFtZQotICAgICAgICB3aGlsZSBsZW4ocGFkZGVkX25hbWUpIDwgMjQ4OgotICAgICAgICAgICAgcGFkZGVkX25hbWUgPSBwYWRkZWRfbmFtZSArIGInXDAnCi0gICAgICAgIHNlbGYuY2VydF9oY2kuc2VuZF9jb21tYW5kKGhjaV9wYWNrZXRzLldyaXRlTG9jYWxOYW1lQnVpbGRlcihwYWRkZWRfbmFtZSkpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfaGNpLmdldF9ldmVudF9zdHJlYW0oKSkuZW1pdHMoSGNpTWF0Y2hlcnMuQ29tbWFuZENvbXBsZXRlKE9wQ29kZS5XUklURV9MT0NBTF9OQU1FKSkKLQotICAgIGRlZiB0ZXN0X2lucXVpcnlfZnJvbV9kdXQoc2VsZik6Ci0gICAgICAgIGlucXVpcnlfbXNnID0gbmVpZ2hib3JfZmFjYWRlLklucXVpcnlNc2coCi0gICAgICAgICAgICBpbnF1aXJ5X21vZGU9bmVpZ2hib3JfZmFjYWRlLkRpc2NvdmVyYWJpbGl0eU1vZGUuR0VORVJBTCwKLSAgICAgICAgICAgIHJlc3VsdF9tb2RlPW5laWdoYm9yX2ZhY2FkZS5SZXN1bHRNb2RlLlNUQU5EQVJELAotICAgICAgICAgICAgbGVuZ3RoXzFfMjhzPTMsCi0gICAgICAgICAgICBtYXhfcmVzdWx0cz0wKQotICAgICAgICBzZXNzaW9uID0gc2VsZi5kdXRfbmVpZ2hib3Iuc2V0X2lucXVpcnlfbW9kZShpbnF1aXJ5X21zZykKLSAgICAgICAgc2VsZi5jZXJ0X2hjaS5zZW5kX2NvbW1hbmQoaGNpX3BhY2tldHMuV3JpdGVTY2FuRW5hYmxlQnVpbGRlcihoY2lfcGFja2V0cy5TY2FuRW5hYmxlLklOUVVJUllfQU5EX1BBR0VfU0NBTikpCi0gICAgICAgIGFzc2VydFRoYXQoc2Vzc2lvbikuZW1pdHMoTmVpZ2hib3JNYXRjaGVycy5JbnF1aXJ5UmVzdWx0KHNlbGYuY2VydF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xMCkpCi0KLSAgICBkZWYgdGVzdF9pbnF1aXJ5X3Jzc2lfZnJvbV9kdXQoc2VsZik6Ci0gICAgICAgIGlucXVpcnlfbXNnID0gbmVpZ2hib3JfZmFjYWRlLklucXVpcnlNc2coCi0gICAgICAgICAgICBpbnF1aXJ5X21vZGU9bmVpZ2hib3JfZmFjYWRlLkRpc2NvdmVyYWJpbGl0eU1vZGUuR0VORVJBTCwKLSAgICAgICAgICAgIHJlc3VsdF9tb2RlPW5laWdoYm9yX2ZhY2FkZS5SZXN1bHRNb2RlLlJTU0ksCi0gICAgICAgICAgICBsZW5ndGhfMV8yOHM9NiwKLSAgICAgICAgICAgIG1heF9yZXN1bHRzPTApCi0gICAgICAgIHNlc3Npb24gPSBzZWxmLmR1dF9uZWlnaGJvci5zZXRfaW5xdWlyeV9tb2RlKGlucXVpcnlfbXNnKQotICAgICAgICBzZWxmLmNlcnRfaGNpLnNlbmRfY29tbWFuZChoY2lfcGFja2V0cy5Xcml0ZVNjYW5FbmFibGVCdWlsZGVyKGhjaV9wYWNrZXRzLlNjYW5FbmFibGUuSU5RVUlSWV9BTkRfUEFHRV9TQ0FOKSkKLSAgICAgICAgYXNzZXJ0VGhhdChzZXNzaW9uKS5lbWl0cygKLSAgICAgICAgICAgIE5laWdoYm9yTWF0Y2hlcnMuSW5xdWlyeVJlc3VsdHdpdGhSc3NpKHNlbGYuY2VydF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xMCkpCi0KLSAgICBkZWYgdGVzdF9pbnF1aXJ5X2V4dGVuZGVkX2Zyb21fZHV0KHNlbGYpOgotICAgICAgICBzZWxmLl9zZXRfbmFtZSgpCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoc2VsZi5jZXJ0X25hbWUpKQotICAgICAgICBnYXBfZGF0YSA9IGxpc3QoW2dhcF9uYW1lXSkKLQotICAgICAgICBzZWxmLmNlcnRfaGNpLnNlbmRfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLldyaXRlRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2VCdWlsZGVyKGhjaV9wYWNrZXRzLkZlY1JlcXVpcmVkLk5PVF9SRVFVSVJFRCwgZ2FwX2RhdGEpKQotICAgICAgICBpbnF1aXJ5X21zZyA9IG5laWdoYm9yX2ZhY2FkZS5JbnF1aXJ5TXNnKAotICAgICAgICAgICAgaW5xdWlyeV9tb2RlPW5laWdoYm9yX2ZhY2FkZS5EaXNjb3ZlcmFiaWxpdHlNb2RlLkdFTkVSQUwsCi0gICAgICAgICAgICByZXN1bHRfbW9kZT1uZWlnaGJvcl9mYWNhZGUuUmVzdWx0TW9kZS5FWFRFTkRFRCwKLSAgICAgICAgICAgIGxlbmd0aF8xXzI4cz04LAotICAgICAgICAgICAgbWF4X3Jlc3VsdHM9MCkKLSAgICAgICAgc2Vzc2lvbiA9IHNlbGYuZHV0X25laWdoYm9yLnNldF9pbnF1aXJ5X21vZGUoaW5xdWlyeV9tc2cpCi0gICAgICAgIHNlbGYuY2VydF9oY2kuc2VuZF9jb21tYW5kKGhjaV9wYWNrZXRzLldyaXRlU2NhbkVuYWJsZUJ1aWxkZXIoaGNpX3BhY2tldHMuU2NhbkVuYWJsZS5JTlFVSVJZX0FORF9QQUdFX1NDQU4pKQotICAgICAgICBhc3NlcnRUaGF0KHNlc3Npb24pLmVtaXRzKAotICAgICAgICAgICAgTmVpZ2hib3JNYXRjaGVycy5FeHRlbmRlZElucXVpcnlSZXN1bHQoc2VsZi5jZXJ0X2FkZHJlc3MpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTEwKSkKLQotICAgIGRlZiB0ZXN0X3JlbW90ZV9uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLl9zZXRfbmFtZSgpCi0gICAgICAgIHNlc3Npb24gPSBzZWxmLmR1dF9uZWlnaGJvci5nZXRfcmVtb3RlX25hbWUoc2VsZi5jZXJ0X2FkZHJlc3MpCi0gICAgICAgIHNlc3Npb24udmVyaWZ5X25hbWUoc2VsZi5jZXJ0X25hbWUpCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9jZXJ0L3B5X25laWdoYm9yLnB5IGIvZ2QvbmVpZ2hib3IvY2VydC9weV9uZWlnaGJvci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwOWM0OC4uMDAwMDAwMAotLS0gYS9nZC9uZWlnaGJvci9jZXJ0L3B5X25laWdoYm9yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IElFdmVudFN0cmVhbQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBDbG9zYWJsZQotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC50cnV0aCBpbXBvcnQgYXNzZXJ0VGhhdAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBoY2lfZmFjYWRlX3BiMiBhcyBoY2lfZmFjYWRlCi1mcm9tIG5laWdoYm9yLmZhY2FkZSBpbXBvcnQgZmFjYWRlX3BiMiBhcyBuZWlnaGJvcl9mYWNhZGUKLQotCi1jbGFzcyBJbnF1aXJ5U2Vzc2lvbihDbG9zYWJsZSwgSUV2ZW50U3RyZWFtKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXZpY2UsIGlucXVpcnlfbXNnKToKLSAgICAgICAgc2VsZi5pbnF1aXJ5X2V2ZW50X3N0cmVhbSA9IEV2ZW50U3RyZWFtKGRldmljZS5uZWlnaGJvci5TZXRJbnF1aXJ5TW9kZShpbnF1aXJ5X21zZykpCi0KLSAgICBkZWYgZ2V0X2V2ZW50X3F1ZXVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5pbnF1aXJ5X2V2ZW50X3N0cmVhbS5nZXRfZXZlbnRfcXVldWUoKQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5pbnF1aXJ5X2V2ZW50X3N0cmVhbSkKLQotCi1jbGFzcyBHZXRSZW1vdGVOYW1lU2Vzc2lvbihDbG9zYWJsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGV2aWNlKToKLSAgICAgICAgc2VsZi5yZW1vdGVfbmFtZV9zdHJlYW0gPSBFdmVudFN0cmVhbShkZXZpY2UubmVpZ2hib3IuR2V0UmVtb3RlTmFtZUV2ZW50cyhlbXB0eV9wcm90by5FbXB0eSgpKSkKLQotICAgIGRlZiB2ZXJpZnlfbmFtZShzZWxmLCBuYW1lKToKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLnJlbW90ZV9uYW1lX3N0cmVhbSkuZW1pdHMobGFtYmRhIG1zZzogYnl0ZXMobmFtZSkgaW4gbXNnLm5hbWUsIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MTApKQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzYWZlQ2xvc2Uoc2VsZi5yZW1vdGVfbmFtZV9zdHJlYW0pCi0KLQotY2xhc3MgUHlOZWlnaGJvcihvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldmljZSk6Ci0gICAgICAgIHNlbGYuZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYucmVtb3RlX2hvc3Rfc3VwcG9ydGVkX2ZlYXR1cmVzX25vdGlmaWNhdGlvbl9yZWdpc3RlcmVkID0gRmFsc2UKLQotICAgIGRlZiBzZXRfaW5xdWlyeV9tb2RlKHNlbGYsIGlucXVpcnlfbXNnKToKLSAgICAgICAgIiIiCi0gICAgICAgIFNldCB0aGUgaW5xdWlyeSBtb2RlIGFuZCByZXR1cm4gYSBzZXNzaW9uIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBldmVudCBxdWV1ZSBhc3NlcnRpb24KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBJbnF1aXJ5U2Vzc2lvbihzZWxmLmRldmljZSwgaW5xdWlyeV9tc2cpCi0KLSAgICBkZWYgX3JlZ2lzdGVyX3JlbW90ZV9ob3N0X3N1cHBvcnRlZF9mZWF0dXJlc19ub3RpZmljYXRpb24oc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBSRU1PVEVfSE9TVF9TVVBQT1JURURfRkVBVFVSRVNfTk9USUZJQ0FUSU9OIGV2ZW50IHdpbGwgYmUgc2VudCB3aGVuIGEgZGV2aWNlIHNlbmRzIHJlbW90ZSBuYW1lIHJlcXVlc3QKLSAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYucmVtb3RlX2hvc3Rfc3VwcG9ydGVkX2ZlYXR1cmVzX25vdGlmaWNhdGlvbl9yZWdpc3RlcmVkOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG1zZyA9IGhjaV9mYWNhZGUuRXZlbnRSZXF1ZXN0KGNvZGU9aW50KGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5SRU1PVEVfSE9TVF9TVVBQT1JURURfRkVBVFVSRVNfTk9USUZJQ0FUSU9OKSkKLSAgICAgICAgc2VsZi5kZXZpY2UuaGNpLlJlcXVlc3RFdmVudChtc2cpCi0gICAgICAgIHNlbGYucmVtb3RlX2hvc3Rfc3VwcG9ydGVkX2ZlYXR1cmVzX25vdGlmaWNhdGlvbl9yZWdpc3RlcmVkID0gVHJ1ZQotCi0gICAgZGVmIGdldF9yZW1vdGVfbmFtZShzZWxmLCByZW1vdGVfYWRkcmVzcyk6Ci0gICAgICAgICIiIgotICAgICAgICBHZXQgdGhlIHJlbW90ZSBuYW1lIGFuZCByZXR1cm4gYSBzZXNzaW9uIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBldmVudCBxdWV1ZSBhc3NlcnRpb24KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3JlZ2lzdGVyX3JlbW90ZV9ob3N0X3N1cHBvcnRlZF9mZWF0dXJlc19ub3RpZmljYXRpb24oKQotICAgICAgICBzZWxmLmRldmljZS5uZWlnaGJvci5SZWFkUmVtb3RlTmFtZSgKLSAgICAgICAgICAgIG5laWdoYm9yX2ZhY2FkZS5SZW1vdGVOYW1lUmVxdWVzdE1zZygKLSAgICAgICAgICAgICAgICBhZGRyZXNzPXJlbW90ZV9hZGRyZXNzLmVuY29kZSgndXRmOCcpLCBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlPTEsIGNsb2NrX29mZnNldD0weDY4NTUpKQotICAgICAgICByZXR1cm4gR2V0UmVtb3RlTmFtZVNlc3Npb24oc2VsZi5kZXZpY2UpCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9jb25uZWN0YWJpbGl0eS5jYyBiL2dkL25laWdoYm9yL2Nvbm5lY3RhYmlsaXR5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzkzNjdjLi4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL2Nvbm5lY3RhYmlsaXR5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgIm5laWdoYm9yMiIKLQotI2luY2x1ZGUgIm5laWdoYm9yL2Nvbm5lY3RhYmlsaXR5LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAibmVpZ2hib3Ivc2Nhbi5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbmVpZ2hib3IgewotCi1zdHJ1Y3QgQ29ubmVjdGFiaWxpdHlNb2R1bGU6OmltcGwgewotICB2b2lkIFN0YXJ0Q29ubmVjdGFiaWxpdHkoKTsKLSAgdm9pZCBTdG9wQ29ubmVjdGFiaWxpdHkoKTsKLSAgYm9vbCBJc0Nvbm5lY3RhYmxlKCkgY29uc3Q7Ci0KLSAgdm9pZCBTdGFydCgpOwotICB2b2lkIFN0b3AoKTsKLQotICBpbXBsKENvbm5lY3RhYmlsaXR5TW9kdWxlJiBjb25uZWN0YWJpbGl0eV9tb2R1bGUpOwotCi0gcHJpdmF0ZToKLSAgQ29ubmVjdGFiaWxpdHlNb2R1bGUmIG1vZHVsZV87Ci0KLSAgbmVpZ2hib3I6OlNjYW5Nb2R1bGUqIHNjYW5fbW9kdWxlXzsKLX07Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgbmVpZ2hib3I6OkNvbm5lY3RhYmlsaXR5TW9kdWxlOjpGYWN0b3J5ID0KLSAgICBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IENvbm5lY3RhYmlsaXR5TW9kdWxlKCk7IH0pOwotCi1uZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU6OmltcGw6OmltcGwobmVpZ2hib3I6OkNvbm5lY3RhYmlsaXR5TW9kdWxlJiBtb2R1bGUpIDogbW9kdWxlXyhtb2R1bGUpIHt9Ci0KLXZvaWQgbmVpZ2hib3I6OkNvbm5lY3RhYmlsaXR5TW9kdWxlOjppbXBsOjpTdGFydENvbm5lY3RhYmlsaXR5KCkgewotICBzY2FuX21vZHVsZV8tPlNldFBhZ2VTY2FuKCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OkNvbm5lY3RhYmlsaXR5TW9kdWxlOjppbXBsOjpTdG9wQ29ubmVjdGFiaWxpdHkoKSB7Ci0gIHNjYW5fbW9kdWxlXy0+Q2xlYXJQYWdlU2NhbigpOwotfQotCi1ib29sIG5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZTo6aW1wbDo6SXNDb25uZWN0YWJsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNjYW5fbW9kdWxlXy0+SXNQYWdlRW5hYmxlZCgpOwotfQotCi12b2lkIG5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZTo6aW1wbDo6U3RhcnQoKSB7Ci0gIHNjYW5fbW9kdWxlXyA9IG1vZHVsZV8uR2V0RGVwZW5kZW5jeTxuZWlnaGJvcjo6U2Nhbk1vZHVsZT4oKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU6OmltcGw6OlN0b3AoKSB7fQotCi1uZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU6OkNvbm5lY3RhYmlsaXR5TW9kdWxlKCkgOiBwaW1wbF8oc3RkOjptYWtlX3VuaXF1ZTxpbXBsPigqdGhpcykpIHt9Ci0KLW5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZTo6fkNvbm5lY3RhYmlsaXR5TW9kdWxlKCkgewotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU6OlN0YXJ0Q29ubmVjdGFiaWxpdHkoKSB7Ci0gIHBpbXBsXy0+U3RhcnRDb25uZWN0YWJpbGl0eSgpOwotfQotCi12b2lkIG5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZTo6U3RvcENvbm5lY3RhYmlsaXR5KCkgewotICBwaW1wbF8tPlN0b3BDb25uZWN0YWJpbGl0eSgpOwotfQotCi1ib29sIG5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZTo6SXNDb25uZWN0YWJsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbXBsXy0+SXNDb25uZWN0YWJsZSgpOwotfQotCi0vKioKLSAqIE1vZHVsZSBzdHVmZgotICovCi12b2lkIG5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxuZWlnaGJvcjo6U2Nhbk1vZHVsZT4oKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU6OlN0YXJ0KCkgewotICBwaW1wbF8tPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OkNvbm5lY3RhYmlsaXR5TW9kdWxlOjpTdG9wKCkgewotICBwaW1wbF8tPlN0b3AoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9jb25uZWN0YWJpbGl0eS5oIGIvZ2QvbmVpZ2hib3IvY29ubmVjdGFiaWxpdHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZjc0MS4uMDAwMDAwMAotLS0gYS9nZC9uZWlnaGJvci9jb25uZWN0YWJpbGl0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotY2xhc3MgQ29ubmVjdGFiaWxpdHlNb2R1bGUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgdm9pZCBTdGFydENvbm5lY3RhYmlsaXR5KCk7Ci0gIHZvaWQgU3RvcENvbm5lY3RhYmlsaXR5KCk7Ci0gIGJvb2wgSXNDb25uZWN0YWJsZSgpIGNvbnN0OwotCi0gIENvbm5lY3RhYmlsaXR5TW9kdWxlKCk7Ci0gIH5Db25uZWN0YWJpbGl0eU1vZHVsZSgpOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJDb25uZWN0YWJpbGl0eU1vZHVsZSIpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29ubmVjdGFiaWxpdHlNb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9kaXNjb3ZlcmFiaWxpdHkuY2MgYi9nZC9uZWlnaGJvci9kaXNjb3ZlcmFiaWxpdHkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDYwOWIuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgImJ0X2dkX25laWdoIgotCi0jaW5jbHVkZSAibmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9zY2FuLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBuZWlnaGJvciB7Ci0KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrR2VuZXJhbElucXVpcnlBY2Nlc3NDb2RlID0gMHgzMzsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTGltaXRlZElucXVpcnlBY2Nlc3NDb2RlID0gMHgwMDsKLQotc3RydWN0IERpc2NvdmVyYWJpbGl0eU1vZHVsZTo6aW1wbCB7Ci0gIHZvaWQgU3RhcnREaXNjb3ZlcmFiaWxpdHkoc3RkOjp2ZWN0b3I8aGNpOjpMYXA+JiBsYXBzKTsKLSAgdm9pZCBTdG9wRGlzY292ZXJhYmlsaXR5KCk7Ci0KLSAgYm9vbCBJc0dlbmVyYWxEaXNjb3ZlcmFiaWxpdHlFbmFibGVkKCkgY29uc3Q7Ci0gIGJvb2wgSXNMaW1pdGVkRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpIGNvbnN0OwotCi0gIHZvaWQgU3RhcnQoKTsKLQotICBpbXBsKERpc2NvdmVyYWJpbGl0eU1vZHVsZSYgZGlzY292ZXJhYmlsaXR5X21vZHVsZSk7Ci0KLSBwcml2YXRlOgotICB1aW50OF90IG51bV9zdXBwb3J0ZWRfaWFjXzsKLSAgc3RkOjp2ZWN0b3I8aGNpOjpMYXA+IGxhcHNfOwotCi0gIHZvaWQgT25Db21tYW5kQ29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IHN0YXR1cyk7Ci0KLSAgaGNpOjpIY2lMYXllciogaGNpX2xheWVyXzsKLSAgbmVpZ2hib3I6OlNjYW5Nb2R1bGUqIHNjYW5fbW9kdWxlXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotCi0gIERpc2NvdmVyYWJpbGl0eU1vZHVsZSYgbW9kdWxlXzsKLSAgdm9pZCBEdW1wKCkgY29uc3Q7Ci19OwotCi1jb25zdCBNb2R1bGVGYWN0b3J5IG5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGU6OkZhY3RvcnkgPQotICAgIE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZSgpOyB9KTsKLQotbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6aW1wbDo6aW1wbChuZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlJiBtb2R1bGUpIDogbW9kdWxlXyhtb2R1bGUpIHt9Ci0KLXZvaWQgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6aW1wbDo6T25Db21tYW5kQ29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IHN0YXR1cykgewotICBzd2l0Y2ggKHN0YXR1cy5HZXRDb21tYW5kT3BDb2RlKCkpIHsKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0NVUlJFTlRfSUFDX0xBUDogewotICAgICAgYXV0byBwYWNrZXQgPSBoY2k6OlJlYWRDdXJyZW50SWFjTGFwQ29tcGxldGVWaWV3OjpDcmVhdGUoc3RhdHVzKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgbGFwc18gPSBwYWNrZXQuR2V0TGFwc1RvUmVhZCgpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9DVVJSRU5UX0lBQ19MQVA6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpXcml0ZUN1cnJlbnRJYWNMYXBDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGF0dXMpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9JQUM6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWNDb21wbGV0ZVZpZXc6OkNyZWF0ZShzdGF0dXMpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgICBudW1fc3VwcG9ydGVkX2lhY18gPSBwYWNrZXQuR2V0TnVtU3VwcG9ydElhYygpOwotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCJVbmhhbmRsZWQgY29tbWFuZDolcyIsIGhjaTo6T3BDb2RlVGV4dChzdGF0dXMuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6aW1wbDo6U3RhcnREaXNjb3ZlcmFiaWxpdHkoc3RkOjp2ZWN0b3I8aGNpOjpMYXA+JiBsYXBzKSB7Ci0gIEFTU0VSVChsYXBzLnNpemUoKSA8PSBudW1fc3VwcG9ydGVkX2lhY18pOwotICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIGhjaTo6V3JpdGVDdXJyZW50SWFjTGFwQnVpbGRlcjo6Q3JlYXRlKGxhcHMpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kQ29tcGxldGUpKTsKLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBoY2k6OlJlYWRDdXJyZW50SWFjTGFwQnVpbGRlcjo6Q3JlYXRlKCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotICBzY2FuX21vZHVsZV8tPlNldElucXVpcnlTY2FuKCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6aW1wbDo6U3RvcERpc2NvdmVyYWJpbGl0eSgpIHsKLSAgc2Nhbl9tb2R1bGVfLT5DbGVhcklucXVpcnlTY2FuKCk7Ci19Ci0KLWJvb2wgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6aW1wbDo6SXNHZW5lcmFsRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHNjYW5fbW9kdWxlXy0+SXNJbnF1aXJ5RW5hYmxlZCgpICYmIGxhcHNfLnNpemUoKSA9PSAxOwotfQotCi1ib29sIG5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGU6OmltcGw6OklzTGltaXRlZERpc2NvdmVyYWJpbGl0eUVuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiBzY2FuX21vZHVsZV8tPklzSW5xdWlyeUVuYWJsZWQoKSAmJiBsYXBzXy5zaXplKCkgPT0gMjsKLX0KLQotdm9pZCBuZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlOjppbXBsOjpTdGFydCgpIHsKLSAgaGNpX2xheWVyXyA9IG1vZHVsZV8uR2V0RGVwZW5kZW5jeTxoY2k6OkhjaUxheWVyPigpOwotICBzY2FuX21vZHVsZV8gPSBtb2R1bGVfLkdldERlcGVuZGVuY3k8bmVpZ2hib3I6OlNjYW5Nb2R1bGU+KCk7Ci0gIGhhbmRsZXJfID0gbW9kdWxlXy5HZXRIYW5kbGVyKCk7Ci0KLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBoY2k6OlJlYWRDdXJyZW50SWFjTGFwQnVpbGRlcjo6Q3JlYXRlKCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotCi0gIGhjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWNCdWlsZGVyOjpDcmVhdGUoKSwgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci0gIExPR19JTkZPKCJTdGFydGVkIGRpc2NvdmVyYWJpbGl0eSBtb2R1bGUiKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlOjppbXBsOjpEdW1wKCkgY29uc3QgewotICBMT0dfSU5GTygiTnVtYmVyIG9mIHN1cHBvcnRlZCBpYWNzOiVoaGQiLCBudW1fc3VwcG9ydGVkX2lhY18pOwotICBMT0dfSU5GTygiTnVtYmVyIG9mIGN1cnJlbnQgaWFjczolemQiLCBsYXBzXy5zaXplKCkpOwotICBmb3IgKGF1dG8gaXQgOiBsYXBzXykgewotICAgIExPR19JTkZPKCIgIGRpc2NvdmVyYWJpbGl0eSBsYXA6JXgiLCBpdC5sYXBfKTsKLSAgfQotfQotCi1uZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KCp0aGlzKSkge30KLQotbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6fkRpc2NvdmVyYWJpbGl0eU1vZHVsZSgpIHsKLSAgcGltcGxfLnJlc2V0KCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6U3RhcnRHZW5lcmFsRGlzY292ZXJhYmlsaXR5KCkgewotICBzdGQ6OnZlY3RvcjxoY2k6OkxhcD4gbGFwczsKLSAgewotICAgIGhjaTo6TGFwIGxhcDsKLSAgICBsYXAubGFwXyA9IGtHZW5lcmFsSW5xdWlyeUFjY2Vzc0NvZGU7Ci0gICAgbGFwcy5wdXNoX2JhY2sobGFwKTsKLSAgfQotICBwaW1wbF8tPlN0YXJ0RGlzY292ZXJhYmlsaXR5KGxhcHMpOwotfQotCi12b2lkIG5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGU6OlN0YXJ0TGltaXRlZERpc2NvdmVyYWJpbGl0eSgpIHsKLSAgc3RkOjp2ZWN0b3I8aGNpOjpMYXA+IGxhcHM7Ci0gIHsKLSAgICBoY2k6OkxhcCBsYXA7Ci0gICAgbGFwLmxhcF8gPSBrR2VuZXJhbElucXVpcnlBY2Nlc3NDb2RlOwotICAgIGxhcHMucHVzaF9iYWNrKGxhcCk7Ci0gIH0KLQotICB7Ci0gICAgaGNpOjpMYXAgbGFwOwotICAgIGxhcC5sYXBfID0ga0xpbWl0ZWRJbnF1aXJ5QWNjZXNzQ29kZTsKLSAgICBsYXBzLnB1c2hfYmFjayhsYXApOwotICB9Ci0gIHBpbXBsXy0+U3RhcnREaXNjb3ZlcmFiaWxpdHkobGFwcyk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6U3RvcERpc2NvdmVyYWJpbGl0eSgpIHsKLSAgcGltcGxfLT5TdG9wRGlzY292ZXJhYmlsaXR5KCk7Ci19Ci0KLWJvb2wgbmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZTo6SXNHZW5lcmFsRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbXBsXy0+SXNHZW5lcmFsRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpOwotfQotCi1ib29sIG5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGU6OklzTGltaXRlZERpc2NvdmVyYWJpbGl0eUVuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiBwaW1wbF8tPklzTGltaXRlZERpc2NvdmVyYWJpbGl0eUVuYWJsZWQoKTsKLX0KLQotLyoqCi0gKiBNb2R1bGUgc3R1ZmYKLSAqLwotdm9pZCBuZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgbGlzdC0+YWRkPGhjaTo6SGNpTGF5ZXI+KCk7Ci0gIGxpc3QtPmFkZDxuZWlnaGJvcjo6U2Nhbk1vZHVsZT4oKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlOjpTdGFydCgpIHsKLSAgcGltcGxfLT5TdGFydCgpOwotfQotCi12b2lkIG5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGU6OlN0b3AoKSB7fQotCi19ICAvLyBuYW1lc3BhY2UgbmVpZ2hib3IKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL2Rpc2NvdmVyYWJpbGl0eS5oIGIvZ2QvbmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTRiODcuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotY2xhc3MgRGlzY292ZXJhYmlsaXR5TW9kdWxlIDogcHVibGljIGJsdWV0b290aDo6TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgU3RhcnRHZW5lcmFsRGlzY292ZXJhYmlsaXR5KCk7Ci0gIHZvaWQgU3RhcnRMaW1pdGVkRGlzY292ZXJhYmlsaXR5KCk7Ci0gIHZvaWQgU3RvcERpc2NvdmVyYWJpbGl0eSgpOwotCi0gIGJvb2wgSXNHZW5lcmFsRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpIGNvbnN0OwotICBib29sIElzTGltaXRlZERpc2NvdmVyYWJpbGl0eUVuYWJsZWQoKSBjb25zdDsKLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIERpc2NvdmVyYWJpbGl0eU1vZHVsZSgpOwotICB+RGlzY292ZXJhYmlsaXR5TW9kdWxlKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJEaXNjb3ZlcmFiaWxpdHlNb2R1bGUiKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERpc2NvdmVyYWJpbGl0eU1vZHVsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbmVpZ2hib3IKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL2ZhY2FkZS9mYWNhZGUuY2MgYi9nZC9uZWlnaGJvci9mYWNhZGUvZmFjYWRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWY3NzYxLi4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL2ZhY2FkZS9mYWNhZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm5laWdoYm9yL2ZhY2FkZS9mYWNhZGUuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX2V2ZW50X3F1ZXVlLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibmVpZ2hib3IvZmFjYWRlL2ZhY2FkZS5ncnBjLnBiLmgiCi0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLW5hbWVzcGFjZSBmYWNhZGUgewotCi1jbGFzcyBOZWlnaGJvckZhY2FkZVNlcnZpY2UgOiBwdWJsaWMgTmVpZ2hib3JGYWNhZGU6OlNlcnZpY2UgewotIHB1YmxpYzoKLSAgTmVpZ2hib3JGYWNhZGVTZXJ2aWNlKAotICAgICAgQ29ubmVjdGFiaWxpdHlNb2R1bGUqIGNvbm5lY3RhYmlsaXR5X21vZHVsZSwKLSAgICAgIERpc2NvdmVyYWJpbGl0eU1vZHVsZSogZGlzY292ZXJhYmlsaXR5X21vZHVsZSwKLSAgICAgIElucXVpcnlNb2R1bGUqIGlucXVpcnlfbW9kdWxlLAotICAgICAgTmFtZU1vZHVsZSogbmFtZV9tb2R1bGUsCi0gICAgICBQYWdlTW9kdWxlKiwKLSAgICAgIFNjYW5Nb2R1bGUqIHNjYW5fbW9kdWxlLAotICAgICAgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcikKLSAgICAgIDogY29ubmVjdGFiaWxpdHlfbW9kdWxlXyhjb25uZWN0YWJpbGl0eV9tb2R1bGUpLAotICAgICAgICBkaXNjb3ZlcmFiaWxpdHlfbW9kdWxlXyhkaXNjb3ZlcmFiaWxpdHlfbW9kdWxlKSwKLSAgICAgICAgaW5xdWlyeV9tb2R1bGVfKGlucXVpcnlfbW9kdWxlKSwKLSAgICAgICAgbmFtZV9tb2R1bGVfKG5hbWVfbW9kdWxlKSwKLSAgICAgICAgc2Nhbl9tb2R1bGVfKHNjYW5fbW9kdWxlKSwKLSAgICAgICAgZmFjYWRlX2hhbmRsZXJfKGZhY2FkZV9oYW5kbGVyKSB7fQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNldENvbm5lY3RhYmlsaXR5KAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6Om5laWdoYm9yOjpFbmFibGVNc2cqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGlmIChyZXF1ZXN0LT5lbmFibGVkKCkpIHsKLSAgICAgIGNvbm5lY3RhYmlsaXR5X21vZHVsZV8tPlN0YXJ0Q29ubmVjdGFiaWxpdHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgY29ubmVjdGFiaWxpdHlfbW9kdWxlXy0+U3RvcENvbm5lY3RhYmlsaXR5KCk7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXREaXNjb3ZlcmFiaWxpdHkoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6bmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0aXlNc2cqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHN3aXRjaCAocmVxdWVzdC0+bW9kZSgpKSB7Ci0gICAgICBjYXNlIERpc2NvdmVyYWJpbGl0eU1vZGU6Ok9GRjoKLSAgICAgICAgZGlzY292ZXJhYmlsaXR5X21vZHVsZV8tPlN0b3BEaXNjb3ZlcmFiaWxpdHkoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERpc2NvdmVyYWJpbGl0eU1vZGU6OkxJTUlURUQ6Ci0gICAgICAgIGRpc2NvdmVyYWJpbGl0eV9tb2R1bGVfLT5TdGFydExpbWl0ZWREaXNjb3ZlcmFiaWxpdHkoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERpc2NvdmVyYWJpbGl0eU1vZGU6OkdFTkVSQUw6Ci0gICAgICAgIGRpc2NvdmVyYWJpbGl0eV9tb2R1bGVfLT5TdGFydEdlbmVyYWxEaXNjb3ZlcmFiaWxpdHkoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGRpc2NvdmVyYWJpbGl0eSBtb2RlICVkIiwgc3RhdGljX2Nhc3Q8aW50PihyZXF1ZXN0LT5tb2RlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNldElucXVpcnlNb2RlKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6Om5laWdoYm9yOjpJbnF1aXJ5TXNnKiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8SW5xdWlyeVJlc3VsdE1zZz4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIGlucXVpcnlfbW9kdWxlXy0+UmVnaXN0ZXJDYWxsYmFja3MoaW5xdWlyeV9jYWxsYmFja3NfKTsKLSAgICBzd2l0Y2ggKHJlcXVlc3QtPnJlc3VsdF9tb2RlKCkpIHsKLSAgICAgIGNhc2UgUmVzdWx0TW9kZTo6U1RBTkRBUkQ6Ci0gICAgICAgIGlucXVpcnlfbW9kdWxlXy0+U2V0U3RhbmRhcmRJbnF1aXJ5UmVzdWx0TW9kZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUmVzdWx0TW9kZTo6UlNTSToKLSAgICAgICAgaW5xdWlyeV9tb2R1bGVfLT5TZXRJbnF1aXJ5V2l0aFJzc2lSZXN1bHRNb2RlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSZXN1bHRNb2RlOjpFWFRFTkRFRDoKLSAgICAgICAgaW5xdWlyeV9tb2R1bGVfLT5TZXRFeHRlbmRlZElucXVpcnlSZXN1bHRNb2RlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biByZXN1bHQgbW9kZSAlZCIsIHN0YXRpY19jYXN0PGludD4ocmVxdWVzdC0+cmVzdWx0X21vZGUoKSkpOwotICAgIH0KLSAgICBzd2l0Y2ggKHJlcXVlc3QtPmlucXVpcnlfbW9kZSgpKSB7Ci0gICAgICBjYXNlIERpc2NvdmVyYWJpbGl0eU1vZGU6Ok9GRjoKLSAgICAgICAgaW5xdWlyeV9tb2R1bGVfLT5TdG9wSW5xdWlyeSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRGlzY292ZXJhYmlsaXR5TW9kZTo6TElNSVRFRDoKLSAgICAgICAgaW5xdWlyeV9tb2R1bGVfLT5TdGFydExpbWl0ZWRJbnF1aXJ5KHJlcXVlc3QtPmxlbmd0aF8xXzI4cygpLCByZXF1ZXN0LT5tYXhfcmVzdWx0cygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERpc2NvdmVyYWJpbGl0eU1vZGU6OkdFTkVSQUw6Ci0gICAgICAgIGlucXVpcnlfbW9kdWxlXy0+U3RhcnRHZW5lcmFsSW5xdWlyeShyZXF1ZXN0LT5sZW5ndGhfMV8yOHMoKSwgcmVxdWVzdC0+bWF4X3Jlc3VsdHMoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXNjb3ZlcmFiaWxpdHkgbW9kZSAlZCIsIHN0YXRpY19jYXN0PGludD4ocmVxdWVzdC0+aW5xdWlyeV9tb2RlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBlbmRpbmdfZXZlbnRzXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBSZWFkUmVtb3RlTmFtZSgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpuZWlnaGJvcjo6UmVtb3RlTmFtZVJlcXVlc3RNc2cqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyByZW1vdGU7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCksIHJlbW90ZSkpOwotICAgIGhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZSBtb2RlOwotICAgIHN3aXRjaCAocmVxdWVzdC0+cGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSgpKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIG1vZGUgPSBoY2k6OlBhZ2VTY2FuUmVwZXRpdGlvbk1vZGU6OlIwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgbW9kZSA9IGhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZTo6UjE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBtb2RlID0gaGNpOjpQYWdlU2NhblJlcGV0aXRpb25Nb2RlOjpSMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIFBhZ2VTY2FuUmVwZXRpdGlvbiBtb2RlICVkIiwgc3RhdGljX2Nhc3Q8aW50PihyZXF1ZXN0LT5wYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlKCkpKTsKLSAgICB9Ci0gICAgbmFtZV9tb2R1bGVfLT5SZWFkUmVtb3RlTmFtZVJlcXVlc3QoCi0gICAgICAgIHJlbW90ZSwKLSAgICAgICAgbW9kZSwKLSAgICAgICAgcmVxdWVzdC0+Y2xvY2tfb2Zmc2V0KCksCi0gICAgICAgIChyZXF1ZXN0LT5jbG9ja19vZmZzZXQoKSAhPSAwID8gaGNpOjpDbG9ja09mZnNldFZhbGlkOjpWQUxJRCA6IGhjaTo6Q2xvY2tPZmZzZXRWYWxpZDo6SU5WQUxJRCksCi0gICAgICAgIGNvbW1vbjo6QmluZCgmTmVpZ2hib3JGYWNhZGVTZXJ2aWNlOjpvbl9yZW1vdGVfbmFtZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgZmFjYWRlX2hhbmRsZXJfKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgR2V0UmVtb3RlTmFtZUV2ZW50cygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxSZW1vdGVOYW1lUmVzcG9uc2VNc2c+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gcGVuZGluZ19yZW1vdGVfbmFtZXNfLlJ1bkxvb3AoY29udGV4dCwgd3JpdGVyKTsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEVuYWJsZUlucXVpcnlTY2FuKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6Om5laWdoYm9yOjpFbmFibGVNc2cqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGlmIChyZXF1ZXN0LT5lbmFibGVkKCkpIHsKLSAgICAgIHNjYW5fbW9kdWxlXy0+U2V0SW5xdWlyeVNjYW4oKTsKLSAgICB9IGVsc2UgewotICAgICAgc2Nhbl9tb2R1bGVfLT5DbGVhcklucXVpcnlTY2FuKCk7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBFbmFibGVQYWdlU2NhbigKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpuZWlnaGJvcjo6RW5hYmxlTXNnKiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBpZiAocmVxdWVzdC0+ZW5hYmxlZCgpKSB7Ci0gICAgICBzY2FuX21vZHVsZV8tPlNldFBhZ2VTY2FuKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNjYW5fbW9kdWxlXy0+Q2xlYXJQYWdlU2NhbigpOwotICAgIH0KLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIG9uX2luY29taW5nX2lucXVpcnlfcmVzdWx0KGhjaTo6RXZlbnRWaWV3IHZpZXcpIHsKLSAgICBJbnF1aXJ5UmVzdWx0TXNnIGlucXVpcnlfcmVzdWx0X21zZzsKLSAgICBpbnF1aXJ5X3Jlc3VsdF9tc2cuc2V0X3BhY2tldChzdGQ6OnN0cmluZyh2aWV3LmJlZ2luKCksIHZpZXcuZW5kKCkpKTsKLSAgICBwZW5kaW5nX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KHN0ZDo6bW92ZShpbnF1aXJ5X3Jlc3VsdF9tc2cpKTsKLSAgfQotCi0gIHZvaWQgb25faW5jb21pbmdfaW5xdWlyeV9jb21wbGV0ZShoY2k6OkVycm9yQ29kZSBzdGF0dXMpIHsKLSAgICBJbnF1aXJ5UmVzdWx0TXNnIGlucXVpcnlfcmVzdWx0X21zZzsKLSAgICBpbnF1aXJ5X3Jlc3VsdF9tc2cuc2V0X3BhY2tldChoY2k6OkVycm9yQ29kZVRleHQoc3RhdHVzKSk7Ci0gICAgcGVuZGluZ19ldmVudHNfLk9uSW5jb21pbmdFdmVudChzdGQ6Om1vdmUoaW5xdWlyeV9yZXN1bHRfbXNnKSk7Ci0gIH0KLQotICBJbnF1aXJ5Q2FsbGJhY2tzIGlucXVpcnlfY2FsbGJhY2tzX3sKLSAgICAgIC5yZXN1bHQgPSBbdGhpc10oaGNpOjpJbnF1aXJ5UmVzdWx0VmlldyB2aWV3KSB7IG9uX2luY29taW5nX2lucXVpcnlfcmVzdWx0KHZpZXcpOyB9LAotICAgICAgLnJlc3VsdF93aXRoX3Jzc2kgPSBbdGhpc10oaGNpOjpJbnF1aXJ5UmVzdWx0V2l0aFJzc2lWaWV3IHZpZXcpIHsgb25faW5jb21pbmdfaW5xdWlyeV9yZXN1bHQodmlldyk7IH0sCi0gICAgICAuZXh0ZW5kZWRfcmVzdWx0ID0gW3RoaXNdKGhjaTo6RXh0ZW5kZWRJbnF1aXJ5UmVzdWx0VmlldyB2aWV3KSB7IG9uX2luY29taW5nX2lucXVpcnlfcmVzdWx0KHZpZXcpOyB9LAotICAgICAgLmNvbXBsZXRlID0gW3RoaXNdKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykgeyBvbl9pbmNvbWluZ19pbnF1aXJ5X2NvbXBsZXRlKHN0YXR1cyk7IH19OwotCi0gIHZvaWQgb25fcmVtb3RlX25hbWUoaGNpOjpFcnJvckNvZGUgc3RhdHVzLCBoY2k6OkFkZHJlc3MgYWRkcmVzcywgc3RkOjphcnJheTx1aW50OF90LCAyNDg+IG5hbWUpIHsKLSAgICBSZW1vdGVOYW1lUmVzcG9uc2VNc2cgcmVzcG9uc2U7Ci0gICAgcmVzcG9uc2Uuc2V0X3N0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOwotICAgIHJlc3BvbnNlLnNldF9hZGRyZXNzKGFkZHJlc3MuVG9TdHJpbmcoKSk7Ci0gICAgcmVzcG9uc2Uuc2V0X25hbWUobmFtZS5iZWdpbigpLCBuYW1lLnNpemUoKSk7Ci0gICAgcGVuZGluZ19yZW1vdGVfbmFtZXNfLk9uSW5jb21pbmdFdmVudChyZXNwb25zZSk7Ci0gIH0KLQotICBDb25uZWN0YWJpbGl0eU1vZHVsZSogY29ubmVjdGFiaWxpdHlfbW9kdWxlXzsKLSAgRGlzY292ZXJhYmlsaXR5TW9kdWxlKiBkaXNjb3ZlcmFiaWxpdHlfbW9kdWxlXzsKLSAgSW5xdWlyeU1vZHVsZSogaW5xdWlyeV9tb2R1bGVfOwotICBOYW1lTW9kdWxlKiBuYW1lX21vZHVsZV87Ci0gIFNjYW5Nb2R1bGUqIHNjYW5fbW9kdWxlXzsKLSAgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcl87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxJbnF1aXJ5UmVzdWx0TXNnPiBwZW5kaW5nX2V2ZW50c197IklucXVpcnlSZXNwb25zZXMifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPFJlbW90ZU5hbWVSZXNwb25zZU1zZz4gcGVuZGluZ19yZW1vdGVfbmFtZXNfeyJSZW1vdGVOYW1lUmVzcG9uc2VzIn07Ci19OwotCi12b2lkIE5laWdoYm9yRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxDb25uZWN0YWJpbGl0eU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPERpc2NvdmVyYWJpbGl0eU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPElucXVpcnlNb2R1bGU+KCk7Ci0gIGxpc3QtPmFkZDxOYW1lTW9kdWxlPigpOwotICBsaXN0LT5hZGQ8UGFnZU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPFNjYW5Nb2R1bGU+KCk7Ci19Ci0KLXZvaWQgTmVpZ2hib3JGYWNhZGVNb2R1bGU6OlN0YXJ0KCkgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RhcnQoKTsKLSAgc2VydmljZV8gPSBuZXcgTmVpZ2hib3JGYWNhZGVTZXJ2aWNlKAotICAgICAgR2V0RGVwZW5kZW5jeTxDb25uZWN0YWJpbGl0eU1vZHVsZT4oKSwKLSAgICAgIEdldERlcGVuZGVuY3k8RGlzY292ZXJhYmlsaXR5TW9kdWxlPigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxJbnF1aXJ5TW9kdWxlPigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxOYW1lTW9kdWxlPigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxQYWdlTW9kdWxlPigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxTY2FuTW9kdWxlPigpLAotICAgICAgR2V0SGFuZGxlcigpKTsKLX0KLQotdm9pZCBOZWlnaGJvckZhY2FkZU1vZHVsZTo6U3RvcCgpIHsKLSAgZGVsZXRlIHNlcnZpY2VfOwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RvcCgpOwotfQotCi06OmdycGM6OlNlcnZpY2UqIE5laWdoYm9yRmFjYWRlTW9kdWxlOjpHZXRTZXJ2aWNlKCkgY29uc3QgewotICByZXR1cm4gc2VydmljZV87Ci19Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgTmVpZ2hib3JGYWNhZGVNb2R1bGU6OkZhY3RvcnkgPQotICAgIDo6Ymx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IE5laWdoYm9yRmFjYWRlTW9kdWxlKCk7IH0pOwotCi19ICAvLyBuYW1lc3BhY2UgZmFjYWRlCi19ICAvLyBuYW1lc3BhY2UgbmVpZ2hib3IKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL2ZhY2FkZS9mYWNhZGUuaCBiL2dkL25laWdoYm9yL2ZhY2FkZS9mYWNhZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkN2IzMi4uMDAwMDAwMAotLS0gYS9nZC9uZWlnaGJvci9mYWNhZGUvZmFjYWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdycGMrKy9ncnBjKysuaD4KLQotI2luY2x1ZGUgImdycGMvZ3JwY19tb2R1bGUuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9jb25uZWN0YWJpbGl0eS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL2Rpc2NvdmVyYWJpbGl0eS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL2lucXVpcnkuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9uYW1lLmgiCi0jaW5jbHVkZSAibmVpZ2hib3IvcGFnZS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL3NjYW4uaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbmVpZ2hib3IgewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLWNsYXNzIE5laWdoYm9yRmFjYWRlU2VydmljZTsKLQotY2xhc3MgTmVpZ2hib3JGYWNhZGVNb2R1bGUgOiBwdWJsaWMgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgTmVpZ2hib3JGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmYWNhZGUKLX0gIC8vIG5hbWVzcGFjZSBuZWlnaGJvcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvZmFjYWRlL2ZhY2FkZS5wcm90byBiL2dkL25laWdoYm9yL2ZhY2FkZS9mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDk1NDcuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvZmFjYWRlL2ZhY2FkZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGJsdWV0b290aC5uZWlnaGJvcjsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iOwotCi1zZXJ2aWNlIE5laWdoYm9yRmFjYWRlIHsKLSAgcnBjIFNldENvbm5lY3RhYmlsaXR5KEVuYWJsZU1zZykgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2V0RGlzY292ZXJhYmlsaXR5KERpc2NvdmVyYWJpbGl0aXlNc2cpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNldElucXVpcnlNb2RlKElucXVpcnlNc2cpIHJldHVybnMgKHN0cmVhbSBJbnF1aXJ5UmVzdWx0TXNnKSB7Ci0gICAgLy8gU2V0cyBpbnF1aXJ5IG1vZGUgYW5kIGZldGNoZXMgaW5xdWlyeSByZXN1bHQgSENJIHBhY2tldAotICB9Ci0gIHJwYyBSZWFkUmVtb3RlTmFtZShSZW1vdGVOYW1lUmVxdWVzdE1zZykgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgR2V0UmVtb3RlTmFtZUV2ZW50cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBSZW1vdGVOYW1lUmVzcG9uc2VNc2cpIHt9Ci0gIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgYSBibG9ja2luZyBjYWxsIGZvciBSZWFkUmVtb3RlTmFtZSBpbnN0ZWFkPyAoTm90ZTogYmxvY2tpbmcgbW9kZWwgbWF5IG5vdCB3b3JrIGZvciBHRCBzdGFjaykKLSAgcnBjIEVuYWJsZUlucXVpcnlTY2FuKEVuYWJsZU1zZykgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgRW5hYmxlUGFnZVNjYW4oRW5hYmxlTXNnKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci19Ci0KLW1lc3NhZ2UgRW5hYmxlTXNnIHsKLSAgYm9vbCBlbmFibGVkID0gMTsKLX0KLQotZW51bSBEaXNjb3ZlcmFiaWxpdHlNb2RlIHsKLSAgT0ZGID0gMDsKLSAgTElNSVRFRCA9IDE7Ci0gIEdFTkVSQUwgPSAyOwotfQotCi1tZXNzYWdlIERpc2NvdmVyYWJpbGl0aXlNc2cgewotICBEaXNjb3ZlcmFiaWxpdHlNb2RlIG1vZGUgPSAxOwotfQotCi1lbnVtIFJlc3VsdE1vZGUgewotICBTVEFOREFSRCA9IDA7Ci0gIFJTU0kgPSAxOwotICBFWFRFTkRFRCA9IDI7Ci19Ci0KLW1lc3NhZ2UgSW5xdWlyeU1zZyB7Ci0gIERpc2NvdmVyYWJpbGl0eU1vZGUgaW5xdWlyeV9tb2RlID0gMTsKLSAgUmVzdWx0TW9kZSByZXN1bHRfbW9kZSA9IDI7Ci0gIHVpbnQzMiBsZW5ndGhfMV8yOHMgPSAzOwotICB1aW50MzIgbWF4X3Jlc3VsdHMgPSA0OyAgLy8gMCBpcyB1bmxpbWl0ZWQKLX0KLQotbWVzc2FnZSBJbnF1aXJ5UmVzdWx0TXNnIHsKLSAgYnl0ZXMgcGFja2V0ID0gMTsKLX0KLQotbWVzc2FnZSBSZW1vdGVOYW1lUmVxdWVzdE1zZyB7Ci0gIGJ5dGVzIGFkZHJlc3MgPSAxOwotICB1aW50MzIgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSA9IDI7ICAvLyByMCwgcjEsIHIyCi0gIHVpbnQzMiBjbG9ja19vZmZzZXQgPSAzOwotfQotCi1tZXNzYWdlIFJlbW90ZU5hbWVSZXNwb25zZU1zZyB7Ci0gIHVpbnQzMiBzdGF0dXMgPSAxOwotICBieXRlcyBhZGRyZXNzID0gMjsKLSAgYnl0ZXMgbmFtZSA9IDM7Ci19CmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9pbnF1aXJ5LmNjIGIvZ2QvbmVpZ2hib3IvaW5xdWlyeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZWViYi4uMDAwMDAwMAotLS0gYS9nZC9uZWlnaGJvci9pbnF1aXJ5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgImJ0X2dkX25laWdoIgotCi0jaW5jbHVkZSAibmVpZ2hib3IvaW5xdWlyeS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBuZWlnaGJvciB7Ci0KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrR2VuZXJhbElucXVpcnlBY2Nlc3NDb2RlID0gMHgzMzsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTGltaXRlZElucXVpcnlBY2Nlc3NDb2RlID0gMHgwMDsKLQotc3RydWN0IElucXVpcnlNb2R1bGU6OmltcGwgewotICB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKElucXVpcnlDYWxsYmFja3MgaW5xdWlyeV9jYWxsYmFja3MpOwotICB2b2lkIFVucmVnaXN0ZXJDYWxsYmFja3MoKTsKLQotICB2b2lkIFN0YXJ0T25lU2hvdElucXVpcnkoYm9vbCBsaW1pdGVkLCBJbnF1aXJ5TGVuZ3RoIGlucXVpcnlfbGVuZ3RoLCBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcyk7Ci0gIHZvaWQgU3RvcE9uZVNob3RJbnF1aXJ5KCk7Ci0KLSAgdm9pZCBTdGFydFBlcmlvZGljSW5xdWlyeSgKLSAgICAgIGJvb2wgbGltaXRlZCwKLSAgICAgIElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsCi0gICAgICBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcywKLSAgICAgIFBlcmlvZExlbmd0aCBtYXhfZGVsYXksCi0gICAgICBQZXJpb2RMZW5ndGggbWluX2RlbGF5KTsKLSAgdm9pZCBTdG9wUGVyaW9kaWNJbnF1aXJ5KCk7Ci0KLSAgdm9pZCBTZXRTY2FuQWN0aXZpdHkoU2NhblBhcmFtZXRlcnMgcGFyYW1zKTsKLQotICB2b2lkIFNldFNjYW5UeXBlKGhjaTo6SW5xdWlyeVNjYW5UeXBlIHNjYW5fdHlwZSk7Ci0KLSAgdm9pZCBTZXRJbnF1aXJ5TW9kZShoY2k6OklucXVpcnlNb2RlIG1vZGUpOwotCi0gIHZvaWQgU3RhcnQoKTsKLSAgdm9pZCBTdG9wKCk7Ci0KLSAgYm9vbCBIYXNDYWxsYmFja3MoKSBjb25zdDsKLQotICBpbXBsKElucXVpcnlNb2R1bGUmIGlucXVpcnlfbW9kdWxlKTsKLQotIHByaXZhdGU6Ci0gIElucXVpcnlDYWxsYmFja3MgaW5xdWlyeV9jYWxsYmFja3NfOwotCi0gIElucXVpcnlNb2R1bGUmIG1vZHVsZV87Ci0KLSAgYm9vbCBhY3RpdmVfZ2VuZXJhbF9vbmVfc2hvdF97ZmFsc2V9OwotICBib29sIGFjdGl2ZV9saW1pdGVkX29uZV9zaG90X3tmYWxzZX07Ci0gIGJvb2wgYWN0aXZlX2dlbmVyYWxfcGVyaW9kaWNfe2ZhbHNlfTsKLSAgYm9vbCBhY3RpdmVfbGltaXRlZF9wZXJpb2RpY197ZmFsc2V9OwotCi0gIFNjYW5QYXJhbWV0ZXJzIGlucXVpcnlfc2Nhbl87Ci0gIGhjaTo6SW5xdWlyeU1vZGUgaW5xdWlyeV9tb2RlXzsKLSAgaGNpOjpJbnF1aXJ5U2NhblR5cGUgaW5xdWlyeV9zY2FuX3R5cGVfOwotICBpbnQ4X3QgaW5xdWlyeV9yZXNwb25zZV90eF9wb3dlcl87Ci0KLSAgYm9vbCBJc0lucXVpcnlBY3RpdmUoKSBjb25zdDsKLQotICB2b2lkIEVucXVldWVDb21tYW5kQ29tcGxldGUoc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpOwotICB2b2lkIEVucXVldWVDb21tYW5kU3RhdHVzKHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kKTsKLSAgdm9pZCBPbkNvbW1hbmRDb21wbGV0ZShoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgdmlldyk7Ci0gIHZvaWQgT25Db21tYW5kU3RhdHVzKGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKTsKLQotICB2b2lkIEVucXVldWVDb21tYW5kQ29tcGxldGVTeW5jKHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kKTsKLSAgdm9pZCBPbkNvbW1hbmRDb21wbGV0ZVN5bmMoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpOwotCi0gIHZvaWQgT25FdmVudChoY2k6OkV2ZW50VmlldyB2aWV3KTsKLQotICBzdGQ6OnByb21pc2U8dm9pZD4qIGNvbW1hbmRfc3luY197bnVsbHB0cn07Ci0KLSAgaGNpOjpIY2lMYXllciogaGNpX2xheWVyXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgbmVpZ2hib3I6OklucXVpcnlNb2R1bGUoKTsgfSk7Ci0KLW5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjppbXBsKG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlJiBtb2R1bGUpIDogbW9kdWxlXyhtb2R1bGUpIHt9Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlU3luYyhoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICBPbkNvbW1hbmRDb21wbGV0ZSh2aWV3KTsKLSAgQVNTRVJUKGNvbW1hbmRfc3luY18gIT0gbnVsbHB0cik7Ci0gIGNvbW1hbmRfc3luY18tPnNldF92YWx1ZSgpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpPbkNvbW1hbmRDb21wbGV0ZShoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICBzd2l0Y2ggKHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKSB7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6SU5RVUlSWV9DQU5DRUw6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpJbnF1aXJ5Q2FuY2VsQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UEVSSU9ESUNfSU5RVUlSWV9NT0RFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6UGVyaW9kaWNJbnF1aXJ5TW9kZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgaGNpOjpPcENvZGU6OkVYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6RXhpdFBlcmlvZGljSW5xdWlyeU1vZGVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9JTlFVSVJZX01PREU6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpXcml0ZUlucXVpcnlNb2RlQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9JTlFVSVJZX01PREU6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkSW5xdWlyeU1vZGVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgaW5xdWlyeV9tb2RlXyA9IHBhY2tldC5HZXRJbnF1aXJ5TW9kZSgpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0lOUVVJUllfUkVTUE9OU0VfVFJBTlNNSVRfUE9XRVJfTEVWRUw6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkSW5xdWlyeVJlc3BvbnNlVHJhbnNtaXRQb3dlckxldmVsQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICAgIGlucXVpcnlfcmVzcG9uc2VfdHhfcG93ZXJfID0gcGFja2V0LkdldFR4UG93ZXIoKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6V3JpdGVJbnF1aXJ5U2NhbkFjdGl2aXR5Q29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9JTlFVSVJZX1NDQU5fQUNUSVZJVFk6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkSW5xdWlyeVNjYW5BY3Rpdml0eUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgICBpbnF1aXJ5X3NjYW5fLmludGVydmFsID0gcGFja2V0LkdldElucXVpcnlTY2FuSW50ZXJ2YWwoKTsKLSAgICAgIGlucXVpcnlfc2Nhbl8ud2luZG93ID0gcGFja2V0LkdldElucXVpcnlTY2FuV2luZG93KCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX0lOUVVJUllfU0NBTl9UWVBFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6V3JpdGVJbnF1aXJ5U2NhblR5cGVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0lOUVVJUllfU0NBTl9UWVBFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6UmVhZElucXVpcnlTY2FuVHlwZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgICBpbnF1aXJ5X3NjYW5fdHlwZV8gPSBwYWNrZXQuR2V0SW5xdWlyeVNjYW5UeXBlKCk7Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigiVW5oYW5kbGVkIGNvbW1hbmQ6JXMiLCBoY2k6Ok9wQ29kZVRleHQodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6T25Db21tYW5kU3RhdHVzKGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXcgc3RhdHVzKSB7Ci0gIEFTU0VSVChzdGF0dXMuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotCi0gIHN3aXRjaCAoc3RhdHVzLkdldENvbW1hbmRPcENvZGUoKSkgewotICAgIGNhc2UgaGNpOjpPcENvZGU6OklOUVVJUlk6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpJbnF1aXJ5U3RhdHVzVmlldzo6Q3JlYXRlKHN0YXR1cyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBpZiAoYWN0aXZlX2xpbWl0ZWRfb25lX3Nob3RfIHx8IGFjdGl2ZV9nZW5lcmFsX29uZV9zaG90XykgewotICAgICAgICBMT0dfSU5GTygiSW5xdWlyeSBzdGFydGVkIGxhcDogJXMiLCBhY3RpdmVfbGltaXRlZF9vbmVfc2hvdF8gPyAiTGltaXRlZCIgOiAiR2VuZXJhbCIpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIlVuaGFuZGxlZCBjb21tYW5kOiVzIiwgaGNpOjpPcENvZGVUZXh0KHN0YXR1cy5HZXRDb21tYW5kT3BDb2RlKCkpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6T25FdmVudChoY2k6OkV2ZW50VmlldyB2aWV3KSB7Ci0gIHN3aXRjaCAodmlldy5HZXRFdmVudENvZGUoKSkgewotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklOUVVJUllfQ09NUExFVEU6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpJbnF1aXJ5Q29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBMT0dfSU5GTygiaW5xdWlyeSBjb21wbGV0ZSIpOwotICAgICAgYWN0aXZlX2xpbWl0ZWRfb25lX3Nob3RfID0gZmFsc2U7Ci0gICAgICBhY3RpdmVfZ2VuZXJhbF9vbmVfc2hvdF8gPSBmYWxzZTsKLSAgICAgIGlucXVpcnlfY2FsbGJhY2tzXy5jb21wbGV0ZShwYWNrZXQuR2V0U3RhdHVzKCkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVDogewotICAgICAgYXV0byBwYWNrZXQgPSBoY2k6OklucXVpcnlSZXN1bHRWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBMT0dfSU5GTygiSW5xdWlyeSByZXN1bHQgc2l6ZTolemQgbnVtX3Jlc3BvbnNlczolenUiLCBwYWNrZXQuc2l6ZSgpLCBwYWNrZXQuR2V0SW5xdWlyeVJlc3VsdHMoKS5zaXplKCkpOwotICAgICAgaW5xdWlyeV9jYWxsYmFja3NfLnJlc3VsdChwYWNrZXQpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVF9XSVRIX1JTU0k6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpJbnF1aXJ5UmVzdWx0V2l0aFJzc2lWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBMT0dfSU5GTygiSW5xdWlyeSByZXN1bHQgd2l0aCByc3NpIG51bV9yZXNwb25zZXM6JXp1IiwgcGFja2V0LkdldElucXVpcnlSZXN1bHRzKCkuc2l6ZSgpKTsKLSAgICAgIGlucXVpcnlfY2FsbGJhY2tzXy5yZXN1bHRfd2l0aF9yc3NpKHBhY2tldCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkVYVEVOREVEX0lOUVVJUllfUkVTVUxUOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6RXh0ZW5kZWRJbnF1aXJ5UmVzdWx0Vmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgIkV4dGVuZGVkIGlucXVpcnkgcmVzdWx0IGFkZHI6JXMgcmVwZXRpdGlvbl9tb2RlOiVzIGNvZDolcyBjbG9ja19vZmZzZXQ6JWQgcnNzaTolaGhkIiwKLSAgICAgICAgICBwYWNrZXQuR2V0QWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICBoY2k6OlBhZ2VTY2FuUmVwZXRpdGlvbk1vZGVUZXh0KHBhY2tldC5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCkpLmNfc3RyKCksCi0gICAgICAgICAgcGFja2V0LkdldENsYXNzT2ZEZXZpY2UoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgcGFja2V0LkdldENsb2NrT2Zmc2V0KCksCi0gICAgICAgICAgcGFja2V0LkdldFJzc2koKSk7Ci0gICAgICBpbnF1aXJ5X2NhbGxiYWNrc18uZXh0ZW5kZWRfcmVzdWx0KHBhY2tldCk7Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlVuaGFuZGxlZCBldmVudDolcyIsIGhjaTo6RXZlbnRDb2RlVGV4dCh2aWV3LkdldEV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKgotICogaW1wbAotICovCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpSZWdpc3RlckNhbGxiYWNrcyhJbnF1aXJ5Q2FsbGJhY2tzIGNhbGxiYWNrcykgewotICBpbnF1aXJ5X2NhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0KLSAgaGNpX2xheWVyXy0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFQsIGhhbmRsZXJfLT5CaW5kT24odGhpcywgJklucXVpcnlNb2R1bGU6OmltcGw6Ok9uRXZlbnQpKTsKLSAgaGNpX2xheWVyXy0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJLCBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZJbnF1aXJ5TW9kdWxlOjppbXBsOjpPbkV2ZW50KSk7Ci0gIGhjaV9sYXllcl8tPlJlZ2lzdGVyRXZlbnRIYW5kbGVyKAotICAgICAgaGNpOjpFdmVudENvZGU6OkVYVEVOREVEX0lOUVVJUllfUkVTVUxULCBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZJbnF1aXJ5TW9kdWxlOjppbXBsOjpPbkV2ZW50KSk7Ci0gIGhjaV9sYXllcl8tPlJlZ2lzdGVyRXZlbnRIYW5kbGVyKAotICAgICAgaGNpOjpFdmVudENvZGU6OklOUVVJUllfQ09NUExFVEUsIGhhbmRsZXJfLT5CaW5kT24odGhpcywgJklucXVpcnlNb2R1bGU6OmltcGw6Ok9uRXZlbnQpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6VW5yZWdpc3RlckNhbGxiYWNrcygpIHsKLSAgaGNpX2xheWVyXy0+VW5yZWdpc3RlckV2ZW50SGFuZGxlcihoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9DT01QTEVURSk7Ci0gIGhjaV9sYXllcl8tPlVucmVnaXN0ZXJFdmVudEhhbmRsZXIoaGNpOjpFdmVudENvZGU6OkVYVEVOREVEX0lOUVVJUllfUkVTVUxUKTsKLSAgaGNpX2xheWVyXy0+VW5yZWdpc3RlckV2ZW50SGFuZGxlcihoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJKTsKLSAgaGNpX2xheWVyXy0+VW5yZWdpc3RlckV2ZW50SGFuZGxlcihoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFQpOwotCi0gIGlucXVpcnlfY2FsbGJhY2tzXyA9IHtudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6RW5xdWV1ZUNvbW1hbmRDb21wbGV0ZShzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpDb21tYW5kQnVpbGRlcj4gY29tbWFuZCkgewotICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZChzdGQ6Om1vdmUoY29tbWFuZCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpFbnF1ZXVlQ29tbWFuZFN0YXR1cyhzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpDb21tYW5kQnVpbGRlcj4gY29tbWFuZCkgewotICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZChzdGQ6Om1vdmUoY29tbWFuZCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRTdGF0dXMpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6RW5xdWV1ZUNvbW1hbmRDb21wbGV0ZVN5bmMoc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpIHsKLSAgQVNTRVJUKGNvbW1hbmRfc3luY18gPT0gbnVsbHB0cik7Ci0gIGNvbW1hbmRfc3luY18gPSBuZXcgc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIGF1dG8gY29tbWFuZF9yZWNlaXZlZCA9IGNvbW1hbmRfc3luY18tPmdldF9mdXR1cmUoKTsKLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKGNvbW1hbmQpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kQ29tcGxldGVTeW5jKSk7Ci0gIGNvbW1hbmRfcmVjZWl2ZWQud2FpdCgpOwotICBkZWxldGUgY29tbWFuZF9zeW5jXzsKLSAgY29tbWFuZF9zeW5jXyA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6OlN0YXJ0T25lU2hvdElucXVpcnkoCi0gICAgYm9vbCBsaW1pdGVkLCBJbnF1aXJ5TGVuZ3RoIGlucXVpcnlfbGVuZ3RoLCBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcykgewotICBBU1NFUlQoSGFzQ2FsbGJhY2tzKCkpOwotICBBU1NFUlQoIUlzSW5xdWlyeUFjdGl2ZSgpKTsKLSAgaGNpOjpMYXAgbGFwOwotICBpZiAobGltaXRlZCkgewotICAgIGFjdGl2ZV9saW1pdGVkX29uZV9zaG90XyA9IHRydWU7Ci0gICAgbGFwLmxhcF8gPSBrTGltaXRlZElucXVpcnlBY2Nlc3NDb2RlOwotICB9IGVsc2UgewotICAgIGFjdGl2ZV9nZW5lcmFsX29uZV9zaG90XyA9IHRydWU7Ci0gICAgbGFwLmxhcF8gPSBrR2VuZXJhbElucXVpcnlBY2Nlc3NDb2RlOwotICB9Ci0gIEVucXVldWVDb21tYW5kU3RhdHVzKGhjaTo6SW5xdWlyeUJ1aWxkZXI6OkNyZWF0ZShsYXAsIGlucXVpcnlfbGVuZ3RoLCBudW1fcmVzcG9uc2VzKSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6OlN0b3BPbmVTaG90SW5xdWlyeSgpIHsKLSAgQVNTRVJUKGFjdGl2ZV9nZW5lcmFsX29uZV9zaG90XyB8fCBhY3RpdmVfbGltaXRlZF9vbmVfc2hvdF8pOwotICBhY3RpdmVfZ2VuZXJhbF9vbmVfc2hvdF8gPSBmYWxzZTsKLSAgYWN0aXZlX2xpbWl0ZWRfb25lX3Nob3RfID0gZmFsc2U7Ci0gIEVucXVldWVDb21tYW5kQ29tcGxldGUoaGNpOjpJbnF1aXJ5Q2FuY2VsQnVpbGRlcjo6Q3JlYXRlKCkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTdGFydFBlcmlvZGljSW5xdWlyeSgKLSAgICBib29sIGxpbWl0ZWQsCi0gICAgSW5xdWlyeUxlbmd0aCBpbnF1aXJ5X2xlbmd0aCwKLSAgICBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcywKLSAgICBQZXJpb2RMZW5ndGggbWF4X2RlbGF5LAotICAgIFBlcmlvZExlbmd0aCBtaW5fZGVsYXkpIHsKLSAgQVNTRVJUKEhhc0NhbGxiYWNrcygpKTsKLSAgQVNTRVJUKCFJc0lucXVpcnlBY3RpdmUoKSk7Ci0gIGhjaTo6TGFwIGxhcDsKLSAgaWYgKGxpbWl0ZWQpIHsKLSAgICBhY3RpdmVfbGltaXRlZF9wZXJpb2RpY18gPSB0cnVlOwotICAgIGxhcC5sYXBfID0ga0xpbWl0ZWRJbnF1aXJ5QWNjZXNzQ29kZTsKLSAgfSBlbHNlIHsKLSAgICBhY3RpdmVfZ2VuZXJhbF9wZXJpb2RpY18gPSB0cnVlOwotICAgIGxhcC5sYXBfID0ga0dlbmVyYWxJbnF1aXJ5QWNjZXNzQ29kZTsKLSAgfQotICBFbnF1ZXVlQ29tbWFuZENvbXBsZXRlKAotICAgICAgaGNpOjpQZXJpb2RpY0lucXVpcnlNb2RlQnVpbGRlcjo6Q3JlYXRlKG1heF9kZWxheSwgbWluX2RlbGF5LCBsYXAsIGlucXVpcnlfbGVuZ3RoLCBudW1fcmVzcG9uc2VzKSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6OlN0b3BQZXJpb2RpY0lucXVpcnkoKSB7Ci0gIEFTU0VSVChhY3RpdmVfZ2VuZXJhbF9wZXJpb2RpY18gfHwgYWN0aXZlX2xpbWl0ZWRfcGVyaW9kaWNfKTsKLSAgYWN0aXZlX2dlbmVyYWxfcGVyaW9kaWNfID0gZmFsc2U7Ci0gIGFjdGl2ZV9saW1pdGVkX3BlcmlvZGljXyA9IGZhbHNlOwotICBFbnF1ZXVlQ29tbWFuZENvbXBsZXRlKGhjaTo6RXhpdFBlcmlvZGljSW5xdWlyeU1vZGVCdWlsZGVyOjpDcmVhdGUoKSk7Ci19Ci0KLWJvb2wgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6OklzSW5xdWlyeUFjdGl2ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGFjdGl2ZV9nZW5lcmFsX29uZV9zaG90XyB8fCBhY3RpdmVfbGltaXRlZF9vbmVfc2hvdF8gfHwgYWN0aXZlX2xpbWl0ZWRfcGVyaW9kaWNfIHx8IGFjdGl2ZV9nZW5lcmFsX3BlcmlvZGljXzsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U3RhcnQoKSB7Ci0gIGhjaV9sYXllcl8gPSBtb2R1bGVfLkdldERlcGVuZGVuY3k8aGNpOjpIY2lMYXllcj4oKTsKLSAgaGFuZGxlcl8gPSBtb2R1bGVfLkdldEhhbmRsZXIoKTsKLQotICBFbnF1ZXVlQ29tbWFuZENvbXBsZXRlKGhjaTo6UmVhZElucXVpcnlSZXNwb25zZVRyYW5zbWl0UG93ZXJMZXZlbEJ1aWxkZXI6OkNyZWF0ZSgpKTsKLSAgRW5xdWV1ZUNvbW1hbmRDb21wbGV0ZShoY2k6OlJlYWRJbnF1aXJ5U2NhbkFjdGl2aXR5QnVpbGRlcjo6Q3JlYXRlKCkpOwotICBFbnF1ZXVlQ29tbWFuZENvbXBsZXRlKGhjaTo6UmVhZElucXVpcnlTY2FuVHlwZUJ1aWxkZXI6OkNyZWF0ZSgpKTsKLSAgRW5xdWV1ZUNvbW1hbmRDb21wbGV0ZVN5bmMoaGNpOjpSZWFkSW5xdWlyeU1vZGVCdWlsZGVyOjpDcmVhdGUoKSk7Ci0KLSAgTE9HX0lORk8oIlN0YXJ0ZWQgaW5xdWlyeSBtb2R1bGUiKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U3RvcCgpIHsKLSAgTE9HX0lORk8oIklucXVpcnkgc2NhbiBpbnRlcnZhbDolaHUgd2luZG93OiVodSIsIGlucXVpcnlfc2Nhbl8uaW50ZXJ2YWwsIGlucXVpcnlfc2Nhbl8ud2luZG93KTsKLSAgTE9HX0lORk8oCi0gICAgICAiSW5xdWlyeSBtb2RlOiVzIHNjYW5fdHlwZTolcyIsCi0gICAgICBoY2k6OklucXVpcnlNb2RlVGV4dChpbnF1aXJ5X21vZGVfKS5jX3N0cigpLAotICAgICAgaGNpOjpJbnF1aXJ5U2NhblR5cGVUZXh0KGlucXVpcnlfc2Nhbl90eXBlXykuY19zdHIoKSk7Ci0gIExPR19JTkZPKCJJbnF1aXJ5IHJlc3BvbnNlIHR4IHBvd2VyOiVoaGQiLCBpbnF1aXJ5X3Jlc3BvbnNlX3R4X3Bvd2VyXyk7Ci0gIExPR19JTkZPKCJTdG9wcGVkIGlucXVpcnkgbW9kdWxlIik7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6OlNldElucXVpcnlNb2RlKGhjaTo6SW5xdWlyeU1vZGUgbW9kZSkgewotICBFbnF1ZXVlQ29tbWFuZENvbXBsZXRlKGhjaTo6V3JpdGVJbnF1aXJ5TW9kZUJ1aWxkZXI6OkNyZWF0ZShtb2RlKSk7Ci0gIGlucXVpcnlfbW9kZV8gPSBtb2RlOwotICBMT0dfSU5GTygiU2V0IGlucXVpcnkgbW9kZTolcyIsIGhjaTo6SW5xdWlyeU1vZGVUZXh0KG1vZGUpLmNfc3RyKCkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTZXRTY2FuQWN0aXZpdHkoU2NhblBhcmFtZXRlcnMgcGFyYW1zKSB7Ci0gIEVucXVldWVDb21tYW5kQ29tcGxldGUoaGNpOjpXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlCdWlsZGVyOjpDcmVhdGUocGFyYW1zLmludGVydmFsLCBwYXJhbXMud2luZG93KSk7Ci0gIGlucXVpcnlfc2Nhbl8gPSBwYXJhbXM7Ci0gIExPR19JTkZPKAotICAgICAgIlNldCBzY2FuIGFjdGl2aXR5IGludGVydmFsOjB4JXgvJS4wMmZtcyB3aW5kb3c6MHgleC8lLjAyZm1zIiwKLSAgICAgIHBhcmFtcy5pbnRlcnZhbCwKLSAgICAgIFNjYW5JbnRlcnZhbFRpbWVNcyhwYXJhbXMuaW50ZXJ2YWwpLAotICAgICAgcGFyYW1zLndpbmRvdywKLSAgICAgIFNjYW5XaW5kb3dUaW1lTXMocGFyYW1zLndpbmRvdykpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTZXRTY2FuVHlwZShoY2k6OklucXVpcnlTY2FuVHlwZSBzY2FuX3R5cGUpIHsKLSAgRW5xdWV1ZUNvbW1hbmRDb21wbGV0ZShoY2k6OldyaXRlSW5xdWlyeVNjYW5UeXBlQnVpbGRlcjo6Q3JlYXRlKHNjYW5fdHlwZSkpOwotICBMT0dfSU5GTygiU2V0IHNjYW4gdHlwZTolcyIsIGhjaTo6SW5xdWlyeVNjYW5UeXBlVGV4dChzY2FuX3R5cGUpLmNfc3RyKCkpOwotfQotCi1ib29sIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpIYXNDYWxsYmFja3MoKSBjb25zdCB7Ci0gIHJldHVybiBpbnF1aXJ5X2NhbGxiYWNrc18ucmVzdWx0ICE9IG51bGxwdHIgJiYgaW5xdWlyeV9jYWxsYmFja3NfLnJlc3VsdF93aXRoX3Jzc2kgIT0gbnVsbHB0ciAmJgotICAgICAgICAgaW5xdWlyeV9jYWxsYmFja3NfLmV4dGVuZGVkX3Jlc3VsdCAhPSBudWxscHRyICYmIGlucXVpcnlfY2FsbGJhY2tzXy5jb21wbGV0ZSAhPSBudWxscHRyOwotfQotCi0vKioKLSAqIEdlbmVyYWwgQVBJIGhlcmUKLSAqLwotbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OklucXVpcnlNb2R1bGUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KCp0aGlzKSkge30KLQotbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6On5JbnF1aXJ5TW9kdWxlKCkgewotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6UmVnaXN0ZXJDYWxsYmFja3MoSW5xdWlyeUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKLSAgcGltcGxfLT5SZWdpc3RlckNhbGxiYWNrcyhjYWxsYmFja3MpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpVbnJlZ2lzdGVyQ2FsbGJhY2tzKCkgewotICBwaW1wbF8tPlVucmVnaXN0ZXJDYWxsYmFja3MoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6U3RhcnRHZW5lcmFsSW5xdWlyeShJbnF1aXJ5TGVuZ3RoIGlucXVpcnlfbGVuZ3RoLCBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcykgewotICBHZXRIYW5kbGVyKCktPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U3RhcnRPbmVTaG90SW5xdWlyeSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLAotICAgICAgZmFsc2UsCi0gICAgICBpbnF1aXJ5X2xlbmd0aCwKLSAgICAgIG51bV9yZXNwb25zZXMpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6U3RhcnRMaW1pdGVkSW5xdWlyeShJbnF1aXJ5TGVuZ3RoIGlucXVpcnlfbGVuZ3RoLCBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcykgewotICBHZXRIYW5kbGVyKCktPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U3RhcnRPbmVTaG90SW5xdWlyeSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLAotICAgICAgdHJ1ZSwKLSAgICAgIGlucXVpcnlfbGVuZ3RoLAotICAgICAgbnVtX3Jlc3BvbnNlcykpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTdG9wSW5xdWlyeSgpIHsKLSAgR2V0SGFuZGxlcigpLT5Qb3N0KAotICAgICAgY29tbW9uOjpCaW5kT25jZSgmbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OmltcGw6OlN0b3BPbmVTaG90SW5xdWlyeSwgY29tbW9uOjpVbnJldGFpbmVkKHBpbXBsXy5nZXQoKSkpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6U3RhcnRHZW5lcmFsUGVyaW9kaWNJbnF1aXJ5KAotICAgIElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsIE51bVJlc3BvbnNlcyBudW1fcmVzcG9uc2VzLCBQZXJpb2RMZW5ndGggbWF4X2RlbGF5LCBQZXJpb2RMZW5ndGggbWluX2RlbGF5KSB7Ci0gIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJm5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTdGFydFBlcmlvZGljSW5xdWlyeSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLAotICAgICAgZmFsc2UsCi0gICAgICBpbnF1aXJ5X2xlbmd0aCwKLSAgICAgIG51bV9yZXNwb25zZXMsCi0gICAgICBtYXhfZGVsYXksCi0gICAgICBtaW5fZGVsYXkpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6U3RhcnRMaW1pdGVkUGVyaW9kaWNJbnF1aXJ5KAotICAgIElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsIE51bVJlc3BvbnNlcyBudW1fcmVzcG9uc2VzLCBQZXJpb2RMZW5ndGggbWF4X2RlbGF5LCBQZXJpb2RMZW5ndGggbWluX2RlbGF5KSB7Ci0gIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJm5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTdGFydFBlcmlvZGljSW5xdWlyeSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLAotICAgICAgdHJ1ZSwKLSAgICAgIGlucXVpcnlfbGVuZ3RoLAotICAgICAgbnVtX3Jlc3BvbnNlcywKLSAgICAgIG1heF9kZWxheSwKLSAgICAgIG1pbl9kZWxheSkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTdG9wUGVyaW9kaWNJbnF1aXJ5KCkgewotICBHZXRIYW5kbGVyKCktPlBvc3QoCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U3RvcFBlcmlvZGljSW5xdWlyeSwgY29tbW9uOjpVbnJldGFpbmVkKHBpbXBsXy5nZXQoKSkpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6U2V0U2NhbkFjdGl2aXR5KFNjYW5QYXJhbWV0ZXJzIHBhcmFtcykgewotICBHZXRIYW5kbGVyKCktPlBvc3QoCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U2V0U2NhbkFjdGl2aXR5LCBjb21tb246OlVucmV0YWluZWQocGltcGxfLmdldCgpKSwgcGFyYW1zKSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OlNldEludGVybGFjZWRTY2FuKCkgewotICBHZXRIYW5kbGVyKCktPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U2V0U2NhblR5cGUsIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLCBoY2k6OklucXVpcnlTY2FuVHlwZTo6SU5URVJMQUNFRCkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTZXRTdGFuZGFyZFNjYW4oKSB7Ci0gIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJm5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTZXRTY2FuVHlwZSwgY29tbW9uOjpVbnJldGFpbmVkKHBpbXBsXy5nZXQoKSksIGhjaTo6SW5xdWlyeVNjYW5UeXBlOjpTVEFOREFSRCkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTZXRTdGFuZGFyZElucXVpcnlSZXN1bHRNb2RlKCkgewotICBHZXRIYW5kbGVyKCktPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U2V0SW5xdWlyeU1vZGUsIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLCBoY2k6OklucXVpcnlNb2RlOjpTVEFOREFSRCkpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTZXRJbnF1aXJ5V2l0aFJzc2lSZXN1bHRNb2RlKCkgewotICBHZXRIYW5kbGVyKCktPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6aW1wbDo6U2V0SW5xdWlyeU1vZGUsIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLCBoY2k6OklucXVpcnlNb2RlOjpSU1NJKSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OklucXVpcnlNb2R1bGU6OlNldEV4dGVuZGVkSW5xdWlyeVJlc3VsdE1vZGUoKSB7Ci0gIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJm5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjppbXBsOjpTZXRJbnF1aXJ5TW9kZSwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLAotICAgICAgaGNpOjpJbnF1aXJ5TW9kZTo6UlNTSV9PUl9FWFRFTkRFRCkpOwotfQotCi0vKioKLSAqIE1vZHVsZSBtZXRob2RzIGhlcmUKLSAqLwotdm9pZCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxoY2k6OkhjaUxheWVyPigpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTdGFydCgpIHsKLSAgcGltcGxfLT5TdGFydCgpOwotfQotCi12b2lkIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlOjpTdG9wKCkgewotICBwaW1wbF8tPlN0b3AoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9pbnF1aXJ5LmggYi9nZC9uZWlnaGJvci9pbnF1aXJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ODJhZjUuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvaW5xdWlyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAibmVpZ2hib3Ivc2Nhbl9wYXJhbWV0ZXJzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotdXNpbmcgSW5xdWlyeUxlbmd0aCA9IHVpbnQ4X3Q7ICAvLyBSYW5nZTogMHgwMSB0byAweDMwLCAxLjI4IHRvIDYxLjQ0cwotdXNpbmcgTnVtUmVzcG9uc2VzID0gdWludDhfdDsgICAvLyBSYW5nZTogMHgwMSB0byAweGZmLCAweDAwIGlzIHVubGltaXRlZAotdXNpbmcgUGVyaW9kTGVuZ3RoID0gdWludDE2X3Q7ICAvLyBUaW1lID0gTiAqIDEuMjggcwotCi11c2luZyBJbnF1aXJ5UmVzdWx0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoaGNpOjpJbnF1aXJ5UmVzdWx0VmlldyB2aWV3KT47Ci11c2luZyBJbnF1aXJ5UmVzdWx0V2l0aFJzc2lDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChoY2k6OklucXVpcnlSZXN1bHRXaXRoUnNzaVZpZXcgdmlldyk+OwotdXNpbmcgRXh0ZW5kZWRJbnF1aXJ5UmVzdWx0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoaGNpOjpFeHRlbmRlZElucXVpcnlSZXN1bHRWaWV3IHZpZXcpPjsKLXVzaW5nIElucXVpcnlDb21wbGV0ZUNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGhjaTo6RXJyb3JDb2RlIHN0YXR1cyk+OwotCi11c2luZyBJbnF1aXJ5Q2FsbGJhY2tzID0gc3RydWN0IHsKLSAgSW5xdWlyeVJlc3VsdENhbGxiYWNrIHJlc3VsdDsKLSAgSW5xdWlyeVJlc3VsdFdpdGhSc3NpQ2FsbGJhY2sgcmVzdWx0X3dpdGhfcnNzaTsKLSAgRXh0ZW5kZWRJbnF1aXJ5UmVzdWx0Q2FsbGJhY2sgZXh0ZW5kZWRfcmVzdWx0OwotICBJbnF1aXJ5Q29tcGxldGVDYWxsYmFjayBjb21wbGV0ZTsKLX07Ci0KLWNsYXNzIElucXVpcnlNb2R1bGUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgdm9pZCBSZWdpc3RlckNhbGxiYWNrcyhJbnF1aXJ5Q2FsbGJhY2tzIGlucXVpcnlfY2FsbGJhY2tzKTsKLSAgdm9pZCBVbnJlZ2lzdGVyQ2FsbGJhY2tzKCk7Ci0KLSAgdm9pZCBTdGFydEdlbmVyYWxJbnF1aXJ5KElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsIE51bVJlc3BvbnNlcyBudW1fcmVzcG9uc2VzKTsKLSAgdm9pZCBTdGFydExpbWl0ZWRJbnF1aXJ5KElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsIE51bVJlc3BvbnNlcyBudW1fcmVzcG9uc2VzKTsKLSAgdm9pZCBTdG9wSW5xdWlyeSgpOwotCi0gIHZvaWQgU3RhcnRHZW5lcmFsUGVyaW9kaWNJbnF1aXJ5KAotICAgICAgSW5xdWlyeUxlbmd0aCBpbnF1aXJ5X2xlbmd0aCwgTnVtUmVzcG9uc2VzIG51bV9yZXNwb25zZXMsIFBlcmlvZExlbmd0aCBtYXhfZGVsYXksIFBlcmlvZExlbmd0aCBtaW5fZGVsYXkpOwotICB2b2lkIFN0YXJ0TGltaXRlZFBlcmlvZGljSW5xdWlyeSgKLSAgICAgIElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsIE51bVJlc3BvbnNlcyBudW1fcmVzcG9uc2VzLCBQZXJpb2RMZW5ndGggbWF4X2RlbGF5LCBQZXJpb2RMZW5ndGggbWluX2RlbGF5KTsKLSAgdm9pZCBTdG9wUGVyaW9kaWNJbnF1aXJ5KCk7Ci0KLSAgdm9pZCBTZXRTY2FuQWN0aXZpdHkoU2NhblBhcmFtZXRlcnMgcGFybXMpOwotCi0gIHZvaWQgU2V0SW50ZXJsYWNlZFNjYW4oKTsKLSAgdm9pZCBTZXRTdGFuZGFyZFNjYW4oKTsKLQotICB2b2lkIFNldFN0YW5kYXJkSW5xdWlyeVJlc3VsdE1vZGUoKTsKLSAgdm9pZCBTZXRJbnF1aXJ5V2l0aFJzc2lSZXN1bHRNb2RlKCk7Ci0gIHZvaWQgU2V0RXh0ZW5kZWRJbnF1aXJ5UmVzdWx0TW9kZSgpOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgSW5xdWlyeU1vZHVsZSgpOwotICB+SW5xdWlyeU1vZHVsZSgpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiSW5xdWlyeU1vZHVsZSIpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW5xdWlyeU1vZHVsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbmVpZ2hib3IKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL2lucXVpcnlfbW9jay5oIGIvZ2QvbmVpZ2hib3IvaW5xdWlyeV9tb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2RmNjcuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvaW5xdWlyeV9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL2lucXVpcnkuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9zY2FuX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0vLyBVbml0IHRlc3QgaW50ZXJmYWNlcwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbmVpZ2hib3IgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrSW5xdWlyeU1vZHVsZSA6IHB1YmxpYyBJbnF1aXJ5TW9kdWxlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFJlZ2lzdGVyQ2FsbGJhY2tzLCAoSW5xdWlyeUNhbGxiYWNrcyBpbnF1aXJ5X2NhbGxiYWNrcykpOwotICBNT0NLX01FVEhPRCh2b2lkLCBVbnJlZ2lzdGVyQ2FsbGJhY2tzLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFN0YXJ0R2VuZXJhbElucXVpcnksIChJbnF1aXJ5TGVuZ3RoIGlucXVpcnlfbGVuZ3RoLCBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcykpOwotICBNT0NLX01FVEhPRCh2b2lkLCBTdGFydExpbWl0ZWRJbnF1aXJ5LCAoSW5xdWlyeUxlbmd0aCBpbnF1aXJ5X2xlbmd0aCwgTnVtUmVzcG9uc2VzIG51bV9yZXNwb25zZXMpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgU3RvcElucXVpcnksICgpKTsKLSAgTU9DS19NRVRIT0QoCi0gICAgICB2b2lkLAotICAgICAgU3RhcnRHZW5lcmFsUGVyaW9kaWNJbnF1aXJ5LAotICAgICAgKElucXVpcnlMZW5ndGggaW5xdWlyeV9sZW5ndGgsIE51bVJlc3BvbnNlcyBudW1fcmVzcG9uc2VzLCBQZXJpb2RMZW5ndGggbWF4X2RlbGF5LCBQZXJpb2RMZW5ndGggbWluX2RlbGF5KSk7Ci0gIE1PQ0tfTUVUSE9EKAotICAgICAgdm9pZCwKLSAgICAgIFN0YXJ0TGltaXRlZFBlcmlvZGljSW5xdWlyeSwKLSAgICAgIChJbnF1aXJ5TGVuZ3RoIGlucXVpcnlfbGVuZ3RoLCBOdW1SZXNwb25zZXMgbnVtX3Jlc3BvbnNlcywgUGVyaW9kTGVuZ3RoIG1heF9kZWxheSwgUGVyaW9kTGVuZ3RoIG1pbl9kZWxheSkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBTdG9wUGVyaW9kaWNJbnF1aXJ5LCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldFNjYW5BY3Rpdml0eSwgKFNjYW5QYXJhbWV0ZXJzIHBhcm1zKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldEludGVybGFjZWRTY2FuLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldFN0YW5kYXJkU2NhbiwgKCkpOwotICBNT0NLX01FVEhPRCh2b2lkLCBTZXRTdGFuZGFyZElucXVpcnlSZXN1bHRNb2RlLCAoKSk7Ci0gIE1PQ0tfTUVUSE9EKHZvaWQsIFNldElucXVpcnlXaXRoUnNzaVJlc3VsdE1vZGUsICgpKTsKLSAgTU9DS19NRVRIT0Qodm9pZCwgU2V0RXh0ZW5kZWRJbnF1aXJ5UmVzdWx0TW9kZSwgKCkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBuZWlnaGJvcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvaW5xdWlyeV90ZXN0LmNjIGIvZ2QvbmVpZ2hib3IvaW5xdWlyeV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODMzZTIxLi4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL2lucXVpcnlfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibmVpZ2hib3IvaW5xdWlyeS5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2NsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbmVpZ2hib3IgewotbmFtZXNwYWNlIHsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSA9IDE7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGJsdWV0b290aCBjaGlwCi0gKiBhdCBhbnkgZ2l2ZW4gdGltZS4KLSAqLwotc3RhdGljIGNvbnN0IGludDhfdCBrSW5pdGlhbElucXVpcnlSZXNwb25zZVRyYW5zbWl0UG93ZXJMZXZlbCA9IDEyMzsKLXN0YXRpYyBjb25zdCB1aW50MTZfdCBrSW5pdGlhbElucXVpcnlTY2FuSW50ZXJ2YWwgPSAxMTExOwotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtJbml0aWFsSW5xdWlyeVNjYW5XaW5kb3cgPSAyMjIyOwotCi1zdHJ1Y3QgSGNpUmVnaXN0ZXIgewotICBib29sIG9uZV9zaG90X2lucXVpcnlfYWN0aXZlOwotICBib29sIHBlcmlvZGljX2lucXVpcnlfYWN0aXZlOwotICBpbnQ4X3QgaW5xdWlyeV9yZXNwb25zZV90cmFuc21pdF9wb3dlcl9sZXZlbDsKLSAgdWludDE2X3QgaW5xdWlyeV9zY2FuX2ludGVydmFsOwotICB1aW50MTZfdCBpbnF1aXJ5X3NjYW5fd2luZG93OwotICBoY2k6OklucXVpcnlTY2FuVHlwZSBpbnF1aXJ5X3NjYW5fdHlwZTsKLSAgaGNpOjpJbnF1aXJ5TW9kZSBpbnF1aXJ5X21vZGU7Ci0gIHVpbnQ4X3QgaW5xdWlyeV9sZW5ndGg7Ci0gIHVpbnQ4X3QgbnVtX3Jlc3BvbnNlczsKLSAgdWludDE2X3QgbWluX3BlcmlvZF9sZW5ndGg7Ci0gIHVpbnQxNl90IG1heF9wZXJpb2RfbGVuZ3RoOwotfSBoY2lfcmVnaXN0ZXJfewotICAgIC5vbmVfc2hvdF9pbnF1aXJ5X2FjdGl2ZSA9IGZhbHNlLAotICAgIC5wZXJpb2RpY19pbnF1aXJ5X2FjdGl2ZSA9IGZhbHNlLAotICAgIC5pbnF1aXJ5X3Jlc3BvbnNlX3RyYW5zbWl0X3Bvd2VyX2xldmVsID0ga0luaXRpYWxJbnF1aXJ5UmVzcG9uc2VUcmFuc21pdFBvd2VyTGV2ZWwsCi0gICAgLmlucXVpcnlfc2Nhbl9pbnRlcnZhbCA9IGtJbml0aWFsSW5xdWlyeVNjYW5JbnRlcnZhbCwKLSAgICAuaW5xdWlyeV9zY2FuX3dpbmRvdyA9IGtJbml0aWFsSW5xdWlyeVNjYW5XaW5kb3csCi0gICAgLmlucXVpcnlfc2Nhbl90eXBlID0gaGNpOjpJbnF1aXJ5U2NhblR5cGU6OlNUQU5EQVJELAotICAgIC5pbnF1aXJ5X21vZGUgPSBoY2k6OklucXVpcnlNb2RlOjpTVEFOREFSRCwKLSAgICAuaW5xdWlyeV9sZW5ndGggPSAwLAotICAgIC5udW1fcmVzcG9uc2VzID0gMCwKLSAgICAubWluX3BlcmlvZF9sZW5ndGggPSAwLAotICAgIC5tYXhfcGVyaW9kX2xlbmd0aCA9IDAsCi19OwotCi1oY2k6OlBhY2tldFZpZXc8aGNpOjprTGl0dGxlRW5kaWFuPiBHZXRQYWNrZXRWaWV3KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIGhjaTo6Qml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi1jbGFzcyBUZXN0SGNpTGF5ZXIgOiBwdWJsaWMgaGNpOjpIY2lMYXllciB7Ci0gcHVibGljOgotICB2b2lkIEVucXVldWVDb21tYW5kKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgICAmVGVzdEhjaUxheWVyOjpIYW5kbGVDb21tYW5kLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIHN0ZDo6bW92ZShjb21tYW5kKSwgc3RkOjptb3ZlKG9uX2NvbXBsZXRlKSkpOwotICB9Ci0KLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykgb3ZlcnJpZGUgewotICAgIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgICAmVGVzdEhjaUxheWVyOjpIYW5kbGVTdGF0dXMsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgc3RkOjptb3ZlKGNvbW1hbmQpLCBzdGQ6Om1vdmUob25fc3RhdHVzKSkpOwotICB9Ci0KLSAgdm9pZCBIYW5kbGVDb21tYW5kKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmRfYnVpbGRlciwKLSAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyk+IG9uX2NvbXBsZXRlKSB7Ci0gICAgaGNpOjpDb21tYW5kVmlldyBjb21tYW5kID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGNvbW1hbmRfYnVpbGRlcikpKTsKLSAgICBBU1NFUlRfVFJVRShjb21tYW5kLklzVmFsaWQoKSk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gZXZlbnRfYnVpbGRlcjsKLSAgICBzd2l0Y2ggKGNvbW1hbmQuR2V0T3BDb2RlKCkpIHsKLSAgICAgIGNhc2UgaGNpOjpPcENvZGU6OklOUVVJUllfQ0FOQ0VMOgotICAgICAgICBldmVudF9idWlsZGVyID0KLSAgICAgICAgICAgIGhjaTo6SW5xdWlyeUNhbmNlbENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKGtOdW1iZXJQYWNrZXRzUmVhZHlUb1JlY2VpdmUsIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICAgICAgaGNpX3JlZ2lzdGVyXy5vbmVfc2hvdF9pbnF1aXJ5X2FjdGl2ZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBoY2k6Ok9wQ29kZTo6UEVSSU9ESUNfSU5RVUlSWV9NT0RFOiB7Ci0gICAgICAgIGF1dG8gaW5xdWlyeSA9IGhjaTo6UGVyaW9kaWNJbnF1aXJ5TW9kZVZpZXc6OkNyZWF0ZShoY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICAgICAgICBBU1NFUlRfVFJVRShpbnF1aXJ5LklzVmFsaWQoKSk7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPQotICAgICAgICAgICAgaGNpOjpQZXJpb2RpY0lucXVpcnlNb2RlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoa051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSwgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgICBoY2lfcmVnaXN0ZXJfLnBlcmlvZGljX2lucXVpcnlfYWN0aXZlID0gdHJ1ZTsKLSAgICAgICAgaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X2xlbmd0aCA9IGlucXVpcnkuR2V0SW5xdWlyeUxlbmd0aCgpOwotICAgICAgICBoY2lfcmVnaXN0ZXJfLm51bV9yZXNwb25zZXMgPSBpbnF1aXJ5LkdldE51bVJlc3BvbnNlcygpOwotICAgICAgICBoY2lfcmVnaXN0ZXJfLm1heF9wZXJpb2RfbGVuZ3RoID0gaW5xdWlyeS5HZXRNYXhQZXJpb2RMZW5ndGgoKTsKLSAgICAgICAgaGNpX3JlZ2lzdGVyXy5taW5fcGVyaW9kX2xlbmd0aCA9IGlucXVpcnkuR2V0TWluUGVyaW9kTGVuZ3RoKCk7Ci0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIGhjaTo6T3BDb2RlOjpFWElUX1BFUklPRElDX0lOUVVJUllfTU9ERToKLSAgICAgICAgZXZlbnRfYnVpbGRlciA9Ci0gICAgICAgICAgICBoY2k6OkV4aXRQZXJpb2RpY0lucXVpcnlNb2RlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoa051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSwgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgICBoY2lfcmVnaXN0ZXJfLnBlcmlvZGljX2lucXVpcnlfYWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9JTlFVSVJZX01PREU6Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPQotICAgICAgICAgICAgaGNpOjpXcml0ZUlucXVpcnlNb2RlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoa051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSwgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgICB7Ci0gICAgICAgICAgYXV0byB2aWV3ID0gaGNpOjpXcml0ZUlucXVpcnlNb2RlVmlldzo6Q3JlYXRlKGhjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gICAgICAgICAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICAgICAgICAgIGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9tb2RlID0gdmlldy5HZXRJbnF1aXJ5TW9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX0lOUVVJUllfTU9ERToKLSAgICAgICAgZXZlbnRfYnVpbGRlciA9IGhjaTo6UmVhZElucXVpcnlNb2RlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBrTnVtYmVyUGFja2V0c1JlYWR5VG9SZWNlaXZlLCBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X21vZGUpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZOgotICAgICAgICBldmVudF9idWlsZGVyID0KLSAgICAgICAgICAgIGhjaTo6V3JpdGVJbnF1aXJ5U2NhbkFjdGl2aXR5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoa051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSwgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgICB7Ci0gICAgICAgICAgYXV0byB2aWV3ID0gaGNpOjpXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlWaWV3OjpDcmVhdGUoaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgICAgICAgICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gICAgICAgICAgaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X3NjYW5faW50ZXJ2YWwgPSB2aWV3LkdldElucXVpcnlTY2FuSW50ZXJ2YWwoKTsKLSAgICAgICAgICBoY2lfcmVnaXN0ZXJfLmlucXVpcnlfc2Nhbl93aW5kb3cgPSB2aWV3LkdldElucXVpcnlTY2FuV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfSU5RVUlSWV9TQ0FOX0FDVElWSVRZOgotICAgICAgICBldmVudF9idWlsZGVyID0gaGNpOjpSZWFkSW5xdWlyeVNjYW5BY3Rpdml0eUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAga051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSwKLSAgICAgICAgICAgIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAgICAgaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X3NjYW5faW50ZXJ2YWwsCi0gICAgICAgICAgICBoY2lfcmVnaXN0ZXJfLmlucXVpcnlfc2Nhbl93aW5kb3cpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9TQ0FOX1RZUEU6Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPQotICAgICAgICAgICAgaGNpOjpXcml0ZUlucXVpcnlTY2FuVHlwZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKGtOdW1iZXJQYWNrZXRzUmVhZHlUb1JlY2VpdmUsIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICAgICAgewotICAgICAgICAgIGF1dG8gdmlldyA9IGhjaTo6V3JpdGVJbnF1aXJ5U2NhblR5cGVWaWV3OjpDcmVhdGUoaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgICAgICAgICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gICAgICAgICAgaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X3NjYW5fdHlwZSA9IHZpZXcuR2V0SW5xdWlyeVNjYW5UeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfSU5RVUlSWV9TQ0FOX1RZUEU6Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPSBoY2k6OlJlYWRJbnF1aXJ5U2NhblR5cGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIGtOdW1iZXJQYWNrZXRzUmVhZHlUb1JlY2VpdmUsIGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCBoY2lfcmVnaXN0ZXJfLmlucXVpcnlfc2Nhbl90eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfSU5RVUlSWV9SRVNQT05TRV9UUkFOU01JVF9QT1dFUl9MRVZFTDoKLSAgICAgICAgZXZlbnRfYnVpbGRlciA9IGhjaTo6UmVhZElucXVpcnlSZXNwb25zZVRyYW5zbWl0UG93ZXJMZXZlbENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAga051bWJlclBhY2tldHNSZWFkeVRvUmVjZWl2ZSwgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9yZXNwb25zZV90cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfSU5GTygiRHJvcHBpbmcgdW5oYW5kbGVkIGNvbW1hbmQ6JXMiLCBoY2k6Ok9wQ29kZVRleHQoY29tbWFuZC5HZXRPcENvZGUoKSkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaGNpOjpFdmVudFZpZXcgZXZlbnQgPSBoY2k6OkV2ZW50Vmlldzo6Q3JlYXRlKEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGV2ZW50X2J1aWxkZXIpKSk7Ci0gICAgQVNTRVJUX1RSVUUoZXZlbnQuSXNWYWxpZCgpKTsKLSAgICBoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgY29tbWFuZF9jb21wbGV0ZSA9IGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KTsKLSAgICBBU1NFUlRfVFJVRShjb21tYW5kX2NvbXBsZXRlLklzVmFsaWQoKSk7Ci0gICAgb25fY29tcGxldGUuSW52b2tlKHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSk7Ci0KLSAgICBpZiAocHJvbWlzZV9zeW5jX2NvbXBsZXRlXyAhPSBudWxscHRyKSB7Ci0gICAgICBwcm9taXNlX3N5bmNfY29tcGxldGVfLT5zZXRfdmFsdWUoY29tbWFuZC5HZXRPcENvZGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBIYW5kbGVTdGF0dXMoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpDb21tYW5kQnVpbGRlcj4gY29tbWFuZF9idWlsZGVyLAotICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykgewotICAgIGhjaTo6Q29tbWFuZFZpZXcgY29tbWFuZCA9IGhjaTo6Q29tbWFuZFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShjb21tYW5kX2J1aWxkZXIpKSk7Ci0gICAgQVNTRVJUX1RSVUUoY29tbWFuZC5Jc1ZhbGlkKCkpOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IGV2ZW50X2J1aWxkZXI7Ci0gICAgc3dpdGNoIChjb21tYW5kLkdldE9wQ29kZSgpKSB7Ci0gICAgICBjYXNlIGhjaTo6T3BDb2RlOjpJTlFVSVJZOiB7Ci0gICAgICAgIGF1dG8gaW5xdWlyeSA9IGhjaTo6SW5xdWlyeVZpZXc6OkNyZWF0ZShoY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICAgICAgICBBU1NFUlRfVFJVRShpbnF1aXJ5LklzVmFsaWQoKSk7Ci0gICAgICAgIGV2ZW50X2J1aWxkZXIgPSBoY2k6OklucXVpcnlTdGF0dXNCdWlsZGVyOjpDcmVhdGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGtOdW1iZXJQYWNrZXRzUmVhZHlUb1JlY2VpdmUpOwotICAgICAgICBoY2lfcmVnaXN0ZXJfLm9uZV9zaG90X2lucXVpcnlfYWN0aXZlID0gdHJ1ZTsKLSAgICAgICAgaGNpX3JlZ2lzdGVyXy5udW1fcmVzcG9uc2VzID0gaW5xdWlyeS5HZXROdW1SZXNwb25zZXMoKTsKLSAgICAgICAgaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X2xlbmd0aCA9IGlucXVpcnkuR2V0SW5xdWlyeUxlbmd0aCgpOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19JTkZPKCJEcm9wcGluZyB1bmhhbmRsZWQgc3RhdHVzIGV4cGVjdGluZyBjb21tYW5kOiVzIiwgaGNpOjpPcENvZGVUZXh0KGNvbW1hbmQuR2V0T3BDb2RlKCkpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGhjaTo6RXZlbnRWaWV3IGV2ZW50ID0gaGNpOjpFdmVudFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShldmVudF9idWlsZGVyKSkpOwotICAgIEFTU0VSVF9UUlVFKGV2ZW50LklzVmFsaWQoKSk7Ci0gICAgaGNpOjpDb21tYW5kU3RhdHVzVmlldyBjb21tYW5kX3N0YXR1cyA9IGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgQVNTRVJUX1RSVUUoY29tbWFuZF9zdGF0dXMuSXNWYWxpZCgpKTsKLSAgICBvbl9zdGF0dXMuSW52b2tlKHN0ZDo6bW92ZShjb21tYW5kX3N0YXR1cykpOwotCi0gICAgaWYgKHByb21pc2Vfc3luY19jb21wbGV0ZV8gIT0gbnVsbHB0cikgewotICAgICAgcHJvbWlzZV9zeW5jX2NvbXBsZXRlXy0+c2V0X3ZhbHVlKGNvbW1hbmQuR2V0T3BDb2RlKCkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICBoY2k6OkV2ZW50Q29kZSBldmVudF9jb2RlLCBjb21tb246OkNvbnRleHR1YWxDYWxsYmFjazx2b2lkKGhjaTo6RXZlbnRWaWV3KT4gZXZlbnRfaGFuZGxlcikgb3ZlcnJpZGUgewotICAgIHN3aXRjaCAoZXZlbnRfY29kZSkgewotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFQ6Ci0gICAgICAgIGlucXVpcnlfcmVzdWx0X2NhbGxiYWNrXyA9IGV2ZW50X2hhbmRsZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJOgotICAgICAgICBpbnF1aXJ5X3Jlc3VsdF93aXRoX3Jzc2lfY2FsbGJhY2tfID0gZXZlbnRfaGFuZGxlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpFWFRFTkRFRF9JTlFVSVJZX1JFU1VMVDoKLSAgICAgICAgZXh0ZW5kZWRfaW5xdWlyeV9yZXN1bHRfY2FsbGJhY2tfID0gZXZlbnRfaGFuZGxlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpJTlFVSVJZX0NPTVBMRVRFOgotICAgICAgICBpbnF1aXJ5X2NvbXBsZXRlX2NhbGxiYWNrXyA9IGV2ZW50X2hhbmRsZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJVbmV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgYmVpbmcgcmVnaXN0ZXJlZCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlckV2ZW50SGFuZGxlcihoY2k6OkV2ZW50Q29kZSBldmVudF9jb2RlKSBvdmVycmlkZSB7Ci0gICAgaWYgKGhjaV9yZWdpc3Rlcl8ub25lX3Nob3RfaW5xdWlyeV9hY3RpdmUgfHwgaGNpX3JlZ2lzdGVyXy5wZXJpb2RpY19pbnF1aXJ5X2FjdGl2ZSkgewotICAgICAgTE9HX0VSUk9SKCJFdmVudCBoYW5kbGVycyBtYXkgbm90IGJlIHVucmVnaXN0ZXJlZCB1bnRpbCBpbnF1aXJ5IGlzIHN0b3BwZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGV2ZW50X2NvZGUpIHsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklOUVVJUllfUkVTVUxUOgotICAgICAgICBpbnF1aXJ5X3Jlc3VsdF9jYWxsYmFja18gPSB7fTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVF9XSVRIX1JTU0k6Ci0gICAgICAgIGlucXVpcnlfcmVzdWx0X3dpdGhfcnNzaV9jYWxsYmFja18gPSB7fTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpFWFRFTkRFRF9JTlFVSVJZX1JFU1VMVDoKLSAgICAgICAgZXh0ZW5kZWRfaW5xdWlyeV9yZXN1bHRfY2FsbGJhY2tfID0ge307Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6SU5RVUlSWV9DT01QTEVURToKLSAgICAgICAgaW5xdWlyeV9jb21wbGV0ZV9jYWxsYmFja18gPSB7fTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlVuZXhwZWN0ZWQgZXZlbnQgaGFuZGxlciBiZWluZyB1bnJlZ2lzdGVyZWQiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFN5bmNocm9uaXplKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jLCBoY2k6Ok9wQ29kZSBvcF9jb2RlKSB7Ci0gICAgQVNTRVJUX0VRKHByb21pc2Vfc3luY19jb21wbGV0ZV8sIG51bGxwdHIpOwotICAgIHByb21pc2Vfc3luY19jb21wbGV0ZV8gPSBuZXcgc3RkOjpwcm9taXNlPGhjaTo6T3BDb2RlPigpOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZV9zeW5jX2NvbXBsZXRlXy0+Z2V0X2Z1dHVyZSgpOwotICAgIGZ1bmMoKTsKLSAgICBhdXRvIHJlc3VsdCA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwotICAgIEFTU0VSVF9FUShzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LCByZXN1bHQpOwotICAgIEFTU0VSVF9FUShvcF9jb2RlLCBmdXR1cmUuZ2V0KCkpOwotICAgIGRlbGV0ZSBwcm9taXNlX3N5bmNfY29tcGxldGVfOwotICAgIHByb21pc2Vfc3luY19jb21wbGV0ZV8gPSBudWxscHRyOwotICB9Ci0KLSAgdm9pZCBJbmplY3RJbnF1aXJ5UmVzdWx0KHN0ZDo6dW5pcXVlX3B0cjxoY2k6OklucXVpcnlSZXN1bHRCdWlsZGVyPiByZXN1bHQpIHsKLSAgICBoY2k6OkV2ZW50VmlldyB2aWV3ID0gaGNpOjpFdmVudFZpZXc6OkNyZWF0ZShHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShyZXN1bHQpKSk7Ci0gICAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICAgIGlucXVpcnlfcmVzdWx0X2NhbGxiYWNrXy5JbnZva2Uoc3RkOjptb3ZlKHZpZXcpKTsKLSAgfQotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7fQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLQotIHByaXZhdGU6Ci0gIHN0ZDo6cHJvbWlzZTxoY2k6Ok9wQ29kZT4qIHByb21pc2Vfc3luY19jb21wbGV0ZV97bnVsbHB0cn07Ci0KLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkV2ZW50Vmlldyk+IGlucXVpcnlfcmVzdWx0X2NhbGxiYWNrXzsKLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChoY2k6OkV2ZW50Vmlldyk+IGlucXVpcnlfcmVzdWx0X3dpdGhfcnNzaV9jYWxsYmFja187Ci0gIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpFdmVudFZpZXcpPiBleHRlbmRlZF9pbnF1aXJ5X3Jlc3VsdF9jYWxsYmFja187Ci0gIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPHZvaWQoaGNpOjpFdmVudFZpZXcpPiBpbnF1aXJ5X2NvbXBsZXRlX2NhbGxiYWNrXzsKLX07Ci0KLWNsYXNzIElucXVpcnlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFJlc3VsdChoY2k6OklucXVpcnlSZXN1bHRWaWV3IHZpZXcpIHsKLSAgICBBU1NFUlRfVFJVRSh2aWV3LnNpemUoKSA+PSBzaXplb2YodWludDE2X3QpKTsKLSAgICBwcm9taXNlX3Jlc3VsdF9jb21wbGV0ZV8tPnNldF92YWx1ZSh0cnVlKTsKLSAgfQotCi0gIHZvaWQgV2FpdEZvcklucXVpcnlSZXN1bHQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMpIHsKLSAgICBBU1NFUlRfRVEocHJvbWlzZV9yZXN1bHRfY29tcGxldGVfLCBudWxscHRyKTsKLSAgICBwcm9taXNlX3Jlc3VsdF9jb21wbGV0ZV8gPSBuZXcgc3RkOjpwcm9taXNlPGJvb2w+KCk7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlX3Jlc3VsdF9jb21wbGV0ZV8tPmdldF9mdXR1cmUoKTsKLSAgICBmdW5jKCk7Ci0gICAgZnV0dXJlLndhaXQoKTsKLSAgICBkZWxldGUgcHJvbWlzZV9yZXN1bHRfY29tcGxldGVfOwotICAgIHByb21pc2VfcmVzdWx0X2NvbXBsZXRlXyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIFJlc3VsdFdpdGhSc3NpKGhjaTo6SW5xdWlyeVJlc3VsdFdpdGhSc3NpVmlldyB2aWV3KSB7Ci0gICAgQVNTRVJUX1RSVUUodmlldy5zaXplKCkgPj0gc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIH0KLQotICB2b2lkIEV4dGVuZGVkUmVzdWx0KGhjaTo6RXh0ZW5kZWRJbnF1aXJ5UmVzdWx0VmlldyB2aWV3KSB7Ci0gICAgQVNTRVJUX1RSVUUodmlldy5zaXplKCkgPj0gc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIH0KLQotICB2b2lkIENvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIHN0YXR1cykge30KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZXN0X2hjaV9sYXllcl8gPSBuZXcgVGVzdEhjaUxheWVyOwotICAgIGZha2VfcmVnaXN0cnlfLkluamVjdFRlc3RNb2R1bGUoJmhjaTo6SGNpTGF5ZXI6OkZhY3RvcnksIHRlc3RfaGNpX2xheWVyXyk7Ci0gICAgY2xpZW50X2hhbmRsZXJfID0gZmFrZV9yZWdpc3RyeV8uR2V0VGVzdE1vZHVsZUhhbmRsZXIoJmhjaTo6SGNpTGF5ZXI6OkZhY3RvcnkpOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PElucXVpcnlNb2R1bGU+KCZ0aHJlYWRfKTsKLQotICAgIGlucXVpcnlfbW9kdWxlXyA9IHN0YXRpY19jYXN0PElucXVpcnlNb2R1bGUqPihmYWtlX3JlZ2lzdHJ5Xy5HZXRNb2R1bGVVbmRlclRlc3QoJklucXVpcnlNb2R1bGU6OkZhY3RvcnkpKTsKLQotICAgIElucXVpcnlDYWxsYmFja3MgaW5xdWlyeV9jYWxsYmFja3M7Ci0gICAgaW5xdWlyeV9jYWxsYmFja3MucmVzdWx0ID0gc3RkOjpiaW5kKCZJbnF1aXJ5VGVzdDo6UmVzdWx0LCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpOwotICAgIGlucXVpcnlfY2FsbGJhY2tzLnJlc3VsdF93aXRoX3Jzc2kgPSBzdGQ6OmJpbmQoJklucXVpcnlUZXN0OjpSZXN1bHRXaXRoUnNzaSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKTsKLSAgICBpbnF1aXJ5X2NhbGxiYWNrcy5leHRlbmRlZF9yZXN1bHQgPSBzdGQ6OmJpbmQoJklucXVpcnlUZXN0OjpFeHRlbmRlZFJlc3VsdCwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKTsKLSAgICBpbnF1aXJ5X2NhbGxiYWNrcy5jb21wbGV0ZSA9IHN0ZDo6YmluZCgmSW5xdWlyeVRlc3Q6OkNvbXBsZXRlLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpOwotICAgIGlucXVpcnlfbW9kdWxlXy0+UmVnaXN0ZXJDYWxsYmFja3MoaW5xdWlyeV9jYWxsYmFja3MpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBpbnF1aXJ5X21vZHVsZV8tPlVucmVnaXN0ZXJDYWxsYmFja3MoKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gIH0KLQotICBUZXN0TW9kdWxlUmVnaXN0cnkgZmFrZV9yZWdpc3RyeV87Ci0gIFRlc3RIY2lMYXllciogdGVzdF9oY2lfbGF5ZXJfID0gbnVsbHB0cjsKLSAgb3M6OlRocmVhZCYgdGhyZWFkXyA9IGZha2VfcmVnaXN0cnlfLkdldFRlc3RUaHJlYWQoKTsKLSAgSW5xdWlyeU1vZHVsZSogaW5xdWlyeV9tb2R1bGVfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIGNsaWVudF9oYW5kbGVyXyA9IG51bGxwdHI7Ci0KLSAgc3RkOjpwcm9taXNlPGJvb2w+KiBwcm9taXNlX3Jlc3VsdF9jb21wbGV0ZV97bnVsbHB0cn07Ci19OwotCi1URVNUX0YoSW5xdWlyeVRlc3QsIE1vZHVsZSkge30KLQotVEVTVF9GKElucXVpcnlUZXN0LCBTZXRJbnF1aXJ5TW9kZXMpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TeW5jaHJvbml6ZSgKLSAgICAgIFt0aGlzXSB7IGlucXVpcnlfbW9kdWxlXy0+U2V0SW5xdWlyeVdpdGhSc3NpUmVzdWx0TW9kZSgpOyB9LCBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9NT0RFKTsKLSAgQVNTRVJUX0VRKGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9tb2RlLCBoY2k6OklucXVpcnlNb2RlOjpSU1NJKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlN5bmNocm9uaXplKAotICAgICAgW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TZXRFeHRlbmRlZElucXVpcnlSZXN1bHRNb2RlKCk7IH0sIGhjaTo6T3BDb2RlOjpXUklURV9JTlFVSVJZX01PREUpOwotICBBU1NFUlRfRVEoaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X21vZGUsIGhjaTo6SW5xdWlyeU1vZGU6OlJTU0lfT1JfRVhURU5ERUQpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U3luY2hyb25pemUoCi0gICAgICBbdGhpc10geyBpbnF1aXJ5X21vZHVsZV8tPlNldFN0YW5kYXJkSW5xdWlyeVJlc3VsdE1vZGUoKTsgfSwgaGNpOjpPcENvZGU6OldSSVRFX0lOUVVJUllfTU9ERSk7Ci0gIEFTU0VSVF9FUShoY2lfcmVnaXN0ZXJfLmlucXVpcnlfbW9kZSwgaGNpOjpJbnF1aXJ5TW9kZTo6U1RBTkRBUkQpOwotfQotCi1URVNUX0YoSW5xdWlyeVRlc3QsIFNldFNjYW5UeXBlKSB7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U3luY2hyb25pemUoW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TZXRJbnRlcmxhY2VkU2NhbigpOyB9LCBoY2k6Ok9wQ29kZTo6V1JJVEVfSU5RVUlSWV9TQ0FOX1RZUEUpOwotICBBU1NFUlRfRVEoaGNpX3JlZ2lzdGVyXy5pbnF1aXJ5X3NjYW5fdHlwZSwgaGNpOjpJbnF1aXJ5U2NhblR5cGU6OklOVEVSTEFDRUQpOwotCi0gIHRlc3RfaGNpX2xheWVyXy0+U3luY2hyb25pemUoW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TZXRTdGFuZGFyZFNjYW4oKTsgfSwgaGNpOjpPcENvZGU6OldSSVRFX0lOUVVJUllfU0NBTl9UWVBFKTsKLSAgQVNTRVJUX0VRKGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9zY2FuX3R5cGUsIGhjaTo6SW5xdWlyeVNjYW5UeXBlOjpTVEFOREFSRCk7Ci19Ci0KLVRFU1RfRihJbnF1aXJ5VGVzdCwgU2NhbkFjdGl2aXR5KSB7Ci0gIFNjYW5QYXJhbWV0ZXJzIHBhcmFtc3sKLSAgICAgIC5pbnRlcnZhbCA9IDB4MTIzNCwKLSAgICAgIC53aW5kb3cgPSAweDU2NzgsCi0gIH07Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TeW5jaHJvbml6ZSgKLSAgICAgIFt0aGlzLCBwYXJhbXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TZXRTY2FuQWN0aXZpdHkocGFyYW1zKTsgfSwgaGNpOjpPcENvZGU6OldSSVRFX0lOUVVJUllfU0NBTl9BQ1RJVklUWSk7Ci0gIEFTU0VSVF9FUShwYXJhbXMuaW50ZXJ2YWwsIGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9zY2FuX2ludGVydmFsKTsKLSAgQVNTRVJUX0VRKHBhcmFtcy53aW5kb3csIGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9zY2FuX3dpbmRvdyk7Ci19Ci0KLVRFU1RfRihJbnF1aXJ5VGVzdCwgT25lU2hvdEdlbmVyYWxJbnF1aXJ5KSB7Ci0gIHVpbnQ4X3QgaW5xdWlyeV9sZW5ndGggPSAxMjg7Ci0gIHVpbnQ4X3QgbnVtX3Jlc3BvbnNlcyA9IDEwMDsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TeW5jaHJvbml6ZSgKLSAgICAgIFt0aGlzLCBpbnF1aXJ5X2xlbmd0aCwgbnVtX3Jlc3BvbnNlc10geyBpbnF1aXJ5X21vZHVsZV8tPlN0YXJ0R2VuZXJhbElucXVpcnkoaW5xdWlyeV9sZW5ndGgsIG51bV9yZXNwb25zZXMpOyB9LAotICAgICAgaGNpOjpPcENvZGU6OklOUVVJUlkpOwotICBBU1NFUlRfRVEoaW5xdWlyeV9sZW5ndGgsIGhjaV9yZWdpc3Rlcl8uaW5xdWlyeV9sZW5ndGgpOwotICBBU1NFUlRfRVEobnVtX3Jlc3BvbnNlcywgaGNpX3JlZ2lzdGVyXy5udW1fcmVzcG9uc2VzKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlN5bmNocm9uaXplKFt0aGlzXSB7IGlucXVpcnlfbW9kdWxlXy0+U3RvcElucXVpcnkoKTsgfSwgaGNpOjpPcENvZGU6OklOUVVJUllfQ0FOQ0VMKTsKLX0KLQotVEVTVF9GKElucXVpcnlUZXN0LCBPbmVTaG90TGltaXRlZElucXVpcnkpIHsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TeW5jaHJvbml6ZShbdGhpc10geyBpbnF1aXJ5X21vZHVsZV8tPlN0YXJ0TGltaXRlZElucXVpcnkoMTI4LCAxMDApOyB9LCBoY2k6Ok9wQ29kZTo6SU5RVUlSWSk7Ci0KLSAgdGVzdF9oY2lfbGF5ZXJfLT5TeW5jaHJvbml6ZShbdGhpc10geyBpbnF1aXJ5X21vZHVsZV8tPlN0b3BJbnF1aXJ5KCk7IH0sIGhjaTo6T3BDb2RlOjpJTlFVSVJZX0NBTkNFTCk7Ci19Ci0KLVRFU1RfRihJbnF1aXJ5VGVzdCwgR2VuZXJhbFBlcmlvZGljSW5xdWlyeSkgewotICB1aW50OF90IGlucXVpcnlfbGVuZ3RoID0gMTI4OwotICB1aW50OF90IG51bV9yZXNwb25zZXMgPSAxMDA7Ci0gIHVpbnQxNl90IG1heF9kZWxheSA9IDExMDA7Ci0gIHVpbnQxNl90IG1pbl9kZWxheSA9IDIwMDsKLSAgdGVzdF9oY2lfbGF5ZXJfLT5TeW5jaHJvbml6ZSgKLSAgICAgIFt0aGlzLCBpbnF1aXJ5X2xlbmd0aCwgbnVtX3Jlc3BvbnNlcywgbWF4X2RlbGF5LCBtaW5fZGVsYXldIHsKLSAgICAgICAgaW5xdWlyeV9tb2R1bGVfLT5TdGFydEdlbmVyYWxQZXJpb2RpY0lucXVpcnkoaW5xdWlyeV9sZW5ndGgsIG51bV9yZXNwb25zZXMsIG1heF9kZWxheSwgbWluX2RlbGF5KTsKLSAgICAgIH0sCi0gICAgICBoY2k6Ok9wQ29kZTo6UEVSSU9ESUNfSU5RVUlSWV9NT0RFKTsKLSAgQVNTRVJUX0VRKGlucXVpcnlfbGVuZ3RoLCBoY2lfcmVnaXN0ZXJfLmlucXVpcnlfbGVuZ3RoKTsKLSAgQVNTRVJUX0VRKG51bV9yZXNwb25zZXMsIGhjaV9yZWdpc3Rlcl8ubnVtX3Jlc3BvbnNlcyk7Ci0gIEFTU0VSVF9FUShtYXhfZGVsYXksIGhjaV9yZWdpc3Rlcl8ubWF4X3BlcmlvZF9sZW5ndGgpOwotICBBU1NFUlRfRVEobWluX2RlbGF5LCBoY2lfcmVnaXN0ZXJfLm1pbl9wZXJpb2RfbGVuZ3RoKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlN5bmNocm9uaXplKAotICAgICAgW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TdG9wUGVyaW9kaWNJbnF1aXJ5KCk7IH0sIGhjaTo6T3BDb2RlOjpFWElUX1BFUklPRElDX0lOUVVJUllfTU9ERSk7Ci19Ci0KLVRFU1RfRihJbnF1aXJ5VGVzdCwgTGltaXRlZFBlcmlvZGljSW5xdWlyeSkgewotICB0ZXN0X2hjaV9sYXllcl8tPlN5bmNocm9uaXplKAotICAgICAgW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TdGFydExpbWl0ZWRQZXJpb2RpY0lucXVpcnkoMTI4LCAxMDAsIDExMDAsIDIwMCk7IH0sCi0gICAgICBoY2k6Ok9wQ29kZTo6UEVSSU9ESUNfSU5RVUlSWV9NT0RFKTsKLQotICB0ZXN0X2hjaV9sYXllcl8tPlN5bmNocm9uaXplKAotICAgICAgW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TdG9wUGVyaW9kaWNJbnF1aXJ5KCk7IH0sIGhjaTo6T3BDb2RlOjpFWElUX1BFUklPRElDX0lOUVVJUllfTU9ERSk7Ci19Ci0KLVRFU1RfRihJbnF1aXJ5VGVzdCwgSW5qZWN0SW5xdWlyeVJlc3VsdCkgewotICB0ZXN0X2hjaV9sYXllcl8tPlN5bmNocm9uaXplKFt0aGlzXSB7IGlucXVpcnlfbW9kdWxlXy0+U3RhcnRHZW5lcmFsSW5xdWlyeSgxMjgsIDEwMCk7IH0sIGhjaTo6T3BDb2RlOjpJTlFVSVJZKTsKLQotICBXYWl0Rm9ySW5xdWlyeVJlc3VsdChbdGhpc10gewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhjaTo6SW5xdWlyeVJlc3VsdD4gaW5xdWlyeV9yZXN1bHRzOwotICAgIGF1dG8gcGFja2V0ID0gaGNpOjpJbnF1aXJ5UmVzdWx0QnVpbGRlcjo6Q3JlYXRlKGlucXVpcnlfcmVzdWx0cyk7Ci0gICAgdGVzdF9oY2lfbGF5ZXJfLT5JbmplY3RJbnF1aXJ5UmVzdWx0KHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfSk7Ci0gIHRlc3RfaGNpX2xheWVyXy0+U3luY2hyb25pemUoW3RoaXNdIHsgaW5xdWlyeV9tb2R1bGVfLT5TdG9wSW5xdWlyeSgpOyB9LCBoY2k6Ok9wQ29kZTo6SU5RVUlSWV9DQU5DRUwpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBuZWlnaGJvcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvbmFtZS5jYyBiL2dkL25laWdoYm9yL25hbWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YWNmMmUuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvbmFtZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJidF9nZF9uZWlnaCIKLQotI2luY2x1ZGUgIm5laWdoYm9yL25hbWUuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotc3RydWN0IFJlYWRDYWxsYmFja0hhbmRsZXIgewotICBSZWFkUmVtb3RlTmFtZUNhbGxiYWNrIGNhbGxiYWNrOwotICBvczo6SGFuZGxlciogaGFuZGxlcjsKLX07Ci0KLXN0cnVjdCBDYW5jZWxDYWxsYmFja0hhbmRsZXIgewotICBDYW5jZWxSZW1vdGVOYW1lQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyOwotfTsKLQotY29uc3RleHByIFJlbW90ZU5hbWUga0VtcHR5TmFtZXt9OwotCi1zdHJ1Y3QgTmFtZU1vZHVsZTo6aW1wbCB7Ci0gIHZvaWQgUmVhZFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgICAgaGNpOjpBZGRyZXNzIGFkZHJlc3MsCi0gICAgICBoY2k6OlBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSwKLSAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwKLSAgICAgIGhjaTo6Q2xvY2tPZmZzZXRWYWxpZCBjbG9ja19vZmZzZXRfdmFsaWQsCi0gICAgICBSZWFkUmVtb3RlTmFtZUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotICB2b2lkIENhbmNlbFJlbW90ZU5hbWVSZXF1ZXN0KGhjaTo6QWRkcmVzcyBhZGRyZXNzLCBDYW5jZWxSZW1vdGVOYW1lQ2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKTsKLQotICB2b2lkIFN0YXJ0KCk7Ci0gIHZvaWQgU3RvcCgpOwotCi0gIGltcGwoY29uc3QgTmFtZU1vZHVsZSYgbmFtZV9tb2R1bGUpOwotCi0gcHJpdmF0ZToKLSAgY29uc3QgTmFtZU1vZHVsZSYgbW9kdWxlXzsKLQotICB2b2lkIEVucXVldWVDb21tYW5kQ29tcGxldGUoc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpOwotICB2b2lkIEVucXVldWVDb21tYW5kU3RhdHVzKHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kKTsKLQotICB2b2lkIE9uQ29tbWFuZENvbXBsZXRlKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyB2aWV3KTsKLSAgdm9pZCBPbkNvbW1hbmRTdGF0dXMoaGNpOjpDb21tYW5kU3RhdHVzVmlldyBzdGF0dXMpOwotICB2b2lkIE9uRXZlbnQoaGNpOjpFdmVudFZpZXcgdmlldyk7Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjp1bmlxdWVfcHRyPFJlYWRDYWxsYmFja0hhbmRsZXI+PiByZWFkX2NhbGxiYWNrX2hhbmRsZXJfbWFwXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjp1bmlxdWVfcHRyPENhbmNlbENhbGxiYWNrSGFuZGxlcj4+IGNhbmNlbF9jYWxsYmFja19oYW5kbGVyX21hcF87Ci0KLSAgaGNpOjpIY2lMYXllciogaGNpX2xheWVyXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBuZWlnaGJvcjo6TmFtZU1vZHVsZTo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgbmVpZ2hib3I6Ok5hbWVNb2R1bGUoKTsgfSk7Ci0KLW5laWdoYm9yOjpOYW1lTW9kdWxlOjppbXBsOjppbXBsKGNvbnN0IG5laWdoYm9yOjpOYW1lTW9kdWxlJiBtb2R1bGUpIDogbW9kdWxlXyhtb2R1bGUpIHt9Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVNb2R1bGU6OmltcGw6OkVucXVldWVDb21tYW5kQ29tcGxldGUoc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpIHsKLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKGNvbW1hbmQpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kQ29tcGxldGUpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6TmFtZU1vZHVsZTo6aW1wbDo6RW5xdWV1ZUNvbW1hbmRTdGF0dXMoc3RkOjp1bmlxdWVfcHRyPGhjaTo6Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpIHsKLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKGNvbW1hbmQpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kU3RhdHVzKSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVNb2R1bGU6OmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyB2aWV3KSB7Ci0gIHN3aXRjaCAodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpIHsKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRU1PVEVfTkFNRV9SRVFVRVNUX0NBTkNFTDogewotICAgICAgYXV0byBwYWNrZXQgPSBoY2k6OlJlbW90ZU5hbWVSZXF1ZXN0Q2FuY2VsQ29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzID0gcGFja2V0LkdldEJkQWRkcigpOwotICAgICAgQVNTRVJUKGNhbmNlbF9jYWxsYmFja19oYW5kbGVyX21hcF8uZmluZChhZGRyZXNzKSAhPSBjYW5jZWxfY2FsbGJhY2tfaGFuZGxlcl9tYXBfLmVuZCgpKTsKLSAgICAgIGNhbmNlbF9jYWxsYmFja19oYW5kbGVyX21hcF8uZXJhc2UoYWRkcmVzcyk7Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIlVuaGFuZGxlZCBjb21tYW5kOiVzIiwgaGNpOjpPcENvZGVUZXh0KHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVNb2R1bGU6OmltcGw6Ok9uQ29tbWFuZFN0YXR1cyhoY2k6OkNvbW1hbmRTdGF0dXNWaWV3IHN0YXR1cykgewotICBBU1NFUlQoc3RhdHVzLkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLQotICBzd2l0Y2ggKHN0YXR1cy5HZXRDb21tYW5kT3BDb2RlKCkpIHsKLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRU1PVEVfTkFNRV9SRVFVRVNUOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6UmVtb3RlTmFtZVJlcXVlc3RTdGF0dXNWaWV3OjpDcmVhdGUoc3RhdHVzKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCJVbmhhbmRsZWQgY29tbWFuZDolcyIsIGhjaTo6T3BDb2RlVGV4dChzdGF0dXMuR2V0Q29tbWFuZE9wQ29kZSgpKS5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVNb2R1bGU6OmltcGw6Ok9uRXZlbnQoaGNpOjpFdmVudFZpZXcgdmlldykgewotICBzd2l0Y2ggKHZpZXcuR2V0RXZlbnRDb2RlKCkpIHsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpSRU1PVEVfTkFNRV9SRVFVRVNUX0NPTVBMRVRFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6UmVtb3RlTmFtZVJlcXVlc3RDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzID0gcGFja2V0LkdldEJkQWRkcigpOwotICAgICAgQVNTRVJUKHJlYWRfY2FsbGJhY2tfaGFuZGxlcl9tYXBfLmZpbmQoYWRkcmVzcykgIT0gcmVhZF9jYWxsYmFja19oYW5kbGVyX21hcF8uZW5kKCkpOwotICAgICAgYXV0byByZWFkX2NhbGxiYWNrX2hhbmRsZXIgPSBzdGQ6Om1vdmUocmVhZF9jYWxsYmFja19oYW5kbGVyX21hcF9bYWRkcmVzc10pOwotICAgICAgcmVhZF9jYWxsYmFja19oYW5kbGVyLT5oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAgICAgc3RkOjptb3ZlKHJlYWRfY2FsbGJhY2tfaGFuZGxlci0+Y2FsbGJhY2spLCBwYWNrZXQuR2V0U3RhdHVzKCksIGFkZHJlc3MsIHBhY2tldC5HZXRSZW1vdGVOYW1lKCkpKTsKLSAgICAgIHJlYWRfY2FsbGJhY2tfaGFuZGxlcl9tYXBfLmVyYXNlKGFkZHJlc3MpOwotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiVW5oYW5kbGVkIGV2ZW50OiVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHZpZXcuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBuZWlnaGJvcjo6TmFtZU1vZHVsZTo6aW1wbDo6U3RhcnQoKSB7Ci0gIGhjaV9sYXllcl8gPSBtb2R1bGVfLkdldERlcGVuZGVuY3k8aGNpOjpIY2lMYXllcj4oKTsKLSAgaGFuZGxlcl8gPSBtb2R1bGVfLkdldEhhbmRsZXIoKTsKLQotICBoY2lfbGF5ZXJfLT5SZWdpc3RlckV2ZW50SGFuZGxlcigKLSAgICAgIGhjaTo6RXZlbnRDb2RlOjpSRU1PVEVfTkFNRV9SRVFVRVNUX0NPTVBMRVRFLCBoYW5kbGVyXy0+QmluZE9uKHRoaXMsICZOYW1lTW9kdWxlOjppbXBsOjpPbkV2ZW50KSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVNb2R1bGU6OmltcGw6OlN0b3AoKSB7Ci0gIGhjaV9sYXllcl8tPlVucmVnaXN0ZXJFdmVudEhhbmRsZXIoaGNpOjpFdmVudENvZGU6OlJFTU9URV9OQU1FX1JFUVVFU1RfQ09NUExFVEUpOwotfQotCi12b2lkIG5laWdoYm9yOjpOYW1lTW9kdWxlOjppbXBsOjpSZWFkUmVtb3RlTmFtZVJlcXVlc3QoCi0gICAgaGNpOjpBZGRyZXNzIGFkZHJlc3MsCi0gICAgaGNpOjpQYWdlU2NhblJlcGV0aXRpb25Nb2RlIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUsCi0gICAgdWludDE2X3QgY2xvY2tfb2Zmc2V0LAotICAgIGhjaTo6Q2xvY2tPZmZzZXRWYWxpZCBjbG9ja19vZmZzZXRfdmFsaWQsCi0gICAgUmVhZFJlbW90ZU5hbWVDYWxsYmFjayBjYWxsYmFjaywKLSAgICBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBMT0dfSU5GTygiJXMgU3RhcnQgcmVhZCByZW1vdGUgbmFtZSByZXF1ZXN0IGZvciAlcyIsIF9fZnVuY19fLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKHJlYWRfY2FsbGJhY2tfaGFuZGxlcl9tYXBfLmZpbmQoYWRkcmVzcykgIT0gcmVhZF9jYWxsYmFja19oYW5kbGVyX21hcF8uZW5kKCkpIHsKLSAgICBMT0dfV0FSTigiSWdub3JpbmcgZHVwbGljYXRlIHJlYWQgcmVtb3RlIG5hbWUgcmVxdWVzdCB0bzolcyIsIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBoYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2Uoc3RkOjptb3ZlKGNhbGxiYWNrKSwgaGNpOjpFcnJvckNvZGU6OlVOU1BFQ0lGSUVEX0VSUk9SLCBhZGRyZXNzLCBrRW1wdHlOYW1lKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJlYWRfY2FsbGJhY2tfaGFuZGxlcl9tYXBfW2FkZHJlc3NdID0gc3RkOjp1bmlxdWVfcHRyPFJlYWRDYWxsYmFja0hhbmRsZXI+KG5ldyBSZWFkQ2FsbGJhY2tIYW5kbGVyewotICAgICAgLmNhbGxiYWNrID0gc3RkOjptb3ZlKGNhbGxiYWNrKSwKLSAgICAgIC5oYW5kbGVyID0gaGFuZGxlciwKLSAgfSk7Ci0KLSAgRW5xdWV1ZUNvbW1hbmRTdGF0dXMoCi0gICAgICBoY2k6OlJlbW90ZU5hbWVSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MsIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUsIGNsb2NrX29mZnNldCwgY2xvY2tfb2Zmc2V0X3ZhbGlkKSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVNb2R1bGU6OmltcGw6OkNhbmNlbFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzLCBDYW5jZWxSZW1vdGVOYW1lQ2FsbGJhY2sgY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIExPR19JTkZPKCIlcyBDYW5jZWwgcmVtb3RlIG5hbWUgcmVxdWVzdCBmb3IgJXMiLCBfX2Z1bmNfXywgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmIChjYW5jZWxfY2FsbGJhY2tfaGFuZGxlcl9tYXBfLmZpbmQoYWRkcmVzcykgIT0gY2FuY2VsX2NhbGxiYWNrX2hhbmRsZXJfbWFwXy5lbmQoKSkgewotICAgIExPR19XQVJOKCJJZ25vcmluZyBkdXBsaWNhdGUgY2FuY2VsIHJlbW90ZSBuYW1lIHJlcXVlc3QgdG86JXMiLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKHN0ZDo6bW92ZShjYWxsYmFjayksIGhjaTo6RXJyb3JDb2RlOjpVTlNQRUNJRklFRF9FUlJPUiwgYWRkcmVzcykpOwotICAgIHJldHVybjsKLSAgfQotICBjYW5jZWxfY2FsbGJhY2tfaGFuZGxlcl9tYXBfW2FkZHJlc3NdID0gc3RkOjp1bmlxdWVfcHRyPENhbmNlbENhbGxiYWNrSGFuZGxlcj4obmV3IENhbmNlbENhbGxiYWNrSGFuZGxlcnsKLSAgICAgIC5jYWxsYmFjayA9IHN0ZDo6bW92ZShjYWxsYmFjayksCi0gICAgICAuaGFuZGxlciA9IGhhbmRsZXIsCi0gIH0pOwotICBFbnF1ZXVlQ29tbWFuZENvbXBsZXRlKGhjaTo6UmVtb3RlTmFtZVJlcXVlc3RDYW5jZWxCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcykpOwotfQotCi0vKioKLSAqIEdlbmVyYWwgQVBJIGhlcmUKLSAqLwotbmVpZ2hib3I6Ok5hbWVNb2R1bGU6Ok5hbWVNb2R1bGUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KCp0aGlzKSkge30KLQotbmVpZ2hib3I6Ok5hbWVNb2R1bGU6On5OYW1lTW9kdWxlKCkgewotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6TmFtZU1vZHVsZTo6UmVhZFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzLAotICAgIGhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZSBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlLAotICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwKLSAgICBoY2k6OkNsb2NrT2Zmc2V0VmFsaWQgY2xvY2tfb2Zmc2V0X3ZhbGlkLAotICAgIFJlYWRSZW1vdGVOYW1lQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgQVNTRVJUKGNhbGxiYWNrKTsKLSAgQVNTRVJUKGhhbmRsZXIgIT0gbnVsbHB0cik7Ci0gIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJk5hbWVNb2R1bGU6OmltcGw6OlJlYWRSZW1vdGVOYW1lUmVxdWVzdCwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChwaW1wbF8uZ2V0KCkpLAotICAgICAgYWRkcmVzcywKLSAgICAgIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUsCi0gICAgICBjbG9ja19vZmZzZXQsCi0gICAgICBjbG9ja19vZmZzZXRfdmFsaWQsCi0gICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLAotICAgICAgaGFuZGxlcikpOwotfQotCi12b2lkIG5laWdoYm9yOjpOYW1lTW9kdWxlOjpDYW5jZWxSZW1vdGVOYW1lUmVxdWVzdCgKLSAgICBoY2k6OkFkZHJlc3MgYWRkcmVzcywgQ2FuY2VsUmVtb3RlTmFtZUNhbGxiYWNrIGNhbGxiYWNrLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBBU1NFUlQoY2FsbGJhY2spOwotICBBU1NFUlQoaGFuZGxlciAhPSBudWxscHRyKTsKLSAgR2V0SGFuZGxlcigpLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmTmFtZU1vZHVsZTo6aW1wbDo6Q2FuY2VsUmVtb3RlTmFtZVJlcXVlc3QsCi0gICAgICBjb21tb246OlVucmV0YWluZWQocGltcGxfLmdldCgpKSwKLSAgICAgIGFkZHJlc3MsCi0gICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLAotICAgICAgaGFuZGxlcikpOwotfQotCi0vKioKLSAqIE1vZHVsZSBtZXRob2RzIGhlcmUKLSAqLwotdm9pZCBuZWlnaGJvcjo6TmFtZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxoY2k6OkhjaUxheWVyPigpOwotfQotCi12b2lkIG5laWdoYm9yOjpOYW1lTW9kdWxlOjpTdGFydCgpIHsKLSAgcGltcGxfLT5TdGFydCgpOwotfQotCi12b2lkIG5laWdoYm9yOjpOYW1lTW9kdWxlOjpTdG9wKCkgewotICBwaW1wbF8tPlN0b3AoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9uYW1lLmggYi9nZC9uZWlnaGJvci9uYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzc1N2QuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvbmFtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotdXNpbmcgUmVtb3RlTmFtZSA9IHN0ZDo6YXJyYXk8dWludDhfdCwgMjQ4PjsKLXVzaW5nIFJlYWRSZW1vdGVOYW1lQ2FsbGJhY2sgPSBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKGhjaTo6RXJyb3JDb2RlIHN0YXR1cywgaGNpOjpBZGRyZXNzIGFkZHJlc3MsIFJlbW90ZU5hbWUgbmFtZSk+OwotdXNpbmcgQ2FuY2VsUmVtb3RlTmFtZUNhbGxiYWNrID0gY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkVycm9yQ29kZSBzdGF0dXMsIGhjaTo6QWRkcmVzcyBhZGRyZXNzKT47Ci0KLWNsYXNzIE5hbWVNb2R1bGUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgdm9pZCBSZWFkUmVtb3RlTmFtZVJlcXVlc3QoCi0gICAgICBoY2k6OkFkZHJlc3MgYWRkcmVzcywKLSAgICAgIGhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZSBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlLAotICAgICAgdWludDE2X3QgY2xvY2tfb2Zmc2V0LAotICAgICAgaGNpOjpDbG9ja09mZnNldFZhbGlkIGNsb2NrX29mZnNldF92YWxpZCwKLSAgICAgIFJlYWRSZW1vdGVOYW1lQ2FsbGJhY2sgb25fcmVhZF9uYW1lLAotICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIpOwotICB2b2lkIENhbmNlbFJlbW90ZU5hbWVSZXF1ZXN0KGhjaTo6QWRkcmVzcyBhZGRyZXNzLCBDYW5jZWxSZW1vdGVOYW1lQ2FsbGJhY2sgb25fY2FuY2VsLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICBOYW1lTW9kdWxlKCk7Ci0gIH5OYW1lTW9kdWxlKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJOYW1lTW9kdWxlIik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBpbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW1wbD4gcGltcGxfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihOYW1lTW9kdWxlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBuZWlnaGJvcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvbmFtZV9kYi5jYyBiL2dkL25laWdoYm9yL25hbWVfZGIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDk3MzcuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvbmFtZV9kYi5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJidF9nZF9uZWlnaCIKLQotI2luY2x1ZGUgIm5laWdoYm9yL25hbWVfZGIuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL25hbWUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBQZW5kaW5nUmVtb3RlTmFtZVJlYWQgewotICBSZWFkUmVtb3RlTmFtZURiQ2FsbGJhY2sgY2FsbGJhY2tfOwotICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXN0cnVjdCBOYW1lRGJNb2R1bGU6OmltcGwgewotICB2b2lkIFJlYWRSZW1vdGVOYW1lUmVxdWVzdChoY2k6OkFkZHJlc3MgYWRkcmVzcywgUmVhZFJlbW90ZU5hbWVEYkNhbGxiYWNrIGNhbGxiYWNrLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgYm9vbCBJc05hbWVDYWNoZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIGNvbnN0OwotICBSZW1vdGVOYW1lIFJlYWRDYWNoZWRSZW1vdGVOYW1lKGhjaTo6QWRkcmVzcyBhZGRyZXNzKSBjb25zdDsKLQotICBpbXBsKGNvbnN0IE5hbWVEYk1vZHVsZSYgbW9kdWxlKTsKLQotICB2b2lkIFN0YXJ0KCk7Ci0gIHZvaWQgU3RvcCgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjpsaXN0PFBlbmRpbmdSZW1vdGVOYW1lUmVhZD4+IGFkZHJlc3NfdG9fcGVuZGluZ19yZWFkX21hcF87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxoY2k6OkFkZHJlc3MsIFJlbW90ZU5hbWU+IGFkZHJlc3NfdG9fbmFtZV9tYXBfOwotCi0gIHZvaWQgT25SZW1vdGVOYW1lUmVzcG9uc2UoaGNpOjpFcnJvckNvZGUgc3RhdHVzLCBoY2k6OkFkZHJlc3MgYWRkcmVzcywgUmVtb3RlTmFtZSBuYW1lKTsKLQotICBuZWlnaGJvcjo6TmFtZU1vZHVsZSogbmFtZV9tb2R1bGVfOwotCi0gIGNvbnN0IE5hbWVEYk1vZHVsZSYgbW9kdWxlXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBuZWlnaGJvcjo6TmFtZURiTW9kdWxlOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBuZWlnaGJvcjo6TmFtZURiTW9kdWxlKCk7IH0pOwotCi1uZWlnaGJvcjo6TmFtZURiTW9kdWxlOjppbXBsOjppbXBsKGNvbnN0IG5laWdoYm9yOjpOYW1lRGJNb2R1bGUmIG1vZHVsZSkgOiBtb2R1bGVfKG1vZHVsZSkge30KLQotdm9pZCBuZWlnaGJvcjo6TmFtZURiTW9kdWxlOjppbXBsOjpSZWFkUmVtb3RlTmFtZVJlcXVlc3QoCi0gICAgaGNpOjpBZGRyZXNzIGFkZHJlc3MsIFJlYWRSZW1vdGVOYW1lRGJDYWxsYmFjayBjYWxsYmFjaywgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgaWYgKGFkZHJlc3NfdG9fcGVuZGluZ19yZWFkX21hcF8uZmluZChhZGRyZXNzKSAhPSBhZGRyZXNzX3RvX3BlbmRpbmdfcmVhZF9tYXBfLmVuZCgpKSB7Ci0gICAgTE9HX1dBUk4oIkFscmVhZHkgaGF2ZSByZW1vdGUgcmVhZCBkYiBpbiBwcm9ncmVzczsgYWRkaW5nIGNhbGxiYWNrIHRvIGNhbGxiYWNrIGxpc3QiKTsKLSAgICBhZGRyZXNzX3RvX3BlbmRpbmdfcmVhZF9tYXBfW2FkZHJlc3NdLnB1c2hfYmFjayh7c3RkOjptb3ZlKGNhbGxiYWNrKSwgaGFuZGxlcn0pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bGlzdDxQZW5kaW5nUmVtb3RlTmFtZVJlYWQ+IHRtcDsKLSAgYWRkcmVzc190b19wZW5kaW5nX3JlYWRfbWFwX1thZGRyZXNzXSA9IHN0ZDo6bW92ZSh0bXApOwotICBhZGRyZXNzX3RvX3BlbmRpbmdfcmVhZF9tYXBfW2FkZHJlc3NdLnB1c2hfYmFjayh7c3RkOjptb3ZlKGNhbGxiYWNrKSwgaGFuZGxlcn0pOwotCi0gIC8vIFRPRE8oY21hbnRvbikgVXNlIHJlbW90ZSBuYW1lIHJlcXVlc3QgZGVmYXVsdHMgZm9yIG5vdwotICBoY2k6OlBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZSA9IGhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZTo6UjE7Ci0gIHVpbnQxNl90IGNsb2NrX29mZnNldCA9IDA7Ci0gIGhjaTo6Q2xvY2tPZmZzZXRWYWxpZCBjbG9ja19vZmZzZXRfdmFsaWQgPSBoY2k6OkNsb2NrT2Zmc2V0VmFsaWQ6OklOVkFMSUQ7Ci0gIG5hbWVfbW9kdWxlXy0+UmVhZFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgICAgYWRkcmVzcywKLSAgICAgIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUsCi0gICAgICBjbG9ja19vZmZzZXQsCi0gICAgICBjbG9ja19vZmZzZXRfdmFsaWQsCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZOYW1lRGJNb2R1bGU6OmltcGw6Ok9uUmVtb3RlTmFtZVJlc3BvbnNlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgaGFuZGxlcl8pOwotfQotCi12b2lkIG5laWdoYm9yOjpOYW1lRGJNb2R1bGU6OmltcGw6Ok9uUmVtb3RlTmFtZVJlc3BvbnNlKGhjaTo6RXJyb3JDb2RlIHN0YXR1cywgaGNpOjpBZGRyZXNzIGFkZHJlc3MsIFJlbW90ZU5hbWUgbmFtZSkgewotICBBU1NFUlQoYWRkcmVzc190b19wZW5kaW5nX3JlYWRfbWFwXy5maW5kKGFkZHJlc3MpICE9IGFkZHJlc3NfdG9fcGVuZGluZ19yZWFkX21hcF8uZW5kKCkpOwotICBpZiAoc3RhdHVzID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKSB7Ci0gICAgYWRkcmVzc190b19uYW1lX21hcF9bYWRkcmVzc10gPSBuYW1lOwotICB9Ci0gIGF1dG8mIGNhbGxiYWNrX2xpc3QgPSBhZGRyZXNzX3RvX3BlbmRpbmdfcmVhZF9tYXBfLmF0KGFkZHJlc3MpOwotICBmb3IgKGF1dG8mIGl0IDogY2FsbGJhY2tfbGlzdCkgewotICAgIGl0LmhhbmRsZXJfLT5DYWxsKHN0ZDo6bW92ZShpdC5jYWxsYmFja18pLCBhZGRyZXNzLCBzdGF0dXMgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICB9Ci0gIGFkZHJlc3NfdG9fcGVuZGluZ19yZWFkX21hcF8uZXJhc2UoYWRkcmVzcyk7Ci19Ci0KLWJvb2wgbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZTo6aW1wbDo6SXNOYW1lQ2FjaGVkKGhjaTo6QWRkcmVzcyBhZGRyZXNzKSBjb25zdCB7Ci0gIHJldHVybiBhZGRyZXNzX3RvX25hbWVfbWFwXy5jb3VudChhZGRyZXNzKSA9PSAxOwotfQotCi1SZW1vdGVOYW1lIG5laWdoYm9yOjpOYW1lRGJNb2R1bGU6OmltcGw6OlJlYWRDYWNoZWRSZW1vdGVOYW1lKGhjaTo6QWRkcmVzcyBhZGRyZXNzKSBjb25zdCB7Ci0gIEFTU0VSVChJc05hbWVDYWNoZWQoYWRkcmVzcykpOwotICByZXR1cm4gYWRkcmVzc190b19uYW1lX21hcF8uYXQoYWRkcmVzcyk7Ci19Ci0KLS8qKgotICogR2VuZXJhbCBBUEkgaGVyZQotICovCi1uZWlnaGJvcjo6TmFtZURiTW9kdWxlOjpOYW1lRGJNb2R1bGUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KCp0aGlzKSkge30KLQotbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZTo6fk5hbWVEYk1vZHVsZSgpIHsKLSAgcGltcGxfLnJlc2V0KCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZTo6UmVhZFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzLCBSZWFkUmVtb3RlTmFtZURiQ2FsbGJhY2sgY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIEdldEhhbmRsZXIoKS0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJk5hbWVEYk1vZHVsZTo6aW1wbDo6UmVhZFJlbW90ZU5hbWVSZXF1ZXN0LAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHBpbXBsXy5nZXQoKSksCi0gICAgICBhZGRyZXNzLAotICAgICAgc3RkOjptb3ZlKGNhbGxiYWNrKSwKLSAgICAgIGhhbmRsZXIpKTsKLX0KLQotYm9vbCBuZWlnaGJvcjo6TmFtZURiTW9kdWxlOjpJc05hbWVDYWNoZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIGNvbnN0IHsKLSAgcmV0dXJuIHBpbXBsXy0+SXNOYW1lQ2FjaGVkKGFkZHJlc3MpOwotfQotCi1SZW1vdGVOYW1lIG5laWdoYm9yOjpOYW1lRGJNb2R1bGU6OlJlYWRDYWNoZWRSZW1vdGVOYW1lKGhjaTo6QWRkcmVzcyBhZGRyZXNzKSBjb25zdCB7Ci0gIHJldHVybiBwaW1wbF8tPlJlYWRDYWNoZWRSZW1vdGVOYW1lKGFkZHJlc3MpOwotfQotCi12b2lkIG5laWdoYm9yOjpOYW1lRGJNb2R1bGU6OmltcGw6OlN0YXJ0KCkgewotICBuYW1lX21vZHVsZV8gPSBtb2R1bGVfLkdldERlcGVuZGVuY3k8bmVpZ2hib3I6Ok5hbWVNb2R1bGU+KCk7Ci0gIGhhbmRsZXJfID0gbW9kdWxlXy5HZXRIYW5kbGVyKCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZTo6aW1wbDo6U3RvcCgpIHt9Ci0KLS8qKgotICogTW9kdWxlIG1ldGhvZHMgaGVyZQotICovCi12b2lkIG5laWdoYm9yOjpOYW1lRGJNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICBsaXN0LT5hZGQ8bmVpZ2hib3I6Ok5hbWVNb2R1bGU+KCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZTo6U3RhcnQoKSB7Ci0gIHBpbXBsXy0+U3RhcnQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6TmFtZURiTW9kdWxlOjpTdG9wKCkgewotICBwaW1wbF8tPlN0b3AoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9uYW1lX2RiLmggYi9nZC9uZWlnaGJvci9uYW1lX2RiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODBjZmYuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3IvbmFtZV9kYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAibmVpZ2hib3IvbmFtZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBuZWlnaGJvciB7Ci0KLXVzaW5nIFJlYWRSZW1vdGVOYW1lRGJDYWxsYmFjayA9IGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MsIGJvb2wgc3VjY2Vzcyk+OwotCi1jbGFzcyBOYW1lRGJNb2R1bGUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIFJlYWRSZW1vdGVOYW1lUmVxdWVzdChoY2k6OkFkZHJlc3MgYWRkcmVzcywgUmVhZFJlbW90ZU5hbWVEYkNhbGxiYWNrIGNhbGxiYWNrLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgYm9vbCBJc05hbWVDYWNoZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIGNvbnN0OwotICBSZW1vdGVOYW1lIFJlYWRDYWNoZWRSZW1vdGVOYW1lKGhjaTo6QWRkcmVzcyBhZGRyZXNzKSBjb25zdDsKLQotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gIE5hbWVEYk1vZHVsZSgpOwotICB+TmFtZURiTW9kdWxlKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJOYW1lRGIiKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE5hbWVEYk1vZHVsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbmVpZ2hib3IKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL3BhZ2UuY2MgYi9nZC9uZWlnaGJvci9wYWdlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI0YWU5Li4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL3BhZ2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiYnRfZ2RfbmVpZ2giCi0KLSNpbmNsdWRlICJuZWlnaGJvci9wYWdlLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9zY2FuX3BhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotc3RydWN0IFBhZ2VNb2R1bGU6OmltcGwgewotICB2b2lkIFNldFNjYW5BY3Rpdml0eShTY2FuUGFyYW1ldGVycyBwYXJhbXMpOwotICBTY2FuUGFyYW1ldGVycyBHZXRTY2FuQWN0aXZpdHkoKSBjb25zdDsKLQotICB2b2lkIFNldFNjYW5UeXBlKGhjaTo6UGFnZVNjYW5UeXBlIHR5cGUpOwotCi0gIHZvaWQgU2V0VGltZW91dChQYWdlVGltZW91dCB0aW1lb3V0KTsKLQotICB2b2lkIFN0YXJ0KCk7Ci0gIHZvaWQgU3RvcCgpOwotCi0gIGltcGwoUGFnZU1vZHVsZSYgcGFnZV9tb2R1bGUpOwotCi0gcHJpdmF0ZToKLSAgUGFnZU1vZHVsZSYgbW9kdWxlXzsKLQotICBTY2FuUGFyYW1ldGVycyBzY2FuX3BhcmFtZXRlcnNfOwotICBoY2k6OlBhZ2VTY2FuVHlwZSBzY2FuX3R5cGVfOwotICBQYWdlVGltZW91dCB0aW1lb3V0XzsKLQotICB2b2lkIE9uQ29tbWFuZENvbXBsZXRlKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyBzdGF0dXMpOwotCi0gIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllcl87Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLX07Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgbmVpZ2hib3I6OlBhZ2VNb2R1bGU6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IG5laWdoYm9yOjpQYWdlTW9kdWxlKCk7IH0pOwotCi1uZWlnaGJvcjo6UGFnZU1vZHVsZTo6aW1wbDo6aW1wbChuZWlnaGJvcjo6UGFnZU1vZHVsZSYgbW9kdWxlKSA6IG1vZHVsZV8obW9kdWxlKSB7fQotCi12b2lkIG5laWdoYm9yOjpQYWdlTW9kdWxlOjppbXBsOjpPbkNvbW1hbmRDb21wbGV0ZShoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICBzd2l0Y2ggKHZpZXcuR2V0Q29tbWFuZE9wQ29kZSgpKSB7Ci0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfUEFHRV9TQ0FOX0FDVElWSVRZOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6V3JpdGVQYWdlU2NhbkFjdGl2aXR5Q29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9QQUdFX1NDQU5fQUNUSVZJVFk6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkUGFnZVNjYW5BY3Rpdml0eUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgICBzY2FuX3BhcmFtZXRlcnNfLmludGVydmFsID0gcGFja2V0LkdldFBhZ2VTY2FuSW50ZXJ2YWwoKTsKLSAgICAgIHNjYW5fcGFyYW1ldGVyc18ud2luZG93ID0gcGFja2V0LkdldFBhZ2VTY2FuV2luZG93KCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgaGNpOjpPcENvZGU6OldSSVRFX1BBR0VfU0NBTl9UWVBFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6V3JpdGVQYWdlU2NhblR5cGVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpSRUFEX1BBR0VfU0NBTl9UWVBFOiB7Ci0gICAgICBhdXRvIHBhY2tldCA9IGhjaTo6UmVhZFBhZ2VTY2FuVHlwZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgICBzY2FuX3R5cGVfID0gcGFja2V0LkdldFBhZ2VTY2FuVHlwZSgpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6T3BDb2RlOjpXUklURV9QQUdFX1RJTUVPVVQ6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpXcml0ZVBhZ2VUaW1lb3V0Q29tcGxldGVWaWV3OjpDcmVhdGUodmlldyk7Ci0gICAgICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgICBBU1NFUlQocGFja2V0LkdldFN0YXR1cygpID09IGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6UkVBRF9QQUdFX1RJTUVPVVQ6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkUGFnZVRpbWVvdXRDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgICAgdGltZW91dF8gPSBwYWNrZXQuR2V0UGFnZVRpbWVvdXQoKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiVW5oYW5kbGVkIGNvbW1hbmQgJXMiLCBoY2k6Ok9wQ29kZVRleHQodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6aW1wbDo6U3RhcnQoKSB7Ci0gIGhjaV9sYXllcl8gPSBtb2R1bGVfLkdldERlcGVuZGVuY3k8aGNpOjpIY2lMYXllcj4oKTsKLSAgaGFuZGxlcl8gPSBtb2R1bGVfLkdldEhhbmRsZXIoKTsKLQotICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIGhjaTo6UmVhZFBhZ2VTY2FuQWN0aXZpdHlCdWlsZGVyOjpDcmVhdGUoKSwgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci0KLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBoY2k6OlJlYWRQYWdlU2NhblR5cGVCdWlsZGVyOjpDcmVhdGUoKSwgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci0KLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBoY2k6OlJlYWRQYWdlVGltZW91dEJ1aWxkZXI6OkNyZWF0ZSgpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kQ29tcGxldGUpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6aW1wbDo6U3RvcCgpIHsKLSAgTE9HX0lORk8oIlBhZ2Ugc2NhbiBpbnRlcnZhbDolaGQgd2luZG93OiVoZCIsIHNjYW5fcGFyYW1ldGVyc18uaW50ZXJ2YWwsIHNjYW5fcGFyYW1ldGVyc18ud2luZG93KTsKLSAgTE9HX0lORk8oIlBhZ2Ugc2Nhbl90eXBlOiVzIiwgaGNpOjpQYWdlU2NhblR5cGVUZXh0KHNjYW5fdHlwZV8pLmNfc3RyKCkpOwotfQotCi12b2lkIG5laWdoYm9yOjpQYWdlTW9kdWxlOjppbXBsOjpTZXRTY2FuQWN0aXZpdHkoU2NhblBhcmFtZXRlcnMgcGFyYW1zKSB7Ci0gIGhjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpXcml0ZVBhZ2VTY2FuQWN0aXZpdHlCdWlsZGVyOjpDcmVhdGUocGFyYW1zLmludGVydmFsLCBwYXJhbXMud2luZG93KSwKLSAgICAgIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotCi0gIGhjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpSZWFkUGFnZVNjYW5BY3Rpdml0eUJ1aWxkZXI6OkNyZWF0ZSgpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kQ29tcGxldGUpKTsKLSAgTE9HX0lORk8oCi0gICAgICAiU2V0IHBhZ2Ugc2NhbiBhY3Rpdml0eSBpbnRlcnZhbDoweCV4LyUuMDJmbXMgd2luZG93OjB4JXgvJS4wMmZtcyIsCi0gICAgICBwYXJhbXMuaW50ZXJ2YWwsCi0gICAgICBTY2FuSW50ZXJ2YWxUaW1lTXMocGFyYW1zLmludGVydmFsKSwKLSAgICAgIHBhcmFtcy53aW5kb3csCi0gICAgICBTY2FuV2luZG93VGltZU1zKHBhcmFtcy53aW5kb3cpKTsKLX0KLQotU2NhblBhcmFtZXRlcnMgbmVpZ2hib3I6OlBhZ2VNb2R1bGU6OmltcGw6OkdldFNjYW5BY3Rpdml0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNjYW5fcGFyYW1ldGVyc187Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OlBhZ2VNb2R1bGU6OmltcGw6OlNldFNjYW5UeXBlKGhjaTo6UGFnZVNjYW5UeXBlIHNjYW5fdHlwZSkgewotICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIGhjaTo6V3JpdGVQYWdlU2NhblR5cGVCdWlsZGVyOjpDcmVhdGUoc2Nhbl90eXBlKSwgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci0KLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICBoY2k6OlJlYWRQYWdlU2NhblR5cGVCdWlsZGVyOjpDcmVhdGUoKSwgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci0gIExPR19JTkZPKCJTZXQgcGFnZSBzY2FuIHR5cGU6JXMiLCBoY2k6OlBhZ2VTY2FuVHlwZVRleHQoc2Nhbl90eXBlKS5jX3N0cigpKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6aW1wbDo6U2V0VGltZW91dChQYWdlVGltZW91dCB0aW1lb3V0KSB7Ci0gIGhjaV9sYXllcl8tPkVucXVldWVDb21tYW5kKAotICAgICAgaGNpOjpXcml0ZVBhZ2VUaW1lb3V0QnVpbGRlcjo6Q3JlYXRlKHRpbWVvdXQpLCBoYW5kbGVyXy0+QmluZE9uY2VPbih0aGlzLCAmaW1wbDo6T25Db21tYW5kQ29tcGxldGUpKTsKLQotICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgIGhjaTo6UmVhZFBhZ2VUaW1lb3V0QnVpbGRlcjo6Q3JlYXRlKCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotICBMT0dfSU5GTygiU2V0IHBhZ2Ugc2NhbiB0aW1lb3V0OjB4JXgvJS4wMmZtcyIsIHRpbWVvdXQsIFBhZ2VUaW1lb3V0TXModGltZW91dCkpOwotfQotCi0vKioKLSAqIEdlbmVyYWwgQVBJIGhlcmUKLSAqLwotbmVpZ2hib3I6OlBhZ2VNb2R1bGU6OlBhZ2VNb2R1bGUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KCp0aGlzKSkge30KLQotbmVpZ2hib3I6OlBhZ2VNb2R1bGU6On5QYWdlTW9kdWxlKCkgewotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6U2V0U2NhbkFjdGl2aXR5KFNjYW5QYXJhbWV0ZXJzIHBhcmFtcykgewotICBwaW1wbF8tPlNldFNjYW5BY3Rpdml0eShwYXJhbXMpOwotfQotCi1TY2FuUGFyYW1ldGVycyBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6R2V0U2NhbkFjdGl2aXR5KCkgY29uc3QgewotICByZXR1cm4gcGltcGxfLT5HZXRTY2FuQWN0aXZpdHkoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6U2V0SW50ZXJsYWNlZFNjYW4oKSB7Ci0gIHBpbXBsXy0+U2V0U2NhblR5cGUoaGNpOjpQYWdlU2NhblR5cGU6OklOVEVSTEFDRUQpOwotfQotCi12b2lkIG5laWdoYm9yOjpQYWdlTW9kdWxlOjpTZXRTdGFuZGFyZFNjYW4oKSB7Ci0gIHBpbXBsXy0+U2V0U2NhblR5cGUoaGNpOjpQYWdlU2NhblR5cGU6OlNUQU5EQVJEKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6U2V0VGltZW91dChQYWdlVGltZW91dCB0aW1lb3V0KSB7Ci0gIHBpbXBsXy0+U2V0VGltZW91dCh0aW1lb3V0KTsKLX0KLQotLyoqCi0gKiBNb2R1bGUgbWV0aG9kcyBoZXJlCi0gKi8KLXZvaWQgbmVpZ2hib3I6OlBhZ2VNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICBsaXN0LT5hZGQ8aGNpOjpIY2lMYXllcj4oKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIHBpbXBsXy0+U3RhcnQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6UGFnZU1vZHVsZTo6U3RvcCgpIHsKLSAgcGltcGxfLT5TdG9wKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBuZWlnaGJvcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvbmVpZ2hib3IvcGFnZS5oIGIvZ2QvbmVpZ2hib3IvcGFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGMzYWU2Li4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL3BhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL3NjYW5fcGFyYW1ldGVycy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBuZWlnaGJvciB7Ci0KLXVzaW5nIFBhZ2VUaW1lb3V0ID0gdWludDE2X3Q7ICAvLyBSYW5nZSA9IDB4MDAwMSB0byAweGZmZmYsIFRpbWUgTiAqIDAuNjI1bXMKLQotaW5saW5lIGRvdWJsZSBQYWdlVGltZW91dE1zKFBhZ2VUaW1lb3V0IHRpbWVvdXQpIHsKLSAgcmV0dXJuIGtUaW1lVGlja01zICogdGltZW91dDsKLX0KLQotY2xhc3MgUGFnZU1vZHVsZSA6IHB1YmxpYyBibHVldG9vdGg6Ok1vZHVsZSB7Ci0gcHVibGljOgotICB2b2lkIFNldFNjYW5BY3Rpdml0eShTY2FuUGFyYW1ldGVycyBwYXJhbXMpOwotICBTY2FuUGFyYW1ldGVycyBHZXRTY2FuQWN0aXZpdHkoKSBjb25zdDsKLQotICB2b2lkIFNldEludGVybGFjZWRTY2FuKCk7Ci0gIHZvaWQgU2V0U3RhbmRhcmRTY2FuKCk7Ci0KLSAgdm9pZCBTZXRUaW1lb3V0KFBhZ2VUaW1lb3V0IHRpbWVvdXQpOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgUGFnZU1vZHVsZSgpOwotICB+UGFnZU1vZHVsZSgpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiUGFnZSIpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUGFnZU1vZHVsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbmVpZ2hib3IKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL25laWdoYm9yL3NjYW4uY2MgYi9nZC9uZWlnaGJvci9zY2FuLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA4NzI1Li4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL3NjYW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiYnRfZ2RfbmVpZ2giCi0KLSNpbmNsdWRlICJuZWlnaGJvci9zY2FuLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBuZWlnaGJvciB7Ci0KLXN0cnVjdCBTY2FuTW9kdWxlOjppbXBsIHsKLSAgaW1wbChTY2FuTW9kdWxlJiBtb2R1bGUpOwotCi0gIHZvaWQgU2V0SW5xdWlyeVNjYW4oYm9vbCBlbmFibGVkKTsKLSAgYm9vbCBJc0lucXVpcnlFbmFibGVkKCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRQYWdlU2Nhbihib29sIGVuYWJsZWQpOwotICBib29sIElzUGFnZUVuYWJsZWQoKSBjb25zdDsKLQotICB2b2lkIFN0YXJ0KCk7Ci0gIHZvaWQgU3RvcCgpOwotCi0gcHJpdmF0ZToKLSAgU2Nhbk1vZHVsZSYgbW9kdWxlXzsKLQotICBib29sIGlucXVpcnlfc2Nhbl9lbmFibGVkXzsKLSAgYm9vbCBwYWdlX3NjYW5fZW5hYmxlZF87Ci0KLSAgdm9pZCBXcml0ZVNjYW5FbmFibGUoKTsKLSAgdm9pZCBSZWFkU2NhbkVuYWJsZShoY2k6OlNjYW5FbmFibGUpOwotCi0gIHZvaWQgT25Db21tYW5kQ29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IHN0YXR1cyk7Ci0KLSAgaGNpOjpIY2lMYXllciogaGNpX2xheWVyXzsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfOwotfTsKLQotY29uc3QgTW9kdWxlRmFjdG9yeSBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6RmFjdG9yeSA9IE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgbmVpZ2hib3I6OlNjYW5Nb2R1bGUoKTsgfSk7Ci0KLW5laWdoYm9yOjpTY2FuTW9kdWxlOjppbXBsOjppbXBsKG5laWdoYm9yOjpTY2FuTW9kdWxlJiBtb2R1bGUpCi0gICAgOiBtb2R1bGVfKG1vZHVsZSksIGlucXVpcnlfc2Nhbl9lbmFibGVkXyhmYWxzZSksIHBhZ2Vfc2Nhbl9lbmFibGVkXyhmYWxzZSkge30KLQotdm9pZCBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6aW1wbDo6T25Db21tYW5kQ29tcGxldGUoaGNpOjpDb21tYW5kQ29tcGxldGVWaWV3IHZpZXcpIHsKLSAgc3dpdGNoICh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkgewotICAgIGNhc2UgaGNpOjpPcENvZGU6OlJFQURfU0NBTl9FTkFCTEU6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkU2NhbkVuYWJsZUNvbXBsZXRlVmlldzo6Q3JlYXRlKHZpZXcpOwotICAgICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgICAgQVNTRVJUKHBhY2tldC5HZXRTdGF0dXMoKSA9PSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgICBSZWFkU2NhbkVuYWJsZShwYWNrZXQuR2V0U2NhbkVuYWJsZSgpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBoY2k6Ok9wQ29kZTo6V1JJVEVfU0NBTl9FTkFCTEU6IHsKLSAgICAgIGF1dG8gcGFja2V0ID0gaGNpOjpXcml0ZVNjYW5FbmFibGVDb21wbGV0ZVZpZXc6OkNyZWF0ZSh2aWV3KTsKLSAgICAgIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICAgIEFTU0VSVChwYWNrZXQuR2V0U3RhdHVzKCkgPT0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJVbmhhbmRsZWQgY29tbWFuZCAlcyIsIGhjaTo6T3BDb2RlVGV4dCh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIG5laWdoYm9yOjpTY2FuTW9kdWxlOjppbXBsOjpXcml0ZVNjYW5FbmFibGUoKSB7Ci0gIGhjaTo6U2NhbkVuYWJsZSBzY2FuX2VuYWJsZTsKLQotICBpZiAoaW5xdWlyeV9zY2FuX2VuYWJsZWRfICYmICFwYWdlX3NjYW5fZW5hYmxlZF8pIHsKLSAgICBzY2FuX2VuYWJsZSA9IGhjaTo6U2NhbkVuYWJsZTo6SU5RVUlSWV9TQ0FOX09OTFk7Ci0gIH0gZWxzZSBpZiAoIWlucXVpcnlfc2Nhbl9lbmFibGVkXyAmJiBwYWdlX3NjYW5fZW5hYmxlZF8pIHsKLSAgICBzY2FuX2VuYWJsZSA9IGhjaTo6U2NhbkVuYWJsZTo6UEFHRV9TQ0FOX09OTFk7Ci0gIH0gZWxzZSBpZiAoaW5xdWlyeV9zY2FuX2VuYWJsZWRfICYmIHBhZ2Vfc2Nhbl9lbmFibGVkXykgewotICAgIHNjYW5fZW5hYmxlID0gaGNpOjpTY2FuRW5hYmxlOjpJTlFVSVJZX0FORF9QQUdFX1NDQU47Ci0gIH0gZWxzZSB7Ci0gICAgc2Nhbl9lbmFibGUgPSBoY2k6OlNjYW5FbmFibGU6Ok5PX1NDQU5TOwotICB9Ci0KLSAgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OldyaXRlU2NhbkVuYWJsZUJ1aWxkZXI+IHBhY2tldCA9IGhjaTo6V3JpdGVTY2FuRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKHNjYW5fZW5hYmxlKTsKLSAgICBoY2lfbGF5ZXJfLT5FbnF1ZXVlQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSwgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJmltcGw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci0gIH0KLQotICB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6UmVhZFNjYW5FbmFibGVCdWlsZGVyPiBwYWNrZXQgPSBoY2k6OlJlYWRTY2FuRW5hYmxlQnVpbGRlcjo6Q3JlYXRlKCk7Ci0gICAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotICB9Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OlNjYW5Nb2R1bGU6OmltcGw6OlJlYWRTY2FuRW5hYmxlKGhjaTo6U2NhbkVuYWJsZSBzY2FuX2VuYWJsZSkgewotICBzd2l0Y2ggKHNjYW5fZW5hYmxlKSB7Ci0gICAgY2FzZSBoY2k6OlNjYW5FbmFibGU6OklOUVVJUllfU0NBTl9PTkxZOgotICAgICAgaW5xdWlyeV9zY2FuX2VuYWJsZWRfID0gdHJ1ZTsKLSAgICAgIHBhZ2Vfc2Nhbl9lbmFibGVkXyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6U2NhbkVuYWJsZTo6UEFHRV9TQ0FOX09OTFk6Ci0gICAgICBpbnF1aXJ5X3NjYW5fZW5hYmxlZF8gPSBmYWxzZTsKLSAgICAgIHBhZ2Vfc2Nhbl9lbmFibGVkXyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaGNpOjpTY2FuRW5hYmxlOjpJTlFVSVJZX0FORF9QQUdFX1NDQU46Ci0gICAgICBpbnF1aXJ5X3NjYW5fZW5hYmxlZF8gPSB0cnVlOwotICAgICAgcGFnZV9zY2FuX2VuYWJsZWRfID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlucXVpcnlfc2Nhbl9lbmFibGVkXyA9IGZhbHNlOwotICAgICAgcGFnZV9zY2FuX2VuYWJsZWRfID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIG5laWdoYm9yOjpTY2FuTW9kdWxlOjppbXBsOjpTZXRJbnF1aXJ5U2Nhbihib29sIGVuYWJsZWQpIHsKLSAgaW5xdWlyeV9zY2FuX2VuYWJsZWRfID0gZW5hYmxlZDsKLSAgV3JpdGVTY2FuRW5hYmxlKCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OlNjYW5Nb2R1bGU6OmltcGw6OlNldFBhZ2VTY2FuKGJvb2wgZW5hYmxlZCkgewotICBwYWdlX3NjYW5fZW5hYmxlZF8gPSBlbmFibGVkOwotICBXcml0ZVNjYW5FbmFibGUoKTsKLX0KLQotYm9vbCBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6aW1wbDo6SXNJbnF1aXJ5RW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGlucXVpcnlfc2Nhbl9lbmFibGVkXzsKLX0KLQotYm9vbCBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6aW1wbDo6SXNQYWdlRW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBhZ2Vfc2Nhbl9lbmFibGVkXzsKLX0KLQotdm9pZCBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6aW1wbDo6U3RhcnQoKSB7Ci0gIGhjaV9sYXllcl8gPSBtb2R1bGVfLkdldERlcGVuZGVuY3k8aGNpOjpIY2lMYXllcj4oKTsKLSAgaGFuZGxlcl8gPSBtb2R1bGVfLkdldEhhbmRsZXIoKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpSZWFkU2NhbkVuYWJsZUJ1aWxkZXI+IHBhY2tldCA9IGhjaTo6UmVhZFNjYW5FbmFibGVCdWlsZGVyOjpDcmVhdGUoKTsKLSAgaGNpX2xheWVyXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCksIGhhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZpbXBsOjpPbkNvbW1hbmRDb21wbGV0ZSkpOwotfQotCi12b2lkIG5laWdoYm9yOjpTY2FuTW9kdWxlOjppbXBsOjpTdG9wKCkgewotICBMT0dfSU5GTygiaW5xdWlyeSBzY2FuIGVuYWJsZWQ6JWQgcGFnZSBzY2FuIGVuYWJsZWQ6JWQiLCBpbnF1aXJ5X3NjYW5fZW5hYmxlZF8sIHBhZ2Vfc2Nhbl9lbmFibGVkXyk7Ci19Ci0KLW5laWdoYm9yOjpTY2FuTW9kdWxlOjpTY2FuTW9kdWxlKCkgOiBwaW1wbF8oc3RkOjptYWtlX3VuaXF1ZTxpbXBsPigqdGhpcykpIHt9Ci0KLW5laWdoYm9yOjpTY2FuTW9kdWxlOjp+U2Nhbk1vZHVsZSgpIHsKLSAgcGltcGxfLnJlc2V0KCk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OlNjYW5Nb2R1bGU6OlNldElucXVpcnlTY2FuKCkgewotICBwaW1wbF8tPlNldElucXVpcnlTY2FuKHRydWUpOwotfQotCi12b2lkIG5laWdoYm9yOjpTY2FuTW9kdWxlOjpDbGVhcklucXVpcnlTY2FuKCkgewotICBwaW1wbF8tPlNldElucXVpcnlTY2FuKGZhbHNlKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6U2V0UGFnZVNjYW4oKSB7Ci0gIHBpbXBsXy0+U2V0UGFnZVNjYW4odHJ1ZSk7Ci19Ci0KLXZvaWQgbmVpZ2hib3I6OlNjYW5Nb2R1bGU6OkNsZWFyUGFnZVNjYW4oKSB7Ci0gIHBpbXBsXy0+U2V0UGFnZVNjYW4oZmFsc2UpOwotfQotCi1ib29sIG5laWdoYm9yOjpTY2FuTW9kdWxlOjpJc0lucXVpcnlFbmFibGVkKCkgY29uc3QgewotICByZXR1cm4gcGltcGxfLT5Jc0lucXVpcnlFbmFibGVkKCk7Ci19Ci0KLWJvb2wgbmVpZ2hib3I6OlNjYW5Nb2R1bGU6OklzUGFnZUVuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiBwaW1wbF8tPklzUGFnZUVuYWJsZWQoKTsKLX0KLQotdm9pZCBuZWlnaGJvcjo6U2Nhbk1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCB7Ci0gIGxpc3QtPmFkZDxoY2k6OkhjaUxheWVyPigpOwotfQotCi12b2lkIG5laWdoYm9yOjpTY2FuTW9kdWxlOjpTdGFydCgpIHsKLSAgcGltcGxfLT5TdGFydCgpOwotfQotCi12b2lkIG5laWdoYm9yOjpTY2FuTW9kdWxlOjpTdG9wKCkgewotICBwaW1wbF8tPlN0b3AoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9zY2FuLmggYi9nZC9uZWlnaGJvci9zY2FuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjk5YjQuLjAwMDAwMDAKLS0tIGEvZ2QvbmVpZ2hib3Ivc2Nhbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG5laWdoYm9yIHsKLQotY2xhc3MgU2Nhbk1vZHVsZSA6IHB1YmxpYyBibHVldG9vdGg6Ok1vZHVsZSB7Ci0gcHVibGljOgotICBTY2FuTW9kdWxlKCk7Ci0gIH5TY2FuTW9kdWxlKCk7Ci0KLSAgdm9pZCBTZXRJbnF1aXJ5U2NhbigpOwotICB2b2lkIENsZWFySW5xdWlyeVNjYW4oKTsKLSAgYm9vbCBJc0lucXVpcnlFbmFibGVkKCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRQYWdlU2NhbigpOwotICB2b2lkIENsZWFyUGFnZVNjYW4oKTsKLSAgYm9vbCBJc1BhZ2VFbmFibGVkKCkgY29uc3Q7Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlNjYW4iKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNjYW5Nb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9uZWlnaGJvci9zY2FuX3BhcmFtZXRlcnMuaCBiL2dkL25laWdoYm9yL3NjYW5fcGFyYW1ldGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTI3ZWUxLi4wMDAwMDAwCi0tLSBhL2dkL25laWdoYm9yL3NjYW5fcGFyYW1ldGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbmVpZ2hib3IgewotCi1zdGF0aWMgY29uc3RleHByIGRvdWJsZSBrVGltZVRpY2tNcyA9IDAuNjI1OwotCi11c2luZyBTY2FuSW50ZXJ2YWwgPSB1aW50MTZfdDsgIC8vIFJhbmdlIDB4MDAxMiB0byAweDEwMDA7IG9ubHkgZXZlbiB2YWx1ZXMgdmFsaWQgIDExLjI1IHRvIDI1NjBtcwotdXNpbmcgU2NhbldpbmRvdyA9IHVpbnQxNl90OyAgICAvLyBSYW5nZSAweDAwMTEgdG8gMHgxMDAwOyAgMTAuNjI1bXMgdG8gMjU2MG1zCi0KLWlubGluZSBkb3VibGUgU2NhbkludGVydmFsVGltZU1zKFNjYW5JbnRlcnZhbCBpbnRlcnZhbCkgewotICByZXR1cm4ga1RpbWVUaWNrTXMgKiBpbnRlcnZhbDsKLX0KLQotaW5saW5lIGRvdWJsZSBTY2FuV2luZG93VGltZU1zKFNjYW5XaW5kb3cgd2luZG93KSB7Ci0gIHJldHVybiBrVGltZVRpY2tNcyAqIHdpbmRvdzsKLX0KLQotdXNpbmcgU2NhblBhcmFtZXRlcnMgPSBzdHJ1Y3QgewotICBTY2FuSW50ZXJ2YWwgaW50ZXJ2YWw7Ci0gIFNjYW5XaW5kb3cgd2luZG93OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG5laWdoYm9yCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9BbmRyb2lkLmJwIGIvZ2Qvb3MvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0YzUwYy4uMDAwMDAwMAotLS0gYS9nZC9vcy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoT3NTb3VyY2VzX2FuZHJvaWQiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFuZHJvaWQvbWV0cmljcy5jYyIsCi0gICAgICAgICJhbmRyb2lkL3BhcmFtZXRlcl9wcm92aWRlci5jYyIsCi0gICAgICAgICJhbmRyb2lkL3N5c3RlbV9wcm9wZXJ0aWVzLmNjIiwKLSAgICAgICAgImFuZHJvaWQvd2FrZWxvY2tfbmF0aXZlLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhPc1Rlc3RTb3VyY2VzX2FuZHJvaWQiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFuZHJvaWQvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYyIsCi0gICAgICAgICJhbmRyb2lkL3dha2Vsb2NrX25hdGl2ZV90ZXN0LmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhPc1NvdXJjZXNfaG9zdCIsCi0gICAgc3JjczogWwotICAgICAgICAiaG9zdC9tZXRyaWNzLmNjIiwKLSAgICAgICAgImhvc3QvcGFyYW1ldGVyX3Byb3ZpZGVyLmNjIiwKLSAgICAgICAgImhvc3Qvc3lzdGVtX3Byb3BlcnRpZXMuY2MiLAotICAgICAgICAiaG9zdC93YWtlbG9ja19uYXRpdmUuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aE9zVGVzdFNvdXJjZXNfaG9zdCIsCi0gICAgc3JjczogWwotICAgICAgICAiaG9zdC9zeXN0ZW1fcHJvcGVydGllc190ZXN0LmNjIiwKLSAgICBdLAotfQotCi0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aE9zU291cmNlc19saW51eF9nZW5lcmljIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJsaW51eF9nZW5lcmljL2FsYXJtLmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvZmlsZXMuY2MiLAotICAgICAgICAibGludXhfZ2VuZXJpYy9oYW5kbGVyLmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvcmVhY3Rvci5jYyIsCi0gICAgICAgICJsaW51eF9nZW5lcmljL3JlcGVhdGluZ19hbGFybS5jYyIsCi0gICAgICAgICJsaW51eF9nZW5lcmljL3JlYWN0aXZlX3NlbWFwaG9yZS5jYyIsCi0gICAgICAgICJsaW51eF9nZW5lcmljL3RocmVhZC5jYyIsCi0gICAgICAgICJsaW51eF9nZW5lcmljL3dha2Vsb2NrX21hbmFnZXIuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aE9zVGVzdFNvdXJjZXNfbGludXhfZ2VuZXJpYyIsCi0gICAgc3JjczogWwotICAgICAgICAibGludXhfZ2VuZXJpYy9hbGFybV91bml0dGVzdC5jYyIsCi0gICAgICAgICJsaW51eF9nZW5lcmljL2ZpbGVzX3Rlc3QuY2MiLAotICAgICAgICAibGludXhfZ2VuZXJpYy9oYW5kbGVyX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvcXVldWVfdW5pdHRlc3QuY2MiLAotICAgICAgICAibGludXhfZ2VuZXJpYy9yZWFjdG9yX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvcmVwZWF0aW5nX2FsYXJtX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvdGhyZWFkX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImxpbnV4X2dlbmVyaWMvd2FrZWxvY2tfbWFuYWdlcl91bml0dGVzdC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLW5hbWU6ICJCbHVldG9vdGhPc0JlbmNobWFya1NvdXJjZXMiLAotICAgICBzcmNzOiBbCi0gICAgICAgICAiYWxhcm1fYmVuY2htYXJrLmNjIiwKLSAgICAgICAgICJ0aHJlYWRfYmVuY2htYXJrLmNjIiwKLSAgICAgICAgICJxdWV1ZV9iZW5jaG1hcmsuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aE9zU291cmNlc19mdXp6IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6L2Zha2VfdGltZXJmZC5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL29zL0JVSUxELmduIGIvZ2Qvb3MvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWYyYjMuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotc291cmNlX3NldCgiQmx1ZXRvb3RoT3NTb3VyY2VzX2xpbnV4IikgewotICBzb3VyY2VzID0gWwotICAgICJsaW51eC9tZXRyaWNzLmNjIiwKLSAgICAibGludXgvcGFyYW1ldGVyX3Byb3ZpZGVyLmNjIiwKLSAgICAibGludXgvc3lzdGVtX3Byb3BlcnRpZXMuY2MiLAotICAgICJsaW51eC93YWtlbG9ja19uYXRpdmUuY2MiLAotICAgICJzeXNsb2cuY2MiLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi0gIGRlcHMgPSBbICIvL2J0OmxpYmJ0LXBsYXRmb3JtLXByb3Rvcy1saXRlIiBdCi19Ci0KLXNvdXJjZV9zZXQoIkJsdWV0b290aE9zU291cmNlc19saW51eF9nZW5lcmljIikgewotICBzb3VyY2VzID0gWwotICAgICJsaW51eF9nZW5lcmljL2FsYXJtLmNjIiwKLSAgICAibGludXhfZ2VuZXJpYy9maWxlcy5jYyIsCi0gICAgImxpbnV4X2dlbmVyaWMvaGFuZGxlci5jYyIsCi0gICAgImxpbnV4X2dlbmVyaWMvcmVhY3RpdmVfc2VtYXBob3JlLmNjIiwKLSAgICAibGludXhfZ2VuZXJpYy9yZWFjdG9yLmNjIiwKLSAgICAibGludXhfZ2VuZXJpYy9yZXBlYXRpbmdfYWxhcm0uY2MiLAotICAgICJsaW51eF9nZW5lcmljL3RocmVhZC5jYyIsCi0gICAgImxpbnV4X2dlbmVyaWMvd2FrZWxvY2tfbWFuYWdlci5jYyIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdHMiIF0KLSAgZGVwcyA9IFsgIjpCbHVldG9vdGhPc1NvdXJjZXNfbGludXgiLCAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiIF0KLX0KZGlmZiAtLWdpdCBhL2dkL29zL2FsYXJtLmggYi9nZC9vcy9hbGFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzNjMzZmLi4wMDAwMDAwCi0tLSBhL2dkL29zL2FsYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zL3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotLy8gQSBzaW5nbGUtc2hvdCBhbGFybSBmb3IgcmVhY3Rvci1iYXNlZCB0aHJlYWQsIGltcGxlbWVudGVkIGJ5IExpbnV4IHRpbWVyZmQuCi0vLyBXaGVuIGl0J3MgY29uc3RydWN0ZWQsIGl0IHdpbGwgcmVnaXN0ZXIgYSByZWFjdGFibGUgb24gdGhlIHNwZWNpZmllZCB0aHJlYWQ7IHdoZW4gaXQncyBkZXN0cm95ZWQsIGl0IHdpbGwgdW5yZWdpc3RlcgotLy8gaXRzZWxmIGZyb20gdGhlIHRocmVhZC4KLWNsYXNzIEFsYXJtIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBzaW5nbGUtc2hvdCBhbGFybSBvbiBhIGdpdmVuIGhhbmRsZXIKLSAgZXhwbGljaXQgQWxhcm0oSGFuZGxlciogaGFuZGxlcik7Ci0KLSAgLy8gVW5yZWdpc3RlciB0aGlzIGFsYXJtIGZyb20gdGhlIHRocmVhZCBhbmQgcmVsZWFzZSByZXNvdXJjZQotICB+QWxhcm0oKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWxhcm0pOwotCi0gIC8vIFNjaGVkdWxlIHRoZSBhbGFybSB3aXRoIGdpdmVuIGRlbGF5Ci0gIHZvaWQgU2NoZWR1bGUoY29tbW9uOjpPbmNlQ2xvc3VyZSB0YXNrLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5KTsKLQotICAvLyBDYW5jZWwgdGhlIGFsYXJtLiBOby1vcCBpZiBpdCdzIG5vdCBhcm1lZC4KLSAgdm9pZCBDYW5jZWwoKTsKLQotIHByaXZhdGU6Ci0gIGNvbW1vbjo6T25jZUNsb3N1cmUgdGFza187Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotICBpbnQgZmRfID0gMDsKLSAgUmVhY3Rvcjo6UmVhY3RhYmxlKiB0b2tlbl87Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci0gIHZvaWQgb25fZmlyZSgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG9zCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2FsYXJtX2JlbmNobWFyay5jYyBiL2dkL29zL2FsYXJtX2JlbmNobWFyay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2YWU0ZS4uMDAwMDAwMAotLS0gYS9nZC9vcy9hbGFybV9iZW5jaG1hcmsuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0jaW5jbHVkZSAib3MvcmVwZWF0aW5nX2FsYXJtLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLXVzaW5nIDo6YmVuY2htYXJrOjpTdGF0ZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpjb21tb246OkJpbmQ7Ci11c2luZyA6OmJsdWV0b290aDo6b3M6OkFsYXJtOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpSZXBlYXRpbmdBbGFybTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpvczo6VGhyZWFkOwotCi1jbGFzcyBCTV9SZWFjdGFibGVBbGFybSA6IHB1YmxpYyA6OmJlbmNobWFyazo6Rml4dHVyZSB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIDo6YmVuY2htYXJrOjpGaXh0dXJlOjpTZXRVcChzdCk7Ci0gICAgdGhyZWFkXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGhyZWFkPigidGltZXJfYmVuY2htYXJrIiwgVGhyZWFkOjpQcmlvcml0eTo6UkVBTF9USU1FKTsKLSAgICBoYW5kbGVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8SGFuZGxlcj4odGhyZWFkXy5nZXQoKSk7Ci0gICAgYWxhcm1fID0gc3RkOjptYWtlX3VuaXF1ZTxBbGFybT4oaGFuZGxlcl8uZ2V0KCkpOwotICAgIHJlcGVhdGluZ19hbGFybV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFJlcGVhdGluZ0FsYXJtPihoYW5kbGVyXy5nZXQoKSk7Ci0gICAgbWFwXy5jbGVhcigpOwotICAgIHNjaGVkdWxlZF90YXNrc18gPSAwOwotICAgIHRhc2tfbGVuZ3RoXyA9IDA7Ci0gICAgdGFza19pbnRlcnZhbF8gPSAwOwotICAgIHRhc2tfY291bnRlcl8gPSAwOwotICAgIHByb21pc2VfID0gc3RkOjpwcm9taXNlPHZvaWQ+KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIGFsYXJtXyA9IG51bGxwdHI7Ci0gICAgcmVwZWF0aW5nX2FsYXJtXyA9IG51bGxwdHI7Ci0gICAgaGFuZGxlcl8gPSBudWxscHRyOwotICAgIHRocmVhZF8tPlN0b3AoKTsKLSAgICB0aHJlYWRfID0gbnVsbHB0cjsKLSAgICA6OmJlbmNobWFyazo6Rml4dHVyZTo6VGVhckRvd24oc3QpOwotICB9Ci0KLSAgdm9pZCBBbGFybVNsZWVwQW5kQ291bnREZWxheWVkVGltZSgpIHsKLSAgICBhdXRvIGVuZF90aW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gICAgYXV0byBkdXJhdGlvbl9zaW5jZV9zdGFydCA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGVuZF90aW1lIC0gc3RhcnRfdGltZV8pOwotICAgIHRhc2tfY291bnRlcl8rKzsKLSAgICBtYXBfW2R1cmF0aW9uX3NpbmNlX3N0YXJ0LmNvdW50KCkgLSB0YXNrX2NvdW50ZXJfICogdGFza19pbnRlcnZhbF9dKys7Ci0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGFza19sZW5ndGhfKSk7Ci0gICAgaWYgKHRhc2tfY291bnRlcl8gPj0gc2NoZWR1bGVkX3Rhc2tzXykgewotICAgICAgcHJvbWlzZV8uc2V0X3ZhbHVlKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBUaW1lckZpcmUoKSB7Ci0gICAgcHJvbWlzZV8uc2V0X3ZhbHVlKCk7Ci0gIH0KLQotICBpbnQ2NF90IHNjaGVkdWxlZF90YXNrc187Ci0gIGludDY0X3QgdGFza19sZW5ndGhfOwotICBpbnQ2NF90IHRhc2tfaW50ZXJ2YWxfOwotICBpbnQgdGFza19jb3VudGVyXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgaW50PiBtYXBfOwotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZV87Ci0gIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+IHN0YXJ0X3RpbWVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8VGhyZWFkPiB0aHJlYWRfOwotICBzdGQ6OnVuaXF1ZV9wdHI8SGFuZGxlcj4gaGFuZGxlcl87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBbGFybT4gYWxhcm1fOwotICBzdGQ6OnVuaXF1ZV9wdHI8UmVwZWF0aW5nQWxhcm0+IHJlcGVhdGluZ19hbGFybV87Ci19OwotCi1CRU5DSE1BUktfREVGSU5FX0YoQk1fUmVhY3RhYmxlQWxhcm0sIHRpbWVyX3BlcmZvcm1hbmNlX21zKShTdGF0ZSYgc3RhdGUpIHsKLSAgYXV0byBtaWxsaXNlY29uZHMgPSBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRlLnJhbmdlKDApKTsKLSAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgewotICAgIGF1dG8gc3RhcnRfdGltZV9wb2ludCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgIGFsYXJtXy0+U2NoZWR1bGUoCi0gICAgICAgIEJpbmQoJkJNX1JlYWN0YWJsZUFsYXJtX3RpbWVyX3BlcmZvcm1hbmNlX21zX0JlbmNobWFyazo6VGltZXJGaXJlLCBibHVldG9vdGg6OmNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzKSk7Ci0gICAgcHJvbWlzZV8uZ2V0X2Z1dHVyZSgpLmdldCgpOwotICAgIGF1dG8gZW5kX3RpbWVfcG9pbnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICBhdXRvIGR1cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPihlbmRfdGltZV9wb2ludCAtIHN0YXJ0X3RpbWVfcG9pbnQpOwotICAgIHN0YXRlLlNldEl0ZXJhdGlvblRpbWUoc3RhdGljX2Nhc3Q8ZG91YmxlPihkdXJhdGlvbi5jb3VudCgpKSAqIDFlLTYpOwotICAgIGFsYXJtXy0+Q2FuY2VsKCk7Ci0gIH0KLX07Ci0KLUJFTkNITUFSS19SRUdJU1RFUl9GKEJNX1JlYWN0YWJsZUFsYXJtLCB0aW1lcl9wZXJmb3JtYW5jZV9tcykKLSAgICAtPkFyZygxKQotICAgIC0+QXJnKDUpCi0gICAgLT5BcmcoMTApCi0gICAgLT5BcmcoMjApCi0gICAgLT5BcmcoMTAwKQotICAgIC0+QXJnKDEwMDApCi0gICAgLT5BcmcoMjAwMCkKLSAgICAtPkl0ZXJhdGlvbnMoMSkKLSAgICAtPlVzZVJlYWxUaW1lKCk7Ci0KLUJFTkNITUFSS19ERUZJTkVfRihCTV9SZWFjdGFibGVBbGFybSwgcGVyaW9kaWNfYWNjdXJhY3kpKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgc2NoZWR1bGVkX3Rhc2tzXyA9IHN0YXRlLnJhbmdlKDApOwotICAgIHRhc2tfbGVuZ3RoXyA9IHN0YXRlLnJhbmdlKDEpOwotICAgIHRhc2tfaW50ZXJ2YWxfID0gc3RhdGUucmFuZ2UoMik7Ci0gICAgc3RhcnRfdGltZV8gPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICByZXBlYXRpbmdfYWxhcm1fLT5TY2hlZHVsZSgKLSAgICAgICAgQmluZCgKLSAgICAgICAgICAgICZCTV9SZWFjdGFibGVBbGFybV9wZXJpb2RpY19hY2N1cmFjeV9CZW5jaG1hcms6OkFsYXJtU2xlZXBBbmRDb3VudERlbGF5ZWRUaW1lLAotICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRhc2tfaW50ZXJ2YWxfKSk7Ci0gICAgcHJvbWlzZV8uZ2V0X2Z1dHVyZSgpLmdldCgpOwotICAgIHJlcGVhdGluZ19hbGFybV8tPkNhbmNlbCgpOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgZGVsYXkgOiBtYXBfKSB7Ci0gICAgc3RhdGUuY291bnRlcnNbc3RkOjp0b19zdHJpbmcoZGVsYXkuZmlyc3QpXSA9IGRlbGF5LnNlY29uZDsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQk1fUmVhY3RhYmxlQWxhcm0sIHBlcmlvZGljX2FjY3VyYWN5KQotICAgIC0+QXJncyh7MjAwMCwgMSwgNX0pCi0gICAgLT5BcmdzKHsyMDAwLCAzLCA1fSkKLSAgICAtPkFyZ3MoezIwMDAsIDEsIDd9KQotICAgIC0+QXJncyh7MjAwMCwgMywgN30pCi0gICAgLT5BcmdzKHsyMDAwLCAxLCAyMH0pCi0gICAgLT5BcmdzKHsyMDAwLCA1LCAyMH0pCi0gICAgLT5BcmdzKHsyMDAwLCAxMCwgMjB9KQotICAgIC0+QXJncyh7MjAwMCwgMTUsIDIwfSkKLSAgICAtPkl0ZXJhdGlvbnMoMSkKLSAgICAtPlVzZVJlYWxUaW1lKCk7CmRpZmYgLS1naXQgYS9nZC9vcy9hbmRyb2lkL21ldHJpY3MuY2MgYi9nZC9vcy9hbmRyb2lkL21ldHJpY3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMWU4MGUuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvYW5kcm9pZC9tZXRyaWNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJCbHVldG9vdGhNZXRyaWNzIgotCi0jaW5jbHVkZSAib3MvbWV0cmljcy5oIgotCi0jaW5jbHVkZSA8c3RhdHNsb2dfYnQuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNfaWRfbWFuYWdlci5oIgotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2Ugb3MgewotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRNYW5hZ2VyOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci0KLS8qKgotICogbnVsbHB0ciBhbmQgc2l6ZSAwIHJlcHJlc2VudCBtaXNzaW5nIHZhbHVlIGZvciBvYmZ1c2NhdGVkX2lkCi0gKi8KLXN0YXRpYyBjb25zdCBCeXRlc0ZpZWxkIGJ5dGVGaWVsZChudWxscHRyLCAwKTsKLQotdm9pZCBMb2dNZXRyaWNMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyogYWRkcmVzcywKLSAgICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgIHVpbnQxNl90IGxpbmtfdHlwZSwKLSAgICB1aW50MzJfdCBoY2lfY21kLAotICAgIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICB1aW50MTZfdCBoY2lfYmxlX2V2ZW50LAotICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0gICAgdWludDE2X3QgcmVhc29uX2NvZGUpIHsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmIChhZGRyZXNzICE9IG51bGxwdHIpIHsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZCgqYWRkcmVzcyk7Ci0gIH0KLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX0xJTktfTEFZRVJfQ09OTkVDVElPTl9FVkVOVCwKLSAgICAgIGJ5dGVGaWVsZCwKLSAgICAgIGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgZGlyZWN0aW9uLAotICAgICAgbGlua190eXBlLAotICAgICAgaGNpX2NtZCwKLSAgICAgIGhjaV9ldmVudCwKLSAgICAgIGhjaV9ibGVfZXZlbnQsCi0gICAgICBjbWRfc3RhdHVzLAotICAgICAgcmVhc29uX2NvZGUsCi0gICAgICBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiRmFpbGVkIHRvIGxvZyBzdGF0dXMgJXMgLCByZWFzb24gJXMsIGZyb20gY21kICVzLCBldmVudCAlcywgIGJsZV9ldmVudCAlcywgZm9yICVzLCBoYW5kbGUgJWQsIHR5cGUgJXMsICIKLSAgICAgICAgImVycm9yICVkIiwKLSAgICAgICAgY29tbW9uOjpUb0hleFN0cmluZyhjbWRfc3RhdHVzKS5jX3N0cigpLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKHJlYXNvbl9jb2RlKS5jX3N0cigpLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKGhjaV9jbWQpLmNfc3RyKCksCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcoaGNpX2V2ZW50KS5jX3N0cigpLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKGhjaV9ibGVfZXZlbnQpLmNfc3RyKCksCi0gICAgICAgIGFkZHJlc3MgPyBhZGRyZXNzLT5Ub1N0cmluZygpLmNfc3RyKCkgOiAiKE5VTEwpIiwKLSAgICAgICAgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcobGlua190eXBlKS5jX3N0cigpLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLXZvaWQgTG9nTWV0cmljSGNpVGltZW91dEV2ZW50KHVpbnQzMl90IGhjaV9jbWQpIHsKLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKEJMVUVUT09USF9IQ0lfVElNRU9VVF9SRVBPUlRFRCwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGNpX2NtZCkpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPR19XQVJOKCJGYWlsZWQgZm9yIG9wY29kZSAlcywgZXJyb3IgJWQiLCBjb21tb246OlRvSGV4U3RyaW5nKGhjaV9jbWQpLmNfc3RyKCksIHJldCk7Ci0gIH0KLX0KLQotdm9pZCBMb2dNZXRyaWNSZW1vdGVWZXJzaW9uSW5mbygKLSAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IHZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJ2ZXJzaW9uKSB7Ci0gIGludCByZXQgPSBzdGF0c193cml0ZShCTFVFVE9PVEhfUkVNT1RFX1ZFUlNJT05fSU5GT19SRVBPUlRFRCwgaGFuZGxlLCBzdGF0dXMsIHZlcnNpb24sIG1hbnVmYWN0dXJlcl9uYW1lLCBzdWJ2ZXJzaW9uKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkZhaWxlZCBmb3IgaGFuZGxlICVkLCBzdGF0dXMgJXMsIHZlcnNpb24gJXMsIG1hbnVmYWN0dXJlcl9uYW1lICVzLCBzdWJ2ZXJzaW9uICVzLCBlcnJvciAlZCIsCi0gICAgICAgIGhhbmRsZSwKLSAgICAgICAgY29tbW9uOjpUb0hleFN0cmluZyhzdGF0dXMpLmNfc3RyKCksCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcodmVyc2lvbikuY19zdHIoKSwKLSAgICAgICAgY29tbW9uOjpUb0hleFN0cmluZyhtYW51ZmFjdHVyZXJfbmFtZSkuY19zdHIoKSwKLSAgICAgICAgY29tbW9uOjpUb0hleFN0cmluZyhzdWJ2ZXJzaW9uKS5jX3N0cigpLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLXZvaWQgTG9nTWV0cmljQTJkcEF1ZGlvVW5kZXJydW5FdmVudCgKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsIGludCBudW1fbWlzc2luZ19wY21fYnl0ZXMpIHsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmICghYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZChhZGRyZXNzKTsKLSAgfQotICBpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX25hbm9zID0gZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzICogMTAwMDAwMDsKLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX0EyRFBfQVVESU9fVU5ERVJSVU5fUkVQT1JURUQsIGJ5dGVGaWVsZCwgZW5jb2RpbmdfaW50ZXJ2YWxfbmFub3MsIG51bV9taXNzaW5nX3BjbV9ieXRlcywgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkZhaWxlZCBmb3IgJXMsIGVuY29kaW5nX2ludGVydmFsX25hbm9zICVzLCBudW1fbWlzc2luZ19wY21fYnl0ZXMgJWQsIGVycm9yICVkIiwKLSAgICAgICAgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgIHN0ZDo6dG9fc3RyaW5nKGVuY29kaW5nX2ludGVydmFsX25hbm9zKS5jX3N0cigpLAotICAgICAgICBudW1fbWlzc2luZ19wY21fYnl0ZXMsCi0gICAgICAgIHJldCk7Ci0gIH0KLX0KLQotdm9pZCBMb2dNZXRyaWNBMmRwQXVkaW9PdmVycnVuRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKSB7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLQotICBpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX25hbm9zID0gZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzICogMTAwMDAwMDsKLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX0EyRFBfQVVESU9fT1ZFUlJVTl9SRVBPUlRFRCwKLSAgICAgIGJ5dGVGaWVsZCwKLSAgICAgIGVuY29kaW5nX2ludGVydmFsX25hbm9zLAotICAgICAgbnVtX2Ryb3BwZWRfYnVmZmVycywKLSAgICAgIG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcywKLSAgICAgIG1ldHJpY19pZCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJGYWlsZWQgdG8gbG9nIGZvciAlcywgZW5jb2RpbmdfaW50ZXJ2YWxfbmFub3MgJXMsIG51bV9kcm9wcGVkX2J1ZmZlcnMgJWQsICIKLSAgICAgICAgIm51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzICVkLCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzICVkLCBlcnJvciAlZCIsCi0gICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICBzdGQ6OnRvX3N0cmluZyhlbmNvZGluZ19pbnRlcnZhbF9uYW5vcykuY19zdHIoKSwKLSAgICAgICAgbnVtX2Ryb3BwZWRfYnVmZmVycywKLSAgICAgICAgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsCi0gICAgICAgIG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMsCi0gICAgICAgIHJldCk7Ci0gIH0KLX0KLQotdm9pZCBMb2dNZXRyaWNBMmRwUGxheWJhY2tFdmVudChjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsIGludCBhdWRpb19jb2RpbmdfbW9kZSkgewotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0KLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKEJMVUVUT09USF9BMkRQX1BMQVlCQUNLX1NUQVRFX0NIQU5HRUQsIGJ5dGVGaWVsZCwgcGxheWJhY2tfc3RhdGUsIGF1ZGlvX2NvZGluZ19tb2RlLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiRmFpbGVkIHRvIGxvZyBmb3IgJXMsIHBsYXliYWNrX3N0YXRlICVkLCBhdWRpb19jb2RpbmdfbW9kZSAlZCxlcnJvciAlZCIsCi0gICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICBwbGF5YmFja19zdGF0ZSwKLSAgICAgICAgYXVkaW9fY29kaW5nX21vZGUsCi0gICAgICAgIHJldCk7Ci0gIH0KLX0KLQotdm9pZCBMb2dNZXRyaWNSZWFkUnNzaVJlc3VsdChjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGNtZF9zdGF0dXMsIGludDhfdCByc3NpKSB7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKEJMVUVUT09USF9ERVZJQ0VfUlNTSV9SRVBPUlRFRCwgYnl0ZUZpZWxkLCBoYW5kbGUsIGNtZF9zdGF0dXMsIHJzc2ksIG1ldHJpY19pZCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJGYWlsZWQgZm9yICVzLCBoYW5kbGUgJWQsIHN0YXR1cyAlcywgcnNzaSAlZCBkQm0sIGVycm9yICVkIiwKLSAgICAgICAgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgIGhhbmRsZSwKLSAgICAgICAgY29tbW9uOjpUb0hleFN0cmluZyhjbWRfc3RhdHVzKS5jX3N0cigpLAotICAgICAgICByc3NpLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLXZvaWQgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywgaW50MzJfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSB7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX0RFVklDRV9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX1JFUE9SVEVELAotICAgICAgYnl0ZUZpZWxkLAotICAgICAgaGFuZGxlLAotICAgICAgY21kX3N0YXR1cywKLSAgICAgIGZhaWxlZF9jb250YWN0X2NvdW50ZXIsCi0gICAgICBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiRmFpbGVkIGZvciAlcywgaGFuZGxlICVkLCBzdGF0dXMgJXMsIGZhaWxlZF9jb250YWN0X2NvdW50ZXIgJWQgcGFja2V0cywgZXJyb3IgJWQiLAotICAgICAgICBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgaGFuZGxlLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKGNtZF9zdGF0dXMpLmNfc3RyKCksCi0gICAgICAgIGZhaWxlZF9jb250YWN0X2NvdW50ZXIsCi0gICAgICAgIHJldCk7Ci0gIH0KLX0KLQotdm9pZCBMb2dNZXRyaWNSZWFkVHhQb3dlckxldmVsUmVzdWx0KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywgaW50MzJfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCkgewotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIGludCByZXQgPSBzdGF0c193cml0ZSgKLSAgICAgIEJMVUVUT09USF9ERVZJQ0VfVFhfUE9XRVJfTEVWRUxfUkVQT1JURUQsIGJ5dGVGaWVsZCwgaGFuZGxlLCBjbWRfc3RhdHVzLCB0cmFuc21pdF9wb3dlcl9sZXZlbCwgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkZhaWxlZCBmb3IgJXMsIGhhbmRsZSAlZCwgc3RhdHVzICVzLCB0cmFuc21pdF9wb3dlcl9sZXZlbCAlZCBwYWNrZXRzLCBlcnJvciAlZCIsCi0gICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICBoYW5kbGUsCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcoY21kX3N0YXR1cykuY19zdHIoKSwKLSAgICAgICAgdHJhbnNtaXRfcG93ZXJfbGV2ZWwsCi0gICAgICAgIHJldCk7Ci0gIH0KLX0KLQotdm9pZCBMb2dNZXRyaWNTbXBQYWlyaW5nRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzbXBfY21kLCBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50OF90IHNtcF9mYWlsX3JlYXNvbikgewotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIGludCByZXQgPQotICAgICAgc3RhdHNfd3JpdGUoQkxVRVRPT1RIX1NNUF9QQUlSSU5HX0VWRU5UX1JFUE9SVEVELCBieXRlRmllbGQsIHNtcF9jbWQsIGRpcmVjdGlvbiwgc21wX2ZhaWxfcmVhc29uLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiRmFpbGVkIGZvciAlcywgc21wX2NtZCAlcywgZGlyZWN0aW9uICVkLCBzbXBfZmFpbF9yZWFzb24gJXMsIGVycm9yICVkIiwKLSAgICAgICAgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcoc21wX2NtZCkuY19zdHIoKSwKLSAgICAgICAgZGlyZWN0aW9uLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKHNtcF9mYWlsX3JlYXNvbikuY19zdHIoKSwKLSAgICAgICAgcmV0KTsKLSAgfQotfQotCi12b2lkIExvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwKLSAgICB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgdWludDE2X3QgY21kX3N0YXR1cywKLSAgICB1aW50MTZfdCByZWFzb25fY29kZSwKLSAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX0NMQVNTSUNfUEFJUklOR19FVkVOVF9SRVBPUlRFRCwKLSAgICAgIGJ5dGVGaWVsZCwKLSAgICAgIGhhbmRsZSwKLSAgICAgIGhjaV9jbWQsCi0gICAgICBoY2lfZXZlbnQsCi0gICAgICBjbWRfc3RhdHVzLAotICAgICAgcmVhc29uX2NvZGUsCi0gICAgICBldmVudF92YWx1ZSwKLSAgICAgIG1ldHJpY19pZCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJGYWlsZWQgZm9yICVzLCBoYW5kbGUgJWQsIGhjaV9jbWQgJXMsIGhjaV9ldmVudCAlcywgY21kX3N0YXR1cyAlcywgIgotICAgICAgICAicmVhc29uICVzLCBldmVudF92YWx1ZSAlcywgZXJyb3IgJWQiLAotICAgICAgICBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgaGFuZGxlLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKGhjaV9jbWQpLmNfc3RyKCksCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcoaGNpX2V2ZW50KS5jX3N0cigpLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKGNtZF9zdGF0dXMpLmNfc3RyKCksCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcocmVhc29uX2NvZGUpLmNfc3RyKCksCi0gICAgICAgIHN0ZDo6dG9fc3RyaW5nKGV2ZW50X3ZhbHVlKS5jX3N0cigpLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLXZvaWQgTG9nTWV0cmljU2RwQXR0cmlidXRlKAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsCi0gICAgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsCi0gICAgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLAotICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkgewotICBpbnQgbWV0cmljX2lkID0gMDsKLSAgaWYgKCFhZGRyZXNzLklzRW1wdHkoKSkgewotICAgIG1ldHJpY19pZCA9IE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKGFkZHJlc3MpOwotICB9Ci0gIEJ5dGVzRmllbGQgYXR0cmlidXRlX2ZpZWxkKGF0dHJpYnV0ZV92YWx1ZSwgYXR0cmlidXRlX3NpemUpOwotICBpbnQgcmV0ID0KLSAgICAgIHN0YXRzX3dyaXRlKEJMVUVUT09USF9TRFBfQVRUUklCVVRFX1JFUE9SVEVELCBieXRlRmllbGQsIHByb3RvY29sX3V1aWQsIGF0dHJpYnV0ZV9pZCwgYXR0cmlidXRlX2ZpZWxkLCBtZXRyaWNfaWQpOwotICBpZiAocmV0IDwgMCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiRmFpbGVkIGZvciAlcywgcHJvdG9jb2xfdXVpZCAlcywgYXR0cmlidXRlX2lkICVzLCBlcnJvciAlZCIsCi0gICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKHByb3RvY29sX3V1aWQpLmNfc3RyKCksCi0gICAgICAgIGNvbW1vbjo6VG9IZXhTdHJpbmcoYXR0cmlidXRlX2lkKS5jX3N0cigpLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLXZvaWQgTG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlKAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsCi0gICAgaW50IHBvcnQsCi0gICAgaW50IHR5cGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgaW50NjRfdCB0eF9ieXRlcywKLSAgICBpbnQ2NF90IHJ4X2J5dGVzLAotICAgIGludCB1aWQsCi0gICAgaW50IHNlcnZlcl9wb3J0LAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Um9sZUVudW0gc29ja2V0X3JvbGUpIHsKLSAgaW50IG1ldHJpY19pZCA9IDA7Ci0gIGlmICghYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBtZXRyaWNfaWQgPSBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCkuQWxsb2NhdGVJZChhZGRyZXNzKTsKLSAgfQotICBpbnQgcmV0ID0gc3RhdHNfd3JpdGUoCi0gICAgICBCTFVFVE9PVEhfU09DS0VUX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwKLSAgICAgIGJ5dGVGaWVsZCwKLSAgICAgIHBvcnQsCi0gICAgICB0eXBlLAotICAgICAgY29ubmVjdGlvbl9zdGF0ZSwKLSAgICAgIHR4X2J5dGVzLAotICAgICAgcnhfYnl0ZXMsCi0gICAgICB1aWQsCi0gICAgICBzZXJ2ZXJfcG9ydCwKLSAgICAgIHNvY2tldF9yb2xlLAotICAgICAgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkZhaWxlZCBmb3IgJXMsIHBvcnQgJWQsIHR5cGUgJWQsIHN0YXRlICVkLCB0eF9ieXRlcyAlcywgcnhfYnl0ZXMgJXMsIHVpZCAlZCwgc2VydmVyX3BvcnQgJWQsICIKLSAgICAgICAgInNvY2tldF9yb2xlICVkLCBlcnJvciAlZCIsCi0gICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICBwb3J0LAotICAgICAgICB0eXBlLAotICAgICAgICBjb25uZWN0aW9uX3N0YXRlLAotICAgICAgICBzdGQ6OnRvX3N0cmluZyh0eF9ieXRlcykuY19zdHIoKSwKLSAgICAgICAgc3RkOjp0b19zdHJpbmcocnhfYnl0ZXMpLmNfc3RyKCksCi0gICAgICAgIHVpZCwKLSAgICAgICAgc2VydmVyX3BvcnQsCi0gICAgICAgIHNvY2tldF9yb2xlLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLXZvaWQgTG9nTWV0cmljTWFudWZhY3R1cmVySW5mbygKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7Ci0gIGludCBtZXRyaWNfaWQgPSAwOwotICBpZiAoIWFkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgbWV0cmljX2lkID0gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci0gIH0KLSAgaW50IHJldCA9IHN0YXRzX3dyaXRlKAotICAgICAgQkxVRVRPT1RIX0RFVklDRV9JTkZPX1JFUE9SVEVELAotICAgICAgYnl0ZUZpZWxkLAotICAgICAgc291cmNlX3R5cGUsCi0gICAgICBzb3VyY2VfbmFtZS5jX3N0cigpLAotICAgICAgbWFudWZhY3R1cmVyLmNfc3RyKCksCi0gICAgICBtb2RlbC5jX3N0cigpLAotICAgICAgaGFyZHdhcmVfdmVyc2lvbi5jX3N0cigpLAotICAgICAgc29mdHdhcmVfdmVyc2lvbi5jX3N0cigpLAotICAgICAgbWV0cmljX2lkKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkZhaWxlZCBmb3IgJXMsIHNvdXJjZV90eXBlICVkLCBzb3VyY2VfbmFtZSAlcywgbWFudWZhY3R1cmVyICVzLCBtb2RlbCAlcywgaGFyZHdhcmVfdmVyc2lvbiAlcywgIgotICAgICAgICAic29mdHdhcmVfdmVyc2lvbiAlcywgZXJyb3IgJWQiLAotICAgICAgICBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgc291cmNlX3R5cGUsCi0gICAgICAgIHNvdXJjZV9uYW1lLmNfc3RyKCksCi0gICAgICAgIG1hbnVmYWN0dXJlci5jX3N0cigpLAotICAgICAgICBtb2RlbC5jX3N0cigpLAotICAgICAgICBoYXJkd2FyZV92ZXJzaW9uLmNfc3RyKCksCi0gICAgICAgIHNvZnR3YXJlX3ZlcnNpb24uY19zdHIoKSwKLSAgICAgICAgcmV0KTsKLSAgfQotfQotCi12b2lkIExvZ01ldHJpY0JsdWV0b290aEhhbENyYXNoUmVhc29uKAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsCi0gICAgdWludDMyX3QgZXJyb3JfY29kZSwKLSAgICB1aW50MzJfdCB2ZW5kb3JfZXJyb3JfY29kZSkgewotICBpbnQgcmV0ID0KLSAgICAgIHN0YXRzX3dyaXRlKEJMVUVUT09USF9IQUxfQ1JBU0hfUkVBU09OX1JFUE9SVEVELCAwIC8qIG1ldHJpY19pZCAqLywgYnl0ZUZpZWxkLCBlcnJvcl9jb2RlLCB2ZW5kb3JfZXJyb3JfY29kZSk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJGYWlsZWQgZm9yICVzLCBlcnJvcl9jb2RlICVzLCB2ZW5kb3JfZXJyb3JfY29kZSAlcywgZXJyb3IgJWQiLAotICAgICAgICBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgY29tbW9uOjpUb0hleFN0cmluZyhlcnJvcl9jb2RlKS5jX3N0cigpLAotICAgICAgICBjb21tb246OlRvSGV4U3RyaW5nKHZlbmRvcl9lcnJvcl9jb2RlKS5jX3N0cigpLAotICAgICAgICByZXQpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvYW5kcm9pZC9wYXJhbWV0ZXJfcHJvdmlkZXIuY2MgYi9nZC9vcy9hbmRyb2lkL3BhcmFtZXRlcl9wcm92aWRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3ODA2Ny4uMDAwMDAwMAotLS0gYS9nZC9vcy9hbmRyb2lkL3BhcmFtZXRlcl9wcm92aWRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1uYW1lc3BhY2Ugewotc3RkOjptdXRleCBwYXJhbWV0ZXJfbXV0ZXg7Ci1zdGQ6OnN0cmluZyBjb25maWdfZmlsZV9wYXRoOwotc3RkOjpzdHJpbmcgc25vb3BfbG9nX2ZpbGVfcGF0aDsKLXN0ZDo6c3RyaW5nIHNub296X2xvZ19maWxlX3BhdGg7Ci1ibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBidF9rZXlzdG9yZV9pbnRlcmZhY2UgPSBudWxscHRyOwotYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSA9IGZhbHNlOwotaW50IGNvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQgPSAwYjExOwotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIE9uIEFuZHJvaWQgd2UgYWx3YXlzIHdyaXRlIGEgc2luZ2xlIGRlZmF1bHQgbG9jYXRpb24KLXN0ZDo6c3RyaW5nIFBhcmFtZXRlclByb3ZpZGVyOjpDb25maWdGaWxlUGF0aCgpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gICAgaWYgKCFjb25maWdfZmlsZV9wYXRoLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBjb25maWdfZmlsZV9wYXRoOwotICAgIH0KLSAgfQotICByZXR1cm4gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIjsKLX0KLQotdm9pZCBQYXJhbWV0ZXJQcm92aWRlcjo6T3ZlcnJpZGVDb25maWdGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICBjb25maWdfZmlsZV9wYXRoID0gcGF0aDsKLX0KLQotc3RkOjpzdHJpbmcgUGFyYW1ldGVyUHJvdmlkZXI6OlNub29wTG9nRmlsZVBhdGgoKSB7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICAgIGlmICghc25vb3BfbG9nX2ZpbGVfcGF0aC5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gc25vb3BfbG9nX2ZpbGVfcGF0aDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuICIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyI7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6Ok92ZXJyaWRlU25vb3BMb2dGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICBzbm9vcF9sb2dfZmlsZV9wYXRoID0gcGF0aDsKLX0KLQotLy8gUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBkZWZhdWx0IHNub296IGxvZyBmaWxlIGxvY2F0aW9uCi1zdGQ6OnN0cmluZyBQYXJhbWV0ZXJQcm92aWRlcjo6U25vb3pMb2dGaWxlUGF0aCgpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gICAgaWYgKCFzbm9vel9sb2dfZmlsZV9wYXRoLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBzbm9vel9sb2dfZmlsZV9wYXRoOwotICAgIH0KLSAgfQotICByZXR1cm4gIi9kYXRhL21pc2MvYmx1ZXRvb3RoL2xvZ3MvYnRzbm9vel9oY2kubG9nIjsKLX0KLQotdm9pZCBQYXJhbWV0ZXJQcm92aWRlcjo6T3ZlcnJpZGVTbm9vekxvZ0ZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gIHNub296X2xvZ19maWxlX3BhdGggPSBwYXRoOwotfQotCi1ibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socGFyYW1ldGVyX211dGV4KTsKLSAgcmV0dXJuIGJ0X2tleXN0b3JlX2ludGVyZmFjZTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJQcm92aWRlcjo6U2V0QnRLZXlzdG9yZUludGVyZmFjZShibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBidF9rZXlzdG9yZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICBidF9rZXlzdG9yZV9pbnRlcmZhY2UgPSBidF9rZXlzdG9yZTsKLX0KLQotYm9vbCBQYXJhbWV0ZXJQcm92aWRlcjo6SXNDb21tb25Dcml0ZXJpYU1vZGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gIHJldHVybiAoZ2V0dWlkKCkgPT0gQUlEX0JMVUVUT09USCkgJiYgaXNfY29tbW9uX2NyaXRlcmlhX21vZGU7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6OlNldENvbW1vbkNyaXRlcmlhTW9kZShib29sIGVuYWJsZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICBpc19jb21tb25fY3JpdGVyaWFfbW9kZSA9IGVuYWJsZTsKLX0KLQotaW50IFBhcmFtZXRlclByb3ZpZGVyOjpHZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gIHJldHVybiBjb21tb25fY3JpdGVyaWFfY29uZmlnX2NvbXBhcmVfcmVzdWx0OwotfQotCi12b2lkIFBhcmFtZXRlclByb3ZpZGVyOjpTZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoaW50IHJlc3VsdCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICBjb21tb25fY3JpdGVyaWFfY29uZmlnX2NvbXBhcmVfcmVzdWx0ID0gcmVzdWx0OwotfQotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9vcy9hbmRyb2lkL3N5c3RlbV9wcm9wZXJ0aWVzLmNjIGIvZ2Qvb3MvYW5kcm9pZC9zeXN0ZW1fcHJvcGVydGllcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjYTZhYS4uMDAwMDAwMAotLS0gYS9nZC9vcy9hbmRyb2lkL3N5c3RlbV9wcm9wZXJ0aWVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJvcy9zeXN0ZW1fcHJvcGVydGllcy5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gR2V0U3lzdGVtUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSB7Ci0gIHN0ZDo6YXJyYXk8Y2hhciwgUFJPUEVSVFlfVkFMVUVfTUFYPiB2YWx1ZV9hcnJheXswfTsKLSAgYXV0byB2YWx1ZV9sZW4gPSBwcm9wZXJ0eV9nZXQocHJvcGVydHkuY19zdHIoKSwgdmFsdWVfYXJyYXkuZGF0YSgpLCBudWxscHRyKTsKLSAgaWYgKHZhbHVlX2xlbiA8PSAwKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICByZXR1cm4gc3RkOjpzdHJpbmcodmFsdWVfYXJyYXkuZGF0YSgpLCB2YWx1ZV9sZW4pOwotfQotCi1ib29sIFNldFN5c3RlbVByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZS5zaXplKCkgPj0gUFJPUEVSVFlfVkFMVUVfTUFYKSB7Ci0gICAgTE9HX0VSUk9SKCJQcm9wZXJ0eSB2YWx1ZSdzIG1heGltdW0gc2l6ZSBpcyAlZCwgYnV0ICV6dSBjaGFycyB3ZXJlIGdpdmVuIiwgUFJPUEVSVFlfVkFMVUVfTUFYIC0gMSwgdmFsdWUuc2l6ZSgpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byByZXQgPSBwcm9wZXJ0eV9zZXQocHJvcGVydHkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7Ci0gIGlmIChyZXQgIT0gMCkgewotICAgIExPR19FUlJPUigiU2V0IHByb3BlcnR5ICVzIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLCBwcm9wZXJ0eS5jX3N0cigpLCByZXQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJc1Jvb3RDYW5hbEVuYWJsZWQoKSB7Ci0gIGF1dG8gdmFsdWUgPSBHZXRTeXN0ZW1Qcm9wZXJ0eSgicm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50Iik7Ci0gIGlmICh2YWx1ZS5oYXNfdmFsdWUoKSkgewotICAgIExPR19JTkZPKCJyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQ9JyVzJywgbGVuZ3RoPSV6dSIsIHZhbHVlLT5jX3N0cigpLCB2YWx1ZS0+bGVuZ3RoKCkpOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQgaXMgbm90IGZvdW5kIik7Ci0gIH0KLSAgLy8gYW9zcF9jZl94ODZfNjRfcGhvbmUgaXMganVzdCBvbmUgcGxhdGZvcm0gdGhhdCBjdXJyZW50bHkgcnVucyByb290IGNhbmFsCi0gIC8vIFdoZW4gb3RoZXIgcGxhdGZvcm1zIGFwcGVhcnMsIG9yIHRoZXJlIGlzIGEgYmV0dGVyIHNpZ25hbCwgYWRkIHRoZW0gaGVyZQotICBpZiAodmFsdWUtPmZpbmQoImdlbmVyaWMvYW9zcF9jZl94ODZfNjRfcGhvbmUiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIExPR19JTkZPKCJOb3Qgb24gZ2VuZXJpYy9hb3NwX2NmX3g4Nl82NF9waG9uZSBhbmQgaGVuY2Ugbm90IHJvb3QgY2FuYWwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBHZXRBbmRyb2lkVmVuZG9yUmVsZWFzZVZlcnNpb24oKSB7Ci0gIGF1dG8gdmFsdWUgPSBHZXRTeXN0ZW1Qcm9wZXJ0eSgicm8udmVuZG9yLmJ1aWxkLnZlcnNpb24ucmVsZWFzZV9vcl9jb2RlbmFtZSIpOwotICBpZiAoIXZhbHVlKSB7Ci0gICAgTE9HX0lORk8oInJvLnZlbmRvci5idWlsZC52ZXJzaW9uLnJlbGVhc2Vfb3JfY29kZW5hbWUgZG9lcyBub3QgZXhpc3QiKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBMT0dfSU5GTygicm8udmVuZG9yLmJ1aWxkLnZlcnNpb24ucmVsZWFzZV9vcl9jb2RlbmFtZT0nJXMnLCBsZW5ndGg9JXp1IiwgdmFsdWUtPmNfc3RyKCksIHZhbHVlLT5sZW5ndGgoKSk7Ci0gIGF1dG8gaW50X3ZhbHVlID0gY29tbW9uOjpJbnQ2NEZyb21TdHJpbmcoKnZhbHVlKTsKLSAgaWYgKGludF92YWx1ZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCppbnRfdmFsdWUpOwotICB9Ci0gIExPR19JTkZPKCJ2YWx1ZSAnJXMnIGNhbm5vdCBiZSBwYXJzZWQgdG8gaW50IiwgdmFsdWUtPmNfc3RyKCkpOwotICBpZiAodmFsdWUtPmVtcHR5KCkpIHsKLSAgICBMT0dfSU5GTygidmFsdWUgJyVzJyBpcyBlbXB0eSIsIHZhbHVlLT5jX3N0cigpKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAodmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgIExPR19JTkZPKCJ2YWx1ZSAnJXMnIGxlbmd0aCBpcyAlenUsIHdoaWNoIGlzID4gMSIsIHZhbHVlLT5jX3N0cigpLCB2YWx1ZS0+bGVuZ3RoKCkpOwotICB9Ci0gIGNoYXIgcmVsZWFzZV9jb2RlID0gdG91cHBlcih2YWx1ZS0+YXQoMCkpOwotICBzd2l0Y2ggKHJlbGVhc2VfY29kZSkgewotICAgIGNhc2UgJ1MnOgotICAgICAgcmV0dXJuIDExOwotICAgIGNhc2UgJ1InOgotICAgICAgcmV0dXJuIDEwOwotICAgIGNhc2UgJ1AnOgotICAgICAgcmV0dXJuIDk7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICByZXR1cm4gODsKLSAgICBkZWZhdWx0OgotICAgICAgLy8gVHJlYmxlIG5vdCBlbmFibGVkIGJlZm9yZSBBbmRyb2lkIE8KLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL29zL2FuZHJvaWQvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYyBiL2dkL29zL2FuZHJvaWQvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyODIzZi4uMDAwMDAwMAotLS0gYS9nZC9vcy9hbmRyb2lkL3N5c3RlbV9wcm9wZXJ0aWVzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlICJvcy9zeXN0ZW1fcHJvcGVydGllcy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6b3M6OkdldFN5c3RlbVByb3BlcnR5OwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6U2V0U3lzdGVtUHJvcGVydHk7Ci0KLVRFU1QoU3lzdGVtUHJvcGVydGllc1Rlc3QsIHNldF9hbmRfZ2V0X3Rlc3QpIHsKLSAgQVNTRVJUX1RSVUUoU2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsICJ0cnVlIikpOwotICBhdXRvIHJldCA9IEdldFN5c3RlbVByb3BlcnR5KCJwZXJzaXN0LmJsdWV0b290aC5mYWN0b3J5cmVzZXQiKTsKLSAgQVNTRVJUX1RSVUUocmV0KTsKLSAgQVNTRVJUX0VRKHJldCwgInRydWUiKTsKLSAgQVNTRVJUX1RSVUUoU2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsICJmYWxzZSIpKTsKLSAgcmV0ID0gR2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIpOwotICBBU1NFUlRfVFJVRShyZXQpOwotICBBU1NFUlRfRVEocmV0LCAiZmFsc2UiKTsKLSAgcmV0ID0gR2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldF9kb19ub3RfZXhpc3QiKTsKLSAgQVNTRVJUX0ZBTFNFKHJldCk7Ci19Ci0KLS8vIEZyb20gQW5kcm9pZCBPIGFuZCBhYm92ZSwgdGhlcmUgaXMgbm8gbGltaXQgb24gcHJvcGVydHkga2V5IHNpemVzc3MKLVRFU1QoU3lzdGVtUHJvcGVydGllc1Rlc3QsIG1heF9sZW5ndGhfdGVzdCkgewotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eShQUk9QX05BTUVfTUFYLCAnYScpOwotICBzdGQ6OnN0cmluZyB2YWx1ZShQUk9QX1ZBTFVFX01BWCwgJzEnKTsKLSAgQVNTRVJUX1RSVUUoU2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsICJmYWxzZSIpKTsKLSAgQVNTRVJUX1RSVUUoU2V0U3lzdGVtUHJvcGVydHkocHJvcGVydHksICJ0cnVlIikpOwotICBBU1NFUlRfRkFMU0UoU2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsIHZhbHVlKSk7Ci0gIEFTU0VSVF9GQUxTRShTZXRTeXN0ZW1Qcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKTsKLSAgQVNTRVJUX1RSVUUoR2V0U3lzdGVtUHJvcGVydHkocHJvcGVydHkpKTsKLSAgLy8gbWFrZSBzdXJlIG5vIGFjdHVhbCBvcGVyYXRpb25zIG9uIHN5c3RlbSBwcm9wZXJ0eSBoYXBwZW5lZAotICBhdXRvIHJldCA9IEdldFN5c3RlbVByb3BlcnR5KCJwZXJzaXN0LmJsdWV0b290aC5mYWN0b3J5cmVzZXQiKTsKLSAgQVNTRVJUX1RSVUUocmV0KTsKLSAgQVNTRVJUX0VRKHJldCwgImZhbHNlIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvYW5kcm9pZC93YWtlbG9ja19uYXRpdmUuY2MgYi9nZC9vcy9hbmRyb2lkL3dha2Vsb2NrX25hdGl2ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYmRlYi4uMDAwMDAwMAotLS0gYS9nZC9vcy9hbmRyb2lkL3dha2Vsb2NrX25hdGl2ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQnRHZFdha2Vsb2NrTmF0aXZlIgotCi0jaW5jbHVkZSAib3MvaW50ZXJuYWwvd2FrZWxvY2tfbmF0aXZlLmgiCi0KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvc3lzdGVtL3N1c3BlbmQvSVN5c3RlbVN1c3BlbmQuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvc3lzdGVtL3N1c3BlbmQvSVdha2VMb2NrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vLyBXZSB3YW50IHRoZSBvcy9sb2cuaCBkZWZpbml0aW9ucwotI3VuZGVmIExPR19ERUJVRwotI3VuZGVmIExPR19JTkZPCi0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotLy8gU2F2ZSB0aGUgb3MvbG9nLmggZGVmaW5pdGlvbnMKLSNwcmFnbWEgcHVzaF9tYWNybygiTE9HX0RFQlVHIikKLSNwcmFnbWEgcHVzaF9tYWNybygiTE9HX0lORk8iKQotCi0vLyBVbmRlZiB0aGVzZSB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoIGxhdGVyIGltcG9ydHMKLSN1bmRlZiBMT0dfREVCVUcKLSN1bmRlZiBMT0dfSU5GTwotCi11c2luZyA6OmFpZGw6OmFuZHJvaWQ6OnN5c3RlbTo6c3VzcGVuZDo6SVN5c3RlbVN1c3BlbmQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6OnN5c3RlbTo6c3VzcGVuZDo6SVdha2VMb2NrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjpzeXN0ZW06OnN1c3BlbmQ6Oldha2VMb2NrVHlwZTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUmVzdG9yZSB0aGUgb3MvbG9nLmggZGVmaW5pdGlvbnMgYWZ0ZXIgYWxsIGltcG9ydGVkIGhlYWRlcnMKLSNwcmFnbWEgcG9wX21hY3JvKCJMT0dfREVCVUciKQotI3ByYWdtYSBwb3BfbWFjcm8oIkxPR19JTkZPIikKLQotc3RhdGljIHZvaWQgb25TdXNwZW5kRGVhdGgodm9pZCogY29va2llKSB7Ci0gIGF1dG8gb25EZWF0aCA9IHN0YXRpY19jYXN0PHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4qPihjb29raWUpOwotICAoKm9uRGVhdGgpKCk7Ci19Ci0KLXN0cnVjdCBXYWtlbG9ja05hdGl2ZTo6SW1wbCB7Ci0gIEltcGwoKSA6IHN1c3BlbmRfZGVhdGhfcmVjaXBpZW50KEFJQmluZGVyX0RlYXRoUmVjaXBpZW50X25ldyhvblN1c3BlbmREZWF0aCkpIHt9Ci0KLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBvbkRlYXRoID0gW3RoaXNdIHsKLSAgICBMT0dfRVJST1IoIklTeXN0ZW1TdXNwZW5kIEhBTCBzZXJ2aWNlIGRpZWQhIik7Ci0gICAgdGhpcy0+c3VzcGVuZF9zZXJ2aWNlID0gbnVsbHB0cjsKLSAgfTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8SVN5c3RlbVN1c3BlbmQ+IHN1c3BlbmRfc2VydmljZSA9IG51bGxwdHI7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxJV2FrZUxvY2s+IGN1cnJlbnRfd2FrZWxvY2sgPSBudWxscHRyOwotICA6Om5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQgc3VzcGVuZF9kZWF0aF9yZWNpcGllbnQ7Ci19OwotCi12b2lkIFdha2Vsb2NrTmF0aXZlOjpJbml0aWFsaXplKCkgewotICBMT0dfSU5GTygiSW5pdGlhbGl6aW5nIG5hdGl2ZSB3YWtlIGxvY2tzIik7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIHN1c3BlbmRJbnN0YW5jZSA9IHN0ZDo6c3RyaW5nKCkgKyBJU3lzdGVtU3VzcGVuZDo6ZGVzY3JpcHRvciArICIvZGVmYXVsdCI7Ci0gIHBpbXBsXy0+c3VzcGVuZF9zZXJ2aWNlID0gSVN5c3RlbVN1c3BlbmQ6OmZyb21CaW5kZXIoCi0gICAgICBuZGs6OlNwQUlCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX3dhaXRGb3JTZXJ2aWNlKHN1c3BlbmRJbnN0YW5jZS5jX3N0cigpKSkpOwotICBBU1NFUlRfTE9HKHBpbXBsXy0+c3VzcGVuZF9zZXJ2aWNlLCAiQ2Fubm90IGdldCBJU3lzdGVtU3VzcGVuZCBzZXJ2aWNlIik7Ci0gIEFJQmluZGVyX2xpbmtUb0RlYXRoKAotICAgICAgcGltcGxfLT5zdXNwZW5kX3NlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksCi0gICAgICBwaW1wbF8tPnN1c3BlbmRfZGVhdGhfcmVjaXBpZW50LmdldCgpLAotICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KCZwaW1wbF8tPm9uRGVhdGgpKTsKLX0KLQotV2FrZWxvY2tOYXRpdmU6OlN0YXR1c0NvZGUgV2FrZWxvY2tOYXRpdmU6OkFjcXVpcmUoY29uc3Qgc3RkOjpzdHJpbmcmIGxvY2tfbmFtZSkgewotICBpZiAoIXBpbXBsXy0+c3VzcGVuZF9zZXJ2aWNlKSB7Ci0gICAgTE9HX0VSUk9SKCJsb2NrIG5vdCBhY3F1aXJlZCwgSVN5c3RlbVNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOwotICAgIHJldHVybiBTdGF0dXNDb2RlOjpOQVRJVkVfU0VSVklDRV9OT1RfQVZBSUxBQkxFOwotICB9Ci0KLSAgaWYgKHBpbXBsXy0+Y3VycmVudF93YWtlbG9jaykgewotICAgIExPR19JTkZPKCJ3YWtlbG9jayBpcyBhbHJlYWR5IGFjcXVpcmVkIik7Ci0gICAgcmV0dXJuIFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci0gIH0KLQotICBhdXRvIHN0YXR1cyA9IHBpbXBsXy0+c3VzcGVuZF9zZXJ2aWNlLT5hY3F1aXJlV2FrZUxvY2soCi0gICAgICBXYWtlTG9ja1R5cGU6OlBBUlRJQUwsIGxvY2tfbmFtZSwgJnBpbXBsXy0+Y3VycmVudF93YWtlbG9jayk7Ci0gIGlmICghcGltcGxfLT5jdXJyZW50X3dha2Vsb2NrKSB7Ci0gICAgTE9HX0VSUk9SKCJ3YWtlIGxvY2sgbm90IGFjcXVpcmVkOiAlcyIsIHN0YXR1cy5nZXREZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgIHJldHVybiBTdGF0dXNDb2RlOjpOQVRJVkVfQVBJX0VSUk9SOwotICB9Ci0KLSAgcmV0dXJuIFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci19Ci0KLVdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlIFdha2Vsb2NrTmF0aXZlOjpSZWxlYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpIHsKLSAgaWYgKCFwaW1wbF8tPmN1cnJlbnRfd2FrZWxvY2spIHsKLSAgICBMT0dfV0FSTigibm8gbG9jayBpcyBjdXJyZW50bHkgYWNxdWlyZWQiKTsKLSAgICByZXR1cm4gU3RhdHVzQ29kZTo6U1VDQ0VTUzsKLSAgfQotICBwaW1wbF8tPmN1cnJlbnRfd2FrZWxvY2stPnJlbGVhc2UoKTsKLSAgcGltcGxfLT5jdXJyZW50X3dha2Vsb2NrID0gbnVsbHB0cjsKLSAgcmV0dXJuIFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci19Ci0KLXZvaWQgV2FrZWxvY2tOYXRpdmU6OkNsZWFuVXAoKSB7Ci0gIExPR19JTkZPKCJDbGVhbmluZyB1cCBuYXRpdmUgd2FrZSBsb2NrcyIpOwotICBpZiAocGltcGxfLT5jdXJyZW50X3dha2Vsb2NrKSB7Ci0gICAgTE9HX0lORk8oInJlbGVhc2luZyBjdXJyZW50IHdha2Vsb2NrIGR1cmluZyBjbGVhbiB1cCIpOwotICAgIHBpbXBsXy0+Y3VycmVudF93YWtlbG9jay0+cmVsZWFzZSgpOwotICAgIHBpbXBsXy0+Y3VycmVudF93YWtlbG9jayA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKHBpbXBsXy0+c3VzcGVuZF9zZXJ2aWNlKSB7Ci0gICAgTE9HX0lORk8oIlVubGluayBkZWF0aCByZWNpcGllbnQiKTsKLSAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKAotICAgICAgICBwaW1wbF8tPnN1c3BlbmRfc2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwKLSAgICAgICAgcGltcGxfLT5zdXNwZW5kX2RlYXRoX3JlY2lwaWVudC5nZXQoKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KCZwaW1wbF8tPm9uRGVhdGgpKTsKLSAgICBwaW1wbF8tPnN1c3BlbmRfc2VydmljZSA9IG51bGxwdHI7Ci0gIH0KLX0KLQotV2FrZWxvY2tOYXRpdmU6Oldha2Vsb2NrTmF0aXZlKCkgOiBwaW1wbF8oc3RkOjptYWtlX3VuaXF1ZTxJbXBsPigpKSB7fQotCi1XYWtlbG9ja05hdGl2ZTo6fldha2Vsb2NrTmF0aXZlKCkgPSBkZWZhdWx0OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvYW5kcm9pZC93YWtlbG9ja19uYXRpdmVfdGVzdC5jYyBiL2dkL29zL2FuZHJvaWQvd2FrZWxvY2tfbmF0aXZlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmU3MjIuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvYW5kcm9pZC93YWtlbG9ja19uYXRpdmVfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIwIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvcy9pbnRlcm5hbC93YWtlbG9ja19uYXRpdmUuaCIKLQotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9zeXN0ZW0vc3VzcGVuZC9CblN1c3BlbmRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9zeXN0ZW0vc3VzcGVuZC9Cbldha2Vsb2NrQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvc3lzdGVtL3N1c3BlbmQvSVN1c3BlbmRDb250cm9sU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pbnRlcmZhY2VfdXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBhaWRsOjphbmRyb2lkOjpzeXN0ZW06OnN1c3BlbmQ6OkJuU3VzcGVuZENhbGxiYWNrOwotdXNpbmcgYWlkbDo6YW5kcm9pZDo6c3lzdGVtOjpzdXNwZW5kOjpCbldha2Vsb2NrQ2FsbGJhY2s7Ci11c2luZyBhaWRsOjphbmRyb2lkOjpzeXN0ZW06OnN1c3BlbmQ6OklTdXNwZW5kQ29udHJvbFNlcnZpY2U7Ci11c2luZyBibHVldG9vdGg6Om9zOjppbnRlcm5hbDo6V2FrZWxvY2tOYXRpdmU7Ci11c2luZyBuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyBuZGs6OlNoYXJlZFJlZkJhc2U7Ci11c2luZyBuZGs6OlNwQUlCaW5kZXI7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdFdha2Vsb2NrTmFtZSA9ICJCdFdha2Vsb2NrTmF0aXZlVGVzdExvY2siOwotCi1zdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbXV0ZXg7Ci1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6cHJvbWlzZTx2b2lkPj4gYWNxdWlyZV9wcm9taXNlID0gbnVsbHB0cjsKLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiByZWxlYXNlX3Byb21pc2UgPSBudWxscHRyOwotCi1jbGFzcyBQcm9taXNlRnV0dXJlQ29udGV4dCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBGdWxmaWxQcm9taXNlKHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+JiBwcm9taXNlKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrX2d1YXJkKG11dGV4KTsKLSAgICBpZiAocHJvbWlzZSAhPSBudWxscHRyKSB7Ci0gICAgICBwcm9taXNlLT5zZXRfdmFsdWUoKTsKLSAgICAgIHByb21pc2UgPSBudWxscHRyOwotICAgIH0KLSAgfQotCi0gIGV4cGxpY2l0IFByb21pc2VGdXR1cmVDb250ZXh0KHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnByb21pc2U8dm9pZD4+JiBwcm9taXNlLCBib29sIGV4cGVjdF9mdWxmaWxsbWVudCkKLSAgICAgIDogcHJvbWlzZV8ocHJvbWlzZSksIGV4cGVjdF9mdWxmaWxsbWVudF8oZXhwZWN0X2Z1bGZpbGxtZW50KSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrX2d1YXJkKG11dGV4KTsKLSAgICBFWFBFQ1RfRVEocHJvbWlzZV8sIG51bGxwdHIpOwotICAgIHByb21pc2VfID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gICAgZnV0dXJlXyA9IHByb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgfQotCi0gIH5Qcm9taXNlRnV0dXJlQ29udGV4dCgpIHsKLSAgICBhdXRvIGZ1dHVyZV9zdGF0dXMgPSBmdXR1cmVfLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDIpKTsKLSAgICBpZiAoZXhwZWN0X2Z1bGZpbGxtZW50XykgewotICAgICAgRVhQRUNUX0VRKGZ1dHVyZV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFWFBFQ1RfTkUoZnV0dXJlX3N0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci0gICAgfQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9ja19ndWFyZChtdXRleCk7Ci0gICAgcHJvbWlzZV8gPSBudWxscHRyOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiYgcHJvbWlzZV87Ci0gIGJvb2wgZXhwZWN0X2Z1bGZpbGxtZW50XyA9IHRydWU7Ci0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IGZ1dHVyZV87Ci19OwotCi1jbGFzcyBXYWtlbG9ja0NhbGxiYWNrIDogcHVibGljIEJuV2FrZWxvY2tDYWxsYmFjayB7Ci0gcHVibGljOgotICBTY29wZWRBU3RhdHVzIG5vdGlmeUFjcXVpcmVkKCkgb3ZlcnJpZGUgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9ja19ndWFyZChtdXRleCk7Ci0gICAgbmV0X2FjcXVpcmVkX2NvdW50Kys7Ci0gICAgZnByaW50ZihzdGRlcnIsICJub3RpZnlBY3F1aXJlZCwgY291bnQgPSAlZFxuIiwgbmV0X2FjcXVpcmVkX2NvdW50KTsKLSAgICBQcm9taXNlRnV0dXJlQ29udGV4dDo6RnVsZmlsUHJvbWlzZShhY3F1aXJlX3Byb21pc2UpOwotICAgIHJldHVybiBTY29wZWRBU3RhdHVzOjpvaygpOwotICB9Ci0gIFNjb3BlZEFTdGF0dXMgbm90aWZ5UmVsZWFzZWQoKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrX2d1YXJkKG11dGV4KTsKLSAgICBuZXRfYWNxdWlyZWRfY291bnQtLTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdGlmeVJlbGVhc2VkLCBjb3VudCA9ICVkXG4iLCBuZXRfYWNxdWlyZWRfY291bnQpOwotICAgIFByb21pc2VGdXR1cmVDb250ZXh0OjpGdWxmaWxQcm9taXNlKHJlbGVhc2VfcHJvbWlzZSk7Ci0gICAgcmV0dXJuIFNjb3BlZEFTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpbnQgbmV0X2FjcXVpcmVkX2NvdW50ID0gMDsKLX07Ci0KLWNsYXNzIFN1c3BlbmRDYWxsYmFjayA6IHB1YmxpYyBCblN1c3BlbmRDYWxsYmFjayB7Ci0gcHVibGljOgotICBTY29wZWRBU3RhdHVzIG5vdGlmeVdha2V1cChib29sIHN1Y2Nlc3MsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgd2FrZXVwX3JlYXNvbnMpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2tfZ3VhcmQobXV0ZXgpOwotICAgIGZwcmludGYoc3RkZXJyLCAibm90aWZ5V2FrZXVwXG4iKTsKLSAgICByZXR1cm4gU2NvcGVkQVN0YXR1czo6b2soKTsKLSAgfQotfTsKLQotLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHVucmVnaXN0ZXIgdGhlc2UgY2FsbGJhY2tzIGJlc2lkZXMgd2hlbiB0aGlzIHByb2Nlc3MgZGllcwotLy8gSGVuY2UsIHdlIHdhbnQgdG8gaGF2ZSBvbmx5IG9uZSBjb3B5IG9mIHRoZXNlIGNhbGxiYWNrcyBwZXIgcHJvY2Vzcwotc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxTdXNwZW5kQ2FsbGJhY2s+IHN1c3BlbmRfY2FsbGJhY2sgPSBudWxscHRyOwotc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxXYWtlbG9ja0NhbGxiYWNrPiBjb250cm9sX2NhbGxiYWNrID0gbnVsbHB0cjsKLQotY2xhc3MgV2FrZWxvY2tOYXRpdmVUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBQmluZGVyUHJvY2Vzc19zZXRUaHJlYWRQb29sTWF4VGhyZWFkQ291bnQoMSk7Ci0gICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7Ci0KLSAgICBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuSW5pdGlhbGl6ZSgpOwotCi0gICAgYXV0byBiaW5kZXJfcmF3ID0gQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoInN1c3BlbmRfY29udHJvbCIpOwotICAgIEFTU0VSVF9ORShiaW5kZXJfcmF3LCBudWxscHRyKTsKLSAgICBiaW5kZXIuc2V0KGJpbmRlcl9yYXcpOwotICAgIGNvbnRyb2xfc2VydmljZV8gPSBJU3VzcGVuZENvbnRyb2xTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7Ci0gICAgaWYgKGNvbnRyb2xfc2VydmljZV8gPT0gbnVsbHB0cikgewotICAgICAgRkFJTCgpIDw8ICJGYWlsIHRvIG9idGFpbiBzdXNwZW5kX2NvbnRyb2wiOwotICAgIH0KLQotICAgIGlmIChzdXNwZW5kX2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICAgIHN1c3BlbmRfY2FsbGJhY2sgPSBTaGFyZWRSZWZCYXNlOjptYWtlPFN1c3BlbmRDYWxsYmFjaz4oKTsKLSAgICAgIGJvb2wgaXNfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgU2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBjb250cm9sX3NlcnZpY2VfLT5yZWdpc3RlckNhbGxiYWNrKHN1c3BlbmRfY2FsbGJhY2ssICZpc19yZWdpc3RlcmVkKTsKLSAgICAgIGlmICghaXNfcmVnaXN0ZXJlZCB8fCAhc3RhdHVzLmlzT2soKSkgewotICAgICAgICBGQUlMKCkgPDwgIkZhaWwgdG8gcmVnaXN0ZXIgc3VzcGVuZCBjYWxsYmFjayI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGNvbnRyb2xfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgY29udHJvbF9jYWxsYmFjayA9IFNoYXJlZFJlZkJhc2U6Om1ha2U8V2FrZWxvY2tDYWxsYmFjaz4oKTsKLSAgICAgIGJvb2wgaXNfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgU2NvcGVkQVN0YXR1cyBzdGF0dXMgPQotICAgICAgICAgIGNvbnRyb2xfc2VydmljZV8tPnJlZ2lzdGVyV2FrZWxvY2tDYWxsYmFjayhjb250cm9sX2NhbGxiYWNrLCBrVGVzdFdha2Vsb2NrTmFtZSwgJmlzX3JlZ2lzdGVyZWQpOwotICAgICAgaWYgKCFpc19yZWdpc3RlcmVkIHx8ICFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEZBSUwoKSA8PCAiRmFpbCB0byByZWdpc3RlciB3YWtldXAgY2FsbGJhY2siOwotICAgICAgfQotICAgIH0KLSAgICBjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQgPSAwOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjb250cm9sX3NlcnZpY2VfID0gbnVsbHB0cjsKLSAgICBiaW5kZXIuc2V0KG51bGxwdHIpOwotICAgIFdha2Vsb2NrTmF0aXZlOjpHZXQoKS5DbGVhblVwKCk7Ci0gIH0KLQotICBTcEFJQmluZGVyIGJpbmRlcjsKLSAgc3RkOjpzaGFyZWRfcHRyPElTdXNwZW5kQ29udHJvbFNlcnZpY2U+IGNvbnRyb2xfc2VydmljZV8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKFdha2Vsb2NrTmF0aXZlVGVzdCwgdGVzdF9hY3F1aXJlX2FuZF9yZWxlYXNlX3dha2Vsb2NrcykgewotICBBU1NFUlRfRVEoY29udHJvbF9jYWxsYmFjay0+bmV0X2FjcXVpcmVkX2NvdW50LCAwKTsKLQotICB7Ci0gICAgUHJvbWlzZUZ1dHVyZUNvbnRleHQgY29udGV4dChhY3F1aXJlX3Byb21pc2UsIHRydWUpOwotICAgIGF1dG8gc3RhdHVzID0gV2FrZWxvY2tOYXRpdmU6OkdldCgpLkFjcXVpcmUoa1Rlc3RXYWtlbG9ja05hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIFdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlOjpTVUNDRVNTKTsKLSAgfQotICBBU1NFUlRfRVEoY29udHJvbF9jYWxsYmFjay0+bmV0X2FjcXVpcmVkX2NvdW50LCAxKTsKLQotICB7Ci0gICAgUHJvbWlzZUZ1dHVyZUNvbnRleHQgY29udGV4dChyZWxlYXNlX3Byb21pc2UsIHRydWUpOwotICAgIGF1dG8gc3RhdHVzID0gV2FrZWxvY2tOYXRpdmU6OkdldCgpLlJlbGVhc2Uoa1Rlc3RXYWtlbG9ja05hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIFdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlOjpTVUNDRVNTKTsKLSAgfQotICBBU1NFUlRfRVEoY29udHJvbF9jYWxsYmFjay0+bmV0X2FjcXVpcmVkX2NvdW50LCAwKTsKLX0KLQotVEVTVF9GKFdha2Vsb2NrTmF0aXZlVGVzdCwgdGVzdF9hY3F1aXJlX2FuZF9yZWxlYXNlX3dha2Vsb2Nrc19yZXBlYXRlZF9hY3F1aXJlKSB7Ci0gIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDApOwotCi0gIHsKLSAgICBQcm9taXNlRnV0dXJlQ29udGV4dCBjb250ZXh0KGFjcXVpcmVfcHJvbWlzZSwgdHJ1ZSk7Ci0gICAgYXV0byBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuQWNxdWlyZShrVGVzdFdha2Vsb2NrTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgV2FrZWxvY2tOYXRpdmU6OlN0YXR1c0NvZGU6OlNVQ0NFU1MpOwotICB9Ci0gIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDEpOwotCi0gIHsKLSAgICBQcm9taXNlRnV0dXJlQ29udGV4dCBjb250ZXh0KGFjcXVpcmVfcHJvbWlzZSwgZmFsc2UpOwotICAgIGF1dG8gc3RhdHVzID0gV2FrZWxvY2tOYXRpdmU6OkdldCgpLkFjcXVpcmUoa1Rlc3RXYWtlbG9ja05hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIFdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlOjpTVUNDRVNTKTsKLSAgfQotICBBU1NFUlRfRVEoY29udHJvbF9jYWxsYmFjay0+bmV0X2FjcXVpcmVkX2NvdW50LCAxKTsKLQotICB7Ci0gICAgUHJvbWlzZUZ1dHVyZUNvbnRleHQgY29udGV4dChyZWxlYXNlX3Byb21pc2UsIHRydWUpOwotICAgIGF1dG8gc3RhdHVzID0gV2FrZWxvY2tOYXRpdmU6OkdldCgpLlJlbGVhc2Uoa1Rlc3RXYWtlbG9ja05hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIFdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlOjpTVUNDRVNTKTsKLSAgfQotICBBU1NFUlRfRVEoY29udHJvbF9jYWxsYmFjay0+bmV0X2FjcXVpcmVkX2NvdW50LCAwKTsKLX0KLQotVEVTVF9GKFdha2Vsb2NrTmF0aXZlVGVzdCwgdGVzdF9hY3F1aXJlX2FuZF9yZWxlYXNlX3dha2Vsb2Nrc19yZXBlYXRlZF9yZWxlYXNlKSB7Ci0gIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDApOwotCi0gIHsKLSAgICBQcm9taXNlRnV0dXJlQ29udGV4dCBjb250ZXh0KGFjcXVpcmVfcHJvbWlzZSwgdHJ1ZSk7Ci0gICAgYXV0byBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuQWNxdWlyZShrVGVzdFdha2Vsb2NrTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgV2FrZWxvY2tOYXRpdmU6OlN0YXR1c0NvZGU6OlNVQ0NFU1MpOwotICB9Ci0gIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDEpOwotCi0gIHsKLSAgICBQcm9taXNlRnV0dXJlQ29udGV4dCBjb250ZXh0KHJlbGVhc2VfcHJvbWlzZSwgdHJ1ZSk7Ci0gICAgYXV0byBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuUmVsZWFzZShrVGVzdFdha2Vsb2NrTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgV2FrZWxvY2tOYXRpdmU6OlN0YXR1c0NvZGU6OlNVQ0NFU1MpOwotICB9Ci0gIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDApOwotCi0gIHsKLSAgICBQcm9taXNlRnV0dXJlQ29udGV4dCBjb250ZXh0KHJlbGVhc2VfcHJvbWlzZSwgZmFsc2UpOwotICAgIGF1dG8gc3RhdHVzID0gV2FrZWxvY2tOYXRpdmU6OkdldCgpLlJlbGVhc2Uoa1Rlc3RXYWtlbG9ja05hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIFdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlOjpTVUNDRVNTKTsKLSAgfQotICBBU1NFUlRfRVEoY29udHJvbF9jYWxsYmFjay0+bmV0X2FjcXVpcmVkX2NvdW50LCAwKTsKLX0KLQotVEVTVF9GKFdha2Vsb2NrTmF0aXZlVGVzdCwgdGVzdF9hY3F1aXJlX2FuZF9yZWxlYXNlX3dha2Vsb2Nrc19pbl9hX2xvb3ApIHsKLSAgQVNTRVJUX0VRKGNvbnRyb2xfY2FsbGJhY2stPm5ldF9hY3F1aXJlZF9jb3VudCwgMCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgewotICAgICAgUHJvbWlzZUZ1dHVyZUNvbnRleHQgY29udGV4dChhY3F1aXJlX3Byb21pc2UsIHRydWUpOwotICAgICAgYXV0byBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuQWNxdWlyZShrVGVzdFdha2Vsb2NrTmFtZSk7Ci0gICAgICBBU1NFUlRfRVEoc3RhdHVzLCBXYWtlbG9ja05hdGl2ZTo6U3RhdHVzQ29kZTo6U1VDQ0VTUyk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDEpOwotCi0gICAgewotICAgICAgUHJvbWlzZUZ1dHVyZUNvbnRleHQgY29udGV4dChyZWxlYXNlX3Byb21pc2UsIHRydWUpOwotICAgICAgYXV0byBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuUmVsZWFzZShrVGVzdFdha2Vsb2NrTmFtZSk7Ci0gICAgICBBU1NFUlRfRVEoc3RhdHVzLCBXYWtlbG9ja05hdGl2ZTo6U3RhdHVzQ29kZTo6U1VDQ0VTUyk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDApOwotICB9Ci19Ci0KLVRFU1RfRihXYWtlbG9ja05hdGl2ZVRlc3QsIHRlc3RfY2xlYW5fdXApIHsKLSAgV2FrZWxvY2tOYXRpdmU6OkdldCgpLkluaXRpYWxpemUoKTsKLSAgQVNTRVJUX0VRKGNvbnRyb2xfY2FsbGJhY2stPm5ldF9hY3F1aXJlZF9jb3VudCwgMCk7Ci0KLSAgewotICAgIFByb21pc2VGdXR1cmVDb250ZXh0IGNvbnRleHQoYWNxdWlyZV9wcm9taXNlLCB0cnVlKTsKLSAgICBhdXRvIHN0YXR1cyA9IFdha2Vsb2NrTmF0aXZlOjpHZXQoKS5BY3F1aXJlKGtUZXN0V2FrZWxvY2tOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCBXYWtlbG9ja05hdGl2ZTo6U3RhdHVzQ29kZTo6U1VDQ0VTUyk7Ci0gIH0KLSAgQVNTRVJUX0VRKGNvbnRyb2xfY2FsbGJhY2stPm5ldF9hY3F1aXJlZF9jb3VudCwgMSk7Ci0KLSAgewotICAgIFByb21pc2VGdXR1cmVDb250ZXh0IGNvbnRleHQocmVsZWFzZV9wcm9taXNlLCB0cnVlKTsKLSAgICBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuQ2xlYW5VcCgpOwotICB9Ci0gIEFTU0VSVF9FUShjb250cm9sX2NhbGxiYWNrLT5uZXRfYWNxdWlyZWRfY291bnQsIDApOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL29zL2J0X2tleXN0b3JlLmggYi9nZC9vcy9idF9rZXlzdG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTA5NzUwLi4wMDAwMDAwCi0tLSBhL2dkL29zL2J0X2tleXN0b3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Li4vaW5jbHVkZS9oYXJkd2FyZS9idF9rZXlzdG9yZS5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBibHVldG9vdGhfa2V5c3RvcmUgewotCi1CbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSogZ2V0Qmx1ZXRvb3RoS2V5c3RvcmVJbnRlcmZhY2UoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aF9rZXlzdG9yZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL29zL2ZpbGVzLmggYi9nZC9vcy9maWxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTY3MjFiLi4wMDAwMDAwCi0tLSBhL2dkL29zL2ZpbGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG9wdGlvbmFsPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLS8vIFJldHVybiB0cnVlIGlmIHxwYXRofCBleGlzdHMgb24gZGlzawotYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKLQotLy8gUmVuYW1lIGZpbGUgZnJvbSB8ZnJvbXwgdG8gfHRvfAotYm9vbCBSZW5hbWVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBjb25zdCBzdGQ6OnN0cmluZyYgdG8pOwotCi0vLyBJbXBsZW1lbnQgYWJpbGl0eSB0byByZWFkIGEgd2hvbGUgZmlsZSBmcm9tIHxwYXRofCBpbnRvIGEgQysrIHN0cmluZywgcmV0dXJuIHN0ZDo6bnVsbG9wdCBvbiBmYWlsdXJlCi0vLwotLy8gRG8gbm90IHVzZSB0aGlzIHdpdGggbGFyZ2UgZmlsZXMKLXN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IFJlYWRTbWFsbEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwotCi0vLyBJbXBsZW1lbnQgYWJpbGl0eSB0byBzYWZlbHkgd3JpdGUgdG8gYSBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBiZWNhdXNlIG9mIGRlZmljaWVuY2llcyBpbiBleGlzdGluZyBDKysgZmlsZQotLy8gbGlicmFyaWVzLCBuYW1lbHk6Ci0vLyAtIFRoZSBhYmlsaXR5IHRvIG9wZW4gYW5kIHN5bmMgZGlyZWN0b3JpZXMgd2l0aCBzdG9yYWdlIG1lZGlhCi0vLyAtIFRoZSBhYmlsaXR5IHRvIGJsb2NrIGFuZCBzeW5jIGZpbGUgdG8gc3RvcmFnZSBtZWRpYQotLy8gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQotYm9vbCBXcml0ZVRvRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpOwotCi0vLyBSZW1vdmUgZmlsZSBhbmQgcHJpbnQgZXJyb3IgbWVzc2FnZSBpZiBmYWlsZWQKLS8vIFByaW50IGVycm9yIGxvZyB3aGVuIGZpbGUgaXMgZmFpbGVkIHRvIGJlIHJlbW92ZWQsIGhlbmNlIHVzZXIgc2hvdWxkIG1ha2Ugc3VyZSBmaWxlIGV4aXN0cyBiZWZvcmUgY2FsbGluZyB0aGlzCi0vLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChlLmcuIGZpbGUgbm90IGV4aXN0LCBmYWlsZWQgdG8gcmVtb3ZlLCBldGMpCi1ib29sIFJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9vcy9mdXp6L2Rldl9udWxsX3F1ZXVlLmggYi9nZC9vcy9mdXp6L2Rldl9udWxsX3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmQ3YzUuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvZnV6ei9kZXZfbnVsbF9xdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJvcy9xdWV1ZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci1uYW1lc3BhY2UgZnV6eiB7Ci0KLS8vIERyb3BzIHN0dWZmIHlvdSBzZW5kIGl0LCBhbmQgYmFuaXNoZXMgaXQgaW50byB0aGUgdm9pZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgRGV2TnVsbFF1ZXVlIHsKLSBwdWJsaWM6Ci0gIERldk51bGxRdWV1ZShJUXVldWVEZXF1ZXVlPFQ+KiBxdWV1ZSwgSGFuZGxlciogaGFuZGxlcikgOiBxdWV1ZV8ocXVldWUpLCBoYW5kbGVyXyhoYW5kbGVyKSB7fQotICB+RGV2TnVsbFF1ZXVlKCkge30KLQotICB2b2lkIFN0YXJ0KCkgewotICAgIHF1ZXVlXy0+UmVnaXN0ZXJEZXF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJkRldk51bGxRdWV1ZTo6RHVtcCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLQotICB2b2lkIFN0b3AoKSB7Ci0gICAgcXVldWVfLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICB9Ci0KLSAgdm9pZCBEdW1wKCkgewotICAgIHF1ZXVlXy0+VHJ5RGVxdWV1ZSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBJUXVldWVEZXF1ZXVlPFQ+KiBxdWV1ZV87Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZ1enoKLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvZnV6ei9mYWtlX3RpbWVyZmQuY2MgYi9nZC9vcy9mdXp6L2Zha2VfdGltZXJmZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3Mzg5Yi4uMDAwMDAwMAotLS0gYS9nZC9vcy9mdXp6L2Zha2VfdGltZXJmZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvZnV6ei9mYWtlX3RpbWVyZmQuaCIKLQotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLW5hbWVzcGFjZSBmdXp6IHsKLQotY2xhc3MgRmFrZVRpbWVyRmQgewotIHB1YmxpYzoKLSAgaW50IGZkOwotICBib29sIGFjdGl2ZTsKLSAgdWludDY0X3QgdHJpZ2dlcl9tczsKLSAgdWludDY0X3QgcGVyaW9kX21zOwotfTsKLQotc3RhdGljIHN0ZDo6bWFwPGludCwgRmFrZVRpbWVyRmQqPiBmYWtlX3RpbWVyczsKLXN0YXRpYyB1aW50NjRfdCBjbG9jayA9IDA7Ci1zdGF0aWMgdWludDY0X3QgbWF4X2Nsb2NrID0gVUlOVDY0X01BWDsKLQotc3RhdGljIHVpbnQ2NF90IHRpbWVzcGVjX3RvX21zKGNvbnN0IHRpbWVzcGVjKiB0KSB7Ci0gIHJldHVybiB0LT50dl9zZWMgKiAxMDAwICsgdC0+dHZfbnNlYyAvIDEwMDAwMDA7Ci19Ci0KLWludCBmYWtlX3RpbWVyZmRfY3JlYXRlKGludCBjbG9ja2lkLCBpbnQgZmxhZ3MpIHsKLSAgaW50IGZkID0gZXZlbnRmZCgwLCAwKTsKLSAgaWYgKGZkID09IC0xKSB7Ci0gICAgcmV0dXJuIGZkOwotICB9Ci0KLSAgRmFrZVRpbWVyRmQqIGVudHJ5ID0gbmV3IEZha2VUaW1lckZkKCk7Ci0gIGZha2VfdGltZXJzW2ZkXSA9IGVudHJ5OwotICBlbnRyeS0+ZmQgPSBmZDsKLSAgcmV0dXJuIGZkOwotfQotCi1pbnQgZmFrZV90aW1lcmZkX3NldHRpbWUoaW50IGZkLCBpbnQgZmxhZ3MsIGNvbnN0IHN0cnVjdCBpdGltZXJzcGVjKiBuZXdfdmFsdWUsIHN0cnVjdCBpdGltZXJzcGVjKiBvbGRfdmFsdWUpIHsKLSAgaWYgKGZha2VfdGltZXJzLmZpbmQoZmQpID09IGZha2VfdGltZXJzLmVuZCgpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgRmFrZVRpbWVyRmQqIGVudHJ5ID0gZmFrZV90aW1lcnNbZmRdOwotCi0gIHVpbnQ2NF90IHRyaWdnZXJfZGVsdGFfbXMgPSB0aW1lc3BlY190b19tcygmbmV3X3ZhbHVlLT5pdF92YWx1ZSk7Ci0gIGVudHJ5LT5hY3RpdmUgPSB0cmlnZ2VyX2RlbHRhX21zICE9IDA7Ci0gIGlmICghZW50cnktPmFjdGl2ZSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWludDY0X3QgcGVyaW9kX21zID0gdGltZXNwZWNfdG9fbXMoJm5ld192YWx1ZS0+aXRfdmFsdWUpOwotICBlbnRyeS0+dHJpZ2dlcl9tcyA9IGNsb2NrICsgdHJpZ2dlcl9kZWx0YV9tczsKLSAgZW50cnktPnBlcmlvZF9tcyA9IHBlcmlvZF9tczsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBmYWtlX3RpbWVyZmRfY2xvc2UoaW50IGZkKSB7Ci0gIGF1dG8gdGltZXJfaXRlcmF0b3IgPSBmYWtlX3RpbWVycy5maW5kKGZkKTsKLSAgaWYgKHRpbWVyX2l0ZXJhdG9yICE9IGZha2VfdGltZXJzLmVuZCgpKSB7Ci0gICAgZGVsZXRlIHRpbWVyX2l0ZXJhdG9yLT5zZWNvbmQ7Ci0gICAgZmFrZV90aW1lcnMuZXJhc2UodGltZXJfaXRlcmF0b3IpOwotICB9Ci0gIHJldHVybiBjbG9zZShmZCk7Ci19Ci0KLXZvaWQgZmFrZV90aW1lcmZkX3Jlc2V0KCkgewotICBjbG9jayA9IDA7Ci0gIG1heF9jbG9jayA9IFVJTlQ2NF9NQVg7Ci0gIC8vIGlmIHRoZXJlIGFyZSBlbnRyaWVzIHN0aWxsIGhlcmUsIGl0IGlzIGEgZmFpbHVyZSBvZiBvdXIgdXNlcnMgdG8gY2xlYW4gdXAKLSAgLy8gc28gbGV0IHRoZW0gbGVhayBhbmQgdHJpZ2dlciBlcnJvcnMKLSAgZmFrZV90aW1lcnMuY2xlYXIoKTsKLX0KLQotc3RhdGljIGJvb2wgZmlyZV9uZXh0X2V2ZW50KHVpbnQ2NF90IG5ld19jbG9jaykgewotICB1aW50NjRfdCBlYXJsaWVzdF90aW1lID0gbmV3X2Nsb2NrOwotICBGYWtlVGltZXJGZCogdG9fZmlyZSA9IG51bGxwdHI7Ci0gIGZvciAoYXV0byBpdCA9IGZha2VfdGltZXJzLmJlZ2luKCk7IGl0ICE9IGZha2VfdGltZXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgRmFrZVRpbWVyRmQqIGVudHJ5ID0gaXQtPnNlY29uZDsKLSAgICBpZiAoIWVudHJ5LT5hY3RpdmUpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmIChlbnRyeS0+dHJpZ2dlcl9tcyA+IGNsb2NrICYmIGVudHJ5LT50cmlnZ2VyX21zIDw9IG5ld19jbG9jaykgewotICAgICAgaWYgKHRvX2ZpcmUgPT0gbnVsbHB0ciB8fCBlbnRyeS0+dHJpZ2dlcl9tcyA8IGVhcmxpZXN0X3RpbWUpIHsKLSAgICAgICAgdG9fZmlyZSA9IGVudHJ5OwotICAgICAgICBlYXJsaWVzdF90aW1lID0gZW50cnktPnRyaWdnZXJfbXM7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRvX2ZpcmUgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgaXNfcGVyaW9kaWMgPSB0b19maXJlLT5wZXJpb2RfbXMgIT0gMDsKLSAgaWYgKGlzX3BlcmlvZGljKSB7Ci0gICAgdG9fZmlyZS0+dHJpZ2dlcl9tcyArPSB0b19maXJlLT5wZXJpb2RfbXM7Ci0gIH0KLSAgdG9fZmlyZS0+YWN0aXZlID0gaXNfcGVyaW9kaWM7Ci0gIHVpbnQ2NF90IHZhbHVlID0gMTsKLSAgd3JpdGUodG9fZmlyZS0+ZmQsICZ2YWx1ZSwgc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIGZha2VfdGltZXJmZF9hZHZhbmNlKHVpbnQ2NF90IG1zKSB7Ci0gIHVpbnQ2NF90IG5ld19jbG9jayA9IGNsb2NrICsgbXM7Ci0gIGlmIChuZXdfY2xvY2sgPiBtYXhfY2xvY2spIHsKLSAgICBuZXdfY2xvY2sgPSBtYXhfY2xvY2s7Ci0gIH0KLSAgd2hpbGUgKGZpcmVfbmV4dF9ldmVudChuZXdfY2xvY2spKSB7Ci0gIH0KLSAgY2xvY2sgPSBuZXdfY2xvY2s7Ci19Ci0KLXZvaWQgZmFrZV90aW1lcmZkX2NhcF9hdCh1aW50NjRfdCBtcykgewotICBtYXhfY2xvY2sgPSBtczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZ1enoKLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvZnV6ei9mYWtlX3RpbWVyZmQuaCBiL2dkL29zL2Z1enovZmFrZV90aW1lcmZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OWUxNTMuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvZnV6ei9mYWtlX3RpbWVyZmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzL3RpbWVyZmQuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLW5hbWVzcGFjZSBmdXp6IHsKLQotaW50IGZha2VfdGltZXJmZF9jcmVhdGUoaW50IGNsb2NraWQsIGludCBmbGFncyk7Ci0KLWludCBmYWtlX3RpbWVyZmRfc2V0dGltZShpbnQgZmQsIGludCBmbGFncywgY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMqIG5ld192YWx1ZSwgc3RydWN0IGl0aW1lcnNwZWMqIG9sZF92YWx1ZSk7Ci0KLWludCBmYWtlX3RpbWVyZmRfY2xvc2UoaW50IGZkKTsKLQotdm9pZCBmYWtlX3RpbWVyZmRfcmVzZXQoKTsKLQotdm9pZCBmYWtlX3RpbWVyZmRfYWR2YW5jZSh1aW50NjRfdCBtcyk7Ci0KLXZvaWQgZmFrZV90aW1lcmZkX2NhcF9hdCh1aW50NjRfdCBtcyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBmdXp6Ci19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2Z1enovZnV6el9pbmplY3RfcXVldWUuaCBiL2dkL29zL2Z1enovZnV6el9pbmplY3RfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5ZWJhZS4uMDAwMDAwMAotLS0gYS9nZC9vcy9mdXp6L2Z1enpfaW5qZWN0X3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLW5hbWVzcGFjZSBmdXp6IHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBGdXp6SW5qZWN0UXVldWUgewotIHB1YmxpYzoKLSAgRnV6ekluamVjdFF1ZXVlKElRdWV1ZUVucXVldWU8VD4qIHF1ZXVlLCBIYW5kbGVyKiBoYW5kbGVyKSA6IGhhbmRsZXJfKGhhbmRsZXIpIHsKLSAgICBidWZmZXJfID0gbmV3IEVucXVldWVCdWZmZXI8VD4ocXVldWUpOwotICB9Ci0gIH5GdXp6SW5qZWN0UXVldWUoKSB7Ci0gICAgZGVsZXRlIGJ1ZmZlcl87Ci0gIH0KLQotICB2b2lkIEluamVjdChzdGQ6OnVuaXF1ZV9wdHI8VD4gZGF0YSkgewotICAgIGJ1ZmZlcl8tPkVucXVldWUoc3RkOjptb3ZlKGRhdGEpLCBoYW5kbGVyXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEVucXVldWVCdWZmZXI8VD4qIGJ1ZmZlcl87Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZ1enoKLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvaGFuZGxlci5oIGIvZ2Qvb3MvaGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUzMGJjLi4wMDAwMDAwCi0tLSBhL2dkL29zL2hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHF1ZXVlPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJjb21tb24vY29udGV4dHVhbF9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zL3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotLy8gQSBtZXNzYWdlLXF1ZXVlIHN0eWxlIGhhbmRsZXIgZm9yIHJlYWN0b3ItYmFzZWQgdGhyZWFkIHRvIGhhbmRsZSBpbmNvbWluZyBldmVudHMgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcy4gV2hlbiBpdCdzCi0vLyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCByZWdpc3RlciBhIHJlYWN0YWJsZSBvbiB0aGUgc3BlY2lmaWVkIHRocmVhZDsgd2hlbiBpdCdzIGRlc3Ryb3llZCwgaXQgd2lsbCB1bnJlZ2lzdGVyIGl0c2VsZgotLy8gZnJvbSB0aGUgdGhyZWFkLgotY2xhc3MgSGFuZGxlciA6IHB1YmxpYyBjb21tb246OklQb3N0YWJsZUNvbnRleHQgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBhIGhhbmRsZXIgb24gZ2l2ZW4gdGhyZWFkCi0gIGV4cGxpY2l0IEhhbmRsZXIoVGhyZWFkKiB0aHJlYWQpOwotCi0gIC8vIFVucmVnaXN0ZXIgdGhpcyBoYW5kbGVyIGZyb20gdGhlIHRocmVhZCBhbmQgcmVsZWFzZSByZXNvdXJjZS4gVW5oYW5kbGVkIGV2ZW50cyB3aWxsIGJlIGRpc2NhcmRlZCBhbmQgbm90IGV4ZWN1dGVkLgotICB2aXJ0dWFsIH5IYW5kbGVyKCk7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEhhbmRsZXIpOwotCi0gIC8vIEVucXVldWUgYSBjbG9zdXJlIHRvIHRoZSBxdWV1ZSBvZiB0aGlzIGhhbmRsZXIKLSAgdmlydHVhbCB2b2lkIFBvc3QoY29tbW9uOjpPbmNlQ2xvc3VyZSBjbG9zdXJlKSBvdmVycmlkZTsKLQotICAvLyBSZW1vdmUgYWxsIHBlbmRpbmcgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIG9mIHRoaXMgaGFuZGxlcgotICB2b2lkIENsZWFyKCk7Ci0KLSAgLy8gRGllIGlmIHRoZSBjdXJyZW50IHJlYWN0YWJsZSBkb2Vzbid0IHN0b3AgYmVmb3JlIHRoZSB0aW1lb3V0LiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQ2xlYXIoKQotICB2b2lkIFdhaXRVbnRpbFN0b3BwZWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3RvciwgdHlwZW5hbWUuLi4gQXJncz4KLSAgdm9pZCBDYWxsKEZ1bmN0b3ImJiBmdW5jdG9yLCBBcmdzJiYuLi4gYXJncykgewotICAgIFBvc3QoY29tbW9uOjpCaW5kT25jZShzdGQ6OmZvcndhcmQ8RnVuY3Rvcj4oZnVuY3RvciksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIHZvaWQgQ2FsbE9uKFQqIG9iaiwgRnVuY3RvciYmIGZ1bmN0b3IsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgUG9zdChjb21tb246OkJpbmRPbmNlKHN0ZDo6Zm9yd2FyZDxGdW5jdG9yPihmdW5jdG9yKSwgY29tbW9uOjpVbnJldGFpbmVkKG9iaiksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazxjb21tb246Ok1ha2VVbmJvdW5kUnVuVHlwZTxGdW5jdG9yLCBBcmdzLi4uPj4gQmluZE9uY2UoCi0gICAgICBGdW5jdG9yJiYgZnVuY3RvciwgQXJncyYmLi4uIGFyZ3MpIHsKLSAgICByZXR1cm4gY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPGNvbW1vbjo6TWFrZVVuYm91bmRSdW5UeXBlPEZ1bmN0b3IsIEFyZ3MuLi4+PigKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZShzdGQ6OmZvcndhcmQ8RnVuY3Rvcj4oZnVuY3RvciksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLiksIHRoaXMpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazxjb21tb246Ok1ha2VVbmJvdW5kUnVuVHlwZTxGdW5jdG9yLCBULCBBcmdzLi4uPj4gQmluZE9uY2VPbigKLSAgICAgIFQqIG9iaiwgRnVuY3RvciYmIGZ1bmN0b3IsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgcmV0dXJuIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazxjb21tb246Ok1ha2VVbmJvdW5kUnVuVHlwZTxGdW5jdG9yLCBULCBBcmdzLi4uPj4oCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2Uoc3RkOjpmb3J3YXJkPEZ1bmN0b3I+KGZ1bmN0b3IpLCBjb21tb246OlVucmV0YWluZWQob2JqKSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSwgdGhpcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3RvciwgdHlwZW5hbWUuLi4gQXJncz4KLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8Y29tbW9uOjpNYWtlVW5ib3VuZFJ1blR5cGU8RnVuY3RvciwgQXJncy4uLj4+IEJpbmQoRnVuY3RvciYmIGZ1bmN0b3IsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgcmV0dXJuIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPGNvbW1vbjo6TWFrZVVuYm91bmRSdW5UeXBlPEZ1bmN0b3IsIEFyZ3MuLi4+PigKLSAgICAgICAgY29tbW9uOjpCaW5kKHN0ZDo6Zm9yd2FyZDxGdW5jdG9yPihmdW5jdG9yKSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSwgdGhpcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3RvciwgdHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8Y29tbW9uOjpNYWtlVW5ib3VuZFJ1blR5cGU8RnVuY3RvciwgVCwgQXJncy4uLj4+IEJpbmRPbigKLSAgICAgIFQqIG9iaiwgRnVuY3RvciYmIGZ1bmN0b3IsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgcmV0dXJuIGNvbW1vbjo6Q29udGV4dHVhbENhbGxiYWNrPGNvbW1vbjo6TWFrZVVuYm91bmRSdW5UeXBlPEZ1bmN0b3IsIFQsIEFyZ3MuLi4+PigKLSAgICAgICAgY29tbW9uOjpCaW5kKHN0ZDo6Zm9yd2FyZDxGdW5jdG9yPihmdW5jdG9yKSwgY29tbW9uOjpVbnJldGFpbmVkKG9iaiksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLiksIHRoaXMpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGZyaWVuZCBjbGFzcyBRdWV1ZTsKLQotICBmcmllbmQgY2xhc3MgQWxhcm07Ci0KLSAgZnJpZW5kIGNsYXNzIFJlcGVhdGluZ0FsYXJtOwotCi0gcHJpdmF0ZToKLSAgaW5saW5lIGJvb2wgd2FzX2NsZWFyZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRhc2tzXyA9PSBudWxscHRyOwotICB9OwotICBzdGQ6OnF1ZXVlPGNvbW1vbjo6T25jZUNsb3N1cmU+KiB0YXNrc187Ci0gIFRocmVhZCogdGhyZWFkXzsKLSAgaW50IGZkXzsKLSAgUmVhY3Rvcjo6UmVhY3RhYmxlKiByZWFjdGFibGVfOwotICBtdXRhYmxlIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICB2b2lkIGhhbmRsZV9uZXh0X2V2ZW50KCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2hvc3QvbWV0cmljcy5jYyBiL2dkL29zL2hvc3QvbWV0cmljcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1NDY2ZC4uMDAwMDAwMAotLS0gYS9nZC9vcy9ob3N0L21ldHJpY3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib3MvbWV0cmljcy5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotCi12b2lkIExvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwKLSAgICB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgdWludDE2X3QgY21kX3N0YXR1cywKLSAgICB1aW50MTZfdCByZWFzb25fY29kZSwKLSAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7fQotCi12b2lkIExvZ01ldHJpY1NvY2tldENvbm5lY3Rpb25TdGF0ZSgKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLAotICAgIGludCBwb3J0LAotICAgIGludCB0eXBlLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Q29ubmVjdGlvbnN0YXRlRW51bSBjb25uZWN0aW9uX3N0YXRlLAotICAgIGludDY0X3QgdHhfYnl0ZXMsCi0gICAgaW50NjRfdCByeF9ieXRlcywKLSAgICBpbnQgdWlkLAotICAgIGludCBzZXJ2ZXJfcG9ydCwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlKSB7fQotCi12b2lkIExvZ01ldHJpY0hjaVRpbWVvdXRFdmVudCh1aW50MzJfdCBoY2lfY21kKSB7fQotCi12b2lkIExvZ01ldHJpY0EyZHBBdWRpb1VuZGVycnVuRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBpbnQgbnVtX21pc3NpbmdfcGNtX2J5dGVzKSB7fQotCi12b2lkIExvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudCgKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLAotICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICBpbnQgbnVtX2Ryb3BwZWRfYnVmZmVycywKLSAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsCi0gICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMpIHt9Ci0KLXZvaWQgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQoY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSkge30KLQotdm9pZCBMb2dNZXRyaWNSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJSZXN1bHQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpIHt9Ci0KLXZvaWQgTG9nTWV0cmljUmVhZFR4UG93ZXJMZXZlbFJlc3VsdCgKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGNtZF9zdGF0dXMsIGludDMyX3QgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpIHt9Ci0KLXZvaWQgTG9nTWV0cmljUmVtb3RlVmVyc2lvbkluZm8oCi0gICAgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDhfdCB2ZXJzaW9uLCB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3VidmVyc2lvbikge30KLQotdm9pZCBMb2dNZXRyaWNMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyogYWRkcmVzcywKLSAgICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgIHVpbnQxNl90IGxpbmtfdHlwZSwKLSAgICB1aW50MzJfdCBoY2lfY21kLAotICAgIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICB1aW50MTZfdCBoY2lfYmxlX2V2ZW50LAotICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0gICAgdWludDE2X3QgcmVhc29uX2NvZGUpIHt9Ci0KLXZvaWQgTG9nTWV0cmljTWFudWZhY3R1cmVySW5mbygKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7fQotCi12b2lkIExvZ01ldHJpY1NkcEF0dHJpYnV0ZSgKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLAotICAgIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgdWludDE2X3QgYXR0cmlidXRlX2lkLAotICAgIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICBjb25zdCBjaGFyKiBhdHRyaWJ1dGVfdmFsdWUpIHt9Ci0KLXZvaWQgTG9nTWV0cmljU21wUGFpcmluZ0V2ZW50KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pIHt9Ci0KLXZvaWQgTG9nTWV0cmljQTJkcFBsYXliYWNrRXZlbnQoY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgaW50IHBsYXliYWNrX3N0YXRlLCBpbnQgYXVkaW9fY29kaW5nX21vZGUpIHt9Ci0KLXZvaWQgTG9nTWV0cmljQmx1ZXRvb3RoSGFsQ3Jhc2hSZWFzb24oCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDMyX3QgZXJyb3JfY29kZSwgdWludDMyX3QgdmVuZG9yX2Vycm9yX2NvZGUpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvaG9zdC9wYXJhbWV0ZXJfcHJvdmlkZXIuY2MgYi9nZC9vcy9ob3N0L3BhcmFtZXRlcl9wcm92aWRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1Y2E0Yi4uMDAwMDAwMAotLS0gYS9nZC9vcy9ob3N0L3BhcmFtZXRlcl9wcm92aWRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1uYW1lc3BhY2Ugewotc3RkOjptdXRleCBwYXJhbWV0ZXJfbXV0ZXg7Ci1zdGQ6OnN0cmluZyBjb25maWdfZmlsZV9wYXRoOwotc3RkOjpzdHJpbmcgc25vb3BfbG9nX2ZpbGVfcGF0aDsKLXN0ZDo6c3RyaW5nIHNub296X2xvZ19maWxlX3BhdGg7Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gV3JpdGUgdG8gJFBXRC9idF9zdGFjay5jb25mIGlmICRQV0QgY2FuIGJlIGZvdW5kLCBvdGhlcndpc2UsIHdyaXRlIHRvICRIT01FL2J0X3N0YWNrLmNvbmYKLXN0ZDo6c3RyaW5nIFBhcmFtZXRlclByb3ZpZGVyOjpDb25maWdGaWxlUGF0aCgpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gICAgaWYgKCFjb25maWdfZmlsZV9wYXRoLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBjb25maWdfZmlsZV9wYXRoOwotICAgIH0KLSAgfQotICBjaGFyIGN3ZFtQQVRIX01BWF0gPSB7fTsKLSAgaWYgKGdldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZHVlIHRvIFwiJXNcIiwgcmV0dXJuaW5nIGRlZmF1bHQiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAiYnRfY29uZmlnLmNvbmYiOwotICB9Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhjd2QpICsgIi9idF9jb25maWcuY29uZiI7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6Ok92ZXJyaWRlQ29uZmlnRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socGFyYW1ldGVyX211dGV4KTsKLSAgY29uZmlnX2ZpbGVfcGF0aCA9IHBhdGg7Ci19Ci0KLXN0ZDo6c3RyaW5nIFBhcmFtZXRlclByb3ZpZGVyOjpTbm9vcExvZ0ZpbGVQYXRoKCkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socGFyYW1ldGVyX211dGV4KTsKLSAgICBpZiAoIXNub29wX2xvZ19maWxlX3BhdGguZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHNub29wX2xvZ19maWxlX3BhdGg7Ci0gICAgfQotICB9Ci0gIGNoYXIgY3dkW1BBVEhfTUFYXSA9IHt9OwotICBpZiAoZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBkdWUgdG8gXCIlc1wiLCByZXR1cm5pbmcgZGVmYXVsdCIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuICJidHNub29wX2hjaS5sb2ciOwotICB9Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhjd2QpICsgIi9idHNub29wX2hjaS5sb2ciOwotfQotCi12b2lkIFBhcmFtZXRlclByb3ZpZGVyOjpPdmVycmlkZVNub29wTG9nRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socGFyYW1ldGVyX211dGV4KTsKLSAgc25vb3BfbG9nX2ZpbGVfcGF0aCA9IHBhdGg7Ci19Ci0KLS8vIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZGVmYXVsdCBzbm9veiBsb2cgZmlsZSBsb2NhdGlvbgotc3RkOjpzdHJpbmcgUGFyYW1ldGVyUHJvdmlkZXI6OlNub296TG9nRmlsZVBhdGgoKSB7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwYXJhbWV0ZXJfbXV0ZXgpOwotICAgIGlmICghc25vb3pfbG9nX2ZpbGVfcGF0aC5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gc25vb3pfbG9nX2ZpbGVfcGF0aDsKLSAgICB9Ci0gIH0KLSAgY2hhciBjd2RbUEFUSF9NQVhdID0ge307Ci0gIGlmIChnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkgPT0gbnVsbHB0cikgewotICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGR1ZSB0byBcIiVzXCIsIHJldHVybmluZyBkZWZhdWx0Iiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gImJ0X2NvbmZpZy5jb25mIjsKLSAgfQotICByZXR1cm4gc3RkOjpzdHJpbmcoY3dkKSArICIvYnRzbm9vel9oY2kubG9nIjsKLX0KLQotdm9pZCBQYXJhbWV0ZXJQcm92aWRlcjo6T3ZlcnJpZGVTbm9vekxvZ0ZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gIHNub296X2xvZ19maWxlX3BhdGggPSBwYXRoOwotfQotCi1ibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6OlNldEJ0S2V5c3RvcmVJbnRlcmZhY2UoYmx1ZXRvb3RoX2tleXN0b3JlOjpCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSogYnRfa2V5c3RvcmUpIHt9Ci0KLWJvb2wgUGFyYW1ldGVyUHJvdmlkZXI6OklzQ29tbW9uQ3JpdGVyaWFNb2RlKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6OlNldENvbW1vbkNyaXRlcmlhTW9kZShib29sIGVuYWJsZSkge30KLQotaW50IFBhcmFtZXRlclByb3ZpZGVyOjpHZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoKSB7Ci0gIHJldHVybiAwYjExOwotfQotCi12b2lkIFBhcmFtZXRlclByb3ZpZGVyOjpTZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoaW50IHJlc3VsdCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvaG9zdC9zeXN0ZW1fcHJvcGVydGllcy5jYyBiL2dkL29zL2hvc3Qvc3lzdGVtX3Byb3BlcnRpZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWYxNTkuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvaG9zdC9zeXN0ZW1fcHJvcGVydGllcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJvcy9zeXN0ZW1fcHJvcGVydGllcy5oIgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotbmFtZXNwYWNlIHsKLXN0ZDo6bXV0ZXggcHJvcGVydGllc19tdXRleDsKLXN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHByb3BlcnRpZXM7Ci19ICAvLyBuYW1lc3BhY2UKLQotc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gR2V0U3lzdGVtUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHByb3BlcnRpZXNfbXV0ZXgpOwotICBhdXRvIGl0ZXIgPSBwcm9wZXJ0aWVzLmZpbmQocHJvcGVydHkpOwotICBpZiAoaXRlciA9PSBwcm9wZXJ0aWVzLmVuZCgpKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICByZXR1cm4gaXRlci0+c2Vjb25kOwotfQotCi1ib29sIFNldFN5c3RlbVByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHByb3BlcnRpZXNfbXV0ZXgpOwotICBwcm9wZXJ0aWVzLmluc2VydF9vcl9hc3NpZ24ocHJvcGVydHksIHZhbHVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ2xlYXJTeXN0ZW1Qcm9wZXJ0aWVzRm9ySG9zdCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socHJvcGVydGllc19tdXRleCk7Ci0gIHByb3BlcnRpZXMuY2xlYXIoKTsKLX0KLQotYm9vbCBJc1Jvb3RDYW5hbEVuYWJsZWQoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50IEdldEFuZHJvaWRWZW5kb3JSZWxlYXNlVmVyc2lvbigpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL29zL2hvc3Qvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYyBiL2dkL29zL2hvc3Qvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4Y2I5YS4uMDAwMDAwMAotLS0gYS9nZC9vcy9ob3N0L3N5c3RlbV9wcm9wZXJ0aWVzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIm9zL3N5c3RlbV9wcm9wZXJ0aWVzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpvczo6Q2xlYXJTeXN0ZW1Qcm9wZXJ0aWVzRm9ySG9zdDsKLXVzaW5nIGJsdWV0b290aDo6b3M6OkdldFN5c3RlbVByb3BlcnR5OwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6U2V0U3lzdGVtUHJvcGVydHk7Ci0KLVRFU1QoU3lzdGVtUHJvcGVydGllc1Rlc3QsIHNldF9hbmRfZ2V0X3Rlc3QpIHsKLSAgQVNTRVJUX1RSVUUoU2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsICJ0cnVlIikpOwotICBhdXRvIHJldCA9IEdldFN5c3RlbVByb3BlcnR5KCJwZXJzaXN0LmJsdWV0b290aC5mYWN0b3J5cmVzZXQiKTsKLSAgQVNTRVJUX1RSVUUocmV0KTsKLSAgQVNTRVJUX0VRKHJldCwgInRydWUiKTsKLSAgQVNTRVJUX1RSVUUoU2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIsICJmYWxzZSIpKTsKLSAgcmV0ID0gR2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIpOwotICBBU1NFUlRfVFJVRShyZXQpOwotICBBU1NFUlRfRVEocmV0LCAiZmFsc2UiKTsKLSAgcmV0ID0gR2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldF9kb19ub3RfZXhpc3QiKTsKLSAgQVNTRVJUX0ZBTFNFKHJldCk7Ci0gIENsZWFyU3lzdGVtUHJvcGVydGllc0Zvckhvc3QoKTsKLSAgQVNTRVJUX0ZBTFNFKEdldFN5c3RlbVByb3BlcnR5KCJwZXJzaXN0LmJsdWV0b290aC5mYWN0b3J5cmVzZXQiKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvaG9zdC93YWtlbG9ja19uYXRpdmUuY2MgYi9nZC9vcy9ob3N0L3dha2Vsb2NrX25hdGl2ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3M2NmNC4uMDAwMDAwMAotLS0gYS9nZC9vcy9ob3N0L3dha2Vsb2NrX25hdGl2ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJCdEdkV2FrZWxvY2tOYXRpdmUiCi0KLSNpbmNsdWRlICJvcy9pbnRlcm5hbC93YWtlbG9ja19uYXRpdmUuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RydWN0IFdha2Vsb2NrTmF0aXZlOjpJbXBsIHt9OwotCi12b2lkIFdha2Vsb2NrTmF0aXZlOjpJbml0aWFsaXplKCkgewotICBMT0dfSU5GTygiSG9zdCBuYXRpdmUgd2FrZWxvY2sgaXMgbm90IGltcGxlbWVudGVkIik7Ci19Ci0KLVdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlIFdha2Vsb2NrTmF0aXZlOjpBY3F1aXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpIHsKLSAgTE9HX0lORk8oIkhvc3QgbmF0aXZlIHdha2Vsb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotICByZXR1cm4gU3RhdHVzQ29kZTo6U1VDQ0VTUzsKLX0KLQotV2FrZWxvY2tOYXRpdmU6OlN0YXR1c0NvZGUgV2FrZWxvY2tOYXRpdmU6OlJlbGVhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGxvY2tfbmFtZSkgewotICBMT0dfSU5GTygiSG9zdCBuYXRpdmUgd2FrZWxvY2sgaXMgbm90IGltcGxlbWVudGVkIik7Ci0gIHJldHVybiBTdGF0dXNDb2RlOjpTVUNDRVNTOwotfQotdm9pZCBXYWtlbG9ja05hdGl2ZTo6Q2xlYW5VcCgpIHsKLSAgTE9HX0lORk8oIkhvc3QgbmF0aXZlIHdha2Vsb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotfQotCi1XYWtlbG9ja05hdGl2ZTo6V2FrZWxvY2tOYXRpdmUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPEltcGw+KCkpIHt9Ci0KLVdha2Vsb2NrTmF0aXZlOjp+V2FrZWxvY2tOYXRpdmUoKSA9IGRlZmF1bHQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvaW50ZXJuYWwvd2FrZWxvY2tfbmF0aXZlLmggYi9nZC9vcy9pbnRlcm5hbC93YWtlbG9ja19uYXRpdmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiZDZjZS4uMDAwMDAwMAotLS0gYS9nZC9vcy9pbnRlcm5hbC93YWtlbG9ja19uYXRpdmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIERPIE5PVCBVU0UgT1VUU0lERSBvcy8KLS8vIE5hdGl2ZSB3YWtlbG9jayBBUElzIGltcGxlbWVudGVkIGJ5IGVhY2ggYXJjaGl0ZWN0dXJlLCBub3QgcHVibGljIEFQSXMKLWNsYXNzIFdha2Vsb2NrTmF0aXZlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBXYWtlbG9ja05hdGl2ZSYgR2V0KCkgewotICAgIHN0YXRpYyBXYWtlbG9ja05hdGl2ZSBpbnN0YW5jZTsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgZW51bSBTdGF0dXNDb2RlIDogdWludDhfdCB7IFNVQ0NFU1MgPSAwLCBOQVRJVkVfU0VSVklDRV9OT1RfQVZBSUxBQkxFID0gMSwgTkFUSVZFX0FQSV9FUlJPUiA9IDIgfTsKLSAgdm9pZCBJbml0aWFsaXplKCk7Ci0gIFN0YXR1c0NvZGUgQWNxdWlyZShjb25zdCBzdGQ6OnN0cmluZyYgbG9ja19uYW1lKTsKLSAgU3RhdHVzQ29kZSBSZWxlYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpOwotICB2b2lkIENsZWFuVXAoKTsKLQotICB+V2FrZWxvY2tOYXRpdmUoKTsKLQotIHByaXZhdGU6Ci0gIFdha2Vsb2NrTmF0aXZlKCk7Ci0gIHN0cnVjdCBJbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gcGltcGxfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eC9tZXRyaWNzLmNjIGIvZ2Qvb3MvbGludXgvbWV0cmljcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1NDY2ZC4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eC9tZXRyaWNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9zL21ldHJpY3MuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLQotdm9pZCBMb2dNZXRyaWNDbGFzc2ljUGFpcmluZ0V2ZW50KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsCi0gICAgdWludDE2X3QgaGFuZGxlLAotICAgIHVpbnQzMl90IGhjaV9jbWQsCi0gICAgdWludDE2X3QgaGNpX2V2ZW50LAotICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0gICAgdWludDE2X3QgcmVhc29uX2NvZGUsCi0gICAgaW50NjRfdCBldmVudF92YWx1ZSkge30KLQotdm9pZCBMb2dNZXRyaWNTb2NrZXRDb25uZWN0aW9uU3RhdGUoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICBpbnQgcG9ydCwKLSAgICBpbnQgdHlwZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW0gY29ubmVjdGlvbl9zdGF0ZSwKLSAgICBpbnQ2NF90IHR4X2J5dGVzLAotICAgIGludDY0X3QgcnhfYnl0ZXMsCi0gICAgaW50IHVpZCwKLSAgICBpbnQgc2VydmVyX3BvcnQsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRSb2xlRW51bSBzb2NrZXRfcm9sZSkge30KLQotdm9pZCBMb2dNZXRyaWNIY2lUaW1lb3V0RXZlbnQodWludDMyX3QgaGNpX2NtZCkge30KLQotdm9pZCBMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywgaW50IG51bV9taXNzaW5nX3BjbV9ieXRlcykge30KLQotdm9pZCBMb2dNZXRyaWNBMmRwQXVkaW9PdmVycnVuRXZlbnQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKSB7fQotCi12b2lkIExvZ01ldHJpY1JlYWRSc3NpUmVzdWx0KGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywgaW50OF90IHJzc2kpIHt9Ci0KLXZvaWQgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywgaW50MzJfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSB7fQotCi12b2lkIExvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7fQotCi12b2lkIExvZ01ldHJpY1JlbW90ZVZlcnNpb25JbmZvKAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgdmVyc2lvbiwgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1YnZlcnNpb24pIHt9Ci0KLXZvaWQgTG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgIGNvbnN0IEFkZHJlc3MqIGFkZHJlc3MsCi0gICAgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwKLSAgICB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICB1aW50MTZfdCBjbWRfc3RhdHVzLAotICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlKSB7fQotCi12b2lkIExvZ01ldHJpY01hbnVmYWN0dXJlckluZm8oCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgaGFyZHdhcmVfdmVyc2lvbiwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbikge30KLQotdm9pZCBMb2dNZXRyaWNTZHBBdHRyaWJ1dGUoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICB1aW50MTZfdCBwcm90b2NvbF91dWlkLAotICAgIHVpbnQxNl90IGF0dHJpYnV0ZV9pZCwKLSAgICBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgY29uc3QgY2hhciogYXR0cmlidXRlX3ZhbHVlKSB7fQotCi12b2lkIExvZ01ldHJpY1NtcFBhaXJpbmdFdmVudCgKLSAgICBjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sIHVpbnQ4X3Qgc21wX2ZhaWxfcmVhc29uKSB7fQotCi12b2lkIExvZ01ldHJpY0EyZHBQbGF5YmFja0V2ZW50KGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIGludCBwbGF5YmFja19zdGF0ZSwgaW50IGF1ZGlvX2NvZGluZ19tb2RlKSB7fQotCi12b2lkIExvZ01ldHJpY0JsdWV0b290aEhhbENyYXNoUmVhc29uKAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIHVpbnQzMl90IGVycm9yX2NvZGUsIHVpbnQzMl90IHZlbmRvcl9lcnJvcl9jb2RlKSB7fQotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4L3BhcmFtZXRlcl9wcm92aWRlci5jYyBiL2dkL29zL2xpbnV4L3BhcmFtZXRlcl9wcm92aWRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxNDRhZS4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eC9wYXJhbWV0ZXJfcHJvdmlkZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1uYW1lc3BhY2Ugewotc3RkOjptdXRleCBwYXJhbWV0ZXJfbXV0ZXg7Ci1zdGQ6OnN0cmluZyBjb25maWdfZmlsZV9wYXRoOwotc3RkOjpzdHJpbmcgc25vb3BfbG9nX2ZpbGVfcGF0aDsKLXN0ZDo6c3RyaW5nIHNub296X2xvZ19maWxlX3BhdGg7Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gV3JpdGUgdG8gJFBXRC9idF9zdGFjay5jb25mIGlmICRQV0QgY2FuIGJlIGZvdW5kLCBvdGhlcndpc2UsIHdyaXRlIHRvICRIT01FL2J0X3N0YWNrLmNvbmYKLXN0ZDo6c3RyaW5nIFBhcmFtZXRlclByb3ZpZGVyOjpDb25maWdGaWxlUGF0aCgpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gICAgaWYgKCFjb25maWdfZmlsZV9wYXRoLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBjb25maWdfZmlsZV9wYXRoOwotICAgIH0KLSAgfQotICByZXR1cm4gIi92YXIvbGliL2JsdWV0b290aC9idF9jb25maWcuY29uZiI7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6Ok92ZXJyaWRlQ29uZmlnRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socGFyYW1ldGVyX211dGV4KTsKLSAgY29uZmlnX2ZpbGVfcGF0aCA9IHBhdGg7Ci19Ci0KLXN0ZDo6c3RyaW5nIFBhcmFtZXRlclByb3ZpZGVyOjpTbm9vcExvZ0ZpbGVQYXRoKCkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socGFyYW1ldGVyX211dGV4KTsKLSAgICBpZiAoIXNub29wX2xvZ19maWxlX3BhdGguZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHNub29wX2xvZ19maWxlX3BhdGg7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuICIvdmFyL2xvZy9ibHVldG9vdGgvYnRzbm9vcF9oY2kubG9nIjsKLX0KLQotdm9pZCBQYXJhbWV0ZXJQcm92aWRlcjo6T3ZlcnJpZGVTbm9vcExvZ0ZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gIHNub29wX2xvZ19maWxlX3BhdGggPSBwYXRoOwotfQotCi1zdGQ6OnN0cmluZyBQYXJhbWV0ZXJQcm92aWRlcjo6U25vb3pMb2dGaWxlUGF0aCgpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHBhcmFtZXRlcl9tdXRleCk7Ci0gICAgaWYgKCFzbm9vel9sb2dfZmlsZV9wYXRoLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBzbm9vel9sb2dfZmlsZV9wYXRoOwotICAgIH0KLSAgfQotICByZXR1cm4gIi92YXIvbG9nL2JsdWV0b290aC9idHNub296X2hjaS5sb2ciOwotfQotCi1ibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6OlNldEJ0S2V5c3RvcmVJbnRlcmZhY2UoYmx1ZXRvb3RoX2tleXN0b3JlOjpCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSogYnRfa2V5c3RvcmUpIHt9Ci0KLWJvb2wgUGFyYW1ldGVyUHJvdmlkZXI6OklzQ29tbW9uQ3JpdGVyaWFNb2RlKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyUHJvdmlkZXI6OlNldENvbW1vbkNyaXRlcmlhTW9kZShib29sIGVuYWJsZSkge30KLQotaW50IFBhcmFtZXRlclByb3ZpZGVyOjpHZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoKSB7Ci0gIHJldHVybiAwYjExOwotfQotCi12b2lkIFBhcmFtZXRlclByb3ZpZGVyOjpTZXRDb21tb25Dcml0ZXJpYUNvbmZpZ0NvbXBhcmVSZXN1bHQoaW50IHJlc3VsdCkge30KLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eC9zeXN0ZW1fcHJvcGVydGllcy5jYyBiL2dkL29zL2xpbnV4L3N5c3RlbV9wcm9wZXJ0aWVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjlmMTU5Li4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4L3N5c3RlbV9wcm9wZXJ0aWVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zL3N5c3RlbV9wcm9wZXJ0aWVzLmgiCi0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1uYW1lc3BhY2Ugewotc3RkOjptdXRleCBwcm9wZXJ0aWVzX211dGV4Owotc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcHJvcGVydGllczsKLX0gIC8vIG5hbWVzcGFjZQotCi1zdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBHZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socHJvcGVydGllc19tdXRleCk7Ci0gIGF1dG8gaXRlciA9IHByb3BlcnRpZXMuZmluZChwcm9wZXJ0eSk7Ci0gIGlmIChpdGVyID09IHByb3BlcnRpZXMuZW5kKCkpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci19Ci0KLWJvb2wgU2V0U3lzdGVtUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2socHJvcGVydGllc19tdXRleCk7Ci0gIHByb3BlcnRpZXMuaW5zZXJ0X29yX2Fzc2lnbihwcm9wZXJ0eSwgdmFsdWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDbGVhclN5c3RlbVByb3BlcnRpZXNGb3JIb3N0KCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhwcm9wZXJ0aWVzX211dGV4KTsKLSAgcHJvcGVydGllcy5jbGVhcigpOwotfQotCi1ib29sIElzUm9vdENhbmFsRW5hYmxlZCgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgR2V0QW5kcm9pZFZlbmRvclJlbGVhc2VWZXJzaW9uKCkgewotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXgvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYyBiL2dkL29zL2xpbnV4L3N5c3RlbV9wcm9wZXJ0aWVzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGNiOWEuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXgvc3lzdGVtX3Byb3BlcnRpZXNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAib3Mvc3lzdGVtX3Byb3BlcnRpZXMuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6Om9zOjpDbGVhclN5c3RlbVByb3BlcnRpZXNGb3JIb3N0OwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6R2V0U3lzdGVtUHJvcGVydHk7Ci11c2luZyBibHVldG9vdGg6Om9zOjpTZXRTeXN0ZW1Qcm9wZXJ0eTsKLQotVEVTVChTeXN0ZW1Qcm9wZXJ0aWVzVGVzdCwgc2V0X2FuZF9nZXRfdGVzdCkgewotICBBU1NFUlRfVFJVRShTZXRTeXN0ZW1Qcm9wZXJ0eSgicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0IiwgInRydWUiKSk7Ci0gIGF1dG8gcmV0ID0gR2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIpOwotICBBU1NFUlRfVFJVRShyZXQpOwotICBBU1NFUlRfRVEocmV0LCAidHJ1ZSIpOwotICBBU1NFUlRfVFJVRShTZXRTeXN0ZW1Qcm9wZXJ0eSgicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0IiwgImZhbHNlIikpOwotICByZXQgPSBHZXRTeXN0ZW1Qcm9wZXJ0eSgicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0Iik7Ci0gIEFTU0VSVF9UUlVFKHJldCk7Ci0gIEFTU0VSVF9FUShyZXQsICJmYWxzZSIpOwotICByZXQgPSBHZXRTeXN0ZW1Qcm9wZXJ0eSgicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0X2RvX25vdF9leGlzdCIpOwotICBBU1NFUlRfRkFMU0UocmV0KTsKLSAgQ2xlYXJTeXN0ZW1Qcm9wZXJ0aWVzRm9ySG9zdCgpOwotICBBU1NFUlRfRkFMU0UoR2V0U3lzdGVtUHJvcGVydHkoInBlcnNpc3QuYmx1ZXRvb3RoLmZhY3RvcnlyZXNldCIpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eC93YWtlbG9ja19uYXRpdmUuY2MgYi9nZC9vcy9saW51eC93YWtlbG9ja19uYXRpdmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OGQ3NWMuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXgvd2FrZWxvY2tfbmF0aXZlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgIkJ0R2RXYWtlbG9ja05hdGl2ZSIKLQotI2luY2x1ZGUgIm9zL2ludGVybmFsL3dha2Vsb2NrX25hdGl2ZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdHJ1Y3QgV2FrZWxvY2tOYXRpdmU6OkltcGwge307Ci0KLXZvaWQgV2FrZWxvY2tOYXRpdmU6OkluaXRpYWxpemUoKSB7Ci0gIExPR19JTkZPKCJMaW51eCBuYXRpdmUgd2FrZWxvY2sgaXMgbm90IGltcGxlbWVudGVkIik7Ci19Ci0KLVdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlIFdha2Vsb2NrTmF0aXZlOjpBY3F1aXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpIHsKLSAgTE9HX0lORk8oIkxpbnV4IG5hdGl2ZSB3YWtlbG9jayBpcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgcmV0dXJuIFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci19Ci0KLVdha2Vsb2NrTmF0aXZlOjpTdGF0dXNDb2RlIFdha2Vsb2NrTmF0aXZlOjpSZWxlYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpIHsKLSAgTE9HX0lORk8oIkxpbnV4IG5hdGl2ZSB3YWtlbG9jayBpcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgcmV0dXJuIFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci19Ci12b2lkIFdha2Vsb2NrTmF0aXZlOjpDbGVhblVwKCkgewotICBMT0dfSU5GTygiTGludXggbmF0aXZlIHdha2Vsb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotfQotCi1XYWtlbG9ja05hdGl2ZTo6V2FrZWxvY2tOYXRpdmUoKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPEltcGw+KCkpIHt9Ci0KLVdha2Vsb2NrTmF0aXZlOjp+V2FrZWxvY2tOYXRpdmUoKSA9IGRlZmF1bHQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9hbGFybS5jYyBiL2dkL29zL2xpbnV4X2dlbmVyaWMvYWxhcm0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODU5YjUuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9hbGFybS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJvcy9hbGFybS5oIgotCi0jaW5jbHVkZSA8c3lzL3RpbWVyZmQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgIm9zL2xpbnV4X2dlbmVyaWMvbGludXguaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy91dGlscy5oIgotCi0jaWZkZWYgT1NfQU5EUk9JRAotI2RlZmluZSBBTEFSTV9DTE9DSyBDTE9DS19CT09UVElNRV9BTEFSTQotI2Vsc2UKLSNkZWZpbmUgQUxBUk1fQ0xPQ0sgQ0xPQ0tfQk9PVFRJTUUKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci11c2luZyBjb21tb246OkNsb3N1cmU7Ci11c2luZyBjb21tb246Ok9uY2VDbG9zdXJlOwotCi1BbGFybTo6QWxhcm0oSGFuZGxlciogaGFuZGxlcikgOiBoYW5kbGVyXyhoYW5kbGVyKSwgZmRfKFRJTUVSRkRfQ1JFQVRFKEFMQVJNX0NMT0NLLCAwKSkgewotICBBU1NFUlRfTE9HKGZkXyAhPSAtMSwgImNhbm5vdCBjcmVhdGUgdGltZXJmZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotCi0gIHRva2VuXyA9IGhhbmRsZXJfLT50aHJlYWRfLT5HZXRSZWFjdG9yKCktPlJlZ2lzdGVyKAotICAgICAgZmRfLCBjb21tb246OkJpbmQoJkFsYXJtOjpvbl9maXJlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLCBDbG9zdXJlKCkpOwotfQotCi1BbGFybTo6fkFsYXJtKCkgewotICBoYW5kbGVyXy0+dGhyZWFkXy0+R2V0UmVhY3RvcigpLT5VbnJlZ2lzdGVyKHRva2VuXyk7Ci0KLSAgaW50IGNsb3NlX3N0YXR1czsKLSAgUlVOX05PX0lOVFIoY2xvc2Vfc3RhdHVzID0gVElNRVJGRF9DTE9TRShmZF8pKTsKLSAgQVNTRVJUKGNsb3NlX3N0YXR1cyAhPSAtMSk7Ci19Ci0KLXZvaWQgQWxhcm06OlNjaGVkdWxlKE9uY2VDbG9zdXJlIHRhc2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZGVsYXkpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgbG9uZyBkZWxheV9tcyA9IGRlbGF5LmNvdW50KCk7Ci0gIGl0aW1lcnNwZWMgdGltZXJfaXRpbWVyc3BlY3t7LyogaW50ZXJ2YWwgZm9yIHBlcmlvZGljIHRpbWVyICovfSwge2RlbGF5X21zIC8gMTAwMCwgZGVsYXlfbXMgJSAxMDAwICogMTAwMDAwMH19OwotICBpbnQgcmVzdWx0ID0gVElNRVJGRF9TRVRUSU1FKGZkXywgMCwgJnRpbWVyX2l0aW1lcnNwZWMsIG51bGxwdHIpOwotICBBU1NFUlQocmVzdWx0ID09IDApOwotCi0gIHRhc2tfID0gc3RkOjptb3ZlKHRhc2spOwotfQotCi12b2lkIEFsYXJtOjpDYW5jZWwoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGl0aW1lcnNwZWMgZGlzYXJtX2l0aW1lcnNwZWN7LyogZGlzYXJtIHRpbWVyICovfTsKLSAgaW50IHJlc3VsdCA9IFRJTUVSRkRfU0VUVElNRShmZF8sIDAsICZkaXNhcm1faXRpbWVyc3BlYywgbnVsbHB0cik7Ci0gIEFTU0VSVChyZXN1bHQgPT0gMCk7Ci19Ci0KLXZvaWQgQWxhcm06Om9uX2ZpcmUoKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBhdXRvIHRhc2sgPSBzdGQ6Om1vdmUodGFza18pOwotICB1aW50NjRfdCB0aW1lc19pbnZva2VkOwotICBhdXRvIGJ5dGVzX3JlYWQgPSByZWFkKGZkXywgJnRpbWVzX2ludm9rZWQsIHNpemVvZih1aW50NjRfdCkpOwotICBsb2NrLnVubG9jaygpOwotICBzdGQ6Om1vdmUodGFzaykuUnVuKCk7Ci0gIEFTU0VSVChieXRlc19yZWFkID09IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNpemVvZih1aW50NjRfdCkpKTsKLSAgQVNTRVJUKHRpbWVzX2ludm9rZWQgPT0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eF9nZW5lcmljL2FsYXJtX3VuaXR0ZXN0LmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9hbGFybV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0YTVlNS4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL2FsYXJtX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zL2FsYXJtLmgiCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIGNvbW1vbjo6QmluZE9uY2U7Ci0KLWNsYXNzIEFsYXJtVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGVzdF90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGhhbmRsZXJfID0gbmV3IEhhbmRsZXIodGhyZWFkXyk7Ci0gICAgYWxhcm1fID0gbmV3IEFsYXJtKGhhbmRsZXJfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIGFsYXJtXzsKLSAgICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLSAgQWxhcm0qIGFsYXJtXzsKLQotIHByaXZhdGU6Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotICBUaHJlYWQqIHRocmVhZF87Ci19OwotCi1URVNUX0YoQWxhcm1UZXN0LCBjYW5jZWxfd2hpbGVfbm90X2FybWVkKSB7Ci0gIGFsYXJtXy0+Q2FuY2VsKCk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIHNjaGVkdWxlKSB7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBhdXRvIGJlZm9yZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICBpbnQgZGVsYXlfbXMgPSAxMDsKLSAgaW50IGRlbGF5X2Vycm9yX21zID0gMzsKLSAgYWxhcm1fLT5TY2hlZHVsZSgKLSAgICAgIEJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfbXMpKTsKLSAgZnV0dXJlLmdldCgpOwotICBhdXRvIGFmdGVyID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIGF1dG8gZHVyYXRpb25fbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihhZnRlciAtIGJlZm9yZSk7Ci0gIEFTU0VSVF9ORUFSKGR1cmF0aW9uX21zLmNvdW50KCksIGRlbGF5X21zLCBkZWxheV9lcnJvcl9tcyk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIGNhbmNlbF9hbGFybSkgewotICBhbGFybV8tPlNjaGVkdWxlKEJpbmRPbmNlKFtdKCkgeyBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlNob3VsZCBub3QgaGFwcGVuIjsgfSksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMykpOwotICBhbGFybV8tPkNhbmNlbCgpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg1KSk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIGNhbmNlbF9hbGFybV9mcm9tX2NhbGxiYWNrKSB7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoQmluZE9uY2UoJkFsYXJtOjpDYW5jZWwsIGNvbW1vbjo6VW5yZXRhaW5lZChhbGFybV8pKSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKSk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUpKTsKLX0KLQotVEVTVF9GKEFsYXJtVGVzdCwgc2NoZWR1bGVfd2hpbGVfYWxhcm1fYXJtZWQpIHsKLSAgYWxhcm1fLT5TY2hlZHVsZShCaW5kT25jZShbXSgpIHsgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJTaG91bGQgbm90IGhhcHBlbiI7IH0pLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEpKTsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoCi0gICAgICBCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSk7Ci0gIGZ1dHVyZS5nZXQoKTsKLX0KLQotVEVTVF9GKEFsYXJtVGVzdCwgZGVsZXRlX3doaWxlX2FsYXJtX2FybWVkKSB7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoQmluZE9uY2UoW10oKSB7IEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiU2hvdWxkIG5vdCBoYXBwZW4iOyB9KSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKSk7Ci0gIGRlbGV0ZSBhbGFybV87Ci0gIGFsYXJtXyA9IG51bGxwdHI7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eF9nZW5lcmljL2ZpbGVzLmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9maWxlcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwMThiZi4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL2ZpbGVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJvcy9maWxlcy5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzdHJlYW1idWY+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgSGFuZGxlRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHRlbXBfcGF0aCwgaW50KiBkaXJfZmQsIEZJTEUqKiBmcCkgewotICAvLyBUaGlzIGluZGljYXRlcyB0aGVyZSBpcyBhIHdyaXRlIGlzc3VlLiAgVW5saW5rIGFzIHBhcnRpYWwgZGF0YSBpcyBub3QKLSAgLy8gYWNjZXB0YWJsZS4KLSAgdW5saW5rKHRlbXBfcGF0aC5jX3N0cigpKTsKLSAgaWYgKCpmcCkgewotICAgIGZjbG9zZSgqZnApOwotICAgICpmcCA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKCpkaXJfZmQgIT0gLTEpIHsKLSAgICBjbG9zZSgqZGlyX2ZkKTsKLSAgICAqZGlyX2ZkID0gLTE7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIHN0ZDo6aWZzdHJlYW0gaW5wdXQocGF0aCwgc3RkOjppb3M6OmJpbmFyeSB8IHN0ZDo6aW9zOjphdGUpOwotICByZXR1cm4gaW5wdXQuZ29vZCgpOwotfQotCi1ib29sIFJlbmFtZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sIGNvbnN0IHN0ZDo6c3RyaW5nJiB0bykgewotICBpZiAoc3RkOjpyZW5hbWUoZnJvbS5jX3N0cigpLCB0by5jX3N0cigpKSAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8gcmVuYW1lIGZpbGUgZnJvbSAnJXMnIHRvICclcycsIGVycm9yOiAlcyIsIGZyb20uY19zdHIoKSwgdG8uY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IFJlYWRTbWFsbEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgc3RkOjppZnN0cmVhbSBpbnB1dChwYXRoLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmF0ZSk7Ci0gIGlmICghaW5wdXQpIHsKLSAgICBMT0dfV0FSTigiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLCBlcnJvcjogJXMiLCBwYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBhdXRvIGZpbGVfc2l6ZSA9IGlucHV0LnRlbGxnKCk7Ci0gIGlmIChmaWxlX3NpemUgPCAwKSB7Ci0gICAgTE9HX1dBUk4oIkZhaWxlZCB0byBnZXQgZmlsZSBzaXplIGZvciAnJXMnLCBlcnJvcjogJXMiLCBwYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBzdGQ6OnN0cmluZyByZXN1bHQoZmlsZV9zaXplLCAnXDAnKTsKLSAgaWYgKCFpbnB1dC5zZWVrZygwKSkgewotICAgIExPR19XQVJOKCJGYWlsZWQgdG8gZ28gYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgJyVzJywgZXJyb3I6ICVzIiwgcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgaWYgKCFpbnB1dC5yZWFkKHJlc3VsdC5kYXRhKCksIHJlc3VsdC5zaXplKCkpKSB7Ci0gICAgTE9HX1dBUk4oIkZhaWxlZCB0byByZWFkIGZpbGUgJyVzJywgZXJyb3I6ICVzIiwgcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgaW5wdXQuY2xvc2UoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBXcml0ZVRvRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpIHsKLSAgQVNTRVJUKCFwYXRoLmVtcHR5KCkpOwotICAvLyBTdGVwcyB0byBlbnN1cmUgY29udGVudCBvZiBkYXRhIGdldHMgdG8gZGlzazoKLSAgLy8KLSAgLy8gMSkgT3BlbiBhbmQgd3JpdGUgdG8gdGVtcCBmaWxlIChlLmcuIGJ0X2NvbmZpZy5jb25mLm5ldykuCi0gIC8vIDIpIEZsdXNoIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHRoZSB0ZW1wIGZpbGUuCi0gIC8vIDMpIFN5bmMgdGhlIHRlbXAgZmlsZSB0byBkaXNrIHdpdGggZnN5bmMoKS4KLSAgLy8gNCkgUmVuYW1lIHRlbXAgZmlsZSB0byBhY3R1YWwgY29uZmlnIGZpbGUgKGUuZy4gYnRfY29uZmlnLmNvbmYpLgotICAvLyAgICBUaGlzIGVuc3VyZXMgYXRvbWljIHVwZGF0ZS4KLSAgLy8gNSkgU3luYyBkaXJlY3RvcnkgdGhhdCBoYXMgdGhlIGNvbmYgZmlsZSB3aXRoIGZzeW5jKCkuCi0gIC8vICAgIFRoaXMgZW5zdXJlcyBkaXJlY3RvcnkgZW50cmllcyBhcmUgdXAtdG8tZGF0ZS4KLSAgLy8KLSAgLy8gV2UgYXJlIHVzaW5nIHRyYWRpdGlvbmFsIEMgdHlwZSBmaWxlIG1ldGhvZHMgYmVjYXVzZSBDKysgc3RkOjpmaWxlc3lzdGVtIGFuZCBzdGQ6Om9mc3RyZWFtIGRvIG5vdCBzdXBwb3J0OgotICAvLyAtIE9wZXJhdGlvbiBvbiBkaXJlY3RvcmllcwotICAvLyAtIGZzeW5jKCkgdG8gZW5zdXJlIGNvbnRlbnQgaXMgd3JpdHRlbiB0byBkaXNrCi0KLSAgLy8gQnVpbGQgdGVtcCBjb25maWcgZmlsZSBiYXNlZCBvbiBjb25maWcgZmlsZSAoZS5nLiBidF9jb25maWcuY29uZi5uZXcpLgotICBjb25zdCBzdGQ6OnN0cmluZyB0ZW1wX3BhdGggPSBwYXRoICsgIi5uZXciOwotCi0gIC8vIEV4dHJhY3QgZGlyZWN0b3J5IGZyb20gZmlsZSBwYXRoIChlLmcuIC9kYXRhL21pc2MvYmx1ZWRyb2lkKS4KLSAgLy8gbGliYysrZnMgaXMgbm90IHN1cHBvcnRlZCBpbiBBUEVYIHlldCBhbmQgaGVuY2UgY2Fubm90IHVzZSBzdGQ6OmZpbGVzeXN0ZW06OnBhdGg6OnBhcmVudF9wYXRoCi0gIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeV9wYXRoOwotICB7Ci0gICAgLy8gTWFrZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSBhcyBpbnB1dHMgdG8gZGlybmFtZSgpIHdpbGwgYmUgbW9kaWZpZWQgYW5kIHJldHVybiB2YWx1ZSBwb2ludHMgdG8gaW5wdXQgY2hhciBhcnJheQotICAgIC8vIHRlbXBfcGF0aF9mb3JfZGlyIG11c3Qgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCByZXN1bHRzIGZyb20gZGlybmFtZSBpcyBhcHBlbmRlZCB0byBkaXJlY3RvcnlfcGF0aAotICAgIHN0ZDo6c3RyaW5nIHRlbXBfcGF0aF9mb3JfZGlyKHBhdGgpOwotICAgIGRpcmVjdG9yeV9wYXRoLmFwcGVuZChkaXJuYW1lKHRlbXBfcGF0aF9mb3JfZGlyLmRhdGEoKSkpOwotICB9Ci0gIGlmIChkaXJlY3RvcnlfcGF0aC5lbXB0eSgpKSB7Ci0gICAgTE9HX0VSUk9SKCJlcnJvciBleHRyYWN0aW5nIGRpcmVjdG9yeSBmcm9tICclcycsIGVycm9yOiAlcyIsIHBhdGguY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgZGlyX2ZkID0gb3BlbihkaXJlY3RvcnlfcGF0aC5jX3N0cigpLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTsKLSAgaWYgKGRpcl9mZCA8IDApIHsKLSAgICBMT0dfRVJST1IoInVuYWJsZSB0byBvcGVuIGRpciAnJXMnLCBlcnJvcjogJXMiLCBkaXJlY3RvcnlfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEZJTEUqIGZwID0gc3RkOjpmb3Blbih0ZW1wX3BhdGguY19zdHIoKSwgInd0Iik7Ci0gIGlmICghZnApIHsKLSAgICBMT0dfRVJST1IoInVuYWJsZSB0byB3cml0ZSB0byBmaWxlICclcycsIGVycm9yOiAlcyIsIHRlbXBfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIEhhbmRsZUVycm9yKHRlbXBfcGF0aCwgJmRpcl9mZCwgJmZwKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoc3RkOjpmcHJpbnRmKGZwLCAiJXMiLCBkYXRhLmNfc3RyKCkpIDwgMCkgewotICAgIExPR19FUlJPUigidW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJyVzJywgZXJyb3I6ICVzIiwgdGVtcF9wYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgSGFuZGxlRXJyb3IodGVtcF9wYXRoLCAmZGlyX2ZkLCAmZnApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEZsdXNoIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHRoZSB0ZW1wIGZpbGUuCi0gIGlmIChzdGQ6OmZmbHVzaChmcCkgIT0gMCkgewotICAgIExPR19FUlJPUigidW5hYmxlIHRvIHdyaXRlIGZsdXNoIGJ1ZmZlciB0byBmaWxlICclcycsIGVycm9yOiAlcyIsIHRlbXBfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIEhhbmRsZUVycm9yKHRlbXBfcGF0aCwgJmRpcl9mZCwgJmZwKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBTeW5jIHdyaXR0ZW4gdGVtcCBmaWxlIG91dCB0byBkaXNrLiBmc3luYygpIGlzIGJsb2NraW5nIHVudGlsIGRhdGEgbWFrZXMgaXQKLSAgLy8gdG8gZGlzay4KLSAgaWYgKGZzeW5jKGZpbGVubyhmcCkpICE9IDApIHsKLSAgICBMT0dfV0FSTigidW5hYmxlIHRvIGZzeW5jIGZpbGUgJyVzJywgZXJyb3I6ICVzIiwgdGVtcF9wYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgLy8gQWxsb3cgZnN5bmMgdG8gZmFpbCBhbmQgY29udGludWUKLSAgfQotCi0gIGlmIChzdGQ6OmZjbG9zZShmcCkgIT0gMCkgewotICAgIExPR19FUlJPUigidW5hYmxlIHRvIGNsb3NlIGZpbGUgJyVzJywgZXJyb3I6ICVzIiwgdGVtcF9wYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgSGFuZGxlRXJyb3IodGVtcF9wYXRoLCAmZGlyX2ZkLCAmZnApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmcCA9IG51bGxwdHI7Ci0KLSAgLy8gQ2hhbmdlIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgdG8gUmVhZC9Xcml0ZSBieSBVc2VyIGFuZCBHcm91cAotICBpZiAoY2htb2QodGVtcF9wYXRoLmNfc3RyKCksIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApICE9IDApIHsKLSAgICBMT0dfRVJST1IoInVuYWJsZSB0byBjaGFuZ2UgZmlsZSBwZXJtaXNzaW9ucyAnJXMnLCBlcnJvcjogJXMiLCB0ZW1wX3BhdGguY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBIYW5kbGVFcnJvcih0ZW1wX3BhdGgsICZkaXJfZmQsICZmcCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVuYW1lIHdyaXR0ZW4gdGVtcCBmaWxlIHRvIHRoZSBhY3R1YWwgY29uZmlnIGZpbGUuCi0gIGlmIChzdGQ6OnJlbmFtZSh0ZW1wX3BhdGguY19zdHIoKSwgcGF0aC5jX3N0cigpKSAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8gY29tbWl0IGZpbGUgZnJvbSAnJXMnIHRvICclcycsIGVycm9yOiAlcyIsIHRlbXBfcGF0aC5jX3N0cigpLCBwYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgSGFuZGxlRXJyb3IodGVtcF9wYXRoLCAmZGlyX2ZkLCAmZnApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRoaXMgc2hvdWxkIGVuc3VyZSB0aGUgZGlyZWN0b3J5IGlzIHVwZGF0ZWQgYXMgd2VsbC4KLSAgaWYgKGZzeW5jKGRpcl9mZCkgIT0gMCkgewotICAgIExPR19XQVJOKCJ1bmFibGUgdG8gZnN5bmMgZGlyICclcycsIGVycm9yOiAlcyIsIGRpcmVjdG9yeV9wYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLQotICBpZiAoY2xvc2UoZGlyX2ZkKSAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8gY2xvc2UgZGlyICclcycsIGVycm9yOiAlcyIsIGRpcmVjdG9yeV9wYXRoLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgSGFuZGxlRXJyb3IodGVtcF9wYXRoLCAmZGlyX2ZkLCAmZnApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIGlmIChyZW1vdmUocGF0aC5jX3N0cigpKSAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8gcmVtb3ZlIGZpbGUgJyVzJywgZXJyb3I6ICVzIiwgcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9maWxlc190ZXN0LmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9maWxlc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODMwODNjLi4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4X2dlbmVyaWMvZmlsZXNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJvcy9maWxlcy5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8ZmlsZXN5c3RlbT4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6Om9zOjpGaWxlRXhpc3RzOwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6UmVhZFNtYWxsRmlsZTsKLXVzaW5nIGJsdWV0b290aDo6b3M6OlJlbmFtZUZpbGU7Ci11c2luZyBibHVldG9vdGg6Om9zOjpXcml0ZVRvRmlsZTsKLQotVEVTVChGaWxlc1Rlc3QsIGV4aXN0X3Rlc3QpIHsKLSAgYXV0byB0ZW1wX2RpciA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICBhdXRvIHRlbXBfZmlsZSA9IHRlbXBfZGlyIC8gImZpbGVfMS50eHQiOwotICBzdGQ6OnN0cmluZyB0ZXh0ID0gIkhlbGxvIHdvcmxkIVxuIjsKLSAgQVNTRVJUX1RSVUUoV3JpdGVUb0ZpbGUodGVtcF9maWxlLnN0cmluZygpLCB0ZXh0KSk7Ci0gIEVYUEVDVF9UUlVFKEZpbGVFeGlzdHModGVtcF9maWxlLnN0cmluZygpKSk7Ci0gIGF1dG8gbm9uZV9maWxlID0gdGVtcF9kaXIgLyAiZmlsZV9ub3BlLnR4dCI7Ci0gIEVYUEVDVF9GQUxTRShGaWxlRXhpc3RzKG5vbmVfZmlsZS5zdHJpbmcoKSkpOwotfQotCi1URVNUKEZpbGVzVGVzdCwgcmVuYW1lX3Rlc3QpIHsKLSAgYXV0byB0ZW1wX2RpciA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICBhdXRvIHRlbXBfZmlsZSA9IHRlbXBfZGlyIC8gImZpbGVfMS50eHQiOwotICBzdGQ6OnN0cmluZyB0ZXh0ID0gIkhlbGxvIHdvcmxkIVxuIjsKLSAgQVNTRVJUX1RSVUUoV3JpdGVUb0ZpbGUodGVtcF9maWxlLnN0cmluZygpLCB0ZXh0KSk7Ci0gIEVYUEVDVF9USEFUKFJlYWRTbWFsbEZpbGUodGVtcF9maWxlLnN0cmluZygpKSwgT3B0aW9uYWwoU3RyRXEodGV4dCkpKTsKLSAgYXV0byB0b19maWxlID0gdGVtcF9kaXIgLyAiZmlsZV8yLnR4dCI7Ci0gIEFTU0VSVF9UUlVFKFJlbmFtZUZpbGUodGVtcF9maWxlLnN0cmluZygpLCB0b19maWxlLnN0cmluZygpKSk7Ci0gIEVYUEVDVF9GQUxTRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX2ZpbGUpKTsKLSAgRVhQRUNUX1RIQVQoUmVhZFNtYWxsRmlsZSh0b19maWxlLnN0cmluZygpKSwgT3B0aW9uYWwoU3RyRXEodGV4dCkpKTsKLSAgLy8gcmVuYW1lIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IHNob3VsZCByZXR1cm4gZmFsc2UKLSAgQVNTRVJUX0ZBTFNFKFJlbmFtZUZpbGUodGVtcF9maWxlLnN0cmluZygpLCB0b19maWxlLnN0cmluZygpKSk7Ci19Ci0KLVRFU1QoRmlsZXNUZXN0LCB3cml0ZV9yZWFkX2xvb3BiYWNrX3Rlc3QpIHsKLSAgYXV0byB0ZW1wX2RpciA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICBhdXRvIHRlbXBfZmlsZSA9IHRlbXBfZGlyIC8gImZpbGVfMS50eHQiOwotICBzdGQ6OnN0cmluZyB0ZXh0ID0gIkhlbGxvIHdvcmxkIVxuIjsKLSAgQVNTRVJUX1RSVUUoV3JpdGVUb0ZpbGUodGVtcF9maWxlLnN0cmluZygpLCB0ZXh0KSk7Ci0gIEVYUEVDVF9USEFUKFJlYWRTbWFsbEZpbGUodGVtcF9maWxlLnN0cmluZygpKSwgT3B0aW9uYWwoU3RyRXEodGV4dCkpKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpyZW1vdmUodGVtcF9maWxlKSk7Ci19Ci0KLVRFU1QoRmlsZXNUZXN0LCBvdmVyd3JpdGVfdGVzdCkgewotICBhdXRvIHRlbXBfZGlyID0gc3RkOjpmaWxlc3lzdGVtOjp0ZW1wX2RpcmVjdG9yeV9wYXRoKCk7Ci0gIGF1dG8gdGVtcF9maWxlID0gdGVtcF9kaXIgLyAiZmlsZV8xLnR4dCI7Ci0gIHN0ZDo6c3RyaW5nIHRleHQgPSAiSGVsbG8gd29ybGQhXG4iOwotICBBU1NFUlRfVFJVRShXcml0ZVRvRmlsZSh0ZW1wX2ZpbGUuc3RyaW5nKCksIHRleHQpKTsKLSAgRVhQRUNUX1RIQVQoUmVhZFNtYWxsRmlsZSh0ZW1wX2ZpbGUuc3RyaW5nKCkpLCBPcHRpb25hbChTdHJFcSh0ZXh0KSkpOwotICB0ZXh0ID0gIkZvbyBiYXIhXG4iOwotICBBU1NFUlRfVFJVRShXcml0ZVRvRmlsZSh0ZW1wX2ZpbGUuc3RyaW5nKCksIHRleHQpKTsKLSAgRVhQRUNUX1RIQVQoUmVhZFNtYWxsRmlsZSh0ZW1wX2ZpbGUuc3RyaW5nKCkpLCBPcHRpb25hbChTdHJFcSh0ZXh0KSkpOwotICBFWFBFQ1RfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZSh0ZW1wX2ZpbGUpKTsKLX0KLQotVEVTVChGaWxlc1Rlc3QsIHdyaXRlX3JlYWRfZW1wdHlfc3RyaW5nX3Rlc3QpIHsKLSAgYXV0byB0ZW1wX2RpciA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICBhdXRvIHRlbXBfZmlsZSA9IHRlbXBfZGlyIC8gImZpbGVfMS50eHQiOwotICBzdGQ6OnN0cmluZyB0ZXh0OwotICBBU1NFUlRfVFJVRShXcml0ZVRvRmlsZSh0ZW1wX2ZpbGUuc3RyaW5nKCksIHRleHQpKTsKLSAgRVhQRUNUX1RIQVQoUmVhZFNtYWxsRmlsZSh0ZW1wX2ZpbGUuc3RyaW5nKCkpLCBPcHRpb25hbChTdHJFcSh0ZXh0KSkpOwotICBFWFBFQ1RfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZSh0ZW1wX2ZpbGUpKTsKLX0KLQotVEVTVChGaWxlc1Rlc3QsIHJlYWRfbm9uX2V4aXN0aW5nX2ZpbGVfdGVzdCkgewotICBFWFBFQ1RfRkFMU0UoUmVhZFNtYWxsRmlsZSgiL3dvb2YiKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9oYW5kbGVyLmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9oYW5kbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk5NmY5Li4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4X2dlbmVyaWMvaGFuZGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3JlYWN0b3IuaCIKLSNpbmNsdWRlICJvcy91dGlscy5oIgotCi0jaWZuZGVmIEVGRF9TRU1BUEhPUkUKLSNkZWZpbmUgRUZEX1NFTUFQSE9SRSAxCi0jZW5kaWYKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotdXNpbmcgY29tbW9uOjpPbmNlQ2xvc3VyZTsKLQotSGFuZGxlcjo6SGFuZGxlcihUaHJlYWQqIHRocmVhZCkKLSAgICA6IHRhc2tzXyhuZXcgc3RkOjpxdWV1ZTxPbmNlQ2xvc3VyZT4oKSksIHRocmVhZF8odGhyZWFkKSwgZmRfKGV2ZW50ZmQoMCwgRUZEX1NFTUFQSE9SRSB8IEVGRF9OT05CTE9DSykpIHsKLSAgQVNTRVJUKGZkXyAhPSAtMSk7Ci0gIHJlYWN0YWJsZV8gPSB0aHJlYWRfLT5HZXRSZWFjdG9yKCktPlJlZ2lzdGVyKAotICAgICAgZmRfLCBjb21tb246OkJpbmQoJkhhbmRsZXI6OmhhbmRsZV9uZXh0X2V2ZW50LCBjb21tb246OlVucmV0YWluZWQodGhpcykpLCBjb21tb246OkNsb3N1cmUoKSk7Ci19Ci0KLUhhbmRsZXI6On5IYW5kbGVyKCkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBBU1NFUlRfTE9HKHdhc19jbGVhcmVkKCksICJIYW5kbGVycyBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZXkgYXJlIGRlc3Ryb3llZCIpOwotICB9Ci0KLSAgaW50IGNsb3NlX3N0YXR1czsKLSAgUlVOX05PX0lOVFIoY2xvc2Vfc3RhdHVzID0gY2xvc2UoZmRfKSk7Ci0gIEFTU0VSVChjbG9zZV9zdGF0dXMgIT0gLTEpOwotfQotCi12b2lkIEhhbmRsZXI6OlBvc3QoT25jZUNsb3N1cmUgY2xvc3VyZSkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBpZiAod2FzX2NsZWFyZWQoKSkgewotICAgICAgTE9HX1dBUk4oIlBvc3RpbmcgdG8gYSBoYW5kbGVyIHdoaWNoIGhhcyBiZWVuIGNsZWFyZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdGFza3NfLT5lbXBsYWNlKHN0ZDo6bW92ZShjbG9zdXJlKSk7Ci0gIH0KLSAgdWludDY0X3QgdmFsID0gMTsKLSAgYXV0byB3cml0ZV9yZXN1bHQgPSBldmVudGZkX3dyaXRlKGZkXywgdmFsKTsKLSAgQVNTRVJUKHdyaXRlX3Jlc3VsdCAhPSAtMSk7Ci19Ci0KLXZvaWQgSGFuZGxlcjo6Q2xlYXIoKSB7Ci0gIHN0ZDo6cXVldWU8T25jZUNsb3N1cmU+KiB0bXAgPSBudWxscHRyOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBBU1NFUlRfTE9HKCF3YXNfY2xlYXJlZCgpLCAiSGFuZGxlcnMgbXVzdCBvbmx5IGJlIGNsZWFyZWQgb25jZSIpOwotICAgIHN0ZDo6c3dhcCh0YXNrc18sIHRtcCk7Ci0gIH0KLSAgZGVsZXRlIHRtcDsKLQotICB1aW50NjRfdCB2YWw7Ci0gIHdoaWxlIChldmVudGZkX3JlYWQoZmRfLCAmdmFsKSA9PSAwKSB7Ci0gIH0KLQotICB0aHJlYWRfLT5HZXRSZWFjdG9yKCktPlVucmVnaXN0ZXIocmVhY3RhYmxlXyk7Ci0gIHJlYWN0YWJsZV8gPSBudWxscHRyOwotfQotCi12b2lkIEhhbmRsZXI6OldhaXRVbnRpbFN0b3BwZWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KSB7Ci0gIEFTU0VSVChyZWFjdGFibGVfID09IG51bGxwdHIpOwotICBBU1NFUlQodGhyZWFkXy0+R2V0UmVhY3RvcigpLT5XYWl0Rm9yVW5yZWdpc3RlcmVkUmVhY3RhYmxlKHRpbWVvdXQpKTsKLX0KLQotdm9pZCBIYW5kbGVyOjpoYW5kbGVfbmV4dF9ldmVudCgpIHsKLSAgY29tbW9uOjpPbmNlQ2xvc3VyZSBjbG9zdXJlOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICB1aW50NjRfdCB2YWwgPSAwOwotICAgIGF1dG8gcmVhZF9yZXN1bHQgPSBldmVudGZkX3JlYWQoZmRfLCAmdmFsKTsKLQotICAgIGlmICh3YXNfY2xlYXJlZCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVF9MT0cocmVhZF9yZXN1bHQgIT0gLTEsICJldmVudGZkIHJlYWQgZXJyb3IgJWQgJXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgIGNsb3N1cmUgPSBzdGQ6Om1vdmUodGFza3NfLT5mcm9udCgpKTsKLSAgICB0YXNrc18tPnBvcCgpOwotICB9Ci0gIHN0ZDo6bW92ZShjbG9zdXJlKS5SdW4oKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eF9nZW5lcmljL2hhbmRsZXJfdW5pdHRlc3QuY2MgYi9nZC9vcy9saW51eF9nZW5lcmljL2hhbmRsZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTAzMGUuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9oYW5kbGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotbmFtZXNwYWNlIHsKLQotY2xhc3MgSGFuZGxlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkXyA9IG5ldyBUaHJlYWQoInRlc3RfdGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBIYW5kbGVyKHRocmVhZF8pOwotICB9Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgSGFuZGxlciogaGFuZGxlcl87Ci0gIFRocmVhZCogdGhyZWFkXzsKLX07Ci0KLVRFU1RfRihIYW5kbGVyVGVzdCwgZW1wdHkpIHsKLSAgaGFuZGxlcl8tPkNsZWFyKCk7Ci19Ci0KLVRFU1RfRihIYW5kbGVyVGVzdCwgcG9zdF90YXNrX2ludm9rZWQpIHsKLSAgaW50IHZhbCA9IDA7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBjbG9zdXJlX3JhbjsKLSAgYXV0byBmdXR1cmUgPSBjbG9zdXJlX3Jhbi5nZXRfZnV0dXJlKCk7Ci0gIGNvbW1vbjo6T25jZUNsb3N1cmUgY2xvc3VyZSA9IGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICBbXShpbnQqIHZhbCwgc3RkOjpwcm9taXNlPHZvaWQ+IGNsb3N1cmVfcmFuKSB7Ci0gICAgICAgICp2YWwgPSAqdmFsICsgMTsKLSAgICAgICAgY2xvc3VyZV9yYW4uc2V0X3ZhbHVlKCk7Ci0gICAgICB9LAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKCZ2YWwpLAotICAgICAgc3RkOjptb3ZlKGNsb3N1cmVfcmFuKSk7Ci0gIGhhbmRsZXJfLT5Qb3N0KHN0ZDo6bW92ZShjbG9zdXJlKSk7Ci0gIGZ1dHVyZS53YWl0KCk7Ci0gIEFTU0VSVF9FUSh2YWwsIDEpOwotICBoYW5kbGVyXy0+Q2xlYXIoKTsKLX0KLQotVEVTVF9GKEhhbmRsZXJUZXN0LCBwb3N0X3Rhc2tfY2xlYXJlZCkgewotICBpbnQgdmFsID0gMDsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGNsb3N1cmVfc3RhcnRlZDsKLSAgYXV0byBjbG9zdXJlX3N0YXJ0ZWRfZnV0dXJlID0gY2xvc3VyZV9zdGFydGVkLmdldF9mdXR1cmUoKTsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGNsb3N1cmVfY2FuX2NvbnRpbnVlOwotICBhdXRvIGNhbl9jb250aW51ZV9mdXR1cmUgPSBjbG9zdXJlX2Nhbl9jb250aW51ZS5nZXRfZnV0dXJlKCk7Ci0gIGhhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICBbXShpbnQqIHZhbCwgc3RkOjpwcm9taXNlPHZvaWQ+IGNsb3N1cmVfc3RhcnRlZCwgc3RkOjpmdXR1cmU8dm9pZD4gY2FuX2NvbnRpbnVlX2Z1dHVyZSkgewotICAgICAgICBjbG9zdXJlX3N0YXJ0ZWQuc2V0X3ZhbHVlKCk7Ci0gICAgICAgICp2YWwgPSAqdmFsICsgMTsKLSAgICAgICAgY2FuX2NvbnRpbnVlX2Z1dHVyZS53YWl0KCk7Ci0gICAgICB9LAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKCZ2YWwpLAotICAgICAgc3RkOjptb3ZlKGNsb3N1cmVfc3RhcnRlZCksCi0gICAgICBzdGQ6Om1vdmUoY2FuX2NvbnRpbnVlX2Z1dHVyZSkpKTsKLSAgaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShbXSgpIHsgQVNTRVJUX1RSVUUoZmFsc2UpOyB9KSk7Ci0gIGNsb3N1cmVfc3RhcnRlZF9mdXR1cmUud2FpdCgpOwotICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgY2xvc3VyZV9jYW5fY29udGludWUuc2V0X3ZhbHVlKCk7Ci0gIEFTU0VSVF9FUSh2YWwsIDEpOwotfQotCi12b2lkIGNoZWNrX2ludChzdGQ6OnVuaXF1ZV9wdHI8aW50PiBudW1iZXIsIHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IHRvX2NoYW5nZSkgewotICAqdG9fY2hhbmdlID0gKm51bWJlcjsKLX0KLQotVEVTVF9GKEhhbmRsZXJUZXN0LCBvbmNlX2NhbGxiYWNrKSB7Ci0gIGF1dG8gbnVtYmVyID0gc3RkOjptYWtlX3VuaXF1ZTxpbnQ+KDEpOwotICBhdXRvIHRvX2NoYW5nZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigwKTsKLSAgYXV0byBvbmNlX2NhbGxiYWNrID0gY29tbW9uOjpCaW5kT25jZSgmY2hlY2tfaW50LCBzdGQ6Om1vdmUobnVtYmVyKSwgdG9fY2hhbmdlKTsKLSAgc3RkOjptb3ZlKG9uY2VfY2FsbGJhY2spLlJ1bigpOwotICBFWFBFQ1RfRVEoKnRvX2NoYW5nZSwgMSk7Ci0gIGhhbmRsZXJfLT5DbGVhcigpOwotfQotCi1URVNUX0YoSGFuZGxlclRlc3QsIGNhbGxiYWNrX3dpdGhfcHJvbWlzZSkgewotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgYXV0byBvbmNlX2NhbGxiYWNrID0gY29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpOwotICBzdGQ6Om1vdmUob25jZV9jYWxsYmFjaykuUnVuKCk7Ci0gIGZ1dHVyZS53YWl0KCk7Ci0gIGhhbmRsZXJfLT5DbGVhcigpOwotfQotCi0vLyBGb3IgRGVhdGggdGVzdHMsIGFsbCB0aGUgdGhyZWFkaW5nIG5lZWRzIHRvIGJlIGRvbmUgaW4gdGhlIEFTU0VSVF9ERUFUSCBjYWxsCi1jbGFzcyBIYW5kbGVyRGVhdGhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFRocmVhZFNldFVwKCkgewotICAgIHRocmVhZF8gPSBuZXcgVGhyZWFkKCJ0ZXN0X3RocmVhZCIsIFRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgaGFuZGxlcl8gPSBuZXcgSGFuZGxlcih0aHJlYWRfKTsKLSAgfQotCi0gIHZvaWQgVGhyZWFkVGVhckRvd24oKSB7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgdm9pZCBDbGVhclR3aWNlKCkgewotICAgIFRocmVhZFNldFVwKCk7Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgVGhyZWFkVGVhckRvd24oKTsKLSAgfQotCi0gIHZvaWQgTm90Q2xlYXJlZCgpIHsKLSAgICBUaHJlYWRTZXRVcCgpOwotICAgIFRocmVhZFRlYXJEb3duKCk7Ci0gIH0KLQotICBIYW5kbGVyKiBoYW5kbGVyXzsKLSAgVGhyZWFkKiB0aHJlYWRfOwotfTsKLQotVEVTVF9GKEhhbmRsZXJEZWF0aFRlc3QsIGNsZWFyX2FmdGVyX2hhbmRsZXJfY2xlYXJlZCkgewotICBBU1NFUlRfREVBVEgoQ2xlYXJUd2ljZSgpLCAiSGFuZGxlcnMgbXVzdCBvbmx5IGJlIGNsZWFyZWQgb25jZSIpOwotfQotCi1URVNUX0YoSGFuZGxlckRlYXRoVGVzdCwgbm90X2NsZWFyZWRfYmVmb3JlX2Rlc3RydWN0aW9uKSB7Ci0gIEFTU0VSVF9ERUFUSChOb3RDbGVhcmVkKCksICJIYW5kbGVycyBtdXN0IGJlIGNsZWFyZWQiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvbGludXguaCBiL2dkL29zL2xpbnV4X2dlbmVyaWMvbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYWU2YS4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBFRkRfU0VNQVBIT1JFCi0jZGVmaW5lIEVGRF9TRU1BUEhPUkUgMQotI2VuZGlmCi0KLSNpZmRlZiBGVVpaX1RBUkdFVAotI2luY2x1ZGUgIm9zL2Z1enovZmFrZV90aW1lcmZkLmgiCi0jZGVmaW5lIFRJTUVSRkRfQ1JFQVRFIDo6Ymx1ZXRvb3RoOjpvczo6ZnV6ejo6ZmFrZV90aW1lcmZkX2NyZWF0ZQotI2RlZmluZSBUSU1FUkZEX1NFVFRJTUUgOjpibHVldG9vdGg6Om9zOjpmdXp6OjpmYWtlX3RpbWVyZmRfc2V0dGltZQotI2RlZmluZSBUSU1FUkZEX0NMT1NFIDo6Ymx1ZXRvb3RoOjpvczo6ZnV6ejo6ZmFrZV90aW1lcmZkX2Nsb3NlCi0jZWxzZQotI2RlZmluZSBUSU1FUkZEX0NSRUFURSB0aW1lcmZkX2NyZWF0ZQotI2RlZmluZSBUSU1FUkZEX1NFVFRJTUUgdGltZXJmZF9zZXR0aW1lCi0jZGVmaW5lIFRJTUVSRkRfQ0xPU0UgY2xvc2UKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9xdWV1ZS50cHAgYi9nZC9vcy9saW51eF9nZW5lcmljL3F1ZXVlLnRwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMTNiMS4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL3F1ZXVlLnRwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVF1ZXVlPFQ+OjpRdWV1ZShzaXplX3QgY2FwYWNpdHkpIDogZW5xdWV1ZV8oY2FwYWNpdHkpLCBkZXF1ZXVlXygwKXt9OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVF1ZXVlPFQ+Ojp+UXVldWUoKSB7Ci0gIEFTU0VSVF9MT0coZW5xdWV1ZV8uaGFuZGxlcl8gPT0gbnVsbHB0ciwgIkVucXVldWUgaXMgbm90IHVucmVnaXN0ZXJlZCIpOwotICBBU1NFUlRfTE9HKGRlcXVldWVfLmhhbmRsZXJfID09IG51bGxwdHIsICJEZXF1ZXVlIGlzIG5vdCB1bnJlZ2lzdGVyZWQiKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBRdWV1ZTxUPjo6UmVnaXN0ZXJFbnF1ZXVlKEhhbmRsZXIqIGhhbmRsZXIsIEVucXVldWVDYWxsYmFjayBjYWxsYmFjaykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBBU1NFUlQoZW5xdWV1ZV8uaGFuZGxlcl8gPT0gbnVsbHB0cik7Ci0gIEFTU0VSVChlbnF1ZXVlXy5yZWFjdGFibGVfID09IG51bGxwdHIpOwotICBlbnF1ZXVlXy5oYW5kbGVyXyA9IGhhbmRsZXI7Ci0gIGVucXVldWVfLnJlYWN0YWJsZV8gPSBlbnF1ZXVlXy5oYW5kbGVyXy0+dGhyZWFkXy0+R2V0UmVhY3RvcigpLT5SZWdpc3RlcigKLSAgICAgIGVucXVldWVfLnJlYWN0aXZlX3NlbWFwaG9yZV8uR2V0RmQoKSwKLSAgICAgIGJhc2U6OkJpbmQoJlF1ZXVlPFQ+OjpFbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgc3RkOjptb3ZlKGNhbGxiYWNrKSksCi0gICAgICBiYXNlOjpDbG9zdXJlKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUXVldWU8VD46OlVucmVnaXN0ZXJFbnF1ZXVlKCkgewotICBSZWFjdG9yKiByZWFjdG9yID0gbnVsbHB0cjsKLSAgUmVhY3Rvcjo6UmVhY3RhYmxlKiB0b191bnJlZ2lzdGVyID0gbnVsbHB0cjsKLSAgYm9vbCB3YWl0X2Zvcl91bnJlZ2lzdGVyID0gZmFsc2U7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIEFTU0VSVChlbnF1ZXVlXy5yZWFjdGFibGVfICE9IG51bGxwdHIpOwotICAgIHJlYWN0b3IgPSBlbnF1ZXVlXy5oYW5kbGVyXy0+dGhyZWFkXy0+R2V0UmVhY3RvcigpOwotICAgIHdhaXRfZm9yX3VucmVnaXN0ZXIgPSAoIWVucXVldWVfLmhhbmRsZXJfLT50aHJlYWRfLT5Jc1NhbWVUaHJlYWQoKSk7Ci0gICAgdG9fdW5yZWdpc3RlciA9IGVucXVldWVfLnJlYWN0YWJsZV87Ci0gICAgZW5xdWV1ZV8ucmVhY3RhYmxlXyA9IG51bGxwdHI7Ci0gICAgZW5xdWV1ZV8uaGFuZGxlcl8gPSBudWxscHRyOwotICB9Ci0gIHJlYWN0b3ItPlVucmVnaXN0ZXIodG9fdW5yZWdpc3Rlcik7Ci0gIGlmICh3YWl0X2Zvcl91bnJlZ2lzdGVyKSB7Ci0gICAgcmVhY3Rvci0+V2FpdEZvclVucmVnaXN0ZXJlZFJlYWN0YWJsZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUXVldWU8VD46OlJlZ2lzdGVyRGVxdWV1ZShIYW5kbGVyKiBoYW5kbGVyLCBEZXF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgQVNTRVJUKGRlcXVldWVfLmhhbmRsZXJfID09IG51bGxwdHIpOwotICBBU1NFUlQoZGVxdWV1ZV8ucmVhY3RhYmxlXyA9PSBudWxscHRyKTsKLSAgZGVxdWV1ZV8uaGFuZGxlcl8gPSBoYW5kbGVyOwotICBkZXF1ZXVlXy5yZWFjdGFibGVfID0gZGVxdWV1ZV8uaGFuZGxlcl8tPnRocmVhZF8tPkdldFJlYWN0b3IoKS0+UmVnaXN0ZXIoCi0gICAgICBkZXF1ZXVlXy5yZWFjdGl2ZV9zZW1hcGhvcmVfLkdldEZkKCksIGNhbGxiYWNrLCBiYXNlOjpDbG9zdXJlKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUXVldWU8VD46OlVucmVnaXN0ZXJEZXF1ZXVlKCkgewotICBSZWFjdG9yKiByZWFjdG9yID0gbnVsbHB0cjsKLSAgUmVhY3Rvcjo6UmVhY3RhYmxlKiB0b191bnJlZ2lzdGVyID0gbnVsbHB0cjsKLSAgYm9vbCB3YWl0X2Zvcl91bnJlZ2lzdGVyID0gZmFsc2U7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgIEFTU0VSVChkZXF1ZXVlXy5yZWFjdGFibGVfICE9IG51bGxwdHIpOwotICAgIHJlYWN0b3IgPSBkZXF1ZXVlXy5oYW5kbGVyXy0+dGhyZWFkXy0+R2V0UmVhY3RvcigpOwotICAgIHdhaXRfZm9yX3VucmVnaXN0ZXIgPSAoIWRlcXVldWVfLmhhbmRsZXJfLT50aHJlYWRfLT5Jc1NhbWVUaHJlYWQoKSk7Ci0gICAgdG9fdW5yZWdpc3RlciA9IGRlcXVldWVfLnJlYWN0YWJsZV87Ci0gICAgZGVxdWV1ZV8ucmVhY3RhYmxlXyA9IG51bGxwdHI7Ci0gICAgZGVxdWV1ZV8uaGFuZGxlcl8gPSBudWxscHRyOwotICB9Ci0gIHJlYWN0b3ItPlVucmVnaXN0ZXIodG9fdW5yZWdpc3Rlcik7Ci0gIGlmICh3YWl0X2Zvcl91bnJlZ2lzdGVyKSB7Ci0gICAgcmVhY3Rvci0+V2FpdEZvclVucmVnaXN0ZXJlZFJlYWN0YWJsZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6dW5pcXVlX3B0cjxUPiBRdWV1ZTxUPjo6VHJ5RGVxdWV1ZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICBpZiAocXVldWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIGRlcXVldWVfLnJlYWN0aXZlX3NlbWFwaG9yZV8uRGVjcmVhc2UoKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZGF0YSA9IHN0ZDo6bW92ZShxdWV1ZV8uZnJvbnQoKSk7Ci0gIHF1ZXVlXy5wb3AoKTsKLQotICBlbnF1ZXVlXy5yZWFjdGl2ZV9zZW1hcGhvcmVfLkluY3JlYXNlKCk7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBRdWV1ZTxUPjo6RW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWwoRW5xdWV1ZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxUPiBkYXRhID0gY2FsbGJhY2suUnVuKCk7Ci0gIEFTU0VSVChkYXRhICE9IG51bGxwdHIpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBlbnF1ZXVlXy5yZWFjdGl2ZV9zZW1hcGhvcmVfLkRlY3JlYXNlKCk7Ci0gIHF1ZXVlXy5wdXNoKHN0ZDo6bW92ZShkYXRhKSk7Ci0gIGRlcXVldWVfLnJlYWN0aXZlX3NlbWFwaG9yZV8uSW5jcmVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcXVldWVfdW5pdHRlc3QuY2MgYi9nZC9vcy9saW51eF9nZW5lcmljL3F1ZXVlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGYwNjFjLi4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcXVldWVfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0KLSNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIm9zL3JlYWN0b3IuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIGludCBrUXVldWVTaXplID0gMTA7Ci1jb25zdGV4cHIgaW50IGtIYWxmT2ZRdWV1ZVNpemUgPSBrUXVldWVTaXplIC8gMjsKLWNvbnN0ZXhwciBpbnQga0RvdWJsZU9mUXVldWVTaXplID0ga1F1ZXVlU2l6ZSAqIDI7Ci1jb25zdGV4cHIgaW50IGtRdWV1ZVNpemVPbmUgPSAxOwotCi1jbGFzcyBRdWV1ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgZW5xdWV1ZV90aHJlYWRfID0gbmV3IFRocmVhZCgiZW5xdWV1ZV90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGVucXVldWVfaGFuZGxlcl8gPSBuZXcgSGFuZGxlcihlbnF1ZXVlX3RocmVhZF8pOwotICAgIGRlcXVldWVfdGhyZWFkXyA9IG5ldyBUaHJlYWQoImRlcXVldWVfdGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBkZXF1ZXVlX2hhbmRsZXJfID0gbmV3IEhhbmRsZXIoZGVxdWV1ZV90aHJlYWRfKTsKLSAgfQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGVucXVldWVfaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGVucXVldWVfaGFuZGxlcl87Ci0gICAgZGVsZXRlIGVucXVldWVfdGhyZWFkXzsKLSAgICBkZXF1ZXVlX2hhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBkZXF1ZXVlX2hhbmRsZXJfOwotICAgIGRlbGV0ZSBkZXF1ZXVlX3RocmVhZF87Ci0gICAgZW5xdWV1ZV9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgZW5xdWV1ZV90aHJlYWRfID0gbnVsbHB0cjsKLSAgICBkZXF1ZXVlX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgICBkZXF1ZXVlX3RocmVhZF8gPSBudWxscHRyOwotICB9Ci0KLSAgVGhyZWFkKiBlbnF1ZXVlX3RocmVhZF87Ci0gIEhhbmRsZXIqIGVucXVldWVfaGFuZGxlcl87Ci0gIFRocmVhZCogZGVxdWV1ZV90aHJlYWRfOwotICBIYW5kbGVyKiBkZXF1ZXVlX2hhbmRsZXJfOwotfTsKLQotY2xhc3MgVGVzdEVucXVldWVFbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGVzdEVucXVldWVFbmQoUXVldWU8c3RkOjpzdHJpbmc+KiBxdWV1ZSwgSGFuZGxlciogaGFuZGxlcikKLSAgICAgIDogY291bnQoMCksIGhhbmRsZXJfKGhhbmRsZXIpLCBxdWV1ZV8ocXVldWUpLCBkZWxheV8oMCkge30KLQotICB+VGVzdEVucXVldWVFbmQoKSB7fQotCi0gIHZvaWQgUmVnaXN0ZXJFbnF1ZXVlKHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiogcHJvbWlzZV9tYXApIHsKLSAgICBwcm9taXNlX21hcF8gPSBwcm9taXNlX21hcDsKLSAgICBoYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZUZXN0RW5xdWV1ZUVuZDo6aGFuZGxlX3JlZ2lzdGVyX2VucXVldWUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyRW5xdWV1ZSgpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotCi0gICAgaGFuZGxlcl8tPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJlRlc3RFbnF1ZXVlRW5kOjpoYW5kbGVfdW5yZWdpc3Rlcl9lbnF1ZXVlLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIHN0ZDo6bW92ZShwcm9taXNlKSkpOwotICAgIGZ1dHVyZS53YWl0KCk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IEVucXVldWVDYWxsYmFja0ZvclRlc3QoKSB7Ci0gICAgaWYgKGRlbGF5XyAhPSAwKSB7Ci0gICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkZWxheV8pKTsKLSAgICB9Ci0KLSAgICBjb3VudCsrOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bW92ZShidWZmZXJfLmZyb250KCkpOwotICAgIGJ1ZmZlcl8ucG9wKCk7Ci0gICAgc3RkOjpzdHJpbmcgY29weSA9ICpkYXRhOwotICAgIGlmIChidWZmZXJfLmVtcHR5KCkpIHsKLSAgICAgIHF1ZXVlXy0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICB9Ci0KLSAgICBhdXRvIHBhaXIgPSBwcm9taXNlX21hcF8tPmZpbmQoYnVmZmVyXy5zaXplKCkpOwotICAgIGlmIChwYWlyICE9IHByb21pc2VfbWFwXy0+ZW5kKCkpIHsKLSAgICAgIHBhaXItPnNlY29uZC5zZXRfdmFsdWUocGFpci0+Zmlyc3QpOwotICAgICAgcHJvbWlzZV9tYXBfLT5lcmFzZShwYWlyLT5maXJzdCk7Ci0gICAgfQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgdm9pZCBzZXREZWxheShpbnQgdmFsdWUpIHsKLSAgICBkZWxheV8gPSB2YWx1ZTsKLSAgfQotCi0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPj4gYnVmZmVyXzsKLSAgaW50IGNvdW50OwotCi0gcHJpdmF0ZToKLSAgSGFuZGxlciogaGFuZGxlcl87Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWVfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4qIHByb21pc2VfbWFwXzsKLSAgaW50IGRlbGF5XzsKLQotICB2b2lkIGhhbmRsZV9yZWdpc3Rlcl9lbnF1ZXVlKCkgewotICAgIHF1ZXVlXy0+UmVnaXN0ZXJFbnF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJlRlc3RFbnF1ZXVlRW5kOjpFbnF1ZXVlQ2FsbGJhY2tGb3JUZXN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgaGFuZGxlX3VucmVnaXN0ZXJfZW5xdWV1ZShzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIHF1ZXVlXy0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBwcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci19OwotCi1jbGFzcyBUZXN0RGVxdWV1ZUVuZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBUZXN0RGVxdWV1ZUVuZChRdWV1ZTxzdGQ6OnN0cmluZz4qIHF1ZXVlLCBIYW5kbGVyKiBoYW5kbGVyLCBpbnQgY2FwYWNpdHkpCi0gICAgICA6IGNvdW50KDApLCBoYW5kbGVyXyhoYW5kbGVyKSwgcXVldWVfKHF1ZXVlKSwgY2FwYWNpdHlfKGNhcGFjaXR5KSwgZGVsYXlfKDApIHt9Ci0KLSAgflRlc3REZXF1ZXVlRW5kKCkge30KLQotICB2b2lkIFJlZ2lzdGVyRGVxdWV1ZShzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4qIHByb21pc2VfbWFwKSB7Ci0gICAgcHJvbWlzZV9tYXBfID0gcHJvbWlzZV9tYXA7Ci0gICAgaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmVGVzdERlcXVldWVFbmQ6OmhhbmRsZV9yZWdpc3Rlcl9kZXF1ZXVlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlckRlcXVldWUoKSB7Ci0gICAgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2U7Ci0gICAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLQotICAgIGhhbmRsZXJfLT5Qb3N0KAotICAgICAgICBjb21tb246OkJpbmRPbmNlKCZUZXN0RGVxdWV1ZUVuZDo6aGFuZGxlX3VucmVnaXN0ZXJfZGVxdWV1ZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBzdGQ6Om1vdmUocHJvbWlzZSkpKTsKLSAgICBmdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgdm9pZCBEZXF1ZXVlQ2FsbGJhY2tGb3JUZXN0KCkgewotICAgIGlmIChkZWxheV8gIT0gMCkgewotICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZGVsYXlfKSk7Ci0gICAgfQotCi0gICAgY291bnQrKzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBxdWV1ZV8tPlRyeURlcXVldWUoKTsKLSAgICBidWZmZXJfLnB1c2goc3RkOjptb3ZlKGRhdGEpKTsKLQotICAgIGlmIChidWZmZXJfLnNpemUoKSA9PSBjYXBhY2l0eV8pIHsKLSAgICAgIHF1ZXVlXy0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICB9Ci0KLSAgICBhdXRvIHBhaXIgPSBwcm9taXNlX21hcF8tPmZpbmQoYnVmZmVyXy5zaXplKCkpOwotICAgIGlmIChwYWlyICE9IHByb21pc2VfbWFwXy0+ZW5kKCkpIHsKLSAgICAgIHBhaXItPnNlY29uZC5zZXRfdmFsdWUocGFpci0+Zmlyc3QpOwotICAgICAgcHJvbWlzZV9tYXBfLT5lcmFzZShwYWlyLT5maXJzdCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXREZWxheShpbnQgdmFsdWUpIHsKLSAgICBkZWxheV8gPSB2YWx1ZTsKLSAgfQotCi0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPj4gYnVmZmVyXzsKLSAgaW50IGNvdW50OwotCi0gcHJpdmF0ZToKLSAgSGFuZGxlciogaGFuZGxlcl87Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWVfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4qIHByb21pc2VfbWFwXzsKLSAgaW50IGNhcGFjaXR5XzsKLSAgaW50IGRlbGF5XzsKLQotICB2b2lkIGhhbmRsZV9yZWdpc3Rlcl9kZXF1ZXVlKCkgewotICAgIHF1ZXVlXy0+UmVnaXN0ZXJEZXF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJlRlc3REZXF1ZXVlRW5kOjpEZXF1ZXVlQ2FsbGJhY2tGb3JUZXN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgaGFuZGxlX3VucmVnaXN0ZXJfZGVxdWV1ZShzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIHF1ZXVlXy0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICBwcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci19OwotCi0vLyBFbnF1ZXVlIGVuZCBsZXZlbCA6IDAgLT4gcXVldWUgaXMgZnVsbCwgMSAtID4gIHF1ZXVlIGlzbid0IGZ1bGwKLS8vIERlcXVldWUgZW5kIGxldmVsIDogMCAtPiBxdWV1ZSBpcyBlbXB0eSwgMSAtID4gIHF1ZXVlIGlzbid0IGVtcHR5Ci0KLS8vIFRlc3QgMSA6IFF1ZXVlIGlzIGVtcHR5Ci0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAwCi0vLyBUZXN0IDEtMSBFbnF1ZXVlQ2FsbGJhY2sgc2hvdWxkIGNvbnRpbnVhbGx5IGJlIGludm9rZWQgd2hlbiBxdWV1ZSBpc24ndCBmdWxsCi1URVNUX0YoUXVldWVUZXN0LCByZWdpc3Rlcl9lbnF1ZXVlX3dpdGhfZW1wdHlfcXVldWUpIHsKLSAgUXVldWU8c3RkOjpzdHJpbmc+IHF1ZXVlKGtRdWV1ZVNpemUpOwotICBUZXN0RW5xdWV1ZUVuZCB0ZXN0X2VucXVldWVfZW5kKCZxdWV1ZSwgZW5xdWV1ZV9oYW5kbGVyXyk7Ci0KLSAgLy8gUHVzaCBrUXVldWVTaXplIGRhdGEgdG8gZW5xdWV1ZV9lbmQgYnVmZmVyCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga1F1ZXVlU2l6ZTsgaSsrKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiBkYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnN0cmluZz4oc3RkOjp0b19zdHJpbmcoaSkpOwotICAgIHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5wdXNoKHN0ZDo6bW92ZShkYXRhKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5zaXplKCksIChzaXplX3Qpa1F1ZXVlU2l6ZSk7Ci0KLSAgLy8gUmVnaXN0ZXIgZW5xdWV1ZSBhbmQgZXhwZWN0IGRhdGEgbW92ZSB0byBRdWV1ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZW5xdWV1ZV9wcm9taXNlX21hcDsKLSAgZW5xdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKDApLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwWzBdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwgMCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7Ci19Ci0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAwCi0vLyBUZXN0IDEtMiBEZXF1ZXVlQ2FsbGJhY2sgc2hvdWxkbid0IGJlIGludm9rZWQgd2hlbiBxdWV1ZSBpcyBlbXB0eQotVEVTVF9GKFF1ZXVlVGVzdCwgcmVnaXN0ZXJfZGVxdWV1ZV93aXRoX2VtcHR5X3F1ZXVlKSB7Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiBxdWV1ZShrUXVldWVTaXplKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtRdWV1ZVNpemUpOwotCi0gIC8vIFJlZ2lzdGVyIGRlcXVldWUsIERlcXVldWVDYWxsYmFjayBzaG91bGRuJ3QgYmUgaW52b2tlZAotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZGVxdWV1ZV9wcm9taXNlX21hcDsKLSAgdGVzdF9kZXF1ZXVlX2VuZC5SZWdpc3RlckRlcXVldWUoJmRlcXVldWVfcHJvbWlzZV9tYXApOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBFWFBFQ1RfRVEodGVzdF9kZXF1ZXVlX2VuZC5jb3VudCwgMCk7Ci0KLSAgdGVzdF9kZXF1ZXVlX2VuZC5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotfQotCi0vLyBUZXN0IDIgOiBRdWV1ZSBpcyBmdWxsCi0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMAotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxCi0vLyBUZXN0IDItMSBFbnF1ZXVlQ2FsbGJhY2sgc2hvdWxkbid0IGJlIGludm9rZWQgd2hlbiBxdWV1ZSBpcyBmdWxsCi1URVNUX0YoUXVldWVUZXN0LCByZWdpc3Rlcl9lbnF1ZXVlX3dpdGhfZnVsbF9xdWV1ZSkgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLQotICAvLyBtYWtlIFF1ZXVlIGZ1bGwKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUXVldWVTaXplOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihzdGQ6OnRvX3N0cmluZyhpKSk7Ci0gICAgdGVzdF9lbnF1ZXVlX2VuZC5idWZmZXJfLnB1c2goc3RkOjptb3ZlKGRhdGEpKTsKLSAgfQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZW5xdWV1ZV9wcm9taXNlX21hcDsKLSAgZW5xdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKDApLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwWzBdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwgMCk7Ci0KLSAgLy8gcHVzaCBzb21lIGRhdGEgdG8gZW5xdWV1ZV9lbmQgYnVmZmVyIGFuZCByZWdpc3RlciBlbnF1ZXVlOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtIYWxmT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHRlc3RfZW5xdWV1ZV9lbmQuUmVnaXN0ZXJFbnF1ZXVlKCZlbnF1ZXVlX3Byb21pc2VfbWFwKTsKLQotICAvLyBFbnF1ZXVlQ2FsbGJhY2sgc2hvdWxkbid0IGJlIGludm9rZWQKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgRVhQRUNUX0VRKHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5zaXplKCksIChzaXplX3Qpa0hhbGZPZlF1ZXVlU2l6ZSk7Ci0gIEVYUEVDVF9FUSh0ZXN0X2VucXVldWVfZW5kLmNvdW50LCBrUXVldWVTaXplKTsKLQotICB0ZXN0X2VucXVldWVfZW5kLlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci19Ci0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMAotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxCi0vLyBUZXN0IDItMiBEZXF1ZXVlQ2FsbGJhY2sgc2hvdWxkIGNvbnRpbnVhbGx5IGJlIGludm9rZWQgd2hlbiBxdWV1ZSBpc24ndCBlbXB0eQotVEVTVF9GKFF1ZXVlVGVzdCwgcmVnaXN0ZXJfZGVxdWV1ZV93aXRoX2Z1bGxfcXVldWUpIHsKLSAgUXVldWU8c3RkOjpzdHJpbmc+IHF1ZXVlKGtRdWV1ZVNpemUpOwotICBUZXN0RW5xdWV1ZUVuZCB0ZXN0X2VucXVldWVfZW5kKCZxdWV1ZSwgZW5xdWV1ZV9oYW5kbGVyXyk7Ci0gIFRlc3REZXF1ZXVlRW5kIHRlc3RfZGVxdWV1ZV9lbmQoJnF1ZXVlLCBkZXF1ZXVlX2hhbmRsZXJfLCBrRG91YmxlT2ZRdWV1ZVNpemUpOwotCi0gIC8vIG1ha2UgUXVldWUgZnVsbAotICBmb3IgKGludCBpID0gMDsgaSA8IGtRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBlbnF1ZXVlX3Byb21pc2VfbWFwOwotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoMCksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBbMF0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2VucXVldWVfZW5kLlJlZ2lzdGVyRW5xdWV1ZSgmZW5xdWV1ZV9wcm9taXNlX21hcCk7Ci0gIGVucXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGVucXVldWVfZnV0dXJlLmdldCgpLCAwKTsKLQotICAvLyBSZWdpc3RlciBkZXF1ZXVlIGFuZCBleHBlY3QgZGF0YSBtb3ZlIHRvIGRlcXVldWUgZW5kIGJ1ZmZlcgotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZGVxdWV1ZV9wcm9taXNlX21hcDsKLSAgZGVxdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGtRdWV1ZVNpemUpLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZGVxdWV1ZV9mdXR1cmUgPSBkZXF1ZXVlX3Byb21pc2VfbWFwW2tRdWV1ZVNpemVdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9kZXF1ZXVlX2VuZC5SZWdpc3RlckRlcXVldWUoJmRlcXVldWVfcHJvbWlzZV9tYXApOwotICBkZXF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShkZXF1ZXVlX2Z1dHVyZS5nZXQoKSwga1F1ZXVlU2l6ZSk7Ci0KLSAgdGVzdF9kZXF1ZXVlX2VuZC5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotfQotCi0vLyBUZXN0IDMgOiBRdWV1ZSBpcyBub24tZW1wdHkgYW5kIG5vbi1mdWxsCi0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxCi0vLyBUZXN0IDMtMSBSZWdpc3RlciBlbnF1ZXVlIHdpdGggaGFsZiBlbXB0eSBxdWV1ZSwgRW5xdWV1ZUNhbGxiYWNrIHNob3VsZCBjb250aW51YWxseSBiZSBpbnZva2VkCi1URVNUX0YoUXVldWVUZXN0LCByZWdpc3Rlcl9lbnF1ZXVlX3dpdGhfaGFsZl9lbXB0eV9xdWV1ZSkgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLQotICAvLyBtYWtlIFF1ZXVlIGhhbGYgZW1wdHkKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrSGFsZk9mUXVldWVTaXplOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihzdGQ6OnRvX3N0cmluZyhpKSk7Ci0gICAgdGVzdF9lbnF1ZXVlX2VuZC5idWZmZXJfLnB1c2goc3RkOjptb3ZlKGRhdGEpKTsKLSAgfQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZW5xdWV1ZV9wcm9taXNlX21hcDsKLSAgZW5xdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKDApLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwWzBdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwgMCk7Ci0KLSAgLy8gcHVzaCBzb21lIGRhdGEgdG8gZW5xdWV1ZV9lbmQgYnVmZmVyIGFuZCByZWdpc3RlciBlbnF1ZXVlOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtIYWxmT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0KLSAgLy8gUmVnaXN0ZXIgZW5xdWV1ZSBhbmQgZXhwZWN0IGRhdGEgbW92ZSB0byBRdWV1ZQotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoMCksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwWzBdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwgMCk7Ci19Ci0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxCi0vLyBUZXN0IDMtMiBSZWdpc3RlciBkZXF1ZXVlIHdpdGggaGFsZiBlbXB0eSBxdWV1ZSwgRGVxdWV1ZUNhbGxiYWNrIHNob3VsZCBjb250aW51YWxseSBiZSBpbnZva2VkCi1URVNUX0YoUXVldWVUZXN0LCByZWdpc3Rlcl9kZXF1ZXVlX3dpdGhfaGFsZl9lbXB0eV9xdWV1ZSkgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtRdWV1ZVNpemUpOwotCi0gIC8vIG1ha2UgUXVldWUgaGFsZiBlbXB0eQotICBmb3IgKGludCBpID0gMDsgaSA8IGtIYWxmT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBlbnF1ZXVlX3Byb21pc2VfbWFwOwotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoMCksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBbMF0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2VucXVldWVfZW5kLlJlZ2lzdGVyRW5xdWV1ZSgmZW5xdWV1ZV9wcm9taXNlX21hcCk7Ci0gIGVucXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGVucXVldWVfZnV0dXJlLmdldCgpLCAwKTsKLQotICAvLyBSZWdpc3RlciBkZXF1ZXVlIGFuZCBleHBlY3QgZGF0YSBtb3ZlIHRvIGRlcXVldWUgZW5kIGJ1ZmZlcgotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZGVxdWV1ZV9wcm9taXNlX21hcDsKLSAgZGVxdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKAotICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoa0hhbGZPZlF1ZXVlU2l6ZSksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBkZXF1ZXVlX2Z1dHVyZSA9IGRlcXVldWVfcHJvbWlzZV9tYXBba0hhbGZPZlF1ZXVlU2l6ZV0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2RlcXVldWVfZW5kLlJlZ2lzdGVyRGVxdWV1ZSgmZGVxdWV1ZV9wcm9taXNlX21hcCk7Ci0gIGRlcXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGRlcXVldWVfZnV0dXJlLmdldCgpLCBrSGFsZk9mUXVldWVTaXplKTsKLQotICB0ZXN0X2RlcXVldWVfZW5kLlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci19Ci0KLS8vIER5bmFtaWMgbGV2ZWwgdGVzdAotCi0vLyBUZXN0IDQgOiBRdWV1ZSBiZWNvbWVzIGZ1bGwgZHVyaW5nIHRlc3QsIEVucXVldWVDYWxsYmFjayBzaG91bGQgc3RvcCB0byBiZSBpbnZva2VkCi0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMSAtPiAwCi0vLyBEZXF1ZXVlIGVuZCBsZXZlbCA6IDEKLS8vIFRlc3QgNC0xIFF1ZXVlIGJlY29tZXMgZnVsbCBkdWUgdG8gb25seSByZWdpc3RlciBFbnF1ZXVlQ2FsbGJhY2sKLVRFU1RfRihRdWV1ZVRlc3QsIHF1ZXVlX2JlY29tZXNfZnVsbF9lbnF1ZXVlX2NhbGxiYWNrX29ubHkpIHsKLSAgUXVldWU8c3RkOjpzdHJpbmc+IHF1ZXVlKGtRdWV1ZVNpemUpOwotICBUZXN0RW5xdWV1ZUVuZCB0ZXN0X2VucXVldWVfZW5kKCZxdWV1ZSwgZW5xdWV1ZV9oYW5kbGVyXyk7Ci0KLSAgLy8gcHVzaCBkb3VibGUgb2Yga1F1ZXVlU2l6ZSB0byBlbnF1ZXVlIGVuZCBidWZmZXIKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRG91YmxlT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0KLSAgLy8gUmVnaXN0ZXIgZW5xdWV1ZSBhbmQgZXhwZWN0IGtRdWV1ZVNpemUgZGF0YSBtb3ZlIHRvIFF1ZXVlCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBlbnF1ZXVlX3Byb21pc2VfbWFwOwotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoa1F1ZXVlU2l6ZSksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBba1F1ZXVlU2l6ZV0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2VucXVldWVfZW5kLlJlZ2lzdGVyRW5xdWV1ZSgmZW5xdWV1ZV9wcm9taXNlX21hcCk7Ci0gIGVucXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGVucXVldWVfZnV0dXJlLmdldCgpLCBrUXVldWVTaXplKTsKLQotICAvLyBFbnF1ZXVlQ2FsbGJhY2sgc2hvdWxkbid0IGJlIGludm9rZWQgYW5kIGJ1ZmZlciBzaXplIHN0YXkgaW4ga1F1ZXVlU2l6ZQotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBFWFBFQ1RfRVEodGVzdF9lbnF1ZXVlX2VuZC5idWZmZXJfLnNpemUoKSwgKHNpemVfdClrUXVldWVTaXplKTsKLSAgRVhQRUNUX0VRKHRlc3RfZW5xdWV1ZV9lbmQuY291bnQsIGtRdWV1ZVNpemUpOwotCi0gIHRlc3RfZW5xdWV1ZV9lbmQuVW5yZWdpc3RlckVucXVldWUoKTsKLX0KLQotLy8gRW5xdWV1ZSBlbmQgbGV2ZWwgOiAxIC0+IDAKLS8vIERlcXVldWUgZW5kIGxldmVsIDogMQotLy8gVGVzdCA0LTIgUXVldWUgYmVjb21lcyBmdWxsIGR1ZSB0byBEZXF1ZXVlQ2FsbGJhY2sgdW5yZWdpc3RlciBkdXJpbmcgdGVzdAotVEVTVF9GKFF1ZXVlVGVzdCwgcXVldWVfYmVjb21lc19mdWxsX2RlcXVldWVfY2FsbGJhY2tfdW5yZWdpc3RlcikgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtIYWxmT2ZRdWV1ZVNpemUpOwotCi0gIC8vIHB1c2ggZG91YmxlIG9mIGtRdWV1ZVNpemUgdG8gZW5xdWV1ZSBlbmQgYnVmZmVyCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0RvdWJsZU9mUXVldWVTaXplOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihzdGQ6OnRvX3N0cmluZyhpKSk7Ci0gICAgdGVzdF9lbnF1ZXVlX2VuZC5idWZmZXJfLnB1c2goc3RkOjptb3ZlKGRhdGEpKTsKLSAgfQotCi0gIC8vIFJlZ2lzdGVyIGRlcXVldWUKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpwcm9taXNlPGludD4+IGRlcXVldWVfcHJvbWlzZV9tYXA7Ci0gIGRlcXVldWVfcHJvbWlzZV9tYXAuZW1wbGFjZSgKLSAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGtIYWxmT2ZRdWV1ZVNpemUpLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZGVxdWV1ZV9mdXR1cmUgPSBkZXF1ZXVlX3Byb21pc2VfbWFwW2tIYWxmT2ZRdWV1ZVNpemVdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9kZXF1ZXVlX2VuZC5SZWdpc3RlckRlcXVldWUoJmRlcXVldWVfcHJvbWlzZV9tYXApOwotCi0gIC8vIFJlZ2lzdGVyIGVucXVldWUKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpwcm9taXNlPGludD4+IGVucXVldWVfcHJvbWlzZV9tYXA7Ci0gIGVucXVldWVfcHJvbWlzZV9tYXAuZW1wbGFjZSgKLSAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGtIYWxmT2ZRdWV1ZVNpemUpLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwW2tIYWxmT2ZRdWV1ZVNpemVdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotCi0gIC8vIERlcXVldWUgZW5kIHdpbGwgdW5yZWdpc3RlciB3aGVuIGJ1ZmZlciBzaXplIGlzIGtIYWxmT2ZRdWV1ZVNpemUKLSAgZGVxdWV1ZV9mdXR1cmUud2FpdCgpOwotICBFWFBFQ1RfRVEoZGVxdWV1ZV9mdXR1cmUuZ2V0KCksIGtIYWxmT2ZRdWV1ZVNpemUpOwotCi0gIC8vIEVucXVldWVDYWxsYmFjayBzaG91bGRuJ3QgYmUgaW52b2tlZCBhbmQgYnVmZmVyIHNpemUgc3RheSBpbiBrSGFsZk9mUXVldWVTaXplCi0gIGVucXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGVucXVldWVfZnV0dXJlLmdldCgpLCBrSGFsZk9mUXVldWVTaXplKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgRVhQRUNUX0VRKHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5zaXplKCksIChzaXplX3Qpa0hhbGZPZlF1ZXVlU2l6ZSk7Ci0gIEVYUEVDVF9FUSh0ZXN0X2VucXVldWVfZW5kLmNvdW50LCBrUXVldWVTaXplICsga0hhbGZPZlF1ZXVlU2l6ZSk7Ci0KLSAgdGVzdF9lbnF1ZXVlX2VuZC5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotfQotCi0vLyBFbnF1ZXVlIGVuZCBsZXZlbCA6IDEgLT4gMAotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxCi0vLyBUZXN0IDQtMyBRdWV1ZSBiZWNvbWVzIGZ1bGwgZHVlIHRvIERlcXVldWVDYWxsYmFjayBpcyBzbG93ZXIKLVRFU1RfRihRdWV1ZVRlc3QsIHF1ZXVlX2JlY29tZXNfZnVsbF9kZXF1ZXVlX2NhbGxiYWNrX3Nsb3dlcikgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtEb3VibGVPZlF1ZXVlU2l6ZSk7Ci0KLSAgLy8gcHVzaCBkb3VibGUgb2Yga0RvdWJsZU9mUXVldWVTaXplIHRvIGVucXVldWUgZW5kIGJ1ZmZlcgotICBmb3IgKGludCBpID0gMDsgaSA8IGtEb3VibGVPZlF1ZXVlU2l6ZTsgaSsrKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiBkYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnN0cmluZz4oc3RkOjp0b19zdHJpbmcoaSkpOwotICAgIHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5wdXNoKHN0ZDo6bW92ZShkYXRhKSk7Ci0gIH0KLQotICAvLyBTZXQgMjAgbXMgZGVsYXkgZm9yIGNhbGxiYWNrIGFuZCByZWdpc3RlciBkZXF1ZXVlCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBkZXF1ZXVlX3Byb21pc2VfbWFwOwotICB0ZXN0X2RlcXVldWVfZW5kLnNldERlbGF5KDIwKTsKLSAgYXV0byBkZXF1ZXVlX2Z1dHVyZSA9IGRlcXVldWVfcHJvbWlzZV9tYXBba0hhbGZPZlF1ZXVlU2l6ZV0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2RlcXVldWVfZW5kLlJlZ2lzdGVyRGVxdWV1ZSgmZGVxdWV1ZV9wcm9taXNlX21hcCk7Ci0KLSAgLy8gUmVnaXN0ZXIgZW5xdWV1ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZW5xdWV1ZV9wcm9taXNlX21hcDsKLSAgZW5xdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKDApLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwWzBdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotCi0gIC8vIFdhaXQgZm9yIGVucXVldWUgYnVmZmVyIGVtcHR5IGFuZCBleHBlY3QgcXVldWUgaXMgZnVsbAotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwgMCk7Ci0gIEVYUEVDVF9HRSh0ZXN0X2RlcXVldWVfZW5kLmJ1ZmZlcl8uc2l6ZSgpLCBrUXVldWVTaXplIC0gMSk7Ci0KLSAgdGVzdF9kZXF1ZXVlX2VuZC5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotfQotCi0vLyBFbnF1ZXVlIGVuZCBsZXZlbCA6IDAgLT4gMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxIC0+IDAKLS8vIFRlc3QgNSBRdWV1ZSBiZWNvbWVzIGZ1bGwgYW5kIG5vbiBlbXB0eSBhdCBzYW1lIHRpbWUuCi1URVNUX0YoUXVldWVUZXN0LCBxdWV1ZV9iZWNvbWVzX2Z1bGxfYW5kX25vbl9lbXB0eV9hdF9zYW1lX3RpbWUpIHsKLSAgUXVldWU8c3RkOjpzdHJpbmc+IHF1ZXVlKGtRdWV1ZVNpemVPbmUpOwotICBUZXN0RW5xdWV1ZUVuZCB0ZXN0X2VucXVldWVfZW5kKCZxdWV1ZSwgZW5xdWV1ZV9oYW5kbGVyXyk7Ci0gIFRlc3REZXF1ZXVlRW5kIHRlc3RfZGVxdWV1ZV9lbmQoJnF1ZXVlLCBkZXF1ZXVlX2hhbmRsZXJfLCBrRG91YmxlT2ZRdWV1ZVNpemUpOwotCi0gIC8vIHB1c2ggZG91YmxlIG9mIGtRdWV1ZVNpemUgdG8gZW5xdWV1ZSBlbmQgYnVmZmVyCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga1F1ZXVlU2l6ZTsgaSsrKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiBkYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnN0cmluZz4oc3RkOjp0b19zdHJpbmcoaSkpOwotICAgIHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5wdXNoKHN0ZDo6bW92ZShkYXRhKSk7Ci0gIH0KLQotICAvLyBSZWdpc3RlciBkZXF1ZXVlCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBkZXF1ZXVlX3Byb21pc2VfbWFwOwotICBkZXF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoa1F1ZXVlU2l6ZSksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBkZXF1ZXVlX2Z1dHVyZSA9IGRlcXVldWVfcHJvbWlzZV9tYXBba1F1ZXVlU2l6ZV0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2RlcXVldWVfZW5kLlJlZ2lzdGVyRGVxdWV1ZSgmZGVxdWV1ZV9wcm9taXNlX21hcCk7Ci0KLSAgLy8gUmVnaXN0ZXIgZW5xdWV1ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZW5xdWV1ZV9wcm9taXNlX21hcDsKLSAgYXV0byBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBbMF0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2VucXVldWVfZW5kLlJlZ2lzdGVyRW5xdWV1ZSgmZW5xdWV1ZV9wcm9taXNlX21hcCk7Ci0KLSAgLy8gV2FpdCBmb3IgYWxsIGRhdGEgbW92ZSBmcm9tIGVucXVldWUgZW5kIGJ1ZmZlciB0byBkZXF1ZXVlIGVuZCBidWZmZXIKLSAgZGVxdWV1ZV9mdXR1cmUud2FpdCgpOwotICBFWFBFQ1RfRVEoZGVxdWV1ZV9mdXR1cmUuZ2V0KCksIGtRdWV1ZVNpemUpOwotCi0gIHRlc3RfZGVxdWV1ZV9lbmQuVW5yZWdpc3RlckRlcXVldWUoKTsKLX0KLQotLy8gRW5xdWV1ZSBlbmQgbGV2ZWwgOiAxIC0+IDAKLS8vIERlcXVldWUgZW5kIGxldmVsIDogMQotLy8gVGVzdCA2IFF1ZXVlIGJlY29tZXMgbm90IGZ1bGwgZHVyaW5nIHRlc3QsIEVucXVldWVDYWxsYmFjayBzaG91bGQgc3RhcnQgdG8gYmUgaW52b2tlZAotVEVTVF9GKFF1ZXVlVGVzdCwgcXVldWVfYmVjb21lc19ub25fZnVsbF9kdXJpbmdfdGVzdCkgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtRdWV1ZVNpemUgKiAzKTsKLQotICAvLyBtYWtlIFF1ZXVlIGZ1bGwKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRG91YmxlT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBlbnF1ZXVlX3Byb21pc2VfbWFwOwotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoa1F1ZXVlU2l6ZSksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgZW5xdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKDApLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwW2tRdWV1ZVNpemVdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwga1F1ZXVlU2l6ZSk7Ci0KLSAgLy8gRXhwZWN0IGtRdWV1ZVNpemUgZGF0YSBibG9jayBpbiBlbnF1ZXVlIGVuZCBidWZmZXIKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgRVhQRUNUX0VRKHRlc3RfZW5xdWV1ZV9lbmQuYnVmZmVyXy5zaXplKCksIGtRdWV1ZVNpemUpOwotCi0gIC8vIFJlZ2lzdGVyIGRlcXVldWUKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpwcm9taXNlPGludD4+IGRlcXVldWVfcHJvbWlzZV9tYXA7Ci0gIHRlc3RfZGVxdWV1ZV9lbmQuUmVnaXN0ZXJEZXF1ZXVlKCZkZXF1ZXVlX3Byb21pc2VfbWFwKTsKLQotICAvLyBFeHBlY3QgZW5xdWV1ZSBlbmQgd2lsbCBlbXB0eQotICBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBbMF0uZ2V0X2Z1dHVyZSgpOwotICBlbnF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShlbnF1ZXVlX2Z1dHVyZS5nZXQoKSwgMCk7Ci0KLSAgdGVzdF9kZXF1ZXVlX2VuZC5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotfQotCi0vLyBFbnF1ZXVlIGVuZCBsZXZlbCA6IDAgLT4gMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxIC0+IDAKLS8vIFRlc3QgNyBRdWV1ZSBiZWNvbWVzIG5vbiBmdWxsIGFuZCBlbXB0eSBhdCBzYW1lIHRpbWUuIChFeGFjdGx5IHNhbWUgYXMgVGVzdCA1KQotVEVTVF9GKFF1ZXVlVGVzdCwgcXVldWVfYmVjb21lc19ub25fZnVsbF9hbmRfZW1wdHlfYXRfc2FtZV90aW1lKSB7Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiBxdWV1ZShrUXVldWVTaXplT25lKTsKLSAgVGVzdEVucXVldWVFbmQgdGVzdF9lbnF1ZXVlX2VuZCgmcXVldWUsIGVucXVldWVfaGFuZGxlcl8pOwotICBUZXN0RGVxdWV1ZUVuZCB0ZXN0X2RlcXVldWVfZW5kKCZxdWV1ZSwgZGVxdWV1ZV9oYW5kbGVyXywga0RvdWJsZU9mUXVldWVTaXplKTsKLQotICAvLyBwdXNoIGRvdWJsZSBvZiBrUXVldWVTaXplIHRvIGVucXVldWUgZW5kIGJ1ZmZlcgotICBmb3IgKGludCBpID0gMDsgaSA8IGtRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0KLSAgLy8gUmVnaXN0ZXIgZGVxdWV1ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZGVxdWV1ZV9wcm9taXNlX21hcDsKLSAgZGVxdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGtRdWV1ZVNpemUpLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZGVxdWV1ZV9mdXR1cmUgPSBkZXF1ZXVlX3Byb21pc2VfbWFwW2tRdWV1ZVNpemVdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9kZXF1ZXVlX2VuZC5SZWdpc3RlckRlcXVldWUoJmRlcXVldWVfcHJvbWlzZV9tYXApOwotCi0gIC8vIFJlZ2lzdGVyIGVucXVldWUKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpwcm9taXNlPGludD4+IGVucXVldWVfcHJvbWlzZV9tYXA7Ci0gIGF1dG8gZW5xdWV1ZV9mdXR1cmUgPSBlbnF1ZXVlX3Byb21pc2VfbWFwWzBdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotCi0gIC8vIFdhaXQgZm9yIGFsbCBkYXRhIG1vdmUgZnJvbSBlbnF1ZXVlIGVuZCBidWZmZXIgdG8gZGVxdWV1ZSBlbmQgYnVmZmVyCi0gIGRlcXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGRlcXVldWVfZnV0dXJlLmdldCgpLCBrUXVldWVTaXplKTsKLQotICB0ZXN0X2RlcXVldWVfZW5kLlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci19Ci0KLS8vIFRlc3QgOCA6IFF1ZXVlIGJlY29tZXMgZW1wdHkgZHVyaW5nIHRlc3QsIERlcXVldWVDYWxsYmFjayBzaG91bGQgc3RvcCB0byBiZSBpbnZva2VkCi0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxIC0+IDAKLS8vIFRlc3QgOC0xIFF1ZXVlIGJlY29tZXMgZW1wdHkgZHVlIHRvIG9ubHkgcmVnaXN0ZXIgRGVxdWV1ZUNhbGxiYWNrCi1URVNUX0YoUXVldWVUZXN0LCBxdWV1ZV9iZWNvbWVzX2VtcHR5X2RlcXVldWVfY2FsbGJhY2tfb25seSkgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtIYWxmT2ZRdWV1ZVNpemUpOwotCi0gIC8vIG1ha2UgUXVldWUgaGFsZiBlbXB0eQotICBmb3IgKGludCBpID0gMDsgaSA8IGtIYWxmT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBlbnF1ZXVlX3Byb21pc2VfbWFwOwotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoMCksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBbMF0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2VucXVldWVfZW5kLlJlZ2lzdGVyRW5xdWV1ZSgmZW5xdWV1ZV9wcm9taXNlX21hcCk7Ci0gIGVucXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGVucXVldWVfZnV0dXJlLmdldCgpLCAwKTsKLQotICAvLyBSZWdpc3RlciBkZXF1ZXVlLCBleHBlY3Qga0hhbGZPZlF1ZXVlU2l6ZSBkYXRhIG1vdmUgdG8gZGVxdWV1ZSBlbmQgYnVmZmVyCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBkZXF1ZXVlX3Byb21pc2VfbWFwOwotICBkZXF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2UoCi0gICAgICBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShrSGFsZk9mUXVldWVTaXplKSwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKCkpOwotICBhdXRvIGRlcXVldWVfZnV0dXJlID0gZGVxdWV1ZV9wcm9taXNlX21hcFtrSGFsZk9mUXVldWVTaXplXS5nZXRfZnV0dXJlKCk7Ci0gIHRlc3RfZGVxdWV1ZV9lbmQuUmVnaXN0ZXJEZXF1ZXVlKCZkZXF1ZXVlX3Byb21pc2VfbWFwKTsKLSAgZGVxdWV1ZV9mdXR1cmUud2FpdCgpOwotICBFWFBFQ1RfRVEoZGVxdWV1ZV9mdXR1cmUuZ2V0KCksIGtIYWxmT2ZRdWV1ZVNpemUpOwotCi0gIC8vIEV4cGVjdCBEZXF1ZXVlQ2FsbGJhY2sgc2hvdWxkIHN0b3AgdG8gYmUgaW52b2tlZAotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICBFWFBFQ1RfRVEodGVzdF9kZXF1ZXVlX2VuZC5jb3VudCwga0hhbGZPZlF1ZXVlU2l6ZSk7Ci19Ci0KLS8vIEVucXVldWUgZW5kIGxldmVsIDogMQotLy8gRGVxdWV1ZSBlbmQgbGV2ZWwgOiAxIC0+IDAKLS8vIFRlc3QgOC0yIFF1ZXVlIGJlY29tZXMgZW1wdHkgZHVlIHRvIEVucXVldWVDYWxsYmFjayB1bnJlZ2lzdGVyIGR1cmluZyB0ZXN0Ci1URVNUX0YoUXVldWVUZXN0LCBxdWV1ZV9iZWNvbWVzX2VtcHR5X2VucXVldWVfY2FsbGJhY2tfdW5yZWdpc3RlcikgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoa1F1ZXVlU2l6ZSk7Ci0gIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQoJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfKTsKLSAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZCgmcXVldWUsIGRlcXVldWVfaGFuZGxlcl8sIGtRdWV1ZVNpemUpOwotCi0gIC8vIG1ha2UgUXVldWUgaGFsZiBlbXB0eQotICBmb3IgKGludCBpID0gMDsgaSA8IGtIYWxmT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6cHJvbWlzZTxpbnQ+PiBlbnF1ZXVlX3Byb21pc2VfbWFwOwotICBlbnF1ZXVlX3Byb21pc2VfbWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoMCksIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKLSAgYXV0byBlbnF1ZXVlX2Z1dHVyZSA9IGVucXVldWVfcHJvbWlzZV9tYXBbMF0uZ2V0X2Z1dHVyZSgpOwotICB0ZXN0X2VucXVldWVfZW5kLlJlZ2lzdGVyRW5xdWV1ZSgmZW5xdWV1ZV9wcm9taXNlX21hcCk7Ci0gIGVucXVldWVfZnV0dXJlLndhaXQoKTsKLSAgRVhQRUNUX0VRKGVucXVldWVfZnV0dXJlLmdldCgpLCAwKTsKLQotICAvLyBwdXNoIGtIYWxmT2ZRdWV1ZVNpemUgdG8gZW5xdWV1ZSBlbmQgYnVmZmVyIGFuZCByZWdpc3RlciBlbnF1ZXVlLgotICBmb3IgKGludCBpID0gMDsgaSA8IGtIYWxmT2ZRdWV1ZVNpemU7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICB0ZXN0X2VucXVldWVfZW5kLmJ1ZmZlcl8ucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICB9Ci0gIHRlc3RfZW5xdWV1ZV9lbmQuUmVnaXN0ZXJFbnF1ZXVlKCZlbnF1ZXVlX3Byb21pc2VfbWFwKTsKLQotICAvLyBSZWdpc3RlciBkZXF1ZXVlLCBleHBlY3Qga1F1ZXVlU2l6ZSBtb3ZlIHRvIGRlcXVldWUgZW5kIGJ1ZmZlcgotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZGVxdWV1ZV9wcm9taXNlX21hcDsKLSAgZGVxdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGtRdWV1ZVNpemUpLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIGF1dG8gZGVxdWV1ZV9mdXR1cmUgPSBkZXF1ZXVlX3Byb21pc2VfbWFwW2tRdWV1ZVNpemVdLmdldF9mdXR1cmUoKTsKLSAgdGVzdF9kZXF1ZXVlX2VuZC5SZWdpc3RlckRlcXVldWUoJmRlcXVldWVfcHJvbWlzZV9tYXApOwotICBkZXF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShkZXF1ZXVlX2Z1dHVyZS5nZXQoKSwga1F1ZXVlU2l6ZSk7Ci0KLSAgLy8gRXhwZWN0IERlcXVldWVDYWxsYmFjayBzaG91bGQgc3RvcCB0byBiZSBpbnZva2VkCi0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7Ci0gIEVYUEVDVF9FUSh0ZXN0X2RlcXVldWVfZW5kLmNvdW50LCBrUXVldWVTaXplKTsKLX0KLQotLy8gRW5xdWV1ZSBlbmQgbGV2ZWwgOiAxCi0vLyBEZXF1ZXVlIGVuZCBsZXZlbCA6IDAgLT4gMQotLy8gVGVzdCA5IFF1ZXVlIGJlY29tZXMgbm90IGVtcHR5IGR1cmluZyB0ZXN0LCBEZXF1ZXVlQ2FsbGJhY2sgc2hvdWxkIHN0YXJ0IHRvIGJlIGludm9rZWQKLVRFU1RfRihRdWV1ZVRlc3QsIHF1ZXVlX2JlY29tZXNfbm9uX2VtcHR5X2R1cmluZ190ZXN0KSB7Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiBxdWV1ZShrUXVldWVTaXplKTsKLSAgVGVzdEVucXVldWVFbmQgdGVzdF9lbnF1ZXVlX2VuZCgmcXVldWUsIGVucXVldWVfaGFuZGxlcl8pOwotICBUZXN0RGVxdWV1ZUVuZCB0ZXN0X2RlcXVldWVfZW5kKCZxdWV1ZSwgZGVxdWV1ZV9oYW5kbGVyXywga1F1ZXVlU2l6ZSk7Ci0KLSAgLy8gUmVnaXN0ZXIgZGVxdWV1ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZGVxdWV1ZV9wcm9taXNlX21hcDsKLSAgZGVxdWV1ZV9wcm9taXNlX21hcC5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGtRdWV1ZVNpemUpLCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoKSk7Ci0gIHRlc3RfZGVxdWV1ZV9lbmQuUmVnaXN0ZXJEZXF1ZXVlKCZkZXF1ZXVlX3Byb21pc2VfbWFwKTsKLQotICAvLyBwdXNoIGtRdWV1ZVNpemUgZGF0YSB0byBlbnF1ZXVlIGVuZCBidWZmZXIgYW5kIHJlZ2lzdGVyIGVucXVldWUKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUXVldWVTaXplOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihzdGQ6OnRvX3N0cmluZyhpKSk7Ci0gICAgdGVzdF9lbnF1ZXVlX2VuZC5idWZmZXJfLnB1c2goc3RkOjptb3ZlKGRhdGEpKTsKLSAgfQotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnByb21pc2U8aW50Pj4gZW5xdWV1ZV9wcm9taXNlX21hcDsKLSAgdGVzdF9lbnF1ZXVlX2VuZC5SZWdpc3RlckVucXVldWUoJmVucXVldWVfcHJvbWlzZV9tYXApOwotCi0gIC8vIEV4cGVjdCBrUXVldWVTaXplIGRhdGEgbW92ZSB0byBkZXF1ZXVlIGVuZCBidWZmZXIKLSAgYXV0byBkZXF1ZXVlX2Z1dHVyZSA9IGRlcXVldWVfcHJvbWlzZV9tYXBba1F1ZXVlU2l6ZV0uZ2V0X2Z1dHVyZSgpOwotICBkZXF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIEVYUEVDVF9FUShkZXF1ZXVlX2Z1dHVyZS5nZXQoKSwga1F1ZXVlU2l6ZSk7Ci19Ci0KLVRFU1RfRihRdWV1ZVRlc3QsIHBhc3Nfc21hcnRfcG9pbnRlcl9hbmRfdW5yZWdpc3RlcikgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4qIHF1ZXVlID0gbmV3IFF1ZXVlPHN0ZDo6c3RyaW5nPihrUXVldWVTaXplKTsKLQotICAvLyBFbnF1ZXVlIGEgc3RyaW5nCi0gIHN0ZDo6c3RyaW5nIHZhbGlkID0gIlZhbGlkIFN0cmluZyI7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnN0cmluZz4gc2hhcmVkID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnN0cmluZz4odmFsaWQpOwotICBxdWV1ZS0+UmVnaXN0ZXJFbnF1ZXVlKAotICAgICAgZW5xdWV1ZV9oYW5kbGVyXywKLSAgICAgIGNvbW1vbjo6QmluZCgKLSAgICAgICAgICBbXShRdWV1ZTxzdGQ6OnN0cmluZz4qIHF1ZXVlLCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpzdHJpbmc+IHNoYXJlZCkgewotICAgICAgICAgICAgcXVldWUtPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnN0cmluZz4oKnNoYXJlZCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBjb21tb246OlVucmV0YWluZWQocXVldWUpLAotICAgICAgICAgIHNoYXJlZCkpOwotCi0gIC8vIERlcXVldWUgdGhlIHN0cmluZwotICBxdWV1ZS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgZGVxdWV1ZV9oYW5kbGVyXywKLSAgICAgIGNvbW1vbjo6QmluZCgKLSAgICAgICAgICBbXShRdWV1ZTxzdGQ6OnN0cmluZz4qIHF1ZXVlLCBzdGQ6OnN0cmluZyB2YWxpZCkgewotICAgICAgICAgICAgcXVldWUtPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgICAgICAgICBhdXRvIGFuc3dlciA9ICpxdWV1ZS0+VHJ5RGVxdWV1ZSgpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGFuc3dlciwgdmFsaWQpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHF1ZXVlKSwKLSAgICAgICAgICB2YWxpZCkpOwotCi0gIC8vIFdhaXQgZm9yIGJvdGggaGFuZGxlcnMgdG8gZmluaXNoIGFuZCBkZWxldGUgdGhlIFF1ZXVlCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotCi0gIGVucXVldWVfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgIFtdKG9zOjpIYW5kbGVyKiBkZXF1ZXVlX2hhbmRsZXIsIFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWUsIHN0ZDo6cHJvbWlzZTx2b2lkPiogcHJvbWlzZSkgewotICAgICAgICBkZXF1ZXVlX2hhbmRsZXItPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICAgICAgIFtdKFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWUsIHN0ZDo6cHJvbWlzZTx2b2lkPiogcHJvbWlzZSkgewotICAgICAgICAgICAgICBkZWxldGUgcXVldWU7Ci0gICAgICAgICAgICAgIHByb21pc2UtPnNldF92YWx1ZSgpOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChxdWV1ZSksCi0gICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQocHJvbWlzZSkpKTsKLSAgICAgIH0sCi0gICAgICBjb21tb246OlVucmV0YWluZWQoZGVxdWV1ZV9oYW5kbGVyXyksCi0gICAgICBjb21tb246OlVucmV0YWluZWQocXVldWUpLAotICAgICAgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICBmdXR1cmUud2FpdCgpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IHNsZWVwX2FuZF9lbnF1ZXVlX2NhbGxiYWNrKGludCogdG9faW5jcmVhc2UpIHsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7Ci0gICgqdG9faW5jcmVhc2UpKys7Ci0gIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPigiSGVsbG8iKTsKLX0KLQotVEVTVF9GKFF1ZXVlVGVzdCwgdW5yZWdpc3Rlcl9lbnF1ZXVlX2FuZF93YWl0KSB7Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiBxdWV1ZSgxMCk7Ci0gIGludCogaW5kaWNhdG9yID0gbmV3IGludCgxMDApOwotICBxdWV1ZS5SZWdpc3RlckVucXVldWUoZW5xdWV1ZV9oYW5kbGVyXywgY29tbW9uOjpCaW5kKCZzbGVlcF9hbmRfZW5xdWV1ZV9jYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKGluZGljYXRvcikpKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNTApKTsKLSAgcXVldWUuVW5yZWdpc3RlckVucXVldWUoKTsKLSAgRVhQRUNUX0VRKCppbmRpY2F0b3IsIDEwMSk7Ci0gIGRlbGV0ZSBpbmRpY2F0b3I7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gc2xlZXBfYW5kX2VucXVldWVfY2FsbGJhY2tfYW5kX3VucmVnaXN0ZXIoCi0gICAgaW50KiB0b19pbmNyZWFzZSwgUXVldWU8c3RkOjpzdHJpbmc+KiBxdWV1ZSwgc3RkOjphdG9taWNfYm9vbCogaXNfcmVnaXN0ZXJlZCkgewotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKLSAgKCp0b19pbmNyZWFzZSkrKzsKLSAgaWYgKGlzX3JlZ2lzdGVyZWQtPmV4Y2hhbmdlKGZhbHNlKSkgewotICAgIHF1ZXVlLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICB9Ci0gIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPigiSGVsbG8iKTsKLX0KLQotVEVTVF9GKFF1ZXVlVGVzdCwgdW5yZWdpc3Rlcl9lbnF1ZXVlX2FuZF93YWl0X21heWJlX3VucmVnaXN0ZXJlZCkgewotICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUoMTApOwotICBpbnQqIGluZGljYXRvciA9IG5ldyBpbnQoMTAwKTsKLSAgc3RkOjphdG9taWNfYm9vbCBpc19yZWdpc3RlcmVkID0gdHJ1ZTsKLSAgcXVldWUuUmVnaXN0ZXJFbnF1ZXVlKAotICAgICAgZW5xdWV1ZV9oYW5kbGVyXywKLSAgICAgIGNvbW1vbjo6QmluZCgKLSAgICAgICAgICAmc2xlZXBfYW5kX2VucXVldWVfY2FsbGJhY2tfYW5kX3VucmVnaXN0ZXIsCi0gICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGluZGljYXRvciksCi0gICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKCZxdWV1ZSksCi0gICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKCZpc19yZWdpc3RlcmVkKSkpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg1MCkpOwotICBpZiAoaXNfcmVnaXN0ZXJlZC5leGNoYW5nZShmYWxzZSkpIHsKLSAgICBxdWV1ZS5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICB9Ci0gIEVYUEVDVF9FUSgqaW5kaWNhdG9yLCAxMDEpOwotICBkZWxldGUgaW5kaWNhdG9yOwotfQotCi12b2lkIHNsZWVwX2FuZF9kZXF1ZXVlX2NhbGxiYWNrKGludCogdG9faW5jcmVhc2UpIHsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7Ci0gICgqdG9faW5jcmVhc2UpKys7Ci19Ci0KLVRFU1RfRihRdWV1ZVRlc3QsIHVucmVnaXN0ZXJfZGVxdWV1ZV9hbmRfd2FpdCkgewotICBpbnQqIGluZGljYXRvciA9IG5ldyBpbnQoMTAwKTsKLSAgUXVldWU8c3RkOjpzdHJpbmc+IHF1ZXVlKDEwKTsKLSAgcXVldWUuUmVnaXN0ZXJFbnF1ZXVlKAotICAgICAgZW5xdWV1ZV9oYW5kbGVyXywKLSAgICAgIGNvbW1vbjo6QmluZCgKLSAgICAgICAgICBbXShRdWV1ZTxzdGQ6OnN0cmluZz4qIHF1ZXVlKSB7Ci0gICAgICAgICAgICBxdWV1ZS0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPigiSGVsbG8iKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZCgmcXVldWUpKSk7Ci0gIHF1ZXVlLlJlZ2lzdGVyRGVxdWV1ZShlbnF1ZXVlX2hhbmRsZXJfLCBjb21tb246OkJpbmQoJnNsZWVwX2FuZF9kZXF1ZXVlX2NhbGxiYWNrLCBjb21tb246OlVucmV0YWluZWQoaW5kaWNhdG9yKSkpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg1MCkpOwotICBxdWV1ZS5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICBFWFBFQ1RfRVEoKmluZGljYXRvciwgMTAxKTsKLSAgZGVsZXRlIGluZGljYXRvcjsKLX0KLQotLy8gQ3JlYXRlIGFsbCB0aHJlYWRzIGZvciBkZWF0aCB0ZXN0cyBpbiB0aGUgZnVuY3Rpb24gdGhhdCBkaWVzCi1jbGFzcyBRdWV1ZURlYXRoVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBSZWdpc3RlckVucXVldWVBbmREZWxldGUoKSB7Ci0gICAgVGhyZWFkKiBlbnF1ZXVlX3RocmVhZCA9IG5ldyBUaHJlYWQoImVucXVldWVfdGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBIYW5kbGVyKiBlbnF1ZXVlX2hhbmRsZXIgPSBuZXcgSGFuZGxlcihlbnF1ZXVlX3RocmVhZCk7Ci0gICAgUXVldWU8c3RkOjpzdHJpbmc+KiBxdWV1ZSA9IG5ldyBRdWV1ZTxzdGQ6OnN0cmluZz4oa1F1ZXVlU2l6ZU9uZSk7Ci0gICAgcXVldWUtPlJlZ2lzdGVyRW5xdWV1ZSgKLSAgICAgICAgZW5xdWV1ZV9oYW5kbGVyLCBjb21tb246OkJpbmQoW10oKSB7IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPigiQSBzdHJpbmcgdG8gZmlsbCB0aGUgcXVldWUiKTsgfSkpOwotICAgIGRlbGV0ZSBxdWV1ZTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJEZXF1ZXVlQW5kRGVsZXRlKCkgewotICAgIFRocmVhZCogZGVxdWV1ZV90aHJlYWQgPSBuZXcgVGhyZWFkKCJkZXF1ZXVlX3RocmVhZCIsIFRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgSGFuZGxlciogZGVxdWV1ZV9oYW5kbGVyID0gbmV3IEhhbmRsZXIoZGVxdWV1ZV90aHJlYWQpOwotICAgIFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWUgPSBuZXcgUXVldWU8c3RkOjpzdHJpbmc+KGtRdWV1ZVNpemVPbmUpOwotICAgIHF1ZXVlLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgIGRlcXVldWVfaGFuZGxlciwKLSAgICAgICAgY29tbW9uOjpCaW5kKFtdKFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWUpIHsgcXVldWUtPlRyeURlcXVldWUoKTsgfSwgY29tbW9uOjpVbnJldGFpbmVkKHF1ZXVlKSkpOwotICAgIGRlbGV0ZSBxdWV1ZTsKLSAgfQotfTsKLQotVEVTVF9GKFF1ZXVlRGVhdGhUZXN0LCBkaWVfaWZfZW5xdWV1ZV9ub3RfdW5yZWdpc3RlcmVkKSB7Ci0gIEVYUEVDVF9ERUFUSChSZWdpc3RlckVucXVldWVBbmREZWxldGUoKSwgIm5xdWV1ZSIpOwotfQotCi1URVNUX0YoUXVldWVEZWF0aFRlc3QsIGRpZV9pZl9kZXF1ZXVlX25vdF91bnJlZ2lzdGVyZWQpIHsKLSAgRVhQRUNUX0RFQVRIKFJlZ2lzdGVyRGVxdWV1ZUFuZERlbGV0ZSgpLCAiZXF1ZXVlIik7Ci19Ci0KLWNsYXNzIE1vY2tJUXVldWVFbnF1ZXVlIDogcHVibGljIElRdWV1ZUVucXVldWU8aW50PiB7Ci0gcHVibGljOgotICB2b2lkIFJlZ2lzdGVyRW5xdWV1ZShIYW5kbGVyKiBoYW5kbGVyLCBFbnF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlIHsKLSAgICBFWFBFQ1RfRkFMU0UocmVnaXN0ZXJlZF8pOwotICAgIHJlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgICBoYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJk1vY2tJUXVldWVFbnF1ZXVlOjpoYW5kbGVfcmVnaXN0ZXJfZW5xdWV1ZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBjYWxsYmFjaykpOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfcmVnaXN0ZXJfZW5xdWV1ZShFbnF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoZG9udF9oYW5kbGVfcmVnaXN0ZXJfZW5xdWV1ZV8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd2hpbGUgKHJlZ2lzdGVyZWRfKSB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiBmcm9udCA9IGNhbGxiYWNrLlJ1bigpOwotICAgICAgcXVldWVfLnB1c2goKmZyb250KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFVucmVnaXN0ZXJFbnF1ZXVlKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9UUlVFKHJlZ2lzdGVyZWRfKTsKLSAgICByZWdpc3RlcmVkXyA9IGZhbHNlOwotICB9Ci0KLSAgYm9vbCBkb250X2hhbmRsZV9yZWdpc3Rlcl9lbnF1ZXVlXyA9IGZhbHNlOwotICBib29sIHJlZ2lzdGVyZWRfID0gZmFsc2U7Ci0gIHN0ZDo6cXVldWU8aW50PiBxdWV1ZV87Ci19OwotCi1jbGFzcyBFbnF1ZXVlQnVmZmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGVzdF90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGhhbmRsZXJfID0gbmV3IEhhbmRsZXIodGhyZWFkXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGhhbmRsZXJfLT5DbGVhcigpOwotICAgIGRlbGV0ZSBoYW5kbGVyXzsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgfQotCi0gIHZvaWQgU3luY2hyb25pemVIYW5kbGVyKCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZShbXShzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgeyBwcm9taXNlLnNldF92YWx1ZSgpOyB9LCBzdGQ6Om1vdmUocHJvbWlzZSkpKTsKLSAgICBmdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgTW9ja0lRdWV1ZUVucXVldWUgZW5xdWV1ZV87Ci0gIEVucXVldWVCdWZmZXI8aW50PiBlbnF1ZXVlX2J1ZmZlcl97JmVucXVldWVffTsKLSAgVGhyZWFkKiB0aHJlYWRfOwotICBIYW5kbGVyKiBoYW5kbGVyXzsKLX07Ci0KLVRFU1RfRihFbnF1ZXVlQnVmZmVyVGVzdCwgZW5xdWV1ZSkgewotICBpbnQgbnVtX2l0ZW1zID0gMTA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2l0ZW1zOyBpKyspIHsKLSAgICBlbnF1ZXVlX2J1ZmZlcl8uRW5xdWV1ZShzdGQ6Om1ha2VfdW5pcXVlPGludD4oaSksIGhhbmRsZXJfKTsKLSAgfQotICBTeW5jaHJvbml6ZUhhbmRsZXIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1faXRlbXM7IGkrKykgewotICAgIEFTU0VSVF9FUShlbnF1ZXVlXy5xdWV1ZV8uZnJvbnQoKSwgaSk7Ci0gICAgZW5xdWV1ZV8ucXVldWVfLnBvcCgpOwotICB9Ci0gIEFTU0VSVF9GQUxTRShlbnF1ZXVlXy5yZWdpc3RlcmVkXyk7Ci19Ci0KLVRFU1RfRihFbnF1ZXVlQnVmZmVyVGVzdCwgY2xlYXIpIHsKLSAgZW5xdWV1ZV8uZG9udF9oYW5kbGVfcmVnaXN0ZXJfZW5xdWV1ZV8gPSB0cnVlOwotICBpbnQgbnVtX2l0ZW1zID0gMTA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2l0ZW1zOyBpKyspIHsKLSAgICBlbnF1ZXVlX2J1ZmZlcl8uRW5xdWV1ZShzdGQ6Om1ha2VfdW5pcXVlPGludD4oaSksIGhhbmRsZXJfKTsKLSAgfQotICBBU1NFUlRfVFJVRShlbnF1ZXVlXy5yZWdpc3RlcmVkXyk7Ci0gIGVucXVldWVfYnVmZmVyXy5DbGVhcigpOwotICBBU1NFUlRfRkFMU0UoZW5xdWV1ZV8ucmVnaXN0ZXJlZF8pOwotfQotCi1URVNUX0YoRW5xdWV1ZUJ1ZmZlclRlc3QsIGRlbGV0ZV93aGVuX2luX2NhbGxiYWNrKSB7Ci0gIFF1ZXVlPGludD4qIHF1ZXVlID0gbmV3IFF1ZXVlPGludD4oa1F1ZXVlU2l6ZSk7Ci0gIEVucXVldWVCdWZmZXI8aW50PiogZW5xdWV1ZV9idWZmZXIgPSBuZXcgRW5xdWV1ZUJ1ZmZlcjxpbnQ+KHF1ZXVlKTsKLSAgaW50IG51bV9pdGVtcyA9IDEwOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9pdGVtczsgaSsrKSB7Ci0gICAgZW5xdWV1ZV9idWZmZXItPkVucXVldWUoc3RkOjptYWtlX3VuaXF1ZTxpbnQ+KGkpLCBoYW5kbGVyXyk7Ci0gIH0KLQotICBkZWxldGUgZW5xdWV1ZV9idWZmZXI7Ci0gIGRlbGV0ZSBxdWV1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVhY3RpdmVfc2VtYXBob3JlLmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZWFjdGl2ZV9zZW1hcGhvcmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMmE2MzYuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZWFjdGl2ZV9zZW1hcGhvcmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicmVhY3RpdmVfc2VtYXBob3JlLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotI2luY2x1ZGUgIm9zL2xpbnV4X2dlbmVyaWMvbGludXguaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1SZWFjdGl2ZVNlbWFwaG9yZTo6UmVhY3RpdmVTZW1hcGhvcmUodW5zaWduZWQgaW50IHZhbHVlKSA6IGZkXyhldmVudGZkKHZhbHVlLCBFRkRfU0VNQVBIT1JFIHwgRUZEX05PTkJMT0NLKSkgewotICBBU1NFUlQoZmRfICE9IC0xKTsKLX0KLQotUmVhY3RpdmVTZW1hcGhvcmU6On5SZWFjdGl2ZVNlbWFwaG9yZSgpIHsKLSAgaW50IGNsb3NlX3N0YXR1czsKLSAgUlVOX05PX0lOVFIoY2xvc2Vfc3RhdHVzID0gY2xvc2UoZmRfKSk7Ci0gIEFTU0VSVF9MT0coY2xvc2Vfc3RhdHVzICE9IC0xLCAiY2xvc2UgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLXZvaWQgUmVhY3RpdmVTZW1hcGhvcmU6OkRlY3JlYXNlKCkgewotICB1aW50NjRfdCB2YWwgPSAwOwotICBhdXRvIHJlYWRfcmVzdWx0ID0gZXZlbnRmZF9yZWFkKGZkXywgJnZhbCk7Ci0gIEFTU0VSVF9MT0cocmVhZF9yZXN1bHQgIT0gLTEsICJkZWNyZWFzZSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLX0KLQotdm9pZCBSZWFjdGl2ZVNlbWFwaG9yZTo6SW5jcmVhc2UoKSB7Ci0gIHVpbnQ2NF90IHZhbCA9IDE7Ci0gIGF1dG8gd3JpdGVfcmVzdWx0ID0gZXZlbnRmZF93cml0ZShmZF8sIHZhbCk7Ci0gIEFTU0VSVF9MT0cod3JpdGVfcmVzdWx0ICE9IC0xLCAiaW5jcmVhc2UgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLWludCBSZWFjdGl2ZVNlbWFwaG9yZTo6R2V0RmQoKSB7Ci0gIHJldHVybiBmZF87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZWFjdGl2ZV9zZW1hcGhvcmUuaCBiL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVhY3RpdmVfc2VtYXBob3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODY2NmMuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZWFjdGl2ZV9zZW1hcGhvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAib3MvdXRpbHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi0vLyBBIGV2ZW50X2ZkIHdvcmsgaW4gbm9uLWJsb2NraW5nIGFuZCBTZW1hcGhvcmUgbW9kZQotY2xhc3MgUmVhY3RpdmVTZW1hcGhvcmUgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIG5ldyBSZWFjdGl2ZVNlbWFwaG9yZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgfHZhbHVlfC4KLSAgZXhwbGljaXQgUmVhY3RpdmVTZW1hcGhvcmUodW5zaWduZWQgaW50IHZhbHVlKTsKLSAgflJlYWN0aXZlU2VtYXBob3JlKCk7Ci0gIC8vIERlY3JlbWVudHMgdGhlIHZhbHVlIG9mIHxmZF98LCB0aGlzIHdpbGwgY2F1c2UgYSBjcmFzaCBpZiB8ZmRffCB1bnJlYWRhYmxlLgotICB2b2lkIERlY3JlYXNlKCk7Ci0gIC8vIEluY3JlYXNlIHRoZSB2YWx1ZSBvZiB8ZmRffCwgdGhpcyB3aWxsIGNhdXNlIGEgY3Jhc2ggaWYgfGZkX3wgdW53cml0YWJsZS4KLSAgdm9pZCBJbmNyZWFzZSgpOwotICBpbnQgR2V0RmQoKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVhY3RpdmVTZW1hcGhvcmUpOwotCi0gcHJpdmF0ZToKLSAgaW50IGZkXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZWFjdG9yLmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZWFjdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzIyYzYxLi4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVhY3Rvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvcmVhY3Rvci5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KLSNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxjaW50dHlwZXM+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgewotCi0vLyBVc2UgYXQgbW9zdCBzaXplb2YoZXBvbGxfZXZlbnQpICoga0Vwb2xsTWF4RXZlbnRzIGtlcm5lbCBtZW1vcnkKLWNvbnN0ZXhwciBpbnQga0Vwb2xsTWF4RXZlbnRzID0gNjQ7Ci1jb25zdGV4cHIgdWludDY0X3Qga1N0b3BSZWFjdG9yID0gMSA8PCAwOwotY29uc3RleHByIHVpbnQ2NF90IGtXYWl0Rm9ySWRsZSA9IDEgPDwgMTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLXVzaW5nIGNvbW1vbjo6Q2xvc3VyZTsKLQotY2xhc3MgUmVhY3Rvcjo6UmVhY3RhYmxlIHsKLSBwdWJsaWM6Ci0gIFJlYWN0YWJsZShpbnQgZmQsIENsb3N1cmUgb25fcmVhZF9yZWFkeSwgQ2xvc3VyZSBvbl93cml0ZV9yZWFkeSkKLSAgICAgIDogZmRfKGZkKSwKLSAgICAgICAgb25fcmVhZF9yZWFkeV8oc3RkOjptb3ZlKG9uX3JlYWRfcmVhZHkpKSwKLSAgICAgICAgb25fd3JpdGVfcmVhZHlfKHN0ZDo6bW92ZShvbl93cml0ZV9yZWFkeSkpLAotICAgICAgICBpc19leGVjdXRpbmdfKGZhbHNlKSwKLSAgICAgICAgcmVtb3ZlZF8oZmFsc2UpIHt9Ci0gIGNvbnN0IGludCBmZF87Ci0gIENsb3N1cmUgb25fcmVhZF9yZWFkeV87Ci0gIENsb3N1cmUgb25fd3JpdGVfcmVhZHlfOwotICBib29sIGlzX2V4ZWN1dGluZ187Ci0gIGJvb2wgcmVtb3ZlZF87Ci0gIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBmaW5pc2hlZF9wcm9taXNlXzsKLX07Ci0KLVJlYWN0b3I6OlJlYWN0b3IoKSA6IGVwb2xsX2ZkXygwKSwgY29udHJvbF9mZF8oMCksIGlzX3J1bm5pbmdfKGZhbHNlKSB7Ci0gIFJVTl9OT19JTlRSKGVwb2xsX2ZkXyA9IGVwb2xsX2NyZWF0ZTEoRVBPTExfQ0xPRVhFQykpOwotICBBU1NFUlRfTE9HKGVwb2xsX2ZkXyAhPSAtMSwgImNvdWxkIG5vdCBjcmVhdGUgZXBvbGwgZmQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotICBjb250cm9sX2ZkXyA9IGV2ZW50ZmQoMCwgRUZEX05PTkJMT0NLKTsKLSAgQVNTRVJUKGNvbnRyb2xfZmRfICE9IC0xKTsKLQotICBlcG9sbF9ldmVudCBjb250cm9sX2Vwb2xsX2V2ZW50ID0ge0VQT0xMSU4sIHsucHRyID0gbnVsbHB0cn19OwotICBpbnQgcmVzdWx0OwotICBSVU5fTk9fSU5UUihyZXN1bHQgPSBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfQURELCBjb250cm9sX2ZkXywgJmNvbnRyb2xfZXBvbGxfZXZlbnQpKTsKLSAgQVNTRVJUKHJlc3VsdCAhPSAtMSk7Ci19Ci0KLVJlYWN0b3I6On5SZWFjdG9yKCkgewotICBpbnQgcmVzdWx0OwotICBSVU5fTk9fSU5UUihyZXN1bHQgPSBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfREVMLCBjb250cm9sX2ZkXywgbnVsbHB0cikpOwotICBBU1NFUlQocmVzdWx0ICE9IC0xKTsKLQotICBSVU5fTk9fSU5UUihyZXN1bHQgPSBjbG9zZShjb250cm9sX2ZkXykpOwotICBBU1NFUlQocmVzdWx0ICE9IC0xKTsKLQotICBSVU5fTk9fSU5UUihyZXN1bHQgPSBjbG9zZShlcG9sbF9mZF8pKTsKLSAgQVNTRVJUKHJlc3VsdCAhPSAtMSk7Ci19Ci0KLXZvaWQgUmVhY3Rvcjo6UnVuKCkgewotICBib29sIGFscmVhZHlfcnVubmluZyA9IGlzX3J1bm5pbmdfLmV4Y2hhbmdlKHRydWUpOwotICBBU1NFUlQoIWFscmVhZHlfcnVubmluZyk7Ci0KLSAgaW50IHRpbWVvdXRfbXMgPSAtMTsKLSAgYm9vbCB3YWl0aW5nX2Zvcl9pZGxlID0gZmFsc2U7Ci0gIGZvciAoOzspIHsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICAgIGludmFsaWRhdGlvbl9saXN0Xy5jbGVhcigpOwotICAgIH0KLSAgICBlcG9sbF9ldmVudCBldmVudHNba0Vwb2xsTWF4RXZlbnRzXTsKLSAgICBpbnQgY291bnQ7Ci0gICAgUlVOX05PX0lOVFIoY291bnQgPSBlcG9sbF93YWl0KGVwb2xsX2ZkXywgZXZlbnRzLCBrRXBvbGxNYXhFdmVudHMsIHRpbWVvdXRfbXMpKTsKLSAgICBBU1NFUlQoY291bnQgIT0gLTEpOwotICAgIGlmICh3YWl0aW5nX2Zvcl9pZGxlICYmIGNvdW50ID09IDApIHsKLSAgICAgIHRpbWVvdXRfbXMgPSAtMTsKLSAgICAgIHdhaXRpbmdfZm9yX2lkbGUgPSBmYWxzZTsKLSAgICAgIGlkbGVfcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgICAgaWRsZV9wcm9taXNlXyA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBhdXRvIGV2ZW50ID0gZXZlbnRzW2ldOwotICAgICAgQVNTRVJUKGV2ZW50LmV2ZW50cyAhPSAwdSk7Ci0KLSAgICAgIC8vIElmIHRoZSBwdHIgc3RvcmVkIGluIGVwb2xsX2V2ZW50LmRhdGEgaXMgbnVsbHB0ciwgaXQgbWVhbnMgdGhlIGNvbnRyb2wgZmQgdHJpZ2dlcmVkCi0gICAgICBpZiAoZXZlbnQuZGF0YS5wdHIgPT0gbnVsbHB0cikgewotICAgICAgICB1aW50NjRfdCB2YWx1ZTsKLSAgICAgICAgZXZlbnRmZF9yZWFkKGNvbnRyb2xfZmRfLCAmdmFsdWUpOwotICAgICAgICBpZiAoKHZhbHVlICYga1N0b3BSZWFjdG9yKSAhPSAwKSB7Ci0gICAgICAgICAgaXNfcnVubmluZ18gPSBmYWxzZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlICYga1dhaXRGb3JJZGxlKSAhPSAwKSB7Ci0gICAgICAgICAgdGltZW91dF9tcyA9IDMwOwotICAgICAgICAgIHdhaXRpbmdfZm9yX2lkbGUgPSB0cnVlOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPR19FUlJPUigiVW5rbm93biBjb250cm9sX2ZkIHZhbHVlICUiIFBSSXU2NCAieCIsIHZhbHVlKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYXV0byogcmVhY3RhYmxlID0gc3RhdGljX2Nhc3Q8UmVhY3Rvcjo6UmVhY3RhYmxlKj4oZXZlbnQuZGF0YS5wdHIpOwotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgICBleGVjdXRpbmdfcmVhY3RhYmxlX2ZpbmlzaGVkXyA9IG51bGxwdHI7Ci0gICAgICAvLyBTZWUgaWYgdGhpcyByZWFjdGFibGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiB0aGUgbWVhbnRpbWUuCi0gICAgICBpZiAoc3RkOjpmaW5kKGludmFsaWRhdGlvbl9saXN0Xy5iZWdpbigpLCBpbnZhbGlkYXRpb25fbGlzdF8uZW5kKCksIHJlYWN0YWJsZSkgIT0gaW52YWxpZGF0aW9uX2xpc3RfLmVuZCgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiByZWFjdGFibGVfbG9jayhyZWFjdGFibGUtPm11dGV4Xyk7Ci0gICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHJlYWN0YWJsZS0+aXNfZXhlY3V0aW5nXyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZXZlbnQuZXZlbnRzICYgKEVQT0xMSU4gfCBFUE9MTEhVUCB8IEVQT0xMUkRIVVAgfCBFUE9MTEVSUikgJiYgIXJlYWN0YWJsZS0+b25fcmVhZF9yZWFkeV8uaXNfbnVsbCgpKSB7Ci0gICAgICAgIHJlYWN0YWJsZS0+b25fcmVhZF9yZWFkeV8uUnVuKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZXZlbnQuZXZlbnRzICYgRVBPTExPVVQgJiYgIXJlYWN0YWJsZS0+b25fd3JpdGVfcmVhZHlfLmlzX251bGwoKSkgewotICAgICAgICByZWFjdGFibGUtPm9uX3dyaXRlX3JlYWR5Xy5SdW4oKTsKLSAgICAgIH0KLSAgICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiByZWFjdGFibGVfbG9jayhyZWFjdGFibGUtPm11dGV4Xyk7Ci0gICAgICAgIHJlYWN0YWJsZS0+aXNfZXhlY3V0aW5nXyA9IGZhbHNlOwotICAgICAgICBpZiAocmVhY3RhYmxlLT5yZW1vdmVkXykgewotICAgICAgICAgIHJlYWN0YWJsZS0+ZmluaXNoZWRfcHJvbWlzZV8tPnNldF92YWx1ZSgpOwotICAgICAgICAgIHJlYWN0YWJsZV9sb2NrLnVubG9jaygpOwotICAgICAgICAgIGRlbGV0ZSByZWFjdGFibGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBSZWFjdG9yOjpTdG9wKCkgewotICBpZiAoIWlzX3J1bm5pbmdfKSB7Ci0gICAgTE9HX1dBUk4oIm5vdCBydW5uaW5nLCB3aWxsIHN0b3Agb25jZSBpdCdzIHN0YXJ0ZWQiKTsKLSAgfQotICBhdXRvIGNvbnRyb2wgPSBldmVudGZkX3dyaXRlKGNvbnRyb2xfZmRfLCBrU3RvcFJlYWN0b3IpOwotICBBU1NFUlQoY29udHJvbCAhPSAtMSk7Ci19Ci0KLVJlYWN0b3I6OlJlYWN0YWJsZSogUmVhY3Rvcjo6UmVnaXN0ZXIoaW50IGZkLCBDbG9zdXJlIG9uX3JlYWRfcmVhZHksIENsb3N1cmUgb25fd3JpdGVfcmVhZHkpIHsKLSAgdWludDMyX3QgcG9sbF9ldmVudF90eXBlID0gMDsKLSAgaWYgKCFvbl9yZWFkX3JlYWR5LmlzX251bGwoKSkgewotICAgIHBvbGxfZXZlbnRfdHlwZSB8PSAoRVBPTExJTiB8IEVQT0xMUkRIVVApOwotICB9Ci0gIGlmICghb25fd3JpdGVfcmVhZHkuaXNfbnVsbCgpKSB7Ci0gICAgcG9sbF9ldmVudF90eXBlIHw9IEVQT0xMT1VUOwotICB9Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IG5ldyBSZWFjdGFibGUoZmQsIG9uX3JlYWRfcmVhZHksIG9uX3dyaXRlX3JlYWR5KTsKLSAgZXBvbGxfZXZlbnQgZXZlbnQgPSB7Ci0gICAgICAuZXZlbnRzID0gcG9sbF9ldmVudF90eXBlLAotICAgICAgLmRhdGEgPSB7LnB0ciA9IHJlYWN0YWJsZX0sCi0gIH07Ci0gIGludCByZWdpc3Rlcl9mZDsKLSAgUlVOX05PX0lOVFIocmVnaXN0ZXJfZmQgPSBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfQURELCBmZCwgJmV2ZW50KSk7Ci0gIEFTU0VSVChyZWdpc3Rlcl9mZCAhPSAtMSk7Ci0gIHJldHVybiByZWFjdGFibGU7Ci19Ci0KLXZvaWQgUmVhY3Rvcjo6VW5yZWdpc3RlcihSZWFjdG9yOjpSZWFjdGFibGUqIHJlYWN0YWJsZSkgewotICBBU1NFUlQocmVhY3RhYmxlICE9IG51bGxwdHIpOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBpbnZhbGlkYXRpb25fbGlzdF8ucHVzaF9iYWNrKHJlYWN0YWJsZSk7Ci0gIH0KLSAgYm9vbCBkZWxheWluZ19kZWxldGVfdW50aWxfY2FsbGJhY2tfZmluaXNoZWQgPSBmYWxzZTsKLSAgewotICAgIGludCByZXN1bHQ7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHJlYWN0YWJsZV9sb2NrKHJlYWN0YWJsZS0+bXV0ZXhfKTsKLSAgICBSVU5fTk9fSU5UUihyZXN1bHQgPSBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfREVMLCByZWFjdGFibGUtPmZkXywgbnVsbHB0cikpOwotICAgIGlmIChyZXN1bHQgPT0gLTEgJiYgZXJybm8gPT0gRU5PRU5UKSB7Ci0gICAgICBMT0dfSU5GTygicmVhY3RhYmxlIGlzIGludmFsaWQgb3IgdW5yZWdpc3RlcmVkIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVChyZXN1bHQgIT0gLTEpOwotICAgIH0KLQotICAgIC8vIElmIHdlIGFyZSB1bnJlZ2lzdGVyaW5nIGR1cmluZyB0aGUgY2FsbGJhY2sgZXZlbnQgZnJvbSB0aGlzIHJlYWN0YWJsZSwgd2UgZGVsZXRlIGl0IGFmdGVyIHRoZSBjYWxsYmFjayBpcwotICAgIC8vIGV4ZWN1dGVkLiByZWFjdGFibGUtPmlzX2V4ZWN1dGluZ18gaXMgcHJvdGVjdGVkIGJ5IHJlYWN0YWJsZS0+bXV0ZXhfLCBzbyBpdCdzIHRocmVhZCBzYWZlLgotICAgIGlmIChyZWFjdGFibGUtPmlzX2V4ZWN1dGluZ18pIHsKLSAgICAgIHJlYWN0YWJsZS0+cmVtb3ZlZF8gPSB0cnVlOwotICAgICAgcmVhY3RhYmxlLT5maW5pc2hlZF9wcm9taXNlXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpwcm9taXNlPHZvaWQ+PigpOwotICAgICAgZXhlY3V0aW5nX3JlYWN0YWJsZV9maW5pc2hlZF8gPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6ZnV0dXJlPHZvaWQ+PihyZWFjdGFibGUtPmZpbmlzaGVkX3Byb21pc2VfLT5nZXRfZnV0dXJlKCkpOwotICAgICAgZGVsYXlpbmdfZGVsZXRlX3VudGlsX2NhbGxiYWNrX2ZpbmlzaGVkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgLy8gSWYgd2UgYXJlIHVucmVnaXN0ZXJpbmcgb3V0c2lkZSBvZiB0aGUgY2FsbGJhY2sgZXZlbnQgZnJvbSB0aGlzIHJlYWN0YWJsZSwgd2UgZGVsZXRlIGl0IG5vdwotICBpZiAoIWRlbGF5aW5nX2RlbGV0ZV91bnRpbF9jYWxsYmFja19maW5pc2hlZCkgewotICAgIGRlbGV0ZSByZWFjdGFibGU7Ci0gIH0KLX0KLQotYm9vbCBSZWFjdG9yOjpXYWl0Rm9yVW5yZWdpc3RlcmVkUmVhY3RhYmxlKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBpZiAoZXhlY3V0aW5nX3JlYWN0YWJsZV9maW5pc2hlZF8gPT0gbnVsbHB0cikgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGF1dG8gc3RvcF9zdGF0dXMgPSBleGVjdXRpbmdfcmVhY3RhYmxlX2ZpbmlzaGVkXy0+d2FpdF9mb3IodGltZW91dCk7Ci0gIGlmIChzdG9wX3N0YXR1cyAhPSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7Ci0gICAgTE9HX0VSUk9SKCJVbnJlZ2lzdGVyIHJlYWN0YWJsZSB0aW1lZCBvdXQiKTsKLSAgfQotICByZXR1cm4gc3RvcF9zdGF0dXMgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeTsKLX0KLQotYm9vbCBSZWFjdG9yOjpXYWl0Rm9ySWRsZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKLSAgYXV0byBwcm9taXNlID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnByb21pc2U8dm9pZD4+KCk7Ci0gIGF1dG8gZnV0dXJlID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OmZ1dHVyZTx2b2lkPj4ocHJvbWlzZS0+Z2V0X2Z1dHVyZSgpKTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgaWRsZV9wcm9taXNlXyA9IHByb21pc2U7Ci0gIH0KLQotICBhdXRvIGNvbnRyb2wgPSBldmVudGZkX3dyaXRlKGNvbnRyb2xfZmRfLCBrV2FpdEZvcklkbGUpOwotICBBU1NFUlQoY29udHJvbCAhPSAtMSk7Ci0KLSAgYXV0byBpZGxlX3N0YXR1cyA9IGZ1dHVyZS0+d2FpdF9mb3IodGltZW91dCk7Ci0gIHJldHVybiBpZGxlX3N0YXR1cyA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5OwotfQotCi12b2lkIFJlYWN0b3I6Ok1vZGlmeVJlZ2lzdHJhdGlvbihSZWFjdG9yOjpSZWFjdGFibGUqIHJlYWN0YWJsZSwgQ2xvc3VyZSBvbl9yZWFkX3JlYWR5LCBDbG9zdXJlIG9uX3dyaXRlX3JlYWR5KSB7Ci0gIEFTU0VSVChyZWFjdGFibGUgIT0gbnVsbHB0cik7Ci0KLSAgdWludDMyX3QgcG9sbF9ldmVudF90eXBlID0gMDsKLSAgaWYgKCFvbl9yZWFkX3JlYWR5LmlzX251bGwoKSkgewotICAgIHBvbGxfZXZlbnRfdHlwZSB8PSAoRVBPTExJTiB8IEVQT0xMUkRIVVApOwotICB9Ci0gIGlmICghb25fd3JpdGVfcmVhZHkuaXNfbnVsbCgpKSB7Ci0gICAgcG9sbF9ldmVudF90eXBlIHw9IEVQT0xMT1VUOwotICB9Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcmVhY3RhYmxlX2xvY2socmVhY3RhYmxlLT5tdXRleF8pOwotICAgIHJlYWN0YWJsZS0+b25fcmVhZF9yZWFkeV8gPSBzdGQ6Om1vdmUob25fcmVhZF9yZWFkeSk7Ci0gICAgcmVhY3RhYmxlLT5vbl93cml0ZV9yZWFkeV8gPSBzdGQ6Om1vdmUob25fd3JpdGVfcmVhZHkpOwotICB9Ci0gIGVwb2xsX2V2ZW50IGV2ZW50ID0gewotICAgICAgLmV2ZW50cyA9IHBvbGxfZXZlbnRfdHlwZSwKLSAgICAgIC5kYXRhID0gey5wdHIgPSByZWFjdGFibGV9LAotICB9OwotICBpbnQgbW9kaWZ5X2ZkOwotICBSVU5fTk9fSU5UUihtb2RpZnlfZmQgPSBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfTU9ELCByZWFjdGFibGUtPmZkXywgJmV2ZW50KSk7Ci0gIEFTU0VSVChtb2RpZnlfZmQgIT0gLTEpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVhY3Rvcl91bml0dGVzdC5jYyBiL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVhY3Rvcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YzdhOS4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL3JlYWN0b3JfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zL3JlYWN0b3IuaCIKLQotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIGludCBrUmVhZFJlYWR5VmFsdWUgPSAxMDA7Ci0KLXVzaW5nIGNvbW1vbjo6QmluZDsKLQotc3RkOjpwcm9taXNlPGludD4qIGdfcHJvbWlzZTsKLQotY2xhc3MgUmVhY3RvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgZ19wcm9taXNlID0gbmV3IHN0ZDo6cHJvbWlzZTxpbnQ+OwotICAgIHJlYWN0b3JfID0gbmV3IFJlYWN0b3I7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBnX3Byb21pc2U7Ci0gICAgZ19wcm9taXNlID0gbnVsbHB0cjsKLSAgICBkZWxldGUgcmVhY3Rvcl87Ci0gICAgcmVhY3Rvcl8gPSBudWxscHRyOwotICB9Ci0KLSAgUmVhY3RvciogcmVhY3Rvcl87Ci19OwotCi1jbGFzcyBTYW1wbGVSZWFjdGFibGUgewotIHB1YmxpYzoKLSAgU2FtcGxlUmVhY3RhYmxlKCkgOiBmZF8oZXZlbnRmZCgwLCBFRkRfTk9OQkxPQ0spKSB7Ci0gICAgRVhQRUNUX05FKGZkXywgLTEpOwotICB9Ci0KLSAgflNhbXBsZVJlYWN0YWJsZSgpIHsKLSAgICBjbG9zZShmZF8pOwotICB9Ci0KLSAgdm9pZCBPblJlYWRSZWFkeSgpIHt9Ci0KLSAgdm9pZCBPbldyaXRlUmVhZHkoKSB7fQotCi0gIGludCBmZF87Ci19OwotCi1jbGFzcyBGYWtlUmVhY3RhYmxlIHsKLSBwdWJsaWM6Ci0gIGVudW0gRXZlbnRGZFZhbHVlIHsKLSAgICBrU2V0UHJvbWlzZSA9IDEsCi0gICAga1JlZ2lzdGVyU2FtcGxlUmVhY3RhYmxlLAotICAgIGtVbnJlZ2lzdGVyU2FtcGxlUmVhY3RhYmxlLAotICAgIGtTYW1wbGVPdXRwdXRWYWx1ZSwKLSAgfTsKLSAgRmFrZVJlYWN0YWJsZSgpIDogZmRfKGV2ZW50ZmQoMCwgMCkpLCByZWFjdG9yXyhudWxscHRyKSB7Ci0gICAgRVhQRUNUX05FKGZkXywgLTEpOwotICB9Ci0KLSAgRmFrZVJlYWN0YWJsZShSZWFjdG9yKiByZWFjdG9yKSA6IGZkXyhldmVudGZkKDAsIDApKSwgcmVhY3Rvcl8ocmVhY3RvcikgewotICAgIEVYUEVDVF9ORShmZF8sIC0xKTsKLSAgfQotCi0gIH5GYWtlUmVhY3RhYmxlKCkgewotICAgIGNsb3NlKGZkXyk7Ci0gIH0KLQotICB2b2lkIE9uUmVhZFJlYWR5KCkgewotICAgIExPR19JTkZPKCk7Ci0gICAgdWludDY0X3QgdmFsdWUgPSAwOwotICAgIGF1dG8gcmVhZF9yZXN1bHQgPSBldmVudGZkX3JlYWQoZmRfLCAmdmFsdWUpOwotICAgIExPR19JTkZPKCJ2YWx1ZSA9ICVkIiwgKGludCl2YWx1ZSk7Ci0gICAgRVhQRUNUX0VRKHJlYWRfcmVzdWx0LCAwKTsKLSAgICBpZiAodmFsdWUgPT0ga1NldFByb21pc2UgJiYgZ19wcm9taXNlICE9IG51bGxwdHIpIHsKLSAgICAgIGdfcHJvbWlzZS0+c2V0X3ZhbHVlKGtSZWFkUmVhZHlWYWx1ZSk7Ci0gICAgfQotICAgIGlmICh2YWx1ZSA9PSBrUmVnaXN0ZXJTYW1wbGVSZWFjdGFibGUpIHsKLSAgICAgIHJlYWN0YWJsZV8gPSByZWFjdG9yXy0+UmVnaXN0ZXIoCi0gICAgICAgICAgc2FtcGxlX3JlYWN0YWJsZV8uZmRfLAotICAgICAgICAgIEJpbmQoJkZha2VSZWFjdGFibGU6Ok9uUmVhZFJlYWR5LCBjb21tb246OlVucmV0YWluZWQodGhpcykpLAotICAgICAgICAgIEJpbmQoJkZha2VSZWFjdGFibGU6Ok9uV3JpdGVSZWFkeU5vT3AsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgICAgZ19wcm9taXNlLT5zZXRfdmFsdWUoa1JlYWRSZWFkeVZhbHVlKTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlID09IGtVbnJlZ2lzdGVyU2FtcGxlUmVhY3RhYmxlKSB7Ci0gICAgICByZWFjdG9yXy0+VW5yZWdpc3RlcihyZWFjdGFibGVfKTsKLSAgICAgIGdfcHJvbWlzZS0+c2V0X3ZhbHVlKGtSZWFkUmVhZHlWYWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbldyaXRlUmVhZHkoKSB7Ci0gICAgYXV0byB3cml0ZV9yZXN1bHQgPSBldmVudGZkX3dyaXRlKGZkXywgb3V0cHV0X2RhdGFfKTsKLSAgICBvdXRwdXRfZGF0YV8gPSAwOwotICAgIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICB9Ci0KLSAgdm9pZCBPbldyaXRlUmVhZHlOb09wKCkge30KLQotICB2b2lkIFVucmVnaXN0ZXJJbkNhbGxiYWNrKCkgewotICAgIHVpbnQ2NF90IHZhbHVlID0gMDsKLSAgICBhdXRvIHJlYWRfcmVzdWx0ID0gZXZlbnRmZF9yZWFkKGZkXywgJnZhbHVlKTsKLSAgICBFWFBFQ1RfRVEocmVhZF9yZXN1bHQsIDApOwotICAgIGdfcHJvbWlzZS0+c2V0X3ZhbHVlKGtSZWFkUmVhZHlWYWx1ZSk7Ci0gICAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlXyk7Ci0gIH0KLQotICBTYW1wbGVSZWFjdGFibGUgc2FtcGxlX3JlYWN0YWJsZV87Ci0gIFJlYWN0b3I6OlJlYWN0YWJsZSogcmVhY3RhYmxlXyA9IG51bGxwdHI7Ci0gIGludCBmZF87Ci0KLSBwcml2YXRlOgotICBSZWFjdG9yKiByZWFjdG9yXzsKLSAgdWludDY0X3Qgb3V0cHV0X2RhdGFfID0ga1NhbXBsZU91dHB1dFZhbHVlOwotfTsKLQotY2xhc3MgRmFrZVJ1bm5pbmdSZWFjdGFibGUgewotIHB1YmxpYzoKLSAgRmFrZVJ1bm5pbmdSZWFjdGFibGUoKSA6IGZkXyhldmVudGZkKDAsIDApKSB7Ci0gICAgRVhQRUNUX05FKGZkXywgLTEpOwotICB9Ci0KLSAgfkZha2VSdW5uaW5nUmVhY3RhYmxlKCkgewotICAgIGNsb3NlKGZkXyk7Ci0gIH0KLQotICB2b2lkIE9uUmVhZFJlYWR5KCkgewotICAgIHVpbnQ2NF90IHZhbHVlID0gMDsKLSAgICBhdXRvIHJlYWRfcmVzdWx0ID0gZXZlbnRmZF9yZWFkKGZkXywgJnZhbHVlKTsKLSAgICBBU1NFUlRfRVEocmVhZF9yZXN1bHQsIDApOwotICAgIHN0YXJ0ZWQuc2V0X3ZhbHVlKCk7Ci0gICAgY2FuX2ZpbmlzaC5nZXRfZnV0dXJlKCkud2FpdCgpOwotICAgIGZpbmlzaGVkLnNldF92YWx1ZSgpOwotICB9Ci0KLSAgUmVhY3Rvcjo6UmVhY3RhYmxlKiByZWFjdGFibGVfID0gbnVsbHB0cjsKLSAgaW50IGZkXzsKLQotICBzdGQ6OnByb21pc2U8dm9pZD4gc3RhcnRlZDsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGNhbl9maW5pc2g7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBmaW5pc2hlZDsKLX07Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgc3RhcnRfYW5kX3N0b3ApIHsKLSAgYXV0byByZWFjdG9yX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZSZWFjdG9yOjpSdW4sIHJlYWN0b3JfKTsKLSAgcmVhY3Rvcl8tPlN0b3AoKTsKLSAgcmVhY3Rvcl90aHJlYWQuam9pbigpOwotfQotCi1URVNUX0YoUmVhY3RvclRlc3QsIHN0b3BfYW5kX3N0YXJ0KSB7Ci0gIGF1dG8gcmVhY3Rvcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmUmVhY3Rvcjo6U3RvcCwgcmVhY3Rvcl8pOwotICBhdXRvIGFub3RoZXJfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0gIGFub3RoZXJfdGhyZWFkLmpvaW4oKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCBzdG9wX211bHRpX3RpbWVzKSB7Ci0gIGF1dG8gcmVhY3Rvcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmUmVhY3Rvcjo6UnVuLCByZWFjdG9yXyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgcmVhY3Rvcl8tPlN0b3AoKTsKLSAgfQotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci19Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgY29sZF9yZWdpc3Rlcl9vbmx5KSB7Ci0gIEZha2VSZWFjdGFibGUgZmFrZV9yZWFjdGFibGU7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlLmZkXywgQmluZCgmRmFrZVJlYWN0YWJsZTo6T25SZWFkUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmZmFrZV9yZWFjdGFibGUpKSwgY29tbW9uOjpDbG9zdXJlKCkpOwotCi0gIHJlYWN0b3JfLT5VbnJlZ2lzdGVyKHJlYWN0YWJsZSk7Ci19Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgY29sZF9yZWdpc3RlcikgewotICBGYWtlUmVhY3RhYmxlIGZha2VfcmVhY3RhYmxlOwotICBhdXRvKiByZWFjdGFibGUgPSByZWFjdG9yXy0+UmVnaXN0ZXIoCi0gICAgICBmYWtlX3JlYWN0YWJsZS5mZF8sIEJpbmQoJkZha2VSZWFjdGFibGU6Ok9uUmVhZFJlYWR5LCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlKSksIGNvbW1vbjo6Q2xvc3VyZSgpKTsKLSAgYXV0byByZWFjdG9yX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZSZWFjdG9yOjpSdW4sIHJlYWN0b3JfKTsKLSAgYXV0byBmdXR1cmUgPSBnX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLQotICBhdXRvIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUuZmRfLCBGYWtlUmVhY3RhYmxlOjprU2V0UHJvbWlzZSk7Ci0gIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICBFWFBFQ1RfRVEoZnV0dXJlLmdldCgpLCBrUmVhZFJlYWR5VmFsdWUpOwotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0gIHJlYWN0b3JfLT5VbnJlZ2lzdGVyKHJlYWN0YWJsZSk7Ci19Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgaG90X3JlZ2lzdGVyX2Zyb21fZGlmZmVyZW50X3RocmVhZCkgewotICBhdXRvIHJlYWN0b3JfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICBhdXRvIGZ1dHVyZSA9IGdfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotCi0gIEZha2VSZWFjdGFibGUgZmFrZV9yZWFjdGFibGU7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlLmZkXywgQmluZCgmRmFrZVJlYWN0YWJsZTo6T25SZWFkUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmZmFrZV9yZWFjdGFibGUpKSwgY29tbW9uOjpDbG9zdXJlKCkpOwotICBhdXRvIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUuZmRfLCBGYWtlUmVhY3RhYmxlOjprU2V0UHJvbWlzZSk7Ci0gIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICBFWFBFQ1RfRVEoZnV0dXJlLmdldCgpLCBrUmVhZFJlYWR5VmFsdWUpOwotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0KLSAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCB1bnJlZ2lzdGVyX2Zyb21fZGlmZmVyZW50X3RocmVhZF93aGlsZV90YXNrX2lzX2V4ZWN1dGluZ18pIHsKLSAgRmFrZVJ1bm5pbmdSZWFjdGFibGUgZmFrZV9yZWFjdGFibGU7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlLmZkXywKLSAgICAgIEJpbmQoJkZha2VSdW5uaW5nUmVhY3RhYmxlOjpPblJlYWRSZWFkeSwgY29tbW9uOjpVbnJldGFpbmVkKCZmYWtlX3JlYWN0YWJsZSkpLAotICAgICAgY29tbW9uOjpDbG9zdXJlKCkpOwotICBhdXRvIHJlYWN0b3JfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICBhdXRvIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUuZmRfLCAxKTsKLSAgQVNTRVJUX0VRKHdyaXRlX3Jlc3VsdCwgMCk7Ci0gIGZha2VfcmVhY3RhYmxlLnN0YXJ0ZWQuZ2V0X2Z1dHVyZSgpLndhaXQoKTsKLSAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlKTsKLSAgZmFrZV9yZWFjdGFibGUuY2FuX2ZpbmlzaC5zZXRfdmFsdWUoKTsKLSAgZmFrZV9yZWFjdGFibGUuZmluaXNoZWQuZ2V0X2Z1dHVyZSgpLndhaXQoKTsKLQotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci19Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgdW5yZWdpc3Rlcl9mcm9tX2RpZmZlcmVudF90aHJlYWRfd2hpbGVfdGFza19pc19leGVjdXRpbmdfd2FpdF9mYWlscykgewotICBGYWtlUnVubmluZ1JlYWN0YWJsZSBmYWtlX3JlYWN0YWJsZTsKLSAgYXV0byogcmVhY3RhYmxlID0gcmVhY3Rvcl8tPlJlZ2lzdGVyKAotICAgICAgZmFrZV9yZWFjdGFibGUuZmRfLAotICAgICAgY29tbW9uOjpCaW5kKCZGYWtlUnVubmluZ1JlYWN0YWJsZTo6T25SZWFkUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmZmFrZV9yZWFjdGFibGUpKSwKLSAgICAgIGNvbW1vbjo6Q2xvc3VyZSgpKTsKLSAgYXV0byByZWFjdG9yX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZSZWFjdG9yOjpSdW4sIHJlYWN0b3JfKTsKLSAgYXV0byB3cml0ZV9yZXN1bHQgPSBldmVudGZkX3dyaXRlKGZha2VfcmVhY3RhYmxlLmZkXywgMSk7Ci0gIEFTU0VSVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICBmYWtlX3JlYWN0YWJsZS5zdGFydGVkLmdldF9mdXR1cmUoKS53YWl0KCk7Ci0gIHJlYWN0b3JfLT5VbnJlZ2lzdGVyKHJlYWN0YWJsZSk7Ci0gIEFTU0VSVF9GQUxTRShyZWFjdG9yXy0+V2FpdEZvclVucmVnaXN0ZXJlZFJlYWN0YWJsZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEpKSk7Ci0gIGZha2VfcmVhY3RhYmxlLmNhbl9maW5pc2guc2V0X3ZhbHVlKCk7Ci0gIGZha2VfcmVhY3RhYmxlLmZpbmlzaGVkLmdldF9mdXR1cmUoKS53YWl0KCk7Ci0KLSAgcmVhY3Rvcl8tPlN0b3AoKTsKLSAgcmVhY3Rvcl90aHJlYWQuam9pbigpOwotfQotCi1URVNUX0YoUmVhY3RvclRlc3QsIHVucmVnaXN0ZXJfZnJvbV9kaWZmZXJlbnRfdGhyZWFkX3doaWxlX3Rhc2tfaXNfZXhlY3V0aW5nX3dhaXRfc3VjY2VlZHMpIHsKLSAgRmFrZVJ1bm5pbmdSZWFjdGFibGUgZmFrZV9yZWFjdGFibGU7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlLmZkXywKLSAgICAgIGNvbW1vbjo6QmluZCgmRmFrZVJ1bm5pbmdSZWFjdGFibGU6Ok9uUmVhZFJlYWR5LCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlKSksCi0gICAgICBjb21tb246OkNsb3N1cmUoKSk7Ci0gIGF1dG8gcmVhY3Rvcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmUmVhY3Rvcjo6UnVuLCByZWFjdG9yXyk7Ci0gIGF1dG8gd3JpdGVfcmVzdWx0ID0gZXZlbnRmZF93cml0ZShmYWtlX3JlYWN0YWJsZS5mZF8sIDEpOwotICBBU1NFUlRfRVEod3JpdGVfcmVzdWx0LCAwKTsKLSAgZmFrZV9yZWFjdGFibGUuc3RhcnRlZC5nZXRfZnV0dXJlKCkud2FpdCgpOwotICByZWFjdG9yXy0+VW5yZWdpc3RlcihyZWFjdGFibGUpOwotICBmYWtlX3JlYWN0YWJsZS5jYW5fZmluaXNoLnNldF92YWx1ZSgpOwotICBmYWtlX3JlYWN0YWJsZS5maW5pc2hlZC5nZXRfZnV0dXJlKCkud2FpdCgpOwotICBBU1NFUlRfVFJVRShyZWFjdG9yXy0+V2FpdEZvclVucmVnaXN0ZXJlZFJlYWN0YWJsZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEpKSk7Ci0KLSAgcmVhY3Rvcl8tPlN0b3AoKTsKLSAgcmVhY3Rvcl90aHJlYWQuam9pbigpOwotfQotCi1URVNUX0YoUmVhY3RvclRlc3QsIGhvdF91bnJlZ2lzdGVyX2Zyb21fZGlmZmVyZW50X3RocmVhZCkgewotICBGYWtlUmVhY3RhYmxlIGZha2VfcmVhY3RhYmxlOwotICBhdXRvKiByZWFjdGFibGUgPSByZWFjdG9yXy0+UmVnaXN0ZXIoCi0gICAgICBmYWtlX3JlYWN0YWJsZS5mZF8sIEJpbmQoJkZha2VSZWFjdGFibGU6Ok9uUmVhZFJlYWR5LCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlKSksIGNvbW1vbjo6Q2xvc3VyZSgpKTsKLSAgYXV0byByZWFjdG9yX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZSZWFjdG9yOjpSdW4sIHJlYWN0b3JfKTsKLSAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlKTsKLSAgYXV0byBmdXR1cmUgPSBnX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLQotICBhdXRvIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUuZmRfLCBGYWtlUmVhY3RhYmxlOjprU2V0UHJvbWlzZSk7Ci0gIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMCkpOwotICBnX3Byb21pc2UtPnNldF92YWx1ZSgyKTsKLSAgRVhQRUNUX0VRKGZ1dHVyZS5nZXQoKSwgMik7Ci0gIHJlYWN0b3JfLT5TdG9wKCk7Ci0gIHJlYWN0b3JfdGhyZWFkLmpvaW4oKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCBob3RfcmVnaXN0ZXJfZnJvbV9zYW1lX3RocmVhZCkgewotICBhdXRvIHJlYWN0b3JfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICBhdXRvIGZ1dHVyZSA9IGdfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotCi0gIEZha2VSZWFjdGFibGUgZmFrZV9yZWFjdGFibGUocmVhY3Rvcl8pOwotICBhdXRvKiByZWFjdGFibGUgPSByZWFjdG9yXy0+UmVnaXN0ZXIoCi0gICAgICBmYWtlX3JlYWN0YWJsZS5mZF8sIEJpbmQoJkZha2VSZWFjdGFibGU6Ok9uUmVhZFJlYWR5LCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlKSksIGNvbW1vbjo6Q2xvc3VyZSgpKTsKLSAgYXV0byB3cml0ZV9yZXN1bHQgPSBldmVudGZkX3dyaXRlKGZha2VfcmVhY3RhYmxlLmZkXywgRmFrZVJlYWN0YWJsZTo6a1JlZ2lzdGVyU2FtcGxlUmVhY3RhYmxlKTsKLSAgRVhQRUNUX0VRKHdyaXRlX3Jlc3VsdCwgMCk7Ci0gIEVYUEVDVF9FUShmdXR1cmUuZ2V0KCksIGtSZWFkUmVhZHlWYWx1ZSk7Ci0gIGRlbGV0ZSBnX3Byb21pc2U7Ci0gIGdfcHJvbWlzZSA9IG5ldyBzdGQ6OnByb21pc2U8aW50PjsKLSAgZnV0dXJlID0gZ19wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0gIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUuZmRfLCBGYWtlUmVhY3RhYmxlOjprVW5yZWdpc3RlclNhbXBsZVJlYWN0YWJsZSk7Ci0gIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0KLSAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCBob3RfdW5yZWdpc3Rlcl9mcm9tX3NhbWVfdGhyZWFkKSB7Ci0gIGF1dG8gcmVhY3Rvcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmUmVhY3Rvcjo6UnVuLCByZWFjdG9yXyk7Ci0gIGF1dG8gZnV0dXJlID0gZ19wcm9taXNlLT5nZXRfZnV0dXJlKCk7Ci0KLSAgRmFrZVJlYWN0YWJsZSBmYWtlX3JlYWN0YWJsZShyZWFjdG9yXyk7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlLmZkXywgQmluZCgmRmFrZVJlYWN0YWJsZTo6T25SZWFkUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmZmFrZV9yZWFjdGFibGUpKSwgY29tbW9uOjpDbG9zdXJlKCkpOwotICBhdXRvIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUuZmRfLCBGYWtlUmVhY3RhYmxlOjprUmVnaXN0ZXJTYW1wbGVSZWFjdGFibGUpOwotICBFWFBFQ1RfRVEod3JpdGVfcmVzdWx0LCAwKTsKLSAgRVhQRUNUX0VRKGZ1dHVyZS5nZXQoKSwga1JlYWRSZWFkeVZhbHVlKTsKLSAgTE9HX0lORk8oKTsKLSAgZGVsZXRlIGdfcHJvbWlzZTsKLSAgZ19wcm9taXNlID0gbmV3IHN0ZDo6cHJvbWlzZTxpbnQ+OwotICBmdXR1cmUgPSBnX3Byb21pc2UtPmdldF9mdXR1cmUoKTsKLSAgd3JpdGVfcmVzdWx0ID0gZXZlbnRmZF93cml0ZShmYWtlX3JlYWN0YWJsZS5mZF8sIEZha2VSZWFjdGFibGU6OmtVbnJlZ2lzdGVyU2FtcGxlUmVhY3RhYmxlKTsKLSAgRVhQRUNUX0VRKHdyaXRlX3Jlc3VsdCwgMCk7Ci0gIEVYUEVDVF9FUShmdXR1cmUuZ2V0KCksIGtSZWFkUmVhZHlWYWx1ZSk7Ci0gIExPR19JTkZPKCk7Ci0gIHJlYWN0b3JfLT5TdG9wKCk7Ci0gIHJlYWN0b3JfdGhyZWFkLmpvaW4oKTsKLQotICByZWFjdG9yXy0+VW5yZWdpc3RlcihyZWFjdGFibGUpOwotfQotCi1URVNUX0YoUmVhY3RvclRlc3QsIGhvdF91bnJlZ2lzdGVyX2Zyb21fY2FsbGJhY2spIHsKLSAgYXV0byByZWFjdG9yX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZSZWFjdG9yOjpSdW4sIHJlYWN0b3JfKTsKLQotICBGYWtlUmVhY3RhYmxlIGZha2VfcmVhY3RhYmxlMShyZWFjdG9yXyk7Ci0gIGF1dG8qIHJlYWN0YWJsZTEgPSByZWFjdG9yXy0+UmVnaXN0ZXIoCi0gICAgICBmYWtlX3JlYWN0YWJsZTEuZmRfLCBCaW5kKCZGYWtlUmVhY3RhYmxlOjpPblJlYWRSZWFkeSwgY29tbW9uOjpVbnJldGFpbmVkKCZmYWtlX3JlYWN0YWJsZTEpKSwgY29tbW9uOjpDbG9zdXJlKCkpOwotCi0gIEZha2VSZWFjdGFibGUgZmFrZV9yZWFjdGFibGUyKHJlYWN0b3JfKTsKLSAgYXV0byogcmVhY3RhYmxlMiA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlMi5mZF8sCi0gICAgICBCaW5kKCZGYWtlUmVhY3RhYmxlOjpVbnJlZ2lzdGVySW5DYWxsYmFjaywgY29tbW9uOjpVbnJldGFpbmVkKCZmYWtlX3JlYWN0YWJsZTIpKSwKLSAgICAgIGNvbW1vbjo6Q2xvc3VyZSgpKTsKLSAgZmFrZV9yZWFjdGFibGUyLnJlYWN0YWJsZV8gPSByZWFjdGFibGUyOwotICBhdXRvIHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmFrZV9yZWFjdGFibGUyLmZkXywgMSk7Ci0gIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0KLSAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlMSk7Ci19Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgaG90X3VucmVnaXN0ZXJfZHVyaW5nX3VucmVnaXN0ZXJfZnJvbV9jYWxsYmFjaykgewotICBhdXRvIHJlYWN0b3JfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICBhdXRvIGZ1dHVyZSA9IGdfcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotCi0gIEZha2VSZWFjdGFibGUgZmFrZV9yZWFjdGFibGUxKHJlYWN0b3JfKTsKLSAgYXV0byogcmVhY3RhYmxlMSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlMS5mZF8sIEJpbmQoJkZha2VSZWFjdGFibGU6Ok9uUmVhZFJlYWR5LCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlMSkpLCBjb21tb246OkNsb3N1cmUoKSk7Ci0KLSAgRmFrZVJlYWN0YWJsZSBmYWtlX3JlYWN0YWJsZTIocmVhY3Rvcl8pOwotICBhdXRvKiByZWFjdGFibGUyID0gcmVhY3Rvcl8tPlJlZ2lzdGVyKAotICAgICAgZmFrZV9yZWFjdGFibGUyLmZkXywKLSAgICAgIEJpbmQoJkZha2VSZWFjdGFibGU6OlVucmVnaXN0ZXJJbkNhbGxiYWNrLCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlMikpLAotICAgICAgY29tbW9uOjpDbG9zdXJlKCkpOwotICBmYWtlX3JlYWN0YWJsZTIucmVhY3RhYmxlXyA9IHJlYWN0YWJsZTI7Ci0gIGF1dG8gd3JpdGVfcmVzdWx0ID0gZXZlbnRmZF93cml0ZShmYWtlX3JlYWN0YWJsZTIuZmRfLCAxKTsKLSAgRVhQRUNUX0VRKHdyaXRlX3Jlc3VsdCwgMCk7Ci0gIEVYUEVDVF9FUShmdXR1cmUuZ2V0KCksIGtSZWFkUmVhZHlWYWx1ZSk7Ci0gIHJlYWN0b3JfLT5VbnJlZ2lzdGVyKHJlYWN0YWJsZTEpOwotCi0gIHJlYWN0b3JfLT5TdG9wKCk7Ci0gIHJlYWN0b3JfdGhyZWFkLmpvaW4oKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCBzdGFydF9hbmRfc3RvcF9tdWx0aV90aW1lcykgewotICBhdXRvIHJlYWN0b3JfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgcmVhY3Rvcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmUmVhY3Rvcjo6UnVuLCByZWFjdG9yXyk7Ci0gICAgcmVhY3Rvcl8tPlN0b3AoKTsKLSAgICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0gIH0KLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCBvbl93cml0ZV9yZWFkeSkgewotICBGYWtlUmVhY3RhYmxlIGZha2VfcmVhY3RhYmxlOwotICBhdXRvKiByZWFjdGFibGUgPSByZWFjdG9yXy0+UmVnaXN0ZXIoCi0gICAgICBmYWtlX3JlYWN0YWJsZS5mZF8sIGNvbW1vbjo6Q2xvc3VyZSgpLCBCaW5kKCZGYWtlUmVhY3RhYmxlOjpPbldyaXRlUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmZmFrZV9yZWFjdGFibGUpKSk7Ci0gIGF1dG8gcmVhY3Rvcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmUmVhY3Rvcjo6UnVuLCByZWFjdG9yXyk7Ci0gIHVpbnQ2NF90IHZhbHVlID0gMDsKLSAgYXV0byByZWFkX3Jlc3VsdCA9IGV2ZW50ZmRfcmVhZChmYWtlX3JlYWN0YWJsZS5mZF8sICZ2YWx1ZSk7Ci0gIEVYUEVDVF9FUShyZWFkX3Jlc3VsdCwgMCk7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgRmFrZVJlYWN0YWJsZTo6a1NhbXBsZU91dHB1dFZhbHVlKTsKLQotICByZWFjdG9yXy0+U3RvcCgpOwotICByZWFjdG9yX3RocmVhZC5qb2luKCk7Ci0KLSAgcmVhY3Rvcl8tPlVucmVnaXN0ZXIocmVhY3RhYmxlKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCBtb2RpZnlfcmVnaXN0cmF0aW9uKSB7Ci0gIEZha2VSZWFjdGFibGUgZmFrZV9yZWFjdGFibGU7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3JfLT5SZWdpc3RlcigKLSAgICAgIGZha2VfcmVhY3RhYmxlLmZkXywgQmluZCgmRmFrZVJlYWN0YWJsZTo6T25SZWFkUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmZmFrZV9yZWFjdGFibGUpKSwgY29tbW9uOjpDbG9zdXJlKCkpOwotICByZWFjdG9yXy0+TW9kaWZ5UmVnaXN0cmF0aW9uKAotICAgICAgcmVhY3RhYmxlLCBjb21tb246OkNsb3N1cmUoKSwgQmluZCgmRmFrZVJlYWN0YWJsZTo6T25Xcml0ZVJlYWR5LCBjb21tb246OlVucmV0YWluZWQoJmZha2VfcmVhY3RhYmxlKSkpOwotICBhdXRvIHJlYWN0b3JfdGhyZWFkID0gc3RkOjp0aHJlYWQoJlJlYWN0b3I6OlJ1biwgcmVhY3Rvcl8pOwotICB1aW50NjRfdCB2YWx1ZSA9IDA7Ci0gIGF1dG8gcmVhZF9yZXN1bHQgPSBldmVudGZkX3JlYWQoZmFrZV9yZWFjdGFibGUuZmRfLCAmdmFsdWUpOwotICBFWFBFQ1RfRVEocmVhZF9yZXN1bHQsIDApOwotICBFWFBFQ1RfRVEodmFsdWUsIEZha2VSZWFjdGFibGU6OmtTYW1wbGVPdXRwdXRWYWx1ZSk7Ci0KLSAgcmVhY3Rvcl8tPlN0b3AoKTsKLSAgcmVhY3Rvcl90aHJlYWQuam9pbigpOwotCi0gIHJlYWN0b3JfLT5VbnJlZ2lzdGVyKHJlYWN0YWJsZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9saW51eF9nZW5lcmljL3JlcGVhdGluZ19hbGFybS5jYyBiL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVwZWF0aW5nX2FsYXJtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTcxOGYyLi4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVwZWF0aW5nX2FsYXJtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zL3JlcGVhdGluZ19hbGFybS5oIgotCi0jaW5jbHVkZSA8c3lzL3RpbWVyZmQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgIm9zL2xpbnV4X2dlbmVyaWMvbGludXguaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy91dGlscy5oIgotCi0jaWZkZWYgT1NfQU5EUk9JRAotI2RlZmluZSBBTEFSTV9DTE9DSyBDTE9DS19CT09UVElNRV9BTEFSTQotI2Vsc2UKLSNkZWZpbmUgQUxBUk1fQ0xPQ0sgQ0xPQ0tfQk9PVFRJTUUKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci11c2luZyBjb21tb246OkNsb3N1cmU7Ci0KLVJlcGVhdGluZ0FsYXJtOjpSZXBlYXRpbmdBbGFybShIYW5kbGVyKiBoYW5kbGVyKSA6IGhhbmRsZXJfKGhhbmRsZXIpLCBmZF8oVElNRVJGRF9DUkVBVEUoQUxBUk1fQ0xPQ0ssIDApKSB7Ci0gIEFTU0VSVChmZF8gIT0gLTEpOwotCi0gIHRva2VuXyA9IGhhbmRsZXJfLT50aHJlYWRfLT5HZXRSZWFjdG9yKCktPlJlZ2lzdGVyKAotICAgICAgZmRfLCBjb21tb246OkJpbmQoJlJlcGVhdGluZ0FsYXJtOjpvbl9maXJlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLCBjb21tb246OkNsb3N1cmUoKSk7Ci19Ci0KLVJlcGVhdGluZ0FsYXJtOjp+UmVwZWF0aW5nQWxhcm0oKSB7Ci0gIGhhbmRsZXJfLT50aHJlYWRfLT5HZXRSZWFjdG9yKCktPlVucmVnaXN0ZXIodG9rZW5fKTsKLQotICBpbnQgY2xvc2Vfc3RhdHVzOwotICBSVU5fTk9fSU5UUihjbG9zZV9zdGF0dXMgPSBUSU1FUkZEX0NMT1NFKGZkXykpOwotICBBU1NFUlQoY2xvc2Vfc3RhdHVzICE9IC0xKTsKLX0KLQotdm9pZCBSZXBlYXRpbmdBbGFybTo6U2NoZWR1bGUoQ2xvc3VyZSB0YXNrLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHBlcmlvZCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBsb25nIHBlcmlvZF9tcyA9IHBlcmlvZC5jb3VudCgpOwotICBpdGltZXJzcGVjIHRpbWVyX2l0aW1lcnNwZWN7e3BlcmlvZF9tcyAvIDEwMDAsIHBlcmlvZF9tcyAlIDEwMDAgKiAxMDAwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwZXJpb2RfbXMgLyAxMDAwLCBwZXJpb2RfbXMgJSAxMDAwICogMTAwMDAwMH19OwotICBpbnQgcmVzdWx0ID0gVElNRVJGRF9TRVRUSU1FKGZkXywgMCwgJnRpbWVyX2l0aW1lcnNwZWMsIG51bGxwdHIpOwotICBBU1NFUlQocmVzdWx0ID09IDApOwotCi0gIHRhc2tfID0gc3RkOjptb3ZlKHRhc2spOwotfQotCi12b2lkIFJlcGVhdGluZ0FsYXJtOjpDYW5jZWwoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGl0aW1lcnNwZWMgZGlzYXJtX2l0aW1lcnNwZWN7LyogZGlzYXJtIHRpbWVyICovfTsKLSAgaW50IHJlc3VsdCA9IFRJTUVSRkRfU0VUVElNRShmZF8sIDAsICZkaXNhcm1faXRpbWVyc3BlYywgbnVsbHB0cik7Ci0gIEFTU0VSVChyZXN1bHQgPT0gMCk7Ci19Ci0KLXZvaWQgUmVwZWF0aW5nQWxhcm06Om9uX2ZpcmUoKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBhdXRvIHRhc2sgPSB0YXNrXzsKLSAgdWludDY0X3QgdGltZXNfaW52b2tlZDsKLSAgYXV0byBieXRlc19yZWFkID0gcmVhZChmZF8sICZ0aW1lc19pbnZva2VkLCBzaXplb2YodWludDY0X3QpKTsKLSAgbG9jay51bmxvY2soKTsKLSAgdGFzay5SdW4oKTsKLSAgQVNTRVJUKGJ5dGVzX3JlYWQgPT0gc3RhdGljX2Nhc3Q8c3NpemVfdD4oc2l6ZW9mKHVpbnQ2NF90KSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvcmVwZWF0aW5nX2FsYXJtX3VuaXR0ZXN0LmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZXBlYXRpbmdfYWxhcm1fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZTEwMjIuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy9yZXBlYXRpbmdfYWxhcm1fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zL3JlcGVhdGluZ19hbGFybS5oIgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci1uYW1lc3BhY2UgewotCi1jb25zdGV4cHIgaW50IGVycm9yX21zID0gMjA7Ci0KLWNsYXNzIFJlcGVhdGluZ0FsYXJtVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGVzdF90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGhhbmRsZXJfID0gbmV3IEhhbmRsZXIodGhyZWFkXyk7Ci0gICAgYWxhcm1fID0gbmV3IFJlcGVhdGluZ0FsYXJtKGhhbmRsZXJfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIGFsYXJtXzsKLSAgICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICB2b2lkIFZlcmlmeU11bHRpcGxlRGVsYXllZFRhc2tzKGludCBzY2hlZHVsZWRfdGFza3MsIGludCB0YXNrX2xlbmd0aF9tcywgaW50IGludGVydmFsX2JldHdlZW5fdGFza3NfbXMpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIGF1dG8gc3RhcnRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgIGludCBjb3VudGVyID0gMDsKLSAgICBhbGFybV8tPlNjaGVkdWxlKAotICAgICAgICBjb21tb246OkJpbmQoCi0gICAgICAgICAgICAmUmVwZWF0aW5nQWxhcm1UZXN0Ojp2ZXJpZnlfZGVsYXllZF90YXNrcywKLSAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZCgmY291bnRlciksCi0gICAgICAgICAgICBzdGFydF90aW1lLAotICAgICAgICAgICAgc2NoZWR1bGVkX3Rhc2tzLAotICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSwKLSAgICAgICAgICAgIHRhc2tfbGVuZ3RoX21zLAotICAgICAgICAgICAgaW50ZXJ2YWxfYmV0d2Vlbl90YXNrc19tcyksCi0gICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoaW50ZXJ2YWxfYmV0d2Vlbl90YXNrc19tcykpOwotICAgIGZ1dHVyZS5nZXQoKTsKLSAgICBhbGFybV8tPkNhbmNlbCgpOwotICB9Ci0KLSAgdm9pZCB2ZXJpZnlfZGVsYXllZF90YXNrcygKLSAgICAgIGludCogY291bnRlciwKLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZSwKLSAgICAgIGludCBzY2hlZHVsZWRfdGFza3MsCi0gICAgICBzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2UsCi0gICAgICBpbnQgdGFza19sZW5ndGhfbXMsCi0gICAgICBpbnQgaW50ZXJ2YWxfYmV0d2Vlbl90YXNrc19tcykgewotICAgICpjb3VudGVyID0gKmNvdW50ZXIgKyAxOwotICAgIGF1dG8gdGltZV9ub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICBhdXRvIHRpbWVfZGVsdGEgPSB0aW1lX25vdyAtIHN0YXJ0X3RpbWU7Ci0gICAgaWYgKCpjb3VudGVyID09IHNjaGVkdWxlZF90YXNrcykgewotICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKCk7Ci0gICAgfQotICAgIEFTU0VSVF9ORUFSKHRpbWVfZGVsdGEuY291bnQoKSwgaW50ZXJ2YWxfYmV0d2Vlbl90YXNrc19tcyAqIDEwMDAwMDAgKiAqY291bnRlciwgZXJyb3JfbXMgKiAxMDAwMDAwKTsKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyh0YXNrX2xlbmd0aF9tcykpOwotICB9Ci0KLSAgUmVwZWF0aW5nQWxhcm0qIGFsYXJtXzsKLQotICBjb21tb246OkNsb3N1cmUgc2hvdWxkX25vdF9oYXBwZW5fID0gY29tbW9uOjpCaW5kKFtdIHsgQVNTRVJUX1RSVUUoZmFsc2UpOyB9KTsKLQotIHByaXZhdGU6Ci0gIFRocmVhZCogdGhyZWFkXzsKLSAgSGFuZGxlciogaGFuZGxlcl87Ci19OwotCi1URVNUX0YoUmVwZWF0aW5nQWxhcm1UZXN0LCBjYW5jZWxfd2hpbGVfbm90X2FybWVkKSB7Ci0gIGFsYXJtXy0+Q2FuY2VsKCk7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdBbGFybVRlc3QsIHNjaGVkdWxlKSB7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBhdXRvIGJlZm9yZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICBpbnQgcGVyaW9kX21zID0gMTA7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoCi0gICAgICBjb21tb246OkJpbmQoJnN0ZDo6cHJvbWlzZTx2b2lkPjo6c2V0X3ZhbHVlLCBjb21tb246OlVucmV0YWluZWQoJnByb21pc2UpKSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhwZXJpb2RfbXMpKTsKLSAgZnV0dXJlLmdldCgpOwotICBhbGFybV8tPkNhbmNlbCgpOwotICBhdXRvIGFmdGVyID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIGF1dG8gZHVyYXRpb24gPSBhZnRlciAtIGJlZm9yZTsKLSAgQVNTRVJUX05FQVIoZHVyYXRpb24uY291bnQoKSwgcGVyaW9kX21zICogMTAwMDAwMCwgZXJyb3JfbXMgKiAxMDAwMDAwKTsKLX0KLQotVEVTVF9GKFJlcGVhdGluZ0FsYXJtVGVzdCwgY2FuY2VsX2FsYXJtKSB7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoc2hvdWxkX25vdF9oYXBwZW5fLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSk7Ci0gIGFsYXJtXy0+Q2FuY2VsKCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdBbGFybVRlc3QsIGNhbmNlbF9hbGFybV9mcm9tX2NhbGxiYWNrKSB7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoCi0gICAgICBjb21tb246OkJpbmQoJlJlcGVhdGluZ0FsYXJtOjpDYW5jZWwsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzLT5hbGFybV8pKSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKSk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGluZ0FsYXJtVGVzdCwgc2NoZWR1bGVfd2hpbGVfYWxhcm1fYXJtZWQpIHsKLSAgYWxhcm1fLT5TY2hlZHVsZShzaG91bGRfbm90X2hhcHBlbl8sIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMSkpOwotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgYWxhcm1fLT5TY2hlZHVsZSgKLSAgICAgIGNvbW1vbjo6QmluZCgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGNvbW1vbjo6VW5yZXRhaW5lZCgmcHJvbWlzZSkpLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSk7Ci0gIGZ1dHVyZS5nZXQoKTsKLSAgYWxhcm1fLT5DYW5jZWwoKTsKLX0KLQotVEVTVF9GKFJlcGVhdGluZ0FsYXJtVGVzdCwgZGVsZXRlX3doaWxlX2FsYXJtX2FybWVkKSB7Ci0gIGFsYXJtXy0+U2NoZWR1bGUoc2hvdWxkX25vdF9oYXBwZW5fLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEpKTsKLSAgZGVsZXRlIGFsYXJtXzsKLSAgYWxhcm1fID0gbnVsbHB0cjsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMSkpOwotfQotCi1URVNUX0YoUmVwZWF0aW5nQWxhcm1UZXN0LCB2ZXJpZnlfc21hbGwpIHsKLSAgVmVyaWZ5TXVsdGlwbGVEZWxheWVkVGFza3MoMTAwLCAxLCAxMCk7Ci19Ci0KLVRFU1RfRihSZXBlYXRpbmdBbGFybVRlc3QsIHZlcmlmeV9sYXJnZSkgewotICBWZXJpZnlNdWx0aXBsZURlbGF5ZWRUYXNrcygxMDAsIDMsIDEwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvdGhyZWFkLmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy90aHJlYWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzFhMzQuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy90aHJlYWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdGV4cHIgaW50IGtSZWFsVGltZUZpZm9TY2hlZHVsaW5nUHJpb3JpdHkgPSAxOwotfQotCi1UaHJlYWQ6OlRocmVhZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgUHJpb3JpdHkgcHJpb3JpdHkpCi0gICAgOiBuYW1lXyhuYW1lKSwgcmVhY3Rvcl8oKSwgcnVubmluZ190aHJlYWRfKCZUaHJlYWQ6OnJ1biwgdGhpcywgcHJpb3JpdHkpIHt9Ci0KLXZvaWQgVGhyZWFkOjpydW4oUHJpb3JpdHkgcHJpb3JpdHkpIHsKLSAgaWYgKHByaW9yaXR5ID09IFByaW9yaXR5OjpSRUFMX1RJTUUpIHsKLSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcnRfcGFyYW1zID0gey5zY2hlZF9wcmlvcml0eSA9IGtSZWFsVGltZUZpZm9TY2hlZHVsaW5nUHJpb3JpdHl9OwotICAgIGF1dG8gbGludXhfdGlkID0gc3RhdGljX2Nhc3Q8cGlkX3Q+KHN5c2NhbGwoU1lTX2dldHRpZCkpOwotICAgIGludCByYzsKLSAgICBSVU5fTk9fSU5UUihyYyA9IHNjaGVkX3NldHNjaGVkdWxlcihsaW51eF90aWQsIFNDSEVEX0ZJRk8sICZydF9wYXJhbXMpKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8gc2V0IFNDSEVEX0ZJRk8gcHJpb3JpdHk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gIH0KLSAgcmVhY3Rvcl8uUnVuKCk7Ci19Ci0KLVRocmVhZDo6flRocmVhZCgpIHsKLSAgU3RvcCgpOwotfQotCi1ib29sIFRocmVhZDo6U3RvcCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgQVNTRVJUKHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpICE9IHJ1bm5pbmdfdGhyZWFkXy5nZXRfaWQoKSk7Ci0KLSAgaWYgKCFydW5uaW5nX3RocmVhZF8uam9pbmFibGUoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZWFjdG9yXy5TdG9wKCk7Ci0gIHJ1bm5pbmdfdGhyZWFkXy5qb2luKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFRocmVhZDo6SXNTYW1lVGhyZWFkKCkgY29uc3QgewotICByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgPT0gcnVubmluZ190aHJlYWRfLmdldF9pZCgpOwotfQotCi1SZWFjdG9yKiBUaHJlYWQ6OkdldFJlYWN0b3IoKSBjb25zdCB7Ci0gIHJldHVybiAmcmVhY3Rvcl87Ci19Ci0KLXN0ZDo6c3RyaW5nIFRocmVhZDo6R2V0VGhyZWFkTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi1zdGQ6OnN0cmluZyBUaHJlYWQ6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gIlRocmVhZCAiICsgbmFtZV87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy90aHJlYWRfdW5pdHRlc3QuY2MgYi9nZC9vcy9saW51eF9nZW5lcmljL3RocmVhZF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExYjZjMi4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL3RocmVhZF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIm9zL3JlYWN0b3IuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIGludCBrQ2hlY2tJc1NhbWVUaHJlYWQgPSAxOwotCi1jbGFzcyBTYW1wbGVSZWFjdGFibGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2FtcGxlUmVhY3RhYmxlKFRocmVhZCogdGhyZWFkKSA6IHRocmVhZF8odGhyZWFkKSwgZmRfKGV2ZW50ZmQoMCwgMCkpLCBpc19zYW1lX3RocmVhZF9jaGVja2VkXyhmYWxzZSkgewotICAgIEVYUEVDVF9ORShmZF8sIDApOwotICB9Ci0KLSAgflNhbXBsZVJlYWN0YWJsZSgpIHsKLSAgICBjbG9zZShmZF8pOwotICB9Ci0KLSAgdm9pZCBPblJlYWRSZWFkeSgpIHsKLSAgICBFWFBFQ1RfVFJVRSh0aHJlYWRfLT5Jc1NhbWVUaHJlYWQoKSk7Ci0gICAgaXNfc2FtZV90aHJlYWRfY2hlY2tlZF8gPSB0cnVlOwotICAgIHVpbnQ2NF90IHZhbDsKLSAgICBldmVudGZkX3JlYWQoZmRfLCAmdmFsKTsKLSAgfQotCi0gIGJvb2wgSXNTYW1lVGhyZWFkQ2hlY2tEb25lKCkgewotICAgIHJldHVybiBpc19zYW1lX3RocmVhZF9jaGVja2VkXzsKLSAgfQotCi0gIFRocmVhZCogdGhyZWFkXzsKLSAgaW50IGZkXzsKLSAgYm9vbCBpc19zYW1lX3RocmVhZF9jaGVja2VkXzsKLX07Ci0KLWNsYXNzIFRocmVhZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdGhyZWFkID0gbmV3IFRocmVhZCgidGVzdCIsIFRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSB0aHJlYWQ7Ci0gIH0KLSAgVGhyZWFkKiB0aHJlYWQgPSBudWxscHRyOwotfTsKLQotVEVTVF9GKFRocmVhZFRlc3QsIGp1c3Rfc3RvcF9ub19vcCkgewotICB0aHJlYWQtPlN0b3AoKTsKLX0KLQotVEVTVF9GKFRocmVhZFRlc3QsIHRocmVhZF9uYW1lKSB7Ci0gIEVYUEVDVF9FUSh0aHJlYWQtPkdldFRocmVhZE5hbWUoKSwgInRlc3QiKTsKLX0KLQotVEVTVF9GKFRocmVhZFRlc3QsIHRocmVhZF90b19zdHJpbmcpIHsKLSAgRVhQRUNUX05FKHRocmVhZC0+VG9TdHJpbmcoKS5maW5kKCJ0ZXN0IiksIHN0ZDo6c3RyaW5nOjpucG9zKTsKLX0KLQotVEVTVF9GKFRocmVhZFRlc3QsIG5vdF9zYW1lX3RocmVhZCkgewotICBFWFBFQ1RfRkFMU0UodGhyZWFkLT5Jc1NhbWVUaHJlYWQoKSk7Ci19Ci0KLVRFU1RfRihUaHJlYWRUZXN0LCBzYW1lX3RocmVhZCkgewotICBSZWFjdG9yKiByZWFjdG9yID0gdGhyZWFkLT5HZXRSZWFjdG9yKCk7Ci0gIFNhbXBsZVJlYWN0YWJsZSBzYW1wbGVfcmVhY3RhYmxlKHRocmVhZCk7Ci0gIGF1dG8qIHJlYWN0YWJsZSA9IHJlYWN0b3ItPlJlZ2lzdGVyKAotICAgICAgc2FtcGxlX3JlYWN0YWJsZS5mZF8sCi0gICAgICBjb21tb246OkJpbmQoJlNhbXBsZVJlYWN0YWJsZTo6T25SZWFkUmVhZHksIGNvbW1vbjo6VW5yZXRhaW5lZCgmc2FtcGxlX3JlYWN0YWJsZSkpLAotICAgICAgY29tbW9uOjpDbG9zdXJlKCkpOwotICBpbnQgZmQgPSBzYW1wbGVfcmVhY3RhYmxlLmZkXzsKLSAgaW50IHdyaXRlX3Jlc3VsdCA9IGV2ZW50ZmRfd3JpdGUoZmQsIGtDaGVja0lzU2FtZVRocmVhZCk7Ci0gIEVYUEVDVF9FUSh3cml0ZV9yZXN1bHQsIDApOwotICB3aGlsZSAoIXNhbXBsZV9yZWFjdGFibGUuSXNTYW1lVGhyZWFkQ2hlY2tEb25lKCkpIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7Ci0gIHJlYWN0b3ItPlVucmVnaXN0ZXIocmVhY3RhYmxlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL2xpbnV4X2dlbmVyaWMvd2FrZWxvY2tfbWFuYWdlci5jYyBiL2dkL29zL2xpbnV4X2dlbmVyaWMvd2FrZWxvY2tfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3Yjk5YS4uMDAwMDAwMAotLS0gYS9nZC9vcy9saW51eF9nZW5lcmljL3dha2Vsb2NrX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgIkJ0R2RXYWtlbG9jayIKLQotI2luY2x1ZGUgIm9zL3dha2Vsb2NrX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgIm9zL2ludGVybmFsL3dha2Vsb2NrX25hdGl2ZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLXVzaW5nIGludGVybmFsOjpXYWtlbG9ja05hdGl2ZTsKLXVzaW5nIFN0YXR1c0NvZGUgPSBXYWtlbG9ja05hdGl2ZTo6U3RhdHVzQ29kZTsKLQotdWludDY0X3Qgbm93X21zKCkgewotICBzdHJ1Y3QgdGltZXNwZWMgdHMgPSB7fTsKLSAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfQk9PVFRJTUUsICZ0cykgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoInVuYWJsZSB0byBnZXQgY3VycmVudCB0aW1lOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuICh0cy50dl9zZWMgKiAxMDAwTEwpICsgKHRzLnR2X25zZWMgLyAxMDAwMDAwTEwpOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyBXYWtlbG9ja01hbmFnZXI6OmtCdFdha2Vsb2NrSWQgPSAiYmx1ZXRvb3RoX2dkX3RpbWVyIjsKLQotLy8gV2FrZWxvY2sgc3RhdGlzdGljcyBmb3IgdGhlICJibHVldG9vdGhfdGltZXIiCi1zdHJ1Y3QgV2FrZWxvY2tNYW5hZ2VyOjpTdGF0cyB7Ci0gIGJvb2wgaXNfYWNxdWlyZWQgPSBmYWxzZTsKLSAgc2l6ZV90IGFjcXVpcmVkX2NvdW50ID0gMDsKLSAgc2l6ZV90IHJlbGVhc2VkX2NvdW50ID0gMDsKLSAgc2l6ZV90IGFjcXVpcmVkX2Vycm9ycyA9IDA7Ci0gIHNpemVfdCByZWxlYXNlZF9lcnJvcnMgPSAwOwotICB1aW50NjRfdCBtaW5fYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSAwOwotICB1aW50NjRfdCBtYXhfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSAwOwotICB1aW50NjRfdCBsYXN0X2FjcXVpcmVkX2ludGVydmFsX21zID0gMDsKLSAgdWludDY0X3QgdG90YWxfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSAwOwotICB1aW50NjRfdCBsYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9tcyA9IDA7Ci0gIHVpbnQ2NF90IGxhc3RfcmVsZWFzZWRfdGltZXN0YW1wX21zID0gMDsKLSAgdWludDY0X3QgbGFzdF9yZXNldF90aW1lc3RhbXBfbXMgPSBub3dfbXMoKTsKLSAgU3RhdHVzQ29kZSBsYXN0X2FjcXVpcmVkX2Vycm9yID0gU3RhdHVzQ29kZTo6U1VDQ0VTUzsKLSAgU3RhdHVzQ29kZSBsYXN0X3JlbGVhc2VkX2Vycm9yID0gU3RhdHVzQ29kZTo6U1VDQ0VTUzsKLQotICB2b2lkIFJlc2V0KCkgewotICAgIGlzX2FjcXVpcmVkID0gZmFsc2U7Ci0gICAgYWNxdWlyZWRfY291bnQgPSAwOwotICAgIHJlbGVhc2VkX2NvdW50ID0gMDsKLSAgICBhY3F1aXJlZF9lcnJvcnMgPSAwOwotICAgIHJlbGVhc2VkX2Vycm9ycyA9IDA7Ci0gICAgbWluX2FjcXVpcmVkX2ludGVydmFsX21zID0gMDsKLSAgICBtYXhfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSAwOwotICAgIGxhc3RfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSAwOwotICAgIHRvdGFsX2FjcXVpcmVkX2ludGVydmFsX21zID0gMDsKLSAgICBsYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9tcyA9IDA7Ci0gICAgbGFzdF9yZWxlYXNlZF90aW1lc3RhbXBfbXMgPSAwOwotICAgIGxhc3RfcmVzZXRfdGltZXN0YW1wX21zID0gbm93X21zKCk7Ci0gICAgbGFzdF9hY3F1aXJlZF9lcnJvciA9IFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci0gICAgbGFzdF9yZWxlYXNlZF9lcnJvciA9IFN0YXR1c0NvZGU6OlNVQ0NFU1M7Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIEJsdWV0b290aCBhY3F1aXJlIHdha2Vsb2NrIHN0YXRpc3RpY3MuCi0gIC8vCi0gIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdoZW4gdGhlIHdha2Vsb2NrIGlzIGFjcXVpcmVkLgotICAvLyB8YWNxdWlyZWRfc3RhdHVzfCBpcyB0aGUgc3RhdHVzIGNvZGUgdGhhdCB3YXMgcmV0dXJuIHdoZW4gdGhlIHdha2Vsb2NrIHdhcwotICAvLyBhY3F1aXJlZC4KLSAgdm9pZCBVcGRhdGVBY3F1aXJlZFN0YXRzKFN0YXR1c0NvZGUgYWNxdWlyZWRfc3RhdHVzKSB7Ci0gICAgY29uc3QgdWludDY0X3QganVzdF9ub3dfbXMgPSBub3dfbXMoKTsKLSAgICBpZiAoYWNxdWlyZWRfc3RhdHVzICE9IFN0YXR1c0NvZGU6OlNVQ0NFU1MpIHsKLSAgICAgIGFjcXVpcmVkX2Vycm9ycysrOwotICAgICAgbGFzdF9hY3F1aXJlZF9lcnJvciA9IGFjcXVpcmVkX3N0YXR1czsKLSAgICB9Ci0KLSAgICBpZiAoaXNfYWNxdWlyZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpc19hY3F1aXJlZCA9IHRydWU7Ci0gICAgYWNxdWlyZWRfY291bnQrKzsKLSAgICBsYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9tcyA9IGp1c3Rfbm93X21zOwotICB9Ci0KLSAgLy8gVXBkYXRlIHRoZSBCbHVldG9vdGggcmVsZWFzZSB3YWtlbG9jayBzdGF0aXN0aWNzLgotICAvLwotICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB3aGVuIHRoZSB3YWtlbG9jayBpcyByZWxlYXNlZC4KLSAgLy8gfHJlbGVhc2VkX3N0YXR1c3wgaXMgdGhlIHN0YXR1cyBjb2RlIHRoYXQgd2FzIHJldHVybiB3aGVuIHRoZSB3YWtlbG9jayB3YXMKLSAgLy8gcmVsZWFzZWQuCi0gIHZvaWQgVXBkYXRlUmVsZWFzZWRTdGF0cyhTdGF0dXNDb2RlIHJlbGVhc2VkX3N0YXR1cykgewotICAgIGNvbnN0IHVpbnQ2NF90IGp1c3Rfbm93X21zID0gbm93X21zKCk7Ci0gICAgaWYgKHJlbGVhc2VkX3N0YXR1cyAhPSBTdGF0dXNDb2RlOjpTVUNDRVNTKSB7Ci0gICAgICByZWxlYXNlZF9lcnJvcnMrKzsKLSAgICAgIGxhc3RfcmVsZWFzZWRfZXJyb3IgPSByZWxlYXNlZF9zdGF0dXM7Ci0gICAgfQotCi0gICAgaWYgKCFpc19hY3F1aXJlZCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlzX2FjcXVpcmVkID0gZmFsc2U7Ci0gICAgcmVsZWFzZWRfY291bnQrKzsKLSAgICBsYXN0X3JlbGVhc2VkX3RpbWVzdGFtcF9tcyA9IGp1c3Rfbm93X21zOwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgYWNxdWlyZWQgaW50ZXJ2YWwgYW5kIHVwZGF0ZSB0aGUgc3RhdGlzdGljcwotICAgIHVpbnQ2NF90IGRlbHRhX21zID0ganVzdF9ub3dfbXMgLSBsYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9tczsKLSAgICBpZiAoZGVsdGFfbXMgPCBtaW5fYWNxdWlyZWRfaW50ZXJ2YWxfbXMgfHwgcmVsZWFzZWRfY291bnQgPT0gMSkgewotICAgICAgbWluX2FjcXVpcmVkX2ludGVydmFsX21zID0gZGVsdGFfbXM7Ci0gICAgfQotICAgIGlmIChkZWx0YV9tcyA+IG1heF9hY3F1aXJlZF9pbnRlcnZhbF9tcykgewotICAgICAgbWF4X2FjcXVpcmVkX2ludGVydmFsX21zID0gZGVsdGFfbXM7Ci0gICAgfQotICAgIGxhc3RfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgICB0b3RhbF9hY3F1aXJlZF9pbnRlcnZhbF9tcyArPSBkZWx0YV9tczsKLSAgfQotCi0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2FrZWxvY2tNYW5hZ2VyRGF0YT4gR2V0RHVtcHN5c0RhdGEoCi0gICAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIqIGZiX2J1aWxkZXIsIGJvb2wgaXNfbmF0aXZlKSBjb25zdCB7Ci0gICAgY29uc3QgdWludDY0X3QganVzdF9ub3dfbXMgPSBub3dfbXMoKTsKLSAgICAvLyBDb21wdXRlIHRoZSBsYXN0IGFjcXVpcmVkIGludGVydmFsIGlmIHRoZSB3YWtlbG9jayBpcyBzdGlsbCBhY3F1aXJlZAotICAgIHVpbnQ2NF90IGRlbHRhX21zID0gMDsKLSAgICB1aW50NjRfdCBsYXN0X2ludGVydmFsX21zID0gbGFzdF9hY3F1aXJlZF9pbnRlcnZhbF9tczsKLSAgICB1aW50NjRfdCBtaW5faW50ZXJ2YWxfbXMgPSBtaW5fYWNxdWlyZWRfaW50ZXJ2YWxfbXM7Ci0gICAgdWludDY0X3QgbWF4X2ludGVydmFsX21zID0gbWF4X2FjcXVpcmVkX2ludGVydmFsX21zOwotICAgIHVpbnQ2NF90IGF2Z19pbnRlcnZhbF9tcyA9IDA7Ci0KLSAgICBpZiAoaXNfYWNxdWlyZWQpIHsKLSAgICAgIGRlbHRhX21zID0ganVzdF9ub3dfbXMgLSBsYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9tczsKLSAgICAgIGlmIChkZWx0YV9tcyA+IG1heF9pbnRlcnZhbF9tcykgewotICAgICAgICBtYXhfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgICAgIH0KLSAgICAgIGlmIChkZWx0YV9tcyA8IG1pbl9pbnRlcnZhbF9tcykgewotICAgICAgICBtaW5faW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgICAgIH0KLSAgICAgIGxhc3RfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgICB9Ci0gICAgdWludDY0X3QgdG90YWxfaW50ZXJ2YWxfbXMgPSB0b3RhbF9hY3F1aXJlZF9pbnRlcnZhbF9tcyArIGRlbHRhX21zOwotCi0gICAgaWYgKGFjcXVpcmVkX2NvdW50ID4gMCkgewotICAgICAgYXZnX2ludGVydmFsX21zID0gdG90YWxfaW50ZXJ2YWxfbXMgLyBhY3F1aXJlZF9jb3VudDsKLSAgICB9Ci0KLSAgICBXYWtlbG9ja01hbmFnZXJEYXRhQnVpbGRlciBidWlsZGVyKCpmYl9idWlsZGVyKTsKLSAgICBidWlsZGVyLmFkZF90aXRsZShmYl9idWlsZGVyLT5DcmVhdGVTdHJpbmcoIkJsdWV0b290aCBXYWtlbG9jayBTdGF0aXN0aWNzIikpOwotICAgIGJ1aWxkZXIuYWRkX2lzX2FjcXVpcmVkKGlzX2FjcXVpcmVkKTsKLSAgICBidWlsZGVyLmFkZF9pc19uYXRpdmUoaXNfbmF0aXZlKTsKLSAgICBidWlsZGVyLmFkZF9hY3F1aXJlZF9jb3VudChhY3F1aXJlZF9jb3VudCk7Ci0gICAgYnVpbGRlci5hZGRfcmVsZWFzZWRfY291bnQocmVsZWFzZWRfY291bnQpOwotICAgIGJ1aWxkZXIuYWRkX2FjcXVpcmVkX2Vycm9yX2NvdW50KGFjcXVpcmVkX2Vycm9ycyk7Ci0gICAgYnVpbGRlci5hZGRfcmVsZWFzZWRfZXJyb3JfY291bnQocmVsZWFzZWRfZXJyb3JzKTsKLSAgICBidWlsZGVyLmFkZF9sYXN0X2FjcXVpcmVfZXJyb3JfY29kZShsYXN0X2FjcXVpcmVkX2Vycm9yKTsKLSAgICBidWlsZGVyLmFkZF9sYXN0X3JlbGVhc2VfZXJyb3JfY29kZShsYXN0X3JlbGVhc2VkX2Vycm9yKTsKLSAgICBidWlsZGVyLmFkZF9sYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9taWxsaXMobGFzdF9pbnRlcnZhbF9tcyk7Ci0gICAgYnVpbGRlci5hZGRfbGFzdF9yZWxlYXNlZF90aW1lc3RhbXBfbWlsbGlzKGxhc3RfcmVsZWFzZWRfdGltZXN0YW1wX21zKTsKLSAgICBidWlsZGVyLmFkZF9sYXN0X2ludGVydmFsX21pbGxpcyhsYXN0X2FjcXVpcmVkX2ludGVydmFsX21zKTsKLSAgICBidWlsZGVyLmFkZF9tYXhfaW50ZXJ2YWxfbWlsbGlzKG1heF9pbnRlcnZhbF9tcyk7Ci0gICAgYnVpbGRlci5hZGRfbWluX2ludGVydmFsX21pbGxpcyhtaW5faW50ZXJ2YWxfbXMpOwotICAgIGJ1aWxkZXIuYWRkX2F2Z19pbnRlcnZhbF9taWxsaXMoYXZnX2ludGVydmFsX21zKTsKLSAgICBidWlsZGVyLmFkZF90b3RhbF9pbnRlcnZhbF9taWxsaXModG90YWxfaW50ZXJ2YWxfbXMpOwotICAgIGJ1aWxkZXIuYWRkX3RvdGFsX3RpbWVfc2luY2VfcmVzZXRfbWlsbGlzKGp1c3Rfbm93X21zIC0gbGFzdF9yZXNldF90aW1lc3RhbXBfbXMpOwotICAgIHJldHVybiBidWlsZGVyLkZpbmlzaCgpOwotICB9Ci19OwotCi12b2lkIFdha2Vsb2NrTWFuYWdlcjo6U2V0T3NDYWxsb3V0cyhPc0NhbGxvdXRzKiBjYWxsb3V0cywgSGFuZGxlciogaGFuZGxlcikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2tfZ3VhcmQobXV0ZXhfKTsKLSAgaWYgKGluaXRpYWxpemVkXykgewotICAgIExPR19XQVJOKCJTZXR0aW5nIE9TIGNhbGxvdXRzIGFmdGVyIGluaXRpYWxpemF0aW9uIGNhbiBsZWFkIHRvIHdha2Vsb2NrIGxlYWshIik7Ci0gIH0KLSAgb3NfY2FsbG91dHNfID0gY2FsbG91dHM7Ci0gIG9zX2NhbGxvdXRzX2hhbmRsZXJfID0gaGFuZGxlcjsKLSAgaXNfbmF0aXZlXyA9IChvc19jYWxsb3V0c18gPT0gbnVsbHB0cik7Ci0gIGlmIChpc19uYXRpdmVfKSB7Ci0gICAgQVNTRVJUX0xPRyhvc19jYWxsb3V0c19oYW5kbGVyXyAhPSBudWxscHRyLCAiaGFuZGxlciBtdXN0IG5vdCBiZSBudWxsIHdoZW4gY2FsbG91dCBpcyBub3QgbnVsbCIpOwotICB9Ci0gIExPR19JTkZPKCJzZXQgdG8gJXMiLCBpc19uYXRpdmVfID8gIm5hdGl2ZSIgOiAibm9uLW5hdGl2ZSIpOwotfQotCi1ib29sIFdha2Vsb2NrTWFuYWdlcjo6QWNxdWlyZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrX2d1YXJkKG11dGV4Xyk7Ci0gIGlmICghaW5pdGlhbGl6ZWRfKSB7Ci0gICAgaWYgKGlzX25hdGl2ZV8pIHsKLSAgICAgIFdha2Vsb2NrTmF0aXZlOjpHZXQoKS5Jbml0aWFsaXplKCk7Ci0gICAgfQotICAgIGluaXRpYWxpemVkXyA9IHRydWU7Ci0gIH0KLQotICBTdGF0dXNDb2RlIHN0YXR1czsKLSAgaWYgKGlzX25hdGl2ZV8pIHsKLSAgICBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuQWNxdWlyZShrQnRXYWtlbG9ja0lkKTsKLSAgfSBlbHNlIHsKLSAgICBvc19jYWxsb3V0c19oYW5kbGVyXy0+Q2FsbE9uKG9zX2NhbGxvdXRzXywgJk9zQ2FsbG91dHM6OkFjcXVpcmVDYWxsb3V0LCBrQnRXYWtlbG9ja0lkKTsKLSAgICBzdGF0dXMgPSBTdGF0dXNDb2RlOjpTVUNDRVNTOwotICB9Ci0KLSAgcHN0YXRzXy0+VXBkYXRlQWNxdWlyZWRTdGF0cyhzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMgIT0gU3RhdHVzQ29kZTo6U1VDQ0VTUykgewotICAgIExPR19FUlJPUigidW5hYmxlIHRvIGFjcXVpcmUgd2FrZSBsb2NrLCBlcnJvciBjb2RlOiAldSIsIHN0YXR1cyk7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzID09IFN0YXR1c0NvZGUgOjpTVUNDRVNTOwotfQotCi1ib29sIFdha2Vsb2NrTWFuYWdlcjo6UmVsZWFzZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrX2d1YXJkKG11dGV4Xyk7Ci0gIGlmICghaW5pdGlhbGl6ZWRfKSB7Ci0gICAgaWYgKGlzX25hdGl2ZV8pIHsKLSAgICAgIFdha2Vsb2NrTmF0aXZlOjpHZXQoKS5Jbml0aWFsaXplKCk7Ci0gICAgfQotICAgIGluaXRpYWxpemVkXyA9IHRydWU7Ci0gIH0KLQotICBTdGF0dXNDb2RlIHN0YXR1czsKLSAgaWYgKGlzX25hdGl2ZV8pIHsKLSAgICBzdGF0dXMgPSBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuUmVsZWFzZShrQnRXYWtlbG9ja0lkKTsKLSAgfSBlbHNlIHsKLSAgICBvc19jYWxsb3V0c19oYW5kbGVyXy0+Q2FsbE9uKG9zX2NhbGxvdXRzXywgJk9zQ2FsbG91dHM6OlJlbGVhc2VDYWxsb3V0LCBrQnRXYWtlbG9ja0lkKTsKLSAgICBzdGF0dXMgPSBTdGF0dXNDb2RlIDo6U1VDQ0VTUzsKLSAgfQotCi0gIHBzdGF0c18tPlVwZGF0ZVJlbGVhc2VkU3RhdHMoc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzICE9IFN0YXR1c0NvZGU6OlNVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoInVuYWJsZSB0byByZWxlYXNlIHdha2UgbG9jaywgZXJyb3IgY29kZTogJXUiLCBzdGF0dXMpOwotICB9Ci0KLSAgcmV0dXJuIHN0YXR1cyA9PSBTdGF0dXNDb2RlIDo6U1VDQ0VTUzsKLX0KLQotdm9pZCBXYWtlbG9ja01hbmFnZXI6OkNsZWFuVXAoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9ja19ndWFyZChtdXRleF8pOwotICBpZiAoIWluaXRpYWxpemVkXykgewotICAgIExPR19FUlJPUigiQWxyZWFkeSB1bmluaXRpYWxpemVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwc3RhdHNfLT5pc19hY3F1aXJlZCkgewotICAgIExPR19FUlJPUigiUmVsZWFzaW5nIHdha2UgbG9jayBhcyBwYXJ0IG9mIGNsZWFudXAiKTsKLSAgICBSZWxlYXNlKCk7Ci0gIH0KLSAgaWYgKGlzX25hdGl2ZV8pIHsKLSAgICBXYWtlbG9ja05hdGl2ZTo6R2V0KCkuQ2xlYW5VcCgpOwotICB9Ci0gIHBzdGF0c18tPlJlc2V0KCk7Ci0gIGluaXRpYWxpemVkXyA9IGZhbHNlOwotfQotCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFdha2Vsb2NrTWFuYWdlckRhdGE+IFdha2Vsb2NrTWFuYWdlcjo6R2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9ja19ndWFyZChtdXRleF8pOwotICByZXR1cm4gcHN0YXRzXy0+R2V0RHVtcHN5c0RhdGEoZmJfYnVpbGRlciwgaXNfbmF0aXZlXyk7Ci19Ci0KLVdha2Vsb2NrTWFuYWdlcjo6V2FrZWxvY2tNYW5hZ2VyKCkgOiBwc3RhdHNfKHN0ZDo6bWFrZV91bmlxdWU8U3RhdHM+KCkpIHt9Ci0KLVdha2Vsb2NrTWFuYWdlcjo6fldha2Vsb2NrTWFuYWdlcigpID0gZGVmYXVsdDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbGludXhfZ2VuZXJpYy93YWtlbG9ja19tYW5hZ2VyX3VuaXR0ZXN0LmNjIGIvZ2Qvb3MvbGludXhfZ2VuZXJpYy93YWtlbG9ja19tYW5hZ2VyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWU5NzA0Li4wMDAwMDAwCi0tLSBhL2dkL29zL2xpbnV4X2dlbmVyaWMvd2FrZWxvY2tfbWFuYWdlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIwIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLSNpbmNsdWRlICJvcy93YWtlbG9ja19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAid2FrZWxvY2tfbWFuYWdlcl9nZW5lcmF0ZWQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6Om9zOjpGaW5pc2hXYWtlbG9ja01hbmFnZXJEYXRhQnVmZmVyOwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6R2V0V2FrZWxvY2tNYW5hZ2VyRGF0YTsKLXVzaW5nIGJsdWV0b290aDo6b3M6OkhhbmRsZXI7Ci11c2luZyBibHVldG9vdGg6Om9zOjpUaHJlYWQ7Ci11c2luZyBibHVldG9vdGg6Om9zOjpXYWtlbG9ja01hbmFnZXI7Ci11c2luZyBibHVldG9vdGg6Om9zOjpXYWtlbG9ja01hbmFnZXJEYXRhOwotdXNpbmcgYmx1ZXRvb3RoOjpvczo6V2FrZWxvY2tNYW5hZ2VyRGF0YUJ1aWxkZXI7Ci0KLWNsYXNzIFRlc3RPc0NhbGxvdXRzIDogcHVibGljIFdha2Vsb2NrTWFuYWdlcjo6T3NDYWxsb3V0cyB7Ci0gcHVibGljOgotICB2b2lkIEFjcXVpcmVDYWxsb3V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGl0ZXIgPSBhY3F1aXJlZF9sb2NrX2NvdW50cy5maW5kKGxvY2tfbmFtZSk7Ci0gICAgaWYgKGl0ZXIgPT0gYWNxdWlyZWRfbG9ja19jb3VudHMuZW5kKCkpIHsKLSAgICAgIGFjcXVpcmVkX2xvY2tfY291bnRzW2xvY2tfbmFtZV0gPSAwOwotICAgIH0KLSAgICBhY3F1aXJlZF9sb2NrX2NvdW50c1tsb2NrX25hbWVdICs9IDE7Ci0gIH0KLQotICB2b2lkIFJlbGVhc2VDYWxsb3V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGl0ZXIgPSBhY3F1aXJlZF9sb2NrX2NvdW50cy5maW5kKGxvY2tfbmFtZSk7Ci0gICAgaWYgKGl0ZXIgPT0gYWNxdWlyZWRfbG9ja19jb3VudHMuZW5kKCkpIHsKLSAgICAgIGFjcXVpcmVkX2xvY2tfY291bnRzW2xvY2tfbmFtZV0gPSAwOwotICAgIH0KLSAgICBhY3F1aXJlZF9sb2NrX2NvdW50c1tsb2NrX25hbWVdIC09IDE7Ci0gIH0KLQotICBzdGQ6Om9wdGlvbmFsPGludD4gR2V0TmV0QWNxdWlyZWRDb3VudChjb25zdCBzdGQ6OnN0cmluZyYgbG9ja19uYW1lKSBjb25zdCB7Ci0gICAgYXV0byBpdGVyID0gYWNxdWlyZWRfbG9ja19jb3VudHMuZmluZChsb2NrX25hbWUpOwotICAgIGlmIChpdGVyID09IGFjcXVpcmVkX2xvY2tfY291bnRzLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICByZXR1cm4gaXRlci0+c2Vjb25kOwotICB9Ci0KLSAgLy8gaG93IG1hbnkgdGltZXMgZWFjaCBsb2NrIGlzIGFjcXVpcmVkLCBuZXQsIGNhbiBnbyBuZWdhdGl2ZQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludD4gYWNxdWlyZWRfbG9ja19jb3VudHM7Ci19OwotCi1jbGFzcyBXYWtlbG9ja01hbmFnZXJUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgidGVzdF90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGhhbmRsZXJfID0gbmV3IEhhbmRsZXIodGhyZWFkXyk7Ci0gIH0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gIH0KLQotICB2b2lkIFN5bmNIYW5kbGVyKCkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlcl8tPlBvc3QoCi0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpCaW5kT25jZSgmc3RkOjpwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUsIGJsdWV0b290aDo6Y29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICAgIGF1dG8gZnV0dXJlX3N0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Ci0gICAgQVNTRVJUX0VRKGZ1dHVyZV9zdGF0dXMsIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpOwotICB9Ci0KLSAgSGFuZGxlciogaGFuZGxlcl87Ci0gIFRocmVhZCogdGhyZWFkXzsKLX07Ci0KLVRFU1RfRihXYWtlbG9ja01hbmFnZXJUZXN0LCB0ZXN0X3NldF9vc19jYWxsb3V0c19yZXBlYXRlZF9hY3F1aXJlKSB7Ci0gIFRlc3RPc0NhbGxvdXRzIG9zX2NhbGxvdXRzOwotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLlNldE9zQ2FsbG91dHMoJm9zX2NhbGxvdXRzLCBoYW5kbGVyXyk7Ci0KLSAgLy8gSW5pdGlhbGx5LCBubyB3YWtlbG9jayBpcyBhY3F1aXJlZAotICBBU1NFUlRfVFJVRShvc19jYWxsb3V0cy5hY3F1aXJlZF9sb2NrX2NvdW50cy5lbXB0eSgpKTsKLSAgQVNTRVJUX0ZBTFNFKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSk7Ci0KLSAgV2FrZWxvY2tNYW5hZ2VyOjpHZXQoKS5BY3F1aXJlKCk7Ci0gIFN5bmNIYW5kbGVyKCk7Ci0gIEFTU0VSVF9FUShvc19jYWxsb3V0cy5hY3F1aXJlZF9sb2NrX2NvdW50cy5zaXplKCksIDEpOwotICBBU1NFUlRfVEhBVChvc19jYWxsb3V0cy5HZXROZXRBY3F1aXJlZENvdW50KFdha2Vsb2NrTWFuYWdlcjo6a0J0V2FrZWxvY2tJZCksIE9wdGlvbmFsKEVxKDEpKSk7Ci0KLSAgV2FrZWxvY2tNYW5hZ2VyOjpHZXQoKS5BY3F1aXJlKCk7Ci0gIFN5bmNIYW5kbGVyKCk7Ci0gIEFTU0VSVF9FUShvc19jYWxsb3V0cy5hY3F1aXJlZF9sb2NrX2NvdW50cy5zaXplKCksIDEpOwotICBBU1NFUlRfVEhBVChvc19jYWxsb3V0cy5HZXROZXRBY3F1aXJlZENvdW50KFdha2Vsb2NrTWFuYWdlcjo6a0J0V2FrZWxvY2tJZCksIE9wdGlvbmFsKEVxKDIpKSk7Ci0KLSAgV2FrZWxvY2tNYW5hZ2VyOjpHZXQoKS5SZWxlYXNlKCk7Ci0gIFN5bmNIYW5kbGVyKCk7Ci0gIEFTU0VSVF9USEFUKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSwgT3B0aW9uYWwoRXEoMSkpKTsKLQotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkNsZWFuVXAoKTsKLSAgU3luY0hhbmRsZXIoKTsKLX0KLQotVEVTVF9GKFdha2Vsb2NrTWFuYWdlclRlc3QsIHRlc3Rfc2V0X29zX2NhbGxvdXRzX3JlcGVhdGVkX3JlbGVhc2UpIHsKLSAgVGVzdE9zQ2FsbG91dHMgb3NfY2FsbG91dHM7Ci0gIFdha2Vsb2NrTWFuYWdlcjo6R2V0KCkuU2V0T3NDYWxsb3V0cygmb3NfY2FsbG91dHMsIGhhbmRsZXJfKTsKLQotICAvLyBJbml0aWFsbHksIG5vIHdha2Vsb2NrIGlzIGFjcXVpcmVkCi0gIEFTU0VSVF9UUlVFKG9zX2NhbGxvdXRzLmFjcXVpcmVkX2xvY2tfY291bnRzLmVtcHR5KCkpOwotICBBU1NFUlRfRkFMU0Uob3NfY2FsbG91dHMuR2V0TmV0QWNxdWlyZWRDb3VudChXYWtlbG9ja01hbmFnZXI6OmtCdFdha2Vsb2NrSWQpKTsKLQotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkFjcXVpcmUoKTsKLSAgU3luY0hhbmRsZXIoKTsKLSAgQVNTRVJUX0VRKG9zX2NhbGxvdXRzLmFjcXVpcmVkX2xvY2tfY291bnRzLnNpemUoKSwgMSk7Ci0gIEFTU0VSVF9USEFUKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSwgT3B0aW9uYWwoRXEoMSkpKTsKLQotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLlJlbGVhc2UoKTsKLSAgU3luY0hhbmRsZXIoKTsKLSAgQVNTRVJUX0VRKG9zX2NhbGxvdXRzLmFjcXVpcmVkX2xvY2tfY291bnRzLnNpemUoKSwgMSk7Ci0gIEFTU0VSVF9USEFUKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSwgT3B0aW9uYWwoRXEoMCkpKTsKLQotICAvLyBPUyBjYWxsb3V0cyBhbGxvdyBwYXNzIHRocm91Z2ggZm9yIHJlcGVhdGVkIHJlbGVhc2UgY2FsbHMKLSAgV2FrZWxvY2tNYW5hZ2VyOjpHZXQoKS5SZWxlYXNlKCk7Ci0gIFN5bmNIYW5kbGVyKCk7Ci0gIEFTU0VSVF9USEFUKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSwgT3B0aW9uYWwoRXEoLTEpKSk7Ci0KLSAgV2FrZWxvY2tNYW5hZ2VyOjpHZXQoKS5DbGVhblVwKCk7Ci0gIFN5bmNIYW5kbGVyKCk7Ci19Ci0KLVRFU1RfRihXYWtlbG9ja01hbmFnZXJUZXN0LCB0ZXN0X3dpdGhfb3NfY2FsbG91dHNfaW5fYV9sb29wX2FuZF9kdW1wKSB7Ci0gIFRlc3RPc0NhbGxvdXRzIG9zX2NhbGxvdXRzOwotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLlNldE9zQ2FsbG91dHMoJm9zX2NhbGxvdXRzLCBoYW5kbGVyXyk7Ci0KLSAgLy8gSW5pdGlhbGx5LCBubyB3YWtlbG9jayBpcyBhY3F1aXJlZAotICBBU1NFUlRfVFJVRShvc19jYWxsb3V0cy5hY3F1aXJlZF9sb2NrX2NvdW50cy5lbXB0eSgpKTsKLSAgQVNTRVJUX0ZBTFNFKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKLSAgICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkFjcXVpcmUoKTsKLSAgICBTeW5jSGFuZGxlcigpOwotICAgIEFTU0VSVF9FUShvc19jYWxsb3V0cy5hY3F1aXJlZF9sb2NrX2NvdW50cy5zaXplKCksIDEpOwotICAgIEFTU0VSVF9USEFUKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSwgT3B0aW9uYWwoRXEoMSkpKTsKLSAgICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLlJlbGVhc2UoKTsKLSAgICBTeW5jSGFuZGxlcigpOwotICAgIEFTU0VSVF9USEFUKG9zX2NhbGxvdXRzLkdldE5ldEFjcXVpcmVkQ291bnQoV2FrZWxvY2tNYW5hZ2VyOjprQnRXYWtlbG9ja0lkKSwgT3B0aW9uYWwoRXEoMCkpKTsKLSAgfQotCi0gIHsKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcigxMDI0KTsKLSAgICBhdXRvIG9mZnNldCA9IFdha2Vsb2NrTWFuYWdlcjo6R2V0KCkuR2V0RHVtcHN5c0RhdGEoJmJ1aWxkZXIpOwotICAgIEZpbmlzaFdha2Vsb2NrTWFuYWdlckRhdGFCdWZmZXIoYnVpbGRlciwgb2Zmc2V0KTsKLSAgICBhdXRvIGRhdGEgPSBHZXRXYWtlbG9ja01hbmFnZXJEYXRhKGJ1aWxkZXIuR2V0QnVmZmVyUG9pbnRlcigpKTsKLQotICAgIEFTU0VSVF9FUShkYXRhLT5hY3F1aXJlZF9jb3VudCgpLCAxMDAwKTsKLSAgICBBU1NFUlRfRVEoZGF0YS0+cmVsZWFzZWRfY291bnQoKSwgMTAwMCk7Ci0gIH0KLQotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkNsZWFuVXAoKTsKLSAgU3luY0hhbmRsZXIoKTsKLQotICB7Ci0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGJ1aWxkZXIoMTAyNCk7Ci0gICAgYXV0byBvZmZzZXQgPSBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkdldER1bXBzeXNEYXRhKCZidWlsZGVyKTsKLSAgICBGaW5pc2hXYWtlbG9ja01hbmFnZXJEYXRhQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCk7Ci0gICAgYXV0byBkYXRhID0gR2V0V2FrZWxvY2tNYW5hZ2VyRGF0YShidWlsZGVyLkdldEJ1ZmZlclBvaW50ZXIoKSk7Ci0KLSAgICBBU1NFUlRfRVEoZGF0YS0+YWNxdWlyZWRfY291bnQoKSwgMCk7Ci0gICAgQVNTRVJUX0VRKGRhdGEtPnJlbGVhc2VkX2NvdW50KCksIDApOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9vcy9sb2cuaCBiL2dkL29zL2xvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmM1ZTI2Li4wMDAwMDAwCi0tLSBhL2dkL29zL2xvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jaWZuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoIgotI2VuZGlmCi0KLXN0YXRpY19hc3NlcnQoTE9HX1RBRyAhPSBudWxscHRyLCAiTE9HX1RBRyBzaG91bGQgbmV2ZXIgYmUgTlVMTCIpOwotCi0jaWYgZGVmaW5lZChPU19BTkRST0lEKQotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0jaW5jbHVkZSAiY29tbW9uL2luaXRfZmxhZ3MuaCIKLQotI2lmZGVmIEZVWlpfVEFSR0VUCi0jZGVmaW5lIExPR19WRVJCT1NFKC4uLikKLSNkZWZpbmUgTE9HX0RFQlVHKC4uLikKLSNkZWZpbmUgTE9HX0lORk8oLi4uKQotI2RlZmluZSBMT0dfV0FSTiguLi4pCi0jZWxzZQotCi1zdGF0aWNfYXNzZXJ0KExPR19UQUcgIT0gbnVsbHB0ciwgIkxPR19UQUcgaXMgbnVsbCBhZnRlciBoZWFkZXIgaW5jbHVzaW9uIik7Ci0KLSNkZWZpbmUgTE9HX1ZFUkJPU0UoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYmx1ZXRvb3RoOjpjb21tb246OkluaXRGbGFnczo6SXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yVGFnKExPR19UQUcpKSB7IFwKLSAgICAgIEFMT0dWKCIlczolZCAlczogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncyk7ICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCi0KLSNkZWZpbmUgTE9HX0RFQlVHKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYmx1ZXRvb3RoOjpjb21tb246OkluaXRGbGFnczo6SXNEZWJ1Z0xvZ2dpbmdFbmFibGVkRm9yVGFnKExPR19UQUcpKSB7IFwKLSAgICAgIEFMT0dEKCIlczolZCAlczogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncyk7ICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCi0KLSNkZWZpbmUgTE9HX0lORk8oZm10LCBhcmdzLi4uKSBBTE9HSSgiJXM6JWQgJXM6ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCAjI2FyZ3MpCi0jZGVmaW5lIExPR19XQVJOKGZtdCwgYXJncy4uLikgQUxPR1coIiVzOiVkICVzOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgIyNhcmdzKQotI2VuZGlmIC8qIEZVWlpfVEFSR0VUICovCi0jZGVmaW5lIExPR19FUlJPUihmbXQsIGFyZ3MuLi4pIEFMT0dFKCIlczolZCAlczogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncykKLQotI2VsaWYgZGVmaW5lZCAoQU5EUk9JRF9FTVVMQVRPUikKLS8vIExvZyB1c2luZyBhbmRyb2lkIGVtdWxhdG9yIGxvZ2dpbmcgbWVjaGFuaXNtCi0jaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgotCi0jZGVmaW5lIExPR1dSQVBQRVIoZm10LCBhcmdzLi4uKSBWRVJCT1NFX0lORk8oYmx1ZXRvb3RoLCAiYmx1ZXRvb3RoOiAlczolZCAtICVzOiAiIGZtdCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMjYXJncykKLQotI2RlZmluZSBMT0dfVkVCT1NFKC4uLikgTE9HV1JBUFBFUihfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTE9HX0RFQlVHKC4uLikgIExPR1dSQVBQRVIoX19WQV9BUkdTX18pCi0jZGVmaW5lIExPR19JTkZPKC4uLikgICBMT0dXUkFQUEVSKF9fVkFfQVJHU19fKQotI2RlZmluZSBMT0dfV0FSTiguLi4pICAgTE9HV1JBUFBFUihfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTE9HX0VSUk9SKC4uLikgIExPR1dSQVBQRVIoX19WQV9BUkdTX18pCi0jZGVmaW5lIExPR19BTFdBWVNfRkFUQUwoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsICIlczolZCAtICVzOiAiIGZtdCAiXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCAjI2FyZ3MpOyBcCi0gICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotI2VsaWYgZGVmaW5lZChUQVJHRVRfRkxPU1MpCi0jaW5jbHVkZSAiZ2Qvb3Mvc3lzbG9nLmgiCi0KLS8vIFByZWZpeCB0aGUgbG9nIHdpdGggdGFnLCBmaWxlLCBsaW5lIGFuZCBmdW5jdGlvbgotI2RlZmluZSBMT0dXUkFQUEVSKHRhZywgZm10LCBhcmdzLi4uKSBcCi0gIHdyaXRlX3N5c2xvZyh0YWcsICIlczolczolZCAtICVzOiAiIGZtdCwgTE9HX1RBRywgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgIyNhcmdzKQotCi0jaWZkZWYgRlVaWl9UQVJHRVQKLSNkZWZpbmUgTE9HX1ZFUkJPU0UoLi4uKQotI2RlZmluZSBMT0dfREVCVUcoLi4uKQotI2RlZmluZSBMT0dfSU5GTyguLi4pCi0jZGVmaW5lIExPR19XQVJOKC4uLikKLSNlbHNlCi0jZGVmaW5lIExPR19WRVJCT1NFKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZyhMT0dfVEFHKSkgeyBcCi0gICAgICBMT0dXUkFQUEVSKExPR19UQUdfVkVSQk9TRSwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotI2RlZmluZSBMT0dfREVCVUcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChibHVldG9vdGg6OmNvbW1vbjo6SW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoTE9HX1RBRykpIHsgXAotICAgICAgTE9HV1JBUFBFUihMT0dfVEFHX0RFQlVHLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlIChmYWxzZSkKLSNkZWZpbmUgTE9HX0lORk8oLi4uKSBMT0dXUkFQUEVSKExPR19UQUdfSU5GTywgX19WQV9BUkdTX18pCi0jZGVmaW5lIExPR19XQVJOKC4uLikgTE9HV1JBUFBFUihMT0dfVEFHX1dBUk4sIF9fVkFfQVJHU19fKQotI2VuZGlmIC8qRlVaWl9UQVJHRVQqLwotI2RlZmluZSBMT0dfRVJST1IoLi4uKSBMT0dXUkFQUEVSKExPR19UQUdfRVJST1IsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExPR19BTFdBWVNfRkFUQUwoLi4uKSAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExPR1dSQVBQRVIoTE9HX1RBR19GQVRBTCwgX19WQV9BUkdTX18pOyBcCi0gICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCi0KLSNpZm5kZWYgYW5kcm9pZF9lcnJvcldyaXRlTG9nCi0jZGVmaW5lIGFuZHJvaWRfZXJyb3JXcml0ZUxvZyh0YWcsIHN1YlRhZykgTE9HX0VSUk9SKCJFUlJPUiB0YWc6IDB4JXgsIHN1Yl90YWc6ICVzIiwgdGFnLCBzdWJUYWcpCi0jZW5kaWYKLQotI2lmbmRlZiBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZwotI2RlZmluZSBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyh0YWcsIHN1YlRhZywgdWlkLCBkYXRhLCBkYXRhTGVuKSBcCi0gIExPR19FUlJPUigiRVJST1IgdGFnOiAweCV4LCBzdWJfdGFnOiAlcyIsIHRhZywgc3ViVGFnKQotI2VuZGlmCi0KLSNpZm5kZWYgTE9HX0VWRU5UX0lOVAotI2RlZmluZSBMT0dfRVZFTlRfSU5UKC4uLikKLSNlbmRpZgotCi0jZWxzZQotLyogc3lzbG9nIGRpZG4ndCB3b3JrIHdlbGwgaGVyZSBzaW5jZSB3ZSB3b3VsZCBiZSByZWRlZmluaW5nIExPR19ERUJVRy4gKi8KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjdGltZT4KLQotI2RlZmluZSBMT0dXUkFQUEVSKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdXRvIF9ub3cgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF1dG8gX25vd19tcyA9IHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50X2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oX25vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXV0byBfbm93X3QgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoX25vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBZWVlZLU1NLUREX0hIOk1NOlNTLnNzcyBpcyAyMyBieXRlIGxvbmcsIHBsdXMgMSBmb3IgbnVsbCB0ZXJtaW5hdG9yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgX2J1ZlsyNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXV0byBsID0gc3RkOjpzdHJmdGltZShfYnVmLCBzaXplb2YoX2J1ZiksICIlWS0lbS0lZCAlSDolTTolUyIsIHN0ZDo6bG9jYWx0aW1lKCZfbm93X3QpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzbnByaW50ZiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfYnVmICsgbCwgc2l6ZW9mKF9idWYpIC0gbCwgIi4lMDN1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pihfbm93X21zLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpICUgMTAwMCkpOyBcCi0gICAgLyogcGlkIG1heCBpcyAyXjIyID0gNDE5NDMwNCBpbiA2NC1iaXQgc3lzdGVtLCBhbmQgMzI3NjggYnkgZGVmYXVsdCwgaGVuY2UgNyBkaWdpdHMgYXJlIG5lZWRlZCBtb3N0ICovICAgICAgICAgIFwKLSAgICBmcHJpbnRmKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICIlcyAlN2QgJTdsZCAlcyAtICVzOiVkIC0gJXM6ICIgZm10ICJcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX2J1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGdldHBpZCgpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN5c2NhbGwoU1lTX2dldHRpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTE9HX1RBRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19mdW5jX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAjI2FyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotCi0jaWZkZWYgRlVaWl9UQVJHRVQKLSNkZWZpbmUgTE9HX1ZFUkJPU0UoLi4uKQotI2RlZmluZSBMT0dfREVCVUcoLi4uKQotI2RlZmluZSBMT0dfSU5GTyguLi4pCi0jZGVmaW5lIExPR19XQVJOKC4uLikKLSNlbHNlCi0jZGVmaW5lIExPR19WRVJCT1NFKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvclRhZyhMT0dfVEFHKSkgeyBcCi0gICAgICBMT0dXUkFQUEVSKGZtdCwgIyNhcmdzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotI2RlZmluZSBMT0dfREVCVUcoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChibHVldG9vdGg6OmNvbW1vbjo6SW5pdEZsYWdzOjpJc0RlYnVnTG9nZ2luZ0VuYWJsZWRGb3JUYWcoTE9HX1RBRykpIHsgXAotICAgICAgTE9HV1JBUFBFUihmbXQsICMjYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlIChmYWxzZSkKLSNkZWZpbmUgTE9HX0lORk8oLi4uKSBMT0dXUkFQUEVSKF9fVkFfQVJHU19fKQotI2RlZmluZSBMT0dfV0FSTiguLi4pIExPR1dSQVBQRVIoX19WQV9BUkdTX18pCi0jZW5kaWYgLyogRlVaWl9UQVJHRVQgKi8KLSNkZWZpbmUgTE9HX0VSUk9SKC4uLikgTE9HV1JBUFBFUihfX1ZBX0FSR1NfXykKLQotI2lmbmRlZiBMT0dfQUxXQVlTX0ZBVEFMCi0jZGVmaW5lIExPR19BTFdBWVNfRkFUQUwoLi4uKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTE9HV1JBUFBFUihfX1ZBX0FSR1NfXyk7ICBcCi0gICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotI2VuZGlmCi0KLSNpZm5kZWYgYW5kcm9pZF9lcnJvcldyaXRlTG9nCi0jZGVmaW5lIGFuZHJvaWRfZXJyb3JXcml0ZUxvZyh0YWcsIHN1YlRhZykgTE9HX0VSUk9SKCJFUlJPUiB0YWc6IDB4JXgsIHN1Yl90YWc6ICVzIiwgdGFnLCBzdWJUYWcpCi0jZW5kaWYKLQotI2lmbmRlZiBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZwotI2RlZmluZSBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyh0YWcsIHN1YlRhZywgdWlkLCBkYXRhLCBkYXRhTGVuKSBcCi0gIExPR19FUlJPUigiRVJST1IgdGFnOiAweCV4LCBzdWJfdGFnOiAlcyIsIHRhZywgc3ViVGFnKQotI2VuZGlmCi0KLSNpZm5kZWYgTE9HX0VWRU5UX0lOVAotI2RlZmluZSBMT0dfRVZFTlRfSU5UKC4uLikKLSNlbmRpZgotCi0jZW5kaWYgLyogZGVmaW5lZChPU19BTkRST0lEKSAqLwotCi0jZGVmaW5lIEFTU0VSVChjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIShjb25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJhc3NlcnRpb24gJyIgI2NvbmRpdGlvbiAiJyBmYWlsZWQiKTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoZmFsc2UpCi0KLSNkZWZpbmUgQVNTRVJUX0xPRyhjb25kaXRpb24sIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPR19BTFdBWVNfRkFUQUwoImFzc2VydGlvbiAnIiAjY29uZGl0aW9uICInIGZhaWxlZCAtICIgZm10LCAjI2FyZ3MpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlIChmYWxzZSkKLQotI2lmbmRlZiBDQVNFX1JFVFVSTl9URVhUCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2Qvb3MvbWV0cmljcy5oIGIvZ2Qvb3MvbWV0cmljcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjhlYzU3Li4wMDAwMDAwCi0tLSBhL2dkL29zL21ldHJpY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIG9zIHsKLS8qKgotICogVW5rbm93biBjb25uZWN0aW9uIGhhbmRsZSBmb3IgbWV0cmljcyBwdXJwb3NlCi0gKi8KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGUgPSAweEZGRkY7Ci0KLS8qKgotICogTG9nIGxpbmsgbGF5ZXIgY29ubmVjdGlvbiBldmVudAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIFN0YWNrIHdpZGUgY29uc2lzdGVudCBCbHVldG9vdGggYWRkcmVzcyBvZiB0aGlzIGV2ZW50LAotICogICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bmtub3duCi0gKiBAcGFyYW0gY29ubmVjdGlvbl9oYW5kbGUgY29ubmVjdGlvbiBoYW5kbGUgb2YgdGhpcyBldmVudCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsga1Vua25vd25Db25uZWN0aW9uSGFuZGxlfSBpZiB1bmtub3duCi0gKiBAcGFyYW0gZGlyZWN0aW9uIGRpcmVjdGlvbiBvZiB0aGlzIGNvbm5lY3Rpb24KLSAqIEBwYXJhbSBsaW5rX3R5cGUgdHlwZSBvZiB0aGUgbGluawotICogQHBhcmFtIGhjaV9jbWQgSENJIGNvbW1hbmQgb3BlY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCwgaWYgYW55Ci0gKiBAcGFyYW0gaGNpX2V2ZW50IEhDSSBldmVudCBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSBoY2lfYmxlX2V2ZW50IEhDSSBCTEUgZXZlbnQgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCwgaWYgYW55Ci0gKiBAcGFyYW0gY21kX3N0YXR1cyBDb21tYW5kIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCwgaWYgYW55Ci0gKiBAcGFyYW0gcmVhc29uX2NvZGUgUmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQsIGlmIGFueQotICovCi12b2lkIExvZ01ldHJpY0xpbmtMYXllckNvbm5lY3Rpb25FdmVudCgKLSAgICBjb25zdCBoY2k6OkFkZHJlc3MqIGFkZHJlc3MsCi0gICAgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwKLSAgICB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICB1aW50MTZfdCBjbWRfc3RhdHVzLAotICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlKTsKLQotLyoqCi0gKiBMb2dzIHdoZW4gQmx1ZXRvb3RoIGNvbnRyb2xsZXIgZmFpbGVkIHRvIHJlcGx5IHdpdGggY29tbWFuZCBzdGF0dXMgd2l0aGluCi0gKiBhIHRpbWVvdXQgcGVyaW9kIGFmdGVyIHJlY2VpdmluZyBhbiBIQ0kgY29tbWFuZCBmcm9tIHRoZSBob3N0Ci0gKgotICogQHBhcmFtIGhjaV9jbWQgb3Bjb2RlIG9mIEhDSSBjb21tYW5kIHRoYXQgY2F1c2VkIHRoaXMgdGltZW91dAotICovCi12b2lkIExvZ01ldHJpY0hjaVRpbWVvdXRFdmVudCh1aW50MzJfdCBoY2lfY21kKTsKLQotLyoqCi0gKiBMb2dzIHdoZW4gd2UgcmVjZWl2ZSBCbHVldG9vdGggUmVhZCBSZW1vdGUgVmVyc2lvbiBJbmZvcm1hdGlvbiBDb21wbGV0ZQotICogRXZlbnQgZnJvbSB0aGUgcmVtb3RlIGRldmljZSwgYXMgZG9jdW1lbnRlZCBieSB0aGUgQmx1ZXRvb3RoIENvcmUgSENJCi0gKiBzcGVjaWZpY2F0aW9uCi0gKgotICogUmVmZXJlbmNlOiA1LjAgQ29yZSBTcGVjaWZpY2F0aW9uLCBWb2wgMiwgUGFydCBFLCBQYWdlIDExMTgKLSAqCi0gKiBAcGFyYW0gaGFuZGxlIGhhbmRsZSBvZiBhc3NvY2lhdGVkIEFDTCBjb25uZWN0aW9uCi0gKiBAcGFyYW0gc3RhdHVzIEhDSSBjb21tYW5kIHN0YXR1cyBvZiB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIGNvZGUgZnJvbSByZWFkIHJlbW90ZSB2ZXJzaW9uIGNvbXBsZXRlIGV2ZW50Ci0gKiBAcGFyYW0gbWFudWZhY3R1cmVyX25hbWUgbWFudWZhY3R1cmVyIGNvZGUgZnJvbSByZWFkIHJlbW90ZSB2ZXJzaW9uIGNvbXBsZXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQKLSAqIEBwYXJhbSBzdWJ2ZXJzaW9uIHN1YnZlcnNpb24gY29kZSBmcm9tIHJlYWQgcmVtb3RlIHZlcnNpb24gY29tcGxldGUgZXZlbnQKLSAqLwotdm9pZCBMb2dNZXRyaWNSZW1vdGVWZXJzaW9uSW5mbygKLSAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IHZlcnNpb24sIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJ2ZXJzaW9uKTsKLQotLyoqCi0gKiBMb2cgQTJEUCBhdWRpbyBidWZmZXIgdW5kZXJydW4gZXZlbnQKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBBMkRQIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGVuY29kaW5nX2ludGVydmFsX21pbGxpcyBlbmNvZGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMKLSAqIEBwYXJhbSBudW1fbWlzc2luZ19wY21fYnl0ZXMgbnVtYmVyIG9mIFBDTSBieXRlcyB0aGF0IGNhbm5vdCBiZSByZWFkIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZQotICovCi12b2lkIExvZ01ldHJpY0EyZHBBdWRpb1VuZGVycnVuRXZlbnQoCi0gICAgY29uc3QgaGNpOjpBZGRyZXNzJiBhZGRyZXNzLCB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsIGludCBudW1fbWlzc2luZ19wY21fYnl0ZXMpOwotCi0vKioKLSAqIExvZyBBMkRQIGF1ZGlvIGJ1ZmZlciBvdmVycnVuIGV2ZW50Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgQTJEUCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMgZW5jb2RpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcGFyYW0gbnVtX2Ryb3BwZWRfYnVmZmVycyBudW1iZXIgb2YgZW5jb2RlZCBidWZmZXJzIGRyb3BwZWQgZnJvbSBUeCBxdWV1ZQotICogQHBhcmFtIG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzIG51bWJlciBvZiBlbmNvZGVkIGZyYW1lcyBkcm9wcGVkIGZyb20gVHgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZQotICogQHBhcmFtIG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMgbnVtYmVyIG9mIGVuY29kZWQgYnl0ZXMgZHJvcHBlZCBmcm9tIFR4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZQotICovCi12b2lkIExvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudCgKLSAgICBjb25zdCBoY2k6OkFkZHJlc3MmIGFkZHJlc3MsCi0gICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLAotICAgIGludCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywKLSAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyk7Ci0KLS8qKgotICogTG9nIEEyRFAgYXVkaW8gcGxheWJhY2sgc3RhdGUgY2hhbmdlZCBldmVudAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIEEyRFAgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gcGxheWJhY2tfc3RhdGUgQTJEUCBhdWRpbyBwbGF5YmFjayBzdGF0ZSwgb24vb2ZmCi0gKiBAcGFyYW0gYXVkaW9fY29kaW5nX21vZGUgQTJEUCBhdWRpbyBjb2RlYyBlbmNvZGluZyBtb2RlLCBody9zdwotICovCi12b2lkIExvZ01ldHJpY0EyZHBQbGF5YmFja0V2ZW50KGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcywgaW50IHBsYXliYWNrX3N0YXRlLCBpbnQgYXVkaW9fY29kaW5nX21vZGUpOwotCi0vKioKLSAqIExvZyByZWFkIFJTU0kgcmVzdWx0Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBjbWRfc3RhdHVzIGNvbW1hbmQgc3RhdHVzIGZyb20gcmVhZCBSU1NJIGNvbW1hbmQKLSAqIEBwYXJhbSByc3NpIHJzc2kgdmFsdWUgaW4gZEJtCi0gKi8KLXZvaWQgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQoY29uc3QgaGNpOjpBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGNtZF9zdGF0dXMsIGludDhfdCByc3NpKTsKLQotLyoqCi0gKiBMb2cgZmFpbGVkIGNvbnRhY3QgY291bnRlciByZXBvcnQKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBoYW5kbGUgY29ubmVjdGlvbiBoYW5kbGUgb2YgdGhpcyBldmVudCwKLSAqICAgICAgICAgICAgICAge0BsaW5rIGtVbmtub3duQ29ubmVjdGlvbkhhbmRsZX0gaWYgdW5rbm93bgotICogQHBhcmFtIGNtZF9zdGF0dXMgY29tbWFuZCBzdGF0dXMgZnJvbSByZWFkIGZhaWxlZCBjb250YWN0IGNvdW50ZXIgY29tbWFuZAotICogQHBhcmFtIGZhaWxlZF9jb250YWN0X2NvdW50ZXIgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZhaWxlZCBjb250YWN0cyBmb3IgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBIYW5kbGUKLSAqLwotdm9pZCBMb2dNZXRyaWNSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJSZXN1bHQoCi0gICAgY29uc3QgaGNpOjpBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGNtZF9zdGF0dXMsIGludDMyX3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcik7Ci0KLS8qKgotICogTG9nIHRyYW5zbWl0IHBvd2VyIGxldmVsIGZvciBhIHBhcnRpY3VsYXIgZGV2aWNlIGFmdGVyIHJlYWQKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBoYW5kbGUgY29ubmVjdGlvbiBoYW5kbGUgb2YgdGhpcyBldmVudCwKLSAqICAgICAgICAgICAgICAge0BsaW5rIGtVbmtub3duQ29ubmVjdGlvbkhhbmRsZX0gaWYgdW5rbm93bgotICogQHBhcmFtIGNtZF9zdGF0dXMgY29tbWFuZCBzdGF0dXMgZnJvbSByZWFkIGZhaWxlZCBjb250YWN0IGNvdW50ZXIgY29tbWFuZAotICogQHBhcmFtIHRyYW5zbWl0X3Bvd2VyX2xldmVsIHRyYW5zbWl0IHBvd2VyIGxldmVsIGZvciBjb25uZWN0aW9uIHRvIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKLSAqLwotdm9pZCBMb2dNZXRyaWNSZWFkVHhQb3dlckxldmVsUmVzdWx0KAotICAgIGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKTsKLQotLyoqCi0gKiBMb2dzIHdoZW4gdGhlcmUgaXMgYW4gZXZlbnQgcmVsYXRlZCB0byBCbHVldG9vdGggU2VjdXJpdHkgTWFuYWdlciBQcm90b2NvbAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBkZXZpY2UKLSAqIEBwYXJhbSBzbXBfY21kIFNNUCBjb21tYW5kIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBkaXJlY3Rpb24gZGlyZWN0aW9uIG9mIHRoaXMgU01QIGNvbW1hbmQKLSAqIEBwYXJhbSBzbXBfZmFpbF9yZWFzb24gU01QIHBhaXJpbmcgZmFpbHVyZSByZWFzb24gY29kZSBmcm9tIFNNUCBzcGVjCi0gKi8KLXZvaWQgTG9nTWV0cmljU21wUGFpcmluZ0V2ZW50KAotICAgIGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzbXBfY21kLCBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50OF90IHNtcF9mYWlsX3JlYXNvbik7Ci0KLS8qKgotICogTG9ncyB0aGVyZSBpcyBhbiBldmVudCByZWxhdGVkIEJsdWV0b290aCBjbGFzc2ljIHBhaXJpbmcKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIGFzc29jaWF0ZWQgZGV2aWNlCi0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBoY2lfY21kIEhDSSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGNpX2V2ZW50IEhDSSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGNtZF9zdGF0dXMgQ29tbWFuZCBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSByZWFzb25fY29kZSBSZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGV2ZW50X3ZhbHVlIEEgc3RhdHVzIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBzcGVjaWZpYyBldmVudAotICovCi12b2lkIExvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgY29uc3QgaGNpOjpBZGRyZXNzJiBhZGRyZXNzLAotICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICB1aW50MzJfdCBoY2lfY21kLAotICAgIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICB1aW50MTZfdCBjbWRfc3RhdHVzLAotICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlLAotICAgIGludDY0X3QgZXZlbnRfdmFsdWUpOwotCi0vKioKLSAqIExvZ3Mgd2hlbiBjZXJ0YWluIEJsdWV0b290aCBTRFAgYXR0cmlidXRlcyBhcmUgZGlzY292ZXJlZAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBkZXZpY2UKLSAqIEBwYXJhbSBwcm90b2NvbF91dWlkIDE2IGJpdCBwcm90b2NvbCBVVUlEIGZyb20gQmx1ZXRvb3RoIEFzc2lnbmVkIE51bWJlcnMKLSAqIEBwYXJhbSBhdHRyaWJ1dGVfaWQgMTYgYml0IGF0dHJpYnV0ZSBJRCBmcm9tIEJsdWV0b290aCBBc3NpZ25lZCBOdW1iZXJzCi0gKiBAcGFyYW0gYXR0cmlidXRlX3NpemUgc2l6ZSBvZiB0aGlzIGF0dHJpYnV0ZQotICogQHBhcmFtIGF0dHJpYnV0ZV92YWx1ZSBwb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgZGF0YSwgbXVzdCBiZSBsYXJnZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfc2l6ZQotICovCi12b2lkIExvZ01ldHJpY1NkcEF0dHJpYnV0ZSgKLSAgICBjb25zdCBoY2k6OkFkZHJlc3MmIGFkZHJlc3MsCi0gICAgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsCi0gICAgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLAotICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSk7Ci0KLS8qKgotICogTG9ncyB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIEJsdWV0b290aCBzb2NrZXQgY29ubmVjdGlvbiBzdGF0ZQotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBkZXZpY2UsIGVtcHR5IGlmIHRoaXMgaXMgYSBzZXJ2ZXIgcG9ydAotICogQHBhcmFtIHBvcnQgcG9ydCBvZiB0aGlzIHNvY2tldCBjb25uZWN0aW9uCi0gKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHNvY2tldAotICogQHBhcmFtIGNvbm5lY3Rpb25fc3RhdGUgc29ja2V0IGNvbm5lY3Rpb24gc3RhdGUKLSAqIEBwYXJhbSB0eF9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQKLSAqIEBwYXJhbSByeF9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQKLSAqIEBwYXJhbSBzZXJ2ZXJfcG9ydCBzZXJ2ZXIgcG9ydCBvZiB0aGlzIHNvY2tldCwgaWYgYW55LiBXaGVuIGJvdGgKLSAqICAgICAgICB8c2VydmVyX3BvcnR8IGFuZCB8cG9ydHwgZmllbGRzIGFyZSBwb3B1bGF0ZWQsIHxwb3J0fCBtdXN0IGJlIHNwYXduZWQKLSAqICAgICAgICBieSB8c2VydmVyX3BvcnR8Ci0gKiBAcGFyYW0gc29ja2V0X3JvbGUgcm9sZSBvZiB0aGlzIHNvY2tldCwgc2VydmVyIG9yIGNvbm5lY3Rpb24KLSAqIEBwYXJhbSB1aWQgc29ja2V0IG93bmVyJ3MgdWlkCi0gKi8KLXZvaWQgTG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlKAotICAgIGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcywKLSAgICBpbnQgcG9ydCwKLSAgICBpbnQgdHlwZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW0gY29ubmVjdGlvbl9zdGF0ZSwKLSAgICBpbnQ2NF90IHR4X2J5dGVzLAotICAgIGludDY0X3QgcnhfYnl0ZXMsCi0gICAgaW50IHVpZCwKLSAgICBpbnQgc2VydmVyX3BvcnQsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRSb2xlRW51bSBzb2NrZXRfcm9sZSk7Ci0KLS8qKgotICogTG9ncyB3aGVuIGEgQmx1ZXRvb3RoIGRldmljZSdzIG1hbnVmYWN0dXJlciBpbmZvcm1hdGlvbiBpcyBsZWFybnQKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIGFzc29jaWF0ZWQgZGV2aWNlCi0gKiBAcGFyYW0gc291cmNlX3R5cGUgd2hlcmUgaXMgdGhpcyBkZXZpY2UgaW5mbyBvYnRhaW5lZCBmcm9tCi0gKiBAcGFyYW0gc291cmNlX25hbWUgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UsIGludGVybmFsIG9yIGV4dGVybmFsCi0gKiBAcGFyYW0gbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIG1hbnVmYWN0dXJlciBvZiB0aGlzIGRldmljZQotICogQHBhcmFtIG1vZGVsIG1vZGVsIG9mIHRoaXMgZGV2aWNlCi0gKiBAcGFyYW0gaGFyZHdhcmVfdmVyc2lvbiBoYXJkd2FyZSB2ZXJzaW9uIG9mIHRoaXMgZGV2aWNlCi0gKiBAcGFyYW0gc29mdHdhcmVfdmVyc2lvbiBzb2Z0d2FyZSB2ZXJzaW9uIG9mIHRoaXMgZGV2aWNlCi0gKi8KLXZvaWQgTG9nTWV0cmljTWFudWZhY3R1cmVySW5mbygKLSAgICBjb25zdCBoY2k6OkFkZHJlc3MmIGFkZHJlc3MsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEZXZpY2VJbmZvU3JjRW51bSBzb3VyY2VfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1hbnVmYWN0dXJlciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbW9kZWwsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24pOwotCi0vKioKLSAqIExvZ3Mgd2hlbiByZWNlaXZlZCBCbHVldG9vdGggSEFMIGNyYXNoIHJlYXNvbiByZXBvcnQuCi0gKgotICogQHBhcmFtIGFkZHJlc3MgY3VycmVudCBjb25uZWN0ZWQgYWRkcmVzcy4KLSAqIEBwYXJhbSBlcnJvcl9jb2RlIHRoZSBjcmFzaCByZWFzb24gZnJvbSBibHVldG9vdGggaGFsCi0gKiBAcGFyYW0gdmVuZG9yX2Vycm9yX2NvZGUgdGhlIHZlbmRvciBjcmFzaCByZWFzb24gZnJvbSBibHVldG9vdGggZmlybXdhcmUKLSAqLwotdm9pZCBMb2dNZXRyaWNCbHVldG9vdGhIYWxDcmFzaFJlYXNvbigKLSAgICBjb25zdCBoY2k6OkFkZHJlc3MmIGFkZHJlc3MsCi0gICAgdWludDMyX3QgZXJyb3JfY29kZSwKLSAgICB1aW50MzJfdCB2ZW5kb3JfZXJyb3JfY29kZSk7Ci19ICAvLyBuYW1lc3BhY2Ugb3MKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvbW9ja19xdWV1ZS5oIGIvZ2Qvb3MvbW9ja19xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI0ODgwLi4wMDAwMDAwCi0tLSBhL2dkL29zL21vY2tfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaWRpX3F1ZXVlLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAib3MvcXVldWUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1vY2tJUXVldWVFbnF1ZXVlIDogcHVibGljIElRdWV1ZUVucXVldWU8VD4gewotIHB1YmxpYzoKLSAgdXNpbmcgRW5xdWV1ZUNhbGxiYWNrID0gY29tbW9uOjpDYWxsYmFjazxzdGQ6OnVuaXF1ZV9wdHI8VD4oKT47Ci0KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyRW5xdWV1ZShIYW5kbGVyKiBoYW5kbGVyLCBFbnF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBBU1NFUlQocmVnaXN0ZXJlZF9oYW5kbGVyID09IG51bGxwdHIpOwotICAgIHJlZ2lzdGVyZWRfaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgcmVnaXN0ZXJlZF9lbnF1ZXVlX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlckVucXVldWUoKSB7Ci0gICAgQVNTRVJUKHJlZ2lzdGVyZWRfaGFuZGxlciAhPSBudWxscHRyKTsKLSAgICByZWdpc3RlcmVkX2hhbmRsZXIgPSBudWxscHRyOwotICAgIHJlZ2lzdGVyZWRfZW5xdWV1ZV9jYWxsYmFjayA9IHt9OwotICB9Ci0KLSAgdm9pZCBydW5fZW5xdWV1ZSh1bnNpZ25lZCB0aW1lcyA9IDEpIHsKLSAgICB3aGlsZSAocmVnaXN0ZXJlZF9oYW5kbGVyICE9IG51bGxwdHIgJiYgdGltZXMgPiAwKSB7Ci0gICAgICB0aW1lcy0tOwotICAgICAgZW5xdWV1ZWQucHVzaChyZWdpc3RlcmVkX2VucXVldWVfY2FsbGJhY2suUnVuKCkpOwotICAgIH0KLSAgfQotCi0gIEhhbmRsZXIqIHJlZ2lzdGVyZWRfaGFuZGxlciA9IG51bGxwdHI7Ci0gIEVucXVldWVDYWxsYmFjayByZWdpc3RlcmVkX2VucXVldWVfY2FsbGJhY2sgPSB7fTsKLSAgc3RkOjpxdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8VD4+IGVucXVldWVkID0ge307Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1vY2tJUXVldWVEZXF1ZXVlIDogcHVibGljIElRdWV1ZURlcXVldWU8VD4gewotIHB1YmxpYzoKLSAgdXNpbmcgRGVxdWV1ZUNhbGxiYWNrID0gY29tbW9uOjpDYWxsYmFjazx2b2lkKCk+OwotCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckRlcXVldWUoSGFuZGxlciogaGFuZGxlciwgRGVxdWV1ZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgQVNTRVJUKHJlZ2lzdGVyZWRfaGFuZGxlciA9PSBudWxscHRyKTsKLSAgICByZWdpc3RlcmVkX2hhbmRsZXIgPSBoYW5kbGVyOwotICAgIHJlZ2lzdGVyZWRfZGVxdWV1ZV9jYWxsYmFjayA9IGNhbGxiYWNrOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJEZXF1ZXVlKCkgewotICAgIEFTU0VSVChyZWdpc3RlcmVkX2hhbmRsZXIgIT0gbnVsbHB0cik7Ci0gICAgcmVnaXN0ZXJlZF9oYW5kbGVyID0gbnVsbHB0cjsKLSAgICByZWdpc3RlcmVkX2RlcXVldWVfY2FsbGJhY2sgPSB7fTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFQ+IFRyeURlcXVldWUoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFQ+IGZyb250ID0gc3RkOjptb3ZlKGVucXVldWVkLmZyb250KCkpOwotICAgIGVucXVldWVkLnBvcCgpOwotICAgIHJldHVybiBmcm9udDsKLSAgfQotCi0gIHZvaWQgcnVuX2RlcXVldWUodW5zaWduZWQgdGltZXMgPSAxKSB7Ci0gICAgd2hpbGUgKHJlZ2lzdGVyZWRfaGFuZGxlciAhPSBudWxscHRyICYmIHRpbWVzID4gMCkgewotICAgICAgdGltZXMtLTsKLSAgICAgIHJlZ2lzdGVyZWRfZGVxdWV1ZV9jYWxsYmFjay5SdW4oKTsKLSAgICB9Ci0gIH0KLQotICBIYW5kbGVyKiByZWdpc3RlcmVkX2hhbmRsZXIgPSBudWxscHRyOwotICBEZXF1ZXVlQ2FsbGJhY2sgcmVnaXN0ZXJlZF9kZXF1ZXVlX2NhbGxiYWNrID0ge307Ci0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPFQ+PiBlbnF1ZXVlZCA9IHt9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9wYXJhbWV0ZXJfcHJvdmlkZXIuaCBiL2dkL29zL3BhcmFtZXRlcl9wcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTEzOTE4Li4wMDAwMDAwCi0tLSBhL2dkL29zL3BhcmFtZXRlcl9wcm92aWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJvcy9idF9rZXlzdG9yZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLWNsYXNzIFBhcmFtZXRlclByb3ZpZGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybiB0aGUgcGF0aCB0byBjb25maWcgZmlsZSBmb3Igc3RvcmFnZSBtb2R1bGUKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIENvbmZpZ0ZpbGVQYXRoKCk7Ci0KLSAgc3RhdGljIHZvaWQgT3ZlcnJpZGVDb25maWdGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7Ci0KLSAgLy8gUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBkZWZhdWx0IHNub29wIGxvZyBmaWxlIGxvY2F0aW9uCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBTbm9vcExvZ0ZpbGVQYXRoKCk7Ci0KLSAgc3RhdGljIHZvaWQgT3ZlcnJpZGVTbm9vcExvZ0ZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKLQotICAvLyBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRlZmF1bHQgc25vb3ogbG9nIGZpbGUgbG9jYXRpb24KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIFNub296TG9nRmlsZVBhdGgoKTsKLQotICBzdGF0aWMgdm9pZCBPdmVycmlkZVNub296TG9nRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwotCi0gIHN0YXRpYyBibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCk7Ci0KLSAgc3RhdGljIHZvaWQgU2V0QnRLZXlzdG9yZUludGVyZmFjZShibHVldG9vdGhfa2V5c3RvcmU6OkJsdWV0b290aEtleXN0b3JlSW50ZXJmYWNlKiBidF9rZXlzdG9yZSk7Ci0KLSAgc3RhdGljIGJvb2wgSXNDb21tb25Dcml0ZXJpYU1vZGUoKTsKLQotICBzdGF0aWMgdm9pZCBTZXRDb21tb25Dcml0ZXJpYU1vZGUoYm9vbCBlbmFibGUpOwotCi0gIHN0YXRpYyBpbnQgR2V0Q29tbW9uQ3JpdGVyaWFDb25maWdDb21wYXJlUmVzdWx0KCk7Ci0KLSAgc3RhdGljIHZvaWQgU2V0Q29tbW9uQ3JpdGVyaWFDb25maWdDb21wYXJlUmVzdWx0KGludCByZXN1bHQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvb3MvcXVldWUuaCBiL2dkL29zL3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGI1NTQuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2lmZGVmIE9TX0xJTlVYX0dFTkVSSUMKLSNpbmNsdWRlICJvcy9saW51eF9nZW5lcmljL3JlYWN0aXZlX3NlbWFwaG9yZS5oIgotI2VuZGlmCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotLy8gU2VlIGRvY3VtZW50YXRpb24gZm9yIHxRdWV1ZXwKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSVF1ZXVlRW5xdWV1ZSB7Ci0gcHVibGljOgotICB1c2luZyBFbnF1ZXVlQ2FsbGJhY2sgPSBjb21tb246OkNhbGxiYWNrPHN0ZDo6dW5pcXVlX3B0cjxUPigpPjsKLSAgdmlydHVhbCB+SVF1ZXVlRW5xdWV1ZSgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyRW5xdWV1ZShIYW5kbGVyKiBoYW5kbGVyLCBFbnF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spID0gMDsKLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJFbnF1ZXVlKCkgPSAwOwotfTsKLQotLy8gU2VlIGRvY3VtZW50YXRpb24gZm9yIHxRdWV1ZXwKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSVF1ZXVlRGVxdWV1ZSB7Ci0gcHVibGljOgotICB1c2luZyBEZXF1ZXVlQ2FsbGJhY2sgPSBjb21tb246OkNhbGxiYWNrPHZvaWQoKT47Ci0gIHZpcnR1YWwgfklRdWV1ZURlcXVldWUoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckRlcXVldWUoSGFuZGxlciogaGFuZGxlciwgRGVxdWV1ZUNhbGxiYWNrIGNhbGxiYWNrKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyRGVxdWV1ZSgpID0gMDsKLSAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8VD4gVHJ5RGVxdWV1ZSgpID0gMDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUXVldWUgOiBwdWJsaWMgSVF1ZXVlRW5xdWV1ZTxUPiwgcHVibGljIElRdWV1ZURlcXVldWU8VD4gewotIHB1YmxpYzoKLSAgLy8gQSBmdW5jdGlvbiBtb3ZpbmcgZGF0YSBmcm9tIGVucXVldWUgZW5kIGJ1ZmZlciB0byBxdWV1ZSwgaXQgd2lsbCBiZSBjb250aW51YWxseSBiZSBpbnZva2VkIHVudGlsIHF1ZXVlCi0gIC8vIGlzIGZ1bGwuIEVucXVldWUgZW5kIHNob3VsZCBtYWtlIHN1cmUgYnVmZmVyIGlzbid0IGVtcHR5IGFuZCBVbnJlZ2lzdGVyRW5xdWV1ZSB3aGVuIGJ1ZmZlciBiZWNvbWUgZW1wdHkuCi0gIHVzaW5nIEVucXVldWVDYWxsYmFjayA9IGNvbW1vbjo6Q2FsbGJhY2s8c3RkOjp1bmlxdWVfcHRyPFQ+KCk+OwotICAvLyBBIGZ1bmN0aW9uIG1vdmluZyBkYXRhIGZvcm0gcXVldWUgdG8gZGVxdWV1ZSBlbmQgYnVmZmVyLCBpdCB3aWxsIGJlIGNvbnRpbnVhbGx5IGJlIGludm9rZWQgdW50aWwgcXVldWUKLSAgLy8gaXMgZW1wdHkuIFRyeURlcXVldWUgc2hvdWxkIGJlIHVzZSBpbiB0aGlzIGZ1bmN0aW9uIHRvIGdldCBkYXRhIGZyb20gcXVldWUuCi0gIHVzaW5nIERlcXVldWVDYWxsYmFjayA9IGNvbW1vbjo6Q2FsbGJhY2s8dm9pZCgpPjsKLSAgLy8gQ3JlYXRlIGEgcXVldWUgd2l0aCB8Y2FwYWNpdHl8IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBhIHF1ZXVlIGNhbiBjb250YWluCi0gIGV4cGxpY2l0IFF1ZXVlKHNpemVfdCBjYXBhY2l0eSk7Ci0gIH5RdWV1ZSgpOwotICAvLyBSZWdpc3RlciB8Y2FsbGJhY2t8IHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gfGhhbmRsZXJ8IHdoZW4gdGhlIHF1ZXVlIGlzIGFibGUgdG8gZW5xdWV1ZSBvbmUgcGllY2Ugb2YgZGF0YS4KLSAgLy8gVGhpcyB3aWxsIGNhdXNlIGEgY3Jhc2ggaWYgaGFuZGxlciBvciBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlLgotICB2b2lkIFJlZ2lzdGVyRW5xdWV1ZShIYW5kbGVyKiBoYW5kbGVyLCBFbnF1ZXVlQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOwotICAvLyBVbnJlZ2lzdGVyIGN1cnJlbnQgRW5xdWV1ZUNhbGxiYWNrIGZyb20gdGhpcyBxdWV1ZSwgdGhpcyB3aWxsIGNhdXNlIGEgY3Jhc2ggaWYgbm90IHJlZ2lzdGVyZWQgeWV0LgotICB2b2lkIFVucmVnaXN0ZXJFbnF1ZXVlKCkgb3ZlcnJpZGU7Ci0gIC8vIFJlZ2lzdGVyIHxjYWxsYmFja3wgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiB8aGFuZGxlcnwgd2hlbiB0aGUgcXVldWUgaGFzIGF0IGxlYXN0IG9uZSBwaWVjZSBvZiBkYXRhIHJlYWR5Ci0gIC8vIGZvciBkZXF1ZXVlLiBUaGlzIHdpbGwgY2F1c2UgYSBjcmFzaCBpZiBoYW5kbGVyIG9yIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUuCi0gIHZvaWQgUmVnaXN0ZXJEZXF1ZXVlKEhhbmRsZXIqIGhhbmRsZXIsIERlcXVldWVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIC8vIFVucmVnaXN0ZXIgY3VycmVudCBEZXF1ZXVlQ2FsbGJhY2sgZnJvbSB0aGlzIHF1ZXVlLCB0aGlzIHdpbGwgY2F1c2UgYSBjcmFzaCBpZiBub3QgcmVnaXN0ZXJlZCB5ZXQuCi0gIHZvaWQgVW5yZWdpc3RlckRlcXVldWUoKSBvdmVycmlkZTsKLQotICAvLyBUcnkgdG8gZGVxdWV1ZSBhbiBpdGVtIGZyb20gdGhpcyBxdWV1ZS4gUmV0dXJuIG51bGxwdHIgd2hlbiB0aGVyZSBpcyBub3RoaW5nIGluIHRoZSBxdWV1ZS4KLSAgc3RkOjp1bmlxdWVfcHRyPFQ+IFRyeURlcXVldWUoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWwoRW5xdWV1ZUNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgLy8gQW4gaW50ZXJuYWwgcXVldWUgdGhhdCBob2xkcyBhdCBtb3N0IHxjYXBhY2l0eXwgcGllY2VzIG9mIGRhdGEKLSAgc3RkOjpxdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8VD4+IHF1ZXVlXzsKLSAgLy8gQSBtdXRleCB0aGF0IGd1YXJkcyBkYXRhIGluIHRoaXMgcXVldWUKLSAgc3RkOjptdXRleCBtdXRleF87Ci0KLSAgY2xhc3MgUXVldWVFbmRwb2ludCB7Ci0gICBwdWJsaWM6Ci0jaWZkZWYgT1NfTElOVVhfR0VORVJJQwotICAgIGV4cGxpY2l0IFF1ZXVlRW5kcG9pbnQodW5zaWduZWQgaW50IGluaXRpYWxfdmFsdWUpCi0gICAgICAgIDogcmVhY3RpdmVfc2VtYXBob3JlXyhpbml0aWFsX3ZhbHVlKSwgaGFuZGxlcl8obnVsbHB0ciksIHJlYWN0YWJsZV8obnVsbHB0cikge30KLSAgICBSZWFjdGl2ZVNlbWFwaG9yZSByZWFjdGl2ZV9zZW1hcGhvcmVfOwotI2VuZGlmCi0gICAgSGFuZGxlciogaGFuZGxlcl87Ci0gICAgUmVhY3Rvcjo6UmVhY3RhYmxlKiByZWFjdGFibGVfOwotICB9OwotCi0gIFF1ZXVlRW5kcG9pbnQgZW5xdWV1ZV87Ci0gIFF1ZXVlRW5kcG9pbnQgZGVxdWV1ZV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEVucXVldWVCdWZmZXIgewotIHB1YmxpYzoKLSAgRW5xdWV1ZUJ1ZmZlcihJUXVldWVFbnF1ZXVlPFQ+KiBxdWV1ZSkgOiBxdWV1ZV8ocXVldWUpIHt9Ci0KLSAgfkVucXVldWVCdWZmZXIoKSB7Ci0gICAgaWYgKGVucXVldWVfcmVnaXN0ZXJlZF8uZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICBxdWV1ZV8tPlVucmVnaXN0ZXJFbnF1ZXVlKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBFbnF1ZXVlKHN0ZDo6dW5pcXVlX3B0cjxUPiB0LCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgYnVmZmVyXy5wdXNoKHN0ZDo6bW92ZSh0KSk7Ci0gICAgaWYgKCFlbnF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKHRydWUpKSB7Ci0gICAgICBxdWV1ZV8tPlJlZ2lzdGVyRW5xdWV1ZShoYW5kbGVyLCBjb21tb246OkJpbmQoJkVucXVldWVCdWZmZXI8VD46OmVucXVldWVfY2FsbGJhY2ssIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgQ2xlYXIoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBpZiAoZW5xdWV1ZV9yZWdpc3RlcmVkXy5leGNoYW5nZShmYWxzZSkpIHsKLSAgICAgIHF1ZXVlXy0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICAgIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPFQ+PiBlbXB0eTsKLSAgICAgIHN0ZDo6c3dhcChidWZmZXJfLCBlbXB0eSk7Ci0gICAgfQotICB9Ci0KLSAgYXV0byBTaXplKCkgY29uc3QgewotICAgIHJldHVybiBidWZmZXJfLnNpemUoKTsKLSAgfQotCi0gIHZvaWQgTm90aWZ5T25FbXB0eShjb21tb246Ok9uY2VDbG9zdXJlIGNhbGxiYWNrKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBBU1NFUlQoY2FsbGJhY2tfb25fZW1wdHlfLmlzX251bGwoKSk7Ci0gICAgY2FsbGJhY2tfb25fZW1wdHlfID0gc3RkOjptb3ZlKGNhbGxiYWNrKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPFQ+IGVucXVldWVfY2FsbGJhY2soKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZW5xdWV1ZWRfdCA9IHN0ZDo6bW92ZShidWZmZXJfLmZyb250KCkpOwotICAgIGJ1ZmZlcl8ucG9wKCk7Ci0gICAgaWYgKGJ1ZmZlcl8uZW1wdHkoKSAmJiBlbnF1ZXVlX3JlZ2lzdGVyZWRfLmV4Y2hhbmdlKGZhbHNlKSkgewotICAgICAgcXVldWVfLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICAgICAgaWYgKCFjYWxsYmFja19vbl9lbXB0eV8uaXNfbnVsbCgpKSB7Ci0gICAgICAgIHN0ZDo6bW92ZShjYWxsYmFja19vbl9lbXB0eV8pLlJ1bigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZW5xdWV1ZWRfdDsKLSAgfQotCi0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci0gIElRdWV1ZUVucXVldWU8VD4qIHF1ZXVlXzsKLSAgc3RkOjphdG9taWNfYm9vbCBlbnF1ZXVlX3JlZ2lzdGVyZWRfID0gZmFsc2U7Ci0gIHN0ZDo6cXVldWU8c3RkOjp1bmlxdWVfcHRyPFQ+PiBidWZmZXJfOwotICBjb21tb246Ok9uY2VDbG9zdXJlIGNhbGxiYWNrX29uX2VtcHR5XzsKLX07Ci0KLSNpZmRlZiBPU19MSU5VWF9HRU5FUklDCi0jaW5jbHVkZSAib3MvbGludXhfZ2VuZXJpYy9xdWV1ZS50cHAiCi0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9xdWV1ZV9iZW5jaG1hcmsuY2MgYi9nZC9vcy9xdWV1ZV9iZW5jaG1hcmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjZhZWEuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvcXVldWVfYmVuY2htYXJrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLXVzaW5nIDo6YmVuY2htYXJrOjpTdGF0ZTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1jbGFzcyBCTV9RdWV1ZVBlcmZvcm1hbmNlIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgOjpiZW5jaG1hcms6OkZpeHR1cmU6OlNldFVwKHN0KTsKLSAgICBlbnF1ZXVlX3RocmVhZF8gPSBuZXcgVGhyZWFkKCJlbnF1ZXVlX3RocmVhZCIsIFRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgZW5xdWV1ZV9oYW5kbGVyXyA9IG5ldyBIYW5kbGVyKGVucXVldWVfdGhyZWFkXyk7Ci0gICAgZGVxdWV1ZV90aHJlYWRfID0gbmV3IFRocmVhZCgiZGVxdWV1ZV90aHJlYWQiLCBUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUwpOwotICAgIGRlcXVldWVfaGFuZGxlcl8gPSBuZXcgSGFuZGxlcihkZXF1ZXVlX3RocmVhZF8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgZW5xdWV1ZV9oYW5kbGVyXzsKLSAgICBkZWxldGUgZW5xdWV1ZV90aHJlYWRfOwotICAgIGRlbGV0ZSBkZXF1ZXVlX2hhbmRsZXJfOwotICAgIGRlbGV0ZSBkZXF1ZXVlX3RocmVhZF87Ci0gICAgZW5xdWV1ZV9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgZW5xdWV1ZV90aHJlYWRfID0gbnVsbHB0cjsKLSAgICBkZXF1ZXVlX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgICBkZXF1ZXVlX3RocmVhZF8gPSBudWxscHRyOwotICAgIGJlbmNobWFyazo6Rml4dHVyZTo6VGVhckRvd24oc3QpOwotICB9Ci0KLSAgVGhyZWFkKiBlbnF1ZXVlX3RocmVhZF87Ci0gIEhhbmRsZXIqIGVucXVldWVfaGFuZGxlcl87Ci0gIFRocmVhZCogZGVxdWV1ZV90aHJlYWRfOwotICBIYW5kbGVyKiBkZXF1ZXVlX2hhbmRsZXJfOwotfTsKLQotY2xhc3MgVGVzdEVucXVldWVFbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGVzdEVucXVldWVFbmQoaW50NjRfdCBjb3VudCwgUXVldWU8c3RkOjpzdHJpbmc+KiBxdWV1ZSwgSGFuZGxlciogaGFuZGxlciwgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlKQotICAgICAgOiBjb3VudF8oY291bnQpLCBoYW5kbGVyXyhoYW5kbGVyKSwgcXVldWVfKHF1ZXVlKSwgcHJvbWlzZV8ocHJvbWlzZSkge30KLQotICB2b2lkIFJlZ2lzdGVyRW5xdWV1ZSgpIHsKLSAgICBoYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZUZXN0RW5xdWV1ZUVuZDo6aGFuZGxlX3JlZ2lzdGVyX2VucXVldWUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBwdXNoKHN0ZDo6c3RyaW5nIGRhdGEpIHsKLSAgICB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICAgICAgYnVmZmVyXy5wdXNoKHN0ZDo6bW92ZShkYXRhKSk7Ci0gICAgfQotICAgIGlmIChidWZmZXJfLnNpemUoKSA9PSAxKSB7Ci0gICAgICBSZWdpc3RlckVucXVldWUoKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IEVucXVldWVDYWxsYmFja0ZvclRlc3QoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+IGRhdGEgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihzdGQ6Om1vdmUoYnVmZmVyXy5mcm9udCgpKSk7Ci0gICAgYnVmZmVyXy5wb3AoKTsKLQotICAgIGlmIChidWZmZXJfLmVtcHR5KCkpIHsKLSAgICAgIHF1ZXVlXy0+VW5yZWdpc3RlckVucXVldWUoKTsKLSAgICB9Ci0KLSAgICBjb3VudF8tLTsKLSAgICBpZiAoY291bnRfID09IDApIHsKLSAgICAgIHByb21pc2VfLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHN0ZDo6cXVldWU8c3RkOjpzdHJpbmc+IGJ1ZmZlcl87Ci0gIGludDY0X3QgY291bnRfOwotCi0gcHJpdmF0ZToKLSAgSGFuZGxlciogaGFuZGxlcl87Ci0gIFF1ZXVlPHN0ZDo6c3RyaW5nPiogcXVldWVfOwotICBzdGQ6OnByb21pc2U8dm9pZD4qIHByb21pc2VfOwotICBzdGQ6Om11dGV4IG11dGV4XzsKLQotICB2b2lkIGhhbmRsZV9yZWdpc3Rlcl9lbnF1ZXVlKCkgewotICAgIHF1ZXVlXy0+UmVnaXN0ZXJFbnF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJlRlc3RFbnF1ZXVlRW5kOjpFbnF1ZXVlQ2FsbGJhY2tGb3JUZXN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotfTsKLQotY2xhc3MgVGVzdERlcXVldWVFbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGVzdERlcXVldWVFbmQoaW50NjRfdCBjb3VudCwgUXVldWU8c3RkOjpzdHJpbmc+KiBxdWV1ZSwgSGFuZGxlciogaGFuZGxlciwgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlKQotICAgICAgOiBjb3VudF8oY291bnQpLCBoYW5kbGVyXyhoYW5kbGVyKSwgcXVldWVfKHF1ZXVlKSwgcHJvbWlzZV8ocHJvbWlzZSkge30KLQotICB2b2lkIFJlZ2lzdGVyRGVxdWV1ZSgpIHsKLSAgICBoYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZUZXN0RGVxdWV1ZUVuZDo6aGFuZGxlX3JlZ2lzdGVyX2RlcXVldWUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBEZXF1ZXVlQ2FsbGJhY2tGb3JUZXN0KCkgewotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAqKHF1ZXVlXy0+VHJ5RGVxdWV1ZSgpKTsKLSAgICBidWZmZXJfLnB1c2goZGF0YSk7Ci0KLSAgICBjb3VudF8tLTsKLSAgICBpZiAoY291bnRfID09IDApIHsKLSAgICAgIHF1ZXVlXy0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICAgIHByb21pc2VfLT5zZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnF1ZXVlPHN0ZDo6c3RyaW5nPiBidWZmZXJfOwotICBpbnQ2NF90IGNvdW50XzsKLQotIHByaXZhdGU6Ci0gIEhhbmRsZXIqIGhhbmRsZXJfOwotICBRdWV1ZTxzdGQ6OnN0cmluZz4qIHF1ZXVlXzsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+KiBwcm9taXNlXzsKLQotICB2b2lkIGhhbmRsZV9yZWdpc3Rlcl9kZXF1ZXVlKCkgewotICAgIHF1ZXVlXy0+UmVnaXN0ZXJEZXF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJlRlc3REZXF1ZXVlRW5kOjpEZXF1ZXVlQ2FsbGJhY2tGb3JUZXN0LCBjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotfTsKLQotQkVOQ0hNQVJLX0RFRklORV9GKEJNX1F1ZXVlUGVyZm9ybWFuY2UsIHNlbmRfcGFja2V0X3ZhcnlfYnlfcGFja2V0X251bSkoU3RhdGUmIHN0YXRlKSB7Ci0gIGZvciAoYXV0byBfIDogc3RhdGUpIHsKLSAgICBpbnQ2NF90IG51bV9kYXRhX3RvX3NlbmRfID0gc3RhdGUucmFuZ2UoMCk7Ci0gICAgUXVldWU8c3RkOjpzdHJpbmc+IHF1ZXVlKG51bV9kYXRhX3RvX3NlbmRfKTsKLQotICAgIC8vIHJlZ2lzdGVyIGRlcXVldWUKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gZGVxdWV1ZV9wcm9taXNlOwotICAgIGF1dG8gZGVxdWV1ZV9mdXR1cmUgPSBkZXF1ZXVlX3Byb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIFRlc3REZXF1ZXVlRW5kIHRlc3RfZGVxdWV1ZV9lbmQobnVtX2RhdGFfdG9fc2VuZF8sICZxdWV1ZSwgZW5xdWV1ZV9oYW5kbGVyXywgJmRlcXVldWVfcHJvbWlzZSk7Ci0gICAgdGVzdF9kZXF1ZXVlX2VuZC5SZWdpc3RlckRlcXVldWUoKTsKLQotICAgIC8vIFB1c2ggZGF0YSB0byBlbnF1ZXVlIGVuZCBidWZmZXIgYW5kIHJlZ2lzdGVyIGVucXVldWUKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gZW5xdWV1ZV9wcm9taXNlOwotICAgIFRlc3RFbnF1ZXVlRW5kIHRlc3RfZW5xdWV1ZV9lbmQobnVtX2RhdGFfdG9fc2VuZF8sICZxdWV1ZSwgZW5xdWV1ZV9oYW5kbGVyXywgJmVucXVldWVfcHJvbWlzZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGF0YV90b19zZW5kXzsgaSsrKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBkYXRhID0gc3RkOjp0b19zdHJpbmcoMSk7Ci0gICAgICB0ZXN0X2VucXVldWVfZW5kLnB1c2goc3RkOjptb3ZlKGRhdGEpKTsKLSAgICB9Ci0gICAgZGVxdWV1ZV9mdXR1cmUud2FpdCgpOwotICB9Ci0KLSAgc3RhdGUuU2V0Qnl0ZXNQcm9jZXNzZWQoc3RhdGljX2Nhc3Q8aW50X2Zhc3Q2NF90PihzdGF0ZS5pdGVyYXRpb25zKCkpICogc3RhdGUucmFuZ2UoMCkpOwotfTsKLQotQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQk1fUXVldWVQZXJmb3JtYW5jZSwgc2VuZF9wYWNrZXRfdmFyeV9ieV9wYWNrZXRfbnVtKQotICAgIC0+QXJnKDEwKQotICAgIC0+QXJnKDEwMCkKLSAgICAtPkFyZygxMDAwKQotICAgIC0+QXJnKDEwMDAwKQotICAgIC0+QXJnKDEwMDAwMCkKLSAgICAtPkl0ZXJhdGlvbnMoMTAwKQotICAgIC0+VXNlUmVhbFRpbWUoKTsKLQotQkVOQ0hNQVJLX0RFRklORV9GKEJNX1F1ZXVlUGVyZm9ybWFuY2UsIHNlbmRfMTAwMDBfcGFja2V0X3ZhcnlfYnlfcGFja2V0X3NpemUpKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgaW50NjRfdCBudW1fZGF0YV90b19zZW5kXyA9IDEwMDAwOwotICAgIGludDY0X3QgcGFja2V0X3NpemUgPSBzdGF0ZS5yYW5nZSgwKTsKLSAgICBRdWV1ZTxzdGQ6OnN0cmluZz4gcXVldWUobnVtX2RhdGFfdG9fc2VuZF8pOwotCi0gICAgLy8gcmVnaXN0ZXIgZGVxdWV1ZQotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBkZXF1ZXVlX3Byb21pc2U7Ci0gICAgYXV0byBkZXF1ZXVlX2Z1dHVyZSA9IGRlcXVldWVfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgVGVzdERlcXVldWVFbmQgdGVzdF9kZXF1ZXVlX2VuZChudW1fZGF0YV90b19zZW5kXywgJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfLCAmZGVxdWV1ZV9wcm9taXNlKTsKLSAgICB0ZXN0X2RlcXVldWVfZW5kLlJlZ2lzdGVyRGVxdWV1ZSgpOwotCi0gICAgLy8gUHVzaCBkYXRhIHRvIGVucXVldWUgZW5kIGJ1ZmZlciBhbmQgcmVnaXN0ZXIgZW5xdWV1ZQotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBlbnF1ZXVlX3Byb21pc2U7Ci0gICAgVGVzdEVucXVldWVFbmQgdGVzdF9lbnF1ZXVlX2VuZChudW1fZGF0YV90b19zZW5kXywgJnF1ZXVlLCBlbnF1ZXVlX2hhbmRsZXJfLCAmZW5xdWV1ZV9wcm9taXNlKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9kYXRhX3RvX3NlbmRfOyBpKyspIHsKLSAgICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSBzdGQ6OnN0cmluZyhwYWNrZXRfc2l6ZSwgJ3gnKTsKLSAgICAgIHRlc3RfZW5xdWV1ZV9lbmQucHVzaChzdGQ6Om1vdmUoZGF0YSkpOwotICAgIH0KLSAgICBkZXF1ZXVlX2Z1dHVyZS53YWl0KCk7Ci0gIH0KLQotICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChzdGF0aWNfY2FzdDxpbnRfZmFzdDY0X3Q+KHN0YXRlLml0ZXJhdGlvbnMoKSkgKiBzdGF0ZS5yYW5nZSgwKSAqIDEwMDAwKTsKLX07Ci0KLUJFTkNITUFSS19SRUdJU1RFUl9GKEJNX1F1ZXVlUGVyZm9ybWFuY2UsIHNlbmRfMTAwMDBfcGFja2V0X3ZhcnlfYnlfcGFja2V0X3NpemUpCi0gICAgLT5BcmcoMTApCi0gICAgLT5BcmcoMTAwKQotICAgIC0+QXJnKDEwMDApCi0gICAgLT5JdGVyYXRpb25zKDEwMCkKLSAgICAtPlVzZVJlYWxUaW1lKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvcmFuZC5oIGIvZ2Qvb3MvcmFuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzM4Yzc0Li4wMDAwMDAwCi0tLSBhL2dkL29zL3JhbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+Ci0KLSNpbmNsdWRlIDxhcnJheT4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi10ZW1wbGF0ZSA8c2l6ZV90IFNJWkU+Ci1zdGQ6OmFycmF5PHVpbnQ4X3QsIFNJWkU+IEdlbmVyYXRlUmFuZG9tKCkgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIFNJWkU+IHJldDsKLSAgQVNTRVJUKFJBTkRfYnl0ZXMocmV0LmRhdGEoKSwgcmV0LnNpemUoKSkgPT0gMSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWlubGluZSB1aW50MzJfdCBHZW5lcmF0ZVJhbmRvbSgpIHsKLSAgdWludDMyX3QgcmV0e307Ci0gIEFTU0VSVChSQU5EX2J5dGVzKCh1aW50OF90KikoJnJldCksIHNpemVvZih1aW50MzJfdCkpID09IDEpOwotICByZXR1cm4gcmV0OwotfQotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9vcy9yZWFjdG9yLmggYi9nZC9vcy9yZWFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWY0ZjUuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvcmVhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm9zL3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotLy8gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgcmVhY3Rvci1zdHlsZSBsb29wZXIuCi0vLyBXaGVuIGEgcmVhY3RvciBpcyBydW5uaW5nLCB0aGUgbWFpbiBsb29wIGlzIHBvbGxpbmcgYW5kIGJsb2NrZWQgdW50aWwgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgcmVhY3RhYmxlIGlzIHJlYWR5IHRvCi0vLyByZWFkIG9yIHdyaXRlLiBJdCB3aWxsIGludm9rZSBvbl9yZWFkX3JlYWR5KCkgb3Igb25fd3JpdGVfcmVhZHkoKSwgd2hpY2ggaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWFjdG9yLiBUaGVuLCBpdAotLy8gYmxvY2tzIGFnYWluIHVudGlsIHJlYWR5IGV2ZW50LgotY2xhc3MgUmVhY3RvciB7Ci0gcHVibGljOgotICAvLyBBbiBvYmplY3QgdXNlZCBmb3IgVW5yZWdpc3RlcigpIGFuZCBNb2RpZnlSZWdpc3RyYXRpb24oKQotICBjbGFzcyBSZWFjdGFibGU7Ci0KLSAgLy8gQ29uc3RydWN0IGEgcmVhY3RvciBvbiB0aGUgY3VycmVudCB0aHJlYWQKLSAgUmVhY3RvcigpOwotCi0gIC8vIERlc3RydWN0IHRoaXMgcmVhY3RvciBhbmQgcmVsZWFzZSBpdHMgcmVzb3VyY2VzCi0gIH5SZWFjdG9yKCk7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlYWN0b3IpOwotCi0gIC8vIFN0YXJ0IHRoZSByZWFjdG9yLiBUaGUgY3VycmVudCB0aHJlYWQgd2lsbCBiZSBibG9ja2VkIHVudGlsIFN0b3AoKSBpcyBpbnZva2VkIGFuZCBoYW5kbGVkLgotICB2b2lkIFJ1bigpOwotCi0gIC8vIFN0b3AgdGhlIHJlYWN0b3IuIE11c3QgYmUgaW52b2tlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZC4gTm90ZTogYWxsIHJlZ2lzdGVyZWQgcmVhY3RhYmxlcyB3aWxsIG5vdCBiZSB1bnJlZ2lzdGVyZWQKLSAgLy8gYnkgU3RvcCgpLiBJZiB0aGUgcmVhY3RvciBpcyBub3QgcnVubmluZywgaXQgd2lsbCBiZSBzdG9wcGVkIG9uY2UgaXQncyBzdGFydGVkLgotICB2b2lkIFN0b3AoKTsKLQotICAvLyBSZWdpc3RlciBhIHJlYWN0YWJsZSBmZCB0byB0aGlzIHJlYWN0b3IuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgUmVhY3RhYmxlLiBDYWxsZXIgbXVzdCB1c2UgdGhpcyBvYmplY3QgdG8KLSAgLy8gdW5yZWdpc3RlciBvciBtb2RpZnkgcmVnaXN0cmF0aW9uLiBPd25lcnNoaXAgb2YgdGhlIG1lbW9yeSBzcGFjZSBpcyBOT1QgdHJhbnNmZXJyZWQgdG8gdXNlci4KLSAgUmVhY3RhYmxlKiBSZWdpc3RlcihpbnQgZmQsIGNvbW1vbjo6Q2xvc3VyZSBvbl9yZWFkX3JlYWR5LCBjb21tb246OkNsb3N1cmUgb25fd3JpdGVfcmVhZHkpOwotCi0gIC8vIFVucmVnaXN0ZXIgYSByZWFjdGFibGUgZnJvbSB0aGlzIHJlYWN0b3IKLSAgdm9pZCBVbnJlZ2lzdGVyKFJlYWN0YWJsZSogcmVhY3RhYmxlKTsKLQotICAvLyBXYWl0IGZvciB1cCB0byB0aW1lb3V0IG1pbGxpc2Vjb25kcywgYW5kIHJldHVybiB0cnVlIGlmIHRoZSByZWFjdGFibGUgZmluaXNoZWQgZXhlY3V0aW5nLgotICBib29sIFdhaXRGb3JVbnJlZ2lzdGVyZWRSZWFjdGFibGUoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKLQotICAvLyBXYWl0IGZvciB1cCB0byB0aW1lb3V0IG1pbGxpc2Vjb25kcywgYW5kIHJldHVybiB0cnVlIGlmIHdlIHJlYWNoZWQgaWRsZS4KLSAgYm9vbCBXYWl0Rm9ySWRsZShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpOwotCi0gIC8vIE1vZGlmeSB0aGUgcmVnaXN0cmF0aW9uIGZvciBhIHJlYWN0YWJsZSB3aXRoIGdpdmVuIHJlYWN0YWJsZQotICB2b2lkIE1vZGlmeVJlZ2lzdHJhdGlvbihSZWFjdGFibGUqIHJlYWN0YWJsZSwgY29tbW9uOjpDbG9zdXJlIG9uX3JlYWRfcmVhZHksIGNvbW1vbjo6Q2xvc3VyZSBvbl93cml0ZV9yZWFkeSk7Ci0KLSBwcml2YXRlOgotICBtdXRhYmxlIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICBpbnQgZXBvbGxfZmRfOwotICBpbnQgY29udHJvbF9mZF87Ci0gIHN0ZDo6YXRvbWljPGJvb2w+IGlzX3J1bm5pbmdfOwotICBzdGQ6Omxpc3Q8UmVhY3RhYmxlKj4gaW52YWxpZGF0aW9uX2xpc3RfOwotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpmdXR1cmU8dm9pZD4+IGV4ZWN1dGluZ19yZWFjdGFibGVfZmluaXNoZWRfOwotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+PiBpZGxlX3Byb21pc2VfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG9zCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9vcy9yZXBlYXRpbmdfYWxhcm0uaCBiL2dkL29zL3JlcGVhdGluZ19hbGFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM3MTYyLi4wMDAwMDAwCi0tLSBhL2dkL29zL3JlcGVhdGluZ19hbGFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImNvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLSNpbmNsdWRlICJvcy91dGlscy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBvcyB7Ci0KLS8vIEEgcmVwZWF0aW5nIGFsYXJtIGZvciByZWFjdG9yLWJhc2VkIHRocmVhZCwgaW1wbGVtZW50ZWQgYnkgTGludXggdGltZXJmZC4KLS8vIFdoZW4gaXQncyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCByZWdpc3RlciBhIHJlYWN0YWJsZSBvbiB0aGUgc3BlY2lmaWVkIHRocmVhZDsgd2hlbiBpdCdzIGRlc3Ryb3llZCwgaXQgd2lsbCB1bnJlZ2lzdGVyCi0vLyBpdHNlbGYgZnJvbSB0aGUgdGhyZWFkLgotY2xhc3MgUmVwZWF0aW5nQWxhcm0gewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBhIHJlcGVhdGluZyBhbGFybSBvbiBhIGdpdmVuIGhhbmRsZXIKLSAgZXhwbGljaXQgUmVwZWF0aW5nQWxhcm0oSGFuZGxlciogaGFuZGxlcik7Ci0KLSAgLy8gVW5yZWdpc3RlciB0aGlzIGFsYXJtIGZyb20gdGhlIHRocmVhZCBhbmQgcmVsZWFzZSByZXNvdXJjZQotICB+UmVwZWF0aW5nQWxhcm0oKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVwZWF0aW5nQWxhcm0pOwotCi0gIC8vIFNjaGVkdWxlIGEgcmVwZWF0aW5nIGFsYXJtIHdpdGggZ2l2ZW4gcGVyaW9kCi0gIHZvaWQgU2NoZWR1bGUoY29tbW9uOjpDbG9zdXJlIHRhc2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgcGVyaW9kKTsKLQotICAvLyBDYW5jZWwgdGhlIGFsYXJtLiBOby1vcCBpZiBpdCdzIG5vdCBhcm1lZC4KLSAgdm9pZCBDYW5jZWwoKTsKLQotIHByaXZhdGU6Ci0gIGNvbW1vbjo6Q2xvc3VyZSB0YXNrXzsKLSAgSGFuZGxlciogaGFuZGxlcl87Ci0gIGludCBmZF8gPSAwOwotICBSZWFjdG9yOjpSZWFjdGFibGUqIHRva2VuXzsKLSAgbXV0YWJsZSBzdGQ6Om11dGV4IG11dGV4XzsKLSAgdm9pZCBvbl9maXJlKCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugb3MKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL29zL3N5c2xvZy5jYyBiL2dkL29zL3N5c2xvZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1NmVkYS4uMDAwMDAwMAotLS0gYS9nZC9vcy9zeXNsb2cuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZ2Qvb3Mvc3lzbG9nLmgiCi0KLSNpbmNsdWRlIDxzeXNsb2cuaD4KLQotI2luY2x1ZGUgPGNzdGRhcmc+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi1uYW1lc3BhY2UgewotI2RlZmluZSBTWVNMT0dfSURFTlQgImJ0YWRhcHRlcmQiCi0KLWNvbnN0IGNoYXIga1N5c2xvZ0lkZW50W10gPSBTWVNMT0dfSURFTlQ7Ci0KLS8vIE1hcCBMT0dfVEFHXyogdG8gc3lzbG9nIG1hcHBpbmdzCi1jb25zdCBpbnQga1RhZ01hcFtdID0gewotICAgIC8qTE9HX1RBR19WRVJCT1NFPSovTE9HX0RFQlVHLAotICAgIC8qTE9HX1RBR19ERUJVRz0qL0xPR19ERUJVRywKLSAgICAvKkxPR19UQUdfSU5GTz0qL0xPR19JTkZPLAotICAgIC8qTE9HX1RBR19XQVJOPSovTE9HX1dBUk5JTkcsCi0gICAgLypMT0dfVEFHX0VSUk9SPSovTE9HX0VSUiwKLSAgICAvKkxPR19UQUdfRkFUQUw9Ki9MT0dfQ1JJVCwKLX07Ci0KLXN0YXRpY19hc3NlcnQoc2l6ZW9mKGtUYWdNYXApIC8gc2l6ZW9mKGtUYWdNYXBbMF0pID09IExPR19UQUdfRkFUQUwgKyAxKTsKLQotY2xhc3MgU3lzbG9nV3JhcHBlciB7Ci0gcHVibGljOgotICBTeXNsb2dXcmFwcGVyKCkgewotICAgIG9wZW5sb2coa1N5c2xvZ0lkZW50LCBMT0dfQ09OUyB8IExPR19OREVMQVkgfCBMT0dfUElEIHwgTE9HX1BFUlJPUiwgTE9HX0RBRU1PTik7Ci0gIH0KLQotICB+U3lzbG9nV3JhcHBlcigpIHsKLSAgICBjbG9zZWxvZygpOwotICB9Ci19OwotCi1zdGQ6OnVuaXF1ZV9wdHI8U3lzbG9nV3JhcHBlcj4gZ1N5c2xvZzsKLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIHdyaXRlX3N5c2xvZyhpbnQgdGFnLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgewotICBpZiAoIWdTeXNsb2cpIHsKLSAgICBnU3lzbG9nID0gc3RkOjptYWtlX3VuaXF1ZTxTeXNsb2dXcmFwcGVyPigpOwotICB9Ci0KLSAgLy8gSSBkb24ndCBleHBlY3QgdG8gc2VlIGluY29ycmVjdCB0YWdzIGJ1dCBtYWtpbmcgdGhlIGNoZWNrIGFueXdheSBzbyB3ZQotICAvLyBkb24ndCBnbyBvdXQgb2YgYm91bmRzIGluIHRoZSBhcnJheSBhYm92ZS4KLSAgdGFnID0gdGFnIDw9IExPR19UQUdfRkFUQUwgPyB0YWcgOiBMT0dfVEFHX0VSUk9SOwotICBpbnQgbGV2ZWwgPSBrVGFnTWFwW3RhZ107Ci0KLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICB2c3lzbG9nKGxldmVsLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci19CmRpZmYgLS1naXQgYS9nZC9vcy9zeXNsb2cuaCBiL2dkL29zL3N5c2xvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmExODI1Li4wMDAwMDAwCi0tLSBhL2dkL29zL3N5c2xvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGFyZz4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0vKioKLSAqIFRoaXMgaGVhZGVyIGlzIHVzZWQgZm9yIHN5c3RlbXMgdGFyZ2V0aW5nIHN5c2xvZyBhcyB0aGVpciBsb2cgdGFyZ2V0IChpLmUuCi0gKiBGbG9zcyBidWlsZHMpLgotICovCi0KLS8qKgotICogV2Ugc2VwYXJhdGVseSBkZWZpbmUgdGhlc2UgdGFncyBhbmQgbWFwIHRoZW0gdG8gc3lzbG9nIGxldmVscyBiZWNhdXNlIHRoZQotICogbG9nIGhlYWRlcnMgcmUtZGVmaW5lIExPR19ERUJVRyBhbmQgTE9HX0lORk8gd2hpY2ggYXJlIGFscmVhZHkgZXhpc3RpbmcgaW4KLSAqIHRoZSBzeXNsb2cgaGVhZGVyLiBBbHNvLCBMT0dfVEFHX1ZFUkJPU0UgZG9lc24ndCBhY3R1YWxseSBleGlzdCBpbiBzeXNsb2cKLSAqIGRlZmluaXRpb25zIGFuZCBuZWVkcyB0byBiZSBtYXBwZWQgdG8gYW5vdGhlciBsb2cgbGV2ZWwuCi0gKi8KLWNvbnN0ZXhwciB1aW50MzJfdCBMT0dfVEFHX1ZFUkJPU0UgPSAweDA7Ci1jb25zdGV4cHIgdWludDMyX3QgTE9HX1RBR19ERUJVRyA9IDB4MTsKLWNvbnN0ZXhwciB1aW50MzJfdCBMT0dfVEFHX0lORk8gPSAweDI7Ci1jb25zdGV4cHIgdWludDMyX3QgTE9HX1RBR19XQVJOID0gMHgzOwotY29uc3RleHByIHVpbnQzMl90IExPR19UQUdfRVJST1IgPSAweDQ7Ci1jb25zdGV4cHIgdWludDMyX3QgTE9HX1RBR19GQVRBTCA9IDB4NTsKLQotLyoqCi0gKiBXcml0ZSBsb2cgdG8gc3lzbG9nLgotICovCi12b2lkIHdyaXRlX3N5c2xvZyhpbnQgdGFnLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CmRpZmYgLS1naXQgYS9nZC9vcy9zeXN0ZW1fcHJvcGVydGllcy5oIGIvZ2Qvb3Mvc3lzdGVtX3Byb3BlcnRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhODJiOC4uMDAwMDAwMAotLS0gYS9nZC9vcy9zeXN0ZW1fcHJvcGVydGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLQotLy8gR2V0IHxwcm9wZXJ0eXwga2V5ZWQgc3lzdGVtIHByb3BlcnR5IGZyb20gc3VwcG9ydGVkIHBsYXRmb3JtLCByZXR1cm4gc3RkOjpudWxsb3B0IGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdAotLy8gb3IgaWYgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgc3lzdGVtIHByb3BlcnR5Ci1zdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBHZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpOwotCi0vLyBTZXQgfHByb3BlcnR5fCBrZXllZCBzeXN0ZW0gcHJvcGVydHkgdG8gfHZhbHVlfCwgcmV0dXJuIHRydWUgaWYgdGhlIHNldCB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2UgaWYgdGhlIHNldCBmYWlsZWQKLS8vIFJlcGxhY2UgZXhpc3RpbmcgdmFsdWUgaWYgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMKLWJvb2wgU2V0U3lzdGVtUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotCi0vLyBDbGVhciBzeXN0ZW0gcHJvcGVydGllcyBmb3IgaG9zdCBvbmx5Ci12b2lkIENsZWFyU3lzdGVtUHJvcGVydGllc0Zvckhvc3QoKTsKLQotLy8gQ2hlY2sgaWYgdGhlIHZlbmRvciBpbWFnZSBpcyB1c2luZyByb290IGNhbmFsIHNpbXVsYXRlZCBCbHVldG9vdGggc3RhY2sKLWJvb2wgSXNSb290Q2FuYWxFbmFibGVkKCk7Ci0KLS8vIEdldCBBbmRyb2lkIFZlbmRvciBJbWFnZSByZWxlYXNlIHZlcnNpb24gaW4gbnVtZXJpYyB2YWx1ZSAoZS5nLiBBbmRyb2lkIFIgaXMgMTEpLCByZXR1cm4gMCBpZiBub3Qgb24gQW5kcm9pZCBvcgotLy8gdmVyc2lvbiBub3QgYXZhaWxhYmxlCi1pbnQgR2V0QW5kcm9pZFZlbmRvclJlbGVhc2VWZXJzaW9uKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL29zL3RocmVhZC5oIGIvZ2Qvb3MvdGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGQ3NWUuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvdGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJvcy9yZWFjdG9yLmgiCi0jaW5jbHVkZSAib3MvdXRpbHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi0vLyBSZWFjdG9yLWJhc2VkIGxvb3BlciB0aHJlYWQgaW1wbGVtZW50YXRpb24uIFRoZSB0aHJlYWQgcnVucyBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyBjb25zdHJ1Y3RlZCwgYW5kIHN0b3BzIGFmdGVyCi0vLyBTdG9wKCkgaXMgaW52b2tlZC4gVG8gYXNzaWduIHRhc2sgdG8gdGhpcyB0aHJlYWQsIHVzZXIgbmVlZHMgdG8gcmVnaXN0ZXIgYSByZWFjdGFibGUgb2JqZWN0IHRvIHRoZSB1bmRlcmx5aW5nCi0vLyByZWFjdG9yLgotY2xhc3MgVGhyZWFkIHsKLSBwdWJsaWM6Ci0gIC8vIFVzZWQgYnkgdGhyZWFkIGNvbnN0cnVjdG9yLiBTdWdnZXN0IHRoZSBwcmlvcml0eSB0byB0aGUga2VybmVsIHNjaGVkdWxlci4gVXNlIFJFQUxfVElNRSBpZiB3ZSBuZWVkIChzb2Z0KSByZWFsLXRpbWUKLSAgLy8gc2NoZWR1bGluZyBndWFyYW50ZWUgZm9yIHRoaXMgdGhyZWFkOyB1c2UgTk9STUFMIGlmIG5vIHJlYWwtdGltZSBndWFyYW50ZWUgaXMgbmVlZGVkIHRvIHNhdmUgQ1BVIHRpbWUgc2xpY2UgZm9yCi0gIC8vIG90aGVyIHRocmVhZHMKLSAgZW51bSBjbGFzcyBQcmlvcml0eSB7Ci0gICAgUkVBTF9USU1FLAotICAgIE5PUk1BTCwKLSAgfTsKLQotICAvLyBuYW1lOiB0aHJlYWQgbmFtZSBmb3IgUE9TSVggc3lzdGVtcwotICAvLyBwcmlvcml0eTogcHJpb3JpdHkgZm9yIGtlcm5lbCBzY2hlZHVsZXIKLSAgVGhyZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQcmlvcml0eSBwcmlvcml0eSk7Ci0KLSAgLy8gU3RvcCBhbmQgZGVzdHJveSB0aGlzIHRocmVhZAotICB+VGhyZWFkKCk7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRocmVhZCk7Ci0KLSAgLy8gU3RvcCB0aGlzIHRocmVhZC4gTXVzdCBiZSBpbnZva2VkIGZyb20gYW5vdGhlciB0aHJlYWQuIEFmdGVyIHRoaXMgdGhyZWFkIGlzIHN0b3BwZWQsIGl0IGNhbm5vdCBiZSBzdGFydGVkIGFnYWluLgotICBib29sIFN0b3AoKTsKLQotICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSB0aGlzIHRocmVhZAotICBib29sIElzU2FtZVRocmVhZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybiB0aGUgUE9TSVggdGhyZWFkIG5hbWUKLSAgc3RkOjpzdHJpbmcgR2V0VGhyZWFkTmFtZSgpIGNvbnN0OwotCi0gIC8vIFJldHVybiBhIHVzZXItZnJpZW5kbHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdGhyZWFkIG9iamVjdAotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotCi0gIC8vIFJldHVybiB0aGUgcG9pbnRlciBvZiB1bmRlcmx5aW5nIHJlYWN0b3IuIFRoZSBvd25lcnNoaXAgaXMgTk9UIHRyYW5zZmVycmVkLgotICBSZWFjdG9yKiBHZXRSZWFjdG9yKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB2b2lkIHJ1bihQcmlvcml0eSBwcmlvcml0eSk7Ci0gIG11dGFibGUgc3RkOjptdXRleCBtdXRleF87Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOwotICBtdXRhYmxlIFJlYWN0b3IgcmVhY3Rvcl87Ci0gIHN0ZDo6dGhyZWFkIHJ1bm5pbmdfdGhyZWFkXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvb3MvdGhyZWFkX2JlbmNobWFyay5jYyBiL2dkL29zL3RocmVhZF9iZW5jaG1hcmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGUxNDAuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvdGhyZWFkX2JlbmNobWFyay5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLXVzaW5nIDo6YmVuY2htYXJrOjpTdGF0ZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpjb21tb246OkJpbmRPbmNlOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpUaHJlYWQ7Ci0KLSNkZWZpbmUgTlVNX01FU1NBR0VTX1RPX1NFTkQgMTAwMDAwCi0KLWNsYXNzIEJNX1RocmVhZFBlcmZvcm1hbmNlIDogcHVibGljIDo6YmVuY2htYXJrOjpGaXh0dXJlIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoU3RhdGUmIHN0KSBvdmVycmlkZSB7Ci0gICAgYmVuY2htYXJrOjpGaXh0dXJlOjpTZXRVcChzdCk7Ci0gICAgY291bnRlcl9wcm9taXNlXyA9IHN0ZDo6cHJvbWlzZTx2b2lkPigpOwotICAgIGNvdW50ZXJfID0gMDsKLSAgfQotICB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgb3ZlcnJpZGUgewotICAgIGJlbmNobWFyazo6Rml4dHVyZTo6VGVhckRvd24oc3QpOwotICB9Ci0gIHZvaWQgY2FsbGJhY2tfYmF0Y2goKSB7Ci0gICAgY291bnRlcl8rKzsKLSAgICBpZiAoY291bnRlcl8gPj0gbnVtX21lc3NhZ2VzX3RvX3NlbmRfKSB7Ci0gICAgICBjb3VudGVyX3Byb21pc2VfLnNldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgY2FsbGJhY2soKSB7Ci0gICAgY291bnRlcl9wcm9taXNlXy5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIGludDY0X3QgbnVtX21lc3NhZ2VzX3RvX3NlbmRfOwotICBpbnQ2NF90IGNvdW50ZXJfOwotICBzdGQ6OnByb21pc2U8dm9pZD4gY291bnRlcl9wcm9taXNlXzsKLX07Ci0KLWNsYXNzIEJNX1JlYWN0b3JUaHJlYWQgOiBwdWJsaWMgQk1fVGhyZWFkUGVyZm9ybWFuY2UgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBCTV9UaHJlYWRQZXJmb3JtYW5jZTo6U2V0VXAoc3QpOwotICAgIHRocmVhZF8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRocmVhZD4oIkJNX1JlYWN0b3JUaHJlYWQgdGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8SGFuZGxlcj4odGhyZWFkXy5nZXQoKSk7Ci0gIH0KLSAgdm9pZCBUZWFyRG93bihTdGF0ZSYgc3QpIG92ZXJyaWRlIHsKLSAgICBoYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgdGhyZWFkXy0+U3RvcCgpOwotICAgIHRocmVhZF8gPSBudWxscHRyOwotICAgIEJNX1RocmVhZFBlcmZvcm1hbmNlOjpUZWFyRG93bihzdCk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfcHRyPFRocmVhZD4gdGhyZWFkXzsKLSAgc3RkOjp1bmlxdWVfcHRyPEhhbmRsZXI+IGhhbmRsZXJfOwotfTsKLQotQkVOQ0hNQVJLX0RFRklORV9GKEJNX1JlYWN0b3JUaHJlYWQsIGJhdGNoX2VucXVlX2RlcXVldWUpKFN0YXRlJiBzdGF0ZSkgewotICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7Ci0gICAgbnVtX21lc3NhZ2VzX3RvX3NlbmRfID0gc3RhdGUucmFuZ2UoMCk7Ci0gICAgY291bnRlcl8gPSAwOwotICAgIGNvdW50ZXJfcHJvbWlzZV8gPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBjb3VudGVyX2Z1dHVyZSA9IGNvdW50ZXJfcHJvbWlzZV8uZ2V0X2Z1dHVyZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX21lc3NhZ2VzX3RvX3NlbmRfOyBpKyspIHsKLSAgICAgIGhhbmRsZXJfLT5Qb3N0KEJpbmRPbmNlKAotICAgICAgICAgICZCTV9SZWFjdG9yVGhyZWFkX2JhdGNoX2VucXVlX2RlcXVldWVfQmVuY2htYXJrOjpjYWxsYmFja19iYXRjaCwgYmx1ZXRvb3RoOjpjb21tb246OlVucmV0YWluZWQodGhpcykpKTsKLSAgICB9Ci0gICAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotICB9Ci19OwotCi1CRU5DSE1BUktfUkVHSVNURVJfRihCTV9SZWFjdG9yVGhyZWFkLCBiYXRjaF9lbnF1ZV9kZXF1ZXVlKQotICAgIC0+QXJnKDEwKQotICAgIC0+QXJnKDEwMDApCi0gICAgLT5BcmcoMTAwMDApCi0gICAgLT5BcmcoMTAwMDAwKQotICAgIC0+SXRlcmF0aW9ucygxKQotICAgIC0+VXNlUmVhbFRpbWUoKTsKLQotQkVOQ0hNQVJLX0RFRklORV9GKEJNX1JlYWN0b3JUaHJlYWQsIHNlcXVlbnRpYWxfZXhlY3V0aW9uKShTdGF0ZSYgc3RhdGUpIHsKLSAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgewotICAgIG51bV9tZXNzYWdlc190b19zZW5kXyA9IHN0YXRlLnJhbmdlKDApOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX21lc3NhZ2VzX3RvX3NlbmRfOyBpKyspIHsKLSAgICAgIGNvdW50ZXJfcHJvbWlzZV8gPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IGNvdW50ZXJfZnV0dXJlID0gY291bnRlcl9wcm9taXNlXy5nZXRfZnV0dXJlKCk7Ci0gICAgICBoYW5kbGVyXy0+UG9zdCgKLSAgICAgICAgICBCaW5kT25jZSgmQk1fUmVhY3RvclRocmVhZF9zZXF1ZW50aWFsX2V4ZWN1dGlvbl9CZW5jaG1hcms6OmNhbGxiYWNrLCBibHVldG9vdGg6OmNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgICAgY291bnRlcl9mdXR1cmUud2FpdCgpOwotICAgIH0KLSAgfQotfTsKLQotQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQk1fUmVhY3RvclRocmVhZCwgc2VxdWVudGlhbF9leGVjdXRpb24pCi0gICAgLT5BcmcoMTApCi0gICAgLT5BcmcoMTAwMCkKLSAgICAtPkFyZygxMDAwMCkKLSAgICAtPkFyZygxMDAwMDApCi0gICAgLT5JdGVyYXRpb25zKDEpCi0gICAgLT5Vc2VSZWFsVGltZSgpOwpkaWZmIC0tZ2l0IGEvZ2Qvb3MvdXRpbHMuaCBiL2dkL29zL3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZmNhNjYuLjAwMDAwMDAKLS0tIGEvZ2Qvb3MvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLS8vIEEgbWFjcm8gdG8gcmUtdHJ5IGEgc3lzY2FsbCB3aGVuIGl0IHJlY2VpdmVzIEVJTlRSCi0jaWZuZGVmIFJVTl9OT19JTlRSCi0jZGVmaW5lIFJVTl9OT19JTlRSKGZuKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKChmbikgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0jZW5kaWYKLQotLy8gQSBtYWNybyB0byBkaXNhbGxvdyB0aGUgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9IGZ1bmN0aW9ucwotI2lmbmRlZiBESVNBTExPV19DT1BZX0FORF9BU1NJR04KLSNkZWZpbmUgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFR5cGVOYW1lKSBcCi0gIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgXAotICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dkL29zL3dha2Vsb2NrX21hbmFnZXIuZmJzIGIvZ2Qvb3Mvd2FrZWxvY2tfbWFuYWdlci5mYnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODVlMjguLjAwMDAwMDAKLS0tIGEvZ2Qvb3Mvd2FrZWxvY2tfbWFuYWdlci5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0KLW5hbWVzcGFjZSBibHVldG9vdGgub3M7Ci0KLWF0dHJpYnV0ZSAicHJpdmFjeSI7Ci0KLXRhYmxlIFdha2Vsb2NrTWFuYWdlckRhdGEgewotICAgIHRpdGxlOnN0cmluZzsKLSAgICBpc19hY3F1aXJlZDpib29sOwotICAgIGlzX25hdGl2ZTpib29sOwotICAgIGFjcXVpcmVkX2NvdW50OmludDsKLSAgICByZWxlYXNlZF9jb3VudDppbnQ7Ci0gICAgYWNxdWlyZWRfZXJyb3JfY291bnQ6aW50OwotICAgIHJlbGVhc2VkX2Vycm9yX2NvdW50OmludDsKLSAgICBsYXN0X2FjcXVpcmVfZXJyb3JfY29kZTppbnQ7Ci0gICAgbGFzdF9yZWxlYXNlX2Vycm9yX2NvZGU6aW50OwotICAgIGxhc3RfYWNxdWlyZWRfdGltZXN0YW1wX21pbGxpczppbnQ2NDsKLSAgICBsYXN0X3JlbGVhc2VkX3RpbWVzdGFtcF9taWxsaXM6aW50NjQ7Ci0gICAgbGFzdF9pbnRlcnZhbF9taWxsaXM6aW50NjQ7Ci0gICAgbWF4X2ludGVydmFsX21pbGxpczppbnQ2NDsKLSAgICBtaW5faW50ZXJ2YWxfbWlsbGlzOmludDY0OwotICAgIGF2Z19pbnRlcnZhbF9taWxsaXM6aW50NjQ7Ci0gICAgdG90YWxfaW50ZXJ2YWxfbWlsbGlzOmludDY0OwotICAgIHRvdGFsX3RpbWVfc2luY2VfcmVzZXRfbWlsbGlzOmludDY0OwotfQotCi1yb290X3R5cGUgV2FrZWxvY2tNYW5hZ2VyRGF0YTsKZGlmZiAtLWdpdCBhL2dkL29zL3dha2Vsb2NrX21hbmFnZXIuaCBiL2dkL29zL3dha2Vsb2NrX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2NDVjMy4uMDAwMDAwMAotLS0gYS9nZC9vcy93YWtlbG9ja19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmg+Ci0KLSNpbmNsdWRlICJoYW5kbGVyLmgiCi0jaW5jbHVkZSAid2FrZWxvY2tfbWFuYWdlcl9nZW5lcmF0ZWQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugb3MgewotCi1jbGFzcyBXYWtlbG9ja01hbmFnZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtCdFdha2Vsb2NrSWQ7Ci0KLSAgc3RhdGljIFdha2Vsb2NrTWFuYWdlciYgR2V0KCkgewotICAgIHN0YXRpYyBXYWtlbG9ja01hbmFnZXIgaW5zdGFuY2U7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLy8gVGhlIHNldCBvZiBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgR0QgdG8gZ3JhYiB3YWtlIGxvY2tzLiBBIGNhbGxlciB3aXRoIGEgY3VzdG9tIHdha2Vsb2NrIGltcGxlbWVudGF0aW9uIHNob3VsZAotICAvLyBpbXBsZW1lbnQgdGhpcyBjbGFzcyBhbmQgcGFzc2VkIGludG8gdGhlIHN0YWNrIHRocm91Z2ggU2V0Q2FsbG91dHMoKQotICBjbGFzcyBPc0NhbGxvdXRzIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5Pc0NhbGxvdXRzKCkgPSBkZWZhdWx0OwotICAgIHZpcnR1YWwgdm9pZCBBY3F1aXJlQ2FsbG91dChjb25zdCBzdGQ6OnN0cmluZyYgbG9ja19uYW1lKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFJlbGVhc2VDYWxsb3V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NrX25hbWUpID0gMDsKLSAgfTsKLQotICAvLyBTZXQgdGhlIEJsdWV0b290aCBPUyBjYWxsb3V0cyB0byB8Y2FsbG91dHN8LgotICAvLwotICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBuYXRpdmUga2VybmVsIHdha2Vsb2NrIGFyZSBub3QgdXNlZCBkaXJlY3RseS4KLSAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLCBvciB8Y2FsbG91dHN8IGlzIG51bGxwdHIsIHRoZW4gbmF0aXZlIGtlcm5lbCB3YWtlbG9jayB3aWxsIGJlIHVzZWQuCi0gIC8vIFdoZW4gfGNhbGxvdXRzfCBhcmUgdXNlZCwgdGhlIGNhbGxiYWNrcyBhcmUgZ29pbmcgdG8gYmUgaW52b2tlZCBhc3luY2hyb25vdXNseSB0byBhdm9pZCBiZWluZyBibG9ja2VkIGJ5IHVwcGVyCi0gIC8vIGxheWVyIGRlbGF5cy4gVGhlcmVmb3JlLCBhIGhhbmRsZXIgaXMgbmVlZGVkIGFuZCB0aGUgY2FsbG91dCByZXN1bHQgd2lsbCBiZSBpZ25vcmVkLgotICAvLwotICAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBBY3F1aXJlKCkgb3IgUmVsZWFzZSgpCi0gIHZvaWQgU2V0T3NDYWxsb3V0cyhPc0NhbGxvdXRzKiBjYWxsb3V0cywgSGFuZGxlciogaGFuZGxlcik7Ci0KLSAgLy8gQWNxdWlyZSB0aGUgQmx1ZXRvb3RoIHdha2Vsb2NrLgotICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gIC8vIFRoZSBmdW5jdGlvbiBpcyB0aHJlYWQgc2FmZS4KLSAgYm9vbCBBY3F1aXJlKCk7Ci0KLSAgLy8gUmVsZWFzZSB0aGUgQmx1ZXRvb3RoIHdha2Vsb2NrLgotICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gIC8vIFRoZSBmdW5jdGlvbiBpcyB0aHJlYWQgc2FmZS4KLSAgYm9vbCBSZWxlYXNlKCk7Ci0KLSAgLy8gQ2xlYW51cCB0aGUgd2FrZWxvY2sgaW50ZXJuYWwgcnVudGltZSBzdGF0ZS4KLSAgLy8gVGhpcyB3aWxsIE5PVCBjbGVhbiB1cCB0aGUgY2FsbG91dHMKLSAgdm9pZCBDbGVhblVwKCk7Ci0KLSAgLy8gRHVtcCB3YWtlbG9jay1yZWxhdGVkIGRlYnVnIGluZm8gdG8gYSBmbGF0IGJ1ZmZlciBkZWZpbmVkIGluIHdha2Vsb2NrX21hbmFnZXIuZmJzCi0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2FrZWxvY2tNYW5hZ2VyRGF0YT4gR2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKTsKLQotICB+V2FrZWxvY2tNYW5hZ2VyKCk7Ci0KLSBwcml2YXRlOgotICBXYWtlbG9ja01hbmFnZXIoKTsKLQotICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBtdXRleF87Ci0gIGJvb2wgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gIE9zQ2FsbG91dHMqIG9zX2NhbGxvdXRzXyA9IG51bGxwdHI7Ci0gIEhhbmRsZXIqIG9zX2NhbGxvdXRzX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgYm9vbCBpc19uYXRpdmVfID0gdHJ1ZTsKLQotICBzdHJ1Y3QgU3RhdHM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTdGF0cz4gcHN0YXRzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBvcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L0FuZHJvaWQuYnAgYi9nZC9wYWNrZXQvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwNTkyYy4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFBhY2tldFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJpdF9pbnNlcnRlci5jYyIsCi0gICAgICAgICJieXRlX2luc2VydGVyLmNjIiwKLSAgICAgICAgImJ5dGVfb2JzZXJ2ZXIuY2MiLAotICAgICAgICAiaXRlcmF0b3IuY2MiLAotICAgICAgICAiZnJhZ21lbnRpbmdfaW5zZXJ0ZXIuY2MiLAotICAgICAgICAicGFja2V0X3ZpZXcuY2MiLAotICAgICAgICAicmF3X2J1aWxkZXIuY2MiLAotICAgICAgICAidmlldy5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoUGFja2V0VGVzdFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJpdF9pbnNlcnRlcl91bml0dGVzdC5jYyIsCi0gICAgICAgICJmcmFnbWVudGluZ19pbnNlcnRlcl91bml0dGVzdC5jYyIsCi0gICAgICAgICJwYWNrZXRfYnVpbGRlcl91bml0dGVzdC5jYyIsCi0gICAgICAgICJwYWNrZXRfdmlld191bml0dGVzdC5jYyIsCi0gICAgICAgICJyYXdfYnVpbGRlcl91bml0dGVzdC5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9CVUlMRC5nbiBiL2dkL3BhY2tldC9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3ODZiNy4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUKLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc291cmNlX3NldCgiQmx1ZXRvb3RoUGFja2V0U291cmNlcyIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiYml0X2luc2VydGVyLmNjIiwKLSAgICAiYnl0ZV9pbnNlcnRlci5jYyIsCi0gICAgImJ5dGVfb2JzZXJ2ZXIuY2MiLAotICAgICJmcmFnbWVudGluZ19pbnNlcnRlci5jYyIsCi0gICAgIml0ZXJhdG9yLmNjIiwKLSAgICAicGFja2V0X3ZpZXcuY2MiLAotICAgICJyYXdfYnVpbGRlci5jYyIsCi0gICAgInZpZXcuY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWyAiLy9idC9nZCIgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idDp0YXJnZXRfZGVmYXVsdHMiIF0KLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9iYXNlX3BhY2tldF9idWlsZGVyLmggYi9nZC9wYWNrZXQvYmFzZV9wYWNrZXRfYnVpbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI0ZGMxLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9iYXNlX3BhY2tldF9idWlsZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLS8vIEEgbGl0dGxlLWVuZGlhbiBQYWNrZXRCdWlsZGVyIGNhbiBjb250YWluIGEgYmlnLWVuZGlhbiBQYWNrZXRCdWlsZGVyLAotLy8gc28gQmFzZVBhY2tldEJ1aWxkZXIgcHJvdmlkZXMgYSBjb21tb24gYmFzZSBjbGFzcy4KLWNsYXNzIEJhc2VQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkJhc2VQYWNrZXRCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7Ci0KLSAgLy8gV3JpdGUgdG8gdGhlIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBpdGVyYXRvci4KLSAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShCaXRJbnNlcnRlciYgaXQpIGNvbnN0ID0gMDsKLQotICB2b2lkIFNldEZsdXNoYWJsZShib29sIGlzX2ZsdXNoYWJsZSkgewotICAgIGlzX2ZsdXNoYWJsZV8gPSBpc19mbHVzaGFibGU7Ci0gIH0KLSAgYm9vbCBJc0ZsdXNoYWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNfZmx1c2hhYmxlXzsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBCYXNlUGFja2V0QnVpbGRlcigpID0gZGVmYXVsdDsKLQotIHByaXZhdGU6Ci0gIGJvb2wgaXNfZmx1c2hhYmxlX3tmYWxzZX07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvYmFzZV9zdHJ1Y3QuaCBiL2dkL3BhY2tldC9iYXNlX3N0cnVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTgzMjI5Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9iYXNlX3N0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAicGFja2V0L2JpdF9pbnNlcnRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi0vLyBBIGJhc2Ugc3RydWN0IHRvIHByb3ZpZGUgU2VyaWFsaXplKCkgYW5kIHNpemUoKSB0byBiZSBvdmVycmlkZGVuLgotY2xhc3MgQmFzZVN0cnVjdCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5CYXNlU3RydWN0KCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7Ci0KLSAgLy8gV3JpdGUgdG8gdGhlIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBpdGVyYXRvci4KLSAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShCaXRJbnNlcnRlciYgaXQpIGNvbnN0ID0gMDsKLQotIHByb3RlY3RlZDoKLSAgQmFzZVN0cnVjdCgpID0gZGVmYXVsdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9iaXRfaW5zZXJ0ZXIuY2MgYi9nZC9wYWNrZXQvYml0X2luc2VydGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThmMmJjLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9iaXRfaW5zZXJ0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicGFja2V0L2JpdF9pbnNlcnRlci5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLUJpdEluc2VydGVyOjpCaXRJbnNlcnRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjdG9yKSA6IEJ5dGVJbnNlcnRlcih2ZWN0b3IpIHt9Ci0KLUJpdEluc2VydGVyOjp+Qml0SW5zZXJ0ZXIoKSB7Ci0gIEFTU0VSVChudW1fc2F2ZWRfYml0c18gPT0gMCk7Ci19Ci0KLXZvaWQgQml0SW5zZXJ0ZXI6Omluc2VydF9iaXRzKHVpbnQ4X3QgYnl0ZSwgc2l6ZV90IG51bV9iaXRzKSB7Ci0gIHNpemVfdCB0b3RhbF9iaXRzID0gbnVtX2JpdHMgKyBudW1fc2F2ZWRfYml0c187Ci0gIHVpbnQxNl90IG5ld192YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNhdmVkX2JpdHNfKSB8IChzdGF0aWNfY2FzdDx1aW50MTZfdD4oYnl0ZSkgPDwgbnVtX3NhdmVkX2JpdHNfKTsKLSAgaWYgKHRvdGFsX2JpdHMgPj0gOCkgewotICAgIEJ5dGVJbnNlcnRlcjo6aW5zZXJ0X2J5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3X3ZhbHVlKSk7Ci0gICAgdG90YWxfYml0cyAtPSA4OwotICAgIG5ld192YWx1ZSA9IG5ld192YWx1ZSA+PiA4OwotICB9Ci0gIG51bV9zYXZlZF9iaXRzXyA9IHRvdGFsX2JpdHM7Ci0gIHVpbnQ4X3QgbWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4ZmYpID4+ICg4IC0gbnVtX3NhdmVkX2JpdHNfKTsKLSAgc2F2ZWRfYml0c18gPSBzdGF0aWNfY2FzdDx1aW50OF90PihuZXdfdmFsdWUpICYgbWFzazsKLX0KLQotdm9pZCBCaXRJbnNlcnRlcjo6aW5zZXJ0X2J5dGUodWludDhfdCBieXRlKSB7Ci0gIGluc2VydF9iaXRzKGJ5dGUsIDgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvYml0X2luc2VydGVyLmggYi9nZC9wYWNrZXQvYml0X2luc2VydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDg0MDguLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L2JpdF9pbnNlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJwYWNrZXQvYnl0ZV9pbnNlcnRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi1jbGFzcyBCaXRJbnNlcnRlciA6IHB1YmxpYyBCeXRlSW5zZXJ0ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQml0SW5zZXJ0ZXIoc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZlY3Rvcik7Ci0gIH5CaXRJbnNlcnRlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBpbnNlcnRfYml0cyh1aW50OF90IGJ5dGUsIHNpemVfdCBudW1fYml0cyk7Ci0KLSAgdm9pZCBpbnNlcnRfYnl0ZSh1aW50OF90IGJ5dGUpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBzaXplX3QgbnVtX3NhdmVkX2JpdHNfezB9OwotICB1aW50OF90IHNhdmVkX2JpdHNfezB9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L2JpdF9pbnNlcnRlcl91bml0dGVzdC5jYyBiL2dkL3BhY2tldC9iaXRfaW5zZXJ0ZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTE5ZjguLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L2JpdF9pbnNlcnRlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyBibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLQotVEVTVChCaXRJbnNlcnRlclRlc3QsIGFkZE1vcmVCaXRzKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzOwotICBCaXRJbnNlcnRlciBpdChieXRlcyk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA5OyBpKyspIHsKLSAgICBpdC5pbnNlcnRfYml0cyhzdGF0aWNfY2FzdDx1aW50OF90PihpKSwgaSk7Ci0gIH0KLSAgaXQuaW5zZXJ0X2JpdHMoc3RhdGljX2Nhc3Q8dWludDhfdD4oMGIxMDEwKSwgNCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdCA9IHswYjAwMDExMTAxIC8qIDMgMiAxICovLCAwYjAwMDEwMTAxIC8qIDUgNCAqLywgMGIxMTEwMDAxMSAvKiA3IDYgKi8sIDBiMTAwMDAwMDAgLyogOCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBiMTAxMDAwMDAgLyogZmlsbGVkIHdpdGggMTAxMCAqL307Ci0KLSAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIGJ5dGVzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocmVzdWx0W2ldLCBieXRlc1tpXSk7Ci0gIH0KLX0KLQotVEVTVChCaXRJbnNlcnRlclRlc3QsIG9ic2VydmVyVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlczsKLSAgQml0SW5zZXJ0ZXIgaXQoYnl0ZXMpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb3B5OwotCi0gIHVpbnQ2NF90IGNoZWNrc3VtID0gMHgwMTIzNDU2Nzg5YWJjZGVmOwotICBpdC5SZWdpc3Rlck9ic2VydmVyKEJ5dGVPYnNlcnZlcihbJmNvcHldKHVpbnQ4X3QgYnl0ZSkgeyBjb3B5LnB1c2hfYmFjayhieXRlKTsgfSwgW2NoZWNrc3VtXSgpIHsgcmV0dXJuIGNoZWNrc3VtOyB9KSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA5OyBpKyspIHsKLSAgICBpdC5pbnNlcnRfYml0cyhzdGF0aWNfY2FzdDx1aW50OF90PihpKSwgaSk7Ci0gIH0KLSAgaXQuaW5zZXJ0X2JpdHMoc3RhdGljX2Nhc3Q8dWludDhfdD4oMGIxMDEwKSwgNCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdCA9IHswYjAwMDExMTAxIC8qIDMgMiAxICovLCAwYjAwMDEwMTAxIC8qIDUgNCAqLywgMGIxMTEwMDAxMSAvKiA3IDYgKi8sIDBiMTAwMDAwMDAgLyogOCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBiMTAxMDAwMDAgLyogZmlsbGVkIHdpdGggMTAxMCAqL307Ci0KLSAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIGJ5dGVzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocmVzdWx0W2ldLCBieXRlc1tpXSk7Ci0gIH0KLQotICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgY29weS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvcHkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocmVzdWx0W2ldLCBjb3B5W2ldKTsKLSAgfQotCi0gIEJ5dGVPYnNlcnZlciBvYnNlcnZlciA9IGl0LlVucmVnaXN0ZXJPYnNlcnZlcigpOwotICBBU1NFUlRfRVEoY2hlY2tzdW0sIG9ic2VydmVyLkdldFZhbHVlKCkpOwotICB1aW50OF90IGFub3RoZXJfYnl0ZSA9IDB4ZWY7Ci0gIGl0Lmluc2VydF9iaXRzKGFub3RoZXJfYnl0ZSwgOCk7Ci0gIEFTU0VSVF9FUShieXRlcy5iYWNrKCksIGFub3RoZXJfYnl0ZSk7Ci0gIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpICsgMSwgYnl0ZXMuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIGNvcHkuc2l6ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L2J5dGVfaW5zZXJ0ZXIuY2MgYi9nZC9wYWNrZXQvYnl0ZV9pbnNlcnRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MjQyNy4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvYnl0ZV9pbnNlcnRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXQvYnl0ZV9pbnNlcnRlci5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLUJ5dGVJbnNlcnRlcjo6Qnl0ZUluc2VydGVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIDogc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4odmVjdG9yKSB7fQotCi1CeXRlSW5zZXJ0ZXI6On5CeXRlSW5zZXJ0ZXIoKSB7Ci0gIEFTU0VSVChyZWdpc3RlcmVkX29ic2VydmVyc18uZW1wdHkoKSk7Ci19Ci0KLXZvaWQgQnl0ZUluc2VydGVyOjpSZWdpc3Rlck9ic2VydmVyKGNvbnN0IEJ5dGVPYnNlcnZlciYgb2JzZXJ2ZXIpIHsKLSAgcmVnaXN0ZXJlZF9vYnNlcnZlcnNfLnB1c2hfYmFjayhvYnNlcnZlcik7Ci19Ci0KLUJ5dGVPYnNlcnZlciBCeXRlSW5zZXJ0ZXI6OlVucmVnaXN0ZXJPYnNlcnZlcigpIHsKLSAgQnl0ZU9ic2VydmVyIG9ic2VydmVyID0gcmVnaXN0ZXJlZF9vYnNlcnZlcnNfLmJhY2soKTsKLSAgcmVnaXN0ZXJlZF9vYnNlcnZlcnNfLnBvcF9iYWNrKCk7Ci0gIHJldHVybiBvYnNlcnZlcjsKLX0KLQotdm9pZCBCeXRlSW5zZXJ0ZXI6Om9uX2J5dGUodWludDhfdCBieXRlKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiByZWdpc3RlcmVkX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5PbkJ5dGUoYnl0ZSk7Ci0gIH0KLX0KLQotdm9pZCBCeXRlSW5zZXJ0ZXI6Omluc2VydF9ieXRlKHVpbnQ4X3QgYnl0ZSkgewotICBvbl9ieXRlKGJ5dGUpOwotICBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pjo6b3BlcmF0b3I9KGJ5dGUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvYnl0ZV9pbnNlcnRlci5oIGIvZ2QvcGFja2V0L2J5dGVfaW5zZXJ0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3ODdkNi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvYnl0ZV9pbnNlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJwYWNrZXQvYnl0ZV9vYnNlcnZlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi1jbGFzcyBCeXRlSW5zZXJ0ZXIgOiBwdWJsaWMgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQnl0ZUluc2VydGVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpOwotICB2aXJ0dWFsIH5CeXRlSW5zZXJ0ZXIoKTsKLQotICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X2J5dGUodWludDhfdCBieXRlKTsKLQotICB2b2lkIFJlZ2lzdGVyT2JzZXJ2ZXIoY29uc3QgQnl0ZU9ic2VydmVyJiBvYnNlcnZlcik7Ci0KLSAgQnl0ZU9ic2VydmVyIFVucmVnaXN0ZXJPYnNlcnZlcigpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIG9uX2J5dGUodWludDhfdCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxCeXRlT2JzZXJ2ZXI+IHJlZ2lzdGVyZWRfb2JzZXJ2ZXJzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9ieXRlX29ic2VydmVyLmNjIGIvZ2QvcGFja2V0L2J5dGVfb2JzZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OGEyMzAuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L2J5dGVfb2JzZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicGFja2V0L2J5dGVfb2JzZXJ2ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLQotQnl0ZU9ic2VydmVyOjpCeXRlT2JzZXJ2ZXIoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QpPiYgb25fYnl0ZSwgY29uc3Qgc3RkOjpmdW5jdGlvbjx1aW50NjRfdCgpPiYgZ2V0X3ZhbHVlKQotICAgIDogb25fYnl0ZV8ob25fYnl0ZSksIGdldF92YWx1ZV8oZ2V0X3ZhbHVlKSB7fQotCi12b2lkIEJ5dGVPYnNlcnZlcjo6T25CeXRlKHVpbnQ4X3QgYnl0ZSkgewotICBvbl9ieXRlXyhieXRlKTsKLX0KLQotdWludDY0X3QgQnl0ZU9ic2VydmVyOjpHZXRWYWx1ZSgpIHsKLSAgcmV0dXJuIGdldF92YWx1ZV8oKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L2J5dGVfb2JzZXJ2ZXIuaCBiL2dkL3BhY2tldC9ieXRlX29ic2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZmNmYzEuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L2J5dGVfb2JzZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi1jbGFzcyBCeXRlT2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgQnl0ZU9ic2VydmVyKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KT4mIG9uX2J5dGVfLCBjb25zdCBzdGQ6OmZ1bmN0aW9uPHVpbnQ2NF90KCk+JiBnZXRfdmFsdWVfKTsKLQotICB2b2lkIE9uQnl0ZSh1aW50OF90IGJ5dGUpOwotCi0gIHVpbnQ2NF90IEdldFZhbHVlKCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCk+IG9uX2J5dGVfOwotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ2NF90KCk+IGdldF92YWx1ZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemVfaW50ZXJmYWNlLmggYi9nZC9wYWNrZXQvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemVfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDJiYzkyLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9jdXN0b21fZmllbGRfZml4ZWRfc2l6ZV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQ3VzdG9tRmllbGRGaXhlZFNpemVJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q3VzdG9tRmllbGRGaXhlZFNpemVJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0gIC8vIEdldCBhIHBvaW50ZXIgdG8gYSBtb2RpZmlhYmxlIGFuZCByZWFkYWJsZSBjb250aW51b3VzIGFycmF5IG9mIGRhdGEKLSAgdmlydHVhbCB1aW50OF90KiBkYXRhKCkgPSAwOwotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCA9IDA7Ci0gIC8vIEdldCB0aGUgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YSBhcnJheSwgZGF0YSgpICsgbGVuZ3RoKCkgd291bGQgYmUgaW52YWxpZAotICAvLyBzdWJjbGFzcyBUIG11c3QgaGF2ZSBrTGVuZ3RoIHZhcmlhYmxlIGRlZmluZWQKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgbGVuZ3RoKCkgewotICAgIHN0YXRpY19hc3NlcnQoCi0gICAgICAgIHN0ZDo6aXNfc2FtZV92PGRlY2x0eXBlKFQ6OmtMZW5ndGgpLCBjb25zdCBzaXplX3Q+LCAiVDo6a0xlbmd0aCBtdXN0IGJlIGNvbnN0IHNpemVfdCBvciBjb25zdGV4cHIgc2l6ZV90Iik7Ci0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvbnN0X3Y8ZGVjbHR5cGUoVDo6a0xlbmd0aCk+LCAiVDo6a0xlbmd0aCBtdXN0IGJlIGNvbnN0Iik7Ci0gICAgcmV0dXJuIFQ6OmtMZW5ndGg7Ci0gIH07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L2VuZGlhbl9pbnNlcnRlci5oIGIvZ2QvcGFja2V0L2VuZGlhbl9pbnNlcnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGVhYjUzLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9lbmRpYW5faW5zZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2N1c3RvbV9maWVsZF9maXhlZF9zaXplX2ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi0vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgc3ViY2xhc3NlZCB0byBwcm92aWRlIGluc2VydCgpIGZ1bmN0aW9ucy4KLS8vIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGl0dGxlX2VuZGlhbiBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBpbnNlcnQoKS4KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1jbGFzcyBFbmRpYW5JbnNlcnRlciB7Ci0gcHVibGljOgotICBFbmRpYW5JbnNlcnRlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+RW5kaWFuSW5zZXJ0ZXIoKSA9IGRlZmF1bHQ7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFdyaXRlIHNpemVvZihGaXhlZFdpZHRoUE9EVHlwZSkgYnl0ZXMgdXNpbmcgdGhlIGl0ZXJhdG9yCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGaXhlZFdpZHRoUE9EVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19wb2Q8Rml4ZWRXaWR0aFBPRFR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+Ci0gIHZvaWQgaW5zZXJ0KEZpeGVkV2lkdGhQT0RUeXBlIHZhbHVlLCBCaXRJbnNlcnRlciYgaXQpIGNvbnN0IHsKLSAgICB1aW50OF90KiByYXdfYnl0ZXMgPSAodWludDhfdCopJnZhbHVlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKEZpeGVkV2lkdGhQT0RUeXBlKTsgaSsrKSB7Ci0gICAgICBpZiAobGl0dGxlX2VuZGlhbiA9PSB0cnVlKSB7Ci0gICAgICAgIGl0Lmluc2VydF9ieXRlKHJhd19ieXRlc1tpXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpdC5pbnNlcnRfYnl0ZShyYXdfYnl0ZXNbc2l6ZW9mKEZpeGVkV2lkdGhQT0RUeXBlKSAtIGkgLSAxXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGUgc2l6ZW9mKEZpeGVkV2lkdGhDdXN0b21UeXBlKSBieXRlcyB1c2luZyB0aGUgaXRlcmF0b3IKLSAgdGVtcGxhdGUgPAotICAgICAgdHlwZW5hbWUgVCwKLSAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxDdXN0b21GaWVsZEZpeGVkU2l6ZUludGVyZmFjZTxUPiwgVD46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgdm9pZCBpbnNlcnQoY29uc3QgVCYgdmFsdWUsIEJpdEluc2VydGVyJiBpdCkgY29uc3QgewotICAgIGF1dG8qIHJhd19ieXRlcyA9IHZhbHVlLmRhdGEoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlPFQ+OjpsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICBpZiAobGl0dGxlX2VuZGlhbiA9PSB0cnVlKSB7Ci0gICAgICAgIGl0Lmluc2VydF9ieXRlKHJhd19ieXRlc1tpXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpdC5pbnNlcnRfYnl0ZShyYXdfYnl0ZXNbQ3VzdG9tRmllbGRGaXhlZFNpemVJbnRlcmZhY2U8VD46Omxlbmd0aCgpIC0gaSAtIDFdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBXcml0ZSBudW1fYml0cyBiaXRzIHVzaW5nIHRoZSBpdGVyYXRvcgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRml4ZWRXaWR0aEludGVnZXJUeXBlLAotICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19wb2Q8Rml4ZWRXaWR0aEludGVnZXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICB2b2lkIGluc2VydChGaXhlZFdpZHRoSW50ZWdlclR5cGUgdmFsdWUsIEJpdEluc2VydGVyJiBpdCwgc2l6ZV90IG51bV9iaXRzKSBjb25zdCB7Ci0gICAgQVNTRVJUKG51bV9iaXRzIDw9IChzaXplb2YoRml4ZWRXaWR0aEludGVnZXJUeXBlKSAqIDgpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2JpdHMgLyA4OyBpKyspIHsKLSAgICAgIGlmIChsaXR0bGVfZW5kaWFuID09IHRydWUpIHsKLSAgICAgICAgaXQuaW5zZXJ0X2J5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUgPj4gKGkgKiA4KSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaXQuaW5zZXJ0X2J5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsdWUgPj4gKCgobnVtX2JpdHMgLyA4KSAtIGkgLSAxKSAqIDgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChudW1fYml0cyAlIDgpIHsKLSAgICAgIGl0Lmluc2VydF9iaXRzKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZhbHVlID4+ICgobnVtX2JpdHMgLyA4KSAqIDgpKSwgbnVtX2JpdHMgJSA4KTsKLSAgICB9Ci0gIH0KLQotICAvLyBTcGVjaWFsaXplZCBpbnNlcnQgdGhhdCBhbGxvd3MgaW5zZXJ0aW5nIGVudW1zIHdpdGhvdXQgY2FzdGluZwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19lbnVtX3Y8RW51bT4sIGludD46OnR5cGUgPSAwPgotICBpbmxpbmUgdm9pZCBpbnNlcnQoRW51bSB2YWx1ZSwgQml0SW5zZXJ0ZXImIGl0KSBjb25zdCB7Ci0gICAgdXNpbmcgZW51bV90eXBlID0gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxFbnVtPjsKLSAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWRfdjxlbnVtX3R5cGU+LCAiRW51bSB0eXBlIGlzIHNpZ25lZC4gRGlkIHlvdSBmb3JnZXQgdG8gc3BlY2lmeSB0aGUgZW51bSBzaXplPyIpOwotICAgIGluc2VydDxlbnVtX3R5cGU+KHN0YXRpY19jYXN0PGVudW1fdHlwZT4odmFsdWUpLCBpdCk7Ci0gIH0KLQotICAvLyBXcml0ZSBhIHZlY3RvciBvZiBGaXhlZFdpZHRoSW50ZWdlclR5cGUgdXNpbmcgdGhlIGl0ZXJhdG9yCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGaXhlZFdpZHRoSW50ZWdlclR5cGU+Ci0gIHZvaWQgaW5zZXJ0X3ZlY3Rvcihjb25zdCBzdGQ6OnZlY3RvcjxGaXhlZFdpZHRoSW50ZWdlclR5cGU+JiB2ZWMsIEJpdEluc2VydGVyJiBpdCkgY29uc3QgewotICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19wb2Q8Rml4ZWRXaWR0aEludGVnZXJUeXBlPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAiRW5kaWFuSW5zZXJ0ZXI6Omluc2VydCByZXF1aXJlcyBhIHZlY3RvciB3aXRoIGVsZW1lbnRzIG9mIGEgZml4ZWQtc2l6ZS4iKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW1lbnQgOiB2ZWMpIHsKLSAgICAgIGluc2VydChlbGVtZW50LCBpdCk7Ci0gICAgfQotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvZnJhZ21lbnRpbmdfaW5zZXJ0ZXIuY2MgYi9nZC9wYWNrZXQvZnJhZ21lbnRpbmdfaW5zZXJ0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjg3YzYuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L2ZyYWdtZW50aW5nX2luc2VydGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInBhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlci5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLUZyYWdtZW50aW5nSW5zZXJ0ZXI6OkZyYWdtZW50aW5nSW5zZXJ0ZXIoc2l6ZV90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjxzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UmF3QnVpbGRlcj4+PiBpdGVyYXRvcikKLSAgICA6IEJpdEluc2VydGVyKHRvX2NvbnN0cnVjdF9iaXRfaW5zZXJ0ZXJfKSwgbXR1XyhtdHUpLCBjdXJyX3BhY2tldF8oc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihtdHUpKSwKLSAgICAgIGl0ZXJhdG9yXyhpdGVyYXRvcikge30KLQotdm9pZCBGcmFnbWVudGluZ0luc2VydGVyOjppbnNlcnRfYml0cyh1aW50OF90IGJ5dGUsIHNpemVfdCBudW1fYml0cykgewotICBBU1NFUlQoY3Vycl9wYWNrZXRfICE9IG51bGxwdHIpOwotICBzaXplX3QgdG90YWxfYml0cyA9IG51bV9iaXRzICsgbnVtX3NhdmVkX2JpdHNfOwotICB1aW50MTZfdCBuZXdfdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzYXZlZF9iaXRzXykgfCAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGJ5dGUpIDw8IG51bV9zYXZlZF9iaXRzXyk7Ci0gIGlmICh0b3RhbF9iaXRzID49IDgpIHsKLSAgICB1aW50OF90IG5ld19ieXRlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3X3ZhbHVlKTsKLSAgICBvbl9ieXRlKG5ld19ieXRlKTsKLSAgICBjdXJyX3BhY2tldF8tPkFkZE9jdGV0czEobmV3X2J5dGUpOwotICAgIGlmIChjdXJyX3BhY2tldF8tPnNpemUoKSA+PSBtdHVfKSB7Ci0gICAgICBpdGVyYXRvcl8gPSBzdGQ6Om1vdmUoY3Vycl9wYWNrZXRfKTsKLSAgICAgIGN1cnJfcGFja2V0XyA9IHN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4obXR1Xyk7Ci0gICAgfQotICAgIHRvdGFsX2JpdHMgLT0gODsKLSAgICBuZXdfdmFsdWUgPSBuZXdfdmFsdWUgPj4gODsKLSAgfQotICBudW1fc2F2ZWRfYml0c18gPSB0b3RhbF9iaXRzOwotICB1aW50OF90IG1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PigweGZmKSA+PiAoOCAtIG51bV9zYXZlZF9iaXRzXyk7Ci0gIHNhdmVkX2JpdHNfID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3X3ZhbHVlKSAmIG1hc2s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRpbmdJbnNlcnRlcjo6ZmluYWxpemUoKSB7Ci0gIGlmIChjdXJyX3BhY2tldF8tPnNpemUoKSAhPSAwKSB7Ci0gICAgaXRlcmF0b3JfID0gc3RkOjptb3ZlKGN1cnJfcGFja2V0Xyk7Ci0gIH0KLSAgY3Vycl9wYWNrZXRfLnJlc2V0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlci5oIGIvZ2QvcGFja2V0L2ZyYWdtZW50aW5nX2luc2VydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjNhMDkuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L2ZyYWdtZW50aW5nX2luc2VydGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLQotY2xhc3MgRnJhZ21lbnRpbmdJbnNlcnRlciA6IHB1YmxpYyBCaXRJbnNlcnRlciB7Ci0gcHVibGljOgotICBGcmFnbWVudGluZ0luc2VydGVyKHNpemVfdCBtdHUsIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3I8c3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+Pj4gaXRlcmF0b3IpOwotCi0gIHZvaWQgaW5zZXJ0X2JpdHModWludDhfdCBieXRlLCBzaXplX3QgbnVtX2JpdHMpIG92ZXJyaWRlOwotCi0gIHZvaWQgZmluYWxpemUoKTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9fY29uc3RydWN0X2JpdF9pbnNlcnRlcl87Ci0gIHNpemVfdCBtdHVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8UmF3QnVpbGRlcj4gY3Vycl9wYWNrZXRfOwotICBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSYXdCdWlsZGVyPj4+IGl0ZXJhdG9yXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlcl91bml0dGVzdC5jYyBiL2dkL3BhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmMTEyNC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvZnJhZ21lbnRpbmdfaW5zZXJ0ZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInBhY2tldC9mcmFnbWVudGluZ19pbnNlcnRlci5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OkZyYWdtZW50aW5nSW5zZXJ0ZXI7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLQotVEVTVChGcmFnbWVudGluZ0luc2VydGVyVGVzdCwgYWRkTW9yZUJpdHMpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0ID0gezBiMDAwMTExMDEgLyogMyAyIDEgKi8sIDBiMDAwMTAxMDEgLyogNSA0ICovLCAwYjExMTAwMDExIC8qIDcgNiAqLywgMGIxMDAwMDAwMCAvKiA4ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMGIxMDEwMDAwMCAvKiBmaWxsZWQgd2l0aCAxMDEwICovfTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+PiBmcmFnbWVudHM7Ci0KLSAgRnJhZ21lbnRpbmdJbnNlcnRlciBpdChyZXN1bHQuc2l6ZSgpLCBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yKGZyYWdtZW50cykpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0gICAgaXQuaW5zZXJ0X2JpdHMoc3RhdGljX2Nhc3Q8dWludDhfdD4oaSksIGkpOwotICB9Ci0gIGl0Lmluc2VydF9iaXRzKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDBiMTAxMCksIDQpOwotCi0gIGl0LmZpbmFsaXplKCk7Ci0KLSAgQVNTRVJUX0VRKDEsIGZyYWdtZW50cy5zaXplKCkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzOwotICBCaXRJbnNlcnRlciBiaXRfaW5zZXJ0ZXIoYnl0ZXMpOwotICBmcmFnbWVudHNbMF0tPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotCi0gIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCBieXRlcy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ5dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHJlc3VsdFtpXSwgYnl0ZXNbaV0pOwotICB9Ci19Ci0KLVRFU1QoRnJhZ21lbnRpbmdJbnNlcnRlclRlc3QsIG9ic2VydmVyVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQgPSB7MGIwMDAxMTEwMSAvKiAzIDIgMSAqLywgMGIwMDAxMDEwMSAvKiA1IDQgKi8sIDBiMTExMDAwMTEgLyogNyA2ICovLCAwYjEwMDAwMDAwIC8qIDggKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwYjEwMTAwMDAwIC8qIGZpbGxlZCB3aXRoIDEwMTAgKi99OwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UmF3QnVpbGRlcj4+IGZyYWdtZW50czsKLQotICBGcmFnbWVudGluZ0luc2VydGVyIGl0KHJlc3VsdC5zaXplKCkgKyAxLCBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yKGZyYWdtZW50cykpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvcHk7Ci0KLSAgdWludDY0X3QgY2hlY2tzdW0gPSAweDAxMjM0NTY3ODlhYmNkZWY7Ci0gIGl0LlJlZ2lzdGVyT2JzZXJ2ZXIoQnl0ZU9ic2VydmVyKFsmY29weV0odWludDhfdCBieXRlKSB7IGNvcHkucHVzaF9iYWNrKGJ5dGUpOyB9LCBbY2hlY2tzdW1dKCkgeyByZXR1cm4gY2hlY2tzdW07IH0pKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDk7IGkrKykgewotICAgIGl0Lmluc2VydF9iaXRzKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpLCBpKTsKLSAgfQotICBpdC5pbnNlcnRfYml0cyhzdGF0aWNfY2FzdDx1aW50OF90PigwYjEwMTApLCA0KTsKLSAgaXQuZmluYWxpemUoKTsKLQotICBBU1NFUlRfRVEoMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7Ci0gIEJpdEluc2VydGVyIGJpdF9pbnNlcnRlcihieXRlcyk7Ci0gIGZyYWdtZW50c1swXS0+U2VyaWFsaXplKGJpdF9pbnNlcnRlcik7Ci0KLSAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIGJ5dGVzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocmVzdWx0W2ldLCBieXRlc1tpXSk7Ci0gIH0KLQotICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgY29weS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvcHkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocmVzdWx0W2ldLCBjb3B5W2ldKTsKLSAgfQotCi0gIEJ5dGVPYnNlcnZlciBvYnNlcnZlciA9IGl0LlVucmVnaXN0ZXJPYnNlcnZlcigpOwotICBBU1NFUlRfRVEoY2hlY2tzdW0sIG9ic2VydmVyLkdldFZhbHVlKCkpOwotfQotCi1URVNUKEZyYWdtZW50aW5nSW5zZXJ0ZXJUZXN0LCB0ZXN0TXR1Qm91bmRhcmllcykgewotICBjb25zdGV4cHIgc2l6ZV90IGtQYWNrZXRTaXplID0gMTAyNDsKLSAgYXV0byBjb3VudHMgPSBSYXdCdWlsZGVyKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1BhY2tldFNpemU7IGkrKykgewotICAgIGNvdW50cy5BZGRPY3RldHMxKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSYXdCdWlsZGVyPj4gZnJhZ21lbnRzX210dV9pc19rUGFja2V0U2l6ZTsKLSAgRnJhZ21lbnRpbmdJbnNlcnRlciBpdChrUGFja2V0U2l6ZSwgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcihmcmFnbWVudHNfbXR1X2lzX2tQYWNrZXRTaXplKSk7Ci0gIGNvdW50cy5TZXJpYWxpemUoaXQpOwotICBpdC5maW5hbGl6ZSgpOwotICBBU1NFUlRfRVEoMSwgZnJhZ21lbnRzX210dV9pc19rUGFja2V0U2l6ZS5zaXplKCkpOwotICBBU1NFUlRfRVEoa1BhY2tldFNpemUsIGZyYWdtZW50c19tdHVfaXNfa1BhY2tldFNpemVbMF0tPnNpemUoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+PiBmcmFnbWVudHNfbXR1X2lzX2xlc3M7Ci0gIEZyYWdtZW50aW5nSW5zZXJ0ZXIgaXRfbGVzcyhrUGFja2V0U2l6ZSAtIDEsIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3IoZnJhZ21lbnRzX210dV9pc19sZXNzKSk7Ci0gIGNvdW50cy5TZXJpYWxpemUoaXRfbGVzcyk7Ci0gIGl0X2xlc3MuZmluYWxpemUoKTsKLSAgQVNTRVJUX0VRKDIsIGZyYWdtZW50c19tdHVfaXNfbGVzcy5zaXplKCkpOwotICBBU1NFUlRfRVEoa1BhY2tldFNpemUgLSAxLCBmcmFnbWVudHNfbXR1X2lzX2xlc3NbMF0tPnNpemUoKSk7Ci0gIEFTU0VSVF9FUSgxLCBmcmFnbWVudHNfbXR1X2lzX2xlc3NbMV0tPnNpemUoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+PiBmcmFnbWVudHNfbXR1X2lzX21vcmU7Ci0gIEZyYWdtZW50aW5nSW5zZXJ0ZXIgaXRfbW9yZShrUGFja2V0U2l6ZSArIDEsIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3IoZnJhZ21lbnRzX210dV9pc19tb3JlKSk7Ci0gIGNvdW50cy5TZXJpYWxpemUoaXRfbW9yZSk7Ci0gIGl0X21vcmUuZmluYWxpemUoKTsKLSAgQVNTRVJUX0VRKDEsIGZyYWdtZW50c19tdHVfaXNfbW9yZS5zaXplKCkpOwotICBBU1NFUlRfRVEoa1BhY2tldFNpemUsIGZyYWdtZW50c19tdHVfaXNfbW9yZVswXS0+c2l6ZSgpKTsKLX0KLQotY29uc3RleHByIHNpemVfdCBrUGFja2V0U2l6ZSA9IDEyODsKLWNsYXNzIEZyYWdtZW50aW5nVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c2l6ZV90PiB7Ci0gcHVibGljOgotICB2b2lkIFN0YXJ0VXAoKSB7Ci0gICAgY291bnRzXy5yZXNlcnZlKGtQYWNrZXRTaXplKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtQYWNrZXRTaXplOyBpKyspIHsKLSAgICAgIGNvdW50c18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBTaHV0RG93bigpIHsKLSAgICBjb3VudHNfLmNsZWFyKCk7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY291bnRzXzsKLX07Ci0KLVRFU1RfUChGcmFnbWVudGluZ1Rlc3QsIG10dUZyYWdtZW50VGVzdCkgewotICBzaXplX3QgbXR1ID0gR2V0UGFyYW0oKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+PiBmcmFnbWVudHM7Ci0gIEZyYWdtZW50aW5nSW5zZXJ0ZXIgaXQobXR1LCBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yKGZyYWdtZW50cykpOwotCi0gIFJhd0J1aWxkZXIgb3JpZ2luYWxfcGFja2V0KGNvdW50c18pOwotICBBU1NFUlRfRVEoY291bnRzXy5zaXplKCksIG9yaWdpbmFsX3BhY2tldC5zaXplKCkpOwotCi0gIG9yaWdpbmFsX3BhY2tldC5TZXJpYWxpemUoaXQpOwotICBpdC5maW5hbGl6ZSgpOwotCi0gIHNpemVfdCBleHBlY3RlZF9mcmFnbWVudHMgPSBjb3VudHNfLnNpemUoKSAvIG10dTsKLSAgaWYgKGNvdW50c18uc2l6ZSgpICUgbXR1ICE9IDApIHsKLSAgICBleHBlY3RlZF9mcmFnbWVudHMrKzsKLSAgfQotICBBU1NFUlRfRVEoZXhwZWN0ZWRfZnJhZ21lbnRzLCBmcmFnbWVudHMuc2l6ZSgpKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gc2VyaWFsaXplZF9mcmFnbWVudHM7Ci0gIGZvciAoc2l6ZV90IGYgPSAwOyBmIDwgZnJhZ21lbnRzLnNpemUoKTsgZisrKSB7Ci0gICAgc2VyaWFsaXplZF9mcmFnbWVudHMuZW1wbGFjZV9iYWNrKG10dSk7Ci0gICAgQml0SW5zZXJ0ZXIgYml0X2luc2VydGVyKHNlcmlhbGl6ZWRfZnJhZ21lbnRzW2ZdKTsKLSAgICBmcmFnbWVudHNbZl0tPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotICAgIGlmIChmICsgMSA9PSBmcmFnbWVudHMuc2l6ZSgpICYmIChjb3VudHNfLnNpemUoKSAlIG10dSAhPSAwKSkgewotICAgICAgQVNTRVJUX0VRKHNlcmlhbGl6ZWRfZnJhZ21lbnRzW2ZdLnNpemUoKSwgY291bnRzXy5zaXplKCkgJSBtdHUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlRfRVEoc2VyaWFsaXplZF9mcmFnbWVudHNbZl0uc2l6ZSgpLCBtdHUpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IHNlcmlhbGl6ZWRfZnJhZ21lbnRzW2ZdLnNpemUoKTsgYisrKSB7Ci0gICAgICBFWFBFQ1RfRVEoY291bnRzX1tmICogbXR1ICsgYl0sIHNlcmlhbGl6ZWRfZnJhZ21lbnRzW2ZdW2JdKTsKLSAgICB9Ci0gIH0KLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoY2hvcG9tYXRpYywgRnJhZ21lbnRpbmdUZXN0LCA6OnRlc3Rpbmc6OlJhbmdlPHNpemVfdD4oMSwga1BhY2tldFNpemUgKyAxKSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9pdGVyYXRvci5jYyBiL2dkL3BhY2tldC9pdGVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1MWI3OS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvaXRlcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInBhY2tldC9pdGVyYXRvci5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1JdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6SXRlcmF0b3IoY29uc3Qgc3RkOjpmb3J3YXJkX2xpc3Q8Vmlldz4mIGRhdGEsIHNpemVfdCBvZmZzZXQpIHsKLSAgZGF0YV8gPSBkYXRhOwotICBpbmRleF8gPSBvZmZzZXQ7Ci0gIGJlZ2luXyA9IDA7Ci0gIGVuZF8gPSAwOwotICBmb3IgKGF1dG8mIHZpZXcgOiBkYXRhKSB7Ci0gICAgZW5kXyArPSB2aWV3LnNpemUoKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4gSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj46Om9wZXJhdG9yKyhpbnQgb2Zmc2V0KSB7Ci0gIGF1dG8gaXRyKCp0aGlzKTsKLQotICByZXR1cm4gaXRyICs9IG9mZnNldDsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLUl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+JiBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6b3BlcmF0b3IrPShpbnQgb2Zmc2V0KSB7Ci0gIGluZGV4XyArPSBvZmZzZXQ7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLUl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+JiBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6b3BlcmF0b3IrKygpIHsKLSAgaW5kZXhfKys7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLUl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+IEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+OjpvcGVyYXRvci0oaW50IG9mZnNldCkgewotICBhdXRvIGl0cigqdGhpcyk7Ci0KLSAgcmV0dXJuIGl0ciAtPSBvZmZzZXQ7Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1pbnQgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj46Om9wZXJhdG9yLShJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiYgaXRyKSB7Ci0gIHJldHVybiBpbmRleF8gLSBpdHIuaW5kZXhfOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4mIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+OjpvcGVyYXRvci09KGludCBvZmZzZXQpIHsKLSAgaW5kZXhfIC09IG9mZnNldDsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1JdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiYgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj46Om9wZXJhdG9yLS0oKSB7Ci0gIGlmIChpbmRleF8gIT0gMCkgaW5kZXhfLS07Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4mIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+OjpvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4mIGl0cikgewotICBpZiAodGhpcyA9PSAmaXRyKSByZXR1cm4gKnRoaXM7Ci0gIHRoaXMtPmRhdGFfID0gaXRyLmRhdGFfOwotICB0aGlzLT5iZWdpbl8gPSBpdHIuYmVnaW5fOwotICB0aGlzLT5lbmRfID0gaXRyLmVuZF87Ci0gIHRoaXMtPmluZGV4XyA9IGl0ci5pbmRleF87Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLWJvb2wgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj46Om9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4mIGl0cikgY29uc3QgewotICByZXR1cm4gaW5kZXhfID09IGl0ci5pbmRleF87Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1ib29sIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+OjpvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+JiBpdHIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gaXRyKTsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLWJvb2wgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj46Om9wZXJhdG9yPChjb25zdCBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiYgaXRyKSBjb25zdCB7Ci0gIHJldHVybiBpbmRleF8gPCBpdHIuaW5kZXhfOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotYm9vbCBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6b3BlcmF0b3I+KGNvbnN0IEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+JiBpdHIpIGNvbnN0IHsKLSAgcmV0dXJuIGluZGV4XyA+IGl0ci5pbmRleF87Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1ib29sIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+OjpvcGVyYXRvcjw9KGNvbnN0IEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+JiBpdHIpIGNvbnN0IHsKLSAgcmV0dXJuIGluZGV4XyA8PSBpdHIuaW5kZXhfOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotYm9vbCBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6b3BlcmF0b3I+PShjb25zdCBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiYgaXRyKSBjb25zdCB7Ci0gIHJldHVybiBpbmRleF8gPj0gaXRyLmluZGV4XzsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLXVpbnQ4X3QgSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj46Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgQVNTRVJUX0xPRyhpbmRleF8gPCBlbmRfICYmICEoYmVnaW5fID4gaW5kZXhfKSwgIkluZGV4ICV6dSBvdXQgb2YgYm91bmRzOiBbJXp1LCV6dSkiLCBpbmRleF8sIGJlZ2luXywgZW5kXyk7Ci0gIHNpemVfdCBpbmRleCA9IGluZGV4XzsKLQotICBmb3IgKGF1dG8gdmlldyA6IGRhdGFfKSB7Ci0gICAgaWYgKGluZGV4IDwgdmlldy5zaXplKCkpIHsKLSAgICAgIHJldHVybiB2aWV3W2luZGV4XTsKLSAgICB9Ci0gICAgaW5kZXggLT0gdmlldy5zaXplKCk7Ci0gIH0KLSAgQVNTRVJUX0xPRyhmYWxzZSwgIk91dCBvZiBmcmFnbWVudHMgc2VhcmNoaW5nIGZvciBpbmRleCAlenUiLCBpbmRleF8pOwotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLXNpemVfdCBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6TnVtQnl0ZXNSZW1haW5pbmcoKSBjb25zdCB7Ci0gIGlmIChlbmRfID4gaW5kZXhfICYmICEoYmVnaW5fID4gaW5kZXhfKSkgewotICAgIHJldHVybiBlbmRfIC0gaW5kZXhfOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1JdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPjo6U3VicmFuZ2Uoc2l6ZV90IGluZGV4LCBzaXplX3QgbGVuZ3RoKSBjb25zdCB7Ci0gIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+IHRvX3JldHVybigqdGhpcyk7Ci0gIGlmICh0b19yZXR1cm4uTnVtQnl0ZXNSZW1haW5pbmcoKSA+IGluZGV4KSB7Ci0gICAgdG9fcmV0dXJuLmluZGV4XyA9IHRvX3JldHVybi5pbmRleF8gKyBpbmRleDsKLSAgICB0b19yZXR1cm4uYmVnaW5fID0gdG9fcmV0dXJuLmluZGV4XzsKLSAgICBpZiAodG9fcmV0dXJuLk51bUJ5dGVzUmVtYWluaW5nKCkgPj0gbGVuZ3RoKSB7Ci0gICAgICB0b19yZXR1cm4uZW5kXyA9IHRvX3JldHVybi5pbmRleF8gKyBsZW5ndGg7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHRvX3JldHVybi5lbmRfID0gMDsKLSAgfQotCi0gIHJldHVybiB0b19yZXR1cm47Ci19Ci0KLS8vIEV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciBib3RoIHR5cGVzIG9mIEl0ZXJhdG9ycy4KLXRlbXBsYXRlIGNsYXNzIEl0ZXJhdG9yPHRydWU+OwotdGVtcGxhdGUgY2xhc3MgSXRlcmF0b3I8ZmFsc2U+OwotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L2l0ZXJhdG9yLmggYi9nZC9wYWNrZXQvaXRlcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhMjc3ZC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvaXRlcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi0jaW5jbHVkZSAicGFja2V0L2N1c3RvbV9maWVsZF9maXhlZF9zaXplX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInBhY2tldC92aWV3LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLS8vIFRlbXBsYXRlZCBJdGVyYXRvciBmb3IgZW5kaWFubmVzcwotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLWNsYXNzIEl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgdWludDhfdD4gewotIHB1YmxpYzoKLSAgSXRlcmF0b3IoY29uc3Qgc3RkOjpmb3J3YXJkX2xpc3Q8Vmlldz4mIGRhdGEsIHNpemVfdCBvZmZzZXQpOwotICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgaXRyKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkl0ZXJhdG9yKCkgPSBkZWZhdWx0OwotCi0gIC8vIEFsbCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb3BlcmF0b3JzIGFyZSB1bmJvdW5kZWQuCi0gIEl0ZXJhdG9yIG9wZXJhdG9yKyhpbnQgb2Zmc2V0KTsKLSAgSXRlcmF0b3ImIG9wZXJhdG9yKz0oaW50IG9mZnNldCk7Ci0gIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCk7Ci0KLSAgSXRlcmF0b3Igb3BlcmF0b3ItKGludCBvZmZzZXQpOwotICBpbnQgb3BlcmF0b3ItKEl0ZXJhdG9yJiBpdHIpOwotICBJdGVyYXRvciYgb3BlcmF0b3ItPShpbnQgb2Zmc2V0KTsKLSAgSXRlcmF0b3ImIG9wZXJhdG9yLS0oKTsKLQotICBJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBpdHIpOwotCi0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yJiBpdHIpIGNvbnN0OwotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEl0ZXJhdG9yJiBpdHIpIGNvbnN0OwotICBib29sIG9wZXJhdG9yPihjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdDsKLQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgSXRlcmF0b3ImIGl0cikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdDsKLQotICB1aW50OF90IG9wZXJhdG9yKigpIGNvbnN0OwotCi0gIHNpemVfdCBOdW1CeXRlc1JlbWFpbmluZygpIGNvbnN0OwotCi0gIEl0ZXJhdG9yIFN1YnJhbmdlKHNpemVfdCBpbmRleCwgc2l6ZV90IGxlbmd0aCkgY29uc3Q7Ci0KLSAgLy8gR2V0IHRoZSBuZXh0IHNpemVvZihGaXhlZFdpZHRoUE9EVHlwZSkgYnl0ZXMgYW5kIHJldHVybiB0aGUgZmlsbGVkIHR5cGUKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpeGVkV2lkdGhQT0RUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3BvZDxGaXhlZFdpZHRoUE9EVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgRml4ZWRXaWR0aFBPRFR5cGUgZXh0cmFjdCgpIHsKLSAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfcG9kPEZpeGVkV2lkdGhQT0RUeXBlPjo6dmFsdWUsICJJdGVyYXRvcjo6ZXh0cmFjdCByZXF1aXJlcyBhIGZpeGVkLXdpZHRoIHR5cGUuIik7Ci0gICAgRml4ZWRXaWR0aFBPRFR5cGUgZXh0cmFjdGVkX3ZhbHVle307Ci0gICAgdWludDhfdCogdmFsdWVfcHRyID0gKHVpbnQ4X3QqKSZleHRyYWN0ZWRfdmFsdWU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihGaXhlZFdpZHRoUE9EVHlwZSk7IGkrKykgewotICAgICAgc2l6ZV90IGluZGV4ID0gKGxpdHRsZV9lbmRpYW4gPyBpIDogc2l6ZW9mKEZpeGVkV2lkdGhQT0RUeXBlKSAtIGkgLSAxKTsKLSAgICAgIHZhbHVlX3B0cltpbmRleF0gPSB0aGlzLT5vcGVyYXRvciooKTsKLSAgICAgIHRoaXMtPm9wZXJhdG9yKysoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dHJhY3RlZF92YWx1ZTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2ZfdjxDdXN0b21GaWVsZEZpeGVkU2l6ZUludGVyZmFjZTxUPiwgVD4sIGludD46OnR5cGUgPSAwPgotICBUIGV4dHJhY3QoKSB7Ci0gICAgVCBleHRyYWN0ZWRfdmFsdWV7fTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlPFQ+OjpsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICBzaXplX3QgaW5kZXggPSAobGl0dGxlX2VuZGlhbiA/IGkgOiBDdXN0b21GaWVsZEZpeGVkU2l6ZUludGVyZmFjZTxUPjo6bGVuZ3RoKCkgLSBpIC0gMSk7Ci0gICAgICBleHRyYWN0ZWRfdmFsdWUuZGF0YSgpW2luZGV4XSA9IHRoaXMtPm9wZXJhdG9yKigpOwotICAgICAgdGhpcy0+b3BlcmF0b3IrKygpOwotICAgIH0KLSAgICByZXR1cm4gZXh0cmFjdGVkX3ZhbHVlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OmZvcndhcmRfbGlzdDxWaWV3PiBkYXRhXzsKLSAgc2l6ZV90IGluZGV4XzsKLSAgc2l6ZV90IGJlZ2luXzsKLSAgc2l6ZV90IGVuZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFja2V0X2J1aWxkZXIuaCBiL2dkL3BhY2tldC9wYWNrZXRfYnVpbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjZjNjI3Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYWNrZXRfYnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2VuZGlhbl9pbnNlcnRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi0vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgc3ViY2xhc3NlZCB0byBidWlsZCBzcGVjaWZjIHBhY2tldHMuCi0vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpdHRsZV9lbmRpYW4gY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgaW5zZXJ0KCkuCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotY2xhc3MgUGFja2V0QnVpbGRlciA6IHB1YmxpYyBCYXNlUGFja2V0QnVpbGRlciwgcHJvdGVjdGVkIEVuZGlhbkluc2VydGVyPGxpdHRsZV9lbmRpYW4+IHsKLSBwdWJsaWM6Ci0gIFBhY2tldEJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgflBhY2tldEJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQ2xhc3NlcyB3aGljaCBuZWVkIGZyYWdtZW50YXRpb24gc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKLSAgLy8gc3RkOjpmb3J3YXJkX2xpc3Q8RGVyaXZlZEJ1aWxkZXI+JiBGcmFnbWVudChzaXplX3QgbWF4X3NpemUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhY2tldF9idWlsZGVyX3VuaXR0ZXN0LmNjIGIvZ2QvcGFja2V0L3BhY2tldF9idWlsZGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0N2EzLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYWNrZXRfYnVpbGRlcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF9idWlsZGVyLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLXVzaW5nIGJsdWV0b290aDo6cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcjsKLXVzaW5nIGJsdWV0b290aDo6cGFja2V0OjpCaXRJbnNlcnRlcjsKLXVzaW5nIGJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRCdWlsZGVyOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB7Ci12ZWN0b3I8dWludDhfdD4gY291bnRfYWxsID0gewotICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKLX07Ci0KLXZlY3Rvcjx1aW50OF90PiBjb3VudF8xID0gewotICAgIDB4MDAsCi0gICAgMHgwMSwKLSAgICAweDAyLAotfTsKLQotdmVjdG9yPHVpbnQ4X3Q+IGNvdW50XzIgPSB7Ci0gICAgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywKLX07Ci0KLXZlY3Rvcjx1aW50OF90PiBjb3VudF8zID0gewotICAgIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCi19OwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1jbGFzcyBFbmRpYW5CdWlsZGVyIDogcHVibGljIFBhY2tldEJ1aWxkZXI8bGl0dGxlX2VuZGlhbj4gewotIHB1YmxpYzoKLSAgRW5kaWFuQnVpbGRlcih1aW50OF90IGJ5dGUsIHVpbnQxNl90IHR3b19ieXRlcywgdWludDMyX3QgZm91cl9ieXRlcywgdWludDY0X3QgZWlnaHRfYnl0ZXMpCi0gICAgICA6IGJ5dGVfKGJ5dGUpLCB0d29fYnl0ZXNfKHR3b19ieXRlcyksIGZvdXJfYnl0ZXNfKGZvdXJfYnl0ZXMpLCBlaWdodF9ieXRlc18oZWlnaHRfYnl0ZXMpIHt9Ci0gIH5FbmRpYW5CdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHNpemVvZihzaWduYXR1cmVfKSArIHNpemVvZihieXRlXykgKyBzaXplb2YodHdvX2J5dGVzXykgKyBzaXplb2YoZm91cl9ieXRlc18pICsgc2l6ZW9mKGVpZ2h0X2J5dGVzXyk7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gRmluYWxQYWNrZXQoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICAgIHBhY2tldC0+cmVzZXJ2ZShzaXplKCkpOwotICAgIEJpdEluc2VydGVyIGl0KCpwYWNrZXQpOwotICAgIFNlcmlhbGl6ZShpdCk7Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQml0SW5zZXJ0ZXImIGl0KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgUGFja2V0QnVpbGRlcjxsaXR0bGVfZW5kaWFuPjo6aW5zZXJ0KHNpZ25hdHVyZV8sIGl0KTsKLSAgICBQYWNrZXRCdWlsZGVyPGxpdHRsZV9lbmRpYW4+OjppbnNlcnQoYnl0ZV8sIGl0KTsKLSAgICBQYWNrZXRCdWlsZGVyPGxpdHRsZV9lbmRpYW4+OjppbnNlcnQodHdvX2J5dGVzXywgaXQpOwotICAgIFBhY2tldEJ1aWxkZXI8bGl0dGxlX2VuZGlhbj46Omluc2VydChmb3VyX2J5dGVzXywgaXQpOwotICAgIFBhY2tldEJ1aWxkZXI8bGl0dGxlX2VuZGlhbj46Omluc2VydChlaWdodF9ieXRlc18sIGl0KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdWludDMyX3Qgc2lnbmF0dXJlX3sobGl0dGxlX2VuZGlhbiA/IDB4MDMwMjAxMDAgOiAweDAwMDEwMjAzKX07Ci0gIHVpbnQ4X3QgYnl0ZV87Ci0gIHVpbnQxNl90IHR3b19ieXRlc187Ci0gIHVpbnQzMl90IGZvdXJfYnl0ZXNfOwotICB1aW50NjRfdCBlaWdodF9ieXRlc187Ci19OwotCi1jbGFzcyBQYWNrZXRCdWlsZGVyRW5kaWFuVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgUGFja2V0QnVpbGRlckVuZGlhblRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5QYWNrZXRCdWlsZGVyRW5kaWFuVGVzdCgpID0gZGVmYXVsdDsKLX07Ci0KLVRFU1QoUGFja2V0QnVpbGRlckVuZGlhblRlc3QsIGluc2VydFRlc3QpIHsKLSAgRW5kaWFuQnVpbGRlcjx0cnVlPiBsaXR0bGUoMHgwNCwgMHgwNjA1LCAweDBhMDkwODA3LCAweDEyMTExMDBmMGUwZDBjMGIpOwotICBFbmRpYW5CdWlsZGVyPGZhbHNlPiBiaWcoMHgwNCwgMHgwNTA2LCAweDA3MDgwOTBhLCAweDBiMGMwZDBlMGYxMDExMTIpOwotICBBU1NFUlRfRVEoKmJpZy5GaW5hbFBhY2tldCgpLCAqbGl0dGxlLkZpbmFsUGFja2V0KCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFZlY3RvckJ1aWxkZXIgOiBwdWJsaWMgUGFja2V0QnVpbGRlcjx0cnVlPiB7Ci0gcHVibGljOgotICBWZWN0b3JCdWlsZGVyKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiB2ZWN0KSB7Ci0gICAgZm9yICh1aW50NjRfdCBlbGVtZW50IDogdmVjdCkgewotICAgICAgdmVjdF8ucHVzaF9iYWNrKHN0YXRpY19jYXN0PFQ+KGVsZW1lbnQpKTsKLSAgICB9Ci0gIH0KLSAgflZlY3RvckJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gdmVjdF8uc2l6ZSgpICogc2l6ZW9mKFQpOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IEZpbmFsUGFja2V0KCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0ID0gc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgICBwYWNrZXQtPnJlc2VydmUoc2l6ZSgpKTsKLSAgICBCaXRJbnNlcnRlciBpdCgqcGFja2V0KTsKLSAgICBTZXJpYWxpemUoaXQpOwotICAgIHJldHVybiBwYWNrZXQ7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplKEJpdEluc2VydGVyJiBpdCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIFBhY2tldEJ1aWxkZXI8dHJ1ZT46Omluc2VydF92ZWN0b3IodmVjdF8sIGl0KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8VD4gdmVjdF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEluc2VydEVsZW1lbnRzQnVpbGRlciA6IHB1YmxpYyBQYWNrZXRCdWlsZGVyPHRydWU+IHsKLSBwdWJsaWM6Ci0gIEluc2VydEVsZW1lbnRzQnVpbGRlcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gdmVjdCkgewotICAgIGZvciAodWludDY0X3QgZWxlbWVudCA6IHZlY3QpIHsKLSAgICAgIHZlY3RfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxUPihlbGVtZW50KSk7Ci0gICAgfQotICB9Ci0gIHZpcnR1YWwgfkluc2VydEVsZW1lbnRzQnVpbGRlcigpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiB2ZWN0Xy5zaXplKCkgKiBzaXplb2YoVCk7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gRmluYWxQYWNrZXQoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICAgIHBhY2tldC0+cmVzZXJ2ZShzaXplKCkpOwotICAgIEJpdEluc2VydGVyIGl0KCpwYWNrZXQpOwotICAgIFNlcmlhbGl6ZShpdCk7Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQml0SW5zZXJ0ZXImIGl0KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgZm9yIChUIGVsZW0gOiB2ZWN0XykgewotICAgICAgUGFja2V0QnVpbGRlcjx0cnVlPjo6aW5zZXJ0KGVsZW0sIGl0KTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPFQ+IHZlY3RfOwotfTsKLQotc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHZlY3Rvcl9kYXRhewotICAgIDB4NzA2MDUwNDAzMDIwMTAwMCwgMHg3MTYxNTE0MTMxMjExMTAxLCAweDcyNjI1MjQyMzIyMjEyMDIsIDB4NzM2MzUzNDMzMzIzMTMwMywgMHg3NDY0NTQ0NDM0MjQxNDA0LAotICAgIDB4NzU2NTU1NDUzNTI1MTUwNSwgMHg3NjY2NTY0NjM2MjYxNjA2LCAweDc3Njc1NzQ3MzcyNzE3MDcsIDB4Nzg2ODU4NDgzODI4MTgwOCwKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVmVjdG9yQnVpbGRlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIFZlY3RvckJ1aWxkZXJUZXN0KCkgPSBkZWZhdWx0OwotICB+VmVjdG9yQnVpbGRlclRlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIHsKLSAgICBwYWNrZXRfMV8gPSBzdGQ6OnNoYXJlZF9wdHI8VmVjdG9yQnVpbGRlcjxUPj4obmV3IFZlY3RvckJ1aWxkZXI8VD4odmVjdG9yX2RhdGEpKTsKLSAgICBwYWNrZXRfMl8gPSBzdGQ6OnNoYXJlZF9wdHI8SW5zZXJ0RWxlbWVudHNCdWlsZGVyPFQ+PihuZXcgSW5zZXJ0RWxlbWVudHNCdWlsZGVyPFQ+KHZlY3Rvcl9kYXRhKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgewotICAgIHBhY2tldF8xXy5yZXNldCgpOwotICAgIHBhY2tldF8yXy5yZXNldCgpOwotICB9Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPFZlY3RvckJ1aWxkZXI8VD4+IHBhY2tldF8xXzsKLSAgc3RkOjpzaGFyZWRfcHRyPEluc2VydEVsZW1lbnRzQnVpbGRlcjxUPj4gcGFja2V0XzJfOwotfTsKLQotdXNpbmcgVmVjdG9yQmFzZVR5cGVzID0gOjp0ZXN0aW5nOjpUeXBlczx1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3QsIHVpbnQ2NF90LCBpbnQ4X3QsIGludDE2X3QsIGludDMyX3QsIGludDY0X3Q+OwotVFlQRURfVEVTVF9DQVNFKFZlY3RvckJ1aWxkZXJUZXN0LCBWZWN0b3JCYXNlVHlwZXMpOwotCi1UWVBFRF9URVNUKFZlY3RvckJ1aWxkZXJUZXN0LCBpbnNlcnRWZWN0b3JUZXN0KSB7Ci0gIEFTU0VSVF9FUSgqKHRoaXMtPnBhY2tldF8xXy0+RmluYWxQYWNrZXQoKSksICoodGhpcy0+cGFja2V0XzJfLT5GaW5hbFBhY2tldCgpKSk7Ci19Ci0KLWNsYXNzIE5lc3RlZEJ1aWxkZXIgOiBwdWJsaWMgUGFja2V0QnVpbGRlcjx0cnVlPiB7Ci0gcHVibGljOgotICB+TmVzdGVkQnVpbGRlcigpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAocGF5bG9hZF8gPyBwYXlsb2FkXy0+c2l6ZSgpIDogMCk7Ci0gICAgcmV0dXJuIDEgKyBwYXlsb2FkX3NpemU7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE5lc3RlZEJ1aWxkZXI+IENyZWF0ZSh1aW50OF90IGxldmVsKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOZXN0ZWRCdWlsZGVyPihuZXcgTmVzdGVkQnVpbGRlcihsZXZlbCkpOwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxOZXN0ZWRCdWlsZGVyPiBDcmVhdGVOZXN0ZWQoc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBwYXlsb2FkLCB1aW50OF90IGxldmVsKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOZXN0ZWRCdWlsZGVyPihuZXcgTmVzdGVkQnVpbGRlcihzdGQ6Om1vdmUocGF5bG9hZCksIGxldmVsKSk7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gRmluYWxQYWNrZXQoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICAgIHBhY2tldC0+cmVzZXJ2ZShzaXplKCkpOwotICAgIEJpdEluc2VydGVyIGl0KCpwYWNrZXQpOwotICAgIFNlcmlhbGl6ZShpdCk7Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQml0SW5zZXJ0ZXImIGl0KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgUGFja2V0QnVpbGRlcjx0cnVlPjo6aW5zZXJ0KGxldmVsXywgaXQpOwotICAgIGlmIChwYXlsb2FkXykgewotICAgICAgcGF5bG9hZF8tPlNlcmlhbGl6ZShpdCk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IHBheWxvYWRfOwotICB1aW50OF90IGxldmVsXzsKLQotICBOZXN0ZWRCdWlsZGVyKHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gaW5uZXIsIHVpbnQ4X3QgbGV2ZWwpIDogcGF5bG9hZF8oc3RkOjptb3ZlKGlubmVyKSksIGxldmVsXyhsZXZlbCkge30KLSAgTmVzdGVkQnVpbGRlcih1aW50OF90IGxldmVsKSA6IGxldmVsXyhsZXZlbCkge30KLX07Ci0KLWNsYXNzIEJ1aWxkZXJCdWlsZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307Ci0KLVRFU1QoQnVpbGRlckJ1aWxkZXJUZXN0LCBuZXN0aW5nVGVzdCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IGlubmVybW9zdCA9IE5lc3RlZEJ1aWxkZXI6OkNyZWF0ZSgwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPiBudW1iZXJfMSA9IE5lc3RlZEJ1aWxkZXI6OkNyZWF0ZU5lc3RlZChzdGQ6Om1vdmUoaW5uZXJtb3N0KSwgMSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gbnVtYmVyXzIgPSBOZXN0ZWRCdWlsZGVyOjpDcmVhdGVOZXN0ZWQoc3RkOjptb3ZlKG51bWJlcl8xKSwgMik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gbnVtYmVyXzMgPSBOZXN0ZWRCdWlsZGVyOjpDcmVhdGVOZXN0ZWQoc3RkOjptb3ZlKG51bWJlcl8yKSwgMyk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gbnVtYmVyXzQgPSBOZXN0ZWRCdWlsZGVyOjpDcmVhdGVOZXN0ZWQoc3RkOjptb3ZlKG51bWJlcl8zKSwgNCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxOZXN0ZWRCdWlsZGVyPiBudW1iZXJfNSA9IE5lc3RlZEJ1aWxkZXI6OkNyZWF0ZU5lc3RlZChzdGQ6Om1vdmUobnVtYmVyXzQpLCA1KTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb3VudF9kb3duezUsIDQsIDMsIDIsIDEsIDB9OwotICBBU1NFUlRfRVEoKm51bWJlcl81LT5GaW5hbFBhY2tldCgpLCBjb3VudF9kb3duKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYWNrZXRfc3RydWN0LmggYi9nZC9wYWNrZXQvcGFja2V0X3N0cnVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWJiMGU1Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYWNrZXRfc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJwYWNrZXQvYmFzZV9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2VuZGlhbl9pbnNlcnRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi0vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgc3ViY2xhc3NlZCB0byBidWlsZCBzcGVjaWZjIHN0cnVjdHMuCi0vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpdHRsZV9lbmRpYW4gY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgaW5zZXJ0KCkuCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotY2xhc3MgUGFja2V0U3RydWN0IDogcHVibGljIEJhc2VTdHJ1Y3QsIHByb3RlY3RlZCBFbmRpYW5JbnNlcnRlcjxsaXR0bGVfZW5kaWFuPiB7Ci0gcHVibGljOgotICBQYWNrZXRTdHJ1Y3QoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgflBhY2tldFN0cnVjdCgpID0gZGVmYXVsdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYWNrZXRfdmlldy5jYyBiL2dkL3BhY2tldC9wYWNrZXRfdmlldy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkZDY0MS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFja2V0X3ZpZXcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1QYWNrZXRWaWV3PGxpdHRsZV9lbmRpYW4+OjpQYWNrZXRWaWV3KGNvbnN0IHN0ZDo6Zm9yd2FyZF9saXN0PGNsYXNzIFZpZXc+IGZyYWdtZW50cykKLSAgICA6IGZyYWdtZW50c18oZnJhZ21lbnRzKSwgbGVuZ3RoXygwKSB7Ci0gIGZvciAoYXV0byBmcmFnbWVudCA6IGZyYWdtZW50c18pIHsKLSAgICBsZW5ndGhfICs9IGZyYWdtZW50LnNpemUoKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotUGFja2V0VmlldzxsaXR0bGVfZW5kaWFuPjo6UGFja2V0VmlldyhzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkKLSAgICA6IGZyYWdtZW50c18oe1ZpZXcocGFja2V0LCAwLCBwYWNrZXQtPnNpemUoKSl9KSwgbGVuZ3RoXyhwYWNrZXQtPnNpemUoKSkge30KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLUl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+IFBhY2tldFZpZXc8bGl0dGxlX2VuZGlhbj46OmJlZ2luKCkgY29uc3QgewotICByZXR1cm4gSXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4odGhpcy0+ZnJhZ21lbnRzXywgMCk7Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1JdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiBQYWNrZXRWaWV3PGxpdHRsZV9lbmRpYW4+OjplbmQoKSBjb25zdCB7Ci0gIHJldHVybiBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPih0aGlzLT5mcmFnbWVudHNfLCBzaXplKCkpOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotdWludDhfdCBQYWNrZXRWaWV3PGxpdHRsZV9lbmRpYW4+OjpvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgewotICByZXR1cm4gYXQoaW5kZXgpOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotdWludDhfdCBQYWNrZXRWaWV3PGxpdHRsZV9lbmRpYW4+OjphdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgQVNTRVJUX0xPRyhpbmRleCA8IGxlbmd0aF8sICJJbmRleCAlenUgb3V0IG9mIGJvdW5kcyIsIGluZGV4KTsKLSAgZm9yIChjb25zdCBhdXRvJiBmcmFnbWVudCA6IGZyYWdtZW50c18pIHsKLSAgICBpZiAoaW5kZXggPCBmcmFnbWVudC5zaXplKCkpIHsKLSAgICAgIHJldHVybiBmcmFnbWVudFtpbmRleF07Ci0gICAgfQotICAgIGluZGV4IC09IGZyYWdtZW50LnNpemUoKTsKLSAgfQotICBBU1NFUlRfTE9HKGZhbHNlLCAiT3V0IG9mIGZyYWdtZW50cyBzZWFyY2hpbmcgZm9yIGluZGV4ICV6dSIsIGluZGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1zaXplX3QgUGFja2V0VmlldzxsaXR0bGVfZW5kaWFuPjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxlbmd0aF87Ci19Ci0KLXRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci1zdGQ6OmZvcndhcmRfbGlzdDxWaWV3PiBQYWNrZXRWaWV3PGxpdHRsZV9lbmRpYW4+OjpHZXRTdWJ2aWV3TGlzdChzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIGNvbnN0IHsKLSAgQVNTRVJUKGJlZ2luIDw9IGVuZCk7Ci0gIEFTU0VSVChlbmQgPD0gbGVuZ3RoXyk7Ci0KLSAgc3RkOjpmb3J3YXJkX2xpc3Q8Vmlldz4gdmlld19saXN0OwotICBzdGQ6OmZvcndhcmRfbGlzdDxWaWV3Pjo6aXRlcmF0b3IgaXQgPSB2aWV3X2xpc3QuYmVmb3JlX2JlZ2luKCk7Ci0gIHNpemVfdCBsZW5ndGggPSBlbmQgLSBiZWdpbjsKLSAgZm9yIChjb25zdCBhdXRvJiBmcmFnbWVudCA6IGZyYWdtZW50c18pIHsKLSAgICBpZiAoYmVnaW4gPj0gZnJhZ21lbnQuc2l6ZSgpKSB7Ci0gICAgICBiZWdpbiAtPSBmcmFnbWVudC5zaXplKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZpZXcgdmlldyhmcmFnbWVudCwgYmVnaW4sIGJlZ2luICsgc3RkOjptaW4obGVuZ3RoLCBmcmFnbWVudC5zaXplKCkgLSBiZWdpbikpOwotICAgICAgbGVuZ3RoIC09IHZpZXcuc2l6ZSgpOwotICAgICAgaXQgPSB2aWV3X2xpc3QuaW5zZXJ0X2FmdGVyKGl0LCB2aWV3KTsKLSAgICAgIGJlZ2luID0gMDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZpZXdfbGlzdDsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLVBhY2tldFZpZXc8dHJ1ZT4gUGFja2V0VmlldzxsaXR0bGVfZW5kaWFuPjo6R2V0TGl0dGxlRW5kaWFuU3VidmlldyhzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIGNvbnN0IHsKLSAgcmV0dXJuIFBhY2tldFZpZXc8dHJ1ZT4oR2V0U3Vidmlld0xpc3QoYmVnaW4sIGVuZCkpOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBsaXR0bGVfZW5kaWFuPgotUGFja2V0VmlldzxmYWxzZT4gUGFja2V0VmlldzxsaXR0bGVfZW5kaWFuPjo6R2V0QmlnRW5kaWFuU3VidmlldyhzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIGNvbnN0IHsKLSAgcmV0dXJuIFBhY2tldFZpZXc8ZmFsc2U+KEdldFN1YnZpZXdMaXN0KGJlZ2luLCBlbmQpKTsKLX0KLQotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLXZvaWQgUGFja2V0VmlldzxsaXR0bGVfZW5kaWFuPjo6QXBwZW5kKFBhY2tldFZpZXcgdG9fYWRkKSB7Ci0gIGF1dG8gaW5zZXJ0aW9uX3BvaW50ID0gZnJhZ21lbnRzXy5iZWdpbigpOwotICBzaXplX3QgcmVtYWluaW5nX2xlbmd0aCA9IGxlbmd0aF87Ci0gIHdoaWxlIChyZW1haW5pbmdfbGVuZ3RoID4gMCkgewotICAgIHJlbWFpbmluZ19sZW5ndGggLT0gaW5zZXJ0aW9uX3BvaW50LT5zaXplKCk7Ci0gICAgaWYgKHJlbWFpbmluZ19sZW5ndGggPiAwKSB7Ci0gICAgICBpbnNlcnRpb25fcG9pbnQrKzsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUKGluc2VydGlvbl9wb2ludCAhPSBmcmFnbWVudHNfLmVuZCgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBmcmFnbWVudCA6IHRvX2FkZC5mcmFnbWVudHNfKSB7Ci0gICAgZnJhZ21lbnRzXy5pbnNlcnRfYWZ0ZXIoaW5zZXJ0aW9uX3BvaW50LCBmcmFnbWVudCk7Ci0gICAgaW5zZXJ0aW9uX3BvaW50Kys7Ci0gIH0KLSAgbGVuZ3RoXyArPSB0b19hZGQubGVuZ3RoXzsKLX0KLQotLy8gRXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIGJvdGggdHlwZXMgb2YgUGFja2V0Vmlld3MuCi10ZW1wbGF0ZSBjbGFzcyBQYWNrZXRWaWV3PHRydWU+OwotdGVtcGxhdGUgY2xhc3MgUGFja2V0VmlldzxmYWxzZT47Ci19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFja2V0X3ZpZXcuaCBiL2dkL3BhY2tldC9wYWNrZXRfdmlldy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NlN2QwLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYWNrZXRfdmlldy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KLQotI2luY2x1ZGUgInBhY2tldC9pdGVyYXRvci5oIgotI2luY2x1ZGUgInBhY2tldC92aWV3LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLXN0YXRpYyBjb25zdCBib29sIGtMaXR0bGVFbmRpYW4gPSB0cnVlOwotCi0vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgc3ViY2xhc3NlZCB0byBwcm92aWRlIHR5cGUtc3BlY2lmYyBhY2Nlc3NvcnMuCi0vLyBIb2xkcyBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEuCi0vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpdHRsZV9lbmRpYW4gY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgZXh0cmFjdCgpLgotdGVtcGxhdGUgPGJvb2wgbGl0dGxlX2VuZGlhbj4KLWNsYXNzIFBhY2tldFZpZXcgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUGFja2V0VmlldyhzdGQ6OmZvcndhcmRfbGlzdDxWaWV3PiBmcmFnbWVudHMpOwotICBQYWNrZXRWaWV3KGNvbnN0IFBhY2tldFZpZXcmIFBhY2tldFZpZXcpID0gZGVmYXVsdDsKLSAgZXhwbGljaXQgUGFja2V0VmlldyhzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCk7Ci0gIFBhY2tldFZpZXc8bGl0dGxlX2VuZGlhbj4oKSA9IGRlbGV0ZTsKLSAgdmlydHVhbCB+UGFja2V0VmlldygpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+IGJlZ2luKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBJdGVyYXRvcjxsaXR0bGVfZW5kaWFuPiBlbmQoKSBjb25zdDsKLQotICB1aW50OF90IG9wZXJhdG9yW10oc2l6ZV90IGkpIGNvbnN0OwotCi0gIHVpbnQ4X3QgYXQoc2l6ZV90IGluZGV4KSBjb25zdDsKLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotCi0gIFBhY2tldFZpZXc8dHJ1ZT4gR2V0TGl0dGxlRW5kaWFuU3VidmlldyhzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIGNvbnN0OwotCi0gIFBhY2tldFZpZXc8ZmFsc2U+IEdldEJpZ0VuZGlhblN1YnZpZXcoc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBBcHBlbmQoUGFja2V0VmlldyB0b19hZGQpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpmb3J3YXJkX2xpc3Q8Vmlldz4gZnJhZ21lbnRzXzsKLSAgc2l6ZV90IGxlbmd0aF87Ci0gIHN0ZDo6Zm9yd2FyZF9saXN0PFZpZXc+IEdldFN1YnZpZXdMaXN0KHNpemVfdCBiZWdpbiwgc2l6ZV90IGVuZCkgY29uc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFja2V0X3ZpZXdfdW5pdHRlc3QuY2MgYi9nZC9wYWNrZXQvcGFja2V0X3ZpZXdfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODc4NGUuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhY2tldF92aWV3X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc7Ci11c2luZyBibHVldG9vdGg6OnBhY2tldDo6VmlldzsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgewotdmVjdG9yPHVpbnQ4X3Q+IGNvdW50X2FsbCA9IHsKLSAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAotICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCi19OwotCi12ZWN0b3I8dWludDhfdD4gY291bnRfMSA9IHsKLSAgICAweDAwLAotICAgIDB4MDEsCi0gICAgMHgwMiwKLX07Ci0KLXZlY3Rvcjx1aW50OF90PiBjb3VudF8yID0gewotICAgIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsCi19OwotCi12ZWN0b3I8dWludDhfdD4gY291bnRfMyA9IHsKLSAgICAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAotfTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEl0ZXJhdG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgSXRlcmF0b3JUZXN0KCkgPSBkZWZhdWx0OwotICB+SXRlcmF0b3JUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgcGFja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFQ+KG5ldyBUKHtWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCAwLCBjb3VudF9hbGwuc2l6ZSgpKX0pKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgcGFja2V0LnJlc2V0KCk7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8VD4gcGFja2V0OwotfTsKLQotdXNpbmcgUGFja2V0Vmlld1R5cGVzID0gOjp0ZXN0aW5nOjpUeXBlczxQYWNrZXRWaWV3PHRydWU+LCBQYWNrZXRWaWV3PGZhbHNlPj47Ci1UWVBFRF9URVNUX0NBU0UoSXRlcmF0b3JUZXN0LCBQYWNrZXRWaWV3VHlwZXMpOwotCi1jbGFzcyBJdGVyYXRvckV4dHJhY3RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBJdGVyYXRvckV4dHJhY3RUZXN0KCkgPSBkZWZhdWx0OwotICB+SXRlcmF0b3JFeHRyYWN0VGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUGFja2V0Vmlld1Rlc3QgOiBwdWJsaWMgSXRlcmF0b3JUZXN0PFQ+IHsKLSBwdWJsaWM6Ci0gIFBhY2tldFZpZXdUZXN0KCkgPSBkZWZhdWx0OwotICB+UGFja2V0Vmlld1Rlc3QoKSA9IGRlZmF1bHQ7Ci19OwotCi11c2luZyBQYWNrZXRWaWV3VHlwZXMgPSA6OnRlc3Rpbmc6OlR5cGVzPFBhY2tldFZpZXc8dHJ1ZT4sIFBhY2tldFZpZXc8ZmFsc2U+PjsKLVRZUEVEX1RFU1RfQ0FTRShQYWNrZXRWaWV3VGVzdCwgUGFja2V0Vmlld1R5cGVzKTsKLQotY2xhc3MgUGFja2V0Vmlld011bHRpVmlld1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIFBhY2tldFZpZXdNdWx0aVZpZXdUZXN0KCkgPSBkZWZhdWx0OwotICB+UGFja2V0Vmlld011bHRpVmlld1Rlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgY29uc3QgUGFja2V0Vmlldzx0cnVlPiBzaW5nbGVfdmlldyA9Ci0gICAgICBQYWNrZXRWaWV3PHRydWU+KHtWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCAwLCBjb3VudF9hbGwuc2l6ZSgpKX0pOwotICBjb25zdCBQYWNrZXRWaWV3PHRydWU+IG11bHRpX3ZpZXcgPSBQYWNrZXRWaWV3PHRydWU+KHsKLSAgICAgIFZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50XzEpLCAwLCBjb3VudF8xLnNpemUoKSksCi0gICAgICBWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF8yKSwgMCwgY291bnRfMi5zaXplKCkpLAotICAgICAgVmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfMyksIDAsIGNvdW50XzMuc2l6ZSgpKSwKLSAgfSk7Ci19OwotCi1jbGFzcyBQYWNrZXRWaWV3TXVsdGlWaWV3QXBwZW5kVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgUGFja2V0Vmlld011bHRpVmlld0FwcGVuZFRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5QYWNrZXRWaWV3TXVsdGlWaWV3QXBwZW5kVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBjbGFzcyBBcHBlbmRlZFBhY2tldFZpZXcgOiBwdWJsaWMgUGFja2V0Vmlldzx0cnVlPiB7Ci0gICBwdWJsaWM6Ci0gICAgQXBwZW5kZWRQYWNrZXRWaWV3KFBhY2tldFZpZXc8dHJ1ZT4gZmlyc3QsIHN0ZDo6Zm9yd2FyZF9saXN0PFBhY2tldFZpZXc8dHJ1ZT4+IHRvX2FwcGVuZCkKLSAgICAgICAgOiBQYWNrZXRWaWV3PHRydWU+KGZpcnN0KSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhY2tldF92aWV3IDogdG9fYXBwZW5kKSB7Ci0gICAgICAgIEFwcGVuZChwYWNrZXRfdmlldyk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotICBjb25zdCBQYWNrZXRWaWV3PHRydWU+IHNpbmdsZV92aWV3ID0KLSAgICAgIFBhY2tldFZpZXc8dHJ1ZT4oe1ZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50X2FsbCksIDAsIGNvdW50X2FsbC5zaXplKCkpfSk7Ci0gIGNvbnN0IFBhY2tldFZpZXc8dHJ1ZT4gbXVsdGlfdmlldyA9IEFwcGVuZGVkUGFja2V0VmlldygKLSAgICAgIFBhY2tldFZpZXc8dHJ1ZT4oe1ZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50XzEpLCAwLCBjb3VudF8xLnNpemUoKSl9KSwKLSAgICAgIHtQYWNrZXRWaWV3PHRydWU+KHtWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF8yKSwgMCwgY291bnRfMi5zaXplKCkpfSksCi0gICAgICAgUGFja2V0Vmlldzx0cnVlPih7VmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfMyksIDAsIGNvdW50XzMuc2l6ZSgpKX0pfSk7Ci19OwotCi1jbGFzcyBWaWV3VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgVmlld1Rlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5WaWV3VGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLX07Ci0KLVRFU1QoSXRlcmF0b3JFeHRyYWN0VGVzdCwgZXh0cmFjdExlVGVzdCkgewotICBQYWNrZXRWaWV3PHRydWU+IHBhY2tldCh7VmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfYWxsKSwgMCwgY291bnRfYWxsLnNpemUoKSl9KTsKLSAgYXV0byBnZW5lcmFsX2Nhc2UgPSBwYWNrZXQuYmVnaW4oKTsKLQotICBBU1NFUlRfRVEoMHgwMCwgZ2VuZXJhbF9jYXNlLmV4dHJhY3Q8dWludDhfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDAyMDEsIGdlbmVyYWxfY2FzZS5leHRyYWN0PHVpbnQxNl90PigpKTsKLSAgQVNTRVJUX0VRKDB4MDYwNTA0MDN1LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50MzJfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDBlMGQwYzBiMGEwOTA4MDd1LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50NjRfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDBmLCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50OF90PigpKTsKLSAgQWRkcmVzcyByYXcoezB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTV9KTsKLSAgQVNTRVJUX0VRKHJhdywgZ2VuZXJhbF9jYXNlLmV4dHJhY3Q8QWRkcmVzcz4oKSk7Ci0gIEFTU0VSVF9FUSgweDE2LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50OF90PigpKTsKLX0KLQotVEVTVChJdGVyYXRvckV4dHJhY3RUZXN0LCBleHRyYWN0QmVUZXN0KSB7Ci0gIFBhY2tldFZpZXc8ZmFsc2U+IHBhY2tldCh7VmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfYWxsKSwgMCwgY291bnRfYWxsLnNpemUoKSl9KTsKLSAgYXV0byBnZW5lcmFsX2Nhc2UgPSBwYWNrZXQuYmVnaW4oKTsKLQotICBBU1NFUlRfRVEoMHgwMCwgZ2VuZXJhbF9jYXNlLmV4dHJhY3Q8dWludDhfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDAxMDIsIGdlbmVyYWxfY2FzZS5leHRyYWN0PHVpbnQxNl90PigpKTsKLSAgQVNTRVJUX0VRKDB4MDMwNDA1MDZ1LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50MzJfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDA3MDgwOTBhMGIwYzBkMGV1LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50NjRfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDBmLCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50OF90PigpKTsKLSAgQWRkcmVzcyByYXcoezB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTEsIDB4MTB9KTsKLSAgQVNTRVJUX0VRKHJhdywgZ2VuZXJhbF9jYXNlLmV4dHJhY3Q8QWRkcmVzcz4oKSk7Ci0gIEFTU0VSVF9FUSgweDE2LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50OF90PigpKTsKLX0KLQotVFlQRURfVEVTVChJdGVyYXRvclRlc3QsIGV4dHJhY3RCb3VuZHNEZWF0aFRlc3QpIHsKLSAgYXV0byBib3VuZHNfdGVzdCA9IHRoaXMtPnBhY2tldC0+ZW5kKCk7Ci0KLSAgQVNTRVJUX0RFQVRIKGJvdW5kc190ZXN0LnRlbXBsYXRlIGV4dHJhY3Q8dWludDhfdD4oKSwgIiIpOwotICBBU1NFUlRfREVBVEgoYm91bmRzX3Rlc3QudGVtcGxhdGUgZXh0cmFjdDx1aW50MTZfdD4oKSwgIiIpOwotICBBU1NFUlRfREVBVEgoYm91bmRzX3Rlc3QudGVtcGxhdGUgZXh0cmFjdDx1aW50MzJfdD4oKSwgIiIpOwotICBBU1NFUlRfREVBVEgoYm91bmRzX3Rlc3QudGVtcGxhdGUgZXh0cmFjdDx1aW50NjRfdD4oKSwgIiIpOwotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgZGVyZWZlcmVuY2VEZWF0aFRlc3QpIHsKLSAgYXV0byBkZXJlZmVyZW5jZV90ZXN0ID0gdGhpcy0+cGFja2V0LT5lbmQoKTsKLQotICBBU1NFUlRfREVBVEgoKmRlcmVmZXJlbmNlX3Rlc3QsICIiKTsKLSAgQVNTRVJUX0VRKDB4MWYsICooZGVyZWZlcmVuY2VfdGVzdCAtIDEpKTsKLX0KLQotVFlQRURfVEVTVChJdGVyYXRvclRlc3QsIHBsdXNFcVRlc3QpIHsKLSAgYXV0byBwbHVzX2VxID0gdGhpcy0+cGFja2V0LT5iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FsbC5zaXplKCk7IGkgKz0gMikgewotICAgIEFTU0VSVF9FUShjb3VudF9hbGxbaV0sICpwbHVzX2VxKSA8PCAiKz0gdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIGF0IGluZGV4ICIgPDwgaTsKLSAgICBwbHVzX2VxICs9IDI7Ci0gIH0KLX0KLQotVFlQRURfVEVTVChJdGVyYXRvclRlc3QsIHByZUluY3JlbWVudFRlc3QpIHsKLSAgYXV0byBwbHVzX3BsdXMgPSB0aGlzLT5wYWNrZXQtPmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnRfYWxsLnNpemUoKSAtIDE7IGkrKykgewotICAgIEFTU0VSVF9FUShjb3VudF9hbGxbaSArIDFdLCAqKCsrcGx1c19wbHVzKSkgPDwgIlByZS1pbmNyZW1lbnQgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJhdCBpbmRleCAiIDw8IGk7Ci0gIH0KLX0KLQotVFlQRURfVEVTVChJdGVyYXRvclRlc3QsIHBvc3RJbmNyZW1lbnRUZXN0KSB7Ci0gIGF1dG8gcGx1c19wbHVzID0gdGhpcy0+cGFja2V0LT5iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FsbC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShjb3VudF9hbGxbaV0sIHBsdXNfcGx1cy5vcGVyYXRvciooKSkKLSAgICAgICAgPDwgIlBvc3QtaW5jcmVtZW50IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCAiCi0gICAgICAgIDw8ICJhdCBpbmRleCAiIDw8IGk7Ci0gICAgcGx1c19wbHVzLm9wZXJhdG9yKysoKTsKLSAgfQotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgYWRkaXRpb25UZXN0KSB7Ci0gIGF1dG8gcGx1cyA9IHRoaXMtPnBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9hbGwuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoY291bnRfYWxsW2ldLCAqcGx1cykgPDwgIisgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIGF0IGluZGV4ICIgPDwgaTsKLSAgICBwbHVzID0gcGx1cyArIDE7Ci0gIH0KLX0KLQotVFlQRURfVEVTVChJdGVyYXRvclRlc3QsIG1pbnVzRXFUZXN0KSB7Ci0gIGF1dG8gbWludXNfZXEgPSB0aGlzLT5wYWNrZXQtPmVuZCgpOwotICBtaW51c19lcSAtPSAxOwotICBzaXplX3QgaW5kZXggPSBjb3VudF9hbGwuc2l6ZSgpIC0gMTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGluZGV4ID4gaTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGNvdW50X2FsbFtpbmRleF0sICptaW51c19lcSkKLSAgICAgICAgPDwgIi09IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCBhdCBpbmRleCAiIDw8IGluZGV4OwotICAgIGluZGV4IC09IGk7Ci0gICAgbWludXNfZXEgLT0gaTsKLSAgfQotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgcHJlRGVjcmVtZW50VGVzdCkgewotICBhdXRvIG1pbnVzX21pbnVzID0gdGhpcy0+cGFja2V0LT5lbmQoKTsKLSAgZm9yIChzaXplX3QgaSA9IGNvdW50X2FsbC5zaXplKCk7IGkgPiAwOyBpLS0pIHsKLSAgICBBU1NFUlRfRVEoY291bnRfYWxsW2kgLSAxXSwgKigtLW1pbnVzX21pbnVzKSkKLSAgICAgICAgPDwgIlByZS1kZWNyZW1lbnQgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICIKLSAgICAgICAgPDwgImF0IGluZGV4ICIgPDwgaTsKLSAgfQotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgcG9zdERlY3JlbWVudFRlc3QpIHsKLSAgYXV0byBtaW51c19taW51cyA9IHRoaXMtPnBhY2tldC0+ZW5kKCk7Ci0gIG1pbnVzX21pbnVzLm9wZXJhdG9yLS0oKTsKLSAgZm9yIChzaXplX3QgaSA9IGNvdW50X2FsbC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0gICAgQVNTRVJUX0VRKGNvdW50X2FsbFtpXSwgbWludXNfbWludXMub3BlcmF0b3IqKCkpCi0gICAgICAgIDw8ICJQb3N0LWRlY3JlbWVudCB0ZXN0OiBEZXJlZmVyZW5jZWQgaXRlcmF0b3IgZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgIgotICAgICAgICA8PCAiYXQgaW5kZXggIiA8PCBpOwotICAgIG1pbnVzX21pbnVzLm9wZXJhdG9yLS0oKTsKLSAgfQotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgc3VidHJhY3Rpb25UZXN0KSB7Ci0gIGF1dG8gbWludXMgPSB0aGlzLT5wYWNrZXQtPmVuZCgpOwotICBtaW51cyA9IG1pbnVzIC0gMTsKLSAgZm9yIChzaXplX3QgaSA9IGNvdW50X2FsbC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0gICAgQVNTRVJUX0VRKGNvdW50X2FsbFtpXSwgKm1pbnVzKSA8PCAiLSB0ZXN0OiBEZXJlZmVyZW5jZWQgaXRlcmF0b3IgZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgYXQgaW5kZXggIiA8PCBpOwotICAgIG1pbnVzID0gbWludXMgLSAxOwotICB9Ci19Ci0KLVRZUEVEX1RFU1QoSXRlcmF0b3JUZXN0LCBkaWZmZXJlbmNlVGVzdCkgewotICBhdXRvIGJlZ2luID0gdGhpcy0+cGFja2V0LT5iZWdpbigpOwotICBhdXRvIGVuZCA9IHRoaXMtPnBhY2tldC0+ZW5kKCk7Ci0gIGludCBkaWZmZXJlbmNlID0gZW5kIC0gYmVnaW47Ci0gIEFTU0VSVF9FUShkaWZmZXJlbmNlLCBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50X2FsbC5zaXplKCkpKTsKLSAgaW50IG5lZ19kaWZmZXJlbmNlID0gYmVnaW4gLSBlbmQ7Ci0gIEFTU0VSVF9FUShuZWdfZGlmZmVyZW5jZSwgLXN0YXRpY19jYXN0PGludD4oY291bnRfYWxsLnNpemUoKSkpOwotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgZXF1YWxpdHlUZXN0KSB7Ci0gIGF1dG8gYmVnaW4gPSB0aGlzLT5wYWNrZXQtPmJlZ2luKCk7Ci0gIGF1dG8gZW5kID0gdGhpcy0+cGFja2V0LT5lbmQoKTsKLSAgYXV0byBiZWdpbl9jb3B5ID0gdGhpcy0+cGFja2V0LT5iZWdpbigpOwotICBhdXRvIGVuZF9jb3B5ID0gdGhpcy0+cGFja2V0LT5lbmQoKTsKLSAgQVNTRVJUX0VRKGJlZ2luX2NvcHksIGJlZ2luKTsKLSAgQVNTRVJUX0VRKGVuZF9jb3B5LCBlbmQpOwotfQotCi1UWVBFRF9URVNUKEl0ZXJhdG9yVGVzdCwgY29tcGFyaXNvbnNUZXN0KSB7Ci0gIGF1dG8gYmVnaW4gPSB0aGlzLT5wYWNrZXQtPmJlZ2luKCk7Ci0gIGF1dG8gZW5kID0gdGhpcy0+cGFja2V0LT5lbmQoKTsKLSAgYXV0byBiZWdpbl9jb3B5ID0gdGhpcy0+cGFja2V0LT5iZWdpbigpOwotICBhdXRvIGVuZF9jb3B5ID0gdGhpcy0+cGFja2V0LT5lbmQoKTsKLSAgQVNTRVJUX0VRKGJlZ2luX2NvcHksIGJlZ2luKTsKLSAgQVNTRVJUX0VRKGVuZF9jb3B5LCBlbmQpOwotICBBU1NFUlRfTkUoYmVnaW4sIGVuZCk7Ci0gIEFTU0VSVF9UUlVFKGJlZ2luIDwgZW5kKTsKLSAgQVNTRVJUX0ZBTFNFKGVuZCA8IGVuZCk7Ci0gIEFTU0VSVF9GQUxTRShlbmQgPCBiZWdpbik7Ci0gIEFTU0VSVF9GQUxTRShiZWdpbiA+IGVuZCk7Ci0gIEFTU0VSVF9GQUxTRShlbmQgPiBlbmQpOwotICBBU1NFUlRfVFJVRShlbmQgPiBiZWdpbik7Ci0gIEFTU0VSVF9UUlVFKGJlZ2luIDw9IGVuZCk7Ci0gIEFTU0VSVF9UUlVFKGVuZCA8PSBlbmQpOwotICBBU1NFUlRfRkFMU0UoZW5kIDw9IGJlZ2luKTsKLSAgQVNTRVJUX0ZBTFNFKGJlZ2luID49IGVuZCk7Ci0gIEFTU0VSVF9UUlVFKGVuZCA+PSBlbmQpOwotICBBU1NFUlRfVFJVRShlbmQgPj0gYmVnaW4pOwotfQotCi1UWVBFRF9URVNUKFBhY2tldFZpZXdUZXN0LCBnZXRMZW5ndGhUZXN0KSB7Ci0gIHNpemVfdCBsZW5ndGggPSB0aGlzLT5wYWNrZXQtPnNpemUoKTsKLSAgQVNTRVJUX0VRKGxlbmd0aCwgY291bnRfYWxsLnNpemUoKSk7Ci19Ci0KLVRZUEVEX1RFU1QoUGFja2V0Vmlld1Rlc3QsIGdldEF0SW5kZXhUZXN0KSB7Ci0gIHNpemVfdCBwYXN0X2VuZCA9IHRoaXMtPnBhY2tldC0+c2l6ZSgpOwotICBBU1NFUlRfREVBVEgodGhpcy0+cGFja2V0LT5hdChwYXN0X2VuZCksICIiKTsKLSAgc2l6ZV90IHdvcmtpbmdfaW5kZXggPSAweDFmOwotICBBU1NFUlRfRVEoMHgxZiwgdGhpcy0+cGFja2V0LT5hdCh3b3JraW5nX2luZGV4KSk7Ci19Ci0KLVRZUEVEX1RFU1QoUGFja2V0Vmlld1Rlc3QsIGFycmF5T3BlcmF0b3JUZXN0KSB7Ci0gIHNpemVfdCBwYXN0X2VuZCA9IHRoaXMtPnBhY2tldC0+c2l6ZSgpOwotICBBU1NFUlRfREVBVEgoKCoodGhpcy0+cGFja2V0KSlbcGFzdF9lbmRdLCAiIik7Ci0gIHNpemVfdCB3b3JraW5nX2luZGV4ID0gMHgxZjsKLSAgQVNTRVJUX0VRKDB4MWYsICgqKHRoaXMtPnBhY2tldCkpW3dvcmtpbmdfaW5kZXhdKTsKLX0KLQotVFlQRURfVEVTVChJdGVyYXRvclRlc3QsIG51bUJ5dGVzUmVtYWluaW5nVGVzdCkgewotICBhdXRvIGFsbCA9IHRoaXMtPnBhY2tldC0+YmVnaW4oKTsKLSAgc2l6ZV90IHJlbWFpbmluZyA9IGFsbC5OdW1CeXRlc1JlbWFpbmluZygpOwotICBmb3IgKHNpemVfdCBuID0gcmVtYWluaW5nOyBuID4gMDsgbi0tKSB7Ci0gICAgQVNTRVJUX0VRKHJlbWFpbmluZywgYWxsLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICAgIGFsbC5vcGVyYXRvcisrKCk7Ci0gICAgcmVtYWluaW5nLS07Ci0gIH0KLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMCksIGFsbC5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgYWxsLm9wZXJhdG9yKysoKTsKLSAgQVNTRVJUX0RFQVRIKGFsbC5vcGVyYXRvciooKSwgIiIpOwotICBhbGwub3BlcmF0b3IrKygpOwotICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSwgYWxsLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBhbGwub3BlcmF0b3IrKygpOwotICBBU1NFUlRfREVBVEgoYWxsLm9wZXJhdG9yKigpLCAiIik7Ci19Ci0KLVRZUEVEX1RFU1QoSXRlcmF0b3JUZXN0LCBzdWJyYW5nZVRlc3QpIHsKLSAgYXV0byBlbXB0eSA9IHRoaXMtPnBhY2tldC0+YmVnaW4oKS5TdWJyYW5nZSgwLCAwKTsKLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMCksIGVtcHR5Lk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBBU1NFUlRfREVBVEgoKmVtcHR5LCAiIik7Ci0KLSAgZW1wdHkgPSB0aGlzLT5wYWNrZXQtPmJlZ2luKCkuU3VicmFuZ2UodGhpcy0+cGFja2V0LT5zaXplKCksIDEpOwotICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSwgZW1wdHkuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9ERUFUSCgqZW1wdHksICIiKTsKLQotICBhdXRvIGFsbCA9IHRoaXMtPnBhY2tldC0+YmVnaW4oKTsKLSAgYXV0byBmdWxscmFuZ2UgPSBhbGwuU3VicmFuZ2UoMCwgYWxsLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBBU1NFUlRfRVEoYWxsLk51bUJ5dGVzUmVtYWluaW5nKCksIGZ1bGxyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCooYWxsICsgMSksIDEpOwotCi0gIGZ1bGxyYW5nZSA9IGFsbC5TdWJyYW5nZSgwLCBhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSArIDEpOwotICBBU1NFUlRfRVEoYWxsLk51bUJ5dGVzUmVtYWluaW5nKCksIGZ1bGxyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCooYWxsICsgMSksIDEpOwotCi0gIGZ1bGxyYW5nZSA9IGFsbC5TdWJyYW5nZSgwLCBhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSArIDEwKTsKLSAgQVNTRVJUX0VRKGFsbC5OdW1CeXRlc1JlbWFpbmluZygpLCBmdWxscmFuZ2UuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUSgqKGFsbCArIDEpLCAxKTsKLQotICBhdXRvIHN1YnJhbmdlID0gYWxsLlN1YnJhbmdlKDAsIDEpOwotICBBU1NFUlRfRVEoMSwgc3VicmFuZ2UuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUSgqKHN1YnJhbmdlKSwgMCk7Ci0KLSAgc3VicmFuZ2UgPSB0aGlzLT5wYWNrZXQtPmJlZ2luKCkuU3VicmFuZ2UoMCwgNCk7Ci0gIEFTU0VSVF9FUSg0LCBzdWJyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCooc3VicmFuZ2UgKyAxKSwgMSk7Ci0KLSAgc3VicmFuZ2UgPSBhbGwuU3VicmFuZ2UoMCwgMyk7Ci0gIEFTU0VSVF9FUSgzLCBzdWJyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCooc3VicmFuZ2UgKyAxKSwgMSk7Ci0KLSAgc3VicmFuZ2UgPSBhbGwuU3VicmFuZ2UoMCwgYWxsLk51bUJ5dGVzUmVtYWluaW5nKCkgLSAxKTsKLSAgQVNTRVJUX0VRKGFsbC5OdW1CeXRlc1JlbWFpbmluZygpIC0gMSwgc3VicmFuZ2UuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUSgqKHN1YnJhbmdlICsgMSksIDEpOwotCi0gIHN1YnJhbmdlID0gYWxsLlN1YnJhbmdlKDAsIGFsbC5OdW1CeXRlc1JlbWFpbmluZygpIC0gMik7Ci0gIEFTU0VSVF9FUShhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSAtIDIsIHN1YnJhbmdlLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBBU1NFUlRfRVEoKihzdWJyYW5nZSArIDEpLCAxKTsKLQotICBzdWJyYW5nZSA9IGFsbC5TdWJyYW5nZSgxLCBhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUShhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSAtIDEsIHN1YnJhbmdlLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBBU1NFUlRfRVEoKnN1YnJhbmdlLCAxKTsKLQotICBzdWJyYW5nZSA9IGFsbC5TdWJyYW5nZSgyLCBhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUShhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSAtIDIsIHN1YnJhbmdlLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBBU1NFUlRfRVEoKnN1YnJhbmdlLCAyKTsKLQotICBzdWJyYW5nZSA9IGFsbC5TdWJyYW5nZSgxLCBhbGwuTnVtQnl0ZXNSZW1haW5pbmcoKSAtIDEpOwotICBBU1NFUlRfRVEoYWxsLk51bUJ5dGVzUmVtYWluaW5nKCkgLSAxLCBzdWJyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCpzdWJyYW5nZSwgMSk7Ci0KLSAgc3VicmFuZ2UgPSBhbGwuU3VicmFuZ2UoMiwgYWxsLk51bUJ5dGVzUmVtYWluaW5nKCkgLSAyKTsKLSAgQVNTRVJUX0VRKGFsbC5OdW1CeXRlc1JlbWFpbmluZygpIC0gMiwgc3VicmFuZ2UuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUSgqc3VicmFuZ2UsIDIpOwotCi0gIHN1YnJhbmdlID0gYWxsLlN1YnJhbmdlKDEsIDEpOwotICBBU1NFUlRfRVEoMSwgc3VicmFuZ2UuTnVtQnl0ZXNSZW1haW5pbmcoKSk7Ci0gIEFTU0VSVF9FUSgqKHN1YnJhbmdlKSwgMSk7Ci0KLSAgc3VicmFuZ2UgPSBhbGwuU3VicmFuZ2UoMSwgMik7Ci0gIEFTU0VSVF9FUSgyLCBzdWJyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCooc3VicmFuZ2UpLCAxKTsKLQotICBzdWJyYW5nZSA9IGFsbC5TdWJyYW5nZSgyLCAxKTsKLSAgQVNTRVJUX0VRKDEsIHN1YnJhbmdlLk51bUJ5dGVzUmVtYWluaW5nKCkpOwotICBBU1NFUlRfRVEoKihzdWJyYW5nZSksIDIpOwotCi0gIHN1YnJhbmdlID0gdGhpcy0+cGFja2V0LT5iZWdpbigpLlN1YnJhbmdlKHRoaXMtPnBhY2tldC0+c2l6ZSgpIC0gMSwgMik7Ci0gIEFTU0VSVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDEpLCBzdWJyYW5nZS5OdW1CeXRlc1JlbWFpbmluZygpKTsKLSAgQVNTRVJUX0VRKCooc3VicmFuZ2UpLCB0aGlzLT5wYWNrZXQtPnNpemUoKSAtIDEpOwotfQotCi11c2luZyBTdWJ2aWV3VGVzdFBhcmFtID0gc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PjsKLWNsYXNzIFN1YnZpZXdCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U3Vidmlld1Rlc3RQYXJhbT4gewotIHB1YmxpYzoKLSAgY2xhc3MgU3ViUGFja2V0VmlldyA6IHB1YmxpYyBQYWNrZXRWaWV3PHRydWU+IHsKLSAgIHB1YmxpYzoKLSAgICB1c2luZyBQYWNrZXRWaWV3PHRydWU+OjpQYWNrZXRWaWV3OwotICAgIFBhY2tldFZpZXc8dHJ1ZT4gU2xpY2Uoc2l6ZV90IGhlYWRlciwgc2l6ZV90IHRhaWwpIHsKLSAgICAgIHJldHVybiBQYWNrZXRWaWV3PHRydWU+OjpHZXRMaXR0bGVFbmRpYW5TdWJ2aWV3KGhlYWRlciwgdGFpbCk7Ci0gICAgfQotICB9OwotfTsKLQotY2xhc3MgU3Vidmlld1Bhc3NUZXN0IDogcHVibGljIFN1YnZpZXdCYXNlVGVzdCB7fTsKLQotVEVTVF9QKFN1YnZpZXdQYXNzVGVzdCwgc3Vidmlld1Rlc3QpIHsKLSAgYXV0byBoZWFkZXIgPSBHZXRQYXJhbSgpLmZpcnN0OwotICBhdXRvIHRhaWwgPSBHZXRQYXJhbSgpLnNlY29uZDsKLSAgU3ViUGFja2V0VmlldyBzaW5nbGVfdmlldyh7VmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfYWxsKSwgMCwgY291bnRfYWxsLnNpemUoKSl9KTsKLSAgU3ViUGFja2V0VmlldyBtdWx0aV92aWV3KHsKLSAgICAgIFZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50XzEpLCAwLCBjb3VudF8xLnNpemUoKSksCi0gICAgICBWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF8yKSwgMCwgY291bnRfMi5zaXplKCkpLAotICAgICAgVmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfMyksIDAsIGNvdW50XzMuc2l6ZSgpKSwKLSAgfSk7Ci0KLSAgYXV0byBzaW5nbGVfc2xpY2UgPSBzaW5nbGVfdmlldy5TbGljZShoZWFkZXIsIHRhaWwpOwotICBhdXRvIG11bHRpX3NsaWNlID0gbXVsdGlfdmlldy5TbGljZShoZWFkZXIsIHRhaWwpOwotCi0gIEFTU0VSVF9FUShzaW5nbGVfc2xpY2Uuc2l6ZSgpLCB0YWlsIC0gaGVhZGVyKTsKLSAgQVNTRVJUX0VRKHNpbmdsZV9zbGljZS5zaXplKCksIG11bHRpX3NsaWNlLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2luZ2xlX3NsaWNlLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHNpbmdsZV9zbGljZVtpXSwgbXVsdGlfc2xpY2VbaV0pOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgYm91bmRhcnlfMSA9IGNvdW50XzEuc2l6ZSgpOwotc3RhdGljIGNvbnN0IHNpemVfdCBib3VuZGFyeV8yID0gY291bnRfMS5zaXplKCkgKyBjb3VudF8yLnNpemUoKTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCi0gICAgY2hvcG9tYXRpYywgU3Vidmlld1Bhc3NUZXN0LAotICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICAvLyB7YmVnaW4sIGVuZH0gcGFpcnMgZm9yIHN1YnNldHMgaW50byB0aGUgUGFja2V0VmlldwotICAgICAgICBTdWJ2aWV3VGVzdFBhcmFtezAsIDB9LCBTdWJ2aWV3VGVzdFBhcmFtezAsIGJvdW5kYXJ5XzF9LCBTdWJ2aWV3VGVzdFBhcmFtezAsIGJvdW5kYXJ5XzEgKyAxfSwKLSAgICAgICAgU3Vidmlld1Rlc3RQYXJhbXswLCBib3VuZGFyeV8yfSwgU3Vidmlld1Rlc3RQYXJhbXswLCBib3VuZGFyeV8yICsgMX0sIFN1YnZpZXdUZXN0UGFyYW17MCwgY291bnRfYWxsLnNpemUoKX0sCi0gICAgICAgIFN1YnZpZXdUZXN0UGFyYW17Ym91bmRhcnlfMSAtIDEsIGJvdW5kYXJ5XzF9LCBTdWJ2aWV3VGVzdFBhcmFte2JvdW5kYXJ5XzEgLSAxLCBib3VuZGFyeV8xICsgMX0sCi0gICAgICAgIFN1YnZpZXdUZXN0UGFyYW17Ym91bmRhcnlfMSAtIDEsIGJvdW5kYXJ5XzJ9LCBTdWJ2aWV3VGVzdFBhcmFte2JvdW5kYXJ5XzEgLSAxLCBib3VuZGFyeV8yICsgMX0sCi0gICAgICAgIFN1YnZpZXdUZXN0UGFyYW17Ym91bmRhcnlfMSAtIDEsIGNvdW50X2FsbC5zaXplKCl9LCBTdWJ2aWV3VGVzdFBhcmFte2JvdW5kYXJ5XzEsIGJvdW5kYXJ5XzF9LAotICAgICAgICBTdWJ2aWV3VGVzdFBhcmFte2JvdW5kYXJ5XzEsIGJvdW5kYXJ5XzJ9LCBTdWJ2aWV3VGVzdFBhcmFte2JvdW5kYXJ5XzEsIGJvdW5kYXJ5XzIgKyAxfSwKLSAgICAgICAgU3Vidmlld1Rlc3RQYXJhbXtib3VuZGFyeV8xLCBjb3VudF9hbGwuc2l6ZSgpfSwgU3Vidmlld1Rlc3RQYXJhbXtib3VuZGFyeV8yIC0gMSwgYm91bmRhcnlfMn0sCi0gICAgICAgIFN1YnZpZXdUZXN0UGFyYW17Ym91bmRhcnlfMiAtIDEsIGJvdW5kYXJ5XzIgKyAxfSwgU3Vidmlld1Rlc3RQYXJhbXtib3VuZGFyeV8yIC0gMSwgY291bnRfYWxsLnNpemUoKX0sCi0gICAgICAgIFN1YnZpZXdUZXN0UGFyYW17Ym91bmRhcnlfMiwgYm91bmRhcnlfMn0sIFN1YnZpZXdUZXN0UGFyYW17Ym91bmRhcnlfMiwgYm91bmRhcnlfMiArIDF9LAotICAgICAgICBTdWJ2aWV3VGVzdFBhcmFte2JvdW5kYXJ5XzIsIGNvdW50X2FsbC5zaXplKCl9LCBTdWJ2aWV3VGVzdFBhcmFte2NvdW50X2FsbC5zaXplKCkgLSAxLCBjb3VudF9hbGwuc2l6ZSgpfSwKLSAgICAgICAgU3Vidmlld1Rlc3RQYXJhbXtjb3VudF9hbGwuc2l6ZSgpLCBjb3VudF9hbGwuc2l6ZSgpfSkpOwotCi1jbGFzcyBTdWJ2aWV3RGVhdGhUZXN0IDogcHVibGljIFN1YnZpZXdCYXNlVGVzdCB7fTsKLQotVEVTVF9QKFN1YnZpZXdEZWF0aFRlc3QsIHN1YnZpZXdEZWF0aFRlc3QpIHsKLSAgYXV0byBoZWFkZXIgPSBHZXRQYXJhbSgpLmZpcnN0OwotICBhdXRvIHRhaWwgPSBHZXRQYXJhbSgpLnNlY29uZDsKLSAgU3ViUGFja2V0VmlldyBzaW5nbGVfdmlldyh7VmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfYWxsKSwgMCwgY291bnRfYWxsLnNpemUoKSl9KTsKLSAgU3ViUGFja2V0VmlldyBtdWx0aV92aWV3KHsKLSAgICAgIFZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50XzEpLCAwLCBjb3VudF8xLnNpemUoKSksCi0gICAgICBWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF8yKSwgMCwgY291bnRfMi5zaXplKCkpLAotICAgICAgVmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfMyksIDAsIGNvdW50XzMuc2l6ZSgpKSwKLSAgfSk7Ci0KLSAgQVNTRVJUX0RFQVRIKGF1dG8gc2luZ2xlX3NsaWNlID0gc2luZ2xlX3ZpZXcuU2xpY2UoaGVhZGVyLCB0YWlsKSwgIiIpOwotICBBU1NFUlRfREVBVEgoYXV0byBtdWx0aV9zbGljZSA9IG11bHRpX3ZpZXcuU2xpY2UoaGVhZGVyLCB0YWlsKSwgIiIpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChjaG9wb21hdGljRGVhdGgsIFN1YnZpZXdEZWF0aFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB7YmVnaW4sIGVuZH0gcGFpcnMgZm9yIHN1YnNldHMgaW50byB0aGUgUGFja2V0VmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnZpZXdUZXN0UGFyYW17MSwgMH0sIFN1YnZpZXdUZXN0UGFyYW17Y291bnRfYWxsLnNpemUoKSwgY291bnRfYWxsLnNpemUoKSAtIDF9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnZpZXdUZXN0UGFyYW17Y291bnRfYWxsLnNpemUoKSwgY291bnRfYWxsLnNpemUoKSArIDF9KSk7Ci0KLVRFU1QoU3Vidmlld1Rlc3QsIHNpbXBsZVN1YnZpZXdUZXN0KSB7Ci0gIFBhY2tldFZpZXc8dHJ1ZT4gdmlldyh7VmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfYWxsKSwgMCwgY291bnRfYWxsLnNpemUoKSl9KTsKLSAgUGFja2V0Vmlldzx0cnVlPiBzdWJfMV92aWV3ID0gdmlldy5HZXRMaXR0bGVFbmRpYW5TdWJ2aWV3KDAsIHZpZXcuc2l6ZSgpKTsKLSAgUGFja2V0Vmlldzx0cnVlPiBzdWJfMl92aWV3ID0gc3ViXzFfdmlldy5HZXRMaXR0bGVFbmRpYW5TdWJ2aWV3KDAsIHN1Yl8xX3ZpZXcuc2l6ZSgpKTsKLSAgUGFja2V0Vmlldzx0cnVlPiBzdWJfM192aWV3ID0gc3ViXzJfdmlldy5HZXRMaXR0bGVFbmRpYW5TdWJ2aWV3KDAsIHN1Yl8yX3ZpZXcuc2l6ZSgpKTsKLSAgUGFja2V0Vmlldzx0cnVlPiBzdWJfNF92aWV3ID0gc3ViXzNfdmlldy5HZXRMaXR0bGVFbmRpYW5TdWJ2aWV3KDAsIHN1Yl8zX3ZpZXcuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKHN1Yl8xX3ZpZXcuc2l6ZSgpLCB2aWV3LnNpemUoKSk7Ci0gIEFTU0VSVF9FUShzdWJfMl92aWV3LnNpemUoKSwgdmlldy5zaXplKCkpOwotICBBU1NFUlRfRVEoc3ViXzNfdmlldy5zaXplKCksIHZpZXcuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKHN1Yl80X3ZpZXcuc2l6ZSgpLCB2aWV3LnNpemUoKSk7Ci19Ci0KLVRFU1QoU3Vidmlld1Rlc3QsIHJlYWxTdWJ2aWV3VGVzdCkgewotICBQYWNrZXRWaWV3PHRydWU+IHZpZXcoe1ZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50X2FsbCksIDAsIGNvdW50X2FsbC5zaXplKCkpfSk7Ci0gIHN0ZDo6dmVjdG9yPFBhY2tldFZpZXc8dHJ1ZT4+IHN1Yl92aWV3c3t2aWV3fTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICBzaXplX3QgcGFyZW50X3NpemUgPSBzdWJfdmlld3NbaSAtIDFdLnNpemUoKTsKLSAgICBzdWJfdmlld3MucHVzaF9iYWNrKHN1Yl92aWV3c1tpIC0gMV0uR2V0TGl0dGxlRW5kaWFuU3VidmlldygxLCBwYXJlbnRfc2l6ZSAtIDEpKTsKLSAgICBBU1NFUlRfRVEoc3ViX3ZpZXdzW2ldWzBdLCBpKTsKLSAgICBBU1NFUlRfRVEoc3ViX3ZpZXdzW2ldLnNpemUoKSwgcGFyZW50X3NpemUgLSAyKTsKLSAgfQotfQotCi1URVNUKFN1YnZpZXdUZXN0LCBzdWJTdWJ2aWV3VGVzdCkgewotICBQYWNrZXRWaWV3PHRydWU+IHNpbmdsZV92aWV3KHtWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCAwLCBjb3VudF9hbGwuc2l6ZSgpKX0pOwotICBQYWNrZXRWaWV3PHRydWU+IG11bHRpX3ZpZXcoewotICAgICAgVmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfMSksIDAsIGNvdW50XzEuc2l6ZSgpKSwKLSAgICAgIFZpZXcoc3RkOjptYWtlX3NoYXJlZDxjb25zdCB2ZWN0b3I8dWludDhfdD4+KGNvdW50XzIpLCAwLCBjb3VudF8yLnNpemUoKSksCi0gICAgICBWaWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF8zKSwgMCwgY291bnRfMy5zaXplKCkpLAotICB9KTsKLSAgQVNTRVJUX0VRKHNpbmdsZV92aWV3LnNpemUoKSwgbXVsdGlfdmlldy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FsbC5zaXplKCkgLyAyOyBpKyspIHsKLSAgICBQYWNrZXRWaWV3PHRydWU+IHN1Yl9zaW5nbGVfdmlldyA9IHNpbmdsZV92aWV3LkdldExpdHRsZUVuZGlhblN1YnZpZXcoaSwgY291bnRfYWxsLnNpemUoKSAtIGkpOwotICAgIFBhY2tldFZpZXc8dHJ1ZT4gc3ViX211bHRpX3ZpZXcgPSBtdWx0aV92aWV3LkdldExpdHRsZUVuZGlhblN1YnZpZXcoaSwgY291bnRfYWxsLnNpemUoKSAtIGkpOwotICAgIEFTU0VSVF9FUShjb3VudF9hbGwuc2l6ZSgpIC0gMiAqIGksIHN1Yl9zaW5nbGVfdmlldy5zaXplKCkpOwotICAgIEFTU0VSVF9FUShzdWJfc2luZ2xlX3ZpZXcuc2l6ZSgpLCBzdWJfbXVsdGlfdmlldy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc3ViX3NpbmdsZV92aWV3LnNpemUoKSAvIDI7IGorKykgewotICAgICAgUGFja2V0Vmlldzx0cnVlPiBzdWJfc3ViX3NpbmdsZV92aWV3ID0gc3ViX3NpbmdsZV92aWV3LkdldExpdHRsZUVuZGlhblN1YnZpZXcoaiwgc3ViX3NpbmdsZV92aWV3LnNpemUoKSAtIGopOwotICAgICAgUGFja2V0Vmlldzx0cnVlPiBzdWJfc3ViX211bHRpX3ZpZXcgPSBzdWJfbXVsdGlfdmlldy5HZXRMaXR0bGVFbmRpYW5TdWJ2aWV3KGosIHN1Yl9tdWx0aV92aWV3LnNpemUoKSAtIGopOwotICAgICAgQVNTRVJUX0VRKHN1Yl9zaW5nbGVfdmlldy5zaXplKCkgLSAyICogaiwgc3ViX3N1Yl9zaW5nbGVfdmlldy5zaXplKCkpOwotICAgICAgQVNTRVJUX0VRKHN1Yl9zdWJfc2luZ2xlX3ZpZXcuc2l6ZSgpLCBzdWJfc3ViX211bHRpX3ZpZXcuc2l6ZSgpKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFBhY2tldFZpZXdNdWx0aVZpZXdUZXN0LCBzaXplVGVzdCkgewotICBBU1NFUlRfRVEoc2luZ2xlX3ZpZXcuc2l6ZSgpLCBtdWx0aV92aWV3LnNpemUoKSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRWaWV3TXVsdGlWaWV3VGVzdCwgZGVyZWZlcmVuY2VUZXN0TGl0dGxlRW5kaWFuKSB7Ci0gIGF1dG8gc2luZ2xlX2l0ciA9IHNpbmdsZV92aWV3LmJlZ2luKCk7Ci0gIGF1dG8gbXVsdGlfaXRyID0gbXVsdGlfdmlldy5iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpbmdsZV92aWV3LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHNpbmdsZV9pdHIub3BlcmF0b3IqKCksIG11bHRpX2l0ci5vcGVyYXRvciooKSk7Ci0gICAgc2luZ2xlX2l0ci5vcGVyYXRvcisrKCk7Ci0gICAgbXVsdGlfaXRyLm9wZXJhdG9yKysoKTsKLSAgfQotICBBU1NFUlRfREVBVEgoKm11bHRpX2l0ciwgIiIpOwotfQotCi1URVNUX0YoUGFja2V0Vmlld011bHRpVmlld1Rlc3QsIGRlcmVmZXJlbmNlVGVzdEJpZ0VuZGlhbikgewotICBhdXRvIHNpbmdsZV9pdHIgPSBzaW5nbGVfdmlldy5iZWdpbigpOwotICBhdXRvIG11bHRpX2l0ciA9IG11bHRpX3ZpZXcuYmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaW5nbGVfdmlldy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShzaW5nbGVfaXRyLm9wZXJhdG9yKigpLCBtdWx0aV9pdHIub3BlcmF0b3IqKCkpOwotICAgIHNpbmdsZV9pdHIub3BlcmF0b3IrKygpOwotICAgIG11bHRpX2l0ci5vcGVyYXRvcisrKCk7Ci0gIH0KLSAgQVNTRVJUX0RFQVRIKCptdWx0aV9pdHIsICIiKTsKLX0KLQotVEVTVF9GKFBhY2tldFZpZXdNdWx0aVZpZXdUZXN0LCBhcnJheU9wZXJhdG9yVGVzdCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpbmdsZV92aWV3LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHNpbmdsZV92aWV3W2ldLCBtdWx0aV92aWV3W2ldKTsKLSAgfQotICBBU1NFUlRfREVBVEgobXVsdGlfdmlld1tzaW5nbGVfdmlldy5zaXplKCldLCAiIik7Ci19Ci0KLVRFU1RfRihQYWNrZXRWaWV3TXVsdGlWaWV3QXBwZW5kVGVzdCwgc2l6ZVRlc3RBcHBlbmQpIHsKLSAgQVNTRVJUX0VRKHNpbmdsZV92aWV3LnNpemUoKSwgbXVsdGlfdmlldy5zaXplKCkpOwotfQotCi1URVNUX0YoUGFja2V0Vmlld011bHRpVmlld0FwcGVuZFRlc3QsIGRlcmVmZXJlbmNlVGVzdExpdHRsZUVuZGlhbkFwcGVuZCkgewotICBhdXRvIHNpbmdsZV9pdHIgPSBzaW5nbGVfdmlldy5iZWdpbigpOwotICBhdXRvIG11bHRpX2l0ciA9IG11bHRpX3ZpZXcuYmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaW5nbGVfdmlldy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShzaW5nbGVfaXRyLm9wZXJhdG9yKigpLCBtdWx0aV9pdHIub3BlcmF0b3IqKCkpOwotICAgIHNpbmdsZV9pdHIub3BlcmF0b3IrKygpOwotICAgIG11bHRpX2l0ci5vcGVyYXRvcisrKCk7Ci0gIH0KLSAgQVNTRVJUX0RFQVRIKCptdWx0aV9pdHIsICIiKTsKLX0KLQotVEVTVF9GKFBhY2tldFZpZXdNdWx0aVZpZXdBcHBlbmRUZXN0LCBkZXJlZmVyZW5jZVRlc3RCaWdFbmRpYW5BcHBlbmQpIHsKLSAgYXV0byBzaW5nbGVfaXRyID0gc2luZ2xlX3ZpZXcuYmVnaW4oKTsKLSAgYXV0byBtdWx0aV9pdHIgPSBtdWx0aV92aWV3LmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2luZ2xlX3ZpZXcuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoc2luZ2xlX2l0ci5vcGVyYXRvciooKSwgbXVsdGlfaXRyLm9wZXJhdG9yKigpKTsKLSAgICBzaW5nbGVfaXRyLm9wZXJhdG9yKysoKTsKLSAgICBtdWx0aV9pdHIub3BlcmF0b3IrKygpOwotICB9Ci0gIEFTU0VSVF9ERUFUSCgqbXVsdGlfaXRyLCAiIik7Ci19Ci0KLVRFU1RfRihQYWNrZXRWaWV3TXVsdGlWaWV3QXBwZW5kVGVzdCwgYXJyYXlPcGVyYXRvclRlc3RBcHBlbmQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaW5nbGVfdmlldy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShzaW5nbGVfdmlld1tpXSwgbXVsdGlfdmlld1tpXSk7Ci0gIH0KLSAgQVNTRVJUX0RFQVRIKG11bHRpX3ZpZXdbc2luZ2xlX3ZpZXcuc2l6ZSgpXSwgIiIpOwotfQotCi1URVNUKFZpZXdUZXN0LCBhcnJheU9wZXJhdG9yVGVzdCkgewotICBWaWV3IHZpZXdfYWxsKHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCAwLCBjb3VudF9hbGwuc2l6ZSgpKTsKLSAgc2l6ZV90IHBhc3RfZW5kID0gdmlld19hbGwuc2l6ZSgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhc3RfZW5kOyBpKyspIHsKLSAgICBBU1NFUlRfRVEodmlld19hbGxbaV0sIGNvdW50X2FsbFtpXSk7Ci0gIH0KLSAgQVNTRVJUX0RFQVRIKHZpZXdfYWxsW3Bhc3RfZW5kXSwgIiIpOwotCi0gIHNpemVfdCBoZWFkZXJfc2l6ZSA9IDI7Ci0gIHNpemVfdCB0YWlsX3NpemUgPSAzOwotICBWaWV3IHZpZXdfc3Vic2V0KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCBoZWFkZXJfc2l6ZSwgY291bnRfYWxsLnNpemUoKSAtIHRhaWxfc2l6ZSk7Ci0gIFZpZXcgdmlld19zdWJzZXQyKHZpZXdfYWxsLCBoZWFkZXJfc2l6ZSwgY291bnRfYWxsLnNpemUoKSAtIHRhaWxfc2l6ZSk7Ci0gIHNpemVfdCBzdWJzZXRfbGVuZ3RoID0gdmlld19zdWJzZXQuc2l6ZSgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YnNldF9sZW5ndGg7IGkrKykgewotICAgIEFTU0VSVF9FUSh2aWV3X3N1YnNldFtpXSwgY291bnRfYWxsW2hlYWRlcl9zaXplICsgaV0pOwotICAgIEFTU0VSVF9FUSh2aWV3X3N1YnNldFtpXSwgdmlld19zdWJzZXQyW2ldKTsKLSAgfQotICBBU1NFUlRfREVBVEgodmlld19zdWJzZXRbc3Vic2V0X2xlbmd0aCArIDFdLCAiIik7Ci0gIEFTU0VSVF9ERUFUSCh2aWV3X3N1YnNldDJbc3Vic2V0X2xlbmd0aCArIDFdLCAiIik7Ci19Ci0KLVRFU1QoVmlld1Rlc3QsIGVhcmx5U3ViU3Vidmlld1Rlc3QpIHsKLSAgVmlldyB2aWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCAwLCBjb3VudF9hbGwuc2l6ZSgpKTsKLSAgVmlldyBzdWJfMV92aWV3KHZpZXcsIHZpZXcuc2l6ZSgpIC0gMywgdmlldy5zaXplKCkgLSAxKTsKLSAgVmlldyBzdWJfMl92aWV3KHN1Yl8xX3ZpZXcsIDEsIDIpOwotICBBU1NFUlRfRVEoc3ViXzFfdmlldy5zaXplKCksIDJ1KTsKLSAgQVNTRVJUX0VRKHN1Yl8yX3ZpZXcuc2l6ZSgpLCAxdSk7Ci19Ci0KLVRFU1QoVmlld1Rlc3QsIHN1YlN1YnZpZXdUZXN0KSB7Ci0gIFZpZXcgdmlldyhzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IHZlY3Rvcjx1aW50OF90Pj4oY291bnRfYWxsKSwgMCwgY291bnRfYWxsLnNpemUoKSk7Ci0gIHN0ZDo6dmVjdG9yPFZpZXc+IHN1Yl92aWV3c3t2aWV3fTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICBzaXplX3QgcGFyZW50X3NpemUgPSBzdWJfdmlld3NbaSAtIDFdLnNpemUoKTsKLSAgICBzdWJfdmlld3MucHVzaF9iYWNrKHtWaWV3KHN1Yl92aWV3c1tpIC0gMV0sIDEsIHBhcmVudF9zaXplIC0gMSl9KTsKLSAgICBBU1NFUlRfRVEoc3ViX3ZpZXdzW2ldWzBdLCBpKTsKLSAgICBBU1NFUlRfRVEoc3ViX3ZpZXdzW2ldLnNpemUoKSwgcGFyZW50X3NpemUgLSAyKTsKLSAgfQotfQotCi1URVNUKFZpZXdUZXN0LCB6ZXJvU3Vidmlld1Rlc3QpIHsKLSAgVmlldyB2aWV3KHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgdmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hbGwpLCAwLCBjb3VudF9hbGwuc2l6ZSgpKTsKLSAgVmlldyBzdWJ2aWV3KHZpZXcsIHZpZXcuc2l6ZSgpLCB2aWV3LnNpemUoKSArIDEpOwotICBBU1NFUlRfRVEoc3Vidmlldy5zaXplKCksIDB1KTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvQW5kcm9pZC5icCBiL2dkL3BhY2tldC9wYXJzZXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0ZTQ3ZC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19iaW5hcnlfaG9zdCB7Ci0gICAgbmFtZTogImJsdWV0b290aF9wYWNrZXRnZW4iLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZpZWxkcy9hcnJheV9maWVsZC5jYyIsCi0gICAgICAgICJmaWVsZHMvdmVjdG9yX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9ib2R5X2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9jaGVja3N1bV9maWVsZC5jYyIsCi0gICAgICAgICJmaWVsZHMvY2hlY2tzdW1fc3RhcnRfZmllbGQuY2MiLAotICAgICAgICAiZmllbGRzL2NvdW50X2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9jdXN0b21fZmllbGQuY2MiLAotICAgICAgICAiZmllbGRzL2N1c3RvbV9maWVsZF9maXhlZF9zaXplLmNjIiwKLSAgICAgICAgImZpZWxkcy9lbnVtX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9maXhlZF9lbnVtX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9maXhlZF9maWVsZC5jYyIsCi0gICAgICAgICJmaWVsZHMvZml4ZWRfc2NhbGFyX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9ncm91cF9maWVsZC5jYyIsCi0gICAgICAgICJmaWVsZHMvcGFja2V0X2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9wYWRkaW5nX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9wYXlsb2FkX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9yZXNlcnZlZF9maWVsZC5jYyIsCi0gICAgICAgICJmaWVsZHMvc2NhbGFyX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9zaXplX2ZpZWxkLmNjIiwKLSAgICAgICAgImZpZWxkcy9zdHJ1Y3RfZmllbGQuY2MiLAotICAgICAgICAiZmllbGRzL3ZhcmlhYmxlX2xlbmd0aF9zdHJ1Y3RfZmllbGQuY2MiLAotICAgICAgICAiY2hlY2tzdW1fZGVmLmNjIiwKLSAgICAgICAgImN1c3RvbV9maWVsZF9kZWYuY2MiLAotICAgICAgICAiZW51bV9kZWYuY2MiLAotICAgICAgICAiZW51bV9nZW4uY2MiLAotICAgICAgICAicGFja2V0X2RlZi5jYyIsCi0gICAgICAgICJwYXJlbnRfZGVmLmNjIiwKLSAgICAgICAgInN0cnVjdF9kZWYuY2MiLAotICAgICAgICAic3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuY2MiLAotICAgICAgICAibWFpbi5jYyIsCi0gICAgICAgICJsYW5ndWFnZV95Lnl5IiwKLSAgICAgICAgImxhbmd1YWdlX2wubGwiLAotICAgICAgICAiZ2VuX2NwcC5jYyIsCi0gICAgICAgICJnZW5fcnVzdC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYysrZnMiLAotICAgIF0sCi0gICAgeWFjYzogewotICAgICAgICBnZW5fbG9jYXRpb25faGg6IHRydWUsCi0gICAgICAgIGdlbl9wb3NpdGlvbl9oaDogdHJ1ZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9CVUlMRC5nbiBiL2dkL3BhY2tldC9wYXJzZXIvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNGYzYjAuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pbXBvcnQoImZsZXguZ25pIikKLWltcG9ydCgiYmlzb24uZ25pIikKLQotY29uZmlnKCJwa3RnZW5fY29uZmlncyIpIHsKLSAgaW5jbHVkZV9kaXJzID0gWyAiLy9idC9nZC9wYWNrZXQvcGFyc2VyIiBdCi0KLSAgY2ZsYWdzID0gWyAiLWZQSUMiIF0KLQotICBjZmxhZ3NfY2MgPSBbCi0gICAgIi1zdGQ9YysrMTciLAotICAgICItV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlIiwKLSAgICAiLVduby1pbXBsaWNpdC1mYWxsdGhyb3VnaCIsCi0gICAgIi1Xbm8tcG9pc29uLXN5c3RlbS1kaXJlY3RvcmllcyIsCi0gICAgIi1Xbm8tdW5rbm93bi13YXJuaW5nLW9wdGlvbiIsCi0gIF0KLX0KLQotZXhlY3V0YWJsZSgiYmx1ZXRvb3RoX3BhY2tldGdlbiIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiY2hlY2tzdW1fZGVmLmNjIiwKLSAgICAiY3VzdG9tX2ZpZWxkX2RlZi5jYyIsCi0gICAgImVudW1fZGVmLmNjIiwKLSAgICAiZW51bV9nZW4uY2MiLAotICAgICJmaWVsZHMvYXJyYXlfZmllbGQuY2MiLAotICAgICJmaWVsZHMvYm9keV9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9jaGVja3N1bV9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9jaGVja3N1bV9zdGFydF9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9jb3VudF9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9jdXN0b21fZmllbGQuY2MiLAotICAgICJmaWVsZHMvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemUuY2MiLAotICAgICJmaWVsZHMvZW51bV9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9maXhlZF9lbnVtX2ZpZWxkLmNjIiwKLSAgICAiZmllbGRzL2ZpeGVkX2ZpZWxkLmNjIiwKLSAgICAiZmllbGRzL2ZpeGVkX3NjYWxhcl9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9ncm91cF9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9wYWNrZXRfZmllbGQuY2MiLAotICAgICJmaWVsZHMvcGFkZGluZ19maWVsZC5jYyIsCi0gICAgImZpZWxkcy9wYXlsb2FkX2ZpZWxkLmNjIiwKLSAgICAiZmllbGRzL3Jlc2VydmVkX2ZpZWxkLmNjIiwKLSAgICAiZmllbGRzL3NjYWxhcl9maWVsZC5jYyIsCi0gICAgImZpZWxkcy9zaXplX2ZpZWxkLmNjIiwKLSAgICAiZmllbGRzL3N0cnVjdF9maWVsZC5jYyIsCi0gICAgImZpZWxkcy92YXJpYWJsZV9sZW5ndGhfc3RydWN0X2ZpZWxkLmNjIiwKLSAgICAiZmllbGRzL3ZlY3Rvcl9maWVsZC5jYyIsCi0gICAgImdlbl9jcHAuY2MiLAotICAgICJnZW5fcnVzdC5jYyIsCi0gICAgIm1haW4uY2MiLAotICAgICJwYWNrZXRfZGVmLmNjIiwKLSAgICAicGFyZW50X2RlZi5jYyIsCi0gICAgInN0cnVjdF9kZWYuY2MiLAotICAgICJzdHJ1Y3RfcGFyc2VyX2dlbmVyYXRvci5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbICIvL2J0L2dkL3BhY2tldC9wYXJzZXIiIF0KLQotICBkZXBzID0gWwotICAgICI6cGt0bGV4ZXIiLAotICAgICI6cGt0cGFyc2VyIiwKLSAgXQotICBjb25maWdzICs9IFsgIjpwa3RnZW5fY29uZmlncyIgXQotfQotCi1mbGV4X3NvdXJjZSgicGt0bGV4ZXIiKSB7Ci0gIHNvdXJjZXMgPSBbICJsYW5ndWFnZV9sLmxsIiBdCi0gIGNvbmZpZ3MgPSBbICI6cGt0Z2VuX2NvbmZpZ3MiIF0KLX0KLQotYmlzb25fc291cmNlKCJwa3RwYXJzZXIiKSB7Ci0gIHNvdXJjZXMgPSBbICJsYW5ndWFnZV95Lnl5IiBdCi0gIGNvbmZpZ3MgPSBbICI6cGt0Z2VuX2NvbmZpZ3MiIF0KLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvUkVBRE1FIGIvZ2QvcGFja2V0L3BhcnNlci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOWU5OWYuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1UaGlzIGZpbGUganVzdCBjb250YWlucyBzb21lIG5vdGVzIGFib3V0IHRoZSBkZXNpZ24gYW5kIHVzYWdlIG9mIHRoZSBQREwgbGFuZ3VhZ2UuCi0KLS0tLS0tLS0KLSBURVJNUwotLS0tLS0tLQotLnBkbAotICBUaGUgZmlsZSB0eXBlIHRoYXQgZGVmaW5lcyBwYWNrZXQgZGVmaW5pdGlvbnMuIFlvdSBtYXkgdGhpbmsgb2YgZWFjaCBwZGwgZmlsZQotICBhcyBpdHMgb3duIHRyYW5zbGF0aW9uIHVuaXQuCi0KLVBhY2tldCBWaWV3cyBhbmQgQnVpbGRlcnMKLSAgR2VuZXJhdGVkIGZyb20gYSBwYWNrZXQgZGVmaW5pdGlvbi4gVmlld3MgYXJlIHVzZWQgdG8gdmFsaWRhdGUgcGFja2V0cyBhbmQKLSAgZXh0cmFjdCB0aGUgZmllbGRzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHBkbCBmaWxlLiAgQnVpbGRlcnMgY2hlY2sgdGhlIGlucHV0Ci0gIGFyZ3VtZW50cyBhbmQgY2FuIGJlIHNlcmlhbGl6ZWQuCi0KLUNoZWNrc3VtIHR5cGVzCi0gIGNoZWNrc3VtIE15Q2hlY2tzdW1DbGFzcyA6IDE2ICJwYXRoL3RvL3RoZS9jbGFzcy8iCi0gIENoZWNrc3VtIGZpZWxkcyBuZWVkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHM6Ci0gICAgdm9pZCBJbml0aWFsaXplKE15Q2hlY2tzdW1DbGFzcyYpOwotICAgIHZvaWQgQWRkQnl0ZShNeUNoZWNrc3VtQ2xhc3MmLCB1aW50OF90KTsKLSAgICAvLyBBc3N1bWluZyBhIDE2LWJpdCAodWludDE2X3QpIGNoZWNrc3VtOgotICAgIHVpbnQxNl90IEdldENoZWNrc3VtKE15Q2hlY2tzdW1DbGFzcyYpOwotLS0tLS0tLS0tLS0tLQotIExJTUlUQVRJT05TCi0tLS0tLS0tLS0tLS0tCi0gIC0gU2l6ZSBmaWVsZHMgZm9yIGEgdmFyaWFibGUgbGVuZ3RoIGZpZWxkIE1VU1QgY29tZSBiZWZvcmUgdGhlIGRlZmluaXRpb24KLSAgICBvZiBzYWlkIGZpZWxkLgotCi0gIC0gUGF5bG9hZCBmaWVsZHMgbXVzdCBiZSBieXRlLWFsaWduZWQgdW5sZXNzIHRoZXkgaGF2ZSBhbiB1bmtub3duIHNpemUuCi0gICAgQm9keSBmaWVsZHMgYXJlIGFsbG93ZWQgdG8gbm90IGJlIGJ5dGUgYWxpZ25lZC4KLQotICAtIE5vIGNvbmRpdGlvbmFscwotCi0gIC0gQ2FuIG5vdCBoYXZlIHRvIGZpZWxkcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW55d2hlcmUgaW4gdGhlIGluIGFuIGluaGVyaXRlbmNlIGNoYWluCi0KLSAgLSBDYW4ndCBoYW5kbGUgc2l6ZSBmb3IgQm9keSB0eXBlIGZpZWxkcyB5ZXQgc2luY2UgdGhleSBtaWdodCBub3QgYmUgYnl0ZSBhbGlnbmVkLgotCi0gIC0gQ3VycmVudGx5IG5vIGFycmF5cyBvZiBjdXN0b20gdHlwZXMgKG1pZ2h0IGNoYW5nZSBsYXRlcikKLQotLS0tLS0tLQotIE5PVEVTCi0tLS0tLS0tCi1BbGwgZmllbGQgbmFtZXMgc2hvdWxkIGJlIGluIHNuYWtlX2Nhc2UuICBUeXBlcyBzaG91bGQgYmUgaW4gQ2FtZWxDYXNlLgotCi1UaGUgX3BheWxvYWRfIGtleXdvcmQgZ2VuZXJhdGVzIGEgZ2V0dGVyIGJ1dCBfYm9keV8gZG9lc24ndC4gVGhlcmVmb3JlLCBhCi1fcGF5bG9hZF8gbXVzdCBiZSBieXRlIGFsaWduZWQuCi0KLVN1cHBvcnRzIGNvbnN0cmFpbnRzIG9uIGdyYW5kcGFyZW50cwotU3VwcG9ydHMgbXVsdGlwbGUgY29uc3RyYWludHMKLUV2ZXJ5IGZpZWxkIGhhbmRsZXMgaXRzIG93biBnZW5lcmF0aW9uLgotT25lIHBkbCBmaWxlIHdpbGwgcmVzdWx0IGluIG9uZSBoZWFkZXIgZmlsZSB3aXRoIGFsbCB0aGUgcGFja2V0cwotCi1UaGluZ3MgdG8gY292ZXIgLQotICBDb25zdHJhaW50cwotICBJbmhlcml0YW5jZSB2cyBDb250YWlucwotCi1DdXN0b20gZmllbGRzIHdpdGggZml4ZWQgc2l6ZSBtdXN0IGV4dGVuZCBhbmQgaW1wbGVtZW50OgotICBwYWNrZXQ6OkN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlCi0KLUN1c3RvbSBmaWVsZHMgd2l0aCB2YXJpYWJsZSBzaXplIG5lZWQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0gIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZShjb25zdCBUeXBlJiwgTXV0YWJsZVZpZXcmKTsKLSAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8c2l6ZV90PiBTaXplKEl0ZXJhdG9yKTsKLSAgc3RhdGljIFR5cGUgUGFyc2UoSXRlcmF0b3IpOwotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvYmlzb24uZ25pIGIvZ2QvcGFja2V0L3BhcnNlci9iaXNvbi5nbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjU0MWIuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9iaXNvbi5nbmkKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBCaXNvbiBpcyBhIHBhcnNlciBnZW5lcmF0b3Igd2hpY2ggcmVhZHMgYSBzcGVjaWZpY2F0aW9uIG9mIGEgY29udGV4dC1mcmVlCi0jIGxhbmd1YWdlIGFuZCBnZW5lcmF0ZXMgYSBwYXJzZXIgd2hpY2ggZGVjaWRlcyB3aGV0aGVyIHRoZSBpbnB1dCBjb25mb3JtcyB0bwotIyB0aGUgZ3JhbW1hciBzcGVjaWZpZWQuCi0KLSMgR2VuZXJhdGUgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMgdXNpbmcgQmlzb24uCi0jCi0jIE5vdGU6IFdlIGdlbmVyYXRlIEMrKyBvdXRwdXQgZm9yIEJpc29uLiBXZSBhbHNvIHNldCAtLWxhbmd1YWdlIHRvIEMrKwotIyAoZXF1aXZhbGVudCB0byAlbGFuZ3VhZ2UgYysrKSB3aGljaCBmb3JjZXMgQmlzb24gdG8gZ2VuZXJhdGUgYSBDKysgcGFyc2VyLgotIwotIyBQYXJhbWV0ZXJzOgotIyAgIHNvdXJjZXM6IEdyYW1tYXIgZmlsZXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcGFyc2Vycy4KLXRlbXBsYXRlKCJiaXNvbl9zb3VyY2UiKSB7Ci0gIGFjdGlvbl9uYW1lID0gIiR7dGFyZ2V0X25hbWV9X2dlbiIKLSAgYWN0aW9uX2ZvcmVhY2goYWN0aW9uX25hbWUpIHsKLSAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgInNvdXJjZXMiIF0pCi0gICAgYXNzZXJ0KGRlZmluZWQoc291cmNlcyksICJzb3VyY2VzIG11c3QgYmUgc2V0IikKLSAgICBmb3JlYWNoKHMsIHNvdXJjZXMpIHsKLSAgICAgIGFzc2VydChnZXRfcGF0aF9pbmZvKHMsICJleHRlbnNpb24iKSA9PSAieXkiLAotICAgICAgICAgICAgICJFeHBlY3RpbmcgQmlzb24gZXh0ZW5zaW9uIHl5OiAke3N9IikKLSAgICB9Ci0KLSAgICBzY3JpcHQgPSAiLy9jb21tb24tbWsvZmlsZV9nZW5lcmF0b3Jfd3JhcHBlci5weSIKLSAgICBvdXRwcmVmaXggPSAiJHt0YXJnZXRfZ2VuX2Rpcn0ve3tzb3VyY2VfbmFtZV9wYXJ0fX0iCi0gICAgYXJncyA9IFsKLSAgICAgICJiaXNvbiIsCi0gICAgICAiLS1sYW5ndWFnZT1jKysiLAotICAgICAgIi0tZGVmaW5lcz0ke291dHByZWZpeH0uaCIsCi0gICAgICAiLW8iLAotICAgICAgIiR7b3V0cHJlZml4fS5jYyIsCi0gICAgICAie3tzb3VyY2V9fSIsCi0gICAgXQotICAgIG91dHB1dHMgPSBbCi0gICAgICAiJHtvdXRwcmVmaXh9LmgiLAotICAgICAgIiR7b3V0cHJlZml4fS5jYyIsCi0gICAgXQotICB9Ci0KLSAgYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSA9ICJfJHt0YXJnZXRfbmFtZX1fYWxsX2RlcGVuZGVudF9jb25maWciCi0gIGNvbmZpZyhhbGxfZGVwZW5kZW50X2NvbmZpZ19uYW1lKSB7Ci0gICAgaW5jbHVkZV9kaXJzID0gWyAiJHt0YXJnZXRfZ2VuX2Rpcn0iIF0KLSAgfQotCi0gIHNvdXJjZV9zZXQodGFyZ2V0X25hbWUpIHsKLSAgICBzb3VyY2VzID0gZ2V0X3RhcmdldF9vdXRwdXRzKCI6JHthY3Rpb25fbmFtZX0iKQotICAgIGFsbF9kZXBlbmRlbnRfY29uZmlncyA9IFsgIjoke2FsbF9kZXBlbmRlbnRfY29uZmlnX25hbWV9IiBdCi0gICAgZGVwcyA9IFsgIjoke2FjdGlvbl9uYW1lfSIgXQotCi0gICAgaWYgKGRlZmluZWQoaW52b2tlci5jb25maWdzKSkgewotICAgICAgY29uZmlncyArPSBpbnZva2VyLmNvbmZpZ3MKLSAgICB9Ci0KLSAgICAjIFNpbGVuY2Ugc29tZSB3YXJuaW5ncy4gVGhlIGF1dG9nZW5lcmF0ZWQgY29kZSBpbmNsdWRlcyBwYXJ0cyB0aGF0IGhhdmUKLSAgICAjIGZhbGx0aHJvdWdocyBhbmQgdW5yZWFjaGFibGUgY29kZS4gVGhpcyBtYXkgc2lsZW5jZSBsZWdpdGltYXRlIGlzc3VlcyBpbgotICAgICMgdXNlciB3cml0dGVuIGNvZGUgaW4gdGhlIGdyYW1tYXIgZmlsZXMgYXMgd2VsbC4gVXNlciBiZXdhcmUhCi0gICAgY2ZsYWdzX2NjID0gWwotICAgICAgIi1Xbm8taW1wbGljaXQtZmFsbHRocm91Z2giLAotICAgICAgIi1Xbm8tdW5yZWFjaGFibGUtY29kZSIsCi0gICAgXQotICB9Ci19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2NoZWNrc3VtX2RlZi5jYyBiL2dkL3BhY2tldC9wYXJzZXIvY2hlY2tzdW1fZGVmLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2IxODAzLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvY2hlY2tzdW1fZGVmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImNoZWNrc3VtX2RlZi5oIgotI2luY2x1ZGUgImNoZWNrc3VtX3R5cGVfY2hlY2tlci5oIgotI2luY2x1ZGUgImZpZWxkcy9jaGVja3N1bV9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotQ2hlY2tzdW1EZWY6OkNoZWNrc3VtRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGluY2x1ZGUsIGludCBzaXplKSA6IEN1c3RvbUZpZWxkRGVmKG5hbWUsIGluY2x1ZGUsIHNpemUpIHt9Ci0KLVBhY2tldEZpZWxkKiBDaGVja3N1bURlZjo6R2V0TmV3RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFBhcnNlTG9jYXRpb24gbG9jKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgQ2hlY2tzdW1GaWVsZChuYW1lLCBuYW1lXywgc2l6ZV8sIGxvYyk7Ci19Ci0KLVR5cGVEZWY6OlR5cGUgQ2hlY2tzdW1EZWY6OkdldERlZmluaXRpb25UeXBlKCkgY29uc3QgewotICByZXR1cm4gVHlwZURlZjo6VHlwZTo6Q0hFQ0tTVU07Ci19Ci0KLXZvaWQgQ2hlY2tzdW1EZWY6OkdlbkNoZWNrc3VtQ2hlY2soc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgInN0YXRpY19hc3NlcnQoQ2hlY2tzdW1UeXBlQ2hlY2tlcjwiIDw8IG5hbWVfIDw8ICIsIiA8PCB1dGlsOjpHZXRUeXBlRm9yU2l6ZShzaXplXykgPDwgIj46OnZhbHVlLCBcIiI7Ci0gIHMgPDwgbmFtZV8gPDwgIiBpcyBub3QgYSB2YWxpZCBjaGVja3N1bSB0eXBlLiBQbGVhc2Ugc2VlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlwiKTsiOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9jaGVja3N1bV9kZWYuaCBiL2dkL3BhY2tldC9wYXJzZXIvY2hlY2tzdW1fZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MmI4YzMuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9jaGVja3N1bV9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJjdXN0b21fZmllbGRfZGVmLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAidHlwZV9kZWYuaCIKLQotY2xhc3MgQ2hlY2tzdW1EZWYgOiBwdWJsaWMgQ3VzdG9tRmllbGREZWYgewotIHB1YmxpYzoKLSAgQ2hlY2tzdW1EZWYoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaW5jbHVkZSwgaW50IHNpemUpOwotCi0gIHZpcnR1YWwgUGFja2V0RmllbGQqIEdldE5ld0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBUeXBlRGVmOjpUeXBlIEdldERlZmluaXRpb25UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5DaGVja3N1bUNoZWNrKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgaW5jbHVkZV87Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9jaGVja3N1bV90eXBlX2NoZWNrZXIuaCBiL2dkL3BhY2tldC9wYXJzZXIvY2hlY2tzdW1fdHlwZV9jaGVja2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzg0YjEuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9jaGVja3N1bV90eXBlX2NoZWNrZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci1uYW1lc3BhY2UgcGFyc2VyIHsKLQotLy8gQ2hlY2tzIGZvciBJbml0aWFsaXplKCksIEFkZEJ5dGUoKSwgYW5kIEdldENoZWNrc3VtKCkuCi0vLyBUIGFuZCBUUkVUIGFyZSB0aGUgY2hlY2tzdW0gY2xhc3MgVHlwZSBhbmQgdGhlIGNoZWNrc3VtIHJldHVybiB0eXBlCi0vLyBDIGFuZCBDUkVUIGFyZSB0aGUgc3Vic3RpdHV0ZWQgdHlwZXMgZm9yIFQgYW5kIFRSRVQKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBUUkVUPgotY2xhc3MgQ2hlY2tzdW1UeXBlQ2hlY2tlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgQywgdm9pZCAoQzo6KikoKT4KLSAgc3RydWN0IEluaXRpYWxpemVDaGVja2VyIHt9OwotCi0gIHRlbXBsYXRlIDxjbGFzcyBDLCB2b2lkIChDOjoqKSh1aW50OF90IGJ5dGUpPgotICBzdHJ1Y3QgQWRkQnl0ZUNoZWNrZXIge307Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIEMsIHR5cGVuYW1lIENSRVQsIENSRVQgKEM6OiopKCkgY29uc3Q+Ci0gIHN0cnVjdCBHZXRDaGVja3N1bUNoZWNrZXIge307Ci0KLSAgLy8gSWYgYWxsIHRoZSBtZXRob2RzIGFyZSBkZWZpbmVkLCB0aGlzIG9uZSBtYXRjaGVzCi0gIHRlbXBsYXRlIDxjbGFzcyBDLCB0eXBlbmFtZSBDUkVUPgotICBzdGF0aWMgaW50IFRlc3QoSW5pdGlhbGl6ZUNoZWNrZXI8QywgJkM6OkluaXRpYWxpemU+KiwgQWRkQnl0ZUNoZWNrZXI8QywgJkM6OkFkZEJ5dGU+KiwKLSAgICAgICAgICAgICAgICAgIEdldENoZWNrc3VtQ2hlY2tlcjxDLCBDUkVULCAmQzo6R2V0Q2hlY2tzdW0+Kik7Ci0KLSAgLy8gVGhpcyBvbmUgbWF0Y2hlcyBldmVyeXRoaW5nIGVsc2UKLSAgdGVtcGxhdGUgPGNsYXNzIEMsIHR5cGVuYW1lIENSRVQ+Ci0gIHN0YXRpYyBjaGFyIFRlc3QoLi4uKTsKLQotICAvLyBUaGlzIGNoZWNrcyB3aGljaCB0ZW1wbGF0ZSB3YXMgbWF0Y2hlZAotICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSAoc2l6ZW9mKFRlc3Q8VCwgVFJFVD4oMCwgMCwgMCkpID09IHNpemVvZihpbnQpKTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgcGFyc2VyCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2N1c3RvbV9maWVsZF9kZWYuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2N1c3RvbV9maWVsZF9kZWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2E2ZmQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9jdXN0b21fZmllbGRfZGVmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImN1c3RvbV9maWVsZF9kZWYuaCIKLQotI2luY2x1ZGUgInV0aWwuaCIKLQotQ3VzdG9tRmllbGREZWY6OkN1c3RvbUZpZWxkRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGluY2x1ZGUpIDogVHlwZURlZihuYW1lKSwgaW5jbHVkZV8oaW5jbHVkZSkge30KLQotQ3VzdG9tRmllbGREZWY6OkN1c3RvbUZpZWxkRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGluY2x1ZGUsIGludCBzaXplKQotICAgIDogVHlwZURlZihuYW1lLCBzaXplKSwgaW5jbHVkZV8oaW5jbHVkZSkgewotICBpZiAoc2l6ZSAlIDggIT0gMCkgewotICAgIEVSUk9SKCkgPDwgIkN1c3RvbSBmaWVsZHMgbXVzdCBiZSBieXRlIGFsaWduZWQuIjsKLSAgfQotfQotCi1QYWNrZXRGaWVsZCogQ3VzdG9tRmllbGREZWY6OkdldE5ld0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYykgY29uc3QgewotICBpZiAoc2l6ZV8gPT0gLTEpIHsKLSAgICByZXR1cm4gbmV3IEN1c3RvbUZpZWxkKG5hbWUsIG5hbWVfLCBsb2MpOwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgQ3VzdG9tRmllbGRGaXhlZFNpemUobmFtZSwgbmFtZV8sIHNpemVfLCBsb2MpOwotICB9Ci19Ci0KLVR5cGVEZWY6OlR5cGUgQ3VzdG9tRmllbGREZWY6OkdldERlZmluaXRpb25UeXBlKCkgY29uc3QgewotICByZXR1cm4gVHlwZURlZjo6VHlwZTo6Q1VTVE9NOwotfQotCi12b2lkIEN1c3RvbUZpZWxkRGVmOjpHZW5JbmNsdWRlKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICIjaW5jbHVkZSBcIiIgPDwgaW5jbHVkZV8gPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKEdldFR5cGVOYW1lKCkpIDw8ICIuaFwiXG4iOwotfQotCi12b2lkIEN1c3RvbUZpZWxkRGVmOjpHZW5QeUJpbmQxMUluY2x1ZGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgIiNpbmNsdWRlIFwiIiA8PCBpbmNsdWRlXyA8PCB1dGlsOjpDYW1lbENhc2VUb1VuZGVyU2NvcmUoR2V0VHlwZU5hbWUoKSkgPDwgIl9weWJpbmQxMV90eXBlX2Nhc3Rlci5oXCJcbiI7Ci19Ci0KLXZvaWQgQ3VzdG9tRmllbGREZWY6OkdlblVzaW5nKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJ1c2luZyA6OmJsdWV0b290aDo6IjsKLSAgZm9yIChjb25zdCBhdXRvJiBjIDogaW5jbHVkZV8pIHsKLSAgICBzd2l0Y2ggKGMpIHsKLSAgICAgIGNhc2UgJy8nOgotICAgICAgICBzIDw8ICI6OiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcyA8PCBjOwotICAgIH0KLSAgfQotICBzIDw8IEdldFR5cGVOYW1lKCkgPDwgIjsiOwotfQotCi12b2lkIEN1c3RvbUZpZWxkRGVmOjpHZW5GaXhlZFNpemVDdXN0b21GaWVsZENoZWNrKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZl92PEN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlPCIgPDwgbmFtZV8gPDwgIj4sICIgPDwgbmFtZV8gPDwgIj4sIFwiIjsKLSAgcyA8PCBuYW1lXyA8PCAiIGlzIG5vdCBhIHZhbGlkIGZpeGVkIHNpemUgY3VzdG9tIGZpZWxkIHR5cGUuIFBsZWFzZSBzZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuXCIpOyI7Ci0gIHMgPDwgInN0YXRpY19hc3NlcnQoQ3VzdG9tRmllbGRGaXhlZFNpemVJbnRlcmZhY2U8IiA8PCBuYW1lXyA8PCAiPjo6bGVuZ3RoKCkgKiA4ID09ICIgPDwgc2l6ZV8KLSAgICA8PCAiLCBcIkN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlPCIgPDwgbmFtZV8gPDwgIj46Omxlbmd0aCAqIDggc2hvdWxkIG1hdGNoIFBETCBkZWZpbmVkIHNpemUgKGluIGJpdHMpICIKLSAgICA8PCBzaXplXyA8PCAiXCIpOyI7Ci19Ci0KLXZvaWQgQ3VzdG9tRmllbGREZWY6OkdlbkN1c3RvbUZpZWxkQ2hlY2soc3RkOjpvc3RyZWFtJiBzLCBib29sIGxpdHRsZV9lbmRpYW4pIGNvbnN0IHsKLSAgcyA8PCAic3RhdGljX2Fzc2VydChDdXN0b21UeXBlQ2hlY2tlcjwiIDw8IG5hbWVfIDw8ICIsICI7Ci0gIHMgPDwgKGxpdHRsZV9lbmRpYW4gPyAiIiA6ICIhIikgPDwgImtMaXR0bGVFbmRpYW4+Ojp2YWx1ZSwgXCIiOwotICBzIDw8IG5hbWVfIDw8ICIgaXMgbm90IGEgdmFsaWQgY3VzdG9tIGZpZWxkIHR5cGUuIFBsZWFzZSBzZWUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuXCIpOyI7Ci19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2N1c3RvbV9maWVsZF9kZWYuaCBiL2dkL3BhY2tldC9wYXJzZXIvY3VzdG9tX2ZpZWxkX2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzM4MDFhLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvY3VzdG9tX2ZpZWxkX2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgImZpZWxkcy9jdXN0b21fZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemUuaCIKLSNpbmNsdWRlICJwYXJzZV9sb2NhdGlvbi5oIgotI2luY2x1ZGUgInR5cGVfZGVmLmgiCi0KLWNsYXNzIEN1c3RvbUZpZWxkRGVmIDogcHVibGljIFR5cGVEZWYgewotIHB1YmxpYzoKLSAgQ3VzdG9tRmllbGREZWYoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaW5jbHVkZSk7Ci0KLSAgQ3VzdG9tRmllbGREZWYoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaW5jbHVkZSwgaW50IHNpemUpOwotCi0gIHZpcnR1YWwgUGFja2V0RmllbGQqIEdldE5ld0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBUeXBlIEdldERlZmluaXRpb25UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5JbmNsdWRlKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5QeUJpbmQxMUluY2x1ZGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblVzaW5nKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5GaXhlZFNpemVDdXN0b21GaWVsZENoZWNrKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5DdXN0b21GaWVsZENoZWNrKHN0ZDo6b3N0cmVhbSYgcywgYm9vbCBsaXR0bGVfZW5kaWFuKSBjb25zdDsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBpbmNsdWRlXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2N1c3RvbV90eXBlX2NoZWNrZXIuaCBiL2dkL3BhY2tldC9wYXJzZXIvY3VzdG9tX3R5cGVfY2hlY2tlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRhMjJiLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvY3VzdG9tX3R5cGVfY2hlY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLQotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvaXRlcmF0b3IuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLS8vIENoZWNrcyBhIGN1c3RvbSB0eXBlIGhhcyBhbGwgdGhlIG5lY2Vzc2FyeSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ycmVjdCBzaWduYXR1cmVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgcGFja2V0X2xpdHRsZV9lbmRpYW4+Ci1jbGFzcyBDdXN0b21UeXBlQ2hlY2tlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgQywgdm9pZCAoQzo6KikoQml0SW5zZXJ0ZXImKSBjb25zdD4KLSAgc3RydWN0IFNlcmlhbGl6ZUNoZWNrZXIge307Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIEMsIHNpemVfdCAoQzo6KikoKSBjb25zdD4KLSAgc3RydWN0IFNpemVDaGVja2VyIHt9OwotCi0gIHRlbXBsYXRlIDxjbGFzcyBDLCBib29sIGxpdHRsZV9lbmRpYW4sIHN0ZDo6b3B0aW9uYWw8SXRlcmF0b3I8bGl0dGxlX2VuZGlhbj4+ICgqKShDKiB2ZWMsIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+IGl0KT4KLSAgc3RydWN0IFBhcnNlQ2hlY2tlciB7fTsKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQywgc3RkOjpzdHJpbmcgKEM6OiopKCkgY29uc3Q+Ci0gIHN0cnVjdCBUb1N0cmluZ0NoZWNrZXIge307Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIEMsIGJvb2wgbGl0dGxlX2VuZGlhbj4KLSAgc3RhdGljIGludCBUZXN0KFNlcmlhbGl6ZUNoZWNrZXI8QywgJkM6OlNlcmlhbGl6ZT4qLCBTaXplQ2hlY2tlcjxDLCAmQzo6c2l6ZT4qLAotICAgICAgICAgICAgICAgICAgUGFyc2VDaGVja2VyPEMsIGxpdHRsZV9lbmRpYW4sICZDOjpQYXJzZT4qLCBUb1N0cmluZ0NoZWNrZXI8QywgJkM6OlRvU3RyaW5nPiopOwotCi0gIHRlbXBsYXRlIDxjbGFzcyBDLCBib29sIGxpdHRsZV9lbmRpYW4+Ci0gIHN0YXRpYyBjaGFyIFRlc3QoLi4uKTsKLQotICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSAoc2l6ZW9mKFRlc3Q8VCwgcGFja2V0X2xpdHRsZV9lbmRpYW4+KDAsIDAsIDAsIDApKSA9PSBzaXplb2YoaW50KSk7Ci19OwotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9kZWNsYXJhdGlvbnMuaCBiL2dkL3BhY2tldC9wYXJzZXIvZGVjbGFyYXRpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODkyNzYuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9kZWNsYXJhdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG9wdGlvbmFsPgotCi0jaW5jbHVkZSAiY2hlY2tzdW1fZGVmLmgiCi0jaW5jbHVkZSAiY3VzdG9tX2ZpZWxkX2RlZi5oIgotI2luY2x1ZGUgImVudW1fZGVmLmgiCi0jaW5jbHVkZSAiZW51bV9nZW4uaCIKLSNpbmNsdWRlICJwYWNrZXRfZGVmLmgiCi0jaW5jbHVkZSAic3RydWN0X2RlZi5oIgotCi1jbGFzcyBEZWNsYXJhdGlvbnMgewotIHB1YmxpYzoKLSAgdm9pZCBBZGRUeXBlRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIFR5cGVEZWYqIGRlZikgewotICAgIGF1dG8gaXQgPSB0eXBlX2RlZnNfLmZpbmQobmFtZSk7Ci0gICAgaWYgKGl0ICE9IHR5cGVfZGVmc18uZW5kKCkpIHsKLSAgICAgIEVSUk9SKCkgPDwgIlJlZGVmaW5pdGlvbiBvZiBUeXBlICIgPDwgbmFtZTsKLSAgICB9Ci0gICAgdHlwZV9kZWZzXy5pbnNlcnQoc3RkOjpwYWlyKG5hbWUsIGRlZikpOwotICAgIHR5cGVfZGVmc19xdWV1ZV8ucHVzaF9iYWNrKHN0ZDo6cGFpcihuYW1lLCBkZWYpKTsKLSAgfQotCi0gIFR5cGVEZWYqIEdldFR5cGVEZWYoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBhdXRvIGl0ID0gdHlwZV9kZWZzXy5maW5kKG5hbWUpOwotICAgIGlmIChpdCA9PSB0eXBlX2RlZnNfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotCi0gIHZvaWQgQWRkUGFja2V0RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIFBhY2tldERlZiogZGVmKSB7Ci0gICAgYXV0byBpdCA9IHBhY2tldF9kZWZzXy5maW5kKG5hbWUpOwotICAgIGlmIChpdCAhPSBwYWNrZXRfZGVmc18uZW5kKCkpIHsKLSAgICAgIEVSUk9SKCkgPDwgIlJlZGVmaW5pdGlvbiBvZiBQYWNrZXQgIiA8PCBuYW1lOwotICAgIH0KLSAgICBwYWNrZXRfZGVmc18uaW5zZXJ0KHN0ZDo6cGFpcihuYW1lLCBkZWYpKTsKLSAgICBwYWNrZXRfZGVmc19xdWV1ZV8ucHVzaF9iYWNrKHN0ZDo6cGFpcihuYW1lLCBkZWYpKTsKLSAgfQotCi0gIFBhY2tldERlZiogR2V0UGFja2V0RGVmKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgYXV0byBpdCA9IHBhY2tldF9kZWZzXy5maW5kKG5hbWUpOwotICAgIGlmIChpdCA9PSBwYWNrZXRfZGVmc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIHJldHVybiBpdC0+c2Vjb25kOwotICB9Ci0KLSAgdm9pZCBBZGRHcm91cERlZihzdGQ6OnN0cmluZyBuYW1lLCBGaWVsZExpc3QqIGdyb3VwX2RlZikgewotICAgIGF1dG8gaXQgPSBncm91cF9kZWZzXy5maW5kKG5hbWUpOwotICAgIGlmIChpdCAhPSBncm91cF9kZWZzXy5lbmQoKSkgewotICAgICAgRVJST1IoKSA8PCAiUmVkZWZpbml0aW9uIG9mIGdyb3VwICIgPDwgbmFtZTsKLSAgICB9Ci0gICAgZ3JvdXBfZGVmc18uaW5zZXJ0KHN0ZDo6cGFpcihuYW1lLCBncm91cF9kZWYpKTsKLSAgfQotCi0gIEZpZWxkTGlzdCogR2V0R3JvdXBEZWYoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIGlmIChncm91cF9kZWZzXy5maW5kKG5hbWUpID09IGdyb3VwX2RlZnNfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ3JvdXBfZGVmc18uYXQobmFtZSk7Ci0gIH0KLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRmllbGRMaXN0Kj4gZ3JvdXBfZGVmc187Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFR5cGVEZWYqPiB0eXBlX2RlZnNfOwotICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgVHlwZURlZio+PiB0eXBlX2RlZnNfcXVldWVfOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGFja2V0RGVmKj4gcGFja2V0X2RlZnNfOwotICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUGFja2V0RGVmKj4+IHBhY2tldF9kZWZzX3F1ZXVlXzsKLSAgYm9vbCBpc19saXR0bGVfZW5kaWFuOwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZW51bV9kZWYuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2VudW1fZGVmLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkwNDI2Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZW51bV9kZWYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZW51bV9kZWYuaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImZpZWxkcy9lbnVtX2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1FbnVtRGVmOjpFbnVtRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBzaXplKSA6IFR5cGVEZWYobmFtZSwgc2l6ZSkge30KLQotdm9pZCBFbnVtRGVmOjpBZGRFbnRyeShzdGQ6OnN0cmluZyBuYW1lLCB1aW50MzJfdCB2YWx1ZSkgewotICBpZiAoIXV0aWw6OklzRW51bUNhc2UobmFtZSkpIHsKLSAgICBFUlJPUigpIDw8IF9fZnVuY19fIDw8ICI6IEVudW0gIiA8PCBuYW1lIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKSBzaG91bGQgYmUgYWxsIHVwcGVyY2FzZSB3aXRoIHVuZGVyc2NvcmVzIjsKLSAgfQotICBpZiAodmFsdWUgPiB1dGlsOjpHZXRNYXhWYWx1ZUZvckJpdHMoc2l6ZV8pKSB7Ci0gICAgRVJST1IoKSA8PCBfX2Z1bmNfXyA8PCAiOiBWYWx1ZSBvZiAiIDw8IG5hbWUgPDwgIigiIDw8IHZhbHVlIDw8ICIpIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHBvc3NpYmxlIHZhbHVlIGZvciBlbnVtICIKLSAgICAgICAgICAgIDw8IG5hbWVfIDw8ICIoIiA8PCB1dGlsOjpHZXRNYXhWYWx1ZUZvckJpdHMoc2l6ZV8pIDw8ICIpXG4iOwotICB9Ci0KLSAgY29uc3RhbnRzXy5pbnNlcnQoc3RkOjpwYWlyKHZhbHVlLCBuYW1lKSk7Ci0gIGVudHJpZXNfLmluc2VydChuYW1lKTsKLX0KLQotUGFja2V0RmllbGQqIEVudW1EZWY6OkdldE5ld0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYykgY29uc3QgewotICByZXR1cm4gbmV3IEVudW1GaWVsZChuYW1lLCAqdGhpcywgIldoYXQgaXMgdGhpcyBmb3IiLCBsb2MpOwotfQotCi1ib29sIEVudW1EZWY6Okhhc0VudHJ5KHN0ZDo6c3RyaW5nIG5hbWUpIGNvbnN0IHsKLSAgcmV0dXJuIGVudHJpZXNfLmNvdW50KG5hbWUpICE9IDA7Ci19Ci0KLVR5cGVEZWY6OlR5cGUgRW51bURlZjo6R2V0RGVmaW5pdGlvblR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBUeXBlRGVmOjpUeXBlOjpFTlVNOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9lbnVtX2RlZi5oIGIvZ2QvcGFja2V0L3BhcnNlci9lbnVtX2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY0MzQ4Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZW51bV9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJmaWVsZHMvcGFja2V0X2ZpZWxkLmgiCi0jaW5jbHVkZSAidHlwZV9kZWYuaCIKLQotLy8gSG9sZHMgdGhlIGRlZmluaXRpb24gb2YgYW4gZW51bS4KLWNsYXNzIEVudW1EZWYgOiBwdWJsaWMgVHlwZURlZiB7Ci0gcHVibGljOgotICBFbnVtRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBzaXplKTsKLQotICB2aXJ0dWFsIFBhY2tldEZpZWxkKiBHZXROZXdGaWVsZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgUGFyc2VMb2NhdGlvbiBsb2MpIGNvbnN0OwotCi0gIHZvaWQgQWRkRW50cnkoc3RkOjpzdHJpbmcgbmFtZSwgdWludDMyX3QgdmFsdWUpOwotCi0gIGJvb2wgSGFzRW50cnkoc3RkOjpzdHJpbmcgbmFtZSkgY29uc3Q7Ci0KLSAgdmlydHVhbCBUeXBlIEdldERlZmluaXRpb25UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gZGF0YQotICBzdGQ6Om1hcDx1aW50MzJfdCwgc3RkOjpzdHJpbmc+IGNvbnN0YW50c187Ci0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBlbnRyaWVzXzsKLQotICBFbnVtRGVmKiB0cnlfZnJvbV9lbnVtXyA9IG51bGxwdHI7Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9lbnVtX2dlbi5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZW51bV9nZW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDk0Y2EuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9lbnVtX2dlbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZW51bV9nZW4uaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAidXRpbC5oIgotCi1FbnVtR2VuOjpFbnVtR2VuKEVudW1EZWYgZSkgOiBlXyhzdGQ6Om1vdmUoZSkpIHt9Ci0KLXZvaWQgRW51bUdlbjo6R2VuRGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIHN0cmVhbSkgewotICBzdHJlYW0gPDwgImVudW0gY2xhc3MgIjsKLSAgc3RyZWFtIDw8IGVfLm5hbWVfOwotICBzdHJlYW0gPDwgIiA6ICIgPDwgdXRpbDo6R2V0VHlwZUZvclNpemUoZV8uc2l6ZV8pOwotICBzdHJlYW0gPDwgIiB7IjsKLSAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogZV8uY29uc3RhbnRzXykgewotICAgIHN0cmVhbSA8PCBwYWlyLnNlY29uZCA8PCAiID0gMHgiIDw8IHN0ZDo6aGV4IDw8IHBhaXIuZmlyc3QgPDwgc3RkOjpkZWMgPDwgIiwiOwotICB9Ci0gIHN0cmVhbSA8PCAifTtcbiI7Ci19Ci0KLXZvaWQgRW51bUdlbjo6R2VuRGVmaW5pdGlvblB5YmluZDExKHN0ZDo6b3N0cmVhbSYgc3RyZWFtKSB7Ci0gIHN0cmVhbSA8PCAicHk6OmVudW1fPCIgPDwgZV8ubmFtZV8gPDwgIj4obSwgXCIiIDw8IGVfLm5hbWVfIDw8ICJcIikiOwotICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBlXy5jb25zdGFudHNfKSB7Ci0gICAgc3RyZWFtIDw8ICIudmFsdWUoXCIiIDw8IHBhaXIuc2Vjb25kIDw8ICJcIiwgIiA8PCBlXy5uYW1lXyA8PCAiOjoiIDw8IHBhaXIuc2Vjb25kIDw8ICIpIjsKLSAgfQotICBzdHJlYW0gPDwgIjtcbiI7Ci19Ci0KLXZvaWQgRW51bUdlbjo6R2VuTG9nZ2luZyhzdGQ6Om9zdHJlYW0mIHN0cmVhbSkgewotICAvLyBQcmludCBvdXQgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdGhhdCBjb252ZXJ0cyBhbGwgdGhlIGNvbnN0YW50cyB0byBzdHJpbmdzLgotICBzdHJlYW0gPDwgImlubGluZSBzdGQ6OnN0cmluZyAiIDw8IGVfLm5hbWVfIDw8ICJUZXh0KGNvbnN0ICIgPDwgZV8ubmFtZV8gPDwgIiYgcGFyYW0pIHsiOwotICBzdHJlYW0gPDwgInN3aXRjaCAocGFyYW0pIHsiOwotICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBlXy5jb25zdGFudHNfKSB7Ci0gICAgc3RyZWFtIDw8ICJjYXNlICIgPDwgZV8ubmFtZV8gPDwgIjo6IiA8PCBwYWlyLnNlY29uZCA8PCAiOiI7Ci0gICAgc3RyZWFtIDw8ICIgIHJldHVybiBcIiIgPDwgcGFpci5zZWNvbmQgPDwgIlwiOyI7Ci0gIH0KLSAgc3RyZWFtIDw8ICJkZWZhdWx0OiI7Ci0gIHN0cmVhbSA8PCAiICByZXR1cm4gc3RkOjpzdHJpbmcoXCJVbmtub3duICIgPDwgZV8ubmFtZV8gPDwgIjogXCIpICsgc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50PihwYXJhbSkpOyI7Ci0gIHN0cmVhbSA8PCAifSI7Ci0gIHN0cmVhbSA8PCAifVxuXG4iOwotCi0gIC8vIFByaW50IG91dCB0aGUgc3RyZWFtIG9wZXJhdG9yIHNvIHRoYXQgdGhlIGNvbnN0YW50IGNhbiBiZSB3cml0dGVuIHRvIHN0cmVhbXMuCi0gIHN0cmVhbSA8PCAiaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCAiIDw8IGVfLm5hbWVfIDw8ICImIHBhcmFtKSB7IjsKLSAgc3RyZWFtIDw8ICIgIHJldHVybiBvcyA8PCAiIDw8IGVfLm5hbWVfIDw8ICJUZXh0KHBhcmFtKTsiOwotICBzdHJlYW0gPDwgIn1cbiI7Ci19Ci0KLXZvaWQgRW51bUdlbjo6R2VuUnVzdERlZihzdGQ6Om9zdHJlYW0mIHN0cmVhbSkgewotICBzdHJlYW0gPDwgIiNbZGVyaXZlKEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlLCBEZWJ1ZywgSGFzaCwgRXEsIFBhcnRpYWxFcSwgQ2xvbmUsIENvcHkpXVxuIjsKLSAgc3RyZWFtIDw8ICJwdWIgZW51bSAiIDw8IGVfLm5hbWVfIDw8ICIgeyI7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGVfLmNvbnN0YW50c18pIHsKLSAgICBzdHJlYW0gPDwgdXRpbDo6Q29uc3RhbnRDYXNlVG9DYW1lbENhc2UocGFpci5zZWNvbmQpIDw8ICIgPSAweCIgPDwgc3RkOjpoZXggPDwgcGFpci5maXJzdCA8PCBzdGQ6OmRlYyA8PCAiLCI7Ci0gIH0KLSAgc3RyZWFtIDw8ICJ9IjsKLQotICBzdHJlYW0gPDwgImltcGwgZm10OjpEaXNwbGF5IGZvciAiIDw8IGVfLm5hbWVfIDw8ICIgeyI7Ci0gIHN0cmVhbSA8PCAiZm4gZm10KCZzZWxmLCBmOiAmbXV0IGZtdDo6Rm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7IjsKLSAgc3RyZWFtIDw8ICJtYXRjaCBzZWxmIHsiOwotICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBlXy5jb25zdGFudHNfKSB7Ci0gICAgc3RyZWFtIDw8IGVfLm5hbWVfIDw8ICI6OiIgPDwgdXRpbDo6Q29uc3RhbnRDYXNlVG9DYW1lbENhc2UocGFpci5zZWNvbmQpIDw8ICIgPT4gIgotICAgICAgICAgICA8PCAid3JpdGUhKGYsIFwiezojMCIgPDwgKHV0aWw6OlJvdW5kU2l6ZVVwKGVfLnNpemVfKSAvIDQpICsgMiA8PCAiWH0gKCIgPDwgcGFpci5zZWNvbmQgPDwgIilcIiwgIgotICAgICAgICAgICA8PCAic2VsZi50b18iIDw8IHV0aWw6OkdldFJ1c3RUeXBlRm9yU2l6ZShlXy5zaXplXykgPDwgIigpLnVud3JhcCgpKSwiOwotICB9Ci0gIHN0cmVhbSA8PCAifX19XG4iOwotCi0gIGlmIChlXy50cnlfZnJvbV9lbnVtXyAhPSBudWxscHRyKSB7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG90aGVyX2l0ZW1zOwotICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGVfLnRyeV9mcm9tX2VudW1fLT5jb25zdGFudHNfKSB7Ci0gICAgICBvdGhlcl9pdGVtcy5wdXNoX2JhY2socGFpci5zZWNvbmQpOwotICAgIH0KLSAgICBzdHJlYW0gPDwgImltcGwgVHJ5RnJvbTwiIDw8IGVfLnRyeV9mcm9tX2VudW1fLT5uYW1lXyA8PCAiPiBmb3IgIiA8PCBlXy5uYW1lXyA8PCAiIHsiOwotICAgIHN0cmVhbSA8PCAidHlwZSBFcnJvciA9ICYnc3RhdGljIHN0cjsiOwotICAgIHN0cmVhbSA8PCAiZm4gdHJ5X2Zyb20odmFsdWU6ICIgPDwgZV8udHJ5X2Zyb21fZW51bV8tPm5hbWVfIDw8ICIpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsiOwotICAgIHN0cmVhbSA8PCAibWF0Y2ggdmFsdWUgeyI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogZV8uY29uc3RhbnRzXykgewotICAgICAgaWYgKHN0ZDo6ZmluZChvdGhlcl9pdGVtcy5iZWdpbigpLCBvdGhlcl9pdGVtcy5lbmQoKSwgcGFpci5zZWNvbmQpID09IG90aGVyX2l0ZW1zLmVuZCgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgYXV0byBjb25zdGFudF9uYW1lID0gdXRpbDo6Q29uc3RhbnRDYXNlVG9DYW1lbENhc2UocGFpci5zZWNvbmQpOwotICAgICAgc3RyZWFtIDw8IGVfLnRyeV9mcm9tX2VudW1fLT5uYW1lXyA8PCAiOjoiIDw8IGNvbnN0YW50X25hbWUgPDwgIiA9PiBPaygiIDw8IGVfLm5hbWVfIDw8ICI6OiIgPDwgY29uc3RhbnRfbmFtZQotICAgICAgICAgICAgIDw8ICIpLCI7Ci0gICAgfQotICAgIHN0cmVhbSA8PCAiXyA9PiBFcnIoXCJObyBtYXBwaW5nIGZvciBwcm92aWRlZCBrZXlcIiksIjsKLSAgICBzdHJlYW0gPDwgIn19fSI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZW51bV9nZW4uaCBiL2dkL3BhY2tldC9wYXJzZXIvZW51bV9nZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4NmRmYy4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2VudW1fZ2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiZW51bV9kZWYuaCIKLQotLy8gR2VuZXJhdGVzIHRoZSBDKysgY29kZSBmb3IgYW4gZW51bS4KLWNsYXNzIEVudW1HZW4gewotIHB1YmxpYzoKLSAgRW51bUdlbihFbnVtRGVmIGUpOwotCi0gIHZvaWQgR2VuRGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIHN0cmVhbSk7Ci0KLSAgdm9pZCBHZW5EZWZpbml0aW9uUHliaW5kMTEoc3RkOjpvc3RyZWFtJiBzdHJlYW0pOwotCi0gIHZvaWQgR2VuTG9nZ2luZyhzdGQ6Om9zdHJlYW0mIHN0cmVhbSk7Ci0KLSAgdm9pZCBHZW5SdXN0RGVmKHN0ZDo6b3N0cmVhbSYgc3RyZWFtKTsKLQotICBFbnVtRGVmIGVfOwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRfbGlzdC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZF9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZmMwZDcuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZF9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZpZWxkcy9hbGxfZmllbGRzLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotCi11c2luZyBGaWVsZExpc3RJdGVyYXRvciA9IHN0ZDo6dmVjdG9yPFBhY2tldEZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yOwotdXNpbmcgUmV2ZXJzZUZpZWxkTGlzdEl0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8UGFja2V0RmllbGQqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKLQotY2xhc3MgRmllbGRMaXN0IHsKLSBwdWJsaWM6Ci0gIEZpZWxkTGlzdCgpID0gZGVmYXVsdDsKLQotICBGaWVsZExpc3Qoc3RkOjp2ZWN0b3I8UGFja2V0RmllbGQqPiBmaWVsZHMpIHsKLSAgICBmb3IgKFBhY2tldEZpZWxkKiBmaWVsZCA6IGZpZWxkcykgewotICAgICAgQXBwZW5kRmllbGQoZmllbGQpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4KLSAgRmllbGRMaXN0KEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpIHsKLSAgICB3aGlsZSAoYmVnaW4gIT0gZW5kKSB7Ci0gICAgICBBcHBlbmRGaWVsZCgqYmVnaW4pOwotICAgICAgYmVnaW4rKzsKLSAgICB9Ci0gIH0KLQotICBQYWNrZXRGaWVsZCogb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmllbGRfbGlzdF9baW5kZXhdOwotICB9Ci0KLSAgUGFja2V0RmllbGQqIEdldEZpZWxkKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gZmllbGRfbWFwXy5maW5kKGZpZWxkX25hbWUpOwotICAgIGlmIChpdCA9PSBmaWVsZF9tYXBfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotCi0gIHZvaWQgQXBwZW5kRmllbGQoUGFja2V0RmllbGQqIGZpZWxkKSB7Ci0gICAgQWRkRmllbGQoZmllbGQpOwotICAgIGZpZWxkX2xpc3RfLnB1c2hfYmFjayhmaWVsZCk7Ci0gIH0KLQotICB2b2lkIFByZXBlbmRGaWVsZChQYWNrZXRGaWVsZCogZmllbGQpIHsKLSAgICBBZGRGaWVsZChmaWVsZCk7Ci0gICAgZmllbGRfbGlzdF8uaW5zZXJ0KGZpZWxkX2xpc3RfLmJlZ2luKCksIGZpZWxkKTsKLSAgfQotCi0gIEZpZWxkTGlzdCBHZXRGaWVsZHNCZWZvcmVQYXlsb2FkT3JCb2R5KCkgY29uc3QgewotICAgIEZpZWxkTGlzdCByZXQ7Ci0gICAgZm9yIChhdXRvIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7IGl0KyspIHsKLSAgICAgIGNvbnN0IGF1dG8mIGZpZWxkID0gKml0OwotICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGUgfHwgZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJldC5BcHBlbmRGaWVsZCgqaXQpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBGaWVsZExpc3QgR2V0RmllbGRzQWZ0ZXJQYXlsb2FkT3JCb2R5KCkgY29uc3QgewotICAgIEZpZWxkTGlzdEl0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgaXQrKykgewotICAgICAgY29uc3QgYXV0byYgZmllbGQgPSAqaXQ7Ci0gICAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSB8fCBmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQm9keUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIC8vIEluY3JlbWVudCBpdCBvbmNlIHRvIGdldCBmaXJzdCBmaWVsZCBhZnRlciBwYXlsb2FkL2JvZHkuCi0gICAgICAgIGl0Kys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGaWVsZExpc3QoaXQsIGVuZCgpKTsKLSAgfQotCi0gIEZpZWxkTGlzdCBHZXRGaWVsZHNXaXRoVHlwZXMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGZpZWxkX3R5cGVzKSBjb25zdCB7Ci0gICAgRmllbGRMaXN0IHJldDsKLQotICAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZF9saXN0XykgewotICAgICAgaWYgKGZpZWxkX3R5cGVzLmZpbmQoZmllbGQtPkdldEZpZWxkVHlwZSgpKSAhPSBmaWVsZF90eXBlcy5lbmQoKSkgewotICAgICAgICByZXQuQXBwZW5kRmllbGQoZmllbGQpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBGaWVsZExpc3QgR2V0RmllbGRzV2l0aG91dFR5cGVzKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBmaWVsZF90eXBlcykgY29uc3QgewotICAgIEZpZWxkTGlzdCByZXQ7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRfbGlzdF8pIHsKLSAgICAgIGlmIChmaWVsZF90eXBlcy5maW5kKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgPT0gZmllbGRfdHlwZXMuZW5kKCkpIHsKLSAgICAgICAgcmV0LkFwcGVuZEZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgLy8gQXBwZW5kcyBoZWFkZXIgZmllbGRzIG9mIHBhcmFtIHRvIGhlYWRlciBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgYW5kCi0gIC8vIHByZXBlbmRzIGZvb3RlciBmaWVsZHMgb2YgdGhlIHBhcmFtIHRvIGZvb3RlciBmaWVsZHMgb2YgdGhlIGN1cnJlbnQuCi0gIC8vIEV4LiBBc3N1bWluZyBmaWVsZF9saXN0X1ggaGFzIHRoZSBsYXlvdXQ6Ci0gIC8vICAgZmllbGRfbGlzdF9YX2hlYWRlcgotICAvLyAgIHBheWxvYWQvYm9keQotICAvLyAgIGZpZWxkX2xpc3RfWF9mb290ZXIKLSAgLy8gVGhlIGNhbGwgdG8gZmllbGRfbGlzdF8xLk1lcmdlKGZpZWxkX2xpc3RfMikgd291bGQgcmVzdWx0IGluCi0gIC8vICAgZmllbGRfbGlzdF8xX2hlYWRlcgotICAvLyAgIGZpZWxkX2xpc3RfMl9oZWFkZXIKLSAgLy8gICBwYXlsb2FkL2JvZHkgKHVzZXMgd2hhdGV2ZXIgd2FzIGluIGZpZWxkX2xpc3RfMikKLSAgLy8gICBmaWVsZF9saXN0XzJfZm9vdGVyCi0gIC8vICAgZmllbGRfbGlzdF8xX2Zvb3RlcgotICBGaWVsZExpc3QgTWVyZ2UoRmllbGRMaXN0IG5lc3RlZCkgY29uc3QgewotICAgIEZpZWxkTGlzdCByZXQ7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogR2V0RmllbGRzQmVmb3JlUGF5bG9hZE9yQm9keSgpKSB7Ci0gICAgICByZXQuQXBwZW5kRmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBuZXN0ZWQpIHsKLSAgICAgIHJldC5BcHBlbmRGaWVsZChmaWVsZCk7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IEdldEZpZWxkc0FmdGVyUGF5bG9hZE9yQm9keSgpKSB7Ci0gICAgICByZXQuQXBwZW5kRmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBib29sIEhhc1BheWxvYWRPckJvZHkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGhhc19wYXlsb2FkXyB8fCBoYXNfYm9keV87Ci0gIH0KLQotICBib29sIEhhc1BheWxvYWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGhhc19wYXlsb2FkXzsKLSAgfQotCi0gIGJvb2wgSGFzQm9keSgpIGNvbnN0IHsKLSAgICByZXR1cm4gaGFzX2JvZHlfOwotICB9Ci0KLSAgRmllbGRMaXN0SXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpZWxkX2xpc3RfLmJlZ2luKCk7Ci0gIH0KLQotICBGaWVsZExpc3RJdGVyYXRvciBlbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpZWxkX2xpc3RfLmVuZCgpOwotICB9Ci0KLSAgUmV2ZXJzZUZpZWxkTGlzdEl0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gZmllbGRfbGlzdF8ucmJlZ2luKCk7Ci0gIH0KLQotICBSZXZlcnNlRmllbGRMaXN0SXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmllbGRfbGlzdF8ucmVuZCgpOwotICB9Ci0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpZWxkX2xpc3RfLnNpemUoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBBZGRGaWVsZChQYWNrZXRGaWVsZCogZmllbGQpIHsKLSAgICBpZiAoZmllbGRfbWFwXy5maW5kKGZpZWxkLT5HZXROYW1lKCkpICE9IGZpZWxkX21hcF8uZW5kKCkpIHsKLSAgICAgIEVSUk9SKGZpZWxkKSA8PCAiRmllbGQgd2l0aCBuYW1lIFwiIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJcIiB3YXMgcHJldmlvdXNseSBkZWZpbmVkLlxuIjsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgaWYgKGhhc19ib2R5XykgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgIlBhY2tldCBhbHJlYWR5IGhhcyBhIGJvZHkuIjsKLSAgICAgIH0KLSAgICAgIGhhc19wYXlsb2FkXyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBCb2R5RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIGlmIChoYXNfcGF5bG9hZF8pIHsKLSAgICAgICAgRVJST1IoZmllbGQpIDw8ICJQYWNrZXQgYWxyZWFkeSBoYXMgYSBwYXlsb2FkLiI7Ci0gICAgICB9Ci0gICAgICBoYXNfYm9keV8gPSB0cnVlOwotICAgIH0KLQotICAgIGZpZWxkX21hcF8uaW5zZXJ0KHN0ZDo6cGFpcihmaWVsZC0+R2V0TmFtZSgpLCBmaWVsZCkpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8UGFja2V0RmllbGQqPiBmaWVsZF9saXN0XzsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFBhY2tldEZpZWxkKj4gZmllbGRfbWFwXzsKLSAgYm9vbCBoYXNfcGF5bG9hZF8gPSBmYWxzZTsKLSAgYm9vbCBoYXNfYm9keV8gPSBmYWxzZTsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9hbGxfZmllbGRzLmggYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9hbGxfZmllbGRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGFlZWUuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYWxsX2ZpZWxkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmaWVsZHMvYXJyYXlfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvYm9keV9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9jaGVja3N1bV9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9jaGVja3N1bV9zdGFydF9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9jb3VudF9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9jdXN0b21fZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemUuaCIKLSNpbmNsdWRlICJmaWVsZHMvZW51bV9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9maXhlZF9lbnVtX2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL2ZpeGVkX3NjYWxhcl9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9ncm91cF9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9wYWRkaW5nX2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BheWxvYWRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvcmVzZXJ2ZWRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2NhbGFyX2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL3NpemVfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc3RydWN0X2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL3ZhcmlhYmxlX2xlbmd0aF9zdHJ1Y3RfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvdmVjdG9yX2ZpZWxkLmgiCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9hcnJheV9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2FycmF5X2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODU2ZTViLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2FycmF5X2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvYXJyYXlfZmllbGQuaCIKLQotI2luY2x1ZGUgImZpZWxkcy9jdXN0b21fZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2NhbGFyX2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBBcnJheUZpZWxkOjprRmllbGRUeXBlID0gIkFycmF5RmllbGQiOwotCi1BcnJheUZpZWxkOjpBcnJheUZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBlbGVtZW50X3NpemUsIGludCBhcnJheV9zaXplLCBQYXJzZUxvY2F0aW9uIGxvYykKLSAgICA6IFBhY2tldEZpZWxkKG5hbWUsIGxvYyksIGVsZW1lbnRfZmllbGRfKG5ldyBTY2FsYXJGaWVsZCgidmFsIiwgZWxlbWVudF9zaXplLCBsb2MpKSwgZWxlbWVudF9zaXplXyhlbGVtZW50X3NpemUpLAotICAgICAgYXJyYXlfc2l6ZV8oYXJyYXlfc2l6ZSkgewotICBpZiAoZWxlbWVudF9zaXplID4gNjQgfHwgZWxlbWVudF9zaXplIDwgMCkKLSAgICBFUlJPUih0aGlzKSA8PCBfX2Z1bmNfXyA8PCAiOiBOb3QgaW1wbGVtZW50ZWQgZm9yIGVsZW1lbnQgc2l6ZSA9ICIgPDwgZWxlbWVudF9zaXplOwotICBpZiAoZWxlbWVudF9zaXplICUgOCAhPSAwKSB7Ci0gICAgRVJST1IodGhpcykgPDwgIkNhbiBvbmx5IGhhdmUgYXJyYXlzIHdpdGggZWxlbWVudHMgdGhhdCBhcmUgYnl0ZSBhbGlnbmVkICgiIDw8IGVsZW1lbnRfc2l6ZSA8PCAiKSI7Ci0gIH0KLX0KLQotQXJyYXlGaWVsZDo6QXJyYXlGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBUeXBlRGVmKiB0eXBlX2RlZiwgaW50IGFycmF5X3NpemUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogUGFja2V0RmllbGQobmFtZSwgbG9jKSwgZWxlbWVudF9maWVsZF8odHlwZV9kZWYtPkdldE5ld0ZpZWxkKCJ2YWwiLCBsb2MpKSwKLSAgICAgIGVsZW1lbnRfc2l6ZV8oZWxlbWVudF9maWVsZF8tPkdldFNpemUoKSksIGFycmF5X3NpemVfKGFycmF5X3NpemUpIHsKLSAgaWYgKCFlbGVtZW50X3NpemVfLmVtcHR5KCkgJiYgZWxlbWVudF9zaXplXy5iaXRzKCkgJSA4ICE9IDApIHsKLSAgICBFUlJPUih0aGlzKSA8PCAiQ2FuIG9ubHkgaGF2ZSBhcnJheXMgd2l0aCBlbGVtZW50cyB0aGF0IGFyZSBieXRlIGFsaWduZWQgKCIgPDwgZWxlbWVudF9zaXplXyA8PCAiKSI7Ci0gIH0KLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcmIEFycmF5RmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEFycmF5RmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgQXJyYXlGaWVsZDo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgaWYgKCFlbGVtZW50X3NpemVfLmVtcHR5KCkgJiYgIWVsZW1lbnRfc2l6ZV8uaGFzX2R5bmFtaWMoKSkgewotICAgIHJldHVybiBTaXplKGFycmF5X3NpemVfICogZWxlbWVudF9zaXplXy5iaXRzKCkpOwotICB9Ci0gIHJldHVybiBTaXplKCk7Ci19Ci0KLVNpemUgQXJyYXlGaWVsZDo6R2V0QnVpbGRlclNpemUoKSBjb25zdCB7Ci0gIGlmICghZWxlbWVudF9zaXplXy5lbXB0eSgpICYmICFlbGVtZW50X3NpemVfLmhhc19keW5hbWljKCkpIHsKLSAgICByZXR1cm4gR2V0U2l6ZSgpOwotICB9IGVsc2UgaWYgKGVsZW1lbnRfZmllbGRfLT5CdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSkgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9ICJbdGhpc10oKXsgc2l6ZV90IGxlbmd0aCA9IDA7IGZvciAoY29uc3QgYXV0byYgZWxlbSA6ICIgKyBHZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICJfKSB7IGxlbmd0aCArPSBlbGVtLT5zaXplKCkgKiA4OyB9IHJldHVybiBsZW5ndGg7IH0oKSI7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSAiW3RoaXNdKCl7IHNpemVfdCBsZW5ndGggPSAwOyBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiAiICsgR2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAiXykgeyBsZW5ndGggKz0gZWxlbS5zaXplKCkgKiA4OyB9IHJldHVybiBsZW5ndGg7IH0oKSI7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi1TaXplIEFycmF5RmllbGQ6OkdldFN0cnVjdFNpemUoKSBjb25zdCB7Ci0gIGlmICghZWxlbWVudF9zaXplXy5lbXB0eSgpICYmICFlbGVtZW50X3NpemVfLmhhc19keW5hbWljKCkpIHsKLSAgICByZXR1cm4gR2V0U2l6ZSgpOwotICB9IGVsc2UgaWYgKGVsZW1lbnRfZmllbGRfLT5CdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSkgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9ICJbdGhpc10oKXsgc2l6ZV90IGxlbmd0aCA9IDA7IGZvciAoY29uc3QgYXV0byYgZWxlbSA6IHRvX2ZpbGwtPiIgKyBHZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICJfKSB7IGxlbmd0aCArPSBlbGVtLT5zaXplKCkgKiA4OyB9IHJldHVybiBsZW5ndGg7IH0oKSI7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSAiW3RoaXNdKCl7IHNpemVfdCBsZW5ndGggPSAwOyBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiB0b19maWxsLT4iICsgR2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAiXykgeyBsZW5ndGggKz0gZWxlbS5zaXplKCkgKiA4OyB9IHJldHVybiBsZW5ndGg7IH0oKSI7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyBBcnJheUZpZWxkOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJzdGQ6OmFycmF5PCIgKyBlbGVtZW50X2ZpZWxkXy0+R2V0RGF0YVR5cGUoKSArICIsIiArIHN0ZDo6dG9fc3RyaW5nKGFycmF5X3NpemVfKSArICI+IjsKLX0KLQotdm9pZCBBcnJheUZpZWxkOjpHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCB7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiOjppdGVyYXRvciByZXRfaXQgPSAiIDw8IEdldE5hbWUoKSA8PCAiX3B0ci0+YmVnaW4oKTsiOwotICBzIDw8ICJhdXRvICIgPDwgZWxlbWVudF9maWVsZF8tPkdldE5hbWUoKSA8PCAiX2l0ID0gIiA8PCBHZXROYW1lKCkgPDwgIl9pdDsiOwotICBpZiAoIWVsZW1lbnRfc2l6ZV8uZW1wdHkoKSkgewotICAgIHMgPDwgIndoaWxlICgiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl9pdC5OdW1CeXRlc1JlbWFpbmluZygpID49ICIgPDwgZWxlbWVudF9zaXplXy5ieXRlcygpOwotICAgIHMgPDwgIiAmJiByZXRfaXQgPCAiIDw8IEdldE5hbWUoKSA8PCAiX3B0ci0+ZW5kKCkpIHsiOwotICB9IGVsc2UgewotICAgIHMgPDwgIndoaWxlICgiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl9pdC5OdW1CeXRlc1JlbWFpbmluZygpID4gMCAiOwotICAgIHMgPDwgIiAmJiByZXRfaXQgPCAiIDw8IEdldE5hbWUoKSA8PCAiX3B0ci0+ZW5kKCkpIHsiOwotICB9Ci0gIGlmIChlbGVtZW50X2ZpZWxkXy0+QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkpIHsKLSAgICBzIDw8IGVsZW1lbnRfZmllbGRfLT5HZXREYXRhVHlwZSgpIDw8ICIgIiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfcHRyOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCAiYXV0byAiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl9wdHIgPSByZXRfaXQ7IjsKLSAgfQotICBlbGVtZW50X2ZpZWxkXy0+R2VuRXh0cmFjdG9yKHMsIG51bV9sZWFkaW5nX2JpdHMsIGZvcl9zdHJ1Y3QpOwotICBpZiAoZWxlbWVudF9maWVsZF8tPkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpKSB7Ci0gICAgcyA8PCAiKnJldF9pdCA9IHN0ZDo6bW92ZSgiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl9wdHIpOyI7Ci0gIH0KLSAgcyA8PCAicmV0X2l0Kys7IjsKLSAgcyA8PCAifSI7Ci19Ci0KLXN0ZDo6c3RyaW5nIEFycmF5RmllbGQ6OkdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJHZXQiIDw8IHV0aWw6OlVuZGVyc2NvcmVUb0NhbWVsQ2FzZShHZXROYW1lKCkpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLXZvaWQgQXJyYXlGaWVsZDo6R2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3QgewotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIiAiIDw8IEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIDw8ICIoKSB7IjsKLSAgcyA8PCAiQVNTRVJUKHdhc192YWxpZGF0ZWRfKTsiOwotICBzIDw8ICJzaXplX3QgZW5kX2luZGV4ID0gc2l6ZSgpOyI7Ci0gIHMgPDwgImF1dG8gdG9fYm91bmQgPSBiZWdpbigpOyI7Ci0KLSAgaW50IG51bV9sZWFkaW5nX2JpdHMgPSBHZW5Cb3VuZHMocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0LCBHZXRTaXplKCkpOwotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIiAiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVle307IjsKLSAgcyA8PCBHZXREYXRhVHlwZSgpIDw8ICIqICIgPDwgR2V0TmFtZSgpIDw8ICJfcHRyID0gJiIgPDwgR2V0TmFtZSgpIDw8ICJfdmFsdWU7IjsKLSAgR2VuRXh0cmFjdG9yKHMsIG51bV9sZWFkaW5nX2JpdHMsIGZhbHNlKTsKLQotICBzIDw8ICJyZXR1cm4gIiA8PCBHZXROYW1lKCkgPDwgIl92YWx1ZTsiOwotICBzIDw8ICJ9XG4iOwotfQotCi1zdGQ6OnN0cmluZyBBcnJheUZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmIChlbGVtZW50X2ZpZWxkXy0+QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkpIHsKLSAgICBzcyA8PCAic3RkOjphcnJheTwiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXREYXRhVHlwZSgpIDw8ICIsIiA8PCBhcnJheV9zaXplXyA8PCAiPiI7Ci0gIH0gZWxzZSB7Ci0gICAgc3MgPDwgImNvbnN0IHN0ZDo6YXJyYXk8IiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0RGF0YVR5cGUoKSA8PCAiLCIgPDwgYXJyYXlfc2l6ZV8gPDwgIj4mIjsKLSAgfQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLWJvb2wgQXJyYXlGaWVsZDo6QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkgY29uc3QgewotICByZXR1cm4gZWxlbWVudF9maWVsZF8tPkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpOwotfQotCi1ib29sIEFycmF5RmllbGQ6OkdlbkJ1aWxkZXJNZW1iZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgInN0ZDo6YXJyYXk8IiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0RGF0YVR5cGUoKSA8PCAiLCIgPDwgYXJyYXlfc2l6ZV8gPDwgIj4gIiA8PCBHZXROYW1lKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEFycmF5RmllbGQ6Okhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEFycmF5RmllbGQ6OkdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIEFycmF5IGxlbmd0aCBpcyB2YWxpZGF0ZWQgYnkgdGhlIGNvbXBpbGVyCi19Ci0KLXZvaWQgQXJyYXlGaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgImZvciAoY29uc3QgYXV0byYgdmFsXyA6ICIgPDwgR2V0TmFtZSgpIDw8ICJfKSB7IjsKLSAgZWxlbWVudF9maWVsZF8tPkdlbkluc2VydGVyKHMpOwotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIEFycmF5RmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIE5PVEU6IFdlIGNvdWxkIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNpemUgZGl2aWRlcyBjbGVhbmx5IGludG8gdGhlIGFycmF5IHNpemUsIGJ1dCB3ZSBkZWNpZGVkIHRvIGZvcmdvIHRoYXQKLSAgLy8gaW4gZmF2b3Igb2YganVzdCByZXR1cm5pbmcgYXMgbWFueSBlbGVtZW50cyBhcyBwb3NzaWJsZSBpbiBhIGJlc3QgZWZmb3J0IHN0eWxlLgotICAvLwotICAvLyBPdGhlciB0aGFuIHRoYXQgdGhlcmUgaXMgbm90aGluZyB0aGF0IGFycmF5cyBuZWVkIHRvIGJlIHZhbGlkYXRlZCBvbiBvdGhlciB0aGFuIGxlbmd0aCBzbyBub3RoaW5nIG5lZWRzIHRvCi0gIC8vIGJlIGRvbmUgaGVyZS4KLX0KLQotYm9vbCBBcnJheUZpZWxkOjpJc0NvbnRhaW5lckZpZWxkKCkgY29uc3QgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgUGFja2V0RmllbGQqIEFycmF5RmllbGQ6OkdldEVsZW1lbnRGaWVsZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGVsZW1lbnRfZmllbGRfOwotfQotCi12b2lkIEFycmF5RmllbGQ6OkdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0IHsKLSAgcyA8PCAiXCJBUlJBWVtcIjsiOwotICBzIDw8ICIvKiAiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXREYXRhVHlwZSgpIDw8ICIgICAiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXRGaWVsZFR5cGUoKSA8PCAiICovIjsKLQotICBzdGQ6OnN0cmluZyBhcnJfaWR4ID0gImFycmlkeF8iICsgYWNjZXNzb3I7Ci0gIHN0ZDo6c3RyaW5nIGFycl9zaXplID0gc3RkOjp0b19zdHJpbmcoYXJyYXlfc2l6ZV8pOwotICBzIDw8ICJmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgIiA8PCBhcnJfc2l6ZSA8PCAiOyBpbmRleCsrKSB7IjsKLSAgc3RkOjpzdHJpbmcgZWxlbWVudF9hY2Nlc3NvciA9ICIoIiArIGFjY2Vzc29yICsgIltpbmRleF0pIjsKLSAgcyA8PCAic3MgPDwgKChpbmRleCA9PSAwKSA/IFwiXCIgOiBcIiwgXCIpIDw8ICI7Ci0KLSAgaWYgKGVsZW1lbnRfZmllbGRfLT5HZXRGaWVsZFR5cGUoKSA9PSBDdXN0b21GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgIHMgPDwgZWxlbWVudF9hY2Nlc3NvciA8PCAiLlRvU3RyaW5nKCkiOwotICB9IGVsc2UgewotICAgIGVsZW1lbnRfZmllbGRfLT5HZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzLCBlbGVtZW50X2FjY2Vzc29yKTsKLSAgfQotCi0gIHMgPDwgIjt9IjsKLSAgcyA8PCAic3MgPDwgXCJdXCIiOwotfQotCi1zdGQ6OnN0cmluZyBBcnJheUZpZWxkOjpHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAiWyIgKyBlbGVtZW50X2ZpZWxkXy0+R2V0UnVzdERhdGFUeXBlKCkgKyAiOyAiICsgc3RkOjp0b19zdHJpbmcoYXJyYXlfc2l6ZV8pICsgIl0iOwotfQotCi12b2lkIEFycmF5RmllbGQ6OkdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSkgY29uc3QgewotICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9ICI7Ci0gIHMgPDwgImJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uIjsKLSAgcyA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIEdldFNpemUoKS5ieXRlcygpIDw8ICJdLnRyeV9pbnRvKCkudW53cmFwKCk7IjsKLX0KLQotdm9pZCBBcnJheUZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUpIGNvbnN0IHsKLSAgcyA8PCAiJmJ1ZmZlclsiIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpIDw8ICIuLiIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgKyBHZXRTaXplKCkuYnl0ZXMoKQotICAgIDw8ICJdLmNvcHlfZnJvbV9zbGljZSgmc2VsZi4iIDw8IEdldE5hbWUoKSA8PCAiKTsiOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYXJyYXlfZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2FycmF5X2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDQ4N2QuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYXJyYXlfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAidHlwZV9kZWYuaCIKLQotY2xhc3MgQXJyYXlGaWVsZCA6IHB1YmxpYyBQYWNrZXRGaWVsZCB7Ci0gcHVibGljOgotICBBcnJheUZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBlbGVtZW50X3NpemUsIGludCBmaXhlZF9zaXplLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgQXJyYXlGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBUeXBlRGVmKiB0eXBlX2RlZiwgaW50IGZpeGVkX3NpemUsIFBhcnNlTG9jYXRpb24gbG9jKTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgU2l6ZSBHZXRCdWlsZGVyU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgU2l6ZSBHZXRTdHJ1Y3RTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBHZW5CdWlsZGVyTWVtYmVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBJc0NvbnRhaW5lckZpZWxkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBjb25zdCBQYWNrZXRGaWVsZCogR2V0RWxlbWVudEZpZWxkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UnVzdERhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87Ci0KLSAgY29uc3QgUGFja2V0RmllbGQqIGVsZW1lbnRfZmllbGRfe251bGxwdHJ9OwotCi0gIGNvbnN0IFNpemUgZWxlbWVudF9zaXplX3t9OwotCi0gIGNvbnN0IGludCBhcnJheV9zaXplX3stMX07Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYm9keV9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2JvZHlfZmllbGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2YxODQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYm9keV9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvYm9keV9maWVsZC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBCb2R5RmllbGQ6OmtGaWVsZFR5cGUgPSAiQm9keUZpZWxkIjsKLQotQm9keUZpZWxkOjpCb2R5RmllbGQoUGFyc2VMb2NhdGlvbiBsb2MpIDogUGFja2V0RmllbGQoImJvZHkiLCBsb2MpIHt9Ci0KLXZvaWQgQm9keUZpZWxkOjpTZXRTaXplRmllbGQoY29uc3QgU2l6ZUZpZWxkKiBzaXplX2ZpZWxkKSB7Ci0gIGlmIChzaXplX2ZpZWxkXyAhPSBudWxscHRyKSB7Ci0gICAgRVJST1IodGhpcywgc2l6ZV9maWVsZF8sIHNpemVfZmllbGQpIDw8ICJUaGUgc2l6ZSBmaWVsZCBmb3IgdGhlIGJvZHkgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC4iOwotICB9Ci0gIHNpemVfZmllbGRfID0gc2l6ZV9maWVsZDsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcmIEJvZHlGaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQm9keUZpZWxkOjprRmllbGRUeXBlOwotfQotCi1TaXplIEJvZHlGaWVsZDo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgaWYgKHNpemVfZmllbGRfID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gU2l6ZSgwKTsKLSAgfQotICBzdGQ6OnN0cmluZyBkeW5hbWljX3NpemUgPSAiKCIgKyBzaXplX2ZpZWxkXy0+R2V0TmFtZSgpICsgIiAqIDgpIjsKLSAgcmV0dXJuIGR5bmFtaWNfc2l6ZTsKLX0KLQotc3RkOjpzdHJpbmcgQm9keUZpZWxkOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgIk5vIG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiBhIGJvZHkgZmllbGQuIjsKLSAgcmV0dXJuICJCb2R5VHlwZSI7Ci19Ci0KLXZvaWQgQm9keUZpZWxkOjpHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiwgaW50LCBib29sKSBjb25zdCB7fQotCi1zdGQ6OnN0cmluZyBCb2R5RmllbGQ6OkdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICIiOwotfQotCi12b2lkIEJvZHlGaWVsZDo6R2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHt9Ci0KLXN0ZDo6c3RyaW5nIEJvZHlGaWVsZDo6R2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAiIjsKLX0KLQotYm9vbCBCb2R5RmllbGQ6Okhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEJvZHlGaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gVGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgZm9yIGEgcGF5bG9hZAotfQotCi12b2lkIEJvZHlGaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQm9keUZpZWxkOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQm9keUZpZWxkOjpHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCB7Ci0gIHMgPDwgIlwiQk9EWSBSRVBSRVNFTlRBVElPTl9VTklNUExFTUVOVEVEICIgPDwgYWNjZXNzb3IgPDwgIiBcIiI7Ci19Ci0KLXN0ZDo6c3RyaW5nIEJvZHlGaWVsZDo6R2V0UnVzdERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gR2V0RGF0YVR5cGUoKTsKLX0KLQotdm9pZCBCb2R5RmllbGQ6OkdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3QgewotfQotCi12b2lkIEJvZHlGaWVsZDo6R2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7fQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYm9keV9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvYm9keV9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzFhZjc0Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2JvZHlfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9zaXplX2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgQm9keUZpZWxkIDogcHVibGljIFBhY2tldEZpZWxkIHsKLSBwdWJsaWM6Ci0gIEJvZHlGaWVsZChQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXRTaXplRmllbGQoY29uc3QgU2l6ZUZpZWxkKiBzaXplX2ZpZWxkKTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wgZm9yX3N0cnVjdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUsIHN0ZDo6c3RyaW5nKSBjb25zdCBvdmVycmlkZXt9OwotICAvLyBCb2R5IGZpZWxkcyBjYW4gb25seSBiZSBkeW5hbWljYWxseSBzaXplZC4KLSAgY29uc3QgU2l6ZUZpZWxkKiBzaXplX2ZpZWxkX3tudWxscHRyfTsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jaGVja3N1bV9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NoZWNrc3VtX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JjYWMyLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NoZWNrc3VtX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9jaGVja3N1bV9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotY29uc3Qgc3RkOjpzdHJpbmcgQ2hlY2tzdW1GaWVsZDo6a0ZpZWxkVHlwZSA9ICJDaGVja3N1bUZpZWxkIjsKLQotQ2hlY2tzdW1GaWVsZDo6Q2hlY2tzdW1GaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlX25hbWUsIGludCBzaXplLCBQYXJzZUxvY2F0aW9uIGxvYykKLSAgICA6IFNjYWxhckZpZWxkKG5hbWUsIHNpemUsIGxvYyksIHR5cGVfbmFtZV8odHlwZV9uYW1lKSB7fQotCi1jb25zdCBzdGQ6OnN0cmluZyYgQ2hlY2tzdW1GaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQ2hlY2tzdW1GaWVsZDo6a0ZpZWxkVHlwZTsKLX0KLQotc3RkOjpzdHJpbmcgQ2hlY2tzdW1GaWVsZDo6R2V0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB0eXBlX25hbWVfOwotfQotCi12b2lkIENoZWNrc3VtRmllbGQ6OkdlbkV4dHJhY3RvcihzdGQ6Om9zdHJlYW0mLCBpbnQsIGJvb2wpIGNvbnN0IHt9Ci0KLXN0ZDo6c3RyaW5nIENoZWNrc3VtRmllbGQ6OkdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICIiOwotfQotCi12b2lkIENoZWNrc3VtRmllbGQ6OkdlbkdldHRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7fQotCi1ib29sIENoZWNrc3VtRmllbGQ6OkdlbkJ1aWxkZXJQYXJhbWV0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ2hlY2tzdW1GaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ2hlY2tzdW1GaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBDaGVja3N1bUZpZWxkOjpHZW5JbnNlcnRlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAicGFja2V0OjpCeXRlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBpLlVucmVnaXN0ZXJPYnNlcnZlcigpOyI7Ci0gIHMgPDwgImluc2VydChzdGF0aWNfY2FzdDwiIDw8IHV0aWw6OkdldFR5cGVGb3JTaXplKEdldFNpemUoKS5iaXRzKCkpIDw8ICI+KG9ic2VydmVyLkdldFZhbHVlKCkpLCBpKTsiOwotfQotCi12b2lkIENoZWNrc3VtRmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIERvbmUgaW4gcGFja2V0X2RlZi5jYwotfQotCi12b2lkIENoZWNrc3VtRmllbGQ6OkdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcpIGNvbnN0IHsKLSAgLy8gVE9ETzogdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBnZXQgY2hlY2tzdW0gdmFsdWUKLSAgcyA8PCAiXCJDSEVDS1NVTVwiIjsKLX0KLQotdm9pZCBDaGVja3N1bUZpZWxkOjpHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHsKLX0KLQotdm9pZCBDaGVja3N1bUZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHt9CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jaGVja3N1bV9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvY2hlY2tzdW1fZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1YjIyMS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jaGVja3N1bV9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmaWVsZHMvcGFja2V0X2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL3NjYWxhcl9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIENoZWNrc3VtRmllbGQgOiBwdWJsaWMgU2NhbGFyRmllbGQgewotIHB1YmxpYzoKLSAgQ2hlY2tzdW1GaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlX25hbWUsIGludCBzaXplLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgR2VuQnVpbGRlclBhcmFtZXRlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5JbnNlcnRlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jaGVja3N1bV9zdGFydF9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NoZWNrc3VtX3N0YXJ0X2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMwM2I4Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NoZWNrc3VtX3N0YXJ0X2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9jaGVja3N1bV9zdGFydF9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotY29uc3Qgc3RkOjpzdHJpbmcgQ2hlY2tzdW1TdGFydEZpZWxkOjprRmllbGRUeXBlID0gIkNoZWNrc3VtU3RhcnRGaWVsZCI7Ci0KLUNoZWNrc3VtU3RhcnRGaWVsZDo6Q2hlY2tzdW1TdGFydEZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogUGFja2V0RmllbGQobmFtZSArICJfc3RhcnQiLCBsb2MpLCBzdGFydGVkX2ZpZWxkX25hbWVfKG5hbWUpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBDaGVja3N1bVN0YXJ0RmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIENoZWNrc3VtU3RhcnRGaWVsZDo6a0ZpZWxkVHlwZTsKLX0KLQotU2l6ZSBDaGVja3N1bVN0YXJ0RmllbGQ6OkdldFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBTaXplKDApOwotfQotCi1zdGQ6OnN0cmluZyBDaGVja3N1bVN0YXJ0RmllbGQ6OkdldERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gIlRoZXJlJ3Mgbm8gdHlwZSBmb3IgQ2hlY2tzdW0gU3RhcnQgZmllbGRzIjsKLX0KLQotdm9pZCBDaGVja3N1bVN0YXJ0RmllbGQ6OkdlbkV4dHJhY3RvcihzdGQ6Om9zdHJlYW0mLCBpbnQsIGJvb2wpIGNvbnN0IHt9Ci0KLXN0ZDo6c3RyaW5nIENoZWNrc3VtU3RhcnRGaWVsZDo6R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3QgewotICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgQ2hlY2tzdW1TdGFydEZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3Qge30KLQotc3RkOjpzdHJpbmcgQ2hlY2tzdW1TdGFydEZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICIiOwotfQotCi1ib29sIENoZWNrc3VtU3RhcnRGaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ2hlY2tzdW1TdGFydEZpZWxkOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qge30KLQotdm9pZCBDaGVja3N1bVN0YXJ0RmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgX19mdW5jX18gPDwgIjogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgY2hlY2tzdW0gc3RhcnQgZmllbGRzIjsKLX0KLQotdm9pZCBDaGVja3N1bVN0YXJ0RmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7fQotCi1zdGQ6OnN0cmluZyBDaGVja3N1bVN0YXJ0RmllbGQ6OkdldFN0YXJ0ZWRGaWVsZE5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGFydGVkX2ZpZWxkX25hbWVfOwotfQotCi12b2lkIENoZWNrc3VtU3RhcnRGaWVsZDo6R2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiwgc3RkOjpzdHJpbmcpIGNvbnN0IHsKLSAgLy8gUHJpbnQgbm90aGluZyBmb3IgY2hlY2tzdW0gc3RhcnQKLX0KLQotc3RkOjpzdHJpbmcgQ2hlY2tzdW1TdGFydEZpZWxkOjpHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXREYXRhVHlwZSgpOwotfQotCi12b2lkIENoZWNrc3VtU3RhcnRGaWVsZDo6R2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7Ci19Ci0KLXZvaWQgQ2hlY2tzdW1TdGFydEZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHt9CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jaGVja3N1bV9zdGFydF9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvY2hlY2tzdW1fc3RhcnRfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlNzFiYS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jaGVja3N1bV9zdGFydF9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmaWVsZHMvcGFja2V0X2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgQ2hlY2tzdW1TdGFydEZpZWxkIDogcHVibGljIFBhY2tldEZpZWxkIHsKLSBwdWJsaWM6Ci0gIENoZWNrc3VtU3RhcnRGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgc3RkOjpzdHJpbmcgR2V0RmllbGQoKSBjb25zdDsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wgZm9yX3N0cnVjdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5JbnNlcnRlcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U3RhcnRlZEZpZWxkTmFtZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgc3RhcnRlZF9maWVsZF9uYW1lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jb3VudF9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NvdW50X2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGIzZDkwLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NvdW50X2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9jb3VudF9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotY29uc3Qgc3RkOjpzdHJpbmcgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSA9ICJDb3VudEZpZWxkIjsKLQotQ291bnRGaWVsZDo6Q291bnRGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBpbnQgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBTY2FsYXJGaWVsZChuYW1lICsgIl9jb3VudCIsIHNpemUsIGxvYyksIHNpemVkX2ZpZWxkX25hbWVfKG5hbWUpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBDb3VudEZpZWxkOjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudEZpZWxkOjprRmllbGRUeXBlOwotfQotCi12b2lkIENvdW50RmllbGQ6OkdlbkdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IHsKLSAgcyA8PCAicHJvdGVjdGVkOiI7Ci0gIFNjYWxhckZpZWxkOjpHZW5HZXR0ZXIocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0KTsKLSAgcyA8PCAicHVibGljOlxuIjsKLX0KLQotYm9vbCBDb3VudEZpZWxkOjpHZW5CdWlsZGVyUGFyYW1ldGVyKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gVGhlcmUgaXMgbm8gYnVpbGRlciBwYXJhbWV0ZXIgZm9yIGEgc2l6ZSBmaWVsZAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ291bnRGaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ291bnRGaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gVGhlcmUgaXMgbm8gYnVpbGRlciBwYXJhbWV0ZXIgZm9yIGEgc2l6ZSBmaWVsZAotICAvLyBUT0RPOiBDaGVjayBpZiB0aGUgcGF5bG9hZCBmaXRzIGluIHRoZSBwYWNrZXQ/Ci19Ci0KLXZvaWQgQ291bnRGaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCBfX2Z1bmNfXyA8PCAiOiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBjb3VudCBmaWVsZHMiOwotfQotCi12b2lkIENvdW50RmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIERvIG5vdGhpbmcgc2luY2UgdGhlIGZpeGVkIGNvdW50IGZpZWxkcyB3aWxsIGJlIGhhbmRsZWQgc3BlY2lhbGx5LgotfQotCi1zdGQ6OnN0cmluZyBDb3VudEZpZWxkOjpHZXRTaXplZEZpZWxkTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNpemVkX2ZpZWxkX25hbWVfOwotfQotCi12b2lkIENvdW50RmllbGQ6OkdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSkgY29uc3QgewotICBzIDw8ICJidWZmZXJbIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiLi4iOwotICBzIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpICsgR2V0U2l6ZSgpLmJ5dGVzKCkgPDwgIl0uY29weV9mcm9tX3NsaWNlKCYiOwotICBzIDw8ICIoc2VsZi4iIDw8IEdldFNpemVkRmllbGROYW1lKCkgPDwgIi5sZW4oKSBhcyB1OCkudG9fbGVfYnl0ZXMoKSk7IjsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NvdW50X2ZpZWxkLmggYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jb3VudF9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdhNGU3Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2NvdW50X2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2NhbGFyX2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgQ291bnRGaWVsZCA6IHB1YmxpYyBTY2FsYXJGaWVsZCB7Ci0gcHVibGljOgotICBDb3VudEZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBzaXplLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgc3RkOjpzdHJpbmcgR2V0RmllbGQoKSBjb25zdDsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEdlbkJ1aWxkZXJQYXJhbWV0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTaXplZEZpZWxkTmFtZSgpIGNvbnN0OwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IHNpemVfOwotICBzdGQ6OnN0cmluZyBzaXplZF9maWVsZF9uYW1lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jdXN0b21fZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jdXN0b21fZmllbGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NzYxYWIuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvY3VzdG9tX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvY3VzdG9tX2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBDdXN0b21GaWVsZDo6a0ZpZWxkVHlwZSA9ICJDdXN0b21GaWVsZCI7Ci0KLUN1c3RvbUZpZWxkOjpDdXN0b21GaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlX25hbWUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogUGFja2V0RmllbGQobmFtZSwgbG9jKSwgdHlwZV9uYW1lXyh0eXBlX25hbWUpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBDdXN0b21GaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQ3VzdG9tRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgQ3VzdG9tRmllbGQ6OkdldFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBTaXplKCk7Ci19Ci0KLVNpemUgQ3VzdG9tRmllbGQ6OkdldEJ1aWxkZXJTaXplKCkgY29uc3QgewotICBzdGQ6OnN0cmluZyByZXQgPSAiKCIgKyBHZXROYW1lKCkgKyAiXy5zaXplKCkgKiA4KSAiOwotICByZXR1cm4gcmV0OwotfQotCi1zdGQ6OnN0cmluZyBDdXN0b21GaWVsZDo6R2V0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB0eXBlX25hbWVfOwotfQotCi12b2lkIEN1c3RvbUZpZWxkOjpHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQsIGJvb2wpIGNvbnN0IHsKLSAgcyA8PCAiYXV0byBvcHRpb25hbF9pdCA9ICI7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiOjpQYXJzZSggIiA8PCBHZXROYW1lKCkgPDwgIl9wdHIsICIgPDwgR2V0TmFtZSgpIDw8ICJfaXQpOyI7Ci0gIHMgPDwgImlmIChvcHRpb25hbF9pdCkgeyI7Ci0gIHMgPDwgR2V0TmFtZSgpIDw8ICJfaXQgPSAqb3B0aW9uYWxfaXQ7IjsKLSAgcyA8PCAifSBlbHNlIHsiOwotICBzIDw8IEdldE5hbWUoKSA8PCAiX2l0ID0gIiA8PCBHZXROYW1lKCkgPDwgIl9pdCArICIgPDwgR2V0TmFtZSgpIDw8ICJfaXQuTnVtQnl0ZXNSZW1haW5pbmcoKTsiOwotICBzIDw8IEdldE5hbWUoKSA8PCAiX3B0ciA9IG51bGxwdHI7IjsKLSAgcyA8PCAifSI7Ci19Ci0KLXN0ZDo6c3RyaW5nIEN1c3RvbUZpZWxkOjpHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiR2V0IiA8PCB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UoR2V0TmFtZSgpKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi12b2lkIEN1c3RvbUZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIHMgPDwgInN0ZDo6dW5pcXVlX3B0cjwiIDw8IEdldERhdGFUeXBlKCkgPDwgIj4gIiA8PCBHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSA8PCAiKCkgY29uc3QgeyI7Ci0gIHMgPDwgIkFTU0VSVCh3YXNfdmFsaWRhdGVkXyk7IjsKLSAgcyA8PCAic2l6ZV90IGVuZF9pbmRleCA9IHNpemUoKTsiOwotICBzIDw8ICJhdXRvIHRvX2JvdW5kID0gYmVnaW4oKTsiOwotCi0gIGludCBudW1fbGVhZGluZ19iaXRzID0gR2VuQm91bmRzKHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCwgR2V0U2l6ZSgpKTsKLSAgcyA8PCAic3RkOjp1bmlxdWVfcHRyPCIgPDwgR2V0RGF0YVR5cGUoKSA8PCAiPiAiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVlIjsKLSAgcyA8PCAiID0gc3RkOjptYWtlX3VuaXF1ZTwiIDw8IEdldERhdGFUeXBlKCkgPDwgIj4oKTsiOwotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIiogIiA8PCBHZXROYW1lKCkgPDwgIl9wdHIgPSAiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVlLmdldCgpOyI7Ci0gIEdlbkV4dHJhY3RvcihzLCBudW1fbGVhZGluZ19iaXRzLCBmYWxzZSk7Ci0gIHMgPDwgImlmICgiIDw8IEdldE5hbWUoKSA8PCAiX3B0ciA9PSBudWxscHRyKSB7IiA8PCBHZXROYW1lKCkgPDwgIl92YWx1ZS5yZXNldCgpOyB9IjsKLSAgcyA8PCAicmV0dXJuICIgPDwgR2V0TmFtZSgpIDw8ICJfdmFsdWU7IjsKLSAgcyA8PCAifVxuIjsKLX0KLQotc3RkOjpzdHJpbmcgQ3VzdG9tRmllbGQ6OkdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkgY29uc3QgewotICByZXR1cm4gR2V0RGF0YVR5cGUoKTsKLX0KLQotYm9vbCBDdXN0b21GaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ3VzdG9tRmllbGQ6OkdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQ3VzdG9tRmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8IEdldE5hbWUoKSA8PCAiXy5TZXJpYWxpemUoaSk7IjsKLX0KLQotdm9pZCBDdXN0b21GaWVsZDo6R2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBDdXN0b21GaWVsZDo6R2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3QgewotICBzIDw8IGFjY2Vzc29yIDw8ICItPlRvU3RyaW5nKCkiOwotfQotCi12b2lkIEN1c3RvbUZpZWxkOjpHZW5CdWlsZGVyUGFyYW1ldGVyRnJvbVZpZXcoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgIip2aWV3LkdldCIgPDwgdXRpbDo6VW5kZXJzY29yZVRvQ2FtZWxDYXNlKEdldE5hbWUoKSkgPDwgIigpIjsKLX0KLQotc3RkOjpzdHJpbmcgQ3VzdG9tRmllbGQ6OkdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHR5cGVfbmFtZV87Ci19Ci0KLXZvaWQgQ3VzdG9tRmllbGQ6OkdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3QgewotfQotCi12b2lkIEN1c3RvbUZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHt9CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jdXN0b21fZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2N1c3RvbV9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTY0MmM5Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2N1c3RvbV9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmaWVsZHMvcGFja2V0X2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgQ3VzdG9tRmllbGQgOiBwdWJsaWMgUGFja2V0RmllbGQgewotIHB1YmxpYzoKLSAgQ3VzdG9tRmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZV9uYW1lLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBTaXplIEdldFNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0QnVpbGRlclNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldERhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkV4dHJhY3RvcihzdGQ6Om9zdHJlYW0mIHMsIGludCBudW1fbGVhZGluZ19iaXRzLCBib29sIGZvcl9zdHJ1Y3QpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuQnVpbGRlclBhcmFtZXRlckZyb21WaWV3KHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZV87Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemUuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jdXN0b21fZmllbGRfZml4ZWRfc2l6ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjMjdmYS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9jdXN0b21fZmllbGRfZml4ZWRfc2l6ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZmllbGRzL2N1c3RvbV9maWVsZF9maXhlZF9zaXplLmgiCi0KLSNpbmNsdWRlICJ1dGlsLmgiCi0KLWNvbnN0IHN0ZDo6c3RyaW5nIEN1c3RvbUZpZWxkRml4ZWRTaXplOjprRmllbGRUeXBlID0gIkN1c3RvbUZpZWxkIjsKLQotQ3VzdG9tRmllbGRGaXhlZFNpemU6OkN1c3RvbUZpZWxkRml4ZWRTaXplKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSwgaW50IHNpemUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogU2NhbGFyRmllbGQobmFtZSwgc2l6ZSwgbG9jKSwgdHlwZV9uYW1lXyh0eXBlX25hbWUpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBDdXN0b21GaWVsZEZpeGVkU2l6ZTo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQ3VzdG9tRmllbGRGaXhlZFNpemU6OmtGaWVsZFR5cGU7Ci19Ci0KLXN0ZDo6c3RyaW5nIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHR5cGVfbmFtZV87Ci19Ci0KLXN0ZDo6c3RyaW5nIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB0eXBlX25hbWVfOwotfQotCi1pbnQgQ3VzdG9tRmllbGRGaXhlZFNpemU6OkdlbkJvdW5kcyhzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQsIFNpemUgc2l6ZSkgY29uc3QgewotICBpZiAoIXN0YXJ0X29mZnNldC5lbXB0eSgpKSB7Ci0gICAgLy8gRGVmYXVsdCB0byBzdGFydCBpZiBhdmFpbGFibGUuCi0gICAgcyA8PCAiYXV0byAiIDw8IEdldE5hbWUoKSA8PCAiX2l0ID0gdG9fYm91bmQgKyAoIiA8PCBzdGFydF9vZmZzZXQgPDwgIikgLyA4OyI7Ci0gIH0gZWxzZSBpZiAoIWVuZF9vZmZzZXQuZW1wdHkoKSkgewotICAgIFNpemUgYnl0ZV9vZmZzZXQgPSBzaXplICsgZW5kX29mZnNldDsKLSAgICBzIDw8ICJhdXRvICIgPDwgR2V0TmFtZSgpIDw8ICJfaXQgPSB0b19ib3VuZCAoKyB0b19ib3VuZC5OdW1CeXRlc1JlbWFpbmluZygpIC0gKCIgPDwgYnl0ZV9vZmZzZXQgPDwgIikgLyA4KTsiOwotICB9IGVsc2UgewotICAgIEVSUk9SKHRoaXMpIDw8ICJBbWJpZ3VvdXMgb2Zmc2V0IGZvciBmaWVsZC4iOwotICB9Ci0gIHJldHVybiAwOyAgLy8gbnVtX2xlYWRpbmdfYml0cwotfQotCi12b2lkIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQsIGJvb2wpIGNvbnN0IHsKLSAgcyA8PCAiKiIgPDwgR2V0TmFtZSgpIDw8ICJfcHRyID0gIiA8PCBHZXROYW1lKCkgPDwgIl9pdC5leHRyYWN0PCIgPDwgR2V0RGF0YVR5cGUoKSA8PCAiPigpOyI7Ci19Ci0KLWJvb2wgQ3VzdG9tRmllbGRGaXhlZFNpemU6Okhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZW5JbnNlcnRlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiaW5zZXJ0KCIgPDwgR2V0TmFtZSgpIDw8ICJfLCBpKTsiOwotfQotCi12b2lkIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCB7Ci0gIC8vIFdlIGFzc3VtZSB0aGF0IGN1c3RvbSBmaWVsZHMgd2lsbCBoYXZlIGEgVG9TdHJpbmcoKSBtZXRob2QKLSAgcyA8PCBhY2Nlc3NvciA8PCAiLlRvU3RyaW5nKCkiOwotfQotCi1zdGQ6OnN0cmluZyBDdXN0b21GaWVsZEZpeGVkU2l6ZTo6R2V0UnVzdFBhcnNlRGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAiW3U4OyAiICsgc3RkOjp0b19zdHJpbmcoR2V0U2l6ZSgpLmJ5dGVzKCkpICsgIl0iOwotfQotCi12b2lkIEN1c3RvbUZpZWxkRml4ZWRTaXplOjpHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3QgewotICBTaXplIHNpemUgPSBHZXRTaXplKCk7Ci0gIGludCBudW1fbGVhZGluZ19iaXRzID0gR2V0UnVzdEJpdE9mZnNldChzLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQsIEdldFNpemUoKSk7Ci0gIGlmIChudW1fbGVhZGluZ19iaXRzICE9IDApIHsKLSAgICBFUlJPUih0aGlzKSA8PCAibXVzdCBiZSBieXRlIGFsaWduZWQiOwotICB9Ci0gIGlmIChzaXplLmJpdHMoKSAlIDggIT0gMCkgewotICAgIEVSUk9SKHRoaXMpIDw8ICJzaXplIG11c3QgYmUgaW4gZnVsbCBieXRlcyI7Ci0gIH0KLQotICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9IGJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uIjsKLSAgcyA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIHNpemUuYnl0ZXMoKSA8PCAiXS50cnlfaW50bygpLnVud3JhcCgpOyI7Ci19Ci0KLXZvaWQgQ3VzdG9tRmllbGRGaXhlZFNpemU6OkdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIFNpemUgc2l6ZSA9IEdldFNpemUoKTsKLSAgaW50IG51bV9sZWFkaW5nX2JpdHMgPSBHZXRSdXN0Qml0T2Zmc2V0KHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCwgR2V0U2l6ZSgpKTsKLSAgaWYgKG51bV9sZWFkaW5nX2JpdHMgIT0gMCkgewotICAgIEVSUk9SKHRoaXMpIDw8ICJtdXN0IGJlIGJ5dGUgYWxpZ25lZCI7Ci0gIH0KLSAgaWYgKHNpemUuYml0cygpICUgOCAhPSAwKSB7Ci0gICAgRVJST1IodGhpcykgPDwgInNpemUgbXVzdCBiZSBpbiBmdWxsIGJ5dGVzIjsKLSAgfQotCi0gIHMgPDwgImxldCAiIDw8IEdldE5hbWUoKSA8PCAiOiAiIDw8IEdldFJ1c3RQYXJzZURhdGFUeXBlKCkgPDwgIiA9IHNlbGYuIiA8PCBHZXROYW1lKCkgPDwgIi5pbnRvKCk7IjsKLSAgcyA8PCAiYnVmZmVyWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIEdldFNpemUoKS5ieXRlcygpIDw8ICJdLmNvcHlfZnJvbV9zbGljZSgmIgotICAgIDw8IEdldE5hbWUoKSA8PCAiKTsiOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemUuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2N1c3RvbV9maWVsZF9maXhlZF9zaXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MjNmODAuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvY3VzdG9tX2ZpZWxkX2ZpeGVkX3NpemUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmllbGRzL3NjYWxhcl9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIEN1c3RvbUZpZWxkRml4ZWRTaXplIDogcHVibGljIFNjYWxhckZpZWxkIHsKLSBwdWJsaWM6Ci0gIEN1c3RvbUZpZWxkRml4ZWRTaXplKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSwgaW50IHNpemUsIFBhcnNlTG9jYXRpb24gbG9jKTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldERhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBpbnQgR2VuQm91bmRzKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCwgU2l6ZSBzaXplKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wgZm9yX3N0cnVjdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJ1c3RQYXJzZURhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9lbnVtX2ZpZWxkLmNjIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZW51bV9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1ODRmMS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9lbnVtX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9lbnVtX2ZpZWxkLmgiCi0KLSNpbmNsdWRlICJ1dGlsLmgiCi0KLWNvbnN0IHN0ZDo6c3RyaW5nIEVudW1GaWVsZDo6a0ZpZWxkVHlwZSA9ICJFbnVtRmllbGQiOwotCi1FbnVtRmllbGQ6OkVudW1GaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBFbnVtRGVmIGVudW1fZGVmLCBzdGQ6OnN0cmluZyB2YWx1ZSwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBTY2FsYXJGaWVsZChuYW1lLCBlbnVtX2RlZi5zaXplXywgbG9jKSwgZW51bV9kZWZfKGVudW1fZGVmKSwgdmFsdWVfKHZhbHVlKSB7fQotCi1jb25zdCBzdGQ6OnN0cmluZyYgRW51bUZpZWxkOjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBFbnVtRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLUVudW1EZWYgRW51bUZpZWxkOjpHZXRFbnVtRGVmKCkgewotICByZXR1cm4gZW51bV9kZWZfOwotfQotCi1zdGQ6OnN0cmluZyBFbnVtRmllbGQ6OkdldERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gZW51bV9kZWZfLm5hbWVfOwotfQotCi1ib29sIEVudW1GaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgRW51bUZpZWxkOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBWYWxpZGF0ZWQgYXQgY29tcGlsZSB0aW1lLgotfQotCi12b2lkIEVudW1GaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgImluc2VydChzdGF0aWNfY2FzdDwiIDw8IHV0aWw6OkdldFR5cGVGb3JTaXplKEdldFNpemUoKS5iaXRzKCkpIDw8ICI+KCI7Ci0gIHMgPDwgR2V0TmFtZSgpIDw8ICJfKSwgaSwgIiA8PCBHZXRTaXplKCkuYml0cygpIDw8ICIpOyI7Ci19Ci0KLXZvaWQgRW51bUZpZWxkOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgRW51bUZpZWxkOjpHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCB7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiVGV4dCgiIDw8IGFjY2Vzc29yIDw8ICIpIjsKLX0KLQotc3RkOjpzdHJpbmcgRW51bUZpZWxkOjpHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBlbnVtX2RlZl8ubmFtZV87Ci19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9lbnVtX2ZpZWxkLmggYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9lbnVtX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDBmNjUuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZW51bV9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJlbnVtX2RlZi5oIgotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2NhbGFyX2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgRW51bUZpZWxkIDogcHVibGljIFNjYWxhckZpZWxkIHsKLSBwdWJsaWM6Ci0gIEVudW1GaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBFbnVtRGVmIGVudW1fZGVmLCBzdGQ6OnN0cmluZyB2YWx1ZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIEVudW1EZWYgR2V0RW51bURlZigpOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmllbGRUeXBlOwotCi0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpZWxkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgRW51bURlZiBlbnVtX2RlZl87Ci0gIHN0ZDo6c3RyaW5nIHZhbHVlXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9maXhlZF9lbnVtX2ZpZWxkLmNjIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfZW51bV9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjMzVjMC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9maXhlZF9lbnVtX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9maXhlZF9lbnVtX2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBGaXhlZEVudW1GaWVsZDo6a0ZpZWxkVHlwZSA9ICJGaXhlZEVudW1GaWVsZCI7Ci0KLUZpeGVkRW51bUZpZWxkOjpGaXhlZEVudW1GaWVsZChFbnVtRGVmKiBlbnVtX2RlZiwgc3RkOjpzdHJpbmcgdmFsdWUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogRml4ZWRGaWVsZCgiZml4ZWRfZW51bSIsIGVudW1fZGVmLT5zaXplXywgbG9jKSwgZW51bV8oZW51bV9kZWYpLCB2YWx1ZV8odmFsdWUpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBGaXhlZEVudW1GaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gRml4ZWRFbnVtRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLXN0ZDo6c3RyaW5nIEZpeGVkRW51bUZpZWxkOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGVudW1fLT5uYW1lXzsKLX0KLQotdm9pZCBGaXhlZEVudW1GaWVsZDo6R2VuVmFsdWUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgZW51bV8tPm5hbWVfIDw8ICI6OiIgPDwgdmFsdWVfOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfZW51bV9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfZW51bV9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZjM2YzLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2ZpeGVkX2VudW1fZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dmFyaWFudD4KLQotI2luY2x1ZGUgImVudW1fZGVmLmgiCi0jaW5jbHVkZSAiZmllbGRzL2ZpeGVkX2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIEZpeGVkRW51bUZpZWxkIDogcHVibGljIEZpeGVkRmllbGQgewotIHB1YmxpYzoKLSAgRml4ZWRFbnVtRmllbGQoRW51bURlZiogZW51bV9kZWYsIHN0ZDo6c3RyaW5nIHZhbHVlLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF90eXBlOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBHZW5WYWx1ZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIEVudW1EZWYqIGVudW1fOwotICBzdGQ6OnN0cmluZyB2YWx1ZV87Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9maXhlZF9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwNzY1My4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9maXhlZF9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvZml4ZWRfZmllbGQuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLWludCBGaXhlZEZpZWxkOjp1bmlxdWVfaWRfID0gMDsKLQotRml4ZWRGaWVsZDo6Rml4ZWRGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBpbnQgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBTY2FsYXJGaWVsZChuYW1lICsgc3RkOjp0b19zdHJpbmcodW5pcXVlX2lkXysrKSwgc2l6ZSwgbG9jKSB7fQotCi12b2lkIEZpeGVkRmllbGQ6OkdlbkdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IHsKLSAgcyA8PCAicHJvdGVjdGVkOiI7Ci0gIFNjYWxhckZpZWxkOjpHZW5HZXR0ZXIocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0KTsKLSAgcyA8PCAicHVibGljOlxuIjsKLX0KLQotc3RkOjpzdHJpbmcgRml4ZWRGaWVsZDo6R2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAiIjsKLX0KLQotYm9vbCBGaXhlZEZpZWxkOjpHZW5CdWlsZGVyUGFyYW1ldGVyKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gTm8gcGFyYW1ldGVyIG5lZWRlZCBmb3IgYSBmaXhlZCBmaWVsZC4KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZpeGVkRmllbGQ6Okhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEZpeGVkRmllbGQ6OkdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIE5vIHBhcmFtZXRlciB2YWxpZGF0b3IgbmVlZGVkIGZvciBhIGZpeGVkIGZpZWxkLgotfQotCi12b2lkIEZpeGVkRmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJpbnNlcnQoIjsKLSAgR2VuVmFsdWUocyk7Ci0gIHMgPDwgIiwgaSAsICIgPDwgR2V0U2l6ZSgpLmJpdHMoKSA8PCAiKTsiOwotfQotCi12b2lkIEZpeGVkRmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiaWYgKEdldCIgPDwgdXRpbDo6VW5kZXJzY29yZVRvQ2FtZWxDYXNlKEdldE5hbWUoKSkgPDwgIigpICE9ICI7Ci0gIEdlblZhbHVlKHMpOwotICBzIDw8ICIpIHJldHVybiBmYWxzZTsiOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2ZpeGVkX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjJiN2IuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dmFyaWFudD4KLQotI2luY2x1ZGUgImVudW1fZGVmLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9zY2FsYXJfZmllbGQuaCIKLSNpbmNsdWRlICJwYXJzZV9sb2NhdGlvbi5oIgotCi1jbGFzcyBGaXhlZEZpZWxkIDogcHVibGljIFNjYWxhckZpZWxkIHsKLSBwdWJsaWM6Ci0gIEZpeGVkRmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHNpemUsIFBhcnNlTG9jYXRpb24gbG9jKTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldERhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEdlbkJ1aWxkZXJQYXJhbWV0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgdmlydHVhbCB2b2lkIEdlblZhbHVlKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgPSAwOwotCi0gIHN0YXRpYyBpbnQgdW5pcXVlX2lkXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9maXhlZF9zY2FsYXJfZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9maXhlZF9zY2FsYXJfZmllbGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDViMTIuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfc2NhbGFyX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9maXhlZF9zY2FsYXJfZmllbGQuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLWNvbnN0IHN0ZDo6c3RyaW5nIEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUgPSAiRml4ZWRTY2FsYXJGaWVsZCI7Ci0KLUZpeGVkU2NhbGFyRmllbGQ6OkZpeGVkU2NhbGFyRmllbGQoaW50IHNpemUsIGludDY0X3QgdmFsdWUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogRml4ZWRGaWVsZCgiZml4ZWRfc2NhbGFyIiwgc2l6ZSwgbG9jKSwgdmFsdWVfKHZhbHVlKSB7fQotCi1jb25zdCBzdGQ6OnN0cmluZyYgRml4ZWRTY2FsYXJGaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gRml4ZWRTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZTsKLX0KLQotc3RkOjpzdHJpbmcgRml4ZWRTY2FsYXJGaWVsZDo6R2V0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB1dGlsOjpHZXRUeXBlRm9yU2l6ZShHZXRTaXplKCkuYml0cygpKTsKLX0KLQotdm9pZCBGaXhlZFNjYWxhckZpZWxkOjpHZW5WYWx1ZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCB2YWx1ZV87Ci19Ci0KLXZvaWQgRml4ZWRTY2FsYXJGaWVsZDo6R2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZykgY29uc3QgewotICBzIDw8ICIrIiA8PCB2YWx1ZV87Ci19Ci0KLXZvaWQgRml4ZWRTY2FsYXJGaWVsZDo6R2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IHsKLSAgcyA8PCAibGV0ICIgPDwgR2V0TmFtZSgpIDw8ICI6ICIgPDwgR2V0UnVzdERhdGFUeXBlKCkgPDwgIiA9ICIgPDwgdmFsdWVfIDw8ICI7IjsKLSAgRml4ZWRGaWVsZDo6R2VuUnVzdFdyaXRlcihzLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQpOwotfQotCi12b2lkIEZpeGVkU2NhbGFyRmllbGQ6OkdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIEZpeGVkRmllbGQ6OkdlblJ1c3RHZXR0ZXIocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2ZpeGVkX3NjYWxhcl9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfc2NhbGFyX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDRiYTQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZml4ZWRfc2NhbGFyX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHZhcmlhbnQ+Ci0KLSNpbmNsdWRlICJlbnVtX2RlZi5oIgotI2luY2x1ZGUgImZpZWxkcy9maXhlZF9maWVsZC5oIgotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJwYXJzZV9sb2NhdGlvbi5oIgotCi1jbGFzcyBGaXhlZFNjYWxhckZpZWxkIDogcHVibGljIEZpeGVkRmllbGQgewotIHB1YmxpYzoKLSAgRml4ZWRTY2FsYXJGaWVsZChpbnQgc2l6ZSwgaW50NjRfdCB2YWx1ZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmllbGRUeXBlOwotCi0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpZWxkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5WYWx1ZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZF90eXBlOwotCi0gIHZvaWQgR2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLQotICBjb25zdCBpbnQ2NF90IHZhbHVlXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9ncm91cF9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2dyb3VwX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmUzYjk1Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL2dyb3VwX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9ncm91cF9maWVsZC5oIgotCi1Hcm91cEZpZWxkOjpHcm91cEZpZWxkKFBhcnNlTG9jYXRpb24gbG9jLCBzdGQ6Omxpc3Q8UGFja2V0RmllbGQqPiogZmllbGRzKQotICAgIDogUGFja2V0RmllbGQoIkdyb3VwcyBoYXZlIG5vIG5hbWUiLCBsb2MpLCBmaWVsZHNfKGZpZWxkcykge30KLQotR3JvdXBGaWVsZDo6fkdyb3VwRmllbGQoKSB7Ci0gIGRlbGV0ZSBmaWVsZHNfOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyBHcm91cEZpZWxkOjprRmllbGRUeXBlID0gIkdyb3VwRmllbGQiOwotCi1zdGQ6OnN0cmluZyBHcm91cEZpZWxkOjpHZXROYW1lKCkgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCAiR2V0TmFtZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiI7Ci0gIHJldHVybiAiIjsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcmIEdyb3VwRmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdyb3VwRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgR3JvdXBGaWVsZDo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgIkdldFNpemUgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iOwotICByZXR1cm4gU2l6ZSgpOwotfQotCi1zdGQ6OnN0cmluZyBHcm91cEZpZWxkOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgIkdldFR5cGUgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iOwotICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgR3JvdXBGaWVsZDo6R2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYsIGludCwgYm9vbCkgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCAiR2VuRXh0cmFjdG9yIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKLX0KLQotc3RkOjpzdHJpbmcgR3JvdXBGaWVsZDo6R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCAiR2V0R2V0dGVyRnVuY3Rpb25OYW1lIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKLSAgcmV0dXJuICIiOwotfQotCi12b2lkIEdyb3VwRmllbGQ6OkdlbkdldHRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7Ci0gIEVSUk9SKHRoaXMpIDw8ICJHZW5HZXR0ZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iOwotfQotCi1zdGQ6OnN0cmluZyBHcm91cEZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgIkdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiOwotICByZXR1cm4gIiI7Ci19Ci0KLWJvb2wgR3JvdXBGaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCAiSGFzUGFyYW1ldGVyVmFsaWRhdG9yIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgR3JvdXBGaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgIk5vdCBpbXBsZW1lbnRlZCI7Ci19Ci0KLXZvaWQgR3JvdXBGaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCAiR2VuSW5zZXJ0ZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iOwotfQotCi12b2lkIEdyb3VwRmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIEVSUk9SKHRoaXMpIDw8ICJHZW5WYWxpZGF0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iOwotfQotCi1jb25zdCBzdGQ6Omxpc3Q8UGFja2V0RmllbGQqPiogR3JvdXBGaWVsZDo6R2V0RmllbGRzKCkgY29uc3QgewotICByZXR1cm4gZmllbGRzXzsKLX0KLQotc3RkOjpzdHJpbmcgR3JvdXBGaWVsZDo6R2V0UnVzdERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gR2V0RGF0YVR5cGUoKTsKLX0KLQotdm9pZCBHcm91cEZpZWxkOjpHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHsKLX0KLQotdm9pZCBHcm91cEZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHt9CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9ncm91cF9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvZ3JvdXBfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxZmIyMi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9ncm91cF9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIEdyb3VwRmllbGQgOiBwdWJsaWMgUGFja2V0RmllbGQgewotIHB1YmxpYzoKLSAgR3JvdXBGaWVsZChQYXJzZUxvY2F0aW9uIGxvYywgc3RkOjpsaXN0PFBhY2tldEZpZWxkKj4qIGZpZWxkcyk7Ci0KLSAgfkdyb3VwRmllbGQoKTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wgZm9yX3N0cnVjdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICBjb25zdCBzdGQ6Omxpc3Q8UGFja2V0RmllbGQqPiogR2V0RmllbGRzKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6bGlzdDxQYWNrZXRGaWVsZCo+KiBmaWVsZHNfOwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3BhY2tldF9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3BhY2tldF9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMDJlMi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWNrZXRfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLQotI2luY2x1ZGUgInV0aWwuaCIKLQotUGFja2V0RmllbGQ6OlBhY2tldEZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIFBhcnNlTG9jYXRpb24gbG9jKSA6IGxvY18obG9jKSwgbmFtZV8obmFtZSkge30KLQotc3RkOjpzdHJpbmcgUGFja2V0RmllbGQ6OkdldERlYnVnTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJGaWVsZHtUeXBlOiIgKyBHZXRGaWVsZFR5cGUoKSArICIsIE5hbWU6IiArIEdldE5hbWUoKSArICJ9IjsKLX0KLQotUGFyc2VMb2NhdGlvbiBQYWNrZXRGaWVsZDo6R2V0TG9jYXRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBsb2NfOwotfQotCi1zdGQ6OnN0cmluZyBQYWNrZXRGaWVsZDo6R2V0TmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfOwotfQotCi1TaXplIFBhY2tldEZpZWxkOjpHZXRCdWlsZGVyU2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNpemUoKTsKLX0KLQotU2l6ZSBQYWNrZXRGaWVsZDo6R2V0U3RydWN0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNpemUoKTsKLX0KLQotaW50IFBhY2tldEZpZWxkOjpHZW5Cb3VuZHMoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0LCBTaXplIHNpemUpIGNvbnN0IHsKLSAgLy8gSW4gb3JkZXIgdG8gZmluZCBmaWVsZF9iZWdpbiBhbmQgZmllbGRfZW5kLCB3ZSBtdXN0IGhhdmUgdHdvIG9mIHRoZSB0aHJlZSBTaXplcy4KLSAgaWYgKChzdGFydF9vZmZzZXQuZW1wdHkoKSAmJiBzaXplLmVtcHR5KCkpIHx8IChzdGFydF9vZmZzZXQuZW1wdHkoKSAmJiBlbmRfb2Zmc2V0LmVtcHR5KCkpIHx8Ci0gICAgICAoZW5kX29mZnNldC5lbXB0eSgpICYmIHNpemUuZW1wdHkoKSkpIHsKLSAgICBFUlJPUih0aGlzKSA8PCAiR2VuQm91bmRzIGNhbGxlZCB3aXRob3V0IGVub3VnaCBpbmZvcm1hdGlvbi4gIiA8PCBzdGFydF9vZmZzZXQgPDwgZW5kX29mZnNldCA8PCBzaXplOwotICB9Ci0KLSAgaWYgKHN0YXJ0X29mZnNldC5iaXRzKCkgJSA4ICE9IDAgfHwgZW5kX29mZnNldC5iaXRzKCkgJSA4ICE9IDApIHsKLSAgICBFUlJPUih0aGlzKSA8PCAiQ2FuIG5vdCBmaW5kIHRoZSBib3VuZHMgb2YgYSBmaWVsZCBhdCBhIG5vbiBieXRlLWFsaWduZWQgb2Zmc2V0LiIgPDwgc3RhcnRfb2Zmc2V0IDw8IGVuZF9vZmZzZXQ7Ci0gIH0KLQotICBpZiAoIXN0YXJ0X29mZnNldC5lbXB0eSgpKSB7Ci0gICAgcyA8PCAic2l6ZV90IGZpZWxkX2JlZ2luID0gKCIgPDwgc3RhcnRfb2Zmc2V0IDw8ICIpIC8gODsiOwotICB9IGVsc2UgewotICAgIHMgPDwgInNpemVfdCBmaWVsZF9iZWdpbiA9IGVuZF9pbmRleCAtICgiIDw8IGVuZF9vZmZzZXQgPDwgIiArICIgPDwgc2l6ZSA8PCAiKSAvIDg7IjsKLSAgfQotCi0gIGlmICghZW5kX29mZnNldC5lbXB0eSgpKSB7Ci0gICAgcyA8PCAic2l6ZV90IGZpZWxkX2VuZCA9IGVuZF9pbmRleCAtICgiIDw8IGVuZF9vZmZzZXQgPDwgIikgLyA4OyI7Ci0gICAgLy8gSWYgdGhlIGZpZWxkIGhhcyBhIGtub3duIHNpemUsIHVzZSB0aGUgbWluaW11bSBmb3IgdGhlIGVuZAotICAgIGlmICghc2l6ZS5lbXB0eSgpKSB7Ci0gICAgICBzIDw8ICJzaXplX3QgZmllbGRfc2l6ZWRfZW5kID0gZmllbGRfYmVnaW4gKyAoIiA8PCBzaXplIDw8ICIpIC8gODsiOwotICAgICAgcyA8PCAiaWYgKGZpZWxkX3NpemVkX2VuZCA8IGZpZWxkX2VuZCkgeyBmaWVsZF9lbmQgPSBmaWVsZF9zaXplZF9lbmQ7IH0iOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzIDw8ICJzaXplX3QgZmllbGRfZW5kID0gZmllbGRfYmVnaW4gKyAoIiA8PCBzaXplIDw8ICIpIC8gODsiOwotICAgIHMgPDwgImlmIChmaWVsZF9lbmQgPiBlbmRfaW5kZXgpIHsgZmllbGRfZW5kID0gZW5kX2luZGV4OyB9IjsKLSAgfQotICBzIDw8ICJhdXRvICIgPDwgbmFtZV8gPDwgIl9pdCA9IHRvX2JvdW5kLlN1YnJhbmdlKGZpZWxkX2JlZ2luLCBmaWVsZF9lbmQgLSBmaWVsZF9iZWdpbik7ICI7Ci0gIHJldHVybiAwOyAgLy8gbnVtX2xlYWRpbmdfYml0cwotfQotCi1ib29sIFBhY2tldEZpZWxkOjpHZW5CdWlsZGVyUGFyYW1ldGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBhdXRvIHBhcmFtX3R5cGUgPSBHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpOwotICBpZiAocGFyYW1fdHlwZS5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHMgPDwgcGFyYW1fdHlwZSA8PCAiICIgPDwgR2V0TmFtZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYWNrZXRGaWVsZDo6QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUGFja2V0RmllbGQ6OkdlbkJ1aWxkZXJNZW1iZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHJldHVybiBHZW5CdWlsZGVyUGFyYW1ldGVyKHMpOwotfQotCi12b2lkIFBhY2tldEZpZWxkOjpHZW5CdWlsZGVyUGFyYW1ldGVyRnJvbVZpZXcoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgInZpZXcuR2V0IiA8PCB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UoR2V0TmFtZSgpKSA8PCAiKCkiOwotfQotCi1ib29sIFBhY2tldEZpZWxkOjpJc0NvbnRhaW5lckZpZWxkKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IFBhY2tldEZpZWxkKiBQYWNrZXRGaWVsZDo6R2V0RWxlbWVudEZpZWxkKCkgY29uc3QgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBQYWNrZXRGaWVsZDo6R2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3QgewotICBzIDw8ICJcIlJFUFJFU0VOVEFUSU9OX1VOSU1QTEVNRU5URUQgIiA8PCBHZXRGaWVsZFR5cGUoKSA8PCAiICIgPDwgYWNjZXNzb3IgPDwgIlwiIjsKLX0KLQotaW50IFBhY2tldEZpZWxkOjpHZXRSdXN0Qml0T2Zmc2V0KAotICAgIHN0ZDo6b3N0cmVhbSYsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQsIFNpemUgc2l6ZSkgY29uc3QgewotICAvLyBJbiBvcmRlciB0byBmaW5kIGZpZWxkX2JlZ2luIGFuZCBmaWVsZF9lbmQsIHdlIG11c3QgaGF2ZSB0d28gb2YgdGhlIHRocmVlIFNpemVzLgotICBpZiAoKHN0YXJ0X29mZnNldC5lbXB0eSgpICYmIHNpemUuZW1wdHkoKSkgfHwgKHN0YXJ0X29mZnNldC5lbXB0eSgpICYmIGVuZF9vZmZzZXQuZW1wdHkoKSkgfHwKLSAgICAgIChlbmRfb2Zmc2V0LmVtcHR5KCkgJiYgc2l6ZS5lbXB0eSgpKSkgewotICAgIEVSUk9SKHRoaXMpIDw8ICJHZW5Cb3VuZHMgY2FsbGVkIHdpdGhvdXQgZW5vdWdoIGluZm9ybWF0aW9uLiAiCi0gICAgICAgIDw8IHN0YXJ0X29mZnNldCA8PCBlbmRfb2Zmc2V0IDw8IHNpemU7Ci0gIH0KLQotICBpZiAoc3RhcnRfb2Zmc2V0LmJpdHMoKSAlIDggIT0gMCB8fCBlbmRfb2Zmc2V0LmJpdHMoKSAlIDggIT0gMCkgewotICAgIEVSUk9SKHRoaXMpIDw8ICJDYW4gbm90IGZpbmQgdGhlIGJvdW5kcyBvZiBhIGZpZWxkIGF0IGEgbm9uIGJ5dGUtYWxpZ25lZCBvZmZzZXQuIgotICAgICAgICA8PCBzdGFydF9vZmZzZXQgPDwgZW5kX29mZnNldDsKLSAgfQotCi0gIHJldHVybiAwOyAgLy8gbnVtX2xlYWRpbmdfYml0cwotfQotCi1ib29sIFBhY2tldEZpZWxkOjpHZW5SdXN0TmFtZUFuZFR5cGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGF1dG8gcGFyYW1fdHlwZSA9IEdldFJ1c3REYXRhVHlwZSgpOwotICBpZiAocGFyYW1fdHlwZS5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHMgPDwgR2V0TmFtZSgpIDw8ICI6ICIgPDwgcGFyYW1fdHlwZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUGFja2V0RmllbGQ6OkdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUsIHN0ZDo6c3RyaW5nIGNvbnRleHQpIGNvbnN0IHsKLSAgU2l6ZSBzaXplID0gR2V0U2l6ZSgpOwotICBpZiAoc2l6ZS5iaXRzKCkgPCA4KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHMgPDwgImlmIGJ5dGVzLmxlbigpIDwgIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIHNpemUuYnl0ZXMoKSA8PCAiIHsiOwotICBzIDw8ICIgcmV0dXJuIEVycihFcnJvcjo6SW52YWxpZExlbmd0aEVycm9yeyI7Ci0gIHMgPDwgIiAgICBvYmo6IFwiIiA8PCBjb250ZXh0IDw8ICJcIi50b19zdHJpbmcoKSwiOwotICBzIDw8ICIgICAgZmllbGQ6IFwiIiA8PCBHZXROYW1lKCkgPDwgIlwiLnRvX3N0cmluZygpLCI7Ci0gIHMgPDwgIiAgICB3YW50ZWQ6ICIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgKyBzaXplLmJ5dGVzKCkgPDwgIiwiOwotICBzIDw8ICIgICAgZ290OiBieXRlcy5sZW4oKX0pOyI7Ci0gIHMgPDwgIn0iOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvcGFja2V0X2ZpZWxkLmggYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWNrZXRfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4NTM2Mi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWNrZXRfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImxvZ2dpbmcuaCIKLSNpbmNsdWRlICJwYXJzZV9sb2NhdGlvbi5oIgotI2luY2x1ZGUgInNpemUuaCIKLQotLy8gVGhlIGJhc2UgZmllbGQgdGhhdCBldmVyeSBwYWNrZXQgbmVlZHMgdG8gaW5oZXJpdCBmcm9tLgotY2xhc3MgUGFja2V0RmllbGQgOiBwdWJsaWMgTG9nZ2FibGUgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFja2V0RmllbGQoKSA9IGRlZmF1bHQ7Ci0KLSAgUGFja2V0RmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIC8vIEdldCB0aGUgdHlwZSBmb3IgdGhpcyBmaWVsZC4KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpZWxkIGluIGJpdHMuCi0gIHZpcnR1YWwgU2l6ZSBHZXRTaXplKCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpZWxkIGluIGJpdHMgZ2l2ZW4gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBidWlsZGVyLgotICAvLyBGb3IgbW9zdCBmaWVsZCB0eXBlcywgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIEdldFNpemUoKTsKLSAgdmlydHVhbCBTaXplIEdldEJ1aWxkZXJTaXplKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmllbGQgaW4gYml0cyBnaXZlbiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHBhcnNlZCBzdHJ1Y3QuCi0gIC8vIEZvciBtb3N0IGZpZWxkIHR5cGVzLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgR2V0U2l6ZSgpOwotICB2aXJ0dWFsIFNpemUgR2V0U3RydWN0U2l6ZSgpIGNvbnN0OwotCi0gIC8vIEdldCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgdG8gYmUgdXNlZCBpbiB0aGUgbWVtYmVyIHZhcmlhYmxlcy4KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0ID0gMDsKLQotICAvLyBHaXZlbiBhbiBpdGVyYXRvciB7bmFtZX1faXQsIGV4dHJhY3QgdGhlIHR5cGUuCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCA9IDA7Ci0KLSAgLy8gQ2FsY3VsYXRlIGZpZWxkX2JlZ2luIGFuZCBmaWVsZF9lbmQgdXNpbmcgdGhlIGdpdmVuIG9mZnNldHMgYW5kIHNpemUsIHJldHVybiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYml0cwotICB2aXJ0dWFsIGludCBHZW5Cb3VuZHMoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0LCBTaXplIHNpemUpIGNvbnN0OwotCi0gIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGZ1bmN0aW9uLCByZXR1cm4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIGEgZ2V0dGVyIGZ1bmN0aW9uCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3QgPSAwOwotCi0gIC8vIEdldCBwYXJzZXIgZ2V0dGVyIGRlZmluaXRpb24uIFN0YXJ0X29mZnNldCBwb2ludHMgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUKLSAgLy8gZmllbGQuIGVuZF9vZmZzZXQgaXMgdGhlIGZpcnN0IGJpdCBhZnRlciB0aGUgZmllbGQuIElmIGFuIG9mZnNldCBpcyBlbXB0eQotICAvLyB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIGEgZmllbGQgd2l0aCBhbiB1bmtub3duIHNpemUgd2hlbiB0cnlpbmcgdG8KLSAgLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQuCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCA9IDA7Ci0KLSAgLy8gR2V0IHRoZSB0eXBlIG9mIHBhcmFtZXRlciB1c2VkIGluIENyZWF0ZSgpLCByZXR1cm4gZW1wdHkgc3RyaW5nIGlmIGEgcGFyYW1ldGVyIHR5cGUgd2FzIE5PVCBnZW5lcmF0ZWQKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0ID0gMDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcGFyYW1ldGVyIGZvciBDcmVhdGUoKSwgcmV0dXJuIHRydWUgaWYgYSBwYXJhbWV0ZXIgd2FzIGFkZGVkLgotICB2aXJ0dWFsIGJvb2wgR2VuQnVpbGRlclBhcmFtZXRlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIC8vIFJldHVybiB0cnVlIGlmIHRoZSBCdWlsZGVyIHBhcmFtZXRlciBoYXMgdG8gYmUgbW92ZWQuCi0gIHZpcnR1YWwgYm9vbCBCdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSBjb25zdDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgYWN0dWFsIHN0b3JhZ2UgZm9yIHRoZSBwYXJhbWV0ZXIsIHJldHVybiB0cnVlIGlmIGl0IHdhcyBhZGRlZC4KLSAgdmlydHVhbCBib29sIEdlbkJ1aWxkZXJNZW1iZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICAvLyBIZWxwZXIgZm9yIHJlZmxlY3Rpb24gdGVzdHMuCi0gIHZpcnR1YWwgdm9pZCBHZW5CdWlsZGVyUGFyYW1ldGVyRnJvbVZpZXcoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBtdXN0IGJlIHZhbGlkYXRlZC4KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0ID0gMDsKLQotICAvLyBGYWlsIGlmIHRoZSB2YWx1ZSBkb2Vzbid0IGZpdCBpbiB0aGUgZmllbGQuCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBzKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGluc2VydGVyIGZvciBwdXNoaW5nIHRoZSBkYXRhIGluIHRoZSBidWlsZGVyLgotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHZhbGlkYXRvciBmb3IgYSBmaWVsZCBmb3IgdGhlIElzVmFsaWQoKSBmdW5jdGlvbi4KLSAgLy8KLSAgLy8gVGhlIHdheSB0aGlzIGZ1bmN0aW9uIHdvcmtzIGlzIGJ5IGFzc3VtaW5nIHRoYXQgdGhlcmUgaXMgYW4gaXRlcmF0b3IgfGl0fAotICAvLyB0aGF0IHdhcyBkZWZpbmVkIGVhcmxpZXIuIFRoZSBpbXBsZW1lbnRlciBvZiB0aGUgZnVuY3Rpb24gd2lsbCB0aGVuIG1vdmUKLSAgLy8gaXQgZm9yd2FyZCBiYXNlZCBvbiB0aGUgZHluYW1pYyBzaXplIG9mIHRoZSBmaWVsZCBhbmQgdGhlbiBjaGVjayB0byBzZWUgaWYKLSAgLy8gaXRzIHBhc3QgdGhlIGVuZCBvZiB0aGUgcGFja2V0LgotICAvLyBJdCBzaG91bGQgYmUgdW51c2VkIGZvciBmaXhlZCBzaXplIGZpZWxkcyB1bmxlc3Mgc3BlY2lhbCBjb25zaWRlcmF0aW9uIGlzCi0gIC8vIG5lZWRlZC4gVGhpcyBpcyBiZWNhdXNlIGFsbCBmaXhlZCBzaXplIGZpZWxkcyBhcmUgdGFsbGllZCB0b2dldGhlciB3aXRoCi0gIC8vIEdldFNpemUoKSBhbmQgdXNlZCBhcyBhbiBpbml0aWFsIG9mZnNldC4gT25lIHNwZWNpYWwgY29uc2lkZXJhdGlvbiBpcyBmb3IKLSAgLy8gZW51bXMgd2hlcmUgaW5zdGVhZCBvZiBjaGVja2luZyBpZiB0aGV5IGNhbiBiZSByZWFkLCB0aGV5IGFyZSBjaGVja2VkIHRvCi0gIC8vIHNlZSBpZiB0aGV5IGNvbnRhaW4gdGhlIGNvcnJlY3QgdmFsdWUuCi0gIHZpcnR1YWwgdm9pZCBHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBzKSBjb25zdCA9IDA7Ci0KLSAgLy8gU29tZSBmaWVsZHMgYXJlIGNvbnRhaW5lcnMgb2Ygb3RoZXIgZmllbGRzLCBlLmcuIGFycmF5LCB2ZWN0b3IsIGV0Yy4KLSAgLy8gQXNzdW1lIFNUTCBjb250YWluZXJzIHRoYXQgc3VwcG9ydCBzd2FwKCkKLSAgdmlydHVhbCBib29sIElzQ29udGFpbmVyRmllbGQoKSBjb25zdDsKLQotICAvLyBHZXQgZmllbGQgb2YgbmVzdGVkIGVsZW1lbnRzIGlmIHRoaXMgaXMgYSBjb250YWluZXIgZmllbGQsIG51bGxwdHIgaWYgbm9uZQotICB2aXJ0dWFsIGNvbnN0IFBhY2tldEZpZWxkKiBHZXRFbGVtZW50RmllbGQoKSBjb25zdDsKLQotICAvLyBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmllbGQsIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBmb3IgZGVidWdnaW5nIG9yIGxvZ2dpbmcgcHVycG9zZXMKLSAgdmlydHVhbCB2b2lkIEdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0OwotCi0gIHN0ZDo6c3RyaW5nIEdldERlYnVnTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIFBhcnNlTG9jYXRpb24gR2V0TG9jYXRpb24oKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgUnVzdCB2YXJpYWJsZS9maWVsZCBuYW1lIGFuZCB0eXBlCi0gIHZpcnR1YWwgYm9vbCBHZW5SdXN0TmFtZUFuZFR5cGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIHRvIGJlIHVzZWQgaW4gdGhlIG1lbWJlciB2YXJpYWJsZXMuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UnVzdERhdGFUeXBlKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgaW50IEdldFJ1c3RCaXRPZmZzZXQoCi0gICAgICBzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQsIFNpemUgc2l6ZSkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUsIHN0ZDo6c3RyaW5nKSBjb25zdDsKLQotICB2aXJ0dWFsIGJvb2wgR2V0dGVySXNCeVJlZigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgUGFyc2VMb2NhdGlvbiBsb2NfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWRkaW5nX2ZpZWxkLmNjIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvcGFkZGluZ19maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhMmMzNi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWRkaW5nX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9wYWRkaW5nX2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUgPSAiUGFkZGluZ0ZpZWxkIjsKLQotUGFkZGluZ0ZpZWxkOjpQYWRkaW5nRmllbGQoaW50IHNpemUsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogUGFja2V0RmllbGQoInBhZGRpbmdfIiArIHN0ZDo6dG9fc3RyaW5nKHNpemUgKiA4KSwgbG9jKSwgc2l6ZV8oc2l6ZSAqIDgpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBQYWRkaW5nRmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZTsKLX0KLQotU2l6ZSBQYWRkaW5nRmllbGQ6OkdldFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzaXplXzsKLX0KLQotU2l6ZSBQYWRkaW5nRmllbGQ6OkdldEJ1aWxkZXJTaXplKCkgY29uc3QgewotICByZXR1cm4gMDsKLX0KLQotc3RkOjpzdHJpbmcgUGFkZGluZ0ZpZWxkOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJUaGVyZSdzIG5vIHR5cGUgZm9yIFBhZGRpbmcgZmllbGRzIjsKLX0KLQotdm9pZCBQYWRkaW5nRmllbGQ6OkdlbkV4dHJhY3RvcihzdGQ6Om9zdHJlYW0mLCBpbnQsIGJvb2wpIGNvbnN0IHt9Ci0KLXN0ZDo6c3RyaW5nIFBhZGRpbmdGaWVsZDo6R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3QgewotICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgUGFkZGluZ0ZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3Qge30KLQotc3RkOjpzdHJpbmcgUGFkZGluZ0ZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICIiOwotfQotCi1ib29sIFBhZGRpbmdGaWVsZDo6SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUGFkZGluZ0ZpZWxkOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qge30KLQotdm9pZCBQYWRkaW5nRmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgRVJST1IodGhpcykgPDwgX19mdW5jX18gPDwgIjogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgcGFkZGluZyBmaWVsZHMiOwotfQotCi12b2lkIFBhZGRpbmdGaWVsZDo6R2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHt9Ci0KLXN0ZDo6c3RyaW5nIFBhZGRpbmdGaWVsZDo6R2V0UnVzdERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gIlRoZXJlJ3Mgbm8gdHlwZSBmb3IgUGFkZGluZyBmaWVsZHMiOwotfQotCi12b2lkIFBhZGRpbmdGaWVsZDo6R2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7Ci19Ci0KLXZvaWQgUGFkZGluZ0ZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0IHt9CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWRkaW5nX2ZpZWxkLmggYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYWRkaW5nX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDBjY2QuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvcGFkZGluZ19maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmaWVsZHMvcGFja2V0X2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgUGFkZGluZ0ZpZWxkIDogcHVibGljIFBhY2tldEZpZWxkIHsKLSBwdWJsaWM6Ci0gIFBhZGRpbmdGaWVsZChpbnQgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmllbGRUeXBlOwotCi0gIHN0ZDo6c3RyaW5nIEdldEZpZWxkKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBTaXplIEdldFNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0QnVpbGRlclNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldERhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkV4dHJhY3RvcihzdGQ6Om9zdHJlYW0mIHMsIGludCBudW1fbGVhZGluZ19iaXRzLCBib29sIGZvcl9zdHJ1Y3QpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuQm91bmRzQ2hlY2soc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSwgc3RkOjpzdHJpbmcpIGNvbnN0IG92ZXJyaWRle307Ci0KLSBwcml2YXRlOgotICBTaXplIHNpemVfOwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3BheWxvYWRfZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYXlsb2FkX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQ0ODgyLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3BheWxvYWRfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9wYXlsb2FkX2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGUgPSAiUGF5bG9hZEZpZWxkIjsKLQotUGF5bG9hZEZpZWxkOjpQYXlsb2FkRmllbGQoc3RkOjpzdHJpbmcgbW9kaWZpZXIsIFBhcnNlTG9jYXRpb24gbG9jKQotICAgIDogUGFja2V0RmllbGQoInBheWxvYWQiLCBsb2MpLCBzaXplX2ZpZWxkXyhudWxscHRyKSwgc2l6ZV9tb2RpZmllcl8obW9kaWZpZXIpIHt9Ci0KLXZvaWQgUGF5bG9hZEZpZWxkOjpTZXRTaXplRmllbGQoY29uc3QgU2l6ZUZpZWxkKiBzaXplX2ZpZWxkKSB7Ci0gIGlmIChzaXplX2ZpZWxkXyAhPSBudWxscHRyKSB7Ci0gICAgRVJST1IodGhpcywgc2l6ZV9maWVsZF8sIHNpemVfZmllbGQpIDw8ICJUaGUgc2l6ZSBmaWVsZCBmb3IgdGhlIHBheWxvYWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC4iOwotICB9Ci0KLSAgc2l6ZV9maWVsZF8gPSBzaXplX2ZpZWxkOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyYgUGF5bG9hZEZpZWxkOjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgUGF5bG9hZEZpZWxkOjpHZXRTaXplKCkgY29uc3QgewotICBpZiAoc2l6ZV9maWVsZF8gPT0gbnVsbHB0cikgewotICAgIGlmICghc2l6ZV9tb2RpZmllcl8uZW1wdHkoKSkgewotICAgICAgRVJST1IodGhpcykgPDwgIk1pc3Npbmcgc2l6ZSBmaWVsZCBmb3IgcGF5bG9hZCB3aXRoIHNpemUgbW9kaWZpZXIuIjsKLSAgICB9Ci0gICAgcmV0dXJuIFNpemUoKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGR5bmFtaWNfc2l6ZSA9ICIoR2V0IiArIHV0aWw6OlVuZGVyc2NvcmVUb0NhbWVsQ2FzZShzaXplX2ZpZWxkXy0+R2V0TmFtZSgpKSArICIoKSAqIDgpIjsKLSAgaWYgKCFzaXplX21vZGlmaWVyXy5lbXB0eSgpKSB7Ci0gICAgZHluYW1pY19zaXplICs9ICItICgiICsgc2l6ZV9tb2RpZmllcl8gKyAiKSI7Ci0gIH0KLQotICByZXR1cm4gZHluYW1pY19zaXplOwotfQotCi1zdGQ6OnN0cmluZyBQYXlsb2FkRmllbGQ6OkdldERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gIlBhY2tldFZpZXciOwotfQotCi12b2lkIFBheWxvYWRGaWVsZDo6R2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYsIGludCwgYm9vbCkgY29uc3QgewotICBFUlJPUih0aGlzKSA8PCBfX2Z1bmNfXyA8PCAiIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuICI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFBheWxvYWRGaWVsZDo6R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3QgewotICByZXR1cm4gIkdldFBheWxvYWQiOwotfQotCi12b2lkIFBheWxvYWRGaWVsZDo6R2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3QgewotICBzIDw8ICJQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+ICIgPDwgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgPDwgIigpIGNvbnN0IHsiOwotICBzIDw8ICJBU1NFUlQod2FzX3ZhbGlkYXRlZF8pOyI7Ci0gIHMgPDwgInNpemVfdCBlbmRfaW5kZXggPSBzaXplKCk7IjsKLSAgcyA8PCAiYXV0byB0b19ib3VuZCA9IGJlZ2luKCk7IjsKLSAgR2VuQm91bmRzKHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCwgR2V0U2l6ZSgpKTsKLSAgcyA8PCAicmV0dXJuIEdldExpdHRsZUVuZGlhblN1YnZpZXcoZmllbGRfYmVnaW4sIGZpZWxkX2VuZCk7IjsKLSAgcyA8PCAifVxuXG4iOwotCi0gIHMgPDwgIlBhY2tldFZpZXc8IWtMaXR0bGVFbmRpYW4+ICIgPDwgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgPDwgIkJpZ0VuZGlhbigpIGNvbnN0IHsiOwotICBzIDw8ICJBU1NFUlQod2FzX3ZhbGlkYXRlZF8pOyI7Ci0gIHMgPDwgInNpemVfdCBlbmRfaW5kZXggPSBzaXplKCk7IjsKLSAgcyA8PCAiYXV0byB0b19ib3VuZCA9IGJlZ2luKCk7IjsKLSAgR2VuQm91bmRzKHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCwgR2V0U2l6ZSgpKTsKLSAgcyA8PCAicmV0dXJuIEdldEJpZ0VuZGlhblN1YnZpZXcoZmllbGRfYmVnaW4sIGZpZWxkX2VuZCk7IjsKLSAgcyA8PCAifVxuIjsKLX0KLQotc3RkOjpzdHJpbmcgUGF5bG9hZEZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJzdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IjsKLX0KLQotYm9vbCBQYXlsb2FkRmllbGQ6OkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUGF5bG9hZEZpZWxkOjpHZW5CdWlsZGVyUGFyYW1ldGVyRnJvbVZpZXcoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgInN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4oc3RkOjp2ZWN0b3I8dWludDhfdD4odmlldy5HZXRQYXlsb2FkKCkuYmVnaW4oKSwgdmlldy5HZXRQYXlsb2FkKCkuZW5kKCkpKSI7Ci19Ci0KLWJvb2wgUGF5bG9hZEZpZWxkOjpIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQYXlsb2FkRmllbGQ6OkdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbmVlZGVkIGZvciBhIHBheWxvYWQKLX0KLQotdm9pZCBQYXlsb2FkRmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgRVJST1IoKSA8PCBfX2Z1bmNfXyA8PCAiIFNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKLX0KLQotdm9pZCBQYXlsb2FkRmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIERvIG5vdGhpbmcKLX0KLQotdm9pZCBQYXlsb2FkRmllbGQ6OkdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcpIGNvbnN0IHsKLSAgLy8gVE9ETzogd2Ugc2hvdWxkIHBhcnNlIHRoZSBjaGlsZCBwYWNrZXRzCi0gIHMgPDwgIlwiUEFZTE9BRFtdXCIiOwotfQotCi1zdGQ6OnN0cmluZyBQYXlsb2FkRmllbGQ6OkdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJWZWM6Ojx1OD4iOwotfQotCi12b2lkIFBheWxvYWRGaWVsZDo6R2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplKSBjb25zdCB7Ci0gIHMgPDwgImxldCAiIDw8IEdldE5hbWUoKSA8PCAiOiAiIDw8IEdldFJ1c3REYXRhVHlwZSgpIDw8ICIgPSAiOwotICBpZiAoc2l6ZV9maWVsZF8gPT0gbnVsbHB0cikgewotICAgIHMgPDwgImJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uXS5pbnRvKCk7IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8ICJieXRlc1siIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpIDw8ICIuLigiOwotICAgIHMgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIiArICIgPDwgc2l6ZV9maWVsZF8tPkdldE5hbWUoKSA8PCAiIGFzIHVzaXplKV0uaW50bygpOyI7Ci0gIH0KLX0KLQotdm9pZCBQYXlsb2FkRmllbGQ6OkdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3Qge30KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3BheWxvYWRfZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3BheWxvYWRfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2ZjI3NS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9wYXlsb2FkX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2l6ZV9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIFBheWxvYWRGaWVsZCA6IHB1YmxpYyBQYWNrZXRGaWVsZCB7Ci0gcHVibGljOgotICBQYXlsb2FkRmllbGQoc3RkOjpzdHJpbmcgbW9kaWZpZXIsIFBhcnNlTG9jYXRpb24gbG9jKTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFNldFNpemVGaWVsZChjb25zdCBTaXplRmllbGQqIHNpemVfZmllbGQpOwotCi0gIHZpcnR1YWwgU2l6ZSBHZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5CdWlsZGVyUGFyYW1ldGVyRnJvbVZpZXcoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUsIHN0ZDo6c3RyaW5nKSBjb25zdCBvdmVycmlkZXt9OwotCi0gIC8vIFBheWxvYWQgZmllbGRzIGNhbiBvbmx5IGJlIGR5bmFtaWNhbGx5IHNpemVkLgotICBjb25zdCBTaXplRmllbGQqIHNpemVfZmllbGRfOwotICAvLyBPbmx5IHVzZWQgaWYgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgaXMgYmFzZWQgb24gYW5vdGhlciBmaWVsZC4KLSAgc3RkOjpzdHJpbmcgc2l6ZV9tb2RpZmllcl87Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvcmVzZXJ2ZWRfZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9yZXNlcnZlZF9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwNTMzOC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9yZXNlcnZlZF9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvcmVzZXJ2ZWRfZmllbGQuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLWludCBSZXNlcnZlZEZpZWxkOjp1bmlxdWVfaWRfID0gMDsKLQotY29uc3Qgc3RkOjpzdHJpbmcgUmVzZXJ2ZWRGaWVsZDo6a0ZpZWxkVHlwZSA9ICJSZXNlcnZlZEZpZWxkIjsKLQotUmVzZXJ2ZWRGaWVsZDo6UmVzZXJ2ZWRGaWVsZChpbnQgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBQYWNrZXRGaWVsZCgiUmVzZXJ2ZWRTY2FsYXIiICsgc3RkOjp0b19zdHJpbmcodW5pcXVlX2lkXysrKSwgbG9jKSwgc2l6ZV8oc2l6ZSkge30KLQotY29uc3Qgc3RkOjpzdHJpbmcmIFJlc2VydmVkRmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgUmVzZXJ2ZWRGaWVsZDo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNpemVfOwotfQotCi1zdGQ6OnN0cmluZyBSZXNlcnZlZEZpZWxkOjpHZXREYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHV0aWw6OkdldFR5cGVGb3JTaXplKHNpemVfKTsKLX0KLQotdm9pZCBSZXNlcnZlZEZpZWxkOjpHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiwgaW50LCBib29sKSBjb25zdCB7fQotCi1zdGQ6OnN0cmluZyBSZXNlcnZlZEZpZWxkOjpHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAiIjsKLX0KLQotdm9pZCBSZXNlcnZlZEZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3QgewotICAvLyBUaGVyZSBpcyBubyBHZXR0ZXIgZm9yIGEgcmVzZXJ2ZWQgZmllbGQKLX0KLQotc3RkOjpzdHJpbmcgUmVzZXJ2ZWRGaWVsZDo6R2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCB7Ci0gIC8vIFRoZXJlIGlzIG5vIGJ1aWxkZXIgcGFyYW1ldGVyIGZvciBhIHJlc2VydmVkIGZpZWxkCi0gIHJldHVybiAiIjsKLX0KLQotYm9vbCBSZXNlcnZlZEZpZWxkOjpIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZXNlcnZlZEZpZWxkOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBUaGVyZSBpcyBubyBidWlsZGVyIHBhcmFtZXRlciBmb3IgYSByZXNlcnZlZCBmaWVsZAotfQotCi12b2lkIFJlc2VydmVkRmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJpbnNlcnQoc3RhdGljX2Nhc3Q8IiA8PCB1dGlsOjpHZXRUeXBlRm9yU2l6ZShHZXRTaXplKCkuYml0cygpKSA8PCAiPigwKSAvKiBSZXNlcnZlZCAqLywgaSwgIiA8PCBHZXRTaXplKCkuYml0cygpCi0gICAgPDwgIiApO1xuIjsKLX0KLQotdm9pZCBSZXNlcnZlZEZpZWxkOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHZhbGlkYXRlIHRoZSB2YWx1ZSBvZiBhIHJlc2VydmVkIGZpZWxkCi19Ci0KLXN0ZDo6c3RyaW5nIFJlc2VydmVkRmllbGQ6OkdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHV0aWw6OkdldFJ1c3RUeXBlRm9yU2l6ZShzaXplXyk7Ci19Ci0KLXZvaWQgUmVzZXJ2ZWRGaWVsZDo6R2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7Ci19Ci0KLXZvaWQgUmVzZXJ2ZWRGaWVsZDo6R2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7fQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvcmVzZXJ2ZWRfZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3Jlc2VydmVkX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWJlNDkuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvcmVzZXJ2ZWRfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIFJlc2VydmVkRmllbGQgOiBwdWJsaWMgUGFja2V0RmllbGQgewotIHB1YmxpYzoKLSAgUmVzZXJ2ZWRGaWVsZChpbnQgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmllbGRUeXBlOwotCi0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpZWxkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgU2l6ZSBHZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5JbnNlcnRlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUsIHN0ZDo6c3RyaW5nKSBjb25zdCBvdmVycmlkZXt9OwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGludCBzaXplXzsKLSAgc3RhdGljIGludCB1bmlxdWVfaWRfOwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NjYWxhcl9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NjYWxhcl9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1ZTMxYy4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9zY2FsYXJfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy9zY2FsYXJfZmllbGQuaCIKLQotI2luY2x1ZGUgImZpZWxkcy9maXhlZF9zY2FsYXJfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2l6ZV9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotY29uc3Qgc3RkOjpzdHJpbmcgU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUgPSAiU2NhbGFyRmllbGQiOwotCi1TY2FsYXJGaWVsZDo6U2NhbGFyRmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHNpemUsIFBhcnNlTG9jYXRpb24gbG9jKSA6IFBhY2tldEZpZWxkKG5hbWUsIGxvYyksIHNpemVfKHNpemUpIHsKLSAgaWYgKHNpemVfID4gNjQgfHwgc2l6ZV8gPCAwKSB7Ci0gICAgRVJST1IodGhpcykgPDwgIk5vdCBpbXBsZW1lbnRlZCBmb3Igc2l6ZV8gPSAiIDw8IHNpemVfOwotICB9Ci19Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBTY2FsYXJGaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgU2NhbGFyRmllbGQ6OkdldFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzaXplXzsKLX0KLQotc3RkOjpzdHJpbmcgU2NhbGFyRmllbGQ6OkdldERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gdXRpbDo6R2V0VHlwZUZvclNpemUoc2l6ZV8pOwotfQotCi1pbnQgR2V0U2hpZnRCaXRzKGludCBpKSB7Ci0gIGludCBiaXRzX3Bhc3RfYnl0ZV9ib3VuZGFyeSA9IGkgJSA4OwotICBpZiAoYml0c19wYXN0X2J5dGVfYm91bmRhcnkgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIHJldHVybiA4IC0gYml0c19wYXN0X2J5dGVfYm91bmRhcnk7Ci0gIH0KLX0KLQotaW50IFNjYWxhckZpZWxkOjpHZW5Cb3VuZHMoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0LCBTaXplIHNpemUpIGNvbnN0IHsKLSAgaW50IG51bV9sZWFkaW5nX2JpdHMgPSAwOwotCi0gIGlmICghc3RhcnRfb2Zmc2V0LmVtcHR5KCkpIHsKLSAgICAvLyBEZWZhdWx0IHRvIHN0YXJ0IGlmIGF2YWlsYWJsZS4KLSAgICBudW1fbGVhZGluZ19iaXRzID0gc3RhcnRfb2Zmc2V0LmJpdHMoKSAlIDg7Ci0gICAgcyA8PCAiYXV0byAiIDw8IEdldE5hbWUoKSA8PCAiX2l0ID0gdG9fYm91bmQgKyAoIiA8PCBzdGFydF9vZmZzZXQgPDwgIikgLyA4OyI7Ci0gIH0gZWxzZSBpZiAoIWVuZF9vZmZzZXQuZW1wdHkoKSkgewotICAgIG51bV9sZWFkaW5nX2JpdHMgPSBHZXRTaGlmdEJpdHMoZW5kX29mZnNldC5iaXRzKCkgKyBzaXplLmJpdHMoKSk7Ci0gICAgU2l6ZSBieXRlX29mZnNldCA9IFNpemUobnVtX2xlYWRpbmdfYml0cyArIHNpemUuYml0cygpKSArIGVuZF9vZmZzZXQ7Ci0gICAgcyA8PCAiYXV0byAiIDw8IEdldE5hbWUoKSA8PCAiX2l0ID0gdG9fYm91bmQgKyAodG9fYm91bmQuTnVtQnl0ZXNSZW1haW5pbmcoKSAtICgiIDw8IGJ5dGVfb2Zmc2V0IDw8ICIpIC8gOCk7IjsKLSAgfSBlbHNlIHsKLSAgICBFUlJPUih0aGlzKSA8PCAiQW1iaWd1b3VzIG9mZnNldCBmb3IgZmllbGQuIjsKLSAgfQotICByZXR1cm4gbnVtX2xlYWRpbmdfYml0czsKLX0KLQotdm9pZCBTY2FsYXJGaWVsZDo6R2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wpIGNvbnN0IHsKLSAgU2l6ZSBzaXplID0gR2V0U2l6ZSgpOwotICAvLyBFeHRyYWN0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBieXRlcy4gVGhlIHJldHVybiB0eXBlIGNvdWxkIGJlIGRpZmZlcmVudAotICAvLyBmcm9tIHRoZSBleHRyYWN0IHR5cGUgaWYgYW4gZWFybGllciBmaWVsZCBjYXVzZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgLy8gY3VycmVudCBmaWVsZCB0byBzdGFydCBpbiB0aGUgbWlkZGxlIG9mIGEgYnl0ZS4KLSAgc3RkOjpzdHJpbmcgZXh0cmFjdF90eXBlID0gdXRpbDo6R2V0VHlwZUZvclNpemUoc2l6ZS5iaXRzKCkgKyBudW1fbGVhZGluZ19iaXRzKTsKLSAgcyA8PCAiYXV0byBleHRyYWN0ZWRfdmFsdWUgPSAiIDw8IEdldE5hbWUoKSA8PCAiX2l0LmV4dHJhY3Q8IiA8PCBleHRyYWN0X3R5cGUgPDwgIj4oKTsiOwotCi0gIC8vIFJpZ2h0IHNoaWZ0IHRoZSByZXN1bHQgdG8gcmVtb3ZlIGxlYWRpbmcgYml0cy4KLSAgaWYgKG51bV9sZWFkaW5nX2JpdHMgIT0gMCkgewotICAgIHMgPDwgImV4dHJhY3RlZF92YWx1ZSA+Pj0gIiA8PCBudW1fbGVhZGluZ19iaXRzIDw8ICI7IjsKLSAgfQotICAvLyBNYXNrIHRoZSByZXN1bHQgaWYgbmVjZXNzYXJ5LgotICBpZiAodXRpbDo6Um91bmRTaXplVXAoc2l6ZS5iaXRzKCkpICE9IHNpemUuYml0cygpKSB7Ci0gICAgdWludDY0X3QgbWFzayA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLmJpdHMoKTsgaSsrKSB7Ci0gICAgICBtYXNrIDw8PSAxOwotICAgICAgbWFzayB8PSAxOwotICAgIH0KLSAgICBzIDw8ICJleHRyYWN0ZWRfdmFsdWUgJj0gMHgiIDw8IHN0ZDo6aGV4IDw8IG1hc2sgPDwgc3RkOjpkZWMgPDwgIjsiOwotICB9Ci0gIHMgPDwgIioiIDw8IEdldE5hbWUoKSA8PCAiX3B0ciA9IHN0YXRpY19jYXN0PCIgPDwgR2V0RGF0YVR5cGUoKSA8PCAiPihleHRyYWN0ZWRfdmFsdWUpOyI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFNjYWxhckZpZWxkOjpHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiR2V0IiA8PCB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UoR2V0TmFtZSgpKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi12b2lkIFNjYWxhckZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiICIgPDwgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgPDwgIigpIGNvbnN0IHsiOwotICBzIDw8ICJBU1NFUlQod2FzX3ZhbGlkYXRlZF8pOyI7Ci0gIHMgPDwgImF1dG8gdG9fYm91bmQgPSBiZWdpbigpOyI7Ci0gIGludCBudW1fbGVhZGluZ19iaXRzID0gR2VuQm91bmRzKHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCwgR2V0U2l6ZSgpKTsKLSAgcyA8PCBHZXREYXRhVHlwZSgpIDw8ICIgIiA8PCBHZXROYW1lKCkgPDwgIl92YWx1ZXt9OyI7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiKiAiIDw8IEdldE5hbWUoKSA8PCAiX3B0ciA9ICYiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVlOyI7Ci0gIEdlbkV4dHJhY3RvcihzLCBudW1fbGVhZGluZ19iaXRzLCBmYWxzZSk7Ci0gIHMgPDwgInJldHVybiAiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVlOyI7Ci0gIHMgPDwgIn0iOwotfQotCi1zdGQ6OnN0cmluZyBTY2FsYXJGaWVsZDo6R2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXREYXRhVHlwZSgpOwotfQotCi1ib29sIFNjYWxhckZpZWxkOjpIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCB7Ci0gIHJldHVybiB1dGlsOjpSb3VuZFNpemVVcChHZXRTaXplKCkuYml0cygpKSAhPSBHZXRTaXplKCkuYml0cygpOwotfQotCi12b2lkIFNjYWxhckZpZWxkOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgIkFTU0VSVCgiIDw8IEdldE5hbWUoKSA8PCAiIDwgKHN0YXRpY19jYXN0PHVpbnQ2NF90PigxKSA8PCAiIDw8IEdldFNpemUoKS5iaXRzKCkgPDwgIikpOyI7Ci19Ci0KLXZvaWQgU2NhbGFyRmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBpZiAoR2V0U2l6ZSgpLmJpdHMoKSA9PSA4KSB7Ci0gICAgcyA8PCAiaS5pbnNlcnRfYnl0ZSgiIDw8IEdldE5hbWUoKSA8PCAiXyk7IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8ICJpbnNlcnQoIiA8PCBHZXROYW1lKCkgPDwgIl8sIGksIiA8PCBHZXRTaXplKCkuYml0cygpIDw8ICIpOyI7Ci0gIH0KLX0KLQotdm9pZCBTY2FsYXJGaWVsZDo6R2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gRG8gbm90aGluZwotfQotCi12b2lkIFNjYWxhckZpZWxkOjpHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCB7Ci0gIHMgPDwgIisiIDw8IGFjY2Vzc29yOwotfQotCi1zdGQ6OnN0cmluZyBTY2FsYXJGaWVsZDo6R2V0UnVzdERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gdXRpbDo6R2V0UnVzdFR5cGVGb3JTaXplKHNpemVfKTsKLX0KLQotc3RkOjpzdHJpbmcgU2NhbGFyRmllbGQ6OkdldFJ1c3RQYXJzZURhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gdXRpbDo6R2V0UnVzdFR5cGVGb3JTaXplKHNpemVfKTsKLX0KLQotaW50IFNjYWxhckZpZWxkOjpHZXRSdXN0Qml0T2Zmc2V0KAotICAgIHN0ZDo6b3N0cmVhbSYsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQsIFNpemUgc2l6ZSkgY29uc3QgewotICBpbnQgbnVtX2xlYWRpbmdfYml0cyA9IDA7Ci0KLSAgaWYgKCFzdGFydF9vZmZzZXQuZW1wdHkoKSkgewotICAgIC8vIERlZmF1bHQgdG8gc3RhcnQgaWYgYXZhaWxhYmxlLgotICAgIG51bV9sZWFkaW5nX2JpdHMgPSBzdGFydF9vZmZzZXQuYml0cygpICUgODsKLSAgfSBlbHNlIGlmICghZW5kX29mZnNldC5lbXB0eSgpKSB7Ci0gICAgbnVtX2xlYWRpbmdfYml0cyA9IEdldFNoaWZ0Qml0cyhlbmRfb2Zmc2V0LmJpdHMoKSArIHNpemUuYml0cygpKTsKLSAgICBTaXplIGJ5dGVfb2Zmc2V0ID0gU2l6ZShudW1fbGVhZGluZ19iaXRzICsgc2l6ZS5iaXRzKCkpICsgZW5kX29mZnNldDsKLSAgfSBlbHNlIHsKLSAgICBFUlJPUih0aGlzKSA8PCAiQW1iaWd1b3VzIG9mZnNldCBmb3IgZmllbGQuIjsKLSAgfQotICByZXR1cm4gbnVtX2xlYWRpbmdfYml0czsKLX0KLQotdm9pZCBTY2FsYXJGaWVsZDo6R2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IHsKLSAgU2l6ZSBzaXplID0gR2V0U2l6ZSgpOwotCi0gIGludCBudW1fbGVhZGluZ19iaXRzID0gR2V0UnVzdEJpdE9mZnNldChzLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQsIEdldFNpemUoKSk7Ci0KLSAgcyA8PCAibGV0ICIgPDwgR2V0TmFtZSgpIDw8ICIgPSAiOwotICBhdXRvIG9mZnNldCA9IG51bV9sZWFkaW5nX2JpdHMgPT0gMCA/IDAgOiAtMTsKLSAgcyA8PCBHZXRSdXN0UGFyc2VEYXRhVHlwZSgpIDw8ICI6OmZyb21fbGVfYnl0ZXMoWyI7Ci0gIGludCB0b3RhbF9ieXRlczsKLSAgaWYgKHNpemVfIDw9IDgpIHsKLSAgICB0b3RhbF9ieXRlcyA9IDE7Ci0gIH0gZWxzZSBpZiAoc2l6ZV8gPD0gMTYpIHsKLSAgICB0b3RhbF9ieXRlcyA9IDI7Ci0gIH0gZWxzZSBpZiAoc2l6ZV8gPD0gMzIpIHsKLSAgICB0b3RhbF9ieXRlcyA9IDQ7Ci0gIH0gZWxzZSB7Ci0gICAgdG90YWxfYnl0ZXMgPSA4OwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfYnl0ZXM7IGkrKykgewotICAgIGlmIChpID4gMCkgewotICAgICAgcyA8PCAiLCI7Ci0gICAgfQotICAgIGlmIChpIDwgc2l6ZS5ieXRlcygpKSB7Ci0gICAgICBzIDw8ICJieXRlc1siIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpICsgaSArIG9mZnNldCA8PCAiXSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgMDsKLSAgICB9Ci0gIH0KLSAgcyA8PCAiXSk7IjsKLQotICBpZiAobnVtX2xlYWRpbmdfYml0cyAhPSAwKSB7Ci0gICAgcyA8PCAibGV0ICIgPDwgR2V0TmFtZSgpIDw8ICIgPSAiIDw8IEdldE5hbWUoKSA8PCAiID4+ICIgPDwgbnVtX2xlYWRpbmdfYml0cyA8PCAiOyI7Ci0gIH0KLQotICBpZiAodXRpbDo6Um91bmRTaXplVXAoc2l6ZS5iaXRzKCkpICE9IHNpemUuYml0cygpKSB7Ci0gICAgdWludDY0X3QgbWFzayA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLmJpdHMoKTsgaSsrKSB7Ci0gICAgICBtYXNrIDw8PSAxOwotICAgICAgbWFzayB8PSAxOwotICAgIH0KLSAgICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9ICI7Ci0gICAgcyA8PCBHZXROYW1lKCkgPDwgIiAmIDB4IiA8PCBzdGQ6OmhleCA8PCBtYXNrIDw8IHN0ZDo6ZGVjIDw8ICI7IjsKLSAgfQotCi0gIC8vIG5lZWRzIGNhc3RpbmcgZnJvbSBwcmltaXRpdmUKLSAgaWYgKEdldFJ1c3RQYXJzZURhdGFUeXBlKCkgIT0gR2V0UnVzdERhdGFUeXBlKCkpIHsKLSAgICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9ICI7Ci0gICAgcyA8PCBHZXRSdXN0RGF0YVR5cGUoKSA8PCAiOjpmcm9tXyIgPDwgR2V0UnVzdFBhcnNlRGF0YVR5cGUoKSA8PCAiKCIgPDwgR2V0TmFtZSgpIDw8ICIpLnVud3JhcCgpOyI7Ci0gIH0KLX0KLQotdm9pZCBTY2FsYXJGaWVsZDo6R2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IHsKLSAgU2l6ZSBzaXplID0gR2V0U2l6ZSgpOwotICBpbnQgbnVtX2xlYWRpbmdfYml0cyA9IEdldFJ1c3RCaXRPZmZzZXQocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0LCBHZXRTaXplKCkpOwotCi0gIGlmIChHZXRGaWVsZFR5cGUoKSA9PSBTaXplRmllbGQ6OmtGaWVsZFR5cGUgfHwgR2V0RmllbGRUeXBlKCkgPT0gRml4ZWRTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgIC8vIERvIG5vdGhpbmcsIHRoZSBmaWVsZCBhY2Nlc3MgaGFzIGFscmVhZHkgaGFwcGVuZWQKLSAgfSBlbHNlIGlmIChHZXRSdXN0UGFyc2VEYXRhVHlwZSgpICE9IEdldFJ1c3REYXRhVHlwZSgpKSB7Ci0gICAgLy8gbmVlZHMgY2FzdGluZyB0byBwcmltaXRpdmUKLSAgICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9IHNlbGYuIiA8PCBHZXROYW1lKCkgPDwgIi50b18iIDw8IEdldFJ1c3RQYXJzZURhdGFUeXBlKCkgPDwgIigpLnVud3JhcCgpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCAibGV0ICIgPDwgR2V0TmFtZSgpIDw8ICIgPSBzZWxmLiIgPDwgR2V0TmFtZSgpIDw8ICI7IjsKLSAgfQotICBpZiAodXRpbDo6Um91bmRTaXplVXAoc2l6ZS5iaXRzKCkpICE9IHNpemUuYml0cygpKSB7Ci0gICAgdWludDY0X3QgbWFzayA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplLmJpdHMoKTsgaSsrKSB7Ci0gICAgICBtYXNrIDw8PSAxOwotICAgICAgbWFzayB8PSAxOwotICAgIH0KLSAgICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9ICI7Ci0gICAgcyA8PCBHZXROYW1lKCkgPDwgIiAmIDB4IiA8PCBzdGQ6OmhleCA8PCBtYXNrIDw8IHN0ZDo6ZGVjIDw8ICI7IjsKLSAgfQotCi0gIGludCBhY2Nlc3Nfb2Zmc2V0ID0gMDsKLSAgaWYgKG51bV9sZWFkaW5nX2JpdHMgIT0gMCkgewotICAgIGFjY2Vzc19vZmZzZXQgPSAtMTsKLSAgICB1aW50NjRfdCBtYXNrID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9sZWFkaW5nX2JpdHM7IGkrKykgewotICAgICAgbWFzayA8PD0gMTsKLSAgICAgIG1hc2sgfD0gMTsKLSAgICB9Ci0gICAgcyA8PCAibGV0ICIgPDwgR2V0TmFtZSgpIDw8ICIgPSAoIiA8PCBHZXROYW1lKCkgPDwgIiA8PCAiIDw8IG51bV9sZWFkaW5nX2JpdHMgPDwgIikgfCAoIgotICAgICAgPDwgIihidWZmZXJbIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIGFjY2Vzc19vZmZzZXQgPDwgIl0gYXMgIiA8PCBHZXRSdXN0UGFyc2VEYXRhVHlwZSgpIDw8ICIpICYgMHgiIDw8IHN0ZDo6aGV4Ci0gICAgICA8PCBtYXNrIDw8IHN0ZDo6ZGVjIDw8ICIpOyI7Ci0gIH0KLQotICBzIDw8ICJidWZmZXJbIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIGFjY2Vzc19vZmZzZXQgPDwgIi4uIgotICAgIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpICsgR2V0U2l6ZSgpLmJ5dGVzKCkgKyBhY2Nlc3Nfb2Zmc2V0IDw8ICJdLmNvcHlfZnJvbV9zbGljZSgmIiA8PCBHZXROYW1lKCkKLSAgICA8PCAiLnRvX2xlX2J5dGVzKClbMC4uIiA8PCBzaXplLmJ5dGVzKCkgPDwgIl0pOyI7Ci19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9zY2FsYXJfZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NjYWxhcl9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTYxNmNlLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NjYWxhcl9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJmaWVsZHMvcGFja2V0X2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgU2NhbGFyRmllbGQgOiBwdWJsaWMgUGFja2V0RmllbGQgewotIHB1YmxpYzoKLSAgU2NhbGFyRmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHNpemUsIFBhcnNlTG9jYXRpb24gbG9jKTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGludCBHZW5Cb3VuZHMoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0LCBTaXplIHNpemUpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UnVzdFBhcnNlRGF0YVR5cGUoKSBjb25zdDsKLQotICB2aXJ0dWFsIGludCBHZXRSdXN0Qml0T2Zmc2V0KHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsCi0gICAgICBTaXplIGVuZF9vZmZzZXQsIFNpemUgc2l6ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEdldHRlcklzQnlSZWYoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnQgc2l6ZV87Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvc2l6ZV9maWVsZC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NpemVfZmllbGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmM4OTkuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvc2l6ZV9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvc2l6ZV9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotY29uc3Qgc3RkOjpzdHJpbmcgU2l6ZUZpZWxkOjprRmllbGRUeXBlID0gIlNpemVGaWVsZCI7Ci0KLVNpemVGaWVsZDo6U2l6ZUZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBzaXplLCBQYXJzZUxvY2F0aW9uIGxvYykKLSAgICA6IFNjYWxhckZpZWxkKG5hbWUgKyAiX3NpemUiLCBzaXplLCBsb2MpLCBzaXplZF9maWVsZF9uYW1lXyhuYW1lKSB7fQotCi1jb25zdCBzdGQ6OnN0cmluZyYgU2l6ZUZpZWxkOjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBTaXplRmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLXZvaWQgU2l6ZUZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIHMgPDwgInByb3RlY3RlZDoiOwotICBTY2FsYXJGaWVsZDo6R2VuR2V0dGVyKHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCk7Ci0gIHMgPDwgInB1YmxpYzpcbiI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFNpemVGaWVsZDo6R2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAiIjsKLX0KLQotYm9vbCBTaXplRmllbGQ6OkdlbkJ1aWxkZXJQYXJhbWV0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBUaGVyZSBpcyBubyBidWlsZGVyIHBhcmFtZXRlciBmb3IgYSBzaXplIGZpZWxkCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTaXplRmllbGQ6Okhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNpemVGaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gVGhlcmUgaXMgbm8gYnVpbGRlciBwYXJhbWV0ZXIgZm9yIGEgc2l6ZSBmaWVsZAotICAvLyBUT0RPOiBDaGVjayBpZiB0aGUgcGF5bG9hZCBmaXRzIGluIHRoZSBwYWNrZXQ/Ci19Ci0KLXZvaWQgU2l6ZUZpZWxkOjpHZW5JbnNlcnRlcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIEVSUk9SKHRoaXMpIDw8IF9fZnVuY19fIDw8ICI6IFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIHNpemUgZmllbGRzIjsKLX0KLQotdm9pZCBTaXplRmllbGQ6OkdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCB7Ci0gIC8vIERvIG5vdGhpbmcgc2luY2UgdGhlIGZpeGVkIHNpemUgZmllbGRzIHdpbGwgYmUgaGFuZGxlZCBzcGVjaWFsbHkuCi19Ci0KLXN0ZDo6c3RyaW5nIFNpemVGaWVsZDo6R2V0U2l6ZWRGaWVsZE5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBzaXplZF9maWVsZF9uYW1lXzsKLX0KLQotdm9pZCBTaXplRmllbGQ6OkdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0IHsKLSAgcyA8PCBhY2Nlc3NvcjsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NpemVfZmllbGQuaCBiL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3NpemVfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0MGM0Mi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9zaXplX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2NhbGFyX2ZpZWxkLmgiCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgU2l6ZUZpZWxkIDogcHVibGljIFNjYWxhckZpZWxkIHsKLSBwdWJsaWM6Ci0gIFNpemVGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBpbnQgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmllbGRUeXBlOwotCi0gIHN0ZDo6c3RyaW5nIEdldEZpZWxkKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgR2VuQnVpbGRlclBhcmFtZXRlcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFNpemVkRmllbGROYW1lKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IHNpemVfOwotICBzdGQ6OnN0cmluZyBzaXplZF9maWVsZF9uYW1lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9zdHJ1Y3RfZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy9zdHJ1Y3RfZmllbGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YWQxYWIuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvc3RydWN0X2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmaWVsZHMvc3RydWN0X2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBTdHJ1Y3RGaWVsZDo6a0ZpZWxkVHlwZSA9ICJTdHJ1Y3RGaWVsZCI7Ci0KLVN0cnVjdEZpZWxkOjpTdHJ1Y3RGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlX25hbWUsIFNpemUgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBQYWNrZXRGaWVsZChuYW1lLCBsb2MpLCB0eXBlX25hbWVfKHR5cGVfbmFtZSksIHNpemVfKHNpemUpIHt9Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBTdHJ1Y3RGaWVsZDo6R2V0RmllbGRUeXBlKCkgY29uc3QgewotICByZXR1cm4gU3RydWN0RmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgU3RydWN0RmllbGQ6OkdldFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzaXplXzsKLX0KLQotU2l6ZSBTdHJ1Y3RGaWVsZDo6R2V0QnVpbGRlclNpemUoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nIHJldCA9ICIoIiArIEdldE5hbWUoKSArICJfLnNpemUoKSAqIDgpIjsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RkOjpzdHJpbmcgU3RydWN0RmllbGQ6OkdldERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gdHlwZV9uYW1lXzsKLX0KLQotdm9pZCBTdHJ1Y3RGaWVsZDo6R2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50LCBib29sKSBjb25zdCB7Ci0gIHMgPDwgR2V0TmFtZSgpIDw8ICJfaXQgPSAiOwotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIjo6UGFyc2UoIiA8PCBHZXROYW1lKCkgPDwgIl9wdHIsICIgPDwgR2V0TmFtZSgpIDw8ICJfaXQpOyI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFN0cnVjdEZpZWxkOjpHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiR2V0IiA8PCB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UoR2V0TmFtZSgpKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi12b2lkIFN0cnVjdEZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiICIgPDwgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgPDwgIigpIGNvbnN0IHsiOwotICBzIDw8ICJBU1NFUlQod2FzX3ZhbGlkYXRlZF8pOyI7Ci0gIHMgPDwgInNpemVfdCBlbmRfaW5kZXggPSBzaXplKCk7IjsKLSAgcyA8PCAiYXV0byB0b19ib3VuZCA9IGJlZ2luKCk7IjsKLSAgaW50IG51bV9sZWFkaW5nX2JpdHMgPSBHZW5Cb3VuZHMocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0LCBHZXRTaXplKCkpOwotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIiAiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVle307IjsKLSAgcyA8PCBHZXREYXRhVHlwZSgpIDw8ICIqICIgPDwgR2V0TmFtZSgpIDw8ICJfcHRyID0gJiIgPDwgR2V0TmFtZSgpIDw8ICJfdmFsdWU7IjsKLSAgR2VuRXh0cmFjdG9yKHMsIG51bV9sZWFkaW5nX2JpdHMsIGZhbHNlKTsKLQotICBzIDw8ICJyZXR1cm4gIiA8PCBHZXROYW1lKCkgPDwgIl92YWx1ZTsiOwotICBzIDw8ICJ9XG4iOwotfQotCi1zdGQ6OnN0cmluZyBTdHJ1Y3RGaWVsZDo6R2V0QnVpbGRlclBhcmFtZXRlclR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXREYXRhVHlwZSgpOwotfQotCi1ib29sIFN0cnVjdEZpZWxkOjpIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBTdHJ1Y3RGaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gVmFsaWRhdGVkIGF0IGNvbXBpbGUgdGltZS4KLX0KLQotdm9pZCBTdHJ1Y3RGaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgR2V0TmFtZSgpIDw8ICJfLlNlcmlhbGl6ZShpKTsiOwotfQotCi12b2lkIFN0cnVjdEZpZWxkOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgU3RydWN0RmllbGQ6OkdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHN0ZDo6b3N0cmVhbSYgcywgc3RkOjpzdHJpbmcgYWNjZXNzb3IpIGNvbnN0IHsKLSAgcyA8PCBhY2Nlc3NvciA8PCAiLlRvU3RyaW5nKCkiOwotfQotCi1zdGQ6OnN0cmluZyBTdHJ1Y3RGaWVsZDo6R2V0UnVzdERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gR2V0RGF0YVR5cGUoKTsKLX0KLQotdm9pZCBTdHJ1Y3RGaWVsZDo6R2VuQm91bmRzQ2hlY2soc3RkOjpvc3RyZWFtJiwgU2l6ZSwgU2l6ZSwgc3RkOjpzdHJpbmcpIGNvbnN0IHsKLSAgLy8gaW1wbGljaXRseSBjaGVja2VkIGJ5IHRoZSBzdHJ1Y3QgcGFyc2VyCi19Ci0KLXZvaWQgU3RydWN0RmllbGQ6OkdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSkgY29uc3QgewotICBzIDw8ICJsZXQgIiA8PCBHZXROYW1lKCkgPDwgIiA9ICI7Ci0gIHMgPDwgR2V0UnVzdERhdGFUeXBlKCkgPDwgIjo6cGFyc2UoJmJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uIjsKLSAgcyA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSArIEdldFNpemUoKS5ieXRlcygpIDw8ICJdKS51bndyYXAoKTsiOwotfQotCi12b2lkIFN0cnVjdEZpZWxkOjpHZW5SdXN0V3JpdGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUpIGNvbnN0IHsKLSAgcyA8PCAibGV0ICIgPDwgR2V0TmFtZSgpIDw8ICIgPSAmbXV0IGJ1ZmZlclsiIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpOwotICBzIDw8ICIuLiIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgKyBHZXRTaXplKCkuYnl0ZXMoKSA8PCAiXTsiOwotICBzIDw8ICJzZWxmLiIgPDwgR2V0TmFtZSgpIDw8ICIud3JpdGVfdG8oIiA8PCBHZXROYW1lKCkgPDwgIik7IjsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3N0cnVjdF9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvc3RydWN0X2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzVmYjQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvc3RydWN0X2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJwYXJzZV9sb2NhdGlvbi5oIgotCi1jbGFzcyBTdHJ1Y3RGaWVsZCA6IHB1YmxpYyBQYWNrZXRGaWVsZCB7Ci0gcHVibGljOgotICBTdHJ1Y3RGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlX25hbWUsIFNpemUgc2l6ZSwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmllbGRUeXBlOwotCi0gIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpZWxkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgU2l6ZSBHZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBTaXplIEdldEJ1aWxkZXJTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdldHRlckZ1bmN0aW9uTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBib29sIEhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuU3RyaW5nUmVwcmVzZW50YXRpb24oc3RkOjpvc3RyZWFtJiBzLCBzdGQ6OnN0cmluZyBhY2Nlc3NvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCwgc3RkOjpzdHJpbmcpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lXzsKLQotIHB1YmxpYzoKLSAgY29uc3QgU2l6ZSBzaXplX3t9OwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3ZhcmlhYmxlX2xlbmd0aF9zdHJ1Y3RfZmllbGQuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2ZpZWxkcy92YXJpYWJsZV9sZW5ndGhfc3RydWN0X2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhiNDNhLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3ZhcmlhYmxlX2xlbmd0aF9zdHJ1Y3RfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImZpZWxkcy92YXJpYWJsZV9sZW5ndGhfc3RydWN0X2ZpZWxkLmgiCi0jaW5jbHVkZSAidXRpbC5oIgotCi1jb25zdCBzdGQ6OnN0cmluZyBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjprRmllbGRUeXBlID0gIlZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQiOwotCi1WYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBQYWNrZXRGaWVsZChuYW1lLCBsb2MpLCB0eXBlX25hbWVfKHR5cGVfbmFtZSkge30KLQotY29uc3Qgc3RkOjpzdHJpbmcmIFZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQ6OmtGaWVsZFR5cGU7Ci19Ci0KLVNpemUgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZDo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFNpemUoKTsKLX0KLQotU2l6ZSBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpHZXRCdWlsZGVyU2l6ZSgpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgcmV0ID0gIigiICsgR2V0TmFtZSgpICsgIl8tPnNpemUoKSAqIDgpICI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIFZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQ6OkdldERhdGFUeXBlKCkgY29uc3QgewotICBzdGQ6OnN0cmluZyByZXQgPSAic3RkOjp1bmlxdWVfcHRyPCIgKyB0eXBlX25hbWVfICsgIj4iOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQ6OkdlbkV4dHJhY3RvcihzdGQ6Om9zdHJlYW0mIHMsIGludCwgYm9vbCkgY29uc3QgewotICBzIDw8IEdldE5hbWUoKSA8PCAiX3B0ciA9IFBhcnNlIiA8PCB0eXBlX25hbWVfIDw8ICIoIiA8PCBHZXROYW1lKCkgPDwgIl9pdCk7IjsKLSAgcyA8PCAiaWYgKCIgPDwgR2V0TmFtZSgpIDw8ICJfcHRyICE9IG51bGxwdHIpIHsiOwotICBzIDw8IEdldE5hbWUoKSA8PCAiX2l0ID0gIiA8PCBHZXROYW1lKCkgPDwgIl9pdCArICIgPDwgR2V0TmFtZSgpIDw8ICJfcHRyLT5zaXplKCk7IjsKLSAgcyA8PCAifSBlbHNlIHsiOwotICBzIDw8IEdldE5hbWUoKSA8PCAiX2l0ID0gIiA8PCBHZXROYW1lKCkgPDwgIl9pdCArICIgPDwgR2V0TmFtZSgpIDw8ICJfaXQuTnVtQnl0ZXNSZW1haW5pbmcoKTsiOwotICBzIDw8ICJ9IjsKLX0KLQotc3RkOjpzdHJpbmcgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZDo6R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgY29uc3QgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgIkdldCIgPDwgdXRpbDo6VW5kZXJzY29yZVRvQ2FtZWxDYXNlKEdldE5hbWUoKSk7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotdm9pZCBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiICIgPDwgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgPDwgIigpIGNvbnN0IHsiOwotICBzIDw8ICJBU1NFUlQod2FzX3ZhbGlkYXRlZF8pOyI7Ci0gIHMgPDwgInNpemVfdCBlbmRfaW5kZXggPSBzaXplKCk7IjsKLSAgcyA8PCAiYXV0byB0b19ib3VuZCA9IGJlZ2luKCk7IjsKLSAgaW50IG51bV9sZWFkaW5nX2JpdHMgPSBHZW5Cb3VuZHMocywgc3RhcnRfb2Zmc2V0LCBlbmRfb2Zmc2V0LCBHZXRTaXplKCkpOwotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIiAiIDw8IEdldE5hbWUoKSA8PCAiX3B0cnt9OyI7Ci0gIEdlbkV4dHJhY3RvcihzLCBudW1fbGVhZGluZ19iaXRzLCBmYWxzZSk7Ci0gIHMgPDwgInJldHVybiAiIDw8IEdldE5hbWUoKSA8PCAiX3B0cjsiOwotICBzIDw8ICJ9XG4iOwotfQotCi1zdGQ6OnN0cmluZyBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldERhdGFUeXBlKCk7Ci19Ci0KLWJvb2wgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZDo6QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkgY29uc3QgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpHZW5QYXJhbWV0ZXJWYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBWYWxpZGF0ZWQgYXQgY29tcGlsZSB0aW1lLgotfQotCi12b2lkIFZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQ6Okdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8IEdldE5hbWUoKSA8PCAiXy0+U2VyaWFsaXplKGkpOyI7Ci19Ci0KLXZvaWQgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZDo6R2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gRG8gbm90aGluZwotfQotCi1zdGQ6OnN0cmluZyBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjpHZXRSdXN0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nIHJldCA9ICJzdGQ6OmJveGVkOjpCb3g8IiArIHR5cGVfbmFtZV8gKyAiPiI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZDo6R2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7Ci19Ci0KLXZvaWQgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZDo6R2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mLCBTaXplLCBTaXplKSBjb25zdCB7fQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvdmFyaWFibGVfbGVuZ3RoX3N0cnVjdF9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvdmFyaWFibGVfbGVuZ3RoX3N0cnVjdF9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc0ZDRlLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3ZhcmlhYmxlX2xlbmd0aF9zdHJ1Y3RfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIFZhcmlhYmxlTGVuZ3RoU3RydWN0RmllbGQgOiBwdWJsaWMgUGFja2V0RmllbGQgewotIHB1YmxpYzoKLSAgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlX25hbWUsIFBhcnNlTG9jYXRpb24gbG9jKTsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZpZWxkVHlwZTsKLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRGaWVsZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgU2l6ZSBHZXRCdWlsZGVyU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wgZm9yX3N0cnVjdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBCdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgSGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblBhcmFtZXRlclZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UnVzdERhdGFUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZW5SdXN0R2V0dGVyKHN0ZDo6b3N0cmVhbSYsIFNpemUsIFNpemUpIGNvbnN0ICBvdmVycmlkZTsKLQotICB2b2lkIEdlblJ1c3RXcml0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZV87Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvdmVjdG9yX2ZpZWxkLmNjIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvdmVjdG9yX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhjYTA3Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3ZlY3Rvcl9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZmllbGRzL3ZlY3Rvcl9maWVsZC5oIgotCi0jaW5jbHVkZSAiZmllbGRzL2NvdW50X2ZpZWxkLmgiCi0jaW5jbHVkZSAiZmllbGRzL2N1c3RvbV9maWVsZC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotY29uc3Qgc3RkOjpzdHJpbmcgVmVjdG9yRmllbGQ6OmtGaWVsZFR5cGUgPSAiVmVjdG9yRmllbGQiOwotCi1WZWN0b3JGaWVsZDo6VmVjdG9yRmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgaW50IGVsZW1lbnRfc2l6ZSwgc3RkOjpzdHJpbmcgc2l6ZV9tb2RpZmllciwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBQYWNrZXRGaWVsZChuYW1lLCBsb2MpLCBlbGVtZW50X2ZpZWxkXyhuZXcgU2NhbGFyRmllbGQoInZhbCIsIGVsZW1lbnRfc2l6ZSwgbG9jKSksIGVsZW1lbnRfc2l6ZV8oZWxlbWVudF9zaXplKSwKLSAgICAgIHNpemVfbW9kaWZpZXJfKHNpemVfbW9kaWZpZXIpIHsKLSAgaWYgKGVsZW1lbnRfc2l6ZSA+IDY0IHx8IGVsZW1lbnRfc2l6ZSA8IDApCi0gICAgRVJST1IodGhpcykgPDwgX19mdW5jX18gPDwgIjogTm90IGltcGxlbWVudGVkIGZvciBlbGVtZW50IHNpemUgPSAiIDw8IGVsZW1lbnRfc2l6ZTsKLSAgaWYgKGVsZW1lbnRfc2l6ZSAlIDggIT0gMCkgewotICAgIEVSUk9SKHRoaXMpIDw8ICJDYW4gb25seSBoYXZlIGFycmF5cyB3aXRoIGVsZW1lbnRzIHRoYXQgYXJlIGJ5dGUgYWxpZ25lZCAoIiA8PCBlbGVtZW50X3NpemUgPDwgIikiOwotICB9Ci19Ci0KLVZlY3RvckZpZWxkOjpWZWN0b3JGaWVsZChzdGQ6OnN0cmluZyBuYW1lLCBUeXBlRGVmKiB0eXBlX2RlZiwgc3RkOjpzdHJpbmcgc2l6ZV9tb2RpZmllciwgUGFyc2VMb2NhdGlvbiBsb2MpCi0gICAgOiBQYWNrZXRGaWVsZChuYW1lLCBsb2MpLCBlbGVtZW50X2ZpZWxkXyh0eXBlX2RlZi0+R2V0TmV3RmllbGQoInZhbCIsIGxvYykpLAotICAgICAgZWxlbWVudF9zaXplXyhlbGVtZW50X2ZpZWxkXy0+R2V0U2l6ZSgpKSwgc2l6ZV9tb2RpZmllcl8oc2l6ZV9tb2RpZmllcikgewotICBpZiAoIWVsZW1lbnRfc2l6ZV8uZW1wdHkoKSAmJiBlbGVtZW50X3NpemVfLmJpdHMoKSAlIDggIT0gMCkgewotICAgIEVSUk9SKHRoaXMpIDw8ICJDYW4gb25seSBoYXZlIGFycmF5cyB3aXRoIGVsZW1lbnRzIHRoYXQgYXJlIGJ5dGUgYWxpZ25lZCAoIiA8PCBlbGVtZW50X3NpemVfIDw8ICIpIjsKLSAgfQotfQotCi1jb25zdCBzdGQ6OnN0cmluZyYgVmVjdG9yRmllbGQ6OkdldEZpZWxkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFZlY3RvckZpZWxkOjprRmllbGRUeXBlOwotfQotCi1TaXplIFZlY3RvckZpZWxkOjpHZXRTaXplKCkgY29uc3QgewotICAvLyBJZiB0aGVyZSBpcyBubyBzaXplIGZpZWxkLCB0aGVuIGl0IGlzIG9mIHVua25vd24gc2l6ZS4KLSAgaWYgKHNpemVfZmllbGRfID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gU2l6ZSgpOwotICB9Ci0KLSAgLy8gc2l6ZV9maWVsZF8gaXMgb2YgdHlwZSBTSVpFCi0gIGlmIChzaXplX2ZpZWxkXy0+R2V0RmllbGRUeXBlKCkgPT0gU2l6ZUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0ID0gIihzdGF0aWNfY2FzdDxzaXplX3Q+KEdldCIgKyB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2Uoc2l6ZV9maWVsZF8tPkdldE5hbWUoKSkgKyAiKCkpICogOCkiOwotICAgIGlmICghc2l6ZV9tb2RpZmllcl8uZW1wdHkoKSkgcmV0ICs9IHNpemVfbW9kaWZpZXJfOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICAvLyBzaXplX2ZpZWxkXyBpcyBvZiB0eXBlIENPVU5UIGFuZCBlbGVtZW50cyBoYXZlIGEgZml4ZWQgc2l6ZQotICBpZiAoIWVsZW1lbnRfc2l6ZV8uZW1wdHkoKSAmJiAhZWxlbWVudF9zaXplXy5oYXNfZHluYW1pYygpKSB7Ci0gICAgcmV0dXJuICIoc3RhdGljX2Nhc3Q8c2l6ZV90PihHZXQiICsgdXRpbDo6VW5kZXJzY29yZVRvQ2FtZWxDYXNlKHNpemVfZmllbGRfLT5HZXROYW1lKCkpICsgIigpKSAqICIgKwotICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhlbGVtZW50X3NpemVfLmJpdHMoKSkgKyAiKSI7Ci0gIH0KLQotICByZXR1cm4gU2l6ZSgpOwotfQotCi1TaXplIFZlY3RvckZpZWxkOjpHZXRCdWlsZGVyU2l6ZSgpIGNvbnN0IHsKLSAgaWYgKCFlbGVtZW50X3NpemVfLmVtcHR5KCkgJiYgIWVsZW1lbnRfc2l6ZV8uaGFzX2R5bmFtaWMoKSkgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9ICIoc3RhdGljX2Nhc3Q8c2l6ZV90PigiICsgR2V0TmFtZSgpICsgIl8uc2l6ZSgpKSAqICIgKyBzdGQ6OnRvX3N0cmluZyhlbGVtZW50X3NpemVfLmJpdHMoKSkgKyAiKSI7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSBlbHNlIGlmIChlbGVtZW50X2ZpZWxkXy0+QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkpIHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSAiW3RoaXNdKCl7IHNpemVfdCBsZW5ndGggPSAwOyBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiAiICsgR2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAiXykgeyBsZW5ndGggKz0gZWxlbS0+c2l6ZSgpICogODsgfSByZXR1cm4gbGVuZ3RoOyB9KCkiOwotICAgIHJldHVybiByZXQ7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0ID0gIlt0aGlzXSgpeyBzaXplX3QgbGVuZ3RoID0gMDsgZm9yIChjb25zdCBhdXRvJiBlbGVtIDogIiArIEdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgIl8pIHsgbGVuZ3RoICs9IGVsZW0uc2l6ZSgpICogODsgfSByZXR1cm4gbGVuZ3RoOyB9KCkiOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLX0KLQotU2l6ZSBWZWN0b3JGaWVsZDo6R2V0U3RydWN0U2l6ZSgpIGNvbnN0IHsKLSAgLy8gSWYgdGhlcmUgaXMgbm8gc2l6ZSBmaWVsZCwgdGhlbiBpdCBpcyBvZiB1bmtub3duIHNpemUuCi0gIGlmIChzaXplX2ZpZWxkXyA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIFNpemUoKTsKLSAgfQotCi0gIC8vIHNpemVfZmllbGRfIGlzIG9mIHR5cGUgU0laRQotICBpZiAoc2l6ZV9maWVsZF8tPkdldEZpZWxkVHlwZSgpID09IFNpemVGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9ICIoc3RhdGljX2Nhc3Q8c2l6ZV90Pih0b19maWxsLT4iICsgc2l6ZV9maWVsZF8tPkdldE5hbWUoKSArICJfZXh0cmFjdGVkXykgKiA4KSI7Ci0gICAgaWYgKCFzaXplX21vZGlmaWVyXy5lbXB0eSgpKSByZXQgKz0gIi0iICsgc2l6ZV9tb2RpZmllcl87Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIC8vIHNpemVfZmllbGRfIGlzIG9mIHR5cGUgQ09VTlQgYW5kIGVsZW1lbnRzIGhhdmUgYSBmaXhlZCBzaXplCi0gIGlmICghZWxlbWVudF9zaXplXy5lbXB0eSgpICYmICFlbGVtZW50X3NpemVfLmhhc19keW5hbWljKCkpIHsKLSAgICByZXR1cm4gIihzdGF0aWNfY2FzdDxzaXplX3Q+KHRvX2ZpbGwtPiIgKyBzaXplX2ZpZWxkXy0+R2V0TmFtZSgpICsgIl9leHRyYWN0ZWRfKSAqICIgKwotICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhlbGVtZW50X3NpemVfLmJpdHMoKSkgKyAiKSI7Ci0gIH0KLQotICByZXR1cm4gU2l6ZSgpOwotfQotCi1zdGQ6OnN0cmluZyBWZWN0b3JGaWVsZDo6R2V0RGF0YVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAic3RkOjp2ZWN0b3I8IiArIGVsZW1lbnRfZmllbGRfLT5HZXREYXRhVHlwZSgpICsgIj4iOwotfQotCi12b2lkIFZlY3RvckZpZWxkOjpHZW5FeHRyYWN0b3Ioc3RkOjpvc3RyZWFtJiBzLCBpbnQgbnVtX2xlYWRpbmdfYml0cywgYm9vbCBmb3Jfc3RydWN0KSBjb25zdCB7Ci0gIHMgPDwgImF1dG8gIiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfaXQgPSAiIDw8IEdldE5hbWUoKSA8PCAiX2l0OyI7Ci0gIGlmIChzaXplX2ZpZWxkXyAhPSBudWxscHRyICYmIHNpemVfZmllbGRfLT5HZXRGaWVsZFR5cGUoKSA9PSBDb3VudEZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgcyA8PCAic2l6ZV90ICIgPDwgZWxlbWVudF9maWVsZF8tPkdldE5hbWUoKSA8PCAiX2NvdW50ID0gIjsKLSAgICBpZiAoZm9yX3N0cnVjdCkgewotICAgICAgcyA8PCAidG9fZmlsbC0+IiA8PCBzaXplX2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfZXh0cmFjdGVkXzsiOwotICAgIH0gZWxzZSB7Ci0gICAgICBzIDw8ICJHZXQiIDw8IHV0aWw6OlVuZGVyc2NvcmVUb0NhbWVsQ2FzZShzaXplX2ZpZWxkXy0+R2V0TmFtZSgpKSA8PCAiKCk7IjsKLSAgICB9Ci0gIH0KLSAgcyA8PCAid2hpbGUgKCI7Ci0gIGlmIChzaXplX2ZpZWxkXyAhPSBudWxscHRyICYmIHNpemVfZmllbGRfLT5HZXRGaWVsZFR5cGUoKSA9PSBDb3VudEZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgcyA8PCAiKCIgPDwgZWxlbWVudF9maWVsZF8tPkdldE5hbWUoKSA8PCAiX2NvdW50LS0gPiAwKSAmJiAiOwotICB9Ci0gIGlmICghZWxlbWVudF9zaXplXy5lbXB0eSgpKSB7Ci0gICAgcyA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfaXQuTnVtQnl0ZXNSZW1haW5pbmcoKSA+PSAiIDw8IGVsZW1lbnRfc2l6ZV8uYnl0ZXMoKSA8PCAiKSB7IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl9pdC5OdW1CeXRlc1JlbWFpbmluZygpID4gMCkgeyI7Ci0gIH0KLSAgaWYgKGVsZW1lbnRfZmllbGRfLT5CdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSkgewotICAgIHMgPDwgZWxlbWVudF9maWVsZF8tPkdldERhdGFUeXBlKCkgPDwgIiAiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl9wdHI7IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8IGVsZW1lbnRfZmllbGRfLT5HZXREYXRhVHlwZSgpIDw8ICIgIiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfdmFsdWU7IjsKLSAgICBzIDw8IGVsZW1lbnRfZmllbGRfLT5HZXREYXRhVHlwZSgpIDw8ICIqICIgPDwgZWxlbWVudF9maWVsZF8tPkdldE5hbWUoKSA8PCAiX3B0ciA9ICYiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkKLSAgICAgIDw8ICJfdmFsdWU7IjsKLSAgfQotICBlbGVtZW50X2ZpZWxkXy0+R2VuRXh0cmFjdG9yKHMsIG51bV9sZWFkaW5nX2JpdHMsIGZvcl9zdHJ1Y3QpOwotICBzIDw8ICJpZiAoIiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfcHRyICE9IG51bGxwdHIpIHsgIjsKLSAgaWYgKGVsZW1lbnRfZmllbGRfLT5CdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSkgewotICAgIHMgPDwgR2V0TmFtZSgpIDw8ICJfcHRyLT5wdXNoX2JhY2soc3RkOjptb3ZlKCIgPDwgZWxlbWVudF9maWVsZF8tPkdldE5hbWUoKSA8PCAiX3B0cikpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCBHZXROYW1lKCkgPDwgIl9wdHItPnB1c2hfYmFjaygiIDw8IGVsZW1lbnRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl92YWx1ZSk7IjsKLSAgfQotICBzIDw8ICJ9IjsKLSAgcyA8PCAifSI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFZlY3RvckZpZWxkOjpHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiR2V0IiA8PCB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UoR2V0TmFtZSgpKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi12b2lkIFZlY3RvckZpZWxkOjpHZW5HZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0KSBjb25zdCB7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiICIgPDwgR2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkgPDwgIigpIHsiOwotICBzIDw8ICJBU1NFUlQod2FzX3ZhbGlkYXRlZF8pOyI7Ci0gIHMgPDwgInNpemVfdCBlbmRfaW5kZXggPSBzaXplKCk7IjsKLSAgcyA8PCAiYXV0byB0b19ib3VuZCA9IGJlZ2luKCk7IjsKLQotICBpbnQgbnVtX2xlYWRpbmdfYml0cyA9IEdlbkJvdW5kcyhzLCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQsIEdldFNpemUoKSk7Ci0gIHMgPDwgR2V0RGF0YVR5cGUoKSA8PCAiICIgPDwgR2V0TmFtZSgpIDw8ICJfdmFsdWV7fTsiOwotICBzIDw8IEdldERhdGFUeXBlKCkgPDwgIiogIiA8PCBHZXROYW1lKCkgPDwgIl9wdHIgPSAmIiA8PCBHZXROYW1lKCkgPDwgIl92YWx1ZTsiOwotICBHZW5FeHRyYWN0b3IocywgbnVtX2xlYWRpbmdfYml0cywgZmFsc2UpOwotCi0gIHMgPDwgInJldHVybiAiIDw8IEdldE5hbWUoKSA8PCAiX3ZhbHVlOyI7Ci0gIHMgPDwgIn1cbiI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFZlY3RvckZpZWxkOjpHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmIChlbGVtZW50X2ZpZWxkXy0+QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkpIHsKLSAgICBzcyA8PCAic3RkOjp2ZWN0b3I8IiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0RGF0YVR5cGUoKSA8PCAiPiI7Ci0gIH0gZWxzZSB7Ci0gICAgc3MgPDwgImNvbnN0IHN0ZDo6dmVjdG9yPCIgPDwgZWxlbWVudF9maWVsZF8tPkdldERhdGFUeXBlKCkgPDwgIj4mIjsKLSAgfQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLWJvb2wgVmVjdG9yRmllbGQ6OkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGVsZW1lbnRfZmllbGRfLT5CdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKTsKLX0KLQotYm9vbCBWZWN0b3JGaWVsZDo6R2VuQnVpbGRlck1lbWJlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAic3RkOjp2ZWN0b3I8IiA8PCBlbGVtZW50X2ZpZWxkXy0+R2V0RGF0YVR5cGUoKSA8PCAiPiAiIDw8IEdldE5hbWUoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVmVjdG9yRmllbGQ6Okhhc1BhcmFtZXRlclZhbGlkYXRvcigpIGNvbnN0IHsKLSAgLy8gRG9lcyBub3QgaGF2ZSBwYXJhbWV0ZXIgdmFsaWRhdG9yIHlldC4KLSAgLy8gVE9ETzogU2VlIGNvbW1lbnQgaW4gR2VuUGFyYW1ldGVyVmFsaWRhdG9yCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBWZWN0b3JGaWVsZDo6R2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYpIGNvbnN0IHsKLSAgLy8gTm8gUGFyYW1ldGVyIHZhbGlkYXRvciBpZiBpdHMgZHluYW1pY2FsbHkgc2l6ZS4KLSAgLy8gVE9ETzogTWF5YmUgYWRkIGEgdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGF0IHRoZSBzaXplIGlzbid0IGxhcmdlciB0aGFuIHdoYXQgdGhlIHNpemUgZmllbGQgY2FuIGhvbGQuCi0gIHJldHVybjsKLX0KLQotdm9pZCBWZWN0b3JGaWVsZDo6R2VuSW5zZXJ0ZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgImZvciAoY29uc3QgYXV0byYgdmFsXyA6ICIgPDwgR2V0TmFtZSgpIDw8ICJfKSB7IjsKLSAgZWxlbWVudF9maWVsZF8tPkdlbkluc2VydGVyKHMpOwotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIFZlY3RvckZpZWxkOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJikgY29uc3QgewotICAvLyBOT1RFOiBXZSBjb3VsZCBjaGVjayBpZiB0aGUgZWxlbWVudCBzaXplIGRpdmlkZXMgY2xlYW5seSBpbnRvIHRoZSBhcnJheSBzaXplLCBidXQgd2UgZGVjaWRlZCB0byBmb3JnbyB0aGF0Ci0gIC8vIGluIGZhdm9yIG9mIGp1c3QgcmV0dXJuaW5nIGFzIG1hbnkgZWxlbWVudHMgYXMgcG9zc2libGUgaW4gYSBiZXN0IGVmZm9ydCBzdHlsZS4KLSAgLy8KLSAgLy8gT3RoZXIgdGhhbiB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBhcnJheXMgbmVlZCB0byBiZSB2YWxpZGF0ZWQgb24gb3RoZXIgdGhhbiBsZW5ndGggc28gbm90aGluZyBuZWVkcyB0bwotICAvLyBiZSBkb25lIGhlcmUuCi19Ci0KLXZvaWQgVmVjdG9yRmllbGQ6OlNldFNpemVGaWVsZChjb25zdCBTaXplRmllbGQqIHNpemVfZmllbGQpIHsKLSAgaWYgKHNpemVfZmllbGQtPkdldEZpZWxkVHlwZSgpID09IENvdW50RmllbGQ6OmtGaWVsZFR5cGUgJiYgIXNpemVfbW9kaWZpZXJfLmVtcHR5KCkpIHsKLSAgICBFUlJPUih0aGlzLCBzaXplX2ZpZWxkKSA8PCAiQ2FuIG5vdCB1c2UgY291bnQgZmllbGQgdG8gZGVzY3JpYmUgYXJyYXkgd2l0aCBhIHNpemUgbW9kaWZpZXIuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgVXNlIHNpemUgaW5zdGVhZCI7Ci0gIH0KLQotICBzaXplX2ZpZWxkXyA9IHNpemVfZmllbGQ7Ci19Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nJiBWZWN0b3JGaWVsZDo6R2V0U2l6ZU1vZGlmaWVyKCkgY29uc3QgewotICByZXR1cm4gc2l6ZV9tb2RpZmllcl87Ci19Ci0KLWJvb2wgVmVjdG9yRmllbGQ6OklzQ29udGFpbmVyRmllbGQoKSBjb25zdCB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBQYWNrZXRGaWVsZCogVmVjdG9yRmllbGQ6OkdldEVsZW1lbnRGaWVsZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGVsZW1lbnRfZmllbGRfOwotfQotCi12b2lkIFZlY3RvckZpZWxkOjpHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCB7Ci0gIHMgPDwgIlwiVkVDVE9SW1wiOyI7Ci0KLSAgc3RkOjpzdHJpbmcgYXJyX2lkeCA9ICJhcnJpZHhfIiArIGFjY2Vzc29yOwotICBzdGQ6OnN0cmluZyB2ZWNfc2l6ZSA9IGFjY2Vzc29yICsgIi5zaXplKCkiOwotICBzIDw8ICJmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgIiA8PCB2ZWNfc2l6ZSA8PCAiOyBpbmRleCsrKSB7IjsKLSAgc3RkOjpzdHJpbmcgZWxlbWVudF9hY2Nlc3NvciA9ICIoIiArIGFjY2Vzc29yICsgIltpbmRleF0pIjsKLSAgcyA8PCAic3MgPDwgKChpbmRleCA9PSAwKSA/IFwiXCIgOiBcIiwgXCIpIDw8ICI7Ci0KLSAgaWYgKGVsZW1lbnRfZmllbGRfLT5HZXRGaWVsZFR5cGUoKSA9PSBDdXN0b21GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgIHMgPDwgZWxlbWVudF9hY2Nlc3NvciA8PCAiLlRvU3RyaW5nKCkiOwotICB9IGVsc2UgewotICAgIGVsZW1lbnRfZmllbGRfLT5HZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzLCBlbGVtZW50X2FjY2Vzc29yKTsKLSAgfQotCi0gIHMgPDwgIjt9IjsKLSAgcyA8PCAic3MgPDwgXCJdXCIiOwotfQotCi1zdGQ6OnN0cmluZyBWZWN0b3JGaWVsZDo6R2V0UnVzdERhdGFUeXBlKCkgY29uc3QgewotICByZXR1cm4gIlZlYzo6PCIgKyBlbGVtZW50X2ZpZWxkXy0+R2V0UnVzdERhdGFUeXBlKCkgKyAiPiI7Ci19Ci0KLXZvaWQgVmVjdG9yRmllbGQ6OkdlbkJvdW5kc0NoZWNrKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUsIHN0ZDo6c3RyaW5nIGNvbnRleHQpIGNvbnN0IHsKLSAgYXV0byBlbGVtZW50X2ZpZWxkX3R5cGUgPSBHZXRFbGVtZW50RmllbGQoKS0+R2V0RmllbGRUeXBlKCk7Ci0gIGF1dG8gZWxlbWVudF9maWVsZCA9IEdldEVsZW1lbnRGaWVsZCgpOwotICBhdXRvIGVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfZmllbGQtPkdldFNpemUoKS5ieXRlcygpOwotCi0gIGlmIChlbGVtZW50X2ZpZWxkX3R5cGUgPT0gU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICBpZiAoc2l6ZV9maWVsZF8gPT0gbnVsbHB0cikgewotICAgICAgcyA8PCAibGV0IHJlbV8gPSAoYnl0ZXMubGVuKCkgLSAiIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpIDw8ICIpICUgIiA8PCBlbGVtZW50X3NpemUgPDwgIjsiOwotICAgICAgcyA8PCAiaWYgcmVtXyAhPSAwIHsiOwotICAgICAgcyA8PCAiIHJldHVybiBFcnIoRXJyb3I6OkludmFsaWRMZW5ndGhFcnJvcnsiOwotICAgICAgcyA8PCAiICAgIG9iajogXCIiIDw8IGNvbnRleHQgPDwgIlwiLnRvX3N0cmluZygpLCI7Ci0gICAgICBzIDw8ICIgICAgZmllbGQ6IFwiIiA8PCBHZXROYW1lKCkgPDwgIlwiLnRvX3N0cmluZygpLCI7Ci0gICAgICBzIDw8ICIgICAgd2FudGVkOiBieXRlcy5sZW4oKSArIHJlbV8sIjsKLSAgICAgIHMgPDwgIiAgICBnb3Q6IGJ5dGVzLmxlbigpfSk7IjsKLSAgICAgIHMgPDwgIn0iOwotICAgIH0gZWxzZSBpZiAoc2l6ZV9maWVsZF8tPkdldEZpZWxkVHlwZSgpID09IENvdW50RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIHMgPDwgImxldCB3YW50XyA9ICIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIiArICgoIiA8PCBzaXplX2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICIgYXMgdXNpemUpICogIgotICAgICAgICA8PCBlbGVtZW50X3NpemUgPDwgIik7IjsKLSAgICAgIHMgPDwgImlmIGJ5dGVzLmxlbigpIDwgd2FudF8geyI7Ci0gICAgICBzIDw8ICIgcmV0dXJuIEVycihFcnJvcjo6SW52YWxpZExlbmd0aEVycm9yeyI7Ci0gICAgICBzIDw8ICIgICAgb2JqOiBcIiIgPDwgY29udGV4dCA8PCAiXCIudG9fc3RyaW5nKCksIjsKLSAgICAgIHMgPDwgIiAgICBmaWVsZDogXCIiIDw8IEdldE5hbWUoKSA8PCAiXCIudG9fc3RyaW5nKCksIjsKLSAgICAgIHMgPDwgIiAgICB3YW50ZWQ6IHdhbnRfLCI7Ci0gICAgICBzIDw8ICIgICAgZ290OiBieXRlcy5sZW4oKX0pOyI7Ci0gICAgICBzIDw8ICJ9IjsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCAibGV0IHdhbnRfID0gIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiICsgKCIgPDwgc2l6ZV9maWVsZF8tPkdldE5hbWUoKSA8PCAiIGFzIHVzaXplKSI7Ci0gICAgICBpZiAoR2V0U2l6ZU1vZGlmaWVyKCkgIT0gIiIpIHsKLSAgICAgICAgcyA8PCAiIC0gKCgiIDw8IEdldFNpemVNb2RpZmllcigpLnN1YnN0cigxKSA8PCAiKSAvIDgpIjsKLSAgICAgIH0KLSAgICAgIHMgPDwgIjsiOwotICAgICAgcyA8PCAiaWYgYnl0ZXMubGVuKCkgPCB3YW50XyB7IjsKLSAgICAgIHMgPDwgIiByZXR1cm4gRXJyKEVycm9yOjpJbnZhbGlkTGVuZ3RoRXJyb3J7IjsKLSAgICAgIHMgPDwgIiAgICBvYmo6IFwiIiA8PCBjb250ZXh0IDw8ICJcIi50b19zdHJpbmcoKSwiOwotICAgICAgcyA8PCAiICAgIGZpZWxkOiBcIiIgPDwgR2V0TmFtZSgpIDw8ICJcIi50b19zdHJpbmcoKSwiOwotICAgICAgcyA8PCAiICAgIHdhbnRlZDogd2FudF8sIjsKLSAgICAgIHMgPDwgIiAgICBnb3Q6IGJ5dGVzLmxlbigpfSk7IjsKLSAgICAgIHMgPDwgIn0iOwotICAgICAgaWYgKEdldFNpemVNb2RpZmllcigpICE9ICIiKSB7Ci0gICAgICAgIHMgPDwgImlmICgoIiA8PCBzaXplX2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICIgYXMgdXNpemUpIDwgKCgiIDw8IEdldFNpemVNb2RpZmllcigpLnN1YnN0cigxKSA8PCAiKSAvIDgpKSB7IjsKLSAgICAgICAgcyA8PCAiIHJldHVybiBFcnIoRXJyb3I6OkltcG9zc2libGVTdHJ1Y3RFcnJvcik7IjsKLSAgICAgICAgcyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVmVjdG9yRmllbGQ6OkdlblJ1c3RHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSkgY29uc3QgewotICBhdXRvIGVsZW1lbnRfZmllbGRfdHlwZSA9IEdldEVsZW1lbnRGaWVsZCgpLT5HZXRGaWVsZFR5cGUoKTsKLSAgYXV0byBlbGVtZW50X2ZpZWxkID0gR2V0RWxlbWVudEZpZWxkKCk7Ci0gIGF1dG8gZWxlbWVudF9zaXplID0gZWxlbWVudF9maWVsZC0+R2V0U2l6ZSgpLmJ5dGVzKCk7Ci0KLSAgaWYgKGVsZW1lbnRfZmllbGRfdHlwZSA9PSBTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgIHMgPDwgImxldCAiIDw8IEdldE5hbWUoKSA8PCAiOiAiIDw8IEdldFJ1c3REYXRhVHlwZSgpIDw8ICIgPSAiOwotICAgIGlmIChzaXplX2ZpZWxkXyA9PSBudWxscHRyKSB7Ci0gICAgICBzIDw8ICJieXRlc1siIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpIDw8ICIuLl0iOwotICAgIH0gZWxzZSBpZiAoc2l6ZV9maWVsZF8tPkdldEZpZWxkVHlwZSgpID09IENvdW50RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIHMgPDwgImJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiICsgKCgiOwotICAgICAgcyA8PCBzaXplX2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICIgYXMgdXNpemUpICogIiA8PCBlbGVtZW50X3NpemUgPDwgIildIjsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCAiYnl0ZXNbIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiLi4oIjsKLSAgICAgIHMgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIiArICIgPDwgc2l6ZV9maWVsZF8tPkdldE5hbWUoKTsKLSAgICAgIHMgPDwgIiBhcyB1c2l6ZSkiOwotICAgICAgaWYgKEdldFNpemVNb2RpZmllcigpICE9ICIiKSB7Ci0gICAgICAgIHMgPDwgIiAtICgoIiA8PCBHZXRTaXplTW9kaWZpZXIoKS5zdWJzdHIoMSkgPDwgIikgLyA4KSI7Ci0gICAgICB9Ci0gICAgICBzIDw8ICJdIjsKLSAgICB9Ci0KLSAgICBzIDw8ICIudG9fdmVjKCkuY2h1bmtzX2V4YWN0KCIgPDwgZWxlbWVudF9zaXplIDw8ICIpLmludG9faXRlcigpLm1hcCh8aXwgIjsKLSAgICBzIDw8IGVsZW1lbnRfZmllbGQtPkdldFJ1c3REYXRhVHlwZSgpIDw8ICI6OmZyb21fbGVfYnl0ZXMoWyI7Ci0KLSAgICBmb3IgKGludCBqPTA7IGogPCBlbGVtZW50X3NpemU7IGorKykgewotICAgICAgcyA8PCAiaVsiIDw8IGogPDwgIl0iOwotICAgICAgaWYgKGogIT0gZWxlbWVudF9zaXplIC0gMSkgewotICAgICAgICBzIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgfQotICAgIHMgPDwgIl0pKS5jb2xsZWN0KCk7IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8ICJsZXQgbXV0ICIgPDwgR2V0TmFtZSgpIDw8ICI6ICIgPDwgR2V0UnVzdERhdGFUeXBlKCkgPDwgIiA9IFZlYzo6bmV3KCk7IjsKLSAgICBpZiAoc2l6ZV9maWVsZF8gPT0gbnVsbHB0cikgewotICAgICAgcyA8PCAibGV0IG11dCBwYXJzYWJsZV8gPSAmYnl0ZXNbIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiLi5dOyI7Ci0gICAgICBzIDw8ICJ3aGlsZSBwYXJzYWJsZV8ubGVuKCkgPiAwIHsiOwotICAgIH0gZWxzZSBpZiAoc2l6ZV9maWVsZF8tPkdldEZpZWxkVHlwZSgpID09IENvdW50RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIHMgPDwgImxldCBtdXQgcGFyc2FibGVfID0gJmJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uXTsiOwotICAgICAgcyA8PCAibGV0IGNvdW50XyA9ICIgPDwgc2l6ZV9maWVsZF8tPkdldE5hbWUoKSA8PCAiIGFzIHVzaXplOyI7Ci0gICAgICBzIDw8ICJmb3IgXyBpbiAwLi5jb3VudF8geyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgImxldCBtdXQgcGFyc2FibGVfID0gJmJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiICsgKCIKLSAgICAgICAgPDwgc2l6ZV9maWVsZF8tPkdldE5hbWUoKSA8PCAiIGFzIHVzaXplKSI7Ci0gICAgICBpZiAoR2V0U2l6ZU1vZGlmaWVyKCkgIT0gIiIpIHsKLSAgICAgICAgcyA8PCAiIC0gKCgiIDw8IEdldFNpemVNb2RpZmllcigpLnN1YnN0cigxKSA8PCAiKSAvIDgpIjsKLSAgICAgIH0KLSAgICAgIHMgPDwgIl07IjsKLSAgICAgIHMgPDwgIndoaWxlIHBhcnNhYmxlXy5sZW4oKSA+IDAgeyI7Ci0gICAgfQotICAgIHMgPDwgIiBtYXRjaCAiIDw8IGVsZW1lbnRfZmllbGQtPkdldFJ1c3REYXRhVHlwZSgpIDw8ICI6OnBhcnNlKCZwYXJzYWJsZV8pIHsiOwotICAgIHMgPDwgIiAgT2socGFyc2VkKSA9PiB7IjsKLSAgICBzIDw8ICIgICBwYXJzYWJsZV8gPSAmcGFyc2FibGVfW3BhcnNlZC5nZXRfdG90YWxfc2l6ZSgpLi5dOyI7Ci0gICAgcyA8PCBHZXROYW1lKCkgPDwgIi5wdXNoKHBhcnNlZCk7IjsKLSAgICBzIDw8ICIgIH0sIjsKLSAgICBzIDw8ICIgIEVycihFcnJvcjo6SW1wb3NzaWJsZVN0cnVjdEVycm9yKSA9PiBicmVhaywiOwotICAgIHMgPDwgIiAgRXJyKGUpID0+IHJldHVybiBFcnIoZSksIjsKLSAgICBzIDw8ICIgfSI7Ci0gICAgcyA8PCAifSI7Ci0gIH0KLX0KLQotdm9pZCBWZWN0b3JGaWVsZDo6R2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplKSBjb25zdCB7Ci0gIGlmIChHZXRFbGVtZW50RmllbGQoKS0+R2V0RmllbGRUeXBlKCkgPT0gU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICBzIDw8ICJmb3IgKGksIGUpIGluIHNlbGYuIiA8PCBHZXROYW1lKCkgPDwgIi5pdGVyKCkuZW51bWVyYXRlKCkgeyI7Ci0gICAgcyA8PCAiYnVmZmVyWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIitpLi4iOwotICAgIHMgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCkgPDwgIitpKyIgPDwgR2V0RWxlbWVudEZpZWxkKCktPkdldFNpemUoKS5ieXRlcygpIDw8ICJdIjsKLSAgICBzIDw8ICIuY29weV9mcm9tX3NsaWNlKCZlLnRvX2xlX2J5dGVzKCkpIjsKLSAgICBzIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8ICJsZXQgbXV0IHZlY19idWZmZXJfID0gJm11dCBidWZmZXJbIiA8PCBzdGFydF9vZmZzZXQuYnl0ZXMoKSA8PCAiLi5dOyI7Ci0gICAgcyA8PCAiZm9yIGVfIGluICZzZWxmLiIgPDwgR2V0TmFtZSgpIDw8ICIgeyI7Ci0gICAgcyA8PCAiIGVfLndyaXRlX3RvKCZtdXQgdmVjX2J1ZmZlcl9bMC4uZV8uZ2V0X3RvdGFsX3NpemUoKV0pOyI7Ci0gICAgcyA8PCAiIHZlY19idWZmZXJfID0gJm11dCB2ZWNfYnVmZmVyX1tlXy5nZXRfdG90YWxfc2l6ZSgpLi5dOyI7Ci0gICAgcyA8PCAifSI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZmllbGRzL3ZlY3Rvcl9maWVsZC5oIGIvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvdmVjdG9yX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjUzMzAuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9maWVsZHMvdmVjdG9yX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLSNpbmNsdWRlICJmaWVsZHMvc2l6ZV9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAidHlwZV9kZWYuaCIKLQotY2xhc3MgVmVjdG9yRmllbGQgOiBwdWJsaWMgUGFja2V0RmllbGQgewotIHB1YmxpYzoKLSAgVmVjdG9yRmllbGQoc3RkOjpzdHJpbmcgbmFtZSwgaW50IGVsZW1lbnRfc2l6ZSwgc3RkOjpzdHJpbmcgc2l6ZV9tb2RpZmllciwgUGFyc2VMb2NhdGlvbiBsb2MpOwotCi0gIFZlY3RvckZpZWxkKHN0ZDo6c3RyaW5nIG5hbWUsIFR5cGVEZWYqIHR5cGVfZGVmLCBzdGQ6OnN0cmluZyBzaXplX21vZGlmaWVyLCBQYXJzZUxvY2F0aW9uIGxvYyk7Ci0KLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWVsZFR5cGU7Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0RmllbGRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBTaXplIEdldFNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0QnVpbGRlclNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIFNpemUgR2V0U3RydWN0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGF0YVR5cGUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuRXh0cmFjdG9yKHN0ZDo6b3N0cmVhbSYgcywgaW50IG51bV9sZWFkaW5nX2JpdHMsIGJvb2wgZm9yX3N0cnVjdCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgU2l6ZSBzdGFydF9vZmZzZXQsIFNpemUgZW5kX29mZnNldCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBCdWlsZGVyUGFyYW1ldGVyTXVzdEJlTW92ZWQoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGJvb2wgR2VuQnVpbGRlck1lbWJlcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBIYXNQYXJhbWV0ZXJWYWxpZGF0b3IoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuUGFyYW1ldGVyVmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbkluc2VydGVyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFNldFNpemVGaWVsZChjb25zdCBTaXplRmllbGQqIHNpemVfZmllbGQpOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRTaXplTW9kaWZpZXIoKSBjb25zdDsKLQotICB2aXJ0dWFsIGJvb2wgSXNDb250YWluZXJGaWVsZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgY29uc3QgUGFja2V0RmllbGQqIEdldEVsZW1lbnRGaWVsZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5TdHJpbmdSZXByZXNlbnRhdGlvbihzdGQ6Om9zdHJlYW0mIHMsIHN0ZDo6c3RyaW5nIGFjY2Vzc29yKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJ1c3REYXRhVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdEdldHRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlcihzdGQ6Om9zdHJlYW0mIHMsIFNpemUgc3RhcnRfb2Zmc2V0LCBTaXplIGVuZF9vZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2VuQm91bmRzQ2hlY2soc3RkOjpvc3RyZWFtJiBzLCBTaXplIHN0YXJ0X29mZnNldCwgU2l6ZSBlbmRfb2Zmc2V0LCBzdGQ6OnN0cmluZyBjb250ZXh0KSBjb25zdCBvdmVycmlkZTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsKLQotICBjb25zdCBQYWNrZXRGaWVsZCogZWxlbWVudF9maWVsZF97bnVsbHB0cn07Ci0KLSAgY29uc3QgU2l6ZSBlbGVtZW50X3NpemVfe307Ci0KLSAgLy8gU2l6ZSBpcyBhbHdheXMgaW4gYnl0ZXMsIHVubGVzcyBpdCBpcyBhIGNvdW50LgotICBjb25zdCBTaXplRmllbGQqIHNpemVfZmllbGRfe251bGxwdHJ9OwotCi0gIC8vIFNpemUgbW9kaWZpZXIgaXMgb25seSB1c2VkIHdoZW4gc2l6ZV9maWVsZF8gaXMgb2YgdHlwZSBTSVpFIGFuZCBpcyBub3QgdXNlZCB3aXRoIENPVU5ULgotICBzdGQ6OnN0cmluZyBzaXplX21vZGlmaWVyX3siIn07Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9mbGV4LmduaSBiL2dkL3BhY2tldC9wYXJzZXIvZmxleC5nbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2JhMjMuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9mbGV4LmduaQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIEZsZXggKGZhc3QgbGV4aWNhbCBhbmFseXplciBnZW5lcmF0b3IpIGlzIHVzZWQgZm9yIHBhcnNpbmcgbGFuZ3VhZ2VzLiBJdCBpcwotIyBjb21tb25seSB1c2VkIHdpdGggYSBwYXJzZXIgZ2VuZXJhdG9yIChsaWtlIEJpc29uKS4KLQotIyBHZW5lcmF0ZSBzb3VyY2UgZmlsZXMgdXNpbmcgRmxleC4KLSMKLSMgTm90ZTogV2UgZ2VuZXJhdGUgLmNjIGZpbGVzIGZvciBGbGV4LiBIb3dldmVyLCB5b3UgbXVzdCBzZXQgJW9wdGlvbiBjKysgaWYgeW91Ci0jIHdhbnQgdG8gZ2VuZXJhdGUgYSBDKysgc2Nhbm5lciBjbGFzcy4gV2UgZG9uJ3QgdXNlIC0tYysrIGluIGNhc2UgeW91IGhhdmUKLSMgJW9wdGlvbiByZWVudHJhbnQgc2V0LCB3aGljaCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCAlb3B0aW9uIGMrKy4KLSMKLSMgUGFyYW1ldGVyczoKLSMgICBzb3VyY2VzOiBGaWxlcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBsZXhlcnMuCi10ZW1wbGF0ZSgiZmxleF9zb3VyY2UiKSB7Ci0gIGFjdGlvbl9uYW1lID0gIiR7dGFyZ2V0X25hbWV9X2dlbiIKLSAgYWN0aW9uX2ZvcmVhY2goYWN0aW9uX25hbWUpIHsKLSAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgInNvdXJjZXMiIF0pCi0gICAgYXNzZXJ0KGRlZmluZWQoc291cmNlcyksICJzb3VyY2VzIG11c3QgYmUgc2V0IikKLSAgICBmb3JlYWNoKHMsIHNvdXJjZXMpIHsKLSAgICAgIGFzc2VydChnZXRfcGF0aF9pbmZvKHMsICJleHRlbnNpb24iKSA9PSAibGwiLAotICAgICAgICAgICAgICJFeHBlY3RpbmcgRmxleCBleHRlbnNpb24gbGw6ICR7c30iKQotICAgIH0KLQotICAgIHNjcmlwdCA9ICIvL2NvbW1vbi1tay9maWxlX2dlbmVyYXRvcl93cmFwcGVyLnB5IgotICAgIG91dGZvcm1hdCA9ICIke3RhcmdldF9nZW5fZGlyfS97e3NvdXJjZV9uYW1lX3BhcnR9fS5jYyIKLSAgICBhcmdzID0gWwotICAgICAgImZsZXgiLAotICAgICAgIi1vIiwKLSAgICAgIG91dGZvcm1hdCwKLSAgICAgICJ7e3NvdXJjZX19IiwKLSAgICBdCi0gICAgb3V0cHV0cyA9IFsgb3V0Zm9ybWF0IF0KLSAgfQotCi0gIGFsbF9kZXBlbmRlbnRfY29uZmlnX25hbWUgPSAiXyR7dGFyZ2V0X25hbWV9X2FsbF9kZXBlbmRlbnRfY29uZmlnIgotICBjb25maWcoYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSkgewotICAgIGluY2x1ZGVfZGlycyA9IFsgIiR7dGFyZ2V0X2dlbl9kaXJ9IiBdCi0gIH0KLQotICBzb3VyY2Vfc2V0KHRhcmdldF9uYW1lKSB7Ci0gICAgc291cmNlcyA9IGdldF90YXJnZXRfb3V0cHV0cygiOiR7YWN0aW9uX25hbWV9IikKLSAgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbICI6JHthbGxfZGVwZW5kZW50X2NvbmZpZ19uYW1lfSIgXQotICAgIGRlcHMgPSBbICI6JHthY3Rpb25fbmFtZX0iIF0KLQotICAgIGlmIChkZWZpbmVkKGludm9rZXIuY29uZmlncykpIHsKLSAgICAgIGNvbmZpZ3MgKz0gaW52b2tlci5jb25maWdzCi0gICAgfQotCi0gICAgIyBTaWxlbmNlIHNvbWUgd2FybmluZ3MuIFRoZSBhdXRvZ2VuZXJhdGVkIGNvZGUgaW5jbHVkZXMgcGFydHMgdGhhdCBoYXZlCi0gICAgIyBmYWxsdGhyb3VnaHMgYW5kIHVucmVhY2hhYmxlIGNvZGUuIFRoaXMgbWF5IHNpbGVuY2UgbGVnaXRpbWF0ZSBpc3N1ZXMgaW4KLSAgICAjIHVzZXIgd3JpdHRlbiBjb2RlIGluIHRoZSBsZXhlciBhcyB3ZWxsLiBVc2VyIGJld2FyZSEKLSAgICBjZmxhZ3NfY2MgPSBbCi0gICAgICAiLVduby1pbXBsaWNpdC1mYWxsdGhyb3VnaCIsCi0gICAgICAiLVduby11bnJlYWNoYWJsZS1jb2RlIiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZ2VuX2NwcC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvZ2VuX2NwcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkMmU0MS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2dlbl9jcHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8ZmlsZXN5c3RlbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHJlZ2V4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZGVjbGFyYXRpb25zLmgiCi0jaW5jbHVkZSAic3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuaCIKLQotdm9pZCBwYXJzZV9uYW1lc3BhY2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RfbmFtZXNwYWNlLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgaW5wdXRfZmlsZV9yZWxhdGl2ZV9wYXRoLAotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogdG9rZW4pIHsKLSAgc3RkOjpmaWxlc3lzdGVtOjpwYXRoIGdlbl9uYW1lc3BhY2UgPSByb290X25hbWVzcGFjZSAvIGlucHV0X2ZpbGVfcmVsYXRpdmVfcGF0aDsKLSAgZm9yIChhdXRvIGl0ID0gZ2VuX25hbWVzcGFjZS5iZWdpbigpOyBpdCAhPSBnZW5fbmFtZXNwYWNlLmVuZCgpOyArK2l0KSB7Ci0gICAgdG9rZW4tPnB1c2hfYmFjayhpdC0+c3RyaW5nKCkpOwotICB9Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfbmFtZXNwYWNlX29wZW4oY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0b2tlbiwgc3RkOjpvc3RyZWFtJiBvdXRwdXQpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBucyA6IHRva2VuKSB7Ci0gICAgb3V0cHV0IDw8ICJuYW1lc3BhY2UgIiA8PCBucyA8PCAiIHsiIDw8IHN0ZDo6ZW5kbDsKLSAgfQotfQotCi12b2lkIGdlbmVyYXRlX25hbWVzcGFjZV9jbG9zZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRva2VuLCBzdGQ6Om9zdHJlYW0mIG91dHB1dCkgewotICBmb3IgKGF1dG8gaXQgPSB0b2tlbi5yYmVnaW4oKTsgaXQgIT0gdG9rZW4ucmVuZCgpOyArK2l0KSB7Ci0gICAgb3V0cHV0IDw8ICJ9ICAvL25hbWVzcGFjZSAiIDw8ICppdCA8PCBzdGQ6OmVuZGw7Ci0gIH0KLX0KLQotYm9vbCBnZW5lcmF0ZV9jcHBfaGVhZGVyc19vbmVfZmlsZSgKLSAgICBjb25zdCBEZWNsYXJhdGlvbnMmIGRlY2xzLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgaW5wdXRfZmlsZSwKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGluY2x1ZGVfZGlyLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgb3V0X2RpciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9uYW1lc3BhY2UpIHsKLSAgYXV0byBnZW5fcmVsYXRpdmVfcGF0aCA9IGlucHV0X2ZpbGUubGV4aWNhbGx5X3JlbGF0aXZlKGluY2x1ZGVfZGlyKS5wYXJlbnRfcGF0aCgpOwotCi0gIGF1dG8gaW5wdXRfZmlsZW5hbWUgPSBpbnB1dF9maWxlLmZpbGVuYW1lKCkuc3RyaW5nKCkuc3Vic3RyKDAsIGlucHV0X2ZpbGUuZmlsZW5hbWUoKS5zdHJpbmcoKS5maW5kKCIucGRsIikpOwotICBhdXRvIGdlbl9wYXRoID0gb3V0X2RpciAvIGdlbl9yZWxhdGl2ZV9wYXRoOwotCi0gIHN0ZDo6ZmlsZXN5c3RlbTo6Y3JlYXRlX2RpcmVjdG9yaWVzKGdlbl9wYXRoKTsKLQotICBhdXRvIGdlbl9maWxlID0gZ2VuX3BhdGggLyAoaW5wdXRfZmlsZW5hbWUgKyAiLmgiKTsKLQotICBzdGQ6OmNvdXQgPDwgImdlbmVyYXRpbmcgIiA8PCBnZW5fZmlsZSA8PCBzdGQ6OmVuZGw7Ci0KLSAgc3RkOjpvZnN0cmVhbSBvdXRfZmlsZTsKLSAgb3V0X2ZpbGUub3BlbihnZW5fZmlsZSk7Ci0gIGlmICghb3V0X2ZpbGUuaXNfb3BlbigpKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJjYW4ndCBvcGVuICIgPDwgZ2VuX2ZpbGUgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG91dF9maWxlIDw8Ci0gICAgICBSIigKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2N1c3RvbV9maWVsZF9maXhlZF9zaXplX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInBhY2tldC9pdGVyYXRvci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfYnVpbGRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfc3RydWN0LmgiCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF92aWV3LmgiCi0KLSNpZiBkZWZpbmVkKFBBQ0tFVF9GVVpaX1RFU1RJTkcpIHx8IGRlZmluZWQoUEFDS0VUX1RFU1RJTkcpIHx8IGRlZmluZWQoRlVaWl9UQVJHRVQpCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJwYWNrZXQvcGFyc2VyL2NoZWNrc3VtX3R5cGVfY2hlY2tlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYXJzZXIvY3VzdG9tX3R5cGVfY2hlY2tlci5oIgotCi0pIjsKLQotICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBkZWNscy50eXBlX2RlZnNfcXVldWVfKSB7Ci0gICAgaWYgKGMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OkNVU1RPTSB8fAotICAgICAgICBjLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpDSEVDS1NVTSkgewotICAgICAgKChDdXN0b21GaWVsZERlZiopYy5zZWNvbmQpLT5HZW5JbmNsdWRlKG91dF9maWxlKTsKLSAgICB9Ci0gIH0KLSAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lc3BhY2VfbGlzdDsKLSAgcGFyc2VfbmFtZXNwYWNlKHJvb3RfbmFtZXNwYWNlLCBnZW5fcmVsYXRpdmVfcGF0aCwgJm5hbWVzcGFjZV9saXN0KTsKLSAgZ2VuZXJhdGVfbmFtZXNwYWNlX29wZW4obmFtZXNwYWNlX2xpc3QsIG91dF9maWxlKTsKLSAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotCi0gIGZvciAoY29uc3QgYXV0byYgYyA6IGRlY2xzLnR5cGVfZGVmc19xdWV1ZV8pIHsKLSAgICBpZiAoYy5zZWNvbmQtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6Q1VTVE9NIHx8Ci0gICAgICAgIGMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OkNIRUNLU1VNKSB7Ci0gICAgICAoKEN1c3RvbUZpZWxkRGVmKiljLnNlY29uZCktPkdlblVzaW5nKG91dF9maWxlKTsKLSAgICB9Ci0gIH0KLSAgb3V0X2ZpbGUgPDwKLSAgICAgIFIiKAotCi11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6Q3VzdG9tRmllbGRGaXhlZFNpemVJbnRlcmZhY2U7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpDdXN0b21UeXBlQ2hlY2tlcjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6Okl0ZXJhdG9yOwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6a0xpdHRsZUVuZGlhbjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldEJ1aWxkZXI7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRTdHJ1Y3Q7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRWaWV3OwotCi0jaWYgZGVmaW5lZChQQUNLRVRfRlVaWl9URVNUSU5HKSB8fCBkZWZpbmVkKFBBQ0tFVF9URVNUSU5HKSB8fCBkZWZpbmVkKEZVWlpfVEFSR0VUKQotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcjsKLSNlbmRpZgotCi11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpwYXJzZXI6OkNoZWNrc3VtVHlwZUNoZWNrZXI7Ci0KLSkiOwotCi0gIGZvciAoY29uc3QgYXV0byYgZSA6IGRlY2xzLnR5cGVfZGVmc19xdWV1ZV8pIHsKLSAgICBpZiAoZS5zZWNvbmQtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6RU5VTSkgewotICAgICAgY29uc3QgYXV0byogZW51bV9kZWYgPSBzdGF0aWNfY2FzdDxjb25zdCBFbnVtRGVmKj4oZS5zZWNvbmQpOwotICAgICAgRW51bUdlbiBnZW4oKmVudW1fZGVmKTsKLSAgICAgIGdlbi5HZW5EZWZpbml0aW9uKG91dF9maWxlKTsKLSAgICAgIG91dF9maWxlIDw8ICJcblxuIjsKLSAgICB9Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiBlIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgIGlmIChlLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpFTlVNKSB7Ci0gICAgICBjb25zdCBhdXRvKiBlbnVtX2RlZiA9IHN0YXRpY19jYXN0PGNvbnN0IEVudW1EZWYqPihlLnNlY29uZCk7Ci0gICAgICBFbnVtR2VuIGdlbigqZW51bV9kZWYpOwotICAgICAgZ2VuLkdlbkxvZ2dpbmcob3V0X2ZpbGUpOwotICAgICAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotICAgIH0KLSAgfQotICBmb3IgKGNvbnN0IGF1dG8mIGNoIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgIGlmIChjaC5zZWNvbmQtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6Q0hFQ0tTVU0pIHsKLSAgICAgIGNvbnN0IGF1dG8qIGNoZWNrc3VtX2RlZiA9IHN0YXRpY19jYXN0PGNvbnN0IENoZWNrc3VtRGVmKj4oY2guc2Vjb25kKTsKLSAgICAgIGNoZWNrc3VtX2RlZi0+R2VuQ2hlY2tzdW1DaGVjayhvdXRfZmlsZSk7Ci0gICAgfQotICB9Ci0gIG91dF9maWxlIDw8ICJcbi8qIERvbmUgQ2hlY2tzdW1DaGVja3MgKi9cbiI7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBjIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgIGlmIChjLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpDVVNUT00pIHsKLSAgICAgIGlmIChjLnNlY29uZC0+c2l6ZV8gPT0gLTEgLyogVmFyaWFibGUgU2l6ZSAqLykgewotICAgICAgICBjb25zdCBhdXRvKiBjdXN0b21fZmllbGRfZGVmID0gc3RhdGljX2Nhc3Q8Y29uc3QgQ3VzdG9tRmllbGREZWYqPihjLnNlY29uZCk7Ci0gICAgICAgIGN1c3RvbV9maWVsZF9kZWYtPkdlbkN1c3RvbUZpZWxkQ2hlY2sob3V0X2ZpbGUsIGRlY2xzLmlzX2xpdHRsZV9lbmRpYW4pOwotICAgICAgfSBlbHNlIHsgIC8vIGZpeGVkIHNpemUKLSAgICAgICAgY29uc3QgYXV0byogY3VzdG9tX2ZpZWxkX2RlZiA9IHN0YXRpY19jYXN0PGNvbnN0IEN1c3RvbUZpZWxkRGVmKj4oYy5zZWNvbmQpOwotICAgICAgICBjdXN0b21fZmllbGRfZGVmLT5HZW5GaXhlZFNpemVDdXN0b21GaWVsZENoZWNrKG91dF9maWxlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgb3V0X2ZpbGUgPDwgIlxuIjsKLQotICBmb3IgKGF1dG8mIHMgOiBkZWNscy50eXBlX2RlZnNfcXVldWVfKSB7Ci0gICAgaWYgKHMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OlNUUlVDVCkgewotICAgICAgY29uc3QgYXV0byogc3RydWN0X2RlZiA9IHN0YXRpY19jYXN0PGNvbnN0IFN0cnVjdERlZio+KHMuc2Vjb25kKTsKLSAgICAgIHN0cnVjdF9kZWYtPkdlbkRlZmluaXRpb24ob3V0X2ZpbGUpOwotICAgICAgb3V0X2ZpbGUgPDwgIlxuIjsKLSAgICB9Ci0gIH0KLQotICB7Ci0gICAgU3RydWN0UGFyc2VyR2VuZXJhdG9yIHNwZyhkZWNscyk7Ci0gICAgc3BnLkdlbmVyYXRlKG91dF9maWxlKTsKLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0gIH0KLQotICBmb3IgKGNvbnN0IGF1dG8mIHBhY2tldF9kZWYgOiBkZWNscy5wYWNrZXRfZGVmc19xdWV1ZV8pIHsKLSAgICBwYWNrZXRfZGVmLnNlY29uZC0+R2VuUGFyc2VyRGVmaW5pdGlvbihvdXRfZmlsZSk7Ci0gICAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwYWNrZXRfZGVmIDogZGVjbHMucGFja2V0X2RlZnNfcXVldWVfKSB7Ci0gICAgcGFja2V0X2RlZi5zZWNvbmQtPkdlbkJ1aWxkZXJEZWZpbml0aW9uKG91dF9maWxlKTsKLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0gIH0KLQotICBpZiAoaW5wdXRfZmlsZW5hbWUgPT0gImhjaV9wYWNrZXRzIikgewotICAgIG91dF9maWxlIDw8ICJjbGFzcyBDaGVja2VyIHsgcHVibGljOiBzdGF0aWMgYm9vbCBJc0NvbW1hbmRTdGF0dXNPcGNvZGUoT3BDb2RlIG9wX2NvZGUpIHsiOwotICAgIG91dF9maWxlIDw8ICJzd2l0Y2ggKG9wX2NvZGUpIHsiOwotICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBvcF9jb2RlczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBhY2tldF9kZWYgOiBkZWNscy5wYWNrZXRfZGVmc19xdWV1ZV8pIHsKLSAgICAgIGF1dG8gcGFja2V0ID0gcGFja2V0X2RlZi5zZWNvbmQ7Ci0gICAgICBhdXRvIG9wX2NvbnN0cmFpbnQgPSBwYWNrZXQtPnBhcmVudF9jb25zdHJhaW50c18uZmluZCgib3BfY29kZSIpOwotICAgICAgaWYgKG9wX2NvbnN0cmFpbnQgPT0gcGFja2V0LT5wYXJlbnRfY29uc3RyYWludHNfLmVuZCgpKSB7Ci0gICAgICAgIGF1dG8gY29uc3RyYWludCA9IHBhY2tldC0+cGFyZW50X2NvbnN0cmFpbnRzXy5maW5kKCJjb21tYW5kX29wX2NvZGUiKTsKLSAgICAgICAgaWYgKGNvbnN0cmFpbnQgPT0gcGFja2V0LT5wYXJlbnRfY29uc3RyYWludHNfLmVuZCgpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhY2tldC0+SGFzQW5jZXN0b3JOYW1lZCgiQ29tbWFuZFN0YXR1cyIpKSB7Ci0gICAgICAgICAgb3V0X2ZpbGUgPDwgImNhc2UgIiA8PCBzdGQ6OmdldDxzdGQ6OnN0cmluZz4oY29uc3RyYWludC0+c2Vjb25kKSA8PCAiOiI7Ci0gICAgICAgICAgb3BfY29kZXMuZXJhc2Uoc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KGNvbnN0cmFpbnQtPnNlY29uZCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWNrZXQtPkhhc0FuY2VzdG9yTmFtZWQoIkNvbW1hbmRDb21wbGV0ZSIpKSB7Ci0gICAgICAgICAgb3BfY29kZXMuZXJhc2Uoc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KGNvbnN0cmFpbnQtPnNlY29uZCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvcF9jb2Rlcy5pbnNlcnQoc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KG9wX2NvbnN0cmFpbnQtPnNlY29uZCkpOwotICAgICAgfQotICAgIH0KLSAgICBib29sIHVuaGFuZGxlZF9vcGNvZGUgPSBmYWxzZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG9wY29kZSA6IG9wX2NvZGVzKSB7Ci0gICAgICB1bmhhbmRsZWRfb3Bjb2RlID0gdHJ1ZTsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiT3Bjb2RlIHdpdGggbm8gU3RhdHVzIG9yIENvbXBsZXRlICIgPDwgb3Bjb2RlIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gICAgaWYgKHVuaGFuZGxlZF9vcGNvZGUpIHsKLSAgICAgIEVSUk9SKCkgPDwgIkF0IGxlYXN0IG9uZSB1bmhhbmRsZWQgb3Bjb2RlIjsKLSAgICB9Ci0gICAgb3V0X2ZpbGUgPDwgInJldHVybiB0cnVlOyBkZWZhdWx0OiByZXR1cm4gZmFsc2U7IH19fTsiOwotICB9Ci0KLSAgZ2VuZXJhdGVfbmFtZXNwYWNlX2Nsb3NlKG5hbWVzcGFjZV9saXN0LCBvdXRfZmlsZSk7Ci0KLSAgb3V0X2ZpbGUuY2xvc2UoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gR2V0IHRoZSBvdXRfZmlsZSBzaGFyZCBhdCBhIHN5bWJvbF9jb3VudAotc3RkOjpvZnN0cmVhbSYgZ2V0X291dF9maWxlKHNpemVfdCBzeW1ib2xfY291bnQsIHNpemVfdCBzeW1ib2xfdG90YWwsIHN0ZDo6dmVjdG9yPHN0ZDo6b2ZzdHJlYW0+KiBvdXRfZmlsZXMpIHsKLSAgYXV0byBzeW1ib2xzX3Blcl9zaGFyZCA9IHN5bWJvbF90b3RhbCAvIG91dF9maWxlcy0+c2l6ZSgpOwotICBhdXRvIGZpbGVfaW5kZXggPSBzdGQ6Om1pbihzeW1ib2xfY291bnQgLyBzeW1ib2xzX3Blcl9zaGFyZCwgb3V0X2ZpbGVzLT5zaXplKCkgLSAxKTsKLSAgcmV0dXJuIG91dF9maWxlcy0+YXQoZmlsZV9pbmRleCk7Ci19Ci0KLWJvb2wgZ2VuZXJhdGVfcHliaW5kMTFfc291cmNlc19vbmVfZmlsZSgKLSAgICBjb25zdCBEZWNsYXJhdGlvbnMmIGRlY2xzLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgaW5wdXRfZmlsZSwKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGluY2x1ZGVfZGlyLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgb3V0X2RpciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9uYW1lc3BhY2UsCi0gICAgc2l6ZV90IG51bV9zaGFyZHMpIHsKLSAgYXV0byBnZW5fcmVsYXRpdmVfcGF0aCA9IGlucHV0X2ZpbGUubGV4aWNhbGx5X3JlbGF0aXZlKGluY2x1ZGVfZGlyKS5wYXJlbnRfcGF0aCgpOwotCi0gIGF1dG8gaW5wdXRfZmlsZW5hbWUgPSBpbnB1dF9maWxlLmZpbGVuYW1lKCkuc3RyaW5nKCkuc3Vic3RyKDAsIGlucHV0X2ZpbGUuZmlsZW5hbWUoKS5zdHJpbmcoKS5maW5kKCIucGRsIikpOwotICBhdXRvIGdlbl9wYXRoID0gb3V0X2RpciAvIGdlbl9yZWxhdGl2ZV9wYXRoOwotCi0gIHN0ZDo6ZmlsZXN5c3RlbTo6Y3JlYXRlX2RpcmVjdG9yaWVzKGdlbl9wYXRoKTsKLQotICBhdXRvIGdlbl9yZWxhdGl2ZV9oZWFkZXIgPSBnZW5fcmVsYXRpdmVfcGF0aCAvIChpbnB1dF9maWxlbmFtZSArICIuaCIpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lc3BhY2VfbGlzdDsKLSAgcGFyc2VfbmFtZXNwYWNlKHJvb3RfbmFtZXNwYWNlLCBnZW5fcmVsYXRpdmVfcGF0aCwgJm5hbWVzcGFjZV9saXN0KTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6Om9mc3RyZWFtPiBvdXRfZmlsZV9zaGFyZHMobnVtX3NoYXJkcyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0X2ZpbGVfc2hhcmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byBmaWxlbmFtZSA9IGdlbl9wYXRoIC8gKGlucHV0X2ZpbGVuYW1lICsgIl9weXRob24zX3NoYXJkXyIgKyBzdGQ6OnRvX3N0cmluZyhpKSArICIuY2MiKTsKLSAgICBzdGQ6OmNvdXQgPDwgImdlbmVyYXRpbmcgIiA8PCBmaWxlbmFtZSA8PCBzdGQ6OmVuZGw7Ci0gICAgYXV0byYgb3V0X2ZpbGUgPSBvdXRfZmlsZV9zaGFyZHNbaV07Ci0gICAgb3V0X2ZpbGUub3BlbihmaWxlbmFtZSk7Ci0gICAgaWYgKCFvdXRfZmlsZS5pc19vcGVuKCkpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiY2FuJ3Qgb3BlbiAiIDw8IGZpbGVuYW1lIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb3V0X2ZpbGUgPDwgIiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPlxuIjsKLSAgICBvdXRfZmlsZSA8PCAiI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPlxuIjsKLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0gICAgb3V0X2ZpbGUgPDwgIiNpbmNsdWRlICIgPDwgZ2VuX3JlbGF0aXZlX2hlYWRlciA8PCAiXG4iOwotICAgIG91dF9maWxlIDw8ICJcblxuIjsKLSAgICBvdXRfZmlsZSA8PCAiI2luY2x1ZGUgXCJwYWNrZXQvcmF3X2J1aWxkZXIuaFwiXG4iOwotICAgIG91dF9maWxlIDw8ICJcblxuIjsKLQotICAgIGZvciAoY29uc3QgYXV0byYgYyA6IGRlY2xzLnR5cGVfZGVmc19xdWV1ZV8pIHsKLSAgICAgIGlmIChjLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpDVVNUT00pIHsKLSAgICAgICAgY29uc3QgYXV0byogY3VzdG9tX2RlZiA9IHN0YXRpY19jYXN0PGNvbnN0IEN1c3RvbUZpZWxkRGVmKj4oYy5zZWNvbmQpOwotICAgICAgICBjdXN0b21fZGVmLT5HZW5QeUJpbmQxMUluY2x1ZGUob3V0X2ZpbGUpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dF9maWxlIDw8ICJcblxuIjsKLQotICAgIGdlbmVyYXRlX25hbWVzcGFjZV9vcGVuKG5hbWVzcGFjZV9saXN0LCBvdXRfZmlsZSk7Ci0gICAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotCi0gICAgZm9yIChjb25zdCBhdXRvJiBjIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgICAgaWYgKGMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OkNVU1RPTSB8fAotICAgICAgICAgIGMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OkNIRUNLU1VNKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8qIGN1c3RvbV9kZWYgPSBzdGF0aWNfY2FzdDxjb25zdCBDdXN0b21GaWVsZERlZio+KGMuc2Vjb25kKTsKLSAgICAgICAgY3VzdG9tX2RlZi0+R2VuVXNpbmcob3V0X2ZpbGUpOwotICAgICAgfQotICAgIH0KLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0KLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI7IjsKLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXI7IjsKLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6Q3VzdG9tVHlwZUNoZWNrZXI7IjsKLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6SXRlcmF0b3I7IjsKLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6a0xpdHRsZUVuZGlhbjsiOwotICAgIG91dF9maWxlIDw8ICJ1c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRCdWlsZGVyOyI7Ci0gICAgb3V0X2ZpbGUgPDwgInVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OkJhc2VTdHJ1Y3Q7IjsKLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6UGFja2V0U3RydWN0OyI7Ci0gICAgb3V0X2ZpbGUgPDwgInVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc7IjsKLSAgICBvdXRfZmlsZSA8PCAidXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcjsiOwotICAgIG91dF9maWxlIDw8ICJ1c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpwYXJzZXI6OkNoZWNrc3VtVHlwZUNoZWNrZXI7IjsKLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0KLSAgICBvdXRfZmlsZSA8PCAibmFtZXNwYWNlIHB5ID0gcHliaW5kMTE7XG5cbiI7Ci0KLSAgICBvdXRfZmlsZSA8PCAidm9pZCBkZWZpbmVfIiA8PCBpbnB1dF9maWxlbmFtZSA8PCAiX3N1Ym1vZHVsZV9zaGFyZF8iIDw8IHN0ZDo6dG9fc3RyaW5nKGkpIDw8ICIocHk6Om1vZHVsZSYgbSkge1xuXG4iOwotICB9Ci0gIHNpemVfdCBzeW1ib2xfdG90YWwgPSAwOwotICAvLyBPbmx5IGNvdW50IHR5cGVzIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQKLSAgZm9yIChjb25zdCBhdXRvJiBlIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgIGlmIChlLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpFTlVNKSB7Ci0gICAgICBzeW1ib2xfdG90YWwrKzsKLSAgICB9IGVsc2UgaWYgKGUuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OlNUUlVDVCkgewotICAgICAgc3ltYm9sX3RvdGFsKys7Ci0gICAgfQotICB9Ci0gIC8vIFZpZXcgYW5kIGJ1aWxkZXIgYXJlIGNvdW50ZWQgc2VwYXJhdGVseQotICBzeW1ib2xfdG90YWwgKz0gZGVjbHMucGFja2V0X2RlZnNfcXVldWVfLnNpemUoKSAqIDI7Ci0gIHNpemVfdCBzeW1ib2xfY291bnQgPSAwOwotCi0gIGZvciAoY29uc3QgYXV0byYgZSA6IGRlY2xzLnR5cGVfZGVmc19xdWV1ZV8pIHsKLSAgICBpZiAoZS5zZWNvbmQtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6RU5VTSkgewotICAgICAgY29uc3QgYXV0byogZW51bV9kZWYgPSBzdGF0aWNfY2FzdDxjb25zdCBFbnVtRGVmKj4oZS5zZWNvbmQpOwotICAgICAgRW51bUdlbiBnZW4oKmVudW1fZGVmKTsKLSAgICAgIGF1dG8mIG91dF9maWxlID0gZ2V0X291dF9maWxlKHN5bWJvbF9jb3VudCwgc3ltYm9sX3RvdGFsLCAmb3V0X2ZpbGVfc2hhcmRzKTsKLSAgICAgIGdlbi5HZW5EZWZpbml0aW9uUHliaW5kMTEob3V0X2ZpbGUpOwotICAgICAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotICAgICAgc3ltYm9sX2NvdW50Kys7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBzIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgIGlmIChzLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpTVFJVQ1QpIHsKLSAgICAgIGNvbnN0IGF1dG8qIHN0cnVjdF9kZWYgPSBzdGF0aWNfY2FzdDxjb25zdCBTdHJ1Y3REZWYqPihzLnNlY29uZCk7Ci0gICAgICBhdXRvJiBvdXRfZmlsZSA9IGdldF9vdXRfZmlsZShzeW1ib2xfY291bnQsIHN5bWJvbF90b3RhbCwgJm91dF9maWxlX3NoYXJkcyk7Ci0gICAgICBzdHJ1Y3RfZGVmLT5HZW5EZWZpbml0aW9uUHliaW5kMTEob3V0X2ZpbGUpOwotICAgICAgb3V0X2ZpbGUgPDwgIlxuIjsKLSAgICAgIHN5bWJvbF9jb3VudCsrOwotICAgIH0KLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgcGFja2V0X2RlZiA6IGRlY2xzLnBhY2tldF9kZWZzX3F1ZXVlXykgewotICAgIGF1dG8mIG91dF9maWxlID0gZ2V0X291dF9maWxlKHN5bWJvbF9jb3VudCwgc3ltYm9sX3RvdGFsLCAmb3V0X2ZpbGVfc2hhcmRzKTsKLSAgICBwYWNrZXRfZGVmLnNlY29uZC0+R2VuUGFyc2VyRGVmaW5pdGlvblB5YmluZDExKG91dF9maWxlKTsKLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0gICAgc3ltYm9sX2NvdW50Kys7Ci0gIH0KLQotICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBkZWNscy5wYWNrZXRfZGVmc19xdWV1ZV8pIHsKLSAgICBhdXRvJiBvdXRfZmlsZSA9IGdldF9vdXRfZmlsZShzeW1ib2xfY291bnQsIHN5bWJvbF90b3RhbCwgJm91dF9maWxlX3NoYXJkcyk7Ci0gICAgcC5zZWNvbmQtPkdlbkJ1aWxkZXJEZWZpbml0aW9uUHliaW5kMTEob3V0X2ZpbGUpOwotICAgIG91dF9maWxlIDw8ICJcblxuIjsKLSAgICBzeW1ib2xfY291bnQrKzsKLSAgfQotCi0gIGZvciAoYXV0byYgb3V0X2ZpbGUgOiBvdXRfZmlsZV9zaGFyZHMpIHsKLSAgICBvdXRfZmlsZSA8PCAifVxuXG4iOwotICAgIGdlbmVyYXRlX25hbWVzcGFjZV9jbG9zZShuYW1lc3BhY2VfbGlzdCwgb3V0X2ZpbGUpOwotICB9Ci0KLSAgYXV0byBnZW5fZmlsZV9tYWluID0gZ2VuX3BhdGggLyAoaW5wdXRfZmlsZW5hbWUgKyAiX3B5dGhvbjMuY2MiKTsKLSAgc3RkOjpvZnN0cmVhbSBvdXRfZmlsZV9tYWluOwotICBvdXRfZmlsZV9tYWluLm9wZW4oZ2VuX2ZpbGVfbWFpbik7Ci0gIGlmICghb3V0X2ZpbGVfbWFpbi5pc19vcGVuKCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgImNhbid0IG9wZW4gIiA8PCBnZW5fZmlsZV9tYWluIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgb3V0X2ZpbGVfbWFpbiA8PCAiI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+XG4iOwotICBnZW5lcmF0ZV9uYW1lc3BhY2Vfb3BlbihuYW1lc3BhY2VfbGlzdCwgb3V0X2ZpbGVfbWFpbik7Ci0KLSAgb3V0X2ZpbGVfbWFpbiA8PCAibmFtZXNwYWNlIHB5ID0gcHliaW5kMTE7XG5cbiI7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRfZmlsZV9zaGFyZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBvdXRfZmlsZV9tYWluIDw8ICJ2b2lkIGRlZmluZV8iIDw8IGlucHV0X2ZpbGVuYW1lIDw8ICJfc3VibW9kdWxlX3NoYXJkXyIgPDwgc3RkOjp0b19zdHJpbmcoaSkKLSAgICAgICAgICAgICAgICAgIDw8ICIocHk6Om1vZHVsZSYgbSk7XG4iOwotICB9Ci0KLSAgb3V0X2ZpbGVfbWFpbiA8PCAidm9pZCBkZWZpbmVfIiA8PCBpbnB1dF9maWxlbmFtZSA8PCAiX3N1Ym1vZHVsZShweTo6bW9kdWxlJiBtKSB7XG5cbiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0X2ZpbGVfc2hhcmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgb3V0X2ZpbGVfbWFpbiA8PCAiZGVmaW5lXyIgPDwgaW5wdXRfZmlsZW5hbWUgPDwgIl9zdWJtb2R1bGVfc2hhcmRfIiA8PCBzdGQ6OnRvX3N0cmluZyhpKSA8PCAiKG0pO1xuIjsKLSAgfQotICBvdXRfZmlsZV9tYWluIDw8ICJ9XG5cbiI7Ci0KLSAgZ2VuZXJhdGVfbmFtZXNwYWNlX2Nsb3NlKG5hbWVzcGFjZV9saXN0LCBvdXRfZmlsZV9tYWluKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvZ2VuX3J1c3QuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL2dlbl9ydXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTQ2YjYwLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvZ2VuX3J1c3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZpbGVzeXN0ZW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJkZWNsYXJhdGlvbnMuaCIKLQotdm9pZCBnZW5lcmF0ZV9ydXN0X3BhY2tldF9wcmVhbWJsZShzdGQ6Om9zdHJlYW0mIHMpIHsKLSAgcyA8PAotICAgICAgUiIoCi11c2UgYnl0ZXM6OntCeXRlcywgQnl0ZXNNdXQsIEJ1Zk11dH07Ci11c2UgbnVtX2Rlcml2ZTo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKLXVzZSBudW1fdHJhaXRzOjp7RnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmV9OwotdXNlIHN0ZDo6Y29udmVydDo6e1RyeUZyb20sIFRyeUludG99OwotdXNlIHN0ZDo6Zm10OwotdXNlIHRoaXNlcnJvcjo6RXJyb3I7Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci0KLXR5cGUgUmVzdWx0PFQ+ID0gc3RkOjpyZXN1bHQ6OlJlc3VsdDxULCBFcnJvcj47Ci0KLSNbZGVyaXZlKERlYnVnLCBFcnJvcildCi1wdWIgZW51bSBFcnJvciB7Ci0gICNbZXJyb3IoIlBhY2tldCBwYXJzaW5nIGZhaWxlZCIpXQotICBJbnZhbGlkUGFja2V0RXJyb3IsCi0gICNbZXJyb3IoIntmaWVsZH0gd2FzIHt2YWx1ZTp4fSwgd2hpY2ggaXMgbm90IGtub3duIildCi0gIENvbnN0cmFpbnRPdXRPZkJvdW5kcyB7Ci0gICAgZmllbGQ6IFN0cmluZywKLSAgICB2YWx1ZTogdTY0LAotICB9LAotICAjW2Vycm9yKCJ3aGVuIHBhcnNpbmcge29ian0ue2ZpZWxkfSBuZWVkZWQgbGVuZ3RoIG9mIHt3YW50ZWR9IGJ1dCBnb3Qge2dvdH0iKV0KLSAgSW52YWxpZExlbmd0aEVycm9yIHsKLSAgICBvYmo6IFN0cmluZywKLSAgICBmaWVsZDogU3RyaW5nLAotICAgIHdhbnRlZDogdXNpemUsCi0gICAgZ290OiB1c2l6ZSwKLSAgfSwKLSAgI1tlcnJvcigiRHVlIHRvIHNpemUgcmVzdHJpY3Rpb25zIGEgc3RydWN0IGNvdWxkIG5vdCBiZSBwYXJzZWQuIildCi0gIEltcG9zc2libGVTdHJ1Y3RFcnJvciwKLX0KLQotcHViIHRyYWl0IFBhY2tldCB7Ci0gIGZuIHRvX2J5dGVzKHNlbGYpIC0+IEJ5dGVzOwotICBmbiB0b192ZWMoc2VsZikgLT4gVmVjPHU4PjsKLX0KLQotKSI7Ci19Ci0KLWJvb2wgZ2VuZXJhdGVfcnVzdF9zb3VyY2Vfb25lX2ZpbGUoCi0gICAgY29uc3QgRGVjbGFyYXRpb25zJiBkZWNscywKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGlucHV0X2ZpbGUsCi0gICAgY29uc3Qgc3RkOjpmaWxlc3lzdGVtOjpwYXRoJiBpbmNsdWRlX2RpciwKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIG91dF9kaXIsCi0gICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RfbmFtZXNwYWNlKSB7Ci0gIGF1dG8gZ2VuX3JlbGF0aXZlX3BhdGggPSBpbnB1dF9maWxlLmxleGljYWxseV9yZWxhdGl2ZShpbmNsdWRlX2RpcikucGFyZW50X3BhdGgoKTsKLQotICBhdXRvIGlucHV0X2ZpbGVuYW1lID0gaW5wdXRfZmlsZS5maWxlbmFtZSgpLnN0cmluZygpLnN1YnN0cigwLCBpbnB1dF9maWxlLmZpbGVuYW1lKCkuc3RyaW5nKCkuZmluZCgiLnBkbCIpKTsKLSAgYXV0byBnZW5fcGF0aCA9IG91dF9kaXIgLyBnZW5fcmVsYXRpdmVfcGF0aDsKLQotICBzdGQ6OmZpbGVzeXN0ZW06OmNyZWF0ZV9kaXJlY3RvcmllcyhnZW5fcGF0aCk7Ci0KLSAgYXV0byBnZW5fZmlsZSA9IGdlbl9wYXRoIC8gKGlucHV0X2ZpbGVuYW1lICsgIi5ycyIpOwotCi0gIHN0ZDo6Y291dCA8PCAiZ2VuZXJhdGluZyAiIDw8IGdlbl9maWxlIDw8IHN0ZDo6ZW5kbDsKLQotICBzdGQ6Om9mc3RyZWFtIG91dF9maWxlOwotICBvdXRfZmlsZS5vcGVuKGdlbl9maWxlKTsKLSAgaWYgKCFvdXRfZmlsZS5pc19vcGVuKCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgImNhbid0IG9wZW4gIiA8PCBnZW5fZmlsZSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb3V0X2ZpbGUgPDwgIi8vIEBnZW5lcmF0ZWQgcnVzdCBwYWNrZXRzIGZyb20gIiA8PCBpbnB1dF9maWxlLmZpbGVuYW1lKCkuc3RyaW5nKCkgPDwgIlxuXG4iOwotCi0gIGdlbmVyYXRlX3J1c3RfcGFja2V0X3ByZWFtYmxlKG91dF9maWxlKTsKLSAgaWYgKGlucHV0X2ZpbGVuYW1lID09ICJoY2lfcGFja2V0cyIpIHsKLSAgICBvdXRfZmlsZSA8PCAicHViIHRyYWl0IENvbW1hbmRFeHBlY3RhdGlvbnMgeyAiCi0gICAgICAgICAgICAgPDwgInR5cGUgUmVzcG9uc2VUeXBlOyIKLSAgICAgICAgICAgICA8PCAiZm4gX3RvX3Jlc3BvbnNlX3R5cGUocGt0OiBFdmVudFBhY2tldCkgLT4gU2VsZjo6UmVzcG9uc2VUeXBlOyIKLSAgICAgICAgICAgICA8PCAifSI7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBhY2tldF9kZWYgOiBkZWNscy5wYWNrZXRfZGVmc19xdWV1ZV8pIHsKLSAgICAgIGF1dG8gcGFja2V0ID0gcGFja2V0X2RlZi5zZWNvbmQ7Ci0gICAgICBpZiAoIXBhY2tldC0+SGFzQW5jZXN0b3JOYW1lZCgiQ29tbWFuZCIpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgYXV0byBjb25zdHJhaW50ID0gcGFja2V0LT5wYXJlbnRfY29uc3RyYWludHNfLmZpbmQoIm9wX2NvZGUiKTsKLSAgICAgIGlmIChjb25zdHJhaW50ID09IHBhY2tldC0+cGFyZW50X2NvbnN0cmFpbnRzXy5lbmQoKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGF1dG8gb3Bjb2RlID0gc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KGNvbnN0cmFpbnQtPnNlY29uZCk7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIG90aGVyX3BhY2tldF9kZWYgOiBkZWNscy5wYWNrZXRfZGVmc19xdWV1ZV8pIHsKLSAgICAgICAgYXV0byBvdGhlcl9wYWNrZXQgPSBvdGhlcl9wYWNrZXRfZGVmLnNlY29uZDsKLSAgICAgICAgYm9vbCBjb21tYW5kX3N0YXR1cyA9IG90aGVyX3BhY2tldC0+SGFzQW5jZXN0b3JOYW1lZCgiQ29tbWFuZFN0YXR1cyIpOwotICAgICAgICBib29sIGNvbW1hbmRfY29tcGxldGUgPSBvdGhlcl9wYWNrZXQtPkhhc0FuY2VzdG9yTmFtZWQoIkNvbW1hbmRDb21wbGV0ZSIpOwotICAgICAgICBpZiAoIWNvbW1hbmRfc3RhdHVzICYmICFjb21tYW5kX2NvbXBsZXRlKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBvdGhlcl9jb25zdHJhaW50ID0gb3RoZXJfcGFja2V0LT5wYXJlbnRfY29uc3RyYWludHNfLmZpbmQoImNvbW1hbmRfb3BfY29kZSIpOwotICAgICAgICBpZiAob3RoZXJfY29uc3RyYWludCA9PSBvdGhlcl9wYWNrZXQtPnBhcmVudF9jb25zdHJhaW50c18uZW5kKCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gb3RoZXJfb3Bjb2RlID0gc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KG90aGVyX2NvbnN0cmFpbnQtPnNlY29uZCk7Ci0gICAgICAgIGlmIChvcGNvZGUgPT0gb3RoZXJfb3Bjb2RlKSB7Ci0gICAgICAgICAgcGFja2V0LT5jb21wbGVtZW50XyA9IG90aGVyX3BhY2tldDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEVudW1EZWYqIG9wY29kZSA9IG51bGxwdHI7Ci0gICAgRW51bURlZiogb3Bjb2RlX2luZGV4ID0gbnVsbHB0cjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBkZWNscy50eXBlX2RlZnNfcXVldWVfKSB7Ci0gICAgICBpZiAoZS5zZWNvbmQtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6RU5VTSkgewotICAgICAgICBhdXRvKiBlbnVtX2RlZiA9IHN0YXRpY19jYXN0PEVudW1EZWYqPihlLnNlY29uZCk7Ci0gICAgICAgIGlmIChlbnVtX2RlZi0+bmFtZV8gPT0gIk9wQ29kZSIpIHsKLSAgICAgICAgICBvcGNvZGUgPSBlbnVtX2RlZjsKLSAgICAgICAgfSBlbHNlIGlmIChlbnVtX2RlZi0+bmFtZV8gPT0gIk9wQ29kZUluZGV4IikgewotICAgICAgICAgIG9wY29kZV9pbmRleCA9IGVudW1fZGVmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG9wY29kZV9pbmRleCAhPSBudWxscHRyICYmIG9wY29kZSAhPSBudWxscHRyKSB7Ci0gICAgICBvcGNvZGVfaW5kZXgtPnRyeV9mcm9tX2VudW1fID0gb3Bjb2RlOwotICAgIH0KLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgZSA6IGRlY2xzLnR5cGVfZGVmc19xdWV1ZV8pIHsKLSAgICBpZiAoZS5zZWNvbmQtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6RU5VTSkgewotICAgICAgY29uc3QgYXV0byogZW51bV9kZWYgPSBzdGF0aWNfY2FzdDxjb25zdCBFbnVtRGVmKj4oZS5zZWNvbmQpOwotICAgICAgRW51bUdlbiBnZW4oKmVudW1fZGVmKTsKLSAgICAgIGdlbi5HZW5SdXN0RGVmKG91dF9maWxlKTsKLSAgICAgIG91dF9maWxlIDw8ICJcblxuIjsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGF1dG8mIHMgOiBkZWNscy50eXBlX2RlZnNfcXVldWVfKSB7Ci0gICAgaWYgKHMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OlNUUlVDVCkgewotICAgICAgY29uc3QgYXV0byogc3RydWN0X2RlZiA9IHN0YXRpY19jYXN0PGNvbnN0IFN0cnVjdERlZio+KHMuc2Vjb25kKTsKLSAgICAgIHN0cnVjdF9kZWYtPkdlblJ1c3REZWYob3V0X2ZpbGUpOwotICAgICAgb3V0X2ZpbGUgPDwgIlxuXG4iOwotICAgIH0KLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgcGFja2V0X2RlZiA6IGRlY2xzLnBhY2tldF9kZWZzX3F1ZXVlXykgewotICAgIHBhY2tldF9kZWYuc2Vjb25kLT5HZW5SdXN0RGVmKG91dF9maWxlKTsKLSAgICBvdXRfZmlsZSA8PCAiXG5cbiI7Ci0gIH0KLQotICBvdXRfZmlsZS5jbG9zZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvbGFuZ3VhZ2VfbC5sbCBiL2dkL3BhY2tldC9wYXJzZXIvbGFuZ3VhZ2VfbC5sbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlOWNmMS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL2xhbmd1YWdlX2wubGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotJXsKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJkZWNsYXJhdGlvbnMuaCIKLSNpbmNsdWRlICJsYW5ndWFnZV95LmgiCi0KLSNpZm5kZWYgWVlTVFlQRQotI2RlZmluZSBZWVNUWVBFIHl5OjpwYXJzZXI6OnNlbWFudGljX3R5cGUKLSNlbmRpZgotCi0jaWZuZGVmIFlZTFRZUEUKLSNkZWZpbmUgWVlMVFlQRSB5eTo6cGFyc2VyOjpsb2NhdGlvbl90eXBlCi0jZW5kaWYKLQotdXNpbmcgdG9rZW4gPSB5eTo6cGFyc2VyOjp0b2tlbjsKLQotI2RlZmluZSBZWV9VU0VSX0FDVElPTiB5eWxsb2MtPnN0ZXAoKTsgeXlsbG9jLT5jb2x1bW5zKHl5bGVuZyk7Ci0KLSV9Ci0KLSVvcHRpb24gZGVidWcKLQotJW9wdGlvbiB5eWxpbmVubwotJW9wdGlvbiBub3l5d3JhcAotJW9wdGlvbiBub3VucHV0Ci0lb3B0aW9uIG5vaW5wdXQKLSVvcHRpb24gcmVlbnRyYW50Ci0lb3B0aW9uIGJpc29uLWJyaWRnZQotJW9wdGlvbiBiaXNvbi1sb2NhdGlvbnMKLQotaWRlbnRpZmllciBbYS16QS1aXVtfYS16QS1aMC05XSoKLXNpemVfbW9kaWZpZXIgWysqLy1dWyArKi9cLTAtOV0qCi1pbnR2YWx1ZSAoMHxbMS05XVswLTldKikKLWhleHZhbHVlIDBbeHxYXVswLTlhLWZBLUZdKwotc3RyaW5nX2xpdGVyYWwgXCIuKlwiCi0KLSV4IENPTU1FTlRfU1RBVEUKLQotJSUKLSAgLyogTk9URToKLSAgICogUnVsZSBvcmRlcmluZyBpcyBpbXBvcnRhbnQgaW4gb3JkZXIgdG8gZXN0YWJsaXN0IHByaW9yaXR5LiBTb21lCi0gICAqIHJ1bGVzIGFyZSBhIHN1cGVyc2V0IG9mIG90aGVyIHJ1bGVzIGFuZCB3aWxsIGNhdXNlIHRoZSBzdWIgcnVsZXMgdG8KLSAgICogbmV2ZXIgbWF0Y2guIEV4LiBLZXl3b3JkcyBtdXN0IGFsd2F5cyBnbyBiZWZvcmUgaWRlbnRpZmllcnMsIG90aGVyd2lzZQotICAgKiBhbGwga2V5d29yZHMgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGlkZW50aWZpZXIuCi0gICAqLwotCi0gIC8qIEJsb2NrIENvbW1lbnQgKi8KLSIvKiIgICAgICAgICAgICAgICAgICAgIHsgQkVHSU4oQ09NTUVOVF9TVEFURSk7IH0KLTxDT01NRU5UX1NUQVRFPiIqLyIgICAgIHsgQkVHSU4oSU5JVElBTCk7IH0KLTxDT01NRU5UX1NUQVRFPltcbl0rICAgIHsgeXlsbG9jLT5saW5lcyh5eWxlbmcpOyB9Ci08Q09NTUVOVF9TVEFURT4uICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gfQotCi0gIC8qIExpbmUgQ29tbWVudCAqLwotIi8vIlteXHJcbl0qICAgICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovIH0KLQotICAvKiBCZWdpbiByZXNlcnZlZCBrZXl3b3JkIGRlZmluaXRpb25zICovCi0gIC8qIEZpZWxkcyAqLwotIl9ib2R5XyIgICAgICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OkJPRFkpOyB9Ci0iX3BheWxvYWRfIiAgICAgICAgICAgICB7IHJldHVybih0b2tlbjo6UEFZTE9BRCk7IH0KLSJfc2l6ZV8iICAgICAgICAgICAgICAgIHsgcmV0dXJuKHRva2VuOjpTSVpFKTsgfQotIl9jb3VudF8iICAgICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OkNPVU5UKTsgfQotIl9maXhlZF8iICAgICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OkZJWEVEKTsgfQotIl9yZXNlcnZlZF8iICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OlJFU0VSVkVEKTsgfQotIl9jaGVja3N1bV9zdGFydF8iICAgICAgeyByZXR1cm4odG9rZW46OkNIRUNLU1VNX1NUQVJUKTsgfQotIl9wYWRkaW5nXyIgICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OlBBRERJTkcpOyB9Ci0gIC8qIFR5cGVzICovCi0iY2hlY2tzdW0iICAgICAgICAgICAgICB7IHJldHVybih0b2tlbjo6Q0hFQ0tTVU0pOyB9Ci0iY3VzdG9tX2ZpZWxkIiAgICAgICAgICB7IHJldHVybih0b2tlbjo6Q1VTVE9NX0ZJRUxEKTsgfQotImVudW0iICAgICAgICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OkVOVU0pOyB9Ci0iZ3JvdXAiICAgICAgICAgICAgICAgICB7IHJldHVybih0b2tlbjo6R1JPVVApOyB9Ci0icGFja2V0IiAgICAgICAgICAgICAgICB7IHJldHVybih0b2tlbjo6UEFDS0VUKTsgfQotInRlc3QiICAgICAgICAgICAgICAgICAgeyByZXR1cm4odG9rZW46OlRFU1QpOyB9Ci0ic3RydWN0IiAgICAgICAgICAgICAgICB7IHJldHVybih0b2tlbjo6U1RSVUNUKTsgfQotImxpdHRsZV9lbmRpYW5fcGFja2V0cyIgewotICAgICAgICAgICAgICAgICAgICAgICAgICB5eWx2YWwtPmludGVnZXIgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW46OklTX0xJVFRMRV9FTkRJQU47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0iYmlnX2VuZGlhbl9wYWNrZXRzIiAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHl5bHZhbC0+aW50ZWdlciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjo6SVNfTElUVExFX0VORElBTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAvKiBCZWdpbiBpZGVudGlmaWVyIGRlZmluaXRpb25zICovCi17c3RyaW5nX2xpdGVyYWx9ICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHdpdGhfcXVvdGVzID0gc3RkOjpzdHJpbmcoeXl0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsdmFsLT5zdHJpbmcgPSBuZXcgc3RkOjpzdHJpbmcod2l0aF9xdW90ZXMuYmVnaW4oKSArIDEsIHdpdGhfcXVvdGVzLmVuZCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjo6U1RSSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi17c2l6ZV9tb2RpZmllcn0gICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHl5bHZhbC0+c3RyaW5nID0gbmV3IHN0ZDo6c3RyaW5nKHl5dGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjo6U0laRV9NT0RJRklFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQote2lkZW50aWZpZXJ9ICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICB5eWx2YWwtPnN0cmluZyA9IG5ldyBzdGQ6OnN0cmluZyh5eXRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW46OklERU5USUZJRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLXtpbnR2YWx1ZX0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsdmFsLT5pbnRlZ2VyID0gc3RkOjpzdG9pKHN0ZDo6c3RyaW5nKHl5dGV4dCksIG51bGxwdHIsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOjpJTlRFR0VSOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi17aGV4dmFsdWV9ICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHl5bHZhbC0+aW50ZWdlciA9IHN0ZDo6c3RvaShzdGQ6OnN0cmluZyh5eXRleHQpLCBudWxscHRyLCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjo6SU5URUdFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAvKiBCZWdpbiB0b2tlbiBkZWZpbml0aW9ucyAqLwotIjoiICAgICAgICAgICAgeyByZXR1cm4oJzonKTsgfQotInsiICAgICAgICAgICAgeyByZXR1cm4oJ3snKTsgfQotIn0iICAgICAgICAgICAgeyByZXR1cm4oJ30nKTsgfQotIlsiICAgICAgICAgICAgeyByZXR1cm4oJ1snKTsgfQotIl0iICAgICAgICAgICAgeyByZXR1cm4oJ10nKTsgfQotIigiICAgICAgICAgICAgeyByZXR1cm4oJygnKTsgfQotIikiICAgICAgICAgICAgeyByZXR1cm4oJyknKTsgfQotIjwiICAgICAgICAgICAgeyByZXR1cm4oJzwnKTsgfQotIj4iICAgICAgICAgICAgeyByZXR1cm4oJz4nKTsgfQotIj0iICAgICAgICAgICAgeyByZXR1cm4oJz0nKTsgfQotIiwiICAgICAgICAgICAgeyByZXR1cm4oJywnKTsgfQotCi0oXG58XHJcbikrICAgICB7IHl5bGxvYy0+bGluZXMoeXlsZW5nKTsgfQotWyBcdFxmXHZdKyAgICAgeyAvKiBJZ25vcmUgYWxsIG90aGVyIHdoaXRlc3BhY2UgKi8gfQotCi0lJQotCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2xhbmd1YWdlX3kueXkgYi9nZC9wYWNrZXQvcGFyc2VyL2xhbmd1YWdlX3kueXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzlhY2QuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9sYW5ndWFnZV95Lnl5CisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLSVjb2RlIHJlcXVpcmVzIHsKLSAgI2luY2x1ZGUgPGlvc3RyZWFtPgotICAjaW5jbHVkZSA8dmVjdG9yPgotICAjaW5jbHVkZSA8bGlzdD4KLSAgI2luY2x1ZGUgPG1hcD4KLQotICAjaW5jbHVkZSAiZGVjbGFyYXRpb25zLmgiCi0gICNpbmNsdWRlICJsb2dnaW5nLmgiCi0gICNpbmNsdWRlICJmaWVsZF9saXN0LmgiCi0gICNpbmNsdWRlICJmaWVsZHMvYWxsX2ZpZWxkcy5oIgotfQotJXsKLSAgI2luY2x1ZGUgImxhbmd1YWdlX3kuaCIKLSAgZXh0ZXJuIGludCB5eWxleCh5eTo6cGFyc2VyOjpzZW1hbnRpY190eXBlKiwgeXk6OnBhcnNlcjo6bG9jYXRpb25fdHlwZSosIHZvaWQgKik7Ci0KLSAgUGFyc2VMb2NhdGlvbiB0b1BhcnNlTG9jYXRpb24oeXk6OnBhcnNlcjo6bG9jYXRpb25fdHlwZSBsb2MpIHsKLSAgICByZXR1cm4gUGFyc2VMb2NhdGlvbihsb2MuYmVnaW4ubGluZSk7Ci0gIH0KLSAgI2RlZmluZSBMT0MgdG9QYXJzZUxvY2F0aW9uKHl5bGxvYykKLSV9Ci0KLSVwYXJzZS1wYXJhbSB7IHZvaWQqIHNjYW5uZXIgfQotJXBhcnNlLXBhcmFtIHsgRGVjbGFyYXRpb25zKiBkZWNscyB9Ci0lbGV4LXBhcmFtIHsgdm9pZCogc2Nhbm5lciB9Ci0KLSVnbHItcGFyc2VyCi0lc2tlbGV0b24gImdsci5jYyIKLQotJWV4cGVjdC1yciAwCi0KLSVkZWJ1ZwotJWRlZmluZSBwYXJzZS5lcnJvciB2ZXJib3NlCi0lbG9jYXRpb25zCi0ldmVyYm9zZQotCi0ldW5pb24gewotICBpbnQgaW50ZWdlcjsKLSAgc3RkOjpzdHJpbmcqIHN0cmluZzsKLQotICBFbnVtRGVmKiBlbnVtX2RlZmluaXRpb247Ci0gIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+KiBlbnVtZXJhdGlvbl92YWx1ZXM7Ci0gIHN0ZDo6cGFpcjxpbnQsIHN0ZDo6c3RyaW5nPiogZW51bWVyYXRpb25fdmFsdWU7Ci0KLSAgUGFja2V0RGVmKiBwYWNrZXRfZGVmaW5pdGlvbl92YWx1ZTsKLSAgRmllbGRMaXN0KiBwYWNrZXRfZmllbGRfZGVmaW5pdGlvbnM7Ci0gIFBhY2tldEZpZWxkKiBwYWNrZXRfZmllbGRfdHlwZTsKLQotICBTdHJ1Y3REZWYqIHN0cnVjdF9kZWZpbml0aW9uX3ZhbHVlOwotCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nKj4qIHRlc3RfY2FzZXNfdDsKLSAgc3RkOjpzdHJpbmcqIHRlc3RfY2FzZV90OwotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZhcmlhbnQ8aW50NjRfdCwgc3RkOjpzdHJpbmc+PiogY29uc3RyYWludF9saXN0X3Q7Ci0gIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2YXJpYW50PGludDY0X3QsIHN0ZDo6c3RyaW5nPj4qIGNvbnN0cmFpbnRfdDsKLX0KLQotJXRva2VuIDxpbnRlZ2VyPiBJTlRFR0VSCi0ldG9rZW4gPGludGVnZXI+IElTX0xJVFRMRV9FTkRJQU4KLSV0b2tlbiA8c3RyaW5nPiBJREVOVElGSUVSCi0ldG9rZW4gPHN0cmluZz4gU0laRV9NT0RJRklFUgotJXRva2VuIDxzdHJpbmc+IFNUUklORwotCi0ldG9rZW4gRU5VTSAiZW51bSIKLSV0b2tlbiBQQUNLRVQgInBhY2tldCIKLSV0b2tlbiBQQVlMT0FEICJwYXlsb2FkIgotJXRva2VuIEJPRFkgImJvZHkiCi0ldG9rZW4gU1RSVUNUICJzdHJ1Y3QiCi0ldG9rZW4gU0laRSAic2l6ZSIKLSV0b2tlbiBDT1VOVCAiY291bnQiCi0ldG9rZW4gRklYRUQgImZpeGVkIgotJXRva2VuIFJFU0VSVkVEICJyZXNlcnZlZCIKLSV0b2tlbiBHUk9VUCAiZ3JvdXAiCi0ldG9rZW4gQ1VTVE9NX0ZJRUxEICJjdXN0b21fZmllbGQiCi0ldG9rZW4gQ0hFQ0tTVU0gImNoZWNrc3VtIgotJXRva2VuIENIRUNLU1VNX1NUQVJUICJjaGVja3N1bV9zdGFydCIKLSV0b2tlbiBQQURESU5HICJwYWRkaW5nIgotJXRva2VuIFRFU1QgInRlc3QiCi0KLSV0eXBlPGVudW1fZGVmaW5pdGlvbj4gZW51bV9kZWZpbml0aW9uCi0ldHlwZTxlbnVtZXJhdGlvbl92YWx1ZXM+IGVudW1lcmF0aW9uX2xpc3QKLSV0eXBlPGVudW1lcmF0aW9uX3ZhbHVlPiBlbnVtZXJhdGlvbgotCi0ldHlwZTxwYWNrZXRfZGVmaW5pdGlvbl92YWx1ZT4gcGFja2V0X2RlZmluaXRpb247Ci0ldHlwZTxwYWNrZXRfZmllbGRfZGVmaW5pdGlvbnM+IGZpZWxkX2RlZmluaXRpb25fbGlzdDsKLSV0eXBlPHBhY2tldF9maWVsZF90eXBlPiBmaWVsZF9kZWZpbml0aW9uOwotJXR5cGU8cGFja2V0X2ZpZWxkX3R5cGU+IGdyb3VwX2ZpZWxkX2RlZmluaXRpb247Ci0ldHlwZTxwYWNrZXRfZmllbGRfdHlwZT4gdHlwZV9kZWZfZmllbGRfZGVmaW5pdGlvbjsKLSV0eXBlPHBhY2tldF9maWVsZF90eXBlPiBzY2FsYXJfZmllbGRfZGVmaW5pdGlvbjsKLSV0eXBlPHBhY2tldF9maWVsZF90eXBlPiBjaGVja3N1bV9zdGFydF9maWVsZF9kZWZpbml0aW9uOwotJXR5cGU8cGFja2V0X2ZpZWxkX3R5cGU+IHBhZGRpbmdfZmllbGRfZGVmaW5pdGlvbjsKLSV0eXBlPHBhY2tldF9maWVsZF90eXBlPiBzaXplX2ZpZWxkX2RlZmluaXRpb247Ci0ldHlwZTxwYWNrZXRfZmllbGRfdHlwZT4gcGF5bG9hZF9maWVsZF9kZWZpbml0aW9uOwotJXR5cGU8cGFja2V0X2ZpZWxkX3R5cGU+IGJvZHlfZmllbGRfZGVmaW5pdGlvbjsKLSV0eXBlPHBhY2tldF9maWVsZF90eXBlPiBmaXhlZF9maWVsZF9kZWZpbml0aW9uOwotJXR5cGU8cGFja2V0X2ZpZWxkX3R5cGU+IHJlc2VydmVkX2ZpZWxkX2RlZmluaXRpb247Ci0ldHlwZTxwYWNrZXRfZmllbGRfdHlwZT4gYXJyYXlfZmllbGRfZGVmaW5pdGlvbjsKLQotJXR5cGU8c3RydWN0X2RlZmluaXRpb25fdmFsdWU+IHN0cnVjdF9kZWZpbml0aW9uOwotCi0ldHlwZTx0ZXN0X2Nhc2VzX3Q+IHRlc3RfZGVmaW5pdGlvbjsKLSV0eXBlPHRlc3RfY2FzZXNfdD4gdGVzdF9jYXNlX2xpc3Q7Ci0ldHlwZTx0ZXN0X2Nhc2VfdD4gdGVzdF9jYXNlOwotCi0ldHlwZTxjb25zdHJhaW50X2xpc3RfdD4gY29uc3RyYWludF9saXN0OwotJXR5cGU8Y29uc3RyYWludF90PiBjb25zdHJhaW50OwotJWRlc3RydWN0b3IgeyBzdGQ6OmNvdXQgPDwgIkRFU1RST1lJTkcgU1RSSU5HICIgPDwgKiQkIDw8ICJcbiI7IGRlbGV0ZSAkJDsgfSBJREVOVElGSUVSIFNUUklORyBTSVpFX01PRElGSUVSCi0KLSUlCi0KLWZpbGUKLSAgOiBJU19MSVRUTEVfRU5ESUFOIGRlY2xhcmF0aW9ucwotICB7Ci0gICAgZGVjbHMtPmlzX2xpdHRsZV9lbmRpYW4gPSAoJDEgPT0gMSk7Ci0gICAgaWYgKGRlY2xzLT5pc19saXR0bGVfZW5kaWFuKSB7Ci0gICAgICBERUJVRygpIDw8ICJMSVRUTEUgRU5ESUFOICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERFQlVHKCkgPDwgIkJJRyBFTkRJQU4gIjsKLSAgICB9Ci0gIH0KLQotZGVjbGFyYXRpb25zCi0gIDogLyogZW1wdHkgKi8KLSAgfCBkZWNsYXJhdGlvbnMgZGVjbGFyYXRpb24KLQotZGVjbGFyYXRpb24KLSAgOiBlbnVtX2RlZmluaXRpb24KLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJGT1VORCBFTlVNXG5cbiI7Ci0gICAgICBkZWNscy0+QWRkVHlwZURlZigkMS0+bmFtZV8sICQxKTsKLSAgICB9Ci0gIHwgcGFja2V0X2RlZmluaXRpb24KLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJGT1VORCBQQUNLRVRcblxuIjsKLSAgICAgIGRlY2xzLT5BZGRQYWNrZXREZWYoJDEtPm5hbWVfLCAkMSk7Ci0gICAgfQotICB8IHN0cnVjdF9kZWZpbml0aW9uCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiRk9VTkQgU1RSVUNUXG5cbiI7Ci0gICAgICBkZWNscy0+QWRkVHlwZURlZigkMS0+bmFtZV8sICQxKTsKLSAgICB9Ci0gIHwgZ3JvdXBfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIC8vIEFsbCBhY3Rpb25zIGFyZSBoYW5kbGVkIGluIGdyb3VwX2RlZmluaXRpb24KLSAgICB9Ci0gIHwgY2hlY2tzdW1fZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIC8vIEFsbCBhY3Rpb25zIGFyZSBoYW5kbGVkIGluIGNoZWNrc3VtX2RlZmluaXRpb24KLSAgICB9Ci0gIHwgY3VzdG9tX2ZpZWxkX2RlZmluaXRpb24KLSAgICB7Ci0gICAgICAvLyBBbGwgYWN0aW9ucyBhcmUgaGFuZGxlZCBpbiBjdXN0b21fZmllbGRfZGVmaW5pdGlvbgotICAgIH0KLSAgfCB0ZXN0X2RlZmluaXRpb24KLSAgICB7Ci0gICAgICAvLyBBbGwgYWN0aW9ucyBhcmUgaGFuZGxlZCBpbiB0ZXN0X2RlZmluaXRpb24KLSAgICB9Ci0KLWVudW1fZGVmaW5pdGlvbgotICA6IEVOVU0gSURFTlRJRklFUiAnOicgSU5URUdFUiAneycgZW51bWVyYXRpb25fbGlzdCAnLCcgJ30nCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiRW51bSBEZWNsYXJlZDogbmFtZT0iIDw8ICokMgotICAgICAgICAgICAgICAgIDw8ICIgc2l6ZT0iIDw8ICQ0IDw8ICJcbiI7Ci0KLSAgICAgICQkID0gbmV3IEVudW1EZWYoc3RkOjptb3ZlKCokMiksICQ0KTsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgZSA6ICokNikgewotICAgICAgICAkJC0+QWRkRW50cnkoZS5zZWNvbmQsIGUuZmlyc3QpOwotICAgICAgfQotICAgICAgZGVsZXRlICQyOwotICAgICAgZGVsZXRlICQ2OwotICAgIH0KLQotZW51bWVyYXRpb25fbGlzdAotICA6IGVudW1lcmF0aW9uCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiRW51bWVyYXRvciB3aXRoIGNvbW1hXG4iOwotICAgICAgJCQgPSBuZXcgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4oKTsKLSAgICAgICQkLT5pbnNlcnQoc3RkOjptb3ZlKCokMSkpOwotICAgICAgZGVsZXRlICQxOwotICAgIH0KLSAgfCBlbnVtZXJhdGlvbl9saXN0ICcsJyBlbnVtZXJhdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkVudW1lcmF0b3Igd2l0aCBsaXN0XG4iOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5pbnNlcnQoc3RkOjptb3ZlKCokMykpOwotICAgICAgZGVsZXRlICQzOwotICAgIH0KLQotZW51bWVyYXRpb24KLSAgOiBJREVOVElGSUVSICc9JyBJTlRFR0VSCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiRW51bWVyYXRvcjogbmFtZT0iIDw8ICokMQotICAgICAgICAgICAgICAgIDw8ICIgdmFsdWU9IiA8PCAkMyA8PCAiXG4iOwotICAgICAgJCQgPSBuZXcgc3RkOjpwYWlyKCQzLCBzdGQ6Om1vdmUoKiQxKSk7Ci0gICAgICBkZWxldGUgJDE7Ci0gICAgfQotCi1ncm91cF9kZWZpbml0aW9uCi0gIDogR1JPVVAgSURFTlRJRklFUiAneycgZmllbGRfZGVmaW5pdGlvbl9saXN0ICd9JwotICAgIHsKLSAgICAgIGRlY2xzLT5BZGRHcm91cERlZigqJDIsICQ0KTsKLSAgICAgIGRlbGV0ZSAkMjsKLSAgICB9Ci0KLWNoZWNrc3VtX2RlZmluaXRpb24KLSAgOiBDSEVDS1NVTSBJREVOVElGSUVSICc6JyBJTlRFR0VSIFNUUklORwotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkNoZWNrc3VtIGZpZWxkIGRlZmluZWRcbiI7Ci0gICAgICBkZWNscy0+QWRkVHlwZURlZigqJDIsIG5ldyBDaGVja3N1bURlZigqJDIsICokNSwgJDQpKTsKLSAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIGRlbGV0ZSAkNTsKLSAgICB9Ci0KLWN1c3RvbV9maWVsZF9kZWZpbml0aW9uCi0gIDogQ1VTVE9NX0ZJRUxEIElERU5USUZJRVIgJzonIElOVEVHRVIgU1RSSU5HCi0gICAgewotICAgICAgZGVjbHMtPkFkZFR5cGVEZWYoKiQyLCBuZXcgQ3VzdG9tRmllbGREZWYoKiQyLCAqJDUsICQ0KSk7Ci0gICAgICBkZWxldGUgJDI7Ci0gICAgICBkZWxldGUgJDU7Ci0gICAgfQotICB8IENVU1RPTV9GSUVMRCBJREVOVElGSUVSIFNUUklORwotICAgIHsKLSAgICAgIGRlY2xzLT5BZGRUeXBlRGVmKCokMiwgbmV3IEN1c3RvbUZpZWxkRGVmKCokMiwgKiQzKSk7Ci0gICAgICBkZWxldGUgJDI7Ci0gICAgICBkZWxldGUgJDM7Ci0gICAgfQotCi10ZXN0X2RlZmluaXRpb24KLSAgOiBURVNUIElERU5USUZJRVIgJ3snIHRlc3RfY2FzZV9saXN0ICcsJyAnfScKLSAgICB7Ci0gICAgICBhdXRvJiYgcGFja2V0X25hbWUgPSAqJDI7Ci0gICAgICBERUJVRygpIDw8ICJUZXN0IERlY2xhcmVkOiBuYW1lPSIgPDwgKiQyIDw8ICJcbiI7Ci0gICAgICBhdXRvIHBhY2tldCA9IGRlY2xzLT5HZXRQYWNrZXREZWYocGFja2V0X25hbWUpOwotICAgICAgaWYgKHBhY2tldCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIkNvdWxkIG5vdCBmaW5kIHBhY2tldCAiIDw8IHBhY2tldF9uYW1lIDw8ICJcbiI7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoY29uc3QgYXV0byYgdCA6ICokNCkgewotICAgICAgICBwYWNrZXQtPkFkZFRlc3RDYXNlKCp0KTsKLSAgICAgIH0KLSAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIGRlbGV0ZSAkNDsKLSAgICB9Ci0KLXRlc3RfY2FzZV9saXN0Ci0gIDogdGVzdF9jYXNlCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiVGVzdCBjYXNlIHdpdGggY29tbWFcbiI7Ci0gICAgICAkJCA9IG5ldyBzdGQ6OnNldDxzdGQ6OnN0cmluZyo+KCk7Ci0gICAgICAkJC0+aW5zZXJ0KCQxKTsKLSAgICB9Ci0gIHwgdGVzdF9jYXNlX2xpc3QgJywnIHRlc3RfY2FzZQotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIlRlc3QgY2FzZSB3aXRoIGxpc3RcbiI7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmluc2VydCgkMyk7Ci0gICAgfQotCi10ZXN0X2Nhc2UKLSAgOiBTVFJJTkcKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJUZXN0IENhc2U6IG5hbWU9IiA8PCAqJDEgPDwgIlxuIjsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1zdHJ1Y3RfZGVmaW5pdGlvbgotICA6IFNUUlVDVCBJREVOVElGSUVSICd7JyBmaWVsZF9kZWZpbml0aW9uX2xpc3QgJ30nCi0gICAgewotICAgICAgYXV0byYmIHN0cnVjdF9uYW1lID0gKiQyOwotICAgICAgYXV0byYmIGZpZWxkX2RlZmluaXRpb25fbGlzdCA9ICokNDsKLQotICAgICAgREVCVUcoKSA8PCAiU3RydWN0ICIgPDwgc3RydWN0X25hbWUgPDwgIiB3aXRoIG5vIHBhcmVudCI7Ci0gICAgICBERUJVRygpIDw8ICJTVFJVQ1QgRklFTEQgTElTVCBTSVpFOiAiIDw8IGZpZWxkX2RlZmluaXRpb25fbGlzdC5zaXplKCk7Ci0gICAgICBhdXRvIHN0cnVjdF9kZWZpbml0aW9uID0gbmV3IFN0cnVjdERlZihzdGQ6Om1vdmUoc3RydWN0X25hbWUpLCBzdGQ6Om1vdmUoZmllbGRfZGVmaW5pdGlvbl9saXN0KSk7Ci0gICAgICBzdHJ1Y3RfZGVmaW5pdGlvbi0+QXNzaWduU2l6ZUZpZWxkcygpOwotCi0gICAgICAkJCA9IHN0cnVjdF9kZWZpbml0aW9uOwotICAgICAgZGVsZXRlICQyOwotICAgICAgZGVsZXRlICQ0OwotICAgIH0KLSAgfCBTVFJVQ1QgSURFTlRJRklFUiAnOicgSURFTlRJRklFUiAneycgZmllbGRfZGVmaW5pdGlvbl9saXN0ICd9JwotICAgIHsKLSAgICAgIGF1dG8mJiBzdHJ1Y3RfbmFtZSA9ICokMjsKLSAgICAgIGF1dG8mJiBwYXJlbnRfc3RydWN0X25hbWUgPSAqJDQ7Ci0gICAgICBhdXRvJiYgZmllbGRfZGVmaW5pdGlvbl9saXN0ID0gKiQ2OwotCi0gICAgICBERUJVRygpIDw8ICJTdHJ1Y3QgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHdpdGggcGFyZW50ICIgPDwgcGFyZW50X3N0cnVjdF9uYW1lIDw8ICJcbiI7Ci0gICAgICBERUJVRygpIDw8ICJTVFJVQ1QgRklFTEQgTElTVCBTSVpFOiAiIDw8IGZpZWxkX2RlZmluaXRpb25fbGlzdC5zaXplKCkgPDwgIlxuIjsKLQotICAgICAgYXV0byBwYXJlbnRfc3RydWN0ID0gZGVjbHMtPkdldFR5cGVEZWYocGFyZW50X3N0cnVjdF9uYW1lKTsKLSAgICAgIGlmIChwYXJlbnRfc3RydWN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiQ291bGQgbm90IGZpbmQgc3RydWN0ICIgPDwgcGFyZW50X3N0cnVjdF9uYW1lCi0gICAgICAgICAgICAgICAgICA8PCAiIHVzZWQgYXMgcGFyZW50IGZvciAiIDw8IHN0cnVjdF9uYW1lOwotICAgICAgfQotCi0gICAgICBpZiAocGFyZW50X3N0cnVjdC0+R2V0RGVmaW5pdGlvblR5cGUoKSAhPSBUeXBlRGVmOjpUeXBlOjpTVFJVQ1QpIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCBwYXJlbnRfc3RydWN0X25hbWUgPDwgIiBpcyBub3QgYSBzdHJ1Y3QiOwotICAgICAgfQotICAgICAgYXV0byBzdHJ1Y3RfZGVmaW5pdGlvbiA9IG5ldyBTdHJ1Y3REZWYoc3RkOjptb3ZlKHN0cnVjdF9uYW1lKSwgc3RkOjptb3ZlKGZpZWxkX2RlZmluaXRpb25fbGlzdCksIChTdHJ1Y3REZWYqKXBhcmVudF9zdHJ1Y3QpOwotICAgICAgc3RydWN0X2RlZmluaXRpb24tPkFzc2lnblNpemVGaWVsZHMoKTsKLQotICAgICAgJCQgPSBzdHJ1Y3RfZGVmaW5pdGlvbjsKLSAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIGRlbGV0ZSAkNDsKLSAgICAgIGRlbGV0ZSAkNjsKLSAgICB9Ci0gIHwgU1RSVUNUIElERU5USUZJRVIgJzonIElERU5USUZJRVIgJygnIGNvbnN0cmFpbnRfbGlzdCAnKScgJ3snIGZpZWxkX2RlZmluaXRpb25fbGlzdCAnfScKLSAgICB7Ci0gICAgICBhdXRvJiYgc3RydWN0X25hbWUgPSAqJDI7Ci0gICAgICBhdXRvJiYgcGFyZW50X3N0cnVjdF9uYW1lID0gKiQ0OwotICAgICAgYXV0byYmIGNvbnN0cmFpbnRzID0gKiQ2OwotICAgICAgYXV0byYmIGZpZWxkX2RlZmluaXRpb25fbGlzdCA9ICokOTsKLQotICAgICAgYXV0byBwYXJlbnRfc3RydWN0ID0gZGVjbHMtPkdldFR5cGVEZWYocGFyZW50X3N0cnVjdF9uYW1lKTsKLSAgICAgIGlmIChwYXJlbnRfc3RydWN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiQ291bGQgbm90IGZpbmQgc3RydWN0ICIgPDwgcGFyZW50X3N0cnVjdF9uYW1lCi0gICAgICAgICAgICAgICAgICA8PCAiIHVzZWQgYXMgcGFyZW50IGZvciAiIDw8IHN0cnVjdF9uYW1lOwotICAgICAgfQotCi0gICAgICBpZiAocGFyZW50X3N0cnVjdC0+R2V0RGVmaW5pdGlvblR5cGUoKSAhPSBUeXBlRGVmOjpUeXBlOjpTVFJVQ1QpIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCBwYXJlbnRfc3RydWN0X25hbWUgPDwgIiBpcyBub3QgYSBzdHJ1Y3QiOwotICAgICAgfQotCi0gICAgICBhdXRvIHN0cnVjdF9kZWZpbml0aW9uID0gbmV3IFN0cnVjdERlZihzdGQ6Om1vdmUoc3RydWN0X25hbWUpLCBzdGQ6Om1vdmUoZmllbGRfZGVmaW5pdGlvbl9saXN0KSwgKFN0cnVjdERlZiopcGFyZW50X3N0cnVjdCk7Ci0gICAgICBzdHJ1Y3RfZGVmaW5pdGlvbi0+QXNzaWduU2l6ZUZpZWxkcygpOwotCi0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0cmFpbnQgOiBjb25zdHJhaW50cykgewotICAgICAgICBjb25zdCBhdXRvJiBjb25zdHJhaW50X25hbWUgPSBjb25zdHJhaW50LmZpcnN0OwotICAgICAgICBjb25zdCBhdXRvJiBjb25zdHJhaW50X3ZhbHVlID0gY29uc3RyYWludC5zZWNvbmQ7Ci0gICAgICAgIERFQlVHKCkgPDwgIlBhcmVudCBjb25zdHJhaW50IG9uICIgPDwgY29uc3RyYWludF9uYW1lOwotICAgICAgICBzdHJ1Y3RfZGVmaW5pdGlvbi0+QWRkUGFyZW50Q29uc3RyYWludChjb25zdHJhaW50X25hbWUsIGNvbnN0cmFpbnRfdmFsdWUpOwotICAgICAgfQotCi0gICAgICAkJCA9IHN0cnVjdF9kZWZpbml0aW9uOwotCi0gICAgICBkZWxldGUgJDI7Ci0gICAgICBkZWxldGUgJDQ7Ci0gICAgICBkZWxldGUgJDY7Ci0gICAgICBkZWxldGUgJDk7Ci0gICAgfQotCi1wYWNrZXRfZGVmaW5pdGlvbgotICA6IFBBQ0tFVCBJREVOVElGSUVSICd7JyBmaWVsZF9kZWZpbml0aW9uX2xpc3QgJ30nICAvKiBQYWNrZXQgd2l0aCBubyBwYXJlbnQgKi8KLSAgICB7Ci0gICAgICBhdXRvJiYgcGFja2V0X25hbWUgPSAqJDI7Ci0gICAgICBhdXRvJiYgZmllbGRfZGVmaW5pdGlvbl9saXN0ID0gKiQ0OwotCi0gICAgICBERUJVRygpIDw8ICJQYWNrZXQgIiA8PCBwYWNrZXRfbmFtZSA8PCAiIHdpdGggbm8gcGFyZW50IjsKLSAgICAgIERFQlVHKCkgPDwgIlBBQ0tFVCBGSUVMRCBMSVNUIFNJWkU6ICIgPDwgZmllbGRfZGVmaW5pdGlvbl9saXN0LnNpemUoKTsKLSAgICAgIGF1dG8gcGFja2V0X2RlZmluaXRpb24gPSBuZXcgUGFja2V0RGVmKHN0ZDo6bW92ZShwYWNrZXRfbmFtZSksIHN0ZDo6bW92ZShmaWVsZF9kZWZpbml0aW9uX2xpc3QpKTsKLSAgICAgIHBhY2tldF9kZWZpbml0aW9uLT5Bc3NpZ25TaXplRmllbGRzKCk7Ci0KLSAgICAgICQkID0gcGFja2V0X2RlZmluaXRpb247Ci0gICAgICBkZWxldGUgJDI7Ci0gICAgICBkZWxldGUgJDQ7Ci0gICAgfQotICB8IFBBQ0tFVCBJREVOVElGSUVSICc6JyBJREVOVElGSUVSICd7JyBmaWVsZF9kZWZpbml0aW9uX2xpc3QgJ30nCi0gICAgewotICAgICAgYXV0byYmIHBhY2tldF9uYW1lID0gKiQyOwotICAgICAgYXV0byYmIHBhcmVudF9wYWNrZXRfbmFtZSA9ICokNDsKLSAgICAgIGF1dG8mJiBmaWVsZF9kZWZpbml0aW9uX2xpc3QgPSAqJDY7Ci0KLSAgICAgIERFQlVHKCkgPDwgIlBhY2tldCAiIDw8IHBhY2tldF9uYW1lIDw8ICIgd2l0aCBwYXJlbnQgIiA8PCBwYXJlbnRfcGFja2V0X25hbWUgPDwgIlxuIjsKLSAgICAgIERFQlVHKCkgPDwgIlBBQ0tFVCBGSUVMRCBMSVNUIFNJWkU6ICIgPDwgZmllbGRfZGVmaW5pdGlvbl9saXN0LnNpemUoKSA8PCAiXG4iOwotCi0gICAgICBhdXRvIHBhcmVudF9wYWNrZXQgPSBkZWNscy0+R2V0UGFja2V0RGVmKHBhcmVudF9wYWNrZXRfbmFtZSk7Ci0gICAgICBpZiAocGFyZW50X3BhY2tldCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIkNvdWxkIG5vdCBmaW5kIHBhY2tldCAiIDw8IHBhcmVudF9wYWNrZXRfbmFtZQotICAgICAgICAgICAgICAgICAgPDwgIiB1c2VkIGFzIHBhcmVudCBmb3IgIiA8PCBwYWNrZXRfbmFtZTsKLSAgICAgIH0KLQotCi0gICAgICBhdXRvIHBhY2tldF9kZWZpbml0aW9uID0gbmV3IFBhY2tldERlZihzdGQ6Om1vdmUocGFja2V0X25hbWUpLCBzdGQ6Om1vdmUoZmllbGRfZGVmaW5pdGlvbl9saXN0KSwgcGFyZW50X3BhY2tldCk7Ci0gICAgICBwYWNrZXRfZGVmaW5pdGlvbi0+QXNzaWduU2l6ZUZpZWxkcygpOwotCi0gICAgICAkJCA9IHBhY2tldF9kZWZpbml0aW9uOwotICAgICAgZGVsZXRlICQyOwotICAgICAgZGVsZXRlICQ0OwotICAgICAgZGVsZXRlICQ2OwotICAgIH0KLSAgfCBQQUNLRVQgSURFTlRJRklFUiAnOicgSURFTlRJRklFUiAnKCcgY29uc3RyYWludF9saXN0ICcpJyAneycgZmllbGRfZGVmaW5pdGlvbl9saXN0ICd9JwotICAgIHsKLSAgICAgIGF1dG8mJiBwYWNrZXRfbmFtZSA9ICokMjsKLSAgICAgIGF1dG8mJiBwYXJlbnRfcGFja2V0X25hbWUgPSAqJDQ7Ci0gICAgICBhdXRvJiYgY29uc3RyYWludHMgPSAqJDY7Ci0gICAgICBhdXRvJiYgZmllbGRfZGVmaW5pdGlvbl9saXN0ID0gKiQ5OwotCi0gICAgICBERUJVRygpIDw8ICJQYWNrZXQgIiA8PCBwYWNrZXRfbmFtZSA8PCAiIHdpdGggcGFyZW50ICIgPDwgcGFyZW50X3BhY2tldF9uYW1lIDw8ICJcbiI7Ci0gICAgICBERUJVRygpIDw8ICJQQUNLRVQgRklFTEQgTElTVCBTSVpFOiAiIDw8IGZpZWxkX2RlZmluaXRpb25fbGlzdC5zaXplKCkgPDwgIlxuIjsKLSAgICAgIERFQlVHKCkgPDwgIkNPTlNUUkFJTlQgTElTVCBTSVpFOiAiIDw8IGNvbnN0cmFpbnRzLnNpemUoKSA8PCAiXG4iOwotCi0gICAgICBhdXRvIHBhcmVudF9wYWNrZXQgPSBkZWNscy0+R2V0UGFja2V0RGVmKHBhcmVudF9wYWNrZXRfbmFtZSk7Ci0gICAgICBpZiAocGFyZW50X3BhY2tldCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIkNvdWxkIG5vdCBmaW5kIHBhY2tldCAiIDw8IHBhcmVudF9wYWNrZXRfbmFtZQotICAgICAgICAgICAgICAgICAgPDwgIiB1c2VkIGFzIHBhcmVudCBmb3IgIiA8PCBwYWNrZXRfbmFtZSA8PCAiXG4iOwotICAgICAgfQotCi0gICAgICBhdXRvIHBhY2tldF9kZWZpbml0aW9uID0gbmV3IFBhY2tldERlZihzdGQ6Om1vdmUocGFja2V0X25hbWUpLCBzdGQ6Om1vdmUoZmllbGRfZGVmaW5pdGlvbl9saXN0KSwgcGFyZW50X3BhY2tldCk7Ci0gICAgICBwYWNrZXRfZGVmaW5pdGlvbi0+QXNzaWduU2l6ZUZpZWxkcygpOwotCi0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbnN0cmFpbnQgOiBjb25zdHJhaW50cykgewotICAgICAgICBjb25zdCBhdXRvJiBjb25zdHJhaW50X25hbWUgPSBjb25zdHJhaW50LmZpcnN0OwotICAgICAgICBjb25zdCBhdXRvJiBjb25zdHJhaW50X3ZhbHVlID0gY29uc3RyYWludC5zZWNvbmQ7Ci0gICAgICAgIERFQlVHKCkgPDwgIlBhcmVudCBjb25zdHJhaW50IG9uICIgPDwgY29uc3RyYWludF9uYW1lOwotICAgICAgICBwYWNrZXRfZGVmaW5pdGlvbi0+QWRkUGFyZW50Q29uc3RyYWludChjb25zdHJhaW50X25hbWUsIGNvbnN0cmFpbnRfdmFsdWUpOwotICAgICAgfQotCi0gICAgICAkJCA9IHBhY2tldF9kZWZpbml0aW9uOwotCi0gICAgICBkZWxldGUgJDI7Ci0gICAgICBkZWxldGUgJDQ7Ci0gICAgICBkZWxldGUgJDY7Ci0gICAgICBkZWxldGUgJDk7Ci0gICAgfQotCi1maWVsZF9kZWZpbml0aW9uX2xpc3QKLSAgOiAvKiBlbXB0eSAqLwotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkVtcHR5IEZpZWxkIGRlZmluaXRpb25cbiI7Ci0gICAgICAkJCA9IG5ldyBGaWVsZExpc3QoKTsKLSAgICB9Ci0gIHwgZmllbGRfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkZpZWxkIGRlZmluaXRpb25cbiI7Ci0gICAgICAkJCA9IG5ldyBGaWVsZExpc3QoKTsKLQotICAgICAgaWYgKCQxLT5HZXRGaWVsZFR5cGUoKSA9PSBHcm91cEZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIGF1dG8gZ3JvdXBfZmllbGRzID0gc3RhdGljX2Nhc3Q8R3JvdXBGaWVsZCo+KCQxKS0+R2V0RmllbGRzKCk7Ci0JRmllbGRMaXN0IHJldmVyc2VkX2ZpZWxkcyhncm91cF9maWVsZHMtPnJiZWdpbigpLCBncm91cF9maWVsZHMtPnJlbmQoKSk7Ci0gICAgICAgIGZvciAoYXV0byYgZmllbGQgOiByZXZlcnNlZF9maWVsZHMpIHsKLSAgICAgICAgICAkJC0+UHJlcGVuZEZpZWxkKGZpZWxkKTsKLSAgICAgICAgfQotCWRlbGV0ZSAkMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgICQkLT5QcmVwZW5kRmllbGQoJDEpOwotICAgIH0KLSAgfCBmaWVsZF9kZWZpbml0aW9uICcsJyBmaWVsZF9kZWZpbml0aW9uX2xpc3QKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJGaWVsZCBkZWZpbml0aW9uIHdpdGggbGlzdFxuIjsKLSAgICAgICQkID0gJDM7Ci0KLSAgICAgIGlmICgkMS0+R2V0RmllbGRUeXBlKCkgPT0gR3JvdXBGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBhdXRvIGdyb3VwX2ZpZWxkcyA9IHN0YXRpY19jYXN0PEdyb3VwRmllbGQqPigkMSktPkdldEZpZWxkcygpOwotCUZpZWxkTGlzdCByZXZlcnNlZF9maWVsZHMoZ3JvdXBfZmllbGRzLT5yYmVnaW4oKSwgZ3JvdXBfZmllbGRzLT5yZW5kKCkpOwotICAgICAgICBmb3IgKGF1dG8mIGZpZWxkIDogcmV2ZXJzZWRfZmllbGRzKSB7Ci0gICAgICAgICAgJCQtPlByZXBlbmRGaWVsZChmaWVsZCk7Ci0gICAgICAgIH0KLQlkZWxldGUgJDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAkJC0+UHJlcGVuZEZpZWxkKCQxKTsKLSAgICB9Ci0KLWZpZWxkX2RlZmluaXRpb24KLSAgOiBncm91cF9maWVsZF9kZWZpbml0aW9uCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiR3JvdXAgRmllbGQiOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0gIHwgdHlwZV9kZWZfZmllbGRfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkZpZWxkIHdpdGggYSBwcmUtZGVmaW5lZCB0eXBlXG4iOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0gIHwgc2NhbGFyX2ZpZWxkX2RlZmluaXRpb24KLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJTY2FsYXIgZmllbGRcbiI7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLSAgfCBjaGVja3N1bV9zdGFydF9maWVsZF9kZWZpbml0aW9uCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiQ2hlY2tzdW0gc3RhcnQgZmllbGRcbiI7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLSAgfCBwYWRkaW5nX2ZpZWxkX2RlZmluaXRpb24KLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJQYWRkaW5nIGZpZWxkXG4iOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0gIHwgc2l6ZV9maWVsZF9kZWZpbml0aW9uCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiU2l6ZSBmaWVsZFxuIjsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotICB8IGJvZHlfZmllbGRfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkJvZHkgZmllbGRcbiI7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLSAgfCBwYXlsb2FkX2ZpZWxkX2RlZmluaXRpb24KLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJQYXlsb2FkIGZpZWxkXG4iOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0gIHwgZml4ZWRfZmllbGRfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkZpeGVkIGZpZWxkXG4iOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0gIHwgcmVzZXJ2ZWRfZmllbGRfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIlJlc2VydmVkIGZpZWxkXG4iOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0gIHwgYXJyYXlfZmllbGRfZGVmaW5pdGlvbgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkFSUkFZIGZpZWxkXG4iOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLWdyb3VwX2ZpZWxkX2RlZmluaXRpb24KLSAgOiBJREVOVElGSUVSCi0gICAgewotICAgICAgYXV0byBncm91cCA9IGRlY2xzLT5HZXRHcm91cERlZigqJDEpOwotICAgICAgaWYgKGdyb3VwID09IG51bGxwdHIpIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiQ291bGQgbm90IGZpbmQgZ3JvdXAgd2l0aCBuYW1lICIgPDwgKiQxOwotICAgICAgfQotCi0gICAgICBzdGQ6Omxpc3Q8UGFja2V0RmllbGQqPiogZXhwYW5kZWRfZmllbGRzOwotICAgICAgZXhwYW5kZWRfZmllbGRzID0gbmV3IHN0ZDo6bGlzdDxQYWNrZXRGaWVsZCo+KGdyb3VwLT5iZWdpbigpLCBncm91cC0+ZW5kKCkpOwotICAgICAgJCQgPSBuZXcgR3JvdXBGaWVsZChMT0MsIGV4cGFuZGVkX2ZpZWxkcyk7Ci0gICAgICBkZWxldGUgJDE7Ci0gICAgfQotICB8IElERU5USUZJRVIgJ3snIGNvbnN0cmFpbnRfbGlzdCAnfScKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJHcm91cCB3aXRoIGZpeGVkIGZpZWxkKHMpICIgPDwgKiQxIDw8ICJcbiI7Ci0gICAgICBhdXRvIGdyb3VwID0gZGVjbHMtPkdldEdyb3VwRGVmKCokMSk7Ci0gICAgICBpZiAoZ3JvdXAgPT0gbnVsbHB0cikgewotICAgICAgICBFUlJPUkxPQyhMT0MpIDw8ICJDb3VsZCBub3QgZmluZCBncm91cCB3aXRoIG5hbWUgIiA8PCAqJDE7Ci0gICAgICB9Ci0KLSAgICAgIHN0ZDo6bGlzdDxQYWNrZXRGaWVsZCo+KiBleHBhbmRlZF9maWVsZHMgPSBuZXcgc3RkOjpsaXN0PFBhY2tldEZpZWxkKj4oKTsKLSAgICAgIGZvciAoY29uc3QgYXV0byBmaWVsZCA6ICpncm91cCkgewotICAgICAgICBjb25zdCBhdXRvIGNvbnN0cmFpbnQgPSAkMy0+ZmluZChmaWVsZC0+R2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGNvbnN0cmFpbnQgIT0gJDMtPmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgICAgREVCVUcoKSA8PCAiRml4aW5nIGdyb3VwIHNjYWxhciB2YWx1ZVxuIjsKLSAgICAgICAgICAgIGV4cGFuZGVkX2ZpZWxkcy0+cHVzaF9iYWNrKG5ldyBGaXhlZFNjYWxhckZpZWxkKGZpZWxkLT5HZXRTaXplKCkuYml0cygpLCBzdGQ6OmdldDxpbnQ2NF90Pihjb25zdHJhaW50LT5zZWNvbmQpLCBMT0MpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBFbnVtRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgICAgIERFQlVHKCkgPDwgIkZpeGluZyBncm91cCBlbnVtIHZhbHVlXG4iOwotCi0gICAgICAgICAgICBhdXRvIHR5cGVfZGVmID0gZGVjbHMtPkdldFR5cGVEZWYoZmllbGQtPkdldERhdGFUeXBlKCkpOwotICAgICAgICAgICAgRW51bURlZiogZW51bV9kZWYgPSAodHlwZV9kZWYtPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZURlZjo6VHlwZTo6RU5VTSA/IChFbnVtRGVmKil0eXBlX2RlZiA6IG51bGxwdHIpOwotICAgICAgICAgICAgaWYgKGVudW1fZGVmID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiTm8gZW51bSBmb3VuZCBvZiB0eXBlICIgPDwgZmllbGQtPkdldERhdGFUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWVudW1fZGVmLT5IYXNFbnRyeShzdGQ6OmdldDxzdGQ6OnN0cmluZz4oY29uc3RyYWludC0+c2Vjb25kKSkpIHsKLSAgICAgICAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiRW51bSAiIDw8IGZpZWxkLT5HZXREYXRhVHlwZSgpIDw8ICIgaGFzIG5vIGVudW1lcmF0aW9uICIgPDwgc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KGNvbnN0cmFpbnQtPnNlY29uZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV4cGFuZGVkX2ZpZWxkcy0+cHVzaF9iYWNrKG5ldyBGaXhlZEVudW1GaWVsZChlbnVtX2RlZiwgc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KGNvbnN0cmFpbnQtPnNlY29uZCksIExPQykpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFUlJPUkxPQyhMT0MpIDw8ICJVbmltcGxlbWVudGVkIGNvbnN0cmFpbnQgb2YgdHlwZSAiIDw8IGZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgJDMtPmVyYXNlKGNvbnN0cmFpbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV4cGFuZGVkX2ZpZWxkcy0+cHVzaF9iYWNrKGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCQzLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIkNvdWxkIG5vdCBmaW5kIG1lbWJlciAiIDw8ICQzLT5iZWdpbigpLT5maXJzdCA8PCAiIGluIGdyb3VwICIgPDwgKiQxOwotICAgICAgfQotCi0gICAgICAkJCA9IG5ldyBHcm91cEZpZWxkKExPQywgZXhwYW5kZWRfZmllbGRzKTsKLSAgICAgIGRlbGV0ZSAkMTsKLSAgICAgIGRlbGV0ZSAkMzsKLSAgICB9Ci0KLWNvbnN0cmFpbnRfbGlzdAotICA6IGNvbnN0cmFpbnQgJywnIGNvbnN0cmFpbnRfbGlzdAotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkdyb3VwIGZpZWxkIHZhbHVlIGxpc3RcbiI7Ci0gICAgICAkMy0+aW5zZXJ0KCokMSk7Ci0gICAgICAkJCA9ICQzOwotICAgICAgZGVsZXRlKCQxKTsKLSAgICB9Ci0gIHwgY29uc3RyYWludAotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkdyb3VwIGZpZWxkIHZhbHVlXG4iOwotICAgICAgJCQgPSBuZXcgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmFyaWFudDxpbnQ2NF90LCBzdGQ6OnN0cmluZz4+KCk7Ci0gICAgICAkJC0+aW5zZXJ0KCokMSk7Ci0gICAgICBkZWxldGUoJDEpOwotICAgIH0KLQotY29uc3RyYWludAotICA6IElERU5USUZJRVIgJz0nIElOVEVHRVIKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJHcm91cCB3aXRoIGEgZml4ZWQgaW50ZWdlciB2YWx1ZT0iIDw8ICQxIDw8ICIgdmFsdWU9IiA8PCAkMyA8PCAiXG4iOwotCi0gICAgICAkJCA9IG5ldyBzdGQ6OnBhaXIoKiQxLCBzdGQ6OnZhcmlhbnQ8aW50NjRfdCxzdGQ6OnN0cmluZz4oJDMpKTsKLSAgICAgIGRlbGV0ZSAkMTsKLSAgICB9Ci0gIHwgSURFTlRJRklFUiAnPScgSURFTlRJRklFUgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkdyb3VwIHdpdGggYSBmaXhlZCBlbnVtIGZpZWxkIHZhbHVlPSIgPDwgKiQzIDw8ICIgZW51bT0iIDw8ICokMTsKLQotICAgICAgJCQgPSBuZXcgc3RkOjpwYWlyKCokMSwgc3RkOjp2YXJpYW50PGludDY0X3Qsc3RkOjpzdHJpbmc+KCokMykpOwotICAgICAgZGVsZXRlICQxOwotICAgICAgZGVsZXRlICQzOwotICAgIH0KLQotdHlwZV9kZWZfZmllbGRfZGVmaW5pdGlvbgotICA6IElERU5USUZJRVIgJzonIElERU5USUZJRVIKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJQcmVkZWZpbmVkIHR5cGUgZmllbGQgIiA8PCAqJDEgPDwgIiA6ICIgPDwgKiQzIDw8ICJcbiI7Ci0gICAgICBpZiAoYXV0byB0eXBlX2RlZiA9IGRlY2xzLT5HZXRUeXBlRGVmKCokMykpIHsKLSAgICAgICAgJCQgPSB0eXBlX2RlZi0+R2V0TmV3RmllbGQoKiQxLCBMT0MpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiTm8gdHlwZSB3aXRoIHRoaXMgbmFtZVxuIjsKLSAgICAgIH0KLSAgICAgIGRlbGV0ZSAkMTsKLSAgICAgIGRlbGV0ZSAkMzsKLSAgICB9Ci0KLXNjYWxhcl9maWVsZF9kZWZpbml0aW9uCi0gIDogSURFTlRJRklFUiAnOicgSU5URUdFUgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIlNjYWxhciBmaWVsZCAiIDw8ICokMSA8PCAiIDogIiA8PCAkMyA8PCAiXG4iOwotICAgICAgJCQgPSBuZXcgU2NhbGFyRmllbGQoKiQxLCAkMywgTE9DKTsKLSAgICAgIGRlbGV0ZSAkMTsKLSAgICB9Ci0KLWJvZHlfZmllbGRfZGVmaW5pdGlvbgotICA6IEJPRFkKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJCb2R5IGZpZWxkXG4iOwotICAgICAgJCQgPSBuZXcgQm9keUZpZWxkKExPQyk7Ci0gICAgfQotCi1wYXlsb2FkX2ZpZWxkX2RlZmluaXRpb24KLSAgOiBQQVlMT0FEICc6JyAnWycgU0laRV9NT0RJRklFUiAnXScKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJQYXlsb2FkIGZpZWxkIHdpdGggbW9kaWZpZXIgIiA8PCAqJDQgPDwgIlxuIjsKLSAgICAgICQkID0gbmV3IFBheWxvYWRGaWVsZCgqJDQsIExPQyk7Ci0gICAgICBkZWxldGUgJDQ7Ci0gICAgfQotICB8IFBBWUxPQUQKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJQYXlsb2FkIGZpZWxkXG4iOwotICAgICAgJCQgPSBuZXcgUGF5bG9hZEZpZWxkKCIiLCBMT0MpOwotICAgIH0KLQotY2hlY2tzdW1fc3RhcnRfZmllbGRfZGVmaW5pdGlvbgotICA6IENIRUNLU1VNX1NUQVJUICcoJyBJREVOVElGSUVSICcpJwotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkNoZWNrc3VtU3RhcnQgZmllbGQgZGVmaW5lZFxuIjsKLSAgICAgICQkID0gbmV3IENoZWNrc3VtU3RhcnRGaWVsZCgqJDMsIExPQyk7Ci0gICAgICBkZWxldGUgJDM7Ci0gICAgfQotCi1wYWRkaW5nX2ZpZWxkX2RlZmluaXRpb24KLSAgOiBQQURESU5HICdbJyBJTlRFR0VSICddJwotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIlBhZGRpbmcgZmllbGQgZGVmaW5lZFxuIjsKLSAgICAgICQkID0gbmV3IFBhZGRpbmdGaWVsZCgkMywgTE9DKTsKLSAgICB9Ci0KLXNpemVfZmllbGRfZGVmaW5pdGlvbgotICA6IFNJWkUgJygnIElERU5USUZJRVIgJyknICc6JyBJTlRFR0VSCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiU2l6ZSBmaWVsZCBkZWZpbmVkXG4iOwotICAgICAgJCQgPSBuZXcgU2l6ZUZpZWxkKCokMywgJDYsIExPQyk7Ci0gICAgICBkZWxldGUgJDM7Ci0gICAgfQotICB8IFNJWkUgJygnIFBBWUxPQUQgJyknICc6JyBJTlRFR0VSCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiU2l6ZSBmb3IgcGF5bG9hZCBkZWZpbmVkXG4iOwotICAgICAgJCQgPSBuZXcgU2l6ZUZpZWxkKCJwYXlsb2FkIiwgJDYsIExPQyk7Ci0gICAgfQotICB8IFNJWkUgJygnIEJPRFkgJyknICc6JyBJTlRFR0VSCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiU2l6ZSBmb3IgYm9keSBkZWZpbmVkXG4iOwotICAgICAgJCQgPSBuZXcgU2l6ZUZpZWxkKCJib2R5IiwgJDYsIExPQyk7Ci0gICAgfQotICB8IENPVU5UICcoJyBJREVOVElGSUVSICcpJyAnOicgSU5URUdFUgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkNvdW50IGZpZWxkIGRlZmluZWRcbiI7Ci0gICAgICAkJCA9IG5ldyBDb3VudEZpZWxkKCokMywgJDYsIExPQyk7Ci0gICAgICBkZWxldGUgJDM7Ci0gICAgfQotCi1maXhlZF9maWVsZF9kZWZpbml0aW9uCi0gIDogRklYRUQgJz0nIElOVEVHRVIgJzonIElOVEVHRVIKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJGaXhlZCBmaWVsZCBkZWZpbmVkIHZhbHVlPSIgPDwgJDMgPDwgIiBzaXplPSIgPDwgJDUgPDwgIlxuIjsKLSAgICAgICQkID0gbmV3IEZpeGVkU2NhbGFyRmllbGQoJDUsICQzLCBMT0MpOwotICAgIH0KLSAgfCBGSVhFRCAnPScgSURFTlRJRklFUiAnOicgSURFTlRJRklFUgotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkZpeGVkIGVudW0gZmllbGQgZGVmaW5lZCB2YWx1ZT0iIDw8ICokMyA8PCAiIGVudW09IiA8PCAqJDU7Ci0gICAgICBhdXRvIHR5cGVfZGVmID0gZGVjbHMtPkdldFR5cGVEZWYoKiQ1KTsKLSAgICAgIGlmICh0eXBlX2RlZiAhPSBudWxscHRyKSB7Ci0gICAgICAgIEVudW1EZWYqIGVudW1fZGVmID0gKHR5cGVfZGVmLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OkVOVU0gPyAoRW51bURlZiopdHlwZV9kZWYgOiBudWxscHRyKTsKLSAgICAgICAgaWYgKCFlbnVtX2RlZi0+SGFzRW50cnkoKiQzKSkgewotICAgICAgICAgIEVSUk9STE9DKExPQykgPDwgIlByZXZpb3VzbHkgZGVmaW5lZCBlbnVtICIgPDwgZW51bV9kZWYtPkdldFR5cGVOYW1lKCkgPDwgIiBoYXMgbm8gZW50cnkgZm9yICIgPDwgKiQzOwotICAgICAgICB9Ci0KLSAgICAgICAgJCQgPSBuZXcgRml4ZWRFbnVtRmllbGQoZW51bV9kZWYsICokMywgTE9DKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIk5vIGVudW0gZm91bmQgd2l0aCBuYW1lICIgPDwgKiQ1OwotICAgICAgfQotCi0gICAgICBkZWxldGUgJDM7Ci0gICAgICBkZWxldGUgJDU7Ci0gICAgfQotCi1yZXNlcnZlZF9maWVsZF9kZWZpbml0aW9uCi0gIDogUkVTRVJWRUQgJzonIElOVEVHRVIKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJSZXNlcnZlZCBmaWVsZCBvZiBzaXplPSIgPDwgJDMgPDwgIlxuIjsKLSAgICAgICQkID0gbmV3IFJlc2VydmVkRmllbGQoJDMsIExPQyk7Ci0gICAgfQotCi1hcnJheV9maWVsZF9kZWZpbml0aW9uCi0gIDogSURFTlRJRklFUiAnOicgSU5URUdFUiAnWycgJ10nCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiVmVjdG9yIGZpZWxkIGRlZmluZWQgbmFtZT0iIDw8ICokMSA8PCAiIGVsZW1lbnRfc2l6ZT0iIDw8ICQzOwotICAgICAgJCQgPSBuZXcgVmVjdG9yRmllbGQoKiQxLCAkMywgIiIsIExPQyk7Ci0gICAgICBkZWxldGUgJDE7Ci0gICAgfQotICB8IElERU5USUZJRVIgJzonIElOVEVHRVIgJ1snIFNJWkVfTU9ESUZJRVIgJ10nCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiVmVjdG9yIGZpZWxkIGRlZmluZWQgbmFtZT0iIDw8ICokMSA8PCAiIGVsZW1lbnRfc2l6ZT0iIDw8ICQzCi0gICAgICAgICAgICAgPDwgIiBzaXplX21vZGlmaWVyPSIgPDwgKiQ1OwotICAgICAgJCQgPSBuZXcgVmVjdG9yRmllbGQoKiQxLCAkMywgKiQ1LCBMT0MpOwotICAgICAgZGVsZXRlICQxOwotICAgICAgZGVsZXRlICQ1OwotICAgIH0KLSAgfCBJREVOVElGSUVSICc6JyBJTlRFR0VSICdbJyBJTlRFR0VSICddJwotICAgIHsKLSAgICAgIERFQlVHKCkgPDwgIkFycmF5IGZpZWxkIGRlZmluZWQgbmFtZT0iIDw8ICokMSA8PCAiIGVsZW1lbnRfc2l6ZT0iIDw8ICQzCi0gICAgICAgICAgICAgPDwgIiBmaXhlZF9zaXplPSIgPDwgJDU7Ci0gICAgICAkJCA9IG5ldyBBcnJheUZpZWxkKCokMSwgJDMsICQ1LCBMT0MpOwotICAgICAgZGVsZXRlICQxOwotICAgIH0KLSAgfCBJREVOVElGSUVSICc6JyBJREVOVElGSUVSICdbJyAnXScKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJWZWN0b3IgZmllbGQgZGVmaW5lZCBuYW1lPSIgPDwgKiQxIDw8ICIgdHlwZT0iIDw8ICokMzsKLSAgICAgIGlmIChhdXRvIHR5cGVfZGVmID0gZGVjbHMtPkdldFR5cGVEZWYoKiQzKSkgewotICAgICAgICAkJCA9IG5ldyBWZWN0b3JGaWVsZCgqJDEsIHR5cGVfZGVmLCAiIiwgTE9DKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIkNhbid0IGZpbmQgdHlwZSB1c2VkIGluIGFycmF5IGZpZWxkLiI7Ci0gICAgICB9Ci0gICAgICBkZWxldGUgJDE7Ci0gICAgICBkZWxldGUgJDM7Ci0gICAgfQotICB8IElERU5USUZJRVIgJzonIElERU5USUZJRVIgJ1snIFNJWkVfTU9ESUZJRVIgJ10nCi0gICAgewotICAgICAgREVCVUcoKSA8PCAiVmVjdG9yIGZpZWxkIGRlZmluZWQgbmFtZT0iIDw8ICokMSA8PCAiIHR5cGU9IiA8PCAqJDMKLSAgICAgICAgICAgICA8PCAiIHNpemVfbW9kaWZpZXI9IiA8PCAqJDU7Ci0gICAgICBpZiAoYXV0byB0eXBlX2RlZiA9IGRlY2xzLT5HZXRUeXBlRGVmKCokMykpIHsKLSAgICAgICAgJCQgPSBuZXcgVmVjdG9yRmllbGQoKiQxLCB0eXBlX2RlZiwgKiQ1LCBMT0MpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRVJST1JMT0MoTE9DKSA8PCAiQ2FuJ3QgZmluZCB0eXBlIHVzZWQgaW4gYXJyYXkgZmllbGQuIjsKLSAgICAgIH0KLSAgICAgIGRlbGV0ZSAkMTsKLSAgICAgIGRlbGV0ZSAkMzsKLSAgICAgIGRlbGV0ZSAkNTsKLSAgICB9Ci0gIHwgSURFTlRJRklFUiAnOicgSURFTlRJRklFUiAnWycgSU5URUdFUiAnXScKLSAgICB7Ci0gICAgICBERUJVRygpIDw8ICJBcnJheSBmaWVsZCBkZWZpbmVkIG5hbWU9IiA8PCAqJDEgPDwgIiB0eXBlPSIgPDwgKiQzCi0gICAgICAgICAgICAgPDwgIiBmaXhlZF9zaXplPSIgPDwgJDU7Ci0gICAgICBpZiAoYXV0byB0eXBlX2RlZiA9IGRlY2xzLT5HZXRUeXBlRGVmKCokMykpIHsKLSAgICAgICAgJCQgPSBuZXcgQXJyYXlGaWVsZCgqJDEsIHR5cGVfZGVmLCAkNSwgTE9DKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVSUk9STE9DKExPQykgPDwgIkNhbid0IGZpbmQgdHlwZSB1c2VkIGluIGFycmF5IGZpZWxkLiI7Ci0gICAgICB9Ci0gICAgICBkZWxldGUgJDE7Ci0gICAgICBkZWxldGUgJDM7Ci0gICAgfQotCi0lJQotCi0KLXZvaWQgeXk6OnBhcnNlcjo6ZXJyb3IoY29uc3QgeXk6OnBhcnNlcjo6bG9jYXRpb25fdHlwZSYgbG9jLCBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IpIHsKLSAgRVJST1IoKSA8PCBlcnJvciA8PCAiIGF0IGxvY2F0aW9uICIgPDwgbG9jIDw8ICJcbiI7Ci0gIGFib3J0KCk7Ci19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL2xvZ2dpbmcuaCBiL2dkL3BhY2tldC9wYXJzZXIvbG9nZ2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjkzOWVmLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvbG9nZ2luZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAicGFyc2VfbG9jYXRpb24uaCIKLQotY2xhc3MgTG9nZ2FibGUgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+TG9nZ2FibGUoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGVidWdOYW1lKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIFBhcnNlTG9jYXRpb24gR2V0TG9jYXRpb24oKSBjb25zdCA9IDA7Ci19OwotCi1jbGFzcyBMb2dNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIExvZ01lc3NhZ2UoUGFyc2VMb2NhdGlvbiBsb2MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBMb2dnYWJsZSo+IHRva2VucykKLSAgICAgIDogZGVidWdfKGZhbHNlKSwgbG9jXyhsb2MpLCB0b2tlbnNfKHRva2VucykgewotICAgIEluaXQoKTsKLSAgfQotCi0gIExvZ01lc3NhZ2UoYm9vbCBkZWJ1Zywgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IExvZ2dhYmxlKj4gdG9rZW5zKSA6IGRlYnVnXyhkZWJ1ZyksIHRva2Vuc18odG9rZW5zKSB7Ci0gICAgSW5pdCgpOwotICB9Ci0KLSAgdm9pZCBJbml0KCkgewotICAgIGlmIChsb2NfLkdldExpbmUoKSAhPSAtMSkgewotICAgICAgc3RyZWFtXyA8PCAiXDAzM1sxbUxpbmUgIiA8PCBsb2NfLkdldExpbmUoKSA8PCAiOiAiOwotICAgIH0KLQotICAgIGlmICghZGVidWdfKSB7Ci0gICAgICBzdHJlYW1fIDw8ICJcMDMzWzE7MzFtIjsKLSAgICAgIHN0cmVhbV8gPDwgIkVSUk9SOiAiOwotICAgICAgc3RyZWFtXyA8PCAiXDAzM1swbSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cmVhbV8gPDwgIlwwMzNbMTttIjsKLSAgICAgIHN0cmVhbV8gPDwgIkRFQlVHOiAiOwotICAgICAgc3RyZWFtXyA8PCAiXDAzM1swbSI7Ci0gICAgfQotICB9Ci0KLSAgfkxvZ01lc3NhZ2UoKSB7Ci0gICAgaWYgKGRlYnVnXyAmJiBzdXBwcmVzc19kZWJ1Z18pIHJldHVybjsKLQotICAgIHN0ZDo6Y2VyciA8PCBzdHJlYW1fLnN0cigpIDw8ICJcbiI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiB0b2tlbiA6IHRva2Vuc18pIHsKLSAgICAgIC8vIEJvbGQgbGluZSBudW1iZXIKLSAgICAgIHN0ZDo6Y2VyciA8PCAiXDAzM1sxbSI7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIiAgTGluZSAiIDw8IHRva2VuLT5HZXRMb2NhdGlvbigpLkdldExpbmUoKSA8PCAiOiAiOwotICAgICAgc3RkOjpjZXJyIDw8ICJcMDMzWzBtIjsKLSAgICAgIHN0ZDo6Y2VyciA8PCB0b2tlbi0+R2V0RGVidWdOYW1lKCkgPDwgIlxuIjsKLSAgICB9Ci0KLSAgICBpZiAoIWRlYnVnXykgewotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIHsKLSAgICByZXR1cm4gc3RyZWFtXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbV87Ci0gIGJvb2wgZGVidWdfOwotICBib29sIHN1cHByZXNzX2RlYnVnX3t0cnVlfTsKLSAgUGFyc2VMb2NhdGlvbiBsb2NfOwotICBzdGQ6OnZlY3Rvcjxjb25zdCBMb2dnYWJsZSo+IHRva2Vuc187Ci19OwotCi0vLyBFcnJvciBMb2cgc3RyZWFtLiBBYm9ydHMgdGhlIHByb2dyYW0gYWZ0ZXIgdGhlIG1lc3NhZ2UgaXMgcHJpbnRlZC4KLS8vIFRoZSBhcmd1bWVudHMgdG8gdGhlIG1hY3JvIGlzIGEgbGlzdCBvZiBMb2dnYWJsZSBvYmplY3RzIHRoYXQgYXJlIHByaW50ZWQgd2hlbiB0aGUgZXJyb3IgaXMgcHJpbnRlZC4KLSNkZWZpbmUgRVJST1IoLi4uKSBMb2dNZXNzYWdlKGZhbHNlLCB7X19WQV9BUkdTX199KS5zdHJlYW0oKQotCi0vLyBQYXJzZUxvY2F0aW9uIGVycm9yIGxvZywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgbG9jYXRpb24uCi0jZGVmaW5lIEVSUk9STE9DKF8xLCAuLi4pIExvZ01lc3NhZ2UoXzEsIHtfX1ZBX0FSR1NfX30pLnN0cmVhbSgpCi0KLSNkZWZpbmUgREVCVUcoLi4uKSBMb2dNZXNzYWdlKHRydWUsIHtfX1ZBX0FSR1NfX30pLnN0cmVhbSgpCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL21haW4uY2MgYi9nZC9wYWNrZXQvcGFyc2VyL21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDQ0MWQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGZpbGVzeXN0ZW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHJlZ2V4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZGVjbGFyYXRpb25zLmgiCi0jaW5jbHVkZSAic3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgImxhbmd1YWdlX3kuaCIKLQotCi1pbnQgeXlsZXhfaW5pdCh2b2lkKiopOwotaW50IHl5bGV4X2Rlc3Ryb3kodm9pZCopOwotdm9pZCB5eXNldF9kZWJ1ZyhpbnQsIHZvaWQqKTsKLXZvaWQgeXlzZXRfaW4oRklMRSosIHZvaWQqKTsKLQotYm9vbCBnZW5lcmF0ZV9jcHBfaGVhZGVyc19vbmVfZmlsZSgKLSAgICBjb25zdCBEZWNsYXJhdGlvbnMmIGRlY2xzLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgaW5wdXRfZmlsZSwKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGluY2x1ZGVfZGlyLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgb3V0X2RpciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9uYW1lc3BhY2UpOwotCi1ib29sIGdlbmVyYXRlX3B5YmluZDExX3NvdXJjZXNfb25lX2ZpbGUoCi0gICAgY29uc3QgRGVjbGFyYXRpb25zJiBkZWNscywKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGlucHV0X2ZpbGUsCi0gICAgY29uc3Qgc3RkOjpmaWxlc3lzdGVtOjpwYXRoJiBpbmNsdWRlX2RpciwKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIG91dF9kaXIsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RfbmFtZXNwYWNlLAotICAgIHNpemVfdCBudW1fc2hhcmRzKTsKLQotYm9vbCBnZW5lcmF0ZV9ydXN0X3NvdXJjZV9vbmVfZmlsZSgKLSAgICBjb25zdCBEZWNsYXJhdGlvbnMmIGRlY2xzLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgaW5wdXRfZmlsZSwKLSAgICBjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGluY2x1ZGVfZGlyLAotICAgIGNvbnN0IHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCYgb3V0X2RpciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9uYW1lc3BhY2UpOwotCi1ib29sIHBhcnNlX2RlY2xhcmF0aW9uc19vbmVfZmlsZShjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGlucHV0X2ZpbGUsIERlY2xhcmF0aW9ucyogZGVjbGFyYXRpb25zKSB7Ci0gIHZvaWQqIHNjYW5uZXI7Ci0gIHl5bGV4X2luaXQoJnNjYW5uZXIpOwotCi0gIEZJTEUqIGluX2ZpbGUgPSBmb3BlbihpbnB1dF9maWxlLnN0cmluZygpLmNfc3RyKCksICJyIik7Ci0gIGlmIChpbl9maWxlID09IG51bGxwdHIpIHsKLSAgICBzdGQ6OmNlcnIgPDwgImNhbid0IG9wZW4gIiA8PCBpbnB1dF9maWxlIDw8ICI6ICIgPDwgc3RyZXJyb3IoZXJybm8pIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB5eXNldF9pbihpbl9maWxlLCBzY2FubmVyKTsKLQotICBpbnQgcmV0ID0geXk6OnBhcnNlcihzY2FubmVyLCBkZWNsYXJhdGlvbnMpLnBhcnNlKCk7Ci0gIGlmIChyZXQgIT0gMCkgewotICAgIHN0ZDo6Y2VyciA8PCAieXlsZXggcGFyc2luZyBmYWlsZWQ6IHJldHVybmVkICIgPDwgcmV0IDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB5eWxleF9kZXN0cm95KHNjYW5uZXIpOwotCi0gIGZjbG9zZShpbl9maWxlKTsKLQotICAvLyBTZXQgZW5kaWFuZXNzIGJlZm9yZSByZXR1cm5pbmcKLSAgZm9yIChhdXRvJiBzIDogZGVjbGFyYXRpb25zLT50eXBlX2RlZnNfcXVldWVfKSB7Ci0gICAgaWYgKHMuc2Vjb25kLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGVEZWY6OlR5cGU6OlNUUlVDVCkgewotICAgICAgYXV0byogc3RydWN0X2RlZiA9IHN0YXRpY19jYXN0PFN0cnVjdERlZio+KHMuc2Vjb25kKTsKLSAgICAgIHN0cnVjdF9kZWYtPlNldEVuZGlhbm5lc3MoZGVjbGFyYXRpb25zLT5pc19saXR0bGVfZW5kaWFuKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGF1dG8mIHBhY2tldF9kZWYgOiBkZWNsYXJhdGlvbnMtPnBhY2tldF9kZWZzX3F1ZXVlXykgewotICAgIHBhY2tldF9kZWYuc2Vjb25kLT5TZXRFbmRpYW5uZXNzKGRlY2xhcmF0aW9ucy0+aXNfbGl0dGxlX2VuZGlhbik7Ci0gICAgaWYgKHBhY2tldF9kZWYuc2Vjb25kLT5wYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICAgIHBhY2tldF9kZWYuc2Vjb25kLT5wYXJlbnRfLT5jaGlsZHJlbl8ucHVzaF9iYWNrKHBhY2tldF9kZWYuc2Vjb25kKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVE9ETyhiLzE0MTU4MzgwOSk6IHN0b3AgbGVha3MKLWV4dGVybiAiQyIgY29uc3QgY2hhciogX19hc2FuX2RlZmF1bHRfb3B0aW9ucygpIHsKLSAgcmV0dXJuICJkZXRlY3RfbGVha3M9MCI7Ci19Ci0KLXZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZykgewotICBhdXRvJiBvZnMgPSBzdGQ6OmNlcnI7Ci0KLSAgb2ZzIDw8ICJVc2FnZTogIiA8PCBwcm9nIDw8ICIgW09QVElPTlNdIGZpbGUxIGZpbGUyLi4uIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgb2ZzIDw8IHN0ZDo6c2V0dygyNCkgPDwgIi0tb3V0PSAiOwotICBvZnMgPDwgIlJvb3QgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgb3V0cHV0IChyZWxhdGl2ZSB0byBjd2QpLiIgPDwgc3RkOjplbmRsOwotCi0gIG9mcyA8PCBzdGQ6OnNldHcoMjQpIDw8ICItLWluY2x1ZGU9ICI7Ci0gIG9mcyA8PCAiR2VuZXJhdGUgbmFtZXNwYWNlcyByZWxhdGl2ZSB0byB0aGlzIHBhdGggcGVyIGZpbGUuIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgb2ZzIDw8IHN0ZDo6c2V0dygyNCkgPDwgIi0tcm9vdF9uYW1lc3BhY2U9ICI7Ci0gIG9mcyA8PCAiQ2hhbmdlIHJvb3QgbmFtZXNwYWNlIChkZWZhdWx0ID0gYmx1ZXRvb3RoKS4iIDw8IHN0ZDo6ZW5kbDsKLQotICBvZnMgPDwgc3RkOjpzZXR3KDI0KSA8PCAiLS1zb3VyY2Vfcm9vdD0gIjsKLSAgb2ZzIDw8ICJSb290IHBhdGggdG8gdGhlIHNvdXJjZSBkaXJlY3RvcnkuIEZpbmQgaW5wdXQgZmlsZXMgcmVsYXRpdmUgdG8gdGhpcy4iIDw8IHN0ZDo6ZW5kbDsKLQotICBvZnMgPDwgc3RkOjpzZXR3KDI0KSA8PCAiLS1udW1fc2hhcmRzPSAiOwotICBvZnMgPDwgIk51bWJlciBvZiBzaGFyZHMgcGVyIG91dHB1dCBweWJpbmQxMSBjYyBmaWxlLiIgPDwgc3RkOjplbmRsOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhcioqIGFyZ3YpIHsKLSAgc3RkOjpmaWxlc3lzdGVtOjpwYXRoIG91dF9kaXI7Ci0gIHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCBpbmNsdWRlX2RpcjsKLSAgc3RkOjpmaWxlc3lzdGVtOjpwYXRoIGN3ZCA9IHN0ZDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCk7Ci0gIHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aCBzb3VyY2Vfcm9vdCA9IGN3ZDsKLSAgc3RkOjpzdHJpbmcgcm9vdF9uYW1lc3BhY2UgPSAiYmx1ZXRvb3RoIjsKLSAgLy8gTnVtYmVyIG9mIHNoYXJkcyBwZXIgb3V0cHV0IHB5YmluZDExIGNjIGZpbGUKLSAgc2l6ZV90IG51bV9zaGFyZHMgPSAxOwotICBib29sIGdlbmVyYXRlX3J1c3QgPSBmYWxzZTsKLSAgc3RkOjpxdWV1ZTxzdGQ6OmZpbGVzeXN0ZW06OnBhdGg+IGlucHV0X2ZpbGVzOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19vdXQgPSAiLS1vdXQ9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX2luY2x1ZGUgPSAiLS1pbmNsdWRlPSI7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGFyZ19uYW1lc3BhY2UgPSAiLS1yb290X25hbWVzcGFjZT0iOwotICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfbnVtX3NoYXJkcyA9ICItLW51bV9zaGFyZHM9IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX3J1c3QgPSAiLS1ydXN0IjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX3NvdXJjZV9yb290ID0gIi0tc291cmNlX3Jvb3Q9IjsKLQotICAvLyBQYXJzZSB0aGUgc291cmNlIHJvb3QgZmlyc3QgKGlmIGl0IGV4aXN0cykgc2luY2UgaXQgd2lsbCBiZSB1c2VkIGZvciBvdGhlcgotICAvLyBwYXRocy4KLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBzdGQ6OnN0cmluZyBhcmcgPSBhcmd2W2ldOwotICAgIGlmIChhcmcuZmluZChhcmdfc291cmNlX3Jvb3QpID09IDApIHsKLSAgICAgIHNvdXJjZV9yb290ID0gc3RkOjpmaWxlc3lzdGVtOjpwYXRoKGFyZy5zdWJzdHIoYXJnX3NvdXJjZV9yb290LnNpemUoKSkpOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgc3RkOjpzdHJpbmcgYXJnID0gYXJndltpXTsKLSAgICBpZiAoYXJnLmZpbmQoYXJnX291dCkgPT0gMCkgewotICAgICAgb3V0X2RpciA9IGN3ZCAvIHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aChhcmcuc3Vic3RyKGFyZ19vdXQuc2l6ZSgpKSk7Ci0gICAgfSBlbHNlIGlmIChhcmcuZmluZChhcmdfaW5jbHVkZSkgPT0gMCkgewotICAgICAgaW5jbHVkZV9kaXIgPSBzb3VyY2Vfcm9vdCAvIHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aChhcmcuc3Vic3RyKGFyZ19pbmNsdWRlLnNpemUoKSkpOwotICAgIH0gZWxzZSBpZiAoYXJnLmZpbmQoYXJnX25hbWVzcGFjZSkgPT0gMCkgewotICAgICAgcm9vdF9uYW1lc3BhY2UgPSBhcmcuc3Vic3RyKGFyZ19uYW1lc3BhY2Uuc2l6ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGFyZy5maW5kKGFyZ19udW1fc2hhcmRzKSA9PSAwKSB7Ci0gICAgICBudW1fc2hhcmRzID0gc3RkOjpzdG91bChhcmcuc3Vic3RyKGFyZ19udW1fc2hhcmRzLnNpemUoKSkpOwotICAgIH0gZWxzZSBpZiAoYXJnLmZpbmQoYXJnX3J1c3QpID09IDApIHsKLSAgICAgIGdlbmVyYXRlX3J1c3QgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYXJnLmZpbmQoYXJnX3NvdXJjZV9yb290KSA9PSAwKSB7Ci0gICAgICAvLyBEbyBub3RoaW5nIChqdXN0IGRvbid0IHRyZWF0IGl0IGFzIGlucHV0X2ZpbGVzKQotICAgIH0gZWxzZSB7Ci0gICAgICBpbnB1dF9maWxlcy5lbXBsYWNlKHNvdXJjZV9yb290IC8gc3RkOjpmaWxlc3lzdGVtOjpwYXRoKGFyZykpOwotICAgIH0KLSAgfQotICBpZiAob3V0X2RpciA9PSBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgoKSB8fCBpbmNsdWRlX2RpciA9PSBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgoKSB8fCBudW1fc2hhcmRzID09IDApIHsKLSAgICB1c2FnZShhcmd2WzBdKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHN0ZDo6Y291dCA8PCAib3V0IGRpcjogIiA8PCBvdXRfZGlyIDw8IHN0ZDo6ZW5kbDsKLQotICB3aGlsZSAoIWlucHV0X2ZpbGVzLmVtcHR5KCkpIHsKLSAgICBEZWNsYXJhdGlvbnMgZGVjbGFyYXRpb25zOwotICAgIHN0ZDo6Y291dCA8PCAicGFyc2luZzogIiA8PCBpbnB1dF9maWxlcy5mcm9udCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICBpZiAoIXBhcnNlX2RlY2xhcmF0aW9uc19vbmVfZmlsZShpbnB1dF9maWxlcy5mcm9udCgpLCAmZGVjbGFyYXRpb25zKSkgewotICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgcGFyc2UgIiA8PCBpbnB1dF9maWxlcy5mcm9udCgpIDw8ICIgY29ycmVjdGx5IiA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKGdlbmVyYXRlX3J1c3QpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiZ2VuZXJhdGluZyBydXN0IiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBpZiAoIWdlbmVyYXRlX3J1c3Rfc291cmNlX29uZV9maWxlKGRlY2xhcmF0aW9ucywgaW5wdXRfZmlsZXMuZnJvbnQoKSwgaW5jbHVkZV9kaXIsIG91dF9kaXIsIHJvb3RfbmFtZXNwYWNlKSkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkRpZG4ndCBnZW5lcmF0ZSBydXN0IHNvdXJjZSBmb3IgIiA8PCBpbnB1dF9maWxlcy5mcm9udCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJuIDU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiZ2VuZXJhdGluZyBjKysgYW5kIHB5YmluZDExIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBpZiAoIWdlbmVyYXRlX2NwcF9oZWFkZXJzX29uZV9maWxlKGRlY2xhcmF0aW9ucywgaW5wdXRfZmlsZXMuZnJvbnQoKSwgaW5jbHVkZV9kaXIsIG91dF9kaXIsIHJvb3RfbmFtZXNwYWNlKSkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkRpZG4ndCBnZW5lcmF0ZSBjcHAgaGVhZGVycyBmb3IgIiA8PCBpbnB1dF9maWxlcy5mcm9udCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgICB9Ci0gICAgICBpZiAoIWdlbmVyYXRlX3B5YmluZDExX3NvdXJjZXNfb25lX2ZpbGUoCi0gICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywgaW5wdXRfZmlsZXMuZnJvbnQoKSwgaW5jbHVkZV9kaXIsIG91dF9kaXIsIHJvb3RfbmFtZXNwYWNlLCBudW1fc2hhcmRzKSkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkRpZG4ndCBnZW5lcmF0ZSBweWJpbmQxMSBzb3VyY2VzIGZvciAiIDw8IGlucHV0X2ZpbGVzLmZyb250KCkgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm4gNDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5wdXRfZmlsZXMucG9wKCk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvcGFja2V0X2RlZi5jYyBiL2dkL3BhY2tldC9wYXJzZXIvcGFja2V0X2RlZi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYmRhNi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3BhY2tldF9kZWYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXRfZGVmLmgiCi0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiZmllbGRzL2FsbF9maWVsZHMuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLVBhY2tldERlZjo6UGFja2V0RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIEZpZWxkTGlzdCBmaWVsZHMpIDogUGFyZW50RGVmKG5hbWUsIGZpZWxkcywgbnVsbHB0cikge30KLVBhY2tldERlZjo6UGFja2V0RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIEZpZWxkTGlzdCBmaWVsZHMsIFBhY2tldERlZiogcGFyZW50KSA6IFBhcmVudERlZihuYW1lLCBmaWVsZHMsIHBhcmVudCkge30KLQotUGFja2V0RmllbGQqIFBhY2tldERlZjo6R2V0TmV3RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmLCBQYXJzZUxvY2F0aW9uKSBjb25zdCB7Ci0gIHJldHVybiBudWxscHRyOyAgLy8gUGFja2V0cyBjYW4ndCBiZSBmaWVsZHMKLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblBhcnNlckRlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgImNsYXNzICIgPDwgbmFtZV8gPDwgIlZpZXciOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiIDogcHVibGljICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIlZpZXcgeyI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCAiIDogcHVibGljIFBhY2tldFZpZXc8IiA8PCAoaXNfbGl0dGxlX2VuZGlhbl8gPyAiIiA6ICIhIikgPDwgImtMaXR0bGVFbmRpYW4+IHsiOwotICB9Ci0gIHMgPDwgIiBwdWJsaWM6IjsKLQotICAvLyBTcGVjaWFsaXplIGZ1bmN0aW9uCi0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBzIDw8ICJzdGF0aWMgIiA8PCBuYW1lXyA8PCAiVmlldyBDcmVhdGUoIiA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiVmlldyBwYXJlbnQpIjsKLSAgICBzIDw8ICJ7IHJldHVybiAiIDw8IG5hbWVfIDw8ICJWaWV3KHN0ZDo6bW92ZShwYXJlbnQpKTsgfSI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCAic3RhdGljICIgPDwgbmFtZV8gPDwgIlZpZXcgQ3JlYXRlKFBhY2tldFZpZXc8IiA8PCAoaXNfbGl0dGxlX2VuZGlhbl8gPyAiIiA6ICIhIikgPDwgImtMaXR0bGVFbmRpYW4+IHBhY2tldCkgIjsKLSAgICBzIDw8ICJ7IHJldHVybiAiIDw8IG5hbWVfIDw8ICJWaWV3KHN0ZDo6bW92ZShwYWNrZXQpKTsgfSI7Ci0gIH0KLQotICBHZW5UZXN0aW5nUGFyc2VyRnJvbUJ5dGVzKHMpOwotCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBmaXhlZF90eXBlcyA9IHsKLSAgICAgIEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBGaXhlZEVudW1GaWVsZDo6a0ZpZWxkVHlwZSwKLSAgfTsKLQotICAvLyBQcmludCBhbGwgb2YgdGhlIHB1YmxpYyBmaWVsZHMgd2hpY2ggYXJlIGFsbCB0aGUgZmllbGRzIG1pbnVzIHRoZSBmaXhlZCBmaWVsZHMuCi0gIGNvbnN0IGF1dG8mIHB1YmxpY19maWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhvdXRUeXBlcyhmaXhlZF90eXBlcyk7Ci0gIGJvb2wgaGFzX2ZpeGVkX2ZpZWxkcyA9IHB1YmxpY19maWVsZHMuc2l6ZSgpICE9IGZpZWxkc18uc2l6ZSgpOwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogcHVibGljX2ZpZWxkcykgewotICAgIEdlblBhcnNlckZpZWxkR2V0dGVyKHMsIGZpZWxkKTsKLSAgICBzIDw8ICJcbiI7Ci0gIH0KLSAgR2VuVmFsaWRhdG9yKHMpOwotICBzIDw8ICJcbiI7Ci0KLSAgcyA8PCAiIHB1YmxpYzoiOwotICBHZW5QYXJzZXJUb1N0cmluZyhzKTsKLSAgcyA8PCAiXG4iOwotCi0gIHMgPDwgIiBwcm90ZWN0ZWQ6XG4iOwotICAvLyBDb25zdHJ1Y3RvciBmcm9tIGEgVmlldwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiZXhwbGljaXQgIiA8PCBuYW1lXyA8PCAiVmlldygiIDw8IHBhcmVudF8tPm5hbWVfIDw8ICJWaWV3IHBhcmVudCkiOwotICAgIHMgPDwgIiA6ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIlZpZXcoc3RkOjptb3ZlKHBhcmVudCkpIHsgd2FzX3ZhbGlkYXRlZF8gPSBmYWxzZTsgfSI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCAiZXhwbGljaXQgIiA8PCBuYW1lXyA8PCAiVmlldyhQYWNrZXRWaWV3PCIgPDwgKGlzX2xpdHRsZV9lbmRpYW5fID8gIiIgOiAiISIpIDw8ICJrTGl0dGxlRW5kaWFuPiBwYWNrZXQpICI7Ci0gICAgcyA8PCAiIDogUGFja2V0VmlldzwiIDw8IChpc19saXR0bGVfZW5kaWFuXyA/ICIiIDogIiEiKSA8PCAia0xpdHRsZUVuZGlhbj4ocGFja2V0KSB7IHdhc192YWxpZGF0ZWRfID0gZmFsc2U7fSI7Ci0gIH0KLQotICAvLyBQcmludCB0aGUgcHJpdmF0ZSBmaWVsZHMgd2hpY2ggYXJlIHRoZSBmaXhlZCBmaWVsZHMuCi0gIGlmIChoYXNfZml4ZWRfZmllbGRzKSB7Ci0gICAgY29uc3QgYXV0byYgcHJpdmF0ZV9maWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhUeXBlcyhmaXhlZF90eXBlcyk7Ci0gICAgcyA8PCAiIHByaXZhdGU6XG4iOwotICAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBwcml2YXRlX2ZpZWxkcykgewotICAgICAgR2VuUGFyc2VyRmllbGRHZXR0ZXIocywgZmllbGQpOwotICAgICAgcyA8PCAiXG4iOwotICAgIH0KLSAgfQotICBzIDw8ICJ9O1xuIjsKLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblRlc3RpbmdQYXJzZXJGcm9tQnl0ZXMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgIlxuI2lmIGRlZmluZWQoUEFDS0VUX0ZVWlpfVEVTVElORykgfHwgZGVmaW5lZChQQUNLRVRfVEVTVElORykgfHwgZGVmaW5lZChGVVpaX1RBUkdFVClcbiI7Ci0KLSAgcyA8PCAic3RhdGljICIgPDwgbmFtZV8gPDwgIlZpZXcgRnJvbUJ5dGVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzKSB7IjsKLSAgcyA8PCAiYXV0byB2ZWMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihieXRlcyk7IjsKLSAgcyA8PCAicmV0dXJuICIgPDwgbmFtZV8gPDwgIlZpZXc6OkNyZWF0ZSgiOwotICBhdXRvIGFuY2VzdG9yX3B0ciA9IHBhcmVudF87Ci0gIHNpemVfdCBwYXJlbnRfcGFyZW5zID0gMDsKLSAgd2hpbGUgKGFuY2VzdG9yX3B0ciAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCBhbmNlc3Rvcl9wdHItPm5hbWVfIDw8ICJWaWV3OjpDcmVhdGUoIjsKLSAgICBwYXJlbnRfcGFyZW5zKys7Ci0gICAgYW5jZXN0b3JfcHRyID0gYW5jZXN0b3JfcHRyLT5wYXJlbnRfOwotICB9Ci0gIHMgPDwgIlBhY2tldFZpZXc8IiA8PCAoaXNfbGl0dGxlX2VuZGlhbl8gPyAiIiA6ICIhIikgPDwgImtMaXR0bGVFbmRpYW4+KHZlYykiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmVudF9wYXJlbnM7IGkrKykgewotICAgIHMgPDwgIikiOwotICB9Ci0gIHMgPDwgIik7IjsKLSAgcyA8PCAifSI7Ci0KLSAgcyA8PCAiXG4jZW5kaWZcbiI7Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5QYXJzZXJEZWZpbml0aW9uUHliaW5kMTEoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgInB5OjpjbGFzc188IiA8PCBuYW1lXyA8PCAiVmlldyI7Ci0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBzIDw8ICIsICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIlZpZXciOwotICB9IGVsc2UgewotICAgIHMgPDwgIiwgUGFja2V0VmlldzwiIDw8IChpc19saXR0bGVfZW5kaWFuXyA/ICIiIDogIiEiKSA8PCAia0xpdHRsZUVuZGlhbj4iOwotICB9Ci0gIHMgPDwgIj4obSwgXCIiIDw8IG5hbWVfIDw8ICJWaWV3XCIpIjsKLSAgaWYgKHBhcmVudF8gIT0gbnVsbHB0cikgewotICAgIHMgPDwgIi5kZWYocHk6OmluaXQoW10oIiA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiVmlldyBwYXJlbnQpIHsiOwotICB9IGVsc2UgewotICAgIHMgPDwgIi5kZWYocHk6OmluaXQoW10oUGFja2V0VmlldzwiIDw8IChpc19saXR0bGVfZW5kaWFuXyA/ICIiIDogIiEiKSA8PCAia0xpdHRsZUVuZGlhbj4gcGFyZW50KSB7IjsKLSAgfQotICBzIDw8ICJhdXRvIHZpZXcgPSIgPDwgbmFtZV8gPDwgIlZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUocGFyZW50KSk7IjsKLSAgcyA8PCAiaWYgKCF2aWV3LklzVmFsaWQoKSkgeyB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoXCJCYWQgcGFja2V0IHZpZXdcIik7IH0iOwotICBzIDw8ICJyZXR1cm4gdmlldzsgfSkpIjsKLQotICBzIDw8ICIuZGVmKHB5Ojppbml0KCYiIDw8IG5hbWVfIDw8ICJWaWV3OjpDcmVhdGUpKSI7Ci0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBwcm90ZWN0ZWRfZmllbGRfdHlwZXMgPSB7Ci0gICAgICBGaXhlZFNjYWxhckZpZWxkOjprRmllbGRUeXBlLAotICAgICAgRml4ZWRFbnVtRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBDb3VudEZpZWxkOjprRmllbGRUeXBlLAotICB9OwotICBjb25zdCBhdXRvJiBwdWJsaWNfZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMocHJvdGVjdGVkX2ZpZWxkX3R5cGVzKTsKLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IHB1YmxpY19maWVsZHMpIHsKLSAgICBhdXRvIGdldHRlcl9mdW5jX25hbWUgPSBmaWVsZC0+R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCk7Ci0gICAgaWYgKGdldHRlcl9mdW5jX25hbWUuZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHMgPDwgIi5kZWYoXCIiIDw8IGdldHRlcl9mdW5jX25hbWUgPDwgIlwiLCAmIiA8PCBuYW1lXyA8PCAiVmlldzo6IiA8PCBnZXR0ZXJfZnVuY19uYW1lIDw8ICIpIjsKLSAgfQotICBzIDw8ICIuZGVmKFwiSXNWYWxpZFwiLCAmIiA8PCBuYW1lXyA8PCAiVmlldzo6SXNWYWxpZCkiOwotICBzIDw8ICI7XG4iOwotfQotCi12b2lkIFBhY2tldERlZjo6R2VuUGFyc2VyRmllbGRHZXR0ZXIoc3RkOjpvc3RyZWFtJiBzLCBjb25zdCBQYWNrZXRGaWVsZCogZmllbGQpIGNvbnN0IHsKLSAgLy8gU3RhcnQgZmllbGQgb2Zmc2V0Ci0gIGF1dG8gc3RhcnRfZmllbGRfb2Zmc2V0ID0gR2V0T2Zmc2V0Rm9yRmllbGQoZmllbGQtPkdldE5hbWUoKSwgZmFsc2UpOwotICBhdXRvIGVuZF9maWVsZF9vZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCB0cnVlKTsKLQotICBpZiAoc3RhcnRfZmllbGRfb2Zmc2V0LmVtcHR5KCkgJiYgZW5kX2ZpZWxkX29mZnNldC5lbXB0eSgpKSB7Ci0gICAgRVJST1IoZmllbGQpIDw8ICJGaWVsZCBsb2NhdGlvbiBmb3IgIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICIgaXMgYW1iaWd1b3VzLCAiCi0gICAgICAgICAgICAgICAgIDw8ICJubyBtZXRob2QgZXhpc3RzIHRvIGRldGVybWluZSBmaWVsZCBsb2NhdGlvbiBmcm9tIGJlZ2luKCkgb3IgZW5kKCkuXG4iOwotICB9Ci0KLSAgZmllbGQtPkdlbkdldHRlcihzLCBzdGFydF9maWVsZF9vZmZzZXQsIGVuZF9maWVsZF9vZmZzZXQpOwotfQotCi1UeXBlRGVmOjpUeXBlIFBhY2tldERlZjo6R2V0RGVmaW5pdGlvblR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBUeXBlRGVmOjpUeXBlOjpQQUNLRVQ7Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5WYWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIC8vIEdldCB0aGUgc3RhdGljIG9mZnNldCBmb3IgYWxsIG9mIG91ciBmaWVsZHMuCi0gIGludCBiaXRzX3NpemUgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzXykgewotICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gUGFkZGluZ0ZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBiaXRzX3NpemUgKz0gZmllbGQtPkdldFNpemUoKS5iaXRzKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotICBzIDw8ICJ2aXJ0dWFsIGJvb2wgSXNWYWxpZCgpICIgPDwgKHBhcmVudF8gIT0gbnVsbHB0ciA/ICIgb3ZlcnJpZGUiIDogIiIpIDw8ICIgeyI7Ci0gIHMgPDwgImlmICh3YXNfdmFsaWRhdGVkXykgeyByZXR1cm4gdHJ1ZTsgfSAiOwotICBzIDw8ICJlbHNlIHsgd2FzX3ZhbGlkYXRlZF8gPSB0cnVlOyB3YXNfdmFsaWRhdGVkXyA9IElzVmFsaWRfKCk7IHJldHVybiB3YXNfdmFsaWRhdGVkXzsgfSI7Ci0gIHMgPDwgIn0iOwotCi0gIHMgPDwgInByb3RlY3RlZDoiOwotICBzIDw8ICJ2aXJ0dWFsIGJvb2wgSXNWYWxpZF8oKSBjb25zdCB7IjsKLQotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiaWYgKCEiIDw8IHBhcmVudF8tPm5hbWVfIDw8ICJWaWV3OjpJc1ZhbGlkXygpKSB7IHJldHVybiBmYWxzZTsgfSAiOwotICB9Ci0KLSAgLy8gT2Zmc2V0IGJ5IHRoZSBwYXJlbnRzIGtub3duIHNpemUuIFdlIGtub3cgdGhhdCBhbnkgZHluYW1pYyBmaWVsZHMgY2FuCi0gIC8vIGFscmVhZHkgYmUgY2FsbGVkIHNpbmNlIHRoZSBwYXJlbnQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYnkKLSAgLy8gdGhpcyBwb2ludC4KLSAgYXV0byBwYXJlbnRfc2l6ZSA9IFNpemUoMCk7Ci0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBwYXJlbnRfc2l6ZSA9IHBhcmVudF8tPkdldFNpemUodHJ1ZSk7Ci0gIH0KLQotICBzIDw8ICJhdXRvIGl0ID0gYmVnaW4oKSArICgiIDw8IHBhcmVudF9zaXplIDw8ICIpIC8gODsiOwotCi0gIC8vIENoZWNrIGlmIHlvdSBjYW4gZXh0cmFjdCB0aGUgc3RhdGljIGZpZWxkcy4KLSAgLy8gQXQgdGhpcyBwb2ludCB5b3Uga25vdyB5b3UgY2FuIHVzZSB0aGUgc2l6ZSBnZXR0ZXJzIHdpdGhvdXQgY3Jhc2hpbmcKLSAgLy8gYXMgbG9uZyBhcyB0aGV5IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBzaXplIGZpZWxkcyBjYW50IGNvbWUgYmVmb3JlCi0gIC8vIHRoZWlyIGNvcnJpc3BvbmRpbmcgdmFyaWFibGUgbGVuZ3RoIGZpZWxkLgotICBzIDw8ICJpdCArPSAiIDw8ICgoYml0c19zaXplICsgNykgLyA4KSA8PCAiIC8qIFRvdGFsIHNpemUgb2YgdGhlIGZpeGVkIGZpZWxkcyAqLzsiOwotICBzIDw8ICJpZiAoaXQgPiBlbmQoKSkgcmV0dXJuIGZhbHNlOyI7Ci0KLSAgLy8gRm9yIGFueSB2YXJpYWJsZSBsZW5ndGggZmllbGRzLCB1c2UgdGhlaXIgc2l6ZSBjaGVjay4KLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IENoZWNrc3VtU3RhcnRGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgYXV0byBvZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCBmYWxzZSk7Ci0gICAgICBpZiAoIW9mZnNldC5lbXB0eSgpKSB7Ci0gICAgICAgIHMgPDwgInNpemVfdCBzdW1faW5kZXggPSAoIiA8PCBvZmZzZXQgPDwgIikgLyA4OyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCB0cnVlKTsKLSAgICAgICAgaWYgKG9mZnNldC5lbXB0eSgpKSB7Ci0gICAgICAgICAgRVJST1IoZmllbGQpIDw8ICJDaGVja3N1bSBTdGFydCBGaWVsZCBvZmZzZXQgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLiI7Ci0gICAgICAgIH0KLSAgICAgICAgcyA8PCAic2l6ZV90IHN1bV9pbmRleCA9IHNpemUoKSAtICgiIDw8IG9mZnNldCA8PCAiKSAvIDg7IjsKLSAgICAgIH0KLQotICAgICAgY29uc3QgYXV0byYgZmllbGRfbmFtZSA9ICgoQ2hlY2tzdW1TdGFydEZpZWxkKilmaWVsZCktPkdldFN0YXJ0ZWRGaWVsZE5hbWUoKTsKLSAgICAgIGNvbnN0IGF1dG8mIHN0YXJ0ZWRfZmllbGQgPSBmaWVsZHNfLkdldEZpZWxkKGZpZWxkX25hbWUpOwotICAgICAgaWYgKHN0YXJ0ZWRfZmllbGQgPT0gbnVsbHB0cikgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgX19mdW5jX18gPDwgIjogQ2FuJ3QgZmluZCBjaGVja3N1bSBmaWVsZCBuYW1lZCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkLT5HZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIpIjsKLSAgICAgIH0KLSAgICAgIGF1dG8gZW5kX29mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKHN0YXJ0ZWRfZmllbGQtPkdldE5hbWUoKSwgZmFsc2UpOwotICAgICAgaWYgKCFlbmRfb2Zmc2V0LmVtcHR5KCkpIHsKLSAgICAgICAgcyA8PCAic2l6ZV90IGVuZF9zdW1faW5kZXggPSAoIiA8PCBlbmRfb2Zmc2V0IDw8ICIpIC8gODsiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZW5kX29mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKHN0YXJ0ZWRfZmllbGQtPkdldE5hbWUoKSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChlbmRfb2Zmc2V0LmVtcHR5KCkpIHsKLSAgICAgICAgICBFUlJPUihzdGFydGVkX2ZpZWxkKSA8PCAiQ2hlY2tzdW0gRmllbGQgZW5kX29mZnNldCBjYW4gbm90IGJlIGRldGVybWluZWQuIjsKLSAgICAgICAgfQotICAgICAgICBzIDw8ICJzaXplX3QgZW5kX3N1bV9pbmRleCA9IHNpemUoKSAtICgiIDw8IHN0YXJ0ZWRfZmllbGQtPkdldFNpemUoKSA8PCAiIC0gIiA8PCBlbmRfb2Zmc2V0IDw8ICIpIC8gODsiOwotICAgICAgfQotICAgICAgaWYgKGlzX2xpdHRsZV9lbmRpYW5fKSB7Ci0gICAgICAgIHMgPDwgImF1dG8gY2hlY2tzdW1fdmlldyA9IEdldExpdHRsZUVuZGlhblN1YnZpZXcoc3VtX2luZGV4LCBlbmRfc3VtX2luZGV4KTsiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcyA8PCAiYXV0byBjaGVja3N1bV92aWV3ID0gR2V0QmlnRW5kaWFuU3VidmlldyhzdW1faW5kZXgsIGVuZF9zdW1faW5kZXgpOyI7Ci0gICAgICB9Ci0gICAgICBzIDw8IHN0YXJ0ZWRfZmllbGQtPkdldERhdGFUeXBlKCkgPDwgIiBjaGVja3N1bTsiOwotICAgICAgcyA8PCAiY2hlY2tzdW0uSW5pdGlhbGl6ZSgpOyI7Ci0gICAgICBzIDw8ICJmb3IgKHVpbnQ4X3QgYnl0ZSA6IGNoZWNrc3VtX3ZpZXcpIHsgIjsKLSAgICAgIHMgPDwgImNoZWNrc3VtLkFkZEJ5dGUoYnl0ZSk7fSI7Ci0gICAgICBzIDw8ICJpZiAoY2hlY2tzdW0uR2V0Q2hlY2tzdW0oKSAhPSAoYmVnaW4oKSArIGVuZF9zdW1faW5kZXgpLmV4dHJhY3Q8IgotICAgICAgICA8PCB1dGlsOjpHZXRUeXBlRm9yU2l6ZShzdGFydGVkX2ZpZWxkLT5HZXRTaXplKCkuYml0cygpKSA8PCAiPigpKSB7IHJldHVybiBmYWxzZTsgfSI7Ci0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGF1dG8gZmllbGRfc2l6ZSA9IGZpZWxkLT5HZXRTaXplKCk7Ci0gICAgLy8gRml4ZWQgc2l6ZSBmaWVsZHMgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZC4KLSAgICBpZiAoIWZpZWxkX3NpemUuaGFzX2R5bmFtaWMoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gQ3VzdG9tIGZpZWxkcyB3aXRoIGR5bmFtaWMgc2l6ZSBtdXN0IGhhdmUgdGhlIG9mZnNldCBmb3IgdGhlIGZpZWxkIHBhc3NlZCBpbiBhcyB3ZWxsCi0gICAgLy8gYXMgdGhlIGVuZCBpdGVyYXRvciBzbyB0aGF0IHRoZXkgbWF5IGVuc3VyZSB0aGF0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJlYWQgcGFzdCB0aGUgZW5kLgotICAgIC8vIEN1c3RvbSBmaWVsZHMgd2l0aCBmaXhlZCBzaXplcyB3aWxsIGJlIGhhbmRsZWQgaW4gdGhlIHN0YXRpYyBvZmZzZXQgY2hlY2tpbmcuCi0gICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBDdXN0b21GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGRldGVybWluZSBvZmZzZXQgZnJvbSBiZWdpbigpLCBvdGhlcndpc2UgZXJyb3IgYmVjYXVzZSBieSB0aGlzIHBvaW50LAotICAgICAgLy8gdGhlIHNpemUgb2YgdGhlIGN1c3RvbSBmaWVsZCBpcyB1bmtub3duIGFuZCBjYW4ndCBiZSBzdWJ0cmFjdGVkIGZyb20gZW5kKCkgdG8gZ2V0IHRoZQotICAgICAgLy8gb2Zmc2V0LgotICAgICAgYXV0byBvZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCBmYWxzZSk7Ci0gICAgICBpZiAob2Zmc2V0LmVtcHR5KCkpIHsKLSAgICAgICAgRVJST1IoZmllbGQpIDw8ICJDdXN0b20gRmllbGQgb2Zmc2V0IGNhbiBub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGJlZ2luKCkuIjsKLSAgICAgIH0KLQotICAgICAgaWYgKG9mZnNldC5iaXRzKCkgJSA4ICE9IDApIHsKLSAgICAgICAgRVJST1IoZmllbGQpIDw8ICJDdXN0b20gZmllbGRzIG11c3QgYmUgYnl0ZSBhbGlnbmVkLiI7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEN1c3RvbSBmaWVsZHMgYXJlIHNwZWNpYWwgYXMgdGhlaXIgc2l6ZSBmaWVsZCB0YWtlcyBhbiBhcmd1bWVudC4KLSAgICAgIGNvbnN0IGF1dG8mIGN1c3RvbV9zaXplX3ZhciA9IGZpZWxkLT5HZXROYW1lKCkgKyAiX3NpemUiOwotICAgICAgcyA8PCAiY29uc3QgYXV0byYgIiA8PCBjdXN0b21fc2l6ZV92YXIgPDwgIiA9ICIgPDwgZmllbGRfc2l6ZS5keW5hbWljX3N0cmluZygpOwotICAgICAgcyA8PCAiKGJlZ2luKCkgKyAoIiA8PCBvZmZzZXQgPDwgIikgLyA4KTsiOwotCi0gICAgICBzIDw8ICJpZiAoISIgPDwgY3VzdG9tX3NpemVfdmFyIDw8ICIuaGFzX3ZhbHVlKCkpIHsgcmV0dXJuIGZhbHNlOyB9IjsKLSAgICAgIHMgPDwgIml0ICs9ICoiIDw8IGN1c3RvbV9zaXplX3ZhciA8PCAiOyI7Ci0gICAgICBzIDw8ICJpZiAoaXQgPiBlbmQoKSkgcmV0dXJuIGZhbHNlOyI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCAiaXQgKz0gKCIgPDwgZmllbGRfc2l6ZS5keW5hbWljX3N0cmluZygpIDw8ICIpIC8gODsiOwotICAgICAgcyA8PCAiaWYgKGl0ID4gZW5kKCkpIHJldHVybiBmYWxzZTsiOwotICAgIH0KLSAgfQotCi0gIC8vIFZhbGlkYXRlIGNvbnN0cmFpbnRzIGFmdGVyIHZhbGlkYXRpbmcgdGhlIHNpemUKLSAgaWYgKHBhcmVudF9jb25zdHJhaW50c18uc2l6ZSgpID4gMCAmJiBwYXJlbnRfID09IG51bGxwdHIpIHsKLSAgICBFUlJPUigpIDw8ICJDYW4ndCBoYXZlIGEgY29uc3RyYWludCBvbiBhIE5VTEwgcGFyZW50IjsKLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgY29uc3RyYWludCA6IHBhcmVudF9jb25zdHJhaW50c18pIHsKLSAgICBzIDw8ICJpZiAoR2V0IiA8PCB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UoY29uc3RyYWludC5maXJzdCkgPDwgIigpICE9ICI7Ci0gICAgY29uc3QgYXV0byYgZmllbGQgPSBwYXJlbnRfLT5HZXRQYXJhbUxpc3QoKS5HZXRGaWVsZChjb25zdHJhaW50LmZpcnN0KTsKLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFNjYWxhckZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBzIDw8IHN0ZDo6Z2V0PGludDY0X3Q+KGNvbnN0cmFpbnQuc2Vjb25kKTsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCBzdGQ6OmdldDxzdGQ6OnN0cmluZz4oY29uc3RyYWludC5zZWNvbmQpOwotICAgIH0KLSAgICBzIDw8ICIpIHJldHVybiBmYWxzZTsiOwotICB9Ci0KLSAgLy8gVmFsaWRhdGUgdGhlIHBhY2tldHMgZmllbGRzIGxhc3QKLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICBmaWVsZC0+R2VuVmFsaWRhdG9yKHMpOwotICAgIHMgPDwgIlxuIjsKLSAgfQotCi0gIHMgPDwgInJldHVybiB0cnVlOyI7Ci0gIHMgPDwgIn1cbiI7Ci0gIGlmIChwYXJlbnRfID09IG51bGxwdHIpIHsKLSAgICBzIDw8ICJib29sIHdhc192YWxpZGF0ZWRfe2ZhbHNlfTtcbiI7Ci0gIH0KLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblBhcnNlclRvU3RyaW5nKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJ2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgIiA8PCAocGFyZW50XyAhPSBudWxscHRyID8gIiBvdmVycmlkZSIgOiAiIikgPDwgIiB7IjsKLSAgcyA8PCAic3RkOjpzdHJpbmdzdHJlYW0gc3M7IjsKLSAgcyA8PCAic3MgPDwgc3RkOjpzaG93YmFzZSA8PCBzdGQ6OmhleCA8PCBcIiIgPDwgbmFtZV8gPDwgIiB7IFwiOyI7Ci0KLSAgaWYgKGZpZWxkc18uc2l6ZSgpID4gMCkgewotICAgIHMgPDwgInNzIDw8IFwiXCIgIjsKLSAgICBib29sIGZpcnN0ZmllbGQgPSB0cnVlOwotICAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZHNfKSB7Ci0gICAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGUgfHwgZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUgfHwKLSAgICAgICAgICBmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQ2hlY2tzdW1TdGFydEZpZWxkOjprRmllbGRUeXBlKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgcyA8PCAoZmlyc3RmaWVsZCA/ICIgPDwgXCIiIDogIiA8PCBcIiwgIikgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiID0gXCIgPDwgIjsKLQotICAgICAgZmllbGQtPkdlblN0cmluZ1JlcHJlc2VudGF0aW9uKHMsIGZpZWxkLT5HZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSArICIoKSIpOwotCi0gICAgICBpZiAoZmlyc3RmaWVsZCkgewotICAgICAgICBmaXJzdGZpZWxkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHMgPDwgIjsiOwotICB9Ci0KLSAgcyA8PCAic3MgPDwgXCIgfVwiOyI7Ci0gIHMgPDwgInJldHVybiBzcy5zdHIoKTsiOwotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIFBhY2tldERlZjo6R2VuQnVpbGRlckRlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgImNsYXNzICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXIiOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiIDogcHVibGljICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIkJ1aWxkZXIiOwotICB9IGVsc2UgewotICAgIGlmIChpc19saXR0bGVfZW5kaWFuXykgewotICAgICAgcyA8PCAiIDogcHVibGljIFBhY2tldEJ1aWxkZXI8a0xpdHRsZUVuZGlhbj4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBzIDw8ICIgOiBwdWJsaWMgUGFja2V0QnVpbGRlcjwha0xpdHRsZUVuZGlhbj4iOwotICAgIH0KLSAgfQotICBzIDw8ICIgeyI7Ci0gIHMgPDwgIiBwdWJsaWM6IjsKLSAgcyA8PCAiICB2aXJ0dWFsIH4iIDw8IG5hbWVfIDw8ICJCdWlsZGVyKCkgPSBkZWZhdWx0OyI7Ci0KLSAgaWYgKCFmaWVsZHNfLkhhc0JvZHkoKSkgewotICAgIEdlbkJ1aWxkZXJDcmVhdGUocyk7Ci0gICAgcyA8PCAiXG4iOwotCi0gICAgR2VuVGVzdGluZ0Zyb21WaWV3KHMpOwotICAgIHMgPDwgIlxuIjsKLSAgfQotCi0gIEdlblNlcmlhbGl6ZShzKTsKLSAgcyA8PCAiXG4iOwotCi0gIEdlblNpemUocyk7Ci0gIHMgPDwgIlxuIjsKLQotICBzIDw8ICIgcHJvdGVjdGVkOlxuIjsKLSAgR2VuQnVpbGRlckNvbnN0cnVjdG9yKHMpOwotICBzIDw8ICJcbiI7Ci0KLSAgR2VuQnVpbGRlclBhcmFtZXRlckNoZWNrZXIocyk7Ci0gIHMgPDwgIlxuIjsKLQotICBHZW5NZW1iZXJzKHMpOwotICBzIDw8ICJ9O1xuIjsKLQotICBHZW5UZXN0RGVmaW5lKHMpOwotICBzIDw8ICJcbiI7Ci0KLSAgR2VuRnV6elRlc3REZWZpbmUocyk7Ci0gIHMgPDwgIlxuIjsKLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblRlc3RpbmdGcm9tVmlldyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiI2lmIGRlZmluZWQoUEFDS0VUX0ZVWlpfVEVTVElORykgfHwgZGVmaW5lZChQQUNLRVRfVEVTVElORykgfHwgZGVmaW5lZChGVVpaX1RBUkdFVClcbiI7Ci0KLSAgcyA8PCAic3RhdGljIHN0ZDo6dW5pcXVlX3B0cjwiIDw8IG5hbWVfIDw8ICJCdWlsZGVyPiBGcm9tVmlldygiIDw8IG5hbWVfIDw8ICJWaWV3IHZpZXcpIHsiOwotICBzIDw8ICJyZXR1cm4gIiA8PCBuYW1lXyA8PCAiQnVpbGRlcjo6Q3JlYXRlKCI7Ci0gIEZpZWxkTGlzdCBwYXJhbXMgPSBHZXRQYXJhbUxpc3QoKS5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLSAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7IGkrKykgewotICAgIHBhcmFtc1tpXS0+R2VuQnVpbGRlclBhcmFtZXRlckZyb21WaWV3KHMpOwotICAgIGlmIChpICE9IHBhcmFtcy5zaXplKCkgLSAxKSB7Ci0gICAgICBzIDw8ICIsICI7Ci0gICAgfQotICB9Ci0gIHMgPDwgIik7IjsKLSAgcyA8PCAifSI7Ci0KLSAgcyA8PCAiXG4jZW5kaWZcbiI7Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5CdWlsZGVyRGVmaW5pdGlvblB5YmluZDExKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJweTo6Y2xhc3NfPCIgPDwgbmFtZV8gPDwgIkJ1aWxkZXIiOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiLCAiIDw8IHBhcmVudF8tPm5hbWVfIDw8ICJCdWlsZGVyIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfbGl0dGxlX2VuZGlhbl8pIHsKLSAgICAgIHMgPDwgIiwgUGFja2V0QnVpbGRlcjxrTGl0dGxlRW5kaWFuPiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIiwgUGFja2V0QnVpbGRlcjwha0xpdHRsZUVuZGlhbj4iOwotICAgIH0KLSAgfQotICBzIDw8ICIsIHN0ZDo6c2hhcmVkX3B0cjwiIDw8IG5hbWVfIDw8ICJCdWlsZGVyPiI7Ci0gIHMgPDwgIj4obSwgXCIiIDw8IG5hbWVfIDw8ICJCdWlsZGVyXCIpIjsKLSAgaWYgKCFmaWVsZHNfLkhhc0JvZHkoKSkgewotICAgIEdlbkJ1aWxkZXJDcmVhdGVQeWJpbmQxMShzKTsKLSAgfQotICBzIDw8ICIuZGVmKFwiU2VyaWFsaXplXCIsIFtdKCIgPDwgbmFtZV8gPDwgIkJ1aWxkZXImIGJ1aWxkZXIpeyI7Ci0gIHMgPDwgInN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzOyI7Ci0gIHMgPDwgIkJpdEluc2VydGVyIGJpKGJ5dGVzKTsiOwotICBzIDw8ICJidWlsZGVyLlNlcmlhbGl6ZShiaSk7IjsKLSAgcyA8PCAicmV0dXJuIGJ5dGVzO30pIjsKLSAgcyA8PCAiO1xuIjsKLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblRlc3REZWZpbmUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgIiNpZmRlZiBQQUNLRVRfVEVTVElOR1xuIjsKLSAgcyA8PCAiI2RlZmluZSBERUZJTkVfQU5EX0lOU1RBTlRJQVRFXyIgPDwgbmFtZV8gPDwgIlJlZmxlY3Rpb25UZXN0KC4uLikiOwotICBzIDw8ICJjbGFzcyAiIDw8IG5hbWVfIDw8ICJSZWZsZWN0aW9uVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiB7ICI7Ci0gIHMgPDwgInB1YmxpYzogIjsKLSAgcyA8PCAidm9pZCBDb21wYXJlQnl0ZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gY2FwdHVyZWRfcGFja2V0KSB7IjsKLSAgcyA8PCBuYW1lXyA8PCAiVmlldyB2aWV3ID0gIiA8PCBuYW1lXyA8PCAiVmlldzo6RnJvbUJ5dGVzKGNhcHR1cmVkX3BhY2tldCk7IjsKLSAgcyA8PCAiaWYgKCF2aWV3LklzVmFsaWQoKSkgeyBMT0dfSU5GTyhcIkludmFsaWQgUGFja2V0IEJ5dGVzIChzaXplID0gJXp1KVwiLCB2aWV3LnNpemUoKSk7IjsKLSAgcyA8PCAiZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2aWV3LnNpemUoKTsgaSsrKSB7IExPR19JTkZPKFwiJTV6ZDolMDJYXCIsIGksICoodmlldy5iZWdpbigpICsgaSkpOyB9fSI7Ci0gIHMgPDwgIkFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsiOwotICBzIDw8ICJhdXRvIHBhY2tldCA9ICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXI6OkZyb21WaWV3KHZpZXcpOyI7Ci0gIHMgPDwgInN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsiOwotICBzIDw8ICJwYWNrZXRfYnl0ZXMtPnJlc2VydmUocGFja2V0LT5zaXplKCkpOyI7Ci0gIHMgPDwgIkJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOyI7Ci0gIHMgPDwgInBhY2tldC0+U2VyaWFsaXplKGl0KTsiOwotICBzIDw8ICJBU1NFUlRfRVEoKnBhY2tldF9ieXRlcywgY2FwdHVyZWRfcGFja2V0KTsiOwotICBzIDw8ICJ9IjsKLSAgcyA8PCAifTsiOwotICBzIDw8ICJURVNUX1AoIiA8PCBuYW1lXyA8PCAiUmVmbGVjdGlvblRlc3QsIGdlbmVyYXRlZFJlZmxlY3Rpb25UZXN0KSB7IjsKLSAgcyA8PCAiQ29tcGFyZUJ5dGVzKEdldFBhcmFtKCkpOyI7Ci0gIHMgPDwgIn0iOwotICBzIDw8ICJJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoIiA8PCBuYW1lXyA8PCAiX3JlZmxlY3Rpb24sICI7Ci0gIHMgPDwgbmFtZV8gPDwgIlJlZmxlY3Rpb25UZXN0LCB0ZXN0aW5nOjpWYWx1ZXMoX19WQV9BUkdTX18pKSI7Ci0gIGludCBpID0gMDsKLSAgZm9yIChjb25zdCBhdXRvJiBieXRlcyA6IHRlc3RfY2FzZXNfKSB7Ci0gICAgcyA8PCAiXG51aW50OF90ICIgPDwgbmFtZV8gPDwgIl90ZXN0X2J5dGVzXyIgPDwgaSA8PCAiW10gPSBcIiIgPDwgYnl0ZXMgPDwgIlwiOyI7Ci0gICAgcyA8PCAic3RkOjp2ZWN0b3I8dWludDhfdD4gIiA8PCBuYW1lXyA8PCAiX3Rlc3RfdmVjXyIgPDwgaSA8PCAiKCI7Ci0gICAgcyA8PCBuYW1lXyA8PCAiX3Rlc3RfYnl0ZXNfIiA8PCBpIDw8ICIsIjsKLSAgICBzIDw8IG5hbWVfIDw8ICJfdGVzdF9ieXRlc18iIDw8IGkgPDwgIiArIHNpemVvZigiOwotICAgIHMgPDwgbmFtZV8gPDwgIl90ZXN0X2J5dGVzXyIgPDwgaSA8PCAiKSAtIDEpOyI7Ci0gICAgaSsrOwotICB9Ci0gIGlmICghdGVzdF9jYXNlc18uZW1wdHkoKSkgewotICAgIGkgPSAwOwotICAgIHMgPDwgIlxuREVGSU5FX0FORF9JTlNUQU5USUFURV8iIDw8IG5hbWVfIDw8ICJSZWZsZWN0aW9uVGVzdCgiOwotICAgIGZvciAoYXV0byBieXRlcyA6IHRlc3RfY2FzZXNfKSB7Ci0gICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgcyA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBzIDw8IG5hbWVfIDw8ICJfdGVzdF92ZWNfIiA8PCBpKys7Ci0gICAgfQotICAgIHMgPDwgIik7IjsKLSAgfQotICBzIDw8ICJcbiNlbmRpZiI7Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5GdXp6VGVzdERlZmluZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiI2lmIGRlZmluZWQoUEFDS0VUX0ZVWlpfVEVTVElORykgfHwgZGVmaW5lZChQQUNLRVRfVEVTVElORylcbiI7Ci0gIHMgPDwgIiNkZWZpbmUgREVGSU5FXyIgPDwgbmFtZV8gPDwgIlJlZmxlY3Rpb25GdXp6VGVzdCgpICI7Ci0gIHMgPDwgInZvaWQgUnVuIiA8PCBuYW1lXyA8PCAiUmVmbGVjdGlvbkZ1enpUZXN0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7IjsKLSAgcyA8PCAiYXV0byB2ZWMgPSBzdGQ6OnZlY3Rvcjx1aW50OF90PihkYXRhLCBkYXRhICsgc2l6ZSk7IjsKLSAgcyA8PCBuYW1lXyA8PCAiVmlldyB2aWV3ID0gIiA8PCBuYW1lXyA8PCAiVmlldzo6RnJvbUJ5dGVzKHZlYyk7IjsKLSAgcyA8PCAiaWYgKCF2aWV3LklzVmFsaWQoKSkgeyByZXR1cm47IH0iOwotICBzIDw8ICJhdXRvIHBhY2tldCA9ICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXI6OkZyb21WaWV3KHZpZXcpOyI7Ci0gIHMgPDwgInN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsiOwotICBzIDw8ICJwYWNrZXRfYnl0ZXMtPnJlc2VydmUocGFja2V0LT5zaXplKCkpOyI7Ci0gIHMgPDwgIkJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOyI7Ci0gIHMgPDwgInBhY2tldC0+U2VyaWFsaXplKGl0KTsiOwotICBzIDw8ICJ9IjsKLSAgcyA8PCAiXG4jZW5kaWZcbiI7Ci0gIHMgPDwgIiNpZmRlZiBQQUNLRVRfRlVaWl9URVNUSU5HXG4iOwotICBzIDw8ICIjZGVmaW5lIERFRklORV9BTkRfUkVHSVNURVJfIiA8PCBuYW1lXyA8PCAiUmVmbGVjdGlvbkZ1enpUZXN0KFJFR0lTVFJZKSAiOwotICBzIDw8ICJERUZJTkVfIiA8PCBuYW1lXyA8PCAiUmVmbGVjdGlvbkZ1enpUZXN0KCk7IjsKLSAgcyA8PCAiIGNsYXNzICIgPDwgbmFtZV8gPDwgIlJlZmxlY3Rpb25GdXp6VGVzdFJlZ2lzdHJhbnQgeyI7Ci0gIHMgPDwgInB1YmxpYzogIjsKLSAgcyA8PCAiZXhwbGljaXQgIiA8PCBuYW1lXwotICAgIDw8ICJSZWZsZWN0aW9uRnV6elRlc3RSZWdpc3RyYW50KHN0ZDo6dmVjdG9yPHZvaWQoKikoY29uc3QgdWludDhfdCosIHNpemVfdCk+JiBmdXp6X3Rlc3RfcmVnaXN0cnkpIHsiOwotICBzIDw8ICJmdXp6X3Rlc3RfcmVnaXN0cnkucHVzaF9iYWNrKFJ1biIgPDwgbmFtZV8gPDwgIlJlZmxlY3Rpb25GdXp6VGVzdCk7IjsKLSAgcyA8PCAifX07ICI7Ci0gIHMgPDwgbmFtZV8gPDwgIlJlZmxlY3Rpb25GdXp6VGVzdFJlZ2lzdHJhbnQgIiA8PCBuYW1lXyA8PCAiX3JlZmxlY3Rpb25fZnV6el90ZXN0X3JlZ2lzdHJhbnQoUkVHSVNUUlkpOyI7Ci0gIHMgPDwgIlxuI2VuZGlmIjsKLX0KLQotRmllbGRMaXN0IFBhY2tldERlZjo6R2V0UGFyYW1ldGVyc1RvVmFsaWRhdGUoKSBjb25zdCB7Ci0gIEZpZWxkTGlzdCBwYXJhbXNfdG9fdmFsaWRhdGU7Ci0gIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBHZXRQYXJhbUxpc3QoKSkgewotICAgIGlmIChmaWVsZC0+SGFzUGFyYW1ldGVyVmFsaWRhdG9yKCkpIHsKLSAgICAgIHBhcmFtc190b192YWxpZGF0ZS5BcHBlbmRGaWVsZChmaWVsZCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwYXJhbXNfdG9fdmFsaWRhdGU7Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5CdWlsZGVyQ3JlYXRlKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPCIgPDwgbmFtZV8gPDwgIkJ1aWxkZXI+IENyZWF0ZSgiOwotCi0gIGF1dG8gcGFyYW1zID0gR2V0UGFyYW1MaXN0KCk7Ci0gIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICBwYXJhbXNbaV0tPkdlbkJ1aWxkZXJQYXJhbWV0ZXIocyk7Ci0gICAgaWYgKGkgIT0gcGFyYW1zLnNpemUoKSAtIDEpIHsKLSAgICAgIHMgPDwgIiwgIjsKLSAgICB9Ci0gIH0KLSAgcyA8PCAiKSB7IjsKLQotICAvLyBDYWxsIHRoZSBjb25zdHJ1Y3RvcgotICBzIDw8ICJhdXRvIGJ1aWxkZXIgPSBzdGQ6OnVuaXF1ZV9wdHI8IiA8PCBuYW1lXyA8PCAiQnVpbGRlcj4obmV3ICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXIoIjsKLQotICBwYXJhbXMgPSBwYXJhbXMuR2V0RmllbGRzV2l0aG91dFR5cGVzKHsKLSAgICAgIFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgfSk7Ci0gIC8vIEFkZCB0aGUgcGFyYW1ldGVycy4KLSAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7IGkrKykgewotICAgIGlmIChwYXJhbXNbaV0tPkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpKSB7Ci0gICAgICBzIDw8ICJzdGQ6Om1vdmUoIiA8PCBwYXJhbXNbaV0tPkdldE5hbWUoKSA8PCAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgcGFyYW1zW2ldLT5HZXROYW1lKCk7Ci0gICAgfQotICAgIGlmIChpICE9IHBhcmFtcy5zaXplKCkgLSAxKSB7Ci0gICAgICBzIDw8ICIsICI7Ci0gICAgfQotICB9Ci0KLSAgcyA8PCAiKSk7IjsKLSAgaWYgKGZpZWxkc18uSGFzUGF5bG9hZCgpKSB7Ci0gICAgcyA8PCAiYnVpbGRlci0+cGF5bG9hZF8gPSBzdGQ6Om1vdmUocGF5bG9hZCk7IjsKLSAgfQotICBzIDw8ICJyZXR1cm4gYnVpbGRlcjsiOwotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIFBhY2tldERlZjo6R2VuQnVpbGRlckNyZWF0ZVB5YmluZDExKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICIuZGVmKHB5Ojppbml0KFtdKCI7Ci0gIGF1dG8gcGFyYW1zID0gR2V0UGFyYW1MaXN0KCk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdHJ1Y3Rvcl9hcmdzOwotICBpbnQgaSA9IDE7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFyYW0gOiBwYXJhbXMpIHsKLSAgICBpKys7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgYXV0byBwYXJhbV90eXBlID0gcGFyYW0tPkdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCk7Ci0gICAgaWYgKHBhcmFtX3R5cGUuZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIFVzZSBzaGFyZWRfcHRyIGluc3RlYWQgb2YgdW5pcXVlX3B0ciBmb3IgdGhlIFB5dGhvbiBpbnRlcmZhY2UKLSAgICBpZiAocGFyYW0tPkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpKSB7Ci0gICAgICBwYXJhbV90eXBlID0gdXRpbDo6U3RyaW5nRmluZEFuZFJlcGxhY2VBbGwocGFyYW1fdHlwZSwgInVuaXF1ZV9wdHIiLCAic2hhcmVkX3B0ciIpOwotICAgIH0KLSAgICBzcyA8PCBwYXJhbV90eXBlIDw8ICIgIiA8PCBwYXJhbS0+R2V0TmFtZSgpOwotICAgIGNvbnN0cnVjdG9yX2FyZ3MucHVzaF9iYWNrKHNzLnN0cigpKTsKLSAgfQotICBzIDw8IHV0aWw6OlN0cmluZ0pvaW4oIiwiLCBjb25zdHJ1Y3Rvcl9hcmdzKSA8PCAiKXsiOwotCi0gIC8vIERlYWwgd2l0aCBtb3ZlIG9ubHkgYXJncwotICBmb3IgKGNvbnN0IGF1dG8mIHBhcmFtIDogcGFyYW1zKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgYXV0byBwYXJhbV90eXBlID0gcGFyYW0tPkdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCk7Ci0gICAgaWYgKHBhcmFtX3R5cGUuZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghcGFyYW0tPkJ1aWxkZXJQYXJhbWV0ZXJNdXN0QmVNb3ZlZCgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgYXV0byBtb3ZlX29ubHlfcGFyYW1fbmFtZSA9IHBhcmFtLT5HZXROYW1lKCkgKyAiX21vdmVfb25seSI7Ci0gICAgcyA8PCBwYXJhbV90eXBlIDw8ICIgIiA8PCBtb3ZlX29ubHlfcGFyYW1fbmFtZSA8PCAiOyI7Ci0gICAgaWYgKHBhcmFtLT5Jc0NvbnRhaW5lckZpZWxkKCkpIHsKLSAgICAgIC8vIEFzc3VtZSBzaW5nbGUgbGF5ZXIgY29udGFpbmVyIGFuZCBjb3B5IGl0Ci0gICAgICBhdXRvIHN0cnVjdF90eXBlID0gcGFyYW0tPkdldEVsZW1lbnRGaWVsZCgpLT5HZXREYXRhVHlwZSgpOwotICAgICAgc3RydWN0X3R5cGUgPSB1dGlsOjpTdHJpbmdGaW5kQW5kUmVwbGFjZUFsbChzdHJ1Y3RfdHlwZSwgInN0ZDo6dW5pcXVlX3B0cjwiLCAiIik7Ci0gICAgICBzdHJ1Y3RfdHlwZSA9IHV0aWw6OlN0cmluZ0ZpbmRBbmRSZXBsYWNlQWxsKHN0cnVjdF90eXBlLCAiPiIsICIiKTsKLSAgICAgIHMgPDwgImZvciAoc2l6ZV90IGkgPSAwOyBpIDwgIiA8PCBwYXJhbS0+R2V0TmFtZSgpIDw8ICIuc2l6ZSgpOyBpKyspIHsiOwotICAgICAgLy8gU2VyaWFsaXplIGVhY2ggc3RydWN0Ci0gICAgICBzIDw8ICJhdXRvICIgPDwgcGFyYW0tPkdldE5hbWUoKSArICJfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOyI7Ci0gICAgICBzIDw8IHBhcmFtLT5HZXROYW1lKCkgKyAiX2J5dGVzLT5yZXNlcnZlKCIgPDwgcGFyYW0tPkdldE5hbWUoKSA8PCAiW2ldLT5zaXplKCkpOyI7Ci0gICAgICBzIDw8ICJCaXRJbnNlcnRlciAiIDw8IHBhcmFtLT5HZXROYW1lKCkgKyAiX2JpKCoiIDw8IHBhcmFtLT5HZXROYW1lKCkgPDwgIl9ieXRlcyk7IjsKLSAgICAgIHMgPDwgcGFyYW0tPkdldE5hbWUoKSA8PCAiW2ldLT5TZXJpYWxpemUoIiA8PCBwYXJhbS0+R2V0TmFtZSgpIDw8ICJfYmkpOyI7Ci0gICAgICAvLyBQYXJzZSBpdCBhZ2FpbgotICAgICAgcyA8PCAiYXV0byAiIDw8IHBhcmFtLT5HZXROYW1lKCkgPDwgIl92aWV3ID0gUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPigiIDw8IHBhcmFtLT5HZXROYW1lKCkgPDwgIl9ieXRlcyk7IjsKLSAgICAgIHMgPDwgcGFyYW0tPkdldEVsZW1lbnRGaWVsZCgpLT5HZXREYXRhVHlwZSgpIDw8ICIgIiA8PCBwYXJhbS0+R2V0TmFtZSgpIDw8ICJfcmVwYXJzZWQgPSAiOwotICAgICAgcyA8PCAiUGFyc2UiIDw8IHN0cnVjdF90eXBlIDw8ICIoIiA8PCBwYXJhbS0+R2V0TmFtZSgpICsgIl92aWV3LmJlZ2luKCkpOyI7Ci0gICAgICAvLyBQdXNoIGl0IGludG8gYSBuZXcgY29udGFpbmVyCi0gICAgICBpZiAocGFyYW0tPkdldEZpZWxkVHlwZSgpID09IFZlY3RvckZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIHMgPDwgbW92ZV9vbmx5X3BhcmFtX25hbWUgPDwgIi5wdXNoX2JhY2soc3RkOjptb3ZlKCIgPDwgcGFyYW0tPkdldE5hbWUoKSArICJfcmVwYXJzZWQpKTsiOwotICAgICAgfSBlbHNlIGlmIChwYXJhbS0+R2V0RmllbGRUeXBlKCkgPT0gQXJyYXlGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBzIDw8IG1vdmVfb25seV9wYXJhbV9uYW1lIDw8ICJbaV0gPSBzdGQ6Om1vdmUoIiA8PCBwYXJhbS0+R2V0TmFtZSgpIDw8ICJfcmVwYXJzZWQpOyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFUlJPUigpIDw8IHBhcmFtIDw8ICIgaXMgbm90IHN1cHBvcnRlZCBieSBQeWJpbmQxMSI7Ci0gICAgICB9Ci0gICAgICBzIDw8ICJ9IjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gU2VyaWFsaXplIHRoZSBwYXJhbWV0ZXIgYW5kIHBhc3MgdGhlIGJ5dGVzIGluIGEgUmF3QnVpbGRlcgotICAgICAgcyA8PCAic3RkOjp2ZWN0b3I8dWludDhfdD4gIiA8PCBwYXJhbS0+R2V0TmFtZSgpICsgIl9ieXRlczsiOwotICAgICAgcyA8PCBwYXJhbS0+R2V0TmFtZSgpICsgIl9ieXRlcy5yZXNlcnZlKCIgPDwgcGFyYW0tPkdldE5hbWUoKSA8PCAiLT5zaXplKCkpOyI7Ci0gICAgICBzIDw8ICJCaXRJbnNlcnRlciAiIDw8IHBhcmFtLT5HZXROYW1lKCkgKyAiX2JpKCIgPDwgcGFyYW0tPkdldE5hbWUoKSA8PCAiX2J5dGVzKTsiOwotICAgICAgcyA8PCBwYXJhbS0+R2V0TmFtZSgpIDw8ICItPlNlcmlhbGl6ZSgiIDw8IHBhcmFtLT5HZXROYW1lKCkgKyAiX2JpKTsiOwotICAgICAgcyA8PCBtb3ZlX29ubHlfcGFyYW1fbmFtZSA8PCAiID0gIjsKLSAgICAgIHMgPDwgInN0ZDo6bWFrZV91bmlxdWU8UmF3QnVpbGRlcj4oIiA8PCBwYXJhbS0+R2V0TmFtZSgpIDw8ICJfYnl0ZXMpOyI7Ci0gICAgfQotICB9Ci0gIHMgPDwgInJldHVybiAiIDw8IG5hbWVfIDw8ICJCdWlsZGVyOjpDcmVhdGUoIjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGJ1aWxkZXJfdmFyczsKLSAgZm9yIChjb25zdCBhdXRvJiBwYXJhbSA6IHBhcmFtcykgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIGF1dG8gcGFyYW1fdHlwZSA9IHBhcmFtLT5HZXRCdWlsZGVyUGFyYW1ldGVyVHlwZSgpOwotICAgIGlmIChwYXJhbV90eXBlLmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBhdXRvIHBhcmFtX25hbWUgPSBwYXJhbS0+R2V0TmFtZSgpOwotICAgIGlmIChwYXJhbS0+QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkpIHsKLSAgICAgIHNzIDw8ICJzdGQ6Om1vdmUoIiA8PCBwYXJhbV9uYW1lIDw8ICJfbW92ZV9vbmx5KSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNzIDw8IHBhcmFtX25hbWU7Ci0gICAgfQotICAgIGJ1aWxkZXJfdmFycy5wdXNoX2JhY2soc3Muc3RyKCkpOwotICB9Ci0gIHMgPDwgdXRpbDo6U3RyaW5nSm9pbigiLCIsIGJ1aWxkZXJfdmFycykgPDwgIik7fSI7Ci0gIHMgPDwgIikpIjsKLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlbkJ1aWxkZXJQYXJhbWV0ZXJDaGVja2VyKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBGaWVsZExpc3QgcGFyYW1zX3RvX3ZhbGlkYXRlID0gR2V0UGFyYW1ldGVyc1RvVmFsaWRhdGUoKTsKLQotICAvLyBTa2lwIHdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHZhbGlkYXRlLgotICBpZiAocGFyYW1zX3RvX3ZhbGlkYXRlLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgZnVuY3Rpb24gYXJndW1lbnRzLgotICBzIDw8ICJ2b2lkIENoZWNrUGFyYW1ldGVyVmFsdWVzKCI7Ci0gIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXNfdG9fdmFsaWRhdGUuc2l6ZSgpOyBpKyspIHsKLSAgICBwYXJhbXNfdG9fdmFsaWRhdGVbaV0tPkdlbkJ1aWxkZXJQYXJhbWV0ZXIocyk7Ci0gICAgaWYgKGkgIT0gcGFyYW1zX3RvX3ZhbGlkYXRlLnNpemUoKSAtIDEpIHsKLSAgICAgIHMgPDwgIiwgIjsKLSAgICB9Ci0gIH0KLSAgcyA8PCAiKSB7IjsKLQotICAvLyBDaGVjayB0aGUgcGFyYW1ldGVycy4KLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IHBhcmFtc190b192YWxpZGF0ZSkgewotICAgIGZpZWxkLT5HZW5QYXJhbWV0ZXJWYWxpZGF0b3Iocyk7Ci0gIH0KLSAgcyA8PCAifVxuIjsKLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlbkJ1aWxkZXJDb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiZXhwbGljaXQgIiA8PCBuYW1lXyA8PCAiQnVpbGRlcigiOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgotICBhdXRvIHBhcmFtcyA9IEdldFBhcmFtTGlzdCgpLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBCb2R5RmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgcGFyYW1zW2ldLT5HZW5CdWlsZGVyUGFyYW1ldGVyKHMpOwotICAgIGlmIChpICE9IHBhcmFtcy5zaXplKCkgLSAxKSB7Ci0gICAgICBzIDw8ICIsICI7Ci0gICAgfQotICB9Ci0gIGlmIChwYXJhbXMuc2l6ZSgpID4gMCB8fCBwYXJlbnRfY29uc3RyYWludHNfLnNpemUoKSA+IDApIHsKLSAgICBzIDw8ICIpIDoiOwotICB9IGVsc2UgewotICAgIHMgPDwgIikiOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBsaXN0IG9mIHBhcmVudCBwYXJhbXMgdG8gY2FsbCB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHdpdGguCi0gIEZpZWxkTGlzdCBwYXJlbnRfcGFyYW1zOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgLy8gUGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBwYXJlbnQgY29uc3RydWN0b3IKLSAgICBzIDw8IHBhcmVudF8tPm5hbWVfIDw8ICJCdWlsZGVyKCI7Ci0gICAgcGFyZW50X3BhcmFtcyA9IHBhcmVudF8tPkdldFBhcmFtTGlzdCgpLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICAgIFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgIH0pOwotCi0gICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIGZpZWxkcyBhbmQgcmVwbGFjZSBjb25zdHJhaW5lZCBmaWVsZHMgd2l0aCBmaXhlZCB2YWx1ZXMKLSAgICAvLyB3aGVuIGNhbGxpbmcgdGhlIHBhcmVudCBjb25zdHJ1Y3Rvci4KLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcGFyZW50X3BhcmFtcy5zaXplKCk7IGkrKykgewotICAgICAgY29uc3QgYXV0byYgZmllbGQgPSBwYXJlbnRfcGFyYW1zW2ldOwotICAgICAgY29uc3QgYXV0byYgY29uc3RyYWludCA9IHBhcmVudF9jb25zdHJhaW50c18uZmluZChmaWVsZC0+R2V0TmFtZSgpKTsKLSAgICAgIGlmIChjb25zdHJhaW50ICE9IHBhcmVudF9jb25zdHJhaW50c18uZW5kKCkpIHsKLSAgICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgIHMgPDwgc3RkOjpnZXQ8aW50NjRfdD4oY29uc3RyYWludC0+c2Vjb25kKTsKLSAgICAgICAgfSBlbHNlIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRW51bUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgICAgcyA8PCBzdGQ6OmdldDxzdGQ6OnN0cmluZz4oY29uc3RyYWludC0+c2Vjb25kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBFUlJPUihmaWVsZCkgPDwgIkNvbnN0cmFpbnRzIG9uIG5vbiBlbnVtL3NjYWxhciBmaWVsZHMgc2hvdWxkIGJlIGltcG9zc2libGUuIjsKLSAgICAgICAgfQotCi0gICAgICAgIHMgPDwgIi8qICIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiXyAqLyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzIDw8IGZpZWxkLT5HZXROYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpICE9IHBhcmVudF9wYXJhbXMuc2l6ZSgpIC0gMSkgewotICAgICAgICBzIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgfQotICAgIHMgPDwgIikgIjsKLSAgfQotCi0gIC8vIEJ1aWxkIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgZXhjbHVkZXMgYWxsIHBhcmVudCBwYXJhbWV0ZXJzLgotICBGaWVsZExpc3Qgc2F2ZWRfcGFyYW1zOwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogcGFyYW1zKSB7Ci0gICAgaWYgKHBhcmVudF9wYXJhbXMuR2V0RmllbGQoZmllbGQtPkdldE5hbWUoKSkgPT0gbnVsbHB0cikgewotICAgICAgc2F2ZWRfcGFyYW1zLkFwcGVuZEZpZWxkKGZpZWxkKTsKLSAgICB9Ci0gIH0KLSAgaWYgKHBhcmVudF8gIT0gbnVsbHB0ciAmJiBzYXZlZF9wYXJhbXMuc2l6ZSgpID4gMCkgewotICAgIHMgPDwgIiwiOwotICB9Ci0gIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzYXZlZF9wYXJhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBhdXRvJiBzYXZlZF9wYXJhbV9uYW1lID0gc2F2ZWRfcGFyYW1zW2ldLT5HZXROYW1lKCk7Ci0gICAgaWYgKHNhdmVkX3BhcmFtc1tpXS0+QnVpbGRlclBhcmFtZXRlck11c3RCZU1vdmVkKCkpIHsKLSAgICAgIHMgPDwgc2F2ZWRfcGFyYW1fbmFtZSA8PCAiXyhzdGQ6Om1vdmUoIiA8PCBzYXZlZF9wYXJhbV9uYW1lIDw8ICIpKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgc2F2ZWRfcGFyYW1fbmFtZSA8PCAiXygiIDw8IHNhdmVkX3BhcmFtX25hbWUgPDwgIikiOwotICAgIH0KLSAgICBpZiAoaSAhPSBzYXZlZF9wYXJhbXMuc2l6ZSgpIC0gMSkgewotICAgICAgcyA8PCAiLCI7Ci0gICAgfQotICB9Ci0gIHMgPDwgIiB7IjsKLQotICBGaWVsZExpc3QgcGFyYW1zX3RvX3ZhbGlkYXRlID0gR2V0UGFyYW1ldGVyc1RvVmFsaWRhdGUoKTsKLQotICBpZiAocGFyYW1zX3RvX3ZhbGlkYXRlLnNpemUoKSA+IDApIHsKLSAgICBzIDw8ICJDaGVja1BhcmFtZXRlclZhbHVlcygiOwotICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXNfdG9fdmFsaWRhdGUuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHMgPDwgcGFyYW1zX3RvX3ZhbGlkYXRlW2ldLT5HZXROYW1lKCkgPDwgIl8iOwotICAgICAgaWYgKGkgIT0gcGFyYW1zX3RvX3ZhbGlkYXRlLnNpemUoKSAtIDEpIHsKLSAgICAgICAgcyA8PCAiLCAiOwotICAgICAgfQotICAgIH0KLSAgICBzIDw8ICIpOyI7Ci0gIH0KLQotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIFBhY2tldERlZjo6R2VuUnVzdENoaWxkRW51bXMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGlmIChIYXNDaGlsZEVudW1zKCkpIHsKLSAgICBib29sIHBheWxvYWQgPSBmaWVsZHNfLkhhc1BheWxvYWQoKTsKLSAgICBzIDw8ICIjW2Rlcml2ZShEZWJ1ZyldICI7Ci0gICAgcyA8PCAiZW51bSAiIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQgeyI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjaGlsZCA6IGNoaWxkcmVuXykgewotICAgICAgcyA8PCBjaGlsZC0+bmFtZV8gPDwgIihBcmM8IiA8PCBjaGlsZC0+bmFtZV8gPDwgIkRhdGE+KSwiOwotICAgIH0KLSAgICBpZiAocGF5bG9hZCkgewotICAgICAgcyA8PCAiUGF5bG9hZChCeXRlcyksIjsKLSAgICB9Ci0gICAgcyA8PCAiTm9uZSwiOwotICAgIHMgPDwgIn1cbiI7Ci0KLSAgICBzIDw8ICJpbXBsICIgPDwgbmFtZV8gPDwgIkRhdGFDaGlsZCB7IjsKLSAgICBzIDw8ICJmbiBnZXRfdG90YWxfc2l6ZSgmc2VsZikgLT4gdXNpemUgeyI7Ci0gICAgcyA8PCAibWF0Y2ggc2VsZiB7IjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogY2hpbGRyZW5fKSB7Ci0gICAgICBzIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6OiIgPDwgY2hpbGQtPm5hbWVfIDw8ICIodmFsdWUpID0+IHZhbHVlLmdldF90b3RhbF9zaXplKCksIjsKLSAgICB9Ci0gICAgaWYgKHBheWxvYWQpIHsKLSAgICAgIHMgPDwgbmFtZV8gPDwgIkRhdGFDaGlsZDo6UGF5bG9hZChwKSA9PiBwLmxlbigpLCI7Ci0gICAgfQotICAgIHMgPDwgbmFtZV8gPDwgIkRhdGFDaGlsZDo6Tm9uZSA9PiAwLCI7Ci0gICAgcyA8PCAifVxuIjsKLSAgICBzIDw8ICJ9XG4iOwotICAgIHMgPDwgIn1cbiI7Ci0KLSAgICBzIDw8ICIjW2Rlcml2ZShEZWJ1ZyldICI7Ci0gICAgcyA8PCAicHViIGVudW0gIiA8PCBuYW1lXyA8PCAiQ2hpbGQgeyI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjaGlsZCA6IGNoaWxkcmVuXykgewotICAgICAgcyA8PCBjaGlsZC0+bmFtZV8gPDwgIigiIDw8IGNoaWxkLT5uYW1lXyA8PCAiUGFja2V0KSwiOwotICAgIH0KLSAgICBpZiAocGF5bG9hZCkgewotICAgICAgcyA8PCAiUGF5bG9hZChCeXRlcyksIjsKLSAgICB9Ci0gICAgcyA8PCAiTm9uZSwiOwotICAgIHMgPDwgIn1cbiI7Ci0gIH0KLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblJ1c3RTdHJ1Y3REZWNsYXJhdGlvbnMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIHMgPDwgIiNbZGVyaXZlKERlYnVnKV0gIjsKLSAgcyA8PCAic3RydWN0ICIgPDwgbmFtZV8gPDwgIkRhdGEgeyI7Ci0KLSAgLy8gR2VuZXJhdGUgc3RydWN0IGZpZWxkcwotICBHZW5SdXN0U3RydWN0RmllbGROYW1lQW5kVHlwZShzKTsKLSAgaWYgKEhhc0NoaWxkRW51bXMoKSkgewotICAgIHMgPDwgImNoaWxkOiAiIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQsIjsKLSAgfQotICBzIDw8ICJ9XG4iOwotCi0gIC8vIEdlbmVyYXRlIGFjY2Vzc29yIHN0cnVjdAotICBzIDw8ICIjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUpXSAiOwotICBzIDw8ICJwdWIgc3RydWN0ICIgPDwgbmFtZV8gPDwgIlBhY2tldCB7IjsKLSAgYXV0byBsaW5lYWdlID0gR2V0QW5jZXN0b3JzKCk7Ci0gIGxpbmVhZ2UucHVzaF9iYWNrKHRoaXMpOwotICBmb3IgKGF1dG8gaXQgPSBsaW5lYWdlLmJlZ2luKCk7IGl0ICE9IGxpbmVhZ2UuZW5kKCk7IGl0KyspIHsKLSAgICBhdXRvIGRlZiA9ICppdDsKLSAgICBzIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShkZWYtPm5hbWVfKSA8PCAiOiBBcmM8IiA8PCBkZWYtPm5hbWVfIDw8ICJEYXRhPiwiOwotICB9Ci0gIHMgPDwgIn1cbiI7Ci0KLSAgLy8gR2VuZXJhdGUgYnVpbGRlciBzdHJ1Y3QKLSAgcyA8PCAiI1tkZXJpdmUoRGVidWcpXSAiOwotICBzIDw8ICJwdWIgc3RydWN0ICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXIgeyI7Ci0gIGF1dG8gcGFyYW1zID0gR2V0UGFyYW1MaXN0KCkuR2V0RmllbGRzV2l0aG91dFR5cGVzKHsKLSAgICAgIFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgfSk7Ci0gIGZvciAoYXV0byBwYXJhbSA6IHBhcmFtcykgewotICAgIHMgPDwgInB1YiAiOwotICAgIHBhcmFtLT5HZW5SdXN0TmFtZUFuZFR5cGUocyk7Ci0gICAgcyA8PCAiLCAiOwotICB9Ci0gIGlmIChmaWVsZHNfLkhhc1BheWxvYWQoKSkgewotICAgIHMgPDwgInB1YiBwYXlsb2FkOiBPcHRpb248Qnl0ZXM+LCI7Ci0gIH0KLSAgcyA8PCAifVxuIjsKLX0KLQotYm9vbCBQYWNrZXREZWY6OkdlblJ1c3RTdHJ1Y3RGaWVsZE5hbWVBbmRUeXBlKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBhdXRvIGZpZWxkcyA9IGZpZWxkc18uR2V0RmllbGRzV2l0aG91dFR5cGVzKHsKLSAgICAgIEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIENvdW50RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBSZXNlcnZlZEZpZWxkOjprRmllbGRUeXBlLAotICAgICAgU2l6ZUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgUGF5bG9hZEZpZWxkOjprRmllbGRUeXBlLAotICAgICAgRml4ZWRTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgfSk7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkcykgewotICAgIGZpZWxkLT5HZW5SdXN0TmFtZUFuZFR5cGUocyk7Ci0gICAgcyA8PCAiLCAiOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBhY2tldERlZjo6R2VuUnVzdFN0cnVjdEZpZWxkTmFtZXMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGF1dG8gZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBGaXhlZFNjYWxhckZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLSAgZm9yIChjb25zdCBhdXRvIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgcyA8PCBmaWVsZC0+R2V0TmFtZSgpOwotICAgIHMgPDwgIiwgIjsKLSAgfQotfQotCi12b2lkIFBhY2tldERlZjo6R2VuUnVzdFN0cnVjdEltcGxzKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJpbXBsICIgPDwgbmFtZV8gPDwgIkRhdGEgeyI7Ci0KLSAgLy8gY29uZm9ybXMgZnVuY3Rpb24KLSAgcyA8PCAiZm4gY29uZm9ybXMoYnl0ZXM6ICZbdThdKSAtPiBib29sIHsiOwotICBHZW5SdXN0Q29uZm9ybWFuY2VDaGVjayhzKTsKLQotICBhdXRvIGZpZWxkcyA9IGZpZWxkc18uR2V0RmllbGRzV2l0aFR5cGVzKHsKLSAgICAgIFN0cnVjdEZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLQotICBmb3IgKGF1dG8gY29uc3QmIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgYXV0byBzdGFydF9vZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCBmYWxzZSk7Ci0gICAgYXV0byBlbmRfb2Zmc2V0ID0gR2V0T2Zmc2V0Rm9yRmllbGQoZmllbGQtPkdldE5hbWUoKSwgdHJ1ZSk7Ci0KLSAgICBzIDw8ICJpZiAhIiA8PCBmaWVsZC0+R2V0UnVzdERhdGFUeXBlKCkgPDwgIjo6Y29uZm9ybXMoJmJ5dGVzWyIgPDwgc3RhcnRfb2Zmc2V0LmJ5dGVzKCk7Ci0gICAgcyA8PCAiLi4iIDw8IHN0YXJ0X29mZnNldC5ieXRlcygpICsgZmllbGQtPkdldFNpemUoKS5ieXRlcygpIDw8ICJdKSB7IHJldHVybiBmYWxzZTsgfSI7Ci0gIH0KLQotICBzIDw8ICIgdHJ1ZSI7Ci0gIHMgPDwgIn0iOwotCi0gIC8vIHBhcnNlIGZ1bmN0aW9uCi0gIGlmIChwYXJlbnRfY29uc3RyYWludHNfLmVtcHR5KCkgJiYgY2hpbGRyZW5fLnNpemUoKSA+IDEgJiYgcGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBjb25zdHJhaW50ID0gRmluZENvbnN0cmFpbnRGaWVsZCgpOwotICAgIGF1dG8gY29uc3RyYWludF9maWVsZCA9IEdldFBhcmFtTGlzdCgpLkdldEZpZWxkKGNvbnN0cmFpbnQpOwotICAgIGF1dG8gY29uc3RyYWludF90eXBlID0gY29uc3RyYWludF9maWVsZC0+R2V0UnVzdERhdGFUeXBlKCk7Ci0gICAgcyA8PCAiZm4gcGFyc2UoYnl0ZXM6ICZbdThdLCAiIDw8IGNvbnN0cmFpbnQgPDwgIjogIiA8PCBjb25zdHJhaW50X3R5cGUgPDwgIikgLT4gUmVzdWx0PFNlbGY+IHsiOwotICB9IGVsc2UgewotICAgIHMgPDwgImZuIHBhcnNlKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGY+IHsiOwotICB9Ci0gIGZpZWxkcyA9IGZpZWxkc18uR2V0RmllbGRzV2l0aG91dFR5cGVzKHsKLSAgICAgIEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgfSk7Ci0KLSAgZm9yIChhdXRvIGNvbnN0JiBmaWVsZCA6IGZpZWxkcykgewotICAgIGF1dG8gc3RhcnRfZmllbGRfb2Zmc2V0ID0gR2V0T2Zmc2V0Rm9yRmllbGQoZmllbGQtPkdldE5hbWUoKSwgZmFsc2UpOwotICAgIGF1dG8gZW5kX2ZpZWxkX29mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKGZpZWxkLT5HZXROYW1lKCksIHRydWUpOwotCi0gICAgaWYgKHN0YXJ0X2ZpZWxkX29mZnNldC5lbXB0eSgpICYmIGVuZF9maWVsZF9vZmZzZXQuZW1wdHkoKSkgewotICAgICAgRVJST1IoZmllbGQpIDw8ICJGaWVsZCBsb2NhdGlvbiBmb3IgIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICIgaXMgYW1iaWd1b3VzLCAiCi0gICAgICAgICAgICAgICAgICAgPDwgIm5vIG1ldGhvZCBleGlzdHMgdG8gZGV0ZXJtaW5lIGZpZWxkIGxvY2F0aW9uIGZyb20gYmVnaW4oKSBvciBlbmQoKS5cbiI7Ci0gICAgfQotCi0gICAgZmllbGQtPkdlbkJvdW5kc0NoZWNrKHMsIHN0YXJ0X2ZpZWxkX29mZnNldCwgZW5kX2ZpZWxkX29mZnNldCwgbmFtZV8pOwotICAgIGZpZWxkLT5HZW5SdXN0R2V0dGVyKHMsIHN0YXJ0X2ZpZWxkX29mZnNldCwgZW5kX2ZpZWxkX29mZnNldCk7Ci0gIH0KLQotICBhdXRvIHBheWxvYWRfZmllbGQgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhUeXBlcyh7Ci0gICAgUGF5bG9hZEZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLQotICBTaXplIHBheWxvYWRfb2Zmc2V0OwotCi0gIGlmIChwYXlsb2FkX2ZpZWxkLkhhc1BheWxvYWQoKSkgewotICAgIHBheWxvYWRfb2Zmc2V0ID0gR2V0T2Zmc2V0Rm9yRmllbGQocGF5bG9hZF9maWVsZFswXS0+R2V0TmFtZSgpLCBmYWxzZSk7Ci0gIH0KLQotICBhdXRvIGNvbnN0cmFpbnRfbmFtZSA9IEZpbmRDb25zdHJhaW50RmllbGQoKTsKLSAgYXV0byBjb25zdHJhaW5lZF9kZXNjZW5kYW50cyA9IEZpbmREZXNjZW5kYW50c1dpdGhDb25zdHJhaW50KGNvbnN0cmFpbnRfbmFtZSk7Ci0KLSAgaWYgKGNoaWxkcmVuXy5zaXplKCkgPiAxKSB7Ci0gICAgcyA8PCAibGV0IGNoaWxkID0gbWF0Y2ggIiA8PCBjb25zdHJhaW50X25hbWUgPDwgIiB7IjsKLQotICAgIGZvciAoY29uc3QgYXV0byYgZGVzYyA6IGNvbnN0cmFpbmVkX2Rlc2NlbmRhbnRzKSB7Ci0gICAgICBhdXRvIGRlc2NfcGF0aCA9IEZpbmRQYXRoVG9EZXNjZW5kYW50KGRlc2MuZmlyc3QtPm5hbWVfKTsKLSAgICAgIHN0ZDo6cmV2ZXJzZShkZXNjX3BhdGguYmVnaW4oKSwgZGVzY19wYXRoLmVuZCgpKTsKLSAgICAgIGF1dG8gY29uc3RyYWludF9maWVsZCA9IEdldFBhcmFtTGlzdCgpLkdldEZpZWxkKGNvbnN0cmFpbnRfbmFtZSk7Ci0gICAgICBhdXRvIGNvbnN0cmFpbnRfdHlwZSA9IGNvbnN0cmFpbnRfZmllbGQtPkdldEZpZWxkVHlwZSgpOwotCi0gICAgICBpZiAoY29uc3RyYWludF90eXBlID09IEVudW1GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBhdXRvIHR5cGUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4oZGVzYy5zZWNvbmQpOwotICAgICAgICBhdXRvIHZhcmlhbnRfbmFtZSA9IHR5cGUuc3Vic3RyKHR5cGUuZmluZCgiOjoiKSArIDIsIHR5cGUubGVuZ3RoKCkpOwotICAgICAgICBhdXRvIGVudW1fdHlwZSA9IHR5cGUuc3Vic3RyKDAsIHR5cGUuZmluZCgiOjoiKSk7Ci0gICAgICAgIGF1dG8gZW51bV92YXJpYW50ID0gZW51bV90eXBlICsgIjo6IgotICAgICAgICAgICAgKyB1dGlsOjpVbmRlcnNjb3JlVG9DYW1lbENhc2UodXRpbDo6VG9Mb3dlckNhc2UodmFyaWFudF9uYW1lKSk7Ci0gICAgICAgIHMgPDwgZW51bV92YXJpYW50OwotICAgICAgICBzIDw8ICIgaWYgIiA8PCBkZXNjX3BhdGhbMF0tPm5hbWVfIDw8ICJEYXRhOjpjb25mb3JtcygmYnl0ZXNbLi5dKSI7Ci0gICAgICAgIHMgPDwgIiA9PiB7IjsKLSAgICAgICAgcyA8PCBuYW1lXyA8PCAiRGF0YUNoaWxkOjoiOwotICAgICAgICBzIDw8IGRlc2NfcGF0aFswXS0+bmFtZV8gPDwgIihBcmM6Om5ldygiOwotICAgICAgICBpZiAoZGVzY19wYXRoWzBdLT5wYXJlbnRfY29uc3RyYWludHNfLmVtcHR5KCkpIHsKLSAgICAgICAgICBzIDw8IGRlc2NfcGF0aFswXS0+bmFtZV8gPDwgIkRhdGE6OnBhcnNlKCZieXRlc1suLl0iOwotICAgICAgICAgIHMgPDwgIiwgIiA8PCBlbnVtX3ZhcmlhbnQgPDwgIik/KSkiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHMgPDwgZGVzY19wYXRoWzBdLT5uYW1lXyA8PCAiRGF0YTo6cGFyc2UoJmJ5dGVzWy4uXSk/KSkiOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRfdHlwZSA9PSBTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBzIDw8IHN0ZDo6Z2V0PGludDY0X3Q+KGRlc2Muc2Vjb25kKSA8PCAiID0+IHsiOwotICAgICAgICBzIDw8ICJ1bmltcGxlbWVudGVkISgpOyI7Ci0gICAgICB9Ci0gICAgICBzIDw8ICJ9XG4iOwotICAgIH0KLQotICAgIGlmICghY29uc3RyYWluZWRfZGVzY2VuZGFudHMuZW1wdHkoKSkgewotICAgICAgcyA8PCAidiA9PiByZXR1cm4gRXJyKEVycm9yOjpDb25zdHJhaW50T3V0T2ZCb3VuZHN7ZmllbGQ6IFwiIiA8PCBjb25zdHJhaW50X25hbWUKLSAgICAgICAgPDwgIlwiLnRvX3N0cmluZygpLCB2YWx1ZTogdiBhcyB1NjR9KSwiOwotICAgIH0KLQotICAgIHMgPDwgIn07XG4iOwotICB9IGVsc2UgaWYgKGNoaWxkcmVuXy5zaXplKCkgPT0gMSkgewotICAgIGF1dG8gY2hpbGQgPSBjaGlsZHJlbl8uYXQoMCk7Ci0gICAgcyA8PCAibGV0IGNoaWxkID0gbWF0Y2ggIiA8PCBjaGlsZC0+bmFtZV8gPDwgIkRhdGE6OnBhcnNlKCZieXRlc1suLl0pIHsiOwotICAgIHMgPDwgIiBPayhjKSBpZiAiIDw8IGNoaWxkLT5uYW1lXyA8PCAiRGF0YTo6Y29uZm9ybXMoJmJ5dGVzWy4uXSkgPT4geyI7Ci0gICAgcyA8PCBuYW1lXyA8PCAiRGF0YUNoaWxkOjoiIDw8IGNoaWxkLT5uYW1lXyA8PCAiKEFyYzo6bmV3KGMpKSI7Ci0gICAgcyA8PCAiIH0sIjsKLSAgICBzIDw8ICIgRXJyKEVycm9yOjpJbnZhbGlkTGVuZ3RoRXJyb3IgeyAuLiB9KSA9PiAiIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6Ok5vbmUsIjsKLSAgICBzIDw8ICIgXyA9PiByZXR1cm4gRXJyKEVycm9yOjpJbnZhbGlkUGFja2V0RXJyb3IpLCI7Ci0gICAgcyA8PCAifTsiOwotICB9IGVsc2UgaWYgKGZpZWxkc18uSGFzUGF5bG9hZCgpKSB7Ci0gICAgcyA8PCAibGV0IGNoaWxkID0gaWYgcGF5bG9hZC5sZW4oKSA+IDAgeyI7Ci0gICAgcyA8PCBuYW1lXyA8PCAiRGF0YUNoaWxkOjpQYXlsb2FkKEJ5dGVzOjpmcm9tKHBheWxvYWQpKSI7Ci0gICAgcyA8PCAifSBlbHNlIHsiOwotICAgIHMgPDwgbmFtZV8gPDwgIkRhdGFDaGlsZDo6Tm9uZSI7Ci0gICAgcyA8PCAifTsiOwotICB9Ci0KLSAgcyA8PCAiT2soU2VsZiB7IjsKLSAgZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBGaXhlZFNjYWxhckZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICBhdXRvIGZpZWxkX3R5cGUgPSBmaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgICBzIDw8IGZpZWxkLT5HZXROYW1lKCk7Ci0gICAgICBzIDw8ICIsICI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKEhhc0NoaWxkRW51bXMoKSkgewotICAgIHMgPDwgImNoaWxkLCI7Ci0gIH0KLSAgcyA8PCAifSlcbiI7Ci0gIHMgPDwgIn1cbiI7Ci0KLSAgLy8gd3JpdGVfdG8gZnVuY3Rpb24KLSAgcyA8PCAiZm4gd3JpdGVfdG8oJnNlbGYsIGJ1ZmZlcjogJm11dCBCeXRlc011dCkgeyI7Ci0gIEdlblJ1c3RXcml0ZVRvRmllbGRzKHMpOwotCi0gIGlmIChIYXNDaGlsZEVudW1zKCkpIHsKLSAgICBzIDw8ICJtYXRjaCAmc2VsZi5jaGlsZCB7IjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogY2hpbGRyZW5fKSB7Ci0gICAgICBzIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6OiIgPDwgY2hpbGQtPm5hbWVfIDw8ICIodmFsdWUpID0+IHZhbHVlLndyaXRlX3RvKGJ1ZmZlciksIjsKLSAgICB9Ci0gICAgaWYgKGZpZWxkc18uSGFzUGF5bG9hZCgpKSB7Ci0gICAgICBhdXRvIG9mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKCJwYXlsb2FkIik7Ci0gICAgICBzIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6OlBheWxvYWQocCkgPT4gYnVmZmVyWyIgPDwgb2Zmc2V0LmJ5dGVzKCkgPDwgIi4uXS5jb3B5X2Zyb21fc2xpY2UoJnBbLi5dKSwiOwotICAgIH0KLSAgICBzIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6Ok5vbmUgPT4ge30iOwotICAgIHMgPDwgIn0iOwotICB9Ci0KLSAgcyA8PCAifVxuIjsKLQotICBzIDw8ICJmbiBnZXRfdG90YWxfc2l6ZSgmc2VsZikgLT4gdXNpemUgeyI7Ci0gIGlmIChIYXNDaGlsZEVudW1zKCkpIHsKLSAgICBzIDw8ICJzZWxmLmdldF9zaXplKCkgKyBzZWxmLmNoaWxkLmdldF90b3RhbF9zaXplKCkiOwotICB9IGVsc2UgewotICAgIHMgPDwgInNlbGYuZ2V0X3NpemUoKSI7Ci0gIH0KLSAgcyA8PCAifVxuIjsKLQotICBzIDw8ICJmbiBnZXRfc2l6ZSgmc2VsZikgLT4gdXNpemUgeyI7Ci0gIEdlblNpemVSZXRWYWwocyk7Ci0gIHMgPDwgIn1cbiI7Ci0gIHMgPDwgIn1cbiI7Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5SdXN0QWNjZXNzU3RydWN0SW1wbHMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGlmIChjb21wbGVtZW50XyAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBjb21wbGVtZW50X3Jvb3QgPSBjb21wbGVtZW50Xy0+R2V0Um9vdERlZigpOwotICAgIGF1dG8gY29tcGxlbWVudF9yb290X2FjY2Vzc29yID0gdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKGNvbXBsZW1lbnRfcm9vdC0+bmFtZV8pOwotICAgIHMgPDwgImltcGwgQ29tbWFuZEV4cGVjdGF0aW9ucyBmb3IgIiA8PCBuYW1lXyA8PCAiUGFja2V0IHsiOwotICAgIHMgPDwgIiB0eXBlIFJlc3BvbnNlVHlwZSA9ICIgPDwgY29tcGxlbWVudF8tPm5hbWVfIDw8ICJQYWNrZXQ7IjsKLSAgICBzIDw8ICIgZm4gX3RvX3Jlc3BvbnNlX3R5cGUocGt0OiBFdmVudFBhY2tldCkgLT4gU2VsZjo6UmVzcG9uc2VUeXBlIHsgIjsKLSAgICBzIDw8IGNvbXBsZW1lbnRfLT5uYW1lXyA8PCAiUGFja2V0OjpuZXcocGt0LiIgPDwgY29tcGxlbWVudF9yb290X2FjY2Vzc29yIDw8ICIuY2xvbmUoKSkiOwotICAgIHMgPDwgIiB9IjsKLSAgICBzIDw8ICJ9IjsKLSAgfQotCi0gIHMgPDwgImltcGwgUGFja2V0IGZvciAiIDw8IG5hbWVfIDw8ICJQYWNrZXQgeyI7Ci0gIGF1dG8gcm9vdCA9IEdldFJvb3REZWYoKTsKLSAgYXV0byByb290X2FjY2Vzc29yID0gdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHJvb3QtPm5hbWVfKTsKLQotICBzIDw8ICJmbiB0b19ieXRlcyhzZWxmKSAtPiBCeXRlcyB7IjsKLSAgcyA8PCAiIGxldCBtdXQgYnVmZmVyID0gQnl0ZXNNdXQ6Om5ldygpOyI7Ci0gIHMgPDwgIiBidWZmZXIucmVzaXplKHNlbGYuIiA8PCByb290X2FjY2Vzc29yIDw8ICIuZ2V0X3RvdGFsX3NpemUoKSwgMCk7IjsKLSAgcyA8PCAiIHNlbGYuIiA8PCByb290X2FjY2Vzc29yIDw8ICIud3JpdGVfdG8oJm11dCBidWZmZXIpOyI7Ci0gIHMgPDwgIiBidWZmZXIuZnJlZXplKCkiOwotICBzIDw8ICJ9XG4iOwotCi0gIHMgPDwgImZuIHRvX3ZlYyhzZWxmKSAtPiBWZWM8dTg+IHsgc2VsZi50b19ieXRlcygpLnRvX3ZlYygpIH1cbiI7Ci0gIHMgPDwgIn0iOwotCi0gIHMgPDwgImltcGwgRnJvbTwiIDw8IG5hbWVfIDw8ICJQYWNrZXQiCi0gICAgPDwgIj4gZm9yIEJ5dGVzIHtcbiI7Ci0gIHMgPDwgImZuIGZyb20ocGFja2V0OiAiIDw8IG5hbWVfIDw8ICJQYWNrZXQiCi0gICAgPDwgIikgLT4gU2VsZiB7XG4iOwotICBzIDw8ICJwYWNrZXQudG9fYnl0ZXMoKVxuIjsKLSAgcyA8PCAifVxuIjsKLSAgcyA8PCAifVxuIjsKLQotICBzIDw8ICJpbXBsIEZyb208IiA8PCBuYW1lXyA8PCAiUGFja2V0IgotICAgIDw8ICI+IGZvciBWZWM8dTg+IHtcbiI7Ci0gIHMgPDwgImZuIGZyb20ocGFja2V0OiAiIDw8IG5hbWVfIDw8ICJQYWNrZXQiCi0gICAgPDwgIikgLT4gU2VsZiB7XG4iOwotICBzIDw8ICJwYWNrZXQudG9fdmVjKClcbiI7Ci0gIHMgPDwgIn1cbiI7Ci0gIHMgPDwgIn1cbiI7Ci0KLSAgcyA8PCAiaW1wbCAiIDw8IG5hbWVfIDw8ICJQYWNrZXQgeyI7Ci0gIGlmIChwYXJlbnRfID09IG51bGxwdHIpIHsKLSAgICBzIDw8ICJwdWIgZm4gcGFyc2UoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZj4geyAiOwotICAgIHMgPDwgIk9rKFNlbGY6Om5ldyhBcmM6Om5ldygiIDw8IG5hbWVfIDw8ICJEYXRhOjpwYXJzZShieXRlcyk/KSkpIjsKLSAgICBzIDw8ICJ9IjsKLSAgfQotCi0gIGlmIChIYXNDaGlsZEVudW1zKCkpIHsKLSAgICBzIDw8ICIgcHViIGZuIHNwZWNpYWxpemUoJnNlbGYpIC0+ICIgPDwgbmFtZV8gPDwgIkNoaWxkIHsiOwotICAgIHMgPDwgIiBtYXRjaCAmc2VsZi4iIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShuYW1lXykgPDwgIi5jaGlsZCB7IjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogY2hpbGRyZW5fKSB7Ci0gICAgICBzIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6OiIgPDwgY2hpbGQtPm5hbWVfIDw8ICIoXykgPT4gIiA8PCBuYW1lXyA8PCAiQ2hpbGQ6OiIgPDwgY2hpbGQtPm5hbWVfIDw8ICIoIgotICAgICAgICA8PCBjaGlsZC0+bmFtZV8gPDwgIlBhY2tldDo6bmV3KHNlbGYuIiA8PCByb290X2FjY2Vzc29yIDw8ICIuY2xvbmUoKSkpLCI7Ci0gICAgfQotICAgIGlmIChmaWVsZHNfLkhhc1BheWxvYWQoKSkgewotICAgICAgcyA8PCBuYW1lXyA8PCAiRGF0YUNoaWxkOjpQYXlsb2FkKHApID0+ICIgPDwgbmFtZV8gPDwgIkNoaWxkOjpQYXlsb2FkKHAuY2xvbmUoKSksIjsKLSAgICB9Ci0gICAgcyA8PCBuYW1lXyA8PCAiRGF0YUNoaWxkOjpOb25lID0+ICIgPDwgbmFtZV8gPDwgIkNoaWxkOjpOb25lLCI7Ci0gICAgcyA8PCAifX0iOwotICB9Ci0gIGF1dG8gbGluZWFnZSA9IEdldEFuY2VzdG9ycygpOwotICBsaW5lYWdlLnB1c2hfYmFjayh0aGlzKTsKLSAgY29uc3QgUGFyZW50RGVmKiBwcmV2ID0gbnVsbHB0cjsKLQotICBzIDw8ICIgZm4gbmV3KHJvb3Q6IEFyYzwiIDw8IHJvb3QtPm5hbWVfIDw8ICJEYXRhPikgLT4gU2VsZiB7IjsKLSAgZm9yIChhdXRvIGl0ID0gbGluZWFnZS5iZWdpbigpOyBpdCAhPSBsaW5lYWdlLmVuZCgpOyBpdCsrKSB7Ci0gICAgYXV0byBkZWYgPSAqaXQ7Ci0gICAgYXV0byBhY2Nlc3Nvcl9uYW1lID0gdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKGRlZi0+bmFtZV8pOwotICAgIGlmIChwcmV2ID09IG51bGxwdHIpIHsKLSAgICAgIHMgPDwgImxldCAiIDw8IGFjY2Vzc29yX25hbWUgPDwgIiA9IHJvb3Q7IjsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCAibGV0ICIgPDwgYWNjZXNzb3JfbmFtZSA8PCAiID0gbWF0Y2ggJiIgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHByZXYtPm5hbWVfKSA8PCAiLmNoaWxkIHsiOwotICAgICAgcyA8PCBwcmV2LT5uYW1lXyA8PCAiRGF0YUNoaWxkOjoiIDw8IGRlZi0+bmFtZV8gPDwgIih2YWx1ZSkgPT4gKCp2YWx1ZSkuY2xvbmUoKSwiOwotICAgICAgcyA8PCAiXyA9PiBwYW5pYyEoXCJpbmNvbnNpc3RlbnQgc3RhdGUgLSBjaGlsZCB3YXMgbm90ICIgPDwgZGVmLT5uYW1lXyA8PCAiXCIpLCI7Ci0gICAgICBzIDw8ICJ9OyI7Ci0gICAgfQotICAgIHByZXYgPSBkZWY7Ci0gIH0KLSAgcyA8PCAiU2VsZiB7IjsKLSAgZm9yIChhdXRvIGl0ID0gbGluZWFnZS5iZWdpbigpOyBpdCAhPSBsaW5lYWdlLmVuZCgpOyBpdCsrKSB7Ci0gICAgYXV0byBkZWYgPSAqaXQ7Ci0gICAgcyA8PCB1dGlsOjpDYW1lbENhc2VUb1VuZGVyU2NvcmUoZGVmLT5uYW1lXykgPDwgIiwiOwotICB9Ci0gIHMgPDwgIn19IjsKLQotICBmb3IgKGF1dG8gaXQgPSBsaW5lYWdlLmJlZ2luKCk7IGl0ICE9IGxpbmVhZ2UuZW5kKCk7IGl0KyspIHsKLSAgICBhdXRvIGRlZiA9ICppdDsKLSAgICBhdXRvIGZpZWxkcyA9IGRlZi0+ZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgICBCb2R5RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICAgIENvdW50RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICAgIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgUmVzZXJ2ZWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgU2l6ZUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgICBQYXlsb2FkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICAgIEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgfSk7Ci0KLSAgICBmb3IgKGF1dG8gY29uc3QmIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICBpZiAoZmllbGQtPkdldHRlcklzQnlSZWYoKSkgewotICAgICAgICBzIDw8ICJwdWIgZm4gZ2V0XyIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiKCZzZWxmKSAtPiAmIiA8PCBmaWVsZC0+R2V0UnVzdERhdGFUeXBlKCkgPDwgInsiOwotICAgICAgICBzIDw8ICIgJnNlbGYuIiA8PCB1dGlsOjpDYW1lbENhc2VUb1VuZGVyU2NvcmUoZGVmLT5uYW1lXykgPDwgIi5hc19yZWYoKS4iIDw8IGZpZWxkLT5HZXROYW1lKCk7Ci0gICAgICAgIHMgPDwgIn1cbiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzIDw8ICJwdWIgZm4gZ2V0XyIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiKCZzZWxmKSAtPiAiIDw8IGZpZWxkLT5HZXRSdXN0RGF0YVR5cGUoKSA8PCAieyI7Ci0gICAgICAgIHMgPDwgIiBzZWxmLiIgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKGRlZi0+bmFtZV8pIDw8ICIuYXNfcmVmKCkuIiA8PCBmaWVsZC0+R2V0TmFtZSgpOwotICAgICAgICBzIDw8ICJ9XG4iOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHMgPDwgIn1cbiI7Ci0KLSAgbGluZWFnZSA9IEdldEFuY2VzdG9ycygpOwotICBmb3IgKGF1dG8gaXQgPSBsaW5lYWdlLmJlZ2luKCk7IGl0ICE9IGxpbmVhZ2UuZW5kKCk7IGl0KyspIHsKLSAgICBhdXRvIGRlZiA9ICppdDsKLSAgICBzIDw8ICJpbXBsIEludG88IiA8PCBkZWYtPm5hbWVfIDw8ICJQYWNrZXQ+IGZvciAiIDw8IG5hbWVfIDw8ICJQYWNrZXQgeyI7Ci0gICAgcyA8PCAiIGZuIGludG8oc2VsZikgLT4gIiA8PCBkZWYtPm5hbWVfIDw8ICJQYWNrZXQgeyI7Ci0gICAgcyA8PCBkZWYtPm5hbWVfIDw8ICJQYWNrZXQ6Om5ldyhzZWxmLiIgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHJvb3QtPm5hbWVfKSA8PCAiKSI7Ci0gICAgcyA8PCAiIH0iOwotICAgIHMgPDwgIn1cbiI7Ci0gIH0KLX0KLQotdm9pZCBQYWNrZXREZWY6OkdlblJ1c3RCdWlsZGVyU3RydWN0SW1wbHMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGlmIChjb21wbGVtZW50XyAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBjb21wbGVtZW50X3Jvb3QgPSBjb21wbGVtZW50Xy0+R2V0Um9vdERlZigpOwotICAgIGF1dG8gY29tcGxlbWVudF9yb290X2FjY2Vzc29yID0gdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKGNvbXBsZW1lbnRfcm9vdC0+bmFtZV8pOwotICAgIHMgPDwgImltcGwgQ29tbWFuZEV4cGVjdGF0aW9ucyBmb3IgIiA8PCBuYW1lXyA8PCAiQnVpbGRlciB7IjsKLSAgICBzIDw8ICIgdHlwZSBSZXNwb25zZVR5cGUgPSAiIDw8IGNvbXBsZW1lbnRfLT5uYW1lXyA8PCAiUGFja2V0OyI7Ci0gICAgcyA8PCAiIGZuIF90b19yZXNwb25zZV90eXBlKHBrdDogRXZlbnRQYWNrZXQpIC0+IFNlbGY6OlJlc3BvbnNlVHlwZSB7ICI7Ci0gICAgcyA8PCBjb21wbGVtZW50Xy0+bmFtZV8gPDwgIlBhY2tldDo6bmV3KHBrdC4iIDw8IGNvbXBsZW1lbnRfcm9vdF9hY2Nlc3NvciA8PCAiLmNsb25lKCkpIjsKLSAgICBzIDw8ICIgfSI7Ci0gICAgcyA8PCAifSI7Ci0gIH0KLQotICBzIDw8ICJpbXBsICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXIgeyI7Ci0gIHMgPDwgInB1YiBmbiBidWlsZChzZWxmKSAtPiAiIDw8IG5hbWVfIDw8ICJQYWNrZXQgeyI7Ci0gIGF1dG8gbGluZWFnZSA9IEdldEFuY2VzdG9ycygpOwotICBsaW5lYWdlLnB1c2hfYmFjayh0aGlzKTsKLSAgc3RkOjpyZXZlcnNlKGxpbmVhZ2UuYmVnaW4oKSwgbGluZWFnZS5lbmQoKSk7Ci0KLSAgYXV0byBhbGxfY29uc3RyYWludHMgPSBHZXRBbGxDb25zdHJhaW50cygpOwotCi0gIGNvbnN0IFBhcmVudERlZiogcHJldiA9IG51bGxwdHI7Ci0gIGZvciAoYXV0byBhbmNlc3RvciA6IGxpbmVhZ2UpIHsKLSAgICBhdXRvIGZpZWxkcyA9IGFuY2VzdG9yLT5maWVsZHNfLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICAgIEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgUGFkZGluZ0ZpZWxkOjprRmllbGRUeXBlLAotICAgICAgICBSZXNlcnZlZEZpZWxkOjprRmllbGRUeXBlLAotICAgICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICAgIFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgRml4ZWRTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICB9KTsKLQotICAgIGF1dG8gYWNjZXNzb3JfbmFtZSA9IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShhbmNlc3Rvci0+bmFtZV8pOwotICAgIHMgPDwgImxldCAiIDw8IGFjY2Vzc29yX25hbWUgPDwgIj0gQXJjOjpuZXcoIiA8PCBhbmNlc3Rvci0+bmFtZV8gPDwgIkRhdGEgeyI7Ci0gICAgZm9yIChhdXRvIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICBhdXRvIGNvbnN0cmFpbnQgPSBhbGxfY29uc3RyYWludHMuZmluZChmaWVsZC0+R2V0TmFtZSgpKTsKLSAgICAgIHMgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiOiAiOwotICAgICAgaWYgKGNvbnN0cmFpbnQgIT0gYWxsX2NvbnN0cmFpbnRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgICBzIDw8IHN0ZDo6Z2V0PGludDY0X3Q+KGNvbnN0cmFpbnQtPnNlY29uZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEVudW1GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgIGF1dG8gdmFsdWUgPSBzdGQ6OmdldDxzdGQ6OnN0cmluZz4oY29uc3RyYWludC0+c2Vjb25kKTsKLSAgICAgICAgICBhdXRvIGNvbnN0YW50ID0gdmFsdWUuc3Vic3RyKHZhbHVlLmZpbmQoIjo6IikgKyAyLCBzdGQ6OnN0cmluZzo6bnBvcyk7Ci0gICAgICAgICAgcyA8PCBmaWVsZC0+R2V0RGF0YVR5cGUoKSA8PCAiOjoiIDw8IHV0aWw6OkNvbnN0YW50Q2FzZVRvQ2FtZWxDYXNlKGNvbnN0YW50KTsKLSAgICAgICAgICA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgRVJST1IoZmllbGQpIDw8ICJDb25zdHJhaW50cyBvbiBub24gZW51bS9zY2FsYXIgZmllbGRzIHNob3VsZCBiZSBpbXBvc3NpYmxlLiI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHMgPDwgInNlbGYuIiA8PCBmaWVsZC0+R2V0TmFtZSgpOwotICAgICAgfQotICAgICAgcyA8PCAiLCAiOwotICAgIH0KLSAgICBpZiAoYW5jZXN0b3ItPkhhc0NoaWxkRW51bXMoKSkgewotICAgICAgaWYgKHByZXYgPT0gbnVsbHB0cikgewotICAgICAgICBpZiAoYW5jZXN0b3ItPmZpZWxkc18uSGFzUGF5bG9hZCgpKSB7Ci0gICAgICAgICAgcyA8PCAiY2hpbGQ6IG1hdGNoIHNlbGYucGF5bG9hZCB7ICI7Ci0gICAgICAgICAgcyA8PCAiTm9uZSA9PiAiIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6Ok5vbmUsIjsKLSAgICAgICAgICBzIDw8ICJTb21lKGJ5dGVzKSA9PiAiIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6OlBheWxvYWQoYnl0ZXMpLCI7Ci0gICAgICAgICAgcyA8PCAifSwiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHMgPDwgImNoaWxkOiAiIDw8IG5hbWVfIDw8ICJEYXRhQ2hpbGQ6Ok5vbmUsIjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcyA8PCAiY2hpbGQ6ICIgPDwgYW5jZXN0b3ItPm5hbWVfIDw8ICJEYXRhQ2hpbGQ6OiIgPDwgcHJldi0+bmFtZV8gPDwgIigiCi0gICAgICAgICAgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHByZXYtPm5hbWVfKSA8PCAiKSwiOwotICAgICAgfQotICAgIH0KLSAgICBzIDw8ICJ9KTsiOwotICAgIHByZXYgPSBhbmNlc3RvcjsKLSAgfQotCi0gIHMgPDwgbmFtZV8gPDwgIlBhY2tldDo6bmV3KCIgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHByZXYtPm5hbWVfKSA8PCAiKSI7Ci0gIHMgPDwgIn1cbiI7Ci0KLSAgcyA8PCAifVxuIjsKLSAgZm9yIChjb25zdCBhdXRvIGFuY2VzdG9yIDogR2V0QW5jZXN0b3JzKCkpIHsKLSAgICBzIDw8ICJpbXBsIEludG88IiA8PCBhbmNlc3Rvci0+bmFtZV8gPDwgIlBhY2tldD4gZm9yICIgPDwgbmFtZV8gPDwgIkJ1aWxkZXIgeyI7Ci0gICAgcyA8PCAiIGZuIGludG8oc2VsZikgLT4gIiA8PCBhbmNlc3Rvci0+bmFtZV8gPDwgIlBhY2tldCB7IHNlbGYuYnVpbGQoKS5pbnRvKCkgfSI7Ci0gICAgcyA8PCAifVxuIjsKLSAgfQotfQotCi12b2lkIFBhY2tldERlZjo6R2VuUnVzdEJ1aWxkZXJUZXN0KHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBhdXRvIGxpbmVhZ2UgPSBHZXRBbmNlc3RvcnMoKTsKLSAgbGluZWFnZS5wdXNoX2JhY2sodGhpcyk7Ci0gIGlmICghbGluZWFnZS5lbXB0eSgpICYmICF0ZXN0X2Nhc2VzXy5lbXB0eSgpKSB7Ci0gICAgcyA8PCAibWFjcm9fcnVsZXMhICIgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKG5hbWVfKSA8PCAiX2J1aWxkZXJfdGVzdHMgeyAiOwotICAgIHMgPDwgIigkKCRuYW1lOmlkZW50OiAkYnl0ZV9zdHJpbmc6ZXhwciwpKikgPT4geyI7Ci0gICAgcyA8PCAiJCgiOwotICAgIHMgPDwgIlxuI1t0ZXN0XVxuIjsKLSAgICBzIDw8ICJwdWIgZm4gJG5hbWUoKSB7ICI7Ci0gICAgcyA8PCAibGV0IHJhd19ieXRlcyA9ICRieXRlX3N0cmluZzsiOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGluZWFnZS5zaXplKCk7IGkrKykgewotICAgICAgcyA8PCAiLyogKCIgPDwgaSA8PCAiKSAqL1xuIjsKLSAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgcyA8PCAibWF0Y2ggIiA8PCBsaW5lYWdlW2ldLT5uYW1lXyA8PCAiUGFja2V0OjpwYXJzZShyYXdfYnl0ZXMpIHsiOwotICAgICAgICBzIDw8ICJPaygiIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShsaW5lYWdlW2ldLT5uYW1lXykgPDwgIl9wYWNrZXQpID0+IHsiOwotICAgICAgICBzIDw8ICJtYXRjaCAiIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShsaW5lYWdlW2ldLT5uYW1lXykgPDwgIl9wYWNrZXQuc3BlY2lhbGl6ZSgpIHsiOwotICAgICAgfSBlbHNlIGlmIChpICE9IGxpbmVhZ2Uuc2l6ZSgpIC0gMSkgewotICAgICAgICBzIDw8IGxpbmVhZ2VbaSAtIDFdLT5uYW1lXyA8PCAiQ2hpbGQ6OiIgPDwgbGluZWFnZVtpXS0+bmFtZV8gPDwgIigiOwotICAgICAgICBzIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShsaW5lYWdlW2ldLT5uYW1lXykgPDwgIl9wYWNrZXQpID0+IHsiOwotICAgICAgICBzIDw8ICJtYXRjaCAiIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShsaW5lYWdlW2ldLT5uYW1lXykgPDwgIl9wYWNrZXQuc3BlY2lhbGl6ZSgpIHsiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcyA8PCBsaW5lYWdlW2kgLSAxXS0+bmFtZV8gPDwgIkNoaWxkOjoiIDw8IGxpbmVhZ2VbaV0tPm5hbWVfIDw8ICIocGFja2V0KSA9PiB7IjsKLSAgICAgICAgcyA8PCAibGV0IHJlYnVpbGRlciA9ICIgPDwgbGluZWFnZVtpXS0+bmFtZV8gPDwgIkJ1aWxkZXIgeyI7Ci0gICAgICAgIEZpZWxkTGlzdCBwYXJhbXMgPSBHZXRQYXJhbUxpc3QoKTsKLSAgICAgICAgaWYgKHBhcmFtcy5IYXNCb2R5KCkpIHsKLSAgICAgICAgICBFUlJPUigpIDw8ICJQYWNrZXRzIHdpdGggYm9keSBmaWVsZHMgY2FuJ3QgYmUgYXV0by10ZXN0ZWQuICBUZXN0IGEgY2hpbGQuIjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcGFyYW0gOiBwYXJhbXMpIHsKLSAgICAgICAgICBzIDw8IHBhcmFtLT5HZXROYW1lKCkgPDwgIiA6IHBhY2tldC4iOwotICAgICAgICAgIGlmIChwYXJhbS0+R2V0RmllbGRUeXBlKCkgPT0gVmVjdG9yRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgICAgIHMgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHBhcmFtLT5HZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSkgPDwgIigpLnRvX3ZlYygpLCI7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS0+R2V0RmllbGRUeXBlKCkgPT0gQXJyYXlGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgICAgY29uc3QgYXV0byBhcnJheV9wYXJhbSA9IHN0YXRpY19jYXN0PGNvbnN0IEFycmF5RmllbGQqPihwYXJhbSk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGVsZW1lbnRfZmllbGQgPSBhcnJheV9wYXJhbS0+R2V0RWxlbWVudEZpZWxkKCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudF9maWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gU3RydWN0RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgICAgICAgcyA8PCB1dGlsOjpDYW1lbENhc2VUb1VuZGVyU2NvcmUocGFyYW0tPkdldEdldHRlckZ1bmN0aW9uTmFtZSgpKSA8PCAiKCkudG9fdmVjKCksIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHMgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKHBhcmFtLT5HZXRHZXR0ZXJGdW5jdGlvbk5hbWUoKSkgPDwgIigpLmNsb25lKCksIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLT5HZXRGaWVsZFR5cGUoKSA9PSBTdHJ1Y3RGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgICAgcyA8PCB1dGlsOjpDYW1lbENhc2VUb1VuZGVyU2NvcmUocGFyYW0tPkdldEdldHRlckZ1bmN0aW9uTmFtZSgpKSA8PCAiKCkuY2xvbmUoKSwiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShwYXJhbS0+R2V0R2V0dGVyRnVuY3Rpb25OYW1lKCkpIDw8ICIoKSwiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzIDw8ICJ9OyI7Ci0gICAgICAgIHMgPDwgImxldCByZWJ1aWxkZXJfYmFzZSA6ICIgPDwgbGluZWFnZVswXS0+bmFtZV8gPDwgIlBhY2tldCA9IHJlYnVpbGRlci5pbnRvKCk7IjsKLSAgICAgICAgcyA8PCAibGV0IHJlYnVpbGRlcl9ieXRlcyA6ICZbdThdID0gJnJlYnVpbGRlcl9iYXNlLnRvX2J5dGVzKCk7IjsKLSAgICAgICAgcyA8PCAiYXNzZXJ0X2VxIShyZWJ1aWxkZXJfYnl0ZXMsIHJhd19ieXRlcyk7IjsKLSAgICAgICAgcyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbGluZWFnZS5zaXplKCk7IGkrKykgewotICAgICAgcyA8PCAiXyA9PiB7IjsKLSAgICAgIHMgPDwgInByaW50bG4hKFwiQ291bGRuJ3QgcGFyc2UgIiA8PCB1dGlsOjpDYW1lbENhc2VUb1VuZGVyU2NvcmUobGluZWFnZVtsaW5lYWdlLnNpemUoKSAtIGldLT5uYW1lXyk7Ci0gICAgICBzIDw8ICJ7OjAyeD99XCIsICIgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKGxpbmVhZ2VbbGluZWFnZS5zaXplKCkgLSBpIC0gMV0tPm5hbWVfKSA8PCAiX3BhY2tldCk7ICI7Ci0gICAgICBzIDw8ICJ9fX0iOwotICAgIH0KLQotICAgIHMgPDwgIiwiOwotICAgIHMgPDwgIkVycihlKSA9PiBwYW5pYyEoXCJjb3VsZCBub3QgcGFyc2UgIiA8PCBsaW5lYWdlWzBdLT5uYW1lXyA8PCAiOiB7Oj99IHs6MDJ4P31cIiwgZSwgcmF3X2J5dGVzKSwiOwotICAgIHMgPDwgIn0iOwotICAgIHMgPDwgIn0iOwotICAgIHMgPDwgIikqIjsKLSAgICBzIDw8ICJ9IjsKLSAgICBzIDw8ICJ9IjsKLQotICAgIHMgPDwgdXRpbDo6Q2FtZWxDYXNlVG9VbmRlclNjb3JlKG5hbWVfKSA8PCAiX2J1aWxkZXJfdGVzdHMhIHsgIjsKLSAgICBpbnQgbnVtYmVyID0gMDsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHRlc3RfY2FzZSA6IHRlc3RfY2FzZXNfKSB7Ci0gICAgICBzIDw8IHV0aWw6OkNhbWVsQ2FzZVRvVW5kZXJTY29yZShuYW1lXykgPDwgIl9idWlsZGVyX3Rlc3RfIjsKLSAgICAgIHMgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IG51bWJlcisrIDw8ICI6ICI7Ci0gICAgICBzIDw8ICJiXCIiIDw8IHRlc3RfY2FzZSA8PCAiXCIsIjsKLSAgICB9Ci0gICAgcyA8PCAifSI7Ci0gICAgcyA8PCAiXG4iOwotICB9Ci19Ci0KLXZvaWQgUGFja2V0RGVmOjpHZW5SdXN0RGVmKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBHZW5SdXN0Q2hpbGRFbnVtcyhzKTsKLSAgR2VuUnVzdFN0cnVjdERlY2xhcmF0aW9ucyhzKTsKLSAgR2VuUnVzdFN0cnVjdEltcGxzKHMpOwotICBHZW5SdXN0QWNjZXNzU3RydWN0SW1wbHMocyk7Ci0gIEdlblJ1c3RCdWlsZGVyU3RydWN0SW1wbHMocyk7Ci0gIEdlblJ1c3RCdWlsZGVyVGVzdChzKTsKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvcGFja2V0X2RlZi5oIGIvZ2QvcGFja2V0L3BhcnNlci9wYWNrZXRfZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGNkYzkuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9wYWNrZXRfZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2YXJpYW50PgotCi0jaW5jbHVkZSAiZW51bV9kZWYuaCIKLSNpbmNsdWRlICJmaWVsZF9saXN0LmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcmVudF9kZWYuaCIKLQotY2xhc3MgUGFja2V0RGVmIDogcHVibGljIFBhcmVudERlZiB7Ci0gcHVibGljOgotICBQYWNrZXREZWYoc3RkOjpzdHJpbmcgbmFtZSwgRmllbGRMaXN0IGZpZWxkcyk7Ci0gIFBhY2tldERlZihzdGQ6OnN0cmluZyBuYW1lLCBGaWVsZExpc3QgZmllbGRzLCBQYWNrZXREZWYqIHBhcmVudCk7Ci0KLSAgUGFja2V0RmllbGQqIEdldE5ld0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5QYXJzZXJEZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5UZXN0aW5nUGFyc2VyRnJvbUJ5dGVzKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5QYXJzZXJEZWZpbml0aW9uUHliaW5kMTEoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblBhcnNlckZpZWxkR2V0dGVyKHN0ZDo6b3N0cmVhbSYgcywgY29uc3QgUGFja2V0RmllbGQqIGZpZWxkKSBjb25zdDsKLQotICB2b2lkIEdlblZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuUGFyc2VyVG9TdHJpbmcoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICBUeXBlRGVmOjpUeXBlIEdldERlZmluaXRpb25UeXBlKCkgY29uc3Q7Ci0KLSAgdm9pZCBHZW5CdWlsZGVyRGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuQnVpbGRlckRlZmluaXRpb25QeWJpbmQxMShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuVGVzdERlZmluZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuRnV6elRlc3REZWZpbmUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICBGaWVsZExpc3QgR2V0UGFyYW1ldGVyc1RvVmFsaWRhdGUoKSBjb25zdDsKLQotICB2b2lkIEdlbkJ1aWxkZXJDcmVhdGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlbkJ1aWxkZXJDcmVhdGVQeWJpbmQxMShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuQnVpbGRlclBhcmFtZXRlckNoZWNrZXIoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlbkJ1aWxkZXJDb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuVGVzdGluZ0Zyb21WaWV3KHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5SdXN0Q2hpbGRFbnVtcyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuUnVzdFN0cnVjdERlY2xhcmF0aW9ucyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIGJvb2wgR2VuUnVzdFN0cnVjdEZpZWxkTmFtZUFuZFR5cGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblJ1c3RTdHJ1Y3RGaWVsZE5hbWVzKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5SdXN0U3RydWN0SW1wbHMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblJ1c3RBY2Nlc3NTdHJ1Y3RJbXBscyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuUnVzdEJ1aWxkZXJTdHJ1Y3RJbXBscyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuUnVzdEJ1aWxkZXJUZXN0KHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5SdXN0RGVmKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9wYWNrZXRnZW4uZ25pIGIvZ2QvcGFja2V0L3BhcnNlci9wYWNrZXRnZW4uZ25pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU2YTRkLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvcGFja2V0Z2VuLmduaQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBHZW5lcmF0ZSBweWJpbmQxMSBzb3VyY2UgZmlsZXMgKyBoZWFkZXJzCi0jCi0jIFBhcmFtZXRlcnM6Ci0jICAgaW5jbHVkZTogQmFzZSBpbmNsdWRlIHBhdGggKGkuZS4gYnQvZ2QpCi0jICAgc291cmNlX3Jvb3Q6IFJvb3Qgb2Ygc291cmNlIHJlbGF0aXZlIHRvIGN1cnJlbnQgQlVJTEQuZ24KLSMgICBzb3VyY2VzOiBQREwgZmlsZXMgdG8gdXNlIGZvciBnZW5lcmF0aW9uLgotIyAgIHNoYXJkcyBbb3B0aW9uYWxdOiBTaGFyZCBnZW5lcmF0ZWQgc291cmNlIGludG8gTiBmaWxlcy4KLSMgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9IDAuIE1heCA9IDEwLgotdGVtcGxhdGUoInBhY2tldGdlbl9weSIpIHsKLSAgYWN0aW9uX25hbWUgPSAiJHt0YXJnZXRfbmFtZX1fZ2VuIgotCi0gIGFsbF9kZXBlbmRlbnRfY29uZmlnX25hbWUgPSAiXyR7dGFyZ2V0X25hbWV9X2FsbF9kZXBlbmRlbnRfY29uZmlnIgotICBjb25maWcoYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSkgewotICAgIGluY2x1ZGVfZGlycyA9IFsgIiR7cm9vdF9nZW5fZGlyfSIgXQotICB9Ci0KLSAgYWN0aW9uKGFjdGlvbl9uYW1lKSB7Ci0gICAgZm9yd2FyZF92YXJpYWJsZXNfZnJvbShpbnZva2VyLCBbICJzb3VyY2VzIiwgImluY2x1ZGUiLCAic2hhcmRzIiwgInNvdXJjZV9yb290IiBdKQotICAgIGFzc2VydChkZWZpbmVkKHNvdXJjZXMpLCAic291cmNlcyBtdXN0IGJlIHNldCIpCi0gICAgYXNzZXJ0KGRlZmluZWQoaW5jbHVkZSksICJpbmNsdWRlIG11c3QgYmUgc2V0IikKLSAgICBhc3NlcnQoZGVmaW5lZChzb3VyY2Vfcm9vdCksICJzb3VyY2Ugcm9vdCBtdXN0IGJlIHNldCIpCi0KLSAgICBvdXRkaXIgPSByZWJhc2VfcGF0aChyb290X2dlbl9kaXIpCi0gICAgc291cmNlX3Jvb3QgPSByZWJhc2VfcGF0aChzb3VyY2Vfcm9vdCkKLQotICAgICMgU2V0IHNoYXJkcyBjbWQKLSAgICBzaGFyZHNfY21kID0gIiIKLSAgICBvdXRwdXRzID0gW10KLSAgICBzb3VyY2VfYXJncyA9IFtdCi0gICAgaWYgKGRlZmluZWQoc2hhcmRzKSkgewotICAgICAgc2hhcmRzX2xpc3QgPSBbIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiXQotICAgICAgZm9yZWFjaCAoc291cmNlLCBzb3VyY2VzKSB7Ci0gICAgICAgIHJlbF9zb3VyY2UgPSByZWJhc2VfcGF0aChzb3VyY2UsICIuIikKLSAgICAgICAgc291cmNlX2FyZ3MgKz0gWyByZWJhc2VfcGF0aChzb3VyY2UsIHNvdXJjZV9yb290KSBdCi0gICAgICAgIHNoYXJkc19jbWQgPSAiLS1udW1fc2hhcmRzPSR7c2hhcmRzfSIKLQotICAgICAgICAjIFRPRE8gLSBHTiByZWZlcmVuY2UgZG9lc24ndCBleHBsYWluIGhvdyB0byBwcm9ncmFtYXRpY2FsbHkgY3JlYXRlCi0gICAgICAgICMgYSByYW5nZSAoaS5lLiByYW5nZShzaGFyZHMpKSBzbyB3ZSB1c2UgYSBmaXhlZCBsaXN0IGFuZCBmb3JlYWNoIGxvb3AgdG8KLSAgICAgICAgIyB3b3JrIGFyb3VuZCBpdC4KLSAgICAgICAgYXNzZXJ0KHNoYXJkcyA8PSAxMCwgIk1heGltdW0gc3VwcG9ydGVkIHNoYXJkcyBpcyAxMC4iKQotICAgICAgICBpbmRleCA9IDAKLSAgICAgICAgb3V0cHV0cyArPSBbIHN0cmluZ19yZXBsYWNlKCIke291dGRpcn0vJHtyZWxfc291cmNlfV9weXRob24zLmNjIiwgIi5wZGwiLCAiIikgXQotICAgICAgICBmb3JlYWNoKG51bSwgc2hhcmRzX2xpc3QpIHsKLSAgICAgICAgICBpZiAoaW5kZXggPCBzaGFyZHMpIHsKLSAgICAgICAgICAgICAgb3V0cHV0cyArPSBbIHN0cmluZ19yZXBsYWNlKCIke291dGRpcn0vJHtyZWxfc291cmNlfV9weXRob24zX3NoYXJkXyR7bnVtfS5jYyIsICIucGRsIiwgIiIpIF0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2NyaXB0ID0gIi8vY29tbW9uLW1rL2ZpbGVfZ2VuZXJhdG9yX3dyYXBwZXIucHkiCi0gICAgYmluZmlsZSA9ICIke3Jvb3Rfb3V0X2Rpcn0vYmx1ZXRvb3RoX3BhY2tldGdlbiIKLSAgICBhcmdzID0gWwotICAgICAgYmluZmlsZSwKLSAgICAgICItLWluY2x1ZGU9JHtpbmNsdWRlfSIsCi0gICAgICAiLS1vdXQ9JHtvdXRkaXJ9IiwKLSAgICAgICItLXNvdXJjZV9yb290PSR7c291cmNlX3Jvb3R9IiwKLSAgICAgIHNoYXJkc19jbWQsCi0gICAgXSArIHNvdXJjZV9hcmdzCi0gIH0KLQotICAjIFRPRE86IE1ha2UgYnVpbGRpbmcgd2l0aCBweXRob24tZGV2IHdvcmsuCi0gICMgc291cmNlX3NldCh0YXJnZXRfbmFtZSkgewotICAjICAgc291cmNlcyA9IGdldF90YXJnZXRfb3V0cHV0cygiOiR7YWN0aW9uX25hbWV9IikKLSAgIyAgIGRlcHMgPSBbIjoke2FjdGlvbl9uYW1lfSJdCi0gICMgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbIjoke2FsbF9kZXBlbmRlbnRfY29uZmlnX25hbWV9Il0KLSAgIyAgIGlmIChkZWZpbmVkKGludm9rZXIuYWxsX2RlcGVuZGVudF9jb25maWdzKSkgewotICAjICAgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgKz0gaW52b2tlci5hbGxfZGVwZW5kZW50X2NvbmZpZ3MKLSAgIyAgIH0KLSAgIyAgIGlmIChkZWZpbmVkKGludm9rZXIuY29uZmlncykpIHsKLSAgIyAgICAgY29uZmlncyArPSBpbnZva2VyLmNvbmZpZ3MKLSAgIyAgIH0KLSAgIyB9Ci19Ci0KLSMgR2VuZXJhdGUgc2luZ2xlIGMrKyBoZWFkZXJzIGZvciBlYWNoIHBkbAotIwotIyBQYXJhbWV0ZXJzOgotIyAgIGluY2x1ZGU6IEJhc2UgaW5jbHVkZSBwYXRoIChpLmUuIGJ0L2dkKQotIyAgIHNvdXJjZV9yb290OiBSb290IG9mIHNvdXJjZSByZWxhdGl2ZSB0byBjdXJyZW50IEJVSUxELmduCi0jICAgc291cmNlczogUERMIGZpbGVzIHRvIHVzZSBmb3IgZ2VuZXJhdGlvbi4KLXRlbXBsYXRlKCJwYWNrZXRnZW5faGVhZGVycyIpIHsKLSAgYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSA9ICJfJHt0YXJnZXRfbmFtZX1fYWxsX2RlcGVuZGVudF9jb25maWciCi0gIGNvbmZpZyhhbGxfZGVwZW5kZW50X2NvbmZpZ19uYW1lKSB7Ci0gICAgaW5jbHVkZV9kaXJzID0gWyAiJHtyb290X2dlbl9kaXJ9IiBdCi0gIH0KLQotICBhY3Rpb24odGFyZ2V0X25hbWUpIHsKLSAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgImluY2x1ZGUiLCAic291cmNlcyIsICJzb3VyY2Vfcm9vdCIgXSkKLSAgICBhc3NlcnQoZGVmaW5lZChzb3VyY2VzKSwgInNvdXJjZXMgbXVzdCBiZSBzZXQiKQotICAgIGFzc2VydChkZWZpbmVkKGluY2x1ZGUpLCAiaW5jbHVkZSBtdXN0IGJlIHNldCIpCi0gICAgYXNzZXJ0KGRlZmluZWQoc291cmNlX3Jvb3QpLCAic291cmNlIHJvb3QgbXVzdCBiZSBzZXQiKQotCi0gICAgb3V0ZGlyID0gcmViYXNlX3BhdGgocm9vdF9nZW5fZGlyKQotICAgIHNvdXJjZV9yb290ID0gcmViYXNlX3BhdGgoc291cmNlX3Jvb3QpCi0KLSAgICBzY3JpcHQgPSAiLy9jb21tb24tbWsvZmlsZV9nZW5lcmF0b3Jfd3JhcHBlci5weSIKLSAgICBiaW5maWxlID0gIiR7cm9vdF9vdXRfZGlyfS9ibHVldG9vdGhfcGFja2V0Z2VuIgotICAgIGFyZ3MgPSBbCi0gICAgICBiaW5maWxlLAotICAgICAgIi0taW5jbHVkZT0ke2luY2x1ZGV9IiwKLSAgICAgICItLW91dD0ke291dGRpcn0iLAotICAgICAgIi0tc291cmNlX3Jvb3Q9JHtzb3VyY2Vfcm9vdH0iLAotICAgIF0KLQotICAgIG91dHB1dHMgPSBbXQotICAgIGZvcmVhY2ggKHNvdXJjZSwgc291cmNlcykgewotICAgICAgcmVsX3NvdXJjZSA9IHJlYmFzZV9wYXRoKHNvdXJjZSwgIi4iKQotICAgICAgYXJncyArPSBbIHJlYmFzZV9wYXRoKHNvdXJjZSwgc291cmNlX3Jvb3QpIF0KLSAgICAgIG91dHB1dHMgKz0gWyBzdHJpbmdfcmVwbGFjZSgiJHtvdXRkaXJ9LyR7cmVsX3NvdXJjZX0uaCIsICIucGRsIiwgIiIpIF0KLSAgICB9Ci0KLSAgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbICI6JHthbGxfZGVwZW5kZW50X2NvbmZpZ19uYW1lfSIgXQotICAgIGlmIChkZWZpbmVkKGludm9rZXIuYWxsX2RlcGVuZGVudF9jb25maWdzKSkgewotICAgICAgYWxsX2RlcGVuZGVudF9jb25maWdzICs9IGludm9rZXIuYWxsX2RlcGVuZGVudF9jb25maWdzCi0gICAgfQotCi0gICAgaWYgKGRlZmluZWQoaW52b2tlci5jb25maWdzKSkgewotICAgICAgY29uZmlncyArPSBpbnZva2VyLmNvbmZpZ3MKLSAgICB9Ci0gIH0KLX0KLQotIyBHZW5lcmF0ZSBzaW5nbGUgUnVzdCBmaWxlcyBmb3IgZWFjaCBwZGwKLSMKLSMgUGFyYW1ldGVyczoKLSMgICBpbmNsdWRlOiBCYXNlIGluY2x1ZGUgcGF0aCAoaS5lLiBidC9nZCkKLSMgICBzb3VyY2Vfcm9vdDogUm9vdCBvZiBzb3VyY2UgcmVsYXRpdmUgdG8gY3VycmVudCBCVUlMRC5nbgotIyAgIHNvdXJjZXM6IFBETCBmaWxlcyB0byB1c2UgZm9yIGdlbmVyYXRpb24uCi10ZW1wbGF0ZSgicGFja2V0Z2VuX3J1c3QiKSB7Ci0gIGFjdGlvbl9uYW1lID0gIiR7dGFyZ2V0X25hbWV9X2dlbiIKLSAgYWxsX2RlcGVuZGVudF9jb25maWdfbmFtZSA9ICJfJHt0YXJnZXRfbmFtZX1fYWxsX2RlcGVuZGVudF9jb25maWciCi0gIGNvbmZpZyhhbGxfZGVwZW5kZW50X2NvbmZpZ19uYW1lKSB7Ci0gICAgaW5jbHVkZV9kaXJzID0gWyAiJHtyb290X2dlbl9kaXJ9IiBdCi0gIH0KLQotICBhY3Rpb24oYWN0aW9uX25hbWUpIHsKLSAgICBmb3J3YXJkX3ZhcmlhYmxlc19mcm9tKGludm9rZXIsIFsgImluY2x1ZGUiLCAic291cmNlcyIsICJzb3VyY2Vfcm9vdCIgXSkKLSAgICBhc3NlcnQoZGVmaW5lZChzb3VyY2VzKSwgInNvdXJjZXMgbXVzdCBiZSBzZXQiKQotICAgIGFzc2VydChkZWZpbmVkKGluY2x1ZGUpLCAiaW5jbHVkZSBtdXN0IGJlIHNldCIpCi0gICAgYXNzZXJ0KGRlZmluZWQoc291cmNlX3Jvb3QpLCAic291cmNlIHJvb3QgbXVzdCBiZSBzZXQiKQotCi0gICAgb3V0ZGlyID0gcmViYXNlX3BhdGgocm9vdF9nZW5fZGlyKQotICAgIHNvdXJjZV9yb290ID0gcmViYXNlX3BhdGgoc291cmNlX3Jvb3QpCi0KLSAgICBzY3JpcHQgPSAiLy9jb21tb24tbWsvZmlsZV9nZW5lcmF0b3Jfd3JhcHBlci5weSIKLSAgICBiaW5maWxlID0gIiR7cm9vdF9vdXRfZGlyfS9ibHVldG9vdGhfcGFja2V0Z2VuIgotICAgIGFyZ3MgPSBbCi0gICAgICBiaW5maWxlLAotICAgICAgIi0taW5jbHVkZT0ke2luY2x1ZGV9IiwKLSAgICAgICItLW91dD0ke291dGRpcn0iLAotICAgICAgIi0tc291cmNlX3Jvb3Q9JHtzb3VyY2Vfcm9vdH0iLAotICAgICAgIi0tcnVzdCIsCi0gICAgXQotCi0gICAgb3V0cHV0cyA9IFtdCi0gICAgZm9yZWFjaCAoc291cmNlLCBzb3VyY2VzKSB7Ci0gICAgICByZWxfc291cmNlID0gcmViYXNlX3BhdGgoc291cmNlLCAiLiIpCi0gICAgICBhcmdzICs9IFsgcmViYXNlX3BhdGgoc291cmNlLCBzb3VyY2Vfcm9vdCkgXQotICAgICAgb3V0cHV0cyArPSBbIHN0cmluZ19yZXBsYWNlKCIke291dGRpcn0vJHtyZWxfc291cmNlfS5ycyIsICIucGRsIiwgIiIpIF0KLSAgICB9Ci0gIH0KLQotICAjIFRPRE86IFJ1c3Qgc291cmNlX3NldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGduLgotICAjIHNvdXJjZV9zZXQodGFyZ2V0X25hbWUpIHsKLSAgIyAgIHNvdXJjZXMgPSBnZXRfdGFyZ2V0X291dHB1dHMoIjoke2FjdGlvbl9uYW1lfSIpCi0gICMgICBkZXBzID0gWyAiOiR7YWN0aW9uX25hbWV9IiBdCi0gICMgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbIjoke2FsbF9kZXBlbmRlbnRfY29uZmlnX25hbWV9Il0KLSAgIyAgIGlmIChkZWZpbmVkKGludm9rZXIuYWxsX2RlcGVuZGVudF9jb25maWdzKSkgewotICAjICAgICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgKz0gaW52b2tlci5hbGxfZGVwZW5kZW50X2NvbmZpZ3MKLSAgIyAgIH0KLSAgIyAgIGlmIChkZWZpbmVkKGludm9rZXIuY29uZmlncykpIHsKLSAgIyAgICAgY29uZmlncyArPSBpbnZva2VyLmNvbmZpZ3MKLSAgIyAgIH0KLSAgIyB9Ci19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3BhcmVudF9kZWYuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL3BhcmVudF9kZWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjczNTMuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci9wYXJlbnRfZGVmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYXJlbnRfZGVmLmgiCi0KLSNpbmNsdWRlICJmaWVsZHMvYWxsX2ZpZWxkcy5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotUGFyZW50RGVmOjpQYXJlbnREZWYoc3RkOjpzdHJpbmcgbmFtZSwgRmllbGRMaXN0IGZpZWxkcykgOiBQYXJlbnREZWYobmFtZSwgZmllbGRzLCBudWxscHRyKSB7fQotUGFyZW50RGVmOjpQYXJlbnREZWYoc3RkOjpzdHJpbmcgbmFtZSwgRmllbGRMaXN0IGZpZWxkcywgUGFyZW50RGVmKiBwYXJlbnQpCi0gICAgOiBUeXBlRGVmKG5hbWUpLCBmaWVsZHNfKGZpZWxkcyksIHBhcmVudF8ocGFyZW50KSB7fQotCi12b2lkIFBhcmVudERlZjo6QWRkUGFyZW50Q29uc3RyYWludChzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnZhcmlhbnQ8aW50NjRfdCwgc3RkOjpzdHJpbmc+IHZhbHVlKSB7Ci0gIC8vIE5PVEU6IFRoaXMgY291bGQgZW5kIHVwIGJlaW5nIHZlcnkgc2xvdyBpZiB0aGVyZSBhcmUgYSBsb3Qgb2YgY29uc3RyYWludHMuCi0gIGNvbnN0IGF1dG8mIHBhcmVudF9wYXJhbXMgPSBwYXJlbnRfLT5HZXRQYXJhbUxpc3QoKTsKLSAgY29uc3QgYXV0byYgY29uc3RyYWluZWRfZmllbGQgPSBwYXJlbnRfcGFyYW1zLkdldEZpZWxkKGZpZWxkX25hbWUpOwotICBpZiAoY29uc3RyYWluZWRfZmllbGQgPT0gbnVsbHB0cikgewotICAgIEVSUk9SKCkgPDwgIkF0dGVtcHRpbmcgdG8gY29uc3RyYWluIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGluIHBhcmVudCAiIDw8IHBhcmVudF8tPm5hbWVfCi0gICAgICAgICAgICA8PCAiLCBidXQgbm8gc3VjaCBmaWVsZCBleGlzdHMuIjsKLSAgfQotCi0gIGlmIChjb25zdHJhaW5lZF9maWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICBpZiAoIXN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8aW50NjRfdD4odmFsdWUpKSB7Ci0gICAgICBFUlJPUihjb25zdHJhaW5lZF9maWVsZCkgPDwgIkF0dGVtcHRpbmcgdG8gY29uc3RyYWluIGEgc2NhbGFyIGZpZWxkIHRvIGFuIGVudW0gdmFsdWUgaW4gIiA8PCBwYXJlbnRfLT5uYW1lXzsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY29uc3RyYWluZWRfZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEVudW1GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgIGlmICghc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxzdGQ6OnN0cmluZz4odmFsdWUpKSB7Ci0gICAgICBFUlJPUihjb25zdHJhaW5lZF9maWVsZCkgPDwgIkF0dGVtcHRpbmcgdG8gY29uc3RyYWluIGFuIGVudW0gZmllbGQgdG8gYSBzY2FsYXIgdmFsdWUgaW4gIiA8PCBwYXJlbnRfLT5uYW1lXzsKLSAgICB9Ci0gICAgY29uc3QgYXV0byYgZW51bV9kZWYgPSBzdGF0aWNfY2FzdDxFbnVtRmllbGQqPihjb25zdHJhaW5lZF9maWVsZCktPkdldEVudW1EZWYoKTsKLSAgICBpZiAoIWVudW1fZGVmLkhhc0VudHJ5KHN0ZDo6Z2V0PHN0ZDo6c3RyaW5nPih2YWx1ZSkpKSB7Ci0gICAgICBFUlJPUihjb25zdHJhaW5lZF9maWVsZCkgPDwgIk5vIG1hdGNoaW5nIGVudW1lcmF0aW9uIFwiIiA8PCBzdGQ6OmdldDxzdGQ6OnN0cmluZz4odmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiIGZvciBjb25zdHJhaW50IG9uIGVudW0gaW4gcGFyZW50ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIi4iOwotICAgIH0KLQotICAgIC8vIEZvciBlbnVtcywgd2UgaGF2ZSB0byBxdWFsaWZ5IHRoZSB2YWx1ZSB1c2luZyB0aGUgZW51bSB0eXBlIG5hbWUuCi0gICAgdmFsdWUgPSBlbnVtX2RlZi5HZXRUeXBlTmFtZSgpICsgIjo6IiArIHN0ZDo6Z2V0PHN0ZDo6c3RyaW5nPih2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgRVJST1IoY29uc3RyYWluZWRfZmllbGQpIDw8ICJGaWVsZCBpbiBwYXJlbnQgIiA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiIGlzIG5vdCB2aWFibGUgZm9yIGNvbnN0cmFpbmluZy4iOwotICB9Ci0KLSAgcGFyZW50X2NvbnN0cmFpbnRzXy5pbnNlcnQoc3RkOjpwYWlyKGZpZWxkX25hbWUsIHZhbHVlKSk7Ci19Ci0KLXZvaWQgUGFyZW50RGVmOjpBZGRUZXN0Q2FzZShzdGQ6OnN0cmluZyBwYWNrZXRfYnl0ZXMpIHsKLSAgdGVzdF9jYXNlc18uaW5zZXJ0KHN0ZDo6bW92ZShwYWNrZXRfYnl0ZXMpKTsKLX0KLQotLy8gQXNzaWduIGFsbCBzaXplIGZpZWxkcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMuCi0vLyBXaWxsIGNyYXNoIGlmCi0vLyAgLSB0aGVyZSBhcmVuJ3QgYW55IGZpZWxkcyB0aGF0IGRvbid0IG1hdGNoIHVwIHRvIGEgZmllbGQuCi0vLyAgLSB0aGUgc2l6ZSBmaWVsZCBwb2ludHMgdG8gYSBmaXhlZCBzaXplIGZpZWxkLgotLy8gIC0gaWYgdGhlIHNpemUgZmllbGQgY29tZXMgYWZ0ZXIgdGhlIHZhcmlhYmxlIGxlbmd0aCBmaWVsZC4KLXZvaWQgUGFyZW50RGVmOjpBc3NpZ25TaXplRmllbGRzKCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzXykgewotICAgIERFQlVHKCkgPDwgImZpZWxkIG5hbWU6ICIgPDwgZmllbGQtPkdldE5hbWUoKTsKLQotICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gU2l6ZUZpZWxkOjprRmllbGRUeXBlICYmIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBDb3VudEZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBjb25zdCBTaXplRmllbGQqIHNpemVfZmllbGQgPSBzdGF0aWNfY2FzdDxTaXplRmllbGQqPihmaWVsZCk7Ci0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgY29ycmVzcG9uZGluZyBmaWVsZCBjYW4gYmUgZm91bmQuCi0gICAgY29uc3QgYXV0byYgdmFyX2xlbl9maWVsZCA9IGZpZWxkc18uR2V0RmllbGQoc2l6ZV9maWVsZC0+R2V0U2l6ZWRGaWVsZE5hbWUoKSk7Ci0gICAgaWYgKHZhcl9sZW5fZmllbGQgPT0gbnVsbHB0cikgewotICAgICAgRVJST1IoZmllbGQpIDw8ICJDb3VsZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIGZpZWxkIGZvciBzaXplL2NvdW50IGZpZWxkLiI7Ci0gICAgfQotCi0gICAgLy8gRG8gdGhlIG9yZGVyaW5nIGNoZWNrIHRvIGVuc3VyZSB0aGUgc2l6ZSBmaWVsZCBjb21lcyBiZWZvcmUgdGhlCi0gICAgLy8gdmFyaWFibGUgbGVuZ3RoIGZpZWxkLgotICAgIGZvciAoYXV0byBpdCA9IGZpZWxkc18uYmVnaW4oKTsgKml0ICE9IHNpemVfZmllbGQ7IGl0KyspIHsKLSAgICAgIERFQlVHKCkgPDwgImZpZWxkIG5hbWU6ICIgPDwgKCppdCktPkdldE5hbWUoKTsKLSAgICAgIGlmICgqaXQgPT0gdmFyX2xlbl9maWVsZCkgewotICAgICAgICBFUlJPUih2YXJfbGVuX2ZpZWxkLCBzaXplX2ZpZWxkKSA8PCAiU2l6ZS9jb3VudCBmaWVsZCBtdXN0IGNvbWUgYmVmb3JlIHRoZSB2YXJpYWJsZSBsZW5ndGggZmllbGQgaXQgZGVzY3JpYmVzLiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZhcl9sZW5fZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgY29uc3QgYXV0byYgcGF5bG9hZF9maWVsZCA9IHN0YXRpY19jYXN0PFBheWxvYWRGaWVsZCo+KHZhcl9sZW5fZmllbGQpOwotICAgICAgcGF5bG9hZF9maWVsZC0+U2V0U2l6ZUZpZWxkKHNpemVfZmllbGQpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKHZhcl9sZW5fZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEJvZHlGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgY29uc3QgYXV0byYgYm9keV9maWVsZCA9IHN0YXRpY19jYXN0PEJvZHlGaWVsZCo+KHZhcl9sZW5fZmllbGQpOwotICAgICAgYm9keV9maWVsZC0+U2V0U2l6ZUZpZWxkKHNpemVfZmllbGQpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKHZhcl9sZW5fZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFZlY3RvckZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBjb25zdCBhdXRvJiB2ZWN0b3JfZmllbGQgPSBzdGF0aWNfY2FzdDxWZWN0b3JGaWVsZCo+KHZhcl9sZW5fZmllbGQpOwotICAgICAgdmVjdG9yX2ZpZWxkLT5TZXRTaXplRmllbGQoc2l6ZV9maWVsZCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoaXMgcG9pbnQgdGhlbiB0aGUgZmllbGQgd2Fzbid0IGEgdmFyaWFibGUgbGVuZ3RoIGZpZWxkLgotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZmllbGQgaXMgYSB2YXJpYWJsZSBsZW5ndGggZmllbGQKLSAgICBFUlJPUihmaWVsZCwgc2l6ZV9maWVsZCkgPDwgIkNhbiBub3QgdXNlIHNpemUvY291bnQgaW4gcmVmZXJlbmNlIHRvIGEgZml4ZWQgc2l6ZSBmaWVsZC5cbiI7Ci0gIH0KLX0KLQotdm9pZCBQYXJlbnREZWY6OlNldEVuZGlhbm5lc3MoYm9vbCBpc19saXR0bGVfZW5kaWFuKSB7Ci0gIGlzX2xpdHRsZV9lbmRpYW5fID0gaXNfbGl0dGxlX2VuZGlhbjsKLX0KLQotLy8gR2V0IHRoZSBzaXplLiBZb3Ugc2NhbiBzcGVjaWZ5IHdpdGhvdXRfcGF5bG9hZCBpbiBvcmRlciB0byBleGNsdWRlIHBheWxvYWQgZmllbGRzIGFzIGNoaWxkcmVuIHdpbGwgYmUgb3ZlcnJpZGluZyBpdC4KLVNpemUgUGFyZW50RGVmOjpHZXRTaXplKGJvb2wgd2l0aG91dF9wYXlsb2FkKSBjb25zdCB7Ci0gIGF1dG8gc2l6ZSA9IFNpemUoMCk7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICBpZiAod2l0aG91dF9wYXlsb2FkICYmCi0gICAgICAgIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gUGF5bG9hZEZpZWxkOjprRmllbGRUeXBlIHx8IGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBCb2R5RmllbGQ6OmtGaWVsZFR5cGUpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb2Zmc2V0IHRvIHRoZSBmaWVsZCBtdXN0IGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCBmb3IgZHluYW1pY2FsbHkgc2l6ZWQgY3VzdG9tIGZpZWxkcy4KLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEN1c3RvbUZpZWxkOjprRmllbGRUeXBlICYmIGZpZWxkLT5HZXRTaXplKCkuaGFzX2R5bmFtaWMoKSkgewotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gY3VzdG9tX2ZpZWxkX3NpemU7Ci0KLSAgICAgIC8vIEN1c3RvbSBmaWVsZHMgYXJlIHNwZWNpYWwgYXMgdGhlaXIgc2l6ZSBmaWVsZCB0YWtlcyBhbiBhcmd1bWVudC4KLSAgICAgIGN1c3RvbV9maWVsZF9zaXplIDw8IGZpZWxkLT5HZXRTaXplKCkuZHluYW1pY19zdHJpbmcoKSA8PCAiKGJlZ2luKCkiOwotCi0gICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gZGV0ZXJtaW5lIG9mZnNldCBmcm9tIGJlZ2luKCksIG90aGVyd2lzZSBlcnJvciBiZWNhdXNlIGJ5IHRoaXMgcG9pbnQsCi0gICAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgY3VzdG9tIGZpZWxkIGlzIHVua25vd24gYW5kIGNhbid0IGJlIHN1YnRyYWN0ZWQgZnJvbSBlbmQoKSB0byBnZXQgdGhlCi0gICAgICAvLyBvZmZzZXQuCi0gICAgICBhdXRvIG9mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKGZpZWxkLT5HZXROYW1lKCksIGZhbHNlKTsKLSAgICAgIGlmIChvZmZzZXQuZW1wdHkoKSkgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgIkN1c3RvbSBGaWVsZCBvZmZzZXQgY2FuIG5vdCBiZSBkZXRlcm1pbmVkIGZyb20gYmVnaW4oKS4iOwotICAgICAgfQotCi0gICAgICBpZiAob2Zmc2V0LmJpdHMoKSAlIDggIT0gMCkgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgIkN1c3RvbSBmaWVsZHMgbXVzdCBiZSBieXRlIGFsaWduZWQuIjsKLSAgICAgIH0KLSAgICAgIGlmIChvZmZzZXQuaGFzX2JpdHMoKSkgY3VzdG9tX2ZpZWxkX3NpemUgPDwgIiArICIgPDwgb2Zmc2V0LmJpdHMoKSAvIDg7Ci0gICAgICBpZiAob2Zmc2V0Lmhhc19keW5hbWljKCkpIGN1c3RvbV9maWVsZF9zaXplIDw8ICIgKyAiIDw8IG9mZnNldC5keW5hbWljX3N0cmluZygpOwotICAgICAgY3VzdG9tX2ZpZWxkX3NpemUgPDwgIikiOwotCi0gICAgICBzaXplICs9IGN1c3RvbV9maWVsZF9zaXplLnN0cigpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgc2l6ZSArPSBmaWVsZC0+R2V0U2l6ZSgpOwotICB9Ci0KLSAgaWYgKHBhcmVudF8gIT0gbnVsbHB0cikgewotICAgIHNpemUgKz0gcGFyZW50Xy0+R2V0U2l6ZSh0cnVlKTsKLSAgfQotCi0gIHJldHVybiBzaXplOwotfQotCi0vLyBHZXQgdGhlIG9mZnNldCB1bnRpbCB0aGUgZmllbGQgaXMgcmVhY2hlZCwgaWYgdGhlcmUgaXMgbm8gZmllbGQKLS8vIHJldHVybnMgYW4gZW1wdHkgU2l6ZS4gZnJvbV9lbmQgcmVxdWVzdHMgdGhlIG9mZnNldCB0byB0aGUgZmllbGQKLS8vIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCgpIGl0ZXJhdG9yLiBJZiB0aGVyZSBpcyBhIGZpZWxkIHdpdGggYW4gdW5rbm93bgotLy8gc2l6ZSBhbG9uZyB0aGUgdHJhdmVyc2FsLCB0aGVuIGFuIGVtcHR5IHNpemUgaXMgcmV0dXJuZWQuCi1TaXplIFBhcmVudERlZjo6R2V0T2Zmc2V0Rm9yRmllbGQoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgYm9vbCBmcm9tX2VuZCkgY29uc3QgewotICAvLyBDaGVjayBmaXJzdCBpZiB0aGUgZmllbGQgZXhpc3RzLgotICBpZiAoZmllbGRzXy5HZXRGaWVsZChmaWVsZF9uYW1lKSA9PSBudWxscHRyKSB7Ci0gICAgRVJST1IoKSA8PCAiQ2FuJ3QgZmluZCBhIGZpZWxkIG9mZnNldCBmb3Igbm9uZXhpc3RlbnQgZmllbGQgbmFtZWQ6ICIgPDwgZmllbGRfbmFtZSA8PCAiIGluICIgPDwgbmFtZV87Ci0gIH0KLQotICBQYWNrZXRGaWVsZCogcGFkZGVkX2ZpZWxkID0gbnVsbHB0cjsKLSAgewotICAgIFBhY2tldEZpZWxkKiBsYXN0X2ZpZWxkID0gbnVsbHB0cjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gZmllbGQgOiBmaWVsZHNfKSB7Ci0gICAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBwYWRkZWRfZmllbGQgPSBsYXN0X2ZpZWxkOwotICAgICAgfQotICAgICAgbGFzdF9maWVsZCA9IGZpZWxkOwotICAgIH0KLSAgfQotCi0gIC8vIFdlIGhhdmUgdG8gdXNlIGEgZ2VuZXJpYyBsYW1iZGEgdG8gY29uZGl0aW9uYWxseSBjaGFuZ2UgaXRlcmF0aW9uIGRpcmVjdGlvbgotICAvLyBkdWUgdG8gaXRlcmF0b3IgYW5kIHJldmVyc2VfaXRlcmF0b3IgYmVpbmcgZGlmZmVyZW50IHR5cGVzLgotICBhdXRvIHNpemVfbGFtYmRhID0gWyZdKGF1dG8gZnJvbSwgYXV0byB0bykgLT4gU2l6ZSB7Ci0gICAgYXV0byBzaXplID0gU2l6ZSgwKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBmcm9tOyBpdCAhPSB0bzsgaXQrKykgewotICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZmllbGQsIGVuZCB0aGUgbG9vcC4KLSAgICAgIGlmICgoKml0KS0+R2V0TmFtZSgpID09IGZpZWxkX25hbWUpIGJyZWFrOwotICAgICAgY29uc3QgYXV0byYgZmllbGQgPSAqaXQ7Ci0gICAgICAvLyBJZiB0aGVyZSBpcyBhIGZpZWxkIHdpdGggYW4gdW5rbm93biBzaXplIGJlZm9yZSB0aGUgZmllbGQsIHJldHVybiBhbiBlbXB0eSBTaXplLgotICAgICAgaWYgKGZpZWxkLT5HZXRTaXplKCkuZW1wdHkoKSAmJiBwYWRkZWRfZmllbGQgIT0gZmllbGQpIHsKLSAgICAgICAgcmV0dXJuIFNpemUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZCAhPSBwYWRkZWRfZmllbGQpIHsKLSAgICAgICAgaWYgKCFmcm9tX2VuZCB8fCBmaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gUGFkZGluZ0ZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgICAgc2l6ZSArPSBmaWVsZC0+R2V0U2l6ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotICB9OwotCi0gIC8vIENoYW5nZSBpdGVyYXRpb24gZGlyZWN0aW9uIGJhc2VkIG9uIGZyb21fZW5kLgotICBhdXRvIHNpemUgPSBTaXplKCk7Ci0gIGlmIChmcm9tX2VuZCkKLSAgICBzaXplID0gc2l6ZV9sYW1iZGEoZmllbGRzXy5yYmVnaW4oKSwgZmllbGRzXy5yZW5kKCkpOwotICBlbHNlCi0gICAgc2l6ZSA9IHNpemVfbGFtYmRhKGZpZWxkc18uYmVnaW4oKSwgZmllbGRzXy5lbmQoKSk7Ci0gIGlmIChzaXplLmVtcHR5KCkpIHJldHVybiBzaXplOwotCi0gIC8vIFdlIG5lZWQgdGhlIG9mZnNldCB1bnRpbCBhIHBheWxvYWQgb3IgYm9keSBmaWVsZC4KLSAgaWYgKHBhcmVudF8gIT0gbnVsbHB0cikgewotICAgIGlmIChwYXJlbnRfLT5maWVsZHNfLkhhc1BheWxvYWQoKSkgewotICAgICAgYXV0byBwYXJlbnRfcGF5bG9hZF9vZmZzZXQgPSBwYXJlbnRfLT5HZXRPZmZzZXRGb3JGaWVsZCgicGF5bG9hZCIsIGZyb21fZW5kKTsKLSAgICAgIGlmIChwYXJlbnRfcGF5bG9hZF9vZmZzZXQuZW1wdHkoKSkgewotICAgICAgICBFUlJPUigpIDw8ICJFbXB0eSBvZmZzZXQgZm9yIHBheWxvYWQgaW4gIiA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiIGZpbmRpbmcgdGhlIG9mZnNldCBmb3IgZmllbGQ6ICIgPDwgZmllbGRfbmFtZTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gcGFyZW50X3BheWxvYWRfb2Zmc2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICBhdXRvIHBhcmVudF9ib2R5X29mZnNldCA9IHBhcmVudF8tPkdldE9mZnNldEZvckZpZWxkKCJib2R5IiwgZnJvbV9lbmQpOwotICAgICAgaWYgKHBhcmVudF9ib2R5X29mZnNldC5lbXB0eSgpKSB7Ci0gICAgICAgIEVSUk9SKCkgPDwgIkVtcHR5IG9mZnNldCBmb3IgYm9keSBpbiAiIDw8IHBhcmVudF8tPm5hbWVfIDw8ICIgZmluZGluZyB0aGUgb2Zmc2V0IGZvciBmaWVsZDogIiA8PCBmaWVsZF9uYW1lOwotICAgICAgfQotICAgICAgc2l6ZSArPSBwYXJlbnRfYm9keV9vZmZzZXQ7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLUZpZWxkTGlzdCBQYXJlbnREZWY6OkdldFBhcmFtTGlzdCgpIGNvbnN0IHsKLSAgRmllbGRMaXN0IHBhcmFtczsKLQotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcGFyYW1fdHlwZXMgPSB7Ci0gICAgICBTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIEVudW1GaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIEFycmF5RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBWZWN0b3JGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIEN1c3RvbUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgU3RydWN0RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBWYXJpYWJsZUxlbmd0aFN0cnVjdEZpZWxkOjprRmllbGRUeXBlLAotICAgICAgUGF5bG9hZEZpZWxkOjprRmllbGRUeXBlLAotICB9OwotCi0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBhdXRvIHBhcmVudF9wYXJhbXMgPSBwYXJlbnRfLT5HZXRQYXJhbUxpc3QoKS5HZXRGaWVsZHNXaXRoVHlwZXMocGFyYW1fdHlwZXMpOwotCi0gICAgLy8gRG8gbm90IGluY2x1ZGUgY29uc3RyYWluZWQgZmllbGRzIGluIHRoZSBwYXJhbXMKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogcGFyZW50X3BhcmFtcykgewotICAgICAgaWYgKHBhcmVudF9jb25zdHJhaW50c18uZmluZChmaWVsZC0+R2V0TmFtZSgpKSA9PSBwYXJlbnRfY29uc3RyYWludHNfLmVuZCgpKSB7Ci0gICAgICAgIHBhcmFtcy5BcHBlbmRGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIEFkZCBvdXIgcGFyYW1ldGVycy4KLSAgcmV0dXJuIHBhcmFtcy5NZXJnZShmaWVsZHNfLkdldEZpZWxkc1dpdGhUeXBlcyhwYXJhbV90eXBlcykpOwotfQotCi12b2lkIFBhcmVudERlZjo6R2VuTWVtYmVycyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgLy8gQWRkIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICBpZiAoZmllbGQtPkdlbkJ1aWxkZXJNZW1iZXIocykpIHsKLSAgICAgIHMgPDwgIl97fTsiOwotICAgIH0KLSAgfQotfQotCi12b2lkIFBhcmVudERlZjo6R2VuU2l6ZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgYXV0byBoZWFkZXJfZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNCZWZvcmVQYXlsb2FkT3JCb2R5KCk7Ci0gIGF1dG8gZm9vdGVyX2ZpZWxkcyA9IGZpZWxkc18uR2V0RmllbGRzQWZ0ZXJQYXlsb2FkT3JCb2R5KCk7Ci0KLSAgU2l6ZSBwYWRkZWRfc2l6ZTsKLSAgY29uc3QgUGFja2V0RmllbGQqIHBhZGRlZF9maWVsZCA9IG51bGxwdHI7Ci0gIGNvbnN0IFBhY2tldEZpZWxkKiBsYXN0X2ZpZWxkID0gbnVsbHB0cjsKLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgaWYgKCFwYWRkZWRfc2l6ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEVSUk9SKCkgPDwgIk9ubHkgb25lIHBhZGRpbmcgZmllbGQgaXMgYWxsb3dlZC4gIFNlY29uZCBmaWVsZDogIiA8PCBmaWVsZC0+R2V0TmFtZSgpOwotICAgICAgfQotICAgICAgcGFkZGVkX2ZpZWxkID0gbGFzdF9maWVsZDsKLSAgICAgIHBhZGRlZF9zaXplID0gZmllbGQtPkdldFNpemUoKTsKLSAgICB9Ci0gICAgbGFzdF9maWVsZCA9IGZpZWxkOwotICB9Ci0KLSAgcyA8PCAicHJvdGVjdGVkOiI7Ci0gIHMgPDwgInNpemVfdCBCaXRzT2ZIZWFkZXIoKSBjb25zdCB7IjsKLSAgcyA8PCAicmV0dXJuIDAiOwotCi0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBpZiAocGFyZW50Xy0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlOjpQQUNLRVQpIHsKLSAgICAgIHMgPDwgIiArICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIkJ1aWxkZXI6OkJpdHNPZkhlYWRlcigpICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIiArICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIjo6Qml0c09mSGVhZGVyKCkgIjsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogaGVhZGVyX2ZpZWxkcykgewotICAgIGlmIChmaWVsZCA9PSBwYWRkZWRfZmllbGQpIHsKLSAgICAgIHMgPDwgIiArICIgPDwgcGFkZGVkX3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIiArICIgPDwgZmllbGQtPkdldEJ1aWxkZXJTaXplKCk7Ci0gICAgfQotICB9Ci0gIHMgPDwgIjsiOwotCi0gIHMgPDwgIn1cblxuIjsKLQotICBzIDw8ICJzaXplX3QgQml0c09mRm9vdGVyKCkgY29uc3QgeyI7Ci0gIHMgPDwgInJldHVybiAwIjsKLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZvb3Rlcl9maWVsZHMpIHsKLSAgICBpZiAoZmllbGQgPT0gcGFkZGVkX2ZpZWxkKSB7Ci0gICAgICBzIDw8ICIgKyAiIDw8IHBhZGRlZF9zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICBzIDw8ICIgKyAiIDw8IGZpZWxkLT5HZXRCdWlsZGVyU2l6ZSgpOwotICAgIH0KLSAgfQotCi0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBpZiAocGFyZW50Xy0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlOjpQQUNLRVQpIHsKLSAgICAgIHMgPDwgIiArICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIkJ1aWxkZXI6OkJpdHNPZkZvb3RlcigpICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIiArICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIjo6Qml0c09mRm9vdGVyKCkgIjsKLSAgICB9Ci0gIH0KLSAgcyA8PCAiOyI7Ci0gIHMgPDwgIn1cblxuIjsKLQotICBpZiAoZmllbGRzXy5IYXNQYXlsb2FkKCkpIHsKLSAgICBzIDw8ICJzaXplX3QgR2V0UGF5bG9hZFNpemUoKSBjb25zdCB7IjsKLSAgICBzIDw8ICJpZiAocGF5bG9hZF8gIT0gbnVsbHB0cikge3JldHVybiBwYXlsb2FkXy0+c2l6ZSgpO30iOwotICAgIHMgPDwgImVsc2UgeyByZXR1cm4gc2l6ZSgpIC0gKEJpdHNPZkhlYWRlcigpICsgQml0c09mRm9vdGVyKCkpIC8gODt9IjsKLSAgICBzIDw8ICI7fVxuXG4iOwotICB9Ci0KLSAgcyA8PCAicHVibGljOiI7Ci0gIHMgPDwgInZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZSB7IjsKLSAgcyA8PCAicmV0dXJuIChCaXRzT2ZIZWFkZXIoKSAvIDgpIjsKLSAgaWYgKGZpZWxkc18uSGFzUGF5bG9hZCgpKSB7Ci0gICAgcyA8PCAiKyBwYXlsb2FkXy0+c2l6ZSgpIjsKLSAgfQotICBpZiAoZmllbGRzXy5IYXNCb2R5KCkpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogaGVhZGVyX2ZpZWxkcykgewotICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBTaXplRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgY29uc3QgYXV0byYgZmllbGRfbmFtZSA9ICgoU2l6ZUZpZWxkKilmaWVsZCktPkdldFNpemVkRmllbGROYW1lKCk7Ci0gICAgICAgIGlmIChmaWVsZF9uYW1lID09ICJib2R5IikgewotICAgICAgICAgIHMgPDwgIisgYm9keV9zaXplX2V4dHJhY3RlZF8iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHMgPDwgIiArIChCaXRzT2ZGb290ZXIoKSAvIDgpOyI7Ci0gIHMgPDwgIn1cbiI7Ci19Ci0KLXZvaWQgUGFyZW50RGVmOjpHZW5TZXJpYWxpemUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGF1dG8gaGVhZGVyX2ZpZWxkcyA9IGZpZWxkc18uR2V0RmllbGRzQmVmb3JlUGF5bG9hZE9yQm9keSgpOwotICBhdXRvIGZvb3Rlcl9maWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc0FmdGVyUGF5bG9hZE9yQm9keSgpOwotCi0gIHMgPDwgInByb3RlY3RlZDoiOwotICBzIDw8ICJ2b2lkIFNlcmlhbGl6ZUhlYWRlcihCaXRJbnNlcnRlciYiOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyIHx8IGhlYWRlcl9maWVsZHMuc2l6ZSgpICE9IDApIHsKLSAgICBzIDw8ICIgaSAiOwotICB9Ci0gIHMgPDwgIikgY29uc3QgeyI7Ci0KLSAgaWYgKHBhcmVudF8gIT0gbnVsbHB0cikgewotICAgIGlmIChwYXJlbnRfLT5HZXREZWZpbml0aW9uVHlwZSgpID09IFR5cGU6OlBBQ0tFVCkgewotICAgICAgcyA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiQnVpbGRlcjo6U2VyaWFsaXplSGVhZGVyKGkpOyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIjo6U2VyaWFsaXplSGVhZGVyKGkpOyI7Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgUGFja2V0RmllbGQqIHBhZGRlZF9maWVsZCA9IG51bGxwdHI7Ci0gIHsKLSAgICBQYWNrZXRGaWVsZCogbGFzdF9maWVsZCA9IG51bGxwdHI7Ci0gICAgZm9yIChjb25zdCBhdXRvIGZpZWxkIDogaGVhZGVyX2ZpZWxkcykgewotICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgcGFkZGVkX2ZpZWxkID0gbGFzdF9maWVsZDsKLSAgICAgIH0KLSAgICAgIGxhc3RfZmllbGQgPSBmaWVsZDsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogaGVhZGVyX2ZpZWxkcykgewotICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gU2l6ZUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBjb25zdCBhdXRvJiBmaWVsZF9uYW1lID0gKChTaXplRmllbGQqKWZpZWxkKS0+R2V0U2l6ZWRGaWVsZE5hbWUoKTsKLSAgICAgIGNvbnN0IGF1dG8mIHNpemVkX2ZpZWxkID0gZmllbGRzXy5HZXRGaWVsZChmaWVsZF9uYW1lKTsKLSAgICAgIGlmIChzaXplZF9maWVsZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEVSUk9SKGZpZWxkKSA8PCBfX2Z1bmNfXyA8PCAiOiBDYW4ndCBmaW5kIHNpemVkIGZpZWxkIG5hbWVkICIgPDwgZmllbGRfbmFtZTsKLSAgICAgIH0KLSAgICAgIGlmIChzaXplZF9maWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gUGF5bG9hZEZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIHMgPDwgInNpemVfdCBwYXlsb2FkX2J5dGVzID0gR2V0UGF5bG9hZFNpemUoKTsiOwotICAgICAgICBzdGQ6OnN0cmluZyBtb2RpZmllciA9ICgoUGF5bG9hZEZpZWxkKilzaXplZF9maWVsZCktPnNpemVfbW9kaWZpZXJfOwotICAgICAgICBpZiAobW9kaWZpZXIgIT0gIiIpIHsKLSAgICAgICAgICBzIDw8ICJzdGF0aWNfYXNzZXJ0KCgiIDw8IG1vZGlmaWVyIDw8ICIpJTggPT0gMCwgXCJNb2RpZmllcnMgbXVzdCBiZSBieXRlLWFsaWduZWRcIik7IjsKLSAgICAgICAgICBzIDw8ICJwYXlsb2FkX2J5dGVzID0gcGF5bG9hZF9ieXRlcyArICgiIDw8IG1vZGlmaWVyIDw8ICIpIC8gODsiOwotICAgICAgICB9Ci0gICAgICAgIHMgPDwgIkFTU0VSVChwYXlsb2FkX2J5dGVzIDwgKHN0YXRpY19jYXN0PHNpemVfdD4oMSkgPDwgIiA8PCBmaWVsZC0+R2V0U2l6ZSgpLmJpdHMoKSA8PCAiKSk7IjsKLSAgICAgICAgcyA8PCAiaW5zZXJ0KHN0YXRpY19jYXN0PCIgPDwgZmllbGQtPkdldERhdGFUeXBlKCkgPDwgIj4ocGF5bG9hZF9ieXRlcyksIGksIiA8PCBmaWVsZC0+R2V0U2l6ZSgpLmJpdHMoKSA8PCAiKTsiOwotICAgICAgfSBlbHNlIGlmIChzaXplZF9maWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQm9keUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIHMgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiX2V4dHJhY3RlZF8gPSAwOyI7Ci0gICAgICAgIHMgPDwgInNpemVfdCBsb2NhbF9zaXplID0gIiA8PCBuYW1lXyA8PCAiOjpzaXplKCk7IjsKLQotICAgICAgICBzIDw8ICJBU1NFUlQoKHNpemUoKSAtIGxvY2FsX3NpemUpIDwgKHN0YXRpY19jYXN0PHNpemVfdD4oMSkgPDwgIiA8PCBmaWVsZC0+R2V0U2l6ZSgpLmJpdHMoKSA8PCAiKSk7IjsKLSAgICAgICAgcyA8PCAiaW5zZXJ0KHN0YXRpY19jYXN0PCIgPDwgZmllbGQtPkdldERhdGFUeXBlKCkgPDwgIj4oc2l6ZSgpIC0gbG9jYWxfc2l6ZSksIGksIiA8PCBmaWVsZC0+R2V0U2l6ZSgpLmJpdHMoKQotICAgICAgICAgIDw8ICIpOyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoc2l6ZWRfZmllbGQtPkdldEZpZWxkVHlwZSgpICE9IFZlY3RvckZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgICAgRVJST1IoZmllbGQpIDw8IF9fZnVuY19fIDw8ICI6IFVuaGFuZGxlZCBzaXplZCBmaWVsZCB0eXBlIGZvciAiIDw8IGZpZWxkX25hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgYXV0byYgdmVjdG9yX25hbWUgPSBmaWVsZF9uYW1lICsgIl8iOwotICAgICAgICBjb25zdCBWZWN0b3JGaWVsZCogdmVjdG9yID0gKFZlY3RvckZpZWxkKilzaXplZF9maWVsZDsKLSAgICAgICAgcyA8PCAic2l6ZV90ICIgPDwgdmVjdG9yX25hbWUgKyAiYnl0ZXMgPSAwOyI7Ci0gICAgICAgIGlmICh2ZWN0b3ItPmVsZW1lbnRfc2l6ZV8uZW1wdHkoKSB8fCB2ZWN0b3ItPmVsZW1lbnRfc2l6ZV8uaGFzX2R5bmFtaWMoKSkgewotICAgICAgICAgIHMgPDwgImZvciAoYXV0byBlbGVtIDogIiA8PCB2ZWN0b3JfbmFtZSA8PCAiKSB7IjsKLSAgICAgICAgICBzIDw8IHZlY3Rvcl9uYW1lICsgImJ5dGVzICs9IGVsZW0uc2l6ZSgpOyB9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzIDw8IHZlY3Rvcl9uYW1lICsgImJ5dGVzID0gIjsKLSAgICAgICAgICBzIDw8IHZlY3Rvcl9uYW1lIDw8ICIuc2l6ZSgpICogKCgiIDw8IHZlY3Rvci0+ZWxlbWVudF9zaXplXyA8PCAiKSAvIDgpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjpzdHJpbmcgbW9kaWZpZXIgPSB2ZWN0b3ItPkdldFNpemVNb2RpZmllcigpOwotICAgICAgICBpZiAobW9kaWZpZXIgIT0gIiIpIHsKLSAgICAgICAgICBzIDw8ICJzdGF0aWNfYXNzZXJ0KCgiIDw8IG1vZGlmaWVyIDw8ICIpJTggPT0gMCwgXCJNb2RpZmllcnMgbXVzdCBiZSBieXRlLWFsaWduZWRcIik7IjsKLSAgICAgICAgICBzIDw8IHZlY3Rvcl9uYW1lIDw8ICJieXRlcyA9ICI7Ci0gICAgICAgICAgcyA8PCB2ZWN0b3JfbmFtZSA8PCAiYnl0ZXMgKyAoIiA8PCBtb2RpZmllciA8PCAiKSAvIDg7IjsKLSAgICAgICAgfQotICAgICAgICBzIDw8ICJBU1NFUlQoIiA8PCB2ZWN0b3JfbmFtZSArICJieXRlcyA8ICgxIDw8ICIgPDwgZmllbGQtPkdldFNpemUoKS5iaXRzKCkgPDwgIikpOyI7Ci0gICAgICAgIHMgPDwgImluc2VydCgiIDw8IHZlY3Rvcl9uYW1lIDw8ICJieXRlcywgaSwgIjsKLSAgICAgICAgcyA8PCBmaWVsZC0+R2V0U2l6ZSgpLmJpdHMoKSA8PCAiKTsiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IENoZWNrc3VtU3RhcnRGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgY29uc3QgYXV0byYgZmllbGRfbmFtZSA9ICgoQ2hlY2tzdW1TdGFydEZpZWxkKilmaWVsZCktPkdldFN0YXJ0ZWRGaWVsZE5hbWUoKTsKLSAgICAgIGNvbnN0IGF1dG8mIHN0YXJ0ZWRfZmllbGQgPSBmaWVsZHNfLkdldEZpZWxkKGZpZWxkX25hbWUpOwotICAgICAgaWYgKHN0YXJ0ZWRfZmllbGQgPT0gbnVsbHB0cikgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgX19mdW5jX18gPDwgIjogQ2FuJ3QgZmluZCBjaGVja3N1bSBmaWVsZCBuYW1lZCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkLT5HZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIpIjsKLSAgICAgIH0KLSAgICAgIHMgPDwgImF1dG8gc2hhcmVkX2NoZWNrc3VtX3B0ciA9IHN0ZDo6bWFrZV9zaGFyZWQ8IiA8PCBzdGFydGVkX2ZpZWxkLT5HZXREYXRhVHlwZSgpIDw8ICI+KCk7IjsKLSAgICAgIHMgPDwgInNoYXJlZF9jaGVja3N1bV9wdHItPkluaXRpYWxpemUoKTsiOwotICAgICAgcyA8PCAiaS5SZWdpc3Rlck9ic2VydmVyKHBhY2tldDo6Qnl0ZU9ic2VydmVyKCI7Ci0gICAgICBzIDw8ICJbc2hhcmVkX2NoZWNrc3VtX3B0cl0odWludDhfdCBieXRlKXsgc2hhcmVkX2NoZWNrc3VtX3B0ci0+QWRkQnl0ZShieXRlKTt9LCI7Ci0gICAgICBzIDw8ICJbc2hhcmVkX2NoZWNrc3VtX3B0cl0oKXsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzaGFyZWRfY2hlY2tzdW1fcHRyLT5HZXRDaGVja3N1bSgpKTt9KSk7IjsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIHMgPDwgIkFTU0VSVCh1bnBhZGRlZF9zaXplIDw9ICIgPDwgZmllbGQtPkdldFNpemUoKS5ieXRlcygpIDw8ICIpOyI7Ci0gICAgICBzIDw8ICJzaXplX3QgcGFkZGluZ19ieXRlcyA9ICI7Ci0gICAgICBzIDw8IGZpZWxkLT5HZXRTaXplKCkuYnl0ZXMoKSA8PCAiIC0gdW5wYWRkZWRfc2l6ZTsiOwotICAgICAgcyA8PCAiZm9yIChzaXplX3QgcGFkZGluZyA9IDA7IHBhZGRpbmcgPCBwYWRkaW5nX2J5dGVzOyBwYWRkaW5nKyspIHtpLmluc2VydF9ieXRlKDApO30iOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IENvdW50RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIGNvbnN0IGF1dG8mIHZlY3Rvcl9uYW1lID0gKChTaXplRmllbGQqKWZpZWxkKS0+R2V0U2l6ZWRGaWVsZE5hbWUoKSArICJfIjsKLSAgICAgIHMgPDwgImluc2VydCgiIDw8IHZlY3Rvcl9uYW1lIDw8ICIuc2l6ZSgpLCBpLCAiIDw8IGZpZWxkLT5HZXRTaXplKCkuYml0cygpIDw8ICIpOyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChmaWVsZCA9PSBwYWRkZWRfZmllbGQpIHsKLSAgICAgICAgcyA8PCAic2l6ZV90IHVucGFkZGVkX3NpemUgPSAoIiA8PCBmaWVsZC0+R2V0QnVpbGRlclNpemUoKSA8PCAiKSAvIDg7IjsKLSAgICAgIH0KLSAgICAgIGZpZWxkLT5HZW5JbnNlcnRlcihzKTsKLSAgICB9Ci0gIH0KLSAgcyA8PCAifVxuXG4iOwotCi0gIHMgPDwgInZvaWQgU2VyaWFsaXplRm9vdGVyKEJpdEluc2VydGVyJiI7Ci0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIgfHwgZm9vdGVyX2ZpZWxkcy5zaXplKCkgIT0gMCkgewotICAgIHMgPDwgIiBpICI7Ci0gIH0KLSAgcyA8PCAiKSBjb25zdCB7IjsKLQotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZm9vdGVyX2ZpZWxkcykgewotICAgIGZpZWxkLT5HZW5JbnNlcnRlcihzKTsKLSAgfQotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgaWYgKHBhcmVudF8tPkdldERlZmluaXRpb25UeXBlKCkgPT0gVHlwZTo6UEFDS0VUKSB7Ci0gICAgICBzIDw8IHBhcmVudF8tPm5hbWVfIDw8ICJCdWlsZGVyOjpTZXJpYWxpemVGb290ZXIoaSk7IjsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiOjpTZXJpYWxpemVGb290ZXIoaSk7IjsKLSAgICB9Ci0gIH0KLSAgcyA8PCAifVxuXG4iOwotCi0gIHMgPDwgInB1YmxpYzoiOwotICBzIDw8ICJ2aXJ0dWFsIHZvaWQgU2VyaWFsaXplKEJpdEluc2VydGVyJiBpKSBjb25zdCBvdmVycmlkZSB7IjsKLSAgcyA8PCAiU2VyaWFsaXplSGVhZGVyKGkpOyI7Ci0gIGlmIChmaWVsZHNfLkhhc1BheWxvYWQoKSkgewotICAgIHMgPDwgInBheWxvYWRfLT5TZXJpYWxpemUoaSk7IjsKLSAgfQotICBzIDw8ICJTZXJpYWxpemVGb290ZXIoaSk7IjsKLQotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIFBhcmVudERlZjo6R2VuSW5zdGFuY2VPZihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgaWYgKHBhcmVudF8gIT0gbnVsbHB0ciAmJiBwYXJlbnRfY29uc3RyYWludHNfLnNpemUoKSA+IDApIHsKLSAgICBzIDw8ICJzdGF0aWMgYm9vbCBJc0luc3RhbmNlKGNvbnN0ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIiYgcGFyZW50KSB7IjsKLSAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFyZW50IHBhcmFtcy4KLSAgICBGaWVsZExpc3QgcGFyZW50X3BhcmFtcyA9IHBhcmVudF8tPkdldFBhcmFtTGlzdCgpLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICAgIFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgIH0pOwotCi0gICAgLy8gQ2hlY2sgaWYgY29uc3RyYWluZWQgcGFyZW50IGZpZWxkcyBhcmUgc2V0IHRvIHRoZWlyIGNvcnJlY3QgdmFsdWVzLgotICAgIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBwYXJlbnRfcGFyYW1zKSB7Ci0gICAgICBjb25zdCBhdXRvJiBjb25zdHJhaW50ID0gcGFyZW50X2NvbnN0cmFpbnRzXy5maW5kKGZpZWxkLT5HZXROYW1lKCkpOwotICAgICAgaWYgKGNvbnN0cmFpbnQgIT0gcGFyZW50X2NvbnN0cmFpbnRzXy5lbmQoKSkgewotICAgICAgICBzIDw8ICJpZiAocGFyZW50LiIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiXyAhPSAiOwotICAgICAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFNjYWxhckZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgICAgcyA8PCBzdGQ6OmdldDxpbnQ2NF90Pihjb25zdHJhaW50LT5zZWNvbmQpIDw8ICIpIjsKLSAgICAgICAgICBzIDw8ICJ7IHJldHVybiBmYWxzZTt9IjsKLSAgICAgICAgfSBlbHNlIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRW51bUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgICAgcyA8PCBzdGQ6OmdldDxzdGQ6OnN0cmluZz4oY29uc3RyYWludC0+c2Vjb25kKSA8PCAiKSI7Ci0gICAgICAgICAgcyA8PCAieyByZXR1cm4gZmFsc2U7fSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgRVJST1IoZmllbGQpIDw8ICJDb25zdHJhaW50cyBvbiBub24gZW51bS9zY2FsYXIgZmllbGRzIHNob3VsZCBiZSBpbXBvc3NpYmxlLiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcyA8PCAicmV0dXJuIHRydWU7fSI7Ci0gIH0KLX0KLQotY29uc3QgUGFyZW50RGVmKiBQYXJlbnREZWY6OkdldFJvb3REZWYoKSBjb25zdCB7Ci0gIGlmIChwYXJlbnRfID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHJldHVybiBwYXJlbnRfLT5HZXRSb290RGVmKCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPGNvbnN0IFBhcmVudERlZio+IFBhcmVudERlZjo6R2V0QW5jZXN0b3JzKCkgY29uc3QgewotICBzdGQ6OnZlY3Rvcjxjb25zdCBQYXJlbnREZWYqPiByZXM7Ci0gIGF1dG8gcGFyZW50ID0gcGFyZW50XzsKLSAgd2hpbGUgKHBhcmVudCAhPSBudWxscHRyKSB7Ci0gICAgcmVzLnB1c2hfYmFjayhwYXJlbnQpOwotICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50XzsKLSAgfQotICBzdGQ6OnJldmVyc2UocmVzLmJlZ2luKCksIHJlcy5lbmQoKSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZhcmlhbnQ8aW50NjRfdCwgc3RkOjpzdHJpbmc+PiBQYXJlbnREZWY6OkdldEFsbENvbnN0cmFpbnRzKCkgY29uc3QgewotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2YXJpYW50PGludDY0X3QsIHN0ZDo6c3RyaW5nPj4gcmVzOwotICByZXMuaW5zZXJ0KHBhcmVudF9jb25zdHJhaW50c18uYmVnaW4oKSwgcGFyZW50X2NvbnN0cmFpbnRzXy5lbmQoKSk7Ci0gIGZvciAoYXV0byBwYXJlbnQgOiBHZXRBbmNlc3RvcnMoKSkgewotICAgIHJlcy5pbnNlcnQocGFyZW50LT5wYXJlbnRfY29uc3RyYWludHNfLmJlZ2luKCksIHBhcmVudC0+cGFyZW50X2NvbnN0cmFpbnRzXy5lbmQoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotYm9vbCBQYXJlbnREZWY6Okhhc0FuY2VzdG9yTmFtZWQoc3RkOjpzdHJpbmcgbmFtZSkgY29uc3QgewotICBhdXRvIHBhcmVudCA9IHBhcmVudF87Ci0gIHdoaWxlIChwYXJlbnQgIT0gbnVsbHB0cikgewotICAgIGlmIChwYXJlbnQtPm5hbWVfID09IG5hbWUpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudF87Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGQ6OnN0cmluZyBQYXJlbnREZWY6OkZpbmRDb25zdHJhaW50RmllbGQoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nIHJlczsKLSAgZm9yIChjb25zdCBhdXRvJiBjaGlsZCA6IGNoaWxkcmVuXykgewotICAgIGlmICghY2hpbGQtPnBhcmVudF9jb25zdHJhaW50c18uZW1wdHkoKSkgewotICAgICAgcmV0dXJuIGNoaWxkLT5wYXJlbnRfY29uc3RyYWludHNfLmJlZ2luKCktPmZpcnN0OwotICAgIH0KLSAgICByZXMgPSBjaGlsZC0+RmluZENvbnN0cmFpbnRGaWVsZCgpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0ZDo6bWFwPGNvbnN0IFBhcmVudERlZiosIGNvbnN0IHN0ZDo6dmFyaWFudDxpbnQ2NF90LCBzdGQ6OnN0cmluZz4+Ci0gICAgUGFyZW50RGVmOjpGaW5kRGVzY2VuZGFudHNXaXRoQ29uc3RyYWludCgKLSAgICBzdGQ6OnN0cmluZyBjb25zdHJhaW50X25hbWUpIGNvbnN0IHsKLSAgc3RkOjptYXA8Y29uc3QgUGFyZW50RGVmKiwgY29uc3Qgc3RkOjp2YXJpYW50PGludDY0X3QsIHN0ZDo6c3RyaW5nPj4gcmVzOwotCi0gIGZvciAoYXV0byBjb25zdCYgY2hpbGQgOiBjaGlsZHJlbl8pIHsKLSAgICBhdXRvIGNvbnN0cmFpbnQgPSBjaGlsZC0+cGFyZW50X2NvbnN0cmFpbnRzXy5maW5kKGNvbnN0cmFpbnRfbmFtZSk7Ci0gICAgaWYgKGNvbnN0cmFpbnQgIT0gY2hpbGQtPnBhcmVudF9jb25zdHJhaW50c18uZW5kKCkpIHsKLSAgICAgIHJlcy5pbnNlcnQoc3RkOjpwYWlyKGNoaWxkLCBjb25zdHJhaW50LT5zZWNvbmQpKTsKLSAgICB9Ci0gICAgYXV0byBtID0gY2hpbGQtPkZpbmREZXNjZW5kYW50c1dpdGhDb25zdHJhaW50KGNvbnN0cmFpbnRfbmFtZSk7Ci0gICAgcmVzLmluc2VydChtLmJlZ2luKCksIG0uZW5kKCkpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0ZDo6dmVjdG9yPGNvbnN0IFBhcmVudERlZio+IFBhcmVudERlZjo6RmluZFBhdGhUb0Rlc2NlbmRhbnQoc3RkOjpzdHJpbmcgZGVzY2VuZGFudCkgY29uc3QgewotICBzdGQ6OnZlY3Rvcjxjb25zdCBQYXJlbnREZWYqPiByZXM7Ci0KLSAgZm9yIChhdXRvIGNvbnN0JiBjaGlsZCA6IGNoaWxkcmVuXykgewotICAgIGF1dG8gdiA9IGNoaWxkLT5GaW5kUGF0aFRvRGVzY2VuZGFudChkZXNjZW5kYW50KTsKLSAgICBpZiAodi5zaXplKCkgPiAwKSB7Ci0gICAgICByZXMuaW5zZXJ0KHJlcy5iZWdpbigpLCB2LmJlZ2luKCksIHYuZW5kKCkpOwotICAgICAgcmVzLnB1c2hfYmFjayhjaGlsZCk7Ci0gICAgfQotICAgIGlmIChjaGlsZC0+bmFtZV8gPT0gZGVzY2VuZGFudCkgewotICAgICAgcmVzLnB1c2hfYmFjayhjaGlsZCk7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzOwotfQotCi1ib29sIFBhcmVudERlZjo6SGFzQ2hpbGRFbnVtcygpIGNvbnN0IHsKLSAgcmV0dXJuICFjaGlsZHJlbl8uZW1wdHkoKSB8fCBmaWVsZHNfLkhhc1BheWxvYWQoKTsKLX0KLQotdm9pZCBQYXJlbnREZWY6OkdlblJ1c3RDb25mb3JtYW5jZUNoZWNrKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBhdXRvIGZpZWxkcyA9IGZpZWxkc18uR2V0RmllbGRzV2l0aFR5cGVzKHsKLSAgICAgIEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotCi0gIGZvciAoYXV0byBjb25zdCYgZmllbGQgOiBmaWVsZHMpIHsKLSAgICBhdXRvIHN0YXJ0X29mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKGZpZWxkLT5HZXROYW1lKCksIGZhbHNlKTsKLSAgICBhdXRvIGVuZF9vZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCB0cnVlKTsKLQotICAgIGF1dG8gZiA9IChGaXhlZFNjYWxhckZpZWxkKilmaWVsZDsKLSAgICBmLT5HZW5SdXN0R2V0dGVyKHMsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCk7Ci0gICAgcyA8PCAiaWYgIiA8PCBmLT5HZXROYW1lKCkgPDwgIiAhPSAiOwotICAgIGYtPkdlblZhbHVlKHMpOwotICAgIHMgPDwgIiB7IHJldHVybiBmYWxzZTsgfSAiOwotICB9Ci19Ci0KLXZvaWQgUGFyZW50RGVmOjpHZW5SdXN0V3JpdGVUb0ZpZWxkcyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgYXV0byBmaWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICBCb2R5RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBSZXNlcnZlZEZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLQotICBmb3IgKGF1dG8gY29uc3QmIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgYXV0byBzdGFydF9maWVsZF9vZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCBmYWxzZSk7Ci0gICAgYXV0byBlbmRfZmllbGRfb2Zmc2V0ID0gR2V0T2Zmc2V0Rm9yRmllbGQoZmllbGQtPkdldE5hbWUoKSwgdHJ1ZSk7Ci0KLSAgICBpZiAoc3RhcnRfZmllbGRfb2Zmc2V0LmVtcHR5KCkgJiYgZW5kX2ZpZWxkX29mZnNldC5lbXB0eSgpKSB7Ci0gICAgICBFUlJPUihmaWVsZCkgPDwgIkZpZWxkIGxvY2F0aW9uIGZvciAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIiBpcyBhbWJpZ3VvdXMsICIKLSAgICAgICAgICAgICAgICAgICA8PCAibm8gbWV0aG9kIGV4aXN0cyB0byBkZXRlcm1pbmUgZmllbGQgbG9jYXRpb24gZnJvbSBiZWdpbigpIG9yIGVuZCgpLlxuIjsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFNpemVGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgY29uc3QgYXV0byYgZmllbGRfbmFtZSA9ICgoU2l6ZUZpZWxkKilmaWVsZCktPkdldFNpemVkRmllbGROYW1lKCk7Ci0gICAgICBjb25zdCBhdXRvJiBzaXplZF9maWVsZCA9IGZpZWxkc18uR2V0RmllbGQoZmllbGRfbmFtZSk7Ci0gICAgICBpZiAoc2l6ZWRfZmllbGQgPT0gbnVsbHB0cikgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgX19mdW5jX18gPDwgIjogQ2FuJ3QgZmluZCBzaXplZCBmaWVsZCBuYW1lZCAiIDw8IGZpZWxkX25hbWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc2l6ZWRfZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICBzdGQ6OnN0cmluZyBtb2RpZmllciA9ICgoUGF5bG9hZEZpZWxkKilzaXplZF9maWVsZCktPnNpemVfbW9kaWZpZXJfOwotICAgICAgICBpZiAobW9kaWZpZXIgIT0gIiIpIHsKLSAgICAgICAgICBFUlJPUihmaWVsZCkgPDwgX19mdW5jX18gPDwgIjogc2l6ZSBtb2RpZmllcnMgbm90IGltcGxlbWVudGVkIHlldCBmb3IgIiA8PCBmaWVsZF9uYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA8PCAibGV0ICIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiID0gIiA8PCBmaWVsZC0+R2V0UnVzdERhdGFUeXBlKCkKLSAgICAgICAgICA8PCAiOjp0cnlfZnJvbShzZWxmLmNoaWxkLmdldF90b3RhbF9zaXplKCkpLmV4cGVjdChcInBheWxvYWQgc2l6ZSBkaWQgbm90IGZpdFwiKTsiOwotICAgICAgfSBlbHNlIGlmIChzaXplZF9maWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQm9keUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIHMgPDwgImxldCAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIiA9ICIgPDwgZmllbGQtPkdldFJ1c3REYXRhVHlwZSgpCi0gICAgICAgICAgPDwgIjo6dHJ5X2Zyb20oc2VsZi5nZXRfdG90YWxfc2l6ZSgpIC0gc2VsZi5nZXRfc2l6ZSgpKS5leHBlY3QoXCJwYXlsb2FkIHNpemUgZGlkIG5vdCBmaXRcIik7IjsKLSAgICAgIH0gZWxzZSBpZiAoc2l6ZWRfZmllbGQtPkdldEZpZWxkVHlwZSgpID09IFZlY3RvckZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIHZlY3Rvcl9uYW1lID0gZmllbGRfbmFtZSArICJfYnl0ZXMiOwotICAgICAgICBjb25zdCBWZWN0b3JGaWVsZCogdmVjdG9yID0gKFZlY3RvckZpZWxkKilzaXplZF9maWVsZDsKLSAgICAgICAgaWYgKHZlY3Rvci0+ZWxlbWVudF9zaXplXy5lbXB0eSgpIHx8IHZlY3Rvci0+ZWxlbWVudF9zaXplXy5oYXNfZHluYW1pYygpKSB7Ci0gICAgICAgICAgcyA8PCAibGV0ICIgPDwgdmVjdG9yX25hbWUgKyAiID0gc2VsZi4iIDw8IGZpZWxkX25hbWUKLSAgICAgICAgICAgIDw8ICIuaXRlcigpLmZvbGQoMCwgfGFjYywgeHwgYWNjICsgeC5nZXRfdG90YWxfc2l6ZSgpKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHMgPDwgImxldCAiIDw8IHZlY3Rvcl9uYW1lICsgIiA9IHNlbGYuIiA8PCBmaWVsZF9uYW1lIDw8ICIubGVuKCkgKiAoKCIgPDwgdmVjdG9yLT5lbGVtZW50X3NpemVfIDw8ICIpIC8gOCk7IjsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnN0cmluZyBtb2RpZmllciA9IHZlY3Rvci0+R2V0U2l6ZU1vZGlmaWVyKCk7Ci0gICAgICAgIGlmIChtb2RpZmllciAhPSAiIikgewotICAgICAgICAgIHMgPDwgImxldCAiIDw8IHZlY3Rvcl9uYW1lIDw8ICIgPSAiIDw8IHZlY3Rvcl9uYW1lIDw8ICIgKyAoIiA8PCBtb2RpZmllci5zdWJzdHIoMSkgPDwgIikgLyA4OyI7Ci0gICAgICAgIH0KLQotICAgICAgICBzIDw8ICJsZXQgIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICIgPSAiIDw8IGZpZWxkLT5HZXRSdXN0RGF0YVR5cGUoKSA8PCAiOjp0cnlfZnJvbSgiIDw8IHZlY3Rvcl9uYW1lCi0gICAgICAgICAgPDwgIikuZXhwZWN0KFwicGF5bG9hZCBzaXplIGRpZCBub3QgZml0XCIpOyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFUlJPUihmaWVsZCkgPDwgX19mdW5jX18gPDwgIjogVW5oYW5kbGVkIHNpemVkIGZpZWxkIHR5cGUgZm9yICIgPDwgZmllbGRfbmFtZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaWVsZC0+R2VuUnVzdFdyaXRlcihzLCBzdGFydF9maWVsZF9vZmZzZXQsIGVuZF9maWVsZF9vZmZzZXQpOwotICB9Ci19Ci0KLXZvaWQgUGFyZW50RGVmOjpHZW5TaXplUmV0VmFsKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBpbnQgc2l6ZSA9IDA7Ci0gIGF1dG8gZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICB9KTsKLSAgY29uc3QgUGFja2V0RmllbGQqIHBhZGRlZF9maWVsZCA9IG51bGxwdHI7Ci0gIGF1dG8gcGFkZGluZ19maWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhUeXBlcyh7Ci0gICAgICBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotICBpZiAocGFkZGluZ19maWVsZHMuc2l6ZSgpKSB7Ci0gICAgUGFja2V0RmllbGQqIGxhc3RfZmllbGQgPSBudWxscHRyOwotICAgIGZvciAoY29uc3QgYXV0byBmaWVsZCA6IGZpZWxkcykgewotICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBQYWRkaW5nRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgICAgcGFkZGVkX2ZpZWxkID0gbGFzdF9maWVsZDsKLSAgICAgIH0KLSAgICAgIGxhc3RfZmllbGQgPSBmaWVsZDsKLSAgICB9Ci0gIH0KLQotICBzIDw8ICJsZXQgcmV0ID0gMDsiOwotICBmb3IgKGNvbnN0IGF1dG8gZmllbGQgOiBmaWVsZHMpIHsKLSAgICBib29sIGlzX3ZlY3RvciA9IGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBWZWN0b3JGaWVsZDo6a0ZpZWxkVHlwZTsKLSAgICBpZiAoZmllbGQgIT0gcGFkZGVkX2ZpZWxkKSB7ICAvLyBTa2lwIHRoZSBzaXplIG9mIHBhZGRlZCBmaWVsZHMKLSAgICAgIGlmIChpc192ZWN0b3IpIHsKLSAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgaWYgKHNpemUgJSA4ICE9IDApIHsKLSAgICAgICAgICAgIEVSUk9SKCkgPDwgInNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCFcbiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIHMgPDwgImxldCByZXQgPSByZXQgKyAiIDw8IHNpemUgLyA4IDw8ICI7IjsKLSAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IFZlY3RvckZpZWxkKiB2ZWN0b3IgPSAoVmVjdG9yRmllbGQqKWZpZWxkOwotICAgICAgICBpZiAodmVjdG9yLT5lbGVtZW50X3NpemVfLmVtcHR5KCkgfHwgdmVjdG9yLT5lbGVtZW50X3NpemVfLmhhc19keW5hbWljKCkpIHsKLSAgICAgICAgICBzIDw8ICJsZXQgcmV0ID0gcmV0ICsgc2VsZi4iIDw8IHZlY3Rvci0+R2V0TmFtZSgpIDw8ICIuaXRlcigpLmZvbGQoMCwgfGFjYywgeHwgYWNjICsgeC5nZXRfdG90YWxfc2l6ZSgpKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHMgPDwgImxldCByZXQgPSByZXQgKyAoc2VsZi4iIDw8IHZlY3Rvci0+R2V0TmFtZSgpIDw8ICIubGVuKCkgKiAoKCIgPDwgdmVjdG9yLT5lbGVtZW50X3NpemVfIDw8ICIpIC8gOCkpOyI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemUgKz0gZmllbGQtPkdldFNpemUoKS5iaXRzKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIi8qIFNraXBwaW5nICIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiIHNpbmNlIGl0IGlzIHBhZGRlZCAqLyI7Ci0gICAgfQotICB9Ci0gIGlmIChzaXplID4gMCkgewotICAgIGlmIChzaXplICUgOCAhPSAwKSB7Ci0gICAgICBFUlJPUigpIDw8ICJzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIDghXG4iOwotICAgIH0KLSAgICBzIDw8ICJsZXQgcmV0ID0gcmV0ICsgIiA8PCBzaXplIC8gOCA8PCAiOyI7Ci0gIH0KLQotICBzIDw8ICJyZXQiOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9wYXJlbnRfZGVmLmggYi9nZC9wYWNrZXQvcGFyc2VyL3BhcmVudF9kZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxYjdmZi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3BhcmVudF9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dmFyaWFudD4KLQotI2luY2x1ZGUgImVudW1fZGVmLmgiCi0jaW5jbHVkZSAiZmllbGRfbGlzdC5oIgotI2luY2x1ZGUgImZpZWxkcy9hbGxfZmllbGRzLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0jaW5jbHVkZSAidHlwZV9kZWYuaCIKLQotY2xhc3MgUGFyZW50RGVmIDogcHVibGljIFR5cGVEZWYgewotIHB1YmxpYzoKLSAgUGFyZW50RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIEZpZWxkTGlzdCBmaWVsZHMpOwotICBQYXJlbnREZWYoc3RkOjpzdHJpbmcgbmFtZSwgRmllbGRMaXN0IGZpZWxkcywgUGFyZW50RGVmKiBwYXJlbnQpOwotCi0gIHZvaWQgQWRkUGFyZW50Q29uc3RyYWludChzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnZhcmlhbnQ8aW50NjRfdCwgc3RkOjpzdHJpbmc+IHZhbHVlKTsKLQotICB2b2lkIEFkZFRlc3RDYXNlKHN0ZDo6c3RyaW5nIHBhY2tldF9ieXRlcyk7Ci0KLSAgLy8gQXNzaWduIGFsbCBzaXplIGZpZWxkcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMuCi0gIC8vIFdpbGwgY3Jhc2ggaWYKLSAgLy8gIC0gdGhlcmUgYXJlbid0IGFueSBmaWVsZHMgdGhhdCBkb24ndCBtYXRjaCB1cCB0byBhIGZpZWxkLgotICAvLyAgLSB0aGUgc2l6ZSBmaWVsZCBwb2ludHMgdG8gYSBmaXhlZCBzaXplIGZpZWxkLgotICAvLyAgLSBpZiB0aGUgc2l6ZSBmaWVsZCBjb21lcyBhZnRlciB0aGUgdmFyaWFibGUgbGVuZ3RoIGZpZWxkLgotICB2b2lkIEFzc2lnblNpemVGaWVsZHMoKTsKLQotICB2b2lkIFNldEVuZGlhbm5lc3MoYm9vbCBpc19saXR0bGVfZW5kaWFuKTsKLQotICAvLyBHZXQgdGhlIHNpemUuIFlvdSBzY2FuIHNwZWNpZnkgd2l0aG91dF9wYXlsb2FkIHRvIGV4Y2x1ZGUgcGF5bG9hZCBhbmQgYm9keSBmaWVsZHMgYXMgY2hpbGRyZW4gb3ZlcnJpZGUgdGhlbS4KLSAgU2l6ZSBHZXRTaXplKGJvb2wgd2l0aG91dF9wYXlsb2FkID0gZmFsc2UpIGNvbnN0OwotCi0gIC8vIEdldCB0aGUgb2Zmc2V0IHVudGlsIHRoZSBmaWVsZCBpcyByZWFjaGVkLCBpZiB0aGVyZSBpcyBubyBmaWVsZAotICAvLyByZXR1cm5zIGFuIGVtcHR5IFNpemUuIGZyb21fZW5kIHJlcXVlc3RzIHRoZSBvZmZzZXQgdG8gdGhlIGZpZWxkCi0gIC8vIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCgpIGl0ZXJhdG9yLiBJZiB0aGVyZSBpcyBhIGZpZWxkIHdpdGggYW4gdW5rbm93bgotICAvLyBzaXplIGFsb25nIHRoZSB0cmF2ZXJzYWwsIHRoZW4gYW4gZW1wdHkgc2l6ZSBpcyByZXR1cm5lZC4KLSAgU2l6ZSBHZXRPZmZzZXRGb3JGaWVsZChzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBib29sIGZyb21fZW5kID0gZmFsc2UpIGNvbnN0OwotCi0gIEZpZWxkTGlzdCBHZXRQYXJhbUxpc3QoKSBjb25zdDsKLQotICB2b2lkIEdlbk1lbWJlcnMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblNpemUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblNlcmlhbGl6ZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuSW5zdGFuY2VPZihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIGNvbnN0IFBhcmVudERlZiogR2V0Um9vdERlZigpIGNvbnN0OwotCi0gIGJvb2wgSGFzQW5jZXN0b3JOYW1lZChzdGQ6OnN0cmluZyBuYW1lKSBjb25zdDsKLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2YXJpYW50PGludDY0X3QsIHN0ZDo6c3RyaW5nPj4gR2V0QWxsQ29uc3RyYWludHMoKSBjb25zdDsKLQotICBzdGQ6OnZlY3Rvcjxjb25zdCBQYXJlbnREZWYqPiBHZXRBbmNlc3RvcnMoKSBjb25zdDsKLQotICBzdGQ6OnN0cmluZyBGaW5kQ29uc3RyYWludEZpZWxkKCkgY29uc3Q7Ci0KLSAgc3RkOjptYXA8Y29uc3QgUGFyZW50RGVmKiwgY29uc3Qgc3RkOjp2YXJpYW50PGludDY0X3QsIHN0ZDo6c3RyaW5nPj4KLSAgICAgIEZpbmREZXNjZW5kYW50c1dpdGhDb25zdHJhaW50KHN0ZDo6c3RyaW5nIGNvbnN0cmFpbnRfbmFtZSkgY29uc3Q7Ci0gIHN0ZDo6dmVjdG9yPGNvbnN0IFBhcmVudERlZio+IEZpbmRQYXRoVG9EZXNjZW5kYW50KHN0ZDo6c3RyaW5nIGRlc2NlbmRhbnQpIGNvbnN0OwotCi0gIEZpZWxkTGlzdCBmaWVsZHNfOwotCi0gIFBhcmVudERlZiogcGFyZW50X3tudWxscHRyfTsKLQotICBQYXJlbnREZWYqIGNvbXBsZW1lbnRfe251bGxwdHJ9OwotCi0gIHN0ZDo6dmVjdG9yPFBhcmVudERlZio+IGNoaWxkcmVuXzsKLQotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGVzdF9jYXNlc187Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZhcmlhbnQ8aW50NjRfdCwgc3RkOjpzdHJpbmc+PiBwYXJlbnRfY29uc3RyYWludHNfOwotICBib29sIGlzX2xpdHRsZV9lbmRpYW5fOwotCi0gIGJvb2wgSGFzQ2hpbGRFbnVtcygpIGNvbnN0OwotCi0gIHZvaWQgR2VuUnVzdFdyaXRlVG9GaWVsZHMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblNpemVSZXRWYWwoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblJ1c3RDb25mb3JtYW5jZUNoZWNrKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9wYXJzZV9sb2NhdGlvbi5oIGIvZ2QvcGFja2V0L3BhcnNlci9wYXJzZV9sb2NhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJkYzcyLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvcGFyc2VfbG9jYXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1jbGFzcyBQYXJzZUxvY2F0aW9uIHsKLSBwdWJsaWM6Ci0gIFBhcnNlTG9jYXRpb24oKSA6IGxpbmVfKC0xKSB7fQotCi0gIFBhcnNlTG9jYXRpb24oaW50IGxpbmUpIDogbGluZV8obGluZSkge30KLQotICBpbnQgR2V0TGluZSgpIHsKLSAgICByZXR1cm4gbGluZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCBsaW5lXzsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3NpemUuaCBiL2dkL3BhY2tldC9wYXJzZXIvc2l6ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWQzYzUxLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvc2l6ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1jbGFzcyBTaXplIHsKLSBwdWJsaWM6Ci0gIFNpemUoKSB7fQotCi0gIFNpemUoaW50IGJpdHMpIHsKLSAgICBpc192YWxpZF8gPSB0cnVlOwotICAgIGJpdHNfID0gYml0czsKLSAgfQotCi0gIFNpemUoc3RkOjpzdHJpbmcgZHluYW1pYykgewotICAgIGlzX3ZhbGlkXyA9IHRydWU7Ci0gICAgZHluYW1pY18ucHVzaF9iYWNrKGR5bmFtaWMpOwotICB9Ci0KLSAgU2l6ZShpbnQgYml0cywgc3RkOjpzdHJpbmcgZHluYW1pYykgewotICAgIGlzX3ZhbGlkXyA9IHRydWU7Ci0gICAgYml0c18gPSBiaXRzOwotICAgIGR5bmFtaWNfLnB1c2hfYmFjayhkeW5hbWljKTsKLSAgfQotCi0gIFNpemUoY29uc3QgU2l6ZSYgc2l6ZSkgewotICAgIGlzX3ZhbGlkXyA9IHNpemUuaXNfdmFsaWRfOwotICAgIGJpdHNfID0gc2l6ZS5iaXRzXzsKLSAgICBkeW5hbWljXyA9IHNpemUuZHluYW1pY187Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBkeW5hbWljX3N0cmluZygpIGNvbnN0IHsKLSAgICBpZiAoZHluYW1pY18uZW1wdHkoKSkgcmV0dXJuICIwIjsKLQotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgICAvLyBQcmludCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBlbGVtZW50IHRoZW4gYXBwZW5kIGl0IG1hbnVhbGx5IHRvIGF2b2lkCi0gICAgLy8gdGhlIHRyYWlsaW5nICIrIiBvcGVyYXRvci4KLSAgICBzdGQ6OmNvcHkoZHluYW1pY18uYmVnaW4oKSwgZHluYW1pY18uZW5kKCkgLSAxLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+KHJlc3VsdCwgIiArICIpKTsKLSAgICByZXN1bHQgPDwgZHluYW1pY18uYmFjaygpOwotICAgIHJldHVybiByZXN1bHQuc3RyKCk7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZHluYW1pY19zdHJpbmdfbGlzdCgpIHsKLSAgICByZXR1cm4gZHluYW1pY187Ci0gIH0KLQotICBib29sIGVtcHR5KCkgY29uc3QgewotICAgIHJldHVybiAhaXNfdmFsaWRfOwotICB9Ci0KLSAgYm9vbCBoYXNfYml0cygpIGNvbnN0IHsKLSAgICByZXR1cm4gYml0c18gIT0gMDsKLSAgfQotCi0gIGJvb2wgaGFzX2R5bmFtaWMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFkeW5hbWljXy5lbXB0eSgpOwotICB9Ci0KLSAgaW50IGJpdHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJpdHNfOwotICB9Ci0KLSAgaW50IGJ5dGVzKCkgY29uc3QgewotICAgIC8vIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IGJ5dGUKLSAgICByZXR1cm4gKGJpdHNfICsgNykgLyA4OwotICB9Ci0KLSAgU2l6ZSBvcGVyYXRvcisoaW50IHJocykgewotICAgIHJldHVybiBTaXplKGJpdHNfICsgcmhzKTsKLSAgfQotCi0gIFNpemUgb3BlcmF0b3IrKHN0ZDo6c3RyaW5nIHJocykgewotICAgIGF1dG8gcmV0ID0gU2l6ZSgpOwotICAgIHJldC5pc192YWxpZF8gPSB0cnVlOwotICAgIHJldC5keW5hbWljXy5pbnNlcnQocmV0LmR5bmFtaWNfLmVuZCgpLCBkeW5hbWljXy5iZWdpbigpLCBkeW5hbWljXy5lbmQoKSk7Ci0gICAgcmV0LmR5bmFtaWNfLnB1c2hfYmFjayhyaHMpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBTaXplIG9wZXJhdG9yKyhjb25zdCBTaXplJiByaHMpIHsKLSAgICBhdXRvIHJldCA9IFNpemUoYml0c18gKyByaHMuYml0c18pOwotICAgIHJldC5pc192YWxpZF8gPSBpc192YWxpZF8gJiYgcmhzLmlzX3ZhbGlkXzsKLSAgICByZXQuZHluYW1pY18uaW5zZXJ0KHJldC5keW5hbWljXy5lbmQoKSwgZHluYW1pY18uYmVnaW4oKSwgZHluYW1pY18uZW5kKCkpOwotICAgIHJldC5keW5hbWljXy5pbnNlcnQocmV0LmR5bmFtaWNfLmVuZCgpLCByaHMuZHluYW1pY18uYmVnaW4oKSwgcmhzLmR5bmFtaWNfLmVuZCgpKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgU2l6ZSYgb3BlcmF0b3IrPShpbnQgcmhzKSB7Ci0gICAgaXNfdmFsaWRfID0gdHJ1ZTsKLSAgICBiaXRzXyArPSByaHM7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgU2l6ZSYgb3BlcmF0b3IrPShzdGQ6OnN0cmluZyByaHMpIHsKLSAgICBpc192YWxpZF8gPSB0cnVlOwotICAgIGR5bmFtaWNfLnB1c2hfYmFjayhyaHMpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFNpemUmIG9wZXJhdG9yKz0oY29uc3QgU2l6ZSYgcmhzKSB7Ci0gICAgaXNfdmFsaWRfID0gaXNfdmFsaWRfICYmIHJocy5pc192YWxpZF87Ci0gICAgYml0c18gKz0gcmhzLmJpdHNfOwotICAgIGR5bmFtaWNfLmluc2VydChkeW5hbWljXy5lbmQoKSwgcmhzLmR5bmFtaWNfLmJlZ2luKCksIHJocy5keW5hbWljXy5lbmQoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyOwotICAgIHN0ciA8PCAiLyogQml0czogKi8gIiA8PCBiaXRzXyA8PCAiICsgLyogRHluYW1pYzogKi8gIiA8PCBkeW5hbWljX3N0cmluZygpOwotICAgIGlmICghaXNfdmFsaWRfKSB7Ci0gICAgICBzdHIgPDwgIiAoaW52YWxpZCkgIjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ci5zdHIoKTsKLSAgfQotCi0gIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgU2l6ZSYgcmhzKSB7Ci0gICAgcmV0dXJuIG9zIDw8IHJocy5Ub1N0cmluZygpOwotICB9Ci0KLSBwcml2YXRlOgotICBib29sIGlzX3ZhbGlkXyA9IGZhbHNlOwotICBpbnQgYml0c18gPSAwOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZHluYW1pY187Ci19OwpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9zdHJ1Y3RfZGVmLmNjIGIvZ2QvcGFja2V0L3BhcnNlci9zdHJ1Y3RfZGVmLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAyZTI1Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvc3RydWN0X2RlZi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RydWN0X2RlZi5oIgotCi0jaW5jbHVkZSAiZmllbGRzL2FsbF9maWVsZHMuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLVN0cnVjdERlZjo6U3RydWN0RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIEZpZWxkTGlzdCBmaWVsZHMpIDogU3RydWN0RGVmKG5hbWUsIGZpZWxkcywgbnVsbHB0cikge30KLVN0cnVjdERlZjo6U3RydWN0RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIEZpZWxkTGlzdCBmaWVsZHMsIFN0cnVjdERlZiogcGFyZW50KQotICAgIDogUGFyZW50RGVmKG5hbWUsIGZpZWxkcywgcGFyZW50KSwgdG90YWxfc2l6ZV8oR2V0U2l6ZSh0cnVlKSkge30KLQotUGFja2V0RmllbGQqIFN0cnVjdERlZjo6R2V0TmV3RmllbGQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFBhcnNlTG9jYXRpb24gbG9jKSBjb25zdCB7Ci0gIGlmIChmaWVsZHNfLkhhc0JvZHkoKSkgewotICAgIHJldHVybiBuZXcgVmFyaWFibGVMZW5ndGhTdHJ1Y3RGaWVsZChuYW1lLCBuYW1lXywgbG9jKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbmV3IFN0cnVjdEZpZWxkKG5hbWUsIG5hbWVfLCB0b3RhbF9zaXplXywgbG9jKTsKLSAgfQotfQotCi1UeXBlRGVmOjpUeXBlIFN0cnVjdERlZjo6R2V0RGVmaW5pdGlvblR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBUeXBlRGVmOjpUeXBlOjpTVFJVQ1Q7Ci19Ci0KLXZvaWQgU3RydWN0RGVmOjpHZW5TcGVjaWFsaXplKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBpZiAocGFyZW50XyA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHMgPDwgInN0YXRpYyAiIDw8IG5hbWVfIDw8ICIqIFNwZWNpYWxpemUoIiA8PCBwYXJlbnRfLT5uYW1lXyA8PCAiKiBwYXJlbnQpIHsiOwotICBzIDw8ICJBU1NFUlQoIiA8PCBuYW1lXyA8PCAiOjpJc0luc3RhbmNlKCpwYXJlbnQpKTsiOwotICBzIDw8ICJyZXR1cm4gc3RhdGljX2Nhc3Q8IiA8PCBuYW1lXyA8PCAiKj4ocGFyZW50KTsiOwotICBzIDw8ICJ9IjsKLX0KLQotdm9pZCBTdHJ1Y3REZWY6OkdlblRvU3RyaW5nKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJzdGQ6OnN0cmluZyBUb1N0cmluZygpIHsiOwotICBzIDw8ICJzdGQ6OnN0cmluZ3N0cmVhbSBzczsiOwotICBzIDw8ICJzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNob3diYXNlIDw8IFwiIiA8PCBuYW1lXyA8PCAiIHsgXCI7IjsKLQotICBpZiAoZmllbGRzXy5zaXplKCkgPiAwKSB7Ci0gICAgcyA8PCAic3MiOwotICAgIGJvb2wgZmlyc3RmaWVsZCA9IHRydWU7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gUmVzZXJ2ZWRGaWVsZDo6a0ZpZWxkVHlwZSB8fAotICAgICAgICAgIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBDaGVja3N1bVN0YXJ0RmllbGQ6OmtGaWVsZFR5cGUgfHwKLSAgICAgICAgICBmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRml4ZWRTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSB8fCBmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSB8fAotICAgICAgICAgIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBTaXplRmllbGQ6OmtGaWVsZFR5cGUpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBzIDw8IChmaXJzdGZpZWxkID8gIiA8PCBcIiIgOiAiIDw8IFwiLCAiKSA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICIgPSBcIiA8PCAiOwotCi0gICAgICBmaWVsZC0+R2VuU3RyaW5nUmVwcmVzZW50YXRpb24ocywgZmllbGQtPkdldE5hbWUoKSArICJfIik7Ci0KLSAgICAgIGlmIChmaXJzdGZpZWxkKSB7Ci0gICAgICAgIGZpcnN0ZmllbGQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcyA8PCAiOyI7Ci0gIH0KLQotICBzIDw8ICJzcyA8PCBcIiB9XCI7IjsKLSAgcyA8PCAicmV0dXJuIHNzLnN0cigpOyI7Ci0gIHMgPDwgIn1cbiI7Ci19Ci0KLXZvaWQgU3RydWN0RGVmOjpHZW5QYXJzZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgaXRlcmF0b3IgPSAoaXNfbGl0dGxlX2VuZGlhbl8gPyAiSXRlcmF0b3I8a0xpdHRsZUVuZGlhbj4iIDogIkl0ZXJhdG9yPCFrTGl0dGxlRW5kaWFuPiIpOwotCi0gIGlmIChmaWVsZHNfLkhhc0JvZHkoKSkgewotICAgIHMgPDwgInN0YXRpYyBzdGQ6Om9wdGlvbmFsPCIgPDwgaXRlcmF0b3IgPDwgIj4iOwotICB9IGVsc2UgewotICAgIHMgPDwgInN0YXRpYyAiIDw8IGl0ZXJhdG9yOwotICB9Ci0KLSAgcyA8PCAiIFBhcnNlKCIgPDwgbmFtZV8gPDwgIiogdG9fZmlsbCwgIiA8PCBpdGVyYXRvciA8PCAiIHN0cnVjdF9iZWdpbl9pdCAiOwotCi0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBzIDw8ICIsIGJvb2wgZmlsbF9wYXJlbnQgPSB0cnVlKSB7IjsKLSAgfSBlbHNlIHsKLSAgICBzIDw8ICIpIHsiOwotICB9Ci0gIHMgPDwgImF1dG8gdG9fYm91bmQgPSBzdHJ1Y3RfYmVnaW5faXQ7IjsKLQotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiaWYgKGZpbGxfcGFyZW50KSB7IjsKLSAgICBzdGQ6OnN0cmluZyBwYXJlbnRfcGFyYW0gPSAocGFyZW50Xy0+cGFyZW50XyA9PSBudWxscHRyID8gIiIgOiAiLCB0cnVlIik7Ci0gICAgaWYgKHBhcmVudF8tPmZpZWxkc18uSGFzQm9keSgpKSB7Ci0gICAgICBzIDw8ICJhdXRvIHBhcmVudF9vcHRpb25hbF9pdCA9ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIjo6UGFyc2UodG9fZmlsbCwgdG9fYm91bmQiIDw8IHBhcmVudF9wYXJhbSA8PCAiKTsiOwotICAgICAgaWYgKGZpZWxkc18uSGFzQm9keSgpKSB7Ci0gICAgICAgIHMgPDwgImlmICghcGFyZW50X29wdGlvbmFsX2l0KSB7IHJldHVybiB7fTsgfSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzIDw8ICJBU1NFUlQocGFyZW50X29wdGlvbmFsX2l0KTsiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBzIDw8IHBhcmVudF8tPm5hbWVfIDw8ICI6OlBhcnNlKHRvX2ZpbGwsIHRvX2JvdW5kIiA8PCBwYXJlbnRfcGFyYW0gPDwgIik7IjsKLSAgICB9Ci0gICAgcyA8PCAifSI7Ci0gIH0KLQotICBpZiAoIWZpZWxkc18uSGFzQm9keSgpKSB7Ci0gICAgcyA8PCAic2l6ZV90IGVuZF9pbmRleCA9IHN0cnVjdF9iZWdpbl9pdC5OdW1CeXRlc1JlbWFpbmluZygpOyI7Ci0gICAgcyA8PCAiaWYgKGVuZF9pbmRleCA8ICIgPDwgR2V0U2l6ZSgpLmJ5dGVzKCkgPDwgIikiOwotICAgIHMgPDwgInsgcmV0dXJuIHN0cnVjdF9iZWdpbl9pdC5TdWJyYW5nZSgwLDApO30iOwotICB9Ci0KLSAgU2l6ZSB0b3RhbF9iaXRzezB9OwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzXykgewotICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gUmVzZXJ2ZWRGaWVsZDo6a0ZpZWxkVHlwZSAmJiBmaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gQm9keUZpZWxkOjprRmllbGRUeXBlICYmCi0gICAgICAgIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGaXhlZFNjYWxhckZpZWxkOjprRmllbGRUeXBlICYmCi0gICAgICAgIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBDaGVja3N1bVN0YXJ0RmllbGQ6OmtGaWVsZFR5cGUgJiYgZmllbGQtPkdldEZpZWxkVHlwZSgpICE9IENoZWNrc3VtRmllbGQ6OmtGaWVsZFR5cGUgJiYKLSAgICAgICAgZmllbGQtPkdldEZpZWxkVHlwZSgpICE9IENvdW50RmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIHRvdGFsX2JpdHMgKz0gZmllbGQtPkdldFNpemUoKS5iaXRzKCk7Ci0gICAgfQotICB9Ci0gIHMgPDwgInsiOwotICBzIDw8ICJpZiAodG9fYm91bmQuTnVtQnl0ZXNSZW1haW5pbmcoKSA8ICIgPDwgdG90YWxfYml0cy5ieXRlcygpIDw8ICIpIjsKLSAgaWYgKCFmaWVsZHNfLkhhc0JvZHkoKSkgewotICAgIHMgPDwgInsgcmV0dXJuIHRvX2JvdW5kLlN1YnJhbmdlKHRvX2JvdW5kLk51bUJ5dGVzUmVtYWluaW5nKCksMCk7fSI7Ci0gIH0gZWxzZSB7Ci0gICAgcyA8PCAieyByZXR1cm4ge307fSI7Ci0gIH0KLSAgcyA8PCAifSI7Ci0gIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZHNfKSB7Ci0gICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBSZXNlcnZlZEZpZWxkOjprRmllbGRUeXBlICYmIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBCb2R5RmllbGQ6OmtGaWVsZFR5cGUgJiYKLSAgICAgICAgZmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUgJiYgZmllbGQtPkdldEZpZWxkVHlwZSgpICE9IFNpemVGaWVsZDo6a0ZpZWxkVHlwZSAmJgotICAgICAgICBmaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gQ2hlY2tzdW1TdGFydEZpZWxkOjprRmllbGRUeXBlICYmIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBDaGVja3N1bUZpZWxkOjprRmllbGRUeXBlICYmCi0gICAgICAgIGZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBDb3VudEZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBzIDw8ICJ7IjsKLSAgICAgIGludCBudW1fbGVhZGluZ19iaXRzID0KLSAgICAgICAgICBmaWVsZC0+R2VuQm91bmRzKHMsIEdldFN0cnVjdE9mZnNldEZvckZpZWxkKGZpZWxkLT5HZXROYW1lKCkpLCBTaXplKCksIGZpZWxkLT5HZXRTdHJ1Y3RTaXplKCkpOwotICAgICAgcyA8PCAiYXV0byAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl9wdHIgPSAmdG9fZmlsbC0+IiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfOyI7Ci0gICAgICBmaWVsZC0+R2VuRXh0cmFjdG9yKHMsIG51bV9sZWFkaW5nX2JpdHMsIHRydWUpOwotICAgICAgcyA8PCAifSI7Ci0gICAgfQotICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSB8fCBmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gU2l6ZUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBzIDw8ICJ7IjsKLSAgICAgIGludCBudW1fbGVhZGluZ19iaXRzID0KLSAgICAgICAgICBmaWVsZC0+R2VuQm91bmRzKHMsIEdldFN0cnVjdE9mZnNldEZvckZpZWxkKGZpZWxkLT5HZXROYW1lKCkpLCBTaXplKCksIGZpZWxkLT5HZXRTdHJ1Y3RTaXplKCkpOwotICAgICAgcyA8PCAiYXV0byAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl9wdHIgPSAmdG9fZmlsbC0+IiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfZXh0cmFjdGVkXzsiOwotICAgICAgZmllbGQtPkdlbkV4dHJhY3RvcihzLCBudW1fbGVhZGluZ19iaXRzLCB0cnVlKTsKLSAgICAgIHMgPDwgIn0iOwotICAgIH0KLSAgfQotICBzIDw8ICJyZXR1cm4gc3RydWN0X2JlZ2luX2l0ICsgdG9fZmlsbC0+c2l6ZSgpOyI7Ci0gIHMgPDwgIn0iOwotfQotCi12b2lkIFN0cnVjdERlZjo6R2VuUGFyc2VGdW5jdGlvblByb3RvdHlwZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAic3RkOjp1bmlxdWVfcHRyPCIgPDwgbmFtZV8gPDwgIj4gUGFyc2UiIDw8IG5hbWVfIDw8ICIoIjsKLSAgaWYgKGlzX2xpdHRsZV9lbmRpYW5fKSB7Ci0gICAgcyA8PCAiSXRlcmF0b3I8a0xpdHRsZUVuZGlhbj4iOwotICB9IGVsc2UgewotICAgIHMgPDwgIkl0ZXJhdG9yPCFrTGl0dGxlRW5kaWFuPiI7Ci0gIH0KLSAgcyA8PCAiaXQpOyI7Ci19Ci0KLXZvaWQgU3RydWN0RGVmOjpHZW5EZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJjbGFzcyAiIDw8IG5hbWVfOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCAiIDogcHVibGljICIgPDwgcGFyZW50Xy0+bmFtZV87Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGlzX2xpdHRsZV9lbmRpYW5fKSB7Ci0gICAgICBzIDw8ICIgOiBwdWJsaWMgUGFja2V0U3RydWN0PGtMaXR0bGVFbmRpYW4+IjsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCAiIDogcHVibGljIFBhY2tldFN0cnVjdDwha0xpdHRsZUVuZGlhbj4iOwotICAgIH0KLSAgfQotICBzIDw8ICIgeyI7Ci0gIHMgPDwgIiBwdWJsaWM6IjsKLQotICBHZW5Db25zdHJ1Y3RvcihzKTsKLQotICBzIDw8ICIgcHVibGljOlxuIjsKLSAgcyA8PCAiICB2aXJ0dWFsIH4iIDw8IG5hbWVfIDw8ICIoKSA9IGRlZmF1bHQ7XG4iOwotCi0gIEdlblNlcmlhbGl6ZShzKTsKLSAgcyA8PCAiXG4iOwotCi0gIEdlblBhcnNlKHMpOwotICBzIDw8ICJcbiI7Ci0KLSAgR2VuU2l6ZShzKTsKLSAgcyA8PCAiXG4iOwotCi0gIEdlbkluc3RhbmNlT2Yocyk7Ci0gIHMgPDwgIlxuIjsKLQotICBHZW5TcGVjaWFsaXplKHMpOwotICBzIDw8ICJcbiI7Ci0KLSAgR2VuVG9TdHJpbmcocyk7Ci0gIHMgPDwgIlxuIjsKLQotICBHZW5NZW1iZXJzKHMpOwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzXykgewotICAgIGlmIChmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSB8fCBmaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gU2l6ZUZpZWxkOjprRmllbGRUeXBlKSB7Ci0gICAgICBzIDw8ICJcbiBwcml2YXRlOlxuIjsKLSAgICAgIHMgPDwgIiBtdXRhYmxlICIgPDwgZmllbGQtPkdldERhdGFUeXBlKCkgPDwgIiAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl9leHRyYWN0ZWRfezB9OyI7Ci0gICAgfQotICB9Ci0gIHMgPDwgIn07XG4iOwotCi0gIGlmIChmaWVsZHNfLkhhc0JvZHkoKSkgewotICAgIEdlblBhcnNlRnVuY3Rpb25Qcm90b3R5cGUocyk7Ci0gIH0KLSAgcyA8PCAiXG4iOwotfQotCi12b2lkIFN0cnVjdERlZjo6R2VuRGVmaW5pdGlvblB5YmluZDExKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBzIDw8ICJweTo6Y2xhc3NfPCIgPDwgbmFtZV87Ci0gIGlmIChwYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICBzIDw8ICIsICIgPDwgcGFyZW50Xy0+bmFtZV87Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGlzX2xpdHRsZV9lbmRpYW5fKSB7Ci0gICAgICBzIDw8ICIsIFBhY2tldFN0cnVjdDxrTGl0dGxlRW5kaWFuPiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIiwgUGFja2V0U3RydWN0PCFrTGl0dGxlRW5kaWFuPiI7Ci0gICAgfQotICB9Ci0gIHMgPDwgIiwgc3RkOjpzaGFyZWRfcHRyPCIgPDwgbmFtZV8gPDwgIj4iOwotICBzIDw8ICI+KG0sIFwiIiA8PCBuYW1lXyA8PCAiXCIpIjsKLSAgcyA8PCAiLmRlZihweTo6aW5pdDw+KCkpIjsKLSAgcyA8PCAiLmRlZihcIlNlcmlhbGl6ZVwiLCBbXSgiIDw8IEdldFR5cGVOYW1lKCkgPDwgIiYgb2JqKXsiOwotICBzIDw8ICJzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlczsiOwotICBzIDw8ICJCaXRJbnNlcnRlciBiaShieXRlcyk7IjsKLSAgcyA8PCAib2JqLlNlcmlhbGl6ZShiaSk7IjsKLSAgcyA8PCAicmV0dXJuIGJ5dGVzO30pIjsKLSAgcyA8PCAiLmRlZihcIlBhcnNlXCIsICYiIDw8IG5hbWVfIDw8ICI6OlBhcnNlKSI7Ci0gIHMgPDwgIi5kZWYoXCJzaXplXCIsICYiIDw8IG5hbWVfIDw8ICI6OnNpemUpIjsKLSAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IGZpZWxkc18pIHsKLSAgICBpZiAoZmllbGQtPkdldEJ1aWxkZXJQYXJhbWV0ZXJUeXBlKCkuZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHMgPDwgIi5kZWZfcmVhZHdyaXRlKFwiIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJcIiwgJiIgPDwgbmFtZV8gPDwgIjo6IiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfKSI7Ci0gIH0KLSAgcyA8PCAiO1xuIjsKLX0KLQotdm9pZCBTdHJ1Y3REZWY6OkdlbkNvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgewotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcyA8PCBuYW1lXyA8PCAiKGNvbnN0ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIiYgcGFyZW50KSA6ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIihwYXJlbnQpIHt9IjsKLSAgICBzIDw8IG5hbWVfIDw8ICIoKSA6ICIgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIigpIHsiOwotICB9IGVsc2UgewotICAgIHMgPDwgbmFtZV8gPDwgIigpIHsiOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBsaXN0IG9mIHBhcmVudCBwYXJhbXMuCi0gIEZpZWxkTGlzdCBwYXJlbnRfcGFyYW1zOwotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgcGFyZW50X3BhcmFtcyA9IHBhcmVudF8tPkdldFBhcmFtTGlzdCgpLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICAgIFBheWxvYWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgIH0pOwotCi0gICAgLy8gU2V0IGNvbnN0cmFpbmVkIHBhcmVudCBmaWVsZHMgdG8gdGhlaXIgY29ycmVjdCB2YWx1ZXMuCi0gICAgZm9yIChjb25zdCBhdXRvJiBmaWVsZCA6IHBhcmVudF9wYXJhbXMpIHsKLSAgICAgIGNvbnN0IGF1dG8mIGNvbnN0cmFpbnQgPSBwYXJlbnRfY29uc3RyYWludHNfLmZpbmQoZmllbGQtPkdldE5hbWUoKSk7Ci0gICAgICBpZiAoY29uc3RyYWludCAhPSBwYXJlbnRfY29uc3RyYWludHNfLmVuZCgpKSB7Ci0gICAgICAgIHMgPDwgcGFyZW50Xy0+bmFtZV8gPDwgIjo6IiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfID0gIjsKLSAgICAgICAgaWYgKGZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBTY2FsYXJGaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgIHMgPDwgc3RkOjpnZXQ8aW50NjRfdD4oY29uc3RyYWludC0+c2Vjb25kKSA8PCAiOyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEVudW1GaWVsZDo6a0ZpZWxkVHlwZSkgewotICAgICAgICAgIHMgPDwgc3RkOjpnZXQ8c3RkOjpzdHJpbmc+KGNvbnN0cmFpbnQtPnNlY29uZCkgPDwgIjsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEVSUk9SKGZpZWxkKSA8PCAiQ29uc3RyYWludHMgb24gbm9uIGVudW0vc2NhbGFyIGZpZWxkcyBzaG91bGQgYmUgaW1wb3NzaWJsZS4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcyA8PCAifVxuIjsKLX0KLQotU2l6ZSBTdHJ1Y3REZWY6OkdldFN0cnVjdE9mZnNldEZvckZpZWxkKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIGNvbnN0IHsKLSAgYXV0byBzaXplID0gU2l6ZSgwKTsKLSAgZm9yIChhdXRvIGl0ID0gZmllbGRzXy5iZWdpbigpOyBpdCAhPSBmaWVsZHNfLmVuZCgpOyBpdCsrKSB7Ci0gICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZmllbGQsIGVuZCB0aGUgbG9vcC4KLSAgICBpZiAoKCppdCktPkdldE5hbWUoKSA9PSBmaWVsZF9uYW1lKSBicmVhazsKLSAgICBjb25zdCBhdXRvJiBmaWVsZCA9ICppdDsKLSAgICAvLyBXaGVuIHdlIG5lZWQgdG8gcGFyc2UgdGhpcyBmaWVsZCwgYWxsIHByZXZpb3VzIGZpZWxkcyBzaG91bGQgYWxyZWFkeSBiZSBwYXJzZWQuCi0gICAgaWYgKGZpZWxkLT5HZXRTdHJ1Y3RTaXplKCkuZW1wdHkoKSkgewotICAgICAgRVJST1IoKSA8PCAiRW1wdHkgc2l6ZSBmb3IgZmllbGQgIiA8PCAoKml0KS0+R2V0TmFtZSgpIDw8ICIgZmluZGluZyB0aGUgb2Zmc2V0IGZvciBmaWVsZDogIiA8PCBmaWVsZF9uYW1lOwotICAgIH0KLSAgICBzaXplICs9IGZpZWxkLT5HZXRTdHJ1Y3RTaXplKCk7Ci0gIH0KLQotICAvLyBXZSBuZWVkIHRoZSBvZmZzZXQgdW50aWwgYSBib2R5IGZpZWxkLgotICBpZiAocGFyZW50XyAhPSBudWxscHRyKSB7Ci0gICAgYXV0byBwYXJlbnRfYm9keV9vZmZzZXQgPSBzdGF0aWNfY2FzdDxTdHJ1Y3REZWYqPihwYXJlbnRfKS0+R2V0U3RydWN0T2Zmc2V0Rm9yRmllbGQoImJvZHkiKTsKLSAgICBpZiAocGFyZW50X2JvZHlfb2Zmc2V0LmVtcHR5KCkpIHsKLSAgICAgIEVSUk9SKCkgPDwgIkVtcHR5IG9mZnNldCBmb3IgYm9keSBpbiAiIDw8IHBhcmVudF8tPm5hbWVfIDw8ICIgZmluZGluZyB0aGUgb2Zmc2V0IGZvciBmaWVsZDogIiA8PCBmaWVsZF9uYW1lOwotICAgIH0KLSAgICBzaXplICs9IHBhcmVudF9ib2R5X29mZnNldDsKLSAgfQotCi0gIHJldHVybiBzaXplOwotfQotCi12b2lkIFN0cnVjdERlZjo6R2VuUnVzdEZpZWxkTmFtZUFuZFR5cGUoc3RkOjpvc3RyZWFtJiBzLCBib29sIGluY2x1ZGVfZml4ZWQpIGNvbnN0IHsKLSAgYXV0byBmaWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICBCb2R5RmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBDb3VudEZpZWxkOjprRmllbGRUeXBlLAotICAgICAgUGFkZGluZ0ZpZWxkOjprRmllbGRUeXBlLAotICAgICAgUmVzZXJ2ZWRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFNpemVGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgfSk7Ci0gIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZHMpIHsKLSAgICBpZiAoIWluY2x1ZGVfZml4ZWQgJiYgZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmaWVsZC0+R2VuUnVzdE5hbWVBbmRUeXBlKHMpOwotICAgIHMgPDwgIiwgIjsKLSAgfQotfQotCi12b2lkIFN0cnVjdERlZjo6R2VuUnVzdEZpZWxkTmFtZXMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGF1dG8gZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgcyA8PCBmaWVsZC0+R2V0TmFtZSgpOwotICAgIHMgPDwgIiwgIjsKLSAgfQotfQotCi12b2lkIFN0cnVjdERlZjo6R2VuUnVzdERlY2xhcmF0aW9ucyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiI1tkZXJpdmUoRGVidWcsIENsb25lKV0gIjsKLSAgcyA8PCAicHViIHN0cnVjdCAiIDw8IG5hbWVfIDw8ICJ7IjsKLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3QgZmllbGRzCi0gIGF1dG8gZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotICBmb3IgKGNvbnN0IGF1dG8mIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgcyA8PCAicHViICI7Ci0gICAgZmllbGQtPkdlblJ1c3ROYW1lQW5kVHlwZShzKTsKLSAgICBzIDw8ICIsICI7Ci0gIH0KLSAgcyA8PCAifVxuIjsKLX0KLQotdm9pZCBTdHJ1Y3REZWY6OkdlblJ1c3RJbXBscyhzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgcyA8PCAiaW1wbCAiIDw8IG5hbWVfIDw8ICJ7IjsKLQotICBzIDw8ICJmbiBjb25mb3JtcyhieXRlczogJlt1OF0pIC0+IGJvb2wgeyI7Ci0gIEdlblJ1c3RDb25mb3JtYW5jZUNoZWNrKHMpOwotICBzIDw8ICIgdHJ1ZSI7Ci0gIHMgPDwgIn0iOwotCi0gIHMgPDwgInB1YiBmbiBwYXJzZShieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmPiB7IjsKLSAgYXV0byBmaWVsZHMgPSBmaWVsZHNfLkdldEZpZWxkc1dpdGhvdXRUeXBlcyh7Ci0gICAgICBCb2R5RmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotCi0gIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZHMpIHsKLSAgICBhdXRvIHN0YXJ0X2ZpZWxkX29mZnNldCA9IEdldE9mZnNldEZvckZpZWxkKGZpZWxkLT5HZXROYW1lKCksIGZhbHNlKTsKLSAgICBhdXRvIGVuZF9maWVsZF9vZmZzZXQgPSBHZXRPZmZzZXRGb3JGaWVsZChmaWVsZC0+R2V0TmFtZSgpLCB0cnVlKTsKLQotICAgIGlmIChzdGFydF9maWVsZF9vZmZzZXQuZW1wdHkoKSAmJiBlbmRfZmllbGRfb2Zmc2V0LmVtcHR5KCkpIHsKLSAgICAgIEVSUk9SKGZpZWxkKSA8PCAiRmllbGQgbG9jYXRpb24gZm9yICIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiIGlzIGFtYmlndW91cywgIgotICAgICAgICAgICAgICAgICAgIDw8ICJubyBtZXRob2QgZXhpc3RzIHRvIGRldGVybWluZSBmaWVsZCBsb2NhdGlvbiBmcm9tIGJlZ2luKCkgb3IgZW5kKCkuXG4iOwotICAgIH0KLQotICAgIGZpZWxkLT5HZW5Cb3VuZHNDaGVjayhzLCBzdGFydF9maWVsZF9vZmZzZXQsIGVuZF9maWVsZF9vZmZzZXQsIG5hbWVfKTsKLSAgICBmaWVsZC0+R2VuUnVzdEdldHRlcihzLCBzdGFydF9maWVsZF9vZmZzZXQsIGVuZF9maWVsZF9vZmZzZXQpOwotICB9Ci0KLSAgZmllbGRzID0gZmllbGRzXy5HZXRGaWVsZHNXaXRob3V0VHlwZXMoewotICAgICAgQm9keUZpZWxkOjprRmllbGRUeXBlLAotICAgICAgQ291bnRGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFBhZGRpbmdGaWVsZDo6a0ZpZWxkVHlwZSwKLSAgICAgIFJlc2VydmVkRmllbGQ6OmtGaWVsZFR5cGUsCi0gICAgICBTaXplRmllbGQ6OmtGaWVsZFR5cGUsCi0gIH0pOwotCi0gIHMgPDwgIk9rKFNlbGYgeyI7Ci0gIGZvciAoY29uc3QgYXV0byYgZmllbGQgOiBmaWVsZHMpIHsKLSAgICBpZiAoZmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZpeGVkU2NhbGFyRmllbGQ6OmtGaWVsZFR5cGUpIHsKLSAgICAgIHMgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiOiAiOwotICAgICAgc3RhdGljX2Nhc3Q8Rml4ZWRTY2FsYXJGaWVsZCo+KGZpZWxkKS0+R2VuVmFsdWUocyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgZmllbGQtPkdldE5hbWUoKTsKLSAgICB9Ci0gICAgcyA8PCAiLCAiOwotICB9Ci0gIHMgPDwgIn0pfVxuIjsKLQotICAvLyB3cml0ZV90byBmdW5jdGlvbgotICBzIDw8ICJmbiB3cml0ZV90bygmc2VsZiwgYnVmZmVyOiAmbXV0IFt1OF0pIHsiOwotICBHZW5SdXN0V3JpdGVUb0ZpZWxkcyhzKTsKLSAgcyA8PCAifVxuIjsKLQotICBzIDw8ICJmbiBnZXRfdG90YWxfc2l6ZSgmc2VsZikgLT4gdXNpemUgeyI7Ci0gIEdlblNpemVSZXRWYWwocyk7Ci0gIHMgPDwgIn0iOwotICBzIDw8ICJ9XG4iOwotfQotCi12b2lkIFN0cnVjdERlZjo6R2VuUnVzdERlZihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsKLSAgR2VuUnVzdERlY2xhcmF0aW9ucyhzKTsKLSAgR2VuUnVzdEltcGxzKHMpOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci9zdHJ1Y3RfZGVmLmggYi9nZC9wYWNrZXQvcGFyc2VyL3N0cnVjdF9kZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwOGQyYi4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3N0cnVjdF9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZhcmlhbnQ+Ci0KLSNpbmNsdWRlICJmaWVsZF9saXN0LmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcmVudF9kZWYuaCIKLSNpbmNsdWRlICJwYXJzZV9sb2NhdGlvbi5oIgotI2luY2x1ZGUgInR5cGVfZGVmLmgiCi0KLWNsYXNzIFN0cnVjdERlZiA6IHB1YmxpYyBQYXJlbnREZWYgewotIHB1YmxpYzoKLSAgU3RydWN0RGVmKHN0ZDo6c3RyaW5nIG5hbWUsIEZpZWxkTGlzdCBmaWVsZHMpOwotICBTdHJ1Y3REZWYoc3RkOjpzdHJpbmcgbmFtZSwgRmllbGRMaXN0IGZpZWxkcywgU3RydWN0RGVmKiBwYXJlbnQpOwotCi0gIFBhY2tldEZpZWxkKiBHZXROZXdGaWVsZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgUGFyc2VMb2NhdGlvbiBsb2MpIGNvbnN0OwotCi0gIFR5cGVEZWY6OlR5cGUgR2V0RGVmaW5pdGlvblR5cGUoKSBjb25zdDsKLQotICB2b2lkIEdlblNwZWNpYWxpemUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblRvU3RyaW5nKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5QYXJzZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuUGFyc2VGdW5jdGlvblByb3RvdHlwZShzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuRGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIHZvaWQgR2VuRGVmaW5pdGlvblB5YmluZDExKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5Db25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0OwotCi0gIFNpemUgR2V0U3RydWN0T2Zmc2V0Rm9yRmllbGQoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgY29uc3Q7Ci0KLSAgdm9pZCBHZW5SdXN0RGVjbGFyYXRpb25zKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5SdXN0SW1wbHMoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotICB2b2lkIEdlblJ1c3RGaWVsZE5hbWVBbmRUeXBlKHN0ZDo6b3N0cmVhbSYgcywgYm9vbCBpbmNsdWRlX2ZpeGVkKSBjb25zdDsKLQotICB2b2lkIEdlblJ1c3RGaWVsZE5hbWVzKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSAgdm9pZCBHZW5SdXN0RGVmKHN0ZDo6b3N0cmVhbSYgcykgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBTaXplIHRvdGFsX3NpemVfOwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvc3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL3N0cnVjdF9wYXJzZXJfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FmNjc5Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvc3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuaCIKLQotU3RydWN0UGFyc2VyR2VuZXJhdG9yOjpTdHJ1Y3RQYXJzZXJHZW5lcmF0b3IoY29uc3QgRGVjbGFyYXRpb25zJiBkZWNscykgewotICBpc19saXR0bGVfZW5kaWFuID0gZGVjbHMuaXNfbGl0dGxlX2VuZGlhbjsKLSAgZm9yIChjb25zdCBhdXRvJiBzIDogZGVjbHMudHlwZV9kZWZzX3F1ZXVlXykgewotICAgIGlmIChzLnNlY29uZC0+R2V0RGVmaW5pdGlvblR5cGUoKSA9PSBUeXBlRGVmOjpUeXBlOjpTVFJVQ1QpIHsKLSAgICAgIGNvbnN0IGF1dG8qIHN0cnVjdF9kZWYgPSBzdGF0aWNfY2FzdDxjb25zdCBTdHJ1Y3REZWYqPihzLnNlY29uZCk7Ci0gICAgICB2YXJpYWJsZV9zdHJ1Y3RfZmllbGRzXy5lbXBsYWNlX2JhY2soc3RydWN0X2RlZik7Ci0gICAgfQotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IHZhcmlhYmxlX3N0cnVjdF9maWVsZHNfKSB7Ci0gICAgaWYgKG5vZGUuc3RydWN0X2RlZl8tPnBhcmVudF8gIT0gbnVsbHB0cikgewotICAgICAgZm9yIChhdXRvJiBwYXJlbnQgOiB2YXJpYWJsZV9zdHJ1Y3RfZmllbGRzXykgewotICAgICAgICBpZiAobm9kZS5zdHJ1Y3RfZGVmXy0+cGFyZW50Xy0+bmFtZV8gPT0gcGFyZW50LnN0cnVjdF9kZWZfLT5uYW1lXykgewotICAgICAgICAgIHBhcmVudC5jaGlsZHJlbl8ucHVzaF9iYWNrKCZub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFN0cnVjdFBhcnNlckdlbmVyYXRvcjo6ZXhwbG9yZV9jaGlsZHJlbihjb25zdCBUcmVlTm9kZSYgbm9kZSwgc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGF1dG8gZmllbGQgPSBub2RlLnBhY2tldF9maWVsZF87Ci0gIGlmICghbm9kZS5jaGlsZHJlbl8uZW1wdHkoKSkgewotICAgIHMgPDwgImJvb2wgIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfY2hpbGRfZm91bmQgPSBmYWxzZTsgLyogR3JlZWR5IG1hdGNoICovIjsKLSAgfQotICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogbm9kZS5jaGlsZHJlbl8pIHsKLSAgICBzIDw8ICJpZiAoISIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiX2NoaWxkX2ZvdW5kICYmICI7Ci0gICAgcyA8PCBjaGlsZC0+c3RydWN0X2RlZl8tPm5hbWVfIDw8ICI6OklzSW5zdGFuY2UoKiIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiX3ZhbHVlLmdldCgpKSkgeyI7Ci0gICAgcyA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfY2hpbGRfZm91bmQgPSB0cnVlOyI7Ci0gICAgcyA8PCAic3RkOjp1bmlxdWVfcHRyPCIgPDwgY2hpbGQtPnN0cnVjdF9kZWZfLT5uYW1lXyA8PCAiPiAiIDw8IGNoaWxkLT5wYWNrZXRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl92YWx1ZTsiOwotICAgIHMgPDwgY2hpbGQtPnBhY2tldF9maWVsZF8tPkdldE5hbWUoKSA8PCAiX3ZhbHVlLnJlc2V0KG5ldyAiOwotICAgIHMgPDwgY2hpbGQtPnN0cnVjdF9kZWZfLT5uYW1lXyA8PCAiKCoiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl92YWx1ZSkpOyI7Ci0gICAgaWYgKGNoaWxkLT5zdHJ1Y3RfZGVmXy0+ZmllbGRzXy5IYXNCb2R5KCkpIHsKLSAgICAgIHMgPDwgImF1dG8gb3B0aW9uYWxfaXQgPSAiOwotICAgICAgcyA8PCBjaGlsZC0+c3RydWN0X2RlZl8tPm5hbWVfIDw8ICI6OlBhcnNlKCAiIDw8IGNoaWxkLT5wYWNrZXRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl92YWx1ZS5nZXQoKSwgIjsKLSAgICAgIHMgPDwgInRvX2JvdW5kLCBmYWxzZSk7IjsKLSAgICAgIHMgPDwgImlmIChvcHRpb25hbF9pdCkgeyI7Ci0gICAgICBzIDw8ICJ9IGVsc2UgeyByZXR1cm4gIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfdmFsdWU7fSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgY2hpbGQtPnN0cnVjdF9kZWZfLT5uYW1lXyA8PCAiOjpQYXJzZSggIiA8PCBjaGlsZC0+cGFja2V0X2ZpZWxkXy0+R2V0TmFtZSgpIDw8ICJfdmFsdWUuZ2V0KCksICI7Ci0gICAgICBzIDw8ICJ0b19ib3VuZCwgZmFsc2UpOyI7Ci0gICAgfQotICAgIGV4cGxvcmVfY2hpbGRyZW4oKmNoaWxkLCBzKTsKLSAgICBzIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl92YWx1ZSA9IHN0ZDo6bW92ZSgiIDw8IGNoaWxkLT5wYWNrZXRfZmllbGRfLT5HZXROYW1lKCkgPDwgIl92YWx1ZSk7IjsKLQotICAgIHMgPDwgIiB9IjsKLSAgfQotfQotCi12b2lkIFN0cnVjdFBhcnNlckdlbmVyYXRvcjo6R2VuZXJhdGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdCB7Ci0gIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IHZhcmlhYmxlX3N0cnVjdF9maWVsZHNfKSB7Ci0gICAgaWYgKG5vZGUuY2hpbGRyZW5fLmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBhdXRvIGZpZWxkID0gbm9kZS5wYWNrZXRfZmllbGRfOwotICAgIHMgPDwgImlubGluZSBzdGQ6OnVuaXF1ZV9wdHI8IiA8PCBub2RlLnN0cnVjdF9kZWZfLT5uYW1lXyA8PCAiPiBQYXJzZSIgPDwgbm9kZS5zdHJ1Y3RfZGVmXy0+bmFtZV87Ci0gICAgaWYgKGlzX2xpdHRsZV9lbmRpYW4pIHsKLSAgICAgIHMgPDwgIihJdGVyYXRvcjxrTGl0dGxlRW5kaWFuPiB0b19ib3VuZCkgeyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPDwgIihJdGVyYXRvcjwha0xpdHRsZUVuZGlhbj4gdG9fYm91bmQpIHsiOwotICAgIH0KLSAgICBzIDw8IGZpZWxkLT5HZXREYXRhVHlwZSgpIDw8ICIgIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfdmFsdWUgPSAiOwotICAgIHMgPDwgInN0ZDo6bWFrZV91bmlxdWU8IiA8PCBub2RlLnN0cnVjdF9kZWZfLT5uYW1lXyA8PCAiPigpOyI7Ci0KLSAgICBzIDw8ICJhdXRvICIgPDwgZmllbGQtPkdldE5hbWUoKSA8PCAiX2l0ID0gdG9fYm91bmQ7IjsKLSAgICBzIDw8ICJhdXRvIHBhcmVudF9vcHRpb25hbF9pdCA9ICI7Ci0gICAgcyA8PCBub2RlLnN0cnVjdF9kZWZfLT5uYW1lXyA8PCAiOjpQYXJzZSggIiA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfdmFsdWUuZ2V0KCksICI7Ci0gICAgcyA8PCBmaWVsZC0+R2V0TmFtZSgpIDw8ICJfaXQiOwotICAgIGlmIChub2RlLnN0cnVjdF9kZWZfLT5wYXJlbnRfICE9IG51bGxwdHIpIHsKLSAgICAgIHMgPDwgIiwgdHJ1ZSk7IjsKLSAgICB9IGVsc2UgewotICAgICAgcyA8PCAiKTsiOwotICAgIH0KLSAgICBzIDw8ICJpZiAocGFyZW50X29wdGlvbmFsX2l0KSB7IjsKLSAgICBzIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl9pdCA9ICpwYXJlbnRfb3B0aW9uYWxfaXQ7IjsKLSAgICBzIDw8ICJ9IGVsc2UgeyByZXR1cm4gbnVsbHB0cjsgfSI7Ci0KLSAgICBleHBsb3JlX2NoaWxkcmVuKG5vZGUsIHMpOwotICAgIHMgPDwgInJldHVybiAiIDw8IGZpZWxkLT5HZXROYW1lKCkgPDwgIl92YWx1ZTsgfSI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvc3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuaCBiL2dkL3BhY2tldC9wYXJzZXIvc3RydWN0X3BhcnNlcl9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxNTQ2MC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3N0cnVjdF9wYXJzZXJfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiZGVjbGFyYXRpb25zLmgiCi0jaW5jbHVkZSAiZmllbGRzL3BhY2tldF9maWVsZC5oIgotI2luY2x1ZGUgInBhcnNlX2xvY2F0aW9uLmgiCi0KLWNsYXNzIFN0cnVjdFBhcnNlckdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTdHJ1Y3RQYXJzZXJHZW5lcmF0b3IoY29uc3QgRGVjbGFyYXRpb25zJiBkZWNsYXJhdGlvbnMpOwotCi0gIHZvaWQgR2VuZXJhdGUoc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNsYXNzIFRyZWVOb2RlIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBUcmVlTm9kZShjb25zdCBTdHJ1Y3REZWYqIHMpCi0gICAgICAgIDogc3RydWN0X2RlZl8ocyksIHBhY2tldF9maWVsZF8ocy0+R2V0TmV3RmllbGQocy0+bmFtZV8gKyAiX3BhcnNlIiwgUGFyc2VMb2NhdGlvbigpKSkge30KLSAgICBjb25zdCBTdHJ1Y3REZWYqIHN0cnVjdF9kZWZfOwotICAgIGNvbnN0IFBhY2tldEZpZWxkKiBwYWNrZXRfZmllbGRfOwotICAgIHN0ZDo6bGlzdDxjb25zdCBUcmVlTm9kZSo+IGNoaWxkcmVuXzsKLSAgfTsKLSAgc3RkOjpsaXN0PFRyZWVOb2RlPiB2YXJpYWJsZV9zdHJ1Y3RfZmllbGRzXzsKLSAgYm9vbCBpc19saXR0bGVfZW5kaWFuOwotCi0gIHZvaWQgZXhwbG9yZV9jaGlsZHJlbihjb25zdCBUcmVlTm9kZSYgbm9kZSwgc3RkOjpvc3RyZWFtJiBzKSBjb25zdDsKLX07CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3QvQW5kcm9pZC5icCBiL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ1YTkzLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogIkJsdWV0b290aFBhY2tldFBhcnNlclRlc3RQYWNrZXRQZGxHZW5faCIsCi0gICAgdG9vbHM6IFsKLSAgICAgICAgImJsdWV0b290aF9wYWNrZXRnZW4iLAotICAgIF0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBibHVldG9vdGhfcGFja2V0Z2VuKSAtLWluY2x1ZGU9c3lzdGVtL2J0L2dkIC0tb3V0PSQoZ2VuRGlyKSAkKGluKSIsCi0gICAgc3JjczogWwotICAgICAgICAidGVzdF9wYWNrZXRzLnBkbCIsCi0gICAgICAgICJiaWdfZW5kaWFuX3Rlc3RfcGFja2V0cy5wZGwiLAotICAgIF0sCi0gICAgb3V0OiBbCi0gICAgICAgICJwYWNrZXQvcGFyc2VyL3Rlc3QvdGVzdF9wYWNrZXRzLmgiLAotICAgICAgICAicGFja2V0L3BhcnNlci90ZXN0L2JpZ19lbmRpYW5fdGVzdF9wYWNrZXRzLmgiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFBhY2tldFBhcnNlclRlc3RQYWNrZXRUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiZ2VuZXJhdGVkX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICAgInNpeF9ieXRlcy5jYyIsCi0gICAgICAgICJ2YXJpYWJsZS5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9iaWdfZW5kaWFuX3Rlc3RfcGFja2V0cy5wZGwgYi9nZC9wYWNrZXQvcGFyc2VyL3Rlc3QvYmlnX2VuZGlhbl90ZXN0X3BhY2tldHMucGRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ3ZWE2Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9iaWdfZW5kaWFuX3Rlc3RfcGFja2V0cy5wZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotYmlnX2VuZGlhbl9wYWNrZXRzCi0KLWN1c3RvbV9maWVsZCBTaXhCeXRlcyA6IDQ4ICJwYWNrZXQvcGFyc2VyL3Rlc3QvIgotY3VzdG9tX2ZpZWxkIFZhcmlhYmxlICJwYWNrZXQvcGFyc2VyL3Rlc3QvIgotCi1wYWNrZXQgUGFyZW50QmUgewotICBfZml4ZWRfID0gMHgxMiA6IDgsCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogOCwKLSAgX3BheWxvYWRfLAotICBmb290ZXIgOiA4LAotfQotCi1wYWNrZXQgQ2hpbGRCZSAgOiBQYXJlbnRCZSB7Ci0gIGZpZWxkX25hbWUgOiAxNiwKLX0KLQotZW51bSBGb3VyQml0c0JlIDogNCB7Ci0gIE9ORSA9IDEsCi0gIFRXTyA9IDIsCi0gIFRIUkVFID0gMywKLSAgRklWRSA9IDUsCi0gIFRFTiA9IDEwLAotICBMQVpZX01FID0gMTUsCi19Ci0KLXBhY2tldCBQYXJlbnRUd29CZSB7Ci0gIF9yZXNlcnZlZF8gOiA0LAotICBmb3VyX2JpdHMgOiBGb3VyQml0c0JlLAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBDaGlsZFR3b1RocmVlQmUgIDogUGFyZW50VHdvQmUgKGZvdXJfYml0cyA9IFRIUkVFKSB7Ci0gIG1vcmVfYml0cyA6IEZvdXJCaXRzQmUsCi0gIF9yZXNlcnZlZF8gOiA0LAotICBzaXh0ZWVuX2JpdHMgOiAxNgotfQotCi1wYWNrZXQgQ2hpbGRUd29Ud29CZSAgOiBQYXJlbnRUd29CZSAoZm91cl9iaXRzID0gVFdPKSB7Ci0gIG1vcmVfYml0cyA6IEZvdXJCaXRzQmUsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgQ2hpbGRUd29Ud29UaHJlZUJlICA6Q2hpbGRUd29Ud29CZSAobW9yZV9iaXRzID0gVEhSRUUpIHsKLX0KLQotZW51bSBUd29CaXRzQmUgOiAyIHsKLSAgWkVSTyA9IDAsCi0gIE9ORSA9IDEsCi0gIFRXTyA9IDIsCi0gIFRIUkVFID0gMywKLX0KLQotcGFja2V0IE1pZGRsZUZvdXJCaXRzQmUgewotICBsb3dfdHdvIDogVHdvQml0c0JlLAotICBuZXh0X2ZvdXIgOiBGb3VyQml0c0JlLAotICBzdHJhZGRsZSA6IEZvdXJCaXRzQmUsCi0gIGZvdXJfbW9yZSA6IEZvdXJCaXRzQmUsCi0gIGhpZ2hfdHdvIDogVHdvQml0c0JlLAotfQotCi1wYWNrZXQgUGFyZW50V2l0aFNpeEJ5dGVzQmUgewotICB0d29fYnl0ZXMgOiAxNiwKLSAgc2l4X2J5dGVzIDogU2l4Qnl0ZXMsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IENoaWxkV2l0aFNpeEJ5dGVzQmUgIDogUGFyZW50V2l0aFNpeEJ5dGVzQmUgKHR3b19ieXRlcyA9IDB4MTIzNCkgewotICBjaGlsZF9zaXhfYnl0ZXMgOiBTaXhCeXRlcywKLX0KLQotY2hlY2tzdW0gU2ltcGxlU3VtIDogMTYgInBhY2tldC9wYXJzZXIvdGVzdC8iCi0KLXBhY2tldCBQYXJlbnRXaXRoU3VtQmUgewotICB0d29fYnl0ZXMgOiAxNiwKLSAgX2NoZWNrc3VtX3N0YXJ0XyhleGFtcGxlX2NoZWNrc3VtKSwKLSAgc3VtX2J5dGVzIDogMTYsCi0gIF9wYXlsb2FkXywKLSAgZXhhbXBsZV9jaGVja3N1bSA6IFNpbXBsZVN1bSwKLX0KLQotcGFja2V0IENoaWxkV2l0aFN1bUJlICA6IFBhcmVudFdpdGhTdW1CZSB7Ci0gIG1vcmVfYnl0ZXMgOiAzMiwKLSAgYW5vdGhlcl9ieXRlIDogOCwKLX0KLQotcGFja2V0IENoaWxkV2l0aE5lc3RlZFN1bUJlICA6IFBhcmVudFdpdGhTdW1CZSB7Ci0gIF9jaGVja3N1bV9zdGFydF8obmVzdGVkX2NoZWNrc3VtKSwKLSAgbW9yZV9ieXRlcyA6IDMyLAotICBuZXN0ZWRfY2hlY2tzdW0gOiBTaW1wbGVTdW0sCi19Ci0KLXBhY2tldCBQYXJlbnRTaXplTW9kaWZpZXJCZSB7Ci0gIF9zaXplXyhfcGF5bG9hZF8pIDogOCwKLSAgX3BheWxvYWRfIDogWysyKjhdLCAvLyBJbmNsdWRlIHR3b19ieXRlcyBpbiB0aGUgc2l6ZQotICB0d29fYnl0ZXMgOiAxNiwKLX0KLQotcGFja2V0IENoaWxkU2l6ZU1vZGlmaWVyQmUgIDogUGFyZW50U2l6ZU1vZGlmaWVyQmUgKHR3b19ieXRlcyA9IDB4MTIxMSkgewotICBtb3JlX2J5dGVzIDogMzIsCi19Ci0KLWVudW0gRm9yQXJyYXlzQmUgOiAxNiB7Ci0gIE9ORSA9IDB4MDAwMSwKLSAgVFdPID0gMHgwMDAyLAotICBPTkVfVFdPID0gMHgwMjAxLAotICBUV09fVEhSRUUgPSAweDAzMDIsCi0gIEZGRkYgPSAweGZmZmYsCi19Ci0KLXBhY2tldCBGaXhlZEFycmF5RW51bUJlIHsKLSAgZW51bV9hcnJheSA6IEZvckFycmF5c0JlWzVdLAotfQotCi1wYWNrZXQgU2l6ZWRBcnJheUVudW1CZSB7Ci0gIF9zaXplXyhlbnVtX2FycmF5KSA6IDE2LAotICBlbnVtX2FycmF5IDogRm9yQXJyYXlzQmVbXSwKLX0KLQotcGFja2V0IENvdW50QXJyYXlFbnVtQmUgewotICBfY291bnRfKGVudW1fYXJyYXkpIDogOCwKLSAgZW51bV9hcnJheSA6IEZvckFycmF5c0JlW10sCi19Ci0KLXBhY2tldCBTaXplZEFycmF5Q3VzdG9tQmUgewotICBfc2l6ZV8oc2l4X2J5dGVzX2FycmF5KSA6IDgsCi0gIGFuX2V4dHJhX2J5dGUgOiA4LAotICBzaXhfYnl0ZXNfYXJyYXkgOiBTaXhCeXRlc1srMSo4XSwKLX0KLQotcGFja2V0IEZpeGVkQXJyYXlDdXN0b21CZSB7Ci0gIHNpeF9ieXRlc19hcnJheSA6IFNpeEJ5dGVzWzVdLAotfQotCi1wYWNrZXQgQ291bnRBcnJheUN1c3RvbUJlIHsKLSAgX2NvdW50XyhzaXhfYnl0ZXNfYXJyYXkpIDogOCwKLSAgc2l4X2J5dGVzX2FycmF5IDogU2l4Qnl0ZXNbXSwKLX0KLQotcGFja2V0IFBhY2tldFdpdGhGaXhlZEFycmF5c09mQnl0ZXNCZSB7Ci0gIGZpeGVkXzI1NmJpdF9pbl9ieXRlcyA6IDhbMzJdLAotICBmaXhlZF8yNTZiaXRfaW5fd29yZHMgOiAzMls4XSwKLX0KLQotcGFja2V0IE9uZVZhcmlhYmxlQmUgewotICBvbmUgOiBWYXJpYWJsZSwKLX0KLQotcGFja2V0IFNpemVkQXJyYXlWYXJpYWJsZUJlIHsKLSAgX3NpemVfKHZhcmlhYmxlX2FycmF5KSA6IDgsCi0gIHZhcmlhYmxlX2FycmF5IDogVmFyaWFibGVbXSwKLX0KLQotcGFja2V0IEZpeGVkQXJyYXlWYXJpYWJsZUJlIHsKLSAgdmFyaWFibGVfYXJyYXkgOiBWYXJpYWJsZVs1XSwKLX0KLQotcGFja2V0IENvdW50QXJyYXlWYXJpYWJsZUJlIHsKLSAgX2NvdW50Xyh2YXJpYWJsZV9hcnJheSkgOiA4LAotICB2YXJpYWJsZV9hcnJheSA6IFZhcmlhYmxlW10sCi19Ci0KLXN0cnVjdCBUd29SZWxhdGVkTnVtYmVyc0JlIHsKLSAgaWQgOiA4LAotICBjb3VudCA6IDE2LAotfQotCi1wYWNrZXQgT25lU3RydWN0QmUgewotICBvbmUgOiBUd29SZWxhdGVkTnVtYmVyc0JlLAotfQotCi1wYWNrZXQgVHdvU3RydWN0c0JlIHsKLSAgb25lIDogVHdvUmVsYXRlZE51bWJlcnNCZSwKLSAgdHdvIDogVHdvUmVsYXRlZE51bWJlcnNCZSwKLX0KLQotcGFja2V0IEFycmF5T2ZTdHJ1Y3RCZSB7Ci0gIF9jb3VudF8oYXJyYXkpIDogOCwKLSAgYXJyYXkgOiBUd29SZWxhdGVkTnVtYmVyc0JlW10sCi19Ci0KLXN0cnVjdCBTdHJ1Y3RXaXRoRml4ZWRUeXBlc0JlIHsKLSAgZm91cl9iaXRzIDogRm91ckJpdHNCZSwKLSAgX3Jlc2VydmVkXyA6IDQsCi0gIF9jaGVja3N1bV9zdGFydF8oZXhhbXBsZV9jaGVja3N1bSksCi0gIF9maXhlZF8gPSAweGYzIDogOCwKLSAgaWQgOiA4LAotICBhcnJheSA6IDhbM10sCi0gIGV4YW1wbGVfY2hlY2tzdW0gOiBTaW1wbGVTdW0sCi0gIHNpeF9ieXRlcyA6IFNpeEJ5dGVzLAotfQotCi1wYWNrZXQgT25lRml4ZWRUeXBlc1N0cnVjdEJlIHsKLSAgb25lIDogU3RydWN0V2l0aEZpeGVkVHlwZXNCZSwKLX0KLQotcGFja2V0IEFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyQmUgewotICBfY291bnRfKGFycmF5KSA6IDgsCi0gIGFycmF5IDogVHdvUmVsYXRlZE51bWJlcnNCZVtdLAotICBhbm90aGVyIDogVHdvUmVsYXRlZE51bWJlcnNCZSwKLX0KLQotZ3JvdXAgQml0RmllbGRHcm91cEJlIHsKLSAgc2V2ZW5fYml0cyA6IDcsCi0gIHN0cmFkZGxlIDogNCwKLSAgZml2ZV9iaXRzIDogNSwKLX0KLQotcGFja2V0IEJpdEZpZWxkR3JvdXBQYWNrZXRCZSB7Ci0gIEJpdEZpZWxkR3JvdXBCZSwKLX0KLQotcGFja2V0IEJpdEZpZWxkR3JvdXBBZnRlclBheWxvYWRQYWNrZXRCZSB7Ci0gIF9wYXlsb2FkXywKLSAgQml0RmllbGRHcm91cEJlLAotfQotCi1wYWNrZXQgQml0RmllbGRHcm91cEFmdGVyVW5zaXplZEFycmF5UGFja2V0QmUgIDogQml0RmllbGRHcm91cEFmdGVyUGF5bG9hZFBhY2tldEJlIHsKLSAgYXJyYXkgOiA4W10sCi19Ci0KLXN0cnVjdCBCaXRGaWVsZEJlIHsKLSAgc2V2ZW5fYml0cyA6IDcsCi0gIHN0cmFkZGxlIDogNCwKLSAgZml2ZV9iaXRzIDogNSwKLX0KLQotcGFja2V0IEJpdEZpZWxkUGFja2V0QmUgewotICBiaXRfZmllbGQgOiBCaXRGaWVsZEJlLAotfQotCi1wYWNrZXQgQml0RmllbGRBZnRlclBheWxvYWRQYWNrZXRCZSB7Ci0gIF9wYXlsb2FkXywKLSAgYml0X2ZpZWxkIDogQml0RmllbGRCZSwKLX0KLQotcGFja2V0IEJpdEZpZWxkQWZ0ZXJVbnNpemVkQXJyYXlQYWNrZXRCZSAgOiBCaXRGaWVsZEFmdGVyUGF5bG9hZFBhY2tldEJlIHsKLSAgYXJyYXkgOiA4W10sCi19Ci0KLXBhY2tldCBCaXRGaWVsZEFycmF5UGFja2V0QmUgewotICBfc2l6ZV8oYXJyYXkpOiA4LAotICBhcnJheSA6IEJpdEZpZWxkQmVbXSwKLX0KLQotc3RydWN0IFZlcnNpb25sZXNzU3RydWN0QmUgewotICBvbmVfbnVtYmVyIDogOCwKLX0KLQotcGFja2V0IE9uZVZlcnNpb25sZXNzU3RydWN0UGFja2V0QmUgewotICB2ZXJzaW9ubGVzcyA6IFZlcnNpb25sZXNzU3RydWN0QmUsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IE9uZVZlcnNpb25lZFN0cnVjdFBhY2tldEJlICA6IE9uZVZlcnNpb25sZXNzU3RydWN0UGFja2V0QmUgewotICB2ZXJzaW9uIDogOCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgT25lVmVyc2lvbk9uZVN0cnVjdFBhY2tldEJlICA6IE9uZVZlcnNpb25lZFN0cnVjdFBhY2tldEJlICh2ZXJzaW9uID0gMHgwMSkgewotICBqdXN0X29uZV9udW1iZXIgOiA4LAotfQotCi1wYWNrZXQgT25lVmVyc2lvblR3b1N0cnVjdFBhY2tldEJlICA6IE9uZVZlcnNpb25lZFN0cnVjdFBhY2tldEJlICh2ZXJzaW9uID0gMHgwMikgewotICBvbmVfbnVtYmVyIDogOCwKLSAgYW5vdGhlcl9udW1iZXIgOiA4LAotfQpkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3BhcnNlci90ZXN0L2dlbmVyYXRlZF9wYWNrZXRfdGVzdC5jYyBiL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9nZW5lcmF0ZWRfcGFja2V0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWRhNGQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci90ZXN0L2dlbmVyYXRlZF9wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBQQUNLRVRfVEVTVElORwotI2luY2x1ZGUgInBhY2tldC9wYXJzZXIvdGVzdC9iaWdfZW5kaWFuX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldC9wYXJzZXIvdGVzdC90ZXN0X3BhY2tldHMuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFyc2VyL3Rlc3Qvc2l4X2J5dGVzLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6a0xpdHRsZUVuZGlhbjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpwYXJzZXI6OnRlc3Q6OlNpeEJ5dGVzOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB7Ci12ZWN0b3I8dWludDhfdD4gY2hpbGRfdHdvX3R3b190aHJlZSA9IHsKLSAgICAweDIwIC8qIFJlc2VydmVkIDogNCwgRm91ckJpdHM6OlRXTyAqLywKLSAgICAweDAzIC8qIEZvdXJCaXRzOjpUSFJFRSwgUmVzZXJ2ZWQgOiA0ICovLAotfTsKLXZlY3Rvcjx1aW50OF90PiBjaGlsZCA9IHsKLSAgICAweDEyIC8qIGZpeGVkICovLCAweDAyIC8qIFNpemUgb2YgdGhlIHBheWxvYWQgKi8sIDB4YTEgLyogRmlyc3QgYnl0ZSBvZiB0aGUgcGF5bG9hZCAqLywgMHhhMiwgMHhiMSAvKiBmb290ZXIgKi8sCi19OwotdmVjdG9yPHVpbnQ4X3Q+IGNoaWxkX3dpdGhfc2l4X2J5dGVzID0gewotICAgIDB4MzQgLyogVHdvQnl0ZXMgKi8sCi0gICAgMHgxMiwKLSAgICAweGExIC8qIEZpcnN0IGJ5dGUgb2YgdGhlIHNpeF9ieXRlcyAqLywKLSAgICAweGEyLAotICAgIDB4YTMsCi0gICAgMHhhNCwKLSAgICAweGE1LAotICAgIDB4YTYsCi0gICAgMHhiMSAvKiBTZWNvbmQgc2l4X2J5dGVzKi8sCi0gICAgMHhiMiwKLSAgICAweGIzLAotICAgIDB4YjQsCi0gICAgMHhiNSwKLSAgICAweGI2LAotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci1uYW1lc3BhY2UgcGFyc2VyIHsKLXVzaW5nIG5hbWVzcGFjZSB0ZXN0OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RDaGlsZFR3b1R3b1RocmVlKSB7Ci0gIGF1dG8gcGFja2V0ID0gQ2hpbGRUd29Ud29UaHJlZUJ1aWxkZXI6OkNyZWF0ZSgpOwotCi0gIEFTU0VSVF9FUShjaGlsZF90d29fdHdvX3RocmVlLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEocGFja2V0X2J5dGVzLT5zaXplKCksIGNoaWxkX3R3b190d29fdGhyZWUuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGlsZF90d29fdHdvX3RocmVlLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+YXQoaSksIGNoaWxkX3R3b190d29fdGhyZWVbaV0pOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBQYXJlbnRWaWV3IHdyb25nX3ZpZXcgPSBQYXJlbnRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfRkFMU0Uod3Jvbmdfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIFBhcmVudFR3b1ZpZXcgcGFyZW50X3ZpZXcgPSBQYXJlbnRUd29WaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRShwYXJlbnRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoRm91ckJpdHM6OlRXTywgcGFyZW50X3ZpZXcuR2V0Rm91ckJpdHMoKSk7Ci0KLSAgQ2hpbGRUd29Ud29WaWV3IGNoaWxkX3ZpZXcgPSBDaGlsZFR3b1R3b1ZpZXc6OkNyZWF0ZShwYXJlbnRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGNoaWxkX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKEZvdXJCaXRzOjpUSFJFRSwgY2hpbGRfdmlldy5HZXRNb3JlQml0cygpKTsKLQotICBDaGlsZFR3b1R3b1RocmVlVmlldyBncmFuZGNoaWxkX3ZpZXcgPSBDaGlsZFR3b1R3b1RocmVlVmlldzo6Q3JlYXRlKGNoaWxkX3ZpZXcpOwotICBBU1NFUlRfVFJVRShncmFuZGNoaWxkX3ZpZXcuSXNWYWxpZCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0Q2hpbGQpIHsKLSAgdWludDE2X3QgZmllbGRfbmFtZSA9IDB4YTJhMTsKLSAgdWludDhfdCBmb290ZXIgPSAweGIxOwotICBhdXRvIHBhY2tldCA9IENoaWxkQnVpbGRlcjo6Q3JlYXRlKGZpZWxkX25hbWUsIGZvb3Rlcik7Ci0KLSAgQVNTRVJUX0VRKGNoaWxkLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEocGFja2V0X2J5dGVzLT5zaXplKCksIGNoaWxkLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hpbGQuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocGFja2V0X2J5dGVzLT5hdChpKSwgY2hpbGRbaV0pOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBQYXJlbnRWaWV3IHBhcmVudF92aWV3ID0gUGFyZW50Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUocGFyZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYXlsb2FkID0gcGFyZW50X3ZpZXcuR2V0UGF5bG9hZCgpOwotCi0gIEFTU0VSVF9FUShjaGlsZFsxIC8qIHNraXAgZml4ZWQgZmllbGQgKi9dLCBwYXlsb2FkLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF5bG9hZC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShjaGlsZFtpICsgMiAvKiBmaXhlZCAmIHNpemUgKi9dLCBwYXlsb2FkW2ldKTsKLSAgfQotCi0gIENoaWxkVmlldyBjaGlsZF92aWV3ID0gQ2hpbGRWaWV3OjpDcmVhdGUocGFyZW50X3ZpZXcpOwotICBBU1NFUlRfVFJVRShjaGlsZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgQVNTRVJUX0VRKGZpZWxkX25hbWUsIGNoaWxkX3ZpZXcuR2V0RmllbGROYW1lKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RWYWxpZGF0ZVdheVRvb1NtYWxsKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRvb19zbWFsbF9ieXRlcyA9IHsweDM0fTsKLSAgYXV0byB0b29fc21hbGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pih0b29fc21hbGxfYnl0ZXMuYmVnaW4oKSwgdG9vX3NtYWxsX2J5dGVzLmVuZCgpKTsKLQotICBQYXJlbnRXaXRoU2l4Qnl0ZXNWaWV3IGludmFsaWRfcGFyZW50ID0gUGFyZW50V2l0aFNpeEJ5dGVzVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4odG9vX3NtYWxsKSk7Ci0gIEFTU0VSVF9GQUxTRShpbnZhbGlkX3BhcmVudC5Jc1ZhbGlkKCkpOwotICBDaGlsZFdpdGhTaXhCeXRlc1ZpZXcgaW52YWxpZCA9Ci0gICAgICBDaGlsZFdpdGhTaXhCeXRlc1ZpZXc6OkNyZWF0ZShQYXJlbnRXaXRoU2l4Qnl0ZXNWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPih0b29fc21hbGwpKSk7Ci0gIEFTU0VSVF9GQUxTRShpbnZhbGlkLklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFZhbGlkYXRlVG9vU21hbGwpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9vX3NtYWxsX2J5dGVzID0gezB4MzQsIDB4MTIsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MTF9OwotICBhdXRvIHRvb19zbWFsbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KHRvb19zbWFsbF9ieXRlcy5iZWdpbigpLCB0b29fc21hbGxfYnl0ZXMuZW5kKCkpOwotCi0gIFBhcmVudFdpdGhTaXhCeXRlc1ZpZXcgdmFsaWRfcGFyZW50ID0gUGFyZW50V2l0aFNpeEJ5dGVzVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4odG9vX3NtYWxsKSk7Ci0gIEFTU0VSVF9UUlVFKHZhbGlkX3BhcmVudC5Jc1ZhbGlkKCkpOwotICBDaGlsZFdpdGhTaXhCeXRlc1ZpZXcgaW52YWxpZCA9Ci0gICAgICBDaGlsZFdpdGhTaXhCeXRlc1ZpZXc6OkNyZWF0ZShQYXJlbnRXaXRoU2l4Qnl0ZXNWaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPih0b29fc21hbGwpKSk7Ci0gIEFTU0VSVF9GQUxTRShpbnZhbGlkLklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFZhbGlkYXRlSnVzdFJpZ2h0KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGp1c3RfcmlnaHRfYnl0ZXMgPSB7MHgzNCwgMHgxMiwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2fTsKLSAgYXV0byBqdXN0X3JpZ2h0ID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oanVzdF9yaWdodF9ieXRlcy5iZWdpbigpLCBqdXN0X3JpZ2h0X2J5dGVzLmVuZCgpKTsKLQotICBDaGlsZFdpdGhTaXhCeXRlc1ZpZXcgdmFsaWQgPQotICAgICAgQ2hpbGRXaXRoU2l4Qnl0ZXNWaWV3OjpDcmVhdGUoUGFyZW50V2l0aFNpeEJ5dGVzVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4oanVzdF9yaWdodCkpKTsKLSAgQVNTRVJUX1RSVUUodmFsaWQuSXNWYWxpZCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0VmFsaWRhdGVUb29CaWcpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9vX2JpZ19ieXRlcyA9IHsweDM0LCAweDEyLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MjB9OwotICBhdXRvIHRvb19iaWcgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pih0b29fYmlnX2J5dGVzLmJlZ2luKCksIHRvb19iaWdfYnl0ZXMuZW5kKCkpOwotCi0gIENoaWxkV2l0aFNpeEJ5dGVzVmlldyBsZW5pZW50ID0KLSAgICAgIENoaWxkV2l0aFNpeEJ5dGVzVmlldzo6Q3JlYXRlKFBhcmVudFdpdGhTaXhCeXRlc1ZpZXc6OkNyZWF0ZShQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+KHRvb19iaWcpKSk7Ci0gIEFTU0VSVF9UUlVFKGxlbmllbnQuSXNWYWxpZCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0VmFsaWRhdGVEZWF0aCkgewotICBhdXRvIHBhY2tldCA9IENoaWxkVHdvVHdvVGhyZWVCdWlsZGVyOjpDcmVhdGUoKTsKLQotICBBU1NFUlRfRVEoY2hpbGRfdHdvX3R3b190aHJlZS5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+c2l6ZSgpLCBjaGlsZF90d29fdHdvX3RocmVlLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hpbGRfdHdvX3R3b190aHJlZS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShwYWNrZXRfYnl0ZXMtPmF0KGkpLCBjaGlsZF90d29fdHdvX3RocmVlW2ldKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgUGFyZW50VmlldyB3cm9uZ192aWV3ID0gUGFyZW50Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX0RFQVRIKHdyb25nX3ZpZXcuR2V0UGF5bG9hZCgpLCAidmFsaWRhdGVkIik7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFZhbGlkYXRlZFBhcmVudERlYXRoKSB7Ci0gIHVpbnQxNl90IGZpZWxkX25hbWUgPSAweGEyYTE7Ci0gIHVpbnQ4X3QgZm9vdGVyID0gMHhiMTsKLSAgYXV0byBwYWNrZXQgPSBDaGlsZEJ1aWxkZXI6OkNyZWF0ZShmaWVsZF9uYW1lLCBmb290ZXIpOwotCi0gIEFTU0VSVF9FUShjaGlsZC5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+c2l6ZSgpLCBjaGlsZC5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoaWxkLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+YXQoaSksIGNoaWxkW2ldKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgUGFyZW50VmlldyBwYXJlbnRfdmlldyA9IFBhcmVudFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHBhcmVudF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGF5bG9hZCA9IHBhcmVudF92aWV3LkdldFBheWxvYWQoKTsKLQotICBBU1NFUlRfRVEoY2hpbGRbMSAvKiBza2lwIGZpeGVkIGZpZWxkICovXSwgcGF5bG9hZC5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBheWxvYWQuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoY2hpbGRbaSArIDIgLyogZml4ZWQgJiBzaXplICovXSwgcGF5bG9hZFtpXSk7Ci0gIH0KLQotICBDaGlsZFZpZXcgY2hpbGRfdmlldyA9IENoaWxkVmlldzo6Q3JlYXRlKHBhcmVudF92aWV3KTsKLSAgQVNTRVJUX0RFQVRIKGNoaWxkX3ZpZXcuR2V0RmllbGROYW1lKCksICJ2YWxpZGF0ZWQiKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IG1pZGRsZV9mb3VyX2JpdHMgPSB7Ci0gICAgMHg5NSwgIC8vIGxvd190d28gPSBPTkUsIG5leHRfZm91ciA9IEZJVkUsIHN0cmFkZGxlID0gVEVOCi0gICAgMHg4YSwgIC8vIHN0cmFkZGxlID0gVEVOLCBmb3VyX21vcmUgPSBUV08sIGhpZ2hfdHdvID0gVFdPCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RNaWRkbGVGb3VyQml0c1BhY2tldCkgewotICBUd29CaXRzIGxvd190d28gPSBUd29CaXRzOjpPTkU7Ci0gIEZvdXJCaXRzIG5leHRfZm91ciA9IEZvdXJCaXRzOjpGSVZFOwotICBGb3VyQml0cyBzdHJhZGRsZSA9IEZvdXJCaXRzOjpURU47Ci0gIEZvdXJCaXRzIGZvdXJfbW9yZSA9IEZvdXJCaXRzOjpUV087Ci0gIFR3b0JpdHMgaGlnaF90d28gPSBUd29CaXRzOjpUV087Ci0KLSAgYXV0byBwYWNrZXQgPSBNaWRkbGVGb3VyQml0c0J1aWxkZXI6OkNyZWF0ZShsb3dfdHdvLCBuZXh0X2ZvdXIsIHN0cmFkZGxlLCBmb3VyX21vcmUsIGhpZ2hfdHdvKTsKLQotICBBU1NFUlRfRVEobWlkZGxlX2ZvdXJfYml0cy5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+c2l6ZSgpLCBtaWRkbGVfZm91cl9iaXRzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWlkZGxlX2ZvdXJfYml0cy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShwYWNrZXRfYnl0ZXMtPmF0KGkpLCBtaWRkbGVfZm91cl9iaXRzW2ldKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgTWlkZGxlRm91ckJpdHNWaWV3IHZpZXcgPSBNaWRkbGVGb3VyQml0c1ZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGxvd190d28sIHZpZXcuR2V0TG93VHdvKCkpOwotICBBU1NFUlRfRVEobmV4dF9mb3VyLCB2aWV3LkdldE5leHRGb3VyKCkpOwotICBBU1NFUlRfRVEoc3RyYWRkbGUsIHZpZXcuR2V0U3RyYWRkbGUoKSk7Ci0gIEFTU0VSVF9FUShmb3VyX21vcmUsIHZpZXcuR2V0Rm91ck1vcmUoKSk7Ci0gIEFTU0VSVF9FUShoaWdoX3R3bywgdmlldy5HZXRIaWdoVHdvKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RDaGlsZFdpdGhTaXhCeXRlcykgewotICBTaXhCeXRlcyBzaXhfYnl0ZXNfYXt7MHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNn19OwotICBTaXhCeXRlcyBzaXhfYnl0ZXNfYnt7MHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNn19OwotICBhdXRvIHBhY2tldCA9IENoaWxkV2l0aFNpeEJ5dGVzQnVpbGRlcjo6Q3JlYXRlKHNpeF9ieXRlc19hLCBzaXhfYnl0ZXNfYik7Ci0KLSAgQVNTRVJUX0VRKGNoaWxkX3dpdGhfc2l4X2J5dGVzLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEocGFja2V0X2J5dGVzLT5zaXplKCksIGNoaWxkX3dpdGhfc2l4X2J5dGVzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hpbGRfd2l0aF9zaXhfYnl0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocGFja2V0X2J5dGVzLT5hdChpKSwgY2hpbGRfd2l0aF9zaXhfYnl0ZXNbaV0pOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBQYXJlbnRXaXRoU2l4Qnl0ZXNWaWV3IHBhcmVudF92aWV3ID0gUGFyZW50V2l0aFNpeEJ5dGVzVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUocGFyZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKHNpeF9ieXRlc19hLCBwYXJlbnRfdmlldy5HZXRTaXhCeXRlcygpKTsKLQotICBDaGlsZFdpdGhTaXhCeXRlc1ZpZXcgY2hpbGRfdmlldyA9IENoaWxkV2l0aFNpeEJ5dGVzVmlldzo6Q3JlYXRlKHBhcmVudF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoY2hpbGRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFTU0VSVF9FUShzaXhfYnl0ZXNfYSwgY2hpbGRfdmlldy5HZXRTaXhCeXRlcygpKTsKLSAgQVNTRVJUX0VRKHNpeF9ieXRlc19hLCAoKFBhcmVudFdpdGhTaXhCeXRlc1ZpZXcpY2hpbGRfdmlldykuR2V0U2l4Qnl0ZXMoKSk7Ci0gIEFTU0VSVF9FUShzaXhfYnl0ZXNfYiwgY2hpbGRfdmlldy5HZXRDaGlsZFNpeEJ5dGVzKCkpOwotfQotCi1uYW1lc3BhY2UgewotdmVjdG9yPHVpbnQ4X3Q+IHBhcmVudF93aXRoX3N1bSA9IHsKLSAgICAweDExIC8qIFR3b0J5dGVzICovLCAweDEyLCAweDIxIC8qIFN1bSBCeXRlcyAqLywgMHgyMiwgMHg0MyAvKiBTdW0sIGV4Y2x1ZGluZyBUd29CeXRlcyAqLywgMHgwMCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RQYXJlbnRXaXRoU3VtKSB7Ci0gIHVpbnQxNl90IHR3b19ieXRlcyA9IDB4MTIxMTsKLSAgdWludDE2X3Qgc3VtX2J5dGVzID0gMHgyMjIxOwotICBhdXRvIHBhY2tldCA9IFBhcmVudFdpdGhTdW1CdWlsZGVyOjpDcmVhdGUodHdvX2J5dGVzLCBzdW1fYnl0ZXMsIHN0ZDo6bWFrZV91bmlxdWU8cGFja2V0OjpSYXdCdWlsZGVyPigpKTsKLQotICBBU1NFUlRfRVEocGFyZW50X3dpdGhfc3VtLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEocGFja2V0X2J5dGVzLT5zaXplKCksIHBhcmVudF93aXRoX3N1bS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmVudF93aXRoX3N1bS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShwYWNrZXRfYnl0ZXMtPmF0KGkpLCBwYXJlbnRfd2l0aF9zdW1baV0pOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBQYXJlbnRXaXRoU3VtVmlldyBwYXJlbnRfdmlldyA9IFBhcmVudFdpdGhTdW1WaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRShwYXJlbnRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEodHdvX2J5dGVzLCBwYXJlbnRfdmlldy5HZXRUd29CeXRlcygpKTsKLQotICAvLyBDb3JydXB0IGNoZWNrc3VtCi0gIHBhY2tldF9ieXRlcy0+YmFjaygpKys7Ci0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gY29ycnVwdGVkX2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgUGFyZW50V2l0aFN1bVZpZXcgY29ycnVwdGVkX3ZpZXcgPSBQYXJlbnRXaXRoU3VtVmlldzo6Q3JlYXRlKGNvcnJ1cHRlZF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX0ZBTFNFKGNvcnJ1cHRlZF92aWV3LklzVmFsaWQoKSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci12ZWN0b3I8dWludDhfdD4gY2hpbGRfd2l0aF9uZXN0ZWRfc3VtID0gewotICAgIDB4MTEgLyogVHdvQnl0ZXMgKi8sCi0gICAgMHgxMiwKLSAgICAweDIxIC8qIFN1bSBCeXRlcyAqLywKLSAgICAweDIyLAotICAgIDB4MzEgLyogTW9yZSBCeXRlcyAqLywKLSAgICAweDMyLAotICAgIDB4MzMsCi0gICAgMHgzNCwKLSAgICAweGNhIC8qIE5lc3RlZCBTdW0gKi8sCi0gICAgMHgwMCwKLSAgICAweGQ3IC8qIFN1bSwgZXhjbHVkaW5nIFR3b0J5dGVzICovLAotICAgIDB4MDEsCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0Q2hpbGRXaXRoTmVzdGVkU3VtKSB7Ci0gIHVpbnQxNl90IHR3b19ieXRlcyA9IDB4MTIxMTsKLSAgdWludDE2X3Qgc3VtX2J5dGVzID0gMHgyMjIxOwotICB1aW50MzJfdCBtb3JlX2J5dGVzID0gMHgzNDMzMzIzMTsKLSAgYXV0byBwYWNrZXQgPSBDaGlsZFdpdGhOZXN0ZWRTdW1CdWlsZGVyOjpDcmVhdGUodHdvX2J5dGVzLCBzdW1fYnl0ZXMsIG1vcmVfYnl0ZXMpOwotCi0gIEFTU0VSVF9FUShjaGlsZF93aXRoX25lc3RlZF9zdW0uc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShwYWNrZXRfYnl0ZXMtPnNpemUoKSwgY2hpbGRfd2l0aF9uZXN0ZWRfc3VtLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hpbGRfd2l0aF9uZXN0ZWRfc3VtLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHBhY2tldF9ieXRlcy0+YXQoaSksIGNoaWxkX3dpdGhfbmVzdGVkX3N1bVtpXSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIFBhcmVudFdpdGhTdW1WaWV3IHBhcmVudF92aWV3ID0gUGFyZW50V2l0aFN1bVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHBhcmVudF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUSh0d29fYnl0ZXMsIHBhcmVudF92aWV3LkdldFR3b0J5dGVzKCkpOwotCi0gIENoaWxkV2l0aE5lc3RlZFN1bVZpZXcgY2hpbGRfdmlldyA9IENoaWxkV2l0aE5lc3RlZFN1bVZpZXc6OkNyZWF0ZShwYXJlbnRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGNoaWxkX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBBU1NFUlRfRVEobW9yZV9ieXRlcywgY2hpbGRfdmlldy5HZXRNb3JlQnl0ZXMoKSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci12ZWN0b3I8dWludDhfdD4gcGFyZW50X3NpemVfbW9kaWZpZXIgPSB7Ci0gICAgMHgwMiAvKiBTaXplICovLAotICAgIDB4MTEgLyogVHdvQnl0ZXMgKi8sCi0gICAgMHgxMiwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RQYXJlbnRTaXplTW9kaWZpZXIpIHsKLSAgdWludDE2X3QgdHdvX2J5dGVzID0gMHgxMjExOwotICBhdXRvIHBhY2tldCA9IFBhcmVudFNpemVNb2RpZmllckJ1aWxkZXI6OkNyZWF0ZShzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KCksIHR3b19ieXRlcyk7Ci0KLSAgQVNTRVJUX0VRKHBhcmVudF9zaXplX21vZGlmaWVyLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEocGFyZW50X3NpemVfbW9kaWZpZXIuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyZW50X3NpemVfbW9kaWZpZXIuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocGFyZW50X3NpemVfbW9kaWZpZXJbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBQYXJlbnRTaXplTW9kaWZpZXJWaWV3IHBhcmVudF92aWV3ID0gUGFyZW50U2l6ZU1vZGlmaWVyVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUocGFyZW50X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKHR3b19ieXRlcywgcGFyZW50X3ZpZXcuR2V0VHdvQnl0ZXMoKSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci12ZWN0b3I8dWludDhfdD4gY2hpbGRfc2l6ZV9tb2RpZmllciA9IHsKLSAgICAweDA2IC8qIFBheWxvYWRTaXplIChUd29CeXRlcyArIE1vcmVCeXRlcykqLywKLSAgICAweDMxIC8qIE1vcmVCeXRlcyAqLywKLSAgICAweDMyLAotICAgIDB4MzMsCi0gICAgMHgzNCwKLSAgICAweDExIC8qIFR3b0J5dGVzID0gMHgxMjExICovLAotICAgIDB4MTIsCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0Q2hpbGRTaXplTW9kaWZpZXIpIHsKLSAgdWludDE2X3QgdHdvX2J5dGVzID0gMHgxMjExOwotICB1aW50MzJfdCBtb3JlX2J5dGVzID0gMHgzNDMzMzIzMTsKLSAgYXV0byBwYWNrZXQgPSBDaGlsZFNpemVNb2RpZmllckJ1aWxkZXI6OkNyZWF0ZShtb3JlX2J5dGVzKTsKLQotICBBU1NFUlRfRVEoY2hpbGRfc2l6ZV9tb2RpZmllci5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGNoaWxkX3NpemVfbW9kaWZpZXIuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hpbGRfc2l6ZV9tb2RpZmllci5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShjaGlsZF9zaXplX21vZGlmaWVyW2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgUGFyZW50U2l6ZU1vZGlmaWVyVmlldyBwYXJlbnRfdmlldyA9IFBhcmVudFNpemVNb2RpZmllclZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHBhcmVudF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUSh0d29fYnl0ZXMsIHBhcmVudF92aWV3LkdldFR3b0J5dGVzKCkpOwotCi0gIENoaWxkU2l6ZU1vZGlmaWVyVmlldyBjaGlsZF92aWV3ID0gQ2hpbGRTaXplTW9kaWZpZXJWaWV3OjpDcmVhdGUocGFyZW50X3ZpZXcpOwotICBBU1NFUlRfVFJVRShjaGlsZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgQVNTRVJUX0VRKG1vcmVfYnl0ZXMsIGNoaWxkX3ZpZXcuR2V0TW9yZUJ5dGVzKCkpOwotfQotCi1uYW1lc3BhY2UgewotdmVjdG9yPHVpbnQ4X3Q+IGZpeGVkX2FycmF5X2VudW17Ci0gICAgMHgwMSwgIC8vIE9ORQotICAgIDB4MDAsCi0gICAgMHgwMiwgIC8vIFRXTwotICAgIDB4MDAsCi0gICAgMHgwMSwgIC8vIE9ORV9UV08KLSAgICAweDAyLAotICAgIDB4MDIsICAvLyBUV09fVEhSRUUKLSAgICAweDAzLAotICAgIDB4ZmYsICAvLyBGRkZGCi0gICAgMHhmZiwKLX07Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEZpeGVkQXJyYXlFbnVtKSB7Ci0gIHN0ZDo6YXJyYXk8Rm9yQXJyYXlzLCA1PiBmaXhlZF9hcnJheXsKLSAgICAgIHtGb3JBcnJheXM6Ok9ORSwgRm9yQXJyYXlzOjpUV08sIEZvckFycmF5czo6T05FX1RXTywgRm9yQXJyYXlzOjpUV09fVEhSRUUsIEZvckFycmF5czo6RkZGRn19OwotICBhdXRvIHBhY2tldCA9IEZpeGVkQXJyYXlFbnVtQnVpbGRlcjo6Q3JlYXRlKGZpeGVkX2FycmF5KTsKLSAgQVNTRVJUX0VRKGZpeGVkX2FycmF5X2VudW0uc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhlIHBhY2tldCBpcyBpbmRlcGVuZGVudCBmcm9tIHRoZSBhcnJheS4KLSAgc3RkOjphcnJheTxGb3JBcnJheXMsIDU+IGNvcHlfYXJyYXkoZml4ZWRfYXJyYXkpOwotICBmaXhlZF9hcnJheVsxXSA9IEZvckFycmF5czo6T05FOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoZml4ZWRfYXJyYXlfZW51bS5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaXhlZF9hcnJheV9lbnVtLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGZpeGVkX2FycmF5X2VudW1baV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBGaXhlZEFycmF5RW51bVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0RW51bUFycmF5KCk7Ci0gIEFTU0VSVF9FUShjb3B5X2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3B5X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLCBjb3B5X2FycmF5W2ldKTsKLSAgfQotfQotCi1uYW1lc3BhY2UgewotdmVjdG9yPHVpbnQ4X3Q+IHNpemVkX2FycmF5X2VudW17Ci0gICAgMHgwYSwgIC8vIF9zaXplXwotICAgIDB4MDAsCi0gICAgMHgwMSwgIC8vIE9ORQotICAgIDB4MDAsCi0gICAgMHgwMiwgIC8vIFRXTwotICAgIDB4MDAsCi0gICAgMHgwMSwgIC8vIE9ORV9UV08KLSAgICAweDAyLAotICAgIDB4MDIsICAvLyBUV09fVEhSRUUKLSAgICAweDAzLAotICAgIDB4ZmYsICAvLyBGRkZGCi0gICAgMHhmZiwKLX07Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFNpemVkQXJyYXlFbnVtKSB7Ci0gIHN0ZDo6dmVjdG9yPEZvckFycmF5cz4gc2l6ZWRfYXJyYXl7Ci0gICAgICB7Rm9yQXJyYXlzOjpPTkUsIEZvckFycmF5czo6VFdPLCBGb3JBcnJheXM6Ok9ORV9UV08sIEZvckFycmF5czo6VFdPX1RIUkVFLCBGb3JBcnJheXM6OkZGRkZ9fTsKLSAgYXV0byBwYWNrZXQgPSBTaXplZEFycmF5RW51bUJ1aWxkZXI6OkNyZWF0ZShzaXplZF9hcnJheSk7Ci0gIEFTU0VSVF9FUShzaXplZF9hcnJheV9lbnVtLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIC8vIENvcHkgdGhlIG9yaWdpbmFsIHZlY3RvciBhbmQgbW9kaWZ5IGl0IHRvIG1ha2Ugc3VyZSB0aGUgcGFja2V0IGlzIGluZGVwZW5kZW50LgotICBzdGQ6OnZlY3RvcjxGb3JBcnJheXM+IGNvcHlfYXJyYXkoc2l6ZWRfYXJyYXkpOwotICBzaXplZF9hcnJheVsxXSA9IEZvckFycmF5czo6T05FOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoc2l6ZWRfYXJyYXlfZW51bS5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplZF9hcnJheV9lbnVtLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHNpemVkX2FycmF5X2VudW1baV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBTaXplZEFycmF5RW51bVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0RW51bUFycmF5KCk7Ci0gIEFTU0VSVF9FUShjb3B5X2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3B5X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLCBjb3B5X2FycmF5W2ldKTsKLSAgfQotfQotCi1uYW1lc3BhY2UgewotdmVjdG9yPHVpbnQ4X3Q+IGNvdW50X2FycmF5X2VudW17Ci0gICAgMHgwMywgIC8vIF9jb3VudF8KLSAgICAweDAxLCAgLy8gT05FCi0gICAgMHgwMCwKLSAgICAweDAyLCAgLy8gVFdPX1RIUkVFCi0gICAgMHgwMywKLSAgICAweGZmLCAgLy8gRkZGRgotICAgIDB4ZmYsCi19OwotfQotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RDb3VudEFycmF5RW51bSkgewotICBzdGQ6OnZlY3RvcjxGb3JBcnJheXM+IGNvdW50X2FycmF5e3tGb3JBcnJheXM6Ok9ORSwgRm9yQXJyYXlzOjpUV09fVEhSRUUsIEZvckFycmF5czo6RkZGRn19OwotICBhdXRvIHBhY2tldCA9IENvdW50QXJyYXlFbnVtQnVpbGRlcjo6Q3JlYXRlKGNvdW50X2FycmF5KTsKLSAgQVNTRVJUX0VRKGNvdW50X2FycmF5X2VudW0uc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShjb3VudF9hcnJheV9lbnVtLnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FycmF5X2VudW0uc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoY291bnRfYXJyYXlfZW51bVtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IENvdW50QXJyYXlFbnVtVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRFbnVtQXJyYXkoKTsKLSAgQVNTRVJUX0VRKGNvdW50X2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheVtpXSwgY291bnRfYXJyYXlbaV0pOwotICB9Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEZpeGVkU2l6ZUJ5dGVBcnJheSkgewotICBjb25zdGV4cHIgc3RkOjpzaXplX3QgYnl0ZV9hcnJheV9zaXplID0gMzI7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgYnl0ZV9hcnJheV9zaXplPiBieXRlX2FycmF5OwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBieXRlX2FycmF5X3NpemU7IGkrKykgYnl0ZV9hcnJheVtpXSA9IGk7Ci0KLSAgY29uc3RleHByIGludCB3b3JkX2FycmF5X3NpemUgPSA4OwotICBzdGQ6OmFycmF5PHVpbnQzMl90LCB3b3JkX2FycmF5X3NpemU+IHdvcmRfYXJyYXk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3b3JkX2FycmF5X3NpemU7IGkrKykgd29yZF9hcnJheVtpXSA9IGk7Ci0KLSAgYXV0byBwYWNrZXQgPSBQYWNrZXRXaXRoRml4ZWRBcnJheXNPZkJ5dGVzQnVpbGRlcjo6Q3JlYXRlKGJ5dGVfYXJyYXksIHdvcmRfYXJyYXkpOwotICBBU1NFUlRfRVEoMiAqICgyNTYgLyA4KSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoYnl0ZV9hcnJheV9zaXplICsgd29yZF9hcnJheV9zaXplICogc2l6ZW9mKHVpbnQzMl90KSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZV9hcnJheV9zaXplOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYnl0ZV9hcnJheVtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IFBhY2tldFdpdGhGaXhlZEFycmF5c09mQnl0ZXNWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gYXJyYXkgPSB2aWV3LkdldEZpeGVkMjU2Yml0SW5CeXRlcygpOwotICBBU1NFUlRfRVEoYnl0ZV9hcnJheS5zaXplKCksIGFycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0sIGJ5dGVfYXJyYXlbaV0pOwotICB9Ci0KLSAgYXV0byBkZWNvZGVkX3dvcmRfYXJyYXkgPSB2aWV3LkdldEZpeGVkMjU2Yml0SW5Xb3JkcygpOwotICBBU1NFUlRfRVEod29yZF9hcnJheS5zaXplKCksIGRlY29kZWRfd29yZF9hcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlY29kZWRfd29yZF9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh3b3JkX2FycmF5W2ldLCBkZWNvZGVkX3dvcmRfYXJyYXlbaV0pOwotICB9Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBvbmVfdmFyaWFibGV7Ci0gICAgMHgwMywgJ28nLCAnbicsICdlJywgIC8vICJvbmUiCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVWYXJpYWJsZUZpZWxkKSB7Ci0gIFZhcmlhYmxlIHZhcmlhYmxlX29uZXsib25lIn07Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVWYXJpYWJsZUJ1aWxkZXI6OkNyZWF0ZSh2YXJpYWJsZV9vbmUpOwotICBBU1NFUlRfRVEob25lX3ZhcmlhYmxlLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEob25lX3ZhcmlhYmxlLnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9uZV92YXJpYWJsZS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShvbmVfdmFyaWFibGVbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBPbmVWYXJpYWJsZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBvbmUgPSB2aWV3LkdldE9uZSgpOwotICBBU1NFUlRfRVEob25lLT5kYXRhLCB2YXJpYWJsZV9vbmUuZGF0YSk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBmb3VfdmFyaWFibGV7Ci0gICAgMHgwNCwgJ2YnLCAnbycsICd1JywgIC8vIHRvbyBzaG9ydAotfTsKLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0T25lVmFyaWFibGVGaWVsZFRvb1Nob3J0KSB7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oZm91X3ZhcmlhYmxlKTsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBPbmVWYXJpYWJsZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBvbmUgPSB2aWV3LkdldE9uZSgpOwotICBBU1NFUlRfRVEob25lLCBudWxscHRyKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IHNpemVkX2FycmF5X3ZhcmlhYmxlewotICAgIDB4MGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX3NpemVfCi0gICAgMHgwMywgJ28nLCAnbicsICdlJywgICAgICAgICAgICAvLyAib25lIgotICAgIDB4MDMsICd0JywgJ3cnLCAnbycsICAgICAgICAgICAgLy8gInR3byIKLSAgICAweDA1LCAndCcsICdoJywgJ3InLCAnZScsICdlJywgIC8vICJ0aHJlZSIKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFNpemVkQXJyYXlWYXJpYWJsZUxlbmd0aCkgewotICBzdGQ6OnZlY3RvcjxWYXJpYWJsZT4gc2l6ZWRfYXJyYXk7Ci0gIHNpemVkX2FycmF5LmVtcGxhY2VfYmFjaygib25lIik7Ci0gIHNpemVkX2FycmF5LmVtcGxhY2VfYmFjaygidHdvIik7Ci0gIHNpemVkX2FycmF5LmVtcGxhY2VfYmFjaygidGhyZWUiKTsKLQotICBhdXRvIHBhY2tldCA9IFNpemVkQXJyYXlWYXJpYWJsZUJ1aWxkZXI6OkNyZWF0ZShzaXplZF9hcnJheSk7Ci0gIEFTU0VSVF9FUShzaXplZF9hcnJheV92YXJpYWJsZS5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKHNpemVkX2FycmF5X3ZhcmlhYmxlLnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVkX2FycmF5X3ZhcmlhYmxlLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHNpemVkX2FycmF5X3ZhcmlhYmxlW2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gU2l6ZWRBcnJheVZhcmlhYmxlVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRWYXJpYWJsZUFycmF5KCk7Ci0gIEFTU0VSVF9FUShzaXplZF9hcnJheS5zaXplKCksIGFycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZWRfYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0uZGF0YSwgc2l6ZWRfYXJyYXlbaV0uZGF0YSk7Ci0gIH0KLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IHNpemVkX2FycmF5X3ZhcmlhYmxlX3Rvb19zaG9ydHsKLSAgICAweDBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9zaXplXwotICAgIDB4MDMsICdvJywgJ24nLCAnZScsICAgICAgICAgICAgLy8gIm9uZSIKLSAgICAweDAzLCAndCcsICd3JywgJ28nLCAgICAgICAgICAgIC8vICJ0d28iCi0gICAgMHgwNiwgJ3QnLCAnaCcsICdyJywgJ2UnLCAnZScsICAvLyAidGhyZWUiIG5lZWRzIGFub3RoZXIgbGV0dGVyIHRvIGJlIGxlbmd0aCA2Ci19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RTaXplZEFycmF5VmFyaWFibGVMZW5ndGhMYXN0QmFkKSB7Ci0gIHN0ZDo6dmVjdG9yPFZhcmlhYmxlPiBzaXplZF9hcnJheTsKLSAgc2l6ZWRfYXJyYXkuZW1wbGFjZV9iYWNrKCJvbmUiKTsKLSAgc2l6ZWRfYXJyYXkuZW1wbGFjZV9iYWNrKCJ0d28iKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihzaXplZF9hcnJheV92YXJpYWJsZV90b29fc2hvcnQpOwotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gU2l6ZWRBcnJheVZhcmlhYmxlVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRWYXJpYWJsZUFycmF5KCk7Ci0gIEFTU0VSVF9FUShzaXplZF9hcnJheS5zaXplKCksIGFycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZWRfYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0uZGF0YSwgc2l6ZWRfYXJyYXlbaV0uZGF0YSk7Ci0gIH0KLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IHNpemVkX2FycmF5X3ZhcmlhYmxlX2ZpcnN0X3Rvb19zaG9ydHsKLSAgICAweDBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9zaXplXwotICAgIDB4MDIsICdvJywgJ24nLCAnZScsICAgICAgICAgICAgLy8gIm9uIgotICAgIDB4MDMsICd0JywgJ3cnLCAnbycsICAgICAgICAgICAgLy8gInR3byIKLSAgICAweDA1LCAndCcsICdoJywgJ3InLCAnZScsICdlJywgIC8vICJ0aHJlZSIKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFNpemVkQXJyYXlWYXJpYWJsZUxlbmd0aEZpcnN0QmFkKSB7Ci0gIHN0ZDo6dmVjdG9yPFZhcmlhYmxlPiBzaXplZF9hcnJheTsKLSAgc2l6ZWRfYXJyYXkuZW1wbGFjZV9iYWNrKCJvbiIpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KHNpemVkX2FycmF5X3ZhcmlhYmxlX2ZpcnN0X3Rvb19zaG9ydCk7Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBTaXplZEFycmF5VmFyaWFibGVWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gYXJyYXkgPSB2aWV3LkdldFZhcmlhYmxlQXJyYXkoKTsKLSAgQVNTRVJUX0VRKHNpemVkX2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplZF9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheVtpXS5kYXRhLCBzaXplZF9hcnJheVtpXS5kYXRhKTsKLSAgfQotfQotCi12ZWN0b3I8dWludDhfdD4gZml4ZWRfYXJyYXlfdmFyaWFibGV7Ci0gICAgMHgwMywgJ28nLCAnbicsICdlJywgICAgICAgICAgICAvLyAib25lIgotICAgIDB4MDMsICd0JywgJ3cnLCAnbycsICAgICAgICAgICAgLy8gInR3byIKLSAgICAweDA1LCAndCcsICdoJywgJ3InLCAnZScsICdlJywgIC8vICJ0aHJlZSIKLSAgICAweDA0LCAnZicsICdvJywgJ3UnLCAncicsICAgICAgIC8vICJmb3VyIgotICAgIDB4MDQsICdmJywgJ2knLCAndicsICdlJywgICAgICAgLy8gImZpdmUiCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RGaXhlZEFycmF5VmFyaWFibGVMZW5ndGgpIHsKLSAgc3RkOjphcnJheTxWYXJpYWJsZSwgNT4gZml4ZWRfYXJyYXl7c3RkOjpzdHJpbmcoIm9uZSIpLCBzdGQ6OnN0cmluZygidHdvIiksIHN0ZDo6c3RyaW5nKCJ0aHJlZSIpLCBzdGQ6OnN0cmluZygiZm91ciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiZml2ZSIpfTsKLQotICBhdXRvIHBhY2tldCA9IEZpeGVkQXJyYXlWYXJpYWJsZUJ1aWxkZXI6OkNyZWF0ZShmaXhlZF9hcnJheSk7Ci0gIEFTU0VSVF9FUShmaXhlZF9hcnJheV92YXJpYWJsZS5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGZpeGVkX2FycmF5X3ZhcmlhYmxlLnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpeGVkX2FycmF5X3ZhcmlhYmxlLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGZpeGVkX2FycmF5X3ZhcmlhYmxlW2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gRml4ZWRBcnJheVZhcmlhYmxlVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRWYXJpYWJsZUFycmF5KCk7Ci0gIEFTU0VSVF9FUShmaXhlZF9hcnJheS5zaXplKCksIGFycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZml4ZWRfYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0uZGF0YSwgZml4ZWRfYXJyYXlbaV0uZGF0YSk7Ci0gIH0KLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IGZpeGVkX2FycmF5X3ZhcmlhYmxlX3Rvb19zaG9ydHsKLSAgICAweDAzLCAnbycsICduJywgJ2UnLCAgICAgICAgICAgIC8vICJvbmUiCi0gICAgMHgwMywgJ3QnLCAndycsICdvJywgICAgICAgICAgICAvLyAidHdvIgotICAgIDB4MDUsICd0JywgJ2gnLCAncicsICdlJywgJ2UnLCAgLy8gInRocmVlIgotICAgIDB4MDQsICdmJywgJ28nLCAndScsICdyJywgICAgICAgLy8gImZvdXIiCi0gICAgMHgwNSwgJ2YnLCAnaScsICd2JywgJ2UnLCAgICAgICAvLyAiZml2ZSIKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEZpeGVkQXJyYXlWYXJpYWJsZUxlbmd0aFRvb1Nob3J0KSB7Ci0gIHN0ZDo6YXJyYXk8VmFyaWFibGUsIDU+IGZpeGVkX2FycmF5e3N0ZDo6c3RyaW5nKCJvbmUiKSwgc3RkOjpzdHJpbmcoInR3byIpLCBzdGQ6OnN0cmluZygidGhyZWUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImZvdXIiKX07Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oZml4ZWRfYXJyYXlfdmFyaWFibGVfdG9vX3Nob3J0KTsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IEZpeGVkQXJyYXlWYXJpYWJsZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0VmFyaWFibGVBcnJheSgpOwotICBBU1NFUlRfRVEoZml4ZWRfYXJyYXkuc2l6ZSgpLCBhcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpeGVkX2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmRhdGEsIGZpeGVkX2FycmF5W2ldLmRhdGEpOwotICB9Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBjb3VudF9hcnJheV92YXJpYWJsZXsKLSAgICAweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9jb3VudF8KLSAgICAweDAzLCAnbycsICduJywgJ2UnLCAgICAgICAgICAgIC8vICJvbmUiCi0gICAgMHgwMywgJ3QnLCAndycsICdvJywgICAgICAgICAgICAvLyAidHdvIgotICAgIDB4MDUsICd0JywgJ2gnLCAncicsICdlJywgJ2UnLCAgLy8gInRocmVlIgotICAgIDB4MDQsICdmJywgJ28nLCAndScsICdyJywgICAgICAgLy8gImZvdXIiCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RDb3VudEFycmF5VmFyaWFibGVMZW5ndGgpIHsKLSAgc3RkOjp2ZWN0b3I8VmFyaWFibGU+IGNvdW50X2FycmF5OwotICBjb3VudF9hcnJheS5lbXBsYWNlX2JhY2soIm9uZSIpOwotICBjb3VudF9hcnJheS5lbXBsYWNlX2JhY2soInR3byIpOwotICBjb3VudF9hcnJheS5lbXBsYWNlX2JhY2soInRocmVlIik7Ci0gIGNvdW50X2FycmF5LmVtcGxhY2VfYmFjaygiZm91ciIpOwotCi0gIGF1dG8gcGFja2V0ID0gQ291bnRBcnJheVZhcmlhYmxlQnVpbGRlcjo6Q3JlYXRlKGNvdW50X2FycmF5KTsKLSAgQVNTRVJUX0VRKGNvdW50X2FycmF5X3ZhcmlhYmxlLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoY291bnRfYXJyYXlfdmFyaWFibGUuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnRfYXJyYXlfdmFyaWFibGUuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoY291bnRfYXJyYXlfdmFyaWFibGVbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBDb3VudEFycmF5VmFyaWFibGVWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gYXJyYXkgPSB2aWV3LkdldFZhcmlhYmxlQXJyYXkoKTsKLSAgQVNTRVJUX0VRKGNvdW50X2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheVtpXS5kYXRhLCBjb3VudF9hcnJheVtpXS5kYXRhKTsKLSAgfQotfQotCi12ZWN0b3I8dWludDhfdD4gY291bnRfYXJyYXlfdmFyaWFibGVfZXh0cmF7Ci0gICAgMHgwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfY291bnRfCi0gICAgMHgwMywgJ28nLCAnbicsICdlJywgICAgICAgICAgICAvLyAib25lIgotICAgIDB4MDMsICd0JywgJ3cnLCAnbycsICAgICAgICAgICAgLy8gInR3byIKLSAgICAweDA1LCAndCcsICdoJywgJ3InLCAnZScsICdlJywgIC8vICJ0aHJlZSIKLSAgICAweDA0LCAnZicsICdvJywgJ3UnLCAncicsICAgICAgIC8vICJmb3VyIgotICAgIDB4MDQsICd4JywgJ3QnLCAncicsICdhJywgICAgICAgLy8gInh0cmEiCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RDb3VudEFycmF5VmFyaWFibGVMZW5ndGhFeHRyYURhdGEpIHsKLSAgc3RkOjp2ZWN0b3I8VmFyaWFibGU+IGNvdW50X2FycmF5OwotICBjb3VudF9hcnJheS5lbXBsYWNlX2JhY2soIm9uZSIpOwotICBjb3VudF9hcnJheS5lbXBsYWNlX2JhY2soInR3byIpOwotICBjb3VudF9hcnJheS5lbXBsYWNlX2JhY2soInRocmVlIik7Ci0gIGNvdW50X2FycmF5LmVtcGxhY2VfYmFjaygiZm91ciIpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGNvdW50X2FycmF5X3ZhcmlhYmxlX2V4dHJhKTsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IENvdW50QXJyYXlWYXJpYWJsZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0VmFyaWFibGVBcnJheSgpOwotICBBU1NFUlRfRVEoY291bnRfYXJyYXkuc2l6ZSgpLCBhcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmRhdGEsIGNvdW50X2FycmF5W2ldLmRhdGEpOwotICB9Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBjb3VudF9hcnJheV92YXJpYWJsZV90b29fZmV3ewotICAgIDB4MDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX2NvdW50XwotICAgIDB4MDMsICdvJywgJ24nLCAnZScsICAgICAgICAgICAgLy8gIm9uZSIKLSAgICAweDAzLCAndCcsICd3JywgJ28nLCAgICAgICAgICAgIC8vICJ0d28iCi0gICAgMHgwNSwgJ3QnLCAnaCcsICdyJywgJ2UnLCAnZScsICAvLyAidGhyZWUiCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RDb3VudEFycmF5VmFyaWFibGVMZW5ndGhNaXNzaW5nRGF0YSkgewotICBzdGQ6OnZlY3RvcjxWYXJpYWJsZT4gY291bnRfYXJyYXk7Ci0gIGNvdW50X2FycmF5LmVtcGxhY2VfYmFjaygib25lIik7Ci0gIGNvdW50X2FycmF5LmVtcGxhY2VfYmFjaygidHdvIik7Ci0gIGNvdW50X2FycmF5LmVtcGxhY2VfYmFjaygidGhyZWUiKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pihjb3VudF9hcnJheV92YXJpYWJsZV90b29fZmV3KTsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IENvdW50QXJyYXlWYXJpYWJsZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0VmFyaWFibGVBcnJheSgpOwotICBBU1NFUlRfRVEoY291bnRfYXJyYXkuc2l6ZSgpLCBhcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmRhdGEsIGNvdW50X2FycmF5W2ldLmRhdGEpOwotICB9Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBvbmVfc3RydWN0ewotICAgIDB4MDEsIDB4MDIsIDB4MDMsICAvLyBpZCA9IDB4MDEsIGNvdW50ID0gMHgwMzAyCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVTdHJ1Y3QpIHsKLSAgVHdvUmVsYXRlZE51bWJlcnMgdHJuOwotICB0cm4uaWRfID0gMTsKLSAgdHJuLmNvdW50XyA9IDB4MDMwMjsKLQotICBhdXRvIHBhY2tldCA9IE9uZVN0cnVjdEJ1aWxkZXI6OkNyZWF0ZSh0cm4pOwotICBBU1NFUlRfRVEob25lX3N0cnVjdC5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICAvLyBDb3B5IHRoZSBvcmlnaW5hbCBzdHJ1Y3QsIHRoZW4gbW9kaWZ5IGl0IHRvIHZlcmlmeSBpbmRlcGVuZGVuY2UgZnJvbSB0aGUgcGFja2V0LgotICBUd29SZWxhdGVkTnVtYmVycyBjb3B5X3Rybih0cm4pOwotICB0cm4uaWRfID0gMjsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKG9uZV9zdHJ1Y3Quc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb25lX3N0cnVjdC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShvbmVfc3RydWN0W2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gT25lU3RydWN0Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIG9uZSA9IHZpZXcuR2V0T25lKCk7Ci0gIEFTU0VSVF9FUShvbmUuaWRfLCBjb3B5X3Rybi5pZF8pOwotICBBU1NFUlRfRVEob25lLmNvdW50XywgY29weV90cm4uY291bnRfKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IHR3b19zdHJ1Y3RzewotICAgIDB4MDEsIDB4MDEsIDB4MDIsICAvLyBpZCwgaWQgKiAweDAyMDEKLSAgICAweDAyLCAweDAyLCAweDA0LAotfTsKLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0VHdvU3RydWN0cykgewotICBzdGQ6OnZlY3RvcjxUd29SZWxhdGVkTnVtYmVycz4gY291bnRfYXJyYXk7Ci0gIGZvciAodWludDhfdCBpID0gMTsgaSA8IDM7IGkrKykgewotICAgIFR3b1JlbGF0ZWROdW1iZXJzIHRybjsKLSAgICB0cm4uaWRfID0gaTsKLSAgICB0cm4uY291bnRfID0gMHgwMjAxICogaTsKLSAgICBjb3VudF9hcnJheS5wdXNoX2JhY2sodHJuKTsKLSAgfQotCi0gIGF1dG8gcGFja2V0ID0gVHdvU3RydWN0c0J1aWxkZXI6OkNyZWF0ZShjb3VudF9hcnJheVswXSwgY291bnRfYXJyYXlbMV0pOwotICBBU1NFUlRfRVEodHdvX3N0cnVjdHMuc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUSh0d29fc3RydWN0cy5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0d29fc3RydWN0cy5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh0d29fc3RydWN0c1tpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IFR3b1N0cnVjdHNWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gb25lID0gdmlldy5HZXRPbmUoKTsKLSAgQVNTRVJUX0VRKG9uZS5pZF8sIGNvdW50X2FycmF5WzBdLmlkXyk7Ci0gIEFTU0VSVF9FUShvbmUuY291bnRfLCBjb3VudF9hcnJheVswXS5jb3VudF8pOwotICBhdXRvIHR3byA9IHZpZXcuR2V0VHdvKCk7Ci0gIEFTU0VSVF9FUSh0d28uaWRfLCBjb3VudF9hcnJheVsxXS5pZF8pOwotICBBU1NFUlRfRVEodHdvLmNvdW50XywgY291bnRfYXJyYXlbMV0uY291bnRfKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IGFycmF5X29yX3ZlY3Rvcl9vZl9zdHJ1Y3R7Ci0gICAgMHgwNCwgICAgICAgICAgICAgIC8vIF9jb3VudF8KLSAgICAweDAxLCAweDAxLCAweDAyLCAgLy8gaWQsIGlkICogMHgwMjAxCi0gICAgMHgwMiwgMHgwMiwgMHgwNCwgMHgwMywgMHgwMywgMHgwNiwgMHgwNCwgMHgwNCwgMHgwOCwKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdFZlY3Rvck9mU3RydWN0KSB7Ci0gIHN0ZDo6dmVjdG9yPFR3b1JlbGF0ZWROdW1iZXJzPiBjb3VudF9hcnJheTsKLSAgZm9yICh1aW50OF90IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgVHdvUmVsYXRlZE51bWJlcnMgdHJuOwotICAgIHRybi5pZF8gPSBpOwotICAgIHRybi5jb3VudF8gPSAweDAyMDEgKiBpOwotICAgIGNvdW50X2FycmF5LnB1c2hfYmFjayh0cm4pOwotICB9Ci0KLSAgLy8gTWFrZSBhIGNvcHkKLSAgc3RkOjp2ZWN0b3I8VHdvUmVsYXRlZE51bWJlcnM+IGNvcHlfYXJyYXkoY291bnRfYXJyYXkpOwotCi0gIGF1dG8gcGFja2V0ID0gVmVjdG9yT2ZTdHJ1Y3RCdWlsZGVyOjpDcmVhdGUoY291bnRfYXJyYXkpOwotCi0gIC8vIENoYW5nZSB0aGUgb3JpZ2luYWwgdmVjdG9yIHRvIG1ha2Ugc3VyZSBhIGNvcHkgd2FzIG1hZGUuCi0gIGNvdW50X2FycmF5WzBdLmlkXyA9IGNvdW50X2FycmF5WzBdLmlkXyArIDE7Ci0KLSAgQVNTRVJUX0VRKGFycmF5X29yX3ZlY3Rvcl9vZl9zdHJ1Y3Quc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShhcnJheV9vcl92ZWN0b3Jfb2Zfc3RydWN0LnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5X29yX3ZlY3Rvcl9vZl9zdHJ1Y3Quc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlfb3JfdmVjdG9yX29mX3N0cnVjdFtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IFZlY3Rvck9mU3RydWN0Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRBcnJheSgpOwotICBBU1NFUlRfRVEoY29weV9hcnJheS5zaXplKCksIGFycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29weV9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheVtpXS5pZF8sIGNvcHlfYXJyYXlbaV0uaWRfKTsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0uY291bnRfLCBjb3B5X2FycmF5W2ldLmNvdW50Xyk7Ci0gIH0KLX0KLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0QXJyYXlPZlN0cnVjdCkgewotICBzdGQ6OmFycmF5PFR3b1JlbGF0ZWROdW1iZXJzLCA0PiBjb3VudF9hcnJheTsKLSAgZm9yICh1aW50OF90IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgVHdvUmVsYXRlZE51bWJlcnMgdHJuOwotICAgIHRybi5pZF8gPSBpOwotICAgIHRybi5jb3VudF8gPSAweDAyMDEgKiBpOwotICAgIGNvdW50X2FycmF5W2kgLSAxXSA9IHRybjsKLSAgfQotCi0gIC8vIE1ha2UgYSBjb3B5Ci0gIHN0ZDo6YXJyYXk8VHdvUmVsYXRlZE51bWJlcnMsIDQ+IGNvcHlfYXJyYXkoY291bnRfYXJyYXkpOwotCi0gIGF1dG8gcGFja2V0ID0gQXJyYXlPZlN0cnVjdEJ1aWxkZXI6OkNyZWF0ZSg0LCBjb3VudF9hcnJheSk7Ci0KLSAgLy8gQ2hhbmdlIHRoZSBvcmlnaW5hbCB2ZWN0b3IgdG8gbWFrZSBzdXJlIGEgY29weSB3YXMgbWFkZS4KLSAgY291bnRfYXJyYXlbMF0uaWRfID0gY291bnRfYXJyYXlbMF0uaWRfICsgMTsKLQotICBBU1NFUlRfRVEoYXJyYXlfb3JfdmVjdG9yX29mX3N0cnVjdC5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGFycmF5X29yX3ZlY3Rvcl9vZl9zdHJ1Y3Quc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlfb3JfdmVjdG9yX29mX3N0cnVjdC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheV9vcl92ZWN0b3Jfb2Zfc3RydWN0W2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gQXJyYXlPZlN0cnVjdFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0QXJyYXkoKTsKLSAgQVNTRVJUX0VRKGNvcHlfYXJyYXkuc2l6ZSgpLCBhcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvcHlfYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0uaWRfLCBjb3B5X2FycmF5W2ldLmlkXyk7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmNvdW50XywgY29weV9hcnJheVtpXS5jb3VudF8pOwotICB9Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBvbmVfZml4ZWRfdHlwZXNfc3RydWN0ewotICAgIDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VyX2JpdHMgPSBGSVZFLCByZXNlcnZlZAotICAgIDB4ZjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfZml4ZWRfCi0gICAgMHgwZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlkID0gMHgwZAotICAgIDB4MDEsIDB4MDIsIDB4MDMsICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSA9IHsgMSwgMiwgM30KLSAgICAweDA2LCAweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZV9jaGVja3N1bQotICAgIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsICAvLyBzaXhfYnl0ZXMKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdE9uZUZpeGVkVHlwZXNTdHJ1Y3QpIHsKLSAgU3RydWN0V2l0aEZpeGVkVHlwZXMgc3dmOwotICBzd2YuZm91cl9iaXRzXyA9IEZvdXJCaXRzOjpGSVZFOwotICBzd2YuaWRfID0gMHgwZDsKLSAgc3dmLmFycmF5XyA9IHt7MHgwMSwgMHgwMiwgMHgwM319OwotICBzd2Yuc2l4X2J5dGVzXyA9IFNpeEJ5dGVze3sweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2fX07Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVGaXhlZFR5cGVzU3RydWN0QnVpbGRlcjo6Q3JlYXRlKHN3Zik7Ci0gIEFTU0VSVF9FUShvbmVfZml4ZWRfdHlwZXNfc3RydWN0LnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEob25lX2ZpeGVkX3R5cGVzX3N0cnVjdC5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvbmVfZml4ZWRfdHlwZXNfc3RydWN0LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKG9uZV9maXhlZF90eXBlc19zdHJ1Y3RbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBPbmVGaXhlZFR5cGVzU3RydWN0Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIG9uZSA9IHZpZXcuR2V0T25lKCk7Ci0gIEFTU0VSVF9FUShvbmUuZm91cl9iaXRzXywgc3dmLmZvdXJfYml0c18pOwotICBBU1NFUlRfRVEob25lLmlkXywgc3dmLmlkXyk7Ci0gIEFTU0VSVF9FUShvbmUuYXJyYXlfLCBzd2YuYXJyYXlfKTsKLSAgQVNTRVJUX0VRKG9uZS5zaXhfYnl0ZXNfLCBzd2Yuc2l4X2J5dGVzXyk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBhcnJheV9vZl9zdHJ1Y3RfYW5kX2Fub3RoZXJ7Ci0gICAgMHgwMywgICAgICAgICAgICAgIC8vIF9jb3VudF8KLSAgICAweDAxLCAweDAxLCAweDAyLCAgLy8gaWQsIGlkICogMHgwMjAxCi0gICAgMHgwMiwgMHgwMiwgMHgwNCwgIC8vIDIKLSAgICAweDAzLCAweDAzLCAweDA2LCAgLy8gMwotICAgIDB4MDQsIDB4MDQsIDB4MDgsICAvLyBBbm90aGVyCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RBcnJheU9mU3RydWN0QW5kQW5vdGhlcikgewotICBzdGQ6OnZlY3RvcjxUd29SZWxhdGVkTnVtYmVycz4gY291bnRfYXJyYXk7Ci0gIGZvciAodWludDhfdCBpID0gMTsgaSA8IDQ7IGkrKykgewotICAgIFR3b1JlbGF0ZWROdW1iZXJzIHRybjsKLSAgICB0cm4uaWRfID0gaTsKLSAgICB0cm4uY291bnRfID0gMHgwMjAxICogaTsKLSAgICBjb3VudF9hcnJheS5wdXNoX2JhY2sodHJuKTsKLSAgfQotICBUd29SZWxhdGVkTnVtYmVycyBhbm90aGVyOwotICBhbm90aGVyLmlkXyA9IDQ7Ci0gIGFub3RoZXIuY291bnRfID0gMHgwMjAxICogNDsKLQotICBhdXRvIHBhY2tldCA9IEFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyQnVpbGRlcjo6Q3JlYXRlKGNvdW50X2FycmF5LCBhbm90aGVyKTsKLSAgQVNTRVJUX0VRKGFycmF5X29yX3ZlY3Rvcl9vZl9zdHJ1Y3Quc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShhcnJheV9vZl9zdHJ1Y3RfYW5kX2Fub3RoZXIuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlfb2Zfc3RydWN0X2FuZF9hbm90aGVyLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5X29mX3N0cnVjdF9hbmRfYW5vdGhlcltpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IEFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRBcnJheSgpOwotICBBU1NFUlRfRVEoY291bnRfYXJyYXkuc2l6ZSgpLCBhcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmlkXywgY291bnRfYXJyYXlbaV0uaWRfKTsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0uY291bnRfLCBjb3VudF9hcnJheVtpXS5jb3VudF8pOwotICB9Ci0gIGF1dG8gbm90aGVyID0gdmlldy5HZXRBbm90aGVyKCk7Ci0gIEFTU0VSVF9FUShub3RoZXIuaWRfLCBhbm90aGVyLmlkXyk7Ci0gIEFTU0VSVF9FUShub3RoZXIuY291bnRfLCBhbm90aGVyLmNvdW50Xyk7Ci19Ci0KLURFRklORV9BTkRfSU5TVEFOVElBVEVfT25lQXJyYXlPZlN0cnVjdEFuZEFub3RoZXJTdHJ1Y3RSZWZsZWN0aW9uVGVzdChhcnJheV9vZl9zdHJ1Y3RfYW5kX2Fub3RoZXIpOwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVBcnJheU9mU3RydWN0QW5kQW5vdGhlclN0cnVjdCkgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihhcnJheV9vZl9zdHJ1Y3RfYW5kX2Fub3RoZXIpOwotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gT25lQXJyYXlPZlN0cnVjdEFuZEFub3RoZXJTdHJ1Y3RWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gb25lID0gdmlldy5HZXRPbmUoKTsKLSAgQVNTRVJUX0VRKG9uZS5hcnJheV8uc2l6ZSgpLCAzKTsKLSAgQVNTRVJUX0VRKG9uZS5hbm90aGVyXy5pZF8sIDQpOwotICBBU1NFUlRfRVEob25lLmFub3RoZXJfLmNvdW50XywgMHgwODA0KTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IHNpemVkX2FycmF5X29mX3N0cnVjdF9hbmRfYW5vdGhlcnsKLSAgICAweDA5LCAgICAgICAgICAgICAgLy8gX3NpemVfCi0gICAgMHgwMSwgMHgwMSwgMHgwMiwgIC8vIGlkLCBpZCAqIDB4MDIwMQotICAgIDB4MDIsIDB4MDIsIDB4MDQsICAvLyAyCi0gICAgMHgwMywgMHgwMywgMHgwNiwgIC8vIDMKLSAgICAweDA0LCAweDA0LCAweDA4LCAgLy8gQW5vdGhlcgotfTsKLQotREVGSU5FX0FORF9JTlNUQU5USUFURV9PbmVTaXplZEFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyU3RydWN0UmVmbGVjdGlvblRlc3Qoc2l6ZWRfYXJyYXlfb2Zfc3RydWN0X2FuZF9hbm90aGVyKTsKLQotdmVjdG9yPHVpbnQ4X3Q+IGJpdF9maWVsZF9ncm91cF9wYWNrZXR7Ci0gICAgLy8gc2V2ZW5fYml0c18gPSAweDc3LCBzdHJhZGRsZV8gPSAweDUsIGZpdmVfYml0c18gPSAweDE1Ci0gICAgMHhmNywgIC8vIDB4NzcgfCAoMHg1ICYgMHgxKSA8PCA3Ci0gICAgMHhhYSwgIC8vICAweDE1IDw8IDMgfCAoMHg1ID4+IDEpCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RCaXRGaWVsZEdyb3VwUGFja2V0KSB7Ci0gIHVpbnQ4X3Qgc2V2ZW5fYml0cyA9IDB4Nzc7Ci0gIHVpbnQ4X3Qgc3RyYWRkbGUgPSAweDU7Ci0gIHVpbnQ4X3QgZml2ZV9iaXRzID0gMHgxNTsKLQotICBhdXRvIHBhY2tldCA9IEJpdEZpZWxkR3JvdXBQYWNrZXRCdWlsZGVyOjpDcmVhdGUoc2V2ZW5fYml0cywgc3RyYWRkbGUsIGZpdmVfYml0cyk7Ci0gIEFTU0VSVF9FUShiaXRfZmllbGRfZ3JvdXBfcGFja2V0LnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoYml0X2ZpZWxkX2dyb3VwX3BhY2tldC5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiaXRfZmllbGRfZ3JvdXBfcGFja2V0LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGJpdF9maWVsZF9ncm91cF9wYWNrZXRbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBCaXRGaWVsZEdyb3VwUGFja2V0Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoc2V2ZW5fYml0cywgdmlldy5HZXRTZXZlbkJpdHMoKSk7Ci0gIEFTU0VSVF9FUShzdHJhZGRsZSwgdmlldy5HZXRTdHJhZGRsZSgpKTsKLSAgQVNTRVJUX0VRKGZpdmVfYml0cywgdmlldy5HZXRGaXZlQml0cygpKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IGJpdF9maWVsZF9wYWNrZXR7Ci0gICAgLy8gc2V2ZW5fYml0c18gPSAweDc3LCBzdHJhZGRsZV8gPSAweDUsIGZpdmVfYml0c18gPSAweDE1Ci0gICAgMHhmNywgIC8vIDB4NzcgfCAoMHg1ICYgMHgxKSA8PCA3Ci0gICAgMHhhYSwgIC8vICAweDE1IDw8IDMgfCAoMHg1ID4+IDEpCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RCaXRGaWVsZFBhY2tldCkgewotICBCaXRGaWVsZCBiaXRfZmllbGQ7Ci0gIGJpdF9maWVsZC5zZXZlbl9iaXRzXyA9IDB4Nzc7Ci0gIGJpdF9maWVsZC5zdHJhZGRsZV8gPSAweDU7Ci0gIGJpdF9maWVsZC5maXZlX2JpdHNfID0gMHgxNTsKLQotICBhdXRvIHBhY2tldCA9IEJpdEZpZWxkUGFja2V0QnVpbGRlcjo6Q3JlYXRlKGJpdF9maWVsZCk7Ci0gIEFTU0VSVF9FUShiaXRfZmllbGRfcGFja2V0LnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoYml0X2ZpZWxkX3BhY2tldC5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiaXRfZmllbGRfcGFja2V0LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGJpdF9maWVsZF9wYWNrZXRbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBCaXRGaWVsZFBhY2tldFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQml0RmllbGQgYmYgPSB2aWV3LkdldEJpdEZpZWxkKCk7Ci0gIEFTU0VSVF9FUShiZi5zZXZlbl9iaXRzXywgYml0X2ZpZWxkLnNldmVuX2JpdHNfKTsKLSAgQVNTRVJUX0VRKGJmLnN0cmFkZGxlXywgYml0X2ZpZWxkLnN0cmFkZGxlXyk7Ci0gIEFTU0VSVF9FUShiZi5maXZlX2JpdHNfLCBiaXRfZmllbGQuZml2ZV9iaXRzXyk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBiaXRfZmllbGRfZ3JvdXBfYWZ0ZXJfdW5zaXplZF9hcnJheV9wYWNrZXR7Ci0gICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgIC8vIGJ5dGUgYXJyYXkKLSAgICAvLyBzZXZlbl9iaXRzXyA9IDB4NzcsIHN0cmFkZGxlXyA9IDB4NSwgZml2ZV9iaXRzXyA9IDB4MTUKLSAgICAweGY3LCAgLy8gMHg3NyB8ICgweDUgJiAweDEpIDw8IDcKLSAgICAweGFhLCAgLy8gIDB4MTUgPDwgMyB8ICgweDUgPj4gMSkKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEJpdEZpZWxkR3JvdXBBZnRlclVuc2l6ZWRBcnJheVBhY2tldCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb3VudF9hcnJheTsKLSAgZm9yICh1aW50OF90IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgY291bnRfYXJyYXkucHVzaF9iYWNrKGkpOwotICB9Ci0gIHVpbnQ4X3Qgc2V2ZW5fYml0cyA9IDB4Nzc7Ci0gIHVpbnQ4X3Qgc3RyYWRkbGUgPSAweDU7Ci0gIHVpbnQ4X3QgZml2ZV9iaXRzID0gMHgxNTsKLQotICBhdXRvIHBhY2tldCA9IEJpdEZpZWxkR3JvdXBBZnRlclVuc2l6ZWRBcnJheVBhY2tldEJ1aWxkZXI6OkNyZWF0ZShjb3VudF9hcnJheSwgc2V2ZW5fYml0cywgc3RyYWRkbGUsIGZpdmVfYml0cyk7Ci0gIEFTU0VSVF9FUShiaXRfZmllbGRfZ3JvdXBfYWZ0ZXJfdW5zaXplZF9hcnJheV9wYWNrZXQuc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShiaXRfZmllbGRfZ3JvdXBfYWZ0ZXJfdW5zaXplZF9hcnJheV9wYWNrZXQuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYml0X2ZpZWxkX2dyb3VwX2FmdGVyX3Vuc2l6ZWRfYXJyYXlfcGFja2V0LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGJpdF9maWVsZF9ncm91cF9hZnRlcl91bnNpemVkX2FycmF5X3BhY2tldFtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gcGF5bG9hZF92aWV3ID0gQml0RmllbGRHcm91cEFmdGVyUGF5bG9hZFBhY2tldFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHBheWxvYWRfdmlldy5Jc1ZhbGlkKCkpOwotICBFWFBFQ1RfRVEoc2V2ZW5fYml0cywgcGF5bG9hZF92aWV3LkdldFNldmVuQml0cygpKTsKLSAgRVhQRUNUX0VRKHN0cmFkZGxlLCBwYXlsb2FkX3ZpZXcuR2V0U3RyYWRkbGUoKSk7Ci0gIEVYUEVDVF9FUShmaXZlX2JpdHMsIHBheWxvYWRfdmlldy5HZXRGaXZlQml0cygpKTsKLQotICBhdXRvIHZpZXcgPSBCaXRGaWVsZEdyb3VwQWZ0ZXJVbnNpemVkQXJyYXlQYWNrZXRWaWV3OjpDcmVhdGUocGF5bG9hZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFycmF5ID0gdmlldy5HZXRBcnJheSgpOwotICBBU1NFUlRfRVEoY291bnRfYXJyYXkuc2l6ZSgpLCBhcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLCBjb3VudF9hcnJheVtpXSk7Ci0gIH0KLSAgQVNTRVJUX0VRKHNldmVuX2JpdHMsIHZpZXcuR2V0U2V2ZW5CaXRzKCkpOwotICBBU1NFUlRfRVEoc3RyYWRkbGUsIHZpZXcuR2V0U3RyYWRkbGUoKSk7Ci0gIEFTU0VSVF9FUShmaXZlX2JpdHMsIHZpZXcuR2V0Rml2ZUJpdHMoKSk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBiaXRfZmllbGRfYWZ0ZXJfdW5zaXplZF9hcnJheV9wYWNrZXR7Ci0gICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgIC8vIGJ5dGUgYXJyYXkKLSAgICAvLyBzZXZlbl9iaXRzXyA9IDB4NzcsIHN0cmFkZGxlXyA9IDB4NSwgZml2ZV9iaXRzXyA9IDB4MTUKLSAgICAweGY3LCAgLy8gMHg3NyB8ICgweDUgJiAweDEpIDw8IDcKLSAgICAweGFhLCAgLy8gIDB4MTUgPDwgMyB8ICgweDUgPj4gMSkKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEJpdEZpZWxkQWZ0ZXJVbnNpemVkQXJyYXlQYWNrZXQpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY291bnRfYXJyYXk7Ci0gIGZvciAodWludDhfdCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgIGNvdW50X2FycmF5LnB1c2hfYmFjayhpKTsKLSAgfQotICBCaXRGaWVsZCBiaXRfZmllbGQ7Ci0gIGJpdF9maWVsZC5zZXZlbl9iaXRzXyA9IDB4Nzc7Ci0gIGJpdF9maWVsZC5zdHJhZGRsZV8gPSAweDU7Ci0gIGJpdF9maWVsZC5maXZlX2JpdHNfID0gMHgxNTsKLQotICBhdXRvIHBhY2tldCA9IEJpdEZpZWxkQWZ0ZXJVbnNpemVkQXJyYXlQYWNrZXRCdWlsZGVyOjpDcmVhdGUoY291bnRfYXJyYXksIGJpdF9maWVsZCk7Ci0gIEFTU0VSVF9FUShiaXRfZmllbGRfYWZ0ZXJfdW5zaXplZF9hcnJheV9wYWNrZXQuc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShiaXRfZmllbGRfYWZ0ZXJfdW5zaXplZF9hcnJheV9wYWNrZXQuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYml0X2ZpZWxkX2FmdGVyX3Vuc2l6ZWRfYXJyYXlfcGFja2V0LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGJpdF9maWVsZF9hZnRlcl91bnNpemVkX2FycmF5X3BhY2tldFtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gcGF5bG9hZF92aWV3ID0gQml0RmllbGRBZnRlclBheWxvYWRQYWNrZXRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRShwYXlsb2FkX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQml0RmllbGQgcGFyZW50X2JmID0gcGF5bG9hZF92aWV3LkdldEJpdEZpZWxkKCk7Ci0gIEFTU0VSVF9FUShwYXJlbnRfYmYuc2V2ZW5fYml0c18sIGJpdF9maWVsZC5zZXZlbl9iaXRzXyk7Ci0gIEFTU0VSVF9FUShwYXJlbnRfYmYuc3RyYWRkbGVfLCBiaXRfZmllbGQuc3RyYWRkbGVfKTsKLSAgQVNTRVJUX0VRKHBhcmVudF9iZi5maXZlX2JpdHNfLCBiaXRfZmllbGQuZml2ZV9iaXRzXyk7Ci0KLSAgYXV0byB2aWV3ID0gQml0RmllbGRBZnRlclVuc2l6ZWRBcnJheVBhY2tldFZpZXc6OkNyZWF0ZShwYXlsb2FkX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gYXJyYXkgPSB2aWV3LkdldEFycmF5KCk7Ci0gIEFTU0VSVF9FUShjb3VudF9hcnJheS5zaXplKCksIGFycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnRfYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlbaV0sIGNvdW50X2FycmF5W2ldKTsKLSAgfQotICBCaXRGaWVsZCBiZiA9IHZpZXcuR2V0Qml0RmllbGQoKTsKLSAgQVNTRVJUX0VRKGJmLnNldmVuX2JpdHNfLCBiaXRfZmllbGQuc2V2ZW5fYml0c18pOwotICBBU1NFUlRfRVEoYmYuc3RyYWRkbGVfLCBiaXRfZmllbGQuc3RyYWRkbGVfKTsKLSAgQVNTRVJUX0VRKGJmLmZpdmVfYml0c18sIGJpdF9maWVsZC5maXZlX2JpdHNfKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IGJpdF9maWVsZF9hcnJheV9wYWNrZXR7Ci0gICAgMHgwNiwgIC8vIF9zaXplXyhhcnJheSkKLSAgICAvLyBzZXZlbl9iaXRzXyA9IDB4NzcsIHN0cmFkZGxlXyA9IDB4NSwgZml2ZV9iaXRzXyA9IDB4MTUKLSAgICAweGY3LCAgLy8gMHg3NyB8ICgweDUgJiAweDEpIDw8IDcKLSAgICAweGFhLCAgLy8gIDB4MTUgPDwgMyB8ICgweDUgPj4gMSkKLQotICAgIC8vIHNldmVuX2JpdHNfID0gMHg3OCwgc3RyYWRkbGVfID0gMHg2LCBmaXZlX2JpdHNfID0gMHgxNgotICAgIDB4NzgsICAvLyAweDc4IHwgKDB4NiAmIDB4MSkgPDwgNwotICAgIDB4YjMsICAvLyAgMHgxNiA8PCAzIHwgKDB4NiA+PiAxKQotCi0gICAgLy8gc2V2ZW5fYml0c18gPSAweDc5LCBzdHJhZGRsZV8gPSAweDcsIGZpdmVfYml0c18gPSAweDE3Ci0gICAgMHhmOSwgIC8vIDB4NzkgfCAoMHg3ICYgMHgxKSA8PCA3Ci0gICAgMHhiYiwgIC8vICAweDE3IDw8IDMgfCAoMHg3ID4+IDEpCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RCaXRGaWVsZEFycmF5UGFja2V0KSB7Ci0gIHN0ZDo6dmVjdG9yPEJpdEZpZWxkPiBjb3VudF9hcnJheTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBCaXRGaWVsZCBiZjsKLSAgICBiZi5zZXZlbl9iaXRzXyA9IDB4NzcgKyBpOwotICAgIGJmLnN0cmFkZGxlXyA9IDB4NSArIGk7Ci0gICAgYmYuZml2ZV9iaXRzXyA9IDB4MTUgKyBpOwotICAgIGNvdW50X2FycmF5LnB1c2hfYmFjayhiZik7Ci0gIH0KLQotICBhdXRvIHBhY2tldCA9IEJpdEZpZWxkQXJyYXlQYWNrZXRCdWlsZGVyOjpDcmVhdGUoY291bnRfYXJyYXkpOwotICBBU1NFUlRfRVEoYml0X2ZpZWxkX2FycmF5X3BhY2tldC5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGJpdF9maWVsZF9hcnJheV9wYWNrZXQuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYml0X2ZpZWxkX2FycmF5X3BhY2tldC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShiaXRfZmllbGRfYXJyYXlfcGFja2V0W2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gQml0RmllbGRBcnJheVBhY2tldFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0QXJyYXkoKTsKLSAgQVNTRVJUX0VRKGNvdW50X2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheVtpXS5zZXZlbl9iaXRzXywgY291bnRfYXJyYXlbaV0uc2V2ZW5fYml0c18pOwotICAgIEFTU0VSVF9FUShhcnJheVtpXS5zdHJhZGRsZV8sIGNvdW50X2FycmF5W2ldLnN0cmFkZGxlXyk7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmZpdmVfYml0c18sIGNvdW50X2FycmF5W2ldLmZpdmVfYml0c18pOwotICB9Ci19Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdE5ld0JpdEZpZWxkQXJyYXlQYWNrZXQpIHsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihiaXRfZmllbGRfYXJyYXlfcGFja2V0KSk7Ci0gIGF1dG8gdmlldyA9IEJpdEZpZWxkQXJyYXlQYWNrZXRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBCaXRGaWVsZEFycmF5UGFja2V0QnVpbGRlcjo6Q3JlYXRlKHZpZXcuR2V0QXJyYXkoKSk7Ci0gIEFTU0VSVF9FUShiaXRfZmllbGRfYXJyYXlfcGFja2V0LnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoKnBhY2tldF9ieXRlcywgYml0X2ZpZWxkX2FycmF5X3BhY2tldCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoaWxkX3R3b190d29fdHdvXyA9IHsweDIwLCAweDAyfTsKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoaWxkX3R3b190d29fdGhyZWVfID0gezB4MjAsIDB4MDN9Owotc3RkOjp2ZWN0b3I8dWludDhfdD4gY2hpbGRfdHdvX3R3b19mb3VyXyA9IHsweDIwLCAweDA0fTsKLQotREVGSU5FX0FORF9JTlNUQU5USUFURV9QYXJlbnRUd29SZWZsZWN0aW9uVGVzdChjaGlsZF90d29fdHdvX3R3b18sIGNoaWxkX3R3b190d29fdGhyZWVfLCBjaGlsZF90d29fdHdvX2ZvdXJfKTsKLQotREVGSU5FX0FORF9JTlNUQU5USUFURV9DaGlsZFR3b1R3b1JlZmxlY3Rpb25UZXN0KGNoaWxkX3R3b190d29fdHdvXywgY2hpbGRfdHdvX3R3b190aHJlZV8sIGNoaWxkX3R3b190d29fZm91cl8pOwotCi1ERUZJTkVfQU5EX0lOU1RBTlRJQVRFX0NoaWxkVHdvVHdvVGhyZWVSZWZsZWN0aW9uVGVzdChjaGlsZF90d29fdHdvX3RocmVlXyk7Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG9uZV92ZXJzaW9ubGVzc19zdHJ1Y3RfcGFja2V0ID0gezB4MDF9Owotc3RkOjp2ZWN0b3I8dWludDhfdD4gb25lX3ZlcnNpb25lZF9zdHJ1Y3RfcGFja2V0ID0gezB4MDIsIDB4MDMgLyogdmVyc2lvbiAqLywgMHgwNCwgMHgwNSwgMHgwNn07Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBvbmVfdmVyc2lvbl9vbmVfc3RydWN0X3BhY2tldCA9IHsweDAzLCAweDAxIC8qIHZlcnNpb24gKi8sIDB4MDJ9Owotc3RkOjp2ZWN0b3I8dWludDhfdD4gb25lX3ZlcnNpb25fdHdvX3N0cnVjdF9wYWNrZXQgPSB7MHgwMywgMHgwMiAvKiB2ZXJzaW9uICovLCAweDAzLCAweDA0fTsKLURFRklORV9BTkRfSU5TVEFOVElBVEVfT25lVmVyc2lvbmxlc3NTdHJ1Y3RQYWNrZXRSZWZsZWN0aW9uVGVzdChvbmVfdmVyc2lvbmxlc3Nfc3RydWN0X3BhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVfdmVyc2lvbmVkX3N0cnVjdF9wYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX3ZlcnNpb25fb25lX3N0cnVjdF9wYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX3ZlcnNpb25fdHdvX3N0cnVjdF9wYWNrZXQpOwotREVGSU5FX0FORF9JTlNUQU5USUFURV9PbmVWZXJzaW9uZWRTdHJ1Y3RQYWNrZXRSZWZsZWN0aW9uVGVzdChvbmVfdmVyc2lvbmVkX3N0cnVjdF9wYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZV92ZXJzaW9uX29uZV9zdHJ1Y3RfcGFja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVfdmVyc2lvbl90d29fc3RydWN0X3BhY2tldCk7Ci1ERUZJTkVfQU5EX0lOU1RBTlRJQVRFX09uZVZlcnNpb25PbmVTdHJ1Y3RQYWNrZXRSZWZsZWN0aW9uVGVzdChvbmVfdmVyc2lvbl9vbmVfc3RydWN0X3BhY2tldCk7Ci1ERUZJTkVfQU5EX0lOU1RBTlRJQVRFX09uZVZlcnNpb25Ud29TdHJ1Y3RQYWNrZXRSZWZsZWN0aW9uVGVzdChvbmVfdmVyc2lvbl90d29fc3RydWN0X3BhY2tldCk7Ci0KLXZlY3Rvcjx1aW50OF90PiBvbmVfc3RydWN0X2JlewotICAgIDB4MDEsIDB4MDIsIDB4MDMsICAvLyBpZCA9IDB4MDEsIGNvdW50ID0gMHgwMjAzCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVTdHJ1Y3RCZSkgewotICBUd29SZWxhdGVkTnVtYmVyc0JlIHRybjsKLSAgdHJuLmlkXyA9IDE7Ci0gIHRybi5jb3VudF8gPSAweDAyMDM7Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVTdHJ1Y3RCZUJ1aWxkZXI6OkNyZWF0ZSh0cm4pOwotICBBU1NFUlRfRVEob25lX3N0cnVjdF9iZS5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKG9uZV9zdHJ1Y3RfYmUuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb25lX3N0cnVjdF9iZS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShvbmVfc3RydWN0X2JlW2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8IWtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IE9uZVN0cnVjdEJlVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIG9uZSA9IHZpZXcuR2V0T25lKCk7Ci0gIEFTU0VSVF9FUShvbmUuaWRfLCB0cm4uaWRfKTsKLSAgQVNTRVJUX0VRKG9uZS5jb3VudF8sIHRybi5jb3VudF8pOwotfQotCi12ZWN0b3I8dWludDhfdD4gdHdvX3N0cnVjdHNfYmV7Ci0gICAgMHgwMSwgMHgwMSwgMHgwMiwgIC8vIGlkLCBpZCAqIDB4MDEwMgotICAgIDB4MDIsIDB4MDIsIDB4MDQsCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RUd29TdHJ1Y3RzQmUpIHsKLSAgc3RkOjp2ZWN0b3I8VHdvUmVsYXRlZE51bWJlcnNCZT4gY291bnRfYXJyYXk7Ci0gIGZvciAodWludDhfdCBpID0gMTsgaSA8IDM7IGkrKykgewotICAgIFR3b1JlbGF0ZWROdW1iZXJzQmUgdHJuOwotICAgIHRybi5pZF8gPSBpOwotICAgIHRybi5jb3VudF8gPSAweDAxMDIgKiBpOwotICAgIGNvdW50X2FycmF5LnB1c2hfYmFjayh0cm4pOwotICB9Ci0KLSAgYXV0byBwYWNrZXQgPSBUd29TdHJ1Y3RzQmVCdWlsZGVyOjpDcmVhdGUoY291bnRfYXJyYXlbMF0sIGNvdW50X2FycmF5WzFdKTsKLSAgQVNTRVJUX0VRKHR3b19zdHJ1Y3RzX2JlLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEodHdvX3N0cnVjdHNfYmUuc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHdvX3N0cnVjdHNfYmUuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEodHdvX3N0cnVjdHNfYmVbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0Vmlldzwha0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gVHdvU3RydWN0c0JlVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIG9uZSA9IHZpZXcuR2V0T25lKCk7Ci0gIEFTU0VSVF9FUShvbmUuaWRfLCBjb3VudF9hcnJheVswXS5pZF8pOwotICBBU1NFUlRfRVEob25lLmNvdW50XywgY291bnRfYXJyYXlbMF0uY291bnRfKTsKLSAgYXV0byB0d28gPSB2aWV3LkdldFR3bygpOwotICBBU1NFUlRfRVEodHdvLmlkXywgY291bnRfYXJyYXlbMV0uaWRfKTsKLSAgQVNTRVJUX0VRKHR3by5jb3VudF8sIGNvdW50X2FycmF5WzFdLmNvdW50Xyk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBhcnJheV9vZl9zdHJ1Y3RfYmV7Ci0gICAgMHgwNCwgICAgICAgICAgICAgIC8vIF9jb3VudF8KLSAgICAweDAxLCAweDAxLCAweDAyLCAgLy8gaWQsIGlkICogMHgwMTAyCi0gICAgMHgwMiwgMHgwMiwgMHgwNCwgMHgwMywgMHgwMywgMHgwNiwgMHgwNCwgMHgwNCwgMHgwOCwKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEFycmF5T2ZTdHJ1Y3RCZSkgewotICBzdGQ6OnZlY3RvcjxUd29SZWxhdGVkTnVtYmVyc0JlPiBjb3VudF9hcnJheTsKLSAgZm9yICh1aW50OF90IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgVHdvUmVsYXRlZE51bWJlcnNCZSB0cm47Ci0gICAgdHJuLmlkXyA9IGk7Ci0gICAgdHJuLmNvdW50XyA9IDB4MDEwMiAqIGk7Ci0gICAgY291bnRfYXJyYXkucHVzaF9iYWNrKHRybik7Ci0gIH0KLQotICBhdXRvIHBhY2tldCA9IEFycmF5T2ZTdHJ1Y3RCZUJ1aWxkZXI6OkNyZWF0ZShjb3VudF9hcnJheSk7Ci0KLSAgQVNTRVJUX0VRKGFycmF5X29mX3N0cnVjdF9iZS5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGFycmF5X29mX3N0cnVjdF9iZS5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheV9vZl9zdHJ1Y3RfYmUuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlfb2Zfc3RydWN0X2JlW2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8IWtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IEFycmF5T2ZTdHJ1Y3RCZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhcnJheSA9IHZpZXcuR2V0QXJyYXkoKTsKLSAgQVNTRVJUX0VRKGNvdW50X2FycmF5LnNpemUoKSwgYXJyYXkuc2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF9hcnJheS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShhcnJheVtpXS5pZF8sIGNvdW50X2FycmF5W2ldLmlkXyk7Ci0gICAgQVNTRVJUX0VRKGFycmF5W2ldLmNvdW50XywgY291bnRfYXJyYXlbaV0uY291bnRfKTsKLSAgfQotfQotCi12ZWN0b3I8dWludDhfdD4gb25lX2ZvdXJfYnl0ZV9zdHJ1Y3R7Ci0gICAgMHgwNCwgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdF90eXBlXyA9IEZvdXJCeXRlCi0gICAgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgIC8vIGZvdXJfYnl0ZXNfCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVGb3VyQnl0ZVN0cnVjdCkgewotICBGb3VyQnl0ZVN0cnVjdCBmb3VyX2J5dGVfc3RydWN0OwotICBmb3VyX2J5dGVfc3RydWN0LmZvdXJfYnl0ZXNfID0gMHhkNGQzZDJkMTsKLQotICBhdXRvIHBhY2tldCA9IE9uZUZvdXJCeXRlU3RydWN0QnVpbGRlcjo6Q3JlYXRlKGZvdXJfYnl0ZV9zdHJ1Y3QpOwotICBBU1NFUlRfRVEob25lX2ZvdXJfYnl0ZV9zdHJ1Y3Quc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShvbmVfZm91cl9ieXRlX3N0cnVjdC5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvbmVfZm91cl9ieXRlX3N0cnVjdC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShvbmVfZm91cl9ieXRlX3N0cnVjdFtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IE9uZUZvdXJCeXRlU3RydWN0Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoU3RydWN0VHlwZTo6Rk9VUl9CWVRFLCB2aWV3LkdldE9uZVN0cnVjdCgpLnN0cnVjdF90eXBlXyk7Ci0gIEFTU0VSVF9FUShmb3VyX2J5dGVfc3RydWN0LmZvdXJfYnl0ZXNfLCB2aWV3LkdldE9uZVN0cnVjdCgpLmZvdXJfYnl0ZXNfKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IGdlbmVyaWNfc3RydWN0X3R3b3sKLSAgICAweDAyLCAgICAgICAgLy8gc3RydWN0X3R5cGVfID0gVHdvQnl0ZQotICAgIDB4MDEsIDB4MDIsICAvLyB0d29fYnl0ZXNfCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVHZW5lcmljU3RydWN0VHdvKSB7Ci0gIFR3b0J5dGVTdHJ1Y3QgdHdvX2J5dGVfc3RydWN0OwotICB0d29fYnl0ZV9zdHJ1Y3QudHdvX2J5dGVzXyA9IDB4MDIwMTsKLSAgc3RkOjp1bmlxdWVfcHRyPFR3b0J5dGVTdHJ1Y3Q+IHR3b19ieXRlX3N0cnVjdF9wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPFR3b0J5dGVTdHJ1Y3Q+KHR3b19ieXRlX3N0cnVjdCk7Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVHZW5lcmljU3RydWN0QnVpbGRlcjo6Q3JlYXRlKHN0ZDo6bW92ZSh0d29fYnl0ZV9zdHJ1Y3RfcHRyKSk7Ci0gIEFTU0VSVF9FUShnZW5lcmljX3N0cnVjdF90d28uc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShnZW5lcmljX3N0cnVjdF90d28uc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ2VuZXJpY19zdHJ1Y3RfdHdvLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGdlbmVyaWNfc3RydWN0X3R3b1tpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IE9uZUdlbmVyaWNTdHJ1Y3RWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gYmFzZV9zdHJ1Y3QgPSB2aWV3LkdldEJhc2VTdHJ1Y3QoKTsKLSAgQVNTRVJUX05FKG51bGxwdHIsIGJhc2Vfc3RydWN0KTsKLSAgQVNTRVJUX1RSVUUoVHdvQnl0ZVN0cnVjdDo6SXNJbnN0YW5jZSgqYmFzZV9zdHJ1Y3QpKTsKLSAgVHdvQnl0ZVN0cnVjdCogdHdvX2J5dGUgPSBzdGF0aWNfY2FzdDxUd29CeXRlU3RydWN0Kj4oYmFzZV9zdHJ1Y3QuZ2V0KCkpOwotICBBU1NFUlRfTkUobnVsbHB0ciwgdHdvX2J5dGUpOwotICBBU1NFUlRfVFJVRShUd29CeXRlU3RydWN0OjpJc0luc3RhbmNlKCp0d29fYnl0ZSkpOwotICBBU1NFUlRfRVEodHdvX2J5dGVfc3RydWN0LnR3b19ieXRlc18sIDB4MDIwMSk7Ci0gIHVpbnQxNl90IHZhbCA9IHR3b19ieXRlLT50d29fYnl0ZXNfOwotICBBU1NFUlRfRVEodmFsLCAweDAyMDEpOwotICBBU1NFUlRfRVEodHdvX2J5dGVfc3RydWN0LnR3b19ieXRlc18sICgoVHdvQnl0ZVN0cnVjdCopYmFzZV9zdHJ1Y3QuZ2V0KCkpLT50d29fYnl0ZXNfKTsKLX0KLQotdmVjdG9yPHVpbnQ4X3Q+IGdlbmVyaWNfc3RydWN0X2ZvdXJ7Ci0gICAgMHgwNCwgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdF90eXBlXyA9IEZvdXJCeXRlCi0gICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgIC8vIGZvdXJfYnl0ZXNfCi19OwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVHZW5lcmljU3RydWN0Rm91cikgewotICBGb3VyQnl0ZVN0cnVjdCBmb3VyX2J5dGVfc3RydWN0OwotICBmb3VyX2J5dGVfc3RydWN0LmZvdXJfYnl0ZXNfID0gMHgwNDAzMDIwMTsKLSAgc3RkOjp1bmlxdWVfcHRyPEZvdXJCeXRlU3RydWN0PiBmb3VyX2J5dGVfc3RydWN0X3AgPSBzdGQ6Om1ha2VfdW5pcXVlPEZvdXJCeXRlU3RydWN0Pihmb3VyX2J5dGVfc3RydWN0KTsKLSAgQVNTRVJUX0VRKGZvdXJfYnl0ZV9zdHJ1Y3QuZm91cl9ieXRlc18sIGZvdXJfYnl0ZV9zdHJ1Y3RfcC0+Zm91cl9ieXRlc18pOwotCi0gIGF1dG8gcGFja2V0ID0gT25lR2VuZXJpY1N0cnVjdEJ1aWxkZXI6OkNyZWF0ZShzdGQ6Om1vdmUoZm91cl9ieXRlX3N0cnVjdF9wKSk7Ci0gIEFTU0VSVF9FUShnZW5lcmljX3N0cnVjdF9mb3VyLnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoZ2VuZXJpY19zdHJ1Y3RfZm91ci5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnZW5lcmljX3N0cnVjdF9mb3VyLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGdlbmVyaWNfc3RydWN0X2ZvdXJbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBPbmVHZW5lcmljU3RydWN0Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGJhc2Vfc3RydWN0ID0gdmlldy5HZXRCYXNlU3RydWN0KCk7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBiYXNlX3N0cnVjdCk7Ci0gIEFTU0VSVF9FUShTdHJ1Y3RUeXBlOjpGT1VSX0JZVEUsIGJhc2Vfc3RydWN0LT5zdHJ1Y3RfdHlwZV8pOwotICBBU1NFUlRfRVEoZm91cl9ieXRlX3N0cnVjdC5mb3VyX2J5dGVzXywgKChGb3VyQnl0ZVN0cnVjdCopYmFzZV9zdHJ1Y3QuZ2V0KCkpLT5mb3VyX2J5dGVzXyk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBvbmVfc3RydWN0X2FycmF5ewotICAgIDB4MDQsICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3RfdHlwZV8gPSBGb3VyQnl0ZQotICAgIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsICAvLyBmb3VyX2J5dGVzXwotICAgIDB4MDQsICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3RfdHlwZV8gPSBGb3VyQnl0ZQotICAgIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjQsICAvLyBmb3VyX2J5dGVzXwotICAgIDB4MDIsICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3RfdHlwZV8gPSBUd29CeXRlCi0gICAgMHhjMywgMHhjMiwgICAgICAgICAgICAgIC8vIHR3b19ieXRlc18KLSAgICAweDA0LCAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0X3R5cGVfID0gVHdvQnl0ZQotICAgIDB4ZDQsIDB4ZDIsIDB4ZDMsIDB4ZDQsICAvLyBmb3VyX2J5dGVzXwotfTsKLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0T25lR2VuZXJpY1N0cnVjdEFycmF5KSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxVbnVzZWRQYXJlbnRTdHJ1Y3Q+PiBwYXJlbnRfdmVjdG9yOwotICBzdGQ6OnVuaXF1ZV9wdHI8Rm91ckJ5dGVTdHJ1Y3Q+IGZiczsKLSAgc3RkOjp1bmlxdWVfcHRyPFR3b0J5dGVTdHJ1Y3Q+IHRiczsKLSAgZmJzID0gc3RkOjptYWtlX3VuaXF1ZTxGb3VyQnl0ZVN0cnVjdD4oKTsKLSAgZmJzLT5mb3VyX2J5dGVzXyA9IDB4YTRhM2EyYTE7Ci0gIHBhcmVudF92ZWN0b3IucHVzaF9iYWNrKHN0ZDo6bW92ZShmYnMpKTsKLSAgZmJzID0gc3RkOjptYWtlX3VuaXF1ZTxGb3VyQnl0ZVN0cnVjdD4oKTsKLSAgZmJzLT5mb3VyX2J5dGVzXyA9IDB4YjRiM2IyYjI7Ci0gIHBhcmVudF92ZWN0b3IucHVzaF9iYWNrKHN0ZDo6bW92ZShmYnMpKTsKLSAgdGJzID0gc3RkOjptYWtlX3VuaXF1ZTxUd29CeXRlU3RydWN0PigpOwotICB0YnMtPnR3b19ieXRlc18gPSAweGMyYzM7Ci0gIHBhcmVudF92ZWN0b3IucHVzaF9iYWNrKHN0ZDo6bW92ZSh0YnMpKTsKLSAgZmJzID0gc3RkOjptYWtlX3VuaXF1ZTxGb3VyQnl0ZVN0cnVjdD4oKTsKLSAgZmJzLT5mb3VyX2J5dGVzXyA9IDB4ZDRkM2QyZDQ7Ci0gIHBhcmVudF92ZWN0b3IucHVzaF9iYWNrKHN0ZDo6bW92ZShmYnMpKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VW51c2VkUGFyZW50U3RydWN0Pj4gdmVjdG9yX2NvcHk7Ci0gIGZvciAoYXV0byYgcyA6IHBhcmVudF92ZWN0b3IpIHsKLSAgICBpZiAocy0+c3RydWN0X3R5cGVfID09IFN0cnVjdFR5cGU6OlRXT19CWVRFKSB7Ci0gICAgICB2ZWN0b3JfY29weS5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxUd29CeXRlU3RydWN0PigqKFR3b0J5dGVTdHJ1Y3QqKXMuZ2V0KCkpKTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0cnVjdF90eXBlXyA9PSBTdHJ1Y3RUeXBlOjpGT1VSX0JZVEUpIHsKLSAgICAgIHZlY3Rvcl9jb3B5LnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEZvdXJCeXRlU3RydWN0PigqKEZvdXJCeXRlU3RydWN0KilzLmdldCgpKSk7Ci0gICAgfQotICB9Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVHZW5lcmljU3RydWN0QXJyYXlCdWlsZGVyOjpDcmVhdGUoc3RkOjptb3ZlKHBhcmVudF92ZWN0b3IpKTsKLSAgQVNTRVJUX0VRKG9uZV9zdHJ1Y3RfYXJyYXkuc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShvbmVfc3RydWN0X2FycmF5LnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9uZV9zdHJ1Y3RfYXJyYXkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEob25lX3N0cnVjdF9hcnJheVtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IE9uZUdlbmVyaWNTdHJ1Y3RBcnJheVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBhbl9hcnJheSA9IHZpZXcuR2V0QW5BcnJheSgpOwotICBBU1NFUlRfRVEodmVjdG9yX2NvcHkuc2l6ZSgpLCBhbl9hcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvcl9jb3B5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX05FKG51bGxwdHIsIGFuX2FycmF5W2ldKTsKLSAgICBBU1NFUlRfRVEodmVjdG9yX2NvcHlbaV0tPnN0cnVjdF90eXBlXywgYW5fYXJyYXlbaV0tPnN0cnVjdF90eXBlXyk7Ci0gICAgaWYgKHZlY3Rvcl9jb3B5W2ldLT5zdHJ1Y3RfdHlwZV8gPT0gU3RydWN0VHlwZTo6Rk9VUl9CWVRFKSB7Ci0gICAgICBBU1NFUlRfRVEoRm91ckJ5dGVTdHJ1Y3Q6OlNwZWNpYWxpemUodmVjdG9yX2NvcHlbaV0uZ2V0KCkpLT5mb3VyX2J5dGVzXywKLSAgICAgICAgICAgICAgICBGb3VyQnl0ZVN0cnVjdDo6U3BlY2lhbGl6ZShhbl9hcnJheVtpXS5nZXQoKSktPmZvdXJfYnl0ZXNfKTsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUX0VRKFR3b0J5dGVTdHJ1Y3Q6OlNwZWNpYWxpemUodmVjdG9yX2NvcHlbaV0uZ2V0KCkpLT50d29fYnl0ZXNfLAotICAgICAgICAgICAgICAgIFR3b0J5dGVTdHJ1Y3Q6OlNwZWNpYWxpemUoYW5fYXJyYXlbaV0uZ2V0KCkpLT50d29fYnl0ZXNfKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0T25lR2VuZXJpY1N0cnVjdEZvdXJBcnJheSkgewotICBzdGQ6OmFycmF5PHN0ZDo6dW5pcXVlX3B0cjxVbnVzZWRQYXJlbnRTdHJ1Y3Q+LCA0PiBwYXJlbnRfdmVjdG9yOwotICBzdGQ6OnVuaXF1ZV9wdHI8Rm91ckJ5dGVTdHJ1Y3Q+IGZiczsKLSAgc3RkOjp1bmlxdWVfcHRyPFR3b0J5dGVTdHJ1Y3Q+IHRiczsKLSAgZmJzID0gc3RkOjptYWtlX3VuaXF1ZTxGb3VyQnl0ZVN0cnVjdD4oKTsKLSAgZmJzLT5mb3VyX2J5dGVzXyA9IDB4YTRhM2EyYTE7Ci0gIHBhcmVudF92ZWN0b3JbMF0gPSBzdGQ6Om1vdmUoZmJzKTsKLSAgZmJzID0gc3RkOjptYWtlX3VuaXF1ZTxGb3VyQnl0ZVN0cnVjdD4oKTsKLSAgZmJzLT5mb3VyX2J5dGVzXyA9IDB4YjRiM2IyYjI7Ci0gIHBhcmVudF92ZWN0b3JbMV0gPSBzdGQ6Om1vdmUoZmJzKTsKLSAgdGJzID0gc3RkOjptYWtlX3VuaXF1ZTxUd29CeXRlU3RydWN0PigpOwotICB0YnMtPnR3b19ieXRlc18gPSAweGMyYzM7Ci0gIHBhcmVudF92ZWN0b3JbMl0gPSBzdGQ6Om1vdmUodGJzKTsKLSAgZmJzID0gc3RkOjptYWtlX3VuaXF1ZTxGb3VyQnl0ZVN0cnVjdD4oKTsKLSAgZmJzLT5mb3VyX2J5dGVzXyA9IDB4ZDRkM2QyZDQ7Ci0gIHBhcmVudF92ZWN0b3JbM10gPSBzdGQ6Om1vdmUoZmJzKTsKLQotICBzdGQ6OmFycmF5PHN0ZDo6dW5pcXVlX3B0cjxVbnVzZWRQYXJlbnRTdHJ1Y3Q+LCA0PiB2ZWN0b3JfY29weTsKLSAgc2l6ZV90IGluZGV4ID0gMDsKLSAgZm9yIChhdXRvJiBzIDogcGFyZW50X3ZlY3RvcikgewotICAgIGlmIChzLT5zdHJ1Y3RfdHlwZV8gPT0gU3RydWN0VHlwZTo6VFdPX0JZVEUpIHsKLSAgICAgIHZlY3Rvcl9jb3B5W2luZGV4XSA9IHN0ZDo6bWFrZV91bmlxdWU8VHdvQnl0ZVN0cnVjdD4oKihUd29CeXRlU3RydWN0KilzLmdldCgpKTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0cnVjdF90eXBlXyA9PSBTdHJ1Y3RUeXBlOjpGT1VSX0JZVEUpIHsKLSAgICAgIHZlY3Rvcl9jb3B5W2luZGV4XSA9IHN0ZDo6bWFrZV91bmlxdWU8Rm91ckJ5dGVTdHJ1Y3Q+KCooRm91ckJ5dGVTdHJ1Y3QqKXMuZ2V0KCkpOwotICAgIH0KLSAgICBpbmRleCsrOwotICB9Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVHZW5lcmljU3RydWN0Rm91ckFycmF5QnVpbGRlcjo6Q3JlYXRlKHN0ZDo6bW92ZShwYXJlbnRfdmVjdG9yKSk7Ci0gIEFTU0VSVF9FUShvbmVfc3RydWN0X2FycmF5LnNpemUoKSwgcGFja2V0LT5zaXplKCkpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEob25lX3N0cnVjdF9hcnJheS5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvbmVfc3RydWN0X2FycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKG9uZV9zdHJ1Y3RfYXJyYXlbaV0sIHBhY2tldF9ieXRlcy0+YXQoaSkpOwotICB9Ci0KLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHZpZXcgPSBPbmVHZW5lcmljU3RydWN0Rm91ckFycmF5Vmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgQVNTRVJUX1RSVUUodmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGFuX2FycmF5ID0gdmlldy5HZXRBbkFycmF5KCk7Ci0gIEFTU0VSVF9FUSh2ZWN0b3JfY29weS5zaXplKCksIGFuX2FycmF5LnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yX2NvcHkuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfTkUobnVsbHB0ciwgYW5fYXJyYXlbaV0pOwotICAgIEFTU0VSVF9FUSh2ZWN0b3JfY29weVtpXS0+c3RydWN0X3R5cGVfLCBhbl9hcnJheVtpXS0+c3RydWN0X3R5cGVfKTsKLSAgICBpZiAodmVjdG9yX2NvcHlbaV0tPnN0cnVjdF90eXBlXyA9PSBTdHJ1Y3RUeXBlOjpGT1VSX0JZVEUpIHsKLSAgICAgIEFTU0VSVF9FUShGb3VyQnl0ZVN0cnVjdDo6U3BlY2lhbGl6ZSh2ZWN0b3JfY29weVtpXS5nZXQoKSktPmZvdXJfYnl0ZXNfLAotICAgICAgICAgICAgICAgIEZvdXJCeXRlU3RydWN0OjpTcGVjaWFsaXplKGFuX2FycmF5W2ldLmdldCgpKS0+Zm91cl9ieXRlc18pOwotICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlRfRVEoVHdvQnl0ZVN0cnVjdDo6U3BlY2lhbGl6ZSh2ZWN0b3JfY29weVtpXS5nZXQoKSktPnR3b19ieXRlc18sCi0gICAgICAgICAgICAgICAgVHdvQnl0ZVN0cnVjdDo6U3BlY2lhbGl6ZShhbl9hcnJheVtpXS5nZXQoKSktPnR3b19ieXRlc18pOwotICAgIH0KLSAgfQotfQotCi12ZWN0b3I8dWludDhfdD4gb25lX3N0cnVjdF9hcnJheV9hZnRlcl9maXhlZHsKLSAgICAweDAxLCAweDAyLCAgICAgICAgICAgICAgLy8gdHdvX2J5dGVzID0gMHgwMjAxCi0gICAgMHgwNCwgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdF90eXBlXyA9IEZvdXJCeXRlCi0gICAgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgIC8vIGZvdXJfYnl0ZXNfCi0gICAgMHgwNCwgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdF90eXBlXyA9IEZvdXJCeXRlCi0gICAgMHhiMiwgMHhiMiwgMHhiMywgMHhiNCwgIC8vIGZvdXJfYnl0ZXNfCi0gICAgMHgwMiwgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdF90eXBlXyA9IFR3b0J5dGUKLSAgICAweGMzLCAweGMyLCAgICAgICAgICAgICAgLy8gdHdvX2J5dGVzXwotICAgIDB4MDQsICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3RfdHlwZV8gPSBUd29CeXRlCi0gICAgMHhkNCwgMHhkMiwgMHhkMywgMHhkNCwgIC8vIGZvdXJfYnl0ZXNfCi19OwotCi1ERUZJTkVfQU5EX0lOU1RBTlRJQVRFX09uZUdlbmVyaWNTdHJ1Y3RBcnJheUFmdGVyRml4ZWRSZWZsZWN0aW9uVGVzdChvbmVfc3RydWN0X2FycmF5X2FmdGVyX2ZpeGVkKTsKLQotdmVjdG9yPHVpbnQ4X3Q+IG9uZV9sZW5ndGhfdHlwZV92YWx1ZV9zdHJ1Y3R7Ci0gICAgLy8gX3NpemVfKHZhbHVlKToxNiB0eXBlIHZhbHVlCi0gICAgMHgwNCwgMHgwMCwgMHgwMSwgJ28nLCAnbicsICdlJywgICAgICAgICAgICAvLyBPTkUKLSAgICAweDA0LCAweDAwLCAweDAyLCAndCcsICd3JywgJ28nLCAgICAgICAgICAgIC8vIFRXTwotICAgIDB4MDYsIDB4MDAsIDB4MDMsICd0JywgJ2gnLCAncicsICdlJywgJ2UnLCAgLy8gVEhSRUUKLX07Ci0KLURFRklORV9BTkRfSU5TVEFOVElBVEVfT25lTGVuZ3RoVHlwZVZhbHVlU3RydWN0UmVmbGVjdGlvblRlc3Qob25lX2xlbmd0aF90eXBlX3ZhbHVlX3N0cnVjdCk7Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdE9uZUxlbmd0aFR5cGVWYWx1ZVN0cnVjdCkgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihvbmVfbGVuZ3RoX3R5cGVfdmFsdWVfc3RydWN0KTsKLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IE9uZUxlbmd0aFR5cGVWYWx1ZVN0cnVjdFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBvbmUgPSB2aWV3LkdldE9uZUFycmF5KCk7Ci0gIHNpemVfdCBlbnRyeV9pZCA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBvbmUpIHsKLSAgICBzd2l0Y2ggKGVudHJ5X2lkKyspIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgQVNTRVJUX0VRKGVudHJ5LnR5cGVfLCBEYXRhVHlwZTo6T05FKTsKLSAgICAgICAgQVNTRVJUX0VRKGVudHJ5LnZhbHVlXywgc3RkOjp2ZWN0b3I8dWludDhfdD4oeydvJywgJ24nLCAnZSd9KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBBU1NFUlRfRVEoZW50cnkudHlwZV8sIERhdGFUeXBlOjpUV08pOwotICAgICAgICBBU1NFUlRfRVEoZW50cnkudmFsdWVfLCBzdGQ6OnZlY3Rvcjx1aW50OF90Pih7J3QnLCAndycsICdvJ30pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIEFTU0VSVF9FUShlbnRyeS50eXBlXywgRGF0YVR5cGU6OlRIUkVFKTsKLSAgICAgICAgQVNTRVJUX0VRKGVudHJ5LnZhbHVlXywgc3RkOjp2ZWN0b3I8dWludDhfdD4oeyd0JywgJ2gnLCAncicsICdlJywgJ2UnfSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9FUShlbnRyeS50eXBlXywgRGF0YVR5cGU6OlVOVVNFRCk7Ci0gICAgfQotICB9Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBvbmVfbGVuZ3RoX3R5cGVfdmFsdWVfc3RydWN0X3BhZGRlZF8xMHsKLSAgICAweDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX3NpemVfKHBheWxvYWQpLAotICAgIDB4MTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWxpZCBieXRlcwotICAgIDB4MDQsIDB4MDAsIDB4MDEsICdvJywgICduJywgICdlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPTkUKLSAgICAweDA0LCAweDAwLCAweDAyLCAndCcsICAndycsICAnbycsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFdPCi0gICAgMHgwNiwgMHgwMCwgMHgwMywgJ3QnLCAgJ2gnLCAgJ3InLCAgJ2UnLCAgJ2UnLCAgICAgICAgICAgICAgIC8vIFRIUkVFCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHBhZGRpbmcgdG8gMzAKLSAgICAweDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgcGFkZGluZwotfTsKLQotdmVjdG9yPHVpbnQ4X3Q+IG9uZV9sZW5ndGhfdHlwZV92YWx1ZV9zdHJ1Y3RfcGFkZGVkXzE4ewotICAgIDB4MjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfc2l6ZV8ocGF5bG9hZCksCi0gICAgMHgwQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkIGJ5dGVzCi0gICAgMHgwNCwgMHgwMCwgMHgwMSwgJ28nLCAgJ24nLCAgJ2UnLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ORQotICAgIDB4MDQsIDB4MDAsIDB4MDIsICd0JywgICd3JywgICdvJywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUV08KLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLy8gcGFkZGluZyB0byAyMAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBwYWRkaW5nIHRvIDMwCi0gICAgMHgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHBhZGRpbmcKLX07Ci0KLS8vIFRPRE86IFJldmlzaXQgTFRWIHBhcnNpbmcuICBSaWdodCBub3csIHRoZSBwYWRkaW5nIGJ5dGVzIGFyZSBwYXJzZWQKLS8vIERFRklORV9BTkRfSU5TVEFOVElBVEVfT25lTGVuZ3RoVHlwZVZhbHVlU3RydWN0UGFkZGVkUmVmbGVjdGlvblRlc3Qob25lX2xlbmd0aF90eXBlX3ZhbHVlX3N0cnVjdF9wYWRkZWRfMTAsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZV9sZW5ndGhfdHlwZV92YWx1ZV9zdHJ1Y3RfcGFkZGVkXzE4KTsKLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0T25lTGVuZ3RoVHlwZVZhbHVlU3RydWN0UGFkZGVkR2VuZXJhdGlvbikgewotICBzdGQ6OnZlY3RvcjxMZW5ndGhUeXBlVmFsdWVTdHJ1Y3Q+IGx0dl92ZWN0b3I7Ci0gIExlbmd0aFR5cGVWYWx1ZVN0cnVjdCBsdHY7Ci0gIGx0di50eXBlXyA9IERhdGFUeXBlOjpPTkU7Ci0gIGx0di52YWx1ZV8gPSB7Ci0gICAgICAnbycsCi0gICAgICAnbicsCi0gICAgICAnZScsCi0gIH07Ci0gIGx0dl92ZWN0b3IucHVzaF9iYWNrKGx0dik7Ci0gIGx0di50eXBlXyA9IERhdGFUeXBlOjpUV087Ci0gIGx0di52YWx1ZV8gPSB7Ci0gICAgICAndCcsCi0gICAgICAndycsCi0gICAgICAnbycsCi0gIH07Ci0gIGx0dl92ZWN0b3IucHVzaF9iYWNrKGx0dik7Ci0gIHVpbnQ4X3QgYWZ0ZXJfcGFkZGluZyA9IDB4MjA7Ci0KLSAgYXV0byBwYWNrZXQgPSBPbmVMZW5ndGhUeXBlVmFsdWVTdHJ1Y3RQYWRkZWRCdWlsZGVyOjpDcmVhdGUoMTIsIGx0dl92ZWN0b3IsIGFmdGVyX3BhZGRpbmcpOwotICBBU1NFUlRfRVEob25lX2xlbmd0aF90eXBlX3ZhbHVlX3N0cnVjdF9wYWRkZWRfMTguc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShvbmVfbGVuZ3RoX3R5cGVfdmFsdWVfc3RydWN0X3BhZGRlZF8xOC5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvbmVfbGVuZ3RoX3R5cGVfdmFsdWVfc3RydWN0X3BhZGRlZF8xOC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShvbmVfbGVuZ3RoX3R5cGVfdmFsdWVfc3RydWN0X3BhZGRlZF8xOFtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IE9uZUxlbmd0aFR5cGVWYWx1ZVN0cnVjdFBhZGRlZFZpZXc6OkNyZWF0ZShTaXplZFBhcmVudFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldykpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gYW5fYXJyYXkgPSB2aWV3LkdldE9uZUFycmF5KCk7Ci0gIC8vIFRPRE86IFJldmlzaXQgTFRWIHBhcnNpbmcuICBSaWdodCBub3csIHRoZSBwYWRkaW5nIGJ5dGVzIGFyZSBwYXJzZWQKLSAgQVNTRVJUX0xFKGx0dl92ZWN0b3Iuc2l6ZSgpLCBhbl9hcnJheS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGx0dl92ZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEobHR2X3ZlY3RvcltpXS50eXBlXywgYW5fYXJyYXlbaV0udHlwZV8pOwotICAgIEFTU0VSVF9FUShsdHZfdmVjdG9yW2ldLnZhbHVlXywgYW5fYXJyYXlbaV0udmFsdWVfKTsKLSAgfQotICBBU1NFUlRfRVEoYWZ0ZXJfcGFkZGluZywgdmlldy5HZXRBZnRlclBhZGRpbmcoKSk7Ci19Ci0KLXZlY3Rvcjx1aW50OF90PiBieXRlX3NpemVkewotICAgIDB4MTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCi0gICAgMHgyMSwgMHgyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKLSAgICAweDMxLCAweDMyLCAweDMzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMwotICAgIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0Ci0gICAgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgICAgICAgICAgICAgICAgICAgIC8vIDUKLSAgICAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAgICAgICAgICAgICAgLy8gNgotICAgIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsICAgICAgICAvLyA3Ci0gICAgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgIC8vIDgKLX07Ci0KLVRFU1QoR2VuZXJhdGVkUGFja2V0VGVzdCwgdGVzdEJ5dGVTaXplZEZpZWxkcykgewotICB1aW50NjRfdCBhcnJheVs5XXsKLSAgICAgIDB4YmFkYmFkYmFkLAotICAgICAgMHgxMSwgICAgICAgICAgICAgICAgLy8gMQotICAgICAgMHgyMjIxLCAgICAgICAgICAgICAgLy8gMgotICAgICAgMHgzMzMyMzEsICAgICAgICAgICAgLy8gMwotICAgICAgMHg0NDQzNDI0MSwgICAgICAgICAgLy8gNAotICAgICAgMHg1NTU0NTM1MjUxLCAgICAgICAgLy8gNQotICAgICAgMHg2NjY1NjQ2MzYyNjEsICAgICAgLy8gNgotICAgICAgMHg3Nzc2NzU3NDczNzI3MSwgICAgLy8gNwotICAgICAgMHg4ODg3ODY4NTg0ODM4MjgxLCAgLy8gOAotICB9OwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBCeXRlU2l6ZWRGaWVsZHNCdWlsZGVyOjpDcmVhdGUoYXJyYXlbMV0sIGFycmF5WzJdLCBhcnJheVszXSwgYXJyYXlbNF0sIGFycmF5WzVdLCBhcnJheVs2XSwgYXJyYXlbN10sIGFycmF5WzhdKTsKLSAgQVNTRVJUX0VRKGJ5dGVfc2l6ZWQuc2l6ZSgpLCBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaXQpOwotCi0gIEFTU0VSVF9FUShieXRlX3NpemVkLnNpemUoKSwgcGFja2V0X2J5dGVzLT5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ5dGVfc2l6ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYnl0ZV9zaXplZFtpXSwgcGFja2V0X2J5dGVzLT5hdChpKSk7Ci0gIH0KLQotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IEJ5dGVTaXplZEZpZWxkc1ZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGFycmF5WzFdLCB2aWV3LkdldE9uZSgpKTsKLSAgQVNTRVJUX0VRKGFycmF5WzJdLCB2aWV3LkdldFR3bygpKTsKLSAgQVNTRVJUX0VRKGFycmF5WzNdLCB2aWV3LkdldFRocmVlKCkpOwotICBBU1NFUlRfRVEoYXJyYXlbNF0sIHZpZXcuR2V0Rm91cigpKTsKLSAgQVNTRVJUX0VRKGFycmF5WzVdLCB2aWV3LkdldEZpdmUoKSk7Ci0gIEFTU0VSVF9FUShhcnJheVs2XSwgdmlldy5HZXRTaXgoKSk7Ci0gIEFTU0VSVF9FUShhcnJheVs3XSwgdmlldy5HZXRTZXZlbigpKTsKLSAgQVNTRVJUX0VRKGFycmF5WzhdLCB2aWV3LkdldEVpZ2h0KCkpOwotfQotCi1ERUZJTkVfQU5EX0lOU1RBTlRJQVRFX0J5dGVTaXplZEZpZWxkc1JlZmxlY3Rpb25UZXN0KGJ5dGVfc2l6ZWQpOwotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RPbmVHZW5lcmljU3RydWN0QXJyYXlOb1plcm9FbXB0eSkgewotICBhdXRvIHRvb19mZXdfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigwKTsKLSAgYXV0byB2aWV3ID0gT25lR2VuZXJpY1N0cnVjdEFycmF5Tm9aZXJvVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4odG9vX2Zld19ieXRlcykpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBpZiAodmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIHZpZXcuR2V0QW5BcnJheSgpLnNpemUoKTsKLSAgICB9Ci0gICAgdG9vX2Zld19ieXRlcy0+cHVzaF9iYWNrKDApOwotICAgIHZpZXcgPSBPbmVHZW5lcmljU3RydWN0QXJyYXlOb1plcm9WaWV3OjpDcmVhdGUoUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPih0b29fZmV3X2J5dGVzKSk7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhX3R3b19ieXRlX3N0cnVjdCA9IHsKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFN0cnVjdFR5cGVOb1plcm86OlRXT19CWVRFKSwKLSAgICAgIDB4MDEsCi0gICAgICAweDAyLAotICB9OwotICB0b29fZmV3X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oYV90d29fYnl0ZV9zdHJ1Y3QpOwotICB2aWV3ID0gT25lR2VuZXJpY1N0cnVjdEFycmF5Tm9aZXJvVmlldzo6Q3JlYXRlKFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4odG9vX2Zld19ieXRlcykpOwotICBBU1NFUlRfVFJVRSh2aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUSgxLCB2aWV3LkdldEFuQXJyYXkoKS5zaXplKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZFBhY2tldFRlc3QsIHRlc3RUb1N0cmluZ091dHB1dCkgewotICBzdGQ6OnZlY3RvcjxUd29SZWxhdGVkTnVtYmVyc0JlPiBjb3VudF9hcnJheTsKLSAgZm9yICh1aW50OF90IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgVHdvUmVsYXRlZE51bWJlcnNCZSB0cm47Ci0gICAgdHJuLmlkXyA9IGk7Ci0gICAgdHJuLmNvdW50XyA9IDB4MDEwMiAqIGk7Ci0gICAgY291bnRfYXJyYXkucHVzaF9iYWNrKHRybik7Ci0gIH0KLQotICBhdXRvIHBhY2tldCA9IEFycmF5T2ZTdHJ1Y3RCZUJ1aWxkZXI6OkNyZWF0ZShjb3VudF9hcnJheSk7Ci0KLSAgQVNTRVJUX0VRKGFycmF5X29mX3N0cnVjdF9iZS5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGFycmF5X29mX3N0cnVjdF9iZS5zaXplKCksIHBhY2tldF9ieXRlcy0+c2l6ZSgpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheV9vZl9zdHJ1Y3RfYmUuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoYXJyYXlfb2Zfc3RydWN0X2JlW2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8IWtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdmlldyA9IEFycmF5T2ZTdHJ1Y3RCZVZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLQotICBBU1NFUlRfRVEoCi0gICAgICAiQXJyYXlPZlN0cnVjdEJlIHsgYXJyYXlfY291bnQgPSAweDQsIGFycmF5ID0gVkVDVE9SW1R3b1JlbGF0ZWROdW1iZXJzQmUgeyBpZCA9IDB4MSwgY291bnQgPSAweDEwMiB9LCAiCi0gICAgICAiVHdvUmVsYXRlZE51bWJlcnNCZSB7IGlkID0gMHgyLCBjb3VudCA9IDB4MjA0IH0sIFR3b1JlbGF0ZWROdW1iZXJzQmUgeyBpZCA9IDB4MywgY291bnQgPSAweDMwNiB9LCAiCi0gICAgICAiVHdvUmVsYXRlZE51bWJlcnNCZSB7IGlkID0gMHg0LCBjb3VudCA9IDB4NDA4IH1dIH0iLAotICAgICAgdmlldy5Ub1N0cmluZygpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRQYWNrZXRUZXN0LCB0ZXN0VG9TdHJpbmdPbmVGaXhlZFR5cGVzU3RydWN0KSB7Ci0gIFN0cnVjdFdpdGhGaXhlZFR5cGVzIHN3ZjsKLSAgc3dmLmZvdXJfYml0c18gPSBGb3VyQml0czo6RklWRTsKLSAgc3dmLmlkXyA9IDB4MGQ7Ci0gIHN3Zi5hcnJheV8gPSB7ezB4MDEsIDB4MDIsIDB4MDN9fTsKLSAgc3dmLnNpeF9ieXRlc18gPSBTaXhCeXRlc3t7MHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNn19OwotCi0gIGF1dG8gcGFja2V0ID0gT25lRml4ZWRUeXBlc1N0cnVjdEJ1aWxkZXI6OkNyZWF0ZShzd2YpOwotICBBU1NFUlRfRVEob25lX2ZpeGVkX3R5cGVzX3N0cnVjdC5zaXplKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKG9uZV9maXhlZF90eXBlc19zdHJ1Y3Quc2l6ZSgpLCBwYWNrZXRfYnl0ZXMtPnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb25lX2ZpeGVkX3R5cGVzX3N0cnVjdC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShvbmVfZml4ZWRfdHlwZXNfc3RydWN0W2ldLCBwYWNrZXRfYnl0ZXMtPmF0KGkpKTsKLSAgfQotCi0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB2aWV3ID0gT25lRml4ZWRUeXBlc1N0cnVjdFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHZpZXcuSXNWYWxpZCgpKTsKLQotICBBU1NFUlRfRVEoCi0gICAgICAiT25lRml4ZWRUeXBlc1N0cnVjdCB7IG9uZSA9IFN0cnVjdFdpdGhGaXhlZFR5cGVzIHsgZm91cl9iaXRzID0gRklWRSwgaWQgPSAweGQsIGFycmF5ID0gQVJSQVlbMHgxLCAweDIsIDB4M10sICIKLSAgICAgICJleGFtcGxlX2NoZWNrc3VtID0gQ0hFQ0tTVU0sIHNpeF9ieXRlcyA9IFNpeEJ5dGVzIH0gfSIsCi0gICAgICB2aWV3LlRvU3RyaW5nKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcGFyc2VyCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3Qvc2ltcGxlX3N1bS5oIGIvZ2QvcGFja2V0L3BhcnNlci90ZXN0L3NpbXBsZV9zdW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjNDg4OC4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3Qvc2ltcGxlX3N1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotbmFtZXNwYWNlIHBhcnNlciB7Ci1uYW1lc3BhY2UgdGVzdCB7Ci0KLWNsYXNzIFNpbXBsZVN1bSB7Ci0gcHVibGljOgotICB2b2lkIEluaXRpYWxpemUoKSB7Ci0gICAgc3VtID0gMDsKLSAgfQotCi0gIHZvaWQgQWRkQnl0ZSh1aW50OF90IGJ5dGUpIHsKLSAgICBzdW0gKz0gYnl0ZTsKLSAgfQotCi0gIHVpbnQxNl90IEdldENoZWNrc3VtKCkgY29uc3QgewotICAgIHJldHVybiBzdW07Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHVpbnQxNl90IHN1bTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci19ICAvLyBuYW1lc3BhY2UgcGFyc2VyCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3Qvc2l4X2J5dGVzLmNjIGIvZ2QvcGFja2V0L3BhcnNlci90ZXN0L3NpeF9ieXRlcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiNGI4MS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3Qvc2l4X2J5dGVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNpeF9ieXRlcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotbmFtZXNwYWNlIHBhcnNlciB7Ci1uYW1lc3BhY2UgdGVzdCB7Ci0KLVNpeEJ5dGVzOjpTaXhCeXRlcyhjb25zdCB1aW50OF90ICgmc2l4KVs2XSkgewotICBzdGQ6OmNvcHkoc2l4LCBzaXggKyBrTGVuZ3RoLCBzaXhfYnl0ZXMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBwYXJzZXIKLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9zaXhfYnl0ZXMuaCBiL2dkL3BhY2tldC9wYXJzZXIvdGVzdC9zaXhfYnl0ZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwZWE3NS4uMDAwMDAwMAotLS0gYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3Qvc2l4X2J5dGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInBhY2tldC9jdXN0b21fZmllbGRfZml4ZWRfc2l6ZV9pbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLW5hbWVzcGFjZSBwYXJzZXIgewotbmFtZXNwYWNlIHRlc3QgewotCi1jbGFzcyBTaXhCeXRlcyBmaW5hbCA6IHB1YmxpYyBwYWNrZXQ6OkN1c3RvbUZpZWxkRml4ZWRTaXplSW50ZXJmYWNlPFNpeEJ5dGVzPiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTGVuZ3RoID0gNjsKLQotICB1aW50OF90IHNpeF9ieXRlc1trTGVuZ3RoXSA9IHt9OwotCi0gIFNpeEJ5dGVzKCkgPSBkZWZhdWx0OwotICBTaXhCeXRlcyhjb25zdCB1aW50OF90ICgmYWRkcilbNl0pOwotCi0gIGlubGluZSB1aW50OF90KiBkYXRhKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBzaXhfYnl0ZXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgdWludDhfdCogZGF0YSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc2l4X2J5dGVzOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2l4Qnl0ZXMmIHJocykgY29uc3QgewotICAgIHJldHVybiAoc3RkOjptZW1jbXAoc2l4X2J5dGVzLCByaHMuc2l4X2J5dGVzLCBzaXplb2Yoc2l4X2J5dGVzKSkgPCAwKTsKLSAgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2l4Qnl0ZXMmIHJocykgY29uc3QgewotICAgIHJldHVybiAoc3RkOjptZW1jbXAoc2l4X2J5dGVzLCByaHMuc2l4X2J5dGVzLCBzaXplb2Yoc2l4X2J5dGVzKSkgPT0gMCk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj4oY29uc3QgU2l4Qnl0ZXMmIHJocykgY29uc3QgewotICAgIHJldHVybiAocmhzIDwgKnRoaXMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTaXhCeXRlcyYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPiByaHMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTaXhCeXRlcyYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPCByaHMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTaXhCeXRlcyYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKLSAgfQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gIlNpeEJ5dGVzIjsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBwYXJzZXIKLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvdGVzdC90ZXN0X3BhY2tldHMucGRsIGIvZ2QvcGFja2V0L3BhcnNlci90ZXN0L3Rlc3RfcGFja2V0cy5wZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmI3MDAuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci90ZXN0L3Rlc3RfcGFja2V0cy5wZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotbGl0dGxlX2VuZGlhbl9wYWNrZXRzCi0KLWN1c3RvbV9maWVsZCBTaXhCeXRlcyA6IDQ4ICJwYWNrZXQvcGFyc2VyL3Rlc3QvIgotY3VzdG9tX2ZpZWxkIFZhcmlhYmxlICJwYWNrZXQvcGFyc2VyL3Rlc3QvIgotCi1wYWNrZXQgUGFyZW50IHsKLSAgX2ZpeGVkXyA9IDB4MTIgOiA4LAotICBfc2l6ZV8oX3BheWxvYWRfKSA6IDgsCi0gIF9wYXlsb2FkXywKLSAgZm9vdGVyIDogOCwKLX0KLQotcGFja2V0IENoaWxkIDogUGFyZW50IHsKLSAgZmllbGRfbmFtZSA6IDE2LAotfQotCi1lbnVtIEZvdXJCaXRzIDogNCB7Ci0gIE9ORSA9IDEsCi0gIFRXTyA9IDIsCi0gIFRIUkVFID0gMywKLSAgRklWRSA9IDUsCi0gIFRFTiA9IDEwLAotICBMQVpZX01FID0gMTUsCi19Ci0KLXBhY2tldCBQYXJlbnRUd28gewotICBfcmVzZXJ2ZWRfIDogNCwKLSAgZm91cl9iaXRzIDogRm91ckJpdHMsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IENoaWxkVHdvVGhyZWUgOiBQYXJlbnRUd28gKGZvdXJfYml0cyA9IFRIUkVFKSB7Ci0gIG1vcmVfYml0cyA6IEZvdXJCaXRzLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgc2l4dGVlbl9iaXRzIDogMTYKLX0KLQotcGFja2V0IENoaWxkVHdvVHdvIDogUGFyZW50VHdvIChmb3VyX2JpdHMgPSBUV08pIHsKLSAgbW9yZV9iaXRzIDogRm91ckJpdHMsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgQ2hpbGRUd29Ud29UaHJlZSA6Q2hpbGRUd29Ud28gKG1vcmVfYml0cyA9IFRIUkVFKSB7Ci19Ci0KLWVudW0gVHdvQml0cyA6IDIgewotICBaRVJPID0gMCwKLSAgT05FID0gMSwKLSAgVFdPID0gMiwKLSAgVEhSRUUgPSAzLAotfQotCi1wYWNrZXQgTWlkZGxlRm91ckJpdHMgewotICBsb3dfdHdvIDogVHdvQml0cywKLSAgbmV4dF9mb3VyIDogRm91ckJpdHMsCi0gIHN0cmFkZGxlIDogRm91ckJpdHMsCi0gIGZvdXJfbW9yZSA6IEZvdXJCaXRzLAotICBoaWdoX3R3byA6IFR3b0JpdHMsCi19Ci0KLXBhY2tldCBQYXJlbnRXaXRoU2l4Qnl0ZXMgewotICB0d29fYnl0ZXMgOiAxNiwKLSAgc2l4X2J5dGVzIDogU2l4Qnl0ZXMsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IENoaWxkV2l0aFNpeEJ5dGVzIDogUGFyZW50V2l0aFNpeEJ5dGVzICh0d29fYnl0ZXMgPSAweDEyMzQpIHsKLSAgY2hpbGRfc2l4X2J5dGVzIDogU2l4Qnl0ZXMsCi19Ci0KLWNoZWNrc3VtIFNpbXBsZVN1bSA6IDE2ICJwYWNrZXQvcGFyc2VyL3Rlc3QvIgotCi1wYWNrZXQgUGFyZW50V2l0aFN1bSB7Ci0gIHR3b19ieXRlcyA6IDE2LAotICBfY2hlY2tzdW1fc3RhcnRfKGV4YW1wbGVfY2hlY2tzdW0pLAotICBzdW1fYnl0ZXMgOiAxNiwKLSAgX3BheWxvYWRfLAotICBleGFtcGxlX2NoZWNrc3VtIDogU2ltcGxlU3VtLAotfQotCi1wYWNrZXQgQ2hpbGRXaXRoU3VtIDogUGFyZW50V2l0aFN1bSB7Ci0gIG1vcmVfYnl0ZXMgOiAzMiwKLSAgYW5vdGhlcl9ieXRlIDogOCwKLX0KLQotcGFja2V0IENoaWxkV2l0aE5lc3RlZFN1bSA6IFBhcmVudFdpdGhTdW0gewotICBfY2hlY2tzdW1fc3RhcnRfKG5lc3RlZF9jaGVja3N1bSksCi0gIG1vcmVfYnl0ZXMgOiAzMiwKLSAgbmVzdGVkX2NoZWNrc3VtIDogU2ltcGxlU3VtLAotfQotCi1wYWNrZXQgUGFyZW50U2l6ZU1vZGlmaWVyIHsKLSAgX3NpemVfKF9wYXlsb2FkXykgOiA4LAotICBfcGF5bG9hZF8gOiBbKzIqOF0sIC8vIEluY2x1ZGUgdHdvX2J5dGVzIGluIHRoZSBzaXplCi0gIHR3b19ieXRlcyA6IDE2LAotfQotCi1wYWNrZXQgQ2hpbGRTaXplTW9kaWZpZXIgOiBQYXJlbnRTaXplTW9kaWZpZXIgKHR3b19ieXRlcyA9IDB4MTIxMSkgewotICBtb3JlX2J5dGVzIDogMzIsCi19Ci0KLXBhY2tldCBGaWVsZHNFbmRXaXRoTnVtYmVycyB7Ci0gIGZpZWxkXzEgOiAxNiwKLSAgZmllbGRfMiA6IDE2LAotICBmaWVsZF8xMCA6IDE2LAotICBmaWVsZF8xMSA6IDE2LAotfQotCi1lbnVtIEZvckFycmF5cyA6IDE2IHsKLSAgT05FID0gMHgwMDAxLAotICBUV08gPSAweDAwMDIsCi0gIE9ORV9UV08gPSAweDAyMDEsCi0gIFRXT19USFJFRSA9IDB4MDMwMiwKLSAgRkZGRiA9IDB4ZmZmZiwKLX0KLQotcGFja2V0IEZpeGVkQXJyYXlFbnVtIHsKLSAgZW51bV9hcnJheSA6IEZvckFycmF5c1s1XSwKLX0KLQotcGFja2V0IFNpemVkQXJyYXlFbnVtIHsKLSAgX3NpemVfKGVudW1fYXJyYXkpIDogMTYsCi0gIGVudW1fYXJyYXkgOiBGb3JBcnJheXNbXSwKLX0KLQotcGFja2V0IENvdW50QXJyYXlFbnVtIHsKLSAgX2NvdW50XyhlbnVtX2FycmF5KSA6IDgsCi0gIGVudW1fYXJyYXkgOiBGb3JBcnJheXNbXSwKLX0KLQotcGFja2V0IFNpemVkQXJyYXlDdXN0b20gewotICBfc2l6ZV8oc2l4X2J5dGVzX2FycmF5KSA6IDgsCi0gIGFuX2V4dHJhX2J5dGUgOiA4LAotICBzaXhfYnl0ZXNfYXJyYXkgOiBTaXhCeXRlc1srMSo4XSwKLX0KLQotcGFja2V0IEZpeGVkQXJyYXlDdXN0b20gewotICBzaXhfYnl0ZXNfYXJyYXkgOiBTaXhCeXRlc1s1XSwKLX0KLQotcGFja2V0IENvdW50QXJyYXlDdXN0b20gewotICBfY291bnRfKHNpeF9ieXRlc19hcnJheSkgOiA4LAotICBzaXhfYnl0ZXNfYXJyYXkgOiBTaXhCeXRlc1tdLAotfQotCi1wYWNrZXQgUGFja2V0V2l0aEZpeGVkQXJyYXlzT2ZCeXRlcyB7Ci0gIGZpeGVkXzI1NmJpdF9pbl9ieXRlcyA6IDhbMzJdLAotICBmaXhlZF8yNTZiaXRfaW5fd29yZHMgOiAzMls4XSwKLX0KLQotcGFja2V0IE9uZVZhcmlhYmxlIHsKLSAgb25lIDogVmFyaWFibGUsCi19Ci0KLXBhY2tldCBTaXplZEFycmF5VmFyaWFibGUgewotICBfc2l6ZV8odmFyaWFibGVfYXJyYXkpIDogOCwKLSAgdmFyaWFibGVfYXJyYXkgOiBWYXJpYWJsZVtdLAotfQotCi1wYWNrZXQgRml4ZWRBcnJheVZhcmlhYmxlIHsKLSAgdmFyaWFibGVfYXJyYXkgOiBWYXJpYWJsZVs1XSwKLX0KLQotcGFja2V0IENvdW50QXJyYXlWYXJpYWJsZSB7Ci0gIF9jb3VudF8odmFyaWFibGVfYXJyYXkpIDogOCwKLSAgdmFyaWFibGVfYXJyYXkgOiBWYXJpYWJsZVtdLAotfQotCi1zdHJ1Y3QgVHdvUmVsYXRlZE51bWJlcnMgewotICBpZCA6IDgsCi0gIGNvdW50IDogMTYsCi19Ci0KLXBhY2tldCBPbmVTdHJ1Y3QgewotICBvbmUgOiBUd29SZWxhdGVkTnVtYmVycywKLX0KLQotcGFja2V0IFR3b1N0cnVjdHMgewotICBvbmUgOiBUd29SZWxhdGVkTnVtYmVycywKLSAgdHdvIDogVHdvUmVsYXRlZE51bWJlcnMsCi19Ci0KLXBhY2tldCBWZWN0b3JPZlN0cnVjdCB7Ci0gIF9jb3VudF8oYXJyYXkpIDogOCwKLSAgYXJyYXkgOiBUd29SZWxhdGVkTnVtYmVyc1tdLAotfQotCi1wYWNrZXQgQXJyYXlPZlN0cnVjdCB7Ci0gIHRoZV9jb3VudCA6IDgsCi0gIGFycmF5IDogVHdvUmVsYXRlZE51bWJlcnNbNF0sCi19Ci0KLXN0cnVjdCBTdHJ1Y3RXaXRoRml4ZWRUeXBlcyB7Ci0gIGZvdXJfYml0cyA6IEZvdXJCaXRzLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgX2NoZWNrc3VtX3N0YXJ0XyhleGFtcGxlX2NoZWNrc3VtKSwKLSAgX2ZpeGVkXyA9IDB4ZjMgOiA4LAotICBpZCA6IDgsCi0gIGFycmF5IDogOFszXSwKLSAgZXhhbXBsZV9jaGVja3N1bSA6IFNpbXBsZVN1bSwKLSAgc2l4X2J5dGVzIDogU2l4Qnl0ZXMsCi19Ci0KLXBhY2tldCBPbmVGaXhlZFR5cGVzU3RydWN0IHsKLSAgb25lIDogU3RydWN0V2l0aEZpeGVkVHlwZXMsCi19Ci0KLXBhY2tldCBBcnJheU9mU3RydWN0QW5kQW5vdGhlciB7Ci0gIF9jb3VudF8oYXJyYXkpIDogOCwKLSAgYXJyYXkgOiBUd29SZWxhdGVkTnVtYmVyc1tdLAotICBhbm90aGVyIDogVHdvUmVsYXRlZE51bWJlcnMsCi19Ci0KLXBhY2tldCBTaXplZEFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyIHsKLSAgX3NpemVfKGFycmF5KSA6IDgsCi0gIGFycmF5IDogVHdvUmVsYXRlZE51bWJlcnNbXSwKLSAgYW5vdGhlciA6IFR3b1JlbGF0ZWROdW1iZXJzLAotfQotCi1zdHJ1Y3QgQXJyYXlPZlN0cnVjdEFuZEFub3RoZXJTdHJ1Y3QgewotICBfY291bnRfKGFycmF5KSA6IDgsCi0gIGFycmF5IDogVHdvUmVsYXRlZE51bWJlcnNbXSwKLSAgYW5vdGhlciA6IFR3b1JlbGF0ZWROdW1iZXJzLAotfQotCi1zdHJ1Y3QgU2l6ZWRBcnJheU9mU3RydWN0QW5kQW5vdGhlclN0cnVjdCB7Ci0gIF9zaXplXyhhcnJheSkgOiA4LAotICBhcnJheSA6IFR3b1JlbGF0ZWROdW1iZXJzW10sCi0gIGFub3RoZXIgOiBUd29SZWxhdGVkTnVtYmVycywKLX0KLQotcGFja2V0IE9uZUFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyU3RydWN0IHsKLSAgb25lIDogQXJyYXlPZlN0cnVjdEFuZEFub3RoZXJTdHJ1Y3QsCi19Ci0KLXBhY2tldCBPbmVTaXplZEFycmF5T2ZTdHJ1Y3RBbmRBbm90aGVyU3RydWN0IHsKLSAgb25lIDogU2l6ZWRBcnJheU9mU3RydWN0QW5kQW5vdGhlclN0cnVjdCwKLX0KLQotZ3JvdXAgQml0RmllbGRHcm91cCB7Ci0gIHNldmVuX2JpdHMgOiA3LAotICBzdHJhZGRsZSA6IDQsCi0gIGZpdmVfYml0cyA6IDUsCi19Ci0KLXBhY2tldCBCaXRGaWVsZEdyb3VwUGFja2V0IHsKLSAgQml0RmllbGRHcm91cCwKLX0KLQotcGFja2V0IEJpdEZpZWxkR3JvdXBBZnRlclBheWxvYWRQYWNrZXQgewotICBfcGF5bG9hZF8sCi0gIEJpdEZpZWxkR3JvdXAsCi19Ci0KLXBhY2tldCBCaXRGaWVsZEdyb3VwQWZ0ZXJVbnNpemVkQXJyYXlQYWNrZXQgOiBCaXRGaWVsZEdyb3VwQWZ0ZXJQYXlsb2FkUGFja2V0IHsKLSAgYXJyYXkgOiA4W10sCi19Ci0KLXN0cnVjdCBCaXRGaWVsZCB7Ci0gIHNldmVuX2JpdHMgOiA3LAotICBzdHJhZGRsZSA6IDQsCi0gIGZpdmVfYml0cyA6IDUsCi19Ci0KLXBhY2tldCBCaXRGaWVsZFBhY2tldCB7Ci0gIGJpdF9maWVsZCA6IEJpdEZpZWxkLAotfQotCi1wYWNrZXQgQml0RmllbGRBZnRlclBheWxvYWRQYWNrZXQgewotICBfcGF5bG9hZF8sCi0gIGJpdF9maWVsZCA6IEJpdEZpZWxkLAotfQotCi1wYWNrZXQgQml0RmllbGRBZnRlclVuc2l6ZWRBcnJheVBhY2tldCA6IEJpdEZpZWxkQWZ0ZXJQYXlsb2FkUGFja2V0IHsKLSAgYXJyYXkgOiA4W10sCi19Ci0KLXBhY2tldCBCaXRGaWVsZEFycmF5UGFja2V0IHsKLSAgX3NpemVfKGFycmF5KTogOCwKLSAgYXJyYXkgOiBCaXRGaWVsZFtdLAotfQotCi1zdHJ1Y3QgVmVyc2lvbmxlc3NTdHJ1Y3QgewotICBvbmVfbnVtYmVyIDogOCwKLX0KLQotcGFja2V0IE9uZVZlcnNpb25sZXNzU3RydWN0UGFja2V0IHsKLSAgdmVyc2lvbmxlc3MgOiBWZXJzaW9ubGVzc1N0cnVjdCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgT25lVmVyc2lvbmVkU3RydWN0UGFja2V0IDogT25lVmVyc2lvbmxlc3NTdHJ1Y3RQYWNrZXQgewotICB2ZXJzaW9uIDogOCwKLSAgX3BheWxvYWRfLAotfQotCi1wYWNrZXQgT25lVmVyc2lvbk9uZVN0cnVjdFBhY2tldCA6IE9uZVZlcnNpb25lZFN0cnVjdFBhY2tldCh2ZXJzaW9uID0gMHgwMSkgewotICBqdXN0X29uZV9udW1iZXIgOiA4LAotfQotCi1wYWNrZXQgT25lVmVyc2lvblR3b1N0cnVjdFBhY2tldCA6IE9uZVZlcnNpb25lZFN0cnVjdFBhY2tldCh2ZXJzaW9uID0gMHgwMikgewotICBvbmVfbnVtYmVyIDogOCwKLSAgYW5vdGhlcl9udW1iZXIgOiA4LAotfQotCi1lbnVtIFN0cnVjdFR5cGUgOiA4IHsKLSAgWkVST19CWVRFID0gMHgwMCwKLSAgVFdPX0JZVEUgPSAweDAyLAotICBGT1VSX0JZVEUgPSAweDA0LAotICBBVF9MRUFTVF9GT1VSX0JZVEUgPSAweDA1LAotICBWQVJJQUJMRSA9IDB4MDYsCi19Ci0KLXN0cnVjdCBVbnVzZWRQYXJlbnRTdHJ1Y3QgewotICBzdHJ1Y3RfdHlwZSA6IFN0cnVjdFR5cGUsCi0gIF9ib2R5XywKLX0KLQotc3RydWN0IFR3b0J5dGVTdHJ1Y3QgOiBVbnVzZWRQYXJlbnRTdHJ1Y3QgKHN0cnVjdF90eXBlID0gVFdPX0JZVEUpIHsKLSAgdHdvX2J5dGVzIDogMTYsCi19Ci0KLXN0cnVjdCBGb3VyQnl0ZVN0cnVjdCA6IFVudXNlZFBhcmVudFN0cnVjdCAoc3RydWN0X3R5cGUgPSBGT1VSX0JZVEUpIHsKLSAgZm91cl9ieXRlcyA6IDMyLAotfQotCi1zdHJ1Y3QgQXRMZWFzdEZvdXJCeXRlU3RydWN0IDogVW51c2VkUGFyZW50U3RydWN0IChzdHJ1Y3RfdHlwZSA9IEFUX0xFQVNUX0ZPVVJfQllURSkgewotICBmb3VyX2J5dGVzIDogMzIsCi0gIHN0cnVjdF90eXBlIDogU3RydWN0VHlwZSwKLSAgX2JvZHlfLAotfQotCi1zdHJ1Y3QgT25seUZvdXJCeXRlU3RydWN0IDogQXRMZWFzdEZvdXJCeXRlU3RydWN0IChzdHJ1Y3RfdHlwZSA9IFpFUk9fQllURSkgewotfQotCi1zdHJ1Y3QgU2l4Qnl0ZVN0cnVjdCA6IEF0TGVhc3RGb3VyQnl0ZVN0cnVjdCAoc3RydWN0X3R5cGUgPSBUV09fQllURSkgewotICB0d29fYnl0ZXMgOiAxNiwKLX0KLQotc3RydWN0IEVpZ2h0Qnl0ZVN0cnVjdCA6IEF0TGVhc3RGb3VyQnl0ZVN0cnVjdCAoc3RydWN0X3R5cGUgPSBGT1VSX0JZVEUpIHsKLSAgZm91cl9ieXRlcyA6IDMyLAotfQotCi1wYWNrZXQgT25lRm91ckJ5dGVTdHJ1Y3QgewotICBvbmVfc3RydWN0IDogRm91ckJ5dGVTdHJ1Y3QsCi19Ci0KLXBhY2tldCBPbmVHZW5lcmljU3RydWN0IHsKLSAgYmFzZV9zdHJ1Y3QgOiBVbnVzZWRQYXJlbnRTdHJ1Y3QsCi19Ci0KLXBhY2tldCBPbmVHZW5lcmljU3RydWN0QXJyYXkgewotICBhbl9hcnJheSA6IFVudXNlZFBhcmVudFN0cnVjdFtdLAotfQotCi1wYWNrZXQgT25lR2VuZXJpY1N0cnVjdEZvdXJBcnJheSB7Ci0gIGFuX2FycmF5IDogVW51c2VkUGFyZW50U3RydWN0WzRdLAotfQotCi1wYWNrZXQgUGFyZW50V2l0aE9ubHlGaXhlZCB7Ci0gIHR3b19ieXRlcyA6IDE2LAotICBfYm9keV8sCi19Ci0KLXBhY2tldCBPbmVHZW5lcmljU3RydWN0QXJyYXlBZnRlckZpeGVkIDogUGFyZW50V2l0aE9ubHlGaXhlZCB7Ci0gIGFuX2FycmF5IDogVW51c2VkUGFyZW50U3RydWN0W10sCi19Ci0KLWVudW0gRGF0YVR5cGUgOiA4IHsKLSAgT05FID0gMHgwMSwKLSAgVFdPID0gMHgwMiwKLSAgVEhSRUUgPSAweDAzLAotICBGT1VSID0gMHgwNCwKLSAgRklWRSA9IDB4MDUsCi0gIFVOVVNFRCA9IDB4MDYsCi19Ci0KLXN0cnVjdCBMZW5ndGhUeXBlVmFsdWVTdHJ1Y3QgewotICBfc2l6ZV8odmFsdWUpIDogMTYsCi0gIHR5cGUgOiBEYXRhVHlwZSwKLSAgdmFsdWUgOiA4WysxKjhdLAotfQotCi1wYWNrZXQgT25lTGVuZ3RoVHlwZVZhbHVlU3RydWN0IHsKLSAgb25lX2FycmF5IDogTGVuZ3RoVHlwZVZhbHVlU3RydWN0W10sCi19Ci0KLXBhY2tldCBTaXplZFBhcmVudCB7Ci0gIF9zaXplXyhwYXlsb2FkKSA6IDgsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IE9uZUxlbmd0aFR5cGVWYWx1ZVN0cnVjdFBhZGRlZCA6IFNpemVkUGFyZW50IHsKLSAgdmFsaWRfYnl0ZXMgOiA4LAotICBvbmVfYXJyYXkgOiBMZW5ndGhUeXBlVmFsdWVTdHJ1Y3RbXSwKLSAgX3BhZGRpbmdfWzMwXSwKLSAgYWZ0ZXJfcGFkZGluZyA6IDgsCi19Ci0KLXBhY2tldCBCeXRlU2l6ZWRGaWVsZHMgewotICBvbmUgOiA4LAotICB0d28gOiAxNiwKLSAgdGhyZWUgOiAyNCwKLSAgZm91ciA6IDMyLAotICBmaXZlIDogNDAsCi0gIHNpeCA6IDQ4LAotICBzZXZlbiA6IDU2LAotICBlaWdodCA6IDY0LAotfQotCi1lbnVtIFN0cnVjdFR5cGVOb1plcm8gOiA0IHsKLSAgVFdPX0JZVEUgPSAweDAyLAotICBGT1VSX0JZVEUgPSAweDA0LAotICBBVF9MRUFTVF9GT1VSX0JZVEUgPSAweDA1LAotfQotCi1zdHJ1Y3QgVW51c2VkUGFyZW50U3RydWN0Tm9aZXJvIHsKLSAgc3RydWN0X3R5cGUgOiBTdHJ1Y3RUeXBlTm9aZXJvLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgbGVuZ3RoIDogOCwKLSAgX2JvZHlfLAotfQotCi1zdHJ1Y3QgVHdvQnl0ZVN0cnVjdE5vWmVybyA6IFVudXNlZFBhcmVudFN0cnVjdE5vWmVybyAoc3RydWN0X3R5cGUgPSBUV09fQllURSwgbGVuZ3RoID0gMikgewotICB0d29fYnl0ZXMgOiAxNiwKLX0KLQotc3RydWN0IEZvdXJCeXRlU3RydWN0Tm9aZXJvIDogVW51c2VkUGFyZW50U3RydWN0Tm9aZXJvIChzdHJ1Y3RfdHlwZSA9IEZPVVJfQllURSwgbGVuZ3RoID0gNCkgewotICBmb3VyX2J5dGVzIDogMzIsCi19Ci0KLXN0cnVjdCBBdExlYXN0Rm91ckJ5dGVTdHJ1Y3ROb1plcm8gOiBVbnVzZWRQYXJlbnRTdHJ1Y3ROb1plcm8gKHN0cnVjdF90eXBlID0gQVRfTEVBU1RfRk9VUl9CWVRFKSB7Ci0gIGZvdXJfYnl0ZXMgOiAzMiwKLSAgc3RydWN0X3R5cGUgOiBTdHJ1Y3RUeXBlTm9aZXJvLAotICBfYm9keV8sCi19Ci0KLXN0cnVjdCBFaWdodEJ5dGVTdHJ1Y3ROb1plcm8gOiBBdExlYXN0Rm91ckJ5dGVTdHJ1Y3ROb1plcm8gKHN0cnVjdF90eXBlID0gRk9VUl9CWVRFLCBsZW5ndGggPSA5KSB7Ci0gIGZvdXJfYnl0ZXMgOiAzMiwKLX0KLQotcGFja2V0IE9uZUdlbmVyaWNTdHJ1Y3RBcnJheU5vWmVybyB7Ci0gIGFuX2FycmF5IDogVW51c2VkUGFyZW50U3RydWN0Tm9aZXJvW10sCi19CmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3QvdmFyaWFibGUuY2MgYi9nZC9wYWNrZXQvcGFyc2VyL3Rlc3QvdmFyaWFibGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDQzYmYuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci90ZXN0L3ZhcmlhYmxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInZhcmlhYmxlLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci1uYW1lc3BhY2UgcGFyc2VyIHsKLW5hbWVzcGFjZSB0ZXN0IHsKLQotVmFyaWFibGU6OlZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDogZGF0YShzdHIpIHt9Ci0KLXZvaWQgVmFyaWFibGU6OlNlcmlhbGl6ZShCaXRJbnNlcnRlciYgYmkpIGNvbnN0IHsKLSAgaWYgKGRhdGEuc2l6ZSgpID4gMjU1KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJkYXRhLnNpemUoKSA+IDI1NTogKCV6dSkiLCBkYXRhLnNpemUoKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBiaS5pbnNlcnRfYnl0ZSgodWludDhfdClkYXRhLnNpemUoKSk7Ci0gIGZvciAoYXV0byBieXRlIDogZGF0YSkgewotICAgIGJpLmluc2VydF9ieXRlKGJ5dGUpOwotICB9Ci19Ci0KLXNpemVfdCBWYXJpYWJsZTo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGRhdGEuc2l6ZSgpICsgMTsKLX0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci19ICAvLyBuYW1lc3BhY2UgcGFyc2VyCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3Rlc3QvdmFyaWFibGUuaCBiL2dkL3BhY2tldC9wYXJzZXIvdGVzdC92YXJpYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjBjMTRmLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9wYXJzZXIvdGVzdC92YXJpYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInBhY2tldC9iaXRfaW5zZXJ0ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvaXRlcmF0b3IuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgcGFja2V0IHsKLW5hbWVzcGFjZSBwYXJzZXIgewotbmFtZXNwYWNlIHRlc3QgewotCi1jbGFzcyBWYXJpYWJsZSBmaW5hbCB7Ci0gcHVibGljOgotICBzdGQ6OnN0cmluZyBkYXRhOwotCi0gIFZhcmlhYmxlKCkgPSBkZWZhdWx0OwotICBWYXJpYWJsZShjb25zdCBWYXJpYWJsZSYpID0gZGVmYXVsdDsKLSAgVmFyaWFibGUoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdm9pZCBTZXJpYWxpemUoQml0SW5zZXJ0ZXImIGJpKSBjb25zdDsKLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotCi0gIHRlbXBsYXRlIDxib29sIGxpdHRsZV9lbmRpYW4+Ci0gIHN0YXRpYyBzdGQ6Om9wdGlvbmFsPEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+PiBQYXJzZShWYXJpYWJsZSogaW5zdGFuY2UsIEl0ZXJhdG9yPGxpdHRsZV9lbmRpYW4+IGl0KSB7Ci0gICAgaWYgKGl0Lk51bUJ5dGVzUmVtYWluaW5nKCkgPCAxKSB7Ci0gICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIHNpemVfdCBkYXRhX2xlbmd0aCA9IGl0LnRlbXBsYXRlIGV4dHJhY3Q8dWludDhfdD4oKTsKLSAgICBpZiAoZGF0YV9sZW5ndGggPiAyNTUpIHsKLSAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0gICAgaWYgKGl0Lk51bUJ5dGVzUmVtYWluaW5nKCkgPCBkYXRhX2xlbmd0aCkgewotICAgICAgcmV0dXJuIHt9OwotICAgIH0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGFfbGVuZ3RoOyBpKyspIHsKLSAgICAgIHNzIDw8IGl0LnRlbXBsYXRlIGV4dHJhY3Q8Y2hhcj4oKTsKLSAgICB9Ci0gICAgKmluc3RhbmNlID0gc3Muc3RyKCk7Ci0gICAgcmV0dXJuIGl0OwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci19ICAvLyBuYW1lc3BhY2UgcGFyc2VyCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcGFyc2VyL3R5cGVfZGVmLmggYi9nZC9wYWNrZXQvcGFyc2VyL3R5cGVfZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWRjYTguLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci90eXBlX2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgImZpZWxkcy9wYWNrZXRfZmllbGQuaCIKLQotY2xhc3MgVHlwZURlZiB7Ci0gcHVibGljOgotICBUeXBlRGVmKHN0ZDo6c3RyaW5nIG5hbWUpIDogbmFtZV8obmFtZSkge30KLQotICBUeXBlRGVmKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBzaXplKSA6IG5hbWVfKG5hbWUpLCBzaXplXyhzaXplKSB7fQotCi0gIHZpcnR1YWwgflR5cGVEZWYoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgZW51bSBjbGFzcyBUeXBlIHsKLSAgICBJTlZBTElELAotICAgIEVOVU0sCi0gICAgQ0hFQ0tTVU0sCi0gICAgQ1VTVE9NLAotICAgIFBBQ0tFVCwKLSAgICBTVFJVQ1QsCi0gIH07Ci0KLSAgdmlydHVhbCBUeXBlIEdldERlZmluaXRpb25UeXBlKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgUGFja2V0RmllbGQqIEdldE5ld0ZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBQYXJzZUxvY2F0aW9uIGxvYykgY29uc3QgPSAwOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOwotICBjb25zdCBpbnQgc2l6ZV97LTF9OwotfTsKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC9wYXJzZXIvdXRpbC5oIGIvZ2QvcGFja2V0L3BhcnNlci91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmUxYzUuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3BhcnNlci91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8cmVnZXg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAibG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBHZXRUeXBlRm9yU2l6ZShpbnQgc2l6ZSkgewotICBpZiAoc2l6ZSA+IDY0KSB7Ci0gICAgRVJST1IoKSA8PCBfX2Z1bmNfXyA8PCAiOiBDYW5ub3QgdXNlIGEgdHlwZSBsYXJnZXIgdGhhbiA2NCBiaXRzLiAoIiA8PCBzaXplIDw8ICIpXG4iOwotICB9Ci0KLSAgaWYgKHNpemUgPD0gOCkgcmV0dXJuICJ1aW50OF90IjsKLQotICBpZiAoc2l6ZSA8PSAxNikgcmV0dXJuICJ1aW50MTZfdCI7Ci0KLSAgaWYgKHNpemUgPD0gMzIpIHJldHVybiAidWludDMyX3QiOwotCi0gIHJldHVybiAidWludDY0X3QiOwotfQotCi1pbmxpbmUgaW50IFJvdW5kU2l6ZVVwKGludCBzaXplKSB7Ci0gIGlmIChzaXplID4gNjQpIHsKLSAgICBFUlJPUigpIDw8IF9fZnVuY19fIDw8ICI6IENhbm5vdCB1c2UgYSB0eXBlIGxhcmdlciB0aGFuIDY0IGJpdHMuICgiIDw8IHNpemUgPDwgIilcbiI7Ci0gIH0KLQotICBpZiAoc2l6ZSA8PSA4KSByZXR1cm4gODsKLSAgaWYgKHNpemUgPD0gMTYpIHJldHVybiAxNjsKLSAgaWYgKHNpemUgPD0gMzIpIHJldHVybiAzMjsKLSAgcmV0dXJuIDY0OwotfQotCi0vLyBSZXR1cm5zIHRoZSBtYXggdmFsdWUgdGhhdCBjYW4gYmUgY29udGFpbmVkIHVuc2lnbmVkIGluIGEgbnVtYmVyIG9mIGJpdHMuCi1pbmxpbmUgdWludDY0X3QgR2V0TWF4VmFsdWVGb3JCaXRzKGludCBiaXRzKSB7Ci0gIGlmIChiaXRzID4gNjQpIHsKLSAgICBFUlJPUigpIDw8IF9fZnVuY19fIDw8ICI6IENhbm5vdCB1c2UgYSB0eXBlIGxhcmdlciB0aGFuIDY0IGJpdHMuICgiIDw8IGJpdHMgPDwgIilcbiI7Ci0gIH0KLQotICAvLyBTZXQgYWxsIHRoZSBiaXRzIHRvIDEsIHRoZW4gc2hpZnQgb2ZmIGV4dHJhcy4KLSAgcmV0dXJuIH4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDApKSA+PiAoNjQgLSBiaXRzKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIENhbWVsQ2FzZVRvVW5kZXJTY29yZShzdGQ6OnN0cmluZyB2YWx1ZSkgewotICBpZiAodmFsdWVbMF0gPCAnQScgfHwgdmFsdWVbMF0gPiAnWicpIHsKLSAgICBFUlJPUigpIDw8IHZhbHVlIDw8ICIgZG9lc24ndCBsb29rIGxpa2UgQ2FtZWxDYXNlIjsKLSAgfQotCi0gIC8vIFVzZSBzdGF0aWMgdG8gYXZvaWQgY29tcGlsaW5nIHRoZSByZWdleCBtb3JlIHRoYW4gb25jZS4KLSAgc3RhdGljIGNvbnN0IHN0ZDo6cmVnZXggY2FtZWxfY2FzZV9yZWdleCgiW0EtWl1bYS16MC05XSoiKTsKLQotICAvLyBBZGQgYW4gdW5kZXJzY29yZSB0byB0aGUgZW5kIG9mIGVhY2ggcGF0dGVybiBtYXRjaC4KLSAgdmFsdWUgPSBzdGQ6OnJlZ2V4X3JlcGxhY2UodmFsdWUsIGNhbWVsX2Nhc2VfcmVnZXgsICIkJl8iKTsKLQotICAvLyBSZW1vdmUgdGhlIGxhc3QgdW5kZXJzY29yZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0gIHZhbHVlLnBvcF9iYWNrKCk7Ci0KLSAgLy8gQ29udmVydCBhbGwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UuCi0gIHN0ZDo6dHJhbnNmb3JtKHZhbHVlLmJlZ2luKCksIHZhbHVlLmVuZCgpLCB2YWx1ZS5iZWdpbigpLCBbXSh1bnNpZ25lZCBjaGFyIGMpIHsgcmV0dXJuIHN0ZDo6dG9sb3dlcihjKTsgfSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgVW5kZXJzY29yZVRvQ2FtZWxDYXNlKHN0ZDo6c3RyaW5nIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZVswXSA8ICdhJyB8fCB2YWx1ZVswXSA+ICd6JykgewotICAgIEVSUk9SKCkgPDwgdmFsdWUgPDwgIiBpbnZhbGlkIGlkZW50aWZpZXIiOwotICB9Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGNhbWVsX2Nhc2U7Ci0KLSAgYm9vbCBjYXBpdGFsaXplID0gdHJ1ZTsKLSAgZm9yICh1bnNpZ25lZCBjaGFyIGMgOiB2YWx1ZSkgewotICAgIGlmIChjID09ICdfJykgewotICAgICAgY2FwaXRhbGl6ZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChjYXBpdGFsaXplKSB7Ci0gICAgICAgIGMgPSBzdGQ6OnRvdXBwZXIoYyk7Ci0gICAgICAgIGNhcGl0YWxpemUgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhbWVsX2Nhc2UgPDwgYzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gY2FtZWxfY2FzZS5zdHIoKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIENvbnN0YW50Q2FzZVRvQ2FtZWxDYXNlKHN0ZDo6c3RyaW5nIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZVswXSA8ICdBJyB8fCB2YWx1ZVswXSA+ICdaJykgewotICAgIEVSUk9SKCkgPDwgdmFsdWUgPDwgIiBkb2Vzbid0IGxvb2sgbGlrZSBDT05TVEFOVF9DQVNFIjsKLSAgfQotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBjYW1lbF9jYXNlOwotCi0gIGJvb2wgY2FwaXRhbGl6ZSA9IHRydWU7Ci0gIGZvciAodW5zaWduZWQgY2hhciBjIDogdmFsdWUpIHsKLSAgICBpZiAoYyA9PSAnXycpIHsKLSAgICAgIGNhcGl0YWxpemUgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoY2FwaXRhbGl6ZSkgewotICAgICAgICBjID0gc3RkOjp0b3VwcGVyKGMpOwotICAgICAgICBjYXBpdGFsaXplID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjID0gc3RkOjp0b2xvd2VyKGMpOwotICAgICAgfQotICAgICAgY2FtZWxfY2FzZSA8PCBjOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBjYW1lbF9jYXNlLnN0cigpOwotfQotCi1pbmxpbmUgYm9vbCBJc0VudW1DYXNlKHN0ZDo6c3RyaW5nIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZVswXSA8ICdBJyB8fCB2YWx1ZVswXSA+ICdaJykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFVzZSBzdGF0aWMgdG8gYXZvaWQgY29tcGlsaW5nIHRoZSByZWdleCBtb3JlIHRoYW4gb25jZS4KLSAgc3RhdGljIGNvbnN0IHN0ZDo6cmVnZXggZW51bV9yZWdleCgiW0EtWl1bQS1aMC05X10qIik7Ci0KLSAgcmV0dXJuIHN0ZDo6cmVnZXhfbWF0Y2godmFsdWUsIGVudW1fcmVnZXgpOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgU3RyaW5nSm9pbihjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW1pdGVyLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHZlYykgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWMuc2l6ZSgpOyBpKyspIHsKLSAgICBzcyA8PCB2ZWNbaV07Ci0gICAgaWYgKGkgIT0gKHZlYy5zaXplKCkgLSAxKSkgewotICAgICAgc3MgPDwgZGVsaW1pdGVyOwotICAgIH0KLSAgfQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBTdHJpbmdGaW5kQW5kUmVwbGFjZUFsbChzdGQ6OnN0cmluZyB0ZXh0LCBjb25zdCBzdGQ6OnN0cmluZyYgb2xkLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVwbGFjZW1lbnQpIHsKLSAgYXV0byBwb3MgPSB0ZXh0LmZpbmQob2xkKTsKLSAgd2hpbGUgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIHRleHQucmVwbGFjZShwb3MsIG9sZC5zaXplKCksIHJlcGxhY2VtZW50KTsKLSAgICBwb3MgPSB0ZXh0LmZpbmQob2xkLCBwb3MgKyByZXBsYWNlbWVudC5zaXplKCkpOwotICB9Ci0gIHJldHVybiB0ZXh0OwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgR2V0UnVzdFR5cGVGb3JTaXplKGludCBzaXplKSB7Ci0gIGlmIChzaXplID4gNjQpIHsKLSAgICBFUlJPUigpIDw8IF9fZnVuY19fIDw8ICI6IENhbm5vdCB1c2UgYSB0eXBlIGxhcmdlciB0aGFuIDY0IGJpdHMuICgiIDw8IHNpemUgPDwgIilcbiI7Ci0gIH0KLQotICBpZiAoc2l6ZSA8PSA4KSByZXR1cm4gInU4IjsKLQotICBpZiAoc2l6ZSA8PSAxNikgcmV0dXJuICJ1MTYiOwotCi0gIGlmIChzaXplIDw9IDMyKSByZXR1cm4gInUzMiI7Ci0KLSAgcmV0dXJuICJ1NjQiOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgVG9Mb3dlckNhc2Uoc3RkOjpzdHJpbmcgdmFsdWUpIHsKLSAgaWYgKHZhbHVlWzBdIDwgJ0EnIHx8IHZhbHVlWzBdID4gJ1onKSB7Ci0gICAgRVJST1IoKSA8PCB2YWx1ZSA8PCAiIGRvZXNuJ3QgbG9vayBsaWtlIENPTlNUQU5UX0NBU0UiOwotICB9Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGxvd2VyX2Nhc2U7Ci0KLSAgZm9yICh1bnNpZ25lZCBjaGFyIGMgOiB2YWx1ZSkgewotICAgIGMgPSBzdGQ6OnRvbG93ZXIoYyk7Ci0gICAgbG93ZXJfY2FzZSA8PCBjOwotICB9Ci0KLSAgcmV0dXJuIGxvd2VyX2Nhc2Uuc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1dGlsCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcHl0aG9uM19tb2R1bGUuY2MgYi9nZC9wYWNrZXQvcHl0aG9uM19tb2R1bGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTc3MGYuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3B5dGhvbjNfbW9kdWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgotI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJoY2kvY2xhc3Nfb2ZfZGV2aWNlLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvYml0X2luc2VydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2l0ZXJhdG9yLmgiCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF9idWlsZGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFyc2VyL2NoZWNrc3VtX3R5cGVfY2hlY2tlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYXJzZXIvY3VzdG9tX3R5cGVfY2hlY2tlci5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgcHkgPSBweWJpbmQxMTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSBoY2kgewotdm9pZCBkZWZpbmVfaGNpX3BhY2tldHNfc3VibW9kdWxlKHB5Ojptb2R1bGUmKTsKLX0KLW5hbWVzcGFjZSBsMmNhcCB7Ci12b2lkIGRlZmluZV9sMmNhcF9wYWNrZXRzX3N1Ym1vZHVsZShweTo6bW9kdWxlJik7Ci19Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotdm9pZCBkZWZpbmVfc21wX3BhY2tldHNfc3VibW9kdWxlKHB5Ojptb2R1bGUmKTsKLX0KLQotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci11c2luZyA6OmJsdWV0b290aDo6aGNpOjpDbGFzc09mRGV2aWNlOwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpCYXNlU3RydWN0OwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXI7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpDdXN0b21UeXBlQ2hlY2tlcjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6Okl0ZXJhdG9yOwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6a0xpdHRsZUVuZGlhbjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldEJ1aWxkZXI7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRTdHJ1Y3Q7Ci11c2luZyA6OmJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRWaWV3OwotdXNpbmcgOjpibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcjsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpwYWNrZXQ6OnBhcnNlcjo6Q2hlY2tzdW1UeXBlQ2hlY2tlcjsKLQotUFlCSU5EMTFfTU9EVUxFKGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMsIG0pIHsKLSAgcHk6OmNsYXNzXzxCYXNlUGFja2V0QnVpbGRlciwgc3RkOjpzaGFyZWRfcHRyPEJhc2VQYWNrZXRCdWlsZGVyPj4obSwgIkJhc2VQYWNrZXRCdWlsZGVyIik7Ci0gIHB5OjpjbGFzc188UmF3QnVpbGRlciwgQmFzZVBhY2tldEJ1aWxkZXIsIHN0ZDo6c2hhcmVkX3B0cjxSYXdCdWlsZGVyPj4obSwgIlJhd0J1aWxkZXIiKQotICAgICAgLmRlZihweTo6aW5pdChbXShzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcykgeyByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihieXRlcyk7IH0pKQotICAgICAgLmRlZihweTo6aW5pdChbXShzdGQ6OnN0cmluZyBieXRlcykgewotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSYXdCdWlsZGVyPihzdGQ6OnZlY3Rvcjx1aW50OF90PihieXRlcy5iZWdpbigpLCBieXRlcy5lbmQoKSkpOwotICAgICAgfSkpCi0gICAgICAuZGVmKCJTZXJpYWxpemUiLCBbXShSYXdCdWlsZGVyJiBidWlsZGVyKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldDsKLSAgICAgICAgQml0SW5zZXJ0ZXIgaXQocGFja2V0KTsKLSAgICAgICAgYnVpbGRlci5TZXJpYWxpemUoaXQpOwotICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSBzdGQ6OnN0cmluZyhwYWNrZXQuYmVnaW4oKSwgcGFja2V0LmVuZCgpKTsKLSAgICAgICAgcmV0dXJuIHB5OjpieXRlcyhyZXN1bHQpOwotICAgICAgfSk7Ci0gIHB5OjpjbGFzc188UGFja2V0QnVpbGRlcjxrTGl0dGxlRW5kaWFuPiwgQmFzZVBhY2tldEJ1aWxkZXIsIHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXRCdWlsZGVyPGtMaXR0bGVFbmRpYW4+Pj4oCi0gICAgICBtLCAiUGFja2V0QnVpbGRlckxpdHRsZUVuZGlhbiIpOwotICBweTo6Y2xhc3NfPFBhY2tldEJ1aWxkZXI8IWtMaXR0bGVFbmRpYW4+LCBCYXNlUGFja2V0QnVpbGRlciwgc3RkOjpzaGFyZWRfcHRyPFBhY2tldEJ1aWxkZXI8IWtMaXR0bGVFbmRpYW4+Pj4oCi0gICAgICBtLCAiUGFja2V0QnVpbGRlckJpZ0VuZGlhbiIpOwotICBweTo6Y2xhc3NfPEJhc2VTdHJ1Y3QsIHN0ZDo6c2hhcmVkX3B0cjxCYXNlU3RydWN0Pj4obSwgIkJhc2VTdHJ1Y3QiKTsKLSAgcHk6OmNsYXNzXzxQYWNrZXRTdHJ1Y3Q8a0xpdHRsZUVuZGlhbj4sIEJhc2VTdHJ1Y3QsIHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXRTdHJ1Y3Q8a0xpdHRsZUVuZGlhbj4+PigKLSAgICAgIG0sICJQYWNrZXRTdHJ1Y3RMaXR0bGVFbmRpYW4iKTsKLSAgcHk6OmNsYXNzXzxQYWNrZXRTdHJ1Y3Q8IWtMaXR0bGVFbmRpYW4+LCBCYXNlU3RydWN0LCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0U3RydWN0PCFrTGl0dGxlRW5kaWFuPj4+KAotICAgICAgbSwgIlBhY2tldFN0cnVjdEJpZ0VuZGlhbiIpOwotICBweTo6Y2xhc3NfPEl0ZXJhdG9yPGtMaXR0bGVFbmRpYW4+PihtLCAiSXRlcmF0b3JMaXR0bGVFbmRpYW4iKTsKLSAgcHk6OmNsYXNzXzxJdGVyYXRvcjwha0xpdHRsZUVuZGlhbj4+KG0sICJJdGVyYXRvckJpZ0VuZGlhbiIpOwotICBweTo6Y2xhc3NfPFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4+KG0sICJQYWNrZXRWaWV3TGl0dGxlRW5kaWFuIikKLSAgICAgIC5kZWYocHk6OmluaXQoW10oc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXMpIHsKLSAgICAgICAgLy8gTWFrZSBhIGNvcHkKLSAgICAgICAgYXV0byBieXRlc19zaGFyZWQgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihieXRlcyk7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4+KGJ5dGVzX3NoYXJlZCk7Ci0gICAgICB9KSkKLSAgICAgIC5kZWYoIkdldEJ5dGVzIiwgW10oY29uc3QgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiB2aWV3KSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICAgICAgZm9yIChhdXRvIGJ5dGUgOiB2aWV3KSB7Ci0gICAgICAgICAgcmVzdWx0ICs9IGJ5dGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHB5OjpieXRlcyhyZXN1bHQpOwotICAgICAgfSk7Ci0gIHB5OjpjbGFzc188UGFja2V0Vmlldzwha0xpdHRsZUVuZGlhbj4+KG0sICJQYWNrZXRWaWV3QmlnRW5kaWFuIikuZGVmKHB5Ojppbml0KFtdKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzKSB7Ci0gICAgLy8gTWFrZSBhIGNvcHkKLSAgICBhdXRvIGJ5dGVzX3NoYXJlZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGJ5dGVzKTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxQYWNrZXRWaWV3PCFrTGl0dGxlRW5kaWFuPj4oYnl0ZXNfc2hhcmVkKTsKLSAgfSkpOwotCi0gIHB5Ojptb2R1bGUgaGNpX20gPSBtLmRlZl9zdWJtb2R1bGUoImhjaV9wYWNrZXRzIiwgIkEgc3VibW9kdWxlIG9mIGhjaV9wYWNrZXRzIik7Ci0gIGJsdWV0b290aDo6aGNpOjpkZWZpbmVfaGNpX3BhY2tldHNfc3VibW9kdWxlKGhjaV9tKTsKLQotICBweTo6Y2xhc3NfPEFkZHJlc3M+KGhjaV9tLCAiQWRkcmVzcyIpCi0gICAgICAuZGVmKHB5Ojppbml0PD4oKSkKLSAgICAgIC5kZWYoIl9fcmVwcl9fIiwgW10oY29uc3QgQWRkcmVzcyYgYSkgeyByZXR1cm4gYS5Ub1N0cmluZygpOyB9KQotICAgICAgLmRlZigiX19zdHJfXyIsIFtdKGNvbnN0IEFkZHJlc3MmIGEpIHsgcmV0dXJuIGEuVG9TdHJpbmcoKTsgfSk7Ci0KLSAgcHk6OmNsYXNzXzxDbGFzc09mRGV2aWNlPihoY2lfbSwgIkNsYXNzT2ZEZXZpY2UiKQotICAgICAgLmRlZihweTo6aW5pdDw+KCkpCi0gICAgICAuZGVmKCJfX3JlcHJfXyIsIFtdKGNvbnN0IENsYXNzT2ZEZXZpY2UmIGMpIHsgcmV0dXJuIGMuVG9TdHJpbmcoKTsgfSkKLSAgICAgIC5kZWYoIl9fc3RyX18iLCBbXShjb25zdCBDbGFzc09mRGV2aWNlJiBjKSB7IHJldHVybiBjLlRvU3RyaW5nKCk7IH0pOwotCi0gIHB5Ojptb2R1bGUgbDJjYXBfbSA9IG0uZGVmX3N1Ym1vZHVsZSgibDJjYXBfcGFja2V0cyIsICJBIHN1Ym1vZHVsZSBvZiBsMmNhcF9wYWNrZXRzIik7Ci0gIGJsdWV0b290aDo6bDJjYXA6OmRlZmluZV9sMmNhcF9wYWNrZXRzX3N1Ym1vZHVsZShsMmNhcF9tKTsKLSAgcHk6Om1vZHVsZSBzZWN1cml0eV9tID0gbS5kZWZfc3VibW9kdWxlKCJzZWN1cml0eV9wYWNrZXRzIiwgIkEgc3VibW9kdWxlIG9mIHNlY3VyaXR5X3BhY2tldHMiKTsKLSAgYmx1ZXRvb3RoOjpzZWN1cml0eTo6ZGVmaW5lX3NtcF9wYWNrZXRzX3N1Ym1vZHVsZShzZWN1cml0eV9tKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3Jhd19idWlsZGVyLmNjIGIvZ2QvcGFja2V0L3Jhd19idWlsZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJmZjY4Li4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9yYXdfYnVpbGRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi1SYXdCdWlsZGVyOjpSYXdCdWlsZGVyKHNpemVfdCBtYXhfYnl0ZXMpIDogbWF4X2J5dGVzXyhtYXhfYnl0ZXMpIHt9Ci1SYXdCdWlsZGVyOjpSYXdCdWlsZGVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYykgOiBwYXlsb2FkXyhzdGQ6Om1vdmUodmVjKSkge30KLQotYm9vbCBSYXdCdWlsZGVyOjpBZGRPY3RldHMoc2l6ZV90IG9jdGV0cywgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBieXRlcykgewotICBpZiAocGF5bG9hZF8uc2l6ZSgpICsgb2N0ZXRzID4gbWF4X2J5dGVzXykgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChvY3RldHMgIT0gYnl0ZXMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgcGF5bG9hZF8uaW5zZXJ0KHBheWxvYWRfLmVuZCgpLCBieXRlcy5iZWdpbigpLCBieXRlcy5lbmQoKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUmF3QnVpbGRlcjo6QWRkT2N0ZXRzKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgYnl0ZXMpIHsKLSAgcmV0dXJuIEFkZE9jdGV0cyhieXRlcy5zaXplKCksIGJ5dGVzKTsKLX0KLQotYm9vbCBSYXdCdWlsZGVyOjpBZGRPY3RldHMoc2l6ZV90IG9jdGV0cywgdWludDY0X3QgdmFsdWUpIHsKLSAgdmVjdG9yPHVpbnQ4X3Q+IHZhbF92ZWN0b3I7Ci0KLSAgdWludDY0X3QgdiA9IHZhbHVlOwotCi0gIGlmIChvY3RldHMgPiBzaXplb2YodWludDY0X3QpKSByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvY3RldHM7IGkrKykgewotICAgIHZhbF92ZWN0b3IucHVzaF9iYWNrKHYgJiAweGZmKTsKLSAgICB2ID0gdiA+PiA4OwotICB9Ci0KLSAgaWYgKHYgIT0gMCkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBBZGRPY3RldHMob2N0ZXRzLCB2YWxfdmVjdG9yKTsKLX0KLQotYm9vbCBSYXdCdWlsZGVyOjpBZGRBZGRyZXNzKGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MpIHsKLSAgaWYgKHBheWxvYWRfLnNpemUoKSArIEFkZHJlc3M6OmtMZW5ndGggPiBtYXhfYnl0ZXNfKSByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBZGRyZXNzOjprTGVuZ3RoOyBpKyspIHsKLSAgICBwYXlsb2FkXy5wdXNoX2JhY2soYWRkcmVzcy5hZGRyZXNzW2ldKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSYXdCdWlsZGVyOjpBZGRPY3RldHMxKHVpbnQ4X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEFkZE9jdGV0cygxLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgUmF3QnVpbGRlcjo6QWRkT2N0ZXRzMih1aW50MTZfdCB2YWx1ZSkgewotICByZXR1cm4gQWRkT2N0ZXRzKDIsIHZhbHVlKTsKLX0KLQotYm9vbCBSYXdCdWlsZGVyOjpBZGRPY3RldHMzKHVpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBBZGRPY3RldHMoMywgdmFsdWUpOwotfQotCi1ib29sIFJhd0J1aWxkZXI6OkFkZE9jdGV0czQodWludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIEFkZE9jdGV0cyg0LCB2YWx1ZSk7Ci19Ci0KLWJvb2wgUmF3QnVpbGRlcjo6QWRkT2N0ZXRzNih1aW50NjRfdCB2YWx1ZSkgewotICByZXR1cm4gQWRkT2N0ZXRzKDYsIHZhbHVlKTsKLX0KLQotYm9vbCBSYXdCdWlsZGVyOjpBZGRPY3RldHM4KHVpbnQ2NF90IHZhbHVlKSB7Ci0gIHJldHVybiBBZGRPY3RldHMoOCwgdmFsdWUpOwotfQotCi1ib29sIFJhd0J1aWxkZXI6OkNhbkFkZE9jdGV0cyhzaXplX3QgbnVtX2J5dGVzKSBjb25zdCB7Ci0gIHJldHVybiBwYXlsb2FkXy5zaXplKCkgKyBudW1fYnl0ZXMgPD0gbWF4X2J5dGVzXzsKLX0KLQotdm9pZCBSYXdCdWlsZGVyOjpTZXJpYWxpemUoQml0SW5zZXJ0ZXImIGl0KSBjb25zdCB7Ci0gIGZvciAoY29uc3QgYXV0byYgdmFsIDogcGF5bG9hZF8pIHsKLSAgICBpbnNlcnQodmFsLCBpdCk7Ci0gIH0KLX0KLQotc2l6ZV90IFJhd0J1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwYXlsb2FkXy5zaXplKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcmF3X2J1aWxkZXIuaCBiL2dkL3BhY2tldC9yYXdfYnVpbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDdiZmVkLi4wMDAwMDAwCi0tLSBhL2dkL3BhY2tldC9yYXdfYnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAicGFja2V0L2JpdF9pbnNlcnRlci5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfYnVpbGRlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi1jbGFzcyBSYXdCdWlsZGVyIDogcHVibGljIFBhY2tldEJ1aWxkZXI8dHJ1ZT4gewotIHB1YmxpYzoKLSAgUmF3QnVpbGRlcigpID0gZGVmYXVsdDsKLSAgZXhwbGljaXQgUmF3QnVpbGRlcihzaXplX3QgbWF4X2J5dGVzKTsKLSAgZXhwbGljaXQgUmF3QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMpOwotICB2aXJ0dWFsIH5SYXdCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplKEJpdEluc2VydGVyJiBpdCkgY29uc3Q7Ci0KLSAgLy8gQWRkIHxhZGRyZXNzfCB0byB0aGUgcGF5bG9hZC4gIFJldHVybiB0cnVlIGlmOgotICAvLyAtIHRoZSBuZXcgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpcyBzdGlsbCA8PSB8bWF4X2J5dGVzX3wKLSAgYm9vbCBBZGRBZGRyZXNzKGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLSAgLy8gUmV0dXJuIHRydWUgaWYgfG51bV9ieXRlc3wgY2FuIGJlIGFkZGVkIHRvIHRoZSBwYXlsb2FkLgotICBib29sIENhbkFkZE9jdGV0cyhzaXplX3QgbnVtX2J5dGVzKSBjb25zdDsKLQotICAvLyBBZGQgfG9jdGV0c3wgYnl0ZXMgdG8gdGhlIHBheWxvYWQuICBSZXR1cm4gdHJ1ZSBpZjoKLSAgLy8gLSB0aGUgc2l6ZSBvZiB8Ynl0ZXN8IGlzIGVxdWFsIHRvIHxvY3RldHN8IGFuZAotICAvLyAtIHRoZSBuZXcgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpcyBzdGlsbCA8PSB8bWF4X2J5dGVzX3wKLSAgYm9vbCBBZGRPY3RldHMoc2l6ZV90IG9jdGV0cywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGJ5dGVzKTsKLQotICBib29sIEFkZE9jdGV0cyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYnl0ZXMpOwotCi0gIGJvb2wgQWRkT2N0ZXRzMSh1aW50OF90IHZhbHVlKTsKLSAgYm9vbCBBZGRPY3RldHMyKHVpbnQxNl90IHZhbHVlKTsKLSAgYm9vbCBBZGRPY3RldHMzKHVpbnQzMl90IHZhbHVlKTsKLSAgYm9vbCBBZGRPY3RldHM0KHVpbnQzMl90IHZhbHVlKTsKLSAgYm9vbCBBZGRPY3RldHM2KHVpbnQ2NF90IHZhbHVlKTsKLSAgYm9vbCBBZGRPY3RldHM4KHVpbnQ2NF90IHZhbHVlKTsKLQotIHByaXZhdGU6Ci0gIC8vIEFkZCB8b2N0ZXRzfCBieXRlcyB0byB0aGUgcGF5bG9hZC4gIFJldHVybiB0cnVlIGlmOgotICAvLyAtIHRoZSB2YWx1ZSBvZiB8dmFsdWV8IGZpdHMgaW4gfG9jdGV0c3wgYnl0ZXMgYW5kCi0gIC8vIC0gdGhlIG5ldyBzaXplIG9mIHRoZSBwYXlsb2FkIGlzIHN0aWxsIDw9IHxtYXhfYnl0ZXNffAotICBib29sIEFkZE9jdGV0cyhzaXplX3Qgb2N0ZXRzLCB1aW50NjRfdCB2YWx1ZSk7Ci0KLSAgc2l6ZV90IG1heF9ieXRlc197MHhmZmZmfTsKLQotICAvLyBVbmRlcmx5aW5nIGNvbnRhaW5lcnMgZm9yIHN0b3JpbmcgdGhlIGFjdHVhbCBwYWNrZXQKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFja2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9wYWNrZXQvcmF3X2J1aWxkZXJfdW5pdHRlc3QuY2MgYi9nZC9wYWNrZXQvcmF3X2J1aWxkZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Y2EwZWQuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3Jhd19idWlsZGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB7Ci12ZWN0b3I8dWludDhfdD4gY291bnQgPSB7Ci0gICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwKLSAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHBhY2tldCB7Ci0KLWNsYXNzIFJhd0J1aWxkZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBSYXdCdWlsZGVyVGVzdCgpID0gZGVmYXVsdDsKLSAgflJhd0J1aWxkZXJUZXN0KCkgPSBkZWZhdWx0OwotfTsKLQotVEVTVChSYXdCdWlsZGVyVGVzdCwgYnVpbGRDb3VudFRlc3QpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+IGNvdW50X2J1aWxkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KCk7Ci0gIEFTU0VSVF9FUSgwdSwgY291bnRfYnVpbGRlci0+c2l6ZSgpKTsKLSAgY291bnRfYnVpbGRlci0+QWRkT2N0ZXRzOCgweDA3MDYwNTA0MDMwMjAxMDApOwotICBjb3VudF9idWlsZGVyLT5BZGRPY3RldHM0KDB4MGIwYTA5MDgpOwotICBjb3VudF9idWlsZGVyLT5BZGRPY3RldHMyKDB4MGQwYyk7Ci0gIGNvdW50X2J1aWxkZXItPkFkZE9jdGV0czEoMHgwZSk7Ci0gIGNvdW50X2J1aWxkZXItPkFkZE9jdGV0czEoMHgwZik7Ci0gIGNvdW50X2J1aWxkZXItPkFkZEFkZHJlc3MoQWRkcmVzcyh7MHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNX0pKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY291bnRfc3Vic2V0KGNvdW50LmJlZ2luKCkgKyAweDE2LCBjb3VudC5lbmQoKSk7Ci0gIGNvdW50X2J1aWxkZXItPkFkZE9jdGV0cyhjb3VudF9zdWJzZXQpOwotCi0gIEFTU0VSVF9FUShjb3VudC5zaXplKCksIGNvdW50X2J1aWxkZXItPnNpemUoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0OwotICBCaXRJbnNlcnRlciBpdChwYWNrZXQpOwotCi0gIGNvdW50X2J1aWxkZXItPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGNvdW50LCBwYWNrZXQpOwotfQotCi1URVNUKFJhd0J1aWxkZXJUZXN0LCBidWlsZFN0YXJ0aW5nV2l0aFZlY3RvcikgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb3VudF9maXJzdChjb3VudC5iZWdpbigpLCBjb3VudC5iZWdpbigpICsgMHg4KTsKLSAgc3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+IGNvdW50X2J1aWxkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KGNvdW50X2ZpcnN0KTsKLSAgY291bnRfYnVpbGRlci0+QWRkT2N0ZXRzNCgweDBiMGEwOTA4KTsKLSAgY291bnRfYnVpbGRlci0+QWRkT2N0ZXRzMigweDBkMGMpOwotICBjb3VudF9idWlsZGVyLT5BZGRPY3RldHMxKDB4MGUpOwotICBjb3VudF9idWlsZGVyLT5BZGRPY3RldHMxKDB4MGYpOwotICBjb3VudF9idWlsZGVyLT5BZGRPY3RldHM4KDB4MTcxNjE1MTQxMzEyMTExMCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvdW50X2xhc3QoY291bnQuYmVnaW4oKSArIDB4MTgsIGNvdW50LmVuZCgpKTsKLSAgY291bnRfYnVpbGRlci0+QWRkT2N0ZXRzKGNvdW50X2xhc3QpOwotCi0gIEFTU0VSVF9FUShjb3VudC5zaXplKCksIGNvdW50X2J1aWxkZXItPnNpemUoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0OwotICBCaXRJbnNlcnRlciBpdChwYWNrZXQpOwotCi0gIGNvdW50X2J1aWxkZXItPlNlcmlhbGl6ZShpdCk7Ci0KLSAgQVNTRVJUX0VRKGNvdW50LCBwYWNrZXQpOwotfQotCi1URVNUKFJhd0J1aWxkZXJUZXN0LCB0ZXN0TWF4Qnl0ZXMpIHsKLSAgY29uc3Qgc2l6ZV90IGtNYXhCeXRlcyA9IGNvdW50LnNpemUoKTsKLSAgc3RkOjp1bmlxdWVfcHRyPFJhd0J1aWxkZXI+IGNvdW50X2J1aWxkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhd0J1aWxkZXI+KGtNYXhCeXRlcyk7Ci0gIEFTU0VSVF9UUlVFKGNvdW50X2J1aWxkZXItPkFkZE9jdGV0cyhjb3VudCkpOwotICBBU1NFUlRfRkFMU0UoY291bnRfYnVpbGRlci0+QWRkT2N0ZXRzNCgweDBiMGEwOTA4KSk7Ci0gIEFTU0VSVF9GQUxTRShjb3VudF9idWlsZGVyLT5BZGRPY3RldHMyKDB4MGQwYykpOwotICBBU1NFUlRfRkFMU0UoY291bnRfYnVpbGRlci0+QWRkT2N0ZXRzMSgweDBlKSk7Ci0gIEFTU0VSVF9GQUxTRShjb3VudF9idWlsZGVyLT5BZGRPY3RldHMxKDB4MGYpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvdW50X2J1aWxkZXItPkFkZE9jdGV0czgoMHgxNzE2MTUxNDEzMTIxMTEwKSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvdW50X2xhc3QoY291bnQuYmVnaW4oKSArIDB4MTgsIGNvdW50LmVuZCgpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvdW50X2J1aWxkZXItPkFkZE9jdGV0cyhjb3VudF9sYXN0KSk7Ci0KLSAgQVNTRVJUX0VRKGNvdW50LnNpemUoKSwgY291bnRfYnVpbGRlci0+c2l6ZSgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXQ7Ci0gIEJpdEluc2VydGVyIGl0KHBhY2tldCk7Ci0KLSAgY291bnRfYnVpbGRlci0+U2VyaWFsaXplKGl0KTsKLQotICBBU1NFUlRfRVEoY291bnQsIHBhY2tldCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3BhY2tldC92aWV3LmNjIGIvZ2QvcGFja2V0L3ZpZXcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGZiNmMuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3ZpZXcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicGFja2V0L3ZpZXcuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi1WaWV3OjpWaWV3KHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gZGF0YSwgc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kKQotICAgIDogZGF0YV8oZGF0YSksIGJlZ2luXyhiZWdpbiA8IGRhdGFfLT5zaXplKCkgPyBiZWdpbiA6IGRhdGFfLT5zaXplKCkpLAotICAgICAgZW5kXyhlbmQgPCBkYXRhXy0+c2l6ZSgpID8gZW5kIDogZGF0YV8tPnNpemUoKSkge30KLQotVmlldzo6Vmlldyhjb25zdCBWaWV3JiB2aWV3LCBzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIDogZGF0YV8odmlldy5kYXRhXykgewotICBiZWdpbl8gPSAoYmVnaW4gPCB2aWV3LnNpemUoKSA/IGJlZ2luIDogdmlldy5zaXplKCkpOwotICBiZWdpbl8gKz0gdmlldy5iZWdpbl87Ci0gIGVuZF8gPSAoZW5kIDwgdmlldy5zaXplKCkgPyBlbmQgOiB2aWV3LnNpemUoKSk7Ci0gIGVuZF8gKz0gdmlldy5iZWdpbl87Ci19Ci0KLXVpbnQ4X3QgVmlldzo6b3BlcmF0b3JbXShzaXplX3QgaSkgY29uc3QgewotICBBU1NFUlRfTE9HKGkgKyBiZWdpbl8gPCBlbmRfLCAiT3V0IG9mIGJvdW5kcyBhY2Nlc3MgYXQgJXp1IiwgaSk7Ci0gIHJldHVybiBkYXRhXy0+b3BlcmF0b3JbXShpICsgYmVnaW5fKTsKLX0KLQotc2l6ZV90IFZpZXc6OnNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBlbmRfIC0gYmVnaW5fOwotfQotfSAgLy8gbmFtZXNwYWNlIHBhY2tldAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcGFja2V0L3ZpZXcuaCBiL2dkL3BhY2tldC92aWV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGI2NzkuLjAwMDAwMDAKLS0tIGEvZ2QvcGFja2V0L3ZpZXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBwYWNrZXQgewotCi0vLyBCYXNlIGNsYXNzIHRoYXQgaG9sZHMgYSBzaGFyZWQgcG9pbnRlciB0byBkYXRhIHdpdGggYm91bmRzLgotY2xhc3MgVmlldyB7Ci0gcHVibGljOgotICBWaWV3KHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gZGF0YSwgc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kKTsKLSAgVmlldyhjb25zdCBWaWV3JiB2aWV3LCBzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpOwotICBWaWV3KGNvbnN0IFZpZXcmIHZpZXcpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+VmlldygpID0gZGVmYXVsdDsKLQotICB1aW50OF90IG9wZXJhdG9yW10oc2l6ZV90IGkpIGNvbnN0OwotCi0gIHNpemVfdCBzaXplKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4+IGRhdGFfOwotICBzaXplX3QgYmVnaW5fOwotICBzaXplX3QgZW5kXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNrZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3Byb3RvL0FuZHJvaWQuYnAgYi9nZC9wcm90by9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGMxMjQ0Li4wMDAwMDAwCi0tLSBhL2dkL3Byb3RvL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1qYXZhX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoLXByb3Rvcy1saXRlIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBwcm90bzogewotICAgICAgICB0eXBlOiAibGl0ZSIsCi0gICAgfSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGgvbWV0cmljcy9ibHVldG9vdGgucHJvdG8iLAotICAgICAgICAiYmx1ZXRvb3RoL2JsdWV0b290aEtleXN0b3JlL2tleXN0b3JlLnByb3RvIiwKLSAgICBdLAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHByb3RvOiB7Ci0gICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAotICAgICAgICB0eXBlOiAibGl0ZSIsCi0gICAgfSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGgvbWV0cmljcy9ibHVldG9vdGgucHJvdG8iLAotICAgICAgICAiYmx1ZXRvb3RoL2JsdWV0b290aEtleXN0b3JlL2tleXN0b3JlLnByb3RvIiwKLSAgICBdLAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RoLXByb3RvcyIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgcHJvdG86IHsKLSAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCi0gICAgICAgIHR5cGU6ICJsaXRlIiwKLSAgICAgICAgaW5jbHVkZV9kaXJzOiBbImV4dGVybmFsL3Byb3RvYnVmL3NyYyJdLAotICAgIH0sCi0gICAgc3JjczogWwotICAgICAgICAiYmx1ZXRvb3RoL21ldHJpY3MvYmx1ZXRvb3RoLnByb3RvIiwKLSAgICAgICAgImJsdWV0b290aC9ibHVldG9vdGhLZXlzdG9yZS9rZXlzdG9yZS5wcm90byIsCi0gICAgXSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvcHJvdG8vQlVJTEQuZ24gYi9nZC9wcm90by9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1Y2Q0ZS4uMDAwMDAwMAotLS0gYS9nZC9wcm90by9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWltcG9ydCgiLy9jb21tb24tbWsvcHJvdG9fbGlicmFyeS5nbmkiKQotCi1wcm90b19saWJyYXJ5KCJsaWJidC1wcm90b3MtbGl0ZSIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiYmx1ZXRvb3RoL21ldHJpY3MvYmx1ZXRvb3RoLnByb3RvIiwKLSAgXQotCi0gIHByb3RvX2luX2RpciA9ICIuL2JsdWV0b290aC9tZXRyaWNzIgotICBwcm90b19vdXRfZGlyID0gImluY2x1ZGUvYmx1ZXRvb3RoL21ldHJpY3MiCi19CmRpZmYgLS1naXQgYS9nZC9wcm90by9ibHVldG9vdGgvYmx1ZXRvb3RoS2V5c3RvcmUva2V5c3RvcmUucHJvdG8gYi9nZC9wcm90by9ibHVldG9vdGgvYmx1ZXRvb3RoS2V5c3RvcmUva2V5c3RvcmUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTQxOGIuLjAwMDAwMDAKLS0tIGEvZ2QvcHJvdG8vYmx1ZXRvb3RoL2JsdWV0b290aEtleXN0b3JlL2tleXN0b3JlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi0vLyBDKysgbmFtZXNwYWNlOiBibHVldG9vdGg6Om1ldHJpY3M6OkJsdWV0b290aE1ldHJpY3NQcm90bwotcGFja2FnZSBibHVldG9vdGgua2V5c3RvcmUuQmx1ZXRvb3RoS2V5c3RvcmVQcm90bzsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uYW5kcm9pZC5ibHVldG9vdGgiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkJsdWV0b290aEtleXN0b3JlUHJvdG8iOwotCi0vLyBIb2xkcyBlbmNyeXB0ZWQsIGF1dGhlbnRpY2F0ZWQgZGF0YS4KLW1lc3NhZ2UgRW5jcnlwdGVkRGF0YSB7Ci0gIC8vIFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdXNlZCBkdXJpbmcgZW5jcnlwdGlvbi4KLSAgb3B0aW9uYWwgYnl0ZXMgaW5pdF92ZWN0b3IgPSAxOwotICAvLyBNQUMgb2YgKGluaXRfdmVjdG9yICsgZW5jcnlwdGVkX2RhdGEpLgotICBvcHRpb25hbCBieXRlcyBhdXRoZW50aWNhdGlvbl9kYXRhID0gMjsKLSAgb3B0aW9uYWwgYnl0ZXMgZW5jcnlwdGVkX2RhdGEgPSAzOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcHJvdG8vYmx1ZXRvb3RoL21ldHJpY3MvYmx1ZXRvb3RoLnByb3RvIGIvZ2QvcHJvdG8vYmx1ZXRvb3RoL21ldHJpY3MvYmx1ZXRvb3RoLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzY3OTg3Li4wMDAwMDAwCi0tLSBhL2dkL3Byb3RvL2JsdWV0b290aC9tZXRyaWNzL2JsdWV0b290aC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLS8vIEMrKyBuYW1lc3BhY2U6IGJsdWV0b290aDo6bWV0cmljczo6Qmx1ZXRvb3RoTWV0cmljc1Byb3RvCi1wYWNrYWdlIGJsdWV0b290aC5tZXRyaWNzLkJsdWV0b290aE1ldHJpY3NQcm90bzsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uYW5kcm9pZC5ibHVldG9vdGgiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkJsdWV0b290aE1ldHJpY3NQcm90byI7Ci0KLW1lc3NhZ2UgQmx1ZXRvb3RoTG9nIHsKLSAgLy8gU2Vzc2lvbiBpbmZvcm1hdGlvbiB0aGF0IGdldHMgbG9nZ2VkIGZvciBldmVyeSBCVCBjb25uZWN0aW9uLgotICByZXBlYXRlZCBCbHVldG9vdGhTZXNzaW9uIHNlc3Npb24gPSAxOwotCi0gIC8vIFNlc3Npb24gaW5mb3JtYXRpb24gdGhhdCBnZXRzIGxvZ2dlZCBmb3IgZXZlcnkgUGFpciBldmVudC4KLSAgcmVwZWF0ZWQgUGFpckV2ZW50IHBhaXJfZXZlbnQgPSAyOwotCi0gIC8vIEluZm9ybWF0aW9uIGZvciBXYWtlIGxvY2tzLgotICByZXBlYXRlZCBXYWtlRXZlbnQgd2FrZV9ldmVudCA9IDM7Ci0KLSAgLy8gU2NhbiBldmVudCBpbmZvcm1hdGlvbi4KLSAgcmVwZWF0ZWQgU2NhbkV2ZW50IHNjYW5fZXZlbnQgPSA0OwotCi0gIC8vIE51bWJlciBvZiBib25kZWQgZGV2aWNlcy4KLSAgb3B0aW9uYWwgaW50MzIgbnVtX2JvbmRlZF9kZXZpY2VzID0gNTsKLQotICAvLyBOdW1iZXIgb2YgQmx1ZXRvb3RoU2Vzc2lvbiBpbmNsdWRpbmcgZGlzY2FyZGVkIG9uZXMgYmV5b25kIGNhcGFjaXR5Ci0gIG9wdGlvbmFsIGludDY0IG51bV9ibHVldG9vdGhfc2Vzc2lvbiA9IDY7Ci0KLSAgLy8gTnVtYmVyIG9mIFBhaXJFdmVudCBpbmNsdWRpbmcgZGlzY2FyZGVkIG9uZXMgYmV5b25kIGNhcGFjaXR5Ci0gIG9wdGlvbmFsIGludDY0IG51bV9wYWlyX2V2ZW50ID0gNzsKLQotICAvLyBOdW1iZXIgb2YgV2FrZUV2ZW50IGluY2x1ZGluZyBkaXNjYXJkZWQgb25lcyBiZXlvbmQgY2FwYWNpdHkKLSAgb3B0aW9uYWwgaW50NjQgbnVtX3dha2VfZXZlbnQgPSA4OwotCi0gIC8vIE51bWJlciBvZiBTY2FuRXZlbnQgaW5jbHVkaW5nIGRpc2NhcmRlZCBvbmVzIGJleW9uZCBjYXBhY2l0eQotICBvcHRpb25hbCBpbnQ2NCBudW1fc2Nhbl9ldmVudCA9IDk7Ci0KLSAgLy8gU3RhdGlzdGljcyBhYm91dCBCbHVldG9vdGggcHJvZmlsZSBjb25uZWN0aW9ucwotICByZXBlYXRlZCBQcm9maWxlQ29ubmVjdGlvblN0YXRzIHByb2ZpbGVfY29ubmVjdGlvbl9zdGF0cyA9IDEwOwotCi0gIC8vIFN0YXRpc3RpY3MgYWJvdXQgSGVhZHNldCBwcm9maWxlIGNvbm5lY3Rpb25zCi0gIHJlcGVhdGVkIEhlYWRzZXRQcm9maWxlQ29ubmVjdGlvblN0YXRzIGhlYWRzZXRfcHJvZmlsZV9jb25uZWN0aW9uX3N0YXRzID0gMTE7Ci19Ci0KLS8vIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlLgotbWVzc2FnZSBEZXZpY2VJbmZvIHsKLSAgLy8gRGV2aWNlIHR5cGUuCi0gIGVudW0gRGV2aWNlVHlwZSB7Ci0gICAgLy8gVHlwZSBpcyB1bmtub3duLgotICAgIERFVklDRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgREVWSUNFX1RZUEVfQlJFRFIgPSAxOwotCi0gICAgREVWSUNFX1RZUEVfTEUgPSAyOwotCi0gICAgREVWSUNFX1RZUEVfRFVNTyA9IDM7Ci0gIH0KLQotICAvLyBEZXZpY2UgY2xhc3MKLSAgLy8gaHR0cHM6Ly9jcy5jb3JwLmdvb2dsZS5jb20vI2FuZHJvaWQvc3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUvYnRtX2FwaS5oJnE9bWFqb3JfY29tcHV0ZXIuCi0gIG9wdGlvbmFsIGludDMyIGRldmljZV9jbGFzcyA9IDE7Ci0KLSAgLy8gRGV2aWNlIHR5cGUuCi0gIG9wdGlvbmFsIERldmljZVR5cGUgZGV2aWNlX3R5cGUgPSAyOwotfQotCi0vLyBJbmZvcm1hdGlvbiB0aGF0IGdldHMgbG9nZ2VkIGZvciBldmVyeSBCbHVldG9vdGggY29ubmVjdGlvbi4KLW1lc3NhZ2UgQmx1ZXRvb3RoU2Vzc2lvbiB7Ci0gIC8vIFR5cGUgb2YgdGVjaG5vbG9neSB1c2VkIGluIHRoZSBjb25uZWN0aW9uLgotICBlbnVtIENvbm5lY3Rpb25UZWNobm9sb2d5VHlwZSB7Ci0gICAgQ09OTkVDVElPTl9URUNITk9MT0dZX1RZUEVfVU5LTk9XTiA9IDA7Ci0KLSAgICBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9MRSA9IDE7Ci0KLSAgICBDT05ORUNUSU9OX1RFQ0hOT0xPR1lfVFlQRV9CUkVEUiA9IDI7Ci0gIH0KLQotICBlbnVtIERpc2Nvbm5lY3RSZWFzb25UeXBlIHsKLSAgICBVTktOT1dOID0gMDsKLQotICAgIC8vIEEgbWV0cmljcyBkdW1wIHRha2VzIGEgc25hcHNob3Qgb2YgY3VycmVudCBCbHVldG9vdGggc2Vzc2lvbiBhbmQgdGh1cwotICAgIC8vIGlzIG5vdCBhIHJlYWwgZGlzY29ubmVjdCwgYnV0IGEgZGlzY29udGludWF0aW9uIGluIG1ldHJpY3MgbG9nZ2luZy4KLSAgICAvLyBUaGlzIGVudW0gaW5kaWNhdGVzIHRoaXMgc2l0dWF0aW9uLgotICAgIE1FVFJJQ1NfRFVNUCA9IDE7Ci0KLSAgICBORVhUX1NUQVJUX1dJVEhPVVRfRU5EX1BSRVZJT1VTID0gMjsKLSAgfQotCi0gIC8vIER1cmF0aW9uIG9mIHRoZSBzZXNzaW9uLgotICBvcHRpb25hbCBpbnQ2NCBzZXNzaW9uX2R1cmF0aW9uX3NlYyA9IDI7Ci0KLSAgLy8gVGVjaG5vbG9neSB0eXBlLgotICBvcHRpb25hbCBDb25uZWN0aW9uVGVjaG5vbG9neVR5cGUgY29ubmVjdGlvbl90ZWNobm9sb2d5X3R5cGUgPSAzOwotCi0gIC8vIFJlYXNvbiBmb3IgZGlzY29ubmVjdGluZy4KLSAgb3B0aW9uYWwgc3RyaW5nIGRpc2Nvbm5lY3RfcmVhc29uID0gNCBbZGVwcmVjYXRlZCA9IHRydWVdOwotCi0gIC8vIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHdoaWNoIGl0IGlzIGNvbm5lY3RlZCB0by4KLSAgb3B0aW9uYWwgRGV2aWNlSW5mbyBkZXZpY2VfY29ubmVjdGVkX3RvID0gNTsKLQotICAvLyBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFJGQ29tbSBzZXNzaW9uLgotICBvcHRpb25hbCBSRkNvbW1TZXNzaW9uIHJmY29tbV9zZXNzaW9uID0gNjsKLQotICAvLyBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEEyRFAgYXVkaW8gc2Vzc2lvbi4KLSAgb3B0aW9uYWwgQTJEUFNlc3Npb24gYTJkcF9zZXNzaW9uID0gNzsKLQotICAvLyBOdW1lcmljIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZyBhcyBkZWZpbmVkIGluIG1ldHJpY3MuaAotICBvcHRpb25hbCBEaXNjb25uZWN0UmVhc29uVHlwZSBkaXNjb25uZWN0X3JlYXNvbl90eXBlID0gODsKLX0KLQotbWVzc2FnZSBSRkNvbW1TZXNzaW9uIHsKLSAgLy8gYnl0ZXMgdHJhbnNtaXR0ZWQuCi0gIG9wdGlvbmFsIGludDMyIHJ4X2J5dGVzID0gMTsKLQotICAvLyBieXRlcyB0cmFuc21pdHRlZC4KLSAgb3B0aW9uYWwgaW50MzIgdHhfYnl0ZXMgPSAyOwotfQotCi1lbnVtIEEyZHBTb3VyY2VDb2RlYyB7Ci0gIEEyRFBfU09VUkNFX0NPREVDX1VOS05PV04gPSAwOwotICBBMkRQX1NPVVJDRV9DT0RFQ19TQkMgPSAxOwotICBBMkRQX1NPVVJDRV9DT0RFQ19BQUMgPSAyOwotICBBMkRQX1NPVVJDRV9DT0RFQ19BUFRYID0gMzsKLSAgQTJEUF9TT1VSQ0VfQ09ERUNfQVBUWF9IRCA9IDQ7Ci0gIEEyRFBfU09VUkNFX0NPREVDX0xEQUMgPSA1OwotfQotCi0vLyBTZXNzaW9uIGluZm9ybWF0aW9uIHRoYXQgZ2V0cyBsb2dnZWQgZm9yIEEyRFAgc2Vzc2lvbi4KLW1lc3NhZ2UgQTJEUFNlc3Npb24gewotICAvLyBNZWRpYSB0aW1lciBpbiBtaWxsaXNlY29uZHMuCi0gIG9wdGlvbmFsIGludDMyIG1lZGlhX3RpbWVyX21pbl9taWxsaXMgPSAxOwotCi0gIC8vIE1lZGlhIHRpbWVyIGluIG1pbGxpc2Vjb25kcy4KLSAgb3B0aW9uYWwgaW50MzIgbWVkaWFfdGltZXJfbWF4X21pbGxpcyA9IDI7Ci0KLSAgLy8gTWVkaWEgdGltZXIgaW4gbWlsbGlzZWNvbmRzLgotICBvcHRpb25hbCBpbnQzMiBtZWRpYV90aW1lcl9hdmdfbWlsbGlzID0gMzsKLQotICAvLyBCdWZmZXIgb3ZlcnJ1bnMgY291bnQuCi0gIG9wdGlvbmFsIGludDMyIGJ1ZmZlcl9vdmVycnVuc19tYXhfY291bnQgPSA0OwotCi0gIC8vIEJ1ZmZlciBvdmVycnVucyB0b3RhbC4KLSAgb3B0aW9uYWwgaW50MzIgYnVmZmVyX292ZXJydW5zX3RvdGFsID0gNTsKLQotICAvLyBCdWZmZXIgdW5kZXJydW5zIGF2ZXJhZ2UuCi0gIG9wdGlvbmFsIGZsb2F0IGJ1ZmZlcl91bmRlcnJ1bnNfYXZlcmFnZSA9IDY7Ci0KLSAgLy8gQnVmZmVyIHVuZGVycnVucyBjb3VudC4KLSAgb3B0aW9uYWwgaW50MzIgYnVmZmVyX3VuZGVycnVuc19jb3VudCA9IDc7Ci0KLSAgLy8gVG90YWwgYXVkaW8gdGltZSBpbiB0aGlzIEEyRFAgc2Vzc2lvbgotICBvcHRpb25hbCBpbnQ2NCBhdWRpb19kdXJhdGlvbl9taWxsaXMgPSA4OwotCi0gIC8vIEF1ZGlvIGNvZGVjIHVzZWQgaW4gdGhpcyBBMkRQIHNlc3Npb24gaW4gQTJEUCBzb3VyY2Ugcm9sZQotICBvcHRpb25hbCBBMmRwU291cmNlQ29kZWMgc291cmNlX2NvZGVjID0gOTsKLQotICAvLyBXaGV0aGVyIEEyRFAgb2ZmbG9hZCBpcyBlbmFibGVkIGluIHRoaXMgQTJEUCBzZXNzaW9uCi0gIG9wdGlvbmFsIGJvb2wgaXNfYTJkcF9vZmZsb2FkID0gMTA7Ci19Ci0KLW1lc3NhZ2UgUGFpckV2ZW50IHsKLSAgLy8gVGhlIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZwotICAvLyBTZWU6IHN5c3RlbS9idC9zdGFjay9pbmNsdWRlL2hjaWRlZnMuaCwgSENJX0VSUl9DT05OX0ZBSUxFRF9FU1RBQkxJU0hNRU5UCi0gIG9wdGlvbmFsIGludDMyIGRpc2Nvbm5lY3RfcmVhc29uID0gMTsKLQotICAvLyBQYWlyIGV2ZW50IHRpbWUKLSAgb3B0aW9uYWwgaW50NjQgZXZlbnRfdGltZV9taWxsaXMgPSAyOyAgLy8gWyhkYXRhcG9sLnNlbWFudGljX3R5cGUpID0gU1RfVElNRVNUQU1QXTsKLQotICAvLyBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSB3aGljaCBpdCBpcyBwYWlyZWQgdG8uCi0gIG9wdGlvbmFsIERldmljZUluZm8gZGV2aWNlX3BhaXJlZF93aXRoID0gMzsKLX0KLQotbWVzc2FnZSBXYWtlRXZlbnQgewotICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgd2FrZSBldmVudCB0eXBlLgotICBlbnVtIFdha2VFdmVudFR5cGUgewotICAgIFVOS05PV04gPSAwOwotICAgIC8vIFdha2VMb2NrIHdhcyBhY3F1aXJlZC4KLSAgICBBQ1FVSVJFRCA9IDE7Ci0gICAgLy8gV2FrZUxvY2sgd2FzIHJlbGVhc2VkLgotICAgIFJFTEVBU0VEID0gMjsKLSAgfQotCi0gIC8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSB3YWtlIGV2ZW50IHR5cGUuCi0gIG9wdGlvbmFsIFdha2VFdmVudFR5cGUgd2FrZV9ldmVudF90eXBlID0gMTsKLQotICAvLyBJbml0aWF0b3Igb2YgdGhlIHNjYW4uIE9ubHkgdGhlIGZpcnN0IHRocmVlIG5hbWVzIHdpbGwgYmUgc3RvcmVkLgotICAvLyBlLmcuIGNvbS5jb21wYW55LmFwcAotICBvcHRpb25hbCBzdHJpbmcgcmVxdWVzdG9yID0gMjsKLQotICAvLyBOYW1lIG9mIHRoZSB3YWtlbG9jayAoZS5nLiBibHVlZHJvaWRfdGltZXIpLgotICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDM7Ci0KLSAgLy8gVGltZSBvZiB0aGUgZXZlbnQuCi0gIG9wdGlvbmFsIGludDY0IGV2ZW50X3RpbWVfbWlsbGlzID0gNDsgIC8vIFsoZGF0YXBvbC5zZW1hbnRpY190eXBlKSA9IFNUX1RJTUVTVEFNUF07Ci19Ci0KLW1lc3NhZ2UgU2NhbkV2ZW50IHsKLSAgLy8gU2NhbiB0eXBlLgotICBlbnVtIFNjYW5UZWNobm9sb2d5VHlwZSB7Ci0gICAgU0NBTl9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgU0NBTl9URUNIX1RZUEVfTEUgPSAxOwotCi0gICAgU0NBTl9URUNIX1RZUEVfQlJFRFIgPSAyOwotCi0gICAgU0NBTl9URUNIX1RZUEVfQk9USCA9IDM7Ci0gIH0KLQotICAvLyBTY2FuIGV2ZW50IHR5cGUuCi0gIGVudW0gU2NhbkV2ZW50VHlwZSB7Ci0gICAgLy8gU2NhbiBzdGFydGVkLgotICAgIFNDQU5fRVZFTlRfU1RBUlQgPSAwOwotICAgIC8vIFNjYW4gc3RvcHBlZC4KLSAgICBTQ0FOX0VWRU5UX1NUT1AgPSAxOwotICB9Ci0KLSAgLy8gU2NhbiBldmVudCB0eXBlLgotICBvcHRpb25hbCBTY2FuRXZlbnRUeXBlIHNjYW5fZXZlbnRfdHlwZSA9IDE7Ci0KLSAgLy8gSW5pdGlhdG9yIG9mIHRoZSBzY2FuLiBPbmx5IHRoZSBmaXJzdCB0aHJlZSBuYW1lcyB3aWxsIGJlIHN0b3JlZC4KLSAgLy8gZS5nLiBjb20uY29tcGFueS5hcHAKLSAgb3B0aW9uYWwgc3RyaW5nIGluaXRpYXRvciA9IDI7Ci0KLSAgLy8gVGVjaG5vbG9neSB1c2VkIGZvciBzY2FubmluZy4KLSAgb3B0aW9uYWwgU2NhblRlY2hub2xvZ3lUeXBlIHNjYW5fdGVjaG5vbG9neV90eXBlID0gMzsKLQotICAvLyBOdW1iZXIgb2YgcmVzdWx0cyByZXR1cm5lZC4KLSAgb3B0aW9uYWwgaW50MzIgbnVtYmVyX3Jlc3VsdHMgPSA0OwotCi0gIC8vIFRpbWUgb2YgdGhlIGV2ZW50LgotICBvcHRpb25hbCBpbnQ2NCBldmVudF90aW1lX21pbGxpcyA9IDU7ICAvLyBbKGRhdGFwb2wuc2VtYW50aWNfdHlwZSkgPSBTVF9USU1FU1RBTVBdOwotfQotCi0vLyBQcm9maWxlIElEcyBkZWZpbmVkIGluIEJsdWV0b290aFByb2ZpbGUgQVBJIGNsYXNzCi0vLyBWYWx1ZXMgbXVzdCBtYXRjaCBBUEkgY2xhc3MgdmFsdWVzCi1lbnVtIFByb2ZpbGVJZCB7Ci0gIFBST0ZJTEVfVU5LTk9XTiA9IDA7Ci0gIEhFQURTRVQgPSAxOwotICBBMkRQID0gMjsKLSAgSEVBTFRIID0gMzsKLSAgSElEX0hPU1QgPSA0OwotICBQQU4gPSA1OwotICBQQkFQID0gNjsKLSAgR0FUVCA9IDc7Ci0gIEdBVFRfU0VSVkVSID0gODsKLSAgTUFQID0gOTsKLSAgU0FQID0gMTA7Ci0gIEEyRFBfU0lOSyA9IDExOwotICBBVlJDUF9DT05UUk9MTEVSID0gMTI7Ci0gIEFWUkNQID0gMTM7Ci0gIEhFQURTRVRfQ0xJRU5UID0gMTY7Ci0gIFBCQVBfQ0xJRU5UID0gMTc7Ci0gIE1BUF9DTElFTlQgPSAxODsKLSAgSElEX0RFVklDRSA9IDE5OwotICBPUFAgPSAyMDsKLSAgSEVBUklOR19BSUQgPSAyMTsKLX0KLQotLy8gU3RhdGlzdGljcyBhYm91dCBCbHVldG9vdGggcHJvZmlsZSBjb25uZWN0aW9ucwotbWVzc2FnZSBQcm9maWxlQ29ubmVjdGlvblN0YXRzIHsKLSAgLy8gUHJvZmlsZSBpZCBkZWZpbmVkIGluIEJsdWV0b290aFByb2ZpbGUuamF2YQotICBvcHRpb25hbCBQcm9maWxlSWQgcHJvZmlsZV9pZCA9IDE7Ci0KLSAgLy8gTnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBwcm9maWxlIGlzIGNvbm5lY3RlZCBzaW5jZSBsYXN0IG1ldHJpY3MgZHVtcAotICBvcHRpb25hbCBpbnQzMiBudW1fdGltZXNfY29ubmVjdGVkID0gMjsKLX0KLQotZW51bSBIZWFkc2V0UHJvZmlsZVR5cGUgewotICBIRUFEU0VUX1BST0ZJTEVfVU5LTk9XTiA9IDA7Ci0gIEhTUCA9IDE7Ci0gIEhGUCA9IDI7Ci19Ci0KLS8vIFN0YXRpc3RpY3MgYWJvdXQgaGVhZHNldCBwcm9maWxlIGNvbm5lY3Rpb25zCi1tZXNzYWdlIEhlYWRzZXRQcm9maWxlQ29ubmVjdGlvblN0YXRzIHsKLSAgLy8gVHlwZSBvZiBoZWFkc2V0IHByb2ZpbGUgY29ubmVjdGVkCi0gIG9wdGlvbmFsIEhlYWRzZXRQcm9maWxlVHlwZSBoZWFkc2V0X3Byb2ZpbGVfdHlwZSA9IDE7Ci0KLSAgLy8gTnVtYmVyIG9mIHRpbWVzIHRoaXMgdHlwZSBvZiBoZWFkc2V0IHByb2ZpbGUgaXMgY29ubmVjdGVkCi0gIG9wdGlvbmFsIGludDMyIG51bV90aW1lc19jb25uZWN0ZWQgPSAyOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3J1c3QvUkVBRE1FLm1kIGIvZ2QvcnVzdC9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTk4NWMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1SdXN0IGJ1aWxkCi09PT09PT0KLQotQ3VycmVudGx5LCB0aGUgUnVzdCBjb21wb25lbnRzIGFyZSBidWlsdCBkaWZmZXJlbnRseSBvbiBBbmRyb2lkIHZzIExpbnV4LiBXZSBhcmUKLW1pc3NpbmcgUnVzdCBzdXBwb3J0IGluIG91ciBHTiB0b29sY2hhaW4gc28gd2UgY3VycmVudGx5IGJ1aWxkIHRoZSBSdXN0Ci1saWJyYXJpZXMgYXMgYSBzdGF0aWNsaWIgYW5kIGxpbmsgaW4gQysrLiBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBvbmNlIHdlCi1oYXZlIGJldHRlciBzdXBwb3J0LgotCi1Gb3Igbm93LCB5b3UgY2FuIGJ1aWxkIGFsbCBvZiB0aGUgUnVzdCBjb2RlIHVzaW5nIENhcmdvLgotCi1UaGVyZSBhcmUgc29tZSBkZXBlbmRlbmNpZXM6Ci0qIFlvdSBtdXN0IGhhdmUgdGhlIHByb3RvYnVmLWNvbXBpbGVyIHBhY2thZ2UgaW5zdGFsbGVkCi0qIFlvdSBtdXN0IGhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiBDYXJnbyArIFJ1c3QKLQotWW91IHNob3VsZCB1c2UgYGJ1aWxkLnB5YCBhdCB0aGUgcm9vdCB0byBkbyB5b3VyIFJ1c3QgYnVpbGRzIHNvIHRoYXQgaXQKLWNvcnJlY3RseSBwb2ludHMgeW91ciBkZXBlbmRlbmNpZXMgdG93YXJkcyB0aGUgdmVuZG9yZWQgY3JhdGVzIGFuZCBzZXRzIHlvdXIKLSRDQVJHT19IT01FIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9jaHJvbWVvcy9leGFtcGxlcy9kYnVzL2Zsb3NzLmNvbmYgYi9nZC9ydXN0L2Nocm9tZW9zL2V4YW1wbGVzL2RidXMvZmxvc3MuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiNzZlNC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2Nocm9tZW9zL2V4YW1wbGVzL2RidXMvZmxvc3MuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCi0gImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KLQotPGJ1c2NvbmZpZz4KLSAgPCEtLSAuLi9zeXN0ZW0uY29uZiBoYXZlIGRlbmllZCBldmVyeXRoaW5nLCBzbyB3ZSBqdXN0IHB1bmNoIHNvbWUgaG9sZXMgLS0+Ci0KLSAgPHBvbGljeSB1c2VyPSJyb290Ij4KLSAgICA8YWxsb3cgb3duPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoIi8+Ci0gICAgPGFsbG93IG93bj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0KLSAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmNocm9taXVtLmJsdWV0b290aCIvPgotICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlciIvPgotICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIvPgotCi0gICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlciIvPgotICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0gIDwvcG9saWN5PgotCi0gIDxwb2xpY3kgdXNlcj0iYmx1ZXRvb3RoIj4KLSAgICA8YWxsb3cgb3duPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoIi8+Ci0gICAgPGFsbG93IG93bj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0KLSAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmNocm9taXVtLmJsdWV0b290aCIvPgotICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlciIvPgotICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcyIvPgotCi0gICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlciIvPgotICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0gIDwvcG9saWN5PgotCi0gIDxwb2xpY3kgdXNlcj0iY2hyb25vcyI+Ci0gICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5jaHJvbWl1bS5ibHVldG9vdGgiLz4KLSAgPC9wb2xpY3k+Ci0KLSAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KLSAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoIi8+Ci0gICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIi8+Ci0gIDwvcG9saWN5PgotPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9jaHJvbWVvcy9leGFtcGxlcy91cHN0YXJ0L2JsdWV0b290aGQuY29uZiBiL2dkL3J1c3QvY2hyb21lb3MvZXhhbXBsZXMvdXBzdGFydC9ibHVldG9vdGhkLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTNhMjAuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jaHJvbWVvcy9leGFtcGxlcy91cHN0YXJ0L2JsdWV0b290aGQuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLWRlc2NyaXB0aW9uICAgICAiU3RhcnQgdGhlIGJsdWV0b290aCBkYWVtb24iCi1hdXRob3IgICAgICAgICAgImNocm9taXVtLW9zLWRldkBjaHJvbWl1bS5vcmciCi0KLXN0YXJ0IG9uIHN0YXJ0ZWQgc3lzdGVtLXNlcnZpY2VzCi1zdG9wIG9uIHN0b3BwaW5nIHN5c3RlbS1zZXJ2aWNlcwotCi1saW1pdCBtZW1sb2NrIHVubGltaXRlZCB1bmxpbWl0ZWQKLQotZW52IEJMVUVUT09USF9MSUJESVI9L3Zhci9saWIvYmx1ZXRvb3RoCi1lbnYgQkxVRVRPT1RIX1JVTkRJUj0vdmFyL3J1bi9ibHVldG9vdGgKLWVudiBCTFVFVE9PVEhfREFFTU9OX09QVElPTj0iIgotZW52IEJMVUVUT09USF9XQU5UX0ZJTEU9L3Zhci9saWIvbWlzYy9ibHVldG9vdGgtZGFlbW9uLmN1cnJlbnQKLQotcHJlLXN0YXJ0IHNjcmlwdAotICBta2RpciAtcCAtbSAwNzUwICR7QkxVRVRPT1RIX0xJQkRJUn0KLSAgY2hvd24gLVIgYmx1ZXRvb3RoOmJsdWV0b290aCAke0JMVUVUT09USF9MSUJESVJ9Ci0gIG1rZGlyIC1wIC1tIDA3NTAgJHtCTFVFVE9PVEhfUlVORElSfQotICBjaG93biAtUiBibHVldG9vdGg6Ymx1ZXRvb3RoICR7QkxVRVRPT1RIX1JVTkRJUn0KLQotICAjIE1ha2Ugc3VyZSBmaWxlIGV4aXN0cyBiZWZvcmUgYWNjZXNzaW5nIGl0Ci0gIG1rZGlyIC1wICIkKGRpcm5hbWUgJEJMVUVUT09USF9XQU5UX0ZJTEUpIgotICB0b3VjaCAiJEJMVUVUT09USF9XQU5UX0ZJTEUiCi0KLSAgIyBDaGVjayBpZiB3ZSB3YW50IHRvIHN0YXJ0IGJsdWV6LiBJZiAiZmxvc3MiIGlzIHdhbnRlZCBpbnN0ZWFkLCBleGl0IGVhcmx5Ci0gICMgd2l0aG91dCBzdGFydGluZyBibHVlei4KLSAgd2FudF9kYWVtb249IiQoY2F0ICRCTFVFVE9PVEhfV0FOVF9GSUxFKSIKLSAgaWYgWyAiJHdhbnRfZGFlbW9uIiA9ICJmbG9zcyIgXTsgdGhlbgotICAgIGV4aXQgMQotICBmaQotZW5kIHNjcmlwdAotCi1yZXNwYXduCi0KLWV4ZWMgL3Vzci9iaW4vc3RhcnRfYmx1ZXRvb3RoZC5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3J1c3QvY2hyb21lb3MvZXhhbXBsZXMvdXBzdGFydC9idGFkYXB0ZXJkLmNvbmYgYi9nZC9ydXN0L2Nocm9tZW9zL2V4YW1wbGVzL3Vwc3RhcnQvYnRhZGFwdGVyZC5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmVmNjhmLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvY2hyb21lb3MvZXhhbXBsZXMvdXBzdGFydC9idGFkYXB0ZXJkLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1kZXNjcmlwdGlvbiAiQmx1ZXRvb3RoIEFkYXB0ZXIiCi1hdXRob3IgIkNocm9tZU9TIEJUIDxjaHJvbWVvcy1idC10ZWFtQGdvb2dsZS5jb20+IgotCi0jIExpbWl0IHJlc3Bhd25pbmcgaW4gY2FzZSBvZiBjcmFzaGxvb3AKLXJlc3Bhd24gbGltaXQgMTAgNQotcmVzcGF3bgotCi1pbXBvcnQgSENJCi1pbnN0YW5jZSAkSENJCi0KLXBvc3Qtc3RvcCBzY3JpcHQKLSAgcm0gL3Zhci9ydW4vYmx1ZXRvb3RoL2JsdWV0b290aCR7SENJfS5waWQKLWVuZCBzY3JpcHQKLQotc2NyaXB0Ci0gIGV4ZWMgcnVudXNlciAtdSBibHVldG9vdGggLS0gL3Vzci9iaW4vYnRhZGFwdGVyZCAtLWhjaT0kSENJCi1lbmQgc2NyaXB0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9jaHJvbWVvcy9leGFtcGxlcy91cHN0YXJ0L2J0bWFuYWdlcmQuY29uZiBiL2dkL3J1c3QvY2hyb21lb3MvZXhhbXBsZXMvdXBzdGFydC9idG1hbmFnZXJkLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDRhOTAuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jaHJvbWVvcy9leGFtcGxlcy91cHN0YXJ0L2J0bWFuYWdlcmQuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotZGVzY3JpcHRpb24gICAgICJTdGFydCB0aGUgYmx1ZXRvb3RoIG1hbmFnZXIgZGFlbW9uIgotYXV0aG9yICAgICAgICAgICJjaHJvbWl1bS1vcy1kZXZAY2hyb21pdW0ub3JnIgotCi1zdGFydCBvbiBzdGFydGVkIHN5c3RlbS1zZXJ2aWNlcwotc3RvcCBvbiBzdG9wcGluZyBzeXN0ZW0tc2VydmljZXMKLQotZXhlYyBidG1hbmFnZXJkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9jb21tb24vQW5kcm9pZC5icCBiL2dkL3J1c3QvY29tbW9uL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmFkNjEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jb21tb24vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLXJ1c3RfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYmJ0X2NvbW1vbiIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfcnVzdF9kZWZhdWx0cyJdLAotICAgIGNyYXRlX25hbWU6ICJidF9jb21tb24iLAotICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAotICAgIGVkaXRpb246ICIyMDE4IiwKLSAgICBydXN0bGliczogWwotICAgICAgICAibGlidG9raW8iLAotICAgICAgICAibGlibml4IiwKLSAgICAgICAgImxpYmxhenlfc3RhdGljIiwKLSAgICAgICAgImxpYmxvZ19ydXN0IiwKLSAgICAgICAgImxpYmN4eCIsCi0gICAgICAgICJsaWJncnBjaW8iLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHJ1c3RsaWJzOiBbCi0gICAgICAgICAgICAgICAgImxpYmFuZHJvaWRfbG9nZ2VyIiwKLSAgICAgICAgICAgICAgICAibGlicnVzdHV0aWxzIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgaG9zdDogewotICAgICAgICAgICAgcnVzdGxpYnM6IFsKLSAgICAgICAgICAgICAgICAibGliZW52X2xvZ2dlciIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgcHJvY19tYWNyb3M6IFsKLSAgICAgICAgImxpYnBhc3RlIiwKLSAgICBdLAotfQotCi1ydXN0X3Rlc3RfaG9zdCB7Ci0gICAgbmFtZTogImxpYmJ0X2NvbW1vbl9pbmxpbmVfdGVzdHMiLAotICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKLSAgICBhdXRvX2dlbl9jb25maWc6IHRydWUsCi0gICAgcnVzdGxpYnM6IFsKLSAgICAgICAgImxpYnRva2lvIiwKLSAgICAgICAgImxpYm5peCIsCi0gICAgICAgICJsaWJsYXp5X3N0YXRpYyIsCi0gICAgICAgICJsaWJsb2dfcnVzdCIsCi0gICAgICAgICJsaWJlbnZfbG9nZ2VyIiwKLSAgICAgICAgImxpYmN4eCIsCi0gICAgICAgICJsaWJncnBjaW8iLAotICAgIF0sCi0gICAgcHJvY19tYWNyb3M6IFsKLSAgICAgICAgImxpYnBhc3RlIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9jb21tb24vQlVJTEQuZ24gYi9nZC9ydXN0L2NvbW1vbi9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlYTExMy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2NvbW1vbi9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQoIi8vY29tbW9uLW1rL2N4eGJyaWRnZS5nbmkiKQotCi1ydXN0X2xpYnJhcnkoImxpYmJ0X2NvbW1vbiIpIHsKLSAgY3JhdGVfbmFtZSA9ICJidF9jb21tb24iCi0KLSAgc291cmNlcyA9IFsgInNyYy9saWIucnMiIF0KLQotICBjb25maWdzID0gWwotICAgICIvL2J0L2dkL3J1c3Qvc2hpbTpydXN0X2xpYnMiLAotICAgICIvL2J0L2dkOnJ1c3RfZGVmYXVsdHMiLAotICBdCi19Ci0KLWN4eGJyaWRnZV9jYygibGliYnRfY29tbW9uX3N5c19wcm9wX2JyaWRnZV9jb2RlIikgewotICBzb3VyY2VzID0gWyAic3JjL3N5c19wcm9wLnJzIiBdCi0KLSAgY29uZmlncyA9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdHMiIF0KLX0KLQotc3RhdGljX2xpYnJhcnkoImxpYmJ0X2NvbW1vbl9zeXNfcHJvcF9jeHgiKSB7Ci0gIHNvdXJjZXMgPSBbICJzcmMvZmZpL3N5c19wcm9wcy5jYyIgXQotCi0gIGluY2x1ZGVfZGlycyA9IFsgInNyYy9mZmkiIF0KLQotICBkZXBzID0gWyAiOmxpYmJ0X2NvbW1vbl9zeXNfcHJvcF9icmlkZ2VfY29kZSIgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9jb21tb24vQ2FyZ28udG9tbCBiL2dkL3J1c3QvY29tbW9uL0NhcmdvLnRvbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZGU3OWEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jb21tb24vQ2FyZ28udG9tbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1bcGFja2FnZV0KLW5hbWUgPSAiYnRfY29tbW9uIgotdmVyc2lvbiA9ICIwLjAuMSIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2RlcGVuZGVuY2llc10KLWN4eCA9ICIqIgotZW52X2xvZ2dlciA9ICIqIgotZ3JwY2lvID0gIioiCi1sYXp5X3N0YXRpYyA9ICIqIgotbG9nID0gIioiCi1uaXggPSAiKiIKLXRva2lvID0geyB2ZXJzaW9uID0gIioiLCBmZWF0dXJlcyA9IFsnYnl0ZXMnLCAnbWFjcm9zJywgJ25ldCcsICdydC1tdWx0aS10aHJlYWQnLCAndGltZSddIH0KLQotIyBQcm9jIE1hY3JvIGRlcGVuZGVuY3kKLXBhc3RlID0gIioiCi0KLVtsaWJdCi1jcmF0ZS10eXBlID0gWyJybGliIl0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvY29tbW9uL3NyYy9hc3NlcnRzLnJzIGIvZ2QvcnVzdC9jb21tb24vc3JjL2Fzc2VydHMucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmFmY2UuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jb21tb24vc3JjL2Fzc2VydHMucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vLy8gQXNzZXJ0aW9uIGNoZWNrIGZvciBYIGlzIGlzIHdpdGhpbiBZIG9mIFoKLSNbbWFjcm9fZXhwb3J0XQotbWFjcm9fcnVsZXMhIGFzc2VydF9uZWFyIHsKLSAgICAoJHRoaW5nOmV4cHIsICRleHBlY3RlZDpleHByLCAkZXJyb3I6ZXhwcikgPT4gewotICAgICAgICBtYXRjaCAoJiR0aGluZywgJiRleHBlY3RlZCwgJiRlcnJvcikgewotICAgICAgICAgICAgKHRoaW5nX3ZhbCwgZXhwZWN0ZWRfdmFsLCBlcnJvcl92YWwpID0+IHsKLSAgICAgICAgICAgICAgICBpZiB0aGluZ192YWwgPCAmKGV4cGVjdGVkX3ZhbCAtIGVycm9yX3ZhbCkgfHwgdGhpbmdfdmFsID4gJihleHBlY3RlZF92YWwgKyBlcnJvcl92YWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFuaWMhKAotICAgICAgICAgICAgICAgICAgICAgICAgImFzc2VydGlvbiBmYWlsZWQ6IHs6P30gaXMgbm90IHdpdGhpbiB7Oj99IG9mIHs6P30iLAotICAgICAgICAgICAgICAgICAgICAgICAgJip0aGluZ192YWwsICYqZXJyb3JfdmFsLCAmKmV4cGVjdGVkX3ZhbAotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvY29tbW9uL3NyYy9pbml0X2ZsYWdzLnJzIGIvZ2QvcnVzdC9jb21tb24vc3JjL2luaXRfZmxhZ3MucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWZkMjIuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jb21tb24vc3JjL2luaXRfZmxhZ3MucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotdXNlIGxvZzo6e2Vycm9yLCBpbmZvfTsKLXVzZSBwYXN0ZTo6cGFzdGU7Ci11c2Ugc3RkOjpzeW5jOjpNdXRleDsKLQotLy8vIERlcHJlY2F0ZWQgaW1tdXRhYmxlIGZsYWcKLXB1YiBmbiBnZF9hY2xfaXNfZW5hYmxlZCgpIC0+IGJvb2wgewotICAgIHRydWUKLX0KLQotbWFjcm9fcnVsZXMhIGluaXRfZmxhZ3MgewotICAgIChmbGFnczogeyAkKCRmbGFnOmlkZW50KSwqIH0sIGRlcGVuZGVuY2llczogeyAkKCRwYXJlbnQ6aWRlbnQgPT4gJGNoaWxkOmlkZW50KSwqIH0pID0+IHsKLSAgICAgICAgI1tkZXJpdmUoRGVmYXVsdCldCi0gICAgICAgIHN0cnVjdCBJbml0RmxhZ3MgewotICAgICAgICAgICAgJCgkZmxhZzogYm9vbCwpKgotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIFNldHMgYWxsIGZsYWdzIHRvIHRydWUsIGZvciB0ZXN0aW5nCi0gICAgICAgIHB1YiBmbiBzZXRfYWxsX2Zvcl90ZXN0aW5nKCkgewotICAgICAgICAgICAgKkZMQUdTLmxvY2soKS51bndyYXAoKSA9IEluaXRGbGFncyB7ICQoJGZsYWc6IHRydWUsKSogfTsKLSAgICAgICAgfQotCi0gICAgICAgIGltcGwgSW5pdEZsYWdzIHsKLSAgICAgICAgICAgIGZuIHBhcnNlKGZsYWdzOiBWZWM8U3RyaW5nPikgLT4gU2VsZiB7Ci0gICAgICAgICAgICAgICAgJChsZXQgbXV0ICRmbGFnID0gZmFsc2U7KSoKLQotICAgICAgICAgICAgICAgIGZvciBmbGFnIGluIGZsYWdzIHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlczogVmVjPCZzdHI+ID0gZmxhZy5zcGxpdCgiPSIpLmNvbGxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWVzLmxlbigpICE9IDIgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJCYWQgZmxhZyB7fSwgbXVzdCBiZSBpbiA8RkxBRz49PFZBTFVFPiBmb3JtYXQiLCBmbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdmFsdWVzWzBdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICQoY29uY2F0ISgiSU5JVF8iLCBzdHJpbmdpZnkhKCRmbGFnKSkgPT4gJGZsYWcgPSB2YWx1ZXNbMV0ucGFyc2UoKS51bndyYXBfb3IoZmFsc2UpLCkqCi0gICAgICAgICAgICAgICAgICAgICAgICBfID0+IHt9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTZWxmIHsgJCgkZmxhZywpKiB9LnJlY29uY2lsZSgpCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZuIHJlY29uY2lsZShtdXQgc2VsZikgLT4gU2VsZiB7Ci0gICAgICAgICAgICAgICAgLy8gTG9vcCB0byBlbnN1cmUgZGVwZW5kZW5jaWVzIGNhbiBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyCi0gICAgICAgICAgICAgICAgbG9vcCB7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBtdXQgYW55X2NoYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAkKGlmIHNlbGYuJHBhcmVudCAmJiAhc2VsZi4kY2hpbGQgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi4kY2hpbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYW55X2NoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0pKgotCi0gICAgICAgICAgICAgICAgICAgIGlmICFhbnlfY2hhbmdlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogYWNsIHNob3VsZCBub3QgYmUgb2ZmIGlmIGwyY2FwIGlzIG9uLCBidXQgbmVlZCB0byByZWNvbmNpbGUgbGVnYWN5IGNvZGUKLSAgICAgICAgICAgICAgICBpZiBzZWxmLmdkX2wyY2FwIHsKLSAgICAgICAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBjYW4gbmV2ZXIgYmUgdHVybmVkIG9mZiAgc2VsZi5nZF9hY2wgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzZWxmCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZuIGxvZygmc2VsZikgewotICAgICAgICAgICAgICAgIGluZm8hKGNvbmNhdCEoIkZsYWdzIGxvYWRlZDogIiwgJChzdHJpbmdpZnkhKCRmbGFnKSwgIj17fSAiLCkqKSwgJChzZWxmLiRmbGFnLCkqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhc3RlISB7Ci0gICAgICAgICAgICAkKAotICAgICAgICAgICAgICAgICNbYWxsb3cobWlzc2luZ19kb2NzKV0KLSAgICAgICAgICAgICAgICBwdWIgZm4gWzwkZmxhZyBfaXNfZW5hYmxlZD5dKCkgLT4gYm9vbCB7Ci0gICAgICAgICAgICAgICAgICAgIEZMQUdTLmxvY2soKS51bndyYXAoKS4kZmxhZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICkqCi0gICAgICAgIH0KLSAgICB9OwotfQotCi1pbml0X2ZsYWdzISgKLSAgICBmbGFnczogewotICAgICAgICBnZF9jb3JlLAotICAgICAgICBnZF9hZHZlcnRpc2luZywKLSAgICAgICAgZ2Rfc2Nhbm5pbmcsCi0gICAgICAgIGdkX3NlY3VyaXR5LAotICAgICAgICBnZF9sMmNhcCwKLSAgICAgICAgZ2F0dF9yb2J1c3RfY2FjaGluZywKLSAgICAgICAgYnRhYV9oY2ksCi0gICAgICAgIGdkX3J1c3QsCi0gICAgICAgIGdkX2xpbmtfcG9saWN5Ci0gICAgfSwKLSAgICBkZXBlbmRlbmNpZXM6IHsKLSAgICAgICAgZ2RfY29yZSA9PiBnZF9zZWN1cml0eSwKLSAgICAgICAgZ2RfbDJjYXAgPT4gZ2Rfc2Nhbm5pbmcsCi0gICAgICAgIGdkX3NjYW5uaW5nID0+IGdkX2FkdmVydGlzaW5nCi0gICAgfQotKTsKLQotbGF6eV9zdGF0aWMhIHsKLSAgICBzdGF0aWMgcmVmIEZMQUdTOiBNdXRleDxJbml0RmxhZ3M+ID0gTXV0ZXg6Om5ldyhJbml0RmxhZ3M6OmRlZmF1bHQoKSk7Ci19Ci0KLS8vLyBMb2FkcyB0aGUgZmxhZyB2YWx1ZXMgZnJvbSB0aGUgcGFzc2VkLWluIHZlY3RvciBvZiBzdHJpbmcgdmFsdWVzCi1wdWIgZm4gbG9hZChmbGFnczogVmVjPFN0cmluZz4pIHsKLSAgICBjcmF0ZTo6aW5pdF9sb2dnaW5nKCk7Ci0KLSAgICBsZXQgZmxhZ3MgPSBJbml0RmxhZ3M6OnBhcnNlKGZsYWdzKTsKLSAgICBmbGFncy5sb2coKTsKLSAgICAqRkxBR1MubG9jaygpLnVud3JhcCgpID0gZmxhZ3M7Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2NvbW1vbi9zcmMvbGliLnJzIGIvZ2QvcnVzdC9jb21tb24vc3JjL2xpYi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3Mjc5Yi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2NvbW1vbi9zcmMvbGliLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8hIEJsdWV0b290aCBjb21tb24gbGlicmFyeQotI1ttYWNyb191c2VdCi1leHRlcm4gY3JhdGUgbGF6eV9zdGF0aWM7Ci0KLS8vLyBQcm92aWRlcyB3YWtpbmcgdGltZXIgYWJzdHJhY3Rpb25zCi1wdWIgbW9kIHRpbWU7Ci0KLSNbbWFjcm9fdXNlXQotbW9kIHJlYWR5OwotCi0jW2NmZyh0ZXN0KV0KLSNbbWFjcm9fdXNlXQotbW9kIGFzc2VydHM7Ci0KLS8vLyBQcm92aWRlcyBydW50aW1lIGNvbmZpZ3VyZWQtYXQtc3RhcnR1cCBmbGFncwotcHViIG1vZCBpbml0X2ZsYWdzOwotCi0vLy8gUHJvdmlkZXMgcnVudGltZSBjb25maWd1cmVkIHN5c3RlbSBwcm9wZXJ0aWVzLiBTdHViYmVkIGZvciBub24tQW5kcm9pZC4KLXB1YiBtb2Qgc3lzX3Byb3A7Ci0KLS8vLyBJbml0cyBsb2dnaW5nIGZvciBBbmRyb2lkCi0jW2NmZyh0YXJnZXRfb3MgPSAiYW5kcm9pZCIpXQotcHViIGZuIGluaXRfbG9nZ2luZygpIHsKLSAgICBhbmRyb2lkX2xvZ2dlcjo6aW5pdF9vbmNlKAotICAgICAgICBhbmRyb2lkX2xvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkud2l0aF90YWcoImJ0Iikud2l0aF9taW5fbGV2ZWwobG9nOjpMZXZlbDo6RGVidWcpLAotICAgICk7Ci19Ci0KLS8vLyBJbml0cyBsb2dnaW5nIGZvciBob3N0Ci0jW2NmZyhub3QodGFyZ2V0X29zID0gImFuZHJvaWQiKSldCi1wdWIgZm4gaW5pdF9sb2dnaW5nKCkgewotICAgIGVudl9sb2dnZXI6OkJ1aWxkZXI6Om5ldygpCi0gICAgICAgIC5maWx0ZXIoTm9uZSwgbG9nOjpMZXZlbEZpbHRlcjo6RGVidWcpCi0gICAgICAgIC5wYXJzZV9kZWZhdWx0X2VudigpCi0gICAgICAgIC50cnlfaW5pdCgpCi0gICAgICAgIC5vaygpOwotfQotCi0vLy8gSW5kaWNhdGVzIHRoZSBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCB0byBhIEdSUEMgc2VydmljZQotcHViIHRyYWl0IEdycGNGYWNhZGUgewotICAgIC8vLyBDb252ZXJ0IHRoZSBvYmplY3QgaW50byB0aGUgc2VydmljZQotICAgIGZuIGludG9fZ3JwYyhzZWxmKSAtPiBncnBjaW86OlNlcnZpY2U7Ci19Ci0KLS8vLyBVc2VmdWwgZm9yIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gQlQgY2xhc3NpYyAmIExFIGluIGZ1bmN0aW9ucyB0aGF0IHN1cHBvcnQgYm90aAotI1tkZXJpdmUoRGVidWcsIENsb25lLCBDb3B5KV0KLXB1YiBlbnVtIEJsdWV0b290aCB7Ci0gICAgLy8vIENsYXNzaWMgQlQgd2UgYWxsIGtub3cgYW5kIGxvdmUsIHN0YXJ0ZWQgaW4gdGhlIDkwcy4KLSAgICBDbGFzc2ljLAotICAgIC8vLyBCbHVldG9vdGggbG93IGVuZXJneSBmcm9tIHRoZSAyMDEwcy4gQWxzbyBrbm93biBhcyBCTEUsIEJUTEUsIGV0Yy4KLSAgICBMZSwKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvY29tbW9uL3NyYy9yZWFkeS5ycyBiL2dkL3J1c3QvY29tbW9uL3NyYy9yZWFkeS5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1Y2I0Yy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2NvbW1vbi9zcmMvcmVhZHkucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLy8gU2ltcGxpZmllcyBwb2xsaW5nIGZ1dHVyZXMKLSNbbWFjcm9fZXhwb3J0XQotbWFjcm9fcnVsZXMhIHJlYWR5IHsKLSAgICAoJGU6ZXhwciAkKCwpPykgPT4gewotICAgICAgICBtYXRjaCAkZSB7Ci0gICAgICAgICAgICBzdGQ6OnRhc2s6OlBvbGw6OlJlYWR5KHQpID0+IHQsCi0gICAgICAgICAgICBzdGQ6OnRhc2s6OlBvbGw6OlBlbmRpbmcgPT4gcmV0dXJuIHN0ZDo6dGFzazo6UG9sbDo6UGVuZGluZywKLSAgICAgICAgfQotICAgIH07Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2NvbW1vbi9zcmMvc3lzX3Byb3AucnMgYi9nZC9ydXN0L2NvbW1vbi9zcmMvc3lzX3Byb3AucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODY2OWUuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jb21tb24vc3JjL3N5c19wcm9wLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8hIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIEFuZHJvaWQKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IG9uIEFuZHJvaWQKLSNbY2ZnKHRhcmdldF9vcyA9ICJhbmRyb2lkIildCi1wdWIgZm4gZ2V0KG5hbWU6ICZzdHIpIC0+IE9wdGlvbjxTdHJpbmc+IHsKLSAgICBydXN0dXRpbHM6OnN5c3RlbV9wcm9wZXJ0aWVzOjpyZWFkKG5hbWUpLm9rKCkKLX0KLQotLy8vIEZha2UgZ2V0dGVyIGZvciBub24tQW5kcm9pZCwgd2hpY2ggd2lsbCBhbHdheXMgcmV0dXJuIG5vdGhpbmcuCi0vLy8gT25seSBhZGRlZCBzbyBpdCBjb21waWxlcyAmIHlvdSBjYW4gY29uZGl0aW9uYWxseSB1c2luZyBjZmchCi0jW2NmZyhub3QodGFyZ2V0X29zID0gImFuZHJvaWQiKSldCi1wdWIgZm4gZ2V0KF9uYW1lOiAmc3RyKSAtPiBPcHRpb248U3RyaW5nPiB7Ci0gICAgTm9uZQotfQotCi0vLy8gR2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGFzIGEgdTMyCi1wdWIgZm4gZ2V0X3UzMihuYW1lOiAmc3RyKSAtPiBPcHRpb248dTMyPiB7Ci0gICAgaWYgbGV0IFNvbWUodmFsdWUpID0gZ2V0KG5hbWUpIHsKLSAgICAgICAgdmFsdWUucGFyc2UoKS5vaygpCi0gICAgfSBlbHNlIHsKLSAgICAgICAgTm9uZQotICAgIH0KLX0KLQotLy8vIEdldHMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBhcyBhIGJvb2wgKGxvZ2ljIGZvbGxvd3MgbGliY3V0aWxzL3Byb3BlcnRpZXMuY3BwKQotcHViIGZuIGdldF9ib29sKG5hbWU6ICZzdHIpIC0+IE9wdGlvbjxib29sPiB7Ci0gICAgaWYgbGV0IFNvbWUodmFsdWUpID0gZ2V0KG5hbWUpIHsKLSAgICAgICAgbWF0Y2ggdmFsdWUuYXNfc3RyKCkgewotICAgICAgICAgICAgIjAiIHwgIm4iIHwgIm5vIiB8ICJmYWxzZSIgfCAib2ZmIiA9PiBTb21lKGZhbHNlKSwKLSAgICAgICAgICAgICIxIiB8ICJ5IiB8ICJ5ZXMiIHwgInRydWUiIHwgIm9uIiA9PiBTb21lKHRydWUpLAotICAgICAgICAgICAgXyA9PiBOb25lLAotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTm9uZQotICAgIH0KLX0KLQotLy8vIEdldHMgd2hldGhlciB0aGUgY3VycmVudCBidWlsZCBpcyBkZWJ1Z2dhYmxlCi1wdWIgZm4gZ2V0X2RlYnVnZ2FibGUoKSAtPiBib29sIHsKLSAgICBnZXRfYm9vbCgicm8uZGVidWdnYWJsZSIpLnVud3JhcF9vcihmYWxzZSkKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvY29tbW9uL3NyYy90aW1lLnJzIGIvZ2QvcnVzdC9jb21tb24vc3JjL3RpbWUucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNmQ0MTAuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9jb21tb24vc3JjL3RpbWUucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8vISBXYWtpbmcgdGltZXJzIGZvciBCbHVldG9vdGguIEltcGxlbWVudGVkIHVzaW5nIHRpbWVyZmQsIGJ1dCBzdXBwb3NlZCB0byBmZWVsIHNpbWlsYXIgdG8KLS8vL1Rva2lvJ3MgdGltZQotdXNlIG5peDo6c3lzOjp0aW1lOjpUaW1lU3BlYzsKLXVzZSBuaXg6OnN5czo6dGltZXJmZDo6e0Nsb2NrSWQsIEV4cGlyYXRpb24sIFRpbWVyRmQsIFRpbWVyRmxhZ3MsIFRpbWVyU2V0VGltZUZsYWdzfTsKLXVzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOwotdXNlIHRva2lvOjppbzo6dW5peDo6QXN5bmNGZDsKLQotLy8vIEEgc2luZ2xlIHNob3QgQWxhcm0KLXB1YiBzdHJ1Y3QgQWxhcm0gewotICAgIGZkOiBBc3luY0ZkPFRpbWVyRmQ+LAotfQotCi1pbXBsIEFsYXJtIHsKLSAgICAvLy8gQ29uc3RydWN0IGEgbmV3IGFsYXJtCi0gICAgcHViIGZuIG5ldygpIC0+IFNlbGYgewotICAgICAgICBsZXQgdGltZXIgPSBUaW1lckZkOjpuZXcoZ2V0X2Nsb2NrKCksIFRpbWVyRmxhZ3M6OmVtcHR5KCkpLnVud3JhcCgpOwotICAgICAgICBTZWxmIHsgZmQ6IEFzeW5jRmQ6Om5ldyh0aW1lcikudW53cmFwKCkgfQotICAgIH0KLQotICAgIC8vLyBSZXNldCB0aGUgYWxhcm0gdG8gZHVyYXRpb24sIHN0YXJ0aW5nIGZyb20gbm93Ci0gICAgcHViIGZuIHJlc2V0KCZzZWxmLCBkdXJhdGlvbjogRHVyYXRpb24pIHsKLSAgICAgICAgc2VsZi5mZAotICAgICAgICAgICAgLmdldF9yZWYoKQotICAgICAgICAgICAgLnNldChFeHBpcmF0aW9uOjpPbmVTaG90KFRpbWVTcGVjOjpmcm9tKGR1cmF0aW9uKSksIFRpbWVyU2V0VGltZUZsYWdzOjplbXB0eSgpKQotICAgICAgICAgICAgLnVud3JhcCgpOwotICAgIH0KLQotICAgIC8vLyBTdG9wIHRoZSBhbGFybSBpZiBpdCBpcyBjdXJyZW50bHkgc3RhcnRlZAotICAgIHB1YiBmbiBjYW5jZWwoJnNlbGYpIHsKLSAgICAgICAgc2VsZi5yZXNldChEdXJhdGlvbjo6ZnJvbV9taWxsaXMoMCkpOwotICAgIH0KLQotICAgIC8vLyBDb21wbGV0ZXMgd2hlbiB0aGUgYWxhcm0gaGFzIGV4cGlyZWQKLSAgICBwdWIgYXN5bmMgZm4gZXhwaXJlZCgmc2VsZikgewotICAgICAgICBsZXQgbXV0IHJlYWRfcmVhZHkgPSBzZWxmLmZkLnJlYWRhYmxlKCkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIHJlYWRfcmVhZHkuY2xlYXJfcmVhZHkoKTsKLSAgICAgICAgZHJvcChyZWFkX3JlYWR5KTsKLSAgICAgICAgLy8gV2lsbCBub3QgYmxvY2ssIHNpbmNlIHdlIGhhdmUgY29uZmlybWVkIGl0IGlzIHJlYWRhYmxlCi0gICAgICAgIGlmIHNlbGYuZmQuZ2V0X3JlZigpLmdldCgpLnVud3JhcCgpLmlzX3NvbWUoKSB7Ci0gICAgICAgICAgICBzZWxmLmZkLmdldF9yZWYoKS53YWl0KCkudW53cmFwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWltcGwgRGVmYXVsdCBmb3IgQWxhcm0gewotICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICAgICAgQWxhcm06Om5ldygpCi0gICAgfQotfQotCi0vLy8gU2ltaWxhciB0byB0b2tpbydzIGludGVydmFsLCBleGNlcHQgdGhlIGZpcnN0IHRpY2sgZG9lcyAqbm90KiBjb21wbGV0ZSBpbW1lZGlhdGVseQotcHViIGZuIGludGVydmFsKHBlcmlvZDogRHVyYXRpb24pIC0+IEludGVydmFsIHsKLSAgICBsZXQgdGltZXIgPSBUaW1lckZkOjpuZXcoZ2V0X2Nsb2NrKCksIFRpbWVyRmxhZ3M6OmVtcHR5KCkpLnVud3JhcCgpOwotICAgIHRpbWVyLnNldChFeHBpcmF0aW9uOjpJbnRlcnZhbChUaW1lU3BlYzo6ZnJvbShwZXJpb2QpKSwgVGltZXJTZXRUaW1lRmxhZ3M6OmVtcHR5KCkpLnVud3JhcCgpOwotCi0gICAgSW50ZXJ2YWwgeyBmZDogQXN5bmNGZDo6bmV3KHRpbWVyKS51bndyYXAoKSB9Ci19Ci0KLS8vLyBGdXR1cmUgcmV0dXJuZWQgYnkgaW50ZXJ2YWwoKQotcHViIHN0cnVjdCBJbnRlcnZhbCB7Ci0gICAgZmQ6IEFzeW5jRmQ8VGltZXJGZD4sCi19Ci0KLWltcGwgSW50ZXJ2YWwgewotICAgIC8vLyBDYWxsIHRoaXMgdG8gZ2V0IHRoZSBmdXR1cmUgZm9yIHRoZSBuZXh0IHRpY2sgb2YgdGhlIGludGVydmFsCi0gICAgcHViIGFzeW5jIGZuIHRpY2soJm11dCBzZWxmKSB7Ci0gICAgICAgIGxldCBtdXQgcmVhZF9yZWFkeSA9IHNlbGYuZmQucmVhZGFibGUoKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgcmVhZF9yZWFkeS5jbGVhcl9yZWFkeSgpOwotICAgICAgICBkcm9wKHJlYWRfcmVhZHkpOwotICAgICAgICAvLyBXaWxsIG5vdCBibG9jaywgc2luY2Ugd2UgaGF2ZSBjb25maXJtZWQgaXQgaXMgcmVhZGFibGUKLSAgICAgICAgaWYgc2VsZi5mZC5nZXRfcmVmKCkuZ2V0KCkudW53cmFwKCkuaXNfc29tZSgpIHsKLSAgICAgICAgICAgIHNlbGYuZmQuZ2V0X3JlZigpLndhaXQoKS51bndyYXAoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotZm4gZ2V0X2Nsb2NrKCkgLT4gQ2xvY2tJZCB7Ci0gICAgaWYgY2ZnISh0YXJnZXRfb3MgPSAiYW5kcm9pZCIpIHsKLSAgICAgICAgQ2xvY2tJZDo6Q0xPQ0tfQk9PVFRJTUVfQUxBUk0KLSAgICB9IGVsc2UgewotICAgICAgICBDbG9ja0lkOjpDTE9DS19CT09UVElNRQotICAgIH0KLX0KLQotI1tjZmcodGVzdCldCi1tb2QgdGVzdHMgewotICAgIHVzZSBzdXBlcjo6aW50ZXJ2YWw7Ci0gICAgdXNlIHN1cGVyOjpBbGFybTsKLSAgICB1c2UgY3JhdGU6OmFzc2VydF9uZWFyOwotICAgIHVzZSBzdGQ6OnRpbWU6OntEdXJhdGlvbiwgSW5zdGFudH07Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gYWxhcm1fc2ltcGxlX2Nhc2UoKSB7Ci0gICAgICAgIGxldCBydW50aW1lID0gdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpOwotICAgICAgICBydW50aW1lLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCB0aW1lciA9IEluc3RhbnQ6Om5vdygpOwotICAgICAgICAgICAgbGV0IGFsYXJtID0gQWxhcm06Om5ldygpOwotICAgICAgICAgICAgYWxhcm0ucmVzZXQoRHVyYXRpb246OmZyb21fbWlsbGlzKDEwKSk7Ci0gICAgICAgICAgICBhbGFybS5leHBpcmVkKCkuYXdhaXQ7Ci0KLSAgICAgICAgICAgIGFzc2VydF9uZWFyISh0aW1lci5lbGFwc2VkKCkuYXNfbWlsbGlzKCksIDEwLCAzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIGFsYXJtX2NhbmNlbF9hZnRlcl9leHBpcmVkKCkgewotICAgICAgICBsZXQgcnVudGltZSA9IHRva2lvOjpydW50aW1lOjpSdW50aW1lOjpuZXcoKS51bndyYXAoKTsKLSAgICAgICAgcnVudGltZS5ibG9ja19vbihhc3luYyB7Ci0gICAgICAgICAgICBsZXQgYWxhcm0gPSBBbGFybTo6bmV3KCk7Ci0gICAgICAgICAgICBhbGFybS5yZXNldChEdXJhdGlvbjo6ZnJvbV9taWxsaXMoMTApKTsKLSAgICAgICAgICAgIHRva2lvOjp0aW1lOjpzbGVlcChEdXJhdGlvbjo6ZnJvbV9taWxsaXMoMzApKS5hd2FpdDsKLSAgICAgICAgICAgIGFsYXJtLmNhbmNlbCgpOwotCi0gICAgICAgICAgICBmb3IgXyBpbiAwLi4xMCB7Ci0gICAgICAgICAgICAgICAgbGV0IHJlYWR5X2luXzEwX21zID0gYXN5bmMgewotICAgICAgICAgICAgICAgICAgICB0b2tpbzo6dGltZTo6c2xlZXAoRHVyYXRpb246OmZyb21fbWlsbGlzKDEwKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIHRva2lvOjpzZWxlY3QhIHsKLSAgICAgICAgICAgICAgICAgICAgXyA9IGFsYXJtLmV4cGlyZWQoKSA9PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgXyA9IHJlYWR5X2luXzEwX21zID0+ICgpLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIGFsYXJtX2NsZWFyX3JlYWR5X2FmdGVyX2V4cGlyZWQoKSB7Ci0gICAgICAgIC8vIEFmdGVyIGFuIGFsYXJtIGV4cGlyZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGNsZWFyIHJlYWR5IGZyb20gQXN5bmNGZFJlYWR5R3VhcmQuCi0gICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIHN0aWxsIHJlYWR5IGFuZCBzZWxlY3QhIHdvbid0IHdvcmsuCi0gICAgICAgIGxldCBydW50aW1lID0gdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpOwotICAgICAgICBydW50aW1lLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCB0aW1lciA9IEluc3RhbnQ6Om5vdygpOwotICAgICAgICAgICAgbGV0IGFsYXJtID0gQWxhcm06Om5ldygpOwotICAgICAgICAgICAgYWxhcm0ucmVzZXQoRHVyYXRpb246OmZyb21fbWlsbGlzKDEwKSk7Ci0gICAgICAgICAgICBhbGFybS5leHBpcmVkKCkuYXdhaXQ7Ci0gICAgICAgICAgICBsZXQgcmVhZHlfaW5fMTBfbXMgPSBhc3luYyB7Ci0gICAgICAgICAgICAgICAgdG9raW86OnRpbWU6OnNsZWVwKER1cmF0aW9uOjpmcm9tX21pbGxpcygxMCkpLmF3YWl0OwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHRva2lvOjpzZWxlY3QhIHsKLSAgICAgICAgICAgICAgICBfID0gYWxhcm0uZXhwaXJlZCgpID0+ICgpLAotICAgICAgICAgICAgICAgIF8gPSByZWFkeV9pbl8xMF9tcyA9PiAoKSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydF9uZWFyISh0aW1lci5lbGFwc2VkKCkuYXNfbWlsbGlzKCksIDIwLCAzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIGludGVydmFsX3NjaGVkdWxlX2FuZF90aGVuX2Ryb3AoKSB7Ci0gICAgICAgIGxldCBydW50aW1lID0gdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpOwotICAgICAgICBydW50aW1lLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGludGVydmFsKER1cmF0aW9uOjpmcm9tX21pbGxpcygxMCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gaW50ZXJ2YWxfc2ltcGxlX2Nhc2UoKSB7Ci0gICAgICAgIGxldCBydW50aW1lID0gdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpOwotICAgICAgICBydW50aW1lLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCB0aW1lciA9IEluc3RhbnQ6Om5vdygpOwotICAgICAgICAgICAgbGV0IG11dCBpbnRlcnZhbCA9IGludGVydmFsKER1cmF0aW9uOjpmcm9tX21pbGxpcygxMCkpOwotCi0gICAgICAgICAgICBmb3IgbiBpbiAxLi4xMCB7Ci0gICAgICAgICAgICAgICAgaW50ZXJ2YWwudGljaygpLmF3YWl0OwotICAgICAgICAgICAgICAgIHByaW50bG4hKCJ7fSIsIG4pOwotICAgICAgICAgICAgICAgIGFzc2VydF9uZWFyISh0aW1lci5lbGFwc2VkKCkuYXNfbWlsbGlzKCksIDEwICogbiwgMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvZmFjYWRlL0FuZHJvaWQuYnAgYi9nZC9ydXN0L2ZhY2FkZS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRmMDYxLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZmFjYWRlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1ydXN0X2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGhfd2l0aF9mYWNhZGVzIiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgY3JhdGVfbmFtZTogImJsdWV0b290aF93aXRoX2ZhY2FkZXMiLAotICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAotICAgIGVkaXRpb246ICIyMDE4IiwKLSAgICBydXN0bGliczogWwotICAgICAgImxpYmJsdWV0b290aF9ycyIsCi0gICAgICAibGliYnRfZmFjYWRlX3Byb3RvIiwKLSAgICAgICJsaWJmdXR1cmVzIiwKLSAgICAgICJsaWJncnBjaW8iLAotICAgICAgImxpYnByb3RvYnVmIiwKLSAgICAgICJsaWJ0b2tpbyIsCi0gICAgICAibGliZ2RkaSIsCi0gICAgICAibGlibG9nX3J1c3QiLAotICAgIF0sCi19Ci0KLXJ1c3RfYmluYXJ5IHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoX3dpdGhfZmFjYWRlcyIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfcnVzdF9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsic3JjL21haW4ucnMiXSwKLSAgICBlZGl0aW9uOiAiMjAxOCIsCi0gICAgcnVzdGxpYnM6IFsKLSAgICAgICJsaWJjbGFwIiwKLSAgICAgICJsaWJibHVldG9vdGhfd2l0aF9mYWNhZGVzIiwKLSAgICAgICJsaWJmdXR1cmVzIiwKLSAgICAgICJsaWJncnBjaW8iLAotICAgICAgImxpYnRva2lvIiwKLSAgICAgICJsaWJuaXgiLAotICAgICAgImxpYmJ0X2NvbW1vbiIsCi0gICAgICAibGlibG9nX3J1c3QiLAotICAgIF0sCi19Ci0KLXJ1c3RfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYmJ0X2ZhY2FkZV9oZWxwZXJzIiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgY3JhdGVfbmFtZTogImJ0X2ZhY2FkZV9oZWxwZXJzIiwKLSAgICBzcmNzOiBbImhlbHBlcnMvbGliLnJzIl0sCi0gICAgZWRpdGlvbjogIjIwMTgiLAotICAgIHJ1c3RsaWJzOiBbCi0gICAgICAgICJsaWJidF9mYWNhZGVfcHJvdG8iLAotICAgICAgICAibGliYnl0ZXMiLAotICAgICAgICAibGliZnV0dXJlcyIsCi0gICAgICAgICJsaWJncnBjaW8iLAotICAgICAgICAibGlidG9raW8iLAotICAgICAgICAibGlicHJvdG9idWYiLAotICAgICAgICAibGlibG9nX3J1c3QiLAotICAgICAgICAibGliY3h4IiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9mYWNhZGUvQlVJTEQuZ24gYi9nZC9ydXN0L2ZhY2FkZS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0MDgyNS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2ZhY2FkZS9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ydXN0X2xpYnJhcnkoImxpYmJ0X2ZhY2FkZV9oZWxwZXJzIikgewotICBjcmF0ZV9uYW1lID0gImJ0X2ZhY2FkZV9oZWxwZXJzIgotICBzb3VyY2VzID0gWwotICAgICJoZWxwZXJzL2xpYi5ycyIsCi0gIF0KLQotICBjb25maWdzID0gWwotICAgICIvL2J0L2dkL3J1c3Qvc2hpbTpydXN0X2xpYnMiLAotICAgICIvL2J0L2dkOnJ1c3RfZGVmYXVsdHMiLAotICBdCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2ZhY2FkZS9DYXJnby50b21sIGIvZ2QvcnVzdC9mYWNhZGUvQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODg3NS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2ZhY2FkZS9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVtwYWNrYWdlXQotbmFtZSA9ICJibHVldG9vdGhfd2l0aF9mYWNhZGVzIgotdmVyc2lvbiA9ICIwLjAuMSIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2RlcGVuZGVuY2llc10KLSMgR0QgYmx1ZXRvb3RoIGRlcHMKLWJ0X2ZhY2FkZV9wcm90byA9IHsgcGF0aCA9ICIuLi9mYWNhZGVfcHJvdG8iIH0KLWJ0X3BhY2tldHMgPSB7IHBhdGggPSAiLi4vcGFja2V0cyIgfQotCi0jIEV4dGVybmFsIGRlcHMKLWJ5dGVzID0gIioiCi1jeHggPSAiKiIKLWZ1dHVyZXMgPSAiKiIKLWdycGNpbyA9ICIqIgotbG9nID0gIioiCi1wcm90b2J1ZiA9ICIqIgotdG9raW8gPSAiKiIKLQotIyBCaW5hcnktb25seSBkZXBzCi1jbGFwID0gIioiCi1sYXp5X3N0YXRpYyA9ICIqIgotbml4ID0gIioiCi1idF9jb21tb24gPSB7IHBhdGggPSAiLi4vY29tbW9uIiB9Ci0KLQotW1tiaW5dXQotbmFtZSA9ICJibHVldG9vdGhfd2l0aF9mYWNhZGVzIgotcGF0aCA9ICJzcmMvbWFpbi5ycyIKLQotW2xpYl0KLXBhdGggPSAic3JjL2xpYi5ycyIKLWNyYXRlLXR5cGUgPSBbInJsaWIiXQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9mYWNhZGUvaGVscGVycy9DYXJnby50b21sIGIvZ2QvcnVzdC9mYWNhZGUvaGVscGVycy9DYXJnby50b21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM5MzA1Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZmFjYWRlL2hlbHBlcnMvQ2FyZ28udG9tbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1bcGFja2FnZV0KLW5hbWUgPSAiYnRfZmFjYWRlX2hlbHBlcnMiCi12ZXJzaW9uID0gIjAuMC4xIgotZWRpdGlvbiA9ICIyMDE4IgotCi1bZGVwZW5kZW5jaWVzXQotIyBHRCBibHVldG9vdGggZGVwcwotYnRfZmFjYWRlX3Byb3RvID0geyBwYXRoID0gIi4uLy4uL2ZhY2FkZV9wcm90byIgfQotCi0jIEV4dGVybmFsIGRlcHMKLWJ5dGVzID0gIioiCi1jeHggPSAiKiIKLWZ1dHVyZXMgPSAiKiIKLWdycGNpbyA9ICIqIgotbG9nID0gIioiCi1wcm90b2J1ZiA9ICIqIgotdG9raW8gPSAiKiIKLQotW2xpYl0KLXBhdGggPSAibGliLnJzIgotY3JhdGUtdHlwZSA9IFsicmxpYiJdCi0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvZmFjYWRlL2hlbHBlcnMvbGliLnJzIGIvZ2QvcnVzdC9mYWNhZGUvaGVscGVycy9saWIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjY4MzguLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9mYWNhZGUvaGVscGVycy9saWIucnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyEgY29tbW9uIGZhY2FkZSAmIHNoaW0gaGVscGVycwotCi11c2UgYnRfZmFjYWRlX3Byb3RvOjpjb21tb246OkRhdGE7Ci11c2UgYnl0ZXM6OkJ5dGVzOwotdXNlIGZ1dHVyZXM6OnNpbms6OlNpbmtFeHQ7Ci11c2UgZ3JwY2lvOjoqOwotdXNlIHN0ZDo6c3luYzo6QXJjOwotdXNlIHRva2lvOjpydW50aW1lOjpSdW50aW1lOwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjpSZWNlaXZlcjsKLXVzZSB0b2tpbzo6c3luYzo6TXV0ZXg7Ci0KLS8vLyBXcmFwcGVyIHNvIHdlIGNhbiBpbnZva2UgY2FsbGJhY2tzCi1wdWIgdHJhaXQgVThTbGljZVJ1bm5hYmxlIHsKLSAgICAvLy8gRG8gdGhlIHRoaW5nCi0gICAgZm4gcnVuKCZzZWxmLCBkYXRhOiAmW3U4XSk7Ci19Ci0KLS8vLyBIZWxwZXIgZm9yIGludGVyZmFjaW5nIGNoYW5uZWxzIHdpdGggc2hpbSBvciBnUlBDIGJvdW5kYXJpZXMKLSNbZGVyaXZlKENsb25lKV0KLXB1YiBzdHJ1Y3QgUnhBZGFwdGVyPFQ+IHsKLSAgICByeDogQXJjPE11dGV4PFJlY2VpdmVyPFQ+Pj4sCi0gICAgcnVubmluZzogYm9vbCwKLX0KLQotaW1wbDxUOiAnc3RhdGljICsgSW50bzxWZWM8dTg+PiArIEludG88Qnl0ZXM+ICsgU2VuZD4gUnhBZGFwdGVyPFQ+IHsKLSAgICAvLy8gTmV3LCBmcm9tIGFuIHVud3JhcHBlZCByZWNlaXZlcgotICAgIHB1YiBmbiBuZXcocng6IFJlY2VpdmVyPFQ+KSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZjo6ZnJvbV9hcmMoQXJjOjpuZXcoTXV0ZXg6Om5ldyhyeCkpKQotICAgIH0KLQotICAgIC8vLyBOZXcsIGZyb20gYW4gYWxyZWFkeSBhcmMgbXV0ZXhlZCByZWNlaXZlcgotICAgIHB1YiBmbiBmcm9tX2FyYyhyeDogQXJjPE11dGV4PFJlY2VpdmVyPFQ+Pj4pIC0+IFNlbGYgewotICAgICAgICBTZWxmIHsgcngsIHJ1bm5pbmc6IGZhbHNlIH0KLSAgICB9Ci0KLSAgICAvLy8gU3RyZWFtIG91dCB0aGUgY2hhbm5lbCBvdmVyIHRoZSBwcm92aWRlZCBzaW5rCi0gICAgcHViIGZuIHN0cmVhbV9ncnBjKCZtdXQgc2VsZiwgY3R4OiBScGNDb250ZXh0PCdfPiwgbXV0IHNpbms6IFNlcnZlclN0cmVhbWluZ1Npbms8RGF0YT4pIHsKLSAgICAgICAgYXNzZXJ0ISghc2VsZi5ydW5uaW5nKTsKLSAgICAgICAgc2VsZi5ydW5uaW5nID0gdHJ1ZTsKLQotICAgICAgICBsZXQgY2xvbmVfcnggPSBzZWxmLnJ4LmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIHdoaWxlIGxldCBTb21lKHBheWxvYWQpID0gY2xvbmVfcngubG9jaygpLmF3YWl0LnJlY3YoKS5hd2FpdCB7Ci0gICAgICAgICAgICAgICAgbGV0IG11dCBkYXRhID0gRGF0YTo6ZGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIGRhdGEuc2V0X3BheWxvYWQocGF5bG9hZC5pbnRvKCkpOwotICAgICAgICAgICAgICAgIGlmIGxldCBFcnIoZSkgPSBzaW5rLnNlbmQoKGRhdGEsIFdyaXRlRmxhZ3M6OmRlZmF1bHQoKSkpLmF3YWl0IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nOjplcnJvciEoImZhaWx1cmUgc2VuZGluZyBkYXRhOiB7Oj99IiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8gU3RyZWFtIG91dCB0aGUgY2hhbm5lbCBvdmVyIHRoZSBwcm92aWRlZCBzaGltIHJ1bm5hYmxlCi0gICAgcHViIGZuIHN0cmVhbV9ydW5uYWJsZTxSOiAnc3RhdGljICsgVThTbGljZVJ1bm5hYmxlICsgU2VuZD4oCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgcnQ6ICZBcmM8UnVudGltZT4sCi0gICAgICAgIHJ1bm5hYmxlOiBSLAotICAgICkgewotICAgICAgICBhc3NlcnQhKCFzZWxmLnJ1bm5pbmcpOwotICAgICAgICBzZWxmLnJ1bm5pbmcgPSB0cnVlOwotCi0gICAgICAgIGxldCBjbG9uZV9yeCA9IHNlbGYucnguY2xvbmUoKTsKLSAgICAgICAgcnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICB3aGlsZSBsZXQgU29tZShwYXlsb2FkKSA9IGNsb25lX3J4LmxvY2soKS5hd2FpdC5yZWN2KCkuYXdhaXQgewotICAgICAgICAgICAgICAgIGxldCBieXRlczogQnl0ZXMgPSBwYXlsb2FkLmludG8oKTsKLSAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oJmJ5dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9mYWNhZGUvc3JjL2xpYi5ycyBiL2dkL3J1c3QvZmFjYWRlL3NyYy9saWIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzg4MmEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9mYWNhZGUvc3JjL2xpYi5ycworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLyEgQmx1ZXRvb3RoIHRlc3Rpbmcgcm9vdCBmYWNhZGUgc2VydmljZQotCi11c2UgYmx1ZXRvb3RoX3JzOjpoYWw6OmZhY2FkZTo6SGNpSGFsRmFjYWRlU2VydmljZTsKLXVzZSBibHVldG9vdGhfcnM6OmhjaTo6Y29udHJvbGxlcl9mYWNhZGU6OkNvbnRyb2xsZXJGYWNhZGVTZXJ2aWNlOwotdXNlIGJsdWV0b290aF9yczo6aGNpOjpmYWNhZGU6OkhjaUZhY2FkZVNlcnZpY2U7Ci11c2UgYmx1ZXRvb3RoX3JzOjpTdGFjazsKLXVzZSBidF9mYWNhZGVfcHJvdG86OnJvb3RzZXJ2aWNlOjoqOwotdXNlIGJ0X2ZhY2FkZV9wcm90bzo6cm9vdHNlcnZpY2VfZ3JwYzo6e2NyZWF0ZV9yb290X2ZhY2FkZSwgUm9vdEZhY2FkZX07Ci11c2UgZnV0dXJlczo6ZXhlY3V0b3I6OmJsb2NrX29uOwotdXNlIGdycGNpbzo6KjsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLXVzZSB0b2tpbzo6c3luYzo6bXBzYzo6e2NoYW5uZWwsIFNlbmRlcn07Ci11c2UgdG9raW86OnN5bmM6Om9uZXNob3Q7Ci0KLS8vLyBCbHVldG9vdGggdGVzdGluZyByb290IGZhY2FkZSBzZXJ2aWNlCi0jW2Rlcml2ZShDbG9uZSldCi1wdWIgc3RydWN0IFJvb3RGYWNhZGVTZXJ2aWNlIHsKLSAgICBydDogQXJjPFJ1bnRpbWU+LAotICAgIG1hbmFnZXI6IEZhY2FkZVNlcnZpY2VNYW5hZ2VyLAotfQotCi1pbXBsIFJvb3RGYWNhZGVTZXJ2aWNlIHsKLSAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByb290IGZhY2FkZSBzZXJ2aWNlCi0gICAgcHViIGZuIGNyZWF0ZSgKLSAgICAgICAgcnQ6IEFyYzxSdW50aW1lPiwKLSAgICAgICAgZ3JwY19wb3J0OiB1MTYsCi0gICAgICAgIHJvb3RjYW5hbF9wb3J0OiBPcHRpb248dTE2PiwKLSAgICAgICAgc25vb3BfcGF0aDogT3B0aW9uPFN0cmluZz4sCi0gICAgKSAtPiBncnBjaW86OlNlcnZpY2UgewotICAgICAgICBjcmVhdGVfcm9vdF9mYWNhZGUoU2VsZiB7Ci0gICAgICAgICAgICBydDogcnQuY2xvbmUoKSwKLSAgICAgICAgICAgIG1hbmFnZXI6IEZhY2FkZVNlcnZpY2VNYW5hZ2VyOjpjcmVhdGUocnQsIGdycGNfcG9ydCwgcm9vdGNhbmFsX3BvcnQsIHNub29wX3BhdGgpLAotICAgICAgICB9KQotICAgIH0KLX0KLQotaW1wbCBSb290RmFjYWRlIGZvciBSb290RmFjYWRlU2VydmljZSB7Ci0gICAgZm4gc3RhcnRfc3RhY2soCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgX2N0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIHJlcTogU3RhcnRTdGFja1JlcXVlc3QsCi0gICAgICAgIHNpbms6IFVuYXJ5U2luazxTdGFydFN0YWNrUmVzcG9uc2U+LAotICAgICkgewotICAgICAgICBzZWxmLnJ0LmJsb2NrX29uKHNlbGYubWFuYWdlci5zdGFydChyZXEpKS51bndyYXAoKTsKLSAgICAgICAgc2luay5zdWNjZXNzKFN0YXJ0U3RhY2tSZXNwb25zZTo6ZGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBmbiBzdG9wX3N0YWNrKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF9jdHg6IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfcmVxOiBTdG9wU3RhY2tSZXF1ZXN0LAotICAgICAgICBzaW5rOiBVbmFyeVNpbms8U3RvcFN0YWNrUmVzcG9uc2U+LAotICAgICkgewotICAgICAgICBzZWxmLnJ0LmJsb2NrX29uKHNlbGYubWFuYWdlci5zdG9wKCkpLnVud3JhcCgpOwotICAgICAgICBzaW5rLnN1Y2Nlc3MoU3RvcFN0YWNrUmVzcG9uc2U6OmRlZmF1bHQoKSk7Ci0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1lbnVtIExpZmVjeWNsZUNvbW1hbmQgewotICAgIFN0YXJ0IHsgcmVxOiBTdGFydFN0YWNrUmVxdWVzdCwgZG9uZTogb25lc2hvdDo6U2VuZGVyPCgpPiB9LAotICAgIFN0b3AgeyBkb25lOiBvbmVzaG90OjpTZW5kZXI8KCk+IH0sCi19Ci0KLSNbZGVyaXZlKENsb25lKV0KLXN0cnVjdCBGYWNhZGVTZXJ2aWNlTWFuYWdlciB7Ci0gICAgbGlmZWN5Y2xlX3R4OiBTZW5kZXI8TGlmZWN5Y2xlQ29tbWFuZD4sCi19Ci0KLXN0cnVjdCBGYWNhZGVTZXJ2ZXIgewotICAgIHNlcnZlcjogU2VydmVyLAotICAgIHN0YWNrOiBTdGFjaywKLX0KLQotaW1wbCBGYWNhZGVTZXJ2ZXIgewotICAgIGFzeW5jIGZuIHN0YXJ0KHN0YWNrOiBTdGFjaywgcmVxOiBTdGFydFN0YWNrUmVxdWVzdCwgZ3JwY19wb3J0OiB1MTYpIC0+IFNlbGYgewotICAgICAgICBsZXQgbXV0IHNlcnZpY2VzID0gVmVjOjpuZXcoKTsKLSAgICAgICAgbWF0Y2ggcmVxLmdldF9tb2R1bGVfdW5kZXJfdGVzdCgpIHsKLSAgICAgICAgICAgIEJsdWV0b290aE1vZHVsZTo6SEFMID0+IHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKHN0YWNrLmdldF9ncnBjOjo8SGNpSGFsRmFjYWRlU2VydmljZT4oKS5hd2FpdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCbHVldG9vdGhNb2R1bGU6OkhDSSA9PiB7Ci0gICAgICAgICAgICAgICAgc2VydmljZXMucHVzaChzdGFjay5nZXRfZ3JwYzo6PEhjaUZhY2FkZVNlcnZpY2U+KCkuYXdhaXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoTW9kdWxlOjpIQ0lfSU5URVJGQUNFUyA9PiB7Ci0gICAgICAgICAgICAgICAgc2VydmljZXMucHVzaChzdGFjay5nZXRfZ3JwYzo6PEhjaUZhY2FkZVNlcnZpY2U+KCkuYXdhaXQpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goc3RhY2suZ2V0X2dycGM6OjxDb250cm9sbGVyRmFjYWRlU2VydmljZT4oKS5hd2FpdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfID0+IHVuaW1wbGVtZW50ZWQhKCksCi0gICAgICAgIH0KLQotICAgICAgICBsZXQgZW52ID0gQXJjOjpuZXcoRW52aXJvbm1lbnQ6Om5ldygyKSk7Ci0gICAgICAgIGxldCBtdXQgYnVpbGRlciA9IFNlcnZlckJ1aWxkZXI6Om5ldyhlbnYpLmJpbmQoIjAuMC4wLjAiLCBncnBjX3BvcnQpOwotICAgICAgICBmb3Igc2VydmljZSBpbiBzZXJ2aWNlcyB7Ci0gICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5yZWdpc3Rlcl9zZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IG11dCBzZXJ2ZXIgPSBidWlsZGVyLmJ1aWxkKCkudW53cmFwKCk7Ci0gICAgICAgIHNlcnZlci5zdGFydCgpOwotCi0gICAgICAgIFNlbGYgeyBzZXJ2ZXIsIHN0YWNrIH0KLSAgICB9Ci0KLSAgICBhc3luYyBmbiBzdG9wKCZtdXQgc2VsZikgewotICAgICAgICBzZWxmLnNlcnZlci5zaHV0ZG93bigpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICBzZWxmLnN0YWNrLnN0b3AoKS5hd2FpdDsKLSAgICB9Ci19Ci0KLS8vLyBSZXN1bHQgdHlwZQotdHlwZSBSZXN1bHQ8VD4gPSBzdGQ6OnJlc3VsdDo6UmVzdWx0PFQsIEJveDxkeW4gc3RkOjplcnJvcjo6RXJyb3IgKyBTZW5kICsgU3luYz4+OwotCi1pbXBsIEZhY2FkZVNlcnZpY2VNYW5hZ2VyIHsKLSAgICBmbiBjcmVhdGUoCi0gICAgICAgIHJ0OiBBcmM8UnVudGltZT4sCi0gICAgICAgIGdycGNfcG9ydDogdTE2LAotICAgICAgICByb290Y2FuYWxfcG9ydDogT3B0aW9uPHUxNj4sCi0gICAgICAgIHNub29wX3BhdGg6IE9wdGlvbjxTdHJpbmc+LAotICAgICkgLT4gU2VsZiB7Ci0gICAgICAgIGxldCAodHgsIG11dCByeCkgPSBjaGFubmVsOjo8TGlmZWN5Y2xlQ29tbWFuZD4oMSk7Ci0gICAgICAgIGxldCBsb2NhbF9ydCA9IHJ0LmNsb25lKCk7Ci0gICAgICAgIHJ0LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgbGV0IG11dCBzZXJ2ZXI6IE9wdGlvbjxGYWNhZGVTZXJ2ZXI+ID0gTm9uZTsKLSAgICAgICAgICAgIHdoaWxlIGxldCBTb21lKGNtZCkgPSByeC5yZWN2KCkuYXdhaXQgewotICAgICAgICAgICAgICAgIG1hdGNoIGNtZCB7Ci0gICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZUNvbW1hbmQ6OlN0YXJ0IHsgcmVxLCBkb25lIH0gPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YWNrID0gU3RhY2s6Om5ldyhsb2NhbF9ydC5jbG9uZSgpKS5hd2FpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnNldF9yb290Y2FuYWxfcG9ydChyb290Y2FuYWxfcG9ydCkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5jb25maWd1cmVfc25vb3Aoc25vb3BfcGF0aC5jbG9uZSgpKS5hd2FpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IFNvbWUoRmFjYWRlU2VydmVyOjpzdGFydChzdGFjaywgcmVxLCBncnBjX3BvcnQpLmF3YWl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUuc2VuZCgoKSkudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlQ29tbWFuZDo6U3RvcCB7IGRvbmUgfSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShzKSA9ICZtdXQgc2VydmVyIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19vbihzLnN0b3AoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUuc2VuZCgoKSkudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFNlbGYgeyBsaWZlY3ljbGVfdHg6IHR4IH0KLSAgICB9Ci0KLSAgICBhc3luYyBmbiBzdGFydCgmc2VsZiwgcmVxOiBTdGFydFN0YWNrUmVxdWVzdCkgLT4gUmVzdWx0PCgpPiB7Ci0gICAgICAgIGxldCAodHgsIHJ4KSA9IG9uZXNob3Q6OmNoYW5uZWwoKTsKLSAgICAgICAgc2VsZi5saWZlY3ljbGVfdHguc2VuZChMaWZlY3ljbGVDb21tYW5kOjpTdGFydCB7IHJlcSwgZG9uZTogdHggfSkuYXdhaXQ/OwotICAgICAgICByeC5hd2FpdD87Ci0gICAgICAgIE9rKCgpKQotICAgIH0KLQotICAgIGFzeW5jIGZuIHN0b3AoJnNlbGYpIC0+IFJlc3VsdDwoKT4gewotICAgICAgICBsZXQgKHR4LCByeCkgPSBvbmVzaG90OjpjaGFubmVsKCk7Ci0gICAgICAgIHNlbGYubGlmZWN5Y2xlX3R4LnNlbmQoTGlmZWN5Y2xlQ29tbWFuZDo6U3RvcCB7IGRvbmU6IHR4IH0pLmF3YWl0PzsKLSAgICAgICAgcnguYXdhaXQ/OwotICAgICAgICBPaygoKSkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2ZhY2FkZS9zcmMvbWFpbi5ycyBiL2dkL3J1c3QvZmFjYWRlL3NyYy9tYWluLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNmYjBjLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZmFjYWRlL3NyYy9tYWluLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vISBTdGFydHMgdGhlIGZhY2FkZSBzZXJ2aWNlcyB0aGF0IGFsbG93IHVzIHRvIHRlc3QgdGhlIEJsdWV0b290aCBzdGFjawotCi0jW21hY3JvX3VzZV0KLWV4dGVybiBjcmF0ZSBjbGFwOwotdXNlIGNsYXA6OntBcHAsIEFyZ307Ci0KLSNbbWFjcm9fdXNlXQotZXh0ZXJuIGNyYXRlIGxhenlfc3RhdGljOwotCi11c2UgYmx1ZXRvb3RoX3dpdGhfZmFjYWRlczo6Um9vdEZhY2FkZVNlcnZpY2U7Ci11c2UgZnV0dXJlczo6Y2hhbm5lbDo6bXBzYzsKLXVzZSBmdXR1cmVzOjpleGVjdXRvcjo6YmxvY2tfb247Ci11c2UgZnV0dXJlczo6c3RyZWFtOjpTdHJlYW1FeHQ7Ci11c2UgZ3JwY2lvOjoqOwotdXNlIGxvZzo6ZGVidWc7Ci11c2Ugbml4OjpzeXM6OnNpZ25hbDsKLXVzZSBzdGQ6Om5ldDo6e0lwQWRkciwgSXB2NEFkZHIsIFNvY2tldEFkZHJ9OwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHRva2lvOjppbzo6QXN5bmNXcml0ZUV4dDsKLXVzZSB0b2tpbzo6bmV0OjpUY3BTdHJlYW07Ci11c2UgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU7Ci0KLWZuIG1haW4oKSB7Ci0gICAgbGV0IHNpZ2ludCA9IGluc3RhbGxfc2lnaW50KCk7Ci0gICAgYnRfY29tbW9uOjppbml0X2xvZ2dpbmcoKTsKLSAgICBsZXQgcnQgPSBBcmM6Om5ldyhSdW50aW1lOjpuZXcoKS51bndyYXAoKSk7Ci0gICAgcnQuYmxvY2tfb24oYXN5bmNfbWFpbihBcmM6OmNsb25lKCZydCksIHNpZ2ludCkpOwotfQotCi1hc3luYyBmbiBhc3luY19tYWluKHJ0OiBBcmM8UnVudGltZT4sIG11dCBzaWdpbnQ6IG1wc2M6OlVuYm91bmRlZFJlY2VpdmVyPCgpPikgewotICAgIGxldCBtYXRjaGVzID0gQXBwOjpuZXcoImJsdWV0b290aF93aXRoX2ZhY2FkZXMiKQotICAgICAgICAuYWJvdXQoIlRoZSBibHVldG9vdGggc3RhY2ssIHdpdGggdGVzdGluZyBmYWNhZGVzIGVuYWJsZWQgYW5kIGV4cG9zZWQgdmlhIGdSUEMuIikKLSAgICAgICAgLmFyZygKLSAgICAgICAgICAgIEFyZzo6d2l0aF9uYW1lKCJyb290LXNlcnZlci1wb3J0IikKLSAgICAgICAgICAgICAgICAubG9uZygicm9vdC1zZXJ2ZXItcG9ydCIpCi0gICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoIjg4OTciKQotICAgICAgICAgICAgICAgIC50YWtlc192YWx1ZSh0cnVlKSwKLSAgICAgICAgKQotICAgICAgICAuYXJnKEFyZzo6d2l0aF9uYW1lKCJncnBjLXBvcnQiKS5sb25nKCJncnBjLXBvcnQiKS5kZWZhdWx0X3ZhbHVlKCI4ODk5IikudGFrZXNfdmFsdWUodHJ1ZSkpCi0gICAgICAgIC5hcmcoCi0gICAgICAgICAgICBBcmc6OndpdGhfbmFtZSgic2lnbmFsLXBvcnQiKQotICAgICAgICAgICAgICAgIC5sb25nKCJzaWduYWwtcG9ydCIpCi0gICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoIjg4OTUiKQotICAgICAgICAgICAgICAgIC50YWtlc192YWx1ZSh0cnVlKSwKLSAgICAgICAgKQotICAgICAgICAuYXJnKEFyZzo6d2l0aF9uYW1lKCJyb290Y2FuYWwtcG9ydCIpLmxvbmcoInJvb3RjYW5hbC1wb3J0IikudGFrZXNfdmFsdWUodHJ1ZSkpCi0gICAgICAgIC5hcmcoQXJnOjp3aXRoX25hbWUoImJ0c25vb3AiKS5sb25nKCJidHNub29wIikudGFrZXNfdmFsdWUodHJ1ZSkpCi0gICAgICAgIC5hcmcoQXJnOjp3aXRoX25hbWUoImJ0c25vb3oiKS5sb25nKCJidHNub296IikudGFrZXNfdmFsdWUodHJ1ZSkpCi0gICAgICAgIC5hcmcoQXJnOjp3aXRoX25hbWUoImJ0Y29uZmlnIikubG9uZygiYnRjb25maWciKS50YWtlc192YWx1ZSh0cnVlKSkKLSAgICAgICAgLmdldF9tYXRjaGVzKCk7Ci0KLSAgICBsZXQgcm9vdF9zZXJ2ZXJfcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJyb290LXNlcnZlci1wb3J0IiwgdTE2KS51bndyYXAoKTsKLSAgICBsZXQgZ3JwY19wb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgImdycGMtcG9ydCIsIHUxNikudW53cmFwKCk7Ci0gICAgbGV0IHNpZ25hbF9wb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInNpZ25hbC1wb3J0IiwgdTE2KS51bndyYXAoKTsKLSAgICBsZXQgcm9vdGNhbmFsX3BvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicm9vdGNhbmFsLXBvcnQiLCB1MTYpLm9rKCk7Ci0gICAgbGV0IGVudiA9IEFyYzo6bmV3KEVudmlyb25tZW50OjpuZXcoMikpOwotICAgIGxldCBtdXQgc2VydmVyID0gU2VydmVyQnVpbGRlcjo6bmV3KGVudikKLSAgICAgICAgLnJlZ2lzdGVyX3NlcnZpY2UoUm9vdEZhY2FkZVNlcnZpY2U6OmNyZWF0ZSgKLSAgICAgICAgICAgIHJ0LAotICAgICAgICAgICAgZ3JwY19wb3J0LAotICAgICAgICAgICAgcm9vdGNhbmFsX3BvcnQsCi0gICAgICAgICAgICBtYXRjaGVzLnZhbHVlX29mKCJidHNub29wIikubWFwKFN0cmluZzo6ZnJvbSksCi0gICAgICAgICkpCi0gICAgICAgIC5iaW5kKCIwLjAuMC4wIiwgcm9vdF9zZXJ2ZXJfcG9ydCkKLSAgICAgICAgLmJ1aWxkKCkKLSAgICAgICAgLnVud3JhcCgpOwotICAgIHNlcnZlci5zdGFydCgpOwotCi0gICAgaW5kaWNhdGVfc3RhcnRlZChzaWduYWxfcG9ydCkuYXdhaXQ7Ci0gICAgc2lnaW50Lm5leHQoKS5hd2FpdDsKLSAgICBibG9ja19vbihzZXJ2ZXIuc2h1dGRvd24oKSkudW53cmFwKCk7Ci19Ci0KLWFzeW5jIGZuIGluZGljYXRlX3N0YXJ0ZWQoc2lnbmFsX3BvcnQ6IHUxNikgewotICAgIGxldCBhZGRyZXNzID0gU29ja2V0QWRkcjo6bmV3KElwQWRkcjo6VjQoSXB2NEFkZHI6Om5ldygwLCAwLCAwLCAwKSksIHNpZ25hbF9wb3J0KTsKLSAgICBsZXQgbXV0IHN0cmVhbSA9IFRjcFN0cmVhbTo6Y29ubmVjdChhZGRyZXNzKS5hd2FpdC51bndyYXAoKTsKLSAgICBzdHJlYW0uc2h1dGRvd24oKS5hd2FpdC51bndyYXAoKTsKLX0KLQotLy8gVE9ETzogcmVtb3ZlIGFzIHRoaXMgaXMgYSB0ZW1wb3Jhcnkgbml4LWJhc2VkIGhhY2sgdG8gY2F0Y2ggU0lHSU5UCi1mbiBpbnN0YWxsX3NpZ2ludCgpIC0+IG1wc2M6OlVuYm91bmRlZFJlY2VpdmVyPCgpPiB7Ci0gICAgbGV0ICh0eCwgcngpID0gbXBzYzo6dW5ib3VuZGVkKCk7Ci0gICAgKlNJR0lOVF9UWC5sb2NrKCkudW53cmFwKCkgPSBTb21lKHR4KTsKLQotICAgIGxldCBzaWdfYWN0aW9uID0gc2lnbmFsOjpTaWdBY3Rpb246Om5ldygKLSAgICAgICAgc2lnbmFsOjpTaWdIYW5kbGVyOjpIYW5kbGVyKGhhbmRsZV9zaWdpbnQpLAotICAgICAgICBzaWduYWw6OlNhRmxhZ3M6OmVtcHR5KCksCi0gICAgICAgIHNpZ25hbDo6U2lnU2V0OjplbXB0eSgpLAotICAgICk7Ci0gICAgdW5zYWZlIHsKLSAgICAgICAgc2lnbmFsOjpzaWdhY3Rpb24oc2lnbmFsOjpTSUdJTlQsICZzaWdfYWN0aW9uKS51bndyYXAoKTsKLSAgICB9Ci0KLSAgICByeAotfQotCi1sYXp5X3N0YXRpYyEgewotICAgIHN0YXRpYyByZWYgU0lHSU5UX1RYOiBNdXRleDxPcHRpb248bXBzYzo6VW5ib3VuZGVkU2VuZGVyPCgpPj4+ID0gTXV0ZXg6Om5ldyhOb25lKTsKLX0KLQotZXh0ZXJuICJDIiBmbiBoYW5kbGVfc2lnaW50KF86IGkzMikgewotICAgIGxldCBtdXQgc2lnaW50X3R4ID0gU0lHSU5UX1RYLmxvY2soKS51bndyYXAoKTsKLSAgICBpZiBsZXQgU29tZSh0eCkgPSAmKnNpZ2ludF90eCB7Ci0gICAgICAgIGRlYnVnISgiU3RvcHBpbmcgZ1JQQyByb290IHNlcnZlciBkdWUgdG8gU0lHSU5UIik7Ci0gICAgICAgIHR4LnVuYm91bmRlZF9zZW5kKCgpKS51bndyYXAoKTsKLSAgICB9Ci0gICAgKnNpZ2ludF90eCA9IE5vbmU7Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2ZhY2FkZV9wcm90by9DYXJnby50b21sIGIvZ2QvcnVzdC9mYWNhZGVfcHJvdG8vQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyNWM2MS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2ZhY2FkZV9wcm90by9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVtwYWNrYWdlXQotbmFtZSA9ICJidF9mYWNhZGVfcHJvdG8iCi12ZXJzaW9uID0gIjAuMC4xIgotZWRpdGlvbiA9ICIyMDE4IgotYnVpbGQgPSAiYnVpbGQucnMiCi0KLVtkZXBlbmRlbmNpZXNdCi1mdXR1cmVzID0gIioiCi1ncnBjaW8gPSAiKiIKLXByb3RvYnVmID0gIioiCi0KLVtidWlsZC1kZXBlbmRlbmNpZXNdCi1wcm90b2MtcnVzdCA9ICIqIgotcHJvdG9jLWdycGNpbyA9ICIqIgotcHJvdG9idWYtY29kZWdlbiA9ICIqIgotCi1bbGliXQotY3JhdGUtdHlwZXMgPSBbInJsaWIiXQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9mYWNhZGVfcHJvdG8vYnVpbGQucnMgYi9nZC9ydXN0L2ZhY2FkZV9wcm90by9idWlsZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5YmM0Yy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2ZhY2FkZV9wcm90by9idWlsZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1leHRlcm4gY3JhdGUgcHJvdG9idWZfY29kZWdlbjsKLWV4dGVybiBjcmF0ZSBwcm90b2NfZ3JwY2lvOwotZXh0ZXJuIGNyYXRlIHByb3RvY19ydXN0OwotCi11c2Ugc3RkOjplbnY7Ci11c2Ugc3RkOjpmczsKLXVzZSBzdGQ6OmlvOjpXcml0ZTsKLXVzZSBzdGQ6OnBhdGg6OntQYXRoLCBQYXRoQnVmfTsKLQotZm4gcGF0aHNfdG9fc3RyczxQOiBBc1JlZjxQYXRoPj4ocGF0aHM6ICZbUF0pIC0+IFZlYzwmc3RyPiB7Ci0gICAgcGF0aHMuaXRlcigpLm1hcCh8cHwgcC5hc19yZWYoKS5hc19vc19zdHIoKS50b19zdHIoKS51bndyYXAoKSkuY29sbGVjdCgpCi19Ci0KLS8vIEdlbmVyYXRlIG1vZC5ycyBmaWxlcyBmb3IgZ2l2ZW4gaW5wdXQgZmlsZXMuCi1mbiBnZW5fbW9kX3JzPFA6IEFzUmVmPFBhdGg+PihvdXRfZGlyOiBQYXRoQnVmLCBpbnB1dHM6ICZbUF0sIGdycGM6IGJvb2wpIHsKLSAgICAvLyBXaWxsIHBhbmljIGlmIGZpbGUgZG9lc24ndCBleGlzdCBvciBpdCBjYW4ndCBjcmVhdGUgaXQKLSAgICBsZXQgbXV0IGYgPSBmczo6RmlsZTo6Y3JlYXRlKG91dF9kaXIuam9pbigibW9kLnJzIikpLnVud3JhcCgpOwotCi0gICAgZi53cml0ZV9hbGwoYiIvLyBHZW5lcmF0ZWQgYnkgYnVpbGQucnNcblxuIikudW53cmFwKCk7Ci0KLSAgICBmb3IgaSBpbiAwLi5pbnB1dHMubGVuKCkgewotICAgICAgICBsZXQgc3RlbSA9IGlucHV0c1tpXS5hc19yZWYoKS5maWxlX3N0ZW0oKS51bndyYXAoKTsKLSAgICAgICAgZi53cml0ZV9hbGwoZm9ybWF0ISgicHViIG1vZCB7fTsgXG4iLCBzdGVtLnRvX3N0cigpLnVud3JhcCgpKS5hc19ieXRlcygpKS51bndyYXAoKTsKLSAgICAgICAgaWYgZ3JwYyB7Ci0gICAgICAgICAgICBmLndyaXRlX2FsbChmb3JtYXQhKCJwdWIgbW9kIHt9X2dycGM7XG4iLCBzdGVtLnRvX3N0cigpLnVud3JhcCgpKS5hc19ieXRlcygpKS51bndyYXAoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotZm4gbWFpbigpIHsKLSAgICBsZXQgb3V0X2RpciA9IFBhdGhCdWY6OmZyb20oZW52Ojp2YXIoIk9VVF9ESVIiKS51bndyYXAoKSk7Ci0gICAgbGV0IHByb3RvX291dF9kaXIgPSBvdXRfZGlyLmpvaW4oInByb3RvX291dCIpOwotICAgIGxldCBncnBjX291dF9kaXIgPSBvdXRfZGlyLmpvaW4oImdycGNfb3V0Iik7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gY3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3JpZXMgYmVmb3JlIHVzaW5nIGl0Ci0gICAgbWF0Y2ggZnM6OmNyZWF0ZV9kaXIocHJvdG9fb3V0X2Rpci5hc19vc19zdHIoKS50b19zdHIoKS51bndyYXAoKSkgewotICAgICAgICBFcnIoZSkgPT4gcHJpbnRsbiEoIlByb3RvIGRpciBmYWlsZWQgdG8gYmUgY3JlYXRlZDoge30iLCBlKSwKLSAgICAgICAgXyA9PiAoKSwKLSAgICB9OwotCi0gICAgbWF0Y2ggZnM6OmNyZWF0ZV9kaXIoZ3JwY19vdXRfZGlyLmFzX29zX3N0cigpLnRvX3N0cigpLnVud3JhcCgpKSB7Ci0gICAgICAgIEVycihlKSA9PiBwcmludGxuISgiR3JwYyBkaXIgZmFpbGVkIHRvIGJlIGNyZWF0ZWQ6IHt9IiwgZSksCi0gICAgICAgIF8gPT4gKCksCi0gICAgfQotCi0gICAgLy8gUHJvdG8gcm9vdCBpcyAvL3BsYXRmb3JtMi9idC9nZAotICAgIGxldCBwcm90b19yb290ID0gbWF0Y2ggZW52Ojp2YXIoIlBMQVRGT1JNX1NVQkRJUiIpIHsKLSAgICAgICAgT2soZGlyKSA9PiBQYXRoQnVmOjpmcm9tKGRpcikuam9pbigiYnQvZ2QiKSwKLSAgICAgICAgLy8gQ3VycmVudGx5IGF0IC8vcGxhdGZvcm0yL2dkL3J1c3QvZmFjYWRlX3Byb3RvCi0gICAgICAgIEVycihfKSA9PiBQYXRoQnVmOjpmcm9tKGVudjo6Y3VycmVudF9kaXIoKS51bndyYXAoKSkuam9pbigiLi4vLi4iKS5jYW5vbmljYWxpemUoKS51bndyYXAoKSwKLSAgICB9OwotCi0gICAgLy8KLSAgICAvLyBHZW5lcmF0ZSBwcm90b2J1ZiBvdXRwdXQKLSAgICAvLwotICAgIGxldCBmYWNhZGVfZGlyID0gcHJvdG9fcm9vdC5qb2luKCJmYWNhZGUiKTsKLSAgICBsZXQgcHJvdG9faW5wdXRfZmlsZXMgPSBbZmFjYWRlX2Rpci5qb2luKCJjb21tb24ucHJvdG8iKV07Ci0gICAgbGV0IHByb3RvX2luY2x1ZGVfZGlycyA9IFtmYWNhZGVfZGlyXTsKLQotICAgIHByb3RvY19ydXN0OjpDb2RlZ2VuOjpuZXcoKQotICAgICAgICAub3V0X2Rpcihwcm90b19vdXRfZGlyLmFzX29zX3N0cigpLnRvX3N0cigpLnVud3JhcCgpKQotICAgICAgICAuaW5wdXRzKCZwYXRoc190b19zdHJzKCZwcm90b19pbnB1dF9maWxlcykpCi0gICAgICAgIC5pbmNsdWRlcygmcGF0aHNfdG9fc3RycygmcHJvdG9faW5jbHVkZV9kaXJzKSkKLSAgICAgICAgLmN1c3RvbWl6ZShEZWZhdWx0OjpkZWZhdWx0KCkpCi0gICAgICAgIC5ydW4oKQotICAgICAgICAuZXhwZWN0KCJwcm90b2MiKTsKLQotICAgIC8vCi0gICAgLy8gR2VuZXJhdGUgZ3JwYyBvdXRwdXQKLSAgICAvLwotICAgIGxldCBncnBjX3Byb3RvX2lucHV0X2ZpbGVzID0gWwotICAgICAgICBwcm90b19yb290LmpvaW4oImhjaS9mYWNhZGUvaGNpX2ZhY2FkZS5wcm90byIpLAotICAgICAgICBwcm90b19yb290LmpvaW4oImhjaS9mYWNhZGUvY29udHJvbGxlcl9mYWNhZGUucHJvdG8iKSwKLSAgICAgICAgcHJvdG9fcm9vdC5qb2luKCJoYWwvaGFsX2ZhY2FkZS5wcm90byIpLAotICAgICAgICBwcm90b19yb290LmpvaW4oImZhY2FkZS9yb290c2VydmljZS5wcm90byIpLAotICAgIF07Ci0gICAgbGV0IGdycGNfcHJvdG9faW5jbHVkZV9kaXJzID0gWwotICAgICAgICBwcm90b19yb290LmpvaW4oImhjaS9mYWNhZGUiKSwKLSAgICAgICAgcHJvdG9fcm9vdC5qb2luKCJoYWwiKSwKLSAgICAgICAgcHJvdG9fcm9vdC5qb2luKCJmYWNhZGUiKSwKLSAgICAgICAgcHJvdG9fcm9vdCwKLSAgICBdOwotCi0gICAgcHJvdG9jX2dycGNpbzo6Y29tcGlsZV9ncnBjX3Byb3RvcygKLSAgICAgICAgJmdycGNfcHJvdG9faW5wdXRfZmlsZXMsCi0gICAgICAgICZncnBjX3Byb3RvX2luY2x1ZGVfZGlycywKLSAgICAgICAgJmdycGNfb3V0X2RpciwKLSAgICAgICAgTm9uZSwKLSAgICApCi0gICAgLmV4cGVjdCgiRmFpbGVkIHRvIGNvbXBpbGUgZ1JQQyBkZWZpbml0aW9ucyIpOwotCi0gICAgZ2VuX21vZF9ycyhwcm90b19vdXRfZGlyLCAmcHJvdG9faW5wdXRfZmlsZXMsIGZhbHNlKTsKLSAgICBnZW5fbW9kX3JzKGdycGNfb3V0X2RpciwgJmdycGNfcHJvdG9faW5wdXRfZmlsZXMsIHRydWUpOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9mYWNhZGVfcHJvdG8vc3JjL2NvbW1vbi5ycyBiL2dkL3J1c3QvZmFjYWRlX3Byb3RvL3NyYy9jb21tb24ucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYTZmNzYuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9mYWNhZGVfcHJvdG8vc3JjL2NvbW1vbi5ycworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIFdlIGFyZSBub3QgZGlyZWN0bHkgaW5jbHVkaW5nIGR1ZSB0byBidWdzIHdpdGggaW5uZXIgYW5kIG91dGVyIGF0dHJpYnV0ZXMuCi0vL2luY2x1ZGUhKGNvbmNhdCEoZW52ISgiT1VUX0RJUiIpLCAiL2NvbW1vbi5ycyIpKTsKLQotI1twYXRoID0gY29uY2F0IShlbnYhKCJPVVRfRElSIiwgIi9jb21tb24ucnMiKSldCi1wdWIgbW9kIGNvbW1vbjsKZGlmZiAtLWdpdCBhL2dkL3J1c3QvZmFjYWRlX3Byb3RvL3NyYy9saWIucnMgYi9nZC9ydXN0L2ZhY2FkZV9wcm90by9zcmMvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY3ZjcwLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZmFjYWRlX3Byb3RvL3NyYy9saWIucnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBwcm90b2MtcnVzdCBhbmQgcHJvdG9jLWdycGNpbyBnZW5lcmF0ZXMgYWxsIG1vZHVsZXMgYW5kIGV4cG9ydHMgdGhlbSBpbiBtb2QucnMKLS8vIFdlIGhhdmUgdG8gaW5jbHVkZSB0aGVtIGFsbCBoZXJlIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgZm9yIGNyYXRlIGV4cG9ydC4KLWluY2x1ZGUhKGNvbmNhdCEoZW52ISgiT1VUX0RJUiIpLCAiL3Byb3RvX291dC9tb2QucnMiKSk7Ci1pbmNsdWRlIShjb25jYXQhKGVudiEoIk9VVF9ESVIiKSwgIi9ncnBjX291dC9tb2QucnMiKSk7Ci0KLS8vIGVtcHR5LnByb3RvIGlzIG1pc3Npbmcgc28gYWRkIGEgd29ya2Fyb3VuZAotLy8gU2VlIGdpdGh1Yi5jb20vc3RlcGFuY2hlZy9ncnBjLXJ1c3QvaXNzdWVzLzE1NgotcHViIG1vZCBlbXB0eSB7Ci0gICAgcHViIHVzZSBwcm90b2J1Zjo6d2VsbF9rbm93bl90eXBlczo6RW1wdHk7Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2dkZGkvQW5kcm9pZC5icCBiL2dkL3J1c3QvZ2RkaS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk4MzdmLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZ2RkaS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotcnVzdF9saWJyYXJ5IHsKLSAgICBuYW1lOiAibGliZ2RkaSIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfcnVzdF9kZWZhdWx0cyJdLAotICAgIGNyYXRlX25hbWU6ICJnZGRpIiwKLSAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKLSAgICBlZGl0aW9uOiAiMjAxOCIsCi0gICAgcHJvY19tYWNyb3M6IFsibGliZ2RkaV9tYWNyb3MiXSwKLSAgICBydXN0bGliczogWyJsaWJ0b2tpbyJdLAotfQotCi1ydXN0X3Byb2NfbWFjcm8gewotICAgIG5hbWU6ICJsaWJnZGRpX21hY3JvcyIsCi0gICAgY3JhdGVfbmFtZTogImdkZGlfbWFjcm9zIiwKLSAgICBzcmNzOiBbIm1hY3Jvcy9saWIucnMiXSwKLSAgICBlZGl0aW9uOiAiMjAxOCIsCi0gICAgcnVzdGxpYnM6IFsKLSAgICAgICAgImxpYnByb2NfbWFjcm8yIiwKLSAgICAgICAgImxpYnF1b3RlIiwKLSAgICAgICAgImxpYnN5biIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvZ2RkaS9DYXJnby50b21sIGIvZ2QvcnVzdC9nZGRpL0NhcmdvLnRvbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDNhMTQuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9nZGRpL0NhcmdvLnRvbWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotW3BhY2thZ2VdCi1uYW1lID0gImdkZGkiCi12ZXJzaW9uID0gIjAuMC4xIgotZWRpdGlvbiA9ICIyMDE4IgotCi1bZGVwZW5kZW5jaWVzXQotZ2RkaV9tYWNyb3MgPSB7IHBhdGggPSAibWFjcm9zIiB9Ci0KLXRva2lvID0geyB2ZXJzaW9uID0gIioiLCBmZWF0dXJlcyA9IFsnYnl0ZXMnLCAnbmV0JywgJ3N5bmMnXSB9Ci1xdW90ZSA9ICIqIgotc3luID0geyB2ZXJzaW9uID0gIioiLCBmZWF0dXJlcyA9IFsnZGVmYXVsdCcsICdmdWxsJ10gfQotCi1bbGliXQotcGF0aCA9ICJzcmMvbGliLnJzIgotY3JhdGUtdHlwZSA9IFsicmxpYiJdCi0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvZ2RkaS9tYWNyb3MvQ2FyZ28udG9tbCBiL2dkL3J1c3QvZ2RkaS9tYWNyb3MvQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzOGIwYy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2dkZGkvbWFjcm9zL0NhcmdvLnRvbWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotW3BhY2thZ2VdCi1uYW1lID0gImdkZGlfbWFjcm9zIgotdmVyc2lvbiA9ICIwLjAuMSIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2RlcGVuZGVuY2llc10KLXByb2MtbWFjcm8yID0gIioiCi1xdW90ZSA9ICIqIgotc3luID0gIioiCi0KLVtsaWJdCi1wcm9jLW1hY3JvID0gdHJ1ZQotcGF0aCA9ICJsaWIucnMiCmRpZmYgLS1naXQgYS9nZC9ydXN0L2dkZGkvbWFjcm9zL2xpYi5ycyBiL2dkL3J1c3QvZ2RkaS9tYWNyb3MvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTc2MTM4Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZ2RkaS9tYWNyb3MvbGliLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8vISBDb3JlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG1hY3JvcwotCi1leHRlcm4gY3JhdGUgcHJvY19tYWNybzsKLXVzZSBwcm9jX21hY3JvOjpUb2tlblN0cmVhbTsKLXVzZSBxdW90ZTo6e2Zvcm1hdF9pZGVudCwgcXVvdGV9OwotdXNlIHN5bjo6cGFyc2U6OntQYXJzZSwgUGFyc2VTdHJlYW0sIFJlc3VsdH07Ci11c2Ugc3luOjpwdW5jdHVhdGVkOjpQdW5jdHVhdGVkOwotdXNlIHN5bjo6ewotICAgIGJyYWNlZCwgcGFyc2UsIHBhcnNlX21hY3JvX2lucHV0LCBEZXJpdmVJbnB1dCwgRmllbGRzLCBGbkFyZywgSWRlbnQsIEl0ZW1GbiwgSXRlbVN0cnVjdCwgUGF0aCwKLSAgICBUb2tlbiwgVHlwZSwKLX07Ci0KLS8vLyBEZWZpbmVzIGEgcHJvdmlkZXIgZnVuY3Rpb24sIHdpdGggZ2VuZXJhdGVkIGhlbHBlciB0aGF0IGltcGxpY2l0bHkgZmV0Y2hlcyBhcmd1bWVudCBpbnN0YW5jZXMgZnJvbSB0aGUgcmVnaXN0cnkKLSNbcHJvY19tYWNyb19hdHRyaWJ1dGVdCi1wdWIgZm4gcHJvdmlkZXMoX2F0dHI6IFRva2VuU3RyZWFtLCBpdGVtOiBUb2tlblN0cmVhbSkgLT4gVG9rZW5TdHJlYW0gewotICAgIGxldCBmdW5jdGlvbjogSXRlbUZuID0gcGFyc2UoaXRlbSkuZXhwZWN0KCJjYW4gb25seSBiZSBhcHBsaWVkIHRvIGZ1bmN0aW9ucyIpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBpbmZvIG5lZWRlZCB0byByZWZlciB0byB0aGUgZnVuY3Rpb24gJiB0aGUgaW5qZWN0ZWQgdmVyc2lvbiB3ZSBnZW5lcmF0ZQotICAgIGxldCBpZGVudCA9IGZ1bmN0aW9uLnNpZy5pZGVudC5jbG9uZSgpOwotICAgIGxldCBpbmplY3RlZF9pZGVudCA9IGZvcm1hdF9pZGVudCEoIl9fZ2RkaV97fV9pbmplY3RlZCIsIGlkZW50KTsKLQotICAgIC8vIENyZWF0ZSB0aGUgaW5mbyBuZWVkZWQgdG8gZ2VuZXJhdGUgdGhlIGNhbGwgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCi0gICAgbGV0IGlucHV0cyA9IGZ1bmN0aW9uLnNpZy5pbnB1dHMuaXRlcigpLm1hcCh8YXJnfCB7Ci0gICAgICAgIGlmIGxldCBGbkFyZzo6VHlwZWQodCkgPSBhcmcgewotICAgICAgICAgICAgcmV0dXJuIHQudHkuY2xvbmUoKTsKLSAgICAgICAgfQotICAgICAgICBwYW5pYyEoImNhbid0IGJlIGFwcGxpZWQgdG8gc3RydWN0IG1ldGhvZHMiKTsKLSAgICB9KTsKLSAgICBsZXQgbG9jYWxfdmFyX2lkZW50cyA9ICgwLi5pbnB1dHMubGVuKCkpLm1hcCh8aXwgZm9ybWF0X2lkZW50ISgiX19pbnB1dHt9IiwgaSkpOwotICAgIGxldCBsb2NhbF92YXJfaWRlbnRzX2Zvcl9jYWxsID0gbG9jYWxfdmFyX2lkZW50cy5jbG9uZSgpOwotCi0gICAgbGV0IGVtaXR0ZWRfY29kZSA9IHF1b3RlISB7Ci0gICAgICAgIC8vIEluamVjdGluZyB3cmFwcGVyCi0gICAgICAgIGZuICNpbmplY3RlZF9pZGVudChyZWdpc3RyeTogc3RkOjpzeW5jOjpBcmM8Z2RkaTo6UmVnaXN0cnk+KSAtPiBzdGQ6OnBpbjo6UGluPGdkZGk6OlByb3ZpZGVyRnV0dXJlQm94PiB7Ci0gICAgICAgICAgICBCb3g6OnBpbihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBsb2NhbCB2YXJpYWJsZSBmb3IgZWFjaCBhcmd1bWVudCwgdG8gZW5zdXJlIHRoZXkgZ2V0IGdlbmVyYXRlZCBpbiBhCi0gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBvcmRlciAoY29tcGlsZXIgY29tcGxhaW5zIG90aGVyd2lzZSkKLSAgICAgICAgICAgICAgICAjKGxldCAjbG9jYWxfdmFyX2lkZW50cyA9IHJlZ2lzdHJ5LmdldDo6PCNpbnB1dHM+KCkuYXdhaXQ7KSoKLQotICAgICAgICAgICAgICAgIC8vIEFjdHVhbGx5IGNhbGwgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgQm94OjpuZXcoI2lkZW50KCMoI2xvY2FsX3Zhcl9pZGVudHNfZm9yX2NhbGwpLCopLmF3YWl0KSBhcyBCb3g8ZHluIHN0ZDo6YW55OjpBbnk+Ci0gICAgICAgICAgICB9KQotICAgICAgICB9Ci0gICAgICAgICNmdW5jdGlvbgotICAgIH07Ci0gICAgZW1pdHRlZF9jb2RlLmludG8oKQotfQotCi1zdHJ1Y3QgTW9kdWxlRGVmIHsKLSAgICBuYW1lOiBJZGVudCwKLSAgICBwcm92aWRlcnM6IFB1bmN0dWF0ZWQ8UHJvdmlkZXJEZWYsIFRva2VuIVssXT4sCi0gICAgc3VibW9kdWxlczogUHVuY3R1YXRlZDxQYXRoLCBUb2tlbiFbLF0+LAotfQotCi1lbnVtIE1vZHVsZUVudHJ5IHsKLSAgICBQcm92aWRlcnMoUHVuY3R1YXRlZDxQcm92aWRlckRlZiwgVG9rZW4hWyxdPiksCi0gICAgU3VibW9kdWxlcyhQdW5jdHVhdGVkPFBhdGgsIFRva2VuIVssXT4pLAotfQotCi1zdHJ1Y3QgUHJvdmlkZXJEZWYgewotICAgIHR5OiBUeXBlLAotICAgIGlkZW50OiBJZGVudCwKLSAgICBwYXJ0czogYm9vbCwKLX0KLQotaW1wbCBQYXJzZSBmb3IgTW9kdWxlRGVmIHsKLSAgICBmbiBwYXJzZShpbnB1dDogUGFyc2VTdHJlYW0pIC0+IFJlc3VsdDxTZWxmPiB7Ci0gICAgICAgIC8vIGZpcnN0IHRoaW5nIGlzIHRoZSBtb2R1bGUgbmFtZSBmb2xsb3dlZCBieSBhIGNvbW1hCi0gICAgICAgIGxldCBuYW1lID0gaW5wdXQucGFyc2UoKT87Ci0gICAgICAgIGlucHV0LnBhcnNlOjo8VG9rZW4hWyxdPigpPzsKLSAgICAgICAgLy8gVGhlbiBjb21lcyBzdWJtb2R1bGVzIG9yIHByb3ZpZGVyIHNlY3Rpb25zLCBpbiBhbnkgb3JkZXIKLSAgICAgICAgbGV0IGVudHJpZXM6IFB1bmN0dWF0ZWQ8TW9kdWxlRW50cnksIFRva2VuIVssXT4gPSBQdW5jdHVhdGVkOjpwYXJzZV90ZXJtaW5hdGVkKGlucHV0KT87Ci0gICAgICAgIGxldCBtdXQgcHJvdmlkZXJzID0gUHVuY3R1YXRlZDo6bmV3KCk7Ci0gICAgICAgIGxldCBtdXQgc3VibW9kdWxlcyA9IFB1bmN0dWF0ZWQ6Om5ldygpOwotICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllcy5pbnRvX2l0ZXIoKSB7Ci0gICAgICAgICAgICBtYXRjaCBlbnRyeSB7Ci0gICAgICAgICAgICAgICAgTW9kdWxlRW50cnk6OlByb3ZpZGVycyh2YWx1ZSkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiAhcHJvdmlkZXJzLmlzX2VtcHR5KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJwcm92aWRlcnMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1vZHVsZUVudHJ5OjpTdWJtb2R1bGVzKHZhbHVlKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICFzdWJtb2R1bGVzLmlzX2VtcHR5KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJzdWJtb2R1bGVzIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZXMgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgT2soTW9kdWxlRGVmIHsgbmFtZSwgcHJvdmlkZXJzLCBzdWJtb2R1bGVzIH0pCi0gICAgfQotfQotCi1pbXBsIFBhcnNlIGZvciBQcm92aWRlckRlZiB7Ci0gICAgZm4gcGFyc2UoaW5wdXQ6IFBhcnNlU3RyZWFtKSAtPiBSZXN1bHQ8U2VsZj4gewotICAgICAgICBsZXQgcGFydHMgPSBpbnB1dC5wZWVrMyhUb2tlbiFbPT5dKTsKLSAgICAgICAgaWYgcGFydHMgewotICAgICAgICAgICAgbWF0Y2ggaW5wdXQucGFyc2U6OjxJZGVudD4oKT8udG9fc3RyaW5nKCkuYXNfc3RyKCkgewotICAgICAgICAgICAgICAgICJwYXJ0cyIgPT4ge30KLSAgICAgICAgICAgICAgICBrZXl3b3JkID0+IHBhbmljISgiZXhwZWN0ZWQgJ3BhcnRzJywgZ290ICd7fSciLCBrZXl3b3JkKSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEEgcHJvdmlkZXIgZGVmaW5pdGlvbiBmb2xsb3dzIHRoaXMgZm9ybWF0OiA8VHlwZT4gLT4gPGZ1bmN0aW9uIG5hbWU+Ci0gICAgICAgIGxldCB0eSA9IGlucHV0LnBhcnNlKCk/OwotICAgICAgICBpbnB1dC5wYXJzZTo6PFRva2VuIVs9Pl0+KCk/OwotICAgICAgICBsZXQgaWRlbnQgPSBpbnB1dC5wYXJzZSgpPzsKLSAgICAgICAgT2soUHJvdmlkZXJEZWYgeyB0eSwgaWRlbnQsIHBhcnRzIH0pCi0gICAgfQotfQotCi1pbXBsIFBhcnNlIGZvciBNb2R1bGVFbnRyeSB7Ci0gICAgZm4gcGFyc2UoaW5wdXQ6IFBhcnNlU3RyZWFtKSAtPiBSZXN1bHQ8U2VsZj4gewotICAgICAgICBtYXRjaCBpbnB1dC5wYXJzZTo6PElkZW50PigpPy50b19zdHJpbmcoKS5hc19zdHIoKSB7Ci0gICAgICAgICAgICAicHJvdmlkZXJzIiA9PiB7Ci0gICAgICAgICAgICAgICAgbGV0IGVudHJpZXM7Ci0gICAgICAgICAgICAgICAgYnJhY2VkIShlbnRyaWVzIGluIGlucHV0KTsKLSAgICAgICAgICAgICAgICBPayhNb2R1bGVFbnRyeTo6UHJvdmlkZXJzKGVudHJpZXMucGFyc2VfdGVybWluYXRlZChQcm92aWRlckRlZjo6cGFyc2UpPykpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAic3VibW9kdWxlcyIgPT4gewotICAgICAgICAgICAgICAgIGxldCBlbnRyaWVzOwotICAgICAgICAgICAgICAgIGJyYWNlZCEoZW50cmllcyBpbiBpbnB1dCk7Ci0gICAgICAgICAgICAgICAgT2soTW9kdWxlRW50cnk6OlN1Ym1vZHVsZXMoZW50cmllcy5wYXJzZV90ZXJtaW5hdGVkKFBhdGg6OnBhcnNlKT8pKQotICAgICAgICAgICAgfQotICAgICAgICAgICAga2V5d29yZCA9PiB7Ci0gICAgICAgICAgICAgICAgcGFuaWMhKCJ1bmV4cGVjdGVkIGtleXdvcmQ6IHt9Iiwga2V5d29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vLyBFbWl0cyBhIG1vZHVsZSBmdW5jdGlvbiB0aGF0IHJlZ2lzdGVycyBzdWJtb2R1bGVzICYgcHJvdmlkZXJzIHdpdGggdGhlIHJlZ2lzdHJ5Ci0jW3Byb2NfbWFjcm9dCi1wdWIgZm4gbW9kdWxlKGl0ZW06IFRva2VuU3RyZWFtKSAtPiBUb2tlblN0cmVhbSB7Ci0gICAgbGV0IG1vZHVsZSA9IHBhcnNlX21hY3JvX2lucHV0IShpdGVtIGFzIE1vZHVsZURlZik7Ci0gICAgbGV0IGluaXRfaWRlbnQgPSBtb2R1bGUubmFtZS5jbG9uZSgpOwotICAgIGxldCBwcm92aWRlcnMgPSBtb2R1bGUucHJvdmlkZXJzLml0ZXIoKTsKLSAgICBsZXQgdHlwZXMgPSBwcm92aWRlcnMuY2xvbmUoKS5tYXAofHB8IHAudHkuY2xvbmUoKSk7Ci0gICAgbGV0IHByb3ZpZGVyX2lkZW50cyA9Ci0gICAgICAgIHByb3ZpZGVycy5jbG9uZSgpLm1hcCh8cHwgZm9ybWF0X2lkZW50ISgiX19nZGRpX3t9X2luamVjdGVkIiwgcC5pZGVudC5jbG9uZSgpKSk7Ci0gICAgbGV0IHBhcnRpbmdfZnVuY3Rpb25zID0gcHJvdmlkZXJzLmZpbHRlcl9tYXAofHB8IG1hdGNoICZwLnR5IHsKLSAgICAgICAgVHlwZTo6UGF0aCh0eSkgaWYgcC5wYXJ0cyA9PiBTb21lKGZvcm1hdF9pZGVudCEoCi0gICAgICAgICAgICAiX19nZGRpX3BhcnRfb3V0X3t9IiwKLSAgICAgICAgICAgIHR5LnBhdGguZ2V0X2lkZW50KCkudW53cmFwKCkudG9fc3RyaW5nKCkudG9fbG93ZXJjYXNlKCkKLSAgICAgICAgKSksCi0gICAgICAgIF8gPT4gTm9uZSwKLSAgICB9KTsKLSAgICBsZXQgc3VibW9kdWxlX2lkZW50cyA9IG1vZHVsZS5zdWJtb2R1bGVzLml0ZXIoKTsKLSAgICBsZXQgZW1pdHRlZF9jb2RlID0gcXVvdGUhIHsKLSAgICAgICAgI1tkb2MoaGlkZGVuKV0KLSAgICAgICAgI1thbGxvdyhtaXNzaW5nX2RvY3MpXQotICAgICAgICBwdWIgZm4gI2luaXRfaWRlbnQoYnVpbGRlcjogZ2RkaTo6UmVnaXN0cnlCdWlsZGVyKSAtPiBnZGRpOjpSZWdpc3RyeUJ1aWxkZXIgewotICAgICAgICAgICAgLy8gUmVnaXN0ZXIgYWxsIHByb3ZpZGVycyBvbiB0aGlzIG1vZHVsZQotICAgICAgICAgICAgbGV0IHJldCA9IGJ1aWxkZXIjKC5yZWdpc3Rlcl9wcm92aWRlcjo6PCN0eXBlcz4oQm94OjpuZXcoI3Byb3ZpZGVyX2lkZW50cykpKSoKLSAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGFsbCBzdWJtb2R1bGVzIG9uIHRoaXMgbW9kdWxlCi0gICAgICAgICAgICAjKC5yZWdpc3Rlcl9tb2R1bGUoI3N1Ym1vZHVsZV9pZGVudHMpKSo7Ci0KLSAgICAgICAgICAgICMobGV0IHJldCA9ICNwYXJ0aW5nX2Z1bmN0aW9ucyhyZXQpOykqCi0KLSAgICAgICAgICAgIHJldAotICAgICAgICB9Ci0gICAgfTsKLSAgICBlbWl0dGVkX2NvZGUuaW50bygpCi19Ci0KLS8vLyBFbWl0cyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIFN0b3BwYWJsZSB0aGF0IGRvZXMgbm90aGluZzsKLSNbcHJvY19tYWNyb19kZXJpdmUoU3RvcHBhYmxlKV0KLXB1YiBmbiBkZXJpdmVfbm9wX3N0b3AoaXRlbTogVG9rZW5TdHJlYW0pIC0+IFRva2VuU3RyZWFtIHsKLSAgICBsZXQgaW5wdXQgPSBwYXJzZV9tYWNyb19pbnB1dCEoaXRlbSBhcyBEZXJpdmVJbnB1dCk7Ci0gICAgbGV0IGlkZW50ID0gaW5wdXQuaWRlbnQ7Ci0gICAgbGV0IGVtaXR0ZWRfY29kZSA9IHF1b3RlISB7Ci0gICAgICAgIGltcGwgZ2RkaTo6U3RvcHBhYmxlIGZvciAjaWRlbnQge30KLSAgICB9OwotICAgIGVtaXR0ZWRfY29kZS5pbnRvKCkKLX0KLQotLy8vIEdlbmVyYXRlcyB0aGUgY29kZSBuZWNlc3NhcnkgdG8gc3BsaXQgdXAgYSB0eXBlIGludG8gaXRzIGNvbXBvbmVudHMKLSNbcHJvY19tYWNyb19hdHRyaWJ1dGVdCi1wdWIgZm4gcGFydF9vdXQoX2F0dHI6IFRva2VuU3RyZWFtLCBpdGVtOiBUb2tlblN0cmVhbSkgLT4gVG9rZW5TdHJlYW0gewotICAgIGxldCBzdHJ1Y3RfOiBJdGVtU3RydWN0ID0gcGFyc2UoaXRlbSkuZXhwZWN0KCJjYW4gb25seSBiZSBhcHBsaWVkIHRvIHN0cnVjdCBkZWZpbml0aW9ucyIpOwotICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBzdHJ1Y3RfLmlkZW50LmNsb25lKCk7Ci0gICAgbGV0IGZpZWxkcyA9IG1hdGNoIHN0cnVjdF8uZmllbGRzLmNsb25lKCkgewotICAgICAgICBGaWVsZHM6Ok5hbWVkKGYpID0+IGYsCi0gICAgICAgIF8gPT4gcGFuaWMhKCJjYW4gb25seSBiZSBhcHBsaWVkIHRvIHN0cnVjdHMgd2l0aCBuYW1lZCBmaWVsZHMiKSwKLSAgICB9Ci0gICAgLm5hbWVkOwotCi0gICAgbGV0IGZpZWxkX25hbWVzID0gZmllbGRzLml0ZXIoKS5tYXAofGZ8IGYuaWRlbnQuY2xvbmUoKS5leHBlY3QoImZpZWxkIHdpdGhvdXQgYSBuYW1lIikpOwotICAgIGxldCBmaWVsZF90eXBlcyA9IGZpZWxkcy5pdGVyKCkubWFwKHxmfCBmLnR5LmNsb25lKCkpOwotCi0gICAgbGV0IGZuX2lkZW50ID0gZm9ybWF0X2lkZW50ISgiX19nZGRpX3BhcnRfb3V0X3t9Iiwgc3RydWN0X2lkZW50LnRvX3N0cmluZygpLnRvX2xvd2VyY2FzZSgpKTsKLQotICAgIGxldCBlbWl0dGVkX2NvZGUgPSBxdW90ZSEgewotICAgICAgICAjc3RydWN0XwotCi0gICAgICAgIGZuICNmbl9pZGVudChidWlsZGVyOiBnZGRpOjpSZWdpc3RyeUJ1aWxkZXIpIC0+IGdkZGk6OlJlZ2lzdHJ5QnVpbGRlciB7Ci0gICAgICAgICAgICBidWlsZGVyIygucmVnaXN0ZXJfcHJvdmlkZXI6OjwjZmllbGRfdHlwZXM+KEJveDo6bmV3KAotICAgICAgICAgICAgICAgIHxyZWdpc3RyeTogc3RkOjpzeW5jOjpBcmM8Z2RkaTo6UmVnaXN0cnk+fCAtPiBzdGQ6OnBpbjo6UGluPGdkZGk6OlByb3ZpZGVyRnV0dXJlQm94PiB7Ci0gICAgICAgICAgICAgICAgICAgIEJveDo6cGluKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgICAgICAgICAgICAgQm94OjpuZXcoYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkuZ2V0Ojo8I3N0cnVjdF9pZGVudD4oKS5hd2FpdC4jZmllbGRfbmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIH0uYXdhaXQpIGFzIEJveDxkeW4gc3RkOjphbnk6OkFueT4KLSAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICB9KSkpKgotICAgICAgICB9Ci0gICAgfTsKLSAgICBlbWl0dGVkX2NvZGUuaW50bygpCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2dkZGkvc3JjL2xpYi5ycyBiL2dkL3J1c3QvZ2RkaS9zcmMvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTAwNTQzLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvZ2RkaS9zcmMvbGliLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vISBDb3JlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9iamVjdHMKLQotdXNlIHN0ZDo6YW55Ojp7QW55LCBUeXBlSWR9OwotdXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Ci11c2Ugc3RkOjpmdXR1cmU6OkZ1dHVyZTsKLXVzZSBzdGQ6OnBpbjo6UGluOwotdXNlIHN0ZDo6c3luYzo6QXJjOwotdXNlIHRva2lvOjpzeW5jOjpNdXRleDsKLQotcHViIHVzZSBnZGRpX21hY3Jvczo6e21vZHVsZSwgcGFydF9vdXQsIHByb3ZpZGVzLCBTdG9wcGFibGV9OwotCi10eXBlIEluc3RhbmNlQm94ID0gQm94PGR5biBBbnkgKyBTZW5kICsgU3luYz47Ci0vLy8gQSBib3ggYXJvdW5kIGEgZnV0dXJlIGZvciBhIHByb3ZpZGVyIHRoYXQgaXMgc2FmZSB0byBzZW5kIGJldHdlZW4gdGhyZWFkcwotcHViIHR5cGUgUHJvdmlkZXJGdXR1cmVCb3ggPSBCb3g8ZHluIEZ1dHVyZTxPdXRwdXQgPSBCb3g8ZHluIEFueT4+ICsgU2VuZCArIFN5bmM+OwotdHlwZSBQcm92aWRlckZuQm94ID0gQm94PGR5biBGbihBcmM8UmVnaXN0cnk+KSAtPiBQaW48UHJvdmlkZXJGdXR1cmVCb3g+ICsgU2VuZCArIFN5bmM+OwotCi0vLy8gQ2FsbGVkIHRvIHN0b3AgYW4gaW5qZWN0ZWQgb2JqZWN0Ci1wdWIgdHJhaXQgU3RvcHBhYmxlIHsKLSAgICAvLy8gU3RvcCBhbmQgY2xvc2UgYWxsIHJlc291cmNlcwotICAgIGZuIHN0b3AoJnNlbGYpIHt9Ci19Ci0KLS8vLyBCdWlsZGVyIGZvciBSZWdpc3RyeQotcHViIHN0cnVjdCBSZWdpc3RyeUJ1aWxkZXIgewotICAgIHByb3ZpZGVyczogSGFzaE1hcDxUeXBlSWQsIFByb3ZpZGVyPiwKLX0KLQotLy8vIEtlZXBzIHRyYWNrIG9mIGNlbnRyYWwgaW5qZWN0aW9uIHN0YXRlCi1wdWIgc3RydWN0IFJlZ2lzdHJ5IHsKLSAgICBwcm92aWRlcnM6IEFyYzxNdXRleDxIYXNoTWFwPFR5cGVJZCwgUHJvdmlkZXI+Pj4sCi0gICAgaW5zdGFuY2VzOiBBcmM8TXV0ZXg8SGFzaE1hcDxUeXBlSWQsIEluc3RhbmNlQm94Pj4+LAotICAgIHN0YXJ0X29yZGVyOiBBcmM8TXV0ZXg8VmVjPEJveDxkeW4gU3RvcHBhYmxlICsgU2VuZCArIFN5bmM+Pj4+LAotfQotCi0jW2Rlcml2ZShDbG9uZSldCi1zdHJ1Y3QgUHJvdmlkZXIgewotICAgIGY6IEFyYzxQcm92aWRlckZuQm94PiwKLX0KLQotaW1wbCBEZWZhdWx0IGZvciBSZWdpc3RyeUJ1aWxkZXIgewotICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZjo6bmV3KCkKLSAgICB9Ci19Ci0KLWltcGwgUmVnaXN0cnlCdWlsZGVyIHsKLSAgICAvLy8gQ3JlYXRlcyBhIG5ldyBSZWdpc3RyeUJ1aWxkZXIKLSAgICBwdWIgZm4gbmV3KCkgLT4gU2VsZiB7Ci0gICAgICAgIFJlZ2lzdHJ5QnVpbGRlciB7IHByb3ZpZGVyczogSGFzaE1hcDo6bmV3KCkgfQotICAgIH0KLQotICAgIC8vLyBSZWdpc3RlcnMgYSBtb2R1bGUgd2l0aCB0aGlzIHJlZ2lzdHJ5Ci0gICAgcHViIGZuIHJlZ2lzdGVyX21vZHVsZTxGPihzZWxmLCBpbml0OiBGKSAtPiBTZWxmCi0gICAgd2hlcmUKLSAgICAgICAgRjogRm4oU2VsZikgLT4gU2VsZiwKLSAgICB7Ci0gICAgICAgIGluaXQoc2VsZikKLSAgICB9Ci0KLSAgICAvLy8gUmVnaXN0ZXJzIGEgcHJvdmlkZXIgZnVuY3Rpb24gd2l0aCB0aGlzIHJlZ2lzdHJ5Ci0gICAgcHViIGZuIHJlZ2lzdGVyX3Byb3ZpZGVyPFQ6ICdzdGF0aWM+KG11dCBzZWxmLCBmOiBQcm92aWRlckZuQm94KSAtPiBTZWxmIHsKLSAgICAgICAgc2VsZi5wcm92aWRlcnMuaW5zZXJ0KFR5cGVJZDo6b2Y6OjxUPigpLCBQcm92aWRlciB7IGY6IEFyYzo6bmV3KGYpIH0pOwotCi0gICAgICAgIHNlbGYKLSAgICB9Ci0KLSAgICAvLy8gQ29uc3RydWN0IHRoZSBSZWdpc3RyeSBmcm9tIHRoaXMgYnVpbGRlcgotICAgIHB1YiBmbiBidWlsZChzZWxmKSAtPiBSZWdpc3RyeSB7Ci0gICAgICAgIFJlZ2lzdHJ5IHsKLSAgICAgICAgICAgIHByb3ZpZGVyczogQXJjOjpuZXcoTXV0ZXg6Om5ldyhzZWxmLnByb3ZpZGVycykpLAotICAgICAgICAgICAgaW5zdGFuY2VzOiBBcmM6Om5ldyhNdXRleDo6bmV3KEhhc2hNYXA6Om5ldygpKSksCi0gICAgICAgICAgICBzdGFydF9vcmRlcjogQXJjOjpuZXcoTXV0ZXg6Om5ldyhWZWM6Om5ldygpKSksCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWltcGwgUmVnaXN0cnkgewotICAgIC8vLyBHZXRzIGFuIGluc3RhbmNlIG9mIGEgdHlwZSwgaW1wbGljaXRseSBzdGFydGluZyBhbnkgZGVwZW5kZW5jaWVzIGlmIG5lY2Vzc2FyeQotICAgIHB1YiBhc3luYyBmbiBnZXQ8VDogJ3N0YXRpYyArIENsb25lICsgU2VuZCArIFN5bmMgKyBTdG9wcGFibGU+KHNlbGY6ICZBcmM8U2VsZj4pIC0+IFQgewotICAgICAgICBsZXQgdHlwZWlkID0gVHlwZUlkOjpvZjo6PFQ+KCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxldCBpbnN0YW5jZXMgPSBzZWxmLmluc3RhbmNlcy5sb2NrKCkuYXdhaXQ7Ci0gICAgICAgICAgICBpZiBsZXQgU29tZSh2YWx1ZSkgPSBpbnN0YW5jZXMuZ2V0KCZ0eXBlaWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZG93bmNhc3RfcmVmOjo8VD4oKS5leHBlY3QoIndhcyBub3QgY29ycmVjdCB0eXBlIikuY2xvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxldCBjYXN0ZWQgPSB7Ci0gICAgICAgICAgICBsZXQgcHJvdmlkZXIgPSB7IHNlbGYucHJvdmlkZXJzLmxvY2soKS5hd2FpdFsmdHlwZWlkXS5jbG9uZSgpIH07Ci0gICAgICAgICAgICBsZXQgcmVzdWx0ID0gKHByb3ZpZGVyLmYpKHNlbGYuY2xvbmUoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAoKnJlc3VsdC5kb3duY2FzdDo6PFQ+KCkuZXhwZWN0KCJ3YXMgbm90IGNvcnJlY3QgdHlwZSIpKS5jbG9uZSgpCi0gICAgICAgIH07Ci0KLSAgICAgICAgbGV0IG11dCBpbnN0YW5jZXMgPSBzZWxmLmluc3RhbmNlcy5sb2NrKCkuYXdhaXQ7Ci0gICAgICAgIGluc3RhbmNlcy5pbnNlcnQodHlwZWlkLCBCb3g6Om5ldyhjYXN0ZWQuY2xvbmUoKSkpOwotCi0gICAgICAgIGxldCBtdXQgc3RhcnRfb3JkZXIgPSBzZWxmLnN0YXJ0X29yZGVyLmxvY2soKS5hd2FpdDsKLSAgICAgICAgc3RhcnRfb3JkZXIucHVzaChCb3g6Om5ldyhjYXN0ZWQuY2xvbmUoKSkpOwotCi0gICAgICAgIGNhc3RlZAotICAgIH0KLQotICAgIC8vLyBJbmplY3QgYW4gYWxyZWFkeSBjcmVhdGVkIGluc3RhbmNlIG9mIFQuIFVzZWZ1bCBmb3IgY29uZmlnLgotICAgIHB1YiBhc3luYyBmbiBpbmplY3Q8VDogJ3N0YXRpYyArIENsb25lICsgU2VuZCArIFN5bmM+KHNlbGY6ICZBcmM8U2VsZj4sIG9iajogVCkgewotICAgICAgICBsZXQgbXV0IGluc3RhbmNlcyA9IHNlbGYuaW5zdGFuY2VzLmxvY2soKS5hd2FpdDsKLSAgICAgICAgaW5zdGFuY2VzLmluc2VydChUeXBlSWQ6Om9mOjo8VD4oKSwgQm94OjpuZXcob2JqKSk7Ci0gICAgfQotCi0gICAgLy8vIFN0b3AgYWxsIGluc3RhbmNlcywgaW4gcmV2ZXJzZSBvcmRlciBvZiBzdGFydC4KLSAgICBwdWIgYXN5bmMgZm4gc3RvcF9hbGwoc2VsZjogJkFyYzxTZWxmPikgewotICAgICAgICBsZXQgbXV0IHN0YXJ0X29yZGVyID0gc2VsZi5zdGFydF9vcmRlci5sb2NrKCkuYXdhaXQ7Ci0gICAgICAgIHdoaWxlIGxldCBTb21lKG9iaikgPSBzdGFydF9vcmRlci5wb3AoKSB7Ci0gICAgICAgICAgICBvYmouc3RvcCgpOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYuaW5zdGFuY2VzLmxvY2soKS5hd2FpdC5jbGVhcigpOwotICAgIH0KLX0KLQotaW1wbDxUPiBTdG9wcGFibGUgZm9yIHN0ZDo6c3luYzo6QXJjPFQ+IHt9CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L09XTkVSUyBiL2dkL3J1c3QvbGludXgvT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTFkMmMxLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSBwbGF0Zm9ybS9zeXN0ZW0vYnQ6L09XTkVSU19jaHJvbWVvcwpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9jbGllbnQvQ2FyZ28udG9tbCBiL2dkL3J1c3QvbGludXgvY2xpZW50L0NhcmdvLnRvbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMWEwMGMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9jbGllbnQvQ2FyZ28udG9tbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVtwYWNrYWdlXQotbmFtZSA9ICJjbGllbnQiCi12ZXJzaW9uID0gIjAuMS4wIgotZWRpdGlvbiA9ICIyMDE4IgotCi1bZGVwZW5kZW5jaWVzXQotcnVzdHlsaW5lID0gIjguMCIKLXJ1c3R5bGluZS1kZXJpdmUgPSAiMC40LjAiCi1idF90b3BzaGltID0geyBwYXRoID0gIi4uLy4uL3RvcHNoaW0iIH0KLWJ0c3RhY2sgPSB7IHBhdGggPSAiLi4vc3RhY2siIH0KLW1hbmFnZXJfc2VydmljZSA9IHsgcGF0aCA9ICIuLi9tZ210IiB9Ci0KLWRidXMgPSAiMC45LjIiCi1kYnVzLWNyb3Nzcm9hZHMgPSAiMC40LjAiCi1kYnVzLXRva2lvID0gIjAuNy4zIgotCi1kYnVzX3Byb2plY3Rpb24gPSB7IHBhdGggPSAiLi4vZGJ1c19wcm9qZWN0aW9uIiB9Ci1kYnVzX21hY3JvcyA9IHsgcGF0aCA9ICIuLi9kYnVzX3Byb2plY3Rpb24vZGJ1c19tYWNyb3MiIH0KLQotZnV0dXJlcyA9ICIwLjMuMTMiCi1udW0tdHJhaXRzID0gIioiCi10b2tpbyA9IHsgdmVyc2lvbiA9ICIxIiwgZmVhdHVyZXMgPSBbJ2J5dGVzJywgJ2ZzJywgJ2lvLXV0aWwnLCAnbGliYycsICdtYWNyb3MnLCAnbWVtY2hyJywgJ21pbycsICduZXQnLCAnbnVtX2NwdXMnLCAncnQnLCAncnQtbXVsdGktdGhyZWFkJywgJ3N5bmMnLCAndGltZScsICd0b2tpby1tYWNyb3MnXSB9Ci0KLVtidWlsZC1kZXBlbmRlbmNpZXNdCi1wa2ctY29uZmlnID0gIjAuMy4xOSIKLQotW1tiaW5dXQotbmFtZSA9ICJidGNsaWVudCIKLXBhdGggPSAic3JjL21haW4ucnMiCi1idWlsZCA9ICJidWlsZC5ycyIKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvY2xpZW50L2J1aWxkLnJzIGIvZ2QvcnVzdC9saW51eC9jbGllbnQvYnVpbGQucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjkxYjAuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9jbGllbnQvYnVpbGQucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi11c2UgcGtnX2NvbmZpZzo6Q29uZmlnOwotCi1mbiBtYWluKCkgewotICAgIGxldCB0YXJnZXRfZGlyID0gc3RkOjplbnY6OnZhcl9vcygiQ0FSR09fVEFSR0VUX0RJUiIpLnVud3JhcCgpOwotICAgIHByaW50bG4hKCJjYXJnbzpydXN0Yy1saW5rLXNlYXJjaD1uYXRpdmU9e30iLCB0YXJnZXRfZGlyLmludG9fc3RyaW5nKCkudW53cmFwKCkpOwotCi0gICAgLy8gV2hlbiBjcm9zcy1jb21waWxpbmcsIHBrZy1jb25maWcgaXMgbG9va2luZyBmb3IgZGJ1cyBhdCB0aGUgaG9zdCBsaWJkaXIgaW5zdGVhZCBvZiB0aGUKLSAgICAvLyBzeXNyb290LiBBZGRpbmcgdGhpcyBkZXBlbmRlbmN5IGhlcmUgZm9yY2VzIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSB0aGUgY3VycmVudCBzeXNyb290J3MKLSAgICAvLyBsaWJkaXIgYW5kIGZpeGVzIHRoZSBidWlsZCBpc3N1ZXMuCi0gICAgQ29uZmlnOjpuZXcoKS5wcm9iZSgiZGJ1cy0xIikudW53cmFwKCk7Ci0gICAgcHJpbnRsbiEoImNhcmdvOnJlcnVuLWlmLWNoYW5nZWQ9YnVpbGQucnMiKTsKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9jYWxsYmFja3MucnMgYi9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvY2FsbGJhY2tzLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDY2MzkzLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9jYWxsYmFja3MucnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotdXNlIGNyYXRlOjpDbGllbnRDb250ZXh0OwotdXNlIGNyYXRlOjp7Y29uc29sZV95ZWxsb3csIHByaW50X2luZm99OwotdXNlIGJ0X3RvcHNoaW06OmJ0aWY6OntCdEJvbmRTdGF0ZSwgQnRTc3BWYXJpYW50fTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6Z2F0dDo6R2F0dFN0YXR1czsKLXVzZSBidHN0YWNrOjpibHVldG9vdGg6OnsKLSAgICBCbHVldG9vdGhEZXZpY2UsIElCbHVldG9vdGgsIElCbHVldG9vdGhDYWxsYmFjaywgSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjaywKLX07Ci11c2UgYnRzdGFjazo6Ymx1ZXRvb3RoX2dhdHQ6OntCbHVldG9vdGhHYXR0U2VydmljZSwgSUJsdWV0b290aEdhdHRDYWxsYmFjaywgTGVQaHl9OwotdXNlIGJ0c3RhY2s6OlJQQ1Byb3h5OwotdXNlIG1hbmFnZXJfc2VydmljZTo6aWZhY2VfYmx1ZXRvb3RoX21hbmFnZXI6OklCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2s7Ci11c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Ci0KLS8vLyBDYWxsYmFjayBjb250ZXh0IGZvciBtYW5hZ2VyIGludGVyZmFjZSBjYWxsYmFja3MuCi1wdWIoY3JhdGUpIHN0cnVjdCBCdE1hbmFnZXJDYWxsYmFjayB7Ci0gICAgb2JqcGF0aDogU3RyaW5nLAotICAgIGNvbnRleHQ6IEFyYzxNdXRleDxDbGllbnRDb250ZXh0Pj4sCi19Ci0KLWltcGwgQnRNYW5hZ2VyQ2FsbGJhY2sgewotICAgIHB1YihjcmF0ZSkgZm4gbmV3KG9ianBhdGg6IFN0cmluZywgY29udGV4dDogQXJjPE11dGV4PENsaWVudENvbnRleHQ+PikgLT4gU2VsZiB7Ci0gICAgICAgIFNlbGYgeyBvYmpwYXRoLCBjb250ZXh0IH0KLSAgICB9Ci19Ci0KLWltcGwgSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjayBmb3IgQnRNYW5hZ2VyQ2FsbGJhY2sgewotICAgIGZuIG9uX2hjaV9kZXZpY2VfY2hhbmdlZCgmc2VsZiwgaGNpX2ludGVyZmFjZTogaTMyLCBwcmVzZW50OiBib29sKSB7Ci0gICAgICAgIHByaW50X2luZm8hKCJoY2l7fSBwcmVzZW50ID0ge30iLCBoY2lfaW50ZXJmYWNlLCBwcmVzZW50KTsKLQotICAgICAgICBpZiBwcmVzZW50IHsKLSAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcnMuZW50cnkoaGNpX2ludGVyZmFjZSkub3JfaW5zZXJ0KGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcnMucmVtb3ZlKCZoY2lfaW50ZXJmYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZuIG9uX2hjaV9lbmFibGVkX2NoYW5nZWQoJnNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMiwgZW5hYmxlZDogYm9vbCkgewotICAgICAgICBzZWxmLmNvbnRleHQubG9jaygpLnVud3JhcCgpLnNldF9hZGFwdGVyX2VuYWJsZWQoaGNpX2ludGVyZmFjZSwgZW5hYmxlZCk7Ci0gICAgfQotfQotCi1pbXBsIG1hbmFnZXJfc2VydmljZTo6UlBDUHJveHkgZm9yIEJ0TWFuYWdlckNhbGxiYWNrIHsKLSAgICBmbiByZWdpc3Rlcl9kaXNjb25uZWN0KCZtdXQgc2VsZiwgX2Y6IEJveDxkeW4gRm4odTMyKSArIFNlbmQ+KSAtPiB1MzIgewotICAgICAgICAwCi0gICAgfQotCi0gICAgZm4gZ2V0X29iamVjdF9pZCgmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgc2VsZi5vYmpwYXRoLmNsb25lKCkKLSAgICB9Ci0KLSAgICBmbiB1bnJlZ2lzdGVyKCZtdXQgc2VsZiwgX2lkOiB1MzIpIC0+IGJvb2wgewotICAgICAgICBmYWxzZQotICAgIH0KLX0KLQotLy8vIENhbGxiYWNrIGNvbnRhaW5lciBmb3IgYWRhcHRlciBpbnRlcmZhY2UgY2FsbGJhY2tzLgotcHViKGNyYXRlKSBzdHJ1Y3QgQnRDYWxsYmFjayB7Ci0gICAgb2JqcGF0aDogU3RyaW5nLAotICAgIGNvbnRleHQ6IEFyYzxNdXRleDxDbGllbnRDb250ZXh0Pj4sCi19Ci0KLWltcGwgQnRDYWxsYmFjayB7Ci0gICAgcHViKGNyYXRlKSBmbiBuZXcob2JqcGF0aDogU3RyaW5nLCBjb250ZXh0OiBBcmM8TXV0ZXg8Q2xpZW50Q29udGV4dD4+KSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZiB7IG9ianBhdGgsIGNvbnRleHQgfQotICAgIH0KLX0KLQotaW1wbCBJQmx1ZXRvb3RoQ2FsbGJhY2sgZm9yIEJ0Q2FsbGJhY2sgewotICAgIGZuIG9uX2FkZHJlc3NfY2hhbmdlZCgmc2VsZiwgYWRkcjogU3RyaW5nKSB7Ci0gICAgICAgIHByaW50X2luZm8hKCJBZGRyZXNzIGNoYW5nZWQgdG8ge30iLCAmYWRkcik7Ci0gICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcl9hZGRyZXNzID0gU29tZShhZGRyKTsKLSAgICB9Ci0KLSAgICBmbiBvbl9kZXZpY2VfZm91bmQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSkgewotICAgICAgICBzZWxmLmNvbnRleHQKLSAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgLmZvdW5kX2RldmljZXMKLSAgICAgICAgICAgIC5lbnRyeShyZW1vdGVfZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSkKLSAgICAgICAgICAgIC5vcl9pbnNlcnQocmVtb3RlX2RldmljZS5jbG9uZSgpKTsKLQotICAgICAgICBwcmludF9pbmZvISgiRm91bmQgZGV2aWNlOiB7Oj99IiwgcmVtb3RlX2RldmljZSk7Ci0gICAgfQotCi0gICAgZm4gb25fZGlzY292ZXJpbmdfY2hhbmdlZCgmc2VsZiwgZGlzY292ZXJpbmc6IGJvb2wpIHsKLSAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5kaXNjb3ZlcmluZ19zdGF0ZSA9IGRpc2NvdmVyaW5nOwotCi0gICAgICAgIGlmIGRpc2NvdmVyaW5nIHsKLSAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZm91bmRfZGV2aWNlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50X2luZm8hKCJEaXNjb3ZlcmluZzoge30iLCBkaXNjb3ZlcmluZyk7Ci0gICAgfQotCi0gICAgZm4gb25fc3NwX3JlcXVlc3QoCi0gICAgICAgICZzZWxmLAotICAgICAgICByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsCi0gICAgICAgIF9jb2Q6IHUzMiwKLSAgICAgICAgdmFyaWFudDogQnRTc3BWYXJpYW50LAotICAgICAgICBwYXNza2V5OiB1MzIsCi0gICAgKSB7Ci0gICAgICAgIG1hdGNoIHZhcmlhbnQgewotICAgICAgICAgICAgQnRTc3BWYXJpYW50OjpQYXNza2V5Tm90aWZpY2F0aW9uID0+IHsKLSAgICAgICAgICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICAgICAgICAgIkRldmljZSBbe306IHt9XSB3b3VsZCBsaWtlIHRvIHBhaXIsIGVudGVyIHBhc3NrZXkgb24gcmVtb3RlIGRldmljZTogezowNn0iLAotICAgICAgICAgICAgICAgICAgICAmcmVtb3RlX2RldmljZS5hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAmcmVtb3RlX2RldmljZS5uYW1lLAotICAgICAgICAgICAgICAgICAgICBwYXNza2V5Ci0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ0U3NwVmFyaWFudDo6Q29uc2VudCA9PiB7Ci0gICAgICAgICAgICAgICAgbGV0IHJkID0gcmVtb3RlX2RldmljZS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkucnVuX2NhbGxiYWNrKEJveDo6bmV3KG1vdmUgfGNvbnRleHR8IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXV0by1jb25maXJtIGJvbmRpbmcgYXR0ZW1wdHMgdGhhdCB3ZXJlIGxvY2FsbHkgaW5pdGlhdGVkLgotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGJvbmRpbmcgYXR0ZW1wdHMuCi0gICAgICAgICAgICAgICAgICAgIGxldCBib25kaW5nX2RldmljZSA9IGNvbnRleHQubG9jaygpLnVud3JhcCgpLmJvbmRpbmdfYXR0ZW1wdC5hc19yZWYoKS5jbG9uZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYm9uZGluZ19kZXZpY2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU29tZShiZCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJkLmFkZHJlc3MgPT0gcmQuYWRkcmVzcyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkYXB0ZXJfZGJ1cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRfcGFpcmluZ19jb25maXJtYXRpb24ocmQuY2xvbmUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ0U3NwVmFyaWFudDo6UGFzc2tleUVudHJ5ID0+IHsKLSAgICAgICAgICAgICAgICBwcmludGxuISgiR290IFBhc3NrZXlFbnRyeSBidXQgaXQgaXMgbm90IHN1cHBvcnRlZC4uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnRTc3BWYXJpYW50OjpQYXNza2V5Q29uZmlybWF0aW9uID0+IHsKLSAgICAgICAgICAgICAgICBwcmludGxuISgiR290IFBhc3NrZXlDb25maXJtYXRpb24gYnV0IHRoZXJlJ3Mgbm90aGluZyB0byBkby4uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gb25fYm9uZF9zdGF0ZV9jaGFuZ2VkKCZzZWxmLCBzdGF0dXM6IHUzMiwgYWRkcmVzczogU3RyaW5nLCBzdGF0ZTogdTMyKSB7Ci0gICAgICAgIHByaW50X2luZm8hKCJCb25kaW5nIHN0YXRlIGNoYW5nZWQ6IFt7fV0gc3RhdGU6IHt9LCBTdGF0dXMgPSB7fSIsIGFkZHJlc3MsIHN0YXRlLCBzdGF0dXMpOwotCi0gICAgICAgIC8vIENsZWFyIGJvbmRpbmcgYXR0ZW1wdCBpZiBib25kaW5nIGZhaWxzIG9yIHN1Y2NlZWRzCi0gICAgICAgIG1hdGNoIEJ0Qm9uZFN0YXRlOjpmcm9tKHN0YXRlKSB7Ci0gICAgICAgICAgICBCdEJvbmRTdGF0ZTo6Tm90Qm9uZGVkIHwgQnRCb25kU3RhdGU6OkJvbmRlZCA9PiB7Ci0gICAgICAgICAgICAgICAgbGV0IGJvbmRpbmdfYXR0ZW1wdCA9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYm9uZGluZ19hdHRlbXB0LmFzX3JlZigpLmNsb25lZCgpOwotICAgICAgICAgICAgICAgIG1hdGNoIGJvbmRpbmdfYXR0ZW1wdCB7Ci0gICAgICAgICAgICAgICAgICAgIFNvbWUoYmQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICZhZGRyZXNzID09ICZiZC5hZGRyZXNzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQubG9jaygpLnVud3JhcCgpLmJvbmRpbmdfYXR0ZW1wdCA9IE5vbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiAoKSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdEJvbmRTdGF0ZTo6Qm9uZGluZyA9PiAoKSwKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGJvbmRlZCwgd2Ugc2hvdWxkIGFsc28gYXV0b21hdGljYWxseSBjb25uZWN0IGFsbCBlbmFibGVkIHByb2ZpbGVzCi0gICAgICAgIGlmIEJ0Qm9uZFN0YXRlOjpCb25kZWQgPT0gc3RhdGUuaW50bygpIHsKLSAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuY29ubmVjdF9hbGxfZW5hYmxlZF9wcm9maWxlcyhCbHVldG9vdGhEZXZpY2UgewotICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nOjpmcm9tKCJDbGFzc2ljIGRldmljZSIpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWltcGwgUlBDUHJveHkgZm9yIEJ0Q2FsbGJhY2sgewotICAgIGZuIHJlZ2lzdGVyX2Rpc2Nvbm5lY3QoJm11dCBzZWxmLCBfZjogQm94PGR5biBGbih1MzIpICsgU2VuZD4pIC0+IHUzMiB7Ci0gICAgICAgIDAKLSAgICB9Ci0KLSAgICBmbiBnZXRfb2JqZWN0X2lkKCZzZWxmKSAtPiBTdHJpbmcgewotICAgICAgICBzZWxmLm9ianBhdGguY2xvbmUoKQotICAgIH0KLQotICAgIGZuIHVucmVnaXN0ZXIoJm11dCBzZWxmLCBfaWQ6IHUzMikgLT4gYm9vbCB7Ci0gICAgICAgIGZhbHNlCi0gICAgfQotfQotCi1wdWIoY3JhdGUpIHN0cnVjdCBCdENvbm5lY3Rpb25DYWxsYmFjayB7Ci0gICAgb2JqcGF0aDogU3RyaW5nLAotICAgIF9jb250ZXh0OiBBcmM8TXV0ZXg8Q2xpZW50Q29udGV4dD4+LAotfQotCi1pbXBsIEJ0Q29ubmVjdGlvbkNhbGxiYWNrIHsKLSAgICBwdWIoY3JhdGUpIGZuIG5ldyhvYmpwYXRoOiBTdHJpbmcsIF9jb250ZXh0OiBBcmM8TXV0ZXg8Q2xpZW50Q29udGV4dD4+KSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZiB7IG9ianBhdGgsIF9jb250ZXh0IH0KLSAgICB9Ci19Ci0KLWltcGwgSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayBmb3IgQnRDb25uZWN0aW9uQ2FsbGJhY2sgewotICAgIGZuIG9uX2RldmljZV9jb25uZWN0ZWQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSkgewotICAgICAgICBwcmludF9pbmZvISgiQ29ubmVjdGVkOiBbe31dOiB7fSIsIHJlbW90ZV9kZXZpY2UuYWRkcmVzcywgcmVtb3RlX2RldmljZS5uYW1lKTsKLSAgICB9Ci0KLSAgICBmbiBvbl9kZXZpY2VfZGlzY29ubmVjdGVkKCZzZWxmLCByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIHsKLSAgICAgICAgcHJpbnRfaW5mbyEoIkRpc2Nvbm5lY3RlZDogW3t9XToge30iLCByZW1vdGVfZGV2aWNlLmFkZHJlc3MsIHJlbW90ZV9kZXZpY2UubmFtZSk7Ci0gICAgfQotfQotCi1pbXBsIFJQQ1Byb3h5IGZvciBCdENvbm5lY3Rpb25DYWxsYmFjayB7Ci0gICAgZm4gcmVnaXN0ZXJfZGlzY29ubmVjdCgmbXV0IHNlbGYsIF9mOiBCb3g8ZHluIEZuKHUzMikgKyBTZW5kPikgLT4gdTMyIHsKLSAgICAgICAgMAotICAgIH0KLQotICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgIHNlbGYub2JqcGF0aC5jbG9uZSgpCi0gICAgfQotCi0gICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIF9pZDogdTMyKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci19Ci0KLXB1YihjcmF0ZSkgc3RydWN0IEJ0R2F0dENhbGxiYWNrIHsKLSAgICBvYmpwYXRoOiBTdHJpbmcsCi0gICAgY29udGV4dDogQXJjPE11dGV4PENsaWVudENvbnRleHQ+PiwKLX0KLQotaW1wbCBCdEdhdHRDYWxsYmFjayB7Ci0gICAgcHViKGNyYXRlKSBmbiBuZXcob2JqcGF0aDogU3RyaW5nLCBjb250ZXh0OiBBcmM8TXV0ZXg8Q2xpZW50Q29udGV4dD4+KSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZiB7IG9ianBhdGgsIGNvbnRleHQgfQotICAgIH0KLX0KLQotaW1wbCBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrIGZvciBCdEdhdHRDYWxsYmFjayB7Ci0gICAgZm4gb25fY2xpZW50X3JlZ2lzdGVyZWQoJnNlbGYsIHN0YXR1czogaTMyLCBjbGllbnRfaWQ6IGkzMikgewotICAgICAgICBwcmludF9pbmZvISgiR0FUVCBDbGllbnQgcmVnaXN0ZXJlZCBzdGF0dXMgPSB7fSwgY2xpZW50X2lkID0ge30iLCBzdGF0dXMsIGNsaWVudF9pZCk7Ci0gICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZ2F0dF9jbGllbnRfaWQgPSBTb21lKGNsaWVudF9pZCk7Ci0gICAgfQotCi0gICAgZm4gb25fY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGUoCi0gICAgICAgICZzZWxmLAotICAgICAgICBzdGF0dXM6IGkzMiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGNvbm5lY3RlZDogYm9vbCwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICkgewotICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICJHQVRUIENsaWVudCBjb25uZWN0aW9uIHN0YXRlID0ge30sIGNsaWVudF9pZCA9IHt9LCBjb25uZWN0ZWQgPSB7fSwgYWRkciA9IHt9IiwKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIGNsaWVudF9pZCwKLSAgICAgICAgICAgIGNvbm5lY3RlZCwKLSAgICAgICAgICAgIGFkZHIKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBvbl9waHlfdXBkYXRlKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHR4X3BoeTogTGVQaHksIHJ4X3BoeTogTGVQaHksIHN0YXR1czogR2F0dFN0YXR1cykgewotICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICJQaHkgdXBkYXRlZDogYWRkciA9IHt9LCB0eF9waHkgPSB7Oj99LCByeF9waHkgPSB7Oj99LCBzdGF0dXMgPSB7Oj99IiwKLSAgICAgICAgICAgIGFkZHIsCi0gICAgICAgICAgICB0eF9waHksCi0gICAgICAgICAgICByeF9waHksCi0gICAgICAgICAgICBzdGF0dXMKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBvbl9waHlfcmVhZCgmc2VsZiwgYWRkcjogU3RyaW5nLCB0eF9waHk6IExlUGh5LCByeF9waHk6IExlUGh5LCBzdGF0dXM6IEdhdHRTdGF0dXMpIHsKLSAgICAgICAgcHJpbnRfaW5mbyEoCi0gICAgICAgICAgICAiUGh5IHJlYWQ6IGFkZHIgPSB7fSwgdHhfcGh5ID0gezo/fSwgcnhfcGh5ID0gezo/fSwgc3RhdHVzID0gezo/fSIsCi0gICAgICAgICAgICBhZGRyLAotICAgICAgICAgICAgdHhfcGh5LAotICAgICAgICAgICAgcnhfcGh5LAotICAgICAgICAgICAgc3RhdHVzCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gb25fc2VhcmNoX2NvbXBsZXRlKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHNlcnZpY2VzOiBWZWM8Qmx1ZXRvb3RoR2F0dFNlcnZpY2U+LCBzdGF0dXM6IGkzMikgewotICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICJHQVRUIERCIFNlYXJjaCBjb21wbGV0ZTogYWRkciA9IHt9LCBzZXJ2aWNlcyA9IHs6P30sIHN0YXR1cyA9IHt9IiwKLSAgICAgICAgICAgIGFkZHIsCi0gICAgICAgICAgICBzZXJ2aWNlcywKLSAgICAgICAgICAgIHN0YXR1cwotICAgICAgICApOwotICAgIH0KLQotICAgIGZuIG9uX2NoYXJhY3RlcmlzdGljX3JlYWQoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIsIGhhbmRsZTogaTMyLCB2YWx1ZTogVmVjPHU4PikgewotICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICJHQVRUIENoYXJhY3RlcmlzdGljIHJlYWQ6IGFkZHIgPSB7fSwgc3RhdHVzID0ge30sIGhhbmRsZSA9IHt9LCB2YWx1ZSA9IHs6P30iLAotICAgICAgICAgICAgYWRkciwKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIHZhbHVlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gb25fY2hhcmFjdGVyaXN0aWNfd3JpdGUoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIsIGhhbmRsZTogaTMyKSB7Ci0gICAgICAgIHByaW50X2luZm8hKAotICAgICAgICAgICAgIkdBVFQgQ2hhcmFjdGVyaXN0aWMgd3JpdGU6IGFkZHIgPSB7fSwgc3RhdHVzID0ge30sIGhhbmRsZSA9IHt9IiwKLSAgICAgICAgICAgIGFkZHIsCi0gICAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgICBoYW5kbGUKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBvbl9leGVjdXRlX3dyaXRlKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHN0YXR1czogaTMyKSB7Ci0gICAgICAgIHByaW50X2luZm8hKCJHQVRUIGV4ZWN1dGUgd3JpdGUgYWRkciA9IHt9LCBzdGF0dXMgPSB7fSIsIGFkZHIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgZm4gb25fZGVzY3JpcHRvcl9yZWFkKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHN0YXR1czogaTMyLCBoYW5kbGU6IGkzMiwgdmFsdWU6IFZlYzx1OD4pIHsKLSAgICAgICAgcHJpbnRfaW5mbyEoCi0gICAgICAgICAgICAiR0FUVCBEZXNjcmlwdG9yIHJlYWQ6IGFkZHIgPSB7fSwgc3RhdHVzID0ge30sIGhhbmRsZSA9IHt9LCB2YWx1ZSA9IHs6P30iLAotICAgICAgICAgICAgYWRkciwKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIHZhbHVlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gb25fZGVzY3JpcHRvcl93cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMiwgaGFuZGxlOiBpMzIpIHsKLSAgICAgICAgcHJpbnRfaW5mbyEoCi0gICAgICAgICAgICAiR0FUVCBEZXNjcmlwdG9yIHdyaXRlOiBhZGRyID0ge30sIHN0YXR1cyA9IHt9LCBoYW5kbGUgPSB7fSIsCi0gICAgICAgICAgICBhZGRyLAotICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgaGFuZGxlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gb25fbm90aWZ5KCZzZWxmLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCB2YWx1ZTogVmVjPHU4PikgewotICAgICAgICBwcmludF9pbmZvISgiR0FUVCBOb3RpZmljYXRpb246IGFkZHIgPSB7fSwgaGFuZGxlID0ge30sIHZhbHVlID0gezo/fSIsIGFkZHIsIGhhbmRsZSwgdmFsdWUpOwotICAgIH0KLQotICAgIGZuIG9uX3JlYWRfcmVtb3RlX3Jzc2koJnNlbGYsIGFkZHI6IFN0cmluZywgcnNzaTogaTMyLCBzdGF0dXM6IGkzMikgewotICAgICAgICBwcmludF9pbmZvISgiUmVtb3RlIFJTU0kgcmVhZDogYWRkciA9IHt9LCByc3NpID0ge30sIHN0YXR1cyA9IHt9IiwgYWRkciwgcnNzaSwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBmbiBvbl9jb25maWd1cmVfbXR1KCZzZWxmLCBhZGRyOiBTdHJpbmcsIG10dTogaTMyLCBzdGF0dXM6IGkzMikgewotICAgICAgICBwcmludF9pbmZvISgiTVRVIGNvbmZpZ3VyZWQ6IGFkZHIgPSB7fSwgbXR1ID0ge30sIHN0YXR1cyA9IHt9IiwgYWRkciwgbXR1LCBzdGF0dXMpOwotICAgIH0KLQotICAgIGZuIG9uX2Nvbm5lY3Rpb25fdXBkYXRlZCgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgaW50ZXJ2YWw6IGkzMiwKLSAgICAgICAgbGF0ZW5jeTogaTMyLAotICAgICAgICB0aW1lb3V0OiBpMzIsCi0gICAgICAgIHN0YXR1czogaTMyLAotICAgICkgewotICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICJDb25uZWN0aW9uIHVwZGF0ZWQ6IGFkZHIgPSB7fSwgaW50ZXJ2YWwgPSB7fSwgbGF0ZW5jeSA9IHt9LCB0aW1lb3V0ID0ge30sIHN0YXR1cyA9IHt9IiwKLSAgICAgICAgICAgIGFkZHIsCi0gICAgICAgICAgICBpbnRlcnZhbCwKLSAgICAgICAgICAgIGxhdGVuY3ksCi0gICAgICAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgc3RhdHVzCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gb25fc2VydmljZV9jaGFuZ2VkKCZzZWxmLCBhZGRyOiBTdHJpbmcpIHsKLSAgICAgICAgcHJpbnRfaW5mbyEoIlNlcnZpY2UgY2hhbmdlZCBmb3Ige30iLCBhZGRyLCk7Ci0gICAgfQotfQotCi1pbXBsIFJQQ1Byb3h5IGZvciBCdEdhdHRDYWxsYmFjayB7Ci0gICAgZm4gcmVnaXN0ZXJfZGlzY29ubmVjdCgmbXV0IHNlbGYsIF9mOiBCb3g8ZHluIEZuKHUzMikgKyBTZW5kPikgLT4gdTMyIHsKLSAgICAgICAgMAotICAgIH0KLQotICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgIHNlbGYub2JqcGF0aC5jbG9uZSgpCi0gICAgfQotCi0gICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIF9pZDogdTMyKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvY29tbWFuZF9oYW5kbGVyLnJzIGIvZ2QvcnVzdC9saW51eC9jbGllbnQvc3JjL2NvbW1hbmRfaGFuZGxlci5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjNzI2Mi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvY29tbWFuZF9oYW5kbGVyLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwotdXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyLCBSZXN1bHR9OwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotCi11c2UgY3JhdGU6OmNhbGxiYWNrczo6QnRHYXR0Q2FsbGJhY2s7Ci11c2UgY3JhdGU6OkNsaWVudENvbnRleHQ7Ci11c2UgY3JhdGU6Ontjb25zb2xlX3JlZCwgY29uc29sZV95ZWxsb3csIHByaW50X2Vycm9yLCBwcmludF9pbmZvfTsKLXVzZSBidF90b3BzaGltOjpidGlmOjpCdFRyYW5zcG9ydDsKLXVzZSBidHN0YWNrOjpibHVldG9vdGg6OntCbHVldG9vdGhEZXZpY2UsIElCbHVldG9vdGh9OwotdXNlIGJ0c3RhY2s6OmJsdWV0b290aF9nYXR0OjpJQmx1ZXRvb3RoR2F0dDsKLXVzZSBidHN0YWNrOjp1dWlkOjpVdWlkSGVscGVyOwotdXNlIG1hbmFnZXJfc2VydmljZTo6aWZhY2VfYmx1ZXRvb3RoX21hbmFnZXI6OklCbHVldG9vdGhNYW5hZ2VyOwotCi1jb25zdCBJTkRFTlRfQ0hBUjogJnN0ciA9ICIgIjsKLWNvbnN0IEJBUjFfQ0hBUjogJnN0ciA9ICI9IjsKLWNvbnN0IEJBUjJfQ0hBUjogJnN0ciA9ICItIjsKLWNvbnN0IE1BWF9NRU5VX0NIQVJfV0lEVEg6IHVzaXplID0gNzI7Ci1jb25zdCBHQVRUX0NMSUVOVF9BUFBfVVVJRDogJnN0ciA9ICIxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCI7Ci0KLXR5cGUgQ29tbWFuZEZ1bmN0aW9uID0gZm4oJm11dCBDb21tYW5kSGFuZGxlciwgJlZlYzxTdHJpbmc+KTsKLQotZm4gX25vb3AoX2hhbmRsZXI6ICZtdXQgQ29tbWFuZEhhbmRsZXIsIF9hcmdzOiAmVmVjPFN0cmluZz4pIHsKLSAgICAvLyBVc2VkIHNvIHdlIGNhbiBhZGQgb3B0aW9ucyB3aXRoIG5vIGRpcmVjdCBmdW5jdGlvbgotICAgIC8vIGUuZy4gaGVscCBhbmQgcXVpdAotfQotCi1wdWIgc3RydWN0IENvbW1hbmRPcHRpb24gewotICAgIGRlc2NyaXB0aW9uOiBTdHJpbmcsCi0gICAgZnVuY3Rpb25fcG9pbnRlcjogQ29tbWFuZEZ1bmN0aW9uLAotfQotCi0vLy8gSGFuZGxlcyBzdHJpbmcgY29tbWFuZCBlbnRlcmVkIGZyb20gY29tbWFuZCBsaW5lLgotcHViKGNyYXRlKSBzdHJ1Y3QgQ29tbWFuZEhhbmRsZXIgewotICAgIGNvbnRleHQ6IEFyYzxNdXRleDxDbGllbnRDb250ZXh0Pj4sCi0gICAgY29tbWFuZF9vcHRpb25zOiBIYXNoTWFwPFN0cmluZywgQ29tbWFuZE9wdGlvbj4sCi19Ci0KLXN0cnVjdCBEaXNwbGF5TGlzdDxUPihWZWM8VD4pOwotCi1pbXBsPFQ6IERpc3BsYXk+IERpc3BsYXkgZm9yIERpc3BsYXlMaXN0PFQ+IHsKLSAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyPCdfPikgLT4gUmVzdWx0IHsKLSAgICAgICAgbGV0IF8gPSB3cml0ZSEoZiwgIltcbiIpOwotICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLjAuaXRlcigpIHsKLSAgICAgICAgICAgIGxldCBfID0gd3JpdGUhKGYsICIgIHt9XG4iLCBpdGVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlIShmLCAiXSIpCi0gICAgfQotfQotCi1mbiBlbmZvcmNlX2FyZ19sZW48Rj4oYXJnczogJlZlYzxTdHJpbmc+LCBtaW5fbGVuOiB1c2l6ZSwgbXNnOiAmc3RyLCBtdXQgYWN0aW9uOiBGKQotd2hlcmUKLSAgICBGOiBGbk11dCgpLAotewotICAgIGlmIGFyZ3MubGVuKCkgPCBtaW5fbGVuIHsKLSAgICAgICAgcHJpbnRsbiEoIlVzYWdlOiB7fSIsIG1zZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWN0aW9uKCk7Ci0gICAgfQotfQotCi1mbiB3cmFwX2hlbHBfdGV4dCh0ZXh0OiAmc3RyLCBtYXg6IHVzaXplLCBpbmRlbnQ6IHVzaXplKSAtPiBTdHJpbmcgewotICAgIGxldCByZW1haW5pbmdfY291bnQgPSBzdGQ6OmNtcDo6bWF4KAotICAgICAgICAvLyByZWFsX21heAotICAgICAgICBzdGQ6OmNtcDo6bWF4KG1heCwgdGV4dC5jaGFycygpLmNvdW50KCkpCi0gICAgICAgIC8vIHRha2UgYXdheSBjaGFyIGNvdW50Ci0gICAgICAgICAtIHRleHQuY2hhcnMoKS5jb3VudCgpCi0gICAgICAgIC8vIHRha2UgYXdheSByZWFsX2luZGVudAotICAgICAgICAgLSAoCi0gICAgICAgICAgICAgaWYgc3RkOjpjbXA6Om1heChtYXgsIHRleHQuY2hhcnMoKS5jb3VudCgpKS0gdGV4dC5jaGFycygpLmNvdW50KCkgPiBpbmRlbnQgewotICAgICAgICAgICAgICAgICBpbmRlbnQKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgfSksCi0gICAgICAgIDAsCi0gICAgKTsKLQotICAgIGZvcm1hdCEoInx7fXt9e318IiwgSU5ERU5UX0NIQVIucmVwZWF0KGluZGVudCksIHRleHQsIElOREVOVF9DSEFSLnJlcGVhdChyZW1haW5pbmdfY291bnQpKQotfQotCi0vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBjb25zdHJ1Y3RvciBpbiBvcmRlciB0byBwb3B1bGF0ZSB0aGUgY29tbWFuZCBvcHRpb24gbWFwCi1mbiBidWlsZF9jb21tYW5kcygpIC0+IEhhc2hNYXA8U3RyaW5nLCBDb21tYW5kT3B0aW9uPiB7Ci0gICAgbGV0IG11dCBjb21tYW5kX29wdGlvbnMgPSBIYXNoTWFwOjo8U3RyaW5nLCBDb21tYW5kT3B0aW9uPjo6bmV3KCk7Ci0gICAgY29tbWFuZF9vcHRpb25zLmluc2VydCgKLSAgICAgICAgU3RyaW5nOjpmcm9tKCJhZGFwdGVyIiksCi0gICAgICAgIENvbW1hbmRPcHRpb24gewotICAgICAgICAgICAgZGVzY3JpcHRpb246IFN0cmluZzo6ZnJvbSgKLSAgICAgICAgICAgICAgICAiRW5hYmxlL0Rpc2FibGUvU2hvdyBkZWZhdWx0IGJsdWV0b290aCBhZGFwdGVyLiAoZS5nLiBhZGFwdGVyIGVuYWJsZSkiLAotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIGZ1bmN0aW9uX3BvaW50ZXI6IENvbW1hbmRIYW5kbGVyOjpjbWRfYWRhcHRlciwKLSAgICAgICAgfSwKLSAgICApOwotICAgIGNvbW1hbmRfb3B0aW9ucy5pbnNlcnQoCi0gICAgICAgIFN0cmluZzo6ZnJvbSgiYm9uZCIpLAotICAgICAgICBDb21tYW5kT3B0aW9uIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdHJpbmc6OmZyb20oIkNyZWF0ZXMgYSBib25kIHdpdGggYSBkZXZpY2UuIiksCi0gICAgICAgICAgICBmdW5jdGlvbl9wb2ludGVyOiBDb21tYW5kSGFuZGxlcjo6Y21kX2JvbmQsCi0gICAgICAgIH0sCi0gICAgKTsKLSAgICBjb21tYW5kX29wdGlvbnMuaW5zZXJ0KAotICAgICAgICBTdHJpbmc6OmZyb20oImRldmljZSIpLAotICAgICAgICBDb21tYW5kT3B0aW9uIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdHJpbmc6OmZyb20oIlRha2UgYWN0aW9uIG9uIGEgcmVtb3RlIGRldmljZS4gKGkuZS4gaW5mbykiKSwKLSAgICAgICAgICAgIGZ1bmN0aW9uX3BvaW50ZXI6IENvbW1hbmRIYW5kbGVyOjpjbWRfZGV2aWNlLAotICAgICAgICB9LAotICAgICk7Ci0gICAgY29tbWFuZF9vcHRpb25zLmluc2VydCgKLSAgICAgICAgU3RyaW5nOjpmcm9tKCJkaXNjb3ZlcnkiKSwKLSAgICAgICAgQ29tbWFuZE9wdGlvbiB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbjogU3RyaW5nOjpmcm9tKCJTdGFydCBhbmQgc3RvcCBkZXZpY2UgZGlzY292ZXJ5LiAoZS5nLiBkaXNjb3Zlcnkgc3RhcnQpIiksCi0gICAgICAgICAgICBmdW5jdGlvbl9wb2ludGVyOiBDb21tYW5kSGFuZGxlcjo6Y21kX2Rpc2NvdmVyeSwKLSAgICAgICAgfSwKLSAgICApOwotICAgIGNvbW1hbmRfb3B0aW9ucy5pbnNlcnQoCi0gICAgICAgIFN0cmluZzo6ZnJvbSgiZmxvc3MiKSwKLSAgICAgICAgQ29tbWFuZE9wdGlvbiB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbjogU3RyaW5nOjpmcm9tKCJFbmFibGUgb3IgZGlzYWJsZSBGbG9zcyBmb3IgZG9nZm9vZC4iKSwKLSAgICAgICAgICAgIGZ1bmN0aW9uX3BvaW50ZXI6IENvbW1hbmRIYW5kbGVyOjpjbWRfZmxvc3MsCi0gICAgICAgIH0sCi0gICAgKTsKLSAgICBjb21tYW5kX29wdGlvbnMuaW5zZXJ0KAotICAgICAgICBTdHJpbmc6OmZyb20oImdhdHQiKSwKLSAgICAgICAgQ29tbWFuZE9wdGlvbiB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbjogU3RyaW5nOjpmcm9tKCJHQVRUIHRvb2xzIiksCi0gICAgICAgICAgICBmdW5jdGlvbl9wb2ludGVyOiBDb21tYW5kSGFuZGxlcjo6Y21kX2dhdHQsCi0gICAgICAgIH0sCi0gICAgKTsKLSAgICBjb21tYW5kX29wdGlvbnMuaW5zZXJ0KAotICAgICAgICBTdHJpbmc6OmZyb20oImdldC1hZGRyZXNzIiksCi0gICAgICAgIENvbW1hbmRPcHRpb24gewotICAgICAgICAgICAgZGVzY3JpcHRpb246IFN0cmluZzo6ZnJvbSgiR2V0cyB0aGUgbG9jYWwgZGV2aWNlIGFkZHJlc3MuIiksCi0gICAgICAgICAgICBmdW5jdGlvbl9wb2ludGVyOiBDb21tYW5kSGFuZGxlcjo6Y21kX2dldF9hZGRyZXNzLAotICAgICAgICB9LAotICAgICk7Ci0gICAgY29tbWFuZF9vcHRpb25zLmluc2VydCgKLSAgICAgICAgU3RyaW5nOjpmcm9tKCJoZWxwIiksCi0gICAgICAgIENvbW1hbmRPcHRpb24gewotICAgICAgICAgICAgZGVzY3JpcHRpb246IFN0cmluZzo6ZnJvbSgiU2hvd3MgdGhpcyBtZW51LiIpLAotICAgICAgICAgICAgZnVuY3Rpb25fcG9pbnRlcjogQ29tbWFuZEhhbmRsZXI6OmNtZF9oZWxwLAotICAgICAgICB9LAotICAgICk7Ci0gICAgY29tbWFuZF9vcHRpb25zLmluc2VydCgKLSAgICAgICAgU3RyaW5nOjpmcm9tKCJsaXN0IiksCi0gICAgICAgIENvbW1hbmRPcHRpb24gewotICAgICAgICAgICAgZGVzY3JpcHRpb246IFN0cmluZzo6ZnJvbSgKLSAgICAgICAgICAgICAgICAiTGlzdCBib25kZWQgb3IgZm91bmQgcmVtb3RlIGRldmljZXMuIFVzZTogbGlzdCA8Ym9uZGVkfGZvdW5kPiIsCi0gICAgICAgICAgICApLAotICAgICAgICAgICAgZnVuY3Rpb25fcG9pbnRlcjogQ29tbWFuZEhhbmRsZXI6OmNtZF9saXN0X2RldmljZXMsCi0gICAgICAgIH0sCi0gICAgKTsKLSAgICBjb21tYW5kX29wdGlvbnMuaW5zZXJ0KAotICAgICAgICBTdHJpbmc6OmZyb20oInF1aXQiKSwKLSAgICAgICAgQ29tbWFuZE9wdGlvbiB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbjogU3RyaW5nOjpmcm9tKCJRdWl0IG91dCBvZiB0aGUgaW50ZXJhY3RpdmUgc2hlbGwuIiksCi0gICAgICAgICAgICBmdW5jdGlvbl9wb2ludGVyOiBfbm9vcCwKLSAgICAgICAgfSwKLSAgICApOwotICAgIGNvbW1hbmRfb3B0aW9ucwotfQotCi1pbXBsIENvbW1hbmRIYW5kbGVyIHsKLSAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb21tYW5kSGFuZGxlci4KLSAgICBwdWIgZm4gbmV3KGNvbnRleHQ6IEFyYzxNdXRleDxDbGllbnRDb250ZXh0Pj4pIC0+IENvbW1hbmRIYW5kbGVyIHsKLSAgICAgICAgQ29tbWFuZEhhbmRsZXIgeyBjb250ZXh0LCBjb21tYW5kX29wdGlvbnM6IGJ1aWxkX2NvbW1hbmRzKCkgfQotICAgIH0KLQotICAgIC8vLyBFbnRyeSBwb2ludCBmb3IgY29tbWFuZCBhbmQgYXJndW1lbnRzCi0gICAgcHViIGZuIHByb2Nlc3NfY21kX2xpbmUoJm11dCBzZWxmLCBjb21tYW5kOiAmU3RyaW5nLCBhcmdzOiAmVmVjPFN0cmluZz4pIHsKLSAgICAgICAgLy8gSWdub3JlIGVtcHR5IGxpbmUKLSAgICAgICAgbWF0Y2ggJmNvbW1hbmRbMC4uXSB7Ci0gICAgICAgICAgICAiIiA9PiB7fQotICAgICAgICAgICAgXyA9PiBtYXRjaCBzZWxmLmNvbW1hbmRfb3B0aW9ucy5nZXQoY29tbWFuZCkgewotICAgICAgICAgICAgICAgIFNvbWUoY21kKSA9PiAoY21kLmZ1bmN0aW9uX3BvaW50ZXIpKHNlbGYsICZhcmdzKSwKLSAgICAgICAgICAgICAgICBOb25lID0+IHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoIid7fScgaXMgYW4gaW52YWxpZCBjb21tYW5kISIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICBzZWxmLmNtZF9oZWxwKCZhcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICB9OwotICAgIH0KLQotICAgIC8vICBDb21tb24gbWVzc2FnZSBmb3Igd2hlbiB0aGUgYWRhcHRlciBpc24ndCByZWFkeQotICAgIGZuIGFkYXB0ZXJfbm90X3JlYWR5KCZzZWxmKSB7Ci0gICAgICAgIGxldCBhZGFwdGVyX2lkeCA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZGVmYXVsdF9hZGFwdGVyOwotICAgICAgICBwcmludF9lcnJvciEoCi0gICAgICAgICAgICAiRGVmYXVsdCBhZGFwdGVyIHt9IGlzIG5vdCBlbmFibGVkLiBFbmFibGUgdGhlIGFkYXB0ZXIgYmVmb3JlIHVzaW5nIHRoaXMgY29tbWFuZC4iLAotICAgICAgICAgICAgYWRhcHRlcl9pZHgKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBjbWRfaGVscCgmbXV0IHNlbGYsIGFyZ3M6ICZWZWM8U3RyaW5nPikgewotICAgICAgICBpZiBhcmdzLmxlbigpID4gMCB7Ci0gICAgICAgICAgICBtYXRjaCBzZWxmLmNvbW1hbmRfb3B0aW9ucy5nZXQoJmFyZ3NbMF0pIHsKLSAgICAgICAgICAgICAgICBTb21lKGNtZCkgPT4gewotICAgICAgICAgICAgICAgICAgICBwcmludGxuISgKLSAgICAgICAgICAgICAgICAgICAgICAgICJcbnt9e31cbnt9e31cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTkRFTlRfQ0hBUi5yZXBlYXQoNCksCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5ERU5UX0NIQVIucmVwZWF0KDgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY21kLmRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE5vbmUgPT4gewotICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiJ3t9JyBpcyBhbiBpbnZhbGlkIGNvbW1hbmQhIiwgYXJnc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY21kX2hlbHAoJnZlYyFbXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQnVpbGQgZXF1YWxzIGJhciBhbmQgU2hhdmUgb2ZmIHNpZGVzCi0gICAgICAgICAgICBsZXQgZXF1YWxfYmFyID0gZm9ybWF0ISgiIHt9ICIsIEJBUjFfQ0hBUi5yZXBlYXQoTUFYX01FTlVfQ0hBUl9XSURUSCkpOwotCi0gICAgICAgICAgICAvLyBCdWlsZCBlbXB0eSBiYXIgYW5kIFNoYXZlIG9mZiBzaWRlcwotICAgICAgICAgICAgbGV0IGVtcHR5X2JhciA9IGZvcm1hdCEoInx7fXwiLCBJTkRFTlRfQ0hBUi5yZXBlYXQoTUFYX01FTlVfQ0hBUl9XSURUSCkpOwotCi0gICAgICAgICAgICAvLyBIZWFkZXIKLSAgICAgICAgICAgIHByaW50bG4hKAotICAgICAgICAgICAgICAgICJcbnt9XG57fVxue31cbnt9IiwKLSAgICAgICAgICAgICAgICBlcXVhbF9iYXIsCi0gICAgICAgICAgICAgICAgd3JhcF9oZWxwX3RleHQoIkhlbHAgTWVudSIsIE1BWF9NRU5VX0NIQVJfV0lEVEgsIDIpLAotICAgICAgICAgICAgICAgIC8vIE1pbnVzIGJhcgotICAgICAgICAgICAgICAgIGZvcm1hdCEoIit7fSsiLCBCQVIyX0NIQVIucmVwZWF0KE1BWF9NRU5VX0NIQVJfV0lEVEgpKSwKLSAgICAgICAgICAgICAgICBlbXB0eV9iYXIKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIC8vIFByaW50IGNvbW1hbmRzCi0gICAgICAgICAgICBmb3IgKGtleSwgdmFsKSBpbiBzZWxmLmNvbW1hbmRfb3B0aW9ucy5pdGVyKCkgewotICAgICAgICAgICAgICAgIHByaW50bG4hKAotICAgICAgICAgICAgICAgICAgICAie31cbnt9XG57fSIsCi0gICAgICAgICAgICAgICAgICAgIHdyYXBfaGVscF90ZXh0KCZrZXksIE1BWF9NRU5VX0NIQVJfV0lEVEgsIDQpLAotICAgICAgICAgICAgICAgICAgICB3cmFwX2hlbHBfdGV4dCgmdmFsLmRlc2NyaXB0aW9uLCBNQVhfTUVOVV9DSEFSX1dJRFRILCA4KSwKLSAgICAgICAgICAgICAgICAgICAgZW1wdHlfYmFyCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRm9vdGVyCi0gICAgICAgICAgICBwcmludGxuISgie31cbnt9IiwgZW1wdHlfYmFyLCBlcXVhbF9iYXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gY21kX2FkYXB0ZXIoJm11dCBzZWxmLCBhcmdzOiAmVmVjPFN0cmluZz4pIHsKLSAgICAgICAgbGV0IGRlZmF1bHRfYWRhcHRlciA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZGVmYXVsdF9hZGFwdGVyOwotICAgICAgICBlbmZvcmNlX2FyZ19sZW4oYXJncywgMSwgImFkYXB0ZXIgPGVuYWJsZXxkaXNhYmxlfHNob3c+IiwgfHwgbWF0Y2ggJmFyZ3NbMF1bMC4uXSB7Ci0gICAgICAgICAgICAiZW5hYmxlIiA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5tYW5hZ2VyX2RidXMuc3RhcnQoZGVmYXVsdF9hZGFwdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICJkaXNhYmxlIiA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5tYW5hZ2VyX2RidXMuc3RvcChkZWZhdWx0X2FkYXB0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgInNob3ciID0+IHsKLSAgICAgICAgICAgICAgICBpZiAhc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5tYW5hZ2VyX2RidXMuZ2V0X2Zsb3NzX2VuYWJsZWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJGbG9zcyBpcyBub3QgZW5hYmxlZC4gRmlyc3QgcnVuLCBgZmxvc3MgZW5hYmxlYCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGV0IGVuYWJsZWQgPSBzZWxmLmNvbnRleHQubG9jaygpLnVud3JhcCgpLmVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgbGV0IGFkZHJlc3MgPSBtYXRjaCBzZWxmLmNvbnRleHQubG9jaygpLnVud3JhcCgpLmFkYXB0ZXJfYWRkcmVzcy5hc19yZWYoKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4geC5jbG9uZSgpLAotICAgICAgICAgICAgICAgICAgICBOb25lID0+IFN0cmluZzo6ZnJvbSgiIiksCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcl9kYnVzLmFzX3JlZigpLnVud3JhcCgpLmdldF9uYW1lKCk7Ci0gICAgICAgICAgICAgICAgbGV0IHV1aWRzID0gc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX2RidXMuYXNfcmVmKCkudW53cmFwKCkuZ2V0X3V1aWRzKCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIkFkZHJlc3M6IHt9IiwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIk5hbWU6IHt9IiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIlN0YXRlOiB7fSIsIGlmIGVuYWJsZWQgeyAiZW5hYmxlZCIgfSBlbHNlIHsgImRpc2FibGVkIiB9KTsKLSAgICAgICAgICAgICAgICBwcmludF9pbmZvISgKLSAgICAgICAgICAgICAgICAgICAgIlV1aWRzOiB7fSIsCi0gICAgICAgICAgICAgICAgICAgIERpc3BsYXlMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgdXVpZHMuaXRlcigpLm1hcCh8Jnh8IFV1aWRIZWxwZXI6OnRvX3N0cmluZygmeCkpLmNvbGxlY3Q6OjxWZWM8U3RyaW5nPj4oKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgIHByaW50bG4hKCJJbnZhbGlkIGFyZ3VtZW50ICd7fSciLCBhcmdzWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gY21kX2dldF9hZGRyZXNzKCZtdXQgc2VsZiwgX2FyZ3M6ICZWZWM8U3RyaW5nPikgewotICAgICAgICBpZiAhc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX3JlYWR5IHsKLSAgICAgICAgICAgIHNlbGYuYWRhcHRlcl9ub3RfcmVhZHkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBhZGRyZXNzID0gc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS51cGRhdGVfYWRhcHRlcl9hZGRyZXNzKCk7Ci0gICAgICAgIHByaW50X2luZm8hKCJMb2NhbCBhZGRyZXNzID0ge30iLCAmYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgZm4gY21kX2Rpc2NvdmVyeSgmbXV0IHNlbGYsIGFyZ3M6ICZWZWM8U3RyaW5nPikgewotICAgICAgICBpZiAhc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX3JlYWR5IHsKLSAgICAgICAgICAgIHNlbGYuYWRhcHRlcl9ub3RfcmVhZHkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGVuZm9yY2VfYXJnX2xlbihhcmdzLCAxLCAiZGlzY292ZXJ5IDxzdGFydHxzdG9wPiIsIHx8IG1hdGNoICZhcmdzWzBdWzAuLl0gewotICAgICAgICAgICAgInN0YXJ0IiA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX2RidXMuYXNfcmVmKCkudW53cmFwKCkuc3RhcnRfZGlzY292ZXJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAic3RvcCIgPT4gewotICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcl9kYnVzLmFzX3JlZigpLnVud3JhcCgpLmNhbmNlbF9kaXNjb3ZlcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgIHByaW50bG4hKCJJbnZhbGlkIGFyZ3VtZW50ICd7fSciLCBhcmdzWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gY21kX2JvbmQoJm11dCBzZWxmLCBhcmdzOiAmVmVjPFN0cmluZz4pIHsKLSAgICAgICAgaWYgIXNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcl9yZWFkeSB7Ci0gICAgICAgICAgICBzZWxmLmFkYXB0ZXJfbm90X3JlYWR5KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBlbmZvcmNlX2FyZ19sZW4oYXJncywgMiwgImJvbmQgPGFkZHxyZW1vdmV8Y2FuY2VsPiA8YWRkcmVzcz4iLCB8fCBtYXRjaCAmYXJnc1swXVswLi5dIHsKLSAgICAgICAgICAgICJhZGQiID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgZGV2aWNlID0gQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogU3RyaW5nOjpmcm9tKCZhcmdzWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nOjpmcm9tKCJDbGFzc2ljIERldmljZSIpLAotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICBsZXQgYm9uZGluZ19hdHRlbXB0ID0KLSAgICAgICAgICAgICAgICAgICAgJnNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYm9uZGluZ19hdHRlbXB0LmFzX3JlZigpLmNsb25lZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgYm9uZGluZ19hdHRlbXB0LmlzX3NvbWUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8hKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFscmVhZHkgYm9uZGluZyBbe31dLiBDYW5jZWwgYm9uZGluZyBmaXJzdC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9uZGluZ19hdHRlbXB0LmFzX3JlZigpLnVud3JhcCgpLmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZXQgc3VjY2VzcyA9IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmxvY2soKQotICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkYXB0ZXJfZGJ1cwotICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVfYm9uZChkZXZpY2UuY2xvbmUoKSwgQnRUcmFuc3BvcnQ6OkF1dG8pOwotCi0gICAgICAgICAgICAgICAgaWYgc3VjY2VzcyB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuYm9uZGluZ19hdHRlbXB0ID0gU29tZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICJyZW1vdmUiID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgZGV2aWNlID0gQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogU3RyaW5nOjpmcm9tKCZhcmdzWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nOjpmcm9tKCJDbGFzc2ljIERldmljZSIpLAotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQubG9jaygpLnVud3JhcCgpLmFkYXB0ZXJfZGJ1cy5hc19yZWYoKS51bndyYXAoKS5yZW1vdmVfYm9uZChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgImNhbmNlbCIgPT4gewotICAgICAgICAgICAgICAgIGxldCBkZXZpY2UgPSBCbHVldG9vdGhEZXZpY2UgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBTdHJpbmc6OmZyb20oJmFyZ3NbMV0pLAotICAgICAgICAgICAgICAgICAgICBuYW1lOiBTdHJpbmc6OmZyb20oIkNsYXNzaWMgRGV2aWNlIiksCi0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dAotICAgICAgICAgICAgICAgICAgICAubG9jaygpCi0gICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAuYWRhcHRlcl9kYnVzCi0gICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQotICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgLmNhbmNlbF9ib25kX3Byb2Nlc3MoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgIHByaW50bG4hKCJJbnZhbGlkIGFyZ3VtZW50ICd7fSciLCBhcmdzWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gY21kX2RldmljZSgmbXV0IHNlbGYsIGFyZ3M6ICZWZWM8U3RyaW5nPikgewotICAgICAgICBpZiAhc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX3JlYWR5IHsKLSAgICAgICAgICAgIHNlbGYuYWRhcHRlcl9ub3RfcmVhZHkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGVuZm9yY2VfYXJnX2xlbihhcmdzLCAyLCAiZGV2aWNlIDxjb25uZWN0fGRpc2Nvbm5lY3R8aW5mbz4gPGFkZHJlc3M+IiwgfHwgewotICAgICAgICAgICAgbWF0Y2ggJmFyZ3NbMF1bMC4uXSB7Ci0gICAgICAgICAgICAgICAgImNvbm5lY3QiID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IGRldmljZSA9IEJsdWV0b290aERldmljZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBTdHJpbmc6OmZyb20oJmFyZ3NbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nOjpmcm9tKCJDbGFzc2ljIERldmljZSIpLAotICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzID0gc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkYXB0ZXJfZGJ1cwotICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb25uZWN0X2FsbF9lbmFibGVkX3Byb2ZpbGVzKGRldmljZS5jbG9uZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiBzdWNjZXNzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJDb25uZWN0aW5nIHRvIHt9IiwgJmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJDYW4ndCBjb25uZWN0IHRvIHt9IiwgJmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAiZGlzY29ubmVjdCIgPT4gewotICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlID0gQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFN0cmluZzo6ZnJvbSgmYXJnc1sxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBTdHJpbmc6OmZyb20oIkNsYXNzaWMgRGV2aWNlIiksCi0gICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAuY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmxvY2soKQotICAgICAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRhcHRlcl9kYnVzCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmRpc2Nvbm5lY3RfYWxsX2VuYWJsZWRfcHJvZmlsZXMoZGV2aWNlLmNsb25lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIHN1Y2Nlc3MgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoIkRpc2Nvbm5lY3RpbmcgZnJvbSB7fSIsICZkZXZpY2UuYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiQ2FuJ3QgZGlzY29ubmVjdCBmcm9tIHt9IiwgJmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAiaW5mbyIgPT4gewotICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlID0gQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFN0cmluZzo6ZnJvbSgmYXJnc1sxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBTdHJpbmc6OmZyb20oIkNsYXNzaWMgRGV2aWNlIiksCi0gICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgbGV0IChib25kZWQsIGNvbm5lY3RlZCwgdXVpZHMpID0gewotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN0eCA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRhcHRlciA9IGN0eC5hZGFwdGVyX2RidXMuYXNfcmVmKCkudW53cmFwKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBib25kZWQgPSBhZGFwdGVyLmdldF9ib25kX3N0YXRlKGRldmljZS5jbG9uZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZWN0ZWQgPSBhZGFwdGVyLmdldF9jb25uZWN0aW9uX3N0YXRlKGRldmljZS5jbG9uZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1dWlkcyA9IGFkYXB0ZXIuZ2V0X3JlbW90ZV91dWlkcyhkZXZpY2UuY2xvbmUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIChib25kZWQsIGNvbm5lY3RlZCwgdXVpZHMpCi0gICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIkFkZHJlc3M6IHt9IiwgJmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIkJvbmRlZDoge30iLCBib25kZWQpOwotICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvISgiQ29ubmVjdGVkOiB7fSIsIGNvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8hKAotICAgICAgICAgICAgICAgICAgICAgICAgIlV1aWRzOiB7fSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAofCZ4fCBVdWlkSGVscGVyOjp0b19zdHJpbmcoJngpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxTdHJpbmc+PigpCi0gICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiSW52YWxpZCBhcmd1bWVudCAne30nIiwgYXJnc1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBjbWRfZmxvc3MoJm11dCBzZWxmLCBhcmdzOiAmVmVjPFN0cmluZz4pIHsKLSAgICAgICAgZW5mb3JjZV9hcmdfbGVuKGFyZ3MsIDEsICJmbG9zcyA8ZW5hYmxlfGRpc2FibGU+IiwgfHwgbWF0Y2ggJmFyZ3NbMF1bMC4uXSB7Ci0gICAgICAgICAgICAiZW5hYmxlIiA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5tYW5hZ2VyX2RidXMuc2V0X2Zsb3NzX2VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAiZGlzYWJsZSIgPT4gewotICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkubWFuYWdlcl9kYnVzLnNldF9mbG9zc19lbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICJzaG93IiA9PiB7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoCi0gICAgICAgICAgICAgICAgICAgICJGbG9zcyBlbmFibGVkOiB7fSIsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkubWFuYWdlcl9kYnVzLmdldF9mbG9zc19lbmFibGVkKCkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgXyA9PiB7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbiEoIkludmFsaWQgYXJndW1lbnQgJ3t9JyIsIGFyZ3NbMF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBjbWRfZ2F0dCgmbXV0IHNlbGYsIGFyZ3M6ICZWZWM8U3RyaW5nPikgewotICAgICAgICBpZiAhc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX3JlYWR5IHsKLSAgICAgICAgICAgIHNlbGYuYWRhcHRlcl9ub3RfcmVhZHkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGVuZm9yY2VfYXJnX2xlbihhcmdzLCAxLCAiZ2F0dCA8Y29tbWFuZHM+IiwgfHwgbWF0Y2ggJmFyZ3NbMF1bMC4uXSB7Ci0gICAgICAgICAgICAicmVnaXN0ZXItY2xpZW50IiA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5nYXR0X2RidXMuYXNfbXV0KCkudW53cmFwKCkucmVnaXN0ZXJfY2xpZW50KAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OmZyb20oR0FUVF9DTElFTlRfQVBQX1VVSUQpLAotICAgICAgICAgICAgICAgICAgICBCb3g6Om5ldyhCdEdhdHRDYWxsYmFjazo6bmV3KAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCIvb3JnL2Nocm9taXVtL2JsdWV0b290aC9jbGllbnQvYmx1ZXRvb3RoX2dhdHRfY2FsbGJhY2siKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC5jbG9uZSgpLAotICAgICAgICAgICAgICAgICAgICApKSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICJjbGllbnQtY29ubmVjdCIgPT4gewotICAgICAgICAgICAgICAgIGlmIGFyZ3MubGVuKCkgPCAyIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoInVzYWdlOiBnYXR0IGNsaWVudC1jb25uZWN0IDxhZGRyPiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZ2F0dF9jbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgaWYgY2xpZW50X2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJHQVRUIGNsaWVudCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZXQgYWRkciA9IFN0cmluZzo6ZnJvbSgmYXJnc1sxXSk7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5nYXR0X2RidXMuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50X2Nvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZC51bndyYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAiY2xpZW50LXJlYWQtcGh5IiA9PiB7Ci0gICAgICAgICAgICAgICAgaWYgYXJncy5sZW4oKSA8IDIgewotICAgICAgICAgICAgICAgICAgICBwcmludGxuISgidXNhZ2U6IGdhdHQgY2xpZW50LXJlYWQtcGh5IDxhZGRyPiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZ2F0dF9jbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgaWYgY2xpZW50X2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJHQVRUIGNsaWVudCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZXQgYWRkciA9IFN0cmluZzo6ZnJvbSgmYXJnc1sxXSk7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgIC5nYXR0X2RidXMKLSAgICAgICAgICAgICAgICAgICAgLmFzX211dCgpCi0gICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAuY2xpZW50X3JlYWRfcGh5KGNsaWVudF9pZC51bndyYXAoKSwgYWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAiY2xpZW50LWRpc2NvdmVyLXNlcnZpY2VzIiA9PiB7Ci0gICAgICAgICAgICAgICAgaWYgYXJncy5sZW4oKSA8IDIgewotICAgICAgICAgICAgICAgICAgICBwcmludGxuISgidXNhZ2U6IGdhdHQgY2xpZW50LWRpc2NvdmVyLXNlcnZpY2VzIDxhZGRyPiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZ2F0dF9jbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgaWYgY2xpZW50X2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJHQVRUIGNsaWVudCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZXQgYWRkciA9IFN0cmluZzo6ZnJvbSgmYXJnc1sxXSk7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgIC5nYXR0X2RidXMKLSAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAuZGlzY292ZXJfc2VydmljZXMoY2xpZW50X2lkLnVud3JhcCgpLCBhZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgIHByaW50bG4hKCJJbnZhbGlkIGFyZ3VtZW50ICd7fSciLCBhcmdzWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vIEdldCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgc3VwcG9ydGVkIGNvbW1hbmRzCi0gICAgcHViIGZuIGdldF9jb21tYW5kX2xpc3QoJnNlbGYpIC0+IFZlYzxTdHJpbmc+IHsKLSAgICAgICAgc2VsZi5jb21tYW5kX29wdGlvbnMua2V5cygpLm1hcCh8a2V5fCBTdHJpbmc6OmZyb20oa2V5KSkuY29sbGVjdDo6PFZlYzxTdHJpbmc+PigpCi0gICAgfQotCi0gICAgZm4gY21kX2xpc3RfZGV2aWNlcygmbXV0IHNlbGYsIGFyZ3M6ICZWZWM8U3RyaW5nPikgewotICAgICAgICBpZiAhc2VsZi5jb250ZXh0LmxvY2soKS51bndyYXAoKS5hZGFwdGVyX3JlYWR5IHsKLSAgICAgICAgICAgIHNlbGYuYWRhcHRlcl9ub3RfcmVhZHkoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGVuZm9yY2VfYXJnX2xlbihhcmdzLCAxLCAibGlzdCA8Ym9uZGVkfGZvdW5kPiIsIHx8IG1hdGNoICZhcmdzWzBdWzAuLl0gewotICAgICAgICAgICAgImJvbmRlZCIgPT4gewotICAgICAgICAgICAgICAgIHByaW50X2luZm8hKCJLbm93biBib25kZWQgZGV2aWNlczoiKTsKLSAgICAgICAgICAgICAgICBsZXQgZGV2aWNlcyA9IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmxvY2soKQotICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkYXB0ZXJfZGJ1cwotICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRfYm9uZGVkX2RldmljZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgZGV2aWNlIGluIGRldmljZXMuaXRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIlt7OjE3fV0ge30iLCBkZXZpY2UuYWRkcmVzcywgZGV2aWNlLm5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICJmb3VuZCIgPT4gewotICAgICAgICAgICAgICAgIHByaW50X2luZm8hKCJEZXZpY2VzIGZvdW5kIGluIG1vc3QgcmVjZW50IGRpc2NvdmVyeSBzZXNzaW9uOiIpOwotICAgICAgICAgICAgICAgIGZvciAoa2V5LCB2YWwpIGluIHNlbGYuY29udGV4dC5sb2NrKCkudW53cmFwKCkuZm91bmRfZGV2aWNlcy5pdGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvISgiW3s6MTd9XSB7fSIsIGtleSwgdmFsLm5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgIHByaW50bG4hKCJJbnZhbGlkIGFyZ3VtZW50ICd7fSciLCBhcmdzWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQotCi0jW2NmZyh0ZXN0KV0KLW1vZCB0ZXN0cyB7Ci0KLSAgICB1c2Ugc3VwZXI6Oio7Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF93cmFwX2hlbHBfdGV4dCgpIHsKLSAgICAgICAgbGV0IHRleHQgPSAiaGVsbG8iOwotICAgICAgICBsZXQgdGV4dF9sZW4gPSB0ZXh0LmNoYXJzKCkuY291bnQoKTsKLSAgICAgICAgLy8gZW5zdXJlIG5vIG92ZXJmbG93Ci0gICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgifHt9fCIsIHRleHQpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA0LCAwKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgifHt9fCIsIHRleHQpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA1LCAwKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgifHt9e318IiwgdGV4dCwgIiAiKSwgd3JhcF9oZWxwX3RleHQodGV4dCwgNiwgMCkpOwotICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoInx7fXt9fCIsIHRleHQsICIgIi5yZXBlYXQoMikpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA3LCAwKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoCi0gICAgICAgICAgICBmb3JtYXQhKCJ8e317fXwiLCB0ZXh0LCAiICIucmVwZWF0KDEwMCAtIHRleHRfbGVuKSksCi0gICAgICAgICAgICB3cmFwX2hlbHBfdGV4dCh0ZXh0LCAxMDAsIDApCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgifHt9e318IiwgIiAiLCB0ZXh0KSwgd3JhcF9oZWxwX3RleHQodGV4dCwgNCwgMSkpOwotICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoInx7fXt9fCIsICIgIi5yZXBlYXQoMiksIHRleHQpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA1LCAyKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgifHt9e317fXwiLCAiICIucmVwZWF0KDMpLCB0ZXh0LCAiICIpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA2LCAzKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoCi0gICAgICAgICAgICBmb3JtYXQhKCJ8e317fXt9fCIsICIgIi5yZXBlYXQoNCksIHRleHQsICIgIi5yZXBlYXQoNyAtIHRleHRfbGVuKSksCi0gICAgICAgICAgICB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA3LCA0KQotICAgICAgICApOwotICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoInx7fXt9fCIsICIgIi5yZXBlYXQoOSksIHRleHQpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCA0LCA5KSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgifHt9e318IiwgIiAiLnJlcGVhdCgxMCksIHRleHQpLCB3cmFwX2hlbHBfdGV4dCh0ZXh0LCAzLCAxMCkpOwotICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoInx7fXt9fCIsICIgIi5yZXBlYXQoMTEpLCB0ZXh0KSwgd3JhcF9oZWxwX3RleHQodGV4dCwgMiwgMTEpKTsKLSAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ8e317fXwiLCAiICIucmVwZWF0KDEyKSwgdGV4dCksIHdyYXBfaGVscF90ZXh0KHRleHQsIDEsIDEyKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoInx8Iiwgd3JhcF9oZWxwX3RleHQoIiIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0X2VxISgifCB8Iiwgd3JhcF9oZWxwX3RleHQoIiIsIDEsIDApKTsKLSAgICAgICAgYXNzZXJ0X2VxISgifCAgfCIsIHdyYXBfaGVscF90ZXh0KCIiLCAxLCAxKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoInwgfCIsIHdyYXBfaGVscF90ZXh0KCIiLCAwLCAxKSk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHRlc3RfZW5mb3JjZV9hcmdfbGVuKCkgewotICAgICAgICAvLyBXaXRoIG1pbiBhcmcgc2V0IGFuZCBtaW4gYXJnIHN1cHBsaWVkCi0gICAgICAgIGxldCBhcmdzOiAmVmVjPFN0cmluZz4gPSAmdmVjIVtTdHJpbmc6OmZyb20oImFyZyIpXTsKLSAgICAgICAgbGV0IG11dCBpOiB1c2l6ZSA9IDA7Ci0gICAgICAgIGVuZm9yY2VfYXJnX2xlbihhcmdzLCAxLCAiaGVscCB0ZXh0IiwgfHwgewotICAgICAgICAgICAgaSA9IDE7Ci0gICAgICAgIH0pOwotICAgICAgICBhc3NlcnRfZXEhKDEsIGkpOwotCi0gICAgICAgIC8vIFdpdGggbm8gbWluIGFyZyBzZXQgYW5kIHdpdGggYXJnIHN1cHBsaWVkCi0gICAgICAgIGkgPSAwOwotICAgICAgICBlbmZvcmNlX2FyZ19sZW4oYXJncywgMCwgImhlbHAgdGV4dCIsIHx8IHsKLSAgICAgICAgICAgIGkgPSAxOwotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0X2VxISgxLCBpKTsKLQotICAgICAgICAvLyBXaXRoIG1pbiBhcmcgc2V0IGFuZCBubyBtaW4gYXJnIHN1cHBsaWVkCi0gICAgICAgIGxldCBhcmdzOiAmVmVjPFN0cmluZz4gPSAmdmVjIVtdOwotICAgICAgICBpID0gMDsKLSAgICAgICAgZW5mb3JjZV9hcmdfbGVuKGFyZ3MsIDEsICJoZWxwIHRleHQiLCB8fCB7Ci0gICAgICAgICAgICBpID0gMTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGFzc2VydF9lcSEoMCwgaSk7Ci0KLSAgICAgICAgLy8gV2l0aCBubyBtaW4gYXJnIHNldCBhbmQgbm8gYXJnIHN1cHBsaWVkCi0gICAgICAgIGkgPSAwOwotICAgICAgICBlbmZvcmNlX2FyZ19sZW4oYXJncywgMCwgImhlbHAgdGV4dCIsIHx8IHsKLSAgICAgICAgICAgIGkgPSAxOwotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0X2VxISgxLCBpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvY29uc29sZS5ycyBiL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9jb25zb2xlLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRkMTZlLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9jb25zb2xlLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8hIENvbnZlbmllbnQgZnVuY3Rpb25zIHRvIHByaW50IG1lc3NhZ2VzIHRvIGNvbnNvbGUuCi0KLSNbbWFjcm9fZXhwb3J0XQotbWFjcm9fcnVsZXMhIGNvbnNvbGVfYmx1ZSB7Ci0gICAgKCAkdGV4dDpleHByICkgPT4gewotICAgICAgICBmb3JtYXQhKCJceDFiWzE7MzRte31ceDFiWzBtIiwgJHRleHQpLmFzX3N0cigpCi0gICAgfTsKLX0KLQotI1ttYWNyb19leHBvcnRdCi1tYWNyb19ydWxlcyEgY29uc29sZV95ZWxsb3cgewotICAgICggJHRleHQ6ZXhwciApID0+IHsKLSAgICAgICAgZm9ybWF0ISgiXHgxYlsxOzMzbXt9XHgxYlswbSIsICR0ZXh0KS5hc19zdHIoKQotICAgIH07Ci19Ci0KLSNbbWFjcm9fZXhwb3J0XQotbWFjcm9fcnVsZXMhIGNvbnNvbGVfcmVkIHsKLSAgICAoICR0ZXh0OmV4cHIgKSA9PiB7Ci0gICAgICAgIGZvcm1hdCEoIlx4MWJbMTszMW17fVx4MWJbMG0iLCAkdGV4dCkuYXNfc3RyKCkKLSAgICB9OwotfQotCi0jW21hY3JvX2V4cG9ydF0KLW1hY3JvX3J1bGVzISBwcmludF9pbmZvIHsKLSAgICAoICQoJGFyZzp0dCkqICkgPT4gewotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludCEoInt9OiAiLCBjb25zb2xlX3llbGxvdyEoImJ0Y2xpZW50OmluZm8iKSk7Ci0gICAgICAgICAgICBwcmludGxuISgkKCRhcmcpKik7Ci0gICAgICAgIH0KLSAgICB9OwotfQotCi0jW21hY3JvX2V4cG9ydF0KLW1hY3JvX3J1bGVzISBwcmludF9lcnJvciB7Ci0gICAgKCAkKCRhcmc6dHQpKiApID0+IHsKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnQhKCJ7fTogIiwgY29uc29sZV9yZWQhKCJidGNsaWVudDplcnJvciIpKTsKLSAgICAgICAgICAgIHByaW50bG4hKCQoJGFyZykqKTsKLSAgICAgICAgfQotICAgIH07Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvZGJ1c19hcmcucnMgYi9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvZGJ1c19hcmcucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzI0YWEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9jbGllbnQvc3JjL2RidXNfYXJnLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi11c2UgZGJ1c19tYWNyb3M6OmdlbmVyYXRlX2RidXNfYXJnOwotCi1nZW5lcmF0ZV9kYnVzX2FyZyEoKTsKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9kYnVzX2lmYWNlLnJzIGIvZ2QvcnVzdC9saW51eC9jbGllbnQvc3JjL2RidXNfaWZhY2UucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTczNmUuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9jbGllbnQvc3JjL2RidXNfaWZhY2UucnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODIgKzAsMCBAQAotLy8hIEQtQnVzIHByb3h5IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgQVBJcy4KLQotdXNlIGJ0X3RvcHNoaW06OmJ0aWY6OntCdFNzcFZhcmlhbnQsIEJ0VHJhbnNwb3J0LCBVdWlkMTI4Qml0fTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6Z2F0dDo6R2F0dFN0YXR1czsKLQotdXNlIGJ0c3RhY2s6OmJsdWV0b290aDo6ewotICAgIEJsdWV0b290aERldmljZSwgSUJsdWV0b290aCwgSUJsdWV0b290aENhbGxiYWNrLCBJQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrLAotfTsKLXVzZSBidHN0YWNrOjpibHVldG9vdGhfZ2F0dDo6ewotICAgIEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYywgQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IsIEJsdWV0b290aEdhdHRTZXJ2aWNlLAotICAgIEdhdHRXcml0ZVJlcXVlc3RTdGF0dXMsIEdhdHRXcml0ZVR5cGUsIElCbHVldG9vdGhHYXR0LCBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrLAotICAgIElTY2FubmVyQ2FsbGJhY2ssIExlUGh5LCBTY2FuRmlsdGVyLCBTY2FuU2V0dGluZ3MsCi19OwotCi11c2UgZGJ1czo6YXJnOjp7QXBwZW5kQWxsLCBSZWZBcmd9OwotdXNlIGRidXM6Om5vbmJsb2NrOjpTeW5jQ29ubmVjdGlvbjsKLQotdXNlIGRidXNfY3Jvc3Nyb2Fkczo6Q3Jvc3Nyb2FkczsKLQotdXNlIGRidXNfcHJvamVjdGlvbjo6e2ltcGxfZGJ1c19hcmdfZW51bSwgRGlzY29ubmVjdFdhdGNoZXJ9OwotCi11c2UgZGJ1c19tYWNyb3M6OntkYnVzX21ldGhvZCwgZGJ1c19wcm9wbWFwLCBnZW5lcmF0ZV9kYnVzX2V4cG9ydGVyfTsKLQotdXNlIG1hbmFnZXJfc2VydmljZTo6aWZhY2VfYmx1ZXRvb3RoX21hbmFnZXI6OnsKLSAgICBBZGFwdGVyV2l0aEVuYWJsZWQsIElCbHVldG9vdGhNYW5hZ2VyLCBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrLAotfTsKLQotdXNlIG51bV90cmFpdHM6OntGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZX07Ci0KLXVzZSBzdGQ6OmNvbnZlcnQ6OlRyeUludG87Ci11c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Ci0KLXVzZSBjcmF0ZTo6ZGJ1c19hcmc6OntEQnVzQXJnLCBEQnVzQXJnRXJyb3IsIFJlZkFyZ1RvUnVzdH07Ci0KLWZuIG1ha2Vfb2JqZWN0X3BhdGgoaWR4OiBpMzIsIG5hbWU6ICZzdHIpIC0+IGRidXM6OlBhdGggewotICAgIGRidXM6OlBhdGg6Om5ldyhmb3JtYXQhKCIvb3JnL2Nocm9taXVtL2JsdWV0b290aC9oY2l7fS97fSIsIGlkeCwgbmFtZSkpLnVud3JhcCgpCi19Ci0KLWltcGxfZGJ1c19hcmdfZW51bSEoQnRUcmFuc3BvcnQpOwotaW1wbF9kYnVzX2FyZ19lbnVtIShCdFNzcFZhcmlhbnQpOwotaW1wbF9kYnVzX2FyZ19lbnVtIShHYXR0U3RhdHVzKTsKLWltcGxfZGJ1c19hcmdfZW51bSEoR2F0dFdyaXRlVHlwZSk7Ci1pbXBsX2RidXNfYXJnX2VudW0hKExlUGh5KTsKLQotLy8gUmVwcmVzZW50cyBVdWlkMTI4Qml0IGFzIGFuIGFycmF5IGluIEQtQnVzLgotaW1wbCBEQnVzQXJnIGZvciBVdWlkMTI4Qml0IHsKLSAgICB0eXBlIERCdXNUeXBlID0gVmVjPHU4PjsKLQotICAgIGZuIGZyb21fZGJ1cygKLSAgICAgICAgZGF0YTogVmVjPHU4PiwKLSAgICAgICAgX2Nvbm46IE9wdGlvbjxBcmM8U3luY0Nvbm5lY3Rpb24+PiwKLSAgICAgICAgX3JlbW90ZTogT3B0aW9uPGRidXM6OnN0cmluZ3M6OkJ1c05hbWU8J3N0YXRpYz4+LAotICAgICAgICBfZGlzY29ubmVjdF93YXRjaGVyOiBPcHRpb248QXJjPHN0ZDo6c3luYzo6TXV0ZXg8RGlzY29ubmVjdFdhdGNoZXI+Pj4sCi0gICAgKSAtPiBSZXN1bHQ8W3U4OyAxNl0sIEJveDxkeW4gc3RkOjplcnJvcjo6RXJyb3I+PiB7Ci0gICAgICAgIHJldHVybiBPayhkYXRhLnRyeV9pbnRvKCkudW53cmFwKCkpOwotICAgIH0KLQotICAgIGZuIHRvX2RidXMoZGF0YTogW3U4OyAxNl0pIC0+IFJlc3VsdDxWZWM8dTg+LCBCb3g8ZHluIHN0ZDo6ZXJyb3I6OkVycm9yPj4gewotICAgICAgICByZXR1cm4gT2soZGF0YS50b192ZWMoKSk7Ci0gICAgfQotfQotCi0jW2RidXNfcHJvcG1hcChCbHVldG9vdGhHYXR0RGVzY3JpcHRvcildCi1wdWIgc3RydWN0IEJsdWV0b290aEdhdHREZXNjcmlwdG9yREJ1cyB7Ci0gICAgdXVpZDogVXVpZDEyOEJpdCwKLSAgICBpbnN0YW5jZV9pZDogaTMyLAotICAgIHBlcm1pc3Npb25zOiBpMzIsCi19Ci0KLSNbZGJ1c19wcm9wbWFwKEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyldCi1wdWIgc3RydWN0IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpY0RCdXMgewotICAgIHV1aWQ6IFV1aWQxMjhCaXQsCi0gICAgaW5zdGFuY2VfaWQ6IGkzMiwKLSAgICBwcm9wZXJ0aWVzOiBpMzIsCi0gICAgcGVybWlzc2lvbnM6IGkzMiwKLSAgICBrZXlfc2l6ZTogaTMyLAotICAgIHdyaXRlX3R5cGU6IEdhdHRXcml0ZVR5cGUsCi0gICAgZGVzY3JpcHRvcnM6IFZlYzxCbHVldG9vdGhHYXR0RGVzY3JpcHRvcj4sCi19Ci0KLSNbZGJ1c19wcm9wbWFwKEJsdWV0b290aEdhdHRTZXJ2aWNlKV0KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoR2F0dFNlcnZpY2VEQnVzIHsKLSAgICBwdWIgdXVpZDogVXVpZDEyOEJpdCwKLSAgICBwdWIgaW5zdGFuY2VfaWQ6IGkzMiwKLSAgICBwdWIgc2VydmljZV90eXBlOiBpMzIsCi0gICAgcHViIGNoYXJhY3RlcmlzdGljczogVmVjPEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYz4sCi0gICAgcHViIGluY2x1ZGVkX3NlcnZpY2VzOiBWZWM8Qmx1ZXRvb3RoR2F0dFNlcnZpY2U+LAotfQotCi0jW2RidXNfcHJvcG1hcChCbHVldG9vdGhEZXZpY2UpXQotcHViIHN0cnVjdCBCbHVldG9vdGhEZXZpY2VEQnVzIHsKLSAgICBhZGRyZXNzOiBTdHJpbmcsCi0gICAgbmFtZTogU3RyaW5nLAotfQotCi1zdHJ1Y3QgQ2xpZW50REJ1c1Byb3h5IHsKLSAgICBjb25uOiBBcmM8U3luY0Nvbm5lY3Rpb24+LAotICAgIGNyOiBBcmM8TXV0ZXg8Q3Jvc3Nyb2Fkcz4+LAotICAgIGJ1c19uYW1lOiBTdHJpbmcsCi0gICAgb2JqcGF0aDogZGJ1czo6UGF0aDwnc3RhdGljPiwKLSAgICBpbnRlcmZhY2U6IFN0cmluZywKLX0KLQotaW1wbCBDbGllbnREQnVzUHJveHkgewotICAgIGZuIGNyZWF0ZV9wcm94eSgmc2VsZikgLT4gZGJ1czo6bm9uYmxvY2s6OlByb3h5PEFyYzxTeW5jQ29ubmVjdGlvbj4+IHsKLSAgICAgICAgbGV0IGNvbm4gPSBzZWxmLmNvbm4uY2xvbmUoKTsKLSAgICAgICAgZGJ1czo6bm9uYmxvY2s6OlByb3h5OjpuZXcoCi0gICAgICAgICAgICBzZWxmLmJ1c19uYW1lLmNsb25lKCksCi0gICAgICAgICAgICBzZWxmLm9ianBhdGguY2xvbmUoKSwKLSAgICAgICAgICAgIHN0ZDo6dGltZTo6RHVyYXRpb246OmZyb21fc2VjcygyKSwKLSAgICAgICAgICAgIGNvbm4sCi0gICAgICAgICkKLSAgICB9Ci0KLSAgICAvLy8gQ2FsbHMgYSBtZXRob2QgYW5kIHJldHVybnMgdGhlIGRidXMgcmVzdWx0LgotICAgIGZuIG1ldGhvZF93aXRocmVzdWx0PEE6IEFwcGVuZEFsbCwgVDogJ3N0YXRpYyArIGRidXM6OmFyZzo6QXJnICsgZm9yPCd6PiBkYnVzOjphcmc6OkdldDwnej4+KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgbWVtYmVyOiAmc3RyLAotICAgICAgICBhcmdzOiBBLAotICAgICkgLT4gUmVzdWx0PChULCksIGRidXM6OkVycm9yPiB7Ci0gICAgICAgIGxldCBwcm94eSA9IHNlbGYuY3JlYXRlX3Byb3h5KCk7Ci0gICAgICAgIC8vIFdlIGtub3cgdGhhdCBhbGwgQVBJcyByZXR1cm4gaW1tZWRpYXRlbHksIHNvIHdlIGNhbiBibG9jayBvbiBpdCBmb3Igc2ltcGxpY2l0eS4KLSAgICAgICAgcmV0dXJuIGZ1dHVyZXM6OmV4ZWN1dG9yOjpibG9ja19vbihhc3luYyB7Ci0gICAgICAgICAgICBwcm94eS5tZXRob2RfY2FsbChzZWxmLmludGVyZmFjZS5jbG9uZSgpLCBtZW1iZXIsIGFyZ3MpLmF3YWl0Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIGZuIG1ldGhvZDxBOiBBcHBlbmRBbGwsIFQ6ICdzdGF0aWMgKyBkYnVzOjphcmc6OkFyZyArIGZvcjwnej4gZGJ1czo6YXJnOjpHZXQ8J3o+PigKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIG1lbWJlcjogJnN0ciwKLSAgICAgICAgYXJnczogQSwKLSAgICApIC0+IFQgewotICAgICAgICBsZXQgKHJldCwpOiAoVCwpID0gc2VsZi5tZXRob2Rfd2l0aHJlc3VsdChtZW1iZXIsIGFyZ3MpLnVud3JhcCgpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGZuIG1ldGhvZF9ub3JldHVybjxBOiBBcHBlbmRBbGw+KCZzZWxmLCBtZW1iZXI6ICZzdHIsIGFyZ3M6IEEpIHsKLSAgICAgICAgLy8gVGhlIHJlYWwgdHlwZSBzaG91bGQgYmUgUmVzdWx0PCgoKSwpLCBfPiBzaW5jZSB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUuIEhvd2V2ZXIsIHRvCi0gICAgICAgIC8vIG1lZXQgdHJhaXQgY29uc3RyYWludHMsIHdlIGp1c3QgdXNlIGJvb2wgYW5kIG5ldmVyIHVud3JhcCB0aGUgcmVzdWx0LiBUaGlzIGNhbGxzIHRoZQotICAgICAgICAvLyBtZXRob2QsIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgYXR0ZW1wdCB0byBwYXJzZSB0aGUgcmVzdWx0IChvbgotICAgICAgICAvLyB1bndyYXApLgotICAgICAgICBsZXQgXzogUmVzdWx0PChib29sLCksIF8+ID0gc2VsZi5tZXRob2Rfd2l0aHJlc3VsdChtZW1iZXIsIGFyZ3MpOwotICAgIH0KLX0KLQotI1thbGxvdyhkZWFkX2NvZGUpXQotc3RydWN0IElCbHVldG9vdGhDYWxsYmFja0RCdXMge30KLQotaW1wbCBidHN0YWNrOjpSUENQcm94eSBmb3IgSUJsdWV0b290aENhbGxiYWNrREJ1cyB7Ci0gICAgLy8gRHVtbXkgaW1wbGVtZW50YXRpb25zIGp1c3QgdG8gc2F0aXNmeSBpbXBsIFJQQ1Byb3h5IHJlcXVpcmVtZW50cy4KLSAgICBmbiByZWdpc3Rlcl9kaXNjb25uZWN0KCZtdXQgc2VsZiwgX2Y6IEJveDxkeW4gRm4odTMyKSArIFNlbmQ+KSAtPiB1MzIgewotICAgICAgICAwCi0gICAgfQotICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgIFN0cmluZzo6ZnJvbSgiIikKLSAgICB9Ci0gICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIF9pZDogdTMyKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci19Ci0KLSNbZ2VuZXJhdGVfZGJ1c19leHBvcnRlcigKLSAgICBleHBvcnRfYmx1ZXRvb3RoX2NhbGxiYWNrX2RidXNfb2JqLAotICAgICJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLkJsdWV0b290aENhbGxiYWNrIgotKV0KLWltcGwgSUJsdWV0b290aENhbGxiYWNrIGZvciBJQmx1ZXRvb3RoQ2FsbGJhY2tEQnVzIHsKLSAgICAjW2RidXNfbWV0aG9kKCJPbkFkZHJlc3NDaGFuZ2VkIildCi0gICAgZm4gb25fYWRkcmVzc19jaGFuZ2VkKCZzZWxmLCBhZGRyOiBTdHJpbmcpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkRldmljZUZvdW5kIildCi0gICAgZm4gb25fZGV2aWNlX2ZvdW5kKCZzZWxmLCByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkRpc2NvdmVyaW5nQ2hhbmdlZCIpXQotICAgIGZuIG9uX2Rpc2NvdmVyaW5nX2NoYW5nZWQoJnNlbGYsIGRpc2NvdmVyaW5nOiBib29sKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25Tc3BSZXF1ZXN0IildCi0gICAgZm4gb25fc3NwX3JlcXVlc3QoCi0gICAgICAgICZzZWxmLAotICAgICAgICByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsCi0gICAgICAgIGNvZDogdTMyLAotICAgICAgICB2YXJpYW50OiBCdFNzcFZhcmlhbnQsCi0gICAgICAgIHBhc3NrZXk6IHUzMiwKLSAgICApIHsKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkJvbmRTdGF0ZUNoYW5nZWQiKV0KLSAgICBmbiBvbl9ib25kX3N0YXRlX2NoYW5nZWQoJnNlbGYsIHN0YXR1czogdTMyLCBhZGRyZXNzOiBTdHJpbmcsIHN0YXRlOiB1MzIpIHt9Ci19Ci0KLSNbYWxsb3coZGVhZF9jb2RlKV0KLXN0cnVjdCBJQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrREJ1cyB7fQotCi1pbXBsIGJ0c3RhY2s6OlJQQ1Byb3h5IGZvciBJQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrREJ1cyB7Ci0gICAgLy8gRHVtbXkgaW1wbGVtZW50YXRpb25zIGp1c3QgdG8gc2F0aXNmeSBpbXBsIFJQQ1Byb3h5IHJlcXVpcmVtZW50cy4KLSAgICBmbiByZWdpc3Rlcl9kaXNjb25uZWN0KCZtdXQgc2VsZiwgX2Y6IEJveDxkeW4gRm4odTMyKSArIFNlbmQ+KSAtPiB1MzIgewotICAgICAgICAwCi0gICAgfQotICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgIFN0cmluZzo6ZnJvbSgiIikKLSAgICB9Ci0gICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIF9pZDogdTMyKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci19Ci0KLSNbZ2VuZXJhdGVfZGJ1c19leHBvcnRlcigKLSAgICBleHBvcnRfYmx1ZXRvb3RoX2Nvbm5lY3Rpb25fY2FsbGJhY2tfZGJ1c19vYmosCi0gICAgIm9yZy5jaHJvbWl1bS5ibHVldG9vdGguQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrIgotKV0KLWltcGwgSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayBmb3IgSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFja0RCdXMgewotICAgICNbZGJ1c19tZXRob2QoIk9uRGV2aWNlQ29ubmVjdGVkIildCi0gICAgZm4gb25fZGV2aWNlX2Nvbm5lY3RlZCgmc2VsZiwgcmVtb3RlX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25EZXZpY2VEaXNjb25uZWN0ZWQiKV0KLSAgICBmbiBvbl9kZXZpY2VfZGlzY29ubmVjdGVkKCZzZWxmLCByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIHt9Ci19Ci0KLXB1YihjcmF0ZSkgc3RydWN0IEJsdWV0b290aERCdXMgewotICAgIGNsaWVudF9wcm94eTogQ2xpZW50REJ1c1Byb3h5LAotfQotCi1pbXBsIEJsdWV0b290aERCdXMgewotICAgIHB1YihjcmF0ZSkgZm4gbmV3KAotICAgICAgICBjb25uOiBBcmM8U3luY0Nvbm5lY3Rpb24+LAotICAgICAgICBjcjogQXJjPE11dGV4PENyb3Nzcm9hZHM+PiwKLSAgICAgICAgaW5kZXg6IGkzMiwKLSAgICApIC0+IEJsdWV0b290aERCdXMgewotICAgICAgICBCbHVldG9vdGhEQnVzIHsKLSAgICAgICAgICAgIGNsaWVudF9wcm94eTogQ2xpZW50REJ1c1Byb3h5IHsKLSAgICAgICAgICAgICAgICBjb25uOiBjb25uLmNsb25lKCksCi0gICAgICAgICAgICAgICAgY3I6IGNyLAotICAgICAgICAgICAgICAgIGJ1c19uYW1lOiBTdHJpbmc6OmZyb20oIm9yZy5jaHJvbWl1bS5ibHVldG9vdGgiKSwKLSAgICAgICAgICAgICAgICBvYmpwYXRoOiBtYWtlX29iamVjdF9wYXRoKGluZGV4LCAiYWRhcHRlciIpLAotICAgICAgICAgICAgICAgIGludGVyZmFjZTogU3RyaW5nOjpmcm9tKCJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLkJsdWV0b290aCIpLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETyhiLzIwMDczMjA4MCk6IFRoZXNlIGFyZSBib2lsZXJwbGF0ZSBjb2RlcywgY29uc2lkZXIgY3JlYXRpbmcgYSBtYWNybyB0byBnZW5lcmF0ZS4KLWltcGwgSUJsdWV0b290aCBmb3IgQmx1ZXRvb3RoREJ1cyB7Ci0gICAgZm4gcmVnaXN0ZXJfY2FsbGJhY2soJm11dCBzZWxmLCBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoQ2FsbGJhY2sgKyBTZW5kPikgewotICAgICAgICBsZXQgcGF0aF9zdHJpbmcgPSBjYWxsYmFjay5nZXRfb2JqZWN0X2lkKCk7Ci0gICAgICAgIGxldCBwYXRoID0gZGJ1czo6UGF0aDo6bmV3KHBhdGhfc3RyaW5nLmNsb25lKCkpLnVud3JhcCgpOwotICAgICAgICBleHBvcnRfYmx1ZXRvb3RoX2NhbGxiYWNrX2RidXNfb2JqKAotICAgICAgICAgICAgcGF0aF9zdHJpbmcsCi0gICAgICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5jb25uLmNsb25lKCksCi0gICAgICAgICAgICAmbXV0IHNlbGYuY2xpZW50X3Byb3h5LmNyLmxvY2soKS51bndyYXAoKSwKLSAgICAgICAgICAgIEFyYzo6bmV3KE11dGV4OjpuZXcoY2FsbGJhY2spKSwKLSAgICAgICAgICAgIEFyYzo6bmV3KE11dGV4OjpuZXcoRGlzY29ubmVjdFdhdGNoZXI6Om5ldygpKSksCi0gICAgICAgICk7Ci0KLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKCJSZWdpc3RlckNhbGxiYWNrIiwgKHBhdGgsKSkKLSAgICB9Ci0KLSAgICBmbiByZWdpc3Rlcl9jb25uZWN0aW9uX2NhbGxiYWNrKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGNhbGxiYWNrOiBCb3g8ZHluIElCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2sgKyBTZW5kPiwKLSAgICApIC0+IHUzMiB7Ci0gICAgICAgIGxldCBwYXRoX3N0cmluZyA9IGNhbGxiYWNrLmdldF9vYmplY3RfaWQoKTsKLSAgICAgICAgbGV0IHBhdGggPSBkYnVzOjpQYXRoOjpuZXcocGF0aF9zdHJpbmcuY2xvbmUoKSkudW53cmFwKCk7Ci0gICAgICAgIGV4cG9ydF9ibHVldG9vdGhfY29ubmVjdGlvbl9jYWxsYmFja19kYnVzX29iaigKLSAgICAgICAgICAgIHBhdGhfc3RyaW5nLAotICAgICAgICAgICAgc2VsZi5jbGllbnRfcHJveHkuY29ubi5jbG9uZSgpLAotICAgICAgICAgICAgJm11dCBzZWxmLmNsaWVudF9wcm94eS5jci5sb2NrKCkudW53cmFwKCksCi0gICAgICAgICAgICBBcmM6Om5ldyhNdXRleDo6bmV3KGNhbGxiYWNrKSksCi0gICAgICAgICAgICBBcmM6Om5ldyhNdXRleDo6bmV3KERpc2Nvbm5lY3RXYXRjaGVyOjpuZXcoKSkpLAotICAgICAgICApOwotCi0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZCgiUmVnaXN0ZXJDb25uZWN0aW9uQ2FsbGJhY2siLCAocGF0aCwpKQotICAgIH0KLQotICAgIGZuIHVucmVnaXN0ZXJfY29ubmVjdGlvbl9jYWxsYmFjaygmbXV0IHNlbGYsIGlkOiB1MzIpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIlVucmVnaXN0ZXJDb25uZWN0aW9uQ2FsbGJhY2siLCAoaWQsKSkKLSAgICB9Ci0KLSAgICBmbiBlbmFibGUoJm11dCBzZWxmKSAtPiBib29sIHsKLSAgICAgICAgLy8gTm90IGltcGxlbWVudGVkIGJ5IHNlcnZlcgotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgZm4gZGlzYWJsZSgmbXV0IHNlbGYpIC0+IGJvb2wgewotICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgYnkgc2VydmVyCi0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICBmbiBnZXRfYWRkcmVzcygmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKCJHZXRBZGRyZXNzIiwgKCkpCi0gICAgfQotCi0gICAgZm4gZ2V0X3V1aWRzKCZzZWxmKSAtPiBWZWM8VXVpZDEyOEJpdD4gewotICAgICAgICBsZXQgcmVzdWx0OiBWZWM8VmVjPHU4Pj4gPSBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIkdldFV1aWRzIiwgKCkpOwotICAgICAgICA8VmVjPFV1aWQxMjhCaXQ+IGFzIERCdXNBcmc+Ojpmcm9tX2RidXMocmVzdWx0LCBOb25lLCBOb25lLCBOb25lKS51bndyYXAoKQotICAgIH0KLQotICAgIGZuIGdldF9uYW1lKCZzZWxmKSAtPiBTdHJpbmcgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIkdldE5hbWUiLCAoKSkKLSAgICB9Ci0KLSAgICBmbiBzZXRfbmFtZSgmc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKCJTZXROYW1lIiwgKG5hbWUsKSkKLSAgICB9Ci0KLSAgICBmbiBzdGFydF9kaXNjb3ZlcnkoJnNlbGYpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIlN0YXJ0RGlzY292ZXJ5IiwgKCkpCi0gICAgfQotCi0gICAgZm4gY2FuY2VsX2Rpc2NvdmVyeSgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZCgiQ2FuY2VsRGlzY292ZXJ5IiwgKCkpCi0gICAgfQotCi0gICAgZm4gaXNfZGlzY292ZXJpbmcoJnNlbGYpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIklzRGlzY292ZXJpbmciLCAoKSkKLSAgICB9Ci0KLSAgICBmbiBnZXRfZGlzY292ZXJ5X2VuZF9taWxsaXMoJnNlbGYpIC0+IHU2NCB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZCgiR2V0RGlzY292ZXJ5RW5kTWlsbGlzIiwgKCkpCi0gICAgfQotCi0gICAgZm4gY3JlYXRlX2JvbmQoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlLCB0cmFuc3BvcnQ6IEJ0VHJhbnNwb3J0KSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKAotICAgICAgICAgICAgIkNyZWF0ZUJvbmQiLAotICAgICAgICAgICAgKEJsdWV0b290aERldmljZTo6dG9fZGJ1cyhkZXZpY2UpLnVud3JhcCgpLCBCdFRyYW5zcG9ydDo6dG9fZGJ1cyh0cmFuc3BvcnQpLnVud3JhcCgpKSwKLSAgICAgICAgKQotICAgIH0KLQotICAgIGZuIGNhbmNlbF9ib25kX3Byb2Nlc3MoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKCJDYW5jZWxCb25kUHJvY2VzcyIsIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwpKQotICAgIH0KLQotICAgIGZuIHJlbW92ZV9ib25kKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZCgiUmVtb3ZlQm9uZCIsIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwpKQotICAgIH0KLQotICAgIGZuIGdldF9ib25kZWRfZGV2aWNlcygmc2VsZikgLT4gVmVjPEJsdWV0b290aERldmljZT4gewotICAgICAgICBsZXQgcHJvcHM6IFZlYzxkYnVzOjphcmc6OlByb3BNYXA+ID0gc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKCJHZXRCb25kZWREZXZpY2VzIiwgKCkpOwotICAgICAgICA8VmVjPEJsdWV0b290aERldmljZT4gYXMgREJ1c0FyZz46OmZyb21fZGJ1cyhwcm9wcywgTm9uZSwgTm9uZSwgTm9uZSkudW53cmFwKCkKLSAgICB9Ci0KLSAgICBmbiBnZXRfYm9uZF9zdGF0ZSgmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IHUzMiB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZCgiR2V0Qm9uZFN0YXRlIiwgKEJsdWV0b290aERldmljZTo6dG9fZGJ1cyhkZXZpY2UpLnVud3JhcCgpLCkpCi0gICAgfQotCi0gICAgZm4gc2V0X3Bpbigmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIGFjY2VwdDogYm9vbCwgbGVuOiB1MzIsIHBpbl9jb2RlOiBWZWM8dTg+KSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkKLSAgICAgICAgICAgIC5tZXRob2QoIlNldFBpbiIsIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwgYWNjZXB0LCBsZW4sIHBpbl9jb2RlKSkKLSAgICB9Ci0KLSAgICBmbiBzZXRfcGFzc2tleSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlLAotICAgICAgICBhY2NlcHQ6IGJvb2wsCi0gICAgICAgIGxlbjogdTMyLAotICAgICAgICBwYXNza2V5OiBWZWM8dTg+LAotICAgICkgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Ci0gICAgICAgICAgICAubWV0aG9kKCJTZXRQYXNza2V5IiwgKEJsdWV0b290aERldmljZTo6dG9fZGJ1cyhkZXZpY2UpLnVud3JhcCgpLCBhY2NlcHQsIGxlbiwgcGFzc2tleSkpCi0gICAgfQotCi0gICAgZm4gc2V0X3BhaXJpbmdfY29uZmlybWF0aW9uKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSwgYWNjZXB0OiBib29sKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkKLSAgICAgICAgICAgIC5tZXRob2QoIlNldFBhaXJpbmdDb25maXJtYXRpb24iLCAoQmx1ZXRvb3RoRGV2aWNlOjp0b19kYnVzKGRldmljZSkudW53cmFwKCksIGFjY2VwdCkpCi0gICAgfQotCi0gICAgZm4gZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiB1MzIgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIkdldENvbm5lY3Rpb25TdGF0ZSIsIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwpKQotICAgIH0KLQotICAgIGZuIGdldF9yZW1vdGVfdXVpZHMoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBWZWM8VXVpZDEyOEJpdD4gewotICAgICAgICBsZXQgcmVzdWx0OiBWZWM8VmVjPHU4Pj4gPSBzZWxmCi0gICAgICAgICAgICAuY2xpZW50X3Byb3h5Ci0gICAgICAgICAgICAubWV0aG9kKCJHZXRSZW1vdGVVdWlkcyIsIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwpKTsKLSAgICAgICAgPFZlYzxVdWlkMTI4Qml0PiBhcyBEQnVzQXJnPjo6ZnJvbV9kYnVzKHJlc3VsdCwgTm9uZSwgTm9uZSwgTm9uZSkudW53cmFwKCkKLSAgICB9Ci0KLSAgICBmbiBmZXRjaF9yZW1vdGVfdXVpZHMoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKCJGZXRjaFJlbW90ZVV1aWRzIiwgKEJsdWV0b290aERldmljZTo6dG9fZGJ1cyhkZXZpY2UpLnVud3JhcCgpLCkpCi0gICAgfQotCi0gICAgZm4gc2RwX3NlYXJjaCgmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIHV1aWQ6IFV1aWQxMjhCaXQpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoCi0gICAgICAgICAgICAiU2RwU2VhcmNoIiwKLSAgICAgICAgICAgIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwgVXVpZDEyOEJpdDo6dG9fZGJ1cyh1dWlkKS51bndyYXAoKSksCi0gICAgICAgICkKLSAgICB9Ci0KLSAgICBmbiBjb25uZWN0X2FsbF9lbmFibGVkX3Byb2ZpbGVzKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Ci0gICAgICAgICAgICAubWV0aG9kKCJDb25uZWN0QWxsRW5hYmxlZFByb2ZpbGVzIiwgKEJsdWV0b290aERldmljZTo6dG9fZGJ1cyhkZXZpY2UpLnVud3JhcCgpLCkpCi0gICAgfQotCi0gICAgZm4gZGlzY29ubmVjdF9hbGxfZW5hYmxlZF9wcm9maWxlcygmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eQotICAgICAgICAgICAgLm1ldGhvZCgiRGlzY29ubmVjdEFsbEVuYWJsZWRQcm9maWxlcyIsIChCbHVldG9vdGhEZXZpY2U6OnRvX2RidXMoZGV2aWNlKS51bndyYXAoKSwpKQotICAgIH0KLX0KLQotI1tkYnVzX3Byb3BtYXAoQWRhcHRlcldpdGhFbmFibGVkKV0KLXB1YiBzdHJ1Y3QgQWRhcHRlcldpdGhFbmFibGVkRGJ1cyB7Ci0gICAgaGNpX2ludGVyZmFjZTogaTMyLAotICAgIGVuYWJsZWQ6IGJvb2wsCi19Ci0KLXB1YihjcmF0ZSkgc3RydWN0IEJsdWV0b290aE1hbmFnZXJEQnVzIHsKLSAgICBjbGllbnRfcHJveHk6IENsaWVudERCdXNQcm94eSwKLX0KLQotaW1wbCBCbHVldG9vdGhNYW5hZ2VyREJ1cyB7Ci0gICAgcHViKGNyYXRlKSBmbiBuZXcoCi0gICAgICAgIGNvbm46IEFyYzxTeW5jQ29ubmVjdGlvbj4sCi0gICAgICAgIGNyOiBBcmM8TXV0ZXg8Q3Jvc3Nyb2Fkcz4+LAotICAgICkgLT4gQmx1ZXRvb3RoTWFuYWdlckRCdXMgewotICAgICAgICBCbHVldG9vdGhNYW5hZ2VyREJ1cyB7Ci0gICAgICAgICAgICBjbGllbnRfcHJveHk6IENsaWVudERCdXNQcm94eSB7Ci0gICAgICAgICAgICAgICAgY29ubjogY29ubi5jbG9uZSgpLAotICAgICAgICAgICAgICAgIGNyOiBjciwKLSAgICAgICAgICAgICAgICBidXNfbmFtZTogU3RyaW5nOjpmcm9tKCJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLk1hbmFnZXIiKSwKLSAgICAgICAgICAgICAgICBvYmpwYXRoOiBkYnVzOjpQYXRoOjpuZXcoIi9vcmcvY2hyb21pdW0vYmx1ZXRvb3RoL01hbmFnZXIiKS51bndyYXAoKSwKLSAgICAgICAgICAgICAgICBpbnRlcmZhY2U6IFN0cmluZzo6ZnJvbSgib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIiksCi0gICAgICAgICAgICB9LAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHViKGNyYXRlKSBmbiBpc192YWxpZCgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdDwoYm9vbCwpLCBfPiA9IHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZF93aXRocmVzdWx0KCJHZXRGbG9zc0VuYWJsZWQiLCAoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQuaXNfb2soKTsKLSAgICB9Ci19Ci0KLS8vIFRPRE86IFRoZXNlIGFyZSBib2lsZXJwbGF0ZSBjb2RlcywgY29uc2lkZXIgY3JlYXRpbmcgYSBtYWNybyB0byBnZW5lcmF0ZS4KLWltcGwgSUJsdWV0b290aE1hbmFnZXIgZm9yIEJsdWV0b290aE1hbmFnZXJEQnVzIHsKLSAgICBmbiBzdGFydCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMikgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIlN0YXJ0IiwgKGhjaV9pbnRlcmZhY2UsKSkKLSAgICB9Ci0KLSAgICBmbiBzdG9wKCZtdXQgc2VsZiwgaGNpX2ludGVyZmFjZTogaTMyKSB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZF9ub3JldHVybigiU3RvcCIsIChoY2lfaW50ZXJmYWNlLCkpCi0gICAgfQotCi0gICAgZm4gZ2V0X2FkYXB0ZXJfZW5hYmxlZCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZCgiR2V0QWRhcHRlckVuYWJsZWQiLCAoaGNpX2ludGVyZmFjZSwpKQotICAgIH0KLQotICAgIGZuIHJlZ2lzdGVyX2NhbGxiYWNrKCZtdXQgc2VsZiwgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjayArIFNlbmQ+KSB7Ci0gICAgICAgIGxldCBwYXRoX3N0cmluZyA9IGNhbGxiYWNrLmdldF9vYmplY3RfaWQoKTsKLSAgICAgICAgbGV0IHBhdGggPSBkYnVzOjpQYXRoOjpuZXcocGF0aF9zdHJpbmcuY2xvbmUoKSkudW53cmFwKCk7Ci0gICAgICAgIGV4cG9ydF9ibHVldG9vdGhfbWFuYWdlcl9jYWxsYmFja19kYnVzX29iaigKLSAgICAgICAgICAgIHBhdGhfc3RyaW5nLAotICAgICAgICAgICAgc2VsZi5jbGllbnRfcHJveHkuY29ubi5jbG9uZSgpLAotICAgICAgICAgICAgJm11dCBzZWxmLmNsaWVudF9wcm94eS5jci5sb2NrKCkudW53cmFwKCksCi0gICAgICAgICAgICBBcmM6Om5ldyhNdXRleDo6bmV3KGNhbGxiYWNrKSksCi0gICAgICAgICAgICBBcmM6Om5ldyhNdXRleDo6bmV3KERpc2Nvbm5lY3RXYXRjaGVyOjpuZXcoKSkpLAotICAgICAgICApOwotCi0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZF9ub3JldHVybigiUmVnaXN0ZXJDYWxsYmFjayIsIChwYXRoLCkpCi0gICAgfQotCi0gICAgZm4gZ2V0X2Zsb3NzX2VuYWJsZWQoJm11dCBzZWxmKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKCJHZXRGbG9zc0VuYWJsZWQiLCAoKSkKLSAgICB9Ci0KLSAgICBmbiBzZXRfZmxvc3NfZW5hYmxlZCgmbXV0IHNlbGYsIGVuYWJsZWQ6IGJvb2wpIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKCJTZXRGbG9zc0VuYWJsZWQiLCAoZW5hYmxlZCwpKQotICAgIH0KLQotICAgIGZuIGdldF9hdmFpbGFibGVfYWRhcHRlcnMoJm11dCBzZWxmKSAtPiBWZWM8QWRhcHRlcldpdGhFbmFibGVkPiB7Ci0gICAgICAgIGxldCBwcm9wczogVmVjPGRidXM6OmFyZzo6UHJvcE1hcD4gPSBzZWxmLmNsaWVudF9wcm94eS5tZXRob2QoIkdldEF2YWlsYWJsZUFkYXB0ZXJzIiwgKCkpOwotICAgICAgICA8VmVjPEFkYXB0ZXJXaXRoRW5hYmxlZD4gYXMgREJ1c0FyZz46OmZyb21fZGJ1cyhwcm9wcywgTm9uZSwgTm9uZSwgTm9uZSkudW53cmFwKCkKLSAgICB9Ci19Ci0KLSNbYWxsb3coZGVhZF9jb2RlKV0KLXN0cnVjdCBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrREJ1cyB7fQotCi1pbXBsIG1hbmFnZXJfc2VydmljZTo6UlBDUHJveHkgZm9yIElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2tEQnVzIHsKLSAgICAvLyBQbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbnMganVzdCB0byBzYXRpc2Z5IGltcGwgUlBDUHJveHkgcmVxdWlyZW1lbnRzLgotICAgIGZuIHJlZ2lzdGVyX2Rpc2Nvbm5lY3QoJm11dCBzZWxmLCBfZjogQm94PGR5biBGbih1MzIpICsgU2VuZD4pIC0+IHUzMiB7Ci0gICAgICAgIDAKLSAgICB9Ci0gICAgZm4gZ2V0X29iamVjdF9pZCgmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgU3RyaW5nOjpmcm9tKCIiKQotICAgIH0KLSAgICBmbiB1bnJlZ2lzdGVyKCZtdXQgc2VsZiwgX2lkOiB1MzIpIC0+IGJvb2wgewotICAgICAgICBmYWxzZQotICAgIH0KLX0KLQotI1tnZW5lcmF0ZV9kYnVzX2V4cG9ydGVyKAotICAgIGV4cG9ydF9ibHVldG9vdGhfbWFuYWdlcl9jYWxsYmFja19kYnVzX29iaiwKLSAgICAib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyQ2FsbGJhY2siCi0pXQotaW1wbCBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrIGZvciBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrREJ1cyB7Ci0gICAgI1tkYnVzX21ldGhvZCgiT25IY2lEZXZpY2VDaGFuZ2VkIildCi0gICAgZm4gb25faGNpX2RldmljZV9jaGFuZ2VkKCZzZWxmLCBoY2lfaW50ZXJmYWNlOiBpMzIsIHByZXNlbnQ6IGJvb2wpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkhjaUVuYWJsZWRDaGFuZ2VkIildCi0gICAgZm4gb25faGNpX2VuYWJsZWRfY2hhbmdlZCgmc2VsZiwgaGNpX2ludGVyZmFjZTogaTMyLCBlbmFibGVkOiBib29sKSB7fQotfQotCi1wdWIoY3JhdGUpIHN0cnVjdCBCbHVldG9vdGhHYXR0REJ1cyB7Ci0gICAgY2xpZW50X3Byb3h5OiBDbGllbnREQnVzUHJveHksCi19Ci0KLWltcGwgQmx1ZXRvb3RoR2F0dERCdXMgewotICAgIHB1YihjcmF0ZSkgZm4gbmV3KAotICAgICAgICBjb25uOiBBcmM8U3luY0Nvbm5lY3Rpb24+LAotICAgICAgICBjcjogQXJjPE11dGV4PENyb3Nzcm9hZHM+PiwKLSAgICAgICAgaW5kZXg6IGkzMiwKLSAgICApIC0+IEJsdWV0b290aEdhdHREQnVzIHsKLSAgICAgICAgQmx1ZXRvb3RoR2F0dERCdXMgewotICAgICAgICAgICAgY2xpZW50X3Byb3h5OiBDbGllbnREQnVzUHJveHkgewotICAgICAgICAgICAgICAgIGNvbm46IGNvbm4uY2xvbmUoKSwKLSAgICAgICAgICAgICAgICBjcjogY3IsCi0gICAgICAgICAgICAgICAgYnVzX25hbWU6IFN0cmluZzo6ZnJvbSgib3JnLmNocm9taXVtLmJsdWV0b290aCIpLAotICAgICAgICAgICAgICAgIG9ianBhdGg6IG1ha2Vfb2JqZWN0X3BhdGgoaW5kZXgsICJnYXR0IiksCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlOiBTdHJpbmc6OmZyb20oIm9yZy5jaHJvbWl1bS5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dCIpLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETzogVGhlc2UgYXJlIGJvaWxlcnBsYXRlIGNvZGVzLCBjb25zaWRlciBjcmVhdGluZyBhIG1hY3JvIHRvIGdlbmVyYXRlLgotaW1wbCBJQmx1ZXRvb3RoR2F0dCBmb3IgQmx1ZXRvb3RoR2F0dERCdXMgewotICAgIGZuIHJlZ2lzdGVyX3NjYW5uZXIoJnNlbGYsIF9jYWxsYmFjazogQm94PGR5biBJU2Nhbm5lckNhbGxiYWNrICsgU2VuZD4pIHsKLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NjgwNCk6IGltcGxlbWVudAotICAgIH0KLQotICAgIGZuIHVucmVnaXN0ZXJfc2Nhbm5lcigmc2VsZiwgX3NjYW5uZXJfaWQ6IGkzMikgewotICAgICAgICAvLyBUT0RPKGIvMjAwMDY2ODA0KTogaW1wbGVtZW50Ci0gICAgfQotCi0gICAgZm4gc3RhcnRfc2Nhbigmc2VsZiwgX3NjYW5uZXJfaWQ6IGkzMiwgX3NldHRpbmdzOiBTY2FuU2V0dGluZ3MsIF9maWx0ZXJzOiBWZWM8U2NhbkZpbHRlcj4pIHsKLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NjgwNCk6IGltcGxlbWVudAotICAgIH0KLQotICAgIGZuIHN0b3Bfc2Nhbigmc2VsZiwgX3NjYW5uZXJfaWQ6IGkzMikgewotICAgICAgICAvLyBUT0RPKGIvMjAwMDY2ODA0KTogaW1wbGVtZW50Ci0gICAgfQotCi0gICAgZm4gcmVnaXN0ZXJfY2xpZW50KAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGFwcF91dWlkOiBTdHJpbmcsCi0gICAgICAgIGNhbGxiYWNrOiBCb3g8ZHluIElCbHVldG9vdGhHYXR0Q2FsbGJhY2sgKyBTZW5kPiwKLSAgICAgICAgZWF0dF9zdXBwb3J0OiBib29sLAotICAgICkgewotICAgICAgICBsZXQgcGF0aF9zdHJpbmcgPSBjYWxsYmFjay5nZXRfb2JqZWN0X2lkKCk7Ci0gICAgICAgIGxldCBwYXRoID0gZGJ1czo6UGF0aDo6bmV3KHBhdGhfc3RyaW5nLmNsb25lKCkpLnVud3JhcCgpOwotICAgICAgICBleHBvcnRfYmx1ZXRvb3RoX2dhdHRfY2FsbGJhY2tfZGJ1c19vYmooCi0gICAgICAgICAgICBwYXRoX3N0cmluZywKLSAgICAgICAgICAgIHNlbGYuY2xpZW50X3Byb3h5LmNvbm4uY2xvbmUoKSwKLSAgICAgICAgICAgICZtdXQgc2VsZi5jbGllbnRfcHJveHkuY3IubG9jaygpLnVud3JhcCgpLAotICAgICAgICAgICAgQXJjOjpuZXcoTXV0ZXg6Om5ldyhjYWxsYmFjaykpLAotICAgICAgICAgICAgQXJjOjpuZXcoTXV0ZXg6Om5ldyhEaXNjb25uZWN0V2F0Y2hlcjo6bmV3KCkpKSwKLSAgICAgICAgKTsKLQotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIlJlZ2lzdGVyQ2xpZW50IiwgKGFwcF91dWlkLCBwYXRoLCBlYXR0X3N1cHBvcnQpKQotICAgIH0KLQotICAgIGZuIHVucmVnaXN0ZXJfY2xpZW50KCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIpIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKCJVbnJlZ2lzdGVyQ2xpZW50IiwgKGNsaWVudF9pZCwpKQotICAgIH0KLQotICAgIGZuIGNsaWVudF9jb25uZWN0KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgaXNfZGlyZWN0OiBib29sLAotICAgICAgICB0cmFuc3BvcnQ6IGkzMiwKLSAgICAgICAgb3Bwb3J0dW5pc3RpYzogYm9vbCwKLSAgICAgICAgcGh5OiBpMzIsCi0gICAgKSB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZF9ub3JldHVybigKLSAgICAgICAgICAgICJDbGllbnRDb25uZWN0IiwKLSAgICAgICAgICAgIChjbGllbnRfaWQsIGFkZHIsIGlzX2RpcmVjdCwgdHJhbnNwb3J0LCBvcHBvcnR1bmlzdGljLCBwaHkpLAotICAgICAgICApCi0gICAgfQotCi0gICAgZm4gY2xpZW50X2Rpc2Nvbm5lY3QoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcpIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKCJDbGllbnREaXNjb25uZWN0IiwgKGNsaWVudF9pZCwgYWRkcikpCi0gICAgfQotCi0gICAgZm4gY2xpZW50X3NldF9wcmVmZXJyZWRfcGh5KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgdHhfcGh5OiBMZVBoeSwKLSAgICAgICAgcnhfcGh5OiBMZVBoeSwKLSAgICAgICAgcGh5X29wdGlvbnM6IGkzMiwKLSAgICApIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKAotICAgICAgICAgICAgIkNsaWVudFNldFByZWZlcnJlZFBoeSIsCi0gICAgICAgICAgICAoY2xpZW50X2lkLCBhZGRyLCB0eF9waHkudG9faTMyKCkudW53cmFwKCksIHJ4X3BoeS50b19pMzIoKS51bndyYXAoKSwgcGh5X29wdGlvbnMpLAotICAgICAgICApCi0gICAgfQotCi0gICAgZm4gY2xpZW50X3JlYWRfcGh5KCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIkNsaWVudFJlYWRQaHkiLCAoY2xpZW50X2lkLCBhZGRyKSkKLSAgICB9Ci0KLSAgICBmbiByZWZyZXNoX2RldmljZSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIlJlZnJlc2hEZXZpY2UiLCAoY2xpZW50X2lkLCBhZGRyKSkKLSAgICB9Ci0KLSAgICBmbiBkaXNjb3Zlcl9zZXJ2aWNlcygmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIkRpc2NvdmVyU2VydmljZXMiLCAoY2xpZW50X2lkLCBhZGRyKSkKLSAgICB9Ci0KLSAgICBmbiBkaXNjb3Zlcl9zZXJ2aWNlX2J5X3V1aWQoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIHV1aWQ6IFN0cmluZykgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIkRpc2NvdmVyU2VydmljZUJ5VXVpZCIsIChjbGllbnRfaWQsIGFkZHIsIHV1aWQpKQotICAgIH0KLQotICAgIGZuIHJlYWRfY2hhcmFjdGVyaXN0aWMoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBhdXRoX3JlcTogaTMyKSB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZF9ub3JldHVybigiUmVhZENoYXJhY3RlcmlzdGljIiwgKGNsaWVudF9pZCwgYWRkciwgaGFuZGxlLCBhdXRoX3JlcSkpCi0gICAgfQotCi0gICAgZm4gcmVhZF91c2luZ19jaGFyYWN0ZXJpc3RpY191dWlkKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgdXVpZDogU3RyaW5nLAotICAgICAgICBzdGFydF9oYW5kbGU6IGkzMiwKLSAgICAgICAgZW5kX2hhbmRsZTogaTMyLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICkgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oCi0gICAgICAgICAgICAiUmVhZFVzaW5nQ2hhcmFjdGVyaXN0aWNVdWlkIiwKLSAgICAgICAgICAgIChjbGllbnRfaWQsIGFkZHIsIHV1aWQsIHN0YXJ0X2hhbmRsZSwgZW5kX2hhbmRsZSwgYXV0aF9yZXEpLAotICAgICAgICApCi0gICAgfQotCi0gICAgZm4gd3JpdGVfY2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjbGllbnRfaWQ6IGkzMiwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICAgICBoYW5kbGU6IGkzMiwKLSAgICAgICAgd3JpdGVfdHlwZTogR2F0dFdyaXRlVHlwZSwKLSAgICAgICAgYXV0aF9yZXE6IGkzMiwKLSAgICAgICAgdmFsdWU6IFZlYzx1OD4sCi0gICAgKSAtPiBHYXR0V3JpdGVSZXF1ZXN0U3RhdHVzIHsKLSAgICAgICAgR2F0dFdyaXRlUmVxdWVzdFN0YXR1czo6ZnJvbV9pMzIoc2VsZi5jbGllbnRfcHJveHkubWV0aG9kKAotICAgICAgICAgICAgIldyaXRlQ2hhcmFjdGVyaXN0aWMiLAotICAgICAgICAgICAgKGNsaWVudF9pZCwgYWRkciwgaGFuZGxlLCB3cml0ZV90eXBlLnRvX2kzMigpLnVud3JhcCgpLCBhdXRoX3JlcSwgdmFsdWUpLAotICAgICAgICApKQotICAgICAgICAudW53cmFwKCkKLSAgICB9Ci0KLSAgICBmbiByZWFkX2Rlc2NyaXB0b3IoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBhdXRoX3JlcTogaTMyKSB7Ci0gICAgICAgIHNlbGYuY2xpZW50X3Byb3h5Lm1ldGhvZF9ub3JldHVybigiUmVhZERlc2NyaXB0b3IiLCAoY2xpZW50X2lkLCBhZGRyLCBoYW5kbGUsIGF1dGhfcmVxKSkKLSAgICB9Ci0KLSAgICBmbiB3cml0ZV9kZXNjcmlwdG9yKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgaGFuZGxlOiBpMzIsCi0gICAgICAgIGF1dGhfcmVxOiBpMzIsCi0gICAgICAgIHZhbHVlOiBWZWM8dTg+LAotICAgICkgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eQotICAgICAgICAgICAgLm1ldGhvZF9ub3JldHVybigiV3JpdGVEZXNjcmlwdG9yIiwgKGNsaWVudF9pZCwgYWRkciwgaGFuZGxlLCBhdXRoX3JlcSwgdmFsdWUpKQotICAgIH0KLQotICAgIGZuIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24oJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBlbmFibGU6IGJvb2wpIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkKLSAgICAgICAgICAgIC5tZXRob2Rfbm9yZXR1cm4oIlJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uIiwgKGNsaWVudF9pZCwgYWRkciwgaGFuZGxlLCBlbmFibGUpKQotICAgIH0KLQotICAgIGZuIGJlZ2luX3JlbGlhYmxlX3dyaXRlKCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIkJlZ2luUmVsaWFibGVXcml0ZSIsIChjbGllbnRfaWQsIGFkZHIpKQotICAgIH0KLQotICAgIGZuIGVuZF9yZWxpYWJsZV93cml0ZSgmbXV0IHNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGV4ZWN1dGU6IGJvb2wpIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKCJFbmRSZWxpYWJsZVdyaXRlIiwgKGNsaWVudF9pZCwgYWRkciwgZXhlY3V0ZSkpCi0gICAgfQotCi0gICAgZm4gcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oIlJlYWRSZW1vdGVSc3NpIiwgKGNsaWVudF9pZCwgYWRkcikpCi0gICAgfQotCi0gICAgZm4gY29uZmlndXJlX210dSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgbXR1OiBpMzIpIHsKLSAgICAgICAgc2VsZi5jbGllbnRfcHJveHkubWV0aG9kX25vcmV0dXJuKCJDb25maWd1cmVNdHUiLCAoY2xpZW50X2lkLCBhZGRyLCBtdHUpKQotICAgIH0KLQotICAgIGZuIGNvbm5lY3Rpb25fcGFyYW1ldGVyX3VwZGF0ZSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIG1pbl9pbnRlcnZhbDogaTMyLAotICAgICAgICBtYXhfaW50ZXJ2YWw6IGkzMiwKLSAgICAgICAgbGF0ZW5jeTogaTMyLAotICAgICAgICB0aW1lb3V0OiBpMzIsCi0gICAgICAgIG1pbl9jZV9sZW46IHUxNiwKLSAgICAgICAgbWF4X2NlX2xlbjogdTE2LAotICAgICkgewotICAgICAgICBzZWxmLmNsaWVudF9wcm94eS5tZXRob2Rfbm9yZXR1cm4oCi0gICAgICAgICAgICAiQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSIsCi0gICAgICAgICAgICAoY2xpZW50X2lkLCBhZGRyLCBtaW5faW50ZXJ2YWwsIG1heF9pbnRlcnZhbCwgbGF0ZW5jeSwgdGltZW91dCwgbWluX2NlX2xlbiwgbWF4X2NlX2xlbiksCi0gICAgICAgICkKLSAgICB9Ci19Ci0KLSNbYWxsb3coZGVhZF9jb2RlKV0KLXN0cnVjdCBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrREJ1cyB7fQotCi1pbXBsIGJ0c3RhY2s6OlJQQ1Byb3h5IGZvciBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrREJ1cyB7Ci0gICAgLy8gUGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgdG8gc2F0aXNmeSBpbXBsIFJQQ1Byb3h5IHJlcXVpcmVtZW50cy4KLSAgICBmbiByZWdpc3Rlcl9kaXNjb25uZWN0KCZtdXQgc2VsZiwgX2Y6IEJveDxkeW4gRm4odTMyKSArIFNlbmQ+KSAtPiB1MzIgewotICAgICAgICAwCi0gICAgfQotICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgIFN0cmluZzo6ZnJvbSgiIikKLSAgICB9Ci0gICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIF9pZDogdTMyKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci19Ci0KLSNbZ2VuZXJhdGVfZGJ1c19leHBvcnRlcigKLSAgICBleHBvcnRfYmx1ZXRvb3RoX2dhdHRfY2FsbGJhY2tfZGJ1c19vYmosCi0gICAgIm9yZy5jaHJvbWl1bS5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dENhbGxiYWNrIgotKV0KLWltcGwgSUJsdWV0b290aEdhdHRDYWxsYmFjayBmb3IgSUJsdWV0b290aEdhdHRDYWxsYmFja0RCdXMgewotICAgICNbZGJ1c19tZXRob2QoIk9uQ2xpZW50UmVnaXN0ZXJlZCIpXQotICAgIGZuIG9uX2NsaWVudF9yZWdpc3RlcmVkKCZzZWxmLCBzdGF0dXM6IGkzMiwgY2xpZW50X2lkOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkNsaWVudENvbm5lY3Rpb25TdGF0ZSIpXQotICAgIGZuIG9uX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgc3RhdHVzOiBpMzIsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBjb25uZWN0ZWQ6IGJvb2wsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICApIHsKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPblBoeVVwZGF0ZSIpXQotICAgIGZuIG9uX3BoeV91cGRhdGUoJnNlbGYsIGFkZHI6IFN0cmluZywgdHhfcGh5OiBMZVBoeSwgcnhfcGh5OiBMZVBoeSwgc3RhdHVzOiBHYXR0U3RhdHVzKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25QaHlSZWFkIildCi0gICAgZm4gb25fcGh5X3JlYWQoJnNlbGYsIGFkZHI6IFN0cmluZywgdHhfcGh5OiBMZVBoeSwgcnhfcGh5OiBMZVBoeSwgc3RhdHVzOiBHYXR0U3RhdHVzKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25TZWFyY2hDb21wbGV0ZSIpXQotICAgIGZuIG9uX3NlYXJjaF9jb21wbGV0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzZXJ2aWNlczogVmVjPEJsdWV0b290aEdhdHRTZXJ2aWNlPiwgc3RhdHVzOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkNoYXJhY3RlcmlzdGljUmVhZCIpXQotICAgIGZuIG9uX2NoYXJhY3RlcmlzdGljX3JlYWQoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIsIGhhbmRsZTogaTMyLCB2YWx1ZTogVmVjPHU4Pikge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uQ2hhcmFjdGVyaXN0aWNXcml0ZSIpXQotICAgIGZuIG9uX2NoYXJhY3RlcmlzdGljX3dyaXRlKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHN0YXR1czogaTMyLCBoYW5kbGU6IGkzMikge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uRXhlY3V0ZVdyaXRlIildCi0gICAgZm4gb25fZXhlY3V0ZV93cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMikge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uRGVzY3JpcHRvclJlYWQiKV0KLSAgICBmbiBvbl9kZXNjcmlwdG9yX3JlYWQoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIsIGhhbmRsZTogaTMyLCB2YWx1ZTogVmVjPHU4Pikge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uRGVzY3JpcHRvcldyaXRlIildCi0gICAgZm4gb25fZGVzY3JpcHRvcl93cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMiwgaGFuZGxlOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbk5vdGlmeSIpXQotICAgIGZuIG9uX25vdGlmeSgmc2VsZiwgYWRkcjogU3RyaW5nLCBoYW5kbGU6IGkzMiwgdmFsdWU6IFZlYzx1OD4pIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPblJlYWRSZW1vdGVSc3NpIildCi0gICAgZm4gb25fcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgYWRkcjogU3RyaW5nLCByc3NpOiBpMzIsIHN0YXR1czogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25Db25maWd1cmVNdHUiKV0KLSAgICBmbiBvbl9jb25maWd1cmVfbXR1KCZzZWxmLCBhZGRyOiBTdHJpbmcsIG10dTogaTMyLCBzdGF0dXM6IGkzMikge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uQ29ubmVjdGlvblVwZGF0ZWQiKV0KLSAgICBmbiBvbl9jb25uZWN0aW9uX3VwZGF0ZWQoCi0gICAgICAgICZzZWxmLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGludGVydmFsOiBpMzIsCi0gICAgICAgIGxhdGVuY3k6IGkzMiwKLSAgICAgICAgdGltZW91dDogaTMyLAotICAgICAgICBzdGF0dXM6IGkzMiwKLSAgICApIHsKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPblNlcnZpY2VDaGFuZ2VkIildCi0gICAgZm4gb25fc2VydmljZV9jaGFuZ2VkKCZzZWxmLCBhZGRyOiBTdHJpbmcpIHt9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvZWRpdG9yLnJzIGIvZ2QvcnVzdC9saW51eC9jbGllbnQvc3JjL2VkaXRvci5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMWRkOS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvZWRpdG9yLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vISBUb29scyB0byB3b3JrIHdpdGggcnVzdHlsaW5lIHJlYWRsaW5lKCkgbGlicmFyeS4KLQotdXNlIGZ1dHVyZXM6OkZ1dHVyZTsKLQotdXNlIHJ1c3R5bGluZTo6Y29tcGxldGlvbjo6Q29tcGxldGVyOwotdXNlIHJ1c3R5bGluZTo6ZXJyb3I6OlJlYWRsaW5lRXJyb3I7Ci11c2UgcnVzdHlsaW5lOjpoaWdobGlnaHQ6OkhpZ2hsaWdodGVyOwotdXNlIHJ1c3R5bGluZTo6aGludDo6SGludGVyOwotdXNlIHJ1c3R5bGluZTo6dmFsaWRhdGU6OlZhbGlkYXRvcjsKLXVzZSBydXN0eWxpbmU6OntDb21wbGV0aW9uVHlwZSwgQ29uZmlnLCBFZGl0b3J9OwotdXNlIHJ1c3R5bGluZV9kZXJpdmU6OkhlbHBlcjsKLQotdXNlIHN0ZDo6cGluOjpQaW47Ci11c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Ci11c2Ugc3RkOjp0YXNrOjp7Q29udGV4dCwgUG9sbH07Ci0KLXVzZSBjcmF0ZTo6Y29uc29sZV9ibHVlOwotCi0jW2Rlcml2ZShIZWxwZXIpXQotc3RydWN0IEJ0SGVscGVyIHsKLSAgICBjb21tYW5kczogVmVjPFN0cmluZz4sCi19Ci0KLWltcGwgQ29tcGxldGVyIGZvciBCdEhlbHBlciB7Ci0gICAgdHlwZSBDYW5kaWRhdGUgPSBTdHJpbmc7Ci0KLSAgICAvLyBSZXR1cm5zIGNvbXBsZXRpb24gYmFzZWQgb24gc3VwcG9ydGVkIGNvbW1hbmRzLgotICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IHRvIGF1dG9jb21wbGV0ZSBCVCBhZGRyZXNzLCBjb21tYW5kIHBhcmFtZXRlcnMsIGV0Yy4KLSAgICBmbiBjb21wbGV0ZSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGxpbmU6ICZzdHIsCi0gICAgICAgIHBvczogdXNpemUsCi0gICAgICAgIF9jdHg6ICZydXN0eWxpbmU6OkNvbnRleHQ8J18+LAotICAgICkgLT4gUmVzdWx0PCh1c2l6ZSwgVmVjPFN0cmluZz4pLCBSZWFkbGluZUVycm9yPiB7Ci0gICAgICAgIGxldCBzbGljZSA9ICZsaW5lWy4ucG9zXTsKLSAgICAgICAgbGV0IG11dCBjb21wbGV0aW9ucyA9IHZlYyFbXTsKLQotICAgICAgICBmb3IgY21kIGluIHNlbGYuY29tbWFuZHMuaXRlcigpIHsKLSAgICAgICAgICAgIGlmIGNtZC5zdGFydHNfd2l0aChzbGljZSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY21kLmNsb25lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT2soKDAsIGNvbXBsZXRpb25zKSkKLSAgICB9Ci19Ci0KLWltcGwgSGludGVyIGZvciBCdEhlbHBlciB7Ci0gICAgdHlwZSBIaW50ID0gU3RyaW5nOwotfQotCi1pbXBsIEhpZ2hsaWdodGVyIGZvciBCdEhlbHBlciB7fQotCi1pbXBsIFZhbGlkYXRvciBmb3IgQnRIZWxwZXIge30KLQotLy8vIEEgZnV0dXJlIHRoYXQgZG9lcyBhc3luYyByZWFkbGluZSgpLgotLy8vCi0vLy8gYXN5bmMgcmVhZGxpbmUoKSBpcyBpbXBsZW1lbnRlZCBieSBzcGF3bmluZyBhIHRocmVhZCBmb3IgdGhlIGJsb2NraW5nIHJlYWRsaW5lKCkuIFdoaWxlIHRoaXMKLS8vLyByZWFkbGluZSgpIHRocmVhZCBpcyBibG9ja2VkLCBpdCB5aWVsZHMgYmFjayB0byBleGVjdXRvciBhbmQgd2lsbCB3YWtlIHRoZSBleGVjdXRvciB1cCB3aGVuIHRoZQotLy8vIGJsb2NrZWQgdGhyZWFkIGhhcyBwcm9jZWVkZWQgYW5kIGdvdCBpbnB1dCBmcm9tIHJlYWRsaW5lKCkuCi1wdWIgc3RydWN0IEFzeW5jUmVhZGxpbmUgewotICAgIHJsOiBBcmM8TXV0ZXg8RWRpdG9yPEJ0SGVscGVyPj4+LAotICAgIHJlc3VsdDogQXJjPE11dGV4PE9wdGlvbjxydXN0eWxpbmU6OlJlc3VsdDxTdHJpbmc+Pj4+LAotfQotCi1pbXBsIEZ1dHVyZSBmb3IgQXN5bmNSZWFkbGluZSB7Ci0gICAgdHlwZSBPdXRwdXQgPSBydXN0eWxpbmU6OlJlc3VsdDxTdHJpbmc+OwotCi0gICAgZm4gcG9sbChzZWxmOiBQaW48Jm11dCBTZWxmPiwgY3g6ICZtdXQgQ29udGV4dDwnXz4pIC0+IFBvbGw8cnVzdHlsaW5lOjpSZXN1bHQ8U3RyaW5nPj4gewotICAgICAgICBsZXQgb3B0aW9uID0gc2VsZi5yZXN1bHQubG9jaygpLnVud3JhcCgpLnRha2UoKTsKLSAgICAgICAgaWYgbGV0IFNvbWUocmVzKSA9IG9wdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gUG9sbDo6UmVhZHkocmVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCB3YWtlciA9IGN4Lndha2VyKCkuY2xvbmUoKTsKLSAgICAgICAgbGV0IHJlc3VsdF9jbG9uZSA9IHNlbGYucmVzdWx0LmNsb25lKCk7Ci0gICAgICAgIGxldCBybCA9IHNlbGYucmwuY2xvbmUoKTsKLSAgICAgICAgc3RkOjp0aHJlYWQ6OnNwYXduKG1vdmUgfHwgewotICAgICAgICAgICAgbGV0IHJlYWRsaW5lID0gcmwubG9jaygpLnVud3JhcCgpLnJlYWRsaW5lKGNvbnNvbGVfYmx1ZSEoImJsdWV0b290aD4gIikpOwotICAgICAgICAgICAgKnJlc3VsdF9jbG9uZS5sb2NrKCkudW53cmFwKCkgPSBTb21lKHJlYWRsaW5lKTsKLSAgICAgICAgICAgIHdha2VyLndha2UoKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgUG9sbDo6UGVuZGluZwotICAgIH0KLX0KLQotLy8vIFdyYXBwZXIgb2YgcnVzdHlsaW5lIGVkaXRvciB0aGF0IHN1cHBvcnRzIGFzeW5jIHJlYWRsaW5lKCkuCi1wdWIgc3RydWN0IEFzeW5jRWRpdG9yIHsKLSAgICBybDogQXJjPE11dGV4PEVkaXRvcjxCdEhlbHBlcj4+PiwKLX0KLQotaW1wbCBBc3luY0VkaXRvciB7Ci0gICAgLy8vIENyZWF0ZXMgbmV3IGFzeW5jIHJ1c3R5bGluZSBlZGl0b3IuCi0gICAgLy8vCi0gICAgLy8vICogYGNvbW1hbmRzYCAtIExpc3Qgb2YgY29tbWFuZHMgZm9yIGF1dG9jb21wbGV0ZS4KLSAgICBwdWIgZm4gbmV3KGNvbW1hbmRzOiBWZWM8U3RyaW5nPikgLT4gQXN5bmNFZGl0b3IgewotICAgICAgICBsZXQgYnVpbGRlciA9IENvbmZpZzo6YnVpbGRlcigpCi0gICAgICAgICAgICAuYXV0b19hZGRfaGlzdG9yeSh0cnVlKQotICAgICAgICAgICAgLmhpc3RvcnlfaWdub3JlX2R1cHModHJ1ZSkKLSAgICAgICAgICAgIC5jb21wbGV0aW9uX3R5cGUoQ29tcGxldGlvblR5cGU6Okxpc3QpOwotICAgICAgICBsZXQgY29uZmlnID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICBsZXQgbXV0IHJsID0gcnVzdHlsaW5lOjpFZGl0b3I6OndpdGhfY29uZmlnKGNvbmZpZyk7Ci0gICAgICAgIGxldCBoZWxwZXIgPSBCdEhlbHBlciB7IGNvbW1hbmRzIH07Ci0gICAgICAgIHJsLnNldF9oZWxwZXIoU29tZShoZWxwZXIpKTsKLSAgICAgICAgQXN5bmNFZGl0b3IgeyBybDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhybCkpIH0KLSAgICB9Ci0KLSAgICAvLy8gRG9lcyBhc3luYyByZWFkbGluZSgpLgotICAgIC8vLwotICAgIC8vLyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgd2lsbCBkbyB0aGUgcmVhZGxpbmUoKSB3aGVuIGF3YWl0LWVkLiBUaGlzIGRvZXMgbm90IGJsb2NrIHRoZSB0aHJlYWQKLSAgICAvLy8gYnV0IHJhdGhlciB5aWVsZHMgdG8gdGhlIGV4ZWN1dG9yIHdoaWxlIHdhaXRpbmcgZm9yIGEgY29tbWFuZCB0byBiZSBlbnRlcmVkLgotICAgIHB1YiBmbiByZWFkbGluZSgmc2VsZikgLT4gQXN5bmNSZWFkbGluZSB7Ci0gICAgICAgIEFzeW5jUmVhZGxpbmUgeyBybDogc2VsZi5ybC5jbG9uZSgpLCByZXN1bHQ6IEFyYzo6bmV3KE11dGV4OjpuZXcoTm9uZSkpIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2NsaWVudC9zcmMvbWFpbi5ycyBiL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9tYWluLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTExNmJiLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvY2xpZW50L3NyYy9tYWluLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotCi11c2UgZGJ1czo6Y2hhbm5lbDo6TWF0Y2hpbmdSZWNlaXZlcjsKLXVzZSBkYnVzOjptZXNzYWdlOjpNYXRjaFJ1bGU7Ci11c2UgZGJ1czo6bm9uYmxvY2s6OlN5bmNDb25uZWN0aW9uOwotdXNlIGRidXNfY3Jvc3Nyb2Fkczo6Q3Jvc3Nyb2FkczsKLXVzZSB0b2tpbzo6c3luYzo6bXBzYzsKLQotdXNlIGNyYXRlOjpjYWxsYmFja3M6OntCdENhbGxiYWNrLCBCdENvbm5lY3Rpb25DYWxsYmFjaywgQnRNYW5hZ2VyQ2FsbGJhY2t9OwotdXNlIGNyYXRlOjpjb21tYW5kX2hhbmRsZXI6OkNvbW1hbmRIYW5kbGVyOwotdXNlIGNyYXRlOjpkYnVzX2lmYWNlOjp7Qmx1ZXRvb3RoREJ1cywgQmx1ZXRvb3RoR2F0dERCdXMsIEJsdWV0b290aE1hbmFnZXJEQnVzfTsKLXVzZSBjcmF0ZTo6ZWRpdG9yOjpBc3luY0VkaXRvcjsKLXVzZSBidF90b3BzaGltOjp0b3BzdGFjazsKLXVzZSBidHN0YWNrOjpibHVldG9vdGg6OntCbHVldG9vdGhEZXZpY2UsIElCbHVldG9vdGh9OwotdXNlIG1hbmFnZXJfc2VydmljZTo6aWZhY2VfYmx1ZXRvb3RoX21hbmFnZXI6OklCbHVldG9vdGhNYW5hZ2VyOwotCi1tb2QgY2FsbGJhY2tzOwotbW9kIGNvbW1hbmRfaGFuZGxlcjsKLW1vZCBjb25zb2xlOwotbW9kIGRidXNfYXJnOwotbW9kIGRidXNfaWZhY2U7Ci1tb2QgZWRpdG9yOwotCi0vLy8gQ29udGV4dCBzdHJ1Y3R1cmUgZm9yIHRoZSBjbGllbnQuIFVzZWQgdG8ga2VlcCB0cmFjayBkZXRhaWxzIGFib3V0IHRoZSBhY3RpdmUgYWRhcHRlciBhbmQgaXRzCi0vLy8gc3RhdGUuCi1wdWIoY3JhdGUpIHN0cnVjdCBDbGllbnRDb250ZXh0IHsKLSAgICAvLy8gTGlzdCBvZiBhZGFwdGVycyBhbmQgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkLgotICAgIHB1YihjcmF0ZSkgYWRhcHRlcnM6IEhhc2hNYXA8aTMyLCBib29sPiwKLQotICAgIC8vIFRPRE8oYWJwcykgLSBDaGFuZ2Ugb25jZSB3ZSBoYXZlIG11bHRpLWFkYXB0ZXIgc3VwcG9ydC4KLSAgICAvLy8gVGhlIGRlZmF1bHQgYWRhcHRlciBpcyBhbHNvIHRoZSBhY3RpdmUgYWRhcHRlci4gRGVmYXVsdHMgdG8gMC4KLSAgICBwdWIoY3JhdGUpIGRlZmF1bHRfYWRhcHRlcjogaTMyLAotCi0gICAgLy8vIEN1cnJlbnQgYWRhcHRlciBpcyBlbmFibGVkPwotICAgIHB1YihjcmF0ZSkgZW5hYmxlZDogYm9vbCwKLQotICAgIC8vLyBDdXJyZW50IGFkYXB0ZXIgaXMgcmVhZHkgdG8gYmUgdXNlZD8KLSAgICBwdWIoY3JhdGUpIGFkYXB0ZXJfcmVhZHk6IGJvb2wsCi0KLSAgICAvLy8gQ3VycmVudCBhZGFwdGVyIGFkZHJlc3MgaWYga25vd24uCi0gICAgcHViKGNyYXRlKSBhZGFwdGVyX2FkZHJlc3M6IE9wdGlvbjxTdHJpbmc+LAotCi0gICAgLy8vIEN1cnJlbnRseSBhY3RpdmUgYm9uZGluZyBhdHRlbXB0LiBJZiBpdCBpcyBub3Qgbm9uZSwgd2UgYXJlIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIGJvbmQKLSAgICAvLy8gdGhpcyBkZXZpY2UuCi0gICAgcHViKGNyYXRlKSBib25kaW5nX2F0dGVtcHQ6IE9wdGlvbjxCbHVldG9vdGhEZXZpY2U+LAotCi0gICAgLy8vIElzIGFkYXB0ZXIgZGlzY292ZXJpbmc/Ci0gICAgcHViKGNyYXRlKSBkaXNjb3ZlcmluZ19zdGF0ZTogYm9vbCwKLQotICAgIC8vLyBEZXZpY2VzIGZvdW5kIGluIGN1cnJlbnQgZGlzY292ZXJ5IHNlc3Npb24uIExpc3Qgc2hvdWxkIGJlIGNsZWFyZWQgd2hlbiBhIG5ldyBkaXNjb3ZlcnkKLSAgICAvLy8gc2Vzc2lvbiBzdGFydHMgc28gdGhhdCBwcmV2aW91cyByZXN1bHRzIGRvbid0IHBvbGx1dGUgY3VycmVudCBzZWFyY2guCi0gICAgcHViKGNyYXRlKSBmb3VuZF9kZXZpY2VzOiBIYXNoTWFwPFN0cmluZywgQmx1ZXRvb3RoRGV2aWNlPiwKLQotICAgIC8vLyBJZiBzZXQsIHRoZSByZWdpc3RlcmVkIEdBVFQgY2xpZW50IGlkLiBOb25lIG90aGVyd2lzZS4KLSAgICBwdWIoY3JhdGUpIGdhdHRfY2xpZW50X2lkOiBPcHRpb248aTMyPiwKLQotICAgIC8vLyBQcm94eSBmb3IgbWFuYWdlciBpbnRlcmZhY2UuCi0gICAgcHViKGNyYXRlKSBtYW5hZ2VyX2RidXM6IEJsdWV0b290aE1hbmFnZXJEQnVzLAotCi0gICAgLy8vIFByb3h5IGZvciBhZGFwdGVyIGludGVyZmFjZS4gT25seSBleGlzdHMgd2hlbiB0aGUgZGVmYXVsdCBhZGFwdGVyIGlzIGVuYWJsZWQuCi0gICAgcHViKGNyYXRlKSBhZGFwdGVyX2RidXM6IE9wdGlvbjxCbHVldG9vdGhEQnVzPiwKLQotICAgIC8vLyBQcm94eSBmb3IgR0FUVCBpbnRlcmZhY2UuCi0gICAgcHViKGNyYXRlKSBnYXR0X2RidXM6IE9wdGlvbjxCbHVldG9vdGhHYXR0REJ1cz4sCi0KLSAgICAvLy8gQ2hhbm5lbCB0byBzZW5kIGFjdGlvbnMgdG8gdGFrZSBpbiB0aGUgZm9yZWdyb3VuZAotICAgIGZnOiBtcHNjOjpTZW5kZXI8Rm9yZWdyb3VuZEFjdGlvbnM+LAotCi0gICAgLy8vIEludGVybmFsIERCdXMgY29ubmVjdGlvbiBvYmplY3QuCi0gICAgZGJ1c19jb25uZWN0aW9uOiBBcmM8U3luY0Nvbm5lY3Rpb24+LAotCi0gICAgLy8vIEludGVybmFsIERCdXMgY3Jvc3Nyb2FkcyBvYmplY3QuCi0gICAgZGJ1c19jcm9zc3JvYWRzOiBBcmM8TXV0ZXg8Q3Jvc3Nyb2Fkcz4+LAotfQotCi1pbXBsIENsaWVudENvbnRleHQgewotICAgIHB1YiBmbiBuZXcoCi0gICAgICAgIGRidXNfY29ubmVjdGlvbjogQXJjPFN5bmNDb25uZWN0aW9uPiwKLSAgICAgICAgZGJ1c19jcm9zc3JvYWRzOiBBcmM8TXV0ZXg8Q3Jvc3Nyb2Fkcz4+LAotICAgICAgICB0eDogbXBzYzo6U2VuZGVyPEZvcmVncm91bmRBY3Rpb25zPiwKLSAgICApIC0+IENsaWVudENvbnRleHQgewotICAgICAgICAvLyBNYW5hZ2VyIGludGVyZmFjZSBpcyBhbG1vc3QgYWx3YXlzIGF2YWlsYWJsZSBidXQgYWRhcHRlciBpbnRlcmZhY2UKLSAgICAgICAgLy8gcmVxdWlyZXMgdGhhdCB0aGUgc3BlY2lmaWMgYWRhcHRlciBpcyBlbmFibGVkLgotICAgICAgICBsZXQgbWFuYWdlcl9kYnVzID0KLSAgICAgICAgICAgIEJsdWV0b290aE1hbmFnZXJEQnVzOjpuZXcoZGJ1c19jb25uZWN0aW9uLmNsb25lKCksIGRidXNfY3Jvc3Nyb2Fkcy5jbG9uZSgpKTsKLQotICAgICAgICBDbGllbnRDb250ZXh0IHsKLSAgICAgICAgICAgIGFkYXB0ZXJzOiBIYXNoTWFwOjpuZXcoKSwKLSAgICAgICAgICAgIGRlZmF1bHRfYWRhcHRlcjogMCwKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICAgICAgYWRhcHRlcl9yZWFkeTogZmFsc2UsCi0gICAgICAgICAgICBhZGFwdGVyX2FkZHJlc3M6IE5vbmUsCi0gICAgICAgICAgICBib25kaW5nX2F0dGVtcHQ6IE5vbmUsCi0gICAgICAgICAgICBkaXNjb3ZlcmluZ19zdGF0ZTogZmFsc2UsCi0gICAgICAgICAgICBmb3VuZF9kZXZpY2VzOiBIYXNoTWFwOjpuZXcoKSwKLSAgICAgICAgICAgIGdhdHRfY2xpZW50X2lkOiBOb25lLAotICAgICAgICAgICAgbWFuYWdlcl9kYnVzLAotICAgICAgICAgICAgYWRhcHRlcl9kYnVzOiBOb25lLAotICAgICAgICAgICAgZ2F0dF9kYnVzOiBOb25lLAotICAgICAgICAgICAgZmc6IHR4LAotICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uLAotICAgICAgICAgICAgZGJ1c19jcm9zc3JvYWRzLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2V0cyByZXF1aXJlZCB2YWx1ZXMgZm9yIHRoZSBhZGFwdGVyIHdoZW4gZW5hYmxpbmcgb3IgZGlzYWJsaW5nCi0gICAgZm4gc2V0X2FkYXB0ZXJfZW5hYmxlZCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMiwgZW5hYmxlZDogYm9vbCkgewotICAgICAgICBwcmludF9pbmZvISgiaGNpe30gZW5hYmxlZCA9IHt9IiwgaGNpX2ludGVyZmFjZSwgZW5hYmxlZCk7Ci0KLSAgICAgICAgc2VsZi5hZGFwdGVycy5lbnRyeShoY2lfaW50ZXJmYWNlKS5hbmRfbW9kaWZ5KHx2fCAqdiA9IGVuYWJsZWQpLm9yX2luc2VydChlbmFibGVkKTsKLQotICAgICAgICAvLyBXaGVuIHRoZSBkZWZhdWx0IGFkYXB0ZXIncyBzdGF0ZSBpcyB1cGRhdGVkLCB3ZSBuZWVkIHRvIG1vZGlmeSBhIGZldyBtb3JlIHRoaW5ncy4KLSAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHdlJ3JlIG5vdCByZXBlYXRpbmcgdGhlIHByZXZpb3VzIHN0YXRlLgotICAgICAgICBsZXQgcHJldl9lbmFibGVkID0gc2VsZi5lbmFibGVkOwotICAgICAgICBsZXQgZGVmYXVsdF9hZGFwdGVyID0gc2VsZi5kZWZhdWx0X2FkYXB0ZXI7Ci0gICAgICAgIGlmIGhjaV9pbnRlcmZhY2UgPT0gZGVmYXVsdF9hZGFwdGVyICYmIHByZXZfZW5hYmxlZCAhPSBlbmFibGVkIHsKLSAgICAgICAgICAgIHNlbGYuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICBzZWxmLmFkYXB0ZXJfcmVhZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIGVuYWJsZWQgewotICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2FkYXB0ZXJfcHJveHkoaGNpX2ludGVyZmFjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRlcl9kYnVzID0gTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZXMgYWRhcHRlciBwcm94eSwgcmVnaXN0ZXJzIGNhbGxiYWNrcyBhbmQgaW5pdGlhbGl6ZXMgYWRkcmVzcy4KLSAgICBmbiBjcmVhdGVfYWRhcHRlcl9wcm94eSgmbXV0IHNlbGYsIGlkeDogaTMyKSB7Ci0gICAgICAgIGxldCBjb25uID0gc2VsZi5kYnVzX2Nvbm5lY3Rpb24uY2xvbmUoKTsKLSAgICAgICAgbGV0IGNyID0gc2VsZi5kYnVzX2Nyb3Nzcm9hZHMuY2xvbmUoKTsKLQotICAgICAgICBsZXQgZGJ1cyA9IEJsdWV0b290aERCdXM6Om5ldyhjb25uLmNsb25lKCksIGNyLmNsb25lKCksIGlkeCk7Ci0gICAgICAgIHNlbGYuYWRhcHRlcl9kYnVzID0gU29tZShkYnVzKTsKLQotICAgICAgICBsZXQgZ2F0dF9kYnVzID0gQmx1ZXRvb3RoR2F0dERCdXM6Om5ldyhjb25uLmNsb25lKCksIGNyLmNsb25lKCksIGlkeCk7Ci0gICAgICAgIHNlbGYuZ2F0dF9kYnVzID0gU29tZShnYXR0X2RidXMpOwotCi0gICAgICAgIC8vIFRyaWdnZXIgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGluIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgIGxldCBmZyA9IHNlbGYuZmcuY2xvbmUoKTsKLSAgICAgICAgdG9raW86OnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgbGV0IGFkYXB0ZXIgPSBTdHJpbmc6OmZyb20oZm9ybWF0ISgiYWRhcHRlcnt9IiwgaWR4KSk7Ci0gICAgICAgICAgICBsZXQgXyA9IGZnLnNlbmQoRm9yZWdyb3VuZEFjdGlvbnM6OlJlZ2lzdGVyQWRhcHRlckNhbGxiYWNrKGFkYXB0ZXIpKS5hd2FpdDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gRm9yZWdyb3VuZC1vbmx5OiBVcGRhdGVzIHRoZSBhZGFwdGVyIGFkZHJlc3MuCi0gICAgZm4gdXBkYXRlX2FkYXB0ZXJfYWRkcmVzcygmbXV0IHNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgIGxldCBhZGRyZXNzID0gc2VsZi5hZGFwdGVyX2RidXMuYXNfcmVmKCkudW53cmFwKCkuZ2V0X2FkZHJlc3MoKTsKLSAgICAgICAgc2VsZi5hZGFwdGVyX2FkZHJlc3MgPSBTb21lKGFkZHJlc3MuY2xvbmUoKSk7Ci0KLSAgICAgICAgYWRkcmVzcwotICAgIH0KLQotICAgIGZuIGNvbm5lY3RfYWxsX2VuYWJsZWRfcHJvZmlsZXMoJm11dCBzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgewotICAgICAgICBsZXQgZmcgPSBzZWxmLmZnLmNsb25lKCk7Ci0gICAgICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGxldCBfID0gZmcuc2VuZChGb3JlZ3JvdW5kQWN0aW9uczo6Q29ubmVjdEFsbEVuYWJsZWRQcm9maWxlcyhkZXZpY2UpKS5hd2FpdDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gcnVuX2NhbGxiYWNrKCZtdXQgc2VsZiwgY2FsbGJhY2s6IEJveDxkeW4gRm4oQXJjPE11dGV4PENsaWVudENvbnRleHQ+PikgKyBTZW5kPikgewotICAgICAgICBsZXQgZmcgPSBzZWxmLmZnLmNsb25lKCk7Ci0gICAgICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGxldCBfID0gZmcuc2VuZChGb3JlZ3JvdW5kQWN0aW9uczo6UnVuQ2FsbGJhY2soY2FsbGJhY2spKS5hd2FpdDsKLSAgICAgICAgfSk7Ci0gICAgfQotfQotCi0vLy8gQWN0aW9ucyB0byB0YWtlIG9uIHRoZSBmb3JlZ3JvdW5kIGxvb3AuIFRoaXMgYWxsb3dzIHVzIHRvIHF1ZXVlIGFjdGlvbnMgaW4KLS8vLyBjYWxsYmFja3MgdGhhdCBnZXQgcnVuIGluIHRoZSBmb3JlZ3JvdW5kIGNvbnRleHQuCi1lbnVtIEZvcmVncm91bmRBY3Rpb25zIHsKLSAgICBDb25uZWN0QWxsRW5hYmxlZFByb2ZpbGVzKEJsdWV0b290aERldmljZSksIC8vIENvbm5lY3QgYWxsIGVuYWJsZWQgcHJvZmlsZXMgZm9yIHRoaXMgZGV2aWNlCi0gICAgUnVuQ2FsbGJhY2soQm94PGR5biBGbihBcmM8TXV0ZXg8Q2xpZW50Q29udGV4dD4+KSArIFNlbmQ+KSwgLy8gUnVuIGNhbGxiYWNrIGluIGZvcmVncm91bmQKLSAgICBSZWdpc3RlckFkYXB0ZXJDYWxsYmFjayhTdHJpbmcpLCAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgdGhpcyBhZGFwdGVyCi0gICAgUmVhZGxpbmUocnVzdHlsaW5lOjpSZXN1bHQ8U3RyaW5nPiksICAgICAgICAvLyBSZWFkbGluZSByZXN1bHQgZnJvbSBydXN0eWxpbmUKLX0KLQotLy8vIFJ1bnMgYSBjb21tYW5kIGxpbmUgcHJvZ3JhbSB0aGF0IGludGVyYWN0cyB3aXRoIGEgQmx1ZXRvb3RoIHN0YWNrLgotZm4gbWFpbigpIC0+IFJlc3VsdDwoKSwgQm94PGR5biBzdGQ6OmVycm9yOjpFcnJvcj4+IHsKLSAgICAvLyBUT0RPOiBQcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0KLSAgICB0b3BzdGFjazo6Z2V0X3J1bnRpbWUoKS5ibG9ja19vbihhc3luYyBtb3ZlIHsKLSAgICAgICAgLy8gQ29ubmVjdCB0byBELUJ1cyBzeXN0ZW0gYnVzLgotICAgICAgICBsZXQgKHJlc291cmNlLCBjb25uKSA9IGRidXNfdG9raW86OmNvbm5lY3Rpb246Om5ld19zeXN0ZW1fc3luYygpPzsKLQotICAgICAgICAvLyBUaGUgYHJlc291cmNlYCBpcyBhIHRhc2sgdGhhdCBzaG91bGQgYmUgc3Bhd25lZCBvbnRvIGEgdG9raW8gY29tcGF0aWJsZQotICAgICAgICAvLyByZWFjdG9yIEFTQVAuIElmIHRoZSByZXNvdXJjZSBldmVyIGZpbmlzaGVzLCB3ZSBsb3N0IGNvbm5lY3Rpb24gdG8gRC1CdXMuCi0gICAgICAgIHRva2lvOjpzcGF3bihhc3luYyB7Ci0gICAgICAgICAgICBsZXQgZXJyID0gcmVzb3VyY2UuYXdhaXQ7Ci0gICAgICAgICAgICBwYW5pYyEoIkxvc3QgY29ubmVjdGlvbiB0byBELUJ1czoge30iLCBlcnIpOwotICAgICAgICB9KTsKLQotICAgICAgICAvLyBTZXRzIHVwIENyb3Nzcm9hZHMgZm9yIHJlY2VpdmluZyBjYWxsYmFja3MuCi0gICAgICAgIGxldCBjciA9IEFyYzo6bmV3KE11dGV4OjpuZXcoQ3Jvc3Nyb2Fkczo6bmV3KCkpKTsKLSAgICAgICAgY3IubG9jaygpLnVud3JhcCgpLnNldF9hc3luY19zdXBwb3J0KFNvbWUoKAotICAgICAgICAgICAgY29ubi5jbG9uZSgpLAotICAgICAgICAgICAgQm94OjpuZXcofHh8IHsKLSAgICAgICAgICAgICAgICB0b2tpbzo6c3Bhd24oeCk7Ci0gICAgICAgICAgICB9KSwKLSAgICAgICAgKSkpOwotICAgICAgICBsZXQgY3JfY2xvbmUgPSBjci5jbG9uZSgpOwotICAgICAgICBjb25uLnN0YXJ0X3JlY2VpdmUoCi0gICAgICAgICAgICBNYXRjaFJ1bGU6Om5ld19tZXRob2RfY2FsbCgpLAotICAgICAgICAgICAgQm94OjpuZXcobW92ZSB8bXNnLCBjb25ufCB7Ci0gICAgICAgICAgICAgICAgY3JfY2xvbmUubG9jaygpLnVud3JhcCgpLmhhbmRsZV9tZXNzYWdlKG1zZywgY29ubikudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgfSksCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQWNjZXB0IGZvcmVncm91bmQgYWN0aW9ucyB3aXRoIG1wc2MKLSAgICAgICAgbGV0ICh0eCwgcngpID0gbXBzYzo6Y2hhbm5lbDo6PEZvcmVncm91bmRBY3Rpb25zPigxMCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZXh0IG5lZWRlZCBmb3IgaGFuZGxpbmcgY29tbWFuZHMKLSAgICAgICAgbGV0IGNvbnRleHQgPSBBcmM6Om5ldyhNdXRleDo6bmV3KENsaWVudENvbnRleHQ6Om5ldyhjb25uLCBjciwgdHguY2xvbmUoKSkpKTsKLQotICAgICAgICAvLyBDaGVjayBpZiBtYW5hZ2VyIGludGVyZmFjZSBpcyB2YWxpZC4gV2Ugb25seSBwcmludCBzb21lIGhlbHAgdGV4dCBiZWZvcmUgZmFpbGluZyBvbiB0aGUKLSAgICAgICAgLy8gZmlyc3QgYWN0dWFsIGFjY2VzcyB0byB0aGUgaW50ZXJmYWNlIChzbyB3ZSBjYW4gYWxzbyBjYXB0dXJlIHRoZSBhY3R1YWwgcmVhc29uIHRoZQotICAgICAgICAvLyBpbnRlcmZhY2UgaXNuJ3QgdmFsaWQpLgotICAgICAgICBpZiAhY29udGV4dC5sb2NrKCkudW53cmFwKCkubWFuYWdlcl9kYnVzLmlzX3ZhbGlkKCkgewotICAgICAgICAgICAgcHJpbnRsbiEoIkJsdWV0b290aCBtYW5hZ2VyIGRvZXNuJ3Qgc2VlbSB0byBiZSB3b3JraW5nIGNvcnJlY3RseS4iKTsKLSAgICAgICAgICAgIHByaW50bG4hKCJDaGVjayBpZiBzZXJ2aWNlIGlzIHJ1bm5pbmcuIik7Ci0gICAgICAgICAgICBwcmludGxuISgiLi4uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBSZWdpc3RlcmluZyB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIGRvbmUgd2hlbiBidG1hbmFnZXJkIGlzIHJlYWR5IChkZXRlY3Qgd2l0aAotICAgICAgICAvLyBPYmplY3RNYW5hZ2VyKS4KLSAgICAgICAgY29udGV4dC5sb2NrKCkudW53cmFwKCkubWFuYWdlcl9kYnVzLnJlZ2lzdGVyX2NhbGxiYWNrKEJveDo6bmV3KEJ0TWFuYWdlckNhbGxiYWNrOjpuZXcoCi0gICAgICAgICAgICBTdHJpbmc6OmZyb20oIi9vcmcvY2hyb21pdW0vYmx1ZXRvb3RoL2NsaWVudC9ibHVldG9vdGhfbWFuYWdlcl9jYWxsYmFjayIpLAotICAgICAgICAgICAgY29udGV4dC5jbG9uZSgpLAotICAgICAgICApKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlZmF1bHQgYWRhcHRlciBpcyBlbmFibGVkLiBJZiB5ZXMsIHdlIHNob3VsZCBjcmVhdGUgdGhlIGFkYXB0ZXIgcHJveHkKLSAgICAgICAgLy8gcmlnaHQgYXdheS4KLSAgICAgICAgbGV0IGRlZmF1bHRfYWRhcHRlciA9IGNvbnRleHQubG9jaygpLnVud3JhcCgpLmRlZmF1bHRfYWRhcHRlcjsKLSAgICAgICAgaWYgY29udGV4dC5sb2NrKCkudW53cmFwKCkubWFuYWdlcl9kYnVzLmdldF9hZGFwdGVyX2VuYWJsZWQoZGVmYXVsdF9hZGFwdGVyKSB7Ci0gICAgICAgICAgICBjb250ZXh0LmxvY2soKS51bndyYXAoKS5zZXRfYWRhcHRlcl9lbmFibGVkKGRlZmF1bHRfYWRhcHRlciwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgbXV0IGhhbmRsZXIgPSBDb21tYW5kSGFuZGxlcjo6bmV3KGNvbnRleHQuY2xvbmUoKSk7Ci0KLSAgICAgICAgbGV0IGFyZ3M6IFZlYzxTdHJpbmc+ID0gc3RkOjplbnY6OmFyZ3MoKS5jb2xsZWN0KCk7Ci0KLSAgICAgICAgLy8gQWxsb3cgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSByZWFkCi0gICAgICAgIGlmIGFyZ3MubGVuKCkgPiAxIHsKLSAgICAgICAgICAgIGhhbmRsZXIucHJvY2Vzc19jbWRfbGluZSgmYXJnc1sxXSwgJmFyZ3NbMi4uXS50b192ZWMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGFydF9pbnRlcmFjdGl2ZV9zaGVsbChoYW5kbGVyLCB0eCwgcngsIGNvbnRleHQpLmF3YWl0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBSZXN1bHQ6Ok9rKCgpKTsKLSAgICB9KQotfQotCi1hc3luYyBmbiBzdGFydF9pbnRlcmFjdGl2ZV9zaGVsbCgKLSAgICBtdXQgaGFuZGxlcjogQ29tbWFuZEhhbmRsZXIsCi0gICAgdHg6IG1wc2M6OlNlbmRlcjxGb3JlZ3JvdW5kQWN0aW9ucz4sCi0gICAgbXV0IHJ4OiBtcHNjOjpSZWNlaXZlcjxGb3JlZ3JvdW5kQWN0aW9ucz4sCi0gICAgY29udGV4dDogQXJjPE11dGV4PENsaWVudENvbnRleHQ+PiwKLSkgewotICAgIGxldCBjb21tYW5kX2xpc3QgPSBoYW5kbGVyLmdldF9jb21tYW5kX2xpc3QoKS5jbG9uZSgpOwotCi0gICAgbGV0IHNlbWFwaG9yZV9mZyA9IEFyYzo6bmV3KHRva2lvOjpzeW5jOjpTZW1hcGhvcmU6Om5ldygxKSk7Ci0KLSAgICAvLyBBc3luYyB0YXNrIHRvIGtlZXAgcmVhZGluZyBuZXcgbGluZXMgZnJvbSB1c2VyCi0gICAgbGV0IHNlbWFwaG9yZSA9IHNlbWFwaG9yZV9mZy5jbG9uZSgpOwotICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgbGV0IGVkaXRvciA9IEFzeW5jRWRpdG9yOjpuZXcoY29tbWFuZF9saXN0KTsKLQotICAgICAgICBsb29wIHsKLSAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgRm9yZWdyb3VuZEFjdGlvbjo6UmVhZGxpbmUgZmluaXNoZXMgaXRzIHRhc2suCi0gICAgICAgICAgICBsZXQgcGVybWl0ID0gc2VtYXBob3JlLmFjcXVpcmUoKS5hd2FpdDsKLSAgICAgICAgICAgIGlmIHBlcm1pdC5pc19lcnIoKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gTGV0IEZvcmVncm91bmRBY3Rpb246OlJlYWRsaW5lIGRlY2lkZSB3aGVuIGl0J3MgZG9uZS4KLSAgICAgICAgICAgIHBlcm1pdC51bndyYXAoKS5mb3JnZXQoKTsKLQotICAgICAgICAgICAgLy8gSXQncyBnb29kIHRvIGRvIHJlYWRsaW5lIG5vdy4KLSAgICAgICAgICAgIGxldCByZXN1bHQgPSBlZGl0b3IucmVhZGxpbmUoKS5hd2FpdDsKLSAgICAgICAgICAgIGxldCBfID0gdHguc2VuZChGb3JlZ3JvdW5kQWN0aW9uczo6UmVhZGxpbmUocmVzdWx0KSkuYXdhaXQ7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIGxvb3AgewotICAgICAgICBsZXQgbSA9IHJ4LnJlY3YoKS5hd2FpdDsKLQotICAgICAgICBpZiBtLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG1hdGNoIG0udW53cmFwKCkgewotICAgICAgICAgICAgRm9yZWdyb3VuZEFjdGlvbnM6OkNvbm5lY3RBbGxFbmFibGVkUHJvZmlsZXMoZGV2aWNlKSA9PiB7Ci0gICAgICAgICAgICAgICAgaWYgY29udGV4dC5sb2NrKCkudW53cmFwKCkuYWRhcHRlcl9yZWFkeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkYXB0ZXJfZGJ1cwotICAgICAgICAgICAgICAgICAgICAgICAgLmFzX211dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jb25uZWN0X2FsbF9lbmFibGVkX3Byb2ZpbGVzKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoIkFkYXB0ZXIgaXNuJ3QgcmVhZHkgdG8gY29ubmVjdCBwcm9maWxlcy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGb3JlZ3JvdW5kQWN0aW9uczo6UnVuQ2FsbGJhY2soY2FsbGJhY2spID0+IHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjayhjb250ZXh0LmNsb25lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT25jZSBhZGFwdGVyIGlzIHJlYWR5LCByZWdpc3RlciBjYWxsYmFja3MsIGdldCB0aGUgYWRkcmVzcyBhbmQgbWFyayBpdCBhcyByZWFkeQotICAgICAgICAgICAgRm9yZWdyb3VuZEFjdGlvbnM6OlJlZ2lzdGVyQWRhcHRlckNhbGxiYWNrKGFkYXB0ZXIpID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgY2Jfb2JqcGF0aDogU3RyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ISgiL29yZy9jaHJvbWl1bS9ibHVldG9vdGgvY2xpZW50L3t9L2JsdWV0b290aF9jYWxsYmFjayIsIGFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIGxldCBjb25uX2NiX29ianBhdGg6IFN0cmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCEoIi9vcmcvY2hyb21pdW0vYmx1ZXRvb3RoL2NsaWVudC97fS9ibHVldG9vdGhfY29ubl9jYWxsYmFjayIsIGFkYXB0ZXIpOwotCi0gICAgICAgICAgICAgICAgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAubG9jaygpCi0gICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAuYWRhcHRlcl9kYnVzCi0gICAgICAgICAgICAgICAgICAgIC5hc19tdXQoKQotICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyX2NhbGxiYWNrKEJveDo6bmV3KEJ0Q2FsbGJhY2s6Om5ldyhjYl9vYmpwYXRoLCBjb250ZXh0LmNsb25lKCkpKSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAubG9jaygpCi0gICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAuYWRhcHRlcl9kYnVzCi0gICAgICAgICAgICAgICAgICAgIC5hc19tdXQoKQotICAgICAgICAgICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyX2Nvbm5lY3Rpb25fY2FsbGJhY2soQm94OjpuZXcoQnRDb25uZWN0aW9uQ2FsbGJhY2s6Om5ldygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5fY2Jfb2JqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY2xvbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgKSkpOwotICAgICAgICAgICAgICAgIGNvbnRleHQubG9jaygpLnVud3JhcCgpLmFkYXB0ZXJfcmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxldCBhZGFwdGVyX2FkZHJlc3MgPSBjb250ZXh0LmxvY2soKS51bndyYXAoKS51cGRhdGVfYWRhcHRlcl9hZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW5mbyEoIkFkYXB0ZXIge30gaXMgcmVhZHkiLCBhZGFwdGVyX2FkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRm9yZWdyb3VuZEFjdGlvbnM6OlJlYWRsaW5lKHJlc3VsdCkgPT4gbWF0Y2ggcmVzdWx0IHsKLSAgICAgICAgICAgICAgICBFcnIoX2VycikgPT4gewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2sobGluZSkgPT4gewotICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWFuZF92ZWMgPQotICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zcGxpdCgiICIpLm1hcCh8c3wgU3RyaW5nOjpmcm9tKHMpKS5jb2xsZWN0Ojo8VmVjPFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBjbWQgPSAmY29tbWFuZF92ZWNbMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmIGNtZC5lcSgicXVpdCIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIucHJvY2Vzc19jbWRfbGluZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICZTdHJpbmc6OmZyb20oY21kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kX3ZlY1sxLi5jb21tYW5kX3ZlYy5sZW4oKV0udG9fdmVjKCksCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlYWR5IHRvIGRvIHJlYWRsaW5lIGFnYWluLgotICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmVfZmcuYWRkX3Blcm1pdHMoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNlbWFwaG9yZV9mZy5jbG9zZSgpOwotCi0gICAgcHJpbnRfaW5mbyEoIkNsaWVudCBleGl0aW5nIik7Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2RidXNfcHJvamVjdGlvbi9DYXJnby50b21sIGIvZ2QvcnVzdC9saW51eC9kYnVzX3Byb2plY3Rpb24vQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhYzBkOC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L2RidXNfcHJvamVjdGlvbi9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1bcGFja2FnZV0KLW5hbWUgPSAiZGJ1c19wcm9qZWN0aW9uIgotdmVyc2lvbiA9ICIwLjEuMCIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2RlcGVuZGVuY2llc10KLWRidXNfbWFjcm9zID0geyBwYXRoID0gImRidXNfbWFjcm9zIiB9Ci1kYnVzID0gIjAuOS4yIgotZGJ1cy10b2tpbyA9ICIwLjcuMyIKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL2RidXNfbWFjcm9zL0NhcmdvLnRvbWwgYi9nZC9ydXN0L2xpbnV4L2RidXNfcHJvamVjdGlvbi9kYnVzX21hY3Jvcy9DYXJnby50b21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdhMTFiLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL2RidXNfbWFjcm9zL0NhcmdvLnRvbWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1bcGFja2FnZV0KLW5hbWUgPSAiZGJ1c19tYWNyb3MiCi12ZXJzaW9uID0gIjAuMS4wIgotZWRpdGlvbiA9ICIyMDE4IgotCi1bbGliXQotcHJvYy1tYWNybyA9IHRydWUKLQotW2RlcGVuZGVuY2llc10KLXN5biA9IHsgdmVyc2lvbiA9ICIxLjAuNTgiLCBmZWF0dXJlcyA9IFsnZGVmYXVsdCcsICdmdWxsJ10gfQotcXVvdGUgPSAiMS4wIgotcHJvYy1tYWNybzIgPSAiMS4wIgpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9kYnVzX3Byb2plY3Rpb24vZGJ1c19tYWNyb3Mvc3JjL2xpYi5ycyBiL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL2RidXNfbWFjcm9zL3NyYy9saWIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTY4MjIuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9kYnVzX3Byb2plY3Rpb24vZGJ1c19tYWNyb3Mvc3JjL2xpYi5ycworKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi1leHRlcm4gY3JhdGUgcHJvY19tYWNybzsKLQotdXNlIHF1b3RlOjp7Zm9ybWF0X2lkZW50LCBxdW90ZSwgVG9Ub2tlbnN9OwotCi11c2Ugc3RkOjpmczo6RmlsZTsKLXVzZSBzdGQ6OmlvOjpXcml0ZTsKLXVzZSBzdGQ6OnBhdGg6OlBhdGg7Ci0KLXVzZSBzeW46OnBhcnNlOjpQYXJzZXI7Ci11c2Ugc3luOjpwdW5jdHVhdGVkOjpQdW5jdHVhdGVkOwotdXNlIHN5bjo6dG9rZW46OkNvbW1hOwotdXNlIHN5bjo6e0V4cHIsIEZuQXJnLCBJbXBsSXRlbSwgSXRlbUltcGwsIEl0ZW1TdHJ1Y3QsIE1ldGEsIFBhdCwgUmV0dXJuVHlwZSwgVHlwZX07Ci0KLXVzZSBjcmF0ZTo6cHJvY19tYWNybzo6VG9rZW5TdHJlYW07Ci0KLWZuIGRlYnVnX291dHB1dF90b19maWxlKGdlbjogJnByb2NfbWFjcm8yOjpUb2tlblN0cmVhbSwgZmlsZW5hbWU6IFN0cmluZykgewotICAgIGxldCBwYXRoID0gUGF0aDo6bmV3KGZpbGVuYW1lLmFzX3N0cigpKTsKLSAgICBsZXQgbXV0IGZpbGUgPSBGaWxlOjpjcmVhdGUoJnBhdGgpLnVud3JhcCgpOwotICAgIGZpbGUud3JpdGVfYWxsKGdlbi50b19zdHJpbmcoKS5hc19ieXRlcygpKS51bndyYXAoKTsKLX0KLQotLy8vIE1hcmtzIGEgbWV0aG9kIHRvIGJlIHByb2plY3RlZCB0byBhIEQtQnVzIG1ldGhvZCBhbmQgc3BlY2lmaWVzIHRoZSBELUJ1cyBtZXRob2QgbmFtZS4KLSNbcHJvY19tYWNyb19hdHRyaWJ1dGVdCi1wdWIgZm4gZGJ1c19tZXRob2QoX2F0dHI6IFRva2VuU3RyZWFtLCBpdGVtOiBUb2tlblN0cmVhbSkgLT4gVG9rZW5TdHJlYW0gewotICAgIGxldCBvcmlfaXRlbTogcHJvY19tYWNybzI6OlRva2VuU3RyZWFtID0gaXRlbS5jbG9uZSgpLmludG8oKTsKLSAgICBsZXQgZ2VuID0gcXVvdGUhIHsKLSAgICAgICAgI1thbGxvdyh1bnVzZWRfdmFyaWFibGVzKV0KLSAgICAgICAgI29yaV9pdGVtCi0gICAgfTsKLSAgICBnZW4uaW50bygpCi19Ci0KLS8vLyBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byBleHBvcnQgYSBSdXN0IG9iamVjdCB0byBELUJ1cy4KLS8vLwotLy8vIEV4YW1wbGU6Ci0vLy8gICAjW2dlbmVyYXRlX2RidXNfZXhwb3J0ZXIoZXhwb3J0X2Zvb19kYnVzX29iaiwgIm9yZy5leGFtcGxlLkZvb0ludGVyZmFjZSIpXQotLy8vCi0vLy8gVGhpcyBnZW5lcmF0ZXMgYSBtZXRob2QgY2FsbGVkIGBleHBvcnRfZm9vX2RidXNfb2JqYCB0aGF0IHdpbGwgZXhwb3J0IGEgUnVzdCBvYmplY3QgaW50byBhCi0vLy8gRC1CdXMgb2JqZWN0IGhhdmluZyBpbnRlcmZhY2UgYG9yZy5leGFtcGxlLkZvb0ludGVyZmFjZWAuCi0jW3Byb2NfbWFjcm9fYXR0cmlidXRlXQotcHViIGZuIGdlbmVyYXRlX2RidXNfZXhwb3J0ZXIoYXR0cjogVG9rZW5TdHJlYW0sIGl0ZW06IFRva2VuU3RyZWFtKSAtPiBUb2tlblN0cmVhbSB7Ci0gICAgbGV0IG9yaV9pdGVtOiBwcm9jX21hY3JvMjo6VG9rZW5TdHJlYW0gPSBpdGVtLmNsb25lKCkuaW50bygpOwotCi0gICAgbGV0IGFyZ3MgPSBQdW5jdHVhdGVkOjo8RXhwciwgQ29tbWE+OjpwYXJzZV9zZXBhcmF0ZWRfbm9uZW1wdHkucGFyc2UoYXR0ci5jbG9uZSgpKS51bndyYXAoKTsKLQotICAgIGxldCBmbl9pZGVudCA9IGlmIGxldCBFeHByOjpQYXRoKHApID0gJmFyZ3NbMF0gewotICAgICAgICBwLnBhdGguZ2V0X2lkZW50KCkudW53cmFwKCkKLSAgICB9IGVsc2UgewotICAgICAgICBwYW5pYyEoImZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLSAgICB9OwotCi0gICAgbGV0IGRidXNfaWZhY2VfbmFtZSA9IGlmIGxldCBFeHByOjpMaXQobGl0KSA9ICZhcmdzWzFdIHsKLSAgICAgICAgbGl0Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFuaWMhKCJELUJ1cyBpbnRlcmZhY2UgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgIH07Ci0KLSAgICBsZXQgYXN0OiBJdGVtSW1wbCA9IHN5bjo6cGFyc2UoaXRlbS5jbG9uZSgpKS51bndyYXAoKTsKLSAgICBsZXQgYXBpX2lmYWNlX2lkZW50ID0gYXN0LnRyYWl0Xy51bndyYXAoKS4xLnRvX3Rva2VuX3N0cmVhbSgpOwotCi0gICAgbGV0IG11dCByZWdpc3Rlcl9tZXRob2RzID0gcXVvdGUhIHt9OwotCi0gICAgbGV0IG9ial90eXBlID0gcXVvdGUhIHsgc3RkOjpzeW5jOjpBcmM8c3RkOjpzeW5jOjpNdXRleDxCb3g8VD4+PiB9OwotCi0gICAgZm9yIGl0ZW0gaW4gYXN0Lml0ZW1zIHsKLSAgICAgICAgaWYgbGV0IEltcGxJdGVtOjpNZXRob2QobWV0aG9kKSA9IGl0ZW0gewotICAgICAgICAgICAgaWYgbWV0aG9kLmF0dHJzLmxlbigpICE9IDEgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZXQgYXR0ciA9ICZtZXRob2QuYXR0cnNbMF07Ci0gICAgICAgICAgICBpZiAhYXR0ci5wYXRoLmdldF9pZGVudCgpLnVud3JhcCgpLnRvX3N0cmluZygpLmVxKCJkYnVzX21ldGhvZCIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGV0IGF0dHJfYXJncyA9IGF0dHIucGFyc2VfbWV0YSgpLnVud3JhcCgpOwotICAgICAgICAgICAgbGV0IGRidXNfbWV0aG9kX25hbWUgPSBpZiBsZXQgTWV0YTo6TGlzdChtZXRhX2xpc3QpID0gYXR0cl9hcmdzIHsKLSAgICAgICAgICAgICAgICBTb21lKG1ldGFfbGlzdC5uZXN0ZWRbMF0uY2xvbmUoKSkKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTm9uZQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgaWYgZGJ1c19tZXRob2RfbmFtZS5pc19ub25lKCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZXQgbWV0aG9kX25hbWUgPSBtZXRob2Quc2lnLmlkZW50OwotCi0gICAgICAgICAgICBsZXQgbXV0IGFyZ19uYW1lcyA9IHF1b3RlISB7fTsKLSAgICAgICAgICAgIGxldCBtdXQgbWV0aG9kX2FyZ3MgPSBxdW90ZSEge307Ci0gICAgICAgICAgICBsZXQgbXV0IG1ha2VfYXJncyA9IHF1b3RlISB7fTsKLSAgICAgICAgICAgIGxldCBtdXQgZGJ1c19pbnB1dF92YXJzID0gcXVvdGUhIHt9OwotICAgICAgICAgICAgbGV0IG11dCBkYnVzX2lucHV0X3R5cGVzID0gcXVvdGUhIHt9OwotCi0gICAgICAgICAgICBmb3IgaW5wdXQgaW4gbWV0aG9kLnNpZy5pbnB1dHMgewotICAgICAgICAgICAgICAgIGlmIGxldCBGbkFyZzo6VHlwZWQocmVmIHR5cGVkKSA9IGlucHV0IHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IGFyZ190eXBlID0gJnR5cGVkLnR5OwotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgUGF0OjpJZGVudChwYXRfaWRlbnQpID0gJip0eXBlZC5wYXQgewotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkZW50ID0gcGF0X2lkZW50LmlkZW50LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXV0IGRidXNfaW5wdXRfaWRlbnQgPSBpZGVudC50b19zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW5wdXRfaWRlbnQucHVzaF9zdHIoIl8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYnVzX2lucHV0X2FyZyA9IGZvcm1hdF9pZGVudCEoInt9IiwgZGJ1c19pbnB1dF9pZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRlbnRfc3RyaW5nID0gaWRlbnQudG9fc3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyA9IHF1b3RlISB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FyZ19uYW1lcyAjaWRlbnRfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2FyZ3MgPSBxdW90ZSEgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICNtZXRob2RfYXJncyAjaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2lucHV0X3ZhcnMgPSBxdW90ZSEgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkYnVzX2lucHV0X3ZhcnMgI2RidXNfaW5wdXRfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnB1dF90eXBlcyA9IHF1b3RlISB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RidXNfaW5wdXRfdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2FyZ190eXBlIGFzIERCdXNBcmc+OjpEQnVzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfYXJncyA9IHF1b3RlISB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgI21ha2VfYXJncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAjaWRlbnQgPSA8I2FyZ190eXBlIGFzIERCdXNBcmc+Ojpmcm9tX2RidXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkYnVzX2lucHV0X2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShjb25uX2Nsb25lLmNsb25lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKGN0eC5tZXNzYWdlKCkuc2VuZGVyKCkudW53cmFwKCkuaW50b19zdGF0aWMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUoZGNfd2F0Y2hlcl9jbG9uZS5jbG9uZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV0IFJlc3VsdDo6RXJyKGUpID0gI2lkZW50IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihkYnVzX2Nyb3Nzcm9hZHM6Ok1ldGhvZEVycjo6aW52YWxpZF9hcmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvX3N0cmluZygpLmFzX3N0cigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAjaWRlbnQgPSAjaWRlbnQudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZXQgZGJ1c19pbnB1dF9hcmdzID0gcXVvdGUhIHsKLSAgICAgICAgICAgICAgICAoI2RidXNfaW5wdXRfdmFycyk6ICgjZGJ1c19pbnB1dF90eXBlcykKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGxldCBtdXQgb3V0cHV0X25hbWVzID0gcXVvdGUhIHt9OwotICAgICAgICAgICAgbGV0IG11dCBvdXRwdXRfdHlwZSA9IHF1b3RlISB7fTsKLSAgICAgICAgICAgIGxldCBtdXQgcmV0ID0gcXVvdGUhIHtPaygoKSl9OwotICAgICAgICAgICAgaWYgbGV0IFJldHVyblR5cGU6OlR5cGUoXywgdCkgPSBtZXRob2Quc2lnLm91dHB1dCB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0X3R5cGUgPSBxdW90ZSEgezwjdCBhcyBEQnVzQXJnPjo6REJ1c1R5cGUsfTsKLSAgICAgICAgICAgICAgICByZXQgPSBxdW90ZSEge09rKCg8I3QgYXMgREJ1c0FyZz46OnRvX2RidXMocmV0KS51bndyYXAoKSwpKX07Ci0gICAgICAgICAgICAgICAgb3V0cHV0X25hbWVzID0gcXVvdGUhIHsgIm91dCIsIH07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZ2lzdGVyX21ldGhvZHMgPSBxdW90ZSEgewotICAgICAgICAgICAgICAgICNyZWdpc3Rlcl9tZXRob2RzCi0KLSAgICAgICAgICAgICAgICBsZXQgY29ubl9jbG9uZSA9IGNvbm4uY2xvbmUoKTsKLSAgICAgICAgICAgICAgICBsZXQgZGNfd2F0Y2hlcl9jbG9uZSA9IGRpc2Nvbm5lY3Rfd2F0Y2hlci5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGxldCBoYW5kbGVfbWV0aG9kID0gbW92ZSB8Y3R4OiAmbXV0IGRidXNfY3Jvc3Nyb2Fkczo6Q29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iajogJm11dCAjb2JqX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGJ1c19pbnB1dF9hcmdzIHwKLSAgICAgICAgICAgICAgICAgICAgICAtPiBSZXN1bHQ8KCNvdXRwdXRfdHlwZSksIGRidXNfY3Jvc3Nyb2Fkczo6TWV0aG9kRXJyPiB7Ci0gICAgICAgICAgICAgICAgICAgICNtYWtlX2FyZ3MKLSAgICAgICAgICAgICAgICAgICAgbGV0IHJldCA9IG9iai5sb2NrKCkudW53cmFwKCkuI21ldGhvZF9uYW1lKCNtZXRob2RfYXJncyk7Ci0gICAgICAgICAgICAgICAgICAgICNyZXQKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGlidWlsZGVyLm1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgI2RidXNfbWV0aG9kX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICgjYXJnX25hbWVzKSwKLSAgICAgICAgICAgICAgICAgICAgKCNvdXRwdXRfbmFtZXMpLAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWV0aG9kLAotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbGV0IGdlbiA9IHF1b3RlISB7Ci0gICAgICAgICNvcmlfaXRlbQotCi0gICAgICAgIHB1YiBmbiAjZm5faWRlbnQ8VDogJ3N0YXRpYyArICNhcGlfaWZhY2VfaWRlbnQgKyBTZW5kICsgP1NpemVkLCBQOiBJbnRvPGRidXM6OlBhdGg8J3N0YXRpYz4+PigKLSAgICAgICAgICAgIHBhdGg6IFAsCi0gICAgICAgICAgICBjb25uOiBzdGQ6OnN5bmM6OkFyYzxkYnVzOjpub25ibG9jazo6U3luY0Nvbm5lY3Rpb24+LAotICAgICAgICAgICAgY3I6ICZtdXQgZGJ1c19jcm9zc3JvYWRzOjpDcm9zc3JvYWRzLAotICAgICAgICAgICAgb2JqOiAjb2JqX3R5cGUsCi0gICAgICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXI6IHN0ZDo6c3luYzo6QXJjPHN0ZDo6c3luYzo6TXV0ZXg8ZGJ1c19wcm9qZWN0aW9uOjpEaXNjb25uZWN0V2F0Y2hlcj4+LAotICAgICAgICApIHsKLSAgICAgICAgICAgIGZuIGdldF9pZmFjZV90b2tlbjxUOiAjYXBpX2lmYWNlX2lkZW50ICsgU2VuZCArID9TaXplZD4oCi0gICAgICAgICAgICAgICAgY29ubjogc3RkOjpzeW5jOjpBcmM8ZGJ1czo6bm9uYmxvY2s6OlN5bmNDb25uZWN0aW9uPiwKLSAgICAgICAgICAgICAgICBjcjogJm11dCBkYnVzX2Nyb3Nzcm9hZHM6OkNyb3Nzcm9hZHMsCi0gICAgICAgICAgICAgICAgZGlzY29ubmVjdF93YXRjaGVyOiBzdGQ6OnN5bmM6OkFyYzxzdGQ6OnN5bmM6Ok11dGV4PGRidXNfcHJvamVjdGlvbjo6RGlzY29ubmVjdFdhdGNoZXI+PiwKLSAgICAgICAgICAgICkgLT4gZGJ1c19jcm9zc3JvYWRzOjpJZmFjZVRva2VuPCNvYmpfdHlwZT4gewotICAgICAgICAgICAgICAgIGNyLnJlZ2lzdGVyKCNkYnVzX2lmYWNlX25hbWUsIHxpYnVpbGRlcnwgewotICAgICAgICAgICAgICAgICAgICAjcmVnaXN0ZXJfbWV0aG9kcwotICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxldCBpZmFjZV90b2tlbiA9IGdldF9pZmFjZV90b2tlbihjb25uLCBjciwgZGlzY29ubmVjdF93YXRjaGVyKTsKLSAgICAgICAgICAgIGNyLmluc2VydChwYXRoLCAmW2lmYWNlX3Rva2VuXSwgb2JqKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyBUT0RPOiBIYXZlIGEgc3dpdGNoIHRvIHR1cm4gb24vb2ZmIHRoaXMgZGVidWcuCi0gICAgZGVidWdfb3V0cHV0X3RvX2ZpbGUoJmdlbiwgZm9ybWF0ISgiL3RtcC9vdXQte30ucnMiLCBmbl9pZGVudC50b19zdHJpbmcoKSkpOwotCi0gICAgZ2VuLmludG8oKQotfQotCi1mbiBjb3B5X3dpdGhvdXRfYXR0cmlidXRlcyhpdGVtOiAmVG9rZW5TdHJlYW0pIC0+IFRva2VuU3RyZWFtIHsKLSAgICBsZXQgbXV0IGFzdDogSXRlbVN0cnVjdCA9IHN5bjo6cGFyc2UoaXRlbS5jbG9uZSgpKS51bndyYXAoKTsKLSAgICBmb3IgZmllbGQgaW4gJm11dCBhc3QuZmllbGRzIHsKLSAgICAgICAgZmllbGQuYXR0cnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBsZXQgZ2VuID0gcXVvdGUhIHsKLSAgICAgICAgI2FzdAotICAgIH07Ci0KLSAgICBnZW4uaW50bygpCi19Ci0KLS8vLyBHZW5lcmF0ZXMgYSBEQnVzQXJnIGltcGxlbWVudGF0aW9uIHRvIHRyYW5zZm9ybSBSdXN0IHBsYWluIHN0cnVjdHMgdG8gYSBELUJ1cyBkYXRhIHN0cnVjdHVyZS4KLS8vIFRPRE86IFN1cHBvcnQgbW9yZSBkYXRhIHR5cGVzIG9mIHN0cnVjdCBmaWVsZHMgKGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGludGVnZXJzIGFuZCBlbnVtcykuCi0jW3Byb2NfbWFjcm9fYXR0cmlidXRlXQotcHViIGZuIGRidXNfcHJvcG1hcChhdHRyOiBUb2tlblN0cmVhbSwgaXRlbTogVG9rZW5TdHJlYW0pIC0+IFRva2VuU3RyZWFtIHsKLSAgICBsZXQgb3JpX2l0ZW06IHByb2NfbWFjcm8yOjpUb2tlblN0cmVhbSA9IGNvcHlfd2l0aG91dF9hdHRyaWJ1dGVzKCZpdGVtKS5pbnRvKCk7Ci0KLSAgICBsZXQgYXN0OiBJdGVtU3RydWN0ID0gc3luOjpwYXJzZShpdGVtLmNsb25lKCkpLnVud3JhcCgpOwotCi0gICAgbGV0IGFyZ3MgPSBQdW5jdHVhdGVkOjo8RXhwciwgQ29tbWE+OjpwYXJzZV9zZXBhcmF0ZWRfbm9uZW1wdHkucGFyc2UoYXR0ci5jbG9uZSgpKS51bndyYXAoKTsKLSAgICBsZXQgc3RydWN0X2lkZW50ID0KLSAgICAgICAgaWYgbGV0IEV4cHI6OlBhdGgocCkgPSAmYXJnc1swXSB7IHAucGF0aC5nZXRfaWRlbnQoKS51bndyYXAoKS5jbG9uZSgpIH0gZWxzZSB7IGFzdC5pZGVudCB9OwotCi0gICAgbGV0IHN0cnVjdF9zdHIgPSBzdHJ1Y3RfaWRlbnQudG9fc3RyaW5nKCk7Ci0KLSAgICBsZXQgbXV0IG1ha2VfZmllbGRzID0gcXVvdGUhIHt9OwotICAgIGxldCBtdXQgZmllbGRfaWRlbnRzID0gcXVvdGUhIHt9OwotCi0gICAgbGV0IG11dCBpbnNlcnRfbWFwX2ZpZWxkcyA9IHF1b3RlISB7fTsKLSAgICBmb3IgZmllbGQgaW4gYXN0LmZpZWxkcyB7Ci0gICAgICAgIGxldCBmaWVsZF9pZGVudCA9IGZpZWxkLmlkZW50OwotCi0gICAgICAgIGlmIGZpZWxkX2lkZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBmaWVsZF9zdHIgPSBmaWVsZF9pZGVudC5hc19yZWYoKS51bndyYXAoKS5jbG9uZSgpLnRvX3N0cmluZygpOwotCi0gICAgICAgIGxldCBmaWVsZF90eXBlID0gaWYgbGV0IFR5cGU6OlBhdGgodCkgPSBmaWVsZC50eSB7Ci0gICAgICAgICAgICB0Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfTsKLQotICAgICAgICBmaWVsZF9pZGVudHMgPSBxdW90ZSEgewotICAgICAgICAgICAgI2ZpZWxkX2lkZW50cyAjZmllbGRfaWRlbnQsCi0gICAgICAgIH07Ci0KLSAgICAgICAgbGV0IGZpZWxkX3R5cGVfbmFtZSA9IGZvcm1hdF9pZGVudCEgeyJ7fV90eXBlXyIsIGZpZWxkX3N0cn07Ci0gICAgICAgIGxldCBtYWtlX2ZpZWxkID0gcXVvdGUhIHsKLSAgICAgICAgICAgIG1hdGNoICNmaWVsZF9pZGVudC5hcmdfdHlwZSgpIHsKLSAgICAgICAgICAgICAgICBkYnVzOjphcmc6OkFyZ1R5cGU6OlZhcmlhbnQgPT4ge30KLSAgICAgICAgICAgICAgICBfID0+IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihCb3g6Om5ldyhEQnVzQXJnRXJyb3I6Om5ldyhTdHJpbmc6OmZyb20oZm9ybWF0ISgKLSAgICAgICAgICAgICAgICAgICAgICAgICJ7fS57fSBtdXN0IGJlIGEgdmFyaWFudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAjc3RydWN0X3N0ciwgI2ZpZWxkX3N0cgotICAgICAgICAgICAgICAgICAgICApKSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbGV0ICNmaWVsZF9pZGVudCA9IDw8I2ZpZWxkX3R5cGUgYXMgREJ1c0FyZz46OkRCdXNUeXBlIGFzIFJlZkFyZ1RvUnVzdD46OnJlZl9hcmdfdG9fcnVzdCgKLSAgICAgICAgICAgICAgICAjZmllbGRfaWRlbnQuYXNfc3RhdGljX2lubmVyKDApLnVud3JhcCgpLAotICAgICAgICAgICAgICAgIGZvcm1hdCEoInt9Lnt9IiwgI3N0cnVjdF9zdHIsICNmaWVsZF9zdHIpLAotICAgICAgICAgICAgKT87Ci0gICAgICAgICAgICB0eXBlICNmaWVsZF90eXBlX25hbWUgPSAjZmllbGRfdHlwZTsKLSAgICAgICAgICAgIGxldCAjZmllbGRfaWRlbnQgPSAjZmllbGRfdHlwZV9uYW1lOjpmcm9tX2RidXMoCi0gICAgICAgICAgICAgICAgI2ZpZWxkX2lkZW50LAotICAgICAgICAgICAgICAgIGNvbm5fXy5jbG9uZSgpLAotICAgICAgICAgICAgICAgIHJlbW90ZV9fLmNsb25lKCksCi0gICAgICAgICAgICAgICAgZGlzY29ubmVjdF93YXRjaGVyX18uY2xvbmUoKSwKLSAgICAgICAgICAgICk/OwotICAgICAgICB9OwotCi0gICAgICAgIG1ha2VfZmllbGRzID0gcXVvdGUhIHsKLSAgICAgICAgICAgICNtYWtlX2ZpZWxkcwotCi0gICAgICAgICAgICBsZXQgI2ZpZWxkX2lkZW50ID0gbWF0Y2ggZGF0YV9fLmdldCgjZmllbGRfc3RyKSB7Ci0gICAgICAgICAgICAgICAgU29tZShkYXRhKSA9PiBkYXRhLAotICAgICAgICAgICAgICAgIE5vbmUgPT4gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyKEJveDo6bmV3KERCdXNBcmdFcnJvcjo6bmV3KFN0cmluZzo6ZnJvbShmb3JtYXQhKAotICAgICAgICAgICAgICAgICAgICAgICAgInt9Lnt9IGlzIHJlcXVpcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICNzdHJ1Y3Rfc3RyLCAjZmllbGRfc3RyCi0gICAgICAgICAgICAgICAgICAgICkpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAjbWFrZV9maWVsZAotICAgICAgICB9OwotCi0gICAgICAgIGluc2VydF9tYXBfZmllbGRzID0gcXVvdGUhIHsKLSAgICAgICAgICAgICNpbnNlcnRfbWFwX2ZpZWxkcwotICAgICAgICAgICAgbGV0IGZpZWxkX2RhdGFfXyA9IERCdXNBcmc6OnRvX2RidXMoZGF0YV9fLiNmaWVsZF9pZGVudCk/OwotICAgICAgICAgICAgbWFwX18uaW5zZXJ0KFN0cmluZzo6ZnJvbSgjZmllbGRfc3RyKSwgZGJ1czo6YXJnOjpWYXJpYW50KEJveDo6bmV3KGZpZWxkX2RhdGFfXykpKTsKLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBsZXQgZ2VuID0gcXVvdGUhIHsKLSAgICAgICAgI1thbGxvdyhkZWFkX2NvZGUpXQotICAgICAgICAjb3JpX2l0ZW0KLQotICAgICAgICBpbXBsIERCdXNBcmcgZm9yICNzdHJ1Y3RfaWRlbnQgewotICAgICAgICAgICAgdHlwZSBEQnVzVHlwZSA9IGRidXM6OmFyZzo6UHJvcE1hcDsKLQotICAgICAgICAgICAgZm4gZnJvbV9kYnVzKAotICAgICAgICAgICAgICAgIGRhdGFfXzogZGJ1czo6YXJnOjpQcm9wTWFwLAotICAgICAgICAgICAgICAgIGNvbm5fXzogT3B0aW9uPHN0ZDo6c3luYzo6QXJjPGRidXM6Om5vbmJsb2NrOjpTeW5jQ29ubmVjdGlvbj4+LAotICAgICAgICAgICAgICAgIHJlbW90ZV9fOiBPcHRpb248ZGJ1czo6c3RyaW5nczo6QnVzTmFtZTwnc3RhdGljPj4sCi0gICAgICAgICAgICAgICAgZGlzY29ubmVjdF93YXRjaGVyX186IE9wdGlvbjxzdGQ6OnN5bmM6OkFyYzxzdGQ6OnN5bmM6Ok11dGV4PGRidXNfcHJvamVjdGlvbjo6RGlzY29ubmVjdFdhdGNoZXI+Pj4sCi0gICAgICAgICAgICApIC0+IFJlc3VsdDwjc3RydWN0X2lkZW50LCBCb3g8ZHluIHN0ZDo6ZXJyb3I6OkVycm9yPj4gewotICAgICAgICAgICAgICAgICNtYWtlX2ZpZWxkcwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9rKCNzdHJ1Y3RfaWRlbnQgewotICAgICAgICAgICAgICAgICAgICAjZmllbGRfaWRlbnRzCi0gICAgICAgICAgICAgICAgICAgIC4uRGVmYXVsdDo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZuIHRvX2RidXMoZGF0YV9fOiAjc3RydWN0X2lkZW50KSAtPiBSZXN1bHQ8ZGJ1czo6YXJnOjpQcm9wTWFwLCBCb3g8ZHluIHN0ZDo6ZXJyb3I6OkVycm9yPj4gewotICAgICAgICAgICAgICAgIGxldCBtdXQgbWFwX186IGRidXM6OmFyZzo6UHJvcE1hcCA9IHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA6Om5ldygpOwotICAgICAgICAgICAgICAgICNpbnNlcnRfbWFwX2ZpZWxkcwotICAgICAgICAgICAgICAgIHJldHVybiBPayhtYXBfXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gVE9ETzogSGF2ZSBhIHN3aXRjaCB0byB0dXJuIHRoaXMgZGVidWcgb2ZmL29uLgotICAgIGRlYnVnX291dHB1dF90b19maWxlKCZnZW4sIGZvcm1hdCEoIi90bXAvb3V0LXt9LnJzIiwgc3RydWN0X2lkZW50LnRvX3N0cmluZygpKSk7Ci0KLSAgICBnZW4uaW50bygpCi19Ci0KLS8vLyBHZW5lcmF0ZXMgYSBEQnVzQXJnIGltcGxlbWVudGF0aW9uIG9mIGEgUmVtb3RlIFJQQyBwcm94eSBvYmplY3QuCi0jW3Byb2NfbWFjcm9fYXR0cmlidXRlXQotcHViIGZuIGRidXNfcHJveHlfb2JqKGF0dHI6IFRva2VuU3RyZWFtLCBpdGVtOiBUb2tlblN0cmVhbSkgLT4gVG9rZW5TdHJlYW0gewotICAgIGxldCBvcmlfaXRlbTogcHJvY19tYWNybzI6OlRva2VuU3RyZWFtID0gaXRlbS5jbG9uZSgpLmludG8oKTsKLQotICAgIGxldCBhcmdzID0gUHVuY3R1YXRlZDo6PEV4cHIsIENvbW1hPjo6cGFyc2Vfc2VwYXJhdGVkX25vbmVtcHR5LnBhcnNlKGF0dHIuY2xvbmUoKSkudW53cmFwKCk7Ci0KLSAgICBsZXQgc3RydWN0X2lkZW50ID0gaWYgbGV0IEV4cHI6OlBhdGgocCkgPSAmYXJnc1swXSB7Ci0gICAgICAgIHAucGF0aC5nZXRfaWRlbnQoKS51bndyYXAoKQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhbmljISgic3RydWN0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLSAgICB9OwotCi0gICAgbGV0IGRidXNfaWZhY2VfbmFtZSA9IGlmIGxldCBFeHByOjpMaXQobGl0KSA9ICZhcmdzWzFdIHsKLSAgICAgICAgbGl0Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFuaWMhKCJELUJ1cyBpbnRlcmZhY2UgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgIH07Ci0KLSAgICBsZXQgbXV0IG1ldGhvZF9pbXBscyA9IHF1b3RlISB7fTsKLQotICAgIGxldCBhc3Q6IEl0ZW1JbXBsID0gc3luOjpwYXJzZShpdGVtLmNsb25lKCkpLnVud3JhcCgpOwotICAgIGxldCBzZWxmX3R5ID0gYXN0LnNlbGZfdHk7Ci0gICAgbGV0IHRyYWl0XyA9IGFzdC50cmFpdF8udW53cmFwKCkuMTsKLQotICAgIGZvciBpdGVtIGluIGFzdC5pdGVtcyB7Ci0gICAgICAgIGlmIGxldCBJbXBsSXRlbTo6TWV0aG9kKG1ldGhvZCkgPSBpdGVtIHsKLSAgICAgICAgICAgIGlmIG1ldGhvZC5hdHRycy5sZW4oKSAhPSAxIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGV0IGF0dHIgPSAmbWV0aG9kLmF0dHJzWzBdOwotICAgICAgICAgICAgaWYgIWF0dHIucGF0aC5nZXRfaWRlbnQoKS51bndyYXAoKS50b19zdHJpbmcoKS5lcSgiZGJ1c19tZXRob2QiKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxldCBhdHRyX2FyZ3MgPSBhdHRyLnBhcnNlX21ldGEoKS51bndyYXAoKTsKLSAgICAgICAgICAgIGxldCBkYnVzX21ldGhvZF9uYW1lID0gaWYgbGV0IE1ldGE6Okxpc3QobWV0YV9saXN0KSA9IGF0dHJfYXJncyB7Ci0gICAgICAgICAgICAgICAgU29tZShtZXRhX2xpc3QubmVzdGVkWzBdLmNsb25lKCkpCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE5vbmUKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGlmIGRidXNfbWV0aG9kX25hbWUuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGV0IG1ldGhvZF9zaWcgPSBtZXRob2Quc2lnLmNsb25lKCk7Ci0KLSAgICAgICAgICAgIGxldCBtdXQgbWV0aG9kX2FyZ3MgPSBxdW90ZSEge307Ci0KLSAgICAgICAgICAgIGZvciBpbnB1dCBpbiBtZXRob2Quc2lnLmlucHV0cyB7Ci0gICAgICAgICAgICAgICAgaWYgbGV0IEZuQXJnOjpUeXBlZChyZWYgdHlwZWQpID0gaW5wdXQgewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgUGF0OjpJZGVudChwYXRfaWRlbnQpID0gJip0eXBlZC5wYXQgewotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkZW50ID0gcGF0X2lkZW50LmlkZW50LmNsb25lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9hcmdzID0gcXVvdGUhIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbWV0aG9kX2FyZ3MgREJ1c0FyZzo6dG9fZGJ1cygjaWRlbnQpLnVud3JhcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWV0aG9kX2ltcGxzID0gcXVvdGUhIHsKLSAgICAgICAgICAgICAgICAjbWV0aG9kX2ltcGxzCi0gICAgICAgICAgICAgICAgI1thbGxvdyh1bnVzZWRfdmFyaWFibGVzKV0KLSAgICAgICAgICAgICAgICAjbWV0aG9kX3NpZyB7Ci0gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfXyA9IHNlbGYucmVtb3RlLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBvYmpwYXRoX18gPSBzZWxmLm9ianBhdGguY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5fXyA9IHNlbGYuY29ubi5jbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICB0b2tpbzo6c3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJveHkgPSBkYnVzOjpub25ibG9jazo6UHJveHk6Om5ldygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpwYXRoX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0aW1lOjpEdXJhdGlvbjo6ZnJvbV9zZWNzKDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnV0dXJlOiBkYnVzOjpub25ibG9jazo6TWV0aG9kUmVwbHk8KCk+ID0gcHJveHkubWV0aG9kX2NhbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RidXNfaWZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGJ1c19tZXRob2RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoI21ldGhvZF9hcmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgX3Jlc3VsdCA9IGZ1dHVyZS5hd2FpdDsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxldCBnZW4gPSBxdW90ZSEgewotICAgICAgICAjb3JpX2l0ZW0KLQotICAgICAgICBpbXBsIFJQQ1Byb3h5IGZvciAjc2VsZl90eSB7Ci0gICAgICAgICAgICBmbiByZWdpc3Rlcl9kaXNjb25uZWN0KCZtdXQgc2VsZiwgX2Rpc2Nvbm5lY3RfY2FsbGJhY2s6IEJveDxkeW4gRm4odTMyKSArIFNlbmQ+KSAtPiB1MzIgeyAwIH0KLSAgICAgICAgICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCIiKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIF9pZDogdTMyKSAtPiBib29sIHsgZmFsc2UgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3RydWN0ICNzdHJ1Y3RfaWRlbnQgewotICAgICAgICAgICAgY29ubjogc3RkOjpzeW5jOjpBcmM8ZGJ1czo6bm9uYmxvY2s6OlN5bmNDb25uZWN0aW9uPiwKLSAgICAgICAgICAgIHJlbW90ZTogZGJ1czo6c3RyaW5nczo6QnVzTmFtZTwnc3RhdGljPiwKLSAgICAgICAgICAgIG9ianBhdGg6IFBhdGg8J3N0YXRpYz4sCi0gICAgICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXI6IHN0ZDo6c3luYzo6QXJjPHN0ZDo6c3luYzo6TXV0ZXg8RGlzY29ubmVjdFdhdGNoZXI+PiwKLSAgICAgICAgfQotCi0gICAgICAgIGltcGwgI3RyYWl0XyBmb3IgI3N0cnVjdF9pZGVudCB7Ci0gICAgICAgICAgICAjbWV0aG9kX2ltcGxzCi0gICAgICAgIH0KLQotICAgICAgICBpbXBsIFJQQ1Byb3h5IGZvciAjc3RydWN0X2lkZW50IHsKLSAgICAgICAgICAgIGZuIHJlZ2lzdGVyX2Rpc2Nvbm5lY3QoJm11dCBzZWxmLCBkaXNjb25uZWN0X2NhbGxiYWNrOiBCb3g8ZHluIEZuKHUzMikgKyBTZW5kPikgLT4gdTMyIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNjb25uZWN0X3dhdGNoZXIubG9jaygpLnVud3JhcCgpLmFkZChzZWxmLnJlbW90ZS5jbG9uZSgpLCBkaXNjb25uZWN0X2NhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm4gZ2V0X29iamVjdF9pZCgmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgICAgICAgICBzZWxmLm9ianBhdGgudG9fc3RyaW5nKCkuY2xvbmUoKQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmbiB1bnJlZ2lzdGVyKCZtdXQgc2VsZiwgaWQ6IHUzMikgLT4gYm9vbCB7Ci0gICAgICAgICAgICAgICAgc2VsZi5kaXNjb25uZWN0X3dhdGNoZXIubG9jaygpLnVud3JhcCgpLnJlbW92ZShzZWxmLnJlbW90ZS5jbG9uZSgpLCBpZCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGltcGwgREJ1c0FyZyBmb3IgQm94PGR5biAjdHJhaXRfICsgU2VuZD4gewotICAgICAgICAgICAgdHlwZSBEQnVzVHlwZSA9IFBhdGg8J3N0YXRpYz47Ci0KLSAgICAgICAgICAgIGZuIGZyb21fZGJ1cygKLSAgICAgICAgICAgICAgICBvYmpwYXRoX186IFBhdGg8J3N0YXRpYz4sCi0gICAgICAgICAgICAgICAgY29ubl9fOiBPcHRpb248c3RkOjpzeW5jOjpBcmM8ZGJ1czo6bm9uYmxvY2s6OlN5bmNDb25uZWN0aW9uPj4sCi0gICAgICAgICAgICAgICAgcmVtb3RlX186IE9wdGlvbjxkYnVzOjpzdHJpbmdzOjpCdXNOYW1lPCdzdGF0aWM+PiwKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXJfXzogT3B0aW9uPHN0ZDo6c3luYzo6QXJjPHN0ZDo6c3luYzo6TXV0ZXg8RGlzY29ubmVjdFdhdGNoZXI+Pj4sCi0gICAgICAgICAgICApIC0+IFJlc3VsdDxCb3g8ZHluICN0cmFpdF8gKyBTZW5kPiwgQm94PGR5biBzdGQ6OmVycm9yOjpFcnJvcj4+IHsKLSAgICAgICAgICAgICAgICBPayhCb3g6Om5ldygjc3RydWN0X2lkZW50IHsKLSAgICAgICAgICAgICAgICAgICAgY29ubjogY29ubl9fLnVud3JhcCgpLAotICAgICAgICAgICAgICAgICAgICByZW1vdGU6IHJlbW90ZV9fLnVud3JhcCgpLAotICAgICAgICAgICAgICAgICAgICBvYmpwYXRoOiBvYmpwYXRoX18sCi0gICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rfd2F0Y2hlcjogZGlzY29ubmVjdF93YXRjaGVyX18udW53cmFwKCksCi0gICAgICAgICAgICAgICAgfSkpCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZuIHRvX2RidXMoX2RhdGE6IEJveDxkeW4gI3RyYWl0XyArIFNlbmQ+KSAtPiBSZXN1bHQ8UGF0aDwnc3RhdGljPiwgQm94PGR5biBzdGQ6OmVycm9yOjpFcnJvcj4+IHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGltcGwgcmVwcmVzZW50cyBhIHJlbW90ZSBEQnVzIG9iamVjdCwgc28gYHRvX2RidXNgIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0gICAgICAgICAgICAgICAgcGFuaWMhKCJub3QgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyBUT0RPOiBIYXZlIGEgc3dpdGNoIHRvIHR1cm4gdGhpcyBkZWJ1ZyBvZmYvb24uCi0gICAgZGVidWdfb3V0cHV0X3RvX2ZpbGUoJmdlbiwgZm9ybWF0ISgiL3RtcC9vdXQte30ucnMiLCBzdHJ1Y3RfaWRlbnQudG9fc3RyaW5nKCkpKTsKLQotICAgIGdlbi5pbnRvKCkKLX0KLQotLy8vIEdlbmVyYXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBgREJ1c0FyZ2AgdHJhaXQgcmVxdWlyZWQgZm9yIEQtQnVzIHByb2plY3Rpb24uCi0vLy8KLS8vLyBEdWUgdG8gUnVzdCBvcnBoYW4gcnVsZSwgYERCdXNBcmdgIHRyYWl0IG5lZWRzIHRvIGJlIGRlZmluZWQgbG9jYWxseSBpbiB0aGUgY3JhdGUgdGhhdCB3YW50cyB0bwotLy8vIHVzZSBELUJ1cyBwcm9qZWN0aW9uLiBQcm92aWRpbmcgYERCdXNBcmdgIGFzIGEgcHVibGljIHRyYWl0IHdvbid0IGxldCBvdGhlciBjcmF0ZXMgaW1wbGVtZW50Ci0vLy8gaXQgZm9yIHN0cnVjdHMgZGVmaW5lZCBpbiBmb3JlaWduIGNyYXRlcy4gQXMgYSB3b3JrYXJvdW5kLCB0aGlzIG1hY3JvIGlzIHByb3ZpZGVkIHRvIGdlbmVyYXRlCi0vLy8gYERCdXNBcmdgIHRyYWl0IGRlZmluaXRpb24uCi0jW3Byb2NfbWFjcm9dCi1wdWIgZm4gZ2VuZXJhdGVfZGJ1c19hcmcoX2l0ZW06IFRva2VuU3RyZWFtKSAtPiBUb2tlblN0cmVhbSB7Ci0gICAgbGV0IGdlbiA9IHF1b3RlISB7Ci0gICAgICAgIHVzZSBkYnVzOjphcmc6OlByb3BNYXA7Ci0gICAgICAgIHVzZSBkYnVzOjpub25ibG9jazo6U3luY0Nvbm5lY3Rpb247Ci0gICAgICAgIHVzZSBkYnVzOjpzdHJpbmdzOjpCdXNOYW1lOwotICAgICAgICB1c2UgZGJ1c19wcm9qZWN0aW9uOjpEaXNjb25uZWN0V2F0Y2hlcjsKLQotICAgICAgICB1c2Ugc3RkOjplcnJvcjo6RXJyb3I7Ci0gICAgICAgIHVzZSBzdGQ6OmZtdDsKLSAgICAgICAgdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotCi0gICAgICAgICNbZGVyaXZlKERlYnVnKV0KLSAgICAgICAgcHViKGNyYXRlKSBzdHJ1Y3QgREJ1c0FyZ0Vycm9yIHsKLSAgICAgICAgICAgIG1lc3NhZ2U6IFN0cmluZywKLSAgICAgICAgfQotCi0gICAgICAgIGltcGwgREJ1c0FyZ0Vycm9yIHsKLSAgICAgICAgICAgIHB1YiBmbiBuZXcobWVzc2FnZTogU3RyaW5nKSAtPiBEQnVzQXJnRXJyb3IgewotICAgICAgICAgICAgICAgIERCdXNBcmdFcnJvciB7IG1lc3NhZ2UgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW1wbCBmbXQ6OkRpc3BsYXkgZm9yIERCdXNBcmdFcnJvciB7Ci0gICAgICAgICAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKLSAgICAgICAgICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5tZXNzYWdlKQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW1wbCBFcnJvciBmb3IgREJ1c0FyZ0Vycm9yIHt9Ci0KLSAgICAgICAgcHViKGNyYXRlKSB0cmFpdCBSZWZBcmdUb1J1c3QgewotICAgICAgICAgICAgdHlwZSBSdXN0VHlwZTsKLSAgICAgICAgICAgIGZuIHJlZl9hcmdfdG9fcnVzdCgKLSAgICAgICAgICAgICAgICBhcmc6ICYoZHluIGRidXM6OmFyZzo6UmVmQXJnICsgJ3N0YXRpYyksCi0gICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nLAotICAgICAgICAgICAgKSAtPiBSZXN1bHQ8U2VsZjo6UnVzdFR5cGUsIEJveDxkeW4gRXJyb3I+PjsKLSAgICAgICAgfQotCi0gICAgICAgIGltcGw8VDogJ3N0YXRpYyArIENsb25lICsgRGlyZWN0REJ1cz4gUmVmQXJnVG9SdXN0IGZvciBUIHsKLSAgICAgICAgICAgIHR5cGUgUnVzdFR5cGUgPSBUOwotICAgICAgICAgICAgZm4gcmVmX2FyZ190b19ydXN0KAotICAgICAgICAgICAgICAgIGFyZzogJihkeW4gZGJ1czo6YXJnOjpSZWZBcmcgKyAnc3RhdGljKSwKLSAgICAgICAgICAgICAgICBuYW1lOiBTdHJpbmcsCi0gICAgICAgICAgICApIC0+IFJlc3VsdDxTZWxmOjpSdXN0VHlwZSwgQm94PGR5biBFcnJvcj4+IHsKLSAgICAgICAgICAgICAgICBsZXQgYW55ID0gYXJnLmFzX2FueSgpOwotICAgICAgICAgICAgICAgIGlmICFhbnkuaXM6Ojw8U2VsZiBhcyBEQnVzQXJnPjo6REJ1c1R5cGU+KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyKEJveDo6bmV3KERCdXNBcmdFcnJvcjo6bmV3KFN0cmluZzo6ZnJvbShmb3JtYXQhKAotICAgICAgICAgICAgICAgICAgICAgICAgInt9IHR5cGUgZG9lcyBub3QgbWF0Y2g6IGV4cGVjdGVkIHt9LCBmb3VuZCB7fSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbnk6OnR5cGVfbmFtZTo6PDxTZWxmIGFzIERCdXNBcmc+OjpEQnVzVHlwZT4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5hcmdfdHlwZSgpLmFzX3N0cigpLAotICAgICAgICAgICAgICAgICAgICApKSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGV0IGFyZyA9ICgqYW55LmRvd25jYXN0X3JlZjo6PDxTZWxmIGFzIERCdXNBcmc+OjpEQnVzVHlwZT4oKS51bndyYXAoKSkuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT2soYXJnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGltcGwgUmVmQXJnVG9SdXN0IGZvciBkYnVzOjphcmc6OlByb3BNYXAgewotICAgICAgICAgICAgdHlwZSBSdXN0VHlwZSA9IGRidXM6OmFyZzo6UHJvcE1hcDsKLSAgICAgICAgICAgIGZuIHJlZl9hcmdfdG9fcnVzdCgKLSAgICAgICAgICAgICAgICBhcmc6ICYoZHluIGRidXM6OmFyZzo6UmVmQXJnICsgJ3N0YXRpYyksCi0gICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nLAotICAgICAgICAgICAgKSAtPiBSZXN1bHQ8U2VsZjo6UnVzdFR5cGUsIEJveDxkeW4gRXJyb3I+PiB7Ci0gICAgICAgICAgICAgICAgbGV0IG11dCBtYXA6IGRidXM6OmFyZzo6UHJvcE1hcCA9IHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA6Om5ldygpOwotICAgICAgICAgICAgICAgIGxldCBtdXQgaXRlciA9IG1hdGNoIGFyZy5hc19pdGVyKCkgewotICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnIoQm94OjpuZXcoREJ1c0FyZ0Vycm9yOjpuZXcoU3RyaW5nOjpmcm9tKGZvcm1hdCEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInt9IGlzIG5vdCBpdGVyYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICkpKSkpCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU29tZShpdGVtKSA9PiBpdGVtLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgbGV0IG11dCBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBsZXQgbXV0IHZhbCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHdoaWxlICFrZXkuaXNfbm9uZSgpICYmICF2YWwuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IGsgPSBrZXkudW53cmFwKCkuYXNfc3RyKCkudW53cmFwKCkudG9fc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gZGJ1czo6YXJnOjpWYXJpYW50KHZhbC51bndyYXAoKS5ib3hfY2xvbmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5pbnNlcnQoaywgdik7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICB2YWwgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9rKG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBIHZlY3RvciBpcyBjb252ZXJ0aWJsZSBmcm9tIERCdXMnIGR5bmFtaWMgdHlwZSBSZWZBcmcgdG8gUnVzdCdzIFZlYywgaWYgdGhlIGVsZW1lbnRzCi0gICAgICAgIC8vIG9mIHRoZSB2ZWN0b3IgYXJlIGFsc28gY29udmVydGlibGUgdGhlbXNlbHZlcyByZWN1cnNpdmVseS4KLSAgICAgICAgaW1wbDxUOiAnc3RhdGljICsgUmVmQXJnVG9SdXN0PFJ1c3RUeXBlID0gVD4+IFJlZkFyZ1RvUnVzdCBmb3IgVmVjPFQ+IHsKLSAgICAgICAgICAgIHR5cGUgUnVzdFR5cGUgPSBWZWM8VD47Ci0gICAgICAgICAgICBmbiByZWZfYXJnX3RvX3J1c3QoCi0gICAgICAgICAgICAgICAgYXJnOiAmKGR5biBkYnVzOjphcmc6OlJlZkFyZyArICdzdGF0aWMpLAotICAgICAgICAgICAgICAgIF9uYW1lOiBTdHJpbmcsCi0gICAgICAgICAgICApIC0+IFJlc3VsdDxTZWxmOjpSdXN0VHlwZSwgQm94PGR5biBFcnJvcj4+IHsKLSAgICAgICAgICAgICAgICBsZXQgbXV0IHZlYzogVmVjPFQ+ID0gdmVjIVtdOwotICAgICAgICAgICAgICAgIGxldCBtdXQgaXRlciA9IGFyZy5hc19pdGVyKCkudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgbGV0IG11dCB2YWwgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAhdmFsLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBhcmcgPSB2YWwudW53cmFwKCkuYm94X2Nsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBhcmcgPSA8VCBhcyBSZWZBcmdUb1J1c3Q+OjpyZWZfYXJnX3RvX3J1c3QoJmFyZywgX25hbWUuY2xvbmUoKSArICIgZWxlbWVudCIpPzsKLSAgICAgICAgICAgICAgICAgICAgdmVjLnB1c2goYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBPayh2ZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHViKGNyYXRlKSB0cmFpdCBEQnVzQXJnIHsKLSAgICAgICAgICAgIHR5cGUgREJ1c1R5cGU7Ci0KLSAgICAgICAgICAgIGZuIGZyb21fZGJ1cygKLSAgICAgICAgICAgICAgICB4OiBTZWxmOjpEQnVzVHlwZSwKLSAgICAgICAgICAgICAgICBjb25uOiBPcHRpb248QXJjPGRidXM6Om5vbmJsb2NrOjpTeW5jQ29ubmVjdGlvbj4+LAotICAgICAgICAgICAgICAgIHJlbW90ZTogT3B0aW9uPEJ1c05hbWU8J3N0YXRpYz4+LAotICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rfd2F0Y2hlcjogT3B0aW9uPEFyYzxNdXRleDxEaXNjb25uZWN0V2F0Y2hlcj4+PiwKLSAgICAgICAgICAgICkgLT4gUmVzdWx0PFNlbGYsIEJveDxkeW4gRXJyb3I+PgotICAgICAgICAgICAgd2hlcmUKLSAgICAgICAgICAgICAgICBTZWxmOiBTaXplZDsKLQotICAgICAgICAgICAgZm4gdG9fZGJ1cyh4OiBTZWxmKSAtPiBSZXN1bHQ8U2VsZjo6REJ1c1R5cGUsIEJveDxkeW4gRXJyb3I+PjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFR5cGVzIHRoYXQgaW1wbGVtZW50IGRidXM6OmFyZzo6QXBwZW5kIGRvIG5vdCBuZWVkIGFueSBjb252ZXJzaW9uLgotICAgICAgICBwdWIoY3JhdGUpIHRyYWl0IERpcmVjdERCdXMge30KLSAgICAgICAgaW1wbCBEaXJlY3REQnVzIGZvciBib29sIHt9Ci0gICAgICAgIGltcGwgRGlyZWN0REJ1cyBmb3IgaTMyIHt9Ci0gICAgICAgIGltcGwgRGlyZWN0REJ1cyBmb3IgdTMyIHt9Ci0gICAgICAgIGltcGwgRGlyZWN0REJ1cyBmb3IgaTY0IHt9Ci0gICAgICAgIGltcGwgRGlyZWN0REJ1cyBmb3IgdTY0IHt9Ci0gICAgICAgIGltcGwgRGlyZWN0REJ1cyBmb3IgdTE2IHt9Ci0gICAgICAgIGltcGwgRGlyZWN0REJ1cyBmb3IgdTgge30KLSAgICAgICAgaW1wbCBEaXJlY3REQnVzIGZvciBTdHJpbmcge30KLSAgICAgICAgaW1wbDxUOiBEaXJlY3REQnVzPiBEQnVzQXJnIGZvciBUIHsKLSAgICAgICAgICAgIHR5cGUgREJ1c1R5cGUgPSBUOwotCi0gICAgICAgICAgICBmbiBmcm9tX2RidXMoCi0gICAgICAgICAgICAgICAgZGF0YTogVCwKLSAgICAgICAgICAgICAgICBfY29ubjogT3B0aW9uPEFyYzxkYnVzOjpub25ibG9jazo6U3luY0Nvbm5lY3Rpb24+PiwKLSAgICAgICAgICAgICAgICBfcmVtb3RlOiBPcHRpb248QnVzTmFtZTwnc3RhdGljPj4sCi0gICAgICAgICAgICAgICAgX2Rpc2Nvbm5lY3Rfd2F0Y2hlcjogT3B0aW9uPEFyYzxNdXRleDxEaXNjb25uZWN0V2F0Y2hlcj4+PiwKLSAgICAgICAgICAgICkgLT4gUmVzdWx0PFQsIEJveDxkeW4gRXJyb3I+PiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9rKGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmbiB0b19kYnVzKGRhdGE6IFQpIC0+IFJlc3VsdDxULCBCb3g8ZHluIEVycm9yPj4gewotICAgICAgICAgICAgICAgIHJldHVybiBPayhkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGltcGw8VDogREJ1c0FyZz4gREJ1c0FyZyBmb3IgVmVjPFQ+IHsKLSAgICAgICAgICAgIHR5cGUgREJ1c1R5cGUgPSBWZWM8VDo6REJ1c1R5cGU+OwotCi0gICAgICAgICAgICBmbiBmcm9tX2RidXMoCi0gICAgICAgICAgICAgICAgZGF0YTogVmVjPFQ6OkRCdXNUeXBlPiwKLSAgICAgICAgICAgICAgICBjb25uOiBPcHRpb248QXJjPGRidXM6Om5vbmJsb2NrOjpTeW5jQ29ubmVjdGlvbj4+LAotICAgICAgICAgICAgICAgIHJlbW90ZTogT3B0aW9uPEJ1c05hbWU8J3N0YXRpYz4+LAotICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rfd2F0Y2hlcjogT3B0aW9uPEFyYzxNdXRleDxEaXNjb25uZWN0V2F0Y2hlcj4+PiwKLSAgICAgICAgICAgICkgLT4gUmVzdWx0PFZlYzxUPiwgQm94PGR5biBFcnJvcj4+IHsKLSAgICAgICAgICAgICAgICBsZXQgbXV0IGxpc3Q6IFZlYzxUPiA9IHZlYyFbXTsKLSAgICAgICAgICAgICAgICBmb3IgcHJvcCBpbiBkYXRhIHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBUOjpmcm9tX2RidXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmNsb25lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXIuY2xvbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgKT87Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaCh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2sobGlzdCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm4gdG9fZGJ1cyhkYXRhOiBWZWM8VD4pIC0+IFJlc3VsdDxWZWM8VDo6REJ1c1R5cGU+LCBCb3g8ZHluIEVycm9yPj4gewotICAgICAgICAgICAgICAgIGxldCBtdXQgbGlzdDogVmVjPFQ6OkRCdXNUeXBlPiA9IHZlYyFbXTsKLSAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBkYXRhIHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBUOjp0b19kYnVzKGl0ZW0pPzsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPayhsaXN0KQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIFRPRE86IEhhdmUgYSBzd2l0Y2ggdG8gdHVybiB0aGlzIGRlYnVnIG9mZi9vbi4KLSAgICBkZWJ1Z19vdXRwdXRfdG9fZmlsZSgmZ2VuLCBmb3JtYXQhKCIvdG1wL291dC1nZW5lcmF0ZV9kYnVzX2FyZy5ycyIpKTsKLQotICAgIGdlbi5pbnRvKCkKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL3NyYy9saWIucnMgYi9nZC9ydXN0L2xpbnV4L2RidXNfcHJvamVjdGlvbi9zcmMvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2MzODEyLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL3NyYy9saWIucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8hIFRoaXMgY3JhdGUgcHJvdmlkZXMgdG9vbHMgdG8gYXV0b21hdGljYWxseSBwcm9qZWN0IGdlbmVyaWMgQVBJIHRvIEQtQnVzIFJQQy4KLS8vIQotLy8hIEZvciBELUJ1cyBwcm9qZWN0aW9uIHRvIHdvcmsgYXV0b21hdGljYWxseSwgdGhlIEFQSSBuZWVkcyB0byBmb2xsb3cgY2VydGFpbiByZXN0cmljdGlvbnM6Ci0vLyEKLS8vISAqIEFQSSBkb2VzIG5vdCB1c2UgRC1CdXMgc3BlY2lmaWMgZmVhdHVyZXM6IFNpZ25hbHMsIFByb3BlcnRpZXMsIE9iamVjdE1hbmFnZXIuCi0vLyEgKiBJbnRlcmZhY2VzIChjb250YWluIE1ldGhvZHMpIGFyZSBob3N0ZWQgb24gc3RhdGljYWxseSBhbGxvY2F0ZWQgRC1CdXMgb2JqZWN0cy4KLS8vISAqIFdoZW4gdGhlIHNlcnZpY2UgbmVlZHMgdG8gbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgY2hhbmdlcywgY2FsbGJhY2sgb2JqZWN0cyBhcmUgdXNlZC4gVGhlCi0vLyEgICBjbGllbnQgY2FuIHBhc3MgYSBjYWxsYmFjayBvYmplY3Qgb2JleWluZyBhIHNwZWNpZmllZCBJbnRlcmZhY2UgYnkgcGFzc2luZyB0aGUgRC1CdXMgb2JqZWN0Ci0vLyEgICBwYXRoLgotLy8hCi0vLyEgQSBnb29kIGV4YW1wbGUgaXMgaW4KLS8vISBbYG1hbmFnZXJfc2VydmljZWBdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL3JlZnMvaGVhZHMvbWFzdGVyL2dkL3J1c3QvbGludXgvbWdtdCkKLS8vISBjcmF0ZToKLS8vIQotLy8hICogRGVmaW5lIFJQQ1Byb3h5IGxpa2UgaW4KLS8vISBbaGVyZV0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvcmVmcy9oZWFkcy9tYXN0ZXIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9saWIucnMpCi0vLyEgKFRPRE86IFdlIHNob3VsZCByZW1vdmUgdGhpcyByZXF1aXJlbWVudCBpbiB0aGUgZnV0dXJlKS4KLS8vISAqIEdlbmVyYXRlIGBEQnVzQXJnYCB0cmFpdCBsaWtlIGluCi0vLyEgW2hlcmVdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL3JlZnMvaGVhZHMvbWFzdGVyL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvZGJ1c19hcmcucnMpLgotLy8hIFRoaXMgdHJhaXQgaXMgZ2VuZXJhdGVkIGJ5IGEgbWFjcm8gYW5kIGNhbm5vdCBzaW1wbHkgYmUgaW1wb3J0ZWQgYmVjYXVzZSBvZiBSdXN0J3MKLS8vISBbT3JwaGFuIFJ1bGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9JeHJlYy9ydXN0LW9ycGhhbi1ydWxlcykuCi0vLyEgKiBEZWZpbmUgRC1CdXMtYWdub3N0aWMgdHJhaXRzIGxpa2UgaW4KLS8vISBbaGVyZV0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvcmVmcy9oZWFkcy9tYXN0ZXIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9pZmFjZV9ibHVldG9vdGhfbWFuYWdlci5ycykuCi0vLyEgVGhlc2UgdHJhaXRzIGNhbiBiZSBwcm9qZWN0ZWQgaW50byBELUJ1cyBJbnRlcmZhY2VzIG9uIEQtQnVzIG9iamVjdHMuICBBIG1ldGhvZCBwYXJhbWV0ZXIgY2FuCi0vLyEgYmUgb2YgYSBSdXN0IHByaW1pdGl2ZSB0eXBlLCBzdHJ1Y3R1cmUsIGVudW0sIG9yIGEgY2FsbGJhY2sgc3BlY2lhbGx5IHR5cGVkIGFzCi0vLyEgYEJveDxkeW4gU29tZUNhbGxiYWNrVHJhaXQgKyBTZW5kPmAuIENhbGxiYWNrIHRyYWl0cyBpbXBsZW1lbnQgYFJQQ1Byb3h5YC4KLS8vISAqIEltcGxlbWVudCB0aGUgdHJhaXRzIGxpa2UgaW4KLS8vISBbaGVyZV0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvcmVmcy9oZWFkcy9tYXN0ZXIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9iaW4vYnRtYW5hZ2VyZC9ibHVldG9vdGhfbWFuYWdlci5ycyksCi0vLyEgYWxzbyBELUJ1cy1hZ25vc3RpYy4KLS8vISAqIERlZmluZSBELUJ1cyBwcm9qZWN0aW9uIG1hcHBpbmdzIGxpa2UgaW4KLS8vISBbaGVyZV0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2J0LysvcmVmcy9oZWFkcy9tYXN0ZXIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9iaW4vYnRtYW5hZ2VyZC9ibHVldG9vdGhfbWFuYWdlcl9kYnVzLnJzKS4KLS8vISAgICogQWRkIFtgZ2VuZXJhdGVfZGJ1c19leHBvcnRlcmBdKGRidXNfbWFjcm9zOjpnZW5lcmF0ZV9kYnVzX2V4cG9ydGVyKSBtYWNybyB0byBhbiBgaW1wbGAgb2YgYQotLy8hICAgICB0cmFpdC4KLS8vISAgICogRGVmaW5lIGEgbWV0aG9kIG5hbWUgb2YgZWFjaCBtZXRob2Qgd2l0aCBbYGRidXNfbWV0aG9kYF0oZGJ1c19tYWNyb3M6OmRidXNfbWV0aG9kKSBtYWNyby4KLS8vISAgICogU2ltaWxhcmx5LCBmb3IgY2FsbGJhY2tzIHVzZSBbYGRidXNfcHJveHlfb2JqYF0oZGJ1c19tYWNyb3M6OmRidXNfcHJveHlfb2JqKSBtYWNybyB0byBkZWZpbmUKLS8vISAgICAgdGhlIG1ldGhvZCBtYXBwaW5ncy4KLS8vISAgICogUnVzdCBwcmltaXRpdmUgdHlwZXMgY2FuIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5IHRvIGFuZCBmcm9tIEQtQnVzIHR5cGVzLgotLy8hICAgKiBSdXN0IHN0cnVjdHVyZXMgcmVxdWlyZSBpbXBsZW1lbnRhdGlvbnMgb2YgYERCdXNBcmdgIGZvciB0aGUgY29udmVyc2lvbi4gVGhpcyBpcyBtYWRlIGVhc3kKLS8vISAgICAgd2l0aCB0aGUgW2BkYnVzX3Byb3BtYXBgXShkYnVzX21hY3Jvczo6ZGJ1c19wcm9wbWFwKSBtYWNyby4KLS8vISAgICogUnVzdCBlbnVtcyByZXF1aXJlIGltcGxlbWVudGF0aW9ucyBvZiBgREJ1c0FyZ2AgZm9yIHRoZSBjb252ZXJzaW9uLiBUaGlzIGlzIG1hZGUgZWFzeSB3aXRoCi0vLyEgICAgIHRoZSBbYGltcGxfZGJ1c19hcmdfZW51bWBdKGltcGxfZGJ1c19hcmdfZW51bSkgbWFjcm8uCi0vLyEgKiBUbyBwcm9qZWN0IGEgUnVzdCBvYmplY3QgdG8gYSBELUJ1cywgY2FsbCB0aGUgZnVuY3Rpb24gZ2VuZXJhdGVkIGJ5Ci0vLyEgICBbYGdlbmVyYXRlX2RidXNfZXhwb3J0ZXJgXShkYnVzX21hY3Jvczo6Z2VuZXJhdGVfZGJ1c19leHBvcnRlcikgbGlrZSBpbgotLy8hICAgW2hlcmVdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3N5c3RlbS9idC8rL3JlZnMvaGVhZHMvbWFzdGVyL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvbWFpbi5ycykKLS8vISAgIHBhc3NpbmcgaW4gdGhlIG9iamVjdCBwYXRoLCBELUJ1cyBjb25uZWN0aW9uLCBDcm9zc3JvYWRzIG9iamVjdCwgdGhlIFJ1c3Qgb2JqZWN0IHRvIGJlCi0vLyEgICBwcm9qZWN0ZWQsIGFuZCBhIFtgRGlzY29ubmVjdFdhdGNoZXJgXShEaXNjb25uZWN0V2F0Y2hlcikgb2JqZWN0LgotCi11c2UgZGJ1czo6Y2hhbm5lbDo6TWF0Y2hpbmdSZWNlaXZlcjsKLXVzZSBkYnVzOjptZXNzYWdlOjpNYXRjaFJ1bGU7Ci11c2UgZGJ1czo6bm9uYmxvY2s6OlN5bmNDb25uZWN0aW9uOwotdXNlIGRidXM6OnN0cmluZ3M6OkJ1c05hbWU7Ci0KLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotCi0vLy8gQSBELUJ1cyAiTmFtZU93bmVyQ2hhbmdlZCIgaGFuZGxlciB0aGF0IGNvbnRpbnVvdXNseSBtb25pdG9ycyBjbGllbnQgZGlzY29ubmVjdHMuCi0vLy8KLS8vLyBXaGVuIHRoZSB3YXRjaGVkIGJ1cyBhZGRyZXNzIGRpc2Nvbm5lY3RzLCBhbGwgdGhlIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGNhbGxlZCB3aXRoCi0vLy8gdGhlaXIgYXNzb2NpYXRlZCBpZHMuCi1wdWIgc3RydWN0IERpc2Nvbm5lY3RXYXRjaGVyIHsKLSAgICAvLy8gR2xvYmFsIGNvdW50ZXIgdG8gcHJvdmlkZSBhIHVuaXF1ZSBpZCBldmVyeSB0aW1lIGBnZXRfbmV4dF9pZGAgaXMgY2FsbGVkLgotICAgIG5leHRfaWQ6IHUzMiwKLQotICAgIC8vLyBNYXAgb2YgZGlzY29ubmVjdCBjYWxsYmFja3MgYnkgYnVzIGFkZHJlc3MgYW5kIGNhbGxiYWNrIGlkLgotICAgIGNhbGxiYWNrczogQXJjPE11dGV4PEhhc2hNYXA8QnVzTmFtZTwnc3RhdGljPiwgSGFzaE1hcDx1MzIsIEJveDxkeW4gRm4odTMyKSArIFNlbmQ+Pj4+PiwKLX0KLQotaW1wbCBEaXNjb25uZWN0V2F0Y2hlciB7Ci0gICAgLy8vIENyZWF0ZXMgYSBuZXcgRGlzY29ubmVjdFdhdGNoZXIgd2l0aCBlbXB0eSBjYWxsYmFja3MuCi0gICAgcHViIGZuIG5ldygpIC0+IERpc2Nvbm5lY3RXYXRjaGVyIHsKLSAgICAgICAgRGlzY29ubmVjdFdhdGNoZXIgeyBuZXh0X2lkOiAwLCBjYWxsYmFja3M6IEFyYzo6bmV3KE11dGV4OjpuZXcoSGFzaE1hcDo6bmV3KCkpKSB9Ci0gICAgfQotCi0gICAgLy8vIEdldCB0aGUgbmV4dCB1bmlxdWUgaWQgZm9yIHRoaXMgd2F0Y2hlci4KLSAgICBmbiBnZXRfbmV4dF9pZCgmbXV0IHNlbGYpIC0+IHUzMiB7Ci0gICAgICAgIHNlbGYubmV4dF9pZCA9IHNlbGYubmV4dF9pZCArIDE7Ci0gICAgICAgIHNlbGYubmV4dF9pZAotICAgIH0KLX0KLQotaW1wbCBEaXNjb25uZWN0V2F0Y2hlciB7Ci0gICAgLy8vIEFkZHMgYSBjbGllbnQgYWRkcmVzcyB0byBiZSBtb25pdG9yZWQgZm9yIGRpc2Nvbm5lY3QgZXZlbnRzLgotICAgIHB1YiBmbiBhZGQoJm11dCBzZWxmLCBhZGRyZXNzOiBCdXNOYW1lPCdzdGF0aWM+LCBjYWxsYmFjazogQm94PGR5biBGbih1MzIpICsgU2VuZD4pIC0+IHUzMiB7Ci0gICAgICAgIGlmICFzZWxmLmNhbGxiYWNrcy5sb2NrKCkudW53cmFwKCkuY29udGFpbnNfa2V5KCZhZGRyZXNzKSB7Ci0gICAgICAgICAgICBzZWxmLmNhbGxiYWNrcy5sb2NrKCkudW53cmFwKCkuaW5zZXJ0KGFkZHJlc3MuY2xvbmUoKSwgSGFzaE1hcDo6bmV3KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGlkID0gc2VsZi5nZXRfbmV4dF9pZCgpOwotICAgICAgICAoKnNlbGYuY2FsbGJhY2tzLmxvY2soKS51bndyYXAoKS5nZXRfbXV0KCZhZGRyZXNzKS51bndyYXAoKSkuaW5zZXJ0KGlkLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8vLyBTZXRzIHVwIHRoZSBELUJ1cyBoYW5kbGVyIHRoYXQgbW9uaXRvcnMgY2xpZW50IGRpc2Nvbm5lY3RzLgotICAgIHB1YiBhc3luYyBmbiBzZXR1cF93YXRjaCgmbXV0IHNlbGYsIGNvbm46IEFyYzxTeW5jQ29ubmVjdGlvbj4pIHsKLSAgICAgICAgbGV0IG1yID0gTWF0Y2hSdWxlOjpuZXdfc2lnbmFsKCJvcmcuZnJlZWRlc2t0b3AuREJ1cyIsICJOYW1lT3duZXJDaGFuZ2VkIik7Ci0KLSAgICAgICAgY29ubi5hZGRfbWF0Y2hfbm9fY2IoJm1yLm1hdGNoX3N0cigpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgbGV0IGNhbGxiYWNrc19tYXAgPSBzZWxmLmNhbGxiYWNrcy5jbG9uZSgpOwotICAgICAgICBjb25uLnN0YXJ0X3JlY2VpdmUoCi0gICAgICAgICAgICBtciwKLSAgICAgICAgICAgIEJveDo6bmV3KG1vdmUgfG1zZywgX2Nvbm58IHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgYXJncyBhcmUgImFkZHJlc3MiLCAib2xkIGFkZHJlc3MiLCAibmV3IGFkZHJlc3MiLgotICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sI2J1cy1tZXNzYWdlcy1uYW1lLW93bmVyLWNoYW5nZWQKLSAgICAgICAgICAgICAgICBsZXQgKGFkZHIsIG9sZCwgbmV3KSA9IG1zZy5nZXQzOjo8U3RyaW5nLCBTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAgICAgICAgIGlmIGFkZHIuaXNfbm9uZSgpIHx8IG9sZC5pc19ub25lKCkgfHwgbmV3LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIG9sZC51bndyYXAoKS5lcSgiIikgfHwgIW5ldy51bndyYXAoKS5lcSgiIikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBvbGQgYWRkcmVzcyBleGlzdHMgYnV0IG5ldyBhZGRyZXNzIGlzIGVtcHR5LCB0aGF0IG1lYW5zIHRoYXQgY2xpZW50IGlzCi0gICAgICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkLiBTbyBjYWxsIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrcyB0byBiZSBub3RpZmllZCBvZiB0aGlzIGNsaWVudAotICAgICAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgbGV0IGFkZHIgPSBCdXNOYW1lOjpuZXcoYWRkci51bndyYXAoKSkudW53cmFwKCkuaW50b19zdGF0aWMoKTsKLSAgICAgICAgICAgICAgICBpZiAhY2FsbGJhY2tzX21hcC5sb2NrKCkudW53cmFwKCkuY29udGFpbnNfa2V5KCZhZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaWQsIGNhbGxiYWNrKSBpbiBjYWxsYmFja3NfbWFwLmxvY2soKS51bndyYXAoKVsmYWRkcl0uaXRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKmlkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYWxsYmFja3NfbWFwLmxvY2soKS51bndyYXAoKS5yZW1vdmUoJmFkZHIpOwotCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgfSksCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLy8vIFJlbW92ZXMgY2FsbGJhY2sgYnkgaWQgaWYgb3duZWQgYnkgdGhlIHNwZWNpZmljIGJ1c25hbWUuCi0gICAgLy8vCi0gICAgLy8vIElmIHRoZSBjYWxsYmFjayBjYW4gYmUgcmVtb3ZlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBiZWluZyByZW1vdmVkLgotICAgIHB1YiBmbiByZW1vdmUoJm11dCBzZWxmLCBhZGRyZXNzOiBCdXNOYW1lPCdzdGF0aWM+LCB0YXJnZXRfaWQ6IHUzMikgLT4gYm9vbCB7Ci0gICAgICAgIGlmICFzZWxmLmNhbGxiYWNrcy5sb2NrKCkudW53cmFwKCkuY29udGFpbnNfa2V5KCZhZGRyZXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXRjaCBzZWxmLmNhbGxiYWNrcy5sb2NrKCkudW53cmFwKCkuZ2V0KCZhZGRyZXNzKS5hbmRfdGhlbih8bXwgbS5nZXQoJnRhcmdldF9pZCkpIHsKLSAgICAgICAgICAgIFNvbWUoY2IpID0+IHsKLSAgICAgICAgICAgICAgICBjYih0YXJnZXRfaWQpOwotICAgICAgICAgICAgICAgIGxldCBfID0gc2VsZgotICAgICAgICAgICAgICAgICAgICAuY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRfbXV0KCZhZGRyZXNzKQotICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofG18IG0ucmVtb3ZlKCZ0YXJnZXRfaWQpKTsKLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOb25lID0+IGZhbHNlLAotICAgICAgICB9Ci0gICAgfQotfQotCi0vLy8gSW1wbGVtZW50cyBgREJ1c0FyZ2AgZm9yIGFuIGVudW0uCi0vLy8KLS8vLyBBIFJ1c3QgZW51bSBpcyBjb252ZXJ0ZWQgdG8gRC1CdXMgSU5UMzIgdHlwZS4KLSNbbWFjcm9fZXhwb3J0XQotbWFjcm9fcnVsZXMhIGltcGxfZGJ1c19hcmdfZW51bSB7Ci0gICAgKCRlbnVtX3R5cGU6dHkpID0+IHsKLSAgICAgICAgaW1wbCBEQnVzQXJnIGZvciAkZW51bV90eXBlIHsKLSAgICAgICAgICAgIHR5cGUgREJ1c1R5cGUgPSB1MzI7Ci0gICAgICAgICAgICBmbiBmcm9tX2RidXMoCi0gICAgICAgICAgICAgICAgZGF0YTogdTMyLAotICAgICAgICAgICAgICAgIF9jb25uOiBPcHRpb248QXJjPFN5bmNDb25uZWN0aW9uPj4sCi0gICAgICAgICAgICAgICAgX3JlbW90ZTogT3B0aW9uPGRidXM6OnN0cmluZ3M6OkJ1c05hbWU8J3N0YXRpYz4+LAotICAgICAgICAgICAgICAgIF9kaXNjb25uZWN0X3dhdGNoZXI6IE9wdGlvbjwKLSAgICAgICAgICAgICAgICAgICAgQXJjPHN0ZDo6c3luYzo6TXV0ZXg8ZGJ1c19wcm9qZWN0aW9uOjpEaXNjb25uZWN0V2F0Y2hlcj4+LAotICAgICAgICAgICAgICAgID4sCi0gICAgICAgICAgICApIC0+IFJlc3VsdDwkZW51bV90eXBlLCBCb3g8ZHluIHN0ZDo6ZXJyb3I6OkVycm9yPj4gewotICAgICAgICAgICAgICAgIG1hdGNoIDwkZW51bV90eXBlPjo6ZnJvbV91MzIoZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBTb21lKHgpID0+IE9rKHgpLAotICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycihCb3g6Om5ldyhEQnVzQXJnRXJyb3I6Om5ldyhTdHJpbmc6OmZyb20oZm9ybWF0ISgKLSAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBjb252ZXJ0aW5nIHt9IHRvIHt9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnkhKCRlbnVtX3R5cGUpCi0gICAgICAgICAgICAgICAgICAgICkpKSkpLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm4gdG9fZGJ1cyhkYXRhOiAkZW51bV90eXBlKSAtPiBSZXN1bHQ8dTMyLCBCb3g8ZHluIHN0ZDo6ZXJyb3I6OkVycm9yPj4gewotICAgICAgICAgICAgICAgIHJldHVybiBPayhkYXRhLnRvX3UzMigpLnVud3JhcCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L2RidXNfcHJvamVjdGlvbi90ZXN0cy9jb252ZXJzaW9ucy5ycyBiL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL3Rlc3RzL2NvbnZlcnNpb25zLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU3ZDcxLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvZGJ1c19wcm9qZWN0aW9uL3Rlc3RzL2NvbnZlcnNpb25zLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLXVzZSBjb3JlOjphbnk6OkFueTsKLQotdXNlIGRidXNfbWFjcm9zOjp7ZGJ1c19wcm9wbWFwLCBnZW5lcmF0ZV9kYnVzX2FyZ307Ci0KLXVzZSBkYnVzOjphcmc6OntBcmcsIEFyZ1R5cGUsIEl0ZXJBcHBlbmQsIFJlZkFyZ307Ci11c2UgZGJ1czo6U2lnbmF0dXJlOwotCi1nZW5lcmF0ZV9kYnVzX2FyZyEoKTsKLQotI1tkZXJpdmUoRGVidWcsIERlZmF1bHQsIENsb25lLCBQYXJ0aWFsRXEpXQotc3RydWN0IE90aGVyU3RydWN0IHsKLSAgICBhZGRyZXNzOiBTdHJpbmcsCi19Ci0KLSNbZGJ1c19wcm9wbWFwKE90aGVyU3RydWN0KV0KLXN0cnVjdCBPdGhlclN0cnVjdERCdXMgewotICAgIGFkZHJlc3M6IFN0cmluZywKLX0KLQotI1tkZXJpdmUoRGVidWcsIERlZmF1bHQsIENsb25lLCBQYXJ0aWFsRXEpXQotc3RydWN0IFNvbWVTdHJ1Y3QgewotICAgIG5hbWU6IFN0cmluZywKLSAgICBudW1iZXI6IGkzMiwKLSAgICBvdGhlcl9zdHJ1Y3Q6IE90aGVyU3RydWN0LAotICAgIGJ5dGVzOiBWZWM8dTg+LAotICAgIG5lc3RlZDogVmVjPFZlYzxTdHJpbmc+PiwKLSAgICByZWN1cnNpdmU6IFZlYzxTb21lU3RydWN0PiwKLX0KLQotI1tkYnVzX3Byb3BtYXAoU29tZVN0cnVjdCldCi1zdHJ1Y3QgU29tZVN0cnVjdERCdXMgewotICAgIG5hbWU6IFN0cmluZywKLSAgICBudW1iZXI6IGkzMiwKLSAgICBvdGhlcl9zdHJ1Y3Q6IE90aGVyU3RydWN0LAotICAgIGJ5dGVzOiBWZWM8dTg+LAotICAgIG5lc3RlZDogVmVjPFZlYzxTdHJpbmc+PiwKLSAgICByZWN1cnNpdmU6IFZlYzxTb21lU3RydWN0PiwKLX0KLQotLy8gUHJldGVuZHMgdG8gYmUgYSBELUJ1cyBkaWN0aW9uYXJ5LgotI1tkZXJpdmUoRGVidWcpXQotc3RydWN0IEZha2VEaWN0aW9uYXJ5IHsKLSAgICBpdGVtczogVmVjPChTdHJpbmcsIEJveDxkeW4gUmVmQXJnPik+LAotfQotCi1pbXBsIFJlZkFyZyBmb3IgRmFrZURpY3Rpb25hcnkgewotICAgIGZuIGFyZ190eXBlKCZzZWxmKSAtPiBBcmdUeXBlIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzaWduYXR1cmUoJnNlbGYpIC0+IGRidXM6OlNpZ25hdHVyZTwnc3RhdGljPiB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gYXBwZW5kKCZzZWxmLCBfOiAmbXV0IEl0ZXJBcHBlbmQ8J18+KSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gYXNfYW55KCZzZWxmKSAtPiAmKGR5biBBbnkgKyAnc3RhdGljKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gYXNfYW55X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgKGR5biBBbnkgKyAnc3RhdGljKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gYm94X2Nsb25lKCZzZWxmKSAtPiBCb3g8ZHluIFJlZkFyZyArICdzdGF0aWM+IHsKLSAgICAgICAgQm94OjpuZXcoRmFrZURpY3Rpb25hcnkgewotICAgICAgICAgICAgaXRlbXM6IHNlbGYuaXRlbXMuaXRlcigpLm1hcCh8KGssIHYpfCAoay5jbG9uZSgpLCB2LmJveF9jbG9uZSgpKSkuY29sbGVjdCgpLAotICAgICAgICB9KQotICAgIH0KLQotICAgIGZuIGFzX2l0ZXI8J2I+KCYnYiBzZWxmKSAtPiBPcHRpb248Qm94PGR5biBJdGVyYXRvcjxJdGVtID0gJidiIGR5biBSZWZBcmc+ICsgJ2I+PiB7Ci0gICAgICAgIFNvbWUoQm94OjpuZXcoCi0gICAgICAgICAgICBzZWxmLml0ZW1zCi0gICAgICAgICAgICAgICAgLml0ZXIoKQotICAgICAgICAgICAgICAgIC5mbGF0X21hcCh8KGssIHYpfCB2ZWMhW2sgYXMgJmR5biBSZWZBcmcsIHYgYXMgJmR5biBSZWZBcmddLmludG9faXRlcigpKSwKLSAgICAgICAgKSkKLSAgICB9Ci19Ci0KLWltcGwgQXJnIGZvciBGYWtlRGljdGlvbmFyeSB7Ci0gICAgY29uc3QgQVJHX1RZUEU6IEFyZ1R5cGUgPSBBcmdUeXBlOjpBcnJheTsKLSAgICBmbiBzaWduYXR1cmUoKSAtPiBkYnVzOjpTaWduYXR1cmU8J3N0YXRpYz4gewotICAgICAgICBTaWduYXR1cmU6OmZyb20oImF7c3Z9IikKLSAgICB9Ci19Ci0KLSNbY2ZnKHRlc3QpXQotbW9kIHRlc3RzIHsKLSAgICB1c2Ugc3VwZXI6Oio7Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9kYnVzX3Byb3BtYXBfZXJyb3IoKSB7Ci0gICAgICAgIGxldCBkYXRhX2RidXMgPSBTdHJpbmc6OmZyb20oInNvbWUgZGF0YSIpOwotICAgICAgICBsZXQgcmVzdWx0ID0gPGRidXM6OmFyZzo6UHJvcE1hcCBhcyBSZWZBcmdUb1J1c3Q+OjpyZWZfYXJnX3RvX3J1c3QoCi0gICAgICAgICAgICAmZGF0YV9kYnVzLAotICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCJTb21lIFZhcmlhYmxlIiksCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydCEocmVzdWx0LmlzX2VycigpKTsKLSAgICAgICAgYXNzZXJ0X2VxISgiU29tZSBWYXJpYWJsZSBpcyBub3QgaXRlcmFibGUiLCByZXN1bHQudW53cmFwX2VycigpLnRvX3N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9kYnVzX3Byb3BtYXBfc3VjY2VzcygpIHsKLSAgICAgICAgbGV0IGRhdGFfZGJ1cyA9IEZha2VEaWN0aW9uYXJ5IHsKLSAgICAgICAgICAgIGl0ZW1zOiB2ZWMhWwotICAgICAgICAgICAgICAgIChTdHJpbmc6OmZyb20oIm5hbWUiKSwgQm94OjpuZXcoU3RyaW5nOjpmcm9tKCJmb28iKSkpLAotICAgICAgICAgICAgICAgIChTdHJpbmc6OmZyb20oIm51bWJlciIpLCBCb3g6Om5ldygxMDApKSwKLSAgICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzo6ZnJvbSgib3RoZXJfc3RydWN0IiksCi0gICAgICAgICAgICAgICAgICAgIEJveDo6bmV3KEZha2VEaWN0aW9uYXJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiB2ZWMhWygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OmZyb20oImFkZHJlc3MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g6Om5ldyhTdHJpbmc6OmZyb20oImFhOmJiOmNjOmRkOmVlOmZmIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgKV0sCi0gICAgICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiYnl0ZXMiKSwgQm94OjpuZXcodmVjIVsxIGFzIHU4LCAyLCAzXSkpLAotICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCJuZXN0ZWQiKSwKLSAgICAgICAgICAgICAgICAgICAgQm94OjpuZXcodmVjIVsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlYyFbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCJzdHJpbmcgYSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzo6ZnJvbSgic3RyaW5nIGIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OmZyb20oInN0cmluZyBjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVjIVtTdHJpbmc6OmZyb20oInN0cmluZyAxIiksIFN0cmluZzo6ZnJvbSgic3RyaW5nIDIiKV0sCi0gICAgICAgICAgICAgICAgICAgIF0pLAotICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OmZyb20oInJlY3Vyc2l2ZSIpLAotICAgICAgICAgICAgICAgICAgICBCb3g6Om5ldyh2ZWMhW0Zha2VEaWN0aW9uYXJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiB2ZWMhWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmc6OmZyb20oIm5hbWUiKSwgQm94OjpuZXcoU3RyaW5nOjpmcm9tKCJiYXIiKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmc6OmZyb20oIm51bWJlciIpLCBCb3g6Om5ldygyMDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzo6ZnJvbSgib3RoZXJfc3RydWN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveDo6bmV3KEZha2VEaWN0aW9uYXJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiB2ZWMhWygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OmZyb20oImFkZHJlc3MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g6Om5ldyhTdHJpbmc6OmZyb20oInh4IikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiYnl0ZXMiKSwgQm94OjpuZXcoVmVjOjo8dTg+OjpuZXcoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmc6OmZyb20oIm5lc3RlZCIpLCBCb3g6Om5ldyhWZWM6OjxWZWM8dTg+Pjo6bmV3KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJyZWN1cnNpdmUiKSwgQm94OjpuZXcoVmVjOjo8RmFrZURpY3Rpb25hcnk+OjpuZXcoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgfV0pLAotICAgICAgICAgICAgICAgICksCi0gICAgICAgICAgICBdLAotICAgICAgICB9OwotICAgICAgICBsZXQgcmVzdWx0ID0gPGRidXM6OmFyZzo6UHJvcE1hcCBhcyBSZWZBcmdUb1J1c3Q+OjpyZWZfYXJnX3RvX3J1c3QoCi0gICAgICAgICAgICAmZGF0YV9kYnVzLAotICAgICAgICAgICAgU3RyaW5nOjpmcm9tKCJTb21lIFZhcmlhYmxlIiksCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydCEocmVzdWx0LmlzX29rKCkpOwotICAgICAgICBsZXQgcmVzdWx0ID0gcmVzdWx0LnVud3JhcCgpOwotICAgICAgICBsZXQgcmVzdWx0X3N0cnVjdCA9IDxTb21lU3RydWN0IGFzIERCdXNBcmc+Ojpmcm9tX2RidXMocmVzdWx0LCBOb25lLCBOb25lLCBOb25lKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3N0cnVjdCA9IFNvbWVTdHJ1Y3QgewotICAgICAgICAgICAgbmFtZTogU3RyaW5nOjpmcm9tKCJmb28iKSwKLSAgICAgICAgICAgIG51bWJlcjogMTAwLAotICAgICAgICAgICAgb3RoZXJfc3RydWN0OiBPdGhlclN0cnVjdCB7IGFkZHJlc3M6IFN0cmluZzo6ZnJvbSgiYWE6YmI6Y2M6ZGQ6ZWU6ZmYiKSB9LAotICAgICAgICAgICAgYnl0ZXM6IHZlYyFbMSwgMiwgM10sCi0gICAgICAgICAgICBuZXN0ZWQ6IHZlYyFbCi0gICAgICAgICAgICAgICAgdmVjIVtTdHJpbmc6OmZyb20oInN0cmluZyBhIiksIFN0cmluZzo6ZnJvbSgic3RyaW5nIGIiKSwgU3RyaW5nOjpmcm9tKCJzdHJpbmcgYyIpXSwKLSAgICAgICAgICAgICAgICB2ZWMhW1N0cmluZzo6ZnJvbSgic3RyaW5nIDEiKSwgU3RyaW5nOjpmcm9tKCJzdHJpbmcgMiIpXSwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICByZWN1cnNpdmU6IHZlYyFbU29tZVN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgbmFtZTogU3RyaW5nOjpmcm9tKCJiYXIiKSwKLSAgICAgICAgICAgICAgICBudW1iZXI6IDIwMCwKLSAgICAgICAgICAgICAgICBvdGhlcl9zdHJ1Y3Q6IE90aGVyU3RydWN0IHsgYWRkcmVzczogU3RyaW5nOjpmcm9tKCJ4eCIpIH0sCi0gICAgICAgICAgICAgICAgYnl0ZXM6IHZlYyFbXSwKLSAgICAgICAgICAgICAgICBuZXN0ZWQ6IHZlYyFbXSwKLSAgICAgICAgICAgICAgICByZWN1cnNpdmU6IHZlYyFbXSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICB9OwotICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkX3N0cnVjdCwgcmVzdWx0X3N0cnVjdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9tZ210L0NhcmdvLnRvbWwgYi9nZC9ydXN0L2xpbnV4L21nbXQvQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNTkzNy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L21nbXQvQ2FyZ28udG9tbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLVtwYWNrYWdlXQotbmFtZSA9ICJtYW5hZ2VyX3NlcnZpY2UiCi12ZXJzaW9uID0gIjAuMC4xIgotZWRpdGlvbiA9ICIyMDE4IgotCi0jIFNlZSBtb3JlIGtleXMgYW5kIHRoZWlyIGRlZmluaXRpb25zIGF0IGh0dHBzOi8vZG9jLnJ1c3QtbGFuZy5vcmcvY2FyZ28vcmVmZXJlbmNlL21hbmlmZXN0Lmh0bWwKLQotW2RlcGVuZGVuY2llc10KLQotIyBidCBkZXBzCi1idF9jb21tb24gPSB7IHBhdGggPSAiLi4vLi4vY29tbW9uIiB9Ci0KLSMgZXh0ZXJuYWwgZGVwcwotZGJ1cyA9ICIwLjkuMiIKLWRidXMtdG9raW8gPSAiMC43LjMiCi1kYnVzLWNyb3Nzcm9hZHMgPSAiMC40LjAiCi1kYnVzX3Byb2plY3Rpb24gPSB7IHBhdGggPSAiLi4vZGJ1c19wcm9qZWN0aW9uIiB9Ci1kYnVzX21hY3JvcyA9IHsgcGF0aCA9ICIuLi9kYnVzX3Byb2plY3Rpb24vZGJ1c19tYWNyb3MiIH0KLWZ1dHVyZXMgPSAiMC4zLjEzIgotaW5vdGlmeSA9ICIqIgotbG9nID0gIjAuNC4xNCIKLW5peCA9ICIqIgotcmVnZXggPSAiMS41Igotc2VyZGVfanNvbiA9ICIxLjAiCi1zeXNsb2cgPSAiNC4wIgotdG9raW8gPSB7IHZlcnNpb24gPSAiMS4wIiwgZmVhdHVyZXMgPSBbImZzIiwgIm1hY3JvcyIsICJydC1tdWx0aS10aHJlYWQiLCAic3luYyJdIH0KLQotW2J1aWxkLWRlcGVuZGVuY2llc10KLXBrZy1jb25maWcgPSAiMC4zLjE5IgotCi1bW2Jpbl1dCi1uYW1lID0gImJ0bWFuYWdlcmQiCi1idWlsZCA9ICJidWlsZC5ycyIKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvbWdtdC9idWlsZC5ycyBiL2dkL3J1c3QvbGludXgvbWdtdC9idWlsZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyOTFiMC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L21nbXQvYnVpbGQucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi11c2UgcGtnX2NvbmZpZzo6Q29uZmlnOwotCi1mbiBtYWluKCkgewotICAgIGxldCB0YXJnZXRfZGlyID0gc3RkOjplbnY6OnZhcl9vcygiQ0FSR09fVEFSR0VUX0RJUiIpLnVud3JhcCgpOwotICAgIHByaW50bG4hKCJjYXJnbzpydXN0Yy1saW5rLXNlYXJjaD1uYXRpdmU9e30iLCB0YXJnZXRfZGlyLmludG9fc3RyaW5nKCkudW53cmFwKCkpOwotCi0gICAgLy8gV2hlbiBjcm9zcy1jb21waWxpbmcsIHBrZy1jb25maWcgaXMgbG9va2luZyBmb3IgZGJ1cyBhdCB0aGUgaG9zdCBsaWJkaXIgaW5zdGVhZCBvZiB0aGUKLSAgICAvLyBzeXNyb290LiBBZGRpbmcgdGhpcyBkZXBlbmRlbmN5IGhlcmUgZm9yY2VzIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSB0aGUgY3VycmVudCBzeXNyb290J3MKLSAgICAvLyBsaWJkaXIgYW5kIGZpeGVzIHRoZSBidWlsZCBpc3N1ZXMuCi0gICAgQ29uZmlnOjpuZXcoKS5wcm9iZSgiZGJ1cy0xIikudW53cmFwKCk7Ci0gICAgcHJpbnRsbiEoImNhcmdvOnJlcnVuLWlmLWNoYW5nZWQ9YnVpbGQucnMiKTsKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvYmx1ZXRvb3RoX21hbmFnZXIucnMgYi9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL2JsdWV0b290aF9tYW5hZ2VyLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgxNzU4Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvYmx1ZXRvb3RoX21hbmFnZXIucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotdXNlIGxvZzo6e2Vycm9yLCBpbmZvfTsKLQotdXNlIG1hbmFnZXJfc2VydmljZTo6aWZhY2VfYmx1ZXRvb3RoX21hbmFnZXI6OnsKLSAgICBBZGFwdGVyV2l0aEVuYWJsZWQsIElCbHVldG9vdGhNYW5hZ2VyLCBJQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrLAotfTsKLQotdXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Ci11c2Ugc3RkOjpwcm9jZXNzOjpDb21tYW5kOwotdXNlIHN0ZDo6c3luYzo6YXRvbWljOjpPcmRlcmluZzsKLQotdXNlIGNyYXRlOjp7Y29uZmlnX3V0aWwsIHN0YXRlX21hY2hpbmUsIE1hbmFnZXJDb250ZXh0fTsKLQotY29uc3QgQkxVRVpfSU5JVF9UQVJHRVQ6ICZzdHIgPSAiYmx1ZXRvb3RoZCI7Ci0KLS8vLyBJbXBsZW1lbnRhdGlvbiBvZiBJQmx1ZXRvb3RoTWFuYWdlci4KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoTWFuYWdlciB7Ci0gICAgbWFuYWdlcl9jb250ZXh0OiBNYW5hZ2VyQ29udGV4dCwKLSAgICBjYWxsYmFja3M6IEhhc2hNYXA8dTMyLCBCb3g8ZHluIElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2sgKyBTZW5kPj4sCi0gICAgY2FjaGVkX2RldmljZXM6IEhhc2hNYXA8aTMyLCBib29sPiwKLX0KLQotaW1wbCBCbHVldG9vdGhNYW5hZ2VyIHsKLSAgICBwdWIoY3JhdGUpIGZuIG5ldyhtYW5hZ2VyX2NvbnRleHQ6IE1hbmFnZXJDb250ZXh0KSAtPiBCbHVldG9vdGhNYW5hZ2VyIHsKLSAgICAgICAgQmx1ZXRvb3RoTWFuYWdlciB7Ci0gICAgICAgICAgICBtYW5hZ2VyX2NvbnRleHQsCi0gICAgICAgICAgICBjYWxsYmFja3M6IEhhc2hNYXA6Om5ldygpLAotICAgICAgICAgICAgY2FjaGVkX2RldmljZXM6IEhhc2hNYXA6Om5ldygpLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHViKGNyYXRlKSBmbiBjYWxsYmFja19oY2lfZGV2aWNlX2NoYW5nZSgmbXV0IHNlbGYsIGhjaV9kZXZpY2U6IGkzMiwgcHJlc2VudDogYm9vbCkgewotICAgICAgICBpZiBwcmVzZW50IHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQgZGV2aWNlIHRvIGZhbHNlIG9yIHdoYXRldmVyIHdhcyBhbHJlYWR5IGV4aXN0aW5nIGluIGNhY2hlCi0gICAgICAgICAgICBzZWxmLmNhY2hlZF9kZXZpY2VzLmVudHJ5KGhjaV9kZXZpY2UpLm9yX2luc2VydChmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgZGV2aWNlIGFuZCBpZ25vcmUgaWYgaXQncyBub3QgdGhlcmUKLSAgICAgICAgICAgIHNlbGYuY2FjaGVkX2RldmljZXMucmVtb3ZlKCZoY2lfZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoXywgY2FsbGJhY2spIGluICZzZWxmLmNhbGxiYWNrcyB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbl9oY2lfZGV2aWNlX2NoYW5nZWQoaGNpX2RldmljZSwgcHJlc2VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWIoY3JhdGUpIGZuIGNhbGxiYWNrX2hjaV9lbmFibGVkX2NoYW5nZSgmbXV0IHNlbGYsIGhjaV9kZXZpY2U6IGkzMiwgZW5hYmxlZDogYm9vbCkgewotICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgZW50cnkgb3IgaW5zZXJ0IG5ldyBvbmUKLSAgICAgICAgbWF0Y2ggc2VsZi5jYWNoZWRfZGV2aWNlcy5nZXRfbXV0KCZoY2lfZGV2aWNlKSB7Ci0gICAgICAgICAgICBTb21lKGRldikgPT4gewotICAgICAgICAgICAgICAgICpkZXYgPSBlbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgXyA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jYWNoZWRfZGV2aWNlcy5pbnNlcnQoaGNpX2RldmljZSwgZW5hYmxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgZm9yIChfLCBjYWxsYmFjaykgaW4gJnNlbGYuY2FsbGJhY2tzIHsKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uX2hjaV9lbmFibGVkX2NoYW5nZWQoaGNpX2RldmljZSwgZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWIoY3JhdGUpIGZuIGNhbGxiYWNrX2Rpc2Nvbm5lY3RlZCgmbXV0IHNlbGYsIGlkOiB1MzIpIHsKLSAgICAgICAgc2VsZi5jYWxsYmFja3MucmVtb3ZlKCZpZCk7Ci0gICAgfQotfQotCi1pbXBsIElCbHVldG9vdGhNYW5hZ2VyIGZvciBCbHVldG9vdGhNYW5hZ2VyIHsKLSAgICBmbiBzdGFydCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMikgewotICAgICAgICBpbmZvISgiU3RhcnRpbmcge30iLCBoY2lfaW50ZXJmYWNlKTsKLSAgICAgICAgaWYgIWNvbmZpZ191dGlsOjptb2RpZnlfaGNpX25fZW5hYmxlZChoY2lfaW50ZXJmYWNlLCB0cnVlKSB7Ci0gICAgICAgICAgICBlcnJvciEoIkNvbmZpZyBpcyBub3Qgc3VjY2Vzc2Z1bGx5IG1vZGlmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZ25vcmUgdGhlIHJlcXVlc3QgaWYgYWRhcHRlciBpcyBhbHJlYWR5IGVuYWJsZWQuCi0gICAgICAgIGlmICpzZWxmLmNhY2hlZF9kZXZpY2VzLmdldCgmaGNpX2ludGVyZmFjZSkudW53cmFwX29yKCZmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi5tYW5hZ2VyX2NvbnRleHQucHJveHkuc3RhcnRfYmx1ZXRvb3RoKGhjaV9pbnRlcmZhY2UpOwotICAgIH0KLQotICAgIGZuIHN0b3AoJm11dCBzZWxmLCBoY2lfaW50ZXJmYWNlOiBpMzIpIHsKLSAgICAgICAgaW5mbyEoIlN0b3BwaW5nIHt9IiwgaGNpX2ludGVyZmFjZSk7Ci0gICAgICAgIGlmICFjb25maWdfdXRpbDo6bW9kaWZ5X2hjaV9uX2VuYWJsZWQoaGNpX2ludGVyZmFjZSwgZmFsc2UpIHsKLSAgICAgICAgICAgIGVycm9yISgiQ29uZmlnIGlzIG5vdCBzdWNjZXNzZnVsbHkgbW9kaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElnbm9yZSB0aGUgcmVxdWVzdCBpZiBhZGFwdGVyIGlzIGFscmVhZHkgZGlzYWJsZWQuCi0gICAgICAgIGlmICEqc2VsZi5jYWNoZWRfZGV2aWNlcy5nZXQoJmhjaV9pbnRlcmZhY2UpLnVud3JhcF9vcigmZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYubWFuYWdlcl9jb250ZXh0LnByb3h5LnN0b3BfYmx1ZXRvb3RoKGhjaV9pbnRlcmZhY2UpOwotICAgIH0KLQotICAgIGZuIGdldF9hZGFwdGVyX2VuYWJsZWQoJm11dCBzZWxmLCBfaGNpX2ludGVyZmFjZTogaTMyKSAtPiBib29sIHsKLSAgICAgICAgbGV0IHByb3h5ID0gc2VsZi5tYW5hZ2VyX2NvbnRleHQucHJveHkuY2xvbmUoKTsKLQotICAgICAgICAvLyBUT0RPKGIvMTg5NTAxNjc2KSAtIFN0YXRlIHNob3VsZCBkZXBlbmQgb24gZ2l2ZW4gYWRhcHRlci4KLSAgICAgICAgbGV0IHN0YXRlID0gcHJveHkuZ2V0X3N0YXRlKCk7Ci0gICAgICAgIGxldCByZXN1bHQgPSBzdGF0ZV9tYWNoaW5lOjpzdGF0ZV90b19lbmFibGVkKHN0YXRlKTsKLSAgICAgICAgcmVzdWx0Ci0gICAgfQotCi0gICAgZm4gcmVnaXN0ZXJfY2FsbGJhY2soJm11dCBzZWxmLCBtdXQgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjayArIFNlbmQ+KSB7Ci0gICAgICAgIGxldCB0eCA9IHNlbGYubWFuYWdlcl9jb250ZXh0LnByb3h5LmdldF90eCgpOwotCi0gICAgICAgIGxldCBpZCA9IGNhbGxiYWNrLnJlZ2lzdGVyX2Rpc2Nvbm5lY3QoQm94OjpuZXcobW92ZSB8Y2JfaWR8IHsKLSAgICAgICAgICAgIGxldCB0eCA9IHR4LmNsb25lKCk7Ci0gICAgICAgICAgICB0b2tpbzo6c3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgbGV0IF9yZXN1bHQgPSB0eC5zZW5kKHN0YXRlX21hY2hpbmU6Ok1lc3NhZ2U6OkNhbGxiYWNrRGlzY29ubmVjdGVkKGNiX2lkKSkuYXdhaXQ7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSkpOwotCi0gICAgICAgIHNlbGYuY2FsbGJhY2tzLmluc2VydChpZCwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIGZuIGdldF9mbG9zc19lbmFibGVkKCZtdXQgc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIGxldCBlbmFibGVkID0gc2VsZi5tYW5hZ2VyX2NvbnRleHQuZmxvc3NfZW5hYmxlZC5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKTsKLSAgICAgICAgZW5hYmxlZAotICAgIH0KLQotICAgIGZuIHNldF9mbG9zc19lbmFibGVkKCZtdXQgc2VsZiwgZW5hYmxlZDogYm9vbCkgewotICAgICAgICBsZXQgcHJldiA9IHNlbGYubWFuYWdlcl9jb250ZXh0LmZsb3NzX2VuYWJsZWQuc3dhcChlbmFibGVkLCBPcmRlcmluZzo6UmVsYXhlZCk7Ci0gICAgICAgIGNvbmZpZ191dGlsOjp3cml0ZV9mbG9zc19lbmFibGVkKGVuYWJsZWQpOwotICAgICAgICBpZiBwcmV2ICE9IGVuYWJsZWQgJiYgZW5hYmxlZCB7Ci0gICAgICAgICAgICBDb21tYW5kOjpuZXcoImluaXRjdGwiKQotICAgICAgICAgICAgICAgIC5hcmdzKCZbInN0b3AiLCBCTFVFWl9JTklUX1RBUkdFVF0pCi0gICAgICAgICAgICAgICAgLm91dHB1dCgpCi0gICAgICAgICAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIHN0b3AgYmx1ZXRvb3RoZCIpOwotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IG11bHRpLWhjaSBjYXNlCi0gICAgICAgICAgICBsZXQgZGVmYXVsdF9kZXZpY2UgPSBjb25maWdfdXRpbDo6bGlzdF9oY2lfZGV2aWNlcygpWzBdOwotICAgICAgICAgICAgaWYgY29uZmlnX3V0aWw6OmlzX2hjaV9uX2VuYWJsZWQoZGVmYXVsdF9kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBsZXQgXyA9IHNlbGYubWFuYWdlcl9jb250ZXh0LnByb3h5LnN0YXJ0X2JsdWV0b290aChkZWZhdWx0X2RldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiBwcmV2ICE9IGVuYWJsZWQgewotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IG11bHRpLWhjaSBjYXNlCi0gICAgICAgICAgICBsZXQgZGVmYXVsdF9kZXZpY2UgPSBjb25maWdfdXRpbDo6bGlzdF9oY2lfZGV2aWNlcygpWzBdOwotICAgICAgICAgICAgc2VsZi5tYW5hZ2VyX2NvbnRleHQucHJveHkuc3RvcF9ibHVldG9vdGgoZGVmYXVsdF9kZXZpY2UpOwotICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJpbml0Y3RsIikKLSAgICAgICAgICAgICAgICAuYXJncygmWyJzdGFydCIsIEJMVUVaX0lOSVRfVEFSR0VUXSkKLSAgICAgICAgICAgICAgICAub3V0cHV0KCkKLSAgICAgICAgICAgICAgICAuZXhwZWN0KCJmYWlsZWQgdG8gc3RhcnQgYmx1ZXRvb3RoZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gZ2V0X2F2YWlsYWJsZV9hZGFwdGVycygmbXV0IHNlbGYpIC0+IFZlYzxBZGFwdGVyV2l0aEVuYWJsZWQ+IHsKLSAgICAgICAgbGV0IGFkYXB0ZXJzID0gY29uZmlnX3V0aWw6Omxpc3RfaGNpX2RldmljZXMoKQotICAgICAgICAgICAgLml0ZXIoKQotICAgICAgICAgICAgLm1hcCh8aGNpX2ludGVyZmFjZXwgewotICAgICAgICAgICAgICAgIGxldCBlbmFibGVkOiBib29sID0gKnNlbGYuY2FjaGVkX2RldmljZXMuZ2V0KCZoY2lfaW50ZXJmYWNlKS51bndyYXBfb3IoJmZhbHNlKTsKLSAgICAgICAgICAgICAgICBBZGFwdGVyV2l0aEVuYWJsZWQgeyBoY2lfaW50ZXJmYWNlOiAqaGNpX2ludGVyZmFjZSwgZW5hYmxlZCB9Ci0gICAgICAgICAgICB9KQotICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8QWRhcHRlcldpdGhFbmFibGVkPj4oKTsKLQotICAgICAgICBhZGFwdGVycwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvYmx1ZXRvb3RoX21hbmFnZXJfZGJ1cy5ycyBiL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvYmx1ZXRvb3RoX21hbmFnZXJfZGJ1cy5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOWNlYS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL2JsdWV0b290aF9tYW5hZ2VyX2RidXMucnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi11c2UgZGJ1czo6YXJnOjpSZWZBcmc7Ci11c2UgZGJ1czo6c3RyaW5nczo6UGF0aDsKLXVzZSBkYnVzX21hY3Jvczo6e2RidXNfbWV0aG9kLCBkYnVzX3Byb3BtYXAsIGRidXNfcHJveHlfb2JqLCBnZW5lcmF0ZV9kYnVzX2V4cG9ydGVyfTsKLXVzZSBkYnVzX3Byb2plY3Rpb246OkRpc2Nvbm5lY3RXYXRjaGVyOwotCi11c2UgbWFuYWdlcl9zZXJ2aWNlOjppZmFjZV9ibHVldG9vdGhfbWFuYWdlcjo6ewotICAgIEFkYXB0ZXJXaXRoRW5hYmxlZCwgSUJsdWV0b290aE1hbmFnZXIsIElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2ssCi19OwotdXNlIG1hbmFnZXJfc2VydmljZTo6UlBDUHJveHk7Ci0KLXVzZSBjcmF0ZTo6ZGJ1c19hcmc6OntEQnVzQXJnLCBEQnVzQXJnRXJyb3IsIFJlZkFyZ1RvUnVzdH07Ci0KLSNbZGJ1c19wcm9wbWFwKEFkYXB0ZXJXaXRoRW5hYmxlZCldCi1wdWIgc3RydWN0IEFkYXB0ZXJXaXRoRW5hYmxlZERidXMgewotICAgIGhjaV9pbnRlcmZhY2U6IGkzMiwKLSAgICBlbmFibGVkOiBib29sLAotfQotCi0vLy8gRC1CdXMgcHJvamVjdGlvbiBvZiBJQmx1ZXRvb3RoTWFuYWdlci4KLXN0cnVjdCBCbHVldG9vdGhNYW5hZ2VyREJ1cyB7fQotCi0jW2dlbmVyYXRlX2RidXNfZXhwb3J0ZXIoZXhwb3J0X2JsdWV0b290aF9tYW5hZ2VyX2RidXNfb2JqLCAib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIildCi1pbXBsIElCbHVldG9vdGhNYW5hZ2VyIGZvciBCbHVldG9vdGhNYW5hZ2VyREJ1cyB7Ci0gICAgI1tkYnVzX21ldGhvZCgiU3RhcnQiKV0KLSAgICBmbiBzdGFydCgmbXV0IHNlbGYsIF9oY2lfaW50ZXJmYWNlOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJTdG9wIildCi0gICAgZm4gc3RvcCgmbXV0IHNlbGYsIF9oY2lfaW50ZXJmYWNlOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJHZXRBZGFwdGVyRW5hYmxlZCIpXQotICAgIGZuIGdldF9hZGFwdGVyX2VuYWJsZWQoJm11dCBzZWxmLCBfaGNpX2ludGVyZmFjZTogaTMyKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJSZWdpc3RlckNhbGxiYWNrIildCi0gICAgZm4gcmVnaXN0ZXJfY2FsbGJhY2soJm11dCBzZWxmLCBfY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjayArIFNlbmQ+KSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiR2V0Rmxvc3NFbmFibGVkIildCi0gICAgZm4gZ2V0X2Zsb3NzX2VuYWJsZWQoJm11dCBzZWxmKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJTZXRGbG9zc0VuYWJsZWQiKV0KLSAgICBmbiBzZXRfZmxvc3NfZW5hYmxlZCgmbXV0IHNlbGYsIF9lbmFibGVkOiBib29sKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiR2V0QXZhaWxhYmxlQWRhcHRlcnMiKV0KLSAgICBmbiBnZXRfYXZhaWxhYmxlX2FkYXB0ZXJzKCZtdXQgc2VsZikgLT4gVmVjPEFkYXB0ZXJXaXRoRW5hYmxlZD4gewotICAgICAgICB2ZWMhW10KLSAgICB9Ci19Ci0KLS8vLyBELUJ1cyBwcm9qZWN0aW9uIG9mIElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2suCi1zdHJ1Y3QgQmx1ZXRvb3RoTWFuYWdlckNhbGxiYWNrREJ1cyB7fQotCi0jW2RidXNfcHJveHlfb2JqKEJsdWV0b290aE1hbmFnZXJDYWxsYmFjaywgIm9yZy5jaHJvbWl1bS5ibHVldG9vdGguTWFuYWdlckNhbGxiYWNrIildCi1pbXBsIElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2sgZm9yIEJsdWV0b290aE1hbmFnZXJDYWxsYmFja0RCdXMgewotICAgICNbZGJ1c19tZXRob2QoIk9uSGNpRGV2aWNlQ2hhbmdlZCIpXQotICAgIGZuIG9uX2hjaV9kZXZpY2VfY2hhbmdlZCgmc2VsZiwgaGNpX2ludGVyZmFjZTogaTMyLCBwcmVzZW50OiBib29sKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25IY2lFbmFibGVkQ2hhbmdlZCIpXQotICAgIGZuIG9uX2hjaV9lbmFibGVkX2NoYW5nZWQoJnNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMiwgZW5hYmxlZDogYm9vbCkge30KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvY29uZmlnX3V0aWwucnMgYi9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL2NvbmZpZ191dGlsLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM5OTdiLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvY29uZmlnX3V0aWwucnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotdXNlIGxvZzo6TGV2ZWxGaWx0ZXI7Ci11c2Ugc2VyZGVfanNvbjo6e01hcCwgVmFsdWV9OwotCi0vLyBEaXJlY3RvcnkgZm9yIEJsdWV0b290aCBoY2kgZGV2aWNlcwotcHViIGNvbnN0IEhDSV9ERVZJQ0VTX0RJUjogJnN0ciA9ICIvc3lzL2NsYXNzL2JsdWV0b290aCI7Ci0KLS8vIEZpbGUgdG8gc3RvcmUgdGhlIEJsdWV0b290aCBkYWVtb24gdG8gdXNlIChibHVleiBvciBmbG9zcykKLWNvbnN0IEJMVUVUT09USF9EQUVNT05fQ1VSUkVOVDogJnN0ciA9ICIvdmFyL2xpYi9ibHVldG9vdGgvYmx1ZXRvb3RoLWRhZW1vbi5jdXJyZW50IjsKLQotLy8gRmlsZSB0byBzdG9yZSB0aGUgY29uZmlnIGZvciBCbHVldG9vdGhNYW5hZ2VyCi1jb25zdCBCVE1BTkFHRVJEX0NPTkY6ICZzdHIgPSAiL3Zhci9saWIvYmx1ZXRvb3RoL2J0bWFuYWdlcmQuanNvbiI7Ci0KLXB1YiBmbiBpc19mbG9zc19lbmFibGVkKCkgLT4gYm9vbCB7Ci0gICAgbWF0Y2ggc3RkOjpmczo6cmVhZChCTFVFVE9PVEhfREFFTU9OX0NVUlJFTlQpIHsKLSAgICAgICAgT2sodikgPT4gewotICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZ2KTsKLSAgICAgICAgICAgIG1hdGNoIGNvbnRlbnQgewotICAgICAgICAgICAgICAgIE9rKHZlcnNpb24pID0+IHZlcnNpb24uY29udGFpbnMoImZsb3NzIiksCi0gICAgICAgICAgICAgICAgRXJyKF8pID0+IGZhbHNlLAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEVycihfKSA9PiBmYWxzZSwKLSAgICB9Ci19Ci0KLXB1YiBmbiB3cml0ZV9mbG9zc19lbmFibGVkKGVuYWJsZWQ6IGJvb2wpIC0+IGJvb2wgewotICAgIHN0ZDo6ZnM6OndyaXRlKAotICAgICAgICBCTFVFVE9PVEhfREFFTU9OX0NVUlJFTlQsCi0gICAgICAgIG1hdGNoIGVuYWJsZWQgewotICAgICAgICAgICAgdHJ1ZSA9PiAiZmxvc3MiLAotICAgICAgICAgICAgXyA9PiAiYmx1ZXoiLAotICAgICAgICB9LAotICAgICkKLSAgICAuaXNfb2soKQotfQotCi1wdWIgZm4gcmVhZF9jb25maWcoKSAtPiBzdGQ6OmlvOjpSZXN1bHQ8U3RyaW5nPiB7Ci0gICAgc3RkOjpmczo6cmVhZF90b19zdHJpbmcoQlRNQU5BR0VSRF9DT05GKQotfQotCi1wdWIgZm4gZ2V0X2xvZ19sZXZlbCgpIC0+IE9wdGlvbjxMZXZlbEZpbHRlcj4gewotICAgIGdldF9sb2dfbGV2ZWxfaW50ZXJuYWwocmVhZF9jb25maWcoKS5vaygpPykKLX0KLQotZm4gZ2V0X2xvZ19sZXZlbF9pbnRlcm5hbChjb25maWc6IFN0cmluZykgLT4gT3B0aW9uPExldmVsRmlsdGVyPiB7Ci0gICAgc2VyZGVfanNvbjo6ZnJvbV9zdHI6OjxWYWx1ZT4oY29uZmlnLmFzX3N0cigpKQotICAgICAgICAub2soKT8KLSAgICAgICAgLmdldCgibG9nX2xldmVsIik/Ci0gICAgICAgIC5hc19zdHIoKT8KLSAgICAgICAgLnBhcnNlOjo8TGV2ZWxGaWx0ZXI+KCkKLSAgICAgICAgLm9rKCkKLX0KLQotLy8vIFJldHVybnMgd2hldGhlciBoY2kgTiBpcyBlbmFibGVkIGluIGNvbmZpZzsgZGVmYXVsdHMgdG8gdHJ1ZS4KLXB1YiBmbiBpc19oY2lfbl9lbmFibGVkKG46IGkzMikgLT4gYm9vbCB7Ci0gICAgbWF0Y2ggcmVhZF9jb25maWcoKS5vaygpLmFuZF90aGVuKHxjb25maWd8IGlzX2hjaV9uX2VuYWJsZWRfaW50ZXJuYWwoY29uZmlnLCBuKSkgewotICAgICAgICBTb21lKHYpID0+IHYsCi0gICAgICAgIF8gPT4gdHJ1ZSwKLSAgICB9Ci19Ci0KLWZuIGlzX2hjaV9uX2VuYWJsZWRfaW50ZXJuYWwoY29uZmlnOiBTdHJpbmcsIG46IGkzMikgLT4gT3B0aW9uPGJvb2w+IHsKLSAgICBzZXJkZV9qc29uOjpmcm9tX3N0cjo6PFZhbHVlPihjb25maWcuYXNfc3RyKCkpCi0gICAgICAgIC5vaygpPwotICAgICAgICAuZ2V0KGZvcm1hdCEoImhjaXt9IiwgbikpPwotICAgICAgICAuYXNfb2JqZWN0KCk/Ci0gICAgICAgIC5nZXQoImVuYWJsZWQiKT8KLSAgICAgICAgLmFzX2Jvb2woKQotfQotCi0vLyBXaGVuIHdlIGluaXRpYWxpemUgQmx1ZXRvb3RoTWFuYWdlciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgYSB3ZWxsLWZvcm1hdHRlZCBqc29uLgotcHViIGZuIGZpeF9jb25maWdfZmlsZV9mb3JtYXQoKSAtPiBib29sIHsKLSAgICBtYXRjaCByZWFkX2NvbmZpZygpIHsKLSAgICAgICAgT2socykgPT4gbWF0Y2ggc2VyZGVfanNvbjo6ZnJvbV9zdHI6OjxWYWx1ZT4ocy5hc19zdHIoKSkgewotICAgICAgICAgICAgT2soXykgPT4gdHJ1ZSwKLSAgICAgICAgICAgIF8gPT4gc3RkOjpmczo6d3JpdGUoQlRNQU5BR0VSRF9DT05GLCAie30iKS5pc19vaygpLAotICAgICAgICB9LAotICAgICAgICBfID0+IHN0ZDo6ZnM6OndyaXRlKEJUTUFOQUdFUkRfQ09ORiwgInt9IikuaXNfb2soKSwKLSAgICB9Ci19Ci0KLXB1YiBmbiBtb2RpZnlfaGNpX25fZW5hYmxlZChuOiBpMzIsIGVuYWJsZWQ6IGJvb2wpIC0+IGJvb2wgewotICAgIGlmICFmaXhfY29uZmlnX2ZpbGVfZm9ybWF0KCkgewotICAgICAgICBmYWxzZQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoIHJlYWRfY29uZmlnKCkKLSAgICAgICAgICAgIC5vaygpCi0gICAgICAgICAgICAuYW5kX3RoZW4ofGNvbmZpZ3wgbW9kaWZ5X2hjaV9uX2VuYWJsZWRfaW50ZXJuYWwoY29uZmlnLCBuLCBlbmFibGVkKSkKLSAgICAgICAgewotICAgICAgICAgICAgU29tZShzKSA9PiBzdGQ6OmZzOjp3cml0ZShCVE1BTkFHRVJEX0NPTkYsIHMpLmlzX29rKCksCi0gICAgICAgICAgICBfID0+IGZhbHNlLAotICAgICAgICB9Ci0gICAgfQotfQotCi1mbiBtb2RpZnlfaGNpX25fZW5hYmxlZF9pbnRlcm5hbChjb25maWc6IFN0cmluZywgbjogaTMyLCBlbmFibGVkOiBib29sKSAtPiBPcHRpb248U3RyaW5nPiB7Ci0gICAgbGV0IGhjaV9pbnRlcmZhY2UgPSBmb3JtYXQhKCJoY2l7fSIsIG4pOwotICAgIGxldCBtdXQgbyA9IHNlcmRlX2pzb246OmZyb21fc3RyOjo8VmFsdWU+KGNvbmZpZy5hc19zdHIoKSkub2soKT87Ci0gICAgbWF0Y2ggby5nZXRfbXV0KGhjaV9pbnRlcmZhY2UuY2xvbmUoKSkgewotICAgICAgICBTb21lKHNlY3Rpb24pID0+IHsKLSAgICAgICAgICAgIHNlY3Rpb24uYXNfb2JqZWN0X211dCgpPy5pbnNlcnQoImVuYWJsZWQiLnRvX3N0cmluZygpLCBWYWx1ZTo6Qm9vbChlbmFibGVkKSk7Ci0gICAgICAgICAgICBzZXJkZV9qc29uOjpzZXI6OnRvX3N0cmluZ19wcmV0dHkoJm8pLm9rKCkKLSAgICAgICAgfQotICAgICAgICBfID0+IHsKLSAgICAgICAgICAgIGxldCBtdXQgZW50cnlfbWFwID0gTWFwOjpuZXcoKTsKLSAgICAgICAgICAgIGVudHJ5X21hcC5pbnNlcnQoImVuYWJsZWQiLnRvX3N0cmluZygpLCBWYWx1ZTo6Qm9vbChlbmFibGVkKSk7Ci0gICAgICAgICAgICBvLmFzX29iamVjdF9tdXQoKT8uaW5zZXJ0KGhjaV9pbnRlcmZhY2UsIFZhbHVlOjpPYmplY3QoZW50cnlfbWFwKSk7Ci0gICAgICAgICAgICBzZXJkZV9qc29uOjpzZXI6OnRvX3N0cmluZ19wcmV0dHkoJm8pLm9rKCkKLSAgICAgICAgfQotICAgIH0KLX0KLQotcHViIGZuIGxpc3RfaGNpX2RldmljZXMoKSAtPiBWZWM8aTMyPiB7Ci0gICAgaGNpX2RldmljZXNfc3RyaW5nX3RvX2ludChsaXN0X2hjaV9kZXZpY2VzX3N0cmluZygpKQotfQotCi1mbiBsaXN0X2hjaV9kZXZpY2VzX3N0cmluZygpIC0+IFZlYzxTdHJpbmc+IHsKLSAgICBtYXRjaCBzdGQ6OmZzOjpyZWFkX2RpcihIQ0lfREVWSUNFU19ESVIpIHsKLSAgICAgICAgT2soZW50cmllcykgPT4gZW50cmllcwotICAgICAgICAgICAgLm1hcCh8ZXwgZS51bndyYXAoKS5wYXRoKCkuZmlsZV9uYW1lKCkudW53cmFwKCkudG9fc3RyKCkudW53cmFwKCkudG9fc3RyaW5nKCkpCi0gICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSwKLSAgICAgICAgXyA9PiBWZWM6Om5ldygpLAotICAgIH0KLX0KLQotZm4gaGNpX2RldmljZXNfc3RyaW5nX3RvX2ludChkZXZpY2VzOiBWZWM8U3RyaW5nPikgLT4gVmVjPGkzMj4gewotICAgIGRldmljZXMKLSAgICAgICAgLmludG9faXRlcigpCi0gICAgICAgIC5maWx0ZXJfbWFwKHxlfCBpZiBlLnN0YXJ0c193aXRoKCJoY2kiKSB7IGVbMy4uXS5wYXJzZTo6PGkzMj4oKS5vaygpIH0gZWxzZSB7IE5vbmUgfSkKLSAgICAgICAgLmNvbGxlY3QoKQotfQotCi1wdWIgZm4gbGlzdF9waWRfZmlsZXMocGlkX2RpcjogJnN0cikgLT4gVmVjPFN0cmluZz4gewotICAgIG1hdGNoIHN0ZDo6ZnM6OnJlYWRfZGlyKHBpZF9kaXIpIHsKLSAgICAgICAgT2soZW50cmllcykgPT4gZW50cmllcwotICAgICAgICAgICAgLm1hcCh8ZXwgZS51bndyYXAoKS5wYXRoKCkuZmlsZV9uYW1lKCkudW53cmFwKCkudG9fc3RyKCkudW53cmFwKCkudG9fc3RyaW5nKCkpCi0gICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSwKLSAgICAgICAgXyA9PiBWZWM6Om5ldygpLAotICAgIH0KLX0KLQotI1tjZmcodGVzdCldCi1tb2QgdGVzdHMgewotICAgIHVzZSBzdXBlcjo6KjsKLQotICAgIGZuIGlzX2hjaV9uX2VuYWJsZWRfaW50ZXJuYWxfd3JhcHBlcihjb25maWc6IFN0cmluZywgbjogaTMyKSAtPiBib29sIHsKLSAgICAgICAgaXNfaGNpX25fZW5hYmxlZF9pbnRlcm5hbChjb25maWcsIG4pLm9yKFNvbWUodHJ1ZSkpLnVud3JhcCgpCi0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHBhcnNlX2xvZ19sZXZlbCgpIHsKLSAgICAgICAgYXNzZXJ0X2VxISgKLSAgICAgICAgICAgIGdldF9sb2dfbGV2ZWxfaW50ZXJuYWwoIntcImxvZ19sZXZlbFwiOiBcImVycm9yXCJ9Ii50b19zdHJpbmcoKSkudW53cmFwKCksCi0gICAgICAgICAgICBMZXZlbEZpbHRlcjo6RXJyb3IKLSAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0X2VxISgKLSAgICAgICAgICAgIGdldF9sb2dfbGV2ZWxfaW50ZXJuYWwoIntcImxvZ19sZXZlbFwiOiBcIndhcm5cIn0iLnRvX3N0cmluZygpKS51bndyYXAoKSwKLSAgICAgICAgICAgIExldmVsRmlsdGVyOjpXYXJuCi0gICAgICAgICk7Ci0gICAgICAgIGFzc2VydF9lcSEoCi0gICAgICAgICAgICBnZXRfbG9nX2xldmVsX2ludGVybmFsKCJ7XCJsb2dfbGV2ZWxcIjogXCJpbmZvXCJ9Ii50b19zdHJpbmcoKSkudW53cmFwKCksCi0gICAgICAgICAgICBMZXZlbEZpbHRlcjo6SW5mbwotICAgICAgICApOwotICAgICAgICBhc3NlcnRfZXEhKAotICAgICAgICAgICAgZ2V0X2xvZ19sZXZlbF9pbnRlcm5hbCgie1wibG9nX2xldmVsXCI6IFwiZGVidWdcIn0iLnRvX3N0cmluZygpKS51bndyYXAoKSwKLSAgICAgICAgICAgIExldmVsRmlsdGVyOjpEZWJ1ZwotICAgICAgICApOwotICAgICAgICBhc3NlcnRfZXEhKAotICAgICAgICAgICAgZ2V0X2xvZ19sZXZlbF9pbnRlcm5hbCgie1wibG9nX2xldmVsXCI6IFwidHJhY2VcIn0iLnRvX3N0cmluZygpKS51bndyYXAoKSwKLSAgICAgICAgICAgIExldmVsRmlsdGVyOjpUcmFjZQotICAgICAgICApOwotICAgICAgICBhc3NlcnRfZXEhKAotICAgICAgICAgICAgZ2V0X2xvZ19sZXZlbF9pbnRlcm5hbCgie1wibG9nX2xldmVsXCI6IFwicmFuZG9tXCJ9Ii50b19zdHJpbmcoKSkuaXNfbm9uZSgpLAotICAgICAgICAgICAgdHJ1ZQotICAgICAgICApOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiBwYXJzZV9oY2kwX2VuYWJsZWQoKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoCi0gICAgICAgICAgICBpc19oY2lfbl9lbmFibGVkX2ludGVybmFsX3dyYXBwZXIoIntcImhjaTBcIjpcbntcImVuYWJsZWRcIjogdHJ1ZX19Ii50b19zdHJpbmcoKSwgMCksCi0gICAgICAgICAgICB0cnVlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIG1vZGlmeV9oY2kwX2VuYWJsZWQoKSB7Ci0gICAgICAgIGxldCBtb2RpZmllZF9zdHJpbmcgPQotICAgICAgICAgICAgbW9kaWZ5X2hjaV9uX2VuYWJsZWRfaW50ZXJuYWwoIntcImhjaTBcIjpcbntcImVuYWJsZWRcIjogZmFsc2V9fSIudG9fc3RyaW5nKCksIDAsIHRydWUpCi0gICAgICAgICAgICAgICAgLnVud3JhcCgpOwotICAgICAgICBhc3NlcnRfZXEhKGlzX2hjaV9uX2VuYWJsZWRfaW50ZXJuYWxfd3JhcHBlcihtb2RpZmllZF9zdHJpbmcsIDApLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gbW9kaWZ5X2hjaTBfZW5hYmxlZF9mcm9tX2VtcHR5KCkgewotICAgICAgICBsZXQgbW9kaWZpZWRfc3RyaW5nID0gbW9kaWZ5X2hjaV9uX2VuYWJsZWRfaW50ZXJuYWwoInt9Ii50b19zdHJpbmcoKSwgMCwgdHJ1ZSkudW53cmFwKCk7Ci0gICAgICAgIGFzc2VydF9lcSEoaXNfaGNpX25fZW5hYmxlZF9pbnRlcm5hbF93cmFwcGVyKG1vZGlmaWVkX3N0cmluZywgMCksIHRydWUpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiBwYXJzZV9oY2kwX25vdF9lbmFibGVkKCkgewotICAgICAgICBhc3NlcnRfZXEhKAotICAgICAgICAgICAgaXNfaGNpX25fZW5hYmxlZF9pbnRlcm5hbF93cmFwcGVyKCJ7XCJoY2kwXCI6XG57XCJlbmFibGVkXCI6IGZhbHNlfX0iLnRvX3N0cmluZygpLCAwKSwKLSAgICAgICAgICAgIGZhbHNlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHBhcnNlX2hjaTFfbm90X3ByZXNlbnQoKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoCi0gICAgICAgICAgICBpc19oY2lfbl9lbmFibGVkX2ludGVybmFsX3dyYXBwZXIoIntcImhjaTBcIjpcbntcImVuYWJsZWRcIjogdHJ1ZX19Ii50b19zdHJpbmcoKSwgMSksCi0gICAgICAgICAgICB0cnVlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHRlc3RfaGNpX2RldmljZXNfc3RyaW5nX3RvX2ludF9ub25lKCkgewotICAgICAgICBhc3NlcnRfZXEhKGhjaV9kZXZpY2VzX3N0cmluZ190b19pbnQodmVjIVsic29tZXRoaW5nZWxzZSIudG9fc3RyaW5nKCldKSwgVmVjOjo8aTMyPjo6bmV3KCkpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X2hjaV9kZXZpY2VzX3N0cmluZ190b19pbnRfb25lKCkgewotICAgICAgICBhc3NlcnRfZXEhKGhjaV9kZXZpY2VzX3N0cmluZ190b19pbnQodmVjIVsiaGNpMCIudG9fc3RyaW5nKCldKSwgdmVjIVswXSk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHRlc3RfaGNpX2RldmljZXNfc3RyaW5nX3RvX2ludF90d28oKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoCi0gICAgICAgICAgICBoY2lfZGV2aWNlc19zdHJpbmdfdG9faW50KHZlYyFbImhjaTAiLnRvX3N0cmluZygpLCAiaGNpMSIudG9fc3RyaW5nKCldKSwKLSAgICAgICAgICAgIHZlYyFbMCwgMV0KLSAgICAgICAgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL2RidXNfYXJnLnJzIGIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9iaW4vYnRtYW5hZ2VyZC9kYnVzX2FyZy5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3MjRhYS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL2RidXNfYXJnLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi11c2UgZGJ1c19tYWNyb3M6OmdlbmVyYXRlX2RidXNfYXJnOwotCi1nZW5lcmF0ZV9kYnVzX2FyZyEoKTsKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvbWFpbi5ycyBiL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvYmluL2J0bWFuYWdlcmQvbWFpbi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMWVkNS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL21haW4ucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotbW9kIGJsdWV0b290aF9tYW5hZ2VyOwotbW9kIGJsdWV0b290aF9tYW5hZ2VyX2RidXM7Ci1tb2QgY29uZmlnX3V0aWw7Ci1tb2QgZGJ1c19hcmc7Ci1tb2Qgc3RhdGVfbWFjaGluZTsKLQotdXNlIGNyYXRlOjpibHVldG9vdGhfbWFuYWdlcjo6Qmx1ZXRvb3RoTWFuYWdlcjsKLXVzZSBkYnVzOjpjaGFubmVsOjpNYXRjaGluZ1JlY2VpdmVyOwotdXNlIGRidXM6Om1lc3NhZ2U6Ok1hdGNoUnVsZTsKLXVzZSBkYnVzOjpub25ibG9jazo6U3luY0Nvbm5lY3Rpb247Ci11c2UgZGJ1c19jcm9zc3JvYWRzOjpDcm9zc3JvYWRzOwotdXNlIGRidXNfcHJvamVjdGlvbjo6RGlzY29ubmVjdFdhdGNoZXI7Ci11c2UgZGJ1c190b2tpbzo6Y29ubmVjdGlvbjsKLXVzZSBsb2c6OkxldmVsRmlsdGVyOwotdXNlIHN0ZDo6c3luYzo6YXRvbWljOjpBdG9taWNCb29sOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHN5c2xvZzo6e0Jhc2ljTG9nZ2VyLCBGYWNpbGl0eSwgRm9ybWF0dGVyMzE2NH07Ci0KLSNbZGVyaXZlKENsb25lKV0KLXN0cnVjdCBNYW5hZ2VyQ29udGV4dCB7Ci0gICAgcHJveHk6IHN0YXRlX21hY2hpbmU6OlN0YXRlTWFjaGluZVByb3h5LAotICAgIGZsb3NzX2VuYWJsZWQ6IEFyYzxBdG9taWNCb29sPiwKLSAgICBkYnVzX2Nvbm5lY3Rpb246IEFyYzxTeW5jQ29ubmVjdGlvbj4sCi19Ci0KLSNbdG9raW86Om1haW5dCi1wdWIgYXN5bmMgZm4gbWFpbigpIC0+IFJlc3VsdDwoKSwgQm94PGR5biBzdGQ6OmVycm9yOjpFcnJvcj4+IHsKLSAgICBsZXQgZm9ybWF0dGVyID0gRm9ybWF0dGVyMzE2NCB7Ci0gICAgICAgIGZhY2lsaXR5OiBGYWNpbGl0eTo6TE9HX1VTRVIsCi0gICAgICAgIGhvc3RuYW1lOiBOb25lLAotICAgICAgICBwcm9jZXNzOiAiYnRtYW5hZ2VyZCIuaW50bygpLAotICAgICAgICBwaWQ6IDAsCi0gICAgfTsKLQotICAgIGxldCBsb2dnZXIgPSBzeXNsb2c6OnVuaXgoZm9ybWF0dGVyKS5leHBlY3QoImNvdWxkIG5vdCBjb25uZWN0IHRvIHN5c2xvZyIpOwotICAgIGxldCBfID0gbG9nOjpzZXRfYm94ZWRfbG9nZ2VyKEJveDo6bmV3KEJhc2ljTG9nZ2VyOjpuZXcobG9nZ2VyKSkpCi0gICAgICAgIC5tYXAofCgpfCBsb2c6OnNldF9tYXhfbGV2ZWwoY29uZmlnX3V0aWw6OmdldF9sb2dfbGV2ZWwoKS51bndyYXBfb3IoTGV2ZWxGaWx0ZXI6OkluZm8pKSk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGNvbmZpZyB1dGlsCi0gICAgY29uZmlnX3V0aWw6OmZpeF9jb25maWdfZmlsZV9mb3JtYXQoKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIEQtQnVzIHN5c3RlbSBidXMgKHRoaXMgaXMgYmxvY2tpbmcsIHVuZm9ydHVuYXRlbHkpLgotICAgIGxldCAocmVzb3VyY2UsIGNvbm4pID0gY29ubmVjdGlvbjo6bmV3X3N5c3RlbV9zeW5jKCk/OwotCi0gICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIHVwc3RhcnQgb3Igc3lzdGVtZAotICAgIGxldCBhcmdzOiBWZWM8U3RyaW5nPiA9IHN0ZDo6ZW52OjphcmdzKCkuY29sbGVjdCgpOwotICAgIGxldCBpbnZva2VyID0gaWYgYXJncy5sZW4oKSA+IDEgewotICAgICAgICBtYXRjaCAmYXJnc1sxXVswLi5dIHsKLSAgICAgICAgICAgICItLXN5c3RlbWQiIHwgIi1zIiA9PiBzdGF0ZV9tYWNoaW5lOjpJbnZva2VyOjpTeXN0ZW1kSW52b2tlciwKLSAgICAgICAgICAgIF8gPT4gc3RhdGVfbWFjaGluZTo6SW52b2tlcjo6VXBzdGFydEludm9rZXIsCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0ZV9tYWNoaW5lOjpJbnZva2VyOjpVcHN0YXJ0SW52b2tlcgotICAgIH07Ci0KLSAgICBsZXQgY29udGV4dCA9IHN0YXRlX21hY2hpbmU6OnN0YXJ0X25ld19zdGF0ZV9tYWNoaW5lX2NvbnRleHQoaW52b2tlcik7Ci0gICAgbGV0IHByb3h5ID0gY29udGV4dC5nZXRfcHJveHkoKTsKLSAgICBsZXQgbWFuYWdlcl9jb250ZXh0ID0gTWFuYWdlckNvbnRleHQgewotICAgICAgICBwcm94eTogcHJveHksCi0gICAgICAgIGZsb3NzX2VuYWJsZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhjb25maWdfdXRpbDo6aXNfZmxvc3NfZW5hYmxlZCgpKSksCi0gICAgICAgIGRidXNfY29ubmVjdGlvbjogY29ubi5jbG9uZSgpLAotICAgIH07Ci0KLSAgICAvLyBUaGUgcmVzb3VyY2UgaXMgYSB0YXNrIHRoYXQgc2hvdWxkIGJlIHNwYXduZWQgb250byBhIHRva2lvIGNvbXBhdGlibGUKLSAgICAvLyByZWFjdG9yIEFTQVAuIElmIHRoZSByZXNvdXJjZSBldmVyIGZpbmlzaGVzLCB5b3UgbG9zdCBjb25uZWN0aW9uIHRvIEQtQnVzLgotICAgIHRva2lvOjpzcGF3bihhc3luYyB7Ci0gICAgICAgIGxldCBlcnIgPSByZXNvdXJjZS5hd2FpdDsKLSAgICAgICAgcGFuaWMhKCJMb3N0IGNvbm5lY3Rpb24gdG8gRC1CdXM6IHt9IiwgZXJyKTsKLSAgICB9KTsKLQotICAgIC8vIExldCdzIHJlcXVlc3QgYSBuYW1lIG9uIHRoZSBidXMsIHNvIHRoYXQgY2xpZW50cyBjYW4gZmluZCB1cy4KLSAgICBjb25uLnJlcXVlc3RfbmFtZSgib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIiwgZmFsc2UsIHRydWUsIGZhbHNlKS5hd2FpdD87Ci0KLSAgICAvLyBDcmVhdGUgYSBuZXcgY3Jvc3Nyb2FkcyBpbnN0YW5jZS4KLSAgICAvLyBUaGUgaW5zdGFuY2UgaXMgY29uZmlndXJlZCBzbyB0aGF0IGludHJvc3BlY3Rpb24gYW5kIHByb3BlcnRpZXMgaW50ZXJmYWNlcwotICAgIC8vIGFyZSBhZGRlZCBieSBkZWZhdWx0IG9uIG9iamVjdCBwYXRoIGFkZGl0aW9ucy4KLSAgICBsZXQgbXV0IGNyID0gQ3Jvc3Nyb2Fkczo6bmV3KCk7Ci0KLSAgICAvLyBFbmFibGUgYXN5bmMgc3VwcG9ydCBmb3IgdGhlIGNyb3Nzcm9hZHMgaW5zdGFuY2UuCi0gICAgY3Iuc2V0X2FzeW5jX3N1cHBvcnQoU29tZSgoCi0gICAgICAgIGNvbm4uY2xvbmUoKSwKLSAgICAgICAgQm94OjpuZXcofHh8IHsKLSAgICAgICAgICAgIHRva2lvOjpzcGF3bih4KTsKLSAgICAgICAgfSksCi0gICAgKSkpOwotCi0gICAgLy8gT2JqZWN0IG1hbmFnZXIgaXMgbmVjZXNzYXJ5IGZvciBjbGllbnRzICh0byBpbmZvcm0gdGhlbSB3aGVuIEJsdWV0b290aCBpcwotICAgIC8vIGF2YWlsYWJsZSkuIENyZWF0ZSBpdCBhdCByb290ICgvKSBzbyBzdWJzZXF1ZW50IGFkZGl0aW9ucyBnZW5lcmF0ZQotICAgIC8vIEludGVyZmFjZUFkZGVkIGFuZCBJbnRlcmZhY2VSZW1vdmVkIHNpZ25hbHMuCi0gICAgY3Iuc2V0X29iamVjdF9tYW5hZ2VyX3N1cHBvcnQoU29tZShjb25uLmNsb25lKCkpKTsKLSAgICBjci5pbnNlcnQoIi8iLCAmW2NyLm9iamVjdF9tYW5hZ2VyKCldLCB7fSk7Ci0KLSAgICBsZXQgYmx1ZXRvb3RoX21hbmFnZXIgPSBBcmM6Om5ldyhNdXRleDo6bmV3KEJveDo6bmV3KEJsdWV0b290aE1hbmFnZXI6Om5ldyhtYW5hZ2VyX2NvbnRleHQpKSkpOwotCi0gICAgLy8gU2V0IHVwIHRoZSBkaXNjb25uZWN0IHdhdGNoZXIgdG8gbW9uaXRvciBjbGllbnQgZGlzY29ubmVjdHMuCi0gICAgbGV0IGRpc2Nvbm5lY3Rfd2F0Y2hlciA9IEFyYzo6bmV3KE11dGV4OjpuZXcoRGlzY29ubmVjdFdhdGNoZXI6Om5ldygpKSk7Ci0gICAgZGlzY29ubmVjdF93YXRjaGVyLmxvY2soKS51bndyYXAoKS5zZXR1cF93YXRjaChjb25uLmNsb25lKCkpLmF3YWl0OwotCi0gICAgLy8gTGV0J3MgYWRkIHRoZSAiL29yZy9jaHJvbWl1bS9ibHVldG9vdGgvTWFuYWdlciIgcGF0aCwgd2hpY2ggaW1wbGVtZW50cwotICAgIC8vIHRoZSBvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLk1hbmFnZXIgaW50ZXJmYWNlLCB0byB0aGUgY3Jvc3Nyb2FkcyBpbnN0YW5jZS4KLSAgICBibHVldG9vdGhfbWFuYWdlcl9kYnVzOjpleHBvcnRfYmx1ZXRvb3RoX21hbmFnZXJfZGJ1c19vYmooCi0gICAgICAgICIvb3JnL2Nocm9taXVtL2JsdWV0b290aC9NYW5hZ2VyIiwKLSAgICAgICAgY29ubi5jbG9uZSgpLAotICAgICAgICAmbXV0IGNyLAotICAgICAgICBibHVldG9vdGhfbWFuYWdlci5jbG9uZSgpLAotICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXIuY2xvbmUoKSwKLSAgICApOwotCi0gICAgLy8gV2UgYWRkIHRoZSBDcm9zc3JvYWRzIGluc3RhbmNlIHRvIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgaW5jb21pbmcgbWV0aG9kIGNhbGxzIHdpbGwgYmUgaGFuZGxlZC4KLSAgICBjb25uLnN0YXJ0X3JlY2VpdmUoCi0gICAgICAgIE1hdGNoUnVsZTo6bmV3X21ldGhvZF9jYWxsKCksCi0gICAgICAgIEJveDo6bmV3KG1vdmUgfG1zZywgY29ubnwgewotICAgICAgICAgICAgY3IuaGFuZGxlX21lc3NhZ2UobXNnLCBjb25uKS51bndyYXAoKTsKLSAgICAgICAgICAgIHRydWUKLSAgICAgICAgfSksCi0gICAgKTsKLQotICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgc3RhdGVfbWFjaGluZTo6bWFpbmxvb3AoY29udGV4dCwgYmx1ZXRvb3RoX21hbmFnZXIpLmF3YWl0OwotICAgIH0pOwotCi0gICAgc3RkOjpmdXR1cmU6OnBlbmRpbmc6OjwoKT4oKS5hd2FpdDsKLQotICAgIC8vIFJ1biBmb3JldmVyLgotICAgIHVucmVhY2hhYmxlISgpCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL3N0YXRlX21hY2hpbmUucnMgYi9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2Jpbi9idG1hbmFnZXJkL3N0YXRlX21hY2hpbmUucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDlhN2QuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9iaW4vYnRtYW5hZ2VyZC9zdGF0ZV9tYWNoaW5lLnJzCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLXVzZSBjcmF0ZTo6Ymx1ZXRvb3RoX21hbmFnZXI6OkJsdWV0b290aE1hbmFnZXI7Ci11c2UgYnRfY29tbW9uOjp0aW1lOjpBbGFybTsKLXVzZSBsb2c6OntkZWJ1ZywgZXJyb3IsIGluZm8sIHdhcm59OwotdXNlIG5peDo6c3lzOjpzaWduYWw6OntzZWxmLCBTaWduYWx9OwotdXNlIG5peDo6dW5pc3RkOjpQaWQ7Ci11c2UgcmVnZXg6OlJlZ2V4OwotdXNlIHN0ZDo6cHJvY2Vzczo6e0NoaWxkLCBDb21tYW5kLCBTdGRpb307Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2Ugc3RkOjp0aW1lOjpEdXJhdGlvbjsKLXVzZSB0b2tpbzo6aW86OnVuaXg6OkFzeW5jRmQ7Ci11c2UgdG9raW86OnN5bmM6Om1wc2M7Ci0KLS8vIERpcmVjdG9yeSBmb3IgQmx1ZXRvb3RoIHBpZCBmaWxlCi1wdWIgY29uc3QgUElEX0RJUjogJnN0ciA9ICIvdmFyL3J1bi9ibHVldG9vdGgiOwotCi0jW2Rlcml2ZShEZWJ1ZywgUGFydGlhbEVxLCBDb3B5LCBDbG9uZSldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIFN0YXRlIHsKLSAgICBPZmYgPSAwLCAgICAgICAgLy8gQmx1ZXRvb3RoIGlzIG5vdCBydW5uaW5nCi0gICAgVHVybmluZ09uID0gMSwgIC8vIFdlIGFyZSBub3Qgbm90aWZpZWQgdGhhdCB0aGUgQmx1ZXRvb3RoIGlzIHJ1bm5pbmcKLSAgICBPbiA9IDIsICAgICAgICAgLy8gQmx1ZXRvb3RoIGlzIHJ1bm5pbmcKLSAgICBUdXJuaW5nT2ZmID0gMywgLy8gV2UgYXJlIG5vdCBub3RpZmllZCB0aGF0IHRoZSBCbHVldG9vdGggaXMgc3RvcHBlZAotfQotCi0vLy8gQ2hlY2sgd2hldGhlciBhZGFwdGVyIGlzIGVuYWJsZWQgYnkgY2hlY2tpbmcgaW50ZXJuYWwgc3RhdGUuCi1wdWIgZm4gc3RhdGVfdG9fZW5hYmxlZChzdGF0ZTogU3RhdGUpIC0+IGJvb2wgewotICAgIG1hdGNoIHN0YXRlIHsKLSAgICAgICAgU3RhdGU6Ok9uID0+IHRydWUsCi0gICAgICAgIF8gPT4gZmFsc2UsCi0gICAgfQotfQotCi0vLy8gQWRhcHRlciBzdGF0ZSBhY3Rpb25zCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgZW51bSBBZGFwdGVyU3RhdGVBY3Rpb25zIHsKLSAgICBTdGFydEJsdWV0b290aChpMzIpLAotICAgIFN0b3BCbHVldG9vdGgoaTMyKSwKLSAgICBCbHVldG9vdGhTdGFydGVkKGkzMiwgaTMyKSwgLy8gUElEIGFuZCBIQ0kKLSAgICBCbHVldG9vdGhTdG9wcGVkKGkzMiksCi19Ci0KLS8vLyBFbnVtIG9mIGFsbCB0aGUgbWVzc2FnZXMgdGhhdCBzdGF0ZSBtYWNoaW5lIGhhbmRsZXMuCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgZW51bSBNZXNzYWdlIHsKLSAgICBBZGFwdGVyU3RhdGVDaGFuZ2UoQWRhcHRlclN0YXRlQWN0aW9ucyksCi0gICAgUGlkQ2hhbmdlKGlub3RpZnk6OkV2ZW50TWFzaywgT3B0aW9uPFN0cmluZz4pLAotICAgIEhjaURldmljZUNoYW5nZShpbm90aWZ5OjpFdmVudE1hc2ssIE9wdGlvbjxTdHJpbmc+KSwKLSAgICBDYWxsYmFja0Rpc2Nvbm5lY3RlZCh1MzIpLAotICAgIENvbW1hbmRUaW1lb3V0KCksCi19Ci0KLXB1YiBzdHJ1Y3QgU3RhdGVNYWNoaW5lQ29udGV4dCB7Ci0gICAgdHg6IG1wc2M6OlNlbmRlcjxNZXNzYWdlPiwKLSAgICByeDogbXBzYzo6UmVjZWl2ZXI8TWVzc2FnZT4sCi0gICAgc3RhdGVfbWFjaGluZTogTWFuYWdlclN0YXRlTWFjaGluZSwKLX0KLQotaW1wbCBTdGF0ZU1hY2hpbmVDb250ZXh0IHsKLSAgICBmbiBuZXcoc3RhdGVfbWFjaGluZTogTWFuYWdlclN0YXRlTWFjaGluZSkgLT4gU3RhdGVNYWNoaW5lQ29udGV4dCB7Ci0gICAgICAgIGxldCAodHgsIHJ4KSA9IG1wc2M6OmNoYW5uZWw6OjxNZXNzYWdlPigxMCk7Ci0gICAgICAgIFN0YXRlTWFjaGluZUNvbnRleHQgeyB0eDogdHgsIHJ4OiByeCwgc3RhdGVfbWFjaGluZTogc3RhdGVfbWFjaGluZSB9Ci0gICAgfQotCi0gICAgcHViIGZuIGdldF9wcm94eSgmc2VsZikgLT4gU3RhdGVNYWNoaW5lUHJveHkgewotICAgICAgICBTdGF0ZU1hY2hpbmVQcm94eSB7IHR4OiBzZWxmLnR4LmNsb25lKCksIHN0YXRlOiBzZWxmLnN0YXRlX21hY2hpbmUuc3RhdGUuY2xvbmUoKSB9Ci0gICAgfQotfQotCi1wdWIgZm4gc3RhcnRfbmV3X3N0YXRlX21hY2hpbmVfY29udGV4dChpbnZva2VyOiBJbnZva2VyKSAtPiBTdGF0ZU1hY2hpbmVDb250ZXh0IHsKLSAgICBtYXRjaCBpbnZva2VyIHsKLSAgICAgICAgSW52b2tlcjo6TmF0aXZlSW52b2tlciA9PiBTdGF0ZU1hY2hpbmVDb250ZXh0OjpuZXcoTWFuYWdlclN0YXRlTWFjaGluZTo6bmV3X25hdGl2ZSgpKSwKLSAgICAgICAgSW52b2tlcjo6U3lzdGVtZEludm9rZXIgPT4gU3RhdGVNYWNoaW5lQ29udGV4dDo6bmV3KE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ld19zeXN0ZW1kKCkpLAotICAgICAgICBJbnZva2VyOjpVcHN0YXJ0SW52b2tlciA9PiBTdGF0ZU1hY2hpbmVDb250ZXh0OjpuZXcoTWFuYWdlclN0YXRlTWFjaGluZTo6bmV3X3Vwc3RhcnQoKSksCi0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSldCi1wdWIgc3RydWN0IFN0YXRlTWFjaGluZVByb3h5IHsKLSAgICB0eDogbXBzYzo6U2VuZGVyPE1lc3NhZ2U+LAotICAgIHN0YXRlOiBBcmM8c3RkOjpzeW5jOjpNdXRleDxTdGF0ZT4+LAotfQotCi1jb25zdCBUWF9TRU5EX1RJTUVPVVRfRFVSQVRJT046IER1cmF0aW9uID0gRHVyYXRpb246OmZyb21fc2VjcygzKTsKLWNvbnN0IENPTU1BTkRfVElNRU9VVF9EVVJBVElPTjogRHVyYXRpb24gPSBEdXJhdGlvbjo6ZnJvbV9zZWNzKDMpOwotCi1pbXBsIFN0YXRlTWFjaGluZVByb3h5IHsKLSAgICBwdWIgZm4gc3RhcnRfYmx1ZXRvb3RoKCZzZWxmLCBoY2lfaW50ZXJmYWNlOiBpMzIpIHsKLSAgICAgICAgbGV0IHR4ID0gc2VsZi50eC5jbG9uZSgpOwotICAgICAgICB0b2tpbzo6c3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICBsZXQgXyA9IHR4Ci0gICAgICAgICAgICAgICAgLnNlbmQoTWVzc2FnZTo6QWRhcHRlclN0YXRlQ2hhbmdlKEFkYXB0ZXJTdGF0ZUFjdGlvbnM6OlN0YXJ0Qmx1ZXRvb3RoKAotICAgICAgICAgICAgICAgICAgICBoY2lfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICkpKQotICAgICAgICAgICAgICAgIC5hd2FpdDsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHViIGZuIHN0b3BfYmx1ZXRvb3RoKCZzZWxmLCBoY2lfaW50ZXJmYWNlOiBpMzIpIHsKLSAgICAgICAgbGV0IHR4ID0gc2VsZi50eC5jbG9uZSgpOwotICAgICAgICB0b2tpbzo6c3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICBsZXQgXyA9IHR4Ci0gICAgICAgICAgICAgICAgLnNlbmQoTWVzc2FnZTo6QWRhcHRlclN0YXRlQ2hhbmdlKEFkYXB0ZXJTdGF0ZUFjdGlvbnM6OlN0b3BCbHVldG9vdGgoCi0gICAgICAgICAgICAgICAgICAgIGhjaV9pbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgKSkpCi0gICAgICAgICAgICAgICAgLmF3YWl0OwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWIgZm4gZ2V0X3N0YXRlKCZzZWxmKSAtPiBTdGF0ZSB7Ci0gICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHNlbGYuc3RhdGUgaXMgbmV2ZXIgbG9ja2VkIGZvciBhIGxvbmcgcGVyaW9kLCBpLmUuIG5ldmVyIGxvY2soKSBhbmQKLSAgICAgICAgLy8gYXdhaXQgZm9yIHNvbWV0aGluZyBlbHNlIHdpdGhvdXQgdW5sb2NraW5nLiBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrLgotICAgICAgICByZXR1cm4gKnNlbGYuc3RhdGUubG9jaygpLnVud3JhcCgpOwotICAgIH0KLQotICAgIHB1YiBmbiBnZXRfdHgoJnNlbGYpIC0+IG1wc2M6OlNlbmRlcjxNZXNzYWdlPiB7Ci0gICAgICAgIHNlbGYudHguY2xvbmUoKQotICAgIH0KLX0KLQotZm4gcGlkX2lub3RpZnlfYXN5bmNfZmQoKSAtPiBBc3luY0ZkPGlub3RpZnk6Oklub3RpZnk+IHsKLSAgICBsZXQgbXV0IHBpZF9kZXRlY3RvciA9IGlub3RpZnk6Oklub3RpZnk6OmluaXQoKS5leHBlY3QoImNhbm5vdCB1c2UgaW5vdGlmeSIpOwotICAgIHBpZF9kZXRlY3RvcgotICAgICAgICAuYWRkX3dhdGNoKFBJRF9ESVIsIGlub3RpZnk6OldhdGNoTWFzazo6Q1JFQVRFIHwgaW5vdGlmeTo6V2F0Y2hNYXNrOjpERUxFVEUpCi0gICAgICAgIC5leHBlY3QoImZhaWxlZCB0byBhZGQgd2F0Y2giKTsKLSAgICBBc3luY0ZkOjpuZXcocGlkX2RldGVjdG9yKS5leHBlY3QoImZhaWxlZCB0byBhZGQgYXN5bmMgZmQiKQotfQotCi0vLy8gR2l2ZW4gYW4gcGlkIHBhdGgsIHJldHVybnMgdGhlIGFkYXB0ZXIgaW5kZXggZm9yIHRoYXQgcGlkIHBhdGguCi1mbiBnZXRfaGNpX2luZGV4X2Zyb21fcGlkX3BhdGgocGF0aDogJnN0cikgLT4gT3B0aW9uPGkzMj4gewotICAgIGxldCByZSA9IFJlZ2V4OjpuZXcociJibHVldG9vdGgoWzAtOV0rKS5waWQiKS51bndyYXAoKTsKLSAgICByZS5jYXB0dXJlcyhwYXRoKT8uZ2V0KDEpPy5hc19zdHIoKS5wYXJzZSgpLm9rKCkKLX0KLQotZm4gaGNpX2RldmljZXNfaW5vdGlmeV9hc3luY19mZCgpIC0+IEFzeW5jRmQ8aW5vdGlmeTo6SW5vdGlmeT4gewotICAgIGxldCBtdXQgZGV0ZWN0b3IgPSBpbm90aWZ5OjpJbm90aWZ5Ojppbml0KCkuZXhwZWN0KCJjYW5ub3QgdXNlIGlub3RpZnkiKTsKLSAgICBkZXRlY3RvcgotICAgICAgICAuYWRkX3dhdGNoKAotICAgICAgICAgICAgY3JhdGU6OmNvbmZpZ191dGlsOjpIQ0lfREVWSUNFU19ESVIsCi0gICAgICAgICAgICBpbm90aWZ5OjpXYXRjaE1hc2s6OkNSRUFURSB8IGlub3RpZnk6OldhdGNoTWFzazo6REVMRVRFLAotICAgICAgICApCi0gICAgICAgIC5leHBlY3QoImZhaWxlZCB0byBhZGQgd2F0Y2giKTsKLSAgICBBc3luY0ZkOjpuZXcoZGV0ZWN0b3IpLmV4cGVjdCgiZmFpbGVkIHRvIGFkZCBhc3luYyBmZCIpCi19Ci0KLS8vLyBPbiBzdGFydHVwLCBnZXQgYW5kIGNhY2hlIGFsbCBoY2kgZGV2aWNlcyBieSBlbWl0dGluZyB0aGUgY2FsbGJhY2sKLWZuIHN0YXJ0dXBfaGNpX2RldmljZXMobWFuYWdlcjogJkFyYzxzdGQ6OnN5bmM6Ok11dGV4PEJveDxCbHVldG9vdGhNYW5hZ2VyPj4+KSB7Ci0gICAgbGV0IGRldmljZXMgPSBjcmF0ZTo6Y29uZmlnX3V0aWw6Omxpc3RfaGNpX2RldmljZXMoKTsKLSAgICBmb3IgZGV2aWNlIGluIGRldmljZXMgewotICAgICAgICBtYW5hZ2VyLmxvY2soKS51bndyYXAoKS5jYWxsYmFja19oY2lfZGV2aWNlX2NoYW5nZShkZXZpY2UsIHRydWUpOwotICAgIH0KLX0KLQotLy8vIEdpdmVuIGFuIGhjaSBzeXNmcyBwYXRoLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgaGNpIGRldmljZSBhdCB0aGUgcGF0aC4KLWZuIGdldF9oY2lfaW5kZXhfZnJvbV9kZXZpY2UocGF0aDogJnN0cikgLT4gT3B0aW9uPGkzMj4gewotICAgIGxldCByZSA9IFJlZ2V4OjpuZXcociJoY2koWzAtOV0rKSIpLnVud3JhcCgpOwotICAgIHJlLmNhcHR1cmVzKHBhdGgpPy5nZXQoMSk/LmFzX3N0cigpLnBhcnNlKCkub2soKQotfQotCi1mbiBldmVudF9uYW1lX3RvX3N0cmluZyhuYW1lOiBPcHRpb248JnN0ZDo6ZmZpOjpPc1N0cj4pIC0+IE9wdGlvbjxTdHJpbmc+IHsKLSAgICBpZiBsZXQgU29tZSh2YWwpID0gJm5hbWUgewotICAgICAgICBpZiBsZXQgU29tZShzdHJ2YWwpID0gdmFsLnRvX3N0cigpIHsKLSAgICAgICAgICAgIHJldHVybiBTb21lKHN0cnZhbC50b19zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTm9uZTsKLX0KLQotcHViIGFzeW5jIGZuIG1haW5sb29wKAotICAgIG11dCBjb250ZXh0OiBTdGF0ZU1hY2hpbmVDb250ZXh0LAotICAgIGJsdWV0b290aF9tYW5hZ2VyOiBBcmM8c3RkOjpzeW5jOjpNdXRleDxCb3g8Qmx1ZXRvb3RoTWFuYWdlcj4+PiwKLSkgewotICAgIC8vIFNldCB1cCBhIGNvbW1hbmQgdGltZW91dCBsaXN0ZW5lciB0byBlbWl0IHRpbWVvdXQgbWVzc2FnZXMKLSAgICBsZXQgY29tbWFuZF90aW1lb3V0ID0gQXJjOjpuZXcoQWxhcm06Om5ldygpKTsKLSAgICBsZXQgdGltZW91dF9jbG9uZSA9IGNvbW1hbmRfdGltZW91dC5jbG9uZSgpOwotICAgIGxldCB0aW1lb3V0X3R4ID0gY29udGV4dC50eC5jbG9uZSgpOwotCi0gICAgLy8gRmlyc3Qgc2V0IHVwIGhjaSBzdGF0ZXMKLSAgICBzdGFydHVwX2hjaV9kZXZpY2VzKCZibHVldG9vdGhfbWFuYWdlcik7Ci0KLSAgICB0b2tpbzo6c3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgIGxvb3AgewotICAgICAgICAgICAgbGV0IF9leHBpcmVkID0gdGltZW91dF9jbG9uZS5leHBpcmVkKCkuYXdhaXQ7Ci0gICAgICAgICAgICBsZXQgXyA9IHRpbWVvdXRfdHgKLSAgICAgICAgICAgICAgICAuc2VuZF90aW1lb3V0KE1lc3NhZ2U6OkNvbW1hbmRUaW1lb3V0KCksIFRYX1NFTkRfVElNRU9VVF9EVVJBVElPTikKLSAgICAgICAgICAgICAgICAuYXdhaXQKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIEdldCBhIGxpc3Qgb2YgYWN0aXZlIHBpZCBmaWxlcyB0byBkZXRlcm1pbmUgaW5pdGlhbCBhZGFwdGVyIHN0YXR1cwotICAgIGxldCBpbml0X3R4ID0gY29udGV4dC50eC5jbG9uZSgpOwotICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgbGV0IGZpbGVzID0gY3JhdGU6OmNvbmZpZ191dGlsOjpsaXN0X3BpZF9maWxlcyhQSURfRElSKTsKLSAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXMgewotICAgICAgICAgICAgbGV0IF8gPSBpbml0X3R4Ci0gICAgICAgICAgICAgICAgLnNlbmRfdGltZW91dCgKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTo6UGlkQ2hhbmdlKGlub3RpZnk6OkV2ZW50TWFzazo6Q1JFQVRFLCBTb21lKGZpbGUpKSwKLSAgICAgICAgICAgICAgICAgICAgVFhfU0VORF9USU1FT1VUX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAuYXdhaXQKLSAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIFNldCB1cCBhIFBJRCBmaWxlIGxpc3RlbmVyIHRvIGVtaXQgUElEIGlub3RpZnkgbWVzc2FnZXMKLSAgICBsZXQgbXV0IHBpZF9hc3luY19mZCA9IHBpZF9pbm90aWZ5X2FzeW5jX2ZkKCk7Ci0gICAgbGV0IHBpZF90eCA9IGNvbnRleHQudHguY2xvbmUoKTsKLQotICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgZGVidWchKCJTcGF3bmVkIHBpZCBub3RpZnkgdGFzayIpOwotCi0gICAgICAgIGxvb3AgewotICAgICAgICAgICAgbGV0IHIgPSBwaWRfYXN5bmNfZmQucmVhZGFibGVfbXV0KCk7Ci0gICAgICAgICAgICBsZXQgbXV0IGZkX3JlYWR5ID0gci5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIGxldCBtdXQgYnVmZmVyOiBbdTg7IDEwMjRdID0gWzA7IDEwMjRdOwotICAgICAgICAgICAgZGVidWchKCJGb3VuZCBuZXcgcGlkIGlub3RpZnkgZW50cmllcy4gUmVhZGluZyB0aGVtIik7Ci0gICAgICAgICAgICBtYXRjaCBmZF9yZWFkeS50cnlfaW8ofGlubmVyfCBpbm5lci5nZXRfbXV0KCkucmVhZF9ldmVudHMoJm11dCBidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgT2soT2soZXZlbnRzKSkgPT4gewotICAgICAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4gZXZlbnRzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnISgiZ290IHNvbWUgZXZlbnRzIGZyb20gcGlkIHs6P30iLCBldmVudC5tYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfID0gcGlkX3R4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRfdGltZW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTo6UGlkQ2hhbmdlKGV2ZW50Lm1hc2ssIGV2ZW50X25hbWVfdG9fc3RyaW5nKGV2ZW50Lm5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfU0VORF9USU1FT1VUX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXdhaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRXJyKF8pIHwgT2soRXJyKF8pKSA9PiBwYW5pYyEoIndoeSBjYW4ndCB3ZSByZWFkIHdoaWxlIHRoZSBhc3luY2ZkIGlzIHJlYWR5PyIpLAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmRfcmVhZHkuY2xlYXJfcmVhZHkoKTsKLSAgICAgICAgICAgIGRyb3AoZmRfcmVhZHkpOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICAvLyBTZXQgdXAgYW4gSENJIGRldmljZSBsaXN0ZW5lciB0byBlbWl0IEhDSSBkZXZpY2UgaW5vdGlmeSBtZXNzYWdlcwotICAgIGxldCBtdXQgaGNpX2RldmljZXNfYXN5bmNfZmQgPSBoY2lfZGV2aWNlc19pbm90aWZ5X2FzeW5jX2ZkKCk7Ci0gICAgbGV0IGhjaV90eCA9IGNvbnRleHQudHguY2xvbmUoKTsKLQotICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgZGVidWchKCJTcGF3bmVkIGhjaSBub3RpZnkgdGFzayIpOwotICAgICAgICBsb29wIHsKLSAgICAgICAgICAgIGxldCByID0gaGNpX2RldmljZXNfYXN5bmNfZmQucmVhZGFibGVfbXV0KCk7Ci0gICAgICAgICAgICBsZXQgbXV0IGZkX3JlYWR5ID0gci5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIGxldCBtdXQgYnVmZmVyOiBbdTg7IDEwMjRdID0gWzA7IDEwMjRdOwotICAgICAgICAgICAgZGVidWchKCJGb3VuZCBuZXcgaGNpIGRldmljZSBlbnRyaWVzLiBSZWFkaW5nIHRoZW0uIik7Ci0gICAgICAgICAgICBtYXRjaCBmZF9yZWFkeS50cnlfaW8ofGlubmVyfCBpbm5lci5nZXRfbXV0KCkucmVhZF9ldmVudHMoJm11dCBidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgT2soT2soZXZlbnRzKSkgPT4gewotICAgICAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4gZXZlbnRzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfID0gaGNpX3R4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRfdGltZW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTo6SGNpRGV2aWNlQ2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X25hbWVfdG9fc3RyaW5nKGV2ZW50Lm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9TRU5EX1RJTUVPVVRfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hd2FpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBFcnIoXykgfCBPayhFcnIoXykpID0+IHBhbmljISgid2h5IGNhbid0IHdlIHJlYWQgd2hpbGUgdGhlIGFzeW5jZmQgaXMgcmVhZHk/IiksCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmZF9yZWFkeS5jbGVhcl9yZWFkeSgpOwotICAgICAgICAgICAgZHJvcChmZF9yZWFkeSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIExpc3RlbiBmb3IgYWxsIG1lc3NhZ2VzIGFuZCBhY3Qgb24gdGhlbQotICAgIGxvb3AgewotICAgICAgICBsZXQgbSA9IGNvbnRleHQucngucmVjdigpLmF3YWl0OwotCi0gICAgICAgIGlmIG0uaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIGluZm8hKCJFeGl0aW5nIG1hbmFnZXIgbWFpbmxvb3AiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVidWchKCJNZXNzYWdlIGhhbmRsZXI6IHs6P30iLCBtKTsKLQotICAgICAgICBtYXRjaCBtLnVud3JhcCgpIHsKLSAgICAgICAgICAgIC8vIEFkYXB0ZXIgYWN0aW9uIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICBNZXNzYWdlOjpBZGFwdGVyU3RhdGVDaGFuZ2UoYWN0aW9uKSA9PiB7Ci0gICAgICAgICAgICAgICAgLy8gR3JhYiBwcmV2aW91cyBzdGF0ZSBmcm9tIGxvY2sgYW5kIHJlbGVhc2UKLSAgICAgICAgICAgICAgICBsZXQgbmV4dF9zdGF0ZTsKLSAgICAgICAgICAgICAgICBsZXQgcHJldl9zdGF0ZTsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZfc3RhdGUgPSAqY29udGV4dC5zdGF0ZV9tYWNoaW5lLnN0YXRlLmxvY2soKS51bndyYXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGV0IGhjaTsKLQotICAgICAgICAgICAgICAgIG1hdGNoIGFjdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZUFjdGlvbnM6OlN0YXJ0Qmx1ZXRvb3RoKGkpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfc3RhdGUgPSBTdGF0ZTo6VHVybmluZ09uOwotICAgICAgICAgICAgICAgICAgICAgICAgaGNpID0gaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggY29udGV4dC5zdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdGFydF9ibHVldG9vdGgoaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX3RpbWVvdXQucmVzZXQoQ09NTUFORF9USU1FT1VUX0RVUkFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPT4gY29tbWFuZF90aW1lb3V0LmNhbmNlbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZUFjdGlvbnM6OlN0b3BCbHVldG9vdGgoaSkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9zdGF0ZSA9IFN0YXRlOjpUdXJuaW5nT2ZmOwotICAgICAgICAgICAgICAgICAgICAgICAgaGNpID0gaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggY29udGV4dC5zdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdG9wX2JsdWV0b290aChpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfdGltZW91dC5yZXNldChDT01NQU5EX1RJTUVPVVRfRFVSQVRJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSA9PiBjb21tYW5kX3RpbWVvdXQuY2FuY2VsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQWRhcHRlclN0YXRlQWN0aW9uczo6Qmx1ZXRvb3RoU3RhcnRlZChwaWQsIGkpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfc3RhdGUgPSBTdGF0ZTo6T247Ci0gICAgICAgICAgICAgICAgICAgICAgICBoY2kgPSBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBjb250ZXh0LnN0YXRlX21hY2hpbmUuYWN0aW9uX29uX2JsdWV0b290aF9zdGFydGVkKHBpZCwgaGNpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfdGltZW91dC5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPT4gZXJyb3IhKCJ1bmV4cGVjdGVkIEJsdWV0b290aFN0YXJ0ZWQgcGlke30gaGNpe30iLCBwaWQsIGhjaSksCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQWRhcHRlclN0YXRlQWN0aW9uczo6Qmx1ZXRvb3RoU3RvcHBlZChpKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3N0YXRlID0gU3RhdGU6Ok9mZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhjaSA9IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGNvbnRleHQuc3RhdGVfbWFjaGluZS5hY3Rpb25fb25fYmx1ZXRvb3RoX3N0b3BwZWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfdGltZW91dC5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX3RpbWVvdXQucmVzZXQoQ09NTUFORF9USU1FT1VUX0RVUkFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgLy8gT25seSBlbWl0IGVuYWJsZWQgZXZlbnQgZm9yIGNlcnRhaW4gdHJhbnNpdGlvbnMKLSAgICAgICAgICAgICAgICBpZiBuZXh0X3N0YXRlICE9IHByZXZfc3RhdGUgJiYgKG5leHRfc3RhdGUgPT0gU3RhdGU6Ok9uIHx8IHByZXZfc3RhdGUgPT0gU3RhdGU6Ok9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGxiYWNrX2hjaV9lbmFibGVkX2NoYW5nZShoY2ksIG5leHRfc3RhdGUgPT0gU3RhdGU6Ok9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE1vbml0b3JlZCBwaWQgZGlyZWN0b3J5IGhhcyBhIGNoYW5nZQotICAgICAgICAgICAgTWVzc2FnZTo6UGlkQ2hhbmdlKG1hc2ssIGZpbGVuYW1lKSA9PiBtYXRjaCAobWFzaywgJmZpbGVuYW1lKSB7Ci0gICAgICAgICAgICAgICAgKGlub3RpZnk6OkV2ZW50TWFzazo6Q1JFQVRFLCBTb21lKGZuYW1lKSkgPT4gewotICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHN0ZDo6cGF0aDo6UGF0aDo6bmV3KFBJRF9ESVIpLmpvaW4oJmZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggKGdldF9oY2lfaW5kZXhfZnJvbV9waWRfcGF0aCgmZm5hbWUpLCB0b2tpbzo6ZnM6OnJlYWQocGF0aCkuYXdhaXQub2soKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKFNvbWUoaGNpKSwgU29tZShzKSkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaWQgPSBTdHJpbmc6OmZyb21fdXRmOChzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0KCJpbnZhbGlkIHBpZCBmaWxlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlOjo8aTMyPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXBfb3IoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWchKCJTZW5kaW5nIGJsdWV0b290aCBzdGFydGVkIGFjdGlvbiBmb3IgcGlkPXt9LCBoY2k9e30iLCBwaWQsIGhjaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF8gPSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZF90aW1lb3V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTo6QWRhcHRlclN0YXRlQ2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZUFjdGlvbnM6OkJsdWV0b290aFN0YXJ0ZWQocGlkLCBoY2kpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX1NFTkRfVElNRU9VVF9EVVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXdhaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKGhjaSwgcykgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4hKCJpbnZhbGlkIGZpbGUgaGNpPXs6P30gcGlkX2ZpbGU9ezo/fSIsIGhjaSwgcykKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoaW5vdGlmeTo6RXZlbnRNYXNrOjpERUxFVEUsIFNvbWUoZm5hbWUpKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKGhjaSkgPSBnZXRfaGNpX2luZGV4X2Zyb21fcGlkX3BhdGgoJmZuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyEoIlNlbmRpbmcgYmx1ZXRvb3RoIHN0b3BwZWQgYWN0aW9uIGZvciBoY2k9e30iLCBoY2kpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kX3RpbWVvdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2U6OkFkYXB0ZXJTdGF0ZUNoYW5nZShBZGFwdGVyU3RhdGVBY3Rpb25zOjpCbHVldG9vdGhTdG9wcGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfU0VORF9USU1FT1VUX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXdhaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgXyA9PiBkZWJ1ZyEoIklnbm9yZWQgZXZlbnQgezo/fSAtIHs6P30iLCBtYXNrLCAmZmlsZW5hbWUpLAotICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgLy8gTW9uaXRvcmVkIGhjaSBkaXJlY3RvcnkgaGFzIGEgY2hhbmdlCi0gICAgICAgICAgICBNZXNzYWdlOjpIY2lEZXZpY2VDaGFuZ2UobWFzaywgZmlsZW5hbWUpID0+IG1hdGNoIChtYXNrLCAmZmlsZW5hbWUpIHsKLSAgICAgICAgICAgICAgICAoaW5vdGlmeTo6RXZlbnRNYXNrOjpDUkVBVEUsIFNvbWUoZm5hbWUpKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoIGdldF9oY2lfaW5kZXhfZnJvbV9kZXZpY2UoJmZuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb21lKGhjaSkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aF9tYW5hZ2VyLmxvY2soKS51bndyYXAoKS5jYWxsYmFja19oY2lfZGV2aWNlX2NoYW5nZShoY2ksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgXyA9PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoaW5vdGlmeTo6RXZlbnRNYXNrOjpERUxFVEUsIFNvbWUoZm5hbWUpKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoIGdldF9oY2lfaW5kZXhfZnJvbV9kZXZpY2UoJmZuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb21lKGhjaSkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsYmFja19oY2lfZGV2aWNlX2NoYW5nZShoY2ksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIF8gPT4gKCksCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgXyA9PiBkZWJ1ZyEoIklnbm9yZWQgZXZlbnQgezo/fSAtIHs6P30iLCBtYXNrLCAmZmlsZW5hbWUpLAotICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgLy8gQ2FsbGJhY2sgY2xpZW50IGhhcyBkaXNjb25uZWN0ZWQKLSAgICAgICAgICAgIE1lc3NhZ2U6OkNhbGxiYWNrRGlzY29ubmVjdGVkKGlkKSA9PiB7Ci0gICAgICAgICAgICAgICAgYmx1ZXRvb3RoX21hbmFnZXIubG9jaygpLnVud3JhcCgpLmNhbGxiYWNrX2Rpc2Nvbm5lY3RlZChpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSBjb21tYW5kIHRpbWVvdXRzCi0gICAgICAgICAgICBNZXNzYWdlOjpDb21tYW5kVGltZW91dCgpID0+IHsKLSAgICAgICAgICAgICAgICAvLyBIb2xkIHN0YXRlIGxvY2sgZm9yIHNob3J0IGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWJ1ZyEoImV4cGlyZWQgezo/fSIsICpjb250ZXh0LnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGV0IHRpbWVvdXRfYWN0aW9uID0gY29udGV4dC5zdGF0ZV9tYWNoaW5lLmFjdGlvbl9vbl9jb21tYW5kX3RpbWVvdXQoKTsKLSAgICAgICAgICAgICAgICBtYXRjaCB0aW1lb3V0X2FjdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRpbWVvdXRBY3Rpb25zOjpOb29wID0+ICgpLAotICAgICAgICAgICAgICAgICAgICBfID0+IGNvbW1hbmRfdGltZW91dC5yZXNldChDT01NQU5EX1RJTUVPVVRfRFVSQVRJT04pLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotcHViIHRyYWl0IFByb2Nlc3NNYW5hZ2VyIHsKLSAgICBmbiBzdGFydCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IFN0cmluZyk7Ci0gICAgZm4gc3RvcCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IFN0cmluZyk7Ci19Ci0KLXB1YiBlbnVtIEludm9rZXIgewotICAgIE5hdGl2ZUludm9rZXIsCi0gICAgU3lzdGVtZEludm9rZXIsCi0gICAgVXBzdGFydEludm9rZXIsCi19Ci0KLXB1YiBzdHJ1Y3QgTmF0aXZlSW52b2tlciB7Ci0gICAgcHJvY2Vzc19jb250YWluZXI6IE9wdGlvbjxDaGlsZD4sCi0gICAgYmx1ZXRvb3RoX3BpZDogdTMyLAotfQotCi1pbXBsIE5hdGl2ZUludm9rZXIgewotICAgIHB1YiBmbiBuZXcoKSAtPiBOYXRpdmVJbnZva2VyIHsKLSAgICAgICAgTmF0aXZlSW52b2tlciB7IHByb2Nlc3NfY29udGFpbmVyOiBOb25lLCBibHVldG9vdGhfcGlkOiAwIH0KLSAgICB9Ci19Ci0KLWltcGwgUHJvY2Vzc01hbmFnZXIgZm9yIE5hdGl2ZUludm9rZXIgewotICAgIGZuIHN0YXJ0KCZtdXQgc2VsZiwgaGNpX2ludGVyZmFjZTogU3RyaW5nKSB7Ci0gICAgICAgIGxldCBuZXdfcHJvY2VzcyA9IENvbW1hbmQ6Om5ldygiL3Vzci9iaW4vYnRhZGFwdGVyZCIpCi0gICAgICAgICAgICAuYXJnKGZvcm1hdCEoIkhDST17fSIsIGhjaV9pbnRlcmZhY2UpKQotICAgICAgICAgICAgLnN0ZG91dChTdGRpbzo6cGlwZWQoKSkKLSAgICAgICAgICAgIC5zcGF3bigpCi0gICAgICAgICAgICAuZXhwZWN0KCJjYW5ub3Qgb3BlbiIpOwotICAgICAgICBzZWxmLmJsdWV0b290aF9waWQgPSBuZXdfcHJvY2Vzcy5pZCgpOwotICAgICAgICBzZWxmLnByb2Nlc3NfY29udGFpbmVyID0gU29tZShuZXdfcHJvY2Vzcyk7Ci0gICAgfQotICAgIGZuIHN0b3AoJm11dCBzZWxmLCBfaGNpX2ludGVyZmFjZTogU3RyaW5nKSB7Ci0gICAgICAgIG1hdGNoIHNlbGYucHJvY2Vzc19jb250YWluZXIgewotICAgICAgICAgICAgU29tZShyZWYgbXV0IF9wKSA9PiB7Ci0gICAgICAgICAgICAgICAgc2lnbmFsOjpraWxsKFBpZDo6ZnJvbV9yYXcoc2VsZi5ibHVldG9vdGhfcGlkIGFzIGkzMiksIFNpZ25hbDo6U0lHVEVSTSkudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2NvbnRhaW5lciA9IE5vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOb25lID0+IHsKLSAgICAgICAgICAgICAgICB3YXJuISgiUHJvY2VzcyBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXB1YiBzdHJ1Y3QgVXBzdGFydEludm9rZXIge30KLQotaW1wbCBVcHN0YXJ0SW52b2tlciB7Ci0gICAgcHViIGZuIG5ldygpIC0+IFVwc3RhcnRJbnZva2VyIHsKLSAgICAgICAgVXBzdGFydEludm9rZXIge30KLSAgICB9Ci19Ci0KLWltcGwgUHJvY2Vzc01hbmFnZXIgZm9yIFVwc3RhcnRJbnZva2VyIHsKLSAgICBmbiBzdGFydCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IFN0cmluZykgewotICAgICAgICBDb21tYW5kOjpuZXcoImluaXRjdGwiKQotICAgICAgICAgICAgLmFyZ3MoJlsic3RhcnQiLCAiYnRhZGFwdGVyZCIsIGZvcm1hdCEoIkhDST17fSIsIGhjaV9pbnRlcmZhY2UpLmFzX3N0cigpXSkKLSAgICAgICAgICAgIC5vdXRwdXQoKQotICAgICAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIHN0YXJ0IGJsdWV0b290aCIpOwotICAgIH0KLQotICAgIGZuIHN0b3AoJm11dCBzZWxmLCBoY2lfaW50ZXJmYWNlOiBTdHJpbmcpIHsKLSAgICAgICAgQ29tbWFuZDo6bmV3KCJpbml0Y3RsIikKLSAgICAgICAgICAgIC5hcmdzKCZbInN0b3AiLCAiYnRhZGFwdGVyZCIsIGZvcm1hdCEoIkhDST17fSIsIGhjaV9pbnRlcmZhY2UpLmFzX3N0cigpXSkKLSAgICAgICAgICAgIC5vdXRwdXQoKQotICAgICAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIHN0b3AgYmx1ZXRvb3RoIik7Ci0gICAgfQotfQotCi1wdWIgc3RydWN0IFN5c3RlbWRJbnZva2VyIHt9Ci0KLWltcGwgU3lzdGVtZEludm9rZXIgewotICAgIHB1YiBmbiBuZXcoKSAtPiBTeXN0ZW1kSW52b2tlciB7Ci0gICAgICAgIFN5c3RlbWRJbnZva2VyIHt9Ci0gICAgfQotfQotCi1pbXBsIFByb2Nlc3NNYW5hZ2VyIGZvciBTeXN0ZW1kSW52b2tlciB7Ci0gICAgZm4gc3RhcnQoJm11dCBzZWxmLCBoY2lfaW50ZXJmYWNlOiBTdHJpbmcpIHsKLSAgICAgICAgQ29tbWFuZDo6bmV3KCJzeXN0ZW1jdGwiKQotICAgICAgICAgICAgLmFyZ3MoJlsicmVzdGFydCIsIGZvcm1hdCEoImJ0YWRhcHRlcmRAe30uc2VydmljZSIsIGhjaV9pbnRlcmZhY2UpLmFzX3N0cigpXSkKLSAgICAgICAgICAgIC5vdXRwdXQoKQotICAgICAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIHN0YXJ0IGJsdWV0b290aCIpOwotICAgIH0KLQotICAgIGZuIHN0b3AoJm11dCBzZWxmLCBoY2lfaW50ZXJmYWNlOiBTdHJpbmcpIHsKLSAgICAgICAgQ29tbWFuZDo6bmV3KCJzeXN0ZW1jdGwiKQotICAgICAgICAgICAgLmFyZ3MoJlsic3RvcCIsIGZvcm1hdCEoImJ0YWRhcHRlcmRAe30uc2VydmljZSIsIGhjaV9pbnRlcmZhY2UpLmFzX3N0cigpXSkKLSAgICAgICAgICAgIC5vdXRwdXQoKQotICAgICAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIHN0b3AgYmx1ZXRvb3RoIik7Ci0gICAgfQotfQotCi1zdHJ1Y3QgTWFuYWdlclN0YXRlTWFjaGluZSB7Ci0gICAgc3RhdGU6IEFyYzxzdGQ6OnN5bmM6Ok11dGV4PFN0YXRlPj4sCi0gICAgcHJvY2Vzc19tYW5hZ2VyOiBCb3g8ZHluIFByb2Nlc3NNYW5hZ2VyICsgU2VuZD4sCi0gICAgaGNpX2ludGVyZmFjZTogaTMyLAotICAgIGJsdWV0b290aF9waWQ6IGkzMiwKLX0KLQotaW1wbCBNYW5hZ2VyU3RhdGVNYWNoaW5lIHsKLSAgICBwdWIgZm4gbmV3X3Vwc3RhcnQoKSAtPiBNYW5hZ2VyU3RhdGVNYWNoaW5lIHsKLSAgICAgICAgTWFuYWdlclN0YXRlTWFjaGluZTo6bmV3KEJveDo6bmV3KFVwc3RhcnRJbnZva2VyOjpuZXcoKSkpCi0gICAgfQotCi0gICAgcHViIGZuIG5ld19zeXN0ZW1kKCkgLT4gTWFuYWdlclN0YXRlTWFjaGluZSB7Ci0gICAgICAgIE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhTeXN0ZW1kSW52b2tlcjo6bmV3KCkpKQotICAgIH0KLQotICAgIHB1YiBmbiBuZXdfbmF0aXZlKCkgLT4gTWFuYWdlclN0YXRlTWFjaGluZSB7Ci0gICAgICAgIE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhOYXRpdmVJbnZva2VyOjpuZXcoKSkpCi0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZywgUGFydGlhbEVxKV0KLWVudW0gU3RhdGVNYWNoaW5lVGltZW91dEFjdGlvbnMgewotICAgIFJldHJ5U3RhcnQsCi0gICAgUmV0cnlTdG9wLAotICAgIE5vb3AsCi19Ci0KLWltcGwgTWFuYWdlclN0YXRlTWFjaGluZSB7Ci0gICAgcHViIGZuIG5ldyhwcm9jZXNzX21hbmFnZXI6IEJveDxkeW4gUHJvY2Vzc01hbmFnZXIgKyBTZW5kPikgLT4gTWFuYWdlclN0YXRlTWFjaGluZSB7Ci0gICAgICAgIE1hbmFnZXJTdGF0ZU1hY2hpbmUgewotICAgICAgICAgICAgc3RhdGU6IEFyYzo6bmV3KHN0ZDo6c3luYzo6TXV0ZXg6Om5ldyhTdGF0ZTo6T2ZmKSksCi0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXI6IHByb2Nlc3NfbWFuYWdlciwKLSAgICAgICAgICAgIGhjaV9pbnRlcmZhY2U6IDAsCi0gICAgICAgICAgICBibHVldG9vdGhfcGlkOiAwLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgc3RhcnRpbmcgYmx1ZXRvb3RoIHByb2Nlc3MuCi0gICAgcHViIGZuIGFjdGlvbl9zdGFydF9ibHVldG9vdGgoJm11dCBzZWxmLCBoY2lfaW50ZXJmYWNlOiBpMzIpIC0+IGJvb2wgewotICAgICAgICBsZXQgbXV0IHN0YXRlID0gc2VsZi5zdGF0ZS5sb2NrKCkudW53cmFwKCk7Ci0gICAgICAgIG1hdGNoICpzdGF0ZSB7Ci0gICAgICAgICAgICBTdGF0ZTo6T2ZmID0+IHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBTdGF0ZTo6VHVybmluZ09uOwotICAgICAgICAgICAgICAgIHNlbGYuaGNpX2ludGVyZmFjZSA9IGhjaV9pbnRlcmZhY2U7Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX21hbmFnZXIuc3RhcnQoZm9ybWF0ISgie30iLCBoY2lfaW50ZXJmYWNlKSk7Ci0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIG5vIG9wCi0gICAgICAgICAgICBfID0+IGZhbHNlLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgc3RvcHBpbmcgYmx1ZXRvb3RoIHByb2Nlc3MuCi0gICAgcHViIGZuIGFjdGlvbl9zdG9wX2JsdWV0b290aCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMikgLT4gYm9vbCB7Ci0gICAgICAgIGlmIHNlbGYuaGNpX2ludGVyZmFjZSAhPSBoY2lfaW50ZXJmYWNlIHsKLSAgICAgICAgICAgIHdhcm4hKAotICAgICAgICAgICAgICAgICJXZSBhcmUgcnVubmluZyBoY2l7fSBidXQgYXR0ZW1wdGluZyB0byBzdG9wIGhjaXt9IiwKLSAgICAgICAgICAgICAgICBzZWxmLmhjaV9pbnRlcmZhY2UsIGhjaV9pbnRlcmZhY2UKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgbXV0IHN0YXRlID0gc2VsZi5zdGF0ZS5sb2NrKCkudW53cmFwKCk7Ci0gICAgICAgIG1hdGNoICpzdGF0ZSB7Ci0gICAgICAgICAgICBTdGF0ZTo6T24gPT4gewotICAgICAgICAgICAgICAgICpzdGF0ZSA9IFN0YXRlOjpUdXJuaW5nT2ZmOwotICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19tYW5hZ2VyLnN0b3Aoc2VsZi5oY2lfaW50ZXJmYWNlLnRvX3N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdGF0ZTo6VHVybmluZ09uID0+IHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBTdGF0ZTo6T2ZmOwotICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19tYW5hZ2VyLnN0b3Aoc2VsZi5oY2lfaW50ZXJmYWNlLnRvX3N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBmYWxzZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIG5vIG9wCi0gICAgICAgICAgICBfID0+IGZhbHNlLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgZXhwZWN0ZWQuCi0gICAgcHViIGZuIGFjdGlvbl9vbl9ibHVldG9vdGhfc3RhcnRlZCgmbXV0IHNlbGYsIHBpZDogaTMyLCBoY2lfaW50ZXJmYWNlOiBpMzIpIC0+IGJvb2wgewotICAgICAgICBsZXQgbXV0IHN0YXRlID0gc2VsZi5zdGF0ZS5sb2NrKCkudW53cmFwKCk7Ci0gICAgICAgIGlmIHNlbGYuaGNpX2ludGVyZmFjZSAhPSBoY2lfaW50ZXJmYWNlIHsKLSAgICAgICAgICAgIHdhcm4hKAotICAgICAgICAgICAgICAgICJXZSBzaG91bGQgc3RhcnQgaGNpe30gYnV0IGhjaXt9IGlzIHN0YXJ0ZWQ7IGNhcHR1cmluZyB0aGF0IHByb2Nlc3MiLAotICAgICAgICAgICAgICAgIHNlbGYuaGNpX2ludGVyZmFjZSwgaGNpX2ludGVyZmFjZQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHNlbGYuaGNpX2ludGVyZmFjZSA9IGhjaV9pbnRlcmZhY2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKnN0YXRlICE9IFN0YXRlOjpUdXJuaW5nT24gewotICAgICAgICAgICAgd2FybiEoIlVuZXhwZWN0ZWQgQmx1ZXRvb3RoIHN0YXJ0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICAqc3RhdGUgPSBTdGF0ZTo6T247Ci0gICAgICAgIHNlbGYuYmx1ZXRvb3RoX3BpZCA9IHBpZDsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IGlzIGV4cGVjdGVkLgotICAgIC8vLyBJZiB1bmV4cGVjdGVkLCBCbHVldG9vdGggcHJvYmFibHkgY3Jhc2hlZDsKLSAgICAvLy8gc3RhcnQgdGhlIHRpbWVyIGZvciByZXN0YXJ0IHRpbWVvdXQKLSAgICBwdWIgZm4gYWN0aW9uX29uX2JsdWV0b290aF9zdG9wcGVkKCZtdXQgc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIGxldCBtdXQgc3RhdGUgPSBzZWxmLnN0YXRlLmxvY2soKS51bndyYXAoKTsKLQotICAgICAgICBtYXRjaCAqc3RhdGUgewotICAgICAgICAgICAgU3RhdGU6OlR1cm5pbmdPZmYgPT4gewotICAgICAgICAgICAgICAgICpzdGF0ZSA9IFN0YXRlOjpPZmY7Ci0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RhdGU6Ok9uID0+IHsKLSAgICAgICAgICAgICAgICB3YXJuISgiQmx1ZXRvb3RoIHN0b3BwZWQgdW5leHBlY3RlZGx5LCB0cnkgcmVzdGFydGluZyIpOwotICAgICAgICAgICAgICAgICpzdGF0ZSA9IFN0YXRlOjpUdXJuaW5nT247Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX21hbmFnZXIuc3RhcnQoZm9ybWF0ISgie30iLCBzZWxmLmhjaV9pbnRlcmZhY2UpKTsKLSAgICAgICAgICAgICAgICBmYWxzZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RhdGU6OlR1cm5pbmdPbiB8IFN0YXRlOjpPZmYgPT4gewotICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQKLSAgICAgICAgICAgICAgICBwYW5pYyEoInVuZXhwZWN0ZWQgYmx1ZXRvb3RoIHNodXRkb3duIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gVHJpZ2dlcmVkIG9uIEJsdWV0b290aCBzdGFydC9zdG9wIHRpbWVvdXQuICBSZXR1cm4gdGhlIGFjdGlvbnMgdGhhdCB0aGUKLSAgICAvLy8gc3RhdGUgbWFjaGluZSBoYXMgdGFrZW4sIGZvciB0aGUgZXh0ZXJuYWwgY29udGV4dCB0byByZXNldCB0aGUgdGltZXIuCi0gICAgcHViIGZuIGFjdGlvbl9vbl9jb21tYW5kX3RpbWVvdXQoJm11dCBzZWxmKSAtPiBTdGF0ZU1hY2hpbmVUaW1lb3V0QWN0aW9ucyB7Ci0gICAgICAgIGxldCBtdXQgc3RhdGUgPSBzZWxmLnN0YXRlLmxvY2soKS51bndyYXAoKTsKLSAgICAgICAgbWF0Y2ggKnN0YXRlIHsKLSAgICAgICAgICAgIFN0YXRlOjpUdXJuaW5nT24gPT4gewotICAgICAgICAgICAgICAgIGluZm8hKCJSZXN0YXJ0aW5nIGJsdWV0b290aCB7fSIsIHNlbGYuaGNpX2ludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgKnN0YXRlID0gU3RhdGU6OlR1cm5pbmdPbjsKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfbWFuYWdlci5zdG9wKGZvcm1hdCEgeyJ7fSIsIHNlbGYuaGNpX2ludGVyZmFjZX0pOwotICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19tYW5hZ2VyLnN0YXJ0KGZvcm1hdCEgeyJ7fSIsIHNlbGYuaGNpX2ludGVyZmFjZX0pOwotICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRpbWVvdXRBY3Rpb25zOjpSZXRyeVN0YXJ0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdGF0ZTo6VHVybmluZ09mZiA9PiB7Ci0gICAgICAgICAgICAgICAgaW5mbyEoIktpbGxpbmcgYmx1ZXRvb3RoIHt9Iiwgc2VsZi5oY2lfaW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfbWFuYWdlci5zdG9wKGZvcm1hdCEgeyJ7fSIsIHNlbGYuaGNpX2ludGVyZmFjZX0pOwotICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRpbWVvdXRBY3Rpb25zOjpSZXRyeVN0b3AKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF8gPT4gU3RhdGVNYWNoaW5lVGltZW91dEFjdGlvbnM6Ok5vb3AsCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNbY2ZnKHRlc3QpXQotbW9kIHRlc3RzIHsKLSAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIHN0ZDo6Y29sbGVjdGlvbnM6OlZlY0RlcXVlOwotCi0gICAgI1tkZXJpdmUoRGVidWcsIFBhcnRpYWxFcSldCi0gICAgZW51bSBFeGVjdXRlZENvbW1hbmQgewotICAgICAgICBTdGFydCwKLSAgICAgICAgU3RvcCwKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgTW9ja1Byb2Nlc3NNYW5hZ2VyIHsKLSAgICAgICAgbGFzdF9jb21tYW5kOiBWZWNEZXF1ZTxFeGVjdXRlZENvbW1hbmQ+LAotICAgIH0KLQotICAgIGltcGwgTW9ja1Byb2Nlc3NNYW5hZ2VyIHsKLSAgICAgICAgZm4gbmV3KCkgLT4gTW9ja1Byb2Nlc3NNYW5hZ2VyIHsKLSAgICAgICAgICAgIE1vY2tQcm9jZXNzTWFuYWdlciB7IGxhc3RfY29tbWFuZDogVmVjRGVxdWU6Om5ldygpIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZuIGV4cGVjdF9zdGFydCgmbXV0IHNlbGYpIHsKLSAgICAgICAgICAgIHNlbGYubGFzdF9jb21tYW5kLnB1c2hfYmFjayhFeGVjdXRlZENvbW1hbmQ6OlN0YXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZuIGV4cGVjdF9zdG9wKCZtdXQgc2VsZikgewotICAgICAgICAgICAgc2VsZi5sYXN0X2NvbW1hbmQucHVzaF9iYWNrKEV4ZWN1dGVkQ29tbWFuZDo6U3RvcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbXBsIFByb2Nlc3NNYW5hZ2VyIGZvciBNb2NrUHJvY2Vzc01hbmFnZXIgewotICAgICAgICBmbiBzdGFydCgmbXV0IHNlbGYsIF86IFN0cmluZykgewotICAgICAgICAgICAgbGV0IHN0YXJ0ID0gc2VsZi5sYXN0X2NvbW1hbmQucG9wX2Zyb250KCkuZXhwZWN0KCJTaG91bGQgZXhwZWN0IHN0YXJ0IGV2ZW50Iik7Ci0gICAgICAgICAgICBhc3NlcnRfZXEhKHN0YXJ0LCBFeGVjdXRlZENvbW1hbmQ6OlN0YXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZuIHN0b3AoJm11dCBzZWxmLCBfOiBTdHJpbmcpIHsKLSAgICAgICAgICAgIGxldCBzdG9wID0gc2VsZi5sYXN0X2NvbW1hbmQucG9wX2Zyb250KCkuZXhwZWN0KCJTaG91bGQgZXhwZWN0IHN0b3AgZXZlbnQiKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoc3RvcCwgRXhlY3V0ZWRDb21tYW5kOjpTdG9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGltcGwgRHJvcCBmb3IgTW9ja1Byb2Nlc3NNYW5hZ2VyIHsKLSAgICAgICAgZm4gZHJvcCgmbXV0IHNlbGYpIHsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoc2VsZi5sYXN0X2NvbW1hbmQubGVuKCksIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIGluaXRpYWxfc3RhdGVfaXNfb2ZmKCkgewotICAgICAgICB0b2tpbzo6cnVudGltZTo6UnVudGltZTo6bmV3KCkudW53cmFwKCkuYmxvY2tfb24oYXN5bmMgewotICAgICAgICAgICAgbGV0IHByb2Nlc3NfbWFuYWdlciA9IE1vY2tQcm9jZXNzTWFuYWdlcjo6bmV3KCk7Ci0gICAgICAgICAgICBsZXQgc3RhdGVfbWFjaGluZSA9IE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhwcm9jZXNzX21hbmFnZXIpKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpLCBTdGF0ZTo6T2ZmKTsKLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gb2ZmX3R1cm5vZmZfc2hvdWxkX25vb3AoKSB7Ci0gICAgICAgIHRva2lvOjpydW50aW1lOjpSdW50aW1lOjpuZXcoKS51bndyYXAoKS5ibG9ja19vbihhc3luYyB7Ci0gICAgICAgICAgICBsZXQgcHJvY2Vzc19tYW5hZ2VyID0gTW9ja1Byb2Nlc3NNYW5hZ2VyOjpuZXcoKTsKLSAgICAgICAgICAgIGxldCBtdXQgc3RhdGVfbWFjaGluZSA9IE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhwcm9jZXNzX21hbmFnZXIpKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX3N0b3BfYmx1ZXRvb3RoKDApOwotICAgICAgICAgICAgYXNzZXJ0X2VxISgqc3RhdGVfbWFjaGluZS5zdGF0ZS5sb2NrKCkudW53cmFwKCksIFN0YXRlOjpPZmYpOwotICAgICAgICB9KQotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiBvZmZfdHVybm9uX3Nob3VsZF90dXJuaW5nb24oKSB7Ci0gICAgICAgIHRva2lvOjpydW50aW1lOjpSdW50aW1lOjpuZXcoKS51bndyYXAoKS5ibG9ja19vbihhc3luYyB7Ci0gICAgICAgICAgICBsZXQgbXV0IHByb2Nlc3NfbWFuYWdlciA9IE1vY2tQcm9jZXNzTWFuYWdlcjo6bmV3KCk7Ci0gICAgICAgICAgICAvLyBFeHBlY3QgdG8gc2VuZCBzdGFydCBjb21tYW5kCi0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0YXJ0KCk7Ci0gICAgICAgICAgICBsZXQgbXV0IHN0YXRlX21hY2hpbmUgPSBNYW5hZ2VyU3RhdGVNYWNoaW5lOjpuZXcoQm94OjpuZXcocHJvY2Vzc19tYW5hZ2VyKSk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdGFydF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBhc3NlcnRfZXEhKCpzdGF0ZV9tYWNoaW5lLnN0YXRlLmxvY2soKS51bndyYXAoKSwgU3RhdGU6OlR1cm5pbmdPbik7Ci0gICAgICAgIH0pCi0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHR1cm5pbmdvbl90dXJub25fYWdhaW5fbm9vcCgpIHsKLSAgICAgICAgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCBtdXQgcHJvY2Vzc19tYW5hZ2VyID0gTW9ja1Byb2Nlc3NNYW5hZ2VyOjpuZXcoKTsKLSAgICAgICAgICAgIC8vIEV4cGVjdCB0byBzZW5kIHN0YXJ0IGNvbW1hbmQganVzdCBvbmNlCi0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0YXJ0KCk7Ci0gICAgICAgICAgICBsZXQgbXV0IHN0YXRlX21hY2hpbmUgPSBNYW5hZ2VyU3RhdGVNYWNoaW5lOjpuZXcoQm94OjpuZXcocHJvY2Vzc19tYW5hZ2VyKSk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdGFydF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBhc3NlcnRfZXEhKHN0YXRlX21hY2hpbmUuYWN0aW9uX3N0YXJ0X2JsdWV0b290aCgwKSwgZmFsc2UpOwotICAgICAgICB9KQotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0dXJuaW5nb25fYmx1ZXRvb3RoX3N0YXJ0ZWQoKSB7Ci0gICAgICAgIHRva2lvOjpydW50aW1lOjpSdW50aW1lOjpuZXcoKS51bndyYXAoKS5ibG9ja19vbihhc3luYyB7Ci0gICAgICAgICAgICBsZXQgbXV0IHByb2Nlc3NfbWFuYWdlciA9IE1vY2tQcm9jZXNzTWFuYWdlcjo6bmV3KCk7Ci0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0YXJ0KCk7Ci0gICAgICAgICAgICBsZXQgbXV0IHN0YXRlX21hY2hpbmUgPSBNYW5hZ2VyU3RhdGVNYWNoaW5lOjpuZXcoQm94OjpuZXcocHJvY2Vzc19tYW5hZ2VyKSk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdGFydF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9vbl9ibHVldG9vdGhfc3RhcnRlZCgwLCAwKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpLCBTdGF0ZTo6T24pOwotICAgICAgICB9KQotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0dXJuaW5nb25fYmx1ZXRvb3RoX2RpZmZlcmVudF9oY2lfc3RhcnRlZCgpIHsKLSAgICAgICAgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCBtdXQgcHJvY2Vzc19tYW5hZ2VyID0gTW9ja1Byb2Nlc3NNYW5hZ2VyOjpuZXcoKTsKLSAgICAgICAgICAgIHByb2Nlc3NfbWFuYWdlci5leHBlY3Rfc3RhcnQoKTsKLSAgICAgICAgICAgIGxldCBtdXQgc3RhdGVfbWFjaGluZSA9IE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhwcm9jZXNzX21hbmFnZXIpKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX3N0YXJ0X2JsdWV0b290aCgxKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX29uX2JsdWV0b290aF9zdGFydGVkKDEsIDEpOwotICAgICAgICAgICAgYXNzZXJ0X2VxISgqc3RhdGVfbWFjaGluZS5zdGF0ZS5sb2NrKCkudW53cmFwKCksIFN0YXRlOjpPbik7Ci0gICAgICAgIH0pCi0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHR1cm5pbmdvbl90aW1lb3V0KCkgewotICAgICAgICB0b2tpbzo6cnVudGltZTo6UnVudGltZTo6bmV3KCkudW53cmFwKCkuYmxvY2tfb24oYXN5bmMgewotICAgICAgICAgICAgbGV0IG11dCBwcm9jZXNzX21hbmFnZXIgPSBNb2NrUHJvY2Vzc01hbmFnZXI6Om5ldygpOwotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdGFydCgpOwotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdG9wKCk7Ci0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0YXJ0KCk7IC8vIHN0YXJ0IGJsdWV0b290aCBhZ2FpbgotICAgICAgICAgICAgbGV0IG11dCBzdGF0ZV9tYWNoaW5lID0gTWFuYWdlclN0YXRlTWFjaGluZTo6bmV3KEJveDo6bmV3KHByb2Nlc3NfbWFuYWdlcikpOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fc3RhcnRfYmx1ZXRvb3RoKDApOwotICAgICAgICAgICAgYXNzZXJ0X2VxISgKLSAgICAgICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9vbl9jb21tYW5kX3RpbWVvdXQoKSwKLSAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUaW1lb3V0QWN0aW9uczo6UmV0cnlTdGFydAotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpLCBTdGF0ZTo6VHVybmluZ09uKTsKLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdHVybmluZ29uX3R1cm5vZmZfc2hvdWxkX3R1cm5pbmdvZmZfYW5kX3NlbmRfY29tbWFuZCgpIHsKLSAgICAgICAgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCBtdXQgcHJvY2Vzc19tYW5hZ2VyID0gTW9ja1Byb2Nlc3NNYW5hZ2VyOjpuZXcoKTsKLSAgICAgICAgICAgIHByb2Nlc3NfbWFuYWdlci5leHBlY3Rfc3RhcnQoKTsKLSAgICAgICAgICAgIC8vIEV4cGVjdCB0byBzZW5kIHN0b3AgY29tbWFuZAotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdG9wKCk7Ci0gICAgICAgICAgICBsZXQgbXV0IHN0YXRlX21hY2hpbmUgPSBNYW5hZ2VyU3RhdGVNYWNoaW5lOjpuZXcoQm94OjpuZXcocHJvY2Vzc19tYW5hZ2VyKSk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdGFydF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdG9wX2JsdWV0b290aCgwKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpLCBTdGF0ZTo6T2ZmKTsKLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gb25fdHVybm9mZl9zaG91bGRfdHVybmluZ29mZl9hbmRfc2VuZF9jb21tYW5kKCkgewotICAgICAgICB0b2tpbzo6cnVudGltZTo6UnVudGltZTo6bmV3KCkudW53cmFwKCkuYmxvY2tfb24oYXN5bmMgewotICAgICAgICAgICAgbGV0IG11dCBwcm9jZXNzX21hbmFnZXIgPSBNb2NrUHJvY2Vzc01hbmFnZXI6Om5ldygpOwotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdGFydCgpOwotICAgICAgICAgICAgLy8gRXhwZWN0IHRvIHNlbmQgc3RvcCBjb21tYW5kCi0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0b3AoKTsKLSAgICAgICAgICAgIGxldCBtdXQgc3RhdGVfbWFjaGluZSA9IE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhwcm9jZXNzX21hbmFnZXIpKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX3N0YXJ0X2JsdWV0b290aCgwKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX29uX2JsdWV0b290aF9zdGFydGVkKDAsIDApOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fc3RvcF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBhc3NlcnRfZXEhKCpzdGF0ZV9tYWNoaW5lLnN0YXRlLmxvY2soKS51bndyYXAoKSwgU3RhdGU6OlR1cm5pbmdPZmYpOwotICAgICAgICB9KQotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiBvbl9ibHVldG9vdGhfc3RvcHBlZCgpIHsKLSAgICAgICAgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU6Om5ldygpLnVud3JhcCgpLmJsb2NrX29uKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCBtdXQgcHJvY2Vzc19tYW5hZ2VyID0gTW9ja1Byb2Nlc3NNYW5hZ2VyOjpuZXcoKTsKLSAgICAgICAgICAgIHByb2Nlc3NfbWFuYWdlci5leHBlY3Rfc3RhcnQoKTsKLSAgICAgICAgICAgIC8vIEV4cGVjdCB0byBzdGFydCBhZ2FpbgotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdGFydCgpOwotICAgICAgICAgICAgbGV0IG11dCBzdGF0ZV9tYWNoaW5lID0gTWFuYWdlclN0YXRlTWFjaGluZTo6bmV3KEJveDo6bmV3KHByb2Nlc3NfbWFuYWdlcikpOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fc3RhcnRfYmx1ZXRvb3RoKDApOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fb25fYmx1ZXRvb3RoX3N0YXJ0ZWQoMCwgMCk7Ci0gICAgICAgICAgICBhc3NlcnRfZXEhKHN0YXRlX21hY2hpbmUuYWN0aW9uX29uX2JsdWV0b290aF9zdG9wcGVkKCksIGZhbHNlKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpLCBTdGF0ZTo6VHVybmluZ09uKTsKLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdHVybmluZ29mZl9ibHVldG9vdGhfZG93bl9zaG91bGRfb2ZmKCkgewotICAgICAgICB0b2tpbzo6cnVudGltZTo6UnVudGltZTo6bmV3KCkudW53cmFwKCkuYmxvY2tfb24oYXN5bmMgewotICAgICAgICAgICAgbGV0IG11dCBwcm9jZXNzX21hbmFnZXIgPSBNb2NrUHJvY2Vzc01hbmFnZXI6Om5ldygpOwotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdGFydCgpOwotICAgICAgICAgICAgcHJvY2Vzc19tYW5hZ2VyLmV4cGVjdF9zdG9wKCk7Ci0gICAgICAgICAgICBsZXQgbXV0IHN0YXRlX21hY2hpbmUgPSBNYW5hZ2VyU3RhdGVNYWNoaW5lOjpuZXcoQm94OjpuZXcocHJvY2Vzc19tYW5hZ2VyKSk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9zdGFydF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9vbl9ibHVldG9vdGhfc3RhcnRlZCgwLCAwKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX3N0b3BfYmx1ZXRvb3RoKDApOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fb25fYmx1ZXRvb3RoX3N0b3BwZWQoKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlX21hY2hpbmUuc3RhdGUubG9jaygpLnVud3JhcCgpLCBTdGF0ZTo6T2ZmKTsKLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gcmVzdGFydF9ibHVldG9vdGgoKSB7Ci0gICAgICAgIHRva2lvOjpydW50aW1lOjpSdW50aW1lOjpuZXcoKS51bndyYXAoKS5ibG9ja19vbihhc3luYyB7Ci0gICAgICAgICAgICBsZXQgbXV0IHByb2Nlc3NfbWFuYWdlciA9IE1vY2tQcm9jZXNzTWFuYWdlcjo6bmV3KCk7Ci0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0YXJ0KCk7Ci0gICAgICAgICAgICBwcm9jZXNzX21hbmFnZXIuZXhwZWN0X3N0b3AoKTsKLSAgICAgICAgICAgIHByb2Nlc3NfbWFuYWdlci5leHBlY3Rfc3RhcnQoKTsKLSAgICAgICAgICAgIGxldCBtdXQgc3RhdGVfbWFjaGluZSA9IE1hbmFnZXJTdGF0ZU1hY2hpbmU6Om5ldyhCb3g6Om5ldyhwcm9jZXNzX21hbmFnZXIpKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX3N0YXJ0X2JsdWV0b290aCgwKTsKLSAgICAgICAgICAgIHN0YXRlX21hY2hpbmUuYWN0aW9uX29uX2JsdWV0b290aF9zdGFydGVkKDAsIDApOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fc3RvcF9ibHVldG9vdGgoMCk7Ci0gICAgICAgICAgICBzdGF0ZV9tYWNoaW5lLmFjdGlvbl9vbl9ibHVldG9vdGhfc3RvcHBlZCgpOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fc3RhcnRfYmx1ZXRvb3RoKDApOwotICAgICAgICAgICAgc3RhdGVfbWFjaGluZS5hY3Rpb25fb25fYmx1ZXRvb3RoX3N0YXJ0ZWQoMCwgMCk7Ci0gICAgICAgICAgICBhc3NlcnRfZXEhKCpzdGF0ZV9tYWNoaW5lLnN0YXRlLmxvY2soKS51bndyYXAoKSwgU3RhdGU6Ok9uKTsKLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gcGF0aF90b19oY2lfaW50ZXJmYWNlKCkgewotICAgICAgICBhc3NlcnRfZXEhKGdldF9oY2lfaW5kZXhfZnJvbV9waWRfcGF0aCgiL3Zhci9ydW4vYmx1ZXRvb3RoL2JsdWV0b290aDAucGlkIiksIFNvbWUoMCkpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9oY2lfaW5kZXhfZnJvbV9waWRfcGF0aCgiL3Zhci9ydW4vYmx1ZXRvb3RoL2JsdWV0b290aDEucGlkIiksIFNvbWUoMSkpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9oY2lfaW5kZXhfZnJvbV9waWRfcGF0aCgiL3Zhci9ydW4vYmx1ZXRvb3RoL2JsdWV0b290aDEwLnBpZCIpLCBTb21lKDEwKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X2hjaV9pbmRleF9mcm9tX3BpZF9wYXRoKCIvdmFyL3J1bi9ibHVldG9vdGgvZ2FyYmFnZSIpLCBOb25lKTsKLQotICAgICAgICBhc3NlcnRfZXEhKGdldF9oY2lfaW5kZXhfZnJvbV9kZXZpY2UoIi9zeXMvY2xhc3MvYmx1ZXRvb3RoL2hjaTAiKSwgU29tZSgwKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X2hjaV9pbmRleF9mcm9tX2RldmljZSgiL3N5cy9jbGFzcy9ibHVldG9vdGgvaGNpMSIpLCBTb21lKDEpKTsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfaGNpX2luZGV4X2Zyb21fZGV2aWNlKCIvc3lzL2NsYXNzL2JsdWV0b290aC9oY2kxMCIpLCBTb21lKDEwKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X2hjaV9pbmRleF9mcm9tX2RldmljZSgiL3N5cy9jbGFzcy9ibHVldG9vdGgvZXRoMCIpLCBOb25lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2lmYWNlX2JsdWV0b290aF9tYW5hZ2VyLnJzIGIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9pZmFjZV9ibHVldG9vdGhfbWFuYWdlci5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1ZTJjOC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L21nbXQvc3JjL2lmYWNlX2JsdWV0b290aF9tYW5hZ2VyLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotdXNlIGNyYXRlOjpSUENQcm94eTsKLQotI1tkZXJpdmUoRGVidWcsIERlZmF1bHQpXQotcHViIHN0cnVjdCBBZGFwdGVyV2l0aEVuYWJsZWQgewotICAgIHB1YiBoY2lfaW50ZXJmYWNlOiBpMzIsCi0gICAgcHViIGVuYWJsZWQ6IGJvb2wsCi19Ci0KLS8vLyBCbHVldG9vdGggc3RhY2sgbWFuYWdlbWVudCBBUEkuCi1wdWIgdHJhaXQgSUJsdWV0b290aE1hbmFnZXIgewotICAgIC8vLyBTdGFydHMgdGhlIEJsdWV0b290aCBzdGFjay4KLSAgICBmbiBzdGFydCgmbXV0IHNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMik7Ci0KLSAgICAvLy8gU3RvcHMgdGhlIEJsdWV0b290aCBzdGFjay4KLSAgICBmbiBzdG9wKCZtdXQgc2VsZiwgaGNpX2ludGVyZmFjZTogaTMyKTsKLQotICAgIC8vLyBSZXR1cm5zIHdoZXRoZXIgYW4gYWRhcHRlciBpcyBlbmFibGVkLgotICAgIGZuIGdldF9hZGFwdGVyX2VuYWJsZWQoJm11dCBzZWxmLCBoY2lfaW50ZXJmYWNlOiBpMzIpIC0+IGJvb2w7Ci0KLSAgICAvLy8gUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gdGhlIEJsdWV0b290aCBtYW5hZ2VyIHN0YXRlLgotICAgIGZuIHJlZ2lzdGVyX2NhbGxiYWNrKCZtdXQgc2VsZiwgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aE1hbmFnZXJDYWxsYmFjayArIFNlbmQ+KTsKLQotICAgIC8vLyBSZXR1cm5zIHdoZXRoZXIgRmxvc3MgaXMgZW5hYmxlZC4KLSAgICBmbiBnZXRfZmxvc3NfZW5hYmxlZCgmbXV0IHNlbGYpIC0+IGJvb2w7Ci0KLSAgICAvLy8gRW5hYmxlcy9kaXNhYmxlcyBGbG9zcy4KLSAgICBmbiBzZXRfZmxvc3NfZW5hYmxlZCgmbXV0IHNlbGYsIGVuYWJsZWQ6IGJvb2wpOwotCi0gICAgLy8vIFJldHVybnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBIQ0kgZGV2aWNlcyBhbmQgaWYgdGhleSBhcmUgZW5hYmxlZC4KLSAgICBmbiBnZXRfYXZhaWxhYmxlX2FkYXB0ZXJzKCZtdXQgc2VsZikgLT4gVmVjPEFkYXB0ZXJXaXRoRW5hYmxlZD47Ci19Ci0KLS8vLyBJbnRlcmZhY2Ugb2YgQmx1ZXRvb3RoIE1hbmFnZXIgY2FsbGJhY2tzLgotcHViIHRyYWl0IElCbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2s6IFJQQ1Byb3h5IHsKLSAgICBmbiBvbl9oY2lfZGV2aWNlX2NoYW5nZWQoJnNlbGYsIGhjaV9pbnRlcmZhY2U6IGkzMiwgcHJlc2VudDogYm9vbCk7Ci0gICAgZm4gb25faGNpX2VuYWJsZWRfY2hhbmdlZCgmc2VsZiwgaGNpX2ludGVyZmFjZTogaTMyLCBlbmFibGVkOiBib29sKTsKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvbWdtdC9zcmMvbGliLnJzIGIvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9saWIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjJkMjguLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9tZ210L3NyYy9saWIucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wdWIgbW9kIGlmYWNlX2JsdWV0b290aF9tYW5hZ2VyOwotCi0vLyBUT0RPOiBUaGlzIGlzIGEgY29weSBvZiBSUENQcm94eSB0aGF0IGlzIGluIGJ0c3RhY2sgY3JlYXRlLiBGaW5kIGEgYmV0dGVyIGhvbWUgZm9yIHRoaXMgc3RydWN0Ci0vLyB0aGF0IGF2b2lkcyBjb2RlIGR1cGxpY2F0aW9uLgotLy8vIFNpZ25pZmllcyB0aGF0IHRoZSBvYmplY3QgbWF5IGJlIGEgcHJveHkgdG8gYSByZW1vdGUgUlBDIG9iamVjdC4KLXB1YiB0cmFpdCBSUENQcm94eSB7Ci0gICAgLy8vIFJlZ2lzdGVycyBkaXNjb25uZWN0IG9ic2VydmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSByZW1vdGUgb2JqZWN0IGlzIGRpc2Nvbm5lY3RlZC4KLSAgICBmbiByZWdpc3Rlcl9kaXNjb25uZWN0KCZtdXQgc2VsZiwgZjogQm94PGR5biBGbih1MzIpICsgU2VuZD4pIC0+IHUzMjsKLQotICAgIC8vLyBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgb2JqZWN0LiBGb3IgZXhhbXBsZSB0aGlzIHdvdWxkIGJlIGFuIG9iamVjdCBwYXRoIGluIEQtQnVzIFJQQy4KLSAgICBmbiBnZXRfb2JqZWN0X2lkKCZzZWxmKSAtPiBTdHJpbmc7Ci0KLSAgICAvLy8gVW5yZWdpc3RlcnMgY2FsbGJhY2sgd2l0aCB0aGlzIGlkLgotICAgIGZuIHVucmVnaXN0ZXIoJm11dCBzZWxmLCBpZDogdTMyKSAtPiBib29sOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9tZ210L3Rlc3QvYnRtYW5hZ2VyZF90ZXN0LnB5IGIvZ2QvcnVzdC9saW51eC9tZ210L3Rlc3QvYnRtYW5hZ2VyZF90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTA5YWU2Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvbWdtdC90ZXN0L2J0bWFuYWdlcmRfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jIS91c3IvYmluL3B5dGhvbjMKLQotIyUlCi0KLWltcG9ydCBkYnVzCi1pbXBvcnQgZGJ1cy5zZXJ2aWNlCi1pbXBvcnQgZGJ1cy5tYWlubG9vcC5nbGliCi1pbXBvcnQgdGltZQotaW1wb3J0IHVuaXR0ZXN0Ci0KLUhDSV9ERVZJQ0VTX0RJUiA9ICIvc3lzL2NsYXNzL2JsdWV0b290aCIKLQotIyBGaWxlIHRvIHN0b3JlIHRoZSBCbHVldG9vdGggZGFlbW9uIHRvIHVzZSAoYmx1ZXogb3IgZmxvc3MpCi1CTFVFVE9PVEhfREFFTU9OX0NVUlJFTlQgPSAiL3Zhci9saWIvbWlzYy9ibHVldG9vdGgtZGFlbW9uLmN1cnJlbnQiCi0KLSMgRmlsZSB0byBzdG9yZSB0aGUgY29uZmlnIGZvciBCbHVldG9vdGhNYW5hZ2VyCi1CVE1BTkFHRVJEX0NPTkYgPSAiL3Zhci9saWIvYmx1ZXRvb3RoL2J0bWFuYWdlcmQuanNvbiIKLQotIyBELUJVUyBidXMgbmFtZQotQlVTX05BTUUgPSAib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIgotCi0jIEQtQnVzIEJsdWV0b290aCBNYW5hZ2VyIG9iamVjdCBwYXRoCi1NQU5BR0VSX09CSkVDVF9QQVRIID0gIi9vcmcvY2hyb21pdW0vYmx1ZXRvb3RoL01hbmFnZXIiCi0KLSMgRC1CdXMgQmx1ZXRvb3RoIE1hbmFnZXIgaW50ZXJmYWNlIG5hbWUKLU1BTkFHRVJfSU5URVJGQUNFX05BTUUgPSAib3JnLmNocm9taXVtLmJsdWV0b290aC5NYW5hZ2VyIgotCi0jIEQtQnVzIEJsdWV0b290aCBNYW5hZ2VyIGNsaWVudCAodGhpcyB0ZXN0KSBvYmplY3QgcGF0aAotQ0xJRU5UX09CSkVDVF9QQVRIID0gIi90ZXN0X2NsaWVudCIKLQotCi1kZWYgdXNlX2Zsb3NzKCk6Ci0gIHdpdGggb3BlbihCTFVFVE9PVEhfREFFTU9OX0NVUlJFTlQsICJ3IikgYXMgZjoKLSAgICBmLndyaXRlKCJmbG9zcyIpCi0KLWRlZiB1c2VfYmx1ZXooKToKLSAgd2l0aCBvcGVuKEJMVUVUT09USF9EQUVNT05fQ1VSUkVOVCwgInciKSBhcyBmOgotICAgIGYud3JpdGUoImZsb3NzIikKLQotY2xhc3MgQnRtYW5hZ2VyZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgc2VsZi5idXMgPSBkYnVzLlN5c3RlbUJ1cygpCi0gICAgICBzZWxmLm1hbmFnZXJfb2JqZWN0ID0gc2VsZi5idXMuZ2V0X29iamVjdChCVVNfTkFNRSwgTUFOQUdFUl9PQkpFQ1RfUEFUSCkKLSAgICAgIHNlbGYuY2xpZW50X29iamVjdCA9IHNlbGYuYnVzLmdldF9vYmplY3QoQlVTX05BTUUsIENMSUVOVF9PQkpFQ1RfUEFUSCkKLSAgICAgIHNlbGYubWFuYWdlcl9vYmplY3QuU3RvcCgwLCBkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRV9OQU1FKQotICAgICAgdGltZS5zbGVlcCgyLjUpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdGF0ZSgpLCAwKQotCi0gICAgZGVmIF9zdGFydF9oY2koc2VsZiwgaGNpPTApOgotICAgICAgc2VsZi5tYW5hZ2VyX29iamVjdC5TdGFydChoY2ksIGRidXNfaW50ZXJmYWNlPU1BTkFHRVJfSU5URVJGQUNFX05BTUUpCi0gICAgICB0aW1lLnNsZWVwKDIuNSkKLQotICAgIGRlZiBfc3RvcF9oY2koc2VsZiwgaGNpPTApOgotICAgICAgc2VsZi5tYW5hZ2VyX29iamVjdC5TdG9wKGhjaSwgZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0VfTkFNRSkKLSAgICAgIHRpbWUuc2xlZXAoMi41KQotCi0gICAgZGVmIF9nZXRfc3RhdGUoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5tYW5hZ2VyX29iamVjdC5HZXRTdGF0ZShkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRV9OQU1FKQotCi0gICAgZGVmIF9yZWdpc3Rlcl9oY2lfZGV2aWNlX2NoYW5nZV9vYnNlcnZlcihzZWxmKToKLSAgICAgIHJldHVybiBzZWxmLm1hbmFnZXJfb2JqZWN0LlJlZ2lzdGVyU3RhdGVDaGFuZ2VPYnNlcnZlcihzZWxmLmNsaWVudF9vYmplY3RfcGF0aCwgZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0VfTkFNRSkKLQotICAgIGRlZiBfdW5yZWdpc3Rlcl9oY2lfZGV2aWNlX2NoYW5nZV9vYnNlcnZlcihzZWxmKToKLSAgICAgIHJldHVybiBzZWxmLm1hbmFnZXJfb2JqZWN0LlVucmVnaXN0ZXJIY2lEZXZpY2VDaGFuZ2VPYnNlcnZlcihzZWxmLmNsaWVudF9vYmplY3RfcGF0aCwgZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0VfTkFNRSkKLQotICAgIGRlZiBfZ2V0X2Zsb3NzX2VuYWJsZWQoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5tYW5hZ2VyX29iamVjdC5HZXRGbG9zc0VuYWJsZWQoZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0VfTkFNRSkKLQotICAgIGRlZiBfc2V0X2Zsb3NzX2VuYWJsZWQoc2VsZiwgZW5hYmxlZD1UcnVlKToKLSAgICAgIHJldHVybiBzZWxmLm1hbmFnZXJfb2JqZWN0LlNldEZsb3NzRW5hYmxlZChlbmFibGVkLCBkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRV9OQU1FKQotCi0gICAgZGVmIF9saXN0X2hjaV9kZXZpY2VzKHNlbGYpOgotICAgICAgcmV0dXJuIHNlbGYubWFuYWdlcl9vYmplY3QuTGlzdEhjaURldmljZXMoZGJ1c19pbnRlcmZhY2U9TUFOQUdFUl9JTlRFUkZBQ0VfTkFNRSkKLQotICAgIGRlZiBfcmVnaXN0ZXJfaGNpX2RldmljZV9jaGFuZ2Vfb2JzZXJ2ZXIoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5tYW5hZ2VyX29iamVjdC5SZWdpc3RlckhjaURldmljZUNoYW5nZU9ic2VydmVyKHNlbGYuY2xpZW50X29iamVjdF9wYXRoLCBkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRV9OQU1FKQotCi0gICAgZGVmIF91bnJlZ2lzdGVyX2hjaV9kZXZpY2VfY2hhbmdlX29ic2VydmVyKHNlbGYpOgotICAgICAgcmV0dXJuIHNlbGYubWFuYWdlcl9vYmplY3QuVW5yZWdpc3RlckhjaURldmljZUNoYW5nZU9ic2VydmVyKHNlbGYuY2xpZW50X29iamVjdF9wYXRoLCBkYnVzX2ludGVyZmFjZT1NQU5BR0VSX0lOVEVSRkFDRV9OQU1FKQotCi0gICAgZGVmIHRlc3RfbGlzdF9oY2lfZGV2aWNlcyhzZWxmKToKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fbGlzdF9oY2lfZGV2aWNlcygpKSA+IDApCi0KLSAgICBkZWYgdGVzdF9mbG9zc19lbmFibGVkKHNlbGYpOgotICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2dldF9mbG9zc19lbmFibGVkKCkpCi0KLSAgICBkZWYgdGVzdF9kaXNhYmxlX2Zsb3NzKHNlbGYpOgotICAgICAgc2VsZi5fc2V0X2Zsb3NzX2VuYWJsZWQoRmFsc2UpCi0gICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX2dldF9mbG9zc19lbmFibGVkKCkpCi0gICAgICB3aXRoIG9wZW4oQkxVRVRPT1RIX0RBRU1PTl9DVVJSRU5ULCAiciIpIGFzIGY6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICJibHVleiIpCi0KLSAgICAgIHNlbGYuX3NldF9mbG9zc19lbmFibGVkKFRydWUpCi0gICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZ2V0X2Zsb3NzX2VuYWJsZWQoKSkKLQotICAgIGRlZiB0ZXN0X3N0YXJ0KHNlbGYpOgotICAgICAgc2VsZi5fc3RhcnRfaGNpKCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZ2V0X3N0YXRlKCksIDIpCi0KLSAgICBkZWYgdGVzdF9hc3RhcnRfYW5kX3N0YXJ0KHNlbGYpOgotICAgICAgc2VsZi5fc3RhcnRfaGNpKCkKLSAgICAgIHNlbGYuX3N0YXJ0X2hjaSgpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdGF0ZSgpLCAyKQotCi0gICAgZGVmIHRlc3Rfc3RvcChzZWxmKToKLSAgICAgIHNlbGYuX3N0YXJ0X2hjaSgpCi0gICAgICBzZWxmLl9zdG9wX2hjaSgpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdGF0ZSgpLCAwKQotCi0gICAgZGVmIHRlc3Rfc3RvcF9hbmRfc3RvcChzZWxmKToKLSAgICAgIHNlbGYuX3N0YXJ0X2hjaSgpCi0gICAgICBzZWxmLl9zdG9wX2hjaSgpCi0gICAgICBzZWxmLl9zdG9wX2hjaSgpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdGF0ZSgpLCAwKQotCi0KLSMgJSUKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGRidXMubWFpbmxvb3AuZ2xpYi5EQnVzR01haW5Mb29wKHNldF9hc19kZWZhdWx0PVRydWUpCi0gIHVzZV9mbG9zcygpCi0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL0NhcmdvLnRvbWwgYi9nZC9ydXN0L2xpbnV4L3NlcnZpY2UvQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlNjhjMC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3NlcnZpY2UvQ2FyZ28udG9tbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLVtwYWNrYWdlXQotbmFtZSA9ICJidGFkYXB0ZXJkIgotdmVyc2lvbiA9ICIwLjEuMCIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2RlcGVuZGVuY2llc10KLWJ0X3RvcHNoaW0gPSB7IHBhdGggPSAiLi4vLi4vdG9wc2hpbSIgfQotYnRfc2hpbSA9IHsgcGF0aCA9ICIuLi8uLi9zaGltIiB9Ci1idHN0YWNrID0geyBwYXRoID0gIi4uL3N0YWNrIiB9Ci1kYnVzX3Byb2plY3Rpb24gPSB7IHBhdGggPSAiLi4vZGJ1c19wcm9qZWN0aW9uIiB9Ci1kYnVzX21hY3JvcyA9IHsgcGF0aCA9ICIuLi9kYnVzX3Byb2plY3Rpb24vZGJ1c19tYWNyb3MiIH0KLQotZGJ1cyA9ICIwLjkuMiIKLWRidXMtY3Jvc3Nyb2FkcyA9ICIwLjQuMCIKLWRidXMtdG9raW8gPSAiMC43LjMiCi1mdXR1cmVzID0gIjAuMy4xMyIKLWxvZyA9ICIwLjQuMTQiCi1udW0tdHJhaXRzID0gIioiCi10b2tpbyA9IHsgdmVyc2lvbiA9ICIxIiwgZmVhdHVyZXMgPSBbJ2J5dGVzJywgJ2ZzJywgJ2lvLXV0aWwnLCAnbGliYycsICdtYWNyb3MnLCAnbWVtY2hyJywgJ21pbycsICduZXQnLCAnbnVtX2NwdXMnLCAncnQnLCAncnQtbXVsdGktdGhyZWFkJywgJ3N5bmMnLCAndGltZScsICd0b2tpby1tYWNyb3MnXSB9Ci1zeXNsb2cgPSAiNC4wIgotCi1bYnVpbGQtZGVwZW5kZW5jaWVzXQotcGtnLWNvbmZpZyA9ICIwLjMuMTkiCi0KLVtbYmluXV0KLW5hbWUgPSAiYnRhZGFwdGVyZCIKLXBhdGggPSAic3JjL21haW4ucnMiCi1idWlsZCA9ICJidWlsZC5ycyIKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvc2VydmljZS9idWlsZC5ycyBiL2dkL3J1c3QvbGludXgvc2VydmljZS9idWlsZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmNDA4My4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3NlcnZpY2UvYnVpbGQucnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi11c2UgcGtnX2NvbmZpZzo6Q29uZmlnOwotCi1mbiBtYWluKCkgewotICAgIGxldCB0YXJnZXRfZGlyID0gc3RkOjplbnY6OnZhcl9vcygiQ0FSR09fVEFSR0VUX0RJUiIpLnVud3JhcCgpOwotCi0gICAgLy8gVGhlIG1haW4gbGlua2luZyBwb2ludCB3aXRoIGMrKyBjb2RlIGlzIHRoZSBsaWJibHVldG9vdGgtc3RhdGljLmEKLSAgICAvLyBUaGVzZSBpbmNsdWRlcyBhbGwgdGhlIHN5bWJvbHMgYnVpbHQgdmlhIEMrKyBidXQgZG9lc24ndCBpbmNsdWRlIG90aGVyCi0gICAgLy8gbGlua3MgKGkuZS4gcGtnLWNvbmZpZykKLSAgICBwcmludGxuISgiY2FyZ286cnVzdGMtbGluay1saWI9c3RhdGljPWJsdWV0b290aC1zdGF0aWMiKTsKLSAgICBwcmludGxuISgiY2FyZ286cnVzdGMtbGluay1zZWFyY2g9bmF0aXZlPXt9IiwgdGFyZ2V0X2Rpci5pbnRvX3N0cmluZygpLnVud3JhcCgpKTsKLQotICAgIC8vIEEgZmV3IGR5bmFtaWMgbGlua3MKLSAgICBwcmludGxuISgiY2FyZ286cnVzdGMtbGluay1saWI9ZHlsaWI9ZmxhdGJ1ZmZlcnMiKTsKLSAgICBwcmludGxuISgiY2FyZ286cnVzdGMtbGluay1saWI9ZHlsaWI9cHJvdG9idWYiKTsKLSAgICBwcmludGxuISgiY2FyZ286cnVzdGMtbGluay1saWI9ZHlsaWI9cmVzb2x2Iik7Ci0KLSAgICAvLyBDbGFuZyByZXF1aXJlcyAtbGMrKyBpbnN0ZWFkIG9mIC1sc3RkYysrCi0gICAgcHJpbnRsbiEoImNhcmdvOnJ1c3RjLWxpbmstbGliPWMrKyIpOwotCi0gICAgLy8gQSBmZXcgbW9yZSBkZXBlbmRlbmNpZXMgZnJvbSBwa2ctY29uZmlnLiBUaGVzZSBhcmVuJ3QgaW5jbHVkZWQgYXMgcGFydCBvZgotICAgIC8vIHRoZSBsaWJibHVldG9vdGgtc3RhdGljLmEKLSAgICBDb25maWc6Om5ldygpLnByb2JlKCJsaWJjaHJvbWUiKS51bndyYXAoKTsKLSAgICBDb25maWc6Om5ldygpLnByb2JlKCJsaWJtb2RwX2I2NCIpLnVud3JhcCgpOwotICAgIENvbmZpZzo6bmV3KCkucHJvYmUoInRpbnl4bWwyIikudW53cmFwKCk7Ci0KLSAgICBwcmludGxuISgiY2FyZ286cmVydW4taWYtY2hhbmdlZD1idWlsZC5ycyIpOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL3NyYy9kYnVzX2FyZy5ycyBiL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvZGJ1c19hcmcucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzI0YWEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL3NyYy9kYnVzX2FyZy5ycworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdXNlIGRidXNfbWFjcm9zOjpnZW5lcmF0ZV9kYnVzX2FyZzsKLQotZ2VuZXJhdGVfZGJ1c19hcmchKCk7CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L3NlcnZpY2Uvc3JjL2lmYWNlX2JsdWV0b290aC5ycyBiL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvaWZhY2VfYmx1ZXRvb3RoLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU0ZTcyLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvaWZhY2VfYmx1ZXRvb3RoLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLWV4dGVybiBjcmF0ZSBidF9zaGltOwotCi11c2UgYnRfdG9wc2hpbTo6YnRpZjo6e0J0U3NwVmFyaWFudCwgQnRUcmFuc3BvcnQsIFV1aWQxMjhCaXR9OwotCi11c2UgYnRzdGFjazo6Ymx1ZXRvb3RoOjp7Ci0gICAgQmx1ZXRvb3RoRGV2aWNlLCBJQmx1ZXRvb3RoLCBJQmx1ZXRvb3RoQ2FsbGJhY2ssIElCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2ssCi19OwotdXNlIGJ0c3RhY2s6OlJQQ1Byb3h5OwotCi11c2UgZGJ1czo6YXJnOjpSZWZBcmc7Ci0KLXVzZSBkYnVzOjpub25ibG9jazo6U3luY0Nvbm5lY3Rpb247Ci11c2UgZGJ1czo6c3RyaW5nczo6UGF0aDsKLQotdXNlIGRidXNfbWFjcm9zOjp7ZGJ1c19tZXRob2QsIGRidXNfcHJvcG1hcCwgZGJ1c19wcm94eV9vYmosIGdlbmVyYXRlX2RidXNfZXhwb3J0ZXJ9OwotCi11c2UgZGJ1c19wcm9qZWN0aW9uOjppbXBsX2RidXNfYXJnX2VudW07Ci11c2UgZGJ1c19wcm9qZWN0aW9uOjpEaXNjb25uZWN0V2F0Y2hlcjsKLQotdXNlIG51bV90cmFpdHM6OmNhc3Q6OntGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZX07Ci0KLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLQotdXNlIGNyYXRlOjpkYnVzX2FyZzo6e0RCdXNBcmcsIERCdXNBcmdFcnJvciwgUmVmQXJnVG9SdXN0fTsKLQotI1tkYnVzX3Byb3BtYXAoQmx1ZXRvb3RoRGV2aWNlKV0KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoRGV2aWNlREJ1cyB7Ci0gICAgYWRkcmVzczogU3RyaW5nLAotICAgIG5hbWU6IFN0cmluZywKLX0KLQotI1thbGxvdyhkZWFkX2NvZGUpXQotc3RydWN0IEJsdWV0b290aENhbGxiYWNrREJ1cyB7fQotCi0jW2RidXNfcHJveHlfb2JqKEJsdWV0b290aENhbGxiYWNrLCAib3JnLmNocm9taXVtLmJsdWV0b290aC5CbHVldG9vdGhDYWxsYmFjayIpXQotaW1wbCBJQmx1ZXRvb3RoQ2FsbGJhY2sgZm9yIEJsdWV0b290aENhbGxiYWNrREJ1cyB7Ci0gICAgI1tkYnVzX21ldGhvZCgiT25BZGRyZXNzQ2hhbmdlZCIpXQotICAgIGZuIG9uX2FkZHJlc3NfY2hhbmdlZCgmc2VsZiwgYWRkcjogU3RyaW5nKSB7fQotICAgICNbZGJ1c19tZXRob2QoIk9uRGV2aWNlRm91bmQiKV0KLSAgICBmbiBvbl9kZXZpY2VfZm91bmQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSkge30KLSAgICAjW2RidXNfbWV0aG9kKCJPbkRpc2NvdmVyaW5nQ2hhbmdlZCIpXQotICAgIGZuIG9uX2Rpc2NvdmVyaW5nX2NoYW5nZWQoJnNlbGYsIGRpc2NvdmVyaW5nOiBib29sKSB7fQotICAgICNbZGJ1c19tZXRob2QoIk9uU3NwUmVxdWVzdCIpXQotICAgIGZuIG9uX3NzcF9yZXF1ZXN0KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgcmVtb3RlX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlLAotICAgICAgICBjb2Q6IHUzMiwKLSAgICAgICAgdmFyaWFudDogQnRTc3BWYXJpYW50LAotICAgICAgICBwYXNza2V5OiB1MzIsCi0gICAgKSB7Ci0gICAgfQotICAgICNbZGJ1c19tZXRob2QoIk9uQm9uZFN0YXRlQ2hhbmdlZCIpXQotICAgIGZuIG9uX2JvbmRfc3RhdGVfY2hhbmdlZCgmc2VsZiwgc3RhdHVzOiB1MzIsIGFkZHJlc3M6IFN0cmluZywgc3RhdGU6IHUzMikge30KLX0KLQotaW1wbF9kYnVzX2FyZ19lbnVtIShCdFRyYW5zcG9ydCk7Ci1pbXBsX2RidXNfYXJnX2VudW0hKEJ0U3NwVmFyaWFudCk7Ci0KLSNbYWxsb3coZGVhZF9jb2RlKV0KLXN0cnVjdCBCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2tEQnVzIHt9Ci0KLSNbZGJ1c19wcm94eV9vYmooQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrLCAib3JnLmNocm9taXVtLmJsdWV0b290aC5CbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2siKV0KLWltcGwgSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayBmb3IgQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrREJ1cyB7Ci0gICAgI1tkYnVzX21ldGhvZCgiT25EZXZpY2VDb25uZWN0ZWQiKV0KLSAgICBmbiBvbl9kZXZpY2VfY29ubmVjdGVkKCZzZWxmLCByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkRldmljZURpc2Nvbm5lY3RlZCIpXQotICAgIGZuIG9uX2RldmljZV9kaXNjb25uZWN0ZWQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSkge30KLX0KLQotI1thbGxvdyhkZWFkX2NvZGUpXQotc3RydWN0IElCbHVldG9vdGhEQnVzIHt9Ci0KLSNbZ2VuZXJhdGVfZGJ1c19leHBvcnRlcihleHBvcnRfYmx1ZXRvb3RoX2RidXNfb2JqLCAib3JnLmNocm9taXVtLmJsdWV0b290aC5CbHVldG9vdGgiKV0KLWltcGwgSUJsdWV0b290aCBmb3IgSUJsdWV0b290aERCdXMgewotICAgICNbZGJ1c19tZXRob2QoIlJlZ2lzdGVyQ2FsbGJhY2siKV0KLSAgICBmbiByZWdpc3Rlcl9jYWxsYmFjaygmbXV0IHNlbGYsIGNhbGxiYWNrOiBCb3g8ZHluIElCbHVldG9vdGhDYWxsYmFjayArIFNlbmQ+KSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiUmVnaXN0ZXJDb25uZWN0aW9uQ2FsbGJhY2siKV0KLSAgICBmbiByZWdpc3Rlcl9jb25uZWN0aW9uX2NhbGxiYWNrKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGNhbGxiYWNrOiBCb3g8ZHluIElCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2sgKyBTZW5kPiwKLSAgICApIC0+IHUzMiB7Ci0gICAgICAgIDAKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJVbnJlZ2lzdGVyQ29ubmVjdGlvbkNhbGxiYWNrIildCi0gICAgZm4gdW5yZWdpc3Rlcl9jb25uZWN0aW9uX2NhbGxiYWNrKCZtdXQgc2VsZiwgaWQ6IHUzMikgLT4gYm9vbCB7Ci0gICAgICAgIGZhbHNlCi0gICAgfQotCi0gICAgLy8gTm90IGV4cG9zZWQgb3ZlciBELUJ1cy4gVGhlIHN0YWNrIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHRoZSBkYWVtb24gc3RhcnRzLgotICAgIGZuIGVuYWJsZSgmbXV0IHNlbGYpIC0+IGJvb2wgewotICAgICAgICBmYWxzZQotICAgIH0KLQotICAgIC8vIE5vdCBleHBvc2VkIG92ZXIgRC1CdXMuIFRoZSBzdGFjayBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIHdoZW4gdGhlIGRhZW1vbiBleGl0cy4KLSAgICAvLyBUT0RPKGIvMTg5NDk1ODU4KTogSGFuZGxlIHNodXRkb3duIHByb3Blcmx5IHdoZW4gU0lHVEVSTSBpcyByZWNlaXZlZC4KLSAgICBmbiBkaXNhYmxlKCZtdXQgc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIGZhbHNlCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiR2V0QWRkcmVzcyIpXQotICAgIGZuIGdldF9hZGRyZXNzKCZzZWxmKSAtPiBTdHJpbmcgewotICAgICAgICBTdHJpbmc6OmZyb20oIiIpCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiR2V0VXVpZHMiKV0KLSAgICBmbiBnZXRfdXVpZHMoJnNlbGYpIC0+IFZlYzxVdWlkMTI4Qml0PiB7Ci0gICAgICAgIHZlYyFbXQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkdldE5hbWUiKV0KLSAgICBmbiBnZXRfbmFtZSgmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgU3RyaW5nOjpuZXcoKQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIlNldE5hbWUiKV0KLSAgICBmbiBzZXRfbmFtZSgmc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIlN0YXJ0RGlzY292ZXJ5IildCi0gICAgZm4gc3RhcnRfZGlzY292ZXJ5KCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkNhbmNlbERpc2NvdmVyeSIpXQotICAgIGZuIGNhbmNlbF9kaXNjb3ZlcnkoJnNlbGYpIC0+IGJvb2wgewotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiSXNEaXNjb3ZlcmluZyIpXQotICAgIGZuIGlzX2Rpc2NvdmVyaW5nKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkdldERpc2NvdmVyeUVuZE1pbGxpcyIpXQotICAgIGZuIGdldF9kaXNjb3ZlcnlfZW5kX21pbGxpcygmc2VsZikgLT4gdTY0IHsKLSAgICAgICAgMAotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkNyZWF0ZUJvbmQiKV0KLSAgICBmbiBjcmVhdGVfYm9uZCgmc2VsZiwgX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlLCBfdHJhbnNwb3J0OiBCdFRyYW5zcG9ydCkgLT4gYm9vbCB7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJDYW5jZWxCb25kUHJvY2VzcyIpXQotICAgIGZuIGNhbmNlbF9ib25kX3Byb2Nlc3MoJnNlbGYsIF9kZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbCB7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJSZW1vdmVCb25kIildCi0gICAgZm4gcmVtb3ZlX2JvbmQoJnNlbGYsIF9kZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbCB7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJHZXRCb25kZWREZXZpY2VzIildCi0gICAgZm4gZ2V0X2JvbmRlZF9kZXZpY2VzKCZzZWxmKSAtPiBWZWM8Qmx1ZXRvb3RoRGV2aWNlPiB7Ci0gICAgICAgIHZlYyFbXQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkdldEJvbmRTdGF0ZSIpXQotICAgIGZuIGdldF9ib25kX3N0YXRlKCZzZWxmLCBfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IHUzMiB7Ci0gICAgICAgIDAKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJTZXRQaW4iKV0KLSAgICBmbiBzZXRfcGluKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlLAotICAgICAgICBfYWNjZXB0OiBib29sLAotICAgICAgICBfbGVuOiB1MzIsCi0gICAgICAgIF9waW5fY29kZTogVmVjPHU4PiwKLSAgICApIC0+IGJvb2wgewotICAgICAgICBmYWxzZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIlNldFBhc3NrZXkiKV0KLSAgICBmbiBzZXRfcGFzc2tleSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIF9kZXZpY2U6IEJsdWV0b290aERldmljZSwKLSAgICAgICAgX2FjY2VwdDogYm9vbCwKLSAgICAgICAgX2xlbjogdTMyLAotICAgICAgICBfcGFzc2tleTogVmVjPHU4PiwKLSAgICApIC0+IGJvb2wgewotICAgICAgICBmYWxzZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIlNldFBhaXJpbmdDb25maXJtYXRpb24iKV0KLSAgICBmbiBzZXRfcGFpcmluZ19jb25maXJtYXRpb24oJnNlbGYsIF9kZXZpY2U6IEJsdWV0b290aERldmljZSwgX2FjY2VwdDogYm9vbCkgLT4gYm9vbCB7Ci0gICAgICAgIGZhbHNlCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiR2V0Q29ubmVjdGlvblN0YXRlIildCi0gICAgZm4gZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoJnNlbGYsIF9kZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gdTMyIHsKLSAgICAgICAgMAotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkdldFJlbW90ZVV1aWRzIildCi0gICAgZm4gZ2V0X3JlbW90ZV91dWlkcygmc2VsZiwgX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBWZWM8VXVpZDEyOEJpdD4gewotICAgICAgICB2ZWMhW10KLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJGZXRjaFJlbW90ZVV1aWRzIildCi0gICAgZm4gZmV0Y2hfcmVtb3RlX3V1aWRzKCZzZWxmLCBfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IGJvb2wgewotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiU2RwU2VhcmNoIildCi0gICAgZm4gc2RwX3NlYXJjaCgmc2VsZiwgX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlLCBfdXVpZDogVXVpZDEyOEJpdCkgLT4gYm9vbCB7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJDb25uZWN0QWxsRW5hYmxlZFByb2ZpbGVzIildCi0gICAgZm4gY29ubmVjdF9hbGxfZW5hYmxlZF9wcm9maWxlcygmc2VsZiwgX2RldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkRpc2Nvbm5lY3RBbGxFbmFibGVkUHJvZmlsZXMiKV0KLSAgICBmbiBkaXNjb25uZWN0X2FsbF9lbmFibGVkX3Byb2ZpbGVzKCZzZWxmLCBfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IGJvb2wgewotICAgICAgICB0cnVlCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL3NyYy9pZmFjZV9ibHVldG9vdGhfZ2F0dC5ycyBiL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvaWZhY2VfYmx1ZXRvb3RoX2dhdHQucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDZjYzMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL3NyYy9pZmFjZV9ibHVldG9vdGhfZ2F0dC5ycworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi11c2UgYnRfdG9wc2hpbTo6e2J0aWY6OlV1aWQxMjhCaXQsIHByb2ZpbGVzOjpnYXR0OjpHYXR0U3RhdHVzfTsKLQotdXNlIGJ0c3RhY2s6OmJsdWV0b290aF9nYXR0Ojp7Ci0gICAgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljLCBCbHVldG9vdGhHYXR0RGVzY3JpcHRvciwgQmx1ZXRvb3RoR2F0dFNlcnZpY2UsCi0gICAgR2F0dFdyaXRlUmVxdWVzdFN0YXR1cywgR2F0dFdyaXRlVHlwZSwgSUJsdWV0b290aEdhdHQsIElCbHVldG9vdGhHYXR0Q2FsbGJhY2ssCi0gICAgSVNjYW5uZXJDYWxsYmFjaywgTGVQaHksIFJTU0lTZXR0aW5ncywgU2NhbkZpbHRlciwgU2NhblNldHRpbmdzLCBTY2FuVHlwZSwKLX07Ci11c2UgYnRzdGFjazo6UlBDUHJveHk7Ci0KLXVzZSBkYnVzOjphcmc6OlJlZkFyZzsKLQotdXNlIGRidXM6Om5vbmJsb2NrOjpTeW5jQ29ubmVjdGlvbjsKLXVzZSBkYnVzOjpzdHJpbmdzOjpQYXRoOwotCi11c2UgZGJ1c19tYWNyb3M6OntkYnVzX21ldGhvZCwgZGJ1c19wcm9wbWFwLCBkYnVzX3Byb3h5X29iaiwgZ2VuZXJhdGVfZGJ1c19leHBvcnRlcn07Ci0KLXVzZSBkYnVzX3Byb2plY3Rpb246OmltcGxfZGJ1c19hcmdfZW51bTsKLXVzZSBkYnVzX3Byb2plY3Rpb246OkRpc2Nvbm5lY3RXYXRjaGVyOwotCi11c2UgbnVtX3RyYWl0czo6Y2FzdDo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKLQotdXNlIHN0ZDo6Y29udmVydDo6VHJ5SW50bzsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLQotdXNlIGNyYXRlOjpkYnVzX2FyZzo6e0RCdXNBcmcsIERCdXNBcmdFcnJvciwgUmVmQXJnVG9SdXN0fTsKLQotI1thbGxvdyhkZWFkX2NvZGUpXQotc3RydWN0IEJsdWV0b290aEdhdHRDYWxsYmFja0RCdXMge30KLQotI1tkYnVzX3Byb3h5X29iaihCbHVldG9vdGhHYXR0Q2FsbGJhY2ssICJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRDYWxsYmFjayIpXQotaW1wbCBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrIGZvciBCbHVldG9vdGhHYXR0Q2FsbGJhY2tEQnVzIHsKLSAgICAjW2RidXNfbWV0aG9kKCJPbkNsaWVudFJlZ2lzdGVyZWQiKV0KLSAgICBmbiBvbl9jbGllbnRfcmVnaXN0ZXJlZCgmc2VsZiwgX3N0YXR1czogaTMyLCBfc2Nhbm5lcl9pZDogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25DbGllbnRDb25uZWN0aW9uU3RhdGUiKV0KLSAgICBmbiBvbl9jbGllbnRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIHN0YXR1czogaTMyLAotICAgICAgICBjbGllbnRfaWQ6IGkzMiwKLSAgICAgICAgY29ubmVjdGVkOiBib29sLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgKSB7Ci0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25QaHlVcGRhdGUiKV0KLSAgICBmbiBvbl9waHlfdXBkYXRlKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHR4X3BoeTogTGVQaHksIHJ4X3BoeTogTGVQaHksIHN0YXR1czogR2F0dFN0YXR1cykge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uUGh5UmVhZCIpXQotICAgIGZuIG9uX3BoeV9yZWFkKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHR4X3BoeTogTGVQaHksIHJ4X3BoeTogTGVQaHksIHN0YXR1czogR2F0dFN0YXR1cykge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uU2VhcmNoQ29tcGxldGUiKV0KLSAgICBmbiBvbl9zZWFyY2hfY29tcGxldGUoJnNlbGYsIGFkZHI6IFN0cmluZywgc2VydmljZXM6IFZlYzxCbHVldG9vdGhHYXR0U2VydmljZT4sIHN0YXR1czogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25DaGFyYWN0ZXJpc3RpY1JlYWQiKV0KLSAgICBmbiBvbl9jaGFyYWN0ZXJpc3RpY19yZWFkKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHN0YXR1czogaTMyLCBoYW5kbGU6IGkzMiwgdmFsdWU6IFZlYzx1OD4pIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkNoYXJhY3RlcmlzdGljV3JpdGUiKV0KLSAgICBmbiBvbl9jaGFyYWN0ZXJpc3RpY193cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMiwgaGFuZGxlOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkV4ZWN1dGVXcml0ZSIpXQotICAgIGZuIG9uX2V4ZWN1dGVfd3JpdGUoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkRlc2NyaXB0b3JSZWFkIildCi0gICAgZm4gb25fZGVzY3JpcHRvcl9yZWFkKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHN0YXR1czogaTMyLCBoYW5kbGU6IGkzMiwgdmFsdWU6IFZlYzx1OD4pIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkRlc2NyaXB0b3JXcml0ZSIpXQotICAgIGZuIG9uX2Rlc2NyaXB0b3Jfd3JpdGUoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIsIGhhbmRsZTogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25Ob3RpZnkiKV0KLSAgICBmbiBvbl9ub3RpZnkoJnNlbGYsIGFkZHI6IFN0cmluZywgaGFuZGxlOiBpMzIsIHZhbHVlOiBWZWM8dTg+KSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25SZWFkUmVtb3RlUnNzaSIpXQotICAgIGZuIG9uX3JlYWRfcmVtb3RlX3Jzc2koJnNlbGYsIGFkZHI6IFN0cmluZywgcnNzaTogaTMyLCBzdGF0dXM6IGkzMikge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uQ29uZmlndXJlTXR1IildCi0gICAgZm4gb25fY29uZmlndXJlX210dSgmc2VsZiwgYWRkcjogU3RyaW5nLCBtdHU6IGkzMiwgc3RhdHVzOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkNvbm5lY3Rpb25VcGRhdGVkIildCi0gICAgZm4gb25fY29ubmVjdGlvbl91cGRhdGVkKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICAgICBpbnRlcnZhbDogaTMyLAotICAgICAgICBsYXRlbmN5OiBpMzIsCi0gICAgICAgIHRpbWVvdXQ6IGkzMiwKLSAgICAgICAgc3RhdHVzOiBpMzIsCi0gICAgKSB7Ci0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25TZXJ2aWNlQ2hhbmdlZCIpXQotICAgIGZuIG9uX3NlcnZpY2VfY2hhbmdlZCgmc2VsZiwgYWRkcjogU3RyaW5nKSB7fQotfQotCi0vLyBSZXByZXNlbnRzIFV1aWQxMjhCaXQgYXMgYW4gYXJyYXkgaW4gRC1CdXMuCi1pbXBsIERCdXNBcmcgZm9yIFV1aWQxMjhCaXQgewotICAgIHR5cGUgREJ1c1R5cGUgPSBWZWM8dTg+OwotCi0gICAgZm4gZnJvbV9kYnVzKAotICAgICAgICBkYXRhOiBWZWM8dTg+LAotICAgICAgICBfY29ubjogT3B0aW9uPEFyYzxTeW5jQ29ubmVjdGlvbj4+LAotICAgICAgICBfcmVtb3RlOiBPcHRpb248ZGJ1czo6c3RyaW5nczo6QnVzTmFtZTwnc3RhdGljPj4sCi0gICAgICAgIF9kaXNjb25uZWN0X3dhdGNoZXI6IE9wdGlvbjxBcmM8c3RkOjpzeW5jOjpNdXRleDxEaXNjb25uZWN0V2F0Y2hlcj4+PiwKLSAgICApIC0+IFJlc3VsdDxbdTg7IDE2XSwgQm94PGR5biBzdGQ6OmVycm9yOjpFcnJvcj4+IHsKLSAgICAgICAgcmV0dXJuIE9rKGRhdGEudHJ5X2ludG8oKS51bndyYXAoKSk7Ci0gICAgfQotCi0gICAgZm4gdG9fZGJ1cyhkYXRhOiBbdTg7IDE2XSkgLT4gUmVzdWx0PFZlYzx1OD4sIEJveDxkeW4gc3RkOjplcnJvcjo6RXJyb3I+PiB7Ci0gICAgICAgIHJldHVybiBPayhkYXRhLnRvX3ZlYygpKTsKLSAgICB9Ci19Ci0KLSNbYWxsb3coZGVhZF9jb2RlKV0KLXN0cnVjdCBTY2FubmVyQ2FsbGJhY2tEQnVzIHt9Ci0KLSNbZGJ1c19wcm94eV9vYmooU2Nhbm5lckNhbGxiYWNrLCAib3JnLmNocm9taXVtLmJsdWV0b290aC5TY2FubmVyQ2FsbGJhY2siKV0KLWltcGwgSVNjYW5uZXJDYWxsYmFjayBmb3IgU2Nhbm5lckNhbGxiYWNrREJ1cyB7Ci0gICAgI1tkYnVzX21ldGhvZCgiT25TY2FubmVyUmVnaXN0ZXJlZCIpXQotICAgIGZuIG9uX3NjYW5uZXJfcmVnaXN0ZXJlZCgmc2VsZiwgX3N0YXR1czogaTMyLCBfc2Nhbm5lcl9pZDogaTMyKSB7fQotfQotCi0jW2RidXNfcHJvcG1hcChCbHVldG9vdGhHYXR0RGVzY3JpcHRvcildCi1wdWIgc3RydWN0IEJsdWV0b290aEdhdHREZXNjcmlwdG9yREJ1cyB7Ci0gICAgdXVpZDogVXVpZDEyOEJpdCwKLSAgICBpbnN0YW5jZV9pZDogaTMyLAotICAgIHBlcm1pc3Npb25zOiBpMzIsCi19Ci0KLSNbZGJ1c19wcm9wbWFwKEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyldCi1wdWIgc3RydWN0IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpY0RCdXMgewotICAgIHV1aWQ6IFV1aWQxMjhCaXQsCi0gICAgaW5zdGFuY2VfaWQ6IGkzMiwKLSAgICBwcm9wZXJ0aWVzOiBpMzIsCi0gICAgcGVybWlzc2lvbnM6IGkzMiwKLSAgICBrZXlfc2l6ZTogaTMyLAotICAgIHdyaXRlX3R5cGU6IEdhdHRXcml0ZVR5cGUsCi0gICAgZGVzY3JpcHRvcnM6IFZlYzxCbHVldG9vdGhHYXR0RGVzY3JpcHRvcj4sCi19Ci0KLSNbZGJ1c19wcm9wbWFwKEJsdWV0b290aEdhdHRTZXJ2aWNlKV0KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoR2F0dFNlcnZpY2VEQnVzIHsKLSAgICB1dWlkOiBVdWlkMTI4Qml0LAotICAgIGluc3RhbmNlX2lkOiBpMzIsCi0gICAgc2VydmljZV90eXBlOiBpMzIsCi0gICAgY2hhcmFjdGVyaXN0aWNzOiBWZWM8Qmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljPiwKLSAgICBpbmNsdWRlZF9zZXJ2aWNlczogVmVjPEJsdWV0b290aEdhdHRTZXJ2aWNlPiwKLX0KLQotI1tkYnVzX3Byb3BtYXAoUlNTSVNldHRpbmdzKV0KLXB1YiBzdHJ1Y3QgUlNTSVNldHRpbmdzREJ1cyB7Ci0gICAgbG93X3RocmVzaG9sZDogaTMyLAotICAgIGhpZ2hfdGhyZXNob2xkOiBpMzIsCi19Ci0KLSNbZGJ1c19wcm9wbWFwKFNjYW5TZXR0aW5ncyldCi1zdHJ1Y3QgU2NhblNldHRpbmdzREJ1cyB7Ci0gICAgaW50ZXJ2YWw6IGkzMiwKLSAgICB3aW5kb3c6IGkzMiwKLSAgICBzY2FuX3R5cGU6IFNjYW5UeXBlLAotICAgIHJzc2lfc2V0dGluZ3M6IFJTU0lTZXR0aW5ncywKLX0KLQotaW1wbF9kYnVzX2FyZ19lbnVtIShHYXR0U3RhdHVzKTsKLWltcGxfZGJ1c19hcmdfZW51bSEoR2F0dFdyaXRlUmVxdWVzdFN0YXR1cyk7Ci1pbXBsX2RidXNfYXJnX2VudW0hKEdhdHRXcml0ZVR5cGUpOwotaW1wbF9kYnVzX2FyZ19lbnVtIShMZVBoeSk7Ci1pbXBsX2RidXNfYXJnX2VudW0hKFNjYW5UeXBlKTsKLQotI1tkYnVzX3Byb3BtYXAoU2NhbkZpbHRlcildCi1zdHJ1Y3QgU2NhbkZpbHRlckRCdXMge30KLQotI1thbGxvdyhkZWFkX2NvZGUpXQotc3RydWN0IElCbHVldG9vdGhHYXR0REJ1cyB7fQotCi0jW2dlbmVyYXRlX2RidXNfZXhwb3J0ZXIoZXhwb3J0X2JsdWV0b290aF9nYXR0X2RidXNfb2JqLCAib3JnLmNocm9taXVtLmJsdWV0b290aC5CbHVldG9vdGhHYXR0IildCi1pbXBsIElCbHVldG9vdGhHYXR0IGZvciBJQmx1ZXRvb3RoR2F0dERCdXMgewotICAgICNbZGJ1c19tZXRob2QoIlJlZ2lzdGVyU2Nhbm5lciIpXQotICAgIGZuIHJlZ2lzdGVyX3NjYW5uZXIoJnNlbGYsIGNhbGxiYWNrOiBCb3g8ZHluIElTY2FubmVyQ2FsbGJhY2sgKyBTZW5kPikge30KLQotICAgICNbZGJ1c19tZXRob2QoIlVucmVnaXN0ZXJTY2FubmVyIildCi0gICAgZm4gdW5yZWdpc3Rlcl9zY2FubmVyKCZzZWxmLCBzY2FubmVyX2lkOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJTdGFydFNjYW4iKV0KLSAgICBmbiBzdGFydF9zY2FuKCZzZWxmLCBzY2FubmVyX2lkOiBpMzIsIHNldHRpbmdzOiBTY2FuU2V0dGluZ3MsIGZpbHRlcnM6IFZlYzxTY2FuRmlsdGVyPikge30KLQotICAgICNbZGJ1c19tZXRob2QoIlN0b3BTY2FuIildCi0gICAgZm4gc3RvcF9zY2FuKCZzZWxmLCBzY2FubmVyX2lkOiBpMzIpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJSZWdpc3RlckNsaWVudCIpXQotICAgIGZuIHJlZ2lzdGVyX2NsaWVudCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBhcHBfdXVpZDogU3RyaW5nLAotICAgICAgICBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrICsgU2VuZD4sCi0gICAgICAgIGVhdHRfc3VwcG9ydDogYm9vbCwKLSAgICApIHsKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJVbnJlZ2lzdGVyQ2xpZW50IildCi0gICAgZm4gdW5yZWdpc3Rlcl9jbGllbnQoJm11dCBzZWxmLCBjbGllbnRfaWQ6IGkzMikge30KLQotICAgICNbZGJ1c19tZXRob2QoIkNsaWVudENvbm5lY3QiKV0KLSAgICBmbiBjbGllbnRfY29ubmVjdCgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGlzX2RpcmVjdDogYm9vbCwKLSAgICAgICAgdHJhbnNwb3J0OiBpMzIsCi0gICAgICAgIG9wcG9ydHVuaXN0aWM6IGJvb2wsCi0gICAgICAgIHBoeTogaTMyLAotICAgICkgewotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkNsaWVudERpc2Nvbm5lY3QiKV0KLSAgICBmbiBjbGllbnRfZGlzY29ubmVjdCgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykge30KLQotICAgICNbZGJ1c19tZXRob2QoIkNsaWVudFNldFByZWZlcnJlZFBoeSIpXQotICAgIGZuIGNsaWVudF9zZXRfcHJlZmVycmVkX3BoeSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIHR4X3BoeTogTGVQaHksCi0gICAgICAgIHJ4X3BoeTogTGVQaHksCi0gICAgICAgIHBoeV9vcHRpb25zOiBpMzIsCi0gICAgKSB7Ci0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiQ2xpZW50UmVhZFBoeSIpXQotICAgIGZuIGNsaWVudF9yZWFkX3BoeSgmbXV0IHNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJSZWZyZXNoRGV2aWNlIildCi0gICAgZm4gcmVmcmVzaF9kZXZpY2UoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJEaXNjb3ZlclNlcnZpY2VzIildCi0gICAgZm4gZGlzY292ZXJfc2VydmljZXMoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJEaXNjb3ZlclNlcnZpY2VCeVV1aWQiKV0KLSAgICBmbiBkaXNjb3Zlcl9zZXJ2aWNlX2J5X3V1aWQoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIHV1aWQ6IFN0cmluZykge30KLQotICAgICNbZGJ1c19tZXRob2QoIlJlYWRDaGFyYWN0ZXJpc3RpYyIpXQotICAgIGZuIHJlYWRfY2hhcmFjdGVyaXN0aWMoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBhdXRoX3JlcTogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiUmVhZFVzaW5nQ2hhcmFjdGVyaXN0aWNVdWlkIildCi0gICAgZm4gcmVhZF91c2luZ19jaGFyYWN0ZXJpc3RpY191dWlkKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgdXVpZDogU3RyaW5nLAotICAgICAgICBzdGFydF9oYW5kbGU6IGkzMiwKLSAgICAgICAgZW5kX2hhbmRsZTogaTMyLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICkgewotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIldyaXRlQ2hhcmFjdGVyaXN0aWMiKV0KLSAgICBmbiB3cml0ZV9jaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGhhbmRsZTogaTMyLAotICAgICAgICB3cml0ZV90eXBlOiBHYXR0V3JpdGVUeXBlLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICAgICB2YWx1ZTogVmVjPHU4PiwKLSAgICApIC0+IEdhdHRXcml0ZVJlcXVlc3RTdGF0dXMgewotICAgICAgICBHYXR0V3JpdGVSZXF1ZXN0U3RhdHVzOjpTdWNjZXNzCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiUmVhZERlc2NyaXB0b3IiKV0KLSAgICBmbiByZWFkX2Rlc2NyaXB0b3IoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBhdXRoX3JlcTogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiV3JpdGVEZXNjcmlwdG9yIildCi0gICAgZm4gd3JpdGVfZGVzY3JpcHRvcigKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGhhbmRsZTogaTMyLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICAgICB2YWx1ZTogVmVjPHU4PiwKLSAgICApIHsKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJSZWdpc3RlckZvck5vdGlmaWNhdGlvbiIpXQotICAgIGZuIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24oJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBlbmFibGU6IGJvb2wpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJCZWdpblJlbGlhYmxlV3JpdGUiKV0KLSAgICBmbiBiZWdpbl9yZWxpYWJsZV93cml0ZSgmbXV0IHNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJFbmRSZWxpYWJsZVdyaXRlIildCi0gICAgZm4gZW5kX3JlbGlhYmxlX3dyaXRlKCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgZXhlY3V0ZTogYm9vbCkge30KLQotICAgICNbZGJ1c19tZXRob2QoIlJlYWRSZW1vdGVSc3NpIildCi0gICAgZm4gcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykge30KLQotICAgICNbZGJ1c19tZXRob2QoIkNvbmZpZ3VyZU10dSIpXQotICAgIGZuIGNvbmZpZ3VyZV9tdHUoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIG10dTogaTMyKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSIpXQotICAgIGZuIGNvbm5lY3Rpb25fcGFyYW1ldGVyX3VwZGF0ZSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIG1pbl9pbnRlcnZhbDogaTMyLAotICAgICAgICBtYXhfaW50ZXJ2YWw6IGkzMiwKLSAgICAgICAgbGF0ZW5jeTogaTMyLAotICAgICAgICB0aW1lb3V0OiBpMzIsCi0gICAgICAgIG1pbl9jZV9sZW46IHUxNiwKLSAgICAgICAgbWF4X2NlX2xlbjogdTE2LAotICAgICkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvaWZhY2VfYmx1ZXRvb3RoX21lZGlhLnJzIGIvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL3NyYy9pZmFjZV9ibHVldG9vdGhfbWVkaWEucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDY0OTEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zZXJ2aWNlL3NyYy9pZmFjZV9ibHVldG9vdGhfbWVkaWEucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotdXNlIGJ0X3RvcHNoaW06OnByb2ZpbGVzOjphMmRwOjpQcmVzZW50YXRpb25Qb3NpdGlvbjsKLXVzZSBidHN0YWNrOjpibHVldG9vdGhfbWVkaWE6OntJQmx1ZXRvb3RoTWVkaWEsIElCbHVldG9vdGhNZWRpYUNhbGxiYWNrfTsKLXVzZSBidHN0YWNrOjpSUENQcm94eTsKLQotdXNlIGRidXM6OmFyZzo6UmVmQXJnOwotdXNlIGRidXM6OnN0cmluZ3M6OlBhdGg7Ci0KLXVzZSBkYnVzX21hY3Jvczo6e2RidXNfbWV0aG9kLCBkYnVzX3Byb3BtYXAsIGRidXNfcHJveHlfb2JqLCBnZW5lcmF0ZV9kYnVzX2V4cG9ydGVyfTsKLQotdXNlIGRidXNfcHJvamVjdGlvbjo6RGlzY29ubmVjdFdhdGNoZXI7Ci0KLXVzZSBjcmF0ZTo6ZGJ1c19hcmc6OntEQnVzQXJnLCBEQnVzQXJnRXJyb3IsIFJlZkFyZ1RvUnVzdH07Ci0KLSNbYWxsb3coZGVhZF9jb2RlKV0KLXN0cnVjdCBCbHVldG9vdGhNZWRpYUNhbGxiYWNrREJ1cyB7fQotCi0jW2RidXNfcHJveHlfb2JqKEJsdWV0b290aE1lZGlhQ2FsbGJhY2ssICJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLkJsdWV0b290aE1lZGlhQ2FsbGJhY2siKV0KLWltcGwgSUJsdWV0b290aE1lZGlhQ2FsbGJhY2sgZm9yIEJsdWV0b290aE1lZGlhQ2FsbGJhY2tEQnVzIHsKLSAgICAjW2RidXNfbWV0aG9kKCJPbkJsdWV0b290aEF1ZGlvRGV2aWNlQWRkZWQiKV0KLSAgICBmbiBvbl9ibHVldG9vdGhfYXVkaW9fZGV2aWNlX2FkZGVkKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICAgICBzYW1wbGVfcmF0ZTogaTMyLAotICAgICAgICBiaXRzX3Blcl9zYW1wbGU6IGkzMiwKLSAgICAgICAgY2hhbm5lbF9tb2RlOiBpMzIsCi0gICAgKSB7Ci0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiT25CbHVldG9vdGhBdWRpb0RldmljZVJlbW92ZWQiKV0KLSAgICBmbiBvbl9ibHVldG9vdGhfYXVkaW9fZGV2aWNlX3JlbW92ZWQoJnNlbGYsIGFkZHI6IFN0cmluZykge30KLQotICAgICNbZGJ1c19tZXRob2QoIk9uQWJzb2x1dGVWb2x1bWVTdXBwb3J0ZWRDaGFuZ2VkIildCi0gICAgZm4gb25fYWJzb2x1dGVfdm9sdW1lX3N1cHBvcnRlZF9jaGFuZ2VkKCZzZWxmLCBzdXBwb3J0ZWQ6IGJvb2wpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJPbkFic29sdXRlVm9sdW1lQ2hhbmdlZCIpXQotICAgIGZuIG9uX2Fic29sdXRlX3ZvbHVtZV9jaGFuZ2VkKCZzZWxmLCB2b2x1bWU6IGkzMikge30KLX0KLQotI1thbGxvdyhkZWFkX2NvZGUpXQotc3RydWN0IElCbHVldG9vdGhNZWRpYURCdXMge30KLQotI1tkYnVzX3Byb3BtYXAoUHJlc2VudGF0aW9uUG9zaXRpb24pXQotcHViIHN0cnVjdCBQcmVzZW50YXRpb25Qb3NpdGlvbkRCdXMgewotICAgIHJlbW90ZV9kZWxheV9yZXBvcnRfbnM6IHU2NCwKLSAgICB0b3RhbF9ieXRlc19yZWFkOiB1NjQsCi0gICAgZGF0YV9wb3NpdGlvbl9zZWM6IGk2NCwKLSAgICBkYXRhX3Bvc2l0aW9uX25zZWM6IGkzMiwKLX0KLQotI1tnZW5lcmF0ZV9kYnVzX2V4cG9ydGVyKGV4cG9ydF9ibHVldG9vdGhfbWVkaWFfZGJ1c19vYmosICJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoLkJsdWV0b290aE1lZGlhIildCi1pbXBsIElCbHVldG9vdGhNZWRpYSBmb3IgSUJsdWV0b290aE1lZGlhREJ1cyB7Ci0gICAgI1tkYnVzX21ldGhvZCgiUmVnaXN0ZXJDYWxsYmFjayIpXQotICAgIGZuIHJlZ2lzdGVyX2NhbGxiYWNrKCZtdXQgc2VsZiwgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aE1lZGlhQ2FsbGJhY2sgKyBTZW5kPikgLT4gYm9vbCB7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJJbml0aWFsaXplIildCi0gICAgZm4gaW5pdGlhbGl6ZSgmbXV0IHNlbGYpIC0+IGJvb2wgewotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgI1tkYnVzX21ldGhvZCgiQ2xlYW51cCIpXQotICAgIGZuIGNsZWFudXAoJm11dCBzZWxmKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIkNvbm5lY3QiKV0KLSAgICBmbiBjb25uZWN0KCZtdXQgc2VsZiwgZGV2aWNlOiBTdHJpbmcpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJTZXRBY3RpdmVEZXZpY2UiKV0KLSAgICBmbiBzZXRfYWN0aXZlX2RldmljZSgmbXV0IHNlbGYsIGRldmljZTogU3RyaW5nKSB7fQotCi0gICAgI1tkYnVzX21ldGhvZCgiRGlzY29ubmVjdCIpXQotICAgIGZuIGRpc2Nvbm5lY3QoJm11dCBzZWxmLCBkZXZpY2U6IFN0cmluZykge30KLQotICAgICNbZGJ1c19tZXRob2QoIlNldEF1ZGlvQ29uZmlnIildCi0gICAgZm4gc2V0X2F1ZGlvX2NvbmZpZygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBzYW1wbGVfcmF0ZTogaTMyLAotICAgICAgICBiaXRzX3Blcl9zYW1wbGU6IGkzMiwKLSAgICAgICAgY2hhbm5lbF9tb2RlOiBpMzIsCi0gICAgKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgICNbZGJ1c19tZXRob2QoIlNldFZvbHVtZSIpXQotICAgIGZuIHNldF92b2x1bWUoJm11dCBzZWxmLCB2b2x1bWU6IGkzMikge30KLQotICAgICNbZGJ1c19tZXRob2QoIlN0YXJ0QXVkaW9SZXF1ZXN0IildCi0gICAgZm4gc3RhcnRfYXVkaW9fcmVxdWVzdCgmbXV0IHNlbGYpIHt9Ci0KLSAgICAjW2RidXNfbWV0aG9kKCJTdG9wQXVkaW9SZXF1ZXN0IildCi0gICAgZm4gc3RvcF9hdWRpb19yZXF1ZXN0KCZtdXQgc2VsZikge30KLQotICAgICNbZGJ1c19tZXRob2QoIkdldFByZXNlbnRhdGlvblBvc2l0aW9uIildCi0gICAgZm4gZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigmbXV0IHNlbGYpIC0+IFByZXNlbnRhdGlvblBvc2l0aW9uIHsKLSAgICAgICAgUHJlc2VudGF0aW9uUG9zaXRpb24gewotICAgICAgICAgICAgcmVtb3RlX2RlbGF5X3JlcG9ydF9uczogMCwKLSAgICAgICAgICAgIHRvdGFsX2J5dGVzX3JlYWQ6IDAsCi0gICAgICAgICAgICBkYXRhX3Bvc2l0aW9uX3NlYzogMCwKLSAgICAgICAgICAgIGRhdGFfcG9zaXRpb25fbnNlYzogMCwKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvbWFpbi5ycyBiL2dkL3J1c3QvbGludXgvc2VydmljZS9zcmMvbWFpbi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiODg5Ni4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3NlcnZpY2Uvc3JjL21haW4ucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotdXNlIGRidXM6OntjaGFubmVsOjpNYXRjaGluZ1JlY2VpdmVyLCBtZXNzYWdlOjpNYXRjaFJ1bGV9OwotdXNlIGRidXNfY3Jvc3Nyb2Fkczo6Q3Jvc3Nyb2FkczsKLXVzZSBkYnVzX3Rva2lvOjpjb25uZWN0aW9uOwotdXNlIGZ1dHVyZXM6OmZ1dHVyZTsKLXVzZSBsb2c6OkxldmVsRmlsdGVyOwotdXNlIHN0ZDo6ZXJyb3I6OkVycm9yOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHN5c2xvZzo6e0Jhc2ljTG9nZ2VyLCBGYWNpbGl0eSwgRm9ybWF0dGVyMzE2NH07Ci0KLXVzZSBidF90b3BzaGltOjp7YnRpZjo6Z2V0X2J0aW50ZXJmYWNlLCB0b3BzdGFja307Ci11c2UgYnRzdGFjazo6ewotICAgIGJsdWV0b290aDo6e2dldF9idF9kaXNwYXRjaGVyLCBCbHVldG9vdGgsIElCbHVldG9vdGh9LAotICAgIGJsdWV0b290aF9nYXR0OjpCbHVldG9vdGhHYXR0LAotICAgIGJsdWV0b290aF9tZWRpYTo6Qmx1ZXRvb3RoTWVkaWEsCi0gICAgU3RhY2ssCi19OwotdXNlIGRidXNfcHJvamVjdGlvbjo6RGlzY29ubmVjdFdhdGNoZXI7Ci0KLW1vZCBkYnVzX2FyZzsKLW1vZCBpZmFjZV9ibHVldG9vdGg7Ci1tb2QgaWZhY2VfYmx1ZXRvb3RoX2dhdHQ7Ci1tb2QgaWZhY2VfYmx1ZXRvb3RoX21lZGlhOwotCi1jb25zdCBEQlVTX1NFUlZJQ0VfTkFNRTogJnN0ciA9ICJvcmcuY2hyb21pdW0uYmx1ZXRvb3RoIjsKLQotLy8vIENoZWNrIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRhcmdldCBoY2kgYWRhcHRlciAoLS1oY2k9TikuIElmIG5vIGFkYXB0ZXIKLS8vLyBpcyBzZXQsIGRlZmF1bHQgdG8gMC4KLWZuIGdldF9hZGFwdGVyX2luZGV4KGFyZ3M6ICZWZWM8U3RyaW5nPikgLT4gaTMyIHsKLSAgICBmb3IgYXJnIGluIGFyZ3MgewotICAgICAgICBpZiBhcmcuc3RhcnRzX3dpdGgoIi0taGNpPSIpIHsKLSAgICAgICAgICAgIGxldCBudW0gPSAoJmFyZ1s2Li5dKS5wYXJzZTo6PGkzMj4oKTsKLSAgICAgICAgICAgIGlmIG51bS5pc19vaygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVtLnVud3JhcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgMAotfQotCi1mbiBtYWtlX29iamVjdF9uYW1lKGlkeDogaTMyLCBuYW1lOiAmc3RyKSAtPiBTdHJpbmcgewotICAgIFN0cmluZzo6ZnJvbShmb3JtYXQhKCIvb3JnL2Nocm9taXVtL2JsdWV0b290aC9oY2l7fS97fSIsIGlkeCwgbmFtZSkpCi19Ci0KLS8vLyBSdW5zIHRoZSBCbHVldG9vdGggZGFlbW9uIHNlcnZpbmcgRC1CdXMgSVBDLgotZm4gbWFpbigpIC0+IFJlc3VsdDwoKSwgQm94PGR5biBFcnJvcj4+IHsKLSAgICBsZXQgZm9ybWF0dGVyID0gRm9ybWF0dGVyMzE2NCB7Ci0gICAgICAgIGZhY2lsaXR5OiBGYWNpbGl0eTo6TE9HX1VTRVIsCi0gICAgICAgIGhvc3RuYW1lOiBOb25lLAotICAgICAgICBwcm9jZXNzOiAiYnRhZGFwdGVyZCIuaW50bygpLAotICAgICAgICBwaWQ6IDAsCi0gICAgfTsKLQotICAgIGxldCBsb2dnZXIgPSBzeXNsb2c6OnVuaXgoZm9ybWF0dGVyKS5leHBlY3QoImNvdWxkIG5vdCBjb25uZWN0IHRvIHN5c2xvZyIpOwotICAgIGxldCBfID0gbG9nOjpzZXRfYm94ZWRfbG9nZ2VyKEJveDo6bmV3KEJhc2ljTG9nZ2VyOjpuZXcobG9nZ2VyKSkpCi0gICAgICAgIC5tYXAofCgpfCBsb2c6OnNldF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKLQotICAgIGxldCAodHgsIHJ4KSA9IFN0YWNrOjpjcmVhdGVfY2hhbm5lbCgpOwotCi0gICAgbGV0IGludGYgPSBBcmM6Om5ldyhNdXRleDo6bmV3KGdldF9idGludGVyZmFjZSgpLnVud3JhcCgpKSk7Ci0gICAgbGV0IGJsdWV0b290aF9nYXR0ID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhCb3g6Om5ldyhCbHVldG9vdGhHYXR0OjpuZXcoaW50Zi5jbG9uZSgpKSkpKTsKLSAgICBsZXQgYmx1ZXRvb3RoX21lZGlhID0KLSAgICAgICAgQXJjOjpuZXcoTXV0ZXg6Om5ldyhCb3g6Om5ldyhCbHVldG9vdGhNZWRpYTo6bmV3KHR4LmNsb25lKCksIGludGYuY2xvbmUoKSkpKSk7Ci0gICAgbGV0IGJsdWV0b290aCA9IEFyYzo6bmV3KE11dGV4OjpuZXcoQm94OjpuZXcoQmx1ZXRvb3RoOjpuZXcoCi0gICAgICAgIHR4LmNsb25lKCksCi0gICAgICAgIGludGYuY2xvbmUoKSwKLSAgICAgICAgYmx1ZXRvb3RoX21lZGlhLmNsb25lKCksCi0gICAgKSkpKTsKLQotICAgIC8vIEFyZ3MgZG9uJ3QgaW5jbHVkZSBhcmdbMF0gd2hpY2ggaXMgdGhlIGJpbmFyeSBuYW1lCi0gICAgbGV0IGFsbF9hcmdzID0gc3RkOjplbnY6OmFyZ3MoKS5jb2xsZWN0Ojo8VmVjPFN0cmluZz4+KCk7Ci0gICAgbGV0IGFyZ3MgPSBhbGxfYXJnc1sxLi5dLnRvX3ZlYygpOwotCi0gICAgbGV0IGFkYXB0ZXJfaW5kZXggPSBnZXRfYWRhcHRlcl9pbmRleCgmYXJncyk7Ci0KLSAgICAvLyBIb2xkIGxvY2tzIGFuZCBpbml0aWFsaXplIGFsbCBpbnRlcmZhY2VzLgotICAgIHsKLSAgICAgICAgaW50Zi5sb2NrKCkudW53cmFwKCkuaW5pdGlhbGl6ZShnZXRfYnRfZGlzcGF0Y2hlcih0eC5jbG9uZSgpKSwgYXJncyk7Ci0KLSAgICAgICAgbGV0IG11dCBibHVldG9vdGggPSBibHVldG9vdGgubG9jaygpLnVud3JhcCgpOwotICAgICAgICBibHVldG9vdGguaW5pdF9wcm9maWxlcygpOwotICAgICAgICBibHVldG9vdGguZW5hYmxlKCk7Ci0KLSAgICAgICAgYmx1ZXRvb3RoX2dhdHQubG9jaygpLnVud3JhcCgpLmluaXRfcHJvZmlsZXModHguY2xvbmUoKSk7Ci0gICAgfQotCi0gICAgdG9wc3RhY2s6OmdldF9ydW50aW1lKCkuYmxvY2tfb24oYXN5bmMgewotICAgICAgICAvLyBDb25uZWN0IHRvIEQtQnVzIHN5c3RlbSBidXMuCi0gICAgICAgIGxldCAocmVzb3VyY2UsIGNvbm4pID0gY29ubmVjdGlvbjo6bmV3X3N5c3RlbV9zeW5jKCk/OwotCi0gICAgICAgIC8vIFRoZSBgcmVzb3VyY2VgIGlzIGEgdGFzayB0aGF0IHNob3VsZCBiZSBzcGF3bmVkIG9udG8gYSB0b2tpbyBjb21wYXRpYmxlCi0gICAgICAgIC8vIHJlYWN0b3IgQVNBUC4gSWYgdGhlIHJlc291cmNlIGV2ZXIgZmluaXNoZXMsIHdlIGxvc3QgY29ubmVjdGlvbiB0byBELUJ1cy4KLSAgICAgICAgdG9raW86OnNwYXduKGFzeW5jIHsKLSAgICAgICAgICAgIGxldCBlcnIgPSByZXNvdXJjZS5hd2FpdDsKLSAgICAgICAgICAgIHBhbmljISgiTG9zdCBjb25uZWN0aW9uIHRvIEQtQnVzOiB7fSIsIGVycik7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIFJlcXVlc3QgYSBzZXJ2aWNlIG5hbWUgYW5kIHF1aXQgaWYgbm90IGFibGUgdG8uCi0gICAgICAgIGNvbm4ucmVxdWVzdF9uYW1lKERCVVNfU0VSVklDRV9OQU1FLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpLmF3YWl0PzsKLQotICAgICAgICAvLyBQcmVwYXJlIEQtQnVzIGludGVyZmFjZXMuCi0gICAgICAgIGxldCBtdXQgY3IgPSBDcm9zc3JvYWRzOjpuZXcoKTsKLSAgICAgICAgY3Iuc2V0X2FzeW5jX3N1cHBvcnQoU29tZSgoCi0gICAgICAgICAgICBjb25uLmNsb25lKCksCi0gICAgICAgICAgICBCb3g6Om5ldyh8eHwgewotICAgICAgICAgICAgICAgIHRva2lvOjpzcGF3bih4KTsKLSAgICAgICAgICAgIH0pLAotICAgICAgICApKSk7Ci0KLSAgICAgICAgLy8gUnVuIHRoZSBzdGFjayBtYWluIGRpc3BhdGNoIGxvb3AuCi0gICAgICAgIHRvcHN0YWNrOjpnZXRfcnVudGltZSgpLnNwYXduKFN0YWNrOjpkaXNwYXRjaCgKLSAgICAgICAgICAgIHJ4LAotICAgICAgICAgICAgYmx1ZXRvb3RoLmNsb25lKCksCi0gICAgICAgICAgICBibHVldG9vdGhfZ2F0dC5jbG9uZSgpLAotICAgICAgICAgICAgYmx1ZXRvb3RoX21lZGlhLmNsb25lKCksCi0gICAgICAgICkpOwotCi0gICAgICAgIC8vIFNldCB1cCB0aGUgZGlzY29ubmVjdCB3YXRjaGVyIHRvIG1vbml0b3IgY2xpZW50IGRpc2Nvbm5lY3RzLgotICAgICAgICBsZXQgZGlzY29ubmVjdF93YXRjaGVyID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhEaXNjb25uZWN0V2F0Y2hlcjo6bmV3KCkpKTsKLSAgICAgICAgZGlzY29ubmVjdF93YXRjaGVyLmxvY2soKS51bndyYXAoKS5zZXR1cF93YXRjaChjb25uLmNsb25lKCkpLmF3YWl0OwotCi0gICAgICAgIC8vIFJlZ2lzdGVyIEQtQnVzIG1ldGhvZCBoYW5kbGVycyBvZiBJQmx1ZXRvb3RoLgotICAgICAgICBpZmFjZV9ibHVldG9vdGg6OmV4cG9ydF9ibHVldG9vdGhfZGJ1c19vYmooCi0gICAgICAgICAgICBtYWtlX29iamVjdF9uYW1lKGFkYXB0ZXJfaW5kZXgsICJhZGFwdGVyIiksCi0gICAgICAgICAgICBjb25uLmNsb25lKCksCi0gICAgICAgICAgICAmbXV0IGNyLAotICAgICAgICAgICAgYmx1ZXRvb3RoLmNsb25lKCksCi0gICAgICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXIuY2xvbmUoKSwKLSAgICAgICAgKTsKLSAgICAgICAgLy8gUmVnaXN0ZXIgRC1CdXMgbWV0aG9kIGhhbmRsZXJzIG9mIElCbHVldG9vdGhHYXR0LgotICAgICAgICBpZmFjZV9ibHVldG9vdGhfZ2F0dDo6ZXhwb3J0X2JsdWV0b290aF9nYXR0X2RidXNfb2JqKAotICAgICAgICAgICAgbWFrZV9vYmplY3RfbmFtZShhZGFwdGVyX2luZGV4LCAiZ2F0dCIpLAotICAgICAgICAgICAgY29ubi5jbG9uZSgpLAotICAgICAgICAgICAgJm11dCBjciwKLSAgICAgICAgICAgIGJsdWV0b290aF9nYXR0LAotICAgICAgICAgICAgZGlzY29ubmVjdF93YXRjaGVyLmNsb25lKCksCi0gICAgICAgICk7Ci0KLSAgICAgICAgaWZhY2VfYmx1ZXRvb3RoX21lZGlhOjpleHBvcnRfYmx1ZXRvb3RoX21lZGlhX2RidXNfb2JqKAotICAgICAgICAgICAgbWFrZV9vYmplY3RfbmFtZShhZGFwdGVyX2luZGV4LCAibWVkaWEiKSwKLSAgICAgICAgICAgIGNvbm4uY2xvbmUoKSwKLSAgICAgICAgICAgICZtdXQgY3IsCi0gICAgICAgICAgICBibHVldG9vdGhfbWVkaWEsCi0gICAgICAgICAgICBkaXNjb25uZWN0X3dhdGNoZXIuY2xvbmUoKSwKLSAgICAgICAgKTsKLQotICAgICAgICBjb25uLnN0YXJ0X3JlY2VpdmUoCi0gICAgICAgICAgICBNYXRjaFJ1bGU6Om5ld19tZXRob2RfY2FsbCgpLAotICAgICAgICAgICAgQm94OjpuZXcobW92ZSB8bXNnLCBjb25ufCB7Ci0gICAgICAgICAgICAgICAgY3IuaGFuZGxlX21lc3NhZ2UobXNnLCBjb25uKS51bndyYXAoKTsKLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICB9KSwKLSAgICAgICAgKTsKLQotICAgICAgICAvLyBTZXJ2ZSBjbGllbnRzIGZvcmV2ZXIuCi0gICAgICAgIGZ1dHVyZTo6cGVuZGluZzo6PCgpPigpLmF3YWl0OwotICAgICAgICB1bnJlYWNoYWJsZSEoKQotICAgIH0pCi19Ci0KLSNbY2ZnKHRlc3QpXQotbW9kIHRlc3RzIHsKLSAgICB1c2UgY3JhdGU6OmdldF9hZGFwdGVyX2luZGV4OwotCi0gICAgI1t0ZXN0XQotICAgIGZuIGRldmljZV9pbmRleF9wYXJzZWQoKSB7Ci0gICAgICAgIC8vIEEgZmV3IGZhaWxpbmcgY2FzZXMKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfYWRhcHRlcl9pbmRleCgmdmVjISB7fSksIDApOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9hZGFwdGVyX2luZGV4KCZ2ZWMhIHsiLS1iYXIiLnRvX3N0cmluZygpLCAiLS1oY2kiLnRvX3N0cmluZygpfSksIDApOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9hZGFwdGVyX2luZGV4KCZ2ZWMhIHsiLS1oY2k9Zm9vIi50b19zdHJpbmcoKX0pLCAwKTsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfYWRhcHRlcl9pbmRleCgmdmVjISB7Ii0taGNpPTEydCIudG9fc3RyaW5nKCl9KSwgMCk7Ci0KLSAgICAgICAgLy8gU29tZSBwYXNzaW5nIGNhc2VzCi0gICAgICAgIGFzc2VydF9lcSEoZ2V0X2FkYXB0ZXJfaW5kZXgoJnZlYyEgeyItLWhjaT0xMiIudG9fc3RyaW5nKCl9KSwgMTIpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9hZGFwdGVyX2luZGV4KCZ2ZWMhIHsiLS1oY2k9MSIudG9fc3RyaW5nKCksICItLWhjaT0yIi50b19zdHJpbmcoKX0pLCAxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L3N0YWNrL0NhcmdvLnRvbWwgYi9nZC9ydXN0L2xpbnV4L3N0YWNrL0NhcmdvLnRvbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTMyMjUuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zdGFjay9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotW3BhY2thZ2VdCi1uYW1lID0gImJ0c3RhY2siCi12ZXJzaW9uID0gIjAuMS4wIgotZWRpdGlvbiA9ICIyMDE4IgotCi1bZGVwZW5kZW5jaWVzXQotYnRfdG9wc2hpbSA9IHsgcGF0aCA9ICIuLi8uLi90b3BzaGltIiB9Ci1idF9zaGltID0geyBwYXRoID0gIi4uLy4uL3NoaW0iIH0KLQotYnRpZl9tYWNyb3MgPSB7IHBhdGggPSAiYnRpZl9tYWNyb3MiIH0KLQotZGJ1cyA9ICIwLjkuMiIKLWxvZyA9ICIwLjQuMTQiCi1udW0tdHJhaXRzID0gIioiCi1udW0tZGVyaXZlID0gIioiCi0KLXRva2lvID0geyB2ZXJzaW9uID0gIjEiLCBmZWF0dXJlcyA9IFsnYnl0ZXMnLCAnZnMnLCAnaW8tdXRpbCcsICdsaWJjJywgJ21hY3JvcycsICdtZW1jaHInLCAnbWlvJywgJ25ldCcsICdudW1fY3B1cycsICdydCcsICdydC1tdWx0aS10aHJlYWQnLCAnc3luYycsICd0aW1lJywgJ3Rva2lvLW1hY3JvcyddIH0KLQotW2xpYl0KLXBhdGggPSAic3JjL2xpYi5ycyIKZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvc3RhY2svYnRpZl9tYWNyb3MvQ2FyZ28udG9tbCBiL2dkL3J1c3QvbGludXgvc3RhY2svYnRpZl9tYWNyb3MvQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxMDg2Ny4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3N0YWNrL2J0aWZfbWFjcm9zL0NhcmdvLnRvbWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1bcGFja2FnZV0KLW5hbWUgPSAiYnRpZl9tYWNyb3MiCi12ZXJzaW9uID0gIjAuMS4wIgotZWRpdGlvbiA9ICIyMDE4IgotCi1bbGliXQotcHJvYy1tYWNybyA9IHRydWUKLQotW2RlcGVuZGVuY2llc10KLXN5biA9ICIxLjAiCi1xdW90ZSA9ICIxLjAiCi1wcm9jLW1hY3JvMiA9ICIxLjAiCmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L3N0YWNrL2J0aWZfbWFjcm9zL3NyYy9saWIucnMgYi9nZC9ydXN0L2xpbnV4L3N0YWNrL2J0aWZfbWFjcm9zL3NyYy9saWIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OWM2MDkuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zdGFjay9idGlmX21hY3Jvcy9zcmMvbGliLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLWV4dGVybiBjcmF0ZSBwcm9jX21hY3JvOwotCi11c2UgcXVvdGU6OnF1b3RlOwotCi11c2Ugc3RkOjpmczo6RmlsZTsKLXVzZSBzdGQ6OmlvOjpXcml0ZTsKLXVzZSBzdGQ6OnBhdGg6OlBhdGg7Ci0KLXVzZSBzeW46OnBhcnNlOjpQYXJzZXI7Ci11c2Ugc3luOjpwdW5jdHVhdGVkOjpQdW5jdHVhdGVkOwotdXNlIHN5bjo6dG9rZW46OkNvbW1hOwotdXNlIHN5bjo6e0V4cHIsIEZuQXJnLCBJdGVtVHJhaXQsIE1ldGEsIFBhdCwgVHJhaXRJdGVtfTsKLQotdXNlIGNyYXRlOjpwcm9jX21hY3JvOjpUb2tlblN0cmVhbTsKLQotZm4gZGVidWdfb3V0cHV0X3RvX2ZpbGUoZ2VuOiAmcHJvY19tYWNybzI6OlRva2VuU3RyZWFtLCBmaWxlbmFtZTogU3RyaW5nKSB7Ci0gICAgbGV0IHBhdGggPSBQYXRoOjpuZXcoZmlsZW5hbWUuYXNfc3RyKCkpOwotICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6OmNyZWF0ZSgmcGF0aCkudW53cmFwKCk7Ci0gICAgZmlsZS53cml0ZV9hbGwoZ2VuLnRvX3N0cmluZygpLmFzX2J5dGVzKCkpLnVud3JhcCgpOwotfQotCi0vLy8gQXNzb2NpYXRlcyBhIGZ1bmN0aW9uIHdpdGggYSBidGlmIGNhbGxiYWNrIG1lc3NhZ2UuCi0jW3Byb2NfbWFjcm9fYXR0cmlidXRlXQotcHViIGZuIGJ0aWZfY2FsbGJhY2soX2F0dHI6IFRva2VuU3RyZWFtLCBpdGVtOiBUb2tlblN0cmVhbSkgLT4gVG9rZW5TdHJlYW0gewotICAgIGxldCBvcmlfaXRlbTogcHJvY19tYWNybzI6OlRva2VuU3RyZWFtID0gaXRlbS5jbG9uZSgpLmludG8oKTsKLSAgICBsZXQgZ2VuID0gcXVvdGUhIHsKLSAgICAgICAgI29yaV9pdGVtCi0gICAgfTsKLSAgICBnZW4uaW50bygpCi19Ci0KLS8vLyBHZW5lcmF0ZXMgYSBkaXNwYXRjaGVyIGZyb20gYSBtZXNzYWdlIHRvIGEgZnVuY3Rpb24uCi0jW3Byb2NfbWFjcm9fYXR0cmlidXRlXQotcHViIGZuIGJ0aWZfY2FsbGJhY2tzX2Rpc3BhdGNoZXIoYXR0cjogVG9rZW5TdHJlYW0sIGl0ZW06IFRva2VuU3RyZWFtKSAtPiBUb2tlblN0cmVhbSB7Ci0gICAgbGV0IGFyZ3MgPSBQdW5jdHVhdGVkOjo8RXhwciwgQ29tbWE+OjpwYXJzZV9zZXBhcmF0ZWRfbm9uZW1wdHkucGFyc2UoYXR0ci5jbG9uZSgpKS51bndyYXAoKTsKLQotICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBpZiBsZXQgRXhwcjo6UGF0aChwKSA9ICZhcmdzWzBdIHsKLSAgICAgICAgcC5wYXRoLmdldF9pZGVudCgpLnVud3JhcCgpCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFuaWMhKCJzdHJ1Y3QgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgIH07Ci0KLSAgICBsZXQgZm5faWRlbnQgPSBpZiBsZXQgRXhwcjo6UGF0aChwKSA9ICZhcmdzWzFdIHsKLSAgICAgICAgcC5wYXRoLmdldF9pZGVudCgpLnVud3JhcCgpCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFuaWMhKCJmdW5jdGlvbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgfTsKLQotICAgIGxldCBjYWxsYmFja3Nfc3RydWN0X2lkZW50ID0gaWYgbGV0IEV4cHI6OlBhdGgocCkgPSAmYXJnc1syXSB7Ci0gICAgICAgIHAucGF0aC5nZXRfaWRlbnQoKS51bndyYXAoKQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhbmljISgiY2FsbGJhY2tzIHN0cnVjdCBpZGVudCBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgIH07Ci0KLSAgICBsZXQgbXV0IGRpc3BhdGNoX2FybXMgPSBxdW90ZSEge307Ci0KLSAgICBsZXQgYXN0OiBJdGVtVHJhaXQgPSBzeW46OnBhcnNlKGl0ZW0uY2xvbmUoKSkudW53cmFwKCk7Ci0KLSAgICBsZXQgbXV0IGZuX25hbWVzID0gcXVvdGUhIHt9OwotICAgIGZvciBhdHRyIGluIGFzdC5pdGVtcyB7Ci0gICAgICAgIGlmIGxldCBUcmFpdEl0ZW06Ok1ldGhvZChtKSA9IGF0dHIgewotICAgICAgICAgICAgaWYgbS5hdHRycy5sZW4oKSAhPSAxIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGV0IGF0dHIgPSAmbS5hdHRyc1swXTsKLSAgICAgICAgICAgIGlmICFhdHRyLnBhdGguZ2V0X2lkZW50KCkudW53cmFwKCkudG9fc3RyaW5nKCkuZXEoImJ0aWZfY2FsbGJhY2siKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxldCBhdHRyX2FyZ3MgPSBhdHRyLnBhcnNlX21ldGEoKS51bndyYXAoKTsKLSAgICAgICAgICAgIGxldCBidGlmX2NhbGxiYWNrID0gaWYgbGV0IE1ldGE6Okxpc3QobWV0YV9saXN0KSA9IGF0dHJfYXJncyB7Ci0gICAgICAgICAgICAgICAgU29tZShtZXRhX2xpc3QubmVzdGVkWzBdLmNsb25lKCkpCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE5vbmUKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGlmIGJ0aWZfY2FsbGJhY2suaXNfbm9uZSgpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGV0IG11dCBhcmdfbmFtZXMgPSBxdW90ZSEge307Ci0gICAgICAgICAgICBmb3IgaW5wdXQgaW4gbS5zaWcuaW5wdXRzIHsKLSAgICAgICAgICAgICAgICBpZiBsZXQgRm5Bcmc6OlR5cGVkKHQpID0gaW5wdXQgewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgUGF0OjpJZGVudChpKSA9ICp0LnBhdCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0cl9uYW1lID0gaS5pZGVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyA9IHF1b3RlISB7ICNhcmdfbmFtZXMgI2F0dHJfbmFtZSwgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxldCBtZXRob2RfaWRlbnQgPSBtLnNpZy5pZGVudDsKLQotICAgICAgICAgICAgZm5fbmFtZXMgPSBxdW90ZSEgewotICAgICAgICAgICAgICAgICNmbl9uYW1lcwotICAgICAgICAgICAgICAgICNtZXRob2RfaWRlbnQsCi0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBkaXNwYXRjaF9hcm1zID0gcXVvdGUhIHsKLSAgICAgICAgICAgICAgICAjZGlzcGF0Y2hfYXJtcwotICAgICAgICAgICAgICAgICNjYWxsYmFja3Nfc3RydWN0X2lkZW50OjojYnRpZl9jYWxsYmFjaygjYXJnX25hbWVzKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuI21ldGhvZF9pZGVudCgjYXJnX25hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbGV0IG9yaV9pdGVtID0gcHJvY19tYWNybzI6OlRva2VuU3RyZWFtOjpmcm9tKGl0ZW0uY2xvbmUoKSk7Ci0KLSAgICBsZXQgZ2VuID0gcXVvdGUhIHsKLSAgICAgICAgI29yaV9pdGVtCi0gICAgICAgIGltcGwgI3N0cnVjdF9pZGVudCB7Ci0gICAgICAgICAgICBwdWIoY3JhdGUpIGZuICNmbl9pZGVudCgmbXV0IHNlbGYsIGNiOiAjY2FsbGJhY2tzX3N0cnVjdF9pZGVudCkgewotICAgICAgICAgICAgICAgIG1hdGNoIGNiIHsKLSAgICAgICAgICAgICAgICAgICAgI2Rpc3BhdGNoX2FybXMKLQotICAgICAgICAgICAgICAgICAgICBfID0+IHByaW50bG4hKCJVbmhhbmRsZWQgY2FsbGJhY2sgYXJtIHs6P30iLCBjYiksCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIFRPRE86IEhhdmUgYSBzaW1wbGUgZnJhbWV3b3JrIHRvIHR1cm4gb24vb2ZmIG1hY3JvLWdlbmVyYXRlZCBjb2RlIGRlYnVnLgotICAgIGRlYnVnX291dHB1dF90b19maWxlKCZnZW4sIGZvcm1hdCEoIi90bXAvb3V0LXt9LnJzIiwgZm5faWRlbnQudG9fc3RyaW5nKCkpKTsKLQotICAgIGdlbi5pbnRvKCkKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvbGludXgvc3RhY2svc3JjL2JsdWV0b290aC5ycyBiL2dkL3J1c3QvbGludXgvc3RhY2svc3JjL2JsdWV0b290aC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5NWIzNi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9ibHVldG9vdGgucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI3ICswLDAgQEAKLS8vISBBbnl0aGluZyByZWxhdGVkIHRvIHRoZSBhZGFwdGVyIEFQSSAoSUJsdWV0b290aCkuCi0KLXVzZSBidF90b3BzaGltOjpidGlmOjp7Ci0gICAgQmFzZUNhbGxiYWNrcywgQmFzZUNhbGxiYWNrc0Rpc3BhdGNoZXIsIEJsdWV0b290aEludGVyZmFjZSwgQmx1ZXRvb3RoUHJvcGVydHksIEJ0QWNsU3RhdGUsCi0gICAgQnRCb25kU3RhdGUsIEJ0RGlzY292ZXJ5U3RhdGUsIEJ0SGNpRXJyb3JDb2RlLCBCdFBpbkNvZGUsIEJ0UHJvcGVydHlUeXBlLCBCdFNzcFZhcmlhbnQsCi0gICAgQnRTdGF0ZSwgQnRTdGF0dXMsIEJ0VHJhbnNwb3J0LCBSYXdBZGRyZXNzLCBVdWlkLCBVdWlkMTI4Qml0LAotfTsKLXVzZSBidF90b3BzaGltOjp7Ci0gICAgcHJvZmlsZXM6OmhpZF9ob3N0Ojp7SEhDYWxsYmFja3NEaXNwYXRjaGVyLCBIaWRIb3N0fSwKLSAgICBwcm9maWxlczo6c2RwOjp7QnRTZHBSZWNvcmQsIFNkcCwgU2RwQ2FsbGJhY2tzLCBTZHBDYWxsYmFja3NEaXNwYXRjaGVyfSwKLSAgICB0b3BzdGFjaywKLX07Ci0KLXVzZSBidGlmX21hY3Jvczo6e2J0aWZfY2FsbGJhY2ssIGJ0aWZfY2FsbGJhY2tzX2Rpc3BhdGNoZXJ9OwotCi11c2UgbG9nOjp7ZGVidWcsIHdhcm59OwotdXNlIG51bV90cmFpdHM6OmNhc3Q6OlRvUHJpbWl0aXZlOwotdXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2Ugc3RkOjpzeW5jOjpNdXRleDsKLXVzZSBzdGQ6OnRpbWU6Okluc3RhbnQ7Ci11c2UgdG9raW86OnN5bmM6Om1wc2M6OlNlbmRlcjsKLQotdXNlIGNyYXRlOjpibHVldG9vdGhfbWVkaWE6OntCbHVldG9vdGhNZWRpYSwgSUJsdWV0b290aE1lZGlhLCBNZWRpYUFjdGlvbnN9OwotdXNlIGNyYXRlOjp1dWlkOjp7UHJvZmlsZSwgVXVpZEhlbHBlcn07Ci11c2UgY3JhdGU6OntCbHVldG9vdGhDYWxsYmFja1R5cGUsIE1lc3NhZ2UsIFJQQ1Byb3h5fTsKLQotLy8vIERlZmluZXMgdGhlIGFkYXB0ZXIgQVBJLgotcHViIHRyYWl0IElCbHVldG9vdGggewotICAgIC8vLyBBZGRzIGEgY2FsbGJhY2sgZnJvbSBhIGNsaWVudCB3aG8gd2lzaGVzIHRvIG9ic2VydmUgYWRhcHRlciBldmVudHMuCi0gICAgZm4gcmVnaXN0ZXJfY2FsbGJhY2soJm11dCBzZWxmLCBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoQ2FsbGJhY2sgKyBTZW5kPik7Ci0KLSAgICAvLy8gQWRkcyBhIGNhbGxiYWNrIGZyb20gYSBjbGllbnQgd2hvIHdpc2hlcyB0byBvYnNlcnZlIGNvbm5lY3Rpb24gZXZlbnRzLgotICAgIGZuIHJlZ2lzdGVyX2Nvbm5lY3Rpb25fY2FsbGJhY2soCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayArIFNlbmQ+LAotICAgICkgLT4gdTMyOwotCi0gICAgLy8vIFJlbW92ZXMgcmVnaXN0ZXJlZCBjYWxsYmFjay4KLSAgICBmbiB1bnJlZ2lzdGVyX2Nvbm5lY3Rpb25fY2FsbGJhY2soJm11dCBzZWxmLCBjYWxsYmFja19pZDogdTMyKSAtPiBib29sOwotCi0gICAgLy8vIEVuYWJsZXMgdGhlIGFkYXB0ZXIuCi0gICAgLy8vCi0gICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBhY2NlcHRlZC4KLSAgICBmbiBlbmFibGUoJm11dCBzZWxmKSAtPiBib29sOwotCi0gICAgLy8vIERpc2FibGVzIHRoZSBhZGFwdGVyLgotICAgIC8vLwotICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgYWNjZXB0ZWQuCi0gICAgZm4gZGlzYWJsZSgmbXV0IHNlbGYpIC0+IGJvb2w7Ci0KLSAgICAvLy8gUmV0dXJucyB0aGUgQmx1ZXRvb3RoIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIGFkYXB0ZXIuCi0gICAgZm4gZ2V0X2FkZHJlc3MoJnNlbGYpIC0+IFN0cmluZzsKLQotICAgIC8vLyBHZXRzIHN1cHBvcnRlZCBVVUlEcyBieSB0aGUgbG9jYWwgYWRhcHRlci4KLSAgICBmbiBnZXRfdXVpZHMoJnNlbGYpIC0+IFZlYzxVdWlkMTI4Qml0PjsKLQotICAgIC8vLyBHZXRzIHRoZSBsb2NhbCBhZGFwdGVyIG5hbWUuCi0gICAgZm4gZ2V0X25hbWUoJnNlbGYpIC0+IFN0cmluZzsKLQotICAgIC8vLyBTZXRzIHRoZSBsb2NhbCBhZGFwdGVyIG5hbWUuCi0gICAgZm4gc2V0X25hbWUoJnNlbGYsIG5hbWU6IFN0cmluZykgLT4gYm9vbDsKLQotICAgIC8vLyBTdGFydHMgQlJFRFIgSW5xdWlyeS4KLSAgICBmbiBzdGFydF9kaXNjb3ZlcnkoJnNlbGYpIC0+IGJvb2w7Ci0KLSAgICAvLy8gQ2FuY2VscyBCUkVEUiBJbnF1aXJ5LgotICAgIGZuIGNhbmNlbF9kaXNjb3ZlcnkoJnNlbGYpIC0+IGJvb2w7Ci0KLSAgICAvLy8gQ2hlY2tzIGlmIGRpc2NvdmVyeSBpcyBzdGFydGVkLgotICAgIGZuIGlzX2Rpc2NvdmVyaW5nKCZzZWxmKSAtPiBib29sOwotCi0gICAgLy8vIENoZWNrcyB3aGVuIGRpc2NvdmVyeSBlbmRzIGluIG1pbGxpc2Vjb25kcyBmcm9tIG5vdy4KLSAgICBmbiBnZXRfZGlzY292ZXJ5X2VuZF9taWxsaXMoJnNlbGYpIC0+IHU2NDsKLQotICAgIC8vLyBJbml0aWF0ZXMgcGFpcmluZyB0byBhIHJlbW90ZSBkZXZpY2UuIFRyaWdnZXJzIGNvbm5lY3Rpb24gaWYgbm90IGFscmVhZHkgc3RhcnRlZC4KLSAgICBmbiBjcmVhdGVfYm9uZCgmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIHRyYW5zcG9ydDogQnRUcmFuc3BvcnQpIC0+IGJvb2w7Ci0KLSAgICAvLy8gQ2FuY2VscyBhbnkgcGVuZGluZyBib25kIGF0dGVtcHQgb24gZ2l2ZW4gZGV2aWNlLgotICAgIGZuIGNhbmNlbF9ib25kX3Byb2Nlc3MoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBib29sOwotCi0gICAgLy8vIFJlbW92ZXMgcGFpcmluZyBmb3IgZ2l2ZW4gZGV2aWNlLgotICAgIGZuIHJlbW92ZV9ib25kKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbDsKLQotICAgIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBrbm93biBib25kZWQgZGV2aWNlcy4KLSAgICBmbiBnZXRfYm9uZGVkX2RldmljZXMoJnNlbGYpIC0+IFZlYzxCbHVldG9vdGhEZXZpY2U+OwotCi0gICAgLy8vIEdldHMgdGhlIGJvbmQgc3RhdGUgb2YgYSBzaW5nbGUgZGV2aWNlLgotICAgIGZuIGdldF9ib25kX3N0YXRlKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gdTMyOwotCi0gICAgLy8vIFNldCBwaW4gb24gYm9uZGluZyBkZXZpY2UuCi0gICAgZm4gc2V0X3Bpbigmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIGFjY2VwdDogYm9vbCwgbGVuOiB1MzIsIHBpbl9jb2RlOiBWZWM8dTg+KSAtPiBib29sOwotCi0gICAgLy8vIFNldCBwYXNza2V5IG9uIGJvbmRpbmcgZGV2aWNlLgotICAgIGZuIHNldF9wYXNza2V5KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsCi0gICAgICAgIGFjY2VwdDogYm9vbCwKLSAgICAgICAgbGVuOiB1MzIsCi0gICAgICAgIHBhc3NrZXk6IFZlYzx1OD4sCi0gICAgKSAtPiBib29sOwotCi0gICAgLy8vIENvbmZpcm0gdGhhdCBhIHBhaXJpbmcgc2hvdWxkIGJlIGNvbXBsZXRlZCBvbiBhIGJvbmRpbmcgZGV2aWNlLgotICAgIGZuIHNldF9wYWlyaW5nX2NvbmZpcm1hdGlvbigmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIGFjY2VwdDogYm9vbCkgLT4gYm9vbDsKLQotICAgIC8vLyBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIGEgc2luZ2xlIGRldmljZS4KLSAgICBmbiBnZXRfY29ubmVjdGlvbl9zdGF0ZSgmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IHUzMjsKLQotICAgIC8vLyBSZXR1cm5zIHRoZSBjYWNoZWQgVVVJRHMgb2YgYSByZW1vdGUgZGV2aWNlLgotICAgIGZuIGdldF9yZW1vdGVfdXVpZHMoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBWZWM8VXVpZDEyOEJpdD47Ci0KLSAgICAvLy8gVHJpZ2dlcnMgU0RQIHRvIGdldCBVVUlEcyBvZiBhIHJlbW90ZSBkZXZpY2UuCi0gICAgZm4gZmV0Y2hfcmVtb3RlX3V1aWRzKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbDsKLQotICAgIC8vLyBUcmlnZ2VycyBTRFAgYW5kIHNlYXJjaGVzIGZvciBhIHNwZWNpZmljIFVVSUQgb24gYSByZW1vdGUgZGV2aWNlLgotICAgIGZuIHNkcF9zZWFyY2goJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlLCB1dWlkOiBVdWlkMTI4Qml0KSAtPiBib29sOwotCi0gICAgLy8vIENvbm5lY3QgYWxsIHByb2ZpbGVzIHN1cHBvcnRlZCBieSBkZXZpY2UgYW5kIGVuYWJsZWQgb24gYWRhcHRlci4KLSAgICBmbiBjb25uZWN0X2FsbF9lbmFibGVkX3Byb2ZpbGVzKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbDsKLQotICAgIC8vLyBEaXNjb25uZWN0IGFsbCBwcm9maWxlcyBzdXBwb3J0ZWQgYnkgZGV2aWNlIGFuZCBlbmFibGVkIG9uIGFkYXB0ZXIuCi0gICAgZm4gZGlzY29ubmVjdF9hbGxfZW5hYmxlZF9wcm9maWxlcygmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IGJvb2w7Ci19Ci0KLS8vLyBTZXJpYWxpemFibGUgZGV2aWNlIHVzZWQgaW4gdmFyaW91cyBhcGlzLgotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBEZWZhdWx0KV0KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICBwdWIgYWRkcmVzczogU3RyaW5nLAotICAgIHB1YiBuYW1lOiBTdHJpbmcsCi19Ci0KLWltcGwgQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICBwdWIoY3JhdGUpIGZuIG5ldyhhZGRyZXNzOiBTdHJpbmcsIG5hbWU6IFN0cmluZykgLT4gQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIHsgYWRkcmVzcywgbmFtZSB9Ci0gICAgfQotCi0gICAgcHViKGNyYXRlKSBmbiBmcm9tX3Byb3BlcnRpZXMoaW5fcHJvcGVydGllczogJlZlYzxCbHVldG9vdGhQcm9wZXJ0eT4pIC0+IEJsdWV0b290aERldmljZSB7Ci0gICAgICAgIGxldCBtdXQgYWRkcmVzcyA9IFN0cmluZzo6ZnJvbSgiIik7Ci0gICAgICAgIGxldCBtdXQgbmFtZSA9IFN0cmluZzo6ZnJvbSgiIik7Ci0KLSAgICAgICAgZm9yIHByb3AgaW4gaW5fcHJvcGVydGllcyB7Ci0gICAgICAgICAgICBtYXRjaCAmcHJvcCB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkJkQWRkcihiZGFkZHIpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGJkYWRkci50b19zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkJkTmFtZShiZG5hbWUpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGJkbmFtZS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfID0+IHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhEZXZpY2U6Om5ldyhhZGRyZXNzLCBuYW1lKQotICAgIH0KLX0KLQotLy8vIEludGVybmFsIGRhdGEgc3RydWN0dXJlIHRoYXQga2VlcHMgYSBtYXAgb2YgY2FjaGVkIHByb3BlcnRpZXMgZm9yIGEgcmVtb3RlIGRldmljZS4KLXN0cnVjdCBCbHVldG9vdGhEZXZpY2VDb250ZXh0IHsKLSAgICBwdWIgYm9uZF9zdGF0ZTogQnRCb25kU3RhdGUsCi0gICAgcHViIGFjbF9zdGF0ZTogQnRBY2xTdGF0ZSwKLSAgICBwdWIgaW5mbzogQmx1ZXRvb3RoRGV2aWNlLAotICAgIHB1YiBwcm9wZXJ0aWVzOiBIYXNoTWFwPEJ0UHJvcGVydHlUeXBlLCBCbHVldG9vdGhQcm9wZXJ0eT4sCi19Ci0KLWltcGwgQmx1ZXRvb3RoRGV2aWNlQ29udGV4dCB7Ci0gICAgcHViKGNyYXRlKSBmbiBuZXcoCi0gICAgICAgIGJvbmRfc3RhdGU6IEJ0Qm9uZFN0YXRlLAotICAgICAgICBhY2xfc3RhdGU6IEJ0QWNsU3RhdGUsCi0gICAgICAgIGluZm86IEJsdWV0b290aERldmljZSwKLSAgICAgICAgcHJvcGVydGllczogVmVjPEJsdWV0b290aFByb3BlcnR5PiwKLSAgICApIC0+IEJsdWV0b290aERldmljZUNvbnRleHQgewotICAgICAgICBsZXQgbXV0IGRldmljZSA9Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2VDb250ZXh0IHsgYm9uZF9zdGF0ZSwgYWNsX3N0YXRlLCBpbmZvLCBwcm9wZXJ0aWVzOiBIYXNoTWFwOjpuZXcoKSB9OwotICAgICAgICBkZXZpY2UudXBkYXRlX3Byb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgIGRldmljZQotICAgIH0KLQotICAgIHB1YihjcmF0ZSkgZm4gdXBkYXRlX3Byb3BlcnRpZXMoJm11dCBzZWxmLCBpbl9wcm9wZXJ0aWVzOiBWZWM8Qmx1ZXRvb3RoUHJvcGVydHk+KSB7Ci0gICAgICAgIGZvciBwcm9wIGluIGluX3Byb3BlcnRpZXMgewotICAgICAgICAgICAgbWF0Y2ggJnByb3AgewotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpCZEFkZHIoYmRhZGRyKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuaW5mby5hZGRyZXNzID0gYmRhZGRyLnRvX3N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QmROYW1lKGJkbmFtZSkgPT4gewotICAgICAgICAgICAgICAgICAgICBzZWxmLmluZm8ubmFtZSA9IGJkbmFtZS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfID0+IHt9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGYucHJvcGVydGllcy5pbnNlcnQocHJvcC5nZXRfdHlwZSgpLCBwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8vIFRoZSBpbnRlcmZhY2UgZm9yIGFkYXB0ZXIgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgdGhyb3VnaCBgSUJsdWV0b290aDo6cmVnaXN0ZXJfY2FsbGJhY2tgLgotcHViIHRyYWl0IElCbHVldG9vdGhDYWxsYmFjazogUlBDUHJveHkgewotICAgIC8vLyBXaGVuIGFueSBvZiB0aGUgYWRhcHRlciBsb2NhbCBhZGRyZXNzIGlzIGNoYW5nZWQuCi0gICAgZm4gb25fYWRkcmVzc19jaGFuZ2VkKCZzZWxmLCBhZGRyOiBTdHJpbmcpOwotCi0gICAgLy8vIFdoZW4gYSBkZXZpY2UgaXMgZm91bmQgdmlhIGRpc2NvdmVyeS4KLSAgICBmbiBvbl9kZXZpY2VfZm91bmQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSk7Ci0KLSAgICAvLy8gV2hlbiB0aGUgZGlzY292ZXJ5IHN0YXRlIGlzIGNoYW5nZWQuCi0gICAgZm4gb25fZGlzY292ZXJpbmdfY2hhbmdlZCgmc2VsZiwgZGlzY292ZXJpbmc6IGJvb2wpOwotCi0gICAgLy8vIFdoZW4gdGhlcmUgaXMgYSBwYWlyaW5nL2JvbmRpbmcgcHJvY2VzcyBhbmQgcmVxdWlyZXMgYWdlbnQgdG8gZGlzcGxheSB0aGUgZXZlbnQgdG8gVUkuCi0gICAgZm4gb25fc3NwX3JlcXVlc3QoCi0gICAgICAgICZzZWxmLAotICAgICAgICByZW1vdGVfZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsCi0gICAgICAgIGNvZDogdTMyLAotICAgICAgICB2YXJpYW50OiBCdFNzcFZhcmlhbnQsCi0gICAgICAgIHBhc3NrZXk6IHUzMiwKLSAgICApOwotCi0gICAgLy8vIFdoZW4gYSBib25kaW5nIGF0dGVtcHQgaGFzIGNvbXBsZXRlZC4KLSAgICBmbiBvbl9ib25kX3N0YXRlX2NoYW5nZWQoJnNlbGYsIHN0YXR1czogdTMyLCBkZXZpY2VfYWRkcmVzczogU3RyaW5nLCBzdGF0ZTogdTMyKTsKLX0KLQotcHViIHRyYWl0IElCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2s6IFJQQ1Byb3h5IHsKLSAgICAvLy8gTm90aWZpY2F0aW9uIHNlbnQgd2hlbiBhIHJlbW90ZSBkZXZpY2UgY29tcGxldGVzIEhDSSBjb25uZWN0aW9uLgotICAgIGZuIG9uX2RldmljZV9jb25uZWN0ZWQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSk7Ci0KLSAgICAvLy8gTm90aWZpY2F0aW9uIHNlbnQgd2hlbiBhIHJlbW90ZSBkZXZpY2UgY29tcGxldGVzIEhDSSBkaXNjb25uZWN0aW9uLgotICAgIGZuIG9uX2RldmljZV9kaXNjb25uZWN0ZWQoJnNlbGYsIHJlbW90ZV9kZXZpY2U6IEJsdWV0b290aERldmljZSk7Ci19Ci0KLS8vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRhcHRlciBBUEkuCi1wdWIgc3RydWN0IEJsdWV0b290aCB7Ci0gICAgaW50ZjogQXJjPE11dGV4PEJsdWV0b290aEludGVyZmFjZT4+LAotCi0gICAgYm9uZGVkX2RldmljZXM6IEhhc2hNYXA8U3RyaW5nLCBCbHVldG9vdGhEZXZpY2VDb250ZXh0PiwKLSAgICBibHVldG9vdGhfbWVkaWE6IEFyYzxNdXRleDxCb3g8Qmx1ZXRvb3RoTWVkaWE+Pj4sCi0gICAgY2FsbGJhY2tzOiBIYXNoTWFwPHUzMiwgQm94PGR5biBJQmx1ZXRvb3RoQ2FsbGJhY2sgKyBTZW5kPj4sCi0gICAgY29ubmVjdGlvbl9jYWxsYmFja3M6IEhhc2hNYXA8dTMyLCBCb3g8ZHluIElCbHVldG9vdGhDb25uZWN0aW9uQ2FsbGJhY2sgKyBTZW5kPj4sCi0gICAgZGlzY292ZXJpbmdfc3RhcnRlZDogSW5zdGFudCwKLSAgICBoaDogT3B0aW9uPEhpZEhvc3Q+LAotICAgIGlzX2Rpc2NvdmVyaW5nOiBib29sLAotICAgIGxvY2FsX2FkZHJlc3M6IE9wdGlvbjxSYXdBZGRyZXNzPiwKLSAgICBwcm9wZXJ0aWVzOiBIYXNoTWFwPEJ0UHJvcGVydHlUeXBlLCBCbHVldG9vdGhQcm9wZXJ0eT4sCi0gICAgcHJvZmlsZXNfcmVhZHk6IGJvb2wsCi0gICAgZm91bmRfZGV2aWNlczogSGFzaE1hcDxTdHJpbmcsIEJsdWV0b290aERldmljZUNvbnRleHQ+LAotICAgIHNkcDogT3B0aW9uPFNkcD4sCi0gICAgc3RhdGU6IEJ0U3RhdGUsCi0gICAgdHg6IFNlbmRlcjxNZXNzYWdlPiwKLSAgICB1dWlkX2hlbHBlcjogVXVpZEhlbHBlciwKLX0KLQotaW1wbCBCbHVldG9vdGggewotICAgIC8vLyBDb25zdHJ1Y3RzIHRoZSBJQmx1ZXRvb3RoIGltcGxlbWVudGF0aW9uLgotICAgIHB1YiBmbiBuZXcoCi0gICAgICAgIHR4OiBTZW5kZXI8TWVzc2FnZT4sCi0gICAgICAgIGludGY6IEFyYzxNdXRleDxCbHVldG9vdGhJbnRlcmZhY2U+PiwKLSAgICAgICAgYmx1ZXRvb3RoX21lZGlhOiBBcmM8TXV0ZXg8Qm94PEJsdWV0b290aE1lZGlhPj4+LAotICAgICkgLT4gQmx1ZXRvb3RoIHsKLSAgICAgICAgQmx1ZXRvb3RoIHsKLSAgICAgICAgICAgIGJvbmRlZF9kZXZpY2VzOiBIYXNoTWFwOjpuZXcoKSwKLSAgICAgICAgICAgIGNhbGxiYWNrczogSGFzaE1hcDo6bmV3KCksCi0gICAgICAgICAgICBjb25uZWN0aW9uX2NhbGxiYWNrczogSGFzaE1hcDo6bmV3KCksCi0gICAgICAgICAgICBoaDogTm9uZSwKLSAgICAgICAgICAgIGJsdWV0b290aF9tZWRpYSwKLSAgICAgICAgICAgIGRpc2NvdmVyaW5nX3N0YXJ0ZWQ6IEluc3RhbnQ6Om5vdygpLAotICAgICAgICAgICAgaW50ZiwKLSAgICAgICAgICAgIGlzX2Rpc2NvdmVyaW5nOiBmYWxzZSwKLSAgICAgICAgICAgIGxvY2FsX2FkZHJlc3M6IE5vbmUsCi0gICAgICAgICAgICBwcm9wZXJ0aWVzOiBIYXNoTWFwOjpuZXcoKSwKLSAgICAgICAgICAgIHByb2ZpbGVzX3JlYWR5OiBmYWxzZSwKLSAgICAgICAgICAgIGZvdW5kX2RldmljZXM6IEhhc2hNYXA6Om5ldygpLAotICAgICAgICAgICAgc2RwOiBOb25lLAotICAgICAgICAgICAgc3RhdGU6IEJ0U3RhdGU6Ok9mZiwKLSAgICAgICAgICAgIHR4LAotICAgICAgICAgICAgdXVpZF9oZWxwZXI6IFV1aWRIZWxwZXI6Om5ldygpLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHViIGZuIGluaXRfcHJvZmlsZXMoJm11dCBzZWxmKSB7Ci0gICAgICAgIGxldCBoaHR4ID0gc2VsZi50eC5jbG9uZSgpOwotICAgICAgICBzZWxmLmhoID0gU29tZShIaWRIb3N0OjpuZXcoJnNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkpKTsKLSAgICAgICAgc2VsZi5oaC5hc19tdXQoKS51bndyYXAoKS5pbml0aWFsaXplKEhIQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgICAgICAgICBkaXNwYXRjaDogQm94OjpuZXcobW92ZSB8Y2J8IHsKLSAgICAgICAgICAgICAgICBsZXQgdHhsID0gaGh0eC5jbG9uZSgpOwotICAgICAgICAgICAgICAgIHRvcHN0YWNrOjpnZXRfcnVudGltZSgpLnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgICAgICAgICBsZXQgXyA9IHR4bC5zZW5kKE1lc3NhZ2U6OkhpZEhvc3QoY2IpKS5hd2FpdDsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0pLAotICAgICAgICB9KTsKLQotICAgICAgICBsZXQgc2RwdHggPSBzZWxmLnR4LmNsb25lKCk7Ci0gICAgICAgIHNlbGYuc2RwID0gU29tZShTZHA6Om5ldygmc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKSkpOwotICAgICAgICBzZWxmLnNkcC5hc19tdXQoKS51bndyYXAoKS5pbml0aWFsaXplKFNkcENhbGxiYWNrc0Rpc3BhdGNoZXIgewotICAgICAgICAgICAgZGlzcGF0Y2g6IEJveDo6bmV3KG1vdmUgfGNifCB7Ci0gICAgICAgICAgICAgICAgbGV0IHR4bCA9IHNkcHR4LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgdG9wc3RhY2s6OmdldF9ydW50aW1lKCkuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBfID0gdHhsLnNlbmQoTWVzc2FnZTo6U2RwKGNiKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9KSwKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gTWFyayBwcm9maWxlcyBhcyByZWFkeQotICAgICAgICBzZWxmLnByb2ZpbGVzX3JlYWR5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmbiB1cGRhdGVfbG9jYWxfYWRkcmVzcygmbXV0IHNlbGYsIGFkZHI6ICZSYXdBZGRyZXNzKSB7Ci0gICAgICAgIHNlbGYubG9jYWxfYWRkcmVzcyA9IFNvbWUoKmFkZHIpOwotCi0gICAgICAgIHNlbGYuZm9yX2FsbF9jYWxsYmFja3MofGNhbGxiYWNrfCB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbl9hZGRyZXNzX2NoYW5nZWQoc2VsZi5sb2NhbF9hZGRyZXNzLnVud3JhcCgpLnRvX3N0cmluZygpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gZm9yX2FsbF9jYWxsYmFja3M8RjogRm4oJkJveDxkeW4gSUJsdWV0b290aENhbGxiYWNrICsgU2VuZD4pPigmc2VsZiwgZjogRikgewotICAgICAgICBmb3IgKF8sIGNhbGxiYWNrKSBpbiBzZWxmLmNhbGxiYWNrcy5pdGVyKCkgewotICAgICAgICAgICAgZigmY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gZm9yX2FsbF9jb25uZWN0aW9uX2NhbGxiYWNrczxGOiBGbigmQm94PGR5biBJQmx1ZXRvb3RoQ29ubmVjdGlvbkNhbGxiYWNrICsgU2VuZD4pPigKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGY6IEYsCi0gICAgKSB7Ci0gICAgICAgIGZvciAoXywgY2FsbGJhY2spIGluIHNlbGYuY29ubmVjdGlvbl9jYWxsYmFja3MuaXRlcigpIHsKLSAgICAgICAgICAgIGYoJmNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YihjcmF0ZSkgZm4gY2FsbGJhY2tfZGlzY29ubmVjdGVkKCZtdXQgc2VsZiwgaWQ6IHUzMiwgY2JfdHlwZTogQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlKSB7Ci0gICAgICAgIG1hdGNoIGNiX3R5cGUgewotICAgICAgICAgICAgQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlOjpBZGFwdGVyID0+IHsKLSAgICAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmUoJmlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aENhbGxiYWNrVHlwZTo6Q29ubmVjdGlvbiA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uX2NhbGxiYWNrcy5yZW1vdmUoJmlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19Ci0KLSNbYnRpZl9jYWxsYmFja3NfZGlzcGF0Y2hlcihCbHVldG9vdGgsIGRpc3BhdGNoX2Jhc2VfY2FsbGJhY2tzLCBCYXNlQ2FsbGJhY2tzKV0KLXB1YihjcmF0ZSkgdHJhaXQgQnRpZkJsdWV0b290aENhbGxiYWNrcyB7Ci0gICAgI1tidGlmX2NhbGxiYWNrKEFkYXB0ZXJTdGF0ZSldCi0gICAgZm4gYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkKCZtdXQgc2VsZiwgc3RhdGU6IEJ0U3RhdGUpOwotCi0gICAgI1tidGlmX2NhbGxiYWNrKEFkYXB0ZXJQcm9wZXJ0aWVzKV0KLSAgICBmbiBhZGFwdGVyX3Byb3BlcnRpZXNfY2hhbmdlZCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBzdGF0dXM6IEJ0U3RhdHVzLAotICAgICAgICBudW1fcHJvcGVydGllczogaTMyLAotICAgICAgICBwcm9wZXJ0aWVzOiBWZWM8Qmx1ZXRvb3RoUHJvcGVydHk+LAotICAgICk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soRGV2aWNlRm91bmQpXQotICAgIGZuIGRldmljZV9mb3VuZCgmbXV0IHNlbGYsIG46IGkzMiwgcHJvcGVydGllczogVmVjPEJsdWV0b290aFByb3BlcnR5Pik7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soRGlzY292ZXJ5U3RhdGUpXQotICAgIGZuIGRpc2NvdmVyeV9zdGF0ZSgmbXV0IHNlbGYsIHN0YXRlOiBCdERpc2NvdmVyeVN0YXRlKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhTc3BSZXF1ZXN0KV0KLSAgICBmbiBzc3BfcmVxdWVzdCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICByZW1vdGVfYWRkcjogUmF3QWRkcmVzcywKLSAgICAgICAgcmVtb3RlX25hbWU6IFN0cmluZywKLSAgICAgICAgY29kOiB1MzIsCi0gICAgICAgIHZhcmlhbnQ6IEJ0U3NwVmFyaWFudCwKLSAgICAgICAgcGFzc2tleTogdTMyLAotICAgICk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soQm9uZFN0YXRlKV0KLSAgICBmbiBib25kX3N0YXRlKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIHN0YXR1czogQnRTdGF0dXMsCi0gICAgICAgIGFkZHI6IFJhd0FkZHJlc3MsCi0gICAgICAgIGJvbmRfc3RhdGU6IEJ0Qm9uZFN0YXRlLAotICAgICAgICBmYWlsX3JlYXNvbjogaTMyLAotICAgICk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soUmVtb3RlRGV2aWNlUHJvcGVydGllcyldCi0gICAgZm4gcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NoYW5nZWQoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgc3RhdHVzOiBCdFN0YXR1cywKLSAgICAgICAgYWRkcjogUmF3QWRkcmVzcywKLSAgICAgICAgbnVtX3Byb3BlcnRpZXM6IGkzMiwKLSAgICAgICAgcHJvcGVydGllczogVmVjPEJsdWV0b290aFByb3BlcnR5PiwKLSAgICApOwotCi0gICAgI1tidGlmX2NhbGxiYWNrKEFjbFN0YXRlKV0KLSAgICBmbiBhY2xfc3RhdGUoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgc3RhdHVzOiBCdFN0YXR1cywKLSAgICAgICAgYWRkcjogUmF3QWRkcmVzcywKLSAgICAgICAgc3RhdGU6IEJ0QWNsU3RhdGUsCi0gICAgICAgIGxpbmtfdHlwZTogQnRUcmFuc3BvcnQsCi0gICAgICAgIGhjaV9yZWFzb246IEJ0SGNpRXJyb3JDb2RlLAotICAgICk7Ci19Ci0KLSNbYnRpZl9jYWxsYmFja3NfZGlzcGF0Y2hlcihCbHVldG9vdGgsIGRpc3BhdGNoX3NkcF9jYWxsYmFja3MsIFNkcENhbGxiYWNrcyldCi1wdWIoY3JhdGUpIHRyYWl0IEJ0aWZTZHBDYWxsYmFja3MgewotICAgICNbYnRpZl9jYWxsYmFjayhTZHBTZWFyY2gpXQotICAgIGZuIHNkcF9zZWFyY2goCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgc3RhdHVzOiBCdFN0YXR1cywKLSAgICAgICAgYWRkcmVzczogUmF3QWRkcmVzcywKLSAgICAgICAgdXVpZDogVXVpZCwKLSAgICAgICAgY291bnQ6IGkzMiwKLSAgICAgICAgcmVjb3JkczogVmVjPEJ0U2RwUmVjb3JkPiwKLSAgICApOwotfQotCi1wdWIgZm4gZ2V0X2J0X2Rpc3BhdGNoZXIodHg6IFNlbmRlcjxNZXNzYWdlPikgLT4gQmFzZUNhbGxiYWNrc0Rpc3BhdGNoZXIgewotICAgIEJhc2VDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICAgICAgZGlzcGF0Y2g6IEJveDo6bmV3KG1vdmUgfGNifCB7Ci0gICAgICAgICAgICBsZXQgdHhsID0gdHguY2xvbmUoKTsKLSAgICAgICAgICAgIHRvcHN0YWNrOjpnZXRfcnVudGltZSgpLnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgICAgIGxldCBfID0gdHhsLnNlbmQoTWVzc2FnZTo6QmFzZShjYikpLmF3YWl0OwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pLAotICAgIH0KLX0KLQotaW1wbCBCdGlmQmx1ZXRvb3RoQ2FsbGJhY2tzIGZvciBCbHVldG9vdGggewotICAgIGZuIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZCgmbXV0IHNlbGYsIHN0YXRlOiBCdFN0YXRlKSB7Ci0gICAgICAgIGxldCBwcmV2X3N0YXRlID0gc2VsZi5zdGF0ZS5jbG9uZSgpOwotICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGU7Ci0KLSAgICAgICAgLy8gSWYgaXQncyB0aGUgc2FtZSBzdGF0ZSBhcyBiZWZvcmUsIG5vIGZ1cnRoZXIgYWN0aW9uCi0gICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gcHJldl9zdGF0ZSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJ0U3RhdGU6Ok9uIHsKLSAgICAgICAgICAgIHNlbGYuYmx1ZXRvb3RoX21lZGlhLmxvY2soKS51bndyYXAoKS5pbml0aWFsaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJ0U3RhdGU6Ok9mZiB7Ci0gICAgICAgICAgICBzZWxmLnByb3BlcnRpZXMuY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRyaWdnZXIgcHJvcGVydGllcyB1cGRhdGUKLSAgICAgICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuZ2V0X2FkYXB0ZXJfcHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgI1thbGxvdyh1bnVzZWRfdmFyaWFibGVzKV0KLSAgICBmbiBhZGFwdGVyX3Byb3BlcnRpZXNfY2hhbmdlZCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBzdGF0dXM6IEJ0U3RhdHVzLAotICAgICAgICBudW1fcHJvcGVydGllczogaTMyLAotICAgICAgICBwcm9wZXJ0aWVzOiBWZWM8Qmx1ZXRvb3RoUHJvcGVydHk+LAotICAgICkgewotICAgICAgICBpZiBzdGF0dXMgIT0gQnRTdGF0dXM6OlN1Y2Nlc3MgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHByb3BlcnR5IGNhY2hlCi0gICAgICAgIGZvciBwcm9wIGluIHByb3BlcnRpZXMgewotICAgICAgICAgICAgbWF0Y2ggJnByb3AgewotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpCZEFkZHIoYmRhZGRyKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2xvY2FsX2FkZHJlc3MoJmJkYWRkcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyQm9uZGVkRGV2aWNlcyhib25kbGlzdCkgPT4gewotICAgICAgICAgICAgICAgICAgICBmb3IgYWRkciBpbiBib25kbGlzdC5pdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZHJlc3MgPSBhZGRyLnRvX3N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYm9uZGVkIHN0YXRlIGlmIGFscmVhZHkgaW4gdGhlIGxpc3QuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRleHQgd2l0aCBlbXB0eSBwcm9wZXJ0aWVzIGFuZCBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ib25kZWRfZGV2aWNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRyeShhZGRyZXNzLmNsb25lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFuZF9tb2RpZnkofGR8IGQuYm9uZF9zdGF0ZSA9IEJ0Qm9uZFN0YXRlOjpCb25kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yX2luc2VydChCbHVldG9vdGhEZXZpY2VDb250ZXh0OjpuZXcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0Qm9uZFN0YXRlOjpCb25kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0QWNsU3RhdGU6OkRpc2Nvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlOjpuZXcoYWRkcmVzcy5jbG9uZSgpLCAiIi50b19zdHJpbmcoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYyFbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfID0+IHt9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGYucHJvcGVydGllcy5pbnNlcnQocHJvcC5nZXRfdHlwZSgpLCBwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZuIGRldmljZV9mb3VuZCgmbXV0IHNlbGYsIF9uOiBpMzIsIHByb3BlcnRpZXM6IFZlYzxCbHVldG9vdGhQcm9wZXJ0eT4pIHsKLSAgICAgICAgbGV0IGRldmljZSA9IEJsdWV0b290aERldmljZTo6ZnJvbV9wcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzKTsKLSAgICAgICAgbGV0IGFkZHJlc3MgPSBkZXZpY2UuYWRkcmVzcy5jbG9uZSgpOwotCi0gICAgICAgIGlmIGxldCBTb21lKGV4aXN0aW5nKSA9IHNlbGYuZm91bmRfZGV2aWNlcy5nZXRfbXV0KCZhZGRyZXNzKSB7Ci0gICAgICAgICAgICBleGlzdGluZy51cGRhdGVfcHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldCBkZXZpY2Vfd2l0aF9wcm9wcyA9IEJsdWV0b290aERldmljZUNvbnRleHQ6Om5ldygKLSAgICAgICAgICAgICAgICBCdEJvbmRTdGF0ZTo6Tm90Qm9uZGVkLAotICAgICAgICAgICAgICAgIEJ0QWNsU3RhdGU6OkRpc2Nvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcywKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBzZWxmLmZvdW5kX2RldmljZXMuaW5zZXJ0KGFkZHJlc3MuY2xvbmUoKSwgZGV2aWNlX3dpdGhfcHJvcHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGRldmljZSA9IHNlbGYuZm91bmRfZGV2aWNlcy5nZXQoJmFkZHJlc3MpLnVud3JhcCgpOwotCi0gICAgICAgIHNlbGYuZm9yX2FsbF9jYWxsYmFja3MofGNhbGxiYWNrfCB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbl9kZXZpY2VfZm91bmQoZGV2aWNlLmluZm8uY2xvbmUoKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIGZuIGRpc2NvdmVyeV9zdGF0ZSgmbXV0IHNlbGYsIHN0YXRlOiBCdERpc2NvdmVyeVN0YXRlKSB7Ci0gICAgICAgIC8vIENsZWFyIGZvdW5kIGRldmljZXMgd2hlbiBkaXNjb3Zlcnkgc2Vzc2lvbiBzdGFydHMKLSAgICAgICAgaWYgIXNlbGYuaXNfZGlzY292ZXJpbmcgJiYgJnN0YXRlID09ICZCdERpc2NvdmVyeVN0YXRlOjpTdGFydGVkIHsKLSAgICAgICAgICAgIHNlbGYuZm91bmRfZGV2aWNlcy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2FjaGUgZGlzY292ZXJpbmcgc3RhdGUKLSAgICAgICAgc2VsZi5pc19kaXNjb3ZlcmluZyA9ICZzdGF0ZSA9PSAmQnREaXNjb3ZlcnlTdGF0ZTo6U3RhcnRlZDsKLSAgICAgICAgaWYgc2VsZi5pc19kaXNjb3ZlcmluZyB7Ci0gICAgICAgICAgICBzZWxmLmRpc2NvdmVyaW5nX3N0YXJ0ZWQgPSBJbnN0YW50Ojpub3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYuZm9yX2FsbF9jYWxsYmFja3MofGNhbGxiYWNrfCB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbl9kaXNjb3ZlcmluZ19jaGFuZ2VkKHN0YXRlID09IEJ0RGlzY292ZXJ5U3RhdGU6OlN0YXJ0ZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBzc3BfcmVxdWVzdCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICByZW1vdGVfYWRkcjogUmF3QWRkcmVzcywKLSAgICAgICAgcmVtb3RlX25hbWU6IFN0cmluZywKLSAgICAgICAgY29kOiB1MzIsCi0gICAgICAgIHZhcmlhbnQ6IEJ0U3NwVmFyaWFudCwKLSAgICAgICAgcGFzc2tleTogdTMyLAotICAgICkgewotICAgICAgICAvLyBDdXJyZW50bHkgdGhpcyBzdXBwb3J0cyBtYW55IGFnZW50IGJlY2F1c2Ugd2UgYWNjZXB0IG1hbnkgY2FsbGJhY2tzLgotICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIGEgd2F5IHRvIHNlbGVjdCB0aGUgZGVmYXVsdCBhZ2VudC4KLSAgICAgICAgc2VsZi5mb3JfYWxsX2NhbGxiYWNrcyh8Y2FsbGJhY2t8IHsKLSAgICAgICAgICAgIGNhbGxiYWNrLm9uX3NzcF9yZXF1ZXN0KAotICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZTo6bmV3KHJlbW90ZV9hZGRyLnRvX3N0cmluZygpLCByZW1vdGVfbmFtZS5jbG9uZSgpKSwKLSAgICAgICAgICAgICAgICBjb2QsCi0gICAgICAgICAgICAgICAgdmFyaWFudC5jbG9uZSgpLAotICAgICAgICAgICAgICAgIHBhc3NrZXksCi0gICAgICAgICAgICApOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBib25kX3N0YXRlKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIHN0YXR1czogQnRTdGF0dXMsCi0gICAgICAgIGFkZHI6IFJhd0FkZHJlc3MsCi0gICAgICAgIGJvbmRfc3RhdGU6IEJ0Qm9uZFN0YXRlLAotICAgICAgICBfZmFpbF9yZWFzb246IGkzMiwKLSAgICApIHsKLSAgICAgICAgbGV0IGFkZHJlc3MgPSBhZGRyLnRvX3N0cmluZygpOwotCi0gICAgICAgIC8vIEVhc3kgY2FzZSBvZiBub3QgYm9uZGVkIC0tIHdlIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIGJvbmRlZCBsaXN0IGFuZCBjaGFuZ2UgdGhlIGJvbmQKLSAgICAgICAgLy8gc3RhdGUgaW4gdGhlIGZvdW5kIGxpc3QgKGluIGNhc2UgaXQgd2FzIHByZXZpb3VzbHkgYm9uZGluZykuCi0gICAgICAgIGlmICZib25kX3N0YXRlID09ICZCdEJvbmRTdGF0ZTo6Tm90Qm9uZGVkIHsKLSAgICAgICAgICAgIHNlbGYuYm9uZGVkX2RldmljZXMucmVtb3ZlKCZhZGRyZXNzKTsKLSAgICAgICAgICAgIHNlbGYuZm91bmRfZGV2aWNlcwotICAgICAgICAgICAgICAgIC5lbnRyeShhZGRyZXNzLmNsb25lKCkpCi0gICAgICAgICAgICAgICAgLmFuZF9tb2RpZnkofGR8IGQuYm9uZF9zdGF0ZSA9IGJvbmRfc3RhdGUuY2xvbmUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2Ugd2lsbCBvbmx5IGluc2VydCBpbnRvIHRoZSBib25kZWQgbGlzdCBhZnRlciBib25kaW5nIGlzIGNvbXBsZXRlCi0gICAgICAgIGVsc2UgaWYgJmJvbmRfc3RhdGUgPT0gJkJ0Qm9uZFN0YXRlOjpCb25kZWQgJiYgIXNlbGYuYm9uZGVkX2RldmljZXMuY29udGFpbnNfa2V5KCZhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBlaXRoZXIgbmVlZCB0byBjb25zdHJ1Y3QgYSBuZXcgQmx1ZXRvb3RoRGV2aWNlQ29udGV4dCBvciBncmFiIGl0IGZyb20gdGhlIGZvdW5kCi0gICAgICAgICAgICAvLyBkZXZpY2VzIG1hcAotICAgICAgICAgICAgbGV0IGRldmljZSA9IG1hdGNoIHNlbGYuZm91bmRfZGV2aWNlcy5yZW1vdmUoJmFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBTb21lKG11dCB2KSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYm9uZF9zdGF0ZSA9IGJvbmRfc3RhdGUuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgdgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBOb25lID0+IEJsdWV0b290aERldmljZUNvbnRleHQ6Om5ldygKLSAgICAgICAgICAgICAgICAgICAgYm9uZF9zdGF0ZS5jbG9uZSgpLAotICAgICAgICAgICAgICAgICAgICBCdEFjbFN0YXRlOjpEaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZTo6bmV3KGFkZHJlc3MuY2xvbmUoKSwgIiIudG9fc3RyaW5nKCkpLAotICAgICAgICAgICAgICAgICAgICB2ZWMhW10sCi0gICAgICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHNlbGYuYm9uZGVkX2RldmljZXMuaW5zZXJ0KGFkZHJlc3MuY2xvbmUoKSwgZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIGJvbmRpbmcsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmb3VuZCBkZXZpY2VzIGxpc3QKLSAgICAgICAgICAgIHNlbGYuZm91bmRfZGV2aWNlcwotICAgICAgICAgICAgICAgIC5lbnRyeShhZGRyZXNzLmNsb25lKCkpCi0gICAgICAgICAgICAgICAgLmFuZF9tb2RpZnkofGR8IGQuYm9uZF9zdGF0ZSA9IGJvbmRfc3RhdGUuY2xvbmUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIGJvbmQgc3RhdGUgY2hhbmdlZCBub3RpZmljYXRpb25zCi0gICAgICAgIHNlbGYuZm9yX2FsbF9jYWxsYmFja3MofGNhbGxiYWNrfCB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbl9ib25kX3N0YXRlX2NoYW5nZWQoCi0gICAgICAgICAgICAgICAgc3RhdHVzLnRvX3UzMigpLnVud3JhcCgpLAotICAgICAgICAgICAgICAgIGFkZHJlc3MuY2xvbmUoKSwKLSAgICAgICAgICAgICAgICBib25kX3N0YXRlLnRvX3UzMigpLnVud3JhcCgpLAotICAgICAgICAgICAgKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NoYW5nZWQoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgX3N0YXR1czogQnRTdGF0dXMsCi0gICAgICAgIGFkZHI6IFJhd0FkZHJlc3MsCi0gICAgICAgIF9udW1fcHJvcGVydGllczogaTMyLAotICAgICAgICBwcm9wZXJ0aWVzOiBWZWM8Qmx1ZXRvb3RoUHJvcGVydHk+LAotICAgICkgewotICAgICAgICBsZXQgYWRkcmVzcyA9IGFkZHIudG9fc3RyaW5nKCk7Ci0gICAgICAgIC8vIERldmljZSBzaG91bGQgYmUgaW4gZWl0aGVyIGZvdW5kIGRldmljZXMgb3IgYm9uZGVkIGRldmljZXMKLSAgICAgICAgLy8gSWYgaXQgaXNuJ3QgaW4gZWl0aGVyLCBjcmVhdGUgaXQgYW5kIHB1dCBpdCBmb3VuZCBkZXZpY2VzLgotICAgICAgICBsZXQgZGV2aWNlID0gaWYgc2VsZi5ib25kZWRfZGV2aWNlcy5jb250YWluc19rZXkoJmFkZHJlc3MpIHsKLSAgICAgICAgICAgIHNlbGYuYm9uZGVkX2RldmljZXMuZ2V0X211dCgmYWRkcmVzcykKLSAgICAgICAgfSBlbHNlIGlmIHNlbGYuZm91bmRfZGV2aWNlcy5jb250YWluc19rZXkoJmFkZHJlc3MpIHsKLSAgICAgICAgICAgIHNlbGYuZm91bmRfZGV2aWNlcy5nZXRfbXV0KCZhZGRyZXNzKQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VsZi5mb3VuZF9kZXZpY2VzLmluc2VydCgKLSAgICAgICAgICAgICAgICBhZGRyZXNzLmNsb25lKCksCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlQ29udGV4dDo6bmV3KAotICAgICAgICAgICAgICAgICAgICBCdEJvbmRTdGF0ZTo6Tm90Qm9uZGVkLAotICAgICAgICAgICAgICAgICAgICBCdEFjbFN0YXRlOjpEaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZTo6bmV3KGFkZHJlc3MuY2xvbmUoKSwgU3RyaW5nOjpmcm9tKCIiKSksCi0gICAgICAgICAgICAgICAgICAgIHZlYyFbXSwKLSAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgc2VsZi5mb3VuZF9kZXZpY2VzLmdldF9tdXQoJmFkZHJlc3MpCi0gICAgICAgIH07Ci0KLSAgICAgICAgZGV2aWNlLnVud3JhcCgpLnVwZGF0ZV9wcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIGZuIGFjbF9zdGF0ZSgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBzdGF0dXM6IEJ0U3RhdHVzLAotICAgICAgICBhZGRyOiBSYXdBZGRyZXNzLAotICAgICAgICBzdGF0ZTogQnRBY2xTdGF0ZSwKLSAgICAgICAgX2xpbmtfdHlwZTogQnRUcmFuc3BvcnQsCi0gICAgICAgIF9oY2lfcmVhc29uOiBCdEhjaUVycm9yQ29kZSwKLSAgICApIHsKLSAgICAgICAgaWYgc3RhdHVzICE9IEJ0U3RhdHVzOjpTdWNjZXNzIHsKLSAgICAgICAgICAgIHdhcm4hKCJDb25uZWN0aW9uIHRvIFt7fV0gZmFpbGVkLiBTdGF0dXM6IHs6P30iLCBhZGRyLnRvX3N0cmluZygpLCBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGFkZHJlc3MgPSBhZGRyLnRvX3N0cmluZygpOwotCi0gICAgICAgIGxldCBmb3VuZCA9IGlmIHNlbGYuYm9uZGVkX2RldmljZXMuY29udGFpbnNfa2V5KCZhZGRyZXNzKSB7Ci0gICAgICAgICAgICBzZWxmLmJvbmRlZF9kZXZpY2VzLmdldF9tdXQoJmFkZHJlc3MpCi0gICAgICAgIH0gZWxzZSBpZiBzZWxmLmZvdW5kX2RldmljZXMuY29udGFpbnNfa2V5KCZhZGRyZXNzKSB7Ci0gICAgICAgICAgICBzZWxmLmZvdW5kX2RldmljZXMuZ2V0X211dCgmYWRkcmVzcykKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbGYuZm91bmRfZGV2aWNlcy5pbnNlcnQoCi0gICAgICAgICAgICAgICAgYWRkcmVzcy5jbG9uZSgpLAotICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZUNvbnRleHQ6Om5ldygKLSAgICAgICAgICAgICAgICAgICAgQnRCb25kU3RhdGU6Ok5vdEJvbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgQnRBY2xTdGF0ZTo6RGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2U6Om5ldyhhZGRyZXNzLmNsb25lKCksIFN0cmluZzo6ZnJvbSgiIikpLAotICAgICAgICAgICAgICAgICAgICB2ZWMhW10sCi0gICAgICAgICAgICAgICAgKSwKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIHNlbGYuZm91bmRfZGV2aWNlcy5nZXRfbXV0KCZhZGRyZXNzKQotICAgICAgICB9OwotCi0gICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIHRoZXJlJ3MgYmVlbiBhIGNoYW5nZSBpbiBzdGF0ZQotICAgICAgICBsZXQgcHJldl9zdGF0ZSA9ICZmb3VuZC5hc19yZWYoKS51bndyYXAoKS5hY2xfc3RhdGU7Ci0gICAgICAgIGlmIHByZXZfc3RhdGUgIT0gJnN0YXRlIHsKLSAgICAgICAgICAgIGxldCBkZXZpY2UgPSBmb3VuZC5hc19yZWYoKS51bndyYXAoKS5pbmZvLmNsb25lKCk7Ci0gICAgICAgICAgICBmb3VuZC51bndyYXAoKS5hY2xfc3RhdGUgPSBzdGF0ZS5jbG9uZSgpOwotCi0gICAgICAgICAgICBtYXRjaCBzdGF0ZSB7Ci0gICAgICAgICAgICAgICAgQnRBY2xTdGF0ZTo6Q29ubmVjdGVkID0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JfYWxsX2Nvbm5lY3Rpb25fY2FsbGJhY2tzKHxjYWxsYmFja3wgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25fZGV2aWNlX2Nvbm5lY3RlZChkZXZpY2UuY2xvbmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdEFjbFN0YXRlOjpEaXNjb25uZWN0ZWQgPT4gewotICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcl9hbGxfY29ubmVjdGlvbl9jYWxsYmFja3MofGNhbGxiYWNrfCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbl9kZXZpY2VfZGlzY29ubmVjdGVkKGRldmljZS5jbG9uZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETzogQWRkIHVuaXQgdGVzdHMgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24KLWltcGwgSUJsdWV0b290aCBmb3IgQmx1ZXRvb3RoIHsKLSAgICBmbiByZWdpc3Rlcl9jYWxsYmFjaygmbXV0IHNlbGYsIG11dCBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoQ2FsbGJhY2sgKyBTZW5kPikgewotICAgICAgICBsZXQgdHggPSBzZWxmLnR4LmNsb25lKCk7Ci0KLSAgICAgICAgbGV0IGlkID0gY2FsbGJhY2sucmVnaXN0ZXJfZGlzY29ubmVjdChCb3g6Om5ldyhtb3ZlIHxjYl9pZHwgewotICAgICAgICAgICAgbGV0IHR4ID0gdHguY2xvbmUoKTsKLSAgICAgICAgICAgIHRva2lvOjpzcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgICAgICBsZXQgX3Jlc3VsdCA9IHR4Ci0gICAgICAgICAgICAgICAgICAgIC5zZW5kKE1lc3NhZ2U6OkJsdWV0b290aENhbGxiYWNrRGlzY29ubmVjdGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgY2JfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhDYWxsYmFja1R5cGU6OkFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgICAgICAgICAgIC5hd2FpdDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KSk7Ci0KLSAgICAgICAgc2VsZi5jYWxsYmFja3MuaW5zZXJ0KGlkLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgZm4gcmVnaXN0ZXJfY29ubmVjdGlvbl9jYWxsYmFjaygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBtdXQgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aENvbm5lY3Rpb25DYWxsYmFjayArIFNlbmQ+LAotICAgICkgLT4gdTMyIHsKLSAgICAgICAgbGV0IHR4ID0gc2VsZi50eC5jbG9uZSgpOwotCi0gICAgICAgIGxldCBpZCA9IGNhbGxiYWNrLnJlZ2lzdGVyX2Rpc2Nvbm5lY3QoQm94OjpuZXcobW92ZSB8Y2JfaWR8IHsKLSAgICAgICAgICAgIGxldCB0eCA9IHR4LmNsb25lKCk7Ci0gICAgICAgICAgICB0b2tpbzo6c3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgbGV0IF8gPSB0eAotICAgICAgICAgICAgICAgICAgICAuc2VuZChNZXNzYWdlOjpCbHVldG9vdGhDYWxsYmFja0Rpc2Nvbm5lY3RlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNiX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlOjpDb25uZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICApKQotICAgICAgICAgICAgICAgICAgICAuYXdhaXQ7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSkpOwotCi0gICAgICAgIHNlbGYuY29ubmVjdGlvbl9jYWxsYmFja3MuaW5zZXJ0KGlkLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgaWQKLSAgICB9Ci0KLSAgICBmbiB1bnJlZ2lzdGVyX2Nvbm5lY3Rpb25fY2FsbGJhY2soJm11dCBzZWxmLCBjYWxsYmFja19pZDogdTMyKSAtPiBib29sIHsKLSAgICAgICAgbWF0Y2ggc2VsZi5jb25uZWN0aW9uX2NhbGxiYWNrcy5nZXRfbXV0KCZjYWxsYmFja19pZCkgewotICAgICAgICAgICAgU29tZShjYikgPT4gY2IudW5yZWdpc3RlcihjYWxsYmFja19pZCksCi0gICAgICAgICAgICBOb25lID0+IGZhbHNlLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gZW5hYmxlKCZtdXQgc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuZW5hYmxlKCkgPT0gMAotICAgIH0KLQotICAgIGZuIGRpc2FibGUoJm11dCBzZWxmKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKS5kaXNhYmxlKCkgPT0gMAotICAgIH0KLQotICAgIGZuIGdldF9hZGRyZXNzKCZzZWxmKSAtPiBTdHJpbmcgewotICAgICAgICBtYXRjaCBzZWxmLmxvY2FsX2FkZHJlc3MgewotICAgICAgICAgICAgTm9uZSA9PiBTdHJpbmc6OmZyb20oIiIpLAotICAgICAgICAgICAgU29tZShhZGRyKSA9PiBhZGRyLnRvX3N0cmluZygpLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gZ2V0X3V1aWRzKCZzZWxmKSAtPiBWZWM8VXVpZDEyOEJpdD4gewotICAgICAgICBtYXRjaCBzZWxmLnByb3BlcnRpZXMuZ2V0KCZCdFByb3BlcnR5VHlwZTo6VXVpZHMpIHsKLSAgICAgICAgICAgIFNvbWUocHJvcCkgPT4gbWF0Y2ggcHJvcCB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlV1aWRzKHV1aWRzKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIHV1aWRzLml0ZXIoKS5tYXAofCZ4fCB4LnV1LmNsb25lKCkpLmNvbGxlY3Q6OjxWZWM8VXVpZDEyOEJpdD4+KCkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgXyA9PiB2ZWMhW10sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgXyA9PiB2ZWMhW10sCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmbiBnZXRfbmFtZSgmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgbWF0Y2ggc2VsZi5wcm9wZXJ0aWVzLmdldCgmQnRQcm9wZXJ0eVR5cGU6OkJkTmFtZSkgewotICAgICAgICAgICAgU29tZShwcm9wKSA9PiBtYXRjaCBwcm9wIHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QmROYW1lKG5hbWUpID0+IG5hbWUuY2xvbmUoKSwKLSAgICAgICAgICAgICAgICBfID0+IFN0cmluZzo6bmV3KCksCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgXyA9PiBTdHJpbmc6Om5ldygpLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gc2V0X25hbWUoJnNlbGYsIG5hbWU6IFN0cmluZykgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuc2V0X2FkYXB0ZXJfcHJvcGVydHkoQmx1ZXRvb3RoUHJvcGVydHk6OkJkTmFtZShuYW1lKSkgPT0gMAotICAgIH0KLQotICAgIGZuIHN0YXJ0X2Rpc2NvdmVyeSgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuc3RhcnRfZGlzY292ZXJ5KCkgPT0gMAotICAgIH0KLQotICAgIGZuIGNhbmNlbF9kaXNjb3ZlcnkoJnNlbGYpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmludGYubG9jaygpLnVud3JhcCgpLmNhbmNlbF9kaXNjb3ZlcnkoKSA9PSAwCi0gICAgfQotCi0gICAgZm4gaXNfZGlzY292ZXJpbmcoJnNlbGYpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmlzX2Rpc2NvdmVyaW5nCi0gICAgfQotCi0gICAgZm4gZ2V0X2Rpc2NvdmVyeV9lbmRfbWlsbGlzKCZzZWxmKSAtPiB1NjQgewotICAgICAgICBpZiAhc2VsZi5pc19kaXNjb3ZlcmluZyB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG1hdGNoIHNlbGYucHJvcGVydGllcy5nZXQoJkJ0UHJvcGVydHlUeXBlOjpBZGFwdGVyRGlzY292ZXJ5VGltZW91dCkgewotICAgICAgICAgICAgU29tZSh2YXJpYW50KSA9PiBtYXRjaCB2YXJpYW50IHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QWRhcHRlckRpc2NvdmVyeVRpbWVvdXQodGltZW91dCkgPT4gewotICAgICAgICAgICAgICAgICAgICBsZXQgc2Vjb25kczogdTY0ID0gKCp0aW1lb3V0KS5pbnRvKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBlbGFwc2VkID0gc2VsZi5kaXNjb3ZlcmluZ19zdGFydGVkLmVsYXBzZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgZWxhcHNlZC5hc19zZWNzKCkgPj0gc2Vjb25kcyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICogMTAwMCAtIGVsYXBzZWQuYXNfbWlsbGlzKCkgYXMgdTY0Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgXyA9PiAwLAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIF8gPT4gMCwKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZuIGNyZWF0ZV9ib25kKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSwgdHJhbnNwb3J0OiBCdFRyYW5zcG9ydCkgLT4gYm9vbCB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSk7Ci0KLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIkNhbid0IGNyZWF0ZSBib25kLiBBZGRyZXNzIHt9IGlzIG5vdCB2YWxpZCIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBhZGRyZXNzID0gYWRkci51bndyYXAoKTsKLSAgICAgICAgc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKS5jcmVhdGVfYm9uZCgmYWRkcmVzcywgdHJhbnNwb3J0KSA9PSAwCi0gICAgfQotCi0gICAgZm4gY2FuY2VsX2JvbmRfcHJvY2Vzcygmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IGJvb2wgewotICAgICAgICBsZXQgYWRkciA9IFJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGRldmljZS5hZGRyZXNzLmNsb25lKCkpOwotCi0gICAgICAgIGlmIGFkZHIuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHdhcm4hKCJDYW4ndCBjYW5jZWwgYm9uZC4gQWRkcmVzcyB7fSBpcyBub3QgdmFsaWQuIiwgZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGFkZHJlc3MgPSBhZGRyLnVud3JhcCgpOwotICAgICAgICBzZWxmLmludGYubG9jaygpLnVud3JhcCgpLmNhbmNlbF9ib25kKCZhZGRyZXNzKSA9PSAwCi0gICAgfQotCi0gICAgZm4gcmVtb3ZlX2JvbmQoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiBib29sIHsKLSAgICAgICAgbGV0IGFkZHIgPSBSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhkZXZpY2UuYWRkcmVzcy5jbG9uZSgpKTsKLQotICAgICAgICBpZiBhZGRyLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICB3YXJuISgiQ2FuJ3QgcmVtb3ZlIGJvbmQuIEFkZHJlc3Mge30gaXMgbm90IHZhbGlkLiIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBhZGRyZXNzID0gYWRkci51bndyYXAoKTsKLSAgICAgICAgc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKS5yZW1vdmVfYm9uZCgmYWRkcmVzcykgPT0gMAotICAgIH0KLQotICAgIGZuIGdldF9ib25kZWRfZGV2aWNlcygmc2VsZikgLT4gVmVjPEJsdWV0b290aERldmljZT4gewotICAgICAgICBsZXQgbXV0IGRldmljZXM6IFZlYzxCbHVldG9vdGhEZXZpY2U+ID0gdmVjIVtdOwotCi0gICAgICAgIGZvciAoXywgZGV2aWNlKSBpbiBzZWxmLmJvbmRlZF9kZXZpY2VzLml0ZXIoKSB7Ci0gICAgICAgICAgICBkZXZpY2VzLnB1c2goZGV2aWNlLmluZm8uY2xvbmUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXZpY2VzCi0gICAgfQotCi0gICAgZm4gZ2V0X2JvbmRfc3RhdGUoJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlKSAtPiB1MzIgewotICAgICAgICBtYXRjaCBzZWxmLmJvbmRlZF9kZXZpY2VzLmdldCgmZGV2aWNlLmFkZHJlc3MpIHsKLSAgICAgICAgICAgIFNvbWUoZGV2aWNlKSA9PiBkZXZpY2UuYm9uZF9zdGF0ZS50b191MzIoKS51bndyYXAoKSwKLSAgICAgICAgICAgIE5vbmUgPT4gQnRCb25kU3RhdGU6Ok5vdEJvbmRlZC50b191MzIoKS51bndyYXAoKSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZuIHNldF9waW4oJnNlbGYsIGRldmljZTogQmx1ZXRvb3RoRGV2aWNlLCBhY2NlcHQ6IGJvb2wsIGxlbjogdTMyLCBwaW5fY29kZTogVmVjPHU4PikgLT4gYm9vbCB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSk7Ci0KLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIkNhbid0IHNldCBwaW4uIEFkZHJlc3Mge30gaXMgbm90IHZhbGlkLiIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIGxlbiBhcyB1c2l6ZSAhPSBwaW5fY29kZS5sZW4oKSB8fCBsZW4gPiAxNiB7Ci0gICAgICAgICAgICB3YXJuISgiSW52YWxpZCBwaW4gY29kZSBsZW5ndGg6IHt9IiwgbGVuKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBpc19ib25kaW5nID0gbWF0Y2ggc2VsZi5mb3VuZF9kZXZpY2VzLmdldCgmZGV2aWNlLmFkZHJlc3MpIHsKLSAgICAgICAgICAgIFNvbWUoZCkgPT4gZC5ib25kX3N0YXRlID09IEJ0Qm9uZFN0YXRlOjpCb25kaW5nLAotICAgICAgICAgICAgTm9uZSA9PiBmYWxzZSwKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAhaXNfYm9uZGluZyB7Ci0gICAgICAgICAgICB3YXJuISgiQ2FuJ3Qgc2V0IHBpbi4gRGV2aWNlIHt9IGlzbid0IGJvbmRpbmcuIiwgZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IG11dCBidHBpbjogQnRQaW5Db2RlID0gQnRQaW5Db2RlIHsgcGluOiBbMDsgMTZdIH07Ci0gICAgICAgIGJ0cGluLnBpbi5jb3B5X2Zyb21fc2xpY2UocGluX2NvZGUuYXNfc2xpY2UoKSk7Ci0KLSAgICAgICAgc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKS5waW5fcmVwbHkoJmFkZHIudW53cmFwKCksIGFjY2VwdCBhcyB1OCwgbGVuIGFzIHU4LCAmbXV0IGJ0cGluKQotICAgICAgICAgICAgPT0gMAotICAgIH0KLQotICAgIGZuIHNldF9wYXNza2V5KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsCi0gICAgICAgIGFjY2VwdDogYm9vbCwKLSAgICAgICAgbGVuOiB1MzIsCi0gICAgICAgIHBhc3NrZXk6IFZlYzx1OD4sCi0gICAgKSAtPiBib29sIHsKLSAgICAgICAgbGV0IGFkZHIgPSBSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhkZXZpY2UuYWRkcmVzcy5jbG9uZSgpKTsKLQotICAgICAgICBpZiBhZGRyLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICB3YXJuISgiQ2FuJ3Qgc2V0IHBhc3NrZXkuIEFkZHJlc3Mge30gaXMgbm90IHZhbGlkLiIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBpc19ib25kaW5nID0gbWF0Y2ggc2VsZi5mb3VuZF9kZXZpY2VzLmdldCgmZGV2aWNlLmFkZHJlc3MpIHsKLSAgICAgICAgICAgIFNvbWUoZCkgPT4gZC5ib25kX3N0YXRlID09IEJ0Qm9uZFN0YXRlOjpCb25kaW5nLAotICAgICAgICAgICAgTm9uZSA9PiBmYWxzZSwKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAhaXNfYm9uZGluZyB7Ci0gICAgICAgICAgICB3YXJuISgiQ2FuJ3Qgc2V0IHBhc3NrZXkuIERldmljZSB7fSBpc24ndCBib25kaW5nLiIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIGxlbiBhcyB1c2l6ZSAhPSBwYXNza2V5LmxlbigpIHx8IGxlbiAhPSA0IHsKLSAgICAgICAgICAgIHdhcm4hKCJJbnZhbGlkIHBhc3NrZXkgbGVuZ3RoOiB7fSIsIGxlbik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgbXV0IHRtcDogW3U4OyA0XSA9IFswOyA0XTsKLSAgICAgICAgdG1wLmNvcHlfZnJvbV9zbGljZShwYXNza2V5LmFzX3NsaWNlKCkpOwotICAgICAgICBsZXQgcGFzc2tleSA9IHUzMjo6ZnJvbV9uZV9ieXRlcyh0bXApOwotCi0gICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuc3NwX3JlcGx5KAotICAgICAgICAgICAgJmFkZHIudW53cmFwKCksCi0gICAgICAgICAgICBCdFNzcFZhcmlhbnQ6OlBhc3NrZXlFbnRyeSwKLSAgICAgICAgICAgIGFjY2VwdCBhcyB1OCwKLSAgICAgICAgICAgIHBhc3NrZXksCi0gICAgICAgICkgPT0gMAotICAgIH0KLQotICAgIGZuIHNldF9wYWlyaW5nX2NvbmZpcm1hdGlvbigmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIGFjY2VwdDogYm9vbCkgLT4gYm9vbCB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSk7Ci0KLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIkNhbid0IHNldCBwYWlyaW5nIGNvbmZpcm1hdGlvbi4gQWRkcmVzcyB7fSBpcyBub3QgdmFsaWQuIiwgZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGlzX2JvbmRpbmcgPSBtYXRjaCBzZWxmLmZvdW5kX2RldmljZXMuZ2V0KCZkZXZpY2UuYWRkcmVzcykgewotICAgICAgICAgICAgU29tZShkKSA9PiBkLmJvbmRfc3RhdGUgPT0gQnRCb25kU3RhdGU6OkJvbmRpbmcsCi0gICAgICAgICAgICBOb25lID0+IGZhbHNlLAotICAgICAgICB9OwotCi0gICAgICAgIGlmICFpc19ib25kaW5nIHsKLSAgICAgICAgICAgIHdhcm4hKCJDYW4ndCBzZXQgcGFpcmluZyBjb25maXJtYXRpb24uIERldmljZSB7fSBpc24ndCBib25kaW5nLiIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuc3NwX3JlcGx5KAotICAgICAgICAgICAgJmFkZHIudW53cmFwKCksCi0gICAgICAgICAgICBCdFNzcFZhcmlhbnQ6OlBhc3NrZXlDb25maXJtYXRpb24sCi0gICAgICAgICAgICBhY2NlcHQgYXMgdTgsCi0gICAgICAgICAgICAwLAotICAgICAgICApID09IDAKLSAgICB9Ci0KLSAgICBmbiBnZXRfY29ubmVjdGlvbl9zdGF0ZSgmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IHUzMiB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSk7Ci0KLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIkNhbid0IGNoZWNrIGNvbm5lY3Rpb24gc3RhdGUuIEFkZHJlc3Mge30gaXMgbm90IHZhbGlkLiIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKS5nZXRfY29ubmVjdGlvbl9zdGF0ZSgmYWRkci51bndyYXAoKSkKLSAgICB9Ci0KLSAgICBmbiBnZXRfcmVtb3RlX3V1aWRzKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gVmVjPFV1aWQxMjhCaXQ+IHsKLSAgICAgICAgLy8gRGV2aWNlIG11c3QgZXhpc3QgaW4gZWl0aGVyIGJvbmRlZCBvciBmb3VuZCBsaXN0Ci0gICAgICAgIGxldCBmb3VuZCA9IHNlbGYKLSAgICAgICAgICAgIC5ib25kZWRfZGV2aWNlcwotICAgICAgICAgICAgLmdldCgmZGV2aWNlLmFkZHJlc3MpCi0gICAgICAgICAgICAub3JfZWxzZSh8fCBzZWxmLmZvdW5kX2RldmljZXMuZ2V0KCZkZXZpY2UuYWRkcmVzcykpOwotCi0gICAgICAgIC8vIEV4dHJhY3QgcHJvcGVydHkgZnJvbSB0aGUgZGV2aWNlCi0gICAgICAgIHJldHVybiBmb3VuZAotICAgICAgICAgICAgLmFuZF90aGVuKHxkfCB7Ci0gICAgICAgICAgICAgICAgaWYgbGV0IFNvbWUodSkgPSBkLnByb3BlcnRpZXMuZ2V0KCZCdFByb3BlcnR5VHlwZTo6VXVpZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6VXVpZHModXVpZHMpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU29tZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZHMuaXRlcigpLm1hcCh8Jnh8IHgudXUuY2xvbmUoKSkuY29sbGVjdDo6PFZlYzxVdWlkMTI4Qml0Pj4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgXyA9PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE5vbmUKLSAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAudW53cmFwX29yKHZlYyFbXSk7Ci0gICAgfQotCi0gICAgZm4gZmV0Y2hfcmVtb3RlX3V1aWRzKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbCB7Ci0gICAgICAgIGlmICFzZWxmLmJvbmRlZF9kZXZpY2VzLmNvbnRhaW5zX2tleSgmZGV2aWNlLmFkZHJlc3MpCi0gICAgICAgICAgICAmJiAhc2VsZi5mb3VuZF9kZXZpY2VzLmNvbnRhaW5zX2tleSgmZGV2aWNlLmFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdhcm4hKCJXb24ndCBmZXRjaCBVVUlEcyBvbiB1bmtub3duIGRldmljZSB7fSIsIGRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSk7Ci0gICAgICAgIGlmIGFkZHIuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHdhcm4hKCJDYW4ndCBmZXRjaCBVVUlEcy4gQWRkcmVzcyB7fSBpcyBub3QgdmFsaWQuIiwgZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkuZ2V0X3JlbW90ZV9zZXJ2aWNlcygmbXV0IGFkZHIudW53cmFwKCksIEJ0VHJhbnNwb3J0OjpBdXRvKSA9PSAwCi0gICAgfQotCi0gICAgZm4gc2RwX3NlYXJjaCgmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UsIHV1aWQ6IFV1aWQxMjhCaXQpIC0+IGJvb2wgewotICAgICAgICBpZiBzZWxmLnNkcC5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIlNEUCBpcyBub3QgaW5pdGlhbGl6ZWQuIENhbid0IGRvIFNEUCBzZWFyY2guIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgYWRkciA9IFJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGRldmljZS5hZGRyZXNzLmNsb25lKCkpOwotICAgICAgICBpZiBhZGRyLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICB3YXJuISgiQ2FuJ3QgU0RQIHNlYXJjaC4gQWRkcmVzcyB7fSBpcyBub3QgdmFsaWQuIiwgZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IHV1ID0gVXVpZCB7IHV1OiB1dWlkIH07Ci0gICAgICAgIHNlbGYuc2RwLmFzX3JlZigpLnVud3JhcCgpLnNkcF9zZWFyY2goJm11dCBhZGRyLnVud3JhcCgpLCAmdXUpID09IEJ0U3RhdHVzOjpTdWNjZXNzCi0gICAgfQotCi0gICAgZm4gY29ubmVjdF9hbGxfZW5hYmxlZF9wcm9maWxlcygmc2VsZiwgZGV2aWNlOiBCbHVldG9vdGhEZXZpY2UpIC0+IGJvb2wgewotICAgICAgICAvLyBQcm9maWxlIGluaXQgbXVzdCBiZSBjb21wbGV0ZSBiZWZvcmUgdGhpcyBhcGkgaXMgY2FsbGFibGUKLSAgICAgICAgaWYgIXNlbGYucHJvZmlsZXNfcmVhZHkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGFkZHIgPSBSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhkZXZpY2UuYWRkcmVzcy5jbG9uZSgpKTsKLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIkNhbid0IGNvbm5lY3QgcHJvZmlsZXMgb24gaW52YWxpZCBhZGRyZXNzIFt7fV0iLCAmZGV2aWNlLmFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgYWxsIHJlbW90ZSB1dWlkcyB0byBzZWUgaWYgdGhleSBtYXRjaCBlbmFibGVkIHByb2ZpbGVzIGFuZCBjb25uZWN0IHRoZW0uCi0gICAgICAgIGxldCB1dWlkcyA9IHNlbGYuZ2V0X3JlbW90ZV91dWlkcyhkZXZpY2UuY2xvbmUoKSk7Ci0gICAgICAgIGZvciB1dWlkIGluIHV1aWRzLml0ZXIoKSB7Ci0gICAgICAgICAgICBtYXRjaCBzZWxmLnV1aWRfaGVscGVyLmlzX2tub3duX3Byb2ZpbGUodXVpZCkgewotICAgICAgICAgICAgICAgIFNvbWUocCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnV1aWRfaGVscGVyLmlzX3Byb2ZpbGVfZW5hYmxlZCgmcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZTo6SGlkIHwgUHJvZmlsZTo6SG9ncCA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGguYXNfcmVmKCkudW53cmFwKCkuY29ubmVjdCgmbXV0IGFkZHIudW53cmFwKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGU6OkEyZHBTaW5rIHwgUHJvZmlsZTo6QTJkcFNvdXJjZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eGwgPSBzZWxmLnR4LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRyZXNzID0gZGV2aWNlLmFkZHJlc3MuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wc3RhY2s6OmdldF9ydW50aW1lKCkuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgXyA9IHR4bAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kKE1lc3NhZ2U6Ok1lZGlhKE1lZGlhQWN0aW9uczo6Q29ubmVjdChhZGRyZXNzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF3YWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY29ubmVjdCBtb3N0IHByb2ZpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXyA9PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfID0+IHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmbiBkaXNjb25uZWN0X2FsbF9lbmFibGVkX3Byb2ZpbGVzKCZzZWxmLCBkZXZpY2U6IEJsdWV0b290aERldmljZSkgLT4gYm9vbCB7Ci0gICAgICAgIGlmICFzZWxmLnByb2ZpbGVzX3JlYWR5IHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmFkZHJlc3MuY2xvbmUoKSk7Ci0gICAgICAgIGlmIGFkZHIuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHdhcm4hKCJDYW4ndCBjb25uZWN0IHByb2ZpbGVzIG9uIGludmFsaWQgYWRkcmVzcyBbe31dIiwgJmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCB1dWlkcyA9IHNlbGYuZ2V0X3JlbW90ZV91dWlkcyhkZXZpY2UuY2xvbmUoKSk7Ci0gICAgICAgIGZvciB1dWlkIGluIHV1aWRzLml0ZXIoKSB7Ci0gICAgICAgICAgICBtYXRjaCBzZWxmLnV1aWRfaGVscGVyLmlzX2tub3duX3Byb2ZpbGUodXVpZCkgewotICAgICAgICAgICAgICAgIFNvbWUocCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnV1aWRfaGVscGVyLmlzX3Byb2ZpbGVfZW5hYmxlZCgmcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZTo6SGlkIHwgUHJvZmlsZTo6SG9ncCA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGguYXNfcmVmKCkudW53cmFwKCkuZGlzY29ubmVjdCgmbXV0IGFkZHIudW53cmFwKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGU6OkEyZHBTaW5rIHwgUHJvZmlsZTo6QTJkcFNvdXJjZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eGwgPSBzZWxmLnR4LmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRyZXNzID0gZGV2aWNlLmFkZHJlc3MuY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wc3RhY2s6OmdldF9ydW50aW1lKCkuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgXyA9IHR4bAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kKE1lc3NhZ2U6Ok1lZGlhKE1lZGlhQWN0aW9uczo6RGlzY29ubmVjdChhZGRyZXNzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF3YWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBjb25uZWN0IG1vc3QgcHJvZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfID0+ICgpLAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF8gPT4ge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotaW1wbCBCdGlmU2RwQ2FsbGJhY2tzIGZvciBCbHVldG9vdGggewotICAgIGZuIHNkcF9zZWFyY2goCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgc3RhdHVzOiBCdFN0YXR1cywKLSAgICAgICAgYWRkcmVzczogUmF3QWRkcmVzcywKLSAgICAgICAgdXVpZDogVXVpZCwKLSAgICAgICAgX2NvdW50OiBpMzIsCi0gICAgICAgIF9yZWNvcmRzOiBWZWM8QnRTZHBSZWNvcmQ+LAotICAgICkgewotICAgICAgICBkZWJ1ZyEoCi0gICAgICAgICAgICAiU2RwIHNlYXJjaCByZXN1bHQgZm91bmQ6IFN0YXR1cyh7Oj99KSBBZGRyZXNzKHs6P30pIFV1aWQoezo/fSkiLAotICAgICAgICAgICAgc3RhdHVzLCBhZGRyZXNzLCB1dWlkCi0gICAgICAgICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9saW51eC9zdGFjay9zcmMvYmx1ZXRvb3RoX2dhdHQucnMgYi9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9ibHVldG9vdGhfZ2F0dC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwZjYxYy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9ibHVldG9vdGhfZ2F0dC5ycworKysgL2Rldi9udWxsCkBAIC0xLDE0OTIgKzAsMCBAQAotLy8hIEFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIEdBVFQgQVBJIChJQmx1ZXRvb3RoR2F0dCkuCi0KLXVzZSBidGlmX21hY3Jvczo6e2J0aWZfY2FsbGJhY2ssIGJ0aWZfY2FsbGJhY2tzX2Rpc3BhdGNoZXJ9OwotCi11c2UgYnRfdG9wc2hpbTo6YmluZGluZ3M6OnJvb3Q6OmJsdWV0b290aDo6VXVpZDsKLXVzZSBidF90b3BzaGltOjpidGlmOjp7Qmx1ZXRvb3RoSW50ZXJmYWNlLCBSYXdBZGRyZXNzLCBVdWlkMTI4Qml0fTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6Z2F0dDo6ewotICAgIEJ0R2F0dERiRWxlbWVudCwgQnRHYXR0Tm90aWZ5UGFyYW1zLCBCdEdhdHRSZWFkUGFyYW1zLCBHYXR0LCBHYXR0Q2xpZW50Q2FsbGJhY2tzLAotICAgIEdhdHRDbGllbnRDYWxsYmFja3NEaXNwYXRjaGVyLCBHYXR0U2VydmVyQ2FsbGJhY2tzRGlzcGF0Y2hlciwgR2F0dFN0YXR1cywKLX07Ci11c2UgYnRfdG9wc2hpbTo6dG9wc3RhY2s7Ci0KLXVzZSBsb2c6OntkZWJ1Zywgd2Fybn07Ci11c2UgbnVtX3RyYWl0czo6Y2FzdDo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoU2V0OwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjpTZW5kZXI7Ci0KLXVzZSBjcmF0ZTo6e01lc3NhZ2UsIFJQQ1Byb3h5fTsKLQotc3RydWN0IENsaWVudCB7Ci0gICAgaWQ6IE9wdGlvbjxpMzI+LAotICAgIHV1aWQ6IFV1aWQxMjhCaXQsCi0gICAgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aEdhdHRDYWxsYmFjayArIFNlbmQ+LAotICAgIGlzX2Nvbmdlc3RlZDogYm9vbCwKLQotICAgIC8vIFF1ZXVlZCBvbl9jaGFyYWN0ZXJpc3RpY193cml0ZSBjYWxsYmFjay4KLSAgICBjb25nZXN0aW9uX3F1ZXVlOiBWZWM8KFN0cmluZywgaTMyLCBpMzIpPiwKLX0KLQotc3RydWN0IENvbm5lY3Rpb24gewotICAgIGNvbm5faWQ6IGkzMiwKLSAgICBhZGRyZXNzOiBTdHJpbmcsCi0gICAgY2xpZW50X2lkOiBpMzIsCi19Ci0KLXN0cnVjdCBDb250ZXh0TWFwIHsKLSAgICAvLyBUT0RPKGIvMTk2NjM1NTMwKTogQ29uc2lkZXIgdXNpbmcgYG11bHRpbWFwYCBmb3IgYSBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBnZXQgYnkKLSAgICAvLyBtdWx0aXBsZSBrZXlzLgotICAgIGNsaWVudHM6IFZlYzxDbGllbnQ+LAotICAgIGNvbm5lY3Rpb25zOiBWZWM8Q29ubmVjdGlvbj4sCi19Ci0KLWltcGwgQ29udGV4dE1hcCB7Ci0gICAgZm4gbmV3KCkgLT4gQ29udGV4dE1hcCB7Ci0gICAgICAgIENvbnRleHRNYXAgeyBjbGllbnRzOiB2ZWMhW10sIGNvbm5lY3Rpb25zOiB2ZWMhW10gfQotICAgIH0KLQotICAgIGZuIGdldF9ieV91dWlkKCZzZWxmLCB1dWlkOiAmVXVpZDEyOEJpdCkgLT4gT3B0aW9uPCZDbGllbnQ+IHsKLSAgICAgICAgc2VsZi5jbGllbnRzLml0ZXIoKS5maW5kKHxjbGllbnR8IGNsaWVudC51dWlkID09ICp1dWlkKQotICAgIH0KLQotICAgIGZuIGdldF9ieV9jbGllbnRfaWQoJnNlbGYsIGNsaWVudF9pZDogaTMyKSAtPiBPcHRpb248JkNsaWVudD4gewotICAgICAgICBzZWxmLmNsaWVudHMuaXRlcigpLmZpbmQofGNsaWVudHwgY2xpZW50LmlkLmlzX3NvbWUoKSAmJiBjbGllbnQuaWQudW53cmFwKCkgPT0gY2xpZW50X2lkKQotICAgIH0KLQotICAgIGZuIGdldF9ieV9jbGllbnRfaWRfbXV0KCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIpIC0+IE9wdGlvbjwmbXV0IENsaWVudD4gewotICAgICAgICBzZWxmLmNsaWVudHMKLSAgICAgICAgICAgIC5pdGVyX211dCgpCi0gICAgICAgICAgICAuZmluZCh8Y2xpZW50fCBjbGllbnQuaWQuaXNfc29tZSgpICYmIGNsaWVudC5pZC51bndyYXAoKSA9PSBjbGllbnRfaWQpCi0gICAgfQotCi0gICAgZm4gZ2V0X2FkZHJlc3NfYnlfY29ubl9pZCgmc2VsZiwgY29ubl9pZDogaTMyKSAtPiBPcHRpb248U3RyaW5nPiB7Ci0gICAgICAgIG1hdGNoIHNlbGYuY29ubmVjdGlvbnMuaXRlcigpLmZpbmQofGNvbm58IGNvbm4uY29ubl9pZCA9PSBjb25uX2lkKSB7Ci0gICAgICAgICAgICBOb25lID0+IE5vbmUsCi0gICAgICAgICAgICBTb21lKGNvbm4pID0+IFNvbWUoY29ubi5hZGRyZXNzLmNsb25lKCkpLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gZ2V0X2NsaWVudF9ieV9jb25uX2lkKCZzZWxmLCBjb25uX2lkOiBpMzIpIC0+IE9wdGlvbjwmQ2xpZW50PiB7Ci0gICAgICAgIG1hdGNoIHNlbGYuY29ubmVjdGlvbnMuaXRlcigpLmZpbmQofGNvbm58IGNvbm4uY29ubl9pZCA9PSBjb25uX2lkKSB7Ci0gICAgICAgICAgICBOb25lID0+IE5vbmUsCi0gICAgICAgICAgICBTb21lKGNvbm4pID0+IHNlbGYuZ2V0X2J5X2NsaWVudF9pZChjb25uLmNsaWVudF9pZCksCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmbiBnZXRfY2xpZW50X2J5X2Nvbm5faWRfbXV0KCZtdXQgc2VsZiwgY29ubl9pZDogaTMyKSAtPiBPcHRpb248Jm11dCBDbGllbnQ+IHsKLSAgICAgICAgbGV0IGNsaWVudF9pZCA9IG1hdGNoIHNlbGYuY29ubmVjdGlvbnMuaXRlcigpLmZpbmQofGNvbm58IGNvbm4uY29ubl9pZCA9PSBjb25uX2lkKSB7Ci0gICAgICAgICAgICBOb25lID0+IHJldHVybiBOb25lLAotICAgICAgICAgICAgU29tZShjb25uKSA9PiBjb25uLmNsaWVudF9pZCwKLSAgICAgICAgfTsKLQotICAgICAgICBzZWxmLmdldF9ieV9jbGllbnRfaWRfbXV0KGNsaWVudF9pZCkKLSAgICB9Ci0KLSAgICBmbiBhZGQoJm11dCBzZWxmLCB1dWlkOiAmVXVpZDEyOEJpdCwgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aEdhdHRDYWxsYmFjayArIFNlbmQ+KSB7Ci0gICAgICAgIGlmIHNlbGYuZ2V0X2J5X3V1aWQodXVpZCkuaXNfc29tZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYuY2xpZW50cy5wdXNoKENsaWVudCB7Ci0gICAgICAgICAgICBpZDogTm9uZSwKLSAgICAgICAgICAgIHV1aWQ6IHV1aWQuY2xvbmUoKSwKLSAgICAgICAgICAgIGNhbGxiYWNrLAotICAgICAgICAgICAgaXNfY29uZ2VzdGVkOiBmYWxzZSwKLSAgICAgICAgICAgIGNvbmdlc3Rpb25fcXVldWU6IHZlYyFbXSwKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gcmVtb3ZlKCZtdXQgc2VsZiwgaWQ6IGkzMikgewotICAgICAgICBzZWxmLmNsaWVudHMucmV0YWluKHxjbGllbnR8ICEoY2xpZW50LmlkLmlzX3NvbWUoKSAmJiBjbGllbnQuaWQudW53cmFwKCkgPT0gaWQpKTsKLSAgICB9Ci0KLSAgICBmbiBzZXRfY2xpZW50X2lkKCZtdXQgc2VsZiwgdXVpZDogJlV1aWQxMjhCaXQsIGlkOiBpMzIpIHsKLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY2xpZW50cy5pdGVyX211dCgpLmZpbmQofGNsaWVudHwgY2xpZW50LnV1aWQgPT0gKnV1aWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5pZCA9IFNvbWUoaWQpOwotICAgIH0KLQotICAgIGZuIGFkZF9jb25uZWN0aW9uKCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGNvbm5faWQ6IGkzMiwgYWRkcmVzczogJlN0cmluZykgewotICAgICAgICBpZiBzZWxmLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsIGFkZHJlc3MpLmlzX3NvbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZWxmLmNvbm5lY3Rpb25zLnB1c2goQ29ubmVjdGlvbiB7IGNvbm5faWQsIGFkZHJlc3M6IGFkZHJlc3MuY2xvbmUoKSwgY2xpZW50X2lkIH0pOwotICAgIH0KLQotICAgIGZuIHJlbW92ZV9jb25uZWN0aW9uKCZtdXQgc2VsZiwgX2NsaWVudF9pZDogaTMyLCBjb25uX2lkOiBpMzIpIHsKLSAgICAgICAgc2VsZi5jb25uZWN0aW9ucy5yZXRhaW4ofGNvbm58IGNvbm4uY29ubl9pZCAhPSBjb25uX2lkKTsKLSAgICB9Ci0KLSAgICBmbiBnZXRfY29ubl9pZF9mcm9tX2FkZHJlc3MoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyZXNzOiAmU3RyaW5nKSAtPiBPcHRpb248aTMyPiB7Ci0gICAgICAgIG1hdGNoIHNlbGYKLSAgICAgICAgICAgIC5jb25uZWN0aW9ucwotICAgICAgICAgICAgLml0ZXIoKQotICAgICAgICAgICAgLmZpbmQofGNvbm58IGNvbm4uY2xpZW50X2lkID09IGNsaWVudF9pZCAmJiBjb25uLmFkZHJlc3MgPT0gKmFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5vbmUgPT4gTm9uZSwKLSAgICAgICAgICAgIFNvbWUoY29ubikgPT4gU29tZShjb25uLmNvbm5faWQpLAotICAgICAgICB9Ci0gICAgfQotfQotCi0vLy8gRGVmaW5lcyB0aGUgR0FUVCBBUEkuCi1wdWIgdHJhaXQgSUJsdWV0b290aEdhdHQgewotICAgIGZuIHJlZ2lzdGVyX3NjYW5uZXIoJnNlbGYsIGNhbGxiYWNrOiBCb3g8ZHluIElTY2FubmVyQ2FsbGJhY2sgKyBTZW5kPik7Ci0KLSAgICBmbiB1bnJlZ2lzdGVyX3NjYW5uZXIoJnNlbGYsIHNjYW5uZXJfaWQ6IGkzMik7Ci0KLSAgICBmbiBzdGFydF9zY2FuKCZzZWxmLCBzY2FubmVyX2lkOiBpMzIsIHNldHRpbmdzOiBTY2FuU2V0dGluZ3MsIGZpbHRlcnM6IFZlYzxTY2FuRmlsdGVyPik7Ci0gICAgZm4gc3RvcF9zY2FuKCZzZWxmLCBzY2FubmVyX2lkOiBpMzIpOwotCi0gICAgLy8vIFJlZ2lzdGVycyBhIEdBVFQgQ2xpZW50LgotICAgIGZuIHJlZ2lzdGVyX2NsaWVudCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBhcHBfdXVpZDogU3RyaW5nLAotICAgICAgICBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrICsgU2VuZD4sCi0gICAgICAgIGVhdHRfc3VwcG9ydDogYm9vbCwKLSAgICApOwotCi0gICAgLy8vIFVucmVnaXN0ZXJzIGEgR0FUVCBDbGllbnQuCi0gICAgZm4gdW5yZWdpc3Rlcl9jbGllbnQoJm11dCBzZWxmLCBjbGllbnRfaWQ6IGkzMik7Ci0KLSAgICAvLy8gSW5pdGlhdGVzIGEgR0FUVCBjb25uZWN0aW9uIHRvIGEgcGVlciBkZXZpY2UuCi0gICAgZm4gY2xpZW50X2Nvbm5lY3QoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjbGllbnRfaWQ6IGkzMiwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICAgICBpc19kaXJlY3Q6IGJvb2wsCi0gICAgICAgIHRyYW5zcG9ydDogaTMyLAotICAgICAgICBvcHBvcnR1bmlzdGljOiBib29sLAotICAgICAgICBwaHk6IGkzMiwKLSAgICApOwotCi0gICAgLy8vIERpc2Nvbm5lY3RzIGEgR0FUVCBjb25uZWN0aW9uLgotICAgIGZuIGNsaWVudF9kaXNjb25uZWN0KCZzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nKTsKLQotICAgIC8vLyBTZXRzIHByZWZlcnJlZCBQSFkuCi0gICAgZm4gY2xpZW50X3NldF9wcmVmZXJyZWRfcGh5KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgdHhfcGh5OiBMZVBoeSwKLSAgICAgICAgcnhfcGh5OiBMZVBoeSwKLSAgICAgICAgcGh5X29wdGlvbnM6IGkzMiwKLSAgICApOwotCi0gICAgLy8vIFJlYWRzIHRoZSBQSFkgdXNlZCBieSBhIHBlZXIuCi0gICAgZm4gY2xpZW50X3JlYWRfcGh5KCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZyk7Ci0KLSAgICAvLy8gQ2xlYXJzIHRoZSBhdHRyaWJ1dGUgY2FjaGUgb2YgYSBkZXZpY2UuCi0gICAgZm4gcmVmcmVzaF9kZXZpY2UoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcpOwotCi0gICAgLy8vIEVudW1lcmF0ZXMgYWxsIEdBVFQgc2VydmljZXMgb24gYSBjb25uZWN0ZWQgZGV2aWNlLgotICAgIGZuIGRpc2NvdmVyX3NlcnZpY2VzKCZzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nKTsKLQotICAgIC8vLyBTZWFyY2ggYSBHQVRUIHNlcnZpY2Ugb24gYSBjb25uZWN0ZWQgZGV2aWNlIGJhc2VkIG9uIGEgVVVJRC4KLSAgICBmbiBkaXNjb3Zlcl9zZXJ2aWNlX2J5X3V1aWQoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIHV1aWQ6IFN0cmluZyk7Ci0KLSAgICAvLy8gUmVhZHMgYSBjaGFyYWN0ZXJpc3RpYyBvbiBhIHJlbW90ZSBkZXZpY2UuCi0gICAgZm4gcmVhZF9jaGFyYWN0ZXJpc3RpYygmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgaGFuZGxlOiBpMzIsIGF1dGhfcmVxOiBpMzIpOwotCi0gICAgLy8vIFJlYWRzIGEgY2hhcmFjdGVyaXN0aWMgb24gYSByZW1vdGUgZGV2aWNlLgotICAgIGZuIHJlYWRfdXNpbmdfY2hhcmFjdGVyaXN0aWNfdXVpZCgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIHV1aWQ6IFN0cmluZywKLSAgICAgICAgc3RhcnRfaGFuZGxlOiBpMzIsCi0gICAgICAgIGVuZF9oYW5kbGU6IGkzMiwKLSAgICAgICAgYXV0aF9yZXE6IGkzMiwKLSAgICApOwotCi0gICAgLy8vIFdyaXRlcyBhIHJlbW90ZSBjaGFyYWN0ZXJpc3RpYy4KLSAgICBmbiB3cml0ZV9jaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGhhbmRsZTogaTMyLAotICAgICAgICB3cml0ZV90eXBlOiBHYXR0V3JpdGVUeXBlLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICAgICB2YWx1ZTogVmVjPHU4PiwKLSAgICApIC0+IEdhdHRXcml0ZVJlcXVlc3RTdGF0dXM7Ci0KLSAgICAvLy8gUmVhZHMgdGhlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyaXN0aWMuCi0gICAgZm4gcmVhZF9kZXNjcmlwdG9yKCZzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nLCBoYW5kbGU6IGkzMiwgYXV0aF9yZXE6IGkzMik7Ci0KLSAgICAvLy8gV3JpdGVzIGEgcmVtb3RlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyaXN0aWMuCi0gICAgZm4gd3JpdGVfZGVzY3JpcHRvcigKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGhhbmRsZTogaTMyLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICAgICB2YWx1ZTogVmVjPHU4PiwKLSAgICApOwotCi0gICAgLy8vIFJlZ2lzdGVycyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb3IgaW5kaWNhdGlvbnMgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyaXN0aWMuCi0gICAgZm4gcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbigmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgaGFuZGxlOiBpMzIsIGVuYWJsZTogYm9vbCk7Ci0KLSAgICAvLy8gQmVnaW5zIHJlbGlhYmxlIHdyaXRlLgotICAgIGZuIGJlZ2luX3JlbGlhYmxlX3dyaXRlKCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZyk7Ci0KLSAgICAvLy8gRW5kcyByZWxpYWJsZSB3cml0ZS4KLSAgICBmbiBlbmRfcmVsaWFibGVfd3JpdGUoJm11dCBzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nLCBleGVjdXRlOiBib29sKTsKLQotICAgIC8vLyBSZXF1ZXN0cyBSU1NJIGZvciBhIGdpdmVuIHJlbW90ZSBkZXZpY2UuCi0gICAgZm4gcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZyk7Ci0KLSAgICAvLy8gQ29uZmlndXJlcyB0aGUgTVRVIG9mIGEgZ2l2ZW4gY29ubmVjdGlvbi4KLSAgICBmbiBjb25maWd1cmVfbXR1KCZzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nLCBtdHU6IGkzMik7Ci0KLSAgICAvLy8gUmVxdWVzdHMgYSBjb25uZWN0aW9uIHBhcmFtZXRlciB1cGRhdGUuCi0gICAgZm4gY29ubmVjdGlvbl9wYXJhbWV0ZXJfdXBkYXRlKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgbWluX2ludGVydmFsOiBpMzIsCi0gICAgICAgIG1heF9pbnRlcnZhbDogaTMyLAotICAgICAgICBsYXRlbmN5OiBpMzIsCi0gICAgICAgIHRpbWVvdXQ6IGkzMiwKLSAgICAgICAgbWluX2NlX2xlbjogdTE2LAotICAgICAgICBtYXhfY2VfbGVuOiB1MTYsCi0gICAgKTsKLX0KLQotI1tkZXJpdmUoRGVidWcsIERlZmF1bHQpXQotLy8vIFJlcHJlc2VudHMgYSBHQVRUIERlc2NyaXB0b3IuCi1wdWIgc3RydWN0IEJsdWV0b290aEdhdHREZXNjcmlwdG9yIHsKLSAgICBwdWIgdXVpZDogVXVpZDEyOEJpdCwKLSAgICBwdWIgaW5zdGFuY2VfaWQ6IGkzMiwKLSAgICBwdWIgcGVybWlzc2lvbnM6IGkzMiwKLX0KLQotaW1wbCBCbHVldG9vdGhHYXR0RGVzY3JpcHRvciB7Ci0gICAgZm4gbmV3KHV1aWQ6IFV1aWQxMjhCaXQsIGluc3RhbmNlX2lkOiBpMzIsIHBlcm1pc3Npb25zOiBpMzIpIC0+IEJsdWV0b290aEdhdHREZXNjcmlwdG9yIHsKLSAgICAgICAgQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IgeyB1dWlkLCBpbnN0YW5jZV9pZCwgcGVybWlzc2lvbnMgfQotICAgIH0KLX0KLQotI1tkZXJpdmUoRGVidWcsIERlZmF1bHQpXQotLy8vIFJlcHJlc2VudHMgYSBHQVRUIENoYXJhY3RlcmlzdGljLgotcHViIHN0cnVjdCBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgewotICAgIHB1YiB1dWlkOiBVdWlkMTI4Qml0LAotICAgIHB1YiBpbnN0YW5jZV9pZDogaTMyLAotICAgIHB1YiBwcm9wZXJ0aWVzOiBpMzIsCi0gICAgcHViIHBlcm1pc3Npb25zOiBpMzIsCi0gICAgcHViIGtleV9zaXplOiBpMzIsCi0gICAgcHViIHdyaXRlX3R5cGU6IEdhdHRXcml0ZVR5cGUsCi0gICAgcHViIGRlc2NyaXB0b3JzOiBWZWM8Qmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I+LAotfQotCi1pbXBsIEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyB7Ci0gICAgcHViIGNvbnN0IFBST1BFUlRZX0JST0FEQ0FTVDogaTMyID0gMHgwMTsKLSAgICBwdWIgY29uc3QgUFJPUEVSVFlfUkVBRDogaTMyID0gMHgwMjsKLSAgICBwdWIgY29uc3QgUFJPUEVSVFlfV1JJVEVfTk9fUkVTUE9OU0U6IGkzMiA9IDB4MDQ7Ci0gICAgcHViIGNvbnN0IFBST1BFUlRZX1dSSVRFOiBpMzIgPSAweDA4OwotICAgIHB1YiBjb25zdCBQUk9QRVJUWV9OT1RJRlk6IGkzMiA9IDB4MTA7Ci0gICAgcHViIGNvbnN0IFBST1BFUlRZX0lORElDQVRFOiBpMzIgPSAweDIwOwotICAgIHB1YiBjb25zdCBQUk9QRVJUWV9TSUdORURfV1JJVEU6IGkzMiA9IDB4NDA7Ci0gICAgcHViIGNvbnN0IFBST1BFUlRZX0VYVEVOREVEX1BST1BTOiBpMzIgPSAweDgwOwotCi0gICAgZm4gbmV3KAotICAgICAgICB1dWlkOiBVdWlkMTI4Qml0LAotICAgICAgICBpbnN0YW5jZV9pZDogaTMyLAotICAgICAgICBwcm9wZXJ0aWVzOiBpMzIsCi0gICAgICAgIHBlcm1pc3Npb25zOiBpMzIsCi0gICAgKSAtPiBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgewotICAgICAgICBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgewotICAgICAgICAgICAgdXVpZCwKLSAgICAgICAgICAgIGluc3RhbmNlX2lkLAotICAgICAgICAgICAgcHJvcGVydGllcywKLSAgICAgICAgICAgIHBlcm1pc3Npb25zLAotICAgICAgICAgICAgd3JpdGVfdHlwZTogaWYgcHJvcGVydGllcyAmIEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYzo6UFJPUEVSVFlfV1JJVEVfTk9fUkVTUE9OU0UgIT0gMAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdhdHRXcml0ZVR5cGU6OldyaXRlTm9Sc3AKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgR2F0dFdyaXRlVHlwZTo6V3JpdGUKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBrZXlfc2l6ZTogMTYsCi0gICAgICAgICAgICBkZXNjcmlwdG9yczogdmVjIVtdLAotICAgICAgICB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCi0vLy8gUmVwcmVzZW50cyBhIEdBVFQgU2VydmljZS4KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoR2F0dFNlcnZpY2UgewotICAgIHB1YiB1dWlkOiBVdWlkMTI4Qml0LAotICAgIHB1YiBpbnN0YW5jZV9pZDogaTMyLAotICAgIHB1YiBzZXJ2aWNlX3R5cGU6IGkzMiwKLSAgICBwdWIgY2hhcmFjdGVyaXN0aWNzOiBWZWM8Qmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljPiwKLSAgICBwdWIgaW5jbHVkZWRfc2VydmljZXM6IFZlYzxCbHVldG9vdGhHYXR0U2VydmljZT4sCi19Ci0KLWltcGwgQmx1ZXRvb3RoR2F0dFNlcnZpY2UgewotICAgIGZuIG5ldyh1dWlkOiBVdWlkMTI4Qml0LCBpbnN0YW5jZV9pZDogaTMyLCBzZXJ2aWNlX3R5cGU6IGkzMikgLT4gQmx1ZXRvb3RoR2F0dFNlcnZpY2UgewotICAgICAgICBCbHVldG9vdGhHYXR0U2VydmljZSB7Ci0gICAgICAgICAgICB1dWlkLAotICAgICAgICAgICAgaW5zdGFuY2VfaWQsCi0gICAgICAgICAgICBzZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IHZlYyFbXSwKLSAgICAgICAgICAgIGluY2x1ZGVkX3NlcnZpY2VzOiB2ZWMhW10sCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vLyBDYWxsYmFjayBmb3IgR0FUVCBDbGllbnQgQVBJLgotcHViIHRyYWl0IElCbHVldG9vdGhHYXR0Q2FsbGJhY2s6IFJQQ1Byb3h5IHsKLSAgICAvLy8gV2hlbiB0aGUgYHJlZ2lzdGVyX2NsaWVudGAgcmVxdWVzdCBpcyBkb25lLgotICAgIGZuIG9uX2NsaWVudF9yZWdpc3RlcmVkKCZzZWxmLCBzdGF0dXM6IGkzMiwgY2xpZW50X2lkOiBpMzIpOwotCi0gICAgLy8vIFdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHN0YXRlIG9mIGEgR0FUVCBjbGllbnQgY29ubmVjdGlvbi4KLSAgICBmbiBvbl9jbGllbnRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIHN0YXR1czogaTMyLAotICAgICAgICBjbGllbnRfaWQ6IGkzMiwKLSAgICAgICAgY29ubmVjdGVkOiBib29sLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgKTsKLQotICAgIC8vLyBXaGVuIHRoZXJlIGlzIGEgY2hhbmdlIG9mIFBIWS4KLSAgICBmbiBvbl9waHlfdXBkYXRlKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHR4X3BoeTogTGVQaHksIHJ4X3BoeTogTGVQaHksIHN0YXR1czogR2F0dFN0YXR1cyk7Ci0KLSAgICAvLy8gVGhlIGNvbXBsZXRpb24gb2YgSUJsdWV0b290aEdhdHQ6OnJlYWRfcGh5LgotICAgIGZuIG9uX3BoeV9yZWFkKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHR4X3BoeTogTGVQaHksIHJ4X3BoeTogTGVQaHksIHN0YXR1czogR2F0dFN0YXR1cyk7Ci0KLSAgICAvLy8gV2hlbiBHQVRUIGRiIGlzIGF2YWlsYWJsZS4KLSAgICBmbiBvbl9zZWFyY2hfY29tcGxldGUoJnNlbGYsIGFkZHI6IFN0cmluZywgc2VydmljZXM6IFZlYzxCbHVldG9vdGhHYXR0U2VydmljZT4sIHN0YXR1czogaTMyKTsKLQotICAgIC8vLyBUaGUgY29tcGxldGlvbiBvZiBJQmx1ZXRvb3RoR2F0dDo6cmVhZF9jaGFyYWN0ZXJpc3RpYy4KLSAgICBmbiBvbl9jaGFyYWN0ZXJpc3RpY19yZWFkKCZzZWxmLCBhZGRyOiBTdHJpbmcsIHN0YXR1czogaTMyLCBoYW5kbGU6IGkzMiwgdmFsdWU6IFZlYzx1OD4pOwotCi0gICAgLy8vIFRoZSBjb21wbGV0aW9uIG9mIElCbHVldG9vdGhHYXR0Ojp3cml0ZV9jaGFyYWN0ZXJpc3RpYy4KLSAgICBmbiBvbl9jaGFyYWN0ZXJpc3RpY193cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMiwgaGFuZGxlOiBpMzIpOwotCi0gICAgLy8vIFdoZW4gYSByZWxpYWJsZSB3cml0ZSBpcyBjb21wbGV0ZWQuCi0gICAgZm4gb25fZXhlY3V0ZV93cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMik7Ci0KLSAgICAvLy8gVGhlIGNvbXBsZXRpb24gb2YgSUJsdWV0b290aEdhdHQ6OnJlYWRfZGVzY3JpcHRvci4KLSAgICBmbiBvbl9kZXNjcmlwdG9yX3JlYWQoJnNlbGYsIGFkZHI6IFN0cmluZywgc3RhdHVzOiBpMzIsIGhhbmRsZTogaTMyLCB2YWx1ZTogVmVjPHU4Pik7Ci0KLSAgICAvLy8gVGhlIGNvbXBsZXRpb24gb2YgSUJsdWV0b290aEdhdHQ6OndyaXRlX2Rlc2NyaXB0b3IuCi0gICAgZm4gb25fZGVzY3JpcHRvcl93cml0ZSgmc2VsZiwgYWRkcjogU3RyaW5nLCBzdGF0dXM6IGkzMiwgaGFuZGxlOiBpMzIpOwotCi0gICAgLy8vIFdoZW4gbm90aWZpY2F0aW9uIG9yIGluZGljYXRpb24gaXMgcmVjZWl2ZWQuCi0gICAgZm4gb25fbm90aWZ5KCZzZWxmLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCB2YWx1ZTogVmVjPHU4Pik7Ci0KLSAgICAvLy8gVGhlIGNvbXBsZXRpb24gb2YgSUJsdWV0b290aEdhdHQ6OnJlYWRfcmVtb3RlX3Jzc2kuCi0gICAgZm4gb25fcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgYWRkcjogU3RyaW5nLCByc3NpOiBpMzIsIHN0YXR1czogaTMyKTsKLQotICAgIC8vLyBUaGUgY29tcGxldGlvbiBvZiBJQmx1ZXRvb3RoR2F0dDo6Y29uZmlndXJlX210dS4KLSAgICBmbiBvbl9jb25maWd1cmVfbXR1KCZzZWxmLCBhZGRyOiBTdHJpbmcsIG10dTogaTMyLCBzdGF0dXM6IGkzMik7Ci0KLSAgICAvLy8gV2hlbiBhIGNvbm5lY3Rpb24gcGFyYW1ldGVyIGNoYW5nZXMuCi0gICAgZm4gb25fY29ubmVjdGlvbl91cGRhdGVkKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICAgICBpbnRlcnZhbDogaTMyLAotICAgICAgICBsYXRlbmN5OiBpMzIsCi0gICAgICAgIHRpbWVvdXQ6IGkzMiwKLSAgICAgICAgc3RhdHVzOiBpMzIsCi0gICAgKTsKLQotICAgIC8vLyBXaGVuIHRoZXJlIGlzIGFuIGFkZGl0aW9uLCByZW1vdmFsLCBvciBjaGFuZ2Ugb2YgYSBHQVRUIHNlcnZpY2UuCi0gICAgZm4gb25fc2VydmljZV9jaGFuZ2VkKCZzZWxmLCBhZGRyOiBTdHJpbmcpOwotfQotCi0vLy8gSW50ZXJmYWNlIGZvciBzY2FubmVyIGNhbGxiYWNrcyB0byBjbGllbnRzLCBwYXNzZWQgdG8gYElCbHVldG9vdGhHYXR0OjpyZWdpc3Rlcl9zY2FubmVyYC4KLXB1YiB0cmFpdCBJU2Nhbm5lckNhbGxiYWNrIHsKLSAgICAvLy8gV2hlbiB0aGUgYHJlZ2lzdGVyX3NjYW5uZXJgIHJlcXVlc3QgaXMgZG9uZS4KLSAgICBmbiBvbl9zY2FubmVyX3JlZ2lzdGVyZWQoJnNlbGYsIHN0YXR1czogaTMyLCBzY2FubmVyX2lkOiBpMzIpOwotfQotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUpXQotI1tyZXByKHU4KV0KLS8vLyBHQVRUIHdyaXRlIHR5cGUuCi1lbnVtIEdhdHREYkVsZW1lbnRUeXBlIHsKLSAgICBQcmltYXJ5U2VydmljZSA9IDAsCi0gICAgU2Vjb25kYXJ5U2VydmljZSA9IDEsCi0gICAgSW5jbHVkZWRTZXJ2aWNlID0gMiwKLSAgICBDaGFyYWN0ZXJpc3RpYyA9IDMsCi0gICAgRGVzY3JpcHRvciA9IDQsCi19Ci0KLSNbZGVyaXZlKERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSldCi0jW3JlcHIodTgpXQotLy8vIEdBVFQgd3JpdGUgdHlwZS4KLXB1YiBlbnVtIEdhdHRXcml0ZVR5cGUgewotICAgIEludmFsaWQgPSAwLAotICAgIFdyaXRlTm9Sc3AgPSAxLAotICAgIFdyaXRlID0gMiwKLSAgICBXcml0ZVByZXBhcmUgPSAzLAotfQotCi1pbXBsIERlZmF1bHQgZm9yIEdhdHRXcml0ZVR5cGUgewotICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICAgICAgR2F0dFdyaXRlVHlwZTo6V3JpdGUKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSldCi0jW3JlcHIodTgpXQotLy8vIFJlcHJlc2VudHMgTEUgUEhZLgotcHViIGVudW0gTGVQaHkgewotICAgIEludmFsaWQgPSAwLAotICAgIFBoeTFtID0gMSwKLSAgICBQaHkybSA9IDIsCi0gICAgUGh5Q29kZWQgPSAzLAotfQotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUpXQotI1tyZXByKHUzMildCi0vLy8gU2NhbiB0eXBlIGNvbmZpZ3VyYXRpb24uCi1wdWIgZW51bSBTY2FuVHlwZSB7Ci0gICAgQWN0aXZlID0gMCwKLSAgICBQYXNzaXZlID0gMSwKLX0KLQotaW1wbCBEZWZhdWx0IGZvciBTY2FuVHlwZSB7Ci0gICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewotICAgICAgICBTY2FuVHlwZTo6QWN0aXZlCi0gICAgfQotfQotCi0vLy8gUmVwcmVzZW50cyBSU1NJIGNvbmZpZ3VyYXRpb25zIGZvciBoYXJkd2FyZSBvZmZsb2FkZWQgc2Nhbm5pbmcuCi0vLyBUT0RPKGIvMjAwMDY2ODA0KTogVGhpcyBpcyBzdGlsbCBhIHBsYWNlaG9sZGVyIHN0cnVjdCwgbm90IHlldCBjb21wbGV0ZS4KLSNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KLXB1YiBzdHJ1Y3QgUlNTSVNldHRpbmdzIHsKLSAgICBwdWIgbG93X3RocmVzaG9sZDogaTMyLAotICAgIHB1YiBoaWdoX3RocmVzaG9sZDogaTMyLAotfQotCi0vLy8gUmVwcmVzZW50cyBzY2FubmluZyBjb25maWd1cmF0aW9ucyB0byBiZSBwYXNzZWQgdG8gYElCbHVldG9vdGhHYXR0OjpzdGFydF9zY2FuYC4KLSNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KLXB1YiBzdHJ1Y3QgU2NhblNldHRpbmdzIHsKLSAgICBwdWIgaW50ZXJ2YWw6IGkzMiwKLSAgICBwdWIgd2luZG93OiBpMzIsCi0gICAgcHViIHNjYW5fdHlwZTogU2NhblR5cGUsCi0gICAgcHViIHJzc2lfc2V0dGluZ3M6IFJTU0lTZXR0aW5ncywKLX0KLQotLy8vIFJlcHJlc2VudHMgYSBzY2FuIGZpbHRlciB0byBiZSBwYXNzZWQgdG8gYElCbHVldG9vdGhHYXR0OjpzdGFydF9zY2FuYC4KLSNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KLXB1YiBzdHJ1Y3QgU2NhbkZpbHRlciB7fQotCi0vLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEdBVFQgQVBJIChJQmx1ZXRvb3RoR2F0dCkuCi1wdWIgc3RydWN0IEJsdWV0b290aEdhdHQgewotICAgIGludGY6IEFyYzxNdXRleDxCbHVldG9vdGhJbnRlcmZhY2U+PiwKLSAgICBnYXR0OiBPcHRpb248R2F0dD4sCi0KLSAgICBjb250ZXh0X21hcDogQ29udGV4dE1hcCwKLSAgICByZWxpYWJsZV9xdWV1ZTogSGFzaFNldDxTdHJpbmc+LAotfQotCi1pbXBsIEJsdWV0b290aEdhdHQgewotICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IElCbHVldG9vdGhHYXR0IGltcGxlbWVudGF0aW9uLgotICAgIHB1YiBmbiBuZXcoaW50ZjogQXJjPE11dGV4PEJsdWV0b290aEludGVyZmFjZT4+KSAtPiBCbHVldG9vdGhHYXR0IHsKLSAgICAgICAgQmx1ZXRvb3RoR2F0dCB7Ci0gICAgICAgICAgICBpbnRmOiBpbnRmLAotICAgICAgICAgICAgZ2F0dDogTm9uZSwKLSAgICAgICAgICAgIGNvbnRleHRfbWFwOiBDb250ZXh0TWFwOjpuZXcoKSwKLSAgICAgICAgICAgIHJlbGlhYmxlX3F1ZXVlOiBIYXNoU2V0OjpuZXcoKSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YiBmbiBpbml0X3Byb2ZpbGVzKCZtdXQgc2VsZiwgdHg6IFNlbmRlcjxNZXNzYWdlPikgewotICAgICAgICBzZWxmLmdhdHQgPSBHYXR0OjpuZXcoJnNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkpOwotICAgICAgICBzZWxmLmdhdHQuYXNfbXV0KCkudW53cmFwKCkuaW5pdGlhbGl6ZSgKLSAgICAgICAgICAgIEdhdHRDbGllbnRDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaDogQm94OjpuZXcobW92ZSB8Y2J8IHsKLSAgICAgICAgICAgICAgICAgICAgbGV0IHR4X2Nsb25lID0gdHguY2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgdG9wc3RhY2s6OmdldF9ydW50aW1lKCkuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgXyA9IHR4X2Nsb25lLnNlbmQoTWVzc2FnZTo6R2F0dENsaWVudChjYikpLmF3YWl0OwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9KSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBHYXR0U2VydmVyQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2g6IEJveDo6bmV3KG1vdmUgfGNifCB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xOTM2ODUxNDkpOiBJbXBsZW1lbnQgdGhlIGNhbGxiYWNrcwotICAgICAgICAgICAgICAgICAgICBkZWJ1ZyEoInJlY2VpdmVkIEdhdHQgc2VydmVyIGNhbGxiYWNrOiB7Oj99IiwgY2IpOwotICAgICAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgfSwKLSAgICAgICAgKTsKLSAgICB9Ci19Ci0KLS8vIFRlbXBvcmFyeSB1dGlsIHRoYXQgY292ZXJzIG9ubHkgYmFzaWMgc3RyaW5nIGNvbnZlcnNpb24uCi0vLyBUT0RPKGIvMTkzNjg1MzI1KTogSW1wbGVtZW50IG1vcmUgVVVJRCB1dGlscyBieSB1c2luZyBVdWlkIGZyb20gZ2QvaGNpL3V1aWQuaCB3aXRoIGN4eC4KLWZuIHBhcnNlX3V1aWRfc3RyaW5nPFQ6IEludG88U3RyaW5nPj4odXVpZDogVCkgLT4gT3B0aW9uPFV1aWQ+IHsKLSAgICBsZXQgdXVpZCA9IHV1aWQuaW50bygpOwotCi0gICAgaWYgdXVpZC5sZW4oKSAhPSAzMiB7Ci0gICAgICAgIHJldHVybiBOb25lOwotICAgIH0KLQotICAgIGxldCBtdXQgcmF3ID0gWzA7IDE2XTsKLQotICAgIGZvciBpIGluIDAuLjE2IHsKLSAgICAgICAgbGV0IGJ5dGUgPSB1ODo6ZnJvbV9zdHJfcmFkaXgoJnV1aWRbaSAqIDIuLmkgKiAyICsgMl0sIDE2KTsKLSAgICAgICAgaWYgYnl0ZS5pc19lcnIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTm9uZTsKLSAgICAgICAgfQotICAgICAgICByYXdbaV0gPSBieXRlLnVud3JhcCgpOwotICAgIH0KLQotICAgIFNvbWUoVXVpZCB7IHV1OiByYXcgfSkKLX0KLQotI1tkZXJpdmUoRGVidWcsIEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlKV0KLSNbcmVwcih1OCldCi0vLy8gU3RhdHVzIG9mIFdyaXRlQ2hhcmFjdGVyaXN0aWMgbWV0aG9kcy4KLXB1YiBlbnVtIEdhdHRXcml0ZVJlcXVlc3RTdGF0dXMgewotICAgIFN1Y2Nlc3MgPSAwLAotICAgIEZhaWwgPSAxLAotICAgIEJ1c3kgPSAyLAotfQotCi1pbXBsIElCbHVldG9vdGhHYXR0IGZvciBCbHVldG9vdGhHYXR0IHsKLSAgICBmbiByZWdpc3Rlcl9zY2FubmVyKCZzZWxmLCBfY2FsbGJhY2s6IEJveDxkeW4gSVNjYW5uZXJDYWxsYmFjayArIFNlbmQ+KSB7Ci0gICAgICAgIC8vIFRPRE8oYi8yMDAwNjY4MDQpOiBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBmbiB1bnJlZ2lzdGVyX3NjYW5uZXIoJnNlbGYsIF9zY2FubmVyX2lkOiBpMzIpIHsKLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NjgwNCk6IGltcGxlbWVudAotICAgIH0KLQotICAgIGZuIHN0YXJ0X3NjYW4oJnNlbGYsIF9zY2FubmVyX2lkOiBpMzIsIF9zZXR0aW5nczogU2NhblNldHRpbmdzLCBfZmlsdGVyczogVmVjPFNjYW5GaWx0ZXI+KSB7Ci0gICAgICAgIC8vIFRPRE8oYi8yMDAwNjY4MDQpOiBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBmbiBzdG9wX3NjYW4oJnNlbGYsIF9zY2FubmVyX2lkOiBpMzIpIHsKLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NjgwNCk6IGltcGxlbWVudAotICAgIH0KLQotICAgIGZuIHJlZ2lzdGVyX2NsaWVudCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBhcHBfdXVpZDogU3RyaW5nLAotICAgICAgICBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoR2F0dENhbGxiYWNrICsgU2VuZD4sCi0gICAgICAgIGVhdHRfc3VwcG9ydDogYm9vbCwKLSAgICApIHsKLSAgICAgICAgbGV0IHV1aWQgPSBwYXJzZV91dWlkX3N0cmluZyhhcHBfdXVpZCkudW53cmFwKCk7Ci0gICAgICAgIHNlbGYuY29udGV4dF9tYXAuYWRkKCZ1dWlkLnV1LCBjYWxsYmFjayk7Ci0gICAgICAgIHNlbGYuZ2F0dC5hc19yZWYoKS51bndyYXAoKS5jbGllbnQucmVnaXN0ZXJfY2xpZW50KCZ1dWlkLCBlYXR0X3N1cHBvcnQpOwotICAgIH0KLQotICAgIGZuIHVucmVnaXN0ZXJfY2xpZW50KCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIpIHsKLSAgICAgICAgc2VsZi5jb250ZXh0X21hcC5yZW1vdmUoY2xpZW50X2lkKTsKLSAgICAgICAgc2VsZi5nYXR0LmFzX3JlZigpLnVud3JhcCgpLmNsaWVudC51bnJlZ2lzdGVyX2NsaWVudChjbGllbnRfaWQpOwotICAgIH0KLQotICAgIGZuIGNsaWVudF9jb25uZWN0KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgaXNfZGlyZWN0OiBib29sLAotICAgICAgICB0cmFuc3BvcnQ6IGkzMiwKLSAgICAgICAgb3Bwb3J0dW5pc3RpYzogYm9vbCwKLSAgICAgICAgcGh5OiBpMzIsCi0gICAgKSB7Ci0gICAgICAgIGxldCBhZGRyZXNzID0gbWF0Y2ggUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoYWRkci5jbG9uZSgpKSB7Ci0gICAgICAgICAgICBOb25lID0+IHJldHVybiwKLSAgICAgICAgICAgIFNvbWUoYWRkcikgPT4gYWRkciwKLSAgICAgICAgfTsKLQotICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LmNvbm5lY3QoCi0gICAgICAgICAgICBjbGllbnRfaWQsCi0gICAgICAgICAgICAmYWRkcmVzcywKLSAgICAgICAgICAgIGlzX2RpcmVjdCwKLSAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICBwaHksCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gY2xpZW50X2Rpc2Nvbm5lY3QoJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyZXNzOiBTdHJpbmcpIHsKLSAgICAgICAgbGV0IGNvbm5faWQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsICZhZGRyZXNzKTsKLSAgICAgICAgaWYgY29ubl9pZC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi5nYXR0LmFzX3JlZigpLnVud3JhcCgpLmNsaWVudC5kaXNjb25uZWN0KAotICAgICAgICAgICAgY2xpZW50X2lkLAotICAgICAgICAgICAgJlJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGFkZHJlc3MpLnVud3JhcCgpLAotICAgICAgICAgICAgY29ubl9pZC51bndyYXAoKSwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBjbGllbnRfc2V0X3ByZWZlcnJlZF9waHkoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjbGllbnRfaWQ6IGkzMiwKLSAgICAgICAgYWRkcmVzczogU3RyaW5nLAotICAgICAgICB0eF9waHk6IExlUGh5LAotICAgICAgICByeF9waHk6IExlUGh5LAotICAgICAgICBwaHlfb3B0aW9uczogaTMyLAotICAgICkgewotICAgICAgICBsZXQgY29ubl9pZCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2Nvbm5faWRfZnJvbV9hZGRyZXNzKGNsaWVudF9pZCwgJmFkZHJlc3MpOwotICAgICAgICBpZiBjb25uX2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LnNldF9wcmVmZXJyZWRfcGh5KAotICAgICAgICAgICAgJlJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGFkZHJlc3MpLnVud3JhcCgpLAotICAgICAgICAgICAgdHhfcGh5LnRvX3U4KCkudW53cmFwKCksCi0gICAgICAgICAgICByeF9waHkudG9fdTgoKS51bndyYXAoKSwKLSAgICAgICAgICAgIHBoeV9vcHRpb25zIGFzIHUxNiwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBjbGllbnRfcmVhZF9waHkoJm11dCBzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nKSB7Ci0gICAgICAgIGxldCBhZGRyZXNzID0gbWF0Y2ggUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoYWRkci5jbG9uZSgpKSB7Ci0gICAgICAgICAgICBOb25lID0+IHJldHVybiwKLSAgICAgICAgICAgIFNvbWUoYWRkcikgPT4gYWRkciwKLSAgICAgICAgfTsKLQotICAgICAgICBzZWxmLmdhdHQuYXNfbXV0KCkudW53cmFwKCkuY2xpZW50LnJlYWRfcGh5KGNsaWVudF9pZCwgJmFkZHJlc3MpOwotICAgIH0KLQotICAgIGZuIHJlZnJlc2hfZGV2aWNlKCZzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nKSB7Ci0gICAgICAgIHNlbGYuZ2F0dAotICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgIC5jbGllbnQKLSAgICAgICAgICAgIC5yZWZyZXNoKGNsaWVudF9pZCwgJlJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGFkZHIpLnVud3JhcCgpKTsKLSAgICB9Ci0KLSAgICBmbiBkaXNjb3Zlcl9zZXJ2aWNlcygmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBsZXQgY29ubl9pZCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2Nvbm5faWRfZnJvbV9hZGRyZXNzKGNsaWVudF9pZCwgJmFkZHIpOwotICAgICAgICBpZiBjb25uX2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LnNlYXJjaF9zZXJ2aWNlKGNvbm5faWQudW53cmFwKCksIE5vbmUpOwotICAgIH0KLQotICAgIGZuIGRpc2NvdmVyX3NlcnZpY2VfYnlfdXVpZCgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgdXVpZDogU3RyaW5nKSB7Ci0gICAgICAgIGxldCBjb25uX2lkID0gc2VsZi5jb250ZXh0X21hcC5nZXRfY29ubl9pZF9mcm9tX2FkZHJlc3MoY2xpZW50X2lkLCAmYWRkcik7Ci0gICAgICAgIGlmIGNvbm5faWQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCB1dWlkID0gcGFyc2VfdXVpZF9zdHJpbmcodXVpZCk7Ci0gICAgICAgIGlmIHV1aWQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYuZ2F0dC5hc19yZWYoKS51bndyYXAoKS5jbGllbnQuc2VhcmNoX3NlcnZpY2UoY29ubl9pZC51bndyYXAoKSwgdXVpZCk7Ci0gICAgfQotCi0gICAgZm4gcmVhZF9jaGFyYWN0ZXJpc3RpYygmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgaGFuZGxlOiBpMzIsIGF1dGhfcmVxOiBpMzIpIHsKLSAgICAgICAgbGV0IGNvbm5faWQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsICZhZGRyKTsKLSAgICAgICAgaWYgY29ubl9pZC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NTI3NCk6IFBlcmZvcm0gY2hlY2sgb24gcmVzdHJpY3RlZCBoYW5kbGVzLgotCi0gICAgICAgIHNlbGYuZ2F0dC5hc19yZWYoKS51bndyYXAoKS5jbGllbnQucmVhZF9jaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgIGNvbm5faWQudW53cmFwKCksCi0gICAgICAgICAgICBoYW5kbGUgYXMgdTE2LAotICAgICAgICAgICAgYXV0aF9yZXEsCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gcmVhZF91c2luZ19jaGFyYWN0ZXJpc3RpY191dWlkKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFN0cmluZywKLSAgICAgICAgdXVpZDogU3RyaW5nLAotICAgICAgICBzdGFydF9oYW5kbGU6IGkzMiwKLSAgICAgICAgZW5kX2hhbmRsZTogaTMyLAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICkgewotICAgICAgICBsZXQgY29ubl9pZCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2Nvbm5faWRfZnJvbV9hZGRyZXNzKGNsaWVudF9pZCwgJmFkZHIpOwotICAgICAgICBpZiBjb25uX2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgdXVpZCA9IHBhcnNlX3V1aWRfc3RyaW5nKHV1aWQpOwotICAgICAgICBpZiB1dWlkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPKGIvMjAwMDY1Mjc0KTogUGVyZm9ybSBjaGVjayBvbiByZXN0cmljdGVkIGhhbmRsZXMuCi0KLSAgICAgICAgc2VsZi5nYXR0LmFzX3JlZigpLnVud3JhcCgpLmNsaWVudC5yZWFkX3VzaW5nX2NoYXJhY3RlcmlzdGljX3V1aWQoCi0gICAgICAgICAgICBjb25uX2lkLnVud3JhcCgpLAotICAgICAgICAgICAgJnV1aWQudW53cmFwKCksCi0gICAgICAgICAgICBzdGFydF9oYW5kbGUgYXMgdTE2LAotICAgICAgICAgICAgZW5kX2hhbmRsZSBhcyB1MTYsCi0gICAgICAgICAgICBhdXRoX3JlcSwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiB3cml0ZV9jaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGNsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIGhhbmRsZTogaTMyLAotICAgICAgICBtdXQgd3JpdGVfdHlwZTogR2F0dFdyaXRlVHlwZSwKLSAgICAgICAgYXV0aF9yZXE6IGkzMiwKLSAgICAgICAgdmFsdWU6IFZlYzx1OD4sCi0gICAgKSAtPiBHYXR0V3JpdGVSZXF1ZXN0U3RhdHVzIHsKLSAgICAgICAgbGV0IGNvbm5faWQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsICZhZGRyKTsKLSAgICAgICAgaWYgY29ubl9pZC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuIEdhdHRXcml0ZVJlcXVlc3RTdGF0dXM6OkZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiBzZWxmLnJlbGlhYmxlX3F1ZXVlLmNvbnRhaW5zKCZhZGRyKSB7Ci0gICAgICAgICAgICB3cml0ZV90eXBlID0gR2F0dFdyaXRlVHlwZTo6V3JpdGVQcmVwYXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NTI3NCk6IFBlcmZvcm0gY2hlY2sgb24gcmVzdHJpY3RlZCBoYW5kbGVzLgotCi0gICAgICAgIC8vIFRPRE8oYi8yMDAwNzAxNjIpOiBIYW5kbGUgY29uY3VycmVudCB3cml0ZSBjaGFyYWN0ZXJpc3RpYy4KLQotICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LndyaXRlX2NoYXJhY3RlcmlzdGljKAotICAgICAgICAgICAgY29ubl9pZC51bndyYXAoKSwKLSAgICAgICAgICAgIGhhbmRsZSBhcyB1MTYsCi0gICAgICAgICAgICB3cml0ZV90eXBlLnRvX2kzMigpLnVud3JhcCgpLAotICAgICAgICAgICAgYXV0aF9yZXEsCi0gICAgICAgICAgICAmdmFsdWUsCi0gICAgICAgICk7Ci0KLSAgICAgICAgcmV0dXJuIEdhdHRXcml0ZVJlcXVlc3RTdGF0dXM6OlN1Y2Nlc3M7Ci0gICAgfQotCi0gICAgZm4gcmVhZF9kZXNjcmlwdG9yKCZzZWxmLCBjbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nLCBoYW5kbGU6IGkzMiwgYXV0aF9yZXE6IGkzMikgewotICAgICAgICBsZXQgY29ubl9pZCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2Nvbm5faWRfZnJvbV9hZGRyZXNzKGNsaWVudF9pZCwgJmFkZHIpOwotICAgICAgICBpZiBjb25uX2lkLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPKGIvMjAwMDY1Mjc0KTogUGVyZm9ybSBjaGVjayBvbiByZXN0cmljdGVkIGhhbmRsZXMuCi0KLSAgICAgICAgc2VsZi5nYXR0LmFzX3JlZigpLnVud3JhcCgpLmNsaWVudC5yZWFkX2Rlc2NyaXB0b3IoCi0gICAgICAgICAgICBjb25uX2lkLnVud3JhcCgpLAotICAgICAgICAgICAgaGFuZGxlIGFzIHUxNiwKLSAgICAgICAgICAgIGF1dGhfcmVxLAotICAgICAgICApOwotICAgIH0KLQotICAgIGZuIHdyaXRlX2Rlc2NyaXB0b3IoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjbGllbnRfaWQ6IGkzMiwKLSAgICAgICAgYWRkcjogU3RyaW5nLAotICAgICAgICBoYW5kbGU6IGkzMiwKLSAgICAgICAgYXV0aF9yZXE6IGkzMiwKLSAgICAgICAgdmFsdWU6IFZlYzx1OD4sCi0gICAgKSB7Ci0gICAgICAgIGxldCBjb25uX2lkID0gc2VsZi5jb250ZXh0X21hcC5nZXRfY29ubl9pZF9mcm9tX2FkZHJlc3MoY2xpZW50X2lkLCAmYWRkcik7Ci0gICAgICAgIGlmIGNvbm5faWQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8oYi8yMDAwNjUyNzQpOiBQZXJmb3JtIGNoZWNrIG9uIHJlc3RyaWN0ZWQgaGFuZGxlcy4KLQotICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LndyaXRlX2Rlc2NyaXB0b3IoCi0gICAgICAgICAgICBjb25uX2lkLnVud3JhcCgpLAotICAgICAgICAgICAgaGFuZGxlIGFzIHUxNiwKLSAgICAgICAgICAgIGF1dGhfcmVxLAotICAgICAgICAgICAgJnZhbHVlLAotICAgICAgICApOwotICAgIH0KLQotICAgIGZuIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24oJnNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGhhbmRsZTogaTMyLCBlbmFibGU6IGJvb2wpIHsKLSAgICAgICAgbGV0IGNvbm5faWQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsICZhZGRyKTsKLSAgICAgICAgaWYgY29ubl9pZC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyhiLzIwMDA2NTI3NCk6IFBlcmZvcm0gY2hlY2sgb24gcmVzdHJpY3RlZCBoYW5kbGVzLgotCi0gICAgICAgIGlmIGVuYWJsZSB7Ci0gICAgICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LnJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICZSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhhZGRyKS51bndyYXAoKSwKLSAgICAgICAgICAgICAgICBoYW5kbGUgYXMgdTE2LAotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbGYuZ2F0dC5hc19yZWYoKS51bndyYXAoKS5jbGllbnQuZGVyZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uKAotICAgICAgICAgICAgICAgIGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAmUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoYWRkcikudW53cmFwKCksCi0gICAgICAgICAgICAgICAgaGFuZGxlIGFzIHUxNiwKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmbiBiZWdpbl9yZWxpYWJsZV93cml0ZSgmbXV0IHNlbGYsIF9jbGllbnRfaWQ6IGkzMiwgYWRkcjogU3RyaW5nKSB7Ci0gICAgICAgIHNlbGYucmVsaWFibGVfcXVldWUuaW5zZXJ0KGFkZHIpOwotICAgIH0KLQotICAgIGZuIGVuZF9yZWxpYWJsZV93cml0ZSgmbXV0IHNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBTdHJpbmcsIGV4ZWN1dGU6IGJvb2wpIHsKLSAgICAgICAgc2VsZi5yZWxpYWJsZV9xdWV1ZS5yZW1vdmUoJmFkZHIpOwotCi0gICAgICAgIGxldCBjb25uX2lkID0gc2VsZi5jb250ZXh0X21hcC5nZXRfY29ubl9pZF9mcm9tX2FkZHJlc3MoY2xpZW50X2lkLCAmYWRkcik7Ci0gICAgICAgIGlmIGNvbm5faWQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYuZ2F0dAotICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAudW53cmFwKCkKLSAgICAgICAgICAgIC5jbGllbnQKLSAgICAgICAgICAgIC5leGVjdXRlX3dyaXRlKGNvbm5faWQudW53cmFwKCksIGlmIGV4ZWN1dGUgeyAxIH0gZWxzZSB7IDAgfSk7Ci0gICAgfQotCi0gICAgZm4gcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZykgewotICAgICAgICBzZWxmLmdhdHQKLSAgICAgICAgICAgIC5hc19yZWYoKQotICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAuY2xpZW50Ci0gICAgICAgICAgICAucmVhZF9yZW1vdGVfcnNzaShjbGllbnRfaWQsICZSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhhZGRyKS51bndyYXAoKSk7Ci0gICAgfQotCi0gICAgZm4gY29uZmlndXJlX210dSgmc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFN0cmluZywgbXR1OiBpMzIpIHsKLSAgICAgICAgbGV0IGNvbm5faWQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsICZhZGRyKTsKLSAgICAgICAgaWYgY29ubl9pZC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZi5nYXR0LmFzX3JlZigpLnVud3JhcCgpLmNsaWVudC5jb25maWd1cmVfbXR1KGNvbm5faWQudW53cmFwKCksIG10dSk7Ci0gICAgfQotCi0gICAgZm4gY29ubmVjdGlvbl9wYXJhbWV0ZXJfdXBkYXRlKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgX2NsaWVudF9pZDogaTMyLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIG1pbl9pbnRlcnZhbDogaTMyLAotICAgICAgICBtYXhfaW50ZXJ2YWw6IGkzMiwKLSAgICAgICAgbGF0ZW5jeTogaTMyLAotICAgICAgICB0aW1lb3V0OiBpMzIsCi0gICAgICAgIG1pbl9jZV9sZW46IHUxNiwKLSAgICAgICAgbWF4X2NlX2xlbjogdTE2LAotICAgICkgewotICAgICAgICBzZWxmLmdhdHQuYXNfcmVmKCkudW53cmFwKCkuY2xpZW50LmNvbm5fcGFyYW1ldGVyX3VwZGF0ZSgKLSAgICAgICAgICAgICZSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhhZGRyKS51bndyYXAoKSwKLSAgICAgICAgICAgIG1pbl9pbnRlcnZhbCwKLSAgICAgICAgICAgIG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgIGxhdGVuY3ksCi0gICAgICAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgbWluX2NlX2xlbiwKLSAgICAgICAgICAgIG1heF9jZV9sZW4sCi0gICAgICAgICk7Ci0gICAgfQotfQotCi0jW2J0aWZfY2FsbGJhY2tzX2Rpc3BhdGNoZXIoQmx1ZXRvb3RoR2F0dCwgZGlzcGF0Y2hfZ2F0dF9jbGllbnRfY2FsbGJhY2tzLCBHYXR0Q2xpZW50Q2FsbGJhY2tzKV0KLXB1YihjcmF0ZSkgdHJhaXQgQnRpZkdhdHRDbGllbnRDYWxsYmFja3MgewotICAgICNbYnRpZl9jYWxsYmFjayhSZWdpc3RlckNsaWVudCldCi0gICAgZm4gcmVnaXN0ZXJfY2xpZW50X2NiKCZtdXQgc2VsZiwgc3RhdHVzOiBpMzIsIGNsaWVudF9pZDogaTMyLCBhcHBfdXVpZDogVXVpZCk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soQ29ubmVjdCldCi0gICAgZm4gY29ubmVjdF9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgc3RhdHVzOiBpMzIsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBSYXdBZGRyZXNzKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhEaXNjb25uZWN0KV0KLSAgICBmbiBkaXNjb25uZWN0X2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBzdGF0dXM6IGkzMiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFJhd0FkZHJlc3MpOwotCi0gICAgI1tidGlmX2NhbGxiYWNrKFNlYXJjaENvbXBsZXRlKV0KLSAgICBmbiBzZWFyY2hfY29tcGxldGVfY2IoJm11dCBzZWxmLCBjb25uX2lkOiBpMzIsIHN0YXR1czogaTMyKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhSZWdpc3RlckZvck5vdGlmaWNhdGlvbildCi0gICAgZm4gcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbl9jYigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBjb25uX2lkOiBpMzIsCi0gICAgICAgIHJlZ2lzdGVyZWQ6IGkzMiwKLSAgICAgICAgc3RhdHVzOiBpMzIsCi0gICAgICAgIGhhbmRsZTogdTE2LAotICAgICk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soTm90aWZ5KV0KLSAgICBmbiBub3RpZnlfY2IoJm11dCBzZWxmLCBjb25uX2lkOiBpMzIsIGRhdGE6IEJ0R2F0dE5vdGlmeVBhcmFtcyk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soUmVhZENoYXJhY3RlcmlzdGljKV0KLSAgICBmbiByZWFkX2NoYXJhY3RlcmlzdGljX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBzdGF0dXM6IGkzMiwgZGF0YTogQnRHYXR0UmVhZFBhcmFtcyk7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soV3JpdGVDaGFyYWN0ZXJpc3RpYyldCi0gICAgZm4gd3JpdGVfY2hhcmFjdGVyaXN0aWNfY2IoJm11dCBzZWxmLCBjb25uX2lkOiBpMzIsIHN0YXR1czogaTMyLCBoYW5kbGU6IHUxNik7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soUmVhZERlc2NyaXB0b3IpXQotICAgIGZuIHJlYWRfZGVzY3JpcHRvcl9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgc3RhdHVzOiBpMzIsIGRhdGE6IEJ0R2F0dFJlYWRQYXJhbXMpOwotCi0gICAgI1tidGlmX2NhbGxiYWNrKFdyaXRlRGVzY3JpcHRvcildCi0gICAgZm4gd3JpdGVfZGVzY3JpcHRvcl9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgc3RhdHVzOiBpMzIsIGhhbmRsZTogdTE2KTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhFeGVjdXRlV3JpdGUpXQotICAgIGZuIGV4ZWN1dGVfd3JpdGVfY2IoJm11dCBzZWxmLCBjb25uX2lkOiBpMzIsIHN0YXR1czogaTMyKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhSZWFkUmVtb3RlUnNzaSldCi0gICAgZm4gcmVhZF9yZW1vdGVfcnNzaV9jYigmbXV0IHNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBSYXdBZGRyZXNzLCByc3NpOiBpMzIsIHN0YXR1czogaTMyKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhDb25maWd1cmVNdHUpXQotICAgIGZuIGNvbmZpZ3VyZV9tdHVfY2IoJm11dCBzZWxmLCBjb25uX2lkOiBpMzIsIHN0YXR1czogaTMyLCBtdHU6IGkzMik7Ci0KLSAgICAjW2J0aWZfY2FsbGJhY2soQ29uZ2VzdGlvbildCi0gICAgZm4gY29uZ2VzdGlvbl9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgY29uZ2VzdGVkOiBib29sKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhHZXRHYXR0RGIpXQotICAgIGZuIGdldF9nYXR0X2RiX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBlbGVtZW50czogVmVjPEJ0R2F0dERiRWxlbWVudD4sIGNvdW50OiBpMzIpOwotCi0gICAgI1tidGlmX2NhbGxiYWNrKFBoeVVwZGF0ZWQpXQotICAgIGZuIHBoeV91cGRhdGVkX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCB0eF9waHk6IHU4LCByeF9waHk6IHU4LCBzdGF0dXM6IHU4KTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhDb25uVXBkYXRlZCldCi0gICAgZm4gY29ubl91cGRhdGVkX2NiKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGNvbm5faWQ6IGkzMiwKLSAgICAgICAgaW50ZXJ2YWw6IHUxNiwKLSAgICAgICAgbGF0ZW5jeTogdTE2LAotICAgICAgICB0aW1lb3V0OiB1MTYsCi0gICAgICAgIHN0YXR1czogdTgsCi0gICAgKTsKLQotICAgICNbYnRpZl9jYWxsYmFjayhTZXJ2aWNlQ2hhbmdlZCldCi0gICAgZm4gc2VydmljZV9jaGFuZ2VkX2NiKCZzZWxmLCBjb25uX2lkOiBpMzIpOwotCi0gICAgI1tidGlmX2NhbGxiYWNrKFJlYWRQaHkpXQotICAgIGZuIHJlYWRfcGh5X2NiKCZtdXQgc2VsZiwgY2xpZW50X2lkOiBpMzIsIGFkZHI6IFJhd0FkZHJlc3MsIHR4X3BoeTogdTgsIHJ4X3BoeTogdTgsIHN0YXR1czogdTgpOwotfQotCi1pbXBsIEJ0aWZHYXR0Q2xpZW50Q2FsbGJhY2tzIGZvciBCbHVldG9vdGhHYXR0IHsKLSAgICBmbiByZWdpc3Rlcl9jbGllbnRfY2IoJm11dCBzZWxmLCBzdGF0dXM6IGkzMiwgY2xpZW50X2lkOiBpMzIsIGFwcF91dWlkOiBVdWlkKSB7Ci0gICAgICAgIHNlbGYuY29udGV4dF9tYXAuc2V0X2NsaWVudF9pZCgmYXBwX3V1aWQudXUsIGNsaWVudF9pZCk7Ci0KLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2J5X3V1aWQoJmFwcF91dWlkLnV1KTsKLSAgICAgICAgaWYgY2xpZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICB3YXJuISgiV2FybmluZzogQ2xpZW50IG5vdCByZWdpc3RlcmVkIGZvciBVVUlEIHs6P30iLCBhcHBfdXVpZC51dSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgY2FsbGJhY2sgPSAmY2xpZW50LnVud3JhcCgpLmNhbGxiYWNrOwotICAgICAgICBjYWxsYmFjay5vbl9jbGllbnRfcmVnaXN0ZXJlZChzdGF0dXMsIGNsaWVudF9pZCk7Ci0gICAgfQotCi0gICAgZm4gY29ubmVjdF9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgc3RhdHVzOiBpMzIsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBSYXdBZGRyZXNzKSB7Ci0gICAgICAgIGlmIHN0YXR1cyA9PSAwIHsKLSAgICAgICAgICAgIHNlbGYuY29udGV4dF9tYXAuYWRkX2Nvbm5lY3Rpb24oY2xpZW50X2lkLCBjb25uX2lkLCAmYWRkci50b19zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgY2xpZW50ID0gc2VsZi5jb250ZXh0X21hcC5nZXRfYnlfY2xpZW50X2lkKGNsaWVudF9pZCk7Ci0gICAgICAgIGlmIGNsaWVudC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LnVud3JhcCgpLmNhbGxiYWNrLm9uX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgY2xpZW50X2lkLAotICAgICAgICAgICAgbWF0Y2ggR2F0dFN0YXR1czo6ZnJvbV9pMzIoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgTm9uZSA9PiBmYWxzZSwKLSAgICAgICAgICAgICAgICBTb21lKGdhdHRfc3RhdHVzKSA9PiBnYXR0X3N0YXR1cyA9PSBHYXR0U3RhdHVzOjpTdWNjZXNzLAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGFkZHIudG9fc3RyaW5nKCksCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gZGlzY29ubmVjdF9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgc3RhdHVzOiBpMzIsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBSYXdBZGRyZXNzKSB7Ci0gICAgICAgIHNlbGYuY29udGV4dF9tYXAucmVtb3ZlX2Nvbm5lY3Rpb24oY2xpZW50X2lkLCBjb25uX2lkKTsKLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2J5X2NsaWVudF9pZChjbGllbnRfaWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9jbGllbnRfY29ubmVjdGlvbl9zdGF0ZSgKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIGNsaWVudF9pZCwKLSAgICAgICAgICAgIG1hdGNoIEdhdHRTdGF0dXM6OmZyb21faTMyKHN0YXR1cykgewotICAgICAgICAgICAgICAgIE5vbmUgPT4gZmFsc2UsCi0gICAgICAgICAgICAgICAgU29tZShnYXR0X3N0YXR1cykgPT4gZ2F0dF9zdGF0dXMgPT0gR2F0dFN0YXR1czo6U3VjY2VzcywKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBhZGRyLnRvX3N0cmluZygpLAotICAgICAgICApOwotICAgIH0KLQotICAgIGZuIHNlYXJjaF9jb21wbGV0ZV9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgX3N0YXR1czogaTMyKSB7Ci0gICAgICAgIC8vIEdhdHQgREIgaXMgcmVhZHkhCi0gICAgICAgIHNlbGYuZ2F0dC5hc19yZWYoKS51bndyYXAoKS5jbGllbnQuZ2V0X2dhdHRfZGIoY29ubl9pZCk7Ci0gICAgfQotCi0gICAgZm4gcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbl9jYigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfY29ubl9pZDogaTMyLAotICAgICAgICBfcmVnaXN0ZXJlZDogaTMyLAotICAgICAgICBfc3RhdHVzOiBpMzIsCi0gICAgICAgIF9oYW5kbGU6IHUxNiwKLSAgICApIHsKLSAgICAgICAgLy8gTm8tb3AuCi0gICAgfQotCi0gICAgZm4gbm90aWZ5X2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBkYXRhOiBCdEdhdHROb3RpZnlQYXJhbXMpIHsKLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2NsaWVudF9ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9ub3RpZnkoCi0gICAgICAgICAgICBSYXdBZGRyZXNzIHsgdmFsOiBkYXRhLmJkYS5hZGRyZXNzIH0udG9fc3RyaW5nKCksCi0gICAgICAgICAgICBkYXRhLmhhbmRsZSBhcyBpMzIsCi0gICAgICAgICAgICBkYXRhLnZhbHVlWzAuLmRhdGEubGVuIGFzIHVzaXplXS50b192ZWMoKSwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiByZWFkX2NoYXJhY3RlcmlzdGljX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBzdGF0dXM6IGkzMiwgZGF0YTogQnRHYXR0UmVhZFBhcmFtcykgewotICAgICAgICBsZXQgYWRkcmVzcyA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2FkZHJlc3NfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgYWRkcmVzcy5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2NsaWVudF9ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9jaGFyYWN0ZXJpc3RpY19yZWFkKAotICAgICAgICAgICAgYWRkcmVzcy51bndyYXAoKS50b19zdHJpbmcoKSwKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIGRhdGEuaGFuZGxlIGFzIGkzMiwKLSAgICAgICAgICAgIGRhdGEudmFsdWUudmFsdWVbMC4uZGF0YS52YWx1ZS5sZW4gYXMgdXNpemVdLnRvX3ZlYygpLAotICAgICAgICApOwotICAgIH0KLQotICAgIGZuIHdyaXRlX2NoYXJhY3RlcmlzdGljX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBtdXQgc3RhdHVzOiBpMzIsIGhhbmRsZTogdTE2KSB7Ci0gICAgICAgIGxldCBhZGRyZXNzID0gc2VsZi5jb250ZXh0X21hcC5nZXRfYWRkcmVzc19ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBhZGRyZXNzLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPKGIvMjAwMDcwMTYyKTogRGVzaWduIGhvdyB0byBoYW5kbGUgY29uY3VycmVudCB3cml0ZSBjaGFyYWN0ZXJpc3RpYyB0byB0aGUgc2FtZQotICAgICAgICAvLyBwZWVyLgotCi0gICAgICAgIGxldCBjbGllbnQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jbGllbnRfYnlfY29ubl9pZF9tdXQoY29ubl9pZCk7Ci0gICAgICAgIGlmIGNsaWVudC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudC51bndyYXAoKTsKLQotICAgICAgICBpZiBjbGllbnQuaXNfY29uZ2VzdGVkIHsKLSAgICAgICAgICAgIGlmIHN0YXR1cyA9PSBHYXR0U3RhdHVzOjpDb25nZXN0ZWQudG9faTMyKCkudW53cmFwKCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEdhdHRTdGF0dXM6OlN1Y2Nlc3MudG9faTMyKCkudW53cmFwKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNsaWVudC5jb25nZXN0aW9uX3F1ZXVlLnB1c2goKGFkZHJlc3MudW53cmFwKCkudG9fc3RyaW5nKCksIHN0YXR1cywgaGFuZGxlIGFzIGkzMikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LmNhbGxiYWNrLm9uX2NoYXJhY3RlcmlzdGljX3dyaXRlKAotICAgICAgICAgICAgYWRkcmVzcy51bndyYXAoKS50b19zdHJpbmcoKSwKLSAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgIGhhbmRsZSBhcyBpMzIsCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gcmVhZF9kZXNjcmlwdG9yX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBzdGF0dXM6IGkzMiwgZGF0YTogQnRHYXR0UmVhZFBhcmFtcykgewotICAgICAgICBsZXQgYWRkcmVzcyA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2FkZHJlc3NfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgYWRkcmVzcy5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2NsaWVudF9ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9kZXNjcmlwdG9yX3JlYWQoCi0gICAgICAgICAgICBhZGRyZXNzLnVud3JhcCgpLnRvX3N0cmluZygpLAotICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgZGF0YS5oYW5kbGUgYXMgaTMyLAotICAgICAgICAgICAgZGF0YS52YWx1ZS52YWx1ZVswLi5kYXRhLnZhbHVlLmxlbiBhcyB1c2l6ZV0udG9fdmVjKCksCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gd3JpdGVfZGVzY3JpcHRvcl9jYigmbXV0IHNlbGYsIGNvbm5faWQ6IGkzMiwgc3RhdHVzOiBpMzIsIGhhbmRsZTogdTE2KSB7Ci0gICAgICAgIGxldCBhZGRyZXNzID0gc2VsZi5jb250ZXh0X21hcC5nZXRfYWRkcmVzc19ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBhZGRyZXNzLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgY2xpZW50ID0gc2VsZi5jb250ZXh0X21hcC5nZXRfY2xpZW50X2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gICAgICAgIGlmIGNsaWVudC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LnVud3JhcCgpLmNhbGxiYWNrLm9uX2Rlc2NyaXB0b3Jfd3JpdGUoCi0gICAgICAgICAgICBhZGRyZXNzLnVud3JhcCgpLnRvX3N0cmluZygpLAotICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgaGFuZGxlIGFzIGkzMiwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBleGVjdXRlX3dyaXRlX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBzdGF0dXM6IGkzMikgewotICAgICAgICBsZXQgYWRkcmVzcyA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2FkZHJlc3NfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgYWRkcmVzcy5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2NsaWVudF9ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9leGVjdXRlX3dyaXRlKGFkZHJlc3MudW53cmFwKCkudG9fc3RyaW5nKCksIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgZm4gcmVhZF9yZW1vdGVfcnNzaV9jYigmbXV0IHNlbGYsIGNsaWVudF9pZDogaTMyLCBhZGRyOiBSYXdBZGRyZXNzLCByc3NpOiBpMzIsIHN0YXR1czogaTMyKSB7Ci0gICAgICAgIGxldCBjbGllbnQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9ieV9jbGllbnRfaWQoY2xpZW50X2lkKTsKLSAgICAgICAgaWYgY2xpZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQudW53cmFwKCkuY2FsbGJhY2sub25fcmVhZF9yZW1vdGVfcnNzaShhZGRyLnRvX3N0cmluZygpLCByc3NpLCBzdGF0dXMpOwotICAgIH0KLQotICAgIGZuIGNvbmZpZ3VyZV9tdHVfY2IoJm11dCBzZWxmLCBjb25uX2lkOiBpMzIsIHN0YXR1czogaTMyLCBtdHU6IGkzMikgewotICAgICAgICBsZXQgY2xpZW50ID0gc2VsZi5jb250ZXh0X21hcC5nZXRfY2xpZW50X2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gICAgICAgIGlmIGNsaWVudC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGFkZHIgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9hZGRyZXNzX2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gICAgICAgIGlmIGFkZHIuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9jb25maWd1cmVfbXR1KGFkZHIudW53cmFwKCksIG10dSwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBmbiBjb25nZXN0aW9uX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBjb25nZXN0ZWQ6IGJvb2wpIHsKLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2NsaWVudF9ieV9jb25uX2lkX211dChjb25uX2lkKTsKLSAgICAgICAgaWYgY2xpZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgY2xpZW50ID0gY2xpZW50LnVud3JhcCgpOwotCi0gICAgICAgIGNsaWVudC5pc19jb25nZXN0ZWQgPSBjb25nZXN0ZWQ7Ci0gICAgICAgIGlmICFjbGllbnQuaXNfY29uZ2VzdGVkIHsKLSAgICAgICAgICAgIGZvciBjYWxsYmFjayBpbiBjbGllbnQuY29uZ2VzdGlvbl9xdWV1ZS5pdGVyKCkgewotICAgICAgICAgICAgICAgIGNsaWVudC5jYWxsYmFjay5vbl9jaGFyYWN0ZXJpc3RpY193cml0ZShjYWxsYmFjay4wLmNsb25lKCksIGNhbGxiYWNrLjEsIGNhbGxiYWNrLjIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmNvbmdlc3Rpb25fcXVldWUuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZuIGdldF9nYXR0X2RiX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCBlbGVtZW50czogVmVjPEJ0R2F0dERiRWxlbWVudD4sIF9jb3VudDogaTMyKSB7Ci0gICAgICAgIGxldCBhZGRyZXNzID0gc2VsZi5jb250ZXh0X21hcC5nZXRfYWRkcmVzc19ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBhZGRyZXNzLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgY2xpZW50ID0gc2VsZi5jb250ZXh0X21hcC5nZXRfY2xpZW50X2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gICAgICAgIGlmIGNsaWVudC5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IG11dCBkYl9vdXQ6IFZlYzxCbHVldG9vdGhHYXR0U2VydmljZT4gPSB2ZWMhW107Ci0KLSAgICAgICAgZm9yIGVsZW0gaW4gZWxlbWVudHMgewotICAgICAgICAgICAgbWF0Y2ggR2F0dERiRWxlbWVudFR5cGU6OmZyb21fdTMyKGVsZW0udHlwZV8pLnVud3JhcCgpIHsKLSAgICAgICAgICAgICAgICBHYXR0RGJFbGVtZW50VHlwZTo6UHJpbWFyeVNlcnZpY2UgfCBHYXR0RGJFbGVtZW50VHlwZTo6U2Vjb25kYXJ5U2VydmljZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGRiX291dC5wdXNoKEJsdWV0b290aEdhdHRTZXJ2aWNlOjpuZXcoCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnV1aWQudXUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmlkIGFzIGkzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0udHlwZV8gYXMgaTMyLAotICAgICAgICAgICAgICAgICAgICApKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzIwMDA2NTI3NCk6IE1hcmsgcmVzdHJpY3RlZCBzZXJ2aWNlcy4KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBHYXR0RGJFbGVtZW50VHlwZTo6Q2hhcmFjdGVyaXN0aWMgPT4gewotICAgICAgICAgICAgICAgICAgICBtYXRjaCBkYl9vdXQubGFzdF9tdXQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb21lKHMpID0+IHMuY2hhcmFjdGVyaXN0aWNzLnB1c2goQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljOjpuZXcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS51dWlkLnV1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uaWQgYXMgaTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucHJvcGVydGllcyBhcyBpMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICkpLAotICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE5MzY4NTMyNSk6IExvZyBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMjAwMDY1Mjc0KTogTWFyayByZXN0cmljdGVkIGNoYXJhY3RlcmlzdGljcy4KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBHYXR0RGJFbGVtZW50VHlwZTo6RGVzY3JpcHRvciA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoIGRiX291dC5sYXN0X211dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUocykgPT4gbWF0Y2ggcy5jaGFyYWN0ZXJpc3RpY3MubGFzdF9tdXQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShjKSA9PiBjLmRlc2NyaXB0b3JzLnB1c2goQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I6Om5ldygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS51dWlkLnV1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmlkIGFzIGkzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE5MzY4NTMyNSk6IExvZyBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE5MzY4NTMyNSk6IExvZyBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMjAwMDY1Mjc0KTogTWFyayByZXN0cmljdGVkIGRlc2NyaXB0b3JzLgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEdhdHREYkVsZW1lbnRUeXBlOjpJbmNsdWRlZFNlcnZpY2UgPT4gewotICAgICAgICAgICAgICAgICAgICBtYXRjaCBkYl9vdXQubGFzdF9tdXQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb21lKHMpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmluY2x1ZGVkX3NlcnZpY2VzLnB1c2goQmx1ZXRvb3RoR2F0dFNlcnZpY2U6Om5ldygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS51dWlkLnV1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmlkIGFzIGkzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS50eXBlXyBhcyBpMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTkzNjg1MzI1KTogTG9nIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LnVud3JhcCgpLmNhbGxiYWNrLm9uX3NlYXJjaF9jb21wbGV0ZShhZGRyZXNzLnVud3JhcCgpLnRvX3N0cmluZygpLCBkYl9vdXQsIDApOwotICAgIH0KLQotICAgIGZuIHBoeV91cGRhdGVkX2NiKCZtdXQgc2VsZiwgY29ubl9pZDogaTMyLCB0eF9waHk6IHU4LCByeF9waHk6IHU4LCBzdGF0dXM6IHU4KSB7Ci0gICAgICAgIGxldCBjbGllbnQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jbGllbnRfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgY2xpZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgYWRkcmVzcyA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2FkZHJlc3NfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgYWRkcmVzcy5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LnVud3JhcCgpLmNhbGxiYWNrLm9uX3BoeV91cGRhdGUoCi0gICAgICAgICAgICBhZGRyZXNzLnVud3JhcCgpLAotICAgICAgICAgICAgTGVQaHk6OmZyb21fdTgodHhfcGh5KS51bndyYXAoKSwKLSAgICAgICAgICAgIExlUGh5Ojpmcm9tX3U4KHJ4X3BoeSkudW53cmFwKCksCi0gICAgICAgICAgICBHYXR0U3RhdHVzOjpmcm9tX3U4KHN0YXR1cykudW53cmFwKCksCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gcmVhZF9waHlfY2IoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgY2xpZW50X2lkOiBpMzIsCi0gICAgICAgIGFkZHI6IFJhd0FkZHJlc3MsCi0gICAgICAgIHR4X3BoeTogdTgsCi0gICAgICAgIHJ4X3BoeTogdTgsCi0gICAgICAgIHN0YXR1czogdTgsCi0gICAgKSB7Ci0gICAgICAgIGxldCBjbGllbnQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9ieV9jbGllbnRfaWQoY2xpZW50X2lkKTsKLSAgICAgICAgaWYgY2xpZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQudW53cmFwKCkuY2FsbGJhY2sub25fcGh5X3JlYWQoCi0gICAgICAgICAgICBhZGRyLnRvX3N0cmluZygpLAotICAgICAgICAgICAgTGVQaHk6OmZyb21fdTgodHhfcGh5KS51bndyYXAoKSwKLSAgICAgICAgICAgIExlUGh5Ojpmcm9tX3U4KHJ4X3BoeSkudW53cmFwKCksCi0gICAgICAgICAgICBHYXR0U3RhdHVzOjpmcm9tX3U4KHN0YXR1cykudW53cmFwKCksCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gY29ubl91cGRhdGVkX2NiKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGNvbm5faWQ6IGkzMiwKLSAgICAgICAgaW50ZXJ2YWw6IHUxNiwKLSAgICAgICAgbGF0ZW5jeTogdTE2LAotICAgICAgICB0aW1lb3V0OiB1MTYsCi0gICAgICAgIHN0YXR1czogdTgsCi0gICAgKSB7Ci0gICAgICAgIGxldCBjbGllbnQgPSBzZWxmLmNvbnRleHRfbWFwLmdldF9jbGllbnRfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgY2xpZW50LmlzX25vbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgYWRkcmVzcyA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2FkZHJlc3NfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgYWRkcmVzcy5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LnVud3JhcCgpLmNhbGxiYWNrLm9uX2Nvbm5lY3Rpb25fdXBkYXRlZCgKLSAgICAgICAgICAgIGFkZHJlc3MudW53cmFwKCksCi0gICAgICAgICAgICBpbnRlcnZhbCBhcyBpMzIsCi0gICAgICAgICAgICBsYXRlbmN5IGFzIGkzMiwKLSAgICAgICAgICAgIHRpbWVvdXQgYXMgaTMyLAotICAgICAgICAgICAgc3RhdHVzIGFzIGkzMiwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBmbiBzZXJ2aWNlX2NoYW5nZWRfY2IoJnNlbGYsIGNvbm5faWQ6IGkzMikgewotICAgICAgICBsZXQgYWRkcmVzcyA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2FkZHJlc3NfYnlfY29ubl9pZChjb25uX2lkKTsKLSAgICAgICAgaWYgYWRkcmVzcy5pc19ub25lKCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGNsaWVudCA9IHNlbGYuY29udGV4dF9tYXAuZ2V0X2NsaWVudF9ieV9jb25uX2lkKGNvbm5faWQpOwotICAgICAgICBpZiBjbGllbnQuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC51bndyYXAoKS5jYWxsYmFjay5vbl9zZXJ2aWNlX2NoYW5nZWQoYWRkcmVzcy51bndyYXAoKSk7Ci0gICAgfQotfQotCi0jW2NmZyh0ZXN0KV0KLW1vZCB0ZXN0cyB7Ci0gICAgc3RydWN0IFRlc3RCbHVldG9vdGhHYXR0Q2FsbGJhY2sgewotICAgICAgICBpZDogU3RyaW5nLAotICAgIH0KLQotICAgIGltcGwgVGVzdEJsdWV0b290aEdhdHRDYWxsYmFjayB7Ci0gICAgICAgIGZuIG5ldyhpZDogU3RyaW5nKSAtPiBUZXN0Qmx1ZXRvb3RoR2F0dENhbGxiYWNrIHsKLSAgICAgICAgICAgIFRlc3RCbHVldG9vdGhHYXR0Q2FsbGJhY2sgeyBpZCB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbXBsIElCbHVldG9vdGhHYXR0Q2FsbGJhY2sgZm9yIFRlc3RCbHVldG9vdGhHYXR0Q2FsbGJhY2sgewotICAgICAgICBmbiBvbl9jbGllbnRfcmVnaXN0ZXJlZCgmc2VsZiwgX3N0YXR1czogaTMyLCBfY2xpZW50X2lkOiBpMzIpIHt9Ci0gICAgICAgIGZuIG9uX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlKAotICAgICAgICAgICAgJnNlbGYsCi0gICAgICAgICAgICBfc3RhdHVzOiBpMzIsCi0gICAgICAgICAgICBfY2xpZW50X2lkOiBpMzIsCi0gICAgICAgICAgICBfY29ubmVjdGVkOiBib29sLAotICAgICAgICAgICAgX2FkZHI6IFN0cmluZywKLSAgICAgICAgKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBmbiBvbl9waHlfdXBkYXRlKAotICAgICAgICAgICAgJnNlbGYsCi0gICAgICAgICAgICBfYWRkcjogU3RyaW5nLAotICAgICAgICAgICAgX3R4X3BoeTogTGVQaHksCi0gICAgICAgICAgICBfcnhfcGh5OiBMZVBoeSwKLSAgICAgICAgICAgIF9zdGF0dXM6IEdhdHRTdGF0dXMsCi0gICAgICAgICkgewotICAgICAgICB9Ci0KLSAgICAgICAgZm4gb25fcGh5X3JlYWQoJnNlbGYsIF9hZGRyOiBTdHJpbmcsIF90eF9waHk6IExlUGh5LCBfcnhfcGh5OiBMZVBoeSwgX3N0YXR1czogR2F0dFN0YXR1cykge30KLQotICAgICAgICBmbiBvbl9zZWFyY2hfY29tcGxldGUoCi0gICAgICAgICAgICAmc2VsZiwKLSAgICAgICAgICAgIF9hZGRyOiBTdHJpbmcsCi0gICAgICAgICAgICBfc2VydmljZXM6IFZlYzxCbHVldG9vdGhHYXR0U2VydmljZT4sCi0gICAgICAgICAgICBfc3RhdHVzOiBpMzIsCi0gICAgICAgICkgewotICAgICAgICB9Ci0KLSAgICAgICAgZm4gb25fY2hhcmFjdGVyaXN0aWNfcmVhZCgKLSAgICAgICAgICAgICZzZWxmLAotICAgICAgICAgICAgX2FkZHI6IFN0cmluZywKLSAgICAgICAgICAgIF9zdGF0dXM6IGkzMiwKLSAgICAgICAgICAgIF9oYW5kbGU6IGkzMiwKLSAgICAgICAgICAgIF92YWx1ZTogVmVjPHU4PiwKLSAgICAgICAgKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBmbiBvbl9jaGFyYWN0ZXJpc3RpY193cml0ZSgmc2VsZiwgX2FkZHI6IFN0cmluZywgX3N0YXR1czogaTMyLCBfaGFuZGxlOiBpMzIpIHt9Ci0KLSAgICAgICAgZm4gb25fZXhlY3V0ZV93cml0ZSgmc2VsZiwgX2FkZHI6IFN0cmluZywgX3N0YXR1czogaTMyKSB7fQotCi0gICAgICAgIGZuIG9uX2Rlc2NyaXB0b3JfcmVhZCgmc2VsZiwgX2FkZHI6IFN0cmluZywgX3N0YXR1czogaTMyLCBfaGFuZGxlOiBpMzIsIF92YWx1ZTogVmVjPHU4Pikge30KLQotICAgICAgICBmbiBvbl9kZXNjcmlwdG9yX3dyaXRlKCZzZWxmLCBfYWRkcjogU3RyaW5nLCBfc3RhdHVzOiBpMzIsIF9oYW5kbGU6IGkzMikge30KLQotICAgICAgICBmbiBvbl9ub3RpZnkoJnNlbGYsIF9hZGRyOiBTdHJpbmcsIF9oYW5kbGU6IGkzMiwgX3ZhbHVlOiBWZWM8dTg+KSB7fQotCi0gICAgICAgIGZuIG9uX3JlYWRfcmVtb3RlX3Jzc2koJnNlbGYsIF9hZGRyOiBTdHJpbmcsIF9yc3NpOiBpMzIsIF9zdGF0dXM6IGkzMikge30KLQotICAgICAgICBmbiBvbl9jb25maWd1cmVfbXR1KCZzZWxmLCBfYWRkcjogU3RyaW5nLCBfbXR1OiBpMzIsIF9zdGF0dXM6IGkzMikge30KLQotICAgICAgICBmbiBvbl9jb25uZWN0aW9uX3VwZGF0ZWQoCi0gICAgICAgICAgICAmc2VsZiwKLSAgICAgICAgICAgIF9hZGRyOiBTdHJpbmcsCi0gICAgICAgICAgICBfaW50ZXJ2YWw6IGkzMiwKLSAgICAgICAgICAgIF9sYXRlbmN5OiBpMzIsCi0gICAgICAgICAgICBfdGltZW91dDogaTMyLAotICAgICAgICAgICAgX3N0YXR1czogaTMyLAotICAgICAgICApIHsKLSAgICAgICAgfQotCi0gICAgICAgIGZuIG9uX3NlcnZpY2VfY2hhbmdlZCgmc2VsZiwgX2FkZHI6IFN0cmluZykge30KLSAgICB9Ci0KLSAgICBpbXBsIFJQQ1Byb3h5IGZvciBUZXN0Qmx1ZXRvb3RoR2F0dENhbGxiYWNrIHsKLSAgICAgICAgZm4gcmVnaXN0ZXJfZGlzY29ubmVjdCgmbXV0IHNlbGYsIF9mOiBCb3g8ZHluIEZuKHUzMikgKyBTZW5kPikgLT4gdTMyIHsKLSAgICAgICAgICAgIDAKLSAgICAgICAgfQotCi0gICAgICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZyB7Ci0gICAgICAgICAgICBzZWxmLmlkLmNsb25lKCkKLSAgICAgICAgfQotCi0gICAgICAgIGZuIHVucmVnaXN0ZXIoJm11dCBzZWxmLCBfaWQ6IHUzMikgLT4gYm9vbCB7Ci0gICAgICAgICAgICBmYWxzZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdXNlIHN1cGVyOjoqOwotCi0gICAgI1t0ZXN0XQotICAgIGZuIHRlc3RfdXVpZF9mcm9tX3N0cmluZygpIHsKLSAgICAgICAgbGV0IHV1aWQgPSBwYXJzZV91dWlkX3N0cmluZygiYWJjZGVmIik7Ci0gICAgICAgIGFzc2VydCEodXVpZC5pc19ub25lKCkpOwotCi0gICAgICAgIGxldCB1dWlkID0gcGFyc2VfdXVpZF9zdHJpbmcoIjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmIik7Ci0gICAgICAgIGFzc2VydCEodXVpZC5pc19zb21lKCkpOwotICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTZdID0gWwotICAgICAgICAgICAgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwKLSAgICAgICAgICAgIDB4Y2QsIDB4ZWYsCi0gICAgICAgIF07Ci0gICAgICAgIGFzc2VydF9lcSEoVXVpZCB7IHV1OiBleHBlY3RlZCB9LCB1dWlkLnVud3JhcCgpKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9jb250ZXh0X21hcF9jbGllbnRzKCkgewotICAgICAgICBsZXQgbXV0IG1hcCA9IENvbnRleHRNYXA6Om5ldygpOwotCi0gICAgICAgIC8vIEFkZCBjbGllbnQgMS4KLSAgICAgICAgbGV0IGNhbGxiYWNrMSA9IEJveDo6bmV3KFRlc3RCbHVldG9vdGhHYXR0Q2FsbGJhY2s6Om5ldyhTdHJpbmc6OmZyb20oIkNhbGxiYWNrIDEiKSkpOwotICAgICAgICBsZXQgdXVpZDEgPSBwYXJzZV91dWlkX3N0cmluZygiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiKS51bndyYXAoKS51dTsKLSAgICAgICAgbWFwLmFkZCgmdXVpZDEsIGNhbGxiYWNrMSk7Ci0gICAgICAgIGxldCBmb3VuZCA9IG1hcC5nZXRfYnlfdXVpZCgmdXVpZDEpOwotICAgICAgICBhc3NlcnQhKGZvdW5kLmlzX3NvbWUoKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoIkNhbGxiYWNrIDEiLCBmb3VuZC51bndyYXAoKS5jYWxsYmFjay5nZXRfb2JqZWN0X2lkKCkpOwotCi0gICAgICAgIC8vIEFkZCBjbGllbnQgMi4KLSAgICAgICAgbGV0IGNhbGxiYWNrMiA9IEJveDo6bmV3KFRlc3RCbHVldG9vdGhHYXR0Q2FsbGJhY2s6Om5ldyhTdHJpbmc6OmZyb20oIkNhbGxiYWNrIDIiKSkpOwotICAgICAgICBsZXQgdXVpZDIgPSBwYXJzZV91dWlkX3N0cmluZygiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIiKS51bndyYXAoKS51dTsKLSAgICAgICAgbWFwLmFkZCgmdXVpZDIsIGNhbGxiYWNrMik7Ci0gICAgICAgIGxldCBmb3VuZCA9IG1hcC5nZXRfYnlfdXVpZCgmdXVpZDIpOwotICAgICAgICBhc3NlcnQhKGZvdW5kLmlzX3NvbWUoKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoIkNhbGxiYWNrIDIiLCBmb3VuZC51bndyYXAoKS5jYWxsYmFjay5nZXRfb2JqZWN0X2lkKCkpOwotCi0gICAgICAgIC8vIFNldCBjbGllbnQgSUQgYW5kIGdldCBieSBjbGllbnQgSUQuCi0gICAgICAgIG1hcC5zZXRfY2xpZW50X2lkKCZ1dWlkMSwgMyk7Ci0gICAgICAgIGxldCBmb3VuZCA9IG1hcC5nZXRfYnlfY2xpZW50X2lkKDMpOwotICAgICAgICBhc3NlcnQhKGZvdW5kLmlzX3NvbWUoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGNsaWVudCAxLgotICAgICAgICBtYXAucmVtb3ZlKDMpOwotICAgICAgICBsZXQgZm91bmQgPSBtYXAuZ2V0X2J5X3V1aWQoJnV1aWQxKTsKLSAgICAgICAgYXNzZXJ0IShmb3VuZC5pc19ub25lKCkpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X2NvbnRleHRfbWFwX2Nvbm5lY3Rpb25zKCkgewotICAgICAgICBsZXQgbXV0IG1hcCA9IENvbnRleHRNYXA6Om5ldygpOwotICAgICAgICBsZXQgY2xpZW50X2lkID0gMTsKLQotICAgICAgICBtYXAuYWRkX2Nvbm5lY3Rpb24oY2xpZW50X2lkLCAzLCAmU3RyaW5nOjpmcm9tKCJhYTpiYjpjYzpkZDplZTpmZiIpKTsKLSAgICAgICAgbWFwLmFkZF9jb25uZWN0aW9uKGNsaWVudF9pZCwgNCwgJlN0cmluZzo6ZnJvbSgiMTE6MjI6MzM6NDQ6NTU6NjYiKSk7Ci0KLSAgICAgICAgbGV0IGZvdW5kID0gbWFwLmdldF9jb25uX2lkX2Zyb21fYWRkcmVzcyhjbGllbnRfaWQsICZTdHJpbmc6OmZyb20oImFhOmJiOmNjOmRkOmVlOmZmIikpOwotICAgICAgICBhc3NlcnQhKGZvdW5kLmlzX3NvbWUoKSk7Ci0gICAgICAgIGFzc2VydF9lcSEoMywgZm91bmQudW53cmFwKCkpOwotCi0gICAgICAgIGxldCBmb3VuZCA9IG1hcC5nZXRfY29ubl9pZF9mcm9tX2FkZHJlc3MoY2xpZW50X2lkLCAmU3RyaW5nOjpmcm9tKCIxMToyMjozMzo0NDo1NTo2NiIpKTsKLSAgICAgICAgYXNzZXJ0IShmb3VuZC5pc19zb21lKCkpOwotICAgICAgICBhc3NlcnRfZXEhKDQsIGZvdW5kLnVud3JhcCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9ibHVldG9vdGhfbWVkaWEucnMgYi9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9ibHVldG9vdGhfbWVkaWEucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2YxNzguLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zdGFjay9zcmMvYmx1ZXRvb3RoX21lZGlhLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8vISBBbnl0aGluZyByZWxhdGVkIHRvIGF1ZGlvIGFuZCBtZWRpYSBBUEkuCi0KLXVzZSBidF90b3BzaGltOjpidGlmOjp7Qmx1ZXRvb3RoSW50ZXJmYWNlLCBSYXdBZGRyZXNzfTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6YTJkcDo6ewotICAgIEEyZHAsIEEyZHBDYWxsYmFja3MsIEEyZHBDYWxsYmFja3NEaXNwYXRjaGVyLCBBMmRwQ29kZWNCaXRzUGVyU2FtcGxlLCBBMmRwQ29kZWNDaGFubmVsTW9kZSwKLSAgICBBMmRwQ29kZWNDb25maWcsIEEyZHBDb2RlY0luZGV4LCBBMmRwQ29kZWNTYW1wbGVSYXRlLCBCdGF2Q29ubmVjdGlvblN0YXRlLAotICAgIFByZXNlbnRhdGlvblBvc2l0aW9uLAotfTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6YXZyY3A6OntBdnJjcCwgQXZyY3BDYWxsYmFja3MsIEF2cmNwQ2FsbGJhY2tzRGlzcGF0Y2hlcn07Ci11c2UgYnRfdG9wc2hpbTo6cHJvZmlsZXM6OmhmcDo6e0J0aGZDb25uZWN0aW9uU3RhdGUsIEhmcCwgSGZwQ2FsbGJhY2tzLCBIZnBDYWxsYmFja3NEaXNwYXRjaGVyfTsKLQotdXNlIGJ0X3RvcHNoaW06OnRvcHN0YWNrOwotCi11c2UgbG9nOjp3YXJuOwotCi11c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKLXVzZSBzdGQ6OmNvbnZlcnQ6OlRyeUZyb207Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2Ugc3RkOjpzeW5jOjpNdXRleDsKLQotdXNlIHRva2lvOjpzeW5jOjptcHNjOjpTZW5kZXI7Ci0KLXVzZSBjcmF0ZTo6TWVzc2FnZTsKLQotcHViIHRyYWl0IElCbHVldG9vdGhNZWRpYSB7Ci0gICAgLy8vCi0gICAgZm4gcmVnaXN0ZXJfY2FsbGJhY2soJm11dCBzZWxmLCBjYWxsYmFjazogQm94PGR5biBJQmx1ZXRvb3RoTWVkaWFDYWxsYmFjayArIFNlbmQ+KSAtPiBib29sOwotCi0gICAgLy8vIGluaXRpYWxpemVzIG1lZGlhIChib3RoIEEyZHAgYW5kIEFWUkNQKSBzdGFjawotICAgIGZuIGluaXRpYWxpemUoJm11dCBzZWxmKSAtPiBib29sOwotCi0gICAgLy8vIGNsZWFuIHVwIG1lZGlhIHN0YWNrCi0gICAgZm4gY2xlYW51cCgmbXV0IHNlbGYpIC0+IGJvb2w7Ci0KLSAgICAvLyBUT0RPIChiLzIwNDQ4ODI4OSk6IEFjY2VwdCBhbmQgdmFsaWRhdGUgUmF3QWRkcmVzcyBpbnN0ZWFkLgotICAgIGZuIGNvbm5lY3QoJm11dCBzZWxmLCBkZXZpY2U6IFN0cmluZyk7Ci0gICAgZm4gc2V0X2FjdGl2ZV9kZXZpY2UoJm11dCBzZWxmLCBkZXZpY2U6IFN0cmluZyk7Ci0gICAgZm4gZGlzY29ubmVjdCgmbXV0IHNlbGYsIGRldmljZTogU3RyaW5nKTsKLSAgICBmbiBzZXRfYXVkaW9fY29uZmlnKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIHNhbXBsZV9yYXRlOiBpMzIsCi0gICAgICAgIGJpdHNfcGVyX3NhbXBsZTogaTMyLAotICAgICAgICBjaGFubmVsX21vZGU6IGkzMiwKLSAgICApIC0+IGJvb2w7Ci0gICAgZm4gc2V0X3ZvbHVtZSgmbXV0IHNlbGYsIHZvbHVtZTogaTMyKTsKLSAgICBmbiBzdGFydF9hdWRpb19yZXF1ZXN0KCZtdXQgc2VsZik7Ci0gICAgZm4gc3RvcF9hdWRpb19yZXF1ZXN0KCZtdXQgc2VsZik7Ci0gICAgZm4gZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigmbXV0IHNlbGYpIC0+IFByZXNlbnRhdGlvblBvc2l0aW9uOwotfQotCi1wdWIgdHJhaXQgSUJsdWV0b290aE1lZGlhQ2FsbGJhY2sgewotICAgIC8vLwotICAgIGZuIG9uX2JsdWV0b290aF9hdWRpb19kZXZpY2VfYWRkZWQoCi0gICAgICAgICZzZWxmLAotICAgICAgICBhZGRyOiBTdHJpbmcsCi0gICAgICAgIHNhbXBsZV9yYXRlOiBpMzIsCi0gICAgICAgIGJpdHNfcGVyX3NhbXBsZTogaTMyLAotICAgICAgICBjaGFubmVsX21vZGU6IGkzMiwKLSAgICApOwotCi0gICAgLy8vCi0gICAgZm4gb25fYmx1ZXRvb3RoX2F1ZGlvX2RldmljZV9yZW1vdmVkKCZzZWxmLCBhZGRyOiBTdHJpbmcpOwotCi0gICAgLy8vCi0gICAgZm4gb25fYWJzb2x1dGVfdm9sdW1lX3N1cHBvcnRlZF9jaGFuZ2VkKCZzZWxmLCBzdXBwb3J0ZWQ6IGJvb2wpOwotCi0gICAgLy8vCi0gICAgZm4gb25fYWJzb2x1dGVfdm9sdW1lX2NoYW5nZWQoJnNlbGYsIHZvbHVtZTogaTMyKTsKLX0KLQotLy8vIEFjdGlvbnMgdGhhdCBgQmx1ZXRvb3RoTWVkaWFgIGNhbiB0YWtlIG9uIGJlaGFsZiBvZiB0aGUgc3RhY2suCi1wdWIgZW51bSBNZWRpYUFjdGlvbnMgewotICAgIENvbm5lY3QoU3RyaW5nKSwKLSAgICBEaXNjb25uZWN0KFN0cmluZyksCi19Ci0KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoTWVkaWEgewotICAgIGludGY6IEFyYzxNdXRleDxCbHVldG9vdGhJbnRlcmZhY2U+PiwKLSAgICBpbml0aWFsaXplZDogYm9vbCwKLSAgICBjYWxsYmFja3M6IFZlYzwodTMyLCBCb3g8ZHluIElCbHVldG9vdGhNZWRpYUNhbGxiYWNrICsgU2VuZD4pPiwKLSAgICBjYWxsYmFja19sYXN0X2lkOiB1MzIsCi0gICAgdHg6IFNlbmRlcjxNZXNzYWdlPiwKLSAgICBhMmRwOiBPcHRpb248QTJkcD4sCi0gICAgYXZyY3A6IE9wdGlvbjxBdnJjcD4sCi0gICAgYTJkcF9zdGF0ZXM6IEhhc2hNYXA8UmF3QWRkcmVzcywgQnRhdkNvbm5lY3Rpb25TdGF0ZT4sCi0gICAgaGZwOiBPcHRpb248SGZwPiwKLSAgICBoZnBfc3RhdGVzOiBIYXNoTWFwPFJhd0FkZHJlc3MsIEJ0aGZDb25uZWN0aW9uU3RhdGU+LAotICAgIHNlbGVjdGFibGVfY2FwczogSGFzaE1hcDxSYXdBZGRyZXNzLCBWZWM8QTJkcENvZGVjQ29uZmlnPj4sCi19Ci0KLWltcGwgQmx1ZXRvb3RoTWVkaWEgewotICAgIHB1YiBmbiBuZXcodHg6IFNlbmRlcjxNZXNzYWdlPiwgaW50ZjogQXJjPE11dGV4PEJsdWV0b290aEludGVyZmFjZT4+KSAtPiBCbHVldG9vdGhNZWRpYSB7Ci0gICAgICAgIEJsdWV0b290aE1lZGlhIHsKLSAgICAgICAgICAgIGludGYsCi0gICAgICAgICAgICBpbml0aWFsaXplZDogZmFsc2UsCi0gICAgICAgICAgICBjYWxsYmFja3M6IHZlYyFbXSwKLSAgICAgICAgICAgIGNhbGxiYWNrX2xhc3RfaWQ6IDAsCi0gICAgICAgICAgICB0eCwKLSAgICAgICAgICAgIGEyZHA6IE5vbmUsCi0gICAgICAgICAgICBhdnJjcDogTm9uZSwKLSAgICAgICAgICAgIGEyZHBfc3RhdGVzOiBIYXNoTWFwOjpuZXcoKSwKLSAgICAgICAgICAgIGhmcDogTm9uZSwKLSAgICAgICAgICAgIGhmcF9zdGF0ZXM6IEhhc2hNYXA6Om5ldygpLAotICAgICAgICAgICAgc2VsZWN0YWJsZV9jYXBzOiBIYXNoTWFwOjpuZXcoKSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YiBmbiBkaXNwYXRjaF9hMmRwX2NhbGxiYWNrcygmbXV0IHNlbGYsIGNiOiBBMmRwQ2FsbGJhY2tzKSB7Ci0gICAgICAgIG1hdGNoIGNiIHsKLSAgICAgICAgICAgIEEyZHBDYWxsYmFja3M6OkNvbm5lY3Rpb25TdGF0ZShhZGRyLCBzdGF0ZSkgPT4gewotICAgICAgICAgICAgICAgIGlmICFzZWxmLmEyZHBfc3RhdGVzLmdldCgmYWRkcikuaXNfbm9uZSgpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRlID09ICpzZWxmLmEyZHBfc3RhdGVzLmdldCgmYWRkcikudW53cmFwKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWF0Y2ggc3RhdGUgewotICAgICAgICAgICAgICAgICAgICBCdGF2Q29ubmVjdGlvblN0YXRlOjpDb25uZWN0ZWQgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV0IFNvbWUoY2FwcykgPSBzZWxmLnNlbGVjdGFibGVfY2Fwcy5nZXQoJmFkZHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2FwIGluIGNhcHMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IGNvZGVjcyBvdGhlciB0aGFuIFNCQy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgQTJkcENvZGVjSW5kZXg6OlNyY1NiYyAhPSBBMmRwQ29kZWNJbmRleDo6ZnJvbShjYXAuY29kZWNfdHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcl9hbGxfY2FsbGJhY2tzKHxjYWxsYmFja3wgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25fYmx1ZXRvb3RoX2F1ZGlvX2RldmljZV9hZGRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLnRvX3N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXAuYml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5jaGFubmVsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCdGF2Q29ubmVjdGlvblN0YXRlOjpDb25uZWN0aW5nID0+IHt9Ci0gICAgICAgICAgICAgICAgICAgIEJ0YXZDb25uZWN0aW9uU3RhdGU6OkRpc2Nvbm5lY3RlZCA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcl9hbGxfY2FsbGJhY2tzKHxjYWxsYmFja3wgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uX2JsdWV0b290aF9hdWRpb19kZXZpY2VfcmVtb3ZlZChhZGRyLnRvX3N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEJ0YXZDb25uZWN0aW9uU3RhdGU6OkRpc2Nvbm5lY3RpbmcgPT4ge30KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIHNlbGYuYTJkcF9zdGF0ZXMuaW5zZXJ0KGFkZHIsIHN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEEyZHBDYWxsYmFja3M6OkF1ZGlvU3RhdGUoX2FkZHIsIF9zdGF0ZSkgPT4ge30KLSAgICAgICAgICAgIEEyZHBDYWxsYmFja3M6OkF1ZGlvQ29uZmlnKGFkZHIsIF9jb25maWcsIF9sb2NhbF9jYXBzLCBzZWxlY3RhYmxlX2NhcHMpID0+IHsKLSAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGFibGVfY2Fwcy5pbnNlcnQoYWRkciwgc2VsZWN0YWJsZV9jYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEEyZHBDYWxsYmFja3M6Ok1hbmRhdG9yeUNvZGVjUHJlZmVycmVkKF9hZGRyKSA9PiB7fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHViIGZuIGRpc3BhdGNoX2F2cmNwX2NhbGxiYWNrcygmbXV0IHNlbGYsIGNiOiBBdnJjcENhbGxiYWNrcykgewotICAgICAgICBtYXRjaCBjYiB7Ci0gICAgICAgICAgICBBdnJjcENhbGxiYWNrczo6QXZyY3BBYnNvbHV0ZVZvbHVtZUVuYWJsZWQoc3VwcG9ydGVkKSA9PiB7Ci0gICAgICAgICAgICAgICAgc2VsZi5mb3JfYWxsX2NhbGxiYWNrcyh8Y2FsbGJhY2t8IHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25fYWJzb2x1dGVfdm9sdW1lX3N1cHBvcnRlZF9jaGFuZ2VkKHN1cHBvcnRlZCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdnJjcENhbGxiYWNrczo6QXZyY3BBYnNvbHV0ZVZvbHVtZVVwZGF0ZSh2b2x1bWUpID0+IHsKLSAgICAgICAgICAgICAgICBzZWxmLmZvcl9hbGxfY2FsbGJhY2tzKHxjYWxsYmFja3wgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbl9hYnNvbHV0ZV92b2x1bWVfY2hhbmdlZChpMzI6OmZyb20odm9sdW1lKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWIgZm4gZGlzcGF0Y2hfbWVkaWFfYWN0aW9ucygmbXV0IHNlbGYsIGFjdGlvbjogTWVkaWFBY3Rpb25zKSB7Ci0gICAgICAgIG1hdGNoIGFjdGlvbiB7Ci0gICAgICAgICAgICBNZWRpYUFjdGlvbnM6OkNvbm5lY3QoYWRkcmVzcykgPT4gc2VsZi5jb25uZWN0KGFkZHJlc3MpLAotICAgICAgICAgICAgTWVkaWFBY3Rpb25zOjpEaXNjb25uZWN0KGFkZHJlc3MpID0+IHNlbGYuZGlzY29ubmVjdChhZGRyZXNzKSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YiBmbiBkaXNwYXRjaF9oZnBfY2FsbGJhY2tzKCZtdXQgc2VsZiwgY2I6IEhmcENhbGxiYWNrcykgewotICAgICAgICBtYXRjaCBjYiB7Ci0gICAgICAgICAgICBIZnBDYWxsYmFja3M6OkNvbm5lY3Rpb25TdGF0ZShzdGF0ZSwgYWRkcikgPT4gewotICAgICAgICAgICAgICAgIGlmICFzZWxmLmhmcF9zdGF0ZXMuZ2V0KCZhZGRyKS5pc19ub25lKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgc3RhdGUgPT0gKnNlbGYuaGZwX3N0YXRlcy5nZXQoJmFkZHIpLnVud3JhcCgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hdGNoIHN0YXRlIHsKLSAgICAgICAgICAgICAgICAgICAgQnRoZkNvbm5lY3Rpb25TdGF0ZTo6Q29ubmVjdGVkID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEludGVncmF0ZSB3aXRoIEEyZHAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCdGhmQ29ubmVjdGlvblN0YXRlOjpDb25uZWN0aW5nID0+IHt9Ci0gICAgICAgICAgICAgICAgICAgIEJ0aGZDb25uZWN0aW9uU3RhdGU6OkRpc2Nvbm5lY3RlZCA9PiB7fQotICAgICAgICAgICAgICAgICAgICBCdGhmQ29ubmVjdGlvblN0YXRlOjpEaXNjb25uZWN0aW5nID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEludGVncmF0ZSB3aXRoIEEyZHAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZuIGZvcl9hbGxfY2FsbGJhY2tzPEY6IEZuKCZCb3g8ZHluIElCbHVldG9vdGhNZWRpYUNhbGxiYWNrICsgU2VuZD4pPigmc2VsZiwgZjogRikgewotICAgICAgICBmb3IgY2FsbGJhY2sgaW4gJnNlbGYuY2FsbGJhY2tzIHsKLSAgICAgICAgICAgIGYoJmNhbGxiYWNrLjEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1mbiBnZXRfYTJkcF9kaXNwYXRjaGVyKHR4OiBTZW5kZXI8TWVzc2FnZT4pIC0+IEEyZHBDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBBMmRwQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgICAgIGRpc3BhdGNoOiBCb3g6Om5ldyhtb3ZlIHxjYnwgewotICAgICAgICAgICAgbGV0IHR4bCA9IHR4LmNsb25lKCk7Ci0gICAgICAgICAgICB0b3BzdGFjazo6Z2V0X3J1bnRpbWUoKS5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgICAgICBsZXQgXyA9IHR4bC5zZW5kKE1lc3NhZ2U6OkEyZHAoY2IpKS5hd2FpdDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KSwKLSAgICB9Ci19Ci0KLWZuIGdldF9hdnJjcF9kaXNwYXRjaGVyKHR4OiBTZW5kZXI8TWVzc2FnZT4pIC0+IEF2cmNwQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgQXZyY3BDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICAgICAgZGlzcGF0Y2g6IEJveDo6bmV3KG1vdmUgfGNifCB7Ci0gICAgICAgICAgICBsZXQgdHhsID0gdHguY2xvbmUoKTsKLSAgICAgICAgICAgIHRvcHN0YWNrOjpnZXRfcnVudGltZSgpLnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgICAgIGxldCBfID0gdHhsLnNlbmQoTWVzc2FnZTo6QXZyY3AoY2IpKS5hd2FpdDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KSwKLSAgICB9Ci19Ci0KLWZuIGdldF9oZnBfZGlzcGF0Y2hlcih0eDogU2VuZGVyPE1lc3NhZ2U+KSAtPiBIZnBDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBIZnBDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICAgICAgZGlzcGF0Y2g6IEJveDo6bmV3KG1vdmUgfGNifCB7Ci0gICAgICAgICAgICBsZXQgdHhsID0gdHguY2xvbmUoKTsKLSAgICAgICAgICAgIHRvcHN0YWNrOjpnZXRfcnVudGltZSgpLnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgICAgIGxldCBfID0gdHhsLnNlbmQoTWVzc2FnZTo6SGZwKGNiKSkuYXdhaXQ7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSksCi0gICAgfQotfQotCi1pbXBsIElCbHVldG9vdGhNZWRpYSBmb3IgQmx1ZXRvb3RoTWVkaWEgewotICAgIGZuIHJlZ2lzdGVyX2NhbGxiYWNrKCZtdXQgc2VsZiwgY2FsbGJhY2s6IEJveDxkeW4gSUJsdWV0b290aE1lZGlhQ2FsbGJhY2sgKyBTZW5kPikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuY2FsbGJhY2tfbGFzdF9pZCArPSAxOwotICAgICAgICBzZWxmLmNhbGxiYWNrcy5wdXNoKChzZWxmLmNhbGxiYWNrX2xhc3RfaWQsIGNhbGxiYWNrKSk7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICBmbiBpbml0aWFsaXplKCZtdXQgc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIGlmIHNlbGYuaW5pdGlhbGl6ZWQgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIFRFU1QgQTJkcAotICAgICAgICBsZXQgYTJkcF9kaXNwYXRjaGVyID0gZ2V0X2EyZHBfZGlzcGF0Y2hlcihzZWxmLnR4LmNsb25lKCkpOwotICAgICAgICBzZWxmLmEyZHAgPSBTb21lKEEyZHA6Om5ldygmc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKSkpOwotICAgICAgICBzZWxmLmEyZHAuYXNfbXV0KCkudW53cmFwKCkuaW5pdGlhbGl6ZShhMmRwX2Rpc3BhdGNoZXIpOwotCi0gICAgICAgIC8vIEFWUkNQCi0gICAgICAgIGxldCBhdnJjcF9kaXNwYXRjaGVyID0gZ2V0X2F2cmNwX2Rpc3BhdGNoZXIoc2VsZi50eC5jbG9uZSgpKTsKLSAgICAgICAgc2VsZi5hdnJjcCA9IFNvbWUoQXZyY3A6Om5ldygmc2VsZi5pbnRmLmxvY2soKS51bndyYXAoKSkpOwotICAgICAgICBzZWxmLmF2cmNwLmFzX211dCgpLnVud3JhcCgpLmluaXRpYWxpemUoYXZyY3BfZGlzcGF0Y2hlcik7Ci0KLSAgICAgICAgLy8gSEZQCi0gICAgICAgIGxldCBoZnBfZGlzcGF0Y2hlciA9IGdldF9oZnBfZGlzcGF0Y2hlcihzZWxmLnR4LmNsb25lKCkpOwotICAgICAgICBzZWxmLmhmcCA9IFNvbWUoSGZwOjpuZXcoJnNlbGYuaW50Zi5sb2NrKCkudW53cmFwKCkpKTsKLSAgICAgICAgc2VsZi5oZnAuYXNfbXV0KCkudW53cmFwKCkuaW5pdGlhbGl6ZShoZnBfZGlzcGF0Y2hlcik7Ci0KLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIGZuIGNvbm5lY3QoJm11dCBzZWxmLCBkZXZpY2U6IFN0cmluZykgewotICAgICAgICBsZXQgYWRkciA9IFJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGRldmljZS5jbG9uZSgpKTsKLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgd2FybiEoIkludmFsaWQgZGV2aWNlIHN0cmluZyB7fSIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzZWxmLmEyZHAuYXNfbXV0KCkudW53cmFwKCkuY29ubmVjdChkZXZpY2UpOwotICAgICAgICBzZWxmLmhmcC5hc19tdXQoKS51bndyYXAoKS5jb25uZWN0KGFkZHIudW53cmFwKCkpOwotICAgIH0KLQotICAgIGZuIGNsZWFudXAoJm11dCBzZWxmKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIGZuIHNldF9hY3RpdmVfZGV2aWNlKCZtdXQgc2VsZiwgZGV2aWNlOiBTdHJpbmcpIHsKLSAgICAgICAgc2VsZi5hMmRwLmFzX211dCgpLnVud3JhcCgpLnNldF9hY3RpdmVfZGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgZm4gZGlzY29ubmVjdCgmbXV0IHNlbGYsIGRldmljZTogU3RyaW5nKSB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmNsb25lKCkpOwotICAgICAgICBpZiBhZGRyLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICB3YXJuISgiSW52YWxpZCBkZXZpY2Ugc3RyaW5nIHt9IiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGYuYTJkcC5hc19tdXQoKS51bndyYXAoKS5kaXNjb25uZWN0KGRldmljZSk7Ci0gICAgICAgIHNlbGYuaGZwLmFzX211dCgpLnVud3JhcCgpLmRpc2Nvbm5lY3QoYWRkci51bndyYXAoKSk7Ci0gICAgfQotCi0gICAgZm4gc2V0X2F1ZGlvX2NvbmZpZygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBzYW1wbGVfcmF0ZTogaTMyLAotICAgICAgICBiaXRzX3Blcl9zYW1wbGU6IGkzMiwKLSAgICAgICAgY2hhbm5lbF9tb2RlOiBpMzIsCi0gICAgKSAtPiBib29sIHsKLSAgICAgICAgaWYgIUEyZHBDb2RlY1NhbXBsZVJhdGU6OnZhbGlkYXRlX2JpdHMoc2FtcGxlX3JhdGUpCi0gICAgICAgICAgICB8fCAhQTJkcENvZGVjQml0c1BlclNhbXBsZTo6dmFsaWRhdGVfYml0cyhiaXRzX3Blcl9zYW1wbGUpCi0gICAgICAgICAgICB8fCAhQTJkcENvZGVjQ2hhbm5lbE1vZGU6OnZhbGlkYXRlX2JpdHMoY2hhbm5lbF9tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi5hMmRwLmFzX211dCgpLnVud3JhcCgpLnNldF9hdWRpb19jb25maWcoc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSwgY2hhbm5lbF9tb2RlKTsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIGZuIHNldF92b2x1bWUoJm11dCBzZWxmLCB2b2x1bWU6IGkzMikgewotICAgICAgICBtYXRjaCBpODo6dHJ5X2Zyb20odm9sdW1lKSB7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHNlbGYuYXZyY3AuYXNfbXV0KCkudW53cmFwKCkuc2V0X3ZvbHVtZSh2YWwpLAotICAgICAgICAgICAgXyA9PiAoKSwKLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBmbiBzdGFydF9hdWRpb19yZXF1ZXN0KCZtdXQgc2VsZikgewotICAgICAgICBzZWxmLmEyZHAuYXNfbXV0KCkudW53cmFwKCkuc3RhcnRfYXVkaW9fcmVxdWVzdCgpOwotICAgIH0KLQotICAgIGZuIHN0b3BfYXVkaW9fcmVxdWVzdCgmbXV0IHNlbGYpIHsKLSAgICAgICAgc2VsZi5hMmRwLmFzX211dCgpLnVud3JhcCgpLnN0b3BfYXVkaW9fcmVxdWVzdCgpOwotICAgIH0KLQotICAgIGZuIGdldF9wcmVzZW50YXRpb25fcG9zaXRpb24oJm11dCBzZWxmKSAtPiBQcmVzZW50YXRpb25Qb3NpdGlvbiB7Ci0gICAgICAgIGxldCBwb3NpdGlvbiA9IHNlbGYuYTJkcC5hc19tdXQoKS51bndyYXAoKS5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKCk7Ci0gICAgICAgIFByZXNlbnRhdGlvblBvc2l0aW9uIHsKLSAgICAgICAgICAgIHJlbW90ZV9kZWxheV9yZXBvcnRfbnM6IHBvc2l0aW9uLnJlbW90ZV9kZWxheV9yZXBvcnRfbnMsCi0gICAgICAgICAgICB0b3RhbF9ieXRlc19yZWFkOiBwb3NpdGlvbi50b3RhbF9ieXRlc19yZWFkLAotICAgICAgICAgICAgZGF0YV9wb3NpdGlvbl9zZWM6IHBvc2l0aW9uLmRhdGFfcG9zaXRpb25fc2VjLAotICAgICAgICAgICAgZGF0YV9wb3NpdGlvbl9uc2VjOiBwb3NpdGlvbi5kYXRhX3Bvc2l0aW9uX25zZWMsCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9saWIucnMgYi9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy9saWIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDM2M2UuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9saW51eC9zdGFjay9zcmMvbGliLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vISBGbHVvcmlkZS9HRCBCbHVldG9vdGggc3RhY2suCi0vLyEKLS8vISBUaGlzIGNyYXRlIHByb3ZpZGVzIHRoZSBBUEkgaW1wbGVtZW50YXRpb24gb2YgdGhlIEZsdW9yaWRlL0dEIEJsdWV0b290aCBzdGFjaywgaW5kZXBlbmRlbnQgb2YKLS8vISBhbnkgUlBDIHByb2plY3Rpb24uCi0KLSNbbWFjcm9fdXNlXQotZXh0ZXJuIGNyYXRlIG51bV9kZXJpdmU7Ci0KLXB1YiBtb2QgYmx1ZXRvb3RoOwotcHViIG1vZCBibHVldG9vdGhfZ2F0dDsKLXB1YiBtb2QgYmx1ZXRvb3RoX21lZGlhOwotcHViIG1vZCB1dWlkOwotCi11c2UgbG9nOjpkZWJ1ZzsKLXVzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKLXVzZSB0b2tpbzo6c3luYzo6bXBzYzo6Y2hhbm5lbDsKLXVzZSB0b2tpbzo6c3luYzo6bXBzYzo6e1JlY2VpdmVyLCBTZW5kZXJ9OwotCi11c2UgY3JhdGU6OmJsdWV0b290aDo6Qmx1ZXRvb3RoOwotdXNlIGNyYXRlOjpibHVldG9vdGhfZ2F0dDo6Qmx1ZXRvb3RoR2F0dDsKLXVzZSBjcmF0ZTo6Ymx1ZXRvb3RoX21lZGlhOjp7Qmx1ZXRvb3RoTWVkaWEsIE1lZGlhQWN0aW9uc307Ci11c2UgYnRfdG9wc2hpbTo6ewotICAgIGJ0aWY6OkJhc2VDYWxsYmFja3MsCi0gICAgcHJvZmlsZXM6OnsKLSAgICAgICAgYTJkcDo6QTJkcENhbGxiYWNrcywgYXZyY3A6OkF2cmNwQ2FsbGJhY2tzLCBnYXR0OjpHYXR0Q2xpZW50Q2FsbGJhY2tzLAotICAgICAgICBnYXR0OjpHYXR0U2VydmVyQ2FsbGJhY2tzLCBoZnA6OkhmcENhbGxiYWNrcywgaGlkX2hvc3Q6OkhIQ2FsbGJhY2tzLCBzZHA6OlNkcENhbGxiYWNrcywKLSAgICB9LAotfTsKLQotLy8vIFJlcHJlc2VudHMgYSBCbHVldG9vdGggYWRkcmVzcy4KLS8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBMRSByYW5kb20gYWRkcmVzc2VzLgotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcpXQotcHViIGVudW0gQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlIHsKLSAgICBBZGFwdGVyLAotICAgIENvbm5lY3Rpb24sCi19Ci0KLS8vLyBNZXNzYWdlIHR5cGVzIHRoYXQgYXJlIHNlbnQgdG8gdGhlIHN0YWNrIG1haW4gZGlzcGF0Y2ggbG9vcC4KLXB1YiBlbnVtIE1lc3NhZ2UgewotICAgIC8vIENhbGxiYWNrcyBmcm9tIGxpYmJsdWV0b290aAotICAgIEEyZHAoQTJkcENhbGxiYWNrcyksCi0gICAgQXZyY3AoQXZyY3BDYWxsYmFja3MpLAotICAgIEJhc2UoQmFzZUNhbGxiYWNrcyksCi0gICAgR2F0dENsaWVudChHYXR0Q2xpZW50Q2FsbGJhY2tzKSwKLSAgICBHYXR0U2VydmVyKEdhdHRTZXJ2ZXJDYWxsYmFja3MpLAotICAgIEhpZEhvc3QoSEhDYWxsYmFja3MpLAotICAgIEhmcChIZnBDYWxsYmFja3MpLAotICAgIFNkcChTZHBDYWxsYmFja3MpLAotCi0gICAgLy8gQWN0aW9ucyB3aXRoaW4gdGhlIHN0YWNrCi0gICAgTWVkaWEoTWVkaWFBY3Rpb25zKSwKLQotICAgIC8vIENsaWVudCBjYWxsYmFjayBkaXNjb25uZWN0aW9ucwotICAgIEJsdWV0b290aENhbGxiYWNrRGlzY29ubmVjdGVkKHUzMiwgQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlKSwKLX0KLQotLy8vIFVtYnJlbGxhIGNsYXNzIGZvciB0aGUgQmx1ZXRvb3RoIHN0YWNrLgotcHViIHN0cnVjdCBTdGFjayB7fQotCi1pbXBsIFN0YWNrIHsKLSAgICAvLy8gQ3JlYXRlcyBhbiBtcHNjIGNoYW5uZWwgZm9yIHBhc3NpbmcgbWVzc2FnZXMgdG8gdGhlIG1haW4gZGlzcGF0Y2ggbG9vcC4KLSAgICBwdWIgZm4gY3JlYXRlX2NoYW5uZWwoKSAtPiAoU2VuZGVyPE1lc3NhZ2U+LCBSZWNlaXZlcjxNZXNzYWdlPikgewotICAgICAgICBjaGFubmVsOjo8TWVzc2FnZT4oMSkKLSAgICB9Ci0KLSAgICAvLy8gUnVucyB0aGUgbWFpbiBkaXNwYXRjaCBsb29wLgotICAgIHB1YiBhc3luYyBmbiBkaXNwYXRjaCgKLSAgICAgICAgbXV0IHJ4OiBSZWNlaXZlcjxNZXNzYWdlPiwKLSAgICAgICAgYmx1ZXRvb3RoOiBBcmM8TXV0ZXg8Qm94PEJsdWV0b290aD4+PiwKLSAgICAgICAgYmx1ZXRvb3RoX2dhdHQ6IEFyYzxNdXRleDxCb3g8Qmx1ZXRvb3RoR2F0dD4+PiwKLSAgICAgICAgYmx1ZXRvb3RoX21lZGlhOiBBcmM8TXV0ZXg8Qm94PEJsdWV0b290aE1lZGlhPj4+LAotICAgICkgewotICAgICAgICBsb29wIHsKLSAgICAgICAgICAgIGxldCBtID0gcngucmVjdigpLmF3YWl0OwotCi0gICAgICAgICAgICBpZiBtLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICAgICAgZXByaW50bG4hKCJNZXNzYWdlIGRpc3BhdGNoIGxvb3AgcXVpdCIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXRjaCBtLnVud3JhcCgpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlOjpBMmRwKGEpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoX21lZGlhLmxvY2soKS51bndyYXAoKS5kaXNwYXRjaF9hMmRwX2NhbGxiYWNrcyhhKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZXNzYWdlOjpBdnJjcChhdikgPT4gewotICAgICAgICAgICAgICAgICAgICBibHVldG9vdGhfbWVkaWEubG9jaygpLnVud3JhcCgpLmRpc3BhdGNoX2F2cmNwX2NhbGxiYWNrcyhhdik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVzc2FnZTo6QmFzZShiKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWV0b290aC5sb2NrKCkudW53cmFwKCkuZGlzcGF0Y2hfYmFzZV9jYWxsYmFja3MoYik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVzc2FnZTo6R2F0dENsaWVudChtKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWV0b290aF9nYXR0LmxvY2soKS51bndyYXAoKS5kaXNwYXRjaF9nYXR0X2NsaWVudF9jYWxsYmFja3MobSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVzc2FnZTo6R2F0dFNlcnZlcihtKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xOTM2ODUxNDkpOiBkaXNwYXRjaCBHQVRUIHNlcnZlciBjYWxsYmFja3MuCi0gICAgICAgICAgICAgICAgICAgIGRlYnVnISgiVW5oYW5kbGVkIE1lc3NhZ2U6OkdhdHRTZXJ2ZXI6IHs6P30iLCBtKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZXNzYWdlOjpIZnAoaGYpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoX21lZGlhLmxvY2soKS51bndyYXAoKS5kaXNwYXRjaF9oZnBfY2FsbGJhY2tzKGhmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZXNzYWdlOjpIaWRIb3N0KF9oKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYWJwcykgLSBIYW5kbGUgaGlkIGhvc3QgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgICAgIGRlYnVnISgiUmVjZWl2ZWQgSEggY2FsbGJhY2siKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZXNzYWdlOjpTZHAocykgPT4gewotICAgICAgICAgICAgICAgICAgICBibHVldG9vdGgubG9jaygpLnVud3JhcCgpLmRpc3BhdGNoX3NkcF9jYWxsYmFja3Mocyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVzc2FnZTo6TWVkaWEoYWN0aW9uKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWV0b290aF9tZWRpYS5sb2NrKCkudW53cmFwKCkuZGlzcGF0Y2hfbWVkaWFfYWN0aW9ucyhhY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1lc3NhZ2U6OkJsdWV0b290aENhbGxiYWNrRGlzY29ubmVjdGVkKGlkLCBjYl90eXBlKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWV0b290aC5sb2NrKCkudW53cmFwKCkuY2FsbGJhY2tfZGlzY29ubmVjdGVkKGlkLCBjYl90eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vLyBTaWduaWZpZXMgdGhhdCB0aGUgb2JqZWN0IG1heSBiZSBhIHByb3h5IHRvIGEgcmVtb3RlIFJQQyBvYmplY3QuCi0vLy8KLS8vLyBBbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIFJQQ1Byb3h5IHRyYWl0IHNpZ25pZmllcyB0aGF0IHRoZSBvYmplY3QgbWF5IGJlIGEgcHJveHkgdG8gYSByZW1vdGUKLS8vLyBSUEMgb2JqZWN0LiBUaGVyZWZvcmUgdGhlIG9iamVjdCBtYXkgYmUgZGlzY29ubmVjdGVkIGFuZCB0aHVzIHNob3VsZCBpbXBsZW1lbnQKLS8vLyBgcmVnaXN0ZXJfZGlzY29ubmVjdGAgdG8gbGV0IG90aGVycyBvYnNlcnZlIHRoZSBkaXNjb25uZWN0aW9uIGV2ZW50LgotcHViIHRyYWl0IFJQQ1Byb3h5IHsKLSAgICAvLy8gUmVnaXN0ZXJzIGRpc2Nvbm5lY3Qgb2JzZXJ2ZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHJlbW90ZSBvYmplY3QgaXMgZGlzY29ubmVjdGVkLgotICAgIGZuIHJlZ2lzdGVyX2Rpc2Nvbm5lY3QoJm11dCBzZWxmLCBmOiBCb3g8ZHluIEZuKHUzMikgKyBTZW5kPikgLT4gdTMyOwotCi0gICAgLy8vIFJldHVybnMgdGhlIElEIG9mIHRoZSBvYmplY3QuIEZvciBleGFtcGxlIHRoaXMgd291bGQgYmUgYW4gb2JqZWN0IHBhdGggaW4gRC1CdXMgUlBDLgotICAgIGZuIGdldF9vYmplY3RfaWQoJnNlbGYpIC0+IFN0cmluZzsKLQotICAgIC8vLyBVbnJlZ2lzdGVycyBjYWxsYmFjayB3aXRoIHRoaXMgaWQuCi0gICAgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIGlkOiB1MzIpIC0+IGJvb2w7Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy91dWlkLnJzIGIvZ2QvcnVzdC9saW51eC9zdGFjay9zcmMvdXVpZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlMmVkZi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L2xpbnV4L3N0YWNrL3NyYy91dWlkLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8vISBDb2xsZWN0aW9uIG9mIFByb2ZpbGUgVVVJRHMgYW5kIGhlbHBlcnMgdG8gdXNlIHRoZW0uCi0KLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7SGFzaE1hcCwgSGFzaFNldH07Ci0KLXVzZSBidF90b3BzaGltOjpidGlmOjpVdWlkMTI4Qml0OwotCi0vLyBMaXN0IG9mIHByb2ZpbGUgdXVpZHMKLXB1YiBjb25zdCBBMkRQX1NJTks6ICZzdHIgPSAiMDAwMDExMEItMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIjsKLXB1YiBjb25zdCBBMkRQX1NPVVJDRTogJnN0ciA9ICIwMDAwMTEwQS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IEFEVl9BVURJT19ESVNUOiAmc3RyID0gIjAwMDAxMTBELTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgSFNQOiAmc3RyID0gIjAwMDAxMTA4LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgSFNQX0FHOiAmc3RyID0gIjAwMDAxMTEyLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgSEZQOiAmc3RyID0gIjAwMDAxMTFFLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgSEZQX0FHOiAmc3RyID0gIjAwMDAxMTFGLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgQVZSQ1BfQ09OVFJPTExFUjogJnN0ciA9ICIwMDAwMTEwRS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IEFWUkNQX1RBUkdFVDogJnN0ciA9ICIwMDAwMTEwQy0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IE9CRVhfT0JKRUNUX1BVU0g6ICZzdHIgPSAiMDAwMDExMDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIjsKLXB1YiBjb25zdCBISUQ6ICZzdHIgPSAiMDAwMDExMjQtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIjsKLXB1YiBjb25zdCBIT0dQOiAmc3RyID0gIjAwMDAxODEyLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiI7Ci1wdWIgY29uc3QgUEFOVTogJnN0ciA9ICIwMDAwMTExNS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IE5BUDogJnN0ciA9ICIwMDAwMTExNi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IEJORVA6ICZzdHIgPSAiMDAwMDAwMGYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIjsKLXB1YiBjb25zdCBQQkFQX1BDRTogJnN0ciA9ICIwMDAwMTEyZS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IFBCQVBfUFNFOiAmc3RyID0gIjAwMDAxMTJmLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgTUFQOiAmc3RyID0gIjAwMDAxMTM0LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgTU5TOiAmc3RyID0gIjAwMDAxMTMzLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgTUFTOiAmc3RyID0gIjAwMDAxMTMyLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgU0FQOiAmc3RyID0gIjAwMDAxMTJELTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgSEVBUklOR19BSUQ6ICZzdHIgPSAiMDAwMEZERjAtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIjsKLXB1YiBjb25zdCBMRV9BVURJTzogJnN0ciA9ICJFRUVFRUVFRS1FRUVFLUVFRUUtRUVFRS1FRUVFRUVFRUVFRUUiOwotcHViIGNvbnN0IERJUDogJnN0ciA9ICIwMDAwMTIwMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IFZPTFVNRV9DT05UUk9MOiAmc3RyID0gIjAwMDAxODQ0LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgR0VORVJJQ19NRURJQV9DT05UUk9MOiAmc3RyID0gIjAwMDAxODQ5LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiI7Ci1wdWIgY29uc3QgTUVESUFfQ09OVFJPTDogJnN0ciA9ICIwMDAwMTg0OC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IENPT1JESU5BVEVEX1NFVDogJnN0ciA9ICIwMDAwMTg0Ni0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotcHViIGNvbnN0IEJBU0VfVVVJRDogJnN0ciA9ICIwMDAwMDAwMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotCi0vLy8gTGlzdCBvZiBwcm9maWxlcyB0aGF0IHdpdGgga25vd24gdXVpZHMuCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIEhhc2gsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCwgRXEpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBQcm9maWxlIHsKLSAgICBBMmRwU2luaywKLSAgICBBMmRwU291cmNlLAotICAgIEFkdkF1ZGlvRGlzdCwKLSAgICBIc3AsCi0gICAgSHNwQWcsCi0gICAgSGZwLAotICAgIEhmcEFnLAotICAgIEF2cmNwQ29udHJvbGxlciwKLSAgICBBdnJjcFRhcmdldCwKLSAgICBPYmV4T2JqZWN0UHVzaCwKLSAgICBIaWQsCi0gICAgSG9ncCwKLSAgICBQYW51LAotICAgIE5hcCwKLSAgICBCbmVwLAotICAgIFBiYXBQY2UsCi0gICAgUGJhcFBzZSwKLSAgICBNYXAsCi0gICAgTW5zLAotICAgIE1hcywKLSAgICBTYXAsCi0gICAgSGVhcmluZ0FpZCwKLSAgICBMZUF1ZGlvLAotICAgIERpcCwKLSAgICBWb2x1bWVDb250cm9sLAotICAgIEdlbmVyaWNNZWRpYUNvbnRyb2wsCi0gICAgTWVkaWFDb250cm9sLAotICAgIENvb3JkaW5hdGVkU2V0LAotfQotCi1wdWIgc3RydWN0IFV1aWRIZWxwZXIgewotICAgIC8vLyBBIGxpc3Qgb2YgZW5hYmxlZCBwcm9maWxlcyBvbiB0aGUgc3lzdGVtLiBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgYnkgcG9saWN5LgotICAgIHB1YiBlbmFibGVkX3Byb2ZpbGVzOiBIYXNoU2V0PFByb2ZpbGU+LAotCi0gICAgLy8vIE1hcCBhIFVVSUQgdG8gYSBrbm93biBwcm9maWxlCi0gICAgcHViIHByb2ZpbGVzOiBIYXNoTWFwPFV1aWQxMjhCaXQsIFByb2ZpbGU+LAotfQotCi1pbXBsIFV1aWRIZWxwZXIgewotICAgIHB1YiBmbiBuZXcoKSAtPiBTZWxmIHsKLSAgICAgICAgbGV0IGVuYWJsZWRfcHJvZmlsZXM6IEhhc2hTZXQ8UHJvZmlsZT4gPSBbCi0gICAgICAgICAgICBQcm9maWxlOjpBMmRwU2luaywKLSAgICAgICAgICAgIFByb2ZpbGU6OkEyZHBTb3VyY2UsCi0gICAgICAgICAgICBQcm9maWxlOjpIc3AsCi0gICAgICAgICAgICBQcm9maWxlOjpIZnAsCi0gICAgICAgICAgICBQcm9maWxlOjpIaWQsCi0gICAgICAgICAgICBQcm9maWxlOjpIb2dwLAotICAgICAgICAgICAgUHJvZmlsZTo6UGFudSwKLSAgICAgICAgICAgIFByb2ZpbGU6OlBiYXBQY2UsCi0gICAgICAgICAgICBQcm9maWxlOjpNYXAsCi0gICAgICAgICAgICBQcm9maWxlOjpIZWFyaW5nQWlkLAotICAgICAgICAgICAgUHJvZmlsZTo6Vm9sdW1lQ29udHJvbCwKLSAgICAgICAgICAgIFByb2ZpbGU6OkNvb3JkaW5hdGVkU2V0LAotICAgICAgICBdCi0gICAgICAgIC5pdGVyKCkKLSAgICAgICAgLmNsb25lZCgpCi0gICAgICAgIC5jb2xsZWN0KCk7Ci0KLSAgICAgICAgbGV0IHByb2ZpbGVzOiBIYXNoTWFwPFV1aWQxMjhCaXQsIFByb2ZpbGU+ID0gWwotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKEEyRFBfU0lOSykudW53cmFwKCksIFByb2ZpbGU6OkEyZHBTaW5rKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhBMkRQX1NPVVJDRSkudW53cmFwKCksIFByb2ZpbGU6OkEyZHBTb3VyY2UpLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKEFEVl9BVURJT19ESVNUKS51bndyYXAoKSwgUHJvZmlsZTo6QWR2QXVkaW9EaXN0KSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhIU1ApLnVud3JhcCgpLCBQcm9maWxlOjpIc3ApLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKEhTUF9BRykudW53cmFwKCksIFByb2ZpbGU6OkhzcEFnKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhIRlApLnVud3JhcCgpLCBQcm9maWxlOjpIZnApLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKEhGUF9BRykudW53cmFwKCksIFByb2ZpbGU6OkhmcEFnKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhBVlJDUF9DT05UUk9MTEVSKS51bndyYXAoKSwgUHJvZmlsZTo6QXZyY3BDb250cm9sbGVyKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhBVlJDUF9UQVJHRVQpLnVud3JhcCgpLCBQcm9maWxlOjpBdnJjcFRhcmdldCksCi0gICAgICAgICAgICAoVXVpZEhlbHBlcjo6ZnJvbV9zdHJpbmcoT0JFWF9PQkpFQ1RfUFVTSCkudW53cmFwKCksIFByb2ZpbGU6Ok9iZXhPYmplY3RQdXNoKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhISUQpLnVud3JhcCgpLCBQcm9maWxlOjpIaWQpLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKEhPR1ApLnVud3JhcCgpLCBQcm9maWxlOjpIb2dwKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhQQU5VKS51bndyYXAoKSwgUHJvZmlsZTo6UGFudSksCi0gICAgICAgICAgICAoVXVpZEhlbHBlcjo6ZnJvbV9zdHJpbmcoTkFQKS51bndyYXAoKSwgUHJvZmlsZTo6TmFwKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhCTkVQKS51bndyYXAoKSwgUHJvZmlsZTo6Qm5lcCksCi0gICAgICAgICAgICAoVXVpZEhlbHBlcjo6ZnJvbV9zdHJpbmcoUEJBUF9QQ0UpLnVud3JhcCgpLCBQcm9maWxlOjpQYmFwUGNlKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhQQkFQX1BTRSkudW53cmFwKCksIFByb2ZpbGU6OlBiYXBQc2UpLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKE1BUCkudW53cmFwKCksIFByb2ZpbGU6Ok1hcCksCi0gICAgICAgICAgICAoVXVpZEhlbHBlcjo6ZnJvbV9zdHJpbmcoTU5TKS51bndyYXAoKSwgUHJvZmlsZTo6TW5zKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhNQVMpLnVud3JhcCgpLCBQcm9maWxlOjpNYXMpLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKFNBUCkudW53cmFwKCksIFByb2ZpbGU6OlNhcCksCi0gICAgICAgICAgICAoVXVpZEhlbHBlcjo6ZnJvbV9zdHJpbmcoSEVBUklOR19BSUQpLnVud3JhcCgpLCBQcm9maWxlOjpIZWFyaW5nQWlkKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhMRV9BVURJTykudW53cmFwKCksIFByb2ZpbGU6OkxlQXVkaW8pLAotICAgICAgICAgICAgKFV1aWRIZWxwZXI6OmZyb21fc3RyaW5nKERJUCkudW53cmFwKCksIFByb2ZpbGU6OkRpcCksCi0gICAgICAgICAgICAoVXVpZEhlbHBlcjo6ZnJvbV9zdHJpbmcoVk9MVU1FX0NPTlRST0wpLnVud3JhcCgpLCBQcm9maWxlOjpWb2x1bWVDb250cm9sKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhHRU5FUklDX01FRElBX0NPTlRST0wpLnVud3JhcCgpLCBQcm9maWxlOjpHZW5lcmljTWVkaWFDb250cm9sKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhNRURJQV9DT05UUk9MKS51bndyYXAoKSwgUHJvZmlsZTo6TWVkaWFDb250cm9sKSwKLSAgICAgICAgICAgIChVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhDT09SRElOQVRFRF9TRVQpLnVud3JhcCgpLCBQcm9maWxlOjpDb29yZGluYXRlZFNldCksCi0gICAgICAgIF0KLSAgICAgICAgLml0ZXIoKQotICAgICAgICAuY2xvbmVkKCkKLSAgICAgICAgLmNvbGxlY3QoKTsKLQotICAgICAgICBVdWlkSGVscGVyIHsgZW5hYmxlZF9wcm9maWxlcywgcHJvZmlsZXMgfQotICAgIH0KLQotICAgIC8vLyBDaGVja3Mgd2hldGhlciBhIFVVSUQgY29ycmVzcG9uZHMgdG8gYSBjdXJyZW50bHkgZW5hYmxlZCBwcm9maWxlLgotICAgIHB1YiBmbiBpc19wcm9maWxlX2VuYWJsZWQoJnNlbGYsIHByb2ZpbGU6ICZQcm9maWxlKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5lbmFibGVkX3Byb2ZpbGVzLmNvbnRhaW5zKHByb2ZpbGUpCi0gICAgfQotCi0gICAgLy8vIENvbnZlcnRzIGEgVVVJRCB0byBhIGtub3duIHByb2ZpbGUgZW51bS4KLSAgICBwdWIgZm4gaXNfa25vd25fcHJvZmlsZSgmc2VsZiwgdXVpZDogJlV1aWQxMjhCaXQpIC0+IE9wdGlvbjwmUHJvZmlsZT4gewotICAgICAgICBzZWxmLnByb2ZpbGVzLmdldCh1dWlkKQotICAgIH0KLQotICAgIC8vLyBDb252ZXJ0cyBhIFVVSUQgYnl0ZSBhcnJheSBpbnRvIGEgZm9ybWF0dGVkIHN0cmluZy4KLSAgICBwdWIgZm4gdG9fc3RyaW5nKHV1aWQ6ICZVdWlkMTI4Qml0KSAtPiBTdHJpbmcgewotICAgICAgICByZXR1cm4gU3RyaW5nOjpmcm9tKGZvcm1hdCEoIns6MDJ4fXs6MDJ4fXs6MDJ4fXs6MDJ4fS17OjAyeH17OjAyeH0tezowMnh9ezowMnh9LXs6MDJ4fXs6MDJ4fS17OjAyWH17OjAyWH17OjAyWH17OjAyWH17OjAyWH17OjAyWH0iLAotICAgICAgICAgICAgdXVpZFswXSwgdXVpZFsxXSwgdXVpZFsyXSwgdXVpZFszXSwKLSAgICAgICAgICAgIHV1aWRbNF0sIHV1aWRbNV0sCi0gICAgICAgICAgICB1dWlkWzZdLCB1dWlkWzddLAotICAgICAgICAgICAgdXVpZFs4XSwgdXVpZFs5XSwKLSAgICAgICAgICAgIHV1aWRbMTBdLCB1dWlkWzExXSwgdXVpZFsxMl0sIHV1aWRbMTNdLCB1dWlkWzE0XSwgdXVpZFsxNV0pKTsKLSAgICB9Ci0KLSAgICAvLy8gQ29udmVydHMgYSB3ZWxsLWZvcm1hdHRlZCBVVUlEIHN0cmluZyB0byBhIFVVSUQgYnl0ZSBhcnJheS4KLSAgICAvLy8gVGhlIFVVSUQgc3RyaW5nIHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0OgotICAgIC8vLyAxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODkwCi0gICAgcHViIGZuIGZyb21fc3RyaW5nPFM6IEludG88U3RyaW5nPj4ocmF3OiBTKSAtPiBPcHRpb248VXVpZDEyOEJpdD4gewotICAgICAgICBsZXQgcmF3OiBTdHJpbmcgPSByYXcuaW50bygpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBpbnB1dCBpcyB2YWxpZCBsZW5ndGggYW5kIGZvcm1hdHRpbmcKLSAgICAgICAgbGV0IHMgPSByYXcuc3BsaXQoJy0nKS5jb2xsZWN0Ojo8VmVjPCZzdHI+PigpOwotICAgICAgICBpZiBzLmxlbigpICE9IDUgfHwgcmF3LmxlbigpICE9IDM2IHsKLSAgICAgICAgICAgIHJldHVybiBOb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IG11dCB1dWlkOiBVdWlkMTI4Qml0ID0gWzA7IDE2XTsKLSAgICAgICAgbGV0IG11dCBpZHggPSAwOwotICAgICAgICBmb3Igc2VjdGlvbiBpbiBzLml0ZXIoKSB7Ci0gICAgICAgICAgICBmb3IgaSBpbiAoMC4uc2VjdGlvbi5sZW4oKSkuc3RlcF9ieSgyKSB7Ci0gICAgICAgICAgICAgICAgdXVpZFtpZHhdID0gbWF0Y2ggdTg6OmZyb21fc3RyX3JhZGl4KCZzZWN0aW9uW2kuLmkgKyAyXSwgMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgT2socmVzKSA9PiByZXMsCi0gICAgICAgICAgICAgICAgICAgIEVycihfKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNvbWUodXVpZCkKLSAgICB9Ci19Ci0KLSNbY2ZnKHRlc3QpXQotbW9kIHRlc3RzIHsKLSAgICB1c2Ugc3VwZXI6Oio7Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF91dWlkaGVscGVyKCkgewotICAgICAgICBsZXQgdXVpZGhlbHBlciA9IFV1aWRIZWxwZXI6Om5ldygpOwotICAgICAgICBmb3IgKHV1aWQsIF8pIGluIHV1aWRoZWxwZXIucHJvZmlsZXMuaXRlcigpIHsKLSAgICAgICAgICAgIGxldCBjb252ZXJ0ZWQgPSBVdWlkSGVscGVyOjpmcm9tX3N0cmluZyhVdWlkSGVscGVyOjp0b19zdHJpbmcoJnV1aWQpKTsKLSAgICAgICAgICAgIGFzc2VydF9lcSEoY29udmVydGVkLmlzX3NvbWUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBjb252ZXJ0ZWQuYW5kX3RoZW46OjxVdWlkMTI4Qml0LCBfPih8dXU6IFV1aWQxMjhCaXR8IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRfZXEhKCZ1dSwgdXVpZCk7Ci0gICAgICAgICAgICAgICAgTm9uZQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3BhY2tldHMvQ2FyZ28udG9tbCBiL2dkL3J1c3QvcGFja2V0cy9DYXJnby50b21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ1YmFiLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvcGFja2V0cy9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVtwYWNrYWdlXQotbmFtZSA9ICJidF9wYWNrZXRzIgotdmVyc2lvbiA9ICIwLjAuMSIKLWVkaXRpb24gPSAiMjAxOCIKLWJ1aWxkID0gImJ1aWxkLnJzIgotCi1bZGVwZW5kZW5jaWVzXQotCi1iaW5kZ2VuID0gIioiCi1ieXRlcyA9ICIqIgotbnVtLWRlcml2ZSA9ICIqIgotbnVtLXRyYWl0cyA9ICIqIgotdGhpc2Vycm9yID0gIioiCi13YWxrZGlyID0gIioiCi0KLVtsaWJdCi1wYXRoID0gImxpYi5ycyIKLWNyYXRlLXR5cGVzID0gWyJybGliIl0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvcGFja2V0cy9idWlsZC5ycyBiL2dkL3J1c3QvcGFja2V0cy9idWlsZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNmQ1OC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3BhY2tldHMvYnVpbGQucnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi11c2Ugc3RkOjplbnY7Ci11c2Ugc3RkOjpwYXRoOjpQYXRoQnVmOwotdXNlIHN0ZDo6cHJvY2Vzczo6Q29tbWFuZDsKLQotZm4gbWFpbigpIHsKLSAgICBnZW5lcmF0ZV9wYWNrZXRzKCk7Ci19Ci0KLWZuIGdlbmVyYXRlX3BhY2tldHMoKSB7Ci0gICAgbGV0IG91dF9kaXIgPSBQYXRoQnVmOjpmcm9tKGVudjo6dmFyKCJPVVRfRElSIikudW53cmFwKCkpOwotCi0gICAgbGV0IGdkX3Jvb3QgPSBtYXRjaCBlbnY6OnZhcigiUExBVEZPUk1fU1VCRElSIikgewotICAgICAgICBPayhkaXIpID0+IFBhdGhCdWY6OmZyb20oZGlyKS5qb2luKCJidC9nZCIpLAotICAgICAgICAvLyBDdXJyZW50bHkgYXQgLy9wbGF0Zm9ybTIvZ2QvcnVzdC9ydXN0L3BhY2tldHMKLSAgICAgICAgRXJyKF8pID0+IFBhdGhCdWY6OmZyb20oZW52OjpjdXJyZW50X2RpcigpLnVud3JhcCgpKS5qb2luKCIuLi8uLiIpLmNhbm9uaWNhbGl6ZSgpLnVud3JhcCgpLAotICAgIH07Ci0KLSAgICBsZXQgaW5wdXRfZmlsZXMgPSBbZ2Rfcm9vdC5qb2luKCJoY2kvaGNpX3BhY2tldHMucGRsIildOwotICAgIGxldCBvdXRwdXR0ZWQgPSBbb3V0X2Rpci5qb2luKCIuLi8uLi9oY2kvaGNpX3BhY2tldHMucnMiKV07Ci0KLSAgICAvLyBGaW5kIHRoZSBwYWNrZXRnZW4gdG9vbC4gRXhwZWN0aW5nIGl0IGF0IENBUkdPX0hPTUUvYmluCi0gICAgbGV0IHBhY2tldGdlbiA9Ci0gICAgICAgIFBhdGhCdWY6OmZyb20oZW52Ojp2YXIoIkNBUkdPX0hPTUUiKS51bndyYXAoKSkuam9pbigiYmluIikuam9pbigiYmx1ZXRvb3RoX3BhY2tldGdlbiIpOwotCi0gICAgZm9yIGkgaW4gMC4uaW5wdXRfZmlsZXMubGVuKCkgewotICAgICAgICBsZXQgb3V0cHV0ID0gQ29tbWFuZDo6bmV3KHBhY2tldGdlbi5hc19vc19zdHIoKS50b19zdHIoKS51bndyYXAoKSkKLSAgICAgICAgICAgIC5hcmcoIi0tc291cmNlX3Jvb3Q9Ii50b19vd25lZCgpICsgZ2Rfcm9vdC5hc19vc19zdHIoKS50b19zdHIoKS51bndyYXAoKSkKLSAgICAgICAgICAgIC5hcmcoIi0tb3V0PSIudG9fb3duZWQoKSArIG91dF9kaXIuYXNfb3Nfc3RyKCkudG9fc3RyKCkudW53cmFwKCkpCi0gICAgICAgICAgICAuYXJnKCItLWluY2x1ZGU9YnQvZ2QiKQotICAgICAgICAgICAgLmFyZygiLS1ydXN0IikKLSAgICAgICAgICAgIC5hcmcoaW5wdXRfZmlsZXNbaV0uYXNfb3Nfc3RyKCkudG9fc3RyKCkudW53cmFwKCkpCi0gICAgICAgICAgICAub3V0cHV0KCkKLSAgICAgICAgICAgIC51bndyYXAoKTsKLQotICAgICAgICBwcmludGxuISgKLSAgICAgICAgICAgICJTdGF0dXM6IHt9LCBzdGRvdXQ6IHt9LCBzdGRlcnI6IHt9IiwKLSAgICAgICAgICAgIG91dHB1dC5zdGF0dXMsCi0gICAgICAgICAgICBTdHJpbmc6OmZyb21fdXRmOF9sb3NzeShvdXRwdXQuc3Rkb3V0LmFzX3NsaWNlKCkpLAotICAgICAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjhfbG9zc3kob3V0cHV0LnN0ZGVyci5hc19zbGljZSgpKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEZpbGUgd2lsbCBiZSBhdCAke09VVF9ESVJ9Ly4uLy4uLyR7aW5wdXRfZmlsZXNbaV0uc3RyaXAoJy5wZGwnKX0ucnMKLSAgICAgICAgc3RkOjpmczo6cmVuYW1lKAotICAgICAgICAgICAgb3V0cHV0dGVkW2ldLmFzX29zX3N0cigpLnRvX3N0cigpLnVud3JhcCgpLAotICAgICAgICAgICAgb3V0X2Rpci5qb2luKG91dHB1dHRlZFtpXS5maWxlX25hbWUoKS51bndyYXAoKSkuYXNfb3Nfc3RyKCkudG9fc3RyKCkudW53cmFwKCksCi0gICAgICAgICkKLSAgICAgICAgLnVud3JhcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvcGFja2V0cy9jdXN0b21fdHlwZXMucnMgYi9nZC9ydXN0L3BhY2tldHMvY3VzdG9tX3R5cGVzLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhZmRjLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvcGFja2V0cy9jdXN0b21fdHlwZXMucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8hIGN1c3RvbSB0eXBlcyB0byBiZSBpbXBvcnRlZCBieSBoY2kgcGFja2V0IHBkbAotLy8hIChzaW5jZSBoY2kgZGVwZW5kcyBvbiB0aGUgcGFja2V0IGxpYnJhcnksIHdlIG5lZWQgdG8gc3BsaXQgdGhlc2Ugb3V0KQotCi11c2Ugc3RkOjpjb252ZXJ0OjpUcnlGcm9tOwotdXNlIHN0ZDo6Zm10OwotCi0vLy8gU2lnbmFsIGZvciAiZW1wdHkiIGFkZHJlc3MKLXB1YiBjb25zdCBFTVBUWV9BRERSRVNTOiBBZGRyZXNzID0gQWRkcmVzcyB7IGJ5dGVzOiBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0gfTsKLS8vLyBTaWduYWwgZm9yICJhbnkiIGFkZHJlc3MKLXB1YiBjb25zdCBBTllfQUREUkVTUzogQWRkcmVzcyA9IEFkZHJlc3MgeyBieXRlczogWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdIH07Ci0KLS8vLyBBIEJsdWV0b290aCBhZGRyZXNzCi0jW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIFBhcnRpYWxFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsT3JkLCBEZWJ1ZyldCi1wdWIgc3RydWN0IEFkZHJlc3MgewotICAgIC8vLyB0aGUgYWN0dWFsIGJ5dGVzIHJlcHJlc2VudGluZyB0aGlzIGFkZHJlc3MKLSAgICBwdWIgYnl0ZXM6IFt1ODsgNl0sCi19Ci0KLWltcGwgQWRkcmVzcyB7Ci0gICAgLy8vIHdoZXRoZXIgdGhpcyBhZGRyZXNzIGlzIGVtcHR5Ci0gICAgcHViIGZuIGlzX2VtcHR5KCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgKnNlbGYgPT0gRU1QVFlfQUREUkVTUwotICAgIH0KLX0KLQotaW1wbCBmbXQ6OkRpc3BsYXkgZm9yIEFkZHJlc3MgewotICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IGZtdDo6UmVzdWx0IHsKLSAgICAgICAgd3JpdGUhKAotICAgICAgICAgICAgZiwKLSAgICAgICAgICAgICJ7OjAyWH06ezowMlh9Ons6MDJYfTp7OjAyWH06ezowMlh9Ons6MDJYfSIsCi0gICAgICAgICAgICBzZWxmLmJ5dGVzWzVdLAotICAgICAgICAgICAgc2VsZi5ieXRlc1s0XSwKLSAgICAgICAgICAgIHNlbGYuYnl0ZXNbM10sCi0gICAgICAgICAgICBzZWxmLmJ5dGVzWzJdLAotICAgICAgICAgICAgc2VsZi5ieXRlc1sxXSwKLSAgICAgICAgICAgIHNlbGYuYnl0ZXNbMF0KLSAgICAgICAgKQotICAgIH0KLX0KLQotLy8vIFdoZW4geW91IHBhcnNlIGFuIGFkZHJlc3MgYW5kIGl0J3Mgbm90IHZhbGlkCi0jW2Rlcml2ZShEZWJ1ZywgQ2xvbmUpXQotcHViIHN0cnVjdCBJbnZhbGlkQWRkcmVzc0Vycm9yOwotCi1pbXBsIFRyeUZyb208Jlt1OF0+IGZvciBBZGRyZXNzIHsKLSAgICB0eXBlIEVycm9yID0gSW52YWxpZEFkZHJlc3NFcnJvcjsKLQotICAgIGZuIHRyeV9mcm9tKHNsaWNlOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycm9yPiB7Ci0gICAgICAgIGlmIHNsaWNlLmxlbigpID09IDYgewotICAgICAgICAgICAgbWF0Y2ggPFt1ODsgNl0+Ojp0cnlfZnJvbShzbGljZSkgewotICAgICAgICAgICAgICAgIE9rKGJ5dGVzKSA9PiBPayhTZWxmIHsgYnl0ZXMgfSksCi0gICAgICAgICAgICAgICAgRXJyKF8pID0+IEVycihJbnZhbGlkQWRkcmVzc0Vycm9yKSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVycihJbnZhbGlkQWRkcmVzc0Vycm9yKQotICAgICAgICB9Ci0gICAgfQotfQotCi1pbXBsIEZyb208QWRkcmVzcz4gZm9yIFt1ODsgNl0gewotICAgIGZuIGZyb20oYWRkcjogQWRkcmVzcykgLT4gW3U4OyA2XSB7Ci0gICAgICAgIGFkZHIuYnl0ZXMKLSAgICB9Ci19Ci0KLS8vLyBBIEJsdWV0b290aCBjbGFzcyBvZiBkZXZpY2UKLSNbZGVyaXZlKENsb25lLCBFcSwgQ29weSwgUGFydGlhbEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxPcmQsIERlYnVnKV0KLXB1YiBzdHJ1Y3QgQ2xhc3NPZkRldmljZSB7Ci0gICAgLy8vIHRoZSBhY3R1YWwgYnl0ZXMgcmVwcmVzZW50aW5nIHRoaXMgY2xhc3Mgb2YgZGV2aWNlCi0gICAgcHViIGJ5dGVzOiBbdTg7IDNdLAotfQotCi1pbXBsIGZtdDo6RGlzcGxheSBmb3IgQ2xhc3NPZkRldmljZSB7Ci0gICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gZm10OjpSZXN1bHQgewotICAgICAgICB3cml0ZSEoCi0gICAgICAgICAgICBmLAotICAgICAgICAgICAgIns6MDNYfS17OjAxWH0tezowMlh9IiwKLSAgICAgICAgICAgICgoc2VsZi5ieXRlc1syXSBhcyB1MTYpIDw8IDQpIHwgKChzZWxmLmJ5dGVzWzFdIGFzIHUxNikgPj4gNCksCi0gICAgICAgICAgICBzZWxmLmJ5dGVzWzFdICYgMHgwRiwKLSAgICAgICAgICAgIHNlbGYuYnl0ZXNbMF0KLSAgICAgICAgKQotICAgIH0KLX0KLQotLy8vIFdoZW4geW91IHBhcnNlIGEgY2xhc3Mgb2YgZGV2aWNlIGFuZCBpdCdzIG5vdCB2YWxpZAotI1tkZXJpdmUoRGVidWcsIENsb25lKV0KLXB1YiBzdHJ1Y3QgSW52YWxpZENsYXNzT2ZEZXZpY2VFcnJvcjsKLQotaW1wbCBUcnlGcm9tPCZbdThdPiBmb3IgQ2xhc3NPZkRldmljZSB7Ci0gICAgdHlwZSBFcnJvciA9IEludmFsaWRDbGFzc09mRGV2aWNlRXJyb3I7Ci0KLSAgICBmbiB0cnlfZnJvbShzbGljZTogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnJvcj4gewotICAgICAgICBpZiBzbGljZS5sZW4oKSA9PSAzIHsKLSAgICAgICAgICAgIG1hdGNoIDxbdTg7IDNdPjo6dHJ5X2Zyb20oc2xpY2UpIHsKLSAgICAgICAgICAgICAgICBPayhieXRlcykgPT4gT2soU2VsZiB7IGJ5dGVzIH0pLAotICAgICAgICAgICAgICAgIEVycihfKSA9PiBFcnIoSW52YWxpZENsYXNzT2ZEZXZpY2VFcnJvciksCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFcnIoSW52YWxpZENsYXNzT2ZEZXZpY2VFcnJvcikKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW1wbCBGcm9tPENsYXNzT2ZEZXZpY2U+IGZvciBbdTg7IDNdIHsKLSAgICBmbiBmcm9tKGNvZDogQ2xhc3NPZkRldmljZSkgLT4gW3U4OyAzXSB7Ci0gICAgICAgIGNvZC5ieXRlcwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvcGFja2V0cy9saWIucnMgYi9nZC9ydXN0L3BhY2tldHMvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNmNjlmLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvcGFja2V0cy9saWIucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vLyEgcmVpbXBvcnQgb2YgZ2VuZXJhdGVkIHBhY2tldHMgKHRvIGdvIGF3YXkgb25jZSBydXN0X2dlbnJ1bGUgZXhpc3RzKQotCi0jIVthbGxvdyhjbGlwcHk6OmFsbCldCi0jIVthbGxvdyh1bnVzZWQpXQotIyFbYWxsb3cobWlzc2luZ19kb2NzKV0KLQotcHViIG1vZCBjdXN0b21fdHlwZXM7Ci0KLXB1YiBtb2QgaGNpIHsKLSAgICB1c2UgY3JhdGU6OmN1c3RvbV90eXBlczo6KjsKLQotICAgIGluY2x1ZGUhKGNvbmNhdCEoZW52ISgiT1VUX0RJUiIpLCAiL2hjaV9wYWNrZXRzLnJzIikpOwotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zaGltL0FuZHJvaWQuYnAgYi9nZC9ydXN0L3NoaW0vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNjA0Mi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3NoaW0vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1ydXN0X2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZ2RfcnVzdF9kZWZhdWx0cyIsCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGRhcndpbjogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJnZF9mZmlfZGVmYXVsdHMiLAotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KLXJ1c3RfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJidF9zaGltX2RlZmF1bHRzIiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgY3JhdGVfbmFtZTogImJ0X3NoaW0iLAotICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAotICAgIHJ1c3RsaWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfcnMiLAotICAgICAgICAibGliYnRfY29tbW9uIiwKLSAgICAgICAgImxpYmN4eCIsCi0gICAgICAgICJsaWJ0b2tpbyIsCi0gICAgICAgICJsaWJidF9wYWNrZXRzIiwKLSAgICAgICAgImxpYmZ1dHVyZXMiLAotICAgICAgICAibGlibnVtX3RyYWl0cyIsCi0gICAgICAgICJsaWJuaXgiLAotICAgICAgICAibGlibG9nX3J1c3QiLAotICAgICAgICAibGliYnRfZmFjYWRlX2hlbHBlcnMiLAotICAgIF0sCi0gICAgcHJvY19tYWNyb3M6IFsKLSAgICAgICAgImxpYnBhc3RlIiwKLSAgICBdLAotICAgIHdob2xlX3N0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidF9jYWxsYmFja3NfY3h4IiwKLSAgICBdLAotfQotCi1ydXN0X2xpYnJhcnlfcmxpYiB7Ci0gICAgbmFtZTogImxpYmJ0X3NoaW0iLAotICAgIGRlZmF1bHRzOiBbImxpYmJ0X3NoaW1fZGVmYXVsdHMiXSwKLX0KLQotcnVzdF9mZmlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnRfc2hpbV9mZmkiLAotICAgIGRlZmF1bHRzOiBbImxpYmJ0X3NoaW1fZGVmYXVsdHMiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidF9zaGltX2JyaWRnZSIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfZmZpX2RlZmF1bHRzIl0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmJ0X2luaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgICAgICJsaWJidF9zaGltX2JyaWRnZV9oZWFkZXIiLAotICAgICAgICAibGliYnRfbWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiwKLSAgICAgICAgImN4eC1icmlkZ2UtaGVhZGVyIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbCi0gICAgICAgICJsaWJidF9pbml0X2ZsYWdzX2JyaWRnZV9jb2RlIiwKLSAgICAgICAgImxpYmJ0X3NoaW1fYnJpZGdlX2NvZGUiLAotICAgICAgICAibGliYnRfbWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfY29kZSIsCi0gICAgXSwKLSAgICBleHBvcnRfZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmJ0X2luaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgICAgICJsaWJidF9zaGltX2JyaWRnZV9oZWFkZXIiLAotICAgICAgICAibGliYnRfbWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiwKLSAgICAgICAgImN4eC1icmlkZ2UtaGVhZGVyIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJ0X2NhbGxiYWNrc19jeHhfaGVhZGVycyJdLAotICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYnRfY2FsbGJhY2tzX2N4eF9oZWFkZXJzIl0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLXVudXNlZC1jb25zdC12YXJpYWJsZSIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfZmZpX2RlZmF1bHRzIl0sCi0gICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0X3NoaW1fYnJpZGdlIiwKLSAgICAgICAgImxpYmJ0X3NoaW1fZmZpIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0X2NhbGxiYWNrc19jeHgiLAotICAgIGRlZmF1bHRzOiBbImdkX2ZmaV9kZWZhdWx0cyJdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJ0X2NhbGxiYWNrc19jeHhfaGVhZGVycyJdLAotICAgIHNyY3M6IFsiY2FsbGJhY2tzL2NhbGxiYWNrcy5jYyJdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbImxpYmJ0X3NoaW1fYnJpZGdlX2hlYWRlciIsICJjeHgtYnJpZGdlLWhlYWRlciJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi19Ci0KLWNjX2xpYnJhcnlfaGVhZGVycyB7Ci0gICAgbmFtZTogImxpYmJ0X2NhbGxiYWNrc19jeHhfaGVhZGVycyIsCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImNhbGxiYWNrcyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAibGliYnRfc2hpbV9icmlkZ2VfaGVhZGVyIiwKLSAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgLS1oZWFkZXIgPiAkKG91dCkiLAotICAgIHNyY3M6IFsic3JjL2JyaWRnZS5ycyJdLAotICAgIG91dDogWyJzcmMvYnJpZGdlLnJzLmgiXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogImxpYmJ0X3NoaW1fYnJpZGdlX2NvZGUiLAotICAgIHRvb2xzOiBbImN4eGJyaWRnZSJdLAotICAgIGNtZDogIiQobG9jYXRpb24gY3h4YnJpZGdlKSAkKGluKSA+PiAkKG91dCkiLAotICAgIHNyY3M6IFsic3JjL2JyaWRnZS5ycyJdLAotICAgIG91dDogWyJicmlkZ2UuY2MiXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogImxpYmJ0X2luaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgdG9vbHM6IFsiY3h4YnJpZGdlIl0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBjeHhicmlkZ2UpICQoaW4pIC0taGVhZGVyID4gJChvdXQpIiwKLSAgICBzcmNzOiBbInNyYy9pbml0X2ZsYWdzLnJzIl0sCi0gICAgb3V0OiBbInNyYy9pbml0X2ZsYWdzLnJzLmgiXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogImxpYmJ0X2luaXRfZmxhZ3NfYnJpZGdlX2NvZGUiLAotICAgIHRvb2xzOiBbImN4eGJyaWRnZSJdLAotICAgIGNtZDogIiQobG9jYXRpb24gY3h4YnJpZGdlKSAkKGluKSA+PiAkKG91dCkiLAotICAgIHNyY3M6IFsic3JjL2luaXRfZmxhZ3MucnMiXSwKLSAgICBvdXQ6IFsiaW5pdF9mbGFncy5jYyJdLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAibGliYnRfbWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiwKLSAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgLS1oZWFkZXIgPiAkKG91dCkiLAotICAgIHNyY3M6IFsic3JjL21lc3NhZ2VfbG9vcF90aHJlYWQucnMiXSwKLSAgICBvdXQ6IFsic3JjL21lc3NhZ2VfbG9vcF90aHJlYWQucnMuaCJdLAotfQotCi1nZW5ydWxlIHsKLSAgICBuYW1lOiAibGliYnRfbWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfY29kZSIsCi0gICAgdG9vbHM6IFsiY3h4YnJpZGdlIl0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBjeHhicmlkZ2UpICQoaW4pID4+ICQob3V0KSIsCi0gICAgc3JjczogWyJzcmMvbWVzc2FnZV9sb29wX3RocmVhZC5ycyJdLAotICAgIG91dDogWyJtZXNzYWdlX2xvb3BfdGhyZWFkLmNjIl0sCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3NoaW0vQlVJTEQuZ24gYi9nZC9ydXN0L3NoaW0vQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDJhYzIuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zaGltL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjAgR29vZ2xlCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWltcG9ydCgiLy9jb21tb24tbWsvY3h4YnJpZGdlLmduaSIpCi0KLWNvbmZpZygicnVzdF9zaGltX2NvbmZpZyIpIHsKLSAgaW5jbHVkZV9kaXJzID0gWyAiLy9idC9nZC9ydXN0L3NoaW0iIF0KLX0KLQotY3h4YnJpZGdlX2hlYWRlcigic2hpbV9icmlkZ2VfaGVhZGVyIikgewotICBzb3VyY2VzID0gWyAic3JjL2JyaWRnZS5ycyIgXQotICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbICI6cnVzdF9zaGltX2NvbmZpZyIgXQotICBkZXBzID0gWyAiOmN4eGxpYmhlYWRlciIgXQotfQotCi1jeHhicmlkZ2VfY2MoInNoaW1fYnJpZGdlX2NvZGUiKSB7Ci0gIHNvdXJjZXMgPSBbICJzcmMvYnJpZGdlLnJzIiBdCi0gIGRlcHMgPSBbICI6c2hpbV9icmlkZ2VfaGVhZGVyIiBdCi0gIGNvbmZpZ3MgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi19Ci0KLWN4eGJyaWRnZV9oZWFkZXIoImluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIpIHsKLSAgc291cmNlcyA9IFsgInNyYy9pbml0X2ZsYWdzLnJzIiBdCi0gIGFsbF9kZXBlbmRlbnRfY29uZmlncyA9IFsgIjpydXN0X3NoaW1fY29uZmlnIiBdCi0gIGRlcHMgPSBbICI6Y3h4bGliaGVhZGVyIiBdCi19Ci0KLWN4eGJyaWRnZV9jYygiaW5pdF9mbGFnc19icmlkZ2VfY29kZSIpIHsKLSAgc291cmNlcyA9IFsgInNyYy9pbml0X2ZsYWdzLnJzIiBdCi0gIGRlcHMgPSBbICI6aW5pdF9mbGFnc19icmlkZ2VfaGVhZGVyIiBdCi0gIGNvbmZpZ3MgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi19Ci0KLWN4eGJyaWRnZV9oZWFkZXIoIm1lc3NhZ2VfbG9vcF90aHJlYWRfYnJpZGdlX2hlYWRlciIpIHsKLSAgc291cmNlcyA9IFsgInNyYy9tZXNzYWdlX2xvb3BfdGhyZWFkLnJzIiBdCi0gIGFsbF9kZXBlbmRlbnRfY29uZmlncyA9IFsgIjpydXN0X3NoaW1fY29uZmlnIiBdCi0gIGRlcHMgPSBbICI6Y3h4bGliaGVhZGVyIiBdCi19Ci0KLWN4eGJyaWRnZV9jYygibWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfY29kZSIpIHsKLSAgc291cmNlcyA9IFsgInNyYy9tZXNzYWdlX2xvb3BfdGhyZWFkLnJzIiBdCi0gIGRlcHMgPSBbICI6bWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiBdCi0gIGNvbmZpZ3MgPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi19Ci0KLWN4eGJyaWRnZV9saWJoZWFkZXIoImN4eGxpYmhlYWRlciIpIHsKLSAgZGVwcyA9IFtdCi19Ci0KLXN0YXRpY19saWJyYXJ5KCJsaWJibHVldG9vdGhfcnVzdF9pbnRlcm9wIikgewotICBkZXBzID0gWwotICAgICI6Y3h4bGliaGVhZGVyIiwKLSAgICAiOmluaXRfZmxhZ3NfYnJpZGdlX2NvZGUiLAotICAgICI6bWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfY29kZSIsCi0gICAgIjpzaGltX2JyaWRnZV9jb2RlIiwKLSAgXQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zaGltL0NhcmdvLnRvbWwgYi9nZC9ydXN0L3NoaW0vQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3OTUwOS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3NoaW0vQ2FyZ28udG9tbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1bcGFja2FnZV0KLW5hbWUgPSAiYnRfc2hpbSIKLXZlcnNpb24gPSAiMC4wLjEiCi1lZGl0aW9uID0gIjIwMTgiCi0KLVtkZXBlbmRlbmNpZXNdCi0jIEJUIGRlcGVuZGVuY2llcwotYnRfY29tbW9uID0geyBwYXRoID0gIi4uL2NvbW1vbiIgfQotYnRfZmFjYWRlX2hlbHBlcnMgPSB7IHBhdGggPSAiLi4vZmFjYWRlL2hlbHBlcnMiIH0KLWJsdWV0b290aF9ycyA9IHsgcGF0aCA9ICIuLi9zdGFjayIgfQotYnRfcGFja2V0cyA9IHsgcGF0aCA9ICIuLi9wYWNrZXRzIiB9Ci0KLSMgQWxsIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gS2VlcCBhbGwgdmVyc2lvbnMgYXQgYnVpbGQvcnVzdC9DYXJnby50b21sCi1iaW5kZ2VuID0gIjAuNTciCi1ieXRlcyA9ICIxLjAiCi1jeHggPSB7IHZlcnNpb24gPSAiPTEuMC40MiIsIGZlYXR1cmVzID0gWyJjKysxNyJdIH0KLWVudl9sb2dnZXIgPSAiMC44IgotZnV0dXJlcyA9ICIwLjMiCi1ncnBjaW8gPSB7IHZlcnNpb24gPSAiMC44IiwgZmVhdHVyZXMgPSBbInByb3RvYnVmIiwgInByb3RvYnVmLWNvZGVjIiwgIm9wZW5zc2wiXSB9Ci1ncnBjaW8tc3lzID0geyB2ZXJzaW9uID0gIioiLCBmZWF0dXJlcyA9IFsib3BlbnNzbCJdIH0KLWxhenlfc3RhdGljID0gIjEuNCIKLWxvZyA9ICIwLjQiCi1uaXggPSAiMC4xOSIKLW51bS1kZXJpdmUgPSAiMC4zIgotbnVtLXRyYWl0cyA9ICIwLjIiCi1wYXN0ZSA9ICIxLjAiCi1wcm9jLW1hY3JvMiA9ICIxLjAuMjQiCi1wcm90b2J1ZiA9ICIyLjAiCi1wcm90b2MtZ3JwY2lvID0gIjIuMCIKLXByb3RvYy1ydXN0ID0gIjIuMCIKLXF1b3RlID0gIjEuMC44IgotdGhpc2Vycm9yID0gIjEuMCIKLXN5biA9IHsgdmVyc2lvbiA9ICIxLjAuNTgiLCBmZWF0dXJlcyA9IFsnZGVmYXVsdCcsICdmdWxsJ10gfQotdG9raW8gPSB7IHZlcnNpb24gPSAiMS4wIiwgZmVhdHVyZXMgPSBbJ2J5dGVzJywgJ2ZzJywgJ2lvLXV0aWwnLCAnbGliYycsICdtYWNyb3MnLCAnbWVtY2hyJywgJ21pbycsICduZXQnLCAnbnVtX2NwdXMnLCAncnQnLCAncnQtbXVsdGktdGhyZWFkJywgJ3N5bmMnLCAndGltZScsICd0b2tpby1tYWNyb3MnXSB9Ci10b2tpby1zdHJlYW0gPSAiMC4xIgotd2Fsa2RpciA9ICIyLjIiCi0KLVtsaWJdCi1wYXRoID0gInNyYy9saWIucnMiCmRpZmYgLS1naXQgYS9nZC9ydXN0L3NoaW0vY2FsbGJhY2tzL2NhbGxiYWNrcy5jYyBiL2dkL3J1c3Qvc2hpbS9jYWxsYmFja3MvY2FsbGJhY2tzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmFlOWIyLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc2hpbS9jYWxsYmFja3MvY2FsbGJhY2tzLmNjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgImNhbGxiYWNrcy9jYWxsYmFja3MuaCIKZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc2hpbS9jYWxsYmFja3MvY2FsbGJhY2tzLmggYi9nZC9ydXN0L3NoaW0vY2FsbGJhY2tzL2NhbGxiYWNrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ5ZjgxLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc2hpbS9jYWxsYmFja3MvY2FsbGJhY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zZXF1ZW5jZWRfdGFza19ydW5uZXJfaGFuZGxlLmgiCi0jaW5jbHVkZSAicnVzdC9jeHguaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci1uYW1lc3BhY2UgcnVzdCB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUQXJnPgotY2xhc3MgVHJhbXBvbGluZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIFRyYW1wb2xpbmVDYWxsYmFjayhiYXNlOjpDYWxsYmFjazx2b2lkKFRBcmcpPiBjYWxsYmFjaykgOiBjYWxsYmFja18oY2FsbGJhY2spIHt9Ci0KLSAgdm9pZCBSdW4oVEFyZyB2YWx1ZSkgY29uc3QgewotICAgIGNhbGxiYWNrXy5SdW4odmFsdWUpOwotICB9Ci0KLSBwcml2YXRlOgotICBiYXNlOjpDYWxsYmFjazx2b2lkKFRBcmcpPiBjYWxsYmFja187Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVEFyZz4KLWNsYXNzIFRyYW1wb2xpbmVPbmNlQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgVHJhbXBvbGluZU9uY2VDYWxsYmFjayhiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChUQXJnKT4gY2FsbGJhY2spCi0gICAgICA6IGNhbGxiYWNrXyhuZXcgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoVEFyZyk+KHN0ZDo6bW92ZShjYWxsYmFjaykpKSB7fQotICB+VHJhbXBvbGluZU9uY2VDYWxsYmFjaygpIHsKLSAgICBpZiAoY2FsbGJhY2tfICE9IG51bGxwdHIpIHsKLSAgICAgIGRlbGV0ZSBjYWxsYmFja187Ci0gICAgICBjYWxsYmFja18gPSBudWxscHRyOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUnVuKFRBcmcgdmFsdWUpIGNvbnN0IHsKLSAgICBzdGQ6Om1vdmUoKmNhbGxiYWNrXykuUnVuKHZhbHVlKTsKLSAgICBkZWxldGUgY2FsbGJhY2tfOwotICAgICgoVHJhbXBvbGluZU9uY2VDYWxsYmFjazxUQXJnPiopdGhpcyktPmNhbGxiYWNrXyA9IG51bGxwdHI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKFRBcmcpPiogY2FsbGJhY2tfOwotfTsKLQotY2xhc3MgT25jZUNsb3N1cmUgewotIHB1YmxpYzoKLSAgT25jZUNsb3N1cmUoYmFzZTo6T25jZUNsb3N1cmUgY2xvc3VyZSkgOiBjbG9zdXJlXyhuZXcgYmFzZTo6T25jZUNsb3N1cmUoc3RkOjptb3ZlKGNsb3N1cmUpKSkge30KLSAgfk9uY2VDbG9zdXJlKCkgewotICAgIGlmIChjbG9zdXJlXyAhPSBudWxscHRyKSB7Ci0gICAgICBkZWxldGUgY2xvc3VyZV87Ci0gICAgICBjbG9zdXJlXyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBSdW4oKSBjb25zdCB7Ci0gICAgc3RkOjptb3ZlKCpjbG9zdXJlXykuUnVuKCk7Ci0gICAgZGVsZXRlIGNsb3N1cmVfOwotICAgICgoT25jZUNsb3N1cmUqKXRoaXMpLT5jbG9zdXJlXyA9IG51bGxwdHI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJhc2U6Ok9uY2VDbG9zdXJlKiBjbG9zdXJlXzsKLX07Ci0KLXVzaW5nIHU4U2xpY2VDYWxsYmFjayA9IFRyYW1wb2xpbmVDYWxsYmFjazw6OnJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+PjsKLXVzaW5nIHU4U2xpY2VPbmNlQ2FsbGJhY2sgPSBUcmFtcG9saW5lT25jZUNhbGxiYWNrPDo6cnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4+OwotCi19ICAvLyBuYW1lc3BhY2UgcnVzdAotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotI2luY2x1ZGUgInNyYy9icmlkZ2UucnMuaCIKZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc2hpbS9zcmMvYnJpZGdlLnJzIGIvZ2QvcnVzdC9zaGltL3NyYy9icmlkZ2UucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjljOGEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zaGltL3NyYy9icmlkZ2UucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8hIE1lcmdlZCBicmlkZ2UKLQotcHViIHVzZSBjcmF0ZTo6Y29udHJvbGxlcjo6KjsKLXB1YiB1c2UgY3JhdGU6OmhjaTo6KjsKLXB1YiB1c2UgY3JhdGU6OnN0YWNrOjoqOwotCi0jW2N4eDo6YnJpZGdlKG5hbWVzcGFjZSA9IGJsdWV0b290aDo6c2hpbTo6cnVzdCldCi1wdWIgbW9kIGZmaSB7Ci0gICAgZXh0ZXJuICJSdXN0IiB7Ci0gICAgICAgIHR5cGUgU3RhY2s7Ci0gICAgICAgIHR5cGUgSGNpOwotICAgICAgICB0eXBlIENvbnRyb2xsZXI7Ci0KLSAgICAgICAgLy8gU3RhY2sKLSAgICAgICAgZm4gc3RhY2tfY3JlYXRlKCkgLT4gQm94PFN0YWNrPjsKLSAgICAgICAgZm4gc3RhY2tfc3RhcnQoc3RhY2s6ICZtdXQgU3RhY2spOwotICAgICAgICBmbiBzdGFja19zdG9wKHN0YWNrOiAmbXV0IFN0YWNrKTsKLQotICAgICAgICBmbiBnZXRfaGNpKHN0YWNrOiAmbXV0IFN0YWNrKSAtPiBCb3g8SGNpPjsKLSAgICAgICAgZm4gZ2V0X2NvbnRyb2xsZXIoc3RhY2s6ICZtdXQgU3RhY2spIC0+IEJveDxDb250cm9sbGVyPjsKLQotICAgICAgICAvLyBIQ0kKLSAgICAgICAgZm4gaGNpX3NldF9hY2xfY2FsbGJhY2soaGNpOiAmbXV0IEhjaSwgY2FsbGJhY2s6IFVuaXF1ZVB0cjx1OFNsaWNlQ2FsbGJhY2s+KTsKLSAgICAgICAgZm4gaGNpX3NldF9zY29fY2FsbGJhY2soaGNpOiAmbXV0IEhjaSwgY2FsbGJhY2s6IFVuaXF1ZVB0cjx1OFNsaWNlQ2FsbGJhY2s+KTsKLSAgICAgICAgZm4gaGNpX3NldF9pc29fY2FsbGJhY2soaGNpOiAmbXV0IEhjaSwgY2FsbGJhY2s6IFVuaXF1ZVB0cjx1OFNsaWNlQ2FsbGJhY2s+KTsKLSAgICAgICAgZm4gaGNpX3NldF9ldnRfY2FsbGJhY2soaGNpOiAmbXV0IEhjaSwgY2FsbGJhY2s6IFVuaXF1ZVB0cjx1OFNsaWNlQ2FsbGJhY2s+KTsKLSAgICAgICAgZm4gaGNpX3NldF9sZV9ldnRfY2FsbGJhY2soaGNpOiAmbXV0IEhjaSwgY2FsbGJhY2s6IFVuaXF1ZVB0cjx1OFNsaWNlQ2FsbGJhY2s+KTsKLQotICAgICAgICBmbiBoY2lfc2VuZF9jb21tYW5kKGhjaTogJm11dCBIY2ksIGRhdGE6ICZbdThdLCBjYWxsYmFjazogVW5pcXVlUHRyPHU4U2xpY2VPbmNlQ2FsbGJhY2s+KTsKLSAgICAgICAgZm4gaGNpX3NlbmRfYWNsKGhjaTogJm11dCBIY2ksIGRhdGE6ICZbdThdKTsKLSAgICAgICAgZm4gaGNpX3NlbmRfc2NvKGhjaTogJm11dCBIY2ksIGRhdGE6ICZbdThdKTsKLSAgICAgICAgZm4gaGNpX3NlbmRfaXNvKGhjaTogJm11dCBIY2ksIGRhdGE6ICZbdThdKTsKLSAgICAgICAgZm4gaGNpX3JlZ2lzdGVyX2V2ZW50KGhjaTogJm11dCBIY2ksIGV2ZW50OiB1OCk7Ci0gICAgICAgIGZuIGhjaV9yZWdpc3Rlcl9sZV9ldmVudChoY2k6ICZtdXQgSGNpLCBzdWJldmVudDogdTgpOwotCi0gICAgICAgIC8vIENvbnRyb2xsZXIKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19zaW1wbGVfcGFpcmluZyhjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19zZWN1cmVfY29ubmVjdGlvbnMoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfc2ltdWx0YW5lb3VzX2xlX2JyZWRyKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2ludGVybGFjZWRfaW5xdWlyeV9zY2FuKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX3Jzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZShjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19yb2xlX3N3aXRjaChjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c190aHJlZV9zbG90X3BhY2tldHMoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfZml2ZV9zbG90X3BhY2tldHMoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfY2xhc3NpY18ybV9waHkoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfY2xhc3NpY18zbV9waHkoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfdGhyZWVfc2xvdF9lZHJfcGFja2V0cyhjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19maXZlX3Nsb3RfZWRyX3BhY2tldHMoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfc2NvKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2h2Ml9wYWNrZXRzKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2h2M19wYWNrZXRzKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2V2M19wYWNrZXRzKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2V2NF9wYWNrZXRzKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2V2NV9wYWNrZXRzKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2VzY29fMm1fcGh5KGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2VzY29fM21fcGh5KGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX3RocmVlX3Nsb3RfZXNjb19lZHJfcGFja2V0cyhjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19ob2xkX21vZGUoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfc25pZmZfbW9kZShjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19wYXJrX21vZGUoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfbm9uX2ZsdXNoYWJsZV9wYihjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19zbmlmZl9zdWJyYXRpbmcoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfZW5jcnlwdGlvbl9wYXVzZShjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19ibGUoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0KLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19wcml2YWN5KGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX3BhY2tldF9leHRlbnNpb24oYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfYmxlXzJtX3BoeShjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19ibGVfY29kZWRfcGh5KGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2V4dGVuZGVkX2FkdmVydGlzaW5nKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX3BlcmlvZGljX2FkdmVydGlzaW5nKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX3BlcmlwaGVyYWxfaW5pdGlhdGVkX2ZlYXR1cmVfZXhjaGFuZ2UoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfY29ubmVjdGlvbl9wYXJhbWV0ZXJfcmVxdWVzdChjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlcihjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3JlY2lwaWVudChjOiAmQ29udHJvbGxlcikKLSAgICAgICAgICAgIC0+IGJvb2w7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfc3VwcG9ydHNfY29ubmVjdGVkX2lzb19zdHJlYW1fY2VudHJhbChjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19jb25uZWN0ZWRfaXNvX3N0cmVhbV9wZXJpcGhlcmFsKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2lzb19icm9hZGNhc3RlcihjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19zeW5jaHJvbml6ZWRfcmVjZWl2ZXIoYzogJkNvbnRyb2xsZXIpIC0+IGJvb2w7Ci0KLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19yZWFkaW5nX3JlbW90ZV9leHRlbmRlZF9mZWF0dXJlcyhjOiAmQ29udHJvbGxlcikgLT4gYm9vbDsKLSAgICAgICAgZm4gY29udHJvbGxlcl9zdXBwb3J0c19lbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2VuaGFuY2VkX2FjY2VwdF9zeW5jaHJvbm91c19jb25uZWN0aW9uKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotICAgICAgICBmbiBjb250cm9sbGVyX3N1cHBvcnRzX2JsZV9zZXRfcHJpdmFjeV9tb2RlKGM6ICZDb250cm9sbGVyKSAtPiBib29sOwotCi0gICAgICAgIGZuIGNvbnRyb2xsZXJfZ2V0X2FjbF9idWZmZXJfbGVuZ3RoKGM6ICZDb250cm9sbGVyKSAtPiB1MTY7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfZ2V0X2xlX2J1ZmZlcl9sZW5ndGgoYzogJkNvbnRyb2xsZXIpIC0+IHUxNjsKLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfaXNvX2J1ZmZlcl9sZW5ndGgoYzogJkNvbnRyb2xsZXIpIC0+IHUxNjsKLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfbGVfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV9sZW5ndGgoYzogJkNvbnRyb2xsZXIpIC0+IHUxNjsKLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfbGVfbWF4aW11bV90eF9kYXRhX2xlbmd0aChjOiAmQ29udHJvbGxlcikgLT4gdTE2OwotICAgICAgICBmbiBjb250cm9sbGVyX2dldF9sZV9tYXhpbXVtX3R4X3RpbWUoYzogJkNvbnRyb2xsZXIpIC0+IHUxNjsKLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfbGVfbWF4X2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoKGM6ICZDb250cm9sbGVyKSAtPiB1MTY7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfZ2V0X2xlX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzKGM6ICZDb250cm9sbGVyKSAtPiB1ODsKLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfbGVfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemUoYzogJkNvbnRyb2xsZXIpIC0+IHU4OwotICAgICAgICBmbiBjb250cm9sbGVyX2dldF9hY2xfYnVmZmVycyhjOiAmQ29udHJvbGxlcikgLT4gdTE2OwotICAgICAgICBmbiBjb250cm9sbGVyX2dldF9sZV9idWZmZXJzKGM6ICZDb250cm9sbGVyKSAtPiB1ODsKLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfaXNvX2J1ZmZlcnMoYzogJkNvbnRyb2xsZXIpIC0+IHU4OwotICAgICAgICBmbiBjb250cm9sbGVyX2dldF9sZV9jb25uZWN0X2xpc3Rfc2l6ZShjOiAmQ29udHJvbGxlcikgLT4gdTg7Ci0gICAgICAgIGZuIGNvbnRyb2xsZXJfZ2V0X2xlX3Jlc29sdmluZ19saXN0X3NpemUoYzogJkNvbnRyb2xsZXIpIC0+IHU4OwotICAgICAgICBmbiBjb250cm9sbGVyX2dldF9sZV9zdXBwb3J0ZWRfc3RhdGVzKGM6ICZDb250cm9sbGVyKSAtPiB1NjQ7Ci0KLSAgICAgICAgZm4gY29udHJvbGxlcl9nZXRfYWRkcmVzcyhjOiAmQ29udHJvbGxlcikgLT4gU3RyaW5nOwotICAgIH0KLQotICAgIHVuc2FmZSBleHRlcm4gIkMrKyIgewotICAgICAgICBpbmNsdWRlISgiY2FsbGJhY2tzL2NhbGxiYWNrcy5oIik7Ci0KLSAgICAgICAgdHlwZSB1OFNsaWNlQ2FsbGJhY2s7Ci0gICAgICAgIGZuIFJ1bihzZWxmOiAmdThTbGljZUNhbGxiYWNrLCBkYXRhOiAmW3U4XSk7Ci0KLSAgICAgICAgdHlwZSB1OFNsaWNlT25jZUNhbGxiYWNrOwotICAgICAgICBmbiBSdW4oc2VsZjogJnU4U2xpY2VPbmNlQ2FsbGJhY2ssIGRhdGE6ICZbdThdKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3NoaW0vc3JjL2NvbnRyb2xsZXIucnMgYi9nZC9ydXN0L3NoaW0vc3JjL2NvbnRyb2xsZXIucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzYxMzUuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zaGltL3NyYy9jb250cm9sbGVyLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vISBDb250cm9sbGVyIHNoaW0KLQotdXNlIGJsdWV0b290aF9yczo6aGNpOjpDb250cm9sbGVyRXhwb3J0czsKLXVzZSBidF9wYWNrZXRzOjpoY2k6Ok9wQ29kZTsKLXVzZSBwYXN0ZTo6cGFzdGU7Ci11c2Ugc3RkOjpvcHM6OkRlcmVmOwotdXNlIHN0ZDo6c3luYzo6QXJjOwotCi0jW2Rlcml2ZShDbG9uZSldCi1wdWIgc3RydWN0IENvbnRyb2xsZXIocHViIEFyYzxDb250cm9sbGVyRXhwb3J0cz4pOwotaW1wbCBEZXJlZiBmb3IgQ29udHJvbGxlciB7Ci0gICAgdHlwZSBUYXJnZXQgPSBBcmM8Q29udHJvbGxlckV4cG9ydHM+OwotICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmU2VsZjo6VGFyZ2V0IHsKLSAgICAgICAgJnNlbGYuMAotICAgIH0KLX0KLQotbWFjcm9fcnVsZXMhIGZlYXR1cmVfZ2V0dGVycyB7Ci0gICAgKCQoJGlkOmlkZW50KSwqKSA9PiB7Ci0gICAgICAgIHBhc3RlISB7Ci0gICAgICAgICAgICAkKAotICAgICAgICAgICAgICAgIHB1YiBmbiBbPGNvbnRyb2xsZXJfc3VwcG9ydHNfICRpZD5dKGM6ICZDb250cm9sbGVyKSAtPiBib29sIHsKLSAgICAgICAgICAgICAgICAgICAgYy5mZWF0dXJlcy4kaWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApKgotICAgICAgICB9Ci0gICAgfQotfQotCi1mZWF0dXJlX2dldHRlcnMhIHsKLSAgICBzaW1wbGVfcGFpcmluZywKLSAgICBzZWN1cmVfY29ubmVjdGlvbnMsCi0gICAgc2ltdWx0YW5lb3VzX2xlX2JyZWRyLAotICAgIGludGVybGFjZWRfaW5xdWlyeV9zY2FuLAotICAgIHJzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMsCi0gICAgZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZSwKLSAgICByb2xlX3N3aXRjaCwKLSAgICB0aHJlZV9zbG90X3BhY2tldHMsCi0gICAgZml2ZV9zbG90X3BhY2tldHMsCi0gICAgY2xhc3NpY18ybV9waHksCi0gICAgY2xhc3NpY18zbV9waHksCi0gICAgdGhyZWVfc2xvdF9lZHJfcGFja2V0cywKLSAgICBmaXZlX3Nsb3RfZWRyX3BhY2tldHMsCi0gICAgc2NvLAotICAgIGh2Ml9wYWNrZXRzLAotICAgIGh2M19wYWNrZXRzLAotICAgIGV2M19wYWNrZXRzLAotICAgIGV2NF9wYWNrZXRzLAotICAgIGV2NV9wYWNrZXRzLAotICAgIGVzY29fMm1fcGh5LAotICAgIGVzY29fM21fcGh5LAotICAgIHRocmVlX3Nsb3RfZXNjb19lZHJfcGFja2V0cywKLSAgICBob2xkX21vZGUsCi0gICAgc25pZmZfbW9kZSwKLSAgICBwYXJrX21vZGUsCi0gICAgbm9uX2ZsdXNoYWJsZV9wYiwKLSAgICBzbmlmZl9zdWJyYXRpbmcsCi0gICAgZW5jcnlwdGlvbl9wYXVzZSwKLSAgICBibGUKLX0KLQotbWFjcm9fcnVsZXMhIGxlX2ZlYXR1cmVfZ2V0dGVycyB7Ci0gICAgKCQoJGlkOmlkZW50KSwqKSA9PiB7Ci0gICAgICAgIHBhc3RlISB7Ci0gICAgICAgICAgICAkKAotICAgICAgICAgICAgICAgIHB1YiBmbiBbPGNvbnRyb2xsZXJfc3VwcG9ydHNfICRpZD5dKGM6ICZDb250cm9sbGVyKSAtPiBib29sIHsKLSAgICAgICAgICAgICAgICAgICAgYy5sZV9mZWF0dXJlcy4kaWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApKgotICAgICAgICB9Ci0gICAgfQotfQotCi1sZV9mZWF0dXJlX2dldHRlcnMhIHsKLSAgICBwcml2YWN5LAotICAgIHBhY2tldF9leHRlbnNpb24sCi0gICAgY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QsCi0gICAgYmxlXzJtX3BoeSwKLSAgICBibGVfY29kZWRfcGh5LAotICAgIGV4dGVuZGVkX2FkdmVydGlzaW5nLAotICAgIHBlcmlvZGljX2FkdmVydGlzaW5nLAotICAgIHBlcmlwaGVyYWxfaW5pdGlhdGVkX2ZlYXR1cmVfZXhjaGFuZ2UsCi0gICAgY29ubmVjdGlvbl9wYXJhbWV0ZXJfcmVxdWVzdCwKLSAgICBwZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlciwKLSAgICBwZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3JlY2lwaWVudCwKLSAgICBjb25uZWN0ZWRfaXNvX3N0cmVhbV9jZW50cmFsLAotICAgIGNvbm5lY3RlZF9pc29fc3RyZWFtX3BlcmlwaGVyYWwsCi0gICAgaXNvX2Jyb2FkY2FzdGVyLAotICAgIHN5bmNocm9uaXplZF9yZWNlaXZlcgotfQotCi1tYWNyb19ydWxlcyEgb3Bjb2RlX2dldHRlcnMgewotICAgICgkKCRpZDppZGVudCA9PiAkb3Bjb2RlOnBhdGgpLCopID0+IHsKLSAgICAgICAgcGFzdGUhIHsKLSAgICAgICAgICAgICQoCi0gICAgICAgICAgICAgICAgcHViIGZuIFs8Y29udHJvbGxlcl9zdXBwb3J0c18gJGlkPl0oYzogJkNvbnRyb2xsZXIpIC0+IGJvb2wgewotICAgICAgICAgICAgICAgICAgICBjLmNvbW1hbmRzLmlzX3N1cHBvcnRlZCgkb3Bjb2RlKQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICkqCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLW9wY29kZV9nZXR0ZXJzISB7Ci0gICAgcmVhZGluZ19yZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZXMgPT4gT3BDb2RlOjpSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMsCi0gICAgZW5oYW5jZWRfc2V0dXBfc3luY2hyb25vdXNfY29ubmVjdGlvbiA9PiBPcENvZGU6OkVuaGFuY2VkU2V0dXBTeW5jaHJvbm91c0Nvbm5lY3Rpb24sCi0gICAgZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24gPT4gT3BDb2RlOjpFbmhhbmNlZEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvbiwKLSAgICBibGVfc2V0X3ByaXZhY3lfbW9kZSA9PiBPcENvZGU6OkxlU2V0UHJpdmFjeU1vZGUKLX0KLQotbWFjcm9fcnVsZXMhIGZpZWxkX2dldHRlcnMgewotICAgICgkKCRpZDppZGVudCA6ICR0eXBlOnR5KSwqKSA9PiB7Ci0gICAgICAgIHBhc3RlISB7Ci0gICAgICAgICAgICAkKAotICAgICAgICAgICAgICAgIHB1YiBmbiBbPGNvbnRyb2xsZXJfZ2V0XyAkaWQ+XShjOiAmQ29udHJvbGxlcikgLT4gJHR5cGUgewotICAgICAgICAgICAgICAgICAgICBjLiRpZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICkqCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWZpZWxkX2dldHRlcnMhIHsKLSAgICBhY2xfYnVmZmVyX2xlbmd0aDogdTE2LAotICAgIGxlX2J1ZmZlcl9sZW5ndGg6IHUxNiwKLSAgICBpc29fYnVmZmVyX2xlbmd0aDogdTE2LAotICAgIGxlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoOiB1MTYsCi0gICAgbGVfbWF4X2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoOiB1MTYsCi0gICAgbGVfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHM6IHU4LAotICAgIGxlX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplOiB1OCwKLSAgICBhY2xfYnVmZmVyczogdTE2LAotICAgIGxlX2J1ZmZlcnM6IHU4LAotICAgIGlzb19idWZmZXJzOiB1OCwKLSAgICBsZV9jb25uZWN0X2xpc3Rfc2l6ZTogdTgsCi0gICAgbGVfcmVzb2x2aW5nX2xpc3Rfc2l6ZTogdTgsCi0gICAgbGVfc3VwcG9ydGVkX3N0YXRlczogdTY0Ci19Ci0KLXB1YiBmbiBjb250cm9sbGVyX2dldF9sZV9tYXhpbXVtX3R4X2RhdGFfbGVuZ3RoKGM6ICZDb250cm9sbGVyKSAtPiB1MTYgewotICAgIGMubGVfbWF4X2RhdGFfbGVuZ3RoLnN1cHBvcnRlZF9tYXhfdHhfb2N0ZXRzCi19Ci0KLXB1YiBmbiBjb250cm9sbGVyX2dldF9sZV9tYXhpbXVtX3R4X3RpbWUoYzogJkNvbnRyb2xsZXIpIC0+IHUxNiB7Ci0gICAgYy5sZV9tYXhfZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF90eF90aW1lCi19Ci0KLXB1YiBmbiBjb250cm9sbGVyX2dldF9hZGRyZXNzKGM6ICZDb250cm9sbGVyKSAtPiBTdHJpbmcgewotICAgIGMuYWRkcmVzcy50b19zdHJpbmcoKQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zaGltL3NyYy9oY2kucnMgYi9nZC9ydXN0L3NoaW0vc3JjL2hjaS5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5N2U1NS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3NoaW0vc3JjL2hjaS5ycworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLyEgSGNpIHNoaW0KLQotdXNlIGNyYXRlOjpicmlkZ2U6OmZmaTsKLXVzZSBibHVldG9vdGhfcnM6OmhjaTo6ZmFjYWRlOjpIY2lGYWNhZGVTZXJ2aWNlOwotdXNlIGJ0X2ZhY2FkZV9oZWxwZXJzOjpVOFNsaWNlUnVubmFibGU7Ci11c2UgYnRfcGFja2V0czo6aGNpOjp7QWNsUGFja2V0LCBDb21tYW5kUGFja2V0LCBJc29QYWNrZXQsIFBhY2tldCwgU2NvUGFja2V0fTsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLQotLy8gd2UgdGFrZSBvd25lcnNoaXAgd2hlbiB3ZSBnZXQgdGhlIGNhbGxiYWNrcwotdW5zYWZlIGltcGwgU2VuZCBmb3IgZmZpOjp1OFNsaWNlQ2FsbGJhY2sge30KLXVuc2FmZSBpbXBsIFNlbmQgZm9yIGZmaTo6dThTbGljZU9uY2VDYWxsYmFjayB7fQotCi1zdHJ1Y3QgQ2FsbGJhY2tXcmFwcGVyIHsKLSAgICBjYjogY3h4OjpVbmlxdWVQdHI8ZmZpOjp1OFNsaWNlQ2FsbGJhY2s+LAotfQotCi1pbXBsIFU4U2xpY2VSdW5uYWJsZSBmb3IgQ2FsbGJhY2tXcmFwcGVyIHsKLSAgICBmbiBydW4oJnNlbGYsIGRhdGE6ICZbdThdKSB7Ci0gICAgICAgIHNlbGYuY2IuUnVuKGRhdGEpOwotICAgIH0KLX0KLQotcHViIHN0cnVjdCBIY2kgewotICAgIGludGVybmFsOiBIY2lGYWNhZGVTZXJ2aWNlLAotICAgIHJ0OiBBcmM8UnVudGltZT4sCi19Ci0KLWltcGwgSGNpIHsKLSAgICBwdWIgZm4gbmV3KHJ0OiBBcmM8UnVudGltZT4sIGludGVybmFsOiBIY2lGYWNhZGVTZXJ2aWNlKSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZiB7IGludGVybmFsLCBydCB9Ci0gICAgfQotfQotCi1wdWIgZm4gaGNpX3NlbmRfY29tbWFuZCgKLSAgICBoY2k6ICZtdXQgSGNpLAotICAgIGRhdGE6ICZbdThdLAotICAgIGNhbGxiYWNrOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OnU4U2xpY2VPbmNlQ2FsbGJhY2s+LAotKSB7Ci0gICAgbG9nOjplcnJvciEoInNlbmRpbmcgY29tbWFuZDogezowMng/fSIsIGRhdGEpOwotICAgIG1hdGNoIENvbW1hbmRQYWNrZXQ6OnBhcnNlKGRhdGEpIHsKLSAgICAgICAgT2socGFja2V0KSA9PiB7Ci0gICAgICAgICAgICBsZXQgbXV0IGNvbW1hbmRzID0gaGNpLmludGVybmFsLmNvbW1hbmRzLmNsb25lKCk7Ci0gICAgICAgICAgICBoY2kucnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBjb21tYW5kcy5zZW5kKHBhY2tldCkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suUnVuKCZyZXNwLnRvX2J5dGVzKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXJyKGUpID0+IHBhbmljISgiY291bGQgbm90IHBhcnNlIGNvbW1hbmQ6IHs6P30gezowMng/fSIsIGUsIGRhdGEpLAotICAgIH0KLX0KLQotcHViIGZuIGhjaV9zZW5kX2FjbChoY2k6ICZtdXQgSGNpLCBkYXRhOiAmW3U4XSkgewotICAgIG1hdGNoIEFjbFBhY2tldDo6cGFyc2UoZGF0YSkgewotICAgICAgICBPayhwYWNrZXQpID0+IHsKLSAgICAgICAgICAgIGxldCB0eCA9IGhjaS5pbnRlcm5hbC5hY2xfdHguY2xvbmUoKTsKLSAgICAgICAgICAgIGhjaS5ydC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgICAgICB0eC5zZW5kKHBhY2tldCkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICBFcnIoZSkgPT4gcGFuaWMhKCJjb3VsZCBub3QgcGFyc2UgYWNsOiB7Oj99IHs6MDJ4P30iLCBlLCBkYXRhKSwKLSAgICB9Ci19Ci0KLXB1YiBmbiBoY2lfc2VuZF9zY28oaGNpOiAmbXV0IEhjaSwgZGF0YTogJlt1OF0pIHsKLSAgICBtYXRjaCBTY29QYWNrZXQ6OnBhcnNlKGRhdGEpIHsKLSAgICAgICAgT2socGFja2V0KSA9PiB7Ci0gICAgICAgICAgICBsZXQgdHggPSBoY2kuaW50ZXJuYWwuc2NvX3R4LmNsb25lKCk7Ci0gICAgICAgICAgICBoY2kucnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICAgICAgdHguc2VuZChwYWNrZXQpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXJyKGUpID0+IHBhbmljISgiY291bGQgbm90IHBhcnNlIHNjbzogezo/fSB7OjAyeD99IiwgZSwgZGF0YSksCi0gICAgfQotfQotCi1wdWIgZm4gaGNpX3NlbmRfaXNvKGhjaTogJm11dCBIY2ksIGRhdGE6ICZbdThdKSB7Ci0gICAgbWF0Y2ggSXNvUGFja2V0OjpwYXJzZShkYXRhKSB7Ci0gICAgICAgIE9rKHBhY2tldCkgPT4gewotICAgICAgICAgICAgbGV0IHR4ID0gaGNpLmludGVybmFsLmlzb190eC5jbG9uZSgpOwotICAgICAgICAgICAgaGNpLnJ0LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgICAgIHR4LnNlbmQocGFja2V0KS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIEVycihlKSA9PiBwYW5pYyEoImNvdWxkIG5vdCBwYXJzZSBpc286IHs6P30gezowMng/fSIsIGUsIGRhdGEpLAotICAgIH0KLX0KLQotcHViIGZuIGhjaV9yZWdpc3Rlcl9ldmVudChoY2k6ICZtdXQgSGNpLCBldmVudDogdTgpIHsKLSAgICBsZXQgbXV0IGhjaV9mYWNhZGUgPSBoY2kuaW50ZXJuYWwuY2xvbmUoKTsKLSAgICBoY2kucnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgIGhjaV9mYWNhZGUucmVnaXN0ZXJfZXZlbnQoZXZlbnQuaW50bygpKS5hd2FpdDsKLSAgICB9KTsKLX0KLQotcHViIGZuIGhjaV9yZWdpc3Rlcl9sZV9ldmVudChoY2k6ICZtdXQgSGNpLCBzdWJldmVudDogdTgpIHsKLSAgICBsZXQgbXV0IGhjaV9mYWNhZGUgPSBoY2kuaW50ZXJuYWwuY2xvbmUoKTsKLSAgICBoY2kucnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgIGhjaV9mYWNhZGUucmVnaXN0ZXJfbGVfZXZlbnQoc3ViZXZlbnQuaW50bygpKS5hd2FpdDsKLSAgICB9KTsKLX0KLQotcHViIGZuIGhjaV9zZXRfYWNsX2NhbGxiYWNrKGhjaTogJm11dCBIY2ksIGNiOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OnU4U2xpY2VDYWxsYmFjaz4pIHsKLSAgICBoY2kuaW50ZXJuYWwuYWNsX3J4LnN0cmVhbV9ydW5uYWJsZSgmaGNpLnJ0LCBDYWxsYmFja1dyYXBwZXIgeyBjYiB9KTsKLX0KLQotcHViIGZuIGhjaV9zZXRfc2NvX2NhbGxiYWNrKGhjaTogJm11dCBIY2ksIGNiOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OnU4U2xpY2VDYWxsYmFjaz4pIHsKLSAgICBoY2kuaW50ZXJuYWwuc2NvX3J4LnN0cmVhbV9ydW5uYWJsZSgmaGNpLnJ0LCBDYWxsYmFja1dyYXBwZXIgeyBjYiB9KTsKLX0KLQotcHViIGZuIGhjaV9zZXRfaXNvX2NhbGxiYWNrKGhjaTogJm11dCBIY2ksIGNiOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OnU4U2xpY2VDYWxsYmFjaz4pIHsKLSAgICBoY2kuaW50ZXJuYWwuaXNvX3J4LnN0cmVhbV9ydW5uYWJsZSgmaGNpLnJ0LCBDYWxsYmFja1dyYXBwZXIgeyBjYiB9KTsKLX0KLQotcHViIGZuIGhjaV9zZXRfZXZ0X2NhbGxiYWNrKGhjaTogJm11dCBIY2ksIGNiOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OnU4U2xpY2VDYWxsYmFjaz4pIHsKLSAgICBoY2kuaW50ZXJuYWwuZXZ0X3J4LnN0cmVhbV9ydW5uYWJsZSgmaGNpLnJ0LCBDYWxsYmFja1dyYXBwZXIgeyBjYiB9KTsKLX0KLQotcHViIGZuIGhjaV9zZXRfbGVfZXZ0X2NhbGxiYWNrKGhjaTogJm11dCBIY2ksIGNiOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OnU4U2xpY2VDYWxsYmFjaz4pIHsKLSAgICBoY2kuaW50ZXJuYWwubGVfZXZ0X3J4LnN0cmVhbV9ydW5uYWJsZSgmaGNpLnJ0LCBDYWxsYmFja1dyYXBwZXIgeyBjYiB9KTsKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc2hpbS9zcmMvaW5pdF9mbGFncy5ycyBiL2dkL3J1c3Qvc2hpbS9zcmMvaW5pdF9mbGFncy5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjZDFkNy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3NoaW0vc3JjL2luaXRfZmxhZ3MucnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jW2N4eDo6YnJpZGdlKG5hbWVzcGFjZSA9IGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzKV0KLW1vZCBmZmkgewotICAgIGV4dGVybiAiUnVzdCIgewotICAgICAgICBmbiBsb2FkKGZsYWdzOiBWZWM8U3RyaW5nPik7Ci0gICAgICAgIGZuIHNldF9hbGxfZm9yX3Rlc3RpbmcoKTsKLQotICAgICAgICBmbiBnZF9jb3JlX2lzX2VuYWJsZWQoKSAtPiBib29sOwotICAgICAgICBmbiBnZF9zZWN1cml0eV9pc19lbmFibGVkKCkgLT4gYm9vbDsKLSAgICAgICAgZm4gZ2RfYWR2ZXJ0aXNpbmdfaXNfZW5hYmxlZCgpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGdkX3NjYW5uaW5nX2lzX2VuYWJsZWQoKSAtPiBib29sOwotICAgICAgICBmbiBnZF9hY2xfaXNfZW5hYmxlZCgpIC0+IGJvb2w7Ci0gICAgICAgIGZuIGdkX2wyY2FwX2lzX2VuYWJsZWQoKSAtPiBib29sOwotICAgICAgICBmbiBnYXR0X3JvYnVzdF9jYWNoaW5nX2lzX2VuYWJsZWQoKSAtPiBib29sOwotICAgICAgICBmbiBidGFhX2hjaV9pc19lbmFibGVkKCkgLT4gYm9vbDsKLSAgICAgICAgZm4gZ2RfcnVzdF9pc19lbmFibGVkKCkgLT4gYm9vbDsKLSAgICAgICAgZm4gZ2RfbGlua19wb2xpY3lfaXNfZW5hYmxlZCgpIC0+IGJvb2w7Ci0gICAgfQotfQotCi11c2UgYnRfY29tbW9uOjppbml0X2ZsYWdzOjoqOwpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zaGltL3NyYy9saWIucnMgYi9nZC9ydXN0L3NoaW0vc3JjL2xpYi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3ZmIyNS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3NoaW0vc3JjL2xpYi5ycworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vISBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGxlZ2FjeSBDKysgY29kZQotI1ttYWNyb191c2VdCi1leHRlcm4gY3JhdGUgbGF6eV9zdGF0aWM7Ci0KLW1vZCBicmlkZ2U7Ci1tb2QgY29udHJvbGxlcjsKLW1vZCBoY2k7Ci1tb2QgaW5pdF9mbGFnczsKLW1vZCBtZXNzYWdlX2xvb3BfdGhyZWFkOwotbW9kIHN0YWNrOwpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zaGltL3NyYy9tZXNzYWdlX2xvb3BfdGhyZWFkLnJzIGIvZ2QvcnVzdC9zaGltL3NyYy9tZXNzYWdlX2xvb3BfdGhyZWFkLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdjODU1Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc2hpbS9zcmMvbWVzc2FnZV9sb29wX3RocmVhZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vISBTaGltIG91dCB0aGUgbWFpbiB0aHJlYWQgaW4gdGhlIEJUIHN0YWNrLCB0byByZWR1Y2UgdGhyZWFkaW5nIGRhbmNlcyBhdCB0aGUgc2hpbSBib3VuZGFyeQotCi11c2UgYnRfY29tbW9uOjppbml0X2ZsYWdzOwotdXNlIHN0ZDo6Y29udmVydDo6VHJ5SW50bzsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOwotdXNlIHRva2lvOjpydW50aW1lOjpSdW50aW1lOwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjp7dW5ib3VuZGVkX2NoYW5uZWwsIFVuYm91bmRlZFNlbmRlcn07Ci0KLSNbY3h4OjpicmlkZ2UobmFtZXNwYWNlID0gYmx1ZXRvb3RoOjpzaGltOjpydXN0KV0KLW1vZCBmZmkgewotICAgIHVuc2FmZSBleHRlcm4gIkMrKyIgewotICAgICAgICBpbmNsdWRlISgiY2FsbGJhY2tzL2NhbGxiYWNrcy5oIik7Ci0KLSAgICAgICAgdHlwZSBPbmNlQ2xvc3VyZTsKLSAgICAgICAgZm4gUnVuKCZzZWxmKTsKLSAgICB9Ci0KLSAgICBleHRlcm4gIlJ1c3QiIHsKLSAgICAgICAgdHlwZSBNZXNzYWdlTG9vcFRocmVhZDsKLQotICAgICAgICBmbiBtYWluX21lc3NhZ2VfbG9vcF90aHJlYWRfY3JlYXRlKCkgLT4gQm94PE1lc3NhZ2VMb29wVGhyZWFkPjsKLSAgICAgICAgZm4gbWFpbl9tZXNzYWdlX2xvb3BfdGhyZWFkX3N0YXJ0KHRocmVhZDogJm11dCBNZXNzYWdlTG9vcFRocmVhZCkgLT4gaTMyOwotICAgICAgICBmbiBtYWluX21lc3NhZ2VfbG9vcF90aHJlYWRfZG9fZGVsYXllZCgKLSAgICAgICAgICAgIHRocmVhZDogJm11dCBNZXNzYWdlTG9vcFRocmVhZCwKLSAgICAgICAgICAgIGNsb3N1cmU6IFVuaXF1ZVB0cjxPbmNlQ2xvc3VyZT4sCi0gICAgICAgICAgICBkZWxheV9tczogaTY0LAotICAgICAgICApOwotICAgIH0KLX0KLQotdW5zYWZlIGltcGwgU2VuZCBmb3IgZmZpOjpPbmNlQ2xvc3VyZSB7fQotCi1wdWIgc3RydWN0IE1lc3NhZ2VMb29wVGhyZWFkIHsKLSAgICBydDogQXJjPFJ1bnRpbWU+LAotICAgIHR4OiBVbmJvdW5kZWRTZW5kZXI8Y3h4OjpVbmlxdWVQdHI8ZmZpOjpPbmNlQ2xvc3VyZT4+LAotfQotCi1wdWIgZm4gbWFpbl9tZXNzYWdlX2xvb3BfdGhyZWFkX2NyZWF0ZSgpIC0+IEJveDxNZXNzYWdlTG9vcFRocmVhZD4gewotICAgIGFzc2VydCEoaW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpOwotCi0gICAgbGV0IHJ0ID0gY3JhdGU6OnN0YWNrOjpSVU5USU1FLmNsb25lKCk7Ci0gICAgbGV0ICh0eCwgbXV0IHJ4KSA9IHVuYm91bmRlZF9jaGFubmVsOjo8Y3h4OjpVbmlxdWVQdHI8ZmZpOjpPbmNlQ2xvc3VyZT4+KCk7Ci0gICAgcnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgIHdoaWxlIGxldCBTb21lKGMpID0gcngucmVjdigpLmF3YWl0IHsKLSAgICAgICAgICAgIGMuUnVuKCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIEJveDo6bmV3KE1lc3NhZ2VMb29wVGhyZWFkIHsgcnQsIHR4IH0pCi19Ci0KLXB1YiBmbiBtYWluX21lc3NhZ2VfbG9vcF90aHJlYWRfc3RhcnQodGhyZWFkOiAmbXV0IE1lc3NhZ2VMb29wVGhyZWFkKSAtPiBpMzIgewotICAgIGFzc2VydCEoaW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpOwotCi0gICAgdGhyZWFkLnJ0LmJsb2NrX29uKGFzeW5jIG1vdmUgeyBuaXg6OnVuaXN0ZDo6Z2V0dGlkKCkuYXNfcmF3KCkgfSkKLX0KLQotcHViIGZuIG1haW5fbWVzc2FnZV9sb29wX3RocmVhZF9kb19kZWxheWVkKAotICAgIHRocmVhZDogJm11dCBNZXNzYWdlTG9vcFRocmVhZCwKLSAgICBjbG9zdXJlOiBjeHg6OlVuaXF1ZVB0cjxmZmk6Ok9uY2VDbG9zdXJlPiwKLSAgICBkZWxheV9tczogaTY0LAotKSB7Ci0gICAgYXNzZXJ0IShpbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSk7Ci0gICAgaWYgZGVsYXlfbXMgPT0gMCB7Ci0gICAgICAgIGlmIHRocmVhZC50eC5zZW5kKGNsb3N1cmUpLmlzX2VycigpIHsKLSAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3VsZCBub3QgcG9zdCB0YXNrIC0gc2h1dHRpbmcgZG93bj8iKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocmVhZC5ydC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIC8vIE5PVEU6IHRva2lvJ3Mgc2xlZXAgY2FuJ3Qgd2FrZSB1cCB0aGUgc3lzdGVtLi4uCi0gICAgICAgICAgICAvLyBidXQgaGV5LCBuZWl0aGVyIGNvdWxkIHRoZSBtZXNzYWdlIGxvb3AgZnJvbSBsaWJjaHJvbWUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gLi4uYW5kIHRoaXMgd2F5IHdlIGRvbid0IHVzZSB0aW1lcmZkcyBhcmJpdHJhcmlseS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAjeW9sbwotICAgICAgICAgICAgdG9raW86OnRpbWU6OnNsZWVwKER1cmF0aW9uOjpmcm9tX21pbGxpcyhkZWxheV9tcy50cnlfaW50bygpLnVud3JhcF9vcigwKSkpLmF3YWl0OwotICAgICAgICAgICAgY2xvc3VyZS5SdW4oKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zaGltL3NyYy9zdGFjay5ycyBiL2dkL3J1c3Qvc2hpbS9zcmMvc3RhY2sucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDA0YTguLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zaGltL3NyYy9zdGFjay5ycworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vISBTdGFjayBtYW5hZ2VtZW50Ci0KLXVzZSBjcmF0ZTo6Y29udHJvbGxlcjo6Q29udHJvbGxlcjsKLXVzZSBjcmF0ZTo6aGNpOjpIY2k7Ci11c2UgYmx1ZXRvb3RoX3JzOjpoY2k6OkNvbnRyb2xsZXJFeHBvcnRzOwotdXNlIGJ0X2NvbW1vbjo6aW5pdF9mbGFnczsKLXVzZSBzdGQ6Om9wczo6e0RlcmVmLCBEZXJlZk11dH07Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2UgdG9raW86OnJ1bnRpbWU6OntCdWlsZGVyLCBSdW50aW1lfTsKLQotcHViIHN0cnVjdCBTdGFjayhibHVldG9vdGhfcnM6OlN0YWNrKTsKLQotaW1wbCBEZXJlZiBmb3IgU3RhY2sgewotICAgIHR5cGUgVGFyZ2V0ID0gYmx1ZXRvb3RoX3JzOjpTdGFjazsKLSAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7Ci0gICAgICAgICZzZWxmLjAKLSAgICB9Ci19Ci0KLWltcGwgRGVyZWZNdXQgZm9yIFN0YWNrIHsKLSAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFNlbGY6OlRhcmdldCB7Ci0gICAgICAgICZtdXQgc2VsZi4wCi0gICAgfQotfQotCi1sYXp5X3N0YXRpYyEgewotICAgIHB1YiBzdGF0aWMgcmVmIFJVTlRJTUU6IEFyYzxSdW50aW1lPiA9IEFyYzo6bmV3KAotICAgICAgICBCdWlsZGVyOjpuZXdfbXVsdGlfdGhyZWFkKCkKLSAgICAgICAgICAgIC53b3JrZXJfdGhyZWFkcygxKQotICAgICAgICAgICAgLm1heF9ibG9ja2luZ190aHJlYWRzKDEpCi0gICAgICAgICAgICAuZW5hYmxlX2FsbCgpCi0gICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgKTsKLX0KLQotcHViIGZuIHN0YWNrX2NyZWF0ZSgpIC0+IEJveDxTdGFjaz4gewotICAgIGFzc2VydCEoaW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpOwotCi0gICAgbGV0IGxvY2FsX3J0ID0gUlVOVElNRS5jbG9uZSgpOwotICAgIFJVTlRJTUUuYmxvY2tfb24oYXN5bmMgbW92ZSB7Ci0gICAgICAgIGxldCBzdGFjayA9IGJsdWV0b290aF9yczo6U3RhY2s6Om5ldyhsb2NhbF9ydCkuYXdhaXQ7Ci0gICAgICAgIHN0YWNrLnVzZV9kZWZhdWx0X3Nub29wKCkuYXdhaXQ7Ci0KLSAgICAgICAgQm94OjpuZXcoU3RhY2soc3RhY2spKQotICAgIH0pCi19Ci0KLXB1YiBmbiBzdGFja19zdGFydChfc3RhY2s6ICZtdXQgU3RhY2spIHsKLSAgICBhc3NlcnQhKGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKTsKLX0KLQotcHViIGZuIHN0YWNrX3N0b3Aoc3RhY2s6ICZtdXQgU3RhY2spIHsKLSAgICBhc3NlcnQhKGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKTsKLQotICAgIHN0YWNrLnN0b3BfYmxvY2tpbmcoKTsKLX0KLQotcHViIGZuIGdldF9oY2koc3RhY2s6ICZtdXQgU3RhY2spIC0+IEJveDxIY2k+IHsKLSAgICBhc3NlcnQhKGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKTsKLQotICAgIEJveDo6bmV3KEhjaTo6bmV3KAotICAgICAgICBzdGFjay5nZXRfcnVudGltZSgpLAotICAgICAgICBzdGFjay5nZXRfYmxvY2tpbmc6OjxibHVldG9vdGhfcnM6OmhjaTo6ZmFjYWRlOjpIY2lGYWNhZGVTZXJ2aWNlPigpLAotICAgICkpCi19Ci0KLXB1YiBmbiBnZXRfY29udHJvbGxlcihzdGFjazogJm11dCBTdGFjaykgLT4gQm94PENvbnRyb2xsZXI+IHsKLSAgICBhc3NlcnQhKGluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKTsKLQotICAgIEJveDo6bmV3KENvbnRyb2xsZXIoc3RhY2suZ2V0X2Jsb2NraW5nOjo8QXJjPENvbnRyb2xsZXJFeHBvcnRzPj4oKSkpCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL0FuZHJvaWQuYnAgYi9nZC9ydXN0L3N0YWNrL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWZjNjMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zdGFjay9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLXJ1c3RfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aF9ycyIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfcnVzdF9kZWZhdWx0cyJdLAotICAgIGNyYXRlX25hbWU6ICJibHVldG9vdGhfcnMiLAotICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAotICAgIGVkaXRpb246ICIyMDE4IiwKLSAgICBydXN0bGliczogWwotICAgICAgICAibGliYnRfZmFjYWRlX3Byb3RvIiwKLSAgICAgICAgImxpYmJ0X3BhY2tldHMiLAotICAgICAgICAibGliYnl0ZXMiLAotICAgICAgICAibGliZnV0dXJlcyIsCi0gICAgICAgICJsaWJ0aGlzZXJyb3IiLAotICAgICAgICAibGliZ3JwY2lvIiwKLSAgICAgICAgImxpYnRva2lvIiwKLSAgICAgICAgImxpYnRva2lvX3N0cmVhbSIsCi0gICAgICAgICJsaWJwcm90b2J1ZiIsCi0gICAgICAgICJsaWJidF9wYWNrZXRzIiwKLSAgICAgICAgImxpYmdkZGkiLAotICAgICAgICAibGliY3h4IiwKLSAgICAgICAgImxpYmxhenlfc3RhdGljIiwKLSAgICAgICAgImxpYmxvZ19ydXN0IiwKLSAgICAgICAgImxpYmJ0X2NvbW1vbiIsCi0gICAgICAgICJsaWJudW1fdHJhaXRzIiwKLSAgICAgICAgImxpYmJ0X2ZhY2FkZV9oZWxwZXJzIiwKLSAgICBdLAotICAgIHByb2NfbWFjcm9zOiBbCi0gICAgICAgICJsaWJudW1fZGVyaXZlIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJidF9oaWRsX2hhbF9jeHgiXSwKLSAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMSIsCi0gICAgICAgICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCi1ydXN0X3Rlc3RfaG9zdCB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aF9yc190ZXN0IiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJzcmMvbGliLnJzIl0sCi0gICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAotICAgIGVkaXRpb246ICIyMDE4IiwKLSAgICBydXN0bGliczogWwotICAgICAgICAibGliYnRfZmFjYWRlX3Byb3RvIiwKLSAgICAgICAgImxpYmJ0X3BhY2tldHMiLAotICAgICAgICAibGliYmx1ZXRvb3RoX3JzIiwKLSAgICAgICAgImxpYmJ5dGVzIiwKLSAgICAgICAgImxpYmZ1dHVyZXMiLAotICAgICAgICAibGlidGhpc2Vycm9yIiwKLSAgICAgICAgImxpYmdycGNpbyIsCi0gICAgICAgICJsaWJ0b2tpbyIsCi0gICAgICAgICJsaWJ0b2tpb19zdHJlYW0iLAotICAgICAgICAibGlicHJvdG9idWYiLAotICAgICAgICAibGliZ2RkaSIsCi0gICAgICAgICJsaWJjeHgiLAotICAgICAgICAibGlibGF6eV9zdGF0aWMiLAotICAgICAgICAibGlibG9nX3J1c3QiLAotICAgICAgICAibGliYnRfY29tbW9uIiwKLSAgICAgICAgImxpYm51bV90cmFpdHMiLAotICAgICAgICAibGliYnRfZmFjYWRlX2hlbHBlcnMiLAotICAgIF0sCi0gICAgcHJvY19tYWNyb3M6IFsKLSAgICAgICAgImxpYm51bV9kZXJpdmUiLAotICAgIF0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJsaWJidF9oaWRsX2hhbF9icmlkZ2VfaGVhZGVyIiwKLSAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgLS1oZWFkZXIgPiAkKG91dCkiLAotICAgIHNyY3M6IFsic3JjL2hhbC9oaWRsX2hhbC5ycyJdLAotICAgIG91dDogWyJzcmMvaGFsL2hpZGxfaGFsLnJzLmgiXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogImxpYmJ0X2hpZGxfaGFsX2JyaWRnZV9jb2RlIiwKLSAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgPj4gJChvdXQpIiwKLSAgICBzcmNzOiBbInNyYy9oYWwvaGlkbF9oYWwucnMiXSwKLSAgICBvdXQ6IFsiaGlkbF9oYWxfZ2VuZXJhdGVkLmNjIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnRfaGlkbF9oYWxfY3h4IiwKLSAgICBkZWZhdWx0czogWyJnZF9mZmlfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInNyYy9oYWwvZmZpL2hpZGwuY2MiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjL2hhbC9mZmkiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL2J0Il0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsibGliYnRfaGlkbF9oYWxfYnJpZGdlX2hlYWRlciIsICJjeHgtYnJpZGdlLWhlYWRlciJdLAotICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImxpYmJ0X2hpZGxfaGFsX2JyaWRnZV9jb2RlIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi19Ci0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svQ2FyZ28udG9tbCBiL2dkL3J1c3Qvc3RhY2svQ2FyZ28udG9tbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0M2E2My4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL0NhcmdvLnRvbWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotW3BhY2thZ2VdCi1uYW1lID0gImJsdWV0b290aF9ycyIKLXZlcnNpb24gPSAiMC4wLjEiCi1lZGl0aW9uID0gIjIwMTgiCi0KLVtkZXBlbmRlbmNpZXNdCi0jIEJUIGRlcGVuZGVuY2llcwotYnRfY29tbW9uID0geyBwYXRoID0gIi4uL2NvbW1vbiIgfQotYnRfZmFjYWRlX2hlbHBlcnMgPSB7IHBhdGggPSAiLi4vZmFjYWRlL2hlbHBlcnMiIH0KLWJ0X2ZhY2FkZV9wcm90byA9IHsgcGF0aCA9ICIuLi9mYWNhZGVfcHJvdG8iIH0KLWJ0X3BhY2tldHMgPSB7IHBhdGggPSAiLi4vcGFja2V0cyIgfQotZ2RkaSA9IHsgcGF0aCA9ICIuLi9nZGRpIiB9Ci0KLSMgRXh0ZXJuYWwgZGVwZW5kZW5jaWVzCi1ieXRlcyA9ICIqIgotY3h4ID0gIioiCi1mdXR1cmVzID0gIioiCi1ncnBjaW8gPSAiKiIKLWxhenlfc3RhdGljID0gIioiCi1sb2cgPSAiKiIKLW5peCA9ICIqIgotbnVtLXRyYWl0cyA9ICIqIgotcHJvdG9idWYgPSAiKiIKLXRoaXNlcnJvciA9ICIqIgotdG9raW8gPSAiKiIKLXRva2lvLXN0cmVhbSA9ICIqIgotd2Fsa2RpciA9ICIqIgotCi0jIE1hY3JvIGRlcGVuZGVuY2llcwotbnVtLWRlcml2ZSA9ICIqIgotCi1bbGliXQotY3JhdGUtdHlwZSA9IFsicmxpYiJdCmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvZmFjYWRlLnJzIGIvZ2QvcnVzdC9zdGFjay9zcmMvaGFsL2ZhY2FkZS5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjOGQ3OC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvZmFjYWRlLnJzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8hIEJUIEhDSSBIQUwgZmFjYWRlCi0KLXVzZSBjcmF0ZTo6aGFsOjp7QWNsSGFsLCBDb250cm9sSGFsLCBJc29IYWx9OwotdXNlIGJ0X2NvbW1vbjo6R3JwY0ZhY2FkZTsKLXVzZSBidF9mYWNhZGVfaGVscGVyczo6UnhBZGFwdGVyOwotdXNlIGJ0X2ZhY2FkZV9wcm90bzo6Y29tbW9uOjpEYXRhOwotdXNlIGJ0X2ZhY2FkZV9wcm90bzo6ZW1wdHk6OkVtcHR5OwotdXNlIGJ0X2ZhY2FkZV9wcm90bzo6aGFsX2ZhY2FkZV9ncnBjOjp7Y3JlYXRlX2hjaV9oYWxfZmFjYWRlLCBIY2lIYWxGYWNhZGV9OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6e0FjbFBhY2tldCwgQ29tbWFuZFBhY2tldCwgRXZlbnRQYWNrZXQsIElzb1BhY2tldH07Ci11c2UgZ2RkaTo6e21vZHVsZSwgcHJvdmlkZXMsIFN0b3BwYWJsZX07Ci11c2UgZ3JwY2lvOjoqOwotCi1tb2R1bGUhIHsKLSAgICBoYWxfZmFjYWRlX21vZHVsZSwKLSAgICBwcm92aWRlcnMgewotICAgICAgICBIY2lIYWxGYWNhZGVTZXJ2aWNlID0+IHByb3ZpZGVfZmFjYWRlLAotICAgIH0KLX0KLQotI1twcm92aWRlc10KLWFzeW5jIGZuIHByb3ZpZGVfZmFjYWRlKGNvbnRyb2w6IENvbnRyb2xIYWwsIGFjbDogQWNsSGFsLCBpc286IElzb0hhbCkgLT4gSGNpSGFsRmFjYWRlU2VydmljZSB7Ci0gICAgSGNpSGFsRmFjYWRlU2VydmljZSB7Ci0gICAgICAgIGV2dF9yeDogUnhBZGFwdGVyOjpmcm9tX2FyYyhjb250cm9sLnJ4LmNsb25lKCkpLAotICAgICAgICBhY2xfcng6IFJ4QWRhcHRlcjo6ZnJvbV9hcmMoYWNsLnJ4LmNsb25lKCkpLAotICAgICAgICBpc29fcng6IFJ4QWRhcHRlcjo6ZnJvbV9hcmMoaXNvLnJ4LmNsb25lKCkpLAotICAgICAgICBjb250cm9sLAotICAgICAgICBhY2wsCi0gICAgICAgIGlzbywKLSAgICB9Ci19Ci0KLS8vLyBIQ0kgSEFMIGZhY2FkZSBzZXJ2aWNlCi0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLXB1YiBzdHJ1Y3QgSGNpSGFsRmFjYWRlU2VydmljZSB7Ci0gICAgZXZ0X3J4OiBSeEFkYXB0ZXI8RXZlbnRQYWNrZXQ+LAotICAgIGFjbF9yeDogUnhBZGFwdGVyPEFjbFBhY2tldD4sCi0gICAgaXNvX3J4OiBSeEFkYXB0ZXI8SXNvUGFja2V0PiwKLSAgICBjb250cm9sOiBDb250cm9sSGFsLAotICAgIGFjbDogQWNsSGFsLAotICAgIGlzbzogSXNvSGFsLAotfQotCi1pbXBsIEdycGNGYWNhZGUgZm9yIEhjaUhhbEZhY2FkZVNlcnZpY2UgewotICAgIGZuIGludG9fZ3JwYyhzZWxmKSAtPiBncnBjaW86OlNlcnZpY2UgewotICAgICAgICBjcmVhdGVfaGNpX2hhbF9mYWNhZGUoc2VsZikKLSAgICB9Ci19Ci0KLWltcGwgSGNpSGFsRmFjYWRlIGZvciBIY2lIYWxGYWNhZGVTZXJ2aWNlIHsKLSAgICBmbiBzZW5kX2NvbW1hbmQoJm11dCBzZWxmLCBjdHg6IFJwY0NvbnRleHQ8J18+LCBtdXQgZGF0YTogRGF0YSwgc2luazogVW5hcnlTaW5rPEVtcHR5PikgewotICAgICAgICBsZXQgY21kX3R4ID0gc2VsZi5jb250cm9sLnR4LmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGNtZF90eC5zZW5kKENvbW1hbmRQYWNrZXQ6OnBhcnNlKCZkYXRhLnRha2VfcGF5bG9hZCgpKS51bndyYXAoKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICBzaW5rLnN1Y2Nlc3MoRW1wdHk6OmRlZmF1bHQoKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIGZuIHNlbmRfYWNsKCZtdXQgc2VsZiwgY3R4OiBScGNDb250ZXh0PCdfPiwgbXV0IGRhdGE6IERhdGEsIHNpbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgbGV0IGFjbF90eCA9IHNlbGYuYWNsLnR4LmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGFjbF90eC5zZW5kKEFjbFBhY2tldDo6cGFyc2UoJmRhdGEudGFrZV9wYXlsb2FkKCkpLnVud3JhcCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIHNpbmsuc3VjY2VzcyhFbXB0eTo6ZGVmYXVsdCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gc2VuZF9zY28oJm11dCBzZWxmLCBfY3R4OiBScGNDb250ZXh0PCdfPiwgX3NjbzogRGF0YSwgX3Npbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZCEoKQotICAgIH0KLQotICAgIGZuIHNlbmRfaXNvKCZtdXQgc2VsZiwgY3R4OiBScGNDb250ZXh0PCdfPiwgbXV0IGRhdGE6IERhdGEsIHNpbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgbGV0IGlzb190eCA9IHNlbGYuaXNvLnR4LmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGlzb190eC5zZW5kKElzb1BhY2tldDo6cGFyc2UoJmRhdGEudGFrZV9wYXlsb2FkKCkpLnVud3JhcCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIHNpbmsuc3VjY2VzcyhFbXB0eTo6ZGVmYXVsdCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gc3RyZWFtX2V2ZW50cygmbXV0IHNlbGYsIGN0eDogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBzaW5rOiBTZXJ2ZXJTdHJlYW1pbmdTaW5rPERhdGE+KSB7Ci0gICAgICAgIHNlbGYuZXZ0X3J4LnN0cmVhbV9ncnBjKGN0eCwgc2luayk7Ci0gICAgfQotCi0gICAgZm4gc3RyZWFtX2FjbCgmbXV0IHNlbGYsIGN0eDogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBzaW5rOiBTZXJ2ZXJTdHJlYW1pbmdTaW5rPERhdGE+KSB7Ci0gICAgICAgIHNlbGYuYWNsX3J4LnN0cmVhbV9ncnBjKGN0eCwgc2luayk7Ci0gICAgfQotCi0gICAgZm4gc3RyZWFtX3NjbygmbXV0IHNlbGYsIF9jdHg6IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgX3Npbms6IFNlcnZlclN0cmVhbWluZ1Npbms8RGF0YT4pIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZCEoKQotICAgIH0KLQotICAgIGZuIHN0cmVhbV9pc28oJm11dCBzZWxmLCBjdHg6IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgc2luazogU2VydmVyU3RyZWFtaW5nU2luazxEYXRhPikgewotICAgICAgICBzZWxmLmlzb19yeC5zdHJlYW1fZ3JwYyhjdHgsIHNpbmspOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9mZmkvaGlkbC5jYyBiL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9mZmkvaGlkbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4ZTE3MS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvZmZpL2hpZGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotI2luY2x1ZGUgInNyYy9oYWwvZmZpL2hpZGwuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoLzEuMS9JQmx1ZXRvb3RoSGNpLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ibHVldG9vdGgvMS4xL0lCbHVldG9vdGhIY2lDYWxsYmFja3MuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImdkL29zL2xvZy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OlYxXzE6OklCbHVldG9vdGhIY2k7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpibHVldG9vdGg6OlYxXzE6OklCbHVldG9vdGhIY2lDYWxsYmFja3M7Ci11c2luZyBIaWRsU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Ymx1ZXRvb3RoOjpWMV8wOjpTdGF0dXM7Ci11c2luZyBJQmx1ZXRvb3RoSGNpXzFfMCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6VjFfMDo6SUJsdWV0b290aEhjaTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIEhjaURlYXRoUmVjaXBpZW50IDogcHVibGljIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCAvKmNvb2tpZSovLCBjb25zdCBhbmRyb2lkOjp3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyp3aG8qLykgewotICAgIExPR19FUlJPUigiQmx1ZXRvb3RoIEhBTCBzZXJ2aWNlIGRpZWQhIik7Ci0gICAgYWJvcnQoKTsKLSAgfQotfTsKLQotY2xhc3MgSGNpQ2FsbGJhY2tUcmFtcG9saW5lIDogcHVibGljIElCbHVldG9vdGhIY2lDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgSGNpQ2FsbGJhY2tUcmFtcG9saW5lKCkge30KLQotICBSZXR1cm48dm9pZD4gaW5pdGlhbGl6YXRpb25Db21wbGV0ZShIaWRsU3RhdHVzIHN0YXR1cykgewotICAgIEFTU0VSVChzdGF0dXMgPT0gSGlkbFN0YXR1czo6U1VDQ0VTUyk7Ci0gICAgb25faW5pdF9jb21wbGV0ZSgpOwotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gaGNpRXZlbnRSZWNlaXZlZChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZXZlbnQpIHsKLSAgICBvbl9ldmVudChydXN0OjpTbGljZSgmZXZlbnRbMF0sIGV2ZW50LnNpemUoKSkpOwotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gYWNsRGF0YVJlY2VpdmVkKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgb25fYWNsKHJ1c3Q6OlNsaWNlKCZkYXRhWzBdLCBkYXRhLnNpemUoKSkpOwotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gc2NvRGF0YVJlY2VpdmVkKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgb25fc2NvKHJ1c3Q6OlNsaWNlKCZkYXRhWzBdLCBkYXRhLnNpemUoKSkpOwotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLQotICBSZXR1cm48dm9pZD4gaXNvRGF0YVJlY2VpdmVkKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgb25faXNvKHJ1c3Q6OlNsaWNlKCZkYXRhWzBdLCBkYXRhLnNpemUoKSkpOwotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLX07Ci0KLWFuZHJvaWQ6OnNwPEhjaURlYXRoUmVjaXBpZW50PiBoY2lfZGVhdGhfcmVjaXBpZW50XyA9IG5ldyBIY2lEZWF0aFJlY2lwaWVudCgpOwotYW5kcm9pZDo6c3A8SUJsdWV0b290aEhjaV8xXzA+IGJ0X2hjaV87Ci1hbmRyb2lkOjpzcDxJQmx1ZXRvb3RoSGNpPiBidF9oY2lfMV8xXzsKLWFuZHJvaWQ6OnNwPEhjaUNhbGxiYWNrVHJhbXBvbGluZT4gdHJhbXBvbGluZV87Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIHN0YXJ0X2hhbCgpIHsKLSAgQVNTRVJUKGJ0X2hjaV8gPT0gbnVsbHB0cik7Ci0KLSAgYnRfaGNpXzFfMV8gPSBJQmx1ZXRvb3RoSGNpOjpnZXRTZXJ2aWNlKCk7Ci0gIGlmIChidF9oY2lfMV8xXyAhPSBudWxscHRyKSB7Ci0gICAgYnRfaGNpXyA9IGJ0X2hjaV8xXzFfOwotICB9IGVsc2UgewotICAgIGJ0X2hjaV8gPSBJQmx1ZXRvb3RoSGNpXzFfMDo6Z2V0U2VydmljZSgpOwotICB9Ci0KLSAgQVNTRVJUKGJ0X2hjaV8gIT0gbnVsbHB0cik7Ci0gIGF1dG8gZGVhdGhfbGluayA9IGJ0X2hjaV8tPmxpbmtUb0RlYXRoKGhjaV9kZWF0aF9yZWNpcGllbnRfLCAwKTsKLSAgQVNTRVJUX0xPRyhkZWF0aF9saW5rLmlzT2soKSwgIlVuYWJsZSB0byBzZXQgdGhlIGRlYXRoIHJlY2lwaWVudCBmb3IgdGhlIEJsdWV0b290aCBIQUwiKTsKLQotICB0cmFtcG9saW5lXyA9IG5ldyBIY2lDYWxsYmFja1RyYW1wb2xpbmUoKTsKLSAgaWYgKGJ0X2hjaV8xXzFfICE9IG51bGxwdHIpIHsKLSAgICBidF9oY2lfMV8xXy0+aW5pdGlhbGl6ZV8xXzEodHJhbXBvbGluZV8pOwotICB9IGVsc2UgewotICAgIGJ0X2hjaV8tPmluaXRpYWxpemUodHJhbXBvbGluZV8pOwotICB9Ci19Ci0KLXZvaWQgc3RvcF9oYWwoKSB7Ci0gIEFTU0VSVChidF9oY2lfICE9IG51bGxwdHIpOwotCi0gIGF1dG8gZGVhdGhfdW5saW5rID0gYnRfaGNpXy0+dW5saW5rVG9EZWF0aChoY2lfZGVhdGhfcmVjaXBpZW50Xyk7Ci0gIGlmICghZGVhdGhfdW5saW5rLmlzT2soKSkgewotICAgIExPR19FUlJPUigiRXJyb3IgdW5saW5raW5nIGRlYXRoIHJlY2lwaWVudCBmcm9tIHRoZSBCbHVldG9vdGggSEFMIik7Ci0gIH0KLSAgYnRfaGNpXy0+Y2xvc2UoKTsKLSAgYnRfaGNpXyA9IG51bGxwdHI7Ci0gIGJ0X2hjaV8xXzFfID0gbnVsbHB0cjsKLSAgdHJhbXBvbGluZV8gPSBudWxscHRyOwotfQotCi12b2lkIHNlbmRfY29tbWFuZChydXN0OjpTbGljZTxjb25zdCB1aW50OF90PiBkYXRhKSB7Ci0gIEFTU0VSVChidF9oY2lfICE9IG51bGxwdHIpOwotICBidF9oY2lfLT5zZW5kSGNpQ29tbWFuZChoaWRsX3ZlYzx1aW50OF90PihkYXRhLmRhdGEoKSwgZGF0YS5kYXRhKCkgKyBkYXRhLmxlbmd0aCgpKSk7Ci19Ci0KLXZvaWQgc2VuZF9hY2wocnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4gZGF0YSkgewotICBBU1NFUlQoYnRfaGNpXyAhPSBudWxscHRyKTsKLSAgYnRfaGNpXy0+c2VuZEFjbERhdGEoaGlkbF92ZWM8dWludDhfdD4oZGF0YS5kYXRhKCksIGRhdGEuZGF0YSgpICsgZGF0YS5sZW5ndGgoKSkpOwotfQotCi12b2lkIHNlbmRfc2NvKHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+IGRhdGEpIHsKLSAgQVNTRVJUKGJ0X2hjaV8gIT0gbnVsbHB0cik7Ci0gIGJ0X2hjaV8tPnNlbmRTY29EYXRhKGhpZGxfdmVjPHVpbnQ4X3Q+KGRhdGEuZGF0YSgpLCBkYXRhLmRhdGEoKSArIGRhdGEubGVuZ3RoKCkpKTsKLX0KLQotdm9pZCBzZW5kX2lzbyhydXN0OjpTbGljZTxjb25zdCB1aW50OF90PiBkYXRhKSB7Ci0gIGlmIChidF9oY2lfMV8xXyA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCJJU08gaXMgbm90IHN1cHBvcnRlZCBpbiBIQUwgdjEuMCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEFTU0VSVChidF9oY2lfICE9IG51bGxwdHIpOwotICBidF9oY2lfMV8xXy0+c2VuZElzb0RhdGEoaGlkbF92ZWM8dWludDhfdD4oZGF0YS5kYXRhKCksIGRhdGEuZGF0YSgpICsgZGF0YS5sZW5ndGgoKSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvZmZpL2hpZGwuaCBiL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9mZmkvaGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTRiYTY4Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9mZmkvaGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSAic3JjL2hhbC9oaWRsX2hhbC5ycy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotCi12b2lkIHN0YXJ0X2hhbCgpOwotdm9pZCBzdG9wX2hhbCgpOwotdm9pZCBzZW5kX2NvbW1hbmQocnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4gZGF0YSk7Ci12b2lkIHNlbmRfYWNsKHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+IGRhdGEpOwotdm9pZCBzZW5kX3NjbyhydXN0OjpTbGljZTxjb25zdCB1aW50OF90PiBkYXRhKTsKLXZvaWQgc2VuZF9pc28ocnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4gZGF0YSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9oaWRsX2hhbC5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9oaWRsX2hhbC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3MDBlNi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvaGlkbF9oYWwucnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8hIEltcGxlbWVudGF0aW9uIG9mIHRoZSBIQWwgdGhhdCB0YWxrcyB0byBCVCBjb250cm9sbGVyIG92ZXIgQW5kcm9pZCdzIEhJREwKLXVzZSBjcmF0ZTo6aGFsOjppbnRlcm5hbDo6e0lubmVySGFsLCBSYXdIYWx9OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6e0FjbFBhY2tldCwgQ29tbWFuZFBhY2tldCwgRXZlbnRQYWNrZXQsIElzb1BhY2tldCwgUGFja2V0fTsKLXVzZSBnZGRpOjp7bW9kdWxlLCBwcm92aWRlc307Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2Ugc3RkOjpzeW5jOjpNdXRleDsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLXVzZSB0b2tpbzo6c2VsZWN0OwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjp7dW5ib3VuZGVkX2NoYW5uZWwsIFVuYm91bmRlZFJlY2VpdmVyLCBVbmJvdW5kZWRTZW5kZXJ9OwotCi1tb2R1bGUhIHsKLSAgICBoaWRsX2hhbF9tb2R1bGUsCi0gICAgcHJvdmlkZXJzIHsKLSAgICAgICAgUmF3SGFsID0+IHByb3ZpZGVfaGlkbF9oYWwsCi0gICAgfQotfQotCi0jW3Byb3ZpZGVzXQotYXN5bmMgZm4gcHJvdmlkZV9oaWRsX2hhbChydDogQXJjPFJ1bnRpbWU+KSAtPiBSYXdIYWwgewotICAgIGxldCAocmF3X2hhbCwgaW5uZXJfaGFsKSA9IElubmVySGFsOjpuZXcoKTsKLSAgICBsZXQgKGluaXRfdHgsIG11dCBpbml0X3J4KSA9IHVuYm91bmRlZF9jaGFubmVsKCk7Ci0gICAgKkNBTExCQUNLUy5sb2NrKCkudW53cmFwKCkgPSBTb21lKENhbGxiYWNrcyB7Ci0gICAgICAgIGluaXRfdHgsCi0gICAgICAgIGV2dF90eDogaW5uZXJfaGFsLmV2dF90eCwKLSAgICAgICAgYWNsX3R4OiBpbm5lcl9oYWwuYWNsX3R4LAotICAgICAgICBpc29fdHg6IGlubmVyX2hhbC5pc29fdHgsCi0gICAgfSk7Ci0gICAgZmZpOjpzdGFydF9oYWwoKTsKLSAgICBpbml0X3J4LnJlY3YoKS5hd2FpdC51bndyYXAoKTsKLQotICAgIHJ0LnNwYXduKGRpc3BhdGNoX291dGdvaW5nKGlubmVyX2hhbC5jbWRfcngsIGlubmVyX2hhbC5hY2xfcngsIGlubmVyX2hhbC5pc29fcngpKTsKLQotICAgIHJhd19oYWwKLX0KLQotI1tjeHg6OmJyaWRnZShuYW1lc3BhY2UgPSBibHVldG9vdGg6OmhhbCldCi0vLyBUT0RPIEVpdGhlciB1c2Ugb3IgcmVtb3ZlIHRoZXNlIGZ1bmN0aW9ucywgdGhpcyBzaG91bGRuJ3QgYmUgdGhlIGxvbmcgdGVybSBzdGF0ZQotI1thbGxvdyhkZWFkX2NvZGUpXQotbW9kIGZmaSB7Ci0gICAgdW5zYWZlIGV4dGVybiAiQysrIiB7Ci0gICAgICAgIGluY2x1ZGUhKCJzcmMvaGFsL2ZmaS9oaWRsLmgiKTsKLSAgICAgICAgZm4gc3RhcnRfaGFsKCk7Ci0gICAgICAgIGZuIHN0b3BfaGFsKCk7Ci0gICAgICAgIGZuIHNlbmRfY29tbWFuZChkYXRhOiAmW3U4XSk7Ci0gICAgICAgIGZuIHNlbmRfYWNsKGRhdGE6ICZbdThdKTsKLSAgICAgICAgZm4gc2VuZF9zY28oZGF0YTogJlt1OF0pOwotICAgICAgICBmbiBzZW5kX2lzbyhkYXRhOiAmW3U4XSk7Ci0gICAgfQotCi0gICAgZXh0ZXJuICJSdXN0IiB7Ci0gICAgICAgIGZuIG9uX2luaXRfY29tcGxldGUoKTsKLSAgICAgICAgZm4gb25fZXZlbnQoZGF0YTogJlt1OF0pOwotICAgICAgICBmbiBvbl9hY2woZGF0YTogJlt1OF0pOwotICAgICAgICBmbiBvbl9zY28oZGF0YTogJlt1OF0pOwotICAgICAgICBmbiBvbl9pc28oZGF0YTogJlt1OF0pOwotICAgIH0KLX0KLQotc3RydWN0IENhbGxiYWNrcyB7Ci0gICAgaW5pdF90eDogVW5ib3VuZGVkU2VuZGVyPCgpPiwKLSAgICBldnRfdHg6IFVuYm91bmRlZFNlbmRlcjxFdmVudFBhY2tldD4sCi0gICAgYWNsX3R4OiBVbmJvdW5kZWRTZW5kZXI8QWNsUGFja2V0PiwKLSAgICBpc29fdHg6IFVuYm91bmRlZFNlbmRlcjxJc29QYWNrZXQ+LAotfQotCi1sYXp5X3N0YXRpYyEgewotICAgIHN0YXRpYyByZWYgQ0FMTEJBQ0tTOiBNdXRleDxPcHRpb248Q2FsbGJhY2tzPj4gPSBNdXRleDo6bmV3KE5vbmUpOwotfQotCi1mbiBvbl9pbml0X2NvbXBsZXRlKCkgewotICAgIGxldCBjYWxsYmFja3MgPSBDQUxMQkFDS1MubG9jaygpLnVud3JhcCgpOwotICAgIGNhbGxiYWNrcy5hc19yZWYoKS51bndyYXAoKS5pbml0X3R4LnNlbmQoKCkpLnVud3JhcCgpOwotfQotCi1mbiBvbl9ldmVudChkYXRhOiAmW3U4XSkgewotICAgIGxvZzo6ZXJyb3IhKCJnb3QgZXZlbnQ6IHs6MDJ4P30iLCBkYXRhKTsKLSAgICBsZXQgY2FsbGJhY2tzID0gQ0FMTEJBQ0tTLmxvY2soKS51bndyYXAoKTsKLSAgICBtYXRjaCBFdmVudFBhY2tldDo6cGFyc2UoZGF0YSkgewotICAgICAgICBPayhwKSA9PiBjYWxsYmFja3MuYXNfcmVmKCkudW53cmFwKCkuZXZ0X3R4LnNlbmQocCkudW53cmFwKCksCi0gICAgICAgIEVycihlKSA9PiBsb2c6OmVycm9yISgiZmFpbHVyZSB0byBwYXJzZSBldmVudDogezo/fSBkYXRhOiB7OjAyeD99IiwgZSwgZGF0YSksCi0gICAgfQotfQotCi1mbiBvbl9hY2woZGF0YTogJlt1OF0pIHsKLSAgICBsZXQgY2FsbGJhY2tzID0gQ0FMTEJBQ0tTLmxvY2soKS51bndyYXAoKTsKLSAgICBtYXRjaCBBY2xQYWNrZXQ6OnBhcnNlKGRhdGEpIHsKLSAgICAgICAgT2socCkgPT4gY2FsbGJhY2tzLmFzX3JlZigpLnVud3JhcCgpLmFjbF90eC5zZW5kKHApLnVud3JhcCgpLAotICAgICAgICBFcnIoZSkgPT4gbG9nOjplcnJvciEoImZhaWx1cmUgdG8gcGFyc2UgaW5jb21pbmcgQUNMOiB7Oj99IGRhdGE6IHs6MDJ4P30iLCBlLCBkYXRhKSwKLSAgICB9Ci19Ci0KLWZuIG9uX3NjbyhfZGF0YTogJlt1OF0pIHt9Ci0KLWZuIG9uX2lzbyhkYXRhOiAmW3U4XSkgewotICAgIGxldCBjYWxsYmFja3MgPSBDQUxMQkFDS1MubG9jaygpLnVud3JhcCgpOwotICAgIG1hdGNoIElzb1BhY2tldDo6cGFyc2UoZGF0YSkgewotICAgICAgICBPayhwKSA9PiBjYWxsYmFja3MuYXNfcmVmKCkudW53cmFwKCkuaXNvX3R4LnNlbmQocCkudW53cmFwKCksCi0gICAgICAgIEVycihlKSA9PiBsb2c6OmVycm9yISgiZmFpbHVyZSB0byBwYXJzZSBpbmNvbWluZyBJU086IHs6P30gZGF0YTogezowMng/fSIsIGUsIGRhdGEpLAotICAgIH0KLX0KLQotYXN5bmMgZm4gZGlzcGF0Y2hfb3V0Z29pbmcoCi0gICAgbXV0IGNtZF9yeDogVW5ib3VuZGVkUmVjZWl2ZXI8Q29tbWFuZFBhY2tldD4sCi0gICAgbXV0IGFjbF9yeDogVW5ib3VuZGVkUmVjZWl2ZXI8QWNsUGFja2V0PiwKLSAgICBtdXQgaXNvX3J4OiBVbmJvdW5kZWRSZWNlaXZlcjxJc29QYWNrZXQ+LAotKSB7Ci0gICAgbG9vcCB7Ci0gICAgICAgIHNlbGVjdCEgewotICAgICAgICAgICAgU29tZShjbWQpID0gY21kX3J4LnJlY3YoKSA9PiBmZmk6OnNlbmRfY29tbWFuZCgmY21kLnRvX2J5dGVzKCkpLAotICAgICAgICAgICAgU29tZShhY2wpID0gYWNsX3J4LnJlY3YoKSA9PiBmZmk6OnNlbmRfYWNsKCZhY2wudG9fYnl0ZXMoKSksCi0gICAgICAgICAgICBTb21lKGlzbykgPSBpc29fcngucmVjdigpID0+IGZmaTo6c2VuZF9pc28oJmlzby50b19ieXRlcygpKSwKLSAgICAgICAgICAgIGVsc2UgPT4gYnJlYWssCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvbW9kLnJzIGIvZ2QvcnVzdC9zdGFjay9zcmMvaGFsL21vZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0MmNlZC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvbW9kLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vISBIQ0kgSGFyZHdhcmUgQWJzdHJhY3Rpb24gTGF5ZXIKLS8vISBTdXBwb3J0cyBzZW5kaW5nIEhDSSBjb21tYW5kcyB0byB0aGUgSEFMIGFuZCByZWNldmluZwotLy8hIEhDSSBldmVudHMgZnJvbSB0aGUgSEFMCi0KLXB1YiBtb2QgZmFjYWRlOwotcHViIG1vZCByb290Y2FuYWxfaGFsOwotcHViIG1vZCBzbm9vcDsKLQotI1tjZmcodGFyZ2V0X29zID0gImFuZHJvaWQiKV0KLW1vZCBoaWRsX2hhbDsKLQotdXNlIGdkZGk6Om1vZHVsZTsKLXVzZSB0aGlzZXJyb3I6OkVycm9yOwotCi0jW2NmZyh0YXJnZXRfb3MgPSAiYW5kcm9pZCIpXQotbW9kdWxlISB7Ci0gICAgaGFsX21vZHVsZSwKLSAgICBzdWJtb2R1bGVzIHsKLSAgICAgICAgZmFjYWRlOjpoYWxfZmFjYWRlX21vZHVsZSwKLSAgICAgICAgaGlkbF9oYWw6OmhpZGxfaGFsX21vZHVsZSwKLSAgICAgICAgc25vb3A6OnNub29wX21vZHVsZSwKLSAgICB9LAotfQotCi0jW2NmZyhub3QodGFyZ2V0X29zID0gImFuZHJvaWQiKSldCi1tb2R1bGUhIHsKLSAgICBoYWxfbW9kdWxlLAotICAgIHN1Ym1vZHVsZXMgewotICAgICAgICBmYWNhZGU6OmhhbF9mYWNhZGVfbW9kdWxlLAotICAgICAgICByb290Y2FuYWxfaGFsOjpyb290Y2FuYWxfaGFsX21vZHVsZSwKLSAgICAgICAgc25vb3A6OnNub29wX21vZHVsZSwKLSAgICB9LAotfQotLy8vIEg0IHBhY2tldCBoZWFkZXIgc2l6ZQotY29uc3QgSDRfSEVBREVSX1NJWkU6IHVzaXplID0gMTsKLQotcHViIHVzZSBzbm9vcDo6e0FjbEhhbCwgQ29udHJvbEhhbCwgSXNvSGFsLCBTY29IYWx9OwotCi1tb2QgaW50ZXJuYWwgewotICAgIHVzZSBidF9wYWNrZXRzOjpoY2k6OntBY2xQYWNrZXQsIENvbW1hbmRQYWNrZXQsIEV2ZW50UGFja2V0LCBJc29QYWNrZXQsIFNjb1BhY2tldH07Ci0gICAgdXNlIGdkZGk6OlN0b3BwYWJsZTsKLSAgICB1c2Ugc3RkOjpzeW5jOjpBcmM7Ci0gICAgdXNlIHRva2lvOjpzeW5jOjptcHNjOjp7dW5ib3VuZGVkX2NoYW5uZWwsIFVuYm91bmRlZFJlY2VpdmVyLCBVbmJvdW5kZWRTZW5kZXJ9OwotICAgIHVzZSB0b2tpbzo6c3luYzo6TXV0ZXg7Ci0KLSAgICAjW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLSAgICBwdWIgc3RydWN0IFJhd0hhbCB7Ci0gICAgICAgIHB1YiBjbWRfdHg6IFVuYm91bmRlZFNlbmRlcjxDb21tYW5kUGFja2V0PiwKLSAgICAgICAgcHViIGV2dF9yeDogQXJjPE11dGV4PFVuYm91bmRlZFJlY2VpdmVyPEV2ZW50UGFja2V0Pj4+LAotICAgICAgICBwdWIgYWNsX3R4OiBVbmJvdW5kZWRTZW5kZXI8QWNsUGFja2V0PiwKLSAgICAgICAgcHViIGFjbF9yeDogQXJjPE11dGV4PFVuYm91bmRlZFJlY2VpdmVyPEFjbFBhY2tldD4+PiwKLSAgICAgICAgcHViIGlzb190eDogVW5ib3VuZGVkU2VuZGVyPElzb1BhY2tldD4sCi0gICAgICAgIHB1YiBpc29fcng6IEFyYzxNdXRleDxVbmJvdW5kZWRSZWNlaXZlcjxJc29QYWNrZXQ+Pj4sCi0gICAgICAgIHB1YiBzY29fdHg6IFVuYm91bmRlZFNlbmRlcjxTY29QYWNrZXQ+LAotICAgICAgICBwdWIgc2NvX3J4OiBBcmM8TXV0ZXg8VW5ib3VuZGVkUmVjZWl2ZXI8U2NvUGFja2V0Pj4+LAotICAgIH0KLQotICAgIHB1YiBzdHJ1Y3QgSW5uZXJIYWwgewotICAgICAgICBwdWIgY21kX3J4OiBVbmJvdW5kZWRSZWNlaXZlcjxDb21tYW5kUGFja2V0PiwKLSAgICAgICAgcHViIGV2dF90eDogVW5ib3VuZGVkU2VuZGVyPEV2ZW50UGFja2V0PiwKLSAgICAgICAgcHViIGFjbF9yeDogVW5ib3VuZGVkUmVjZWl2ZXI8QWNsUGFja2V0PiwKLSAgICAgICAgcHViIGFjbF90eDogVW5ib3VuZGVkU2VuZGVyPEFjbFBhY2tldD4sCi0gICAgICAgIHB1YiBzY29fcng6IFVuYm91bmRlZFJlY2VpdmVyPFNjb1BhY2tldD4sCi0gICAgICAgIHB1YiBzY29fdHg6IFVuYm91bmRlZFNlbmRlcjxTY29QYWNrZXQ+LAotICAgICAgICBwdWIgaXNvX3J4OiBVbmJvdW5kZWRSZWNlaXZlcjxJc29QYWNrZXQ+LAotICAgICAgICBwdWIgaXNvX3R4OiBVbmJvdW5kZWRTZW5kZXI8SXNvUGFja2V0PiwKLSAgICB9Ci0KLSAgICBpbXBsIElubmVySGFsIHsKLSAgICAgICAgcHViIGZuIG5ldygpIC0+IChSYXdIYWwsIFNlbGYpIHsKLSAgICAgICAgICAgIGxldCAoY21kX3R4LCBjbWRfcngpID0gdW5ib3VuZGVkX2NoYW5uZWwoKTsKLSAgICAgICAgICAgIGxldCAoZXZ0X3R4LCBldnRfcngpID0gdW5ib3VuZGVkX2NoYW5uZWwoKTsKLSAgICAgICAgICAgIGxldCAoYWNsX2Rvd25fdHgsIGFjbF9kb3duX3J4KSA9IHVuYm91bmRlZF9jaGFubmVsKCk7Ci0gICAgICAgICAgICBsZXQgKHNjb19kb3duX3R4LCBzY29fZG93bl9yeCkgPSB1bmJvdW5kZWRfY2hhbm5lbCgpOwotICAgICAgICAgICAgbGV0IChpc29fZG93bl90eCwgaXNvX2Rvd25fcngpID0gdW5ib3VuZGVkX2NoYW5uZWwoKTsKLSAgICAgICAgICAgIGxldCAoYWNsX3VwX3R4LCBhY2xfdXBfcngpID0gdW5ib3VuZGVkX2NoYW5uZWwoKTsKLSAgICAgICAgICAgIGxldCAoc2NvX3VwX3R4LCBzY29fdXBfcngpID0gdW5ib3VuZGVkX2NoYW5uZWwoKTsKLSAgICAgICAgICAgIGxldCAoaXNvX3VwX3R4LCBpc29fdXBfcngpID0gdW5ib3VuZGVkX2NoYW5uZWwoKTsKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICBSYXdIYWwgewotICAgICAgICAgICAgICAgICAgICBjbWRfdHgsCi0gICAgICAgICAgICAgICAgICAgIGV2dF9yeDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhldnRfcngpKSwKLSAgICAgICAgICAgICAgICAgICAgYWNsX3R4OiBhY2xfZG93bl90eCwKLSAgICAgICAgICAgICAgICAgICAgYWNsX3J4OiBBcmM6Om5ldyhNdXRleDo6bmV3KGFjbF91cF9yeCkpLAotICAgICAgICAgICAgICAgICAgICBzY29fdHg6IHNjb19kb3duX3R4LAotICAgICAgICAgICAgICAgICAgICBzY29fcng6IEFyYzo6bmV3KE11dGV4OjpuZXcoc2NvX3VwX3J4KSksCi0gICAgICAgICAgICAgICAgICAgIGlzb190eDogaXNvX2Rvd25fdHgsCi0gICAgICAgICAgICAgICAgICAgIGlzb19yeDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhpc29fdXBfcngpKSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIFNlbGYgewotICAgICAgICAgICAgICAgICAgICBjbWRfcngsCi0gICAgICAgICAgICAgICAgICAgIGV2dF90eCwKLSAgICAgICAgICAgICAgICAgICAgYWNsX3J4OiBhY2xfZG93bl9yeCwKLSAgICAgICAgICAgICAgICAgICAgYWNsX3R4OiBhY2xfdXBfdHgsCi0gICAgICAgICAgICAgICAgICAgIHNjb19yeDogc2NvX2Rvd25fcngsCi0gICAgICAgICAgICAgICAgICAgIHNjb190eDogc2NvX3VwX3R4LAotICAgICAgICAgICAgICAgICAgICBpc29fcng6IGlzb19kb3duX3J4LAotICAgICAgICAgICAgICAgICAgICBpc29fdHg6IGlzb191cF90eCwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgKQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLy8gUmVzdWx0IHR5cGUKLXR5cGUgUmVzdWx0PFQ+ID0gc3RkOjpyZXN1bHQ6OlJlc3VsdDxULCBCb3g8ZHluIHN0ZDo6ZXJyb3I6OkVycm9yICsgU2VuZCArIFN5bmM+PjsKLQotLy8vIEVycm9ycyB0aGF0IGNhbiBiZSBlbmNvdW50ZXJlZCB3aGlsZSBkZWFsaW5nIHdpdGggdGhlIEhBTAotI1tkZXJpdmUoRXJyb3IsIERlYnVnKV0KLXB1YiBlbnVtIEhhbEVycm9yIHsKLSAgICAvLy8gSW52YWxpZCByb290Y2FuYWwgaG9zdCBlcnJvcgotICAgICNbZXJyb3IoIkludmFsaWQgcm9vdGNhbmFsIGhvc3QiKV0KLSAgICBJbnZhbGlkQWRkcmVzc0Vycm9yLAotICAgIC8vLyBFcnJvciB3aGlsZSBjb25uZWN0aW5nIHRvIHJvb3RjYW5hbAotICAgICNbZXJyb3IoIkNvbm5lY3Rpb24gdG8gcm9vdGNhbmFsIGZhaWxlZDogezB9IildCi0gICAgUm9vdGNhbmFsQ29ubmVjdEVycm9yKCNbZnJvbV0gdG9raW86OmlvOjpFcnJvciksCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvcm9vdGNhbmFsX2hhbC5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9yb290Y2FuYWxfaGFsLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTkyZmY0Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9yb290Y2FuYWxfaGFsLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vISBSb290Y2FuYWwgSEFMCi0vLyEgVGhpcyBjb25uZWN0cyB0byAicm9vdGNhbmFsIiB3aGljaCBwcm92aWRlcyBhIHNpbXVsYXRlZAotLy8hIEJsdWV0b290aCBjaGlwIGFzIHdlbGwgYXMgYSBzaW11bGF0ZWQgZW52aXJvbm1lbnQuCi0KLXVzZSBjcmF0ZTo6aGFsOjppbnRlcm5hbDo6e0lubmVySGFsLCBSYXdIYWx9OwotdXNlIGNyYXRlOjpoYWw6OntSZXN1bHQsIEg0X0hFQURFUl9TSVpFfTsKLXVzZSBidF9wYWNrZXRzOjpoY2k6OntBY2xQYWNrZXQsIENvbW1hbmRQYWNrZXQsIEV2ZW50UGFja2V0LCBJc29QYWNrZXQsIFBhY2tldH07Ci11c2UgYnl0ZXM6OntCdWZNdXQsIEJ5dGVzLCBCeXRlc011dH07Ci11c2UgZ2RkaTo6e21vZHVsZSwgcHJvdmlkZXMsIFN0b3BwYWJsZX07Ci11c2UgbnVtX2Rlcml2ZTo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKLXVzZSBzdGQ6Om5ldDo6e0lwQWRkciwgU29ja2V0QWRkcn07Ci11c2Ugc3RkOjpzdHI6OkZyb21TdHI7Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2UgdG9raW86OmlvOjp7QXN5bmNSZWFkRXh0LCBBc3luY1dyaXRlRXh0LCBCdWZSZWFkZXJ9OwotdXNlIHRva2lvOjpuZXQ6OlRjcFN0cmVhbTsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLXVzZSB0b2tpbzo6c2VsZWN0OwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjp7VW5ib3VuZGVkUmVjZWl2ZXIsIFVuYm91bmRlZFNlbmRlcn07Ci0KLSNbZGVyaXZlKEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlKV0KLWVudW0gSGNpUGFja2V0VHlwZSB7Ci0gICAgQ29tbWFuZCA9IDB4MDEsCi0gICAgQWNsID0gMHgwMiwKLSAgICBTY28gPSAweDAzLAotICAgIEV2ZW50ID0gMHgwNCwKLSAgICBJc28gPSAweDA1LAotfQotCi1jb25zdCBTSVpFX09GX0VWRU5UX0hFQURFUjogdXNpemUgPSAyOwotY29uc3QgX1NJWkVfT0ZfU0NPX0hFQURFUjogdXNpemUgPSAzOwotY29uc3QgU0laRV9PRl9BQ0xfSEVBREVSOiB1c2l6ZSA9IDQ7Ci1jb25zdCBTSVpFX09GX0lTT19IRUFERVI6IHVzaXplID0gNDsKLQotbW9kdWxlISB7Ci0gICAgcm9vdGNhbmFsX2hhbF9tb2R1bGUsCi0gICAgcHJvdmlkZXJzIHsKLSAgICAgICAgUmF3SGFsID0+IHByb3ZpZGVfcm9vdGNhbmFsX2hhbCwKLSAgICB9Ci19Ci0KLSNbcHJvdmlkZXNdCi1hc3luYyBmbiBwcm92aWRlX3Jvb3RjYW5hbF9oYWwoY29uZmlnOiBSb290Y2FuYWxDb25maWcsIHJ0OiBBcmM8UnVudGltZT4pIC0+IFJhd0hhbCB7Ci0gICAgbGV0IChyYXdfaGFsLCBpbm5lcl9oYWwpID0gSW5uZXJIYWw6Om5ldygpOwotICAgIGxldCAocmVhZGVyLCB3cml0ZXIpID0gVGNwU3RyZWFtOjpjb25uZWN0KCZjb25maWcudG9fc29ja2V0X2FkZHIoKS51bndyYXAoKSkKLSAgICAgICAgLmF3YWl0Ci0gICAgICAgIC5leHBlY3QoInVuYWJsZSB0byBjcmVhdGUgc3RyZWFtIHRvIHJvb3RjYW5hbCIpCi0gICAgICAgIC5pbnRvX3NwbGl0KCk7Ci0KLSAgICBydC5zcGF3bihkaXNwYXRjaF9pbmNvbWluZyhpbm5lcl9oYWwuZXZ0X3R4LCBpbm5lcl9oYWwuYWNsX3R4LCBpbm5lcl9oYWwuaXNvX3R4LCByZWFkZXIpKTsKLSAgICBydC5zcGF3bihkaXNwYXRjaF9vdXRnb2luZyhpbm5lcl9oYWwuY21kX3J4LCBpbm5lcl9oYWwuYWNsX3J4LCBpbm5lcl9oYWwuaXNvX3J4LCB3cml0ZXIpKTsKLQotICAgIHJhd19oYWwKLX0KLQotLy8vIFJvb3RjYW5hbCBjb25maWd1cmF0aW9uCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIERlZmF1bHQsIFN0b3BwYWJsZSldCi1wdWIgc3RydWN0IFJvb3RjYW5hbENvbmZpZyB7Ci0gICAgYWRkcmVzczogU3RyaW5nLAotICAgIHBvcnQ6IHUxNiwKLX0KLQotaW1wbCBSb290Y2FuYWxDb25maWcgewotICAgIC8vLyBDcmVhdGUgYSByb290Y2FuYWwgY29uZmlnCi0gICAgcHViIGZuIG5ldyhhZGRyZXNzOiAmc3RyLCBwb3J0OiB1MTYpIC0+IFNlbGYgewotICAgICAgICBTZWxmIHsgYWRkcmVzczogU3RyaW5nOjpmcm9tKGFkZHJlc3MpLCBwb3J0IH0KLSAgICB9Ci0KLSAgICBmbiB0b19zb2NrZXRfYWRkcigmc2VsZikgLT4gUmVzdWx0PFNvY2tldEFkZHI+IHsKLSAgICAgICAgT2soU29ja2V0QWRkcjo6bmV3KElwQWRkcjo6ZnJvbV9zdHIoJnNlbGYuYWRkcmVzcyk/LCBzZWxmLnBvcnQpKQotICAgIH0KLX0KLQotLy8vIFNlbmQgSENJIGV2ZW50cyByZWNlaXZlZCBmcm9tIHRoZSBIQUwgdG8gdGhlIEhDSSBsYXllcgotYXN5bmMgZm4gZGlzcGF0Y2hfaW5jb21pbmc8Uj4oCi0gICAgZXZ0X3R4OiBVbmJvdW5kZWRTZW5kZXI8RXZlbnRQYWNrZXQ+LAotICAgIGFjbF90eDogVW5ib3VuZGVkU2VuZGVyPEFjbFBhY2tldD4sCi0gICAgaXNvX3R4OiBVbmJvdW5kZWRTZW5kZXI8SXNvUGFja2V0PiwKLSAgICByZWFkZXI6IFIsCi0pIC0+IFJlc3VsdDwoKT4KLXdoZXJlCi0gICAgUjogQXN5bmNSZWFkRXh0ICsgVW5waW4sCi17Ci0gICAgbGV0IG11dCByZWFkZXIgPSBCdWZSZWFkZXI6Om5ldyhyZWFkZXIpOwotICAgIGxvb3AgewotICAgICAgICBsZXQgbXV0IGJ1ZmZlciA9IEJ5dGVzTXV0Ojp3aXRoX2NhcGFjaXR5KDEwMjQpOwotICAgICAgICBidWZmZXIucmVzaXplKEg0X0hFQURFUl9TSVpFLCAwKTsKLSAgICAgICAgcmVhZGVyLnJlYWRfZXhhY3QoJm11dCBidWZmZXIpLmF3YWl0PzsKLSAgICAgICAgaWYgYnVmZmVyWzBdID09IEhjaVBhY2tldFR5cGU6OkV2ZW50IGFzIHU4IHsKLSAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoU0laRV9PRl9FVkVOVF9IRUFERVIsIDApOwotICAgICAgICAgICAgcmVhZGVyLnJlYWRfZXhhY3QoJm11dCBidWZmZXIpLmF3YWl0PzsKLSAgICAgICAgICAgIGxldCBsZW46IHVzaXplID0gYnVmZmVyWzFdLmludG8oKTsKLSAgICAgICAgICAgIGxldCBtdXQgcGF5bG9hZCA9IGJ1ZmZlci5zcGxpdF9vZmYoU0laRV9PRl9FVkVOVF9IRUFERVIpOwotICAgICAgICAgICAgcGF5bG9hZC5yZXNpemUobGVuLCAwKTsKLSAgICAgICAgICAgIHJlYWRlci5yZWFkX2V4YWN0KCZtdXQgcGF5bG9hZCkuYXdhaXQ/OwotICAgICAgICAgICAgYnVmZmVyLnVuc3BsaXQocGF5bG9hZCk7Ci0gICAgICAgICAgICBsZXQgZnJvemVuID0gYnVmZmVyLmZyZWV6ZSgpOwotICAgICAgICAgICAgbWF0Y2ggRXZlbnRQYWNrZXQ6OnBhcnNlKCZmcm96ZW4pIHsKLSAgICAgICAgICAgICAgICBPayhwKSA9PiBldnRfdHguc2VuZChwKS51bndyYXAoKSwKLSAgICAgICAgICAgICAgICBFcnIoZSkgPT4gbG9nOjplcnJvciEoImRyb3BwaW5nIGludmFsaWQgZXZlbnQgcGFja2V0OiB7fTogezowMnh9IiwgZSwgZnJvemVuKSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIGJ1ZmZlclswXSA9PSBIY2lQYWNrZXRUeXBlOjpBY2wgYXMgdTggewotICAgICAgICAgICAgYnVmZmVyLnJlc2l6ZShTSVpFX09GX0FDTF9IRUFERVIsIDApOwotICAgICAgICAgICAgcmVhZGVyLnJlYWRfZXhhY3QoJm11dCBidWZmZXIpLmF3YWl0PzsKLSAgICAgICAgICAgIGxldCBsZW46IHVzaXplID0gKGJ1ZmZlclsyXSBhcyB1MTYgKyAoKGJ1ZmZlclszXSBhcyB1MTYpIDw8IDgpKS5pbnRvKCk7Ci0gICAgICAgICAgICBsZXQgbXV0IHBheWxvYWQgPSBidWZmZXIuc3BsaXRfb2ZmKFNJWkVfT0ZfQUNMX0hFQURFUik7Ci0gICAgICAgICAgICBwYXlsb2FkLnJlc2l6ZShsZW4sIDApOwotICAgICAgICAgICAgcmVhZGVyLnJlYWRfZXhhY3QoJm11dCBwYXlsb2FkKS5hd2FpdD87Ci0gICAgICAgICAgICBidWZmZXIudW5zcGxpdChwYXlsb2FkKTsKLSAgICAgICAgICAgIGxldCBmcm96ZW4gPSBidWZmZXIuZnJlZXplKCk7Ci0gICAgICAgICAgICBtYXRjaCBBY2xQYWNrZXQ6OnBhcnNlKCZmcm96ZW4pIHsKLSAgICAgICAgICAgICAgICBPayhwKSA9PiBhY2xfdHguc2VuZChwKS51bndyYXAoKSwKLSAgICAgICAgICAgICAgICBFcnIoZSkgPT4gbG9nOjplcnJvciEoImRyb3BwaW5nIGludmFsaWQgQUNMIHBhY2tldDoge306IHs6MDJ4fSIsIGUsIGZyb3plbiksCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiBidWZmZXJbMF0gPT0gSGNpUGFja2V0VHlwZTo6SXNvIGFzIHU4IHsKLSAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoU0laRV9PRl9JU09fSEVBREVSLCAwKTsKLSAgICAgICAgICAgIHJlYWRlci5yZWFkX2V4YWN0KCZtdXQgYnVmZmVyKS5hd2FpdD87Ci0gICAgICAgICAgICBsZXQgbGVuOiB1c2l6ZSA9IChidWZmZXJbMl0gYXMgdTE2ICsgKCgoYnVmZmVyWzNdICYgMHgzZikgYXMgdTE2KSA8PCA4KSkuaW50bygpOwotICAgICAgICAgICAgbGV0IG11dCBwYXlsb2FkID0gYnVmZmVyLnNwbGl0X29mZihTSVpFX09GX0lTT19IRUFERVIpOwotICAgICAgICAgICAgcGF5bG9hZC5yZXNpemUobGVuLCAwKTsKLSAgICAgICAgICAgIHJlYWRlci5yZWFkX2V4YWN0KCZtdXQgcGF5bG9hZCkuYXdhaXQ/OwotICAgICAgICAgICAgYnVmZmVyLnVuc3BsaXQocGF5bG9hZCk7Ci0gICAgICAgICAgICBsZXQgZnJvemVuID0gYnVmZmVyLmZyZWV6ZSgpOwotICAgICAgICAgICAgbWF0Y2ggSXNvUGFja2V0OjpwYXJzZSgmZnJvemVuKSB7Ci0gICAgICAgICAgICAgICAgT2socCkgPT4gaXNvX3R4LnNlbmQocCkudW53cmFwKCksCi0gICAgICAgICAgICAgICAgRXJyKGUpID0+IGxvZzo6ZXJyb3IhKCJkcm9wcGluZyBpbnZhbGlkIElTTyBwYWNrZXQ6IHt9OiB7OjAyeH0iLCBlLCBmcm96ZW4pLAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLy8gU2VuZCBjb21tYW5kcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgbGF0ZXIgdG8gcm9vdGNhbmFsCi1hc3luYyBmbiBkaXNwYXRjaF9vdXRnb2luZzxXPigKLSAgICBtdXQgY21kX3J4OiBVbmJvdW5kZWRSZWNlaXZlcjxDb21tYW5kUGFja2V0PiwKLSAgICBtdXQgYWNsX3J4OiBVbmJvdW5kZWRSZWNlaXZlcjxBY2xQYWNrZXQ+LAotICAgIG11dCBpc29fcng6IFVuYm91bmRlZFJlY2VpdmVyPElzb1BhY2tldD4sCi0gICAgbXV0IHdyaXRlcjogVywKLSkgLT4gUmVzdWx0PCgpPgotd2hlcmUKLSAgICBXOiBBc3luY1dyaXRlRXh0ICsgVW5waW4sCi17Ci0gICAgbG9vcCB7Ci0gICAgICAgIHNlbGVjdCEgewotICAgICAgICAgICAgU29tZShjbWQpID0gY21kX3J4LnJlY3YoKSA9PiB3cml0ZV93aXRoX3R5cGUoJm11dCB3cml0ZXIsIEhjaVBhY2tldFR5cGU6OkNvbW1hbmQsIGNtZC50b19ieXRlcygpKS5hd2FpdD8sCi0gICAgICAgICAgICBTb21lKGFjbCkgPSBhY2xfcngucmVjdigpID0+IHdyaXRlX3dpdGhfdHlwZSgmbXV0IHdyaXRlciwgSGNpUGFja2V0VHlwZTo6QWNsLCBhY2wudG9fYnl0ZXMoKSkuYXdhaXQ/LAotICAgICAgICAgICAgU29tZShpc28pID0gaXNvX3J4LnJlY3YoKSA9PiB3cml0ZV93aXRoX3R5cGUoJm11dCB3cml0ZXIsIEhjaVBhY2tldFR5cGU6OklzbywgaXNvLnRvX2J5dGVzKCkpLmF3YWl0PywKLSAgICAgICAgICAgIGVsc2UgPT4gYnJlYWssCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBPaygoKSkKLX0KLQotYXN5bmMgZm4gd3JpdGVfd2l0aF90eXBlPFc+KHdyaXRlcjogJm11dCBXLCB0OiBIY2lQYWNrZXRUeXBlLCBiOiBCeXRlcykgLT4gUmVzdWx0PCgpPgotd2hlcmUKLSAgICBXOiBBc3luY1dyaXRlRXh0ICsgVW5waW4sCi17Ci0gICAgbGV0IG11dCBkYXRhID0gQnl0ZXNNdXQ6OndpdGhfY2FwYWNpdHkoYi5sZW4oKSArIDEpOwotICAgIGRhdGEucHV0X3U4KHQgYXMgdTgpOwotICAgIGRhdGEuZXh0ZW5kKGIpOwotICAgIHdyaXRlci53cml0ZV9hbGwoJmRhdGFbLi5dKS5hd2FpdD87Ci0KLSAgICBPaygoKSkKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9zbm9vcC5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2hhbC9zbm9vcC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxODhhYS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9oYWwvc25vb3AucnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLy8hIEJUIHNub29wIGxvZ2dlcgotCi11c2UgY3JhdGU6OmhhbDo6aW50ZXJuYWw6OlJhd0hhbDsKLXVzZSBidF9jb21tb246OnN5c19wcm9wOwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6e0FjbFBhY2tldCwgQ29tbWFuZFBhY2tldCwgRXZlbnRQYWNrZXQsIElzb1BhY2tldCwgUGFja2V0LCBTY29QYWNrZXR9OwotdXNlIGJ5dGVzOjp7QnVmTXV0LCBCeXRlcywgQnl0ZXNNdXR9OwotdXNlIGdkZGk6Onttb2R1bGUsIHBhcnRfb3V0LCBwcm92aWRlcywgU3RvcHBhYmxlfTsKLXVzZSBsb2c6OmVycm9yOwotdXNlIHN0ZDo6Y29udmVydDo6VHJ5RnJvbTsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSBzdGQ6OnRpbWU6OlN5c3RlbVRpbWU7Ci11c2UgdG9raW86OmZzOjp7cmVtb3ZlX2ZpbGUsIHJlbmFtZSwgRmlsZX07Ci11c2UgdG9raW86OmlvOjpBc3luY1dyaXRlRXh0OwotdXNlIHRva2lvOjpydW50aW1lOjpSdW50aW1lOwotdXNlIHRva2lvOjpzZWxlY3Q7Ci11c2UgdG9raW86OnN5bmM6Om1wc2M6OntjaGFubmVsLCBSZWNlaXZlciwgU2VuZGVyLCBVbmJvdW5kZWRSZWNlaXZlcn07Ci11c2UgdG9raW86OnN5bmM6Ok11dGV4OwotCi0jW3BhcnRfb3V0XQotI1tkZXJpdmUoQ2xvbmUsIFN0b3BwYWJsZSldCi1zdHJ1Y3QgSGFsIHsKLSAgICBjb250cm9sOiBDb250cm9sSGFsLAotICAgIGFjbDogQWNsSGFsLAotICAgIHNjbzogU2NvSGFsLAotICAgIGlzbzogSXNvSGFsLAotfQotCi0vLy8gQ29tbWFuZCAmIGV2ZW50IHR4L3J4Ci0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLXB1YiBzdHJ1Y3QgQ29udHJvbEhhbCB7Ci0gICAgLy8vIFRyYW5zbWl0IGVuZAotICAgIHB1YiB0eDogU2VuZGVyPENvbW1hbmRQYWNrZXQ+LAotICAgIC8vLyBSZWNlaXZlIGVuZAotICAgIHB1YiByeDogQXJjPE11dGV4PFJlY2VpdmVyPEV2ZW50UGFja2V0Pj4+LAotfQotCi0vLy8gQWNsIHR4L3J4Ci0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLXB1YiBzdHJ1Y3QgQWNsSGFsIHsKLSAgICAvLy8gVHJhbnNtaXQgZW5kCi0gICAgcHViIHR4OiBTZW5kZXI8QWNsUGFja2V0PiwKLSAgICAvLy8gUmVjZWl2ZSBlbmQKLSAgICBwdWIgcng6IEFyYzxNdXRleDxSZWNlaXZlcjxBY2xQYWNrZXQ+Pj4sCi19Ci0KLS8vLyBTY28gdHgvcngKLSNbZGVyaXZlKENsb25lLCBTdG9wcGFibGUpXQotcHViIHN0cnVjdCBTY29IYWwgewotICAgIC8vLyBUcmFuc21pdCBlbmQKLSAgICBwdWIgdHg6IFNlbmRlcjxTY29QYWNrZXQ+LAotICAgIC8vLyBSZWNlaXZlIGVuZAotICAgIHB1YiByeDogQXJjPE11dGV4PFJlY2VpdmVyPFNjb1BhY2tldD4+PiwKLX0KLQotLy8vIElzbyB0eC9yeAotI1tkZXJpdmUoQ2xvbmUsIFN0b3BwYWJsZSldCi1wdWIgc3RydWN0IElzb0hhbCB7Ci0gICAgLy8vIFRyYW5zbWl0IGVuZAotICAgIHB1YiB0eDogU2VuZGVyPElzb1BhY2tldD4sCi0gICAgLy8vIFJlY2VpdmUgZW5kCi0gICAgcHViIHJ4OiBBcmM8TXV0ZXg8UmVjZWl2ZXI8SXNvUGFja2V0Pj4+LAotfQotCi0vLy8gVGhlIGRpZmZlcmVudCBtb2RlcyBzbm9vcCBsb2dnaW5nIGNhbiBiZSBpbgotI1tkZXJpdmUoQ2xvbmUpXQotcHViIGVudW0gU25vb3BNb2RlIHsKLSAgICAvLy8gQWxsIGxvZ3MgZGlzYWJsZWQKLSAgICBEaXNhYmxlZCwKLSAgICAvLy8gT25seSBzYW5pdGl6ZWQgbG9ncwotICAgIEZpbHRlcmVkLAotICAgIC8vLyBMb2cgZXZlcnl0aGluZwotICAgIEZ1bGwsCi19Ci0KLS8vLyBUaGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgbW9kZSBmcm9tIGEgc3RyaW5nCi1wdWIgc3RydWN0IFNub29wTW9kZVBhcnNlRXJyb3I7Ci0KLWltcGwgc3RkOjpzdHI6OkZyb21TdHIgZm9yIFNub29wTW9kZSB7Ci0gICAgdHlwZSBFcnIgPSBTbm9vcE1vZGVQYXJzZUVycm9yOwotCi0gICAgZm4gZnJvbV9zdHIoczogJnN0cikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4gewotICAgICAgICBtYXRjaCBzIHsKLSAgICAgICAgICAgICJkaXNhYmxlZCIgPT4gT2soU25vb3BNb2RlOjpEaXNhYmxlZCksCi0gICAgICAgICAgICAiZmlsdGVyZWQiID0+IE9rKFNub29wTW9kZTo6RmlsdGVyZWQpLAotICAgICAgICAgICAgImZ1bGwiID0+IE9rKFNub29wTW9kZTo6RnVsbCksCi0gICAgICAgICAgICBfID0+IEVycihTbm9vcE1vZGVQYXJzZUVycm9yKSwKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8vIEFsbCBzbm9vcCBsb2dnaW5nIGNvbmZpZwotI1tkZXJpdmUoQ2xvbmUsIFN0b3BwYWJsZSldCi1wdWIgc3RydWN0IFNub29wQ29uZmlnIHsKLSAgICBwYXRoOiBTdHJpbmcsCi0gICAgbWF4X3BhY2tldHNfcGVyX2ZpbGU6IHUzMiwKLSAgICBtb2RlOiBTbm9vcE1vZGUsCi19Ci0KLWltcGwgU25vb3BDb25maWcgewotICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IHNub29wIGNvbmZpZwotICAgIHB1YiBmbiBuZXcoKSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZiB7Ci0gICAgICAgICAgICBwYXRoOiAiL2RhdGEvbWlzYy9ibHVldG9vdGgvbG9ncy9idHNub29wX2hjaS5sb2ciLnRvX3N0cmluZygpLAotICAgICAgICAgICAgbWF4X3BhY2tldHNfcGVyX2ZpbGU6IHN5c19wcm9wOjpnZXRfdTMyKCJwZXJzaXN0LmJsdWV0b290aC5idHNub29wc2l6ZSIpCi0gICAgICAgICAgICAgICAgLnVud3JhcF9vcigweEZGRkYpLAotICAgICAgICAgICAgbW9kZTogZ2V0X2NvbmZpZ3VyZWRfc25vb3BfbW9kZSgpLnBhcnNlKCkudW53cmFwX29yKFNub29wTW9kZTo6RGlzYWJsZWQpLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIE92ZXJ3cml0ZXMgdGhlIGxhb2RlZCBsb2cgcGF0aCB3aXRoIHRoZSBwcm92aWRlZCBvbmUKLSAgICBwdWIgZm4gc2V0X3BhdGgoJm11dCBzZWxmLCB2YWx1ZTogU3RyaW5nKSB7Ci0gICAgICAgIHNlbGYucGF0aCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8vLyBPdmVyd3JpdGVzIHRoZSBsb2FkZWQgbW9kZSB3aXRoIHRoZSBwcm92aWRlZCBvbmUKLSAgICBwdWIgZm4gc2V0X21vZGUoJm11dCBzZWxmLCB2YWx1ZTogU25vb3BNb2RlKSB7Ci0gICAgICAgIHNlbGYubW9kZSA9IHZhbHVlOwotICAgIH0KLX0KLQotaW1wbCBEZWZhdWx0IGZvciBTbm9vcENvbmZpZyB7Ci0gICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewotICAgICAgICBTZWxmOjpuZXcoKQotICAgIH0KLX0KLQotZm4gZ2V0X2NvbmZpZ3VyZWRfc25vb3BfbW9kZSgpIC0+IFN0cmluZyB7Ci0gICAgc3lzX3Byb3A6OmdldCgicGVyc2lzdC5ibHVldG9vdGguYnRzbm9vcGxvZ21vZGUiKS51bndyYXBfb3IoaWYgc3lzX3Byb3A6OmdldF9kZWJ1Z2dhYmxlKCkgewotICAgICAgICBzeXNfcHJvcDo6Z2V0KCJwZXJzaXN0LmJsdWV0b290aC5idHNub29wZGVmYXVsdG1vZGUiKS51bndyYXBfb3JfZGVmYXVsdCgpCi0gICAgfSBlbHNlIHsKLSAgICAgICAgU3RyaW5nOjpkZWZhdWx0KCkKLSAgICB9KQotfQotCi1tb2R1bGUhIHsKLSAgICBzbm9vcF9tb2R1bGUsCi0gICAgcHJvdmlkZXJzIHsKLSAgICAgICAgcGFydHMgSGFsID0+IHByb3ZpZGVfc25vb3BlZF9oYWwsCi0gICAgfSwKLX0KLQotI1twcm92aWRlc10KLWFzeW5jIGZuIHByb3ZpZGVfc25vb3BlZF9oYWwoY29uZmlnOiBTbm9vcENvbmZpZywgcmF3X2hhbDogUmF3SGFsLCBydDogQXJjPFJ1bnRpbWU+KSAtPiBIYWwgewotICAgIGxldCAoY21kX2Rvd25fdHgsIG11dCBjbWRfZG93bl9yeCkgPSBjaGFubmVsOjo8Q29tbWFuZFBhY2tldD4oMTApOwotICAgIGxldCAoZXZ0X3VwX3R4LCBldnRfdXBfcngpID0gY2hhbm5lbDo6PEV2ZW50UGFja2V0PigxMCk7Ci0gICAgbGV0IChhY2xfZG93bl90eCwgbXV0IGFjbF9kb3duX3J4KSA9IGNoYW5uZWw6OjxBY2xQYWNrZXQ+KDEwKTsKLSAgICBsZXQgKGFjbF91cF90eCwgYWNsX3VwX3J4KSA9IGNoYW5uZWw6OjxBY2xQYWNrZXQ+KDEwKTsKLSAgICBsZXQgKHNjb19kb3duX3R4LCBtdXQgc2NvX2Rvd25fcngpID0gY2hhbm5lbDo6PFNjb1BhY2tldD4oMTApOwotICAgIGxldCAoc2NvX3VwX3R4LCBzY29fdXBfcngpID0gY2hhbm5lbDo6PFNjb1BhY2tldD4oMTApOwotICAgIGxldCAoaXNvX2Rvd25fdHgsIG11dCBpc29fZG93bl9yeCkgPSBjaGFubmVsOjo8SXNvUGFja2V0PigxMCk7Ci0gICAgbGV0IChpc29fdXBfdHgsIGlzb191cF9yeCkgPSBjaGFubmVsOjo8SXNvUGFja2V0PigxMCk7Ci0KLSAgICBydC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgbGV0IG11dCBsb2dnZXIgPSBTbm9vcExvZ2dlcjo6bmV3KGNvbmZpZykuYXdhaXQ7Ci0gICAgICAgIGxvb3AgewotICAgICAgICAgICAgc2VsZWN0ISB7Ci0gICAgICAgICAgICAgICAgU29tZShldnQpID0gY29uc3VtZSgmcmF3X2hhbC5ldnRfcngpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgbGV0IEVycihlKSA9IGV2dF91cF90eC5zZW5kKGV2dC5jbG9uZSgpKS5hd2FpdCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciEoImV2dCBjaGFubmVsIGNsb3NlZCB7Oj99IiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFR5cGU6OkV2dCwgRGlyZWN0aW9uOjpVcCwgZXZ0LnRvX2J5dGVzKCkpLmF3YWl0OwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgU29tZShjbWQpID0gY21kX2Rvd25fcngucmVjdigpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgbGV0IEVycihlKSA9IHJhd19oYWwuY21kX3R4LnNlbmQoY21kLmNsb25lKCkpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciEoImNtZCBjaGFubmVsIGNsb3NlZCB7Oj99IiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFR5cGU6OkNtZCwgRGlyZWN0aW9uOjpEb3duLCBjbWQudG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBTb21lKGFjbCkgPSBhY2xfZG93bl9yeC5yZWN2KCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gcmF3X2hhbC5hY2xfdHguc2VuZChhY2wuY2xvbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJhY2wgZG93biBjaGFubmVsIGNsb3NlZCB7Oj99IiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFR5cGU6OkFjbCwgRGlyZWN0aW9uOjpEb3duLCBhY2wudG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBTb21lKGFjbCkgPSBjb25zdW1lKCZyYXdfaGFsLmFjbF9yeCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gYWNsX3VwX3R4LnNlbmQoYWNsLmNsb25lKCkpLmF3YWl0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yISgiYWNsIHVwIGNoYW5uZWwgY2xvc2VkIHs6P30iLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coVHlwZTo6QWNsLCBEaXJlY3Rpb246OlVwLCBhY2wudG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBTb21lKHNjbykgPSBzY29fZG93bl9yeC5yZWN2KCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gcmF3X2hhbC5zY29fdHguc2VuZChzY28uY2xvbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJzY28gZG93biBjaGFubmVsIGNsb3NlZCB7Oj99IiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFR5cGU6OlNjbywgRGlyZWN0aW9uOjpEb3duLCBzY28udG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBTb21lKHNjbykgPSBjb25zdW1lKCZyYXdfaGFsLnNjb19yeCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gc2NvX3VwX3R4LnNlbmQoc2NvLmNsb25lKCkpLmF3YWl0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yISgic2NvIHVwIGNoYW5uZWwgY2xvc2VkIHs6P30iLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coVHlwZTo6U2NvLCBEaXJlY3Rpb246OlVwLCBzY28udG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBTb21lKGlzbykgPSBpc29fZG93bl9yeC5yZWN2KCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gcmF3X2hhbC5pc29fdHguc2VuZChpc28uY2xvbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJpc28gZG93biBjaGFubmVsIGNsb3NlZCB7Oj99IiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFR5cGU6OklzbywgRGlyZWN0aW9uOjpEb3duLCBpc28udG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBTb21lKGlzbykgPSBjb25zdW1lKCZyYXdfaGFsLmlzb19yeCkgPT4gewotICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gaXNvX3VwX3R4LnNlbmQoaXNvLmNsb25lKCkpLmF3YWl0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yISgiaXNvIHVwIGNoYW5uZWwgY2xvc2VkIHs6P30iLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coVHlwZTo6SXNvLCBEaXJlY3Rpb246OlVwLCBpc28udG9fYnl0ZXMoKSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBlbHNlID0+IGJyZWFrLAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBIYWwgewotICAgICAgICBjb250cm9sOiBDb250cm9sSGFsIHsgdHg6IGNtZF9kb3duX3R4LCByeDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhldnRfdXBfcngpKSB9LAotICAgICAgICBhY2w6IEFjbEhhbCB7IHR4OiBhY2xfZG93bl90eCwgcng6IEFyYzo6bmV3KE11dGV4OjpuZXcoYWNsX3VwX3J4KSkgfSwKLSAgICAgICAgc2NvOiBTY29IYWwgeyB0eDogc2NvX2Rvd25fdHgsIHJ4OiBBcmM6Om5ldyhNdXRleDo6bmV3KHNjb191cF9yeCkpIH0sCi0gICAgICAgIGlzbzogSXNvSGFsIHsgdHg6IGlzb19kb3duX3R4LCByeDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhpc29fdXBfcngpKSB9LAotICAgIH0KLX0KLQotYXN5bmMgZm4gY29uc3VtZTxUPihyeDogJkFyYzxNdXRleDxVbmJvdW5kZWRSZWNlaXZlcjxUPj4+KSAtPiBPcHRpb248VD4gewotICAgIHJ4LmxvY2soKS5hd2FpdC5yZWN2KCkuYXdhaXQKLX0KLQotI1thbGxvdyh1bnVzZWQpXQotZW51bSBUeXBlIHsKLSAgICBDbWQgPSAxLAotICAgIEFjbCwKLSAgICBTY28sCi0gICAgRXZ0LAotICAgIElzbywKLX0KLQotZW51bSBEaXJlY3Rpb24gewotICAgIFVwLAotICAgIERvd24sCi19Ci0KLXN0cnVjdCBTbm9vcExvZ2dlciB7Ci0gICAgY29uZmlnOiBTbm9vcENvbmZpZywKLSAgICBmaWxlOiBPcHRpb248RmlsZT4sCi0gICAgcGFja2V0czogdTMyLAotfQotCi0vLyBtaWNyb3Mgc2luY2UgMDAwMC0wMS0wMQotY29uc3QgU05PT1BfRVBPQ0hfREVMVEE6IHU2NCA9IDB4MDBkY2RkYjMwZjJmODAwMDsKLQotaW1wbCBTbm9vcExvZ2dlciB7Ci0gICAgYXN5bmMgZm4gbmV3KG11dCBjb25maWc6IFNub29wQ29uZmlnKSAtPiBTZWxmIHsKLSAgICAgICAgLy8gZmlsdGVyZWQgc25vb3AgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgbGV0IFNub29wTW9kZTo6RmlsdGVyZWQgPSBjb25maWcubW9kZSB7Ci0gICAgICAgICAgICBjb25maWcubW9kZSA9IFNub29wTW9kZTo6RGlzYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdmVfZmlsZSgmY29uZmlnLnBhdGgpLmF3YWl0Lm9rKCk7Ci0gICAgICAgIHJlbW92ZV9maWxlKGNvbmZpZy5wYXRoLmNsb25lKCkgKyAiLmxhc3QiKS5hd2FpdC5vaygpOwotICAgICAgICBpZiBsZXQgU25vb3BNb2RlOjpEaXNhYmxlZCA9IGNvbmZpZy5tb2RlIHsKLSAgICAgICAgICAgIHJlbW92ZV9maWxlKGNvbmZpZy5wYXRoLmNsb25lKCkgKyAiLmZpbHRlcmVkIikuYXdhaXQub2soKTsKLSAgICAgICAgICAgIHJlbW92ZV9maWxlKGNvbmZpZy5wYXRoLmNsb25lKCkgKyAiLmZpbHRlcmVkLmxhc3QiKS5hd2FpdC5vaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IG11dCByZXQgPSBTZWxmIHsgY29uZmlnLCBmaWxlOiBOb25lLCBwYWNrZXRzOiAwIH07Ci0gICAgICAgIHJldC5vcGVuX25leHRfZmlsZSgpLmF3YWl0OwotCi0gICAgICAgIHJldAotICAgIH0KLQotICAgIGFzeW5jIGZuIGxvZygmbXV0IHNlbGYsIHQ6IFR5cGUsIGRpcjogRGlyZWN0aW9uLCBieXRlczogQnl0ZXMpIHsKLSAgICAgICAgaWYgbGV0IFNub29wTW9kZTo6RGlzYWJsZWQgPSBzZWxmLmNvbmZpZy5tb2RlIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBtdXQgZmxhZ3MgPSAwOwotICAgICAgICBpZiBsZXQgRGlyZWN0aW9uOjpVcCA9IGRpciB7Ci0gICAgICAgICAgICBmbGFncyB8PSAwYjAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIGxldCBUeXBlOjpDbWQgfCBUeXBlOjpFdnQgPSB0IHsKLSAgICAgICAgICAgIGZsYWdzIHw9IDBiMTA7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgdGltZXN0YW1wOiB1NjQgPSB1NjQ6OnRyeV9mcm9tKAotICAgICAgICAgICAgU3lzdGVtVGltZTo6bm93KCkuZHVyYXRpb25fc2luY2UoU3lzdGVtVGltZTo6VU5JWF9FUE9DSCkudW53cmFwKCkuYXNfbWljcm9zKCksCi0gICAgICAgICkKLSAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICArIFNOT09QX0VQT0NIX0RFTFRBOwotCi0gICAgICAgIC8vIEFkZCBvbmUgZm9yIHRoZSB0eXBlIGJ5dGUKLSAgICAgICAgbGV0IGxlbmd0aCA9IHUzMjo6dHJ5X2Zyb20oYnl0ZXMubGVuKCkpLnVud3JhcCgpICsgMTsKLQotICAgICAgICBsZXQgbXV0IGJ1ZmZlciA9IEJ5dGVzTXV0OjpuZXcoKTsKLSAgICAgICAgYnVmZmVyLnB1dF91MzIobGVuZ3RoKTsgLy8gb3JpZ2luYWwgbGVuZ3RoCi0gICAgICAgIGJ1ZmZlci5wdXRfdTMyKGxlbmd0aCk7IC8vIGNhcHR1cmVkIGxlbmd0aAotICAgICAgICBidWZmZXIucHV0X3UzMihmbGFncyk7IC8vIGZsYWdzCi0gICAgICAgIGJ1ZmZlci5wdXRfdTMyKDApOyAvLyBkcm9wcGVkIHBhY2tldHMKLSAgICAgICAgYnVmZmVyLnB1dF91NjQodGltZXN0YW1wKTsgLy8gdGltZXN0YW1wCi0gICAgICAgIGJ1ZmZlci5wdXRfdTgodCBhcyB1OCk7IC8vIHR5cGUKLSAgICAgICAgYnVmZmVyLnB1dChieXRlcyk7Ci0KLSAgICAgICAgc2VsZi5wYWNrZXRzICs9IDE7Ci0gICAgICAgIGlmIHNlbGYucGFja2V0cyA+IHNlbGYuY29uZmlnLm1heF9wYWNrZXRzX3Blcl9maWxlIHsKLSAgICAgICAgICAgIHNlbGYub3Blbl9uZXh0X2ZpbGUoKS5hd2FpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIGxldCBTb21lKGZpbGUpID0gJm11dCBzZWxmLmZpbGUgewotICAgICAgICAgICAgaWYgZmlsZS53cml0ZV9hbGwoJmJ1ZmZlcikuYXdhaXQuaXNfZXJyKCkgewotICAgICAgICAgICAgICAgIGVycm9yISgiRmFpbGVkIHRvIHdyaXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiBmaWxlLmZsdXNoKCkuYXdhaXQuaXNfZXJyKCkgewotICAgICAgICAgICAgICAgIGVycm9yISgiRmFpbGVkIHRvIGZsdXNoIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYW5pYyEoIkxvZ2dpbmcgd2l0aG91dCBhIGJhY2tpbmcgZmlsZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXN5bmMgZm4gY2xvc2VfZmlsZSgmbXV0IHNlbGYpIHsKLSAgICAgICAgaWYgbGV0IFNvbWUoZmlsZSkgPSAmbXV0IHNlbGYuZmlsZSB7Ci0gICAgICAgICAgICBmaWxlLmZsdXNoKCkuYXdhaXQub2soKTsKLSAgICAgICAgICAgIHNlbGYuZmlsZSA9IE5vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi5wYWNrZXRzID0gMDsKLSAgICB9Ci0KLSAgICBhc3luYyBmbiBvcGVuX25leHRfZmlsZSgmbXV0IHNlbGYpIHsKLSAgICAgICAgc2VsZi5jbG9zZV9maWxlKCkuYXdhaXQ7Ci0KLSAgICAgICAgcmVuYW1lKCZzZWxmLmNvbmZpZy5wYXRoLCBzZWxmLmNvbmZpZy5wYXRoLmNsb25lKCkgKyAiLmxhc3QiKS5hd2FpdC5vaygpOwotICAgICAgICBsZXQgbXV0IGZpbGUgPSBGaWxlOjpjcmVhdGUoJnNlbGYuY29uZmlnLnBhdGgpLmF3YWl0LmV4cGVjdCgiY291bGQgbm90IG9wZW4gc25vb3AgbG9nIik7Ci0gICAgICAgIGZpbGUud3JpdGVfYWxsKGIiYnRzbm9vcFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAzXHhlYSIpCi0gICAgICAgICAgICAuYXdhaXQKLSAgICAgICAgICAgIC5leHBlY3QoImNvdWxkIG5vdCB3cml0ZSBzbm9vcCBoZWFkZXIiKTsKLSAgICAgICAgaWYgZmlsZS5mbHVzaCgpLmF3YWl0LmlzX2VycigpIHsKLSAgICAgICAgICAgIGVycm9yISgiRmFpbGVkIHRvIGZsdXNoIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi5maWxlID0gU29tZShmaWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oY2kvY29udHJvbGxlci5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2hjaS9jb250cm9sbGVyLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJkMjdhLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc3RhY2svc3JjL2hjaS9jb250cm9sbGVyLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vISBMb2FkcyBpbmZvIGZyb20gdGhlIGNvbnRyb2xsZXIgYXQgc3RhcnR1cAotCi11c2UgY3JhdGU6OmhjaTo6e0FkZHJlc3MsIENvbW1hbmRTZW5kZXJ9OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6ewotICAgIEVuYWJsZSwgRXJyb3JDb2RlLCBMZUhvc3RGZWF0dXJlQml0cywgTGVNYXhpbXVtRGF0YUxlbmd0aCwgTGVSZWFkQnVmZmVyU2l6ZVYxQnVpbGRlciwKLSAgICBMZVJlYWRCdWZmZXJTaXplVjJCdWlsZGVyLCBMZVJlYWRDb25uZWN0TGlzdFNpemVCdWlsZGVyLCBMZVJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzQnVpbGRlciwKLSAgICBMZVJlYWRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoQnVpbGRlciwgTGVSZWFkTWF4aW11bURhdGFMZW5ndGhCdWlsZGVyLAotICAgIExlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzQnVpbGRlciwgTGVSZWFkUGVyaW9kaWNBZHZlcnRpc2VyTGlzdFNpemVCdWlsZGVyLAotICAgIExlUmVhZFJlc29sdmluZ0xpc3RTaXplQnVpbGRlciwgTGVSZWFkU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGhCdWlsZGVyLAotICAgIExlUmVhZFN1cHBvcnRlZFN0YXRlc0J1aWxkZXIsIExlU2V0RXZlbnRNYXNrQnVpbGRlciwgTGVTZXRIb3N0RmVhdHVyZUJ1aWxkZXIsCi0gICAgTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24sIE9wQ29kZSwgT3BDb2RlSW5kZXgsIFJlYWRCZEFkZHJCdWlsZGVyLCBSZWFkQnVmZmVyU2l6ZUJ1aWxkZXIsCi0gICAgUmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0J1aWxkZXIsIFJlYWRMb2NhbE5hbWVCdWlsZGVyLCBSZWFkTG9jYWxTdXBwb3J0ZWRDb21tYW5kc0J1aWxkZXIsCi0gICAgUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQnVpbGRlciwgU2V0RXZlbnRNYXNrQnVpbGRlciwgV3JpdGVMZUhvc3RTdXBwb3J0QnVpbGRlciwKLSAgICBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlQnVpbGRlciwKLX07Ci11c2UgZ2RkaTo6e21vZHVsZSwgcHJvdmlkZXMsIFN0b3BwYWJsZX07Ci11c2UgbnVtX3RyYWl0czo6VG9QcmltaXRpdmU7Ci11c2Ugc3RkOjpjb252ZXJ0OjpUcnlGcm9tOwotdXNlIHN0ZDo6c3luYzo6QXJjOwotCi1tb2R1bGUhIHsKLSAgICBjb250cm9sbGVyX21vZHVsZSwKLSAgICBwcm92aWRlcnMgewotICAgICAgICBBcmM8Q29udHJvbGxlckV4cG9ydHM+ID0+IHByb3ZpZGVfY29udHJvbGxlciwKLSAgICB9LAotfQotCi1tYWNyb19ydWxlcyEgYXNzZXJ0X3N1Y2Nlc3MgewotICAgICgkaGNpOmlkZW50LnNlbmQoJGJ1aWxkZXI6ZXhwcikpID0+IHt7Ci0gICAgICAgIGxldCByZXNwb25zZSA9ICRoY2kuc2VuZCgkYnVpbGRlcikuYXdhaXQ7Ci0gICAgICAgIGFzc2VydCEocmVzcG9uc2UuZ2V0X3N0YXR1cygpID09IEVycm9yQ29kZTo6U3VjY2Vzcyk7Ci0KLSAgICAgICAgcmVzcG9uc2UKLSAgICB9fTsKLX0KLQotI1twcm92aWRlc10KLWFzeW5jIGZuIHByb3ZpZGVfY29udHJvbGxlcihtdXQgaGNpOiBDb21tYW5kU2VuZGVyKSAtPiBBcmM8Q29udHJvbGxlckV4cG9ydHM+IHsKLSAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVTZXRFdmVudE1hc2tCdWlsZGVyIHsgbGVfZXZlbnRfbWFzazogMHgwMDAwMDAwMDQxMDIxZTdmIH0pKTsKLSAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoU2V0RXZlbnRNYXNrQnVpbGRlciB7IGV2ZW50X21hc2s6IDB4M2RiZmZmZmZmZmZmZmZmZiB9KSk7Ci0gICAgYXNzZXJ0X3N1Y2Nlc3MhKAotICAgICAgICBoY2kuc2VuZChXcml0ZVNpbXBsZVBhaXJpbmdNb2RlQnVpbGRlciB7IHNpbXBsZV9wYWlyaW5nX21vZGU6IEVuYWJsZTo6RW5hYmxlZCB9KQotICAgICk7Ci0gICAgYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKFdyaXRlTGVIb3N0U3VwcG9ydEJ1aWxkZXIgewotICAgICAgICBsZV9zdXBwb3J0ZWRfaG9zdDogRW5hYmxlOjpFbmFibGVkLAotICAgICAgICBzaW11bHRhbmVvdXNfbGVfaG9zdDogRW5hYmxlOjpFbmFibGVkCi0gICAgfSkpOwotCi0gICAgbGV0IG5hbWUgPSBudWxsX3Rlcm1pbmF0ZWRfdG9fc3RyaW5nKAotICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoUmVhZExvY2FsTmFtZUJ1aWxkZXIge30pKS5nZXRfbG9jYWxfbmFtZSgpLAotICAgICk7Ci0KLSAgICBsZXQgdmVyc2lvbl9pbmZvID0gYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbkJ1aWxkZXIge30pKQotICAgICAgICAuZ2V0X2xvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24oKQotICAgICAgICAuY2xvbmUoKTsKLQotICAgIGxldCBjb21tYW5kcyA9IFN1cHBvcnRlZENvbW1hbmRzIHsKLSAgICAgICAgc3VwcG9ydGVkOiAqYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzQnVpbGRlciB7fSkpCi0gICAgICAgICAgICAuZ2V0X3N1cHBvcnRlZF9jb21tYW5kcygpLAotICAgIH07Ci0KLSAgICBsZXQgZmVhdHVyZXMgPSByZWFkX2ZlYXR1cmVzKCZtdXQgaGNpKS5hd2FpdDsKLQotICAgIGxldCBidWZmZXJfc2l6ZSA9IGFzc2VydF9zdWNjZXNzIShoY2kuc2VuZChSZWFkQnVmZmVyU2l6ZUJ1aWxkZXIge30pKTsKLSAgICBsZXQgYWNsX2J1ZmZlcl9sZW5ndGggPSBidWZmZXJfc2l6ZS5nZXRfYWNsX2RhdGFfcGFja2V0X2xlbmd0aCgpOwotICAgIGxldCBtdXQgYWNsX2J1ZmZlcnMgPSBidWZmZXJfc2l6ZS5nZXRfdG90YWxfbnVtX2FjbF9kYXRhX3BhY2tldHMoKTsKLQotICAgIGxldCAobXV0IGxlX2J1ZmZlcl9sZW5ndGgsIG11dCBsZV9idWZmZXJzLCBpc29fYnVmZmVyX2xlbmd0aCwgaXNvX2J1ZmZlcnMpID0KLSAgICAgICAgaWYgY29tbWFuZHMuaXNfc3VwcG9ydGVkKE9wQ29kZTo6TGVSZWFkQnVmZmVyU2l6ZVYyKSB7Ci0gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVSZWFkQnVmZmVyU2l6ZVYyQnVpbGRlciB7fSkpOwotICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldF9sZV9idWZmZXJfc2l6ZSgpLmxlX2RhdGFfcGFja2V0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRfbGVfYnVmZmVyX3NpemUoKS50b3RhbF9udW1fbGVfcGFja2V0cywKLSAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRfaXNvX2J1ZmZlcl9zaXplKCkubGVfZGF0YV9wYWNrZXRfbGVuZ3RoLAotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldF9pc29fYnVmZmVyX3NpemUoKS50b3RhbF9udW1fbGVfcGFja2V0cywKLSAgICAgICAgICAgICkKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGFzc2VydF9zdWNjZXNzIShoY2kuc2VuZChMZVJlYWRCdWZmZXJTaXplVjFCdWlsZGVyIHt9KSk7Ci0gICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0X2xlX2J1ZmZlcl9zaXplKCkubGVfZGF0YV9wYWNrZXRfbGVuZ3RoLAotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldF9sZV9idWZmZXJfc2l6ZSgpLnRvdGFsX251bV9sZV9wYWNrZXRzLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICkKLSAgICAgICAgfTsKLQotICAgIC8vIElmIHRoZSBjb250cm9sbGVyIHJlcG9ydHMgemVybyBMRSBidWZmZXJzLCB0aGUgQUNMIGJ1ZmZlcnMgYXJlIHNoYXJlZCBiZXR3ZWVuIGNsYXNzaWMgJiBMRQotICAgIGlmIGxlX2J1ZmZlcnMgPT0gMCB7Ci0gICAgICAgIGxlX2J1ZmZlcnMgPSAoYWNsX2J1ZmZlcnMgLyAyKSBhcyB1ODsKLSAgICAgICAgYWNsX2J1ZmZlcnMgLT0gbGVfYnVmZmVycyBhcyB1MTY7Ci0gICAgICAgIGxlX2J1ZmZlcl9sZW5ndGggPSBhY2xfYnVmZmVyX2xlbmd0aDsKLSAgICB9Ci0KLSAgICBsZXQgbGVfZmVhdHVyZXMgPSBTdXBwb3J0ZWRMZUZlYXR1cmVzOjpuZXcoCi0gICAgICAgIGFzc2VydF9zdWNjZXNzIShoY2kuc2VuZChMZVJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzQnVpbGRlciB7fSkpLmdldF9sZV9mZWF0dXJlcygpLAotICAgICk7Ci0gICAgbGV0IGxlX3N1cHBvcnRlZF9zdGF0ZXMgPQotICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVSZWFkU3VwcG9ydGVkU3RhdGVzQnVpbGRlciB7fSkpLmdldF9sZV9zdGF0ZXMoKTsKLSAgICBsZXQgbGVfY29ubmVjdF9saXN0X3NpemUgPQotICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVSZWFkQ29ubmVjdExpc3RTaXplQnVpbGRlciB7fSkpLmdldF9jb25uZWN0X2xpc3Rfc2l6ZSgpOwotICAgIGxldCBsZV9yZXNvbHZpbmdfbGlzdF9zaXplID0KLSAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKExlUmVhZFJlc29sdmluZ0xpc3RTaXplQnVpbGRlciB7fSkpLmdldF9yZXNvbHZpbmdfbGlzdF9zaXplKCk7Ci0KLSAgICBsZXQgbGVfbWF4X2RhdGFfbGVuZ3RoID0gaWYgY29tbWFuZHMuaXNfc3VwcG9ydGVkKE9wQ29kZTo6TGVSZWFkTWF4aW11bURhdGFMZW5ndGgpIHsKLSAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKExlUmVhZE1heGltdW1EYXRhTGVuZ3RoQnVpbGRlciB7fSkpCi0gICAgICAgICAgICAuZ2V0X2xlX21heGltdW1fZGF0YV9sZW5ndGgoKQotICAgICAgICAgICAgLmNsb25lKCkKLSAgICB9IGVsc2UgewotICAgICAgICBMZU1heGltdW1EYXRhTGVuZ3RoIHsKLSAgICAgICAgICAgIHN1cHBvcnRlZF9tYXhfcnhfb2N0ZXRzOiAwLAotICAgICAgICAgICAgc3VwcG9ydGVkX21heF9yeF90aW1lOiAwLAotICAgICAgICAgICAgc3VwcG9ydGVkX21heF90eF9vY3RldHM6IDAsCi0gICAgICAgICAgICBzdXBwb3J0ZWRfbWF4X3R4X3RpbWU6IDAsCi0gICAgICAgIH0KLSAgICB9OwotCi0gICAgbGV0IGxlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoID0KLSAgICAgICAgaWYgY29tbWFuZHMuaXNfc3VwcG9ydGVkKE9wQ29kZTo6TGVSZWFkU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGgpIHsKLSAgICAgICAgICAgIGFzc2VydF9zdWNjZXNzIShoY2kuc2VuZChMZVJlYWRTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aEJ1aWxkZXIge30pKS5nZXRfdHhfb2N0ZXRzKCkKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIDAKLSAgICAgICAgfTsKLQotICAgIGxldCBsZV9tYXhfYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGggPQotICAgICAgICBpZiBjb21tYW5kcy5pc19zdXBwb3J0ZWQoT3BDb2RlOjpMZVJlYWRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoKSB7Ci0gICAgICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVSZWFkTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aEJ1aWxkZXIge30pKQotICAgICAgICAgICAgICAgIC5nZXRfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aCgpCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAzMQotICAgICAgICB9OwotICAgIGxldCBsZV9zdXBwb3J0ZWRfYWR2ZXJ0aXNpbmdfc2V0cyA9Ci0gICAgICAgIGlmIGNvbW1hbmRzLmlzX3N1cHBvcnRlZChPcENvZGU6OkxlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzKSB7Ci0gICAgICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRBZHZlcnRpc2luZ1NldHNCdWlsZGVyIHt9KSkKLSAgICAgICAgICAgICAgICAuZ2V0X251bWJlcl9zdXBwb3J0ZWRfYWR2ZXJ0aXNpbmdfc2V0cygpCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAxCi0gICAgICAgIH07Ci0gICAgbGV0IGxlX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplID0KLSAgICAgICAgaWYgY29tbWFuZHMuaXNfc3VwcG9ydGVkKE9wQ29kZTo6TGVSZWFkUGVyaW9kaWNBZHZlcnRpc2luZ0xpc3RTaXplKSB7Ci0gICAgICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaGNpLnNlbmQoTGVSZWFkUGVyaW9kaWNBZHZlcnRpc2VyTGlzdFNpemVCdWlsZGVyIHt9KSkKLSAgICAgICAgICAgICAgICAuZ2V0X3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplKCkKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIDAKLSAgICAgICAgfTsKLQotICAgIGlmIGNvbW1hbmRzLmlzX3N1cHBvcnRlZChPcENvZGU6OkxlU2V0SG9zdEZlYXR1cmUpIHsKLSAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKExlU2V0SG9zdEZlYXR1cmVCdWlsZGVyIHsKLSAgICAgICAgICAgIGJpdF9udW1iZXI6IExlSG9zdEZlYXR1cmVCaXRzOjpDb25uZWN0ZWRJc29TdHJlYW1Ib3N0U3VwcG9ydCwKLSAgICAgICAgICAgIGJpdF92YWx1ZTogRW5hYmxlOjpFbmFibGVkCi0gICAgICAgIH0pKTsKLSAgICB9Ci0KLSAgICBsZXQgYWRkcmVzcyA9IGFzc2VydF9zdWNjZXNzIShoY2kuc2VuZChSZWFkQmRBZGRyQnVpbGRlciB7fSkpLmdldF9iZF9hZGRyKCk7Ci0KLSAgICBBcmM6Om5ldyhDb250cm9sbGVyRXhwb3J0cyB7Ci0gICAgICAgIG5hbWUsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHZlcnNpb25faW5mbywKLSAgICAgICAgY29tbWFuZHMsCi0gICAgICAgIGZlYXR1cmVzLAotICAgICAgICBhY2xfYnVmZmVyX2xlbmd0aCwKLSAgICAgICAgYWNsX2J1ZmZlcnMsCi0gICAgICAgIHNjb19idWZmZXJfbGVuZ3RoOiBidWZmZXJfc2l6ZS5nZXRfc3luY2hyb25vdXNfZGF0YV9wYWNrZXRfbGVuZ3RoKCksCi0gICAgICAgIHNjb19idWZmZXJzOiBidWZmZXJfc2l6ZS5nZXRfdG90YWxfbnVtX3N5bmNocm9ub3VzX2RhdGFfcGFja2V0cygpLAotICAgICAgICBsZV9idWZmZXJfbGVuZ3RoLAotICAgICAgICBsZV9idWZmZXJzLAotICAgICAgICBpc29fYnVmZmVyX2xlbmd0aCwKLSAgICAgICAgaXNvX2J1ZmZlcnMsCi0gICAgICAgIGxlX2ZlYXR1cmVzLAotICAgICAgICBsZV9zdXBwb3J0ZWRfc3RhdGVzLAotICAgICAgICBsZV9jb25uZWN0X2xpc3Rfc2l6ZSwKLSAgICAgICAgbGVfcmVzb2x2aW5nX2xpc3Rfc2l6ZSwKLSAgICAgICAgbGVfbWF4X2RhdGFfbGVuZ3RoLAotICAgICAgICBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aCwKLSAgICAgICAgbGVfbWF4X2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoLAotICAgICAgICBsZV9zdXBwb3J0ZWRfYWR2ZXJ0aXNpbmdfc2V0cywKLSAgICAgICAgbGVfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemUsCi0gICAgfSkKLX0KLQotYXN5bmMgZm4gcmVhZF9mZWF0dXJlcyhoY2k6ICZtdXQgQ29tbWFuZFNlbmRlcikgLT4gU3VwcG9ydGVkRmVhdHVyZXMgewotICAgIGxldCBtdXQgZmVhdHVyZXMgPSBWZWM6Om5ldygpOwotICAgIGxldCBtdXQgcGFnZV9udW1iZXI6IHU4ID0gMDsKLSAgICBsZXQgbXV0IG1heF9wYWdlX251bWJlcjogdTggPSAxOwotICAgIHdoaWxlIHBhZ2VfbnVtYmVyIDwgbWF4X3BhZ2VfbnVtYmVyIHsKLSAgICAgICAgbGV0IHJlc3BvbnNlID0gYXNzZXJ0X3N1Y2Nlc3MhKGhjaS5zZW5kKFJlYWRMb2NhbEV4dGVuZGVkRmVhdHVyZXNCdWlsZGVyIHsgcGFnZV9udW1iZXIgfSkpOwotICAgICAgICBtYXhfcGFnZV9udW1iZXIgPSByZXNwb25zZS5nZXRfbWF4aW11bV9wYWdlX251bWJlcigpOwotICAgICAgICBmZWF0dXJlcy5wdXNoKHJlc3BvbnNlLmdldF9leHRlbmRlZF9sbXBfZmVhdHVyZXMoKSk7Ci0gICAgICAgIHBhZ2VfbnVtYmVyICs9IDE7Ci0gICAgfQotCi0gICAgU3VwcG9ydGVkRmVhdHVyZXM6Om5ldyhmZWF0dXJlcykKLX0KLQotLy8vIENvbnRyb2xsZXIgaW50ZXJmYWNlCi0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLSNbYWxsb3cobWlzc2luZ19kb2NzKV0KLXB1YiBzdHJ1Y3QgQ29udHJvbGxlckV4cG9ydHMgewotICAgIHB1YiBuYW1lOiBTdHJpbmcsCi0gICAgcHViIGFkZHJlc3M6IEFkZHJlc3MsCi0gICAgcHViIHZlcnNpb25faW5mbzogTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24sCi0gICAgcHViIGNvbW1hbmRzOiBTdXBwb3J0ZWRDb21tYW5kcywKLSAgICBwdWIgZmVhdHVyZXM6IFN1cHBvcnRlZEZlYXR1cmVzLAotICAgIHB1YiBhY2xfYnVmZmVyX2xlbmd0aDogdTE2LAotICAgIHB1YiBhY2xfYnVmZmVyczogdTE2LAotICAgIHB1YiBzY29fYnVmZmVyX2xlbmd0aDogdTgsCi0gICAgcHViIHNjb19idWZmZXJzOiB1MTYsCi0gICAgcHViIGxlX2J1ZmZlcl9sZW5ndGg6IHUxNiwKLSAgICBwdWIgbGVfYnVmZmVyczogdTgsCi0gICAgcHViIGlzb19idWZmZXJfbGVuZ3RoOiB1MTYsCi0gICAgcHViIGlzb19idWZmZXJzOiB1OCwKLSAgICBwdWIgbGVfZmVhdHVyZXM6IFN1cHBvcnRlZExlRmVhdHVyZXMsCi0gICAgcHViIGxlX3N1cHBvcnRlZF9zdGF0ZXM6IHU2NCwKLSAgICBwdWIgbGVfY29ubmVjdF9saXN0X3NpemU6IHU4LAotICAgIHB1YiBsZV9yZXNvbHZpbmdfbGlzdF9zaXplOiB1OCwKLSAgICBwdWIgbGVfbWF4X2RhdGFfbGVuZ3RoOiBMZU1heGltdW1EYXRhTGVuZ3RoLAotICAgIHB1YiBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aDogdTE2LAotICAgIHB1YiBsZV9tYXhfYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGg6IHUxNiwKLSAgICBwdWIgbGVfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHM6IHU4LAotICAgIHB1YiBsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZTogdTgsCi19Ci0KLS8vLyBDb252ZW5pZW5jZSBzdHJ1Y3QgZm9yIGNoZWNraW5nIHdoYXQgY29tbWFuZHMgYXJlIHN1cHBvcnRlZAotI1tkZXJpdmUoQ2xvbmUpXQotcHViIHN0cnVjdCBTdXBwb3J0ZWRDb21tYW5kcyB7Ci0gICAgc3VwcG9ydGVkOiBbdTg7IDY0XSwKLX0KLQotaW1wbCBTdXBwb3J0ZWRDb21tYW5kcyB7Ci0gICAgLy8vIENoZWNrIHdoZXRoZXIgYSBnaXZlbiBvcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCi0gICAgcHViIGZuIGlzX3N1cHBvcnRlZCgmc2VsZiwgb3Bjb2RlOiBPcENvZGUpIC0+IGJvb2wgewotICAgICAgICBsZXQgY29udmVydGVkID0gT3BDb2RlSW5kZXg6OnRyeV9mcm9tKG9wY29kZSk7Ci0gICAgICAgIGlmIGNvbnZlcnRlZC5pc19lcnIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgaW5kZXggPSBjb252ZXJ0ZWQudW53cmFwKCkudG9fdXNpemUoKS51bndyYXAoKTsKLQotICAgICAgICAvLyBPcENvZGVJbmRleCBpcyBlbmNvZGVkIGFzIG9jdGV0ICogMTAgKyBiaXQgZm9yIHJlYWRhYmlsaXR5Ci0gICAgICAgIHNlbGYuc3VwcG9ydGVkW2luZGV4IC8gMTBdICYgKDEgPDwgKGluZGV4ICUgMTApKSA9PSAxCi0gICAgfQotfQotCi1tYWNyb19ydWxlcyEgc3VwcG9ydGVkX2ZlYXR1cmVzIHsKLSAgICAoJCgkaWQ6aWRlbnQgPT4gJHBhZ2U6bGl0ZXJhbCA6ICRiaXQ6bGl0ZXJhbCksKikgPT4gewotICAgICAgICAvLy8gQ29udmVuaWVuY2Ugc3RydWN0IGZvciBjaGVja2luZyB3aGF0IGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgI1tkZXJpdmUoQ2xvbmUpXQotICAgICAgICAjW2FsbG93KG1pc3NpbmdfZG9jcyldCi0gICAgICAgIHB1YiBzdHJ1Y3QgU3VwcG9ydGVkRmVhdHVyZXMgewotICAgICAgICAgICAgJChwdWIgJGlkOiBib29sLCkqCi0gICAgICAgIH0KLQotICAgICAgICBpbXBsIFN1cHBvcnRlZEZlYXR1cmVzIHsKLSAgICAgICAgICAgIGZuIG5ldyhzdXBwb3J0ZWQ6IFZlYzx1NjQ+KSAtPiBTZWxmIHsKLSAgICAgICAgICAgICAgICBTZWxmIHsKLSAgICAgICAgICAgICAgICAgICAgJCgkaWQ6ICpzdXBwb3J0ZWQuZ2V0KCRwYWdlKS51bndyYXBfb3IoJjApICYgKDEgPDwgJGJpdCkgIT0gMCwpKgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3VwcG9ydGVkX2ZlYXR1cmVzISB7Ci0gICAgdGhyZWVfc2xvdF9wYWNrZXRzID0+IDA6MCwKLSAgICBmaXZlX3Nsb3RfcGFja2V0cyA9PiAwOjEsCi0gICAgcm9sZV9zd2l0Y2ggPT4gMDo1LAotICAgIGhvbGRfbW9kZSA9PiAwOjYsCi0gICAgc25pZmZfbW9kZSA9PiAwOjcsCi0gICAgcGFya19tb2RlID0+IDA6OCwKLSAgICBzY28gPT4gMDoxMSwKLSAgICBodjJfcGFja2V0cyA9PiAwOjEyLAotICAgIGh2M19wYWNrZXRzID0+IDA6MTMsCi0gICAgY2xhc3NpY18ybV9waHkgPT4gMDoyNSwKLSAgICBjbGFzc2ljXzNtX3BoeSA9PiAwOjI2LAotICAgIGludGVybGFjZWRfaW5xdWlyeV9zY2FuID0+IDA6MjgsCi0gICAgcnNzaV93aXRoX2lucXVpcnlfcmVzdWx0cyA9PiAwOjMwLAotICAgIGV2M19wYWNrZXRzID0+IDA6MzEsCi0gICAgZXY0X3BhY2tldHMgPT4gMDozMiwKLSAgICBldjVfcGFja2V0cyA9PiAwOjMzLAotICAgIGJsZSA9PiAwOjM4LAotICAgIHRocmVlX3Nsb3RfZWRyX3BhY2tldHMgPT4gMDozOSwKLSAgICBmaXZlX3Nsb3RfZWRyX3BhY2tldHMgPT4gMDo0MCwKLSAgICBzbmlmZl9zdWJyYXRpbmcgPT4gMDo0MSwKLSAgICBlbmNyeXB0aW9uX3BhdXNlID0+IDA6NDIsCi0gICAgZXNjb18ybV9waHkgPT4gMDo0NSwKLSAgICBlc2NvXzNtX3BoeSA9PiAwOjQ2LAotICAgIHRocmVlX3Nsb3RfZXNjb19lZHJfcGFja2V0cyA9PiAwOjQ3LAotICAgIGV4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2UgPT4gMDo0OCwKLSAgICBzaW11bHRhbmVvdXNfbGVfYnJlZHIgPT4gMDo0OSwKLSAgICBzaW1wbGVfcGFpcmluZyA9PiAwOjUxLAotICAgIG5vbl9mbHVzaGFibGVfcGIgPT4gMDo1NCwKLSAgICBzZWN1cmVfY29ubmVjdGlvbnMgPT4gMjo4Ci19Ci0KLW1hY3JvX3J1bGVzISBzdXBwb3J0ZWRfbGVfZmVhdHVyZXMgewotICAgICgkKCRpZDppZGVudCA9PiAkYml0OmxpdGVyYWwpLCopID0+IHsKLSAgICAgICAgLy8vIENvbnZlbmllbmNlIHN0cnVjdCBmb3IgY2hlY2tpbmcgd2hhdCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkCi0gICAgICAgICNbZGVyaXZlKENsb25lKV0KLSAgICAgICAgI1thbGxvdyhtaXNzaW5nX2RvY3MpXQotICAgICAgICBwdWIgc3RydWN0IFN1cHBvcnRlZExlRmVhdHVyZXMgewotICAgICAgICAgICAgJChwdWIgJGlkOiBib29sLCkqCi0gICAgICAgIH0KLQotICAgICAgICBpbXBsIFN1cHBvcnRlZExlRmVhdHVyZXMgewotICAgICAgICAgICAgZm4gbmV3KHN1cHBvcnRlZDogdTY0KSAtPiBTZWxmIHsKLSAgICAgICAgICAgICAgICBTZWxmIHsKLSAgICAgICAgICAgICAgICAgICAgJCgkaWQ6IHN1cHBvcnRlZCAmICgxIDw8ICRiaXQpICE9IDAsKSoKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN1cHBvcnRlZF9sZV9mZWF0dXJlcyEgewotICAgIGNvbm5lY3Rpb25fcGFyYW1ldGVyX3JlcXVlc3QgPT4gMSwKLSAgICBjb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdCA9PiAyLAotICAgIHBlcmlwaGVyYWxfaW5pdGlhdGVkX2ZlYXR1cmVfZXhjaGFuZ2UgPT4gMywKLSAgICBwYWNrZXRfZXh0ZW5zaW9uID0+IDUsCi0gICAgcHJpdmFjeSA9PiA2LAotICAgIGJsZV8ybV9waHkgPT4gOCwKLSAgICBibGVfY29kZWRfcGh5ID0+IDExLAotICAgIGV4dGVuZGVkX2FkdmVydGlzaW5nID0+IDEyLAotICAgIHBlcmlvZGljX2FkdmVydGlzaW5nID0+IDEzLAotICAgIHBlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfc2VuZGVyID0+IDI0LAotICAgIHBlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcmVjaXBpZW50ID0+IDI1LAotICAgIGNvbm5lY3RlZF9pc29fc3RyZWFtX2NlbnRyYWwgPT4gMjgsCi0gICAgY29ubmVjdGVkX2lzb19zdHJlYW1fcGVyaXBoZXJhbCA9PiAyOSwKLSAgICBpc29fYnJvYWRjYXN0ZXIgPT4gMzAsCi0gICAgc3luY2hyb25pemVkX3JlY2VpdmVyID0+IDMxCi19Ci0KLS8vLyBDb252ZXJ0IGEgbnVsbCB0ZXJtaW5hdGVkIEMgc3RyaW5nIGludG8gYSBSdXN0IFN0cmluZwotcHViIGZuIG51bGxfdGVybWluYXRlZF90b19zdHJpbmcoc2xpY2U6ICZbdThdKSAtPiBTdHJpbmcgewotICAgIGxldCB0ZW1wID0gc3RkOjpzdHI6OmZyb21fdXRmOChzbGljZSkudW53cmFwKCk7Ci0gICAgdGVtcFswLi50ZW1wLmZpbmQoJ1wwJykudW53cmFwKCldLnRvX3N0cmluZygpCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oY2kvY29udHJvbGxlcl9mYWNhZGUucnMgYi9nZC9ydXN0L3N0YWNrL3NyYy9oY2kvY29udHJvbGxlcl9mYWNhZGUucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2RlNDQuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zdGFjay9zcmMvaGNpL2NvbnRyb2xsZXJfZmFjYWRlLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8vISBDb250cm9sbGVyIGZhY2FkZQotCi11c2UgY3JhdGU6OmhjaTo6Y29udHJvbGxlcjo6e251bGxfdGVybWluYXRlZF90b19zdHJpbmcsIENvbnRyb2xsZXJFeHBvcnRzfTsKLXVzZSBjcmF0ZTo6aGNpOjpIY2k7Ci11c2UgYnRfY29tbW9uOjpHcnBjRmFjYWRlOwotdXNlIGJ0X2ZhY2FkZV9wcm90bzo6Y29udHJvbGxlcl9mYWNhZGU6OnsKLSAgICBBZGRyZXNzTXNnLCBOYW1lTXNnLCBPcENvZGVNc2csIFNpbmdsZVZhbHVlTXNnLCBTdXBwb3J0ZWRNc2csCi19OwotdXNlIGJ0X2ZhY2FkZV9wcm90bzo6Y29udHJvbGxlcl9mYWNhZGVfZ3JwYzo6e2NyZWF0ZV9jb250cm9sbGVyX2ZhY2FkZSwgQ29udHJvbGxlckZhY2FkZX07Ci11c2UgYnRfZmFjYWRlX3Byb3RvOjplbXB0eTo6RW1wdHk7Ci11c2UgYnRfcGFja2V0czo6aGNpOjp7UmVhZExvY2FsTmFtZUJ1aWxkZXIsIFdyaXRlTG9jYWxOYW1lQnVpbGRlcn07Ci11c2UgZ2RkaTo6e21vZHVsZSwgcHJvdmlkZXMsIFN0b3BwYWJsZX07Ci11c2UgZ3JwY2lvOjoqOwotdXNlIHN0ZDo6c3luYzo6QXJjOwotCi1tb2R1bGUhIHsKLSAgICBjb250cm9sbGVyX2ZhY2FkZV9tb2R1bGUsCi0gICAgcHJvdmlkZXJzIHsKLSAgICAgICAgQ29udHJvbGxlckZhY2FkZVNlcnZpY2UgPT4gcHJvdmlkZV9mYWNhZGUsCi0gICAgfQotfQotCi0jW3Byb3ZpZGVzXQotYXN5bmMgZm4gcHJvdmlkZV9mYWNhZGUoZXhwb3J0czogQXJjPENvbnRyb2xsZXJFeHBvcnRzPiwgaGNpOiBIY2kpIC0+IENvbnRyb2xsZXJGYWNhZGVTZXJ2aWNlIHsKLSAgICBDb250cm9sbGVyRmFjYWRlU2VydmljZSB7IGV4cG9ydHMsIGhjaSB9Ci19Ci0KLS8vLyBDb250cm9sbGVyIGZhY2FkZSBzZXJ2aWNlCi0jW2FsbG93KG1pc3NpbmdfZG9jcyldCi0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLXB1YiBzdHJ1Y3QgQ29udHJvbGxlckZhY2FkZVNlcnZpY2UgewotICAgIHB1YiBleHBvcnRzOiBBcmM8Q29udHJvbGxlckV4cG9ydHM+LAotICAgIGhjaTogSGNpLAotfQotCi1pbXBsIEdycGNGYWNhZGUgZm9yIENvbnRyb2xsZXJGYWNhZGVTZXJ2aWNlIHsKLSAgICBmbiBpbnRvX2dycGMoc2VsZikgLT4gZ3JwY2lvOjpTZXJ2aWNlIHsKLSAgICAgICAgY3JlYXRlX2NvbnRyb2xsZXJfZmFjYWRlKHNlbGYpCi0gICAgfQotfQotCi1pbXBsIENvbnRyb2xsZXJGYWNhZGUgZm9yIENvbnRyb2xsZXJGYWNhZGVTZXJ2aWNlIHsKLSAgICBmbiBnZXRfbWFjX2FkZHJlc3MoJm11dCBzZWxmLCBjdHg6IFJwY0NvbnRleHQ8J18+LCBfcmVxOiBFbXB0eSwgc2luazogVW5hcnlTaW5rPEFkZHJlc3NNc2c+KSB7Ci0gICAgICAgIGxldCBjbG9uZSA9IHNlbGYuY2xvbmUoKTsKLSAgICAgICAgY3R4LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgbGV0IG11dCBhZGRyZXNzID0gQWRkcmVzc01zZzo6bmV3KCk7Ci0gICAgICAgICAgICBhZGRyZXNzLnNldF9hZGRyZXNzKGNsb25lLmV4cG9ydHMuYWRkcmVzcy5ieXRlcy50b192ZWMoKSk7Ci0gICAgICAgICAgICBzaW5rLnN1Y2Nlc3MoYWRkcmVzcykuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIGZuIHdyaXRlX2xvY2FsX25hbWUoJm11dCBzZWxmLCBjdHg6IFJwY0NvbnRleHQ8J18+LCByZXE6IE5hbWVNc2csIHNpbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgbGV0IG11dCBjbG9uZSA9IHNlbGYuY2xvbmUoKTsKLSAgICAgICAgbGV0IG11dCBidWlsZGVyID0gV3JpdGVMb2NhbE5hbWVCdWlsZGVyIHsgbG9jYWxfbmFtZTogWzA7IDI0OF0gfTsKLSAgICAgICAgYnVpbGRlci5sb2NhbF9uYW1lWzAuLnJlcS5nZXRfbmFtZSgpLmxlbigpXS5jb3B5X2Zyb21fc2xpY2UocmVxLmdldF9uYW1lKCkpOwotICAgICAgICBjdHguc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgICAgICBjbG9uZS5oY2kuY29tbWFuZHMuc2VuZChidWlsZGVyLmJ1aWxkKCkpLmF3YWl0OwotICAgICAgICAgICAgc2luay5zdWNjZXNzKEVtcHR5OjpkZWZhdWx0KCkpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBnZXRfbG9jYWxfbmFtZSgmbXV0IHNlbGYsIGN0eDogUnBjQ29udGV4dDwnXz4sIF9yZXE6IEVtcHR5LCBzaW5rOiBVbmFyeVNpbms8TmFtZU1zZz4pIHsKLSAgICAgICAgbGV0IG11dCBjbG9uZSA9IHNlbGYuY2xvbmUoKTsKLSAgICAgICAgY3R4LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgbGV0IGxvY2FsX25hbWUgPSBudWxsX3Rlcm1pbmF0ZWRfdG9fc3RyaW5nKAotICAgICAgICAgICAgICAgIGNsb25lLmhjaS5jb21tYW5kcy5zZW5kKFJlYWRMb2NhbE5hbWVCdWlsZGVyIHt9KS5hd2FpdC5nZXRfbG9jYWxfbmFtZSgpLAotICAgICAgICAgICAgKQotICAgICAgICAgICAgLmludG9fYnl0ZXMoKTsKLSAgICAgICAgICAgIGxldCBtdXQgbXNnID0gTmFtZU1zZzo6bmV3KCk7Ci0gICAgICAgICAgICBtc2cuc2V0X25hbWUobG9jYWxfbmFtZSk7Ci0gICAgICAgICAgICBzaW5rLnN1Y2Nlc3MobXNnKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gaXNfc3VwcG9ydGVkX2NvbW1hbmQoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IE9wQ29kZU1zZywKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBnZXRfbGVfbnVtYmVyX29mX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFNpbmdsZVZhbHVlTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLQotICAgIGZuIHN1cHBvcnRzX3NpbXBsZV9wYWlyaW5nKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotCi0gICAgZm4gc3VwcG9ydHNfc2VjdXJlX2Nvbm5lY3Rpb25zKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBzdXBwb3J0c19zaW11bHRhbmVvdXNfbGVfYnJfZWRyKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBzdXBwb3J0c19pbnRlcmxhY2VkX2lucXVpcnlfc2NhbigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotCi0gICAgZm4gc3VwcG9ydHNfcnNzaV93aXRoX2lucXVpcnlfcmVzdWx0cygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotCi0gICAgZm4gc3VwcG9ydHNfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZSgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotCi0gICAgZm4gc3VwcG9ydHNfcm9sZV9zd2l0Y2goJm11dCBzZWxmLCBfOiBScGNDb250ZXh0PCdfPiwgXzogRW1wdHksIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+KSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBzdXBwb3J0czNfc2xvdF9wYWNrZXRzKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotCi0gICAgZm4gc3VwcG9ydHM1X3Nsb3RfcGFja2V0cygmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLQotICAgIGZuIHN1cHBvcnRzX2NsYXNzaWMybV9waHkoJm11dCBzZWxmLCBfOiBScGNDb250ZXh0PCdfPiwgXzogRW1wdHksIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+KSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBzdXBwb3J0c19jbGFzc2ljM21fcGh5KCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotCi0gICAgZm4gc3VwcG9ydHMzX3Nsb3RfZWRyX3BhY2tldHMoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLQotICAgIGZuIHN1cHBvcnRzNV9zbG90X2Vkcl9wYWNrZXRzKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBzdXBwb3J0c19zY28oJm11dCBzZWxmLCBfOiBScGNDb250ZXh0PCdfPiwgXzogRW1wdHksIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+KSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0KLSAgICBmbiBzdXBwb3J0c19odjJfcGFja2V0cygmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19odjNfcGFja2V0cygmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ldjNfcGFja2V0cygmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ldjRfcGFja2V0cygmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLQotICAgIGZuIHN1cHBvcnRzX2V2NV9wYWNrZXRzKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2VzY28ybV9waHkoJm11dCBzZWxmLCBfOiBScGNDb250ZXh0PCdfPiwgXzogRW1wdHksIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+KSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfZXNjbzNtX3BoeSgmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0czNfc2xvdF9lc2NvX2Vkcl9wYWNrZXRzKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfaG9sZF9tb2RlKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX3NuaWZmX21vZGUoJm11dCBzZWxmLCBfOiBScGNDb250ZXh0PCdfPiwgXzogRW1wdHksIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+KSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfcGFya19tb2RlKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX25vbl9mbHVzaGFibGVfcGIoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19zbmlmZl9zdWJyYXRpbmcoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19lbmNyeXB0aW9uX3BhdXNlKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9lbmNyeXB0aW9uKCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9leHRlbmRlZF9yZWplY3QoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfcGVyaXBoZXJhbF9pbml0aWF0ZWRfZmVhdHVyZXNfZXhjaGFuZ2UoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfcGluZygmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfZGF0YV9wYWNrZXRfbGVuZ3RoX2V4dGVuc2lvbigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9wcml2YWN5KCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9leHRlbmRlZF9zY2FubmVyX2ZpbHRlcl9wb2xpY2llcygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZTJtX3BoeSgmbXV0IHNlbGYsIF86IFJwY0NvbnRleHQ8J18+LCBfOiBFbXB0eSwgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4pIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfc3RhYmxlX21vZHVsYXRpb25faW5kZXhfdHgoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfc3RhYmxlX21vZHVsYXRpb25faW5kZXhfcngoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfY29kZWRfcGh5KCZtdXQgc2VsZiwgXzogUnBjQ29udGV4dDwnXz4sIF86IEVtcHR5LCBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPikgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9leHRlbmRlZF9hZHZlcnRpc2luZygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZygKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9jaGFubmVsX3NlbGVjdGlvbl9hbGdvcml0aG0yKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3Bvd2VyX2NsYXNzMSgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9taW5pbXVtX3VzZWRfY2hhbm5lbHMoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfY29ubmVjdGlvbl9jdGVfcmVxdWVzdCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9jb25uZWN0aW9uX2N0ZV9yZXNwb25zZSgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9jb25uZWN0aW9ubGVzc19jdGVfdHJhbnNtaXR0ZXIoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfY29ubmVjdGlvbmxlc3NfY3RlX3JlY2VpdmVyKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX2FudGVubmFfc3dpdGNoaW5nX2R1cmluZ19jdGVfdHgoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfYW50ZW5uYV9zd2l0Y2hpbmdfZHVyaW5nX2N0ZV9yeCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9yZWNlaXZpbmdfY29uc3RhbnRfdG9uZV9leHRlbnNpb25zKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfc2VuZGVyKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcmVjaXBpZW50KAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3NsZWVwX2Nsb2NrX2FjY3VyYWN5X3VwZGF0ZXMoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfcmVtb3RlX3B1YmxpY19rZXlfdmFsaWRhdGlvbigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtX2NlbnRyYWwoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfY29ubmVjdGVkX2lzb2Nocm9ub3VzX3N0cmVhbV9wZXJpcGhlcmFsKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX2lzb2Nocm9ub3VzX2Jyb2FkY2FzdGVyKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3N5bmNocm9uaXplZF9yZWNlaXZlcigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfOiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgXzogRW1wdHksCi0gICAgICAgIF86IFVuYXJ5U2luazxTdXBwb3J0ZWRNc2c+LAotICAgICkgewotICAgICAgICB0b2RvISgpCi0gICAgfQotICAgIGZuIHN1cHBvcnRzX2JsZV9pc29jaHJvbm91c19jaGFubmVsc19ob3N0X3N1cHBvcnQoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgXzogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF86IEVtcHR5LAotICAgICAgICBfOiBVbmFyeVNpbms8U3VwcG9ydGVkTXNnPiwKLSAgICApIHsKLSAgICAgICAgdG9kbyEoKQotICAgIH0KLSAgICBmbiBzdXBwb3J0c19ibGVfcG93ZXJfY29udHJvbF9yZXF1ZXN0KAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3Bvd2VyX2NoYW5nZV9pbmRpY2F0aW9uKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci0gICAgZm4gc3VwcG9ydHNfYmxlX3BhdGhfbG9zc19tb25pdG9yaW5nKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF86IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBfOiBFbXB0eSwKLSAgICAgICAgXzogVW5hcnlTaW5rPFN1cHBvcnRlZE1zZz4sCi0gICAgKSB7Ci0gICAgICAgIHRvZG8hKCkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9oY2kvZXJyb3IucnMgYi9nZC9ydXN0L3N0YWNrL3NyYy9oY2kvZXJyb3IucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjQ0ZTMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zdGFjay9zcmMvaGNpL2Vycm9yLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8hIERlZmluZXMgdGhlIFJlc3VsdCB0eXBlIGFuZCBIQ0kgZXJyb3JzCi0KLXVzZSBmdXR1cmVzOjpjaGFubmVsOjpvbmVzaG90OwotdXNlIHN0ZDo6Zm10OjpEZWJ1ZzsKLXVzZSB0aGlzZXJyb3I6OkVycm9yOwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjplcnJvcjo6U2VuZEVycm9yOwotdXNlIHRva2lvOjpzeW5jOjpvbmVzaG90OjplcnJvcjo6UmVjdkVycm9yOwotCi0vLy8gUmVzdWx0IHR5cGUKLXB1YiB0eXBlIFJlc3VsdDxUPiA9IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8VCwgQm94PGR5biBzdGQ6OmVycm9yOjpFcnJvciArIFNlbmQgKyBTeW5jPj47Ci0KLS8vLyBIQ0kgZXJyb3JzCi0jW2Rlcml2ZShFcnJvciwgRGVidWcpXQotcHViIGVudW0gSGNpRXJyb3I8VDogRGVidWcgKyAnc3RhdGljPiB7Ci0gICAgLy8vIEVycm9yIHdoZW4gc2VuZGluZyBvbiBhIGJvdW5kZWQgY2hhbm5lbAotICAgICNbZXJyb3IoIkVycm9yIHNlbmRpbmc6IHswfSIpXQotICAgIEJvdW5kZWRTZW5kRXJyb3IoI1tmcm9tXSBTZW5kRXJyb3I8VD4pLAotICAgIC8vLyBFcnJvciB3aGVuIHNlbmRpbmcgb24gYSBvbmVzaG90IGNoYW5uZWwKLSAgICAjW2Vycm9yKCJFcnJvciBzZW5kaW5nOiB7MH0iKV0KLSAgICBPbmVzaG90U2VuZEVycm9yKCNbZnJvbV0gb25lc2hvdDo6Q2FuY2VsZWQpLAotICAgIC8vLyBFcnJvciByZWNlaXZpbmcgZnJvbSBhIGNoYW5uZWwKLSAgICAjW2Vycm9yKCJFcnJvciByZWNlaXZpbmc6IHswfSIpXQotICAgIENoYW5uZWxSZWN2RXJyb3IoI1tmcm9tXSBSZWN2RXJyb3IpLAotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zdGFjay9zcmMvaGNpL2ZhY2FkZS5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2hjaS9mYWNhZGUucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTQ1ZDIuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zdGFjay9zcmMvaGNpL2ZhY2FkZS5ycworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLyEgSENJIGxheWVyIGZhY2FkZQotCi11c2UgY3JhdGU6OmhhbDo6e0FjbEhhbCwgSXNvSGFsLCBTY29IYWx9OwotdXNlIGNyYXRlOjpoY2k6OntFdmVudFJlZ2lzdHJ5LCBSYXdDb21tYW5kU2VuZGVyfTsKLXVzZSBidF9jb21tb246OkdycGNGYWNhZGU7Ci11c2UgYnRfZmFjYWRlX2hlbHBlcnM6OlJ4QWRhcHRlcjsKLXVzZSBidF9mYWNhZGVfcHJvdG86OmNvbW1vbjo6RGF0YTsKLXVzZSBidF9mYWNhZGVfcHJvdG86OmVtcHR5OjpFbXB0eTsKLXVzZSBidF9mYWNhZGVfcHJvdG86OmhjaV9mYWNhZGU6OkV2ZW50UmVxdWVzdDsKLXVzZSBidF9mYWNhZGVfcHJvdG86OmhjaV9mYWNhZGVfZ3JwYzo6e2NyZWF0ZV9oY2lfZmFjYWRlLCBIY2lGYWNhZGV9OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6ewotICAgIEFjbFBhY2tldCwgQ29tbWFuZFBhY2tldCwgRXZlbnRDb2RlLCBFdmVudFBhY2tldCwgSXNvUGFja2V0LCBMZU1ldGFFdmVudFBhY2tldCwgU2NvUGFja2V0LAotICAgIFN1YmV2ZW50Q29kZSwKLX07Ci11c2UgZ2RkaTo6e21vZHVsZSwgcHJvdmlkZXMsIFN0b3BwYWJsZX07Ci11c2UgZ3JwY2lvOjoqOwotdXNlIG51bV90cmFpdHM6OkZyb21QcmltaXRpdmU7Ci11c2UgdG9raW86OnN5bmM6Om1wc2M6OntjaGFubmVsLCBTZW5kZXJ9OwotCi1tb2R1bGUhIHsKLSAgICBmYWNhZGVfbW9kdWxlLAotICAgIHByb3ZpZGVycyB7Ci0gICAgICAgIEhjaUZhY2FkZVNlcnZpY2UgPT4gcHJvdmlkZV9mYWNhZGUsCi0gICAgfQotfQotCi0jW3Byb3ZpZGVzXQotYXN5bmMgZm4gcHJvdmlkZV9mYWNhZGUoCi0gICAgY29tbWFuZHM6IFJhd0NvbW1hbmRTZW5kZXIsCi0gICAgZXZlbnRzOiBFdmVudFJlZ2lzdHJ5LAotICAgIGFjbDogQWNsSGFsLAotICAgIHNjbzogU2NvSGFsLAotICAgIGlzbzogSXNvSGFsLAotKSAtPiBIY2lGYWNhZGVTZXJ2aWNlIHsKLSAgICBsZXQgKGV2dF90eCwgZXZ0X3J4KSA9IGNoYW5uZWw6OjxFdmVudFBhY2tldD4oMTApOwotICAgIGxldCAobGVfZXZ0X3R4LCBsZV9ldnRfcngpID0gY2hhbm5lbDo6PExlTWV0YUV2ZW50UGFja2V0PigxMCk7Ci0gICAgSGNpRmFjYWRlU2VydmljZSB7Ci0gICAgICAgIGNvbW1hbmRzLAotICAgICAgICBldmVudHMsCi0gICAgICAgIGV2dF90eCwKLSAgICAgICAgZXZ0X3J4OiBSeEFkYXB0ZXI6Om5ldyhldnRfcngpLAotICAgICAgICBsZV9ldnRfdHgsCi0gICAgICAgIGxlX2V2dF9yeDogUnhBZGFwdGVyOjpuZXcobGVfZXZ0X3J4KSwKLSAgICAgICAgYWNsX3R4OiBhY2wudHgsCi0gICAgICAgIGFjbF9yeDogUnhBZGFwdGVyOjpmcm9tX2FyYyhhY2wucngpLAotICAgICAgICBzY29fdHg6IHNjby50eCwKLSAgICAgICAgc2NvX3J4OiBSeEFkYXB0ZXI6OmZyb21fYXJjKHNjby5yeCksCi0gICAgICAgIGlzb190eDogaXNvLnR4LAotICAgICAgICBpc29fcng6IFJ4QWRhcHRlcjo6ZnJvbV9hcmMoaXNvLnJ4KSwKLSAgICB9Ci19Ci0KLS8vLyBIQ0kgbGF5ZXIgZmFjYWRlIHNlcnZpY2UKLSNbYWxsb3cobWlzc2luZ19kb2NzKV0KLSNbZGVyaXZlKENsb25lLCBTdG9wcGFibGUpXQotcHViIHN0cnVjdCBIY2lGYWNhZGVTZXJ2aWNlIHsKLSAgICBwdWIgY29tbWFuZHM6IFJhd0NvbW1hbmRTZW5kZXIsCi0gICAgZXZlbnRzOiBFdmVudFJlZ2lzdHJ5LAotICAgIGV2dF90eDogU2VuZGVyPEV2ZW50UGFja2V0PiwKLSAgICBwdWIgZXZ0X3J4OiBSeEFkYXB0ZXI8RXZlbnRQYWNrZXQ+LAotICAgIGxlX2V2dF90eDogU2VuZGVyPExlTWV0YUV2ZW50UGFja2V0PiwKLSAgICBwdWIgbGVfZXZ0X3J4OiBSeEFkYXB0ZXI8TGVNZXRhRXZlbnRQYWNrZXQ+LAotICAgIHB1YiBhY2xfdHg6IFNlbmRlcjxBY2xQYWNrZXQ+LAotICAgIHB1YiBhY2xfcng6IFJ4QWRhcHRlcjxBY2xQYWNrZXQ+LAotICAgIHB1YiBzY29fdHg6IFNlbmRlcjxTY29QYWNrZXQ+LAotICAgIHB1YiBzY29fcng6IFJ4QWRhcHRlcjxTY29QYWNrZXQ+LAotICAgIHB1YiBpc29fdHg6IFNlbmRlcjxJc29QYWNrZXQ+LAotICAgIHB1YiBpc29fcng6IFJ4QWRhcHRlcjxJc29QYWNrZXQ+LAotfQotCi1pbXBsIEhjaUZhY2FkZVNlcnZpY2UgewotICAgIC8vLyBSZWdpc3RlciBmb3IgdGhlIGV2ZW50ICYgcGx1ZyBpbiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlbSBiYWNrIG9uCi0gICAgcHViIGFzeW5jIGZuIHJlZ2lzdGVyX2V2ZW50KCZtdXQgc2VsZiwgY29kZTogdTMyKSB7Ci0gICAgICAgIHNlbGYuZXZlbnRzLnJlZ2lzdGVyKEV2ZW50Q29kZTo6ZnJvbV91MzIoY29kZSkudW53cmFwKCksIHNlbGYuZXZ0X3R4LmNsb25lKCkpLmF3YWl0OwotICAgIH0KLQotICAgIC8vLyBSZWdpc3RlciBmb3IgdGhlIGxlIGV2ZW50ICYgcGx1ZyBpbiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlbSBiYWNrIG9uCi0gICAgcHViIGFzeW5jIGZuIHJlZ2lzdGVyX2xlX2V2ZW50KCZtdXQgc2VsZiwgY29kZTogdTMyKSB7Ci0gICAgICAgIHNlbGYuZXZlbnRzCi0gICAgICAgICAgICAucmVnaXN0ZXJfbGUoU3ViZXZlbnRDb2RlOjpmcm9tX3UzMihjb2RlKS51bndyYXAoKSwgc2VsZi5sZV9ldnRfdHguY2xvbmUoKSkKLSAgICAgICAgICAgIC5hd2FpdDsKLSAgICB9Ci19Ci0KLWltcGwgR3JwY0ZhY2FkZSBmb3IgSGNpRmFjYWRlU2VydmljZSB7Ci0gICAgZm4gaW50b19ncnBjKHNlbGYpIC0+IGdycGNpbzo6U2VydmljZSB7Ci0gICAgICAgIGNyZWF0ZV9oY2lfZmFjYWRlKHNlbGYpCi0gICAgfQotfQotCi1pbXBsIEhjaUZhY2FkZSBmb3IgSGNpRmFjYWRlU2VydmljZSB7Ci0gICAgZm4gc2VuZF9jb21tYW5kKCZtdXQgc2VsZiwgY3R4OiBScGNDb250ZXh0PCdfPiwgbXV0IGRhdGE6IERhdGEsIHNpbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgbGV0IHBhY2tldCA9IENvbW1hbmRQYWNrZXQ6OnBhcnNlKCZkYXRhLnRha2VfcGF5bG9hZCgpKS51bndyYXAoKTsKLSAgICAgICAgbGV0IG11dCBjb21tYW5kcyA9IHNlbGYuY29tbWFuZHMuY2xvbmUoKTsKLSAgICAgICAgbGV0IGV2dF90eCA9IHNlbGYuZXZ0X3R4LmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIHNpbmsuc3VjY2VzcyhFbXB0eTo6ZGVmYXVsdCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGNvbW1hbmRzLnNlbmQocGFja2V0KS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgIGV2dF90eC5zZW5kKHJlc3BvbnNlKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gcmVxdWVzdF9ldmVudCgmbXV0IHNlbGYsIGN0eDogUnBjQ29udGV4dDwnXz4sIHJlcTogRXZlbnRSZXF1ZXN0LCBzaW5rOiBVbmFyeVNpbms8RW1wdHk+KSB7Ci0gICAgICAgIGxldCBtdXQgY2xvbmUgPSBzZWxmLmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGNsb25lLnJlZ2lzdGVyX2V2ZW50KHJlcS5nZXRfY29kZSgpKS5hd2FpdDsKLSAgICAgICAgICAgIHNpbmsuc3VjY2VzcyhFbXB0eTo6ZGVmYXVsdCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZm4gcmVxdWVzdF9sZV9zdWJldmVudCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBjdHg6IFJwY0NvbnRleHQ8J18+LAotICAgICAgICByZXE6IEV2ZW50UmVxdWVzdCwKLSAgICAgICAgc2luazogVW5hcnlTaW5rPEVtcHR5PiwKLSAgICApIHsKLSAgICAgICAgbGV0IG11dCBjbG9uZSA9IHNlbGYuY2xvbmUoKTsKLSAgICAgICAgY3R4LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgY2xvbmUucmVnaXN0ZXJfbGVfZXZlbnQocmVxLmdldF9jb2RlKCkpLmF3YWl0OwotICAgICAgICAgICAgc2luay5zdWNjZXNzKEVtcHR5OjpkZWZhdWx0KCkpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBzZW5kX2FjbCgmbXV0IHNlbGYsIGN0eDogUnBjQ29udGV4dDwnXz4sIG11dCBwYWNrZXQ6IERhdGEsIHNpbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgbGV0IGFjbF90eCA9IHNlbGYuYWNsX3R4LmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGFjbF90eC5zZW5kKEFjbFBhY2tldDo6cGFyc2UoJnBhY2tldC50YWtlX3BheWxvYWQoKSkudW53cmFwKCkpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICAgICAgc2luay5zdWNjZXNzKEVtcHR5OjpkZWZhdWx0KCkpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBmbiBzdHJlYW1fZXZlbnRzKCZtdXQgc2VsZiwgY3R4OiBScGNDb250ZXh0PCdfPiwgX3JlcTogRW1wdHksIHNpbms6IFNlcnZlclN0cmVhbWluZ1Npbms8RGF0YT4pIHsKLSAgICAgICAgc2VsZi5ldnRfcnguc3RyZWFtX2dycGMoY3R4LCBzaW5rKTsKLSAgICB9Ci0KLSAgICBmbiBzdHJlYW1fbGVfc3ViZXZlbnRzKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGN0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF9yZXE6IEVtcHR5LAotICAgICAgICBzaW5rOiBTZXJ2ZXJTdHJlYW1pbmdTaW5rPERhdGE+LAotICAgICkgewotICAgICAgICBzZWxmLmxlX2V2dF9yeC5zdHJlYW1fZ3JwYyhjdHgsIHNpbmspOwotICAgIH0KLQotICAgIGZuIHN0cmVhbV9hY2woJm11dCBzZWxmLCBjdHg6IFJwY0NvbnRleHQ8J18+LCBfcmVxOiBFbXB0eSwgc2luazogU2VydmVyU3RyZWFtaW5nU2luazxEYXRhPikgewotICAgICAgICBzZWxmLmFjbF9yeC5zdHJlYW1fZ3JwYyhjdHgsIHNpbmspOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svc3JjL2hjaS9tb2QucnMgYi9nZC9ydXN0L3N0YWNrL3NyYy9oY2kvbW9kLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI0ZjJhLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc3RhY2svc3JjL2hjaS9tb2QucnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8hIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgKEhDSSkKLQotLy8vIEhDSSBjb250cm9sbGVyIGluZm8KLXB1YiBtb2QgY29udHJvbGxlcjsKLS8vLyBDb250cm9sbGVyIGZhY2FkZSBzZXJ2aWNlCi1wdWIgbW9kIGNvbnRyb2xsZXJfZmFjYWRlOwotLy8vIEhDSSBlcnJvcnMKLXB1YiBtb2QgZXJyb3I7Ci0vLy8gSENJIGxheWVyIGZhY2FkZSBzZXJ2aWNlCi1wdWIgbW9kIGZhY2FkZTsKLQotcHViIHVzZSBidF9wYWNrZXRzOjpjdXN0b21fdHlwZXM6OkFkZHJlc3M7Ci1wdWIgdXNlIGNvbnRyb2xsZXI6OkNvbnRyb2xsZXJFeHBvcnRzOwotCi11c2UgY3JhdGU6OmhhbDo6Q29udHJvbEhhbDsKLXVzZSBidF9jb21tb246OnRpbWU6OkFsYXJtOwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6RXZlbnRDaGlsZDo6ewotICAgIENvbW1hbmRDb21wbGV0ZSwgQ29tbWFuZFN0YXR1cywgTGVNZXRhRXZlbnQsIE1heFNsb3RzQ2hhbmdlLCBQYWdlU2NhblJlcGV0aXRpb25Nb2RlQ2hhbmdlLAotICAgIFZlbmRvclNwZWNpZmljRXZlbnQsCi19OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6ewotICAgIENvbW1hbmRFeHBlY3RhdGlvbnMsIENvbW1hbmRQYWNrZXQsIEVycm9yQ29kZSwgRXZlbnRDb2RlLCBFdmVudFBhY2tldCwgTGVNZXRhRXZlbnRQYWNrZXQsCi0gICAgUmVzZXRCdWlsZGVyLCBTdWJldmVudENvZGUsCi19OwotdXNlIGVycm9yOjpSZXN1bHQ7Ci11c2UgZ2RkaTo6e21vZHVsZSwgcGFydF9vdXQsIHByb3ZpZGVzLCBTdG9wcGFibGV9OwotdXNlIGxvZzo6ZXJyb3I7Ci11c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOwotdXNlIHRva2lvOjpydW50aW1lOjpSdW50aW1lOwotdXNlIHRva2lvOjpzZWxlY3Q7Ci11c2UgdG9raW86OnN5bmM6Om1wc2M6OntjaGFubmVsLCBSZWNlaXZlciwgU2VuZGVyfTsKLXVzZSB0b2tpbzo6c3luYzo6e29uZXNob3QsIE11dGV4fTsKLQotbW9kdWxlISB7Ci0gICAgaGNpX21vZHVsZSwKLSAgICBzdWJtb2R1bGVzIHsKLSAgICAgICAgZmFjYWRlOjpmYWNhZGVfbW9kdWxlLAotICAgICAgICBjb250cm9sbGVyX2ZhY2FkZTo6Y29udHJvbGxlcl9mYWNhZGVfbW9kdWxlLAotICAgICAgICBjb250cm9sbGVyOjpjb250cm9sbGVyX21vZHVsZSwKLSAgICB9LAotICAgIHByb3ZpZGVycyB7Ci0gICAgICAgIHBhcnRzIEhjaSA9PiBwcm92aWRlX2hjaSwKLSAgICB9LAotfQotCi0jW3BhcnRfb3V0XQotI1tkZXJpdmUoQ2xvbmUsIFN0b3BwYWJsZSldCi1zdHJ1Y3QgSGNpIHsKLSAgICByYXdfY29tbWFuZHM6IFJhd0NvbW1hbmRTZW5kZXIsCi0gICAgY29tbWFuZHM6IENvbW1hbmRTZW5kZXIsCi0gICAgZXZlbnRzOiBFdmVudFJlZ2lzdHJ5LAotfQotCi0jW3Byb3ZpZGVzXQotYXN5bmMgZm4gcHJvdmlkZV9oY2koY29udHJvbDogQ29udHJvbEhhbCwgcnQ6IEFyYzxSdW50aW1lPikgLT4gSGNpIHsKLSAgICBsZXQgKGNtZF90eCwgY21kX3J4KSA9IGNoYW5uZWw6OjxRdWV1ZWRDb21tYW5kPigxMCk7Ci0gICAgbGV0IGV2dF9oYW5kbGVycyA9IEFyYzo6bmV3KE11dGV4OjpuZXcoSGFzaE1hcDo6bmV3KCkpKTsKLSAgICBsZXQgbGVfZXZ0X2hhbmRsZXJzID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhIYXNoTWFwOjpuZXcoKSkpOwotCi0gICAgcnQuc3Bhd24oZGlzcGF0Y2goCi0gICAgICAgIGV2dF9oYW5kbGVycy5jbG9uZSgpLAotICAgICAgICBsZV9ldnRfaGFuZGxlcnMuY2xvbmUoKSwKLSAgICAgICAgY29udHJvbC5yeCwKLSAgICAgICAgY29udHJvbC50eCwKLSAgICAgICAgY21kX3J4LAotICAgICkpOwotCi0gICAgbGV0IHJhd19jb21tYW5kcyA9IFJhd0NvbW1hbmRTZW5kZXIgeyBjbWRfdHggfTsKLSAgICBsZXQgbXV0IGNvbW1hbmRzID0gQ29tbWFuZFNlbmRlciB7IHJhdzogcmF3X2NvbW1hbmRzLmNsb25lKCkgfTsKLQotICAgIGFzc2VydCEoCi0gICAgICAgIGNvbW1hbmRzLnNlbmQoUmVzZXRCdWlsZGVyIHt9KS5hd2FpdC5nZXRfc3RhdHVzKCkgPT0gRXJyb3JDb2RlOjpTdWNjZXNzLAotICAgICAgICAicmVzZXQgZGlkIG5vdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHkiCi0gICAgKTsKLQotICAgIEhjaSB7IHJhd19jb21tYW5kcywgY29tbWFuZHMsIGV2ZW50czogRXZlbnRSZWdpc3RyeSB7IGV2dF9oYW5kbGVycywgbGVfZXZ0X2hhbmRsZXJzIH0gfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1zdHJ1Y3QgUXVldWVkQ29tbWFuZCB7Ci0gICAgY21kOiBDb21tYW5kUGFja2V0LAotICAgIGZ1dDogb25lc2hvdDo6U2VuZGVyPEV2ZW50UGFja2V0PiwKLX0KLQotLy8vIFNlbmRzIHJhdyBjb21tYW5kcy4gT25seSB1c2VmdWwgZm9yIGZhY2FkZXMgJiBzaGltcywgb3Igd3JhcHBlZCBhcyBhIENvbW1hbmRTZW5kZXIuCi0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLXB1YiBzdHJ1Y3QgUmF3Q29tbWFuZFNlbmRlciB7Ci0gICAgY21kX3R4OiBTZW5kZXI8UXVldWVkQ29tbWFuZD4sCi19Ci0KLWltcGwgUmF3Q29tbWFuZFNlbmRlciB7Ci0gICAgLy8vIFNlbmQgYSBjb21tYW5kLCBidXQgZG9lcyBub3QgYXV0b21hZ2ljYWxseSBhc3NvY2lhdGUgdGhlIGV4cGVjdGVkIHJldHVybmluZyBldmVudCB0eXBlLgotICAgIC8vLwotICAgIC8vLyBPbmx5IHJlYWxseSB1c2VmdWwgZm9yIGZhY2FkZXMgJiBzaGltcy4KLSAgICBwdWIgYXN5bmMgZm4gc2VuZCgmbXV0IHNlbGYsIGNtZDogQ29tbWFuZFBhY2tldCkgLT4gUmVzdWx0PEV2ZW50UGFja2V0PiB7Ci0gICAgICAgIGxldCAodHgsIHJ4KSA9IG9uZXNob3Q6OmNoYW5uZWw6OjxFdmVudFBhY2tldD4oKTsKLSAgICAgICAgc2VsZi5jbWRfdHguc2VuZChRdWV1ZWRDb21tYW5kIHsgY21kLCBmdXQ6IHR4IH0pLmF3YWl0PzsKLSAgICAgICAgbGV0IGV2ZW50ID0gcnguYXdhaXQ/OwotICAgICAgICBPayhldmVudCkKLSAgICB9Ci19Ci0KLS8vLyBTZW5kcyBjb21tYW5kcyB0byB0aGUgY29udHJvbGxlcgotI1tkZXJpdmUoQ2xvbmUsIFN0b3BwYWJsZSldCi1wdWIgc3RydWN0IENvbW1hbmRTZW5kZXIgewotICAgIHJhdzogUmF3Q29tbWFuZFNlbmRlciwKLX0KLQotaW1wbCBDb21tYW5kU2VuZGVyIHsKLSAgICAvLy8gU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIsIGdldHRpbmcgYW4gZXhwZWN0ZWQgcmVzcG9uc2UgYmFjawotICAgIHB1YiBhc3luYyBmbiBzZW5kPFQ6IEludG88Q29tbWFuZFBhY2tldD4gKyBDb21tYW5kRXhwZWN0YXRpb25zPigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBjbWQ6IFQsCi0gICAgKSAtPiBUOjpSZXNwb25zZVR5cGUgewotICAgICAgICBUOjpfdG9fcmVzcG9uc2VfdHlwZShzZWxmLnJhdy5zZW5kKGNtZC5pbnRvKCkpLmF3YWl0LnVud3JhcCgpKQotICAgIH0KLX0KLQotLy8vIFByb3ZpZGVzIGFiaWxpdHkgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgZm9yIEhDSSBldmVudHMKLSNbZGVyaXZlKENsb25lLCBTdG9wcGFibGUpXQotcHViIHN0cnVjdCBFdmVudFJlZ2lzdHJ5IHsKLSAgICBldnRfaGFuZGxlcnM6IEFyYzxNdXRleDxIYXNoTWFwPEV2ZW50Q29kZSwgU2VuZGVyPEV2ZW50UGFja2V0Pj4+PiwKLSAgICBsZV9ldnRfaGFuZGxlcnM6IEFyYzxNdXRleDxIYXNoTWFwPFN1YmV2ZW50Q29kZSwgU2VuZGVyPExlTWV0YUV2ZW50UGFja2V0Pj4+PiwKLX0KLQotaW1wbCBFdmVudFJlZ2lzdHJ5IHsKLSAgICAvLy8gSW5kaWNhdGUgaW50ZXJlc3QgaW4gc3BlY2lmaWMgSENJIGV2ZW50cwotICAgIHB1YiBhc3luYyBmbiByZWdpc3RlcigmbXV0IHNlbGYsIGNvZGU6IEV2ZW50Q29kZSwgc2VuZGVyOiBTZW5kZXI8RXZlbnRQYWNrZXQ+KSB7Ci0gICAgICAgIG1hdGNoIGNvZGUgewotICAgICAgICAgICAgRXZlbnRDb2RlOjpDb21tYW5kU3RhdHVzCi0gICAgICAgICAgICB8IEV2ZW50Q29kZTo6Q29tbWFuZENvbXBsZXRlCi0gICAgICAgICAgICB8IEV2ZW50Q29kZTo6TGVNZXRhRXZlbnQKLSAgICAgICAgICAgIHwgRXZlbnRDb2RlOjpQYWdlU2NhblJlcGV0aXRpb25Nb2RlQ2hhbmdlCi0gICAgICAgICAgICB8IEV2ZW50Q29kZTo6TWF4U2xvdHNDaGFuZ2UKLSAgICAgICAgICAgIHwgRXZlbnRDb2RlOjpWZW5kb3JTcGVjaWZpYyA9PiBwYW5pYyEoIns6P30gaXMgYSBwcm90ZWN0ZWQgZXZlbnQiLCBjb2RlKSwKLSAgICAgICAgICAgIF8gPT4gewotICAgICAgICAgICAgICAgIGFzc2VydCEoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZXZ0X2hhbmRsZXJzLmxvY2soKS5hd2FpdC5pbnNlcnQoY29kZSwgc2VuZGVyKS5pc19ub25lKCksCi0gICAgICAgICAgICAgICAgICAgICJBIGhhbmRsZXIgZm9yIHs6P30gaXMgYWxyZWFkeSByZWdpc3RlcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgY29kZQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gUmVtb3ZlIGludGVyZXN0IGluIHNwZWNpZmljIEhDSSBldmVudHMKLSAgICBwdWIgYXN5bmMgZm4gdW5yZWdpc3RlcigmbXV0IHNlbGYsIGNvZGU6IEV2ZW50Q29kZSkgewotICAgICAgICBzZWxmLmV2dF9oYW5kbGVycy5sb2NrKCkuYXdhaXQucmVtb3ZlKCZjb2RlKTsKLSAgICB9Ci0KLSAgICAvLy8gSW5kaWNhdGUgaW50ZXJlc3QgaW4gc3BlY2lmaWMgTEUgZXZlbnRzCi0gICAgcHViIGFzeW5jIGZuIHJlZ2lzdGVyX2xlKCZtdXQgc2VsZiwgY29kZTogU3ViZXZlbnRDb2RlLCBzZW5kZXI6IFNlbmRlcjxMZU1ldGFFdmVudFBhY2tldD4pIHsKLSAgICAgICAgYXNzZXJ0ISgKLSAgICAgICAgICAgIHNlbGYubGVfZXZ0X2hhbmRsZXJzLmxvY2soKS5hd2FpdC5pbnNlcnQoY29kZSwgc2VuZGVyKS5pc19ub25lKCksCi0gICAgICAgICAgICAiQSBoYW5kbGVyIGZvciB7Oj99IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCIsCi0gICAgICAgICAgICBjb2RlCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLy8vIFJlbW92ZSBpbnRlcmVzdCBpbiBzcGVjaWZpYyBMRSBldmVudHMKLSAgICBwdWIgYXN5bmMgZm4gdW5yZWdpc3Rlcl9sZSgmbXV0IHNlbGYsIGNvZGU6IFN1YmV2ZW50Q29kZSkgewotICAgICAgICBzZWxmLmxlX2V2dF9oYW5kbGVycy5sb2NrKCkuYXdhaXQucmVtb3ZlKCZjb2RlKTsKLSAgICB9Ci19Ci0KLWFzeW5jIGZuIGRpc3BhdGNoKAotICAgIGV2dF9oYW5kbGVyczogQXJjPE11dGV4PEhhc2hNYXA8RXZlbnRDb2RlLCBTZW5kZXI8RXZlbnRQYWNrZXQ+Pj4+LAotICAgIGxlX2V2dF9oYW5kbGVyczogQXJjPE11dGV4PEhhc2hNYXA8U3ViZXZlbnRDb2RlLCBTZW5kZXI8TGVNZXRhRXZlbnRQYWNrZXQ+Pj4+LAotICAgIGV2dF9yeDogQXJjPE11dGV4PFJlY2VpdmVyPEV2ZW50UGFja2V0Pj4+LAotICAgIGNtZF90eDogU2VuZGVyPENvbW1hbmRQYWNrZXQ+LAotICAgIG11dCBjbWRfcng6IFJlY2VpdmVyPFF1ZXVlZENvbW1hbmQ+LAotKSB7Ci0gICAgbGV0IG11dCBwZW5kaW5nOiBPcHRpb248UXVldWVkQ29tbWFuZD4gPSBOb25lOwotICAgIGxldCBoY2lfdGltZW91dCA9IEFsYXJtOjpuZXcoKTsKLSAgICBsb29wIHsKLSAgICAgICAgc2VsZWN0ISB7Ci0gICAgICAgICAgICBTb21lKGV2dCkgPSBjb25zdW1lKCZldnRfcngpID0+IHsKLSAgICAgICAgICAgICAgICBtYXRjaCBldnQuc3BlY2lhbGl6ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFN0YXR1cyhldnQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhjaV90aW1lb3V0LmNhbmNlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoaXNfb3Bjb2RlID0gZXZ0LmdldF9jb21tYW5kX29wX2NvZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBlbmRpbmcudGFrZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKFF1ZXVlZENvbW1hbmR7Y21kLCBmdXR9KSBpZiBjbWQuZ2V0X29wX2NvZGUoKSA9PSB0aGlzX29wY29kZSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldCBFcnIoZSkgPSBmdXQuc2VuZChldnQuaW50bygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciEoImZhaWx1cmUgZGlzcGF0Y2hpbmcgY29tbWFuZCBzdGF0dXMgezo/fSIsIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKFF1ZXVlZENvbW1hbmR7Y21kLCAuLn0pID0+IHBhbmljISgiV2FpdGluZyBmb3Ige30sIGdvdCB7fSIsIGNtZC5nZXRfb3BfY29kZSgpLCB0aGlzX29wY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBwYW5pYyEoIlVuZXhwZWN0ZWQgc3RhdHVzIGV2ZW50IHdpdGggb3Bjb2RlIHt9IiwgdGhpc19vcGNvZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kQ29tcGxldGUoZXZ0KSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoY2lfdGltZW91dC5jYW5jZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGlzX29wY29kZSA9IGV2dC5nZXRfY29tbWFuZF9vcF9jb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwZW5kaW5nLnRha2UoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShRdWV1ZWRDb21tYW5ke2NtZCwgZnV0fSkgaWYgY21kLmdldF9vcF9jb2RlKCkgPT0gdGhpc19vcGNvZGUgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gZnV0LnNlbmQoZXZ0LmludG8oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJmYWlsdXJlIGRpc3BhdGNoaW5nIGNvbW1hbmQgY29tcGxldGUgezo/fSIsIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKFF1ZXVlZENvbW1hbmR7Y21kLCAuLn0pID0+IHBhbmljISgiV2FpdGluZyBmb3Ige30sIGdvdCB7fSIsIGNtZC5nZXRfb3BfY29kZSgpLCB0aGlzX29wY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBwYW5pYyEoIlVuZXhwZWN0ZWQgY29tcGxldGUgZXZlbnQgd2l0aCBvcGNvZGUge30iLCB0aGlzX29wY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIExlTWV0YUV2ZW50KGV2dCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBldnQuZ2V0X3N1YmV2ZW50X2NvZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGxlX2V2dF9oYW5kbGVycy5sb2NrKCkuYXdhaXQuZ2V0KCZjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShzZW5kZXIpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV0IEVycihlKSA9IHNlbmRlci5zZW5kKGV2dCkuYXdhaXQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJsZSBtZXRhIGV2ZW50IGNoYW5uZWwgY2xvc2VkIHs6P30iLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBwYW5pYyEoIlVuaGFuZGxlZCBsZSBzdWJldmVudCB7Oj99IiwgY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGVDaGFuZ2UoXykgPT4ge30sCi0gICAgICAgICAgICAgICAgICAgIE1heFNsb3RzQ2hhbmdlKF8pID0+IHt9LAotICAgICAgICAgICAgICAgICAgICBWZW5kb3JTcGVjaWZpY0V2ZW50KF8pID0+IHt9LAotICAgICAgICAgICAgICAgICAgICBfID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gZXZ0LmdldF9ldmVudF9jb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBldnRfaGFuZGxlcnMubG9jaygpLmF3YWl0LmdldCgmY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUoc2VuZGVyKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldCBFcnIoZSkgPSBzZW5kZXIuc2VuZChldnQpLmF3YWl0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yISgiaGNpIGV2ZW50IGNoYW5uZWwgY2xvc2VkIHs6P30iLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSBpZiBjb2RlID09IEV2ZW50Q29kZTo6TnVtYmVyT2ZDb21wbGV0ZWRQYWNrZXRzID0+e30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBwYW5pYyEoIlVuaGFuZGxlZCBldmVudCB7Oj99IiwgY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIFNvbWUocXVldWVkKSA9IGNtZF9yeC5yZWN2KCksIGlmIHBlbmRpbmcuaXNfbm9uZSgpID0+IHsKLSAgICAgICAgICAgICAgICBpZiBsZXQgRXJyKGUpID0gY21kX3R4LnNlbmQocXVldWVkLmNtZC5jbG9uZSgpKS5hd2FpdCB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yISgiY29tbWFuZCBxdWV1ZSBjbG9zZWQ6IHs6P30iLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGNpX3RpbWVvdXQucmVzZXQoRHVyYXRpb246OmZyb21fc2VjcygyKSk7Ci0gICAgICAgICAgICAgICAgcGVuZGluZyA9IFNvbWUocXVldWVkKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBfID0gaGNpX3RpbWVvdXQuZXhwaXJlZCgpID0+IHBhbmljISgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHt9IiwgcGVuZGluZy51bndyYXAoKS5jbWQuZ2V0X29wX2NvZGUoKSksCi0gICAgICAgICAgICBlbHNlID0+IGJyZWFrLAotICAgICAgICB9Ci0gICAgfQotfQotCi1hc3luYyBmbiBjb25zdW1lKGV2dF9yeDogJkFyYzxNdXRleDxSZWNlaXZlcjxFdmVudFBhY2tldD4+PikgLT4gT3B0aW9uPEV2ZW50UGFja2V0PiB7Ci0gICAgZXZ0X3J4LmxvY2soKS5hd2FpdC5yZWN2KCkuYXdhaXQKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svc3JjL2xpYi5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2xpYi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhYjZlZi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9saWIucnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyEgTWFpbiBCVCBsaWZlY3ljbGUgc3VwcG9ydAotI1tjZmcodGFyZ2V0X29zID0gImFuZHJvaWQiKV0KLSNbbWFjcm9fdXNlXQotZXh0ZXJuIGNyYXRlIGxhenlfc3RhdGljOwotCi1wdWIgbW9kIGhhbDsKLXB1YiBtb2QgaGNpOwotcHViIG1vZCBsaW5rOwotCi11c2UgY3JhdGU6OmhhbDo6cm9vdGNhbmFsX2hhbDo6Um9vdGNhbmFsQ29uZmlnOwotdXNlIGNyYXRlOjpoYWw6OnNub29wOjp7U25vb3BDb25maWcsIFNub29wTW9kZX07Ci11c2UgYnRfY29tbW9uOjpHcnBjRmFjYWRlOwotdXNlIGdkZGk6Onttb2R1bGUsIFJlZ2lzdHJ5LCBSZWdpc3RyeUJ1aWxkZXIsIFN0b3BwYWJsZX07Ci11c2Ugc3RkOjpzeW5jOjpBcmM7Ci11c2UgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU7Ci0KLW1vZHVsZSEgewotICAgIHN0YWNrX21vZHVsZSwKLSAgICBzdWJtb2R1bGVzIHsKLSAgICAgICAgY3JhdGU6OmhhbDo6aGFsX21vZHVsZSwKLSAgICAgICAgY3JhdGU6OmhjaTo6aGNpX21vZHVsZSwKLSAgICB9Ci19Ci0KLS8vLyBDZW50cmFsIHN0YXRlIG1hbmFnZXIKLXB1YiBzdHJ1Y3QgU3RhY2sgewotICAgIHJlZ2lzdHJ5OiBBcmM8UmVnaXN0cnk+LAotICAgIHJ0OiBBcmM8UnVudGltZT4sCi19Ci0KLWltcGwgU3RhY2sgewotICAgIC8vLyBDb25zdHJ1Y3QgYSBuZXcgU3RhY2sKLSAgICBwdWIgYXN5bmMgZm4gbmV3KHJ0OiBBcmM8UnVudGltZT4pIC0+IFNlbGYgewotICAgICAgICBsZXQgcmVnaXN0cnkgPSBBcmM6Om5ldyhSZWdpc3RyeUJ1aWxkZXI6Om5ldygpLnJlZ2lzdGVyX21vZHVsZShzdGFja19tb2R1bGUpLmJ1aWxkKCkpOwotICAgICAgICByZWdpc3RyeS5pbmplY3QocnQuY2xvbmUoKSkuYXdhaXQ7Ci0KLSAgICAgICAgU2VsZiB7IHJlZ2lzdHJ5LCBydCB9Ci0gICAgfQotCi0gICAgLy8vIEhlbHBlciB0byBzZXQgdGhlIHJvb3RjYW5hbCBwb3J0Ci0gICAgcHViIGFzeW5jIGZuIHNldF9yb290Y2FuYWxfcG9ydCgmc2VsZiwgcG9ydDogT3B0aW9uPHUxNj4pIHsKLSAgICAgICAgaWYgbGV0IFNvbWUocG9ydCkgPSBwb3J0IHsKLSAgICAgICAgICAgIHNlbGYucmVnaXN0cnkuaW5qZWN0KFJvb3RjYW5hbENvbmZpZzo6bmV3KCIxMjcuMC4wLjEiLCBwb3J0KSkuYXdhaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gQ29uZmlndXJlcyBzbm9vcCB3aXRoIGRlZmF1bHRzCi0gICAgcHViIGFzeW5jIGZuIHVzZV9kZWZhdWx0X3Nub29wKCZzZWxmKSB7Ci0gICAgICAgIHNlbGYuY29uZmlndXJlX3Nub29wKE5vbmUpLmF3YWl0OwotICAgIH0KLQotICAgIC8vLyBDb25maWd1cmVzIHNub29wLiBJZiB0aGUgcGF0aCBpcyBwcm92aWRlZCwgZnVsbCBsb2dnaW5nIGlzIHR1cm5lZCBvbgotICAgIHB1YiBhc3luYyBmbiBjb25maWd1cmVfc25vb3AoJnNlbGYsIHBhdGg6IE9wdGlvbjxTdHJpbmc+KSB7Ci0gICAgICAgIGxldCBtdXQgY29uZmlnID0gU25vb3BDb25maWc6OmRlZmF1bHQoKTsKLSAgICAgICAgaWYgbGV0IFNvbWUocGF0aCkgPSBwYXRoIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRfcGF0aChwYXRoKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRfbW9kZShTbm9vcE1vZGU6OkZ1bGwpOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYucmVnaXN0cnkuaW5qZWN0KGNvbmZpZykuYXdhaXQ7Ci0gICAgfQotCi0gICAgLy8vIEhlbHBlciBmb3J3YXJkaW5nIHRvIHVuZGVybHlpbmcgcmVnaXN0cnkKLSAgICBwdWIgYXN5bmMgZm4gZ2V0PFQ6ICdzdGF0aWMgKyBDbG9uZSArIFNlbmQgKyBTeW5jICsgU3RvcHBhYmxlPigmc2VsZikgLT4gVCB7Ci0gICAgICAgIHNlbGYucmVnaXN0cnkuZ2V0Ojo8VD4oKS5hd2FpdAotICAgIH0KLQotICAgIC8vLyBHZXQsIGJ1dCBibG9ja3MgdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgIHB1YiBmbiBnZXRfYmxvY2tpbmc8VDogJ3N0YXRpYyArIENsb25lICsgU2VuZCArIFN5bmMgKyBTdG9wcGFibGU+KCZzZWxmKSAtPiBUIHsKLSAgICAgICAgc2VsZi5ydC5ibG9ja19vbihzZWxmLmdldDo6PFQ+KCkpCi0gICAgfQotCi0gICAgLy8vIEhlbHBlciB0byBnZXQgYSBncnBjIHNlcnZpY2UKLSAgICBwdWIgYXN5bmMgZm4gZ2V0X2dycGM8VDogJ3N0YXRpYyArIENsb25lICsgU2VuZCArIFN5bmMgKyBHcnBjRmFjYWRlICsgU3RvcHBhYmxlPigKLSAgICAgICAgJnNlbGYsCi0gICAgKSAtPiBncnBjaW86OlNlcnZpY2UgewotICAgICAgICBzZWxmLmdldDo6PFQ+KCkuYXdhaXQuaW50b19ncnBjKCkKLSAgICB9Ci0KLSAgICAvLy8gU3RvcCB0aGUgc3RhY2sKLSAgICBwdWIgYXN5bmMgZm4gc3RvcCgmbXV0IHNlbGYpIHsKLSAgICAgICAgc2VsZi5yZWdpc3RyeS5zdG9wX2FsbCgpLmF3YWl0OwotICAgIH0KLQotICAgIC8vLyBTdG9wLCBidXQgYmxvY2tzIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgICBwdWIgZm4gc3RvcF9ibG9ja2luZygmbXV0IHNlbGYpIHsKLSAgICAgICAgbGV0IHJ0ID0gc2VsZi5ydC5jbG9uZSgpOwotICAgICAgICBydC5ibG9ja19vbihzZWxmLnN0b3AoKSk7Ci0gICAgfQotCi0gICAgLy8vIEdldCBhIGNsb25lIG9mIHRoZSB1bmRlcmx5aW5nIHJ1bnRpbWUgZm9yIHRoaXMgc3RhY2sKLSAgICBwdWIgZm4gZ2V0X3J1bnRpbWUoJnNlbGYpIC0+IEFyYzxSdW50aW1lPiB7Ci0gICAgICAgIHNlbGYucnQuY2xvbmUoKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3Qvc3RhY2svc3JjL2xpbmsvYWNsL2NsYXNzaWMvZmFjYWRlLnJzIGIvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvY2xhc3NpYy9mYWNhZGUucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzQ5ZGEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvY2xhc3NpYy9mYWNhZGUucnMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLyEgQ2xhc3NpYyBBQ0wgZmFjYWRlCi0KLXVzZSBjcmF0ZTo6bGluazo6YWNsOjpjbGFzc2ljOjpBY2xNYW5hZ2VyOwotCi1tb2R1bGUhIHsKLSAgICBmYWNhZGVfbW9kdWxlLAotICAgIHByb3ZpZGVycyB7Ci0gICAgICAgIENsYXNzaWNBY2xGYWNhZGVTZXJ2aWNlID0+IHByb3ZpZGVfZmFjYWRlLAotICAgIH0KLX0KLQotI1twcm92aWRlc10KLWFzeW5jIGZuIHByb3ZpZGVfZmFjYWRlKGFjbDogQWNsTWFuYWdlcikgLT4gQ2xhc3NpY0FjbEZhY2FkZVNlcnZpY2UgewotICAgIENsYXNzaWNBY2xGYWNhZGVTZXJ2aWNlIHsgYWNsIH0KLX0KLQotcHViIHN0cnVjdCBDbGFzc2ljQWNsRmFjYWRlU2VydmljZSB7Ci0gICAgYWNsOiBBY2xNYW5hZ2VyLAotfQotCi1pbXBsIEFjbE1hbmFnZXJGYWNhZGUgZm9yIENsYXNzaWNBY2xGYWNhZGVTZXJ2aWNlIHsKLSAgICBmbiBjcmVhdGVfY29ubmVjdGlvbigKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfY3R4OiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgbXV0IF9kYXRhOiBDb25uZWN0aW9uTXNnLAotICAgICAgICBfc2luazogU2VydmVyU3RyZWFtaW5nU2luazxDb25uZWN0aW9uRXZlbnQ+LAotICAgICkgewotICAgICAgICB1bmltcGxlbWVudGVkISgpOwotICAgIH0KLQotICAgIGZuIGNhbmNlbF9jb25uZWN0aW9uKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIF9jdHg6IFJwY0NvbnRleHQ8J18+LAotICAgICAgICBtdXQgX2RhdGE6IENvbm5lY3Rpb25Nc2csCi0gICAgICAgIF9zaW5rOiBVbmFyeVNpbms8RW1wdHk+LAotICAgICkgewotICAgICAgICB1bmltcGxlbWVudGVkISgpOwotICAgIH0KLQotICAgIGZuIGRpc2Nvbm5lY3QoJm11dCBzZWxmLCBfY3R4OiBScGNDb250ZXh0PCdfPiwgbXV0IF9kYXRhOiBIYW5kbGVNc2csIF9zaW5rOiBVbmFyeVNpbms8RW1wdHk+KSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7Ci0gICAgfQotCi0gICAgZm4gZGlzY29ubmVjdCgmbXV0IHNlbGYsIF9jdHg6IFJwY0NvbnRleHQ8J18+LCBtdXQgX2RhdGE6IFBvbGljeU1zZywgX3Npbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKLSAgICB9Ci0KLSAgICBmbiBhdXRoZW50aWNhdGlvbl9yZXF1ZXN0ZWQoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgX2N0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIG11dCBfZGF0YTogSGFuZGxlTXNnLAotICAgICAgICBfc2luazogVW5hcnlTaW5rPEVtcHR5PiwKLSAgICApIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKLSAgICB9Ci0KLSAgICBmbiBjb25uZWN0aW9uX2NvbW1hbmQoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgX2N0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIG11dCBfZGF0YTogQ29ubmVjdGlvbkNvbW1hbmRNc2csCi0gICAgICAgIF9zaW5rOiBVbmFyeVNpbms8RW1wdHk+LAotICAgICkgewotICAgICAgICB1bmltcGxlbWVudGVkISgpOwotICAgIH0KLQotICAgIGZuIHN3aXRjaF9yb2xlKCZtdXQgc2VsZiwgX2N0eDogUnBjQ29udGV4dDwnXz4sIG11dCBfZGF0YTogUm9sZU1zZywgX3Npbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKLSAgICB9Ci0KLSAgICBmbiBzZW5kX2FjbF9kYXRhKCZtdXQgc2VsZiwgX2N0eDogUnBjQ29udGV4dDwnXz4sIG11dCBfZGF0YTogQWNsRGF0YSwgX3Npbms6IFVuYXJ5U2luazxFbXB0eT4pIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKLSAgICB9Ci0KLSAgICBmbiBmZXRjaF9hY2xfZGF0YSgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBfY3R4OiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgbXV0IF9kYXRhOiBIYW5kbGVNc2csCi0gICAgICAgIF9zaW5rOiBTZXJ2ZXJTdHJlYW1pbmdTaW5rPEFjbERhdGE+LAotICAgICkgewotICAgICAgICB1bmltcGxlbWVudGVkISgpOwotICAgIH0KLQotICAgIGZuIGZldGNoX2luY29taW5nX2Nvbm5lY3Rpb24oCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgX2N0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIG11dCBfZGF0YTogRW1wdHksCi0gICAgICAgIF9zaW5rOiBTZXJ2ZXJTdHJlYW1pbmdTaW5rPENvbm5lY3Rpb25FdmVudD4sCi0gICAgKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvY2xhc3NpYy9tb2QucnMgYi9nZC9ydXN0L3N0YWNrL3NyYy9saW5rL2FjbC9jbGFzc2ljL21vZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5OGQzMy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9saW5rL2FjbC9jbGFzc2ljL21vZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLyEgQ2xhc3NpYyBBQ0wgbWFuYWdlcgotCi11c2UgY3JhdGU6OmhjaTo6e0FkZHJlc3MsIENvbW1hbmRTZW5kZXIsIEV2ZW50UmVnaXN0cnl9OwotdXNlIGNyYXRlOjpsaW5rOjphY2w6OmNvcmU7Ci11c2UgYnRfY29tbW9uOjpCbHVldG9vdGg7Ci11c2UgYnRfcGFja2V0czo6aGNpOjpFdmVudENoaWxkOjp7Ci0gICAgQXV0aGVudGljYXRpb25Db21wbGV0ZSwgQ29ubmVjdGlvbkNvbXBsZXRlLCBEaXNjb25uZWN0aW9uQ29tcGxldGUsCi19OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6ewotICAgIEFjY2VwdENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlciwgQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlLCBDbG9ja09mZnNldFZhbGlkLAotICAgIENyZWF0ZUNvbm5lY3Rpb25CdWlsZGVyLCBDcmVhdGVDb25uZWN0aW9uQ2FuY2VsQnVpbGRlciwgQ3JlYXRlQ29ubmVjdGlvblJvbGVTd2l0Y2gsCi0gICAgRGlzY29ubmVjdEJ1aWxkZXIsIERpc2Nvbm5lY3RSZWFzb24sIEVycm9yQ29kZSwgRXZlbnRDaGlsZCwgRXZlbnRDb2RlLCBFdmVudFBhY2tldCwKLSAgICBQYWdlU2NhblJlcGV0aXRpb25Nb2RlLCBSZWplY3RDb25uZWN0aW9uUmVhc29uLCBSZWplY3RDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXIsIFJvbGUsCi19OwotdXNlIGJ5dGVzOjpCeXRlczsKLXVzZSBnZGRpOjp7bW9kdWxlLCBwcm92aWRlcywgU3RvcHBhYmxlfTsKLXVzZSBsb2c6Ondhcm47Ci11c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLXVzZSB0b2tpbzo6c2VsZWN0OwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjp7Y2hhbm5lbCwgUmVjZWl2ZXIsIFNlbmRlcn07Ci11c2UgdG9raW86OnN5bmM6OntvbmVzaG90LCBNdXRleH07Ci0KLW1vZHVsZSEgewotICAgIGNsYXNzaWNfYWNsX21vZHVsZSwKLSAgICBwcm92aWRlcnMgewotICAgICAgICBBY2xNYW5hZ2VyID0+IHByb3ZpZGVfYWNsX21hbmFnZXIsCi0gICAgfSwKLX0KLQotLy8vIENsYXNzaWMgQUNMIG1hbmFnZXIKLSNbZGVyaXZlKENsb25lLCBTdG9wcGFibGUpXQotcHViIHN0cnVjdCBBY2xNYW5hZ2VyIHsKLSAgICByZXFfdHg6IFNlbmRlcjxSZXF1ZXN0PiwKLSAgICAvLy8gSGlnaCBsZXZlbCBldmVudHMgZnJvbSBBY2xNYW5hZ2VyCi0gICAgcHViIGV2dF9yeDogQXJjPE11dGV4PFJlY2VpdmVyPEV2ZW50Pj4+LAotfQotCi0vLy8gRXZlbnRzIGdlbmVyYXRlZCBieSBBY2xNYW5hZ2VyCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgZW51bSBFdmVudCB7Ci0gICAgLy8vIENvbm5lY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgLSBwcm92aWRlcyB0aGUgbmV3bHkgY3JlYXRlZCBjb25uZWN0aW9uCi0gICAgQ29ubmVjdFN1Y2Nlc3MoQ29ubmVjdGlvbiksCi0gICAgLy8vIExvY2FsbHkgaW5pdGlhbHRlZCBjb25uZWN0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCAtIGluZGljYXRlcyBhZGRyZXNzICYgcmVhc29uCi0gICAgQ29ubmVjdEZhaWwgewotICAgICAgICAvLy8gQWRkcmVzcyBvZiB0aGUgZmFpbGVkIGNvbm5lY3Rpb24KLSAgICAgICAgYWRkcjogQWRkcmVzcywKLSAgICAgICAgLy8vIFJlYXNvbiBvZiB0aGUgZmFpbGVkIGNvbm5lY3Rpb24KLSAgICAgICAgcmVhc29uOiBFcnJvckNvZGUsCi0gICAgfSwKLX0KLQotLy8vIEEgY2xhc3NpYyBBQ0wgY29ubmVjdGlvbgotI1tkZXJpdmUoRGVidWcpXQotcHViIHN0cnVjdCBDb25uZWN0aW9uIHsKLSAgICBhZGRyOiBBZGRyZXNzLAotICAgIHJ4OiBSZWNlaXZlcjxCeXRlcz4sCi0gICAgdHg6IFNlbmRlcjxCeXRlcz4sCi0gICAgc2hhcmVkOiBBcmM8TXV0ZXg8Q29ubmVjdGlvblNoYXJlZD4+LAotICAgIHJlcXVlc3RzOiBTZW5kZXI8Q29ubmVjdGlvblJlcXVlc3Q+LAotICAgIGV2dF9yeDogUmVjZWl2ZXI8Q29ubmVjdGlvbkV2ZW50PiwKLX0KLQotLy8vIEV2ZW50cyBnZW5lcmF0ZWQgYnkgQ29ubmVjdGlvbgotI1tkZXJpdmUoRGVidWcpXQotcHViIGVudW0gQ29ubmVjdGlvbkV2ZW50IHsKLSAgICAvLy8gQ29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIHdpdGggdGhlIHNwZWNpZmllZCBjb2RlLgotICAgIERpc2Nvbm5lY3RlZChFcnJvckNvZGUpLAotICAgIC8vLyBDb25uZWN0aW9uIGF1dGhlbnRpY2F0aW9uIHdhcyBjb21wbGV0ZWQKLSAgICBBdXRoZW50aWNhdGlvbkNvbXBsZXRlLAotfQotCi1pbXBsIENvbm5lY3Rpb24gewotICAgIC8vLyBEaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCByZWFzb24uCi0gICAgcHViIGFzeW5jIGZuIGRpc2Nvbm5lY3QoJm11dCBzZWxmLCByZWFzb246IERpc2Nvbm5lY3RSZWFzb24pIHsKLSAgICAgICAgbGV0ICh0eCwgcngpID0gb25lc2hvdDo6Y2hhbm5lbCgpOwotICAgICAgICBzZWxmLnJlcXVlc3RzLnNlbmQoQ29ubmVjdGlvblJlcXVlc3Q6OkRpc2Nvbm5lY3QgeyByZWFzb24sIGZ1dDogdHggfSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIHJ4LmF3YWl0LnVud3JhcCgpCi0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1lbnVtIENvbm5lY3Rpb25SZXF1ZXN0IHsKLSAgICBEaXNjb25uZWN0IHsgcmVhc29uOiBEaXNjb25uZWN0UmVhc29uLCBmdXQ6IG9uZXNob3Q6OlNlbmRlcjwoKT4gfSwKLX0KLQotc3RydWN0IENvbm5lY3Rpb25JbnRlcm5hbCB7Ci0gICAgYWRkcjogQWRkcmVzcywKLSAgICAjW2FsbG93KGRlYWRfY29kZSldCi0gICAgc2hhcmVkOiBBcmM8TXV0ZXg8Q29ubmVjdGlvblNoYXJlZD4+LAotICAgIGhjaV9ldnRfdHg6IFNlbmRlcjxFdmVudFBhY2tldD4sCi19Ci0KLSNbZGVyaXZlKERlYnVnKV0KLXN0cnVjdCBDb25uZWN0aW9uU2hhcmVkIHsKLSAgICByb2xlOiBSb2xlLAotfQotCi1pbXBsIEFjbE1hbmFnZXIgewotICAgIC8vLyBDb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcywgb3IgcXVldWUgaXQgaWYgYSBjb25uZWN0aW9uIGlzIGFscmVhZHkgcGVuZGluZwotICAgIHB1YiBhc3luYyBmbiBjb25uZWN0KCZtdXQgc2VsZiwgYWRkcjogQWRkcmVzcykgewotICAgICAgICBzZWxmLnJlcV90eC5zZW5kKFJlcXVlc3Q6OkNvbm5lY3QgeyBhZGRyIH0pLmF3YWl0LnVud3JhcCgpOwotICAgIH0KLQotICAgIC8vLyBDYW5jZWwgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzLCBpZiBpdCBpcyBwZW5kaW5nCi0gICAgcHViIGFzeW5jIGZuIGNhbmNlbF9jb25uZWN0KCZtdXQgc2VsZiwgYWRkcjogQWRkcmVzcykgewotICAgICAgICBsZXQgKHR4LCByeCkgPSBvbmVzaG90OjpjaGFubmVsKCk7Ci0gICAgICAgIHNlbGYucmVxX3R4LnNlbmQoUmVxdWVzdDo6Q2FuY2VsQ29ubmVjdCB7IGFkZHIsIGZ1dDogdHggfSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIHJ4LmF3YWl0LnVud3JhcCgpOwotICAgIH0KLX0KLQotI1tkZXJpdmUoRGVidWcpXQotZW51bSBSZXF1ZXN0IHsKLSAgICBDb25uZWN0IHsgYWRkcjogQWRkcmVzcyB9LAotICAgIENhbmNlbENvbm5lY3QgeyBhZGRyOiBBZGRyZXNzLCBmdXQ6IG9uZXNob3Q6OlNlbmRlcjwoKT4gfSwKLX0KLQotI1tkZXJpdmUoRXEsIFBhcnRpYWxFcSldCi1lbnVtIFBlbmRpbmdDb25uZWN0IHsKLSAgICBPdXRnb2luZyhBZGRyZXNzKSwKLSAgICBJbmNvbWluZyhBZGRyZXNzKSwKLSAgICBOb25lLAotfQotCi1pbXBsIFBlbmRpbmdDb25uZWN0IHsKLSAgICBmbiB0YWtlKCZtdXQgc2VsZikgLT4gU2VsZiB7Ci0gICAgICAgIHN0ZDo6bWVtOjpyZXBsYWNlKHNlbGYsIFBlbmRpbmdDb25uZWN0OjpOb25lKQotICAgIH0KLX0KLQotI1twcm92aWRlc10KLWFzeW5jIGZuIHByb3ZpZGVfYWNsX21hbmFnZXIoCi0gICAgbXV0IGhjaTogQ29tbWFuZFNlbmRlciwKLSAgICBtdXQgZXZlbnRzOiBFdmVudFJlZ2lzdHJ5LAotICAgIG11dCBkaXNwYXRjaDogY29yZTo6QWNsRGlzcGF0Y2gsCi0gICAgcnQ6IEFyYzxSdW50aW1lPiwKLSkgLT4gQWNsTWFuYWdlciB7Ci0gICAgbGV0IChyZXFfdHgsIG11dCByZXFfcngpID0gY2hhbm5lbDo6PFJlcXVlc3Q+KDEwKTsKLSAgICBsZXQgKGNvbm5fZXZ0X3R4LCBjb25uX2V2dF9yeCkgPSBjaGFubmVsOjo8RXZlbnQ+KDEwKTsKLSAgICBsZXQgbG9jYWxfcnQgPSBydC5jbG9uZSgpOwotCi0gICAgbG9jYWxfcnQuc3Bhd24oYXN5bmMgbW92ZSB7Ci0gICAgICAgIGxldCBjb25uZWN0aW9uczogQXJjPE11dGV4PEhhc2hNYXA8dTE2LCBDb25uZWN0aW9uSW50ZXJuYWw+Pj4gPSBBcmM6Om5ldyhNdXRleDo6bmV3KEhhc2hNYXA6Om5ldygpKSk7Ci0gICAgICAgIGxldCBtdXQgY29ubmVjdF9xdWV1ZTogVmVjPEFkZHJlc3M+ID0gVmVjOjpuZXcoKTsKLSAgICAgICAgbGV0IG11dCBwZW5kaW5nID0gUGVuZGluZ0Nvbm5lY3Q6Ok5vbmU7Ci0KLSAgICAgICAgbGV0IChldnRfdHgsIG11dCBldnRfcngpID0gY2hhbm5lbCgzKTsKLSAgICAgICAgZXZlbnRzLnJlZ2lzdGVyKEV2ZW50Q29kZTo6Q29ubmVjdGlvbkNvbXBsZXRlLCBldnRfdHguY2xvbmUoKSkuYXdhaXQ7Ci0gICAgICAgIGV2ZW50cy5yZWdpc3RlcihFdmVudENvZGU6OkNvbm5lY3Rpb25SZXF1ZXN0LCBldnRfdHguY2xvbmUoKSkuYXdhaXQ7Ci0gICAgICAgIGV2ZW50cy5yZWdpc3RlcihFdmVudENvZGU6OkF1dGhlbnRpY2F0aW9uQ29tcGxldGUsIGV2dF90eCkuYXdhaXQ7Ci0KLSAgICAgICAgbG9vcCB7Ci0gICAgICAgICAgICBzZWxlY3QhIHsKLSAgICAgICAgICAgICAgICBTb21lKHJlcSkgPSByZXFfcngucmVjdigpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcmVxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3Q6OkNvbm5lY3QgeyBhZGRyIH0gPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb25zLmxvY2soKS5hd2FpdC52YWx1ZXMoKS5hbnkofGN8IGMuYWRkciA9PSBhZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4hKCJhbHJlYWR5IGNvbm5lY3RlZDoge30iLCBhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXQgUGVuZGluZ0Nvbm5lY3Q6Ok5vbmUgPSBwZW5kaW5nIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IFBlbmRpbmdDb25uZWN0OjpPdXRnb2luZyhhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpLnNlbmQoYnVpbGRfY3JlYXRlX2Nvbm5lY3Rpb24oYWRkcikpLmF3YWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcXVldWUuaW5zZXJ0KDAsIGFkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0OjpDYW5jZWxDb25uZWN0IHsgYWRkciwgZnV0IH0gPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcXVldWUucmV0YWluKHxwfCAqcCAhPSBhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwZW5kaW5nID09IFBlbmRpbmdDb25uZWN0OjpPdXRnb2luZyhhZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaS5zZW5kKENyZWF0ZUNvbm5lY3Rpb25DYW5jZWxCdWlsZGVyIHsgYmRfYWRkcjogYWRkciB9KS5hd2FpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0LnNlbmQoKCkpLnVud3JhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNvbWUoZXZ0KSA9IGV2dF9yeC5yZWN2KCkgPT4gewotICAgICAgICAgICAgICAgICAgICBtYXRjaCBldnQuc3BlY2lhbGl6ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25Db21wbGV0ZShldnQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkciA9IGV2dC5nZXRfYmRfYWRkcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSBldnQuZ2V0X3N0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYW5kbGUgPSBldnQuZ2V0X2Nvbm5lY3Rpb25faGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBtYXRjaCBwZW5kaW5nLnRha2UoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdDb25uZWN0OjpPdXRnb2luZyhhKSBpZiBhID09IGFkZHIgPT4gUm9sZTo6Q2VudHJhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0Nvbm5lY3Q6OkluY29taW5nKGEpIGlmIGEgPT0gYWRkciA9PiBSb2xlOjpQZXJpcGhlcmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfID0+IHBhbmljISgiTm8gcHJpb3IgY29ubmVjdGlvbiByZXF1ZXN0IGZvciB7fSIsIGFkZHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBzdGF0dXMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGU6OlN1Y2Nlc3MgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11dCBjb3JlX2Nvbm4gPSBkaXNwYXRjaC5yZWdpc3RlcihoYW5kbGUsIEJsdWV0b290aDo6Q2xhc3NpYykuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2hhcmVkID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhDb25uZWN0aW9uU2hhcmVkIHsgcm9sZSB9KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgKGV2dF90eCwgZXZ0X3J4KSA9IGNoYW5uZWwoMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChyZXFfdHgsIHJlcV9yeCkgPSBjaGFubmVsKDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQ6IHNoYXJlZC5jbG9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4OiBjb3JlX2Nvbm4ucngudGFrZSgpLnVud3JhcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4OiBjb3JlX2Nvbm4udHgudGFrZSgpLnVud3JhcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiByZXFfdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0X3J4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uX2ludGVybmFsID0gQ29ubmVjdGlvbkludGVybmFsIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfZXZ0X3R4OiBjb3JlX2Nvbm4uZXZ0X3R4LmNsb25lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQhKGNvbm5lY3Rpb25zLmxvY2soKS5hd2FpdC5pbnNlcnQoaGFuZGxlLCBjb25uZWN0aW9uX2ludGVybmFsKS5pc19ub25lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQuc3Bhd24ocnVuX2Nvbm5lY3Rpb24oaGFuZGxlLCBldnRfdHgsIHJlcV9yeCwgY29yZV9jb25uLCBjb25uZWN0aW9ucy5jbG9uZSgpLCBoY2kuY2xvbmUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9ldnRfdHguc2VuZChFdmVudDo6Q29ubmVjdFN1Y2Nlc3MoY29ubmVjdGlvbikpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfID0+IGNvbm5fZXZ0X3R4LnNlbmQoRXZlbnQ6OkNvbm5lY3RGYWlsIHsgYWRkciwgcmVhc29uOiBzdGF0dXMgfSkuYXdhaXQudW53cmFwKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50Q2hpbGQ6OkNvbm5lY3Rpb25SZXF1ZXN0KGV2dCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRyID0gZXZ0LmdldF9iZF9hZGRyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IFBlbmRpbmdDb25uZWN0OjpJbmNvbWluZyhhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9ucy5sb2NrKCkuYXdhaXQudmFsdWVzKCkuYW55KHxjfCBjLmFkZHIgPT0gYWRkcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2kuc2VuZChSZWplY3RDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXIgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkcjogYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogUmVqZWN0Q29ubmVjdGlvblJlYXNvbjo6VW5hY2NlcHRhYmxlQmRBZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmF3YWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaS5zZW5kKEFjY2VwdENvbm5lY3Rpb25SZXF1ZXN0QnVpbGRlciB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyOiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogQWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlOjpCZWNvbWVDZW50cmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmF3YWl0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbkNvbXBsZXRlKGUpID0+IGRpc3BhdGNoX3RvKGUuZ2V0X2Nvbm5lY3Rpb25faGFuZGxlKCksICZjb25uZWN0aW9ucywgZXZ0KS5hd2FpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF8gPT4gdW5pbXBsZW1lbnRlZCEoKSwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgQWNsTWFuYWdlciB7IHJlcV90eCwgZXZ0X3J4OiBBcmM6Om5ldyhNdXRleDo6bmV3KGNvbm5fZXZ0X3J4KSkgfQotfQotCi1mbiBidWlsZF9jcmVhdGVfY29ubmVjdGlvbihiZF9hZGRyOiBBZGRyZXNzKSAtPiBDcmVhdGVDb25uZWN0aW9uQnVpbGRlciB7Ci0gICAgQ3JlYXRlQ29ubmVjdGlvbkJ1aWxkZXIgewotICAgICAgICBiZF9hZGRyLAotICAgICAgICBwYWNrZXRfdHlwZTogMHg0NDA4IC8qIERNIDEsMyw1ICovIHwgMHg4ODEwLCAvKkRIIDEsMyw1ICovCi0gICAgICAgIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGU6IFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGU6OlIxLAotICAgICAgICBjbG9ja19vZmZzZXQ6IDAsCi0gICAgICAgIGNsb2NrX29mZnNldF92YWxpZDogQ2xvY2tPZmZzZXRWYWxpZDo6SW52YWxpZCwKLSAgICAgICAgYWxsb3dfcm9sZV9zd2l0Y2g6IENyZWF0ZUNvbm5lY3Rpb25Sb2xlU3dpdGNoOjpBbGxvd1JvbGVTd2l0Y2gsCi0gICAgfQotfQotCi1hc3luYyBmbiBkaXNwYXRjaF90bygKLSAgICBoYW5kbGU6IHUxNiwKLSAgICBjb25uZWN0aW9uczogJkFyYzxNdXRleDxIYXNoTWFwPHUxNiwgQ29ubmVjdGlvbkludGVybmFsPj4+LAotICAgIGV2ZW50OiBFdmVudFBhY2tldCwKLSkgewotICAgIGlmIGxldCBTb21lKGMpID0gY29ubmVjdGlvbnMubG9jaygpLmF3YWl0LmdldF9tdXQoJmhhbmRsZSkgewotICAgICAgICBjLmhjaV9ldnRfdHguc2VuZChldmVudCkuYXdhaXQudW53cmFwKCk7Ci0gICAgfQotfQotCi1hc3luYyBmbiBydW5fY29ubmVjdGlvbigKLSAgICBoYW5kbGU6IHUxNiwKLSAgICBldnRfdHg6IFNlbmRlcjxDb25uZWN0aW9uRXZlbnQ+LAotICAgIG11dCByZXFfcng6IFJlY2VpdmVyPENvbm5lY3Rpb25SZXF1ZXN0PiwKLSAgICBtdXQgY29yZTogY29yZTo6Q29ubmVjdGlvbiwKLSAgICBjb25uZWN0aW9uczogQXJjPE11dGV4PEhhc2hNYXA8dTE2LCBDb25uZWN0aW9uSW50ZXJuYWw+Pj4sCi0gICAgbXV0IGhjaTogQ29tbWFuZFNlbmRlciwKLSkgewotICAgIGxvb3AgewotICAgICAgICBzZWxlY3QhIHsKLSAgICAgICAgICAgIFNvbWUoZXZ0KSA9IGNvcmUuZXZ0X3J4LnJlY3YoKSA9PiB7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggZXZ0LnNwZWNpYWxpemUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpc2Nvbm5lY3Rpb25Db21wbGV0ZShldnQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLmxvY2soKS5hd2FpdC5yZW1vdmUoJmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldnRfdHguc2VuZChDb25uZWN0aW9uRXZlbnQ6OkRpc2Nvbm5lY3RlZChldnQuZ2V0X3JlYXNvbigpKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIEF0IHRoaXMgcG9pbnQsIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBydW4gb24gdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uQ29tcGxldGUoXykgPT4gZXZ0X3R4LnNlbmQoQ29ubmVjdGlvbkV2ZW50OjpBdXRoZW50aWNhdGlvbkNvbXBsZXRlKS5hd2FpdC51bndyYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgXyA9PiB1bmltcGxlbWVudGVkISgpLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBTb21lKHJlcSkgPSByZXFfcngucmVjdigpID0+IHsKLSAgICAgICAgICAgICAgICBtYXRjaCByZXEgewotICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVxdWVzdDo6RGlzY29ubmVjdHtyZWFzb24sIGZ1dH0gPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgaGNpLnNlbmQoRGlzY29ubmVjdEJ1aWxkZXIgeyBjb25uZWN0aW9uX2hhbmRsZTogaGFuZGxlLCByZWFzb24gfSkuYXdhaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdXQuc2VuZCgoKSkudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvY29yZS5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2xpbmsvYWNsL2NvcmUucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZWQ3OTEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvY29yZS5ycworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLyEgQUNMIGNvcmUgZGlzcGF0Y2ggc2hhcmVkIGJldHdlZW4gTEUgYW5kIGNsYXNzaWMKLQotdXNlIGNyYXRlOjpoYWw6OkFjbEhhbDsKLXVzZSBjcmF0ZTo6aGNpOjp7Q29udHJvbGxlckV4cG9ydHMsIEV2ZW50UmVnaXN0cnl9OwotdXNlIGNyYXRlOjpsaW5rOjphY2w6OmZyYWdtZW50Ojp7ZnJhZ21lbnRpbmdfc3RyZWFtLCBSZWFzc2VtYmxlcn07Ci11c2UgYnRfY29tbW9uOjpCbHVldG9vdGg6OntzZWxmLCBDbGFzc2ljLCBMZX07Ci11c2UgYnRfcGFja2V0czo6aGNpOjpFdmVudENoaWxkOjp7RGlzY29ubmVjdGlvbkNvbXBsZXRlLCBOdW1iZXJPZkNvbXBsZXRlZFBhY2tldHN9OwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6e0FjbFBhY2tldCwgRXZlbnRDb2RlLCBFdmVudFBhY2tldH07Ci11c2UgYnl0ZXM6OkJ5dGVzOwotdXNlIGZ1dHVyZXM6OnN0cmVhbTo6e1NlbGVjdEFsbCwgU3RyZWFtRXh0fTsKLXVzZSBnZGRpOjp7bW9kdWxlLCBwcm92aWRlcywgU3RvcHBhYmxlfTsKLXVzZSBsb2c6OmluZm87Ci11c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKLXVzZSBzdGQ6OnN5bmM6OkFyYzsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLXVzZSB0b2tpbzo6c2VsZWN0OwotdXNlIHRva2lvOjpzeW5jOjptcHNjOjp7Y2hhbm5lbCwgUmVjZWl2ZXIsIFNlbmRlcn07Ci11c2UgdG9raW86OnN5bmM6OntvbmVzaG90LCBNdXRleH07Ci11c2UgdG9raW9fc3RyZWFtOjp3cmFwcGVyczo6UmVjZWl2ZXJTdHJlYW07Ci0KLW1vZHVsZSEgewotICAgIGNvcmVfbW9kdWxlLAotICAgIHByb3ZpZGVycyB7Ci0gICAgICAgIEFjbERpc3BhdGNoID0+IHByb3ZpZGVfYWNsX2Rpc3BhdGNoLAotICAgIH0sCi19Ci0KLS8vLyBBIGJhc2ljIEFDTCBjb25uZWN0aW9uCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgc3RydWN0IENvbm5lY3Rpb24gewotICAgIHB1YiByeDogT3B0aW9uPFJlY2VpdmVyPEJ5dGVzPj4sCi0gICAgcHViIHR4OiBPcHRpb248U2VuZGVyPEJ5dGVzPj4sCi0gICAgaGFuZGxlOiB1MTYsCi0gICAgcmVxdWVzdHM6IFNlbmRlcjxSZXF1ZXN0PiwKLSAgICBwdWIgZXZ0X3J4OiBSZWNlaXZlcjxFdmVudFBhY2tldD4sCi0gICAgcHViIGV2dF90eDogU2VuZGVyPEV2ZW50UGFja2V0PiwKLX0KLQotc3RydWN0IENvbm5lY3Rpb25JbnRlcm5hbCB7Ci0gICAgcmVhc3NlbWJsZXI6IFJlYXNzZW1ibGVyLAotICAgIGJ0OiBCbHVldG9vdGgsCi0gICAgY2xvc2VfdHg6IG9uZXNob3Q6OlNlbmRlcjwoKT4sCi0gICAgZXZ0X3R4OiBTZW5kZXI8RXZlbnRQYWNrZXQ+LAotfQotCi0vLy8gTWFuYWdlcyByeCBhbmQgdHggZm9yIG9wZW4gQUNMIGNvbm5lY3Rpb25zCi0jW2Rlcml2ZShDbG9uZSwgU3RvcHBhYmxlKV0KLXB1YiBzdHJ1Y3QgQWNsRGlzcGF0Y2ggewotICAgIHJlcXVlc3RzOiBTZW5kZXI8UmVxdWVzdD4sCi19Ci0KLWltcGwgQWNsRGlzcGF0Y2ggewotICAgIC8vLyBSZWdpc3RlciB0aGUgcHJvdmlkZWQgY29ubmVjdGlvbiB3aXRoIHRoZSBBQ0wgZGlzcGF0Y2gKLSAgICAjW2FsbG93KGRlYWRfY29kZSldCi0gICAgcHViIGFzeW5jIGZuIHJlZ2lzdGVyKCZtdXQgc2VsZiwgaGFuZGxlOiB1MTYsIGJ0OiBCbHVldG9vdGgpIC0+IENvbm5lY3Rpb24gewotICAgICAgICBsZXQgKHR4LCByeCkgPSBvbmVzaG90OjpjaGFubmVsKCk7Ci0gICAgICAgIHNlbGYucmVxdWVzdHMuc2VuZChSZXF1ZXN0OjpSZWdpc3RlciB7IGhhbmRsZSwgYnQsIGZ1dDogdHggfSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIHJ4LmF3YWl0LnVud3JhcCgpCi0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1lbnVtIFJlcXVlc3QgewotICAgIFJlZ2lzdGVyIHsgaGFuZGxlOiB1MTYsIGJ0OiBCbHVldG9vdGgsIGZ1dDogb25lc2hvdDo6U2VuZGVyPENvbm5lY3Rpb24+IH0sCi19Ci0KLWNvbnN0IFFDT01fREVCVUdfSEFORExFOiB1MTYgPSAweGVkYzsKLQotI1twcm92aWRlc10KLWFzeW5jIGZuIHByb3ZpZGVfYWNsX2Rpc3BhdGNoKAotICAgIGFjbDogQWNsSGFsLAotICAgIGNvbnRyb2xsZXI6IEFyYzxDb250cm9sbGVyRXhwb3J0cz4sCi0gICAgbXV0IGV2ZW50czogRXZlbnRSZWdpc3RyeSwKLSAgICBydDogQXJjPFJ1bnRpbWU+LAotKSAtPiBBY2xEaXNwYXRjaCB7Ci0gICAgbGV0IChyZXFfdHgsIG11dCByZXFfcngpID0gY2hhbm5lbDo6PFJlcXVlc3Q+KDEwKTsKLSAgICBsZXQgcmVxX3R4X2Nsb25lID0gcmVxX3R4LmNsb25lKCk7Ci0KLSAgICBydC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgbGV0IG11dCBjb25uZWN0aW9uczogSGFzaE1hcDx1MTYsIENvbm5lY3Rpb25JbnRlcm5hbD4gPSBIYXNoTWFwOjpuZXcoKTsKLSAgICAgICAgbGV0IG11dCBjbGFzc2ljX291dGJvdW5kID0gU2VsZWN0QWxsOjpuZXcoKTsKLSAgICAgICAgbGV0IG11dCBjbGFzc2ljX2NyZWRpdHMgPSBjb250cm9sbGVyLmFjbF9idWZmZXJzOwotICAgICAgICBsZXQgbXV0IGxlX291dGJvdW5kID0gU2VsZWN0QWxsOjpuZXcoKTsKLSAgICAgICAgbGV0IG11dCBsZV9jcmVkaXRzOiB1MTYgPSBjb250cm9sbGVyLmxlX2J1ZmZlcnMuaW50bygpOwotCi0gICAgICAgIGxldCAoZXZ0X3R4LCBtdXQgZXZ0X3J4KSA9IGNoYW5uZWwoMyk7Ci0gICAgICAgIGV2ZW50cy5yZWdpc3RlcihFdmVudENvZGU6Ok51bWJlck9mQ29tcGxldGVkUGFja2V0cywgZXZ0X3R4LmNsb25lKCkpLmF3YWl0OwotICAgICAgICBldmVudHMucmVnaXN0ZXIoRXZlbnRDb2RlOjpEaXNjb25uZWN0aW9uQ29tcGxldGUsIGV2dF90eCkuYXdhaXQ7Ci0KLSAgICAgICAgbG9vcCB7Ci0gICAgICAgICAgICBzZWxlY3QhIHsKLSAgICAgICAgICAgICAgICBTb21lKHJlcSkgPSByZXFfcngucmVjdigpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcmVxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3Q6OlJlZ2lzdGVyIHsgaGFuZGxlLCBidCwgZnV0IH0gPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAob3V0X3R4LCBvdXRfcngpID0gY2hhbm5lbCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChpbl90eCwgaW5fcngpID0gY2hhbm5lbCgxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChldnRfdHgsIGV2dF9yeCkgPSBjaGFubmVsKDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAoY2xvc2VfdHgsIGNsb3NlX3J4KSA9IG9uZXNob3Q6OmNoYW5uZWwoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCEoY29ubmVjdGlvbnMuaW5zZXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JbnRlcm5hbCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzc2VtYmxlcjogUmVhc3NlbWJsZXI6Om5ldyhvdXRfdHgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV90eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dF90eDogZXZ0X3R4LmNsb25lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmlzX25vbmUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBidCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWMgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpY19vdXRib3VuZC5wdXNoKGZyYWdtZW50aW5nX3N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNlaXZlclN0cmVhbTo6bmV3KGluX3J4KSwgY29udHJvbGxlci5hY2xfYnVmZmVyX2xlbmd0aC5pbnRvKCksIGhhbmRsZSwgYnQsIGNsb3NlX3J4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlX291dGJvdW5kLnB1c2goZnJhZ21lbnRpbmdfc3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVyU3RyZWFtOjpuZXcoaW5fcngpLCBjb250cm9sbGVyLmxlX2J1ZmZlcl9sZW5ndGguaW50bygpLCBoYW5kbGUsIGJ0LCBjbG9zZV9yeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dC5zZW5kKENvbm5lY3Rpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeDogU29tZShvdXRfcngpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eDogU29tZShpbl90eCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHM6IHJlcV90eF9jbG9uZS5jbG9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnRfcngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dF90eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS51bndyYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIFNvbWUocCkgPSBjb25zdW1lKCZhY2wucngpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggY29ubmVjdGlvbnMuZ2V0X211dCgmcC5nZXRfaGFuZGxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUoYykgPT4gYy5yZWFzc2VtYmxlci5vbl9wYWNrZXQocCkuYXdhaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBOb25lIGlmIHAuZ2V0X2hhbmRsZSgpID09IFFDT01fREVCVUdfSEFORExFID0+IHt9LAotICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBpbmZvISgibm8gYWNsIGZvciB7fSIsIHAuZ2V0X2hhbmRsZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgU29tZShwKSA9IGNsYXNzaWNfb3V0Ym91bmQubmV4dCgpLCBpZiBjbGFzc2ljX2NyZWRpdHMgPiAwID0+IHsKLSAgICAgICAgICAgICAgICAgICAgYWNsLnR4LnNlbmQocCkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzaWNfY3JlZGl0cyAtPSAxOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgU29tZShwKSA9IGxlX291dGJvdW5kLm5leHQoKSwgaWYgbGVfY3JlZGl0cyA+IDAgPT4gewotICAgICAgICAgICAgICAgICAgICBhY2wudHguc2VuZChwKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVfY3JlZGl0cyAtPSAxOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgU29tZShldnQpID0gZXZ0X3J4LnJlY3YoKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoIGV2dC5zcGVjaWFsaXplKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZDb21wbGV0ZWRQYWNrZXRzKGV2dCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBldnQuZ2V0X2NvbXBsZXRlZF9wYWNrZXRzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBjb25uZWN0aW9ucy5nZXQoJmVudHJ5LmNvbm5lY3Rpb25faGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKGNvbm4pID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3JlZGl0cyA9IGVudHJ5Lmhvc3RfbnVtX29mX2NvbXBsZXRlZF9wYWNrZXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGNvbm4uYnQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2ljID0+IGNsYXNzaWNfY3JlZGl0cyArPSBjcmVkaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZSA9PiBsZV9jcmVkaXRzICs9IGNyZWRpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCEoY2xhc3NpY19jcmVkaXRzIDw9IGNvbnRyb2xsZXIuYWNsX2J1ZmZlcnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCEobGVfY3JlZGl0cyA8PSBjb250cm9sbGVyLmxlX2J1ZmZlcnMuaW50bygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IGluZm8hKCJkcm9wcGluZyBjcmVkaXRzIGZvciB1bmtub3duIGNvbm5lY3Rpb24ge30iLCBlbnRyeS5jb25uZWN0aW9uX2hhbmRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29ubmVjdGlvbkNvbXBsZXRlKGV2dCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKGMpID0gY29ubmVjdGlvbnMucmVtb3ZlKCZldnQuZ2V0X2Nvbm5lY3Rpb25faGFuZGxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5jbG9zZV90eC5zZW5kKCgpKS51bndyYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5ldnRfdHguc2VuZChldnQuaW50bygpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgXyA9PiB1bmltcGxlbWVudGVkISgpLAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgQWNsRGlzcGF0Y2ggeyByZXF1ZXN0czogcmVxX3R4IH0KLX0KLQotYXN5bmMgZm4gY29uc3VtZShyeDogJkFyYzxNdXRleDxSZWNlaXZlcjxBY2xQYWNrZXQ+Pj4pIC0+IE9wdGlvbjxBY2xQYWNrZXQ+IHsKLSAgICByeC5sb2NrKCkuYXdhaXQucmVjdigpLmF3YWl0Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3N0YWNrL3NyYy9saW5rL2FjbC9mcmFnbWVudC5ycyBiL2dkL3J1c3Qvc3RhY2svc3JjL2xpbmsvYWNsL2ZyYWdtZW50LnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTUyY2Q1Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc3RhY2svc3JjL2xpbmsvYWNsL2ZyYWdtZW50LnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vISBIYW5kbGVzIGZyYWdtZW50YXRpb24gJiByZWFzc2VtYmx5IG9mIEFDTCBwYWNrZXRzIGludG8gd2hvbGUgTDJDQVAgcGF5bG9hZHMKLQotdXNlIGJ0X2NvbW1vbjo6Qmx1ZXRvb3RoOwotdXNlIGJ0X3BhY2tldHM6OmhjaTo6UGFja2V0Qm91bmRhcnlGbGFnOjp7Ci0gICAgQ29udGludWluZ0ZyYWdtZW50LCBGaXJzdEF1dG9tYXRpY2FsbHlGbHVzaGFibGUsIEZpcnN0Tm9uQXV0b21hdGljYWxseUZsdXNoYWJsZSwKLX07Ci11c2UgYnRfcGFja2V0czo6aGNpOjp7QWNsQnVpbGRlciwgQWNsQ2hpbGQsIEFjbFBhY2tldCwgQnJvYWRjYXN0RmxhZ307Ci11c2UgYnl0ZXM6OntCdWYsIEJ5dGVzLCBCeXRlc011dH07Ci11c2UgZnV0dXJlczo6c3RyZWFtOjp7c2VsZiwgU3RyZWFtRXh0fTsKLXVzZSBsb2c6OntlcnJvciwgaW5mbywgd2Fybn07Ci11c2UgdG9raW86OnN5bmM6Om1wc2M6OlNlbmRlcjsKLXVzZSB0b2tpbzo6c3luYzo6b25lc2hvdDsKLXVzZSB0b2tpb19zdHJlYW06OndyYXBwZXJzOjpSZWNlaXZlclN0cmVhbTsKLQotY29uc3QgTDJDQVBfQkFTSUNfRlJBTUVfSEVBREVSX0xFTjogdXNpemUgPSA0OwotCi1wdWIgc3RydWN0IFJlYXNzZW1ibGVyIHsKLSAgICBidWZmZXI6IE9wdGlvbjxCeXRlc011dD4sCi0gICAgcmVtYWluaW5nOiB1c2l6ZSwKLSAgICBvdXQ6IFNlbmRlcjxCeXRlcz4sCi19Ci0KLWltcGwgUmVhc3NlbWJsZXIgewotICAgIC8vLyBDcmVhdGUgYSBuZXcgcmVhc3NlbWJsZXIKLSAgICBwdWIgZm4gbmV3KG91dDogU2VuZGVyPEJ5dGVzPikgLT4gU2VsZiB7Ci0gICAgICAgIFNlbGYgeyBidWZmZXI6IE5vbmUsIHJlbWFpbmluZzogMCwgb3V0IH0KLSAgICB9Ci0KLSAgICAvLy8gSW5qZXN0IHRoZSBwYWNrZXQgYW5kIHNlbmQgb3V0IGlmIGZ1bGx5IHJlYXNzZW1ibGVkCi0gICAgcHViIGFzeW5jIGZuIG9uX3BhY2tldCgmbXV0IHNlbGYsIHBhY2tldDogQWNsUGFja2V0KSB7Ci0gICAgICAgIGxldCBwYXlsb2FkID0gbWF0Y2ggcGFja2V0LnNwZWNpYWxpemUoKSB7Ci0gICAgICAgICAgICBBY2xDaGlsZDo6UGF5bG9hZChwYXlsb2FkKSA9PiBwYXlsb2FkLAotICAgICAgICAgICAgQWNsQ2hpbGQ6Ok5vbmUgPT4gewotICAgICAgICAgICAgICAgIGluZm8hKCJkcm9wcGluZyBBQ0wgcGFja2V0IHdpdGggZW1wdHkgcGF5bG9hZCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiBsZXQgQnJvYWRjYXN0RmxhZzo6QWN0aXZlUGVyaXBoZXJhbEJyb2FkY2FzdCA9IHBhY2tldC5nZXRfYnJvYWRjYXN0X2ZsYWcoKSB7Ci0gICAgICAgICAgICAvLyB3ZSBkbyBub3QgYWNjZXB0IGJyb2FkY2FzdCBwYWNrZXRzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtYXRjaCBwYWNrZXQuZ2V0X3BhY2tldF9ib3VuZGFyeV9mbGFnKCkgewotICAgICAgICAgICAgRmlyc3ROb25BdXRvbWF0aWNhbGx5Rmx1c2hhYmxlID0+IGVycm9yISgibm90IGFsbG93ZWQgdG8gc2VuZCBGSVJTVF9OT05fQVVUT01BVElDQUxMWV9GTFVTSEFCTEUgdG8gaG9zdCBleGNlcHQgbG9vcGJhY2sgbW9kZSIpLAotICAgICAgICAgICAgRmlyc3RBdXRvbWF0aWNhbGx5Rmx1c2hhYmxlID0+IHsKLSAgICAgICAgICAgICAgICBpZiBzZWxmLmJ1ZmZlci50YWtlKCkuaXNfc29tZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IhKCJnb3QgYSBzdGFydCBwYWNrZXQgd2l0aG91dCBmaW5pc2hpbmcgcHJldmlvdXMgcmVhc3NlbWJseSAtIGRyb3BwaW5nIHByZXZpb3VzIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGV0IGZ1bGxfc2l6ZSA9IGdldF9sMmNhcF9wZHVfc2l6ZSgmcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBmdWxsX3NpemUgLSAocGF5bG9hZC5sZW4oKSAtIEwyQ0FQX0JBU0lDX0ZSQU1FX0hFQURFUl9MRU4pOwotICAgICAgICAgICAgICAgIGlmIHNlbGYucmVtYWluaW5nID4gMCB7Ci0gICAgICAgICAgICAgICAgICAgIGxldCBtdXQgYnVmZmVyID0gQnl0ZXNNdXQ6OndpdGhfY2FwYWNpdHkoZnVsbF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmV4dGVuZF9mcm9tX3NsaWNlKCZwYXlsb2FkWy4uXSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gU29tZShidWZmZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYub3V0LnNlbmQocGF5bG9hZCkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIENvbnRpbnVpbmdGcmFnbWVudCA9PiB7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggc2VsZi5idWZmZXIudGFrZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB3YXJuISgiZ290IGNvbnRpbnVhdGlvbiBwYWNrZXQgd2l0aG91dCBwZW5kaW5nIHJlYXNzZW1ibHkiKSwKLSAgICAgICAgICAgICAgICAgICAgU29tZShfKSBpZiBzZWxmLnJlbWFpbmluZyA8IHBheWxvYWQubGVuKCkgPT4gd2FybiEoInJlbW90ZSBzZW50IHVuZXhwZWN0ZWQgTDJDQVAgUERVIC0gZHJvcHBpbmcgZW50aXJlIHBhY2tldCIpLAotICAgICAgICAgICAgICAgICAgICBTb21lKG11dCBidWZmZXIpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtYWluaW5nIC09IHBheWxvYWQubGVuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZXh0ZW5kX2Zyb21fc2xpY2UoJnBheWxvYWRbLi5dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucmVtYWluaW5nID09IDAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0LnNlbmQoYnVmZmVyLmZyZWV6ZSgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBTb21lKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICB9Ci0gICAgfQotfQotCi1mbiBnZXRfbDJjYXBfcGR1X3NpemUoZmlyc3RfcGFja2V0OiAmQnl0ZXMpIC0+IHVzaXplIHsKLSAgICBpZiBmaXJzdF9wYWNrZXQubGVuKCkgPD0gTDJDQVBfQkFTSUNfRlJBTUVfSEVBREVSX0xFTiB7Ci0gICAgICAgIGVycm9yISgiaW52YWxpZCBsMmNhcCBzdGFydGluZyBwYWNrZXQiKTsKLQotICAgICAgICAwCi0gICAgfSBlbHNlIHsKLSAgICAgICAgKCZmaXJzdF9wYWNrZXRbLi5dKS5nZXRfdTE2X2xlKCkgYXMgdXNpemUKLSAgICB9Ci19Ci0KLXB1YiBmbiBmcmFnbWVudGluZ19zdHJlYW0oCi0gICAgcng6IFJlY2VpdmVyU3RyZWFtPEJ5dGVzPiwKLSAgICBtdHU6IHVzaXplLAotICAgIGhhbmRsZTogdTE2LAotICAgIGJ0OiBCbHVldG9vdGgsCi0gICAgY2xvc2Vfcng6IG9uZXNob3Q6OlJlY2VpdmVyPCgpPiwKLSkgLT4gc3RkOjpwaW46OlBpbjwKLSAgICBzdGQ6OmJveGVkOjpCb3g8ZHluIGZ1dHVyZXM6OlN0cmVhbTxJdGVtID0gYnRfcGFja2V0czo6aGNpOjpBY2xQYWNrZXQ+ICsgc3RkOjptYXJrZXI6OlNlbmQ+LAotPiB7Ci0gICAgcnguZmxhdF9tYXAobW92ZSB8ZGF0YXwgewotICAgICAgICBzdHJlYW06Oml0ZXIoCi0gICAgICAgICAgICBkYXRhLmNodW5rcyhtdHUpCi0gICAgICAgICAgICAgICAgLmVudW1lcmF0ZSgpCi0gICAgICAgICAgICAgICAgLm1hcChtb3ZlIHwoaSwgY2h1bmspfCB7Ci0gICAgICAgICAgICAgICAgICAgIEFjbEJ1aWxkZXIgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2JvdW5kYXJ5X2ZsYWc6IG1hdGNoIGJ0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGg6OkNsYXNzaWMgaWYgaSA9PSAwID0+IEZpcnN0QXV0b21hdGljYWxseUZsdXNoYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGg6OkxlIGlmIGkgPT0gMCA9PiBGaXJzdE5vbkF1dG9tYXRpY2FsbHlGbHVzaGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXyA9PiBDb250aW51aW5nRnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2ZsYWc6IEJyb2FkY2FzdEZsYWc6OlBvaW50VG9Qb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IFNvbWUoQnl0ZXM6OmNvcHlfZnJvbV9zbGljZShjaHVuaykpLAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxBY2xQYWNrZXQ+PigpLAotICAgICAgICApCi0gICAgfSkKLSAgICAudGFrZV91bnRpbChjbG9zZV9yeCkKLSAgICAuYm94ZWQoKQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvbW9kLnJzIGIvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9hY2wvbW9kLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDEzNDUxLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3Qvc3RhY2svc3JjL2xpbmsvYWNsL21vZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8vISBBQ0wgbWFuYWdlbWVudAotCi0vLy8gRXhwb3NlcyBjbGFzc2ljIEFDTCBmdW5jdGlvbmFsaXR5Ci1wdWIgbW9kIGNsYXNzaWM7Ci1tb2QgY29yZTsKLW1vZCBmcmFnbWVudDsKLQotdXNlIGdkZGk6Om1vZHVsZTsKLQotbW9kdWxlISB7Ci0gICAgYWNsX21vZHVsZSwKLSAgICBzdWJtb2R1bGVzIHsKLSAgICAgICAgY2xhc3NpYzo6Y2xhc3NpY19hY2xfbW9kdWxlLAotICAgICAgICBjb3JlOjpjb3JlX21vZHVsZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC9zdGFjay9zcmMvbGluay9tb2QucnMgYi9nZC9ydXN0L3N0YWNrL3NyYy9saW5rL21vZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1NTM0NC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3N0YWNrL3NyYy9saW5rL21vZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8vISBsaW5rIG1hbmFnZW1lbnQKLQotLy8vIEV4cG9zZXMgQUNMIGZ1bmN0aW9uYWxpdHkKLXB1YiBtb2QgYWNsOwotCi11c2UgZ2RkaTo6bW9kdWxlOwotCi1tb2R1bGUhIHsKLSAgICBsaW5rX21vZHVsZSwKLSAgICBzdWJtb2R1bGVzIHsKLSAgICAgICAgYWNsOjphY2xfbW9kdWxlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vQW5kcm9pZC5icCBiL2dkL3J1c3QvdG9wc2hpbS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk2NzdlLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLXJ1c3RfbGlicmFyeV9ob3N0X3JsaWIgewotICAgIG5hbWU6ICJsaWJidF90b3BzaGltIiwKLSAgICBkZWZhdWx0czogWyJnZF9ydXN0X2RlZmF1bHRzIl0sCi0gICAgY3JhdGVfbmFtZTogImJ0X3RvcHNoaW0iLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9saWIucnMiLAotICAgICAgICAiOmxpYmJ0X3RvcHNoaW1fd3JhcHBlcl9iaW5kZ2VuIiwKLSAgICBdLAotICAgIHJ1c3RsaWJzOiBbCi0gICAgICAgICJsaWJiaXRmbGFncyIsCi0gICAgICAgICJsaWJibHVldG9vdGhfcnMiLAotICAgICAgICAibGliYnRfY29tbW9uIiwKLSAgICAgICAgImxpYmJ0X2ZhY2FkZV9oZWxwZXJzIiwKLSAgICAgICAgImxpYmNsYXAiLAotICAgICAgICAibGliY3h4IiwKLSAgICAgICAgImxpYmdycGNpbyIsCi0gICAgICAgICJsaWJ0b2tpbyIsCi0gICAgICAgICJsaWJ0b2tpb19zdHJlYW0iLAotICAgICAgICAibGliYnRfcGFja2V0cyIsCi0gICAgICAgICJsaWJmdXR1cmVzIiwKLSAgICAgICAgImxpYm51bV90cmFpdHMiLAotICAgICAgICAibGlibml4IiwKLSAgICAgICAgImxpYmxvZ19ydXN0IiwKLSAgICBdLAotICAgIHByb2NfbWFjcm9zOiBbCi0gICAgICAgICJsaWJudW1fZGVyaXZlIiwKLSAgICAgICAgImxpYnBhc3RlIiwKLSAgICAgICAgImxpYnRvcHNoaW1fbWFjcm9zIiwKLSAgICBdLAotICAgIGxpbnRzOiAibm9uZSIsCi0gICAgY2xpcHB5X2xpbnRzOiAibm9uZSIsCi19Ci0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidF90b3BzaGltX2N4eCIsCi0gICAgZGVmYXVsdHM6IFsiZ2RfZmZpX2RlZmF1bHRzIl0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYnRfY2FsbGJhY2tzX2N4eF9oZWFkZXJzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiYnRhdi9idGF2X3NoaW0uY2MiLAotICAgICAgICAiYnRhdl9zaW5rL2J0YXZfc2lua19zaGltLmNjIiwKLSAgICAgICAgImJ0aWYvYnRpZl9zaGltLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF9zaGltLmNjIiwKLSAgICAgICAgImhmcC9oZnBfc2hpbS5jYyIsCi0gICAgICAgICJjb250cm9sbGVyL2NvbnRyb2xsZXJfc2hpbS5jYyIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWyJsaWJidF90b3BzaGltX2JyaWRnZV9oZWFkZXIiLCAiY3h4LWJyaWRnZS1oZWFkZXIiXSwKLSAgICBnZW5lcmF0ZWRfc291cmNlczogWyJsaWJidF90b3BzaGltX2JyaWRnZV9jb2RlIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNocm9tZSIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QvcnVzdC90b3BzaGltIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC90eXBlcyIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotZ2Vuc3JjcyB7Ci0gICAgbmFtZTogImxpYmJ0X3RvcHNoaW1fYnJpZGdlX2hlYWRlciIsCi0gICAgdG9vbHM6IFsiY3h4YnJpZGdlIl0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBjeHhicmlkZ2UpICQoaW4pIC0taGVhZGVyID4gJChvdXQpIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYnRpZi5ycyIsCi0gICAgICAgICJzcmMvcHJvZmlsZXMvYTJkcC5ycyIsCi0gICAgICAgICJzcmMvcHJvZmlsZXMvYXZyY3AucnMiLAotICAgICAgICAic3JjL3Byb2ZpbGVzL2hmcC5ycyIsCi0gICAgICAgICJzcmMvcHJvZmlsZXMvZ2F0dC5ycyIsCi0gICAgICAgICJzcmMvY29udHJvbGxlci5ycyIsCi0gICAgXSwKLSAgICBvdXRwdXRfZXh0ZW5zaW9uOiAicnMuaCIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi19Ci0KLWdlbnNyY3MgewotICAgIG5hbWU6ICJsaWJidF90b3BzaGltX2JyaWRnZV9jb2RlIiwKLSAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKLSAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgPiAkKG91dCkiLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9idGlmLnJzIiwKLSAgICAgICAgInNyYy9wcm9maWxlcy9hMmRwLnJzIiwKLSAgICAgICAgInNyYy9wcm9maWxlcy9hdnJjcC5ycyIsCi0gICAgICAgICJzcmMvcHJvZmlsZXMvaGZwLnJzIiwKLSAgICAgICAgInNyYy9wcm9maWxlcy9nYXR0LnJzIiwKLSAgICAgICAgInNyYy9jb250cm9sbGVyLnJzIiwKLSAgICBdLAotICAgIG91dHB1dF9leHRlbnNpb246ICJjYyIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi19Ci0KLXJ1c3RfYmluZGdlbiB7Ci0gICAgbmFtZTogImxpYmJ0X3RvcHNoaW1fd3JhcHBlcl9iaW5kZ2VuIiwKLSAgICB3cmFwcGVyX3NyYzogImJpbmRpbmdzL3dyYXBwZXIuaHBwIiwKLSAgICBjcmF0ZV9uYW1lOiAiYnRfdG9wc2hpbV93cmFwcGVyX2JpbmRnZW4iLAotICAgIHNvdXJjZV9zdGVtOiAiYmluZGluZ3MiLAotICAgIGNwcF9zdGQ6ICJjKysxNyIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgYmluZGdlbl9mbGFnczogWwotICAgICAgICAiLS1zaXplX3QtaXMtdXNpemUiLAotICAgICAgICAiLS1hbGxvd2xpc3QtZnVuY3Rpb249YnRfLioiLAotICAgICAgICAiLS1hbGxvd2xpc3QtZnVuY3Rpb249YnRoaF8uKiIsCi0gICAgICAgICItLWFsbG93bGlzdC1mdW5jdGlvbj1idGdhdHRfLioiLAotICAgICAgICAiLS1hbGxvd2xpc3QtZnVuY3Rpb249YnRzZHAuKiIsCi0gICAgICAgICItLWFsbG93bGlzdC1mdW5jdGlvbj1oYWxfdXRpbF8uKiIsCi0gICAgICAgICItLWFsbG93bGlzdC10eXBlPWJ0Xy4qIiwKLSAgICAgICAgIi0tYWxsb3dsaXN0LXR5cGU9YnRoaF8uKiIsCi0gICAgICAgICItLWFsbG93bGlzdC10eXBlPWJ0Z2F0dF8uKiIsCi0gICAgICAgICItLWFsbG93bGlzdC10eXBlPWJsdWV0b290aF9zZHAuKiIsCi0gICAgICAgICItLWFsbG93bGlzdC10eXBlPWJ0c2RwLioiLAotICAgICAgICAiLS1lbmFibGUtY3h4LW5hbWVzcGFjZXMiLAotICAgICAgICAiLS1vcGFxdWUtdHlwZT1zdGQ6Oi4qIiwKLSAgICAgICAgIi0td2l0aC1kZXJpdmUtZGVmYXVsdCIsCi0gICAgICAgICItLXdpdGgtZGVyaXZlLXBhcnRpYWxlcSIsCi0gICAgICAgICItLXdpdGgtZGVyaXZlLWVxIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjKysiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aF9oZWFkZXJzIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vYnQiXSwKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9CVUlMRC5nbiBiL2dkL3J1c3QvdG9wc2hpbS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5ODZjYi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAyMSBHb29nbGUKLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0KCIvL2NvbW1vbi1tay9jeHhicmlkZ2UuZ25pIikKLQotY29uZmlnKCJydXN0X3RvcHNoaW1fY29uZmlnIikgewotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC90b3BzaGltIgotICBdCi19Ci0KLWN4eGJyaWRnZV9oZWFkZXIoImJ0aWZfYnJpZGdlX2hlYWRlciIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAic3JjL2J0aWYucnMiLAotICAgICJzcmMvcHJvZmlsZXMvYTJkcC5ycyIsCi0gICAgInNyYy9wcm9maWxlcy9hdnJjcC5ycyIsCi0gICAgInNyYy9wcm9maWxlcy9oZnAucnMiLAotICAgICJzcmMvcHJvZmlsZXMvZ2F0dC5ycyIsCi0gICAgInNyYy9jb250cm9sbGVyLnJzIiwKLSAgXQotICBhbGxfZGVwZW5kZW50X2NvbmZpZ3MgPSBbICI6cnVzdF90b3BzaGltX2NvbmZpZyIgXQotICBkZXBzID0gWyI6Y3h4bGliaGVhZGVyIl0KLX0KLQotY3h4YnJpZGdlX2NjKCJidGlmX2JyaWRnZV9jb2RlIikgewotICBzb3VyY2VzID0gWwotICAgICJzcmMvYnRpZi5ycyIsCi0gICAgInNyYy9wcm9maWxlcy9hMmRwLnJzIiwKLSAgICAic3JjL3Byb2ZpbGVzL2F2cmNwLnJzIiwKLSAgICAic3JjL3Byb2ZpbGVzL2hmcC5ycyIsCi0gICAgInNyYy9wcm9maWxlcy9nYXR0LnJzIiwKLSAgICAic3JjL2NvbnRyb2xsZXIucnMiLAotICBdCi0gIGRlcHMgPSBbIjpidGlmX2JyaWRnZV9oZWFkZXIiLCAiLy9idC9nZDpCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX2giXQotICBjb25maWdzID0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotfQotCi1zb3VyY2Vfc2V0KCJidGlmX2N4eF9icmlkZ2VfY29kZSIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiYnRpZi9idGlmX3NoaW0uY2MiLAotICAgICJidGF2L2J0YXZfc2hpbS5jYyIsCi0gICAgImJ0YXZfc2luay9idGF2X3Npbmtfc2hpbS5jYyIsCi0gICAgImhmcC9oZnBfc2hpbS5jYyIsCi0gICAgImdhdHQvZ2F0dF9zaGltLmNjIiwKLSAgICAiY29udHJvbGxlci9jb250cm9sbGVyX3NoaW0uY2MiLAotICBdCi0KLSAgZGVwcyA9IFsiOmJ0aWZfYnJpZGdlX2hlYWRlciIsICIvL2J0L2dkOkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCJdCi0gIGNvbmZpZ3MgKz0gWyIvL2J0L2dkOmdkX2RlZmF1bHRzIl0KLX0KLQotY3h4YnJpZGdlX2xpYmhlYWRlcigiY3h4bGliaGVhZGVyIikgewotICBkZXBzID0gW10KLX0KLQotc3RhdGljX2xpYnJhcnkoImxpYmJsdWV0b290aF90b3BzaGltIikgewotICBkZXBzID0gWwotICAgICI6YnRpZl9icmlkZ2VfY29kZSIsCi0gICAgIjpidGlmX2N4eF9icmlkZ2VfY29kZSIsCi0gICAgIjpjeHhsaWJoZWFkZXIiLAotICBdCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vQ2FyZ28udG9tbCBiL2dkL3J1c3QvdG9wc2hpbS9DYXJnby50b21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWU0MDUyLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVtwYWNrYWdlXQotbmFtZSA9ICJidF90b3BzaGltIgotdmVyc2lvbiA9ICIwLjAuMSIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2RlcGVuZGVuY2llc10KLSMgQlQgZGVwZW5kZW5jaWVzCi1idF9jb21tb24gPSB7IHBhdGggPSAiLi4vY29tbW9uIiB9Ci1idF9mYWNhZGVfaGVscGVycyA9IHsgcGF0aCA9ICIuLi9mYWNhZGUvaGVscGVycyIgfQotYmx1ZXRvb3RoX3JzID0geyBwYXRoID0gIi4uL3N0YWNrIiB9Ci10b3BzaGltX21hY3JvcyA9IHsgcGF0aCA9ICJtYWNyb3MiIH0KLQotY3h4ID0gIioiCi1sYXp5X3N0YXRpYyA9ICIqIgotbG9nID0gIioiCi1wcm9jLW1hY3JvMiA9ICIqIgotbnVtLWRlcml2ZSA9ICIqIgotbnVtLXRyYWl0cyA9ICIqIgotdG9raW8gPSB7IHZlcnNpb24gPSAiKiIsIGZlYXR1cmVzID0gWydieXRlcycsICdmcycsICdpby11dGlsJywgJ2xpYmMnLCAnbWFjcm9zJywgJ21lbWNocicsICdtaW8nLCAnbmV0JywgJ251bV9jcHVzJywgJ3J0JywgJ3J0LW11bHRpLXRocmVhZCcsICdzeW5jJywgJ3RpbWUnLCAndG9raW8tbWFjcm9zJ10gfQotdG9raW8tc3RyZWFtID0gIioiCi1iaXRmbGFncyA9IioiCi0KLVtidWlsZC1kZXBlbmRlbmNpZXNdCi1iaW5kZ2VuID0gIjAuNTkiCi1wa2ctY29uZmlnID0gIjAuMyIKLQotW2xpYl0KLXBhdGggPSAic3JjL2xpYi5ycyIKLWJ1aWxkID0gImJ1aWxkLnJzIgpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL09XTkVSUyBiL2dkL3J1c3QvdG9wc2hpbS9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MWQyYzEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgcGxhdGZvcm0vc3lzdGVtL2J0Oi9PV05FUlNfY2hyb21lb3MKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9iaW5kaW5ncy93cmFwcGVyLmhwcCBiL2dkL3J1c3QvdG9wc2hpbS9iaW5kaW5ncy93cmFwcGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyOTEwZi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vYmluZGluZ3Mvd3JhcHBlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotLy8gQmFzZQotI2luY2x1ZGUgImhhcmR3YXJlL2JsdWV0b290aC5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFsX3V0aWwuaCIKLQotLy8gUHJvZmlsZXMKLQotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2dhdHQuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9oaC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X3NkcC5oIgpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2J0YXYvYnRhdl9zaGltLmNjIGIvZ2QvcnVzdC90b3BzaGltL2J0YXYvYnRhdl9zaGltLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkzZjIwLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9idGF2L2J0YXZfc2hpbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdkL3J1c3QvdG9wc2hpbS9idGF2L2J0YXZfc2hpbS5oIgotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJydXN0L2N4eC5oIgotI2luY2x1ZGUgInNyYy9wcm9maWxlcy9hMmRwLnJzLmgiCi0jaW5jbHVkZSAic3JjL3Byb2ZpbGVzL2F2cmNwLnJzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHJ1c3R5ID0gOjpibHVldG9vdGg6OnRvcHNoaW06OnJ1c3Q7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGg6OmF2cmNwIHsKLWNsYXNzIEF2cmNwTWVkaWFJbnRlcmZhY2VJbXBsIDogcHVibGljIE1lZGlhSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgU2VuZEtleUV2ZW50KFtbbWF5YmVfdW51c2VkXV0gdWludDhfdCBrZXksIFtbbWF5YmVfdW51c2VkXV0gS2V5U3RhdGUgc3RhdGUpIHt9Ci0KLSAgdm9pZCBHZXRTb25nSW5mbyhbW21heWJlX3VudXNlZF1dIFNvbmdJbmZvQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBHZXRQbGF5U3RhdHVzKFtbbWF5YmVfdW51c2VkXV0gUGxheVN0YXR1c0NhbGxiYWNrIGNiKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgR2V0Tm93UGxheWluZ0xpc3QoW1ttYXliZV91bnVzZWRdXSBOb3dQbGF5aW5nQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBHZXRNZWRpYVBsYXllckxpc3QoW1ttYXliZV91bnVzZWRdXSBNZWRpYUxpc3RDYWxsYmFjayBjYikgb3ZlcnJpZGUge30KLQotICB2b2lkIEdldEZvbGRlckl0ZW1zKAotICAgICAgW1ttYXliZV91bnVzZWRdXSB1aW50MTZfdCBwbGF5ZXJfaWQsCi0gICAgICBbW21heWJlX3VudXNlZF1dIHN0ZDo6c3RyaW5nIG1lZGlhX2lkLAotICAgICAgW1ttYXliZV91bnVzZWRdXSBGb2xkZXJJdGVtc0NhbGxiYWNrIGZvbGRlcl9jYikgb3ZlcnJpZGUge30KLQotICB2b2lkIFNldEJyb3dzZWRQbGF5ZXIoCi0gICAgICBbW21heWJlX3VudXNlZF1dIHVpbnQxNl90IHBsYXllcl9pZCwgW1ttYXliZV91bnVzZWRdXSBTZXRCcm93c2VkUGxheWVyQ2FsbGJhY2sgYnJvd3NlX2NiKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgUmVnaXN0ZXJVcGRhdGVDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIE1lZGlhQ2FsbGJhY2tzKiBjYWxsYmFjaykgb3ZlcnJpZGUge30KLQotICB2b2lkIFVucmVnaXN0ZXJVcGRhdGVDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIE1lZGlhQ2FsbGJhY2tzKiBjYWxsYmFjaykgb3ZlcnJpZGUge30KLQotICB2b2lkIFBsYXlJdGVtKAotICAgICAgW1ttYXliZV91bnVzZWRdXSB1aW50MTZfdCBwbGF5ZXJfaWQsCi0gICAgICBbW21heWJlX3VudXNlZF1dIGJvb2wgbm93X3BsYXlpbmcsCi0gICAgICBbW21heWJlX3VudXNlZF1dIHN0ZDo6c3RyaW5nIG1lZGlhX2lkKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgU2V0QWN0aXZlRGV2aWNlKFtbbWF5YmVfdW51c2VkXV0gY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUge30KLX07Ci0KLWNsYXNzIFZvbHVtZUludGVyZmFjZUltcGwgOiBwdWJsaWMgVm9sdW1lSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgRGV2aWNlQ29ubmVjdGVkKFtbbWF5YmVfdW51c2VkXV0gY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyKSBvdmVycmlkZSB7Ci0gICAgcnVzdHk6OmF2cmNwX2Fic29sdXRlX3ZvbHVtZV9lbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHZvaWQgRGV2aWNlQ29ubmVjdGVkKFtbbWF5YmVfdW51c2VkXV0gY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLCBWb2x1bWVDaGFuZ2VkQ2IgY2IpIG92ZXJyaWRlIHsKLSAgICB2b2x1bWVDYiA9IHN0ZDo6bW92ZShjYik7Ci0gICAgcnVzdHk6OmF2cmNwX2Fic29sdXRlX3ZvbHVtZV9lbmFibGVkKHRydWUpOwotICB9Ci0KLSAgdm9pZCBEZXZpY2VEaXNjb25uZWN0ZWQoW1ttYXliZV91bnVzZWRdXSBjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIG92ZXJyaWRlIHsKLSAgICB2b2x1bWVDYi5SZXNldCgpOwotICAgIHJ1c3R5OjphdnJjcF9hYnNvbHV0ZV92b2x1bWVfZW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICAvLyBTZXQgVEcncyAoQW5kcm9pZCwgQ2hyb21lT1MpIHZvbHVtZS4KLSAgdm9pZCBTZXRWb2x1bWUoaW50OF90IHZvbHVtZSkgb3ZlcnJpZGUgewotICAgIHJ1c3R5OjphdnJjcF9hYnNvbHV0ZV92b2x1bWVfdXBkYXRlKHZvbHVtZSk7Ci0gIH0KLQotICAvLyBTZXQgQ1QncyAoaGVhZHNldHMsIHNwZWFrZXJzKSB2b2x1bWUuCi0gIHZvaWQgU2V0RGV2aWNlVm9sdW1lKGludDhfdCB2b2x1bWUpIHsKLSAgICBpZiAoIXZvbHVtZUNiIHx8IHZvbHVtZSA8IDApIHJldHVybjsKLQotICAgIHZvbHVtZUNiLlJ1bih2b2x1bWUpOwotICB9Ci0KLSBwcml2YXRlOgotICBWb2x1bWVJbnRlcmZhY2U6OlZvbHVtZUNoYW5nZWRDYiB2b2x1bWVDYjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGg6OmF2cmNwCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRvcHNoaW0gewotbmFtZXNwYWNlIHJ1c3QgewotbmFtZXNwYWNlIGludGVybmFsIHsKLXN0YXRpYyBBMmRwSW50ZiogZ19hMmRwaWY7Ci1zdGF0aWMgQXZyY3BJbnRmKiBnX2F2cmNwaWY7Ci0KLXN0YXRpYyBSdXN0UmF3QWRkcmVzcyB0b19ydXN0X2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBSdXN0UmF3QWRkcmVzcyByYWRkcjsKLSAgc3RkOjpjb3B5KHN0ZDo6YmVnaW4oYWRkcmVzcy5hZGRyZXNzKSwgc3RkOjplbmQoYWRkcmVzcy5hZGRyZXNzKSwgc3RkOjpiZWdpbihyYWRkci5hZGRyZXNzKSk7Ci0gIHJldHVybiByYWRkcjsKLX0KLQotc3RhdGljIFJhd0FkZHJlc3MgZnJvbV9ydXN0X2FkZHJlc3MoY29uc3QgUnVzdFJhd0FkZHJlc3MmIHJhZGRyKSB7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLSAgYWRkci5Gcm9tT2N0ZXRzKHJhZGRyLmFkZHJlc3MuZGF0YSgpKTsKLSAgcmV0dXJuIGFkZHI7Ci19Ci0KLXN0YXRpYyBBMmRwQ29kZWNDb25maWcgdG9fcnVzdF9jb2RlY19jb25maWcoY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb25maWcpIHsKLSAgQTJkcENvZGVjQ29uZmlnIHJjb25maWcgPSB7LmNvZGVjX3R5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuY29kZWNfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2RlY19wcmlvcml0eSA9IGNvbmZpZy5jb2RlY19wcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNhbXBsZV9yYXRlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLnNhbXBsZV9yYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpdHNfcGVyX3NhbXBsZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5iaXRzX3Blcl9zYW1wbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hhbm5lbF9tb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmNoYW5uZWxfbW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2RlY19zcGVjaWZpY18xID0gY29uZmlnLmNvZGVjX3NwZWNpZmljXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2RlY19zcGVjaWZpY18yID0gY29uZmlnLmNvZGVjX3NwZWNpZmljXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2RlY19zcGVjaWZpY18zID0gY29uZmlnLmNvZGVjX3NwZWNpZmljXzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2RlY19zcGVjaWZpY180ID0gY29uZmlnLmNvZGVjX3NwZWNpZmljXzR9OwotICByZXR1cm4gcmNvbmZpZzsKLX0KLQotc3RhdGljIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBmcm9tX3J1c3RfY29kZWNfY29uZmlnKGNvbnN0IEEyZHBDb2RlY0NvbmZpZyYgcmNvbmZpZykgewotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnID0gewotICAgICAgLmNvZGVjX3R5cGUgPSBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfaW5kZXhfdD4ocmNvbmZpZy5jb2RlY190eXBlKSwKLSAgICAgIC5jb2RlY19wcmlvcml0eSA9IHN0YXRpY19jYXN0PGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90PihyY29uZmlnLmNvZGVjX3ByaW9yaXR5KSwKLSAgICAgIC5zYW1wbGVfcmF0ZSA9IHN0YXRpY19jYXN0PGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90PihyY29uZmlnLnNhbXBsZV9yYXRlKSwKLSAgICAgIC5iaXRzX3Blcl9zYW1wbGUgPSBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3Q+KHJjb25maWcuYml0c19wZXJfc2FtcGxlKSwKLSAgICAgIC5jaGFubmVsX21vZGUgPSBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3Q+KHJjb25maWcuY2hhbm5lbF9tb2RlKSwKLSAgICAgIC5jb2RlY19zcGVjaWZpY18xID0gcmNvbmZpZy5jb2RlY19zcGVjaWZpY18xLAotICAgICAgLmNvZGVjX3NwZWNpZmljXzIgPSByY29uZmlnLmNvZGVjX3NwZWNpZmljXzIsCi0gICAgICAuY29kZWNfc3BlY2lmaWNfMyA9IHJjb25maWcuY29kZWNfc3BlY2lmaWNfMywKLSAgICAgIC5jb2RlY19zcGVjaWZpY180ID0gcmNvbmZpZy5jb2RlY19zcGVjaWZpY180LAotICB9OwotICByZXR1cm4gY29uZmlnOwotfQotCi1zdGF0aWMgOjpydXN0OjpWZWM8QTJkcENvZGVjQ29uZmlnPiB0b19ydXN0X2NvZGVjX2NvbmZpZ192ZWMoY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29uZmlncykgewotICA6OnJ1c3Q6OlZlYzxBMmRwQ29kZWNDb25maWc+IHJjb25maWdzOwotCi0gIGZvciAoYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGMgOiBjb25maWdzKSB7Ci0gICAgcmNvbmZpZ3MucHVzaF9iYWNrKHRvX3J1c3RfY29kZWNfY29uZmlnKGMpKTsKLSAgfQotICByZXR1cm4gcmNvbmZpZ3M7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rpb25fc3RhdGVfY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpIHsKLSAgUnVzdFJhd0FkZHJlc3MgYWRkciA9IHRvX3J1c3RfYWRkcmVzcyhiZF9hZGRyKTsKLSAgcnVzdHk6OmNvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2soYWRkciwgc3RhdGUpOwotfQotc3RhdGljIHZvaWQgYXVkaW9fc3RhdGVfY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIFJ1c3RSYXdBZGRyZXNzIGFkZHIgPSB0b19ydXN0X2FkZHJlc3MoYmRfYWRkcik7Ci0gIHJ1c3R5OjphdWRpb19zdGF0ZV9jYWxsYmFjayhhZGRyLCBzdGF0ZSk7Ci19Ci1zdGF0aWMgdm9pZCBhdWRpb19jb25maWdfY2IoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnLAotICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcykgewotICBSdXN0UmF3QWRkcmVzcyBhZGRyID0gdG9fcnVzdF9hZGRyZXNzKGJkX2FkZHIpOwotICBBMmRwQ29kZWNDb25maWcgY2ZnID0gdG9fcnVzdF9jb2RlY19jb25maWcoY29kZWNfY29uZmlnKTsKLSAgOjpydXN0OjpWZWM8QTJkcENvZGVjQ29uZmlnPiBsY2FwcyA9IHRvX3J1c3RfY29kZWNfY29uZmlnX3ZlYyhjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzKTsKLSAgOjpydXN0OjpWZWM8QTJkcENvZGVjQ29uZmlnPiBzY2FwcyA9IHRvX3J1c3RfY29kZWNfY29uZmlnX3ZlYyhjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotICBydXN0eTo6YXVkaW9fY29uZmlnX2NhbGxiYWNrKGFkZHIsIGNmZywgbGNhcHMsIHNjYXBzKTsKLX0KLXN0YXRpYyBib29sIG1hbmRhdG9yeV9jb2RlY19wcmVmZXJyZWRfY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBSdXN0UmF3QWRkcmVzcyBhZGRyID0gdG9fcnVzdF9hZGRyZXNzKGJkX2FkZHIpOwotICBydXN0eTo6bWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF9jYWxsYmFjayhhZGRyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJ0YXZfc291cmNlX2NhbGxiYWNrc190IGdfY2FsbGJhY2tzID0gewotICAgIHNpemVvZihidGF2X3NvdXJjZV9jYWxsYmFja3NfdCksCi0gICAgY29ubmVjdGlvbl9zdGF0ZV9jYiwKLSAgICBhdWRpb19zdGF0ZV9jYiwKLSAgICBhdWRpb19jb25maWdfY2IsCi0gICAgbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF9jYiwKLX07Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotQTJkcEludGY6On5BMmRwSW50ZigpIHsKLSAgLy8gVE9ETwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8QTJkcEludGY+IEdldEEyZHBQcm9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ0aWYpIHsKLSAgaWYgKGludGVybmFsOjpnX2EyZHBpZikgc3RkOjphYm9ydCgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidGlmXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRfaW50ZXJmYWNlX3QqPihidGlmKTsKLQotICBhdXRvIGEyZHBpZiA9IHN0ZDo6bWFrZV91bmlxdWU8QTJkcEludGY+KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCo+KGJ0aWZfLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoImEyZHAiKSkpOwotICBpbnRlcm5hbDo6Z19hMmRwaWYgPSBhMmRwaWYuZ2V0KCk7Ci0gIHJldHVybiBhMmRwaWY7Ci19Ci0KLWludCBBMmRwSW50Zjo6aW5pdCgpIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBhOwotICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGI7Ci0gIHJldHVybiBpbnRmXy0+aW5pdCgmaW50ZXJuYWw6OmdfY2FsbGJhY2tzLCAxLCBhLCBiKTsKLX0KLQotaW50IEEyZHBJbnRmOjpjb25uZWN0KFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIpIGNvbnN0IHsKLSAgUmF3QWRkcmVzcyBhZGRyID0gaW50ZXJuYWw6OmZyb21fcnVzdF9hZGRyZXNzKGJ0X2FkZHIpOwotICByZXR1cm4gaW50Zl8tPmNvbm5lY3QoYWRkcik7Ci19Ci1pbnQgQTJkcEludGY6OmRpc2Nvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgY29uc3QgewotICBSYXdBZGRyZXNzIGFkZHIgPSBpbnRlcm5hbDo6ZnJvbV9ydXN0X2FkZHJlc3MoYnRfYWRkcik7Ci0gIHJldHVybiBpbnRmXy0+ZGlzY29ubmVjdChhZGRyKTsKLX0KLWludCBBMmRwSW50Zjo6c2V0X3NpbGVuY2VfZGV2aWNlKFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIsIGJvb2wgc2lsZW50KSBjb25zdCB7Ci0gIFJhd0FkZHJlc3MgYWRkciA9IGludGVybmFsOjpmcm9tX3J1c3RfYWRkcmVzcyhidF9hZGRyKTsKLSAgcmV0dXJuIGludGZfLT5zZXRfc2lsZW5jZV9kZXZpY2UoYWRkciwgc2lsZW50KTsKLX0KLWludCBBMmRwSW50Zjo6c2V0X2FjdGl2ZV9kZXZpY2UoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgY29uc3QgewotICBSYXdBZGRyZXNzIGFkZHIgPSBpbnRlcm5hbDo6ZnJvbV9ydXN0X2FkZHJlc3MoYnRfYWRkcik7Ci0gIHJldHVybiBpbnRmXy0+c2V0X2FjdGl2ZV9kZXZpY2UoYWRkcik7Ci19Ci1pbnQgQTJkcEludGY6OmNvbmZpZ19jb2RlYyhSdXN0UmF3QWRkcmVzcyBidF9hZGRyLCA6OnJ1c3Q6OlZlYzxBMmRwQ29kZWNDb25maWc+IGNvZGVjX3ByZWZlcmVuY2VzKSBjb25zdCB7Ci0gIFJhd0FkZHJlc3MgYWRkciA9IGludGVybmFsOjpmcm9tX3J1c3RfYWRkcmVzcyhidF9hZGRyKTsKLSAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBwcmVmczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlY19wcmVmZXJlbmNlcy5zaXplKCk7ICsraSkgewotICAgIHByZWZzLnB1c2hfYmFjayhpbnRlcm5hbDo6ZnJvbV9ydXN0X2NvZGVjX2NvbmZpZyhjb2RlY19wcmVmZXJlbmNlc1tpXSkpOwotICB9Ci0gIHJldHVybiBpbnRmXy0+Y29uZmlnX2NvZGVjKGFkZHIsIHByZWZzKTsKLX0KLQotdm9pZCBBMmRwSW50Zjo6Y2xlYW51cCgpIGNvbnN0IHsKLSAgLy8gVE9ETzogSW1wbGVtZW50LgotfQotYm9vbCBBMmRwSW50Zjo6c2V0X2F1ZGlvX2NvbmZpZyhBMmRwQ29kZWNDb25maWcgcmNvbmZpZykgY29uc3QgewotICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjpBdWRpb0NvbmZpZyBjb25maWcgPSB7Ci0gICAgICAuc2FtcGxlX3JhdGUgPSBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdD4ocmNvbmZpZy5zYW1wbGVfcmF0ZSksCi0gICAgICAuYml0c19wZXJfc2FtcGxlID0gc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90PihyY29uZmlnLmJpdHNfcGVyX3NhbXBsZSksCi0gICAgICAuY2hhbm5lbF9tb2RlID0gc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90PihyY29uZmlnLmNoYW5uZWxfbW9kZSksCi0gIH07Ci0gIHJldHVybiBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjpTZXRBdWRpb0NvbmZpZyhjb25maWcpOwotfQotYm9vbCBBMmRwSW50Zjo6c3RhcnRfYXVkaW9fcmVxdWVzdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OlN0YXJ0UmVxdWVzdCgpOwotfQotYm9vbCBBMmRwSW50Zjo6c3RvcF9hdWRpb19yZXF1ZXN0KCkgY29uc3QgewotICByZXR1cm4gYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6U3RvcFJlcXVlc3QoKTsKLX0KLVJ1c3RQcmVzZW50YXRpb25Qb3NpdGlvbiBBMmRwSW50Zjo6Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigpIGNvbnN0IHsKLSAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6UHJlc2VudGF0aW9uUG9zaXRpb24gcCA9IGJsdWV0b290aDo6YXVkaW86OmEyZHA6OkdldFByZXNlbnRhdGlvblBvc2l0aW9uKCk7Ci0gIFJ1c3RQcmVzZW50YXRpb25Qb3NpdGlvbiBycG9zaXRpb24gPSB7Ci0gICAgICAucmVtb3RlX2RlbGF5X3JlcG9ydF9ucyA9IHAucmVtb3RlX2RlbGF5X3JlcG9ydF9ucywKLSAgICAgIC50b3RhbF9ieXRlc19yZWFkID0gcC50b3RhbF9ieXRlc19yZWFkLAotICAgICAgLmRhdGFfcG9zaXRpb25fc2VjID0gcC5kYXRhX3Bvc2l0aW9uLnR2X3NlYywKLSAgICAgIC5kYXRhX3Bvc2l0aW9uX25zZWMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihwLmRhdGFfcG9zaXRpb24udHZfbnNlYyksCi0gIH07Ci0gIHJldHVybiBycG9zaXRpb247Ci19Ci0KLS8vIEFWUkNQCi0KLXN0YXRpYyBibHVldG9vdGg6OmF2cmNwOjpBdnJjcE1lZGlhSW50ZXJmYWNlSW1wbCBtQXZyY3BJbnRlcmZhY2U7Ci1zdGF0aWMgYmx1ZXRvb3RoOjphdnJjcDo6Vm9sdW1lSW50ZXJmYWNlSW1wbCBtVm9sdW1lSW50ZXJmYWNlOwotCi1zdGQ6OnVuaXF1ZV9wdHI8QXZyY3BJbnRmPiBHZXRBdnJjcFByb2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciogYnRpZikgewotICBpZiAoaW50ZXJuYWw6OmdfYXZyY3BpZikgc3RkOjphYm9ydCgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidGlmXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRfaW50ZXJmYWNlX3QqPihidGlmKTsKLQotICBhdXRvIGF2cmNwaWYgPSBzdGQ6Om1ha2VfdW5pcXVlPEF2cmNwSW50Zj4ocmVpbnRlcnByZXRfY2FzdDxhdnJjcDo6U2VydmljZUludGVyZmFjZSo+KGJ0aWZfLT5nZXRfYXZyY3Bfc2VydmljZSgpKSk7Ci0gIGludGVybmFsOjpnX2F2cmNwaWYgPSBhdnJjcGlmLmdldCgpOwotICByZXR1cm4gYXZyY3BpZjsKLX0KLQotQXZyY3BJbnRmOjp+QXZyY3BJbnRmKCkge30KLQotdm9pZCBBdnJjcEludGY6OmluaXQoKSB7Ci0gIGludGZfLT5Jbml0KCZtQXZyY3BJbnRlcmZhY2UsICZtVm9sdW1lSW50ZXJmYWNlKTsKLX0KLQotdm9pZCBBdnJjcEludGY6OmNsZWFudXAoKSB7Ci0gIGludGZfLT5DbGVhbnVwKCk7Ci19Ci0KLWludCBBdnJjcEludGY6OmNvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgewotICBSYXdBZGRyZXNzIGFkZHIgPSBpbnRlcm5hbDo6ZnJvbV9ydXN0X2FkZHJlc3MoYnRfYWRkcik7Ci0gIHJldHVybiBpbnRmXy0+Q29ubmVjdERldmljZShhZGRyKTsKLX0KLWludCBBdnJjcEludGY6OmRpc2Nvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgewotICBSYXdBZGRyZXNzIGFkZHIgPSBpbnRlcm5hbDo6ZnJvbV9ydXN0X2FkZHJlc3MoYnRfYWRkcik7Ci0gIHJldHVybiBpbnRmXy0+RGlzY29ubmVjdERldmljZShhZGRyKTsKLX0KLQotdm9pZCBBdnJjcEludGY6OnNldF92b2x1bWUoaW50OF90IHZvbHVtZSkgewotICByZXR1cm4gbVZvbHVtZUludGVyZmFjZS5TZXREZXZpY2VWb2x1bWUodm9sdW1lKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBydXN0Ci19ICAvLyBuYW1lc3BhY2UgdG9wc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2J0YXYvYnRhdl9zaGltLmggYi9nZC9ydXN0L3RvcHNoaW0vYnRhdi9idGF2X3NoaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhYmQ5Yy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vYnRhdi9idGF2X3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBHRF9SVVNUX1RPUFNISU1fQlRBVl9CVEFWX1NISU1fSAotI2RlZmluZSBHRF9SVVNUX1RPUFNISU1fQlRBVl9CVEFWX1NISU1fSAotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nX2hvc3QuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9hdi5oIgotI2luY2x1ZGUgInJ1c3QvY3h4LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdG9wc2hpbSB7Ci1uYW1lc3BhY2UgcnVzdCB7Ci0KLXN0cnVjdCBBMmRwQ29kZWNDb25maWc7Ci1zdHJ1Y3QgUnVzdFByZXNlbnRhdGlvblBvc2l0aW9uOwotc3RydWN0IFJ1c3RSYXdBZGRyZXNzOwotCi1jbGFzcyBBMmRwSW50ZiB7Ci0gcHVibGljOgotICBBMmRwSW50Zihjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCogaW50ZikgOiBpbnRmXyhpbnRmKXt9OwotICB+QTJkcEludGYoKTsKLQotICAvLyBpbnRlcmZhY2UgZm9yIFNldHRpbmdzCi0gIGludCBpbml0KCkgY29uc3Q7Ci0gIGludCBjb25uZWN0KFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIpIGNvbnN0OwotICBpbnQgZGlzY29ubmVjdChSdXN0UmF3QWRkcmVzcyBidF9hZGRyKSBjb25zdDsKLSAgaW50IHNldF9zaWxlbmNlX2RldmljZShSdXN0UmF3QWRkcmVzcyBidF9hZGRyLCBib29sIHNpbGVudCkgY29uc3Q7Ci0gIGludCBzZXRfYWN0aXZlX2RldmljZShSdXN0UmF3QWRkcmVzcyBidF9hZGRyKSBjb25zdDsKLSAgaW50IGNvbmZpZ19jb2RlYyhSdXN0UmF3QWRkcmVzcyBidF9hZGRyLCA6OnJ1c3Q6OlZlYzxBMmRwQ29kZWNDb25maWc+IGNvZGVjX3ByZWZlcmVuY2VzKSBjb25zdDsKLSAgdm9pZCBjbGVhbnVwKCkgY29uc3Q7Ci0KLSAgLy8gaW50ZXJmYWNlIGZvciBBdWRpbyBzZXJ2ZXIKLSAgYm9vbCBzZXRfYXVkaW9fY29uZmlnKEEyZHBDb2RlY0NvbmZpZyByY29uZmlnKSBjb25zdDsKLSAgYm9vbCBzdGFydF9hdWRpb19yZXF1ZXN0KCkgY29uc3Q7Ci0gIGJvb2wgc3RvcF9hdWRpb19yZXF1ZXN0KCkgY29uc3Q7Ci0gIFJ1c3RQcmVzZW50YXRpb25Qb3NpdGlvbiBnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCogaW50Zl87Ci19OwotCi1zdGQ6OnVuaXF1ZV9wdHI8QTJkcEludGY+IEdldEEyZHBQcm9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ0aWYpOwotCi1jbGFzcyBBdnJjcEludGYgewotIHB1YmxpYzoKLSAgQXZyY3BJbnRmKGJsdWV0b290aDo6YXZyY3A6OlNlcnZpY2VJbnRlcmZhY2UqIGludGYpIDogaW50Zl8oaW50Zikge30KLSAgfkF2cmNwSW50ZigpOwotCi0gIHZvaWQgaW5pdCgpOwotICB2b2lkIGNsZWFudXAoKTsKLSAgaW50IGNvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcik7Ci0gIGludCBkaXNjb25uZWN0KFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIpOwotCi0gIC8vIGludGVyZmFjZSBmb3IgQXVkaW8gc2VydmVyCi0gIHZvaWQgc2V0X3ZvbHVtZShpbnQ4X3Qgdm9sdW1lKTsKLQotIHByaXZhdGU6Ci0gIGJsdWV0b290aDo6YXZyY3A6OlNlcnZpY2VJbnRlcmZhY2UqIGludGZfOwotfTsKLQotc3RkOjp1bmlxdWVfcHRyPEF2cmNwSW50Zj4gR2V0QXZyY3BQcm9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ0aWYpOwotCi19ICAvLyBuYW1lc3BhY2UgcnVzdAotfSAgLy8gbmFtZXNwYWNlIHRvcHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotI2VuZGlmICAvLyBHRF9SVVNUX1RPUFNISU1fQlRBVl9CVEFWX1NISU1fSApkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2J0YXZfc2luay9idGF2X3Npbmtfc2hpbS5jYyBiL2dkL3J1c3QvdG9wc2hpbS9idGF2X3NpbmsvYnRhdl9zaW5rX3NoaW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDk0M2EuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2J0YXZfc2luay9idGF2X3Npbmtfc2hpbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZ2QvcnVzdC90b3BzaGltL2J0YXZfc2luay9idGF2X3Npbmtfc2hpbS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJydXN0L2N4eC5oIgotI2luY2x1ZGUgInNyYy9wcm9maWxlcy9hMmRwLnJzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdG9wc2hpbSB7Ci1uYW1lc3BhY2UgcnVzdCB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotc3RhdGljIEEyZHBTaW5rSW50ZiogZ19hMmRwX3NpbmtfaWY7Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rpb25fc3RhdGVfY2IoY29uc3QgUmF3QWRkcmVzcyYsIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90KSB7fQotc3RhdGljIHZvaWQgYXVkaW9fc3RhdGVfY2IoY29uc3QgUmF3QWRkcmVzcyYsIGJ0YXZfYXVkaW9fc3RhdGVfdCkge30KLXN0YXRpYyB2b2lkIGF1ZGlvX2NvbmZpZ19jYihjb25zdCBSYXdBZGRyZXNzJiwgdWludDMyX3QsIHVpbnQ4X3QpIHt9Ci0KLWJ0YXZfc2lua19jYWxsYmFja3NfdCBnX2EyZHBfc2lua19jYWxsYmFja3MgPSB7Ci0gICAgc2l6ZW9mKGJ0YXZfc2lua19jYWxsYmFja3NfdCksCi0gICAgY29ubmVjdGlvbl9zdGF0ZV9jYiwKLSAgICBhdWRpb19zdGF0ZV9jYiwKLSAgICBhdWRpb19jb25maWdfY2IsCi19OwotCi1zdGF0aWMgUmF3QWRkcmVzcyBmcm9tX3J1c3RfYWRkcmVzcyhjb25zdCBSdXN0UmF3QWRkcmVzcyYgcmFkZHIpIHsKLSAgUmF3QWRkcmVzcyBhZGRyOwotICBhZGRyLkZyb21PY3RldHMocmFkZHIuYWRkcmVzcy5kYXRhKCkpOwotICByZXR1cm4gYWRkcjsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1BMmRwU2lua0ludGY6On5BMmRwU2lua0ludGYoKSB7Ci0gIC8vIFRPRE8KLX0KLQotc3RkOjp1bmlxdWVfcHRyPEEyZHBTaW5rSW50Zj4gR2V0QTJkcFNpbmtQcm9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ0aWYpIHsKLSAgaWYgKGludGVybmFsOjpnX2EyZHBfc2lua19pZikgc3RkOjphYm9ydCgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidGlmXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRfaW50ZXJmYWNlX3QqPihidGlmKTsKLQotICBhdXRvIGEyZHBfc2luayA9IHN0ZDo6bWFrZV91bmlxdWU8QTJkcFNpbmtJbnRmPigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRhdl9zaW5rX2ludGVyZmFjZV90Kj4oYnRpZl8tPmdldF9wcm9maWxlX2ludGVyZmFjZSgiYTJkcF9zaW5rIikpKTsKLSAgaW50ZXJuYWw6OmdfYTJkcF9zaW5rX2lmID0gYTJkcF9zaW5rLmdldCgpOwotICByZXR1cm4gYTJkcF9zaW5rOwotfQotCi1pbnQgQTJkcFNpbmtJbnRmOjppbml0KCkgY29uc3QgewotICByZXR1cm4gaW50Zl8tPmluaXQoJmludGVybmFsOjpnX2EyZHBfc2lua19jYWxsYmFja3MsIDEpOwotfQotCi1pbnQgQTJkcFNpbmtJbnRmOjpjb25uZWN0KFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIpIGNvbnN0IHsKLSAgcmV0dXJuIGludGZfLT5jb25uZWN0KGludGVybmFsOjpmcm9tX3J1c3RfYWRkcmVzcyhidF9hZGRyKSk7Ci19Ci0KLWludCBBMmRwU2lua0ludGY6OmRpc2Nvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgY29uc3QgewotICByZXR1cm4gaW50Zl8tPmRpc2Nvbm5lY3QoaW50ZXJuYWw6OmZyb21fcnVzdF9hZGRyZXNzKGJ0X2FkZHIpKTsKLX0KLQotaW50IEEyZHBTaW5rSW50Zjo6c2V0X2FjdGl2ZV9kZXZpY2UoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgY29uc3QgewotICByZXR1cm4gaW50Zl8tPnNldF9hY3RpdmVfZGV2aWNlKGludGVybmFsOjpmcm9tX3J1c3RfYWRkcmVzcyhidF9hZGRyKSk7Ci19Ci0KLXZvaWQgQTJkcFNpbmtJbnRmOjpjbGVhbnVwKCkgY29uc3QgewotICAvLyBUT0RPOiBJbXBsZW1lbnQuCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBydXN0Ci19ICAvLyBuYW1lc3BhY2UgdG9wc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2J0YXZfc2luay9idGF2X3Npbmtfc2hpbS5oIGIvZ2QvcnVzdC90b3BzaGltL2J0YXZfc2luay9idGF2X3Npbmtfc2hpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODVjMTUwLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9idGF2X3NpbmsvYnRhdl9zaW5rX3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImdkL3J1c3QvdG9wc2hpbS9idGF2X3NpbmsvYnRhdl9zaW5rX3NoaW0uaCIKLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X2F2LmgiCi0jaW5jbHVkZSAicnVzdC9jeHguaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0b3BzaGltIHsKLW5hbWVzcGFjZSBydXN0IHsKLQotc3RydWN0IFJ1c3RSYXdBZGRyZXNzOwotCi1jbGFzcyBBMmRwU2lua0ludGYgewotIHB1YmxpYzoKLSAgQTJkcFNpbmtJbnRmKGNvbnN0IGJ0YXZfc2lua19pbnRlcmZhY2VfdCogaW50ZikgOiBpbnRmXyhpbnRmKXt9OwotICB+QTJkcFNpbmtJbnRmKCk7Ci0KLSAgLy8gaW50ZXJmYWNlIGZvciBTZXR0aW5ncwotICBpbnQgaW5pdCgpIGNvbnN0OwotICBpbnQgY29ubmVjdChSdXN0UmF3QWRkcmVzcyBidF9hZGRyKSBjb25zdDsKLSAgaW50IGRpc2Nvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgY29uc3Q7Ci0gIGludCBzZXRfYWN0aXZlX2RldmljZShSdXN0UmF3QWRkcmVzcyBidF9hZGRyKSBjb25zdDsKLSAgdm9pZCBjbGVhbnVwKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqIGludGZfOwotfTsKLQotc3RkOjp1bmlxdWVfcHRyPEEyZHBTaW5rSW50Zj4gR2V0QTJkcFNpbmtQcm9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ0aWYpOwotCi19ICAvLyBuYW1lc3BhY2UgcnVzdAotfSAgLy8gbmFtZXNwYWNlIHRvcHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9idGlmL2J0aWZfc2hpbS5jYyBiL2dkL3J1c3QvdG9wc2hpbS9idGlmL2J0aWZfc2hpbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmNTNmYS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vYnRpZi9idGlmX3NoaW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdkL3J1c3QvdG9wc2hpbS9idGlmL2J0aWZfc2hpbS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJydXN0L2N4eC5oIgotI2luY2x1ZGUgInNyYy9idGlmLnJzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRvcHNoaW0gewotbmFtZXNwYWNlIHJ1c3QgewotCi1Jbml0RmxhZ3M6OkluaXRGbGFncygpIHt9Ci1Jbml0RmxhZ3M6On5Jbml0RmxhZ3MoKSB7Ci0gIGlmIChmbGFnc18pIHsKLSAgICBmb3IgKGludCBpID0gMDsgZmxhZ3NfW2ldICE9IG51bGxwdHI7ICsraSkgewotICAgICAgc3RkOjpmcmVlKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihmbGFnc19baV0pKSk7Ci0gICAgfQotCi0gICAgc3RkOjpmcmVlKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihmbGFnc18pKSk7Ci0gIH0KLX0KLQotdm9pZCBJbml0RmxhZ3M6OkNvbnZlcnQoOjpydXN0OjpWZWM8OjpydXN0OjpTdHJpbmc+JiBpbml0RmxhZ3MpIHsKLSAgLy8gQWxsb2NhdGUgbnVtYmVyIG9mIGZsYWdzICsgMSAobGFzdCBlbnRyeSBtdXN0IGJlIG51bGwgdG8gc2lnbmlmeSBlbmQpCi0gIC8vIE11c3QgYmUgY2FsbG9jIHNvIG91ciBjbGVhbnVwIGNvcnJlY3RseSBmcmVlcyBldmVyeXRoaW5nCi0gIGZsYWdzXyA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqKj4oc3RkOjpjYWxsb2MoaW5pdEZsYWdzLnNpemUoKSArIDEsIHNpemVvZihjaGFyKikpKTsKLSAgaWYgKCFmbGFnc18pIHJldHVybjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGluaXRGbGFncy5zaXplKCk7ICsraSkgewotICAgIGZsYWdzX1tpXSA9IHN0cm5kdXAoaW5pdEZsYWdzW2ldLmRhdGEoKSwgaW5pdEZsYWdzW2ldLnNpemUoKSk7Ci0gICAgaWYgKCFmbGFnc19baV0pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotc3RkOjp1bmlxdWVfcHRyPEluaXRGbGFncz4gQ29udmVydEZsYWdzKDo6cnVzdDo6VmVjPDo6cnVzdDo6U3RyaW5nPiBmbGFncykgewotICBhdXRvIHJldCA9IHN0ZDo6bWFrZV91bmlxdWU8SW5pdEZsYWdzPigpOwotICByZXQtPkNvbnZlcnQoZmxhZ3MpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBydXN0Ci19ICAvLyBuYW1lc3BhY2UgdG9wc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2J0aWYvYnRpZl9zaGltLmggYi9nZC9ydXN0L3RvcHNoaW0vYnRpZi9idGlmX3NoaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhMjY4NC4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vYnRpZi9idGlmX3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBHRF9SVVNUX1RPUFNISU1fQlRJRl9CVElGX1NISU1fSAotI2RlZmluZSBHRF9SVVNUX1RPUFNISU1fQlRJRl9CVElGX1NISU1fSAotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAicnVzdC9jeHguaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdG9wc2hpbSB7Ci1uYW1lc3BhY2UgcnVzdCB7Ci0KLWNsYXNzIEluaXRGbGFncyB7Ci0gcHVibGljOgotICBJbml0RmxhZ3MoKTsKLSAgfkluaXRGbGFncygpOwotCi0gIHZvaWQgQ29udmVydCg6OnJ1c3Q6OlZlYzw6OnJ1c3Q6OlN0cmluZz4mIGZsYWdzKTsKLSAgY29uc3QgY2hhcioqIEdldEZsYWdzUHRyKCkgY29uc3QgewotICAgIHJldHVybiBmbGFnc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGNoYXIqKiBmbGFnc187Ci19OwotCi1zdGQ6OnVuaXF1ZV9wdHI8SW5pdEZsYWdzPiBDb252ZXJ0RmxhZ3MoOjpydXN0OjpWZWM8OjpydXN0OjpTdHJpbmc+IGZsYWdzKTsKLQotfSAgLy8gbmFtZXNwYWNlIHJ1c3QKLX0gIC8vIG5hbWVzcGFjZSB0b3BzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLSNlbmRpZiAgLy8gR0RfUlVTVF9UT1BTSElNX0JUSUZfQlRJRl9TSElNX0gKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9idWlsZC5ycyBiL2dkL3J1c3QvdG9wc2hpbS9idWlsZC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwYWQ1Zi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vYnVpbGQucnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1leHRlcm4gY3JhdGUgYmluZGdlbjsKLQotdXNlIHBrZ19jb25maWc6OkNvbmZpZzsKLXVzZSBzdGQ6OmVudjsKLXVzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7Ci0KLWZuIG1haW4oKSB7Ci0gICAgLy8gUmUtcnVuIGJ1aWxkIGlmIGFueSBvZiB0aGVzZSBjaGFuZ2UKLSAgICBwcmludGxuISgiY2FyZ286cmVydW4taWYtY2hhbmdlZD1iaW5kaW5ncy93cmFwcGVyLmhwcCIpOwotICAgIHByaW50bG4hKCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPWJ1aWxkLnJzIik7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGNvbmZpZ3VyZSBsaWJjaHJvbWUgYW5kIGxpYm1vZHBfYjY0IHNldHRpbmdzIGFzIHdlbGwKLSAgICBsZXQgbGliY2hyb21lID0gQ29uZmlnOjpuZXcoKS5wcm9iZSgibGliY2hyb21lIikudW53cmFwKCk7Ci0gICAgbGV0IGxpYmNocm9tZV9wYXRocyA9IGxpYmNocm9tZQotICAgICAgICAuaW5jbHVkZV9wYXRocwotICAgICAgICAuaXRlcigpCi0gICAgICAgIC5tYXAofHB8IGZvcm1hdCEoIi1Je30iLCBwLnRvX3N0cigpLnVud3JhcCgpKSkKLSAgICAgICAgLmNvbGxlY3Q6OjxWZWM8U3RyaW5nPj4oKTsKLQotICAgIGxldCBzZWFyY2hfcm9vdCA9IGVudjo6dmFyKCJDWFhfUk9PVF9QQVRIIikudW53cmFwKCk7Ci0gICAgbGV0IHBhdGhzID0gdmVjIVsiLyIsICIvYnRjb3JlIiwgIi9pbmNsdWRlIiwgIi9pbmNsdWRlL2hhcmR3YXJlIiwgIi90eXBlcyJdOwotCi0gICAgbGV0IGJ0X3NlYXJjaGVzID0KLSAgICAgICAgcGF0aHMuaXRlcigpLm1hcCh8dGFpbHwgZm9ybWF0ISgiLUl7fXt9Iiwgc2VhcmNoX3Jvb3QsIHRhaWwpKS5jb2xsZWN0Ojo8VmVjPFN0cmluZz4+KCk7Ci0KLSAgICAvLyAiLXgiIGFuZCAiYysrIiBtdXN0IGJlIHNlcGFyYXRlIGR1ZSB0byBhIGJ1ZwotICAgIGxldCBjbGFuZ19hcmdzOiBWZWM8JnN0cj4gPSB2ZWMhWyIteCIsICJjKysiLCAiLXN0ZD1jKysxNyJdOwotCi0gICAgLy8gVGhlIGJpbmRnZW46OkJ1aWxkZXIgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQKLSAgICAvLyB0byBiaW5kZ2VuLCBhbmQgbGV0cyB5b3UgYnVpbGQgdXAgb3B0aW9ucyBmb3IKLSAgICAvLyB0aGUgcmVzdWx0aW5nIGJpbmRpbmdzLgotICAgIGxldCBiaW5kaW5ncyA9IGJpbmRnZW46OkJ1aWxkZXI6OmRlZmF1bHQoKQotICAgICAgICAuY2xhbmdfYXJncyhidF9zZWFyY2hlcykKLSAgICAgICAgLmNsYW5nX2FyZ3MobGliY2hyb21lX3BhdGhzKQotICAgICAgICAuY2xhbmdfYXJncyhjbGFuZ19hcmdzKQotICAgICAgICAuZW5hYmxlX2N4eF9uYW1lc3BhY2VzKCkKLSAgICAgICAgLnNpemVfdF9pc191c2l6ZSh0cnVlKQotICAgICAgICAuYWxsb3dsaXN0X3R5cGUoIihidF98YnRoaF98YnRnYXR0X3xidHNkcHxibHVldG9vdGhfc2RwKS4qIikKLSAgICAgICAgLmFsbG93bGlzdF9mdW5jdGlvbigiKGJ0X3xidGhoX3xidGdhdHRffGJ0c2RwKS4qIikKLSAgICAgICAgLmFsbG93bGlzdF9mdW5jdGlvbigiaGFsX3V0aWxfLioiKQotICAgICAgICAvLyBXZSBtdXN0IG9wYXF1ZSBvdXQgc3RkOjogaW4gb3JkZXIgdG8gcHJldmVudCBiaW5kZ2VuIGZyb20gY2hva2luZwotICAgICAgICAub3BhcXVlX3R5cGUoInN0ZDo6LioiKQotICAgICAgICAvLyBXaGl0ZWxpc3Qgc3RkOjpzdHJpbmcgdGhvdWdoIGJlY2F1c2Ugd2UgdXNlIGl0IGEgbG90Ci0gICAgICAgIC5hbGxvd2xpc3RfdHlwZSgic3RkOjpzdHJpbmciKQotICAgICAgICAucnVzdGZtdF9iaW5kaW5ncyh0cnVlKQotICAgICAgICAuZGVyaXZlX2RlYnVnKHRydWUpCi0gICAgICAgIC5kZXJpdmVfcGFydGlhbGVxKHRydWUpCi0gICAgICAgIC5kZXJpdmVfZXEodHJ1ZSkKLSAgICAgICAgLmRlcml2ZV9kZWZhdWx0KHRydWUpCi0gICAgICAgIC5oZWFkZXIoImJpbmRpbmdzL3dyYXBwZXIuaHBwIikKLSAgICAgICAgLmdlbmVyYXRlKCkKLSAgICAgICAgLmV4cGVjdCgiVW5hYmxlIHRvIGdlbmVyYXRlIGJpbmRpbmdzIik7Ci0KLSAgICAvLyBXcml0ZSB0aGUgYmluZGluZ3MgdG8gdGhlICRPVVRfRElSL2JpbmRpbmdzLnJzIGZpbGUuCi0gICAgbGV0IG91dF9wYXRoID0gUGF0aEJ1Zjo6ZnJvbShlbnY6OnZhcigiT1VUX0RJUiIpLnVud3JhcCgpKTsKLSAgICBiaW5kaW5ncy53cml0ZV90b19maWxlKG91dF9wYXRoLmpvaW4oImJpbmRpbmdzLnJzIikpLmV4cGVjdCgiQ291bGRuJ3Qgd3JpdGUgYmluZGluZ3MhIik7Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vY29udHJvbGxlci9jb250cm9sbGVyX3NoaW0uY2MgYi9nZC9ydXN0L3RvcHNoaW0vY29udHJvbGxlci9jb250cm9sbGVyX3NoaW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMDRmNGYuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2NvbnRyb2xsZXIvY29udHJvbGxlcl9zaGltLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdkL3J1c3QvdG9wc2hpbS9jb250cm9sbGVyL2NvbnRyb2xsZXJfc2hpbS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAicnVzdC9jeHguaCIKLSNpbmNsdWRlICJzcmMvY29udHJvbGxlci5ycy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRvcHNoaW0gewotbmFtZXNwYWNlIHJ1c3QgewotbmFtZXNwYWNlIGludGVybmFsIHsKLXN0YXRpYyBDb250cm9sbGVySW50ZiogZ19jb250cm9sbGVyX2ludGY7Ci0KLXN0YXRpYyBSdXN0UmF3QWRkcmVzcyB0b19ydXN0X2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBSdXN0UmF3QWRkcmVzcyByYWRkcjsKLSAgc3RkOjpjb3B5KHN0ZDo6YmVnaW4oYWRkcmVzcy5hZGRyZXNzKSwgc3RkOjplbmQoYWRkcmVzcy5hZGRyZXNzKSwgc3RkOjpiZWdpbihyYWRkci5hZGRyZXNzKSk7Ci0gIHJldHVybiByYWRkcjsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1Db250cm9sbGVySW50Zjo6fkNvbnRyb2xsZXJJbnRmKCkge30KLQotc3RkOjp1bmlxdWVfcHRyPENvbnRyb2xsZXJJbnRmPiBHZXRDb250cm9sbGVySW50ZXJmYWNlKCkgewotICBpZiAoaW50ZXJuYWw6OmdfY29udHJvbGxlcl9pbnRmKSBzdGQ6OmFib3J0KCk7Ci0gIGF1dG8gY29udHJvbGxlcl9pbnRmID0gc3RkOjptYWtlX3VuaXF1ZTxDb250cm9sbGVySW50Zj4oKTsKLSAgaW50ZXJuYWw6OmdfY29udHJvbGxlcl9pbnRmID0gY29udHJvbGxlcl9pbnRmLmdldCgpOwotICByZXR1cm4gY29udHJvbGxlcl9pbnRmOwotfQotCi1SdXN0UmF3QWRkcmVzcyBDb250cm9sbGVySW50Zjo6cmVhZF9sb2NhbF9hZGRyKCkgY29uc3QgewotICBpZiAoIWNvbnRyb2xsZXJfKSBzdGQ6OmFib3J0KCk7Ci0gIHJldHVybiBpbnRlcm5hbDo6dG9fcnVzdF9hZGRyZXNzKCpjb250cm9sbGVyXy0+Z2V0X2FkZHJlc3MoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBydXN0Ci19ICAvLyBuYW1lc3BhY2UgdG9wc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2NvbnRyb2xsZXIvY29udHJvbGxlcl9zaGltLmggYi9nZC9ydXN0L3RvcHNoaW0vY29udHJvbGxlci9jb250cm9sbGVyX3NoaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxN2VlOS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vY29udHJvbGxlci9jb250cm9sbGVyX3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBHRF9SVVNUX1RPUFNISU1fQ09OVFJPTExFUl9TSElNCi0jZGVmaW5lIEdEX1JVU1RfVE9QU0hJTV9DT05UUk9MTEVSX1NISU0KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAicnVzdC9jeHguaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0b3BzaGltIHsKLW5hbWVzcGFjZSBydXN0IHsKLQotc3RydWN0IFJ1c3RSYXdBZGRyZXNzOwotCi1jbGFzcyBDb250cm9sbGVySW50ZiB7Ci0gcHVibGljOgotICBDb250cm9sbGVySW50ZigpIDogY29udHJvbGxlcl8oY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkpIHt9Ci0gIH5Db250cm9sbGVySW50ZigpOwotCi0gIFJ1c3RSYXdBZGRyZXNzIHJlYWRfbG9jYWxfYWRkcigpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyXzsKLX07Ci0KLS8vIENvbnRyb2xsZXJJbnRmKiBHZXRDb250cm9sbGVySW50ZXJmYWNlKCk7Ci1zdGQ6OnVuaXF1ZV9wdHI8Q29udHJvbGxlckludGY+IEdldENvbnRyb2xsZXJJbnRlcmZhY2UoKTsKLQotfSAgLy8gbmFtZXNwYWNlIHJ1c3QKLX0gIC8vIG5hbWVzcGFjZSB0b3BzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLSNlbmRpZiAgLy8gR0RfUlVTVF9UT1BTSElNX0NPTlRST0xMRVJfU0hJTQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvLmdpdGlnbm9yZSBiL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjZWIxOS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qX3BiMioucHkKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvQW5kcm9pZC5icCBiL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNjcxYi4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1ydXN0X2JpbmFyeV9ob3N0IHsKLSAgICBuYW1lOiAiYnRfdG9wc2hpbV9mYWNhZGUiLAotICAgIGRlZmF1bHRzOiBbImdkX3J1c3RfZGVmYXVsdHMiXSwKLSAgICBjcmF0ZV9uYW1lOiAiYnRfdG9wc2hpbV9mYWNhZGUiLAotICAgIHNyY3M6IFsic3JjL21haW4ucnMiXSwKLSAgICBsZF9mbGFnczogWyItZnNhbml0aXplPXVuZGVmaW5lZCIsICItZnNhbml0aXplLW1pbmltYWwtcnVudGltZSJdLAotICAgIHJ1c3RsaWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfcnMiLAotICAgICAgICAibGliYnRfY29tbW9uIiwKLSAgICAgICAgImxpYnRva2lvIiwKLSAgICAgICAgImxpYmJ0X3BhY2tldHMiLAotICAgICAgICAibGliZnV0dXJlcyIsCi0gICAgICAgICJsaWJncnBjaW8iLAotICAgICAgICAibGlibnVtX3RyYWl0cyIsCi0gICAgICAgICJsaWJuaXgiLAotICAgICAgICAibGlibG9nX3J1c3QiLAotICAgICAgICAibGliYnRfZmFjYWRlX2hlbHBlcnMiLAotICAgICAgICAibGliYnRfdG9wc2hpbSIsCi0gICAgICAgICJsaWJidF90b3BzaGltX2ZhY2FkZV9wcm90b2J1ZiIsCi0gICAgICAgICJsaWJidF9zaGltIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidF90b3BzaGltX2N4eCIsCi0gICAgICAgICJsaWJidC1idGEiLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmJ0aWYtc3RhdGljIiwKLSAgICAgICAgImxpYmJ0LWhjaSIsCi0gICAgICAgICJsaWJidC1zdGFjayIsCi0gICAgICAgICJsaWJidC11dGlscyIsCi0gICAgICAgICJsaWJidGNvcmUtc3RhdGljIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJidGUiLAotICAgICAgICAibGliYnQtc2JjLWRlY29kZXIiLAotICAgICAgICAibGliYnQtc2JjLWVuY29kZXIiLAotICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCi0gICAgICAgICJsaWJnNzIyY29kZWMiLAotICAgICAgICAibGlibGMzY29kZWMiLAotICAgICAgICAibGlidWRydi11aXBjIiwKLSAgICAgICAgImxpYmJsdWV0b290aF9nZCIsIC8vIEdhYmVsZG9yc2NoZQotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYmZsYXRidWZmZXJzLWNwcCIsCi0gICAgICAgICJsaWJidF9zaGltX2JyaWRnZSIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmNocm9tZSIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmdycGMrKyIsCi0gICAgICAgICJsaWJncnBjX3dyYXAiCi0gICAgXSwKLSAgICBwcm9jX21hY3JvczogWwotICAgICAgICAibGlicGFzdGUiLAotICAgIF0sCi19Ci0KLXJ1c3RfcHJvdG9idWYgewotICAgIG5hbWU6ICJsaWJidF90b3BzaGltX2ZhY2FkZV9wcm90b2J1ZiIsCi0gICAgY3JhdGVfbmFtZTogImJ0X3RvcHNoaW1fZmFjYWRlX3Byb3RvYnVmIiwKLSAgICBzb3VyY2Vfc3RlbTogInRvcHNoaW1fZmFjYWRlIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBncnBjX3Byb3RvczogWyJmYWNhZGUucHJvdG8iXSwKLX0KLQotZ2VucnVsZSB7Ci0gICAgbmFtZTogImxpYmJ0X3RvcHNoaW1fZmFjYWRlX3B5X3Byb3RvIiwKLSAgICB0b29sczogWwotICAgICAgICAiYXByb3RvYyIsCi0gICAgICAgICJwcm90b2MtZ2VuLWdycGMtcHl0aG9uLXBsdWdpbiIsCi0gICAgICAgICJzb29uZ196aXAiLAotICAgIF0sCi0gICAgY21kOiAiJChsb2NhdGlvbiBhcHJvdG9jKSAtLXBsdWdpbj1wcm90b2MtZ2VuLWdycGM9JChsb2NhdGlvbiBwcm90b2MtZ2VuLWdycGMtcHl0aG9uLXBsdWdpbikgLUlzeXN0ZW0vYnQvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZSAkKGluKSAtLWdycGNfb3V0PSQoZ2VuRGlyKSAtLXB5dGhvbl9vdXQ9JChnZW5EaXIpIiwKLSAgICBzcmNzOiBbImZhY2FkZS5wcm90byJdLAotICAgIG91dDogWyJmYWNhZGVfcGIyLnB5IiwgImZhY2FkZV9wYjJfZ3JwYy5weSJdLAotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9hZGFwdGVyX3Rlc3QucHkgYi9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL2FkYXB0ZXJfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiNjcxNy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL2FkYXB0ZXJfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGFzeW5jaW8KLWZyb20gbW9ibHkgaW1wb3J0IHRlc3RfcnVubmVyCi1mcm9tIHJ1c3QudG9wc2hpbS5mYWNhZGUgaW1wb3J0IHRvcHNoaW1fYmFzZV90ZXN0Ci1mcm9tIHJ1c3QudG9wc2hpbS5mYWNhZGUuYXV0b21hdGlvbl9oZWxwZXIgaW1wb3J0IEFkYXB0ZXJBdXRvbWF0aW9uSGVscGVyCi0KLQotY2xhc3MgQWRhcHRlclRlc3QodG9wc2hpbV9iYXNlX3Rlc3QuVG9wc2hpbUJhc2VUZXN0KToKLQotICAgIGFzeW5jIGRlZiBfdGVzdF92ZXJpZnlfYWRhcHRlcl9zdGFydGVkKHNlbGYpOgotICAgICAgICBzZWxmLmR1dF9hZGFwdGVyID0gQWRhcHRlckF1dG9tYXRpb25IZWxwZXIocG9ydD1zZWxmLmR1dF9wb3J0KQotICAgICAgICBldmVudF9sb29wID0gYXN5bmNpby5nZXRfcnVubmluZ19sb29wKCkKLSAgICAgICAgc2VsZi5kdXRfYWRhcHRlci5mZXRjaF9ldmVudHMoZXZlbnRfbG9vcCkKLSAgICAgICAgc2VsZi5kdXRfYWRhcHRlci5wZW5kaW5nX2Z1dHVyZSA9IGV2ZW50X2xvb3AuY3JlYXRlX2Z1dHVyZSgpCi0gICAgICAgIGF3YWl0IHNlbGYuZHV0X2FkYXB0ZXIudG9nZ2xlX3N0YWNrKCkKLSAgICAgICAgYXdhaXQgc2VsZi5kdXRfYWRhcHRlci52ZXJpZnlfYWRhcHRlcl9zdGFydGVkKCkKLSAgICAgICAgc2VsZi5kdXRfYWRhcHRlci5ldmVudF9oYW5kbGVyLmNhbmNlbCgpCi0KLSAgICBkZWYgdGVzdF92ZXJpZnlfYWRhcHRlcl9zdGFydGVkKHNlbGYpOgotICAgICAgICBhc3luY2lvLnJ1bihzZWxmLl90ZXN0X3ZlcmlmeV9hZGFwdGVyX3N0YXJ0ZWQoKSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfcnVubmVyLm1haW4oKQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9hdXRvbWF0aW9uX2hlbHBlci5weSBiL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvYXV0b21hdGlvbl9oZWxwZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMGY3M2UuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9hdXRvbWF0aW9uX2hlbHBlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGFzeW5jaW8KLWltcG9ydCBncnBjCi0KLWZyb20gcnVzdC50b3BzaGltLmZhY2FkZSBpbXBvcnQgZmFjYWRlX3BiMgotZnJvbSBydXN0LnRvcHNoaW0uZmFjYWRlIGltcG9ydCBmYWNhZGVfcGIyX2dycGMKLQotCi1jbGFzcyBBZGFwdGVyQXV0b21hdGlvbkhlbHBlcigpOgotICAgICMgVGltZW91dCBmb3IgYXN5bmMgd2FpdAotICAgIERFRkFVTFRfVElNRU9VVCA9IDYKLSAgICAiIiJJbnZva2UgZ1JQQyBvbiB0b3BzaGltIGZvciBBZGFwdGVyIHRlc3RpbmciIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0PTg5OTkpOgotICAgICAgICBzZWxmLmNoYW5uZWwgPSBncnBjLmFpby5pbnNlY3VyZV9jaGFubmVsKCJsb2NhbGhvc3Q6JWQiICUgcG9ydCkKLSAgICAgICAgc2VsZi5hZGFwdGVyX3N0dWIgPSBmYWNhZGVfcGIyX2dycGMuQWRhcHRlclNlcnZpY2VTdHViKHNlbGYuY2hhbm5lbCkKLQotICAgICAgICBzZWxmLnBlbmRpbmdfZnV0dXJlID0gTm9uZQotCi0gICAgIiIiU3RhcnQgZmV0Y2hpbmcgZXZlbnRzIiIiCi0KLSAgICBkZWYgZmV0Y2hfZXZlbnRzKHNlbGYsIGFzeW5jX2V2ZW50X2xvb3ApOgotICAgICAgICBzZWxmLmFkYXB0ZXJfZXZlbnRfc3RyZWFtID0gc2VsZi5hZGFwdGVyX3N0dWIuRmV0Y2hFdmVudHMoZmFjYWRlX3BiMi5GZXRjaEV2ZW50c1JlcXVlc3QoKSkKLSAgICAgICAgc2VsZi5ldmVudF9oYW5kbGVyID0gYXN5bmNfZXZlbnRfbG9vcC5jcmVhdGVfdGFzayhzZWxmLmdldF9uZXh0X2V2ZW50KCkpCi0KLSAgICAiIiJFbmFibGUvZGlzYWJsZSB0aGUgc3RhY2siIiIKLQotICAgIGFzeW5jIGRlZiB0b2dnbGVfc3RhY2soc2VsZiwgaXNfc3RhcnQ9VHJ1ZSk6Ci0gICAgICAgIGF3YWl0IHNlbGYuYWRhcHRlcl9zdHViLlRvZ2dsZVN0YWNrKGZhY2FkZV9wYjIuVG9nZ2xlU3RhY2tSZXF1ZXN0KHN0YXJ0X3N0YWNrPWlzX3N0YXJ0KSkKLQotICAgICIiIkVuYWJsZSBwYWdlIHNjYW4gKG1pZ2h0IGJlIHVzZWQgZm9yIEEyZHAgc2luayB0byBiZSBkaXNjb3ZlcmFibGUpIiIiCi0KLSAgICBhc3luYyBkZWYgc2V0X2VuYWJsZV9wYWdlX3NjYW4oc2VsZik6Ci0gICAgICAgIGF3YWl0IHNlbGYuYWRhcHRlcl9zdHViLlNldERpc2NvdmVyeU1vZGUoZmFjYWRlX3BiMi5TZXREaXNjb3ZlcnlNb2RlUmVxdWVzdChlbmFibGVfcGFnZV9zY2FuPVRydWUpKQotCi0gICAgIiIiR2V0IHRoZSBmdXR1cmUgb2YgbmV4dCBldmVudCBmcm9tIHRoZSBzdHJlYW0iIiIKLQotICAgIGFzeW5jIGRlZiBnZXRfbmV4dF9ldmVudChzZWxmKToKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGUgPSBhd2FpdCBzZWxmLmFkYXB0ZXJfZXZlbnRfc3RyZWFtLnJlYWQoKQotICAgICAgICAgICAgIyBNYXRjaCBldmVudCBieSBzb21lIGNvbmRpdGlvbi4KLSAgICAgICAgICAgIGlmIGUuZXZlbnRfdHlwZSA9PSBmYWNhZGVfcGIyLkV2ZW50VHlwZS5BREFQVEVSX1NUQVRFIGFuZCBlLmRhdGEgPT0gIk9OIiBhbmQgc2VsZi5wZW5kaW5nX2Z1dHVyZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfZnV0dXJlLnNldF9yZXN1bHQoVHJ1ZSkKLQotICAgIGFzeW5jIGRlZiB2ZXJpZnlfYWRhcHRlcl9zdGFydGVkKHNlbGYpOgotICAgICAgICBhd2FpdCBhc3luY2lvLndhaXRfZm9yKHNlbGYucGVuZGluZ19mdXR1cmUsIEFkYXB0ZXJBdXRvbWF0aW9uSGVscGVyLkRFRkFVTFRfVElNRU9VVCkKLQotCi1jbGFzcyBBMmRwQXV0b21hdGlvbkhlbHBlcigpOgotICAgICIiIkludm9rZSBnUlBDIG9uIHRvcHNoaW0gZm9yIEEyRFAgdGVzdGluZyIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQ9ODk5OSk6Ci0gICAgICAgIHNlbGYuY2hhbm5lbCA9IGdycGMuaW5zZWN1cmVfY2hhbm5lbCgibG9jYWxob3N0OiVkIiAlIHBvcnQpCi0gICAgICAgIHNlbGYubWVkaWFfc3R1YiA9IGZhY2FkZV9wYjJfZ3JwYy5NZWRpYVNlcnZpY2VTdHViKHNlbGYuY2hhbm5lbCkKLQotICAgICIiIlN0YXJ0IEEyZHAgc291cmNlIHByb2ZpbGUgc2VydmljZSIiIgotCi0gICAgZGVmIHN0YXJ0X3NvdXJjZShzZWxmKToKLSAgICAgICAgc2VsZi5tZWRpYV9zdHViLlN0YXJ0QTJkcChmYWNhZGVfcGIyLlN0YXJ0QTJkcFJlcXVlc3Qoc3RhcnRfYTJkcF9zb3VyY2U9VHJ1ZSkpCi0KLSAgICAiIiJTdGFydCBBMmRwIHNpbmsgcHJvZmlsZSBzZXJ2aWNlIiIiCi0KLSAgICBkZWYgc3RhcnRfc2luayhzZWxmKToKLSAgICAgICAgc2VsZi5tZWRpYV9zdHViLlN0YXJ0QTJkcChmYWNhZGVfcGIyLlN0YXJ0QTJkcFJlcXVlc3Qoc3RhcnRfYTJkcF9zaW5rPVRydWUpKQotCi0gICAgIiIiSW5pdGlhbGl6ZSBhbiBBMmRwIGNvbm5lY3Rpb24gZnJvbSBzb3VyY2UgdG8gc2luayIiIgotCi0gICAgZGVmIHNvdXJjZV9jb25uZWN0X3RvX3JlbW90ZShzZWxmLCBhZGRyZXNzPSIxMToyMjozMzo0NDo1NTo2NiIpOgotICAgICAgICBzZWxmLm1lZGlhX3N0dWIuQTJkcFNvdXJjZUNvbm5lY3QoZmFjYWRlX3BiMi5BMmRwU291cmNlQ29ubmVjdFJlcXVlc3QoYWRkcmVzcz1hZGRyZXNzKSkKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvZmFjYWRlLnByb3RvIGIvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9mYWNhZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjdlYmEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9mYWNhZGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGgudG9wc2hpbTsKLQotc2VydmljZSBBZGFwdGVyU2VydmljZSB7Ci0gIHJwYyBGZXRjaEV2ZW50cyhGZXRjaEV2ZW50c1JlcXVlc3QpIHJldHVybnMgKHN0cmVhbSBGZXRjaEV2ZW50c1Jlc3BvbnNlKSB7fQotICBycGMgVG9nZ2xlU3RhY2soVG9nZ2xlU3RhY2tSZXF1ZXN0KSByZXR1cm5zIChUb2dnbGVTdGFja1Jlc3BvbnNlKSB7fQotICBycGMgU2V0RGlzY292ZXJ5TW9kZShTZXREaXNjb3ZlcnlNb2RlUmVxdWVzdCkgcmV0dXJucyAoU2V0RGlzY292ZXJ5TW9kZVJlc3BvbnNlKSB7fQotfQotCi1lbnVtIEV2ZW50VHlwZSB7Ci0gIEFEQVBURVJfU1RBVEUgPSAwOwotICBTU1BfUkVRVUVTVCA9IDE7Ci19Ci1tZXNzYWdlIEZldGNoRXZlbnRzUmVxdWVzdCB7fQotCi1tZXNzYWdlIEZldGNoRXZlbnRzUmVzcG9uc2UgewotICBFdmVudFR5cGUgZXZlbnRfdHlwZSA9IDE7Ci0gIHN0cmluZyBkYXRhID0gMjsKLX0KLQotbWVzc2FnZSBUb2dnbGVTdGFja1JlcXVlc3QgewotICBib29sIHN0YXJ0X3N0YWNrID0gMTsgIC8vIFRydWUgZm9yIGVuYWJsZTsgZmFsc2UgZm9yIGRpc2FibGUKLX0KLQotbWVzc2FnZSBUb2dnbGVTdGFja1Jlc3BvbnNlIHt9Ci0KLW1lc3NhZ2UgU2V0RGlzY292ZXJ5TW9kZVJlcXVlc3QgewotICBib29sIGVuYWJsZV9wYWdlX3NjYW4gPSAxOwotfQotCi1tZXNzYWdlIFNldERpc2NvdmVyeU1vZGVSZXNwb25zZSB7fQotCi1zZXJ2aWNlIE1lZGlhU2VydmljZSB7Ci0gIHJwYyBTdGFydEEyZHAoU3RhcnRBMmRwUmVxdWVzdCkgcmV0dXJucyAoU3RhcnRBMmRwUmVzcG9uc2UpIHt9Ci0gIHJwYyBBMmRwU291cmNlQ29ubmVjdChBMmRwU291cmNlQ29ubmVjdFJlcXVlc3QpIHJldHVybnMgKEEyZHBTb3VyY2VDb25uZWN0UmVzcG9uc2UpIHt9Ci0gIHJwYyBBMmRwU291cmNlU2V0QWN0aXZlRGV2aWNlKEEyZHBTb3VyY2VTZXRBY3RpdmVEZXZpY2VSZXF1ZXN0KSByZXR1cm5zIChBMmRwU291cmNlU2V0QWN0aXZlRGV2aWNldFJlc3BvbnNlKSB7fQotfQotCi1tZXNzYWdlIFN0YXJ0QTJkcFJlcXVlc3QgewotICBib29sIHN0YXJ0X2EyZHBfc291cmNlID0gMTsKLSAgYm9vbCBzdGFydF9hMmRwX3NpbmsgPSAyOwotfQotCi1tZXNzYWdlIFN0YXJ0QTJkcFJlc3BvbnNlIHt9Ci0KLW1lc3NhZ2UgQTJkcFNvdXJjZUNvbm5lY3RSZXF1ZXN0IHsKLSAgc3RyaW5nIGFkZHJlc3MgPSAxOwotfQotCi1tZXNzYWdlIEEyZHBTb3VyY2VDb25uZWN0UmVzcG9uc2Uge30KLQotbWVzc2FnZSBBMmRwU291cmNlU2V0QWN0aXZlRGV2aWNlUmVxdWVzdCB7Ci0gIHN0cmluZyBhZGRyZXNzID0gMTsKLX0KLQotbWVzc2FnZSBBMmRwU291cmNlU2V0QWN0aXZlRGV2aWNldFJlc3BvbnNlIHt9CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3NyYy9hZGFwdGVyX3NlcnZpY2UucnMgYi9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3NyYy9hZGFwdGVyX3NlcnZpY2UucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Njc4ZmEuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9zcmMvYWRhcHRlcl9zZXJ2aWNlLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vISBBZGFwdGVyIHNlcnZpY2UgZmFjYWRlCi0KLXVzZSBidF90b3BzaGltOjpidGlmOwotdXNlIGJ0X3RvcHNoaW06OmJ0aWY6OntCYXNlQ2FsbGJhY2tzLCBCYXNlQ2FsbGJhY2tzRGlzcGF0Y2hlciwgQmx1ZXRvb3RoSW50ZXJmYWNlfTsKLQotdXNlIGJ0X3RvcHNoaW1fZmFjYWRlX3Byb3RvYnVmOjpmYWNhZGU6OnsKLSAgICBFdmVudFR5cGUsIEZldGNoRXZlbnRzUmVxdWVzdCwgRmV0Y2hFdmVudHNSZXNwb25zZSwgU2V0RGlzY292ZXJ5TW9kZVJlcXVlc3QsCi0gICAgU2V0RGlzY292ZXJ5TW9kZVJlc3BvbnNlLCBUb2dnbGVTdGFja1JlcXVlc3QsIFRvZ2dsZVN0YWNrUmVzcG9uc2UsCi19OwotdXNlIGJ0X3RvcHNoaW1fZmFjYWRlX3Byb3RvYnVmOjpmYWNhZGVfZ3JwYzo6e2NyZWF0ZV9hZGFwdGVyX3NlcnZpY2UsIEFkYXB0ZXJTZXJ2aWNlfTsKLXVzZSBmdXR1cmVzOjpzaW5rOjpTaW5rRXh0OwotdXNlIGdycGNpbzo6KjsKLQotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHRva2lvOjpydW50aW1lOjpSdW50aW1lOwotdXNlIHRva2lvOjpzeW5jOjptcHNjOwotdXNlIHRva2lvOjpzeW5jOjpNdXRleCBhcyBUb2tpb011dGV4OwotZm4gZ2V0X2J0X2Rpc3BhdGNoZXIoCi0gICAgYnRpZjogQXJjPE11dGV4PEJsdWV0b290aEludGVyZmFjZT4+LAotICAgIHR4OiBtcHNjOjpTZW5kZXI8QmFzZUNhbGxiYWNrcz4sCi0pIC0+IEJhc2VDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBCYXNlQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgICAgIGRpc3BhdGNoOiBCb3g6Om5ldyhtb3ZlIHxjYjogQmFzZUNhbGxiYWNrc3wgewotICAgICAgICAgICAgaWYgdHguY2xvbmUoKS50cnlfc2VuZChjYi5jbG9uZSgpKS5pc19lcnIoKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbiEoIkNhbm5vdCBzZW5kIGV2ZW50IHs6P30iLCBjYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaCBjYiB7Ci0gICAgICAgICAgICAgICAgQmFzZUNhbGxiYWNrczo6QWRhcHRlclN0YXRlKHN0YXRlKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCJTdGF0ZSBjaGFuZ2VkIHRvIHs6P30iLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJhc2VDYWxsYmFja3M6OlNzcFJlcXVlc3QoYWRkciwgXywgXywgdmFyaWFudCwgcGFzc2tleSkgPT4gewotICAgICAgICAgICAgICAgICAgICBidGlmLmxvY2soKS51bndyYXAoKS5zc3BfcmVwbHkoJmFkZHIsIHZhcmlhbnQsIDEsIHBhc3NrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfID0+ICgpLAotICAgICAgICAgICAgfQotICAgICAgICB9KSwKLSAgICB9Ci19Ci0KLS8vLyBNYWluIG9iamVjdCBmb3IgQWRhcHRlciBmYWNhZGUgc2VydmljZQotI1tkZXJpdmUoQ2xvbmUpXQotcHViIHN0cnVjdCBBZGFwdGVyU2VydmljZUltcGwgewotICAgIHJ0OiBBcmM8UnVudGltZT4sCi0gICAgYnRpZl9pbnRmOiBBcmM8TXV0ZXg8Qmx1ZXRvb3RoSW50ZXJmYWNlPj4sCi0gICAgZXZlbnRfcng6IEFyYzxUb2tpb011dGV4PG1wc2M6OlJlY2VpdmVyPEJhc2VDYWxsYmFja3M+Pj4sCi0gICAgZXZlbnRfdHg6IG1wc2M6OlNlbmRlcjxCYXNlQ2FsbGJhY2tzPiwKLX0KLQotaW1wbCBBZGFwdGVyU2VydmljZUltcGwgewotICAgIC8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJvb3QgZmFjYWRlIHNlcnZpY2UKLSAgICBwdWIgZm4gY3JlYXRlKHJ0OiBBcmM8UnVudGltZT4sIGJ0aWZfaW50ZjogQXJjPE11dGV4PEJsdWV0b290aEludGVyZmFjZT4+KSAtPiBncnBjaW86OlNlcnZpY2UgewotICAgICAgICBsZXQgKGV2ZW50X3R4LCByeCkgPSBtcHNjOjpjaGFubmVsKDEwKTsKLSAgICAgICAgYnRpZl9pbnRmLmxvY2soKS51bndyYXAoKS5pbml0aWFsaXplKAotICAgICAgICAgICAgZ2V0X2J0X2Rpc3BhdGNoZXIoYnRpZl9pbnRmLmNsb25lKCksIGV2ZW50X3R4LmNsb25lKCkpLAotICAgICAgICAgICAgdmVjIVsiSU5JVF9nZF9oY2k9dHJ1ZSIudG9fc3RyaW5nKCldLAotICAgICAgICApOwotICAgICAgICBjcmVhdGVfYWRhcHRlcl9zZXJ2aWNlKFNlbGYgewotICAgICAgICAgICAgcnQsCi0gICAgICAgICAgICBidGlmX2ludGYsCi0gICAgICAgICAgICBldmVudF9yeDogQXJjOjpuZXcoVG9raW9NdXRleDo6bmV3KHJ4KSksCi0gICAgICAgICAgICBldmVudF90eCwKLSAgICAgICAgfSkKLSAgICB9Ci19Ci0KLWltcGwgQWRhcHRlclNlcnZpY2UgZm9yIEFkYXB0ZXJTZXJ2aWNlSW1wbCB7Ci0gICAgZm4gZmV0Y2hfZXZlbnRzKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGN0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF9yZXE6IEZldGNoRXZlbnRzUmVxdWVzdCwKLSAgICAgICAgbXV0IHNpbms6IFNlcnZlclN0cmVhbWluZ1Npbms8RmV0Y2hFdmVudHNSZXNwb25zZT4sCi0gICAgKSB7Ci0gICAgICAgIGxldCByeCA9IHNlbGYuZXZlbnRfcnguY2xvbmUoKTsKLSAgICAgICAgY3R4LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgd2hpbGUgbGV0IFNvbWUoZXZlbnQpID0gcngubG9jaygpLmF3YWl0LnJlY3YoKS5hd2FpdCB7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggZXZlbnQgewotICAgICAgICAgICAgICAgICAgICBCYXNlQ2FsbGJhY2tzOjpBZGFwdGVyU3RhdGUoX3N0YXRlKSA9PiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXV0IHJzcCA9IEZldGNoRXZlbnRzUmVzcG9uc2U6Om5ldygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcnNwLmV2ZW50X3R5cGUgPSBFdmVudFR5cGU6OkFEQVBURVJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByc3AuZGF0YSA9ICJPTiIudG9fc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaW5rLnNlbmQoKHJzcCwgV3JpdGVGbGFnczo6ZGVmYXVsdCgpKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQmFzZUNhbGxiYWNrczo6U3NwUmVxdWVzdChfLCBfLCBfLCBfLCBfKSA9PiB7fQotICAgICAgICAgICAgICAgICAgICBfID0+ICgpLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkKLSAgICB9Ci0KLSAgICBmbiB0b2dnbGVfc3RhY2soCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgY3R4OiBScGNDb250ZXh0PCdfPiwKLSAgICAgICAgcmVxOiBUb2dnbGVTdGFja1JlcXVlc3QsCi0gICAgICAgIHNpbms6IFVuYXJ5U2luazxUb2dnbGVTdGFja1Jlc3BvbnNlPiwKLSAgICApIHsKLSAgICAgICAgbWF0Y2ggcmVxLnN0YXJ0X3N0YWNrIHsKLSAgICAgICAgICAgIHRydWUgPT4gc2VsZi5idGlmX2ludGYubG9jaygpLnVud3JhcCgpLmVuYWJsZSgpLAotICAgICAgICAgICAgZmFsc2UgPT4gc2VsZi5idGlmX2ludGYubG9jaygpLnVud3JhcCgpLmRpc2FibGUoKSwKLSAgICAgICAgfTsKLSAgICAgICAgY3R4LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgc2luay5zdWNjZXNzKFRvZ2dsZVN0YWNrUmVzcG9uc2U6OmRlZmF1bHQoKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgIH0pCi0gICAgfQotCi0gICAgZm4gc2V0X2Rpc2NvdmVyeV9tb2RlKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGN0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIF9yZXE6IFNldERpc2NvdmVyeU1vZGVSZXF1ZXN0LAotICAgICAgICBzaW5rOiBVbmFyeVNpbms8U2V0RGlzY292ZXJ5TW9kZVJlc3BvbnNlPiwKLSAgICApIHsKLSAgICAgICAgc2VsZi5idGlmX2ludGYubG9jaygpLnVud3JhcCgpLnNldF9hZGFwdGVyX3Byb3BlcnR5KAotICAgICAgICAgICAgYnRpZjo6Qmx1ZXRvb3RoUHJvcGVydHk6OkFkYXB0ZXJTY2FuTW9kZShidGlmOjpCdFNjYW5Nb2RlOjpDb25uZWN0YWJsZSksCi0gICAgICAgICk7Ci0KLSAgICAgICAgY3R4LnNwYXduKGFzeW5jIG1vdmUgewotICAgICAgICAgICAgc2luay5zdWNjZXNzKFNldERpc2NvdmVyeU1vZGVSZXNwb25zZTo6ZGVmYXVsdCgpKS5hd2FpdC51bndyYXAoKTsKLSAgICAgICAgfSkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3NyYy9tYWluLnJzIGIvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS9zcmMvbWFpbi5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMjdhYS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3NyYy9tYWluLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vISBTdGFydHMgdGhlIGZhY2FkZSBzZXJ2aWNlcyB0aGF0IGFsbG93IHVzIHRvIHRlc3QgdGhlIEJsdWV0b290aCBzdGFjawotCi0jW21hY3JvX3VzZV0KLWV4dGVybiBjcmF0ZSBjbGFwOwotdXNlIGNsYXA6OntBcHAsIEFyZ307Ci0KLSNbbWFjcm9fdXNlXQotZXh0ZXJuIGNyYXRlIGxhenlfc3RhdGljOwotCi11c2UgYnRfdG9wc2hpbTo6YnRpZjsKLQotdXNlIGZ1dHVyZXM6OmNoYW5uZWw6Om1wc2M7Ci11c2UgZnV0dXJlczo6ZXhlY3V0b3I6OmJsb2NrX29uOwotdXNlIGZ1dHVyZXM6OnN0cmVhbTo6U3RyZWFtRXh0OwotdXNlIGdycGNpbzo6KjsKLXVzZSBsb2c6OmRlYnVnOwotdXNlIG5peDo6c3lzOjpzaWduYWw7Ci11c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Ci11c2UgdG9raW86OnJ1bnRpbWU6OlJ1bnRpbWU7Ci0KLW1vZCBhZGFwdGVyX3NlcnZpY2U7Ci1tb2QgbWVkaWFfc2VydmljZTsKLQotLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGxpbmtpbmcsIGxpYmJ0X3NoaW1fYnJpZGdlIG5lZWRzIHN5bWJvbHMgZGVmaW5lZCBieQotLy8gYnRfc2hpbSwgaG93ZXZlciBidF9zaGltIGRlcGVuZHMgb24gcnVzdCBjcmF0ZXMgKGZ1dHVyZSwgdG9raW8pIHRoYXQKLS8vIHdlIHVzZSB0b28sIGlmIHdlIGJ1aWxkIGFuZCBsaW5rIHRoZW0gc2VwYXJhdGVseSB3ZSBlbmRzIHdpdGggZHVwbGljYXRlCi0vLyBzeW1ib2xzLiBUbyBzb2x2ZSB0aGF0IHdlIGJ1aWxkIGJ0X3NoaW0gd2l0aCBidF90b3BzaGltX2ZhY2FkZSBzbyB0aGUgcnVzdAotLy8gY29tcGlsZXIgc2hhcmUgdGhlIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLgotLy8KLS8vIFRoZSBgOjoqYCBpcyBoZXJlIHRvIGNpcmN1dmVudCB0aGUgc2luZ2xlX2NvbXBvbmVudF9wYXRoX2ltcG9ydHMgZnJvbQotLy8gY2xpcHB5IHRoYXQgaXMgZGVuaWVkIG9uIHRoZSBydXN0IGNvbW1hbmQgbGluZSBzbyB3ZSBjYW4ndCBqdXN0IGFsbG93IGl0LgotLy8gVGhpcyBpcyBmaW5lIGZvciBub3cgc2luY2UgYnRfc2hpbSBkb2Vzbid0IGV4cG9ydCBhbnl0aGluZwotI1thbGxvdyh1bnVzZWQpXQotdXNlIGJ0X3NoaW06Oio7Ci0KLWZuIG1haW4oKSB7Ci0gICAgbGV0IHNpZ2ludCA9IGluc3RhbGxfc2lnaW50KCk7Ci0gICAgYnRfY29tbW9uOjppbml0X2xvZ2dpbmcoKTsKLSAgICBsZXQgcnQgPSBBcmM6Om5ldyhSdW50aW1lOjpuZXcoKS51bndyYXAoKSk7Ci0gICAgcnQuYmxvY2tfb24oYXN5bmNfbWFpbihBcmM6OmNsb25lKCZydCksIHNpZ2ludCkpOwotfQotCi1hc3luYyBmbiBhc3luY19tYWluKHJ0OiBBcmM8UnVudGltZT4sIG11dCBzaWdpbnQ6IG1wc2M6OlVuYm91bmRlZFJlY2VpdmVyPCgpPikgewotICAgIGxldCBtYXRjaGVzID0gQXBwOjpuZXcoImJsdWV0b290aF90b3BzaGltX2ZhY2FkZSIpCi0gICAgICAgIC5hYm91dCgiVGhlIGJsdWV0b290aCB0b3BzaGltIHN0YWNrLCB3aXRoIHRlc3RpbmcgZmFjYWRlcyBlbmFibGVkIGFuZCBleHBvc2VkIHZpYSBnUlBDLiIpCi0gICAgICAgIC5hcmcoQXJnOjp3aXRoX25hbWUoImdycGMtcG9ydCIpLmxvbmcoImdycGMtcG9ydCIpLmRlZmF1bHRfdmFsdWUoIjg4OTkiKS50YWtlc192YWx1ZSh0cnVlKSkKLSAgICAgICAgLmFyZygKLSAgICAgICAgICAgIEFyZzo6d2l0aF9uYW1lKCJyb290LXNlcnZlci1wb3J0IikKLSAgICAgICAgICAgICAgICAubG9uZygicm9vdC1zZXJ2ZXItcG9ydCIpCi0gICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoIjg4OTciKQotICAgICAgICAgICAgICAgIC50YWtlc192YWx1ZSh0cnVlKSwKLSAgICAgICAgKQotICAgICAgICAuYXJnKAotICAgICAgICAgICAgQXJnOjp3aXRoX25hbWUoInNpZ25hbC1wb3J0IikKLSAgICAgICAgICAgICAgICAubG9uZygic2lnbmFsLXBvcnQiKQotICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCI4ODk1IikKLSAgICAgICAgICAgICAgICAudGFrZXNfdmFsdWUodHJ1ZSksCi0gICAgICAgICkKLSAgICAgICAgLmFyZyhBcmc6OndpdGhfbmFtZSgicm9vdGNhbmFsLXBvcnQiKS5sb25nKCJyb290Y2FuYWwtcG9ydCIpLnRha2VzX3ZhbHVlKHRydWUpKQotICAgICAgICAuYXJnKEFyZzo6d2l0aF9uYW1lKCJidHNub29wIikubG9uZygiYnRzbm9vcCIpLnRha2VzX3ZhbHVlKHRydWUpKQotICAgICAgICAuYXJnKEFyZzo6d2l0aF9uYW1lKCJidHNub296IikubG9uZygiYnRzbm9veiIpLnRha2VzX3ZhbHVlKHRydWUpKQotICAgICAgICAuYXJnKEFyZzo6d2l0aF9uYW1lKCJidGNvbmZpZyIpLmxvbmcoImJ0Y29uZmlnIikudGFrZXNfdmFsdWUodHJ1ZSkpCi0gICAgICAgIC5hcmcoCi0gICAgICAgICAgICBBcmc6OndpdGhfbmFtZSgic3RhcnQtc3RhY2stbm93IikKLSAgICAgICAgICAgICAgICAubG9uZygic3RhcnQtc3RhY2stbm93IikKLSAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgidHJ1ZSIpCi0gICAgICAgICAgICAgICAgLnRha2VzX3ZhbHVlKHRydWUpLAotICAgICAgICApCi0gICAgICAgIC5nZXRfbWF0Y2hlcygpOwotCi0gICAgbGV0IGdycGNfcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJncnBjLXBvcnQiLCB1MTYpLnVud3JhcCgpOwotICAgIGxldCBfcm9vdGNhbmFsX3BvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicm9vdGNhbmFsLXBvcnQiLCB1MTYpLm9rKCk7Ci0gICAgbGV0IGVudiA9IEFyYzo6bmV3KEVudmlyb25tZW50OjpuZXcoMikpOwotCi0gICAgbGV0IGJ0aWZfaW50ZiA9IEFyYzo6bmV3KE11dGV4OjpuZXcoYnRpZjo6Z2V0X2J0aW50ZXJmYWNlKCkudW53cmFwKCkpKTsKLQotICAgIC8vIEFkYXB0ZXJTZXJ2aWNlSW1wbDo6Y3JlYXRlIGluaXRpYWxpemVzIHRoZSBzdGFjazsgbm90IHRoZSBiZXN0IHByYWN0aWNlIGJlY2F1c2UgdGhlIHNpZGUgZWZmZWN0IGlzIGhpZGRlbgotICAgIGxldCBhZGFwdGVyX3NlcnZpY2VfaW1wbCA9Ci0gICAgICAgIGFkYXB0ZXJfc2VydmljZTo6QWRhcHRlclNlcnZpY2VJbXBsOjpjcmVhdGUocnQuY2xvbmUoKSwgYnRpZl9pbnRmLmNsb25lKCkpOwotCi0gICAgbGV0IG1lZGlhX3NlcnZpY2VfaW1wbCA9IG1lZGlhX3NlcnZpY2U6Ok1lZGlhU2VydmljZUltcGw6OmNyZWF0ZShydC5jbG9uZSgpLCBidGlmX2ludGYuY2xvbmUoKSk7Ci0KLSAgICBsZXQgc3RhcnRfc3RhY2tfbm93ID0gdmFsdWVfdCEobWF0Y2hlcywgInN0YXJ0LXN0YWNrLW5vdyIsIGJvb2wpLnVud3JhcCgpOwotCi0gICAgaWYgc3RhcnRfc3RhY2tfbm93IHsKLSAgICAgICAgYnRpZl9pbnRmLmNsb25lKCkubG9jaygpLnVud3JhcCgpLmVuYWJsZSgpOwotICAgIH0KLQotICAgIGxldCBtdXQgc2VydmVyID0gU2VydmVyQnVpbGRlcjo6bmV3KGVudikKLSAgICAgICAgLnJlZ2lzdGVyX3NlcnZpY2UoYWRhcHRlcl9zZXJ2aWNlX2ltcGwpCi0gICAgICAgIC5yZWdpc3Rlcl9zZXJ2aWNlKG1lZGlhX3NlcnZpY2VfaW1wbCkKLSAgICAgICAgLmJpbmQoIjAuMC4wLjAiLCBncnBjX3BvcnQpCi0gICAgICAgIC5idWlsZCgpCi0gICAgICAgIC51bndyYXAoKTsKLSAgICBzZXJ2ZXIuc3RhcnQoKTsKLQotICAgIHNpZ2ludC5uZXh0KCkuYXdhaXQ7Ci0gICAgYmxvY2tfb24oc2VydmVyLnNodXRkb3duKCkpLnVud3JhcCgpOwotfQotCi0vLyBUT0RPOiByZW1vdmUgYXMgdGhpcyBpcyBhIHRlbXBvcmFyeSBuaXgtYmFzZWQgaGFjayB0byBjYXRjaCBTSUdJTlQKLWZuIGluc3RhbGxfc2lnaW50KCkgLT4gbXBzYzo6VW5ib3VuZGVkUmVjZWl2ZXI8KCk+IHsKLSAgICBsZXQgKHR4LCByeCkgPSBtcHNjOjp1bmJvdW5kZWQoKTsKLSAgICAqU0lHSU5UX1RYLmxvY2soKS51bndyYXAoKSA9IFNvbWUodHgpOwotCi0gICAgbGV0IHNpZ19hY3Rpb24gPSBzaWduYWw6OlNpZ0FjdGlvbjo6bmV3KAotICAgICAgICBzaWduYWw6OlNpZ0hhbmRsZXI6OkhhbmRsZXIoaGFuZGxlX3NpZ2ludCksCi0gICAgICAgIHNpZ25hbDo6U2FGbGFnczo6ZW1wdHkoKSwKLSAgICAgICAgc2lnbmFsOjpTaWdTZXQ6OmVtcHR5KCksCi0gICAgKTsKLSAgICB1bnNhZmUgewotICAgICAgICBzaWduYWw6OnNpZ2FjdGlvbihzaWduYWw6OlNJR0lOVCwgJnNpZ19hY3Rpb24pLnVud3JhcCgpOwotICAgIH0KLQotICAgIHJ4Ci19Ci0KLWxhenlfc3RhdGljISB7Ci0gICAgc3RhdGljIHJlZiBTSUdJTlRfVFg6IE11dGV4PE9wdGlvbjxtcHNjOjpVbmJvdW5kZWRTZW5kZXI8KCk+Pj4gPSBNdXRleDo6bmV3KE5vbmUpOwotfQotCi1leHRlcm4gIkMiIGZuIGhhbmRsZV9zaWdpbnQoXzogaTMyKSB7Ci0gICAgbGV0IG11dCBzaWdpbnRfdHggPSBTSUdJTlRfVFgubG9jaygpLnVud3JhcCgpOwotICAgIGlmIGxldCBTb21lKHR4KSA9ICYqc2lnaW50X3R4IHsKLSAgICAgICAgZGVidWchKCJTdG9wcGluZyBnUlBDIHJvb3Qgc2VydmVyIGR1ZSB0byBTSUdJTlQiKTsKLSAgICAgICAgdHgudW5ib3VuZGVkX3NlbmQoKCkpLnVud3JhcCgpOwotICAgIH0KLSAgICAqc2lnaW50X3R4ID0gTm9uZTsKLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvc3JjL21lZGlhX3NlcnZpY2UucnMgYi9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3NyYy9tZWRpYV9zZXJ2aWNlLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTk4YWY0Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvc3JjL21lZGlhX3NlcnZpY2UucnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyEgTWVkaWEgc2VydmljZSBmYWNhZGUKLQotdXNlIGJ0X3RvcHNoaW06OmJ0aWY6OkJsdWV0b290aEludGVyZmFjZTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6YTJkcDo6ewotICAgIEEyZHAsIEEyZHBDYWxsYmFja3NEaXNwYXRjaGVyLCBBMmRwU2luaywgQTJkcFNpbmtDYWxsYmFja3NEaXNwYXRjaGVyLAotfTsKLXVzZSBidF90b3BzaGltOjpwcm9maWxlczo6YXZyY3A6OntBdnJjcCwgQXZyY3BDYWxsYmFja3NEaXNwYXRjaGVyfTsKLXVzZSBidF90b3BzaGltX2ZhY2FkZV9wcm90b2J1Zjo6ZmFjYWRlOjp7Ci0gICAgQTJkcFNvdXJjZUNvbm5lY3RSZXF1ZXN0LCBBMmRwU291cmNlQ29ubmVjdFJlc3BvbnNlLCBTdGFydEEyZHBSZXF1ZXN0LCBTdGFydEEyZHBSZXNwb25zZSwKLX07Ci11c2UgYnRfdG9wc2hpbV9mYWNhZGVfcHJvdG9idWY6OmZhY2FkZV9ncnBjOjp7Y3JlYXRlX21lZGlhX3NlcnZpY2UsIE1lZGlhU2VydmljZX07Ci0KLXVzZSBncnBjaW86Oio7Ci0KLXVzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKLXVzZSB0b2tpbzo6cnVudGltZTo6UnVudGltZTsKLQotZm4gZ2V0X2EyZHBfZGlzcGF0Y2hlcigpIC0+IEEyZHBDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBBMmRwQ2FsbGJhY2tzRGlzcGF0Y2hlciB7IGRpc3BhdGNoOiBCb3g6Om5ldyhtb3ZlIHxfY2J8IHt9KSB9Ci19Ci0KLWZuIGdldF9hMmRwX3NpbmtfZGlzcGF0Y2hlcigpIC0+IEEyZHBTaW5rQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgQTJkcFNpbmtDYWxsYmFja3NEaXNwYXRjaGVyIHsgZGlzcGF0Y2g6IEJveDo6bmV3KG1vdmUgfF9jYnwge30pIH0KLX0KLQotZm4gZ2V0X2F2cmNwX2Rpc3BhdGNoZXIoKSAtPiBBdnJjcENhbGxiYWNrc0Rpc3BhdGNoZXIgewotICAgIEF2cmNwQ2FsbGJhY2tzRGlzcGF0Y2hlciB7IGRpc3BhdGNoOiBCb3g6Om5ldyhtb3ZlIHxfY2J8IHt9KSB9Ci19Ci0KLS8vLyBNYWluIG9iamVjdCBmb3IgTWVkaWEgZmFjYWRlIHNlcnZpY2UKLSNbZGVyaXZlKENsb25lKV0KLXB1YiBzdHJ1Y3QgTWVkaWFTZXJ2aWNlSW1wbCB7Ci0gICAgcnQ6IEFyYzxSdW50aW1lPiwKLSAgICBwdWIgYnRpZl9hMmRwOiBBcmM8TXV0ZXg8QTJkcD4+LAotICAgIGJ0aWZfYTJkcF9zaW5rOiBBcmM8TXV0ZXg8QTJkcFNpbms+PiwKLSAgICBwdWIgYnRpZl9hdnJjcDogQXJjPE11dGV4PEF2cmNwPj4sCi19Ci0KLWltcGwgTWVkaWFTZXJ2aWNlSW1wbCB7Ci0gICAgLy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcm9vdCBmYWNhZGUgc2VydmljZQotICAgIHB1YiBmbiBjcmVhdGUocnQ6IEFyYzxSdW50aW1lPiwgYnRpZl9pbnRmOiBBcmM8TXV0ZXg8Qmx1ZXRvb3RoSW50ZXJmYWNlPj4pIC0+IGdycGNpbzo6U2VydmljZSB7Ci0gICAgICAgIGxldCBtdXQgYnRpZl9hMmRwID0gQTJkcDo6bmV3KCZidGlmX2ludGYubG9jaygpLnVud3JhcCgpKTsKLSAgICAgICAgbGV0IGJ0aWZfYTJkcF9zaW5rID0gQTJkcFNpbms6Om5ldygmYnRpZl9pbnRmLmxvY2soKS51bndyYXAoKSk7Ci0gICAgICAgIGxldCBtdXQgYnRpZl9hdnJjcCA9IEF2cmNwOjpuZXcoJmJ0aWZfaW50Zi5sb2NrKCkudW53cmFwKCkpOwotICAgICAgICBidGlmX2EyZHAuaW5pdGlhbGl6ZShnZXRfYTJkcF9kaXNwYXRjaGVyKCkpOwotICAgICAgICBidGlmX2F2cmNwLmluaXRpYWxpemUoZ2V0X2F2cmNwX2Rpc3BhdGNoZXIoKSk7Ci0KLSAgICAgICAgY3JlYXRlX21lZGlhX3NlcnZpY2UoU2VsZiB7Ci0gICAgICAgICAgICBydCwKLSAgICAgICAgICAgIGJ0aWZfYTJkcDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhidGlmX2EyZHApKSwKLSAgICAgICAgICAgIGJ0aWZfYTJkcF9zaW5rOiBBcmM6Om5ldyhNdXRleDo6bmV3KGJ0aWZfYTJkcF9zaW5rKSksCi0gICAgICAgICAgICBidGlmX2F2cmNwOiBBcmM6Om5ldyhNdXRleDo6bmV3KGJ0aWZfYXZyY3ApKSwKLSAgICAgICAgfSkKLSAgICB9Ci19Ci0KLWltcGwgTWVkaWFTZXJ2aWNlIGZvciBNZWRpYVNlcnZpY2VJbXBsIHsKLSAgICBmbiBzdGFydF9hMmRwKAotICAgICAgICAmbXV0IHNlbGYsCi0gICAgICAgIGN0eDogUnBjQ29udGV4dDwnXz4sCi0gICAgICAgIHJlcTogU3RhcnRBMmRwUmVxdWVzdCwKLSAgICAgICAgc2luazogVW5hcnlTaW5rPFN0YXJ0QTJkcFJlc3BvbnNlPiwKLSAgICApIHsKLSAgICAgICAgaWYgcmVxLnN0YXJ0X2EyZHBfc291cmNlIHsKLSAgICAgICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgICAgICBzaW5rLnN1Y2Nlc3MoU3RhcnRBMmRwUmVzcG9uc2U6OmRlZmF1bHQoKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICB9KQotICAgICAgICB9IGVsc2UgaWYgcmVxLnN0YXJ0X2EyZHBfc2luayB7Ci0gICAgICAgICAgICBzZWxmLmJ0aWZfYTJkcF9zaW5rLmxvY2soKS51bndyYXAoKS5pbml0aWFsaXplKGdldF9hMmRwX3NpbmtfZGlzcGF0Y2hlcigpKTsKLSAgICAgICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgICAgICBzaW5rLnN1Y2Nlc3MoU3RhcnRBMmRwUmVzcG9uc2U6OmRlZmF1bHQoKSkuYXdhaXQudW53cmFwKCk7Ci0gICAgICAgICAgICB9KQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm4gYTJkcF9zb3VyY2VfY29ubmVjdCgKLSAgICAgICAgJm11dCBzZWxmLAotICAgICAgICBjdHg6IFJwY0NvbnRleHQ8J18+LAotICAgICAgICByZXE6IEEyZHBTb3VyY2VDb25uZWN0UmVxdWVzdCwKLSAgICAgICAgc2luazogVW5hcnlTaW5rPEEyZHBTb3VyY2VDb25uZWN0UmVzcG9uc2U+LAotICAgICkgewotICAgICAgICBsZXQgYTJkcCA9IHNlbGYuYnRpZl9hMmRwLmNsb25lKCk7Ci0gICAgICAgIGN0eC5zcGF3bihhc3luYyBtb3ZlIHsKLSAgICAgICAgICAgIGEyZHAubG9jaygpLnVud3JhcCgpLmNvbm5lY3QocmVxLmFkZHJlc3MuY2xvbmUoKSk7Ci0gICAgICAgICAgICBhMmRwLmxvY2soKS51bndyYXAoKS5zZXRfYWN0aXZlX2RldmljZShyZXEuYWRkcmVzcy5jbG9uZSgpKTsKLSAgICAgICAgICAgIHNpbmsuc3VjY2VzcyhBMmRwU291cmNlQ29ubmVjdFJlc3BvbnNlOjpkZWZhdWx0KCkpLmF3YWl0LnVud3JhcCgpOwotICAgICAgICB9KQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvdG9wc2hpbV9iYXNlX3Rlc3QucHkgYi9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3RvcHNoaW1fYmFzZV90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmE5MDc2Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvdG9wc2hpbV9iYXNlX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIxIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgaW1wb3J0bGliCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1pbXBvcnQgc2lnbmFsCi1pbXBvcnQgc3VicHJvY2VzcwotCi1mcm9tIGJsdWViZXJyeS50ZXN0cy5nZC5jZXJ0LmNvbnRleHQgaW1wb3J0IGdldF9jdXJyZW50X2NvbnRleHQKLWZyb20gYmx1ZWJlcnJ5LnRlc3RzLmdkLmNlcnQudHJhY2Vsb2dnZXIgaW1wb3J0IFRyYWNlTG9nZ2VyCi1mcm9tIGNlcnQuYXN5bmNfc3VicHJvY2Vzc19sb2dnZXIgaW1wb3J0IEFzeW5jU3VicHJvY2Vzc0xvZ2dlcgotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBnZXRfZ2Rfcm9vdAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCBnZXRfZ2Rfcm9vdAotZnJvbSBjZXJ0Lm9zX3V0aWxzIGltcG9ydCByZWFkX2NyYXNoX3NuaXBwZXRfYW5kX2xvZ190YWlsCi1mcm9tIGNlcnQub3NfdXRpbHMgaW1wb3J0IGlzX3N1YnByb2Nlc3NfYWxpdmUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgbWFrZV9wb3J0c19hdmFpbGFibGUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgVGVybWluYWxDb2xvcgotZnJvbSBtb2JseSBpbXBvcnQgYXNzZXJ0cwotZnJvbSBtb2JseSBpbXBvcnQgYmFzZV90ZXN0Ci0KLUNPTlRST0xMRVJfQ09ORklHX05BTUUgPSAiR2REZXZpY2UiCi0KLQotZGVmIHNldHVwX3Rlc3RfY29yZSh2ZXJib3NlX21vZGUsIGxvZ19wYXRoX2Jhc2UsIGNvbnRyb2xsZXJfY29uZmlncyk6Ci0gICAgaW5mbyA9IHt9Ci0gICAgaW5mb1snY29udHJvbGxlcl9jb25maWdzJ10gPSBjb250cm9sbGVyX2NvbmZpZ3MKLQotICAgICMgU3RhcnQgcm9vdC1jYW5hbCBpZiBuZWVkZWQKLSAgICBpbmZvWydyb290Y2FuYWxfcnVubmluZyddID0gRmFsc2UKLSAgICBpbmZvWydyb290Y2FuYWxfbG9ncGF0aCddID0gTm9uZQotICAgIGluZm9bJ3Jvb3RjYW5hbF9wcm9jZXNzJ10gPSBOb25lCi0gICAgaW5mb1sncm9vdGNhbmFsX2xvZ2dlciddID0gTm9uZQotICAgIGlmICdyb290Y2FuYWwnIG5vdCBpbiBpbmZvWydjb250cm9sbGVyX2NvbmZpZ3MnXToKLSAgICAgICAgcmV0dXJuCi0gICAgaW5mb1sncm9vdGNhbmFsX3J1bm5pbmcnXSA9IFRydWUKLSAgICAjIEdldCByb290IGNhbmFsIGJpbmFyeQotICAgIHJvb3RjYW5hbCA9IG9zLnBhdGguam9pbihnZXRfZ2Rfcm9vdCgpLCAicm9vdC1jYW5hbCIpCi0gICAgaW5mb1sncm9vdGNhbmFsJ10gPSByb290Y2FuYWwKLSAgICBpbmZvWydyb290Y2FuYWxfZXhpc3QnXSA9IG9zLnBhdGguaXNmaWxlKHJvb3RjYW5hbCkKLSAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUocm9vdGNhbmFsKToKLSAgICAgICAgcmV0dXJuIGluZm8KLSAgICAjIEdldCByb290IGNhbmFsIGxvZwotICAgIHJvb3RjYW5hbF9sb2dwYXRoID0gb3MucGF0aC5qb2luKGxvZ19wYXRoX2Jhc2UsICdyb290Y2FuYWxfbG9ncy50eHQnKQotICAgIGluZm9bJ3Jvb3RjYW5hbF9sb2dwYXRoJ10gPSByb290Y2FuYWxfbG9ncGF0aAotICAgICMgTWFrZSBzdXJlIHBvcnRzIGFyZSBhdmFpbGFibGUKLSAgICByb290Y2FuYWxfY29uZmlnID0gaW5mb1snY29udHJvbGxlcl9jb25maWdzJ11bJ3Jvb3RjYW5hbCddCi0gICAgcm9vdGNhbmFsX3Rlc3RfcG9ydCA9IGludChyb290Y2FuYWxfY29uZmlnLmdldCgidGVzdF9wb3J0IiwgIjY0MDEiKSkKLSAgICByb290Y2FuYWxfaGNpX3BvcnQgPSBpbnQocm9vdGNhbmFsX2NvbmZpZy5nZXQoImhjaV9wb3J0IiwgIjY0MDIiKSkKLSAgICByb290Y2FuYWxfbGlua19sYXllcl9wb3J0ID0gaW50KHJvb3RjYW5hbF9jb25maWcuZ2V0KCJsaW5rX2xheWVyX3BvcnQiLCAiNjQwMyIpKQotCi0gICAgaW5mb1snbWFrZV9yb290Y2FuYWxfcG9ydHNfYXZhaWxhYmxlJ10gPSBtYWtlX3BvcnRzX2F2YWlsYWJsZSgocm9vdGNhbmFsX3Rlc3RfcG9ydCwgcm9vdGNhbmFsX2hjaV9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RjYW5hbF9saW5rX2xheWVyX3BvcnQpKQotICAgIGlmIG5vdCBtYWtlX3BvcnRzX2F2YWlsYWJsZSgocm9vdGNhbmFsX3Rlc3RfcG9ydCwgcm9vdGNhbmFsX2hjaV9wb3J0LCByb290Y2FuYWxfbGlua19sYXllcl9wb3J0KSk6Ci0gICAgICAgIHJldHVybiBpbmZvCi0KLSAgICAjIFN0YXJ0IHJvb3QgY2FuYWwgcHJvY2VzcwotICAgIHJvb3RjYW5hbF9jbWQgPSBbcm9vdGNhbmFsLCBzdHIocm9vdGNhbmFsX3Rlc3RfcG9ydCksIHN0cihyb290Y2FuYWxfaGNpX3BvcnQpLCBzdHIocm9vdGNhbmFsX2xpbmtfbGF5ZXJfcG9ydCldCi0gICAgaW5mb1sncm9vdGNhbmFsX2NtZCddID0gcm9vdGNhbmFsX2NtZAotCi0gICAgcm9vdGNhbmFsX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKAotICAgICAgICByb290Y2FuYWxfY21kLAotICAgICAgICBjd2Q9Z2V0X2dkX3Jvb3QoKSwKLSAgICAgICAgZW52PW9zLmVudmlyb24uY29weSgpLAotICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAotICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCi0gICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQotCi0gICAgaW5mb1sncm9vdGNhbmFsX3Byb2Nlc3MnXSA9IHJvb3RjYW5hbF9wcm9jZXNzCi0gICAgaWYgcm9vdGNhbmFsX3Byb2Nlc3M6Ci0gICAgICAgIGluZm9bJ2lzX3Jvb3RjYW5hbF9wcm9jZXNzX3N0YXJ0ZWQnXSA9IFRydWUKLSAgICBlbHNlOgotICAgICAgICBpbmZvWydpc19yb290Y2FuYWxfcHJvY2Vzc19zdGFydGVkJ10gPSBGYWxzZQotICAgICAgICByZXR1cm4gaW5mbwotICAgIGluZm9bJ2lzX3N1YnByb2Nlc3NfYWxpdmUnXSA9IGlzX3N1YnByb2Nlc3NfYWxpdmUocm9vdGNhbmFsX3Byb2Nlc3MpCi0gICAgaWYgbm90IGlzX3N1YnByb2Nlc3NfYWxpdmUocm9vdGNhbmFsX3Byb2Nlc3MpOgotICAgICAgICBpbmZvWydpc19zdWJwcm9jZXNzX2FsaXZlJ10gPSBGYWxzZQotICAgICAgICByZXR1cm4gaW5mbwotCi0gICAgaW5mb1sncm9vdGNhbmFsX2xvZ2dlciddID0gQXN5bmNTdWJwcm9jZXNzTG9nZ2VyKAotICAgICAgICByb290Y2FuYWxfcHJvY2VzcywgW3Jvb3RjYW5hbF9sb2dwYXRoXSwKLSAgICAgICAgbG9nX3RvX3N0ZG91dD12ZXJib3NlX21vZGUsCi0gICAgICAgIHRhZz0icm9vdGNhbmFsIiwKLSAgICAgICAgY29sb3I9VGVybWluYWxDb2xvci5NQUdFTlRBKQotCi0gICAgIyBNb2RpZnkgdGhlIGRldmljZSBjb25maWcgdG8gaW5jbHVkZSB0aGUgY29ycmVjdCByb290LWNhbmFsIHBvcnQKLSAgICBmb3IgZ2RfZGV2aWNlX2NvbmZpZyBpbiBpbmZvWydjb250cm9sbGVyX2NvbmZpZ3MnXS5nZXQoIkdkRGV2aWNlIik6Ci0gICAgICAgIGdkX2RldmljZV9jb25maWdbInJvb3RjYW5hbF9wb3J0Il0gPSBzdHIocm9vdGNhbmFsX2hjaV9wb3J0KQotCi0gICAgcmV0dXJuIGluZm8KLQotCi1kZWYgdGVhcmRvd25fY2xhc3NfY29yZShyb290Y2FuYWxfcnVubmluZywgcm9vdGNhbmFsX3Byb2Nlc3MsIHJvb3RjYW5hbF9sb2dnZXIsIHN1YnByb2Nlc3Nfd2FpdF90aW1lb3V0X3NlY29uZHMpOgotICAgIGlmIHJvb3RjYW5hbF9ydW5uaW5nOgotICAgICAgICBzdG9wX3NpZ25hbCA9IHNpZ25hbC5TSUdJTlQKLSAgICAgICAgcm9vdGNhbmFsX3Byb2Nlc3Muc2VuZF9zaWduYWwoc3RvcF9zaWduYWwpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybl9jb2RlID0gcm9vdGNhbmFsX3Byb2Nlc3Mud2FpdCh0aW1lb3V0PXN1YnByb2Nlc3Nfd2FpdF90aW1lb3V0X3NlY29uZHMpCi0gICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiRmFpbGVkIHRvIGludGVycnVwdCByb290IGNhbmFsIHZpYSBTSUdJTlQsIHNlbmRpbmcgU0lHS0lMTCIpCi0gICAgICAgICAgICBzdG9wX3NpZ25hbCA9IHNpZ25hbC5TSUdLSUxMCi0gICAgICAgICAgICByb290Y2FuYWxfcHJvY2Vzcy5raWxsKCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXR1cm5fY29kZSA9IHJvb3RjYW5hbF9wcm9jZXNzLndhaXQodGltZW91dD1zdWJwcm9jZXNzX3dhaXRfdGltZW91dF9zZWNvbmRzKQotICAgICAgICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuVGltZW91dEV4cGlyZWQ6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiRmFpbGVkIHRvIGtpbGwgcm9vdCBjYW5hbCIpCi0gICAgICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSAtNjU1MzYKLSAgICAgICAgaWYgcmV0dXJuX2NvZGUgIT0gMCBhbmQgcmV0dXJuX2NvZGUgIT0gLXN0b3Bfc2lnbmFsOgotICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigicm9vdGNhbmFsIHN0b3BwZWQgd2l0aCBjb2RlOiAlZCIgJSByZXR1cm5fY29kZSkKLSAgICAgICAgcm9vdGNhbmFsX2xvZ2dlci5zdG9wKCkKLQotCi1kZWYgZHVtcF9jcmFzaGVzX2NvcmUoZHV0LCBjZXJ0LCByb290Y2FuYWxfcnVubmluZywgcm9vdGNhbmFsX3Byb2Nlc3MsIHJvb3RjYW5hbF9sb2dwYXRoKToKLSAgICBkdXRfY3Jhc2gsIGR1dF9sb2dfdGFpbCA9IGR1dC5nZXRfY3Jhc2hfc25pcHBldF9hbmRfbG9nX3RhaWwoKQotICAgIGNlcnRfY3Jhc2gsIGNlcnRfbG9nX3RhaWwgPSBjZXJ0LmdldF9jcmFzaF9zbmlwcGV0X2FuZF9sb2dfdGFpbCgpCi0gICAgcm9vdGNhbmFsX2NyYXNoID0gTm9uZQotICAgIHJvb3RjYW5hbF9sb2dfdGFpbCA9IE5vbmUKLSAgICBpZiByb290Y2FuYWxfcnVubmluZyBhbmQgbm90IGlzX3N1YnByb2Nlc3NfYWxpdmUocm9vdGNhbmFsX3Byb2Nlc3MpOgotICAgICAgICByb290Y2FuYWxfY3Jhc2gsIHJvb2NhbmFsX2xvZ190YWlsID0gcmVhZF9jcmFzaF9zbmlwcGV0X2FuZF9sb2dfdGFpbChyb290Y2FuYWxfbG9ncGF0aCkKLQotICAgIGNyYXNoX2RldGFpbCA9ICIiCi0gICAgaWYgZHV0X2NyYXNoIG9yIGNlcnRfY3Jhc2ggb3Igcm9vdGNhbmFsX2NyYXNoOgotICAgICAgICBpZiByb290Y2FuYWxfY3Jhc2g6Ci0gICAgICAgICAgICBjcmFzaF9kZXRhaWwgKz0gInJvb3RjYW5hbCBjcmFzaGVkOlxuXG4lc1xuXG4iICUgcm9vdGNhbmFsX2NyYXNoCi0gICAgICAgIGlmIGR1dF9jcmFzaDoKLSAgICAgICAgICAgIGNyYXNoX2RldGFpbCArPSAiZHV0IHN0YWNrIGNyYXNoZWQ6XG5cbiVzXG5cbiIgJSBkdXRfY3Jhc2gKLSAgICAgICAgaWYgY2VydF9jcmFzaDoKLSAgICAgICAgICAgIGNyYXNoX2RldGFpbCArPSAiY2VydCBzdGFjayBjcmFzaGVkOlxuXG4lc1xuXG4iICUgY2VydF9jcmFzaAotICAgIGVsc2U6Ci0gICAgICAgIGlmIHJvb3RjYW5hbF9sb2dfdGFpbDoKLSAgICAgICAgICAgIGNyYXNoX2RldGFpbCArPSAicm9vdGNhbmFsIGxvZyB0YWlsOlxuXG4lc1xuXG4iICUgcm9vdGNhbmFsX2xvZ190YWlsCi0gICAgICAgIGlmIGR1dF9sb2dfdGFpbDoKLSAgICAgICAgICAgIGNyYXNoX2RldGFpbCArPSAiZHV0IGxvZyB0YWlsOlxuXG4lc1xuXG4iICUgZHV0X2xvZ190YWlsCi0gICAgICAgIGlmIGNlcnRfbG9nX3RhaWw6Ci0gICAgICAgICAgICBjcmFzaF9kZXRhaWwgKz0gImNlcnQgbG9nIHRhaWw6XG5cbiVzXG5cbiIgJSBjZXJ0X2xvZ190YWlsCi0KLSAgICByZXR1cm4gY3Jhc2hfZGV0YWlsCi0KLQotY2xhc3MgVG9wc2hpbUJhc2VUZXN0KGJhc2VfdGVzdC5CYXNlVGVzdENsYXNzKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgc3VwZXIoKS5zZXR1cF90ZXN0KCkKLSAgICAgICAgc2VsZi5sb2cgPSBUcmFjZUxvZ2dlcihsb2dnaW5nLmdldExvZ2dlcigpKQotICAgICAgICBzZWxmLmxvZ19wYXRoX2Jhc2UgPSBnZXRfY3VycmVudF9jb250ZXh0KCkuZ2V0X2Z1bGxfb3V0cHV0X3BhdGgoKQotICAgICAgICBzZWxmLnZlcmJvc2VfbW9kZSA9IGJvb2woc2VsZi51c2VyX3BhcmFtcy5nZXQoJ3ZlcmJvc2VfbW9kZScsIEZhbHNlKSkKLSAgICAgICAgZm9yIGNvbmZpZyBpbiBzZWxmLmNvbnRyb2xsZXJfY29uZmlnc1tDT05UUk9MTEVSX0NPTkZJR19OQU1FXToKLSAgICAgICAgICAgIGNvbmZpZ1sndmVyYm9zZV9tb2RlJ10gPSBzZWxmLnZlcmJvc2VfbW9kZQotCi0gICAgICAgIHNlbGYuaW5mbyA9IHNldHVwX3Rlc3RfY29yZSgKLSAgICAgICAgICAgIHZlcmJvc2VfbW9kZT1zZWxmLnZlcmJvc2VfbW9kZSwKLSAgICAgICAgICAgIGxvZ19wYXRoX2Jhc2U9c2VsZi5sb2dfcGF0aF9iYXNlLAotICAgICAgICAgICAgY29udHJvbGxlcl9jb25maWdzPXNlbGYuY29udHJvbGxlcl9jb25maWdzKQotICAgICAgICBzZWxmLnJvb3RjYW5hbF9ydW5uaW5nID0gc2VsZi5pbmZvWydyb290Y2FuYWxfcnVubmluZyddCi0gICAgICAgIHNlbGYucm9vdGNhbmFsX2xvZ3BhdGggPSBzZWxmLmluZm9bJ3Jvb3RjYW5hbF9sb2dwYXRoJ10KLSAgICAgICAgc2VsZi5yb290Y2FuYWxfcHJvY2VzcyA9IHNlbGYuaW5mb1sncm9vdGNhbmFsX3Byb2Nlc3MnXQotICAgICAgICBzZWxmLnJvb3RjYW5hbF9sb2dnZXIgPSBzZWxmLmluZm9bJ3Jvb3RjYW5hbF9sb2dnZXInXQotCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5pbmZvWydyb290Y2FuYWxfZXhpc3QnXSwgIlJvb3QgY2FuYWwgZG9lcyBub3QgZXhpc3QgYXQgJXMiICUgc2VsZi5pbmZvWydyb290Y2FuYWwnXSkKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZShzZWxmLmluZm9bJ21ha2Vfcm9vdGNhbmFsX3BvcnRzX2F2YWlsYWJsZSddLCAiRmFpbGVkIHRvIG1ha2Ugcm9vdCBjYW5hbCBwb3J0cyBhdmFpbGFibGUiKQotCi0gICAgICAgIHNlbGYubG9nLmRlYnVnKCJSdW5uaW5nICVzIiAlICIgIi5qb2luKHNlbGYuaW5mb1sncm9vdGNhbmFsX2NtZCddKSkKLSAgICAgICAgYXNzZXJ0cy5hc3NlcnRfdHJ1ZSgKLSAgICAgICAgICAgIHNlbGYuaW5mb1snaXNfcm9vdGNhbmFsX3Byb2Nlc3Nfc3RhcnRlZCddLCBtc2c9IkNhbm5vdCBzdGFydCByb290LWNhbmFsIGF0ICIgKyBzdHIoc2VsZi5pbmZvWydyb290Y2FuYWwnXSkpCi0gICAgICAgIGFzc2VydHMuYXNzZXJ0X3RydWUoc2VsZi5pbmZvWydpc19zdWJwcm9jZXNzX2FsaXZlJ10sIG1zZz0icm9vdC1jYW5hbCBzdG9wcGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJ1bm5pbmciKQotCi0gICAgICAgIHNlbGYuY29udHJvbGxlcl9jb25maWdzID0gc2VsZi5pbmZvWydjb250cm9sbGVyX2NvbmZpZ3MnXQotCi0gICAgICAgIGNvbnRyb2xsZXJzID0gc2VsZi5yZWdpc3Rlcl9jb250cm9sbGVyKGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCdydXN0LnRvcHNoaW0uZmFjYWRlLnRvcHNoaW1fZGV2aWNlJykpCi0gICAgICAgIHNlbGYuY2VydF9wb3J0ID0gY29udHJvbGxlcnNbMF0uZ3JwY19wb3J0Ci0gICAgICAgIHNlbGYuZHV0X3BvcnQgPSBjb250cm9sbGVyc1sxXS5ncnBjX3BvcnQKLQotICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgdGVhcmRvd25fdGVzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIHN1cGVyKCkudGVhcmRvd25fdGVzdCgpCi0KLSAgICBkZWYgdGVhcmRvd25fY2xhc3Moc2VsZik6Ci0gICAgICAgIHRlYXJkb3duX2NsYXNzX2NvcmUoCi0gICAgICAgICAgICByb290Y2FuYWxfcnVubmluZz1zZWxmLnJvb3RjYW5hbF9ydW5uaW5nLAotICAgICAgICAgICAgcm9vdGNhbmFsX3Byb2Nlc3M9c2VsZi5yb290Y2FuYWxfcHJvY2VzcywKLSAgICAgICAgICAgIHJvb3RjYW5hbF9sb2dnZXI9c2VsZi5yb290Y2FuYWxfbG9nZ2VyLAotICAgICAgICAgICAgc3VicHJvY2Vzc193YWl0X3RpbWVvdXRfc2Vjb25kcz0xKQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS90b3BzaGltX2RldmljZS5weSBiL2dkL3J1c3QvdG9wc2hpbS9mYWNhZGUvdG9wc2hpbV9kZXZpY2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYjAyMzYuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS90b3BzaGltX2RldmljZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAxOSAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBibHVlYmVycnkudGVzdHMuZ2QuY2VydC5nZF9kZXZpY2UgaW1wb3J0IEdkSG9zdE9ubHlEZXZpY2UKLWZyb20gY2VydC5nZF9kZXZpY2VfbGliIGltcG9ydCBjcmVhdGVfY29yZQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IGRlc3Ryb3lfY29yZQotZnJvbSBjZXJ0LmdkX2RldmljZV9saWIgaW1wb3J0IE1PQkxZX0NPTlRST0xMRVJfQ09ORklHX05BTUUKLWZyb20gY2VydC5vc191dGlscyBpbXBvcnQgZ2V0X2dkX3Jvb3QKLQotCi1kZWYgY3JlYXRlKGNvbmZpZ3MpOgotICAgIGNyZWF0ZV9jb3JlKGNvbmZpZ3MpCi0gICAgcmV0dXJuIGdldF9pbnN0YW5jZXNfd2l0aF9jb25maWdzKGNvbmZpZ3MpCi0KLQotZGVmIGRlc3Ryb3koZGV2aWNlcyk6Ci0gICAgZGVzdHJveV9jb3JlKGRldmljZXMpCi0KLQotZGVmIHJlcGxhY2VfdmFyc19mb3JfdG9wc2hpbShzdHJpbmcsIGNvbmZpZyk6Ci0gICAgc2VyaWFsX251bWJlciA9IGNvbmZpZy5nZXQoInNlcmlhbF9udW1iZXIiKQotICAgIGlmIHNlcmlhbF9udW1iZXIgaXMgTm9uZToKLSAgICAgICAgc2VyaWFsX251bWJlciA9ICIiCi0gICAgcm9vdGNhbmFsX3BvcnQgPSBjb25maWcuZ2V0KCJyb290Y2FuYWxfcG9ydCIpCi0gICAgaWYgcm9vdGNhbmFsX3BvcnQgaXMgTm9uZToKLSAgICAgICAgcm9vdGNhbmFsX3BvcnQgPSAiIgotICAgIGlmIHNlcmlhbF9udW1iZXIgPT0gIkRVVCIgb3Igc2VyaWFsX251bWJlciA9PSAiQ0VSVCI6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRGlkIHlvdSBmb3JnZXQgdG8gY29uZmlndXJlIHRoZSBzZXJpYWwgbnVtYmVyPyIpCi0gICAgIyBXZSBydW4gYnRfdG9wc2hpbV9mYWNhZGUgaW5zdGVhZCBvZiBibHVldG9vdGhfc3RhY2tfd2l0aF9mYWNhZGUKLSAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoIiRHRF9ST09UIiwgZ2V0X2dkX3Jvb3QoKSkgXAotICAgICAgICAgICAgICAgICAucmVwbGFjZSgiYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlIiwgImJ0X3RvcHNoaW1fZmFjYWRlIikgXAotICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJChncnBjX3BvcnQpIiwgY29uZmlnLmdldCgiZ3JwY19wb3J0IikpIFwKLSAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIiQoZ3JwY19yb290X3NlcnZlcl9wb3J0KSIsIGNvbmZpZy5nZXQoImdycGNfcm9vdF9zZXJ2ZXJfcG9ydCIpKSBcCi0gICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkKHJvb3RjYW5hbF9wb3J0KSIsIHJvb3RjYW5hbF9wb3J0KSBcCi0gICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkKHNpZ25hbF9wb3J0KSIsIGNvbmZpZy5nZXQoInNpZ25hbF9wb3J0IikpIFwKLSAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIiQoc2VyaWFsX251bWJlcikiLCBzZXJpYWxfbnVtYmVyKQotCi0KLWRlZiBnZXRfaW5zdGFuY2VzX3dpdGhfY29uZmlncyhjb25maWdzKToKLSAgICBsb2dnaW5nLmluZm8oY29uZmlncykKLSAgICBkZXZpY2VzID0gW10KLSAgICBmb3IgY29uZmlnIGluIGNvbmZpZ3M6Ci0gICAgICAgIHJlc29sdmVkX2NtZCA9IFtdCi0gICAgICAgIGZvciBhcmcgaW4gY29uZmlnWyJjbWQiXToKLSAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoYXJnKQotICAgICAgICAgICAgcmVzb2x2ZWRfY21kLmFwcGVuZChyZXBsYWNlX3ZhcnNfZm9yX3RvcHNoaW0oYXJnLCBjb25maWcpKQotICAgICAgICB2ZXJib3NlX21vZGUgPSBib29sKGNvbmZpZy5nZXQoJ3ZlcmJvc2VfbW9kZScsIEZhbHNlKSkKLSAgICAgICAgZGV2aWNlID0gR2RIb3N0T25seURldmljZShjb25maWdbImdycGNfcG9ydCJdLCBjb25maWdbImdycGNfcm9vdF9zZXJ2ZXJfcG9ydCJdLCBjb25maWdbInNpZ25hbF9wb3J0Il0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRfY21kLCBjb25maWdbImxhYmVsIl0sIE1PQkxZX0NPTlRST0xMRVJfQ09ORklHX05BTUUsIGNvbmZpZ1sibmFtZSJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2VfbW9kZSkKLSAgICAgICAgZGV2aWNlLnNldHVwKCkKLSAgICAgICAgZGV2aWNlcy5hcHBlbmQoZGV2aWNlKQotICAgIHJldHVybiBkZXZpY2VzCmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3V0aWxzLnByb3RvIGIvZ2QvcnVzdC90b3BzaGltL2ZhY2FkZS91dGlscy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwZmQ1Yy4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vZmFjYWRlL3V0aWxzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotc3ludGF4ID0gInByb3RvMyI7Ci0KLXBhY2thZ2UgYmx1ZWJlcnJ5OwotCi1tZXNzYWdlIEVtcHR5IHt9Ci0KLW1lc3NhZ2UgQmx1ZXRvb3RoQWRkcmVzcyB7Ci0gIGJ5dGVzIGFkZHJlc3MgPSAxOwotfQotCi1zZXJ2aWNlIFJlYWRPbmx5UHJvcGVydHkgewotICBycGMgUmVhZExvY2FsQWRkcmVzcyhFbXB0eSkgcmV0dXJucyAoQmx1ZXRvb3RoQWRkcmVzcykge30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vZ2F0dC9nYXR0X3NoaW0uY2MgYi9nZC9ydXN0L3RvcHNoaW0vZ2F0dC9nYXR0X3NoaW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODdiNjAuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL2dhdHQvZ2F0dF9zaGltLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJnZC9ydXN0L3RvcHNoaW0vZ2F0dC9nYXR0X3NoaW0uaCIKLQotI2luY2x1ZGUgImJhc2UvYmluZC5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJydXN0L2N4eC5oIgotI2luY2x1ZGUgInNyYy9wcm9maWxlcy9nYXR0LnJzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdG9wc2hpbSB7Ci1uYW1lc3BhY2UgcnVzdCB7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXN0YXRpYyBSdXN0UmF3QWRkcmVzcyBUb1J1c3RBZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgUnVzdFJhd0FkZHJlc3MgcmFkZHI7Ci0gIHN0ZDo6Y29weShzdGQ6OmJlZ2luKGFkZHJlc3MuYWRkcmVzcyksIHN0ZDo6ZW5kKGFkZHJlc3MuYWRkcmVzcyksIHN0ZDo6YmVnaW4ocmFkZHIuYWRkcmVzcykpOwotICByZXR1cm4gcmFkZHI7Ci19Ci0KLXN0YXRpYyBSYXdBZGRyZXNzIEZyb21SdXN0QWRkcmVzcyhjb25zdCBSdXN0UmF3QWRkcmVzcyYgcmFkZHIpIHsKLSAgUmF3QWRkcmVzcyBhZGRyOwotICBhZGRyLkZyb21PY3RldHMocmFkZHIuYWRkcmVzcy5kYXRhKCkpOwotICByZXR1cm4gYWRkcjsKLX0KLQotdm9pZCBSZWFkUGh5Q2FsbGJhY2soaW50IGNsaWVudF9pZiwgUmF3QWRkcmVzcyBhZGRyZXNzLCB1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHksIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIGJsdWV0b290aDo6dG9wc2hpbTo6cnVzdDo6cmVhZF9waHlfY2FsbGJhY2soY2xpZW50X2lmLCBUb1J1c3RBZGRyZXNzKGFkZHJlc3MpLCB0eF9waHksIHJ4X3BoeSwgc3RhdHVzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLWludCBHYXR0Q2xpZW50SW50Zjo6cmVhZF9waHkoaW50IGNsaWVudF9pZiwgUnVzdFJhd0FkZHJlc3MgYWRkcikgewotICBSYXdBZGRyZXNzIGFkZHJlc3MgPSBpbnRlcm5hbDo6RnJvbVJ1c3RBZGRyZXNzKGFkZHIpOwotICByZXR1cm4gY2xpZW50X2ludGZfLT5yZWFkX3BoeShhZGRyZXNzLCBiYXNlOjpCaW5kKCZpbnRlcm5hbDo6UmVhZFBoeUNhbGxiYWNrLCBjbGllbnRfaWYsIGFkZHJlc3MpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEdhdHRDbGllbnRJbnRmPiBHZXRHYXR0Q2xpZW50UHJvZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyKiBnYXR0X2ludGYpIHsKLSAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8R2F0dENsaWVudEludGY+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRnYXR0X2ludGVyZmFjZV90Kj4oZ2F0dF9pbnRmKS0+Y2xpZW50KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHJ1c3QKLX0gIC8vIG5hbWVzcGFjZSB0b3BzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vZ2F0dC9nYXR0X3NoaW0uaCBiL2dkL3J1c3QvdG9wc2hpbS9nYXR0L2dhdHRfc2hpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY0ZGUyLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9nYXR0L2dhdHRfc2hpbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIEdEX1JVU1RfVE9QU0hJTV9HQVRUX0dBVFRfU0hJTV9ICi0jZGVmaW5lIEdEX1JVU1RfVE9QU0hJTV9HQVRUX0dBVFRfU0hJTV9ICi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2J0X2dhdHQuaCIKLQotI2luY2x1ZGUgInJ1c3QvY3h4LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRvcHNoaW0gewotbmFtZXNwYWNlIHJ1c3QgewotCi1zdHJ1Y3QgUnVzdFJhd0FkZHJlc3M7Ci0KLWNsYXNzIEdhdHRDbGllbnRJbnRmIHsKLSBwdWJsaWM6Ci0gIEdhdHRDbGllbnRJbnRmKGNvbnN0IGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QqIGNsaWVudF9pbnRmKSA6IGNsaWVudF9pbnRmXyhjbGllbnRfaW50Zil7fTsKLSAgfkdhdHRDbGllbnRJbnRmKCkgPSBkZWZhdWx0OwotCi0gIGludCByZWFkX3BoeShpbnQgY2xpZW50X2lmLCBSdXN0UmF3QWRkcmVzcyBidF9hZGRyKTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QqIGNsaWVudF9pbnRmXzsKLX07Ci0KLXN0ZDo6dW5pcXVlX3B0cjxHYXR0Q2xpZW50SW50Zj4gR2V0R2F0dENsaWVudFByb2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciogZ2F0dF9pbnRmKTsKLQotfSAgLy8gbmFtZXNwYWNlIHJ1c3QKLX0gIC8vIG5hbWVzcGFjZSB0b3BzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLSNlbmRpZiAgLy8gR0RfUlVTVF9UT1BTSElNX0dBVFRfR0FUVF9TSElNX0gKZGlmZiAtLWdpdCBhL2dkL3J1c3QvdG9wc2hpbS9oZnAvaGZwX3NoaW0uY2MgYi9nZC9ydXN0L3RvcHNoaW0vaGZwL2hmcF9zaGltLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UxZDk5Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9oZnAvaGZwX3NoaW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJnZC9ydXN0L3RvcHNoaW0vaGZwL2hmcF9zaGltLmgiCi0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9oZi5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfaGYuaCIKLSNpbmNsdWRlICJzcmMvcHJvZmlsZXMvaGZwLnJzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHJ1c3R5ID0gOjpibHVldG9vdGg6OnRvcHNoaW06OnJ1c3Q7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoOjp0b3BzaGltOjpydXN0OjppbnRlcm5hbCB7Ci1zdGF0aWMgdm9pZCBjb25uZWN0aW9uX3N0YXRlX2NiKGJsdWV0b290aDo6aGVhZHNldDo6YnRoZl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUsIFJhd0FkZHJlc3MqIGFkZHIpOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aDo6dG9wc2hpbTo6cnVzdDo6aW50ZXJuYWwKLQotbmFtZXNwYWNlIGJsdWV0b290aDo6aGVhZHNldCB7Ci1jbGFzcyBEQnVzSGVhZHNldENhbGxiYWNrcyA6IHB1YmxpYyBDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgc3RhdGljIENhbGxiYWNrcyogR2V0SW5zdGFuY2UoKSB7Ci0gICAgc3RhdGljIENhbGxiYWNrcyogaW5zdGFuY2UgPSBuZXcgREJ1c0hlYWRzZXRDYWxsYmFja3MoKTsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICB2b2lkIENvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKGJ0aGZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlLCBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7Ci0gICAgdG9wc2hpbTo6cnVzdDo6aW50ZXJuYWw6OmNvbm5lY3Rpb25fc3RhdGVfY2Ioc3RhdGUsIGJkX2FkZHIpOwotICB9Ci0KLSAgdm9pZCBBdWRpb1N0YXRlQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBidGhmX2F1ZGlvX3N0YXRlX3Qgc3RhdGUsIFtbbWF5YmVfdW51c2VkXV0gUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGUge30KLQotICB2b2lkIFZvaWNlUmVjb2duaXRpb25DYWxsYmFjayhbW21heWJlX3VudXNlZF1dIGJ0aGZfdnJfc3RhdGVfdCBzdGF0ZSwgW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7Ci0gIH0KLQotICB2b2lkIEFuc3dlckNhbGxDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBIYW5ndXBDYWxsQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgVm9sdW1lQ29udHJvbENhbGxiYWNrKAotICAgICAgW1ttYXliZV91bnVzZWRdXSBidGhmX3ZvbHVtZV90eXBlX3QgdHlwZSwKLSAgICAgIFtbbWF5YmVfdW51c2VkXV0gaW50IHZvbHVtZSwKLSAgICAgIFtbbWF5YmVfdW51c2VkXV0gUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGUge30KLQotICB2b2lkIERpYWxDYWxsQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBjaGFyKiBudW1iZXIsIFtbbWF5YmVfdW51c2VkXV0gUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGUge30KLQotICB2b2lkIER0bWZDbWRDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIGNoYXIgdG9uZSwgW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgTm9pc2VSZWR1Y3Rpb25DYWxsYmFjayhbW21heWJlX3VudXNlZF1dIGJ0aGZfbnJlY190IG5yZWMsIFtbbWF5YmVfdW51c2VkXV0gUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGUge30KLQotICB2b2lkIFdic0NhbGxiYWNrKFtbbWF5YmVfdW51c2VkXV0gYnRoZl93YnNfY29uZmlnX3Qgd2JzLCBbW21heWJlX3VudXNlZF1dIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBBdENobGRDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIGJ0aGZfY2hsZF90eXBlX3QgY2hsZCwgW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgQXRDbnVtQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgQXRDaW5kQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgQXRDb3BzQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgQXRDbGNjQ2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgVW5rbm93bkF0Q2FsbGJhY2soW1ttYXliZV91bnVzZWRdXSBjaGFyKiBhdF9zdHJpbmcsIFtbbWF5YmVfdW51c2VkXV0gUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGUge30KLQotICB2b2lkIEtleVByZXNzZWRDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBBdEJpbmRDYWxsYmFjayhbW21heWJlX3VudXNlZF1dIGNoYXIqIGF0X3N0cmluZywgW1ttYXliZV91bnVzZWRdXSBSYXdBZGRyZXNzKiBiZF9hZGRyKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgQXRCaWV2Q2FsbGJhY2soCi0gICAgICBbW21heWJlX3VudXNlZF1dIGJ0aGZfaGZfaW5kX3R5cGVfdCBpbmRfaWQsCi0gICAgICBbW21heWJlX3VudXNlZF1dIGludCBpbmRfdmFsdWUsCi0gICAgICBbW21heWJlX3VudXNlZF1dIFJhd0FkZHJlc3MqIGJkX2FkZHIpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBBdEJpYUNhbGxiYWNrKAotICAgICAgW1ttYXliZV91bnVzZWRdXSBib29sIHNlcnZpY2UsCi0gICAgICBbW21heWJlX3VudXNlZF1dIGJvb2wgcm9hbSwKLSAgICAgIFtbbWF5YmVfdW51c2VkXV0gYm9vbCBzaWduYWwsCi0gICAgICBbW21heWJlX3VudXNlZF1dIGJvb2wgYmF0dGVyeSwKLSAgICAgIFtbbWF5YmVfdW51c2VkXV0gUmF3QWRkcmVzcyogYmRfYWRkcikgb3ZlcnJpZGUge30KLX07Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjpoZWFkc2V0Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRvcHNoaW0gewotbmFtZXNwYWNlIHJ1c3QgewotbmFtZXNwYWNlIGludGVybmFsIHsKLXN0YXRpYyBIZnBJbnRmKiBnX2hmcGlmOwotCi0vLyBUT0RPIChiLzIwNDQ4ODEzNik6IFJlZmFjdG9yIHRvIGhhdmUgYTJkcCwgZ2F0dCBhbmQgaGZwIHNoYXJlIHRoZXNlIGhlbHBlcnMuCi1zdGF0aWMgUnVzdFJhd0FkZHJlc3MgdG9fcnVzdF9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgUnVzdFJhd0FkZHJlc3MgcmFkZHI7Ci0gIHN0ZDo6Y29weShzdGQ6OmJlZ2luKGFkZHIuYWRkcmVzcyksIHN0ZDo6ZW5kKGFkZHIuYWRkcmVzcyksIHN0ZDo6YmVnaW4ocmFkZHIuYWRkcmVzcykpOwotICByZXR1cm4gcmFkZHI7Ci19Ci0KLXN0YXRpYyBSYXdBZGRyZXNzIGZyb21fcnVzdF9hZGRyZXNzKGNvbnN0IFJ1c3RSYXdBZGRyZXNzJiByYWRkcikgewotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGFkZHIuRnJvbU9jdGV0cyhyYWRkci5hZGRyZXNzLmRhdGEoKSk7Ci0gIHJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgdm9pZCBjb25uZWN0aW9uX3N0YXRlX2NiKGJsdWV0b290aDo6aGVhZHNldDo6YnRoZl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUsIFJhd0FkZHJlc3MqIGFkZHIpIHsKLSAgUnVzdFJhd0FkZHJlc3MgcmFkZHIgPSB0b19ydXN0X2FkZHJlc3MoKmFkZHIpOwotICBydXN0eTo6aGZwX2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2soc3RhdGUsIHJhZGRyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLWludCBIZnBJbnRmOjppbml0KCkgewotICByZXR1cm4gaW50Zl8tPkluaXQoaGVhZHNldDo6REJ1c0hlYWRzZXRDYWxsYmFja3M6OkdldEluc3RhbmNlKCksIDEsIGZhbHNlKTsKLX0KLQotaW50IEhmcEludGY6OmNvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcikgewotICBSYXdBZGRyZXNzIGFkZHIgPSBpbnRlcm5hbDo6ZnJvbV9ydXN0X2FkZHJlc3MoYnRfYWRkcik7Ci0gIHJldHVybiBpbnRmXy0+Q29ubmVjdCgmYWRkcik7Ci19Ci0KLWludCBIZnBJbnRmOjpkaXNjb25uZWN0KFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIpIHsKLSAgUmF3QWRkcmVzcyBhZGRyID0gaW50ZXJuYWw6OmZyb21fcnVzdF9hZGRyZXNzKGJ0X2FkZHIpOwotICByZXR1cm4gaW50Zl8tPkRpc2Nvbm5lY3QoJmFkZHIpOwotfQotCi12b2lkIEhmcEludGY6OmNsZWFudXAoKSB7fQotCi1zdGQ6OnVuaXF1ZV9wdHI8SGZwSW50Zj4gR2V0SGZwUHJvZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyKiBidGlmKSB7Ci0gIGlmIChpbnRlcm5hbDo6Z19oZnBpZikgc3RkOjphYm9ydCgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidGlmXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRfaW50ZXJmYWNlX3QqPihidGlmKTsKLQotICBhdXRvIGhmcGlmID0gc3RkOjptYWtlX3VuaXF1ZTxIZnBJbnRmPihjb25zdF9jYXN0PGhlYWRzZXQ6OkludGVyZmFjZSo+KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBoZWFkc2V0OjpJbnRlcmZhY2UqPihidGlmXy0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKCJoYW5kc2ZyZWUiKSkpKTsKLSAgaW50ZXJuYWw6OmdfaGZwaWYgPSBoZnBpZi5nZXQoKTsKLQotICByZXR1cm4gaGZwaWY7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBydXN0Ci19ICAvLyBuYW1lc3BhY2UgdG9wc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL2hmcC9oZnBfc2hpbS5oIGIvZ2QvcnVzdC90b3BzaGltL2hmcC9oZnBfc2hpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U4ZGIwLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9oZnAvaGZwX3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2hmLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfaGVhZHNldF9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0b3BzaGltIHsKLW5hbWVzcGFjZSBydXN0IHsKLQotc3RydWN0IFJ1c3RSYXdBZGRyZXNzOwotCi1jbGFzcyBIZnBJbnRmIHsKLSBwdWJsaWM6Ci0gIEhmcEludGYoaGVhZHNldDo6SW50ZXJmYWNlKiBpbnRmKSA6IGludGZfKGludGYpe307Ci0KLSAgaW50IGluaXQoKTsKLSAgaW50IGNvbm5lY3QoUnVzdFJhd0FkZHJlc3MgYnRfYWRkcik7Ci0gIGludCBkaXNjb25uZWN0KFJ1c3RSYXdBZGRyZXNzIGJ0X2FkZHIpOwotICB2b2lkIGNsZWFudXAoKTsKLQotIHByaXZhdGU6Ci0gIGhlYWRzZXQ6OkludGVyZmFjZSogaW50Zl87Ci19OwotCi1zdGQ6OnVuaXF1ZV9wdHI8SGZwSW50Zj4gR2V0SGZwUHJvZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyKiBidGlmKTsKLQotfSAgLy8gbmFtZXNwYWNlIHJ1c3QKLX0gIC8vIG5hbWVzcGFjZSB0b3BzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vbWFjcm9zL0FuZHJvaWQuYnAgYi9nZC9ydXN0L3RvcHNoaW0vbWFjcm9zL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2I2NzMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL21hY3Jvcy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotcnVzdF9wcm9jX21hY3JvIHsKLSAgICBuYW1lOiAibGlidG9wc2hpbV9tYWNyb3MiLAotICAgIGNyYXRlX25hbWU6ICJ0b3BzaGltX21hY3JvcyIsCi0gICAgc3JjczogWyJzcmMvbGliLnJzIl0sCi0gICAgZWRpdGlvbjogIjIwMTgiLAotICAgIHJ1c3RsaWJzOiBbCi0gICAgICAgICJsaWJwcm9jX21hY3JvMiIsCi0gICAgICAgICJsaWJxdW90ZSIsCi0gICAgICAgICJsaWJzeW4iLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vbWFjcm9zL0NhcmdvLnRvbWwgYi9nZC9ydXN0L3RvcHNoaW0vbWFjcm9zL0NhcmdvLnRvbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlMTQuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL21hY3Jvcy9DYXJnby50b21sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotW3BhY2thZ2VdCi1uYW1lID0gInRvcHNoaW1fbWFjcm9zIgotdmVyc2lvbiA9ICIwLjEuMCIKLWVkaXRpb24gPSAiMjAxOCIKLQotW2xpYl0KLXByb2MtbWFjcm8gPSB0cnVlCi0KLVtkZXBlbmRlbmNpZXNdCi1zeW4gPSAiMS4wIgotcXVvdGUgPSAiMS4wIgotcHJvYy1tYWNybzIgPSAiMS4wIgpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL21hY3Jvcy9zcmMvbGliLnJzIGIvZ2QvcnVzdC90b3BzaGltL21hY3Jvcy9zcmMvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU3YmQxLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9tYWNyb3Mvc3JjL2xpYi5ycworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyEgTWFjcm8gZm9yIHRvcHNoaW0KLQotZXh0ZXJuIGNyYXRlIHByb2NfbWFjcm87Ci0KLXVzZSBwcm9jX21hY3JvOjpUb2tlblN0cmVhbTsKLXVzZSBxdW90ZTo6e2Zvcm1hdF9pZGVudCwgcXVvdGV9OwotdXNlIHN5bjo6cGFyc2U6OntQYXJzZSwgUGFyc2VTdHJlYW0sIFJlc3VsdH07Ci11c2Ugc3luOjp7cGFyc2VfbWFjcm9faW5wdXQsIEJsb2NrLCBJZGVudCwgUGF0aCwgU3RtdCwgVG9rZW4sIFR5cGV9OwotCi0vLy8gUGFyc2VkIHN0cnVjdHVyZSBmb3IgY2FsbGJhY2sgdmFyaWFudAotc3RydWN0IENiVmFyaWFudCB7Ci0gICAgZGlzcGF0Y2hlcjogVHlwZSwKLSAgICBmbl9wYWlyOiAoSWRlbnQsIFBhdGgpLAotICAgIGFyZ19wYWlyczogVmVjPChUeXBlLCBUeXBlKT4sCi0gICAgc3RtdHM6IFZlYzxTdG10PiwKLX0KLQotaW1wbCBQYXJzZSBmb3IgQ2JWYXJpYW50IHsKLSAgICBmbiBwYXJzZShpbnB1dDogUGFyc2VTdHJlYW0pIC0+IFJlc3VsdDxTZWxmPiB7Ci0gICAgICAgIC8vIEZpcnN0IHRoaW5nIHNob3VsZCBiZSB0aGUgZGlzcGF0Y2hlcgotICAgICAgICBsZXQgZGlzcGF0Y2hlcjogVHlwZSA9IGlucHV0LnBhcnNlKCk/OwotICAgICAgICBpbnB1dC5wYXJzZTo6PFRva2VuIVssXT4oKT87Ci0KLSAgICAgICAgLy8gTmFtZSBhbmQgcmV0dXJuIHR5cGUgYXJlIHBhcnNlZAotICAgICAgICBsZXQgbmFtZTogSWRlbnQgPSBpbnB1dC5wYXJzZSgpPzsKLSAgICAgICAgaW5wdXQucGFyc2U6OjxUb2tlbiFbLT5dPigpPzsKLSAgICAgICAgbGV0IHJwYXRoOiBQYXRoID0gaW5wdXQucGFyc2UoKT87Ci0KLSAgICAgICAgbGV0IG11dCBhcmdfcGFpcnM6IFZlYzwoVHlwZSwgVHlwZSk+ID0gVmVjOjpuZXcoKTsKLSAgICAgICAgbGV0IG11dCBzdG10czogVmVjPFN0bXQ+ID0gVmVjOjpuZXcoKTsKLQotICAgICAgICB3aGlsZSBpbnB1dC5wZWVrKFRva2VuIVssXSkgewotICAgICAgICAgICAgLy8gRGlzY2FyZCB0aGUgY29tbWEKLSAgICAgICAgICAgIGlucHV0LnBhcnNlOjo8VG9rZW4hWyxdPigpPzsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZXhwZWN0aW5nIHRoZSBmaW5hbCBCbG9jawotICAgICAgICAgICAgaWYgaW5wdXQucGVlayhzeW46OnRva2VuOjpCcmFjZSkgewotICAgICAgICAgICAgICAgIGxldCBibG9jazogQmxvY2sgPSBpbnB1dC5wYXJzZSgpPzsKLSAgICAgICAgICAgICAgICBzdG10cy5leHRlbmQoYmxvY2suc3RtdHMpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdyYWIgdGhlIG5leHQgdHlwZSBhcmd1bWVudAotICAgICAgICAgICAgbGV0IHN0YXJ0X3R5cGU6IFR5cGUgPSBpbnB1dC5wYXJzZSgpPzsKLQotICAgICAgICAgICAgaWYgaW5wdXQucGVlayhUb2tlbiFbLT5dKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY2FyZCAtPgotICAgICAgICAgICAgICAgIGlucHV0LnBhcnNlOjo8VG9rZW4hWy0+XT4oKT87Ci0KLSAgICAgICAgICAgICAgICBsZXQgZW5kX3R5cGU6IFR5cGUgPSBpbnB1dC5wYXJzZSgpPzsKLQotICAgICAgICAgICAgICAgIGFyZ19wYWlycy5wdXNoKChzdGFydF90eXBlLCBlbmRfdHlwZSkpCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFyZ19wYWlycy5wdXNoKChzdGFydF90eXBlLmNsb25lKCksIHN0YXJ0X3R5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoZXJlIGFyZSBubyBtb3JlIHRva2VuczsgY3VycmVudGx5IHRoZXkgYXJlIGlnbm9yZWQuCi0gICAgICAgIE9rKENiVmFyaWFudCB7IGRpc3BhdGNoZXIsIGZuX3BhaXI6IChuYW1lLCBycGF0aCksIGFyZ19wYWlycywgc3RtdHMgfSkKLSAgICB9Ci19Ci0KLSNbcHJvY19tYWNyb10KLS8vLyBJbXBsZW1lbnQgQyBmdW5jdGlvbiB0byBjb252ZXJ0IGNhbGxiYWNrIGludG8gZW51bSB2YXJpYW50LgotLy8vCi0vLy8gRXhwZWN0ZWQgc3ludGF4OgotLy8vICAgICBjYl92YXJpYW50KERpc3BhdGNoZXJUeXBlLCBmdW5jdGlvbl9uYW1lIC0+IEVudW1UeXBlOjpWYXJpYW50LCBhcmdzLi4uLCB7Ci0vLy8gICAgICAgICAvLyBTdGF0ZW1lbnRzIChtYXliZSBjb252ZXJ0aW5nIHR5cGVzKQotLy8vICAgICAgICAgLy8gQXJncyBpbiBvcmRlciB3aWxsIGJlIF8wLCBfMSwgZXRjLgotLy8vICAgICB9KQotcHViIGZuIGNiX3ZhcmlhbnQoaW5wdXQ6IFRva2VuU3RyZWFtKSAtPiBUb2tlblN0cmVhbSB7Ci0gICAgbGV0IHBhcnNlZF9jcHRyID0gcGFyc2VfbWFjcm9faW5wdXQhKGlucHV0IGFzIENiVmFyaWFudCk7Ci0KLSAgICBsZXQgZGlzcGF0Y2hlciA9IHBhcnNlZF9jcHRyLmRpc3BhdGNoZXI7Ci0gICAgbGV0IChpZGVudCwgcnBhdGgpID0gcGFyc2VkX2NwdHIuZm5fcGFpcjsKLQotICAgIGxldCBtdXQgcGFyYW1zID0gcHJvY19tYWNybzI6OlRva2VuU3RyZWFtOjpuZXcoKTsKLSAgICBsZXQgbXV0IGFyZ3MgPSBwcm9jX21hY3JvMjo6VG9rZW5TdHJlYW06Om5ldygpOwotICAgIGZvciAoaSwgKHN0YXJ0LCBlbmQpKSBpbiBwYXJzZWRfY3B0ci5hcmdfcGFpcnMuaXRlcigpLmVudW1lcmF0ZSgpIHsKLSAgICAgICAgbGV0IGlkZW50ID0gZm9ybWF0X2lkZW50ISgiX3t9IiwgaSk7Ci0gICAgICAgIHBhcmFtcy5leHRlbmQocXVvdGUhIHsgI2lkZW50OiAjc3RhcnQsIH0pOwotCi0gICAgICAgIC8vIEFyZ3VtZW50IG5lZWRzIGFuIGludG8gdHJhbnNsYXRpb24gaWYgaXQgZG9lc24ndCBtYXRjaCB0aGUgc3RhcnQKLSAgICAgICAgaWYgc3RhcnQgIT0gZW5kIHsKLSAgICAgICAgICAgIGFyZ3MuZXh0ZW5kKHF1b3RlISB7ICNlbmQ6OmZyb20oI2lkZW50KSwgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcmdzLmV4dGVuZChxdW90ZSEgeyNpZGVudCx9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxldCBtdXQgc3RtdHMgPSBwcm9jX21hY3JvMjo6VG9rZW5TdHJlYW06Om5ldygpOwotICAgIGZvciBzdG10IGluIHBhcnNlZF9jcHRyLnN0bXRzIHsKLSAgICAgICAgc3RtdHMuZXh0ZW5kKHF1b3RlISB7ICNzdG10IH0pOwotICAgIH0KLQotICAgIGxldCB0b2tlbnMgPSBxdW90ZSEgewotICAgICAgICAjW25vX21hbmdsZV0KLSAgICAgICAgZXh0ZXJuICJDIiBmbiAjaWRlbnQoI3BhcmFtcykgewotICAgICAgICAgICAgI3N0bXRzCi0KLSAgICAgICAgICAgIHVuc2FmZSB7Ci0gICAgICAgICAgICAgICAgKGdldF9kaXNwYXRjaGVycygpLmxvY2soKS51bndyYXAoKS5nZXQ6OjwjZGlzcGF0Y2hlcj4oKS51bndyYXAoKS5jbG9uZSgpLmxvY2soKS51bndyYXAoKS5kaXNwYXRjaCkoI3JwYXRoKCNhcmdzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgVG9rZW5TdHJlYW06OmZyb20odG9rZW5zKQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL3NyYy9iaW5kaW5ncy5ycyBiL2dkL3J1c3QvdG9wc2hpbS9zcmMvYmluZGluZ3MucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmVjMDMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL3NyYy9iaW5kaW5ncy5ycworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyFbYWxsb3cobm9uX3VwcGVyX2Nhc2VfZ2xvYmFscyldCi0jIVthbGxvdyhub25fY2FtZWxfY2FzZV90eXBlcyldCi0jIVthbGxvdyhub25fc25ha2VfY2FzZSldCi0vLyBUT0RPKGIvMjAzMDAyNjI1KSAtIHNpbmNlIHJ1c3RjIDEuNTMsIGJpbmRnZW4gY2F1c2VzIFVCIHdhcm5pbmdzCi0vLyBSZW1vdmUgdGhpcyBvbmNlIGJpbmRnZW4gZmlndXJlcyBvdXQgaG93IHRvIGRvIHRoaXMgY29ycmVjdGx5Ci0jIVthbGxvdyhkZXJlZl9udWxscHRyKV0KLQotaW5jbHVkZSEoY29uY2F0IShlbnYhKCJPVVRfRElSIiksICIvYmluZGluZ3MucnMiKSk7CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL2J0aWYucnMgYi9nZC9ydXN0L3RvcHNoaW0vc3JjL2J0aWYucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxY2Y3ZDcuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL3NyYy9idGlmLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTAzOCArMCwwIEBACi0vLyEgQmx1ZXRvb3RoIGludGVyZmFjZSBzaGltCi0vLyEKLS8vISBUaGlzIGlzIGEgc2hpbSBpbnRlcmZhY2UgZm9yIGNhbGxpbmcgdGhlIEMrKyBibHVldG9vdGggaW50ZXJmYWNlIHZpYSBSdXN0LgotLy8hCi0KLXVzZSBjcmF0ZTo6YmluZGluZ3M6OnJvb3QgYXMgYmluZGluZ3M7Ci11c2UgY3JhdGU6OnRvcHN0YWNrOjpnZXRfZGlzcGF0Y2hlcnM7Ci11c2UgbnVtX3RyYWl0czo6Y2FzdDo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKLXVzZSBzdGQ6OmNtcDsKLXVzZSBzdGQ6OmZtdDo6e0RlYnVnLCBGb3JtYXR0ZXIsIFJlc3VsdH07Ci11c2Ugc3RkOjptZW07Ci11c2Ugc3RkOjpvczo6cmF3OjpjX2NoYXI7Ci11c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Ci11c2Ugc3RkOjp2ZWM6OlZlYzsKLXVzZSB0b3BzaGltX21hY3Jvczo6Y2JfdmFyaWFudDsKLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRTdGF0ZSB7Ci0gICAgT2ZmID0gMCwKLSAgICBPbiwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpidF9zdGF0ZV90PiBmb3IgQnRTdGF0ZSB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRfc3RhdGVfdCkgLT4gU2VsZiB7Ci0gICAgICAgIEJ0U3RhdGU6OmZyb21fdTMyKGl0ZW0pLnVud3JhcF9vcl9lbHNlKHx8IEJ0U3RhdGU6Ok9mZikKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0VHJhbnNwb3J0IHsKLSAgICBBdXRvID0gMCwKLSAgICBCcmVkciwKLSAgICBMZSwKLX0KLQotaW1wbCBGcm9tPGkzMj4gZm9yIEJ0VHJhbnNwb3J0IHsKLSAgICBmbiBmcm9tKGl0ZW06IGkzMikgLT4gU2VsZiB7Ci0gICAgICAgIEJ0VHJhbnNwb3J0Ojpmcm9tX2kzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBCdFRyYW5zcG9ydDo6QXV0bykKLSAgICB9Ci19Ci0KLWltcGwgRnJvbTxCdFRyYW5zcG9ydD4gZm9yIGkzMiB7Ci0gICAgZm4gZnJvbShpdGVtOiBCdFRyYW5zcG9ydCkgLT4gU2VsZiB7Ci0gICAgICAgIGl0ZW0udG9faTMyKCkudW53cmFwX29yX2Vsc2UofHwgMCkKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0U3NwVmFyaWFudCB7Ci0gICAgUGFzc2tleUNvbmZpcm1hdGlvbiA9IDAsCi0gICAgUGFzc2tleUVudHJ5LAotICAgIENvbnNlbnQsCi0gICAgUGFzc2tleU5vdGlmaWNhdGlvbiwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpidF9zc3BfdmFyaWFudF90PiBmb3IgQnRTc3BWYXJpYW50IHsKLSAgICBmbiBmcm9tKGl0ZW06IGJpbmRpbmdzOjpidF9zc3BfdmFyaWFudF90KSAtPiBTZWxmIHsKLSAgICAgICAgQnRTc3BWYXJpYW50Ojpmcm9tX3UzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBCdFNzcFZhcmlhbnQ6OlBhc3NrZXlDb25maXJtYXRpb24pCi0gICAgfQotfQotCi1pbXBsIEZyb208QnRTc3BWYXJpYW50PiBmb3IgYmluZGluZ3M6OmJ0X3NzcF92YXJpYW50X3QgewotICAgIGZuIGZyb20oaXRlbTogQnRTc3BWYXJpYW50KSAtPiBTZWxmIHsKLSAgICAgICAgaXRlbS50b191MzIoKS51bndyYXBfb3JfZWxzZSh8fCAwKQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRCb25kU3RhdGUgewotICAgIE5vdEJvbmRlZCA9IDAsCi0gICAgQm9uZGluZywKLSAgICBCb25kZWQsCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6YnRfYm9uZF9zdGF0ZV90PiBmb3IgQnRCb25kU3RhdGUgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6OmJ0X2JvbmRfc3RhdGVfdCkgLT4gU2VsZiB7Ci0gICAgICAgIEJ0Qm9uZFN0YXRlOjpmcm9tX3UzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBCdEJvbmRTdGF0ZTo6Tm90Qm9uZGVkKQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRDb25uZWN0aW9uU3RhdGUgewotICAgIE5vdENvbm5lY3RlZCA9IDAsCi0gICAgQ29ubmVjdGVkT25seSA9IDEsCi0gICAgRW5jcnlwdGVkQnJlZHIgPSAzLAotICAgIEVuY3J5cHRlZExlID0gNSwKLX0KLQotaW1wbCBGcm9tPGkzMj4gZm9yIEJ0Q29ubmVjdGlvblN0YXRlIHsKLSAgICBmbiBmcm9tKGl0ZW06IGkzMikgLT4gU2VsZiB7Ci0gICAgICAgIGxldCBmYWxsYmFjayA9IGlmIGl0ZW0gPiAwIHsKLSAgICAgICAgICAgIEJ0Q29ubmVjdGlvblN0YXRlOjpDb25uZWN0ZWRPbmx5Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCdENvbm5lY3Rpb25TdGF0ZTo6Tm90Q29ubmVjdGVkCi0gICAgICAgIH07Ci0KLSAgICAgICAgQnRDb25uZWN0aW9uU3RhdGU6OmZyb21faTMyKGl0ZW0pLnVud3JhcF9vcihmYWxsYmFjaykKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0QWNsU3RhdGUgewotICAgIENvbm5lY3RlZCA9IDAsCi0gICAgRGlzY29ubmVjdGVkLAotfQotCi1pbXBsIEZyb208YmluZGluZ3M6OmJ0X2FjbF9zdGF0ZV90PiBmb3IgQnRBY2xTdGF0ZSB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRfYWNsX3N0YXRlX3QpIC0+IFNlbGYgewotICAgICAgICBCdEFjbFN0YXRlOjpmcm9tX3UzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBCdEFjbFN0YXRlOjpEaXNjb25uZWN0ZWQpCi0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBCdERldmljZVR5cGUgewotICAgIEJyZWRyLAotICAgIEJsZSwKLSAgICBEdWFsLAotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRQcm9wZXJ0eVR5cGUgewotICAgIEJkTmFtZSA9IDB4MSwKLSAgICBCZEFkZHIsCi0gICAgVXVpZHMsCi0gICAgQ2xhc3NPZkRldmljZSwKLSAgICBUeXBlT2ZEZXZpY2UsCi0gICAgU2VydmljZVJlY29yZCwKLSAgICBBZGFwdGVyU2Nhbk1vZGUsCi0gICAgQWRhcHRlckJvbmRlZERldmljZXMsCi0gICAgQWRhcHRlckRpc2NvdmVyeVRpbWVvdXQsCi0gICAgUmVtb3RlRnJpZW5kbHlOYW1lLAotICAgIFJlbW90ZVJzc2ksCi0gICAgUmVtb3RlVmVyc2lvbkluZm8sCi0gICAgTG9jYWxMZUZlYXR1cmVzLAotICAgIExvY2FsSW9DYXBzLAotICAgIExvY2FsSW9DYXBzQmxlLAotICAgIER5bmFtaWNBdWRpb0J1ZmZlciwKLQotICAgIFVua25vd24gPSAweEZFLAotICAgIFJlbW90ZURldmljZVRpbWVzdGFtcCA9IDB4RkYsCi19Ci0KLWltcGwgRnJvbTx1MzI+IGZvciBCdFByb3BlcnR5VHlwZSB7Ci0gICAgZm4gZnJvbShpdGVtOiB1MzIpIC0+IFNlbGYgewotICAgICAgICBCdFByb3BlcnR5VHlwZTo6ZnJvbV91MzIoaXRlbSkudW53cmFwX29yX2Vsc2UofHwgQnRQcm9wZXJ0eVR5cGU6OlVua25vd24pCi0gICAgfQotfQotCi1pbXBsIEZyb208QnRQcm9wZXJ0eVR5cGU+IGZvciB1MzIgewotICAgIGZuIGZyb20oaXRlbTogQnRQcm9wZXJ0eVR5cGUpIC0+IFNlbGYgewotICAgICAgICBpdGVtLnRvX3UzMigpLnVud3JhcF9vcl9lbHNlKHx8IDApCi0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBCdERpc2NvdmVyeVN0YXRlIHsKLSAgICBTdG9wcGVkID0gMHgwLAotICAgIFN0YXJ0ZWQsCi19Ci0KLWltcGwgRnJvbTx1MzI+IGZvciBCdERpc2NvdmVyeVN0YXRlIHsKLSAgICBmbiBmcm9tKGl0ZW06IHUzMikgLT4gU2VsZiB7Ci0gICAgICAgIEJ0RGlzY292ZXJ5U3RhdGU6OmZyb21fdTMyKGl0ZW0pLnVud3JhcF9vcl9lbHNlKHx8IEJ0RGlzY292ZXJ5U3RhdGU6OlN0b3BwZWQpCi0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBCdFN0YXR1cyB7Ci0gICAgU3VjY2VzcyA9IDAsCi0gICAgRmFpbCwKLSAgICBOb3RSZWFkeSwKLSAgICBOb01lbW9yeSwKLSAgICBCdXN5LAotICAgIERvbmUsCi0gICAgVW5zdXBwb3J0ZWQsCi0gICAgSW52YWxpZFBhcmFtLAotICAgIFVuaGFuZGxlZCwKLSAgICBBdXRoRmFpbHVyZSwKLSAgICBSZW1vdGVEZXZpY2VEb3duLAotICAgIEF1dGhSZWplY3RlZCwKLSAgICBKbmlFbnZpcm9ubWVudEVycm9yLAotICAgIEpuaVRocmVhZEF0dGFjaEVycm9yLAotICAgIFdha2VMb2NrRXJyb3IsCi0KLSAgICAvLyBBbnkgc3RhdHVzZXMgdGhhdCBjb3VsZG4ndCBiZSBjbGVhbmx5IGNvbnZlcnRlZAotICAgIFVua25vd24gPSAweGZmLAotfQotCi1wdWIgZm4gYXNjaWlfdG9fc3RyaW5nKGRhdGE6ICZbdThdLCBsZW5ndGg6IHVzaXplKSAtPiBTdHJpbmcgewotICAgIC8vIFdlIG5lZWQgdG8gcmVzbGljZSBkYXRhIGJlY2F1c2UgZnJvbV91dGY4IHRyaWVzIHRvIGludGVycHJldCB0aGUKLSAgICAvLyB3aG9sZSBzbGljZSBhbmQgbm90IGp1c3Qgd2hhdCBpcyBiZWZvcmUgdGhlIG51bGwgdGVybWluYXRlZCBwb3J0aW9uCi0gICAgbGV0IGFzY2lpID0gZGF0YQotICAgICAgICAuaXRlcigpCi0gICAgICAgIC5lbnVtZXJhdGUoKQotICAgICAgICAudGFrZV93aGlsZSh8Jihwb3MsICZjKXwgYyAhPSAwICYmIHBvcyA8IGxlbmd0aCkKLSAgICAgICAgLm1hcCh8KF9wb3MsICZ4KXwgeC5jbG9uZSgpKQotICAgICAgICAuY29sbGVjdDo6PFZlYzx1OD4+KCk7Ci0KLSAgICByZXR1cm4gU3RyaW5nOjpmcm9tX3V0ZjgoYXNjaWkpLnVud3JhcF9vcl9kZWZhdWx0KCk7Ci19Ci0KLWZuIHUzMl9mcm9tX2J5dGVzKGl0ZW06ICZbdThdKSAtPiB1MzIgewotICAgIGxldCBtdXQgdTogW3U4OyA0XSA9IFswOyA0XTsKLSAgICB1LmNvcHlfZnJvbV9zbGljZSgmaXRlbVswLi40XSk7Ci0gICAgdTMyOjpmcm9tX25lX2J5dGVzKHUpCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6YnRfc3RhdHVzX3Q+IGZvciBCdFN0YXR1cyB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRfc3RhdHVzX3QpIC0+IFNlbGYgewotICAgICAgICBtYXRjaCBCdFN0YXR1czo6ZnJvbV91MzIoaXRlbSkgewotICAgICAgICAgICAgU29tZSh4KSA9PiB4LAotICAgICAgICAgICAgXyA9PiBCdFN0YXR1czo6VW5rbm93biwKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpidF9iZG5hbWVfdD4gZm9yIFN0cmluZyB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRfYmRuYW1lX3QpIC0+IFNlbGYgewotICAgICAgICBhc2NpaV90b19zdHJpbmcoJml0ZW0ubmFtZSwgaXRlbS5uYW1lLmxlbigpKQotICAgIH0KLX0KLQotI1tkZXJpdmUoRGVidWcsIENsb25lKV0KLXB1YiBzdHJ1Y3QgQnRTZXJ2aWNlUmVjb3JkIHsKLSAgICBwdWIgdXVpZDogYmluZGluZ3M6OmJsdWV0b290aDo6VXVpZCwKLSAgICBwdWIgY2hhbm5lbDogdTE2LAotICAgIHB1YiBuYW1lOiBTdHJpbmcsCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6YnRfc2VydmljZV9yZWNvcmRfdD4gZm9yIEJ0U2VydmljZVJlY29yZCB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRfc2VydmljZV9yZWNvcmRfdCkgLT4gU2VsZiB7Ci0gICAgICAgIGxldCBuYW1lID0gaXRlbS5uYW1lLml0ZXIoKS5tYXAofCZ4fCB4LmNsb25lKCkgYXMgdTgpLmNvbGxlY3Q6OjxWZWM8dTg+PigpOwotCi0gICAgICAgIEJ0U2VydmljZVJlY29yZCB7Ci0gICAgICAgICAgICB1dWlkOiBpdGVtLnV1aWQsCi0gICAgICAgICAgICBjaGFubmVsOiBpdGVtLmNoYW5uZWwsCi0gICAgICAgICAgICBuYW1lOiBhc2NpaV90b19zdHJpbmcobmFtZS5hc19zbGljZSgpLCBuYW1lLmxlbigpKSwKLSAgICAgICAgfQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRTY2FuTW9kZSB7Ci0gICAgTm9uZV8sCi0gICAgQ29ubmVjdGFibGUsCi0gICAgQ29ubmVjdGFibGVEaXNjb3ZlcmFibGUsCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6YnRfc2Nhbl9tb2RlX3Q+IGZvciBCdFNjYW5Nb2RlIHsKLSAgICBmbiBmcm9tKGl0ZW06IGJpbmRpbmdzOjpidF9zY2FuX21vZGVfdCkgLT4gU2VsZiB7Ci0gICAgICAgIEJ0U2Nhbk1vZGU6OmZyb21fdTMyKGl0ZW0pLnVud3JhcF9vcihCdFNjYW5Nb2RlOjpOb25lXykKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0SW9DYXAgewotICAgIE91dCwKLSAgICBJbk91dCwKLSAgICBJbiwKLSAgICBOb25lXywKLSAgICBLYkRpc3AsCi0gICAgTWF4LAotICAgIFVua25vd24gPSAweGZmLAotfQotCi1pbXBsIEZyb208YmluZGluZ3M6OmJ0X2lvX2NhcF90PiBmb3IgQnRJb0NhcCB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRfaW9fY2FwX3QpIC0+IFNlbGYgewotICAgICAgICBCdElvQ2FwOjpmcm9tX3UzMihpdGVtKS51bndyYXBfb3IoQnRJb0NhcDo6VW5rbm93bikKLSAgICB9Ci19Ci0KLXB1YiB0eXBlIEJ0SGNpRXJyb3JDb2RlID0gdTg7Ci1wdWIgdHlwZSBCdExvY2FsTGVGZWF0dXJlcyA9IGJpbmRpbmdzOjpidF9sb2NhbF9sZV9mZWF0dXJlc190OwotcHViIHR5cGUgQnRQaW5Db2RlID0gYmluZGluZ3M6OmJ0X3Bpbl9jb2RlX3Q7Ci1wdWIgdHlwZSBCdFJlbW90ZVZlcnNpb24gPSBiaW5kaW5nczo6YnRfcmVtb3RlX3ZlcnNpb25fdDsKLXB1YiB0eXBlIFV1aWQgPSBiaW5kaW5nczo6Ymx1ZXRvb3RoOjpVdWlkOwotcHViIHR5cGUgVXVpZDEyOEJpdCA9IGJpbmRpbmdzOjpibHVldG9vdGg6OlV1aWRfVVVJRDEyOEJpdDsKLQotLy8vIEFsbCBzdXBwb3J0ZWQgQmx1ZXRvb3RoIHByb3BlcnRpZXMgYWZ0ZXIgY29udmVyc2lvbi4KLSNbZGVyaXZlKERlYnVnLCBDbG9uZSldCi1wdWIgZW51bSBCbHVldG9vdGhQcm9wZXJ0eSB7Ci0gICAgQmROYW1lKFN0cmluZyksCi0gICAgQmRBZGRyKFJhd0FkZHJlc3MpLAotICAgIFV1aWRzKFZlYzxVdWlkPiksCi0gICAgQ2xhc3NPZkRldmljZSh1MzIpLAotICAgIFR5cGVPZkRldmljZShCdERldmljZVR5cGUpLAotICAgIFNlcnZpY2VSZWNvcmQoQnRTZXJ2aWNlUmVjb3JkKSwKLSAgICBBZGFwdGVyU2Nhbk1vZGUoQnRTY2FuTW9kZSksCi0gICAgQWRhcHRlckJvbmRlZERldmljZXMoVmVjPFJhd0FkZHJlc3M+KSwKLSAgICBBZGFwdGVyRGlzY292ZXJ5VGltZW91dCh1MzIpLAotICAgIFJlbW90ZUZyaWVuZGx5TmFtZShTdHJpbmcpLAotICAgIFJlbW90ZVJzc2koaTgpLAotICAgIFJlbW90ZVZlcnNpb25JbmZvKEJ0UmVtb3RlVmVyc2lvbiksCi0gICAgTG9jYWxMZUZlYXR1cmVzKEJ0TG9jYWxMZUZlYXR1cmVzKSwKLSAgICBMb2NhbElvQ2FwcyhCdElvQ2FwKSwKLSAgICBMb2NhbElvQ2Fwc0JsZShCdElvQ2FwKSwKLSAgICBEeW5hbWljQXVkaW9CdWZmZXIoKSwKLSAgICBSZW1vdGVEZXZpY2VUaW1lc3RhbXAoKSwKLQotICAgIFVua25vd24oKSwKLX0KLQotLy8vIFdoZXJldmVyIG5hbWVzIGFyZSBzZW50IGluIGJpbmRpbmdzOjpidF9wcm9wZXJ0eV90LCB0aGUgc2l6ZSBvZiB0aGUgY2hhcmFjdGVyCi0vLy8gYXJyYXlzIGFyZSAyNTYuIEtlZXAgb25lIGV4dHJhIGJ5dGUgZm9yIG51bGwgdGVybWluYXRpb24uCi1jb25zdCBQUk9QRVJUWV9OQU1FX01BWDogdXNpemUgPSAyNTU7Ci0KLWltcGwgQmx1ZXRvb3RoUHJvcGVydHkgewotICAgIHB1YiBmbiBnZXRfdHlwZSgmc2VsZikgLT4gQnRQcm9wZXJ0eVR5cGUgewotICAgICAgICBtYXRjaCAmKnNlbGYgewotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkJkTmFtZShfKSA9PiBCdFByb3BlcnR5VHlwZTo6QmROYW1lLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkJkQWRkcihfKSA9PiBCdFByb3BlcnR5VHlwZTo6QmRBZGRyLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlV1aWRzKF8pID0+IEJ0UHJvcGVydHlUeXBlOjpVdWlkcywKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpDbGFzc09mRGV2aWNlKF8pID0+IEJ0UHJvcGVydHlUeXBlOjpDbGFzc09mRGV2aWNlLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlR5cGVPZkRldmljZShfKSA9PiBCdFByb3BlcnR5VHlwZTo6VHlwZU9mRGV2aWNlLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlNlcnZpY2VSZWNvcmQoXykgPT4gQnRQcm9wZXJ0eVR5cGU6OlNlcnZpY2VSZWNvcmQsCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QWRhcHRlclNjYW5Nb2RlKF8pID0+IEJ0UHJvcGVydHlUeXBlOjpBZGFwdGVyU2Nhbk1vZGUsCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QWRhcHRlckJvbmRlZERldmljZXMoXykgPT4gQnRQcm9wZXJ0eVR5cGU6OkFkYXB0ZXJCb25kZWREZXZpY2VzLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkFkYXB0ZXJEaXNjb3ZlcnlUaW1lb3V0KF8pID0+IHsKLSAgICAgICAgICAgICAgICBCdFByb3BlcnR5VHlwZTo6QWRhcHRlckRpc2NvdmVyeVRpbWVvdXQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpSZW1vdGVGcmllbmRseU5hbWUoXykgPT4gQnRQcm9wZXJ0eVR5cGU6OlJlbW90ZUZyaWVuZGx5TmFtZSwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpSZW1vdGVSc3NpKF8pID0+IEJ0UHJvcGVydHlUeXBlOjpSZW1vdGVSc3NpLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlJlbW90ZVZlcnNpb25JbmZvKF8pID0+IEJ0UHJvcGVydHlUeXBlOjpSZW1vdGVWZXJzaW9uSW5mbywKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpMb2NhbExlRmVhdHVyZXMoXykgPT4gQnRQcm9wZXJ0eVR5cGU6OkxvY2FsTGVGZWF0dXJlcywKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpMb2NhbElvQ2FwcyhfKSA9PiBCdFByb3BlcnR5VHlwZTo6TG9jYWxJb0NhcHMsCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6TG9jYWxJb0NhcHNCbGUoXykgPT4gQnRQcm9wZXJ0eVR5cGU6OkxvY2FsSW9DYXBzQmxlLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkR5bmFtaWNBdWRpb0J1ZmZlcigpID0+IEJ0UHJvcGVydHlUeXBlOjpEeW5hbWljQXVkaW9CdWZmZXIsCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6UmVtb3RlRGV2aWNlVGltZXN0YW1wKCkgPT4gQnRQcm9wZXJ0eVR5cGU6OlJlbW90ZURldmljZVRpbWVzdGFtcCwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpVbmtub3duKCkgPT4gQnRQcm9wZXJ0eVR5cGU6OlVua25vd24sCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmbiBnZXRfbGVuKCZzZWxmKSAtPiB1c2l6ZSB7Ci0gICAgICAgIG1hdGNoICYqc2VsZiB7Ci0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QmROYW1lKG5hbWUpID0+IGNtcDo6bWluKFBST1BFUlRZX05BTUVfTUFYLCBuYW1lLmxlbigpICsgMSksCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QmRBZGRyKGFkZHIpID0+IGFkZHIudmFsLmxlbigpLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlV1aWRzKHV1bGlzdCkgPT4gdXVsaXN0LmxlbigpICogbWVtOjpzaXplX29mOjo8VXVpZD4oKSwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpDbGFzc09mRGV2aWNlKF8pID0+IG1lbTo6c2l6ZV9vZjo6PHUzMj4oKSwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpUeXBlT2ZEZXZpY2UoXykgPT4gbWVtOjpzaXplX29mOjo8QnREZXZpY2VUeXBlPigpLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlNlcnZpY2VSZWNvcmQocmVjKSA9PiB7Ci0gICAgICAgICAgICAgICAgbWVtOjpzaXplX29mOjo8QnRTZXJ2aWNlUmVjb3JkPigpICsgY21wOjptaW4oUFJPUEVSVFlfTkFNRV9NQVgsIHJlYy5uYW1lLmxlbigpICsgMSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyU2Nhbk1vZGUoXykgPT4gbWVtOjpzaXplX29mOjo8QnRTY2FuTW9kZT4oKSwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyQm9uZGVkRGV2aWNlcyhkZXZsaXN0KSA9PiB7Ci0gICAgICAgICAgICAgICAgZGV2bGlzdC5sZW4oKSAqIG1lbTo6c2l6ZV9vZjo6PFJhd0FkZHJlc3M+KCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyRGlzY292ZXJ5VGltZW91dChfKSA9PiBtZW06OnNpemVfb2Y6Ojx1MzI+KCksCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6UmVtb3RlRnJpZW5kbHlOYW1lKG5hbWUpID0+IHsKLSAgICAgICAgICAgICAgICBjbXA6Om1pbihQUk9QRVJUWV9OQU1FX01BWCwgbmFtZS5sZW4oKSArIDEpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6UmVtb3RlUnNzaShfKSA9PiBtZW06OnNpemVfb2Y6OjxpOD4oKSwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpSZW1vdGVWZXJzaW9uSW5mbyhfKSA9PiBtZW06OnNpemVfb2Y6OjxCdFJlbW90ZVZlcnNpb24+KCksCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6TG9jYWxMZUZlYXR1cmVzKF8pID0+IG1lbTo6c2l6ZV9vZjo6PEJ0TG9jYWxMZUZlYXR1cmVzPigpLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkxvY2FsSW9DYXBzKF8pID0+IG1lbTo6c2l6ZV9vZjo6PEJ0SW9DYXA+KCksCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6TG9jYWxJb0NhcHNCbGUoXykgPT4gbWVtOjpzaXplX29mOjo8QnRJb0NhcD4oKSwKLQotICAgICAgICAgICAgLy8gVE9ETyhhYnBzKSAtIEZpZ3VyZSBvdXQgc2l6ZXMgZm9yIHRoZXNlCi0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6RHluYW1pY0F1ZGlvQnVmZmVyKCkgPT4gMCwKLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpSZW1vdGVEZXZpY2VUaW1lc3RhbXAoKSA9PiAwLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlVua25vd24oKSA9PiAwLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2l2ZW4gYSBtdXRhYmxlIGFycmF5LCB0aGlzIHdpbGwgY29weSB0aGUgZGF0YSB0byB0aGF0IGFycmF5IGFuZCByZXR1cm4gYQotICAgIC8vIHBvaW50ZXIgdG8gaXQuCi0gICAgLy8KLSAgICAvLyBUaGUgbGlmZXRpbWUgb2YgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdGllZCB0byB0aGF0IG9mIHRoZSBzbGljZSBnaXZlbi4KLSAgICBmbiBnZXRfZGF0YV9wdHI8J2E+KCYnYSBzZWxmLCBkYXRhOiAmJ2EgbXV0IFt1OF0pIC0+ICptdXQgdTggewotICAgICAgICBsZXQgbGVuID0gc2VsZi5nZXRfbGVuKCk7Ci0gICAgICAgIG1hdGNoICYqc2VsZiB7Ci0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6QmROYW1lKG5hbWUpID0+IHsKLSAgICAgICAgICAgICAgICBkYXRhLmNvcHlfZnJvbV9zbGljZSgmbmFtZS5hc19ieXRlcygpWzAuLmxlbl0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkJkQWRkcihhZGRyKSA9PiB7Ci0gICAgICAgICAgICAgICAgZGF0YS5jb3B5X2Zyb21fc2xpY2UoJmFkZHIudmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpVdWlkcyh1dWxpc3QpID0+IHsKLSAgICAgICAgICAgICAgICBmb3IgKGlkeCwgJnV1aWQpIGluIHV1bGlzdC5pdGVyKCkuZW51bWVyYXRlKCkgewotICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBpZHggKiBtZW06OnNpemVfb2Y6OjxVdWlkPigpOwotICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQgKyBtZW06OnNpemVfb2Y6OjxVdWlkPigpOwotICAgICAgICAgICAgICAgICAgICBkYXRhW3N0YXJ0Li5lbmRdLmNvcHlfZnJvbV9zbGljZSgmdXVpZC51dSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkNsYXNzT2ZEZXZpY2UoY29kKSA9PiB7Ci0gICAgICAgICAgICAgICAgZGF0YS5jb3B5X2Zyb21fc2xpY2UoJmNvZC50b19uZV9ieXRlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpUeXBlT2ZEZXZpY2UodG9kKSA9PiB7Ci0gICAgICAgICAgICAgICAgZGF0YS5jb3B5X2Zyb21fc2xpY2UoJkJ0RGV2aWNlVHlwZTo6dG9fdTMyKHRvZCkudW53cmFwX29yX2RlZmF1bHQoKS50b19uZV9ieXRlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpTZXJ2aWNlUmVjb3JkKHNyKSA9PiB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gYW4gdW5zYWZlIGNhc3QgdG8gYmluZGluZzo6IHR5cGUgYW5kIGFzc2lnbiB0aGUgdmFsdWVzCi0gICAgICAgICAgICAgICAgLy8gVGhlIHVuZGVybHlpbmcgbWVtb3J5IGxvY2F0aW9uIGlzIHByb3ZpZGVkIGJ5IHxkYXRhfCB3aGljaCB3aWxsCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBlbm91Z2ggc3BhY2UgYmVjYXVzZSBpdCB1c2VzIGdldF9sZW4oKQotICAgICAgICAgICAgICAgIGxldCBtdXQgcmVjb3JkID0KLSAgICAgICAgICAgICAgICAgICAgdW5zYWZlIHsgJm11dCAqKGRhdGEuYXNfbXV0X3B0cigpIGFzICptdXQgYmluZGluZ3M6OmJ0X3NlcnZpY2VfcmVjb3JkX3QpIH07Ci0gICAgICAgICAgICAgICAgcmVjb3JkLnV1aWQgPSBzci51dWlkOwotICAgICAgICAgICAgICAgIHJlY29yZC5jaGFubmVsID0gc3IuY2hhbm5lbDsKLSAgICAgICAgICAgICAgICBsZXQgbmFtZV9sZW4gPSBsZW4gLSBtZW06OnNpemVfb2Y6OjxCdFNlcnZpY2VSZWNvcmQ+KCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm5hbWUuY29weV9mcm9tX3NsaWNlKAotICAgICAgICAgICAgICAgICAgICAmKHNyLm5hbWUuYXNfYnl0ZXMoKS5pdGVyKCkubWFwKHx4fCAqeCBhcyBjX2NoYXIpLmNvbGxlY3Q6OjxWZWM8Y19jaGFyPj4oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFswLi5uYW1lX2xlbl0sCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyU2Nhbk1vZGUoc20pID0+IHsKLSAgICAgICAgICAgICAgICBkYXRhLmNvcHlfZnJvbV9zbGljZSgmQnRTY2FuTW9kZTo6dG9fdTMyKHNtKS51bndyYXBfb3JfZGVmYXVsdCgpLnRvX25lX2J5dGVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkFkYXB0ZXJCb25kZWREZXZpY2VzKGRldmxpc3QpID0+IHsKLSAgICAgICAgICAgICAgICBmb3IgKGlkeCwgJmRldikgaW4gZGV2bGlzdC5pdGVyKCkuZW51bWVyYXRlKCkgewotICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBpZHggKiBtZW06OnNpemVfb2Y6OjxSYXdBZGRyZXNzPigpOwotICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaWR4ICsgbWVtOjpzaXplX29mOjo8UmF3QWRkcmVzcz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtzdGFydC4uZW5kXS5jb3B5X2Zyb21fc2xpY2UoJmRldi52YWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyRGlzY292ZXJ5VGltZW91dCh0aW1lb3V0KSA9PiB7Ci0gICAgICAgICAgICAgICAgZGF0YS5jb3B5X2Zyb21fc2xpY2UoJnRpbWVvdXQudG9fbmVfYnl0ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6UmVtb3RlRnJpZW5kbHlOYW1lKG5hbWUpID0+IHsKLSAgICAgICAgICAgICAgICBkYXRhLmNvcHlfZnJvbV9zbGljZSgmbmFtZS5hc19ieXRlcygpWzAuLmxlbl0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlJlbW90ZVJzc2kocnNzaSkgPT4gewotICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAqcnNzaSBhcyB1ODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpSZW1vdGVWZXJzaW9uSW5mbyhydmkpID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgcHRyOiAqY29uc3QgQnRSZW1vdGVWZXJzaW9uID0gcnZpOwotICAgICAgICAgICAgICAgIGxldCBzbGljZSA9IHVuc2FmZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKHB0ciBhcyAqbXV0IHU4LCBtZW06OnNpemVfb2Y6OjxCdFJlbW90ZVZlcnNpb24+KCkpCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBkYXRhLmNvcHlfZnJvbV9zbGljZSgmc2xpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkxvY2FsTGVGZWF0dXJlcyhsbGYpID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgcHRyOiAqY29uc3QgQnRMb2NhbExlRmVhdHVyZXMgPSBsbGY7Ci0gICAgICAgICAgICAgICAgbGV0IHNsaWNlID0gdW5zYWZlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMocHRyIGFzICptdXQgdTgsIG1lbTo6c2l6ZV9vZjo6PEJ0TG9jYWxMZUZlYXR1cmVzPigpKQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgZGF0YS5jb3B5X2Zyb21fc2xpY2UoJnNsaWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpMb2NhbElvQ2Fwcyhpb2NhcCkgPT4gewotICAgICAgICAgICAgICAgIGRhdGEuY29weV9mcm9tX3NsaWNlKCZCdElvQ2FwOjp0b191MzIoaW9jYXApLnVud3JhcF9vcl9kZWZhdWx0KCkudG9fbmVfYnl0ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6TG9jYWxJb0NhcHNCbGUoaW9jYXApID0+IHsKLSAgICAgICAgICAgICAgICBkYXRhLmNvcHlfZnJvbV9zbGljZSgmQnRJb0NhcDo6dG9fdTMyKGlvY2FwKS51bndyYXBfb3JfZGVmYXVsdCgpLnRvX25lX2J5dGVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkR5bmFtaWNBdWRpb0J1ZmZlcigpID0+ICgpLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlJlbW90ZURldmljZVRpbWVzdGFtcCgpID0+ICgpLAotICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlVua25vd24oKSA9PiAoKSwKLSAgICAgICAgfTsKLQotICAgICAgICBkYXRhLmFzX211dF9wdHIoKQotICAgIH0KLX0KLQotLy8gVE9ETyhhYnBzKSAtIENoZWNrIHRoYXQgc2l6ZXMgYXJlIGNvcnJlY3Qgd2hlbiBnaXZlbiBhIEJ0UHJvcGVydHkKLWltcGwgRnJvbTxiaW5kaW5nczo6YnRfcHJvcGVydHlfdD4gZm9yIEJsdWV0b290aFByb3BlcnR5IHsKLSAgICBmbiBmcm9tKHByb3A6IGJpbmRpbmdzOjpidF9wcm9wZXJ0eV90KSAtPiBTZWxmIHsKLSAgICAgICAgbGV0IHNsaWNlOiAmW3U4XSA9Ci0gICAgICAgICAgICB1bnNhZmUgeyBzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhwcm9wLnZhbCBhcyAqbXV0IHU4LCBwcm9wLmxlbiBhcyB1c2l6ZSkgfTsKLSAgICAgICAgbGV0IGxlbiA9IHByb3AubGVuIGFzIHVzaXplOwotCi0gICAgICAgIG1hdGNoIEJ0UHJvcGVydHlUeXBlOjpmcm9tKHByb3AudHlwZV8pIHsKLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpCZE5hbWUgPT4gQmx1ZXRvb3RoUHJvcGVydHk6OkJkTmFtZShhc2NpaV90b19zdHJpbmcoc2xpY2UsIGxlbikpLAotICAgICAgICAgICAgQnRQcm9wZXJ0eVR5cGU6OkJkQWRkciA9PiB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkJkQWRkcihSYXdBZGRyZXNzOjpmcm9tX2J5dGVzKHNsaWNlKS51bndyYXBfb3JfZGVmYXVsdCgpKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnRQcm9wZXJ0eVR5cGU6OlV1aWRzID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBsZW4gLyBtZW06OnNpemVfb2Y6OjxVdWlkPigpOwotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpVdWlkcyhwdHJfdG9fdmVjKHByb3AudmFsIGFzICptdXQgVXVpZCwgY291bnQpKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnRQcm9wZXJ0eVR5cGU6OkNsYXNzT2ZEZXZpY2UgPT4gewotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpDbGFzc09mRGV2aWNlKHUzMl9mcm9tX2J5dGVzKHNsaWNlKSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpUeXBlT2ZEZXZpY2UgPT4gQmx1ZXRvb3RoUHJvcGVydHk6OlR5cGVPZkRldmljZSgKLSAgICAgICAgICAgICAgICBCdERldmljZVR5cGU6OmZyb21fdTMyKHUzMl9mcm9tX2J5dGVzKHNsaWNlKSkudW53cmFwX29yKEJ0RGV2aWNlVHlwZTo6QnJlZHIpLAotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpTZXJ2aWNlUmVjb3JkID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgdiA9IHVuc2FmZSB7ICoocHJvcC52YWwgYXMgKmNvbnN0IGJpbmRpbmdzOjpidF9zZXJ2aWNlX3JlY29yZF90KSB9OwotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpTZXJ2aWNlUmVjb3JkKEJ0U2VydmljZVJlY29yZDo6ZnJvbSh2KSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpBZGFwdGVyU2Nhbk1vZGUgPT4gQmx1ZXRvb3RoUHJvcGVydHk6OkFkYXB0ZXJTY2FuTW9kZSgKLSAgICAgICAgICAgICAgICBCdFNjYW5Nb2RlOjpmcm9tX3UzMih1MzJfZnJvbV9ieXRlcyhzbGljZSkpLnVud3JhcF9vcihCdFNjYW5Nb2RlOjpOb25lXyksCi0gICAgICAgICAgICApLAotICAgICAgICAgICAgQnRQcm9wZXJ0eVR5cGU6OkFkYXB0ZXJCb25kZWREZXZpY2VzID0+IHsKLSAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBsZW4gLyBtZW06OnNpemVfb2Y6OjxSYXdBZGRyZXNzPigpOwotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyQm9uZGVkRGV2aWNlcyhwdHJfdG9fdmVjKAotICAgICAgICAgICAgICAgICAgICBwcm9wLnZhbCBhcyAqbXV0IFJhd0FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdFByb3BlcnR5VHlwZTo6QWRhcHRlckRpc2NvdmVyeVRpbWVvdXQgPT4gewotICAgICAgICAgICAgICAgIEJsdWV0b290aFByb3BlcnR5OjpBZGFwdGVyRGlzY292ZXJ5VGltZW91dCh1MzJfZnJvbV9ieXRlcyhzbGljZSkpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdFByb3BlcnR5VHlwZTo6UmVtb3RlRnJpZW5kbHlOYW1lID0+IHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9wZXJ0eTo6UmVtb3RlRnJpZW5kbHlOYW1lKGFzY2lpX3RvX3N0cmluZyhzbGljZSwgbGVuKSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpSZW1vdGVSc3NpID0+IEJsdWV0b290aFByb3BlcnR5OjpSZW1vdGVSc3NpKHNsaWNlWzBdIGFzIGk4KSwKLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpSZW1vdGVWZXJzaW9uSW5mbyA9PiB7Ci0gICAgICAgICAgICAgICAgbGV0IHYgPSB1bnNhZmUgeyAqKHByb3AudmFsIGFzICpjb25zdCBCdFJlbW90ZVZlcnNpb24pIH07Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OlJlbW90ZVZlcnNpb25JbmZvKHYuY2xvbmUoKSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpMb2NhbExlRmVhdHVyZXMgPT4gewotICAgICAgICAgICAgICAgIGxldCB2ID0gdW5zYWZlIHsgKihwcm9wLnZhbCBhcyAqY29uc3QgQnRMb2NhbExlRmVhdHVyZXMpIH07Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvcGVydHk6OkxvY2FsTGVGZWF0dXJlcyh2LmNsb25lKCkpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdFByb3BlcnR5VHlwZTo6TG9jYWxJb0NhcHMgPT4gQmx1ZXRvb3RoUHJvcGVydHk6OkxvY2FsSW9DYXBzKAotICAgICAgICAgICAgICAgIEJ0SW9DYXA6OmZyb21fdTMyKHUzMl9mcm9tX2J5dGVzKHNsaWNlKSkudW53cmFwX29yKEJ0SW9DYXA6OlVua25vd24pLAotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpMb2NhbElvQ2Fwc0JsZSA9PiBCbHVldG9vdGhQcm9wZXJ0eTo6TG9jYWxJb0NhcHNCbGUoCi0gICAgICAgICAgICAgICAgQnRJb0NhcDo6ZnJvbV91MzIodTMyX2Zyb21fYnl0ZXMoc2xpY2UpKS51bndyYXBfb3IoQnRJb0NhcDo6VW5rbm93biksCi0gICAgICAgICAgICApLAotCi0gICAgICAgICAgICAvLyBUT0RPKGFicHMpIC0gRmlndXJlIG91dCBpZiB0aGVzZSB2YWx1ZXMgc2hvdWxkIGFjdHVhbGx5IGhhdmUgY29udGVudHMKLSAgICAgICAgICAgIEJ0UHJvcGVydHlUeXBlOjpEeW5hbWljQXVkaW9CdWZmZXIgPT4gQmx1ZXRvb3RoUHJvcGVydHk6OkR5bmFtaWNBdWRpb0J1ZmZlcigpLAotICAgICAgICAgICAgQnRQcm9wZXJ0eVR5cGU6OlJlbW90ZURldmljZVRpbWVzdGFtcCA9PiBCbHVldG9vdGhQcm9wZXJ0eTo6UmVtb3RlRGV2aWNlVGltZXN0YW1wKCksCi0gICAgICAgICAgICBfID0+IEJsdWV0b290aFByb3BlcnR5OjpVbmtub3duKCksCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWltcGwgRnJvbTxCbHVldG9vdGhQcm9wZXJ0eT4gZm9yIChCb3g8W3U4XT4sIGJpbmRpbmdzOjpidF9wcm9wZXJ0eV90KSB7Ci0gICAgZm4gZnJvbShwcm9wOiBCbHVldG9vdGhQcm9wZXJ0eSkgLT4gU2VsZiB7Ci0gICAgICAgIGxldCBkdmVjOiBWZWM8dTg+ID0gdmVjIVswOyBwcm9wLmdldF9sZW4oKV07Ci0gICAgICAgIGxldCBtdXQgZGF0YTogQm94PFt1OF0+ID0gZHZlYy5pbnRvX2JveGVkX3NsaWNlKCk7Ci0gICAgICAgIGxldCBwcm9wID0gYmluZGluZ3M6OmJ0X3Byb3BlcnR5X3QgewotICAgICAgICAgICAgdHlwZV86IHByb3AuZ2V0X3R5cGUoKS5pbnRvKCksCi0gICAgICAgICAgICBsZW46IHByb3AuZ2V0X2xlbigpIGFzIGkzMiwKLSAgICAgICAgICAgIHZhbDogcHJvcC5nZXRfZGF0YV9wdHIoJm11dCBkYXRhKSBhcyAqbXV0IHN0ZDo6b3M6OnJhdzo6Y192b2lkLAotICAgICAgICB9OwotCi0gICAgICAgIChkYXRhLCBwcm9wKQotICAgIH0KLX0KLQotcHViIGVudW0gU3VwcG9ydGVkUHJvZmlsZXMgewotICAgIEhpZEhvc3QsCi0gICAgSGZwLAotICAgIEEyZHAsCi0gICAgR2F0dCwKLSAgICBTZHAsCi19Ci0KLWltcGwgRnJvbTxTdXBwb3J0ZWRQcm9maWxlcz4gZm9yIFZlYzx1OD4gewotICAgIGZuIGZyb20oaXRlbTogU3VwcG9ydGVkUHJvZmlsZXMpIC0+IFNlbGYgewotICAgICAgICBtYXRjaCBpdGVtIHsKLSAgICAgICAgICAgIFN1cHBvcnRlZFByb2ZpbGVzOjpIaWRIb3N0ID0+ICJoaWRob3N0IiwKLSAgICAgICAgICAgIFN1cHBvcnRlZFByb2ZpbGVzOjpIZnAgPT4gImhmcCIsCi0gICAgICAgICAgICBTdXBwb3J0ZWRQcm9maWxlczo6QTJkcCA9PiAiYTJkcCIsCi0gICAgICAgICAgICBTdXBwb3J0ZWRQcm9maWxlczo6R2F0dCA9PiAiZ2F0dCIsCi0gICAgICAgICAgICBTdXBwb3J0ZWRQcm9maWxlczo6U2RwID0+ICJzZHAiLAotICAgICAgICB9Ci0gICAgICAgIC5ieXRlcygpCi0gICAgICAgIC5jaGFpbigiXDAiLmJ5dGVzKCkpCi0gICAgICAgIC5jb2xsZWN0Ojo8VmVjPHU4Pj4oKQotICAgIH0KLX0KLQotI1tjeHg6OmJyaWRnZShuYW1lc3BhY2UgPSBibHVldG9vdGg6OnRvcHNoaW06OnJ1c3QpXQotbW9kIGZmaSB7Ci0gICAgdW5zYWZlIGV4dGVybiAiQysrIiB7Ci0gICAgICAgIGluY2x1ZGUhKCJidGlmL2J0aWZfc2hpbS5oIik7Ci0KLSAgICAgICAgLy8gRm9yIGNvbnZlcnRpbmcgaW5pdCBmbGFncyBmcm9tIFZlYzxTdHJpbmc+IHRvIGNvbnN0IGNoYXIgKioKLSAgICAgICAgdHlwZSBJbml0RmxhZ3M7Ci0KLSAgICAgICAgLy8gQ29udmVydCBmbGdhcyBpbnRvIGFuIEluaXRGbGFncyBvYmplY3QKLSAgICAgICAgZm4gQ29udmVydEZsYWdzKGZsYWdzOiBWZWM8U3RyaW5nPikgLT4gVW5pcXVlUHRyPEluaXRGbGFncz47Ci0gICAgICAgIGZuIEdldEZsYWdzUHRyKHNlbGY6ICZJbml0RmxhZ3MpIC0+ICptdXQgKmNvbnN0IGNfY2hhcjsKLSAgICB9Ci19Ci0KLS8vIEV4cG9ydCB0aGUgcmF3IGFkZHJlc3MgdHlwZSBkaXJlY3RseSBmcm9tIHRoZSBiaW5kaW5ncwotcHViIHR5cGUgRmZpQWRkcmVzcyA9IGJpbmRpbmdzOjpSYXdBZGRyZXNzOwotCi0vLy8gQSBzaGFyZWQgYWRkcmVzcyBzdHJ1Y3R1cmUgdGhhdCBoYXMgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYXMKLS8vLyBiaW5kaW5nczo6UmF3QWRkcmVzcy4gTWFjcm9zIGBkZXJlZl9mZmlfYWRkcmVzc2AgYW5kIGBjYXN0X3RvX2ZmaV9hZGRyZXNzYAotLy8vIGFyZSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgYmV0d2VlbiBiaW5kaW5nczo6UmF3QWRkcmVzcyBhdCBmZmkgYm91bmRhcmllcy4KLSNbZGVyaXZlKENvcHksIENsb25lLCBIYXNoLCBFcSwgUGFydGlhbEVxKV0KLSNbcmVwcihDKV0KLXB1YiBzdHJ1Y3QgUmF3QWRkcmVzcyB7Ci0gICAgcHViIHZhbDogW3U4OyA2XSwKLX0KLQotaW1wbCBEZWJ1ZyBmb3IgUmF3QWRkcmVzcyB7Ci0gICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcjwnXz4pIC0+IFJlc3VsdCB7Ci0gICAgICAgIGYud3JpdGVfZm10KGZvcm1hdF9hcmdzISgKLSAgICAgICAgICAgICJ7OjAyWH06ezowMlh9Ons6MDJYfTp7OjAyWH06ezowMlh9Ons6MDJYfSIsCi0gICAgICAgICAgICBzZWxmLnZhbFswXSwgc2VsZi52YWxbMV0sIHNlbGYudmFsWzJdLCBzZWxmLnZhbFszXSwgc2VsZi52YWxbNF0sIHNlbGYudmFsWzVdCi0gICAgICAgICkpCi0gICAgfQotfQotCi1pbXBsIERlZmF1bHQgZm9yIFJhd0FkZHJlc3MgewotICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICAgICAgU2VsZiB7IHZhbDogWzA7IDZdIH0KLSAgICB9Ci19Ci0KLWltcGwgVG9TdHJpbmcgZm9yIFJhd0FkZHJlc3MgewotICAgIGZuIHRvX3N0cmluZygmc2VsZikgLT4gU3RyaW5nIHsKLSAgICAgICAgU3RyaW5nOjpmcm9tKGZvcm1hdCEoCi0gICAgICAgICAgICAiezowMlh9Ons6MDJYfTp7OjAyWH06ezowMlh9Ons6MDJYfTp7OjAyWH0iLAotICAgICAgICAgICAgc2VsZi52YWxbMF0sIHNlbGYudmFsWzFdLCBzZWxmLnZhbFsyXSwgc2VsZi52YWxbM10sIHNlbGYudmFsWzRdLCBzZWxmLnZhbFs1XQotICAgICAgICApKQotICAgIH0KLX0KLQotaW1wbCBSYXdBZGRyZXNzIHsKLSAgICAvLy8gQ29uc3RydWN0cyBhIFJhd0FkZHJlc3MgZnJvbSBhIHNsaWNlIG9mIDYgYnl0ZXMuCi0gICAgcHViIGZuIGZyb21fYnl0ZXMocmF3X2FkZHI6ICZbdThdKSAtPiBPcHRpb248UmF3QWRkcmVzcz4gewotICAgICAgICBpZiByYXdfYWRkci5sZW4oKSAhPSA2IHsKLSAgICAgICAgICAgIHJldHVybiBOb25lOwotICAgICAgICB9Ci0gICAgICAgIGxldCBtdXQgcmF3OiBbdTg7IDZdID0gWzA7IDZdOwotICAgICAgICByYXcuY29weV9mcm9tX3NsaWNlKHJhd19hZGRyKTsKLSAgICAgICAgcmV0dXJuIFNvbWUoUmF3QWRkcmVzcyB7IHZhbDogcmF3IH0pOwotICAgIH0KLQotICAgIHB1YiBmbiBmcm9tX3N0cmluZzxTOiBJbnRvPFN0cmluZz4+KGFkZHI6IFMpIC0+IE9wdGlvbjxSYXdBZGRyZXNzPiB7Ci0gICAgICAgIGxldCBhZGRyOiBTdHJpbmcgPSBhZGRyLmludG8oKTsKLSAgICAgICAgbGV0IHMgPSBhZGRyLnNwbGl0KCc6JykuY29sbGVjdDo6PFZlYzwmc3RyPj4oKTsKLQotICAgICAgICBpZiBzLmxlbigpICE9IDYgewotICAgICAgICAgICAgcmV0dXJuIE5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgbXV0IHJhdzogW3U4OyA2XSA9IFswOyA2XTsKLSAgICAgICAgZm9yIGkgaW4gMC4ucy5sZW4oKSB7Ci0gICAgICAgICAgICByYXdbaV0gPSBtYXRjaCB1ODo6ZnJvbV9zdHJfcmFkaXgoc1tpXSwgMTYpIHsKLSAgICAgICAgICAgICAgICBPayhyZXMpID0+IHJlcywKLSAgICAgICAgICAgICAgICBFcnIoXykgPT4gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgU29tZShSYXdBZGRyZXNzIHsgdmFsOiByYXcgfSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gdG9fYnl0ZV9hcnIoJnNlbGYpIC0+IFt1ODsgNl0gewotICAgICAgICBzZWxmLnZhbC5jbG9uZSgpCi0gICAgfQotfQotCi0jW21hY3JvX2V4cG9ydF0KLW1hY3JvX3J1bGVzISBkZXJlZl9mZmlfYWRkcmVzcyB7Ci0gICAgKCRmZmlfYWRkcjppZGVudCkgPT4gewotICAgICAgICAqKCRmZmlfYWRkciBhcyAqbXV0IFJhd0FkZHJlc3MpCi0gICAgfTsKLX0KLQotI1ttYWNyb19leHBvcnRdCi1tYWNyb19ydWxlcyEgZGVyZWZfY29uc3RfZmZpX2FkZHJlc3MgewotICAgICgkZmZpX2FkZHI6aWRlbnQpID0+IHsKLSAgICAgICAgKigkZmZpX2FkZHIgYXMgKmNvbnN0IFJhd0FkZHJlc3MpCi0gICAgfTsKLX0KLQotI1ttYWNyb19leHBvcnRdCi1tYWNyb19ydWxlcyEgY2FzdF90b19mZmlfYWRkcmVzcyB7Ci0gICAgKCRyYXdfYWRkcjpleHByKSA9PiB7Ci0gICAgICAgICRyYXdfYWRkciBhcyAqbXV0IEZmaUFkZHJlc3MKLSAgICB9OwotfQotCi0jW21hY3JvX2V4cG9ydF0KLW1hY3JvX3J1bGVzISBjYXN0X3RvX2NvbnN0X2ZmaV9hZGRyZXNzIHsKLSAgICAoJHJhd19hZGRyOmV4cHIpID0+IHsKLSAgICAgICAgJHJhd19hZGRyIGFzICpjb25zdCBGZmlBZGRyZXNzCi0gICAgfTsKLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KLXB1YiBlbnVtIEJhc2VDYWxsYmFja3MgewotICAgIEFkYXB0ZXJTdGF0ZShCdFN0YXRlKSwKLSAgICBBZGFwdGVyUHJvcGVydGllcyhCdFN0YXR1cywgaTMyLCBWZWM8Qmx1ZXRvb3RoUHJvcGVydHk+KSwKLSAgICBSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzKEJ0U3RhdHVzLCBSYXdBZGRyZXNzLCBpMzIsIFZlYzxCbHVldG9vdGhQcm9wZXJ0eT4pLAotICAgIERldmljZUZvdW5kKGkzMiwgVmVjPEJsdWV0b290aFByb3BlcnR5PiksCi0gICAgRGlzY292ZXJ5U3RhdGUoQnREaXNjb3ZlcnlTdGF0ZSksCi0gICAgUGluUmVxdWVzdChSYXdBZGRyZXNzLCBTdHJpbmcsIHUzMiwgYm9vbCksCi0gICAgU3NwUmVxdWVzdChSYXdBZGRyZXNzLCBTdHJpbmcsIHUzMiwgQnRTc3BWYXJpYW50LCB1MzIpLAotICAgIEJvbmRTdGF0ZShCdFN0YXR1cywgUmF3QWRkcmVzcywgQnRCb25kU3RhdGUsIGkzMiksCi0gICAgQWNsU3RhdGUoQnRTdGF0dXMsIFJhd0FkZHJlc3MsIEJ0QWNsU3RhdGUsIEJ0VHJhbnNwb3J0LCBCdEhjaUVycm9yQ29kZSksCi0gICAgLy8gVW5pbXBsZW1lbnRlZCBzbyBmYXI6Ci0gICAgLy8gdGhyZWFkX2V2dF9jYgotICAgIC8vIGR1dF9tb2RlX3JlY3ZfY2IKLSAgICAvLyBsZV90ZXN0X21vZGVfY2IKLSAgICAvLyBlbmVyZ3lfaW5mb19jYgotICAgIC8vIGxpbmtfcXVhbGl0eV9yZXBvcnRfY2IKLSAgICAvLyBnZW5lcmF0ZV9sb2NhbF9vb2JfZGF0YV9jYgotfQotCi1wdWIgc3RydWN0IEJhc2VDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBwdWIgZGlzcGF0Y2g6IEJveDxkeW4gRm4oQmFzZUNhbGxiYWNrcykgKyBTZW5kPiwKLX0KLQotdHlwZSBCYXNlQ2IgPSBBcmM8TXV0ZXg8QmFzZUNhbGxiYWNrc0Rpc3BhdGNoZXI+PjsKLQotY2JfdmFyaWFudCEoQmFzZUNiLCBhZGFwdGVyX3N0YXRlX2NiIC0+IEJhc2VDYWxsYmFja3M6OkFkYXB0ZXJTdGF0ZSwgdTMyIC0+IEJ0U3RhdGUpOwotY2JfdmFyaWFudCEoQmFzZUNiLCBhZGFwdGVyX3Byb3BlcnRpZXNfY2IgLT4gQmFzZUNhbGxiYWNrczo6QWRhcHRlclByb3BlcnRpZXMsCi11MzIgLT4gQnRTdGF0dXMsIGkzMiwgKm11dCBiaW5kaW5nczo6YnRfcHJvcGVydHlfdCwgewotICAgIGxldCBfMiA9IHB0cl90b192ZWMoXzIsIF8xIGFzIHVzaXplKTsKLX0pOwotY2JfdmFyaWFudCEoQmFzZUNiLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IgLT4gQmFzZUNhbGxiYWNrczo6UmVtb3RlRGV2aWNlUHJvcGVydGllcywKLXUzMiAtPiBCdFN0YXR1cywgKm11dCBGZmlBZGRyZXNzIC0+IFJhd0FkZHJlc3MsIGkzMiwgKm11dCBiaW5kaW5nczo6YnRfcHJvcGVydHlfdCwgewotICAgIGxldCBfMSA9IHVuc2FmZSB7ICooXzEgYXMgKmNvbnN0IFJhd0FkZHJlc3MpIH07Ci0gICAgbGV0IF8zID0gcHRyX3RvX3ZlYyhfMywgXzIgYXMgdXNpemUpOwotfSk7Ci1jYl92YXJpYW50IShCYXNlQ2IsIGRldmljZV9mb3VuZF9jYiAtPiBCYXNlQ2FsbGJhY2tzOjpEZXZpY2VGb3VuZCwKLWkzMiwgKm11dCBiaW5kaW5nczo6YnRfcHJvcGVydHlfdCwgewotICAgIGxldCBfMSA9IHB0cl90b192ZWMoXzEsIF8wIGFzIHVzaXplKTsKLX0pOwotY2JfdmFyaWFudCEoQmFzZUNiLCBkaXNjb3Zlcnlfc3RhdGVfY2IgLT4gQmFzZUNhbGxiYWNrczo6RGlzY292ZXJ5U3RhdGUsCi0gICAgYmluZGluZ3M6OmJ0X2Rpc2NvdmVyeV9zdGF0ZV90IC0+IEJ0RGlzY292ZXJ5U3RhdGUpOwotY2JfdmFyaWFudCEoQmFzZUNiLCBwaW5fcmVxdWVzdF9jYiAtPiBCYXNlQ2FsbGJhY2tzOjpQaW5SZXF1ZXN0LAotKm11dCBGZmlBZGRyZXNzLCAqbXV0IGJpbmRpbmdzOjpidF9iZG5hbWVfdCwgdTMyLCBib29sLCB7Ci0gICAgbGV0IF8wID0gdW5zYWZlIHsgKihfMCBhcyAqY29uc3QgUmF3QWRkcmVzcyl9OwotICAgIGxldCBfMSA9IFN0cmluZzo6ZnJvbSh1bnNhZmV7Kl8xfSk7Ci19KTsKLWNiX3ZhcmlhbnQhKEJhc2VDYiwgc3NwX3JlcXVlc3RfY2IgLT4gQmFzZUNhbGxiYWNrczo6U3NwUmVxdWVzdCwKLSptdXQgRmZpQWRkcmVzcywgKm11dCBiaW5kaW5nczo6YnRfYmRuYW1lX3QsIHUzMiwgYmluZGluZ3M6OmJ0X3NzcF92YXJpYW50X3QgLT4gQnRTc3BWYXJpYW50LCB1MzIsIHsKLSAgICBsZXQgXzAgPSB1bnNhZmUgeyAqKF8wIGFzICpjb25zdCBSYXdBZGRyZXNzKSB9OwotICAgIGxldCBfMSA9IFN0cmluZzo6ZnJvbSh1bnNhZmV7Kl8xfSk7Ci19KTsKLWNiX3ZhcmlhbnQhKEJhc2VDYiwgYm9uZF9zdGF0ZV9jYiAtPiBCYXNlQ2FsbGJhY2tzOjpCb25kU3RhdGUsCi11MzIgLT4gQnRTdGF0dXMsICptdXQgRmZpQWRkcmVzcywgYmluZGluZ3M6OmJ0X2JvbmRfc3RhdGVfdCAtPiBCdEJvbmRTdGF0ZSwgaTMyLCB7Ci0gICAgbGV0IF8xID0gdW5zYWZlIHsgKihfMSBhcyAqY29uc3QgUmF3QWRkcmVzcykgfTsKLX0pOwotY2JfdmFyaWFudCEoQmFzZUNiLCBhY2xfc3RhdGVfY2IgLT4gQmFzZUNhbGxiYWNrczo6QWNsU3RhdGUsCi11MzIgLT4gQnRTdGF0dXMsICptdXQgRmZpQWRkcmVzcywgYmluZGluZ3M6OmJ0X2FjbF9zdGF0ZV90IC0+IEJ0QWNsU3RhdGUsIGkzMiAtPiBCdFRyYW5zcG9ydCwgYmluZGluZ3M6OmJ0X2hjaV9lcnJvcl9jb2RlX3QgLT4gQnRIY2lFcnJvckNvZGUsIHsKLSAgICBsZXQgXzEgPSB1bnNhZmUgeyAqKF8xIGFzICpjb25zdCBSYXdBZGRyZXNzKSB9OwotfSk7Ci0KLXN0cnVjdCBSYXdJbnRlcmZhY2VXcmFwcGVyIHsKLSAgICBwdWIgcmF3OiAqY29uc3QgYmluZGluZ3M6OmJ0X2ludGVyZmFjZV90LAotfQotCi11bnNhZmUgaW1wbCBTZW5kIGZvciBSYXdJbnRlcmZhY2VXcmFwcGVyIHt9Ci0KLXB1YiBzdHJ1Y3QgQmx1ZXRvb3RoSW50ZXJmYWNlIHsKLSAgICBpbnRlcm5hbDogUmF3SW50ZXJmYWNlV3JhcHBlciwKLSAgICBwdWIgaXNfaW5pdDogYm9vbCwKLSAgICAvLyBOZWVkIHRvIHRha2Ugb3duZXJzaGlwIG9mIGNhbGxiYWNrcyBzbyBpdCBkb2Vzbid0IGdldCBmcmVlZCBhZnRlciBpbml0Ci0gICAgY2FsbGJhY2tzOiBPcHRpb248Qm94PGJpbmRpbmdzOjpidF9jYWxsYmFja3NfdD4+LAotfQotCi0jW21hY3JvX2V4cG9ydF0KLW1hY3JvX3J1bGVzISBjY2FsbCB7Ci0gICAgKCRzZWxmOmlkZW50LCRmbl9uYW1lOmlkZW50KSA9PiB7Ci0gICAgICAgIHVuc2FmZSB7Ci0gICAgICAgICAgICAoKCokc2VsZi5pbnRlcm5hbC5yYXcpLiRmbl9uYW1lLnVud3JhcCgpKSgpCi0gICAgICAgIH0KLSAgICB9OwotICAgICgkc2VsZjppZGVudCwkZm5fbmFtZTppZGVudCwgJCgkYXJnczpleHByKSwqKSA9PiB7Ci0gICAgICAgIHVuc2FmZSB7Ci0gICAgICAgICAgICAoKCokc2VsZi5pbnRlcm5hbC5yYXcpLiRmbl9uYW1lLnVud3JhcCgpKSgkKCRhcmdzKSwqKQotICAgICAgICB9Ci0gICAgfQotfQotCi1pbXBsIEJsdWV0b290aEludGVyZmFjZSB7Ci0gICAgcHViIGZuIGlzX2luaXRpYWxpemVkKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5pc19pbml0Ci0gICAgfQotCi0gICAgcHViIGZuIGluaXRpYWxpemUoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2tzRGlzcGF0Y2hlciwKLSAgICAgICAgaW5pdF9mbGFnczogVmVjPFN0cmluZz4sCi0gICAgKSAtPiBib29sIHsKLSAgICAgICAgLy8gSW5pdCBmbGFncyBuZWVkIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHN0cmluZyB0byBudWxsIHRlcm1pbmF0ZWQgYnl0ZXMKLSAgICAgICAgbGV0IGNvbnZlcnRlZDogY3h4OjpVbmlxdWVQdHI8ZmZpOjpJbml0RmxhZ3M+ID0gZmZpOjpDb252ZXJ0RmxhZ3MoaW5pdF9mbGFncyk7Ci0gICAgICAgIGxldCBmbGFncyA9ICgqY29udmVydGVkKS5HZXRGbGFnc1B0cigpOwotCi0gICAgICAgIGlmIGdldF9kaXNwYXRjaGVycygpLmxvY2soKS51bndyYXAoKS5zZXQ6OjxCYXNlQ2I+KEFyYzo6bmV3KE11dGV4OjpuZXcoY2FsbGJhY2tzKSkpIHsKLSAgICAgICAgICAgIHBhbmljISgiVHJpZWQgdG8gc2V0IGRpc3BhdGNoZXIgZm9yIEJhc2VDYWxsYmFja3MgYnV0IGl0IGFscmVhZHkgZXhpc3RlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsbCB1cCBjYWxsYmFja3Mgc3RydWN0IHRvIHBhc3MgdG8gaW5pdCBmdW5jdGlvbiAod2lsbCBiZSBjb3BpZWQgc28KLSAgICAgICAgLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBvd25lcnNoaXApCi0gICAgICAgIGxldCBtdXQgY2FsbGJhY2tzID0gQm94OjpuZXcoYmluZGluZ3M6OmJ0X2NhbGxiYWNrc190IHsKLSAgICAgICAgICAgIHNpemU6IDE2ICogOCwKLSAgICAgICAgICAgIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYjogU29tZShhZGFwdGVyX3N0YXRlX2NiKSwKLSAgICAgICAgICAgIGFkYXB0ZXJfcHJvcGVydGllc19jYjogU29tZShhZGFwdGVyX3Byb3BlcnRpZXNfY2IpLAotICAgICAgICAgICAgcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiOiBTb21lKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYiksCi0gICAgICAgICAgICBkZXZpY2VfZm91bmRfY2I6IFNvbWUoZGV2aWNlX2ZvdW5kX2NiKSwKLSAgICAgICAgICAgIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiOiBTb21lKGRpc2NvdmVyeV9zdGF0ZV9jYiksCi0gICAgICAgICAgICBwaW5fcmVxdWVzdF9jYjogU29tZShwaW5fcmVxdWVzdF9jYiksCi0gICAgICAgICAgICBzc3BfcmVxdWVzdF9jYjogU29tZShzc3BfcmVxdWVzdF9jYiksCi0gICAgICAgICAgICBib25kX3N0YXRlX2NoYW5nZWRfY2I6IFNvbWUoYm9uZF9zdGF0ZV9jYiksCi0gICAgICAgICAgICBhY2xfc3RhdGVfY2hhbmdlZF9jYjogU29tZShhY2xfc3RhdGVfY2IpLAotICAgICAgICAgICAgdGhyZWFkX2V2dF9jYjogTm9uZSwKLSAgICAgICAgICAgIGR1dF9tb2RlX3JlY3ZfY2I6IE5vbmUsCi0gICAgICAgICAgICBsZV90ZXN0X21vZGVfY2I6IE5vbmUsCi0gICAgICAgICAgICBlbmVyZ3lfaW5mb19jYjogTm9uZSwKLSAgICAgICAgICAgIGxpbmtfcXVhbGl0eV9yZXBvcnRfY2I6IE5vbmUsCi0gICAgICAgICAgICBnZW5lcmF0ZV9sb2NhbF9vb2JfZGF0YV9jYjogTm9uZSwKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbGV0IHJhd2NiOiAqbXV0IGJpbmRpbmdzOjpidF9jYWxsYmFja3NfdCA9ICZtdXQgKmNhbGxiYWNrczsKLQotICAgICAgICBsZXQgKGd1ZXN0X21vZGUsIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlLCBjb25maWdfY29tcGFyZV9yZXN1bHQsIGlzX2F0dikgPQotICAgICAgICAgICAgKGZhbHNlLCBmYWxzZSwgMCwgZmFsc2UpOwotCi0gICAgICAgIGxldCBpbml0ID0gY2NhbGwhKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGluaXQsCi0gICAgICAgICAgICByYXdjYiwKLSAgICAgICAgICAgIGd1ZXN0X21vZGUsCi0gICAgICAgICAgICBpc19jb21tb25fY3JpdGVyaWFfbW9kZSwKLSAgICAgICAgICAgIGNvbmZpZ19jb21wYXJlX3Jlc3VsdCwKLSAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgaXNfYXR2Ci0gICAgICAgICk7Ci0KLSAgICAgICAgc2VsZi5pc19pbml0ID0gaW5pdCA9PSAwOwotICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFNvbWUoY2FsbGJhY2tzKTsKLQotICAgICAgICByZXR1cm4gc2VsZi5pc19pbml0OwotICAgIH0KLQotICAgIHB1YiBmbiBjbGVhbnVwKCZzZWxmKSB7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBjbGVhbnVwKQotICAgIH0KLQotICAgIHB1YiBmbiBlbmFibGUoJnNlbGYpIC0+IGkzMiB7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBlbmFibGUpCi0gICAgfQotCi0gICAgcHViIGZuIGRpc2FibGUoJnNlbGYpIC0+IGkzMiB7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBkaXNhYmxlKQotICAgIH0KLQotICAgIHB1YiBmbiBnZXRfYWRhcHRlcl9wcm9wZXJ0aWVzKCZzZWxmKSAtPiBpMzIgewotICAgICAgICBjY2FsbCEoc2VsZiwgZ2V0X2FkYXB0ZXJfcHJvcGVydGllcykKLSAgICB9Ci0KLSAgICBwdWIgZm4gZ2V0X2FkYXB0ZXJfcHJvcGVydHkoJnNlbGYsIHByb3A6IEJ0UHJvcGVydHlUeXBlKSAtPiBpMzIgewotICAgICAgICBsZXQgY29udmVydGVkX3R5cGUgPSBiaW5kaW5nczo6YnRfcHJvcGVydHlfdHlwZV90Ojpmcm9tKHByb3ApOwotICAgICAgICBjY2FsbCEoc2VsZiwgZ2V0X2FkYXB0ZXJfcHJvcGVydHksIGNvbnZlcnRlZF90eXBlKQotICAgIH0KLQotICAgIHB1YiBmbiBzZXRfYWRhcHRlcl9wcm9wZXJ0eSgmc2VsZiwgcHJvcDogQmx1ZXRvb3RoUHJvcGVydHkpIC0+IGkzMiB7Ci0gICAgICAgIGxldCBwcm9wX3BhaXI6IChCb3g8W3U4XT4sIGJpbmRpbmdzOjpidF9wcm9wZXJ0eV90KSA9IHByb3AuaW50bygpOwotICAgICAgICBjY2FsbCEoc2VsZiwgc2V0X2FkYXB0ZXJfcHJvcGVydHksICZwcm9wX3BhaXIuMSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcygmc2VsZiwgYWRkcjogJm11dCBSYXdBZGRyZXNzKSAtPiBpMzIgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICptdXQgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzLCBmZmlfYWRkcikKLSAgICB9Ci0KLSAgICBwdWIgZm4gZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgICAgICZzZWxmLAotICAgICAgICBhZGRyOiAmbXV0IFJhd0FkZHJlc3MsCi0gICAgICAgIHByb3BfdHlwZTogQnRQcm9wZXJ0eVR5cGUsCi0gICAgKSAtPiBpMzIgewotICAgICAgICBsZXQgY29udmVydGVkX3R5cGUgPSBiaW5kaW5nczo6YnRfcHJvcGVydHlfdHlwZV90Ojpmcm9tKHByb3BfdHlwZSk7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKm11dCBSYXdBZGRyZXNzKTsKLSAgICAgICAgY2NhbGwhKHNlbGYsIGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5LCBmZmlfYWRkciwgY29udmVydGVkX3R5cGUpCi0gICAgfQotCi0gICAgcHViIGZuIHNldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgYWRkcjogJm11dCBSYXdBZGRyZXNzLAotICAgICAgICBwcm9wOiBCbHVldG9vdGhQcm9wZXJ0eSwKLSAgICApIC0+IGkzMiB7Ci0gICAgICAgIGxldCBwcm9wX3BhaXI6IChCb3g8W3U4XT4sIGJpbmRpbmdzOjpidF9wcm9wZXJ0eV90KSA9IHByb3AuaW50bygpOwotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICpjb25zdCBSYXdBZGRyZXNzKTsKLSAgICAgICAgY2NhbGwhKHNlbGYsIHNldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5LCBmZmlfYWRkciwgJnByb3BfcGFpci4xKQotICAgIH0KLQotICAgIHB1YiBmbiBnZXRfcmVtb3RlX3NlcnZpY2VzKCZzZWxmLCBhZGRyOiAmbXV0IFJhd0FkZHJlc3MsIHRyYW5zcG9ydDogQnRUcmFuc3BvcnQpIC0+IGkzMiB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKmNvbnN0IFJhd0FkZHJlc3MpOwotICAgICAgICBjY2FsbCEoc2VsZiwgZ2V0X3JlbW90ZV9zZXJ2aWNlcywgZmZpX2FkZHIsIHRyYW5zcG9ydC50b19pMzIoKS51bndyYXAoKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gc3RhcnRfZGlzY292ZXJ5KCZzZWxmKSAtPiBpMzIgewotICAgICAgICBjY2FsbCEoc2VsZiwgc3RhcnRfZGlzY292ZXJ5KQotICAgIH0KLQotICAgIHB1YiBmbiBjYW5jZWxfZGlzY292ZXJ5KCZzZWxmKSAtPiBpMzIgewotICAgICAgICBjY2FsbCEoc2VsZiwgY2FuY2VsX2Rpc2NvdmVyeSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gY3JlYXRlX2JvbmQoJnNlbGYsIGFkZHI6ICZSYXdBZGRyZXNzLCB0cmFuc3BvcnQ6IEJ0VHJhbnNwb3J0KSAtPiBpMzIgewotICAgICAgICBsZXQgY3RyYW5zcG9ydDogaTMyID0gdHJhbnNwb3J0LmludG8oKTsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19jb25zdF9mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBjcmVhdGVfYm9uZCwgZmZpX2FkZHIsIGN0cmFuc3BvcnQpCi0gICAgfQotCi0gICAgcHViIGZuIHJlbW92ZV9ib25kKCZzZWxmLCBhZGRyOiAmUmF3QWRkcmVzcykgLT4gaTMyIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19jb25zdF9mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCByZW1vdmVfYm9uZCwgZmZpX2FkZHIpCi0gICAgfQotCi0gICAgcHViIGZuIGNhbmNlbF9ib25kKCZzZWxmLCBhZGRyOiAmUmF3QWRkcmVzcykgLT4gaTMyIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19jb25zdF9mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBjYW5jZWxfYm9uZCwgZmZpX2FkZHIpCi0gICAgfQotCi0gICAgcHViIGZuIGdldF9jb25uZWN0aW9uX3N0YXRlKCZzZWxmLCBhZGRyOiAmUmF3QWRkcmVzcykgLT4gdTMyIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19jb25zdF9mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBnZXRfY29ubmVjdGlvbl9zdGF0ZSwgZmZpX2FkZHIpLnRvX3UzMigpLnVud3JhcCgpCi0gICAgfQotCi0gICAgcHViIGZuIHBpbl9yZXBseSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGFkZHI6ICZSYXdBZGRyZXNzLAotICAgICAgICBhY2NlcHQ6IHU4LAotICAgICAgICBwaW5fbGVuOiB1OCwKLSAgICAgICAgcGluX2NvZGU6ICZtdXQgQnRQaW5Db2RlLAotICAgICkgLT4gaTMyIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19jb25zdF9mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBwaW5fcmVwbHksIGZmaV9hZGRyLCBhY2NlcHQsIHBpbl9sZW4sIHBpbl9jb2RlKQotICAgIH0KLQotICAgIHB1YiBmbiBzc3BfcmVwbHkoCi0gICAgICAgICZzZWxmLAotICAgICAgICBhZGRyOiAmUmF3QWRkcmVzcywKLSAgICAgICAgdmFyaWFudDogQnRTc3BWYXJpYW50LAotICAgICAgICBhY2NlcHQ6IHU4LAotICAgICAgICBwYXNza2V5OiB1MzIsCi0gICAgKSAtPiBpMzIgewotICAgICAgICBsZXQgY3ZhcmlhbnQgPSBiaW5kaW5nczo6YnRfc3NwX3ZhcmlhbnRfdDo6ZnJvbSh2YXJpYW50KTsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19jb25zdF9mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIGNjYWxsIShzZWxmLCBzc3BfcmVwbHksIGZmaV9hZGRyLCBjdmFyaWFudCwgYWNjZXB0LCBwYXNza2V5KQotICAgIH0KLQotICAgIHB1YihjcmF0ZSkgZm4gZ2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgcHJvZmlsZTogU3VwcG9ydGVkUHJvZmlsZXMsCi0gICAgKSAtPiAqY29uc3Qgc3RkOjpvczo6cmF3OjpjX3ZvaWQgewotICAgICAgICBsZXQgY3Byb2ZpbGUgPSBWZWM6Ojx1OD46OmZyb20ocHJvZmlsZSk7Ci0gICAgICAgIGNjYWxsISgKLSAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICBnZXRfcHJvZmlsZV9pbnRlcmZhY2UsCi0gICAgICAgICAgICBjcHJvZmlsZS5hc19zbGljZSgpLmFzX3B0cigpIGFzICpjb25zdCBzdGQ6Om9zOjpyYXc6OmNfY2hhcgotICAgICAgICApCi0gICAgfQotCi0gICAgcHViKGNyYXRlKSBmbiBhc19yYXdfcHRyKCZzZWxmKSAtPiAqY29uc3QgdTggewotICAgICAgICBzZWxmLmludGVybmFsLnJhdyBhcyAqY29uc3QgdTgKLSAgICB9Ci19Ci0KLXB1YiBmbiBnZXRfYnRpbnRlcmZhY2UoKSAtPiBPcHRpb248Qmx1ZXRvb3RoSW50ZXJmYWNlPiB7Ci0gICAgbGV0IG11dCByZXQ6IE9wdGlvbjxCbHVldG9vdGhJbnRlcmZhY2U+ID0gTm9uZTsKLSAgICBsZXQgbXV0IGlmcHRyOiAqY29uc3QgYmluZGluZ3M6OmJ0X2ludGVyZmFjZV90ID0gc3RkOjpwdHI6Om51bGwoKTsKLQotICAgIHVuc2FmZSB7Ci0gICAgICAgIGlmIGJpbmRpbmdzOjpoYWxfdXRpbF9sb2FkX2J0X2xpYnJhcnkoJm11dCBpZnB0cikgPT0gMCB7Ci0gICAgICAgICAgICByZXQgPSBTb21lKEJsdWV0b290aEludGVyZmFjZSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJuYWw6IFJhd0ludGVyZmFjZVdyYXBwZXIgeyByYXc6IGlmcHRyIH0sCi0gICAgICAgICAgICAgICAgaXNfaW5pdDogZmFsc2UsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tzOiBOb25lLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXQKLX0KLQotLy8gVHVybnMgQy1hcnJheSBUW10gdG8gVmVjPFU+LgotcHViKGNyYXRlKSBmbiBwdHJfdG9fdmVjPFQ6IENvcHksIFU6IEZyb208VD4+KHN0YXJ0OiAqY29uc3QgVCwgbGVuZ3RoOiB1c2l6ZSkgLT4gVmVjPFU+IHsKLSAgICB1bnNhZmUgeyAoMC4ubGVuZ3RoKS5tYXAofGl8IFU6OmZyb20oKnN0YXJ0Lm9mZnNldChpIGFzIGlzaXplKSkpLmNvbGxlY3Q6OjxWZWM8VT4+KCkgfQotfQotCi0jW2NmZyh0ZXN0KV0KLW1vZCB0ZXN0cyB7Ci0gICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBzdGQ6Om1lbTsKLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X2FkZHJfc2l6ZSgpIHsKLSAgICAgICAgYXNzZXJ0X2VxIShtZW06OnNpemVfb2Y6OjxSYXdBZGRyZXNzPigpLCBtZW06OnNpemVfb2Y6OjxGZmlBZGRyZXNzPigpKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9vZmZzZXQoKSB7Ci0gICAgICAgIGxldCByID0gUmF3QWRkcmVzcyB7IHZhbDogWzEsIDIsIDMsIDQsIDUsIDZdIH07Ci0gICAgICAgIGxldCBmID0gRmZpQWRkcmVzcyB7IGFkZHJlc3M6IFsxLCAyLCAzLCA0LCA1LCA2XSB9OwotICAgICAgICBhc3NlcnRfZXEhKAotICAgICAgICAgICAgJmYgYXMgKmNvbnN0IF8gYXMgdXNpemUgLSAmZi5hZGRyZXNzIGFzICpjb25zdCBfIGFzIHVzaXplLAotICAgICAgICAgICAgJnIgYXMgKmNvbnN0IF8gYXMgdXNpemUgLSAmci52YWwgYXMgKmNvbnN0IF8gYXMgdXNpemUKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9hbGlnbm1lbnQoKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoc3RkOjptZW06OmFsaWduX29mOjo8UmF3QWRkcmVzcz4oKSwgc3RkOjptZW06OmFsaWduX29mOjo8RmZpQWRkcmVzcz4oKSk7Ci0gICAgfQotCi0gICAgZm4gbWFrZV9iZG5hbWVfZnJvbV9zbGljZShzbGljZTogJlt1OF0pIC0+IGJpbmRpbmdzOjpidF9iZG5hbWVfdCB7Ci0gICAgICAgIC8vIExlbmd0aCBvZiBzbGljZSBtdXN0IGJlIGxlc3MgdGhhbiBiZF9uYW1lIG1heAotICAgICAgICBhc3NlcnQhKHNsaWNlLmxlbigpIDw9IDI0OSk7Ci0KLSAgICAgICAgbGV0IG11dCBiZG5hbWUgPSBiaW5kaW5nczo6YnRfYmRuYW1lX3QgeyBuYW1lOiBbMTI4OyAyNDldIH07Ci0KLSAgICAgICAgZm9yIChpLCB2KSBpbiBzbGljZS5pdGVyKCkuZW51bWVyYXRlKCkgewotICAgICAgICAgICAgYmRuYW1lLm5hbWVbaV0gPSB2LmNsb25lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBiZG5hbWUKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9iZG5hbWVfY29udmVyc2lvbnMoKSB7Ci0gICAgICAgIGxldCBoZWxsb19iZG5hbWUgPSBtYWtlX2JkbmFtZV9mcm9tX3NsaWNlKCZbNzIsIDY5LCA3NiwgNzYsIDc5LCAwXSk7Ci0gICAgICAgIGFzc2VydF9lcSEoIkhFTExPIi50b19zdHJpbmcoKSwgU3RyaW5nOjpmcm9tKGhlbGxvX2JkbmFtZSkpOwotCi0gICAgICAgIGxldCBlbXB0eV9iZG5hbWUgPSBtYWtlX2JkbmFtZV9mcm9tX3NsaWNlKCZbMF0pOwotICAgICAgICBhc3NlcnRfZXEhKCIiLnRvX3N0cmluZygpLCBTdHJpbmc6OmZyb20oZW1wdHlfYmRuYW1lKSk7Ci0KLSAgICAgICAgbGV0IG5vX251bGx0ZXJtX2JkbmFtZSA9IG1ha2VfYmRuYW1lX2Zyb21fc2xpY2UoJls3MiwgNjksIDc2LCA3NiwgNzldKTsKLSAgICAgICAgYXNzZXJ0X2VxISgiIi50b19zdHJpbmcoKSwgU3RyaW5nOjpmcm9tKG5vX251bGx0ZXJtX2JkbmFtZSkpOwotCi0gICAgICAgIGxldCBpbnZhbGlkX2JkbmFtZSA9IG1ha2VfYmRuYW1lX2Zyb21fc2xpY2UoJlsxMjg7IDI0OV0pOwotICAgICAgICBhc3NlcnRfZXEhKCIiLnRvX3N0cmluZygpLCBTdHJpbmc6OmZyb20oaW52YWxpZF9iZG5hbWUpKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9wdHJfdG9fdmVjKCkgewotICAgICAgICBsZXQgYXJyOiBbaTMyOyAzXSA9IFsxLCAyLCAzXTsKLSAgICAgICAgbGV0IHZlYzogVmVjPGkzMj4gPSBwdHJfdG9fdmVjKGFyci5hc19wdHIoKSwgYXJyLmxlbigpKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkOiBWZWM8aTMyPiA9IHZlYyFbMSwgMiwgM107Ci0gICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIHZlYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL3NyYy9jb250cm9sbGVyLnJzIGIvZ2QvcnVzdC90b3BzaGltL3NyYy9jb250cm9sbGVyLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg0OTI4Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9zcmMvY29udHJvbGxlci5ycworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNbY3h4OjpicmlkZ2UobmFtZXNwYWNlID0gYmx1ZXRvb3RoOjp0b3BzaGltOjpydXN0KV0KLW1vZCBmZmkgewotICAgIHB1YiBzdHJ1Y3QgUnVzdFJhd0FkZHJlc3MgewotICAgICAgICBhZGRyZXNzOiBbdTg7IDZdLAotICAgIH0KLQotICAgIHVuc2FmZSBleHRlcm4gIkMrKyIgewotICAgICAgICBpbmNsdWRlISgiY29udHJvbGxlci9jb250cm9sbGVyX3NoaW0uaCIpOwotCi0gICAgICAgIHR5cGUgQ29udHJvbGxlckludGY7Ci0KLSAgICAgICAgZm4gR2V0Q29udHJvbGxlckludGVyZmFjZSgpIC0+IFVuaXF1ZVB0cjxDb250cm9sbGVySW50Zj47Ci0gICAgICAgIGZuIHJlYWRfbG9jYWxfYWRkcihzZWxmOiAmQ29udHJvbGxlckludGYpIC0+IFJ1c3RSYXdBZGRyZXNzOwotICAgIH0KLX0KLQotcHViIHN0cnVjdCBDb250cm9sbGVyIHsKLSAgICBpbnRlcm5hbDogY3h4OjpVbmlxdWVQdHI8ZmZpOjpDb250cm9sbGVySW50Zj4sCi19Ci0KLXVuc2FmZSBpbXBsIFNlbmQgZm9yIENvbnRyb2xsZXIge30KLQotaW1wbCBDb250cm9sbGVyIHsKLSAgICBwdWIgZm4gbmV3KCkgLT4gQ29udHJvbGxlciB7Ci0gICAgICAgIGxldCBpbnRmID0gZmZpOjpHZXRDb250cm9sbGVySW50ZXJmYWNlKCk7Ci0gICAgICAgIENvbnRyb2xsZXIgeyBpbnRlcm5hbDogaW50ZiB9Ci0gICAgfQotCi0gICAgcHViIGZuIHJlYWRfbG9jYWxfYWRkcigmbXV0IHNlbGYpIC0+IFt1ODsgNl0gewotICAgICAgICBzZWxmLmludGVybmFsLnJlYWRfbG9jYWxfYWRkcigpLmFkZHJlc3MKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL2xpYi5ycyBiL2dkL3J1c3QvdG9wc2hpbS9zcmMvbGliLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjQwYmE4Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9zcmMvbGliLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLy8hIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBSdXN0IHRvIEMrKy4KLSNbbWFjcm9fdXNlXQotZXh0ZXJuIGNyYXRlIGxhenlfc3RhdGljOwotI1ttYWNyb191c2VdCi1leHRlcm4gY3JhdGUgbnVtX2Rlcml2ZTsKLSNbbWFjcm9fdXNlXQotZXh0ZXJuIGNyYXRlIGJpdGZsYWdzOwotCi1wdWIgbW9kIGJpbmRpbmdzOwotcHViIG1vZCBidGlmOwotcHViIG1vZCBjb250cm9sbGVyOwotcHViIG1vZCBwcm9maWxlczsKLXB1YiBtb2QgdG9wc3RhY2s7CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2EyZHAucnMgYi9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2EyZHAucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MGViZGQuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL3NyYy9wcm9maWxlcy9hMmRwLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLXVzZSBjcmF0ZTo6YnRpZjo6e0JsdWV0b290aEludGVyZmFjZSwgUmF3QWRkcmVzc307Ci11c2UgY3JhdGU6OnRvcHN0YWNrOjpnZXRfZGlzcGF0Y2hlcnM7Ci0KLXVzZSBudW1fdHJhaXRzOjpjYXN0OjpGcm9tUHJpbWl0aXZlOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHRvcHNoaW1fbWFjcm9zOjpjYl92YXJpYW50OwotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRhdkNvbm5lY3Rpb25TdGF0ZSB7Ci0gICAgRGlzY29ubmVjdGVkID0gMCwKLSAgICBDb25uZWN0aW5nLAotICAgIENvbm5lY3RlZCwKLSAgICBEaXNjb25uZWN0aW5nLAotfQotCi1pbXBsIEZyb208dTMyPiBmb3IgQnRhdkNvbm5lY3Rpb25TdGF0ZSB7Ci0gICAgZm4gZnJvbShpdGVtOiB1MzIpIC0+IFNlbGYgewotICAgICAgICBCdGF2Q29ubmVjdGlvblN0YXRlOjpmcm9tX3UzMihpdGVtKS51bndyYXAoKQotICAgIH0KLX0KLQotI1tkZXJpdmUoRGVidWcsIEZyb21QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0YXZBdWRpb1N0YXRlIHsKLSAgICBSZW1vdGVTdXNwZW5kID0gMCwKLSAgICBTdG9wcGVkLAotICAgIFN0YXJ0ZWQsCi19Ci0KLWltcGwgRnJvbTx1MzI+IGZvciBCdGF2QXVkaW9TdGF0ZSB7Ci0gICAgZm4gZnJvbShpdGVtOiB1MzIpIC0+IFNlbGYgewotICAgICAgICBCdGF2QXVkaW9TdGF0ZTo6ZnJvbV91MzIoaXRlbSkudW53cmFwKCkKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKERlYnVnLCBGcm9tUHJpbWl0aXZlLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBBMmRwQ29kZWNJbmRleCB7Ci0gICAgU3JjU2JjID0gMCwKLSAgICBTcmNBYWMsCi0gICAgU3JjQXB0eCwKLSAgICBTcmNBcHR4SEQsCi0gICAgU3JjTGRhYywKLSAgICBTaW5rU2JjLAotICAgIFNpbmtBYWMsCi0gICAgU2lua0xkYWMsCi0gICAgTWF4LAotfQotCi1pbXBsIEEyZHBDb2RlY0luZGV4IHsKLSAgICBwdWIgY29uc3QgU1JDX01JTjogQTJkcENvZGVjSW5kZXggPSBBMmRwQ29kZWNJbmRleDo6U3JjU2JjOwotICAgIHB1YiBjb25zdCBTUkNfTUFYOiBBMmRwQ29kZWNJbmRleCA9IEEyZHBDb2RlY0luZGV4OjpTaW5rU2JjOwotICAgIHB1YiBjb25zdCBTSU5LX01JTjogQTJkcENvZGVjSW5kZXggPSBBMmRwQ29kZWNJbmRleDo6U2lua1NiYzsKLSAgICBwdWIgY29uc3QgU0lOS19NQVg6IEEyZHBDb2RlY0luZGV4ID0gQTJkcENvZGVjSW5kZXg6Ok1heDsKLSAgICBwdWIgY29uc3QgTUFYOiBBMmRwQ29kZWNJbmRleCA9IEEyZHBDb2RlY0luZGV4OjpNYXg7Ci0gICAgcHViIGNvbnN0IE1JTjogQTJkcENvZGVjSW5kZXggPSBBMmRwQ29kZWNJbmRleDo6U3JjU2JjOwotfQotCi1pbXBsIEZyb208aTMyPiBmb3IgQTJkcENvZGVjSW5kZXggewotICAgIGZuIGZyb20oaXRlbTogaTMyKSAtPiBTZWxmIHsKLSAgICAgICAgQTJkcENvZGVjSW5kZXg6OmZyb21faTMyKGl0ZW0pLnVud3JhcF9vcl9lbHNlKHx8IEEyZHBDb2RlY0luZGV4OjpNSU4pCi0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcihpMzIpXQotcHViIGVudW0gQTJkcENvZGVjUHJpb3JpdHkgewotICAgIERpc2FibGVkID0gLTEsCi0gICAgRGVmYXVsdCA9IDAsCi0gICAgSGlnaGVzdCA9IDFfMDAwXzAwMCwKLX0KLQotaW1wbCBGcm9tPGkzMj4gZm9yIEEyZHBDb2RlY1ByaW9yaXR5IHsKLSAgICBmbiBmcm9tKGl0ZW06IGkzMikgLT4gU2VsZiB7Ci0gICAgICAgIEEyZHBDb2RlY1ByaW9yaXR5Ojpmcm9tX2kzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBBMmRwQ29kZWNQcmlvcml0eTo6RGVmYXVsdCkKLSAgICB9Ci19Ci0KLWJpdGZsYWdzISB7Ci0gICAgcHViIHN0cnVjdCBBMmRwQ29kZWNTYW1wbGVSYXRlOiBpMzIgewotICAgICAgICBjb25zdCBSQVRFX05PTkUgPSAweDA7Ci0gICAgICAgIGNvbnN0IFJBVEVfNDQxMDAgPSAweDAxOwotICAgICAgICBjb25zdCBSQVRFXzQ4MDAwID0gMHgwMjsKLSAgICAgICAgY29uc3QgUkFURV84ODIwMCA9IDB4MDQ7Ci0gICAgICAgIGNvbnN0IFJBVEVfOTYwMDAgPSAweDA4OwotICAgICAgICBjb25zdCBSQVRFXzE3NjQwMCA9IDB4MTA7Ci0gICAgICAgIGNvbnN0IFJBVEVfMTkyMDAwID0gMHgyMDsKLSAgICAgICAgY29uc3QgUkFURV8xNjAwMCA9IDB4NDA7Ci0gICAgICAgIGNvbnN0IFJBVEVfMjQwMDAgPSAweDgwOwotICAgIH0KLX0KLQotaW1wbCBBMmRwQ29kZWNTYW1wbGVSYXRlIHsKLSAgICBwdWIgZm4gdmFsaWRhdGVfYml0cyh2YWw6IGkzMikgLT4gYm9vbCB7Ci0gICAgICAgIHZhbCA8PSBBMmRwQ29kZWNTYW1wbGVSYXRlOjphbGwoKS5iaXRzKCkKLSAgICB9Ci19Ci0KLWJpdGZsYWdzISB7Ci0gICAgcHViIHN0cnVjdCBBMmRwQ29kZWNCaXRzUGVyU2FtcGxlOiBpMzIgewotICAgICAgICBjb25zdCBTQU1QTEVfTk9ORSA9IDB4MDsKLSAgICAgICAgY29uc3QgU0FNUExFXzE2ID0gMHgwMTsKLSAgICAgICAgY29uc3QgU0FNUExFXzI0ID0gMHgwMjsKLSAgICAgICAgY29uc3QgU0FNUExFXzMyID0gMHgwNDsKLSAgICB9Ci19Ci0KLWltcGwgQTJkcENvZGVjQml0c1BlclNhbXBsZSB7Ci0gICAgcHViIGZuIHZhbGlkYXRlX2JpdHModmFsOiBpMzIpIC0+IGJvb2wgewotICAgICAgICB2YWwgPD0gQTJkcENvZGVjQml0c1BlclNhbXBsZTo6YWxsKCkuYml0cygpCi0gICAgfQotfQotCi1iaXRmbGFncyEgewotICAgIHB1YiBzdHJ1Y3QgQTJkcENvZGVjQ2hhbm5lbE1vZGU6IGkzMiB7Ci0gICAgICAgIGNvbnN0IE1PREVfTk9ORSA9IDB4MDsKLSAgICAgICAgY29uc3QgTU9ERV9NT05PID0gMHgwMTsKLSAgICAgICAgY29uc3QgTU9ERV9TVEVSRU8gPSAweDAyOwotICAgIH0KLX0KLQotaW1wbCBBMmRwQ29kZWNDaGFubmVsTW9kZSB7Ci0gICAgcHViIGZuIHZhbGlkYXRlX2JpdHModmFsOiBpMzIpIC0+IGJvb2wgewotICAgICAgICB2YWwgPD0gQTJkcENvZGVjQ2hhbm5lbE1vZGU6OmFsbCgpLmJpdHMoKQotICAgIH0KLX0KLQotI1tjeHg6OmJyaWRnZShuYW1lc3BhY2UgPSBibHVldG9vdGg6OnRvcHNoaW06OnJ1c3QpXQotcHViIG1vZCBmZmkgewotICAgICNbZGVyaXZlKERlYnVnLCBDb3B5LCBDbG9uZSldCi0gICAgcHViIHN0cnVjdCBSdXN0UmF3QWRkcmVzcyB7Ci0gICAgICAgIGFkZHJlc3M6IFt1ODsgNl0sCi0gICAgfQotCi0gICAgI1tkZXJpdmUoRGVidWcpXQotICAgIHB1YiBzdHJ1Y3QgQTJkcENvZGVjQ29uZmlnIHsKLSAgICAgICAgY29kZWNfdHlwZTogaTMyLAotICAgICAgICBjb2RlY19wcmlvcml0eTogaTMyLAotICAgICAgICBzYW1wbGVfcmF0ZTogaTMyLAotICAgICAgICBiaXRzX3Blcl9zYW1wbGU6IGkzMiwKLSAgICAgICAgY2hhbm5lbF9tb2RlOiBpMzIsCi0gICAgICAgIGNvZGVjX3NwZWNpZmljXzE6IGk2NCwKLSAgICAgICAgY29kZWNfc3BlY2lmaWNfMjogaTY0LAotICAgICAgICBjb2RlY19zcGVjaWZpY18zOiBpNjQsCi0gICAgICAgIGNvZGVjX3NwZWNpZmljXzQ6IGk2NCwKLSAgICB9Ci0KLSAgICAjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCi0gICAgcHViIHN0cnVjdCBSdXN0UHJlc2VudGF0aW9uUG9zaXRpb24gewotICAgICAgICByZW1vdGVfZGVsYXlfcmVwb3J0X25zOiB1NjQsCi0gICAgICAgIHRvdGFsX2J5dGVzX3JlYWQ6IHU2NCwKLSAgICAgICAgZGF0YV9wb3NpdGlvbl9zZWM6IGk2NCwKLSAgICAgICAgZGF0YV9wb3NpdGlvbl9uc2VjOiBpMzIsCi0gICAgfQotCi0gICAgdW5zYWZlIGV4dGVybiAiQysrIiB7Ci0gICAgICAgIGluY2x1ZGUhKCJidGF2L2J0YXZfc2hpbS5oIik7Ci0gICAgICAgIGluY2x1ZGUhKCJidGF2X3NpbmsvYnRhdl9zaW5rX3NoaW0uaCIpOwotCi0gICAgICAgIHR5cGUgQTJkcEludGY7Ci0gICAgICAgIHR5cGUgQTJkcFNpbmtJbnRmOwotCi0gICAgICAgIHVuc2FmZSBmbiBHZXRBMmRwUHJvZmlsZShidGlmOiAqY29uc3QgdTgpIC0+IFVuaXF1ZVB0cjxBMmRwSW50Zj47Ci0KLSAgICAgICAgZm4gaW5pdChzZWxmOiAmQTJkcEludGYpIC0+IGkzMjsKLSAgICAgICAgZm4gY29ubmVjdChzZWxmOiAmQTJkcEludGYsIGJ0X2FkZHI6IFJ1c3RSYXdBZGRyZXNzKSAtPiBpMzI7Ci0gICAgICAgIGZuIGRpc2Nvbm5lY3Qoc2VsZjogJkEyZHBJbnRmLCBidF9hZGRyOiBSdXN0UmF3QWRkcmVzcykgLT4gaTMyOwotICAgICAgICBmbiBzZXRfc2lsZW5jZV9kZXZpY2Uoc2VsZjogJkEyZHBJbnRmLCBidF9hZGRyOiBSdXN0UmF3QWRkcmVzcywgc2lsZW50OiBib29sKSAtPiBpMzI7Ci0gICAgICAgIGZuIHNldF9hY3RpdmVfZGV2aWNlKHNlbGY6ICZBMmRwSW50ZiwgYnRfYWRkcjogUnVzdFJhd0FkZHJlc3MpIC0+IGkzMjsKLSAgICAgICAgZm4gY29uZmlnX2NvZGVjKAotICAgICAgICAgICAgc2VsZjogJkEyZHBJbnRmLAotICAgICAgICAgICAgYnRfYWRkcjogUnVzdFJhd0FkZHJlc3MsCi0gICAgICAgICAgICBjb2RlY19wcmVmZXJlbmNlczogVmVjPEEyZHBDb2RlY0NvbmZpZz4sCi0gICAgICAgICkgLT4gaTMyOwotICAgICAgICBmbiBzZXRfYXVkaW9fY29uZmlnKHNlbGY6ICZBMmRwSW50ZiwgY29uZmlnOiBBMmRwQ29kZWNDb25maWcpIC0+IGJvb2w7Ci0gICAgICAgIGZuIHN0YXJ0X2F1ZGlvX3JlcXVlc3Qoc2VsZjogJkEyZHBJbnRmKSAtPiBib29sOwotICAgICAgICBmbiBzdG9wX2F1ZGlvX3JlcXVlc3Qoc2VsZjogJkEyZHBJbnRmKSAtPiBib29sOwotICAgICAgICBmbiBjbGVhbnVwKHNlbGY6ICZBMmRwSW50Zik7Ci0gICAgICAgIGZuIGdldF9wcmVzZW50YXRpb25fcG9zaXRpb24oc2VsZjogJkEyZHBJbnRmKSAtPiBSdXN0UHJlc2VudGF0aW9uUG9zaXRpb247Ci0gICAgICAgIC8vIEEyZHAgc2luayBmdW5jdGlvbnMKLQotICAgICAgICB1bnNhZmUgZm4gR2V0QTJkcFNpbmtQcm9maWxlKGJ0aWY6ICpjb25zdCB1OCkgLT4gVW5pcXVlUHRyPEEyZHBTaW5rSW50Zj47Ci0KLSAgICAgICAgZm4gaW5pdChzZWxmOiAmQTJkcFNpbmtJbnRmKSAtPiBpMzI7Ci0gICAgICAgIGZuIGNvbm5lY3Qoc2VsZjogJkEyZHBTaW5rSW50ZiwgYnRfYWRkcjogUnVzdFJhd0FkZHJlc3MpIC0+IGkzMjsKLSAgICAgICAgZm4gZGlzY29ubmVjdChzZWxmOiAmQTJkcFNpbmtJbnRmLCBidF9hZGRyOiBSdXN0UmF3QWRkcmVzcykgLT4gaTMyOwotICAgICAgICBmbiBzZXRfYWN0aXZlX2RldmljZShzZWxmOiAmQTJkcFNpbmtJbnRmLCBidF9hZGRyOiBSdXN0UmF3QWRkcmVzcykgLT4gaTMyOwotICAgICAgICBmbiBjbGVhbnVwKHNlbGY6ICZBMmRwU2lua0ludGYpOwotICAgIH0KLSAgICBleHRlcm4gIlJ1c3QiIHsKLSAgICAgICAgZm4gY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjayhhZGRyOiBSdXN0UmF3QWRkcmVzcywgc3RhdGU6IHUzMik7Ci0gICAgICAgIGZuIGF1ZGlvX3N0YXRlX2NhbGxiYWNrKGFkZHI6IFJ1c3RSYXdBZGRyZXNzLCBzdGF0ZTogdTMyKTsKLSAgICAgICAgZm4gYXVkaW9fY29uZmlnX2NhbGxiYWNrKAotICAgICAgICAgICAgYWRkcjogUnVzdFJhd0FkZHJlc3MsCi0gICAgICAgICAgICBjb2RlY19jb25maWc6IEEyZHBDb2RlY0NvbmZpZywKLSAgICAgICAgICAgIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXM6IFZlYzxBMmRwQ29kZWNDb25maWc+LAotICAgICAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzOiBWZWM8QTJkcENvZGVjQ29uZmlnPiwKLSAgICAgICAgKTsKLSAgICAgICAgZm4gbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF9jYWxsYmFjayhhZGRyOiBSdXN0UmF3QWRkcmVzcyk7Ci0gICAgfQotfQotCi1wdWIgdHlwZSBGZmlBZGRyZXNzID0gZmZpOjpSdXN0UmF3QWRkcmVzczsKLXB1YiB0eXBlIEEyZHBDb2RlY0NvbmZpZyA9IGZmaTo6QTJkcENvZGVjQ29uZmlnOwotcHViIHR5cGUgUHJlc2VudGF0aW9uUG9zaXRpb24gPSBmZmk6OlJ1c3RQcmVzZW50YXRpb25Qb3NpdGlvbjsKLQotaW1wbCBGcm9tPFJhd0FkZHJlc3M+IGZvciBGZmlBZGRyZXNzIHsKLSAgICBmbiBmcm9tKGFkZHI6IFJhd0FkZHJlc3MpIC0+IFNlbGYgewotICAgICAgICBGZmlBZGRyZXNzIHsgYWRkcmVzczogYWRkci52YWwgfQotICAgIH0KLX0KLQotaW1wbCBJbnRvPFJhd0FkZHJlc3M+IGZvciBGZmlBZGRyZXNzIHsKLSAgICBmbiBpbnRvKHNlbGYpIC0+IFJhd0FkZHJlc3MgewotICAgICAgICBSYXdBZGRyZXNzIHsgdmFsOiBzZWxmLmFkZHJlc3MgfQotICAgIH0KLX0KLQotaW1wbCBEZWZhdWx0IGZvciBBMmRwQ29kZWNDb25maWcgewotICAgIGZuIGRlZmF1bHQoKSAtPiBBMmRwQ29kZWNDb25maWcgewotICAgICAgICBBMmRwQ29kZWNDb25maWcgewotICAgICAgICAgICAgY29kZWNfdHlwZTogMCwKLSAgICAgICAgICAgIGNvZGVjX3ByaW9yaXR5OiAwLAotICAgICAgICAgICAgc2FtcGxlX3JhdGU6IDAsCi0gICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU6IDAsCi0gICAgICAgICAgICBjaGFubmVsX21vZGU6IDAsCi0gICAgICAgICAgICBjb2RlY19zcGVjaWZpY18xOiAwLAotICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfMjogMCwKLSAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljXzM6IDAsCi0gICAgICAgICAgICBjb2RlY19zcGVjaWZpY180OiAwLAotICAgICAgICB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgZW51bSBBMmRwQ2FsbGJhY2tzIHsKLSAgICBDb25uZWN0aW9uU3RhdGUoUmF3QWRkcmVzcywgQnRhdkNvbm5lY3Rpb25TdGF0ZSksCi0gICAgQXVkaW9TdGF0ZShSYXdBZGRyZXNzLCBCdGF2QXVkaW9TdGF0ZSksCi0gICAgQXVkaW9Db25maWcoUmF3QWRkcmVzcywgQTJkcENvZGVjQ29uZmlnLCBWZWM8QTJkcENvZGVjQ29uZmlnPiwgVmVjPEEyZHBDb2RlY0NvbmZpZz4pLAotICAgIE1hbmRhdG9yeUNvZGVjUHJlZmVycmVkKFJhd0FkZHJlc3MpLAotfQotCi1wdWIgc3RydWN0IEEyZHBDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBwdWIgZGlzcGF0Y2g6IEJveDxkeW4gRm4oQTJkcENhbGxiYWNrcykgKyBTZW5kPiwKLX0KLQotdHlwZSBBMmRwQ2IgPSBBcmM8TXV0ZXg8QTJkcENhbGxiYWNrc0Rpc3BhdGNoZXI+PjsKLQotY2JfdmFyaWFudCEoQTJkcENiLCBjb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrIC0+IEEyZHBDYWxsYmFja3M6OkNvbm5lY3Rpb25TdGF0ZSwKLUZmaUFkZHJlc3MgLT4gUmF3QWRkcmVzcywgdTMyIC0+IEJ0YXZDb25uZWN0aW9uU3RhdGUsIHsKLSAgICBsZXQgXzAgPSBfMC5pbnRvKCk7Ci19KTsKLQotY2JfdmFyaWFudCEoQTJkcENiLCBhdWRpb19zdGF0ZV9jYWxsYmFjayAtPiBBMmRwQ2FsbGJhY2tzOjpBdWRpb1N0YXRlLAotRmZpQWRkcmVzcyAtPiBSYXdBZGRyZXNzLCB1MzIgLT4gQnRhdkF1ZGlvU3RhdGUsIHsKLSAgICBsZXQgXzAgPSBfMC5pbnRvKCk7Ci19KTsKLQotY2JfdmFyaWFudCEoQTJkcENiLCBtYW5kYXRvcnlfY29kZWNfcHJlZmVycmVkX2NhbGxiYWNrIC0+IEEyZHBDYWxsYmFja3M6Ok1hbmRhdG9yeUNvZGVjUHJlZmVycmVkLAotRmZpQWRkcmVzcyAtPiBSYXdBZGRyZXNzLCB7Ci0gICAgbGV0IF8wID0gXzAuaW50bygpOwotfSk7Ci0KLWNiX3ZhcmlhbnQhKEEyZHBDYiwgYXVkaW9fY29uZmlnX2NhbGxiYWNrIC0+IEEyZHBDYWxsYmFja3M6OkF1ZGlvQ29uZmlnLAotRmZpQWRkcmVzcyAtPiBSYXdBZGRyZXNzLCBBMmRwQ29kZWNDb25maWcsIFZlYzxBMmRwQ29kZWNDb25maWc+LCBWZWM8QTJkcENvZGVjQ29uZmlnPiwgewotICAgIGxldCBfMCA9IF8wLmludG8oKTsKLX0pOwotCi1wdWIgc3RydWN0IEEyZHAgewotICAgIGludGVybmFsOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkEyZHBJbnRmPiwKLSAgICBfaXNfaW5pdDogYm9vbCwKLX0KLQotLy8gRm9yICpjb25zdCB1OCBvcGFxdWUgYnRpZgotdW5zYWZlIGltcGwgU2VuZCBmb3IgQTJkcCB7fQotCi1pbXBsIEEyZHAgewotICAgIHB1YiBmbiBuZXcoaW50ZjogJkJsdWV0b290aEludGVyZmFjZSkgLT4gQTJkcCB7Ci0gICAgICAgIGxldCBhMmRwaWY6IGN4eDo6VW5pcXVlUHRyPGZmaTo6QTJkcEludGY+OwotICAgICAgICB1bnNhZmUgewotICAgICAgICAgICAgYTJkcGlmID0gZmZpOjpHZXRBMmRwUHJvZmlsZShpbnRmLmFzX3Jhd19wdHIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBMmRwIHsgaW50ZXJuYWw6IGEyZHBpZiwgX2lzX2luaXQ6IGZhbHNlIH0KLSAgICB9Ci0KLSAgICBwdWIgZm4gaW5pdGlhbGl6ZSgmbXV0IHNlbGYsIGNhbGxiYWNrczogQTJkcENhbGxiYWNrc0Rpc3BhdGNoZXIpIC0+IGJvb2wgewotICAgICAgICBpZiBnZXRfZGlzcGF0Y2hlcnMoKS5sb2NrKCkudW53cmFwKCkuc2V0Ojo8QTJkcENiPihBcmM6Om5ldyhNdXRleDo6bmV3KGNhbGxiYWNrcykpKSB7Ci0gICAgICAgICAgICBwYW5pYyEoIlRyaWVkIHRvIHNldCBkaXNwYXRjaGVyIGZvciBBMmRwIGNhbGxiYWNrcyB3aGlsZSBpdCBhbHJlYWR5IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwuaW5pdCgpOwotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgcHViIGZuIGNvbm5lY3QoJm11dCBzZWxmLCBkZXZpY2U6IFN0cmluZykgewotICAgICAgICBsZXQgYWRkciA9IFJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKGRldmljZS5jbG9uZSgpKTsKLSAgICAgICAgaWYgYWRkci5pc19ub25lKCkgewotICAgICAgICAgICAgZXByaW50bG4hKCJJbnZhbGlkIGRldmljZSBzdHJpbmcge30iLCBkZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwuY29ubmVjdChhZGRyLnVud3JhcCgpLmludG8oKSk7Ci0gICAgfQotCi0gICAgcHViIGZuIHNldF9hY3RpdmVfZGV2aWNlKCZtdXQgc2VsZiwgZGV2aWNlOiBTdHJpbmcpIHsKLSAgICAgICAgbGV0IGFkZHIgPSBSYXdBZGRyZXNzOjpmcm9tX3N0cmluZyhkZXZpY2UuY2xvbmUoKSk7Ci0gICAgICAgIGlmIGFkZHIuaXNfbm9uZSgpIHsKLSAgICAgICAgICAgIGVwcmludGxuISgiSW52YWxpZCBkZXZpY2Ugc3RyaW5nIHt9IiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZWxmLmludGVybmFsLnNldF9hY3RpdmVfZGV2aWNlKGFkZHIudW53cmFwKCkuaW50bygpKTsKLSAgICB9Ci0KLSAgICBwdWIgZm4gZGlzY29ubmVjdCgmbXV0IHNlbGYsIGRldmljZTogU3RyaW5nKSB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoZGV2aWNlLmNsb25lKCkpOwotICAgICAgICBpZiBhZGRyLmlzX25vbmUoKSB7Ci0gICAgICAgICAgICBlcHJpbnRsbiEoIkludmFsaWQgZGV2aWNlIHN0cmluZyB7fSIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi5pbnRlcm5hbC5kaXNjb25uZWN0KGFkZHIudW53cmFwKCkuaW50bygpKTsKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X2F1ZGlvX2NvbmZpZygmc2VsZiwgc2FtcGxlX3JhdGU6IGkzMiwgYml0c19wZXJfc2FtcGxlOiBpMzIsIGNoYW5uZWxfbW9kZTogaTMyKSB7Ci0gICAgICAgIGxldCBjb25maWcgPQotICAgICAgICAgICAgQTJkcENvZGVjQ29uZmlnIHsgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSwgY2hhbm5lbF9tb2RlLCAuLkRlZmF1bHQ6OmRlZmF1bHQoKSB9OwotICAgICAgICBzZWxmLmludGVybmFsLnNldF9hdWRpb19jb25maWcoY29uZmlnKTsKLSAgICB9Ci0gICAgcHViIGZuIHN0YXJ0X2F1ZGlvX3JlcXVlc3QoJnNlbGYpIHsKLSAgICAgICAgc2VsZi5pbnRlcm5hbC5zdGFydF9hdWRpb19yZXF1ZXN0KCk7Ci0gICAgfQotCi0gICAgcHViIGZuIHN0b3BfYXVkaW9fcmVxdWVzdCgmc2VsZikgewotICAgICAgICBzZWxmLmludGVybmFsLnN0b3BfYXVkaW9fcmVxdWVzdCgpOwotICAgIH0KLQotICAgIHB1YiBmbiBnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKCZzZWxmKSAtPiBQcmVzZW50YXRpb25Qb3NpdGlvbiB7Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwuZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigpCi0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgZW51bSBBMmRwU2lua0NhbGxiYWNrcyB7Ci0gICAgQ29ubmVjdGlvblN0YXRlKFJhd0FkZHJlc3MsIEJ0YXZDb25uZWN0aW9uU3RhdGUpLAotfQotCi1wdWIgc3RydWN0IEEyZHBTaW5rQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgcHViIGRpc3BhdGNoOiBCb3g8ZHluIEZuKEEyZHBTaW5rQ2FsbGJhY2tzKSArIFNlbmQ+LAotfQotCi10eXBlIEEyZHBTaW5rQ2IgPSBBcmM8TXV0ZXg8QTJkcFNpbmtDYWxsYmFja3NEaXNwYXRjaGVyPj47Ci0KLXB1YiBzdHJ1Y3QgQTJkcFNpbmsgewotICAgIGludGVybmFsOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkEyZHBTaW5rSW50Zj4sCi0gICAgX2lzX2luaXQ6IGJvb2wsCi19Ci0KLS8vIEZvciAqY29uc3QgdTggb3BhcXVlIGJ0aWYKLXVuc2FmZSBpbXBsIFNlbmQgZm9yIEEyZHBTaW5rIHt9Ci0KLWltcGwgQTJkcFNpbmsgewotICAgIHB1YiBmbiBuZXcoaW50ZjogJkJsdWV0b290aEludGVyZmFjZSkgLT4gQTJkcFNpbmsgewotICAgICAgICBsZXQgYTJkcF9zaW5rOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkEyZHBTaW5rSW50Zj47Ci0gICAgICAgIHVuc2FmZSB7Ci0gICAgICAgICAgICBhMmRwX3NpbmsgPSBmZmk6OkdldEEyZHBTaW5rUHJvZmlsZShpbnRmLmFzX3Jhd19wdHIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBMmRwU2luayB7IGludGVybmFsOiBhMmRwX3NpbmssIF9pc19pbml0OiBmYWxzZSB9Ci0gICAgfQotCi0gICAgcHViIGZuIGluaXRpYWxpemUoJm11dCBzZWxmLCBjYWxsYmFja3M6IEEyZHBTaW5rQ2FsbGJhY2tzRGlzcGF0Y2hlcikgLT4gYm9vbCB7Ci0gICAgICAgIGlmIGdldF9kaXNwYXRjaGVycygpLmxvY2soKS51bndyYXAoKS5zZXQ6OjxBMmRwU2lua0NiPihBcmM6Om5ldyhNdXRleDo6bmV3KGNhbGxiYWNrcykpKSB7Ci0gICAgICAgICAgICBwYW5pYyEoIlRyaWVkIHRvIHNldCBkaXNwYXRjaGVyIGZvciBBMmRwIFNpbmsgQ2FsbGJhY2tzIHdoaWxlIGl0IGFscmVhZHkgZXhpc3RzIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi5pbnRlcm5hbC5pbml0KCk7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICBwdWIgZm4gY29ubmVjdCgmbXV0IHNlbGYsIGJ0X2FkZHI6IFJhd0FkZHJlc3MpIHsKLSAgICAgICAgc2VsZi5pbnRlcm5hbC5jb25uZWN0KGJ0X2FkZHIuaW50bygpKTsKLSAgICB9Ci0KLSAgICBwdWIgZm4gZGlzY29ubmVjdCgmbXV0IHNlbGYsIGJ0X2FkZHI6IFJhd0FkZHJlc3MpIHsKLSAgICAgICAgc2VsZi5pbnRlcm5hbC5kaXNjb25uZWN0KGJ0X2FkZHIuaW50bygpKTsKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X2FjdGl2ZV9kZXZpY2UoJm11dCBzZWxmLCBidF9hZGRyOiBSYXdBZGRyZXNzKSB7Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwuc2V0X2FjdGl2ZV9kZXZpY2UoYnRfYWRkci5pbnRvKCkpOwotICAgIH0KLQotICAgIHB1YiBmbiBjbGVhbnVwKCZtdXQgc2VsZikge30KLX0KLQotI1tjZmcodGVzdCldCi1tb2QgdGVzdHMgewotICAgIHVzZSBzdXBlcjo6KjsKLQotICAgICNbdGVzdF0KLSAgICBmbiB2YWxpZGF0ZV9zYW1wbGVfcmF0ZSgpIHsKLSAgICAgICAgYXNzZXJ0ISghQTJkcENvZGVjU2FtcGxlUmF0ZTo6dmFsaWRhdGVfYml0cygyNTYpKTsKLSAgICAgICAgYXNzZXJ0IShBMmRwQ29kZWNTYW1wbGVSYXRlOjp2YWxpZGF0ZV9iaXRzKDIgKyAzMiArIDEyOCkpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB2YWxpZGF0ZV9iaXRzX3Blcl9zYW1wbGUoKSB7Ci0gICAgICAgIGFzc2VydCEoIUEyZHBDb2RlY0JpdHNQZXJTYW1wbGU6OnZhbGlkYXRlX2JpdHMoOCkpOwotICAgICAgICBhc3NlcnQhKEEyZHBDb2RlY0JpdHNQZXJTYW1wbGU6OnZhbGlkYXRlX2JpdHMoMSArIDQpKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdmFsaWRhdGVfY2hhbm5lbF9tb2RlKCkgewotICAgICAgICBhc3NlcnQhKCFBMmRwQ29kZWNDaGFubmVsTW9kZTo6dmFsaWRhdGVfYml0cyg0KSk7Ci0gICAgICAgIGFzc2VydCEoQTJkcENvZGVjQ2hhbm5lbE1vZGU6OnZhbGlkYXRlX2JpdHMoMSArIDIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2F2cmNwLnJzIGIvZ2QvcnVzdC90b3BzaGltL3NyYy9wcm9maWxlcy9hdnJjcC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3N2I0ZS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2F2cmNwLnJzCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotdXNlIGNyYXRlOjpidGlmOjpCbHVldG9vdGhJbnRlcmZhY2U7Ci11c2UgY3JhdGU6OnRvcHN0YWNrOjpnZXRfZGlzcGF0Y2hlcnM7Ci0KLXVzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKLXVzZSB0b3BzaGltX21hY3Jvczo6Y2JfdmFyaWFudDsKLQotI1tjeHg6OmJyaWRnZShuYW1lc3BhY2UgPSBibHVldG9vdGg6OnRvcHNoaW06OnJ1c3QpXQotcHViIG1vZCBmZmkgewotICAgIHVuc2FmZSBleHRlcm4gIkMrKyIgewotICAgICAgICBpbmNsdWRlISgiYnRhdi9idGF2X3NoaW0uaCIpOwotCi0gICAgICAgIHR5cGUgQXZyY3BJbnRmOwotCi0gICAgICAgIHVuc2FmZSBmbiBHZXRBdnJjcFByb2ZpbGUoYnRpZjogKmNvbnN0IHU4KSAtPiBVbmlxdWVQdHI8QXZyY3BJbnRmPjsKLQotICAgICAgICBmbiBpbml0KHNlbGY6IFBpbjwmbXV0IEF2cmNwSW50Zj4pOwotICAgICAgICBmbiBjbGVhbnVwKHNlbGY6IFBpbjwmbXV0IEF2cmNwSW50Zj4pOwotICAgICAgICBmbiBzZXRfdm9sdW1lKHNlbGY6IFBpbjwmbXV0IEF2cmNwSW50Zj4sIHZvbHVtZTogaTgpOwotCi0gICAgfQotICAgIGV4dGVybiAiUnVzdCIgewotICAgICAgICBmbiBhdnJjcF9hYnNvbHV0ZV92b2x1bWVfZW5hYmxlZChlbmFibGVkOiBib29sKTsKLSAgICAgICAgZm4gYXZyY3BfYWJzb2x1dGVfdm9sdW1lX3VwZGF0ZSh2b2x1bWU6IGk4KTsKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKERlYnVnKV0KLXB1YiBlbnVtIEF2cmNwQ2FsbGJhY2tzIHsKLSAgICBBdnJjcEFic29sdXRlVm9sdW1lRW5hYmxlZChib29sKSwKLSAgICBBdnJjcEFic29sdXRlVm9sdW1lVXBkYXRlKGk4KSwKLX0KLQotcHViIHN0cnVjdCBBdnJjcENhbGxiYWNrc0Rpc3BhdGNoZXIgewotICAgIHB1YiBkaXNwYXRjaDogQm94PGR5biBGbihBdnJjcENhbGxiYWNrcykgKyBTZW5kPiwKLX0KLQotdHlwZSBBdnJjcENiID0gQXJjPE11dGV4PEF2cmNwQ2FsbGJhY2tzRGlzcGF0Y2hlcj4+OwotCi1jYl92YXJpYW50ISgKLSAgICBBdnJjcENiLAotICAgIGF2cmNwX2Fic29sdXRlX3ZvbHVtZV9lbmFibGVkIC0+IEF2cmNwQ2FsbGJhY2tzOjpBdnJjcEFic29sdXRlVm9sdW1lRW5hYmxlZCwKLSAgICBib29sLCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgQXZyY3BDYiwKLSAgICBhdnJjcF9hYnNvbHV0ZV92b2x1bWVfdXBkYXRlIC0+IEF2cmNwQ2FsbGJhY2tzOjpBdnJjcEFic29sdXRlVm9sdW1lVXBkYXRlLAotICAgIGk4LCB7fQotKTsKLQotcHViIHN0cnVjdCBBdnJjcCB7Ci0gICAgaW50ZXJuYWw6IGN4eDo6VW5pcXVlUHRyPGZmaTo6QXZyY3BJbnRmPiwKLSAgICBfaXNfaW5pdDogYm9vbCwKLX0KLQotLy8gRm9yICpjb25zdCB1OCBvcGFxdWUgYnRpZgotdW5zYWZlIGltcGwgU2VuZCBmb3IgQXZyY3Age30KLQotaW1wbCBBdnJjcCB7Ci0gICAgcHViIGZuIG5ldyhpbnRmOiAmQmx1ZXRvb3RoSW50ZXJmYWNlKSAtPiBBdnJjcCB7Ci0gICAgICAgIGxldCBhdnJjcGlmOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkF2cmNwSW50Zj47Ci0gICAgICAgIHVuc2FmZSB7Ci0gICAgICAgICAgICBhdnJjcGlmID0gZmZpOjpHZXRBdnJjcFByb2ZpbGUoaW50Zi5hc19yYXdfcHRyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXZyY3AgeyBpbnRlcm5hbDogYXZyY3BpZiwgX2lzX2luaXQ6IGZhbHNlIH0KLSAgICB9Ci0KLSAgICBwdWIgZm4gaW5pdGlhbGl6ZSgmbXV0IHNlbGYsIGNhbGxiYWNrczogQXZyY3BDYWxsYmFja3NEaXNwYXRjaGVyKSAtPiBib29sIHsKLSAgICAgICAgaWYgZ2V0X2Rpc3BhdGNoZXJzKCkubG9jaygpLnVud3JhcCgpLnNldDo6PEF2cmNwQ2I+KEFyYzo6bmV3KE11dGV4OjpuZXcoY2FsbGJhY2tzKSkpIHsKLSAgICAgICAgICAgIHBhbmljISgiVHJpZWQgdG8gc2V0IGRpc3BhdGNoZXIgZm9yIEF2cmNwIGNhbGxiYWNrcyB3aGlsZSBpdCBhbHJlYWR5IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwucGluX211dCgpLmluaXQoKTsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIHB1YiBmbiBjbGVhbnVwKCZtdXQgc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwucGluX211dCgpLmNsZWFudXAoKTsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIHB1YiBmbiBzZXRfdm9sdW1lKCZtdXQgc2VsZiwgdm9sdW1lOiBpOCkgewotICAgICAgICBzZWxmLmludGVybmFsLnBpbl9tdXQoKS5zZXRfdm9sdW1lKHZvbHVtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL3NyYy9wcm9maWxlcy9nYXR0LnJzIGIvZ2QvcnVzdC90b3BzaGltL3NyYy9wcm9maWxlcy9nYXR0LnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM2NWFjLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvZ2F0dC5ycworKysgL2Rldi9udWxsCkBAIC0xLDkwOSArMCwwIEBACi11c2UgY3JhdGU6OmJpbmRpbmdzOjpyb290IGFzIGJpbmRpbmdzOwotdXNlIGNyYXRlOjpidGlmOjp7Ci0gICAgcHRyX3RvX3ZlYywgQmx1ZXRvb3RoSW50ZXJmYWNlLCBCdFN0YXR1cywgRmZpQWRkcmVzcywgUmF3QWRkcmVzcywgU3VwcG9ydGVkUHJvZmlsZXMsIFV1aWQsCi19OwotdXNlIGNyYXRlOjpwcm9maWxlczo6Z2F0dDo6YmluZGluZ3M6OnsKLSAgICBidGdhdHRfY2FsbGJhY2tzX3QsIGJ0Z2F0dF9jbGllbnRfY2FsbGJhY2tzX3QsIGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QsIGJ0Z2F0dF9pbnRlcmZhY2VfdCwKLSAgICBidGdhdHRfc2Nhbm5lcl9jYWxsYmFja3NfdCwgYnRnYXR0X3NlcnZlcl9jYWxsYmFja3NfdCwgYnRnYXR0X3NlcnZlcl9pbnRlcmZhY2VfdCwKLSAgICBCbGVBZHZlcnRpc2VySW50ZXJmYWNlLCBCbGVTY2FubmVySW50ZXJmYWNlLAotfTsKLXVzZSBjcmF0ZTo6dG9wc3RhY2s6OmdldF9kaXNwYXRjaGVyczsKLXVzZSBjcmF0ZTo6e2Nhc3RfdG9fZmZpX2FkZHJlc3MsIGNjYWxsLCBkZXJlZl9mZmlfYWRkcmVzc307Ci0KLXVzZSBudW1fdHJhaXRzOjpjYXN0OjpGcm9tUHJpbWl0aXZlOwotCi11c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07Ci0KLXVzZSB0b3BzaGltX21hY3Jvczo6Y2JfdmFyaWFudDsKLQotcHViIHR5cGUgQnRHYXR0Tm90aWZ5UGFyYW1zID0gYmluZGluZ3M6OmJ0Z2F0dF9ub3RpZnlfcGFyYW1zX3Q7Ci1wdWIgdHlwZSBCdEdhdHRSZWFkUGFyYW1zID0gYmluZGluZ3M6OmJ0Z2F0dF9yZWFkX3BhcmFtc190OwotcHViIHR5cGUgQnRHYXR0RGJFbGVtZW50ID0gYmluZGluZ3M6OmJ0Z2F0dF9kYl9lbGVtZW50X3Q7Ci1wdWIgdHlwZSBCdEdhdHRSZXNwb25zZSA9IGJpbmRpbmdzOjpidGdhdHRfcmVzcG9uc2VfdDsKLXB1YiB0eXBlIEJ0R2F0dFRlc3RQYXJhbXMgPSBiaW5kaW5nczo6YnRnYXR0X3Rlc3RfcGFyYW1zX3Q7Ci0KLSNbY3h4OjpicmlkZ2UobmFtZXNwYWNlID0gYmx1ZXRvb3RoOjp0b3BzaGltOjpydXN0KV0KLXB1YiBtb2QgZmZpIHsKLSAgICAjW2Rlcml2ZShEZWJ1ZywgQ29weSwgQ2xvbmUpXQotICAgIHB1YiBzdHJ1Y3QgUnVzdFJhd0FkZHJlc3MgewotICAgICAgICBhZGRyZXNzOiBbdTg7IDZdLAotICAgIH0KLQotICAgIHVuc2FmZSBleHRlcm4gIkMrKyIgewotICAgICAgICBpbmNsdWRlISgiZ2F0dC9nYXR0X3NoaW0uaCIpOwotCi0gICAgICAgIHR5cGUgR2F0dENsaWVudEludGY7Ci0KLSAgICAgICAgdW5zYWZlIGZuIEdldEdhdHRDbGllbnRQcm9maWxlKGJ0aWY6ICpjb25zdCB1OCkgLT4gVW5pcXVlUHRyPEdhdHRDbGllbnRJbnRmPjsKLQotICAgICAgICBmbiByZWFkX3BoeShzZWxmOiBQaW48Jm11dCBHYXR0Q2xpZW50SW50Zj4sIGNsaWVudF9pZjogaTMyLCBidF9hZGRyOiBSdXN0UmF3QWRkcmVzcykKLSAgICAgICAgICAgIC0+IGkzMjsKLSAgICB9Ci0KLSAgICBleHRlcm4gIlJ1c3QiIHsKLSAgICAgICAgLy8gR2VuZXJhdGVkIGJ5IGNiX3ZhcmlhbnQhIGJlbG93LgotICAgICAgICBmbiByZWFkX3BoeV9jYWxsYmFjaygKLSAgICAgICAgICAgIGNsaWVudF9pZjogaTMyLAotICAgICAgICAgICAgYWRkcjogUnVzdFJhd0FkZHJlc3MsCi0gICAgICAgICAgICB0eF9waHk6IHU4LAotICAgICAgICAgICAgcnhfcGh5OiB1OCwKLSAgICAgICAgICAgIHN0YXR1czogdTgsCi0gICAgICAgICk7Ci0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEdhdHRTdGF0dXMgewotICAgIFN1Y2Nlc3MgPSAweDAwLAotICAgIEludmFsaWRIYW5kbGUgPSAweDAxLAotICAgIFJlYWROb3RQZXJtaXQgPSAweDAyLAotICAgIFdyaXRlTm90UGVybWl0ID0gMHgwMywKLSAgICBJbnZhbGlkUGR1ID0gMHgwNCwKLSAgICBJbnN1ZkF1dGhlbnRpY2F0aW9uID0gMHgwNSwKLSAgICBSZXFOb3RTdXBwb3J0ZWQgPSAweDA2LAotICAgIEludmFsaWRPZmZzZXQgPSAweDA3LAotICAgIEluc3VmQXV0aG9yaXphdGlvbiA9IDB4MDgsCi0gICAgUHJlcGFyZVFGdWxsID0gMHgwOSwKLSAgICBOb3RGb3VuZCA9IDB4MGEsCi0gICAgTm90TG9uZyA9IDB4MGIsCi0gICAgSW5zdWZLZXlTaXplID0gMHgwYywKLSAgICBJbnZhbGlkQXR0ckxlbiA9IDB4MGQsCi0gICAgRXJyVW5saWtlbHkgPSAweDBlLAotICAgIEluc3VmRW5jcnlwdGlvbiA9IDB4MGYsCi0gICAgVW5zdXBwb3J0R3JwVHlwZSA9IDB4MTAsCi0gICAgSW5zdWZSZXNvdXJjZSA9IDB4MTEsCi0gICAgRGF0YWJhc2VPdXRPZlN5bmMgPSAweDEyLAotICAgIFZhbHVlTm90QWxsb3dlZCA9IDB4MTMsCi0gICAgSWxsZWdhbFBhcmFtZXRlciA9IDB4ODcsCi0gICAgVG9vU2hvcnQgPSAweDdmLAotICAgIE5vUmVzb3VyY2VzID0gMHg4MCwKLSAgICBJbnRlcm5hbEVycm9yID0gMHg4MSwKLSAgICBXcm9uZ1N0YXRlID0gMHg4MiwKLSAgICBEYkZ1bGwgPSAweDgzLAotICAgIEJ1c3kgPSAweDg0LAotICAgIEVycm9yID0gMHg4NSwKLSAgICBDbWRTdGFydGVkID0gMHg4NiwKLSAgICBQZW5kaW5nID0gMHg4OCwKLSAgICBBdXRoRmFpbCA9IDB4ODksCi0gICAgTW9yZSA9IDB4OGEsCi0gICAgSW52YWxpZENmZyA9IDB4OGIsCi0gICAgU2VydmljZVN0YXJ0ZWQgPSAweDhjLAotICAgIEVuY3J5cHRlZE5vTWl0bSA9IDB4OGQsCi0gICAgTm90RW5jcnlwdGVkID0gMHg4ZSwKLSAgICBDb25nZXN0ZWQgPSAweDhmLAotICAgIER1cFJlZyA9IDB4OTAsICAgICAgLyogMHg5MCAqLwotICAgIEFscmVhZHlPcGVuID0gMHg5MSwgLyogMHg5MSAqLwotICAgIENhbmNlbCA9IDB4OTIsICAgICAgLyogMHg5MiAqLwotICAgIC8qID0gMHhFMCB+IDB4RkMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQotICAgIC8qIENsaWVudCBDaGFyYWN0ZXJpc3RpYyBDb25maWd1cmF0aW9uIERlc2NyaXB0b3IgSW1wcm9wZXJseSBDb25maWd1cmVkICovCi0gICAgQ2NjQ2ZnRXJyID0gMHhGRCwKLSAgICAvKiBQcm9jZWR1cmUgQWxyZWFkeSBpbiBwcm9ncmVzcyAqLwotICAgIFByY0luUHJvZ3Jlc3MgPSAweEZFLAotICAgIC8qIEF0dHJpYnV0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UgKi8KLSAgICBPdXRPZlJhbmdlID0gMHhGRiwKLX0KLQotI1tkZXJpdmUoRGVidWcpXQotcHViIGVudW0gR2F0dENsaWVudENhbGxiYWNrcyB7Ci0gICAgUmVnaXN0ZXJDbGllbnQoaTMyLCBpMzIsIFV1aWQpLAotICAgIENvbm5lY3QoaTMyLCBpMzIsIGkzMiwgUmF3QWRkcmVzcyksCi0gICAgRGlzY29ubmVjdChpMzIsIGkzMiwgaTMyLCBSYXdBZGRyZXNzKSwKLSAgICBTZWFyY2hDb21wbGV0ZShpMzIsIGkzMiksCi0gICAgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb24oaTMyLCBpMzIsIGkzMiwgdTE2KSwKLSAgICBOb3RpZnkoaTMyLCBCdEdhdHROb3RpZnlQYXJhbXMpLAotICAgIFJlYWRDaGFyYWN0ZXJpc3RpYyhpMzIsIGkzMiwgQnRHYXR0UmVhZFBhcmFtcyksCi0gICAgV3JpdGVDaGFyYWN0ZXJpc3RpYyhpMzIsIGkzMiwgdTE2LCB1MTYsICpjb25zdCB1OCksCi0gICAgUmVhZERlc2NyaXB0b3IoaTMyLCBpMzIsIEJ0R2F0dFJlYWRQYXJhbXMpLAotICAgIFdyaXRlRGVzY3JpcHRvcihpMzIsIGkzMiwgdTE2LCB1MTYsICpjb25zdCB1OCksCi0gICAgRXhlY3V0ZVdyaXRlKGkzMiwgaTMyKSwKLSAgICBSZWFkUmVtb3RlUnNzaShpMzIsIFJhd0FkZHJlc3MsIGkzMiwgaTMyKSwKLSAgICBDb25maWd1cmVNdHUoaTMyLCBpMzIsIGkzMiksCi0gICAgQ29uZ2VzdGlvbihpMzIsIGJvb2wpLAotICAgIEdldEdhdHREYihpMzIsIFZlYzxCdEdhdHREYkVsZW1lbnQ+LCBpMzIpLAotICAgIFBoeVVwZGF0ZWQoaTMyLCB1OCwgdTgsIHU4KSwKLSAgICBDb25uVXBkYXRlZChpMzIsIHUxNiwgdTE2LCB1MTYsIHU4KSwKLSAgICBTZXJ2aWNlQ2hhbmdlZChpMzIpLAotICAgIFJlYWRQaHkoaTMyLCBSYXdBZGRyZXNzLCB1OCwgdTgsIHU4KSwKLX0KLQotI1tkZXJpdmUoRGVidWcpXQotcHViIGVudW0gR2F0dFNlcnZlckNhbGxiYWNrcyB7Ci0gICAgUmVnaXN0ZXJTZXJ2ZXIoaTMyLCBpMzIsIFV1aWQpLAotICAgIENvbm5lY3Rpb24oaTMyLCBpMzIsIGkzMiwgUmF3QWRkcmVzcyksCi0gICAgU2VydmljZUFkZGVkKGkzMiwgaTMyLCBWZWM8QnRHYXR0RGJFbGVtZW50PiwgdXNpemUpLAotICAgIFNlcnZpY2VTdG9wcGVkKGkzMiwgaTMyLCBpMzIpLAotICAgIFNlcnZpY2VEZWxldGVkKGkzMiwgaTMyLCBpMzIpLAotICAgIFJlcXVlc3RSZWFkQ2hhcmFjdGVyaXN0aWMoaTMyLCBpMzIsIFJhd0FkZHJlc3MsIGkzMiwgaTMyLCBib29sKSwKLSAgICBSZXF1ZXN0UmVhZERlc2NyaXB0b3IoaTMyLCBpMzIsIFJhd0FkZHJlc3MsIGkzMiwgaTMyLCBib29sKSwKLSAgICBSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpYyhpMzIsIGkzMiwgUmF3QWRkcmVzcywgaTMyLCBpMzIsIGJvb2wsIGJvb2wsIFZlYzx1OD4sIHVzaXplKSwKLSAgICBSZXF1ZXN0V3JpdGVEZXNjcmlwdG9yKGkzMiwgaTMyLCBSYXdBZGRyZXNzLCBpMzIsIGkzMiwgYm9vbCwgYm9vbCwgVmVjPHU4PiwgdXNpemUpLAotICAgIFJlcXVlc3RFeGVjV3JpdGUoaTMyLCBpMzIsIFJhd0FkZHJlc3MsIGkzMiksCi0gICAgUmVzcG9uc2VDb25maXJtYXRpb24oaTMyLCBpMzIpLAotICAgIEluZGljYXRpb25TZW50KGkzMiwgaTMyKSwKLSAgICBDb25nZXN0aW9uKGkzMiwgYm9vbCksCi0gICAgTXR1Q2hhbmdlZChpMzIsIGkzMiksCi0gICAgUGh5VXBkYXRlZChpMzIsIHU4LCB1OCwgdTgpLAotICAgIENvbm5VcGRhdGVkKGkzMiwgdTE2LCB1MTYsIHUxNiwgdTgpLAotfQotCi1wdWIgc3RydWN0IEdhdHRDbGllbnRDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBwdWIgZGlzcGF0Y2g6IEJveDxkeW4gRm4oR2F0dENsaWVudENhbGxiYWNrcykgKyBTZW5kPiwKLX0KLQotcHViIHN0cnVjdCBHYXR0U2VydmVyQ2FsbGJhY2tzRGlzcGF0Y2hlciB7Ci0gICAgcHViIGRpc3BhdGNoOiBCb3g8ZHluIEZuKEdhdHRTZXJ2ZXJDYWxsYmFja3MpICsgU2VuZD4sCi19Ci0KLXR5cGUgR2F0dENsaWVudENiID0gQXJjPE11dGV4PEdhdHRDbGllbnRDYWxsYmFja3NEaXNwYXRjaGVyPj47Ci10eXBlIEdhdHRTZXJ2ZXJDYiA9IEFyYzxNdXRleDxHYXR0U2VydmVyQ2FsbGJhY2tzRGlzcGF0Y2hlcj4+OwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2NfcmVnaXN0ZXJfY2xpZW50X2NiIC0+IEdhdHRDbGllbnRDYWxsYmFja3M6OlJlZ2lzdGVyQ2xpZW50LAotICAgIGkzMiwgaTMyLCAqY29uc3QgVXVpZCwgewotICAgICAgICBsZXQgXzIgPSB1bnNhZmUgeyAqXzIuY2xvbmUoKSB9OwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRDbGllbnRDYiwKLSAgICBnY19vcGVuX2NiIC0+IEdhdHRDbGllbnRDYWxsYmFja3M6OkNvbm5lY3QsCi0gICAgaTMyLCBpMzIsIGkzMiwgKmNvbnN0IEZmaUFkZHJlc3MsIHsKLSAgICAgICAgbGV0IF8zID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8zKSB9OwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRDbGllbnRDYiwKLSAgICBnY19jbG9zZV9jYiAtPiBHYXR0Q2xpZW50Q2FsbGJhY2tzOjpEaXNjb25uZWN0LAotICAgIGkzMiwgaTMyLCBpMzIsICpjb25zdCBGZmlBZGRyZXNzLCB7Ci0gICAgICAgIGxldCBfMyA9IHVuc2FmZSB7IGRlcmVmX2ZmaV9hZGRyZXNzIShfMykgfTsKLSAgICB9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2Nfc2VhcmNoX2NvbXBsZXRlX2NiIC0+IEdhdHRDbGllbnRDYWxsYmFja3M6OlNlYXJjaENvbXBsZXRlLAotICAgIGkzMiwgaTMyLCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX3JlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb25fY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6UmVnaXN0ZXJGb3JOb3RpZmljYXRpb24sCi0gICAgaTMyLCBpMzIsIGkzMiwgdTE2LCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX25vdGlmeV9jYiAtPiBHYXR0Q2xpZW50Q2FsbGJhY2tzOjpOb3RpZnksCi0gICAgaTMyLCAqY29uc3QgQnRHYXR0Tm90aWZ5UGFyYW1zLCB7Ci0gICAgICAgIGxldCBfMSA9IHVuc2FmZSB7ICpfMS5jbG9uZSgpIH07Ci0gICAgfQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX3JlYWRfY2hhcmFjdGVyaXN0aWNfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6UmVhZENoYXJhY3RlcmlzdGljLAotICAgIGkzMiwgaTMyLCAqbXV0IEJ0R2F0dFJlYWRQYXJhbXMsIHsKLSAgICAgICAgbGV0IF8yID0gdW5zYWZlIHsgKl8yLmNsb25lKCkgfTsKLSAgICB9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2Nfd3JpdGVfY2hhcmFjdGVyaXN0aWNfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6V3JpdGVDaGFyYWN0ZXJpc3RpYywKLSAgICBpMzIsIGkzMiwgdTE2LCB1MTYsICpjb25zdCB1OCwge30KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRDbGllbnRDYiwKLSAgICBnY19yZWFkX2Rlc2NyaXB0b3JfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6UmVhZERlc2NyaXB0b3IsCi0gICAgaTMyLCBpMzIsICpjb25zdCBCdEdhdHRSZWFkUGFyYW1zLCB7Ci0gICAgICAgIGxldCBfMiA9IHVuc2FmZSB7ICpfMi5jbG9uZSgpIH07Ci0gICAgfQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX3dyaXRlX2Rlc2NyaXB0b3JfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6V3JpdGVEZXNjcmlwdG9yLAotICAgIGkzMiwgaTMyLCB1MTYsIHUxNiwgKmNvbnN0IHU4LCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX2V4ZWN1dGVfd3JpdGVfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6RXhlY3V0ZVdyaXRlLAotICAgIGkzMiwgaTMyLCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX3JlYWRfcmVtb3RlX3Jzc2lfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6UmVhZFJlbW90ZVJzc2ksCi0gICAgaTMyLCAqY29uc3QgRmZpQWRkcmVzcywgaTMyLCBpMzIsIHsKLSAgICAgICAgbGV0IF8xID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8xKSB9OwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRDbGllbnRDYiwKLSAgICBnY19jb25maWd1cmVfbXR1X2NiIC0+IEdhdHRDbGllbnRDYWxsYmFja3M6OkNvbmZpZ3VyZU10dSwKLSAgICBpMzIsIGkzMiwgaTMyLCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dENsaWVudENiLAotICAgIGdjX2Nvbmdlc3Rpb25fY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6Q29uZ2VzdGlvbiwKLSAgICBpMzIsIGJvb2wsIHt9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2NfZ2V0X2dhdHRfZGJfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6R2V0R2F0dERiLAotICAgIGkzMiwgKmNvbnN0IEJ0R2F0dERiRWxlbWVudCwgaTMyLCB7Ci0gICAgICAgIGxldCBfMSA9IHB0cl90b192ZWMoXzEsIF8yIGFzIHVzaXplKTsKLSAgICB9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2NfcGh5X3VwZGF0ZWRfY2IgLT4gR2F0dENsaWVudENhbGxiYWNrczo6UGh5VXBkYXRlZCwKLSAgICBpMzIsIHU4LCB1OCwgdTgsIHt9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2NfY29ubl91cGRhdGVkX2NiIC0+IEdhdHRDbGllbnRDYWxsYmFja3M6OkNvbm5VcGRhdGVkLAotICAgIGkzMiwgdTE2LCB1MTYsIHUxNiwgdTgsIHt9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0Q2xpZW50Q2IsCi0gICAgZ2Nfc2VydmljZV9jaGFuZ2VkX2NiIC0+IEdhdHRDbGllbnRDYWxsYmFja3M6OlNlcnZpY2VDaGFuZ2VkLAotICAgIGkzMiwge30KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRDbGllbnRDYiwKLSAgICByZWFkX3BoeV9jYWxsYmFjayAtPiBHYXR0Q2xpZW50Q2FsbGJhY2tzOjpSZWFkUGh5LAotICAgIGkzMiwgZmZpOjpSdXN0UmF3QWRkcmVzcyAtPiBSYXdBZGRyZXNzLCB1OCwgdTgsIHU4LCB7Ci0gICAgICAgIGxldCBfMSA9IFJhd0FkZHJlc3MgeyB2YWw6IF8xLmFkZHJlc3MgfTsKLSAgICB9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0U2VydmVyQ2IsCi0gICAgZ3NfcmVnaXN0ZXJfc2VydmVyX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OlJlZ2lzdGVyU2VydmVyLAotICAgIGkzMiwgaTMyLCAqY29uc3QgVXVpZCwgewotICAgICAgICBsZXQgXzIgPSB1bnNhZmUgeyAqXzIuY2xvbmUoKSB9OwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19jb25uZWN0aW9uX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OkNvbm5lY3Rpb24sCi0gICAgaTMyLCBpMzIsIGkzMiwgKmNvbnN0IEZmaUFkZHJlc3MsIHsKLSAgICAgICAgbGV0IF8zID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8zKSB9OwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19zZXJ2aWNlX2FkZGVkX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OlNlcnZpY2VBZGRlZCwKLSAgICBpMzIsIGkzMiwgKmNvbnN0IEJ0R2F0dERiRWxlbWVudCwgdXNpemUsIHsKLSAgICAgICAgbGV0IF8yID0gcHRyX3RvX3ZlYyhfMiwgXzMpOwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19zZXJ2aWNlX3N0b3BwZWRfY2IgLT4gR2F0dFNlcnZlckNhbGxiYWNrczo6U2VydmljZVN0b3BwZWQsCi0gICAgaTMyLCBpMzIsIGkzMiwge30KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19zZXJ2aWNlX2RlbGV0ZWRfY2IgLT4gR2F0dFNlcnZlckNhbGxiYWNrczo6U2VydmljZURlbGV0ZWQsCi0gICAgaTMyLCBpMzIsIGkzMiwge30KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19yZXF1ZXN0X3JlYWRfY2hhcmFjdGVyaXN0aWNfY2IgLT4gR2F0dFNlcnZlckNhbGxiYWNrczo6UmVxdWVzdFJlYWRDaGFyYWN0ZXJpc3RpYywKLSAgICBpMzIsIGkzMiwgKmNvbnN0IEZmaUFkZHJlc3MsIGkzMiwgaTMyLCBib29sLCB7Ci0gICAgICAgIGxldCBfMiA9IHVuc2FmZSB7IGRlcmVmX2ZmaV9hZGRyZXNzIShfMikgfTsKLSAgICB9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0U2VydmVyQ2IsCi0gICAgZ3NfcmVxdWVzdF9yZWFkX2Rlc2NyaXB0b3JfY2IgLT4gR2F0dFNlcnZlckNhbGxiYWNrczo6UmVxdWVzdFJlYWREZXNjcmlwdG9yLAotICAgIGkzMiwgaTMyLCAqY29uc3QgRmZpQWRkcmVzcywgaTMyLCBpMzIsIGJvb2wsIHsKLSAgICAgICAgbGV0IF8yID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8yKSB9OwotICAgIH0KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19yZXF1ZXN0X3dyaXRlX2NoYXJhY3RlcmlzdGljX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OlJlcXVlc3RXcml0ZUNoYXJhY3RlcmlzdGljLAotICAgIGkzMiwgaTMyLCAqY29uc3QgRmZpQWRkcmVzcywgaTMyLCBpMzIsIGJvb2wsIGJvb2wsICpjb25zdCB1OCwgdXNpemUsIHsKLSAgICAgICAgbGV0IF8yID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8yKSB9OwotICAgICAgICBsZXQgXzcgPSBwdHJfdG9fdmVjKF83LCBfOCk7Ci0gICAgfQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dFNlcnZlckNiLAotICAgIGdzX3JlcXVlc3Rfd3JpdGVfZGVzY3JpcHRvcl9jYiAtPiBHYXR0U2VydmVyQ2FsbGJhY2tzOjpSZXF1ZXN0V3JpdGVEZXNjcmlwdG9yLAotICAgIGkzMiwgaTMyLCAqY29uc3QgRmZpQWRkcmVzcywgaTMyLCBpMzIsIGJvb2wsIGJvb2wsICpjb25zdCB1OCwgdXNpemUsIHsKLSAgICAgICAgbGV0IF8yID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8yKSB9OwotICAgICAgICBsZXQgXzcgPSBwdHJfdG9fdmVjKF83LCBfOCk7Ci0gICAgfQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dFNlcnZlckNiLAotICAgIGdzX3JlcXVlc3RfZXhlY193cml0ZV9jYiAtPiBHYXR0U2VydmVyQ2FsbGJhY2tzOjpSZXF1ZXN0RXhlY1dyaXRlLAotICAgIGkzMiwgaTMyLCAqY29uc3QgRmZpQWRkcmVzcywgaTMyLCB7Ci0gICAgICAgIGxldCBfMiA9IHVuc2FmZSB7IGRlcmVmX2ZmaV9hZGRyZXNzIShfMikgfTsKLSAgICB9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0U2VydmVyQ2IsCi0gICAgZ3NfcmVzcG9uc2VfY29uZmlybWF0aW9uX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OlJlc3BvbnNlQ29uZmlybWF0aW9uLAotICAgIGkzMiwgaTMyLCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dFNlcnZlckNiLAotICAgIGdzX2luZGljYXRpb25fc2VudF9jYiAtPiBHYXR0U2VydmVyQ2FsbGJhY2tzOjpJbmRpY2F0aW9uU2VudCwKLSAgICBpMzIsIGkzMiwge30KLSk7Ci0KLWNiX3ZhcmlhbnQhKAotICAgIEdhdHRTZXJ2ZXJDYiwKLSAgICBnc19jb25nZXN0aW9uX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OkNvbmdlc3Rpb24sCi0gICAgaTMyLCBib29sLCB7fQotKTsKLQotY2JfdmFyaWFudCEoCi0gICAgR2F0dFNlcnZlckNiLAotICAgIGdzX210dV9jaGFuZ2VkX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6Ok10dUNoYW5nZWQsCi0gICAgaTMyLCBpMzIsIHt9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0U2VydmVyQ2IsCi0gICAgZ3NfcGh5X3VwZGF0ZWRfY2IgLT4gR2F0dFNlcnZlckNhbGxiYWNrczo6UGh5VXBkYXRlZCwKLSAgICBpMzIsIHU4LCB1OCwgdTgsIHt9Ci0pOwotCi1jYl92YXJpYW50ISgKLSAgICBHYXR0U2VydmVyQ2IsCi0gICAgZ3NfY29ubl91cGRhdGVkX2NiIC0+IEdhdHRTZXJ2ZXJDYWxsYmFja3M6OkNvbm5VcGRhdGVkLAotICAgIGkzMiwgdTE2LCB1MTYsIHUxNiwgdTgsIHt9Ci0pOwotCi1zdHJ1Y3QgUmF3R2F0dFdyYXBwZXIgewotICAgIHJhdzogKmNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCwKLX0KLQotc3RydWN0IFJhd0dhdHRDbGllbnRXcmFwcGVyIHsKLSAgICByYXc6ICpjb25zdCBidGdhdHRfY2xpZW50X2ludGVyZmFjZV90LAotfQotCi1zdHJ1Y3QgUmF3R2F0dFNlcnZlcldyYXBwZXIgewotICAgIHJhdzogKmNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QsCi19Ci0KLXN0cnVjdCBSYXdCbGVTY2FubmVyV3JhcHBlciB7Ci0gICAgX3JhdzogKmNvbnN0IEJsZVNjYW5uZXJJbnRlcmZhY2UsCi19Ci0KLXN0cnVjdCBSYXdCbGVBZHZlcnRpc2VyV3JhcHBlciB7Ci0gICAgX3JhdzogKmNvbnN0IEJsZUFkdmVydGlzZXJJbnRlcmZhY2UsCi19Ci0KLS8vIFBvaW50ZXJzIHVuc2FmZSBkdWUgdG8gb3duZXJzaGlwIGJ1dCB0aGlzIGlzIGEgc3RhdGljIHBvaW50ZXIgc28gU2VuZCBpcyBvawotdW5zYWZlIGltcGwgU2VuZCBmb3IgUmF3R2F0dFdyYXBwZXIge30KLXVuc2FmZSBpbXBsIFNlbmQgZm9yIFJhd0dhdHRDbGllbnRXcmFwcGVyIHt9Ci11bnNhZmUgaW1wbCBTZW5kIGZvciBSYXdHYXR0U2VydmVyV3JhcHBlciB7fQotdW5zYWZlIGltcGwgU2VuZCBmb3IgUmF3QmxlU2Nhbm5lcldyYXBwZXIge30KLXVuc2FmZSBpbXBsIFNlbmQgZm9yIFJhd0JsZUFkdmVydGlzZXJXcmFwcGVyIHt9Ci11bnNhZmUgaW1wbCBTZW5kIGZvciBidGdhdHRfY2FsbGJhY2tzX3Qge30KLXVuc2FmZSBpbXBsIFNlbmQgZm9yIEdhdHRDbGllbnQge30KLQotcHViIHN0cnVjdCBHYXR0Q2xpZW50IHsKLSAgICBpbnRlcm5hbDogUmF3R2F0dENsaWVudFdyYXBwZXIsCi0gICAgaW50ZXJuYWxfY3h4OiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkdhdHRDbGllbnRJbnRmPiwKLX0KLQotaW1wbCBHYXR0Q2xpZW50IHsKLSAgICBwdWIgZm4gcmVnaXN0ZXJfY2xpZW50KCZzZWxmLCB1dWlkOiAmVXVpZCwgZWF0dF9zdXBwb3J0OiBib29sKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCByZWdpc3Rlcl9jbGllbnQsIHV1aWQsIGVhdHRfc3VwcG9ydCkpCi0gICAgfQotCi0gICAgcHViIGZuIHVucmVnaXN0ZXJfY2xpZW50KCZzZWxmLCBjbGllbnRfaWY6IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgdW5yZWdpc3Rlcl9jbGllbnQsIGNsaWVudF9pZikpCi0gICAgfQotCi0gICAgcHViIGZuIGNvbm5lY3QoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjbGllbnRfaWY6IGkzMiwKLSAgICAgICAgYWRkcjogJlJhd0FkZHJlc3MsCi0gICAgICAgIGlzX2RpcmVjdDogYm9vbCwKLSAgICAgICAgdHJhbnNwb3J0OiBpMzIsCi0gICAgICAgIG9wcG9ydHVuaXN0aWM6IGJvb2wsCi0gICAgICAgIGluaXRpYXRpbmdfcGh5czogaTMyLAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICpjb25zdCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGNvbm5lY3QsCi0gICAgICAgICAgICBjbGllbnRfaWYsCi0gICAgICAgICAgICBmZmlfYWRkciwKLSAgICAgICAgICAgIGlzX2RpcmVjdCwKLSAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICBpbml0aWF0aW5nX3BoeXMKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gZGlzY29ubmVjdCgmc2VsZiwgY2xpZW50X2lmOiBpMzIsIGFkZHI6ICZSYXdBZGRyZXNzLCBjb25uX2lkOiBpMzIpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCBkaXNjb25uZWN0LCBjbGllbnRfaWYsIGZmaV9hZGRyLCBjb25uX2lkKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gcmVmcmVzaCgmc2VsZiwgY2xpZW50X2lmOiBpMzIsIGFkZHI6ICZSYXdBZGRyZXNzKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKmNvbnN0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgcmVmcmVzaCwgY2xpZW50X2lmLCBmZmlfYWRkcikpCi0gICAgfQotCi0gICAgcHViIGZuIHNlYXJjaF9zZXJ2aWNlKCZzZWxmLCBjb25uX2lkOiBpMzIsIGZpbHRlcl91dWlkOiBPcHRpb248VXVpZD4pIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZpbHRlcl91dWlkX3B0ciA9IG1hdGNoIGZpbHRlcl91dWlkIHsKLSAgICAgICAgICAgIE5vbmUgPT4gc3RkOjpwdHI6Om51bGwoKSwKLSAgICAgICAgICAgIFNvbWUodXVpZCkgPT4gJnV1aWQsCi0gICAgICAgIH07Ci0KLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHNlYXJjaF9zZXJ2aWNlLCBjb25uX2lkLCBmaWx0ZXJfdXVpZF9wdHIpKQotICAgIH0KLQotICAgIHB1YiBmbiBidGlmX2dhdHRjX2Rpc2NvdmVyX3NlcnZpY2VfYnlfdXVpZCgmc2VsZiwgY29ubl9pZDogaTMyLCB1dWlkOiAmVXVpZCkgewotICAgICAgICBjY2FsbCEoc2VsZiwgYnRpZl9nYXR0Y19kaXNjb3Zlcl9zZXJ2aWNlX2J5X3V1aWQsIGNvbm5faWQsIHV1aWQpCi0gICAgfQotCi0gICAgcHViIGZuIHJlYWRfY2hhcmFjdGVyaXN0aWMoJnNlbGYsIGNvbm5faWQ6IGkzMiwgaGFuZGxlOiB1MTYsIGF1dGhfcmVxOiBpMzIpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHJlYWRfY2hhcmFjdGVyaXN0aWMsIGNvbm5faWQsIGhhbmRsZSwgYXV0aF9yZXEpKQotICAgIH0KLQotICAgIHB1YiBmbiByZWFkX3VzaW5nX2NoYXJhY3RlcmlzdGljX3V1aWQoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjb25uX2lkOiBpMzIsCi0gICAgICAgIHV1aWQ6ICZVdWlkLAotICAgICAgICBzX2hhbmRsZTogdTE2LAotICAgICAgICBlX2hhbmRsZTogdTE2LAotICAgICAgICBhdXRoX3JlcTogaTMyLAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgcmVhZF91c2luZ19jaGFyYWN0ZXJpc3RpY191dWlkLAotICAgICAgICAgICAgY29ubl9pZCwKLSAgICAgICAgICAgIHV1aWQsCi0gICAgICAgICAgICBzX2hhbmRsZSwKLSAgICAgICAgICAgIGVfaGFuZGxlLAotICAgICAgICAgICAgYXV0aF9yZXEKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gd3JpdGVfY2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICZzZWxmLAotICAgICAgICBjb25uX2lkOiBpMzIsCi0gICAgICAgIGhhbmRsZTogdTE2LAotICAgICAgICB3cml0ZV90eXBlOiBpMzIsCi0gICAgICAgIGF1dGhfcmVxOiBpMzIsCi0gICAgICAgIHZhbHVlOiAmW3U4XSwKLSAgICApIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIHdyaXRlX2NoYXJhY3RlcmlzdGljLAotICAgICAgICAgICAgY29ubl9pZCwKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICBhdXRoX3JlcSwKLSAgICAgICAgICAgIHZhbHVlLmFzX3B0cigpLAotICAgICAgICAgICAgdmFsdWUubGVuKCkKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gcmVhZF9kZXNjcmlwdG9yKCZzZWxmLCBjb25uX2lkOiBpMzIsIGhhbmRsZTogdTE2LCBhdXRoX3JlcTogaTMyKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCByZWFkX2Rlc2NyaXB0b3IsIGNvbm5faWQsIGhhbmRsZSwgYXV0aF9yZXEpKQotICAgIH0KLQotICAgIHB1YiBmbiB3cml0ZV9kZXNjcmlwdG9yKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY29ubl9pZDogaTMyLAotICAgICAgICBoYW5kbGU6IHUxNiwKLSAgICAgICAgYXV0aF9yZXE6IGkzMiwKLSAgICAgICAgdmFsdWU6ICZbdThdLAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgd3JpdGVfZGVzY3JpcHRvciwKLSAgICAgICAgICAgIGNvbm5faWQsCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBhdXRoX3JlcSwKLSAgICAgICAgICAgIHZhbHVlLmFzX3B0cigpLAotICAgICAgICAgICAgdmFsdWUubGVuKCkKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gZXhlY3V0ZV93cml0ZSgmc2VsZiwgY29ubl9pZDogaTMyLCBleGVjdXRlOiBpMzIpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIGV4ZWN1dGVfd3JpdGUsIGNvbm5faWQsIGV4ZWN1dGUpKQotICAgIH0KLQotICAgIHB1YiBmbiByZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY2xpZW50X2lmOiBpMzIsCi0gICAgICAgIGFkZHI6ICZSYXdBZGRyZXNzLAotICAgICAgICBoYW5kbGU6IHUxNiwKLSAgICApIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCByZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uLCBjbGllbnRfaWYsIGZmaV9hZGRyLCBoYW5kbGUpKQotICAgIH0KLQotICAgIHB1YiBmbiBkZXJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24oCi0gICAgICAgICZzZWxmLAotICAgICAgICBjbGllbnRfaWY6IGkzMiwKLSAgICAgICAgYWRkcjogJlJhd0FkZHJlc3MsCi0gICAgICAgIGhhbmRsZTogdTE2LAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICpjb25zdCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIGRlcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbiwgY2xpZW50X2lmLCBmZmlfYWRkciwgaGFuZGxlKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gcmVhZF9yZW1vdGVfcnNzaSgmc2VsZiwgY2xpZW50X2lmOiBpMzIsIGFkZHI6ICZSYXdBZGRyZXNzKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKmNvbnN0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgcmVhZF9yZW1vdGVfcnNzaSwgY2xpZW50X2lmLCBmZmlfYWRkcikpCi0gICAgfQotCi0gICAgcHViIGZuIGdldF9kZXZpY2VfdHlwZSgmc2VsZiwgYWRkcjogJlJhd0FkZHJlc3MpIC0+IGkzMiB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKmNvbnN0IFJhd0FkZHJlc3MpOwotICAgICAgICBjY2FsbCEoc2VsZiwgZ2V0X2RldmljZV90eXBlLCBmZmlfYWRkcikKLSAgICB9Ci0KLSAgICBwdWIgZm4gY29uZmlndXJlX210dSgmc2VsZiwgY29ubl9pZDogaTMyLCBtdHU6IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgY29uZmlndXJlX210dSwgY29ubl9pZCwgbXR1KSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gY29ubl9wYXJhbWV0ZXJfdXBkYXRlKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgYWRkcjogJlJhd0FkZHJlc3MsCi0gICAgICAgIG1pbl9pbnRlcnZhbDogaTMyLAotICAgICAgICBtYXhfaW50ZXJ2YWw6IGkzMiwKLSAgICAgICAgbGF0ZW5jeTogaTMyLAotICAgICAgICB0aW1lb3V0OiBpMzIsCi0gICAgICAgIG1pbl9jZV9sZW46IHUxNiwKLSAgICAgICAgbWF4X2NlX2xlbjogdTE2LAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICpjb25zdCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGNvbm5fcGFyYW1ldGVyX3VwZGF0ZSwKLSAgICAgICAgICAgIGZmaV9hZGRyLAotICAgICAgICAgICAgbWluX2ludGVydmFsLAotICAgICAgICAgICAgbWF4X2ludGVydmFsLAotICAgICAgICAgICAgbGF0ZW5jeSwKLSAgICAgICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICBtaW5fY2VfbGVuLAotICAgICAgICAgICAgbWF4X2NlX2xlbgotICAgICAgICApKQotICAgIH0KLQotICAgIHB1YiBmbiBzZXRfcHJlZmVycmVkX3BoeSgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGFkZHI6ICZSYXdBZGRyZXNzLAotICAgICAgICB0eF9waHk6IHU4LAotICAgICAgICByeF9waHk6IHU4LAotICAgICAgICBwaHlfb3B0aW9uczogdTE2LAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICpjb25zdCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHNldF9wcmVmZXJyZWRfcGh5LCBmZmlfYWRkciwgdHhfcGh5LCByeF9waHksIHBoeV9vcHRpb25zKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gcmVhZF9waHkoJm11dCBzZWxmLCBjbGllbnRfaWY6IGkzMiwgYWRkcjogJlJhd0FkZHJlc3MpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgQnRTdGF0dXM6OmZyb21faTMyKAotICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9jeHgKLSAgICAgICAgICAgICAgICAucGluX211dCgpCi0gICAgICAgICAgICAgICAgLnJlYWRfcGh5KGNsaWVudF9pZiwgZmZpOjpSdXN0UmF3QWRkcmVzcyB7IGFkZHJlc3M6IGFkZHIudmFsIH0pLAotICAgICAgICApCi0gICAgICAgIC51bndyYXAoKQotICAgIH0KLQotICAgIHB1YiBmbiB0ZXN0X2NvbW1hbmQoJnNlbGYsIGNvbW1hbmQ6IGkzMiwgcGFyYW1zOiAmQnRHYXR0VGVzdFBhcmFtcykgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgdGVzdF9jb21tYW5kLCBjb21tYW5kLCBwYXJhbXMpKQotICAgIH0KLQotICAgIHB1YiBmbiBnZXRfZ2F0dF9kYigmc2VsZiwgY29ubl9pZDogaTMyKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCBnZXRfZ2F0dF9kYiwgY29ubl9pZCkpCi0gICAgfQotfQotCi1wdWIgc3RydWN0IEdhdHRTZXJ2ZXIgewotICAgIGludGVybmFsOiBSYXdHYXR0U2VydmVyV3JhcHBlciwKLX0KLQotaW1wbCBHYXR0U2VydmVyIHsKLSAgICBwdWIgZm4gcmVnaXN0ZXJfc2VydmVyKCZzZWxmLCB1dWlkOiAmVXVpZCwgZWF0dF9zdXBwb3J0OiBib29sKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCByZWdpc3Rlcl9zZXJ2ZXIsIHV1aWQsIGVhdHRfc3VwcG9ydCkpCi0gICAgfQotCi0gICAgcHViIGZuIHVucmVnaXN0ZXJfc2VydmVyKCZzZWxmLCBzZXJ2ZXJfaWY6IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgdW5yZWdpc3Rlcl9zZXJ2ZXIsIHNlcnZlcl9pZikpCi0gICAgfQotCi0gICAgcHViIGZuIGNvbm5lY3QoCi0gICAgICAgICZzZWxmLAotICAgICAgICBzZXJ2ZXJfaWY6IGkzMiwKLSAgICAgICAgYWRkcjogJlJhd0FkZHJlc3MsCi0gICAgICAgIGlzX2RpcmVjdDogYm9vbCwKLSAgICAgICAgdHJhbnNwb3J0OiBpMzIsCi0gICAgKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKmNvbnN0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgY29ubmVjdCwgc2VydmVyX2lmLCBmZmlfYWRkciwgaXNfZGlyZWN0LCB0cmFuc3BvcnQpKQotICAgIH0KLQotICAgIHB1YiBmbiBkaXNjb25uZWN0KCZzZWxmLCBzZXJ2ZXJfaWY6IGkzMiwgYWRkcjogJlJhd0FkZHJlc3MsIGNvbm5faWQ6IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICpjb25zdCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIGRpc2Nvbm5lY3QsIHNlcnZlcl9pZiwgZmZpX2FkZHIsIGNvbm5faWQpKQotICAgIH0KLQotICAgIHB1YiBmbiBhZGRfc2VydmljZSgmc2VsZiwgc2VydmVyX2lmOiBpMzIsIHNlcnZpY2U6ICZbQnRHYXR0RGJFbGVtZW50XSkgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgYWRkX3NlcnZpY2UsIHNlcnZlcl9pZiwgc2VydmljZS5hc19wdHIoKSwgc2VydmljZS5sZW4oKSkpCi0gICAgfQotCi0gICAgcHViIGZuIHN0b3Bfc2VydmljZSgmc2VsZiwgc2VydmVyX2lmOiBpMzIsIHNlcnZpY2VfaGFuZGxlOiBpMzIpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHN0b3Bfc2VydmljZSwgc2VydmVyX2lmLCBzZXJ2aWNlX2hhbmRsZSkpCi0gICAgfQotCi0gICAgcHViIGZuIGRlbGV0ZV9zZXJ2aWNlKCZzZWxmLCBzZXJ2ZXJfaWY6IGkzMiwgc2VydmljZV9oYW5kbGU6IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgZGVsZXRlX3NlcnZpY2UsIHNlcnZlcl9pZiwgc2VydmljZV9oYW5kbGUpKQotICAgIH0KLQotICAgIHB1YiBmbiBzZW5kX2luZGljYXRpb24oCi0gICAgICAgICZzZWxmLAotICAgICAgICBzZXJ2ZXJfaWY6IGkzMiwKLSAgICAgICAgYXR0cmlidXRlX2hhbmRsZTogaTMyLAotICAgICAgICBjb25uX2lkOiBpMzIsCi0gICAgICAgIGNvbmZpcm06IGkzMiwKLSAgICAgICAgdmFsdWU6ICZbdThdLAotICAgICkgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgc2VuZF9pbmRpY2F0aW9uLAotICAgICAgICAgICAgc2VydmVyX2lmLAotICAgICAgICAgICAgYXR0cmlidXRlX2hhbmRsZSwKLSAgICAgICAgICAgIGNvbm5faWQsCi0gICAgICAgICAgICBjb25maXJtLAotICAgICAgICAgICAgdmFsdWUuYXNfcHRyKCksCi0gICAgICAgICAgICB2YWx1ZS5sZW4oKQotICAgICAgICApKQotICAgIH0KLQotICAgIHB1YiBmbiBzZW5kX3Jlc3BvbnNlKAotICAgICAgICAmc2VsZiwKLSAgICAgICAgY29ubl9pZDogaTMyLAotICAgICAgICB0cmFuc19pZDogaTMyLAotICAgICAgICBzdGF0dXM6IGkzMiwKLSAgICAgICAgcmVzcG9uc2U6ICZCdEdhdHRSZXNwb25zZSwKLSAgICApIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHNlbmRfcmVzcG9uc2UsIGNvbm5faWQsIHRyYW5zX2lkLCBzdGF0dXMsIHJlc3BvbnNlKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X3ByZWZlcnJlZF9waHkoCi0gICAgICAgICZzZWxmLAotICAgICAgICBhZGRyOiAmUmF3QWRkcmVzcywKLSAgICAgICAgdHhfcGh5OiB1OCwKLSAgICAgICAgcnhfcGh5OiB1OCwKLSAgICAgICAgcGh5X29wdGlvbnM6IHUxNiwKLSAgICApIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqY29uc3QgUmF3QWRkcmVzcyk7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCBzZXRfcHJlZmVycmVkX3BoeSwgZmZpX2FkZHIsIHR4X3BoeSwgcnhfcGh5LCBwaHlfb3B0aW9ucykpCi0gICAgfQotCi0gICAgLy8gVE9ETyhiLzE5MzkxNjc3OCk6IEZpZ3VyZSBvdXQgaG93IHRvIHNoaW0gcmVhZF9waHkgd2hpY2ggYWNjZXB0cyBiYXNlOjpDYWxsYmFjawotfQotCi0vLyBUT0RPKGIvMTkzOTE2Nzc4KTogVW5kZXJseWluZyBGRkkgaXMgQysrLCBpbXBsZW1lbnQgdXNpbmcgY3h4LgotcHViIHN0cnVjdCBCbGVTY2FubmVyIHsKLSAgICBfaW50ZXJuYWw6IFJhd0JsZVNjYW5uZXJXcmFwcGVyLAotfQotCi0vLyBUT0RPKGIvMTkzOTE2Nzc4KTogVW5kZXJseWluZyBGRkkgaXMgQysrLCBpbXBsZW1lbnQgdXNpbmcgY3h4LgotcHViIHN0cnVjdCBCbGVBZHZlcnRpc2VyIHsKLSAgICBfaW50ZXJuYWw6IFJhd0JsZUFkdmVydGlzZXJXcmFwcGVyLAotfQotCi1wdWIgc3RydWN0IEdhdHQgewotICAgIGludGVybmFsOiBSYXdHYXR0V3JhcHBlciwKLSAgICBpc19pbml0OiBib29sLAotCi0gICAgcHViIGNsaWVudDogR2F0dENsaWVudCwKLSAgICBwdWIgc2VydmVyOiBHYXR0U2VydmVyLAotICAgIHB1YiBzY2FubmVyOiBCbGVTY2FubmVyLAotICAgIHB1YiBhZHZlcnRpc2VyOiBCbGVBZHZlcnRpc2VyLAotCi0gICAgLy8gS2VlcCBjYWxsYmFjayBvYmplY3QgaW4gbWVtb3J5ICh1bmRlcmx5aW5nIGNvZGUgZG9lc24ndCBtYWtlIGNvcHkpCi0gICAgY2FsbGJhY2tzOiBPcHRpb248Qm94PGJpbmRpbmdzOjpidGdhdHRfY2FsbGJhY2tzX3Q+PiwKLSAgICBnYXR0X2NsaWVudF9jYWxsYmFja3M6IE9wdGlvbjxCb3g8YmluZGluZ3M6OmJ0Z2F0dF9jbGllbnRfY2FsbGJhY2tzX3Q+PiwKLSAgICBnYXR0X3NlcnZlcl9jYWxsYmFja3M6IE9wdGlvbjxCb3g8YmluZGluZ3M6OmJ0Z2F0dF9zZXJ2ZXJfY2FsbGJhY2tzX3Q+PiwKLSAgICBnYXR0X3NjYW5uZXJfY2FsbGJhY2tzOiBPcHRpb248Qm94PGJpbmRpbmdzOjpidGdhdHRfc2Nhbm5lcl9jYWxsYmFja3NfdD4+LAotfQotCi1pbXBsIEdhdHQgewotICAgIHB1YiBmbiBuZXcoaW50ZjogJkJsdWV0b290aEludGVyZmFjZSkgLT4gT3B0aW9uPEdhdHQ+IHsKLSAgICAgICAgbGV0IHIgPSBpbnRmLmdldF9wcm9maWxlX2ludGVyZmFjZShTdXBwb3J0ZWRQcm9maWxlczo6R2F0dCk7Ci0KLSAgICAgICAgaWYgciA9PSBzdGQ6OnB0cjo6bnVsbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBOb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV0IGdhdHRfY2xpZW50X2ludGYgPSB1bnNhZmUgeyBmZmk6OkdldEdhdHRDbGllbnRQcm9maWxlKHIgYXMgKmNvbnN0IHU4KSB9OwotCi0gICAgICAgIFNvbWUoR2F0dCB7Ci0gICAgICAgICAgICBpbnRlcm5hbDogUmF3R2F0dFdyYXBwZXIgeyByYXc6IHIgYXMgKmNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCB9LAotICAgICAgICAgICAgaXNfaW5pdDogZmFsc2UsCi0gICAgICAgICAgICBjbGllbnQ6IEdhdHRDbGllbnQgewotICAgICAgICAgICAgICAgIGludGVybmFsOiBSYXdHYXR0Q2xpZW50V3JhcHBlciB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdzogdW5zYWZlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHIgYXMgKmNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCkpLmNsaWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzICpjb25zdCBidGdhdHRfY2xpZW50X2ludGVyZmFjZV90Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBpbnRlcm5hbF9jeHg6IGdhdHRfY2xpZW50X2ludGYsCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgc2VydmVyOiBHYXR0U2VydmVyIHsKLSAgICAgICAgICAgICAgICBpbnRlcm5hbDogUmF3R2F0dFNlcnZlcldyYXBwZXIgewotICAgICAgICAgICAgICAgICAgICByYXc6IHVuc2FmZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihyIGFzICpjb25zdCBidGdhdHRfaW50ZXJmYWNlX3QpKS5zZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyAqY29uc3QgYnRnYXR0X3NlcnZlcl9pbnRlcmZhY2VfdAotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgc2Nhbm5lcjogQmxlU2Nhbm5lciB7Ci0gICAgICAgICAgICAgICAgX2ludGVybmFsOiBSYXdCbGVTY2FubmVyV3JhcHBlciB7Ci0gICAgICAgICAgICAgICAgICAgIF9yYXc6IHVuc2FmZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihyIGFzICpjb25zdCBidGdhdHRfaW50ZXJmYWNlX3QpKS5zY2FubmVyIGFzICpjb25zdCBCbGVTY2FubmVySW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBhZHZlcnRpc2VyOiBCbGVBZHZlcnRpc2VyIHsKLSAgICAgICAgICAgICAgICBfaW50ZXJuYWw6IFJhd0JsZUFkdmVydGlzZXJXcmFwcGVyIHsKLSAgICAgICAgICAgICAgICAgICAgX3JhdzogdW5zYWZlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHIgYXMgKmNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCkpLnNjYW5uZXIgYXMgKmNvbnN0IEJsZUFkdmVydGlzZXJJbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGNhbGxiYWNrczogTm9uZSwKLSAgICAgICAgICAgIGdhdHRfY2xpZW50X2NhbGxiYWNrczogTm9uZSwKLSAgICAgICAgICAgIGdhdHRfc2VydmVyX2NhbGxiYWNrczogTm9uZSwKLSAgICAgICAgICAgIGdhdHRfc2Nhbm5lcl9jYWxsYmFja3M6IE5vbmUsCi0gICAgICAgIH0pCi0gICAgfQotCi0gICAgcHViIGZuIGlzX2luaXRpYWxpemVkKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5pc19pbml0Ci0gICAgfQotCi0gICAgcHViIGZuIGluaXRpYWxpemUoCi0gICAgICAgICZtdXQgc2VsZiwKLSAgICAgICAgZ2F0dF9jbGllbnRfY2FsbGJhY2tzX2Rpc3BhdGNoZXI6IEdhdHRDbGllbnRDYWxsYmFja3NEaXNwYXRjaGVyLAotICAgICAgICBnYXR0X3NlcnZlcl9jYWxsYmFja3NfZGlzcGF0Y2hlcjogR2F0dFNlcnZlckNhbGxiYWNrc0Rpc3BhdGNoZXIsCi0gICAgKSAtPiBib29sIHsKLSAgICAgICAgLy8gUmVnaXN0ZXIgZGlzcGF0Y2hlcgotICAgICAgICBpZiBnZXRfZGlzcGF0Y2hlcnMoKQotICAgICAgICAgICAgLmxvY2soKQotICAgICAgICAgICAgLnVud3JhcCgpCi0gICAgICAgICAgICAuc2V0Ojo8R2F0dENsaWVudENiPihBcmM6Om5ldyhNdXRleDo6bmV3KGdhdHRfY2xpZW50X2NhbGxiYWNrc19kaXNwYXRjaGVyKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhbmljISgiVHJpZWQgdG8gc2V0IGRpc3BhdGNoZXIgZm9yIEdhdHRDbGllbnRDYWxsYmFja3MgYnV0IGl0IGFscmVhZHkgZXhpc3RlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgZ2V0X2Rpc3BhdGNoZXJzKCkKLSAgICAgICAgICAgIC5sb2NrKCkKLSAgICAgICAgICAgIC51bndyYXAoKQotICAgICAgICAgICAgLnNldDo6PEdhdHRTZXJ2ZXJDYj4oQXJjOjpuZXcoTXV0ZXg6Om5ldyhnYXR0X3NlcnZlcl9jYWxsYmFja3NfZGlzcGF0Y2hlcikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYW5pYyEoIlRyaWVkIHRvIHNldCBkaXNwYXRjaGVyIGZvciBHYXR0U2VydmVyQ2FsbGJhY2tzIGJ1dCBpdCBhbHJlYWR5IGV4aXN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldCBtdXQgZ2F0dF9jbGllbnRfY2FsbGJhY2tzID0gQm94OjpuZXcoYnRnYXR0X2NsaWVudF9jYWxsYmFja3NfdCB7Ci0gICAgICAgICAgICByZWdpc3Rlcl9jbGllbnRfY2I6IFNvbWUoZ2NfcmVnaXN0ZXJfY2xpZW50X2NiKSwKLSAgICAgICAgICAgIG9wZW5fY2I6IFNvbWUoZ2Nfb3Blbl9jYiksCi0gICAgICAgICAgICBjbG9zZV9jYjogU29tZShnY19jbG9zZV9jYiksCi0gICAgICAgICAgICBzZWFyY2hfY29tcGxldGVfY2I6IFNvbWUoZ2Nfc2VhcmNoX2NvbXBsZXRlX2NiKSwKLSAgICAgICAgICAgIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb25fY2I6IFNvbWUoZ2NfcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbl9jYiksCi0gICAgICAgICAgICBub3RpZnlfY2I6IFNvbWUoZ2Nfbm90aWZ5X2NiKSwKLSAgICAgICAgICAgIHJlYWRfY2hhcmFjdGVyaXN0aWNfY2I6IFNvbWUoZ2NfcmVhZF9jaGFyYWN0ZXJpc3RpY19jYiksCi0gICAgICAgICAgICB3cml0ZV9jaGFyYWN0ZXJpc3RpY19jYjogU29tZShnY193cml0ZV9jaGFyYWN0ZXJpc3RpY19jYiksCi0gICAgICAgICAgICByZWFkX2Rlc2NyaXB0b3JfY2I6IFNvbWUoZ2NfcmVhZF9kZXNjcmlwdG9yX2NiKSwKLSAgICAgICAgICAgIHdyaXRlX2Rlc2NyaXB0b3JfY2I6IFNvbWUoZ2Nfd3JpdGVfZGVzY3JpcHRvcl9jYiksCi0gICAgICAgICAgICBleGVjdXRlX3dyaXRlX2NiOiBTb21lKGdjX2V4ZWN1dGVfd3JpdGVfY2IpLAotICAgICAgICAgICAgcmVhZF9yZW1vdGVfcnNzaV9jYjogU29tZShnY19yZWFkX3JlbW90ZV9yc3NpX2NiKSwKLSAgICAgICAgICAgIGNvbmZpZ3VyZV9tdHVfY2I6IFNvbWUoZ2NfY29uZmlndXJlX210dV9jYiksCi0gICAgICAgICAgICBjb25nZXN0aW9uX2NiOiBTb21lKGdjX2Nvbmdlc3Rpb25fY2IpLAotICAgICAgICAgICAgZ2V0X2dhdHRfZGJfY2I6IFNvbWUoZ2NfZ2V0X2dhdHRfZGJfY2IpLAotICAgICAgICAgICAgcGh5X3VwZGF0ZWRfY2I6IFNvbWUoZ2NfcGh5X3VwZGF0ZWRfY2IpLAotICAgICAgICAgICAgY29ubl91cGRhdGVkX2NiOiBTb21lKGdjX2Nvbm5fdXBkYXRlZF9jYiksCi0gICAgICAgICAgICBzZXJ2aWNlX2NoYW5nZWRfY2I6IFNvbWUoZ2Nfc2VydmljZV9jaGFuZ2VkX2NiKSwKLSAgICAgICAgICAgIC8vIFRoZXNlIGNhbGxiYWNrcyBhcmUgbmV2ZXIgdXNlZCBhbmQgd2lsbCBhbHNvIGJlIHJlbW92ZWQgZnJvbSBidGlmLgotICAgICAgICAgICAgLy8gVE9ETyhiLzIwMDA3MzQ2NCk6IFJlbW92ZSB0aGVzZS4KLSAgICAgICAgICAgIHNlcnZpY2VzX3JlbW92ZWRfY2I6IE5vbmUsCi0gICAgICAgICAgICBzZXJ2aWNlc19hZGRlZF9jYjogTm9uZSwKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbGV0IG11dCBnYXR0X3NlcnZlcl9jYWxsYmFja3MgPSBCb3g6Om5ldyhidGdhdHRfc2VydmVyX2NhbGxiYWNrc190IHsKLSAgICAgICAgICAgIHJlZ2lzdGVyX3NlcnZlcl9jYjogU29tZShnc19yZWdpc3Rlcl9zZXJ2ZXJfY2IpLAotICAgICAgICAgICAgY29ubmVjdGlvbl9jYjogU29tZShnc19jb25uZWN0aW9uX2NiKSwKLSAgICAgICAgICAgIHNlcnZpY2VfYWRkZWRfY2I6IFNvbWUoZ3Nfc2VydmljZV9hZGRlZF9jYiksCi0gICAgICAgICAgICBzZXJ2aWNlX3N0b3BwZWRfY2I6IFNvbWUoZ3Nfc2VydmljZV9zdG9wcGVkX2NiKSwKLSAgICAgICAgICAgIHNlcnZpY2VfZGVsZXRlZF9jYjogU29tZShnc19zZXJ2aWNlX2RlbGV0ZWRfY2IpLAotICAgICAgICAgICAgcmVxdWVzdF9yZWFkX2NoYXJhY3RlcmlzdGljX2NiOiBTb21lKGdzX3JlcXVlc3RfcmVhZF9jaGFyYWN0ZXJpc3RpY19jYiksCi0gICAgICAgICAgICByZXF1ZXN0X3JlYWRfZGVzY3JpcHRvcl9jYjogU29tZShnc19yZXF1ZXN0X3JlYWRfZGVzY3JpcHRvcl9jYiksCi0gICAgICAgICAgICByZXF1ZXN0X3dyaXRlX2NoYXJhY3RlcmlzdGljX2NiOiBTb21lKGdzX3JlcXVlc3Rfd3JpdGVfY2hhcmFjdGVyaXN0aWNfY2IpLAotICAgICAgICAgICAgcmVxdWVzdF93cml0ZV9kZXNjcmlwdG9yX2NiOiBTb21lKGdzX3JlcXVlc3Rfd3JpdGVfZGVzY3JpcHRvcl9jYiksCi0gICAgICAgICAgICByZXF1ZXN0X2V4ZWNfd3JpdGVfY2I6IFNvbWUoZ3NfcmVxdWVzdF9leGVjX3dyaXRlX2NiKSwKLSAgICAgICAgICAgIHJlc3BvbnNlX2NvbmZpcm1hdGlvbl9jYjogU29tZShnc19yZXNwb25zZV9jb25maXJtYXRpb25fY2IpLAotICAgICAgICAgICAgaW5kaWNhdGlvbl9zZW50X2NiOiBTb21lKGdzX2luZGljYXRpb25fc2VudF9jYiksCi0gICAgICAgICAgICBjb25nZXN0aW9uX2NiOiBTb21lKGdzX2Nvbmdlc3Rpb25fY2IpLAotICAgICAgICAgICAgbXR1X2NoYW5nZWRfY2I6IFNvbWUoZ3NfbXR1X2NoYW5nZWRfY2IpLAotICAgICAgICAgICAgcGh5X3VwZGF0ZWRfY2I6IFNvbWUoZ3NfcGh5X3VwZGF0ZWRfY2IpLAotICAgICAgICAgICAgY29ubl91cGRhdGVkX2NiOiBTb21lKGdzX2Nvbm5fdXBkYXRlZF9jYiksCi0gICAgICAgIH0pOwotCi0gICAgICAgIGxldCBtdXQgZ2F0dF9zY2FubmVyX2NhbGxiYWNrcyA9IEJveDo6bmV3KGJ0Z2F0dF9zY2FubmVyX2NhbGxiYWNrc190IHsKLSAgICAgICAgICAgIHNjYW5fcmVzdWx0X2NiOiBOb25lLAotICAgICAgICAgICAgYmF0Y2hzY2FuX3JlcG9ydHNfY2I6IE5vbmUsCi0gICAgICAgICAgICBiYXRjaHNjYW5fdGhyZXNob2xkX2NiOiBOb25lLAotICAgICAgICAgICAgdHJhY2tfYWR2X2V2ZW50X2NiOiBOb25lLAotICAgICAgICB9KTsKLQotICAgICAgICBsZXQgbXV0IGNhbGxiYWNrcyA9IEJveDo6bmV3KGJ0Z2F0dF9jYWxsYmFja3NfdCB7Ci0gICAgICAgICAgICBzaXplOiA0ICogOCwKLSAgICAgICAgICAgIGNsaWVudDogJm11dCAqZ2F0dF9jbGllbnRfY2FsbGJhY2tzLAotICAgICAgICAgICAgc2VydmVyOiAmbXV0ICpnYXR0X3NlcnZlcl9jYWxsYmFja3MsCi0gICAgICAgICAgICBzY2FubmVyOiAmbXV0ICpnYXR0X3NjYW5uZXJfY2FsbGJhY2tzLAotICAgICAgICB9KTsKLQotICAgICAgICBsZXQgcmF3Y2IgPSAmbXV0ICpjYWxsYmFja3M7Ci0KLSAgICAgICAgbGV0IGluaXQgPSBjY2FsbCEoc2VsZiwgaW5pdCwgcmF3Y2IpOwotICAgICAgICBzZWxmLmlzX2luaXQgPSBpbml0ID09IDA7Ci0gICAgICAgIHNlbGYuY2FsbGJhY2tzID0gU29tZShjYWxsYmFja3MpOwotICAgICAgICBzZWxmLmdhdHRfY2xpZW50X2NhbGxiYWNrcyA9IFNvbWUoZ2F0dF9jbGllbnRfY2FsbGJhY2tzKTsKLSAgICAgICAgc2VsZi5nYXR0X3NlcnZlcl9jYWxsYmFja3MgPSBTb21lKGdhdHRfc2VydmVyX2NhbGxiYWNrcyk7Ci0gICAgICAgIHNlbGYuZ2F0dF9zY2FubmVyX2NhbGxiYWNrcyA9IFNvbWUoZ2F0dF9zY2FubmVyX2NhbGxiYWNrcyk7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGYuaXNfaW5pdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2hmcC5ycyBiL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvaGZwLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQzYzhkLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvaGZwLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLXVzZSBjcmF0ZTo6YnRpZjo6e0JsdWV0b290aEludGVyZmFjZSwgUmF3QWRkcmVzc307Ci11c2UgY3JhdGU6OnRvcHN0YWNrOjpnZXRfZGlzcGF0Y2hlcnM7Ci0KLXVzZSBudW1fdHJhaXRzOjpjYXN0OjpGcm9tUHJpbWl0aXZlOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHRvcHNoaW1fbWFjcm9zOjpjYl92YXJpYW50OwotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRoZkNvbm5lY3Rpb25TdGF0ZSB7Ci0gICAgRGlzY29ubmVjdGVkID0gMCwKLSAgICBDb25uZWN0aW5nLAotICAgIENvbm5lY3RlZCwKLSAgICBEaXNjb25uZWN0aW5nLAotfQotCi1pbXBsIEZyb208dTMyPiBmb3IgQnRoZkNvbm5lY3Rpb25TdGF0ZSB7Ci0gICAgZm4gZnJvbShpdGVtOiB1MzIpIC0+IFNlbGYgewotICAgICAgICBCdGhmQ29ubmVjdGlvblN0YXRlOjpmcm9tX3UzMihpdGVtKS51bndyYXAoKQotICAgIH0KLX0KLQotI1tjeHg6OmJyaWRnZShuYW1lc3BhY2UgPSBibHVldG9vdGg6OnRvcHNoaW06OnJ1c3QpXQotcHViIG1vZCBmZmkgewotICAgICNbZGVyaXZlKERlYnVnLCBDb3B5LCBDbG9uZSldCi0gICAgcHViIHN0cnVjdCBSdXN0UmF3QWRkcmVzcyB7Ci0gICAgICAgIGFkZHJlc3M6IFt1ODsgNl0sCi0gICAgfQotCi0gICAgdW5zYWZlIGV4dGVybiAiQysrIiB7Ci0gICAgICAgIGluY2x1ZGUhKCJoZnAvaGZwX3NoaW0uaCIpOwotCi0gICAgICAgIHR5cGUgSGZwSW50ZjsKLQotICAgICAgICB1bnNhZmUgZm4gR2V0SGZwUHJvZmlsZShidGlmOiAqY29uc3QgdTgpIC0+IFVuaXF1ZVB0cjxIZnBJbnRmPjsKLQotICAgICAgICBmbiBpbml0KHNlbGY6IFBpbjwmbXV0IEhmcEludGY+KSAtPiBpMzI7Ci0gICAgICAgIGZuIGNvbm5lY3Qoc2VsZjogUGluPCZtdXQgSGZwSW50Zj4sIGJ0X2FkZHI6IFJ1c3RSYXdBZGRyZXNzKSAtPiBpMzI7Ci0gICAgICAgIGZuIGRpc2Nvbm5lY3Qoc2VsZjogUGluPCZtdXQgSGZwSW50Zj4sIGJ0X2FkZHI6IFJ1c3RSYXdBZGRyZXNzKSAtPiBpMzI7Ci0gICAgICAgIGZuIGNsZWFudXAoc2VsZjogUGluPCZtdXQgSGZwSW50Zj4pOwotCi0gICAgfQotICAgIGV4dGVybiAiUnVzdCIgewotICAgICAgICBmbiBoZnBfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjayhzdGF0ZTogdTMyLCBhZGRyOiBSdXN0UmF3QWRkcmVzcyk7Ci0gICAgfQotfQotCi1pbXBsIEZyb208UmF3QWRkcmVzcz4gZm9yIGZmaTo6UnVzdFJhd0FkZHJlc3MgewotICAgIGZuIGZyb20oYWRkcjogUmF3QWRkcmVzcykgLT4gU2VsZiB7Ci0gICAgICAgIGZmaTo6UnVzdFJhd0FkZHJlc3MgeyBhZGRyZXNzOiBhZGRyLnZhbCB9Ci0gICAgfQotfQotCi1pbXBsIEludG88UmF3QWRkcmVzcz4gZm9yIGZmaTo6UnVzdFJhd0FkZHJlc3MgewotICAgIGZuIGludG8oc2VsZikgLT4gUmF3QWRkcmVzcyB7Ci0gICAgICAgIFJhd0FkZHJlc3MgeyB2YWw6IHNlbGYuYWRkcmVzcyB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShEZWJ1ZyldCi1wdWIgZW51bSBIZnBDYWxsYmFja3MgewotICAgIENvbm5lY3Rpb25TdGF0ZShCdGhmQ29ubmVjdGlvblN0YXRlLCBSYXdBZGRyZXNzKSwKLX0KLQotcHViIHN0cnVjdCBIZnBDYWxsYmFja3NEaXNwYXRjaGVyIHsKLSAgICBwdWIgZGlzcGF0Y2g6IEJveDxkeW4gRm4oSGZwQ2FsbGJhY2tzKSArIFNlbmQ+LAotfQotCi10eXBlIEhmcENiID0gQXJjPE11dGV4PEhmcENhbGxiYWNrc0Rpc3BhdGNoZXI+PjsKLQotY2JfdmFyaWFudCEoCi0gICAgSGZwQ2IsCi0gICAgaGZwX2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2sgLT4gSGZwQ2FsbGJhY2tzOjpDb25uZWN0aW9uU3RhdGUsCi0gICAgdTMyIC0+IEJ0aGZDb25uZWN0aW9uU3RhdGUsIGZmaTo6UnVzdFJhd0FkZHJlc3MgLT4gUmF3QWRkcmVzcywgewotICAgICAgICBsZXQgXzEgPSBfMS5pbnRvKCk7Ci0gICAgfQotKTsKLQotcHViIHN0cnVjdCBIZnAgewotICAgIGludGVybmFsOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkhmcEludGY+LAotICAgIF9pc19pbml0OiBib29sLAotfQotCi0vLyBGb3IgKmNvbnN0IHU4IG9wYXF1ZSBidGlmCi11bnNhZmUgaW1wbCBTZW5kIGZvciBIZnAge30KLQotaW1wbCBIZnAgewotICAgIHB1YiBmbiBuZXcoaW50ZjogJkJsdWV0b290aEludGVyZmFjZSkgLT4gSGZwIHsKLSAgICAgICAgbGV0IGhmcGlmOiBjeHg6OlVuaXF1ZVB0cjxmZmk6OkhmcEludGY+OwotICAgICAgICB1bnNhZmUgewotICAgICAgICAgICAgaGZwaWYgPSBmZmk6OkdldEhmcFByb2ZpbGUoaW50Zi5hc19yYXdfcHRyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgSGZwIHsgaW50ZXJuYWw6IGhmcGlmLCBfaXNfaW5pdDogZmFsc2UgfQotICAgIH0KLQotICAgIHB1YiBmbiBpbml0aWFsaXplKCZtdXQgc2VsZiwgY2FsbGJhY2tzOiBIZnBDYWxsYmFja3NEaXNwYXRjaGVyKSAtPiBib29sIHsKLSAgICAgICAgaWYgZ2V0X2Rpc3BhdGNoZXJzKCkubG9jaygpLnVud3JhcCgpLnNldDo6PEhmcENiPihBcmM6Om5ldyhNdXRleDo6bmV3KGNhbGxiYWNrcykpKSB7Ci0gICAgICAgICAgICBwYW5pYyEoIlRyaWVkIHRvIHNldCBkaXNwYXRjaGVyIGZvciBIRlAgY2FsbGJhY2tzIHdoaWxlIGl0IGFscmVhZHkgZXhpc3RzIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi5pbnRlcm5hbC5waW5fbXV0KCkuaW5pdCgpOwotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgcHViIGZuIGNvbm5lY3QoJm11dCBzZWxmLCBhZGRyOiBSYXdBZGRyZXNzKSB7Ci0gICAgICAgIHNlbGYuaW50ZXJuYWwucGluX211dCgpLmNvbm5lY3QoYWRkci5pbnRvKCkpOwotICAgIH0KLQotICAgIHB1YiBmbiBkaXNjb25uZWN0KCZtdXQgc2VsZiwgYWRkcjogUmF3QWRkcmVzcykgewotICAgICAgICBzZWxmLmludGVybmFsLnBpbl9tdXQoKS5kaXNjb25uZWN0KGFkZHIuaW50bygpKTsKLSAgICB9Ci0KLSAgICBwdWIgZm4gY2xlYW51cCgmbXV0IHNlbGYpIC0+IGJvb2wgewotICAgICAgICBzZWxmLmludGVybmFsLnBpbl9tdXQoKS5jbGVhbnVwKCk7Ci0gICAgICAgIHRydWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2hpZF9ob3N0LnJzIGIvZ2QvcnVzdC90b3BzaGltL3NyYy9wcm9maWxlcy9oaWRfaG9zdC5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0NDdiZS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL2hpZF9ob3N0LnJzCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLXVzZSBjcmF0ZTo6YmluZGluZ3M6OnJvb3QgYXMgYmluZGluZ3M7Ci11c2UgY3JhdGU6OmJ0aWY6OntCbHVldG9vdGhJbnRlcmZhY2UsIEJ0U3RhdHVzLCBSYXdBZGRyZXNzLCBTdXBwb3J0ZWRQcm9maWxlc307Ci11c2UgY3JhdGU6OnByb2ZpbGVzOjpoaWRfaG9zdDo6YmluZGluZ3M6OmJ0aGhfaW50ZXJmYWNlX3Q7Ci11c2UgY3JhdGU6OnRvcHN0YWNrOjpnZXRfZGlzcGF0Y2hlcnM7Ci11c2UgY3JhdGU6OntjYXN0X3RvX2ZmaV9hZGRyZXNzLCBjY2FsbCwgZGVyZWZfZmZpX2FkZHJlc3N9OwotCi11c2UgbnVtX3RyYWl0czo6Y2FzdDo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKLXVzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKLXVzZSB0b3BzaGltX21hY3Jvczo6Y2JfdmFyaWFudDsKLQotI1tkZXJpdmUoRGVidWcsIEZyb21QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0aGhDb25uZWN0aW9uU3RhdGUgewotICAgIENvbm5lY3RlZCA9IDAsCi0gICAgQ29ubmVjdGluZywKLSAgICBEaXNjb25uZWN0ZWQsCi0gICAgRGlzY29ubmVjdGluZywKLSAgICBVbmtub3duID0gMHhmZiwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpidGhoX2Nvbm5lY3Rpb25fc3RhdGVfdD4gZm9yIEJ0aGhDb25uZWN0aW9uU3RhdGUgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6OmJ0aGhfY29ubmVjdGlvbl9zdGF0ZV90KSAtPiBTZWxmIHsKLSAgICAgICAgQnRoaENvbm5lY3Rpb25TdGF0ZTo6ZnJvbV91MzIoaXRlbSkudW53cmFwX29yX2Vsc2UofHwgQnRoaENvbm5lY3Rpb25TdGF0ZTo6VW5rbm93bikKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKERlYnVnLCBGcm9tUHJpbWl0aXZlLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBCdGhoU3RhdHVzIHsKLSAgICBPayA9IDAsCi0gICAgSHNIaWROb3RSZWFkeSwKLSAgICBIc0ludmFsaWRScHRJZCwKLSAgICBIc1RyYW5zTm90U3B0LAotICAgIEhzSW52YWxpZFBhcmFtLAotICAgIEhzRXJyb3IsCi0gICAgRXJyb3IsCi0gICAgRXJyU2RwLAotICAgIEVyclByb3RvLAotICAgIEVyckRiRnVsbCwKLSAgICBFcnJUb2RVbnNwdCwKLSAgICBFcnJOb1JlcywKLSAgICBFcnJBdXRoRmFpbGVkLAotICAgIEVyckhkbCwKLQotICAgIFVua25vd24sCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6YnRoaF9zdGF0dXNfdD4gZm9yIEJ0aGhTdGF0dXMgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6OmJ0aGhfc3RhdHVzX3QpIC0+IFNlbGYgewotICAgICAgICBCdGhoU3RhdHVzOjpmcm9tX3UzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBCdGhoU3RhdHVzOjpVbmtub3duKQotICAgIH0KLX0KLQotcHViIHR5cGUgQnRoaEhpZEluZm8gPSBiaW5kaW5nczo6YnRoaF9oaWRfaW5mb190OwotCi0jW2Rlcml2ZShEZWJ1ZywgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCi0jW3JlcHIodTMyKV0KLXB1YiBlbnVtIEJ0aGhQcm90b2NvbE1vZGUgewotICAgIFJlcG9ydE1vZGUgPSAwLAotICAgIEJvb3RNb2RlID0gMSwKLSAgICBVbnN1cHBvcnRlZE1vZGUgPSAweGZmLAotfQotCi1pbXBsIEZyb208YmluZGluZ3M6OmJ0aGhfcHJvdG9jb2xfbW9kZV90PiBmb3IgQnRoaFByb3RvY29sTW9kZSB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6YnRoaF9wcm90b2NvbF9tb2RlX3QpIC0+IFNlbGYgewotICAgICAgICBCdGhoUHJvdG9jb2xNb2RlOjpmcm9tX3UzMihpdGVtKS51bndyYXBfb3JfZWxzZSh8fCBCdGhoUHJvdG9jb2xNb2RlOjpVbnN1cHBvcnRlZE1vZGUpCi0gICAgfQotfQotCi1pbXBsIEZyb208QnRoaFByb3RvY29sTW9kZT4gZm9yIGJpbmRpbmdzOjpidGhoX3Byb3RvY29sX21vZGVfdCB7Ci0gICAgZm4gZnJvbShpdGVtOiBCdGhoUHJvdG9jb2xNb2RlKSAtPiBTZWxmIHsKLSAgICAgICAgaXRlbS50b191MzIoKS51bndyYXAoKQotICAgIH0KLX0KLQotI1tkZXJpdmUoRGVidWcsIEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBCdGhoUmVwb3J0VHlwZSB7Ci0gICAgSW5wdXRSZXBvcnQgPSAxLAotICAgIE91dHB1dFJlcG9ydCA9IDIsCi0gICAgRmVhdHVyZVJlcG9ydCA9IDMsCi19Ci0KLWltcGwgRnJvbTxCdGhoUmVwb3J0VHlwZT4gZm9yIGJpbmRpbmdzOjpidGhoX3JlcG9ydF90eXBlX3QgewotICAgIGZuIGZyb20oaXRlbTogQnRoaFJlcG9ydFR5cGUpIC0+IFNlbGYgewotICAgICAgICBpdGVtLnRvX3UzMigpLnVud3JhcCgpCi0gICAgfQotfQotCi1mbiBjb252ZXJ0X3JlcG9ydChjb3VudDogaTMyLCByYXc6ICptdXQgdTgpIC0+IFZlYzx1OD4gewotICAgIGxldCBtdXQgdjogVmVjPHU4PiA9IFZlYzo6bmV3KCk7Ci0gICAgZm9yIGkgaW4gMC4uaXNpemU6OmZyb21faTMyKGNvdW50KS51bndyYXAoKSB7Ci0gICAgICAgIGxldCBwOiAqY29uc3QgdTggPSB1bnNhZmUgeyByYXcub2Zmc2V0KGkpIH07Ci0gICAgICAgIHYucHVzaCh1bnNhZmUgeyAqcCB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdjsKLX0KLQotcHViIGVudW0gSEhDYWxsYmFja3MgewotICAgIENvbm5lY3Rpb25TdGF0ZShSYXdBZGRyZXNzLCBCdGhoQ29ubmVjdGlvblN0YXRlKSwKLSAgICBWaXJ0dWFsVW5wbHVnKFJhd0FkZHJlc3MsIEJ0aGhTdGF0dXMpLAotICAgIEhpZEluZm8oUmF3QWRkcmVzcywgQnRoaEhpZEluZm8pLAotICAgIFByb3RvY29sTW9kZShSYXdBZGRyZXNzLCBCdGhoU3RhdHVzLCBCdGhoUHJvdG9jb2xNb2RlKSwKLSAgICBJZGxlVGltZShSYXdBZGRyZXNzLCBCdGhoU3RhdHVzLCBpMzIpLAotICAgIEdldFJlcG9ydChSYXdBZGRyZXNzLCBCdGhoU3RhdHVzLCBWZWM8dTg+LCBpMzIpLAotICAgIEhhbmRzaGFrZShSYXdBZGRyZXNzLCBCdGhoU3RhdHVzKSwKLX0KLQotcHViIHN0cnVjdCBISENhbGxiYWNrc0Rpc3BhdGNoZXIgewotICAgIHB1YiBkaXNwYXRjaDogQm94PGR5biBGbihISENhbGxiYWNrcykgKyBTZW5kPiwKLX0KLQotLy8gRXhwb3J0IHRoZSByYXcgYWRkcmVzcyB0eXBlIGRpcmVjdGx5IGZyb20gdGhlIGJpbmRpbmdzCi10eXBlIEZmaUFkZHJlc3MgPSBiaW5kaW5nczo6UmF3QWRkcmVzczsKLQotdHlwZSBISENiID0gQXJjPE11dGV4PEhIQ2FsbGJhY2tzRGlzcGF0Y2hlcj4+OwotCi1jYl92YXJpYW50IShISENiLCBjb25uZWN0aW9uX3N0YXRlX2NiIC0+IEhIQ2FsbGJhY2tzOjpDb25uZWN0aW9uU3RhdGUsCi0qbXV0IEZmaUFkZHJlc3MsIGJpbmRpbmdzOjpidGhoX2Nvbm5lY3Rpb25fc3RhdGVfdCAtPiBCdGhoQ29ubmVjdGlvblN0YXRlLCB7Ci0gICAgbGV0IF8wID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8wKSB9OwotfSk7Ci1jYl92YXJpYW50IShISENiLCB2aXJ0dWFsX3VucGx1Z19jYiAtPiBISENhbGxiYWNrczo6VmlydHVhbFVucGx1ZywKLSptdXQgRmZpQWRkcmVzcywgYmluZGluZ3M6OmJ0aGhfc3RhdHVzX3QgLT4gQnRoaFN0YXR1cywgewotICAgIGxldCBfMCA9IHVuc2FmZSB7IGRlcmVmX2ZmaV9hZGRyZXNzIShfMCkgfTsKLX0pOwotY2JfdmFyaWFudCEoSEhDYiwgaGlkX2luZm9fY2IgLT4gSEhDYWxsYmFja3M6OkhpZEluZm8sCi0qbXV0IEZmaUFkZHJlc3MsIGJpbmRpbmdzOjpidGhoX2hpZF9pbmZvX3QgLT4gQnRoaEhpZEluZm8sIHsKLSAgICBsZXQgXzAgPSB1bnNhZmUgeyBkZXJlZl9mZmlfYWRkcmVzcyEoXzApIH07Ci19KTsKLWNiX3ZhcmlhbnQhKEhIQ2IsIHByb3RvY29sX21vZGVfY2IgLT4gSEhDYWxsYmFja3M6OlByb3RvY29sTW9kZSwKLSptdXQgRmZpQWRkcmVzcywgYmluZGluZ3M6OmJ0aGhfc3RhdHVzX3QgLT4gQnRoaFN0YXR1cywKLWJpbmRpbmdzOjpidGhoX3Byb3RvY29sX21vZGVfdCAtPiBCdGhoUHJvdG9jb2xNb2RlLCB7Ci0gICAgbGV0IF8wID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8wKSB9OwotfSk7Ci1jYl92YXJpYW50IShISENiLCBpZGxlX3RpbWVfY2IgLT4gSEhDYWxsYmFja3M6OklkbGVUaW1lLAotKm11dCBGZmlBZGRyZXNzLCBiaW5kaW5nczo6YnRoaF9zdGF0dXNfdCAtPiBCdGhoU3RhdHVzLCBpMzIsIHsKLSAgICBsZXQgXzAgPSB1bnNhZmUgeyBkZXJlZl9mZmlfYWRkcmVzcyEoXzApIH07Ci19KTsKLWNiX3ZhcmlhbnQhKEhIQ2IsIGdldF9yZXBvcnRfY2IgLT4gSEhDYWxsYmFja3M6OkdldFJlcG9ydCwKLSptdXQgRmZpQWRkcmVzcywgYmluZGluZ3M6OmJ0aGhfc3RhdHVzX3QgLT4gQnRoaFN0YXR1cywgKm11dCB1OCwgaTMyLCB7Ci0gICAgbGV0IF8wID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8wKSB9OwotICAgIGxldCBfMiA9IGNvbnZlcnRfcmVwb3J0KF8zLCBfMik7Ci19KTsKLWNiX3ZhcmlhbnQhKEhIQ2IsIGhhbmRzaGFrZV9jYiAtPiBISENhbGxiYWNrczo6SGFuZHNoYWtlLAotKm11dCBGZmlBZGRyZXNzLCBiaW5kaW5nczo6YnRoaF9zdGF0dXNfdCAtPiBCdGhoU3RhdHVzLCB7Ci0gICAgbGV0IF8wID0gdW5zYWZlIHsgZGVyZWZfZmZpX2FkZHJlc3MhKF8wKSB9OwotfSk7Ci0KLXN0cnVjdCBSYXdISFdyYXBwZXIgewotICAgIHJhdzogKmNvbnN0IGJpbmRpbmdzOjpidGhoX2ludGVyZmFjZV90LAotfQotCi0vLyBQb2ludGVycyB1bnNhZmUgZHVlIHRvIG93bmVyc2hpcCBidXQgdGhpcyBpcyBhIHN0YXRpYyBwb2ludGVyIHNvIFNlbmQgaXMgb2sKLXVuc2FmZSBpbXBsIFNlbmQgZm9yIFJhd0hIV3JhcHBlciB7fQotCi1wdWIgc3RydWN0IEhpZEhvc3QgewotICAgIGludGVybmFsOiBSYXdISFdyYXBwZXIsCi0gICAgaXNfaW5pdDogYm9vbCwKLSAgICAvLyBLZWVwIGNhbGxiYWNrIG9iamVjdCBpbiBtZW1vcnkgKHVuZGVybHlpbmcgY29kZSBkb2Vzbid0IG1ha2UgY29weSkKLSAgICBjYWxsYmFja3M6IE9wdGlvbjxCb3g8YmluZGluZ3M6OmJ0aGhfY2FsbGJhY2tzX3Q+PiwKLX0KLQotaW1wbCBIaWRIb3N0IHsKLSAgICBwdWIgZm4gbmV3KGludGY6ICZCbHVldG9vdGhJbnRlcmZhY2UpIC0+IEhpZEhvc3QgewotICAgICAgICBsZXQgciA9IGludGYuZ2V0X3Byb2ZpbGVfaW50ZXJmYWNlKFN1cHBvcnRlZFByb2ZpbGVzOjpIaWRIb3N0KTsKLSAgICAgICAgSGlkSG9zdCB7Ci0gICAgICAgICAgICBpbnRlcm5hbDogUmF3SEhXcmFwcGVyIHsgcmF3OiByIGFzICpjb25zdCBidGhoX2ludGVyZmFjZV90IH0sCi0gICAgICAgICAgICBpc19pbml0OiBmYWxzZSwKLSAgICAgICAgICAgIGNhbGxiYWNrczogTm9uZSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YiBmbiBpc19pbml0aWFsaXplZCgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIHNlbGYuaXNfaW5pdAotICAgIH0KLQotICAgIHB1YiBmbiBpbml0aWFsaXplKCZtdXQgc2VsZiwgY2FsbGJhY2tzOiBISENhbGxiYWNrc0Rpc3BhdGNoZXIpIC0+IGJvb2wgewotICAgICAgICAvLyBSZWdpc3RlciBkaXNwYXRjaGVyCi0gICAgICAgIGlmIGdldF9kaXNwYXRjaGVycygpLmxvY2soKS51bndyYXAoKS5zZXQ6OjxISENiPihBcmM6Om5ldyhNdXRleDo6bmV3KGNhbGxiYWNrcykpKSB7Ci0gICAgICAgICAgICBwYW5pYyEoIlRyaWVkIHRvIHNldCBkaXNwYXRjaGVyIGZvciBISENhbGxiYWNrcyBidXQgaXQgYWxyZWFkeSBleGlzdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgbXV0IGNhbGxiYWNrcyA9IEJveDo6bmV3KGJpbmRpbmdzOjpidGhoX2NhbGxiYWNrc190IHsKLSAgICAgICAgICAgIHNpemU6IDggKiA4LAotICAgICAgICAgICAgY29ubmVjdGlvbl9zdGF0ZV9jYjogU29tZShjb25uZWN0aW9uX3N0YXRlX2NiKSwKLSAgICAgICAgICAgIGhpZF9pbmZvX2NiOiBTb21lKGhpZF9pbmZvX2NiKSwKLSAgICAgICAgICAgIHByb3RvY29sX21vZGVfY2I6IFNvbWUocHJvdG9jb2xfbW9kZV9jYiksCi0gICAgICAgICAgICBpZGxlX3RpbWVfY2I6IFNvbWUoaWRsZV90aW1lX2NiKSwKLSAgICAgICAgICAgIGdldF9yZXBvcnRfY2I6IFNvbWUoZ2V0X3JlcG9ydF9jYiksCi0gICAgICAgICAgICB2aXJ0dWFsX3VucGx1Z19jYjogU29tZSh2aXJ0dWFsX3VucGx1Z19jYiksCi0gICAgICAgICAgICBoYW5kc2hha2VfY2I6IFNvbWUoaGFuZHNoYWtlX2NiKSwKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbGV0IHJhd2NiID0gJm11dCAqY2FsbGJhY2tzOwotCi0gICAgICAgIGxldCBpbml0ID0gY2NhbGwhKHNlbGYsIGluaXQsIHJhd2NiKTsKLSAgICAgICAgc2VsZi5pc19pbml0ID0gQnRTdGF0dXM6OmZyb20oaW5pdCkgPT0gQnRTdGF0dXM6OlN1Y2Nlc3M7Ci0gICAgICAgIHNlbGYuY2FsbGJhY2tzID0gU29tZShjYWxsYmFja3MpOwotCi0gICAgICAgIHJldHVybiBzZWxmLmlzX2luaXQ7Ci0gICAgfQotCi0gICAgcHViIGZuIGNvbm5lY3QoJnNlbGYsIGFkZHI6ICZtdXQgUmF3QWRkcmVzcykgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICptdXQgUmF3QWRkcmVzcyk7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCBjb25uZWN0LCBmZmlfYWRkcikpCi0gICAgfQotCi0gICAgcHViIGZuIGRpc2Nvbm5lY3QoJnNlbGYsIGFkZHI6ICZtdXQgUmF3QWRkcmVzcykgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgZmZpX2FkZHIgPSBjYXN0X3RvX2ZmaV9hZGRyZXNzIShhZGRyIGFzICptdXQgUmF3QWRkcmVzcyk7Ci0gICAgICAgIEJ0U3RhdHVzOjpmcm9tKGNjYWxsIShzZWxmLCBkaXNjb25uZWN0LCBmZmlfYWRkcikpCi0gICAgfQotCi0gICAgcHViIGZuIHZpcnR1YWxfdW5wbHVnKCZzZWxmLCBhZGRyOiAmbXV0IFJhd0FkZHJlc3MpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqbXV0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgdmlydHVhbF91bnBsdWcsIGZmaV9hZGRyKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X2luZm8oJnNlbGYsIGFkZHI6ICZtdXQgUmF3QWRkcmVzcywgaW5mbzogQnRoaEhpZEluZm8pIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqbXV0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgc2V0X2luZm8sIGZmaV9hZGRyLCBpbmZvKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gZ2V0X3Byb3RvY29sKCZzZWxmLCBhZGRyOiAmbXV0IFJhd0FkZHJlc3MsIG1vZGU6IEJ0aGhQcm90b2NvbE1vZGUpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqbXV0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgZ2V0X3Byb3RvY29sLAotICAgICAgICAgICAgZmZpX2FkZHIsCi0gICAgICAgICAgICBiaW5kaW5nczo6YnRoaF9wcm90b2NvbF9tb2RlX3Q6OmZyb20obW9kZSkKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X3Byb3RvY29sKCZzZWxmLCBhZGRyOiAmbXV0IFJhd0FkZHJlc3MsIG1vZGU6IEJ0aGhQcm90b2NvbE1vZGUpIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqbXV0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgc2V0X3Byb3RvY29sLAotICAgICAgICAgICAgZmZpX2FkZHIsCi0gICAgICAgICAgICBiaW5kaW5nczo6YnRoaF9wcm90b2NvbF9tb2RlX3Q6OmZyb20obW9kZSkKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gZ2V0X2lkbGVfdGltZSgmc2VsZiwgYWRkcjogJm11dCBSYXdBZGRyZXNzKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKm11dCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIGdldF9pZGxlX3RpbWUsIGZmaV9hZGRyKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X2lkbGVfdGltZSgmc2VsZiwgYWRkcjogJm11dCBSYXdBZGRyZXNzLCBpZGxlX3RpbWU6IHU4KSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKm11dCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHNldF9pZGxlX3RpbWUsIGZmaV9hZGRyLCBpZGxlX3RpbWUpKQotICAgIH0KLQotICAgIHB1YiBmbiBnZXRfcmVwb3J0KAotICAgICAgICAmc2VsZiwKLSAgICAgICAgYWRkcjogJm11dCBSYXdBZGRyZXNzLAotICAgICAgICByZXBvcnRfdHlwZTogQnRoaFJlcG9ydFR5cGUsCi0gICAgICAgIHJlcG9ydF9pZDogdTgsCi0gICAgICAgIGJ1ZmZlcl9zaXplOiBpMzIsCi0gICAgKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHIgYXMgKm11dCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGdldF9yZXBvcnQsCi0gICAgICAgICAgICBmZmlfYWRkciwKLSAgICAgICAgICAgIGJpbmRpbmdzOjpidGhoX3JlcG9ydF90eXBlX3Q6OmZyb20ocmVwb3J0X3R5cGUpLAotICAgICAgICAgICAgcmVwb3J0X2lkLAotICAgICAgICAgICAgYnVmZmVyX3NpemUKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gc2V0X3JlcG9ydCgKLSAgICAgICAgJnNlbGYsCi0gICAgICAgIGFkZHI6ICZtdXQgUmF3QWRkcmVzcywKLSAgICAgICAgcmVwb3J0X3R5cGU6IEJ0aGhSZXBvcnRUeXBlLAotICAgICAgICByZXBvcnQ6ICZtdXQgW3U4XSwKLSAgICApIC0+IEJ0U3RhdHVzIHsKLSAgICAgICAgbGV0IGZmaV9hZGRyID0gY2FzdF90b19mZmlfYWRkcmVzcyEoYWRkciBhcyAqbXV0IFJhd0FkZHJlc3MpOwotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgc2V0X3JlcG9ydCwKLSAgICAgICAgICAgIGZmaV9hZGRyLAotICAgICAgICAgICAgYmluZGluZ3M6OmJ0aGhfcmVwb3J0X3R5cGVfdDo6ZnJvbShyZXBvcnRfdHlwZSksCi0gICAgICAgICAgICByZXBvcnQuYXNfbXV0X3B0cigpIGFzICptdXQgc3RkOjpvczo6cmF3OjpjX2NoYXIKLSAgICAgICAgKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gY2xlYW51cCgmc2VsZikgewotICAgICAgICBjY2FsbCEoc2VsZiwgY2xlYW51cCkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL21vZC5ycyBiL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvbW9kLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJlN2M1Li4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvbW9kLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWIgbW9kIGEyZHA7Ci1wdWIgbW9kIGF2cmNwOwotcHViIG1vZCBnYXR0OwotcHViIG1vZCBoZnA7Ci1wdWIgbW9kIGhpZF9ob3N0OwotcHViIG1vZCBzZHA7CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vc3JjL3Byb2ZpbGVzL3NkcC5ycyBiL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvc2RwLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDIwMDEyLi4wMDAwMDAwCi0tLSBhL2dkL3J1c3QvdG9wc2hpbS9zcmMvcHJvZmlsZXMvc2RwLnJzCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLXVzZSBudW1fdHJhaXRzOjpjYXN0Ojp7RnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmV9OwotdXNlIHN0ZDo6b3M6OnJhdzo6Y19jaGFyOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHN0ZDo6dmVjOjpWZWM7Ci0KLXVzZSBjcmF0ZTo6YmluZGluZ3M6OnJvb3QgYXMgYmluZGluZ3M7Ci11c2UgY3JhdGU6OmJ0aWY6OnsKLSAgICBhc2NpaV90b19zdHJpbmcsIHB0cl90b192ZWMsIEJsdWV0b290aEludGVyZmFjZSwgQnRTdGF0dXMsIEZmaUFkZHJlc3MsIFJhd0FkZHJlc3MsCi0gICAgU3VwcG9ydGVkUHJvZmlsZXMsIFV1aWQsCi19OwotdXNlIGNyYXRlOjp0b3BzdGFjazo6Z2V0X2Rpc3BhdGNoZXJzOwotdXNlIGNyYXRlOjp7Y2FzdF90b19mZmlfYWRkcmVzcywgY2NhbGwsIGRlcmVmX2NvbnN0X2ZmaV9hZGRyZXNzfTsKLXVzZSB0b3BzaGltX21hY3Jvczo6Y2JfdmFyaWFudDsKLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gQnRTZHBUeXBlIHsKLSAgICBSYXcgPSAwLAotICAgIE1hcE1hcywKLSAgICBNYXBNbnMsCi0gICAgUGJhcFBzZSwKLSAgICBQYmFwUGNlLAotICAgIE9wcFNlcnZlciwKLSAgICBTYXBTZXJ2ZXIsCi0gICAgRGlwLAotfQotCi1pbXBsIEZyb208YmluZGluZ3M6OmJsdWV0b290aF9zZHBfdHlwZXM+IGZvciBCdFNkcFR5cGUgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6OmJsdWV0b290aF9zZHBfdHlwZXMpIC0+IFNlbGYgewotICAgICAgICBCdFNkcFR5cGU6OmZyb21fdTMyKGl0ZW0pLnVud3JhcF9vcihCdFNkcFR5cGU6OlJhdykKLSAgICB9Ci19Ci0KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZyldCi1wdWIgc3RydWN0IEJ0U2RwSGVhZGVyIHsKLSAgICBzZHBfdHlwZTogQnRTZHBUeXBlLAotICAgIHV1aWQ6IFV1aWQsCi0gICAgc2VydmljZV9uYW1lX2xlbmd0aDogdTMyLAotICAgIHNlcnZpY2VfbmFtZTogU3RyaW5nLAotICAgIHJmY29tbV9jaGFubmVsX251bWJlcjogaTMyLAotICAgIGwyY2FwX3BzbTogaTMyLAotICAgIHByb2ZpbGVfdmVyc2lvbjogaTMyLAotfQotCi1pbXBsIEZyb208YmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX2hkcj4gZm9yIEJ0U2RwSGVhZGVyIHsKLSAgICBmbiBmcm9tKGl0ZW06IGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9oZHIpIC0+IFNlbGYgewotICAgICAgICBsZXQgc2VydmljZV9uYW1lID0gYXNjaWlfdG9fc3RyaW5nKAotICAgICAgICAgICAgdW5zYWZlIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cygKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXJ2aWNlX25hbWUgYXMgKmNvbnN0IHU4LAotICAgICAgICAgICAgICAgICAgICBpdGVtLnNlcnZpY2VfbmFtZV9sZW5ndGggYXMgdXNpemUsCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGl0ZW0uc2VydmljZV9uYW1lX2xlbmd0aCBhcyB1c2l6ZSwKLSAgICAgICAgKTsKLSAgICAgICAgQnRTZHBIZWFkZXIgewotICAgICAgICAgICAgc2RwX3R5cGU6IEJ0U2RwVHlwZTo6ZnJvbShpdGVtLnR5cGVfKSwKLSAgICAgICAgICAgIHV1aWQ6IGl0ZW0udXVpZCwKLSAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sZW5ndGg6IGl0ZW0uc2VydmljZV9uYW1lX2xlbmd0aCwKLSAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgIHJmY29tbV9jaGFubmVsX251bWJlcjogaXRlbS5yZmNvbW1fY2hhbm5lbF9udW1iZXIsCi0gICAgICAgICAgICBsMmNhcF9wc206IGl0ZW0ubDJjYXBfcHNtLAotICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uOiBpdGVtLnByb2ZpbGVfdmVyc2lvbiwKLSAgICAgICAgfQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KLXB1YiBzdHJ1Y3QgQnRTZHBIZWFkZXJPdmVybGF5IHsKLSAgICBoZHI6IEJ0U2RwSGVhZGVyLAotICAgIHVzZXIxX2xlbjogaTMyLAotICAgIHVzZXIxX2RhdGE6IFZlYzx1OD4sCi0gICAgdXNlcjJfbGVuOiBpMzIsCi0gICAgdXNlcjJfZGF0YTogVmVjPHU4PiwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9oZHJfb3ZlcmxheT4gZm9yIEJ0U2RwSGVhZGVyT3ZlcmxheSB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfaGRyX292ZXJsYXkpIC0+IFNlbGYgewotICAgICAgICBsZXQgdXNlcjFfbGVuID0gaXRlbS51c2VyMV9wdHJfbGVuOwotICAgICAgICBsZXQgdXNlcjFfZGF0YSA9IHVuc2FmZSB7Ci0gICAgICAgICAgICBzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhpdGVtLnVzZXIxX3B0ciwgaXRlbS51c2VyMV9wdHJfbGVuIGFzIHVzaXplKS50b192ZWMoKQotICAgICAgICB9OwotICAgICAgICBsZXQgdXNlcjJfbGVuID0gaXRlbS51c2VyMl9wdHJfbGVuOwotICAgICAgICBsZXQgdXNlcjJfZGF0YSA9IHVuc2FmZSB7Ci0gICAgICAgICAgICBzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhpdGVtLnVzZXIyX3B0ciwgaXRlbS51c2VyMl9wdHJfbGVuIGFzIHVzaXplKS50b192ZWMoKQotICAgICAgICB9OwotCi0gICAgICAgIEJ0U2RwSGVhZGVyT3ZlcmxheSB7Ci0gICAgICAgICAgICBoZHI6IHVuc2FmZSB7Ci0gICAgICAgICAgICAgICAgQnRTZHBIZWFkZXI6OmZyb20oCi0gICAgICAgICAgICAgICAgICAgICooKCZpdGVtIGFzICpjb25zdCBiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfaGRyX292ZXJsYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhcyAqY29uc3QgYmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX2hkciksCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHVzZXIxX2xlbiwKLSAgICAgICAgICAgIHVzZXIxX2RhdGEsCi0gICAgICAgICAgICB1c2VyMl9sZW4sCi0gICAgICAgICAgICB1c2VyMl9kYXRhLAotICAgICAgICB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcpXQotcHViIHN0cnVjdCBCdFNkcE1hc1JlY29yZCB7Ci0gICAgaGRyOiBCdFNkcEhlYWRlck92ZXJsYXksCi0gICAgbWFzX2luc3RhbmNlX2lkOiB1MzIsCi0gICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiB1MzIsCi0gICAgc3VwcG9ydGVkX21lc3NhZ2VfdHlwZXM6IHUzMiwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9tYXNfcmVjb3JkPiBmb3IgQnRTZHBNYXNSZWNvcmQgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX21hc19yZWNvcmQpIC0+IFNlbGYgewotICAgICAgICBCdFNkcE1hc1JlY29yZCB7Ci0gICAgICAgICAgICBoZHI6IEJ0U2RwSGVhZGVyT3ZlcmxheTo6ZnJvbShpdGVtLmhkciksCi0gICAgICAgICAgICBtYXNfaW5zdGFuY2VfaWQ6IGl0ZW0ubWFzX2luc3RhbmNlX2lkLAotICAgICAgICAgICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiBpdGVtLnN1cHBvcnRlZF9mZWF0dXJlcywKLSAgICAgICAgICAgIHN1cHBvcnRlZF9tZXNzYWdlX3R5cGVzOiBpdGVtLnN1cHBvcnRlZF9tZXNzYWdlX3R5cGVzLAotICAgICAgICB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcpXQotcHViIHN0cnVjdCBCdFNkcE1uc1JlY29yZCB7Ci0gICAgaGRyOiBCdFNkcEhlYWRlck92ZXJsYXksCi0gICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiB1MzIsCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfbW5zX3JlY29yZD4gZm9yIEJ0U2RwTW5zUmVjb3JkIHsKLSAgICBmbiBmcm9tKGl0ZW06IGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9tbnNfcmVjb3JkKSAtPiBTZWxmIHsKLSAgICAgICAgQnRTZHBNbnNSZWNvcmQgewotICAgICAgICAgICAgaGRyOiBCdFNkcEhlYWRlck92ZXJsYXk6OmZyb20oaXRlbS5oZHIpLAotICAgICAgICAgICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiBpdGVtLnN1cHBvcnRlZF9mZWF0dXJlcywKLSAgICAgICAgfQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KLXB1YiBzdHJ1Y3QgQnRTZHBQc2VSZWNvcmQgewotICAgIGhkcjogQnRTZHBIZWFkZXJPdmVybGF5LAotICAgIHN1cHBvcnRlZF9mZWF0dXJlczogdTMyLAotICAgIHN1cHBvcnRlZF9yZXBvc2l0b3JpZXM6IHUzMiwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9wc2VfcmVjb3JkPiBmb3IgQnRTZHBQc2VSZWNvcmQgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX3BzZV9yZWNvcmQpIC0+IFNlbGYgewotICAgICAgICBCdFNkcFBzZVJlY29yZCB7Ci0gICAgICAgICAgICBoZHI6IEJ0U2RwSGVhZGVyT3ZlcmxheTo6ZnJvbShpdGVtLmhkciksCi0gICAgICAgICAgICBzdXBwb3J0ZWRfZmVhdHVyZXM6IGl0ZW0uc3VwcG9ydGVkX2ZlYXR1cmVzLAotICAgICAgICAgICAgc3VwcG9ydGVkX3JlcG9zaXRvcmllczogaXRlbS5zdXBwb3J0ZWRfcmVwb3NpdG9yaWVzLAotICAgICAgICB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcpXQotcHViIHN0cnVjdCBCdFNkcFBjZVJlY29yZCB7Ci0gICAgaGRyOiBCdFNkcEhlYWRlck92ZXJsYXksCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfcGNlX3JlY29yZD4gZm9yIEJ0U2RwUGNlUmVjb3JkIHsKLSAgICBmbiBmcm9tKGl0ZW06IGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9wY2VfcmVjb3JkKSAtPiBTZWxmIHsKLSAgICAgICAgQnRTZHBQY2VSZWNvcmQgeyBoZHI6IEJ0U2RwSGVhZGVyT3ZlcmxheTo6ZnJvbShpdGVtLmhkcikgfQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KLXB1YiBzdHJ1Y3QgQnRTZHBPcHNSZWNvcmQgewotICAgIGhkcjogQnRTZHBIZWFkZXJPdmVybGF5LAotICAgIHN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuOiBpMzIsCi0gICAgc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdDogW3U4OyAxNXVzaXplXSwKLX0KLQotaW1wbCBGcm9tPGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9vcHNfcmVjb3JkPiBmb3IgQnRTZHBPcHNSZWNvcmQgewotICAgIGZuIGZyb20oaXRlbTogYmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX29wc19yZWNvcmQpIC0+IFNlbGYgewotICAgICAgICBCdFNkcE9wc1JlY29yZCB7Ci0gICAgICAgICAgICBoZHI6IEJ0U2RwSGVhZGVyT3ZlcmxheTo6ZnJvbShpdGVtLmhkciksCi0gICAgICAgICAgICBzdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbjogaXRlbS5zdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbiwKLSAgICAgICAgICAgIHN1cHBvcnRlZF9mb3JtYXRzX2xpc3Q6IGl0ZW0uc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdCwKLSAgICAgICAgfQotICAgIH0KLX0KLQotI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KLXB1YiBzdHJ1Y3QgQnRTZHBTYXBSZWNvcmQgewotICAgIGhkcjogQnRTZHBIZWFkZXJPdmVybGF5LAotfQotCi1pbXBsIEZyb208YmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX3NhcF9yZWNvcmQ+IGZvciBCdFNkcFNhcFJlY29yZCB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfc2FwX3JlY29yZCkgLT4gU2VsZiB7Ci0gICAgICAgIEJ0U2RwU2FwUmVjb3JkIHsgaGRyOiBCdFNkcEhlYWRlck92ZXJsYXk6OmZyb20oaXRlbS5oZHIpIH0KLSAgICB9Ci19Ci0KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZyldCi1wdWIgc3RydWN0IEJ0U2RwRGlwUmVjb3JkIHsKLSAgICBoZHI6IEJ0U2RwSGVhZGVyT3ZlcmxheSwKLSAgICBzcGVjX2lkOiB1MTYsCi0gICAgdmVuZG9yOiB1MTYsCi0gICAgdmVuZG9yX2lkX3NvdXJjZTogdTE2LAotICAgIHByb2R1Y3Q6IHUxNiwKLSAgICB2ZXJzaW9uOiB1MTYsCi0gICAgcHJpbWFyeV9yZWNvcmQ6IGJvb2wsCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfZGlwX3JlY29yZD4gZm9yIEJ0U2RwRGlwUmVjb3JkIHsKLSAgICBmbiBmcm9tKGl0ZW06IGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9kaXBfcmVjb3JkKSAtPiBTZWxmIHsKLSAgICAgICAgQnRTZHBEaXBSZWNvcmQgewotICAgICAgICAgICAgaGRyOiBCdFNkcEhlYWRlck92ZXJsYXk6OmZyb20oaXRlbS5oZHIpLAotICAgICAgICAgICAgc3BlY19pZDogaXRlbS5zcGVjX2lkLAotICAgICAgICAgICAgdmVuZG9yOiBpdGVtLnZlbmRvciwKLSAgICAgICAgICAgIHZlbmRvcl9pZF9zb3VyY2U6IGl0ZW0udmVuZG9yX2lkX3NvdXJjZSwKLSAgICAgICAgICAgIHByb2R1Y3Q6IGl0ZW0ucHJvZHVjdCwKLSAgICAgICAgICAgIHZlcnNpb246IGl0ZW0udmVyc2lvbiwKLSAgICAgICAgICAgIHByaW1hcnlfcmVjb3JkOiBpdGVtLnByaW1hcnlfcmVjb3JkLAotICAgICAgICB9Ci0gICAgfQotfQotCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcpXQotcHViIGVudW0gQnRTZHBSZWNvcmQgewotICAgIEhlYWRlck92ZXJsYXkoQnRTZHBIZWFkZXJPdmVybGF5KSwKLSAgICBNYXBNYXMoQnRTZHBNYXNSZWNvcmQpLAotICAgIE1hcE1ucyhCdFNkcE1uc1JlY29yZCksCi0gICAgUGJhcFBzZShCdFNkcFBzZVJlY29yZCksCi0gICAgUGJhcFBjZShCdFNkcFBjZVJlY29yZCksCi0gICAgT3BwU2VydmVyKEJ0U2RwT3BzUmVjb3JkKSwKLSAgICBTYXBTZXJ2ZXIoQnRTZHBTYXBSZWNvcmQpLAotICAgIERpcChCdFNkcERpcFJlY29yZCksCi19Ci0KLWltcGwgRnJvbTxiaW5kaW5nczo6Ymx1ZXRvb3RoX3NkcF9yZWNvcmQ+IGZvciBCdFNkcFJlY29yZCB7Ci0gICAgZm4gZnJvbShpdGVtOiBiaW5kaW5nczo6Ymx1ZXRvb3RoX3NkcF9yZWNvcmQpIC0+IFNlbGYgewotICAgICAgICBsZXQgc2RwX3R5cGUgPSB1bnNhZmUgeyBCdFNkcFR5cGU6OmZyb20oaXRlbS5oZHIudHlwZV8pIH07Ci0KLSAgICAgICAgbWF0Y2ggc2RwX3R5cGUgewotICAgICAgICAgICAgQnRTZHBUeXBlOjpSYXcgPT4gdW5zYWZlIHsKLSAgICAgICAgICAgICAgICBCdFNkcFJlY29yZDo6SGVhZGVyT3ZlcmxheShCdFNkcEhlYWRlck92ZXJsYXk6OmZyb20oaXRlbS5oZHIpKQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEJ0U2RwVHlwZTo6TWFwTWFzID0+IHVuc2FmZSB7IEJ0U2RwUmVjb3JkOjpNYXBNYXMoQnRTZHBNYXNSZWNvcmQ6OmZyb20oaXRlbS5tYXMpKSB9LAotICAgICAgICAgICAgQnRTZHBUeXBlOjpNYXBNbnMgPT4gdW5zYWZlIHsgQnRTZHBSZWNvcmQ6Ok1hcE1ucyhCdFNkcE1uc1JlY29yZDo6ZnJvbShpdGVtLm1ucykpIH0sCi0gICAgICAgICAgICBCdFNkcFR5cGU6OlBiYXBQc2UgPT4gdW5zYWZlIHsgQnRTZHBSZWNvcmQ6OlBiYXBQc2UoQnRTZHBQc2VSZWNvcmQ6OmZyb20oaXRlbS5wc2UpKSB9LAotICAgICAgICAgICAgQnRTZHBUeXBlOjpQYmFwUGNlID0+IHVuc2FmZSB7IEJ0U2RwUmVjb3JkOjpQYmFwUGNlKEJ0U2RwUGNlUmVjb3JkOjpmcm9tKGl0ZW0ucGNlKSkgfSwKLSAgICAgICAgICAgIEJ0U2RwVHlwZTo6T3BwU2VydmVyID0+IHVuc2FmZSB7Ci0gICAgICAgICAgICAgICAgQnRTZHBSZWNvcmQ6Ok9wcFNlcnZlcihCdFNkcE9wc1JlY29yZDo6ZnJvbShpdGVtLm9wcykpCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgQnRTZHBUeXBlOjpTYXBTZXJ2ZXIgPT4gdW5zYWZlIHsKLSAgICAgICAgICAgICAgICBCdFNkcFJlY29yZDo6U2FwU2VydmVyKEJ0U2RwU2FwUmVjb3JkOjpmcm9tKGl0ZW0uc2FwKSkKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBCdFNkcFR5cGU6OkRpcCA9PiB1bnNhZmUgeyBCdFNkcFJlY29yZDo6RGlwKEJ0U2RwRGlwUmVjb3JkOjpmcm9tKGl0ZW0uZGlwKSkgfSwKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW1wbCBCdFNkcFJlY29yZCB7Ci0gICAgZm4gY29udmVydF9oZWFkZXI8J2E+KGhkcjogJidhIG11dCBCdFNkcEhlYWRlck92ZXJsYXkpIC0+IGJpbmRpbmdzOjpibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IHsKLSAgICAgICAgYmluZGluZ3M6OmJsdWV0b290aF9zZHBfaGRyX292ZXJsYXkgewotICAgICAgICAgICAgdHlwZV86IGhkci5oZHIuc2RwX3R5cGUudG9fdTMyKCkudW53cmFwKCksCi0gICAgICAgICAgICB1dWlkOiBoZHIuaGRyLnV1aWQsCi0gICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGVuZ3RoOiBoZHIuaGRyLnNlcnZpY2VfbmFtZV9sZW5ndGgsCi0gICAgICAgICAgICBzZXJ2aWNlX25hbWU6IGhkci5oZHIuc2VydmljZV9uYW1lLmFzX211dF9wdHIoKSBhcyAqbXV0IGNfY2hhciwKLSAgICAgICAgICAgIHJmY29tbV9jaGFubmVsX251bWJlcjogaGRyLmhkci5yZmNvbW1fY2hhbm5lbF9udW1iZXIsCi0gICAgICAgICAgICBsMmNhcF9wc206IGhkci5oZHIubDJjYXBfcHNtLAotICAgICAgICAgICAgcHJvZmlsZV92ZXJzaW9uOiBoZHIuaGRyLnByb2ZpbGVfdmVyc2lvbiwKLSAgICAgICAgICAgIHVzZXIxX3B0cl9sZW46IGhkci51c2VyMV9sZW4sCi0gICAgICAgICAgICB1c2VyMV9wdHI6IGhkci51c2VyMV9kYXRhLmFzX211dF9wdHIoKSwKLSAgICAgICAgICAgIHVzZXIyX3B0cl9sZW46IGhkci51c2VyMl9sZW4sCi0gICAgICAgICAgICB1c2VyMl9wdHI6IGhkci51c2VyMl9kYXRhLmFzX211dF9wdHIoKSwKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEdldCBzZHAgcmVjb3JkIHdpdGggbGlmZXRpbWUgdGllZCB0byBzZWxmCi0gICAgZm4gZ2V0X3Vuc2FmZV9yZWNvcmQ8J2E+KCYnYSBtdXQgc2VsZikgLT4gYmluZGluZ3M6OmJsdWV0b290aF9zZHBfcmVjb3JkIHsKLSAgICAgICAgbWF0Y2ggc2VsZiB7Ci0gICAgICAgICAgICBCdFNkcFJlY29yZDo6SGVhZGVyT3ZlcmxheShyZWYgbXV0IGhkcikgPT4gewotICAgICAgICAgICAgICAgIGJpbmRpbmdzOjpibHVldG9vdGhfc2RwX3JlY29yZCB7IGhkcjogQnRTZHBSZWNvcmQ6OmNvbnZlcnRfaGVhZGVyKGhkcikgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnRTZHBSZWNvcmQ6Ok1hcE1hcyhtYXMpID0+IGJpbmRpbmdzOjpibHVldG9vdGhfc2RwX3JlY29yZCB7Ci0gICAgICAgICAgICAgICAgbWFzOiBiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfbWFzX3JlY29yZCB7Ci0gICAgICAgICAgICAgICAgICAgIGhkcjogQnRTZHBSZWNvcmQ6OmNvbnZlcnRfaGVhZGVyKCZtdXQgbWFzLmhkciksCi0gICAgICAgICAgICAgICAgICAgIG1hc19pbnN0YW5jZV9pZDogbWFzLm1hc19pbnN0YW5jZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiBtYXMuc3VwcG9ydGVkX2ZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfbWVzc2FnZV90eXBlczogbWFzLnN1cHBvcnRlZF9tZXNzYWdlX3R5cGVzLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgQnRTZHBSZWNvcmQ6Ok1hcE1ucyhtbnMpID0+IGJpbmRpbmdzOjpibHVldG9vdGhfc2RwX3JlY29yZCB7Ci0gICAgICAgICAgICAgICAgbW5zOiBiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfbW5zX3JlY29yZCB7Ci0gICAgICAgICAgICAgICAgICAgIGhkcjogQnRTZHBSZWNvcmQ6OmNvbnZlcnRfaGVhZGVyKCZtdXQgbW5zLmhkciksCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9mZWF0dXJlczogbW5zLnN1cHBvcnRlZF9mZWF0dXJlcywKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEJ0U2RwUmVjb3JkOjpQYmFwUHNlKHBzZSkgPT4gYmluZGluZ3M6OmJsdWV0b290aF9zZHBfcmVjb3JkIHsKLSAgICAgICAgICAgICAgICBwc2U6IGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9wc2VfcmVjb3JkIHsKLSAgICAgICAgICAgICAgICAgICAgaGRyOiBCdFNkcFJlY29yZDo6Y29udmVydF9oZWFkZXIoJm11dCBwc2UuaGRyKSwKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2ZlYXR1cmVzOiBwc2Uuc3VwcG9ydGVkX2ZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfcmVwb3NpdG9yaWVzOiBwc2Uuc3VwcG9ydGVkX3JlcG9zaXRvcmllcywKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEJ0U2RwUmVjb3JkOjpQYmFwUGNlKHBjZSkgPT4gYmluZGluZ3M6OmJsdWV0b290aF9zZHBfcmVjb3JkIHsKLSAgICAgICAgICAgICAgICBwY2U6IGJpbmRpbmdzOjpfYmx1ZXRvb3RoX3NkcF9wY2VfcmVjb3JkIHsKLSAgICAgICAgICAgICAgICAgICAgaGRyOiBCdFNkcFJlY29yZDo6Y29udmVydF9oZWFkZXIoJm11dCBwY2UuaGRyKSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEJ0U2RwUmVjb3JkOjpPcHBTZXJ2ZXIob3BzKSA9PiBiaW5kaW5nczo6Ymx1ZXRvb3RoX3NkcF9yZWNvcmQgewotICAgICAgICAgICAgICAgIG9wczogYmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX29wc19yZWNvcmQgewotICAgICAgICAgICAgICAgICAgICBoZHI6IEJ0U2RwUmVjb3JkOjpjb252ZXJ0X2hlYWRlcigmbXV0IG9wcy5oZHIpLAotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbjogb3BzLnN1cHBvcnRlZF9mb3JtYXRzX2xpc3RfbGVuLAotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfZm9ybWF0c19saXN0OiBvcHMuc3VwcG9ydGVkX2Zvcm1hdHNfbGlzdCwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEJ0U2RwUmVjb3JkOjpTYXBTZXJ2ZXIoc2FwKSA9PiBiaW5kaW5nczo6Ymx1ZXRvb3RoX3NkcF9yZWNvcmQgewotICAgICAgICAgICAgICAgIHNhcDogYmluZGluZ3M6Ol9ibHVldG9vdGhfc2RwX3NhcF9yZWNvcmQgewotICAgICAgICAgICAgICAgICAgICBoZHI6IEJ0U2RwUmVjb3JkOjpjb252ZXJ0X2hlYWRlcigmbXV0IHNhcC5oZHIpLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgQnRTZHBSZWNvcmQ6OkRpcChkaXApID0+IGJpbmRpbmdzOjpibHVldG9vdGhfc2RwX3JlY29yZCB7Ci0gICAgICAgICAgICAgICAgZGlwOiBiaW5kaW5nczo6X2JsdWV0b290aF9zZHBfZGlwX3JlY29yZCB7Ci0gICAgICAgICAgICAgICAgICAgIGhkcjogQnRTZHBSZWNvcmQ6OmNvbnZlcnRfaGVhZGVyKCZtdXQgZGlwLmhkciksCi0gICAgICAgICAgICAgICAgICAgIHNwZWNfaWQ6IGRpcC5zcGVjX2lkLAotICAgICAgICAgICAgICAgICAgICB2ZW5kb3I6IGRpcC52ZW5kb3IsCi0gICAgICAgICAgICAgICAgICAgIHZlbmRvcl9pZF9zb3VyY2U6IGRpcC52ZW5kb3JfaWRfc291cmNlLAotICAgICAgICAgICAgICAgICAgICBwcm9kdWN0OiBkaXAucHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogZGlwLnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlfcmVjb3JkOiBkaXAucHJpbWFyeV9yZWNvcmQsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNbZGVyaXZlKERlYnVnKV0KLXB1YiBlbnVtIFNkcENhbGxiYWNrcyB7Ci0gICAgU2RwU2VhcmNoKEJ0U3RhdHVzLCBSYXdBZGRyZXNzLCBVdWlkLCBpMzIsIFZlYzxCdFNkcFJlY29yZD4pLAotfQotCi1wdWIgc3RydWN0IFNkcENhbGxiYWNrc0Rpc3BhdGNoZXIgewotICAgIHB1YiBkaXNwYXRjaDogQm94PGR5biBGbihTZHBDYWxsYmFja3MpICsgU2VuZD4sCi19Ci0KLXR5cGUgU2RwQ2IgPSBBcmM8TXV0ZXg8U2RwQ2FsbGJhY2tzRGlzcGF0Y2hlcj4+OwotCi1jYl92YXJpYW50IShTZHBDYiwgc2RwX3NlYXJjaF9jYiAtPiBTZHBDYWxsYmFja3M6OlNkcFNlYXJjaCwKLWJpbmRpbmdzOjpidF9zdGF0dXNfdCAtPiBCdFN0YXR1cywKLSpjb25zdCBGZmlBZGRyZXNzLCAqY29uc3QgVXVpZCwgaTMyLAotKm11dCBiaW5kaW5nczo6Ymx1ZXRvb3RoX3NkcF9yZWNvcmQsIHsKLSAgICBsZXQgXzEgPSB1bnNhZmUgeyBkZXJlZl9jb25zdF9mZmlfYWRkcmVzcyEoXzEpIH07Ci0gICAgbGV0IF8yID0gdW5zYWZlIHsgKl8yIH07Ci0gICAgbGV0IF80ID0gcHRyX3RvX3ZlYyhfNCwgXzMgYXMgdXNpemUpOwotfSk7Ci0KLXN0cnVjdCBSYXdTZHBXcmFwcGVyIHsKLSAgICBwdWIgcmF3OiAqY29uc3QgYmluZGluZ3M6OmJ0c2RwX2ludGVyZmFjZV90LAotfQotCi11bnNhZmUgaW1wbCBTZW5kIGZvciBSYXdTZHBXcmFwcGVyIHt9Ci0KLXB1YiBzdHJ1Y3QgU2RwIHsKLSAgICBpbnRlcm5hbDogUmF3U2RwV3JhcHBlciwKLSAgICBpc19pbml0OiBib29sLAotICAgIGNhbGxiYWNrczogT3B0aW9uPEJveDxiaW5kaW5nczo6YnRzZHBfY2FsbGJhY2tzX3Q+PiwKLX0KLQotaW1wbCBTZHAgewotICAgIHB1YiBmbiBuZXcoaW50ZjogJkJsdWV0b290aEludGVyZmFjZSkgLT4gU2RwIHsKLSAgICAgICAgbGV0IHIgPSBpbnRmLmdldF9wcm9maWxlX2ludGVyZmFjZShTdXBwb3J0ZWRQcm9maWxlczo6U2RwKTsKLSAgICAgICAgU2RwIHsKLSAgICAgICAgICAgIGludGVybmFsOiBSYXdTZHBXcmFwcGVyIHsgcmF3OiByIGFzICpjb25zdCBiaW5kaW5nczo6YnRzZHBfaW50ZXJmYWNlX3QgfSwKLSAgICAgICAgICAgIGlzX2luaXQ6IGZhbHNlLAotICAgICAgICAgICAgY2FsbGJhY2tzOiBOb25lLAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHViIGZuIGlzX2luaXRpYWxpemVkKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5pc19pbml0Ci0gICAgfQotCi0gICAgcHViIGZuIGluaXRpYWxpemUoJm11dCBzZWxmLCBjYWxsYmFja3M6IFNkcENhbGxiYWNrc0Rpc3BhdGNoZXIpIC0+IGJvb2wgewotICAgICAgICBpZiBnZXRfZGlzcGF0Y2hlcnMoKS5sb2NrKCkudW53cmFwKCkuc2V0Ojo8U2RwQ2I+KEFyYzo6bmV3KE11dGV4OjpuZXcoY2FsbGJhY2tzKSkpIHsKLSAgICAgICAgICAgIHBhbmljISgiVHJpZWQgdG8gc2V0IGRpc3BhdGNoZXIgZm9yIFNkcENhbGxiYWNrcyBidXQgaXQgYWxyZWFkeSBleGlzdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXQgbXV0IGNhbGxiYWNrcyA9IEJveDo6bmV3KGJpbmRpbmdzOjpidHNkcF9jYWxsYmFja3NfdCB7Ci0gICAgICAgICAgICBzaXplOiAyICogOCwKLSAgICAgICAgICAgIHNkcF9zZWFyY2hfY2I6IFNvbWUoc2RwX3NlYXJjaF9jYiksCi0gICAgICAgIH0pOwotCi0gICAgICAgIGxldCByYXdjYiA9ICZtdXQgKmNhbGxiYWNrczsKLQotICAgICAgICBsZXQgaW5pdCA9IGNjYWxsIShzZWxmLCBpbml0LCByYXdjYik7Ci0gICAgICAgIHNlbGYuaXNfaW5pdCA9IEJ0U3RhdHVzOjpmcm9tKGluaXQpID09IEJ0U3RhdHVzOjpTdWNjZXNzOwotICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFNvbWUoY2FsbGJhY2tzKTsKLQotICAgICAgICByZXR1cm4gc2VsZi5pc19pbml0OwotICAgIH0KLQotICAgIHB1YiBmbiBzZHBfc2VhcmNoKCZzZWxmLCBhZGRyZXNzOiAmbXV0IFJhd0FkZHJlc3MsIHV1aWQ6ICZVdWlkKSAtPiBCdFN0YXR1cyB7Ci0gICAgICAgIGxldCBmZmlfYWRkciA9IGNhc3RfdG9fZmZpX2FkZHJlc3MhKGFkZHJlc3MgYXMgKm11dCBSYXdBZGRyZXNzKTsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIHNkcF9zZWFyY2gsIGZmaV9hZGRyLCB1dWlkKSkKLSAgICB9Ci0KLSAgICBwdWIgZm4gY3JlYXRlX3NkcF9yZWNvcmQoJnNlbGYsIHJlY29yZDogJm11dCBCdFNkcFJlY29yZCwgaGFuZGxlOiAmbXV0IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBsZXQgbXV0IGNvbnZlcnRlZCA9IHJlY29yZC5nZXRfdW5zYWZlX3JlY29yZCgpOwotICAgICAgICBsZXQgcHRyID0gKCZtdXQgY29udmVydGVkKSBhcyAqbXV0IGJpbmRpbmdzOjpibHVldG9vdGhfc2RwX3JlY29yZDsKLSAgICAgICAgQnRTdGF0dXM6OmZyb20oY2NhbGwhKHNlbGYsIGNyZWF0ZV9zZHBfcmVjb3JkLCBwdHIsIGhhbmRsZSkpCi0gICAgfQotCi0gICAgcHViIGZuIHJlbW92ZV9zZHBfcmVjb3JkKCZzZWxmLCBoYW5kbGU6IGkzMikgLT4gQnRTdGF0dXMgewotICAgICAgICBCdFN0YXR1czo6ZnJvbShjY2FsbCEoc2VsZiwgcmVtb3ZlX3NkcF9yZWNvcmQsIGhhbmRsZSkpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2QvcnVzdC90b3BzaGltL3NyYy90b3BzdGFjay5ycyBiL2dkL3J1c3QvdG9wc2hpbS9zcmMvdG9wc3RhY2sucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTM4NjMuLjAwMDAwMDAKLS0tIGEvZ2QvcnVzdC90b3BzaGltL3NyYy90b3BzdGFjay5ycworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vISBTdGFjayBvbiB0b3Agb2YgdGhlIEJsdWV0b290aCBpbnRlcmZhY2Ugc2hpbQotLy8hCi0vLyEgSGVscGVycyBmb3IgZGVhbGluZyB3aXRoIHRoZSBzdGFjayBvbiB0b3Agb2YgdGhlIEJsdWV0b290aCBpbnRlcmZhY2UuCi0KLXVzZSBzdGQ6OmFueTo6e0FueSwgVHlwZUlkfTsKLXVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwotdXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OwotdXNlIHRva2lvOjpydW50aW1lOjp7QnVpbGRlciwgUnVudGltZX07Ci0KLWxhenlfc3RhdGljISB7Ci0gICAgLy8gU2hhcmVkIHJ1bnRpbWUgZm9yIHRvcHNoaW0gaGFuZGxlcnMuIEFsbCBhc3luYyB0YXNrcyB3aWxsIGdldCBydW4gYnkgdGhpcwotICAgIC8vIHJ1bnRpbWUgYW5kIHRoaXMgd2lsbCBwcm9wZXJseSBzZXJpYWxpemUgYWxsIHNwYXduZWQgdGFza3MuCi0gICAgcHViIHN0YXRpYyByZWYgUlVOVElNRTogQXJjPFJ1bnRpbWU+ID0gQXJjOjpuZXcoCi0gICAgICAgIEJ1aWxkZXI6Om5ld19tdWx0aV90aHJlYWQoKQotICAgICAgICAgICAgLndvcmtlcl90aHJlYWRzKDEpCi0gICAgICAgICAgICAubWF4X2Jsb2NraW5nX3RocmVhZHMoMSkKLSAgICAgICAgICAgIC5lbmFibGVfYWxsKCkKLSAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAudW53cmFwKCkKLSAgICApOwotfQotCi1wdWIgZm4gZ2V0X3J1bnRpbWUoKSAtPiBBcmM8UnVudGltZT4gewotICAgIFJVTlRJTUUuY2xvbmUoKQotfQotCi1sYXp5X3N0YXRpYyEgewotICAgIHN0YXRpYyByZWYgQ0JfRElTUEFUQ0hFUjogQXJjPE11dGV4PERpc3BhdGNoQ29udGFpbmVyPj4gPQotICAgICAgICBBcmM6Om5ldyhNdXRleDo6bmV3KERpc3BhdGNoQ29udGFpbmVyIHsgaW5zdGFuY2VzOiBIYXNoTWFwOjpuZXcoKSB9KSk7Ci19Ci0KLXR5cGUgSW5zdGFuY2VCb3ggPSBCb3g8ZHluIEFueSArIFNlbmQgKyBTeW5jPjsKLQotcHViIHN0cnVjdCBEaXNwYXRjaENvbnRhaW5lciB7Ci0gICAgaW5zdGFuY2VzOiBIYXNoTWFwPFR5cGVJZCwgSW5zdGFuY2VCb3g+LAotfQotCi1pbXBsIERpc3BhdGNoQ29udGFpbmVyIHsKLSAgICBwdWIgZm4gZ2V0PFQ6ICdzdGF0aWMgKyBDbG9uZSArIFNlbmQgKyBTeW5jPigmc2VsZikgLT4gT3B0aW9uPFQ+IHsKLSAgICAgICAgbGV0IHR5cGVpZCA9IFR5cGVJZDo6b2Y6OjxUPigpOwotCi0gICAgICAgIGlmIGxldCBTb21lKHZhbHVlKSA9IHNlbGYuaW5zdGFuY2VzLmdldCgmdHlwZWlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gU29tZSh2YWx1ZS5kb3duY2FzdF9yZWY6OjxUPigpLnVud3JhcCgpLmNsb25lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9uZQotICAgIH0KLQotICAgIHB1YiBmbiBzZXQ8VDogJ3N0YXRpYyArIENsb25lICsgU2VuZCArIFN5bmM+KCZtdXQgc2VsZiwgb2JqOiBUKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5pbnN0YW5jZXMuaW5zZXJ0KFR5cGVJZDo6b2Y6OjxUPigpLCBCb3g6Om5ldyhvYmopKS5pc19zb21lKCkKLSAgICB9Ci19Ci0KLXB1YiBmbiBnZXRfZGlzcGF0Y2hlcnMoKSAtPiBBcmM8TXV0ZXg8RGlzcGF0Y2hDb250YWluZXI+PiB7Ci0gICAgQ0JfRElTUEFUQ0hFUi5jbG9uZSgpCi19CmRpZmYgLS1naXQgYS9nZC9ydXN0L3RvcHNoaW0vdGVzdHMvYmRhZGRyLnJzIGIvZ2QvcnVzdC90b3BzaGltL3Rlc3RzL2JkYWRkci5ycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMjBlZS4uMDAwMDAwMAotLS0gYS9nZC9ydXN0L3RvcHNoaW0vdGVzdHMvYmRhZGRyLnJzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI1tjZmcodGVzdCldCi1tb2QgdGVzdHMgewotICAgIHVzZSBidF90b3BzaGltOjpidGlmOjpSYXdBZGRyZXNzOwotCi0gICAgI1t0ZXN0XQotICAgIGZuIGZyb21fc3RyaW5nX2ludmFsaWQoKSB7Ci0gICAgICAgIGFzc2VydCEoUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoIiIpLmlzX25vbmUoKSk7Ci0gICAgICAgIGFzc2VydCEoUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoInNvbWUgaW52YWxpZCBzdHJpbmciKS5pc19ub25lKCkpOwotICAgICAgICBhc3NlcnQhKFJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKCJhYTpiYjpjYzpkZDplZTpmZjowMCIpLmlzX25vbmUoKSk7Ci0gICAgICAgIGFzc2VydCEoUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoImFhOmJiOmNjOmRkOmVlIikuaXNfbm9uZSgpKTsKLSAgICAgICAgYXNzZXJ0IShSYXdBZGRyZXNzOjpmcm9tX3N0cmluZygiYWE6YmI6Y2M6ZGQ6OmZmIikuaXNfbm9uZSgpKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gZnJvbV9zdHJpbmdfdmFsaWQoKSB7Ci0gICAgICAgIGxldCBhZGRyID0gUmF3QWRkcmVzczo6ZnJvbV9zdHJpbmcoIjExOjIyOjMzOmFhOmJiOmNjIik7Ci0gICAgICAgIGFzc2VydCEoYWRkci5pc19zb21lKCkpOwotICAgICAgICBhc3NlcnRfZXEhKFsweDExLCAweDIyLCAweDMzLCAweGFhLCAweGJiLCAweGNjXSwgYWRkci51bndyYXAoKS50b19ieXRlX2FycigpKTsKLQotICAgICAgICAvLyBVcHBlci9sb3dlciBjYXNlIHNob3VsZCBub3QgbWF0dGVyLgotICAgICAgICBsZXQgYWRkciA9IFJhd0FkZHJlc3M6OmZyb21fc3RyaW5nKCIxMToyMjozMzpBQTpCQjpDQyIpOwotICAgICAgICBhc3NlcnQhKGFkZHIuaXNfc29tZSgpKTsKLSAgICAgICAgYXNzZXJ0X2VxIShbMHgxMSwgMHgyMiwgMHgzMywgMHhhYSwgMHhiYiwgMHhjY10sIGFkZHIudW53cmFwKCkudG9fYnl0ZV9hcnIoKSk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIGZyb21fYnl0ZXNfaW52YWxpZCgpIHsKLSAgICAgICAgYXNzZXJ0IShSYXdBZGRyZXNzOjpmcm9tX2J5dGVzKCZ2ZWMhW10pLmlzX25vbmUoKSk7Ci0gICAgICAgIGFzc2VydCEoUmF3QWRkcmVzczo6ZnJvbV9ieXRlcygmdmVjIVsxLCAyLCAzLCA0LCA1XSkuaXNfbm9uZSgpKTsKLSAgICAgICAgYXNzZXJ0IShSYXdBZGRyZXNzOjpmcm9tX2J5dGVzKCZ2ZWMhWzEsIDIsIDMsIDQsIDUsIDYsIDddKS5pc19ub25lKCkpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiBmcm9tX2J5dGVzX3ZhbGlkKCkgewotICAgICAgICBsZXQgYWRkciA9IFJhd0FkZHJlc3M6OmZyb21fYnl0ZXMoJnZlYyFbMSwgMiwgMywgNCwgNSwgNl0pOwotICAgICAgICBhc3NlcnQhKGFkZHIuaXNfc29tZSgpKTsKLSAgICAgICAgYXNzZXJ0X2VxIShbMSwgMiwgMywgNCwgNSwgNl0sIGFkZHIudW53cmFwKCkudG9fYnl0ZV9hcnIoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvQW5kcm9pZC5icCBiL2dkL3NlY3VyaXR5L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWIyYjkuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFNlY3VyaXR5U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiZWNjL211bHRwcmVjaXNpb24uY2MiLAotICAgICAgICAiZWNjL3BfMjU2X2VjY19wcC5jYyIsCi0gICAgICAgICJlY2RoX2tleXMuY2MiLAotICAgICAgICAiZmFjYWRlX2NvbmZpZ3VyYXRpb25fYXBpLmNjIiwKLSAgICAgICAgImwyY2FwX3NlY3VyaXR5X21vZHVsZV9pbnRlcmZhY2UuY2MiLAotICAgICAgICAicGFpcmluZ19oYW5kbGVyX2xlLmNjIiwKLSAgICAgICAgInBhaXJpbmdfaGFuZGxlcl9sZV9sZWdhY3kuY2MiLAotICAgICAgICAicGFpcmluZ19oYW5kbGVyX2xlX3NlY3VyZV9jb25uZWN0aW9ucy5jYyIsCi0gICAgICAgICJzZWN1cml0eV9tYW5hZ2VyLmNjIiwKLSAgICAgICAgImludGVybmFsL3NlY3VyaXR5X21hbmFnZXJfaW1wbC5jYyIsCi0gICAgICAgICJzZWN1cml0eV9tb2R1bGUuY2MiLAotICAgICAgICAiOkJsdWV0b290aFNlY3VyaXR5Q2hhbm5lbFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFNlY3VyaXR5UGFpcmluZ1NvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFNlY3VyaXR5UmVjb3JkU291cmNlcyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoU2VjdXJpdHlVbml0VGVzdFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImVjYy9tdWx0aXBvaW50X3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9lY2RoX2tleXNfdGVzdC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoU2VjdXJpdHlUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAicGFpcmluZ19oYW5kbGVyX2xlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvZmFrZV9sMmNhcF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvcGFpcmluZ19oYW5kbGVyX2xlX3BhaXJfdGVzdC5jYyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoU2VjdXJpdHlDaGFubmVsVGVzdFNvdXJjZXMiLAotICAgICAgICAiOkJsdWV0b290aFNlY3VyaXR5UGFpcmluZ1Rlc3RTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhTZWN1cml0eVJlY29yZFRlc3RTb3VyY2VzIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgICBuYW1lOiAiQmx1ZXRvb3RoRmFjYWRlX3NlY3VyaXR5X2xheWVyIiwKLSAgICAgc3JjczogWwotICAgICAgICAgImZhY2FkZS5jYyIsCi0gICAgIF0sCi19CmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9CVUlMRC5nbiBiL2dkL3NlY3VyaXR5L0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjgwMzExLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXNvdXJjZV9zZXQoIkJsdWV0b290aFNlY3VyaXR5Q2hhbm5lbFNvdXJjZXMiKSB7Ci0gIHNvdXJjZXMgPSBbICJjaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbC5jYyIgXQotICBjb25maWdzICs9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdHMiIF0KLSAgZGVwcyA9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdF9kZXBzIiBdCi19Ci0KLXNvdXJjZV9zZXQoIkJsdWV0b290aFNlY3VyaXR5UGFpcmluZ1NvdXJjZXMiKSB7Ci0gIHNvdXJjZXMgPSBbICJwYWlyaW5nL2NsYXNzaWNfcGFpcmluZ19oYW5kbGVyLmNjIiBdCi0gIGNvbmZpZ3MgKz0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotICBkZXBzID0gWyAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiIF0KLX0KLQotc291cmNlX3NldCgiQmx1ZXRvb3RoU2VjdXJpdHlSZWNvcmRTb3VyY2VzIikgewotICBzb3VyY2VzID0gWyAicmVjb3JkL3NlY3VyaXR5X3JlY29yZF9zdG9yYWdlLmNjIiBdCi0gIGNvbmZpZ3MgKz0gWyAiLy9idC9nZDpnZF9kZWZhdWx0cyIgXQotICBkZXBzID0gWyAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiIF0KLX0KLQotc291cmNlX3NldCgiQmx1ZXRvb3RoU2VjdXJpdHlTb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJlY2MvbXVsdHByZWNpc2lvbi5jYyIsCi0gICAgImVjYy9wXzI1Nl9lY2NfcHAuY2MiLAotICAgICJlY2RoX2tleXMuY2MiLAotICAgICJmYWNhZGVfY29uZmlndXJhdGlvbl9hcGkuY2MiLAotICAgICJpbnRlcm5hbC9zZWN1cml0eV9tYW5hZ2VyX2ltcGwuY2MiLAotICAgICJsMmNhcF9zZWN1cml0eV9tb2R1bGVfaW50ZXJmYWNlLmNjIiwKLSAgICAicGFpcmluZ19oYW5kbGVyX2xlLmNjIiwKLSAgICAicGFpcmluZ19oYW5kbGVyX2xlX2xlZ2FjeS5jYyIsCi0gICAgInBhaXJpbmdfaGFuZGxlcl9sZV9zZWN1cmVfY29ubmVjdGlvbnMuY2MiLAotICAgICJzZWN1cml0eV9tYW5hZ2VyLmNjIiwKLSAgICAic2VjdXJpdHlfbW9kdWxlLmNjIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIjpCbHVldG9vdGhTZWN1cml0eUNoYW5uZWxTb3VyY2VzIiwKLSAgICAiOkJsdWV0b290aFNlY3VyaXR5UGFpcmluZ1NvdXJjZXMiLAotICAgICI6Qmx1ZXRvb3RoU2VjdXJpdHlSZWNvcmRTb3VyY2VzIiwKLSAgICAiLy9idC9nZDpnZF9kZWZhdWx0X2RlcHMiLAotICBdCi0KLSAgY29uZmlncyArPSBbICIvL2J0L2dkOmdkX2RlZmF1bHRzIiBdCi19CmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9jZXJ0L2NlcnRfc2VjdXJpdHkucHkgYi9nZC9zZWN1cml0eS9jZXJ0L2NlcnRfc2VjdXJpdHkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2ZkYWIuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvY2VydC9jZXJ0X3NlY3VyaXR5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGxvZ2dpbmcKLQotZnJvbSBibHVldG9vdGhfcGFja2V0c19weXRob24zIGltcG9ydCBoY2lfcGFja2V0cwotZnJvbSBjZXJ0LmNhcHR1cmVzIGltcG9ydCBIY2lDYXB0dXJlcwotZnJvbSBjZXJ0LmNsb3NhYmxlIGltcG9ydCBzYWZlQ2xvc2UKLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQubWF0Y2hlcnMgaW1wb3J0IEhjaU1hdGNoZXJzCi1mcm9tIGNlcnQucHlfaGNpIGltcG9ydCBQeUhjaQotZnJvbSBjZXJ0LnB5X3NlY3VyaXR5IGltcG9ydCBQeVNlY3VyaXR5Ci1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi1mcm9tIGwyY2FwLmNsYXNzaWMgaW1wb3J0IGZhY2FkZV9wYjIgYXMgbDJjYXBfZmFjYWRlCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IElvQ2FwYWJpbGl0aWVzCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzCi1mcm9tIHNlY3VyaXR5LmZhY2FkZV9wYjIgaW1wb3J0IE9vYkRhdGFQcmVzZW50Ci0KLQotY2xhc3MgQ2VydFNlY3VyaXR5KFB5U2VjdXJpdHkpOgotICAgICIiIgotICAgICAgICBDb250YWluIGFsbCBvZiB0aGUgY2VydGlmaWNhdGlvbiBzdGFjayBsb2dpYyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nCi0gICAgICAgIEhDSSBjb21tYW5kcyBmb2xsb3dpbmcgdGhlIENsYXNzaWMgUGFpcmluZyBmbG93cy4KLSAgICAiIiIKLSAgICBfaW9fY2FwX2xvb2t1cCA9IHsKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuRElTUExBWV9PTkxZOiBoY2lfcGFja2V0cy5Jb0NhcGFiaWxpdHkuRElTUExBWV9PTkxZLAotICAgICAgICBJb0NhcGFiaWxpdGllcy5ESVNQTEFZX1lFU19OT19JT19DQVA6IGhjaV9wYWNrZXRzLklvQ2FwYWJpbGl0eS5ESVNQTEFZX1lFU19OTywKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuS0VZQk9BUkRfT05MWTogaGNpX3BhY2tldHMuSW9DYXBhYmlsaXR5LktFWUJPQVJEX09OTFksCi0gICAgICAgIElvQ2FwYWJpbGl0aWVzLk5PX0lOUFVUX05PX09VVFBVVDogaGNpX3BhY2tldHMuSW9DYXBhYmlsaXR5Lk5PX0lOUFVUX05PX09VVFBVVCwKLSAgICB9Ci0KLSAgICBfYXV0aF9yZXFfbG9va3VwID0gewotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5OT19CT05ESU5HOgotICAgICAgICBoY2lfcGFja2V0cy5BdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5OT19CT05ESU5HLAotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5OT19CT05ESU5HX01JVE1fUFJPVEVDVElPTjoKLSAgICAgICAgaGNpX3BhY2tldHMuQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuTk9fQk9ORElOR19NSVRNX1BST1RFQ1RJT04sCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HOgotICAgICAgICBoY2lfcGFja2V0cy5BdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElORywKLSAgICAgICAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuREVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOgotICAgICAgICBoY2lfcGFja2V0cy5BdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04sCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkdFTkVSQUxfQk9ORElORzoKLSAgICAgICAgaGNpX3BhY2tldHMuQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuR0VORVJBTF9CT05ESU5HLAotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5HRU5FUkFMX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOgotICAgICAgICBoY2lfcGFja2V0cy5BdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5HRU5FUkFMX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OLAotICAgIH0KLQotICAgIF9vb2JfcHJlc2VudF9sb29rdXAgPSB7Ci0gICAgICAgIE9vYkRhdGFQcmVzZW50Lk5PVF9QUkVTRU5UOiBoY2lfcGFja2V0cy5Pb2JEYXRhUHJlc2VudC5OT1RfUFJFU0VOVCwKLSAgICAgICAgT29iRGF0YVByZXNlbnQuUDE5Ml9QUkVTRU5UOiBoY2lfcGFja2V0cy5Pb2JEYXRhUHJlc2VudC5QXzE5Ml9QUkVTRU5ULAotICAgICAgICBPb2JEYXRhUHJlc2VudC5QMjU2X1BSRVNFTlQ6IGhjaV9wYWNrZXRzLk9vYkRhdGFQcmVzZW50LlBfMjU2X1BSRVNFTlQsCi0gICAgICAgIE9vYkRhdGFQcmVzZW50LlAxOTJfQU5EXzI1Nl9QUkVTRU5UOiBoY2lfcGFja2V0cy5Pb2JEYXRhUHJlc2VudC5QXzE5Ml9BTkRfMjU2X1BSRVNFTlQsCi0gICAgfQotCi0gICAgX2hjaV9ldmVudF9zdHJlYW0gPSBOb25lCi0gICAgX2lvX2NhcHMgPSBoY2lfcGFja2V0cy5Jb0NhcGFiaWxpdHkuRElTUExBWV9PTkxZCi0gICAgX2F1dGhfcmVxcyA9IGhjaV9wYWNrZXRzLkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HX01JVE1fUFJPVEVDVElPTgotICAgIF9zZWN1cmVfY29ubmVjdGlvbnNfZW5hYmxlZCA9IEZhbHNlCi0KLSAgICBfaGNpID0gTm9uZQotCi0gICAgTUFYX1BJTl9MRU5HVEggPSAxNgotICAgIE1JTl9QSU5fTEVOR1RIID0gMQotCi0gICAgZGVmIF9lbnF1ZXVlX2hjaV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIGV4cGVjdF9jb21wbGV0ZSk6Ci0gICAgICAgIGlmIChleHBlY3RfY29tcGxldGUpOgotICAgICAgICAgICAgc2VsZi5faGNpLnNlbmRfY29tbWFuZChjb21tYW5kKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5faGNpLnNlbmRfY29tbWFuZChjb21tYW5kKQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldmljZSk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgRG9uJ3QgY2FsbCBzdXBlciBiL2MgdGhlIGdSUEMgc3RyZWFtIHNldHVwIHdpbGwgY3Jhc2ggdGVzdAotICAgICAgICAiIiIKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBJbml0IikKLSAgICAgICAgc2VsZi5fZGV2aWNlID0gZGV2aWNlCi0gICAgICAgIHNlbGYuX2RldmljZS53YWl0X2NoYW5uZWxfcmVhZHkoKQotICAgICAgICBzZWxmLl9oY2kgPSBQeUhjaShkZXZpY2UpCi0gICAgICAgIHNlbGYuX2hjaS5yZWdpc3Rlcl9mb3JfZXZlbnRzKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuRXZlbnRDb2RlLkVOQ1JZUFRJT05fQ0hBTkdFLCBoY2lfcGFja2V0cy5FdmVudENvZGUuQ0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVlfQ09NUExFVEUsCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuQ0VOVFJBTF9MSU5LX0tFWV9DT01QTEVURSwgaGNpX3BhY2tldHMuRXZlbnRDb2RlLlJFVFVSTl9MSU5LX0tFWVMsCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuUElOX0NPREVfUkVRVUVTVCwgaGNpX3BhY2tldHMuRXZlbnRDb2RlLkxJTktfS0VZX1JFUVVFU1QsCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuTElOS19LRVlfTk9USUZJQ0FUSU9OLCBoY2lfcGFja2V0cy5FdmVudENvZGUuRU5DUllQVElPTl9LRVlfUkVGUkVTSF9DT01QTEVURSwKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5JT19DQVBBQklMSVRZX1JFUVVFU1QsIGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5JT19DQVBBQklMSVRZX1JFU1BPTlNFLAotICAgICAgICAgICAgaGNpX3BhY2tldHMuRXZlbnRDb2RlLlJFTU9URV9PT0JfREFUQV9SRVFVRVNULCBoY2lfcGFja2V0cy5FdmVudENvZGUuU0lNUExFX1BBSVJJTkdfQ09NUExFVEUsCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuVVNFUl9QQVNTS0VZX05PVElGSUNBVElPTiwgaGNpX3BhY2tldHMuRXZlbnRDb2RlLktFWVBSRVNTX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLkV2ZW50Q29kZS5VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNULCBoY2lfcGFja2V0cy5FdmVudENvZGUuVVNFUl9QQVNTS0VZX1JFUVVFU1QsCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5FdmVudENvZGUuUkVNT1RFX0hPU1RfU1VQUE9SVEVEX0ZFQVRVUkVTX05PVElGSUNBVElPTikKLSAgICAgICAgc2VsZi5faGNpX2V2ZW50X3N0cmVhbSA9IHNlbGYuX2hjaS5nZXRfZXZlbnRfc3RyZWFtKCkKLQotICAgIGRlZiBjcmVhdGVfYm9uZChzZWxmLCBhZGRyZXNzLCB0eXBlKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBDcmVhdGVzIGEgYm9uZCBmcm9tIHRoZSBjZXJ0IHBlcnNwZWN0aXZlCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IENyZWF0aW5nIGJvbmQgdG8gJyVzJyBmcm9tICclcyciICUgKHN0cihhZGRyZXNzKSwgc3RyKHNlbGYuX2RldmljZS5hZGRyZXNzKSkpCi0gICAgICAgICMgVE9ETyhvcHRlZG9ibGl2aW9uKTogVHJpZ2dlciBjb25uZWN0aW9uIHRvIFNlbmQgQXV0aGVudGljYXRpb25SZXF1ZXN0ZWQKLQotICAgIGRlZiByZW1vdmVfYm9uZChzZWxmLCBhZGRyZXNzLCB0eXBlKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBXZSBzdG9yZSB0aGUgbGluayBrZXkgbG9jYWxseSBpbiB0aGUgdGVzdCBhbmQgcHJldGVuZAotICAgICAgICAgICAgU28gdG8gcmVtb3ZlX2JvbmQgd2UgbmVlZCB0byBSZW1vdmUgdGhlICJzdG9yZWQiIGRhdGEKLSAgICAgICAgIiIiCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBzZXRfaW9fY2FwYWJpbGl0aWVzKHNlbGYsIGlvX2NhcGFiaWxpdGllcyk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgU2V0IHRoZSBJTyBDYXBhYmlsaXRpZXMgdXNlZCBmb3IgdGhlIGNlcnQKLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogc2V0dGluZyBJTyBDYXBhYmlsaXRpZXMgZGF0YSB0byAnJXMnIiAlIHNlbGYuX2lvX2NhcGFiaWxpdGllc19uYW1lX2xvb2t1cC5nZXQoCi0gICAgICAgICAgICBpb19jYXBhYmlsaXRpZXMsICJFUlJPUiIpKQotICAgICAgICBzZWxmLl9pb19jYXBzID0gc2VsZi5faW9fY2FwX2xvb2t1cC5nZXQoaW9fY2FwYWJpbGl0aWVzLCBoY2lfcGFja2V0cy5Jb0NhcGFiaWxpdHkuRElTUExBWV9PTkxZKQotCi0gICAgZGVmIHNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoc2VsZiwgYXV0aF9yZXFzKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBFc3RhYmxpc2ggYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGUgc3RhY2sKLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogc2V0dGluZyBBdXRoZW50aWNhdGlvbiBSZXF1aXJlbWVudHMgZGF0YSB0byAnJXMnIiAlIHNlbGYuX2F1dGhfcmVxc19uYW1lX2xvb2t1cC5nZXQoCi0gICAgICAgICAgICBhdXRoX3JlcXMsICJFUlJPUiIpKQotICAgICAgICBzZWxmLl9hdXRoX3JlcXMgPSBzZWxmLl9hdXRoX3JlcV9sb29rdXAuZ2V0KGF1dGhfcmVxcywgaGNpX3BhY2tldHMuQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuR0VORVJBTF9CT05ESU5HKQotCi0gICAgZGVmIGdldF9vb2JfZGF0YV9mcm9tX2NvbnRyb2xsZXIoc2VsZiwgcGJfb29iX2RhdGFfdHlwZSk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgR2V0IHRoZSBPdXQtb2YtYmFuZCBkYXRhIGZvciBTU1AgcGFpcmluZwotCi0gICAgICAgICAgICA6cGFyYW0gcGJfb29iX2RhdGFfdHlwZTogVHlwZSBvZiBkYXRhIG5lZWRlZAotICAgICAgICAgICAgOnJldHVybjogYSB0dXBsZSBvZiBieXRlcyAoMTkyYywxOTJyLDI1NmMsMjU2cikgd2l0aCBpbmNyZWFzaW5nIHNlY3VyaXR5OyBieXRlcyBtYXkgYmUgYWxsIDBzIGRlcGVuZGluZyBvbiBwYl9vb2JfZGF0YV90eXBlIHZhbHVlCi0KLSAgICAgICAgIiIiCi0gICAgICAgIG9vYl9kYXRhX3R5cGUgPSBzZWxmLl9vb2JfcHJlc2VudF9sb29rdXBbcGJfb29iX2RhdGFfdHlwZV0KLQotICAgICAgICBpZiAob29iX2RhdGFfdHlwZSA9PSBoY2lfcGFja2V0cy5Pb2JEYXRhUHJlc2VudC5OT1RfUFJFU0VOVCk6Ci0gICAgICAgICAgICBsb2dnaW5nLndhcm4oIk5vIGRhdGEgcHJlc2VudCwgbm8gbmVlZCB0byBjYWxsIGdldF9vb2JfZGF0YSIpCi0gICAgICAgICAgICByZXR1cm4gKFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0sIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0sIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0sCi0gICAgICAgICAgICAgICAgICAgIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0pCi0KLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBSZXF1ZXN0aW5nIE9PQiBkYXRhIikKLSAgICAgICAgaWYgb29iX2RhdGFfdHlwZSA9PSBoY2lfcGFja2V0cy5Pb2JEYXRhUHJlc2VudC5QXzE5Ml9QUkVTRU5UOgotICAgICAgICAgICAgIyBJZiBob3N0IGFuZCBjb250cm9sbGVyIHN1cHBvcnRzIHNlY3VyZSBjb25uZWN0aW9ucyB3ZSBhbHdheXMgdXNlZCBSZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFSZXF1ZXN0Ci0gICAgICAgICAgICBpZiBzZWxmLl9zZWN1cmVfY29ubmVjdGlvbnNfZW5hYmxlZDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFJlcXVlc3RpbmcgUDE5MiBEYXRhOyBzZWN1cmUgY29ubmVjdGlvbnMiKQotICAgICAgICAgICAgICAgIGNvbXBsZXRlX2NhcHR1cmUgPSBIY2lDYXB0dXJlcy5SZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFDb21wbGV0ZUNhcHR1cmUoKQotICAgICAgICAgICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhQnVpbGRlcigpLCBUcnVlKQotICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogV2FpdGluZyBmb3IgT09CIHJlc3BvbnNlIGZyb20gY29udHJvbGxlciIpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9oY2lfZXZlbnRfc3RyZWFtKS5lbWl0cyhjb21wbGV0ZV9jYXB0dXJlKQotICAgICAgICAgICAgICAgIGNvbW1hbmRfY29tcGxldGUgPSBjb21wbGV0ZV9jYXB0dXJlLmdldCgpCi0gICAgICAgICAgICAgICAgY29tcGxldGUgPSBoY2lfcGFja2V0cy5SZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFDb21wbGV0ZVZpZXcoY29tbWFuZF9jb21wbGV0ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxpc3QoY29tcGxldGUuR2V0QzE5MigpKSwgbGlzdChjb21wbGV0ZS5HZXRSMTkyKCkpLCBbMCBmb3IgaSBpbiByYW5nZSgwLCAxNildLAotICAgICAgICAgICAgICAgICAgICAgICAgWzAgZm9yIGkgaW4gcmFuZ2UoMCwgMTYpXSkKLSAgICAgICAgICAgICMgZWxzZSB3ZSB1c2UgUmVhZExvY2FsRGF0YVJlcXVlc3QKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBSZXF1ZXN0aW5nIFAxOTIgRGF0YTsgbm8gc2VjdXJlIGNvbm5lY3Rpb25zIikKLSAgICAgICAgICAgICAgICBjb21wbGV0ZV9jYXB0dXJlID0gSGNpQ2FwdHVyZXMuUmVhZExvY2FsT29iRGF0YUNvbXBsZXRlQ2FwdHVyZSgpCi0gICAgICAgICAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZChoY2lfcGFja2V0cy5SZWFkTG9jYWxPb2JEYXRhQnVpbGRlcigpLCBUcnVlKQotICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogV2FpdGluZyBmb3IgT09CIHJlc3BvbnNlIGZyb20gY29udHJvbGxlciIpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9oY2lfZXZlbnRfc3RyZWFtKS5lbWl0cyhjb21wbGV0ZV9jYXB0dXJlKQotICAgICAgICAgICAgICAgIGNvbW1hbmRfY29tcGxldGUgPSBjb21wbGV0ZV9jYXB0dXJlLmdldCgpCi0gICAgICAgICAgICAgICAgY29tcGxldGUgPSBoY2lfcGFja2V0cy5SZWFkTG9jYWxPb2JEYXRhQ29tcGxldGVWaWV3KGNvbW1hbmRfY29tcGxldGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChsaXN0KGNvbXBsZXRlLkdldEMoKSksIGxpc3QoY29tcGxldGUuR2V0UigpKSwgWzAgZm9yIGkgaW4gcmFuZ2UoMCwgMTYpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0pCi0KLSAgICAgICAgIyBNdXN0IGJlIHNlY3VyZSBjb25uZWN0aW9uIGNvbXBhdGlibGUgdG8gdXNlIHRoZXNlCi0gICAgICAgIGVsaWYgb29iX2RhdGFfdHlwZSA9PSBoY2lfcGFja2V0cy5Pb2JEYXRhUHJlc2VudC5QXzI1Nl9QUkVTRU5UOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBSZXF1ZXN0aW5nIFAyNTYgRXh0ZW5kZWQgRGF0YTsgc2VjdXJlIGNvbm5lY3Rpb25zIikKLSAgICAgICAgICAgIGNvbXBsZXRlX2NhcHR1cmUgPSBIY2lDYXB0dXJlcy5SZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFDb21wbGV0ZUNhcHR1cmUoKQotICAgICAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZChoY2lfcGFja2V0cy5SZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFCdWlsZGVyKCksIFRydWUpCi0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFdhaXRpbmcgZm9yIE9PQiByZXNwb25zZSBmcm9tIGNvbnRyb2xsZXIiKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9oY2lfZXZlbnRfc3RyZWFtKS5lbWl0cyhjb21wbGV0ZV9jYXB0dXJlKQotICAgICAgICAgICAgY29tbWFuZF9jb21wbGV0ZSA9IGNvbXBsZXRlX2NhcHR1cmUuZ2V0KCkKLSAgICAgICAgICAgIGNvbXBsZXRlID0gaGNpX3BhY2tldHMuUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhQ29tcGxldGVWaWV3KGNvbW1hbmRfY29tcGxldGUpCi0gICAgICAgICAgICByZXR1cm4gKFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0sIFswIGZvciBpIGluIHJhbmdlKDAsIDE2KV0sIGxpc3QoY29tcGxldGUuR2V0QzI1NigpKSwKLSAgICAgICAgICAgICAgICAgICAgbGlzdChjb21wbGV0ZS5HZXRSMjU2KCkpKQotCi0gICAgICAgIGVsc2U6ICAjIEJvdGgKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogUmVxdWVzdGluZyBQMTkyIEFORCBQMjU2IEV4dGVuZGVkIERhdGE7IHNlY3VyZSBjb25uZWN0aW9ucyIpCi0gICAgICAgICAgICBjb21wbGV0ZV9jYXB0dXJlID0gSGNpQ2FwdHVyZXMuUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhQ29tcGxldGVDYXB0dXJlKCkKLSAgICAgICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhQnVpbGRlcigpLCBUcnVlKQotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBXYWl0aW5nIGZvciBPT0IgcmVzcG9uc2UgZnJvbSBjb250cm9sbGVyIikKLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoY29tcGxldGVfY2FwdHVyZSkKLSAgICAgICAgICAgIGNvbW1hbmRfY29tcGxldGUgPSBjb21wbGV0ZV9jYXB0dXJlLmdldCgpCi0gICAgICAgICAgICBjb21wbGV0ZSA9IGhjaV9wYWNrZXRzLlJlYWRMb2NhbE9vYkV4dGVuZGVkRGF0YUNvbXBsZXRlVmlldyhjb21tYW5kX2NvbXBsZXRlKQotICAgICAgICAgICAgcmV0dXJuIChsaXN0KGNvbXBsZXRlLkdldEMxOTIoKSksIGxpc3QoY29tcGxldGUuR2V0UjE5MigpKSwgbGlzdChjb21wbGV0ZS5HZXRDMjU2KCkpLAotICAgICAgICAgICAgICAgICAgICBsaXN0KGNvbXBsZXRlLkdldFIyNTYoKSkpCi0KLSAgICBkZWYgaW5wdXRfcGFzc2tleShzZWxmLCBhZGRyZXNzLCBwYXNza2V5KToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBQcmV0ZW5kIHRvIGFuc3dlciB0aGUgcGFpcmluZyBkaWFsb2cgYXMgYSB1c2VyCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFdhaXRpbmcgZm9yIFBBU1NLRVkgcmVxdWVzdCIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoSGNpTWF0Y2hlcnMuRXZlbnRXaXRoQ29kZShoY2lfcGFja2V0cy5FdmVudENvZGUuVVNFUl9QQVNTS0VZX1JFUVVFU1QpKQotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFNlbmQgdXNlciBpbnB1dCBwYXNza2V5ICVkIGZvciAlcyIgJSAocGFzc2tleSwgYWRkcmVzcykpCi0gICAgICAgIHBlZXIgPSBhZGRyZXNzLmRlY29kZSgndXRmLTgnKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuU2VuZEtleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcihwZWVyLCBoY2lfcGFja2V0cy5LZXlwcmVzc05vdGlmaWNhdGlvblR5cGUuRU5UUllfU1RBUlRFRCksIFRydWUpCi0gICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5TZW5kS2V5cHJlc3NOb3RpZmljYXRpb25CdWlsZGVyKHBlZXIsIGhjaV9wYWNrZXRzLktleXByZXNzTm90aWZpY2F0aW9uVHlwZS5ESUdJVF9FTlRFUkVEKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbkJ1aWxkZXIocGVlciwgaGNpX3BhY2tldHMuS2V5cHJlc3NOb3RpZmljYXRpb25UeXBlLkRJR0lUX0VOVEVSRUQpLCBUcnVlKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuU2VuZEtleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcihwZWVyLCBoY2lfcGFja2V0cy5LZXlwcmVzc05vdGlmaWNhdGlvblR5cGUuQ0xFQVJFRCksIFRydWUpCi0gICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5TZW5kS2V5cHJlc3NOb3RpZmljYXRpb25CdWlsZGVyKHBlZXIsIGhjaV9wYWNrZXRzLktleXByZXNzTm90aWZpY2F0aW9uVHlwZS5ESUdJVF9FTlRFUkVEKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbkJ1aWxkZXIocGVlciwgaGNpX3BhY2tldHMuS2V5cHJlc3NOb3RpZmljYXRpb25UeXBlLkRJR0lUX0VOVEVSRUQpLCBUcnVlKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuU2VuZEtleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcihwZWVyLCBoY2lfcGFja2V0cy5LZXlwcmVzc05vdGlmaWNhdGlvblR5cGUuRElHSVRfRVJBU0VEKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbkJ1aWxkZXIocGVlciwgaGNpX3BhY2tldHMuS2V5cHJlc3NOb3RpZmljYXRpb25UeXBlLkRJR0lUX0VOVEVSRUQpLCBUcnVlKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuU2VuZEtleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcihwZWVyLCBoY2lfcGFja2V0cy5LZXlwcmVzc05vdGlmaWNhdGlvblR5cGUuRElHSVRfRU5URVJFRCksIFRydWUpCi0gICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5TZW5kS2V5cHJlc3NOb3RpZmljYXRpb25CdWlsZGVyKHBlZXIsIGhjaV9wYWNrZXRzLktleXByZXNzTm90aWZpY2F0aW9uVHlwZS5ESUdJVF9FTlRFUkVEKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbkJ1aWxkZXIocGVlciwgaGNpX3BhY2tldHMuS2V5cHJlc3NOb3RpZmljYXRpb25UeXBlLkRJR0lUX0VOVEVSRUQpLCBUcnVlKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgaGNpX3BhY2tldHMuU2VuZEtleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcihwZWVyLCBoY2lfcGFja2V0cy5LZXlwcmVzc05vdGlmaWNhdGlvblR5cGUuRElHSVRfRU5URVJFRCksIFRydWUpCi0gICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5TZW5kS2V5cHJlc3NOb3RpZmljYXRpb25CdWlsZGVyKHBlZXIsIGhjaV9wYWNrZXRzLktleXByZXNzTm90aWZpY2F0aW9uVHlwZS5FTlRSWV9DT01QTEVURUQpLAotICAgICAgICAgICAgVHJ1ZSkKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZChoY2lfcGFja2V0cy5Vc2VyUGFzc2tleVJlcXVlc3RSZXBseUJ1aWxkZXIocGVlciwgcGFzc2tleSksIFRydWUpCi0KLSAgICBkZWYgaW5wdXRfcGluKHNlbGYsIGFkZHJlc3MsIHBpbik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgUHJldGVuZCB0byBhbnN3ZXIgdGhlIHBhaXJpbmcgZGlhbG9nIGFzIGEgdXNlcgotICAgICAgICAiIiIKLQotICAgICAgICBpZiBsZW4ocGluKSA+IHNlbGYuTUFYX1BJTl9MRU5HVEggb3IgbGVuKHBpbikgPCBzZWxmLk1JTl9QSU5fTEVOR1RIOgotICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJQaW4gY29kZSBtdXN0IGJlIHdpdGhpbiByYW5nZSIpCi0KLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBXYWl0aW5nIGZvciBQSU4gcmVxdWVzdCIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoSGNpTWF0Y2hlcnMuUGluQ29kZVJlcXVlc3QoKSkKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBTZW5kIHVzZXIgaW5wdXQgUElOICVzIGZvciAlcyIgJSAocGluLmRlY29kZSgpLCBhZGRyZXNzKSkKLSAgICAgICAgcGVlciA9IGFkZHJlc3MuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgIHBpbl9saXN0ID0gbGlzdChwaW4pCi0gICAgICAgICMgUGFkCi0gICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuTUFYX1BJTl9MRU5HVEggLSBsZW4ocGluX2xpc3QpKToKLSAgICAgICAgICAgIHBpbl9saXN0LmFwcGVuZCgwKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKGhjaV9wYWNrZXRzLlBpbkNvZGVSZXF1ZXN0UmVwbHlCdWlsZGVyKHBlZXIsIGxlbihwaW4pLCBwaW5fbGlzdCksIFRydWUpCi0KLSAgICBkZWYgX19zZW5kX3VpX2NhbGxiYWNrKHNlbGYsIGFkZHJlc3MsIGNhbGxiYWNrX3R5cGUsIGIsIHVpZCwgcGluKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBQcmV0ZW5kIHRvIGFuc3dlciB0aGUgcGFpcmluZyBkYWlsb2cgYXMgYSB1c2VyCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFNlbmQgdXNlciBpbnB1dCBjYWxsYmFjayB1aWQ6JWQ7IHJlc3BvbnNlOiAlcyIgJSAodWlkLCBiKSkKLSAgICAgICAgIyBUT0RPKG9wdGVkb2JsaXZpb24pOiBNYWtlIGNhbGxiYWNrIGFuZCBzZXQgaXQgdG8gdGhlIG1vZHVsZQotCi0gICAgZGVmIGVuYWJsZV9zZWN1cmVfc2ltcGxlX3BhaXJpbmcoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgd2hlbiB5b3Ugd2FudCB0byBlbmFibGUgU1NQIGZvciB0ZXN0aW5nCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFNlbmRpbmcgV1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERSBbVHJ1ZV0iKQotICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKGhjaV9wYWNrZXRzLldyaXRlU2ltcGxlUGFpcmluZ01vZGVCdWlsZGVyKGhjaV9wYWNrZXRzLkVuYWJsZS5FTkFCTEVEKSwgVHJ1ZSkKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBXYWl0aW5nIGZvciBjb250cm9sbGVyIHJlc3BvbnNlIikKLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9oY2lfZXZlbnRfc3RyZWFtKS5lbWl0cygKLSAgICAgICAgICAgIEhjaU1hdGNoZXJzLkNvbW1hbmRDb21wbGV0ZShoY2lfcGFja2V0cy5PcENvZGUuV1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERSkpCi0KLSAgICBkZWYgZW5hYmxlX3NlY3VyZV9jb25uZWN0aW9ucyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHlvdSB3YW50IHRvIGVuYWJsZSBzZWN1cmUgY29ubmVjdGlvbnMgc3VwcG9ydAotICAgICAgICAiIiIKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBTZW5kaW5nIFdSSVRFX1NFQ1VSRV9DT05ORUNUSU9OU19IT1NUX1NVUFBPUlQgW1RydWVdIikKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZCgKLSAgICAgICAgICAgIGhjaV9wYWNrZXRzLldyaXRlU2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydEJ1aWxkZXIoaGNpX3BhY2tldHMuRW5hYmxlLkVOQUJMRUQpLCBUcnVlKQotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFdhaXRpbmcgZm9yIGNvbnRyb2xsZXIgcmVzcG9uc2UiKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2hjaV9ldmVudF9zdHJlYW0pLmVtaXRzKAotICAgICAgICAgICAgSGNpTWF0Y2hlcnMuQ29tbWFuZENvbXBsZXRlKGhjaV9wYWNrZXRzLk9wQ29kZS5XUklURV9TRUNVUkVfQ09OTkVDVElPTlNfSE9TVF9TVVBQT1JUKSkKLSAgICAgICAgIyBUT0RPKG9wdGVkb2JsaXZpb24pOiBGaWd1cmUgdGhpcyBvdXQgYW5kIHJlbW92ZSAoc2VlIGNsYXNzaWNfcGFpcmluZ19oYW5kbGVyLmNjKQotICAgICAgICAjc2VsZi5fc2VjdXJlX2Nvbm5lY3Rpb25zX2VuYWJsZWQgPSBUcnVlCi0KLSAgICBkZWYgc2VuZF9pb19jYXBzKHNlbGYsIGFkZHJlc3MpOgotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFdhaXRpbmcgZm9yIElPX0NBUEFCSUxJVFlfUkVRVUVTVCIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoSGNpTWF0Y2hlcnMuSW9DYXBhYmlsaXR5UmVxdWVzdCgpKQotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFNlbmRpbmcgSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZIikKLSAgICAgICAgb29iX2RhdGFfcHJlc2VudCA9IGhjaV9wYWNrZXRzLk9vYkRhdGFQcmVzZW50Lk5PVF9QUkVTRU5UCi0gICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoCi0gICAgICAgICAgICBoY2lfcGFja2V0cy5Jb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlCdWlsZGVyKAotICAgICAgICAgICAgICAgIGFkZHJlc3MuZGVjb2RlKCd1dGY4JyksIHNlbGYuX2lvX2NhcHMsIG9vYl9kYXRhX3ByZXNlbnQsIHNlbGYuX2F1dGhfcmVxcyksIFRydWUpCi0KLSAgICBkZWYgYWNjZXB0X3BhaXJpbmcoc2VsZiwgZHV0X2FkZHJlc3MsIHJlcGx5X2Jvb2xlYW4pOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIEhlcmUgd2UgaGFuZGxlIHRoZSBwYWlyaW5nIGV2ZW50cyBhdCB0aGUgSENJIGxldmVsCi0gICAgICAgICIiIgotICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFdhaXRpbmcgZm9yIExJTktfS0VZX1JFUVVFU1QiKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2hjaV9ldmVudF9zdHJlYW0pLmVtaXRzKEhjaU1hdGNoZXJzLkxpbmtLZXlSZXF1ZXN0KCkpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogU2VuZGluZyBMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZIikKLSAgICAgICAgc2VsZi5fZW5xdWV1ZV9oY2lfY29tbWFuZChoY2lfcGFja2V0cy5MaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyKGR1dF9hZGRyZXNzLmRlY29kZSgndXRmOCcpKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5zZW5kX2lvX2NhcHMoZHV0X2FkZHJlc3MpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogV2FpdGluZyBmb3IgVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVCIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoSGNpTWF0Y2hlcnMuVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoKSkKLSAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBTZW5kaW5nIFNpbXVsYXRlZCBVc2VyIFJlc3BvbnNlICclcyciICUgcmVwbHlfYm9vbGVhbikKLSAgICAgICAgaWYgcmVwbHlfYm9vbGVhbjoKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogU2VuZGluZyBVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZIikKLSAgICAgICAgICAgIHNlbGYuX2VucXVldWVfaGNpX2NvbW1hbmQoaGNpX3BhY2tldHMuVXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseUJ1aWxkZXIoZHV0X2FkZHJlc3MuZGVjb2RlKCd1dGY4JykpLCBUcnVlKQotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBXYWl0aW5nIGZvciBTSU1QTEVfUEFJUklOR19DT01QTEVURSIpCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2hjaV9ldmVudF9zdHJlYW0pLmVtaXRzKEhjaU1hdGNoZXJzLlNpbXBsZVBhaXJpbmdDb21wbGV0ZSgpKQotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBXYWl0aW5nIGZvciBMSU5LX0tFWV9OT1RJRklDQVRJT04iKQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLl9oY2lfZXZlbnRfc3RyZWFtKS5lbWl0cyhIY2lNYXRjaGVycy5MaW5rS2V5Tm90aWZpY2F0aW9uKCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2dnaW5nLmluZm8oIkNlcnQ6IFNlbmRpbmcgVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9ORUdBVElWRV9SRVBMWSIpCi0gICAgICAgICAgICBzZWxmLl9lbnF1ZXVlX2hjaV9jb21tYW5kKAotICAgICAgICAgICAgICAgIGhjaV9wYWNrZXRzLlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseUJ1aWxkZXIoZHV0X2FkZHJlc3MuZGVjb2RlKCd1dGY4JykpLCBUcnVlKQotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJDZXJ0OiBXYWl0aW5nIGZvciBTSU1QTEVfUEFJUklOR19DT01QTEVURSIpCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2hjaV9ldmVudF9zdHJlYW0pLmVtaXRzKEhjaU1hdGNoZXJzLlNpbXBsZVBhaXJpbmdDb21wbGV0ZSgpKQotCi0gICAgZGVmIGFjY2VwdF9vb2JfcGFpcmluZyhzZWxmLCBkdXRfYWRkcmVzcyk6Ci0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogV2FpdGluZyBmb3IgSU9fQ0FQQUJJTElUWV9SRVNQT05TRSIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoSGNpTWF0Y2hlcnMuSW9DYXBhYmlsaXR5UmVzcG9uc2UoKSkKLSAgICAgICAgc2VsZi5zZW5kX2lvX2NhcHMoZHV0X2FkZHJlc3MpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogV2FpdGluZyBmb3IgU0lNUExFX1BBSVJJTkdfQ09NUExFVEUiKQotICAgICAgICBzc3BfY29tcGxldGVfY2FwdHVyZSA9IEhjaUNhcHR1cmVzLlNpbXBsZVBhaXJpbmdDb21wbGV0ZUNhcHR1cmUoKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuX2hjaV9ldmVudF9zdHJlYW0pLmVtaXRzKHNzcF9jb21wbGV0ZV9jYXB0dXJlKQotICAgICAgICBzc3BfY29tcGxldGUgPSBzc3BfY29tcGxldGVfY2FwdHVyZS5nZXQoKQotICAgICAgICBsb2dnaW5nLmluZm8oc3NwX2NvbXBsZXRlLkdldFN0YXR1cygpKQotICAgICAgICBhc3NlcnRUaGF0KHNzcF9jb21wbGV0ZS5HZXRTdGF0dXMoKSkuaXNFcXVhbFRvKGhjaV9wYWNrZXRzLkVycm9yQ29kZS5TVUNDRVNTKQotCi0gICAgZGVmIG9uX3VzZXJfaW5wdXQoc2VsZiwgZHV0X2FkZHJlc3MsIHJlcGx5X2Jvb2xlYW4sIGV4cGVjdGVkX3VpX2V2ZW50KToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBDZXJ0IGRvZXNuJ3QgbmVlZCB0aGUgdGVzdCB0byByZXNwb25kIHRvIHRoZSB1aSBldmVudAotICAgICAgICAgICAgQ2VydCByZXNwb25kcyBpbiBhY2NlcHQgcGFpcmluZwotICAgICAgICAiIiIKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIHdhaXRfZm9yX2JvbmRfZXZlbnQoc2VsZiwgZXhwZWN0ZWRfYm9uZF9ldmVudCk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgQSBib25kIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIG9uY2UgdGhlIGJvbmQgcHJvY2VzcwotICAgICAgICAgICAgaXMgY29tcGxldGUuICBGb3IgdGhlIERVVCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGl0LAotICAgICAgICAgICAgZm9yIENlcnQgaXQgaXNuJ3QgbmVlZGVkLgotICAgICAgICAiIiIKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGVuZm9yY2Vfc2VjdXJpdHlfcG9saWN5KHNlbGYsIGFkZHJlc3MsIHR5cGUsIHBvbGljeSk6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgUGFzcyBmb3Igbm93Ci0gICAgICAgICIiIgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgd2FpdF9mb3JfZW5mb3JjZV9zZWN1cml0eV9ldmVudChzZWxmLCBleHBlY3RlZF9lbmZvcmNlX3NlY3VyaXR5X2V2ZW50KToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBDZXJ0IHNpZGUgbmVlZHMgdG8gcGFzcwotICAgICAgICAiIiIKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIHdhaXRfZm9yX2Rpc2Nvbm5lY3RfZXZlbnQoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgQ2VydCBzaWRlIG5lZWRzIHRvIHBhc3MKLSAgICAgICAgIiIiCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiQ2VydDogV2FpdGluZyBmb3IgRElTQ09OTkVDVF9DT01QTEVURSIpCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5faGNpX2V2ZW50X3N0cmVhbSkuZW1pdHMoSGNpTWF0Y2hlcnMuRGlzY29ubmVjdGlvbkNvbXBsZXRlKCkpCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNhZmVDbG9zZShzZWxmLl9oY2kpCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9jZXJ0L2xlX3NlY3VyaXR5X3Rlc3QucHkgYi9nZC9zZWN1cml0eS9jZXJ0L2xlX3NlY3VyaXR5X3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTcyMmQuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvY2VydC9sZV9zZWN1cml0eV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gc2VjdXJpdHkuY2VydC5sZV9zZWN1cml0eV90ZXN0X2xpYiBpbXBvcnQgTGVTZWN1cml0eVRlc3RCYXNlCi0KLWZyb20gbW9ibHkgaW1wb3J0IGFzc2VydHMKLQotCi1jbGFzcyBMZVNlY3VyaXR5VGVzdChHZEJhc2VUZXN0Q2xhc3MsIExlU2VjdXJpdHlUZXN0QmFzZSk6Ci0KLSAgICBkZWYgc2V0dXBfY2xhc3Moc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF9jbGFzcyhzZWxmLCBkdXRfbW9kdWxlPSdTRUNVUklUWScsIGNlcnRfbW9kdWxlPSdTRUNVUklUWScpCi0KLSAgICBkZWYgc2V0dXBfdGVzdChzZWxmKToKLSAgICAgICAgYXNzZXJ0cy5za2lwKCJVbmhhbmRsZWQgcmFjZSBjb25kaXRpb24gLSBGbGFreSB0ZXN0IikKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX3Rlc3Qoc2VsZikKLSAgICAgICAgTGVTZWN1cml0eVRlc3RCYXNlLnNldHVwX3Rlc3Qoc2VsZiwgc2VsZi5kdXQsIHNlbGYuY2VydCkKLQotICAgIGRlZiB0ZWFyZG93bl90ZXN0KHNlbGYpOgotICAgICAgICByZXR1cm4gICMgdGVzdCBza2lwcGVkCi0gICAgICAgIExlU2VjdXJpdHlUZXN0QmFzZS50ZWFyZG93bl90ZXN0KHNlbGYpCi0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy50ZWFyZG93bl90ZXN0KHNlbGYpCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9jZXJ0L2xlX3NlY3VyaXR5X3Rlc3RfbGliLnB5IGIvZ2Qvc2VjdXJpdHkvY2VydC9sZV9zZWN1cml0eV90ZXN0X2xpYi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2OTBmNi4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9jZXJ0L2xlX3NlY3VyaXR5X3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTA5MCArMCwwIEBACi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCB0aW1lCi0KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgaGNpX3BhY2tldHMKLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMyBpbXBvcnQgc2VjdXJpdHlfcGFja2V0cwotZnJvbSBjZXJ0LmV2ZW50X3N0cmVhbSBpbXBvcnQgRXZlbnRTdHJlYW0KLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgSGNpTWF0Y2hlcnMKLWZyb20gY2VydC5tYXRjaGVycyBpbXBvcnQgU2VjdXJpdHlNYXRjaGVycwotZnJvbSBjZXJ0Lm1ldGFkYXRhIGltcG9ydCBtZXRhZGF0YQotZnJvbSBjZXJ0LnB5X2hjaSBpbXBvcnQgUHlIY2kKLWZyb20gY2VydC5weV9sZV9zZWN1cml0eSBpbXBvcnQgUHlMZVNlY3VyaXR5Ci1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQotZnJvbSBmYWNhZGUgaW1wb3J0IGNvbW1vbl9wYjIgYXMgY29tbW9uCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGNvbnRyb2xsZXJfZmFjYWRlX3BiMiBhcyBjb250cm9sbGVyX2ZhY2FkZQotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBsZV9hZHZlcnRpc2luZ19tYW5hZ2VyX2ZhY2FkZV9wYjIgYXMgbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlCi1mcm9tIGhjaS5mYWNhZGUgaW1wb3J0IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZV9wYjIgYXMgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZW1wdHlfcGIyIGFzIGVtcHR5X3Byb3RvCi1mcm9tIG5laWdoYm9yLmZhY2FkZSBpbXBvcnQgZmFjYWRlX3BiMiBhcyBuZWlnaGJvcl9mYWNhZGUKLWZyb20gc2VjdXJpdHkuY2VydC5jZXJ0X3NlY3VyaXR5IGltcG9ydCBDZXJ0U2VjdXJpdHkKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgQm9uZE1zZ1R5cGUKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgT29iRGF0YU1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgVWlDYWxsYmFja01zZwotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBVaUNhbGxiYWNrVHlwZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBVaU1zZ1R5cGUKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgTGVBdXRoUmVxdWlyZW1lbnRzTWVzc2FnZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBMZUlvQ2FwYWJpbGl0eU1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgTGVPb2JEYXRhUHJlc2VudE1lc3NhZ2UKLWZyb20gc2VjdXJpdHkuZmFjYWRlX3BiMiBpbXBvcnQgTGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemVNZXNzYWdlCi0KLWZyb20gYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5oY2lfcGFja2V0cyBpbXBvcnQgT3BDb2RlCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMuc2VjdXJpdHlfcGFja2V0cyBpbXBvcnQgUGFpcmluZ0ZhaWxlZFJlYXNvbgotCi1mcm9tIG1vYmx5IGltcG9ydCBhc3NlcnRzCi0KLUxlSW9DYXBhYmlsaXRpZXMgPSBMZUlvQ2FwYWJpbGl0eU1lc3NhZ2UuTGVJb0NhcGFiaWxpdGllcwotTGVPb2JEYXRhRmxhZyA9IExlT29iRGF0YVByZXNlbnRNZXNzYWdlLkxlT29iRGF0YUZsYWcKLQotRElTUExBWV9PTkxZID0gTGVJb0NhcGFiaWxpdHlNZXNzYWdlKGNhcGFiaWxpdGllcz1MZUlvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfT05MWSkKLUtFWUJPQVJEX09OTFkgPSBMZUlvQ2FwYWJpbGl0eU1lc3NhZ2UoY2FwYWJpbGl0aWVzPUxlSW9DYXBhYmlsaXRpZXMuS0VZQk9BUkRfT05MWSkKLU5PX0lOUFVUX05PX09VVFBVVCA9IExlSW9DYXBhYmlsaXR5TWVzc2FnZShjYXBhYmlsaXRpZXM9TGVJb0NhcGFiaWxpdGllcy5OT19JTlBVVF9OT19PVVRQVVQpCi1LRVlCT0FSRF9ESVNQTEFZID0gTGVJb0NhcGFiaWxpdHlNZXNzYWdlKGNhcGFiaWxpdGllcz1MZUlvQ2FwYWJpbGl0aWVzLktFWUJPQVJEX0RJU1BMQVkpCi0KLU9PQl9OT1RfUFJFU0VOVCA9IExlT29iRGF0YVByZXNlbnRNZXNzYWdlKGRhdGFfcHJlc2VudD1MZU9vYkRhdGFGbGFnLk5PVF9QUkVTRU5UKQotT09CX1BSRVNFTlQgPSBMZU9vYkRhdGFQcmVzZW50TWVzc2FnZShkYXRhX3ByZXNlbnQ9TGVPb2JEYXRhRmxhZy5QUkVTRU5UKQotCi0KLWNsYXNzIExlU2VjdXJpdHlUZXN0QmFzZSgpOgotICAgICIiIgotICAgICAgICBDb2xsZWN0aW9uIG9mIHRlc3RzIHRoYXQgZWFjaCBzYW1wbGUgcmVzdWx0cyBmcm9tCi0gICAgICAgIGRpZmZlcmVudCAodW5pcXVlKSBjb21iaW5hdGlvbnMgb2YgaW8gY2FwYWJpbGl0aWVzLCBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudHMsIGFuZCBvb2IgZGF0YS4KLSAgICAiIiIKLQotICAgIGRlZiBzZXR1cF90ZXN0KHNlbGYsIGR1dCwgY2VydCk6Ci0gICAgICAgIHNlbGYuZHV0ID0gZHV0Ci0gICAgICAgIHNlbGYuY2VydCA9IGNlcnQKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eSA9IFB5TGVTZWN1cml0eShzZWxmLmR1dCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5ID0gUHlMZVNlY3VyaXR5KHNlbGYuY2VydCkKLSAgICAgICAgc2VsZi5kdXRfaGNpID0gUHlIY2koc2VsZi5kdXQpCi0KLSAgICAgICAgcmF3X2FkZHIgPSBzZWxmLmR1dC5oY2lfY29udHJvbGxlci5HZXRNYWNBZGRyZXNzKGVtcHR5X3Byb3RvLkVtcHR5KCkpLmFkZHJlc3MKLQotICAgICAgICBzZWxmLmR1dF9hZGRyZXNzID0gY29tbW9uLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICAgIGFkZHJlc3M9Y29tbW9uLkJsdWV0b290aEFkZHJlc3MoYWRkcmVzcz1yYXdfYWRkciksIHR5cGU9Y29tbW9uLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLSAgICAgICAgcHJpdmFjeV9wb2xpY3kgPSBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuUHJpdmFjeVBvbGljeSgKLSAgICAgICAgICAgIGFkZHJlc3NfcG9saWN5PWxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5BZGRyZXNzUG9saWN5LlVTRV9QVUJMSUNfQUREUkVTUywKLSAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlPXNlbGYuZHV0X2FkZHJlc3MpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW5pdGlhdG9yQWRkcmVzc1BvbGljeShwcml2YWN5X3BvbGljeSkKLSAgICAgICAgc2VsZi5jZXJ0X2FkZHJlc3MgPSBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgICAgYWRkcmVzcz1jb21tb24uQmx1ZXRvb3RoQWRkcmVzcygKLSAgICAgICAgICAgICAgICBhZGRyZXNzPXNlbGYuY2VydC5oY2lfY29udHJvbGxlci5HZXRNYWNBZGRyZXNzKGVtcHR5X3Byb3RvLkVtcHR5KCkpLmFkZHJlc3MpLAotICAgICAgICAgICAgdHlwZT1jb21tb24uUFVCTElDX0RFVklDRV9BRERSRVNTKQotICAgICAgICBjZXJ0X3ByaXZhY3lfcG9saWN5ID0gbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLlByaXZhY3lQb2xpY3koCi0gICAgICAgICAgICBhZGRyZXNzX3BvbGljeT1sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUuQWRkcmVzc1BvbGljeS5VU0VfUFVCTElDX0FERFJFU1MsCi0gICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZT1zZWxmLmNlcnRfYWRkcmVzcykKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW5pdGlhdG9yQWRkcmVzc1BvbGljeShjZXJ0X3ByaXZhY3lfcG9saWN5KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0X2hjaS5jbG9zZSgpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LmNsb3NlKCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LmNsb3NlKCkKLQotICAgIGRlZiBfcHJlcGFyZV9jZXJ0X2Zvcl9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICAjIERVVCBBZHZlcnRpc2VzCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9UaGVfQ0VSVCcpKQotICAgICAgICBnYXBfZGF0YSA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5HYXBEYXRhTXNnKGRhdGE9Ynl0ZXMoZ2FwX25hbWUuU2VyaWFsaXplKCkpKQotICAgICAgICBjb25maWcgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdDb25maWcoCi0gICAgICAgICAgICBhZHZlcnRpc2VtZW50PVtnYXBfZGF0YV0sCi0gICAgICAgICAgICBpbnRlcnZhbF9taW49NTEyLAotICAgICAgICAgICAgaW50ZXJ2YWxfbWF4PTc2OCwKLSAgICAgICAgICAgIGFkdmVydGlzaW5nX3R5cGU9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRXZlbnRUeXBlLkFEVl9JTkQsCi0gICAgICAgICAgICBvd25fYWRkcmVzc190eXBlPWNvbW1vbi5VU0VfUFVCTElDX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgY2hhbm5lbF9tYXA9NywKLSAgICAgICAgICAgIGZpbHRlcl9wb2xpY3k9bGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkFkdmVydGlzaW5nRmlsdGVyUG9saWN5LkFMTF9ERVZJQ0VTKQotICAgICAgICByZXF1ZXN0ID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkNyZWF0ZUFkdmVydGlzZXJSZXF1ZXN0KGNvbmZpZz1jb25maWcpCi0gICAgICAgIGNyZWF0ZV9yZXNwb25zZSA9IHNlbGYuY2VydC5oY2lfbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5DcmVhdGVBZHZlcnRpc2VyKHJlcXVlc3QpCi0KLSAgICBkZWYgX3ByZXBhcmVfZHV0X2Zvcl9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICAjIERVVCBBZHZlcnRpc2VzCi0gICAgICAgIGdhcF9uYW1lID0gaGNpX3BhY2tldHMuR2FwRGF0YSgpCi0gICAgICAgIGdhcF9uYW1lLmRhdGFfdHlwZSA9IGhjaV9wYWNrZXRzLkdhcERhdGFUeXBlLkNPTVBMRVRFX0xPQ0FMX05BTUUKLSAgICAgICAgZ2FwX25hbWUuZGF0YSA9IGxpc3QoYnl0ZXMoYidJbV9UaGVfRFVUJykpCi0gICAgICAgIGdhcF9kYXRhID0gbGVfYWR2ZXJ0aXNpbmdfZmFjYWRlLkdhcERhdGFNc2coZGF0YT1ieXRlcyhnYXBfbmFtZS5TZXJpYWxpemUoKSkpCi0gICAgICAgIGNvbmZpZyA9IGxlX2FkdmVydGlzaW5nX2ZhY2FkZS5BZHZlcnRpc2luZ0NvbmZpZygKLSAgICAgICAgICAgIGFkdmVydGlzZW1lbnQ9W2dhcF9kYXRhXSwKLSAgICAgICAgICAgIGludGVydmFsX21pbj01MTIsCi0gICAgICAgICAgICBpbnRlcnZhbF9tYXg9NzY4LAotICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfdHlwZT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdFdmVudFR5cGUuQURWX0lORCwKLSAgICAgICAgICAgIG93bl9hZGRyZXNzX3R5cGU9Y29tbW9uLlVTRV9QVUJMSUNfREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICBjaGFubmVsX21hcD03LAotICAgICAgICAgICAgZmlsdGVyX3BvbGljeT1sZV9hZHZlcnRpc2luZ19mYWNhZGUuQWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3kuQUxMX0RFVklDRVMpCi0gICAgICAgIHJlcXVlc3QgPSBsZV9hZHZlcnRpc2luZ19mYWNhZGUuQ3JlYXRlQWR2ZXJ0aXNlclJlcXVlc3QoY29uZmlnPWNvbmZpZykKLSAgICAgICAgY3JlYXRlX3Jlc3BvbnNlID0gc2VsZi5kdXQuaGNpX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuQ3JlYXRlQWR2ZXJ0aXNlcihyZXF1ZXN0KQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJTTS9NQVMvUFJPVC9CVi0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iU01QIFRpbWUgT3V0IOKAkyBJVVQgSW5pdGlhdG9yIikKLSAgICBkZWYgdGVzdF9sZV9zbXBfdGltZW91dF9pdXRfaW5pdGlhdG9yKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaGFuZGxlcyB0aGUgbGFjayBvZiBwYWlyaW5nIHJlc3BvbnNlIGFmdGVyIDMwIHNlY29uZHMgd2hlbiBhY3RpbmcgYXMgaW5pdGlhdG9yLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fcHJlcGFyZV9jZXJ0X2Zvcl9jb25uZWN0aW9uKCkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuY2VydF9hZGRyZXNzKQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9ORF9GQUlMRUQsIHNlbGYuY2VydF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0zNSkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IlNNL1NMQS9QUk9UL0JWLTAyLUMiLCBwdHNfdGVzdF9uYW1lPSJTTVAgVGltZSBPdXQg4oCTIElVVCBSZXNwb25kZXIiKQotICAgIGRlZiB0ZXN0X2xlX3NtcF90aW1lb3V0X2l1dF9yZXNwb25kZXIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBoYW5kbGVzIHRoZSBsYWNrIG9mIHBhaXJpbmcgcmVzcG9uc2UgYWZ0ZXIgMzAgc2Vjb25kcyB3aGVuIGFjdGluZyBhcyBpbml0aWF0b3IuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfT05MWSkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoRElTUExBWV9PTkxZKQotCi0gICAgICAgIHNlbGYuX3ByZXBhcmVfZHV0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICAjIDEuIExvd2VyIFRlc3RlciB0cmFuc21pdHMgUGFpcmluZyBSZXF1ZXN0LgotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5jZXJ0X2FkZHJlc3MpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTM1KSkKLQotICAgICAgICAjIDIuIElVVCByZXNwb25kcyB3aXRoIFBhaXJpbmcgUmVzcG9uc2UuCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMy4gSW4gcGhhc2UgMiwgTG93ZXIgVGVzdGVyIGRvZXMgbm90IGlzc3VlIHRoZSBleHBlY3RlZCBQYWlyaW5nIENvbmZpcm0uCi0KLSAgICAgICAgIyBIZXJlIHRoZSBjZXJ0IHJlY2VpdmVzIERJU1BMQVlfUEFTU0tFWV9FTlRSWS4gQnkgbm90IHJlcGx5aW5nIHRvIGl0IHdlIG1ha2Ugc3VyZSBQYWlyaW5nIENvbmZpcm0gaXMgbmV2ZXIgc2VudAotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZX0VOVFJZLCBzZWxmLmR1dF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz01KSkKLQotICAgICAgICAjIDQuIElVVCB0aW1lcyBvdXQgMzAgc2Vjb25kcyBhZnRlciBpc3N1ZWQgUGFpcmluZyBSZXNwb25zZSBhbmQgcmVwb3J0cyB0aGUgZmFpbHVyZSB0byB0aGUgVXBwZXIgVGVzdGVyLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9ORF9GQUlMRUQsIHNlbGYuY2VydF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0zNSkpCi0KLSAgICAgICAgIyA1LiBBZnRlciBhZGRpdGlvbmFsbHkgKGF0IGxlYXN0KSAxMCBzZWNvbmRzIHRoZSBMb3dlciBUZXN0ZXIgaXNzdWVzIHRoZSBleHBlY3RlZCBQYWlyaW5nIENvbmZpcm0uCi0gICAgICAgICMgNi4gVGhlIElVVCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIHJlY2VpdmluZyB0aGUgZGVsYXllZCByZXNwb25zZSBvciBkb2VzIG5vdCByZXNwb25kIHRvIGl0IHdoZW4gaXQgaXMgcmVjZWl2ZWQuCi0gICAgICAgICNUT0RPOgotICAgICAgICAjYXNzZXJ0VGhhdChzZWxmLmR1dF9oY2kuZ2V0X2V2ZW50X3N0cmVhbSgpKS5lbWl0cyhIY2lNYXRjaGVycy5EaXNjb25uZWN0KCkpCi0KLSAgICBAbWV0YWRhdGEocHRzX3Rlc3RfaWQ9IlNNL01BUy9KVy9CVi0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iSnVzdCBXb3JrcyBJVVQgSW5pdGlhdG9yIOKAkyBTdWNjZXNzIikKLSAgICBkZWYgdGVzdF9qdXN0X3dvcmtzX2l1dF9pbml0aWF0b3Ioc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBwZXJmb3JtcyB0aGUgSnVzdCBXb3JrcyBwYWlyaW5nIHByb2NlZHVyZSBjb3JyZWN0bHkgYXMgY2VudHJhbCwgaW5pdGlhdG9yIHdoZW4gYm90aCBzaWRlcyBkbyBub3QgcmVxdWlyZSBNSVRNIHByb3RlY3Rpb24uCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2NlcnRfZm9yX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KEtFWUJPQVJEX09OTFkpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoKQotCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShESVNQTEFZX09OTFkpCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cygpCi0KLSAgICAgICAgIyAxLiBJVVQgdHJhbnNtaXRzIFBhaXJpbmcgUmVxdWVzdCBjb21tYW5kIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gY2FwYWJpbGl0eSBzZXQgdG8gYW55IElPIGNhcGFiaWxpdHkKLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBBdXRoUmVxIEJvbmRpbmcgRmxhZ3Mgc2V0IHRvIOKAmDAw4oCZIGFuZCB0aGUgTUlUTSBmbGFnIHNldCB0byDigJgw4oCZIGFuZCBhbGwgdGhlIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgw4oCZCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmNlcnRfYWRkcmVzcykKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAyLiBMb3dlciBUZXN0ZXIgcmVzcG9uZHMgd2l0aCBhIFBhaXJpbmcgUmVzcG9uc2UgY29tbWFuZCwgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBjYXBhYmlsaXR5IHNldCB0byDigJxLZXlib2FyZERpc3BsYXnigJ0KLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBBdXRoUmVxIEJvbmRpbmcgRmxhZ3Mgc2V0IHRvIOKAmDAw4oCZLCBhbmQgdGhlIE1JVE0gZmxhZyBzZXQgdG8g4oCYMOKAmSBhbmQgYWxsIHRoZSByZXNlcnZlZCBiaXRzIGFyZSBzZXQgdG8g4oCYMOKAmQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQUlSSU5HX1BST01QVCwgYm9vbGVhbj1UcnVlLCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDMuIElVVCBhbmQgTG93ZXIgVGVzdGVyIHBlcmZvcm0gcGhhc2UgMiBvZiB0aGUganVzdCB3b3JrcyBwYWlyaW5nIHByb2NlZHVyZSBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggdGhlIGtleSBnZW5lcmF0ZWQgaW4gcGhhc2UgMi4KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLkJvbmRNc2coQm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgQG1ldGFkYXRhKHB0c190ZXN0X2lkPSJTTS9TTEEvSlcvQlYtMDItQyIsIHB0c190ZXN0X25hbWU9Ikp1c3QgV29ya3MgSVVUIFJlc3BvbmRlciDigJMgU3VjY2VzcyIpCi0gICAgZGVmIHRlc3RfanVzdF93b3Jrc19pdXRfcmVzcG9uZGVyKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBKdXN0IFdvcmtzIHBhaXJpbmcgcHJvY2VkdXJlIGNvcnJlY3RseSB3aGVuIGFjdGluZyBhcyBwZXJpcGhlcmFsLCByZXNwb25kZXIuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2R1dF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfT05MWSkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cygpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KE5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKCkKLQotICAgICAgICAjIDEuIExvd2VyIFRlc3RlciB0cmFuc21pdHMgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBjYXBhYmlsaXR5IHNldCB0byDigJxOb0lucHV0Tm9PdXRwdXTigJ0KLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBNSVRNIGZsYWcgc2V0IHRvIOKAmDDigJkgYW5kIGFsbCByZXNlcnZlZCBiaXRzIGFyZSBzZXQgdG8g4oCYMOKAmQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMi4gSVVUIHJlc3BvbmRzIHdpdGggYSBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQsIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gY2FwYWJpbGl0eSBzZXQgdG8gYW55IElPIGNhcGFiaWxpdHkKLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQUlSSU5HX1BST01QVCwgYm9vbGVhbj1UcnVlLCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgIyBJVVQgYW5kIExvd2VyIFRlc3RlciBwZXJmb3JtIHBoYXNlIDIgb2YgdGhlIGp1c3Qgd29ya3MgcGFpcmluZyBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggdGhlIGdlbmVyYXRlZCBTVEsuCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IlNNL1NMQS9KVy9CSS0wMy1DIiwgcHRzX3Rlc3RfbmFtZT0iSnVzdCBXb3JrcyBJVVQgUmVzcG9uZGVyIOKAkyBIYW5kbGUgQXV0aFJlcSBmbGFnIFJGVSBjb3JyZWN0bHkiKQotICAgIGRlZiB0ZXN0X2p1c3Rfd29ya3NfaXV0X3Jlc3BvbmRlcl9hdXRoX3JlcV9yZnUoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBpcyBhYmxlIHRvIHBlcmZvcm0gdGhlIEp1c3QgV29ya3MgcGFpcmluZyBwcm9jZWR1cmUgd2hlbiByZWNlaXZpbmcgYWRkaXRpb25hbCBiaXRzIHNldCBpbiB0aGUgQXV0aFJlcSBmbGFnLiBSZXNlcnZlZCBGb3IgRnV0dXJlIFVzZSBiaXRzIGFyZSBjb3JyZWN0bHkgaGFuZGxlZCB3aGVuIGFjdGluZyBhcyBwZXJpcGhlcmFsLCByZXNwb25kZXIuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2R1dF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfRElTUExBWSkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cygpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KE5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKG1pdG09MSwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEsIHJlc2VydmVkX2JpdHM9MikKLQotICAgICAgICAjIDEuIExvd2VyIFRlc3RlciB0cmFuc21pdHMgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBDYXBhYmlsaXR5IHNldCB0byDigJ1Ob0lucHV0Tm9PdXRwdXTigJ0KLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBNSVRNIHNldCB0byDigJgw4oCZIGFuZCBhbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDHigJkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmR1dF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFJUklOR19QUk9NUFQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIElVVCByZXNwb25kcyB3aXRoIGEgUGFpcmluZyBSZXNwb25zZSBjb21tYW5kLCB3aXRoOgotICAgICAgICAjIGEuIElPIGNhcGFiaWxpdHkgc2V0IHRvIGFueSBJTyBjYXBhYmlsaXR5Ci0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgw4oCZCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMy4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBqdXN0IHdvcmtzIHBhaXJpbmcgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIHRoZSBnZW5lcmF0ZWQgU1RLLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9NQVMvSlcvQkktMDQtQyIsIHB0c190ZXN0X25hbWU9Ikp1c3QgV29ya3MgSVVUIEluaXRpYXRvciDigJMgSGFuZGxlIEF1dGhSZXEgZmxhZyBSRlUgY29ycmVjdGx5IikKLSAgICBkZWYgdGVzdF9qdXN0X3dvcmtzX2l1dF9pbml0aWF0b3JfYXV0aF9yZXFfcmZ1KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBKdXN0IFdvcmtzIHBhaXJpbmcgcHJvY2VkdXJlIHdoZW4gcmVjZWl2aW5nIGFkZGl0aW9uYWwgYml0cyBzZXQgaW4gdGhlIEF1dGhSZXEgZmxhZy4gUmVzZXJ2ZWQgRm9yIEZ1dHVyZSBVc2UgYml0cyBhcmUgY29ycmVjdGx5IGhhbmRsZWQgd2hlbiBhY3RpbmcgYXMgY2VudHJhbCwgaW5pdGlhdG9yLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fcHJlcGFyZV9jZXJ0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9ESVNQTEFZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKCkKLQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoTk9fSU5QVVRfTk9fT1VUUFVUKQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMobWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSwgcmVzZXJ2ZWRfYml0cz0zKQotCi0gICAgICAgICMgMS4gSVVUIHRyYW5zbWl0cyBhIFBhaXJpbmcgUmVxdWVzdCBjb21tYW5kIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8gYW55IElPIENhcGFiaWxpdHkKLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBBbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDDigJkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB0ZXN0IHRoZSBTZWN1cmUgQ29ubmVjdGlvbnMgYml0IGFuZCB0aGUgS2V5cHJlc3MgYml0cyBpbiB0aGUgQXV0aFJlcSBib25kaW5nIGZsYWcgc2V0IGJ5IHRoZSBJVVQgYXJlIGlnbm9yZWQgYnkgdGhlIExvd2VyIFRlc3Rlci4KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuY2VydF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIExvd2VyIFRlc3RlciByZXNwb25kcyB3aXRoIGEgUGFpcmluZyBSZXNwb25zZSBjb21tYW5kLCB3aXRoOgotICAgICAgICAjIGEuIElPIENhcGFiaWxpdHkgc2V0IHRvIOKAnE5vSW5wdXROb091dHB1dOKAnQotICAgICAgICAjIGIuIE9PQiBkYXRhIGZsYWcgc2V0IHRvIDB4MDAgKE9PQiBBdXRoZW50aWNhdGlvbiBkYXRhIG5vdCBwcmVzZW50KQotICAgICAgICAjIGMuIEF1dGhSZXEgYm9uZGluZyBmbGFnIHNldCB0byB0aGUgdmFsdWUgaW5kaWNhdGVkIGluIHRoZSBJWElUIFs3XSBmb3Ig4oCYQm9uZGluZyBGbGFnc+KAmSBhbmQgdGhlIE1JVE0gZmxhZyBzZXQgdG8g4oCYMOKAmSBhbmQgYWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgx4oCZLiBUaGUgU0MgYW5kIEtleXByZXNzIGJpdHMgaW4gdGhlIEF1dGhSZXEgYm9uZGluZyBmbGFnIGFyZSBzZXQgdG8gMCBieSB0aGUgTG93ZXIgVGVzdGVyIGZvciB0aGlzIHRlc3QuCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZW5kVWlDYWxsYmFjaygKLSAgICAgICAgICAgIFVpQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBSVJJTkdfUFJPTVBULCBib29sZWFuPVRydWUsIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuZHV0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMy4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBqdXN0IHdvcmtzIHBhaXJpbmcgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIHRoZSBnZW5lcmF0ZWQgU1RLLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9NQVMvU0NKVy9CVi0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iSnVzdCBXb3JrcywgSVVUIEluaXRpYXRvciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBTdWNjZXNzIikKLSAgICBkZWYgdGVzdF9qdXN0X3dvcmtzX2l1dF9pbml0aWF0b3Jfc2VjdXJlX2Nvbm5lY3Rpb25zKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgc3VwcG9ydGluZyBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgcGVyZm9ybXMgdGhlIEp1c3QgV29ya3Mgb3IgTnVtZXJpYyBDb21wYXJpc29uIHBhaXJpbmcgcHJvY2VkdXJlIGNvcnJlY3RseSBhcyBpbml0aWF0b3IuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2NlcnRfZm9yX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KEtFWUJPQVJEX09OTFkpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoc2VjdXJlX2Nvbm5lY3Rpb25zPTEpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KERJU1BMQVlfT05MWSkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgICMgMS4gSVVUIHRyYW5zbWl0cyBQYWlyaW5nIFJlcXVlc3QgY29tbWFuZCB3aXRoOgotICAgICAgICAjIGEuIElPIGNhcGFiaWxpdHkgc2V0IHRvIGFueSBJTyBjYXBhYmlsaXR5Ci0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQXV0aFJlcSBCb25kaW5nIEZsYWdzIHNldCB0byDigJgwMOKAmSwgdGhlIE1JVE0gZmxhZyBzZXQgdG8gZWl0aGVyIOKAmDDigJkgZm9yIEp1c3QgV29ya3Mgb3IgJzEnIGZvciBOdW1lcmljIENvbXBhcmlzb24sIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScgYW5kIGFsbCB0aGUgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDDigJkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuY2VydF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIExvd2VyIFRlc3RlciByZXNwb25kcyB3aXRoIGEgUGFpcmluZyBSZXNwb25zZSBjb21tYW5kLCB3aXRoOgotICAgICAgICAjIGEuIElPIGNhcGFiaWxpdHkgc2V0IHRvIOKAnEtleWJvYXJkRGlzcGxheeKAnQotICAgICAgICAjIGIuIE9PQiBkYXRhIGZsYWcgc2V0IHRvIDB4MDAgKE9PQiBBdXRoZW50aWNhdGlvbiBkYXRhIG5vdCBwcmVzZW50KQotICAgICAgICAjIGMuIEF1dGhSZXEgQm9uZGluZyBGbGFncyBzZXQgdG8g4oCYMDDigJksIHRoZSBNSVRNIGZsYWcgc2V0IHRvIOKAmDDigJksIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScgYW5kIGFsbCB0aGUgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDDigJkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAzLiBJVVQgYW5kIExvd2VyIFRlc3RlciBwZXJmb3JtIHBoYXNlIDIgb2YgdGhlIEp1c3QgV29ya3Mgb3IgTnVtZXJpYyBDb21wYXJpc29uIHBhaXJpbmcgcHJvY2VkdXJlIGFjY29yZGluZyB0byB0aGUgTUlUTSBmbGFnIGFuZCBJTyBjYXBhYmlsaXRpZXMsIGFuZCBlc3RhYmxpc2ggYW4gZW5jcnlwdGVkIGxpbmsgd2l0aCB0aGUgTFRLIGdlbmVyYXRlZCBpbiBwaGFzZSAyLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9TTEEvU0NKVy9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iSnVzdCBXb3JrcywgSVVUIFJlc3BvbmRlciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBTdWNjZXNzIikKLSAgICBkZWYgdGVzdF9qdXN0X3dvcmtzX2l1dF9yZXNwb25kZXJfc2VjdXJlX2Nvbm5lY3Rpb25zKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgc3VwcG9ydGluZyBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBKdXN0IFdvcmtzIG9yIE51bWVyaWMgQ29tcGFyaXNvbiBwYWlyaW5nIHByb2NlZHVyZSBjb3JyZWN0bHkgd2hlbiBhY3RpbmcgYXMgcmVzcG9uZGVyLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fcHJlcGFyZV9kdXRfZm9yX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KEtFWUJPQVJEX09OTFkpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoc2VjdXJlX2Nvbm5lY3Rpb25zPTEpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KE5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgICMgMS4gTG93ZXIgVGVzdGVyIHRyYW5zbWl0cyBQYWlyaW5nIFJlcXVlc3QgY29tbWFuZCB3aXRoOgotICAgICAgICAjIGEuIElPIGNhcGFiaWxpdHkgc2V0IHRvIOKAnE5vSW5wdXROb091dHB1dOKAnQotICAgICAgICAjIGIuIE9PQiBkYXRhIGZsYWcgc2V0IHRvIDB4MDAgKE9PQiBBdXRoZW50aWNhdGlvbiBkYXRhIG5vdCBwcmVzZW50KQotICAgICAgICAjIGMuIEF1dGhSZXEgQm9uZGluZyBGbGFncyBzZXQgdG8g4oCYMDDigJksIE1JVE0gZmxhZyBzZXQgdG8g4oCYMOKAmSwgU2VjdXJlIENvbm5lY3Rpb25zIGZsYWcgc2V0IHRvICcxJyBhbmQgYWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgw4oCZCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5DcmVhdGVCb25kTGUoc2VsZi5kdXRfYWRkcmVzcykKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAyLiBJVVQgcmVzcG9uZHMgd2l0aCBhIFBhaXJpbmcgUmVzcG9uc2UgY29tbWFuZCwgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBjYXBhYmlsaXR5IHNldCB0byBhbnkgSU8gY2FwYWJpbGl0eQotICAgICAgICAjIGIuIEF1dGhSZXEgQm9uZGluZyBGbGFncyBzZXQgdG8g4oCYMDDigJksIE1JVE0gZmxhZyBzZXQgdG8gZWl0aGVyIOKAmDDigJkgZm9yIEp1c3QgV29ya3Mgb3IgJzEnIGZvciBOdW1lcmljIENvbXBhcmlzb24sIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScgYW5kIGFsbCByZXNlcnZlZCBiaXRzIGFyZSBzZXQgdG8g4oCYMOKAmQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZW5kVWlDYWxsYmFjaygKLSAgICAgICAgICAgIFVpQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBSVJJTkdfUFJPTVBULCBib29sZWFuPVRydWUsIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAjIDMuIFVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBKdXN0IFdvcmtzIG9yIE51bWVyaWMgQ29tcGFyaXNvbiBwYWlyaW5nIHByb2NlZHVyZSBhY2NvcmRpbmcgdG8gdGhlIE1JVE0gZmxhZyBhbmQgSU8gY2FwYWJpbGl0aWVzLCBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggdGhlIExUSyBnZW5lcmF0ZWQgaW4gcGhhc2UgMi4KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLkJvbmRNc2coQm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iU00vU0xBL1NDSlcvQlYtMDMtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9Ikp1c3QgV29ya3MsIElVVCBSZXNwb25kZXIsIFNlY3VyZSBDb25uZWN0aW9ucyDigJMgSGFuZGxlIEF1dGhSZXEgRmxhZyBSRlUgQ29ycmVjdGx5IikKLSAgICBkZWYgdGVzdF9qdXN0X3dvcmtzX2l1dF9yZXNwb25kZXJfc2VjdXJlX2Nvbm5lY3Rpb25zX2F1dGhfcmVxX3JmdShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGlzIGFibGUgdG8gcGVyZm9ybSB0aGUgSnVzdCBXb3JrcyBwYWlyaW5nIHByb2NlZHVyZSB3aGVuIHJlY2VpdmluZyBhZGRpdGlvbmFsIGJpdHMgc2V0IGluIHRoZSBBdXRoUmVxIGZsYWcuIFJlc2VydmVkIEZvciBGdXR1cmUgVXNlIGJpdHMgYXJlIGNvcnJlY3RseSBoYW5kbGVkIHdoZW4gYWN0aW5nIGFzIHBlcmlwaGVyYWwsIHJlc3BvbmRlci4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3ByZXBhcmVfZHV0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9ESVNQTEFZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShOT19JTlBVVF9OT19PVVRQVVQpCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhtaXRtPTEsIHNlY3VyZV9jb25uZWN0aW9ucz0xLCByZXNlcnZlZF9iaXRzPTMpCi0KLSAgICAgICAgIyAxLiBMb3dlciBUZXN0ZXIgdHJhbnNtaXRzIFBhaXJpbmcgUmVxdWVzdCBjb21tYW5kIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8g4oCdTm9JbnB1dE5vT3V0cHV04oCdCi0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gTUlUTSBzZXQgdG8g4oCYMOKAmSBhbmQgYWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byBhIHJhbmRvbSB2YWx1ZS4KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmR1dF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFJUklOR19QUk9NUFQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIElVVCByZXNwb25kcyB3aXRoIGEgUGFpcmluZyBSZXNwb25zZSBjb21tYW5kLCB3aXRoOgotICAgICAgICAjIGEuIElPIGNhcGFiaWxpdHkgc2V0IHRvIGFueSBJTyBjYXBhYmlsaXR5Ci0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgw4oCZCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMy4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBKdXN0IFdvcmtzIHBhaXJpbmcgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIHRoZSBnZW5lcmF0ZWQgTFRLLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9NQVMvU0NKVy9CVi0wNC1DIiwKLSAgICAgICAgcHRzX3Rlc3RfbmFtZT0iSnVzdCBXb3JrcywgSVVUIEluaXRpYXRvciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBIYW5kbGUgQXV0aFJlcSBGbGFnIFJGVSBDb3JyZWN0bHkiKQotICAgIGRlZiB0ZXN0X2p1c3Rfd29ya3NfaXV0X2luaXRpYXRvcl9zZWN1cmVfY29ubmVjdGlvbnNfYXV0aF9yZXFfcmZ1KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBKdXN0IFdvcmtzIHBhaXJpbmcgcHJvY2VkdXJlIHdoZW4gcmVjZWl2aW5nIGFkZGl0aW9uYWwgYml0cyBzZXQgaW4gdGhlIEF1dGhSZXEgZmxhZy4gUmVzZXJ2ZWQgRm9yIEZ1dHVyZSBVc2UgYml0cyBhcmUgY29ycmVjdGx5IGhhbmRsZWQgd2hlbiBhY3RpbmcgYXMgY2VudHJhbCwgaW5pdGlhdG9yLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fcHJlcGFyZV9jZXJ0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9ESVNQTEFZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShOT19JTlBVVF9OT19PVVRQVVQpCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhtaXRtPTEsIHNlY3VyZV9jb25uZWN0aW9ucz0xLCByZXNlcnZlZF9iaXRzPTMpCi0KLSAgICAgICAgIyAxLiBJVVQgdHJhbnNtaXRzIGEgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBDYXBhYmlsaXR5IHNldCB0byBhbnkgSU8gQ2FwYWJpbGl0eQotICAgICAgICAjIGIuIE9PQiBkYXRhIGZsYWcgc2V0IHRvIDB4MDAgKE9PQiBBdXRoZW50aWNhdGlvbiBkYXRhIG5vdCBwcmVzZW50KQotICAgICAgICAjIGMuIEFsbCByZXNlcnZlZCBiaXRzIGFyZSBzZXQgdG8g4oCYMOKAmS4KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuY2VydF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIExvd2VyIFRlc3RlciByZXNwb25kcyB3aXRoIGEgUGFpcmluZyBSZXNwb25zZSBjb21tYW5kLCB3aXRoOgotICAgICAgICAjIGEuIElPIENhcGFiaWxpdHkgc2V0IHRvIOKAnE5vSW5wdXROb091dHB1dOKAnQotICAgICAgICAjIGIuIE9PQiBkYXRhIGZsYWcgc2V0IHRvIDB4MDAgKE9PQiBBdXRoZW50aWNhdGlvbiBkYXRhIG5vdCBwcmVzZW50KQotICAgICAgICAjIGMuIEF1dGhSZXEgYm9uZGluZyBmbGFnIHNldCB0byB0aGUgdmFsdWUgaW5kaWNhdGVkIGluIHRoZSBJWElUIFs3XSBmb3Ig4oCYQm9uZGluZyBGbGFnc+KAmSBhbmQgdGhlIE1JVE0gZmxhZyBzZXQgdG8g4oCYMOKAmSBhbmQgYWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byBhIHJhbmRvbSB2YWx1ZS4KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAzLiBJVVQgYW5kIExvd2VyIFRlc3RlciBwZXJmb3JtIHBoYXNlIDIgb2YgdGhlIEp1c3QgV29ya3MgcGFpcmluZyBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggdGhlIGdlbmVyYXRlZCBMVEsuCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IlNNL01BUy9FS1MvQlYtMDEtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IklVVCBpbml0aWF0b3IsIExvd2VyIFRlc3RlciBNYXhpbXVtIEVuY3J5cHRpb24gS2V5IFNpemUgPSBNaW5fRW5jcnlwdGlvbl9LZXlfTGVuZ3RoIikKLSAgICBkZWYgdGVzdF9taW5fZW5jcnlwdGlvbl9rZXlfc2l6ZV9lcXVhbF90b19tYXhfaXV0X2luaXRpYXRvcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHVzZXMgY29ycmVjdCBrZXkgc2l6ZSBkdXJpbmcgZW5jcnlwdGlvbiBhcyBpbml0aWF0b3IuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2NlcnRfZm9yX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KEtFWUJPQVJEX0RJU1BMQVkpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoc2VjdXJlX2Nvbm5lY3Rpb25zPTEpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKAotICAgICAgICAgICAgTGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemVNZXNzYWdlKG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZT0weDEwKSkKLQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoTk9fSU5QVVRfTk9fT1VUUFVUKQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMobWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKAotICAgICAgICAgICAgTGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemVNZXNzYWdlKG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZT0weDA3KSkKLQotICAgICAgICAjIDEuIElVVCB0cmFuc21pdHMgYSBQYWlyaW5nIFJlcXVlc3QKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuY2VydF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5jZXJ0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIExvd2VyIFRlc3RlciByZXNwb25kcyB3aXRoIFBhaXJpbmcgUmVzcG9uc2UgY29tbWFuZCB3aXRoIE1heGltdW0gRW5jcnlwdGlvbiBLZXkgU2l6ZSBmaWVsZCBzZXQgdG8gTWluX0VuY3J5cHRpb25fS2V5X0xlbmd0aOKAmS4KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAzLiBJVVQgYW5kIExvd2VyIFRlc3RlciBwZXJmb3JtIHBoYXNlIDIgb2YgdGhlIExFIHBhaXJpbmcgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIHRoZSBrZXkgZ2VuZXJhdGVkIGluIHBoYXNlIDIuCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IlNNL1NMQS9FS1MvQlYtMDItQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IklVVCBSZXNwb25kZXIsIExvd2VyIFRlc3RlciBNYXhpbXVtIEVuY3J5cHRpb24gS2V5IFNpemUgPSBNaW5fRW5jcnlwdGlvbl9LZXlfTGVuZ3RoIikKLSAgICBkZWYgdGVzdF9taW5fZW5jcnlwdGlvbl9rZXlfc2l6ZV9lcXVhbF90b19tYXhfaXV0X3Jlc3BvbmRlcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHVzZXMgY29ycmVjdCBrZXkgc2l6ZSBkdXJpbmcgZW5jcnlwdGlvbiBhcyByZXNwb25kZXIuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2R1dF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfT05MWSkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cygpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKAotICAgICAgICAgICAgTGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemVNZXNzYWdlKG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZT0weDA3KSkKLQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoTk9fSU5QVVRfTk9fT1VUUFVUKQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoKQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemUoCi0gICAgICAgICAgICBMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZU1lc3NhZ2UobWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplPTB4MTApKQotCi0gICAgICAgICMgMS4gTG93ZXIgVGVzdGVyIGluaXRpYXRlcyBQYWlyaW5nIFJlcXVlc3QgY29tbWFuZCB3aXRoIE1heGltdW0gRW5jcnlwdGlvbiBLZXkgU2l6ZSBmaWVsZCBzZXQgdG8gTWluX0VuY3J5cHRpb25fS2V5X0xlbmd0aOKAmS4KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmR1dF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFJUklOR19QUk9NUFQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAjIDIuIElVVCByZXNwb25kcyB3aXRoIFBhaXJpbmcgUmVzcG9uc2UgY29tbWFuZC4KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQUlSSU5HX1BST01QVCwgYm9vbGVhbj1UcnVlLCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgIzMuIElVVCBhbmQgTG93ZXIgVGVzdGVyIHBlcmZvcm0gcGhhc2UgMiBvZiB0aGUgTEUgcGFpcmluZyBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggdGhlIGtleSBnZW5lcmF0ZWQgaW4gcGhhc2UgMi4KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLkJvbmRNc2coQm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iU00vTUFTL0VLUy9CSS0wMS1DIiwKLSAgICAgICAgcHRzX3Rlc3RfbmFtZT0iSVVUIGluaXRpYXRvciwgTG93ZXIgVGVzdGVyIE1heGltdW0gRW5jcnlwdGlvbiBLZXkgU2l6ZSA8IE1pbl9FbmNyeXB0aW9uX0tleV9MZW5ndGgiKQotICAgIGRlZiB0ZXN0X21pbl9lbmNyeXB0aW9uX2tleV9zaXplX2xlc3NfdGhhbl9taW5faXV0X2luaXRpYXRvcihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIGNoZWNrcyB0aGF0IHRoZSByZXN1bHRhbnQgZW5jcnlwdGlvbiBrZXkgc2l6ZSBpcyBub3Qgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIGtleSBzaXplLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fcHJlcGFyZV9jZXJ0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9ESVNQTEFZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSgKLSAgICAgICAgICAgIExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplTWVzc2FnZShtYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemU9MHgxMCkpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KE5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKG1pdG09MSwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEpCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSgKLSAgICAgICAgICAgIExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplTWVzc2FnZShtYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemU9MHgwNikpCi0KLSAgICAgICAgIyAxLiBJVVQgdHJhbnNtaXRzIGEgUGFpcmluZyBSZXF1ZXN0Ci0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmNlcnRfYWRkcmVzcykKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAyLiBMb3dlciBUZXN0ZXIgcmVzcG9uZHMgd2l0aCBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQgd2l0aCBNYXhpbXVtIEVuY3J5cHRpb24gS2V5IFNpemUgZmllbGQgc2V0IHRvIE1pbl9FbmNyeXB0aW9uX0tleV9MZW5ndGgtMeKAmS4KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyAzLiBJVVQgdHJhbnNtaXRzIHRoZSBQYWlyaW5nIEZhaWxlZCBjb21tYW5kLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9ORF9GQUlMRUQsIHNlbGYuY2VydF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChQYWlyaW5nRmFpbGVkUmVhc29uLkVOQ1JZUFRJT05fS0VZX1NJWkUpKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IlNNL1NMQS9FS1MvQkktMDItQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IklVVCBSZXNwb25kZXIsIExvd2VyIFRlc3RlciBNYXhpbXVtIEVuY3J5cHRpb24gS2V5IFNpemUgPCBNaW5fRW5jcnlwdGlvbl9LZXlfTGVuZ3RoIikKLSAgICBkZWYgdGVzdF9taW5fZW5jcnlwdGlvbl9rZXlfc2l6ZV9sZXNzX3RoYW5fbWluX2l1dF9yZXNwb25kZXIoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCB1c2VzIGNvcnJlY3Qga2V5IHNpemUgZHVyaW5nIGVuY3J5cHRpb24gYXMgcmVzcG9uZGVyLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fcHJlcGFyZV9kdXRfZm9yX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KEtFWUJPQVJEX09OTFkpCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSgKLSAgICAgICAgICAgIExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplTWVzc2FnZShtYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemU9MHgwNikpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KE5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKCkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKAotICAgICAgICAgICAgTGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemVNZXNzYWdlKG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZT0weDEwKSkKLQotICAgICAgICAjIDEuIExvd2VyIFRlc3RlciBpbml0aWF0ZXMgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aCBNYXhpbXVtIEVuY3J5cHRpb24gS2V5IFNpemUgZmllbGQgc2V0IHRvIE1pbl9FbmNyeXB0aW9uX0tleV9MZW5ndGgtMS4KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmR1dF9hZGRyZXNzKQotCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFJUklOR19QUk9NUFQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZW5kVWlDYWxsYmFjaygKLSAgICAgICAgICAgIFVpQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBSVJJTkdfUFJPTVBULCBib29sZWFuPVRydWUsIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAjMy4gSVVUIHRyYW5zbWl0cyB0aGUgUGFpcmluZyBGYWlsZWQgY29tbWFuZC4KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05EX0ZBSUxFRCwgc2VsZi5kdXRfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoUGFpcmluZ0ZhaWxlZFJlYXNvbi5FTkNSWVBUSU9OX0tFWV9TSVpFKSkpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9NQVMvU0NQSy9CVi0wMS1DIiwgcHRzX3Rlc3RfbmFtZT0iUGFzc2tleSBFbnRyeSwgSVVUIEluaXRpYXRvciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBTdWNjZXNzIikKLSAgICBkZWYgdGVzdF9wYXNza2V5X2VudHJ5X2l1dF9pbml0aWF0b3Jfc2VjdXJlX2Nvbm5lY3Rpb25zKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgc3VwcG9ydGluZyBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgcGVyZm9ybXMgdGhlIFBhc3NrZXkgRW50cnkgcGFpcmluZyBwcm9jZWR1cmUgY29ycmVjdGx5IGFzIGNlbnRyYWwsIGluaXRpYXRvci4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3ByZXBhcmVfY2VydF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoRElTUExBWV9PTkxZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9PTkxZKQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMobWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSkKLQotICAgICAgICAjIDEuIElVVCB0cmFuc21pdHMgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBjYXBhYmlsaXR5IHNldCB0byDigJxEaXNwbGF5T25seeKAnSBvciDigJxLZXlib2FyZE9ubHnigJ0KLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBBdXRoUmVxIGJvbmRpbmcgZmxhZyBzZXQgdG8g4oCYMDDigJksIHRoZSBNSVRNIGZsYWcgc2V0IHRvIOKAmDDigJkgYW5kIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScuIEtleXByZXNzIGJpdCBpcyBzZXQgdG8gJzEnIGlmIHN1cHBvcnRlZAotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5DcmVhdGVCb25kTGUoc2VsZi5jZXJ0X2FkZHJlc3MpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFJUklOR19QUk9NUFQsIHNlbGYuZHV0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMi4gTG93ZXIgVGVzdGVyIHJlc3BvbmRzIHdpdGggYSBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQsIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gY2FwYWJpbGl0eSBzZXQgdG8g4oCcS2V5Ym9hcmRPbmx54oCdCi0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQXV0aFJlcSBib25kaW5nIGZsYWcgc2V0IHRvIOKAmDAw4oCZLCB0aGUgTUlUTSBmbGFnIHNldCB0byDigJgx4oCZLCBTZWN1cmUgQ29ubmVjdGlvbnMgZmxhZyBzZXQgdG8gJzEnIGFuZCBhbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDDigJkuIEtleXByZXNzIGJpdCBpcyBzZXQgdG8gJzEnIGlmIHN1cHBvcnRlZCBieSB0aGUgSVVULgotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQUlSSU5HX1BST01QVCwgYm9vbGVhbj1UcnVlLCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZX0VOVFJZLCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDMuIER1cmluZyB0aGUgcGhhc2UgMiBwYWlyaW5nLCB0aGUgSVVUIGRpc3BsYXlzIHRoZSA2LWRpZ2l0IHBhc3NrZXkgd2hpbGUgdGhlIExvd2VyIFRlc3RlciBwcm9tcHRzIHVzZXIgdG8gZW50ZXIgdGhlIDYtZGlnaXQgcGFzc2tleS4gSWYgdGhlIElVVOKAmXMgSU8gY2FwYWJpbGl0aWVzIGFyZSDigJxLZXlib2FyZE9ubHnigJ0gdGhlIHBhc3NrZXkgaXMgbm90IGRpc3BsYXllZCBhbmQgYm90aCBJVVQgYW5kIExvd2VyIFRlc3RlciBlbnRlciB0aGUgc2FtZSA2LWRpZ2l0IHBhc3NrZXkuIElmIEtleXByZXNzIGJpdCBpcyBzZXQsIHBhaXJpbmcga2V5cHJlc3Mgbm90aWZpY2F0aW9ucyBhcmUgc2VudCBieSB0aGUgTG93ZXIgVGVzdGVyLgotICAgICAgICBwYXNza2V5ID0gc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9mb3JfdWlfZXZlbnRfcGFzc2tleSgpCi0KLSAgICAgICAgaWYgcGFzc2tleSA9PSAwOgotICAgICAgICAgICAgcHJpbnQoIlBhc3NrZXkgZGlkIG5vdCBhcnJpdmUgaW50byB0ZXN0IikKLQotICAgICAgICAjIDQuIElVVCBhbmQgTG93ZXIgVGVzdGVyIHVzZSB0aGUgc2FtZSA2LWRpZ2l0IHBhc3NrZXkuCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZW5kVWlDYWxsYmFjaygKLSAgICAgICAgICAgIFVpQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBU1NLRVksIG51bWVyaWNfdmFsdWU9cGFzc2tleSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyA1LiBJVVQgYW5kIExvd2VyIFRlc3RlciBwZXJmb3JtIHBoYXNlIDIgb2YgdGhlIFBhc3NrZXkgRW50cnkgcGFpcmluZyBwcm9jZWR1cmUgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIHRoZSBMVEsgZ2VuZXJhdGVkIGluIHBoYXNlIDIuCi0gICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xMCkpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9TTEEvU0NQSy9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iUGFzc2tleSBFbnRyeSwgSVVUIFJlc3BvbmRlciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBTdWNjZXNzIikKLSAgICBkZWYgdGVzdF9wYXNza2V5X2VudHJ5X2l1dF9yZXNwb25kZXJfc2VjdXJlX2Nvbm5lY3Rpb25zKHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgc3VwcG9ydGluZyBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBQYXNza2V5IEVudHJ5IHBhaXJpbmcgcHJvY2VkdXJlIGNvcnJlY3RseSB3aGVuIGFjdGluZyBhcyBwZXJpcGhlcmFsLCByZXNwb25kZXIuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9wcmVwYXJlX2R1dF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoRElTUExBWV9PTkxZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9ESVNQTEFZKQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMobWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSkKLQotICAgICAgICAjIDEuIExvd2VyIFRlc3RlciB0cmFuc21pdHMgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aDoKLSAgICAgICAgIyBhLiBJTyBjYXBhYmlsaXR5IHNldCB0byDigJxLZXlib2FyZERpc3BsYXnigJ0KLSAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAwIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBub3QgcHJlc2VudCkKLSAgICAgICAgIyBjLiBBdXRoUmVxIGJvbmRpbmcgZmxhZyBzZXQgdG8gdGhlIHZhbHVlIGluZGljYXRlZCBpbiB0aGUgSVhJVCBbN10gZm9yIOKAmEJvbmRpbmcgRmxhZ3PigJksIGFuZCB0aGUgTUlUTSBmbGFnIHNldCB0byDigJgx4oCZIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScgYW5kIGFsbCByZXNlcnZlZCBiaXRzIGFyZSBzZXQgdG8g4oCYMOKAmQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMi4gSVVUIHJlc3BvbmRzIHdpdGggYSBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQsIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gY2FwYWJpbGl0eSBzZXQgdG8g4oCcS2V5Ym9hcmRPbmx54oCdIG9yIOKAnEtleWJvYXJkRGlzcGxheeKAnSBvciDigJxEaXNwbGF5WWVzTm/igJ0gb3Ig4oCcRGlzcGxheU9ubHnigJ0KLSAgICAgICAgIyBiLiBTZWN1cmUgQ29ubmVjdGlvbnMgZmxhZyBzZXQgdG8gJzEnLiBLZXlwcmVzcyBiaXQgaXMgc2V0IHRvICcxJyBpZiBzdXBwb3J0ZWQgYnkgSVVUCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMy4gRHVyaW5nIHRoZSBwaGFzZSAyIHBhc3NrZXkgcGFpcmluZyBwcm9jZXNzLCBMb3dlciBUZXN0ZXIgZGlzcGxheXMgdGhlIDYtZGlnaXQgcGFzc2tleSB3aGlsZSB0aGUgSVVUIHByb21wdHMgdXNlciB0byBlbnRlciB0aGUgNi1kaWdpdCBwYXNza2V5LiBJZiB0aGUgSU8gY2FwYWJpbGl0aWVzIG9mIHRoZSBJVVQgYXJlIOKAnERpc3BsYXlZZXNOb+KAnSBvciDigJxEaXNwbGF5T25seeKAnSB0aGUgSVVUIGRpc3BsYXlzIHRoZSA2LWRpZ2l0IHBhc3NrZXkgd2hpbGUgdGhlIExvd2VyIFRlc3RlciBlbnRlcnMgdGhlIDYtZGlnaXQgcGFzc2tleS4gSWYgS2V5cHJlc3MgYml0IGlzIHNldCwgcGFpcmluZyBrZXlwcmVzcyBub3RpZmljYXRpb25zIGFyZSBzZW5kIGJ5IHRoZSBJVVQKLSAgICAgICAgcGFzc2tleSA9IHNlbGYuZHV0X3NlY3VyaXR5LndhaXRfZm9yX3VpX2V2ZW50X3Bhc3NrZXkoKQotCi0gICAgICAgIGlmIHBhc3NrZXkgPT0gMDoKLSAgICAgICAgICAgIHByaW50KCJQYXNza2V5IGRpZCBub3QgYXJyaXZlIGludG8gdGVzdCIpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFTU0tFWV9FTlRSWSwgc2VsZi5kdXRfYWRkcmVzcykpCi0KLSAgICAgICAgIyA0LiBJVVQgYW5kIExvd2VyIFRlc3RlciB1c2UgdGhlIHNhbWUgcHJlLWRlZmluZWQgNi1kaWdpdCBwYXNza2V5LgotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQVNTS0VZLCBudW1lcmljX3ZhbHVlPXBhc3NrZXksIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuZHV0X2FkZHJlc3MpKQotCi0gICAgICAgICMgNS4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBMRSBwYWlyaW5nIGFuZCBlc3RhYmxpc2ggYW4gZW5jcnlwdGVkIGxpbmsgd2l0aCB0aGUgTFRLIGdlbmVyYXRlZCBpbiBwaGFzZSAyLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MTApKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iU00vU0xBL1NDUEsvQlYtMDMtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IlBhc3NrZXkgRW50cnksIElVVCBSZXNwb25kZXIsIFNlY3VyZSBDb25uZWN0aW9ucyDigJMgSGFuZGxlIEF1dGhSZXEgRmxhZyBSRlUgQ29ycmVjdGx5IikKLSAgICBkZWYgdGVzdF9wYXNza2V5X2VudHJ5X2l1dF9yZXNwb25kZXJfc2VjdXJlX2Nvbm5lY3Rpb25zX2F1dGhfcmVxX3JmdShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHN1cHBvcnRpbmcgTEUgU2VjdXJlIENvbm5lY3Rpb25zIGlzIGFibGUgdG8gcGVyZm9ybSB0aGUgUGFzc2tleSBFbnRyeSBwYWlyaW5nIHByb2NlZHVyZSB3aGVuIHJlY2VpdmluZyBhZGRpdGlvbmFsIGJpdHMgc2V0IGluIHRoZSBBdXRoUmVxIGZsYWcuIFJlc2VydmVkIEZvciBGdXR1cmUgVXNlIGJpdHMgYXJlIGNvcnJlY3RseSBoYW5kbGVkIHdoZW4gYWN0aW5nIGFzIHBlcmlwaGVyYWwsIHJlc3BvbmRlci4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3ByZXBhcmVfZHV0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9PTkxZKQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShESVNQTEFZX09OTFkpCi0gICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9OT1RfUFJFU0VOVCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhtaXRtPTEsIHNlY3VyZV9jb25uZWN0aW9ucz0xLCByZXNlcnZlZF9iaXRzPTMpCi0KLSAgICAgICAgIyAxLiBMb3dlciBUZXN0ZXIgdHJhbnNtaXRzIFBhaXJpbmcgUmVxdWVzdCBjb21tYW5kIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8g4oCdS2V5Ym9hcmRPbmx54oCdCi0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gTUlUTSBzZXQgdG8g4oCYMeKAmSBhbmQgYWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byBhIHJhbmRvbSB2YWx1ZQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMi4gSVVUIHJlc3BvbmRzIHdpdGggYSBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQsIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8g4oCcS2V5Ym9hcmRPbmx54oCdIG9yIOKAnERpc3BsYXlPbmx54oCdCi0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgw4oCZCi0gICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFJUklOR19QUk9NUFQsIGJvb2xlYW49VHJ1ZSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgIHBhc3NrZXkgPSBzZWxmLmNlcnRfc2VjdXJpdHkud2FpdF9mb3JfdWlfZXZlbnRfcGFzc2tleSgpCi0KLSAgICAgICAgaWYgcGFzc2tleSA9PSAwOgotICAgICAgICAgICAgcHJpbnQoIlBhc3NrZXkgZGlkIG5vdCBhcnJpdmUgaW50byB0ZXN0IikKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBU1NLRVlfRU5UUlksIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZW5kVWlDYWxsYmFjaygKLSAgICAgICAgICAgIFVpQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBU1NLRVksIG51bWVyaWNfdmFsdWU9cGFzc2tleSwgdW5pcXVlX2lkPTEsIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMy4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBQYXNza2V5IEVudHJ5IHBhaXJpbmcgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIHRoZSBnZW5lcmF0ZWQgTFRLLgotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MTApKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iU00vTUFTL1NDUEsvQlYtMDQtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9IlBhc3NrZXkgRW50cnksIElVVCBJbml0aWF0b3IsIFNlY3VyZSBDb25uZWN0aW9ucyDigJMgSGFuZGxlIEF1dGhSZXEgRmxhZyBSRlUgQ29ycmVjdGx5IikKLSAgICBkZWYgdGVzdF9wYXNza2V5X2VudHJ5X2l1dF9pbml0aWF0b3Jfc2VjdXJlX2Nvbm5lY3Rpb25zX2F1dGhfcmVxX3JmdShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHN1cHBvcnRpbmcgTEUgU2VjdXJlIENvbm5lY3Rpb25zIGlzIGFibGUgdG8gcGVyZm9ybSB0aGUgUGFzc2tleSBFbnRyeSBwYWlyaW5nIHByb2NlZHVyZSB3aGVuIHJlY2VpdmluZyBhZGRpdGlvbmFsIGJpdHMgc2V0IGluIHRoZSBBdXRoUmVxIGZsYWcuIFJlc2VydmVkIEZvciBGdXR1cmUgVXNlIGJpdHMgYXJlIGNvcnJlY3RseSBoYW5kbGVkIHdoZW4gYWN0aW5nIGFzIGNlbnRyYWwsIGluaXRpYXRvci4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3ByZXBhcmVfY2VydF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfRElTUExBWSkKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfTk9UX1BSRVNFTlQpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhzZWN1cmVfY29ubmVjdGlvbnM9MSkKLQotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfT05MWSkKLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX05PVF9QUkVTRU5UKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKG1pdG09MSwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEsIHJlc2VydmVkX2JpdHM9MykKLQotICAgICAgICAjIDEuIElVVCB0cmFuc21pdHMgYSBQYWlyaW5nIFJlcXVlc3QgY29tbWFuZCB3aXRoOgotICAgICAgICAjIGEuIElPIENhcGFiaWxpdHkgc2V0IHRvIOKAnERpc3BsYXlPbmx54oCdIG9yIOKAnERpc3BsYXlZZXNOb+KAnSBvciDigJxLZXlib2FyZE9ubHnigJ0gb3Ig4oCcS2V5Ym9hcmREaXNwbGF54oCdCi0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQWxsIHJlc2VydmVkIGJpdHMgYXJlIHNldCB0byDigJgw4oCZLgotICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5DcmVhdGVCb25kTGUoc2VsZi5jZXJ0X2FkZHJlc3MpCi0KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuVWlNc2coVWlNc2dUeXBlLkRJU1BMQVlfUEFJUklOR19QUk9NUFQsIHNlbGYuZHV0X2FkZHJlc3MpKQotCi0gICAgICAgICMgMi4gTG93ZXIgVGVzdGVyIHJlc3BvbmRzIHdpdGggYSBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQsIHdpdGg6Ci0gICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8g4oCcS2V5Ym9hcmRPbmx54oCdCi0gICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMCAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IHByZXNlbnQpCi0gICAgICAgICMgYy4gQXV0aFJlcSBib25kaW5nIGZsYWcgc2V0IHRvIHRoZSB2YWx1ZSBpbmRpY2F0ZWQgaW4gdGhlIElYSVQgWzddIGZvciDigJhCb25kaW5nIEZsYWdz4oCZIGFuZCB0aGUgTUlUTSBmbGFnIHNldCB0byDigJgx4oCZIGFuZCBhbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIGEgcmFuZG9tIHZhbHVlLgotICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICBVaUNhbGxiYWNrTXNnKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQUlSSU5HX1BST01QVCwgYm9vbGVhbj1UcnVlLCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfdWlfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZX0VOVFJZLCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICBwYXNza2V5ID0gc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9mb3JfdWlfZXZlbnRfcGFzc2tleSgpCi0KLSAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGU9VWlDYWxsYmFja1R5cGUuUEFTU0tFWSwgbnVtZXJpY192YWx1ZT1wYXNza2V5LCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAjIDMuICAgIElVVCBhbmQgTG93ZXIgVGVzdGVyIHBlcmZvcm0gcGhhc2UgMiBvZiB0aGUgSnVzdCBXb3JrcyBwYWlyaW5nIGFuZCBlc3RhYmxpc2ggYW4gZW5jcnlwdGVkIGxpbmsgd2l0aCB0aGUgZ2VuZXJhdGVkIExUSy4KLSAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLkJvbmRNc2coQm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCwgc2VsZi5jZXJ0X2FkZHJlc3MpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTEwKSkKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IlNNL01BUy9TQ09CL0JWLTAxLUMiLCBwdHNfdGVzdF9uYW1lPSJPdXQgb2YgQmFuZCwgSVVUIEluaXRpYXRvciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBTdWNjZXNzIikKLSAgICBkZWYgdGVzdF9vdXRfb2ZfYmFuZF9pdXRfaW5pdGlhdG9yX3NlY3VyZV9jb25uZWN0aW9ucyhzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHN1cHBvcnRpbmcgTEUgU2VjdXJlIENvbm5lY3Rpb25zIHBlcmZvcm1zIHRoZSBPdXQtb2YtQmFuZCBwYWlyaW5nIHByb2NlZHVyZSBjb3JyZWN0bHkgYXMgY2VudHJhbCwgaW5pdGlhdG9yLgotICAgICAgICAiIiIKLQotICAgICAgICBvb2JfY29tYmluYXRpb25zID0gWyhPT0JfTk9UX1BSRVNFTlQsIE9PQl9QUkVTRU5UKSwgKE9PQl9QUkVTRU5ULCBPT0JfTk9UX1BSRVNFTlQpLCAoT09CX1BSRVNFTlQsIE9PQl9QUkVTRU5UKV0KLQotICAgICAgICBmb3IgKGR1dF9vb2JfZmxhZywgY2VydF9vb2JfZmxhZykgaW4gb29iX2NvbWJpbmF0aW9uczoKLSAgICAgICAgICAgIHByaW50KCJvb2IgZmxhZyBjb21iaW5hdGlvbiBkdXQ6ICIgKyBzdHIoZHV0X29vYl9mbGFnKSArICIsIGNlcnQ6ICIgKyBzdHIoY2VydF9vb2JfZmxhZykpCi0KLSAgICAgICAgICAgIHNlbGYuX3ByZXBhcmVfY2VydF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgICAgIGlmIGR1dF9vb2JfZmxhZyA9PSBMZU9vYkRhdGFGbGFnLlBSRVNFTlQ6Ci0gICAgICAgICAgICAgICAgb29iZGF0YSA9IHNlbGYuY2VydC5zZWN1cml0eS5HZXRMZU91dE9mQmFuZERhdGEoZW1wdHlfcHJvdG8uRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRPdXRPZkJhbmREYXRhKAotICAgICAgICAgICAgICAgICAgICBPb2JEYXRhTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25fdmFsdWU9b29iZGF0YS5jb25maXJtYXRpb25fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fdmFsdWU9b29iZGF0YS5yYW5kb21fdmFsdWUpKQotCi0gICAgICAgICAgICBpZiBjZXJ0X29vYl9mbGFnID09IExlT29iRGF0YUZsYWcuUFJFU0VOVDoKLSAgICAgICAgICAgICAgICBvb2JkYXRhID0gc2VsZi5kdXQuc2VjdXJpdHkuR2V0TGVPdXRPZkJhbmREYXRhKGVtcHR5X3Byb3RvLkVtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldE91dE9mQmFuZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIE9vYkRhdGFNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1zZWxmLmR1dF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uX3ZhbHVlPW9vYmRhdGEuY29uZmlybWF0aW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX3ZhbHVlPW9vYmRhdGEucmFuZG9tX3ZhbHVlKSkKLQotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfT05MWSkKLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoZHV0X29vYl9mbGFnKQotICAgICAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKGJvbmQ9MSwgbWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSkKLQotICAgICAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KERJU1BMQVlfT05MWSkKLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KGNlcnRfb29iX2ZsYWcpCi0gICAgICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKGJvbmQ9MSwgbWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSkKLQotICAgICAgICAgICAgIyAxLiBJVVQgdHJhbnNtaXRzIGEgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aCBPT0IgZGF0YSBmbGFnIHNldCB0byBlaXRoZXIgMHgwMCBvciAweDAxLCBhbmQgU2VjdXJlIENvbm5lY3Rpb25zIGZsYWcgc2V0IHRvICcxJy4KLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmNlcnRfYWRkcmVzcykKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAgICAgIyAyLiBMb3dlciBUZXN0ZXIgcmVzcG9uZHMgd2l0aCBhIFBhaXJpbmcgUmVzcG9uc2UgY29tbWFuZCB3aXRoIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScgYW5kIE9PQiBkYXRhIGZsYWcgc2V0IHRvIGVpdGhlciAweDAwIG9yIDB4MDEuCi0gICAgICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBSVJJTkdfUFJPTVBULCBib29sZWFuPVRydWUsIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuZHV0X2FkZHJlc3MpKQotCi0gICAgICAgICAgICAjIDMuIElVVCB1c2VzIHRoZSAxMjgtYml0IHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgTG93ZXIgVGVzdGVyIGFzIHRoZSBjb25maXJtIHZhbHVlLiBTaW1pbGFybHksIHRoZSBMb3dlciBUZXN0ZXIgdXNlcyB0aGUgMTI4LWJpdCB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIElVVCBhcyB0aGUgY29uZmlybSB2YWx1ZS4KLQotICAgICAgICAgICAgIyA0LiBJVVQgYW5kIExvd2VyIFRlc3RlciBwZXJmb3JtIHBoYXNlIDIgb2YgdGhlIHBhaXJpbmcgcHJvY2VzcyBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggYW4gTFRLIGdlbmVyYXRlZCB1c2luZyB0aGUgT09CIGRhdGEgaW4gcGhhc2UgMi4KLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MTApKQotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuZHV0X2FkZHJlc3MpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTEwKSkKLQotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuUmVtb3ZlQm9uZChzZWxmLmNlcnRfYWRkcmVzcykKLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5SZW1vdmVCb25kKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9kZXZpY2VfZGlzY29ubmVjdChzZWxmLmNlcnRfYWRkcmVzcykKLSAgICAgICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2RldmljZV9kaXNjb25uZWN0KHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICBAbWV0YWRhdGEoCi0gICAgICAgIHB0c190ZXN0X2lkPSJTTS9TTEEvU0NPQi9CVi0wMi1DIiwgcHRzX3Rlc3RfbmFtZT0iT3V0IG9mIEJhbmQsIElVVCBSZXNwb25kZXIsIFNlY3VyZSBDb25uZWN0aW9ucyDigJMgU3VjY2VzcyIpCi0gICAgZGVmIHRlc3Rfb3V0X29mX2JhbmRfaXV0X3Jlc3BvbmRlcl9zZWN1cmVfY29ubmVjdGlvbnMoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIElVVCBzdXBwb3J0aW5nIExFIFNlY3VyZSBDb25uZWN0aW9ucyBpcyBhYmxlIHRvIHBlcmZvcm0gdGhlIE91dC1vZi1CYW5kIHBhaXJpbmcgcHJvY2VkdXJlIGNvcnJlY3RseSB3aGVuIGFjdGluZyBhcyBwZXJpcGhlcmFsLCByZXNwb25kZXIuCi0gICAgICAgICIiIgotCi0gICAgICAgIG9vYl9jb21iaW5hdGlvbnMgPSBbKE9PQl9OT1RfUFJFU0VOVCwgT09CX1BSRVNFTlQpLCAoT09CX1BSRVNFTlQsIE9PQl9OT1RfUFJFU0VOVCksIChPT0JfUFJFU0VOVCwgT09CX1BSRVNFTlQpXQotCi0gICAgICAgIGZvciAoZHV0X29vYl9mbGFnLCBjZXJ0X29vYl9mbGFnKSBpbiBvb2JfY29tYmluYXRpb25zOgotICAgICAgICAgICAgcHJpbnQoIm9vYiBmbGFnIGNvbWJpbmF0aW9uIGR1dDogIiArIHN0cihkdXRfb29iX2ZsYWcpICsgIiwgY2VydDogIiArIHN0cihjZXJ0X29vYl9mbGFnKSkKLQotICAgICAgICAgICAgc2VsZi5fcHJlcGFyZV9kdXRfZm9yX2Nvbm5lY3Rpb24oKQotCi0gICAgICAgICAgICBpZiBkdXRfb29iX2ZsYWcgPT0gTGVPb2JEYXRhRmxhZy5QUkVTRU5UOgotICAgICAgICAgICAgICAgIG9vYmRhdGEgPSBzZWxmLmNlcnQuc2VjdXJpdHkuR2V0TGVPdXRPZkJhbmREYXRhKGVtcHR5X3Byb3RvLkVtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0T3V0T2ZCYW5kRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgT29iRGF0YU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzPXNlbGYuY2VydF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uX3ZhbHVlPW9vYmRhdGEuY29uZmlybWF0aW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX3ZhbHVlPW9vYmRhdGEucmFuZG9tX3ZhbHVlKSkKLQotICAgICAgICAgICAgaWYgY2VydF9vb2JfZmxhZyA9PSBMZU9vYkRhdGFGbGFnLlBSRVNFTlQ6Ci0gICAgICAgICAgICAgICAgb29iZGF0YSA9IHNlbGYuZHV0LnNlY3VyaXR5LkdldExlT3V0T2ZCYW5kRGF0YShlbXB0eV9wcm90by5FbXB0eSgpKQotICAgICAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRPdXRPZkJhbmREYXRhKAotICAgICAgICAgICAgICAgICAgICBPb2JEYXRhTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbl92YWx1ZT1vb2JkYXRhLmNvbmZpcm1hdGlvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV92YWx1ZT1vb2JkYXRhLnJhbmRvbV92YWx1ZSkpCi0KLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KEtFWUJPQVJEX09OTFkpCi0gICAgICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KGR1dF9vb2JfZmxhZykKLSAgICAgICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhib25kPTEsIG1pdG09MSwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEpCi0KLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShESVNQTEFZX09OTFkpCi0gICAgICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChjZXJ0X29vYl9mbGFnKQotICAgICAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhib25kPTEsIG1pdG09MSwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEpCi0KLSAgICAgICAgICAgICMgMS4gTG93ZXIgVGVzdGVyIHRyYW5zbWl0cyBhIFBhaXJpbmcgUmVxdWVzdCBjb21tYW5kIHdpdGggT09CIGRhdGEgZmxhZyBzZXQgdG8gZWl0aGVyIDB4MDAgb3IgMHgwMSwgYW5kIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIHNldCB0byAnMScuCi0gICAgICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuQ3JlYXRlQm9uZExlKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgICAgICMgMi4gSVVUIHJlc3BvbmRzIHdpdGggYSBQYWlyaW5nIFJlc3BvbnNlIGNvbW1hbmQgd2l0aCBTZWN1cmUgQ29ubmVjdGlvbnMgZmxhZyBzZXQgdG8gJzEnIGFuZCBPT0IgZGF0YSBmbGFnIHNldCB0byBlaXRoZXIgMHgwMCBvciAweDAxLgotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBSVJJTkdfUFJPTVBULCBib29sZWFuPVRydWUsIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAgICAgIyAzLiBJVVQgdXNlcyB0aGUgMTI4LWJpdCB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIExvd2VyIFRlc3RlciBhcyB0aGUgY29uZmlybSB2YWx1ZS4gU2ltaWxhcmx5LCB0aGUgTG93ZXIgVGVzdGVyIHVzZXMgdGhlIDEyOC1iaXQgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBJVVQgYXMgdGhlIGNvbmZpcm0gdmFsdWUuCi0KLSAgICAgICAgICAgICMgNC4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBwYWlyaW5nIHByb2Nlc3MgYW5kIGVzdGFibGlzaCBhbiBlbmNyeXB0ZWQgbGluayB3aXRoIGFuIExUSyBnZW5lcmF0ZWQgdXNpbmcgdGhlIE9PQiBkYXRhIGluIHBoYXNlIDIuCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuZHV0X2FkZHJlc3MpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTEwKSkKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xMCkpCi0KLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5SZW1vdmVCb25kKHNlbGYuZHV0X2FkZHJlc3MpCi0gICAgICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5SZW1vdmVCb25kKHNlbGYuY2VydF9hZGRyZXNzKQotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF9ib25kX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLkJvbmRNc2coQm9uZE1zZ1R5cGUuREVWSUNFX1VOQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2RldmljZV9kaXNjb25uZWN0KHNlbGYuZHV0X2FkZHJlc3MpCi0gICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS53YWl0X2RldmljZV9kaXNjb25uZWN0KHNlbGYuY2VydF9hZGRyZXNzKQotCi0gICAgQG1ldGFkYXRhKAotICAgICAgICBwdHNfdGVzdF9pZD0iU00vU0xBL1NDT0IvQlYtMDMtQyIsCi0gICAgICAgIHB0c190ZXN0X25hbWU9Ik91dCBvZiBCYW5kLCBJVVQgUmVzcG9uZGVyLCBTZWN1cmUgQ29ubmVjdGlvbnMg4oCTIEhhbmRsZSBBdXRoUmVxIEZsYWcgUkZVIENvcnJlY3RseSIpCi0gICAgZGVmIHRlc3Rfb3V0X29mX2JhbmRfaXV0X3Jlc3BvbmRlcl9zZWN1cmVfY29ubmVjdGlvbnNfYXV0aF9yZXFfcmZ1KHNlbGYpOgotICAgICAgICAiIiIKLSAgICAgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBJVVQgc3VwcG9ydGluZyBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSBPdXQtb2YtQmFuZCBwYWlyaW5nIHByb2NlZHVyZSB3aGVuIHJlY2VpdmluZyBhZGRpdGlvbmFsIGJpdHMgc2V0IGluIHRoZSBBdXRoUmVxIGZsYWcuIFJlc2VydmVkIEZvciBGdXR1cmUgVXNlIGJpdHMgYXJlIGNvcnJlY3RseSBoYW5kbGVkIHdoZW4gYWN0aW5nIGFzIHBlcmlwaGVyYWwsIHJlc3BvbmRlci4KLSAgICAgICAgIiIiCi0KLSAgICAgICAgcmVzZXJ2ZWRfYml0c19jb21iaW5hdGlvbnMgPSBbMSwgMiwgM10KLQotICAgICAgICBmb3IgcmVzZXJ2ZWRfYml0cyBpbiByZXNlcnZlZF9iaXRzX2NvbWJpbmF0aW9uczoKLSAgICAgICAgICAgIHByaW50KCJyZXNlcnZlZCBiaXRzIGluIGNlcnQgZHV0OiAiICsgc3RyKHJlc2VydmVkX2JpdHMpKQotCi0gICAgICAgICAgICBzZWxmLl9wcmVwYXJlX2R1dF9mb3JfY29ubmVjdGlvbigpCi0KLSAgICAgICAgICAgIG9vYmRhdGEgPSBzZWxmLmNlcnQuc2VjdXJpdHkuR2V0TGVPdXRPZkJhbmREYXRhKGVtcHR5X3Byb3RvLkVtcHR5KCkpCi0gICAgICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRPdXRPZkJhbmREYXRhKAotICAgICAgICAgICAgICAgIE9vYkRhdGFNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzPXNlbGYuY2VydF9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25fdmFsdWU9b29iZGF0YS5jb25maXJtYXRpb25fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIHJhbmRvbV92YWx1ZT1vb2JkYXRhLnJhbmRvbV92YWx1ZSkpCi0KLSAgICAgICAgICAgIG9vYmRhdGEgPSBzZWxmLmR1dC5zZWN1cml0eS5HZXRMZU91dE9mQmFuZERhdGEoZW1wdHlfcHJvdG8uRW1wdHkoKSkKLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRPdXRPZkJhbmREYXRhKAotICAgICAgICAgICAgICAgIE9vYkRhdGFNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzPXNlbGYuZHV0X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbl92YWx1ZT1vb2JkYXRhLmNvbmZpcm1hdGlvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgcmFuZG9tX3ZhbHVlPW9vYmRhdGEucmFuZG9tX3ZhbHVlKSkKLQotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoS0VZQk9BUkRfT05MWSkKLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX1BSRVNFTlQpCi0gICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5TZXRMZUF1dGhSZXF1aXJlbWVudHMoYm9uZD0xLCBtaXRtPTAsIHNlY3VyZV9jb25uZWN0aW9ucz0xKQotCi0gICAgICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2V0TGVJb0NhcGFiaWxpdHkoRElTUExBWV9PTkxZKQotICAgICAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlT29iRGF0YVByZXNlbnQoT09CX1BSRVNFTlQpCi0gICAgICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuU2V0TGVBdXRoUmVxdWlyZW1lbnRzKGJvbmQ9MSwgbWl0bT0xLCBzZWN1cmVfY29ubmVjdGlvbnM9MSwgcmVzZXJ2ZWRfYml0cz1yZXNlcnZlZF9iaXRzKQotCi0gICAgICAgICAgICAjIDEuIExvd2VyIFRlc3RlciB0cmFuc21pdHMgUGFpcmluZyBSZXF1ZXN0IGNvbW1hbmQgd2l0aDoKLSAgICAgICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8gYW55IElPIGNhcGFiaWxpdHkKLSAgICAgICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMSAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgZnJvbSByZW1vdGUgZGV2aWNlIHByZXNlbnQpCi0gICAgICAgICAgICAjIGMuIE1JVE0gc2V0IHRvIOKAmDDigJksIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIGlzIHNldCB0byAnMScsIGFuZCBhbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIGEgcmFuZG9tIHZhbHVlLgotICAgICAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmR1dF9hZGRyZXNzKQotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuZHV0X3NlY3VyaXR5LmdldF91aV9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5VaU1zZyhVaU1zZ1R5cGUuRElTUExBWV9QQUlSSU5HX1BST01QVCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICAgICAjIDIuIElVVCByZXNwb25kcyB3aXRoIGEgUGFpcmluZyBSZXNwb25zZSBjb21tYW5kLCB3aXRoOgotICAgICAgICAgICAgIyBhLiBJTyBDYXBhYmlsaXR5IHNldCB0byBhbnkgSU8gY2FwYWJpbGl0eQotICAgICAgICAgICAgIyBiLiBPT0IgZGF0YSBmbGFnIHNldCB0byAweDAxIChPT0IgQXV0aGVudGljYXRpb24gZGF0YSBwcmVzZW50KQotICAgICAgICAgICAgIyBjLiBTZWN1cmUgQ29ubmVjdGlvbnMgZmxhZyBpcyBzZXQgdG8gJzEnLCBBbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDDigJkKLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNlbmRVaUNhbGxiYWNrKAotICAgICAgICAgICAgICAgIFVpQ2FsbGJhY2tNc2coCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1VaUNhbGxiYWNrVHlwZS5QQUlSSU5HX1BST01QVCwgYm9vbGVhbj1UcnVlLCB1bmlxdWVfaWQ9MSwgYWRkcmVzcz1zZWxmLmNlcnRfYWRkcmVzcykpCi0KLSAgICAgICAgICAgICMgMy4gSVVUIGFuZCBMb3dlciBUZXN0ZXIgcGVyZm9ybSBwaGFzZSAyIG9mIHRoZSBPT0IgYXV0aGVudGljYXRlZCBwYWlyaW5nIGFuZCBlc3RhYmxpc2ggYW4gZW5jcnlwdGVkIGxpbmsgd2l0aCB0aGUgZ2VuZXJhdGVkIExUSy4KLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmR1dF9hZGRyZXNzKSwgdGltZW91dD10aW1lZGVsdGEoc2Vjb25kcz0xMCkpCi0KLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MTApKQotCi0gICAgICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuUmVtb3ZlQm9uZChzZWxmLmR1dF9hZGRyZXNzKQotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuUmVtb3ZlQm9uZChzZWxmLmNlcnRfYWRkcmVzcykKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9VTkJPTkRFRCwgc2VsZi5jZXJ0X2FkZHJlc3MpKQotCi0gICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS53YWl0X2RldmljZV9kaXNjb25uZWN0KHNlbGYuY2VydF9hZGRyZXNzKQotICAgICAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LndhaXRfZGV2aWNlX2Rpc2Nvbm5lY3Qoc2VsZi5kdXRfYWRkcmVzcykKLQotICAgIEBtZXRhZGF0YSgKLSAgICAgICAgcHRzX3Rlc3RfaWQ9IlNNL01BUy9TQ09CL0JWLTA0LUMiLAotICAgICAgICBwdHNfdGVzdF9uYW1lPSJPdXQgb2YgQmFuZCwgSVVUIEluaXRpYXRvciwgU2VjdXJlIENvbm5lY3Rpb25zIOKAkyBIYW5kbGUgQXV0aFJlcSBGbGFnIFJGVSBDb3JyZWN0bHkiKQotICAgIGRlZiB0ZXN0X291dF9vZl9iYW5kX2l1dF9pbml0aWF0b3Jfc2VjdXJlX2Nvbm5lY3Rpb25zX2F1dGhfcmVxX3JmdShzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBWZXJpZnkgdGhhdCB0aGUgSVVUIHN1cHBvcnRpbmcgTEUgU2VjdXJlIENvbm5lY3Rpb25zIGlzIGFibGUgdG8gcGVyZm9ybSB0aGUgT3V0LW9mLUJhbmQgcGFpcmluZyBwcm9jZWR1cmUgd2hlbiByZWNlaXZpbmcgYWRkaXRpb25hbCBiaXRzIHNldCBpbiB0aGUgQXV0aFJlcSBmbGFnLiBSZXNlcnZlZCBGb3IgRnV0dXJlIFVzZSBiaXRzIGFyZSBjb3JyZWN0bHkgaGFuZGxlZCB3aGVuIGFjdGluZyBhcyBjZW50cmFsLCBpbml0aWF0b3IuCi0gICAgICAgICIiIgotCi0gICAgICAgIHJlc2VydmVkX2JpdHNfY29tYmluYXRpb25zID0gWzEsIDIsIDNdCi0KLSAgICAgICAgZm9yIHJlc2VydmVkX2JpdHMgaW4gcmVzZXJ2ZWRfYml0c19jb21iaW5hdGlvbnM6Ci0gICAgICAgICAgICBwcmludCgicmVzZXJ2ZWQgYml0cyBpbiBjZXJ0IGR1dDogIiArIHN0cihyZXNlcnZlZF9iaXRzKSkKLQotICAgICAgICAgICAgc2VsZi5fcHJlcGFyZV9jZXJ0X2Zvcl9jb25uZWN0aW9uKCkKLQotICAgICAgICAgICAgb29iZGF0YSA9IHNlbGYuY2VydC5zZWN1cml0eS5HZXRMZU91dE9mQmFuZERhdGEoZW1wdHlfcHJvdG8uRW1wdHkoKSkKLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LlNldE91dE9mQmFuZERhdGEoCi0gICAgICAgICAgICAgICAgT29iRGF0YU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M9c2VsZi5jZXJ0X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbl92YWx1ZT1vb2JkYXRhLmNvbmZpcm1hdGlvbl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgcmFuZG9tX3ZhbHVlPW9vYmRhdGEucmFuZG9tX3ZhbHVlKSkKLQotICAgICAgICAgICAgb29iZGF0YSA9IHNlbGYuZHV0LnNlY3VyaXR5LkdldExlT3V0T2ZCYW5kRGF0YShlbXB0eV9wcm90by5FbXB0eSgpKQotICAgICAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldE91dE9mQmFuZERhdGEoCi0gICAgICAgICAgICAgICAgT29iRGF0YU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M9c2VsZi5kdXRfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uX3ZhbHVlPW9vYmRhdGEuY29uZmlybWF0aW9uX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICByYW5kb21fdmFsdWU9b29iZGF0YS5yYW5kb21fdmFsdWUpKQotCi0gICAgICAgICAgICBzZWxmLmR1dC5zZWN1cml0eS5TZXRMZUlvQ2FwYWJpbGl0eShLRVlCT0FSRF9PTkxZKQotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVPb2JEYXRhUHJlc2VudChPT0JfUFJFU0VOVCkKLSAgICAgICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhib25kPTEsIG1pdG09MCwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEsIHJlc2VydmVkX2JpdHM9MCkKLQotICAgICAgICAgICAgc2VsZi5jZXJ0LnNlY3VyaXR5LlNldExlSW9DYXBhYmlsaXR5KERJU1BMQVlfT05MWSkKLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5TZXRMZU9vYkRhdGFQcmVzZW50KE9PQl9QUkVTRU5UKQotICAgICAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LlNldExlQXV0aFJlcXVpcmVtZW50cyhib25kPTEsIG1pdG09MSwgc2VjdXJlX2Nvbm5lY3Rpb25zPTEsIHJlc2VydmVkX2JpdHM9cmVzZXJ2ZWRfYml0cykKLQotICAgICAgICAgICAgIyAxLiBJVVQgdHJhbnNtaXRzIFBhaXJpbmcgUmVxdWVzdCBjb21tYW5kIHdpdGg6Ci0gICAgICAgICAgICAjIGEuIElPIENhcGFiaWxpdHkgc2V0IHRvIGFueSBJTyBjYXBhYmlsaXR5Ci0gICAgICAgICAgICAjIGIuIE9PQiBkYXRhIGZsYWcgc2V0IHRvIDB4MDEgKE9PQiBBdXRoZW50aWNhdGlvbiBkYXRhIHByZXNlbnQpCi0gICAgICAgICAgICAjIGMuIE1JVE0gc2V0IHRvIOKAmDDigJksIFNlY3VyZSBDb25uZWN0aW9ucyBmbGFnIGlzIHNldCB0byAnMScsIGFuZCBhbGwgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0IHRvIOKAmDDigJkKLSAgICAgICAgICAgIHNlbGYuZHV0LnNlY3VyaXR5LkNyZWF0ZUJvbmRMZShzZWxmLmNlcnRfYWRkcmVzcykKLQotICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X3VpX3N0cmVhbSgpKS5lbWl0cygKLSAgICAgICAgICAgICAgICBTZWN1cml0eU1hdGNoZXJzLlVpTXNnKFVpTXNnVHlwZS5ESVNQTEFZX1BBSVJJTkdfUFJPTVBULCBzZWxmLmR1dF9hZGRyZXNzKSkKLQotICAgICAgICAgICAgIyAyLiBMb3dlciBUZXN0ZXIgcmVzcG9uZHMgd2l0aCBhIFBhaXJpbmcgUmVzcG9uc2UgY29tbWFuZCwgd2l0aDoKLSAgICAgICAgICAgICMgYS4gSU8gQ2FwYWJpbGl0eSBzZXQgdG8gYW55IElPIGNhcGFiaWxpdHkKLSAgICAgICAgICAgICMgYi4gT09CIGRhdGEgZmxhZyBzZXQgdG8gMHgwMSAoT09CIEF1dGhlbnRpY2F0aW9uIGRhdGEgcHJlc2VudCkKLSAgICAgICAgICAgICMgYy4gU2VjdXJlIENvbm5lY3Rpb25zIGZsYWcgaXMgc2V0IHRvICcxJywgYW5kIGFsbCByZXNlcnZlZCBiaXRzIGFyZSBzZXQgdG8gYSByYW5kb20gdmFsdWUuCi0gICAgICAgICAgICBzZWxmLmNlcnQuc2VjdXJpdHkuU2VuZFVpQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgVWlDYWxsYmFja01zZygKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlPVVpQ2FsbGJhY2tUeXBlLlBBSVJJTkdfUFJPTVBULCBib29sZWFuPVRydWUsIHVuaXF1ZV9pZD0xLCBhZGRyZXNzPXNlbGYuZHV0X2FkZHJlc3MpKQotCi0gICAgICAgICAgICAjIDMuIElVVCBhbmQgTG93ZXIgVGVzdGVyIHBlcmZvcm0gcGhhc2UgMiBvZiB0aGUgT09CIGF1dGhlbnRpY2F0ZWQgcGFpcmluZyBhbmQgZXN0YWJsaXNoIGFuIGVuY3J5cHRlZCBsaW5rIHdpdGggdGhlIGdlbmVyYXRlZCBMVEsuCi0KLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELCBzZWxmLmNlcnRfYWRkcmVzcyksIHRpbWVvdXQ9dGltZWRlbHRhKHNlY29uZHM9MTApKQotCi0gICAgICAgICAgICBhc3NlcnRUaGF0KHNlbGYuY2VydF9zZWN1cml0eS5nZXRfYm9uZF9zdHJlYW0oKSkuZW1pdHMoCi0gICAgICAgICAgICAgICAgU2VjdXJpdHlNYXRjaGVycy5Cb25kTXNnKEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsIHNlbGYuZHV0X2FkZHJlc3MpLCB0aW1lb3V0PXRpbWVkZWx0YShzZWNvbmRzPTEwKSkKLQotICAgICAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuUmVtb3ZlQm9uZChzZWxmLmNlcnRfYWRkcmVzcykKLSAgICAgICAgICAgIHNlbGYuY2VydC5zZWN1cml0eS5SZW1vdmVCb25kKHNlbGYuZHV0X2FkZHJlc3MpCi0KLSAgICAgICAgICAgIGFzc2VydFRoYXQoc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X2JvbmRfc3RyZWFtKCkpLmVtaXRzKAotICAgICAgICAgICAgICAgIFNlY3VyaXR5TWF0Y2hlcnMuQm9uZE1zZyhCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQsIHNlbGYuY2VydF9hZGRyZXNzKSkKLQotICAgICAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9kZXZpY2VfZGlzY29ubmVjdChzZWxmLmNlcnRfYWRkcmVzcykKLSAgICAgICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2RldmljZV9kaXNjb25uZWN0KHNlbGYuZHV0X2FkZHJlc3MpCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9jZXJ0L3NlY3VyaXR5X3Rlc3QucHkgYi9nZC9zZWN1cml0eS9jZXJ0L3NlY3VyaXR5X3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzM3YmEuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvY2VydC9zZWN1cml0eV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIwotIyAgIENvcHlyaWdodCAyMDE5IC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gc2VjdXJpdHkuY2VydC5zZWN1cml0eV90ZXN0X2xpYiBpbXBvcnQgU2VjdXJpdHlUZXN0QmFzZQotCi0KLWNsYXNzIFNlY3VyaXR5VGVzdChHZEJhc2VUZXN0Q2xhc3MsIFNlY3VyaXR5VGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBHZEJhc2VUZXN0Q2xhc3Muc2V0dXBfY2xhc3Moc2VsZiwgZHV0X21vZHVsZT0nU0VDVVJJVFknLCBjZXJ0X21vZHVsZT0nTDJDQVAnKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZik6Ci0gICAgICAgIEdkQmFzZVRlc3RDbGFzcy5zZXR1cF90ZXN0KHNlbGYpCi0gICAgICAgIFNlY3VyaXR5VGVzdEJhc2Uuc2V0dXBfdGVzdChzZWxmLCBzZWxmLmR1dCwgc2VsZi5jZXJ0KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIFNlY3VyaXR5VGVzdEJhc2UudGVhcmRvd25fdGVzdChzZWxmKQotICAgICAgICBHZEJhc2VUZXN0Q2xhc3MudGVhcmRvd25fdGVzdChzZWxmKQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvY2VydC9zZWN1cml0eV90ZXN0X2xpYi5weSBiL2dkL3NlY3VyaXR5L2NlcnQvc2VjdXJpdHlfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWQ5MjYuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvY2VydC9zZWN1cml0eV90ZXN0X2xpYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgdGltZQotCi1mcm9tIGJsdWV0b290aF9wYWNrZXRzX3B5dGhvbjMgaW1wb3J0IGhjaV9wYWNrZXRzCi1mcm9tIGNlcnQuZXZlbnRfc3RyZWFtIGltcG9ydCBFdmVudFN0cmVhbQotZnJvbSBjZXJ0LnB5X3NlY3VyaXR5IGltcG9ydCBQeVNlY3VyaXR5Ci1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyIGFzIGNvbW1vbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGVtcHR5X3BiMiBhcyBlbXB0eV9wcm90bwotZnJvbSBoY2kuZmFjYWRlIGltcG9ydCBjb250cm9sbGVyX2ZhY2FkZV9wYjIgYXMgY29udHJvbGxlcl9mYWNhZGUKLWZyb20gaGNpLmZhY2FkZSBpbXBvcnQgbGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlX3BiMiBhcyBsZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUKLWZyb20gbDJjYXAuY2xhc3NpYy5mYWNhZGVfcGIyIGltcG9ydCBDbGFzc2ljU2VjdXJpdHlQb2xpY3kKLWZyb20gbmVpZ2hib3IuZmFjYWRlIGltcG9ydCBmYWNhZGVfcGIyIGFzIG5laWdoYm9yX2ZhY2FkZQotZnJvbSBzZWN1cml0eS5jZXJ0LmNlcnRfc2VjdXJpdHkgaW1wb3J0IENlcnRTZWN1cml0eQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cwotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBCb25kTXNnVHlwZQotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBJb0NhcGFiaWxpdGllcwotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBPb2JEYXRhUHJlc2VudAotZnJvbSBzZWN1cml0eS5mYWNhZGVfcGIyIGltcG9ydCBVaU1zZ1R5cGUKLQotCi1jbGFzcyBTZWN1cml0eVRlc3RCYXNlKCk6Ci0gICAgIiIiCi0gICAgICAgIENvbGxlY3Rpb24gb2YgdGVzdHMgdGhhdCBlYWNoIHNhbXBsZSByZXN1bHRzIGZyb20gCi0gICAgICAgIGRpZmZlcmVudCAodW5pcXVlKSBjb21iaW5hdGlvbnMgb2YgaW8gY2FwYWJpbGl0aWVzLCBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudHMsIGFuZCBvb2IgZGF0YS4KLSAgICAiIiIKLQotICAgIF9pb19jYXBhYmlsaXRpZXNfbmFtZV9sb29rdXAgPSB7Ci0gICAgICAgIElvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfT05MWTogIkRJU1BMQVlfT05MWSIsCi0gICAgICAgIElvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfWUVTX05PX0lPX0NBUDogIkRJU1BMQVlfWUVTX05PX0lPX0NBUCIsCi0gICAgICAgICNJb0NhcGFiaWxpdGllcy5LRVlCT0FSRF9PTkxZOiJLRVlCT0FSRF9PTkxZIiwKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuTk9fSU5QVVRfTk9fT1VUUFVUOiAiTk9fSU5QVVRfTk9fT1VUUFVUIiwKLSAgICB9Ci0KLSAgICBfYXV0aF9yZXFzX25hbWVfbG9va3VwID0gewotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5OT19CT05ESU5HOiAiTk9fQk9ORElORyIsCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLk5PX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOiAiTk9fQk9ORElOR19NSVRNX1BST1RFQ1RJT04iLAotICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElORzogIkRFRElDQVRFRF9CT05ESU5HIiwKLSAgICAgICAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuREVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOiAiREVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OIiwKLSAgICAgICAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuR0VORVJBTF9CT05ESU5HOiAiR0VORVJBTF9CT05ESU5HIiwKLSAgICAgICAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTjogIkdFTkVSQUxfQk9ORElOR19NSVRNX1BST1RFQ1RJT04iLAotICAgIH0KLQotICAgICMgUG9zc2libGUgSU8gQ2FwYWJpbGl0aWVzCi0gICAgaW9fY2FwYWJpbGl0aWVzID0gKAotICAgICAgICBJb0NhcGFiaWxpdGllcy5ESVNQTEFZX09OTFksCi0gICAgICAgIElvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfWUVTX05PX0lPX0NBUCwKLSAgICAgICAgIyBUT0RPKG9wdGVkb2JsaXZpb24pOiBVbmNvbW1lbnQgd2hlbiBQYXNza2V5IEVudHJ5IGlzIGltcGxlbWVudGVkIGluIENsYXNzaWNQYWlyaW5nSGFuZGxlcgotICAgICAgICAjSW9DYXBhYmlsaXRpZXMuS0VZQk9BUkRfT05MWSwKLSAgICAgICAgSW9DYXBhYmlsaXRpZXMuTk9fSU5QVVRfTk9fT1VUUFVUKQotCi0gICAgIyBQb3NzaWJsZSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlbWVudHMKLSAgICBhdXRoX3JlcXMgPSAoQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuTk9fQk9ORElORywgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuTk9fQk9ORElOR19NSVRNX1BST1RFQ1RJT04sCi0gICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HLAotICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04sCi0gICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkdFTkVSQUxfQk9ORElORywgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTikKLQotICAgICMgUG9zc2libGUgT3V0LW9mLUJhbmQgZGF0YSBvcHRpb25zCi0gICAgb29iX3ByZXNlbnQgPSAoCi0gICAgICAgIE9vYkRhdGFQcmVzZW50Lk5PVF9QUkVTRU5ULAotICAgICAgICAjIFRPRE8ob3B0ZWRvYmxpdmlvbik6IFVuY29tbWVudCB3aGVuIE9PQiBpcyBpbXBsZW1lbnRlZCBpbiByb290IGNhbmFsCi0gICAgICAgICMiUDE5Ml9QUkVTRU5UIiwKLSAgICAgICAgIyJQMjU2X1BSRVNFTlQiLAotICAgICAgICAjIlAxOTJfQU5EXzI1Nl9QUkVTRU5UIgotICAgICkKLQotICAgIG1pdG1fYXV0aF9yZXFzID0gKEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HX01JVE1fUFJPVEVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5HRU5FUkFMX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLk5PX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OKQotCi0gICAgZGVmIHNldHVwX3Rlc3Qoc2VsZiwgZHV0LCBjZXJ0KToKLSAgICAgICAgc2VsZi5kdXQgPSBkdXQKLSAgICAgICAgc2VsZi5jZXJ0ID0gY2VydAotCi0gICAgICAgIHNlbGYuZHV0Lm5laWdoYm9yLkVuYWJsZVBhZ2VTY2FuKG5laWdoYm9yX2ZhY2FkZS5FbmFibGVNc2coZW5hYmxlZD1UcnVlKSkKLSAgICAgICAgc2VsZi5jZXJ0Lm5laWdoYm9yLkVuYWJsZVBhZ2VTY2FuKG5laWdoYm9yX2ZhY2FkZS5FbmFibGVNc2coZW5hYmxlZD1UcnVlKSkKLQotICAgICAgICBzZWxmLmR1dC5uYW1lID0gYidEVVQgRGV2aWNlJwotICAgICAgICBzZWxmLmR1dC5hZGRyZXNzID0gc2VsZi5kdXQuaGNpX2NvbnRyb2xsZXIuR2V0TWFjQWRkcmVzcyhlbXB0eV9wcm90by5FbXB0eSgpKS5hZGRyZXNzCi0gICAgICAgIHNlbGYuY2VydC5uYW1lID0gYidDZXJ0IERldmljZScKLSAgICAgICAgc2VsZi5jZXJ0LmFkZHJlc3MgPSBzZWxmLmNlcnQuaGNpX2NvbnRyb2xsZXIuR2V0TWFjQWRkcmVzcyhlbXB0eV9wcm90by5FbXB0eSgpKS5hZGRyZXNzCi0KLSAgICAgICAgIyBUT0RPKG9wdGVkb2JsaXZpb24pOiBNYWtlIHRoaXMgaGFwcGVuIGluIFB5U2VjdXJpdHkgb3IgR2REZXZpY2UKLSAgICAgICAgc2VsZi5kdXQuaGNpX2NvbnRyb2xsZXIuV3JpdGVMb2NhbE5hbWUoY29udHJvbGxlcl9mYWNhZGUuTmFtZU1zZyhuYW1lPXNlbGYuZHV0Lm5hbWUpKQotICAgICAgICBzZWxmLmNlcnQuaGNpX2NvbnRyb2xsZXIuV3JpdGVMb2NhbE5hbWUoY29udHJvbGxlcl9mYWNhZGUuTmFtZU1zZyhuYW1lPXNlbGYuY2VydC5uYW1lKSkKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eSA9IFB5U2VjdXJpdHkoc2VsZi5kdXQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eSA9IENlcnRTZWN1cml0eShzZWxmLmNlcnQpCi0KLSAgICAgICAgc2VsZi5kdXRfYWRkcmVzcyA9IGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgICBhZGRyZXNzPWNvbW1vbi5CbHVldG9vdGhBZGRyZXNzKGFkZHJlc3M9Ynl0ZXMoYidERDowNTowNDowMzowMjowMScpKSwgdHlwZT1jb21tb24uUkFORE9NX0RFVklDRV9BRERSRVNTKQotICAgICAgICBwcml2YWN5X3BvbGljeSA9IGxlX2luaXRpYXRvcl9hZGRyZXNzX2ZhY2FkZS5Qcml2YWN5UG9saWN5KAotICAgICAgICAgICAgYWRkcmVzc19wb2xpY3k9bGVfaW5pdGlhdG9yX2FkZHJlc3NfZmFjYWRlLkFkZHJlc3NQb2xpY3kuVVNFX1NUQVRJQ19BRERSRVNTLAotICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGU9c2VsZi5kdXRfYWRkcmVzcykKLSAgICAgICAgc2VsZi5kdXQuc2VjdXJpdHkuU2V0TGVJbml0aWF0b3JBZGRyZXNzUG9saWN5KHByaXZhY3lfcG9saWN5KQotCi0gICAgZGVmIHRlYXJkb3duX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LmNsb3NlKCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LmNsb3NlKCkKLQotICAgICMgSW5pdGlhdGVzIHRoZSBudW1lcmljIGNvbXBhcmlzb24gdGVzdAotICAgIGRlZiBfcnVuX3NzcF9udW1lcmljX2NvbXBhcmlzb24oc2VsZiwgaW5pdGlhdG9yLCByZXNwb25kZXIsIGluaXRfdWlfcmVzcG9uc2UsIHJlc3BfdWlfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9pbml0X3VpX2V2ZW50LCBleHBlY3RlZF9yZXNwX3VpX2V2ZW50LCBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQpOgotICAgICAgICBpbml0aWF0b3IuZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZygpCi0gICAgICAgIHJlc3BvbmRlci5lbmFibGVfc2VjdXJlX3NpbXBsZV9wYWlyaW5nKCkKLSAgICAgICAgaW5pdGlhdG9yLmNyZWF0ZV9ib25kKHJlc3BvbmRlci5nZXRfYWRkcmVzcygpLCBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLSAgICAgICAgc2VsZi5fdmVyaWZ5X3NzcF9udW1lcmljX2NvbXBhcmlzb24oaW5pdGlhdG9yLCByZXNwb25kZXIsIGluaXRfdWlfcmVzcG9uc2UsIHJlc3BfdWlfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQsIGV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQsIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50KQotCi0gICAgIyBWZXJpZmllcyB0aGUgZXZlbnRzIGZvciB0aGUgbnVtZXJpYyBjb21wYXJpb24gdGVzdAotICAgIGRlZiBfdmVyaWZ5X3NzcF9udW1lcmljX2NvbXBhcmlzb24oc2VsZiwgaW5pdGlhdG9yLCByZXNwb25kZXIsIGluaXRfdWlfcmVzcG9uc2UsIHJlc3BfdWlfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9pbml0X3VpX2V2ZW50LCBleHBlY3RlZF9yZXNwX3VpX2V2ZW50LCBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQpOgotICAgICAgICByZXNwb25kZXIuYWNjZXB0X3BhaXJpbmcoaW5pdGlhdG9yLmdldF9hZGRyZXNzKCksIHJlc3BfdWlfcmVzcG9uc2UpCi0gICAgICAgIGluaXRpYXRvci5vbl91c2VyX2lucHV0KHJlc3BvbmRlci5nZXRfYWRkcmVzcygpLCBpbml0X3VpX3Jlc3BvbnNlLCBleHBlY3RlZF9pbml0X3VpX2V2ZW50KQotICAgICAgICBpbml0aWF0b3Iud2FpdF9mb3JfYm9uZF9ldmVudChleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQpCi0gICAgICAgIHJlc3BvbmRlci53YWl0X2Zvcl9ib25kX2V2ZW50KGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudCkKLQotICAgIGRlZiBfcnVuX3NzcF9vb2Ioc2VsZiwgaW5pdGlhdG9yLCByZXNwb25kZXIsIGluaXRfdWlfcmVzcG9uc2UsIHJlc3BfdWlfcmVzcG9uc2UsIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX3VpX2V2ZW50LCBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQsIGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudCwgcDE5Ml9vb2JfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHAyNTZfb29iX2RhdGEpOgotICAgICAgICBpbml0aWF0b3IuZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZygpCi0gICAgICAgIHJlc3BvbmRlci5lbmFibGVfc2VjdXJlX3NpbXBsZV9wYWlyaW5nKCkKLSAgICAgICAgaW5pdGlhdG9yLmNyZWF0ZV9ib25kX291dF9vZl9iYW5kKHJlc3BvbmRlci5nZXRfYWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MsIHAxOTJfb29iX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMjU2X29vYl9kYXRhKQotICAgICAgICBzZWxmLl92ZXJpZnlfc3NwX29vYihpbml0aWF0b3IsIHJlc3BvbmRlciwgaW5pdF91aV9yZXNwb25zZSwgcmVzcF91aV9yZXNwb25zZSwgZXhwZWN0ZWRfaW5pdF91aV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudCwgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50LCBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQsIHAxOTJfb29iX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyNTZfb29iX2RhdGEpCi0KLSAgICAjIFZlcmlmaWVzIHRoZSBldmVudHMgZm9yIHRoZSBudW1lcmljIGNvbXBhcmlvbiB0ZXN0Ci0gICAgZGVmIF92ZXJpZnlfc3NwX29vYihzZWxmLCBpbml0aWF0b3IsIHJlc3BvbmRlciwgaW5pdF91aV9yZXNwb25zZSwgcmVzcF91aV9yZXNwb25zZSwgZXhwZWN0ZWRfaW5pdF91aV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQsIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50LCBwMTkyX29vYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgcDI1Nl9vb2JfZGF0YSk6Ci0gICAgICAgIHJlc3BvbmRlci5hY2NlcHRfb29iX3BhaXJpbmcoaW5pdGlhdG9yLmdldF9hZGRyZXNzKCkpCi0gICAgICAgIGluaXRpYXRvci5vbl91c2VyX2lucHV0KHJlc3BvbmRlci5nZXRfYWRkcmVzcygpLCBpbml0X3VpX3Jlc3BvbnNlLCBleHBlY3RlZF9pbml0X3VpX2V2ZW50KQotICAgICAgICBpbml0aWF0b3Iud2FpdF9mb3JfYm9uZF9ldmVudChleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQpCi0gICAgICAgIHJlc3BvbmRlci53YWl0X2Zvcl9ib25kX2V2ZW50KGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudCkKLQotICAgIGRlZiBfcnVuX3NzcF9wYXNza2V5KHNlbGYsIGluaXRpYXRvciwgcmVzcG9uZGVyLCBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQsIGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudCk6Ci0gICAgICAgIGluaXRpYXRvci5lbmFibGVfc2VjdXJlX3NpbXBsZV9wYWlyaW5nKCkKLSAgICAgICAgcmVzcG9uZGVyLmVuYWJsZV9zZWN1cmVfc2ltcGxlX3BhaXJpbmcoKQotICAgICAgICBpbml0aWF0b3IuY3JlYXRlX2JvbmQocmVzcG9uZGVyLmdldF9hZGRyZXNzKCksIGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzVHlwZUVudW0uUFVCTElDX0RFVklDRV9BRERSRVNTKQotICAgICAgICBzZWxmLl92ZXJpZnlfc3NwX3Bhc3NrZXkoaW5pdGlhdG9yLCByZXNwb25kZXIsIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50KQotCi0gICAgZGVmIF92ZXJpZnlfc3NwX3Bhc3NrZXkoc2VsZiwgaW5pdGlhdG9yLCByZXNwb25kZXIsIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50KToKLSAgICAgICAgcmVzcG9uZGVyLnNlbmRfaW9fY2Fwcyhpbml0aWF0b3IuZ2V0X2FkZHJlc3MoKSkKLSAgICAgICAgcGFzc2tleSA9IGluaXRpYXRvci53YWl0X2Zvcl9wYXNza2V5KHJlc3BvbmRlci5nZXRfYWRkcmVzcygpKQotICAgICAgICByZXNwb25kZXIuaW5wdXRfcGFzc2tleShpbml0aWF0b3IuZ2V0X2FkZHJlc3MoKSwgcGFzc2tleSkKLSAgICAgICAgaW5pdGlhdG9yLndhaXRfZm9yX2JvbmRfZXZlbnQoZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50KQotICAgICAgICByZXNwb25kZXIud2FpdF9mb3JfYm9uZF9ldmVudChleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQpCi0KLSAgICBkZWYgX3J1bl9waW4oc2VsZiwgaW5pdGlhdG9yLCByZXNwb25kZXIsIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50KToKLSAgICAgICAgaW5pdGlhdG9yLmNyZWF0ZV9ib25kKHJlc3BvbmRlci5nZXRfYWRkcmVzcygpLCBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLSAgICAgICAgc2VsZi5fdmVyaWZ5X3Bpbihpbml0aWF0b3IsIHJlc3BvbmRlciwgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50LCBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQpCi0KLSAgICBkZWYgX3ZlcmlmeV9waW4oc2VsZiwgaW5pdGlhdG9yLCByZXNwb25kZXIsIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50KToKLSAgICAgICAgcGluID0gYicxMjM0NTY3ODlBJwotICAgICAgICBsb2dnaW5nLmluZm8oInBpbjogJXMiICUgcGluKQotICAgICAgICBpbml0aWF0b3IuaW5wdXRfcGluKHJlc3BvbmRlci5nZXRfYWRkcmVzcygpLCBwaW4pCi0gICAgICAgIHJlc3BvbmRlci5pbnB1dF9waW4oaW5pdGlhdG9yLmdldF9hZGRyZXNzKCksIHBpbikKLSAgICAgICAgaW5pdGlhdG9yLndhaXRfZm9yX2JvbmRfZXZlbnQoZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50KQotICAgICAgICByZXNwb25kZXIud2FpdF9mb3JfYm9uZF9ldmVudChleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQpCi0KLSAgICBkZWYgdGVzdF9zZXR1cF90ZWFyZG93bihzZWxmKToKLSAgICAgICAgIiIiCi0gICAgICAgICAgICBNYWtlIHN1cmUgb3VyIHNldHVwIGFuZCB0ZWFyZG93biBpcyBzYW5lCi0gICAgICAgICIiIgotICAgICAgICBwYXNzCi0KLSAgICAjIG5vX2lucHV0X25vX291dHB1dCArIG5vX2lucHV0X25vX291dHB1dCBpcyBKdXN0V29ya3Mgbm8gY29uZmlybWF0aW9uCi0gICAgZGVmIHRlc3RfZHV0X2luaXRpYXRlZF9ub19pbnB1dF9ub19vdXRwdXRfbm9faW5wdXRfbm9fb3V0cHV0X3R3aWNlX2JvbmRfYW5kX2VuZm9yY2Uoc2VsZik6Ci0gICAgICAgICMgQXJyYW5nZQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5zZXRfaW9fY2FwYWJpbGl0aWVzKElvQ2FwYWJpbGl0aWVzLk5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuc2V0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyhBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElORykKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnNldF9pb19jYXBhYmlsaXRpZXMoSW9DYXBhYmlsaXRpZXMuTk9fSU5QVVRfTk9fT1VUUFVUKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuc2V0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyhBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElORykKLQotICAgICAgICAjIEFjdCBhbmQgQXNzZXJ0Ci0gICAgICAgIHNlbGYuX3J1bl9zc3BfbnVtZXJpY19jb21wYXJpc29uKAotICAgICAgICAgICAgaW5pdGlhdG9yPXNlbGYuZHV0X3NlY3VyaXR5LAotICAgICAgICAgICAgcmVzcG9uZGVyPXNlbGYuY2VydF9zZWN1cml0eSwKLSAgICAgICAgICAgIGluaXRfdWlfcmVzcG9uc2U9VHJ1ZSwKLSAgICAgICAgICAgIHJlc3BfdWlfcmVzcG9uc2U9VHJ1ZSwKLSAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQ9Tm9uZSwKLSAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQ9Tm9uZSwKLSAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudD1Cb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVELAotICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50PU5vbmUpCi0KLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuZW5mb3JjZV9zZWN1cml0eV9wb2xpY3koc2VsZi5jZXJ0LmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5CbHVldG9vdGhBZGRyZXNzVHlwZUVudW0uUFVCTElDX0RFVklDRV9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2ljU2VjdXJpdHlQb2xpY3kuRU5DUllQVEVEX1RSQU5TUE9SVCkKLQotICAgICAgICAjIFRPRE86IFdlIHZlcmlmeSBlbmZvcmNlbWVudCB3aGVuIHdlIG1ha2Ugc3VyZSBFbmNyeXB0aW9uQ2hhbmdlIGlzIHJlY2VpdmVkIG9uIERVVAotCi0gICAgIyBub19pbnB1dF9ub19vdXRwdXQgKyBub19pbnB1dF9ub19vdXRwdXQgaXMgSnVzdFdvcmtzIG5vIGNvbmZpcm1hdGlvbgotICAgIGRlZiB0ZXN0X2R1dF9pbml0aWF0ZWRfbm9faW5wdXRfbm9fb3V0cHV0X25vX2lucHV0X25vX291dHB1dF90d2ljZV93aXRoX3JlbW92ZV9ib25kKHNlbGYpOgotICAgICAgICAjIEFycmFuZ2UKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuc2V0X2lvX2NhcGFiaWxpdGllcyhJb0NhcGFiaWxpdGllcy5OT19JTlBVVF9OT19PVVRQVVQpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuREVESUNBVEVEX0JPTkRJTkcpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5zZXRfaW9fY2FwYWJpbGl0aWVzKElvQ2FwYWJpbGl0aWVzLk5PX0lOUFVUX05PX09VVFBVVCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuREVESUNBVEVEX0JPTkRJTkcpCi0KLSAgICAgICAgIyBBY3QgYW5kIEFzc2VydAotICAgICAgICBzZWxmLl9ydW5fc3NwX251bWVyaWNfY29tcGFyaXNvbigKLSAgICAgICAgICAgIGluaXRpYXRvcj1zZWxmLmR1dF9zZWN1cml0eSwKLSAgICAgICAgICAgIHJlc3BvbmRlcj1zZWxmLmNlcnRfc2VjdXJpdHksCi0gICAgICAgICAgICBpbml0X3VpX3Jlc3BvbnNlPVRydWUsCi0gICAgICAgICAgICByZXNwX3VpX3Jlc3BvbnNlPVRydWUsCi0gICAgICAgICAgICBleHBlY3RlZF9pbml0X3VpX2V2ZW50PU5vbmUsCi0gICAgICAgICAgICBleHBlY3RlZF9yZXNwX3VpX2V2ZW50PU5vbmUsCi0gICAgICAgICAgICBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQ9Qm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCwKLSAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudD1Ob25lKQotCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnJlbW92ZV9ib25kKHNlbGYuY2VydC5hZGRyZXNzLCBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnJlbW92ZV9ib25kKHNlbGYuY2VydC5hZGRyZXNzLCBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9mb3JfYm9uZF9ldmVudChCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2Zvcl9ib25kX2V2ZW50KEJvbmRNc2dUeXBlLkRFVklDRV9VTkJPTkRFRCkKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS53YWl0X2Zvcl9kaXNjb25uZWN0X2V2ZW50KCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LndhaXRfZm9yX2Rpc2Nvbm5lY3RfZXZlbnQoKQotCi0gICAgICAgICMgQWN0IGFuZCBBc3NlcnQKLSAgICAgICAgc2VsZi5fcnVuX3NzcF9udW1lcmljX2NvbXBhcmlzb24oCi0gICAgICAgICAgICBpbml0aWF0b3I9c2VsZi5kdXRfc2VjdXJpdHksCi0gICAgICAgICAgICByZXNwb25kZXI9c2VsZi5jZXJ0X3NlY3VyaXR5LAotICAgICAgICAgICAgaW5pdF91aV9yZXNwb25zZT1UcnVlLAotICAgICAgICAgICAgcmVzcF91aV9yZXNwb25zZT1UcnVlLAotICAgICAgICAgICAgZXhwZWN0ZWRfaW5pdF91aV9ldmVudD1Ob25lLAotICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudD1Ob25lLAotICAgICAgICAgICAgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50PUJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsCi0gICAgICAgICAgICBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQ9Tm9uZSkKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmNlcnQuYWRkcmVzcywgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmNlcnQuYWRkcmVzcywgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LndhaXRfZm9yX2JvbmRfZXZlbnQoQm9uZE1zZ1R5cGUuREVWSUNFX1VOQk9OREVEKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkud2FpdF9mb3JfYm9uZF9ldmVudChCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQpCi0KLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9mb3JfZGlzY29ubmVjdF9ldmVudCgpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2Zvcl9kaXNjb25uZWN0X2V2ZW50KCkKLQotICAgIGRlZiB0ZXN0X3N1Y2Nlc3NmdWxfZHV0X2luaXRpYXRlZF9zc3BfbnVtZXJpY19jb21wYXJpc29uKHNlbGYpOgotICAgICAgICB0ZXN0X2NvdW50ID0gbGVuKHNlbGYuaW9fY2FwYWJpbGl0aWVzKSAqIGxlbihzZWxmLmF1dGhfcmVxcykgKiBsZW4oc2VsZi5vb2JfcHJlc2VudCkgKiBsZW4oCi0gICAgICAgICAgICBzZWxmLmlvX2NhcGFiaWxpdGllcykgKiBsZW4oc2VsZi5hdXRoX3JlcXMpICogbGVuKHNlbGYub29iX3ByZXNlbnQpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiTG9hZGluZyAlZCB0ZXN0IGNvbWJpbmF0aW9ucyIgJSB0ZXN0X2NvdW50KQotICAgICAgICBpID0gMAotICAgICAgICBmb3IgZHV0X2lvX2NhcGFiaWxpdHkgaW4gc2VsZi5pb19jYXBhYmlsaXRpZXM6Ci0gICAgICAgICAgICBmb3IgZHV0X2F1dGhfcmVxcyBpbiBzZWxmLmF1dGhfcmVxczoKLSAgICAgICAgICAgICAgICBmb3IgZHV0X29vYl9wcmVzZW50IGluIHNlbGYub29iX3ByZXNlbnQ6Ci0gICAgICAgICAgICAgICAgICAgIGZvciBjZXJ0X2lvX2NhcGFiaWxpdHkgaW4gc2VsZi5pb19jYXBhYmlsaXRpZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2VydF9hdXRoX3JlcXMgaW4gc2VsZi5hdXRoX3JlcXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNlcnRfb29iX3ByZXNlbnQgaW4gc2VsZi5vb2JfcHJlc2VudDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlJ1bm5pbmcgdGVzdCAlZCBvZiAlZCIgJSAoaSwgdGVzdF9jb3VudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRFVUIFRlc3QgQ29uZmlnOiAlcyA7ICVzIDsgJXMgIiAlIChzZWxmLl9pb19jYXBhYmlsaXRpZXNfbmFtZV9sb29rdXAuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0X2lvX2NhcGFiaWxpdHksICJFUlJPUiIpLCBzZWxmLl9hdXRoX3JlcXNfbmFtZV9sb29rdXAuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1dF9hdXRoX3JlcXMsICJFUlJPUiIpLCBkdXRfb29iX3ByZXNlbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VSVCBUZXN0IENvbmZpZzogJXMgOyAlcyA7ICVzICIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX2lvX2NhcGFiaWxpdGllc19uYW1lX2xvb2t1cC5nZXQoY2VydF9pb19jYXBhYmlsaXR5LCAiRVJST1IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9hdXRoX3JlcXNfbmFtZV9sb29rdXAuZ2V0KGNlcnRfYXV0aF9yZXFzLCAiRVJST1IiKSwgY2VydF9vb2JfcHJlc2VudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5zZXRfaW9fY2FwYWJpbGl0aWVzKGR1dF9pb19jYXBhYmlsaXR5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5zZXRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzKGR1dF9hdXRoX3JlcXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5zZXRfaW9fY2FwYWJpbGl0aWVzKGNlcnRfaW9fY2FwYWJpbGl0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoY2VydF9hdXRoX3JlcXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfdWlfcmVzcG9uc2UgPSBUcnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfdWlfcmVzcG9uc2UgPSBUcnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQgPSBOb25lICAjIE5vbmUgaXMgYXV0byBhY2NlcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudCA9IE5vbmUgICMgTm9uZSBpcyBhdXRvIGFjY2VwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQgPSBCb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudCA9IE5vbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHV0X2lvX2NhcGFiaWxpdHkgPT0gSW9DYXBhYmlsaXRpZXMuRElTUExBWV9PTkxZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2VydF9pb19jYXBhYmlsaXR5ID09IElvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfWUVTX05PX0lPX0NBUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX3VpX2V2ZW50ID0gVWlNc2dUeXBlLkRJU1BMQVlfWUVTX05PX1dJVEhfVkFMVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkdXRfYXV0aF9yZXFzIGluIHNlbGYubWl0bV9hdXRoX3JlcXMgb3IgY2VydF9hdXRoX3JlcXMgaW4gc2VsZi5taXRtX2F1dGhfcmVxczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50ID0gQm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRfRkFJTEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGNlcnRfaW9fY2FwYWJpbGl0eSA9PSBJb0NhcGFiaWxpdGllcy5LRVlCT0FSRF9PTkxZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQgPSBVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZX0VOVFJZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGNlcnRfaW9fY2FwYWJpbGl0eSA9PSBJb0NhcGFiaWxpdGllcy5ESVNQTEFZX09OTFk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHV0X2F1dGhfcmVxcyBpbiBzZWxmLm1pdG1fYXV0aF9yZXFzIG9yIGNlcnRfYXV0aF9yZXFzIGluIHNlbGYubWl0bV9hdXRoX3JlcXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCA9IEJvbmRNc2dUeXBlLkRFVklDRV9CT05EX0ZBSUxFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBjZXJ0X2lvX2NhcGFiaWxpdHkgPT0gSW9DYXBhYmlsaXRpZXMuTk9fSU5QVVRfTk9fT1VUUFVUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGR1dF9hdXRoX3JlcXMgaW4gc2VsZi5taXRtX2F1dGhfcmVxcyBvciBjZXJ0X2F1dGhfcmVxcyBpbiBzZWxmLm1pdG1fYXV0aF9yZXFzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQgPSBCb25kTXNnVHlwZS5ERVZJQ0VfQk9ORF9GQUlMRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBkdXRfaW9fY2FwYWJpbGl0eSA9PSBJb0NhcGFiaWxpdGllcy5ESVNQTEFZX1lFU19OT19JT19DQVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9pbml0X3VpX2V2ZW50ID0gVWlNc2dUeXBlLkRJU1BMQVlfWUVTX05PX1dJVEhfVkFMVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNlcnRfaW9fY2FwYWJpbGl0eSA9PSBJb0NhcGFiaWxpdGllcy5ESVNQTEFZX1lFU19OT19JT19DQVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudCA9IFVpTXNnVHlwZS5ESVNQTEFZX1lFU19OT19XSVRIX1ZBTFVFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGNlcnRfaW9fY2FwYWJpbGl0eSA9PSBJb0NhcGFiaWxpdGllcy5LRVlCT0FSRF9PTkxZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQgPSBVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudCA9IFVpTXNnVHlwZS5ESVNQTEFZX1BBU1NLRVlfRU5UUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgY2VydF9pb19jYXBhYmlsaXR5ID09IElvQ2FwYWJpbGl0aWVzLk5PX0lOUFVUX05PX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9pbml0X3VpX2V2ZW50ID0gVWlNc2dUeXBlLkRJU1BMQVlfWUVTX05PICAjIE5vIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgZHV0X2lvX2NhcGFiaWxpdHkgPT0gSW9DYXBhYmlsaXRpZXMuS0VZQk9BUkRfT05MWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQgPSBVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZX0VOVFJZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjZXJ0X2lvX2NhcGFiaWxpdHkgPT0gSW9DYXBhYmlsaXRpZXMuRElTUExBWV9PTkxZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQgPSBVaU1zZ1R5cGUuRElTUExBWV9QQVNTS0VZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGNlcnRfaW9fY2FwYWJpbGl0eSA9PSBJb0NhcGFiaWxpdGllcy5ESVNQTEFZX1lFU19OT19JT19DQVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudCA9IFVpTXNnVHlwZS5ESVNQTEFZX1BBU1NLRVlfRU5UUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgY2VydF9pb19jYXBhYmlsaXR5ID09IElvQ2FwYWJpbGl0aWVzLktFWUJPQVJEX09OTFk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzcF91aV9ldmVudCA9IFVpTXNnVHlwZS5ESVNQTEFZX1BBU1NLRVlfRU5UUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgY2VydF9pb19jYXBhYmlsaXR5ID09IElvQ2FwYWJpbGl0aWVzLk5PX0lOUFVUX05PX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkdXRfYXV0aF9yZXFzIGluIHNlbGYubWl0bV9hdXRoX3JlcXMgb3IgY2VydF9hdXRoX3JlcXMgaW4gc2VsZi5taXRtX2F1dGhfcmVxczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50ID0gQm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRfRkFJTEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgZHV0X2lvX2NhcGFiaWxpdHkgPT0gSW9DYXBhYmlsaXRpZXMuTk9fSU5QVVRfTk9fT1VUUFVUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2VydF9pb19jYXBhYmlsaXR5ID09IElvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfWUVTX05PX0lPX0NBUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX3VpX2V2ZW50ID0gVWlNc2dUeXBlLkRJU1BMQVlfWUVTX05PICAjIE5vIHZhbHVlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGR1dF9hdXRoX3JlcXMgaW4gc2VsZi5taXRtX2F1dGhfcmVxcyBvciBjZXJ0X2F1dGhfcmVxcyBpbiBzZWxmLm1pdG1fYXV0aF9yZXFzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCA9IEJvbmRNc2dUeXBlLkRFVklDRV9CT05EX0ZBSUxFRAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNlcnRfb29iX3ByZXNlbnQgPT0gT29iRGF0YVByZXNlbnQuTk9UX1BSRVNFTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ydW5fc3NwX251bWVyaWNfY29tcGFyaXNvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWF0b3I9c2VsZi5kdXRfc2VjdXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZGVyPXNlbGYuY2VydF9zZWN1cml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3VpX3Jlc3BvbnNlPWluaXRfdWlfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcF91aV9yZXNwb25zZT1yZXNwX3VpX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQ9ZXhwZWN0ZWRfaW5pdF91aV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX3VpX2V2ZW50PWV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50PWV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQ9ZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiQ29kZSBwYXRoIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChGYWxzZSkuaXNUcnVlKCkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X2FkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9mb3JfYm9uZF9ldmVudChCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2Zvcl9ib25kX2V2ZW50KEJvbmRNc2dUeXBlLkRFVklDRV9VTkJPTkRFRCkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS53YWl0X2Zvcl9kaXNjb25uZWN0X2V2ZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LndhaXRfZm9yX2Rpc2Nvbm5lY3RfZXZlbnQoKQotCi0gICAgZGVmIHRlc3RfZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZyhzZWxmKToKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZygpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5lbmFibGVfc2VjdXJlX3NpbXBsZV9wYWlyaW5nKCkKLQotICAgIGRlZiB0ZXN0X2VuYWJsZV9zZWN1cmVfY29ubmVjdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LmVuYWJsZV9zZWN1cmVfc2ltcGxlX3BhaXJpbmcoKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZygpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LmVuYWJsZV9zZWN1cmVfY29ubmVjdGlvbnMoKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuZW5hYmxlX3NlY3VyZV9jb25uZWN0aW9ucygpCi0KLSAgICBkZWYgdGVzdF9nZXRfb29iX2RhdGFfZnJvbV9kdXRfY29udHJvbGxlcl9wMTkyX3ByZXNlbnQoc2VsZik6Ci0gICAgICAgIG9vYl9kYXRhID0gc2VsZi5kdXRfc2VjdXJpdHkuZ2V0X29vYl9kYXRhX2Zyb21fY29udHJvbGxlcihPb2JEYXRhUHJlc2VudC5QMTkyX1BSRVNFTlQpCi0gICAgICAgIGFzc2VydFRoYXQobGVuKG9vYl9kYXRhKSkuaXNFcXVhbFRvKDQpCi0gICAgICAgIGhhczE5MkMgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbMF1dKQotICAgICAgICBoYXMxOTJSID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzFdXSkKLSAgICAgICAgaGFzMjU2QyA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVsyXV0pCi0gICAgICAgIGhhczI1NlIgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbM11dKQotICAgICAgICBhc3NlcnRUaGF0KGhhczE5MkMpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMTkyUikuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMyNTZDKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMyNTZSKS5pc0ZhbHNlKCkKLQotICAgIGRlZiB0ZXN0X2dldF9vb2JfZGF0YV9mcm9tX2NlcnRfY29udHJvbGxlcl9ub3RfcHJlc2VudChzZWxmKToKLSAgICAgICAgb29iX2RhdGEgPSBzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X29vYl9kYXRhX2Zyb21fY29udHJvbGxlcihPb2JEYXRhUHJlc2VudC5OT1RfUFJFU0VOVCkKLSAgICAgICAgYXNzZXJ0VGhhdChsZW4ob29iX2RhdGEpKS5pc0VxdWFsVG8oNCkKLSAgICAgICAgaGFzMTkyQyA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVswXV0pCi0gICAgICAgIGhhczE5MlIgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbMV1dKQotICAgICAgICBoYXMyNTZDID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzJdXSkKLSAgICAgICAgaGFzMjU2UiA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVszXV0pCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMTkyQykuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMTkyUikuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMjU2QykuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMjU2UikuaXNGYWxzZSgpCi0KLSAgICBkZWYgdGVzdF9nZXRfb29iX2RhdGFfZnJvbV9jZXJ0X2NvbnRyb2xsZXJfcDE5Ml9wcmVzZW50X25vX3NlY3VyZV9jb25uZWN0aW9ucyhzZWxmKToKLSAgICAgICAgb29iX2RhdGEgPSBzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X29vYl9kYXRhX2Zyb21fY29udHJvbGxlcihPb2JEYXRhUHJlc2VudC5QMTkyX1BSRVNFTlQpCi0gICAgICAgIGFzc2VydFRoYXQobGVuKG9vYl9kYXRhKSkuaXNFcXVhbFRvKDQpCi0gICAgICAgIGhhczE5MkMgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbMF1dKQotICAgICAgICBoYXMxOTJSID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzFdXSkKLSAgICAgICAgaGFzMjU2QyA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVsyXV0pCi0gICAgICAgIGhhczI1NlIgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbM11dKQotICAgICAgICBhc3NlcnRUaGF0KGhhczE5MkMpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMTkyUikuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMyNTZDKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMyNTZSKS5pc0ZhbHNlKCkKLQotICAgIGRlZiB0ZXN0X2dldF9vb2JfZGF0YV9mcm9tX2NlcnRfY29udHJvbGxlcl9wMTkyX3ByZXNlbnQoc2VsZik6Ci0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5lbmFibGVfc2VjdXJlX3NpbXBsZV9wYWlyaW5nKCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LmVuYWJsZV9zZWN1cmVfY29ubmVjdGlvbnMoKQotICAgICAgICBvb2JfZGF0YSA9IHNlbGYuY2VydF9zZWN1cml0eS5nZXRfb29iX2RhdGFfZnJvbV9jb250cm9sbGVyKE9vYkRhdGFQcmVzZW50LlAxOTJfUFJFU0VOVCkKLSAgICAgICAgYXNzZXJ0VGhhdChsZW4ob29iX2RhdGEpKS5pc0VxdWFsVG8oNCkKLSAgICAgICAgaGFzMTkyQyA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVswXV0pCi0gICAgICAgIGhhczE5MlIgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbMV1dKQotICAgICAgICBoYXMyNTZDID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzJdXSkKLSAgICAgICAgaGFzMjU2UiA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVszXV0pCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMTkyQykuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMxOTJSKS5pc1RydWUoKQotICAgICAgICBhc3NlcnRUaGF0KGhhczI1NkMpLmlzRmFsc2UoKQotICAgICAgICBhc3NlcnRUaGF0KGhhczI1NlIpLmlzRmFsc2UoKQotCi0gICAgZGVmIHRlc3RfZ2V0X29vYl9kYXRhX2Zyb21fY2VydF9jb250cm9sbGVyX3AyNTZfcHJlc2VudChzZWxmKToKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LmVuYWJsZV9zZWN1cmVfc2ltcGxlX3BhaXJpbmcoKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuZW5hYmxlX3NlY3VyZV9jb25uZWN0aW9ucygpCi0gICAgICAgIG9vYl9kYXRhID0gc2VsZi5jZXJ0X3NlY3VyaXR5LmdldF9vb2JfZGF0YV9mcm9tX2NvbnRyb2xsZXIoT29iRGF0YVByZXNlbnQuUDI1Nl9QUkVTRU5UKQotICAgICAgICBhc3NlcnRUaGF0KGxlbihvb2JfZGF0YSkpLmlzRXF1YWxUbyg0KQotICAgICAgICBoYXMxOTJDID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzBdXSkKLSAgICAgICAgaGFzMTkyUiA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVsxXV0pCi0gICAgICAgIGhhczI1NkMgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbMl1dKQotICAgICAgICBoYXMyNTZSID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzNdXSkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMxOTJDKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMxOTJSKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMyNTZDKS5pc1RydWUoKQotICAgICAgICBhc3NlcnRUaGF0KGhhczI1NlIpLmlzVHJ1ZSgpCi0KLSAgICBkZWYgdGVzdF9nZXRfb29iX2RhdGFfZnJvbV9jZXJ0X2NvbnRyb2xsZXJfcDE5Ml9hbmRfcDI1Nl9wcmVzZW50KHNlbGYpOgotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuZW5hYmxlX3NlY3VyZV9zaW1wbGVfcGFpcmluZygpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5lbmFibGVfc2VjdXJlX2Nvbm5lY3Rpb25zKCkKLSAgICAgICAgb29iX2RhdGEgPSBzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X29vYl9kYXRhX2Zyb21fY29udHJvbGxlcihPb2JEYXRhUHJlc2VudC5QMTkyX0FORF8yNTZfUFJFU0VOVCkKLSAgICAgICAgYXNzZXJ0VGhhdChsZW4ob29iX2RhdGEpKS5pc0VxdWFsVG8oNCkKLSAgICAgICAgaGFzMTkyQyA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVswXV0pCi0gICAgICAgIGhhczE5MlIgPSBub3QgYWxsKFtpID09IDAgZm9yIGkgaW4gb29iX2RhdGFbMV1dKQotICAgICAgICBoYXMyNTZDID0gbm90IGFsbChbaSA9PSAwIGZvciBpIGluIG9vYl9kYXRhWzJdXSkKLSAgICAgICAgaGFzMjU2UiA9IG5vdCBhbGwoW2kgPT0gMCBmb3IgaSBpbiBvb2JfZGF0YVszXV0pCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMTkyQykuaXNUcnVlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChoYXMxOTJSKS5pc1RydWUoKQotICAgICAgICBhc3NlcnRUaGF0KGhhczI1NkMpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQoaGFzMjU2UikuaXNUcnVlKCkKLQotICAgIGRlZiB0ZXN0X3N1Y2Nlc3NmdWxfZHV0X2luaXRpYXRlZF9zc3Bfb29iKHNlbGYpOgotICAgICAgICBkdXRfaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0aWVzLk5PX0lOUFVUX05PX09VVFBVVAotICAgICAgICBjZXJ0X2lvX2NhcGFiaWxpdHkgPSBJb0NhcGFiaWxpdGllcy5OT19JTlBVVF9OT19PVVRQVVQKLSAgICAgICAgZHV0X2F1dGhfcmVxcyA9IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HX01JVE1fUFJPVEVDVElPTgotICAgICAgICBjZXJ0X2F1dGhfcmVxcyA9IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLkRFRElDQVRFRF9CT05ESU5HX01JVE1fUFJPVEVDVElPTgotICAgICAgICBjZXJ0X29vYl9wcmVzZW50ID0gT29iRGF0YVByZXNlbnQuUDE5Ml9QUkVTRU5UCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LmVuYWJsZV9zZWN1cmVfc2ltcGxlX3BhaXJpbmcoKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5lbmFibGVfc2VjdXJlX2Nvbm5lY3Rpb25zKCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LmVuYWJsZV9zZWN1cmVfc2ltcGxlX3BhaXJpbmcoKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuZW5hYmxlX3NlY3VyZV9jb25uZWN0aW9ucygpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnNldF9pb19jYXBhYmlsaXRpZXMoZHV0X2lvX2NhcGFiaWxpdHkpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoZHV0X2F1dGhfcmVxcykKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnNldF9pb19jYXBhYmlsaXRpZXMoY2VydF9pb19jYXBhYmlsaXR5KQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuc2V0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyhjZXJ0X2F1dGhfcmVxcykKLSAgICAgICAgaW5pdF91aV9yZXNwb25zZSA9IFRydWUKLSAgICAgICAgcmVzcF91aV9yZXNwb25zZSA9IFRydWUKLSAgICAgICAgZXhwZWN0ZWRfaW5pdF91aV9ldmVudCA9IE5vbmUgICMgTm9uZSBpcyBhdXRvIGFjY2VwdAotICAgICAgICBleHBlY3RlZF9yZXNwX3VpX2V2ZW50ID0gTm9uZSAgIyBOb25lIGlzIGF1dG8gYWNjZXB0Ci0gICAgICAgIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudCA9IEJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQKLSAgICAgICAgZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50ID0gTm9uZQotICAgICAgICAjIGdldF9vb2JfZGF0YSByZXR1cm5zIGEgdHVwbGUgb2YgYnl0ZXMgKHAxOTJjLHAxOTJyLHAyNTZjLHAyNTZyKQotICAgICAgICBsb2NhbF9vb2JfZGF0YSA9IHNlbGYuY2VydF9zZWN1cml0eS5nZXRfb29iX2RhdGFfZnJvbV9jb250cm9sbGVyKGNlcnRfb29iX3ByZXNlbnQpCi0gICAgICAgIHAxOTJfb29iX2RhdGEgPSBsb2NhbF9vb2JfZGF0YVswOjJdCi0gICAgICAgIHAyNTZfb29iX2RhdGEgPSBsb2NhbF9vb2JfZGF0YVsyOjRdCi0gICAgICAgIHNlbGYuX3J1bl9zc3Bfb29iKAotICAgICAgICAgICAgaW5pdGlhdG9yPXNlbGYuZHV0X3NlY3VyaXR5LAotICAgICAgICAgICAgcmVzcG9uZGVyPXNlbGYuY2VydF9zZWN1cml0eSwKLSAgICAgICAgICAgIGluaXRfdWlfcmVzcG9uc2U9aW5pdF91aV9yZXNwb25zZSwKLSAgICAgICAgICAgIHJlc3BfdWlfcmVzcG9uc2U9cmVzcF91aV9yZXNwb25zZSwKLSAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfdWlfZXZlbnQ9ZXhwZWN0ZWRfaW5pdF91aV9ldmVudCwKLSAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfdWlfZXZlbnQ9ZXhwZWN0ZWRfcmVzcF91aV9ldmVudCwKLSAgICAgICAgICAgIGV4cGVjdGVkX2luaXRfYm9uZF9ldmVudD1leHBlY3RlZF9pbml0X2JvbmRfZXZlbnQsCi0gICAgICAgICAgICBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQ9ZXhwZWN0ZWRfcmVzcF9ib25kX2V2ZW50LAotICAgICAgICAgICAgcDE5Ml9vb2JfZGF0YT1wMTkyX29vYl9kYXRhLAotICAgICAgICAgICAgcDI1Nl9vb2JfZGF0YT1wMjU2X29vYl9kYXRhKQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X2FkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LndhaXRfZm9yX2JvbmRfZXZlbnQoQm9uZE1zZ1R5cGUuREVWSUNFX1VOQk9OREVEKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkud2FpdF9mb3JfYm9uZF9ldmVudChCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LndhaXRfZm9yX2Rpc2Nvbm5lY3RfZXZlbnQoKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkud2FpdF9mb3JfZGlzY29ubmVjdF9ldmVudCgpCi0KLSAgICBkZWYgdGVzdF9zdWNjZXNzZnVsX2R1dF9pbml0aWF0ZWRfc3NwX2tleWJvYXJkKHNlbGYpOgotICAgICAgICBkdXRfaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0aWVzLkRJU1BMQVlfWUVTX05PX0lPX0NBUAotICAgICAgICBkdXRfYXV0aF9yZXFzID0gQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuREVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OCi0gICAgICAgIGR1dF9vb2JfcHJlc2VudCA9IE9vYkRhdGFQcmVzZW50Lk5PVF9QUkVTRU5UCi0gICAgICAgIGNlcnRfaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0aWVzLktFWUJPQVJEX09OTFkKLSAgICAgICAgY2VydF9hdXRoX3JlcXMgPSBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cy5ERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04KLSAgICAgICAgY2VydF9vb2JfcHJlc2VudCA9IE9vYkRhdGFQcmVzZW50Lk5PVF9QUkVTRU5UCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnNldF9pb19jYXBhYmlsaXRpZXMoZHV0X2lvX2NhcGFiaWxpdHkpCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoZHV0X2F1dGhfcmVxcykKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnNldF9pb19jYXBhYmlsaXRpZXMoY2VydF9pb19jYXBhYmlsaXR5KQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkuc2V0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyhjZXJ0X2F1dGhfcmVxcykKLQotICAgICAgICBzZWxmLl9ydW5fc3NwX3Bhc3NrZXkoCi0gICAgICAgICAgICBpbml0aWF0b3I9c2VsZi5kdXRfc2VjdXJpdHksCi0gICAgICAgICAgICByZXNwb25kZXI9c2VsZi5jZXJ0X3NlY3VyaXR5LAotICAgICAgICAgICAgZXhwZWN0ZWRfaW5pdF9ib25kX2V2ZW50PUJvbmRNc2dUeXBlLkRFVklDRV9CT05ERUQsCi0gICAgICAgICAgICBleHBlY3RlZF9yZXNwX2JvbmRfZXZlbnQ9Qm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCkKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmNlcnRfc2VjdXJpdHkuZ2V0X2FkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS5yZW1vdmVfYm9uZChzZWxmLmR1dF9zZWN1cml0eS5nZXRfYWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLkJsdWV0b290aEFkZHJlc3NUeXBlRW51bS5QVUJMSUNfREVWSUNFX0FERFJFU1MpCi0KLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkud2FpdF9mb3JfYm9uZF9ldmVudChCb25kTXNnVHlwZS5ERVZJQ0VfVU5CT05ERUQpCi0gICAgICAgIHNlbGYuY2VydF9zZWN1cml0eS53YWl0X2Zvcl9ib25kX2V2ZW50KEJvbmRNc2dUeXBlLkRFVklDRV9VTkJPTkRFRCkKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS53YWl0X2Zvcl9kaXNjb25uZWN0X2V2ZW50KCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LndhaXRfZm9yX2Rpc2Nvbm5lY3RfZXZlbnQoKQotCi0gICAgZGVmIHRlc3Rfc3VjY2Vzc2Z1bF9kdXRfaW5pdGlhdGVkX3BpbihzZWxmKToKLSAgICAgICAgc2VsZi5kdXRfc2VjdXJpdHkuc2V0X2lvX2NhcGFiaWxpdGllcyhJb0NhcGFiaWxpdGllcy5ESVNQTEFZX1lFU19OT19JT19DQVApCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnNldF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMoQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMuREVESUNBVEVEX0JPTkRJTkcpCi0KLSAgICAgICAgc2VsZi5fcnVuX3BpbigKLSAgICAgICAgICAgIGluaXRpYXRvcj1zZWxmLmR1dF9zZWN1cml0eSwKLSAgICAgICAgICAgIHJlc3BvbmRlcj1zZWxmLmNlcnRfc2VjdXJpdHksCi0gICAgICAgICAgICBleHBlY3RlZF9pbml0X2JvbmRfZXZlbnQ9Qm9uZE1zZ1R5cGUuREVWSUNFX0JPTkRFRCwKLSAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3BfYm9uZF9ldmVudD1Cb25kTXNnVHlwZS5ERVZJQ0VfQk9OREVEKQotCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LnJlbW92ZV9ib25kKHNlbGYuY2VydF9zZWN1cml0eS5nZXRfYWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LnJlbW92ZV9ib25kKHNlbGYuZHV0X3NlY3VyaXR5LmdldF9hZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uQmx1ZXRvb3RoQWRkcmVzc1R5cGVFbnVtLlBVQkxJQ19ERVZJQ0VfQUREUkVTUykKLQotICAgICAgICBzZWxmLmR1dF9zZWN1cml0eS53YWl0X2Zvcl9ib25kX2V2ZW50KEJvbmRNc2dUeXBlLkRFVklDRV9VTkJPTkRFRCkKLSAgICAgICAgc2VsZi5jZXJ0X3NlY3VyaXR5LndhaXRfZm9yX2JvbmRfZXZlbnQoQm9uZE1zZ1R5cGUuREVWSUNFX1VOQk9OREVEKQotCi0gICAgICAgIHNlbGYuZHV0X3NlY3VyaXR5LndhaXRfZm9yX2Rpc2Nvbm5lY3RfZXZlbnQoKQotICAgICAgICBzZWxmLmNlcnRfc2VjdXJpdHkud2FpdF9mb3JfZGlzY29ubmVjdF9ldmVudCgpCi0KLSAgICBkZWYgdGVzdF9tYWtlX3N1cmVfb29iX2RhdGFfZGlmZmVyZW50KHNlbGYpOgotICAgICAgICBvb2JfZGF0YSA9IHNlbGYuZHV0X3NlY3VyaXR5LmdldF9vb2JfZGF0YV9mcm9tX2NvbnRyb2xsZXIoT29iRGF0YVByZXNlbnQuUDE5Ml9QUkVTRU5UKQotICAgICAgICBvb2JfZGF0YTIgPSBzZWxmLmR1dF9zZWN1cml0eS5nZXRfb29iX2RhdGFfZnJvbV9jb250cm9sbGVyKE9vYkRhdGFQcmVzZW50LlAxOTJfUFJFU0VOVCkKLSAgICAgICAgYXNzZXJ0VGhhdChvb2JfZGF0YSkuaXNOb3RFcXVhbFRvKG9vYl9kYXRhMikKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2NoYW5uZWwvQW5kcm9pZC5icCBiL2dkL3NlY3VyaXR5L2NoYW5uZWwvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwNjlhMC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9jaGFubmVsL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhTZWN1cml0eUNoYW5uZWxTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwuY2MiLAotICAgIF0KLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoU2VjdXJpdHlDaGFubmVsVGVzdFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbF91bml0dGVzdC5jYyIsCi0gICAgXQotfQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvY2hhbm5lbC9zZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwuY2MgYi9nZC9zZWN1cml0eS9jaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5MGEzNi4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9jaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jaW5jbHVkZSAic2VjdXJpdHkvY2hhbm5lbC9zZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwuaCIKLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc21wX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotbmFtZXNwYWNlIGNoYW5uZWwgewotCi0vKioKLSAqIE1haW4gQ29uc3RydWN0b3IKLSAqLwotU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbDo6U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbChvczo6SGFuZGxlciogaGFuZGxlciwgaGNpOjpIY2lMYXllciogaGNpX2xheWVyKQotICAgIDogbGlzdGVuZXJfKG51bGxwdHIpLAotICAgICAgaGNpX3NlY3VyaXR5X2ludGVyZmFjZV8oCi0gICAgICAgICAgaGNpX2xheWVyLT5HZXRTZWN1cml0eUludGVyZmFjZShoYW5kbGVyLT5CaW5kT24odGhpcywgJlNlY3VyaXR5TWFuYWdlckNoYW5uZWw6Ok9uSGNpRXZlbnRSZWNlaXZlZCkpKSwKLSAgICAgIGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgbDJjYXBfc2VjdXJpdHlfaW50ZXJmYWNlXyhudWxscHRyKSB7fQotCi1TZWN1cml0eU1hbmFnZXJDaGFubmVsOjp+U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCgpIHsKLSAgbDJjYXBfc2VjdXJpdHlfaW50ZXJmYWNlXy0+VW5yZWdpc3RlcigpOwotICBsMmNhcF9zZWN1cml0eV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJDaGFubmVsOjpDb25uZWN0KGhjaTo6QWRkcmVzcyBhZGRyZXNzKSB7Ci0gIEFTU0VSVF9MT0cobDJjYXBfc2VjdXJpdHlfaW50ZXJmYWNlXyAhPSBudWxscHRyLCAiTDJjYXAgU2VjdXJpdHkgSW50ZXJmYWNlIGlzIG51bGwhIik7Ci0gIGF1dG8gZW50cnkgPSBsaW5rX21hcF8uZmluZChhZGRyZXNzKTsKLSAgaWYgKGVudHJ5ICE9IGxpbmtfbWFwXy5lbmQoKSkgewotICAgIExPR19XQVJOKCJBbHJlYWR5IGNvbm5lY3RlZCB0byAnJXMnIiwgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGVudHJ5LT5zZWNvbmQtPkhvbGQoKTsKLSAgICBlbnRyeS0+c2Vjb25kLT5FbnN1cmVBdXRoZW50aWNhdGVkKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGwyY2FwX3NlY3VyaXR5X2ludGVyZmFjZV8tPkluaXRpYXRlQ29ubmVjdGlvbkZvclNlY3VyaXR5KGFkZHJlc3MpOwotICBvdXRnb2luZ19wYWlyaW5nX3JlbW90ZV9kZXZpY2VzXy5pbnNlcnQoYWRkcmVzcyk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbDo6UmVsZWFzZShoY2k6OkFkZHJlc3MgYWRkcmVzcykgewotICBhdXRvIGVudHJ5ID0gbGlua19tYXBfLmZpbmQoYWRkcmVzcyk7Ci0gIGlmIChlbnRyeSA9PSBsaW5rX21hcF8uZW5kKCkpIHsKLSAgICBMT0dfV0FSTigiVW5rbm93biBhZGRyZXNzICclcyciLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVudHJ5LT5zZWNvbmQtPlJlbGVhc2UoKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJDaGFubmVsOjpEaXNjb25uZWN0KGhjaTo6QWRkcmVzcyBhZGRyZXNzKSB7Ci0gIG91dGdvaW5nX3BhaXJpbmdfcmVtb3RlX2RldmljZXNfLmVyYXNlKGFkZHJlc3MpOwotICBhdXRvIGVudHJ5ID0gbGlua19tYXBfLmZpbmQoYWRkcmVzcyk7Ci0gIGlmIChlbnRyeSA9PSBsaW5rX21hcF8uZW5kKCkpIHsKLSAgICBMT0dfV0FSTigiVW5rbm93biBhZGRyZXNzICclcyciLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVudHJ5LT5zZWNvbmQtPkRpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJDaGFubmVsOjpPbkNvbW1hbmRDb21wbGV0ZShoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVF9MT0cocGFja2V0LklzVmFsaWQoKSwgIkJhZCBjb21tYW5kIHJlc3BvbnNlIik7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbDo6U2VuZENvbW1hbmQoc3RkOjp1bmlxdWVfcHRyPGhjaTo6U2VjdXJpdHlDb21tYW5kQnVpbGRlcj4gY29tbWFuZCkgewotICBoY2lfc2VjdXJpdHlfaW50ZXJmYWNlXy0+RW5xdWV1ZUNvbW1hbmQoc3RkOjptb3ZlKGNvbW1hbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJlNlY3VyaXR5TWFuYWdlckNoYW5uZWw6Ok9uQ29tbWFuZENvbXBsZXRlKSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbDo6U2VuZENvbW1hbmQoCi0gICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6U2VjdXJpdHlDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwgU2VjdXJpdHlDb21tYW5kU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgaGNpX3NlY3VyaXR5X2ludGVyZmFjZV8tPkVucXVldWVDb21tYW5kKHN0ZDo6bW92ZShjb21tYW5kKSwgc3RkOjpmb3J3YXJkPFNlY3VyaXR5Q29tbWFuZFN0YXR1c0NhbGxiYWNrPihjYWxsYmFjaykpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckNoYW5uZWw6Ok9uSGNpRXZlbnRSZWNlaXZlZChoY2k6OkV2ZW50VmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUX0xPRyhsaXN0ZW5lcl8gIT0gbnVsbHB0ciwgIk5vIGxpc3RlbmVyIHNldCEiKTsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBsaXN0ZW5lcl8tPk9uSGNpRXZlbnRSZWNlaXZlZChwYWNrZXQpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckNoYW5uZWw6Ok9uTGlua0Nvbm5lY3RlZChzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OmNsYXNzaWM6OkxpbmtTZWN1cml0eUludGVyZmFjZT4gbGluaykgewotICAvLyBNdWx0aXBsZSBsaW5rcyBwb3NzaWJsZT8KLSAgYXV0byByZW1vdGUgPSBsaW5rLT5HZXRSZW1vdGVBZGRyZXNzKCk7Ci0gIGlmIChvdXRnb2luZ19wYWlyaW5nX3JlbW90ZV9kZXZpY2VzXy5jb3VudChyZW1vdGUpID09IDEpIHsKLSAgICBsaW5rLT5Ib2xkKCk7Ci0gICAgbGluay0+RW5zdXJlQXV0aGVudGljYXRlZCgpOwotICAgIG91dGdvaW5nX3BhaXJpbmdfcmVtb3RlX2RldmljZXNfLmVyYXNlKHJlbW90ZSk7Ci0gIH0KLSAgbGlua19tYXBfLmVtcGxhY2UocmVtb3RlLCBzdGQ6Om1vdmUobGluaykpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckNoYW5uZWw6Ok9uTGlua0Rpc2Nvbm5lY3RlZChoY2k6OkFkZHJlc3MgYWRkcmVzcykgewotICBhdXRvIGVudHJ5ID0gbGlua19tYXBfLmZpbmQoYWRkcmVzcyk7Ci0gIGlmIChlbnRyeSA9PSBsaW5rX21hcF8uZW5kKCkpIHsKLSAgICBMT0dfV0FSTigiVW5rbm93biBhZGRyZXNzICclcyciLCBhZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVudHJ5LT5zZWNvbmQucmVzZXQoKTsKLSAgbGlua19tYXBfLmVyYXNlKGVudHJ5KTsKLSAgQVNTRVJUX0xPRyhsaXN0ZW5lcl8gIT0gbnVsbHB0ciwgIlNldCBsaXN0ZW5lciEiKTsKLSAgbGlzdGVuZXJfLT5PbkNvbm5lY3Rpb25DbG9zZWQoYWRkcmVzcyk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbDo6T25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsIGhjaTo6QWRkcmVzcyByZW1vdGUpIHsKLSAgQVNTRVJUX0xPRyhsMmNhcF9zZWN1cml0eV9pbnRlcmZhY2VfICE9IG51bGxwdHIsICJMMmNhcCBTZWN1cml0eSBJbnRlcmZhY2UgaXMgbnVsbCEiKTsKLSAgYXV0byBlbnRyeSA9IGxpbmtfbWFwXy5maW5kKHJlbW90ZSk7Ci0gIGlmIChlbnRyeSAhPSBsaW5rX21hcF8uZW5kKCkpIHsKLSAgICBlbnRyeS0+c2Vjb25kLT5FbnN1cmVFbmNyeXB0ZWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJDaGFubmVsOjpPbkVuY3J5cHRpb25DaGFuZ2UoaGNpOjpBZGRyZXNzIHJlbW90ZSwgYm9vbCBlbmNyeXB0ZWQpIHsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNoYW5uZWwKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvY2hhbm5lbC9zZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwuaCBiL2dkL3NlY3VyaXR5L2NoYW5uZWwvc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjM2MDQuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvY2hhbm5lbC9zZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDsKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb21tb24vY29udGV4dHVhbF9jYWxsYmFjay5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJoY2kvc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvbGlua19zZWN1cml0eV9pbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotbmFtZXNwYWNlIGNoYW5uZWwgewotCi11c2luZyBTZWN1cml0eUNvbW1hbmRTdGF0dXNDYWxsYmFjayA9IGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyk+OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgbGlzdGVuaW5nIHRvIHRoZSBjaGFubmVsIGZvciBTTVAgY29tbWFuZHMuCi0gKi8KLWNsYXNzIElTZWN1cml0eU1hbmFnZXJDaGFubmVsTGlzdGVuZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SVNlY3VyaXR5TWFuYWdlckNoYW5uZWxMaXN0ZW5lcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE9uSGNpRXZlbnRSZWNlaXZlZChoY2k6OkV2ZW50VmlldyBwYWNrZXQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvbkNsb3NlZChoY2k6OkFkZHJlc3MpID0gMDsKLX07Ci0KLS8qKgotICogQ2hhbm5lbCBmb3IgY29uc29saWRhdGluZyB0cmFmZmljIGFuZCBtYWtpbmcgdGhlIHRyYW5zcG9ydCBhZ25vc3RpYy4KLSAqLwotY2xhc3MgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCA6IHB1YmxpYyBsMmNhcDo6Y2xhc3NpYzo6TGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIgewotIHB1YmxpYzoKLSAgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbChvczo6SGFuZGxlciogaGFuZGxlciwgaGNpOjpIY2lMYXllciogaGNpX2xheWVyKTsKLQotICB2aXJ0dWFsIH5TZWN1cml0eU1hbmFnZXJDaGFubmVsKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkZXZpY2Ugd2hpY2ggdHJpZ2dlcnMgcGFpcmluZwotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyByZW1vdGUgYWRkcmVzcyBvZiBkZXZpY2UgdG8gcGFpciB3aXRoCi0gICAqLwotICB2b2lkIENvbm5lY3QoaGNpOjpBZGRyZXNzIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBSZWxlYXNlcyBsaW5rIGhvbGQgc28gaXQgY2FuIGRpc2Nvbm5lY3QgYXMgbm9ybWFsbHkKLSAgICoKLSAgICogaS5lLiBzaWduYWxzIHdlIG5vIGxvbmdlciBuZWVkIHRoaXMgaWYgYWNsIG1hbmFnZXIgd2FudHMgdG8gY2xlYW4gaXQgdXAKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgcmVtb3RlIGFkZHJlc3MgdG8gZGlzY29ubmVjdAotICAgKi8KLSAgdm9pZCBSZWxlYXNlKGhjaTo6QWRkcmVzcyBhZGRyZXNzKTsKLQotICAvKioKLSAgICogSW1tZWRpYXRlbHkgZGlzY29ubmVjdHMgY3VycmVudGx5IGNvbm5lY3RlZCBjaGFubmVsCi0gICAqCi0gICAqIGkuZS4gZm9yY2UgZGlzY29ubmVjdAotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyByZW1vdGUgYWRkcmVzcyB0byBkaXNjb25uZWN0Ci0gICAqLwotICB2b2lkIERpc2Nvbm5lY3QoaGNpOjpBZGRyZXNzIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBTZW5kIGEgZ2l2ZW4gU01QIGNvbW1hbmQgb3ZlciB0aGUgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbAotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCBzbXAgY29tbWFuZCB0byBzZW5kCi0gICAqLwotICB2b2lkIFNlbmRDb21tYW5kKHN0ZDo6dW5pcXVlX3B0cjxoY2k6OlNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQpOwotCi0gIC8qKgotICAgKiBTZW5kIGEgZ2l2ZW4gU01QIGNvbW1hbmQgb3ZlciB0aGUgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbAotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCBzbXAgY29tbWFuZCB0byBzZW5kCi0gICAqIEBwYXJhbSBjYWxsYmFjayBsaXN0ZW5lciB0byBjYWxsIHdoZW4gY29tbWFuZCBzdGF0dXMgY29tcGxldGUKLSAgICovCi0gIHZvaWQgU2VuZENvbW1hbmQoc3RkOjp1bmlxdWVfcHRyPGhjaTo6U2VjdXJpdHlDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwgU2VjdXJpdHlDb21tYW5kU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIGNoYW5uZWwgZXZlbnRzCi0gICAqCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgY2FsbGVyIGludGVyZXN0ZWQgaW4gZXZlbnRzCi0gICAqLwotICB2b2lkIFNldENoYW5uZWxMaXN0ZW5lcihJU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbExpc3RlbmVyKiBsaXN0ZW5lcikgewotICAgIGxpc3RlbmVyXyA9IGxpc3RlbmVyOwotICB9Ci0KLSAgdm9pZCBTZXRTZWN1cml0eUludGVyZmFjZShsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlJbnRlcmZhY2UqIHNlY3VyaXR5X2ludGVyZmFjZSkgewotICAgIGwyY2FwX3NlY3VyaXR5X2ludGVyZmFjZV8gPSBzZWN1cml0eV9pbnRlcmZhY2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYW4gaW5jb21pbmcgSENJIGV2ZW50IGhhcHBlbnMKLSAgICoKLSAgICogQHBhcmFtIGV2ZW50X3BhY2tldAotICAgKi8KLSAgdm9pZCBPbkhjaUV2ZW50UmVjZWl2ZWQoaGNpOjpFdmVudFZpZXcgcGFja2V0KTsKLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYW4gSENJIGNvbW1hbmQgaXMgY29tcGxldGVkCi0gICAqCi0gICAqIEBwYXJhbSBvbl9jb21wbGV0ZQotICAgKi8KLSAgdm9pZCBPbkNvbW1hbmRDb21wbGV0ZShoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgcGFja2V0KTsKLQotICAvLyBJbnRlcmZhY2Ugb3ZlcnJpZGVzCi0gIHZvaWQgT25MaW5rQ29ubmVjdGVkKHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6Y2xhc3NpYzo6TGlua1NlY3VyaXR5SW50ZXJmYWNlPiBsaW5rKSBvdmVycmlkZTsKLSAgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIG92ZXJyaWRlOwotICB2b2lkIE9uQXV0aGVudGljYXRpb25Db21wbGV0ZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLCBoY2k6OkFkZHJlc3MgcmVtb3RlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkVuY3J5cHRpb25DaGFuZ2UoaGNpOjpBZGRyZXNzLCBib29sIGVuY3J5cHRlZCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBJU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbExpc3RlbmVyKiBsaXN0ZW5lcl97bnVsbHB0cn07Ci0gIGhjaTo6U2VjdXJpdHlJbnRlcmZhY2UqIGhjaV9zZWN1cml0eV9pbnRlcmZhY2Vfe251bGxwdHJ9OwotICBvczo6SGFuZGxlciogaGFuZGxlcl97bnVsbHB0cn07Ci0gIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUludGVyZmFjZSogbDJjYXBfc2VjdXJpdHlfaW50ZXJmYWNlX3tudWxscHRyfTsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpjbGFzc2ljOjpMaW5rU2VjdXJpdHlJbnRlcmZhY2U+PiBsaW5rX21hcF87Ci0gIHN0ZDo6c2V0PGhjaTo6QWRkcmVzcz4gb3V0Z29pbmdfcGFpcmluZ19yZW1vdGVfZGV2aWNlc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2hhbm5lbAotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9jaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbF91bml0dGVzdC5jYyBiL2dkL3NlY3VyaXR5L2NoYW5uZWwvc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmIxNmQ4Li4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2NoYW5uZWwvc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzA1ICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSNpbmNsdWRlICJzZWN1cml0eS9jaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbC5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc21wX3BhY2tldHMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS90ZXN0L2Zha2VfaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvdGVzdC9mYWtlX3NlY3VyaXR5X2ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgY2hhbm5lbCB7Ci1uYW1lc3BhY2UgewotCi11c2luZyBibHVldG9vdGg6OnNlY3VyaXR5OjpjaGFubmVsOjpTZWN1cml0eU1hbmFnZXJDaGFubmVsOwotdXNpbmcgaGNpOjpBZGRyZXNzOwotdXNpbmcgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czsKLXVzaW5nIGhjaTo6Q29tbWFuZENvbXBsZXRlQnVpbGRlcjsKLXVzaW5nIGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5QnVpbGRlcjsKLXVzaW5nIGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFZpZXc7Ci11c2luZyBoY2k6Ok9vYkRhdGFQcmVzZW50OwotdXNpbmcgaGNpOjpPcENvZGU7Ci11c2luZyBvczo6SGFuZGxlcjsKLXVzaW5nIG9zOjpUaHJlYWQ7Ci11c2luZyBwYWNrZXQ6OlJhd0J1aWxkZXI7Ci0KLXN0YXRpYyBib29sIG9uX2xpbmtfY29ubmVjdGVkX2NhbGxlZCA9IGZhbHNlOwotc3RhdGljIGJvb2wgb25fbGlua19kaXNjb25uZWN0ZWRfY2FsbGVkID0gZmFsc2U7Ci0KLWNsYXNzIEZha2VTZWN1cml0eU1hbmFnZXJDaGFubmVsIDogcHVibGljIFNlY3VyaXR5TWFuYWdlckNoYW5uZWwgewotIHB1YmxpYzoKLSAgRmFrZVNlY3VyaXR5TWFuYWdlckNoYW5uZWwob3M6OkhhbmRsZXIqIGhhbmRsZXIsIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllcikKLSAgICAgIDogU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbChoYW5kbGVyLCBoY2lfbGF5ZXIpIHt9Ci0gIH5GYWtlU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCgpIHt9Ci0KLSAgdm9pZCBPbkxpbmtDb25uZWN0ZWQoc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpjbGFzc2ljOjpMaW5rU2VjdXJpdHlJbnRlcmZhY2U+IGxpbmspIHsKLSAgICBvbl9saW5rX2Nvbm5lY3RlZF9jYWxsZWQgPSB0cnVlOwotICB9Ci0KLSAgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBvbl9saW5rX2Rpc2Nvbm5lY3RlZF9jYWxsZWQgPSB0cnVlOwotICB9Ci0KLSAgdm9pZCBPbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgaGNpOjpBZGRyZXNzIHJlbW90ZSkgb3ZlcnJpZGUge30KLQotICB2b2lkIE9uRW5jcnlwdGlvbkNoYW5nZShoY2k6OkFkZHJlc3MgYWRkcmVzcywgYm9vbCBlbmNyeXB0ZWQpIG92ZXJyaWRlIHt9Ci19OwotCi1jbGFzcyBTZWN1cml0eU1hbmFnZXJDaGFubmVsQ2FsbGJhY2sgOiBwdWJsaWMgSVNlY3VyaXR5TWFuYWdlckNoYW5uZWxMaXN0ZW5lciB7Ci0gcHVibGljOgotICAvLyBIQ0kKLSAgYm9vbCByZWNlaXZlZENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGUgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZENlbnRyYWxMaW5rS2V5Q29tcGxldGUgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZFBpbkNvZGVSZXF1ZXN0ID0gZmFsc2U7Ci0gIGJvb2wgcmVjZWl2ZWRMaW5rS2V5UmVxdWVzdCA9IGZhbHNlOwotICBib29sIHJlY2VpdmVkTGlua0tleU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotICBib29sIHJlY2VpdmVkSW9DYXBhYmlsaXR5UmVxdWVzdCA9IGZhbHNlOwotICBib29sIHJlY2VpdmVkSW9DYXBhYmlsaXR5UmVzcG9uc2UgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZFNpbXBsZVBhaXJpbmdDb21wbGV0ZSA9IGZhbHNlOwotICBib29sIHJlY2VpdmVkUmV0dXJuTGlua0tleXMgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZEVuY3J5cHRpb25DaGFuZ2UgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZEVuY3J5cHRpb25LZXlSZWZyZXNoQ29tcGxldGUgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZFJlbW90ZU9vYkRhdGFSZXF1ZXN0ID0gZmFsc2U7Ci0gIGJvb2wgcmVjZWl2ZWRVc2VyUGFzc2tleU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotICBib29sIHJlY2VpdmVkVXNlclBhc3NrZXlSZXF1ZXN0ID0gZmFsc2U7Ci0gIGJvb2wgcmVjZWl2ZWRLZXlwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotICBib29sIHJlY2VpdmVkVXNlckNvbmZpcm1hdGlvblJlcXVlc3QgPSBmYWxzZTsKLQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gICAgQVNTRVJUX1RSVUUocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgcmVjZWl2ZWRDaGFuZ2VDb25uZWN0aW9uTGlua0tleUNvbXBsZXRlID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6Q2VudHJhbExpbmtLZXlDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gICAgQVNTRVJUX1RSVUUocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgcmVjZWl2ZWRDZW50cmFsTGlua0tleUNvbXBsZXRlID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6UGluQ29kZVJlcXVlc3RWaWV3IHBhY2tldCkgewotICAgIEFTU0VSVF9UUlVFKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIHJlY2VpdmVkUGluQ29kZVJlcXVlc3QgPSB0cnVlOwotICB9Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXcgcGFja2V0KSB7Ci0gICAgQVNTRVJUX1RSVUUocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgcmVjZWl2ZWRMaW5rS2V5UmVxdWVzdCA9IHRydWU7Ci0gIH0KLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBoY2k6OkxpbmtLZXlOb3RpZmljYXRpb25WaWV3IHBhY2tldCkgewotICAgIEFTU0VSVF9UUlVFKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIHJlY2VpdmVkTGlua0tleU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0gIH0KLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RWaWV3IHBhY2tldCkgewotICAgIEFTU0VSVF9UUlVFKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIHJlY2VpdmVkSW9DYXBhYmlsaXR5UmVxdWVzdCA9IHRydWU7Ci0gIH0KLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlVmlldyBwYWNrZXQpIHsKLSAgICBBU1NFUlRfVFJVRShwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICByZWNlaXZlZElvQ2FwYWJpbGl0eVJlc3BvbnNlID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlVmlldyBwYWNrZXQpIHsKLSAgICBBU1NFUlRfVFJVRShwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICByZWNlaXZlZFNpbXBsZVBhaXJpbmdDb21wbGV0ZSA9IHRydWU7Ci0gIH0KLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBoY2k6OlJldHVybkxpbmtLZXlzVmlldyBwYWNrZXQpIHsKLSAgICBBU1NFUlRfVFJVRShwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICByZWNlaXZlZFJldHVybkxpbmtLZXlzID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6RW5jcnlwdGlvbkNoYW5nZVZpZXcgcGFja2V0KSB7Ci0gICAgQVNTRVJUX1RSVUUocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgcmVjZWl2ZWRFbmNyeXB0aW9uQ2hhbmdlID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6RW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gICAgQVNTRVJUX1RSVUUocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgcmVjZWl2ZWRFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3RWaWV3IHBhY2tldCkgewotICAgIEFTU0VSVF9UUlVFKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIHJlY2VpdmVkUmVtb3RlT29iRGF0YVJlcXVlc3QgPSB0cnVlOwotICB9Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgaGNpOjpVc2VyUGFzc2tleU5vdGlmaWNhdGlvblZpZXcgcGFja2V0KSB7Ci0gICAgQVNTRVJUX1RSVUUocGFja2V0LklzVmFsaWQoKSk7Ci0gICAgcmVjZWl2ZWRVc2VyUGFzc2tleU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0gIH0KLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVmlldyBwYWNrZXQpIHsKLSAgICBBU1NFUlRfVFJVRShwYWNrZXQuSXNWYWxpZCgpKTsKLSAgICByZWNlaXZlZEtleXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLSAgfQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RWaWV3IHBhY2tldCkgewotICAgIEFTU0VSVF9UUlVFKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIHJlY2VpdmVkVXNlckNvbmZpcm1hdGlvblJlcXVlc3QgPSB0cnVlOwotICB9Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgaGNpOjpVc2VyUGFzc2tleVJlcXVlc3RWaWV3IHBhY2tldCkgewotICAgIEFTU0VSVF9UUlVFKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIHJlY2VpdmVkVXNlclBhc3NrZXlSZXF1ZXN0ID0gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgT25IY2lFdmVudFJlY2VpdmVkKEV2ZW50VmlldyBwYWNrZXQpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGV2ZW50ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfTE9HKGV2ZW50LklzVmFsaWQoKSwgIlJlY2VpdmVkIGludmFsaWQgcGFja2V0Iik7Ci0gICAgY29uc3QgaGNpOjpFdmVudENvZGUgY29kZSA9IGV2ZW50LkdldEV2ZW50Q29kZSgpOwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6Q0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVlfQ09NUExFVEU6Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGVWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpDRU5UUkFMX0xJTktfS0VZX0NPTVBMRVRFOgotICAgICAgICBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUoKSwgaGNpOjpDZW50cmFsTGlua0tleUNvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVDoKLSAgICAgICAgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksIGhjaTo6UGluQ29kZVJlcXVlc3RWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpMSU5LX0tFWV9SRVFVRVNUOgotICAgICAgICBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUoKSwgaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkxJTktfS0VZX05PVElGSUNBVElPTjoKLSAgICAgICAgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksIGhjaTo6TGlua0tleU5vdGlmaWNhdGlvblZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVDoKLSAgICAgICAgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksIGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVTUE9OU0U6Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6U0lNUExFX1BBSVJJTkdfQ09NUExFVEU6Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlJFVFVSTl9MSU5LX0tFWVM6Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OlJldHVybkxpbmtLZXlzVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6RU5DUllQVElPTl9DSEFOR0U6Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpFTkNSWVBUSU9OX0tFWV9SRUZSRVNIX0NPTVBMRVRFOgotICAgICAgICBPblJlY2VpdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUoKSwgaGNpOjpFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1Q6Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0Vmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX05PVElGSUNBVElPTjoKLSAgICAgICAgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksIGhjaTo6VXNlclBhc3NrZXlOb3RpZmljYXRpb25WaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpLRVlQUkVTU19OT1RJRklDQVRJT046Ci0gICAgICAgIE9uUmVjZWl2ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLCBoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVDoKLSAgICAgICAgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksIGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpVU0VSX1BBU1NLRVlfUkVRVUVTVDoKLSAgICAgICAgT25SZWNlaXZlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksIGhjaTo6VXNlclBhc3NrZXlSZXF1ZXN0Vmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX0xPRyhmYWxzZSwgIkNhbm5vdCBoYW5kbGUgcmVjZWl2ZWQgcGFja2V0OiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChjb2RlKS5jX3N0cigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25DbG9zZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiQ2FsbGVkIik7Ci0gIH0KLX07Ci0KLWNsYXNzIFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzOwotICAgIGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZygiMDE6MjM6NDU6Njc6ODk6QUI6Q0QiLCBhZGRyZXNzKTsKLSAgICBkZXZpY2VfID0gaGNpOjpBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcywgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKTsKLSAgICBvbl9saW5rX2Nvbm5lY3RlZF9jYWxsZWQgPSBmYWxzZTsKLSAgICBvbl9saW5rX2Rpc2Nvbm5lY3RlZF9jYWxsZWQgPSBmYWxzZTsKLSAgICBoYW5kbGVyXyA9IG5ldyBIYW5kbGVyKCZ0aHJlYWRfKTsKLSAgICBjYWxsYmFja18gPSBuZXcgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbENhbGxiYWNrKCk7Ci0gICAgaGNpX2xheWVyXyA9IG5ldyBGYWtlSGNpTGF5ZXIoKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZGYWtlSGNpTGF5ZXI6OkZhY3RvcnksIGhjaV9sYXllcl8pOwotICAgIGZha2VfcmVnaXN0cnlfLlN0YXJ0PEZha2VIY2lMYXllcj4oJnRocmVhZF8pOwotICAgIGNoYW5uZWxfID0gbmV3IEZha2VTZWN1cml0eU1hbmFnZXJDaGFubmVsKGhhbmRsZXJfLCBoY2lfbGF5ZXJfKTsKLSAgICBjaGFubmVsXy0+U2V0Q2hhbm5lbExpc3RlbmVyKGNhbGxiYWNrXyk7Ci0gICAgc2VjdXJpdHlfaW50ZXJmYWNlXyA9IG5ldyBGYWtlU2VjdXJpdHlJbnRlcmZhY2UoaGFuZGxlcl8sIGNoYW5uZWxfKTsKLSAgICBjaGFubmVsXy0+U2V0U2VjdXJpdHlJbnRlcmZhY2Uoc2VjdXJpdHlfaW50ZXJmYWNlXyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGNoYW5uZWxfLT5TZXRDaGFubmVsTGlzdGVuZXIobnVsbHB0cik7Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgc3luY2hyb25pemUoKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSBjaGFubmVsXzsKLSAgICBkZWxldGUgY2FsbGJhY2tfOwotICAgIGRlbGV0ZSBzZWN1cml0eV9pbnRlcmZhY2VfOwotICB9Ci0KLSAgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkZha2VIY2lMYXllcjo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICB9Ci0KLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IGZha2VfcmVnaXN0cnlfOwotICBUaHJlYWQmIHRocmVhZF8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0VGhyZWFkKCk7Ci0gIEhhbmRsZXIqIGhhbmRsZXJfID0gbnVsbHB0cjsKLSAgRmFrZUhjaUxheWVyKiBoY2lfbGF5ZXJfID0gbnVsbHB0cjsKLSAgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5SW50ZXJmYWNlKiBzZWN1cml0eV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCogY2hhbm5lbF8gPSBudWxscHRyOwotICBTZWN1cml0eU1hbmFnZXJDaGFubmVsQ2FsbGJhY2sqIGNhbGxiYWNrXyA9IG51bGxwdHI7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZV87Ci19OwotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNldHVwX3RlYXJkb3duKSB7fQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHJlY3ZfaW9fY2FwX3JlcXVlc3QpIHsKLSAgaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCkpKTsKLSAgc3luY2hyb25pemUoKTsKLSAgQVNTRVJUX1RSVUUoY2FsbGJhY2tfLT5yZWNlaXZlZElvQ2FwYWJpbGl0eVJlcXVlc3QpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfaW9fY2FwX3JlcXVlc3RfcmVwbHkpIHsKLSAgLy8gQXJyYW5nZQotICBoY2k6OklvQ2FwYWJpbGl0eSBpb19jYXBhYmlsaXR5ID0gKGhjaTo6SW9DYXBhYmlsaXR5KTB4MDA7Ci0gIE9vYkRhdGFQcmVzZW50IG9vYl9wcmVzZW50ID0gKE9vYkRhdGFQcmVzZW50KTB4MDA7Ci0gIEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IChBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cykweDAwOwotICBhdXRvIHBhY2tldCA9IGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpLCBpb19jYXBhYmlsaXR5LCBvb2JfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBwYWNrZXRfdmlldy5HZXRPcENvZGUoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF9pb19jYXBfcmVxdWVzdF9uZWdfcmVwbHkpIHsKLSAgLy8gQXJyYW5nZQotICBhdXRvIHBhY2tldCA9Ci0gICAgICBoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpLCBoY2k6OkVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEKTsKLQotICAvLyBBY3QKLSAgY2hhbm5lbF8tPlNlbmRDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgYXV0byBsYXN0X2NvbW1hbmQgPSBzdGQ6Om1vdmUoaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoKS0+Y29tbWFuZCk7Ci0gIGF1dG8gY29tbWFuZF9wYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0X2NvbW1hbmQpKTsKLSAgaGNpOjpDb21tYW5kVmlldyBwYWNrZXRfdmlldyA9IGhjaTo6Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldCk7Ci0KLSAgLy8gQXNzZXJ0Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHJlY3ZfaW9fY2FwX3Jlc3BvbnNlKSB7Ci0gIGhjaTo6SW9DYXBhYmlsaXR5IGlvX2NhcGFiaWxpdHkgPSAoaGNpOjpJb0NhcGFiaWxpdHkpMHgwMDsKLSAgT29iRGF0YVByZXNlbnQgb29iX3ByZXNlbnQgPSAoT29iRGF0YVByZXNlbnQpMHgwMDsKLSAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gKEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKTB4MDA7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoaGNpOjpJb0NhcGFiaWxpdHlSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZShkZXZpY2VfLkdldEFkZHJlc3MoKSwgaW9fY2FwYWJpbGl0eSwgb29iX3ByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpKTsKLSAgc3luY2hyb25pemUoKTsKLSAgQVNTRVJUX1RSVUUoY2FsbGJhY2tfLT5yZWNlaXZlZElvQ2FwYWJpbGl0eVJlc3BvbnNlKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCByZWN2X3Bpbl9jb2RlX3JlcXVlc3QpIHsKLSAgaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChoY2k6OlBpbkNvZGVSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpKSk7Ci0gIHN5bmNocm9uaXplKCk7Ci0gIEFTU0VSVF9UUlVFKGNhbGxiYWNrXy0+cmVjZWl2ZWRQaW5Db2RlUmVxdWVzdCk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF9waW5fY29kZV9yZXF1ZXN0X3JlcGx5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgdWludDhfdCBwaW5fY29kZV9sZW5ndGggPSA2OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBwaW5fY29kZSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgYXV0byBwYWNrZXQgPSBoY2k6OlBpbkNvZGVSZXF1ZXN0UmVwbHlCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCksIHBpbl9jb2RlX2xlbmd0aCwgcGluX2NvZGUpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6UElOX0NPREVfUkVRVUVTVF9SRVBMWSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfcGluX2NvZGVfcmVxdWVzdF9uZWdfcmVwbHkpIHsKLSAgLy8gQXJyYW5nZQotICBhdXRvIHBhY2tldCA9IGhjaTo6UGluQ29kZVJlcXVlc3ROZWdhdGl2ZVJlcGx5QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpKTsKLQotICAvLyBBY3QKLSAgY2hhbm5lbF8tPlNlbmRDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgYXV0byBsYXN0X2NvbW1hbmQgPSBzdGQ6Om1vdmUoaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoKS0+Y29tbWFuZCk7Ci0gIGF1dG8gY29tbWFuZF9wYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0X2NvbW1hbmQpKTsKLSAgaGNpOjpDb21tYW5kVmlldyBwYWNrZXRfdmlldyA9IGhjaTo6Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldCk7Ci0KLSAgLy8gQXNzZXJ0Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlBJTl9DT0RFX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCByZWN2X3VzZXJfcGFzc2tleV9ub3RpZmljYXRpb24pIHsKLSAgdWludDMyX3QgcGFzc2tleSA9IDB4MDA7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoaGNpOjpVc2VyUGFzc2tleU5vdGlmaWNhdGlvbkJ1aWxkZXI6OkNyZWF0ZShkZXZpY2VfLkdldEFkZHJlc3MoKSwgcGFzc2tleSkpOwotICBzeW5jaHJvbml6ZSgpOwotICBBU1NFUlRfVFJVRShjYWxsYmFja18tPnJlY2VpdmVkVXNlclBhc3NrZXlOb3RpZmljYXRpb24pOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHJlY3ZfdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdCkgewotICB1aW50MzJfdCBudW1lcmljX3ZhbHVlID0gMHgwOwotICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCksIG51bWVyaWNfdmFsdWUpKTsKLSAgc3luY2hyb25pemUoKTsKLSAgQVNTRVJUX1RSVUUoY2FsbGJhY2tfLT5yZWNlaXZlZFVzZXJDb25maXJtYXRpb25SZXF1ZXN0KTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCBzZW5kX3VzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfcmVwbHkpIHsKLSAgLy8gQXJyYW5nZQotICBhdXRvIHBhY2tldCA9IGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZShkZXZpY2VfLkdldEFkZHJlc3MoKSk7Ci0KLSAgLy8gQWN0Ci0gIGNoYW5uZWxfLT5TZW5kQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gbGFzdF9jb21tYW5kID0gc3RkOjptb3ZlKGhjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKCktPmNvbW1hbmQpOwotICBhdXRvIGNvbW1hbmRfcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobGFzdF9jb21tYW5kKSk7Ci0gIGhjaTo6Q29tbWFuZFZpZXcgcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXQpOwotCi0gIC8vIEFzc2VydAotICBBU1NFUlRfVFJVRShwYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZLCBwYWNrZXRfdmlldy5HZXRPcENvZGUoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF91c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0X25lZ2F0aXZlX3JlcGx5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgYXV0byBwYWNrZXQgPSBoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseUJ1aWxkZXI6OkNyZWF0ZShkZXZpY2VfLkdldEFkZHJlc3MoKSk7Ci0KLSAgLy8gQWN0Ci0gIGNoYW5uZWxfLT5TZW5kQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gbGFzdF9jb21tYW5kID0gc3RkOjptb3ZlKGhjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKCktPmNvbW1hbmQpOwotICBhdXRvIGNvbW1hbmRfcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobGFzdF9jb21tYW5kKSk7Ci0gIGhjaTo6Q29tbWFuZFZpZXcgcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXQpOwotCi0gIC8vIEFzc2VydAotICBBU1NFUlRfVFJVRShwYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX05FR0FUSVZFX1JFUExZLCBwYWNrZXRfdmlldy5HZXRPcENvZGUoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgcmVjdl9yZW1vdGVfb29iX2RhdGFfcmVxdWVzdCkgewotICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KGhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCkpKTsKLSAgc3luY2hyb25pemUoKTsKLSAgQVNTRVJUX1RSVUUoY2FsbGJhY2tfLT5yZWNlaXZlZFJlbW90ZU9vYkRhdGFSZXF1ZXN0KTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCBzZW5kX3JlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X3JlcGx5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gYyA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gciA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgYXV0byBwYWNrZXQgPSBoY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHlCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCksIGMsIHIpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFksIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCBzZW5kX3JlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0X25lZ19yZXBseSkgewotICAvLyBBcnJhbmdlCi0gIGF1dG8gcGFja2V0ID0gaGNpOjpSZW1vdGVPb2JEYXRhUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCkpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCBzZW5kX3JlYWRfbG9jYWxfb29iX2RhdGEpIHsKLSAgLy8gQXJyYW5nZQotICBhdXRvIHBhY2tldCA9IGhjaTo6UmVhZExvY2FsT29iRGF0YUJ1aWxkZXI6OkNyZWF0ZSgpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6UkVBRF9MT0NBTF9PT0JfREFUQSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfcmVhZF9sb2NhbF9vb2JfZXh0ZW5kZWRfZGF0YSkgewotICAvLyBBcnJhbmdlCi0gIGF1dG8gcGFja2V0ID0gaGNpOjpSZWFkTG9jYWxPb2JFeHRlbmRlZERhdGFCdWlsZGVyOjpDcmVhdGUoKTsKLQotICAvLyBBY3QKLSAgY2hhbm5lbF8tPlNlbmRDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgYXV0byBsYXN0X2NvbW1hbmQgPSBzdGQ6Om1vdmUoaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoKS0+Y29tbWFuZCk7Ci0gIGF1dG8gY29tbWFuZF9wYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0X2NvbW1hbmQpKTsKLSAgaGNpOjpDb21tYW5kVmlldyBwYWNrZXRfdmlldyA9IGhjaTo6Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldCk7Ci0KLSAgLy8gQXNzZXJ0Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlJFQURfTE9DQUxfT09CX0VYVEVOREVEX0RBVEEsIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCByZWN2X2xpbmtfa2V5X3JlcXVlc3QpIHsKLSAgaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChoY2k6OkxpbmtLZXlSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpKSk7Ci0gIHN5bmNocm9uaXplKCk7Ci0gIEFTU0VSVF9UUlVFKGNhbGxiYWNrXy0+cmVjZWl2ZWRMaW5rS2V5UmVxdWVzdCk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgcmVjdl9saW5rX2tleV9ub3RpZmljYXRpb24pIHsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbGlua19rZXkgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNX07Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBoY2k6OkxpbmtLZXlOb3RpZmljYXRpb25CdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCksIGxpbmtfa2V5LCBoY2k6OktleVR5cGU6OkRFQlVHX0NPTUJJTkFUSU9OKSk7Ci0gIHN5bmNocm9uaXplKCk7Ci0gIEFTU0VSVF9UUlVFKGNhbGxiYWNrXy0+cmVjZWl2ZWRMaW5rS2V5Tm90aWZpY2F0aW9uKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCByZWN2X2NlbnRyYWxfbGlua19rZXlfY29tcGxldGUpIHsKLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUgPSAweDA7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBoY2k6OkNlbnRyYWxMaW5rS2V5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGNvbm5lY3Rpb25faGFuZGxlLCBoY2k6OktleUZsYWc6OlRFTVBPUkFSWSkpOwotICBzeW5jaHJvbml6ZSgpOwotICBBU1NFUlRfVFJVRShjYWxsYmFja18tPnJlY2VpdmVkQ2VudHJhbExpbmtLZXlDb21wbGV0ZSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgcmVjdl9jaGFuZ2VfY29ubmVjdGlvbl9saW5rX2tleV9jb21wbGV0ZSkgewotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSA9IDB4MDsKLSAgaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudCgKLSAgICAgIGhjaTo6Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgY29ubmVjdGlvbl9oYW5kbGUpKTsKLSAgc3luY2hyb25pemUoKTsKLSAgQVNTRVJUX1RSVUUoY2FsbGJhY2tfLT5yZWNlaXZlZENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGUpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHJlY3ZfcmV0dXJuX2xpbmtfa2V5cykgewotICBzdGQ6OnZlY3RvcjxoY2k6Olplcm9LZXlBbmRBZGRyZXNzPiBrZXlzOwotICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KGhjaTo6UmV0dXJuTGlua0tleXNCdWlsZGVyOjpDcmVhdGUoa2V5cykpOwotICBzeW5jaHJvbml6ZSgpOwotICBBU1NFUlRfVFJVRShjYWxsYmFja18tPnJlY2VpdmVkUmV0dXJuTGlua0tleXMpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfbGlua19rZXlfcmVxdWVzdF9yZXBseSkgewotICAvLyBBcnJhbmdlCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxpbmtfa2V5ID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsIDEsIDIsIDMsIDQsIDV9OwotICBhdXRvIHBhY2tldCA9IGhjaTo6TGlua0tleVJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZShkZXZpY2VfLkdldEFkZHJlc3MoKSwgbGlua19rZXkpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9SRVBMWSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfbGlua19rZXlfcmVxdWVzdF9uZWdfcmVwbHkpIHsKLSAgLy8gQXJyYW5nZQotICBhdXRvIHBhY2tldCA9IGhjaTo6TGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpKTsKLQotICAvLyBBY3QKLSAgY2hhbm5lbF8tPlNlbmRDb21tYW5kKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgYXV0byBsYXN0X2NvbW1hbmQgPSBzdGQ6Om1vdmUoaGNpX2xheWVyXy0+R2V0TGFzdENvbW1hbmQoKS0+Y29tbWFuZCk7Ci0gIGF1dG8gY29tbWFuZF9wYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0X2NvbW1hbmQpKTsKLSAgaGNpOjpDb21tYW5kVmlldyBwYWNrZXRfdmlldyA9IGhjaTo6Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldCk7Ci0KLSAgLy8gQXNzZXJ0Ci0gIEFTU0VSVF9UUlVFKHBhY2tldF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCBzZW5kX3JlYWRfc3RvcmVkX2xpbmtfa2V5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgYXV0byBwYWNrZXQgPSBoY2k6OlJlYWRTdG9yZWRMaW5rS2V5QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpLCBoY2k6OlJlYWRTdG9yZWRMaW5rS2V5UmVhZEFsbEZsYWc6OkFMTCk7Ci0KLSAgLy8gQWN0Ci0gIGNoYW5uZWxfLT5TZW5kQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gbGFzdF9jb21tYW5kID0gc3RkOjptb3ZlKGhjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKCktPmNvbW1hbmQpOwotICBhdXRvIGNvbW1hbmRfcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobGFzdF9jb21tYW5kKSk7Ci0gIGhjaTo6Q29tbWFuZFZpZXcgcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXQpOwotCi0gIC8vIEFzc2VydAotICBBU1NFUlRfVFJVRShwYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpSRUFEX1NUT1JFRF9MSU5LX0tFWSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfd3JpdGVfc3RvcmVkX2xpbmtfa2V5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgc3RkOjp2ZWN0b3I8aGNpOjpLZXlBbmRBZGRyZXNzPiBrZXlzX3RvX3dyaXRlOwotICBhdXRvIHBhY2tldCA9IGhjaTo6V3JpdGVTdG9yZWRMaW5rS2V5QnVpbGRlcjo6Q3JlYXRlKGtleXNfdG9fd3JpdGUpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6V1JJVEVfU1RPUkVEX0xJTktfS0VZLCBwYWNrZXRfdmlldy5HZXRPcENvZGUoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF9kZWxldGVfc3RvcmVkX2xpbmtfa2V5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgYXV0byBwYWNrZXQgPQotICAgICAgaGNpOjpEZWxldGVTdG9yZWRMaW5rS2V5QnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpLCBoY2k6OkRlbGV0ZVN0b3JlZExpbmtLZXlEZWxldGVBbGxGbGFnOjpBTEwpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6REVMRVRFX1NUT1JFRF9MSU5LX0tFWSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHJlY3ZfZW5jcnlwdGlvbl9jaGFuZ2UpIHsKLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUgPSAweDA7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBoY2k6OkVuY3J5cHRpb25DaGFuZ2VCdWlsZGVyOjpDcmVhdGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGNvbm5lY3Rpb25faGFuZGxlLCBoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpPTikpOwotICBzeW5jaHJvbml6ZSgpOwotICBBU1NFUlRfVFJVRShjYWxsYmFja18tPnJlY2VpdmVkRW5jcnlwdGlvbkNoYW5nZSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgcmVjdl9lbmNyeXB0aW9uX2tleV9yZWZyZXNoKSB7Ci0gIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlID0gMHgwOwotICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgaGNpOjpFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCBjb25uZWN0aW9uX2hhbmRsZSkpOwotICBzeW5jaHJvbml6ZSgpOwotICBBU1NFUlRfVFJVRShjYWxsYmFja18tPnJlY2VpdmVkRW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF9yZWZyZXNoX2VuY3J5cHRpb25fa2V5KSB7Ci0gIC8vIEFycmFuZ2UKLSAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUgPSAweDA7Ci0gIGF1dG8gcGFja2V0ID0gaGNpOjpSZWZyZXNoRW5jcnlwdGlvbktleUJ1aWxkZXI6OkNyZWF0ZShjb25uZWN0aW9uX2hhbmRsZSk7Ci0KLSAgLy8gQWN0Ci0gIGNoYW5uZWxfLT5TZW5kQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gbGFzdF9jb21tYW5kID0gc3RkOjptb3ZlKGhjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKCktPmNvbW1hbmQpOwotICBhdXRvIGNvbW1hbmRfcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobGFzdF9jb21tYW5kKSk7Ci0gIGhjaTo6Q29tbWFuZFZpZXcgcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXQpOwotCi0gIC8vIEFzc2VydAotICBBU1NFUlRfVFJVRShwYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpSRUZSRVNIX0VOQ1JZUFRJT05fS0VZLCBwYWNrZXRfdmlldy5HZXRPcENvZGUoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF9yZWFkX2VuY3J5cHRpb25fa2V5X3NpemUpIHsKLSAgLy8gQXJyYW5nZQotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSA9IDB4MDsKLSAgYXV0byBwYWNrZXQgPSBoY2k6OlJlYWRFbmNyeXB0aW9uS2V5U2l6ZUJ1aWxkZXI6OkNyZWF0ZShjb25uZWN0aW9uX2hhbmRsZSk7Ci0KLSAgLy8gQWN0Ci0gIGNoYW5uZWxfLT5TZW5kQ29tbWFuZChzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIGF1dG8gbGFzdF9jb21tYW5kID0gc3RkOjptb3ZlKGhjaV9sYXllcl8tPkdldExhc3RDb21tYW5kKCktPmNvbW1hbmQpOwotICBhdXRvIGNvbW1hbmRfcGFja2V0ID0gR2V0UGFja2V0VmlldyhzdGQ6Om1vdmUobGFzdF9jb21tYW5kKSk7Ci0gIGhjaTo6Q29tbWFuZFZpZXcgcGFja2V0X3ZpZXcgPSBoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZF9wYWNrZXQpOwotCi0gIC8vIEFzc2VydAotICBBU1NFUlRfVFJVRShwYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpSRUFEX0VOQ1JZUFRJT05fS0VZX1NJWkUsIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCByZWN2X3NpbXBsZV9wYWlyaW5nX2NvbXBsZXRlKSB7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoaGNpOjpTaW1wbGVQYWlyaW5nQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGRldmljZV8uR2V0QWRkcmVzcygpKSk7Ci0gIHN5bmNocm9uaXplKCk7Ci0gIEFTU0VSVF9UUlVFKGNhbGxiYWNrXy0+cmVjZWl2ZWRTaW1wbGVQYWlyaW5nQ29tcGxldGUpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHNlbmRfcmVhZF9zaW1wbGVfcGFpcmluZ19tb2RlKSB7Ci0gIC8vIEFycmFuZ2UKLSAgYXV0byBwYWNrZXQgPSBoY2k6OlJlYWRTaW1wbGVQYWlyaW5nTW9kZUJ1aWxkZXI6OkNyZWF0ZSgpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6UkVBRF9TSU1QTEVfUEFJUklOR19NT0RFLCBwYWNrZXRfdmlldy5HZXRPcENvZGUoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF93cml0ZV9zaW1wbGVfcGFpcmluZ19tb2RlKSB7Ci0gIC8vIEFycmFuZ2UKLSAgYXV0byBwYWNrZXQgPSBoY2k6OldyaXRlU2ltcGxlUGFpcmluZ01vZGVCdWlsZGVyOjpDcmVhdGUoaGNpOjpFbmFibGU6OkVOQUJMRUQpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6V1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERSwgcGFja2V0X3ZpZXcuR2V0T3BDb2RlKCkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbFRlc3QsIHJlY3Zfa2V5cHJlc3Nfbm90aWZpY2F0aW9uKSB7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoCi0gICAgICBoY2k6OktleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcjo6Q3JlYXRlKGRldmljZV8uR2V0QWRkcmVzcygpLCBoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVHlwZTo6RU5UUllfQ09NUExFVEVEKSk7Ci0gIHN5bmNocm9uaXplKCk7Ci0gIEFTU0VSVF9UUlVFKGNhbGxiYWNrXy0+cmVjZWl2ZWRLZXlwcmVzc05vdGlmaWNhdGlvbik7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgc2VuZF9rZXlwcmVzc19ub3RpZmljYXRpb24pIHsKLSAgLy8gQXJyYW5nZQotICBhdXRvIHBhY2tldCA9Ci0gICAgICBoY2k6OlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbkJ1aWxkZXI6OkNyZWF0ZShkZXZpY2VfLkdldEFkZHJlc3MoKSwgaGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblR5cGU6OkVOVFJZX1NUQVJURUQpOwotCi0gIC8vIEFjdAotICBjaGFubmVsXy0+U2VuZENvbW1hbmQoc3RkOjptb3ZlKHBhY2tldCkpOwotICBhdXRvIGxhc3RfY29tbWFuZCA9IHN0ZDo6bW92ZShoY2lfbGF5ZXJfLT5HZXRMYXN0Q29tbWFuZCgpLT5jb21tYW5kKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldCA9IEdldFBhY2tldFZpZXcoc3RkOjptb3ZlKGxhc3RfY29tbWFuZCkpOwotICBoY2k6OkNvbW1hbmRWaWV3IHBhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLQotICAvLyBBc3NlcnQKLSAgQVNTRVJUX1RSVUUocGFja2V0X3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6U0VORF9LRVlQUkVTU19OT1RJRklDQVRJT04sIHBhY2tldF92aWV3LkdldE9wQ29kZSgpKTsKLX0KLQotVEVTVF9GKFNlY3VyaXR5TWFuYWdlckNoYW5uZWxUZXN0LCByZWN2X3VzZXJfcGFzc2tleV9yZXF1ZXN0KSB7Ci0gIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoaGNpOjpVc2VyUGFzc2tleVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlXy5HZXRBZGRyZXNzKCkpKTsKLSAgc3luY2hyb25pemUoKTsKLSAgQVNTRVJUX1RSVUUoY2FsbGJhY2tfLT5yZWNlaXZlZFVzZXJQYXNza2V5UmVxdWVzdCk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJDaGFubmVsVGVzdCwgdGVzdF9sMmNhcF9zZWN1cml0eV9pbnRlcmZhY2VfYXBpKSB7Ci0gIEFTU0VSVF9GQUxTRShvbl9saW5rX2Nvbm5lY3RlZF9jYWxsZWQpOwotICBjaGFubmVsXy0+Q29ubmVjdChkZXZpY2VfLkdldEFkZHJlc3MoKSk7Ci0gIEFTU0VSVF9UUlVFKG9uX2xpbmtfY29ubmVjdGVkX2NhbGxlZCk7Ci0gIEFTU0VSVF9GQUxTRShvbl9saW5rX2Rpc2Nvbm5lY3RlZF9jYWxsZWQpOwotICBjaGFubmVsXy0+UmVsZWFzZShkZXZpY2VfLkdldEFkZHJlc3MoKSk7Ci0gIC8vIFRPRE8ob3B0ZWRvYmxpdmlvbik6IExvY2sgYW5kIHdhaXQKLSAgLy8gQVNTRVJUX1RSVUUob25fbGlua19kaXNjb25uZWN0ZWRfY2FsbGVkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgY2hhbm5lbAotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9lY2MvbXVsdGlwb2ludF90ZXN0LmNjIGIvZ2Qvc2VjdXJpdHkvZWNjL211bHRpcG9pbnRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlNDNkNC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9lY2MvbXVsdGlwb2ludF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic2VjdXJpdHkvZWNjL3BfMjU2X2VjY19wcC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgZWNjIHsKLQotLy8gVGVzdCBFQ0MgcG9pbnQgdmFsaWRhdGlvbgotVEVTVChTbXBFY2NWYWxpZGF0aW9uVGVzdCwgdGVzdF92YWxpZF9wb2ludHMpIHsKLSAgUG9pbnQgcDsKLQotICAvLyBUZXN0IGRhdGEgZnJvbSBCbHVldG9vdGggQ29yZSBTcGVjaWZpY2F0aW9uCi0gIC8vIFZlcnNpb24gNS4wIHwgVm9sIDIsIFBhcnQgRyB8IDcuMS4yCi0KLSAgLy8gU2FtcGxlIDEKLSAgcC54WzddID0gMHgyMGIwMDNkMjsKLSAgcC54WzZdID0gMHhmMjk3YmUyYzsKLSAgcC54WzVdID0gMHg1ZTJjODNhNzsKLSAgcC54WzRdID0gMHhlOWY5YTViOTsKLSAgcC54WzNdID0gMHhlZmY0OTExMTsKLSAgcC54WzJdID0gMHhhY2Y0ZmRkYjsKLSAgcC54WzFdID0gMHhjYzAzMDE0ODsKLSAgcC54WzBdID0gMHgwZTM1OWRlNjsKLQotICBwLnlbN10gPSAweGRjODA5YzQ5OwotICBwLnlbNl0gPSAweDY1MmFlYjZkOwotICBwLnlbNV0gPSAweDYzMzI5YWJmOwotICBwLnlbNF0gPSAweDVhNTIxNTVjOwotICBwLnlbM10gPSAweDc2NjM0NWMyOwotICBwLnlbMl0gPSAweDhmZWQzMDI0OwotICBwLnlbMV0gPSAweDc0MWM4ZWQwOwotICBwLnlbMF0gPSAweDE1ODlkMjhiOwotCi0gIEVYUEVDVF9UUlVFKEVDQ19WYWxpZGF0ZVBvaW50KHApKTsKLQotICAvLyBTYW1wbGUgMgotICBwLnhbN10gPSAweDJjMzFhNDdiOwotICBwLnhbNl0gPSAweDU3Nzk4MDllOwotICBwLnhbNV0gPSAweGY0NGNiNWVhOwotICBwLnhbNF0gPSAweGFmNWMzZTQzOwotICBwLnhbM10gPSAweGQ1ZjhmYWFkOwotICBwLnhbMl0gPSAweDRhODc5NGNiOwotICBwLnhbMV0gPSAweDk4N2U5YjAzOwotICBwLnhbMF0gPSAweDc0NWM3OGRkOwotCi0gIHAueVs3XSA9IDB4OTE5NTEyMTg7Ci0gIHAueVs2XSA9IDB4Mzg5OGRmYmU7Ci0gIHAueVs1XSA9IDB4Y2Q1MmUyNDA7Ci0gIHAueVs0XSA9IDB4OGU0Mzg3MWY7Ci0gIHAueVszXSA9IDB4ZDAyMTEwOTE7Ci0gIHAueVsyXSA9IDB4MTdiZDNlZDQ7Ci0gIHAueVsxXSA9IDB4ZWFmODQzNzc7Ci0gIHAueVswXSA9IDB4NDM3MTVkNGY7Ci0KLSAgRVhQRUNUX1RSVUUoRUNDX1ZhbGlkYXRlUG9pbnQocCkpOwotfQotCi1URVNUKFNtcEVjY1ZhbGlkYXRpb25UZXN0LCB0ZXN0X2ludmFsaWRfcG9pbnRzKSB7Ci0gIFBvaW50IHA7Ci0gIG11bHRpcHJlY2lzaW9uX2luaXQocC54KTsKLSAgbXVsdGlwcmVjaXNpb25faW5pdChwLnkpOwotCi0gIEVYUEVDVF9GQUxTRShFQ0NfVmFsaWRhdGVQb2ludChwKSk7Ci0KLSAgLy8gU2FtcGxlIDEKLSAgcC54WzddID0gMHgyMGIwMDNkMjsKLSAgcC54WzZdID0gMHhmMjk3YmUyYzsKLSAgcC54WzVdID0gMHg1ZTJjODNhNzsKLSAgcC54WzRdID0gMHhlOWY5YTViOTsKLSAgcC54WzNdID0gMHhlZmY0OTExMTsKLSAgcC54WzJdID0gMHhhY2Y0ZmRkYjsKLSAgcC54WzFdID0gMHhjYzAzMDE0ODsKLSAgcC54WzBdID0gMHgwZTM1OWRlNjsKLQotICBFWFBFQ1RfRkFMU0UoRUNDX1ZhbGlkYXRlUG9pbnQocCkpOwotCi0gIHAueVs3XSA9IDB4ZGM4MDljNDk7Ci0gIHAueVs2XSA9IDB4NjUyYWViNmQ7Ci0gIHAueVs1XSA9IDB4NjMzMjlhYmY7Ci0gIHAueVs0XSA9IDB4NWE1MjE1NWM7Ci0gIHAueVszXSA9IDB4NzY2MzQ1YzI7Ci0gIHAueVsyXSA9IDB4OGZlZDMwMjQ7Ci0gIHAueVsxXSA9IDB4NzQxYzhlZDA7Ci0gIHAueVswXSA9IDB4MTU4OWQyOGI7Ci0KLSAgcC55WzBdLS07Ci0KLSAgRVhQRUNUX0ZBTFNFKEVDQ19WYWxpZGF0ZVBvaW50KHApKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGVjYwotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9lY2MvbXVsdHByZWNpc2lvbi5jYyBiL2dkL3NlY3VyaXR5L2VjYy9tdWx0cHJlY2lzaW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjU4M2VkLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2VjYy9tdWx0cHJlY2lzaW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgcGFpcmluZyBhbGdvcml0aG1zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNlY3VyaXR5L2VjYy9tdWx0cHJlY2lzaW9uLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLW5hbWVzcGFjZSBlY2MgewotCi0jZGVmaW5lIERXT1JEX0JJVFMgMzIKLSNkZWZpbmUgRFdPUkRfQllURVMgNAotI2RlZmluZSBEV09SRF9CSVRTX1NISUZUIDUKLQotdm9pZCBtdWx0aXByZWNpc2lvbl9pbml0KHVpbnQzMl90KiBjKSB7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBLRVlfTEVOR1RIX0RXT1JEU19QMjU2OyBpKyspIGNbaV0gPSAwOwotfQotCi12b2lkIG11bHRpcHJlY2lzaW9uX2NvcHkodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhKSB7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBLRVlfTEVOR1RIX0RXT1JEU19QMjU2OyBpKyspIGNbaV0gPSBhW2ldOwotfQotCi1pbnQgbXVsdGlwcmVjaXNpb25fY29tcGFyZShjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIpIHsKLSAgZm9yIChpbnQgaSA9IEtFWV9MRU5HVEhfRFdPUkRTX1AyNTYgLSAxOyBpID49IDA7IGktLSkgewotICAgIGlmIChhW2ldID4gYltpXSkgcmV0dXJuIDE7Ci0gICAgaWYgKGFbaV0gPCBiW2ldKSByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtdWx0aXByZWNpc2lvbl9pc3plcm8oY29uc3QgdWludDMyX3QqIGEpIHsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEtFWV9MRU5HVEhfRFdPUkRTX1AyNTY7IGkrKykKLSAgICBpZiAoYVtpXSkgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX2R3b3JkX2JpdHModWludDMyX3QgYSkgewotICB1aW50MzJfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgRFdPUkRfQklUUzsgaSsrLCBhID4+PSAxKQotICAgIGlmIChhID09IDApIGJyZWFrOwotCi0gIHJldHVybiBpOwotfQotCi11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9tb3N0X3NpZ25kd29yZHMoY29uc3QgdWludDMyX3QqIGEpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IEtFWV9MRU5HVEhfRFdPUkRTX1AyNTYgLSAxOyBpID49IDA7IGktLSkKLSAgICBpZiAoYVtpXSkgYnJlYWs7Ci0gIHJldHVybiAoaSArIDEpOwotfQotCi11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9tb3N0X3NpZ25iaXRzKGNvbnN0IHVpbnQzMl90KiBhKSB7Ci0gIGludCBhTW9zdFNpZ25EV09SRHM7Ci0KLSAgYU1vc3RTaWduRFdPUkRzID0gbXVsdGlwcmVjaXNpb25fbW9zdF9zaWduZHdvcmRzKGEpOwotICBpZiAoYU1vc3RTaWduRFdPUkRzID09IDApIHJldHVybiAwOwotCi0gIHJldHVybiAoKChhTW9zdFNpZ25EV09SRHMgLSAxKSA8PCBEV09SRF9CSVRTX1NISUZUKSArIG11bHRpcHJlY2lzaW9uX2R3b3JkX2JpdHMoYVthTW9zdFNpZ25EV09SRHMgLSAxXSkpOwotfQotCi11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9hZGQodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYikgewotICB1aW50MzJfdCBjYXJyaWVyOwotICB1aW50MzJfdCB0ZW1wOwotCi0gIGNhcnJpZXIgPSAwOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSB7Ci0gICAgdGVtcCA9IGFbaV0gKyBjYXJyaWVyOwotICAgIGNhcnJpZXIgPSAodGVtcCA8IGNhcnJpZXIpOwotICAgIHRlbXAgKz0gYltpXTsKLSAgICBjYXJyaWVyIHw9ICh0ZW1wIDwgYltpXSk7Ci0gICAgY1tpXSA9IHRlbXA7Ci0gIH0KLQotICByZXR1cm4gY2FycmllcjsKLX0KLQotLy8gYz1hLWIKLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX3N1Yih1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEsIGNvbnN0IHVpbnQzMl90KiBiKSB7Ci0gIHVpbnQzMl90IGJvcnJvdzsKLSAgdWludDMyX3QgdGVtcDsKLQotICBib3Jyb3cgPSAwOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSB7Ci0gICAgdGVtcCA9IGFbaV0gLSBib3Jyb3c7Ci0gICAgYm9ycm93ID0gKHRlbXAgPiBhW2ldKTsKLSAgICBjW2ldID0gdGVtcCAtIGJbaV07Ci0gICAgYm9ycm93IHw9IChjW2ldID4gdGVtcCk7Ci0gIH0KLQotICByZXR1cm4gYm9ycm93OwotfQotCi0vLyBjID0gYSA8PCAxCi12b2lkIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogbW9kcCkgewotICB1aW50MzJfdCBjYXJyaWVyID0gbXVsdGlwcmVjaXNpb25fbHNoaWZ0KGMsIGEpOwotICBpZiAoY2FycmllcikgewotICAgIG11bHRpcHJlY2lzaW9uX3N1YihjLCBjLCBtb2RwKTsKLSAgfSBlbHNlIGlmIChtdWx0aXByZWNpc2lvbl9jb21wYXJlKGMsIG1vZHApID49IDApIHsKLSAgICBtdWx0aXByZWNpc2lvbl9zdWIoYywgYywgbW9kcCk7Ci0gIH0KLX0KLQotLy8gYz1hPj4xCi12b2lkIG11bHRpcHJlY2lzaW9uX3JzaGlmdCh1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEpIHsKLSAgaW50IGo7Ci0gIHVpbnQzMl90IGIgPSAxOwotCi0gIGogPSBEV09SRF9CSVRTIC0gYjsKLQotICB1aW50MzJfdCBjYXJyaWVyID0gMDsKLSAgdWludDMyX3QgdGVtcDsKLSAgZm9yIChpbnQgaSA9IEtFWV9MRU5HVEhfRFdPUkRTX1AyNTYgLSAxOyBpID49IDA7IGktLSkgewotICAgIHRlbXAgPSBhW2ldOyAgLy8gaW4gY2FzZSBvZiBjPT1hCi0gICAgY1tpXSA9ICh0ZW1wID4+IGIpIHwgY2FycmllcjsKLSAgICBjYXJyaWVyID0gdGVtcCA8PCBqOwotICB9Ci19Ci0KLS8vIEN1cnZlIHNwZWNpZmljIG9wdGltaXphdGlvbiB3aGVuIHAgaXMgYSBwc2V1ZG8tTWVyc2VubnMgcHJpbWUsCi0vLyBwPTJeKEtFWV9MRU5HVEhfQklUUyktb21lZ2EKLXZvaWQgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYiwgY29uc3QgdWludDMyX3QqIG1vZHApIHsKLSAgdWludDMyX3QgY2NbMiAqIEtFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotCi0gIG11bHRpcHJlY2lzaW9uX211bHQoY2MsIGEsIGIpOwotICBtdWx0aXByZWNpc2lvbl9mYXN0X21vZF9QMjU2KGMsIGNjLCBtb2RwKTsKLX0KLQotLy8gQ3VydmUgc3BlY2lmaWMgb3B0aW1pemF0aW9uIHdoZW4gcCBpcyBhIHBzZXVkby1NZXJzZW5ucyBwcmltZQotdm9pZCBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEsIGNvbnN0IHVpbnQzMl90KiBtb2RwKSB7Ci0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKGMsIGEsIGEsIG1vZHApOwotfQotCi0vLyBjPShhK2IpIG1vZCBwLCBiPHAsIGE8cAotdm9pZCBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIsIGNvbnN0IHVpbnQzMl90KiBtb2RwKSB7Ci0gIHVpbnQzMl90IGNhcnJpZXIgPSBtdWx0aXByZWNpc2lvbl9hZGQoYywgYSwgYik7Ci0gIGlmIChjYXJyaWVyKSB7Ci0gICAgbXVsdGlwcmVjaXNpb25fc3ViKGMsIGMsIG1vZHApOwotICB9IGVsc2UgaWYgKG11bHRpcHJlY2lzaW9uX2NvbXBhcmUoYywgbW9kcCkgPj0gMCkgewotICAgIG11bHRpcHJlY2lzaW9uX3N1YihjLCBjLCBtb2RwKTsKLSAgfQotfQotCi0vLyBjPShhLWIpIG1vZCBwLCBhPHAsIGI8cAotdm9pZCBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIsIGNvbnN0IHVpbnQzMl90KiBtb2RwKSB7Ci0gIHVpbnQzMl90IGJvcnJvdzsKLQotICBib3Jyb3cgPSBtdWx0aXByZWNpc2lvbl9zdWIoYywgYSwgYik7Ci0gIGlmIChib3Jyb3cpIG11bHRpcHJlY2lzaW9uX2FkZChjLCBjLCBtb2RwKTsKLX0KLQotLy8gYz1hPDxiLCBiPERXT1JEX0JJVFMsIGMgaGFzIGEgYnVmZmVyIHNpemUgb2YgTnVtdWludDMyX3RzKzEKLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX2xzaGlmdCh1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEpIHsKLSAgaW50IGo7Ci0gIHVpbnQzMl90IGIgPSAxOwotICBqID0gRFdPUkRfQklUUyAtIGI7Ci0KLSAgdWludDMyX3QgY2FycmllciA9IDA7Ci0gIHVpbnQzMl90IHRlbXA7Ci0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEtFWV9MRU5HVEhfRFdPUkRTX1AyNTY7IGkrKykgewotICAgIHRlbXAgPSBhW2ldOyAgLy8gaW4gY2FzZSBjPT1hCi0gICAgY1tpXSA9ICh0ZW1wIDw8IGIpIHwgY2FycmllcjsKLSAgICBjYXJyaWVyID0gdGVtcCA+PiBqOwotICB9Ci0KLSAgcmV0dXJuIGNhcnJpZXI7Ci19Ci0KLS8vIGM9YSpiOyBjIG11c3QgaGF2ZSBhIGJ1ZmZlciBvZiAyKktleV9MRU5HVEhfdWludDMyX3RTLCBjICE9IGEgIT0gYgotdm9pZCBtdWx0aXByZWNpc2lvbl9tdWx0KHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIpIHsKLSAgdWludDMyX3QgVzsKLSAgdWludDMyX3QgVTsKLSAgdWludDMyX3QgVjsKLQotICBVID0gViA9IFcgPSAwOwotICBtdWx0aXByZWNpc2lvbl9pbml0KGMpOwotCi0gIC8vIGFzc3VtZSBsaXR0bGUgZW5kaWFuIHJpZ2h0IG5vdwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSB7Ci0gICAgVSA9IDA7Ci0gICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IEtFWV9MRU5HVEhfRFdPUkRTX1AyNTY7IGorKykgewotICAgICAgdWludDY0X3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID0gKCh1aW50NjRfdClhW2ldKSAqICgodWludDY0X3QpYltqXSk7Ci0gICAgICBXID0gcmVzdWx0ID4+IDMyOwotICAgICAgViA9IGFbaV0gKiBiW2pdOwotICAgICAgViA9IFYgKyBVOwotICAgICAgVSA9IChWIDwgVSk7Ci0gICAgICBVICs9IFc7Ci0gICAgICBWID0gViArIGNbaSArIGpdOwotICAgICAgVSArPSAoViA8IGNbaSArIGpdKTsKLSAgICAgIGNbaSArIGpdID0gVjsKLSAgICB9Ci0gICAgY1tpICsgS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl0gPSBVOwotICB9Ci19Ci0KLXZvaWQgbXVsdGlwcmVjaXNpb25fZmFzdF9tb2RfUDI1Nih1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEsIGNvbnN0IHVpbnQzMl90KiBtb2RwKSB7Ci0gIHVpbnQzMl90IEE7Ci0gIHVpbnQzMl90IEI7Ci0gIHVpbnQzMl90IEM7Ci0gIHVpbnQzMl90IEQ7Ci0gIHVpbnQzMl90IEU7Ci0gIHVpbnQzMl90IEY7Ci0gIHVpbnQzMl90IEc7Ci0gIHVpbnQ4X3QgVUE7Ci0gIHVpbnQ4X3QgVUI7Ci0gIHVpbnQ4X3QgVUM7Ci0gIHVpbnQ4X3QgVUQ7Ci0gIHVpbnQ4X3QgVUU7Ci0gIHVpbnQ4X3QgVUY7Ci0gIHVpbnQ4X3QgVUc7Ci0gIHVpbnQzMl90IFU7Ci0KLSAgLy8gQyA9IGFbMTNdICsgYVsxNF0gKyBhWzE1XTsKLSAgQyA9IGFbMTNdOwotICBDICs9IGFbMTRdOwotICBVQyA9IChDIDwgYVsxNF0pOwotICBDICs9IGFbMTVdOwotICBVQyArPSAoQyA8IGFbMTVdKTsKLQotICAvLyBFID0gYVs4XSArIGFbOV07Ci0gIEUgPSBhWzhdOwotICBFICs9IGFbOV07Ci0gIFVFID0gKEUgPCBhWzldKTsKLQotICAvLyBGID0gYVs5XSArIGFbMTBdOwotICBGID0gYVs5XTsKLSAgRiArPSBhWzEwXTsKLSAgVUYgPSAoRiA8IGFbMTBdKTsKLQotICAvLyBHID0gYVsxMF0gKyBhWzExXQotICBHID0gYVsxMF07Ci0gIEcgKz0gYVsxMV07Ci0gIFVHID0gKEcgPCBhWzExXSk7Ci0KLSAgLy8gQiA9IGFbMTJdICsgYVsxM10gKyBhWzE0XSArIGFbMTVdID09IEMgKyBhWzEyXQotICBCID0gQzsKLSAgVUIgPSBVQzsKLSAgQiArPSBhWzEyXTsKLSAgVUIgKz0gKEIgPCBhWzEyXSk7Ci0KLSAgLy8gQSA9IGFbMTFdICsgYVsxMl0gKyBhWzEzXSArIGFbMTRdID09IEIgKyBhWzExXSAtIGFbMTVdCi0gIEEgPSBCOwotICBVQSA9IFVCOwotICBBICs9IGFbMTFdOwotICBVQSArPSAoQSA8IGFbMTFdKTsKLSAgVUEgLT0gKEEgPCBhWzE1XSk7Ci0gIEEgLT0gYVsxNV07Ci0KLSAgLy8gRCA9IGFbMTBdICsgYVsxMV0gKyBhWzEyXSArIGFbMTNdID09IEEgKyBhWzEwXSAtIGFbMTRdCi0gIEQgPSBBOwotICBVRCA9IFVBOwotICBEICs9IGFbMTBdOwotICBVRCArPSAoRCA8IGFbMTBdKTsKLSAgVUQgLT0gKEQgPCBhWzE0XSk7Ci0gIEQgLT0gYVsxNF07Ci0KLSAgY1swXSA9IGFbMF07Ci0gIGNbMF0gKz0gRTsKLSAgVSA9IChjWzBdIDwgRSk7Ci0gIFUgKz0gVUU7Ci0gIFUgLT0gKGNbMF0gPCBBKTsKLSAgVSAtPSBVQTsKLSAgY1swXSAtPSBBOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzFdIDwgVVUpOwotICAgIGNbMV0gPSBhWzFdIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1sxXSA9IGFbMV0gKyBVOwotICAgIFUgPSAoY1sxXSA8IGFbMV0pOwotICB9Ci0KLSAgY1sxXSArPSBGOwotICBVICs9IChjWzFdIDwgRik7Ci0gIFUgKz0gVUY7Ci0gIFUgLT0gKGNbMV0gPCBCKTsKLSAgVSAtPSBVQjsKLSAgY1sxXSAtPSBCOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzJdIDwgVVUpOwotICAgIGNbMl0gPSBhWzJdIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1syXSA9IGFbMl0gKyBVOwotICAgIFUgPSAoY1syXSA8IGFbMl0pOwotICB9Ci0KLSAgY1syXSArPSBHOwotICBVICs9IChjWzJdIDwgRyk7Ci0gIFUgKz0gVUc7Ci0gIFUgLT0gKGNbMl0gPCBDKTsKLSAgVSAtPSBVQzsKLSAgY1syXSAtPSBDOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzNdIDwgVVUpOwotICAgIGNbM10gPSBhWzNdIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1szXSA9IGFbM10gKyBVOwotICAgIFUgPSAoY1szXSA8IGFbM10pOwotICB9Ci0KLSAgY1szXSArPSBBOwotICBVICs9IChjWzNdIDwgQSk7Ci0gIFUgKz0gVUE7Ci0gIGNbM10gKz0gYVsxMV07Ci0gIFUgKz0gKGNbM10gPCBhWzExXSk7Ci0gIGNbM10gKz0gYVsxMl07Ci0gIFUgKz0gKGNbM10gPCBhWzEyXSk7Ci0gIFUgLT0gKGNbM10gPCBhWzE0XSk7Ci0gIGNbM10gLT0gYVsxNF07Ci0gIFUgLT0gKGNbM10gPCBhWzE1XSk7Ci0gIGNbM10gLT0gYVsxNV07Ci0gIFUgLT0gKGNbM10gPCBFKTsKLSAgVSAtPSBVRTsKLSAgY1szXSAtPSBFOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzRdIDwgVVUpOwotICAgIGNbNF0gPSBhWzRdIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1s0XSA9IGFbNF0gKyBVOwotICAgIFUgPSAoY1s0XSA8IGFbNF0pOwotICB9Ci0KLSAgY1s0XSArPSBCOwotICBVICs9IChjWzRdIDwgQik7Ci0gIFUgKz0gVUI7Ci0gIFUgLT0gKGNbNF0gPCBhWzE1XSk7Ci0gIGNbNF0gLT0gYVsxNV07Ci0gIGNbNF0gKz0gYVsxMl07Ci0gIFUgKz0gKGNbNF0gPCBhWzEyXSk7Ci0gIGNbNF0gKz0gYVsxM107Ci0gIFUgKz0gKGNbNF0gPCBhWzEzXSk7Ci0gIFUgLT0gKGNbNF0gPCBGKTsKLSAgVSAtPSBVRjsKLSAgY1s0XSAtPSBGOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzVdIDwgVVUpOwotICAgIGNbNV0gPSBhWzVdIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1s1XSA9IGFbNV0gKyBVOwotICAgIFUgPSAoY1s1XSA8IGFbNV0pOwotICB9Ci0KLSAgY1s1XSArPSBDOwotICBVICs9IChjWzVdIDwgQyk7Ci0gIFUgKz0gVUM7Ci0gIGNbNV0gKz0gYVsxM107Ci0gIFUgKz0gKGNbNV0gPCBhWzEzXSk7Ci0gIGNbNV0gKz0gYVsxNF07Ci0gIFUgKz0gKGNbNV0gPCBhWzE0XSk7Ci0gIFUgLT0gKGNbNV0gPCBHKTsKLSAgVSAtPSBVRzsKLSAgY1s1XSAtPSBHOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzZdIDwgVVUpOwotICAgIGNbNl0gPSBhWzZdIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1s2XSA9IGFbNl0gKyBVOwotICAgIFUgPSAoY1s2XSA8IGFbNl0pOwotICB9Ci0KLSAgY1s2XSArPSBDOwotICBVICs9IChjWzZdIDwgQyk7Ci0gIFUgKz0gVUM7Ci0gIGNbNl0gKz0gYVsxNF07Ci0gIFUgKz0gKGNbNl0gPCBhWzE0XSk7Ci0gIGNbNl0gKz0gYVsxNF07Ci0gIFUgKz0gKGNbNl0gPCBhWzE0XSk7Ci0gIGNbNl0gKz0gYVsxNV07Ci0gIFUgKz0gKGNbNl0gPCBhWzE1XSk7Ci0gIFUgLT0gKGNbNl0gPCBFKTsKLSAgVSAtPSBVRTsKLSAgY1s2XSAtPSBFOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHVpbnQzMl90IFVVOwotICAgIFVVID0gMCAtIFU7Ci0gICAgVSA9IChhWzddIDwgVVUpOwotICAgIGNbN10gPSBhWzddIC0gVVU7Ci0gIH0gZWxzZSB7Ci0gICAgY1s3XSA9IGFbN10gKyBVOwotICAgIFUgPSAoY1s3XSA8IGFbN10pOwotICB9Ci0KLSAgY1s3XSArPSBhWzE1XTsKLSAgVSArPSAoY1s3XSA8IGFbMTVdKTsKLSAgY1s3XSArPSBhWzE1XTsKLSAgVSArPSAoY1s3XSA8IGFbMTVdKTsKLSAgY1s3XSArPSBhWzE1XTsKLSAgVSArPSAoY1s3XSA8IGFbMTVdKTsKLSAgY1s3XSArPSBhWzhdOwotICBVICs9IChjWzddIDwgYVs4XSk7Ci0gIFUgLT0gKGNbN10gPCBEKTsKLSAgVSAtPSBVRDsKLSAgY1s3XSAtPSBEOwotCi0gIGlmIChVICYgMHg4MDAwMDAwMCkgewotICAgIHdoaWxlIChVKSB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9hZGQoYywgYywgbW9kcCk7Ci0gICAgICBVKys7Ci0gICAgfQotICB9IGVsc2UgaWYgKFUpIHsKLSAgICB3aGlsZSAoVSkgewotICAgICAgbXVsdGlwcmVjaXNpb25fc3ViKGMsIGMsIG1vZHApOwotICAgICAgVS0tOwotICAgIH0KLSAgfQotCi0gIGlmIChtdWx0aXByZWNpc2lvbl9jb21wYXJlKGMsIG1vZHApID49IDApIG11bHRpcHJlY2lzaW9uX3N1YihjLCBjLCBtb2RwKTsKLX0KLQotdm9pZCBtdWx0aXByZWNpc2lvbl9pbnZfbW9kKHVpbnQzMl90KiBhbWludXMsIHVpbnQzMl90KiB1LCBjb25zdCB1aW50MzJfdCogbW9kcCkgewotICB1aW50MzJfdCB2W0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCBBW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTYgKyAxXTsKLSAgdWludDMyX3QgQ1tLRVlfTEVOR1RIX0RXT1JEU19QMjU2ICsgMV07Ci0KLSAgbXVsdGlwcmVjaXNpb25fY29weSh2LCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25faW5pdChBKTsKLSAgbXVsdGlwcmVjaXNpb25faW5pdChDKTsKLSAgQVswXSA9IDE7Ci0KLSAgd2hpbGUgKCFtdWx0aXByZWNpc2lvbl9pc3plcm8odSkpIHsKLSAgICB3aGlsZSAoISh1WzBdICYgMHgwMSkpICAvLyB1IGlzIGV2ZW4KLSAgICB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9yc2hpZnQodSwgdSk7Ci0gICAgICBpZiAoIShBWzBdICYgMHgwMSkpICAvLyBBIGlzIGV2ZW4KLSAgICAgICAgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KEEsIEEpOwotICAgICAgZWxzZSB7Ci0gICAgICAgIEFbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl0gPSBtdWx0aXByZWNpc2lvbl9hZGQoQSwgQSwgbW9kcCk7ICAvLyBBID1BK3AKLSAgICAgICAgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KEEsIEEpOwotICAgICAgICBBW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTYgLSAxXSB8PSAoQVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA8PCAzMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKCEodlswXSAmIDB4MDEpKSAgLy8gdiBpcyBldmVuCi0gICAgewotICAgICAgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KHYsIHYpOwotICAgICAgaWYgKCEoQ1swXSAmIDB4MDEpKSAgLy8gQyBpcyBldmVuCi0gICAgICB7Ci0gICAgICAgIG11bHRpcHJlY2lzaW9uX3JzaGlmdChDLCBDKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl0gPSBtdWx0aXByZWNpc2lvbl9hZGQoQywgQywgbW9kcCk7ICAvLyBDID1DK3AKLSAgICAgICAgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KEMsIEMpOwotICAgICAgICBDW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTYgLSAxXSB8PSAoQ1tLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA8PCAzMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG11bHRpcHJlY2lzaW9uX2NvbXBhcmUodSwgdikgPj0gMCkgewotICAgICAgbXVsdGlwcmVjaXNpb25fc3ViKHUsIHUsIHYpOwotICAgICAgbXVsdGlwcmVjaXNpb25fc3ViX21vZChBLCBBLCBDLCBtb2RwKTsKLSAgICB9IGVsc2UgewotICAgICAgbXVsdGlwcmVjaXNpb25fc3ViKHYsIHYsIHUpOwotICAgICAgbXVsdGlwcmVjaXNpb25fc3ViX21vZChDLCBDLCBBLCBtb2RwKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobXVsdGlwcmVjaXNpb25fY29tcGFyZShDLCBtb2RwKSA+PSAwKQotICAgIG11bHRpcHJlY2lzaW9uX3N1YihhbWludXMsIEMsIG1vZHApOwotICBlbHNlCi0gICAgbXVsdGlwcmVjaXNpb25fY29weShhbWludXMsIEMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZWNjCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9lY2MvbXVsdHByZWNpc2lvbi5oIGIvZ2Qvc2VjdXJpdHkvZWNjL211bHRwcmVjaXNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxNDljZC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9lY2MvbXVsdHByZWNpc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHNpbXBsZSBwYWlyaW5nIGFsZ29yaXRobXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgZWNjIHsKLQotI2RlZmluZSBLRVlfTEVOR1RIX0RXT1JEU19QMjU2IDgKLS8qIEFyaXRobWV0aWMgT3BlcmF0aW9ucyovCi1pbnQgbXVsdGlwcmVjaXNpb25fY29tcGFyZShjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIpOwotaW50IG11bHRpcHJlY2lzaW9uX2lzemVybyhjb25zdCB1aW50MzJfdCogYSk7Ci12b2lkIG11bHRpcHJlY2lzaW9uX2luaXQodWludDMyX3QqIGMpOwotdm9pZCBtdWx0aXByZWNpc2lvbl9jb3B5KHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSk7Ci11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9kd29yZF9iaXRzKHVpbnQzMl90IGEpOwotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbW9zdF9zaWduZHdvcmRzKGNvbnN0IHVpbnQzMl90KiBhKTsKLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX21vc3Rfc2lnbmJpdHMoY29uc3QgdWludDMyX3QqIGEpOwotdm9pZCBtdWx0aXByZWNpc2lvbl9pbnZfbW9kKHVpbnQzMl90KiBhbWludXMsIHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogbW9kcCk7Ci11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9hZGQodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYik7ICAvLyBjPWErYgotdm9pZCBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIGIsIGNvbnN0IHVpbnQzMl90KiBtb2RwKTsKLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX3N1Yih1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEsIGNvbnN0IHVpbnQzMl90KiBiKTsgIC8vIGM9YS1iCi12b2lkIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYiwgY29uc3QgdWludDMyX3QqIG1vZHApOwotdm9pZCBtdWx0aXByZWNpc2lvbl9yc2hpZnQodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYz1hPj4xLCByZXR1cm4gY2Fycmllcgotdm9pZCBtdWx0aXByZWNpc2lvbl9sc2hpZnRfbW9kKHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIG1vZHApOyAgLy8gYz1hPDxiLCByZXR1cm4gY2FycmllcgotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbHNoaWZ0KHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSk7Ci12b2lkIG11bHRpcHJlY2lzaW9uX211bHQodWludDMyX3QqIGMsIGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYik7ICAvLyBjPWEqYgotdm9pZCBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh1aW50MzJfdCogYywgY29uc3QgdWludDMyX3QqIGEsIGNvbnN0IHVpbnQzMl90KiBiLCBjb25zdCB1aW50MzJfdCogbW9kcCk7Ci12b2lkIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX3NxdWFfbW9kKHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIG1vZHApOwotdm9pZCBtdWx0aXByZWNpc2lvbl9mYXN0X21vZF9QMjU2KHVpbnQzMl90KiBjLCBjb25zdCB1aW50MzJfdCogYSwgY29uc3QgdWludDMyX3QqIG1vZHApOwotCi19ICAvLyBuYW1lc3BhY2UgZWNjCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9lY2MvcF8yNTZfZWNjX3BwLmNjIGIvZ2Qvc2VjdXJpdHkvZWNjL3BfMjU2X2VjY19wcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiODA1Yy4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9lY2MvcF8yNTZfZWNjX3BwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgcGFpcmluZyBhbGdvcml0aG1zIHVzaW5nIEVsbGlwdGljIEN1cnZlCi0gKiAgQ3J5cHRvZ3JhcGh5IGZvciBwcml2YXRlIHB1YmxpYyBrZXkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgInNlY3VyaXR5L2VjYy9wXzI1Nl9lY2NfcHAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInNlY3VyaXR5L2VjYy9tdWx0cHJlY2lzaW9uLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLW5hbWVzcGFjZSBlY2MgewotCi1jb25zdCB1aW50MzJfdCogbW9kcCA9IGN1cnZlX3AyNTYucDsKLQotc3RhdGljIHZvaWQgcF8yNTZfaW5pdF9wb2ludChQb2ludCogcSkgewotICBtZW1zZXQocSwgMCwgc2l6ZW9mKFBvaW50KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBfMjU2X2NvcHlfcG9pbnQoUG9pbnQqIHEsIGNvbnN0IFBvaW50KiBwKSB7Ci0gIG1lbWNweShxLCBwLCBzaXplb2YoUG9pbnQpKTsKLX0KLQotLy8gcT0ycQotc3RhdGljIHZvaWQgRUNDX0RvdWJsZShQb2ludCogcSwgY29uc3QgUG9pbnQqIHApIHsKLSAgdWludDMyX3QgdDFbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl07Ci0gIHVpbnQzMl90IHQyW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCB0M1tLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgY29uc3QgdWludDMyX3QqIHgxOwotICB1aW50MzJfdCogeDM7Ci0gIGNvbnN0IHVpbnQzMl90KiB5MTsKLSAgdWludDMyX3QqIHkzOwotICBjb25zdCB1aW50MzJfdCogejE7Ci0gIHVpbnQzMl90KiB6MzsKLQotICBpZiAobXVsdGlwcmVjaXNpb25faXN6ZXJvKHAtPnopKSB7Ci0gICAgbXVsdGlwcmVjaXNpb25faW5pdChxLT56KTsKLSAgICByZXR1cm47ICAvLyByZXR1cm4gaW5maW5pdHkKLSAgfQotCi0gIHgxID0gcC0+eDsKLSAgeTEgPSBwLT55OwotICB6MSA9IHAtPno7Ci0gIHgzID0gcS0+eDsKLSAgeTMgPSBxLT55OwotICB6MyA9IHEtPno7Ci0KLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QodDEsIHoxLCBtb2RwKTsgICAgICAvLyB0MT16MV4yCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QodDIsIHgxLCB0MSwgbW9kcCk7ICAgICAgICAgICAgLy8gdDI9eDEtdDEKLSAgbXVsdGlwcmVjaXNpb25fYWRkX21vZCh0MSwgeDEsIHQxLCBtb2RwKTsgICAgICAgICAgICAvLyB0MT14MSt0MQotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh0MiwgdDEsIHQyLCBtb2RwKTsgIC8vIHQyPXQyKnQxCi0gIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodDMsIHQyLCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25fYWRkX21vZCh0MiwgdDMsIHQyLCBtb2RwKTsgIC8vIHQyPTN0MgotCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHozLCB5MSwgejEsIG1vZHApOyAgLy8gejM9eTEqejEKLSAgbXVsdGlwcmVjaXNpb25fbHNoaWZ0X21vZCh6MywgejMsIG1vZHApOwotCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX3NxdWFfbW9kKHkzLCB5MSwgbW9kcCk7ICAvLyB5Mz15MV4yCi0gIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QoeTMsIHkzLCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QodDMsIHkzLCB4MSwgbW9kcCk7ICAvLyB0Mz15Myp4MT14MSp5MV4yCi0gIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodDMsIHQzLCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QoeTMsIHkzLCBtb2RwKTsgIC8vIHkzPXkzXjI9eTFeNAotICBtdWx0aXByZWNpc2lvbl9sc2hpZnRfbW9kKHkzLCB5MywgbW9kcCk7Ci0KLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QoeDMsIHQyLCBtb2RwKTsgICAgICAvLyB4Mz10Ml4yCi0gIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodDEsIHQzLCBtb2RwKTsgICAgICAgICAgICAgLy8gdDE9MnQzCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QoeDMsIHgzLCB0MSwgbW9kcCk7ICAgICAgICAgICAgLy8geDM9eDMtdDEKLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh0MSwgdDMsIHgzLCBtb2RwKTsgICAgICAgICAgICAvLyB0MT10My14MwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh0MSwgdDEsIHQyLCBtb2RwKTsgIC8vIHQxPXQxKnQyCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QoeTMsIHQxLCB5MywgbW9kcCk7ICAgICAgICAgICAgLy8geTM9dDEteTMKLX0KLQotLy8gcT1xK3AsICAgICB6cCBtdXN0IGJlIDEKLXN0YXRpYyB2b2lkIEVDQ19BZGQoUG9pbnQqIHIsIFBvaW50KiBwLCBjb25zdCBQb2ludCogcSkgewotICB1aW50MzJfdCB0MVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QgdDJbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl07Ci0gIHVpbnQzMl90KiB4MTsKLSAgY29uc3QgdWludDMyX3QqIHgyOwotICB1aW50MzJfdCogeDM7Ci0gIHVpbnQzMl90KiB5MTsKLSAgY29uc3QgdWludDMyX3QqIHkyOwotICB1aW50MzJfdCogeTM7Ci0gIHVpbnQzMl90KiB6MTsKLSAgY29uc3QgdWludDMyX3QqIHoyOwotICB1aW50MzJfdCogejM7Ci0KLSAgeDEgPSBwLT54OwotICB5MSA9IHAtPnk7Ci0gIHoxID0gcC0+ejsKLSAgeDIgPSBxLT54OwotICB5MiA9IHEtPnk7Ci0gIHoyID0gcS0+ejsKLSAgeDMgPSByLT54OwotICB5MyA9IHItPnk7Ci0gIHozID0gci0+ejsKLQotICAvLyBpZiBRPWluZmluaXR5LCByZXR1cm4gcAotICBpZiAobXVsdGlwcmVjaXNpb25faXN6ZXJvKHoyKSkgewotICAgIHBfMjU2X2NvcHlfcG9pbnQociwgcCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gaWYgUD1pbmZpbml0eSwgcmV0dXJuIHEKLSAgaWYgKG11bHRpcHJlY2lzaW9uX2lzemVybyh6MSkpIHsKLSAgICBwXzI1Nl9jb3B5X3BvaW50KHIsIHEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX3NxdWFfbW9kKHQxLCB6MSwgbW9kcCk7ICAgICAgLy8gdDE9ejFeMgotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh0MiwgejEsIHQxLCBtb2RwKTsgIC8vIHQyPXQxKnoxCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHQxLCB4MiwgdDEsIG1vZHApOyAgLy8gdDE9dDEqeDIKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QodDIsIHkyLCB0MiwgbW9kcCk7ICAvLyB0Mj10Mip5MgotCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QodDEsIHQxLCB4MSwgbW9kcCk7ICAvLyB0MT10MS14MQotICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHQyLCB0MiwgeTEsIG1vZHApOyAgLy8gdDI9dDIteTEKLQotICBpZiAobXVsdGlwcmVjaXNpb25faXN6ZXJvKHQxKSkgewotICAgIGlmIChtdWx0aXByZWNpc2lvbl9pc3plcm8odDIpKSB7Ci0gICAgICBFQ0NfRG91YmxlKHIsIHEpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9pbml0KHozKTsKLSAgICAgIHJldHVybjsgIC8vIHJldHVybiBpbmZpbml0eQotICAgIH0KLSAgfQotCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHozLCB6MSwgdDEsIG1vZHApOyAgLy8gejM9ejEqdDEKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QoeTMsIHQxLCBtb2RwKTsgICAgICAvLyB0Mz10MV4yCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHoxLCB5MywgdDEsIG1vZHApOyAgLy8gdDQ9dDMqdDEKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QoeTMsIHkzLCB4MSwgbW9kcCk7ICAvLyB0Mz10Myp4MQotICBtdWx0aXByZWNpc2lvbl9sc2hpZnRfbW9kKHQxLCB5MywgbW9kcCk7ICAgICAgICAgICAgIC8vIHQxPTIqdDMKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QoeDMsIHQyLCBtb2RwKTsgICAgICAvLyB4Mz10Ml4yCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QoeDMsIHgzLCB0MSwgbW9kcCk7ICAgICAgICAgICAgLy8geDM9eDMtdDEKLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh4MywgeDMsIHoxLCBtb2RwKTsgICAgICAgICAgICAvLyB4Mz14My10NAotICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHkzLCB5MywgeDMsIG1vZHApOyAgICAgICAgICAgIC8vIHQzPXQzLXgzCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHkzLCB5MywgdDIsIG1vZHApOyAgLy8gdDM9dDMqdDIKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QoejEsIHoxLCB5MSwgbW9kcCk7ICAvLyB0ND10NCp0MQotICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHkzLCB5MywgejEsIG1vZHApOwotfQotCi0vLyBDb21wdXRpbmcgdGhlIE5vbi1BZGphY2VudCBGb3JtIG9mIGEgcG9zaXRpdmUgaW50ZWdlcgotc3RhdGljIHZvaWQgRUNDX05BRih1aW50OF90KiBuYWYsIHVpbnQzMl90KiBOdW1OQUYsIHVpbnQzMl90KiBrKSB7Ci0gIHVpbnQzMl90IHNpZ247Ci0gIGludCBpID0gMDsKLSAgaW50IGo7Ci0gIHVpbnQzMl90IHZhcjsKLQotICB3aGlsZSAoKHZhciA9IG11bHRpcHJlY2lzaW9uX21vc3Rfc2lnbmJpdHMoaykpID49IDEpIHsKLSAgICBpZiAoa1swXSAmIDB4MDEpICAvLyBrIGlzIG9kZAotICAgIHsKLSAgICAgIHNpZ24gPSAoa1swXSAmIDB4MDMpOyAgLy8gMSBvciAzCi0KLSAgICAgIC8vIGsgPSBrLW5hZltpXQotICAgICAgaWYgKHNpZ24gPT0gMSkKLSAgICAgICAga1swXSA9IGtbMF0gJiAweEZGRkZGRkZFOwotICAgICAgZWxzZSB7Ci0gICAgICAgIGtbMF0gPSBrWzBdICsgMTsKLSAgICAgICAgaWYgKGtbMF0gPT0gMCkgIC8vIG92ZXJmbG93Ci0gICAgICAgIHsKLSAgICAgICAgICBqID0gMTsKLSAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICBrW2pdKys7Ci0gICAgICAgICAgfSB3aGlsZSAoa1tqKytdID09IDApOyAgLy8gb3ZlcmZsb3cKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZQotICAgICAgc2lnbiA9IDA7Ci0KLSAgICBtdWx0aXByZWNpc2lvbl9yc2hpZnQoaywgayk7Ci0gICAgbmFmW2kgLyA0XSB8PSAoc2lnbikgPDwgKChpICUgNCkgKiAyKTsKLSAgICBpKys7Ci0gIH0KLQotICAqTnVtTkFGID0gaTsKLX0KLQotLy8gQmluYXJ5IE5vbi1BZGphY2VudCBGb3JtIGZvciBwb2ludCBtdWx0aXBsaWNhdGlvbgotdm9pZCBFQ0NfUG9pbnRNdWx0X0Jpbl9OQUYoUG9pbnQqIHEsIGNvbnN0IFBvaW50KiBwLCB1aW50MzJfdCogbikgewotICB1aW50MzJfdCBzaWduOwotICB1aW50OF90IG5hZlsyNTYgLyA0ICsgMV07Ci0gIHVpbnQzMl90IE51bU5hZjsKLSAgUG9pbnQgbWludXNfcDsKLSAgUG9pbnQgcjsKLQotICBwXzI1Nl9pbml0X3BvaW50KCZyKTsKLQotICAvLyBpbml0aWFsaXphdGlvbgotICBwXzI1Nl9pbml0X3BvaW50KHEpOwotCi0gIC8vIC1wCi0gIG11bHRpcHJlY2lzaW9uX2NvcHkobWludXNfcC54LCBwLT54KTsKLSAgbXVsdGlwcmVjaXNpb25fc3ViKG1pbnVzX3AueSwgbW9kcCwgcC0+eSk7Ci0KLSAgbXVsdGlwcmVjaXNpb25faW5pdChtaW51c19wLnopOwotICBtaW51c19wLnpbMF0gPSAxOwotCi0gIC8vIE5BRgotICBtZW1zZXQobmFmLCAwLCBzaXplb2YobmFmKSk7Ci0gIEVDQ19OQUYobmFmLCAmTnVtTmFmLCBuKTsKLQotICBmb3IgKGludCBpID0gTnVtTmFmIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBwXzI1Nl9jb3B5X3BvaW50KCZyLCBxKTsKLSAgICBFQ0NfRG91YmxlKHEsICZyKTsKLSAgICBzaWduID0gKG5hZltpIC8gNF0gPj4gKChpICUgNCkgKiAyKSkgJiAweDAzOwotCi0gICAgaWYgKHNpZ24gPT0gMSkgewotICAgICAgcF8yNTZfY29weV9wb2ludCgmciwgcSk7Ci0gICAgICBFQ0NfQWRkKHEsICZyLCBwKTsKLSAgICB9IGVsc2UgaWYgKHNpZ24gPT0gMykgewotICAgICAgcF8yNTZfY29weV9wb2ludCgmciwgcSk7Ci0gICAgICBFQ0NfQWRkKHEsICZyLCAmbWludXNfcCk7Ci0gICAgfQotICB9Ci0KLSAgbXVsdGlwcmVjaXNpb25faW52X21vZChtaW51c19wLngsIHEtPnosIG1vZHApOwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZChxLT56LCBtaW51c19wLngsIG1vZHApOwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZChxLT54LCBxLT54LCBxLT56LCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QocS0+eiwgcS0+eiwgbWludXNfcC54LCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QocS0+eSwgcS0+eSwgcS0+eiwgbW9kcCk7Ci19Ci0KLWJvb2wgRUNDX1ZhbGlkYXRlUG9pbnQoY29uc3QgUG9pbnQmIHB0KSB7Ci0gIC8vIEVuc3VyZSB5XjIgPSB4XjMgKyBhKnggKyBiIChtb2QgcCk7IGEgPSAtMwotCi0gIC8vIHleMiBtb2QgcAotICB1aW50MzJfdCB5Ml9tb2RbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl0gPSB7MH07Ci0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX3NxdWFfbW9kKHkyX21vZCwgKHVpbnQzMl90KilwdC55LCBtb2RwKTsKLQotICAvLyBSaWdodCBoYW5kIHNpZGUgY2FsY3VsYXRpb24KLSAgdWludDMyX3QgcmhzW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdID0gezB9OwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZChyaHMsICh1aW50MzJfdCopcHQueCwgbW9kcCk7Ci0gIHVpbnQzMl90IHRocmVlW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdID0gezB9OwotICB0aHJlZVswXSA9IDM7Ci0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QocmhzLCByaHMsIHRocmVlLCBtb2RwKTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QocmhzLCByaHMsICh1aW50MzJfdCopcHQueCwgbW9kcCk7Ci0gIG11bHRpcHJlY2lzaW9uX2FkZF9tb2QocmhzLCByaHMsIGN1cnZlX3AyNTYuYiwgbW9kcCk7Ci0KLSAgcmV0dXJuIG11bHRpcHJlY2lzaW9uX2NvbXBhcmUocmhzLCB5Ml9tb2QpID09IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBlY2MKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2VjYy9wXzI1Nl9lY2NfcHAuaCBiL2dkL3NlY3VyaXR5L2VjYy9wXzI1Nl9lY2NfcHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjNzI0NS4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9lY2MvcF8yNTZfZWNjX3BwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA2LTIwMTUgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgcGFpcmluZyBhbGdvcml0aG1zIHVzaW5nIEVsbGlwdGljIEN1cnZlCi0gKkNyeXB0b2dyYXBoeSBmb3IgcHJpdmF0ZSBwdWJsaWMga2V5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJzZWN1cml0eS9lY2MvbXVsdHByZWNpc2lvbi5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgZWNjIHsKLQotc3RydWN0IFBvaW50IHsKLSAgdWludDMyX3QgeFtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QgeVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QgeltLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLX07Ci0KLXN0cnVjdCBlbGxpcHRpY19jdXJ2ZV90IHsKLSAgLy8gY3VydmUncyBjb2VmZmljaWVudHMKLSAgdWludDMyX3QgYVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QgYltLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLQotICAvLyBwcmltZSBtb2R1bHVzCi0gIHVpbnQzMl90IHBbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl07Ci0KLSAgLy8gT21lZ2EsIHAgPSAyXm0gLW9tZWdhCi0gIHVpbnQzMl90IG9tZWdhW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotCi0gIC8vIGJhc2UgcG9pbnQsIGEgcG9pbnQgb24gRSBvZiBvcmRlciByCi0gIFBvaW50IEc7Ci19OwotCi0vLyBQLTI1NiBlbGxpcHRpYyBjdXJ2ZSwgYXMgcGVyIEJUIFNwZWMgNS4xIFZvbCAyLCBQYXJ0IEggNy42Ci1zdGF0aWMgY29uc3RleHByIGVsbGlwdGljX2N1cnZlX3QgY3VydmVfcDI1NnsKLSAgICAuYSA9IHswfSwKLSAgICAuYiA9IHsweDI3ZDI2MDRiLCAweDNiY2UzYzNlLCAweGNjNTNiMGY2LCAweDY1MWQwNmIwLCAweDc2OTg4NmJjLCAweGIzZWJiZDU1LCAweGFhM2E5M2U3LCAweDVhYzYzNWQ4fSwKLSAgICAucCA9IHsweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAsIDB4MCwgMHgwLCAweDAwMDAwMDAxLCAweEZGRkZGRkZGfSwKLSAgICAub21lZ2EgPSB7MH0sCi0KLSAgICAuRyA9IHsueCA9IHsweGQ4OThjMjk2LCAweGY0YTEzOTQ1LCAweDJkZWIzM2EwLCAweDc3MDM3ZDgxLCAweDYzYTQ0MGYyLCAweGY4YmNlNmU1LCAweGUxMmM0MjQ3LCAweDZiMTdkMWYyfSwKLSAgICAgICAgICAueSA9IHsweDM3YmY1MWY1LCAweGNiYjY0MDY4LCAweDZiMzE1ZWNlLCAweDJiY2UzMzU3LCAweDdjMGY5ZTE2LCAweDhlZTdlYjRhLCAweGZlMWE3ZjliLCAweDRmZTM0MmUyfSwKLSAgICAgICAgICAueiA9IHsweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfX0sCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IHBvaW50IGlzIG9uIHRoZSBlbGxpcHRpYyBjdXJ2ZSovCi1ib29sIEVDQ19WYWxpZGF0ZVBvaW50KGNvbnN0IFBvaW50JiBwb2ludCk7Ci0KLXZvaWQgRUNDX1BvaW50TXVsdF9CaW5fTkFGKFBvaW50KiBxLCBjb25zdCBQb2ludCogcCwgdWludDMyX3QqIG4pOwotCi0jZGVmaW5lIEVDQ19Qb2ludE11bHQocSwgcCwgbikgRUNDX1BvaW50TXVsdF9CaW5fTkFGKHEsIHAsIG4pCi0KLX0gIC8vIG5hbWVzcGFjZSBlY2MKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvZWNkaF9rZXlzLmNjIGIvZ2Qvc2VjdXJpdHkvZWNkaF9rZXlzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQyMTRiLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2VjZGhfa2V5cy5jYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZWN1cml0eS9lY2RoX2tleXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBUT0RPOiBXZSBzaG91bGQgaGF2ZSByYW5kb20gbnVtYmVyIG1hbmFnZW1lbnQgaW4gc2VwYXJhdGUgZmlsZSwgYW5kIHdlCi0gICAgICAgc2hvdWxkIGhvbm91ciBhbGwgdGhlIHJhbmRvbSBudW1iZXIgcmVxdWlyZW1lbnRzIGZyb20gdGhlIHNwZWMhIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLQotI2luY2x1ZGUgInNlY3VyaXR5L2VjYy9wXzI1Nl9lY2NfcHAuaCIKLQotbmFtZXNwYWNlIHsKLQotc3RhdGljIGJvb2wgc3JhbmRfaW5pdGlhdGVkID0gZmFsc2U7Ci0KLXRlbXBsYXRlIDxzaXplX3QgU0laRT4KLXN0YXRpYyBzdGQ6OmFycmF5PHVpbnQ4X3QsIFNJWkU+IEdlbmVyYXRlUmFuZG9tKCkgewotICBpZiAoIXNyYW5kX2luaXRpYXRlZCkgewotICAgIHNyYW5kX2luaXRpYXRlZCA9IHRydWU7Ci0gICAgLy8gVE9ETzogIFdlIG5lZWQgYSBwcm9wZXIgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGhlcmUuCi0gICAgLy8gdXNlIGN1cnJlbnQgdGltZSBhcyBzZWVkIGZvciByYW5kb20gZ2VuZXJhdG9yCi0gICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUobnVsbHB0cikpOwotICB9Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCBTSVpFPiByOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFNJWkU7IGkrKykgcltpXSA9IHN0ZDo6cmFuZCgpOwotICByZXR1cm4gcjsKLX0KLX0gIC8vIG5hbWVzcGFjZQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1zdGQ6OnBhaXI8c3RkOjphcnJheTx1aW50OF90LCAzMj4sIEVjZGhQdWJsaWNLZXk+IEdlbmVyYXRlRUNESEtleVBhaXIoKSB7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IHByaXZhdGVfa2V5ID0gR2VuZXJhdGVSYW5kb208MzI+KCk7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IHByaXZhdGVfa2V5X2NvcHkgPSBwcml2YXRlX2tleTsKLSAgZWNjOjpQb2ludCBwdWJsaWNfa2V5OwotCi0gIEVDQ19Qb2ludE11bHQoJnB1YmxpY19rZXksICYoZWNjOjpjdXJ2ZV9wMjU2LkcpLCAodWludDMyX3QqKXByaXZhdGVfa2V5X2NvcHkuZGF0YSgpKTsKLQotICBFY2RoUHVibGljS2V5IHBrOwotICBtZW1jcHkocGsueC5kYXRhKCksIHB1YmxpY19rZXkueCwgMzIpOwotICBtZW1jcHkocGsueS5kYXRhKCksIHB1YmxpY19rZXkueSwgMzIpOwotCi0gIC8qIHByaXZhdGVfa2V5LCBwdWJsaWMga2V5IHBhaXIgKi8KLSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyPHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+LCBFY2RoUHVibGljS2V5PihzdGQ6Om1vdmUocHJpdmF0ZV9rZXkpLCBzdGQ6Om1vdmUocGspKTsKLX0KLQotYm9vbCBWYWxpZGF0ZUVDREhQb2ludChFY2RoUHVibGljS2V5IHBrKSB7Ci0gIGVjYzo6UG9pbnQgcHVibGljX2tleTsKLSAgbWVtY3B5KHB1YmxpY19rZXkueCwgcGsueC5kYXRhKCksIDMyKTsKLSAgbWVtY3B5KHB1YmxpY19rZXkueSwgcGsueS5kYXRhKCksIDMyKTsKLSAgbWVtc2V0KHB1YmxpY19rZXkueiwgMCwgMzIpOwotICByZXR1cm4gRUNDX1ZhbGlkYXRlUG9pbnQocHVibGljX2tleSk7Ci19Ci0KLXN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IENvbXB1dGVESEtleShzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBteV9wcml2YXRlX2tleSwgRWNkaFB1YmxpY0tleSByZW1vdGVfcHVibGljX2tleSkgewotICBlY2M6OlBvaW50IHBlZXJfcHVibF9rZXksIG5ld19wdWJsX2tleTsKLSAgdWludDMyX3QgcHJpdmF0ZV9rZXlbOF07Ci0gIG1lbWNweShwcml2YXRlX2tleSwgbXlfcHJpdmF0ZV9rZXkuZGF0YSgpLCAzMik7Ci0gIG1lbWNweShwZWVyX3B1Ymxfa2V5LngsIHJlbW90ZV9wdWJsaWNfa2V5LnguZGF0YSgpLCAzMik7Ci0gIG1lbWNweShwZWVyX3B1Ymxfa2V5LnksIHJlbW90ZV9wdWJsaWNfa2V5LnkuZGF0YSgpLCAzMik7Ci0gIG1lbXNldChwZWVyX3B1Ymxfa2V5LnosIDAsIDMyKTsKLSAgcGVlcl9wdWJsX2tleS56WzBdID0gMTsKLQotICBFQ0NfUG9pbnRNdWx0KCZuZXdfcHVibF9rZXksICZwZWVyX3B1Ymxfa2V5LCAodWludDMyX3QqKXByaXZhdGVfa2V5KTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBkaGtleTsKLSAgbWVtY3B5KGRoa2V5LmRhdGEoKSwgbmV3X3B1Ymxfa2V5LngsIDMyKTsKLSAgcmV0dXJuIGRoa2V5OwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2VjZGhfa2V5cy5oIGIvZ2Qvc2VjdXJpdHkvZWNkaF9rZXlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzQzMDIuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvZWNkaF9rZXlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxhcnJheT4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1zdHJ1Y3QgRWNkaFB1YmxpY0tleSB7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IHg7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IHk7Ci19OwotCi0vKiB0aGlzIGdlbmVyYXRlcyBwcml2YXRlIGFuZCBwdWJsaWMgRWxpcHRpYyBDdXJ2ZSBEaWZmaWUgSGVsbWFuIGtleXMgKi8KLXN0ZDo6cGFpcjxzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiwgRWNkaFB1YmxpY0tleT4gR2VuZXJhdGVFQ0RIS2V5UGFpcigpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGF0IHRoZSBnaXZlbiBwdWJsaWMga2V5IChwb2ludCkgbGF5cyBvbiB0aGUgc3BlY2lhbAotICogQmx1ZXRvb3RoIGN1cnZlICovCi1ib29sIFZhbGlkYXRlRUNESFBvaW50KEVjZGhQdWJsaWNLZXkgcGspOwotCi1zdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBDb21wdXRlREhLZXkoc3RkOjphcnJheTx1aW50OF90LCAzMj4gbXlfcHJpdmF0ZV9rZXksIEVjZGhQdWJsaWNLZXkgcmVtb3RlX3B1YmxpY19rZXkpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2ZhY2FkZS5jYyBiL2dkL3NlY3VyaXR5L2ZhY2FkZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2NmMxMC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9mYWNhZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlICJzZWN1cml0eS9mYWNhZGUuaCIKLQotI2luY2x1ZGUgImdycGMvZ3JwY19ldmVudF9xdWV1ZS5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9sZV9hZGRyZXNzX21hbmFnZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL3NlY3VyaXR5X3BvbGljeS5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2wyY2FwX2xlX21vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9mYWNhZGUuZ3JwYy5wYi5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmcvb29iX2RhdGEuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9zZWN1cml0eV9tYW5hZ2VyX2xpc3RlbmVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc2VjdXJpdHlfbW9kdWxlLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvdWkuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpsMmNhcDo6bGU6OkwyY2FwTGVNb2R1bGU7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciB1aW50OF90IEFVVEhfUkVRX05PX0JPTkQgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgQVVUSF9SRVFfQk9ORCA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBBVVRIX1JFUV9NSVRNX01BU0sgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3QgQVVUSF9SRVFfU0VDVVJFX0NPTk5FQ1RJT05TX01BU0sgPSAweDA4OwotY29uc3RleHByIHVpbnQ4X3QgQVVUSF9SRVFfS0VZUFJFU1NfTUFTSyA9IDB4MTA7Ci1jb25zdGV4cHIgdWludDhfdCBBVVRIX1JFUV9DVDJfTUFTSyA9IDB4MjA7Ci1jb25zdGV4cHIgdWludDhfdCBBVVRIX1JFUV9SRlVfTUFTSyA9IDB4QzA7Ci0KLWZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIFRvRmFjYWRlQWRkcmVzc1dpdGhUeXBlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpIHsKLSAgZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUgcmV0OwotCi0gIHJldC5tdXRhYmxlX2FkZHJlc3MoKS0+c2V0X2FkZHJlc3MoYWRkcmVzcy5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKSk7Ci0gIHJldC5zZXRfdHlwZShzdGF0aWNfY2FzdDxmYWNhZGU6OkJsdWV0b290aEFkZHJlc3NUeXBlRW51bT4oYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpKSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIFNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZSA6IHB1YmxpYyBTZWN1cml0eU1vZHVsZUZhY2FkZTo6U2VydmljZSwgcHVibGljIElTZWN1cml0eU1hbmFnZXJMaXN0ZW5lciwgcHVibGljIFVJIHsKLSBwdWJsaWM6Ci0gIFNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZSgKLSAgICAgIFNlY3VyaXR5TW9kdWxlKiBzZWN1cml0eV9tb2R1bGUsIEwyY2FwTGVNb2R1bGUqIGwyY2FwX2xlX21vZHVsZSwgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyKQotICAgICAgOiBzZWN1cml0eV9tb2R1bGVfKHNlY3VyaXR5X21vZHVsZSksIGwyY2FwX2xlX21vZHVsZV8obDJjYXBfbGVfbW9kdWxlKSwgc2VjdXJpdHlfaGFuZGxlcl8oc2VjdXJpdHlfaGFuZGxlcikgewotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldFNlY3VyaXR5TWFuYWdlcigpLT5SZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIodGhpcywgc2VjdXJpdHlfaGFuZGxlcl8pOwotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldFNlY3VyaXR5TWFuYWdlcigpLT5TZXRVc2VySW50ZXJmYWNlSGFuZGxlcih0aGlzLCBzZWN1cml0eV9oYW5kbGVyXyk7Ci0KLSAgICAvKiBJbiBvcmRlciB0byByZWNlaXZlIGNvbm5lY3QvZGlzY29uZW5jdCBldmVudCwgd2UgbXVzdCByZWdpc3RlciBzZXJ2aWNlICovCi0gICAgbDJjYXBfbGVfbW9kdWxlXy0+R2V0Rml4ZWRDaGFubmVsTWFuYWdlcigpLT5SZWdpc3RlclNlcnZpY2UoCi0gICAgICAgIGJsdWV0b290aDo6bDJjYXA6OmtMYXN0Rml4ZWRDaGFubmVsIC0gMiwKLSAgICAgICAgY29tbW9uOjpCaW5kT25jZSgmU2VjdXJpdHlNb2R1bGVGYWNhZGVTZXJ2aWNlOjpPbkwyY2FwUmVnaXN0cmF0aW9uQ29tcGxldGVMZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgY29tbW9uOjpCaW5kKCZTZWN1cml0eU1vZHVsZUZhY2FkZVNlcnZpY2U6Ok9uQ29ubmVjdGlvbk9wZW5MZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICAgc2VjdXJpdHlfaGFuZGxlcl8pOwotICB9Ci0KLSAgdm9pZCBPbkwyY2FwUmVnaXN0cmF0aW9uQ29tcGxldGVMZSgKLSAgICAgIGwyY2FwOjpsZTo6Rml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0IHJlc3VsdCwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6bGU6OkZpeGVkQ2hhbm5lbFNlcnZpY2U+IGxlX3NtcF9zZXJ2aWNlKSB7Ci0gICAgQVNTRVJUX0xPRygKLSAgICAgICAgcmVzdWx0ID09IGJsdWV0b290aDo6bDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OlNVQ0NFU1MsCi0gICAgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgdG8gTEUgU01QIEZpeGVkIENoYW5uZWwgU2VydmljZSIpOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25PcGVuTGUoc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpsZTo6Rml4ZWRDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgY2hhbm5lbC0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soCi0gICAgICAgIHNlY3VyaXR5X2hhbmRsZXJfLAotICAgICAgICBjb21tb246OkJpbmRPbmNlKAotICAgICAgICAgICAgJlNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZTo6T25Db25uZWN0aW9uQ2xvc2VkTGUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgY2hhbm5lbC0+R2V0RGV2aWNlKCkpKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uQ2xvc2VkTGUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcywgaGNpOjpFcnJvckNvZGUgZXJyb3JfY29kZSkgewotICAgIFNlY3VyaXR5SGVscGVyTXNnIGRpc2Nvbm5lY3RlZDsKLSAgICAqZGlzY29ubmVjdGVkLm11dGFibGVfcGVlcigpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcyk7Ci0gICAgZGlzY29ubmVjdGVkLnNldF9tZXNzYWdlX3R5cGUoSGVscGVyTXNnVHlwZTo6REVWSUNFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgaGVscGVyX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KGRpc2Nvbm5lY3RlZCk7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBDcmVhdGVCb25kKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBoY2k6OkFkZHJlc3MgcGVlcjsKLSAgICBBU1NFUlQoaGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPmFkZHJlc3MoKS5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBoY2k6OkFkZHJlc3NUeXBlIHBlZXJfdHlwZSA9IHN0YXRpY19jYXN0PGhjaTo6QWRkcmVzc1R5cGU+KHJlcXVlc3QtPnR5cGUoKSk7Ci0gICAgc2VjdXJpdHlfbW9kdWxlXy0+R2V0U2VjdXJpdHlNYW5hZ2VyKCktPkNyZWF0ZUJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUocGVlciwgcGVlcl90eXBlKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIENyZWF0ZUJvbmRPdXRPZkJhbmQoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6OmJsdWV0b290aDo6c2VjdXJpdHk6Ok9vYkRhdGFCb25kTWVzc2FnZSogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpBZGRyZXNzIHBlZXI7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCkuYWRkcmVzcygpLmFkZHJlc3MoKSwgcGVlcikpOwotICAgIGhjaTo6QWRkcmVzc1R5cGUgcGVlcl90eXBlID0gc3RhdGljX2Nhc3Q8aGNpOjpBZGRyZXNzVHlwZT4ocmVxdWVzdC0+YWRkcmVzcygpLnR5cGUoKSk7Ci0gICAgcGFpcmluZzo6U2ltcGxlUGFpcmluZ0hhc2ggYzsKLSAgICBwYWlyaW5nOjpTaW1wbGVQYWlyaW5nUmFuZG9taXplciByOwotICAgIHN0ZDo6Y29weSgKLSAgICAgICAgc3RkOjpiZWdpbihyZXF1ZXN0LT5wMTkyX2RhdGEoKS5jb25maXJtYXRpb25fdmFsdWUoKSksCi0gICAgICAgIHN0ZDo6ZW5kKHJlcXVlc3QtPnAxOTJfZGF0YSgpLmNvbmZpcm1hdGlvbl92YWx1ZSgpKSwKLSAgICAgICAgYy5kYXRhKCkpOwotICAgIHN0ZDo6Y29weShzdGQ6OmJlZ2luKHJlcXVlc3QtPnAxOTJfZGF0YSgpLnJhbmRvbV92YWx1ZSgpKSwgc3RkOjplbmQocmVxdWVzdC0+cDE5Ml9kYXRhKCkucmFuZG9tX3ZhbHVlKCkpLCByLmRhdGEoKSk7Ci0gICAgcGFpcmluZzo6T29iRGF0YSBwMTkyX2RhdGEoYywgcik7Ci0gICAgc3RkOjpjb3B5KAotICAgICAgICBzdGQ6OmJlZ2luKHJlcXVlc3QtPnAyNTZfZGF0YSgpLmNvbmZpcm1hdGlvbl92YWx1ZSgpKSwKLSAgICAgICAgc3RkOjplbmQocmVxdWVzdC0+cDI1Nl9kYXRhKCkuY29uZmlybWF0aW9uX3ZhbHVlKCkpLAotICAgICAgICBjLmRhdGEoKSk7Ci0gICAgc3RkOjpjb3B5KHN0ZDo6YmVnaW4ocmVxdWVzdC0+cDI1Nl9kYXRhKCkucmFuZG9tX3ZhbHVlKCkpLCBzdGQ6OmVuZChyZXF1ZXN0LT5wMjU2X2RhdGEoKS5yYW5kb21fdmFsdWUoKSksIHIuZGF0YSgpKTsKLSAgICBwYWlyaW5nOjpPb2JEYXRhIHAyNTZfZGF0YShjLCByKTsKLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRTZWN1cml0eU1hbmFnZXIoKS0+Q3JlYXRlQm9uZE91dE9mQmFuZCgKLSAgICAgICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUocGVlciwgcGVlcl90eXBlKSwgcDE5Ml9kYXRhLCBwMjU2X2RhdGEpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBHZXRPdXRPZkJhbmREYXRhKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgc2VjdXJpdHlfbW9kdWxlXy0+R2V0U2VjdXJpdHlNYW5hZ2VyKCktPkdldE91dE9mQmFuZERhdGEoCi0gICAgICAgIHNlY3VyaXR5X2hhbmRsZXJfLT5CaW5kT25jZU9uKHRoaXMsICZTZWN1cml0eU1vZHVsZUZhY2FkZVNlcnZpY2U6Ok9vYkRhdGFFdmVudE9jY3VycmVkKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEZldGNoR2V0T3V0T2ZCYW5kRGF0YUV2ZW50cygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxPb2JEYXRhQm9uZE1lc3NhZ2U+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gb29iX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgQ3JlYXRlQm9uZExlKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBwZWVyOwotICAgIEFTU0VSVChoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcocmVxdWVzdC0+YWRkcmVzcygpLmFkZHJlc3MoKSwgcGVlcikpOwotICAgIGhjaTo6QWRkcmVzc1R5cGUgcGVlcl90eXBlID0gc3RhdGljX2Nhc3Q8aGNpOjpBZGRyZXNzVHlwZT4ocmVxdWVzdC0+dHlwZSgpKTsKLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRTZWN1cml0eU1hbmFnZXIoKS0+Q3JlYXRlQm9uZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlKHBlZXIsIHBlZXJfdHlwZSkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBDYW5jZWxCb25kKDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwgY29uc3QgZmFjYWRlOjpCbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBoY2k6OkFkZHJlc3MgcGVlcjsKLSAgICBBU1NFUlQoaGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPmFkZHJlc3MoKS5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBoY2k6OkFkZHJlc3NUeXBlIHBlZXJfdHlwZSA9IGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRTZWN1cml0eU1hbmFnZXIoKS0+Q2FuY2VsQm9uZChoY2k6OkFkZHJlc3NXaXRoVHlwZShwZWVyLCBwZWVyX3R5cGUpKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgUmVtb3ZlQm9uZCg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGZhY2FkZTo6Qmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpBZGRyZXNzIHBlZXI7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCkuYWRkcmVzcygpLCBwZWVyKSk7Ci0gICAgaGNpOjpBZGRyZXNzVHlwZSBwZWVyX3R5cGUgPSBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gICAgc2VjdXJpdHlfbW9kdWxlXy0+R2V0U2VjdXJpdHlNYW5hZ2VyKCktPlJlbW92ZUJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUocGVlciwgcGVlcl90eXBlKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIEZldGNoVWlFdmVudHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z3JwYzo6U2VydmVyV3JpdGVyPFVpTXNnPiogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHVpX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2VuZFVpQ2FsbGJhY2soOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCBVaUNhbGxiYWNrTXNnKiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBwZWVyOwotICAgIEFTU0VSVChoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcocmVxdWVzdC0+YWRkcmVzcygpLmFkZHJlc3MoKS5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBoY2k6OkFkZHJlc3NUeXBlIHJlbW90ZV90eXBlID0gc3RhdGljX2Nhc3Q8aGNpOjpBZGRyZXNzVHlwZT4ocmVxdWVzdC0+YWRkcmVzcygpLnR5cGUoKSk7Ci0KLSAgICBzd2l0Y2ggKHJlcXVlc3QtPm1lc3NhZ2VfdHlwZSgpKSB7Ci0gICAgICBjYXNlIFVpQ2FsbGJhY2tUeXBlOjpQQVNTS0VZOgotICAgICAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRTZWN1cml0eU1hbmFnZXIoKS0+T25QYXNza2V5RW50cnkoCi0gICAgICAgICAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZShwZWVyLCByZW1vdGVfdHlwZSksIHJlcXVlc3QtPm51bWVyaWNfdmFsdWUoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVaUNhbGxiYWNrVHlwZTo6WUVTX05POgotICAgICAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRTZWN1cml0eU1hbmFnZXIoKS0+T25Db25maXJtWWVzTm8oaGNpOjpBZGRyZXNzV2l0aFR5cGUocGVlciwgcmVtb3RlX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+Ym9vbGVhbigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVpQ2FsbGJhY2tUeXBlOjpQQUlSSU5HX1BST01QVDoKLSAgICAgICAgc2VjdXJpdHlfbW9kdWxlXy0+R2V0U2VjdXJpdHlNYW5hZ2VyKCktPk9uUGFpcmluZ1Byb21wdEFjY2VwdGVkKAotICAgICAgICAgICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUocGVlciwgcmVtb3RlX3R5cGUpLCByZXF1ZXN0LT5ib29sZWFuKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVWlDYWxsYmFja1R5cGU6OlBJTjoKLSAgICAgICAgTE9HX0lORk8oIlBJTiBDYWxsYmFjayIpOwotICAgICAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRTZWN1cml0eU1hbmFnZXIoKS0+T25QaW5FbnRyeSgKLSAgICAgICAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlKHBlZXIsIHJlbW90ZV90eXBlKSwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHJlcXVlc3QtPnBpbigpLmNiZWdpbigpLCByZXF1ZXN0LT5waW4oKS5jZW5kKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfRVJST1IoIlVua25vd24gVWlDYWxsYmFja1R5cGUgJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcXVlc3QtPm1lc3NhZ2VfdHlwZSgpKSk7Ci0gICAgICAgIHJldHVybiA6OmdycGM6OlN0YXR1cyg6OmdycGM6OlN0YXR1c0NvZGU6OklOVkFMSURfQVJHVU1FTlQsICJVbmtub3duIFVpQ2FsbGJhY2tUeXBlIik7Ci0gICAgfQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaEJvbmRFdmVudHMoOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8Qm9uZE1zZz4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHJldHVybiBib25kX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRmV0Y2hIZWxwZXJFdmVudHMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8U2VjdXJpdHlIZWxwZXJNc2c+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gaGVscGVyX2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0gIDo6Z3JwYzo6U3RhdHVzIFNldElvQ2FwYWJpbGl0eSg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IElvQ2FwYWJpbGl0eU1lc3NhZ2UqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkoKS0+U2V0SW9DYXBhYmlsaXR5KAotICAgICAgICBzdGF0aWNfY2FzdDxoY2k6OklvQ2FwYWJpbGl0eT4ocmVxdWVzdC0+Y2FwYWJpbGl0eSgpKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNldExlSW9DYXBhYmlsaXR5KAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgTGVJb0NhcGFiaWxpdHlNZXNzYWdlKiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRGYWNhZGVDb25maWd1cmF0aW9uQXBpKCktPlNldExlSW9DYXBhYmlsaXR5KAotICAgICAgICBzdGF0aWNfY2FzdDxzZWN1cml0eTo6SW9DYXBhYmlsaXR5PihyZXF1ZXN0LT5jYXBhYmlsaXRpZXMoKSkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyg6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzTWVzc2FnZSogcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRGYWNhZGVDb25maWd1cmF0aW9uQXBpKCktPlNldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKAotICAgICAgICBzdGF0aWNfY2FzdDxoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzPihyZXF1ZXN0LT5yZXF1aXJlbWVudCgpKSk7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gIDo6Z3JwYzo6U3RhdHVzIFNldExlQXV0aFJlcXVpcmVtZW50cygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IExlQXV0aFJlcXVpcmVtZW50c01lc3NhZ2UqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHVpbnQ4X3QgYXV0aF9yZXEgPSByZXF1ZXN0LT5ib25kKCkgPyBBVVRIX1JFUV9CT05EIDogQVVUSF9SRVFfTk9fQk9ORDsKLQotICAgIGlmIChyZXF1ZXN0LT5taXRtKCkpIGF1dGhfcmVxIHw9IEFVVEhfUkVRX01JVE1fTUFTSzsKLSAgICBpZiAocmVxdWVzdC0+c2VjdXJlX2Nvbm5lY3Rpb25zKCkpIGF1dGhfcmVxIHw9IEFVVEhfUkVRX1NFQ1VSRV9DT05ORUNUSU9OU19NQVNLOwotICAgIGlmIChyZXF1ZXN0LT5rZXlwcmVzcygpKSBhdXRoX3JlcSB8PSBBVVRIX1JFUV9LRVlQUkVTU19NQVNLOwotICAgIGlmIChyZXF1ZXN0LT5jdDIoKSkgYXV0aF9yZXEgfD0gQVVUSF9SRVFfQ1QyX01BU0s7Ci0gICAgaWYgKHJlcXVlc3QtPnJlc2VydmVkX2JpdHMoKSkgYXV0aF9yZXEgfD0gKCgocmVxdWVzdC0+cmVzZXJ2ZWRfYml0cygpKSA8PCA2KSAmIEFVVEhfUkVRX1JGVV9NQVNLKTsKLQotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkoKS0+U2V0TGVBdXRoUmVxdWlyZW1lbnRzKGF1dGhfcmVxKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2V0TGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemUoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZU1lc3NhZ2UqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkoKS0+U2V0TGVNYXhpbXVtRW5jcnlwdGlvbktleVNpemUoCi0gICAgICAgIHJlcXVlc3QtPm1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSgpKTsKLSAgICByZXR1cm4gOjpncnBjOjpTdGF0dXM6Ok9LOwotICB9Ci0KLSAgOjpncnBjOjpTdGF0dXMgU2V0TGVPb2JEYXRhUHJlc2VudCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IExlT29iRGF0YVByZXNlbnRNZXNzYWdlKiByZXF1ZXN0LAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRGYWNhZGVDb25maWd1cmF0aW9uQXBpKCktPlNldExlT29iRGF0YVByZXNlbnQoCi0gICAgICAgIHN0YXRpY19jYXN0PE9vYkRhdGFGbGFnPihyZXF1ZXN0LT5kYXRhX3ByZXNlbnQoKSkpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRMZUluaXRpYXRvckFkZHJlc3NQb2xpY3koCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGhjaTo6UHJpdmFjeVBvbGljeSogcmVxdWVzdCwgOjpnb29nbGU6OnByb3RvYnVmOjpFbXB0eSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBBZGRyZXNzIGFkZHJlc3MgPSBBZGRyZXNzOjprRW1wdHk7Ci0gICAgaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5PihyZXF1ZXN0LT5hZGRyZXNzX3BvbGljeSgpKTsKLSAgICBpZiAoYWRkcmVzc19wb2xpY3kgPT0gaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfU1RBVElDX0FERFJFU1MgfHwKLSAgICAgICAgYWRkcmVzc19wb2xpY3kgPT0gaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfUFVCTElDX0FERFJFU1MpIHsKLSAgICAgIEFTU0VSVChBZGRyZXNzOjpGcm9tU3RyaW5nKHJlcXVlc3QtPmFkZHJlc3Nfd2l0aF90eXBlKCkuYWRkcmVzcygpLmFkZHJlc3MoKSwgYWRkcmVzcykpOwotICAgIH0KLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZShhZGRyZXNzLCBzdGF0aWNfY2FzdDxoY2k6OkFkZHJlc3NUeXBlPihyZXF1ZXN0LT5hZGRyZXNzX3dpdGhfdHlwZSgpLnR5cGUoKSkpOwotICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IGlyayA9IHt9OwotICAgIGF1dG8gcmVxdWVzdF9pcmtfbGVuZ3RoID0gcmVxdWVzdC0+cm90YXRpb25faXJrKCkuZW5kKCkgLSByZXF1ZXN0LT5yb3RhdGlvbl9pcmsoKS5iZWdpbigpOwotICAgIGlmIChyZXF1ZXN0X2lya19sZW5ndGggPT0gY3J5cHRvX3Rvb2xib3g6Ok9DVEVUMTZfTEVOKSB7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpcmtfZGF0YShyZXF1ZXN0LT5yb3RhdGlvbl9pcmsoKS5iZWdpbigpLCByZXF1ZXN0LT5yb3RhdGlvbl9pcmsoKS5lbmQoKSk7Ci0gICAgICBzdGQ6OmNvcHlfbihpcmtfZGF0YS5iZWdpbigpLCBjcnlwdG9fdG9vbGJveDo6T0NURVQxNl9MRU4sIGlyay5iZWdpbigpKTsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUKHJlcXVlc3RfaXJrX2xlbmd0aCA9PSAwKTsKLSAgICB9Ci0gICAgYXV0byBtaW5pbXVtX3JvdGF0aW9uX3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHJlcXVlc3QtPm1pbmltdW1fcm90YXRpb25fdGltZSgpKTsKLSAgICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMocmVxdWVzdC0+bWF4aW11bV9yb3RhdGlvbl90aW1lKCkpOwotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldFNlY3VyaXR5TWFuYWdlcigpLT5TZXRMZUluaXRpYXRvckFkZHJlc3NQb2xpY3lGb3JUZXN0KAotICAgICAgICBhZGRyZXNzX3BvbGljeSwgYWRkcmVzc193aXRoX3R5cGUsIGlyaywgbWluaW11bV9yb3RhdGlvbl90aW1lLCBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaEVuZm9yY2VTZWN1cml0eVBvbGljeUV2ZW50cygKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxFbmZvcmNlU2VjdXJpdHlQb2xpY3lNc2c+KiB3cml0ZXIpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfZXZlbnRzXy5SdW5Mb29wKGNvbnRleHQsIHdyaXRlcik7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBFbmZvcmNlU2VjdXJpdHlQb2xpY3koCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBTZWN1cml0eVBvbGljeU1lc3NhZ2UqIHJlcXVlc3QsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXNwb25zZSkgb3ZlcnJpZGUgewotICAgIGhjaTo6QWRkcmVzcyBwZWVyOwotICAgIEFTU0VSVChoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcocmVxdWVzdC0+YWRkcmVzcygpLmFkZHJlc3MoKS5hZGRyZXNzKCksIHBlZXIpKTsKLSAgICBoY2k6OkFkZHJlc3NUeXBlIHBlZXJfdHlwZSA9IHN0YXRpY19jYXN0PGhjaTo6QWRkcmVzc1R5cGU+KHJlcXVlc3QtPmFkZHJlc3MoKS50eXBlKCkpOwotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHBlZXJfd2l0aF90eXBlKHBlZXIsIHBlZXJfdHlwZSk7Ci0gICAgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2U6OlJlc3VsdENhbGxiYWNrIGNhbGxiYWNrID0KLSAgICAgICAgc2VjdXJpdHlfaGFuZGxlcl8tPkJpbmRPbmNlT24odGhpcywgJlNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZTo6RW5mb3JjZVNlY3VyaXR5UG9saWN5RXZlbnQpOwotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkoKS0+RW5mb3JjZVNlY3VyaXR5UG9saWN5KAotICAgICAgICBwZWVyX3dpdGhfdHlwZSwgc3RhdGljX2Nhc3Q8bDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5PihyZXF1ZXN0LT5wb2xpY3koKSksIHN0ZDo6bW92ZShjYWxsYmFjaykpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBHZXRMZU91dE9mQmFuZERhdGEoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpibHVldG9vdGg6OnNlY3VyaXR5OjpPb2JEYXRhTWVzc2FnZSogcmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsZV9zY19jOwotICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxlX3NjX3I7Ci0gICAgc2VjdXJpdHlfbW9kdWxlXy0+R2V0RmFjYWRlQ29uZmlndXJhdGlvbkFwaSgpLT5HZXRMZU91dE9mQmFuZERhdGEoJmxlX3NjX2MsICZsZV9zY19yKTsKLQotICAgIHN0ZDo6c3RyaW5nIGxlX3NjX2Nfc3RyKDE3LCAnXDAnKTsKLSAgICBzdGQ6OmNvcHkobGVfc2NfYy5iZWdpbigpLCBsZV9zY19jLmVuZCgpLCBsZV9zY19jX3N0ci5kYXRhKCkpOwotICAgIHJlc3BvbnNlLT5zZXRfY29uZmlybWF0aW9uX3ZhbHVlKGxlX3NjX2Nfc3RyKTsKLQotICAgIHN0ZDo6c3RyaW5nIGxlX3NjX3Jfc3RyKDE3LCAnXDAnKTsKLSAgICBzdGQ6OmNvcHkobGVfc2Nfci5iZWdpbigpLCBsZV9zY19yLmVuZCgpLCBsZV9zY19yX3N0ci5kYXRhKCkpOwotICAgIHJlc3BvbnNlLT5zZXRfcmFuZG9tX3ZhbHVlKGxlX3NjX3Jfc3RyKTsKLQotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBTZXRPdXRPZkJhbmREYXRhKAotICAgICAgOjpncnBjOjpTZXJ2ZXJDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OnNlY3VyaXR5OjpPb2JEYXRhTWVzc2FnZSogcmVxdWVzdCwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgaGNpOjpBZGRyZXNzIHBlZXI7Ci0gICAgQVNTRVJUKGhjaTo6QWRkcmVzczo6RnJvbVN0cmluZyhyZXF1ZXN0LT5hZGRyZXNzKCkuYWRkcmVzcygpLmFkZHJlc3MoKSwgcGVlcikpOwotICAgIGhjaTo6QWRkcmVzc1R5cGUgcGVlcl90eXBlID0gc3RhdGljX2Nhc3Q8aGNpOjpBZGRyZXNzVHlwZT4ocmVxdWVzdC0+YWRkcmVzcygpLnR5cGUoKSk7Ci0gICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcGVlcl93aXRoX3R5cGUocGVlciwgcGVlcl90eXBlKTsKLQotICAgIC8vIFdlIGNhbid0IHNpbXBseSBpdGVyYXRlIHRpbGwgZW5kIG9mIHN0cmluZywgYmVjYXVzZSB3ZSBoYXZlIGFuIGVtcHR5IGJ5dGUgYWRkZWQgYXQgdGhlIGVuZC4gV2Uga25vdyBjb25maXJtIGFuZAotICAgIC8vIHJhbmRvbSBhcmUgZml4ZWQgc2l6ZSwgMTYgYnl0ZXMKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsZV9zY19jOwotICAgIGF1dG8gcmVxX2xlX3NjX2MgPSByZXF1ZXN0LT5jb25maXJtYXRpb25fdmFsdWUoKTsKLSAgICBzdGQ6OmNvcHkocmVxX2xlX3NjX2MuYmVnaW4oKSwgcmVxX2xlX3NjX2MuYmVnaW4oKSArIDE2LCBsZV9zY19jLmRhdGEoKSk7Ci0KLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsZV9zY19yOwotICAgIGF1dG8gcmVxX2xlX3NjX3IgPSByZXF1ZXN0LT5yYW5kb21fdmFsdWUoKTsKLSAgICBzdGQ6OmNvcHkocmVxX2xlX3NjX3IuYmVnaW4oKSwgcmVxX2xlX3NjX3IuYmVnaW4oKSArIDE2LCBsZV9zY19yLmRhdGEoKSk7Ci0KLSAgICBzZWN1cml0eV9tb2R1bGVfLT5HZXRGYWNhZGVDb25maWd1cmF0aW9uQXBpKCktPlNldE91dE9mQmFuZERhdGEocGVlcl93aXRoX3R5cGUsIGxlX3NjX2MsIGxlX3NjX3IpOwotICAgIHJldHVybiA6OmdycGM6OlN0YXR1czo6T0s7Ci0gIH0KLQotICA6OmdycGM6OlN0YXR1cyBGZXRjaERpc2Nvbm5lY3RFdmVudHMoCi0gICAgICA6OmdycGM6OlNlcnZlckNvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVtcHR5KiByZXF1ZXN0LAotICAgICAgOjpncnBjOjpTZXJ2ZXJXcml0ZXI8RGlzY29ubmVjdE1zZz4qIHdyaXRlcikgb3ZlcnJpZGUgewotICAgIHNlY3VyaXR5X21vZHVsZV8tPkdldEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkoKS0+U2V0RGlzY29ubmVjdENhbGxiYWNrKAotICAgICAgICBjb21tb246OkJpbmQoJlNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZTo6RGlzY29ubmVjdEV2ZW50T2NjdXJyZWQsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIHJldHVybiBkaXNjb25uZWN0X2V2ZW50c18uUnVuTG9vcChjb250ZXh0LCB3cml0ZXIpOwotICB9Ci0KLSAgdm9pZCBPb2JEYXRhRXZlbnRPY2N1cnJlZChibHVldG9vdGg6OmhjaTo6Q29tbWFuZENvbXBsZXRlVmlldyBwYWNrZXQpIHsKLSAgICBMT0dfSU5GTygiR290IE9PQiBEYXRhIGV2ZW50Iik7Ci0gICAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICAgIGF1dG8gY2MgPSBibHVldG9vdGg6OmhjaTo6UmVhZExvY2FsT29iRGF0YUNvbXBsZXRlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gICAgQVNTRVJUKGNjLklzVmFsaWQoKSk7Ci0gICAgT29iRGF0YUJvbmRNZXNzYWdlIG1zZzsKLSAgICBPb2JEYXRhTWVzc2FnZSBwMTkyOwotICAgIC8vIEp1c3QgbmVlZCB0aGlzIHRvIHNhdGlzZnkgdGhlIHByb3RvIG1lc3NhZ2UKLSAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIHBlZXI7Ci0gICAgKnAxOTIubXV0YWJsZV9hZGRyZXNzKCkgPSBUb0ZhY2FkZUFkZHJlc3NXaXRoVHlwZShwZWVyKTsKLQotICAgIGF1dG8gYyA9IGNjLkdldEMoKTsKLSAgICBwMTkyLnNldF9jb25maXJtYXRpb25fdmFsdWUoYy5kYXRhKCksIGMuc2l6ZSgpKTsKLQotICAgIGF1dG8gciA9IGNjLkdldFIoKTsKLSAgICBwMTkyLnNldF9yYW5kb21fdmFsdWUoci5kYXRhKCksIHIuc2l6ZSgpKTsKLQotICAgIC8vIE9ubHkgdGhlIEV4dGVuZGVkIHZlcnNpb24gcmV0dXJucyAyNTYgYWxzby4KLSAgICAvLyBUaGUgQVBJIGhhcyBhIHBhcmFtZXRlciBmb3IgYm90aCwgc28gd2Ugc2V0IGl0Ci0gICAgLy8gZW1wdHkgYW5kIHRoZSBtb2R1bGUgYW5kIHRlc3Qgc3VpdGUgd2lsbCBpZ25vcmUgaXQuCi0gICAgT29iRGF0YU1lc3NhZ2UgcDI1NjsKLSAgICAqcDI1Ni5tdXRhYmxlX2FkZHJlc3MoKSA9IFRvRmFjYWRlQWRkcmVzc1dpdGhUeXBlKHBlZXIpOwotCi0gICAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gZW1wdHlfdmFsOwotICAgIHAyNTYuc2V0X2NvbmZpcm1hdGlvbl92YWx1ZShlbXB0eV92YWwuZGF0YSgpLCBlbXB0eV92YWwuc2l6ZSgpKTsKLSAgICBwMjU2LnNldF9yYW5kb21fdmFsdWUoZW1wdHlfdmFsLmRhdGEoKSwgZW1wdHlfdmFsLnNpemUoKSk7Ci0KLSAgICAqbXNnLm11dGFibGVfYWRkcmVzcygpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUocGVlcik7Ci0gICAgKm1zZy5tdXRhYmxlX3AxOTJfZGF0YSgpID0gcDE5MjsKLSAgICAqbXNnLm11dGFibGVfcDI1Nl9kYXRhKCkgPSBwMjU2OwotICAgIG9vYl9ldmVudHNfLk9uSW5jb21pbmdFdmVudChtc2cpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0RXZlbnRPY2N1cnJlZChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIHBlZXIpIHsKLSAgICBMT0dfSU5GTygiJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgRGlzY29ubmVjdE1zZyBtc2c7Ci0gICAgKm1zZy5tdXRhYmxlX2FkZHJlc3MoKSA9IFRvRmFjYWRlQWRkcmVzc1dpdGhUeXBlKHBlZXIpOwotICAgIGRpc2Nvbm5lY3RfZXZlbnRzXy5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgfQotCi0gIHZvaWQgRGlzcGxheVBhaXJpbmdQcm9tcHQoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgcGVlciwgc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIExPR19JTkZPKCIlcyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBVaU1zZyBkaXNwbGF5X3llc19ubzsKLSAgICAqZGlzcGxheV95ZXNfbm8ubXV0YWJsZV9wZWVyKCkgPSBUb0ZhY2FkZUFkZHJlc3NXaXRoVHlwZShwZWVyKTsKLSAgICBkaXNwbGF5X3llc19uby5zZXRfbWVzc2FnZV90eXBlKFVpTXNnVHlwZTo6RElTUExBWV9QQUlSSU5HX1BST01QVCk7Ci0gICAgZGlzcGxheV95ZXNfbm8uc2V0X3VuaXF1ZV9pZCh1bmlxdWVfaWQrKyk7Ci0gICAgdWlfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoZGlzcGxheV95ZXNfbm8pOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERpc3BsYXlDb25maXJtVmFsdWUoQ29uZmlybWF0aW9uRGF0YSBkYXRhKSB7Ci0gICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgcGVlciA9IGRhdGEuR2V0QWRkcmVzc1dpdGhUeXBlKCk7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZSA9IGRhdGEuR2V0TmFtZSgpOwotICAgIHVpbnQzMl90IG51bWVyaWNfdmFsdWUgPSBkYXRhLkdldE51bWVyaWNWYWx1ZSgpOwotICAgIExPR19JTkZPKCIlcyB2YWx1ZSA9IDB4JXgiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSwgbnVtZXJpY192YWx1ZSk7Ci0gICAgVWlNc2cgZGlzcGxheV93aXRoX3ZhbHVlOwotICAgICpkaXNwbGF5X3dpdGhfdmFsdWUubXV0YWJsZV9wZWVyKCkgPSBUb0ZhY2FkZUFkZHJlc3NXaXRoVHlwZShwZWVyKTsKLSAgICBkaXNwbGF5X3dpdGhfdmFsdWUuc2V0X21lc3NhZ2VfdHlwZShVaU1zZ1R5cGU6OkRJU1BMQVlfWUVTX05PX1dJVEhfVkFMVUUpOwotICAgIGRpc3BsYXlfd2l0aF92YWx1ZS5zZXRfbnVtZXJpY192YWx1ZShudW1lcmljX3ZhbHVlKTsKLSAgICBkaXNwbGF5X3dpdGhfdmFsdWUuc2V0X3VuaXF1ZV9pZCh1bmlxdWVfaWQrKyk7Ci0gICAgdWlfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoZGlzcGxheV93aXRoX3ZhbHVlKTsKLSAgfQotCi0gIHZvaWQgRGlzcGxheVllc05vRGlhbG9nKENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgb3ZlcnJpZGUgewotICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIHBlZXIgPSBkYXRhLkdldEFkZHJlc3NXaXRoVHlwZSgpOwotICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBkYXRhLkdldE5hbWUoKTsKLSAgICBMT0dfSU5GTygiJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgVWlNc2cgZGlzcGxheV95ZXNfbm87Ci0gICAgKmRpc3BsYXlfeWVzX25vLm11dGFibGVfcGVlcigpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUocGVlcik7Ci0gICAgZGlzcGxheV95ZXNfbm8uc2V0X21lc3NhZ2VfdHlwZShVaU1zZ1R5cGU6OkRJU1BMQVlfWUVTX05PKTsKLSAgICBkaXNwbGF5X3llc19uby5zZXRfdW5pcXVlX2lkKHVuaXF1ZV9pZCsrKTsKLSAgICB1aV9ldmVudHNfLk9uSW5jb21pbmdFdmVudChkaXNwbGF5X3llc19ubyk7Ci0gIH0KLQotICB2b2lkIERpc3BsYXlQYXNza2V5KENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgb3ZlcnJpZGUgewotICAgIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIHBlZXIgPSBkYXRhLkdldEFkZHJlc3NXaXRoVHlwZSgpOwotICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBkYXRhLkdldE5hbWUoKTsKLSAgICB1aW50MzJfdCBwYXNza2V5ID0gZGF0YS5HZXROdW1lcmljVmFsdWUoKTsKLSAgICBMT0dfSU5GTygiJXMgdmFsdWUgPSAweCV4IiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCksIHBhc3NrZXkpOwotICAgIFVpTXNnIGRpc3BsYXlfcGFzc2tleTsKLSAgICAqZGlzcGxheV9wYXNza2V5Lm11dGFibGVfcGVlcigpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUocGVlcik7Ci0gICAgZGlzcGxheV9wYXNza2V5LnNldF9tZXNzYWdlX3R5cGUoVWlNc2dUeXBlOjpESVNQTEFZX1BBU1NLRVkpOwotICAgIGRpc3BsYXlfcGFzc2tleS5zZXRfbnVtZXJpY192YWx1ZShwYXNza2V5KTsKLSAgICBkaXNwbGF5X3Bhc3NrZXkuc2V0X3VuaXF1ZV9pZCh1bmlxdWVfaWQrKyk7Ci0gICAgdWlfZXZlbnRzXy5PbkluY29taW5nRXZlbnQoZGlzcGxheV9wYXNza2V5KTsKLSAgfQotCi0gIHZvaWQgRGlzcGxheUVudGVyUGFzc2tleURpYWxvZyhDb25maXJtYXRpb25EYXRhIGRhdGEpIG92ZXJyaWRlIHsKLSAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBwZWVyID0gZGF0YS5HZXRBZGRyZXNzV2l0aFR5cGUoKTsKLSAgICBzdGQ6OnN0cmluZyBuYW1lID0gZGF0YS5HZXROYW1lKCk7Ci0gICAgTE9HX0lORk8oIiVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIFVpTXNnIGRpc3BsYXlfcGFzc2tleV9pbnB1dDsKLSAgICAqZGlzcGxheV9wYXNza2V5X2lucHV0Lm11dGFibGVfcGVlcigpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUocGVlcik7Ci0gICAgZGlzcGxheV9wYXNza2V5X2lucHV0LnNldF9tZXNzYWdlX3R5cGUoVWlNc2dUeXBlOjpESVNQTEFZX1BBU1NLRVlfRU5UUlkpOwotICAgIGRpc3BsYXlfcGFzc2tleV9pbnB1dC5zZXRfdW5pcXVlX2lkKHVuaXF1ZV9pZCsrKTsKLSAgICB1aV9ldmVudHNfLk9uSW5jb21pbmdFdmVudChkaXNwbGF5X3Bhc3NrZXlfaW5wdXQpOwotICB9Ci0KLSAgdm9pZCBEaXNwbGF5RW50ZXJQaW5EaWFsb2coQ29uZmlybWF0aW9uRGF0YSBkYXRhKSBvdmVycmlkZSB7Ci0gICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgcGVlciA9IGRhdGEuR2V0QWRkcmVzc1dpdGhUeXBlKCk7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZSA9IGRhdGEuR2V0TmFtZSgpOwotICAgIExPR19JTkZPKCIlcyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBVaU1zZyBkaXNwbGF5X3Bpbl9pbnB1dDsKLSAgICAqZGlzcGxheV9waW5faW5wdXQubXV0YWJsZV9wZWVyKCkgPSBUb0ZhY2FkZUFkZHJlc3NXaXRoVHlwZShwZWVyKTsKLSAgICBkaXNwbGF5X3Bpbl9pbnB1dC5zZXRfbWVzc2FnZV90eXBlKFVpTXNnVHlwZTo6RElTUExBWV9QSU5fRU5UUlkpOwotICAgIGRpc3BsYXlfcGluX2lucHV0LnNldF91bmlxdWVfaWQodW5pcXVlX2lkKyspOwotICAgIHVpX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KGRpc3BsYXlfcGluX2lucHV0KTsKLSAgfQotCi0gIHZvaWQgQ2FuY2VsKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIHBlZXIpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgVWlNc2cgZGlzcGxheV9jYW5jZWw7Ci0gICAgKmRpc3BsYXlfY2FuY2VsLm11dGFibGVfcGVlcigpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUocGVlcik7Ci0gICAgZGlzcGxheV9jYW5jZWwuc2V0X21lc3NhZ2VfdHlwZShVaU1zZ1R5cGU6OkRJU1BMQVlfQ0FOQ0VMKTsKLSAgICBkaXNwbGF5X2NhbmNlbC5zZXRfdW5pcXVlX2lkKHVuaXF1ZV9pZCsrKTsKLSAgICB1aV9ldmVudHNfLk9uSW5jb21pbmdFdmVudChkaXNwbGF5X2NhbmNlbCk7Ci0gIH0KLQotICB2b2lkIE9uRGV2aWNlQm9uZGVkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHBlZXIpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgQm9uZE1zZyBib25kZWQ7Ci0gICAgKmJvbmRlZC5tdXRhYmxlX3BlZXIoKSA9IFRvRmFjYWRlQWRkcmVzc1dpdGhUeXBlKHBlZXIpOwotICAgIGJvbmRlZC5zZXRfbWVzc2FnZV90eXBlKEJvbmRNc2dUeXBlOjpERVZJQ0VfQk9OREVEKTsKLSAgICBib25kX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KGJvbmRlZCk7Ci0gIH0KLQotICB2b2lkIE9uRW5jcnlwdGlvblN0YXRlQ2hhbmdlZChoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBPbkRldmljZVVuYm9uZGVkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHBlZXIpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgQm9uZE1zZyB1bmJvbmRlZDsKLSAgICAqdW5ib25kZWQubXV0YWJsZV9wZWVyKCkgPSBUb0ZhY2FkZUFkZHJlc3NXaXRoVHlwZShwZWVyKTsKLSAgICB1bmJvbmRlZC5zZXRfbWVzc2FnZV90eXBlKEJvbmRNc2dUeXBlOjpERVZJQ0VfVU5CT05ERUQpOwotICAgIGJvbmRfZXZlbnRzXy5PbkluY29taW5nRXZlbnQodW5ib25kZWQpOwotICB9Ci0KLSAgdm9pZCBPbkRldmljZUJvbmRGYWlsZWQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgcGVlciwgUGFpcmluZ0ZhaWx1cmUgc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIiVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIEJvbmRNc2cgYm9uZF9mYWlsZWQ7Ci0gICAgKmJvbmRfZmFpbGVkLm11dGFibGVfcGVlcigpID0gVG9GYWNhZGVBZGRyZXNzV2l0aFR5cGUocGVlcik7Ci0gICAgYm9uZF9mYWlsZWQuc2V0X21lc3NhZ2VfdHlwZShCb25kTXNnVHlwZTo6REVWSUNFX0JPTkRfRkFJTEVEKTsKLSAgICBib25kX2ZhaWxlZC5zZXRfcmVhc29uKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0YXR1cy5yZWFzb24pKTsKLSAgICBib25kX2V2ZW50c18uT25JbmNvbWluZ0V2ZW50KGJvbmRfZmFpbGVkKTsKLSAgfQotCi0gIHZvaWQgRW5mb3JjZVNlY3VyaXR5UG9saWN5RXZlbnQoYm9vbCByZXN1bHQpIHsKLSAgICBFbmZvcmNlU2VjdXJpdHlQb2xpY3lNc2cgbXNnOwotICAgIG1zZy5zZXRfcmVzdWx0KHJlc3VsdCk7Ci0gICAgZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfZXZlbnRzXy5PbkluY29taW5nRXZlbnQobXNnKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgU2VjdXJpdHlNb2R1bGUqIHNlY3VyaXR5X21vZHVsZV87Ci0gIEwyY2FwTGVNb2R1bGUqIGwyY2FwX2xlX21vZHVsZV87Ci0gIDo6Ymx1ZXRvb3RoOjpvczo6SGFuZGxlciogc2VjdXJpdHlfaGFuZGxlcl87Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxVaU1zZz4gdWlfZXZlbnRzX3siVUkgZXZlbnRzIn07Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxCb25kTXNnPiBib25kX2V2ZW50c197IkJvbmQgZXZlbnRzIn07Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRXZlbnRRdWV1ZTxTZWN1cml0eUhlbHBlck1zZz4gaGVscGVyX2V2ZW50c197IkV2ZW50cyB0aGF0IGRvbid0IGZpdCBhbnkgb3RoZXIgY2F0ZWdvcnkifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPEVuZm9yY2VTZWN1cml0eVBvbGljeU1zZz4gZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfZXZlbnRzX3sKLSAgICAgICJFbmZvcmNlIFNlY3VyaXR5IFBvbGljeSBFdmVudHMifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPERpc2Nvbm5lY3RNc2c+IGRpc2Nvbm5lY3RfZXZlbnRzX3siRGlzY29ubmVjdCBldmVudHMifTsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNFdmVudFF1ZXVlPE9vYkRhdGFCb25kTWVzc2FnZT4gb29iX2V2ZW50c197Ik9PQiBEYXRhIGV2ZW50cyJ9OwotICB1aW50MzJfdCB1bmlxdWVfaWR7MX07Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKGJvb2wpPj4gdXNlcl95ZXNfbm9fY2FsbGJhY2tzXzsKLSAgc3RkOjptYXA8dWludDMyX3QsIGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQodWludDMyX3QpPj4gdXNlcl9wYXNza2V5X2NhbGxiYWNrc187Ci19OwotCi12b2lkIFNlY3VyaXR5TW9kdWxlRmFjYWRlTW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMobGlzdCk7Ci0gIGxpc3QtPmFkZDxTZWN1cml0eU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPEwyY2FwTGVNb2R1bGU+KCk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNb2R1bGVGYWNhZGVNb2R1bGU6OlN0YXJ0KCkgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RhcnQoKTsKLSAgc2VydmljZV8gPQotICAgICAgbmV3IFNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PFNlY3VyaXR5TW9kdWxlPigpLCBHZXREZXBlbmRlbmN5PEwyY2FwTGVNb2R1bGU+KCksIEdldEhhbmRsZXIoKSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNb2R1bGVGYWNhZGVNb2R1bGU6OlN0b3AoKSB7Ci0gIGRlbGV0ZSBzZXJ2aWNlXzsKLSAgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGU6OlN0b3AoKTsKLX0KLQotOjpncnBjOjpTZXJ2aWNlKiBTZWN1cml0eU1vZHVsZUZhY2FkZU1vZHVsZTo6R2V0U2VydmljZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHNlcnZpY2VfOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFNlY3VyaXR5TW9kdWxlRmFjYWRlTW9kdWxlOjpGYWN0b3J5ID0KLSAgICA6OmJsdWV0b290aDo6TW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBTZWN1cml0eU1vZHVsZUZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9mYWNhZGUuaCBiL2dkL3NlY3VyaXR5L2ZhY2FkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdhZDQyLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2ZhY2FkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z3JwYysrL2dycGMrKy5oPgotCi0jaW5jbHVkZSAiZ3JwYy9ncnBjX21vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLWNsYXNzIFNlY3VyaXR5TW9kdWxlRmFjYWRlU2VydmljZTsKLQotY2xhc3MgU2VjdXJpdHlNb2R1bGVGYWNhZGVNb2R1bGUgOiBwdWJsaWMgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgU2VjdXJpdHlNb2R1bGVGYWNhZGVTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvZmFjYWRlLnByb3RvIGIvZ2Qvc2VjdXJpdHkvZmFjYWRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDhmZGI2Li4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2ZhY2FkZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGguc2VjdXJpdHk7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIjsKLWltcG9ydCAiZmFjYWRlL2NvbW1vbi5wcm90byI7Ci1pbXBvcnQgImwyY2FwL2NsYXNzaWMvZmFjYWRlLnByb3RvIjsKLWltcG9ydCAiaGNpL2ZhY2FkZS9sZV9pbml0aWF0b3JfYWRkcmVzc19mYWNhZGUucHJvdG8iOwotCi1zZXJ2aWNlIFNlY3VyaXR5TW9kdWxlRmFjYWRlIHsKLSAgcnBjIENyZWF0ZUJvbmQoZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgQ3JlYXRlQm9uZE91dE9mQmFuZChPb2JEYXRhQm9uZE1lc3NhZ2UpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEdldE91dE9mQmFuZERhdGEoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBGZXRjaEdldE91dE9mQmFuZERhdGFFdmVudHMoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gT29iRGF0YUJvbmRNZXNzYWdlKSB7fQotICBycGMgQ3JlYXRlQm9uZExlKGZhY2FkZS5CbHVldG9vdGhBZGRyZXNzV2l0aFR5cGUpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIENhbmNlbEJvbmQoZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgUmVtb3ZlQm9uZChmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZXRJb0NhcGFiaWxpdHkoSW9DYXBhYmlsaXR5TWVzc2FnZSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMoQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHNNZXNzYWdlKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZXRMZUlvQ2FwYWJpbGl0eShMZUlvQ2FwYWJpbGl0eU1lc3NhZ2UpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIFNldExlQXV0aFJlcXVpcmVtZW50cyhMZUF1dGhSZXF1aXJlbWVudHNNZXNzYWdlKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZXRMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZShMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZU1lc3NhZ2UpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEdldExlT3V0T2ZCYW5kRGF0YShnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKE9vYkRhdGFNZXNzYWdlKSB7fQotICBycGMgU2V0T3V0T2ZCYW5kRGF0YShPb2JEYXRhTWVzc2FnZSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2V0TGVPb2JEYXRhUHJlc2VudChMZU9vYkRhdGFQcmVzZW50TWVzc2FnZSkgcmV0dXJucyAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSB7fQotICBycGMgU2V0TGVJbml0aWF0b3JBZGRyZXNzUG9saWN5KGhjaS5Qcml2YWN5UG9saWN5KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBTZW5kVWlDYWxsYmFjayhVaUNhbGxiYWNrTXNnKSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpIHt9Ci0gIHJwYyBGZXRjaFVpRXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIFVpTXNnKSB7fQotICBycGMgRmV0Y2hCb25kRXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIEJvbmRNc2cpIHt9Ci0gIHJwYyBGZXRjaEhlbHBlckV2ZW50cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBTZWN1cml0eUhlbHBlck1zZykge30KLSAgcnBjIEVuZm9yY2VTZWN1cml0eVBvbGljeShTZWN1cml0eVBvbGljeU1lc3NhZ2UpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkge30KLSAgcnBjIEZldGNoRW5mb3JjZVNlY3VyaXR5UG9saWN5RXZlbnRzKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSkgcmV0dXJucyAoc3RyZWFtIEVuZm9yY2VTZWN1cml0eVBvbGljeU1zZykge30KLSAgcnBjIEZldGNoRGlzY29ubmVjdEV2ZW50cyhnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKHN0cmVhbSBEaXNjb25uZWN0TXNnKSB7fQotfQotCi1tZXNzYWdlIE9vYkRhdGFNZXNzYWdlIHsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzID0gMTsKLSAgYnl0ZXMgY29uZmlybWF0aW9uX3ZhbHVlID0gMjsKLSAgYnl0ZXMgcmFuZG9tX3ZhbHVlID0gMzsKLX0KLQotbWVzc2FnZSBPb2JEYXRhQm9uZE1lc3NhZ2UgewotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MgPSAxOwotICBPb2JEYXRhTWVzc2FnZSBwMTkyX2RhdGEgPSAyOwotICBPb2JEYXRhTWVzc2FnZSBwMjU2X2RhdGEgPSAzOwotfQotCi1lbnVtIFVpTXNnVHlwZSB7Ci0gIERJU1BMQVlfWUVTX05PX1dJVEhfVkFMVUUgPSAwOwotICBESVNQTEFZX1lFU19OTyA9IDE7Ci0gIERJU1BMQVlfUEFTU0tFWSA9IDI7Ci0gIERJU1BMQVlfUEFTU0tFWV9FTlRSWSA9IDM7Ci0gIERJU1BMQVlfQ0FOQ0VMID0gNDsKLSAgRElTUExBWV9QQUlSSU5HX1BST01QVCA9IDU7Ci0gIERJU1BMQVlfUElOX0VOVFJZID0gNjsKLX0KLQotbWVzc2FnZSBVaU1zZyB7Ci0gIFVpTXNnVHlwZSBtZXNzYWdlX3R5cGUgPSAxOwotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIHBlZXIgPSAyOwotICB1aW50MzIgbnVtZXJpY192YWx1ZSA9IDM7Ci0gIHVpbnQzMiB1bmlxdWVfaWQgPSA0OwotfQotCi1lbnVtIFVpQ2FsbGJhY2tUeXBlIHsKLSAgWUVTX05PID0gMDsKLSAgUEFTU0tFWSA9IDE7Ci0gIFBBSVJJTkdfUFJPTVBUID0gMjsKLSAgUElOID0gMzsKLX0KLQotbWVzc2FnZSBVaUNhbGxiYWNrTXNnIHsKLSAgVWlDYWxsYmFja1R5cGUgbWVzc2FnZV90eXBlID0gMTsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzID0gMjsKLSAgYm9vbCBib29sZWFuID0gMzsKLSAgdWludDMyIG51bWVyaWNfdmFsdWUgPSA0OwotICB1aW50MzIgdW5pcXVlX2lkID0gNTsKLSAgYnl0ZXMgcGluID0gNjsKLX0KLQotZW51bSBCb25kTXNnVHlwZSB7Ci0gIERFVklDRV9CT05ERUQgPSAwOwotICBERVZJQ0VfVU5CT05ERUQgPSAxOwotICBERVZJQ0VfQk9ORF9GQUlMRUQgPSAyOwotfQotCi1tZXNzYWdlIEJvbmRNc2cgewotICBCb25kTXNnVHlwZSBtZXNzYWdlX3R5cGUgPSAxOwotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIHBlZXIgPSAyOwotICB1aW50MzIgcmVhc29uID0gMzsKLX0KLQotZW51bSBIZWxwZXJNc2dUeXBlIHsgREVWSUNFX0RJU0NPTk5FQ1RFRCA9IDA7IH0KLQotbWVzc2FnZSBTZWN1cml0eUhlbHBlck1zZyB7Ci0gIEhlbHBlck1zZ1R5cGUgbWVzc2FnZV90eXBlID0gMTsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSBwZWVyID0gMjsKLX0KLQotZW51bSBJb0NhcGFiaWxpdGllcyB7Ci0gIERJU1BMQVlfT05MWSA9IDA7Ci0gIERJU1BMQVlfWUVTX05PX0lPX0NBUCA9IDE7Ci0gIEtFWUJPQVJEX09OTFkgPSAyOwotICBOT19JTlBVVF9OT19PVVRQVVQgPSAzOwotfQotCi1tZXNzYWdlIElvQ2FwYWJpbGl0eU1lc3NhZ2UgewotICBJb0NhcGFiaWxpdGllcyBjYXBhYmlsaXR5ID0gMTsKLX0KLQotbWVzc2FnZSBMZUlvQ2FwYWJpbGl0eU1lc3NhZ2UgewotICBlbnVtIExlSW9DYXBhYmlsaXRpZXMgewotICAgIERJU1BMQVlfT05MWSA9IDA7Ci0gICAgRElTUExBWV9ZRVNfTk9fSU9fQ0FQID0gMTsKLSAgICBLRVlCT0FSRF9PTkxZID0gMjsKLSAgICBOT19JTlBVVF9OT19PVVRQVVQgPSAzOwotICAgIEtFWUJPQVJEX0RJU1BMQVkgPSA0OwotICB9Ci0gIExlSW9DYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gMTsKLX0KLQotZW51bSBBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyB7Ci0gIE5PX0JPTkRJTkcgPSAwOwotICBOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTiA9IDE7Ci0gIERFRElDQVRFRF9CT05ESU5HID0gMjsKLSAgREVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OID0gMzsKLSAgR0VORVJBTF9CT05ESU5HID0gNDsKLSAgR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTiA9IDU7Ci19Ci0KLW1lc3NhZ2UgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHNNZXNzYWdlIHsKLSAgQXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgcmVxdWlyZW1lbnQgPSAxOwotfQotCi1tZXNzYWdlIExlQXV0aFJlcXVpcmVtZW50c01lc3NhZ2UgewotICBib29sIGJvbmQgPSAxOwotICBib29sIG1pdG0gPSAyOwotICBib29sIHNlY3VyZV9jb25uZWN0aW9ucyA9IDM7Ci0gIGJvb2wga2V5cHJlc3MgPSA0OwotICBib29sIGN0MiA9IDU7Ci0gIHVpbnQzMiByZXNlcnZlZF9iaXRzID0gNjsKLX0KLQotbWVzc2FnZSBMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZU1lc3NhZ2UgewotICB1aW50MzIgbWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplID0gMTsKLX0KLQotbWVzc2FnZSBMZU9vYkRhdGFQcmVzZW50TWVzc2FnZSB7Ci0gIGVudW0gTGVPb2JEYXRhRmxhZyB7Ci0gICAgTk9UX1BSRVNFTlQgPSAwOwotICAgIFBSRVNFTlQgPSAxOwotICB9Ci0KLSAgTGVPb2JEYXRhRmxhZyBkYXRhX3ByZXNlbnQgPSAxOwotfQotCi1lbnVtIE9vYkRhdGFQcmVzZW50IHsKLSAgTk9UX1BSRVNFTlQgPSAwOwotICBQMTkyX1BSRVNFTlQgPSAxOwotICBQMjU2X1BSRVNFTlQgPSAyOwotICBQMTkyX0FORF8yNTZfUFJFU0VOVCA9IDM7Ci19Ci0KLW1lc3NhZ2UgT29iRGF0YVByZXNlbnRNZXNzYWdlIHsKLSAgT29iRGF0YVByZXNlbnQgZGF0YV9wcmVzZW50ID0gMTsKLX0KLQotbWVzc2FnZSBTZWN1cml0eVBvbGljeU1lc3NhZ2UgewotICBmYWNhZGUuQmx1ZXRvb3RoQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MgPSAxOwotICBsMmNhcC5jbGFzc2ljLkNsYXNzaWNTZWN1cml0eVBvbGljeSBwb2xpY3kgPSAyOwotfQotCi1tZXNzYWdlIEVuZm9yY2VTZWN1cml0eVBvbGljeU1zZyB7Ci0gIGJvb2wgcmVzdWx0ID0gMTsKLX0KLQotbWVzc2FnZSBEaXNjb25uZWN0TXNnIHsKLSAgZmFjYWRlLkJsdWV0b290aEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzID0gMTsKLX0KZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2ZhY2FkZV9jb25maWd1cmF0aW9uX2FwaS5jYyBiL2dkL3NlY3VyaXR5L2ZhY2FkZV9jb25maWd1cmF0aW9uX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZjU2Ny4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9mYWNhZGVfY29uZmlndXJhdGlvbl9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jaW5jbHVkZSAiZmFjYWRlX2NvbmZpZ3VyYXRpb25fYXBpLmgiCi0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotdm9pZCBGYWNhZGVDb25maWd1cmF0aW9uQXBpOjpTZXREaXNjb25uZWN0Q2FsbGJhY2soaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OkZhY2FkZURpc2Nvbm5lY3RDYWxsYmFjayBjYWxsYmFjaykgewotICBzZWN1cml0eV9oYW5kbGVyXy0+Q2FsbE9uKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8sICZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6U2V0RGlzY29ubmVjdENhbGxiYWNrLCBjYWxsYmFjayk7Ci19Ci0KLXZvaWQgRmFjYWRlQ29uZmlndXJhdGlvbkFwaTo6U2V0SW9DYXBhYmlsaXR5KGhjaTo6SW9DYXBhYmlsaXR5IGlvX2NhcGFiaWxpdHkpIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPkNhbGxPbihzZWN1cml0eV9tYW5hZ2VyX2ltcGxfLCAmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OlNldElvQ2FwYWJpbGl0eSwgaW9fY2FwYWJpbGl0eSk7Ci19Ci0KLXZvaWQgRmFjYWRlQ29uZmlndXJhdGlvbkFwaTo6U2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMoaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudCkgewotICBzZWN1cml0eV9oYW5kbGVyXy0+Q2FsbE9uKAotICAgICAgc2VjdXJpdHlfbWFuYWdlcl9pbXBsXywKLSAgICAgICZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6U2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMsCi0gICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudCk7Ci19Ci0KLXZvaWQgRmFjYWRlQ29uZmlndXJhdGlvbkFwaTo6U2V0TGVJb0NhcGFiaWxpdHkoc2VjdXJpdHk6OklvQ2FwYWJpbGl0eSBpb19jYXBhYmlsaXR5KSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5DYWxsT24oc2VjdXJpdHlfbWFuYWdlcl9pbXBsXywgJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpTZXRMZUlvQ2FwYWJpbGl0eSwgaW9fY2FwYWJpbGl0eSk7Ci19Ci0KLXZvaWQgRmFjYWRlQ29uZmlndXJhdGlvbkFwaTo6U2V0TGVBdXRoUmVxdWlyZW1lbnRzKHVpbnQ4X3QgYXV0aF9yZXEpIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPkNhbGxPbihzZWN1cml0eV9tYW5hZ2VyX2ltcGxfLCAmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OlNldExlQXV0aFJlcXVpcmVtZW50cywgYXV0aF9yZXEpOwotfQotCi12b2lkIEZhY2FkZUNvbmZpZ3VyYXRpb25BcGk6OlNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKHVpbnQ4X3QgbWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICBzZWN1cml0eV9tYW5hZ2VyX2ltcGxfLAotICAgICAgJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpTZXRMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSwKLSAgICAgIG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSk7Ci19Ci0KLXZvaWQgRmFjYWRlQ29uZmlndXJhdGlvbkFwaTo6U2V0TGVPb2JEYXRhUHJlc2VudChPb2JEYXRhRmxhZyBvb2JfcHJlc2VudCkgewotICBzZWN1cml0eV9oYW5kbGVyXy0+Q2FsbE9uKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8sICZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6U2V0TGVPb2JEYXRhUHJlc2VudCwgb29iX3ByZXNlbnQpOwotfQotCi12b2lkIEZhY2FkZUNvbmZpZ3VyYXRpb25BcGk6OkdldExlT3V0T2ZCYW5kRGF0YSgKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiogY29uZmlybWF0aW9uX3ZhbHVlLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiogcmFuZG9tX3ZhbHVlKSB7Ci0gIHNlY3VyaXR5X21hbmFnZXJfaW1wbF8tPkdldExlT3V0T2ZCYW5kRGF0YShjb25maXJtYXRpb25fdmFsdWUsIHJhbmRvbV92YWx1ZSk7Ci19Ci0KLXZvaWQgRmFjYWRlQ29uZmlndXJhdGlvbkFwaTo6U2V0T3V0T2ZCYW5kRGF0YSgKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcywKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBjb25maXJtYXRpb25fdmFsdWUsCi0gICAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gcmFuZG9tX3ZhbHVlKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5DYWxsT24oCi0gICAgICBzZWN1cml0eV9tYW5hZ2VyX2ltcGxfLAotICAgICAgJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpTZXRPdXRPZkJhbmREYXRhLAotICAgICAgcmVtb3RlX2FkZHJlc3MsCi0gICAgICBjb25maXJtYXRpb25fdmFsdWUsCi0gICAgICByYW5kb21fdmFsdWUpOwotfQotCi12b2lkIEZhY2FkZUNvbmZpZ3VyYXRpb25BcGk6OkVuZm9yY2VTZWN1cml0eVBvbGljeSgKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsCi0gICAgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5IHBvbGljeSwKLSAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPkNhbGxPbigKLSAgICAgIHNlY3VyaXR5X21hbmFnZXJfaW1wbF8sCi0gICAgICAmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OkVuZm9yY2VTZWN1cml0eVBvbGljeSwKLSAgICAgIHJlbW90ZSwKLSAgICAgIHBvbGljeSwKLSAgICAgIHN0ZDo6bW92ZShjYWxsYmFjaykpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2ZhY2FkZV9jb25maWd1cmF0aW9uX2FwaS5oIGIvZ2Qvc2VjdXJpdHkvZmFjYWRlX2NvbmZpZ3VyYXRpb25fYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmFiNzkuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvZmFjYWRlX2NvbmZpZ3VyYXRpb25fYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2ludGVybmFsL3NlY3VyaXR5X21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3NtcF9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzLCBwYWlyaW5nLCBib25kaW5nIG9mIGRldmljZXMsIGFuZCB0aGUKLSAqIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBvZiBjb21tdW5pY2F0aW9ucy4KLSAqLwotY2xhc3MgRmFjYWRlQ29uZmlndXJhdGlvbkFwaSB7Ci0gcHVibGljOgotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw7Ci0gIGZyaWVuZCBjbGFzcyBTZWN1cml0eU1vZHVsZTsKLQotICB2b2lkIFNldERpc2Nvbm5lY3RDYWxsYmFjayhpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6RmFjYWRlRGlzY29ubmVjdENhbGxiYWNrIGNhbGxiYWNrKTsKLSAgdm9pZCBTZXRJb0NhcGFiaWxpdHkoaGNpOjpJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eSk7Ci0gIHZvaWQgU2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMoaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudCk7Ci0gIHZvaWQgRW5mb3JjZVNlY3VyaXR5UG9saWN5KAotICAgICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLAotICAgICAgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5IHBvbGljeSwKLSAgICAgIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlOjpSZXN1bHRDYWxsYmFjayBjYWxsYmFjayk7Ci0KLSAgdm9pZCBTZXRMZUlvQ2FwYWJpbGl0eShzZWN1cml0eTo6SW9DYXBhYmlsaXR5IGlvX2NhcGFiaWxpdHkpOwotICB2b2lkIFNldExlQXV0aFJlcXVpcmVtZW50cyh1aW50OF90IGF1dGhfcmVxKTsKLSAgdm9pZCBTZXRMZU1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSh1aW50OF90IG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSk7Ci0gIHZvaWQgU2V0TGVPb2JEYXRhUHJlc2VudChPb2JEYXRhRmxhZyBvb2JfcHJlc2VudCk7Ci0gIHZvaWQgR2V0TGVPdXRPZkJhbmREYXRhKHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiBjb25maXJtYXRpb25fdmFsdWUsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiByYW5kb21fdmFsdWUpOwotICB2b2lkIFNldE91dE9mQmFuZERhdGEoCi0gICAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcywKLSAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGNvbmZpcm1hdGlvbl92YWx1ZSwKLSAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IHJhbmRvbV92YWx1ZSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkob3M6OkhhbmRsZXIqIHNlY3VyaXR5X2hhbmRsZXIsIGludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsKiBzZWN1cml0eV9tYW5hZ2VyX2ltcGwpCi0gICAgICA6IHNlY3VyaXR5X2hhbmRsZXJfKHNlY3VyaXR5X2hhbmRsZXIpLCBzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKHNlY3VyaXR5X21hbmFnZXJfaW1wbCkge30KLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIGludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsKiBzZWN1cml0eV9tYW5hZ2VyX2ltcGxfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRmFjYWRlQ29uZmlndXJhdGlvbkFwaSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2luaXRpYWxfaW5mb3JtYXRpb25zLmggYi9nZC9zZWN1cml0eS9pbml0aWFsX2luZm9ybWF0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTk4MmJkLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2luaXRpYWxfaW5mb3JtYXRpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDx2YXJpYW50PgotCi0jaW5jbHVkZSAiY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9sZV9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2VfcGFja2V0X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvcGFja2V0X3ZpZXcuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9lY2RoX2tleXMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9wYWlyaW5nX2ZhaWx1cmUuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9zbXBfcGFja2V0cy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3VpLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotc3RydWN0IERpc3RyaWJ1dGVkS2V5cyB7Ci0gIC8qIExFIEtleXMqLwotICBzdGQ6Om9wdGlvbmFsPGNyeXB0b190b29sYm94OjpPY3RldDE2PiByZW1vdGVfbHRrOwotICBzdGQ6Om9wdGlvbmFsPHVpbnQxNl90PiByZW1vdGVfZWRpdjsKLSAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHVpbnQ4X3QsIDg+PiByZW1vdGVfcmFuZDsKLSAgc3RkOjpvcHRpb25hbDxoY2k6OkFkZHJlc3NXaXRoVHlwZT4gcmVtb3RlX2lkZW50aXR5X2FkZHJlc3M7Ci0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IHJlbW90ZV9pcms7Ci0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IHJlbW90ZV9zaWduYXR1cmVfa2V5OwotICBzdGQ6Om9wdGlvbmFsPGNyeXB0b190b29sYm94OjpPY3RldDE2PiByZW1vdGVfbGlua19rZXk7IC8qIEJSL0VEUiBLZXlzICovCi0KLSAgc3RkOjpvcHRpb25hbDxjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNj4gbG9jYWxfbHRrOwotICBzdGQ6Om9wdGlvbmFsPHVpbnQxNl90PiBsb2NhbF9lZGl2OwotICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8dWludDhfdCwgOD4+IGxvY2FsX3JhbmQ7Ci0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IGxvY2FsX3NpZ25hdHVyZV9rZXk7Ci19OwotCi0vKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBwYWlyaW5nLCBhcyByZXR1cm5lZCBmcm9tIFBhaXJpbmcgSGFuZGxlciAqLwotc3RydWN0IFBhaXJpbmdSZXN1bHQgewotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBjb25uZWN0aW9uX2FkZHJlc3M7Ci0gIERpc3RyaWJ1dGVkS2V5cyBkaXN0cmlidXRlZF9rZXlzOwotICB1aW50OF90IGtleV9zaXplOwotICB1aW50OF90IHNlY3VyaXR5X2xldmVsOwotfTsKLQotdXNpbmcgUGFpcmluZ1Jlc3VsdE9yRmFpbHVyZSA9IHN0ZDo6dmFyaWFudDxQYWlyaW5nUmVzdWx0LCBQYWlyaW5nRmFpbHVyZT47Ci0KLS8qIERhdGEgd2UgdXNlIGZvciBPdXQgT2YgQmFuZCBQYWlyaW5nICovCi1zdHJ1Y3QgTXlPb2JEYXRhIHsKLSAgLyogIHByaXZhdGUga2V5IGlzIGp1c3QgZm9yIHRoaXMgc2luZ2xlIHBhaXJpbmcgb25seSwgc28gaXQgbWlnaHQgYmUgc2FmZSB0bwotICAgKiBleHBvc2UgaXQgdG8gb3RoZXIgcGFydHMgb2Ygc3RhY2suIEl0IHNob3VsZCBub3QgYmUgZXhwb3NlZCB0byB1cHBlcgotICAgKiBsYXllcnMgdGhvdWdoICovCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IHByaXZhdGVfa2V5OwotICBFY2RoUHVibGljS2V5IHB1YmxpY19rZXk7Ci0gIGNyeXB0b190b29sYm94OjpPY3RldDE2IGM7Ci0gIGNyeXB0b190b29sYm94OjpPY3RldDE2IHI7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgYW5kIHNlbmQgdG8gUGFpcmluZ0hhbmRsZXJMZSB0byBpbml0aWF0ZSB0aGUgUGFpcmluZyBwcm9jZXNzIHdpdGggcmVtb3RlIGRldmljZSAqLwotc3RydWN0IEluaXRpYWxJbmZvcm1hdGlvbnMgewotICBoY2k6OlJvbGUgbXlfcm9sZTsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgbXlfY29ubmVjdGlvbl9hZGRyZXNzOwotCi0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIG15X2lkZW50aXR5X2FkZHJlc3M7Ci0gIGNyeXB0b190b29sYm94OjpPY3RldDE2IG15X2lkZW50aXR5X3Jlc29sdmluZ19rZXk7Ci0KLSAgLyogTXkgY2FwYWJpbGl0aWVzLCBhcyBpbiBwYWlyaW5nIHJlcXVlc3QvcmVzcG9uc2UgKi8KLSAgc3RydWN0IHsKLSAgICBJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eTsKLSAgICBPb2JEYXRhRmxhZyBvb2JfZGF0YV9mbGFnOwotICAgIHVpbnQ4X3QgYXV0aF9yZXE7Ci0gICAgdWludDhfdCBtYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemU7Ci0gICAgdWludDhfdCBpbml0aWF0b3Jfa2V5X2Rpc3RyaWJ1dGlvbjsKLSAgICB1aW50OF90IHJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uOwotICB9IG15UGFpcmluZ0NhcGFiaWxpdGllczsKLQotICAvKiB3YXMgaXQgcmVtb3RlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgUGFpcmluZyA/ICovCi0gIGJvb2wgcmVtb3RlbHlfaW5pdGlhdGVkOwotICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZTsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzczsKLSAgc3RkOjpzdHJpbmcgcmVtb3RlX25hbWU7Ci0KLSAgLyogY29udGFpbnMgcGFpcmluZyByZXF1ZXN0LCBpZiB0aGUgcGFpcmluZyB3YXMgcmVtb3RlbHkgaW5pdGlhdGVkICovCi0gIHN0ZDo6b3B0aW9uYWw8UGFpcmluZ1JlcXVlc3RWaWV3PiBwYWlyaW5nX3JlcXVlc3Q7Ci0KLSAgc3RydWN0IG91dF9vZl9iYW5kX2RhdGEgewotICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IGxlX3NjX2M7IC8qIExFIFNlY3VyZSBDb25uZWN0aW9ucyBDb25maXJtYXRpb24gVmFsdWUgKi8KLSAgICBjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNiBsZV9zY19yOyAvKiBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgUmFuZG9tIFZhbHVlICovCi0KLSAgICBjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNiBzZWN1cml0eV9tYW5hZ2VyX3RrX3ZhbHVlOyAvKiBPT0IgZGF0YSBmb3IgTEUgTGVnYWN5IFBhaXJpbmcgKi8KLSAgfTsKLQotICAvLyBJZiB3ZSByZWNlaXZlZCBPT0IgZGF0YSBmcm9tIHJlbW90ZSBkZXZpY2UsIHRoaXMgZmllbGQgY29udGFpbnMgaXQuCi0gIHN0ZDo6b3B0aW9uYWw8b3V0X29mX2JhbmRfZGF0YT4gcmVtb3RlX29vYl9kYXRhOwotICBzdGQ6Om9wdGlvbmFsPE15T29iRGF0YT4gbXlfb29iX2RhdGE7Ci0KLSAgLyogVXNlZCBieSBQYWlyaW5nIEhhbmRsZXIgdG8gcHJlc2VudCB1c2VyIHdpdGggcmVxdWVzdHMqLwotICBVSSogdXNlcl9pbnRlcmZhY2U7Ci0gIG9zOjpIYW5kbGVyKiB1c2VyX2ludGVyZmFjZV9oYW5kbGVyOwotCi0gIC8qIEhDSSBpbnRlcmZhY2UgdG8gdXNlICovCi0gIGhjaTo6TGVTZWN1cml0eUludGVyZmFjZSogbGVfc2VjdXJpdHlfaW50ZXJmYWNlOwotCi0gIG9zOjpFbnF1ZXVlQnVmZmVyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+KiBwcm9wZXJfbDJjYXBfaW50ZXJmYWNlOwotICBvczo6SGFuZGxlciogbDJjYXBfaGFuZGxlcjsKLQotICAvKiBDYWxsYmFjayB0byBleGVjdXRlIG9uY2UgdGhlIFBhaXJpbmcgcHJvY2VzcyBpcyBmaW5pc2hlZCAqLwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoUGFpcmluZ1Jlc3VsdE9yRmFpbHVyZSk+IE9uUGFpcmluZ0ZpbmlzaGVkOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9pbnRlcm5hbC9zZWN1cml0eV9tYW5hZ2VyX2ltcGwuY2MgYi9nZC9zZWN1cml0eS9pbnRlcm5hbC9zZWN1cml0eV9tYW5hZ2VyX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDJlMjIuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvaW50ZXJuYWwvc2VjdXJpdHlfbWFuYWdlcl9pbXBsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODg4ICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSNpbmNsdWRlICJzZWN1cml0eV9tYW5hZ2VyX2ltcGwuaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3JhbmQuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9pbml0aWFsX2luZm9ybWF0aW9ucy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2ludGVybmFsL3NlY3VyaXR5X21hbmFnZXJfaW1wbC5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmdfaGFuZGxlcl9sZS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS91aS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OkRpc3BhdGNoUGFpcmluZ0hhbmRsZXIoCi0gICAgc3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+IHJlY29yZCwKLSAgICBib29sIGxvY2FsbHlfaW5pdGlhdGVkLAotICAgIGhjaTo6SW9DYXBhYmlsaXR5IGlvX2NhcGFiaWxpdHksCi0gICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoX3JlcXVpcmVtZW50cywKLSAgICBwYWlyaW5nOjpPb2JEYXRhIHJlbW90ZV9wMTkyX29vYl9kYXRhLAotICAgIHBhaXJpbmc6Ok9vYkRhdGEgcmVtb3RlX3AyNTZfb29iX2RhdGEpIHsKLSAgY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkFkZHJlc3MsIFBhaXJpbmdSZXN1bHRPckZhaWx1cmUpPiBjYWxsYmFjayA9Ci0gICAgICBjb21tb246OkJpbmRPbmNlKCZTZWN1cml0eU1hbmFnZXJJbXBsOjpPblBhaXJpbmdIYW5kbGVyQ29tcGxldGUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSk7Ci0gIGF1dG8gZW50cnkgPSBwYWlyaW5nX2hhbmRsZXJfbWFwXy5maW5kKHJlY29yZC0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpOwotICBpZiAoZW50cnkgIT0gcGFpcmluZ19oYW5kbGVyX21hcF8uZW5kKCkpIHsKLSAgICBMT0dfV0FSTigiRGV2aWNlIGFscmVhZHkgaGFzIGEgcGFpcmluZyBoYW5kbGVyLCBhbmQgaXMgaW4gdGhlIG1pZGRsZSBvZiBwYWlyaW5nISIpOwotICAgIHJldHVybjsKLSAgfQotICBzdGQ6OnNoYXJlZF9wdHI8cGFpcmluZzo6UGFpcmluZ0hhbmRsZXI+IHBhaXJpbmdfaGFuZGxlciA9IG51bGxwdHI7Ci0gIHN3aXRjaCAocmVjb3JkLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3NUeXBlKCkpIHsKLSAgICBjYXNlIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzogewotICAgICAgcGFpcmluZ19oYW5kbGVyID0gc3RkOjptYWtlX3NoYXJlZDxzZWN1cml0eTo6cGFpcmluZzo6Q2xhc3NpY1BhaXJpbmdIYW5kbGVyPigKLSAgICAgICAgICBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfLAotICAgICAgICAgIHJlY29yZCwKLSAgICAgICAgICBzZWN1cml0eV9oYW5kbGVyXywKLSAgICAgICAgICBzdGQ6Om1vdmUoY2FsbGJhY2spLAotICAgICAgICAgIHVzZXJfaW50ZXJmYWNlXywKLSAgICAgICAgICB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXywKLSAgICAgICAgICByZWNvcmQtPkdldFBzZXVkb0FkZHJlc3MoKS0+VG9TdHJpbmcoKSwKLSAgICAgICAgICBuYW1lX2RiX21vZHVsZV8pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlRfTE9HKGZhbHNlLCAiUGFpcmluZyB0eXBlICVoaHUgbm90IGltcGxlbWVudGVkISIsIHJlY29yZC0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzVHlwZSgpKTsKLSAgfQotICBhdXRvIG5ld19lbnRyeSA9IHN0ZDo6cGFpcjxoY2k6OkFkZHJlc3MsIHN0ZDo6c2hhcmVkX3B0cjxwYWlyaW5nOjpQYWlyaW5nSGFuZGxlcj4+KAotICAgICAgcmVjb3JkLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSwgcGFpcmluZ19oYW5kbGVyKTsKLSAgcGFpcmluZ19oYW5kbGVyX21hcF8uaW5zZXJ0KHN0ZDo6bW92ZShuZXdfZW50cnkpKTsKLSAgcGFpcmluZ19oYW5kbGVyLT5Jbml0aWF0ZSgKLSAgICAgIGxvY2FsbHlfaW5pdGlhdGVkLCBpb19jYXBhYmlsaXR5LCBhdXRoX3JlcXVpcmVtZW50cywgcmVtb3RlX3AxOTJfb29iX2RhdGEsIHJlbW90ZV9wMjU2X29vYl9kYXRhKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpJbml0KCkgewotICBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfLT5TZXRDaGFubmVsTGlzdGVuZXIodGhpcyk7Ci0gIHNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbF8tPlNlbmRDb21tYW5kKGhjaTo6V3JpdGVTaW1wbGVQYWlyaW5nTW9kZUJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVuYWJsZTo6RU5BQkxFRCkpOwotICBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfLT5TZW5kQ29tbWFuZChoY2k6OldyaXRlU2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydEJ1aWxkZXI6OkNyZWF0ZShoY2k6OkVuYWJsZTo6RU5BQkxFRCkpOwotCi0gIEFTU0VSVF9MT0coc3RvcmFnZV9tb2R1bGVfICE9IG51bGxwdHIsICJTdG9yYWdlIG1vZHVsZSBtdXN0IG5vdCBiZSBudWxsISIpOwotICBzZWN1cml0eV9kYXRhYmFzZV8uTG9hZFJlY29yZHNGcm9tU3RvcmFnZSgpOwotCi0gIHN0b3JhZ2U6OkFkYXB0ZXJDb25maWcgYWRhcHRlcl9jb25maWcgPSBzdG9yYWdlX21vZHVsZV8tPkdldEFkYXB0ZXJDb25maWcoKTsKLSAgaWYgKCFhZGFwdGVyX2NvbmZpZy5HZXRMZUlkZW50aXR5UmVzb2x2aW5nS2V5KCkpIHsKLSAgICBhdXRvIG11dGF0aW9uID0gc3RvcmFnZV9tb2R1bGVfLT5Nb2RpZnkoKTsKLSAgICBtdXRhdGlvbi5BZGQoYWRhcHRlcl9jb25maWcuU2V0TGVJZGVudGl0eVJlc29sdmluZ0tleShibHVldG9vdGg6Om9zOjpHZW5lcmF0ZVJhbmRvbTwxNj4oKSkpOwotICAgIG11dGF0aW9uLkNvbW1pdCgpOwotICB9Ci0KLSAgQWRkcmVzcyBjb250cm9sbGVyQWRkcmVzcyA9IGNvbnRyb2xsZXJfLT5HZXRNYWNBZGRyZXNzKCk7Ci0gIGlmICghYWRhcHRlcl9jb25maWcuR2V0QWRkcmVzcygpIHx8IGFkYXB0ZXJfY29uZmlnLkdldEFkZHJlc3MoKS52YWx1ZSgpICE9IGNvbnRyb2xsZXJBZGRyZXNzKSB7Ci0gICAgYXV0byBtdXRhdGlvbiA9IHN0b3JhZ2VfbW9kdWxlXy0+TW9kaWZ5KCk7Ci0gICAgbXV0YXRpb24uQWRkKGFkYXB0ZXJfY29uZmlnLlNldEFkZHJlc3MoY29udHJvbGxlckFkZHJlc3MpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotCi0gIGxvY2FsX2lkZW50aXR5X2FkZHJlc3NfID0KLSAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlKGFkYXB0ZXJfY29uZmlnLkdldEFkZHJlc3MoKS52YWx1ZSgpLCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpOwotICBsb2NhbF9pZGVudGl0eV9yZXNvbHZpbmdfa2V5XyA9IGFkYXB0ZXJfY29uZmlnLkdldExlSWRlbnRpdHlSZXNvbHZpbmdLZXkoKS52YWx1ZSgpLmJ5dGVzOwotCi0gIGhjaTo6TGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeSBhZGRyZXNzX3BvbGljeSA9IGhjaTo6TGVBZGRyZXNzTWFuYWdlcjo6QWRkcmVzc1BvbGljeTo6VVNFX1JFU09MVkFCTEVfQUREUkVTUzsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUoaGNpOjpBZGRyZXNze30sIGhjaTo6QWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUyk7Ci0KLSAgLyogNyBtaW51dGVzIG1pbmltdW0sIDE1IG1pbnV0ZXMgbWF4aW11bSBmb3IgcmFuZG9tIGFkZHJlc3MgcmVmcmVzaGluZyAqLwotICBhdXRvIG1pbmltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaW51dGVzKDcpOwotICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaW51dGVzKDE1KTsKLQotICBhY2xfbWFuYWdlcl8tPlNldFByaXZhY3lQb2xpY3lGb3JJbml0aWF0b3JBZGRyZXNzKAotICAgICAgYWRkcmVzc19wb2xpY3ksIGFkZHJlc3Nfd2l0aF90eXBlLCBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsIG1heGltdW1fcm90YXRpb25fdGltZSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6Q3JlYXRlQm9uZChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpIHsKLSAgdGhpcy0+Q3JlYXRlQm9uZE91dE9mQmFuZChkZXZpY2UsIHBhaXJpbmc6Ok9vYkRhdGEoKSwgcGFpcmluZzo6T29iRGF0YSgpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpDcmVhdGVCb25kT3V0T2ZCYW5kKAotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgcGFpcmluZzo6T29iRGF0YSByZW1vdGVfcDE5Ml9vb2JfZGF0YSwgcGFpcmluZzo6T29iRGF0YSByZW1vdGVfcDI1Nl9vb2JfZGF0YSkgewotICBhdXRvIHJlY29yZCA9IHNlY3VyaXR5X2RhdGFiYXNlXy5GaW5kT3JDcmVhdGUoZGV2aWNlKTsKLSAgaWYgKHJlY29yZC0+SXNQYWlyZWQoKSkgewotICAgIC8vIEJvbmRlZCBtZWFucyB3ZSBzYXZlZCBpdCwgYnV0IHRoZSBjYWxsZXIgZG9lc24ndCBjYXJlCi0gICAgLy8gQm9uZGVkIHdpbGwgYWx3YXlzIG1lYW4gcGFpcmVkCi0gICAgTm90aWZ5RGV2aWNlQm9uZGVkKGRldmljZSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFyZWNvcmQtPklzUGFpcmluZygpKSB7Ci0gICAgICAvLyBEaXNwYXRjaCBwYWlyaW5nIGhhbmRsZXIsIGlmIHdlIGFyZSBjYWxsaW5nIGNyZWF0ZSB3ZSBhcmUgdGhlIGluaXRpYXRvcgotICAgICAgTE9HX1dBUk4oIkRpc3BhdGNoICMxIik7Ci0gICAgICBEaXNwYXRjaFBhaXJpbmdIYW5kbGVyKAotICAgICAgICAgIHJlY29yZCwKLSAgICAgICAgICB0cnVlLAotICAgICAgICAgIHRoaXMtPmxvY2FsX2lvX2NhcGFiaWxpdHlfLAotICAgICAgICAgIHRoaXMtPmxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18sCi0gICAgICAgICAgcmVtb3RlX3AxOTJfb29iX2RhdGEsCi0gICAgICAgICAgcmVtb3RlX3AyNTZfb29iX2RhdGEpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OkNyZWF0ZUJvbmRMZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7Ci0gIGF1dG8gcmVjb3JkID0gc2VjdXJpdHlfZGF0YWJhc2VfLkZpbmRPckNyZWF0ZShhZGRyZXNzKTsKLSAgaWYgKHJlY29yZC0+SXNQYWlyZWQoKSkgewotICAgIE5vdGlmeURldmljZUJvbmRGYWlsZWQoYWRkcmVzcywgUGFpcmluZ0ZhaWx1cmUoIkFscmVhZHkgYm9uZGVkIikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBlbmRpbmdfbGVfcGFpcmluZ18uYWRkcmVzc18gPSBhZGRyZXNzOwotCi0gIExlRml4ZWRDaGFubmVsRW50cnkqIHN0b3JlZF9jaGFuID0gRmluZFN0b3JlZExlQ2hhbm5lbChhZGRyZXNzKTsKLSAgaWYgKHN0b3JlZF9jaGFuKSB7Ci0gICAgLy8gV2UgYXJlIGFscmVhZHkgY29ubmVjdGVkCi0gICAgQ29ubmVjdGlvbklzUmVhZHlTdGFydFBhaXJpbmcoc3RvcmVkX2NoYW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGwyY2FwX21hbmFnZXJfbGVfLT5Db25uZWN0U2VydmljZXMoCi0gICAgICBhZGRyZXNzLCBjb21tb246OkJpbmRPbmNlKCZTZWN1cml0eU1hbmFnZXJJbXBsOjpPbkNvbm5lY3Rpb25GYWlsdXJlTGUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICBzZWN1cml0eV9oYW5kbGVyXyk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6Q2FuY2VsQm9uZChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpIHsKLSAgYXV0byBlbnRyeSA9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmZpbmQoZGV2aWNlLkdldEFkZHJlc3MoKSk7Ci0gIGlmIChlbnRyeSAhPSBwYWlyaW5nX2hhbmRsZXJfbWFwXy5lbmQoKSkgewotICAgIGF1dG8gY2FuY2VsX21lID0gZW50cnktPnNlY29uZDsKLSAgICBwYWlyaW5nX2hhbmRsZXJfbWFwXy5lcmFzZShlbnRyeSk7Ci0gICAgY2FuY2VsX21lLT5DYW5jZWwoKTsKLSAgfQotCi0gIGF1dG8gcmVjb3JkID0gc2VjdXJpdHlfZGF0YWJhc2VfLkZpbmRPckNyZWF0ZShkZXZpY2UpOwotICByZWNvcmQtPkNhbmNlbFBhaXJpbmcoKTsKLQotICBXaXBlTGVQYWlyaW5nSGFuZGxlcigpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlJlbW92ZUJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gIENhbmNlbEJvbmQoZGV2aWNlKTsKLSAgc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXy0+RGlzY29ubmVjdChkZXZpY2UuR2V0QWRkcmVzcygpKTsKLSAgc2VjdXJpdHlfZGF0YWJhc2VfLlJlbW92ZShkZXZpY2UpOwotICBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfLT5TZW5kQ29tbWFuZChoY2k6OkRlbGV0ZVN0b3JlZExpbmtLZXlCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBkZXZpY2UuR2V0QWRkcmVzcygpLCBoY2k6OkRlbGV0ZVN0b3JlZExpbmtLZXlEZWxldGVBbGxGbGFnOjpTUEVDSUZJRURfQkRfQUREUikpOwotICBOb3RpZnlEZXZpY2VVbmJvbmRlZChkZXZpY2UpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlNldFVzZXJJbnRlcmZhY2VIYW5kbGVyKFVJKiB1c2VyX2ludGVyZmFjZSwgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgaWYgKHVzZXJfaW50ZXJmYWNlXyAhPSBudWxscHRyIHx8IHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfICE9IG51bGxwdHIpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQhIik7Ci0gIH0KLSAgdXNlcl9pbnRlcmZhY2VfID0gdXNlcl9pbnRlcmZhY2U7Ci0gIHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfID0gaGFuZGxlcjsKLX0KLQotLy8gVE9ETyhqcGF3bG93c2tpKTogcmVtb3ZlIG9uY2Ugd2UgaGF2ZSBjb25maWcgZmlsZSBhYnN0cmFjdGlvbiBpbiBjZXJ0IHRlc3RzCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlNldExlSW5pdGlhdG9yQWRkcmVzc1BvbGljeUZvclRlc3QoCi0gICAgaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGZpeGVkX2FkZHJlc3MsCi0gICAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgcm90YXRpb25faXJrLAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWF4aW11bV9yb3RhdGlvbl90aW1lKSB7Ci0gIGFjbF9tYW5hZ2VyXy0+U2V0UHJpdmFjeVBvbGljeUZvckluaXRpYXRvckFkZHJlc3NGb3JUZXN0KAotICAgICAgYWRkcmVzc19wb2xpY3ksIGZpeGVkX2FkZHJlc3MsIHJvdGF0aW9uX2lyaywgbWluaW11bV9yb3RhdGlvbl90aW1lLCBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIqIGxpc3RlbmVyLCBvczo6SGFuZGxlciogaGFuZGxlcikgewotICBmb3IgKGF1dG8gaXQgPSBsaXN0ZW5lcnNfLmJlZ2luKCk7IGl0ICE9IGxpc3RlbmVyc18uZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoaXQtPmZpcnN0ID09IGxpc3RlbmVyKSB7Ci0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQhIik7Ci0gICAgfQotICB9Ci0KLSAgbGlzdGVuZXJzXy5wdXNoX2JhY2soe2xpc3RlbmVyLCBoYW5kbGVyfSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6VW5yZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIoSVNlY3VyaXR5TWFuYWdlckxpc3RlbmVyKiBsaXN0ZW5lcikgewotICBmb3IgKGF1dG8gaXQgPSBsaXN0ZW5lcnNfLmJlZ2luKCk7IGl0ICE9IGxpc3RlbmVyc18uZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoaXQtPmZpcnN0ID09IGxpc3RlbmVyKSB7Ci0gICAgICBsaXN0ZW5lcnNfLmVyYXNlKGl0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBMT0dfQUxXQVlTX0ZBVEFMKCJMaXN0ZW5lciBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCEiKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpOb3RpZnlEZXZpY2VCb25kZWQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gIGZvciAoYXV0byYgaXRlciA6IGxpc3RlbmVyc18pIHsKLSAgICBpdGVyLnNlY29uZC0+UG9zdChjb21tb246OkJpbmQoJklTZWN1cml0eU1hbmFnZXJMaXN0ZW5lcjo6T25EZXZpY2VCb25kZWQsIGNvbW1vbjo6VW5yZXRhaW5lZChpdGVyLmZpcnN0KSwgZGV2aWNlKSk7Ci0gIH0KLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpOb3RpZnlEZXZpY2VCb25kRmFpbGVkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgUGFpcmluZ0ZhaWx1cmUgc3RhdHVzKSB7Ci0gIGZvciAoYXV0byYgaXRlciA6IGxpc3RlbmVyc18pIHsKLSAgICBpdGVyLnNlY29uZC0+UG9zdCgKLSAgICAgICAgY29tbW9uOjpCaW5kKCZJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXI6Ok9uRGV2aWNlQm9uZEZhaWxlZCwgY29tbW9uOjpVbnJldGFpbmVkKGl0ZXIuZmlyc3QpLCBkZXZpY2UsIHN0YXR1cykpOwotICB9Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6Tm90aWZ5RGV2aWNlVW5ib25kZWQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gIGZvciAoYXV0byYgaXRlciA6IGxpc3RlbmVyc18pIHsKLSAgICBpdGVyLnNlY29uZC0+UG9zdCgKLSAgICAgICAgY29tbW9uOjpCaW5kKCZJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXI6Ok9uRGV2aWNlVW5ib25kZWQsIGNvbW1vbjo6VW5yZXRhaW5lZChpdGVyLmZpcnN0KSwgZGV2aWNlKSk7Ci0gIH0KLSAgYWNsX21hbmFnZXJfLT5SZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3QoZGV2aWNlKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpOb3RpZnlFbmNyeXB0aW9uU3RhdGVDaGFuZ2VkKGhjaTo6RW5jcnlwdGlvbkNoYW5nZVZpZXcgZW5jcnlwdGlvbl9jaGFuZ2VfdmlldykgewotICBmb3IgKGF1dG8mIGl0ZXIgOiBsaXN0ZW5lcnNfKSB7Ci0gICAgaXRlci5zZWNvbmQtPlBvc3QoY29tbW9uOjpCaW5kKCZJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXI6Ok9uRW5jcnlwdGlvblN0YXRlQ2hhbmdlZCwgY29tbW9uOjpVbnJldGFpbmVkKGl0ZXIuZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uX2NoYW5nZV92aWV3KSk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OkhhbmRsZUV2ZW50KFQgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgYXV0byBlbnRyeSA9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmZpbmQocGFja2V0LkdldEJkQWRkcigpKTsKLQotICBpZiAoZW50cnkgPT0gcGFpcmluZ19oYW5kbGVyX21hcF8uZW5kKCkpIHsKLSAgICBhdXRvIGJkX2FkZHIgPSBwYWNrZXQuR2V0QmRBZGRyKCk7Ci0gICAgYXV0byBldmVudF9jb2RlID0gcGFja2V0LkdldEV2ZW50Q29kZSgpOwotCi0gICAgaWYgKGV2ZW50X2NvZGUgIT0gaGNpOjpFdmVudENvZGU6OkxJTktfS0VZX1JFUVVFU1QgJiYgZXZlbnRfY29kZSAhPSBoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVCAmJgotICAgICAgICBldmVudF9jb2RlICE9IGhjaTo6RXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFKSB7Ci0gICAgICBMT0dfRVJST1IoIk5vIGNsYXNzaWMgcGFpcmluZyBoYW5kbGVyIGZvciBkZXZpY2UgJyVzJyByZWFkeSBmb3IgY29tbWFuZCAlcyAiLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICBoY2k6OkV2ZW50Q29kZVRleHQoZXZlbnRfY29kZSkuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBkZXZpY2UgPSBzdG9yYWdlX21vZHVsZV8tPkdldERldmljZUJ5Q2xhc3NpY01hY0FkZHJlc3MoYmRfYWRkcik7Ci0KLSAgICBhdXRvIHJlY29yZCA9Ci0gICAgICAgIHNlY3VyaXR5X2RhdGFiYXNlXy5GaW5kT3JDcmVhdGUoaGNpOjpBZGRyZXNzV2l0aFR5cGV7YmRfYWRkciwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfSk7Ci0gICAgTE9HX1dBUk4oIkRpc3BhdGNoICMyIik7Ci0gICAgRGlzcGF0Y2hQYWlyaW5nSGFuZGxlcigKLSAgICAgICAgcmVjb3JkLAotICAgICAgICBmYWxzZSwKLSAgICAgICAgdGhpcy0+bG9jYWxfaW9fY2FwYWJpbGl0eV8sCi0gICAgICAgIHRoaXMtPmxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18sCi0gICAgICAgIHBhaXJpbmc6Ok9vYkRhdGEoKSwKLSAgICAgICAgcGFpcmluZzo6T29iRGF0YSgpKTsKLSAgICBlbnRyeSA9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmZpbmQoYmRfYWRkcik7Ci0gIH0KLSAgZW50cnktPnNlY29uZC0+T25SZWNlaXZlKHBhY2tldCk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25IY2lFdmVudFJlY2VpdmVkKGhjaTo6RXZlbnRWaWV3IHBhY2tldCkgewotICBhdXRvIGV2ZW50ID0gaGNpOjpFdmVudFZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlRfTE9HKGV2ZW50LklzVmFsaWQoKSwgIlJlY2VpdmVkIGludmFsaWQgcGFja2V0Iik7Ci0gIGNvbnN0IGhjaTo6RXZlbnRDb2RlIGNvZGUgPSBldmVudC5HZXRFdmVudENvZGUoKTsKLSAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVDoKLSAgICAgIEhhbmRsZUV2ZW50PGhjaTo6UGluQ29kZVJlcXVlc3RWaWV3PihoY2k6OlBpbkNvZGVSZXF1ZXN0Vmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpMSU5LX0tFWV9SRVFVRVNUOgotICAgICAgSGFuZGxlRXZlbnQoaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6TElOS19LRVlfTk9USUZJQ0FUSU9OOgotICAgICAgSGFuZGxlRXZlbnQoaGNpOjpMaW5rS2V5Tm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1Q6Ci0gICAgICBIYW5kbGVFdmVudChoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVTUE9OU0U6Ci0gICAgICBIYW5kbGVFdmVudChoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpTSU1QTEVfUEFJUklOR19DT01QTEVURToKLSAgICAgIEhhbmRsZUV2ZW50KGhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpSRU1PVEVfT09CX0RBVEFfUkVRVUVTVDoKLSAgICAgIEhhbmRsZUV2ZW50KGhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3RWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlVTRVJfUEFTU0tFWV9OT1RJRklDQVRJT046Ci0gICAgICBIYW5kbGVFdmVudChoY2k6OlVzZXJQYXNza2V5Tm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpLRVlQUkVTU19OT1RJRklDQVRJT046Ci0gICAgICBIYW5kbGVFdmVudChoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUOgotICAgICAgSGFuZGxlRXZlbnQoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX1JFUVVFU1Q6Ci0gICAgICBIYW5kbGVFdmVudChoY2k6OlVzZXJQYXNza2V5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX0hPU1RfU1VQUE9SVEVEX0ZFQVRVUkVTX05PVElGSUNBVElPTjoKLSAgICAgIExPR19JTkZPKCJVbmhhbmRsZWQgZXZlbnQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KGNvZGUpLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpFTkNSWVBUSU9OX0NIQU5HRTogewotICAgICAgRW5jcnlwdGlvbkNoYW5nZVZpZXcgZW5jcnlwdGlvbl9jaGFuZ2VfdmlldyA9IEVuY3J5cHRpb25DaGFuZ2VWaWV3OjpDcmVhdGUoZXZlbnQpOwotICAgICAgaWYgKCFlbmNyeXB0aW9uX2NoYW5nZV92aWV3LklzVmFsaWQoKSkgewotICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgRW5jcnlwdGlvbkNoYW5nZSBwYWNrZXQgcmVjZWl2ZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpID09IHBlbmRpbmdfbGVfcGFpcmluZ18uY29ubmVjdGlvbl9oYW5kbGVfKSB7Ci0gICAgICAgIHBlbmRpbmdfbGVfcGFpcmluZ18uaGFuZGxlcl8tPk9uSGNpRXZlbnQoZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBOb3RpZnlFbmNyeXB0aW9uU3RhdGVDaGFuZ2VkKGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVF9MT0coZmFsc2UsICJDYW5ub3QgaGFuZGxlIHJlY2VpdmVkIHBhY2tldDogJXMiLCBoY2k6OkV2ZW50Q29kZVRleHQoY29kZSkuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6Ok9uQ29ubmVjdGlvbkNsb3NlZChoY2k6OkFkZHJlc3MgYWRkcmVzcykgewotICBhdXRvIGVudHJ5ID0gcGFpcmluZ19oYW5kbGVyX21hcF8uZmluZChhZGRyZXNzKTsKLSAgaWYgKGVudHJ5ICE9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmVuZCgpKSB7Ci0gICAgTE9HX0lORk8oIkNhbmNlbGxpbmcgcGFpcmluZyBoYW5kbGVyIGZvciAnJXMnIiwgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGVudHJ5LT5zZWNvbmQtPkNhbmNlbCgpOwotICB9Ci0gIGF1dG8gcmVjb3JkID0gc2VjdXJpdHlfZGF0YWJhc2VfLkZpbmRPckNyZWF0ZShoY2k6OkFkZHJlc3NXaXRoVHlwZShhZGRyZXNzLCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpKTsKLSAgaWYgKHJlY29yZC0+SXNUZW1wb3JhcnkoKSkgewotICAgIHNlY3VyaXR5X2RhdGFiYXNlXy5SZW1vdmUoaGNpOjpBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcywgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKSk7Ci0gIH0KLSAgaWYgKHRoaXMtPmZhY2FkZV9kaXNjb25uZWN0X2NhbGxiYWNrXykgewotICAgIHRoaXMtPnNlY3VyaXR5X2hhbmRsZXJfLT5DYWxsKAotICAgICAgICAqdGhpcy0+ZmFjYWRlX2Rpc2Nvbm5lY3RfY2FsbGJhY2tfLCBoY2k6OkFkZHJlc3NXaXRoVHlwZShhZGRyZXNzLCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpKTsKLSAgfQotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6Ok9uSGNpTGVFdmVudChoY2k6OkxlTWV0YUV2ZW50VmlldyBldmVudCkgewotICBoY2k6OlN1YmV2ZW50Q29kZSBjb2RlID0gZXZlbnQuR2V0U3ViZXZlbnRDb2RlKCk7Ci0KLSAgaWYgKGNvZGUgPT0gaGNpOjpTdWJldmVudENvZGU6OkxPTkdfVEVSTV9LRVlfUkVRVUVTVCkgewotICAgIGhjaTo6TGVMb25nVGVybUtleVJlcXVlc3RWaWV3IGxlX2xvbmdfdGVybV9rZXlfcmVxdWVzdF92aWV3ID0gaGNpOjpMZUxvbmdUZXJtS2V5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCk7Ci0gICAgaWYgKCFsZV9sb25nX3Rlcm1fa2V5X3JlcXVlc3Rfdmlldy5Jc1ZhbGlkKCkpIHsKLSAgICAgIExPR19FUlJPUigiSW52YWxpZCBMZUxvbmdUZXJtS2V5UmVxdWVzdFZpZXcgcGFja2V0IHJlY2VpdmVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGxlX2xvbmdfdGVybV9rZXlfcmVxdWVzdF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSA9PSBwZW5kaW5nX2xlX3BhaXJpbmdfLmNvbm5lY3Rpb25faGFuZGxlXykgewotICAgICAgcGVuZGluZ19sZV9wYWlyaW5nXy5oYW5kbGVyXy0+T25IY2lMZUV2ZW50KGV2ZW50KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0dfSU5GTygiVW5oYW5kbGVkIEhDSSBMRSBzZWN1cml0eSBldmVudCwgY29kZSAlcyIsIGhjaTo6U3ViZXZlbnRDb2RlVGV4dChjb2RlKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBoY2k6OlN1YmV2ZW50Q29kZTo6UkVBRF9MT0NBTF9QMjU2X1BVQkxJQ19LRVlfQ09NUExFVEUsCi0gIC8vIGhjaTo6U3ViZXZlbnRDb2RlOjpHRU5FUkFURV9ESEtFWV9DT01QTEVURSwKLSAgTE9HX0VSUk9SKCJVbmhhbmRsZWQgSENJIExFIHNlY3VyaXR5IGV2ZW50LCBjb2RlICVzIiwgaGNpOjpTdWJldmVudENvZGVUZXh0KGNvZGUpLmNfc3RyKCkpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6Ok9uUGFpcmluZ1Byb21wdEFjY2VwdGVkKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIGJvb2wgY29uZmlybWVkKSB7Ci0gIGF1dG8gZW50cnkgPSBwYWlyaW5nX2hhbmRsZXJfbWFwXy5maW5kKGFkZHJlc3MuR2V0QWRkcmVzcygpKTsKLSAgaWYgKGVudHJ5ICE9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmVuZCgpKSB7Ci0gICAgZW50cnktPnNlY29uZC0+T25QYWlyaW5nUHJvbXB0QWNjZXB0ZWQoYWRkcmVzcywgY29uZmlybWVkKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAocGVuZGluZ19sZV9wYWlyaW5nXy5hZGRyZXNzXyA9PSBhZGRyZXNzKSB7Ci0gICAgICBwZW5kaW5nX2xlX3BhaXJpbmdfLmhhbmRsZXJfLT5PblVpQWN0aW9uKFBhaXJpbmdFdmVudDo6VUlfQUNUSU9OX1RZUEU6OlBBSVJJTkdfQUNDRVBURUQsIGNvbmZpcm1lZCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25Db25maXJtWWVzTm8oY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgYm9vbCBjb25maXJtZWQpIHsKLSAgYXV0byBlbnRyeSA9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmZpbmQoYWRkcmVzcy5HZXRBZGRyZXNzKCkpOwotICBpZiAoZW50cnkgIT0gcGFpcmluZ19oYW5kbGVyX21hcF8uZW5kKCkpIHsKLSAgICBlbnRyeS0+c2Vjb25kLT5PbkNvbmZpcm1ZZXNObyhhZGRyZXNzLCBjb25maXJtZWQpOwotICB9IGVsc2UgewotICAgIGlmIChwZW5kaW5nX2xlX3BhaXJpbmdfLmFkZHJlc3NfID09IGFkZHJlc3MpIHsKLSAgICAgIHBlbmRpbmdfbGVfcGFpcmluZ18uaGFuZGxlcl8tPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpVSV9BQ1RJT05fVFlQRTo6Q09ORklSTV9ZRVNOTywgY29uZmlybWVkKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpPblBhc3NrZXlFbnRyeShjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCB1aW50MzJfdCBwYXNza2V5KSB7Ci0gIGF1dG8gZW50cnkgPSBwYWlyaW5nX2hhbmRsZXJfbWFwXy5maW5kKGFkZHJlc3MuR2V0QWRkcmVzcygpKTsKLSAgaWYgKGVudHJ5ICE9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmVuZCgpKSB7Ci0gICAgZW50cnktPnNlY29uZC0+T25QYXNza2V5RW50cnkoYWRkcmVzcywgcGFzc2tleSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHBlbmRpbmdfbGVfcGFpcmluZ18uYWRkcmVzc18gPT0gYWRkcmVzcykgewotICAgICAgcGVuZGluZ19sZV9wYWlyaW5nXy5oYW5kbGVyXy0+T25VaUFjdGlvbihQYWlyaW5nRXZlbnQ6OlVJX0FDVElPTl9UWVBFOjpQQVNTS0VZLCBwYXNza2V5KTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpPblBpbkVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBpbikgewotICBhdXRvIGVudHJ5ID0gcGFpcmluZ19oYW5kbGVyX21hcF8uZmluZChhZGRyZXNzLkdldEFkZHJlc3MoKSk7Ci0gIGlmIChlbnRyeSAhPSBwYWlyaW5nX2hhbmRsZXJfbWFwXy5lbmQoKSkgewotICAgIExPR19JTkZPKCJQSU4gZm9yICVzIiwgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGVudHJ5LT5zZWNvbmQtPk9uUGluRW50cnkoYWRkcmVzcywgcGluKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfV0FSTigiTm8gaGFuZGxlciBmb3VuZCBmb3IgUElOIGZvciAlcyIsIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAvLyBUT0RPKGpwYXdsb3dza2kpOiBJbXBsZW1lbnQgTEUgdmVyc2lvbgotICB9Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25QYWlyaW5nSGFuZGxlckNvbXBsZXRlKGhjaTo6QWRkcmVzcyBhZGRyZXNzLCBQYWlyaW5nUmVzdWx0T3JGYWlsdXJlIHN0YXR1cykgewotICBhdXRvIGVudHJ5ID0gcGFpcmluZ19oYW5kbGVyX21hcF8uZmluZChhZGRyZXNzKTsKLSAgaWYgKGVudHJ5ICE9IHBhaXJpbmdfaGFuZGxlcl9tYXBfLmVuZCgpKSB7Ci0gICAgcGFpcmluZ19oYW5kbGVyX21hcF8uZXJhc2UoZW50cnkpOwotICAgIHNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbF8tPlJlbGVhc2UoYWRkcmVzcyk7Ci0gIH0KLSAgYXV0byByZW1vdGUgPSBoY2k6OkFkZHJlc3NXaXRoVHlwZShhZGRyZXNzLCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpOwotICBpZiAoIXN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHN0YXR1cykpIHsKLSAgICBOb3RpZnlEZXZpY2VCb25kZWQocmVtb3RlKTsKLSAgfSBlbHNlIHsKLSAgICBOb3RpZnlEZXZpY2VCb25kRmFpbGVkKHJlbW90ZSwgc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHN0YXR1cykpOwotICB9Ci0gIGF1dG8gcmVjb3JkID0gdGhpcy0+c2VjdXJpdHlfZGF0YWJhc2VfLkZpbmRPckNyZWF0ZShyZW1vdGUpOwotICByZWNvcmQtPkNhbmNlbFBhaXJpbmcoKTsKLSAgc2VjdXJpdHlfZGF0YWJhc2VfLlNhdmVSZWNvcmRzVG9TdG9yYWdlKCk7Ci0gIC8vIE9ubHkgY2FsbCB1cGRhdGUgbGluayBpZiB3ZSBuZWVkIHRvCi0gIGF1dG8gcG9saWN5X2NhbGxiYWNrX2VudHJ5ID0gZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfY2FsbGJhY2tfbWFwXy5maW5kKHJlbW90ZSk7Ci0gIGlmIChwb2xpY3lfY2FsbGJhY2tfZW50cnkgIT0gZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfY2FsbGJhY2tfbWFwXy5lbmQoKSkgewotICAgIFVwZGF0ZUxpbmtTZWN1cml0eUNvbmRpdGlvbihyZW1vdGUpOwotICB9Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25MMmNhcFJlZ2lzdHJhdGlvbkNvbXBsZXRlTGUoCi0gICAgbDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQgcmVzdWx0LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6bGU6OkZpeGVkQ2hhbm5lbFNlcnZpY2U+IGxlX3NtcF9zZXJ2aWNlKSB7Ci0gIEFTU0VSVF9MT0cocmVzdWx0ID09IGJsdWV0b290aDo6bDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpSZWdpc3RyYXRpb25SZXN1bHQ6OlNVQ0NFU1MsCi0gICAgICAgICAgICAgIkZhaWxlZCB0byByZWdpc3RlciB0byBMRSBTTVAgRml4ZWQgQ2hhbm5lbCBTZXJ2aWNlIik7Ci19Ci0KLUxlRml4ZWRDaGFubmVsRW50cnkqIFNlY3VyaXR5TWFuYWdlckltcGw6OkZpbmRTdG9yZWRMZUNoYW5uZWwoY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUmIGRldmljZSkgewotICBmb3IgKExlRml4ZWRDaGFubmVsRW50cnkmIHN0b3JhZ2UgOiBhbGxfY2hhbm5lbHNfKSB7Ci0gICAgaWYgKHN0b3JhZ2UuY2hhbm5lbF8tPkdldERldmljZSgpID09IGRldmljZSkgewotICAgICAgcmV0dXJuICZzdG9yYWdlOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotYm9vbCBTZWN1cml0eU1hbmFnZXJJbXBsOjpFcmFzZVN0b3JlZExlQ2hhbm5lbChjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgZGV2aWNlKSB7Ci0gIGZvciAoYXV0byBpdCA9IGFsbF9jaGFubmVsc18uYmVnaW4oKTsgaXQgIT0gYWxsX2NoYW5uZWxzXy5lbmQoKTsgaXQrKykgewotICAgIGlmIChpdC0+Y2hhbm5lbF8tPkdldERldmljZSgpID09IGRldmljZSkgewotICAgICAgYWxsX2NoYW5uZWxzXy5lcmFzZShpdCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6Ok9uU21wQ29tbWFuZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgewotICBMZUZpeGVkQ2hhbm5lbEVudHJ5KiBzdG9yZWRfY2hhbiA9IEZpbmRTdG9yZWRMZUNoYW5uZWwoZGV2aWNlKTsKLSAgaWYgKCFzdG9yZWRfY2hhbikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIlJlY2VpdmVkIFNNUCBjb21tYW5kIGZvciB1bmtub3duIGNoYW5uZWwiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OmxlOjpGaXhlZENoYW5uZWw+JiBjaGFubmVsID0gc3RvcmVkX2NoYW4tPmNoYW5uZWxfOwotCi0gIGF1dG8gcGFja2V0ID0gY2hhbm5lbC0+R2V0UXVldWVVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gIGlmICghcGFja2V0KSB7Ci0gICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBkZXF1ZXVlLCBidXQgbm8gZGF0YSByZWFkeS4uLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFBlbmRpbmcgcGFpcmluZyAtIHBhc3MgdGhlIGRhdGEgdG8gdGhlIGhhbmRsZXIKLSAgYXV0byB0ZW1wX2NtZF92aWV3ID0gQ29tbWFuZFZpZXc6OkNyZWF0ZSgqcGFja2V0KTsKLSAgaWYgKHBlbmRpbmdfbGVfcGFpcmluZ18uYWRkcmVzc18gPT0gZGV2aWNlKSB7Ci0gICAgcGVuZGluZ19sZV9wYWlyaW5nXy5oYW5kbGVyXy0+T25Db21tYW5kVmlldyh0ZW1wX2NtZF92aWV3KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBubyBwZW5kaW5nIHBhaXJpbmcgYXR0ZW1wdAotICBpZiAoIXRlbXBfY21kX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX0VSUk9SKCJJbnZhbGlkIENvbW1hbmQgcGFja2V0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHRlbXBfY21kX3ZpZXcuR2V0Q29kZSgpID09IENvZGU6OlNFQ1VSSVRZX1JFUVVFU1QpIHsKLSAgICAvLyBUT0RPOiBlaXRoZXIgc3RhcnQgZW5jcnlwdGlvbiBvciBwYWlyaW5nCi0gICAgTE9HX1dBUk4oIlVuaGFuZGxlZCBzZWN1cml0eSByZXF1ZXN0ISEhIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBteV9yb2xlID0gY2hhbm5lbC0+R2V0TGlua09wdGlvbnMoKS0+R2V0Um9sZSgpOwotICBpZiAodGVtcF9jbWRfdmlldy5HZXRDb2RlKCkgPT0gQ29kZTo6UEFJUklOR19SRVFVRVNUICYmIG15X3JvbGUgPT0gaGNpOjpSb2xlOjpQRVJJUEhFUkFMKSB7Ci0gICAgLy8gVE9ETzogaWYgKHBlbmRpbmdfbGVfcGFpcmluZ18pIHsgZG8gbm90IHN0YXJ0IGFub3RoZXIgfQotCi0gICAgTE9HX0lORk8oInN0YXJ0IG9mIHNlY3VyaXR5IHJlcXVlc3QgaGFuZGxpbmchIik7Ci0KLSAgICBzdG9yZWRfY2hhbi0+Y2hhbm5lbF8tPkFjcXVpcmUoKTsKLQotICAgIFBhaXJpbmdSZXF1ZXN0VmlldyBwYWlyaW5nX3JlcXVlc3QgPSBQYWlyaW5nUmVxdWVzdFZpZXc6OkNyZWF0ZSh0ZW1wX2NtZF92aWV3KTsKLSAgICBhdXRvJiBlbnF1ZXVlX2J1ZmZlciA9IHN0b3JlZF9jaGFuLT5lbnF1ZXVlX2J1ZmZlcl87Ci0KLSAgICBzdGQ6Om9wdGlvbmFsPEluaXRpYWxJbmZvcm1hdGlvbnM6Om91dF9vZl9iYW5kX2RhdGE+IHJlbW90ZV9vb2JfZGF0YSA9IHN0ZDo6bnVsbG9wdDsKLSAgICBpZiAocmVtb3RlX29vYl9kYXRhX2FkZHJlc3NfLmhhc192YWx1ZSgpICYmIHJlbW90ZV9vb2JfZGF0YV9hZGRyZXNzXy52YWx1ZSgpID09IGNoYW5uZWwtPkdldERldmljZSgpKQotICAgICAgcmVtb3RlX29vYl9kYXRhID0gSW5pdGlhbEluZm9ybWF0aW9uczo6b3V0X29mX2JhbmRfZGF0YXsubGVfc2NfYyA9IHJlbW90ZV9vb2JfZGF0YV9sZV9zY19jXy52YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVfc2NfciA9IHJlbW90ZV9vb2JfZGF0YV9sZV9zY19yXy52YWx1ZSgpfTsKLQotICAgIC8vIFRPRE86IHRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIGEgdW5pcXVlIHB0ciwgaWYgdGhlcmUgaXMgYSB3YXkgdG8gcHJvcGVybHkgc3RkOjptb3ZlIGl0IGludG8gcGxhY2Ugd2hlcmUgaXQncwotICAgIC8vIHN0b3JlZAotICAgIHBlbmRpbmdfbGVfcGFpcmluZ18uY29ubmVjdGlvbl9oYW5kbGVfID0gY2hhbm5lbC0+R2V0TGlua09wdGlvbnMoKS0+R2V0SGFuZGxlKCk7Ci0gICAgSW5pdGlhbEluZm9ybWF0aW9ucyBpbml0aWFsX2luZm9ybWF0aW9uc3sKLSAgICAgICAgLm15X3JvbGUgPSBteV9yb2xlLAotICAgICAgICAubXlfY29ubmVjdGlvbl9hZGRyZXNzID0gY2hhbm5lbC0+R2V0TGlua09wdGlvbnMoKS0+R2V0TG9jYWxBZGRyZXNzKCksCi0gICAgICAgIC5teV9pZGVudGl0eV9hZGRyZXNzID0gbG9jYWxfaWRlbnRpdHlfYWRkcmVzc18sCi0gICAgICAgIC5teV9pZGVudGl0eV9yZXNvbHZpbmdfa2V5ID0gbG9jYWxfaWRlbnRpdHlfcmVzb2x2aW5nX2tleV8sCi0gICAgICAgIC8qVE9ETzogcHJvcGVybHkgb2J0YWluIGNhcGFiaWxpdGllcyBmcm9tIGRldmljZS1zcGVjaWZpYyBzdG9yYWdlKi8KLSAgICAgICAgLm15UGFpcmluZ0NhcGFiaWxpdGllcyA9IHsuaW9fY2FwYWJpbGl0eSA9IGxvY2FsX2xlX2lvX2NhcGFiaWxpdHlfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vb2JfZGF0YV9mbGFnID0gbG9jYWxfbGVfb29iX2RhdGFfcHJlc2VudF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1dGhfcmVxID0gbG9jYWxfbGVfYXV0aF9yZXFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemUgPSBsb2NhbF9tYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0aWF0b3Jfa2V5X2Rpc3RyaWJ1dGlvbiA9IDB4MDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uID0gMHgwN30sCi0gICAgICAgIC5yZW1vdGVseV9pbml0aWF0ZWQgPSB0cnVlLAotICAgICAgICAuY29ubmVjdGlvbl9oYW5kbGUgPSBjaGFubmVsLT5HZXRMaW5rT3B0aW9ucygpLT5HZXRIYW5kbGUoKSwKLSAgICAgICAgLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MgPSBjaGFubmVsLT5HZXREZXZpY2UoKSwKLSAgICAgICAgLnJlbW90ZV9uYW1lID0gIlRPRE86IGdyYWIgcHJvcGVyIGRldmljZSBuYW1lIGluIHNlYyBtZ3IiLAotICAgICAgICAvKiBjb250YWlucyBwYWlyaW5nIHJlcXVlc3QsIGlmIHRoZSBwYWlyaW5nIHdhcyByZW1vdGVseSBpbml0aWF0ZWQgKi8KLSAgICAgICAgLnBhaXJpbmdfcmVxdWVzdCA9IHBhaXJpbmdfcmVxdWVzdCwKLSAgICAgICAgLnJlbW90ZV9vb2JfZGF0YSA9IHJlbW90ZV9vb2JfZGF0YSwKLSAgICAgICAgLm15X29vYl9kYXRhID0gbG9jYWxfbGVfb29iX2RhdGFfLAotICAgICAgICAvKiBVc2VkIGJ5IFBhaXJpbmcgSGFuZGxlciB0byBwcmVzZW50IHVzZXIgd2l0aCByZXF1ZXN0cyovCi0gICAgICAgIC51c2VyX2ludGVyZmFjZSA9IHVzZXJfaW50ZXJmYWNlXywKLSAgICAgICAgLnVzZXJfaW50ZXJmYWNlX2hhbmRsZXIgPSB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXywKLQotICAgICAgICAvKiBIQ0kgaW50ZXJmYWNlIHRvIHVzZSAqLwotICAgICAgICAubGVfc2VjdXJpdHlfaW50ZXJmYWNlID0gaGNpX3NlY3VyaXR5X2ludGVyZmFjZV9sZV8sCi0gICAgICAgIC5wcm9wZXJfbDJjYXBfaW50ZXJmYWNlID0gZW5xdWV1ZV9idWZmZXIuZ2V0KCksCi0gICAgICAgIC5sMmNhcF9oYW5kbGVyID0gc2VjdXJpdHlfaGFuZGxlcl8sCi0gICAgICAgIC8qIENhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSB0aGUgUGFpcmluZyBwcm9jZXNzIGlzIGZpbmlzaGVkICovCi0gICAgICAgIC8vIFRPRE86IG1ha2UgaXQgYW4gY29tbW9uOjpPbmNlQ2FsbGJhY2sgPwotICAgICAgICAuT25QYWlyaW5nRmluaXNoZWQgPSBzdGQ6OmJpbmQoJlNlY3VyaXR5TWFuYWdlckltcGw6Ok9uUGFpcmluZ0ZpbmlzaGVkLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgIH07Ci0gICAgcGVuZGluZ19sZV9wYWlyaW5nXy5hZGRyZXNzXyA9IGRldmljZTsKLSAgICBwZW5kaW5nX2xlX3BhaXJpbmdfLmhhbmRsZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nSGFuZGxlckxlPihQYWlyaW5nSGFuZGxlckxlOjpQSEFTRTEsIGluaXRpYWxfaW5mb3JtYXRpb25zKTsKLSAgfQotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6Ok9uQ29ubmVjdGlvbk9wZW5MZShzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OmxlOjpGaXhlZENoYW5uZWw+IGNoYW5uZWxfcGFyYW0pIHsKLSAgYXV0byBlbnF1ZXVlX2J1ZmZlcl90ZW1wID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8b3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+KGNoYW5uZWxfcGFyYW0tPkdldFF1ZXVlVXBFbmQoKSk7Ci0KLSAgYWxsX2NoYW5uZWxzXy5wdXNoX2JhY2soe3N0ZDo6bW92ZShjaGFubmVsX3BhcmFtKSwgc3RkOjptb3ZlKGVucXVldWVfYnVmZmVyX3RlbXApfSk7Ci0gIGF1dG8mIHN0b3JlZF9jaGFubmVsID0gYWxsX2NoYW5uZWxzXy5iYWNrKCk7Ci0gIGF1dG8mIGNoYW5uZWwgPSBzdG9yZWRfY2hhbm5lbC5jaGFubmVsXzsKLQotICBjaGFubmVsLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgIHNlY3VyaXR5X2hhbmRsZXJfLAotICAgICAgY29tbW9uOjpCaW5kT25jZSgmU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25Db25uZWN0aW9uQ2xvc2VkTGUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgY2hhbm5lbC0+R2V0RGV2aWNlKCkpKTsKLSAgY2hhbm5lbC0+R2V0UXVldWVVcEVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICBzZWN1cml0eV9oYW5kbGVyXywKLSAgICAgIGNvbW1vbjo6QmluZCgmU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25TbXBDb21tYW5kTGUsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgY2hhbm5lbC0+R2V0RGV2aWNlKCkpKTsKLQotICBpZiAocGVuZGluZ19sZV9wYWlyaW5nXy5hZGRyZXNzXyAhPSBjaGFubmVsLT5HZXREZXZpY2UoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIENvbm5lY3Rpb25Jc1JlYWR5U3RhcnRQYWlyaW5nKCZzdG9yZWRfY2hhbm5lbCk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6Q29ubmVjdGlvbklzUmVhZHlTdGFydFBhaXJpbmcoTGVGaXhlZENoYW5uZWxFbnRyeSogc3RvcmVkX2NoYW5uZWwpIHsKLSAgYXV0byYgY2hhbm5lbCA9IHN0b3JlZF9jaGFubmVsLT5jaGFubmVsXzsKLSAgYXV0byYgZW5xdWV1ZV9idWZmZXIgPSBzdG9yZWRfY2hhbm5lbC0+ZW5xdWV1ZV9idWZmZXJfOwotCi0gIHN0b3JlZF9jaGFubmVsLT5jaGFubmVsXy0+QWNxdWlyZSgpOwotCi0gIHN0ZDo6b3B0aW9uYWw8SW5pdGlhbEluZm9ybWF0aW9uczo6b3V0X29mX2JhbmRfZGF0YT4gcmVtb3RlX29vYl9kYXRhID0gc3RkOjpudWxsb3B0OwotICBpZiAocmVtb3RlX29vYl9kYXRhX2FkZHJlc3NfLmhhc192YWx1ZSgpICYmIHJlbW90ZV9vb2JfZGF0YV9hZGRyZXNzXy52YWx1ZSgpID09IGNoYW5uZWwtPkdldERldmljZSgpKQotICAgIHJlbW90ZV9vb2JfZGF0YSA9IEluaXRpYWxJbmZvcm1hdGlvbnM6Om91dF9vZl9iYW5kX2RhdGF7LmxlX3NjX2MgPSByZW1vdGVfb29iX2RhdGFfbGVfc2NfY18udmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZV9zY19yID0gcmVtb3RlX29vYl9kYXRhX2xlX3NjX3JfLnZhbHVlKCl9OwotCi0gIC8vIFRPRE86IHRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIGEgdW5pcXVlIHB0ciwgaWYgdGhlcmUgaXMgYSB3YXkgdG8gcHJvcGVybHkgc3RkOjptb3ZlIGl0IGludG8gcGxhY2Ugd2hlcmUgaXQncyBzdG9yZWQKLSAgcGVuZGluZ19sZV9wYWlyaW5nXy5jb25uZWN0aW9uX2hhbmRsZV8gPSBjaGFubmVsLT5HZXRMaW5rT3B0aW9ucygpLT5HZXRIYW5kbGUoKTsKLSAgSW5pdGlhbEluZm9ybWF0aW9ucyBpbml0aWFsX2luZm9ybWF0aW9uc3sKLSAgICAgIC5teV9yb2xlID0gY2hhbm5lbC0+R2V0TGlua09wdGlvbnMoKS0+R2V0Um9sZSgpLAotICAgICAgLm15X2Nvbm5lY3Rpb25fYWRkcmVzcyA9IGNoYW5uZWwtPkdldExpbmtPcHRpb25zKCktPkdldExvY2FsQWRkcmVzcygpLAotICAgICAgLm15X2lkZW50aXR5X2FkZHJlc3MgPSBsb2NhbF9pZGVudGl0eV9hZGRyZXNzXywKLSAgICAgIC5teV9pZGVudGl0eV9yZXNvbHZpbmdfa2V5ID0gbG9jYWxfaWRlbnRpdHlfcmVzb2x2aW5nX2tleV8sCi0gICAgICAvKlRPRE86IHByb3Blcmx5IG9idGFpbiBjYXBhYmlsaXRpZXMgZnJvbSBkZXZpY2Utc3BlY2lmaWMgc3RvcmFnZSovCi0gICAgICAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzID0gey5pb19jYXBhYmlsaXR5ID0gbG9jYWxfbGVfaW9fY2FwYWJpbGl0eV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vb2JfZGF0YV9mbGFnID0gbG9jYWxfbGVfb29iX2RhdGFfcHJlc2VudF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdXRoX3JlcSA9IGxvY2FsX2xlX2F1dGhfcmVxXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSA9IGxvY2FsX21heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0aWF0b3Jfa2V5X2Rpc3RyaWJ1dGlvbiA9IDB4MDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNwb25kZXJfa2V5X2Rpc3RyaWJ1dGlvbiA9IDB4MDd9LAotICAgICAgLnJlbW90ZWx5X2luaXRpYXRlZCA9IGZhbHNlLAotICAgICAgLmNvbm5lY3Rpb25faGFuZGxlID0gY2hhbm5lbC0+R2V0TGlua09wdGlvbnMoKS0+R2V0SGFuZGxlKCksCi0gICAgICAucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcyA9IGNoYW5uZWwtPkdldERldmljZSgpLAotICAgICAgLnJlbW90ZV9uYW1lID0gIlRPRE86IGdyYWIgcHJvcGVyIGRldmljZSBuYW1lIGluIHNlYyBtZ3IiLAotICAgICAgLyogY29udGFpbnMgcGFpcmluZyByZXF1ZXN0LCBpZiB0aGUgcGFpcmluZyB3YXMgcmVtb3RlbHkgaW5pdGlhdGVkICovCi0gICAgICAucGFpcmluZ19yZXF1ZXN0ID0gc3RkOjpudWxsb3B0LCAgLy8gVE9ETzogaGFuZGxlIHJlbW90ZWx5IGluaXRpYXRlZCBwYWlyaW5nIGluIFNlY3VyaXR5TWFuYWdlciBwcm9wZXJseQotICAgICAgLnJlbW90ZV9vb2JfZGF0YSA9IHJlbW90ZV9vb2JfZGF0YSwKLSAgICAgIC5teV9vb2JfZGF0YSA9IGxvY2FsX2xlX29vYl9kYXRhXywKLSAgICAgIC8qIFVzZWQgYnkgUGFpcmluZyBIYW5kbGVyIHRvIHByZXNlbnQgdXNlciB3aXRoIHJlcXVlc3RzKi8KLSAgICAgIC51c2VyX2ludGVyZmFjZSA9IHVzZXJfaW50ZXJmYWNlXywKLSAgICAgIC51c2VyX2ludGVyZmFjZV9oYW5kbGVyID0gdXNlcl9pbnRlcmZhY2VfaGFuZGxlcl8sCi0KLSAgICAgIC8qIEhDSSBpbnRlcmZhY2UgdG8gdXNlICovCi0gICAgICAubGVfc2VjdXJpdHlfaW50ZXJmYWNlID0gaGNpX3NlY3VyaXR5X2ludGVyZmFjZV9sZV8sCi0gICAgICAucHJvcGVyX2wyY2FwX2ludGVyZmFjZSA9IGVucXVldWVfYnVmZmVyLmdldCgpLAotICAgICAgLmwyY2FwX2hhbmRsZXIgPSBzZWN1cml0eV9oYW5kbGVyXywKLSAgICAgIC8qIENhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSB0aGUgUGFpcmluZyBwcm9jZXNzIGlzIGZpbmlzaGVkICovCi0gICAgICAvLyBUT0RPOiBtYWtlIGl0IGFuIGNvbW1vbjo6T25jZUNhbGxiYWNrID8KLSAgICAgIC5PblBhaXJpbmdGaW5pc2hlZCA9IHN0ZDo6YmluZCgmU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25QYWlyaW5nRmluaXNoZWQsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCi0gIH07Ci0gIHBlbmRpbmdfbGVfcGFpcmluZ18uaGFuZGxlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgaW5pdGlhbF9pbmZvcm1hdGlvbnMpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6Ok9uQ29ubmVjdGlvbkNsb3NlZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MsIGhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUpIHsKLSAgaWYgKHBlbmRpbmdfbGVfcGFpcmluZ18uYWRkcmVzc18gIT0gYWRkcmVzcykgewotICAgIExlRml4ZWRDaGFubmVsRW50cnkqIHN0b3JlZF9jaGFuID0gRmluZFN0b3JlZExlQ2hhbm5lbChhZGRyZXNzKTsKLSAgICBpZiAoIXN0b3JlZF9jaGFuKSB7Ci0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJSZWNlaXZlZCBjb25uZWN0aW9uIGNsb3NlZCBmb3IgdW5rbm93biBjaGFubmVsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0b3JlZF9jaGFuLT5jaGFubmVsXy0+R2V0UXVldWVVcEVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIHN0b3JlZF9jaGFuLT5lbnF1ZXVlX2J1ZmZlcl8ucmVzZXQoKTsKLSAgICBFcmFzZVN0b3JlZExlQ2hhbm5lbChhZGRyZXNzKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcGVuZGluZ19sZV9wYWlyaW5nXy5oYW5kbGVyXy0+U2VuZEV4aXRTaWduYWwoKTsKLSAgTm90aWZ5RGV2aWNlQm9uZEZhaWxlZChhZGRyZXNzLCBQYWlyaW5nRmFpbHVyZSgiQ29ubmVjdGlvbiBjbG9zZWQiKSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25Db25uZWN0aW9uRmFpbHVyZUxlKGJsdWV0b290aDo6bDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgewotICBpZiAocmVzdWx0LmNvbm5lY3Rpb25fcmVzdWx0X2NvZGUgPT0KLSAgICAgIGJsdWV0b290aDo6bDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0Q29kZTo6RkFJTF9BTExfU0VSVklDRVNfSEFWRV9DSEFOTkVMKSB7Ci0gICAgLy8gVE9ETzogYWxyZWFkeSBjb25uZWN0ZWQKLSAgfQotCi0gIC8vIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBvbmx5IGZvciBkZXZpY2VzIHdlIGF0dGVtcHRlZCB0byBjb25uZWN0IHRvLgotICBOb3RpZnlEZXZpY2VCb25kRmFpbGVkKHBlbmRpbmdfbGVfcGFpcmluZ18uYWRkcmVzc18sIFBhaXJpbmdGYWlsdXJlKCJDb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgZmFpbGVkIikpOwotfQotCi1TZWN1cml0eU1hbmFnZXJJbXBsOjpTZWN1cml0eU1hbmFnZXJJbXBsKAotICAgIG9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyLAotICAgIGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZSogbDJjYXBfbGVfbW9kdWxlLAotICAgIGNoYW5uZWw6OlNlY3VyaXR5TWFuYWdlckNoYW5uZWwqIHNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbCwKLSAgICBoY2k6OkhjaUxheWVyKiBoY2lfbGF5ZXIsCi0gICAgaGNpOjpBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlciwKLSAgICBoY2k6OkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgc3RvcmFnZTo6U3RvcmFnZU1vZHVsZSogc3RvcmFnZV9tb2R1bGUsCi0gICAgbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZSogbmFtZV9kYl9tb2R1bGUpCi0gICAgOiBzZWN1cml0eV9oYW5kbGVyXyhzZWN1cml0eV9oYW5kbGVyKSwKLSAgICAgIGwyY2FwX2xlX21vZHVsZV8obDJjYXBfbGVfbW9kdWxlKSwKLSAgICAgIGwyY2FwX21hbmFnZXJfbGVfKGwyY2FwX2xlX21vZHVsZV8tPkdldEZpeGVkQ2hhbm5lbE1hbmFnZXIoKSksCi0gICAgICBoY2lfc2VjdXJpdHlfaW50ZXJmYWNlX2xlXygKLSAgICAgICAgICBoY2lfbGF5ZXItPkdldExlU2VjdXJpdHlJbnRlcmZhY2Uoc2VjdXJpdHlfaGFuZGxlcl8tPkJpbmRPbih0aGlzLCAmU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25IY2lMZUV2ZW50KSkpLAotICAgICAgc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXyhzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwpLAotICAgICAgYWNsX21hbmFnZXJfKGFjbF9tYW5hZ2VyKSwKLSAgICAgIGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpLAotICAgICAgc3RvcmFnZV9tb2R1bGVfKHN0b3JhZ2VfbW9kdWxlKSwKLSAgICAgIHNlY3VyaXR5X3JlY29yZF9zdG9yYWdlXyhzdG9yYWdlX21vZHVsZSwgc2VjdXJpdHlfaGFuZGxlciksCi0gICAgICBzZWN1cml0eV9kYXRhYmFzZV8oc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2VfKSwKLSAgICAgIG5hbWVfZGJfbW9kdWxlXyhuYW1lX2RiX21vZHVsZSkgewotICBJbml0KCk7Ci0KLSAgbDJjYXBfbWFuYWdlcl9sZV8tPlJlZ2lzdGVyU2VydmljZSgKLSAgICAgIGJsdWV0b290aDo6bDJjYXA6OmtTbXBDaWQsCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZTZWN1cml0eU1hbmFnZXJJbXBsOjpPbkwyY2FwUmVnaXN0cmF0aW9uQ29tcGxldGVMZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGNvbW1vbjo6QmluZCgmU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25Db25uZWN0aW9uT3BlbkxlLCBjb21tb246OlVucmV0YWluZWQodGhpcykpLCBzZWN1cml0eV9oYW5kbGVyXyk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6T25QYWlyaW5nRmluaXNoZWQoc2VjdXJpdHk6OlBhaXJpbmdSZXN1bHRPckZhaWx1cmUgcGFpcmluZ19yZXN1bHQpIHsKLSAgTE9HX0lORk8oIiDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqAgUmVjZWl2ZWQgcGFpcmluZyByZXN1bHQiKTsKLQotICBMZUZpeGVkQ2hhbm5lbEVudHJ5KiBzdG9yZWRfY2hhbiA9IEZpbmRTdG9yZWRMZUNoYW5uZWwocGVuZGluZ19sZV9wYWlyaW5nXy5hZGRyZXNzXyk7Ci0gIGlmIChzdG9yZWRfY2hhbikgewotICAgIHN0b3JlZF9jaGFuLT5jaGFubmVsXy0+UmVsZWFzZSgpOwotICB9Ci0KLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHBhaXJpbmdfcmVzdWx0KSkgewotICAgIFBhaXJpbmdGYWlsdXJlIGZhaWx1cmUgPSBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4ocGFpcmluZ19yZXN1bHQpOwotICAgIExPR19JTkZPKCIg4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pag4pagIGZhaWx1cmUgbWVzc2FnZTogJXMiLAotICAgICAgICAgICAgIGZhaWx1cmUubWVzc2FnZS5jX3N0cigpKTsKLSAgICBOb3RpZnlEZXZpY2VCb25kRmFpbGVkKHN0b3JlZF9jaGFuLT5jaGFubmVsXy0+R2V0RGV2aWNlKCksIGZhaWx1cmUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gcmVzdWx0ID0gc3RkOjpnZXQ8UGFpcmluZ1Jlc3VsdD4ocGFpcmluZ19yZXN1bHQpOwotICBMT0dfSU5GTygiUGFpcmluZyB3aXRoICVzIHdhcyBzdWNjZXNzZnVsIiwgcmVzdWx0LmNvbm5lY3Rpb25fYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8vIFRPRE86IGVuc3VyZSB0aGF0IHRoZSBzZWN1cml0eSBsZXZlbCBpcyBub3Qgd2Vha2VyIHRoYW4gd2hhdCB3ZSBhbHJlYWR5IGhhdmUuCi0gIGF1dG8gcmVjb3JkID0gdGhpcy0+c2VjdXJpdHlfZGF0YWJhc2VfLkZpbmRPckNyZWF0ZShyZXN1bHQuY29ubmVjdGlvbl9hZGRyZXNzKTsKLSAgcmVjb3JkLT5pZGVudGl0eV9hZGRyZXNzXyA9IHJlc3VsdC5kaXN0cmlidXRlZF9rZXlzLnJlbW90ZV9pZGVudGl0eV9hZGRyZXNzOwotICByZWNvcmQtPnJlbW90ZV9sdGsgPSByZXN1bHQuZGlzdHJpYnV0ZWRfa2V5cy5yZW1vdGVfbHRrOwotICByZWNvcmQtPmtleV9zaXplID0gcmVzdWx0LmtleV9zaXplOwotICByZWNvcmQtPnNlY3VyaXR5X2xldmVsID0gcmVzdWx0LnNlY3VyaXR5X2xldmVsOwotICByZWNvcmQtPnJlbW90ZV9lZGl2ID0gcmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2VkaXY7Ci0gIHJlY29yZC0+cmVtb3RlX3JhbmQgPSByZXN1bHQuZGlzdHJpYnV0ZWRfa2V5cy5yZW1vdGVfcmFuZDsKLSAgcmVjb3JkLT5yZW1vdGVfaXJrID0gcmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2lyazsKLSAgcmVjb3JkLT5yZW1vdGVfc2lnbmF0dXJlX2tleSA9IHJlc3VsdC5kaXN0cmlidXRlZF9rZXlzLnJlbW90ZV9zaWduYXR1cmVfa2V5OwotICBpZiAocmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2xpbmtfa2V5KQotICAgIHJlY29yZC0+U2V0TGlua0tleSgqcmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2xpbmtfa2V5LCBoY2k6OktleVR5cGU6OkFVVEhFTlRJQ0FURURfUDI1Nik7Ci0gIHNlY3VyaXR5X2RhdGFiYXNlXy5TYXZlUmVjb3Jkc1RvU3RvcmFnZSgpOwotCi0gIE5vdGlmeURldmljZUJvbmRlZChyZXN1bHQuY29ubmVjdGlvbl9hZGRyZXNzKTsKLSAgLy8gV2UgYWxzbyBub3RpZnkgYm9uZCBjb21wbGV0ZSB1c2luZyBpZGVudGl0eSBhZGRyZXNzLiBUaGF0J3Mgd2hhdCBvbGQgc3RhY2sgdXNlZCB0byBkby4KLSAgaWYgKHJlc3VsdC5kaXN0cmlidXRlZF9rZXlzLnJlbW90ZV9pZGVudGl0eV9hZGRyZXNzKQotICAgIE5vdGlmeURldmljZUJvbmRlZCgqcmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2lkZW50aXR5X2FkZHJlc3MpOwotCi0gIHNlY3VyaXR5X2hhbmRsZXJfLT5DYWxsT24odGhpcywgJlNlY3VyaXR5TWFuYWdlckltcGw6OldpcGVMZVBhaXJpbmdIYW5kbGVyKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpXaXBlTGVQYWlyaW5nSGFuZGxlcigpIHsKLSAgcGVuZGluZ19sZV9wYWlyaW5nXy5oYW5kbGVyXy5yZXNldCgpOwotICBwZW5kaW5nX2xlX3BhaXJpbmdfLmNvbm5lY3Rpb25faGFuZGxlXyA9IDA7Ci0gIHBlbmRpbmdfbGVfcGFpcmluZ18uYWRkcmVzc18gPSBoY2k6OkFkZHJlc3NXaXRoVHlwZSgpOwotfQotCi0vLyBGYWNhZGUgQ29uZmlndXJhdGlvbiBBUEkgZnVuY3Rpb25zCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlNldERpc2Nvbm5lY3RDYWxsYmFjayhGYWNhZGVEaXNjb25uZWN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgdGhpcy0+ZmFjYWRlX2Rpc2Nvbm5lY3RfY2FsbGJhY2tfID0gc3RkOjptYWtlX29wdGlvbmFsPEZhY2FkZURpc2Nvbm5lY3RDYWxsYmFjaz4oY2FsbGJhY2spOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlNldElvQ2FwYWJpbGl0eShoY2k6OklvQ2FwYWJpbGl0eSBpb19jYXBhYmlsaXR5KSB7Ci0gIHRoaXMtPmxvY2FsX2lvX2NhcGFiaWxpdHlfID0gaW9fY2FwYWJpbGl0eTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpTZXRMZUlvQ2FwYWJpbGl0eShzZWN1cml0eTo6SW9DYXBhYmlsaXR5IGlvX2NhcGFiaWxpdHkpIHsKLSAgdGhpcy0+bG9jYWxfbGVfaW9fY2FwYWJpbGl0eV8gPSBpb19jYXBhYmlsaXR5OwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlNldExlQXV0aFJlcXVpcmVtZW50cyh1aW50OF90IGF1dGhfcmVxKSB7Ci0gIHRoaXMtPmxvY2FsX2xlX2F1dGhfcmVxXyA9IGF1dGhfcmVxOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKHVpbnQ4X3QgbWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplKSB7Ci0gIHRoaXMtPmxvY2FsX21heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZV8gPSBtYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemU7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6U2V0TGVPb2JEYXRhUHJlc2VudChPb2JEYXRhRmxhZyBkYXRhX3ByZXNlbnQpIHsKLSAgdGhpcy0+bG9jYWxfbGVfb29iX2RhdGFfcHJlc2VudF8gPSBkYXRhX3ByZXNlbnQ7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6R2V0T3V0T2ZCYW5kRGF0YShjaGFubmVsOjpTZWN1cml0eUNvbW1hbmRTdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgewotICB0aGlzLT5zZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfLT5TZW5kQ29tbWFuZCgKLSAgICAgIGhjaTo6UmVhZExvY2FsT29iRGF0YUJ1aWxkZXI6OkNyZWF0ZSgpLCBzdGQ6OmZvcndhcmQ8Y2hhbm5lbDo6U2VjdXJpdHlDb21tYW5kU3RhdHVzQ2FsbGJhY2s+KGNhbGxiYWNrKSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6R2V0TGVPdXRPZkJhbmREYXRhKAotICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiBjb25maXJtYXRpb25fdmFsdWUsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiByYW5kb21fdmFsdWUpIHsKLSAgbG9jYWxfbGVfb29iX2RhdGFfID0gc3RkOjptYWtlX29wdGlvbmFsPE15T29iRGF0YT4oUGFpcmluZ0hhbmRsZXJMZTo6R2VuZXJhdGVPb2JEYXRhKCkpOwotICAqY29uZmlybWF0aW9uX3ZhbHVlID0gbG9jYWxfbGVfb29iX2RhdGFfLnZhbHVlKCkuYzsKLSAgKnJhbmRvbV92YWx1ZSA9IGxvY2FsX2xlX29vYl9kYXRhXy52YWx1ZSgpLnI7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6U2V0T3V0T2ZCYW5kRGF0YSgKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcywKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBjb25maXJtYXRpb25fdmFsdWUsCi0gICAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gcmFuZG9tX3ZhbHVlKSB7Ci0gIHJlbW90ZV9vb2JfZGF0YV9hZGRyZXNzXyA9IHJlbW90ZV9hZGRyZXNzOwotICByZW1vdGVfb29iX2RhdGFfbGVfc2NfY18gPSBjb25maXJtYXRpb25fdmFsdWU7Ci0gIHJlbW90ZV9vb2JfZGF0YV9sZV9zY19yXyA9IHJhbmRvbV92YWx1ZTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpTZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyhoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cykgewotICB0aGlzLT5sb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID0gYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OkludGVybmFsRW5mb3JjZVNlY3VyaXR5UG9saWN5KAotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwKLSAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5LAotICAgIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlOjpSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spIHsKLSAgaWYgKElzU2VjdXJpdHlSZXF1aXJlbWVudFNhdGlzZmllZChyZW1vdGUsIHBvbGljeSkpIHsKLSAgICAvLyBOb3RpZnkgY2xpZW50IGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgc2F0aXNmaWVkCi0gICAgc3RkOjptb3ZlKHJlc3VsdF9jYWxsYmFjaykuSW52b2tlKHRydWUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3QgbWVldCB0aGUgc2VjdXJpdHkgcmVxdWlyZW1lbnRzOyBtdXN0IHBhaXIKLSAgYXV0byByZWNvcmQgPSB0aGlzLT5zZWN1cml0eV9kYXRhYmFzZV8uRmluZE9yQ3JlYXRlKHJlbW90ZSk7Ci0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0ga0RlZmF1bHRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czsKLSAgZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfY2FsbGJhY2tfbWFwX1tyZW1vdGVdID0ge3BvbGljeSwgc3RkOjptb3ZlKHJlc3VsdF9jYWxsYmFjayl9OwotCi0gIHN3aXRjaCAocG9saWN5KSB7Ci0gICAgY2FzZSBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3k6OkJFU1Q6Ci0gICAgY2FzZSBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3k6OkFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgIC8vIEZvcmNlIE1JVE0gcmVxdWlyZW1lbnQgbG9jYWxseQotICAgICAgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6R0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5OjpFTkNSWVBURURfVFJBTlNQT1JUOgotICAgICAgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6R0VORVJBTF9CT05ESU5HOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8vIEkgY291bGQgaGVhciB0aGUgdm9pY2Ugb2YgTXlsZXMsICJUaGlzIHNob3VsZCBiZSBhbiBBU1NFUlQhIgotICAgICAgQVNTRVJUX0xPRyhmYWxzZSwgIlVucmVhY2hhYmxlIGNvZGUgcGF0aCIpOwotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HX1dBUk4oIkRpc3BhdGNoICMzIik7Ci0gIERpc3BhdGNoUGFpcmluZ0hhbmRsZXIoCi0gICAgICByZWNvcmQsCi0gICAgICB0cnVlLAotICAgICAgdGhpcy0+bG9jYWxfaW9fY2FwYWJpbGl0eV8sCi0gICAgICBzdGQ6OmFzX2NvbnN0KGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyksCi0gICAgICBwYWlyaW5nOjpPb2JEYXRhKCksCi0gICAgICBwYWlyaW5nOjpPb2JEYXRhKCkpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlckltcGw6OlVwZGF0ZUxpbmtTZWN1cml0eUNvbmRpdGlvbihoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUpIHsKLSAgYXV0byBlbnRyeSA9IGVuZm9yY2Vfc2VjdXJpdHlfcG9saWN5X2NhbGxiYWNrX21hcF8uZmluZChyZW1vdGUpOwotICBpZiAoZW50cnkgPT0gZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfY2FsbGJhY2tfbWFwXy5lbmQoKSkgewotICAgIExPR19FUlJPUigiTm8gTDJDQVAgc2VjdXJpdHkgcG9saWN5IGNhbGxiYWNrIHBlbmRpbmcgZm9yICVzIiwgcmVtb3RlLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6bW92ZShlbnRyeS0+c2Vjb25kLmNhbGxiYWNrXykuSW52b2tlKElzU2VjdXJpdHlSZXF1aXJlbWVudFNhdGlzZmllZChyZW1vdGUsIGVudHJ5LT5zZWNvbmQucG9saWN5XykpOwotICBlbmZvcmNlX3NlY3VyaXR5X3BvbGljeV9jYWxsYmFja19tYXBfLmVyYXNlKGVudHJ5KTsKLX0KLQotYm9vbCBTZWN1cml0eU1hbmFnZXJJbXBsOjpJc1NlY3VyaXR5UmVxdWlyZW1lbnRTYXRpc2ZpZWQoCi0gICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLCBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5KSB7Ci0gIGF1dG8gcmVjb3JkID0gc2VjdXJpdHlfZGF0YWJhc2VfLkZpbmRPckNyZWF0ZShyZW1vdGUpOwotICBzd2l0Y2ggKHBvbGljeSkgewotICAgIGNhc2UgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5OjpCRVNUOgotICAgIGNhc2UgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5OjpBVVRIRU5USUNBVEVEX0VOQ1JZUFRFRF9UUkFOU1BPUlQ6Ci0gICAgICByZXR1cm4gKHJlY29yZC0+SXNQYWlyZWQoKSAmJiByZWNvcmQtPklzQXV0aGVudGljYXRlZCgpKTsKLSAgICBjYXNlIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeTo6RU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgIHJldHVybiByZWNvcmQtPklzUGFpcmVkKCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VySW1wbDo6RW5mb3JjZVNlY3VyaXR5UG9saWN5KAotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwKLSAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5LAotICAgIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlOjpSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spIHsKLSAgTE9HX0lORk8oIkF0dGVtcHRpbmcgdG8gZW5mb3JjZSBzZWN1cml0eSBwb2xpY3kiKTsKLSAgYXV0byByZWNvcmQgPSBzZWN1cml0eV9kYXRhYmFzZV8uRmluZE9yQ3JlYXRlKHJlbW90ZSk7Ci0gIGlmICghcmVjb3JkLT5Jc1BhaXJpbmcoKSkgewotICAgIHRoaXMtPkludGVybmFsRW5mb3JjZVNlY3VyaXR5UG9saWN5KHJlbW90ZSwgcG9saWN5LCBzdGQ6Om1vdmUocmVzdWx0X2NhbGxiYWNrKSk7Ci0gIH0KLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXJJbXBsOjpFbmZvcmNlTGVTZWN1cml0eVBvbGljeSgKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsIGwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3kgcG9saWN5LAotICAgIGwyY2FwOjpsZTo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKSB7Ci0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0gIC8vIFRPRE8oanBhd2xvd3NraSk6IEltcGxlbWVudCBmb3IgTEUKLSAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICBjYXNlIGwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3k6OkJFU1Q6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3k6OkFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbDJjYXA6OmxlOjpTZWN1cml0eVBvbGljeTo6RU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbDJjYXA6OmxlOjpTZWN1cml0eVBvbGljeTo6Tk9fU0VDVVJJVFlfV0hBVFNPRVZFUl9QTEFJTlRFWFRfVFJBTlNQT1JUX09LOgotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbDJjYXA6OmxlOjpTZWN1cml0eVBvbGljeTo6X05PVF9GT1JfWU9VX19BVVRIRU5USUNBVEVEX1BBSVJJTkdfV0lUSF8xMjhfQklUX0tFWToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbDJjYXA6OmxlOjpTZWN1cml0eVBvbGljeTo6X05PVF9GT1JfWU9VX19BVVRIT1JJWkFUSU9OOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmVzdWx0X2NhbGxiYWNrLkludm9rZShyZXN1bHQpOwotfQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L2ludGVybmFsL3NlY3VyaXR5X21hbmFnZXJfaW1wbC5oIGIvZ2Qvc2VjdXJpdHkvaW50ZXJuYWwvc2VjdXJpdHlfbWFuYWdlcl9pbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjQyM2YuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvaW50ZXJuYWwvc2VjdXJpdHlfbWFuYWdlcl9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdG9yYWdlL3N0b3JhZ2VfbW9kdWxlLmg+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJsMmNhcC9jbGFzc2ljL3NlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImwyY2FwL2xlL2wyY2FwX2xlX21vZHVsZS5oIgotI2luY2x1ZGUgImwyY2FwL2xlL3NlY3VyaXR5X2VuZm9yY2VtZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm5laWdoYm9yL25hbWVfZGIuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvY2hhbm5lbC9zZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9pbml0aWFsX2luZm9ybWF0aW9ucy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmcvY2xhc3NpY19wYWlyaW5nX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9wYWlyaW5nL29vYl9kYXRhLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZC5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3JlY29yZC9zZWN1cml0eV9yZWNvcmRfZGF0YWJhc2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1jbGFzcyBJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXI7Ci0KLXN0YXRpYyBjb25zdGV4cHIgaGNpOjpJb0NhcGFiaWxpdHkga0RlZmF1bHRJb0NhcGFiaWxpdHkgPSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk87Ci1zdGF0aWMgY29uc3RleHByIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMga0RlZmF1bHRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyA9Ci0gICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6R0VORVJBTF9CT05ESU5HOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdHJ1Y3QgTGVGaXhlZENoYW5uZWxFbnRyeSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6bGU6OkZpeGVkQ2hhbm5lbD4gY2hhbm5lbF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxvczo6RW5xdWV1ZUJ1ZmZlcjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4gZW5xdWV1ZV9idWZmZXJfOwotfTsKLQotY2xhc3MgU2VjdXJpdHlNYW5hZ2VySW1wbCA6IHB1YmxpYyBjaGFubmVsOjpJU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbExpc3RlbmVyLCBwdWJsaWMgVUlDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2VjdXJpdHlNYW5hZ2VySW1wbCgKLSAgICAgIG9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyLAotICAgICAgbDJjYXA6OmxlOjpMMmNhcExlTW9kdWxlKiBsMmNhcF9sZV9tb2R1bGUsCi0gICAgICBjaGFubmVsOjpTZWN1cml0eU1hbmFnZXJDaGFubmVsKiBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwsCi0gICAgICBoY2k6OkhjaUxheWVyKiBoY2lfbGF5ZXIsCi0gICAgICBoY2k6OkFjbE1hbmFnZXIqIGFjbF9tYW5hZ2VyLAotICAgICAgaGNpOjpDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgc3RvcmFnZTo6U3RvcmFnZU1vZHVsZSogc3RvcmFnZV9tb2R1bGUsCi0gICAgICBuZWlnaGJvcjo6TmFtZURiTW9kdWxlKiBuYW1lX2RiX21vZHVsZSk7Ci0KLSAgflNlY3VyaXR5TWFuYWdlckltcGwoKSB7Ci0gICAgLyogTDJDQVAgbGF5ZXIgZG9lc24ndCBndWFyYW50ZWUgdG8gc2VuZCB0aGUgcmVnaXN0ZXJlZCBPbkNsb3NlQ2FsbGJhY2sgZHVyaW5nIHNodXRkb3duLiBDbGVhbnVwIHRoZSByZW1haW5pbmcKLSAgICAgKiBxdWV1ZXMgdG8gcHJldmVudCBjcmFzaGVzICovCi0gICAgZm9yIChhdXRvJiBzdG9yZWRfY2hhbiA6IGFsbF9jaGFubmVsc18pIHsKLSAgICAgIHN0b3JlZF9jaGFuLmNoYW5uZWxfLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgICBzdG9yZWRfY2hhbi5lbnF1ZXVlX2J1ZmZlcl8ucmVzZXQoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBbGwgQVBJcyBtdXN0IGJlIGludm9rZWQgaW4gU00gbGF5ZXIgaGFuZGxlcgotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBzZWN1cml0eSByZWNvcmQgbWFwIGZyb20gYW4gaW50ZXJuYWwgZGV2aWNlIGRhdGFiYXNlLgotICAgKi8KLSAgdm9pZCBJbml0KCk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlcyBib25kIG92ZXIgQ2xhc3NpYyB0cmFuc3BvcnQgd2l0aCBkZXZpY2UsIGlmIG5vdCBib25kZWQgeWV0LgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBkZXZpY2UgYWRkcmVzcyB3ZSB3YW50IHRvIGJvbmQgd2l0aAotICAgKi8KLSAgdm9pZCBDcmVhdGVCb25kKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBJbml0aWF0ZXMgYm9uZCBvdmVyIENsYXNzaWMgdHJhbnNwb3J0IHdpdGggZGV2aWNlLCBpZiBub3QgYm9uZGVkIHlldC4KLSAgICoKLSAgICogQWxsb3dzIGZvciBPb2JEYXRhIHRvIGJlIHBhc3NlZCBpbiBmb3IgdXNlIHdoaWxlIHBhaXJpbmcKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFkZHJlc3Mgd2Ugd2FudCB0byBib25kIHdpdGgKLSAgICogQHBhcmFtIHJlbW90ZV9wMTkyX29vYl9kYXRhIFAxOTIgZGF0YSBnaXZlbiB0byB0aGUgc3RhY2sKLSAgICogQHBhcmFtIHJlbW90ZV9wMjU2X29vYl9kYXRhIFAyNTYgZGF0YSBnaXZlbiB0byB0aGUgc3RhY2sKLSAgICovCi0gIHZvaWQgQ3JlYXRlQm9uZE91dE9mQmFuZCgKLSAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MsIHBhaXJpbmc6Ok9vYkRhdGEgcmVtb3RlX3AxOTJfb29iX2RhdGEsIHBhaXJpbmc6Ok9vYkRhdGEgcmVtb3RlX3AyNTZfb29iX2RhdGEpOwotCi0gIC8qKgotICAgKiBJbml0aWF0ZXMgYm9uZCBvdmVyIExvdyBFbmVyZ3kgdHJhbnNwb3J0IHdpdGggZGV2aWNlLCBpZiBub3QgYm9uZGVkIHlldC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFkZHJlc3Mgd2Ugd2FudCB0byBib25kIHdpdGgKLSAgICovCi0gIHZvaWQgQ3JlYXRlQm9uZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpOwotCi0gIC8qIHZvaWQgQ3JlYXRlQm9uZChzdGQ6OnNoYXJlZF9wdHI8aGNpOjpMZURldmljZT4gZGV2aWNlKTsgKi8KLQotICAvKioKLSAgICogQ2FuY2VscyB0aGUgcGFpcmluZyBwcm9jZXNzIGZvciB0aGlzIGRldmljZS4KLSAgICoKLSAgICogQHBhcmFtIGRldmljZSBwb2ludGVyIHRvIGRldmljZSB3aXRoIHdoaWNoIHdlIHdhbnQgdG8gY2FuY2VsIG91ciBib25kCi0gICAqLwotICB2b2lkIENhbmNlbEJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKTsKLQotICAvKiB2b2lkIENhbmNlbEJvbmQoc3RkOjpzaGFyZWRfcHRyPGhjaTo6TGVEZXZpY2U+IGRldmljZSk7ICovCi0KLSAgLyoqCi0gICAqIERpc2Fzc29jaWF0ZXMgdGhlIGRldmljZSBhbmQgcmVtb3ZlcyB0aGUgcGVyc2lzdGVudCBMVEsKLSAgICoKLSAgICogQHBhcmFtIGRldmljZSBwb2ludGVyIHRvIGRldmljZSB3ZSB3YW50IHRvIGZvcmdldAotICAgKiBAcmV0dXJuIHRydWUgaWYgcmVtb3ZlZAotICAgKi8KLSAgdm9pZCBSZW1vdmVCb25kKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSk7Ci0KLSAgLyogdm9pZCBSZW1vdmVCb25kKHN0ZDo6c2hhcmVkX3B0cjxoY2k6OkxlRGV2aWNlPiBkZXZpY2UpOyAqLwotCi0gIC8qKgotICAgKiBSZWdpc3RlciBTZWN1cml0eSBVSSBoYW5kbGVyLCBmb3IgaGFuZGxpbmcgcHJvbXB0cyBhcm91bmQgdGhlIFBhaXJpbmcgcHJvY2Vzcy4KLSAgICovCi0gIHZvaWQgU2V0VXNlckludGVyZmFjZUhhbmRsZXIoVUkqIHVzZXJfaW50ZXJmYWNlLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgLyoqCi0gICAqIFNwZWNpZnkgdGhlIGluaXRpYXRvciBhZGRyZXNzIHBvbGljeSB1c2VkIGZvciBMRSB0cmFuc3BvcnQuIENhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotICAgKi8KLSAgdm9pZCBTZXRMZUluaXRpYXRvckFkZHJlc3NQb2xpY3lGb3JUZXN0KAotICAgICAgaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZml4ZWRfYWRkcmVzcywKLSAgICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IHJvdGF0aW9uX2lyaywKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0byBsaXN0ZW4gZm9yIGNhbGxiYWNrIGV2ZW50cyBmcm9tIFNlY3VyaXR5TWFuYWdlcgotICAgKgotICAgKiBAcGFyYW0gbGlzdGVuZXIgSVNlY3VyaXR5TWFuYWdlckxpc3RlbmVyIGluc3RhbmNlIHRvIGhhbmRsZSBjYWxsYmFja3MKLSAgICovCi0gIHZvaWQgUmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKElTZWN1cml0eU1hbmFnZXJMaXN0ZW5lciogbGlzdGVuZXIsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKTsKLQotICAvKioKLSAgICogVW5yZWdpc3RlciBsaXN0ZW5lciBmb3IgY2FsbGJhY2sgZXZlbnRzIGZyb20gU2VjdXJpdHlNYW5hZ2VyCi0gICAqCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIgaW5zdGFuY2UgdG8gdW5yZWdpc3RlcgotICAgKi8KLSAgdm9pZCBVbnJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvKioKLSAgICogSGFuZGxlIHRoZSBldmVudHMgc2VudCBiYWNrIGZyb20gSENJIHRoYXQgd2UgY2FyZSBhYm91dAotICAgKgotICAgKiBAcGFyYW0gcGFja2V0IGRhdGEgcmVjZWl2ZWQgZnJvbSBIQ0kKLSAgICovCi0gIHZvaWQgT25IY2lFdmVudFJlY2VpdmVkKGhjaTo6RXZlbnRWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFdoZW4gYSBjb25uY2V0aW9uIGNsb3NlcyB3ZSBzaG91bGQgY2xlYW4gdXAgdGhlIHBhaXJpbmcgaGFuZGxlcgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBSZW1vdGUgYWRkcmVzcwotICAgKi8KLSAgdm9pZCBPbkNvbm5lY3Rpb25DbG9zZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBQYWlyaW5nIGhhbmRsZXIgaGFzIGZpbmlzaGVkIG9yIGNhbmNlbGxlZAotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIGZvciBwYWlyaW5nIGhhbmRsZXIKLSAgICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgZnJvbSBTaW1wbGVQYWlyaW5nQ29tcGxldGUgb3Igb3RoZXIgZXJyb3IgY29kZQotICAgKi8KLSAgdm9pZCBPblBhaXJpbmdIYW5kbGVyQ29tcGxldGUoaGNpOjpBZGRyZXNzIGFkZHJlc3MsIFBhaXJpbmdSZXN1bHRPckZhaWx1cmUgc3RhdHVzKTsKLQotICAvLyBVSUNhbGxiYWNrcyBpbXBsZW1lbnRhdGlvbgotICB2b2lkIE9uUGFpcmluZ1Byb21wdEFjY2VwdGVkKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIGJvb2wgY29uZmlybWVkKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNvbmZpcm1ZZXNObyhjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBib29sIGNvbmZpcm1lZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QYXNza2V5RW50cnkoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgdWludDMyX3QgcGFzc2tleSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QaW5FbnRyeShjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwaW4pIG92ZXJyaWRlOwotCi0gIC8vIEZhY2FkZSBDb25maWd1cmF0aW9uIEFQSSBmdW5jdGlvbnMKLSAgdXNpbmcgRmFjYWRlRGlzY29ubmVjdENhbGxiYWNrID0gY29tbW9uOjpDYWxsYmFjazx2b2lkKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUpPjsKLSAgdm9pZCBTZXREaXNjb25uZWN0Q2FsbGJhY2soRmFjYWRlRGlzY29ubmVjdENhbGxiYWNrIGNhbGxiYWNrKTsKLSAgdm9pZCBTZXRJb0NhcGFiaWxpdHkoaGNpOjpJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eSk7Ci0gIHZvaWQgU2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMoaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpOwotICB2b2lkIEdldE91dE9mQmFuZERhdGEoY2hhbm5lbDo6U2VjdXJpdHlDb21tYW5kU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spOwotICB2b2lkIFNldExlSW9DYXBhYmlsaXR5KHNlY3VyaXR5OjpJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eSk7Ci0gIHZvaWQgU2V0TGVBdXRoUmVxdWlyZW1lbnRzKHVpbnQ4X3QgYXV0aF9yZXEpOwotICB2b2lkIFNldExlTWF4aW11bUVuY3J5cHRpb25LZXlTaXplKHVpbnQ4X3QgbWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplKTsKLSAgdm9pZCBTZXRMZU9vYkRhdGFQcmVzZW50KE9vYkRhdGFGbGFnIGRhdGFfcHJlc2VudCk7Ci0gIHZvaWQgR2V0TGVPdXRPZkJhbmREYXRhKHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiBjb25maXJtYXRpb25fdmFsdWUsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KiByYW5kb21fdmFsdWUpOwotICB2b2lkIFNldE91dE9mQmFuZERhdGEoCi0gICAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzcywKLSAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGNvbmZpcm1hdGlvbl92YWx1ZSwKLSAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IHJhbmRvbV92YWx1ZSk7Ci0KLSAgdm9pZCBFbmZvcmNlU2VjdXJpdHlQb2xpY3koaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLCBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKTsKLSAgdm9pZCBFbmZvcmNlTGVTZWN1cml0eVBvbGljeShoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsIGwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3kgcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY2FwOjpsZTo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKTsKLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIqLCBvczo6SGFuZGxlcio+PiBsaXN0ZW5lcnNfOwotICBVSSogdXNlcl9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfID0gbnVsbHB0cjsKLQotICB2b2lkIE5vdGlmeURldmljZUJvbmRlZChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpOwotICB2b2lkIE5vdGlmeURldmljZUJvbmRGYWlsZWQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBQYWlyaW5nRmFpbHVyZSBzdGF0dXMpOwotICB2b2lkIE5vdGlmeURldmljZVVuYm9uZGVkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSk7Ci0gIHZvaWQgTm90aWZ5RW5jcnlwdGlvblN0YXRlQ2hhbmdlZChoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcpOwotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIHZvaWQgSGFuZGxlRXZlbnQoVCBwYWNrZXQpOwotCi0gIHZvaWQgRGlzcGF0Y2hQYWlyaW5nSGFuZGxlcigKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPiByZWNvcmQsCi0gICAgICBib29sIGxvY2FsbHlfaW5pdGlhdGVkLAotICAgICAgaGNpOjpJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eSwKLSAgICAgIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgYXV0aF9yZXF1aXJlbWVudHMsCi0gICAgICBwYWlyaW5nOjpPb2JEYXRhIHJlbW90ZV9wMTkyX29vYl9kYXRhXywKLSAgICAgIHBhaXJpbmc6Ok9vYkRhdGEgcmVtb3RlX3AyNTZfb29iX2RhdGFfKTsKLSAgdm9pZCBPbkwyY2FwUmVnaXN0cmF0aW9uQ29tcGxldGVMZShsMmNhcDo6bGU6OkZpeGVkQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpsZTo6Rml4ZWRDaGFubmVsU2VydmljZT4gbGVfc21wX3NlcnZpY2UpOwotICB2b2lkIE9uU21wQ29tbWFuZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSk7Ci0gIHZvaWQgT25Db25uZWN0aW9uT3BlbkxlKHN0ZDo6dW5pcXVlX3B0cjxsMmNhcDo6bGU6OkZpeGVkQ2hhbm5lbD4gY2hhbm5lbCk7Ci0gIHZvaWQgT25Db25uZWN0aW9uQ2xvc2VkTGUoaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcywgaGNpOjpFcnJvckNvZGUgZXJyb3JfY29kZSk7Ci0gIHZvaWQgT25Db25uZWN0aW9uRmFpbHVyZUxlKGJsdWV0b290aDo6bDJjYXA6OmxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCk7Ci0gIHZvaWQgT25QYWlyaW5nRmluaXNoZWQoYmx1ZXRvb3RoOjpzZWN1cml0eTo6UGFpcmluZ1Jlc3VsdE9yRmFpbHVyZSBwYWlyaW5nX3Jlc3VsdCk7Ci0gIHZvaWQgT25IY2lMZUV2ZW50KGhjaTo6TGVNZXRhRXZlbnRWaWV3IGV2ZW50KTsKLSAgTGVGaXhlZENoYW5uZWxFbnRyeSogRmluZFN0b3JlZExlQ2hhbm5lbChjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgZGV2aWNlKTsKLSAgTGVGaXhlZENoYW5uZWxFbnRyeSogRmluZFN0b3JlZExlQ2hhbm5lbCh1aW50OF90IGNvbm5lY3Rpb25faGFuZGxlKTsKLSAgYm9vbCBFcmFzZVN0b3JlZExlQ2hhbm5lbChjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgZGV2aWNlKTsKLSAgdm9pZCBJbnRlcm5hbEVuZm9yY2VTZWN1cml0eVBvbGljeSgKLSAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwKLSAgICAgIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeSBwb2xpY3ksCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKTsKLSAgdm9pZCBVcGRhdGVMaW5rU2VjdXJpdHlDb25kaXRpb24oaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlKTsKLSAgYm9vbCBJc1NlY3VyaXR5UmVxdWlyZW1lbnRTYXRpc2ZpZWQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLCBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5KTsKLSAgdm9pZCBDb25uZWN0aW9uSXNSZWFkeVN0YXJ0UGFpcmluZyhMZUZpeGVkQ2hhbm5lbEVudHJ5KiBzdG9yZWRfY2hhbm5lbCk7Ci0gIHZvaWQgV2lwZUxlUGFpcmluZ0hhbmRsZXIoKTsKLQotICBvczo6SGFuZGxlciogc2VjdXJpdHlfaGFuZGxlcl8gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZSogbDJjYXBfbGVfbW9kdWxlXyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPGwyY2FwOjpsZTo6Rml4ZWRDaGFubmVsTWFuYWdlcj4gbDJjYXBfbWFuYWdlcl9sZV87Ci0gIGhjaTo6TGVTZWN1cml0eUludGVyZmFjZSogaGNpX3NlY3VyaXR5X2ludGVyZmFjZV9sZV8gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIGNoYW5uZWw6OlNlY3VyaXR5TWFuYWdlckNoYW5uZWwqIHNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbF87Ci0gIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXJfOwotICBoY2k6OkNvbnRyb2xsZXIqIGNvbnRyb2xsZXJfOwotICBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZV8gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIHJlY29yZDo6U2VjdXJpdHlSZWNvcmRTdG9yYWdlIHNlY3VyaXR5X3JlY29yZF9zdG9yYWdlXzsKLSAgcmVjb3JkOjpTZWN1cml0eVJlY29yZERhdGFiYXNlIHNlY3VyaXR5X2RhdGFiYXNlXzsKLSAgbmVpZ2hib3I6Ok5hbWVEYk1vZHVsZSogbmFtZV9kYl9tb2R1bGVfOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzLCBzdGQ6OnNoYXJlZF9wdHI8cGFpcmluZzo6UGFpcmluZ0hhbmRsZXI+PiBwYWlyaW5nX2hhbmRsZXJfbWFwXzsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgbG9jYWxfaW9fY2FwYWJpbGl0eV8gPSBrRGVmYXVsdElvQ2FwYWJpbGl0eTsKLSAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID0ga0RlZmF1bHRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czsKLSAgc2VjdXJpdHk6OklvQ2FwYWJpbGl0eSBsb2NhbF9sZV9pb19jYXBhYmlsaXR5XyA9IHNlY3VyaXR5OjpJb0NhcGFiaWxpdHk6OktFWUJPQVJEX0RJU1BMQVk7Ci0gIHVpbnQ4X3QgbG9jYWxfbGVfYXV0aF9yZXFfID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2M7Ci0gIHVpbnQ4X3QgbG9jYWxfbWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplXyA9IDB4MTA7Ci0gIE9vYkRhdGFGbGFnIGxvY2FsX2xlX29vYl9kYXRhX3ByZXNlbnRfID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5UOwotICBzdGQ6Om9wdGlvbmFsPE15T29iRGF0YT4gbG9jYWxfbGVfb29iX2RhdGFfOwotICBzdGQ6Om9wdGlvbmFsPGhjaTo6QWRkcmVzc1dpdGhUeXBlPiByZW1vdGVfb29iX2RhdGFfYWRkcmVzc187Ci0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IHJlbW90ZV9vb2JfZGF0YV9sZV9zY19jXzsKLSAgc3RkOjpvcHRpb25hbDxjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNj4gcmVtb3RlX29vYl9kYXRhX2xlX3NjX3JfOwotICBzdGQ6Om9wdGlvbmFsPEZhY2FkZURpc2Nvbm5lY3RDYWxsYmFjaz4gZmFjYWRlX2Rpc2Nvbm5lY3RfY2FsbGJhY2tfOwotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBsb2NhbF9pZGVudGl0eV9hZGRyZXNzXzsKLSAgY3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTYgbG9jYWxfaWRlbnRpdHlfcmVzb2x2aW5nX2tleV87Ci0KLSAgc3RydWN0IFBlbmRpbmdTZWN1cml0eUVuZm9yY2VtZW50RW50cnkgewotICAgIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeSBwb2xpY3lfOwotICAgIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlOjpSZXN1bHRDYWxsYmFjayBjYWxsYmFja187Ci0gIH07Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxoY2k6OkFkZHJlc3NXaXRoVHlwZSwgUGVuZGluZ1NlY3VyaXR5RW5mb3JjZW1lbnRFbnRyeT4gZW5mb3JjZV9zZWN1cml0eV9wb2xpY3lfY2FsbGJhY2tfbWFwXzsKLQotICBzdHJ1Y3QgewotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3NfOwotICAgIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFpcmluZ0hhbmRsZXJMZT4gaGFuZGxlcl87Ci0gIH0gcGVuZGluZ19sZV9wYWlyaW5nXzsKLQotICBzdGQ6Omxpc3Q8TGVGaXhlZENoYW5uZWxFbnRyeT4gYWxsX2NoYW5uZWxzXzsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvbDJjYXBfc2VjdXJpdHlfbW9kdWxlX2ludGVyZmFjZS5jYyBiL2dkL3NlY3VyaXR5L2wyY2FwX3NlY3VyaXR5X21vZHVsZV9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOWQwNmIuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvbDJjYXBfc2VjdXJpdHlfbW9kdWxlX2ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAic2VjdXJpdHkvbDJjYXBfc2VjdXJpdHlfbW9kdWxlX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotTDJjYXBTZWN1cml0eU1vZHVsZUludGVyZmFjZTo6TDJjYXBTZWN1cml0eU1vZHVsZUludGVyZmFjZShpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbCogc2VjdXJpdHlfbWFuYWdlcl9pbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczo6SGFuZGxlciogc2VjdXJpdHlfaGFuZGxlcikKLSAgICA6IHNlY3VyaXR5X21hbmFnZXJfaW1wbF8oc2VjdXJpdHlfbWFuYWdlcl9pbXBsKSwgc2VjdXJpdHlfaGFuZGxlcl8oc2VjdXJpdHlfaGFuZGxlcikge30KLQotdm9pZCBMMmNhcFNlY3VyaXR5TW9kdWxlSW50ZXJmYWNlOjpFbmZvcmNlKAotICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgbDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5IHBvbGljeSwKLSAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKSB7Ci0gIHRoaXMtPnNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OkVuZm9yY2VTZWN1cml0eVBvbGljeSwgY29tbW9uOjpVbnJldGFpbmVkKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8pLAotICAgICAgc3RkOjpmb3J3YXJkPGhjaTo6QWRkcmVzc1dpdGhUeXBlPihyZW1vdGUpLCBzdGQ6OmZvcndhcmQ8bDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5UG9saWN5Pihwb2xpY3kpLAotICAgICAgc3RkOjpmb3J3YXJkPGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlOjpSZXN1bHRDYWxsYmFjaz4ocmVzdWx0X2NhbGxiYWNrKSkpOwotfQotCi12b2lkIEwyY2FwU2VjdXJpdHlNb2R1bGVJbnRlcmZhY2U6OkVuZm9yY2UoaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLCBsMmNhcDo6bGU6OlNlY3VyaXR5UG9saWN5IHBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNhcDo6bGU6OlNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2U6OlJlc3VsdENhbGxiYWNrIHJlc3VsdF9jYWxsYmFjaykgewotICB0aGlzLT5zZWN1cml0eV9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKAotICAgICAgJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpFbmZvcmNlTGVTZWN1cml0eVBvbGljeSwgY29tbW9uOjpVbnJldGFpbmVkKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8pLAotICAgICAgc3RkOjpmb3J3YXJkPGhjaTo6QWRkcmVzc1dpdGhUeXBlPihyZW1vdGUpLCBzdGQ6OmZvcndhcmQ8bDJjYXA6OmxlOjpTZWN1cml0eVBvbGljeT4ocG9saWN5KSwKLSAgICAgIHN0ZDo6Zm9yd2FyZDxsMmNhcDo6bGU6OlNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2U6OlJlc3VsdENhbGxiYWNrPihyZXN1bHRfY2FsbGJhY2spKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvbDJjYXBfc2VjdXJpdHlfbW9kdWxlX2ludGVyZmFjZS5oIGIvZ2Qvc2VjdXJpdHkvbDJjYXBfc2VjdXJpdHlfbW9kdWxlX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThmYzhlLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L2wyY2FwX3NlY3VyaXR5X21vZHVsZV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImwyY2FwL2NsYXNzaWMvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvc2VjdXJpdHlfZW5mb3JjZW1lbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2ludGVybmFsL3NlY3VyaXR5X21hbmFnZXJfaW1wbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1jbGFzcyBMMmNhcFNlY3VyaXR5TW9kdWxlSW50ZXJmYWNlIDogcHVibGljIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsMmNhcDo6bGU6OlNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTDJjYXBTZWN1cml0eU1vZHVsZUludGVyZmFjZShpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbCogc2VjdXJpdHlfbWFuYWdlcl9pbXBsLCBvczo6SGFuZGxlciogc2VjdXJpdHlfaGFuZGxlcik7Ci0gIHZvaWQgRW5mb3JjZShoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsIGwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeSBwb2xpY3ksCi0gICAgICAgICAgICAgICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZTo6UmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKSBvdmVycmlkZTsKLSAgdm9pZCBFbmZvcmNlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgbDJjYXA6OmxlOjpTZWN1cml0eVBvbGljeSBwb2xpY3ksCi0gICAgICAgICAgICAgICBsMmNhcDo6bGU6OlNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2U6OlJlc3VsdENhbGxiYWNrIHJlc3VsdF9jYWxsYmFjaykgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbCogc2VjdXJpdHlfbWFuYWdlcl9pbXBsXzsKLSAgb3M6OkhhbmRsZXIqIHNlY3VyaXR5X2hhbmRsZXJfID0gbnVsbHB0cjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcGFpcmluZy9BbmRyb2lkLmJwIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVmMzJiLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFNlY3VyaXR5UGFpcmluZ1NvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNsYXNzaWNfcGFpcmluZ19oYW5kbGVyLmNjIiwKLSAgICBdCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFNlY3VyaXR5UGFpcmluZ1Rlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjbGFzc2ljX3BhaXJpbmdfaGFuZGxlcl91bml0dGVzdC5jYyIsCi0gICAgXQotfQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcGFpcmluZy9jbGFzc2ljX3BhaXJpbmdfaGFuZGxlci5jYyBiL2dkL3NlY3VyaXR5L3BhaXJpbmcvY2xhc3NpY19wYWlyaW5nX2hhbmRsZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmEyOTMuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvcGFpcmluZy9jbGFzc2ljX3BhaXJpbmdfaGFuZGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZy9jbGFzc2ljX3BhaXJpbmdfaGFuZGxlci5oIgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJuZWlnaGJvci9uYW1lLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLW5hbWVzcGFjZSBwYWlyaW5nIHsKLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok5vdGlmeVVpRGlzcGxheVllc05vKHVpbnQzMl90IG51bWVyaWNfdmFsdWUpIHsKLSAgQVNTRVJUKHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICBDb25maXJtYXRpb25EYXRhIGRhdGEoKkdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCksIGRldmljZV9uYW1lXywgbnVtZXJpY192YWx1ZSk7Ci0gIGRhdGEuU2V0UmVtb3RlSW9DYXBzKHJlbW90ZV9pb19jYXBhYmlsaXR5Xyk7Ci0gIGRhdGEuU2V0UmVtb3RlQXV0aFJlcXMocmVtb3RlX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18pOwotICBkYXRhLlNldFJlbW90ZU9vYkRhdGFQcmVzZW50KHJlbW90ZV9vb2JfcHJlc2VudF8pOwotICB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXy0+Q2FsbE9uKHVzZXJfaW50ZXJmYWNlXywgJlVJOjpEaXNwbGF5Q29uZmlybVZhbHVlLCBkYXRhKTsKLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok5vdGlmeVVpRGlzcGxheVllc05vKCkgewotICBBU1NFUlQodXNlcl9pbnRlcmZhY2VfaGFuZGxlcl8gIT0gbnVsbHB0cik7Ci0gIENvbmZpcm1hdGlvbkRhdGEgZGF0YSgqR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKSwgZGV2aWNlX25hbWVfKTsKLSAgZGF0YS5TZXRSZW1vdGVJb0NhcHMocmVtb3RlX2lvX2NhcGFiaWxpdHlfKTsKLSAgZGF0YS5TZXRSZW1vdGVBdXRoUmVxcyhyZW1vdGVfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyk7Ci0gIGRhdGEuU2V0UmVtb3RlT29iRGF0YVByZXNlbnQocmVtb3RlX29vYl9wcmVzZW50Xyk7Ci0gIHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfLT5DYWxsT24odXNlcl9pbnRlcmZhY2VfLCAmVUk6OkRpc3BsYXlZZXNOb0RpYWxvZywgZGF0YSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpOb3RpZnlVaURpc3BsYXlQYXNza2V5KHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgQVNTRVJUKHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICBDb25maXJtYXRpb25EYXRhIGRhdGEoKkdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCksIGRldmljZV9uYW1lXywgcGFzc2tleSk7Ci0gIGRhdGEuU2V0UmVtb3RlSW9DYXBzKHJlbW90ZV9pb19jYXBhYmlsaXR5Xyk7Ci0gIGRhdGEuU2V0UmVtb3RlQXV0aFJlcXMocmVtb3RlX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18pOwotICBkYXRhLlNldFJlbW90ZU9vYkRhdGFQcmVzZW50KHJlbW90ZV9vb2JfcHJlc2VudF8pOwotICB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXy0+Q2FsbE9uKHVzZXJfaW50ZXJmYWNlXywgJlVJOjpEaXNwbGF5UGFzc2tleSwgZGF0YSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpOb3RpZnlVaURpc3BsYXlQYXNza2V5SW5wdXQoKSB7Ci0gIEFTU0VSVCh1c2VyX2ludGVyZmFjZV9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgQ29uZmlybWF0aW9uRGF0YSBkYXRhKCpHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLCBkZXZpY2VfbmFtZV8pOwotICBkYXRhLlNldFJlbW90ZUlvQ2FwcyhyZW1vdGVfaW9fY2FwYWJpbGl0eV8pOwotICBkYXRhLlNldFJlbW90ZUF1dGhSZXFzKHJlbW90ZV9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfKTsKLSAgZGF0YS5TZXRSZW1vdGVPb2JEYXRhUHJlc2VudChyZW1vdGVfb29iX3ByZXNlbnRfKTsKLSAgdXNlcl9pbnRlcmZhY2VfaGFuZGxlcl8tPkNhbGxPbih1c2VyX2ludGVyZmFjZV8sICZVSTo6RGlzcGxheUVudGVyUGFzc2tleURpYWxvZywgZGF0YSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpOb3RpZnlVaURpc3BsYXlQaW5Db2RlSW5wdXQoKSB7Ci0gIEFTU0VSVCh1c2VyX2ludGVyZmFjZV9oYW5kbGVyXyAhPSBudWxscHRyKTsKLSAgQ29uZmlybWF0aW9uRGF0YSBkYXRhKCpHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLCBkZXZpY2VfbmFtZV8pOwotICBkYXRhLlNldFJlbW90ZUlvQ2FwcyhyZW1vdGVfaW9fY2FwYWJpbGl0eV8pOwotICBkYXRhLlNldFJlbW90ZUF1dGhSZXFzKHJlbW90ZV9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfKTsKLSAgZGF0YS5TZXRSZW1vdGVPb2JEYXRhUHJlc2VudChyZW1vdGVfb29iX3ByZXNlbnRfKTsKLSAgdXNlcl9pbnRlcmZhY2VfaGFuZGxlcl8tPkNhbGxPbih1c2VyX2ludGVyZmFjZV8sICZVSTo6RGlzcGxheUVudGVyUGluRGlhbG9nLCBkYXRhKTsKLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok5vdGlmeVVpRGlzcGxheUNhbmNlbCgpIHsKLSAgQVNTRVJUKHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfICE9IG51bGxwdHIpOwotICB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXy0+Q2FsbE9uKHVzZXJfaW50ZXJmYWNlXywgJlVJOjpDYW5jZWwsICpHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpKTsKLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uUGFpcmluZ1Byb21wdEFjY2VwdGVkKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIGJvb2wgY29uZmlybWVkKSB7Ci0gIC8vIE5PVEU6IFRoaXMgaXMgbm90IHVzZWQgYnkgQ2xhc3NpYywgb25seSBieSBMRQotICBMT0dfQUxXQVlTX0ZBVEFMKCJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ2xhc3NpYyBQYWlyaW5nIEhhbmRsZXIsIG9ubHkgTEUiKTsKLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uQ29uZmlybVllc05vKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIGJvb2wgY29uZmlybWVkKSB7Ci0gIGlmIChjb25maXJtZWQpIHsKLSAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKAotICAgICAgICBoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHlCdWlsZGVyOjpDcmVhdGUoR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZCgKLSAgICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gIH0KLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uUGFzc2tleUVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZChoY2k6OlVzZXJQYXNza2V5UmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MuR2V0QWRkcmVzcygpLCBwYXNza2V5KSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblBpbkVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBpbikgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBwYWRkZWRfcGluOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2ICYmIGkgPCBwaW4uc2l6ZSgpOyBpKyspIHsKLSAgICBwYWRkZWRfcGluW2ldID0gcGluW2ldOwotICB9Ci0gIExPR19JTkZPKCIlcyIsIGFkZHJlc3MuR2V0QWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoaGNpOjpQaW5Db2RlUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MuR2V0QWRkcmVzcygpLCBwaW4uc2l6ZSgpLCBwYWRkZWRfcGluKSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpJbml0aWF0ZSgKLSAgICBib29sIGxvY2FsbHlfaW5pdGlhdGVkLAotICAgIGhjaTo6SW9DYXBhYmlsaXR5IGlvX2NhcGFiaWxpdHksCi0gICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoX3JlcXVpcmVtZW50cywKLSAgICBPb2JEYXRhIHJlbW90ZV9wMTkyX29vYl9kYXRhLAotICAgIE9vYkRhdGEgcmVtb3RlX3AyNTZfb29iX2RhdGEpIHsKLSAgTE9HX0lORk8oIkluaXRpYXRlIik7Ci0gIGxvY2FsbHlfaW5pdGlhdGVkXyA9IGxvY2FsbHlfaW5pdGlhdGVkOwotICBsb2NhbF9pb19jYXBhYmlsaXR5XyA9IGlvX2NhcGFiaWxpdHk7Ci0gIGxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPSBhdXRoX3JlcXVpcmVtZW50czsKLSAgcmVtb3RlX3AxOTJfb29iX2RhdGFfID0gcmVtb3RlX3AxOTJfb29iX2RhdGE7Ci0gIHJlbW90ZV9wMjU2X29vYl9kYXRhXyA9IHJlbW90ZV9wMjU2X29vYl9kYXRhOwotICBib29sIGhhczE5MiA9IHJlbW90ZV9wMTkyX29vYl9kYXRhLklzVmFsaWQoKTsKLSAgYm9vbCBoYXMyNTYgPSByZW1vdGVfcDI1Nl9vb2JfZGF0YS5Jc1ZhbGlkKCk7Ci0gIGJvb2wgaGFzX2JvdGggPSBoYXMxOTIgJiYgaGFzMjU2OwotCi0gIGlmIChoYXNfYm90aCkgewotICAgIHJlbW90ZV9vb2JfcHJlc2VudF8gPSBoY2k6Ok9vYkRhdGFQcmVzZW50OjpQXzE5Ml9BTkRfMjU2X1BSRVNFTlQ7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGhhczE5MikgewotICAgICAgcmVtb3RlX29vYl9wcmVzZW50XyA9IGhjaTo6T29iRGF0YVByZXNlbnQ6OlBfMTkyX1BSRVNFTlQ7Ci0gICAgfSBlbHNlIGlmIChoYXMyNTYpIHsKLSAgICAgIHJlbW90ZV9vb2JfcHJlc2VudF8gPSBoY2k6Ok9vYkRhdGFQcmVzZW50OjpQXzI1Nl9QUkVTRU5UOwotICAgIH0KLSAgfQotCi0gIGlmIChsb2NhbGx5X2luaXRpYXRlZF8pIHsKLSAgICBHZXRDaGFubmVsKCktPkNvbm5lY3QoR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKTsKLSAgfQotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25OYW1lUmVxdWVzdENvbXBsZXRlKGhjaTo6QWRkcmVzcyBhZGRyZXNzLCBib29sIHN1Y2Nlc3MpIHsKLSAgaWYgKEdldE5hbWVEYk1vZHVsZSgpLT5Jc05hbWVDYWNoZWQoYWRkcmVzcykpIHsKLSAgICBhdXRvIHJlbW90ZV9uYW1lID0gR2V0TmFtZURiTW9kdWxlKCktPlJlYWRDYWNoZWRSZW1vdGVOYW1lKGFkZHJlc3MpOwotICAgIHN0ZDo6c3RyaW5nIHRtcF9uYW1lOwotICAgIGZvciAodWludDhfdCBpIDogcmVtb3RlX25hbWUpIHsKLSAgICAgIHRtcF9uYW1lICs9IGk7Ci0gICAgfQotICAgIGRldmljZV9uYW1lXyA9IHRtcF9uYW1lOwotICB9Ci0gIGhhc19nb3R0ZW5fbmFtZV9yZXNwb25zZV8gPSB0cnVlOwotICAvLyBGb3IgU1NQL051bWVyaWMgY29tcGFyaXNvbiBmbG93Ci0gIGlmICh1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0XykgewotICAgIHRoaXMtPk9uUmVjZWl2ZSgqdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF8pOwotICB9Ci0gIC8vIEZvciBPT0IgRmxvdzsgd2UgZ28gdG8gbGluayBrZXkgbm90aWZpY2F0aW9uIGFuZCBtdXN0IHdhaXQgZm9yIG5hbWUKLSAgaWYgKGxpbmtfa2V5X25vdGlmaWNhdGlvbl8pIHsKLSAgICB0aGlzLT5PblJlY2VpdmUoKmxpbmtfa2V5X25vdGlmaWNhdGlvbl8pOwotICB9Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpDYW5jZWwoKSB7Ci0gIGlmIChpc19jYW5jZWxsZWRfKSByZXR1cm47Ci0gIGlzX2NhbmNlbGxlZF8gPSB0cnVlOwotICBQYWlyaW5nUmVzdWx0T3JGYWlsdXJlIHJlc3VsdCA9IFBhaXJpbmdSZXN1bHQoKTsKLSAgaWYgKGxhc3Rfc3RhdHVzXyAhPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgIHJlc3VsdCA9IFBhaXJpbmdGYWlsdXJlKGhjaTo6RXJyb3JDb2RlVGV4dChsYXN0X3N0YXR1c18pKTsKLSAgfQotICBzdGQ6Om1vdmUoY29tcGxldGVfY2FsbGJhY2tfKS5SdW4oR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpLCByZXN1bHQpOwotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlJlY2VpdmVkIHVuc3VwcG9ydGVkIGV2ZW50OiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChwYWNrZXQuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6Q2VudHJhbExpbmtLZXlDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlJlY2VpdmVkIHVuc3VwcG9ydGVkIGV2ZW50OiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChwYWNrZXQuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6UGluQ29kZVJlcXVlc3RWaWV3IHBhY2tldCkgewotICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gIExPR19JTkZPKCJSZWNlaXZlZDogJXMiLCBoY2k6OkV2ZW50Q29kZVRleHQocGFja2V0LkdldEV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgQVNTRVJUX0xPRyhHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkgPT0gcGFja2V0LkdldEJkQWRkcigpLCAiQWRkcmVzcyBtaXNtYXRjaCIpOwotICBpc19sZWdhY3lfcGluX2NvZGVfID0gdHJ1ZTsKLSAgTm90aWZ5VWlEaXNwbGF5UGluQ29kZUlucHV0KCk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblJlY2VpdmUoaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgaWYgKGFscmVhZHlfbGlua19rZXlfcmVwbGllZF8pIHsKLSAgICBMT0dfV0FSTigiUGFpcmluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLi4uIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFscmVhZHlfbGlua19rZXlfcmVwbGllZF8gPSB0cnVlOwotICBMT0dfSU5GTygiUmVjZWl2ZWQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHBhY2tldC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci0gIEFTU0VSVF9MT0coR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpID09IHBhY2tldC5HZXRCZEFkZHIoKSwgIkFkZHJlc3MgbWlzbWF0Y2giKTsKLSAgaWYgKEdldFJlY29yZCgpLT5Jc1BhaXJlZCgpKSB7Ci0gICAgTE9HX0lORk8oIlNlbmRpbmc6IExJTktfS0VZX1JFUVVFU1RfUkVQTFkiKTsKLSAgICB0aGlzLT5HZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKGhjaTo6TGlua0tleVJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpLCBHZXRSZWNvcmQoKS0+R2V0TGlua0tleSgpKSk7Ci0gICAgbGFzdF9zdGF0dXNfID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gICAgQ2FuY2VsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0lORk8oIlNlbmRpbmc6IExJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkiKTsKLSAgICB0aGlzLT5HZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKAotICAgICAgICBoY2k6OkxpbmtLZXlSZXF1ZXN0TmVnYXRpdmVSZXBseUJ1aWxkZXI6OkNyZWF0ZShHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpKTsKLSAgfQotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6TGlua0tleU5vdGlmaWNhdGlvblZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlJlY2VpdmVkOiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChwYWNrZXQuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotICBBU1NFUlRfTE9HKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSA9PSBwYWNrZXQuR2V0QmRBZGRyKCksICJBZGRyZXNzIG1pc21hdGNoIik7Ci0gIEdldFJlY29yZCgpLT5TZXRMaW5rS2V5KHBhY2tldC5HZXRMaW5rS2V5KCksIHBhY2tldC5HZXRLZXlUeXBlKCkpOwotICBpZiAoIWhhc19nb3R0ZW5fbmFtZV9yZXNwb25zZV8pIHsKLSAgICBsaW5rX2tleV9ub3RpZmljYXRpb25fID0gc3RkOjptYWtlX29wdGlvbmFsPGhjaTo6TGlua0tleU5vdGlmaWNhdGlvblZpZXc+KHBhY2tldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChpc19sZWdhY3lfcGluX2NvZGVfKSB7Ci0gICAgbGFzdF9zdGF0dXNfID0gaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIH0KLSAgQ2FuY2VsKCk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblJlY2VpdmUoaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0VmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBMT0dfSU5GTygiUmVjZWl2ZWQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHBhY2tldC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci0gIEFTU0VSVF9MT0coR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpID09IHBhY2tldC5HZXRCZEFkZHIoKSwgIkFkZHJlc3MgbWlzbWF0Y2giKTsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eSA9IGxvY2FsX2lvX2NhcGFiaWxpdHlfOwotICBoY2k6Ok9vYkRhdGFQcmVzZW50IG9vYl9wcmVzZW50ID0gcmVtb3RlX29vYl9wcmVzZW50XzsKLSAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMgPSBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfOwotICBhdXRvIHJlcGx5X3BhY2tldCA9IGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpLCBpb19jYXBhYmlsaXR5LCBvb2JfcHJlc2VudCwgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzKTsKLSAgdGhpcy0+R2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZChzdGQ6Om1vdmUocmVwbHlfcGFja2V0KSk7Ci0gIEdldE5hbWVEYk1vZHVsZSgpLT5SZWFkUmVtb3RlTmFtZVJlcXVlc3QoCi0gICAgICBHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCksCi0gICAgICBjb21tb246OkJpbmRPbmNlKCZDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uTmFtZVJlcXVlc3RDb21wbGV0ZSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIHNlY3VyaXR5X2hhbmRsZXJfKTsKLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uUmVjZWl2ZShoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlVmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBMT0dfSU5GTygiUmVjZWl2ZWQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHBhY2tldC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci0gIEFTU0VSVF9MT0coR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpID09IHBhY2tldC5HZXRCZEFkZHIoKSwgIkFkZHJlc3MgbWlzbWF0Y2giKTsKLQotICByZW1vdGVfaW9fY2FwYWJpbGl0eV8gPSBwYWNrZXQuR2V0SW9DYXBhYmlsaXR5KCk7Ci0gIHJlbW90ZV9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID0gcGFja2V0LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCk7Ci0KLSAgc3dpdGNoIChyZW1vdGVfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXykgewotICAgIGNhc2UgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORzoKLSAgICAgIEdldFJlY29yZCgpLT5TZXRJc0VuY3J5cHRpb25SZXF1aXJlZCgKLSAgICAgICAgICBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfICE9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkcgfHwKLSAgICAgICAgICBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfICE9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OKTsKLSAgICAgIEdldFJlY29yZCgpLT5TZXRSZXF1aXJlc01pdG1Qcm90ZWN0aW9uKAotICAgICAgICAgIGxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPT0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6REVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OIHx8Ci0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpHRU5FUkFMX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OIHx8Ci0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTik7Ci0gICAgICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBjaGVjayBmb3IgSElEIGRldmljZSAoQ29EKSBhbmQgaWYgSElEIGRvbid0IG1ha2UgdGVtcG9yYXJ5Ci0gICAgICBHZXRSZWNvcmQoKS0+U2V0SXNUZW1wb3JhcnkoCi0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HIHx8Ci0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOgotICAgICAgR2V0UmVjb3JkKCktPlNldElzRW5jcnlwdGlvblJlcXVpcmVkKAotICAgICAgICAgIGxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gIT0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORyB8fAotICAgICAgICAgIGxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gIT0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElOR19NSVRNX1BST1RFQ1RJT04pOwotICAgICAgR2V0UmVjb3JkKCktPlNldFJlcXVpcmVzTWl0bVByb3RlY3Rpb24odHJ1ZSk7Ci0gICAgICBHZXRSZWNvcmQoKS0+U2V0SXNUZW1wb3JhcnkoCi0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HIHx8Ci0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6OkRFRElDQVRFRF9CT05ESU5HOgotICAgICAgR2V0UmVjb3JkKCktPlNldElzRW5jcnlwdGlvblJlcXVpcmVkKHRydWUpOwotICAgICAgR2V0UmVjb3JkKCktPlNldFJlcXVpcmVzTWl0bVByb3RlY3Rpb24oCi0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04gfHwKLSAgICAgICAgICBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID09IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6OkdFTkVSQUxfQk9ORElOR19NSVRNX1BST1RFQ1RJT04gfHwKLSAgICAgICAgICBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID09IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6REVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OOgotICAgICAgR2V0UmVjb3JkKCktPlNldElzRW5jcnlwdGlvblJlcXVpcmVkKHRydWUpOwotICAgICAgR2V0UmVjb3JkKCktPlNldFJlcXVpcmVzTWl0bVByb3RlY3Rpb24odHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6OkdFTkVSQUxfQk9ORElORzoKLSAgICAgIEdldFJlY29yZCgpLT5TZXRJc0VuY3J5cHRpb25SZXF1aXJlZCh0cnVlKTsKLSAgICAgIEdldFJlY29yZCgpLT5TZXRSZXF1aXJlc01pdG1Qcm90ZWN0aW9uKAotICAgICAgICAgIGxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPT0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6REVESUNBVEVEX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OIHx8Ci0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpHRU5FUkFMX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OIHx8Ci0gICAgICAgICAgbG9jYWxfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6OkdFTkVSQUxfQk9ORElOR19NSVRNX1BST1RFQ1RJT046Ci0gICAgICBHZXRSZWNvcmQoKS0+U2V0SXNFbmNyeXB0aW9uUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICBHZXRSZWNvcmQoKS0+U2V0UmVxdWlyZXNNaXRtUHJvdGVjdGlvbih0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBHZXRSZWNvcmQoKS0+U2V0SXNFbmNyeXB0aW9uUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICBHZXRSZWNvcmQoKS0+U2V0UmVxdWlyZXNNaXRtUHJvdGVjdGlvbih0cnVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaGFzX2dvdHRlbl9pb19jYXBfcmVzcG9uc2VfID0gdHJ1ZTsKLSAgaWYgKHVzZXJfY29uZmlybWF0aW9uX3JlcXVlc3RfKSB7Ci0gICAgdGhpcy0+T25SZWNlaXZlKCp1c2VyX2NvbmZpcm1hdGlvbl9yZXF1ZXN0Xyk7Ci0gIH0KLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uUmVjZWl2ZShoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZVZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlJlY2VpdmVkOiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChwYWNrZXQuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotICBBU1NFUlRfTE9HKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSA9PSBwYWNrZXQuR2V0QmRBZGRyKCksICJBZGRyZXNzIG1pc21hdGNoIik7Ci0gIGxhc3Rfc3RhdHVzXyA9IHBhY2tldC5HZXRTdGF0dXMoKTsKLSAgaWYgKGxhc3Rfc3RhdHVzXyAhPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgIExPR19JTkZPKCJGYWlsZWQgU2ltcGxlUGFpcmluZ0NvbXBsZXRlOiAlcyIsIGhjaTo6RXJyb3JDb2RlVGV4dChsYXN0X3N0YXR1c18pLmNfc3RyKCkpOwotICAgIC8vIENhbmNlbCBoZXJlIHNpbmNlIHdlIHdvbid0IGdldCBMaW5rS2V5Tm90aWZpY2F0aW9uCi0gICAgQ2FuY2VsKCk7Ci0gIH0KLX0KLQotdm9pZCBDbGFzc2ljUGFpcmluZ0hhbmRsZXI6Ok9uUmVjZWl2ZShoY2k6OlJldHVybkxpbmtLZXlzVmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBMT0dfSU5GTygiUmVjZWl2ZWQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHBhY2tldC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblJlY2VpdmUoaGNpOjpFbmNyeXB0aW9uQ2hhbmdlVmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBMT0dfSU5GTygiUmVjZWl2ZWQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHBhY2tldC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblJlY2VpdmUoaGNpOjpFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlVmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBMT0dfSU5GTygiUmVjZWl2ZWQ6ICVzIiwgaGNpOjpFdmVudENvZGVUZXh0KHBhY2tldC5HZXRFdmVudENvZGUoKSkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblJlY2VpdmUoaGNpOjpSZW1vdGVPb2JEYXRhUmVxdWVzdFZpZXcgcGFja2V0KSB7Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlJlY2VpdmVkOiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChwYWNrZXQuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotICBBU1NFUlRfTE9HKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSA9PSBwYWNrZXQuR2V0QmRBZGRyKCksICJBZGRyZXNzIG1pc21hdGNoIik7Ci0KLSAgLy8gQ29yZXY1LjIgVjJQRgotICBzd2l0Y2ggKHJlbW90ZV9vb2JfcHJlc2VudF8pIHsKLSAgICBjYXNlIGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5UOgotICAgICAgTE9HX1dBUk4oIk1pc3NpbmcgcmVtb3RlIE9PQiBkYXRhIik7Ci0gICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKAotICAgICAgICAgIGhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5QnVpbGRlcjo6Q3JlYXRlKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9vYkRhdGFQcmVzZW50OjpQXzE5Ml9QUkVTRU5UOgotICAgICAgTE9HX0lORk8oIlAxOTIgUHJlc2VudCIpOwotICAgICAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogRmlndXJlIHRoaXMgb3V0IGFuZCByZW1vdmUKLSAgICAgIHNlY3VyZV9jb25uZWN0aW9uc19lbmFibGVkXyA9IGZhbHNlOwotICAgICAgaWYgKHNlY3VyZV9jb25uZWN0aW9uc19lbmFibGVkXykgewotICAgICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKGhjaTo6UmVtb3RlT29iRXh0ZW5kZWREYXRhUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpLAotICAgICAgICAgICAgdGhpcy0+cmVtb3RlX3AxOTJfb29iX2RhdGFfLkdldEMoKSwKLSAgICAgICAgICAgIHRoaXMtPnJlbW90ZV9wMTkyX29vYl9kYXRhXy5HZXRSKCksCi0gICAgICAgICAgICB0aGlzLT5yZW1vdGVfcDI1Nl9vb2JfZGF0YV8uR2V0QygpLAotICAgICAgICAgICAgdGhpcy0+cmVtb3RlX3AyNTZfb29iX2RhdGFfLkdldFIoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZChoY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHlCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgICB0aGlzLT5yZW1vdGVfcDE5Ml9vb2JfZGF0YV8uR2V0QygpLAotICAgICAgICAgICAgdGhpcy0+cmVtb3RlX3AxOTJfb29iX2RhdGFfLkdldFIoKSkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9vYkRhdGFQcmVzZW50OjpQXzI1Nl9QUkVTRU5UOgotICAgICAgTE9HX0lORk8oIlAyNTYgUHJlc2VudCIpOwotICAgICAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZChoY2k6OlJlbW90ZU9vYkV4dGVuZGVkRGF0YVJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgdGhpcy0+cmVtb3RlX3AxOTJfb29iX2RhdGFfLkdldEMoKSwKLSAgICAgICAgICB0aGlzLT5yZW1vdGVfcDE5Ml9vb2JfZGF0YV8uR2V0UigpLAotICAgICAgICAgIHRoaXMtPnJlbW90ZV9wMjU2X29vYl9kYXRhXy5HZXRDKCksCi0gICAgICAgICAgdGhpcy0+cmVtb3RlX3AyNTZfb29iX2RhdGFfLkdldFIoKSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6Ok9vYkRhdGFQcmVzZW50OjpQXzE5Ml9BTkRfMjU2X1BSRVNFTlQ6Ci0gICAgICBMT0dfSU5GTygiUDE5MiBhbmQgUDI1NiBQcmVzZW50Iik7Ci0gICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKGhjaTo6UmVtb3RlT29iRXh0ZW5kZWREYXRhUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSwKLSAgICAgICAgICB0aGlzLT5yZW1vdGVfcDE5Ml9vb2JfZGF0YV8uR2V0QygpLAotICAgICAgICAgIHRoaXMtPnJlbW90ZV9wMTkyX29vYl9kYXRhXy5HZXRSKCksCi0gICAgICAgICAgdGhpcy0+cmVtb3RlX3AyNTZfb29iX2RhdGFfLkdldEMoKSwKLSAgICAgICAgICB0aGlzLT5yZW1vdGVfcDI1Nl9vb2JfZGF0YV8uR2V0UigpKSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6VXNlclBhc3NrZXlOb3RpZmljYXRpb25WaWV3IHBhY2tldCkgewotICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gIExPR19JTkZPKCJSZWNlaXZlZDogJXMiLCBoY2k6OkV2ZW50Q29kZVRleHQocGFja2V0LkdldEV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgQVNTRVJUX0xPRyhHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkgPT0gcGFja2V0LkdldEJkQWRkcigpLCAiQWRkcmVzcyBtaXNtYXRjaCIpOwotICBOb3RpZnlVaURpc3BsYXlQYXNza2V5KHBhY2tldC5HZXRQYXNza2V5KCkpOwotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6S2V5cHJlc3NOb3RpZmljYXRpb25WaWV3IHBhY2tldCkgewotICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gIExPR19JTkZPKCJSZWNlaXZlZDogJXMiLCBoY2k6OkV2ZW50Q29kZVRleHQocGFja2V0LkdldEV2ZW50Q29kZSgpKS5jX3N0cigpKTsKLSAgTE9HX0lORk8oIk5vdGlmaWNhdGlvbiBUeXBlOiAlcyIsIGhjaTo6S2V5cHJlc3NOb3RpZmljYXRpb25UeXBlVGV4dChwYWNrZXQuR2V0Tm90aWZpY2F0aW9uVHlwZSgpKS5jX3N0cigpKTsKLSAgc3dpdGNoIChwYWNrZXQuR2V0Tm90aWZpY2F0aW9uVHlwZSgpKSB7Ci0gICAgY2FzZSBoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVHlwZTo6RU5UUllfU1RBUlRFRDoKLSAgICAgIC8vIFRlbGwgdGhlIFVJIHRvIGhpZ2hsaWdodCB0aGUgZmlyc3QgZGlnaXQKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblR5cGU6OkRJR0lUX0VOVEVSRUQ6Ci0gICAgICAvLyBUZWxsIHRoZSBVSSB0byBtb3ZlIG9uZSBkaWdpdCB0byB0aGUgcmlnaHQKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblR5cGU6OkRJR0lUX0VSQVNFRDoKLSAgICAgIC8vIFRlbGwgdGhlIFVJIHRvIG1vdmUgYmFjayBvbmUgZGlnaXQKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgaGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblR5cGU6OkNMRUFSRUQ6Ci0gICAgICAvLyBUZWxsIHRoZSBVSSB0byBoaWdobGlnaHQgdGhlIGZpcnN0IGRpZ2l0IGFnYWluCi0gICAgICBicmVhazsKLSAgICBjYXNlIGhjaTo6S2V5cHJlc3NOb3RpZmljYXRpb25UeXBlOjpFTlRSWV9DT01QTEVURUQ6Ci0gICAgICAvLyBUZWxsIHRoZSBVSSB0byBoaWRlIHRoZSBkaWFsb2cKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKgotICogSGVyZSB3ZSBkZWNpZGUgd2hhdCB0eXBlIG9mIHBhaXJpbmcgYXV0aGVudGljYXRpb24gbWV0aG9kIHdlIHdpbGwgdXNlCi0gKgotICogVGhlIHRhYmxlIGlzIG9uIHBnIDIxMzMgb2YgdGhlIENvcmUgdjUuMSBzcGVjLgotICovCi0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblJlY2VpdmUoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFZpZXcgcGFja2V0KSB7Ci0gIC8vIEVuc3VyZSB3ZSBoYXZlIGlvIGNhcCByZXNwb25zZSBvdGhlcndpc2UgY2hlY2tzIHdpbGwgYmUgd3JvbmcgaWYgaXQgY29tZXMgbGF0ZQotICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgbmFtZSByZXNwb25zZSBvdGhlcndpc2Ugd2UgY2Fubm90IHNob3cgYSBuYW1lIGZvciB0aGUgZGV2aWNlIHRvIHRoZSB1c2VyCi0gIGlmICghaGFzX2dvdHRlbl9pb19jYXBfcmVzcG9uc2VfIHx8ICFoYXNfZ290dGVuX25hbWVfcmVzcG9uc2VfKSB7Ci0gICAgdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF8gPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8aGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFZpZXc+KHBhY2tldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEFTU0VSVChwYWNrZXQuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlJlY2VpdmVkOiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChwYWNrZXQuR2V0RXZlbnRDb2RlKCkpLmNfc3RyKCkpOwotICBBU1NFUlRfTE9HKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSA9PSBwYWNrZXQuR2V0QmRBZGRyKCksICJBZGRyZXNzIG1pc21hdGNoIik7Ci0gIC8vIGlmIGxvY2FsbHlfaW5pdGlhbGl6ZWQsIHVzZSBkZWZhdWx0LCBvdGhlcndpc2UgdXMgcmVtb3RlIGlvIGNhcHMKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW5pdGlhdG9yX2lvX2NhcGFiaWxpdHkgPSAobG9jYWxseV9pbml0aWF0ZWRfKSA/IGxvY2FsX2lvX2NhcGFiaWxpdHlfIDogcmVtb3RlX2lvX2NhcGFiaWxpdHlfOwotICBoY2k6OklvQ2FwYWJpbGl0eSByZXNwb25kZXJfaW9fY2FwYWJpbGl0eSA9ICghbG9jYWxseV9pbml0aWF0ZWRfKSA/IGxvY2FsX2lvX2NhcGFiaWxpdHlfIDogcmVtb3RlX2lvX2NhcGFiaWxpdHlfOwotICBzd2l0Y2ggKGluaXRpYXRvcl9pb19jYXBhYmlsaXR5KSB7Ci0gICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZOgotICAgICAgc3dpdGNoIChyZXNwb25kZXJfaW9fY2FwYWJpbGl0eSkgewotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFk6Ci0gICAgICAgICAgLy8gTnVtZXJpY0NvbXBhcmlzb24sIEJvdGggYXV0byBjb25maXJtCi0gICAgICAgICAgTE9HX0lORk8oIk51bWVyaWMgQ29tcGFyaXNvbjogQSBhbmQgQiBhdXRvIGNvbmZpcm0iKTsKLSAgICAgICAgICBpZiAoIUdldFJlY29yZCgpLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgICAgLy8gTk9URShvcHRlZG9ibGl2aW9uKSBCVEEgbmVlZHMgYSBjYWxsYmFjayBmb3Igd2hlbiBhdXRvIGFjY2VwdGluZyBKdXN0V29ya3MKLSAgICAgICAgICAgIC8vIElmIHdlIGF1dG8gYWNjZXB0IGZyb20gdGhlIENsYXNzaWNQYWlyaW5nSGFuZGxlciBpbiBHRCB0aGVuIHdlIHdvbid0Ci0gICAgICAgICAgICAvLyBnZXQgYSBjYWxsYmFjayB0byB0aGlzIHNoaW0gZnVuY3Rpb24uCi0gICAgICAgICAgICAvLyBXZSB3aWxsIGhhdmUgdG8gY2FsbCBpdCBhbnl3YXkgdW50aWwgd2UgZWxpbWluYXRlIHRoZSBuZWVkCi0gICAgICAgICAgICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBSRU1PVkUgV0hFTiBTSElNIExFQVZFUwotICAgICAgICAgICAgTm90aWZ5VWlEaXNwbGF5WWVzTm8oKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZChoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gVW5hdXRoZW50aWNhdGVkCi0gICAgICAgICAgR2V0UmVjb3JkKCktPlNldEF1dGhlbnRpY2F0ZWQoZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTzoKLSAgICAgICAgICAvLyBOdW1lcmljQ29tcGFyaXNvbiwgSW5pdGlhdG9yIGF1dG8gY29uZmlybSwgUmVzcG9uZGVyIGRpc3BsYXkKLSAgICAgICAgICBpZiAoIUdldFJlY29yZCgpLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgICAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogUkVNT1ZFIFdIRU4gU0hJTSBMRUFWRVMKLSAgICAgICAgICAgIE5vdGlmeVVpRGlzcGxheVllc05vKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIExPR19JTkZPKCJOdW1lcmljIENvbXBhcmlzb246IEEgYXV0byBjb25maXJtIik7Ci0gICAgICAgICAgLy8gVW5hdXRoZW50aWNhdGVkCi0gICAgICAgICAgR2V0UmVjb3JkKCktPlNldEF1dGhlbnRpY2F0ZWQodHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGNpOjpJb0NhcGFiaWxpdHk6OktFWUJPQVJEX09OTFk6Ci0gICAgICAgICAgLy8gUGFzc0tleSBFbnRyeSwgSW5pdGlhdG9yIGRpc3BsYXksIFJlc3BvbmRlciBpbnB1dAotICAgICAgICAgIE5vdGlmeVVpRGlzcGxheVBhc3NrZXkocGFja2V0LkdldE51bWVyaWNWYWx1ZSgpKTsKLSAgICAgICAgICBMT0dfSU5GTygiUGFzc2tleSBFbnRyeTogQSBkaXNwbGF5LCBCIGlucHV0Iik7Ci0gICAgICAgICAgLy8gQXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQ6Ci0gICAgICAgICAgLy8gTnVtZXJpY0NvbXBhcmlzb24sIEJvdGggYXV0byBjb25maXJtCi0gICAgICAgICAgTE9HX0lORk8oIk51bWVyaWMgQ29tcGFyaXNvbjogQSBhbmQgQiBhdXRvIGNvbmZpcm0iKTsKLSAgICAgICAgICBpZiAoIUdldFJlY29yZCgpLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgICAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogUkVNT1ZFIFdIRU4gU0hJTSBMRUFWRVMKLSAgICAgICAgICAgIE5vdGlmeVVpRGlzcGxheVllc05vKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFVuYXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk86Ci0gICAgICBzd2l0Y2ggKHJlc3BvbmRlcl9pb19jYXBhYmlsaXR5KSB7Ci0gICAgICAgIGNhc2UgaGNpOjpJb0NhcGFiaWxpdHk6OkRJU1BMQVlfT05MWToKLSAgICAgICAgICAvLyBOdW1lcmljQ29tcGFyaXNvbiwgSW5pdGlhdG9yIGRpc3BsYXksIFJlc3BvbmRlciBhdXRvIGNvbmZpcm0KLSAgICAgICAgICBMT0dfSU5GTygiTnVtZXJpYyBDb21wYXJpc29uOiBBIERpc3BsYXlZZXNObywgQiBhdXRvIGNvbmZpcm0iKTsKLSAgICAgICAgICBOb3RpZnlVaURpc3BsYXlZZXNObyhwYWNrZXQuR2V0TnVtZXJpY1ZhbHVlKCkpOwotICAgICAgICAgIC8vIFVuYXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTzoKLSAgICAgICAgICAvLyBOdW1lcmljQ29tcGFyaXNvbiBCb3RoIERpc3BsYXksIEJvdGggY29uZmlybQotICAgICAgICAgIExPR19JTkZPKCJOdW1lcmljIENvbXBhcmlzb246IEEgYW5kIEIgRGlzcGxheVllc05vIik7Ci0gICAgICAgICAgTm90aWZ5VWlEaXNwbGF5WWVzTm8ocGFja2V0LkdldE51bWVyaWNWYWx1ZSgpKTsKLSAgICAgICAgICAvLyBBdXRoZW50aWNhdGVkCi0gICAgICAgICAgR2V0UmVjb3JkKCktPlNldEF1dGhlbnRpY2F0ZWQodHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGNpOjpJb0NhcGFiaWxpdHk6OktFWUJPQVJEX09OTFk6Ci0gICAgICAgICAgLy8gUGFzc0tleSBFbnRyeSwgSW5pdGlhdG9yIGRpc3BsYXksIFJlc3BvbmRlciBpbnB1dAotICAgICAgICAgIE5vdGlmeVVpRGlzcGxheVBhc3NrZXkocGFja2V0LkdldE51bWVyaWNWYWx1ZSgpKTsKLSAgICAgICAgICBMT0dfSU5GTygiUGFzc2tleSBFbnRyeTogQSBkaXNwbGF5LCBCIGlucHV0Iik7Ci0gICAgICAgICAgLy8gQXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQ6Ci0gICAgICAgICAgLy8gTnVtZXJpY0NvbXBhcmlzb24sIGF1dG8gY29uZmlybSBSZXNwb25kZXIsIFllcy9ObyBjb25maXJtIEluaXRpYXRvci4gRG9uJ3Qgc2hvdyBjb25maXJtYXRpb24gdmFsdWUKLSAgICAgICAgICBMT0dfSU5GTygiTnVtZXJpYyBDb21wYXJpc29uOiBBIERpc3BsYXlZZXNObywgQiBhdXRvIGNvbmZpcm0sIG5vIHNob3cgdmFsdWUiKTsKLSAgICAgICAgICBOb3RpZnlVaURpc3BsYXlZZXNObygpOwotICAgICAgICAgIC8vIFVuYXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfT05MWToKLSAgICAgIHN3aXRjaCAocmVzcG9uZGVyX2lvX2NhcGFiaWxpdHkpIHsKLSAgICAgICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZOgotICAgICAgICAgIC8vIFBhc3NLZXkgRW50cnksIFJlc3BvbmRlciBkaXNwbGF5LCBJbml0aWF0b3IgaW5wdXQKLSAgICAgICAgICBOb3RpZnlVaURpc3BsYXlQYXNza2V5SW5wdXQoKTsKLSAgICAgICAgICBMT0dfSU5GTygiUGFzc2tleSBFbnRyeTogQSBpbnB1dCwgQiBkaXNwbGF5Iik7Ci0gICAgICAgICAgLy8gQXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTzoKLSAgICAgICAgICAvLyBQYXNzS2V5IEVudHJ5LCBSZXNwb25kZXIgZGlzcGxheSwgSW5pdGlhdG9yIGlucHV0Ci0gICAgICAgICAgTm90aWZ5VWlEaXNwbGF5UGFzc2tleUlucHV0KCk7Ci0gICAgICAgICAgTE9HX0lORk8oIlBhc3NrZXkgRW50cnk6IEEgaW5wdXQsIEIgZGlzcGxheSIpOwotICAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZWQKLSAgICAgICAgICBHZXRSZWNvcmQoKS0+U2V0QXV0aGVudGljYXRlZCh0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfT05MWToKLSAgICAgICAgICAvLyBQYXNzS2V5IEVudHJ5LCBib3RoIGlucHV0Ci0gICAgICAgICAgTm90aWZ5VWlEaXNwbGF5UGFzc2tleUlucHV0KCk7Ci0gICAgICAgICAgTE9HX0lORk8oIlBhc3NrZXkgRW50cnk6IEEgaW5wdXQsIEIgaW5wdXQiKTsKLSAgICAgICAgICAvLyBBdXRoZW50aWNhdGVkCi0gICAgICAgICAgR2V0UmVjb3JkKCktPlNldEF1dGhlbnRpY2F0ZWQodHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVDoKLSAgICAgICAgICAvLyBOdW1lcmljQ29tcGFyaXNvbiwgYm90aCBhdXRvIGNvbmZpcm0KLSAgICAgICAgICBMT0dfSU5GTygiTnVtZXJpYyBDb21wYXJpc29uOiBBIGFuZCBCIGF1dG8gY29uZmlybSIpOwotICAgICAgICAgIGlmICghR2V0UmVjb3JkKCktPlJlcXVpcmVzTWl0bVByb3RlY3Rpb24oKSkgewotICAgICAgICAgICAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICBoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHlCdWlsZGVyOjpDcmVhdGUoR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gICAgICAgICAgICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBSRU1PVkUgV0hFTiBTSElNIExFQVZFUwotICAgICAgICAgICAgTm90aWZ5VWlEaXNwbGF5WWVzTm8oKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR2V0Q2hhbm5lbCgpLT5TZW5kQ29tbWFuZChoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gVW5hdXRoZW50aWNhdGVkCi0gICAgICAgICAgR2V0UmVjb3JkKCktPlNldEF1dGhlbnRpY2F0ZWQoZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOgotICAgICAgc3dpdGNoIChyZXNwb25kZXJfaW9fY2FwYWJpbGl0eSkgewotICAgICAgICBjYXNlIGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFk6Ci0gICAgICAgICAgLy8gTnVtZXJpY0NvbXBhcmlzb24sIGJvdGggYXV0byBjb25maXJtCi0gICAgICAgICAgTE9HX0lORk8oIk51bWVyaWMgQ29tcGFyaXNvbjogQSBhbmQgQiBhdXRvIGNvbmZpcm0iKTsKLSAgICAgICAgICBpZiAoIUdldFJlY29yZCgpLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgICAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogUkVNT1ZFIFdIRU4gU0hJTSBMRUFWRVMKLSAgICAgICAgICAgIE5vdGlmeVVpRGlzcGxheVllc05vKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFVuYXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk86Ci0gICAgICAgICAgLy8gTnVtZXJpY0NvbXBhcmlzb24sIEluaXRpYXRvciBhdXRvIGNvbmZpcm0sIFJlc3BvbmRlciBZZXMvTm8gY29uZmlybSwgbm8gc2hvdyBjb25mIHZhbAotICAgICAgICAgIExPR19JTkZPKCJOdW1lcmljIENvbXBhcmlzb246IEEgYXV0byBjb25maXJtIik7Ci0gICAgICAgICAgaWYgKCFHZXRSZWNvcmQoKS0+UmVxdWlyZXNNaXRtUHJvdGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgIGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZShHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpKTsKLSAgICAgICAgICAgIC8vIFRPRE8ob3B0ZWRvYmxpdmlvbik6IFJFTU9WRSBXSEVOIFNISU0gTEVBVkVTCi0gICAgICAgICAgICBOb3RpZnlVaURpc3BsYXlZZXNObygpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBVbmF1dGhlbnRpY2F0ZWQKLSAgICAgICAgICBHZXRSZWNvcmQoKS0+U2V0QXV0aGVudGljYXRlZChmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgaGNpOjpJb0NhcGFiaWxpdHk6OktFWUJPQVJEX09OTFk6Ci0gICAgICAgICAgLy8gTnVtZXJpY0NvbXBhcmlzb24sIGJvdGggYXV0byBjb25maXJtCi0gICAgICAgICAgTE9HX0lORk8oIk51bWVyaWMgQ29tcGFyaXNvbjogQSBhbmQgQiBhdXRvIGNvbmZpcm0iKTsKLSAgICAgICAgICBpZiAoIUdldFJlY29yZCgpLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgICAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogUkVNT1ZFIFdIRU4gU0hJTSBMRUFWRVMKLSAgICAgICAgICAgIE5vdGlmeVVpRGlzcGxheVllc05vKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFVuYXV0aGVudGljYXRlZAotICAgICAgICAgIEdldFJlY29yZCgpLT5TZXRBdXRoZW50aWNhdGVkKGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBoY2k6OklvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOgotICAgICAgICAgIC8vIE51bWVyaWNDb21wYXJpc29uLCBib3RoIGF1dG8gY29uZmlybQotICAgICAgICAgIExPR19JTkZPKCJOdW1lcmljIENvbXBhcmlzb246IEEgYW5kIEIgYXV0byBjb25maXJtIik7Ci0gICAgICAgICAgaWYgKCFHZXRSZWNvcmQoKS0+UmVxdWlyZXNNaXRtUHJvdGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgIGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseUJ1aWxkZXI6OkNyZWF0ZShHZXRSZWNvcmQoKS0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpKTsKLSAgICAgICAgICAgIC8vIFRPRE8ob3B0ZWRvYmxpdmlvbik6IFJFTU9WRSBXSEVOIFNISU0gTEVBVkVTCi0gICAgICAgICAgICBOb3RpZnlVaURpc3BsYXlZZXNObygpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBVbmF1dGhlbnRpY2F0ZWQKLSAgICAgICAgICBHZXRSZWNvcmQoKS0+U2V0QXV0aGVudGljYXRlZChmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6T25SZWNlaXZlKGhjaTo6VXNlclBhc3NrZXlSZXF1ZXN0VmlldyBwYWNrZXQpIHsKLSAgQVNTRVJUKHBhY2tldC5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfTE9HKEdldFJlY29yZCgpLT5HZXRQc2V1ZG9BZGRyZXNzKCktPkdldEFkZHJlc3MoKSA9PSBwYWNrZXQuR2V0QmRBZGRyKCksICJBZGRyZXNzIG1pc21hdGNoIik7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblVzZXJJbnB1dChib29sIHVzZXJfaW5wdXQpIHsKLSAgaWYgKHVzZXJfaW5wdXQpIHsKLSAgICBVc2VyQ2xpY2tlZFllcygpOwotICB9IGVsc2UgewotICAgIFVzZXJDbGlja2VkTm8oKTsKLSAgfQotfQotCi12b2lkIENsYXNzaWNQYWlyaW5nSGFuZGxlcjo6VXNlckNsaWNrZWRZZXMoKSB7Ci0gIEdldENoYW5uZWwoKS0+U2VuZENvbW1hbmQoCi0gICAgICBoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHlCdWlsZGVyOjpDcmVhdGUoR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpVc2VyQ2xpY2tlZE5vKCkgewotICBHZXRDaGFubmVsKCktPlNlbmRDb21tYW5kKAotICAgICAgaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHlCdWlsZGVyOjpDcmVhdGUoR2V0UmVjb3JkKCktPkdldFBzZXVkb0FkZHJlc3MoKS0+R2V0QWRkcmVzcygpKSk7Ci19Ci0KLXZvaWQgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyOjpPblBhc3NrZXlJbnB1dCh1aW50MzJfdCBwYXNza2V5KSB7Ci0gIHBhc3NrZXlfID0gcGFzc2tleTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHBhaXJpbmcKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcGFpcmluZy9jbGFzc2ljX3BhaXJpbmdfaGFuZGxlci5oIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZy9jbGFzc2ljX3BhaXJpbmdfaGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTAzOTVkLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvY2xhc3NpY19wYWlyaW5nX2hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpIG92ZXJyaWRlOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmcvcGFpcmluZ19oYW5kbGVyLmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAibDJjYXAvY2xhc3NpYy9sMmNhcF9jbGFzc2ljX21vZHVsZS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2luaXRpYWxfaW5mb3JtYXRpb25zLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc2VjdXJpdHlfbWFuYWdlcl9saXN0ZW5lci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLWNsYXNzIElTZWN1cml0eU1hbmFnZXJMaXN0ZW5lcjsKLQotbmFtZXNwYWNlIHBhaXJpbmcgewotCi1jbGFzcyBDbGFzc2ljUGFpcmluZ0hhbmRsZXIgOiBwdWJsaWMgUGFpcmluZ0hhbmRsZXIgewotIHB1YmxpYzoKLSAgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyKAotICAgICAgY2hhbm5lbDo6U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCogc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsLAotICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+IHJlY29yZCwKLSAgICAgIG9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyLAotICAgICAgY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkFkZHJlc3MsIFBhaXJpbmdSZXN1bHRPckZhaWx1cmUpPiBjb21wbGV0ZV9jYWxsYmFjaywKLSAgICAgIFVJKiB1c2VyX2ludGVyZmFjZSwKLSAgICAgIG9zOjpIYW5kbGVyKiB1c2VyX2ludGVyZmFjZV9oYW5kbGVyLAotICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlX25hbWUsCi0gICAgICBuZWlnaGJvcjo6TmFtZURiTW9kdWxlKiBuYW1lX2RiX21vZHVsZSkKLSAgICAgIDogUGFpcmluZ0hhbmRsZXIoc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsLCBzdGQ6Om1vdmUocmVjb3JkKSwgbmFtZV9kYl9tb2R1bGUpLAotICAgICAgICBzZWN1cml0eV9oYW5kbGVyXyhzZWN1cml0eV9oYW5kbGVyKSwKLSAgICAgICAgcmVtb3RlX2lvX2NhcGFiaWxpdHlfKGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTyksCi0gICAgICAgIHJlbW90ZV9vb2JfcHJlc2VudF8oaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQpLAotICAgICAgICByZW1vdGVfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyhoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04pLAotICAgICAgICBsb2NhbF9pb19jYXBhYmlsaXR5XyhoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk8pLAotICAgICAgICBsb2NhbF9vb2JfcHJlc2VudF8oaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQpLAotICAgICAgICBsb2NhbF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfKGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6OkRFRElDQVRFRF9CT05ESU5HX01JVE1fUFJPVEVDVElPTiksCi0gICAgICAgIGNvbXBsZXRlX2NhbGxiYWNrXyhzdGQ6Om1vdmUoY29tcGxldGVfY2FsbGJhY2spKSwKLSAgICAgICAgdXNlcl9pbnRlcmZhY2VfKHVzZXJfaW50ZXJmYWNlKSwKLSAgICAgICAgdXNlcl9pbnRlcmZhY2VfaGFuZGxlcl8odXNlcl9pbnRlcmZhY2VfaGFuZGxlciksCi0gICAgICAgIGRldmljZV9uYW1lXyhzdGQ6Om1vdmUoZGV2aWNlX25hbWUpKSB7fQotCi0gIH5DbGFzc2ljUGFpcmluZ0hhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBJbml0aWF0ZSgKLSAgICAgIGJvb2wgbG9jYWxseV9pbml0aWF0ZWQsCi0gICAgICBoY2k6OklvQ2FwYWJpbGl0eSBpb19jYXBhYmlsaXR5LAotICAgICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoX3JlcXVpcmVtZW50cywKLSAgICAgIE9vYkRhdGEgcmVtb3RlX3AxOTJfb29iX2RhdGEsCi0gICAgICBPb2JEYXRhIHJlbW90ZV9wMjU2X29vYl9kYXRhKSBvdmVycmlkZTsKLSAgdm9pZCBDYW5jZWwoKSBvdmVycmlkZTsKLQotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGVWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6Q2VudHJhbExpbmtLZXlDb21wbGV0ZVZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpQaW5Db2RlUmVxdWVzdFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpMaW5rS2V5Tm90aWZpY2F0aW9uVmlldyBwYWNrZXQpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVjZWl2ZShoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6SW9DYXBhYmlsaXR5UmVzcG9uc2VWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlVmlldyBwYWNrZXQpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVjZWl2ZShoY2k6OlJldHVybkxpbmtLZXlzVmlldyBwYWNrZXQpIG92ZXJyaWRlOwotICB2b2lkIE9uUmVjZWl2ZShoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWNlaXZlKGhjaTo6RW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZVZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpSZW1vdGVPb2JEYXRhUmVxdWVzdFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpVc2VyUGFzc2tleU5vdGlmaWNhdGlvblZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblJlY2VpdmUoaGNpOjpVc2VyUGFzc2tleVJlcXVlc3RWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBPblBhaXJpbmdQcm9tcHRBY2NlcHRlZChjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBib29sIGNvbmZpcm1lZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Db25maXJtWWVzTm8oY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgYm9vbCBjb25maXJtZWQpIG92ZXJyaWRlOwotICB2b2lkIE9uUGFzc2tleUVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHVpbnQzMl90IHBhc3NrZXkpIG92ZXJyaWRlOwotICB2b2lkIE9uUGluRW50cnkoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGluKSBvdmVycmlkZTsKLQotICB2b2lkIE9uTmFtZVJlcXVlc3RDb21wbGV0ZShoY2k6OkFkZHJlc3MgYWRkcmVzcywgYm9vbCBzdWNjZXNzKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgT25Vc2VySW5wdXQoYm9vbCB1c2VyX2lucHV0KTsKLSAgdm9pZCBPblBhc3NrZXlJbnB1dCh1aW50MzJfdCBwYXNza2V5KTsKLSAgdm9pZCBOb3RpZnlVaURpc3BsYXlZZXNObyh1aW50MzJfdCBudW1lcmljX3ZhbHVlKTsKLSAgdm9pZCBOb3RpZnlVaURpc3BsYXlZZXNObygpOwotICB2b2lkIE5vdGlmeVVpRGlzcGxheVBhc3NrZXkodWludDMyX3QgcGFzc2tleSk7Ci0gIHZvaWQgTm90aWZ5VWlEaXNwbGF5UGFzc2tleUlucHV0KCk7Ci0gIHZvaWQgTm90aWZ5VWlEaXNwbGF5UGluQ29kZUlucHV0KCk7Ci0gIHZvaWQgTm90aWZ5VWlEaXNwbGF5Q2FuY2VsKCk7Ci0gIHZvaWQgVXNlckNsaWNrZWRZZXMoKTsKLSAgdm9pZCBVc2VyQ2xpY2tlZE5vKCk7Ci0KLSAgb3M6OkhhbmRsZXIqIHNlY3VyaXR5X2hhbmRsZXJfIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwotICBoY2k6OklvQ2FwYWJpbGl0eSByZW1vdGVfaW9fY2FwYWJpbGl0eV87Ci0gIGhjaTo6T29iRGF0YVByZXNlbnQgcmVtb3RlX29vYl9wcmVzZW50XyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyByZW1vdGVfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgbG9jYWxfaW9fY2FwYWJpbGl0eV87Ci0gIGhjaTo6T29iRGF0YVByZXNlbnQgbG9jYWxfb29iX3ByZXNlbnRfIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGxvY2FsX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIE9vYkRhdGEgcmVtb3RlX3AxOTJfb29iX2RhdGFfOwotICBPb2JEYXRhIHJlbW90ZV9wMjU2X29vYl9kYXRhXzsKLSAgY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkFkZHJlc3MsIFBhaXJpbmdSZXN1bHRPckZhaWx1cmUpPiBjb21wbGV0ZV9jYWxsYmFja187Ci0gIFVJKiB1c2VyX2ludGVyZmFjZV87Ci0gIG9zOjpIYW5kbGVyKiB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXzsKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX25hbWVfOwotICBib29sIGlzX2NhbmNlbGxlZF8gPSBmYWxzZTsKLQotICBib29sIGhhc19nb3R0ZW5faW9fY2FwX3Jlc3BvbnNlXyA9IGZhbHNlOwotICBib29sIGhhc19nb3R0ZW5fbmFtZV9yZXNwb25zZV8gPSBmYWxzZTsKLSAgc3RkOjpvcHRpb25hbDxoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0Vmlldz4gdXNlcl9jb25maXJtYXRpb25fcmVxdWVzdF8gPSBzdGQ6Om51bGxvcHQ7Ci0gIHN0ZDo6b3B0aW9uYWw8aGNpOjpMaW5rS2V5Tm90aWZpY2F0aW9uVmlldz4gbGlua19rZXlfbm90aWZpY2F0aW9uXyA9IHN0ZDo6bnVsbG9wdDsKLQotICBoY2k6OkVycm9yQ29kZSBsYXN0X3N0YXR1c18gPSBoY2k6OkVycm9yQ29kZTo6VU5LTk9XTl9IQ0lfQ09NTUFORDsKLSAgYm9vbCBsb2NhbGx5X2luaXRpYXRlZF8gPSBmYWxzZTsKLSAgdWludDMyX3QgcGFzc2tleV8gPSAwOwotICBib29sIGFscmVhZHlfbGlua19rZXlfcmVwbGllZF8gPSBmYWxzZTsKLSAgYm9vbCBzZWN1cmVfY29ubmVjdGlvbnNfZW5hYmxlZF8gPSB0cnVlOwotICBib29sIGlzX2xlZ2FjeV9waW5fY29kZV8gPSBmYWxzZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWlyaW5nCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvY2xhc3NpY19wYWlyaW5nX2hhbmRsZXJfdW5pdHRlc3QuY2MgYi9nZC9zZWN1cml0eS9wYWlyaW5nL2NsYXNzaWNfcGFpcmluZ19oYW5kbGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGUwOGNjLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvY2xhc3NpY19wYWlyaW5nX2hhbmRsZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NzYgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmcvY2xhc3NpY19wYWlyaW5nX2hhbmRsZXIuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9jaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2luaXRpYWxfaW5mb3JtYXRpb25zLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc21wX3BhY2tldHMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS90ZXN0L2Zha2VfaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvdGVzdC9mYWtlX25hbWVfZGIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS90ZXN0L2Zha2Vfc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLW5hbWVzcGFjZSBwYWlyaW5nIHsKLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIGJsdWV0b290aDo6c2VjdXJpdHk6OmNoYW5uZWw6OlNlY3VyaXR5TWFuYWdlckNoYW5uZWw7Ci11c2luZyBoY2k6OkFkZHJlc3M7Ci11c2luZyBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOwotdXNpbmcgaGNpOjpDb21tYW5kQ29tcGxldGVCdWlsZGVyOwotdXNpbmcgaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlCdWlsZGVyOwotdXNpbmcgaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0VmlldzsKLXVzaW5nIGhjaTo6T29iRGF0YVByZXNlbnQ7Ci11c2luZyBoY2k6Ok9wQ29kZTsKLXVzaW5nIG9zOjpIYW5kbGVyOwotdXNpbmcgb3M6OlRocmVhZDsKLXVzaW5nIHBhY2tldDo6UmF3QnVpbGRlcjsKLQotY2xhc3MgRmFrZVNlY3VyaXR5TWFuYWdlckNoYW5uZWwgOiBwdWJsaWMgY2hhbm5lbDo6U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCB7Ci0gcHVibGljOgotICBGYWtlU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbChvczo6SGFuZGxlciogaGFuZGxlciwgaGNpOjpIY2lMYXllciogaGNpX2xheWVyKQotICAgICAgOiBjaGFubmVsOjpTZWN1cml0eU1hbmFnZXJDaGFubmVsKGhhbmRsZXIsIGhjaV9sYXllcikge30KLSAgfkZha2VTZWN1cml0eU1hbmFnZXJDaGFubmVsKCkge30KLQotICB2b2lkIE9uTGlua0Nvbm5lY3RlZChzdGQ6OnVuaXF1ZV9wdHI8bDJjYXA6OmNsYXNzaWM6OkxpbmtTZWN1cml0eUludGVyZmFjZT4gbGluaykgb3ZlcnJpZGUgewotICAgIExPR19FUlJPUigiQ0FMTEVEIik7Ci0gIH0KLQotICB2b2lkIE9uTGlua0Rpc2Nvbm5lY3RlZChoY2k6OkFkZHJlc3MgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIExPR19FUlJPUigiQ0FMTEVEIik7Ci0gIH0KLQotICB2b2lkIE9uRW5jcnlwdGlvbkNoYW5nZShoY2k6OkFkZHJlc3MgYWRkcmVzcywgYm9vbCBlbmNyeXB0ZWQpIG92ZXJyaWRlIHsKLSAgICBMT0dfRVJST1IoIkNBTExFRCIpOwotICB9Ci0KLSAgdm9pZCBPbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgaGNpOjpBZGRyZXNzIHJlbW90ZSkgb3ZlcnJpZGUgewotICAgIExPR19FUlJPUigiQ0FMTEVEIik7Ci0gIH0KLX07Ci0KLWNsYXNzIFRlc3RVSSA6IHB1YmxpYyBVSSB7Ci0gcHVibGljOgotICB+VGVzdFVJKCkgPSBkZWZhdWx0OwotICB2b2lkIERpc3BsYXlQYWlyaW5nUHJvbXB0KGNvbnN0IGhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBzdGQ6OnN0cmluZyBuYW1lKSBvdmVycmlkZSB7fQotICB2b2lkIENhbmNlbChjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcykgb3ZlcnJpZGUge30KLSAgdm9pZCBEaXNwbGF5Q29uZmlybVZhbHVlKENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgb3ZlcnJpZGUge30KLSAgdm9pZCBEaXNwbGF5WWVzTm9EaWFsb2coQ29uZmlybWF0aW9uRGF0YSBkYXRhKSBvdmVycmlkZSB7fQotICB2b2lkIERpc3BsYXlFbnRlclBhc3NrZXlEaWFsb2coQ29uZmlybWF0aW9uRGF0YSBkYXRhKSBvdmVycmlkZSB7fQotICB2b2lkIERpc3BsYXlQYXNza2V5KENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgb3ZlcnJpZGUge30KLSAgdm9pZCBEaXNwbGF5RW50ZXJQaW5EaWFsb2coQ29uZmlybWF0aW9uRGF0YSBkYXRhKSBvdmVycmlkZSB7fQotfTsKLQotY2xhc3MgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbENhbGxiYWNrIDogcHVibGljIGNoYW5uZWw6OklTZWN1cml0eU1hbmFnZXJDaGFubmVsTGlzdGVuZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbENhbGxiYWNrKHBhaXJpbmc6OkNsYXNzaWNQYWlyaW5nSGFuZGxlciogcGFpcmluZ19oYW5kbGVyKQotICAgICAgOiBwYWlyaW5nX2hhbmRsZXJfKHBhaXJpbmdfaGFuZGxlcikge30KLSAgdm9pZCBPbkhjaUV2ZW50UmVjZWl2ZWQoaGNpOjpFdmVudFZpZXcgcGFja2V0KSBvdmVycmlkZSB7Ci0gICAgYXV0byBldmVudCA9IGhjaTo6RXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfTE9HKGV2ZW50LklzVmFsaWQoKSwgIlJlY2VpdmVkIGludmFsaWQgcGFja2V0Iik7Ci0gICAgY29uc3QgaGNpOjpFdmVudENvZGUgY29kZSA9IGV2ZW50LkdldEV2ZW50Q29kZSgpOwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVDoKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyXy0+T25SZWNlaXZlKGhjaTo6UGluQ29kZVJlcXVlc3RWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpMSU5LX0tFWV9SRVFVRVNUOgotICAgICAgICBwYWlyaW5nX2hhbmRsZXJfLT5PblJlY2VpdmUoaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OkxJTktfS0VZX05PVElGSUNBVElPTjoKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyXy0+T25SZWNlaXZlKGhjaTo6TGlua0tleU5vdGlmaWNhdGlvblZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVDoKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyXy0+T25SZWNlaXZlKGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OklPX0NBUEFCSUxJVFlfUkVTUE9OU0U6Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl8tPk9uUmVjZWl2ZShoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6U0lNUExFX1BBSVJJTkdfQ09NUExFVEU6Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl8tPk9uUmVjZWl2ZShoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZVZpZXc6OkNyZWF0ZShldmVudCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgaGNpOjpFdmVudENvZGU6OlJFVFVSTl9MSU5LX0tFWVM6Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl8tPk9uUmVjZWl2ZShoY2k6OlJldHVybkxpbmtLZXlzVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1Q6Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl8tPk9uUmVjZWl2ZShoY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0Vmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX05PVElGSUNBVElPTjoKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyXy0+T25SZWNlaXZlKGhjaTo6VXNlclBhc3NrZXlOb3RpZmljYXRpb25WaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpLRVlQUkVTU19OT1RJRklDQVRJT046Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl8tPk9uUmVjZWl2ZShoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBoY2k6OkV2ZW50Q29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVDoKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyXy0+T25SZWNlaXZlKGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoZXZlbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGhjaTo6RXZlbnRDb2RlOjpVU0VSX1BBU1NLRVlfUkVRVUVTVDoKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyXy0+T25SZWNlaXZlKGhjaTo6VXNlclBhc3NrZXlSZXF1ZXN0Vmlldzo6Q3JlYXRlKGV2ZW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX0xPRyhmYWxzZSwgIkNhbm5vdCBoYW5kbGUgcmVjZWl2ZWQgcGFja2V0OiAlcyIsIGhjaTo6RXZlbnRDb2RlVGV4dChjb2RlKS5jX3N0cigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25DbG9zZWQoaGNpOjpBZGRyZXNzIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiQ2FsbGVkIik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHBhaXJpbmc6OkNsYXNzaWNQYWlyaW5nSGFuZGxlciogcGFpcmluZ19oYW5kbGVyXyA9IG51bGxwdHI7Ci19OwotCi1ib29sIGV4cGVjdF9zdWNjZXNzXyA9IHRydWU7Ci0KLXN0YXRpYyB2b2lkIHBhaXJpbmdfY29tcGxldGVfY2FsbGJhY2soYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcywgUGFpcmluZ1Jlc3VsdE9yRmFpbHVyZSBzdGF0dXMpIHsKLSAgaWYgKGV4cGVjdF9zdWNjZXNzXykgewotICAgIEFTU0VSVF9UUlVFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4oc3RhdHVzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQVNTRVJUX0ZBTFNFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4oc3RhdHVzKSk7Ci0gIH0KLX0KLQotY2xhc3MgQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBleHBlY3Rfc3VjY2Vzc18gPSB0cnVlOwotICAgIGhjaV9sYXllcl8gPSBuZXcgRmFrZUhjaUxheWVyKCk7Ci0gICAgbmFtZV9kYl9tb2R1bGVfID0gbmV3IEZha2VOYW1lRGJNb2R1bGUoKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5JbmplY3RUZXN0TW9kdWxlKCZGYWtlSGNpTGF5ZXI6OkZhY3RvcnksIGhjaV9sYXllcl8pOwotICAgIGZha2VfcmVnaXN0cnlfLkluamVjdFRlc3RNb2R1bGUoJm5laWdoYm9yOjpOYW1lRGJNb2R1bGU6OkZhY3RvcnksIG5hbWVfZGJfbW9kdWxlXyk7Ci0gICAgaGFuZGxlcl8gPSBmYWtlX3JlZ2lzdHJ5Xy5HZXRUZXN0TW9kdWxlSGFuZGxlcigmRmFrZUhjaUxheWVyOjpGYWN0b3J5KTsKLSAgICBjaGFubmVsXyA9IG5ldyBGYWtlU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbChoYW5kbGVyXywgaGNpX2xheWVyXyk7Ci0gICAgc2VjdXJpdHlfcmVjb3JkXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4oZGV2aWNlXyk7Ci0gICAgdXNlcl9pbnRlcmZhY2VfID0gbmV3IFRlc3RVSSgpOwotICAgIHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfID0gaGFuZGxlcl87Ci0gICAgcGFpcmluZ19oYW5kbGVyXyA9IG5ldyBwYWlyaW5nOjpDbGFzc2ljUGFpcmluZ0hhbmRsZXIoCi0gICAgICAgIGNoYW5uZWxfLAotICAgICAgICBzZWN1cml0eV9yZWNvcmRfLAotICAgICAgICBoYW5kbGVyXywKLSAgICAgICAgY29tbW9uOjpCaW5kKCZwYWlyaW5nX2NvbXBsZXRlX2NhbGxiYWNrKSwKLSAgICAgICAgdXNlcl9pbnRlcmZhY2VfLAotICAgICAgICB1c2VyX2ludGVyZmFjZV9oYW5kbGVyXywKLSAgICAgICAgIkZha2UgbmFtZSIsCi0gICAgICAgIG5hbWVfZGJfbW9kdWxlXyk7Ci0gICAgY2hhbm5lbF9jYWxsYmFja18gPSBuZXcgU2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbENhbGxiYWNrKHBhaXJpbmdfaGFuZGxlcl8pOwotICAgIGNoYW5uZWxfLT5TZXRDaGFubmVsTGlzdGVuZXIoY2hhbm5lbF9jYWxsYmFja18pOwotICAgIHNlY3VyaXR5X2ludGVyZmFjZV8gPSBuZXcgRmFrZVNlY3VyaXR5SW50ZXJmYWNlKGhhbmRsZXJfLCBjaGFubmVsXyk7Ci0gICAgY2hhbm5lbF8tPlNldFNlY3VyaXR5SW50ZXJmYWNlKHNlY3VyaXR5X2ludGVyZmFjZV8pOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjaGFubmVsXy0+U2V0Q2hhbm5lbExpc3RlbmVyKG51bGxwdHIpOwotICAgIHN5bmNocm9uaXplKCk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3RvcEFsbCgpOwotICAgIGRlbGV0ZSB1c2VyX2ludGVyZmFjZV87Ci0gICAgZGVsZXRlIHBhaXJpbmdfaGFuZGxlcl87Ci0gICAgZGVsZXRlIGNoYW5uZWxfOwotICAgIGRlbGV0ZSBjaGFubmVsX2NhbGxiYWNrXzsKLSAgICBkZWxldGUgc2VjdXJpdHlfaW50ZXJmYWNlXzsKLSAgfQotCi0gIHZvaWQgc3luY2hyb25pemUoKSB7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZGYWtlSGNpTGF5ZXI6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TeW5jaHJvbml6ZU1vZHVsZUhhbmRsZXIoJkZha2VOYW1lRGJNb2R1bGU6OkZhY3RvcnksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKLSAgfQotCi0gIHZvaWQgUmVjZWl2ZUxpbmtLZXlSZXF1ZXN0KGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgewotICAgIGhjaV9sYXllcl8tPkluY29taW5nRXZlbnQoaGNpOjpMaW5rS2V5UmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShkZXZpY2UuR2V0QWRkcmVzcygpKSk7Ci0gICAgc3luY2hyb25pemUoKTsKLSAgfQotCi0gIHZvaWQgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlcXVlc3QoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gICAgaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlLkdldEFkZHJlc3MoKSkpOwotICAgIHN5bmNocm9uaXplKCk7Ci0gIH0KLQotICB2b2lkIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXNwb25zZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIGhjaTo6SW9DYXBhYmlsaXR5IGlvX2NhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpPb2JEYXRhUHJlc2VudCBvb2JfcHJlc2VudCwgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBhdXRoX3JlcXMpIHsKLSAgICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KAotICAgICAgICBoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKGRldmljZS5HZXRBZGRyZXNzKCksIGlvX2NhcCwgb29iX3ByZXNlbnQsIGF1dGhfcmVxcykpOwotICAgIHN5bmNocm9uaXplKCk7Ci0gIH0KLQotICB2b2lkIFJlY2VpdmVPb2JEYXRhUmVxdWVzdChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpIHsKLSAgICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KGhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlLkdldEFkZHJlc3MoKSkpOwotICAgIHN5bmNocm9uaXplKCk7Ci0gIH0KLQotICB2b2lkIFJlY2VpdmVVc2VyQ29uZmlybWF0aW9uUmVxdWVzdChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIHVpbnQzMl90IG51bWVyaWNfdmFsdWUpIHsKLSAgICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoZGV2aWNlLkdldEFkZHJlc3MoKSwgbnVtZXJpY192YWx1ZSkpOwotICAgIHN5bmNocm9uaXplKCk7Ci0gIH0KLQotICB2b2lkIFJlY2VpdmVTaW1wbGVQYWlyaW5nQ29tcGxldGUoaGNpOjpFcnJvckNvZGUgc3RhdHVzLCBoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpIHsKLSAgICBoY2lfbGF5ZXJfLT5JbmNvbWluZ0V2ZW50KGhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKHN0YXR1cywgZGV2aWNlLkdldEFkZHJlc3MoKSkpOwotICAgIHN5bmNocm9uaXplKCk7Ci0gIH0KLQotICB2b2lkIFJlY2VpdmVMaW5rS2V5Tm90aWZpY2F0aW9uKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpLZXlUeXBlIGtleV90eXBlKSB7Ci0gICAgaGNpX2xheWVyXy0+SW5jb21pbmdFdmVudChoY2k6OkxpbmtLZXlOb3RpZmljYXRpb25CdWlsZGVyOjpDcmVhdGUoZGV2aWNlLkdldEFkZHJlc3MoKSwgbGlua19rZXksIGtleV90eXBlKSk7Ci0gICAgc3luY2hyb25pemUoKTsKLSAgfQotCi0gIFRlc3RNb2R1bGVSZWdpc3RyeSBmYWtlX3JlZ2lzdHJ5XzsKLSAgVGhyZWFkJiB0aHJlYWRfID0gZmFrZV9yZWdpc3RyeV8uR2V0VGVzdFRocmVhZCgpOwotICBIYW5kbGVyKiBoYW5kbGVyXyA9IG51bGxwdHI7Ci0gIEZha2VIY2lMYXllciogaGNpX2xheWVyXyA9IG51bGxwdHI7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZV87Ci0gIFNlY3VyaXR5TWFuYWdlckNoYW5uZWxDYWxsYmFjayogY2hhbm5lbF9jYWxsYmFja18gPSBudWxscHRyOwotICBjaGFubmVsOjpTZWN1cml0eU1hbmFnZXJDaGFubmVsKiBjaGFubmVsXyA9IG51bGxwdHI7Ci0gIHBhaXJpbmc6OkNsYXNzaWNQYWlyaW5nSGFuZGxlciogcGFpcmluZ19oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPiBzZWN1cml0eV9yZWNvcmRfID0gbnVsbHB0cjsKLSAgVUkqIHVzZXJfaW50ZXJmYWNlXzsKLSAgb3M6OkhhbmRsZXIqIHVzZXJfaW50ZXJmYWNlX2hhbmRsZXJfOwotICBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlJbnRlcmZhY2UqIHNlY3VyaXR5X2ludGVyZmFjZV8gPSBudWxscHRyOwotICBGYWtlTmFtZURiTW9kdWxlKiBuYW1lX2RiX21vZHVsZV8gPSBudWxscHRyOwotfTsKLQotLy8gU2VjdXJpdHkgTWFuYWdlciBCb290IFNlcXVlbmNlIChSZXF1aXJlZCBmb3IgU1NQLCB0aGVzZSBhcmUgYWxyZWFkeSBzZXQgYXQgYm9vdCB0aW1lKQotLy8gIC0gV3JpdGVTaW1wbGVQYWlyaW5nTW9kZQotLy8gIC0gV3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0Ci0vLyAgLSBXcml0ZUF1dGhlbnRpY2F0ZWRQYXlsb2FkVGltZW91dAotCi0vKioqIExvY2FsbHkgaW5pdGlhdGVkICoqKi8KLS8vIFNlY3VyaXR5IFBhaXJpbmcgU2VxdWVuY2UgKEp1c3RXb3JrcykKLS8vICAtPiAqRXN0YWJsaXNoIEwyQ0FQIGNvbm5lY3Rpb24qCi0vLyAgLT4gQXV0aGVudGljYXRpb25SZXF1ZXN0ZWQgKEwyQ0FQIGhhbmRsZXMgdGhpcykKLS8vICA8LSBMaW5rS2V5UmVxdWVzdCAgIC8vIFRoaXMgaXMgZW50cnkgcG9pbnQgZm9yIHJlbW90ZSBpbml0aWF0ZWQKLS8vICAtPiBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkKLS8vICA8LSBJb0NhcGFiaWxpdHlSZXF1ZXN0Ci0vLyAgLT4gSW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Ci0vLyAgPC0gSW9DYXBhYmlsaXR5UmVzcG9uc2UKLS8vICA8LSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdAotLy8gIC0+IFVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHkgKGF1dG8pCi0vLyAgPC0gU2ltcGxlUGFpcmluZ0NvbXBsZXRlCi0vLyAgPC0gTGlua0tleU5vdGlmaWNhdGlvbgotLy8gIDwtIEF1dGhlbnRpY2F0aW9uQ29tcGxldGUKLS8vICAtPiBTZXRDb25uZWN0aW9uRW5jcnlwdGlvbgotLy8gIDwtIEVuY3J5cHRpb25DaGFuZ2UKLS8vICAtPiBMMmNhcENvbm5lY3Rpb25SZXNwb25zZSAoaWYgdHJpZ2dlcmVkIGJ5IEwyY2FwIGNvbm5lY3Rpb24gcmVxdWVzdCkKLQotaGNpOjpTZWN1cml0eUNvbW1hbmRWaWV3IEdldExhc3RDb21tYW5kKEZha2VIY2lMYXllciogaGNpX2xheWVyKSB7Ci0gIGF1dG8gbGFzdF9jb21tYW5kID0gc3RkOjptb3ZlKGhjaV9sYXllci0+R2V0TGFzdENvbW1hbmQoKS0+Y29tbWFuZCk7Ci0gIGF1dG8gY29tbWFuZF9wYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShsYXN0X2NvbW1hbmQpKTsKLSAgYXV0byBjb21tYW5kX3BhY2tldF92aWV3ID0gaGNpOjpDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmRfcGFja2V0KTsKLSAgYXV0byBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBoY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kX3BhY2tldF92aWV3KTsKLSAgaWYgKCFzZWN1cml0eV9jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKSB7Ci0gICAgTE9HX0VSUk9SKCJJbnZhbGlkIHNlY3VyaXR5IGNvbW1hbmQgcmVjZWl2ZWQiKTsKLSAgfQotICByZXR1cm4gc2VjdXJpdHlfY29tbWFuZF92aWV3OwotfQotCi1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgc2V0dXBfdGVhcmRvd24pIHt9Ci0KLS8qKiogSnVzdFdvcmtzIChOdW1lcmljIENvbXBhcmlzb24gdy8gbm8gVUkpICoqKi8KLS8vIGRpc3BsYXlfb25seSArIGRpc3BsYXlfb25seSBpcyBKdXN0V29ya3Mgbm8gY29uZmlybWF0aW9uCi0vLyBOZWVkcyBkaWFsb2cgYXMgcGVyIHNlY3VyaXR5IGEgYnVnIHVubGVzcyBwYWlyaW5nIGlzIHRlbXBvcmFyeQotVEVTVF9GKENsYXNzaWNQYWlyaW5nSGFuZGxlclRlc3QsIGxvY2FsbHlfaW5pdGlhdGllZF9kaXNwbGF5X29ubHlfZGlzcGxheV9vbmx5X3RlbXApIHsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSA9IGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFk7Ci0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORzsKLSAgcGFpcmluZ19oYW5kbGVyXy0+SW5pdGlhdGUoCi0gICAgICB0cnVlLCBpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIHBhaXJpbmc6Ok9vYkRhdGEoKSwgcGFpcmluZzo6T29iRGF0YSgpKTsKLSAgUmVjZWl2ZUxpbmtLZXlSZXF1ZXN0KGRldmljZV8pOwotICBhdXRvIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBhdXRvIGxpbmtfa2V5X25lZ19yZXBseSA9IGhjaTo6TGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGxpbmtfa2V5X25lZ19yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLCBsaW5rX2tleV9uZWdfcmVwbHkuR2V0T3BDb2RlKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVxdWVzdChkZXZpY2VfKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVF9SRVBMWSwgc2VjdXJpdHlfY29tbWFuZF92aWV3LkdldE9wQ29kZSgpKTsKLSAgYXV0byBpb19jYXBfcmVxdWVzdF9yZXBseSA9IGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGlvX2NhcF9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRJb0NhcGFiaWxpdHkoKSk7Ci0gIEFTU0VSVF9FUShoY2k6Ok9vYkRhdGFQcmVzZW50OjpOT1RfUFJFU0VOVCwgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0T29iUHJlc2VudCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cywgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXNwb25zZShkZXZpY2VfLCBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZLCBoY2k6Ok9vYkRhdGFQcmVzZW50OjpOT1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkcpOwotICB1aW50MzJfdCBudW1lcmljX3ZhbHVlID0gMHgxMjM7Ci0gIFJlY2VpdmVVc2VyQ29uZmlybWF0aW9uUmVxdWVzdChkZXZpY2VfLCBudW1lcmljX3ZhbHVlKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFksIHNlY3VyaXR5X2NvbW1hbmRfdmlldy5HZXRPcENvZGUoKSk7Ci0gIGF1dG8gdXNlcl9jb25mX3JlcXVlc3RfcmVwbHkgPSBoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUodXNlcl9jb25mX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgUmVjZWl2ZVNpbXBsZVBhaXJpbmdDb21wbGV0ZShoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgZGV2aWNlXyk7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxpbmtfa2V5ID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsIDEsIDIsIDMsIDQsIDV9OwotICBoY2k6OktleVR5cGUga2V5X3R5cGUgPSBoY2k6OktleVR5cGU6OkRFQlVHX0NPTUJJTkFUSU9OOwotICBSZWNlaXZlTGlua0tleU5vdGlmaWNhdGlvbihkZXZpY2VfLCBsaW5rX2tleSwga2V5X3R5cGUpOwotICBBU1NFUlRfRVEobGlua19rZXksIHNlY3VyaXR5X3JlY29yZF8tPkdldExpbmtLZXkoKSk7Ci0gIEFTU0VSVF9FUShrZXlfdHlwZSwgc2VjdXJpdHlfcmVjb3JkXy0+R2V0S2V5VHlwZSgpKTsKLSAgQVNTRVJUX0ZBTFNFKHNlY3VyaXR5X3JlY29yZF8tPklzQXV0aGVudGljYXRlZCgpKTsKLSAgQVNTRVJUX0ZBTFNFKHNlY3VyaXR5X3JlY29yZF8tPlJlcXVpcmVzTWl0bVByb3RlY3Rpb24oKSk7Ci19Ci0KLS8vIGRpc3BsYXlfb25seSArIGRpc3BsYXlfeWVzX25vIGlzIEp1c3RXb3JrcyBubyBjb25maXJtYXRpb24KLS8vIE5lZWRzIGRpYWxvZyBhcyBwZXIgc2VjdXJpdHkgYSBidWcgdW5sZXNzIHBhaXJpbmcgaXMgdGVtcG9yYXJ5Ci1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgbG9jYWxseV9pbml0aWF0aWVkX2Rpc3BsYXlfb25seV9kaXNwbGF5X3llc19ub190ZW1wKSB7Ci0gIGhjaTo6SW9DYXBhYmlsaXR5IGluamVjdGVkX2lvX2NhcGFiaWxpdHkgPSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkc7Ci0gIHBhaXJpbmdfaGFuZGxlcl8tPkluaXRpYXRlKAotICAgICAgdHJ1ZSwgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBwYWlyaW5nOjpPb2JEYXRhKCksIHBhaXJpbmc6Ok9vYkRhdGEoKSk7Ci0gIFJlY2VpdmVMaW5rS2V5UmVxdWVzdChkZXZpY2VfKTsKLSAgYXV0byBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgYXV0byBsaW5rX2tleV9uZWdfcmVwbHkgPSBoY2k6OkxpbmtLZXlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShsaW5rX2tleV9uZWdfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSwgbGlua19rZXlfbmVnX3JlcGx5LkdldE9wQ29kZSgpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlcXVlc3QoZGV2aWNlXyk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFksIHNlY3VyaXR5X2NvbW1hbmRfdmlldy5HZXRPcENvZGUoKSk7Ci0gIGF1dG8gaW9fY2FwX3JlcXVlc3RfcmVwbHkgPSBoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShpb19jYXBfcmVxdWVzdF9yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0SW9DYXBhYmlsaXR5KCkpOwotICBBU1NFUlRfRVEoaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoZGV2aWNlXywgaGNpOjpJb0NhcGFiaWxpdHk6OkRJU1BMQVlfWUVTX05PLCBoY2k6Ok9vYkRhdGFQcmVzZW50OjpOT1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkcpOwotICB1aW50MzJfdCBudW1lcmljX3ZhbHVlID0gMHgxMjM7Ci0gIFJlY2VpdmVVc2VyQ29uZmlybWF0aW9uUmVxdWVzdChkZXZpY2VfLCBudW1lcmljX3ZhbHVlKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFksIHNlY3VyaXR5X2NvbW1hbmRfdmlldy5HZXRPcENvZGUoKSk7Ci0gIGF1dG8gdXNlcl9jb25mX3JlcXVlc3RfcmVwbHkgPSBoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUodXNlcl9jb25mX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgUmVjZWl2ZVNpbXBsZVBhaXJpbmdDb21wbGV0ZShoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUywgZGV2aWNlXyk7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxpbmtfa2V5ID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAsIDEsIDIsIDMsIDQsIDV9OwotICBoY2k6OktleVR5cGUga2V5X3R5cGUgPSBoY2k6OktleVR5cGU6OkRFQlVHX0NPTUJJTkFUSU9OOwotICBSZWNlaXZlTGlua0tleU5vdGlmaWNhdGlvbihkZXZpY2VfLCBsaW5rX2tleSwga2V5X3R5cGUpOwotICBBU1NFUlRfRVEobGlua19rZXksIHNlY3VyaXR5X3JlY29yZF8tPkdldExpbmtLZXkoKSk7Ci0gIEFTU0VSVF9FUShrZXlfdHlwZSwgc2VjdXJpdHlfcmVjb3JkXy0+R2V0S2V5VHlwZSgpKTsKLSAgQVNTRVJUX1RSVUUoc2VjdXJpdHlfcmVjb3JkXy0+SXNBdXRoZW50aWNhdGVkKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+UmVxdWlyZXNNaXRtUHJvdGVjdGlvbigpKTsKLX0KLQotLy8gZGlzcGxheV9vbmx5ICsgbm9faW5wdXRfbm9fb3V0cHV0IGlzIEp1c3RXb3JrcyBubyBjb25maXJtYXRpb24KLS8vIE5lZWRzIGRpYWxvZyBhcyBwZXIgc2VjdXJpdHkgYSBidWcgdW5sZXNzIHBhaXJpbmcgaXMgdGVtcG9yYXJ5Ci1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgbG9jYWxseV9pbml0aWF0aWVkX2Rpc3BsYXlfb25seV9ub19pbnB1dF9ub19vdXRwdXRfdGVtcCkgewotICBoY2k6OklvQ2FwYWJpbGl0eSBpbmplY3RlZF9pb19jYXBhYmlsaXR5ID0gaGNpOjpJb0NhcGFiaWxpdHk6OkRJU1BMQVlfT05MWTsKLSAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMgPSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HOwotICBwYWlyaW5nX2hhbmRsZXJfLT5Jbml0aWF0ZSgKLSAgICAgIHRydWUsIGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cywgcGFpcmluZzo6T29iRGF0YSgpLCBwYWlyaW5nOjpPb2JEYXRhKCkpOwotICBSZWNlaXZlTGlua0tleVJlcXVlc3QoZGV2aWNlXyk7Ci0gIGF1dG8gc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gbGlua19rZXlfbmVnX3JlcGx5ID0gaGNpOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUobGlua19rZXlfbmVnX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIGxpbmtfa2V5X25lZ19yZXBseS5HZXRPcENvZGUoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXF1ZXN0KGRldmljZV8pOwotICBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIGlvX2NhcF9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoaW9fY2FwX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldElvQ2FwYWJpbGl0eSgpKTsKLSAgQVNTRVJUX0VRKGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRPb2JQcmVzZW50KCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cygpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlc3BvbnNlKGRldmljZV8sIGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQsIGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORyk7Ci0gIHVpbnQzMl90IG51bWVyaWNfdmFsdWUgPSAweDEyMzsKLSAgUmVjZWl2ZVVzZXJDb25maXJtYXRpb25SZXF1ZXN0KGRldmljZV8sIG51bWVyaWNfdmFsdWUpOwotICBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9SRVBMWSwgc2VjdXJpdHlfY29tbWFuZF92aWV3LkdldE9wQ29kZSgpKTsKLSAgYXV0byB1c2VyX2NvbmZfcmVxdWVzdF9yZXBseSA9IGhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRSh1c2VyX2NvbmZfcmVxdWVzdF9yZXBseS5Jc1ZhbGlkKCkpOwotICBSZWNlaXZlU2ltcGxlUGFpcmluZ0NvbXBsZXRlKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCBkZXZpY2VfKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbGlua19rZXkgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNX07Ci0gIGhjaTo6S2V5VHlwZSBrZXlfdHlwZSA9IGhjaTo6S2V5VHlwZTo6REVCVUdfQ09NQklOQVRJT047Ci0gIFJlY2VpdmVMaW5rS2V5Tm90aWZpY2F0aW9uKGRldmljZV8sIGxpbmtfa2V5LCBrZXlfdHlwZSk7Ci0gIEFTU0VSVF9FUShsaW5rX2tleSwgc2VjdXJpdHlfcmVjb3JkXy0+R2V0TGlua0tleSgpKTsKLSAgQVNTRVJUX0VRKGtleV90eXBlLCBzZWN1cml0eV9yZWNvcmRfLT5HZXRLZXlUeXBlKCkpOwotICBBU1NFUlRfVFJVRShzZWN1cml0eV9yZWNvcmRfLT5Jc0F1dGhlbnRpY2F0ZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpOwotfQotCi0vLyBrZXlib2FyZF9vbmx5ICsgbm9faW5wdXRfbm9fb3V0cHV0IGlzIEp1c3RXb3JrcyBubyBjb25maXJtYXRpb24KLS8vIE5lZWRzIGRpYWxvZyBhcyBwZXIgc2VjdXJpdHkgYSBidWcgdW5sZXNzIHBhaXJpbmcgaXMgdGVtcG9yYXJ5Ci1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgbG9jYWxseV9pbml0aWF0aWVkX2tleWJvYXJkX29ubHlfbm9faW5wdXRfbm9fb3V0cHV0X3RlbXApIHsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSA9IGhjaTo6SW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9PTkxZOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkc7Ci0gIHBhaXJpbmdfaGFuZGxlcl8tPkluaXRpYXRlKAotICAgICAgdHJ1ZSwgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBwYWlyaW5nOjpPb2JEYXRhKCksIHBhaXJpbmc6Ok9vYkRhdGEoKSk7Ci0gIFJlY2VpdmVMaW5rS2V5UmVxdWVzdChkZXZpY2VfKTsKLSAgYXV0byBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgYXV0byBsaW5rX2tleV9uZWdfcmVwbHkgPSBoY2k6OkxpbmtLZXlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShsaW5rX2tleV9uZWdfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSwgbGlua19rZXlfbmVnX3JlcGx5LkdldE9wQ29kZSgpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlcXVlc3QoZGV2aWNlXyk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFksIHNlY3VyaXR5X2NvbW1hbmRfdmlldy5HZXRPcENvZGUoKSk7Ci0gIGF1dG8gaW9fY2FwX3JlcXVlc3RfcmVwbHkgPSBoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShpb19jYXBfcmVxdWVzdF9yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0SW9DYXBhYmlsaXR5KCkpOwotICBBU1NFUlRfRVEoaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoZGV2aWNlXywgaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwgaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HKTsKLSAgdWludDMyX3QgbnVtZXJpY192YWx1ZSA9IDB4MTIzOwotICBSZWNlaXZlVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoZGV2aWNlXywgbnVtZXJpY192YWx1ZSk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIFJlY2VpdmVTaW1wbGVQYWlyaW5nQ29tcGxldGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGRldmljZV8pOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgaGNpOjpLZXlUeXBlIGtleV90eXBlID0gaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTjsKLSAgUmVjZWl2ZUxpbmtLZXlOb3RpZmljYXRpb24oZGV2aWNlXywgbGlua19rZXksIGtleV90eXBlKTsKLSAgQVNTRVJUX0VRKGxpbmtfa2V5LCBzZWN1cml0eV9yZWNvcmRfLT5HZXRMaW5rS2V5KCkpOwotICBBU1NFUlRfRVEoa2V5X3R5cGUsIHNlY3VyaXR5X3JlY29yZF8tPkdldEtleVR5cGUoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5Jc0F1dGhlbnRpY2F0ZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpOwotfQotCi0vLyBub19pbnB1dF9ub19vdXRwdXQgKyBkaXNwbGF5X29ubHkgaXMgSnVzdFdvcmtzIG5vIGNvbmZpcm1hdGlvbgotLy8gTmVlZHMgZGlhbG9nIGFzIHBlciBzZWN1cml0eSBhIGJ1ZyB1bmxlc3MgcGFpcmluZyBpcyB0ZW1wb3JhcnkKLVRFU1RfRihDbGFzc2ljUGFpcmluZ0hhbmRsZXJUZXN0LCBsb2NhbGx5X2luaXRpYXRpZWRfbm9faW5wdXRfbm9fb3V0cHV0X2Rpc3BsYXlfb25seV90ZW1wKSB7Ci0gIGhjaTo6SW9DYXBhYmlsaXR5IGluamVjdGVkX2lvX2NhcGFiaWxpdHkgPSBoY2k6OklvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkc7Ci0gIHBhaXJpbmdfaGFuZGxlcl8tPkluaXRpYXRlKAotICAgICAgdHJ1ZSwgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBwYWlyaW5nOjpPb2JEYXRhKCksIHBhaXJpbmc6Ok9vYkRhdGEoKSk7Ci0gIFJlY2VpdmVMaW5rS2V5UmVxdWVzdChkZXZpY2VfKTsKLSAgYXV0byBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgYXV0byBsaW5rX2tleV9uZWdfcmVwbHkgPSBoY2k6OkxpbmtLZXlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShsaW5rX2tleV9uZWdfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSwgbGlua19rZXlfbmVnX3JlcGx5LkdldE9wQ29kZSgpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlcXVlc3QoZGV2aWNlXyk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFksIHNlY3VyaXR5X2NvbW1hbmRfdmlldy5HZXRPcENvZGUoKSk7Ci0gIGF1dG8gaW9fY2FwX3JlcXVlc3RfcmVwbHkgPSBoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShpb19jYXBfcmVxdWVzdF9yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0SW9DYXBhYmlsaXR5KCkpOwotICBBU1NFUlRfRVEoaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoZGV2aWNlXywgaGNpOjpJb0NhcGFiaWxpdHk6OkRJU1BMQVlfT05MWSwgaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HKTsKLSAgdWludDMyX3QgbnVtZXJpY192YWx1ZSA9IDB4MTIzOwotICBSZWNlaXZlVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoZGV2aWNlXywgbnVtZXJpY192YWx1ZSk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIFJlY2VpdmVTaW1wbGVQYWlyaW5nQ29tcGxldGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGRldmljZV8pOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgaGNpOjpLZXlUeXBlIGtleV90eXBlID0gaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTjsKLSAgUmVjZWl2ZUxpbmtLZXlOb3RpZmljYXRpb24oZGV2aWNlXywgbGlua19rZXksIGtleV90eXBlKTsKLSAgQVNTRVJUX0VRKGxpbmtfa2V5LCBzZWN1cml0eV9yZWNvcmRfLT5HZXRMaW5rS2V5KCkpOwotICBBU1NFUlRfRVEoa2V5X3R5cGUsIHNlY3VyaXR5X3JlY29yZF8tPkdldEtleVR5cGUoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5Jc0F1dGhlbnRpY2F0ZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpOwotfQotCi0vLyBub19pbnB1dF9ub19vdXRwdXQgKyBkaXNwbGF5X3llc19ubyBpcyBKdXN0V29ya3Mgbm8gY29uZmlybWF0aW9uCi0vLyBOZWVkcyBkaWFsb2cgYXMgcGVyIHNlY3VyaXR5IGEgYnVnIHVubGVzcyBwYWlyaW5nIGlzIHRlbXBvcmFyeQotVEVTVF9GKENsYXNzaWNQYWlyaW5nSGFuZGxlclRlc3QsIGxvY2FsbHlfaW5pdGlhdGllZF9ub19pbnB1dF9ub19vdXRwdXRfZGlzcGxheV95ZXNfbm9fdGVtcCkgewotICBoY2k6OklvQ2FwYWJpbGl0eSBpbmplY3RlZF9pb19jYXBhYmlsaXR5ID0gaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVDsKLSAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cyBpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMgPSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HOwotICBwYWlyaW5nX2hhbmRsZXJfLT5Jbml0aWF0ZSgKLSAgICAgIHRydWUsIGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cywgcGFpcmluZzo6T29iRGF0YSgpLCBwYWlyaW5nOjpPb2JEYXRhKCkpOwotICBSZWNlaXZlTGlua0tleVJlcXVlc3QoZGV2aWNlXyk7Ci0gIGF1dG8gc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gbGlua19rZXlfbmVnX3JlcGx5ID0gaGNpOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUobGlua19rZXlfbmVnX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIGxpbmtfa2V5X25lZ19yZXBseS5HZXRPcENvZGUoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXF1ZXN0KGRldmljZV8pOwotICBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIGlvX2NhcF9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoaW9fY2FwX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldElvQ2FwYWJpbGl0eSgpKTsKLSAgQVNTRVJUX0VRKGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRPb2JQcmVzZW50KCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cygpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlc3BvbnNlKGRldmljZV8sIGhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTywgaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HKTsKLSAgdWludDMyX3QgbnVtZXJpY192YWx1ZSA9IDB4MTIzOwotICBSZWNlaXZlVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoZGV2aWNlXywgbnVtZXJpY192YWx1ZSk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIFJlY2VpdmVTaW1wbGVQYWlyaW5nQ29tcGxldGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGRldmljZV8pOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgaGNpOjpLZXlUeXBlIGtleV90eXBlID0gaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTjsKLSAgUmVjZWl2ZUxpbmtLZXlOb3RpZmljYXRpb24oZGV2aWNlXywgbGlua19rZXksIGtleV90eXBlKTsKLSAgQVNTRVJUX0VRKGxpbmtfa2V5LCBzZWN1cml0eV9yZWNvcmRfLT5HZXRMaW5rS2V5KCkpOwotICBBU1NFUlRfRVEoa2V5X3R5cGUsIHNlY3VyaXR5X3JlY29yZF8tPkdldEtleVR5cGUoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5Jc0F1dGhlbnRpY2F0ZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpOwotfQotCi0vLyBub19pbnB1dF9ub19vdXRwdXQgKyBrZXlib2FyZF9vbmx5IGlzIEp1c3RXb3JrcyBubyBjb25maXJtYXRpb24KLS8vIE5lZWRzIGRpYWxvZyBhcyBwZXIgc2VjdXJpdHkgYSBidWcgdW5sZXNzIHBhaXJpbmcgaXMgdGVtcG9yYXJ5Ci1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgbG9jYWxseV9pbml0aWF0aWVkX25vX2lucHV0X25vX291dHB1dF9rZXlib2FyZF9vbmx5X3RlbXApIHsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSA9IGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQ7Ci0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORzsKLSAgcGFpcmluZ19oYW5kbGVyXy0+SW5pdGlhdGUoCi0gICAgICB0cnVlLCBpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIHBhaXJpbmc6Ok9vYkRhdGEoKSwgcGFpcmluZzo6T29iRGF0YSgpKTsKLSAgUmVjZWl2ZUxpbmtLZXlSZXF1ZXN0KGRldmljZV8pOwotICBhdXRvIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBhdXRvIGxpbmtfa2V5X25lZ19yZXBseSA9IGhjaTo6TGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGxpbmtfa2V5X25lZ19yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLCBsaW5rX2tleV9uZWdfcmVwbHkuR2V0T3BDb2RlKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVxdWVzdChkZXZpY2VfKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVF9SRVBMWSwgc2VjdXJpdHlfY29tbWFuZF92aWV3LkdldE9wQ29kZSgpKTsKLSAgYXV0byBpb19jYXBfcmVxdWVzdF9yZXBseSA9IGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGlvX2NhcF9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRJb0NhcGFiaWxpdHkoKSk7Ci0gIEFTU0VSVF9FUShoY2k6Ok9vYkRhdGFQcmVzZW50OjpOT1RfUFJFU0VOVCwgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0T29iUHJlc2VudCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cywgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXNwb25zZShkZXZpY2VfLCBoY2k6OklvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfT05MWSwgaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HKTsKLSAgdWludDMyX3QgbnVtZXJpY192YWx1ZSA9IDB4MTIzOwotICBSZWNlaXZlVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoZGV2aWNlXywgbnVtZXJpY192YWx1ZSk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIFJlY2VpdmVTaW1wbGVQYWlyaW5nQ29tcGxldGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGRldmljZV8pOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgaGNpOjpLZXlUeXBlIGtleV90eXBlID0gaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTjsKLSAgUmVjZWl2ZUxpbmtLZXlOb3RpZmljYXRpb24oZGV2aWNlXywgbGlua19rZXksIGtleV90eXBlKTsKLSAgQVNTRVJUX0VRKGxpbmtfa2V5LCBzZWN1cml0eV9yZWNvcmRfLT5HZXRMaW5rS2V5KCkpOwotICBBU1NFUlRfRVEoa2V5X3R5cGUsIHNlY3VyaXR5X3JlY29yZF8tPkdldEtleVR5cGUoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5Jc0F1dGhlbnRpY2F0ZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpOwotfQotCi0vLyBub19pbnB1dF9ub19vdXRwdXQgKyBub19pbnB1dF9ub19vdXRwdXQgaXMgSnVzdFdvcmtzIG5vIGNvbmZpcm1hdGlvbgotLy8gTmVlZHMgZGlhbG9nIGFzIHBlciBzZWN1cml0eSBhIGJ1ZyB1bmxlc3MgcGFpcmluZyBpcyB0ZW1wb3JhcnkKLVRFU1RfRihDbGFzc2ljUGFpcmluZ0hhbmRsZXJUZXN0LCBsb2NhbGx5X2luaXRpYXRpZWRfbm9faW5wdXRfbm9fb3V0cHV0X25vX2lucHV0X25vX291dHB1dF90ZW1wKSB7Ci0gIGhjaTo6SW9DYXBhYmlsaXR5IGluamVjdGVkX2lvX2NhcGFiaWxpdHkgPSBoY2k6OklvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkc7Ci0gIHBhaXJpbmdfaGFuZGxlcl8tPkluaXRpYXRlKAotICAgICAgdHJ1ZSwgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBwYWlyaW5nOjpPb2JEYXRhKCksIHBhaXJpbmc6Ok9vYkRhdGEoKSk7Ci0gIFJlY2VpdmVMaW5rS2V5UmVxdWVzdChkZXZpY2VfKTsKLSAgYXV0byBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgYXV0byBsaW5rX2tleV9uZWdfcmVwbHkgPSBoY2k6OkxpbmtLZXlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShsaW5rX2tleV9uZWdfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6TElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWSwgbGlua19rZXlfbmVnX3JlcGx5LkdldE9wQ29kZSgpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlcXVlc3QoZGV2aWNlXyk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFksIHNlY3VyaXR5X2NvbW1hbmRfdmlldy5HZXRPcENvZGUoKSk7Ci0gIGF1dG8gaW9fY2FwX3JlcXVlc3RfcmVwbHkgPSBoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShpb19jYXBfcmVxdWVzdF9yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW9fY2FwX3JlcXVlc3RfcmVwbHkuR2V0SW9DYXBhYmlsaXR5KCkpOwotICBBU1NFUlRfRVEoaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoZGV2aWNlXywgaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwgaGNpOjpPb2JEYXRhUHJlc2VudDo6Tk9UX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HKTsKLSAgdWludDMyX3QgbnVtZXJpY192YWx1ZSA9IDB4MTIzOwotICBSZWNlaXZlVXNlckNvbmZpcm1hdGlvblJlcXVlc3QoZGV2aWNlXywgbnVtZXJpY192YWx1ZSk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBBU1NFUlRfRVEoT3BDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKHVzZXJfY29uZl9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIFJlY2VpdmVTaW1wbGVQYWlyaW5nQ29tcGxldGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MsIGRldmljZV8pOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1fTsKLSAgaGNpOjpLZXlUeXBlIGtleV90eXBlID0gaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTjsKLSAgUmVjZWl2ZUxpbmtLZXlOb3RpZmljYXRpb24oZGV2aWNlXywgbGlua19rZXksIGtleV90eXBlKTsKLSAgQVNTRVJUX0VRKGxpbmtfa2V5LCBzZWN1cml0eV9yZWNvcmRfLT5HZXRMaW5rS2V5KCkpOwotICBBU1NFUlRfRVEoa2V5X3R5cGUsIHNlY3VyaXR5X3JlY29yZF8tPkdldEtleVR5cGUoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5Jc0F1dGhlbnRpY2F0ZWQoKSk7Ci0gIEFTU0VSVF9GQUxTRShzZWN1cml0eV9yZWNvcmRfLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkpOwotfQotCi1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgcmVtb3RlX2luaXRpYXRpZWRfbm9faW5wdXRfbm9fb3V0cHV0X25vX2lucHV0X25vX291dHB1dF93aXRoX21pc3Npbmdfb29iX2RhdGEpIHt9Ci0KLS8vIENyZWF0ZUJvbmRPdXRPZkJhbmQgbm9faW5wdXRfbm9fb3V0cHV0ICsgbm9faW5wdXRfbm9fb3V0cHV0IE9PQiBEYXRhIG1pc3Npbmcgd2hlbiBhc2tlZAotVEVTVF9GKENsYXNzaWNQYWlyaW5nSGFuZGxlclRlc3QsIGxvY2FsbHlfaW5pdGlhdGllZF9ub19pbnB1dF9ub19vdXRwdXRfbm9faW5wdXRfbm9fb3V0cHV0X3dpdGhfbWlzc2luZ19vb2JfZGF0YSkgewotICBleHBlY3Rfc3VjY2Vzc18gPSBmYWxzZTsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSA9IGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQ7Ci0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORzsKLSAgcGFpcmluZ19oYW5kbGVyXy0+SW5pdGlhdGUoCi0gICAgICB0cnVlLCBpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIHBhaXJpbmc6Ok9vYkRhdGEoKSwgcGFpcmluZzo6T29iRGF0YSgpKTsKLQotICBSZWNlaXZlTGlua0tleVJlcXVlc3QoZGV2aWNlXyk7Ci0gIGF1dG8gc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gbGlua19rZXlfbmVnX3JlcGx5ID0gaGNpOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUobGlua19rZXlfbmVnX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIGxpbmtfa2V5X25lZ19yZXBseS5HZXRPcENvZGUoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXF1ZXN0KGRldmljZV8pOwotICBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIGlvX2NhcF9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoaW9fY2FwX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldElvQ2FwYWJpbGl0eSgpKTsKLSAgQVNTRVJUX0VRKGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRPb2JQcmVzZW50KCkpOwotICBBU1NFUlRfRVEoaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cygpKTsKLSAgUmVjZWl2ZUlvQ2FwYWJpbGl0eVJlc3BvbnNlKAotICAgICAgZGV2aWNlXywKLSAgICAgIGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQsCi0gICAgICBoY2k6Ok9vYkRhdGFQcmVzZW50OjpOT1RfUFJFU0VOVCwKLSAgICAgIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkcpOwotICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYWlyaW5nIGhhbmRsZXIgdGhpbmtzIGl0IGhhcyBOT1RfUFJFU0VOVAotICBSZWNlaXZlT29iRGF0YVJlcXVlc3QoZGV2aWNlXyk7Ci0gIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBhdXRvIG9vYl9kYXRhX3JlcV9uZWdfcmVwbHkgPSBoY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZShzZWN1cml0eV9jb21tYW5kX3ZpZXcpOwotICBBU1NFUlRfVFJVRShvb2JfZGF0YV9yZXFfbmVnX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlJFTU9URV9PT0JfREFUQV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLCBvb2JfZGF0YV9yZXFfbmVnX3JlcGx5LkdldE9wQ29kZSgpKTsKLSAgUmVjZWl2ZVNpbXBsZVBhaXJpbmdDb21wbGV0ZShoY2k6OkVycm9yQ29kZTo6QVVUSEVOVElDQVRJT05fRkFJTFVSRSwgZGV2aWNlXyk7Ci19Ci0KLS8vIENyZWF0ZUJvbmRPdXRPZkJhbmQgbm9faW5wdXRfbm9fb3V0cHV0ICsgbm9faW5wdXRfbm9fb3V0cHV0IE9PQiBEYXRhIFAxOTIKLVRFU1RfRihDbGFzc2ljUGFpcmluZ0hhbmRsZXJUZXN0LCBsb2NhbGx5X2luaXRpYXRpZWRfbm9faW5wdXRfbm9fb3V0cHV0X25vX2lucHV0X25vX291dHB1dF9wMTkyX29vYl9kYXRhKSB7Ci0gIGhjaTo6SW9DYXBhYmlsaXR5IGluamVjdGVkX2lvX2NhcGFiaWxpdHkgPSBoY2k6OklvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkc7Ci0gIHBhaXJpbmc6Ok9vYkRhdGEgb29iX2RhdGEoCi0gICAgICB7MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sIHsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSk7Ci0gIHBhaXJpbmdfaGFuZGxlcl8tPkluaXRpYXRlKAotICAgICAgdHJ1ZSwgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSwgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzLCBvb2JfZGF0YSwgcGFpcmluZzo6T29iRGF0YSgpKTsKLQotICBSZWNlaXZlTGlua0tleVJlcXVlc3QoZGV2aWNlXyk7Ci0gIGF1dG8gc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gbGlua19rZXlfbmVnX3JlcGx5ID0gaGNpOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUobGlua19rZXlfbmVnX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIGxpbmtfa2V5X25lZ19yZXBseS5HZXRPcENvZGUoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXF1ZXN0KGRldmljZV8pOwotICBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIGlvX2NhcF9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoaW9fY2FwX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldElvQ2FwYWJpbGl0eSgpKTsKLSAgQVNTRVJUX0VRKGhjaTo6T29iRGF0YVByZXNlbnQ6OlBfMTkyX1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoCi0gICAgICBkZXZpY2VfLAotICAgICAgaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwKLSAgICAgIGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULAotICAgICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORyk7Ci0gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhaXJpbmcgaGFuZGxlciB0aGlua3MgaXQgaGFzIE5PVF9QUkVTRU5UCi0gIFJlY2VpdmVPb2JEYXRhUmVxdWVzdChkZXZpY2VfKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIC8vIE5PVEUob3B0ZWRvYmxpdmlvbik6IEV4dGVuZGVkIGRhdGEgaXMgbWFudWFsbHkgZGlzYWJsZWQgaW4gdGhlIHBhaXJpbmcgaGFuZGxlcgotICAvLyBzaW5jZSB0aGUgY29udHJvbGxlciBkb2Vzbid0IHNlZW0gdG8gY3VycmVudGx5IGhhdmUgc3VwcG9ydC4KLSAgYXV0byBvb2JfZGF0YV9yZXFfcmVwbHkgPSBoY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUob29iX2RhdGFfcmVxX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlJFTU9URV9PT0JfREFUQV9SRVFVRVNUX1JFUExZLCBvb2JfZGF0YV9yZXFfcmVwbHkuR2V0T3BDb2RlKCkpOwotICBSZWNlaXZlU2ltcGxlUGFpcmluZ0NvbXBsZXRlKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCBkZXZpY2VfKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbGlua19rZXkgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNX07Ci0gIGhjaTo6S2V5VHlwZSBrZXlfdHlwZSA9IGhjaTo6S2V5VHlwZTo6REVCVUdfQ09NQklOQVRJT047Ci0gIFJlY2VpdmVMaW5rS2V5Tm90aWZpY2F0aW9uKGRldmljZV8sIGxpbmtfa2V5LCBrZXlfdHlwZSk7Ci0gIEFTU0VSVF9FUShsaW5rX2tleSwgc2VjdXJpdHlfcmVjb3JkXy0+R2V0TGlua0tleSgpKTsKLSAgQVNTRVJUX0VRKGtleV90eXBlLCBzZWN1cml0eV9yZWNvcmRfLT5HZXRLZXlUeXBlKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+SXNBdXRoZW50aWNhdGVkKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+UmVxdWlyZXNNaXRtUHJvdGVjdGlvbigpKTsKLX0KLQotLy8gQ3JlYXRlQm9uZE91dE9mQmFuZCBub19pbnB1dF9ub19vdXRwdXQgKyBub19pbnB1dF9ub19vdXRwdXQgT09CIERhdGEgUDI1NgotVEVTVF9GKENsYXNzaWNQYWlyaW5nSGFuZGxlclRlc3QsIGxvY2FsbHlfaW5pdGlhdGllZF9ub19pbnB1dF9ub19vdXRwdXRfbm9faW5wdXRfbm9fb3V0cHV0X3AyNTZfb29iX2RhdGEpIHsKLSAgaGNpOjpJb0NhcGFiaWxpdHkgaW5qZWN0ZWRfaW9fY2FwYWJpbGl0eSA9IGhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQ7Ci0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgaW5qZWN0ZWRfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORzsKLSAgcGFpcmluZzo6T29iRGF0YSBvb2JfZGF0YSgKLSAgICAgIHsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgezEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9KTsKLSAgcGFpcmluZ19oYW5kbGVyXy0+SW5pdGlhdGUoCi0gICAgICB0cnVlLCBpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIHBhaXJpbmc6Ok9vYkRhdGEoKSwgb29iX2RhdGEpOwotICBSZWNlaXZlTGlua0tleVJlcXVlc3QoZGV2aWNlXyk7Ci0gIGF1dG8gc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gbGlua19rZXlfbmVnX3JlcGx5ID0gaGNpOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUobGlua19rZXlfbmVnX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OkxJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIGxpbmtfa2V5X25lZ19yZXBseS5HZXRPcENvZGUoKSk7Ci0gIFJlY2VpdmVJb0NhcGFiaWxpdHlSZXF1ZXN0KGRldmljZV8pOwotICBzZWN1cml0eV9jb21tYW5kX3ZpZXcgPSBHZXRMYXN0Q29tbWFuZChoY2lfbGF5ZXJfKTsKLSAgQVNTRVJUX0VRKE9wQ29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBzZWN1cml0eV9jb21tYW5kX3ZpZXcuR2V0T3BDb2RlKCkpOwotICBhdXRvIGlvX2NhcF9yZXF1ZXN0X3JlcGx5ID0gaGNpOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUoaW9fY2FwX3JlcXVlc3RfcmVwbHkuSXNWYWxpZCgpKTsKLSAgQVNTRVJUX0VRKGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldElvQ2FwYWJpbGl0eSgpKTsKLSAgQVNTRVJUX0VRKGhjaTo6T29iRGF0YVByZXNlbnQ6OlBfMjU2X1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoCi0gICAgICBkZXZpY2VfLAotICAgICAgaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwKLSAgICAgIGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULAotICAgICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORyk7Ci0gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhaXJpbmcgaGFuZGxlciB0aGlua3MgaXQgaGFzIE5PVF9QUkVTRU5UCi0gIFJlY2VpdmVPb2JEYXRhUmVxdWVzdChkZXZpY2VfKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gb29iX2RhdGFfcmVxX3JlcGx5ID0gaGNpOjpSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUob29iX2RhdGFfcmVxX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlJFTU9URV9PT0JfRVhURU5ERURfREFUQV9SRVFVRVNUX1JFUExZLCBvb2JfZGF0YV9yZXFfcmVwbHkuR2V0T3BDb2RlKCkpOwotICBSZWNlaXZlU2ltcGxlUGFpcmluZ0NvbXBsZXRlKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCBkZXZpY2VfKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbGlua19rZXkgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNX07Ci0gIGhjaTo6S2V5VHlwZSBrZXlfdHlwZSA9IGhjaTo6S2V5VHlwZTo6REVCVUdfQ09NQklOQVRJT047Ci0gIFJlY2VpdmVMaW5rS2V5Tm90aWZpY2F0aW9uKGRldmljZV8sIGxpbmtfa2V5LCBrZXlfdHlwZSk7Ci0gIEFTU0VSVF9FUShsaW5rX2tleSwgc2VjdXJpdHlfcmVjb3JkXy0+R2V0TGlua0tleSgpKTsKLSAgQVNTRVJUX0VRKGtleV90eXBlLCBzZWN1cml0eV9yZWNvcmRfLT5HZXRLZXlUeXBlKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+SXNBdXRoZW50aWNhdGVkKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+UmVxdWlyZXNNaXRtUHJvdGVjdGlvbigpKTsKLX0KLQotLy8gQ3JlYXRlQm9uZE91dE9mQmFuZCBub19pbnB1dF9ub19vdXRwdXQgKyBub19pbnB1dF9ub19vdXRwdXQgT09CIERhdGEgUDE5MiBhbmQgMjU2Ci1URVNUX0YoQ2xhc3NpY1BhaXJpbmdIYW5kbGVyVGVzdCwgbG9jYWxseV9pbml0aWF0aWVkX25vX2lucHV0X25vX291dHB1dF9ub19pbnB1dF9ub19vdXRwdXRfcDE5Ml9hbmRfMjU2X29vYl9kYXRhKSB7Ci0gIGhjaTo6SW9DYXBhYmlsaXR5IGluamVjdGVkX2lvX2NhcGFiaWxpdHkgPSBoY2k6OklvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9IGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6Ok5PX0JPTkRJTkc7Ci0gIHBhaXJpbmc6Ok9vYkRhdGEgb29iX2RhdGEoCi0gICAgICB7MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sIHsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSk7Ci0gIHBhaXJpbmdfaGFuZGxlcl8tPkluaXRpYXRlKHRydWUsIGluamVjdGVkX2lvX2NhcGFiaWxpdHksIGluamVjdGVkX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cywgb29iX2RhdGEsIG9vYl9kYXRhKTsKLSAgUmVjZWl2ZUxpbmtLZXlSZXF1ZXN0KGRldmljZV8pOwotICBhdXRvIHNlY3VyaXR5X2NvbW1hbmRfdmlldyA9IEdldExhc3RDb21tYW5kKGhjaV9sYXllcl8pOwotICBhdXRvIGxpbmtfa2V5X25lZ19yZXBseSA9IGhjaTo6TGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGxpbmtfa2V5X25lZ19yZXBseS5Jc1ZhbGlkKCkpOwotICBBU1NFUlRfRVEoT3BDb2RlOjpMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLCBsaW5rX2tleV9uZWdfcmVwbHkuR2V0T3BDb2RlKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVxdWVzdChkZXZpY2VfKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVF9SRVBMWSwgc2VjdXJpdHlfY29tbWFuZF92aWV3LkdldE9wQ29kZSgpKTsKLSAgYXV0byBpb19jYXBfcmVxdWVzdF9yZXBseSA9IGhjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKHNlY3VyaXR5X2NvbW1hbmRfdmlldyk7Ci0gIEFTU0VSVF9UUlVFKGlvX2NhcF9yZXF1ZXN0X3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9pb19jYXBhYmlsaXR5LCBpb19jYXBfcmVxdWVzdF9yZXBseS5HZXRJb0NhcGFiaWxpdHkoKSk7Ci0gIEFTU0VSVF9FUShoY2k6Ok9vYkRhdGFQcmVzZW50OjpQXzE5Ml9BTkRfMjU2X1BSRVNFTlQsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldE9vYlByZXNlbnQoKSk7Ci0gIEFTU0VSVF9FUShpbmplY3RlZF9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMsIGlvX2NhcF9yZXF1ZXN0X3JlcGx5LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotICBSZWNlaXZlSW9DYXBhYmlsaXR5UmVzcG9uc2UoCi0gICAgICBkZXZpY2VfLAotICAgICAgaGNpOjpJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwKLSAgICAgIGhjaTo6T29iRGF0YVByZXNlbnQ6Ok5PVF9QUkVTRU5ULAotICAgICAgaGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Tk9fQk9ORElORyk7Ci0gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhaXJpbmcgaGFuZGxlciB0aGlua3MgaXQgaGFzIE5PVF9QUkVTRU5UCi0gIFJlY2VpdmVPb2JEYXRhUmVxdWVzdChkZXZpY2VfKTsKLSAgc2VjdXJpdHlfY29tbWFuZF92aWV3ID0gR2V0TGFzdENvbW1hbmQoaGNpX2xheWVyXyk7Ci0gIGF1dG8gb29iX2RhdGFfcmVxX3JlcGx5ID0gaGNpOjpSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoc2VjdXJpdHlfY29tbWFuZF92aWV3KTsKLSAgQVNTRVJUX1RSVUUob29iX2RhdGFfcmVxX3JlcGx5LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9FUShPcENvZGU6OlJFTU9URV9PT0JfRVhURU5ERURfREFUQV9SRVFVRVNUX1JFUExZLCBvb2JfZGF0YV9yZXFfcmVwbHkuR2V0T3BDb2RlKCkpOwotICBSZWNlaXZlU2ltcGxlUGFpcmluZ0NvbXBsZXRlKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTLCBkZXZpY2VfKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbGlua19rZXkgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMCwgMSwgMiwgMywgNCwgNX07Ci0gIGhjaTo6S2V5VHlwZSBrZXlfdHlwZSA9IGhjaTo6S2V5VHlwZTo6REVCVUdfQ09NQklOQVRJT047Ci0gIFJlY2VpdmVMaW5rS2V5Tm90aWZpY2F0aW9uKGRldmljZV8sIGxpbmtfa2V5LCBrZXlfdHlwZSk7Ci0gIEFTU0VSVF9FUShsaW5rX2tleSwgc2VjdXJpdHlfcmVjb3JkXy0+R2V0TGlua0tleSgpKTsKLSAgQVNTRVJUX0VRKGtleV90eXBlLCBzZWN1cml0eV9yZWNvcmRfLT5HZXRLZXlUeXBlKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+SXNBdXRoZW50aWNhdGVkKCkpOwotICBBU1NFUlRfRkFMU0Uoc2VjdXJpdHlfcmVjb3JkXy0+UmVxdWlyZXNNaXRtUHJvdGVjdGlvbigpKTsKLX0KLQotLyoqKiBOdW1lcmljIENvbXBhcmlzb24gKioqLwotLy8gZGlzcGxheV95ZXNfbm8gKyBkaXNwbGF5X29ubHkKLQotLy8gZGlzcGxheV95ZXNfbm8gKyBkaXNwbGF5X3llc19ubwotLy8gZGlzcGxheV95ZXNfbm8gKyBrZXlib2FyZF9vbmx5Ci0vLyBkaXNwbGF5X3llc19ubyArIG5vX2lucHV0X25vX291dHB1dAotCi0vLyBrZXlib2FyZF9vbmx5ICsgZGlzcGxheV9vbmx5Ci0vLyBrZXlib2FyZF9vbmx5ICsgZGlzcGxheV95ZXNfbm8KLQotLy8ga2V5Ym9hcmRfb25seSArIGtleWJvYXJkX29ubHkgIChhIGp1c3Qgd29ya3MgSSBtaXNzZWQpCi0KLS8vIFJlbW90ZWx5IGluaXRpYXRlZAotCi0vLyBDb2xsaXNpb25zCi0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHBhaXJpbmcKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcGFpcmluZy9vb2JfZGF0YS5oIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZy9vb2JfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQzMGEyLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvb29iX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikgb3ZlcnJpZGU7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgcGFpcmluZyB7Ci0KLXVzaW5nIFNpbXBsZVBhaXJpbmdIYXNoID0gc3RkOjphcnJheTx1aW50OF90LCAxNj47Ci11c2luZyBTaW1wbGVQYWlyaW5nUmFuZG9taXplciA9IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+OwotCi1jbGFzcyBPb2JEYXRhIHsKLSBwdWJsaWM6Ci0gIE9vYkRhdGEoKSB7fQotICBPb2JEYXRhKFNpbXBsZVBhaXJpbmdIYXNoIEMsIFNpbXBsZVBhaXJpbmdSYW5kb21pemVyIFIpIDogQ18oQyksIFJfKFIpIHt9Ci0KLSAgU2ltcGxlUGFpcmluZ0hhc2ggR2V0QygpIHsKLSAgICByZXR1cm4gQ187Ci0gIH0KLQotICBTaW1wbGVQYWlyaW5nUmFuZG9taXplciBHZXRSKCkgewotICAgIHJldHVybiBSXzsKLSAgfQotCi0gIGJvb2wgSXNWYWxpZCgpIHsKLSAgICByZXR1cm4gIXN0ZDo6YWxsX29mKENfLmJlZ2luKCksIENfLmVuZCgpLCBbXSh1aW50OF90IGIpIHsgcmV0dXJuIGIgPT0gMDsgfSkgJiYKLSAgICAgICAgICAgIXN0ZDo6YWxsX29mKFJfLmJlZ2luKCksIFJfLmVuZCgpLCBbXSh1aW50OF90IGIpIHsgcmV0dXJuIGIgPT0gMDsgfSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFNpbXBsZVBhaXJpbmdIYXNoIENfID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICBTaW1wbGVQYWlyaW5nUmFuZG9taXplciBSXyA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWlyaW5nCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvcGFpcmluZ19oYW5kbGVyLmggYi9nZC9zZWN1cml0eS9wYWlyaW5nL3BhaXJpbmdfaGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQ4ODgzLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3BhaXJpbmcvcGFpcmluZ19oYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxuZWlnaGJvci9uYW1lX2RiLmg+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm5laWdoYm9yL25hbWVfZGIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9jaGFubmVsL3NlY3VyaXR5X21hbmFnZXJfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmcvb29iX2RhdGEuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc21wX3BhY2tldHMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS91aS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgcGFpcmluZyB7Ci0KLS8qKgotICogQmFzZSBzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIHBhaXJpbmcgZXZlbnRzLgotICoKLSAqIDxwPkV4dGVuZCB0aGlzIGNsYXNzIGluIG9yZGVyIHRvIGltcGxlbWVudCBhIG5ldyBzdHlsZSBvZiBwYWlyaW5nLgotICovCi1jbGFzcyBQYWlyaW5nSGFuZGxlciA6IHB1YmxpYyBVSUNhbGxiYWNrcyB7Ci0gcHVibGljOgotICBQYWlyaW5nSGFuZGxlcigKLSAgICAgIGNoYW5uZWw6OlNlY3VyaXR5TWFuYWdlckNoYW5uZWwqIHNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbCwKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPiByZWNvcmQsCi0gICAgICBuZWlnaGJvcjo6TmFtZURiTW9kdWxlKiBuYW1lX2RiX21vZHVsZSkKLSAgICAgIDogc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXyhzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWwpLAotICAgICAgICByZWNvcmRfKHN0ZDo6bW92ZShyZWNvcmQpKSwKLSAgICAgICAgbmFtZV9kYl9tb2R1bGVfKG5hbWVfZGJfbW9kdWxlKSB7fQotICB+UGFpcmluZ0hhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQ2xhc3NpYwotICB2aXJ0dWFsIHZvaWQgSW5pdGlhdGUoCi0gICAgICBib29sIGxvY2FsbHlfaW5pdGlhdGVkLAotICAgICAgaGNpOjpJb0NhcGFiaWxpdHkgaW9fY2FwYWJpbGl0eSwKLSAgICAgIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgYXV0aF9yZXF1aXJlbWVudHMsCi0gICAgICBPb2JEYXRhIGxvY2FsX3AxOTJfb29iX2RhdGEsCi0gICAgICBPb2JEYXRhIGxvY2FsX3AyNTZfb29iX2RhdGEpID0gMDsKLSAgdmlydHVhbCB2b2lkIENhbmNlbCgpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZShoY2k6OkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5Q29tcGxldGVWaWV3IHBhY2tldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlKGhjaTo6Q2VudHJhbExpbmtLZXlDb21wbGV0ZVZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpQaW5Db2RlUmVxdWVzdFZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpMaW5rS2V5UmVxdWVzdFZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpMaW5rS2V5Tm90aWZpY2F0aW9uVmlldyBwYWNrZXQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZShoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RWaWV3IHBhY2tldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlKGhjaTo6SW9DYXBhYmlsaXR5UmVzcG9uc2VWaWV3IHBhY2tldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlKGhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlVmlldyBwYWNrZXQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZShoY2k6OlJldHVybkxpbmtLZXlzVmlldyBwYWNrZXQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZShoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3IHBhY2tldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlKGhjaTo6RW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZVZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpSZW1vdGVPb2JEYXRhUmVxdWVzdFZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpVc2VyUGFzc2tleU5vdGlmaWNhdGlvblZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpVc2VyQ29uZmlybWF0aW9uUmVxdWVzdFZpZXcgcGFja2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblJlY2VpdmUoaGNpOjpVc2VyUGFzc2tleVJlcXVlc3RWaWV3IHBhY2tldCkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBPblBhaXJpbmdQcm9tcHRBY2NlcHRlZChjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBib29sIGNvbmZpcm1lZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25Db25maXJtWWVzTm8oY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgYm9vbCBjb25maXJtZWQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUGFzc2tleUVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHVpbnQzMl90IHBhc3NrZXkpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUGluRW50cnkoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGluKSBvdmVycmlkZSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPiBHZXRSZWNvcmQoKSB7Ci0gICAgcmV0dXJuIHJlY29yZF87Ci0gIH0KLSAgY2hhbm5lbDo6U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCogR2V0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXzsKLSAgfQotICBuZWlnaGJvcjo6TmFtZURiTW9kdWxlKiBHZXROYW1lRGJNb2R1bGUoKSB7Ci0gICAgcmV0dXJuIG5hbWVfZGJfbW9kdWxlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2hhbm5lbDo6U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCogc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLSAgc3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+IHJlY29yZF8gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIG5laWdoYm9yOjpOYW1lRGJNb2R1bGUqIG5hbWVfZGJfbW9kdWxlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWlyaW5nCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3BhaXJpbmdfZmFpbHVyZS5oIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZ19mYWlsdXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWE0ZjkuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvcGFpcmluZ19mYWlsdXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInNlY3VyaXR5L3NtcF9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWlsdXJlIGluIGNhc2Ugb2YgYWlyaW5nIGZhaWx1cmUgKi8KLXN0cnVjdCBQYWlyaW5nRmFpbHVyZSB7Ci0gIC8qIEEgcGxhY2UgaW4gY29kZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGZhaWx1cmUuIEl0IGNhbiBiZSBtb2RpZmllZCBieSBmdW5jdGlvbnMgdGhhdCBwYXNzIHRoZSBlcnJvciB0byBhIGxvY2F0aW9uIHRoYXQKLSAgICogYmV0dGVyIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUgb2YgZmxvdy4gaS5lLiBpbnN0ZWFkIG9mIGdlbmVyaWMgbG9jYXRpb24gcmVzcG9uc2libGUgZm9yIHdhaXRpbmcgZm9yIHBhY2tldCwKLSAgICogcmVwbGFjZSBpdCB3aXRoIGxvY2F0aW9uIG9mIHJlY2VpdmluZyBzcGVjaWZpYyBwYWNrZXQgaW4gYSBzcGVjaWZpYyBmbG93ICovCi0gIC8vIGJhc2U6OkxvY2F0aW9uIGxvY2F0aW9uOwotCi0gIC8qIFRoaXMgaXMgdGhlIGZhaWx1cmUgbWVzc2FnZSwgdGhhdCB3aWxsIGJlIHBhc3NlZCwgZWl0aGVyIGludG8gdXBwZXIgbGF5ZXJzLAotICAgKiBvciB0byB0aGUgbWV0cmljcyBpbiBmdXR1cmUgKi8KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKLQotICAvKiBJZiBmYWlsdXJlIGlzIGR1ZSB0byBtaXNtYXRjaCBvZiByZWNlaXZlZCBjb2RlLCB0aGlzIGNvbnRhaW5zIHRoZSByZWNlaXZlZCBvcGNvZGUgKi8KLSAgQ29kZSByZWNlaXZlZF9jb2RlX3swfTsKLQotICAvKiBpZiB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gIlNNUCBmYWlsdXJlIiwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgcmVzb24gY29kZQotICAgKi8KLSAgUGFpcmluZ0ZhaWxlZFJlYXNvbiByZWFzb257MH07Ci0KLSAgUGFpcmluZ0ZhaWx1cmUoLypjb25zdCBiYXNlOjpMb2NhdGlvbiYgbG9jYXRpb24sICovIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQotICAgICAgOiAvKmxvY2F0aW9uKGxvY2F0aW9uKSwgKi8gbWVzc2FnZShtZXNzYWdlKSB7fQotCi0gIFBhaXJpbmdGYWlsdXJlKC8qY29uc3QgYmFzZTo6TG9jYXRpb24mIGxvY2F0aW9uLCAqLyBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgQ29kZSByZWNlaXZlZF9jb2RlKQotICAgICAgOiAvKmxvY2F0aW9uKGxvY2F0aW9uKSwgKi8gbWVzc2FnZShtZXNzYWdlKSwgcmVjZWl2ZWRfY29kZV8ocmVjZWl2ZWRfY29kZSkge30KLQotICBQYWlyaW5nRmFpbHVyZSgvKmNvbnN0IGJhc2U6OkxvY2F0aW9uJiBsb2NhdGlvbiwgKi8gY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIFBhaXJpbmdGYWlsZWRSZWFzb24gcmVhc29uKQotICAgICAgOiAvKmxvY2F0aW9uKGxvY2F0aW9uKSwqLyBtZXNzYWdlKG1lc3NhZ2UpLCByZWFzb24ocmVhc29uKSB7fQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmNjIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZkZTUzLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3BhaXJpbmdfaGFuZGxlcl9sZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmgiCi0KLSNpbmNsdWRlICJvcy9yYW5kLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotTXlPb2JEYXRhIFBhaXJpbmdIYW5kbGVyTGU6OkdlbmVyYXRlT29iRGF0YSgpIHsKLSAgTXlPb2JEYXRhIGRhdGF7fTsKLSAgc3RkOjp0aWUoZGF0YS5wcml2YXRlX2tleSwgZGF0YS5wdWJsaWNfa2V5KSA9IEdlbmVyYXRlRUNESEtleVBhaXIoKTsKLQotICBkYXRhLnIgPSBibHVldG9vdGg6Om9zOjpHZW5lcmF0ZVJhbmRvbTwxNj4oKTsKLSAgZGF0YS5jID0gY3J5cHRvX3Rvb2xib3g6OmY0KGRhdGEucHVibGljX2tleS54LmRhdGEoKSwgZGF0YS5wdWJsaWNfa2V5LnguZGF0YSgpLCBkYXRhLnIsIDApOwotICByZXR1cm4gZGF0YTsKLX0KLQotdm9pZCBQYWlyaW5nSGFuZGxlckxlOjpQYWlyaW5nTWFpbihJbml0aWFsSW5mb3JtYXRpb25zIGkpIHsKLSAgTE9HX0lORk8oIlBhaXJpbmcgU3RhcnRlZCIpOwotCi0gIGlmIChpLnJlbW90ZWx5X2luaXRpYXRlZCkgewotICAgIExPR19JTkZPKCJXYXMgcmVtb3RlbHkgaW5pdGlhdGVkLCBwcmVzZW50aW5nIHVzZXIgd2l0aCB0aGUgYWNjZXB0IHByb21wdCIpOwotICAgIGkudXNlcl9pbnRlcmZhY2VfaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZVSTo6RGlzcGxheVBhaXJpbmdQcm9tcHQsIGNvbW1vbjo6VW5yZXRhaW5lZChpLnVzZXJfaW50ZXJmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MsIGkucmVtb3RlX25hbWUpKTsKLQotICAgIC8vIElmIHBhaXJpbmcgd2FzIGluaXRpYXRlZCBieSByZW1vdGUgZGV2aWNlLCB3YWl0IGZvciB0aGUgdXNlciB0byBhY2NlcHQKLSAgICAvLyB0aGUgcmVxdWVzdCBmcm9tIHRoZSBVSS4KLSAgICBMT0dfSU5GTygiV2FpdGluZyBmb3IgdGhlIHByb21wdCByZXNwb25zZSIpOwotICAgIHN0ZDo6b3B0aW9uYWw8UGFpcmluZ0V2ZW50PiBwYWlyaW5nQWNjZXB0ZWQgPSBXYWl0VWlQYWlyaW5nQWNjZXB0KCk7Ci0gICAgaWYgKCFwYWlyaW5nQWNjZXB0ZWQgfHwgcGFpcmluZ0FjY2VwdGVkLT51aV92YWx1ZSA9PSAwKSB7Ci0gICAgICBMT0dfSU5GTygiVXNlciBlaXRoZXIgZGlkIG5vdCBhY2NlcHQgdGhlIHJlbW90ZSBwYWlyaW5nLCBvciB0aGUgcHJvbXB0IHRpbWVkIG91dCIpOwotICAgICAgLy8gVE9ETzogVW5jb21tZW50IHRoaXMgb25lIG9uY2Ugd2UgZmluZCBhIHdheSB0byBhdHRlbXB0IHRvIHNlbmQgcGFja2V0IHdoZW4gdGhlIGxpbmsgaXMgZG93bgotICAgICAgLy8gU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6VU5TUEVDSUZJRURfUkVBU09OKSk7Ci0gICAgICBpLk9uUGFpcmluZ0ZpbmlzaGVkKFBhaXJpbmdGYWlsdXJlKCJVc2VyIGVpdGhlciBkaWQgbm90IGFjY2VwdCB0aGUgcmVtb3RlIHBhaXJpbmcsIG9yIHRoZSBwcm9tcHQgdGltZWQgb3V0IikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPR19JTkZPKCJQYWlyaW5nIHByb21wdCBhY2NlcHRlZCIpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQSEFTRSAxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgUGhhc2UxUmVzdWx0T3JGYWlsdXJlIHBoYXNlXzFfcmVzdWx0ID0gRXhjaGFuZ2VQYWlyaW5nRmVhdHVyZShpKTsKLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHBoYXNlXzFfcmVzdWx0KSkgewotICAgIExPR19XQVJOKCJQYWlyaW5nIGZhaWxlZCBpbiBwaGFzZSAxIik7Ci0gICAgLy8gV2UgYWxyZWFkeSBzZW5kIHBhaXJpbmcgZmlhbGVkIGluIGxvd2VyIGxheWVyLiBXaGljaCBvbmUgc2hvdWxkIGRvIHRoYXQgPyBob3cgYWJvdXQgZGlzY29ubmVjaXRvbj8KLSAgICAvLyBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ0ZhaWxlZEJ1aWxkZXI6OkNyZWF0ZShQYWlyaW5nRmFpbGVkUmVhc29uOjpVTlNQRUNJRklFRF9SRUFTT04pKTsKLSAgICAvLyBUT0RPOiBkaXNjb25uZWN0PwotICAgIGkuT25QYWlyaW5nRmluaXNoZWQoc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHBoYXNlXzFfcmVzdWx0KSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBbcGFpcmluZ19yZXF1ZXN0LCBwYWlyaW5nX3Jlc3BvbnNlXSA9IHN0ZDo6Z2V0PFBoYXNlMVJlc3VsdD4ocGhhc2VfMV9yZXN1bHQpOwotCi0gIHVpbnQ4X3Qga2V5X3NpemUgPQotICAgICAgc3RkOjptaW4ocGFpcmluZ19yZXF1ZXN0LkdldE1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSgpLCBwYWlyaW5nX3Jlc3BvbnNlLkdldE1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSgpKTsKLSAgaWYgKGtleV9zaXplIDwgNyB8fCBrZXlfc2l6ZSA+IDE2KSB7Ci0gICAgTE9HX1dBUk4oIlJlc3VsdGluZyBrZXkgc2l6ZSBpcyBiYWQgJWQiLCBrZXlfc2l6ZSk7Ci0gICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6RU5DUllQVElPTl9LRVlfU0laRSkpOwotICAgIGkuT25QYWlyaW5nRmluaXNoZWQoUGFpcmluZ0ZhaWx1cmUoIlJlc3VsdGluZyBrZXkgc2l6ZSBpcyBiYWQiLCBQYWlyaW5nRmFpbGVkUmVhc29uOjpFTkNSWVBUSU9OX0tFWV9TSVpFKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChrZXlfc2l6ZSAhPSAxNikgewotICAgIExPR19XQVJOKCJSZXN1bHRpbmcga2V5IHNpemUgaXMgbGVzcyB0aGFuIDE2IG9jdGV0cyEiKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUEhBU0UgMiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIGJvb2wgaXNTZWN1cmVDb25uZWN0aW9ucyA9IHBhaXJpbmdfcmVxdWVzdC5HZXRBdXRoUmVxKCkgJiBwYWlyaW5nX3Jlc3BvbnNlLkdldEF1dGhSZXEoKSAmIEF1dGhSZXFNYXNrU2M7Ci0gIGlmIChpc1NlY3VyZUNvbm5lY3Rpb25zKSB7Ci0gICAgLy8gMi4zLjUuNiBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgcGFpcmluZyBwaGFzZSAyCi0gICAgTE9HX0lORk8oIlBhaXJpbmcgUGhhc2UgMiBMRSBTZWN1cmUgY29ubmVjdGlvbnMgU3RhcnRlZCIpOwotCi0gICAgLyoKLSAgICBUT0RPOiB3aGF0IHRvIGRvIHdpdGggdGhpcyBwaWVjZSBvZiBzcGVjID8KLSAgICBJZiBTZWN1cmUgQ29ubmVjdGlvbnMgcGFpcmluZyBoYXMgYmVlbiBpbml0aWF0ZWQgb3ZlciBCUi9FRFIsIHRoZQotICAgIGZvbGxvd2luZyBmaWVsZHMgb2YgdGhlIFNNIFBhaXJpbmcgUmVxdWVzdCBQRFUgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOgotICAgICDigKIgdGhlIElPIENhcGFiaWxpdHkgZmllbGQsCi0gICAgIOKAoiB0aGUgT09CIGRhdGEgZmxhZyBmaWVsZCwgYW5kCi0gICAgIOKAoiBhbGwgYml0cyBpbiB0aGUgQXV0aCBSZXEgZmllbGQgZXhjZXB0IHRoZSBDVDIgYml0LgotICAgICovCi0KLSAgICBPb2JEYXRhRmxhZyByZW1vdGVfaGF2ZV9vb2JfZGF0YSA9Ci0gICAgICAgIElBbUNlbnRyYWwoaSkgPyBwYWlyaW5nX3Jlc3BvbnNlLkdldE9vYkRhdGFGbGFnKCkgOiBwYWlyaW5nX3JlcXVlc3QuR2V0T29iRGF0YUZsYWcoKTsKLQotICAgIGF1dG8ga2V5X2V4Y2hhbmdlX3Jlc3VsdCA9IEV4Y2hhbmdlUHVibGljS2V5cyhpLCByZW1vdGVfaGF2ZV9vb2JfZGF0YSk7Ci0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KGtleV9leGNoYW5nZV9yZXN1bHQpKSB7Ci0gICAgICBMT0dfRVJST1IoIlB1YmxpYyBrZXkgZXhjaGFuZ2UgZmFpbGVkIik7Ci0gICAgICBpLk9uUGFpcmluZ0ZpbmlzaGVkKHN0ZDo6Z2V0PFBhaXJpbmdGYWlsdXJlPihrZXlfZXhjaGFuZ2VfcmVzdWx0KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gW1BLYSwgUEtiLCBkaGtleV0gPSBzdGQ6OmdldDxLZXlFeGNoYW5nZVJlc3VsdD4oa2V5X2V4Y2hhbmdlX3Jlc3VsdCk7Ci0KLSAgICAvLyBQdWJsaWMga2V5IGV4Y2hhbmdlIGZpbmlzaGVkLCBEaWZmaWUtSGVsbG1hbiBrZXkgY29tcHV0ZWQuCi0KLSAgICBTdGFnZTFSZXN1bHRPckZhaWx1cmUgc3RhZ2UxcmVzdWx0ID0gRG9TZWN1cmVDb25uZWN0aW9uc1N0YWdlMShpLCBQS2EsIFBLYiwgcGFpcmluZ19yZXF1ZXN0LCBwYWlyaW5nX3Jlc3BvbnNlKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4oc3RhZ2UxcmVzdWx0KSkgewotICAgICAgaS5PblBhaXJpbmdGaW5pc2hlZChzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4oc3RhZ2UxcmVzdWx0KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3RhZ2UyUmVzdWx0T3JGYWlsdXJlIHN0YWdlXzJfcmVzdWx0ID0gRG9TZWN1cmVDb25uZWN0aW9uc1N0YWdlMihpLCBQS2EsIFBLYiwgcGFpcmluZ19yZXF1ZXN0LCBwYWlyaW5nX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8U3RhZ2UxUmVzdWx0PihzdGFnZTFyZXN1bHQpLCBkaGtleSk7Ci0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHN0YWdlXzJfcmVzdWx0KSkgewotICAgICAgaS5PblBhaXJpbmdGaW5pc2hlZChzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4oc3RhZ2VfMl9yZXN1bHQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBPY3RldDE2IGx0ayA9IHN0ZDo6Z2V0PE9jdGV0MTY+KHN0YWdlXzJfcmVzdWx0KTsKLSAgICAvLyBNYXNrIHRoZSBrZXkKLSAgICBzdGQ6OmZpbGwobHRrLmJlZ2luKCkgKyBrZXlfc2l6ZSwgbHRrLmVuZCgpLCAweDAwKTsKLQotICAgIGlmIChJQW1DZW50cmFsKGkpKSB7Ci0gICAgICBMT0dfSU5GTygiU2VuZGluZyBzdGFydCBlbmNyeXB0aW9uIHJlcXVlc3QiKTsKLSAgICAgIFNlbmRIY2lMZVN0YXJ0RW5jcnlwdGlvbihpLCBpLmNvbm5lY3Rpb25faGFuZGxlLCB7MH0sIHswfSwgbHRrKTsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBsdGtfcmVxID0gV2FpdExlTG9uZ1Rlcm1LZXlSZXF1ZXN0KCk7Ci0gICAgICBTZW5kSGNpTGVMb25nVGVybUtleVJlcGx5KGksIGkuY29ubmVjdGlvbl9oYW5kbGUsIGx0ayk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIDIuMy41LjUgTEUgbGVnYWN5IHBhaXJpbmcgcGhhc2UgMgotICAgIExPR19JTkZPKCJQYWlyaW5nIFBoYXNlIDIgTEUgbGVnYWN5IHBhaXJpbmcgU3RhcnRlZCIpOwotCi0gICAgTGVnYWN5U3RhZ2UxUmVzdWx0T3JGYWlsdXJlIHN0YWdlMXJlc3VsdCA9IERvTGVnYWN5U3RhZ2UxKGksIHBhaXJpbmdfcmVxdWVzdCwgcGFpcmluZ19yZXNwb25zZSk7Ci0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHN0YWdlMXJlc3VsdCkpIHsKLSAgICAgIExPR19FUlJPUigiUGhhc2UgMSBmYWlsZWQiKTsKLSAgICAgIGkuT25QYWlyaW5nRmluaXNoZWQoc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHN0YWdlMXJlc3VsdCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE9jdGV0MTYgdGsgPSBzdGQ6OmdldDxPY3RldDE2PihzdGFnZTFyZXN1bHQpOwotICAgIFN0a09yRmFpbHVyZSBzdGFnZTJyZXN1bHQgPSBEb0xlZ2FjeVN0YWdlMihpLCBwYWlyaW5nX3JlcXVlc3QsIHBhaXJpbmdfcmVzcG9uc2UsIHRrKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4oc3RhZ2UycmVzdWx0KSkgewotICAgICAgTE9HX0VSUk9SKCJzdGFnZSAyIGZhaWxlZCIpOwotICAgICAgaS5PblBhaXJpbmdGaW5pc2hlZChzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4oc3RhZ2UycmVzdWx0KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgT2N0ZXQxNiBzdGsgPSBzdGQ6OmdldDxPY3RldDE2PihzdGFnZTJyZXN1bHQpOwotICAgIC8vIE1hc2sgdGhlIGtleQotICAgIHN0ZDo6ZmlsbChzdGsuYmVnaW4oKSArIGtleV9zaXplLCBzdGsuZW5kKCksIDB4MDApOwotICAgIGlmIChJQW1DZW50cmFsKGkpKSB7Ci0gICAgICBMT0dfSU5GTygiU2VuZGluZyBzdGFydCBlbmNyeXB0aW9uIHJlcXVlc3QiKTsKLSAgICAgIFNlbmRIY2lMZVN0YXJ0RW5jcnlwdGlvbihpLCBpLmNvbm5lY3Rpb25faGFuZGxlLCB7MH0sIHswfSwgc3RrKTsKLSAgICB9IGVsc2UgewotICAgICAgYXV0byBsdGtfcmVxID0gV2FpdExlTG9uZ1Rlcm1LZXlSZXF1ZXN0KCk7Ci0gICAgICBTZW5kSGNpTGVMb25nVGVybUtleVJlcGx5KGksIGkuY29ubmVjdGlvbl9oYW5kbGUsIHN0ayk7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQSEFTRSAzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgTE9HX0lORk8oIldhaXRpbmcgZm9yIGVuY3J5cHRpb24gY2hhbmdlZCIpOwotICBhdXRvIGVuY3J5cHRpb25fY2hhbmdlX3Jlc3VsdCA9IFdhaXRFbmNyeXB0aW9uQ2hhbmdlZCgpOwotICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4oZW5jcnlwdGlvbl9jaGFuZ2VfcmVzdWx0KSkgewotICAgIGkuT25QYWlyaW5nRmluaXNoZWQoc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KGVuY3J5cHRpb25fY2hhbmdlX3Jlc3VsdCkpOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPEVuY3J5cHRpb25DaGFuZ2VWaWV3PihlbmNyeXB0aW9uX2NoYW5nZV9yZXN1bHQpKSB7Ci0gICAgRW5jcnlwdGlvbkNoYW5nZVZpZXcgZW5jcnlwdGlvbl9jaGFuZ2VkID0gc3RkOjpnZXQ8RW5jcnlwdGlvbkNoYW5nZVZpZXc+KGVuY3J5cHRpb25fY2hhbmdlX3Jlc3VsdCk7Ci0gICAgaWYgKGVuY3J5cHRpb25fY2hhbmdlZC5HZXRTdGF0dXMoKSAhPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUyB8fAotICAgICAgICBlbmNyeXB0aW9uX2NoYW5nZWQuR2V0RW5jcnlwdGlvbkVuYWJsZWQoKSAhPSBoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpPTikgewotICAgICAgaS5PblBhaXJpbmdGaW5pc2hlZChQYWlyaW5nRmFpbHVyZSgiRW5jcnlwdGlvbiBjaGFuZ2UgZmFpbGVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPEVuY3J5cHRpb25LZXlSZWZyZXNoQ29tcGxldGVWaWV3PihlbmNyeXB0aW9uX2NoYW5nZV9yZXN1bHQpKSB7Ci0gICAgRW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZVZpZXcgZW5jcnlwdGlvbl9jaGFuZ2VkID0KLSAgICAgICAgc3RkOjpnZXQ8RW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZVZpZXc+KGVuY3J5cHRpb25fY2hhbmdlX3Jlc3VsdCk7Ci0gICAgaWYgKGVuY3J5cHRpb25fY2hhbmdlZC5HZXRTdGF0dXMoKSAhPSBoY2k6OkVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgICAgaS5PblBhaXJpbmdGaW5pc2hlZChQYWlyaW5nRmFpbHVyZSgiRW5jcnlwdGlvbiBrZXkgcmVmcmVzaCBmYWlsZWQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIGkuT25QYWlyaW5nRmluaXNoZWQoUGFpcmluZ0ZhaWx1cmUoIlVua25vd24gY2FzZSBvZiBlbmNyeXB0aW9uIGNoYW5nZSByZXN1bHQiKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPR19JTkZPKCJFbmNyeXB0aW9uIGNoYW5nZSBmaW5pc2hlZCBzdWNjZXNzZnVsbHkiKTsKLQotICBEaXN0cmlidXRlZEtleXNPckZhaWx1cmUga2V5RXhjaGFuZ2VTdGF0dXMgPSBEaXN0cmlidXRlS2V5cyhpLCBwYWlyaW5nX3Jlc3BvbnNlLCBpc1NlY3VyZUNvbm5lY3Rpb25zKTsKLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KGtleUV4Y2hhbmdlU3RhdHVzKSkgewotICAgIGkuT25QYWlyaW5nRmluaXNoZWQoc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KGtleUV4Y2hhbmdlU3RhdHVzKSk7Ci0gICAgTE9HX0VSUk9SKCJLZXkgZXhjaGFuZ2UgZmFpbGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgaXQncyBzZWN1cmUgY29ubmVjdGlvbnMgcGFpcmluZywgZG8gY3Jvc3MtdHJhbnNwb3J0IGtleSBkZXJpdmF0aW9uCi0gIERpc3RyaWJ1dGVkS2V5cyBkaXN0cmlidXRlZF9rZXlzID0gc3RkOjpnZXQ8RGlzdHJpYnV0ZWRLZXlzPihrZXlFeGNoYW5nZVN0YXR1cyk7Ci0gIGlmICgocGFpcmluZ19yZXNwb25zZS5HZXRBdXRoUmVxKCkgJiBBdXRoUmVxTWFza1NjKSAmJiBkaXN0cmlidXRlZF9rZXlzLnJlbW90ZV9sdGsuaGFzX3ZhbHVlKCkpIHsKLSAgICBib29sIHVzZV9oNyA9IChwYWlyaW5nX3Jlc3BvbnNlLkdldEF1dGhSZXEoKSAmIEF1dGhSZXFNYXNrQ3QyKTsKLSAgICBPY3RldDE2IGxpbmtfa2V5ID0gY3J5cHRvX3Rvb2xib3g6Omx0a190b19saW5rX2tleSgqKGRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2x0ayksIHVzZV9oNyk7Ci0gICAgZGlzdHJpYnV0ZWRfa2V5cy5yZW1vdGVfbGlua19rZXkgPSBsaW5rX2tleTsKLSAgfQotCi0gIC8vIGJvb2wgYm9uZGluZyA9IHBhaXJpbmdfcmVxdWVzdC5HZXRBdXRoUmVxKCkgJiBwYWlyaW5nX3Jlc3BvbnNlLkdldEF1dGhSZXEoKSAmIEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWc7Ci0KLSAgaS5PblBhaXJpbmdGaW5pc2hlZChQYWlyaW5nUmVzdWx0ewotICAgICAgLmNvbm5lY3Rpb25fYWRkcmVzcyA9IGkucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcywKLSAgICAgIC5kaXN0cmlidXRlZF9rZXlzID0gZGlzdHJpYnV0ZWRfa2V5cywKLSAgICAgIC5rZXlfc2l6ZSA9IGtleV9zaXplLAotICB9KTsKLQotICBMT0dfSU5GTygiUGFpcmluZyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuIik7Ci19Ci0KLVBoYXNlMVJlc3VsdE9yRmFpbHVyZSBQYWlyaW5nSGFuZGxlckxlOjpFeGNoYW5nZVBhaXJpbmdGZWF0dXJlKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGkpIHsKLSAgTE9HX0lORk8oIlBoYXNlIDEgc3RhcnQiKTsKLQotICBpZiAoSUFtQ2VudHJhbChpKSkgewotICAgIC8vIFNlbmQgUGFpcmluZyBSZXF1ZXN0Ci0gICAgY29uc3QgYXV0byYgeCA9IGkubXlQYWlyaW5nQ2FwYWJpbGl0aWVzOwotICAgIGF1dG8gcGFpcmluZ19yZXF1ZXN0X2J1aWxkZXIgPQotICAgICAgICBQYWlyaW5nUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZSh4LmlvX2NhcGFiaWxpdHksIHgub29iX2RhdGFfZmxhZywgeC5hdXRoX3JlcSwgeC5tYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguaW5pdGlhdG9yX2tleV9kaXN0cmlidXRpb24sIHgucmVzcG9uZGVyX2tleV9kaXN0cmlidXRpb24pOwotICAgIC8vIGJhc2ljYWxseSBwYWlyaW5nX3JlcXVlc3QgPSBteVBhaXJpbmdDYXBhYmlsaXRpZXM7Ci0KLSAgICAvLyBDb252ZXJ0IGJ1aWxkZXIgdG8gdmlldwotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgICBwYWlyaW5nX3JlcXVlc3RfYnVpbGRlci0+U2VyaWFsaXplKGl0KTsKLSAgICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gICAgYXV0byB0ZW1wX2NtZF92aWV3ID0gQ29tbWFuZFZpZXc6OkNyZWF0ZShwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gICAgYXV0byBwYWlyaW5nX3JlcXVlc3QgPSBQYWlyaW5nUmVxdWVzdFZpZXc6OkNyZWF0ZSh0ZW1wX2NtZF92aWV3KTsKLSAgICBBU1NFUlQocGFpcmluZ19yZXF1ZXN0LklzVmFsaWQoKSk7Ci0KLSAgICBMT0dfSU5GTygiU2VuZGluZyBQYWlyaW5nIFJlcXVlc3QiKTsKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgc3RkOjptb3ZlKHBhaXJpbmdfcmVxdWVzdF9idWlsZGVyKSk7Ci0KLSAgICBMT0dfSU5GTygiV2FpdGluZyBmb3IgUGFpcmluZyBSZXNwb25zZSIpOwotICAgIGF1dG8gcmVzcG9uc2UgPSBXYWl0UGFpcmluZ1Jlc3BvbnNlKCk7Ci0KLSAgICAvKiBUaGVyZSBpcyBhIHBvdGVudGlhbCBjb2xsaXNpb24gd2hlcmUgdGhlIHBlcmlwaGVyYWwgaW5pdGlhdGVzIHRoZSBwYWlyaW5nIGF0IHRoZSBzYW1lIHRpbWUgd2UgaW5pdGlhdGUgaXQsIGJ5Ci0gICAgICogc2VuZGluZyBzZWN1cml0eSByZXF1ZXN0LiAqLwotICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihyZXNwb25zZSkgJiYKLSAgICAgICAgc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlc3BvbnNlKS5yZWNlaXZlZF9jb2RlXyA9PSBDb2RlOjpTRUNVUklUWV9SRVFVRVNUKSB7Ci0gICAgICBMT0dfSU5GTygiUmVjZWl2ZWQgc2VjdXJpdHkgcmVxdWVzdCwgd2FpdGluZyBmb3IgUGFpcmluZyBSZXNwb25zZSBhZ2Fpbi4uLiIpOwotICAgICAgcmVzcG9uc2UgPSBXYWl0UGFpcmluZ1Jlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHJlc3BvbnNlKSkgewotICAgICAgLy8gVE9ETzogc2hvdWxkIHRoZSBmYWlsdXJlIHJlYXNvbiBiZSBkaWZmZXJlbnQgaW4gc29tZSBjYXNlcyA/IEhvdyBhYm91dAotICAgICAgLy8gd2hlbiB3ZSBsb3N0IGNvbm5lY3Rpb24gPyBEb24ndCBzZW5kIGFueXRoaW5nIGF0IGFsbCwgb3IgaGF2ZSBMMkNBUAotICAgICAgLy8gbGF5ZXIgaWdub3JlIGl0PwotICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6VU5TUEVDSUZJRURfUkVBU09OKSk7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBhdXRvIHBhaXJpbmdfcmVzcG9uc2UgPSBzdGQ6OmdldDxQYWlyaW5nUmVzcG9uc2VWaWV3PihyZXNwb25zZSk7Ci0KLSAgICBMT0dfSU5GTygiUGhhc2UgMSBmaW5pc2giKTsKLSAgICByZXR1cm4gUGhhc2UxUmVzdWx0e3BhaXJpbmdfcmVxdWVzdCwgcGFpcmluZ19yZXNwb25zZX07Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpvcHRpb25hbDxQYWlyaW5nUmVxdWVzdFZpZXc+IHBhaXJpbmdfcmVxdWVzdDsKLQotICAgIGlmIChpLnJlbW90ZWx5X2luaXRpYXRlZCkgewotICAgICAgaWYgKCFpLnBhaXJpbmdfcmVxdWVzdC5oYXNfdmFsdWUoKSkgewotICAgICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIllvdSBtdXN0IHBhc3MgUGFpcmluZ1JlcXVlc3QgYXMgYSBpbml0aWFsIGluZm9ybWF0aW9uIHRvIHBlcmlwaGVyYWwhIik7Ci0gICAgICB9Ci0KLSAgICAgIHBhaXJpbmdfcmVxdWVzdCA9IGkucGFpcmluZ19yZXF1ZXN0LnZhbHVlKCk7Ci0KLSAgICAgIGlmICghcGFpcmluZ19yZXF1ZXN0LT5Jc1ZhbGlkKCkpIHJldHVybiBQYWlyaW5nRmFpbHVyZSgiTWFsZm9ybWVkIFBhaXJpbmdSZXF1ZXN0Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNlbmRMMmNhcFBhY2tldChpLCBTZWN1cml0eVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoaS5teVBhaXJpbmdDYXBhYmlsaXRpZXMuYXV0aF9yZXEpKTsKLQotICAgICAgTE9HX0lORk8oIldhaXRpbmcgZm9yIFBhaXJpbmcgUmVxdWVzdCIpOwotICAgICAgYXV0byByZXF1ZXN0ID0gV2FpdFBhaXJpbmdSZXF1ZXN0KCk7Ci0gICAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocmVxdWVzdCkpIHsKLSAgICAgICAgTE9HX0lORk8oIiVzIiwgc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlcXVlc3QpLm1lc3NhZ2UuY19zdHIoKSk7Ci0gICAgICAgIFNlbmRMMmNhcFBhY2tldChpLCBQYWlyaW5nRmFpbGVkQnVpbGRlcjo6Q3JlYXRlKFBhaXJpbmdGYWlsZWRSZWFzb246OlVOU1BFQ0lGSUVEX1JFQVNPTikpOwotICAgICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlcXVlc3QpOwotICAgICAgfQotCi0gICAgICBwYWlyaW5nX3JlcXVlc3QgPSBzdGQ6OmdldDxQYWlyaW5nUmVxdWVzdFZpZXc+KHJlcXVlc3QpOwotICAgIH0KLQotICAgIHVpbnQ4X3Qga2V5X3NpemUgPSBwYWlyaW5nX3JlcXVlc3QtPkdldE1heGltdW1FbmNyeXB0aW9uS2V5U2l6ZSgpOwotICAgIGlmIChrZXlfc2l6ZSA8IDcgfHwga2V5X3NpemUgPiAxNikgewotICAgICAgTE9HX1dBUk4oIlJlc3VsdGluZyBrZXkgc2l6ZSBpcyBiYWQgJWQiLCBrZXlfc2l6ZSk7Ci0gICAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ0ZhaWxlZEJ1aWxkZXI6OkNyZWF0ZShQYWlyaW5nRmFpbGVkUmVhc29uOjpFTkNSWVBUSU9OX0tFWV9TSVpFKSk7Ci0gICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIlJlc3VsdGluZyBrZXkgc2l6ZSBpcyBiYWQiLCBQYWlyaW5nRmFpbGVkUmVhc29uOjpFTkNSWVBUSU9OX0tFWV9TSVpFKTsKLSAgICB9Ci0KLSAgICAvLyBTZW5kIFBhaXJpbmcgUmVxdWVzdAotICAgIGNvbnN0IGF1dG8mIHggPSBpLm15UGFpcmluZ0NhcGFiaWxpdGllczsKLSAgICAvLyBiYXNpY2FsbHkgcGFpcmluZ19yZXNwb25zZV9idWlsZGVyID0gbXlfZmlyc3RfcGFja2V0OwotICAgIC8vIFdlIGFyZSBub3QgYWxsb3dlZCB0byBlbmFibGUgYml0cyB0aGF0IHRoZSByZW1vdGUgZGlkIG5vdCBhbGxvdyB1cyB0byBzZXQgaW4gaW5pdGlhdG9yX2tleV9kaXN0IGFuZAotICAgIC8vIHJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uCi0gICAgYXV0byBwYWlyaW5nX3Jlc3BvbnNlX2J1aWxkZXIgPQotICAgICAgICBQYWlyaW5nUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoeC5pb19jYXBhYmlsaXR5LCB4Lm9vYl9kYXRhX2ZsYWcsIHguYXV0aF9yZXEsIHgubWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5pbml0aWF0b3Jfa2V5X2Rpc3RyaWJ1dGlvbiAmIHBhaXJpbmdfcmVxdWVzdC0+R2V0SW5pdGlhdG9yS2V5RGlzdHJpYnV0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LnJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uICYgcGFpcmluZ19yZXF1ZXN0LT5HZXRSZXNwb25kZXJLZXlEaXN0cmlidXRpb24oKSk7Ci0KLSAgICAvLyBDb252ZXJ0IGJ1aWxkZXIgdG8gdmlldwotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgICBwYWlyaW5nX3Jlc3BvbnNlX2J1aWxkZXItPlNlcmlhbGl6ZShpdCk7Ci0gICAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICAgIGF1dG8gdGVtcF9jbWRfdmlldyA9IENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICAgIGF1dG8gcGFpcmluZ19yZXNwb25zZSA9IFBhaXJpbmdSZXNwb25zZVZpZXc6OkNyZWF0ZSh0ZW1wX2NtZF92aWV3KTsKLSAgICBBU1NFUlQocGFpcmluZ19yZXNwb25zZS5Jc1ZhbGlkKCkpOwotCi0gICAgTE9HX0lORk8oIlNlbmRpbmcgUGFpcmluZyBSZXNwb25zZSIpOwotICAgIFNlbmRMMmNhcFBhY2tldChpLCBzdGQ6Om1vdmUocGFpcmluZ19yZXNwb25zZV9idWlsZGVyKSk7Ci0KLSAgICBMT0dfSU5GTygiUGhhc2UgMSBmaW5pc2giKTsKLSAgICByZXR1cm4gUGhhc2UxUmVzdWx0e3BhaXJpbmdfcmVxdWVzdC52YWx1ZSgpLCBwYWlyaW5nX3Jlc3BvbnNlfTsKLSAgfQotfQotCi1EaXN0cmlidXRlZEtleXNPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6RGlzdHJpYnV0ZUtleXMoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWlyaW5nUmVzcG9uc2VWaWV3JiBwYWlyaW5nX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTZWN1cmVDb25uZWN0aW9ucykgewotICB1aW50OF90IGtleXNfaV9yZWNlaXZlID0KLSAgICAgIElBbUNlbnRyYWwoaSkgPyBwYWlyaW5nX3Jlc3BvbnNlLkdldFJlc3BvbmRlcktleURpc3RyaWJ1dGlvbigpIDogcGFpcmluZ19yZXNwb25zZS5HZXRJbml0aWF0b3JLZXlEaXN0cmlidXRpb24oKTsKLSAgdWludDhfdCBrZXlzX2lfc2VuZCA9Ci0gICAgICBJQW1DZW50cmFsKGkpID8gcGFpcmluZ19yZXNwb25zZS5HZXRJbml0aWF0b3JLZXlEaXN0cmlidXRpb24oKSA6IHBhaXJpbmdfcmVzcG9uc2UuR2V0UmVzcG9uZGVyS2V5RGlzdHJpYnV0aW9uKCk7Ci0KLSAgLy8gSW4gU2VjdXJlIENvbm5lY3Rpb25zIG9uIHRoZSBMRSBUcmFuc3BvcnQsIHRoZSBFbmNLZXkgZmllbGQgc2hhbGwgYmUgaWdub3JlZAotICBpZiAoaXNTZWN1cmVDb25uZWN0aW9ucykgewotICAgIGtleXNfaV9zZW5kID0gKH5LZXlNYXNrRW5jKSAmIGtleXNfaV9zZW5kOwotICAgIGtleXNfaV9yZWNlaXZlID0gKH5LZXlNYXNrRW5jKSAmIGtleXNfaV9yZWNlaXZlOwotICB9Ci0KLSAgTE9HX0lORk8oIktleSBkaXN0cmlidXRpb24gc3RhcnQsIGtleXNfaV9zZW5kPTB4JTAyeCwga2V5c19pX3JlY2VpdmU9MHglMDJ4Iiwga2V5c19pX3NlbmQsIGtleXNfaV9yZWNlaXZlKTsKLQotICAvLyBUT0RPOiBvYnRhaW4gYWN0dWFsIHZhbHVlcywgYW5kIGFwcGx5IGtleV9zaXplIHRvIHRoZSBMVEsKLSAgT2N0ZXQxNiBteV9sdGsgPSBibHVldG9vdGg6Om9zOjpHZW5lcmF0ZVJhbmRvbTwxNj4oKTsKLSAgdWludDE2X3QgbXlfZWRpdiA9IGJsdWV0b290aDo6b3M6OkdlbmVyYXRlUmFuZG9tKCk7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4gbXlfcmFuZCA9IGJsdWV0b290aDo6b3M6OkdlbmVyYXRlUmFuZG9tPDg+KCk7Ci0KLSAgT2N0ZXQxNiBteV9pcmsgPSBpLm15X2lkZW50aXR5X3Jlc29sdmluZ19rZXk7Ci0gIEFkZHJlc3MgbXlfaWRlbnRpdHlfYWRkcmVzcyA9IGkubXlfaWRlbnRpdHlfYWRkcmVzcy5HZXRBZGRyZXNzKCk7Ci0gIEFkZHJUeXBlIG15X2lkZW50aXR5X2FkZHJlc3NfdHlwZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OnNlY3VyaXR5OjpBZGRyVHlwZT4oaS5teV9pZGVudGl0eV9hZGRyZXNzLkdldEFkZHJlc3NUeXBlKCkpOwotICBPY3RldDE2IG15X3NpZ25hdHVyZV9rZXl7MH07Ci0KLSAgaWYgKElBbUNlbnRyYWwoaSkpIHsKLSAgICAvLyBFbmNLZXkgaXMgdW51c2VkIGZvciBMRSBTZWN1cmUgQ29ubmVjdGlvbnMKLSAgICBEaXN0cmlidXRlZEtleXNPckZhaWx1cmUga2V5cyA9IFJlY2VpdmVLZXlzKGtleXNfaV9yZWNlaXZlKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4oa2V5cykpIHsKLSAgICAgIHJldHVybiBrZXlzOwotICAgIH0KLQotICAgIFNlbmRLZXlzKGksIGtleXNfaV9zZW5kLCBteV9sdGssIG15X2VkaXYsIG15X3JhbmQsIG15X2lyaywgbXlfaWRlbnRpdHlfYWRkcmVzcywgbXlfaWRlbnRpdHlfYWRkcmVzc190eXBlLAotICAgICAgICAgICAgIG15X3NpZ25hdHVyZV9rZXkpOwotCi0gICAgc3RkOjpnZXQ8RGlzdHJpYnV0ZWRLZXlzPihrZXlzKS5sb2NhbF9sdGsgPSBteV9sdGs7Ci0gICAgc3RkOjpnZXQ8RGlzdHJpYnV0ZWRLZXlzPihrZXlzKS5sb2NhbF9lZGl2ID0gbXlfZWRpdjsKLSAgICBzdGQ6OmdldDxEaXN0cmlidXRlZEtleXM+KGtleXMpLmxvY2FsX3JhbmQgPSBteV9yYW5kOwotICAgIExPR19JTkZPKCJLZXkgZGlzdHJpYnV0aW9uIGZpbmlzaCIpOwotICAgIHJldHVybiBrZXlzOwotICB9IGVsc2UgewotICAgIFNlbmRLZXlzKGksIGtleXNfaV9zZW5kLCBteV9sdGssIG15X2VkaXYsIG15X3JhbmQsIG15X2lyaywgbXlfaWRlbnRpdHlfYWRkcmVzcywgbXlfaWRlbnRpdHlfYWRkcmVzc190eXBlLAotICAgICAgICAgICAgIG15X3NpZ25hdHVyZV9rZXkpOwotCi0gICAgRGlzdHJpYnV0ZWRLZXlzT3JGYWlsdXJlIGtleXMgPSBSZWNlaXZlS2V5cyhrZXlzX2lfcmVjZWl2ZSk7Ci0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KGtleXMpKSB7Ci0gICAgICByZXR1cm4ga2V5czsKLSAgICB9Ci0KLSAgICBzdGQ6OmdldDxEaXN0cmlidXRlZEtleXM+KGtleXMpLmxvY2FsX2x0ayA9IG15X2x0azsKLSAgICBzdGQ6OmdldDxEaXN0cmlidXRlZEtleXM+KGtleXMpLmxvY2FsX2VkaXYgPSBteV9lZGl2OwotICAgIHN0ZDo6Z2V0PERpc3RyaWJ1dGVkS2V5cz4oa2V5cykubG9jYWxfcmFuZCA9IG15X3JhbmQ7Ci0gICAgTE9HX0lORk8oIktleSBkaXN0cmlidXRpb24gZmluaXNoIik7Ci0gICAgcmV0dXJuIGtleXM7Ci0gIH0KLX0KLQotRGlzdHJpYnV0ZWRLZXlzT3JGYWlsdXJlIFBhaXJpbmdIYW5kbGVyTGU6OlJlY2VpdmVLZXlzKGNvbnN0IHVpbnQ4X3QmIGtleXNfaV9yZWNlaXZlKSB7Ci0gIHN0ZDo6b3B0aW9uYWw8T2N0ZXQxNj4gbHRrOyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IG9ubHkgKi8KLSAgc3RkOjpvcHRpb25hbDx1aW50MTZfdD4gZWRpdjsgICAgICAgICAgICAgICAvKiBMZWdhY3kgb25seSAqLwotICBzdGQ6Om9wdGlvbmFsPHN0ZDo6YXJyYXk8dWludDhfdCwgOD4+IHJhbmQ7IC8qIExlZ2FjeSBvbmx5ICovCi0gIHN0ZDo6b3B0aW9uYWw8aGNpOjpBZGRyZXNzV2l0aFR5cGU+IGlkZW50aXR5X2FkZHJlc3M7Ci0gIHN0ZDo6b3B0aW9uYWw8T2N0ZXQxNj4gaXJrOwotICBzdGQ6Om9wdGlvbmFsPE9jdGV0MTY+IHNpZ25hdHVyZV9rZXk7Ci0KLSAgaWYgKGtleXNfaV9yZWNlaXZlICYgS2V5TWFza0VuYykgewotICAgIHsKLSAgICAgIGF1dG8gcGFja2V0ID0gV2FpdEVuY3J5cHRpb25JbmZvcm1hdGlvbigpOwotICAgICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHBhY2tldCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCIgV2FzIGV4cGVjdGluZyBFbmNyeXB0aW9uIEluZm9ybWF0aW9uIGJ1dCBkaWQgbm90IHJlY2VpdmUhIik7Ci0gICAgICAgIHJldHVybiBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4ocGFja2V0KTsKLSAgICAgIH0KLSAgICAgIGx0ayA9IHN0ZDo6Z2V0PEVuY3J5cHRpb25JbmZvcm1hdGlvblZpZXc+KHBhY2tldCkuR2V0TG9uZ1Rlcm1LZXkoKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBhdXRvIHBhY2tldCA9IFdhaXRDZW50cmFsSWRlbnRpZmljYXRpb24oKTsKLSAgICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihwYWNrZXQpKSB7Ci0gICAgICAgIExPR19FUlJPUigiIFdhcyBleHBlY3RpbmcgQ2VudHJhbCBJZGVudGlmaWNhdGlvbiBidXQgZGlkIG5vdCByZWNlaXZlISIpOwotICAgICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHBhY2tldCk7Ci0gICAgICB9Ci0gICAgICBlZGl2ID0gc3RkOjpnZXQ8Q2VudHJhbElkZW50aWZpY2F0aW9uVmlldz4ocGFja2V0KS5HZXRFZGl2KCk7Ci0gICAgICByYW5kID0gc3RkOjpnZXQ8Q2VudHJhbElkZW50aWZpY2F0aW9uVmlldz4ocGFja2V0KS5HZXRSYW5kKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGtleXNfaV9yZWNlaXZlICYgS2V5TWFza0lkKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBXYWl0SWRlbnRpdHlJbmZvcm1hdGlvbigpOwotICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihwYWNrZXQpKSB7Ci0gICAgICBMT0dfRVJST1IoIiBXYXMgZXhwZWN0aW5nIElkZW50aXR5IEluZm9ybWF0aW9uIGJ1dCBkaWQgbm90IHJlY2VpdmUhIik7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHBhY2tldCk7Ci0gICAgfQotCi0gICAgTE9HX0lORk8oIlJlY2VpdmVkIElkZW50aXR5IEluZm9ybWF0aW9uIik7Ci0gICAgaXJrID0gc3RkOjpnZXQ8SWRlbnRpdHlJbmZvcm1hdGlvblZpZXc+KHBhY2tldCkuR2V0SWRlbnRpdHlSZXNvbHZpbmdLZXkoKTsKLQotICAgIGF1dG8gaWFwYWNrZXQgPSBXYWl0SWRlbnRpdHlBZGRyZXNzSW5mb3JtYXRpb24oKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4oaWFwYWNrZXQpKSB7Ci0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIldhcyBleHBlY3RpbmcgSWRlbnRpdHkgQWRkcmVzcyBJbmZvcm1hdGlvbiBidXQgZGlkICIKLSAgICAgICAgICAibm90IHJlY2VpdmUhIik7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KGlhcGFja2V0KTsKLSAgICB9Ci0gICAgTE9HX0lORk8oIlJlY2VpdmVkIElkZW50aXR5IEFkZHJlc3MgSW5mb3JtYXRpb24iKTsKLSAgICBhdXRvIGlhcGFja2V0dmlldyA9IHN0ZDo6Z2V0PElkZW50aXR5QWRkcmVzc0luZm9ybWF0aW9uVmlldz4oaWFwYWNrZXQpOwotICAgIGlkZW50aXR5X2FkZHJlc3MgPSBoY2k6OkFkZHJlc3NXaXRoVHlwZShpYXBhY2tldHZpZXcuR2V0QmRBZGRyKCksIGlhcGFja2V0dmlldy5HZXRBZGRyVHlwZSgpID09IEFkZHJUeXBlOjpQVUJMSUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpOwotICB9Ci0KLSAgaWYgKGtleXNfaV9yZWNlaXZlICYgS2V5TWFza1NpZ24pIHsKLSAgICBhdXRvIHBhY2tldCA9IFdhaXRTaWduaW5nSW5mb3JtYXRpb24oKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocGFja2V0KSkgewotICAgICAgTE9HX0VSUk9SKCIgV2FzIGV4cGVjdGluZyBTaWduaW5nIEluZm9ybWF0aW9uIGJ1dCBkaWQgbm90IHJlY2VpdmUhIik7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHBhY2tldCk7Ci0gICAgfQotCi0gICAgTE9HX0lORk8oIlJlY2VpdmVkIFNpZ25pbmcgSW5mb3JtYXRpb24iKTsKLSAgICBzaWduYXR1cmVfa2V5ID0gc3RkOjpnZXQ8U2lnbmluZ0luZm9ybWF0aW9uVmlldz4ocGFja2V0KS5HZXRTaWduYXR1cmVLZXkoKTsKLSAgfQotCi0gIHJldHVybiBEaXN0cmlidXRlZEtleXN7LnJlbW90ZV9sdGsgPSBsdGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW90ZV9lZGl2ID0gZWRpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3RlX3JhbmQgPSByYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdGVfaWRlbnRpdHlfYWRkcmVzcyA9IGlkZW50aXR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW90ZV9pcmsgPSBpcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW90ZV9zaWduYXR1cmVfa2V5ID0gc2lnbmF0dXJlX2tleX07Ci19Ci0KLXZvaWQgUGFpcmluZ0hhbmRsZXJMZTo6U2VuZEtleXMoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgY29uc3QgdWludDhfdCYga2V5c19pX3NlbmQsIE9jdGV0MTYgbHRrLCB1aW50MTZfdCBlZGl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDg+IHJhbmQsIE9jdGV0MTYgaXJrLCBBZGRyZXNzIGlkZW50aXR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJUeXBlIGlkZW50aXR5X2FkZHJlc190eXBlLCBPY3RldDE2IHNpZ25hdHVyZV9rZXkpIHsKLSAgaWYgKGtleXNfaV9zZW5kICYgS2V5TWFza0VuYykgewotICAgIExPR19JTkZPKCJTZW5kaW5nIEVuY3J5cHRpb24gSW5mb3JtYXRpb24iKTsKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgRW5jcnlwdGlvbkluZm9ybWF0aW9uQnVpbGRlcjo6Q3JlYXRlKGx0aykpOwotICAgIExPR19JTkZPKCJTZW5kaW5nIENlbnRyYWwgSWRlbnRpZmljYXRpb24iKTsKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgQ2VudHJhbElkZW50aWZpY2F0aW9uQnVpbGRlcjo6Q3JlYXRlKGVkaXYsIHJhbmQpKTsKLSAgfQotCi0gIGlmIChrZXlzX2lfc2VuZCAmIEtleU1hc2tJZCkgewotICAgIExPR19JTkZPKCJTZW5kaW5nIElkZW50aXR5IEluZm9ybWF0aW9uIik7Ci0gICAgU2VuZEwyY2FwUGFja2V0KGksIElkZW50aXR5SW5mb3JtYXRpb25CdWlsZGVyOjpDcmVhdGUoaXJrKSk7Ci0gICAgTE9HX0lORk8oIlNlbmRpbmcgSWRlbnRpdHkgQWRkcmVzcyBJbmZvcm1hdGlvbiIpOwotICAgIFNlbmRMMmNhcFBhY2tldChpLCBJZGVudGl0eUFkZHJlc3NJbmZvcm1hdGlvbkJ1aWxkZXI6OkNyZWF0ZShpZGVudGl0eV9hZGRyZXNfdHlwZSwgaWRlbnRpdHlfYWRkcmVzcykpOwotICB9Ci0KLSAgaWYgKGtleXNfaV9zZW5kICYgS2V5TWFza1NpZ24pIHsKLSAgICBMT0dfSU5GTygiU2VuZGluZyBTaWduaW5nIEluZm9ybWF0aW9uIik7Ci0gICAgU2VuZEwyY2FwUGFja2V0KGksIFNpZ25pbmdJbmZvcm1hdGlvbkJ1aWxkZXI6OkNyZWF0ZShzaWduYXR1cmVfa2V5KSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmggYi9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxY2UzNC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHZhcmlhbnQ+Ci0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImNyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiaGNpL2xlX3NlY3VyaXR5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInBhY2tldC9wYWNrZXRfdmlldy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2VjZGhfa2V5cy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2luaXRpYWxfaW5mb3JtYXRpb25zLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZ19mYWlsdXJlLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvc21wX3BhY2tldHMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS91aS5oIgotCi0vLyBDb2RlIGdlbmVyYXRlZCBieSBQREwgZG9lcyBub3QgYWxsb3cgdXMgb3QgZG8gfHwgYW5kICYmIG9wZXJhdGlvbnMgb24gYml0cwotLy8gZWZmaWNpZW50bHkuIFVzZSB0aG9zZSBtYXNrcyBvbiBmaWVsZHMgcmVxdWlyaW5nIHRoZW0gdW50aWwgdGhpcyBpcyBzb2x2ZWQKLWNvbnN0ZXhwciB1aW50OF90IEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgQXV0aFJlcU1hc2tNaXRtID0gMHgwNDsKLWNvbnN0ZXhwciB1aW50OF90IEF1dGhSZXFNYXNrU2MgPSAweDA4OwotY29uc3RleHByIHVpbnQ4X3QgQXV0aFJlcU1hc2tLZXlwcmVzcyA9IDB4MTA7Ci1jb25zdGV4cHIgdWludDhfdCBBdXRoUmVxTWFza0N0MiA9IDB4MjA7Ci0KLWNvbnN0ZXhwciB1aW50OF90IEtleU1hc2tFbmMgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgS2V5TWFza0lkID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IEtleU1hc2tTaWduID0gMHgwNDsKLWNvbnN0ZXhwciB1aW50OF90IEtleU1hc2tMaW5rID0gMHgwODsKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3OwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25LZXlSZWZyZXNoQ29tcGxldGVWaWV3OwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLXVzaW5nIGNyeXB0b190b29sYm94OjpPY3RldDE2OwotCi0vKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXZlbnQgc2VuZCBmcm9tIG90aGVyIHN1YnN5c3RlbXMgaW50byBTTVAgUGFpcmluZyBIYW5kbGVyLAotICogaS5lLiB1c2VyIHJlcXVlc3QgZnJvbSB0aGUgVUksIEwyQ0FQIG9yIEhDSSBpbnRlcmFjdGlvbiAqLwotY2xhc3MgUGFpcmluZ0V2ZW50IHsKLSBwdWJsaWM6Ci0gIGVudW0gVFlQRSB7IEVYSVQsIEwyQ0FQLCBIQ0lfRVZFTlQsIFVJIH07Ci0gIFRZUEUgdHlwZTsKLQotICBzdGQ6Om9wdGlvbmFsPENvbW1hbmRWaWV3PiBsMmNhcF9wYWNrZXQ7Ci0KLSAgc3RkOjpvcHRpb25hbDxoY2k6OkV2ZW50Vmlldz4gaGNpX2V2ZW50OwotCi0gIGVudW0gVUlfQUNUSU9OX1RZUEUgeyBQQUlSSU5HX0FDQ0VQVEVELCBDT05GSVJNX1lFU05PLCBQQVNTS0VZIH07Ci0gIFVJX0FDVElPTl9UWVBFIHVpX2FjdGlvbjsKLSAgdWludDMyX3QgdWlfdmFsdWU7Ci0KLSAgUGFpcmluZ0V2ZW50KFRZUEUgdHlwZSkgOiB0eXBlKHR5cGUpIHt9Ci0gIFBhaXJpbmdFdmVudChDb21tYW5kVmlldyBsMmNhcF9wYWNrZXQpIDogdHlwZShMMkNBUCksIGwyY2FwX3BhY2tldChsMmNhcF9wYWNrZXQpIHt9Ci0gIFBhaXJpbmdFdmVudChVSV9BQ1RJT05fVFlQRSB1aV9hY3Rpb24sIHVpbnQzMl90IHVpX3ZhbHVlKSA6IHR5cGUoVUkpLCB1aV9hY3Rpb24odWlfYWN0aW9uKSwgdWlfdmFsdWUodWlfdmFsdWUpIHt9Ci0gIFBhaXJpbmdFdmVudChoY2k6OkV2ZW50VmlldyBoY2lfZXZlbnQpIDogdHlwZShIQ0lfRVZFTlQpLCBoY2lfZXZlbnQoaGNpX2V2ZW50KSB7fQotfTsKLQotY29uc3RleHByIGludCBTTVBfVElNRU9VVCA9IDMwOwotCi11c2luZyBDb21tYW5kVmlld09yRmFpbHVyZSA9IHN0ZDo6dmFyaWFudDxDb21tYW5kVmlldywgUGFpcmluZ0ZhaWx1cmU+OwotdXNpbmcgUGhhc2UxUmVzdWx0ID0gc3RkOjpwYWlyPFBhaXJpbmdSZXF1ZXN0VmlldyAvKiBwYWlybmluZ19yZXF1ZXN0Ki8sIFBhaXJpbmdSZXNwb25zZVZpZXcgLyogcGFpcmluZ19yZXNwb25zZSAqLz47Ci11c2luZyBQaGFzZTFSZXN1bHRPckZhaWx1cmUgPSBzdGQ6OnZhcmlhbnQ8UGFpcmluZ0ZhaWx1cmUsIFBoYXNlMVJlc3VsdD47Ci11c2luZyBLZXlFeGNoYW5nZVJlc3VsdCA9Ci0gICAgc3RkOjp0dXBsZTxFY2RoUHVibGljS2V5IC8qIFBLYSAqLywgRWNkaFB1YmxpY0tleSAvKiBQS2IgKi8sIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IC8qZGhrZXkqLz47Ci11c2luZyBTdGFnZTFSZXN1bHQgPSBzdGQ6OnR1cGxlPE9jdGV0MTYsIE9jdGV0MTYsIE9jdGV0MTYsIE9jdGV0MTY+OwotdXNpbmcgU3RhZ2UxUmVzdWx0T3JGYWlsdXJlID0gc3RkOjp2YXJpYW50PFBhaXJpbmdGYWlsdXJlLCBTdGFnZTFSZXN1bHQ+OwotdXNpbmcgU3RhZ2UyUmVzdWx0T3JGYWlsdXJlID0gc3RkOjp2YXJpYW50PFBhaXJpbmdGYWlsdXJlLCBPY3RldDE2IC8qIExUSyAqLz47Ci11c2luZyBEaXN0cmlidXRlZEtleXNPckZhaWx1cmUgPSBzdGQ6OnZhcmlhbnQ8UGFpcmluZ0ZhaWx1cmUsIERpc3RyaWJ1dGVkS2V5cywgc3RkOjptb25vc3RhdGU+OwotCi11c2luZyBMZWdhY3lTdGFnZTFSZXN1bHQgPSBPY3RldDE2IC8qVEsqLzsKLXVzaW5nIExlZ2FjeVN0YWdlMVJlc3VsdE9yRmFpbHVyZSA9IHN0ZDo6dmFyaWFudDxQYWlyaW5nRmFpbHVyZSwgTGVnYWN5U3RhZ2UxUmVzdWx0PjsKLXVzaW5nIFN0a09yRmFpbHVyZSA9IHN0ZDo6dmFyaWFudDxQYWlyaW5nRmFpbHVyZSwgT2N0ZXQxNiAvKiBTVEsgKi8+OwotCi0vKiBQYWlyaW5nSGFuZGxlckxlIHRha2VzIGNhcmUgb2YgdGhlIFBhaXJpbmcgcHJvY2Vzcy4gUGFpcmluZyBpcyBzdHJpY3RseSBkZWZpbmVkCi0gKiBleGNoYW5nZSBvZiBtZXNzYWdlcyBhbmQgVUkgaW50ZXJhY3Rpb25zLCBkaXZpZGVkIGludG8gUEhBU0VTLgotICoKLSAqIEVhY2ggUGFpcmluZ0hhbmRsZXJMZSBoYXZlIGEgdGhyZWFkIGV4ZWN1dGluZyB8UGFpcmluZ01haW58IG1ldGhvZC4gVGhyZWFkIGlzCi0gKiBibG9ja2VkIHdoZW4gd2FpdGluZyBmb3IgVUkvTDJDQVAvSENJIGludGVyYWN0aW9ucywgYW5kIG1vdmVzIHRocm91Z2ggYWxsIHRoZQotICogcGhhc2VzLgotICovCi1jbGFzcyBQYWlyaW5nSGFuZGxlckxlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgaXMgdGhlIHBoYXNlIG9mIHBhaXJpbmcgYXMgZGVmaW5lZCBpbiBCVCBTcGVjICh3aXRoIGV4Y2VwdGlvbiBvZgotICAvLyBhY2NlcHQgcHJvbXB0KQotICAvLyAqIEFDQ0VQVF9QUk9NUFQgLSB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdXNlciB0byBhY2NlcHQgcmVtb3RlbHkgaW5pdGlhdGVkIHBhaXJpbmcKLSAgLy8gKiBQSEFTRTEgLSBmZWF0dXJlIGV4Y2hhbmdlCi0gIC8vICogUEhBU0UyIC0gYXV0aGVudGljYXRpb24KLSAgLy8gKiBQSEFTRTMgLSBrZXkgZXhjaGFuZ2UKLSAgZW51bSBQQUlSSU5HX1BIQVNFIHsgQUNDRVBUX1BST01QVCwgUEhBU0UxLCBQSEFTRTIsIFBIQVNFMyB9OwotICBQQUlSSU5HX1BIQVNFIHBoYXNlOwotCi0gIC8vIEFsbCB0aGUga25vd2xlZGdlIHRvIGluaXRpYXRlIHRoZSBwYWlyaW5nIHByb2Nlc3MgbXVzdCBiZSBwYXNzZWQgaW50byB0aGlzIGZ1bmN0aW9uCi0gIFBhaXJpbmdIYW5kbGVyTGUoUEFJUklOR19QSEFTRSBwaGFzZSwgSW5pdGlhbEluZm9ybWF0aW9ucyBpbmZvcm1hdGlvbnMpCi0gICAgICA6IHBoYXNlKHBoYXNlKSwgcXVldWVfZ3VhcmQoKSwgdGhyZWFkXygmUGFpcmluZ0hhbmRsZXJMZTo6UGFpcmluZ01haW4sIHRoaXMsIGluZm9ybWF0aW9ucykge30KLQotICB+UGFpcmluZ0hhbmRsZXJMZSgpIHsKLSAgICBTZW5kRXhpdFNpZ25hbCgpOwotICAgIC8vIHdlIG5lZWQgb3QgY2hlY2sgaWYgdGhyZWFkIGlzIGpvaW5hYmxlLCBiZWNhdXNlIHRlc3RzIGNhbGwgam9pbiBmb3JtCi0gICAgLy8gd2l0aGluIFdhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZAotICAgIGlmICh0aHJlYWRfLmpvaW5hYmxlKCkpIHRocmVhZF8uam9pbigpOwotICB9Ci0KLSAgdm9pZCBQYWlyaW5nTWFpbihJbml0aWFsSW5mb3JtYXRpb25zIGkpOwotCi0gIFBoYXNlMVJlc3VsdE9yRmFpbHVyZSBFeGNoYW5nZVBhaXJpbmdGZWF0dXJlKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGkpOwotCi0gIHZvaWQgU2VuZEwyY2FwUGFja2V0KGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnNlY3VyaXR5OjpDb21tYW5kQnVpbGRlcj4gY29tbWFuZCkgewotICAgIGkucHJvcGVyX2wyY2FwX2ludGVyZmFjZS0+RW5xdWV1ZShzdGQ6Om1vdmUoY29tbWFuZCksIGkubDJjYXBfaGFuZGxlcik7Ci0gIH0KLQotICB2b2lkIFNlbmRIY2lMZVN0YXJ0RW5jcnlwdGlvbihjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpLCB1aW50MTZfdCBjb25uX2hhbmRsZSwgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCA4PiYgcmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QmIGVkaXYsIGNvbnN0IE9jdGV0MTYmIGx0aykgewotICAgIGkubGVfc2VjdXJpdHlfaW50ZXJmYWNlLT5FbnF1ZXVlQ29tbWFuZChoY2k6OkxlU3RhcnRFbmNyeXB0aW9uQnVpbGRlcjo6Q3JlYXRlKGNvbm5faGFuZGxlLCByYW5kLCBlZGl2LCBsdGspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmwyY2FwX2hhbmRsZXItPkJpbmRPbmNlKFtdKGhjaTo6Q29tbWFuZFN0YXR1c1ZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgY29tbWFuZCBzdGF0dXMuIEl0J3MgaW1wb3J0YW50IC0gY2FuIHNob3cgd2UgYXJlIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3RlZCBhbnkgbW9yZS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIGFueXRoaW5nIHVzZWZ1bCBtdXN0IGJlIGRvbmUgdGhlcmUsIHVzZSBzb21lIHNvcnQgb2YgcHJvcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgd2FpdC9ub3RpZnksIGFuZCBleGVjdXRlIG9uIHRoZSBoYW5kbGVyIHRocmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7Ci0gIH0KLQotICB2b2lkIFNlbmRIY2lMZUxvbmdUZXJtS2V5UmVwbHkoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgdWludDE2X3QgY29ubl9oYW5kbGUsIGNvbnN0IE9jdGV0MTYmIGx0aykgewotICAgIGkubGVfc2VjdXJpdHlfaW50ZXJmYWNlLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgaGNpOjpMZUxvbmdUZXJtS2V5UmVxdWVzdFJlcGx5QnVpbGRlcjo6Q3JlYXRlKGNvbm5faGFuZGxlLCBsdGspLAotICAgICAgICBpLmwyY2FwX2hhbmRsZXItPkJpbmRPbmNlKFtdKGhjaTo6Q29tbWFuZENvbXBsZXRlVmlldykge30pKTsKLSAgfQotCi0gIHN0ZDo6dmFyaWFudDxQYWlyaW5nRmFpbHVyZSwgRW5jcnlwdGlvbkNoYW5nZVZpZXcsIEVuY3J5cHRpb25LZXlSZWZyZXNoQ29tcGxldGVWaWV3PiBXYWl0RW5jcnlwdGlvbkNoYW5nZWQoKSB7Ci0gICAgUGFpcmluZ0V2ZW50IGUgPSBXYWl0Rm9yRXZlbnQoKTsKLSAgICBpZiAoZS50eXBlICE9IFBhaXJpbmdFdmVudDo6SENJX0VWRU5UKSByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIldhcyBleHBlY3RpbmcgSENJIGV2ZW50IGJ1dCByZWNlaXZlZCBzb21ldGhpbmcgZWxzZSIpOwotCi0gICAgaWYgKCFlLmhjaV9ldmVudC0+SXNWYWxpZCgpKSByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIlJlY2VpdmVkIGludmFsaWQgSENJIGV2ZW50Iik7Ci0KLSAgICBpZiAoZS5oY2lfZXZlbnQtPkdldEV2ZW50Q29kZSgpID09IGhjaTo6RXZlbnRDb2RlOjpFTkNSWVBUSU9OX0NIQU5HRSkgewotICAgICAgRW5jcnlwdGlvbkNoYW5nZVZpZXcgZW5jX2NoZ19wYWNrZXQgPSBFbmNyeXB0aW9uQ2hhbmdlVmlldzo6Q3JlYXRlKCplLmhjaV9ldmVudCk7Ci0gICAgICBpZiAoIWVuY19jaGdfcGFja2V0LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkludmFsaWQgRW5jcnlwdGlvbiBDaGFuZ2UgcGFja2V0IHJlY2VpdmVkIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW5jX2NoZ19wYWNrZXQ7Ci0gICAgfQotCi0gICAgaWYgKGUuaGNpX2V2ZW50LT5HZXRFdmVudENvZGUoKSA9PSBoY2k6OkV2ZW50Q29kZTo6RU5DUllQVElPTl9LRVlfUkVGUkVTSF9DT01QTEVURSkgewotICAgICAgaGNpOjpFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlVmlldyBlbmNfcGFja2V0ID0gRW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZVZpZXc6OkNyZWF0ZSgqZS5oY2lfZXZlbnQpOwotICAgICAgaWYgKCFlbmNfcGFja2V0LklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkludmFsaWQgS2V5IFJlZnJlc2ggcGFja2V0IHJlY2VpdmVkIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW5jX3BhY2tldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIldhcyBleHBlY3RpbmcgRW5jcnlwdGlvbiBDaGFuZ2Ugb3IgS2V5IFJlZnJlc2ggQ29tcGxldGUgYnV0IHJlY2VpdmVkIHNvbWV0aGluZyBlbHNlIik7Ci0gIH0KLQotICBzdGQ6OnZhcmlhbnQ8UGFpcmluZ0ZhaWx1cmUsIGhjaTo6TGVMb25nVGVybUtleVJlcXVlc3RWaWV3PiBXYWl0TGVMb25nVGVybUtleVJlcXVlc3QoKSB7Ci0gICAgUGFpcmluZ0V2ZW50IGUgPSBXYWl0Rm9yRXZlbnQoKTsKLSAgICBpZiAoZS50eXBlICE9IFBhaXJpbmdFdmVudDo6SENJX0VWRU5UKSByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIldhcyBleHBlY3RpbmcgSENJIGV2ZW50IGJ1dCByZWNlaXZlZCBzb21ldGhpbmcgZWxzZSIpOwotCi0gICAgaWYgKCFlLmhjaV9ldmVudC0+SXNWYWxpZCgpKSByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIlJlY2VpdmVkIGludmFsaWQgSENJIGV2ZW50Iik7Ci0KLSAgICBpZiAoZS5oY2lfZXZlbnQtPkdldEV2ZW50Q29kZSgpICE9IGhjaTo6RXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIldhcyBleHBlY3RpbmcgTEUgZXZlbnQiKTsKLQotICAgIGhjaTo6TGVNZXRhRXZlbnRWaWV3IGxlX2V2ZW50ID0gaGNpOjpMZU1ldGFFdmVudFZpZXc6OkNyZWF0ZSgqZS5oY2lfZXZlbnQpOwotICAgIGlmICghbGVfZXZlbnQuSXNWYWxpZCgpKSB7Ci0gICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkludmFsaWQgTEUgRXZlbnQgcmVjZWl2ZWQiKTsKLSAgICB9Ci0KLSAgICBpZiAobGVfZXZlbnQuR2V0U3ViZXZlbnRDb2RlKCkgIT0gaGNpOjpTdWJldmVudENvZGU6OkxPTkdfVEVSTV9LRVlfUkVRVUVTVCkgewotICAgICAgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJXYXMgZXhwZWN0aW5nIExvbmcgVGVybSBLZXkgUmVxdWVzdCIpOwotICAgIH0KLQotICAgIGhjaTo6TGVMb25nVGVybUtleVJlcXVlc3RWaWV3IGx0a19yZXFfcGFja2V0ID0gaGNpOjpMZUxvbmdUZXJtS2V5UmVxdWVzdFZpZXc6OkNyZWF0ZShsZV9ldmVudCk7Ci0gICAgaWYgKCFsdGtfcmVxX3BhY2tldC5Jc1ZhbGlkKCkpIHsKLSAgICAgIHJldHVybiBQYWlyaW5nRmFpbHVyZSgiSW52YWxpZCBMRSBMb25nIFRlcm0gS2V5IFJlcXVlc3QgcmVjZWl2ZWQiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbHRrX3JlcV9wYWNrZXQ7Ci0gIH0KLQotICBpbmxpbmUgYm9vbCBJQW1DZW50cmFsKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGkpIHsKLSAgICByZXR1cm4gaS5teV9yb2xlID09IGhjaTo6Um9sZTo6Q0VOVFJBTDsKLSAgfQotCi0gIC8qIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGRhdGEgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHJlbW90ZSBkZXZpY2UsIGV4Y2VwdAotICAgICB0aGUgcHJpdmF0ZSBrZXkuICovCi0gIHN0YXRpYyBNeU9vYkRhdGEgR2VuZXJhdGVPb2JEYXRhKCk7Ci0KLSAgc3RkOjp2YXJpYW50PFBhaXJpbmdGYWlsdXJlLCBLZXlFeGNoYW5nZVJlc3VsdD4gRXhjaGFuZ2VQdWJsaWNLZXlzKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPb2JEYXRhRmxhZyByZW1vdGVfaGF2ZV9vb2JfZGF0YSk7Ci0KLSAgU3RhZ2UxUmVzdWx0T3JGYWlsdXJlIERvU2VjdXJlQ29ubmVjdGlvbnNTdGFnZTEoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgY29uc3QgRWNkaFB1YmxpY0tleSYgUEthLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFY2RoUHVibGljS2V5JiBQS2IsIGNvbnN0IFBhaXJpbmdSZXF1ZXN0VmlldyYgcGFpcmluZ19yZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWlyaW5nUmVzcG9uc2VWaWV3JiBwYWlyaW5nX3Jlc3BvbnNlKTsKLQotICBTdGFnZTFSZXN1bHRPckZhaWx1cmUgU2VjdXJlQ29ubmVjdGlvbnNOdW1lcmljQ29tcGFyaXNvbihjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpLCBjb25zdCBFY2RoUHVibGljS2V5JiBQS2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBLYik7Ci0KLSAgU3RhZ2UxUmVzdWx0T3JGYWlsdXJlIFNlY3VyZUNvbm5lY3Rpb25zSnVzdFdvcmtzKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBLYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBLYik7Ci0KLSAgU3RhZ2UxUmVzdWx0T3JGYWlsdXJlIFNlY3VyZUNvbm5lY3Rpb25zUGFzc2tleUVudHJ5KGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBLYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBLYiwgSW9DYXBhYmlsaXR5IG15X2lvY2FwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElvQ2FwYWJpbGl0eSByZW1vdGVfaW9jYXBzKTsKLQotICBTdGFnZTFSZXN1bHRPckZhaWx1cmUgU2VjdXJlQ29ubmVjdGlvbnNPdXRPZkJhbmQoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgY29uc3QgRWNkaFB1YmxpY0tleSYgUGthLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWNkaFB1YmxpY0tleSYgUGtiLCBPb2JEYXRhRmxhZyBteV9vb2JfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9vYkRhdGFGbGFnIHJlbW90ZV9vb2JfZmxhZyk7Ci0KLSAgU3RhZ2UyUmVzdWx0T3JGYWlsdXJlIERvU2VjdXJlQ29ubmVjdGlvbnNTdGFnZTIoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgY29uc3QgRWNkaFB1YmxpY0tleSYgUEthLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFY2RoUHVibGljS2V5JiBQS2IsIGNvbnN0IFBhaXJpbmdSZXF1ZXN0VmlldyYgcGFpcmluZ19yZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWlyaW5nUmVzcG9uc2VWaWV3JiBwYWlyaW5nX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGFnZTFSZXN1bHQgc3RhZ2UxcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiYgZGhrZXkpOwotCi0gIERpc3RyaWJ1dGVkS2V5c09yRmFpbHVyZSBEaXN0cmlidXRlS2V5cyhjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpLCBjb25zdCBQYWlyaW5nUmVzcG9uc2VWaWV3JiBwYWlyaW5nX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NlY3VyZUNvbm5lY3Rpb25zKTsKLQotICBEaXN0cmlidXRlZEtleXNPckZhaWx1cmUgUmVjZWl2ZUtleXMoY29uc3QgdWludDhfdCYga2V5c19pX3JlY2VpdmUpOwotCi0gIExlZ2FjeVN0YWdlMVJlc3VsdE9yRmFpbHVyZSBEb0xlZ2FjeVN0YWdlMShjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpLCBjb25zdCBQYWlyaW5nUmVxdWVzdFZpZXcmIHBhaXJpbmdfcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhaXJpbmdSZXNwb25zZVZpZXcmIHBhaXJpbmdfcmVzcG9uc2UpOwotICBMZWdhY3lTdGFnZTFSZXN1bHRPckZhaWx1cmUgTGVnYWN5T3V0T2ZCYW5kKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGkpOwotICBMZWdhY3lTdGFnZTFSZXN1bHRPckZhaWx1cmUgTGVnYWN5SnVzdFdvcmtzKCk7Ci0gIExlZ2FjeVN0YWdlMVJlc3VsdE9yRmFpbHVyZSBMZWdhY3lQYXNza2V5RW50cnkoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgY29uc3QgSW9DYXBhYmlsaXR5JiBteV9pb2NhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9DYXBhYmlsaXR5JiByZW1vdGVfaW9jYXBzKTsKLSAgU3RrT3JGYWlsdXJlIERvTGVnYWN5U3RhZ2UyKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksIGNvbnN0IFBhaXJpbmdSZXF1ZXN0VmlldyYgcGFpcmluZ19yZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFpcmluZ1Jlc3BvbnNlVmlldyYgcGFpcmluZ19yZXNwb25zZSwgY29uc3QgT2N0ZXQxNiYgdGspOwotCi0gIHZvaWQgU2VuZEtleXMoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwgY29uc3QgdWludDhfdCYga2V5c19pX3NlbmQsIE9jdGV0MTYgbHRrLCB1aW50MTZfdCBlZGl2LAotICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4gcmFuZCwgT2N0ZXQxNiBpcmssIEFkZHJlc3MgaWRlbnRpdHlfYWRkcmVzcywgQWRkclR5cGUgaWRlbnRpdHlfYWRkcmVzX3R5cGUsCi0gICAgICAgICAgICAgICAgT2N0ZXQxNiBzaWduYXR1cmVfa2V5KTsKLQotICAvKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkIHRvIGltbWVkaWF0ZWx5IGZpbmlzaCB0aGUgcGFpcmluZyBpbiBwcm9ncmVzcy4gKi8KLSAgdm9pZCBTZW5kRXhpdFNpZ25hbCgpIHsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socXVldWVfZ3VhcmQpOwotICAgICAgcXVldWUucHVzaChQYWlyaW5nRXZlbnQoUGFpcmluZ0V2ZW50OjpFWElUKSk7Ci0gICAgfQotICAgIHBhaXJpbmdfdGhyZWFkX2Jsb2NrZXJfLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIC8qIFNNUCBDb21tYW5kIHJlY2VpdmVkIGZyb20gcmVtb3RlIGRldmljZSAqLwotICB2b2lkIE9uQ29tbWFuZFZpZXcoQ29tbWFuZFZpZXcgcGFja2V0KSB7Ci0gICAgewotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHF1ZXVlX2d1YXJkKTsKLSAgICAgIHF1ZXVlLnB1c2goUGFpcmluZ0V2ZW50KHN0ZDo6bW92ZShwYWNrZXQpKSk7Ci0gICAgfQotICAgIHBhaXJpbmdfdGhyZWFkX2Jsb2NrZXJfLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIC8qIFNNUCBDb21tYW5kIHJlY2VpdmVkIGZyb20gcmVtb3RlIGRldmljZSAqLwotICB2b2lkIE9uSGNpRXZlbnQoaGNpOjpFdmVudFZpZXcgaGNpX2V2ZW50KSB7Ci0gICAgewotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHF1ZXVlX2d1YXJkKTsKLSAgICAgIHF1ZXVlLnB1c2goUGFpcmluZ0V2ZW50KHN0ZDo6bW92ZShoY2lfZXZlbnQpKSk7Ci0gICAgfQotICAgIHBhaXJpbmdfdGhyZWFkX2Jsb2NrZXJfLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIC8qIEludGVyYWN0aW9uIGZyb20gdXNlciAqLwotICB2b2lkIE9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpVSV9BQ1RJT05fVFlQRSB1aV9hY3Rpb24sIHVpbnQzMl90IHVpX3ZhbHVlKSB7Ci0gICAgewotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHF1ZXVlX2d1YXJkKTsKLSAgICAgIHF1ZXVlLnB1c2goUGFpcmluZ0V2ZW50KHVpX2FjdGlvbiwgdWlfdmFsdWUpKTsKLSAgICB9Ci0gICAgcGFpcmluZ190aHJlYWRfYmxvY2tlcl8ubm90aWZ5X29uZSgpOwotICB9Ci0KLSAgLyogSENJIExFIGV2ZW50IHJlY2VpdmVkIGZyb20gcmVtb3RlIGRldmljZSAqLwotICB2b2lkIE9uSGNpTGVFdmVudChoY2k6OkxlTWV0YUV2ZW50VmlldyBoY2lfZXZlbnQpIHsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socXVldWVfZ3VhcmQpOwotICAgICAgcXVldWUucHVzaChQYWlyaW5nRXZlbnQoc3RkOjptb3ZlKGhjaV9ldmVudCkpKTsKLSAgICB9Ci0gICAgcGFpcmluZ190aHJlYWRfYmxvY2tlcl8ubm90aWZ5X29uZSgpOwotICB9Ci0KLSAgLyogQmxvY2tzIHRoZSBwYWlyaW5nIHByb2Nlc3MgdW50aWwgc29tZSBleHRlcm5hbCBpbnRlcmFjdGlvbiwgb3IgdGltZW91dCBoYXBwZW5zICovCi0gIFBhaXJpbmdFdmVudCBXYWl0Rm9yRXZlbnQoKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHF1ZXVlX2d1YXJkKTsKLSAgICBkbyB7Ci0gICAgICBpZiAoIXF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgUGFpcmluZ0V2ZW50IGUgPSBxdWV1ZS5mcm9udCgpOwotICAgICAgICBxdWV1ZS5wb3AoKTsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgICB9Ci0gICAgICAvLyBUaGlzIHJlbGVhc2VzIHRoZSBsb2NrIHdoaWxlIGJsb2NraW5nLgotICAgICAgaWYgKHBhaXJpbmdfdGhyZWFkX2Jsb2NrZXJfLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKFNNUF9USU1FT1VUKSkgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpIHsKLSAgICAgICAgcmV0dXJuIFBhaXJpbmdFdmVudChQYWlyaW5nRXZlbnQ6OkVYSVQpOwotICAgICAgfQotCi0gICAgfSB3aGlsZSAodHJ1ZSk7Ci0gIH0KLQotICBzdGQ6Om9wdGlvbmFsPFBhaXJpbmdFdmVudD4gV2FpdFVpUGFpcmluZ0FjY2VwdCgpIHsKLSAgICBQYWlyaW5nRXZlbnQgZSA9IFdhaXRGb3JFdmVudCgpOwotICAgIGlmIChlLnR5cGUgPT0gUGFpcmluZ0V2ZW50OjpVSSAmIGUudWlfYWN0aW9uID09IFBhaXJpbmdFdmVudDo6UEFJUklOR19BQ0NFUFRFRCkgewotICAgICAgcmV0dXJuIGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpvcHRpb25hbDxQYWlyaW5nRXZlbnQ+IFdhaXRVaUNvbmZpcm1ZZXNObygpIHsKLSAgICBQYWlyaW5nRXZlbnQgZSA9IFdhaXRGb3JFdmVudCgpOwotICAgIGlmIChlLnR5cGUgPT0gUGFpcmluZ0V2ZW50OjpVSSAmIGUudWlfYWN0aW9uID09IFBhaXJpbmdFdmVudDo6Q09ORklSTV9ZRVNOTykgewotICAgICAgcmV0dXJuIGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpvcHRpb25hbDxQYWlyaW5nRXZlbnQ+IFdhaXRVaVBhc3NrZXkoKSB7Ci0gICAgUGFpcmluZ0V2ZW50IGUgPSBXYWl0Rm9yRXZlbnQoKTsKLQotICAgIC8vIEl0J3MgcG9zc2libGUgdG8gcmVjZWl2ZSBQQUlSSU5HX0NPTkZJUk0gZnJvbSByZW1vdGUgZGV2aWNlIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwYXNza2V5LgotICAgIC8vIFN0b3JlIGl0IHVudGlsIGl0J3MgbmVlZGVkLgotICAgIGlmIChlLnR5cGUgPT0gUGFpcmluZ0V2ZW50OjpMMkNBUCkgewotICAgICAgYXV0byBsMmNhcF9wYWNrZXQgPSBlLmwyY2FwX3BhY2tldC52YWx1ZSgpOwotICAgICAgaWYgKCFsMmNhcF9wYWNrZXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgIExPR19XQVJOKCJNYWxmb3JtZWQgTDJDQVAgcGFja2V0IHJlY2VpdmVkISIpOwotICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgICAgfQotCi0gICAgICBjb25zdCBhdXRvJiByZWNlaXZlZF9jb2RlID0gbDJjYXBfcGFja2V0LkdldENvZGUoKTsKLSAgICAgIGlmIChyZWNlaXZlZF9jb2RlICE9IENvZGU6OlBBSVJJTkdfQ09ORklSTSkgewotICAgICAgICBMT0dfV0FSTigiV2FzIHdhaXRpbmcgZm9yIHBhc3NrZXksIHJlY2VpdmVkIGJhZCBwYWNrZXQgaW5zdGVhZCEiKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICAgIH0KLQotICAgICAgYXV0byBwa3QgPSBQYWlyaW5nQ29uZmlybVZpZXc6OkNyZWF0ZShsMmNhcF9wYWNrZXQpOwotICAgICAgaWYgKCFwa3QuSXNWYWxpZCgpKSB7Ci0gICAgICAgIExPR19XQVJOKCJNYWxmb3JtZWQgUEFJUklOR19DT05GSVJNIHBhY2tldCIpOwotICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgICAgfQotCi0gICAgICBjYWNoZWRfcGFyaXJpbmdfY29uZmlybV92aWV3ID0gc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nQ29uZmlybVZpZXc+KHBrdCk7Ci0gICAgICBlID0gV2FpdEZvckV2ZW50KCk7Ci0gICAgfQotCi0gICAgaWYgKGUudHlwZSA9PSBQYWlyaW5nRXZlbnQ6OlVJICYgZS51aV9hY3Rpb24gPT0gUGFpcmluZ0V2ZW50OjpQQVNTS0VZKSB7Ci0gICAgICByZXR1cm4gZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Q29kZSBDPgotICBzdHJ1Y3QgQ29kZVRvUGFja2V0VmlldzsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6UEFJUklOR19SRVFVRVNUPiB7Ci0gICAgdHlwZWRlZiBQYWlyaW5nUmVxdWVzdFZpZXcgdHlwZTsKLSAgfTsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6UEFJUklOR19SRVNQT05TRT4gewotICAgIHR5cGVkZWYgUGFpcmluZ1Jlc3BvbnNlVmlldyB0eXBlOwotICB9OwotICB0ZW1wbGF0ZSA8PgotICBzdHJ1Y3QgQ29kZVRvUGFja2V0VmlldzxDb2RlOjpQQUlSSU5HX0NPTkZJUk0+IHsKLSAgICB0eXBlZGVmIFBhaXJpbmdDb25maXJtVmlldyB0eXBlOwotICB9OwotICB0ZW1wbGF0ZSA8PgotICBzdHJ1Y3QgQ29kZVRvUGFja2V0VmlldzxDb2RlOjpQQUlSSU5HX1JBTkRPTT4gewotICAgIHR5cGVkZWYgUGFpcmluZ1JhbmRvbVZpZXcgdHlwZTsKLSAgfTsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6UEFJUklOR19GQUlMRUQ+IHsKLSAgICB0eXBlZGVmIFBhaXJpbmdGYWlsZWRWaWV3IHR5cGU7Ci0gIH07Ci0gIHRlbXBsYXRlIDw+Ci0gIHN0cnVjdCBDb2RlVG9QYWNrZXRWaWV3PENvZGU6OkVOQ1JZUFRJT05fSU5GT1JNQVRJT04+IHsKLSAgICB0eXBlZGVmIEVuY3J5cHRpb25JbmZvcm1hdGlvblZpZXcgdHlwZTsKLSAgfTsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6Q0VOVFJBTF9JREVOVElGSUNBVElPTj4gewotICAgIHR5cGVkZWYgQ2VudHJhbElkZW50aWZpY2F0aW9uVmlldyB0eXBlOwotICB9OwotICB0ZW1wbGF0ZSA8PgotICBzdHJ1Y3QgQ29kZVRvUGFja2V0VmlldzxDb2RlOjpJREVOVElUWV9JTkZPUk1BVElPTj4gewotICAgIHR5cGVkZWYgSWRlbnRpdHlJbmZvcm1hdGlvblZpZXcgdHlwZTsKLSAgfTsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6SURFTlRJVFlfQUREUkVTU19JTkZPUk1BVElPTj4gewotICAgIHR5cGVkZWYgSWRlbnRpdHlBZGRyZXNzSW5mb3JtYXRpb25WaWV3IHR5cGU7Ci0gIH07Ci0gIHRlbXBsYXRlIDw+Ci0gIHN0cnVjdCBDb2RlVG9QYWNrZXRWaWV3PENvZGU6OlNJR05JTkdfSU5GT1JNQVRJT04+IHsKLSAgICB0eXBlZGVmIFNpZ25pbmdJbmZvcm1hdGlvblZpZXcgdHlwZTsKLSAgfTsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6U0VDVVJJVFlfUkVRVUVTVD4gewotICAgIHR5cGVkZWYgU2VjdXJpdHlSZXF1ZXN0VmlldyB0eXBlOwotICB9OwotICB0ZW1wbGF0ZSA8PgotICBzdHJ1Y3QgQ29kZVRvUGFja2V0VmlldzxDb2RlOjpQQUlSSU5HX1BVQkxJQ19LRVk+IHsKLSAgICB0eXBlZGVmIFBhaXJpbmdQdWJsaWNLZXlWaWV3IHR5cGU7Ci0gIH07Ci0gIHRlbXBsYXRlIDw+Ci0gIHN0cnVjdCBDb2RlVG9QYWNrZXRWaWV3PENvZGU6OlBBSVJJTkdfREhfS0VZX0NIRUNLPiB7Ci0gICAgdHlwZWRlZiBQYWlyaW5nRGhLZXlDaGVja1ZpZXcgdHlwZTsKLSAgfTsKLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IENvZGVUb1BhY2tldFZpZXc8Q29kZTo6UEFJUklOR19LRVlQUkVTU19OT1RJRklDQVRJT04+IHsKLSAgICB0eXBlZGVmIFBhaXJpbmdLZXlwcmVzc05vdGlmaWNhdGlvblZpZXcgdHlwZTsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8Q29kZSBDT0RFPgotICBzdGQ6OnZhcmlhbnQ8dHlwZW5hbWUgQ29kZVRvUGFja2V0VmlldzxDT0RFPjo6dHlwZSwgUGFpcmluZ0ZhaWx1cmU+IFdhaXRQYWNrZXQoKSB7Ci0gICAgUGFpcmluZ0V2ZW50IGUgPSBXYWl0Rm9yRXZlbnQoKTsKLSAgICBzd2l0Y2ggKGUudHlwZSkgewotICAgICAgY2FzZSBQYWlyaW5nRXZlbnQ6OkVYSVQ6Ci0gICAgICAgIHJldHVybiBQYWlyaW5nRmFpbHVyZSgKLSAgICAgICAgICAgIC8qRlJPTV9IRVJFLCovICJXYXMgZXhwZWN0aW5nIEwyQ0FQIFBhY2tldCAiICsgQ29kZVRleHQoQ09ERSkgKyAiLCBidXQgcmVjZWl2ZWQgRVhJVCBpbnN0ZWFkIik7Ci0KLSAgICAgIGNhc2UgUGFpcmluZ0V2ZW50OjpIQ0lfRVZFTlQ6Ci0gICAgICAgIHJldHVybiBQYWlyaW5nRmFpbHVyZSgKLSAgICAgICAgICAgIC8qRlJPTV9IRVJFLCovICJXYXMgZXhwZWN0aW5nIEwyQ0FQIFBhY2tldCAiICsgQ29kZVRleHQoQ09ERSkgKyAiLCBidXQgcmVjZWl2ZWQgSENJX0VWRU5UIGluc3RlYWQiKTsKLQotICAgICAgY2FzZSBQYWlyaW5nRXZlbnQ6OlVJOgotICAgICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoCi0gICAgICAgICAgICAvKkZST01fSEVSRSwqLyAiV2FzIGV4cGVjdGluZyBMMkNBUCBQYWNrZXQgIiArIENvZGVUZXh0KENPREUpICsgIiwgYnV0IHJlY2VpdmVkIFVJIGluc3RlYWQiKTsKLQotICAgICAgY2FzZSBQYWlyaW5nRXZlbnQ6OkwyQ0FQOiB7Ci0gICAgICAgIGF1dG8gbDJjYXBfcGFja2V0ID0gZS5sMmNhcF9wYWNrZXQudmFsdWUoKTsKLSAgICAgICAgaWYgKCFsMmNhcF9wYWNrZXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJNYWxmb3JtZWQgTDJDQVAgcGFja2V0IHJlY2VpdmVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgYXV0byYgcmVjZWl2ZWRfY29kZSA9IGwyY2FwX3BhY2tldC5HZXRDb2RlKCk7Ci0gICAgICAgIGlmIChyZWNlaXZlZF9jb2RlICE9IENPREUpIHsKLSAgICAgICAgICBpZiAocmVjZWl2ZWRfY29kZSA9PSBDb2RlOjpQQUlSSU5HX0ZBSUxFRCkgewotICAgICAgICAgICAgYXV0byBwa3QgPSBQYWlyaW5nRmFpbGVkVmlldzo6Q3JlYXRlKGwyY2FwX3BhY2tldCk7Ci0gICAgICAgICAgICBpZiAoIXBrdC5Jc1ZhbGlkKCkpIHJldHVybiBQYWlyaW5nRmFpbHVyZSgiTWFsZm9ybWVkICIgKyBDb2RlVGV4dChDT0RFKSArICIgcGFja2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoLypGUk9NX0hFUkUsKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FzIGV4cGVjdGluZyAiICsgQ29kZVRleHQoQ09ERSkgKyAiLCBidXQgcmVjZWl2ZWQgUEFJUklOR19GQUlMRUQgaW5zdGVhZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LkdldFJlYXNvbigpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoLypGUk9NX0hFUkUsKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcyBleHBlY3RpbmcgIiArIENvZGVUZXh0KENPREUpICsgIiwgYnV0IHJlY2VpdmVkICIgKyBDb2RlVGV4dChyZWNlaXZlZF9jb2RlKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluc3RlYWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZF9jb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gcGt0ID0gQ29kZVRvUGFja2V0VmlldzxDT0RFPjo6dHlwZTo6Q3JlYXRlKGwyY2FwX3BhY2tldCk7Ci0gICAgICAgIGlmICghcGt0LklzVmFsaWQoKSkgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJNYWxmb3JtZWQgIiArIENvZGVUZXh0KENPREUpICsgIiBwYWNrZXQiKTsKLSAgICAgICAgcmV0dXJuIHBrdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBhdXRvIFdhaXRQYWlyaW5nUmVxdWVzdCgpIHsKLSAgICByZXR1cm4gV2FpdFBhY2tldDxDb2RlOjpQQUlSSU5HX1JFUVVFU1Q+KCk7Ci0gIH0KLQotICBhdXRvIFdhaXRQYWlyaW5nUmVzcG9uc2UoKSB7Ci0gICAgcmV0dXJuIFdhaXRQYWNrZXQ8Q29kZTo6UEFJUklOR19SRVNQT05TRT4oKTsKLSAgfQotCi0gIHN0ZDo6dmFyaWFudDxibHVldG9vdGg6OnNlY3VyaXR5OjpQYWlyaW5nQ29uZmlybVZpZXcsIGJsdWV0b290aDo6c2VjdXJpdHk6OlBhaXJpbmdGYWlsdXJlPiBXYWl0UGFpcmluZ0NvbmZpcm0oKSB7Ci0gICAgaWYgKGNhY2hlZF9wYXJpcmluZ19jb25maXJtX3ZpZXcpIHsKLSAgICAgIFBhaXJpbmdDb25maXJtVmlldyBwa3QgPSAqY2FjaGVkX3BhcmlyaW5nX2NvbmZpcm1fdmlldzsKLSAgICAgIGNhY2hlZF9wYXJpcmluZ19jb25maXJtX3ZpZXcucmVsZWFzZSgpOwotICAgICAgcmV0dXJuIHBrdDsKLSAgICB9Ci0gICAgcmV0dXJuIFdhaXRQYWNrZXQ8Q29kZTo6UEFJUklOR19DT05GSVJNPigpOwotICB9Ci0KLSAgYXV0byBXYWl0UGFpcmluZ1JhbmRvbSgpIHsKLSAgICByZXR1cm4gV2FpdFBhY2tldDxDb2RlOjpQQUlSSU5HX1JBTkRPTT4oKTsKLSAgfQotCi0gIGF1dG8gV2FpdFBhaXJpbmdQdWJsaWNLZXkoKSB7Ci0gICAgcmV0dXJuIFdhaXRQYWNrZXQ8Q29kZTo6UEFJUklOR19QVUJMSUNfS0VZPigpOwotICB9Ci0KLSAgYXV0byBXYWl0UGFpcmluZ0RIS2V5Q2hlY2soKSB7Ci0gICAgcmV0dXJuIFdhaXRQYWNrZXQ8Q29kZTo6UEFJUklOR19ESF9LRVlfQ0hFQ0s+KCk7Ci0gIH0KLQotICBhdXRvIFdhaXRFbmNyeXB0aW9uSW5mb3JtYXRpb25SZXF1ZXN0KCkgewotICAgIHJldHVybiBXYWl0UGFja2V0PENvZGU6OkVOQ1JZUFRJT05fSU5GT1JNQVRJT04+KCk7Ci0gIH0KLQotICBhdXRvIFdhaXRFbmNyeXB0aW9uSW5mb3JtYXRpb24oKSB7Ci0gICAgcmV0dXJuIFdhaXRQYWNrZXQ8Q29kZTo6RU5DUllQVElPTl9JTkZPUk1BVElPTj4oKTsKLSAgfQotCi0gIGF1dG8gV2FpdENlbnRyYWxJZGVudGlmaWNhdGlvbigpIHsKLSAgICByZXR1cm4gV2FpdFBhY2tldDxDb2RlOjpDRU5UUkFMX0lERU5USUZJQ0FUSU9OPigpOwotICB9Ci0KLSAgYXV0byBXYWl0SWRlbnRpdHlJbmZvcm1hdGlvbigpIHsKLSAgICByZXR1cm4gV2FpdFBhY2tldDxDb2RlOjpJREVOVElUWV9JTkZPUk1BVElPTj4oKTsKLSAgfQotCi0gIGF1dG8gV2FpdElkZW50aXR5QWRkcmVzc0luZm9ybWF0aW9uKCkgewotICAgIHJldHVybiBXYWl0UGFja2V0PENvZGU6OklERU5USVRZX0FERFJFU1NfSU5GT1JNQVRJT04+KCk7Ci0gIH0KLQotICBhdXRvIFdhaXRTaWduaW5nSW5mb3JtYXRpb24oKSB7Ci0gICAgcmV0dXJuIFdhaXRQYWNrZXQ8Q29kZTo6U0lHTklOR19JTkZPUk1BVElPTj4oKTsKLSAgfQotCi0gIC8qIFRoaXMgaXMganVzdCBmb3IgdGVzdCwgbmV2ZXIgdXNlIGluIHByb2R1Y3Rpb24gY29kZSEgKi8KLSAgdm9pZCBXYWl0VW50aWxQYWlyaW5nRmluaXNoZWQoKSB7Ci0gICAgdGhyZWFkXy5qb2luKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIHBhaXJpbmdfdGhyZWFkX2Jsb2NrZXJfOwotCi0gIHN0ZDo6bXV0ZXggcXVldWVfZ3VhcmQ7Ci0gIHN0ZDo6cXVldWU8UGFpcmluZ0V2ZW50PiBxdWV1ZTsKLQotICBzdGQ6OnRocmVhZCB0aHJlYWRfOwotCi0gIC8vIGhvbGRzIHBhaXJpbmdfY29uZmlybSwgaWYgcmVjZWl2ZWQgb3V0IG9mIG9yZGVyCi0gIHN0ZDo6dW5pcXVlX3B0cjxQYWlyaW5nQ29uZmlybVZpZXc+IGNhY2hlZF9wYXJpcmluZ19jb25maXJtX3ZpZXc7Ci19OwotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGVfbGVnYWN5LmNjIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlX2xlZ2FjeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlOGQ4OC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGVfbGVnYWN5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGUuaCIKLQotI2luY2x1ZGUgIm9zL3JhbmQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi11c2luZyBibHVldG9vdGg6Om9zOjpHZW5lcmF0ZVJhbmRvbTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1MZWdhY3lTdGFnZTFSZXN1bHRPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6RG9MZWdhY3lTdGFnZTEoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWlyaW5nUmVxdWVzdFZpZXcmIHBhaXJpbmdfcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWlyaW5nUmVzcG9uc2VWaWV3JiBwYWlyaW5nX3Jlc3BvbnNlKSB7Ci0gIGlmICgoKHBhaXJpbmdfcmVxdWVzdC5HZXRBdXRoUmVxKCkgfCBwYWlyaW5nX3Jlc3BvbnNlLkdldEF1dGhSZXEoKSkgJiBBdXRoUmVxTWFza01pdG0pID09IDApIHsKLSAgICAvLyBJZiBib3RoIGRldmljZXMgaGF2ZSBub3Qgc2V0IE1JVE0gb3B0aW9uLCBKdXN0IFdvcmtzIHNoYWxsIGJlIHVzZWQKLSAgICByZXR1cm4gTGVnYWN5SnVzdFdvcmtzKCk7Ci0gIH0KLQotICBpZiAocGFpcmluZ19yZXF1ZXN0LkdldE9vYkRhdGFGbGFnKCkgPT0gT29iRGF0YUZsYWc6OlBSRVNFTlQgJiYKLSAgICAgIHBhaXJpbmdfcmVzcG9uc2UuR2V0T29iRGF0YUZsYWcoKSA9PSBPb2JEYXRhRmxhZzo6UFJFU0VOVCkgewotICAgIC8vIE9vYkRhdGFGbGFnIHJlbW90ZV9vb2JfZmxhZyA9IElBbUNlbnRyYWwoaSkgPyBwYWlyaW5nX3Jlc3BvbnNlLkdldE9vYkRhdGFGbGFnKCkgOgotICAgIC8vIHBhaXJpbmdfcmVxdWVzdC5HZXRPb2JEYXRhRmxhZygpOyBPb2JEYXRhRmxhZyBteV9vb2JfZmxhZyA9IElBbUNlbnRyYWwoaSkgPyBwYWlyaW5nX3JlcXVlc3QuR2V0T29iRGF0YUZsYWcoKSA6Ci0gICAgLy8gcGFpcmluZ19yZXNwb25zZS5HZXRPb2JEYXRhRmxhZygpOwotICAgIHJldHVybiBMZWdhY3lPdXRPZkJhbmQoaSk7Ci0gIH0KLQotICBjb25zdCBhdXRvJiBpb20gPSBwYWlyaW5nX3JlcXVlc3QuR2V0SW9DYXBhYmlsaXR5KCk7Ci0gIGNvbnN0IGF1dG8mIGlvcyA9IHBhaXJpbmdfcmVzcG9uc2UuR2V0SW9DYXBhYmlsaXR5KCk7Ci0KLSAgaWYgKGlvbSA9PSBJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCB8fCBpb3MgPT0gSW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQpIHsKLSAgICByZXR1cm4gTGVnYWN5SnVzdFdvcmtzKCk7Ci0gIH0KLQotICBpZiAoKGlvbSA9PSBJb0NhcGFiaWxpdHk6OkRJU1BMQVlfT05MWSB8fCBpb20gPT0gSW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTykgJiYKLSAgICAgIChpb3MgPT0gSW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFkgfHwgaW9zID09IElvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk8pKSB7Ci0gICAgcmV0dXJuIExlZ2FjeUp1c3RXb3JrcygpOwotICB9Ci0KLSAgLy8gVGhpcyBpZigpIHNob3VsZCBub3QgYmUgbmVlZGVkLCB0aGVzZSBhcmUgb25seSBjb21iaW5hdGlvbnMgbGVmdC4KLSAgaWYgKGlvbSA9PSBJb0NhcGFiaWxpdHk6OktFWUJPQVJEX0RJU1BMQVkgfHwgaW9tID09IElvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfT05MWSB8fAotICAgICAgaW9zID09IElvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfRElTUExBWSB8fCBpb3MgPT0gSW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9PTkxZKSB7Ci0gICAgSW9DYXBhYmlsaXR5IG15X2lvY2FwcyA9IElBbUNlbnRyYWwoaSkgPyBpb20gOiBpb3M7Ci0gICAgSW9DYXBhYmlsaXR5IHJlbW90ZV9pb2NhcHMgPSBJQW1DZW50cmFsKGkpID8gaW9zIDogaW9tOwotICAgIHJldHVybiBMZWdhY3lQYXNza2V5RW50cnkoaSwgbXlfaW9jYXBzLCByZW1vdGVfaW9jYXBzKTsKLSAgfQotCi0gIC8vIFdlIHdlbnQgdGhyb3VnaCBhbGwgcG9zc2JsZSBjb21iaW5hdGlvbnMuCi0gIExPR19BTFdBWVNfRkFUQUwoIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOwotfQotCi1MZWdhY3lTdGFnZTFSZXN1bHRPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6TGVnYWN5SnVzdFdvcmtzKCkgewotICBMT0dfSU5GTygiTGVnYWN5IEp1c3QgV29ya3Mgc3RhcnQiKTsKLSAgcmV0dXJuIE9jdGV0MTZ7MH07Ci19Ci0KLUxlZ2FjeVN0YWdlMVJlc3VsdE9yRmFpbHVyZSBQYWlyaW5nSGFuZGxlckxlOjpMZWdhY3lQYXNza2V5RW50cnkoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW9DYXBhYmlsaXR5JiBteV9pb2NhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElvQ2FwYWJpbGl0eSYgcmVtb3RlX2lvY2FwcykgewotICBib29sIGlfYW1fZGlzcGxheWluZyA9IGZhbHNlOwotICBpZiAobXlfaW9jYXBzID09IElvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZIHx8IG15X2lvY2FwcyA9PSBJb0NhcGFiaWxpdHk6OkRJU1BMQVlfWUVTX05PKSB7Ci0gICAgaV9hbV9kaXNwbGF5aW5nID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICgKLSAgICAgIElBbUNlbnRyYWwoaSkgJiYgcmVtb3RlX2lvY2FwcyA9PSBJb0NhcGFiaWxpdHk6OktFWUJPQVJEX0RJU1BMQVkgJiYgbXlfaW9jYXBzID09IElvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfRElTUExBWSkgewotICAgIGlfYW1fZGlzcGxheWluZyA9IHRydWU7Ci0gIH0gZWxzZSBpZiAobXlfaW9jYXBzID09IElvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfRElTUExBWSAmJiByZW1vdGVfaW9jYXBzID09IElvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfT05MWSkgewotICAgIGlfYW1fZGlzcGxheWluZyA9IHRydWU7Ci0gIH0KLQotICBMT0dfSU5GTygiUGFzc2tleSBFbnRyeSBzdGFydCAlcyIsIGlfYW1fZGlzcGxheWluZyA/ICJkaXNwbGF5aW5nIiA6ICJhY2NlcHRpbmciKTsKLQotICB1aW50MzJfdCBwYXNza2V5OwotICBpZiAoaV9hbV9kaXNwbGF5aW5nKSB7Ci0gICAgLy8gZ2VuZXJhdGUgcGFzc2tleSBpbiBhIHZhbGlkIHJhbmdlCi0gICAgcGFzc2tleSA9IEdlbmVyYXRlUmFuZG9tKCk7Ci0gICAgcGFzc2tleSAmPSAweDBmZmZmZjsgLyogbWF4aW11bSAyMCBzaWduaWZpY2FudCBiaXRzICovCi0gICAgY29uc3RleHByIHVpbnQzMl90IFBBU1NLRVlfTUFYID0gOTk5OTk5OwotICAgIGlmIChwYXNza2V5ID4gUEFTU0tFWV9NQVgpIHBhc3NrZXkgPj49IDE7Ci0KLSAgICBDb25maXJtYXRpb25EYXRhIGRhdGEoaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLCBpLnJlbW90ZV9uYW1lLCBwYXNza2V5KTsKLSAgICBpLnVzZXJfaW50ZXJmYWNlX2hhbmRsZXItPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJlVJOjpEaXNwbGF5Q29uZmlybVZhbHVlLCBjb21tb246OlVucmV0YWluZWQoaS51c2VyX2ludGVyZmFjZSksIGRhdGEpKTsKLSAgfSBlbHNlIHsKLSAgICBDb25maXJtYXRpb25EYXRhIGRhdGEoaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLCBpLnJlbW90ZV9uYW1lKTsKLSAgICBpLnVzZXJfaW50ZXJmYWNlX2hhbmRsZXItPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJlVJOjpEaXNwbGF5RW50ZXJQYXNza2V5RGlhbG9nLCBjb21tb246OlVucmV0YWluZWQoaS51c2VyX2ludGVyZmFjZSksIGRhdGEpKTsKLSAgICBzdGQ6Om9wdGlvbmFsPFBhaXJpbmdFdmVudD4gcmVzcG9uc2UgPSBXYWl0VWlQYXNza2V5KCk7Ci0gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJQYXNza2V5IGRpZCBub3QgYXJyaXZlISIpOwotCi0gICAgcGFzc2tleSA9IHJlc3BvbnNlLT51aV92YWx1ZTsKLSAgfQotCi0gIE9jdGV0MTYgdGt7MH07Ci0gIHRrWzBdID0gKHVpbnQ4X3QpKHBhc3NrZXkpOwotICB0a1sxXSA9ICh1aW50OF90KShwYXNza2V5ID4+IDgpOwotICB0a1syXSA9ICh1aW50OF90KShwYXNza2V5ID4+IDE2KTsKLSAgdGtbM10gPSAodWludDhfdCkocGFzc2tleSA+PiAyNCk7Ci0KLSAgTE9HX0lORk8oIlBhc3NrZXkgRW50cnkgZmluaXNoIik7Ci0gIHJldHVybiB0azsKLX0KLQotTGVnYWN5U3RhZ2UxUmVzdWx0T3JGYWlsdXJlIFBhaXJpbmdIYW5kbGVyTGU6OkxlZ2FjeU91dE9mQmFuZChjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpKSB7Ci0gIHJldHVybiBpLnJlbW90ZV9vb2JfZGF0YS0+c2VjdXJpdHlfbWFuYWdlcl90a192YWx1ZTsKLX0KLQotU3RrT3JGYWlsdXJlIFBhaXJpbmdIYW5kbGVyTGU6OkRvTGVnYWN5U3RhZ2UyKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksIGNvbnN0IFBhaXJpbmdSZXF1ZXN0VmlldyYgcGFpcmluZ19yZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhaXJpbmdSZXNwb25zZVZpZXcmIHBhaXJpbmdfcmVzcG9uc2UsIGNvbnN0IE9jdGV0MTYmIHRrKSB7Ci0gIExPR19JTkZPKCJMZWdhY3kgU3RlcCAyIHN0YXJ0Iik7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHByZXEocGFpcmluZ19yZXF1ZXN0LmJlZ2luKCksIHBhaXJpbmdfcmVxdWVzdC5lbmQoKSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHByZXMocGFpcmluZ19yZXNwb25zZS5iZWdpbigpLCBwYWlyaW5nX3Jlc3BvbnNlLmVuZCgpKTsKLQotICBPY3RldDE2IG1yYW5kLCBzcmFuZDsKLSAgaWYgKElBbUNlbnRyYWwoaSkpIHsKLSAgICBtcmFuZCA9IEdlbmVyYXRlUmFuZG9tPDE2PigpOwotCi0gICAgLy8gTE9HKElORk8pIDw8ICsoSUFtQ2VudHJhbChpKSkgPDwgIiB0ayA9ICIgPDwgYmFzZTo6SGV4RW5jb2RlKHRrLmRhdGEoKSwgdGsuc2l6ZSgpKTsKLSAgICAvLyBMT0coSU5GTykgPDwgKyhJQW1DZW50cmFsKGkpKSA8PCAiIG1yYW5kID0gIiA8PCBiYXNlOjpIZXhFbmNvZGUobXJhbmQuZGF0YSgpLCBtcmFuZC5zaXplKCkpOwotICAgIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgcHJlcyA9ICIgPDwgYmFzZTo6SGV4RW5jb2RlKHByZXMuZGF0YSgpLCBwcmVzLnNpemUoKSk7Ci0gICAgLy8gTE9HKElORk8pIDw8ICsoSUFtQ2VudHJhbChpKSkgPDwgIiBwcmVxID0gIiA8PCBiYXNlOjpIZXhFbmNvZGUocHJlcS5kYXRhKCksIHByZXEuc2l6ZSgpKTsKLQotICAgIE9jdGV0MTYgbWNvbmZpcm0gPSBjcnlwdG9fdG9vbGJveDo6YzEoCi0gICAgICAgIHRrLAotICAgICAgICBtcmFuZCwKLSAgICAgICAgcHJlcS5kYXRhKCksCi0gICAgICAgIHByZXMuZGF0YSgpLAotICAgICAgICAodWludDhfdClpLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpLAotICAgICAgICBpLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzKCkuZGF0YSgpLAotICAgICAgICAodWludDhfdClpLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzc1R5cGUoKSwKLSAgICAgICAgaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCkpOwotCi0gICAgLy8gTE9HKElORk8pIDw8ICsoSUFtQ2VudHJhbChpKSkgPDwgIiBtY29uZmlybSA9ICIgPDwgYmFzZTo6SGV4RW5jb2RlKG1jb25maXJtLmRhdGEoKSwgbWNvbmZpcm0uc2l6ZSgpKTsKLQotICAgIExPR19JTkZPKCJDZW50cmFsIHNlbmRzIE1jb25maXJtIik7Ci0gICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdDb25maXJtQnVpbGRlcjo6Q3JlYXRlKG1jb25maXJtKSk7Ci0KLSAgICBMT0dfSU5GTygiQ2VudHJhbCB3YWl0cyBmb3IgdGhlIFNjb25maXJtIik7Ci0gICAgYXV0byBzY29uZmlybV9wa3QgPSBXYWl0UGFpcmluZ0NvbmZpcm0oKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4oc2NvbmZpcm1fcGt0KSkgewotICAgICAgcmV0dXJuIHN0ZDo6Z2V0PFBhaXJpbmdGYWlsdXJlPihzY29uZmlybV9wa3QpOwotICAgIH0KLSAgICBPY3RldDE2IHNjb25maXJtID0gc3RkOjpnZXQ8UGFpcmluZ0NvbmZpcm1WaWV3PihzY29uZmlybV9wa3QpLkdldENvbmZpcm1WYWx1ZSgpOwotCi0gICAgTE9HX0lORk8oIkNlbnRyYWwgc2VuZHMgTXJhbmQiKTsKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ1JhbmRvbUJ1aWxkZXI6OkNyZWF0ZShtcmFuZCkpOwotCi0gICAgTE9HX0lORk8oIkNlbnRyYWwgd2FpdHMgZm9yIFNyYW5kIik7Ci0gICAgYXV0byByYW5kb21fcGt0ID0gV2FpdFBhaXJpbmdSYW5kb20oKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocmFuZG9tX3BrdCkpIHsKLSAgICAgIHJldHVybiBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4ocmFuZG9tX3BrdCk7Ci0gICAgfQotICAgIHNyYW5kID0gc3RkOjpnZXQ8UGFpcmluZ1JhbmRvbVZpZXc+KHJhbmRvbV9wa3QpLkdldFJhbmRvbVZhbHVlKCk7Ci0KLSAgICAvLyBMT0coSU5GTykgPDwgKyhJQW1DZW50cmFsKGkpKSA8PCAiIHNyYW5kID0gIiA8PCBiYXNlOjpIZXhFbmNvZGUoc3JhbmQuZGF0YSgpLCBzcmFuZC5zaXplKCkpOwotCi0gICAgT2N0ZXQxNiBzY29uZmlybV9nZW5lcmF0ZWQgPSBjcnlwdG9fdG9vbGJveDo6YzEoCi0gICAgICAgIHRrLAotICAgICAgICBzcmFuZCwKLSAgICAgICAgcHJlcS5kYXRhKCksCi0gICAgICAgIHByZXMuZGF0YSgpLAotICAgICAgICAodWludDhfdClpLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpLAotICAgICAgICBpLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzKCkuZGF0YSgpLAotICAgICAgICAodWludDhfdClpLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzc1R5cGUoKSwKLSAgICAgICAgaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCkpOwotCi0gICAgaWYgKHNjb25maXJtICE9IHNjb25maXJtX2dlbmVyYXRlZCkgewotICAgICAgTE9HX0lORk8oInNjb25maXJtIGRvZXMgbm90IG1hdGNoIGdlbmVyYXRlZCB2YWx1ZSIpOwotCi0gICAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ0ZhaWxlZEJ1aWxkZXI6OkNyZWF0ZShQYWlyaW5nRmFpbGVkUmVhc29uOjpDT05GSVJNX1ZBTFVFX0ZBSUxFRCkpOwotICAgICAgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJzY29uZmlybSBkb2VzIG5vdCBtYXRjaCBnZW5lcmF0ZWQgdmFsdWUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3JhbmQgPSBHZW5lcmF0ZVJhbmRvbTwxNj4oKTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHByZXEocGFpcmluZ19yZXF1ZXN0LmJlZ2luKCksIHBhaXJpbmdfcmVxdWVzdC5lbmQoKSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcHJlcyhwYWlyaW5nX3Jlc3BvbnNlLmJlZ2luKCksIHBhaXJpbmdfcmVzcG9uc2UuZW5kKCkpOwotCi0gICAgT2N0ZXQxNiBzY29uZmlybSA9IGNyeXB0b190b29sYm94OjpjMSgKLSAgICAgICAgdGssCi0gICAgICAgIHNyYW5kLAotICAgICAgICBwcmVxLmRhdGEoKSwKLSAgICAgICAgcHJlcy5kYXRhKCksCi0gICAgICAgICh1aW50OF90KWkucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpLAotICAgICAgICBpLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzcygpLmRhdGEoKSwKLSAgICAgICAgKHVpbnQ4X3QpaS5teV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzc1R5cGUoKSwKLSAgICAgICAgaS5teV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzcygpLmRhdGEoKSk7Ci0KLSAgICBMT0dfSU5GTygiUGVyaXBoZXJhbCB3YWl0cyBmb3IgdGhlIE1jb25maXJtIik7Ci0gICAgYXV0byBtY29uZmlybV9wa3QgPSBXYWl0UGFpcmluZ0NvbmZpcm0oKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4obWNvbmZpcm1fcGt0KSkgewotICAgICAgcmV0dXJuIHN0ZDo6Z2V0PFBhaXJpbmdGYWlsdXJlPihtY29uZmlybV9wa3QpOwotICAgIH0KLSAgICBPY3RldDE2IG1jb25maXJtID0gc3RkOjpnZXQ8UGFpcmluZ0NvbmZpcm1WaWV3PihtY29uZmlybV9wa3QpLkdldENvbmZpcm1WYWx1ZSgpOwotCi0gICAgTE9HX0lORk8oIlBlcmlwaGVyYWwgc2VuZHMgU2NvbmZpcm0iKTsKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ0NvbmZpcm1CdWlsZGVyOjpDcmVhdGUoc2NvbmZpcm0pKTsKLQotICAgIExPR19JTkZPKCJQZXJpcGhlcmFsIHdhaXRzIGZvciBNcmFuZCIpOwotICAgIGF1dG8gcmFuZG9tX3BrdCA9IFdhaXRQYWlyaW5nUmFuZG9tKCk7Ci0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbV9wa3QpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbV9wa3QpOwotICAgIH0KLSAgICBtcmFuZCA9IHN0ZDo6Z2V0PFBhaXJpbmdSYW5kb21WaWV3PihyYW5kb21fcGt0KS5HZXRSYW5kb21WYWx1ZSgpOwotCi0gICAgT2N0ZXQxNiBtY29uZmlybV9nZW5lcmF0ZWQgPSBjcnlwdG9fdG9vbGJveDo6YzEoCi0gICAgICAgIHRrLAotICAgICAgICBtcmFuZCwKLSAgICAgICAgcHJlcS5kYXRhKCksCi0gICAgICAgIHByZXMuZGF0YSgpLAotICAgICAgICAodWludDhfdClpLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzc1R5cGUoKSwKLSAgICAgICAgaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCksCi0gICAgICAgICh1aW50OF90KWkubXlfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3NUeXBlKCksCi0gICAgICAgIGkubXlfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCkpOwotCi0gICAgaWYgKG1jb25maXJtICE9IG1jb25maXJtX2dlbmVyYXRlZCkgewotICAgICAgTE9HX0lORk8oIm1jb25maXJtIGRvZXMgbm90IG1hdGNoIGdlbmVyYXRlZCB2YWx1ZSIpOwotICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6Q09ORklSTV9WQUxVRV9GQUlMRUQpKTsKLSAgICAgIHJldHVybiBQYWlyaW5nRmFpbHVyZSgibWNvbmZpcm0gZG9lcyBub3QgbWF0Y2ggZ2VuZXJhdGVkIHZhbHVlIik7Ci0gICAgfQotCi0gICAgTE9HX0lORk8oIlBlcmlwaGVyYWwgc2VuZHMgU3JhbmQiKTsKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ1JhbmRvbUJ1aWxkZXI6OkNyZWF0ZShzcmFuZCkpOwotICB9Ci0KLSAgTE9HX0lORk8oIkxlZ2FjeSBzdGFnZSAyIGZpbmlzaCIpOwotCi0gIC8qIFNUSyAqLwotICByZXR1cm4gY3J5cHRvX3Rvb2xib3g6OnMxKHRrLCBtcmFuZCwgc3JhbmQpOwotfQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGVfc2VjdXJlX2Nvbm5lY3Rpb25zLmNjIGIvZ2Qvc2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlX3NlY3VyZV9jb25uZWN0aW9ucy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NzRjMy4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGVfc2VjdXJlX2Nvbm5lY3Rpb25zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGUuaCIKLQotI2luY2x1ZGUgIm9zL3JhbmQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi11c2luZyBibHVldG9vdGg6Om9zOjpHZW5lcmF0ZVJhbmRvbTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1zdGQ6OnZhcmlhbnQ8UGFpcmluZ0ZhaWx1cmUsIEtleUV4Y2hhbmdlUmVzdWx0PiBQYWlyaW5nSGFuZGxlckxlOjpFeGNoYW5nZVB1YmxpY0tleXMoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPb2JEYXRhRmxhZyByZW1vdGVfaGF2ZV9vb2JfZGF0YSkgewotICAvLyBHZW5lcmF0ZSBFQ0RILCBvciB1c2Ugb25lIHRoYXQgd2FzIHVzZWQgZm9yIE9PQiBkYXRhCi0gIGNvbnN0IGF1dG8gW3ByaXZhdGVfa2V5LCBwdWJsaWNfa2V5XSA9IChyZW1vdGVfaGF2ZV9vb2JfZGF0YSA9PSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQgfHwgIWkubXlfb29iX2RhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdlbmVyYXRlRUNESEtleVBhaXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGQ6Om1ha2VfcGFpcihpLm15X29vYl9kYXRhLT5wcml2YXRlX2tleSwgaS5teV9vb2JfZGF0YS0+cHVibGljX2tleSk7Ci0KLSAgTE9HX0lORk8oIlB1YmxpYyBrZXkgZXhjaGFuZ2Ugc3RhcnQiKTsKLSAgc3RkOjp1bmlxdWVfcHRyPFBhaXJpbmdQdWJsaWNLZXlCdWlsZGVyPiBteVB1YmxpY0tleSA9IFBhaXJpbmdQdWJsaWNLZXlCdWlsZGVyOjpDcmVhdGUocHVibGljX2tleS54LCBwdWJsaWNfa2V5LnkpOwotCi0gIGlmICghVmFsaWRhdGVFQ0RIUG9pbnQocHVibGljX2tleSkpIHsKLSAgICBMT0dfRVJST1IoIkNhbid0IHZhbGlkYXRlIG15IG93biBwdWJsaWMga2V5ISEhIik7Ci0gICAgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJDYW4ndCB2YWxpZGF0ZSBteSBvd24gcHVibGljIGtleSIpOwotICB9Ci0KLSAgaWYgKElBbUNlbnRyYWwoaSkpIHsKLSAgICAvLyBTZW5kIHBhaXJpbmcgcHVibGljIGtleQotICAgIExPR19JTkZPKCJDZW50cmFsIHNlbmRzIG91dCBwdWJsaWMga2V5Iik7Ci0gICAgU2VuZEwyY2FwUGFja2V0KGksIHN0ZDo6bW92ZShteVB1YmxpY0tleSkpOwotICB9Ci0KLSAgTE9HX0lORk8oIiBXYWl0aW5nIGZvciBQdWJsaWMga2V5Li4uIik7Ci0gIGF1dG8gcmVzcG9uc2UgPSBXYWl0UGFpcmluZ1B1YmxpY0tleSgpOwotICBMT0dfSU5GTygiIFJlY2VpdmVkIHB1YmxpYyBrZXkiKTsKLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHJlc3BvbnNlKSkgewotICAgIHJldHVybiBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4ocmVzcG9uc2UpOwotICB9Ci0KLSAgRWNkaFB1YmxpY0tleSByZW1vdGVfcHVibGljX2tleTsKLSAgYXV0byBwcGt2ID0gc3RkOjpnZXQ8UGFpcmluZ1B1YmxpY0tleVZpZXc+KHJlc3BvbnNlKTsKLSAgcmVtb3RlX3B1YmxpY19rZXkueCA9IHBwa3YuR2V0UHVibGljS2V5WCgpOwotICByZW1vdGVfcHVibGljX2tleS55ID0gcHBrdi5HZXRQdWJsaWNLZXlZKCk7Ci0gIExPR19JTkZPKCJSZWNlaXZlZCBQdWJsaWMga2V5IGZyb20gcmVtb3RlIik7Ci0KLSAgaWYgKHB1YmxpY19rZXkueCA9PSByZW1vdGVfcHVibGljX2tleS54KSB7Ci0gICAgTE9HX0lORk8oIlJlbW90ZSBhbmQgbG9jYWwgcHVibGljIGtleXMgY2FuJ3QgbWF0Y2giKTsKLSAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIlJlbW90ZSBhbmQgbG9jYWwgcHVibGljIGtleXMgbWF0Y2giKTsKLSAgfQotCi0gIC8vIHZhbGlkYXRlIHJlY2VpdmVkIHB1YmxpYyBrZXkKLSAgaWYgKCFWYWxpZGF0ZUVDREhQb2ludChyZW1vdGVfcHVibGljX2tleSkpIHsKLSAgICAvLyBUT0RPOiBTcGVjIGlzIHVuY2xlYXIgd2hhdCBzaG91bGQgaGFwcGVuZCB3aGVuIHRoZSBwb2ludCBpcyBub3Qgb24KLSAgICAvLyB0aGUgY29ycmVjdCBjdXJ2ZTogQSBkZXZpY2UgdGhhdCBkZXRlY3RzIGFuIGludmFsaWQgcHVibGljIGtleSBmcm9tCi0gICAgLy8gdGhlIHBlZXIgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgTEUgU2VjdXJlIENvbm5lY3Rpb25zIHBhaXJpbmcKLSAgICAvLyBwcm9jZXNzIHNoYWxsIG5vdCB1c2UgdGhlIHJlc3VsdGluZyBMVEssIGlmIGFueS4KLSAgICBMT0dfSU5GTygiQ2FuJ3QgdmFsaWRhdGUgcmVtb3RlIHB1YmxpYyBrZXkiKTsKLSAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkNhbid0IHZhbGlkYXRlIHJlbW90ZSBwdWJsaWMga2V5Iik7Ci0gIH0KLQotICBpZiAoIUlBbUNlbnRyYWwoaSkpIHsKLSAgICBMT0dfSU5GTygiUGVyaXBoZXJhbCBzZW5kcyBvdXQgcHVibGljIGtleSIpOwotICAgIC8vIFNlbmQgcGFpcmluZyBwdWJsaWMga2V5Ci0gICAgU2VuZEwyY2FwUGFja2V0KGksIHN0ZDo6bW92ZShteVB1YmxpY0tleSkpOwotICB9Ci0KLSAgTE9HX0lORk8oIlB1YmxpYyBrZXkgZXhjaGFuZ2UgZmluaXNoIik7Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCAzMj4gZGhrZXkgPSBDb21wdXRlREhLZXkocHJpdmF0ZV9rZXksIHJlbW90ZV9wdWJsaWNfa2V5KTsKLQotICBjb25zdCBFY2RoUHVibGljS2V5JiBQS2EgPSBJQW1DZW50cmFsKGkpID8gcHVibGljX2tleSA6IHJlbW90ZV9wdWJsaWNfa2V5OwotICBjb25zdCBFY2RoUHVibGljS2V5JiBQS2IgPSBJQW1DZW50cmFsKGkpID8gcmVtb3RlX3B1YmxpY19rZXkgOiBwdWJsaWNfa2V5OwotCi0gIHJldHVybiBLZXlFeGNoYW5nZVJlc3VsdHtQS2EsIFBLYiwgZGhrZXl9OwotfQotCi1TdGFnZTFSZXN1bHRPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6RG9TZWN1cmVDb25uZWN0aW9uc1N0YWdlMShjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWNkaFB1YmxpY0tleSYgUEthLCBjb25zdCBFY2RoUHVibGljS2V5JiBQS2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWlyaW5nUmVxdWVzdFZpZXcmIHBhaXJpbmdfcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhaXJpbmdSZXNwb25zZVZpZXcmIHBhaXJpbmdfcmVzcG9uc2UpIHsKLSAgaWYgKCgocGFpcmluZ19yZXF1ZXN0LkdldEF1dGhSZXEoKSAmIEF1dGhSZXFNYXNrTWl0bSkgPT0gMCkgJiYKLSAgICAgICgocGFpcmluZ19yZXNwb25zZS5HZXRBdXRoUmVxKCkgJiBBdXRoUmVxTWFza01pdG0pID09IDApKSB7Ci0gICAgLy8gSWYgYm90aCBkZXZpY2VzIGhhdmUgbm90IHNldCBNSVRNIG9wdGlvbiwgSnVzdCBXb3JrcyBzaGFsbCBiZSB1c2VkCi0gICAgcmV0dXJuIFNlY3VyZUNvbm5lY3Rpb25zSnVzdFdvcmtzKGksIFBLYSwgUEtiKTsKLSAgfQotCi0gIGlmIChwYWlyaW5nX3JlcXVlc3QuR2V0T29iRGF0YUZsYWcoKSA9PSBPb2JEYXRhRmxhZzo6UFJFU0VOVCB8fAotICAgICAgcGFpcmluZ19yZXNwb25zZS5HZXRPb2JEYXRhRmxhZygpID09IE9vYkRhdGFGbGFnOjpQUkVTRU5UKSB7Ci0gICAgT29iRGF0YUZsYWcgcmVtb3RlX29vYl9mbGFnID0gSUFtQ2VudHJhbChpKSA/IHBhaXJpbmdfcmVzcG9uc2UuR2V0T29iRGF0YUZsYWcoKSA6IHBhaXJpbmdfcmVxdWVzdC5HZXRPb2JEYXRhRmxhZygpOwotICAgIE9vYkRhdGFGbGFnIG15X29vYl9mbGFnID0gSUFtQ2VudHJhbChpKSA/IHBhaXJpbmdfcmVxdWVzdC5HZXRPb2JEYXRhRmxhZygpIDogcGFpcmluZ19yZXNwb25zZS5HZXRPb2JEYXRhRmxhZygpOwotICAgIHJldHVybiBTZWN1cmVDb25uZWN0aW9uc091dE9mQmFuZChpLCBQS2EsIFBLYiwgbXlfb29iX2ZsYWcsIHJlbW90ZV9vb2JfZmxhZyk7Ci0gIH0KLQotICBjb25zdCBhdXRvJiBpb20gPSBwYWlyaW5nX3JlcXVlc3QuR2V0SW9DYXBhYmlsaXR5KCk7Ci0gIGNvbnN0IGF1dG8mIGlvcyA9IHBhaXJpbmdfcmVzcG9uc2UuR2V0SW9DYXBhYmlsaXR5KCk7Ci0KLSAgaWYgKChpb20gPT0gSW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9ESVNQTEFZIHx8IGlvbSA9PSBJb0NhcGFiaWxpdHk6OkRJU1BMQVlfWUVTX05PKSAmJgotICAgICAgKGlvcyA9PSBJb0NhcGFiaWxpdHk6OktFWUJPQVJEX0RJU1BMQVkgfHwgaW9zID09IElvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk8pKSB7Ci0gICAgcmV0dXJuIFNlY3VyZUNvbm5lY3Rpb25zTnVtZXJpY0NvbXBhcmlzb24oaSwgUEthLCBQS2IpOwotICB9Ci0KLSAgaWYgKGlvbSA9PSBJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCB8fCBpb3MgPT0gSW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQpIHsKLSAgICByZXR1cm4gU2VjdXJlQ29ubmVjdGlvbnNKdXN0V29ya3MoaSwgUEthLCBQS2IpOwotICB9Ci0KLSAgaWYgKChpb20gPT0gSW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFkgfHwgaW9tID09IElvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk8pICYmCi0gICAgICAoaW9zID09IElvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZIHx8IGlvcyA9PSBJb0NhcGFiaWxpdHk6OkRJU1BMQVlfWUVTX05PKSkgewotICAgIHJldHVybiBTZWN1cmVDb25uZWN0aW9uc0p1c3RXb3JrcyhpLCBQS2EsIFBLYik7Ci0gIH0KLQotICBJb0NhcGFiaWxpdHkgbXlfaW9jYXBzID0gSUFtQ2VudHJhbChpKSA/IGlvbSA6IGlvczsKLSAgSW9DYXBhYmlsaXR5IHJlbW90ZV9pb2NhcHMgPSBJQW1DZW50cmFsKGkpID8gaW9zIDogaW9tOwotICByZXR1cm4gU2VjdXJlQ29ubmVjdGlvbnNQYXNza2V5RW50cnkoaSwgUEthLCBQS2IsIG15X2lvY2FwcywgcmVtb3RlX2lvY2Fwcyk7Ci19Ci0KLVN0YWdlMlJlc3VsdE9yRmFpbHVyZSBQYWlyaW5nSGFuZGxlckxlOjpEb1NlY3VyZUNvbm5lY3Rpb25zU3RhZ2UyKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFY2RoUHVibGljS2V5JiBQS2EsIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBLYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhaXJpbmdSZXF1ZXN0VmlldyYgcGFpcmluZ19yZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFpcmluZ1Jlc3BvbnNlVmlldyYgcGFpcmluZ19yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YWdlMVJlc3VsdCBzdGFnZTFyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiYgZGhrZXkpIHsKLSAgTE9HX0lORk8oIkF1dGhlbnRpY2F0aW9uIHN0YWdlIDIgc3RhcnRlZCIpOwotCi0gIGF1dG8gW05hLCBOYiwgcmEsIHJiXSA9IHN0YWdlMXJlc3VsdDsKLQotICAvLyAyLjMuNS42LjUgQXV0aGVudGljYXRpb24gc3RhZ2UgMiBsb25nIHRlcm0ga2V5IGNhbGN1bGF0aW9uCi0gIHVpbnQ4X3QgYVs3XTsKLSAgdWludDhfdCBiWzddOwotCi0gIGlmIChJQW1DZW50cmFsKGkpKSB7Ci0gICAgbWVtY3B5KGEsIGkubXlfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCksIGhjaTo6QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgYVs2XSA9ICh1aW50OF90KWkubXlfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3NUeXBlKCk7Ci0gICAgbWVtY3B5KGIsIGkucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzKCkuZGF0YSgpLCBoY2k6OkFkZHJlc3M6OmtMZW5ndGgpOwotICAgIGJbNl0gPSAodWludDhfdClpLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzc1R5cGUoKTsKLSAgfSBlbHNlIHsKLSAgICBtZW1jcHkoYSwgaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCksIGhjaTo6QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgYVs2XSA9ICh1aW50OF90KWkucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpOwotICAgIG1lbWNweShiLCBpLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzKCkuZGF0YSgpLCBoY2k6OkFkZHJlc3M6OmtMZW5ndGgpOwotICAgIGJbNl0gPSAodWludDhfdClpLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpOwotICB9Ci0KLSAgT2N0ZXQxNiBsdGssIG1hY19rZXk7Ci0gIGNyeXB0b190b29sYm94OjpmNSgodWludDhfdCopZGhrZXkuZGF0YSgpLCBOYSwgTmIsIGEsIGIsICZtYWNfa2V5LCAmbHRrKTsKLQotICAvLyBESEtleSBleGNoYW5nZSBhbmQgY2hlY2sKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGlvY2FwQXtzdGF0aWNfY2FzdDx1aW50OF90PihwYWlyaW5nX3JlcXVlc3QuR2V0SW9DYXBhYmlsaXR5KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihwYWlyaW5nX3JlcXVlc3QuR2V0T29iRGF0YUZsYWcoKSksIHBhaXJpbmdfcmVxdWVzdC5HZXRBdXRoUmVxKCl9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGlvY2FwQntzdGF0aWNfY2FzdDx1aW50OF90PihwYWlyaW5nX3Jlc3BvbnNlLkdldElvQ2FwYWJpbGl0eSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFpcmluZ19yZXNwb25zZS5HZXRPb2JEYXRhRmxhZygpKSwgcGFpcmluZ19yZXNwb25zZS5HZXRBdXRoUmVxKCl9OwotCi0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgTFRLID0gIiA8PCBiYXNlOjpIZXhFbmNvZGUobHRrLmRhdGEoKSwgbHRrLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgTUFDX0tFWSA9ICIgPDwgYmFzZTo6SGV4RW5jb2RlKG1hY19rZXkuZGF0YSgpLCBtYWNfa2V5LnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgTmEgPSAiIDw8IGJhc2U6OkhleEVuY29kZShOYS5kYXRhKCksIE5hLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgTmIgPSAiIDw8IGJhc2U6OkhleEVuY29kZShOYi5kYXRhKCksIE5iLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgcmEgPSAiIDw8IGJhc2U6OkhleEVuY29kZShyYS5kYXRhKCksIHJhLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgcmIgPSAiIDw8IGJhc2U6OkhleEVuY29kZShyYi5kYXRhKCksIHJiLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgaW9jYXBBID0gIiA8PCBiYXNlOjpIZXhFbmNvZGUoaW9jYXBBLmRhdGEoKSwgaW9jYXBBLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgaW9jYXBCID0gIiA8PCBiYXNlOjpIZXhFbmNvZGUoaW9jYXBCLmRhdGEoKSwgaW9jYXBCLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCArKElBbUNlbnRyYWwoaSkpIDw8ICIgYSA9ICIgPDwgYmFzZTo6SGV4RW5jb2RlKGEsIDcpOwotICAvLyBMT0coSU5GTykgPDwgKyhJQW1DZW50cmFsKGkpKSA8PCAiIGIgPSAiIDw8IGJhc2U6OkhleEVuY29kZShiLCA3KTsKLQotICBPY3RldDE2IEVhID0gY3J5cHRvX3Rvb2xib3g6OmY2KG1hY19rZXksIE5hLCBOYiwgcmIsIGlvY2FwQS5kYXRhKCksIGEsIGIpOwotCi0gIE9jdGV0MTYgRWIgPSBjcnlwdG9fdG9vbGJveDo6ZjYobWFjX2tleSwgTmIsIE5hLCByYSwgaW9jYXBCLmRhdGEoKSwgYiwgYSk7Ci0KLSAgaWYgKElBbUNlbnRyYWwoaSkpIHsKLSAgICAvLyBzZW5kIFBhaXJpbmcgREhLZXkgQ2hlY2sKLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ0RoS2V5Q2hlY2tCdWlsZGVyOjpDcmVhdGUoRWEpKTsKLQotICAgIGF1dG8gcmVzcG9uc2UgPSBXYWl0UGFpcmluZ0RIS2V5Q2hlY2soKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocmVzcG9uc2UpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RkOjpnZXQ8UGFpcmluZ0RoS2V5Q2hlY2tWaWV3PihyZXNwb25zZSkuR2V0RGhLZXlDaGVjaygpICE9IEViKSB7Ci0gICAgICBMT0dfSU5GTygiRWEgIT0gRWIsIGFib3J0aW5nISIpOwotICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6REhLRVlfQ0hFQ0tfRkFJTEVEKSk7Ci0gICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkVhICE9IEViIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGF1dG8gcmVzcG9uc2UgPSBXYWl0UGFpcmluZ0RIS2V5Q2hlY2soKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocmVzcG9uc2UpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RkOjpnZXQ8UGFpcmluZ0RoS2V5Q2hlY2tWaWV3PihyZXNwb25zZSkuR2V0RGhLZXlDaGVjaygpICE9IEVhKSB7Ci0gICAgICBMT0dfSU5GTygiRWEgIT0gRWIsIGFib3J0aW5nISIpOwotICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6REhLRVlfQ0hFQ0tfRkFJTEVEKSk7Ci0gICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkVhICE9IEViIik7Ci0gICAgfQotCi0gICAgLy8gc2VuZCBQYWlyaW5nIERIS2V5IENoZWNrCi0gICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdEaEtleUNoZWNrQnVpbGRlcjo6Q3JlYXRlKEViKSk7Ci0gIH0KLQotICBMT0dfSU5GTygiQXV0aGVudGljYXRpb24gc3RhZ2UgMiAoREhLZXkgY2hlY2tzKSBmaW5pc2hlZCIpOwotICByZXR1cm4gbHRrOwotfQotCi1TdGFnZTFSZXN1bHRPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6U2VjdXJlQ29ubmVjdGlvbnNPdXRPZkJhbmQoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFY2RoUHVibGljS2V5JiBQa2EsIGNvbnN0IEVjZGhQdWJsaWNLZXkmIFBrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPb2JEYXRhRmxhZyBteV9vb2JfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPb2JEYXRhRmxhZyByZW1vdGVfb29iX2ZsYWcpIHsKLSAgTE9HX0lORk8oIk91dCBPZiBCYW5kIHN0YXJ0Iik7Ci0KLSAgT2N0ZXQxNiB6ZXJvc3swfTsKLSAgT2N0ZXQxNiBsb2NhbFIgPSAocmVtb3RlX29vYl9mbGFnID09IE9vYkRhdGFGbGFnOjpQUkVTRU5UICYmIGkubXlfb29iX2RhdGEpID8gaS5teV9vb2JfZGF0YS0+ciA6IHplcm9zOwotICBPY3RldDE2IHJlbW90ZVI7Ci0KLSAgaWYgKG15X29vYl9mbGFnID09IE9vYkRhdGFGbGFnOjpOT1RfUFJFU0VOVCB8fCAobXlfb29iX2ZsYWcgPT0gT29iRGF0YUZsYWc6OlBSRVNFTlQgJiYgIWkucmVtb3RlX29vYl9kYXRhKSkgewotICAgIC8qIHdlIGhhdmUgc2VuZCB0aGUgT09CIGRhdGEsIGJ1dCBub3QgcmVjZWl2ZWQgdGhlbS4gcmVtb3RlIHdpbGwgY2hlY2sgaWYKLSAgICAgKiBDIHZhbHVlIGlzIGNvcnJlY3QgKi8KLSAgICByZW1vdGVSID0gemVyb3M7Ci0gIH0gZWxzZSB7Ci0gICAgcmVtb3RlUiA9IGkucmVtb3RlX29vYl9kYXRhLT5sZV9zY19yOwotICAgIE9jdGV0MTYgcmVtb3RlQyA9IGkucmVtb3RlX29vYl9kYXRhLT5sZV9zY19jOwotCi0gICAgT2N0ZXQxNiByZW1vdGVDMjsKLSAgICBpZiAoSUFtQ2VudHJhbChpKSkgewotICAgICAgcmVtb3RlQzIgPSBjcnlwdG9fdG9vbGJveDo6ZjQoKHVpbnQ4X3QqKVBrYi54LmRhdGEoKSwgKHVpbnQ4X3QqKVBrYi54LmRhdGEoKSwgcmVtb3RlUiwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlbW90ZUMyID0gY3J5cHRvX3Rvb2xib3g6OmY0KCh1aW50OF90KilQa2EueC5kYXRhKCksICh1aW50OF90KilQa2EueC5kYXRhKCksIHJlbW90ZVIsIDApOwotICAgIH0KLQotICAgIGlmIChyZW1vdGVDMiAhPSByZW1vdGVDKSB7Ci0gICAgICBMT0dfRVJST1IoIkNfY29tcHV0ZWQgIT0gQ19mcm9tX3JlbW90ZSwgYWJvcnRpbmchIik7Ci0gICAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkNfY29tcHV0ZWQgIT0gQ19mcm9tX3JlbW90ZSwgYWJvcnRpbmciKTsKLSAgICB9Ci0gIH0KLQotICBPY3RldDE2IE5hLCBOYiwgcmEsIHJiOwotICBpZiAoSUFtQ2VudHJhbChpKSkgewotICAgIHJhID0gbG9jYWxSOwotICAgIHJiID0gcmVtb3RlUjsKLSAgICBOYSA9IEdlbmVyYXRlUmFuZG9tPDE2PigpOwotICAgIC8vIFNlbmQgUGFpcmluZyBSYW5kb20KLSAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ1JhbmRvbUJ1aWxkZXI6OkNyZWF0ZShOYSkpOwotCi0gICAgTE9HX0lORk8oIkNlbnRyYWwgd2FpdHMgZm9yIE5iIik7Ci0gICAgYXV0byByYW5kb20gPSBXYWl0UGFpcmluZ1JhbmRvbSgpOwotICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihyYW5kb20pKSB7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbSk7Ci0gICAgfQotICAgIE5iID0gc3RkOjpnZXQ8UGFpcmluZ1JhbmRvbVZpZXc+KHJhbmRvbSkuR2V0UmFuZG9tVmFsdWUoKTsKLSAgfSBlbHNlIHsKLSAgICByYSA9IHJlbW90ZVI7Ci0gICAgcmIgPSBsb2NhbFI7Ci0gICAgTmIgPSBHZW5lcmF0ZVJhbmRvbTwxNj4oKTsKLQotICAgIExPR19JTkZPKCJQZXJpcGhlcmFsIHdhaXRzIGZvciByYW5kb20iKTsKLSAgICBhdXRvIHJhbmRvbSA9IFdhaXRQYWlyaW5nUmFuZG9tKCk7Ci0gICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbSkpIHsKLSAgICAgIHJldHVybiBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4ocmFuZG9tKTsKLSAgICB9Ci0gICAgTmEgPSBzdGQ6OmdldDxQYWlyaW5nUmFuZG9tVmlldz4ocmFuZG9tKS5HZXRSYW5kb21WYWx1ZSgpOwotCi0gICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdSYW5kb21CdWlsZGVyOjpDcmVhdGUoTmIpKTsKLSAgfQotCi0gIHJldHVybiBTdGFnZTFSZXN1bHR7TmEsIE5iLCByYSwgcmJ9OwotfQotCi1TdGFnZTFSZXN1bHRPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6U2VjdXJlQ29ubmVjdGlvbnNQYXNza2V5RW50cnkoY29uc3QgSW5pdGlhbEluZm9ybWF0aW9ucyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFY2RoUHVibGljS2V5JiBQS2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWNkaFB1YmxpY0tleSYgUEtiLCBJb0NhcGFiaWxpdHkgbXlfaW9jYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElvQ2FwYWJpbGl0eSByZW1vdGVfaW9jYXBzKSB7Ci0gIExPR19JTkZPKCJQYXNza2V5IEVudHJ5IHN0YXJ0Iik7Ci0gIE9jdGV0MTYgTmEsIE5iLCByYXswfSwgcmJ7MH07Ci0KLSAgdWludDMyX3QgcGFzc2tleTsKLQotICBpZiAobXlfaW9jYXBzID09IElvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZIHx8IHJlbW90ZV9pb2NhcHMgPT0gSW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9PTkxZKSB7Ci0gICAgLy8gSSBkaXNwbGF5Ci0gICAgcGFzc2tleSA9IEdlbmVyYXRlUmFuZG9tKCk7Ci0gICAgcGFzc2tleSAmPSAweDBmZmZmZjsgLyogbWF4aW11bSAyMCBzaWduaWZpY2FudCBieXRlcyAqLwotICAgIGNvbnN0ZXhwciB1aW50MzJfdCBQQVNTS0VZX01BWCA9IDk5OTk5OTsKLSAgICB3aGlsZSAocGFzc2tleSA+IFBBU1NLRVlfTUFYKSBwYXNza2V5ID4+PSAxOwotCi0gICAgQ29uZmlybWF0aW9uRGF0YSBkYXRhKGkucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcywgaS5yZW1vdGVfbmFtZSwgcGFzc2tleSk7Ci0gICAgaS51c2VyX2ludGVyZmFjZV9oYW5kbGVyLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJlVJOjpEaXNwbGF5UGFzc2tleSwgY29tbW9uOjpVbnJldGFpbmVkKGkudXNlcl9pbnRlcmZhY2UpLCBkYXRhKSk7Ci0KLSAgfSBlbHNlIGlmIChteV9pb2NhcHMgPT0gSW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9PTkxZIHx8IHJlbW90ZV9pb2NhcHMgPT0gSW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFkpIHsKLSAgICBDb25maXJtYXRpb25EYXRhIGRhdGEoaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLCBpLnJlbW90ZV9uYW1lKTsKLSAgICBpLnVzZXJfaW50ZXJmYWNlX2hhbmRsZXItPlBvc3QoCi0gICAgICAgIGNvbW1vbjo6QmluZE9uY2UoJlVJOjpEaXNwbGF5RW50ZXJQYXNza2V5RGlhbG9nLCBjb21tb246OlVucmV0YWluZWQoaS51c2VyX2ludGVyZmFjZSksIGRhdGEpKTsKLSAgICBzdGQ6Om9wdGlvbmFsPFBhaXJpbmdFdmVudD4gcmVzcG9uc2UgPSBXYWl0VWlQYXNza2V5KCk7Ci0gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJQYXNza2V5IGRpZCBub3QgYXJyaXZlISIpOwotCi0gICAgcGFzc2tleSA9IHJlc3BvbnNlLT51aV92YWx1ZTsKLQotICAgIC8qVE9ETzogc2hhbGwgd2Ugc2VuZCAiS2V5cHJlc3MgTm90aWZpY2F0aW9uIiBhZnRlciBlYWNoIGtleSA/IFRoaXMgd291bGQKLSAgICAgKiBoYXZlIGltcGFjdCBvbiB0aGUgU01QIHRpbWVvdXQqLwotCi0gIH0gZWxzZSB7Ci0gICAgTE9HKEZBVEFMKSA8PCAiVEhJUyBTSE9VTEQgTkVWRVIgSEFQUEVOIjsKLSAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIkZBVEFMISIpOwotICB9Ci0KLSAgdWludDMyX3QgYml0bWFzayA9IDB4MDE7Ci0gIGZvciAoaW50IGxvb3AgPSAwOyBsb29wIDwgMjA7IGxvb3ArKywgYml0bWFzayA8PD0gMSkgewotICAgIExPR19JTkZPKCJJdGVyYXRpb24gbm8gJWQiLCBsb29wKTsKLSAgICBib29sIGJpdF9zZXQgPSAoKGJpdG1hc2sgJiBwYXNza2V5KSAhPSAwKTsKLSAgICB1aW50OF90IHJpID0gYml0X3NldCA/IDB4ODEgOiAweDgwOwotCi0gICAgT2N0ZXQxNiBDYWksIENiaSwgTmFpLCBOYmk7Ci0gICAgaWYgKElBbUNlbnRyYWwoaSkpIHsKLSAgICAgIE5haSA9IEdlbmVyYXRlUmFuZG9tPDE2PigpOwotCi0gICAgICBDYWkgPSBjcnlwdG9fdG9vbGJveDo6ZjQoKHVpbnQ4X3QqKVBLYS54LmRhdGEoKSwgKHVpbnQ4X3QqKVBLYi54LmRhdGEoKSwgTmFpLCByaSk7Ci0KLSAgICAgIC8vIFNlbmQgUGFpcmluZyBDb25maXJtCi0gICAgICBMT0dfSU5GTygiQ2VudHJhbCBzZW5kcyBDYWkiKTsKLSAgICAgIFNlbmRMMmNhcFBhY2tldChpLCBQYWlyaW5nQ29uZmlybUJ1aWxkZXI6OkNyZWF0ZShDYWkpKTsKLQotICAgICAgTE9HX0lORk8oIkNlbnRyYWwgd2FpdHMgZm9yIHRoZSBDYmkiKTsKLSAgICAgIGF1dG8gY29uZmlybSA9IFdhaXRQYWlyaW5nQ29uZmlybSgpOwotICAgICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KGNvbmZpcm0pKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4oY29uZmlybSk7Ci0gICAgICB9Ci0gICAgICBDYmkgPSBzdGQ6OmdldDxQYWlyaW5nQ29uZmlybVZpZXc+KGNvbmZpcm0pLkdldENvbmZpcm1WYWx1ZSgpOwotCi0gICAgICAvLyBTZW5kIFBhaXJpbmcgUmFuZG9tCi0gICAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ1JhbmRvbUJ1aWxkZXI6OkNyZWF0ZShOYWkpKTsKLQotICAgICAgTE9HX0lORk8oIkNlbnRyYWwgd2FpdHMgZm9yIE5iaSIpOwotICAgICAgYXV0byByYW5kb20gPSBXYWl0UGFpcmluZ1JhbmRvbSgpOwotICAgICAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbSkpIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6Z2V0PFBhaXJpbmdGYWlsdXJlPihyYW5kb20pOwotICAgICAgfQotICAgICAgTmJpID0gc3RkOjpnZXQ8UGFpcmluZ1JhbmRvbVZpZXc+KHJhbmRvbSkuR2V0UmFuZG9tVmFsdWUoKTsKLQotICAgICAgT2N0ZXQxNiBDYmkyID0gY3J5cHRvX3Rvb2xib3g6OmY0KCh1aW50OF90KilQS2IueC5kYXRhKCksICh1aW50OF90KilQS2EueC5kYXRhKCksIE5iaSwgcmkpOwotICAgICAgaWYgKENiaSAhPSBDYmkyKSB7Ci0gICAgICAgIExPR19JTkZPKCJDYWkgIT0gQ2JpLCBhYm9ydGluZyEiKTsKLSAgICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6Q09ORklSTV9WQUxVRV9GQUlMRUQpKTsKLSAgICAgICAgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJDYWkgIT0gQ2JpIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIE5iaSA9IEdlbmVyYXRlUmFuZG9tPDE2PigpOwotICAgICAgLy8gQ29tcHV0ZSBjb25maXJtCi0gICAgICBDYmkgPSBjcnlwdG9fdG9vbGJveDo6ZjQoKHVpbnQ4X3QqKVBLYi54LmRhdGEoKSwgKHVpbnQ4X3QqKVBLYS54LmRhdGEoKSwgTmJpLCByaSk7Ci0KLSAgICAgIExPR19JTkZPKCJQZXJpcGhlcmFsIHdhaXRzIGZvciB0aGUgQ2FpIik7Ci0gICAgICBhdXRvIGNvbmZpcm0gPSBXYWl0UGFpcmluZ0NvbmZpcm0oKTsKLSAgICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihjb25maXJtKSkgewotICAgICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KGNvbmZpcm0pOwotICAgICAgfQotICAgICAgQ2FpID0gc3RkOjpnZXQ8UGFpcmluZ0NvbmZpcm1WaWV3Pihjb25maXJtKS5HZXRDb25maXJtVmFsdWUoKTsKLQotICAgICAgLy8gU2VuZCBQYWlyaW5nIENvbmZpcm0KLSAgICAgIExPR19JTkZPKCJQZXJpcGhlcmFsIHNlbmRzIGNvbmZpcm1hdGlvbiIpOwotICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdDb25maXJtQnVpbGRlcjo6Q3JlYXRlKENiaSkpOwotCi0gICAgICBMT0dfSU5GTygiUGVyaXBoZXJhbCB3YWl0cyBmb3IgcmFuZG9tIik7Ci0gICAgICBhdXRvIHJhbmRvbSA9IFdhaXRQYWlyaW5nUmFuZG9tKCk7Ci0gICAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocmFuZG9tKSkgewotICAgICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbSk7Ci0gICAgICB9Ci0gICAgICBOYWkgPSBzdGQ6OmdldDxQYWlyaW5nUmFuZG9tVmlldz4ocmFuZG9tKS5HZXRSYW5kb21WYWx1ZSgpOwotCi0gICAgICBPY3RldDE2IENhaTIgPSBjcnlwdG9fdG9vbGJveDo6ZjQoKHVpbnQ4X3QqKVBLYS54LmRhdGEoKSwgKHVpbnQ4X3QqKVBLYi54LmRhdGEoKSwgTmFpLCByaSk7Ci0gICAgICBpZiAoQ2FpICE9IENhaTIpIHsKLSAgICAgICAgTE9HX0lORk8oIkNhaSAhPSBDYWkyLCBhYm9ydGluZyEiKTsKLSAgICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6Q09ORklSTV9WQUxVRV9GQUlMRUQpKTsKLSAgICAgICAgcmV0dXJuIFBhaXJpbmdGYWlsdXJlKCJDYWkgIT0gQ2FpMiIpOwotICAgICAgfQotCi0gICAgICAvLyBTZW5kIFBhaXJpbmcgUmFuZG9tCi0gICAgICBTZW5kTDJjYXBQYWNrZXQoaSwgUGFpcmluZ1JhbmRvbUJ1aWxkZXI6OkNyZWF0ZShOYmkpKTsKLSAgICB9Ci0KLSAgICBpZiAobG9vcCA9PSAxOSkgewotICAgICAgTmEgPSBOYWk7Ci0gICAgICBOYiA9IE5iaTsKLSAgICB9Ci0gIH0KLQotICByYVswXSA9ICh1aW50OF90KShwYXNza2V5KTsKLSAgcmFbMV0gPSAodWludDhfdCkocGFzc2tleSA+PiA4KTsKLSAgcmFbMl0gPSAodWludDhfdCkocGFzc2tleSA+PiAxNik7Ci0gIHJhWzNdID0gKHVpbnQ4X3QpKHBhc3NrZXkgPj4gMjQpOwotICByYiA9IHJhOwotCi0gIHJldHVybiBTdGFnZTFSZXN1bHR7TmEsIE5iLCByYSwgcmJ9OwotfQotCi1TdGFnZTFSZXN1bHRPckZhaWx1cmUgUGFpcmluZ0hhbmRsZXJMZTo6U2VjdXJlQ29ubmVjdGlvbnNOdW1lcmljQ29tcGFyaXNvbihjb25zdCBJbml0aWFsSW5mb3JtYXRpb25zJiBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWNkaFB1YmxpY0tleSYgUEthLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWNkaFB1YmxpY0tleSYgUEtiKSB7Ci0gIExPR19JTkZPKCJOdW1lcmljIENvbXBhcmlzb24gc3RhcnQiKTsKLSAgU3RhZ2UxUmVzdWx0T3JGYWlsdXJlIHJlc3VsdCA9IFNlY3VyZUNvbm5lY3Rpb25zSnVzdFdvcmtzKGksIFBLYSwgUEtiKTsKLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ0ZhaWx1cmU+KHJlc3VsdCkpIHsKLSAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJlc3VsdCk7Ci0gIH0KLQotICBjb25zdCBhdXRvIFtOYSwgTmIsIHJhLCByYl0gPSBzdGQ6OmdldDxTdGFnZTFSZXN1bHQ+KHJlc3VsdCk7Ci0KLSAgdWludDMyX3QgbnVtYmVyX3RvX2Rpc3BsYXkgPSBjcnlwdG9fdG9vbGJveDo6ZzIoKHVpbnQ4X3QqKVBLYS54LmRhdGEoKSwgKHVpbnQ4X3QqKVBLYi54LmRhdGEoKSwgTmEsIE5iKTsKLQotICBDb25maXJtYXRpb25EYXRhIGRhdGEoaS5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLCBpLnJlbW90ZV9uYW1lLCBudW1iZXJfdG9fZGlzcGxheSk7Ci0gIGkudXNlcl9pbnRlcmZhY2VfaGFuZGxlci0+UG9zdCgKLSAgICAgIGNvbW1vbjo6QmluZE9uY2UoJlVJOjpEaXNwbGF5Q29uZmlybVZhbHVlLCBjb21tb246OlVucmV0YWluZWQoaS51c2VyX2ludGVyZmFjZSksIGRhdGEpKTsKLQotICBzdGQ6Om9wdGlvbmFsPFBhaXJpbmdFdmVudD4gY29uZmlybXllc25vID0gV2FpdFVpQ29uZmlybVllc05vKCk7Ci0gIGlmICghY29uZmlybXllc25vIHx8IGNvbmZpcm15ZXNuby0+dWlfdmFsdWUgPT0gMCkgewotICAgIExPR19JTkZPKCJXYXMgZXhwZWN0aW5nIHRoZSB1c2VyIHZhbHVlIGNvbmZpcm0iKTsKLSAgICByZXR1cm4gUGFpcmluZ0ZhaWx1cmUoIldhcyBleHBlY3RpbmcgdGhlIHVzZXIgdmFsdWUgY29uZmlybSIpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3RhZ2UxUmVzdWx0T3JGYWlsdXJlIFBhaXJpbmdIYW5kbGVyTGU6OlNlY3VyZUNvbm5lY3Rpb25zSnVzdFdvcmtzKGNvbnN0IEluaXRpYWxJbmZvcm1hdGlvbnMmIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWNkaFB1YmxpY0tleSYgUEthLCBjb25zdCBFY2RoUHVibGljS2V5JiBQS2IpIHsKLSAgT2N0ZXQxNiBDYiwgTmEsIE5iLCByYSwgcmI7Ci0KLSAgcmEgPSByYiA9IHswfTsKLQotICBpZiAoSUFtQ2VudHJhbChpKSkgewotICAgIE5hID0gR2VuZXJhdGVSYW5kb208MTY+KCk7Ci0gICAgTE9HX0lORk8oIkNlbnRyYWwgd2FpdHMgZm9yIGNvbmZpcm1hdGlvbiIpOwotICAgIGF1dG8gY29uZmlybSA9IFdhaXRQYWlyaW5nQ29uZmlybSgpOwotICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihjb25maXJtKSkgewotICAgICAgcmV0dXJuIHN0ZDo6Z2V0PFBhaXJpbmdGYWlsdXJlPihjb25maXJtKTsKLSAgICB9Ci0gICAgQ2IgPSBzdGQ6OmdldDxQYWlyaW5nQ29uZmlybVZpZXc+KGNvbmZpcm0pLkdldENvbmZpcm1WYWx1ZSgpOwotCi0gICAgLy8gU2VuZCBQYWlyaW5nIFJhbmRvbQotICAgIFNlbmRMMmNhcFBhY2tldChpLCBQYWlyaW5nUmFuZG9tQnVpbGRlcjo6Q3JlYXRlKE5hKSk7Ci0KLSAgICBMT0dfSU5GTygiQ2VudHJhbCB3YWl0cyBmb3IgUmFuZG9tIik7Ci0gICAgYXV0byByYW5kb20gPSBXYWl0UGFpcmluZ1JhbmRvbSgpOwotICAgIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdGYWlsdXJlPihyYW5kb20pKSB7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHJhbmRvbSk7Ci0gICAgfQotICAgIE5iID0gc3RkOjpnZXQ8UGFpcmluZ1JhbmRvbVZpZXc+KHJhbmRvbSkuR2V0UmFuZG9tVmFsdWUoKTsKLQotICAgIC8vIENvbXB1dGUgQ2IgbG9jYWxseQotICAgIE9jdGV0MTYgQ2JfbG9jYWwgPSBjcnlwdG9fdG9vbGJveDo6ZjQoKHVpbnQ4X3QqKVBLYi54LmRhdGEoKSwgKHVpbnQ4X3QqKVBLYS54LmRhdGEoKSwgTmIsIDApOwotCi0gICAgaWYgKENiX2xvY2FsICE9IENiKSB7Ci0gICAgICBMT0dfSU5GTygiQ2JfbG9jYWwgIT0gQ2IsIGFib3J0aW5nISIpOwotICAgICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdGYWlsZWRCdWlsZGVyOjpDcmVhdGUoUGFpcmluZ0ZhaWxlZFJlYXNvbjo6Q09ORklSTV9WQUxVRV9GQUlMRUQpKTsKLSAgICAgIHJldHVybiBQYWlyaW5nRmFpbHVyZSgiQ2JfbG9jYWwgIT0gQ2IiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTmIgPSBHZW5lcmF0ZVJhbmRvbTwxNj4oKTsKLSAgICAvLyBDb21wdXRlIGNvbmZpcm0KLSAgICBDYiA9IGNyeXB0b190b29sYm94OjpmNCgodWludDhfdCopUEtiLnguZGF0YSgpLCAodWludDhfdCopUEthLnguZGF0YSgpLCBOYiwgMCk7Ci0KLSAgICAvLyBTZW5kIFBhaXJpbmcgQ29uZmlybQotICAgIExPR19JTkZPKCJQZXJpcGhlcmFsIHNlbmRzIGNvbmZpcm1hdGlvbiIpOwotICAgIFNlbmRMMmNhcFBhY2tldChpLCBQYWlyaW5nQ29uZmlybUJ1aWxkZXI6OkNyZWF0ZShDYikpOwotCi0gICAgTE9HX0lORk8oIlBlcmlwaGVyYWwgd2FpdHMgZm9yIHJhbmRvbSIpOwotICAgIGF1dG8gcmFuZG9tID0gV2FpdFBhaXJpbmdSYW5kb20oKTsKLSAgICBpZiAoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nRmFpbHVyZT4ocmFuZG9tKSkgewotICAgICAgcmV0dXJuIHN0ZDo6Z2V0PFBhaXJpbmdGYWlsdXJlPihyYW5kb20pOwotICAgIH0KLSAgICBOYSA9IHN0ZDo6Z2V0PFBhaXJpbmdSYW5kb21WaWV3PihyYW5kb20pLkdldFJhbmRvbVZhbHVlKCk7Ci0KLSAgICAvLyBTZW5kIFBhaXJpbmcgUmFuZG9tCi0gICAgU2VuZEwyY2FwUGFja2V0KGksIFBhaXJpbmdSYW5kb21CdWlsZGVyOjpDcmVhdGUoTmIpKTsKLSAgfQotCi0gIHJldHVybiBTdGFnZTFSZXN1bHR7TmEsIE5iLCByYSwgcmJ9OwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3BhaXJpbmdfaGFuZGxlcl9sZV91bml0dGVzdC5jYyBiL2dkL3NlY3VyaXR5L3BhaXJpbmdfaGFuZGxlcl9sZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwYzA4MC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9wYWlyaW5nX2hhbmRsZXJfbGVfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy9yYW5kLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvdGVzdC9tb2Nrcy5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OkVxOwotdXNpbmcgOjp0ZXN0aW5nOjpGaWVsZDsKLXVzaW5nIDo6dGVzdGluZzo6VmFyaWFudFdpdGg7Ci0KLXVzaW5nIGJsdWV0b290aDo6b3M6OkdlbmVyYXRlUmFuZG9tOwotdXNpbmcgYmx1ZXRvb3RoOjpzZWN1cml0eTo6Q29tbWFuZFZpZXc7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotbmFtZXNwYWNlIHsKLQotQ29tbWFuZFZpZXcgQnVpbGRlclRvVmlldyhzdGQ6OnVuaXF1ZV9wdHI8QmFzZVBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIpIHsKLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICBCaXRJbnNlcnRlciBpdCgqcGFja2V0X2J5dGVzKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKGl0KTsKLSAgUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBwYWNrZXRfYnl0ZXNfdmlldyhwYWNrZXRfYnl0ZXMpOwotICBhdXRvIHRlbXBfY21kX3ZpZXcgPSBDb21tYW5kVmlldzo6Q3JlYXRlKHBhY2tldF9ieXRlc192aWV3KTsKLSAgcmV0dXJuIENvbW1hbmRWaWV3OjpDcmVhdGUodGVtcF9jbWRfdmlldyk7Ci19Ci0KLWNsYXNzIFBhaXJpbmdSZXN1bHRIYW5kbGVyTW9jayB7Ci0gcHVibGljOgotICBNT0NLX0NPTlNUX01FVEhPRDEoT25QYWlyaW5nRmluaXNoZWQsIHZvaWQoUGFpcmluZ1Jlc3VsdE9yRmFpbHVyZSkpOwotfTsKLQotc3RkOjp1bmlxdWVfcHRyPFBhaXJpbmdSZXN1bHRIYW5kbGVyTW9jaz4gcGFpcmluZ1Jlc3VsdDsKLUxlU2VjdXJpdHlJbnRlcmZhY2VNb2NrIGxlU2VjdXJpdHlNb2NrOwotVUlNb2NrIHVpTW9jazsKLQotdm9pZCBPblBhaXJpbmdGaW5pc2hlZChQYWlyaW5nUmVzdWx0T3JGYWlsdXJlIHIpIHsKLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4ocikpIHsKLSAgICBMT0coSU5GTykgPDwgInBhaXJpbmcgd2l0aCAiIDw8IHN0ZDo6Z2V0PFBhaXJpbmdSZXN1bHQ+KHIpLmNvbm5lY3Rpb25fYWRkcmVzcyA8PCAiIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSEiOwotICB9IGVsc2UgewotICAgIExPRyhJTkZPKSA8PCAicGFpcmluZyB3aXRoIC4uLiBmYWlsZWQhIjsKLSAgfQotICBwYWlyaW5nUmVzdWx0LT5PblBhaXJpbmdGaW5pc2hlZChyKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBQYWlyaW5nSGFuZGxlclVuaXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0KLSAgICBiaWRpX3F1ZXVlXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Y29tbW9uOjpCaWRpUXVldWU8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4sIHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+PigxMCk7Ci0gICAgdXBfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8b3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+KGJpZGlfcXVldWVfLT5HZXRVcEVuZCgpKTsKLQotICAgIGJpZGlfcXVldWVfLT5HZXREb3duRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmUGFpcmluZ0hhbmRsZXJVbml0VGVzdDo6TDJDQVBfU2VuZFNtcCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0KLSAgICBwYWlyaW5nUmVzdWx0LnJlc2V0KG5ldyBQYWlyaW5nUmVzdWx0SGFuZGxlck1vY2spOwotICB9Ci0gIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgcGFpcmluZ1Jlc3VsdC5yZXNldCgpOwotICAgIGJpZGlfcXVldWVfLT5HZXREb3duRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbGVTZWN1cml0eU1vY2spOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJnVpTW9jayk7Ci0gIH0KLQotICB2b2lkIEwyQ0FQX1NlbmRTbXAoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIgPSBiaWRpX3F1ZXVlXy0+R2V0RG93bkVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0KLSAgICBvdXRnb2luZ19sMmNhcF9wYWNrZXRfID0gQnVpbGRlclRvVmlldyhzdGQ6Om1vdmUoYnVpbGRlcikpOwotICAgIG91dGdvaW5nX2wyY2FwX3BhY2tldF8tPklzVmFsaWQoKTsKLQotICAgIG91dGdvaW5nX2wyY2FwX2Jsb2NrZXJfLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIHN0ZDo6b3B0aW9uYWw8Ymx1ZXRvb3RoOjpzZWN1cml0eTo6Q29tbWFuZFZpZXc+IFdhaXRGb3JPdXRnb2luZ0wyY2FwUGFja2V0KCkgewotICAgIHN0ZDo6bXV0ZXggbXV0ZXg7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKLQotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbG9zdCB3YWtldXAgZnJvbSBjb25kaXRpb25fdmFyaWFibGUsIGNoZWNrIGlmIGRhdGEgaXMgYWxyZWFkeSB3YWl0aW5nIHRvIGJlIHByb2Nlc3NlZAotICAgIGlmIChvdXRnb2luZ19sMmNhcF9wYWNrZXRfICE9IHN0ZDo6bnVsbG9wdCkgewotICAgICAgc3RkOjpvcHRpb25hbDxibHVldG9vdGg6OnNlY3VyaXR5OjpDb21tYW5kVmlldz4gdG1wID0gc3RkOjpudWxsb3B0OwotICAgICAgb3V0Z29pbmdfbDJjYXBfcGFja2V0Xy5zd2FwKHRtcCk7Ci0gICAgICByZXR1cm4gdG1wOwotICAgIH0KLQotICAgIC8vIERhdGEgbm90IHJlYWR5IHlldCwgd2FpdCBmb3IgaXQuCi0gICAgaWYgKG91dGdvaW5nX2wyY2FwX2Jsb2NrZXJfLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKSA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiB0bXAgPSBzdGQ6Om51bGxvcHQ7Ci0gICAgb3V0Z29pbmdfbDJjYXBfcGFja2V0Xy5zd2FwKHRtcCk7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gcHVibGljOgotICBvczo6VGhyZWFkKiB0aHJlYWRfOwotICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxjb21tb246OkJpZGlRdWV1ZTxwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPiwgcGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+IGJpZGlfcXVldWVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8b3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+IHVwX2J1ZmZlcl87Ci0gIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG91dGdvaW5nX2wyY2FwX2Jsb2NrZXJfOwotICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiBvdXRnb2luZ19sMmNhcF9wYWNrZXRfID0gc3RkOjpudWxsb3B0OwotfTsKLQotSW5pdGlhbEluZm9ybWF0aW9ucyBpbml0aWFsX2luZm9ybWF0aW9uc3sKLSAgICAubXlfcm9sZSA9IGhjaTo6Um9sZTo6Q0VOVFJBTCwKLSAgICAubXlfY29ubmVjdGlvbl9hZGRyZXNzID0ge3t9LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9LAotICAgIC5teV9pZGVudGl0eV9hZGRyZXNzID0ge3t9LCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9LAotICAgIC5teV9pZGVudGl0eV9yZXNvbHZpbmdfa2V5ID0KLSAgICAgICAgezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGZ9LAotCi0gICAgLm15UGFpcmluZ0NhcGFiaWxpdGllcyA9IHsuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXV0aF9yZXEgPSBBdXRoUmVxTWFza0JvbmRpbmdGbGFnIHwgQXV0aFJlcU1hc2tNaXRtIHwgQXV0aFJlcU1hc2tTYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemUgPSAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0aWF0b3Jfa2V5X2Rpc3RyaWJ1dGlvbiA9IDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzcG9uZGVyX2tleV9kaXN0cmlidXRpb24gPSAweDAzfSwKLQotICAgIC5yZW1vdGVseV9pbml0aWF0ZWQgPSBmYWxzZSwKLSAgICAucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcyA9IHt7fSwgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTfSwKLSAgICAudXNlcl9pbnRlcmZhY2UgPSAmdWlNb2NrLAotICAgIC5sZV9zZWN1cml0eV9pbnRlcmZhY2UgPSAmbGVTZWN1cml0eU1vY2ssCi0gICAgLk9uUGFpcmluZ0ZpbmlzaGVkID0gT25QYWlyaW5nRmluaXNoZWQsCi19OwotCi1URVNUX0YoUGFpcmluZ0hhbmRsZXJVbml0VGVzdCwgdGVzdF9waGFzZV8xX2ZhaWx1cmUpIHsKLSAgaW5pdGlhbF9pbmZvcm1hdGlvbnMucHJvcGVyX2wyY2FwX2ludGVyZmFjZSA9IHVwX2J1ZmZlcl8uZ2V0KCk7Ci0gIGluaXRpYWxfaW5mb3JtYXRpb25zLmwyY2FwX2hhbmRsZXIgPSBoYW5kbGVyXzsKLSAgaW5pdGlhbF9pbmZvcm1hdGlvbnMudXNlcl9pbnRlcmZhY2VfaGFuZGxlciA9IGhhbmRsZXJfOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxQYWlyaW5nSGFuZGxlckxlPiBwYWlyaW5nX2hhbmRsZXIgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nSGFuZGxlckxlPihQYWlyaW5nSGFuZGxlckxlOjpQSEFTRTEsIGluaXRpYWxfaW5mb3JtYXRpb25zKTsKLQotICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiBwYWlyaW5nX3JlcXVlc3QgPSBXYWl0Rm9yT3V0Z29pbmdMMmNhcFBhY2tldCgpOwotICBFWFBFQ1RfVFJVRShwYWlyaW5nX3JlcXVlc3QuaGFzX3ZhbHVlKCkpOwotICBFWFBFQ1RfRVEocGFpcmluZ19yZXF1ZXN0LT5HZXRDb2RlKCksIENvZGU6OlBBSVJJTkdfUkVRVUVTVCk7Ci0KLSAgRVhQRUNUX0NBTEwoKnBhaXJpbmdSZXN1bHQsIE9uUGFpcmluZ0ZpbmlzaGVkKFZhcmlhbnRXaXRoPFBhaXJpbmdGYWlsdXJlPihfKSkpLlRpbWVzKDEpOwotCi0gIC8vIFNNUCB3aWxsIHdhaXRoIGZvciBQYWlyaW5nIFJlc3BvbnNlLCBvbmNlIGJhZCBwYWNrZXQgaXMgcmVjZWl2ZWQsIGl0IHNob3VsZCBzdG9wIHRoZSBQYWlyaW5nCi0gIENvbW1hbmRWaWV3IGJhZF9wYWlyaW5nX3Jlc3BvbnNlID0gQnVpbGRlclRvVmlldyhQYWlyaW5nUmFuZG9tQnVpbGRlcjo6Q3JlYXRlKHt9KSk7Ci0gIGJhZF9wYWlyaW5nX3Jlc3BvbnNlLklzVmFsaWQoKTsKLSAgcGFpcmluZ19oYW5kbGVyLT5PbkNvbW1hbmRWaWV3KGJhZF9wYWlyaW5nX3Jlc3BvbnNlKTsKLQotICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiBwYWlyaW5nX2ZhaWx1cmUgPSBXYWl0Rm9yT3V0Z29pbmdMMmNhcFBhY2tldCgpOwotICBFWFBFQ1RfVFJVRShwYWlyaW5nX2ZhaWx1cmUuaGFzX3ZhbHVlKCkpOwotICBFWFBFQ1RfRVEocGFpcmluZ19mYWlsdXJlLT5HZXRDb2RlKCksIENvZGU6OlBBSVJJTkdfRkFJTEVEKTsKLX0KLQotVEVTVF9GKFBhaXJpbmdIYW5kbGVyVW5pdFRlc3QsIHRlc3Rfc2VjdXJlX2Nvbm5lY3Rpb25zX2p1c3Rfd29ya3MpIHsKLSAgaW5pdGlhbF9pbmZvcm1hdGlvbnMucHJvcGVyX2wyY2FwX2ludGVyZmFjZSA9IHVwX2J1ZmZlcl8uZ2V0KCk7Ci0gIGluaXRpYWxfaW5mb3JtYXRpb25zLmwyY2FwX2hhbmRsZXIgPSBoYW5kbGVyXzsKLSAgaW5pdGlhbF9pbmZvcm1hdGlvbnMudXNlcl9pbnRlcmZhY2VfaGFuZGxlciA9IGhhbmRsZXJfOwotCi0gIC8vIHdlIGtlZXAgdGhlIHBhaXJpbmdfaGFuZGxlciBhcyB1bmlxdWVfcHRyIHRvIGJldHRlciBtaW1pY2sgaG93IGl0J3MgdXNlZAotICAvLyBpbiB0aGUgcmVhbCB3b3JsZAotICBzdGQ6OnVuaXF1ZV9wdHI8UGFpcmluZ0hhbmRsZXJMZT4gcGFpcmluZ19oYW5kbGVyID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBpbml0aWFsX2luZm9ybWF0aW9ucyk7Ci0KLSAgc3RkOjpvcHRpb25hbDxibHVldG9vdGg6OnNlY3VyaXR5OjpDb21tYW5kVmlldz4gcGFpcmluZ19yZXF1ZXN0X3BrdCA9IFdhaXRGb3JPdXRnb2luZ0wyY2FwUGFja2V0KCk7Ci0gIEVYUEVDVF9UUlVFKHBhaXJpbmdfcmVxdWVzdF9wa3QuaGFzX3ZhbHVlKCkpOwotICBFWFBFQ1RfRVEocGFpcmluZ19yZXF1ZXN0X3BrdC0+R2V0Q29kZSgpLCBDb2RlOjpQQUlSSU5HX1JFUVVFU1QpOwotICBDb21tYW5kVmlldyBwYWlyaW5nX3JlcXVlc3QgPSBwYWlyaW5nX3JlcXVlc3RfcGt0LnZhbHVlKCk7Ci0KLSAgYXV0byBwYWlyaW5nX3Jlc3BvbnNlID0gQnVpbGRlclRvVmlldygKLSAgICAgIFBhaXJpbmdSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZShJb0NhcGFiaWxpdHk6OktFWUJPQVJEX0RJU1BMQVksIE9vYkRhdGFGbGFnOjpOT1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoUmVxTWFza0JvbmRpbmdGbGFnIHwgQXV0aFJlcU1hc2tNaXRtIHwgQXV0aFJlcU1hc2tTYywgMTYsIDB4MDMsIDB4MDMpKTsKLSAgcGFpcmluZ19oYW5kbGVyLT5PbkNvbW1hbmRWaWV3KHBhaXJpbmdfcmVzcG9uc2UpOwotICAvLyBQaGFzZSAxIGZpbmlzaGVkLgotCi0gIC8vIHBhaXJpbmcgcHVibGljIGtleQotICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiBwdWJsaWNfa2V5X3BrdCA9IFdhaXRGb3JPdXRnb2luZ0wyY2FwUGFja2V0KCk7Ci0gIEVYUEVDVF9UUlVFKHB1YmxpY19rZXlfcGt0Lmhhc192YWx1ZSgpKTsKLSAgRVhQRUNUX0VRKENvZGU6OlBBSVJJTkdfUFVCTElDX0tFWSwgcHVibGljX2tleV9wa3QtPkdldENvZGUoKSk7Ci0gIEVjZGhQdWJsaWNLZXkgbXlfcHVibGljX2tleTsKLSAgYXV0byBwcGt2ID0gUGFpcmluZ1B1YmxpY0tleVZpZXc6OkNyZWF0ZShwdWJsaWNfa2V5X3BrdC52YWx1ZSgpKTsKLSAgcHBrdi5Jc1ZhbGlkKCk7Ci0gIG15X3B1YmxpY19rZXkueCA9IHBwa3YuR2V0UHVibGljS2V5WCgpOwotICBteV9wdWJsaWNfa2V5LnkgPSBwcGt2LkdldFB1YmxpY0tleVkoKTsKLQotICBjb25zdCBhdXRvIFtwcml2YXRlX2tleSwgcHVibGljX2tleV0gPSBHZW5lcmF0ZUVDREhLZXlQYWlyKCk7Ci0KLSAgcGFpcmluZ19oYW5kbGVyLT5PbkNvbW1hbmRWaWV3KEJ1aWxkZXJUb1ZpZXcoUGFpcmluZ1B1YmxpY0tleUJ1aWxkZXI6OkNyZWF0ZShwdWJsaWNfa2V5LngsIHB1YmxpY19rZXkueSkpKTsKLSAgLy8gREhLZXkgZXhjaGFuZ2UgZmluaXNoZWQKLSAgc3RkOjphcnJheTx1aW50OF90LCAzMj4gZGhrZXkgPSBDb21wdXRlREhLZXkocHJpdmF0ZV9rZXksIG15X3B1YmxpY19rZXkpOwotCi0gIC8vIFBoYXNhZSAyIFN0YWdlIDEgc3RhcnQKLSAgT2N0ZXQxNiByYSwgcmI7Ci0gIHJhID0gcmIgPSB7MH07Ci0KLSAgT2N0ZXQxNiBOYiA9IEdlbmVyYXRlUmFuZG9tPDE2PigpOwotCi0gIC8vIENvbXB1dGUgY29uZmlybQotICBPY3RldDE2IENiID0gY3J5cHRvX3Rvb2xib3g6OmY0KCh1aW50OF90KilwdWJsaWNfa2V5LnguZGF0YSgpLCAodWludDhfdCopbXlfcHVibGljX2tleS54LmRhdGEoKSwgTmIsIDApOwotCi0gIHBhaXJpbmdfaGFuZGxlci0+T25Db21tYW5kVmlldyhCdWlsZGVyVG9WaWV3KFBhaXJpbmdDb25maXJtQnVpbGRlcjo6Q3JlYXRlKENiKSkpOwotCi0gIC8vIHJhbmRvbQotICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiByYW5kb21fcGt0ID0gV2FpdEZvck91dGdvaW5nTDJjYXBQYWNrZXQoKTsKLSAgRVhQRUNUX1RSVUUocmFuZG9tX3BrdC5oYXNfdmFsdWUoKSk7Ci0gIEVYUEVDVF9FUShDb2RlOjpQQUlSSU5HX1JBTkRPTSwgcmFuZG9tX3BrdC0+R2V0Q29kZSgpKTsKLSAgYXV0byBwcnYgPSBQYWlyaW5nUmFuZG9tVmlldzo6Q3JlYXRlKHJhbmRvbV9wa3QudmFsdWUoKSk7Ci0gIHBydi5Jc1ZhbGlkKCk7Ci0gIE9jdGV0MTYgTmEgPSBwcnYuR2V0UmFuZG9tVmFsdWUoKTsKLQotICBwYWlyaW5nX2hhbmRsZXItPk9uQ29tbWFuZFZpZXcoQnVpbGRlclRvVmlldyhQYWlyaW5nUmFuZG9tQnVpbGRlcjo6Q3JlYXRlKE5iKSkpOwotCi0gIC8vIFN0YXJ0IG9mIGF1dGhlbnRpY2F0aW9uIHN0YWdlIDIKLSAgdWludDhfdCBhWzddOwotICB1aW50OF90IGJbN107Ci0gIG1lbWNweShiLCBpbml0aWFsX2luZm9ybWF0aW9ucy5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3MoKS5kYXRhKCksIGhjaTo6QWRkcmVzczo6a0xlbmd0aCk7Ci0gIGJbNl0gPSAodWludDhfdClpbml0aWFsX2luZm9ybWF0aW9ucy5yZW1vdGVfY29ubmVjdGlvbl9hZGRyZXNzLkdldEFkZHJlc3NUeXBlKCk7Ci0gIG1lbWNweShhLCBpbml0aWFsX2luZm9ybWF0aW9ucy5teV9jb25uZWN0aW9uX2FkZHJlc3MuR2V0QWRkcmVzcygpLmRhdGEoKSwgaGNpOjpBZGRyZXNzOjprTGVuZ3RoKTsKLSAgYVs2XSA9ICh1aW50OF90KWluaXRpYWxfaW5mb3JtYXRpb25zLm15X2Nvbm5lY3Rpb25fYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpOwotCi0gIE9jdGV0MTYgbHRrLCBtYWNfa2V5OwotICBjcnlwdG9fdG9vbGJveDo6ZjUoZGhrZXkuZGF0YSgpLCBOYSwgTmIsIGEsIGIsICZtYWNfa2V5LCAmbHRrKTsKLQotICBQYWlyaW5nUmVxdWVzdFZpZXcgcHJlcXYgPSBQYWlyaW5nUmVxdWVzdFZpZXc6OkNyZWF0ZShwYWlyaW5nX3JlcXVlc3QpOwotICBQYWlyaW5nUmVzcG9uc2VWaWV3IHByc3B2ID0gUGFpcmluZ1Jlc3BvbnNlVmlldzo6Q3JlYXRlKHBhaXJpbmdfcmVzcG9uc2UpOwotCi0gIHByZXF2LklzVmFsaWQoKTsKLSAgcHJzcHYuSXNWYWxpZCgpOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGlvY2FwQXtzdGF0aWNfY2FzdDx1aW50OF90PihwcmVxdi5HZXRJb0NhcGFiaWxpdHkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHByZXF2LkdldE9vYkRhdGFGbGFnKCkpLCBwcmVxdi5HZXRBdXRoUmVxKCl9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDM+IGlvY2FwQntzdGF0aWNfY2FzdDx1aW50OF90PihwcnNwdi5HZXRJb0NhcGFiaWxpdHkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHByc3B2LkdldE9vYkRhdGFGbGFnKCkpLCBwcnNwdi5HZXRBdXRoUmVxKCl9OwotCi0gIE9jdGV0MTYgRWEgPSBjcnlwdG9fdG9vbGJveDo6ZjYobWFjX2tleSwgTmEsIE5iLCByYiwgaW9jYXBBLmRhdGEoKSwgYSwgYik7Ci0gIE9jdGV0MTYgRWIgPSBjcnlwdG9fdG9vbGJveDo6ZjYobWFjX2tleSwgTmIsIE5hLCByYSwgaW9jYXBCLmRhdGEoKSwgYiwgYSk7Ci0KLSAgc3RkOjpvcHRpb25hbDxibHVldG9vdGg6OnNlY3VyaXR5OjpDb21tYW5kVmlldz4gZGhfa2V5X3BrdCA9IFdhaXRGb3JPdXRnb2luZ0wyY2FwUGFja2V0KCk7Ci0gIEVYUEVDVF9UUlVFKGRoX2tleV9wa3QuaGFzX3ZhbHVlKCkpOwotICBFWFBFQ1RfRVEoQ29kZTo6UEFJUklOR19ESF9LRVlfQ0hFQ0ssIGRoX2tleV9wa3QtPkdldENvZGUoKSk7Ci0gIGF1dG8gcGRoa2N2ID0gUGFpcmluZ0RoS2V5Q2hlY2tWaWV3OjpDcmVhdGUoZGhfa2V5X3BrdC52YWx1ZSgpKTsKLSAgcGRoa2N2LklzVmFsaWQoKTsKLSAgRVhQRUNUX0VRKHBkaGtjdi5HZXREaEtleUNoZWNrKCksIEVhKTsKLQotICBwYWlyaW5nX2hhbmRsZXItPk9uQ29tbWFuZFZpZXcoQnVpbGRlclRvVmlldyhQYWlyaW5nRGhLZXlDaGVja0J1aWxkZXI6OkNyZWF0ZShFYikpKTsKLQotICAvLyBQaGFzZSAyIGZpbmlzaGVkCi0gIC8vIFdlIGRvbid0IGNhcmUgZm9yIHRoZSByZXN0IG9mIHRoZSBmbG93LCBsZXQgaXQgZGllLgotfQotCi1Jbml0aWFsSW5mb3JtYXRpb25zIGluaXRpYWxfaW5mb3JtYXRpb25zX3Ryc2l7Ci0gICAgLm15X3JvbGUgPSBoY2k6OlJvbGU6OkNFTlRSQUwsCi0gICAgLm15X2Nvbm5lY3Rpb25fYWRkcmVzcyA9IGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksCi0gICAgLm15X2lkZW50aXR5X2FkZHJlc3MgPSB7e30sIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTU30sCi0gICAgLm15X2lkZW50aXR5X3Jlc29sdmluZ19rZXkgPQotICAgICAgICB7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZn0sCi0KLSAgICAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzID0gey5pb19jYXBhYmlsaXR5ID0gSW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub29iX2RhdGFfZmxhZyA9IE9vYkRhdGFGbGFnOjpOT1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdXRoX3JlcSA9IEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgfCBBdXRoUmVxTWFza01pdG0gfCBBdXRoUmVxTWFza1NjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSA9IDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYXRvcl9rZXlfZGlzdHJpYnV0aW9uID0gMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNwb25kZXJfa2V5X2Rpc3RyaWJ1dGlvbiA9IDB4MDN9LAotCi0gICAgLnJlbW90ZWx5X2luaXRpYXRlZCA9IHRydWUsCi0gICAgLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MgPSBoY2k6OkFkZHJlc3NXaXRoVHlwZSgpLAotICAgIC51c2VyX2ludGVyZmFjZSA9ICZ1aU1vY2ssCi0gICAgLmxlX3NlY3VyaXR5X2ludGVyZmFjZSA9ICZsZVNlY3VyaXR5TW9jaywKLSAgICAuT25QYWlyaW5nRmluaXNoZWQgPSBPblBhaXJpbmdGaW5pc2hlZCwKLX07Ci0KLS8qIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHdoZW4gcmVtb3RlIHBlcmlwaGVyYWwgZGV2aWNlIHNlbmRzIHNlY3VyaXR5IHJlcXVlc3QgLCBhbmQgdXNlcgotICogZG9lcyBhY2NlcHQgdGhlIHByb21wdCwgd2UgZG8gc2VuZCBwYWlyaW5nIHJlcXVlc3QgKi8KLVRFU1RfRihQYWlyaW5nSGFuZGxlclVuaXRUZXN0LCB0ZXN0X3JlbW90ZV9wZXJpcGhlcmFsX2luaXRpYXRpbmcpIHsKLSAgaW5pdGlhbF9pbmZvcm1hdGlvbnNfdHJzaS5wcm9wZXJfbDJjYXBfaW50ZXJmYWNlID0gdXBfYnVmZmVyXy5nZXQoKTsKLSAgaW5pdGlhbF9pbmZvcm1hdGlvbnNfdHJzaS5sMmNhcF9oYW5kbGVyID0gaGFuZGxlcl87Ci0gIGluaXRpYWxfaW5mb3JtYXRpb25zX3Ryc2kudXNlcl9pbnRlcmZhY2VfaGFuZGxlciA9IGhhbmRsZXJfOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxQYWlyaW5nSGFuZGxlckxlPiBwYWlyaW5nX2hhbmRsZXIgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nSGFuZGxlckxlPihQYWlyaW5nSGFuZGxlckxlOjpBQ0NFUFRfUFJPTVBULCBpbml0aWFsX2luZm9ybWF0aW9uc190cnNpKTsKLQotICAvLyBTaW11bGF0ZSB1c2VyIGFjY2VwdGluZyB0aGUgcGFpcmluZyBpbiBVSQotICBwYWlyaW5nX2hhbmRsZXItPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQUlSSU5HX0FDQ0VQVEVELCAweDAxIC8qIE5vbi16ZXJvIHZhbHVlIG1lYW5zIHN1Y2Nlc3MgKi8pOwotCi0gIHN0ZDo6b3B0aW9uYWw8Ymx1ZXRvb3RoOjpzZWN1cml0eTo6Q29tbWFuZFZpZXc+IHBhaXJpbmdfcmVxdWVzdF9wa3QgPSBXYWl0Rm9yT3V0Z29pbmdMMmNhcFBhY2tldCgpOwotICBFWFBFQ1RfVFJVRShwYWlyaW5nX3JlcXVlc3RfcGt0Lmhhc192YWx1ZSgpKTsKLSAgRVhQRUNUX0VRKENvZGU6OlBBSVJJTkdfUkVRVUVTVCwgcGFpcmluZ19yZXF1ZXN0X3BrdC0+R2V0Q29kZSgpKTsKLQotICAvLyBXZSBkb24ndCBjYXJlIGZvciB0aGUgcmVzdCBvZiB0aGUgZmxvdywgbGV0IGl0IGRpZS4KLSAgcGFpcmluZ19oYW5kbGVyLnJlc2V0KCk7Ci19Ci0KLUluaXRpYWxJbmZvcm1hdGlvbnMgaW5pdGlhbF9pbmZvcm1hdGlvbnNfdHJtaXsKLSAgICAubXlfcm9sZSA9IGhjaTo6Um9sZTo6UEVSSVBIRVJBTCwKLSAgICAubXlfY29ubmVjdGlvbl9hZGRyZXNzID0gaGNpOjpBZGRyZXNzV2l0aFR5cGUoKSwKLSAgICAubXlfaWRlbnRpdHlfYWRkcmVzcyA9IHt7fSwgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfSwKLSAgICAubXlfaWRlbnRpdHlfcmVzb2x2aW5nX2tleSA9Ci0gICAgICAgIHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmfSwKLQotICAgIC5teVBhaXJpbmdDYXBhYmlsaXRpZXMgPSB7LmlvX2NhcGFiaWxpdHkgPSBJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplID0gMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdGlhdG9yX2tleV9kaXN0cmlidXRpb24gPSAweDAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uID0gMHgwM30sCi0KLSAgICAucmVtb3RlbHlfaW5pdGlhdGVkID0gdHJ1ZSwKLSAgICAucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcyA9IGhjaTo6QWRkcmVzc1dpdGhUeXBlKCksCi0gICAgLnBhaXJpbmdfcmVxdWVzdCA9IFBhaXJpbmdSZXF1ZXN0Vmlldzo6Q3JlYXRlKEJ1aWxkZXJUb1ZpZXcoUGFpcmluZ1JlcXVlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVULAotICAgICAgICBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQsCi0gICAgICAgIEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgfCBBdXRoUmVxTWFza01pdG0gfCBBdXRoUmVxTWFza1NjLAotICAgICAgICAxNiwKLSAgICAgICAgMHgwMywKLSAgICAgICAgMHgwMykpKSwKLSAgICAudXNlcl9pbnRlcmZhY2UgPSAmdWlNb2NrLAotICAgIC5sZV9zZWN1cml0eV9pbnRlcmZhY2UgPSAmbGVTZWN1cml0eU1vY2ssCi0KLSAgICAuT25QYWlyaW5nRmluaXNoZWQgPSBPblBhaXJpbmdGaW5pc2hlZCwKLX07Ci0KLS8qIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHdoZW4gcmVtb3RlIGRldmljZSBzZW5kcyBwYWlyaW5nIHJlcXVlc3QsIGFuZCB1c2VyIGRvZXMgYWNjZXB0IHRoZSBwcm9tcHQsIHdlIGRvIHNlbmQgcHJvcGVyCi0gKiByZXBseSBiYWNrICovCi1URVNUX0YoUGFpcmluZ0hhbmRsZXJVbml0VGVzdCwgdGVzdF9yZW1vdGVfY2VudHJhbF9pbml0aWF0aW5nKSB7Ci0gIGluaXRpYWxfaW5mb3JtYXRpb25zX3RybWkucHJvcGVyX2wyY2FwX2ludGVyZmFjZSA9IHVwX2J1ZmZlcl8uZ2V0KCk7Ci0gIGluaXRpYWxfaW5mb3JtYXRpb25zX3RybWkubDJjYXBfaGFuZGxlciA9IGhhbmRsZXJfOwotICBpbml0aWFsX2luZm9ybWF0aW9uc190cm1pLnVzZXJfaW50ZXJmYWNlX2hhbmRsZXIgPSBoYW5kbGVyXzsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8UGFpcmluZ0hhbmRsZXJMZT4gcGFpcmluZ19oYW5kbGVyID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6QUNDRVBUX1BST01QVCwgaW5pdGlhbF9pbmZvcm1hdGlvbnNfdHJtaSk7Ci0KLSAgLy8gU2ltdWxhdGUgdXNlciBhY2NlcHRpbmcgdGhlIHBhaXJpbmcgaW4gVUkKLSAgcGFpcmluZ19oYW5kbGVyLT5PblVpQWN0aW9uKFBhaXJpbmdFdmVudDo6UEFJUklOR19BQ0NFUFRFRCwgMHgwMSAvKiBOb24temVybyB2YWx1ZSBtZWFucyBzdWNjZXNzICovKTsKLQotICBzdGQ6Om9wdGlvbmFsPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiBwYWlyaW5nX3Jlc3BvbnNlX3BrdCA9IFdhaXRGb3JPdXRnb2luZ0wyY2FwUGFja2V0KCk7Ci0gIEVYUEVDVF9UUlVFKHBhaXJpbmdfcmVzcG9uc2VfcGt0Lmhhc192YWx1ZSgpKTsKLSAgRVhQRUNUX0VRKENvZGU6OlBBSVJJTkdfUkVTUE9OU0UsIHBhaXJpbmdfcmVzcG9uc2VfcGt0LT5HZXRDb2RlKCkpOwotICAvLyBQaGFzZSAxIGZpbmlzaGVkLgotCi0gIC8vIFdlIGRvbid0IGNhcmUgZm9yIHRoZSByZXN0IG9mIHRoZSBmbG93LCBpdCdzIGhhbmRsZWQgaW4gaW4gb3RoZXIgdGVzdHMuIGxldCBpdCBkaWUuCi0gIHBhaXJpbmdfaGFuZGxlci5yZXNldCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3JlY29yZC9BbmRyb2lkLmJwIGIvZ2Qvc2VjdXJpdHkvcmVjb3JkL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MzM0NjQuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvcmVjb3JkL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhTZWN1cml0eVJlY29yZFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICJzZWN1cml0eV9yZWNvcmRfc3RvcmFnZS5jYyIKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJCbHVldG9vdGhTZWN1cml0eVJlY29yZFRlc3RTb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAic2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2VfdGVzdC5jYyIKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZC5oIGIvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU5ZjhmLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3JlY29yZC9zZWN1cml0eV9yZWNvcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RvcmFnZS9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9kZXZpY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotbmFtZXNwYWNlIHJlY29yZCB7Ci0KLWNsYXNzIFNlY3VyaXR5UmVjb3JkIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNlY3VyaXR5UmVjb3JkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpIDogcHNldWRvX2FkZHJlc3NfKGFkZHJlc3MpIHt9Ci0KLSAgU2VjdXJpdHlSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBTZWN1cml0eVJlY29yZCYgb3RoZXIpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGEgZGV2aWNlIGlzIGN1cnJlbnRseSBwYWlyaW5nIHRvIGFub3RoZXIgZGV2aWNlCi0gICAqLwotICBib29sIElzUGFpcmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gcGFpcmluZ187Ci0gIH0KLQotICAvKiBMaW5rIGtleSBoYXMgYmVlbiBleGNoYW5nZWQsIGJ1dCBub3Qgc3RvcmVkICovCi0gIGJvb2wgSXNQYWlyZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIElzQ2xhc3NpY0xpbmtLZXlWYWxpZCgpOwotICB9Ci0KLSAgdm9pZCBTZXRMaW5rS2V5KHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxpbmtfa2V5LCBoY2k6OktleVR5cGUga2V5X3R5cGUpIHsKLSAgICBsaW5rX2tleV8gPSBsaW5rX2tleTsKLSAgICBrZXlfdHlwZV8gPSBrZXlfdHlwZTsKLSAgICBDYW5jZWxQYWlyaW5nKCk7Ci0gIH0KLQotICB2b2lkIENhbmNlbFBhaXJpbmcoKSB7Ci0gICAgcGFpcmluZ18gPSBmYWxzZTsKLSAgfQotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IEdldExpbmtLZXkoKSB7Ci0gICAgQVNTRVJUKElzQ2xhc3NpY0xpbmtLZXlWYWxpZCgpKTsKLSAgICByZXR1cm4gbGlua19rZXlfOwotICB9Ci0KLSAgaGNpOjpLZXlUeXBlIEdldEtleVR5cGUoKSB7Ci0gICAgQVNTRVJUKElzQ2xhc3NpY0xpbmtLZXlWYWxpZCgpKTsKLSAgICByZXR1cm4ga2V5X3R5cGVfOwotICB9Ci0KLSAgc3RkOjpvcHRpb25hbDxoY2k6OkFkZHJlc3NXaXRoVHlwZT4gR2V0UHNldWRvQWRkcmVzcygpIHsKLSAgICByZXR1cm4gcHNldWRvX2FkZHJlc3NfOwotICB9Ci0KLSAgdm9pZCBTZXRBdXRoZW50aWNhdGVkKGJvb2wgaXNfYXV0aGVudGljYXRlZCkgewotICAgIHRoaXMtPmlzX2F1dGhlbnRpY2F0ZWRfID0gaXNfYXV0aGVudGljYXRlZDsKLSAgfQotCi0gIGJvb2wgSXNBdXRoZW50aWNhdGVkKCkgewotICAgIHJldHVybiB0aGlzLT5pc19hdXRoZW50aWNhdGVkXzsKLSAgfQotCi0gIHZvaWQgU2V0UmVxdWlyZXNNaXRtUHJvdGVjdGlvbihib29sIHJlcXVpcmVzX21pdG1fcHJvdGVjdGlvbikgewotICAgIHRoaXMtPnJlcXVpcmVzX21pdG1fcHJvdGVjdGlvbl8gPSByZXF1aXJlc19taXRtX3Byb3RlY3Rpb247Ci0gIH0KLQotICBib29sIFJlcXVpcmVzTWl0bVByb3RlY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlcXVpcmVzX21pdG1fcHJvdGVjdGlvbl87Ci0gIH0KLQotICB2b2lkIFNldElzRW5jcnlwdGlvblJlcXVpcmVkKGJvb2wgaXNfZW5jcnlwdGlvbl9yZXF1aXJlZCkgewotICAgIHRoaXMtPmlzX2VuY3J5cHRpb25fcmVxdWlyZWRfID0gaXNfZW5jcnlwdGlvbl9yZXF1aXJlZDsKLSAgfQotCi0gIGJvb2wgSXNFbmNyeXB0aW9uUmVxdWlyZWQoKSB7Ci0gICAgcmV0dXJuIHRoaXMtPmlzX2VuY3J5cHRpb25fcmVxdWlyZWRfOwotICB9Ci0KLSAgYm9vbCBJc0NsYXNzaWNMaW5rS2V5VmFsaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdGQ6OmFsbF9vZihsaW5rX2tleV8uYmVnaW4oKSwgbGlua19rZXlfLmVuZCgpLCBbXSh1aW50OF90IGIpIHsgcmV0dXJuIGIgPT0gMDsgfSk7Ci0gIH0KLQotICB2b2lkIFNldElzVGVtcG9yYXJ5KGJvb2wgaXNfdGVtcCkgewotICAgIHRoaXMtPmlzX3RlbXBvcmFyeV8gPSBpc190ZW1wOwotICB9Ci0KLSAgYm9vbCBJc1RlbXBvcmFyeSgpIHsKLSAgICByZXR1cm4gdGhpcy0+aXNfdGVtcG9yYXJ5XzsKLSAgfQotCi0gcHJpdmF0ZToKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleV8gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0gIGhjaTo6S2V5VHlwZSBrZXlfdHlwZV8gPSBoY2k6OktleVR5cGU6OkRFQlVHX0NPTUJJTkFUSU9OOwotCi0gIGJvb2wgaXNfdGVtcG9yYXJ5XyA9IGZhbHNlOwotICBib29sIHBhaXJpbmdfID0gZmFsc2U7Ci0gIGJvb2wgaXNfYXV0aGVudGljYXRlZF8gPSBmYWxzZTsKLSAgYm9vbCByZXF1aXJlc19taXRtX3Byb3RlY3Rpb25fID0gZmFsc2U7Ci0gIGJvb2wgaXNfZW5jcnlwdGlvbl9yZXF1aXJlZF8gPSBmYWxzZTsKLQotIHB1YmxpYzoKLSAgLyogRmlyc3QgYWRkcmVzcyB3ZSBoYXZlIGV2ZXIgc2VlbiB0aGlzIGRldmljZSB3aXRoLCB0aGF0IHdlIHVzZWQgdG8gY3JlYXRlIGJvbmQgKi8KLSAgc3RkOjpvcHRpb25hbDxoY2k6OkFkZHJlc3NXaXRoVHlwZT4gcHNldWRvX2FkZHJlc3NfOwotCi0gIC8qIElkZW50aXR5IEFkZHJlc3MgKi8KLSAgc3RkOjpvcHRpb25hbDxoY2k6OkFkZHJlc3NXaXRoVHlwZT4gaWRlbnRpdHlfYWRkcmVzc187Ci0KLSAgc3RkOjpvcHRpb25hbDxjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNj4gcmVtb3RlX2x0azsKLSAgdWludDhfdCBrZXlfc2l6ZTsKLSAgdWludDhfdCBzZWN1cml0eV9sZXZlbDsKLSAgc3RkOjpvcHRpb25hbDx1aW50MTZfdD4gcmVtb3RlX2VkaXY7Ci0gIHN0ZDo6b3B0aW9uYWw8c3RkOjphcnJheTx1aW50OF90LCA4Pj4gcmVtb3RlX3JhbmQ7Ci0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IHJlbW90ZV9pcms7Ci0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IHJlbW90ZV9zaWduYXR1cmVfa2V5OwotCi0gIHN0ZDo6b3B0aW9uYWw8Y3J5cHRvX3Rvb2xib3g6Ok9jdGV0MTY+IGxvY2FsX2x0azsKLSAgc3RkOjpvcHRpb25hbDx1aW50MTZfdD4gbG9jYWxfZWRpdjsKLSAgc3RkOjpvcHRpb25hbDxzdGQ6OmFycmF5PHVpbnQ4X3QsIDg+PiBsb2NhbF9yYW5kOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHJlY29yZAotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX2RhdGFiYXNlLmggYi9nZC9zZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX2RhdGFiYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NDFjNTMuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZF9kYXRhYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZF9zdG9yYWdlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLW5hbWVzcGFjZSByZWNvcmQgewotCi1jbGFzcyBTZWN1cml0eVJlY29yZERhdGFiYXNlIHsKLSBwdWJsaWM6Ci0gIFNlY3VyaXR5UmVjb3JkRGF0YWJhc2UocmVjb3JkOjpTZWN1cml0eVJlY29yZFN0b3JhZ2Ugc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2UpCi0gICAgICA6IHNlY3VyaXR5X3JlY29yZF9zdG9yYWdlXyhzZWN1cml0eV9yZWNvcmRfc3RvcmFnZSkge30KLQotICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxTZWN1cml0eVJlY29yZD4+OjppdGVyYXRvcjsKLQotICBzdGQ6OnNoYXJlZF9wdHI8U2VjdXJpdHlSZWNvcmQ+IEZpbmRPckNyZWF0ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7Ci0gICAgYXV0byBpdCA9IEZpbmQoYWRkcmVzcyk7Ci0gICAgLy8gU2VjdXJpdHkgcmVjb3JkIGNoZWNrCi0gICAgaWYgKGl0ICE9IHJlY29yZHNfLmVuZCgpKSByZXR1cm4gKml0OwotCi0gICAgLy8gTm8gc2VjdXJpdHkgcmVjb3JkLCBjcmVhdGUgb25lCi0gICAgYXV0byByZWNvcmRfcHRyID0gc3RkOjptYWtlX3NoYXJlZDxTZWN1cml0eVJlY29yZD4oYWRkcmVzcyk7Ci0gICAgcmVjb3Jkc18uaW5zZXJ0KHJlY29yZF9wdHIpOwotICAgIHJldHVybiByZWNvcmRfcHRyOwotICB9Ci0KLSAgdm9pZCBSZW1vdmUoY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MpIHsKLSAgICBhdXRvIGl0ID0gRmluZChhZGRyZXNzKTsKLQotICAgIC8vIE5vIHJlY29yZCBleGlzdHMKLSAgICBpZiAoaXQgPT0gcmVjb3Jkc18uZW5kKCkpIHJldHVybjsKLQotICAgIHJlY29yZHNfLmVyYXNlKGl0KTsKLSAgICBzZWN1cml0eV9yZWNvcmRfc3RvcmFnZV8uUmVtb3ZlRGV2aWNlKGFkZHJlc3MpOwotICB9Ci0KLSAgaXRlcmF0b3IgRmluZChoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gcmVjb3Jkc18uYmVnaW4oKTsgaXQgIT0gcmVjb3Jkc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWN1cml0eVJlY29yZD4gcmVjb3JkID0gKml0OwotICAgICAgaWYgKHJlY29yZC0+aWRlbnRpdHlfYWRkcmVzc18uaGFzX3ZhbHVlKCkgJiYgcmVjb3JkLT5pZGVudGl0eV9hZGRyZXNzXy52YWx1ZSgpID09IGFkZHJlc3MpIHJldHVybiBpdDsKLSAgICAgIGlmIChyZWNvcmQtPkdldFBzZXVkb0FkZHJlc3MoKSA9PSBhZGRyZXNzKSByZXR1cm4gaXQ7Ci0gICAgICBpZiAocmVjb3JkLT5yZW1vdGVfaXJrLmhhc192YWx1ZSgpICYmIGFkZHJlc3MuSXNScGFUaGF0TWF0Y2hlc0lyayhyZWNvcmQtPnJlbW90ZV9pcmsudmFsdWUoKSkpIHJldHVybiBpdDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlY29yZHNfLmVuZCgpOwotICB9Ci0KLSAgdm9pZCBMb2FkUmVjb3Jkc0Zyb21TdG9yYWdlKCkgewotICAgIHNlY3VyaXR5X3JlY29yZF9zdG9yYWdlXy5Mb2FkU2VjdXJpdHlSZWNvcmRzKCZyZWNvcmRzXyk7Ci0gIH0KLQotICB2b2lkIFNhdmVSZWNvcmRzVG9TdG9yYWdlKCkgewotICAgIHNlY3VyaXR5X3JlY29yZF9zdG9yYWdlXy5TYXZlU2VjdXJpdHlSZWNvcmRzKCZyZWNvcmRzXyk7Ci0gIH0KLQotICBzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8U2VjdXJpdHlSZWNvcmQ+PiByZWNvcmRzXzsKLSAgcmVjb3JkOjpTZWN1cml0eVJlY29yZFN0b3JhZ2Ugc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2VfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHJlY29yZAotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2UuY2MgYi9nZC9zZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2Y2MGEuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZF9zdG9yYWdlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSNpbmNsdWRlICJzZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2UuaCIKLQotI2luY2x1ZGUgInN0b3JhZ2UvbXV0YXRpb24uaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotbmFtZXNwYWNlIHJlY29yZCB7Ci0KLW5hbWVzcGFjZSB7Ci12b2lkIFNldENsYXNzaWNEYXRhKAotICAgIHN0b3JhZ2U6Ok11dGF0aW9uJiBtdXRhdGlvbiwgc3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+IHJlY29yZCwgc3RvcmFnZTo6RGV2aWNlJiBkZXZpY2UpIHsKLSAgaWYgKCpkZXZpY2UuR2V0RGV2aWNlVHlwZSgpID09IGhjaTo6RGV2aWNlVHlwZTo6TEUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHJlY29yZC0+SXNDbGFzc2ljTGlua0tleVZhbGlkKCkpIHsKLSAgICBMT0dfV0FSTigiVHlwZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KCpkZXZpY2UuR2V0RGV2aWNlVHlwZSgpKSk7Ci0gICAgbXV0YXRpb24uQWRkKGRldmljZS5DbGFzc2ljKCkuU2V0TGlua0tleShyZWNvcmQtPkdldExpbmtLZXkoKSkpOwotICAgIG11dGF0aW9uLkFkZChkZXZpY2UuQ2xhc3NpYygpLlNldExpbmtLZXlUeXBlKHJlY29yZC0+R2V0S2V5VHlwZSgpKSk7Ci0gIH0KLX0KLQotdm9pZCBTZXRMZURhdGEoc3RvcmFnZTo6TXV0YXRpb24mIG11dGF0aW9uLCBzdGQ6OnNoYXJlZF9wdHI8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4gcmVjb3JkLCBzdG9yYWdlOjpEZXZpY2UmIGRldmljZSkgewotICBpZiAoKmRldmljZS5HZXREZXZpY2VUeXBlKCkgPT0gaGNpOjpEZXZpY2VUeXBlOjpCUl9FRFIpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIGxlX2RldmljZSA9IGRldmljZS5MZSgpOwotCi0gIGlmIChyZWNvcmQtPmlkZW50aXR5X2FkZHJlc3NfKSB7Ci0gICAgbXV0YXRpb24uQWRkKGxlX2RldmljZS5TZXRBZGRyZXNzVHlwZShyZWNvcmQtPmlkZW50aXR5X2FkZHJlc3NfLT5HZXRBZGRyZXNzVHlwZSgpKSk7Ci0gIH0KLQotICBpZiAocmVjb3JkLT5yZW1vdGVfaXJrKSB7Ci0gICAgc3RkOjphcnJheTx1aW50OF90LCAyMz4gcGVlcmlkOwotICAgIHN0ZDo6Y29weV9uKHJlY29yZC0+cmVtb3RlX2lyay0+ZGF0YSgpLCByZWNvcmQtPnJlbW90ZV9pcmstPnNpemUoKSwgcGVlcmlkLmRhdGEoKSk7Ci0gICAgcGVlcmlkWzE2XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlY29yZC0+aWRlbnRpdHlfYWRkcmVzc18tPkdldEFkZHJlc3NUeXBlKCkpOwotICAgIHN0ZDo6Y29weV9uKHJlY29yZC0+aWRlbnRpdHlfYWRkcmVzc18tPkdldEFkZHJlc3MoKS5kYXRhKCksIDYsIHBlZXJpZC5kYXRhKCkgKyAxNyk7Ci0KLSAgICBjb21tb246OkJ5dGVBcnJheTwyMz4gYnl0ZV9hcnJheShwZWVyaWQpOwotICAgIG11dGF0aW9uLkFkZChsZV9kZXZpY2UuU2V0UGVlcklkKGJ5dGVfYXJyYXkuVG9TdHJpbmcoKSkpOwotICB9Ci0KLSAgaWYgKHJlY29yZC0+cHNldWRvX2FkZHJlc3NfKSB7Ci0gICAgbXV0YXRpb24uQWRkKGxlX2RldmljZS5TZXRMZWdhY3lQc2V1ZG9BZGRyZXNzKHJlY29yZC0+cHNldWRvX2FkZHJlc3NfLT5HZXRBZGRyZXNzKCkpKTsKLSAgfQotCi0gIGlmIChyZWNvcmQtPnJlbW90ZV9sdGspIHsKLSAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI4PiBwZW5jX2tleXM7Ci0KLSAgICBzdGQ6OmNvcHlfbihyZWNvcmQtPnJlbW90ZV9sdGstPmRhdGEoKSwgcmVjb3JkLT5yZW1vdGVfbHRrLT5zaXplKCksIHBlbmNfa2V5cy5kYXRhKCkpOwotICAgIHN0ZDo6Y29weV9uKHJlY29yZC0+cmVtb3RlX3JhbmQtPmRhdGEoKSwgcmVjb3JkLT5yZW1vdGVfcmFuZC0+c2l6ZSgpLCBwZW5jX2tleXMuZGF0YSgpICsgMTYpOwotICAgIHVpbnQxNl90KiBlZGl2X2xvY2F0aW9uID0gKHVpbnQxNl90KikocGVuY19rZXlzLmRhdGEoKSArIDI0KTsKLSAgICAqZWRpdl9sb2NhdGlvbiA9ICpyZWNvcmQtPnJlbW90ZV9lZGl2OwotICAgIHBlbmNfa2V5c1syNl0gPSByZWNvcmQtPnNlY3VyaXR5X2xldmVsOwotICAgIHBlbmNfa2V5c1syN10gPSByZWNvcmQtPmtleV9zaXplOwotCi0gICAgY29tbW9uOjpCeXRlQXJyYXk8Mjg+IGJ5dGVfYXJyYXkocGVuY19rZXlzKTsKLSAgICBtdXRhdGlvbi5BZGQobGVfZGV2aWNlLlNldFBlZXJFbmNyeXB0aW9uS2V5cyhieXRlX2FycmF5LlRvU3RyaW5nKCkpKTsKLSAgfQotCi0gIGlmIChyZWNvcmQtPnJlbW90ZV9zaWduYXR1cmVfa2V5KSB7Ci0gICAgc3RkOjphcnJheTx1aW50OF90LCAyMT4gcHNya19rZXlzOwotCi0gICAgLy8gZm91ciBieXRlcyBjb3VudGVyLCBhbGwgemVyb3MKLSAgICAqcHNya19rZXlzLmRhdGEoKSA9IDA7Ci0gICAgKihwc3JrX2tleXMuZGF0YSgpICsgMSkgPSAwOwotICAgICoocHNya19rZXlzLmRhdGEoKSArIDIpID0gMDsKLSAgICAqKHBzcmtfa2V5cy5kYXRhKCkgKyAzKSA9IDA7Ci0gICAgc3RkOjpjb3B5X24ocmVjb3JkLT5yZW1vdGVfc2lnbmF0dXJlX2tleS0+ZGF0YSgpLCByZWNvcmQtPnJlbW90ZV9zaWduYXR1cmVfa2V5LT5zaXplKCksIHBzcmtfa2V5cy5kYXRhKCkgKyA0KTsKLSAgICAqKHBzcmtfa2V5cy5kYXRhKCkgKyAyMCkgPSByZWNvcmQtPnNlY3VyaXR5X2xldmVsOwotCi0gICAgY29tbW9uOjpCeXRlQXJyYXk8MjE+IGJ5dGVfYXJyYXkocHNya19rZXlzKTsKLSAgICBtdXRhdGlvbi5BZGQobGVfZGV2aWNlLlNldFBlZXJTaWduYXR1cmVSZXNvbHZpbmdLZXlzKGJ5dGVfYXJyYXkuVG9TdHJpbmcoKSkpOwotICB9Ci19Ci0KLXZvaWQgU2V0QXV0aGVudGljYXRpb25EYXRhKHN0b3JhZ2U6Ok11dGF0aW9uJiBtdXRhdGlvbiwgc3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+IHJlY29yZCwgc3RvcmFnZTo6RGV2aWNlJiBkZXZpY2UpIHsKLSAgZGV2aWNlLlNldElzQXV0aGVudGljYXRlZCgocmVjb3JkLT5Jc0F1dGhlbnRpY2F0ZWQoKSA/IDEgOiAwKSk7Ci0gIGRldmljZS5TZXRJc0VuY3J5cHRpb25SZXF1aXJlZCgocmVjb3JkLT5Jc0VuY3J5cHRpb25SZXF1aXJlZCgpID8gMSA6IDApKTsKLSAgZGV2aWNlLlNldFJlcXVpcmVzTWl0bVByb3RlY3Rpb24ocmVjb3JkLT5SZXF1aXJlc01pdG1Qcm90ZWN0aW9uKCkgPyAxIDogMCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotU2VjdXJpdHlSZWNvcmRTdG9yYWdlOjpTZWN1cml0eVJlY29yZFN0b3JhZ2Uoc3RvcmFnZTo6U3RvcmFnZU1vZHVsZSogc3RvcmFnZV9tb2R1bGUsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKQotICAgIDogc3RvcmFnZV9tb2R1bGVfKHN0b3JhZ2VfbW9kdWxlKSwgaGFuZGxlcl8oaGFuZGxlcikge30KLQotdm9pZCBTZWN1cml0eVJlY29yZFN0b3JhZ2U6OlNhdmVTZWN1cml0eVJlY29yZHMoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+PiogcmVjb3JkcykgewotICBmb3IgKGF1dG8gcmVjb3JkIDogKnJlY29yZHMpIHsKLSAgICBpZiAocmVjb3JkLT5Jc1RlbXBvcmFyeSgpKSBjb250aW51ZTsKLSAgICBzdG9yYWdlOjpEZXZpY2UgZGV2aWNlID0gc3RvcmFnZV9tb2R1bGVfLT5HZXREZXZpY2VCeUNsYXNzaWNNYWNBZGRyZXNzKHJlY29yZC0+R2V0UHNldWRvQWRkcmVzcygpLT5HZXRBZGRyZXNzKCkpOwotICAgIGF1dG8gbXV0YXRpb24gPSBzdG9yYWdlX21vZHVsZV8tPk1vZGlmeSgpOwotCi0gICAgaWYgKHJlY29yZC0+SXNDbGFzc2ljTGlua0tleVZhbGlkKCkgJiYgIXJlY29yZC0+aWRlbnRpdHlfYWRkcmVzc18pIHsKLSAgICAgIG11dGF0aW9uLkFkZChkZXZpY2UuU2V0RGV2aWNlVHlwZShoY2k6OkRldmljZVR5cGU6OkJSX0VEUikpOwotICAgIH0gZWxzZSBpZiAocmVjb3JkLT5Jc0NsYXNzaWNMaW5rS2V5VmFsaWQoKSAmJiByZWNvcmQtPnJlbW90ZV9sdGspIHsKLSAgICAgIG11dGF0aW9uLkFkZChkZXZpY2UuU2V0RGV2aWNlVHlwZShoY2k6OkRldmljZVR5cGU6OkRVQUwpKTsKLSAgICB9IGVsc2UgaWYgKCFyZWNvcmQtPklzQ2xhc3NpY0xpbmtLZXlWYWxpZCgpICYmIHJlY29yZC0+cmVtb3RlX2x0aykgewotICAgICAgbXV0YXRpb24uQWRkKGRldmljZS5TZXREZXZpY2VUeXBlKGhjaTo6RGV2aWNlVHlwZTo6TEUpKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIGRldmljZSB0eXBlIGZyb20gc2VjdXJpdHkgcmVjb3JkIGZvciAnJXMnOyBkcm9wcGluZyEiLAotICAgICAgICAgIHJlY29yZC0+R2V0UHNldWRvQWRkcmVzcygpLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIG11dGF0aW9uLkNvbW1pdCgpOwotICAgIFNldENsYXNzaWNEYXRhKG11dGF0aW9uLCByZWNvcmQsIGRldmljZSk7Ci0gICAgU2V0TGVEYXRhKG11dGF0aW9uLCByZWNvcmQsIGRldmljZSk7Ci0gICAgU2V0QXV0aGVudGljYXRpb25EYXRhKG11dGF0aW9uLCByZWNvcmQsIGRldmljZSk7Ci0gICAgbXV0YXRpb24uQ29tbWl0KCk7Ci0gIH0KLX0KLQotdm9pZCBTZWN1cml0eVJlY29yZFN0b3JhZ2U6OkxvYWRTZWN1cml0eVJlY29yZHMoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+PiogcmVjb3JkcykgewotICBmb3IgKGF1dG8gZGV2aWNlIDogc3RvcmFnZV9tb2R1bGVfLT5HZXRCb25kZWREZXZpY2VzKCkpIHsKLSAgICBhdXRvIGFkZHJlc3NfdHlwZSA9IChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpID09IGhjaTo6RGV2aWNlVHlwZTo6QlJfRURSKSA/IGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGV2aWNlLkxlKCkuR2V0QWRkcmVzc1R5cGUoKTsKLSAgICBhdXRvIGFkZHJlc3Nfd2l0aF90eXBlID0gaGNpOjpBZGRyZXNzV2l0aFR5cGUoZGV2aWNlLkdldEFkZHJlc3MoKSwgKmFkZHJlc3NfdHlwZSk7Ci0KLSAgICBhdXRvIHJlY29yZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4oYWRkcmVzc193aXRoX3R5cGUpOwotICAgIGlmIChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpICE9IGhjaTo6RGV2aWNlVHlwZTo6TEUpIHsKLSAgICAgIHJlY29yZC0+U2V0TGlua0tleShkZXZpY2UuQ2xhc3NpYygpLkdldExpbmtLZXkoKS0+Ynl0ZXMsICpkZXZpY2UuQ2xhc3NpYygpLkdldExpbmtLZXlUeXBlKCkpOwotICAgIH0KLSAgICBpZiAoZGV2aWNlLkdldERldmljZVR5cGUoKSAhPSBoY2k6OkRldmljZVR5cGU6OkJSX0VEUikgewotICAgICAgcmVjb3JkLT5wc2V1ZG9fYWRkcmVzc18gPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8aGNpOjpBZGRyZXNzV2l0aFR5cGU+KAotICAgICAgICAgICpkZXZpY2UuTGUoKS5HZXRMZWdhY3lQc2V1ZG9BZGRyZXNzKCksICpkZXZpY2UuTGUoKS5HZXRBZGRyZXNzVHlwZSgpKTsKLQotICAgICAgaWYgKGRldmljZS5MZSgpLkdldFBlZXJJZCgpKSB7Ci0gICAgICAgIGF1dG8gcGVlcmlkID0gY29tbW9uOjpCeXRlQXJyYXk8MjM+OjpGcm9tU3RyaW5nKCpkZXZpY2UuTGUoKS5HZXRQZWVySWQoKSk7Ci0gICAgICAgIHJlY29yZC0+cmVtb3RlX2lyayA9IHN0ZDo6bWFrZV9vcHRpb25hbDxzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2Pj4oKTsKLSAgICAgICAgc3RkOjpjb3B5X24ocGVlcmlkLT5kYXRhKCksIHJlY29yZC0+cmVtb3RlX2lyay0+c2l6ZSgpLCByZWNvcmQtPnJlbW90ZV9pcmstPmRhdGEoKSk7Ci0KLSAgICAgICAgdWludDhfdCBpZGFkZHJlc3NfdHlwZTsKLSAgICAgICAgaGNpOjpBZGRyZXNzIGlkYWRkcmVzczsKLSAgICAgICAgc3RkOjpjb3B5X24ocGVlcmlkLT5kYXRhKCkgKyAxNiwgMSwgJmlkYWRkcmVzc190eXBlKTsKLSAgICAgICAgc3RkOjpjb3B5X24ocGVlcmlkLT5kYXRhKCkgKyAxNywgNiwgaWRhZGRyZXNzLmRhdGEoKSk7Ci0gICAgICAgIHJlY29yZC0+aWRlbnRpdHlfYWRkcmVzc18gPQotICAgICAgICAgICAgc3RkOjptYWtlX29wdGlvbmFsPGhjaTo6QWRkcmVzc1dpdGhUeXBlPihpZGFkZHJlc3MsIHN0YXRpY19jYXN0PGhjaTo6QWRkcmVzc1R5cGU+KGlkYWRkcmVzc190eXBlKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZXZpY2UuTGUoKS5HZXRQZWVyRW5jcnlwdGlvbktleXMoKSkgewotICAgICAgICBhdXRvIHBlZXJfZW5jcnlwdGlvbl9rZXlzID0gY29tbW9uOjpCeXRlQXJyYXk8Mjg+OjpGcm9tU3RyaW5nKCpkZXZpY2UuTGUoKS5HZXRQZWVyRW5jcnlwdGlvbktleXMoKSk7Ci0gICAgICAgIHJlY29yZC0+cmVtb3RlX2x0ayA9IHN0ZDo6bWFrZV9vcHRpb25hbDxzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2Pj4oKTsKLSAgICAgICAgcmVjb3JkLT5yZW1vdGVfcmFuZCA9IHN0ZDo6bWFrZV9vcHRpb25hbDxzdGQ6OmFycmF5PHVpbnQ4X3QsIDg+PigpOwotICAgICAgICByZWNvcmQtPnJlbW90ZV9lZGl2ID0gc3RkOjptYWtlX29wdGlvbmFsKDApOwotCi0gICAgICAgIHN0ZDo6Y29weV9uKHBlZXJfZW5jcnlwdGlvbl9rZXlzLT5kYXRhKCksIDE2LCByZWNvcmQtPnJlbW90ZV9sdGstPmRhdGEoKSk7Ci0gICAgICAgIHN0ZDo6Y29weV9uKHBlZXJfZW5jcnlwdGlvbl9rZXlzLT5kYXRhKCkgKyAxNiwgOCwgcmVjb3JkLT5yZW1vdGVfcmFuZC0+ZGF0YSgpKTsKLSAgICAgICAgc3RkOjpjb3B5X24ocGVlcl9lbmNyeXB0aW9uX2tleXMtPmRhdGEoKSArIDI0LCAyLCAmKCpyZWNvcmQtPnJlbW90ZV9lZGl2KSk7Ci0gICAgICAgIHJlY29yZC0+c2VjdXJpdHlfbGV2ZWwgPSBwZWVyX2VuY3J5cHRpb25fa2V5cy0+ZGF0YSgpWzI2XTsKLSAgICAgICAgcmVjb3JkLT5rZXlfc2l6ZSA9IHBlZXJfZW5jcnlwdGlvbl9rZXlzLT5kYXRhKClbMjddOwotICAgICAgfQotCi0gICAgICBpZiAoZGV2aWNlLkxlKCkuR2V0UGVlclNpZ25hdHVyZVJlc29sdmluZ0tleXMoKSkgewotICAgICAgICBhdXRvIHBlZXJfc2lnbmF0dXJlX3Jlc29sdmluZ19rZXlzID0KLSAgICAgICAgICAgIGNvbW1vbjo6Qnl0ZUFycmF5PDIxPjo6RnJvbVN0cmluZygqZGV2aWNlLkxlKCkuR2V0UGVlclNpZ25hdHVyZVJlc29sdmluZ0tleXMoKSk7Ci0gICAgICAgIHJlY29yZC0+cmVtb3RlX3NpZ25hdHVyZV9rZXkgPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8c3RkOjphcnJheTx1aW50OF90LCAxNj4+KCk7Ci0KLSAgICAgICAgc3RkOjpjb3B5X24ocGVlcl9zaWduYXR1cmVfcmVzb2x2aW5nX2tleXMtPmRhdGEoKSArIDQsIDE2LCByZWNvcmQtPnJlbW90ZV9zaWduYXR1cmVfa2V5LT5kYXRhKCkpOwotICAgICAgICByZWNvcmQtPnNlY3VyaXR5X2xldmVsID0gcGVlcl9zaWduYXR1cmVfcmVzb2x2aW5nX2tleXMtPmRhdGEoKVsyMF07Ci0gICAgICB9Ci0gICAgfQotICAgIHJlY29yZC0+U2V0SXNFbmNyeXB0aW9uUmVxdWlyZWQoZGV2aWNlLkdldElzRW5jcnlwdGlvblJlcXVpcmVkKCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0gICAgcmVjb3JkLT5TZXRBdXRoZW50aWNhdGVkKGRldmljZS5HZXRJc0F1dGhlbnRpY2F0ZWQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLSAgICByZWNvcmQtPlNldFJlcXVpcmVzTWl0bVByb3RlY3Rpb24oZGV2aWNlLkdldFJlcXVpcmVzTWl0bVByb3RlY3Rpb24oKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLSAgICByZWNvcmRzLT5pbnNlcnQocmVjb3JkKTsKLSAgfQotfQotCi12b2lkIFNlY3VyaXR5UmVjb3JkU3RvcmFnZTo6UmVtb3ZlRGV2aWNlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpIHsKLSAgc3RvcmFnZTo6RGV2aWNlIGRldmljZSA9IHN0b3JhZ2VfbW9kdWxlXy0+R2V0RGV2aWNlQnlDbGFzc2ljTWFjQWRkcmVzcyhhZGRyZXNzLkdldEFkZHJlc3MoKSk7Ci0gIGF1dG8gbXV0YXRpb24gPSBzdG9yYWdlX21vZHVsZV8tPk1vZGlmeSgpOwotICBtdXRhdGlvbi5BZGQoZGV2aWNlLlJlbW92ZUZyb21Db25maWcoKSk7Ci0gIG11dGF0aW9uLkNvbW1pdCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcmVjb3JkCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3JlY29yZC9zZWN1cml0eV9yZWNvcmRfc3RvcmFnZS5oIGIvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZF9zdG9yYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDRiYWQuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZF9zdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdXRpbHMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9jbGFzc2ljX2RldmljZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbGVfZGV2aWNlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9zdG9yYWdlX21vZHVsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1uYW1lc3BhY2UgcmVjb3JkIHsKLQotI2lmIGRlZmluZWQoT1NfR0VORVJJQykKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfRklMRV9QQVRIID0gImJ0X2NvbmZpZy5jb25mIjsKLSNlbHNlICAgLy8gIWRlZmluZWQoT1NfR0VORVJJQykKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfRklMRV9QQVRIID0gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIjsKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19HRU5FUklDKQotCi1jbGFzcyBTZWN1cml0eVJlY29yZFN0b3JhZ2UgewotIHB1YmxpYzoKLSAgU2VjdXJpdHlSZWNvcmRTdG9yYWdlKHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGUqIHN0b3JhZ2VfbW9kdWxlLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgLyoqCi0gICAqIEl0ZXJhdGVzIHRocm91Z2ggZ2l2ZW4gdmVjdG9yIGFuZCBzdG9yZXMgZWFjaCByZWNvcmQncyBtZXRhZGF0YSB0byBkaXNrLgotICAgKgotICAgKiA8cD5Kb2IgZ2V0cyBwb3N0ZWQgdG8gdGhlIEhhbmRsZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWNvcmRzIHNldCBvZiBzaGFyZWQgcG9pbnRlcnMgdG8gcmVjb3Jkcy4KLSAgICovCi0gIHZvaWQgU2F2ZVNlY3VyaXR5UmVjb3JkcyhzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4+KiByZWNvcmRzKTsKLQotICAvKioKLSAgICogUmVhZHMgdGhlIHJlY29yZCBtZXRhZGF0YSBmcm9tIGRpc2sgYW5kIGNvbnZlcnRzIGVhY2ggaXRlbSBpbnRvIGEgU2VjdXJpdHlSZWNvcmQuCi0gICAqCi0gICAqIDxwPkpvYiBnZXRzIHBvc3RlZCB0byB0aGUgSGFuZGxlci4KLSAgICoKLSAgICogQHBhcmFtIHJlY29yZHMgc2V0IG9mIHNoYXJlZCBwb2ludGVycyB0byByZWNvcmRzLgotICAgKi8KLSAgdm9pZCBMb2FkU2VjdXJpdHlSZWNvcmRzKHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPj4qIHJlY29yZHMpOwotCi0gIC8qKgotICAgKiBSZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHN0b3JhZ2UKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3Mgb2YgZGV2aWNlIHRvIHJlbW92ZQotICAgKi8KLSAgdm9pZCBSZW1vdmVEZXZpY2UoaGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcyk7Ci0KLSBwcml2YXRlOgotICBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZV8gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSByZWNvcmQKLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvcmVjb3JkL3NlY3VyaXR5X3JlY29yZF9zdG9yYWdlX3Rlc3QuY2MgYi9nZC9zZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2VfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxYjc0OC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2VfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSNpbmNsdWRlICJzZWN1cml0eS9yZWNvcmQvc2VjdXJpdHlfcmVjb3JkX3N0b3JhZ2UuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzZWN1cml0eS90ZXN0L2Zha2Vfc3RvcmFnZV9tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotbmFtZXNwYWNlIHJlY29yZCB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBESVNBQkxFRF9TZWN1cml0eVJlY29yZFN0b3JhZ2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIC8vIE1ha2UgRmFrZSBzdG9yYWdlIG1vZHVsZQotICAgIHN0b3JhZ2VfbW9kdWxlXyA9IG5ldyBGYWtlU3RvcmFnZU1vZHVsZSgpOwotCi0gICAgLy8gSW5qZWN0Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmc3RvcmFnZTo6U3RvcmFnZU1vZHVsZTo6RmFjdG9yeSwgc3RvcmFnZV9tb2R1bGVfKTsKLQotICAgIC8vIE1ha2Ugc3RvcmFnZQotICAgIHJlY29yZF9zdG9yYWdlXyA9IG5ldyByZWNvcmQ6OlNlY3VyaXR5UmVjb3JkU3RvcmFnZShzdG9yYWdlX21vZHVsZV8sIGhhbmRsZXJfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgc3luY2hyb25pemUoKTsKLSAgICBmYWtlX3JlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gICAgZGVsZXRlIHJlY29yZF9zdG9yYWdlXzsKLSAgfQotCi0gIHZvaWQgc3luY2hyb25pemUoKSB7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3luY2hyb25pemVNb2R1bGVIYW5kbGVyKCZGYWtlU3RvcmFnZU1vZHVsZTo6RmFjdG9yeSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpOwotICB9Ci0KLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IGZha2VfcmVnaXN0cnlfOwotICBvczo6VGhyZWFkJiB0aHJlYWRfID0gZmFrZV9yZWdpc3RyeV8uR2V0VGVzdFRocmVhZCgpOwotICBvczo6SGFuZGxlciogaGFuZGxlcl8gPSBudWxscHRyOwotICBGYWtlU3RvcmFnZU1vZHVsZSogc3RvcmFnZV9tb2R1bGVfOwotICByZWNvcmQ6OlNlY3VyaXR5UmVjb3JkU3RvcmFnZSogcmVjb3JkX3N0b3JhZ2VfOwotfTsKLQotVEVTVF9GKERJU0FCTEVEX1NlY3VyaXR5UmVjb3JkU3RvcmFnZVRlc3QsIHNldHVwX3RlYXJkb3duKSB7fQotCi1URVNUX0YoRElTQUJMRURfU2VjdXJpdHlSZWNvcmRTdG9yYWdlVGVzdCwgc3RvcmVfc2VjdXJpdHlfcmVjb3JkKSB7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSgKLSAgICAgIGhjaTo6QWRkcmVzcyh7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn0pLCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHsKLSAgICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB9OwotICBzdGQ6OnNoYXJlZF9wdHI8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4gcmVjb3JkID0gc3RkOjptYWtlX3NoYXJlZDxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPihyZW1vdGUpOwotCi0gIHJlY29yZC0+U2V0TGlua0tleShsaW5rX2tleSwgaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTik7Ci0gIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPj4gcmVjb3JkX3NldDsKLSAgcmVjb3JkX3NldC5pbnNlcnQocmVjb3JkKTsKLSAgcmVjb3JkX3N0b3JhZ2VfLT5TYXZlU2VjdXJpdHlSZWNvcmRzKCZyZWNvcmRfc2V0KTsKLQotICBhdXRvIGRldmljZSA9IHN0b3JhZ2VfbW9kdWxlXy0+R2V0RGV2aWNlQnlDbGFzc2ljTWFjQWRkcmVzcyhyZW1vdGUuR2V0QWRkcmVzcygpKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLkdldERldmljZVR5cGUoKSk7Ci0gIEFTU0VSVF9FUShkZXZpY2UuQ2xhc3NpYygpLkdldExpbmtLZXlUeXBlKCksIHJlY29yZC0+R2V0S2V5VHlwZSgpKTsKLSAgaW50IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIEFTU0VSVF9FUShsaW5rX2tleVtpXSwgZGV2aWNlLkNsYXNzaWMoKS5HZXRMaW5rS2V5KCktPmJ5dGVzW2ldKTsKLSAgfQotfQotCi1URVNUX0YoRElTQUJMRURfU2VjdXJpdHlSZWNvcmRTdG9yYWdlVGVzdCwgc3RvcmVfbGVfc2VjdXJpdHlfcmVjb3JkKSB7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGlkZW50aXR5X2FkZHJlc3MoCi0gICAgICBoY2k6OkFkZHJlc3MoezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9KSwgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gcmVtb3RlX2x0a3sKLSAgICAgIDB4MDcsIDB4MGMsIDB4MGUsIDB4MTYsIDB4MTgsIDB4NTUsIDB4YzYsIDB4NzIsIDB4NjQsIDB4NWEsIDB4ZDgsIDB4YjEsIDB4ZjYsIDB4OTMsIDB4OTQsIDB4YTd9OwotICB1aW50MTZfdCByZW1vdGVfZWRpdiA9IDB4Mjg7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4gcmVtb3RlX3JhbmR7MHg0OCwgMHhhYywgMHg5MSwgMHhmNCwgMHhlZiwgMHg2ZCwgMHg0MSwgMHgxMH07Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IHJlbW90ZV9pcmt7Ci0gICAgICAweDY2LCAweDkwLCAweDQwLCAweDc2LCAweDI3LCAweDY5LCAweDU3LCAweDcxLCAweDBkLCAweDM5LCAweGY3LCAweDgwLCAweDllLCAweDJmLCAweDQ5LCAweGNmfTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gcmVtb3RlX3NpZ25hdHVyZV9rZXl7Ci0gICAgICAweDA4LCAweDgzLCAweGFlLCAweDQ0LCAweGQ2LCAweDc3LCAweDllLCAweDkwLCAweDFkLCAweDI1LCAweGNkLCAweGQ3LCAweGI2LCAweGY0LCAweDU3LCAweDg1fTsKLSAgc3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+IHJlY29yZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4oaWRlbnRpdHlfYWRkcmVzcyk7Ci0KLSAgcmVjb3JkLT5pZGVudGl0eV9hZGRyZXNzXyA9IGlkZW50aXR5X2FkZHJlc3M7Ci0gIHJlY29yZC0+cmVtb3RlX2x0ayA9IHJlbW90ZV9sdGs7Ci0gIHJlY29yZC0+a2V5X3NpemUgPSAxNjsKLSAgcmVjb3JkLT5zZWN1cml0eV9sZXZlbCA9IDI7Ci0gIHJlY29yZC0+cmVtb3RlX2VkaXYgPSByZW1vdGVfZWRpdjsKLSAgcmVjb3JkLT5yZW1vdGVfcmFuZCA9IHJlbW90ZV9yYW5kOwotICByZWNvcmQtPnJlbW90ZV9pcmsgPSByZW1vdGVfaXJrOwotICByZWNvcmQtPnJlbW90ZV9zaWduYXR1cmVfa2V5ID0gcmVtb3RlX3NpZ25hdHVyZV9rZXk7Ci0KLSAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+PiByZWNvcmRfc2V0OwotICByZWNvcmRfc2V0Lmluc2VydChyZWNvcmQpOwotICByZWNvcmRfc3RvcmFnZV8tPlNhdmVTZWN1cml0eVJlY29yZHMoJnJlY29yZF9zZXQpOwotCi0gIGF1dG8gZGV2aWNlID0gc3RvcmFnZV9tb2R1bGVfLT5HZXREZXZpY2VCeUNsYXNzaWNNYWNBZGRyZXNzKGlkZW50aXR5X2FkZHJlc3MuR2V0QWRkcmVzcygpKTsKLSAgQVNTRVJUX0VRKGhjaTo6RGV2aWNlVHlwZTo6TEUsIGRldmljZS5HZXREZXZpY2VUeXBlKCkpOwotICBBU1NFUlRfRVEoZGV2aWNlLkxlKCkuR2V0QWRkcmVzc1R5cGUoKSwgaWRlbnRpdHlfYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpKTsKLQotICAvLyBJUkssIGFkZHJlc3MgdHlwZSwgYW5kIGFkZHJlc3MgZ2x1ZWQgdG9nZXRoZXIKLSAgQVNTRVJUX0VRKCpkZXZpY2UuTGUoKS5HZXRQZWVySWQoKSwgIjY2OTA0MDc2Mjc2OTU3NzEwZDM5Zjc4MDllMmY0OWNmMDEwMTAyMDMwNDA1MDYiKTsKLQotICAvLyBMVEssIFJBTkQsIEVESVYgYW5kIHNlYyBsZXZlbCBnbHVlZCB0b2dldGhlcgotICBBU1NFUlRfRVEoKmRldmljZS5MZSgpLkdldFBlZXJFbmNyeXB0aW9uS2V5cygpLCAiMDcwYzBlMTYxODU1YzY3MjY0NWFkOGIxZjY5Mzk0YTc0OGFjOTFmNGVmNmQ0MTEwMjgwMDAyMTAiKTsKLQotICAvLyBDb3VudGVyLCBzaWduYXR1cmUga2V5LCBhbmQgc2VjdXJpdHkgbGV2ZWwgZ2x1ZWQgdG9nZXRoZXIKLSAgQVNTRVJUX0VRKGRldmljZS5MZSgpLkdldFBlZXJTaWduYXR1cmVSZXNvbHZpbmdLZXlzKCksICIwMDAwMDAwMDA4ODNhZTQ0ZDY3NzllOTAxZDI1Y2RkN2I2ZjQ1Nzg1MDIiKTsKLX0KLQotVEVTVF9GKERJU0FCTEVEX1NlY3VyaXR5UmVjb3JkU3RvcmFnZVRlc3QsIGxvYWRfc2VjdXJpdHlfcmVjb3JkKSB7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSgKLSAgICAgIGhjaTo6QWRkcmVzcyh7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn0pLCBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsaW5rX2tleSA9IHsKLSAgICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB9OwotICBzdGQ6OnNoYXJlZF9wdHI8cmVjb3JkOjpTZWN1cml0eVJlY29yZD4gcmVjb3JkID0gc3RkOjptYWtlX3NoYXJlZDxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPihyZW1vdGUpOwotCi0gIHJlY29yZC0+U2V0TGlua0tleShsaW5rX2tleSwgaGNpOjpLZXlUeXBlOjpERUJVR19DT01CSU5BVElPTik7Ci0gIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPj4gcmVjb3JkX3NldDsKLSAgcmVjb3JkX3NldC5pbnNlcnQocmVjb3JkKTsKLSAgcmVjb3JkX3N0b3JhZ2VfLT5TYXZlU2VjdXJpdHlSZWNvcmRzKCZyZWNvcmRfc2V0KTsKLQotICBhdXRvIGRldmljZSA9IHN0b3JhZ2VfbW9kdWxlXy0+R2V0RGV2aWNlQnlDbGFzc2ljTWFjQWRkcmVzcyhyZW1vdGUuR2V0QWRkcmVzcygpKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLkdldERldmljZVR5cGUoKSk7Ci0KLSAgQVNTRVJUX0VRKGRldmljZS5DbGFzc2ljKCkuR2V0TGlua0tleVR5cGUoKSwgcmVjb3JkLT5HZXRLZXlUeXBlKCkpOwotICBpbnQgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgQVNTRVJUX0VRKGxpbmtfa2V5W2ldLCBkZXZpY2UuQ2xhc3NpYygpLkdldExpbmtLZXkoKS0+Ynl0ZXNbaV0pOwotICB9Ci0KLSAgcmVjb3JkX3NldC5jbGVhcigpOwotICByZWNvcmRfc3RvcmFnZV8tPkxvYWRTZWN1cml0eVJlY29yZHMoJnJlY29yZF9zZXQpOwotICByZWNvcmQgPSAqcmVjb3JkX3NldC5iZWdpbigpOwotICBsaW5rX2tleSA9IHJlY29yZC0+R2V0TGlua0tleSgpOwotCi0gIEFTU0VSVF9FUShkZXZpY2UuQ2xhc3NpYygpLkdldExpbmtLZXlUeXBlKCksIHJlY29yZC0+R2V0S2V5VHlwZSgpKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLkdldERldmljZVR5cGUoKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgQVNTRVJUX0VRKGxpbmtfa2V5W2ldLCBkZXZpY2UuQ2xhc3NpYygpLkdldExpbmtLZXkoKS0+Ynl0ZXNbaV0pOwotICB9Ci19Ci0KLVRFU1RfRihESVNBQkxFRF9TZWN1cml0eVJlY29yZFN0b3JhZ2VUZXN0LCBkb250X3NhdmVfdGVtcG9yYXJ5X3JlY29yZHMpIHsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlKAotICAgICAgaGNpOjpBZGRyZXNzKHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fSksIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxpbmtfa2V5ID0gewotICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPiByZWNvcmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+KHJlbW90ZSk7Ci0KLSAgcmVjb3JkLT5TZXRMaW5rS2V5KGxpbmtfa2V5LCBoY2k6OktleVR5cGU6OkRFQlVHX0NPTUJJTkFUSU9OKTsKLSAgcmVjb3JkLT5TZXRJc1RlbXBvcmFyeSh0cnVlKTsKLSAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+PiByZWNvcmRfc2V0OwotICByZWNvcmRfc2V0Lmluc2VydChyZWNvcmQpOwotICByZWNvcmRfc3RvcmFnZV8tPlNhdmVTZWN1cml0eVJlY29yZHMoJnJlY29yZF9zZXQpOwotCi0gIGF1dG8gZGV2aWNlID0gc3RvcmFnZV9tb2R1bGVfLT5HZXREZXZpY2VCeUNsYXNzaWNNYWNBZGRyZXNzKHJlbW90ZS5HZXRBZGRyZXNzKCkpOwotICBBU1NFUlRfRkFMU0UoZGV2aWNlLkdldERldmljZVR5cGUoKSk7Ci0KLSAgcmVjb3JkX3NldC5jbGVhcigpOwotICByZWNvcmRfc3RvcmFnZV8tPkxvYWRTZWN1cml0eVJlY29yZHMoJnJlY29yZF9zZXQpOwotICBBU1NFUlRfRVEocmVjb3JkX3NldC5zaXplKCksIDApOwotfQotCi1URVNUX0YoRElTQUJMRURfU2VjdXJpdHlSZWNvcmRTdG9yYWdlVGVzdCwgdGVzdF9yZW1vdmUpIHsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlKAotICAgICAgaGNpOjpBZGRyZXNzKHsweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fSksIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGxpbmtfa2V5ID0gewotICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxyZWNvcmQ6OlNlY3VyaXR5UmVjb3JkPiByZWNvcmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+KHJlbW90ZSk7Ci0KLSAgcmVjb3JkLT5TZXRMaW5rS2V5KGxpbmtfa2V5LCBoY2k6OktleVR5cGU6OkRFQlVHX0NPTUJJTkFUSU9OKTsKLSAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPHJlY29yZDo6U2VjdXJpdHlSZWNvcmQ+PiByZWNvcmRfc2V0OwotICByZWNvcmRfc2V0Lmluc2VydChyZWNvcmQpOwotICByZWNvcmRfc3RvcmFnZV8tPlNhdmVTZWN1cml0eVJlY29yZHMoJnJlY29yZF9zZXQpOwotCi0gIGF1dG8gZGV2aWNlID0gc3RvcmFnZV9tb2R1bGVfLT5HZXREZXZpY2VCeUNsYXNzaWNNYWNBZGRyZXNzKHJlbW90ZS5HZXRBZGRyZXNzKCkpOwotICBBU1NFUlRfVFJVRShkZXZpY2UuR2V0RGV2aWNlVHlwZSgpKTsKLQotICBBU1NFUlRfRVEoZGV2aWNlLkNsYXNzaWMoKS5HZXRMaW5rS2V5VHlwZSgpLCByZWNvcmQtPkdldEtleVR5cGUoKSk7Ci0gIGludCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBBU1NFUlRfRVEobGlua19rZXlbaV0sIGRldmljZS5DbGFzc2ljKCkuR2V0TGlua0tleSgpLT5ieXRlc1tpXSk7Ci0gIH0KLQotICByZWNvcmRfc3RvcmFnZV8tPlJlbW92ZURldmljZShyZW1vdGUpOwotCi0gIHJlY29yZF9zZXQuY2xlYXIoKTsKLSAgcmVjb3JkX3N0b3JhZ2VfLT5Mb2FkU2VjdXJpdHlSZWNvcmRzKCZyZWNvcmRfc2V0KTsKLSAgQVNTRVJUX0VRKHJlY29yZF9zZXQuc2l6ZSgpLCAwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgcmVjb3JkCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXIuY2MgYi9nZC9zZWN1cml0eS9zZWN1cml0eV9tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTcxMWFlLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI2luY2x1ZGUgInNlY3VyaXR5X21hbmFnZXIuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLS8vIERlZmluaXRpb24gb2YgUHVyZSBWaXJ0dWFsIERlc3RydWN0b3IKLUlTZWN1cml0eU1hbmFnZXJMaXN0ZW5lcjo6fklTZWN1cml0eU1hbmFnZXJMaXN0ZW5lcigpIHt9Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyOjpJbml0KCkgewotICBzZWN1cml0eV9oYW5kbGVyXy0+UG9zdCgKLSAgICAgIGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpJbml0LCBjb21tb246OlVucmV0YWluZWQoc2VjdXJpdHlfbWFuYWdlcl9pbXBsXykpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OkNyZWF0ZUJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpDcmVhdGVCb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8aGNpOjpBZGRyZXNzV2l0aFR5cGU+KGRldmljZSkpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OkNyZWF0ZUJvbmRPdXRPZkJhbmQoCi0gICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlLCBwYWlyaW5nOjpPb2JEYXRhIHJlbW90ZV9wMTkyX29vYl9kYXRhLCBwYWlyaW5nOjpPb2JEYXRhIHJlbW90ZV9wMjU2X29vYl9kYXRhKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OkNyZWF0ZUJvbmRPdXRPZkJhbmQsCi0gICAgICBjb21tb246OlVucmV0YWluZWQoc2VjdXJpdHlfbWFuYWdlcl9pbXBsXyksCi0gICAgICBzdGQ6OmZvcndhcmQ8aGNpOjpBZGRyZXNzV2l0aFR5cGU+KGRldmljZSksCi0gICAgICByZW1vdGVfcDE5Ml9vb2JfZGF0YSwKLSAgICAgIHJlbW90ZV9wMjU2X29vYl9kYXRhKSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyOjpHZXRPdXRPZkJhbmREYXRhKGNoYW5uZWw6OlNlY3VyaXR5Q29tbWFuZFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OkdldE91dE9mQmFuZERhdGEsCi0gICAgICBjb21tb246OlVucmV0YWluZWQoc2VjdXJpdHlfbWFuYWdlcl9pbXBsXyksCi0gICAgICBzdGQ6OmZvcndhcmQ8Y2hhbm5lbDo6U2VjdXJpdHlDb21tYW5kU3RhdHVzQ2FsbGJhY2s+KGNhbGxiYWNrKSkpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6Q3JlYXRlQm9uZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgewotICBzZWN1cml0eV9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6Q3JlYXRlQm9uZExlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8aGNpOjpBZGRyZXNzV2l0aFR5cGU+KGRldmljZSkpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OkNhbmNlbEJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpDYW5jZWxCb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8aGNpOjpBZGRyZXNzV2l0aFR5cGU+KGRldmljZSkpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OlJlbW92ZUJvbmQoaGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpSZW1vdmVCb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8aGNpOjpBZGRyZXNzV2l0aFR5cGU+KGRldmljZSkpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OlNldFVzZXJJbnRlcmZhY2VIYW5kbGVyKFVJKiB1c2VyX2ludGVyZmFjZSwgb3M6OkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6OlNldFVzZXJJbnRlcmZhY2VIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwgdXNlcl9pbnRlcmZhY2UsIGhhbmRsZXIpKTsKLX0KLQotLy8gVE9ETyhqcGF3bG93c2tpKTogcmVtb3ZlIG9uY2Ugd2UgaGF2ZSBjb25maWcgZmlsZSBhYnN0cmFjdGlvbiBpbiBjZXJ0IHRlc3RzCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6U2V0TGVJbml0aWF0b3JBZGRyZXNzUG9saWN5Rm9yVGVzdCgKLSAgICBoY2k6OkxlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3kgYWRkcmVzc19wb2xpY3ksCi0gICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZml4ZWRfYWRkcmVzcywKLSAgICBjcnlwdG9fdG9vbGJveDo6T2N0ZXQxNiByb3RhdGlvbl9pcmssCi0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtaW5pbXVtX3JvdGF0aW9uX3RpbWUsCi0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6U2V0TGVJbml0aWF0b3JBZGRyZXNzUG9saWN5Rm9yVGVzdCwKLSAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwKLSAgICAgIGFkZHJlc3NfcG9saWN5LAotICAgICAgZml4ZWRfYWRkcmVzcywKLSAgICAgIHJvdGF0aW9uX2lyaywKLSAgICAgIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgIG1heGltdW1fcm90YXRpb25fdGltZSkpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6UmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKElTZWN1cml0eU1hbmFnZXJMaXN0ZW5lciogbGlzdGVuZXIsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIHNlY3VyaXR5X2hhbmRsZXJfLT5Qb3N0KGNvbW1vbjo6QmluZE9uY2UoJmludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsOjpSZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8pLCBsaXN0ZW5lciwgaGFuZGxlcikpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6VW5yZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIoSVNlY3VyaXR5TWFuYWdlckxpc3RlbmVyKiBsaXN0ZW5lcikgewotICBzZWN1cml0eV9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6VW5yZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8pLCBsaXN0ZW5lcikpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6T25QYWlyaW5nUHJvbXB0QWNjZXB0ZWQoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgYm9vbCBjb25maXJtZWQpIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6Ok9uUGFpcmluZ1Byb21wdEFjY2VwdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwgYWRkcmVzcywgY29uZmlybWVkKSk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyOjpPbkNvbmZpcm1ZZXNObyhjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBib29sIGNvbmZpcm1lZCkgewotICBzZWN1cml0eV9oYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6T25Db25maXJtWWVzTm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8pLCBhZGRyZXNzLCBjb25maXJtZWQpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6Ok9uUGFzc2tleUVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGw6Ok9uUGFzc2tleUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKSwgYWRkcmVzcywgcGFzc2tleSkpOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6T25QaW5FbnRyeShjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwaW4pIHsKLSAgc2VjdXJpdHlfaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICZpbnRlcm5hbDo6U2VjdXJpdHlNYW5hZ2VySW1wbDo6T25QaW5FbnRyeSwgY29tbW9uOjpVbnJldGFpbmVkKHNlY3VyaXR5X21hbmFnZXJfaW1wbF8pLCBhZGRyZXNzLCBzdGQ6Om1vdmUocGluKSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXIuaCBiL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3Y2MyYS4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9zZWN1cml0eV9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJoY2kvbGVfYWRkcmVzc19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvaW50ZXJuYWwvc2VjdXJpdHlfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZy9vb2JfZGF0YS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXJfbGlzdGVuZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi0vKioKLSAqIE1hbmFnZXMgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMsIHBhaXJpbmcsIGJvbmRpbmcgb2YgZGV2aWNlcywgYW5kIHRoZQotICogZW5jcnlwdGlvbi9kZWNyeXB0aW9uIG9mIGNvbW11bmljYXRpb25zLgotICovCi1jbGFzcyBTZWN1cml0eU1hbmFnZXIgOiBwdWJsaWMgVUlDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgZnJpZW5kIGNsYXNzIFNlY3VyaXR5TW9kdWxlOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBzZWN1cml0eSByZWNvcmQgbWFwIGZyb20gYW4gaW50ZXJuYWwgZGV2aWNlIGRhdGFiYXNlLgotICAgKi8KLSAgdm9pZCBJbml0KCk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlcyBib25kIG92ZXIgQ2xhc3NpYyB0cmFuc3BvcnQgd2l0aCBkZXZpY2UsIGlmIG5vdCBib25kZWQgeWV0LgotICAgKgotICAgKiBUaGlzIHdpbGwgaW5pdGlhdGUgdGhlIE51bWVyaWMgQ29tcGFyaXNvbiBib25kaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBkZXZpY2UgYWRkcmVzcyB3ZSB3YW50IHRvIGJvbmQgd2l0aAotICAgKi8KLSAgdm9pZCBDcmVhdGVCb25kKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBJbml0aWF0ZXMgYm9uZCBvdmVyIENsYXNzaWMgdHJhbnNwb3J0IHdpdGggZGV2aWNlLCBpZiBub3QgYm9uZGVkIHlldC4KLSAgICoKLSAgICogVGhpcyB3aWxsIGluaXRpYXRlIHRoZSBPdXQgb2YgQmFuZCBib25kaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBkZXZpY2UgYWRkcmVzcyB3ZSB3YW50IHRvIGJvbmQgd2l0aAotICAgKiBAcGFyYW0gcmVtb3RlX3AxOTJfb29iX2RhdGEgY29tcGFyaXNvbiBhbmQgcmFuZG9tIGZvciBwMTkyCi0gICAqIEBwYXJhbSByZW1vdGVfcDI1Nl9vb2JfZGF0YSBjb21wYXJpc29uIGFuZCByYW5kb20gZm9yIHAyNTYKLSAgICovCi0gIHZvaWQgQ3JlYXRlQm9uZE91dE9mQmFuZCgKLSAgICAgIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MsIHBhaXJpbmc6Ok9vYkRhdGEgcmVtb3RlX3AxOTJfb29iX2RhdGEsIHBhaXJpbmc6Ok9vYkRhdGEgcmVtb3RlX3AyNTZfb29iX2RhdGEpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG91dCBvZiBiYW5kIGRhdGEgZnJvbSB0aGUgY29udHJvbGxlciB0byBzZW5kIHRvIGFub3RoZXIgZGV2aWNlCi0gICAqCi0gICAqIEBwYXJhbSBjYWxsYmFjayBwb2ludGVyIHRvIGNhbGxiYWNrIHVzZWQgZm9yIG5vdGlmeWluZyB0aGF0IGEgc2VjdXJpdHkgSENJIGNvbW1hbmQgY29tcGxldGVkCi0gICAqLwotICB2b2lkIEdldE91dE9mQmFuZERhdGEoY2hhbm5lbDo6U2VjdXJpdHlDb21tYW5kU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBJbml0aWF0ZXMgYm9uZCBvdmVyIExvdyBFbmVyZ3kgdHJhbnNwb3J0IHdpdGggZGV2aWNlLCBpZiBub3QgYm9uZGVkIHlldC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFkZHJlc3Mgd2Ugd2FudCB0byBib25kIHdpdGgKLSAgICovCi0gIHZvaWQgQ3JlYXRlQm9uZExlKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBDYW5jZWxzIHRoZSBwYWlyaW5nIHByb2Nlc3MgZm9yIHRoaXMgZGV2aWNlLgotICAgKgotICAgKiBAcGFyYW0gZGV2aWNlIHBvaW50ZXIgdG8gZGV2aWNlIHdpdGggd2hpY2ggd2Ugd2FudCB0byBjYW5jZWwgb3VyIGJvbmQKLSAgICovCi0gIHZvaWQgQ2FuY2VsQm9uZChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpOwotCi0gIC8qKgotICAgKiBEaXNhc3NvY2lhdGVzIHRoZSBkZXZpY2UgYW5kIHJlbW92ZXMgdGhlIHBlcnNpc3RlbnQgTFRLCi0gICAqCi0gICAqIEBwYXJhbSBkZXZpY2UgcG9pbnRlciB0byBkZXZpY2Ugd2Ugd2FudCB0byBmb3JnZXQKLSAgICovCi0gIHZvaWQgUmVtb3ZlQm9uZChoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpOwotCi0gIC8qKgotICAgKiBSZWdpc3RlciBTZWN1cml0eSBVSSBoYW5kbGVyLCBmb3IgaGFuZGxpbmcgcHJvbXB0cyBhcm91bmQgdGhlIFBhaXJpbmcgcHJvY2Vzcy4KLSAgICovCi0gIHZvaWQgU2V0VXNlckludGVyZmFjZUhhbmRsZXIoVUkqIHVzZXJfaW50ZXJmYWNlLCBvczo6SGFuZGxlciogaGFuZGxlcik7Ci0KLSAgLyoqCi0gICAqIFNwZWNpZnkgdGhlIGluaXRpYXRvciBhZGRyZXNzIHBvbGljeSB1c2VkIGZvciBMRSB0cmFuc3BvcnQuIENhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLgotICAgKi8KLSAgdm9pZCBTZXRMZUluaXRpYXRvckFkZHJlc3NQb2xpY3lGb3JUZXN0KAotICAgICAgaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5LAotICAgICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZml4ZWRfYWRkcmVzcywKLSAgICAgIGNyeXB0b190b29sYm94OjpPY3RldDE2IHJvdGF0aW9uX2lyaywKLSAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbWluaW11bV9yb3RhdGlvbl90aW1lLAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0byBsaXN0ZW4gZm9yIGNhbGxiYWNrIGV2ZW50cyBmcm9tIFNlY3VyaXR5TWFuYWdlcgotICAgKgotICAgKiBAcGFyYW0gbGlzdGVuZXIgSVNlY3VyaXR5TWFuYWdlckxpc3RlbmVyIGluc3RhbmNlIHRvIGhhbmRsZSBjYWxsYmFja3MKLSAgICovCi0gIHZvaWQgUmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKElTZWN1cml0eU1hbmFnZXJMaXN0ZW5lciogbGlzdGVuZXIsIG9zOjpIYW5kbGVyKiBoYW5kbGVyKTsKLQotICAvKioKLSAgICogVW5yZWdpc3RlciBsaXN0ZW5lciBmb3IgY2FsbGJhY2sgZXZlbnRzIGZyb20gU2VjdXJpdHlNYW5hZ2VyCi0gICAqCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIgaW5zdGFuY2UgdG8gdW5yZWdpc3RlcgotICAgKi8KLSAgdm9pZCBVbnJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICB2b2lkIE9uUGFpcmluZ1Byb21wdEFjY2VwdGVkKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIGJvb2wgY29uZmlybWVkKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNvbmZpcm1ZZXNObyhjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBib29sIGNvbmZpcm1lZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QYXNza2V5RW50cnkoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgdWludDMyX3QgcGFzc2tleSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QaW5FbnRyeShjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwaW4pIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBTZWN1cml0eU1hbmFnZXIob3M6OkhhbmRsZXIqIHNlY3VyaXR5X2hhbmRsZXIsIGludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsKiBzZWN1cml0eV9tYW5hZ2VyX2ltcGwpCi0gICAgICA6IHNlY3VyaXR5X2hhbmRsZXJfKHNlY3VyaXR5X2hhbmRsZXIpLCBzZWN1cml0eV9tYW5hZ2VyX2ltcGxfKHNlY3VyaXR5X21hbmFnZXJfaW1wbCkge30KLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIGludGVybmFsOjpTZWN1cml0eU1hbmFnZXJJbXBsKiBzZWN1cml0eV9tYW5hZ2VyX2ltcGxfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2VjdXJpdHlNYW5hZ2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvc2VjdXJpdHlfbWFuYWdlcl9saXN0ZW5lci5oIGIvZ2Qvc2VjdXJpdHkvc2VjdXJpdHlfbWFuYWdlcl9saXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDZiMmQ3Li4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXJfbGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjb21tb24vY2FsbGJhY2suaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9wYWlyaW5nX2ZhaWx1cmUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi0vKioKLSAqIENhbGxiYWNrIGludGVyZmFjZSBmcm9tIFNlY3VyaXR5TWFuYWdlci4KLSAqLwotY2xhc3MgSVNlY3VyaXR5TWFuYWdlckxpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklTZWN1cml0eU1hbmFnZXJMaXN0ZW5lcigpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgc3VjY2Vzc2Z1bGx5IGJvbmRlZC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IGJvbmRlZCBkZXZpY2UKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkRldmljZUJvbmRlZChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIGRldmljZSBpcyBzdWNjZXNzZnVsbHkgdW4tYm9uZGVkLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBvZiBkZXZpY2UgdGhhdCBpcyBubyBsb25nZXIgYm9uZGVkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgT25EZXZpY2VVbmJvbmRlZChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgYm9uZGluZyBwcm9jZXNzLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgZmFpbGVkIHRvIGJvbmQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkRldmljZUJvbmRGYWlsZWQoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UsIFBhaXJpbmdGYWlsdXJlIHN0YXR1cykgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgYm9uZGluZyBwcm9jZXNzLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgZmFpbGVkIHRvIGJvbmQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBPbkVuY3J5cHRpb25TdGF0ZUNoYW5nZWQoaGNpOjpFbmNyeXB0aW9uQ2hhbmdlVmlldyBlbmNyeXB0aW9uX2NoYW5nZV92aWV3KSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5jYyBiL2dkL3NlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2MTdiOC4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9zZWN1cml0eV9tb2R1bGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJzZWN1cml0eSIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAibDJjYXAvbGUvbDJjYXBfbGVfbW9kdWxlLmgiCi0jaW5jbHVkZSAibmVpZ2hib3IvbmFtZV9kYi5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2NoYW5uZWwvc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvZmFjYWRlX2NvbmZpZ3VyYXRpb25fYXBpLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvaW50ZXJuYWwvc2VjdXJpdHlfbWFuYWdlcl9pbXBsLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvbDJjYXBfc2VjdXJpdHlfbW9kdWxlX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5oIgotI2luY2x1ZGUgInN0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFNlY3VyaXR5TW9kdWxlOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBTZWN1cml0eU1vZHVsZSgpOyB9KTsKLQotc3RydWN0IFNlY3VyaXR5TW9kdWxlOjppbXBsIHsKLSAgaW1wbCgKLSAgICAgIG9zOjpIYW5kbGVyKiBzZWN1cml0eV9oYW5kbGVyLAotICAgICAgbDJjYXA6OmxlOjpMMmNhcExlTW9kdWxlKiBsMmNhcF9sZV9tb2R1bGUsCi0gICAgICBsMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlKiBsMmNhcF9jbGFzc2ljX21vZHVsZSwKLSAgICAgIGhjaTo6SGNpTGF5ZXIqIGhjaV9sYXllciwKLSAgICAgIGhjaTo6QWNsTWFuYWdlciogYWNsX21hbmFnZXIsCi0gICAgICBoY2k6OkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCi0gICAgICBzdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBzdG9yYWdlX21vZHVsZSwKLSAgICAgIG5laWdoYm9yOjpOYW1lRGJNb2R1bGUqIG5hbWVfZGJfbW9kdWxlKQotICAgICAgOiBzZWN1cml0eV9oYW5kbGVyXyhzZWN1cml0eV9oYW5kbGVyKSwKLSAgICAgICAgbDJjYXBfY2xhc3NpY19tb2R1bGVfKGwyY2FwX2NsYXNzaWNfbW9kdWxlKSwKLSAgICAgICAgbDJjYXBfbGVfbW9kdWxlXyhsMmNhcF9sZV9tb2R1bGUpLAotICAgICAgICBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfKG5ldyBjaGFubmVsOjpTZWN1cml0eU1hbmFnZXJDaGFubmVsKHNlY3VyaXR5X2hhbmRsZXJfLCBoY2lfbGF5ZXIpKSwKLSAgICAgICAgaGNpX2xheWVyXyhoY2lfbGF5ZXIpLAotICAgICAgICBhY2xfbWFuYWdlcl8oYWNsX21hbmFnZXIpLAotICAgICAgICBjb250cm9sbGVyXyhjb250cm9sbGVyKSwKLSAgICAgICAgc3RvcmFnZV9tb2R1bGVfKHN0b3JhZ2VfbW9kdWxlKSwKLSAgICAgICAgbDJjYXBfc2VjdXJpdHlfaW50ZXJmYWNlXygmc2VjdXJpdHlfbWFuYWdlcl9pbXBsLCBzZWN1cml0eV9oYW5kbGVyKSwKLSAgICAgICAgbmFtZV9kYl9tb2R1bGVfKG5hbWVfZGJfbW9kdWxlKSB7Ci0gICAgbDJjYXBfY2xhc3NpY19tb2R1bGUtPkluamVjdFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoJmwyY2FwX3NlY3VyaXR5X2ludGVyZmFjZV8pOwotICAgIGwyY2FwX2xlX21vZHVsZS0+SW5qZWN0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgmbDJjYXBfc2VjdXJpdHlfaW50ZXJmYWNlXyk7Ci0gICAgc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXy0+U2V0U2VjdXJpdHlJbnRlcmZhY2UoCi0gICAgICAgIGwyY2FwX2NsYXNzaWNfbW9kdWxlLT5HZXRTZWN1cml0eUludGVyZmFjZShzZWN1cml0eV9oYW5kbGVyXywgc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXykpOwotICB9Ci0KLSAgb3M6OkhhbmRsZXIqIHNlY3VyaXR5X2hhbmRsZXJfOwotICBsMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlKiBsMmNhcF9jbGFzc2ljX21vZHVsZV87Ci0gIGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZSogbDJjYXBfbGVfbW9kdWxlXzsKLSAgY2hhbm5lbDo6U2VjdXJpdHlNYW5hZ2VyQ2hhbm5lbCogc2VjdXJpdHlfbWFuYWdlcl9jaGFubmVsXzsKLSAgaGNpOjpIY2lMYXllciogaGNpX2xheWVyXzsKLSAgaGNpOjpBY2xNYW5hZ2VyKiBhY2xfbWFuYWdlcl87Ci0gIGhjaTo6Q29udHJvbGxlciogY29udHJvbGxlcl87Ci0gIHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGUqIHN0b3JhZ2VfbW9kdWxlXzsKLSAgTDJjYXBTZWN1cml0eU1vZHVsZUludGVyZmFjZSBsMmNhcF9zZWN1cml0eV9pbnRlcmZhY2VfOwotICBuZWlnaGJvcjo6TmFtZURiTW9kdWxlKiBuYW1lX2RiX21vZHVsZV87Ci0KLSAgaW50ZXJuYWw6OlNlY3VyaXR5TWFuYWdlckltcGwgc2VjdXJpdHlfbWFuYWdlcl9pbXBse3NlY3VyaXR5X2hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjYXBfbGVfbW9kdWxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X21hbmFnZXJfY2hhbm5lbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfbGF5ZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNsX21hbmFnZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlX21vZHVsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2RiX21vZHVsZV99OwotCi0gIH5pbXBsKCkgewotICAgIGRlbGV0ZSBzZWN1cml0eV9tYW5hZ2VyX2NoYW5uZWxfOwotICAgIGwyY2FwX2NsYXNzaWNfbW9kdWxlXy0+SW5qZWN0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZShudWxscHRyKTsKLSAgICBsMmNhcF9sZV9tb2R1bGVfLT5JbmplY3RTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlKG51bGxwdHIpOwotICB9Ci19OwotCi12b2lkIFNlY3VyaXR5TW9kdWxlOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHsKLSAgbGlzdC0+YWRkPGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPGwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGU+KCk7Ci0gIGxpc3QtPmFkZDxoY2k6OkhjaUxheWVyPigpOwotICBsaXN0LT5hZGQ8aGNpOjpBY2xNYW5hZ2VyPigpOwotICBsaXN0LT5hZGQ8aGNpOjpDb250cm9sbGVyPigpOwotICBsaXN0LT5hZGQ8c3RvcmFnZTo6U3RvcmFnZU1vZHVsZT4oKTsKLSAgbGlzdC0+YWRkPG5laWdoYm9yOjpOYW1lRGJNb2R1bGU+KCk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNb2R1bGU6OlN0YXJ0KCkgewotICBwaW1wbF8gPSBzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KAotICAgICAgR2V0SGFuZGxlcigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxsMmNhcDo6bGU6OkwyY2FwTGVNb2R1bGU+KCksCi0gICAgICBHZXREZXBlbmRlbmN5PGwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGU+KCksCi0gICAgICBHZXREZXBlbmRlbmN5PGhjaTo6SGNpTGF5ZXI+KCksCi0gICAgICBHZXREZXBlbmRlbmN5PGhjaTo6QWNsTWFuYWdlcj4oKSwKLSAgICAgIEdldERlcGVuZGVuY3k8aGNpOjpDb250cm9sbGVyPigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpLAotICAgICAgR2V0RGVwZW5kZW5jeTxuZWlnaGJvcjo6TmFtZURiTW9kdWxlPigpKTsKLQotICBHZXREZXBlbmRlbmN5PGhjaTo6QWNsTWFuYWdlcj4oKS0+U2V0U2VjdXJpdHlNb2R1bGUodGhpcyk7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNb2R1bGU6OlN0b3AoKSB7Ci0gIHBpbXBsXy5yZXNldCgpOwotfQotCi1zdGQ6OnN0cmluZyBTZWN1cml0eU1vZHVsZTo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiU2VjdXJpdHkgTW9kdWxlIjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPFNlY3VyaXR5TWFuYWdlcj4gU2VjdXJpdHlNb2R1bGU6OkdldFNlY3VyaXR5TWFuYWdlcigpIHsKLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTZWN1cml0eU1hbmFnZXI+KAotICAgICAgbmV3IFNlY3VyaXR5TWFuYWdlcihwaW1wbF8tPnNlY3VyaXR5X2hhbmRsZXJfLCAmcGltcGxfLT5zZWN1cml0eV9tYW5hZ2VyX2ltcGwpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEZhY2FkZUNvbmZpZ3VyYXRpb25BcGk+IFNlY3VyaXR5TW9kdWxlOjpHZXRGYWNhZGVDb25maWd1cmF0aW9uQXBpKCkgewotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEZhY2FkZUNvbmZpZ3VyYXRpb25BcGk+KAotICAgICAgbmV3IEZhY2FkZUNvbmZpZ3VyYXRpb25BcGkocGltcGxfLT5zZWN1cml0eV9oYW5kbGVyXywgJnBpbXBsXy0+c2VjdXJpdHlfbWFuYWdlcl9pbXBsKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvc2VjdXJpdHlfbW9kdWxlLmggYi9nZC9zZWN1cml0eS9zZWN1cml0eV9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5MDczMy4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS9zZWN1cml0eV9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2ZhY2FkZV9jb25maWd1cmF0aW9uX2FwaS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3NlY3VyaXR5X21hbmFnZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1jbGFzcyBTZWN1cml0eU1vZHVsZSA6IHB1YmxpYyBibHVldG9vdGg6Ok1vZHVsZSB7Ci0gcHVibGljOgotICBTZWN1cml0eU1vZHVsZSgpID0gZGVmYXVsdDsKLSAgflNlY3VyaXR5TW9kdWxlKCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFwaSB0byB0aGUgU2VjdXJpdHlNYW5hZ2VyCi0gICAqLwotICBzdGQ6OnVuaXF1ZV9wdHI8U2VjdXJpdHlNYW5hZ2VyPiBHZXRTZWN1cml0eU1hbmFnZXIoKTsKLQotICAvKioKLSAgICogRmFjYWRlIGNvbmZpZ3VyYXRpb24gQVBJLgotICAgKgotICAgKiA8cD4gVGhpcyBhbGxvd3MgeW91IHRvIHNldCB0aGlucyBsaWtlIElPIENhcGFiaWxpdGllcywgQXV0aGVudGljYXRpb24gUmVxdWlyZW1lbnRzLCBhbmQgT09CIERhdGEuCi0gICAqLwotICBzdGQ6OnVuaXF1ZV9wdHI8RmFjYWRlQ29uZmlndXJhdGlvbkFwaT4gR2V0RmFjYWRlQ29uZmlndXJhdGlvbkFwaSgpOwotCi0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBpbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW1wbD4gcGltcGxfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2VjdXJpdHlNb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS9zbXBfcGFja2V0cy5wZGwgYi9nZC9zZWN1cml0eS9zbXBfcGFja2V0cy5wZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGI5NmQuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvc21wX3BhY2tldHMucGRsCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLWxpdHRsZV9lbmRpYW5fcGFja2V0cwotCi1jdXN0b21fZmllbGQgQWRkcmVzcyA6IDQ4ICJoY2kvIgotCi1lbnVtIENvZGUgOiA4IHsKLSAgUEFJUklOR19SRVFVRVNUID0gMHgwMSwKLSAgUEFJUklOR19SRVNQT05TRSA9IDB4MDIsCi0gIFBBSVJJTkdfQ09ORklSTSA9IDB4MDMsCi0gIFBBSVJJTkdfUkFORE9NID0gMHgwNCwKLSAgUEFJUklOR19GQUlMRUQgPSAweDA1LAotICBFTkNSWVBUSU9OX0lORk9STUFUSU9OID0gMHgwNiwKLSAgQ0VOVFJBTF9JREVOVElGSUNBVElPTiA9IDB4MDcsCi0gIElERU5USVRZX0lORk9STUFUSU9OID0gMHgwOCwKLSAgSURFTlRJVFlfQUREUkVTU19JTkZPUk1BVElPTiA9IDB4MDksCi0gIFNJR05JTkdfSU5GT1JNQVRJT04gPSAweDBBLAotICBTRUNVUklUWV9SRVFVRVNUID0gMHgwQiwKLSAgUEFJUklOR19QVUJMSUNfS0VZID0gMHgwQywKLSAgUEFJUklOR19ESF9LRVlfQ0hFQ0sgPSAweDBELAotICBQQUlSSU5HX0tFWVBSRVNTX05PVElGSUNBVElPTiA9IDB4MEUsCi19Ci0KLXBhY2tldCBDb21tYW5kIHsKLSAgY29kZSA6IENvZGUsCi0gIF9wYXlsb2FkXywKLX0KLQotZW51bSBJb0NhcGFiaWxpdHkgOiA4IHsKLSAgRElTUExBWV9PTkxZID0gMHgwMCwKLSAgRElTUExBWV9ZRVNfTk8gPSAweDAxLAotICBLRVlCT0FSRF9PTkxZID0gMHgwMiwKLSAgTk9fSU5QVVRfTk9fT1VUUFVUID0gMHgwMywKLSAgS0VZQk9BUkRfRElTUExBWSA9IDB4MDQsCi19Ci0KLWVudW0gT29iRGF0YUZsYWcgOiA4IHsKLSAgTk9UX1BSRVNFTlQgPSAweDAwLAotICBQUkVTRU5UID0gMHgwMSwKLX0KLQotZW51bSBCb25kaW5nRmxhZ3MgOiAyIHsKLSAgTk9fQk9ORElORyA9IDAsCi0gIEJPTkRJTkcgPSAxLAotfQotCi1ncm91cCBQYWlyaW5nSW5mbyB7Ci0gIGlvX2NhcGFiaWxpdHkgOiBJb0NhcGFiaWxpdHksCi0gIG9vYl9kYXRhX2ZsYWcgOiBPb2JEYXRhRmxhZywKLSAgYXV0aF9yZXE6IDgsCi0gIG1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSA6IDUsIC8vIDcgLSAxNgotICBfcmVzZXJ2ZWRfIDogMywKLSAgaW5pdGlhdG9yX2tleV9kaXN0cmlidXRpb24gOiA4LAotICByZXNwb25kZXJfa2V5X2Rpc3RyaWJ1dGlvbiA6IDgsCi19Ci0KLXBhY2tldCBQYWlyaW5nUmVxdWVzdCA6IENvbW1hbmQgKGNvZGUgPSBQQUlSSU5HX1JFUVVFU1QpIHsKLSAgUGFpcmluZ0luZm8sCi19Ci0KLXBhY2tldCBQYWlyaW5nUmVzcG9uc2UgOiBDb21tYW5kIChjb2RlID0gUEFJUklOR19SRVNQT05TRSkgewotICBQYWlyaW5nSW5mbywKLX0KLQotcGFja2V0IFBhaXJpbmdDb25maXJtIDogQ29tbWFuZCAoY29kZSA9IFBBSVJJTkdfQ09ORklSTSkgewotICBjb25maXJtX3ZhbHVlIDogOFsxNl0sICAvLyBJbml0aWF0aW5nIGRldmljZSBzZW5kcyBNY29uZmlybSwgcmVzcG9uZGluZyBkZXZpY2Ugc2VuZHMgU2NvbmZpcm0KLX0KLQotcGFja2V0IFBhaXJpbmdSYW5kb20gOiBDb21tYW5kIChjb2RlID0gUEFJUklOR19SQU5ET00pIHsKLSAgcmFuZG9tX3ZhbHVlIDogOFsxNl0sICAvLyBJbml0aWF0aW5nIGRldmljZSBzZW5kcyBNcmFuZCwgcmVzcG9uZGluZyBkZXZpY2Ugc2VuZHMgU3JhbmQKLX0KLQotZW51bSBQYWlyaW5nRmFpbGVkUmVhc29uIDogOCB7Ci0gIFBBU1NLRVlfRU5UUllfRkFJTEVEID0gMHgwMSwKLSAgT09CX05PVF9BVkFJTEFCTEUgPSAweDAyLAotICBBVVRIRU5USUNBVElPTl9SRVFVSVJFTUVOVFMgPSAweDAzLAotICBDT05GSVJNX1ZBTFVFX0ZBSUxFRCA9IDB4MDQsCi0gIFBBSVJJTkdfTk9UX1NVUFBPUlRFRCA9IDB4MDUsCi0gIEVOQ1JZUFRJT05fS0VZX1NJWkUgPSAweDA2LAotICBDT01NQU5EX05PVF9TVVBQT1JURUQgPSAweDA3LAotICBVTlNQRUNJRklFRF9SRUFTT04gPSAweDA4LAotICBSRVBFQVRFRF9BVFRFTVBUUyA9IDB4MDksCi0gIElOVkFMSURfUEFSQU1FVEVSUyA9IDB4MEEsCi0gIERIS0VZX0NIRUNLX0ZBSUxFRCA9IDB4MEIsCi0gIE5VTUVSSUNfQ09NUEFSSVNPTl9GQUlMRUQgPSAweDBDLAotICBCUl9FRFJfUEFJUklOR19JTl9QUk9HUkVTUyA9IDB4MEQsCi0gIENST1NTX1RSQU5TUE9SVF9LRVlfREVSSVZBVElPTl9OT1RfQUxMT1dFRCA9IDB4MEUsCi19Ci0KLXBhY2tldCBQYWlyaW5nRmFpbGVkIDogQ29tbWFuZCAoY29kZSA9IFBBSVJJTkdfRkFJTEVEKSB7Ci0gIHJlYXNvbiA6IFBhaXJpbmdGYWlsZWRSZWFzb24sCi19Ci0KLXBhY2tldCBFbmNyeXB0aW9uSW5mb3JtYXRpb24gOiBDb21tYW5kIChjb2RlID0gRU5DUllQVElPTl9JTkZPUk1BVElPTikgewotIGxvbmdfdGVybV9rZXkgOiA4WzE2XSwKLX0KLQotcGFja2V0IENlbnRyYWxJZGVudGlmaWNhdGlvbiA6IENvbW1hbmQgKGNvZGUgPSBDRU5UUkFMX0lERU5USUZJQ0FUSU9OKSB7Ci0gIGVkaXYgOiAxNiwKLSAgcmFuZCA6IDhbOF0sCi19Ci0KLXBhY2tldCBJZGVudGl0eUluZm9ybWF0aW9uIDogQ29tbWFuZCAoY29kZSA9IElERU5USVRZX0lORk9STUFUSU9OKSB7Ci0gIGlkZW50aXR5X3Jlc29sdmluZ19rZXkgOiA4WzE2XSwKLX0KLQotZW51bSBBZGRyVHlwZSA6IDggewotICBQVUJMSUMgPSAweDAwLAotICBTVEFUSUNfUkFORE9NID0gMHgwMSwKLX0KLQotcGFja2V0IElkZW50aXR5QWRkcmVzc0luZm9ybWF0aW9uIDogQ29tbWFuZCAoY29kZSA9IElERU5USVRZX0FERFJFU1NfSU5GT1JNQVRJT04pIHsKLSAgYWRkcl90eXBlIDogQWRkclR5cGUsCi0gIGJkX2FkZHIgOiBBZGRyZXNzLAotfQotCi1wYWNrZXQgU2lnbmluZ0luZm9ybWF0aW9uIDogQ29tbWFuZCAoY29kZSA9IFNJR05JTkdfSU5GT1JNQVRJT04pIHsKLSAgc2lnbmF0dXJlX2tleSA6IDhbMTZdLAotfQotCi1wYWNrZXQgU2VjdXJpdHlSZXF1ZXN0IDogQ29tbWFuZCAoY29kZSA9IFNFQ1VSSVRZX1JFUVVFU1QpIHsKLSAgYXV0aF9yZXE6IDgsCi19Ci0KLXBhY2tldCBQYWlyaW5nUHVibGljS2V5IDogQ29tbWFuZCAoY29kZSA9IFBBSVJJTkdfUFVCTElDX0tFWSkgewotICBwdWJsaWNfa2V5X3ggOiA4WzMyXSwKLSAgcHVibGljX2tleV95IDogOFszMl0sCi19Ci0KLXBhY2tldCBQYWlyaW5nRGhLZXlDaGVjayA6IENvbW1hbmQgKGNvZGUgPSBQQUlSSU5HX0RIX0tFWV9DSEVDSykgewotICBkaF9rZXlfY2hlY2sgOiA4WzE2XSwKLX0KLQotZW51bSBLZXlwcmVzc05vdGlmaWNhdGlvblR5cGUgOiA4IHsKLSAgRU5UUllfU1RBUlRFRCA9IDAsCi0gIERJR0lUX0VOVEVSRUQgPSAxLAotICBESUdJVF9FUkFTRUQgPSAyLAotICBDTEVBUkVEID0gMywKLSAgRU5UUllfQ09NUExFVEVEID0gNCwKLX0KLQotcGFja2V0IFBhaXJpbmdLZXlwcmVzc05vdGlmaWNhdGlvbiA6IENvbW1hbmQgKGNvZGUgPSBQQUlSSU5HX0tFWVBSRVNTX05PVElGSUNBVElPTikgewotICBub3RpZmljYXRpb25fdHlwZSA6IEtleXByZXNzTm90aWZpY2F0aW9uVHlwZSwKLX0KZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3Rlc3QvZWNkaF9rZXlzX3Rlc3QuY2MgYi9nZC9zZWN1cml0eS90ZXN0L2VjZGhfa2V5c190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWU3ZGQ2Li4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3Rlc3QvZWNkaF9rZXlzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0jaW5jbHVkZSAiaGNpL2xlX3NlY3VyaXR5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInNlY3VyaXR5L2VjYy9wXzI1Nl9lY2NfcHAuaCIKLSNpbmNsdWRlICJzZWN1cml0eS9lY2RoX2tleXMuaCIKLSNpbmNsdWRlICJzZWN1cml0eS90ZXN0L21vY2tzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1jbGFzcyBFY2RoS2V5c1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkge30KLQotICB2b2lkIFRlYXJEb3duKCkge30KLQotIHB1YmxpYzoKLX07Ci0KLS8qIFRoaXMgdGVzdCBnZW5lcmF0ZXMgdHdvIHBhaXJzIG9mIGtleXMsIGNvbXB1dGVzIHRoZSBEaWZmaWXigJNIZWxsbWFuIGtleSB1c2luZyBib3RoLCBhbmQgdmVyaWZpZXMgdGhhdCB0aGV5IG1hdGNoICovCi1URVNUX0YoRWNkaEtleXNUZXN0LCB0ZXN0X2dlbmVyYXRlZCkgewotICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7Ci0KLSAgYXV0byBbcHJpdmF0ZV9rZXlfYSwgcHVibGljX2tleV9hXSA9IEdlbmVyYXRlRUNESEtleVBhaXIoKTsKLSAgYXV0byBbcHJpdmF0ZV9rZXlfYiwgcHVibGljX2tleV9iXSA9IEdlbmVyYXRlRUNESEtleVBhaXIoKTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBkaGtleWEgPSBDb21wdXRlREhLZXkocHJpdmF0ZV9rZXlfYSwgcHVibGljX2tleV9iKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAzMj4gZGhrZXliID0gQ29tcHV0ZURIS2V5KHByaXZhdGVfa2V5X2IsIHB1YmxpY19rZXlfYSk7Ci0KLSAgRVhQRUNUX0VRKGRoa2V5YSwgZGhrZXliKTsKLQotICBpZiAoZGhrZXlhICE9IGRoa2V5YikgewotICAgIExPR19FUlJPUigicHJpdmF0ZSBrZXkgYSA6ICVzIiwgYmFzZTo6SGV4RW5jb2RlKHByaXZhdGVfa2V5X2EuZGF0YSgpLCBwcml2YXRlX2tleV9hLnNpemUoKSkuY19zdHIoKSk7Ci0gICAgTE9HX0VSUk9SKCJwdWJsaWMga2V5IGEueCA6ICVzIiwgYmFzZTo6SGV4RW5jb2RlKHB1YmxpY19rZXlfYS54LmRhdGEoKSwgcHVibGljX2tleV9hLnguc2l6ZSgpKS5jX3N0cigpKTsKLSAgICBMT0dfRVJST1IoInB1YmxpYyBrZXkgYS55IDogJXMiLCBiYXNlOjpIZXhFbmNvZGUocHVibGljX2tleV9hLnkuZGF0YSgpLCBwdWJsaWNfa2V5X2EueS5zaXplKCkpLmNfc3RyKCkpOwotCi0gICAgTE9HX0VSUk9SKCJwcml2YXRlIGtleSBiIDogJXMiLCBiYXNlOjpIZXhFbmNvZGUocHJpdmF0ZV9rZXlfYi5kYXRhKCksIHByaXZhdGVfa2V5X2Iuc2l6ZSgpKS5jX3N0cigpKTsKLSAgICBMT0dfRVJST1IoInB1YmxpYyBrZXkgYi54IDogJXMiLCBiYXNlOjpIZXhFbmNvZGUocHVibGljX2tleV9iLnguZGF0YSgpLCBwdWJsaWNfa2V5X2IueC5zaXplKCkpLmNfc3RyKCkpOwotICAgIExPR19FUlJPUigicHVibGljIGtleSBiLnkgOiAlcyIsIGJhc2U6OkhleEVuY29kZShwdWJsaWNfa2V5X2IueS5kYXRhKCksIHB1YmxpY19rZXlfYi55LnNpemUoKSkuY19zdHIoKSk7Ci0KLSAgICBMT0dfRVJST1IoImRoa2V5YSA6ICVzIiwgYmFzZTo6SGV4RW5jb2RlKGRoa2V5YS5kYXRhKCksIGRoa2V5YS5zaXplKCkpLmNfc3RyKCkpOwotICAgIExPR19FUlJPUigiZGhrZXliIDogJXMiLCBiYXNlOjpIZXhFbmNvZGUoZGhrZXliLmRhdGEoKSwgZGhrZXliLnNpemUoKSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyogVGhpcyB0ZXN0IHVzZXMgdHdvIGZpeGVkIHBhaXJzIG9mIGtleXMsIGNvbXB1dGVzIHRoZSBEaWZmaWXigJNIZWxsbWFuIGtleSB1c2luZyBib3RoLCBhbmQgdmVyaWZpZXMgdGhhdCB0aGV5IG1hdGNoCi1wcmVjb21wdXRlZCB2YWx1ZS4KLQotVGhpcyBjb2RlIGlzIGFsc28gdXNlZnVsIGR1cmluZyBkZWJ1Z2luZyAtIG9uZSBjYW4gcmVwbGFjZSBmaXhlZCB2YWx1ZXMgd2l0aCB2YWx1ZXMgZnJvbSBmYWlsZWQgZXhjaGFnbmUgdG8gdmVyaWZ5IHdoaWNoCi1zaWRlIGRpZCBiYWQgY29tcHV0YXRpb24uICovCi1URVNUX0YoRWNkaEtleXNUZXN0LCB0ZXN0X3N0YXRpYykgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBwcml2YXRlX2tleV9hID0gezB4M0UsIDB4QzgsIDB4MkEsIDB4MzIsIDB4QjMsIDB4NzUsIDB4NzYsIDB4QkEsIDB4N0QsIDB4QjgsIDB4QjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3QiwgMHhBMCwgMHg4QSwgMHhBMywgMHhDMywgMHhGMiwgMHgwMywgMHgxQSwgMHg1MywgMHhGNiwgMHg1MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI2LCAweDMyLCAweEI2LCAweEFFLCAweDU3LCAweDNGLCAweDEzLCAweDE1LCAweDI5LCAweDUxfTsKLSAgYmx1ZXRvb3RoOjpzZWN1cml0eTo6RWNkaFB1YmxpY0tleSBwdWJsaWNfa2V5X2E7Ci0gIHVpbnQ4X3QgYXhbMzJdID0gezB4REMsIDB4ODgsIDB4RDAsIDB4RTUsIDB4NTksIDB4NzMsIDB4RjIsIDB4NDEsIDB4ODgsIDB4NkMsIDB4QjQsIDB4NDUsIDB4OEIsIDB4NjEsIDB4M0IsIDB4MTAsCi0gICAgICAgICAgICAgICAgICAgIDB4RjUsIDB4RDQsIDB4RDIsIDB4NUIsIDB4NEUsIDB4QTEsIDB4N0YsIDB4OTQsIDB4RTMsIDB4QTksIDB4MzgsIDB4RjgsIDB4ODQsIDB4RDQsIDB4OTgsIDB4MTB9OwotICB1aW50OF90IGF5WzMyXSA9IHsweDNELCAweDEzLCAweDc2LCAweDRGLCAweEQxLCAweDI5LCAweDZFLCAweEVDLCAweDhELCAweEY2LCAweDcwLCAweDMzLCAweDhCLCAweEE3LCAweDE4LCAweEVBLAotICAgICAgICAgICAgICAgICAgICAweDg0LCAweDE1LCAweEU4LCAweDhDLCAweDRBLCAweEM4LCAweDc2LCAweDQ1LCAweDkwLCAweDk4LCAweEJBLCAweDUyLCAweDhCLCAweDAwLCAweDY5LCAweEFGfTsKLSAgbWVtY3B5KHB1YmxpY19rZXlfYS54LmRhdGEoKSwgYXgsIDMyKTsKLSAgbWVtY3B5KHB1YmxpY19rZXlfYS55LmRhdGEoKSwgYXksIDMyKTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBwcml2YXRlX2tleV9iID0gezB4REQsIDB4NTMsIDB4ODQsIDB4OTEsIDB4QzgsIDB4RkEsIDB4NEIsIDB4NDUsIDB4QjIsIDB4RkYsIDB4QzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MywgMHg4OSwgMHg2NCwgMHgxNiwgMHg3QiwgMHg2NywgMHgzMCwgMHhDRSwgMHg1RCwgMHg4MiwgMHhGNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGLCAweDM4LCAweEEyLCAweEU2LCAweDc4LCAweEI2LCAweEZCLCAweEExLCAweDA3LCAweEQ4fTsKLSAgYmx1ZXRvb3RoOjpzZWN1cml0eTo6RWNkaFB1YmxpY0tleSBwdWJsaWNfa2V5X2I7Ci0gIHVpbnQ4X3QgYnhbMzJdID0gezB4MjMsIDB4MUEsIDB4RUMsIDB4RkUsIDB4N0QsIDB4QzEsIDB4MjAsIDB4MkYsIDB4MDMsIDB4M0UsIDB4OUEsIDB4QUEsIDB4OTksIDB4NTUsIDB4NzgsIDB4ODYsCi0gICAgICAgICAgICAgICAgICAgIDB4NTgsIDB4Q0IsIDB4MzcsIDB4NjgsIDB4N0QsIDB4RTEsIDB4RkYsIDB4MTksIDB4MzMsIDB4RjgsIDB4Q0IsIDB4N0EsIDB4MTcsIDB4QUIsIDB4MEIsIDB4NzN9OwotICB1aW50OF90IGJ5WzMyXSA9IHsweDRDLCAweDI1LCAweEUyLCAweDQyLCAweDNDLCAweDY5LCAweDBFLCAweDNCLCAweEMwLCAweEVGLCAweDk0LCAweDA5LCAweDRELCAweDNGLCAweDk2LCAweEJCLAotICAgICAgICAgICAgICAgICAgICAweDE4LCAweEYyLCAweDU1LCAweDgxLCAweDcxLCAweDVBLCAweERFLCAweEM0LCAweDNFLCAweEY5LCAweDZGLCAweEE5LCAweEFGLCAweDA0LCAweDRFLCAweDg2fTsKLSAgbWVtY3B5KHB1YmxpY19rZXlfYi54LmRhdGEoKSwgYngsIDMyKTsKLSAgbWVtY3B5KHB1YmxpY19rZXlfYi55LmRhdGEoKSwgYnksIDMyKTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiBkaGtleTsKLSAgdWludDhfdCBkaGtleV92YWxbMzJdID0gezB4M0IsIDB4RjgsIDB4REYsIDB4MzMsIDB4OTksIDB4OTQsIDB4NjYsIDB4NTUsIDB4NEYsIDB4MkMsIDB4NEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDc4LCAweDJCLCAweDUxLCAweEQxLCAweDQ5LCAweDBGLCAweEYxLCAweDk2LCAweDYzLCAweDUxLCAweDc1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5RSwgMHg2NSwgMHg3RiwgMHgzQywgMHhGRSwgMHg3NywgMHhCNCwgMHgzRiwgMHg3QSwgMHg5M307Ci0gIG1lbWNweShkaGtleS5kYXRhKCksIGRoa2V5X3ZhbCwgMzIpOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMzI+IGRoa2V5X2EgPSBDb21wdXRlREhLZXkocHJpdmF0ZV9rZXlfYSwgcHVibGljX2tleV9iKTsKLSAgc3RkOjphcnJheTx1aW50OF90LCAzMj4gZGhrZXlfYiA9IENvbXB1dGVESEtleShwcml2YXRlX2tleV9iLCBwdWJsaWNfa2V5X2EpOwotCi0gIEVYUEVDVF9FUShkaGtleV9hLCBkaGtleSk7Ci0gIEVYUEVDVF9FUShkaGtleV9iLCBkaGtleSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvdGVzdC9mYWtlX2hjaV9sYXllci5oIGIvZ2Qvc2VjdXJpdHkvdGVzdC9mYWtlX2hjaV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDE2ZTgwLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3Rlc3QvZmFrZV9oY2lfbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpbmNsdWRlICJjb21tb24vYmluZC5oIgotI2luY2x1ZGUgImhjaS9oY2lfbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi11c2luZyBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s7Ci11c2luZyBoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXc7Ci11c2luZyBoY2k6OkNvbW1hbmRTdGF0dXNWaWV3OwotdXNpbmcgaGNpOjpFdmVudEJ1aWxkZXI7Ci11c2luZyBoY2k6OkV2ZW50Q29kZTsKLXVzaW5nIGhjaTo6RXZlbnRWaWV3OwotdXNpbmcgaGNpOjpIY2lMYXllcjsKLQotbmFtZXNwYWNlIHsKLQotUGFja2V0VmlldzxrTGl0dGxlRW5kaWFuPiBHZXRQYWNrZXRWaWV3KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGkoKmJ5dGVzKTsKLSAgYnl0ZXMtPnJlc2VydmUocGFja2V0LT5zaXplKCkpOwotICBwYWNrZXQtPlNlcmlhbGl6ZShpKTsKLSAgcmV0dXJuIHBhY2tldDo6UGFja2V0VmlldzxwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KGJ5dGVzKTsKLX0KLQotY2xhc3MgQ29tbWFuZFF1ZXVlRW50cnkgewotIHB1YmxpYzoKLSAgQ29tbWFuZFF1ZXVlRW50cnkoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpDb21tYW5kQnVpbGRlcj4gY29tbWFuZF9wYWNrZXQsCi0gICAgICBDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoQ29tbWFuZENvbXBsZXRlVmlldyk+IG9uX2NvbXBsZXRlX2Z1bmN0aW9uKQotICAgICAgOiBjb21tYW5kKHN0ZDo6bW92ZShjb21tYW5kX3BhY2tldCkpLCB3YWl0aW5nX2Zvcl9zdGF0dXNfKGZhbHNlKSwgb25fY29tcGxldGUoc3RkOjptb3ZlKG9uX2NvbXBsZXRlX2Z1bmN0aW9uKSkge30KLQotICBDb21tYW5kUXVldWVFbnRyeSgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kX3BhY2tldCwKLSAgICAgIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1c19mdW5jdGlvbikKLSAgICAgIDogY29tbWFuZChzdGQ6Om1vdmUoY29tbWFuZF9wYWNrZXQpKSwgd2FpdGluZ19mb3Jfc3RhdHVzXyh0cnVlKSwgb25fc3RhdHVzKHN0ZDo6bW92ZShvbl9zdGF0dXNfZnVuY3Rpb24pKSB7fQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kOwotICBib29sIHdhaXRpbmdfZm9yX3N0YXR1c187Ci0gIENvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1czsKLSAgQ29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBGYWtlSGNpTGF5ZXIgOiBwdWJsaWMgSGNpTGF5ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgQ29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRTdGF0dXNWaWV3KT4gb25fc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjb21tYW5kX3F1ZXVlX2VudHJ5ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21tYW5kUXVldWVFbnRyeT4oc3RkOjptb3ZlKGNvbW1hbmQpLCBzdGQ6Om1vdmUob25fc3RhdHVzKSk7Ci0gICAgY29tbWFuZF9xdWV1ZV8ucHVzaChzdGQ6Om1vdmUoY29tbWFuZF9xdWV1ZV9lbnRyeSkpOwotICB9Ci0KLSAgdm9pZCBFbnF1ZXVlQ29tbWFuZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OkNvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgQ29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIGF1dG8gY29tbWFuZF9xdWV1ZV9lbnRyeSA9IHN0ZDo6bWFrZV91bmlxdWU8Q29tbWFuZFF1ZXVlRW50cnk+KHN0ZDo6bW92ZShjb21tYW5kKSwgc3RkOjptb3ZlKG9uX2NvbXBsZXRlKSk7Ci0gICAgY29tbWFuZF9xdWV1ZV8ucHVzaChzdGQ6Om1vdmUoY29tbWFuZF9xdWV1ZV9lbnRyeSkpOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRRdWV1ZUVudHJ5PiBHZXRMYXN0Q29tbWFuZCgpIHsKLSAgICBFWFBFQ1RfRkFMU0UoY29tbWFuZF9xdWV1ZV8uZW1wdHkoKSk7Ci0gICAgYXV0byBsYXN0ID0gc3RkOjptb3ZlKGNvbW1hbmRfcXVldWVfLmZyb250KCkpOwotICAgIGNvbW1hbmRfcXVldWVfLnBvcCgpOwotICAgIHJldHVybiBsYXN0OwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGUgZXZlbnRfY29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPiBldmVudF9oYW5kbGVyKSBvdmVycmlkZSB7Ci0gICAgcmVnaXN0ZXJlZF9ldmVudHNfW2V2ZW50X2NvZGVdID0gZXZlbnRfaGFuZGxlcjsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlckV2ZW50SGFuZGxlcihFdmVudENvZGUgZXZlbnRfY29kZSkgb3ZlcnJpZGUgewotICAgIHJlZ2lzdGVyZWRfZXZlbnRzXy5lcmFzZShldmVudF9jb2RlKTsKLSAgfQotCi0gIHZvaWQgSW5jb21pbmdFdmVudChzdGQ6OnVuaXF1ZV9wdHI8RXZlbnRCdWlsZGVyPiBldmVudF9idWlsZGVyKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShldmVudF9idWlsZGVyKSk7Ci0gICAgRXZlbnRWaWV3IGV2ZW50ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgICBBU1NFUlRfVFJVRShldmVudC5Jc1ZhbGlkKCkpOwotICAgIEV2ZW50Q29kZSBldmVudF9jb2RlID0gZXZlbnQuR2V0RXZlbnRDb2RlKCk7Ci0gICAgQVNTRVJUX1RSVUUocmVnaXN0ZXJlZF9ldmVudHNfLmZpbmQoZXZlbnRfY29kZSkgIT0gcmVnaXN0ZXJlZF9ldmVudHNfLmVuZCgpKTsKLSAgICByZWdpc3RlcmVkX2V2ZW50c19bZXZlbnRfY29kZV0uSW52b2tlKGV2ZW50KTsKLSAgfQotCi0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZSB7fQotICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGUge30KLQotIHByaXZhdGU6Ci0gIHN0ZDo6bWFwPEV2ZW50Q29kZSwgY29tbW9uOjpDb250ZXh0dWFsQ2FsbGJhY2s8dm9pZChFdmVudFZpZXcpPj4gcmVnaXN0ZXJlZF9ldmVudHNfOwotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kUXVldWVFbnRyeT4+IGNvbW1hbmRfcXVldWVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS90ZXN0L2Zha2VfbDJjYXBfdGVzdC5jYyBiL2dkL3NlY3VyaXR5L3Rlc3QvZmFrZV9sMmNhcF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IyNTU1Li4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3Rlc3QvZmFrZV9sMmNhcF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoY2kvbGVfc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvcGFpcmluZ19oYW5kbGVyX2xlLmgiCi0jaW5jbHVkZSAic2VjdXJpdHkvdGVzdC9tb2Nrcy5oIgotCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL3F1ZXVlLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpJbnZva2U7Ci11c2luZyB0ZXN0aW5nOjpJbnZva2VXaXRob3V0QXJnczsKLXVzaW5nIHRlc3Rpbmc6Ok1hdGNoZXI7Ci11c2luZyB0ZXN0aW5nOjpTYXZlQXJnOwotCi11c2luZyBibHVldG9vdGg6OmhjaTo6Q29tbWFuZENvbXBsZXRlVmlldzsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpDb21tYW5kU3RhdHVzVmlldzsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uQ2hhbmdlQnVpbGRlcjsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uRW5hYmxlZDsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGU7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6RXZlbnRCdWlsZGVyOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50VmlldzsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpMZVNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotbmFtZXNwYWNlIHsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1QYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IEdldFBhY2tldFZpZXcoc3RkOjp1bmlxdWVfcHRyPFQ+IHBhY2tldCkgewotICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaSgqYnl0ZXMpOwotICBieXRlcy0+cmVzZXJ2ZShwYWNrZXQtPnNpemUoKSk7Ci0gIHBhY2tldC0+U2VyaWFsaXplKGkpOwotICByZXR1cm4gcGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4oYnl0ZXMpOwotfQotCi12b2lkIHN5bmNfaGFuZGxlcihvczo6SGFuZGxlciogaGFuZGxlcikgewotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgaGFuZGxlci0+UG9zdChjb21tb246OkJpbmRPbmNlKCZzdGQ6OnByb21pc2U8dm9pZD46OnNldF92YWx1ZSwgY29tbW9uOjpVbnJldGFpbmVkKCZwcm9taXNlKSkpOwotICBhdXRvIHN0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpKTsKLSAgRVhQRUNUX0VRKHN0YXR1cywgc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotY2xhc3MgRmFrZUwyY2FwVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSB7fQotCi0gIHZvaWQgVGVhckRvd24oKSB7fQotCi0gcHVibGljOgotfTsKLQotdm9pZCBteV9lbnF1ZXVlX2NhbGxiYWNrKCkgewotICBMT0dfSU5GTygicGFja2V0IHJlYWR5IGZvciBkZXF1ZXVlISIpOwotfQotCi0vKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBKdXN0IFdvcmtzIHBhaXJpbmcgZmxvdyB3b3Jrcy4KLSAqIEJvdGggc2ltdWxhdGVkIGRldmljZXMgc3BlY2lmeSBjYXBhYmlsaXRpZXMgYXMgTk9fSU5QVVRfTk9fT1VUUFVULCBhbmQgc2VjdXJlIGNvbm5lY2l0b25zIHN1cHBvcnQgKi8KLVRFU1RfRihGYWtlTDJjYXBUZXN0LCB0ZXN0X2JpZGlfcXVldWVfZXhhbXBsZSkgewotICBvczo6VGhyZWFkKiB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLQotICBjb21tb246OkJpZGlRdWV1ZTxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyLCBwYWNrZXQ6OlBhY2tldFZpZXc8cGFja2V0OjprTGl0dGxlRW5kaWFuPj4gYmlkaV9xdWV1ZXsxMH07Ci0KLSAgb3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gZW5xdWV1ZV9idWZmZXJ7YmlkaV9xdWV1ZS5HZXREb3duRW5kKCl9OwotCi0gIC8vIFRoaXMgaXMgdGVzdCBwYWNrZXQgd2UgYXJlIHNlbmRpbmcgZG93biB0aGUgcXVldWUgdG8gdGhlIG90aGVyIGVuZDsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IEVuY3J5cHRpb25DaGFuZ2VCdWlsZGVyOjpDcmVhdGUoRXJyb3JDb2RlOjpTVUNDRVNTLCAweDAwMjAsIEVuY3J5cHRpb25FbmFibGVkOjpPTik7Ci0KLSAgLy8gc2VuZCB0aGUgcGFja2V0IHRocm91Z2ggdGhlIHF1ZXVlCi0gIGVucXVldWVfYnVmZmVyLkVucXVldWUoc3RkOjptb3ZlKHRlc3RfcGFja2V0KSwgaGFuZGxlcl8pOwotCi0gIC8vIGdpdmUgcXVldWUgc29tZSB0aW1lIHRvIHB1c2ggdGhlIHBhY2tldCB0aHJvdWdoCi0gIHN5bmNfaGFuZGxlcihoYW5kbGVyXyk7Ci0KLSAgLy8gcGFja2V0IGlzIHRocm91Z2ggdGhlIHF1ZXVlLCByZWNlaXZlIGl0IG9uIHRoZSBvdGhlciBlbmQuCi0gIGF1dG8gdGVzdF9wYWNrZXRfZnJvbV9vdGhlcl9lbmQgPSBiaWRpX3F1ZXVlLkdldFVwRW5kKCktPlRyeURlcXVldWUoKTsKLQotICBFWFBFQ1RfVFJVRSh0ZXN0X3BhY2tldF9mcm9tX290aGVyX2VuZCAhPSBudWxscHRyKTsKLQotICAvLyBUaGlzIGlzIGhvdyB3ZSByZWNlaXZlIGRhdGEKLSAgb3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpQYWNrZXRWaWV3PHBhY2tldDo6a0xpdHRsZUVuZGlhbj4+IHVwX2VuZF9lbnF1ZXVlX2J1ZmZlcntiaWRpX3F1ZXVlLkdldFVwRW5kKCl9OwotICBiaWRpX3F1ZXVlLkdldERvd25FbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKGhhbmRsZXJfLCBjb21tb246OkJpbmQoJm15X2VucXVldWVfY2FsbGJhY2spKTsKLQotICBhdXRvIHBhY2tldF9vbmUgPSBzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UmF3QnVpbGRlcj4oKTsKLSAgcGFja2V0X29uZS0+QWRkT2N0ZXRzKHsxLCAyLCAzfSk7Ci0KLSAgdXBfZW5kX2VucXVldWVfYnVmZmVyLkVucXVldWUoc3RkOjptYWtlX3VuaXF1ZTxQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+PihHZXRQYWNrZXRWaWV3KHN0ZDo6bW92ZShwYWNrZXRfb25lKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyXyk7Ci0KLSAgc3luY19oYW5kbGVyKGhhbmRsZXJfKTsKLQotICBhdXRvIG90aGVyX2VuZF9wYWNrZXQgPSBiaWRpX3F1ZXVlLkdldERvd25FbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICBFWFBFQ1RfVFJVRShvdGhlcl9lbmRfcGFja2V0ICE9IG51bGxwdHIpOwotCi0gIGJpZGlfcXVldWUuR2V0RG93bkVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgZGVsZXRlIGhhbmRsZXJfOwotICBkZWxldGUgdGhyZWFkXzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvdGVzdC9mYWtlX25hbWVfZGIuaCBiL2dkL3NlY3VyaXR5L3Rlc3QvZmFrZV9uYW1lX2RiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTMxOTUuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvdGVzdC9mYWtlX25hbWVfZGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm5laWdoYm9yL25hbWVfZGIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1jbGFzcyBGYWtlTmFtZURiTW9kdWxlIDogcHVibGljIG5laWdoYm9yOjpOYW1lRGJNb2R1bGUgewotIHB1YmxpYzoKLSAgRmFrZU5hbWVEYk1vZHVsZSgpIHt9Ci0KLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlIHt9Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZSB7fQotICB2b2lkIFN0b3AoKSBvdmVycmlkZSB7fQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkZha2VOYW1lRGJNb2R1bGUiKTsKLSAgfQotCi0gIHZvaWQgUmVhZFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgICAgaGNpOjpBZGRyZXNzIGFkZHJlc3MsIG5laWdoYm9yOjpSZWFkUmVtb3RlTmFtZURiQ2FsbGJhY2sgY2FsbGJhY2ssIG9zOjpIYW5kbGVyKiBoYW5kbGVyKSBvdmVycmlkZSB7Ci0gICAgaGFuZGxlci0+Q2FsbChzdGQ6Om1vdmUoY2FsbGJhY2spLCBhZGRyZXNzLCB0cnVlKTsKLSAgfQotCi0gIGJvb2wgSXNOYW1lQ2FjaGVkKGhjaTo6QWRkcmVzcyBhZGRyZXNzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBuZWlnaGJvcjo6UmVtb3RlTmFtZSBSZWFkQ2FjaGVkUmVtb3RlTmFtZShoY2k6OkFkZHJlc3MgYWRkcmVzcykgY29uc3QgewotICAgIG5laWdoYm9yOjpSZW1vdGVOYW1lIG5hbWUgPSB7J3QnLCAnZScsICdzJywgJ3QnfTsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS90ZXN0L2Zha2Vfc2VjdXJpdHlfaW50ZXJmYWNlLmggYi9nZC9zZWN1cml0eS90ZXN0L2Zha2Vfc2VjdXJpdHlfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMmYxNWUuLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvdGVzdC9mYWtlX3NlY3VyaXR5X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLWNsYXNzIEZha2VMaW5rU2VjdXJpdHlJbnRlcmZhY2UgOiBwdWJsaWMgbDJjYXA6OmNsYXNzaWM6OkxpbmtTZWN1cml0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICBGYWtlTGlua1NlY3VyaXR5SW50ZXJmYWNlKGwyY2FwOjpjbGFzc2ljOjpMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lciogbGlzdGVuZXIsIGhjaTo6QWRkcmVzcyBhZGRyZXNzKQotICAgICAgOiBsaXN0ZW5lcl8obGlzdGVuZXIpLCBhZGRyZXNzXyhhZGRyZXNzKSB7fQotCi0gIGhjaTo6QWRkcmVzcyBHZXRSZW1vdGVBZGRyZXNzKCkgewotICAgIHJldHVybiBhZGRyZXNzXzsKLSAgfQotICB2b2lkIEhvbGQoKSBvdmVycmlkZSB7fQotICB2b2lkIEVuc3VyZUF1dGhlbnRpY2F0ZWQoKSBvdmVycmlkZXt9OwotCi0gIHZvaWQgRW5zdXJlRW5jcnlwdGVkKCkgb3ZlcnJpZGUge30KLQotICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7Ci0gICAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogU2ltdWxhdGUgdGhlIGRlbGF5Ci0gICAgbGlzdGVuZXJfLT5PbkxpbmtEaXNjb25uZWN0ZWQoYWRkcmVzc18pOwotICB9Ci0gIHZvaWQgRGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKLSAgICBsaXN0ZW5lcl8tPk9uTGlua0Rpc2Nvbm5lY3RlZChhZGRyZXNzXyk7Ci0gIH0KLSAgdWludDE2X3QgR2V0QWNsSGFuZGxlKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiAwOwotICB9Ci0KLSBwcml2YXRlOgotICBsMmNhcDo6Y2xhc3NpYzo6TGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIqIGxpc3RlbmVyXyA9IG51bGxwdHI7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzXzsKLX07Ci0KLWNsYXNzIEZha2VTZWN1cml0eUludGVyZmFjZSA6IHB1YmxpYyBsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgRmFrZVNlY3VyaXR5SW50ZXJmYWNlKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBsMmNhcDo6Y2xhc3NpYzo6TGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIqIGxpc3RlbmVyKQotICAgICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgbGlzdGVuZXJfKGxpc3RlbmVyKSB7fQotICB+RmFrZVNlY3VyaXR5SW50ZXJmYWNlKCkge30KLSAgdm9pZCBJbml0aWF0ZUNvbm5lY3Rpb25Gb3JTZWN1cml0eShoY2k6OkFkZHJlc3MgcmVtb3RlKSBvdmVycmlkZSB7Ci0gICAgbGlzdGVuZXJfLT5PbkxpbmtDb25uZWN0ZWQoc3RkOjptYWtlX3VuaXF1ZTxGYWtlTGlua1NlY3VyaXR5SW50ZXJmYWNlPihsaXN0ZW5lcl8sIHJlbW90ZSkpOwotICB9OwotICB2b2lkIFVucmVnaXN0ZXIoKSBvdmVycmlkZSB7fQotCi0gcHJpdmF0ZToKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwotICBsMmNhcDo6Y2xhc3NpYzo6TGlua1NlY3VyaXR5SW50ZXJmYWNlTGlzdGVuZXIqIGxpc3RlbmVyXyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZWN1cml0eQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2VjdXJpdHkvdGVzdC9mYWtlX3N0b3JhZ2VfbW9kdWxlLmggYi9nZC9zZWN1cml0eS90ZXN0L2Zha2Vfc3RvcmFnZV9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2NmE0Yi4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS90ZXN0L2Zha2Vfc3RvcmFnZV9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInN0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotI2luY2x1ZGUgPGZpbGVzeXN0ZW0+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLQotc3RhdGljIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga1Rlc3RDb25maWdTYXZlRGVsYXkgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCk7Ci0KLWNsYXNzIEZha2VTdG9yYWdlTW9kdWxlIDogcHVibGljIHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGUgewotIHB1YmxpYzoKLSAgRmFrZVN0b3JhZ2VNb2R1bGUoKSA6IHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGUoIi90bXAvdGVtcF9jb25maWcudHh0Iiwga1Rlc3RDb25maWdTYXZlRGVsYXksIDEwMCwgZmFsc2UsIGZhbHNlKSB7fQotCi0gIHN0b3JhZ2U6OkNvbmZpZ0NhY2hlKiBHZXRDb25maWdDYWNoZVB1YmxpYygpIHsKLSAgICByZXR1cm4gU3RvcmFnZU1vZHVsZTo6R2V0Q29uZmlnQ2FjaGUoKTsKLSAgfQotCi0gIHZvaWQgU2F2ZUltbWVkaWF0ZWx5UHVibGljKCkgewotICAgIFN0b3JhZ2VNb2R1bGU6OlNhdmVJbW1lZGlhdGVseSgpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3Rlc3QvbW9ja3MuaCBiL2dkL3NlY3VyaXR5L3Rlc3QvbW9ja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkYzkwOS4uMDAwMDAwMAotLS0gYS9nZC9zZWN1cml0eS90ZXN0L21vY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9sZV9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzZWN1cml0eS91aS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLWNsYXNzIFVJTW9jayA6IHB1YmxpYyBVSSB7Ci0gcHVibGljOgotICBVSU1vY2soKSA9IGRlZmF1bHQ7Ci0gIH5VSU1vY2soKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQ29udmVydCB0aGVzZSB0byBhY2NlcHQgQ29uZmlybWF0aW9uRGF0YQotICBNT0NLX01FVEhPRDIoRGlzcGxheVBhaXJpbmdQcm9tcHQsIHZvaWQoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgc3RkOjpzdHJpbmcgbmFtZSkpOwotICBNT0NLX01FVEhPRDEoQ2FuY2VsLCB2b2lkKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MpKTsKLSAgTU9DS19NRVRIT0QxKERpc3BsYXlDb25maXJtVmFsdWUsIHZvaWQoQ29uZmlybWF0aW9uRGF0YSkpOwotICBNT0NLX01FVEhPRDEoRGlzcGxheVllc05vRGlhbG9nLCB2b2lkKENvbmZpcm1hdGlvbkRhdGEpKTsKLSAgTU9DS19NRVRIT0QxKERpc3BsYXlFbnRlclBhc3NrZXlEaWFsb2csIHZvaWQoQ29uZmlybWF0aW9uRGF0YSkpOwotICBNT0NLX01FVEhPRDEoRGlzcGxheVBhc3NrZXksIHZvaWQoQ29uZmlybWF0aW9uRGF0YSkpOwotICBNT0NLX01FVEhPRDEoRGlzcGxheUVudGVyUGluRGlhbG9nLCB2b2lkKENvbmZpcm1hdGlvbkRhdGEpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihVSU1vY2spOwotfTsKLQotY2xhc3MgTGVTZWN1cml0eUludGVyZmFjZU1vY2sgOiBwdWJsaWMgaGNpOjpMZVNlY3VyaXR5SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMihFbnF1ZXVlQ29tbWFuZCwgdm9pZChzdGQ6OnVuaXF1ZV9wdHI8aGNpOjpMZVNlY3VyaXR5Q29tbWFuZEJ1aWxkZXI+IGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcpPiBvbl9jb21wbGV0ZSkpOwotICBNT0NLX01FVEhPRDIoRW5xdWV1ZUNvbW1hbmQsIHZvaWQoc3RkOjp1bmlxdWVfcHRyPGhjaTo6TGVTZWN1cml0eUNvbW1hbmRCdWlsZGVyPiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpDb250ZXh0dWFsT25jZUNhbGxiYWNrPHZvaWQoaGNpOjpDb21tYW5kU3RhdHVzVmlldyk+IG9uX3N0YXR1cykpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZWN1cml0eS90ZXN0L3BhaXJpbmdfaGFuZGxlcl9sZV9wYWlyX3Rlc3QuY2MgYi9nZC9zZWN1cml0eS90ZXN0L3BhaXJpbmdfaGFuZGxlcl9sZV9wYWlyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGU2MzguLjAwMDAwMDAKLS0tIGEvZ2Qvc2VjdXJpdHkvdGVzdC9wYWlyaW5nX2hhbmRsZXJfbGVfcGFpcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb21tb24vdGVzdGluZy93aXJlZF9wYWlyX29mX2JpZGlfcXVldWVzLmgiCi0jaW5jbHVkZSAiaGNpL2xlX3NlY3VyaXR5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3BhaXJpbmdfaGFuZGxlcl9sZS5oIgotI2luY2x1ZGUgInNlY3VyaXR5L3Rlc3QvbW9ja3MuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6Okludm9rZTsKLXVzaW5nIHRlc3Rpbmc6Okludm9rZVdpdGhvdXRBcmdzOwotdXNpbmcgdGVzdGluZzo6TWF0Y2hlcjsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmc7Ci0KLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXc7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6Q29tbWFuZFN0YXR1c1ZpZXc7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6RW5jcnlwdGlvbkNoYW5nZUJ1aWxkZXI7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6RW5jcnlwdGlvbkVuYWJsZWQ7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50QnVpbGRlcjsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpFdmVudFZpZXc7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6TGVTZWN1cml0eUNvbW1hbmRCdWlsZGVyOwotCi0vLyBydW46Ci0vLyBvdXQvaG9zdC9saW51eC14ODYvbmF0aXZldGVzdC9ibHVldG9vdGhfdGVzdF9nZC9ibHVldG9vdGhfdGVzdF9nZCAtLWd0ZXN0X2ZpbHRlcj1QYWlyaW5nKgotLy8gYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvYmx1ZXRvb3RoX3Rlc3RfZ2QvYmx1ZXRvb3RoX3Rlc3RfZ2QgIC0tZ3Rlc3RfZmlsdGVyPVBhaXJpbmdIYW5kbGVyUGFpclRlc3QuKgotLy8gLS1ndGVzdF9yZXBlYXQ9MTAgLS1ndGVzdF9zaHVmZmxlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNlY3VyaXR5IHsKLUNvbW1hbmRWaWV3IENvbW1hbmRCdWlsZGVyVG9WaWV3KHN0ZDo6dW5pcXVlX3B0cjxCYXNlUGFja2V0QnVpbGRlcj4gYnVpbGRlcikgewotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldF9ieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIEJpdEluc2VydGVyIGl0KCpwYWNrZXRfYnl0ZXMpOwotICBidWlsZGVyLT5TZXJpYWxpemUoaXQpOwotICBQYWNrZXRWaWV3PGtMaXR0bGVFbmRpYW4+IHBhY2tldF9ieXRlc192aWV3KHBhY2tldF9ieXRlcyk7Ci0gIGF1dG8gdGVtcF9jbWRfdmlldyA9IENvbW1hbmRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICByZXR1cm4gQ29tbWFuZFZpZXc6OkNyZWF0ZSh0ZW1wX2NtZF92aWV3KTsKLX0KLQotRXZlbnRWaWV3IEV2ZW50QnVpbGRlclRvVmlldyhzdGQ6OnVuaXF1ZV9wdHI8RXZlbnRCdWlsZGVyPiBidWlsZGVyKSB7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2J5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgQml0SW5zZXJ0ZXIgaXQoKnBhY2tldF9ieXRlcyk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZShpdCk7Ci0gIFBhY2tldFZpZXc8a0xpdHRsZUVuZGlhbj4gcGFja2V0X2J5dGVzX3ZpZXcocGFja2V0X2J5dGVzKTsKLSAgYXV0byB0ZW1wX2V2dF92aWV3ID0gRXZlbnRWaWV3OjpDcmVhdGUocGFja2V0X2J5dGVzX3ZpZXcpOwotICByZXR1cm4gRXZlbnRWaWV3OjpDcmVhdGUodGVtcF9ldnRfdmlldyk7Ci19Ci19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIHVpbnQxNl90IENPTk5fSEFORExFX0NFTlRSQUwgPSAweDMxLCBDT05OX0hBTkRMRV9QRVJJUEhFUkFMID0gMHgzMjsKLXN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnNlY3VyaXR5OjpQYWlyaW5nSGFuZGxlckxlPiBwYWlyaW5nX2hhbmRsZXJfYSwgcGFpcmluZ19oYW5kbGVyX2I7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci0KLW5hbWVzcGFjZSB7Ci1BZGRyZXNzIEFERFJFU1NfQ0VOVFJBTHt7MHgyNiwgMHg2NCwgMHg3NiwgMHg4NiwgMHhhYiwgMHhiYX19OwotQWRkcmVzc1R5cGUgQUREUkVTU19UWVBFX0NFTlRSQUwgPSBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTOwotQWRkcmVzcyBJREVOVElUWV9BRERSRVNTX0NFTlRSQUx7ezB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OTAsIDB4YWF9fTsKLUFkZHJlc3NUeXBlIElERU5USVRZX0FERFJFU1NfVFlQRV9DRU5UUkFMID0gQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLWNyeXB0b190b29sYm94OjpPY3RldDE2IElSS19DRU5UUkFMID0gewotICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGZ9OwotCi1BZGRyZXNzIEFERFJFU1NfUEVSSVBIRVJBTHt7MHgzMywgMHg1OCwgMHgyNCwgMHg3NiwgMHgxMSwgMHg4OX19OwotQWRkcmVzc1R5cGUgQUREUkVTU19UWVBFX1BFUklQSEVSQUwgPSBBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTOwotQWRkcmVzcyBJREVOVElUWV9BRERSRVNTX1BFUklQSEVSQUx7ezB4MjEsIDB4NDMsIDB4NjUsIDB4ODcsIDB4MDksIDB4NDR9fTsKLUFkZHJlc3NUeXBlIElERU5USVRZX0FERFJFU1NfVFlQRV9QRVJJUEhFUkFMID0gQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzsKLWNyeXB0b190b29sYm94OjpPY3RldDE2IElSS19QRVJJUEhFUkFMID0gewotICAgIDB4MGYsIDB4MGUsIDB4MGQsIDB4MGMsIDB4MGIsIDB4MGEsIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDF9OwotCi1zdGQ6Om9wdGlvbmFsPFBhaXJpbmdSZXN1bHRPckZhaWx1cmU+IHBhaXJpbmdfcmVzdWx0X2NlbnRyYWw7Ci1zdGQ6Om9wdGlvbmFsPFBhaXJpbmdSZXN1bHRPckZhaWx1cmU+IHBhaXJpbmdfcmVzdWx0X3BlcmlwaGVyYWw7Ci0KLXZvaWQgT25QYWlyaW5nRmluaXNoZWRDZW50cmFsKFBhaXJpbmdSZXN1bHRPckZhaWx1cmUgcikgewotICBwYWlyaW5nX3Jlc3VsdF9jZW50cmFsID0gcjsKLSAgaWYgKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4ocikpIHsKLSAgICBMT0dfSU5GTygicGFpcmluZyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgd2l0aCAlcyIsIHN0ZDo6Z2V0PFBhaXJpbmdSZXN1bHQ+KHIpLmNvbm5lY3Rpb25fYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJwYWlyaW5nIHdpdGggLi4uIGZhaWxlZDogJXMiLCBzdGQ6OmdldDxQYWlyaW5nRmFpbHVyZT4ocikubWVzc2FnZS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIE9uUGFpcmluZ0ZpbmlzaGVkUGVyaXBoZXJhbChQYWlyaW5nUmVzdWx0T3JGYWlsdXJlIHIpIHsKLSAgcGFpcmluZ19yZXN1bHRfcGVyaXBoZXJhbCA9IHI7Ci0gIGlmIChzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdSZXN1bHQ+KHIpKSB7Ci0gICAgTE9HX0lORk8oInBhaXJpbmcgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IHdpdGggJXMiLCBzdGQ6OmdldDxQYWlyaW5nUmVzdWx0PihyKS5jb25uZWN0aW9uX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygicGFpcmluZyB3aXRoIC4uLiBmYWlsZWQ6ICVzIiwgc3RkOjpnZXQ8UGFpcmluZ0ZhaWx1cmU+KHIpLm1lc3NhZ2UuY19zdHIoKSk7Ci0gIH0KLX0KLQotfTsgIC8vIG5hbWVzcGFjZQotCi0vLyBXZSBvYnRhaW4gdGhpcyBtdXRleCB3aGVuIHdlIHN0YXJ0IGluaXRpYWxpemluZyB0aGUgaGFuZGxlcnMsIGFuZCByZWxlc2UgaXQgd2hlbiBib3RoIGhhbmRsZXJzIGFyZSBpbml0aWFsaXplZAotc3RkOjptdXRleCBoYW5kbGVyc19pbml0aWFsaXphdGlvbl9ndWFyZDsKLQotY2xhc3MgUGFpcmluZ0hhbmRsZXJQYWlyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSAgdm9pZCBkZXF1ZXVlX2NhbGxiYWNrX2NlbnRyYWwoKSB7Ci0gICAgYXV0byBwYWNrZXRfYnl0ZXNfdmlldyA9IGwyY2FwXy0+R2V0UXVldWVBVXBFbmQoKS0+VHJ5RGVxdWV1ZSgpOwotICAgIGlmICghcGFja2V0X2J5dGVzX3ZpZXcpIExPR19FUlJPUigiUmVjZWl2ZWQgZGVxdWV1ZSwgYnV0IG5vIGRhdGEgcmVhZHkuLi4iKTsKLQotICAgIGF1dG8gdGVtcF9jbWRfdmlldyA9IENvbW1hbmRWaWV3OjpDcmVhdGUoKnBhY2tldF9ieXRlc192aWV3KTsKLSAgICBpZiAoIWZpcnN0X2NvbW1hbmRfc2VudCkgewotICAgICAgZmlyc3RfY29tbWFuZCA9IHN0ZDo6bWFrZV91bmlxdWU8Q29tbWFuZFZpZXc+KENvbW1hbmRWaWV3OjpDcmVhdGUodGVtcF9jbWRfdmlldykpOwotICAgICAgZmlyc3RfY29tbWFuZF9zZW50ID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXBhaXJpbmdfaGFuZGxlcl9hKSBMT0dfQUxXQVlTX0ZBVEFMKCJQZXJpcGhlcmFsIGhhbmRsZXIgbm90IGluaXRsaXplZCB5ZXQhIik7Ci0KLSAgICBwYWlyaW5nX2hhbmRsZXJfYS0+T25Db21tYW5kVmlldyhDb21tYW5kVmlldzo6Q3JlYXRlKHRlbXBfY21kX3ZpZXcpKTsKLSAgfQotCi0gIHZvaWQgZGVxdWV1ZV9jYWxsYmFja19wZXJpcGhlcmFsKCkgewotICAgIGF1dG8gcGFja2V0X2J5dGVzX3ZpZXcgPSBsMmNhcF8tPkdldFF1ZXVlQlVwRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBpZiAoIXBhY2tldF9ieXRlc192aWV3KSBMT0dfRVJST1IoIlJlY2VpdmVkIGRlcXVldWUsIGJ1dCBubyBkYXRhIHJlYWR5Li4uIik7Ci0KLSAgICBhdXRvIHRlbXBfY21kX3ZpZXcgPSBDb21tYW5kVmlldzo6Q3JlYXRlKCpwYWNrZXRfYnl0ZXNfdmlldyk7Ci0gICAgaWYgKCFmaXJzdF9jb21tYW5kX3NlbnQpIHsKLSAgICAgIGZpcnN0X2NvbW1hbmQgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbW1hbmRWaWV3PihDb21tYW5kVmlldzo6Q3JlYXRlKHRlbXBfY21kX3ZpZXcpKTsKLSAgICAgIGZpcnN0X2NvbW1hbmRfc2VudCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFwYWlyaW5nX2hhbmRsZXJfYikgTE9HX0FMV0FZU19GQVRBTCgiQ2VudHJhbCBoYW5kbGVyIG5vdCBpbml0bGl6ZWQgeWV0ISIpOwotCi0gICAgcGFpcmluZ19oYW5kbGVyX2ItPk9uQ29tbWFuZFZpZXcoQ29tbWFuZFZpZXc6OkNyZWF0ZSh0ZW1wX2NtZF92aWV3KSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIHsKLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoInRlc3RfdGhyZWFkIiwgb3M6OlRocmVhZDo6UHJpb3JpdHk6Ok5PUk1BTCk7Ci0gICAgaGFuZGxlcl8gPSBuZXcgb3M6OkhhbmRsZXIodGhyZWFkXyk7Ci0KLSAgICBsMmNhcF8gPSBuZXcgY29tbW9uOjp0ZXN0aW5nOjpXaXJlZFBhaXJPZkwyY2FwUXVldWVzKGhhbmRsZXJfKTsKLSAgICAvLyBjZW50cmFsIHNlbmRzIGl0J3MgcGFja2V0IGludG8gbDJjYXAtPmRvd25fYnVmZmVyX2JfCi0gICAgLy8gcGVyaXBoZXJhbCBzZW5kcyBpdCdzIHBhY2tldCBpbnRvIGwyY2FwLT5kb3duX2J1ZmZlcl9hXwotICAgIGwyY2FwXy0+R2V0UXVldWVBVXBFbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBoYW5kbGVyXywgY29tbW9uOjpCaW5kKCZQYWlyaW5nSGFuZGxlclBhaXJUZXN0OjpkZXF1ZXVlX2NhbGxiYWNrX2NlbnRyYWwsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIGwyY2FwXy0+R2V0UXVldWVCVXBFbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBoYW5kbGVyXywgY29tbW9uOjpCaW5kKCZQYWlyaW5nSGFuZGxlclBhaXJUZXN0OjpkZXF1ZXVlX2NhbGxiYWNrX3BlcmlwaGVyYWwsIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotCi0gICAgdXBfYnVmZmVyX2FfID0gc3RkOjptYWtlX3VuaXF1ZTxvczo6RW5xdWV1ZUJ1ZmZlcjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4obDJjYXBfLT5HZXRRdWV1ZUFVcEVuZCgpKTsKLSAgICB1cF9idWZmZXJfYl8gPSBzdGQ6Om1ha2VfdW5pcXVlPG9zOjpFbnF1ZXVlQnVmZmVyPHBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+PihsMmNhcF8tPkdldFF1ZXVlQlVwRW5kKCkpOwotCi0gICAgY2VudHJhbF9zZXR1cCA9IHsKLSAgICAgICAgLm15X3JvbGUgPSBoY2k6OlJvbGU6OkNFTlRSQUwsCi0gICAgICAgIC5teV9jb25uZWN0aW9uX2FkZHJlc3MgPSB7QUREUkVTU19DRU5UUkFMLCBBRERSRVNTX1RZUEVfQ0VOVFJBTH0sCi0gICAgICAgIC5teV9pZGVudGl0eV9hZGRyZXNzID0ge0lERU5USVRZX0FERFJFU1NfQ0VOVFJBTCwgSURFTlRJVFlfQUREUkVTU19UWVBFX0NFTlRSQUx9LAotICAgICAgICAubXlfaWRlbnRpdHlfcmVzb2x2aW5nX2tleSA9IElSS19DRU5UUkFMLAotCi0gICAgICAgIC5teVBhaXJpbmdDYXBhYmlsaXRpZXMgPSB7LmlvX2NhcGFiaWxpdHkgPSBJb0NhcGFiaWxpdHk6Ok5PX0lOUFVUX05PX09VVFBVVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub29iX2RhdGFfZmxhZyA9IE9vYkRhdGFGbGFnOjpOT1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXV0aF9yZXEgPSBBdXRoUmVxTWFza0JvbmRpbmdGbGFnIHwgQXV0aFJlcU1hc2tNaXRtIHwgQXV0aFJlcU1hc2tTYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4aW11bV9lbmNyeXB0aW9uX2tleV9zaXplID0gMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYXRvcl9rZXlfZGlzdHJpYnV0aW9uID0gS2V5TWFza0lkIHwgS2V5TWFza1NpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uID0gS2V5TWFza0lkIHwgS2V5TWFza1NpZ259LAotCi0gICAgICAgIC5yZW1vdGVseV9pbml0aWF0ZWQgPSBmYWxzZSwKLSAgICAgICAgLmNvbm5lY3Rpb25faGFuZGxlID0gQ09OTl9IQU5ETEVfQ0VOVFJBTCwKLSAgICAgICAgLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MgPSB7QUREUkVTU19QRVJJUEhFUkFMLCBBRERSRVNTX1RZUEVfUEVSSVBIRVJBTH0sCi0gICAgICAgIC51c2VyX2ludGVyZmFjZSA9ICZjZW50cmFsX3VzZXJfaW50ZXJmYWNlLAotICAgICAgICAudXNlcl9pbnRlcmZhY2VfaGFuZGxlciA9IGhhbmRsZXJfLAotICAgICAgICAubGVfc2VjdXJpdHlfaW50ZXJmYWNlID0gJmNlbnRyYWxfbGVfc2VjdXJpdHlfbW9jaywKLSAgICAgICAgLnByb3Blcl9sMmNhcF9pbnRlcmZhY2UgPSB1cF9idWZmZXJfYV8uZ2V0KCksCi0gICAgICAgIC5sMmNhcF9oYW5kbGVyID0gaGFuZGxlcl8sCi0gICAgICAgIC5PblBhaXJpbmdGaW5pc2hlZCA9IE9uUGFpcmluZ0ZpbmlzaGVkQ2VudHJhbCwKLSAgICB9OwotCi0gICAgcGVyaXBoZXJhbF9zZXR1cCA9IHsKLSAgICAgICAgLm15X3JvbGUgPSBoY2k6OlJvbGU6OlBFUklQSEVSQUwsCi0KLSAgICAgICAgLm15X2Nvbm5lY3Rpb25fYWRkcmVzcyA9IHtBRERSRVNTX1BFUklQSEVSQUwsIEFERFJFU1NfVFlQRV9QRVJJUEhFUkFMfSwKLSAgICAgICAgLm15X2lkZW50aXR5X2FkZHJlc3MgPSB7SURFTlRJVFlfQUREUkVTU19QRVJJUEhFUkFMLCBJREVOVElUWV9BRERSRVNTX1RZUEVfUEVSSVBIRVJBTH0sCi0gICAgICAgIC5teV9pZGVudGl0eV9yZXNvbHZpbmdfa2V5ID0gSVJLX1BFUklQSEVSQUwsCi0KLSAgICAgICAgLm15UGFpcmluZ0NhcGFiaWxpdGllcyA9IHsuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdXRoX3JlcSA9IEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgfCBBdXRoUmVxTWFza01pdG0gfCBBdXRoUmVxTWFza1NjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemUgPSAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdGlhdG9yX2tleV9kaXN0cmlidXRpb24gPSBLZXlNYXNrSWQgfCBLZXlNYXNrU2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzcG9uZGVyX2tleV9kaXN0cmlidXRpb24gPSBLZXlNYXNrSWQgfCBLZXlNYXNrU2lnbn0sCi0gICAgICAgIC5yZW1vdGVseV9pbml0aWF0ZWQgPSB0cnVlLAotICAgICAgICAuY29ubmVjdGlvbl9oYW5kbGUgPSBDT05OX0hBTkRMRV9QRVJJUEhFUkFMLAotICAgICAgICAucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcyA9IHtBRERSRVNTX0NFTlRSQUwsIEFERFJFU1NfVFlQRV9DRU5UUkFMfSwKLSAgICAgICAgLnVzZXJfaW50ZXJmYWNlID0gJnBlcmlwaGVyYWxfdXNlcl9pbnRlcmZhY2UsCi0gICAgICAgIC51c2VyX2ludGVyZmFjZV9oYW5kbGVyID0gaGFuZGxlcl8sCi0gICAgICAgIC5sZV9zZWN1cml0eV9pbnRlcmZhY2UgPSAmcGVyaXBoZXJhbF9sZV9zZWN1cml0eV9tb2NrLAotICAgICAgICAucHJvcGVyX2wyY2FwX2ludGVyZmFjZSA9IHVwX2J1ZmZlcl9iXy5nZXQoKSwKLSAgICAgICAgLmwyY2FwX2hhbmRsZXIgPSBoYW5kbGVyXywKLSAgICAgICAgLk9uUGFpcmluZ0ZpbmlzaGVkID0gT25QYWlyaW5nRmluaXNoZWRQZXJpcGhlcmFsLAotICAgIH07Ci0KLSAgICBSZWNvcmRTdWNjZXNzZnVsRW5jcnlwdGlvbkNvbXBsZXRlKCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJnBlcmlwaGVyYWxfdXNlcl9pbnRlcmZhY2UpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmNlbnRyYWxfdXNlcl9pbnRlcmZhY2UpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJnBlcmlwaGVyYWxfbGVfc2VjdXJpdHlfbW9jayk7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmY2VudHJhbF9sZV9zZWN1cml0eV9tb2NrKTsKLQotICAgIHBhaXJpbmdfaGFuZGxlcl9hLnJlc2V0KCk7Ci0gICAgcGFpcmluZ19oYW5kbGVyX2IucmVzZXQoKTsKLSAgICBwYWlyaW5nX3Jlc3VsdF9jZW50cmFsLnJlc2V0KCk7Ci0gICAgcGFpcmluZ19yZXN1bHRfcGVyaXBoZXJhbC5yZXNldCgpOwotCi0gICAgZmlyc3RfY29tbWFuZF9zZW50ID0gZmFsc2U7Ci0gICAgZmlyc3RfY29tbWFuZC5yZXNldCgpOwotCi0gICAgbDJjYXBfLT5HZXRRdWV1ZUFVcEVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIGwyY2FwXy0+R2V0UXVldWVCVXBFbmQoKS0+VW5yZWdpc3RlckRlcXVldWUoKTsKLQotICAgIGRlbGV0ZSBsMmNhcF87Ci0gICAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gICAgZGVsZXRlIGhhbmRsZXJfOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICB9Ci0KLSAgdm9pZCBSZWNvcmRQYWlyaW5nUHJvbXB0SGFuZGxpbmcoVUlNb2NrJiB1aV9tb2NrLCBzdGQ6OnVuaXF1ZV9wdHI8UGFpcmluZ0hhbmRsZXJMZT4qIGhhbmRsZXIpIHsKLSAgICBFWFBFQ1RfQ0FMTCh1aV9tb2NrLCBEaXNwbGF5UGFpcmluZ1Byb21wdChfLCBfKSkuVGltZXMoMSkuV2lsbE9uY2UoSW52b2tlV2l0aG91dEFyZ3MoW2hhbmRsZXJdKCkgewotICAgICAgTE9HX0lORk8oIlVJIG1vY2sgcmVjZWl2ZWQgcGFpcmluZyBwcm9tcHQiKTsKLQotICAgICAgewotICAgICAgICAvLyBCeSBncmFiYmluZyB0aGUgbG9jaywgd2UgZW5zdXJlIGluaXRpYWxpemF0aW9uIG9mIGJvdGggcGFpcmluZyBoYW5kbGVycyBpcyBmaW5pc2hlZC4KLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soaGFuZGxlcnNfaW5pdGlhbGl6YXRpb25fZ3VhcmQpOwotICAgICAgfQotCi0gICAgICBpZiAoISgqaGFuZGxlcikpIExPR19BTFdBWVNfRkFUQUwoImhhbmRsZXIgbm90IGluaXRhbGl6ZWQgeWV0ISIpOwotICAgICAgLy8gU2ltdWxhdGUgdXNlciBhY2NlcHRpbmcgdGhlIHBhaXJpbmcgaW4gVUkKLSAgICAgICgqaGFuZGxlciktPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQUlSSU5HX0FDQ0VQVEVELCAweDAxIC8qIE5vbi16ZXJvIHZhbHVlIG1lYW5zIHN1Y2Nlc3MgKi8pOwotICAgIH0pKTsKLSAgfQotCi0gIHZvaWQgUmVjb3JkU3VjY2Vzc2Z1bEVuY3J5cHRpb25Db21wbGV0ZSgpIHsKLSAgICAvLyBGb3Igbm93LCBhbGwgdGVzdHMgYXJlIHN1Y2NlZWRpbmcgdG8gZ28gdGhyb3VnaCBFbmNyeXB0aW9uLiBSZWNvcmQgdGhhdCBpbiB0aGUgc2V0dXAuCi0gICAgLy8gIE9uY2Ugd2UgdGVzdCBmYWlsdXJlIGNhc2VzLCBtb3ZlIHRoaXMgdG8gZWFjaCB0ZXN0Ci0gICAgRVhQRUNUX0NBTEwoCi0gICAgICAgIGNlbnRyYWxfbGVfc2VjdXJpdHlfbW9jaywKLSAgICAgICAgRW5xdWV1ZUNvbW1hbmQoXywgTWF0Y2hlcjxjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChDb21tYW5kU3RhdHVzVmlldyk+PihfKSkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2lsbE9uY2UoW10oc3RkOjp1bmlxdWVfcHRyPExlU2VjdXJpdHlDb21tYW5kQnVpbGRlcj4gY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6Q29udGV4dHVhbE9uY2VDYWxsYmFjazx2b2lkKENvbW1hbmRTdGF0dXNWaWV3KT4gb25fc3RhdHVzKSB7Ci0gICAgICAgICAgLy8gVE9ETzogb25fc3RhdHVzLlJ1bigpOwotCi0gICAgICAgICAgcGFpcmluZ19oYW5kbGVyX2EtPk9uSGNpRXZlbnQoRXZlbnRCdWlsZGVyVG9WaWV3KAotICAgICAgICAgICAgICBFbmNyeXB0aW9uQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUywgQ09OTl9IQU5ETEVfQ0VOVFJBTCwgRW5jcnlwdGlvbkVuYWJsZWQ6Ok9OKSkpOwotCi0gICAgICAgICAgcGFpcmluZ19oYW5kbGVyX2ItPk9uSGNpRXZlbnQoRXZlbnRCdWlsZGVyVG9WaWV3KAotICAgICAgICAgICAgICBoY2k6OkxlTG9uZ1Rlcm1LZXlSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKENPTk5fSEFORExFX1BFUklQSEVSQUwsIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgMCkpKTsKLQotICAgICAgICAgIHBhaXJpbmdfaGFuZGxlcl9iLT5PbkhjaUV2ZW50KEV2ZW50QnVpbGRlclRvVmlldygKLSAgICAgICAgICAgICAgRW5jcnlwdGlvbkNoYW5nZUJ1aWxkZXI6OkNyZWF0ZShFcnJvckNvZGU6OlNVQ0NFU1MsIENPTk5fSEFORExFX1BFUklQSEVSQUwsIEVuY3J5cHRpb25FbmFibGVkOjpPTikpKTsKLSAgICAgICAgfSk7Ci0gIH0KLQotIHB1YmxpYzoKLSAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbW1hbmRWaWV3PiBXYWl0Rmlyc3RMMmNhcENvbW1hbmQoKSB7Ci0gICAgd2hpbGUgKCFmaXJzdF9jb21tYW5kX3NlbnQpIHsKLSAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxbXMpOwotICAgICAgTE9HX0lORk8oIndhaXRpbmcgZm9yIGZpcnN0IGNvbW1hbmQuLi4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RkOjptb3ZlKGZpcnN0X2NvbW1hbmQpOwotICB9Ci0KLSAgSW5pdGlhbEluZm9ybWF0aW9ucyBjZW50cmFsX3NldHVwOwotICBJbml0aWFsSW5mb3JtYXRpb25zIHBlcmlwaGVyYWxfc2V0dXA7Ci0gIFVJTW9jayBjZW50cmFsX3VzZXJfaW50ZXJmYWNlOwotICBVSU1vY2sgcGVyaXBoZXJhbF91c2VyX2ludGVyZmFjZTsKLSAgTGVTZWN1cml0eUludGVyZmFjZU1vY2sgY2VudHJhbF9sZV9zZWN1cml0eV9tb2NrOwotICBMZVNlY3VyaXR5SW50ZXJmYWNlTW9jayBwZXJpcGhlcmFsX2xlX3NlY3VyaXR5X21vY2s7Ci0KLSAgdWludDE2X3QgZmlyc3RfY29tbWFuZF9zZW50ID0gZmFsc2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnNlY3VyaXR5OjpDb21tYW5kVmlldz4gZmlyc3RfY29tbWFuZDsKLQotICBvczo6VGhyZWFkKiB0aHJlYWRfOwotICBvczo6SGFuZGxlciogaGFuZGxlcl87Ci0gIGNvbW1vbjo6dGVzdGluZzo6V2lyZWRQYWlyT2ZMMmNhcFF1ZXVlcyogbDJjYXBfOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxvczo6RW5xdWV1ZUJ1ZmZlcjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4gdXBfYnVmZmVyX2FfOwotICBzdGQ6OnVuaXF1ZV9wdHI8b3M6OkVucXVldWVCdWZmZXI8cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+IHVwX2J1ZmZlcl9iXzsKLX07Ci0KLS8qIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IEp1c3QgV29ya3MgcGFpcmluZyBmbG93IHdvcmtzLgotICogQm90aCBzaW11bGF0ZWQgZGV2aWNlcyBzcGVjaWZ5IGNhcGFiaWxpdGllcyBhcyBOT19JTlBVVF9OT19PVVRQVVQsIGFuZCBzZWN1cmUgY29ubmVjaXRvbnMgc3VwcG9ydCAqLwotVEVTVF9GKFBhaXJpbmdIYW5kbGVyUGFpclRlc3QsIHRlc3Rfc2VjdXJlX2Nvbm5lY3Rpb25zX2p1c3Rfd29ya3MpIHsKLSAgY2VudHJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBjZW50cmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5UOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5pb19jYXBhYmlsaXR5ID0gSW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQ7Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQ7Ci0KLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhoYW5kbGVyc19pbml0aWFsaXphdGlvbl9ndWFyZCk7Ci0KLSAgICBwYWlyaW5nX2hhbmRsZXJfYSA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBjZW50cmFsX3NldHVwKTsKLQotICAgIGF1dG8gZmlyc3RfcGt0ID0gV2FpdEZpcnN0TDJjYXBDb21tYW5kKCk7Ci0gICAgcGVyaXBoZXJhbF9zZXR1cC5wYWlyaW5nX3JlcXVlc3QgPSBQYWlyaW5nUmVxdWVzdFZpZXc6OkNyZWF0ZSgqZmlyc3RfcGt0KTsKLQotICAgIEVYUEVDVF9DQUxMKHBlcmlwaGVyYWxfdXNlcl9pbnRlcmZhY2UsIERpc3BsYXlQYWlyaW5nUHJvbXB0KF8sIF8pKS5UaW1lcygxKS5XaWxsT25jZShJbnZva2VXaXRob3V0QXJncyhbXSB7Ci0gICAgICBMT0dfSU5GTygiVUkgbW9jayByZWNlaXZlZCBwYWlyaW5nIHByb21wdCIpOwotCi0gICAgICB7Ci0gICAgICAgIC8vIEJ5IGdyYWJiaW5nIHRoZSBsb2NrLCB3ZSBlbnN1cmUgaW5pdGlhbGl6YXRpb24gb2YgYm90aCBwYWlyaW5nIGhhbmRsZXJzIGlzIGZpbmlzaGVkLgotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhoYW5kbGVyc19pbml0aWFsaXphdGlvbl9ndWFyZCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghcGFpcmluZ19oYW5kbGVyX2IpIExPR19BTFdBWVNfRkFUQUwoImhhbmRsZXIgbm90IGluaXRhbGl6ZWQgeWV0ISIpOwotCi0gICAgICAvLyBTaW11bGF0ZSB1c2VyIGFjY2VwdGluZyB0aGUgcGFpcmluZyBpbiBVSQotICAgICAgcGFpcmluZ19oYW5kbGVyX2ItPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQUlSSU5HX0FDQ0VQVEVELCAweDAxIC8qIE5vbi16ZXJvIHZhbHVlIG1lYW5zIHN1Y2Nlc3MgKi8pOwotICAgIH0pKTsKLQotICAgIHBhaXJpbmdfaGFuZGxlcl9iID0gc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nSGFuZGxlckxlPihQYWlyaW5nSGFuZGxlckxlOjpQSEFTRTEsIHBlcmlwaGVyYWxfc2V0dXApOwotICB9Ci0KLSAgcGFpcmluZ19oYW5kbGVyX2EtPldhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZCgpOwotICBwYWlyaW5nX2hhbmRsZXJfYi0+V2FpdFVudGlsUGFpcmluZ0ZpbmlzaGVkKCk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9jZW50cmFsLnZhbHVlKCkpKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9wZXJpcGhlcmFsLnZhbHVlKCkpKTsKLQotICBhdXRvIGNlbnRyYWxfcmVzdWx0ID0gc3RkOjpnZXQ8UGFpcmluZ1Jlc3VsdD4ocGFpcmluZ19yZXN1bHRfY2VudHJhbC52YWx1ZSgpKTsKLSAgQVNTRVJUX0VRKGNlbnRyYWxfcmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2lkZW50aXR5X2FkZHJlc3MtPkdldEFkZHJlc3MoKSwgSURFTlRJVFlfQUREUkVTU19QRVJJUEhFUkFMKTsKLSAgQVNTRVJUX0VRKAotICAgICAgY2VudHJhbF9yZXN1bHQuZGlzdHJpYnV0ZWRfa2V5cy5yZW1vdGVfaWRlbnRpdHlfYWRkcmVzcy0+R2V0QWRkcmVzc1R5cGUoKSwgSURFTlRJVFlfQUREUkVTU19UWVBFX1BFUklQSEVSQUwpOwotICBBU1NFUlRfRVEoKmNlbnRyYWxfcmVzdWx0LmRpc3RyaWJ1dGVkX2tleXMucmVtb3RlX2lyaywgSVJLX1BFUklQSEVSQUwpOwotCi0gIGF1dG8gcGVyaXBoZXJhbF9yZXN1bHQgPSBzdGQ6OmdldDxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9wZXJpcGhlcmFsLnZhbHVlKCkpOwotICBBU1NFUlRfRVEocGVyaXBoZXJhbF9yZXN1bHQuZGlzdHJpYnV0ZWRfa2V5cy5yZW1vdGVfaWRlbnRpdHlfYWRkcmVzcy0+R2V0QWRkcmVzcygpLCBJREVOVElUWV9BRERSRVNTX0NFTlRSQUwpOwotICBBU1NFUlRfRVEoCi0gICAgICBwZXJpcGhlcmFsX3Jlc3VsdC5kaXN0cmlidXRlZF9rZXlzLnJlbW90ZV9pZGVudGl0eV9hZGRyZXNzLT5HZXRBZGRyZXNzVHlwZSgpLCBJREVOVElUWV9BRERSRVNTX1RZUEVfQ0VOVFJBTCk7Ci0gIEFTU0VSVF9FUSgqcGVyaXBoZXJhbF9yZXN1bHQuZGlzdHJpYnV0ZWRfa2V5cy5yZW1vdGVfaXJrLCBJUktfQ0VOVFJBTCk7Ci19Ci0KLVRFU1RfRihQYWlyaW5nSGFuZGxlclBhaXJUZXN0LCB0ZXN0X3NlY3VyZV9jb25uZWN0aW9uc19qdXN0X3dvcmtzX3BlcmlwaGVyYWxfaW5pdGlhdGVkKSB7Ci0gIGNlbnRyYWxfc2V0dXAgPSB7Ci0gICAgICAubXlfcm9sZSA9IGhjaTo6Um9sZTo6Q0VOVFJBTCwKLSAgICAgIC5teV9jb25uZWN0aW9uX2FkZHJlc3MgPSB7QUREUkVTU19DRU5UUkFMLCBBRERSRVNTX1RZUEVfQ0VOVFJBTH0sCi0gICAgICAubXlfaWRlbnRpdHlfYWRkcmVzcyA9IHtJREVOVElUWV9BRERSRVNTX0NFTlRSQUwsIElERU5USVRZX0FERFJFU1NfVFlQRV9DRU5UUkFMfSwKLSAgICAgIC5teV9pZGVudGl0eV9yZXNvbHZpbmdfa2V5ID0gSVJLX0NFTlRSQUwsCi0gICAgICAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzID0gey5pb19jYXBhYmlsaXR5ID0gSW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXV0aF9yZXEgPSBBdXRoUmVxTWFza0JvbmRpbmdGbGFnIHwgQXV0aFJlcU1hc2tNaXRtIHwgQXV0aFJlcU1hc2tTYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1fZW5jcnlwdGlvbl9rZXlfc2l6ZSA9IDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdGlhdG9yX2tleV9kaXN0cmlidXRpb24gPSBLZXlNYXNrSWQgfCBLZXlNYXNrU2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3BvbmRlcl9rZXlfZGlzdHJpYnV0aW9uID0gS2V5TWFza0lkIHwgS2V5TWFza1NpZ259LAotICAgICAgLnJlbW90ZWx5X2luaXRpYXRlZCA9IHRydWUsCi0gICAgICAuY29ubmVjdGlvbl9oYW5kbGUgPSBDT05OX0hBTkRMRV9DRU5UUkFMLAotICAgICAgLnJlbW90ZV9jb25uZWN0aW9uX2FkZHJlc3MgPSB7QUREUkVTU19QRVJJUEhFUkFMLCBBRERSRVNTX1RZUEVfUEVSSVBIRVJBTH0sCi0gICAgICAudXNlcl9pbnRlcmZhY2UgPSAmY2VudHJhbF91c2VyX2ludGVyZmFjZSwKLSAgICAgIC51c2VyX2ludGVyZmFjZV9oYW5kbGVyID0gaGFuZGxlcl8sCi0gICAgICAubGVfc2VjdXJpdHlfaW50ZXJmYWNlID0gJmNlbnRyYWxfbGVfc2VjdXJpdHlfbW9jaywKLSAgICAgIC5wcm9wZXJfbDJjYXBfaW50ZXJmYWNlID0gdXBfYnVmZmVyX2FfLmdldCgpLAotICAgICAgLmwyY2FwX2hhbmRsZXIgPSBoYW5kbGVyXywKLSAgICAgIC5PblBhaXJpbmdGaW5pc2hlZCA9IE9uUGFpcmluZ0ZpbmlzaGVkQ2VudHJhbCwKLSAgfTsKLQotICBwZXJpcGhlcmFsX3NldHVwID0gewotICAgICAgLm15X3JvbGUgPSBoY2k6OlJvbGU6OlBFUklQSEVSQUwsCi0gICAgICAubXlfY29ubmVjdGlvbl9hZGRyZXNzID0ge0FERFJFU1NfUEVSSVBIRVJBTCwgQUREUkVTU19UWVBFX1BFUklQSEVSQUx9LAotICAgICAgLm15X2lkZW50aXR5X2FkZHJlc3MgPSB7SURFTlRJVFlfQUREUkVTU19QRVJJUEhFUkFMLCBJREVOVElUWV9BRERSRVNTX1RZUEVfUEVSSVBIRVJBTH0sCi0gICAgICAubXlfaWRlbnRpdHlfcmVzb2x2aW5nX2tleSA9IElSS19QRVJJUEhFUkFMLAotICAgICAgLm15UGFpcmluZ0NhcGFiaWxpdGllcyA9IHsuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub29iX2RhdGFfZmxhZyA9IE9vYkRhdGFGbGFnOjpOT1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtX2VuY3J5cHRpb25fa2V5X3NpemUgPSAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYXRvcl9rZXlfZGlzdHJpYnV0aW9uID0gS2V5TWFza0lkIHwgS2V5TWFza1NpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNwb25kZXJfa2V5X2Rpc3RyaWJ1dGlvbiA9IEtleU1hc2tJZCB8IEtleU1hc2tTaWdufSwKLSAgICAgIC5yZW1vdGVseV9pbml0aWF0ZWQgPSBmYWxzZSwKLSAgICAgIC5jb25uZWN0aW9uX2hhbmRsZSA9IENPTk5fSEFORExFX1BFUklQSEVSQUwsCi0gICAgICAucmVtb3RlX2Nvbm5lY3Rpb25fYWRkcmVzcyA9IHtBRERSRVNTX0NFTlRSQUwsIEFERFJFU1NfVFlQRV9DRU5UUkFMfSwKLSAgICAgIC51c2VyX2ludGVyZmFjZSA9ICZwZXJpcGhlcmFsX3VzZXJfaW50ZXJmYWNlLAotICAgICAgLnVzZXJfaW50ZXJmYWNlX2hhbmRsZXIgPSBoYW5kbGVyXywKLSAgICAgIC5sZV9zZWN1cml0eV9pbnRlcmZhY2UgPSAmcGVyaXBoZXJhbF9sZV9zZWN1cml0eV9tb2NrLAotICAgICAgLnByb3Blcl9sMmNhcF9pbnRlcmZhY2UgPSB1cF9idWZmZXJfYl8uZ2V0KCksCi0gICAgICAubDJjYXBfaGFuZGxlciA9IGhhbmRsZXJfLAotICAgICAgLk9uUGFpcmluZ0ZpbmlzaGVkID0gT25QYWlyaW5nRmluaXNoZWRQZXJpcGhlcmFsLAotICB9OwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnNlY3VyaXR5OjpDb21tYW5kVmlldz4gZmlyc3RfcGt0OwotICB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGhhbmRsZXJzX2luaXRpYWxpemF0aW9uX2d1YXJkKTsKLSAgICBwYWlyaW5nX2hhbmRsZXJfYiA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBwZXJpcGhlcmFsX3NldHVwKTsKLQotICAgIGZpcnN0X3BrdCA9IFdhaXRGaXJzdEwyY2FwQ29tbWFuZCgpOwotCi0gICAgRVhQRUNUX0NBTEwoY2VudHJhbF91c2VyX2ludGVyZmFjZSwgRGlzcGxheVBhaXJpbmdQcm9tcHQoXywgXykpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2lsbE9uY2UoSW52b2tlV2l0aG91dEFyZ3MoWyZmaXJzdF9wa3QsIHRoaXNdIHsKLSAgICAgICAgICBMT0dfSU5GTygiVUkgbW9jayByZWNlaXZlZCBwYWlyaW5nIHByb21wdCIpOwotCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQnkgZ3JhYmJpbmcgdGhlIGxvY2ssIHdlIGVuc3VyZSBpbml0aWFsaXphdGlvbiBvZiBib3RoIHBhaXJpbmcgaGFuZGxlcnMgaXMgZmluaXNoZWQuCi0gICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhoYW5kbGVyc19pbml0aWFsaXphdGlvbl9ndWFyZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghcGFpcmluZ19oYW5kbGVyX2EpIExPR19BTFdBWVNfRkFUQUwoImhhbmRsZXIgbm90IGluaXRhbGl6ZWQgeWV0ISIpOwotICAgICAgICAgIC8vIFNpbXVsYXRlIHVzZXIgYWNjZXB0aW5nIHRoZSBwYWlyaW5nIGluIFVJCi0gICAgICAgICAgcGFpcmluZ19oYW5kbGVyX2EtPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQUlSSU5HX0FDQ0VQVEVELCAweDAxIC8qIE5vbi16ZXJvIHZhbHVlIG1lYW5zIHN1Y2Nlc3MgKi8pOwotCi0gICAgICAgICAgLy8gU2VuZCB0aGUgZmlyc3QgcGFja2V0IGZyb20gdGhlIHBlcmlwaGVyYWwgdG8gY2VudHJhbAotICAgICAgICAgIGF1dG8gdmlld190b19wYWNrZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPHBhY2tldDo6UmF3QnVpbGRlcj4oKTsKLSAgICAgICAgICB2aWV3X3RvX3BhY2tldC0+QWRkT2N0ZXRzKHN0ZDo6dmVjdG9yKGZpcnN0X3BrdC0+YmVnaW4oKSwgZmlyc3RfcGt0LT5lbmQoKSkpOwotICAgICAgICAgIHVwX2J1ZmZlcl9iXy0+RW5xdWV1ZShzdGQ6Om1vdmUodmlld190b19wYWNrZXQpLCBoYW5kbGVyXyk7Ci0gICAgICAgIH0pKTsKLSAgICBwYWlyaW5nX2hhbmRsZXJfYSA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBjZW50cmFsX3NldHVwKTsKLSAgfQotCi0gIHBhaXJpbmdfaGFuZGxlcl9hLT5XYWl0VW50aWxQYWlyaW5nRmluaXNoZWQoKTsKLSAgcGFpcmluZ19oYW5kbGVyX2ItPldhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZCgpOwotCi0gIEVYUEVDVF9UUlVFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4ocGFpcmluZ19yZXN1bHRfY2VudHJhbC52YWx1ZSgpKSk7Ci0gIEVYUEVDVF9UUlVFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4ocGFpcmluZ19yZXN1bHRfcGVyaXBoZXJhbC52YWx1ZSgpKSk7Ci19Ci0KLVRFU1RfRihQYWlyaW5nSGFuZGxlclBhaXJUZXN0LCB0ZXN0X3NlY3VyZV9jb25uZWN0aW9uc19udW1lcmljX2NvbXBhcmlzb24pIHsKLSAgY2VudHJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk87Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQ7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2M7Ci0KLSAgcGVyaXBoZXJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk87Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQ7Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2M7Ci0KLSAgQ29uZmlybWF0aW9uRGF0YSBkYXRhX3BlcmlwaGVyYWw7Ci0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaGFuZGxlcnNfaW5pdGlhbGl6YXRpb25fZ3VhcmQpOwotICAgIC8vIEluaXRpYXRvciBtdXN0IGJlIGluaXRpYWxpemVkIGFmdGVyIHRoZSByZXNwb25kZXIuCi0gICAgcGFpcmluZ19oYW5kbGVyX2EgPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgY2VudHJhbF9zZXR1cCk7Ci0KLSAgICB3aGlsZSAoIWZpcnN0X2NvbW1hbmRfc2VudCkgewotICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDFtcyk7Ci0gICAgICBMT0dfSU5GTygid2FpdGluZyBmb3IgZmlyc3QgY29tbWFuZC4uLiIpOwotICAgIH0KLSAgICBwZXJpcGhlcmFsX3NldHVwLnBhaXJpbmdfcmVxdWVzdCA9IFBhaXJpbmdSZXF1ZXN0Vmlldzo6Q3JlYXRlKCpmaXJzdF9jb21tYW5kKTsKLQotICAgIFJlY29yZFBhaXJpbmdQcm9tcHRIYW5kbGluZyhwZXJpcGhlcmFsX3VzZXJfaW50ZXJmYWNlLCAmcGFpcmluZ19oYW5kbGVyX2IpOwotCi0gICAgRVhQRUNUX0NBTEwocGVyaXBoZXJhbF91c2VyX2ludGVyZmFjZSwgRGlzcGxheUNvbmZpcm1WYWx1ZShfKSkuV2lsbE9uY2UoU2F2ZUFyZzwwPigmZGF0YV9wZXJpcGhlcmFsKSk7Ci0gICAgRVhQRUNUX0NBTEwoY2VudHJhbF91c2VyX2ludGVyZmFjZSwgRGlzcGxheUNvbmZpcm1WYWx1ZShfKSkuV2lsbE9uY2UoSW52b2tlKFsmXShDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICAgIEVYUEVDVF9FUShkYXRhX3BlcmlwaGVyYWwuR2V0TnVtZXJpY1ZhbHVlKCksIGRhdGEuR2V0TnVtZXJpY1ZhbHVlKCkpOwotICAgICAgaWYgKGRhdGFfcGVyaXBoZXJhbC5HZXROdW1lcmljVmFsdWUoKSA9PSBkYXRhLkdldE51bWVyaWNWYWx1ZSgpKSB7Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl9hLT5PblVpQWN0aW9uKFBhaXJpbmdFdmVudDo6Q09ORklSTV9ZRVNOTywgMHgwMSk7Ci0gICAgICAgIHBhaXJpbmdfaGFuZGxlcl9iLT5PblVpQWN0aW9uKFBhaXJpbmdFdmVudDo6Q09ORklSTV9ZRVNOTywgMHgwMSk7Ci0gICAgICB9Ci0gICAgfSkpOwotCi0gICAgcGFpcmluZ19oYW5kbGVyX2IgPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgcGVyaXBoZXJhbF9zZXR1cCk7Ci0gIH0KLSAgcGFpcmluZ19oYW5kbGVyX2EtPldhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZCgpOwotICBwYWlyaW5nX2hhbmRsZXJfYi0+V2FpdFVudGlsUGFpcmluZ0ZpbmlzaGVkKCk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9jZW50cmFsLnZhbHVlKCkpKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9wZXJpcGhlcmFsLnZhbHVlKCkpKTsKLX0KLQotVEVTVF9GKFBhaXJpbmdIYW5kbGVyUGFpclRlc3QsIHRlc3Rfc2VjdXJlX2Nvbm5lY3Rpb25zX3Bhc3NrZXlfZW50cnkpIHsKLSAgY2VudHJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6S0VZQk9BUkRfT05MWTsKLSAgY2VudHJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMub29iX2RhdGFfZmxhZyA9IE9vYkRhdGFGbGFnOjpOT1RfUFJFU0VOVDsKLSAgY2VudHJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuYXV0aF9yZXEgPSBBdXRoUmVxTWFza0JvbmRpbmdGbGFnIHwgQXV0aFJlcU1hc2tNaXRtIHwgQXV0aFJlcU1hc2tTYzsKLQotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5pb19jYXBhYmlsaXR5ID0gSW9DYXBhYmlsaXR5OjpESVNQTEFZX09OTFk7Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQ7Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2M7Ci0KLSAgLy8gSW4gdGhpcyB0ZXN0IGVpdGhlciBjZW50cmFsIG9yIHBlcmlwaGVyYWwgZGlzcGxheSB0aGUgVUkgcHJvbXB0IGZpcnN0LiBUaGlzIHZhcmlhYmxlIG1ha2VzIHN1cmUgYm90aCBwcm9tcHRzIGFyZQotICAvLyBkaXNwbGF5ZWQgYmVmb3JlIHBhc3NrZXkgaXMgY29uZmlybWVkLiBTaW5jZSBib3RoIFVJIGhhbmRsZXJzIGFyZSBzYW1lIHRocmVhZCwgaXQncyBzYWZlLgotICBpbnQgdWlfcHJvbXB0c19jb3VudCA9IDA7Ci0gIHVpbnQzMl90IHBhc3NrZXlfID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOwotICB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGhhbmRsZXJzX2luaXRpYWxpemF0aW9uX2d1YXJkKTsKLSAgICBwYWlyaW5nX2hhbmRsZXJfYSA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBjZW50cmFsX3NldHVwKTsKLQotICAgIHdoaWxlICghZmlyc3RfY29tbWFuZF9zZW50KSB7Ci0gICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMW1zKTsKLSAgICAgIExPR19JTkZPKCJ3YWl0aW5nIGZvciBmaXJzdCBjb21tYW5kLi4uIik7Ci0gICAgfQotICAgIHBlcmlwaGVyYWxfc2V0dXAucGFpcmluZ19yZXF1ZXN0ID0gUGFpcmluZ1JlcXVlc3RWaWV3OjpDcmVhdGUoKmZpcnN0X2NvbW1hbmQpOwotCi0gICAgUmVjb3JkUGFpcmluZ1Byb21wdEhhbmRsaW5nKHBlcmlwaGVyYWxfdXNlcl9pbnRlcmZhY2UsICZwYWlyaW5nX2hhbmRsZXJfYik7Ci0KLSAgICBFWFBFQ1RfQ0FMTChwZXJpcGhlcmFsX3VzZXJfaW50ZXJmYWNlLCBEaXNwbGF5UGFzc2tleShfKSkuV2lsbE9uY2UoSW52b2tlKFsmXShDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICAgIHBhc3NrZXlfID0gZGF0YS5HZXROdW1lcmljVmFsdWUoKTsKLSAgICAgIHVpX3Byb21wdHNfY291bnQrKzsKLSAgICAgIGlmICh1aV9wcm9tcHRzX2NvdW50ID09IDIpIHsKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyX2EtPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQVNTS0VZLCBwYXNza2V5Xyk7Ci0gICAgICB9Ci0gICAgfSkpOwotCi0gICAgRVhQRUNUX0NBTEwoY2VudHJhbF91c2VyX2ludGVyZmFjZSwgRGlzcGxheUVudGVyUGFzc2tleURpYWxvZyhfKSkuV2lsbE9uY2UoSW52b2tlKFsmXShDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICAgIHVpX3Byb21wdHNfY291bnQrKzsKLSAgICAgIGlmICh1aV9wcm9tcHRzX2NvdW50ID09IDIpIHsKLSAgICAgICAgcGFpcmluZ19oYW5kbGVyX2EtPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQVNTS0VZLCBwYXNza2V5Xyk7Ci0gICAgICB9Ci0gICAgfSkpOwotCi0gICAgcGFpcmluZ19oYW5kbGVyX2IgPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgcGVyaXBoZXJhbF9zZXR1cCk7Ci0gIH0KLSAgLy8gSW5pdGlhdG9yIG11c3QgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIHJlc3BvbmRlci4KLSAgcGFpcmluZ19oYW5kbGVyX2EtPldhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZCgpOwotICBwYWlyaW5nX2hhbmRsZXJfYi0+V2FpdFVudGlsUGFpcmluZ0ZpbmlzaGVkKCk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9jZW50cmFsLnZhbHVlKCkpKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9wZXJpcGhlcmFsLnZhbHVlKCkpKTsKLX0KLQotVEVTVF9GKFBhaXJpbmdIYW5kbGVyUGFpclRlc3QsIHRlc3Rfc2VjdXJlX2Nvbm5lY3Rpb25zX291dF9vZl9iYW5kKSB7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmlvX2NhcGFiaWxpdHkgPSBJb0NhcGFiaWxpdHk6OktFWUJPQVJEX09OTFk7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQ7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2MsCi0KLSAgcGVyaXBoZXJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6OlBSRVNFTlQ7Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2MsCi0KLSAgY2VudHJhbF9zZXR1cC5teV9vb2JfZGF0YSA9IHN0ZDo6bWFrZV9vcHRpb25hbDxNeU9vYkRhdGE+KFBhaXJpbmdIYW5kbGVyTGU6OkdlbmVyYXRlT29iRGF0YSgpKTsKLSAgcGVyaXBoZXJhbF9zZXR1cC5yZW1vdGVfb29iX2RhdGEgPQotICAgICAgc3RkOjptYWtlX29wdGlvbmFsPEluaXRpYWxJbmZvcm1hdGlvbnM6Om91dF9vZl9iYW5kX2RhdGE+KEluaXRpYWxJbmZvcm1hdGlvbnM6Om91dF9vZl9iYW5kX2RhdGF7Ci0gICAgICAgICAgLmxlX3NjX2MgPSBjZW50cmFsX3NldHVwLm15X29vYl9kYXRhLT5jLAotICAgICAgICAgIC5sZV9zY19yID0gY2VudHJhbF9zZXR1cC5teV9vb2JfZGF0YS0+ciwKLSAgICAgIH0pOwotCi0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaGFuZGxlcnNfaW5pdGlhbGl6YXRpb25fZ3VhcmQpOwotICAgIHBhaXJpbmdfaGFuZGxlcl9hID0gc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nSGFuZGxlckxlPihQYWlyaW5nSGFuZGxlckxlOjpQSEFTRTEsIGNlbnRyYWxfc2V0dXApOwotICAgIHdoaWxlICghZmlyc3RfY29tbWFuZF9zZW50KSB7Ci0gICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMW1zKTsKLSAgICAgIExPR19JTkZPKCJ3YWl0aW5nIGZvciBmaXJzdCBjb21tYW5kLi4uIik7Ci0gICAgfQotICAgIHBlcmlwaGVyYWxfc2V0dXAucGFpcmluZ19yZXF1ZXN0ID0gUGFpcmluZ1JlcXVlc3RWaWV3OjpDcmVhdGUoKmZpcnN0X2NvbW1hbmQpOwotCi0gICAgUmVjb3JkUGFpcmluZ1Byb21wdEhhbmRsaW5nKHBlcmlwaGVyYWxfdXNlcl9pbnRlcmZhY2UsICZwYWlyaW5nX2hhbmRsZXJfYik7Ci0KLSAgICBwYWlyaW5nX2hhbmRsZXJfYiA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBwZXJpcGhlcmFsX3NldHVwKTsKLSAgfQotICBwYWlyaW5nX2hhbmRsZXJfYS0+V2FpdFVudGlsUGFpcmluZ0ZpbmlzaGVkKCk7Ci0gIHBhaXJpbmdfaGFuZGxlcl9iLT5XYWl0VW50aWxQYWlyaW5nRmluaXNoZWQoKTsKLQotICBFWFBFQ1RfVFJVRShzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdSZXN1bHQ+KHBhaXJpbmdfcmVzdWx0X2NlbnRyYWwudmFsdWUoKSkpOwotICBFWFBFQ1RfVFJVRShzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdSZXN1bHQ+KHBhaXJpbmdfcmVzdWx0X3BlcmlwaGVyYWwudmFsdWUoKSkpOwotfQotCi1URVNUX0YoUGFpcmluZ0hhbmRsZXJQYWlyVGVzdCwgdGVzdF9zZWN1cmVfY29ubmVjdGlvbnNfb3V0X29mX2JhbmRfdHdvX3dheSkgewotICBjZW50cmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5pb19jYXBhYmlsaXR5ID0gSW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9PTkxZOwotICBjZW50cmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6OlBSRVNFTlQ7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2MsCi0KLSAgcGVyaXBoZXJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6RElTUExBWV9PTkxZOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6OlBSRVNFTlQ7Ci0gIHBlcmlwaGVyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSB8IEF1dGhSZXFNYXNrU2MsCi0KLSAgY2VudHJhbF9zZXR1cC5teV9vb2JfZGF0YSA9IHN0ZDo6bWFrZV9vcHRpb25hbDxNeU9vYkRhdGE+KFBhaXJpbmdIYW5kbGVyTGU6OkdlbmVyYXRlT29iRGF0YSgpKTsKLSAgcGVyaXBoZXJhbF9zZXR1cC5yZW1vdGVfb29iX2RhdGEgPQotICAgICAgc3RkOjptYWtlX29wdGlvbmFsPEluaXRpYWxJbmZvcm1hdGlvbnM6Om91dF9vZl9iYW5kX2RhdGE+KEluaXRpYWxJbmZvcm1hdGlvbnM6Om91dF9vZl9iYW5kX2RhdGF7Ci0gICAgICAgICAgLmxlX3NjX2MgPSBjZW50cmFsX3NldHVwLm15X29vYl9kYXRhLT5jLAotICAgICAgICAgIC5sZV9zY19yID0gY2VudHJhbF9zZXR1cC5teV9vb2JfZGF0YS0+ciwKLSAgICAgIH0pOwotCi0gIHBlcmlwaGVyYWxfc2V0dXAubXlfb29iX2RhdGEgPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8TXlPb2JEYXRhPihQYWlyaW5nSGFuZGxlckxlOjpHZW5lcmF0ZU9vYkRhdGEoKSk7Ci0gIGNlbnRyYWxfc2V0dXAucmVtb3RlX29vYl9kYXRhID0KLSAgICAgIHN0ZDo6bWFrZV9vcHRpb25hbDxJbml0aWFsSW5mb3JtYXRpb25zOjpvdXRfb2ZfYmFuZF9kYXRhPihJbml0aWFsSW5mb3JtYXRpb25zOjpvdXRfb2ZfYmFuZF9kYXRhewotICAgICAgICAgIC5sZV9zY19jID0gcGVyaXBoZXJhbF9zZXR1cC5teV9vb2JfZGF0YS0+YywKLSAgICAgICAgICAubGVfc2NfciA9IHBlcmlwaGVyYWxfc2V0dXAubXlfb29iX2RhdGEtPnIsCi0gICAgICB9KTsKLQotICB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGhhbmRsZXJzX2luaXRpYWxpemF0aW9uX2d1YXJkKTsKLSAgICBwYWlyaW5nX2hhbmRsZXJfYSA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBjZW50cmFsX3NldHVwKTsKLSAgICB3aGlsZSAoIWZpcnN0X2NvbW1hbmRfc2VudCkgewotICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDFtcyk7Ci0gICAgICBMT0dfSU5GTygid2FpdGluZyBmb3IgZmlyc3QgY29tbWFuZC4uLiIpOwotICAgIH0KLSAgICBwZXJpcGhlcmFsX3NldHVwLnBhaXJpbmdfcmVxdWVzdCA9IFBhaXJpbmdSZXF1ZXN0Vmlldzo6Q3JlYXRlKCpmaXJzdF9jb21tYW5kKTsKLQotICAgIFJlY29yZFBhaXJpbmdQcm9tcHRIYW5kbGluZyhwZXJpcGhlcmFsX3VzZXJfaW50ZXJmYWNlLCAmcGFpcmluZ19oYW5kbGVyX2IpOwotCi0gICAgcGFpcmluZ19oYW5kbGVyX2IgPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgcGVyaXBoZXJhbF9zZXR1cCk7Ci0gIH0KLSAgcGFpcmluZ19oYW5kbGVyX2EtPldhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZCgpOwotICBwYWlyaW5nX2hhbmRsZXJfYi0+V2FpdFVudGlsUGFpcmluZ0ZpbmlzaGVkKCk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9jZW50cmFsLnZhbHVlKCkpKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxQYWlyaW5nUmVzdWx0PihwYWlyaW5nX3Jlc3VsdF9wZXJpcGhlcmFsLnZhbHVlKCkpKTsKLX0KLQotVEVTVF9GKFBhaXJpbmdIYW5kbGVyUGFpclRlc3QsIHRlc3RfbGVnYWN5X2p1c3Rfd29ya3MpIHsKLSAgY2VudHJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBjZW50cmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5UOwotICBjZW50cmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5hdXRoX3JlcSA9IEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgfCBBdXRoUmVxTWFza01pdG0sCi0KLSAgcGVyaXBoZXJhbF9zZXR1cC5teVBhaXJpbmdDYXBhYmlsaXRpZXMuaW9fY2FwYWJpbGl0eSA9IElvQ2FwYWJpbGl0eTo6Tk9fSU5QVVRfTk9fT1VUUFVUOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5UOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5hdXRoX3JlcSA9IEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgfCBBdXRoUmVxTWFza01pdG07Ci0KLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhoYW5kbGVyc19pbml0aWFsaXphdGlvbl9ndWFyZCk7Ci0gICAgcGFpcmluZ19oYW5kbGVyX2EgPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgY2VudHJhbF9zZXR1cCk7Ci0gICAgd2hpbGUgKCFmaXJzdF9jb21tYW5kX3NlbnQpIHsKLSAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxbXMpOwotICAgICAgTE9HX0lORk8oIndhaXRpbmcgZm9yIGZpcnN0IGNvbW1hbmQuLi4iKTsKLSAgICB9Ci0gICAgcGVyaXBoZXJhbF9zZXR1cC5wYWlyaW5nX3JlcXVlc3QgPSBQYWlyaW5nUmVxdWVzdFZpZXc6OkNyZWF0ZSgqZmlyc3RfY29tbWFuZCk7Ci0KLSAgICBSZWNvcmRQYWlyaW5nUHJvbXB0SGFuZGxpbmcocGVyaXBoZXJhbF91c2VyX2ludGVyZmFjZSwgJnBhaXJpbmdfaGFuZGxlcl9iKTsKLQotICAgIHBhaXJpbmdfaGFuZGxlcl9iID0gc3RkOjptYWtlX3VuaXF1ZTxQYWlyaW5nSGFuZGxlckxlPihQYWlyaW5nSGFuZGxlckxlOjpQSEFTRTEsIHBlcmlwaGVyYWxfc2V0dXApOwotICB9Ci0gIHBhaXJpbmdfaGFuZGxlcl9hLT5XYWl0VW50aWxQYWlyaW5nRmluaXNoZWQoKTsKLSAgcGFpcmluZ19oYW5kbGVyX2ItPldhaXRVbnRpbFBhaXJpbmdGaW5pc2hlZCgpOwotCi0gIEVYUEVDVF9UUlVFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4ocGFpcmluZ19yZXN1bHRfY2VudHJhbC52YWx1ZSgpKSk7Ci0gIEVYUEVDVF9UUlVFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8UGFpcmluZ1Jlc3VsdD4ocGFpcmluZ19yZXN1bHRfcGVyaXBoZXJhbC52YWx1ZSgpKSk7Ci19Ci0KLVRFU1RfRihQYWlyaW5nSGFuZGxlclBhaXJUZXN0LCB0ZXN0X2xlZ2FjeV9wYXNza2V5X2VudHJ5KSB7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmlvX2NhcGFiaWxpdHkgPSBJb0NhcGFiaWxpdHk6OktFWUJPQVJEX0RJU1BMQVk7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLm9vYl9kYXRhX2ZsYWcgPSBPb2JEYXRhRmxhZzo6Tk9UX1BSRVNFTlQ7Ci0gIGNlbnRyYWxfc2V0dXAubXlQYWlyaW5nQ2FwYWJpbGl0aWVzLmF1dGhfcmVxID0gQXV0aFJlcU1hc2tCb25kaW5nRmxhZyB8IEF1dGhSZXFNYXNrTWl0bSwKLQotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5pb19jYXBhYmlsaXR5ID0gSW9DYXBhYmlsaXR5OjpLRVlCT0FSRF9PTkxZOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5vb2JfZGF0YV9mbGFnID0gT29iRGF0YUZsYWc6Ok5PVF9QUkVTRU5UOwotICBwZXJpcGhlcmFsX3NldHVwLm15UGFpcmluZ0NhcGFiaWxpdGllcy5hdXRoX3JlcSA9IEF1dGhSZXFNYXNrQm9uZGluZ0ZsYWcgfCBBdXRoUmVxTWFza01pdG07Ci0KLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhoYW5kbGVyc19pbml0aWFsaXphdGlvbl9ndWFyZCk7Ci0gICAgcGFpcmluZ19oYW5kbGVyX2EgPSBzdGQ6Om1ha2VfdW5pcXVlPFBhaXJpbmdIYW5kbGVyTGU+KFBhaXJpbmdIYW5kbGVyTGU6OlBIQVNFMSwgY2VudHJhbF9zZXR1cCk7Ci0gICAgd2hpbGUgKCFmaXJzdF9jb21tYW5kX3NlbnQpIHsKLSAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxbXMpOwotICAgICAgTE9HX0lORk8oIndhaXRpbmcgZm9yIGZpcnN0IGNvbW1hbmQuLi4iKTsKLSAgICB9Ci0gICAgcGVyaXBoZXJhbF9zZXR1cC5wYWlyaW5nX3JlcXVlc3QgPSBQYWlyaW5nUmVxdWVzdFZpZXc6OkNyZWF0ZSgqZmlyc3RfY29tbWFuZCk7Ci0KLSAgICBSZWNvcmRQYWlyaW5nUHJvbXB0SGFuZGxpbmcocGVyaXBoZXJhbF91c2VyX2ludGVyZmFjZSwgJnBhaXJpbmdfaGFuZGxlcl9iKTsKLQotICAgIEVYUEVDVF9DQUxMKHBlcmlwaGVyYWxfdXNlcl9pbnRlcmZhY2UsIERpc3BsYXlFbnRlclBhc3NrZXlEaWFsb2coXykpOwotICAgIEVYUEVDVF9DQUxMKGNlbnRyYWxfdXNlcl9pbnRlcmZhY2UsIERpc3BsYXlDb25maXJtVmFsdWUoXykpLldpbGxPbmNlKEludm9rZShbJl0oQ29uZmlybWF0aW9uRGF0YSBkYXRhKSB7Ci0gICAgICBMT0dfSU5GTygiUGFzc2tleSBwcm9tcHQgZGlzcGxheWVkIGVudGVyaW5nIHBhc3NrZXk6ICUwOHgiLCBkYXRhLkdldE51bWVyaWNWYWx1ZSgpKTsKLSAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxbXMpOwotCi0gICAgICAvLyBUT0RPOiBoYW5kbGUgY2FzZSB3aGVyZSBwcm9tcHRzIGFyZSBkaXNwbGF5ZWQgaW4gZGlmZmVyZW50IG9yZGVyIGluIHRoZSB0ZXN0IQotICAgICAgcGFpcmluZ19oYW5kbGVyX2ItPk9uVWlBY3Rpb24oUGFpcmluZ0V2ZW50OjpQQVNTS0VZLCBkYXRhLkdldE51bWVyaWNWYWx1ZSgpKTsKLSAgICB9KSk7Ci0KLSAgICBwYWlyaW5nX2hhbmRsZXJfYiA9IHN0ZDo6bWFrZV91bmlxdWU8UGFpcmluZ0hhbmRsZXJMZT4oUGFpcmluZ0hhbmRsZXJMZTo6UEhBU0UxLCBwZXJpcGhlcmFsX3NldHVwKTsKLSAgfQotICBwYWlyaW5nX2hhbmRsZXJfYS0+V2FpdFVudGlsUGFpcmluZ0ZpbmlzaGVkKCk7Ci0gIHBhaXJpbmdfaGFuZGxlcl9iLT5XYWl0VW50aWxQYWlyaW5nRmluaXNoZWQoKTsKLQotICBFWFBFQ1RfVFJVRShzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdSZXN1bHQ+KHBhaXJpbmdfcmVzdWx0X2NlbnRyYWwudmFsdWUoKSkpOwotICBFWFBFQ1RfVFJVRShzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPFBhaXJpbmdSZXN1bHQ+KHBhaXJpbmdfcmVzdWx0X3BlcmlwaGVyYWwudmFsdWUoKSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2VjdXJpdHkKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NlY3VyaXR5L3VpLmggYi9nZC9zZWN1cml0eS91aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGVhZDlhLi4wMDAwMDAwCi0tLSBhL2dkL3NlY3VyaXR5L3VpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2VjdXJpdHkgewotCi1jbGFzcyBDb25maXJtYXRpb25EYXRhIHsKLSBwdWJsaWM6Ci0gIENvbmZpcm1hdGlvbkRhdGEoKSA6IGFkZHJlc3Nfd2l0aF90eXBlXyhoY2k6OkFkZHJlc3NXaXRoVHlwZSgpKSwgbmFtZV8oIk5vIG5hbWUgc2V0Iikge30KLSAgQ29uZmlybWF0aW9uRGF0YShibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLCBzdGQ6OnN0cmluZyBuYW1lKQotICAgICAgOiBhZGRyZXNzX3dpdGhfdHlwZV8oYWRkcmVzc193aXRoX3R5cGUpLCBuYW1lXyhuYW1lKSB7fQotICBDb25maXJtYXRpb25EYXRhKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc193aXRoX3R5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHVpbnQzMl90IG51bWVyaWNfdmFsdWUpCi0gICAgICA6IGFkZHJlc3Nfd2l0aF90eXBlXyhhZGRyZXNzX3dpdGhfdHlwZSksIG5hbWVfKG5hbWUpLCBudW1lcmljX3ZhbHVlXyhudW1lcmljX3ZhbHVlKSB7fQotCi0gIGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIEdldEFkZHJlc3NXaXRoVHlwZSgpIHsKLSAgICByZXR1cm4gYWRkcmVzc193aXRoX3R5cGVfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICB1aW50MzJfdCBHZXROdW1lcmljVmFsdWUoKSB7Ci0gICAgcmV0dXJuIG51bWVyaWNfdmFsdWVfOwotICB9Ci0KLSAgaGNpOjpJb0NhcGFiaWxpdHkgR2V0UmVtb3RlSW9DYXBzKCkgY29uc3QgewotICAgIHJldHVybiByZW1vdGVfaW9fY2Fwc187Ci0gIH0KLSAgdm9pZCBTZXRSZW1vdGVJb0NhcHMoaGNpOjpJb0NhcGFiaWxpdHkgcmVtb3RlX2lvX2NhcHMpIHsKLSAgICByZW1vdGVfaW9fY2Fwc18gPSByZW1vdGVfaW9fY2FwczsKLSAgfQotCi0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgR2V0UmVtb3RlQXV0aFJlcXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlbW90ZV9hdXRoX3JlcXNfOwotICB9Ci0KLSAgdm9pZCBTZXRSZW1vdGVBdXRoUmVxcyhoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzIHJlbW90ZV9hdXRoX3JlcXMpIHsKLSAgICByZW1vdGVfYXV0aF9yZXFzXyA9IHJlbW90ZV9hdXRoX3JlcXM7Ci0gIH0KLQotICBoY2k6Ok9vYkRhdGFQcmVzZW50IEdldFJlbW90ZU9vYkRhdGFQcmVzZW50KCkgY29uc3QgewotICAgIHJldHVybiByZW1vdGVfb29iX2RhdGFfcHJlc2VudF87Ci0gIH0KLQotICB2b2lkIFNldFJlbW90ZU9vYkRhdGFQcmVzZW50KGhjaTo6T29iRGF0YVByZXNlbnQgcmVtb3RlX29vYl9kYXRhX3ByZXNlbnQpIHsKLSAgICByZW1vdGVfb29iX2RhdGFfcHJlc2VudF8gPSByZW1vdGVfb29iX2RhdGFfcHJlc2VudDsKLSAgfQotCi0gIGJvb2wgSXNKdXN0V29ya3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGp1c3Rfd29ya3NfOwotICB9Ci0KLSAgdm9pZCBTZXRKdXN0V29ya3MoYm9vbCBqdXN0X3dvcmtzKSB7Ci0gICAganVzdF93b3Jrc18gPSBqdXN0X3dvcmtzOwotICB9Ci0KLSBwcml2YXRlOgotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIC8vIENhbiBlaXRoZXIgYmUgdGhlIGNvbmZpcm1hdGlvbiB2YWx1ZSBvciB0aGUgcGFzc2tleQotICB1aW50MzJfdCBudW1lcmljX3ZhbHVlXyA9IDA7Ci0KLSAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKTogUmV2aXNpdCBhZnRlciBzaGltL0JUQSBsYXllciBpcyBnb25lCi0gIC8vIEV4dHJhIGRhdGEgaXMgYSBoYWNrIHRvIGdldCBkYXRhIGZyb20gdGhlIG1vZHVsZSB0byB0aGUgc2hpbQotICBoY2k6OklvQ2FwYWJpbGl0eSByZW1vdGVfaW9fY2Fwc18gPSBoY2k6OklvQ2FwYWJpbGl0eTo6RElTUExBWV9ZRVNfTk87Ci0gIGhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHMgcmVtb3RlX2F1dGhfcmVxc18gPSBoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpERURJQ0FURURfQk9ORElORzsKLSAgaGNpOjpPb2JEYXRhUHJlc2VudCByZW1vdGVfb29iX2RhdGFfcHJlc2VudF8gPSBoY2k6Ok9vYkRhdGFQcmVzZW50OjpOT1RfUFJFU0VOVDsKLSAgYm9vbCBqdXN0X3dvcmtzXyA9IGZhbHNlOwotfTsKLQotLy8gVGhyb3VnaCB0aGlzIGludGVyZmFjZSB3ZSB0YWxrIHRvIHRoZSB1c2VyLCBhc2tpbmcgZm9yIGNvbmZpcm1hdGlvbnMvYWNjZXB0YW5jZS4KLWNsYXNzIFVJIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflVJKCkgPSBkZWZhdWx0OwotCi0gIC8qIFJlbW90ZSBMRSBkZXZpY2UgdHJpZXMgdG8gaW5pdGlhdGUgcGFpcmluZywgYXNrIHVzZXIgdG8gY29uZmlybSAqLwotICB2aXJ0dWFsIHZvaWQgRGlzcGxheVBhaXJpbmdQcm9tcHQoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcywgc3RkOjpzdHJpbmcgbmFtZSkgPSAwOwotCi0gIC8qIFJlbW92ZSB0aGUgcGFpcmluZyBwcm9tcHQgZnJvbSBEaXNwbGF5UGFpcmluZ1Byb21wdCwgaS5lLiByZW1vdGUgZGV2aWNlIGRpc2Nvbm5lY3RlZCwgb3Igc29tZSBhcHBsaWNhdGlvbiByZXF1ZXN0ZWQKLSAgICogYm9uZCB3aXRoIHRoaXMgZGV2aWNlICovCi0gIHZpcnR1YWwgdm9pZCBDYW5jZWwoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzcykgPSAwOwotCi0gIC8qIERpc3BsYXkgdmFsdWUgZm9yIENvbXBhcmlzb24sIHVzZXIgcmVzcG9uZHMgeWVzL25vICovCi0gIHZpcnR1YWwgdm9pZCBEaXNwbGF5Q29uZmlybVZhbHVlKENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgPSAwOwotCi0gIC8qIERpc3BsYXkgWWVzL05vIGRpYWxvZywgQ2xhc3NpYyBwYWlyaW5nLCBudW1lcmljIGNvbXBhcmlzb24gd2l0aCBOb0lucHV0Tm9PdXRwdXQgZGV2aWNlICovCi0gIHZpcnR1YWwgdm9pZCBEaXNwbGF5WWVzTm9EaWFsb2coQ29uZmlybWF0aW9uRGF0YSBkYXRhKSA9IDA7Ci0KLSAgLyogRGlzcGxheSBhIGRpYWxvZyBib3ggdGhhdCB3aWxsIGxldCB1c2VyIGVudGVyIHRoZSBQYXNza2V5ICovCi0gIHZpcnR1YWwgdm9pZCBEaXNwbGF5RW50ZXJQYXNza2V5RGlhbG9nKENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgPSAwOwotCi0gIC8qIFByZXNlbnQgdGhlIHBhc3NrZXkgdmFsdWUgdG8gdGhlIHVzZXIsIHVzZXIgY29tcGFyZXMgd2l0aCBvdGhlciBkZXZpY2UgKi8KLSAgdmlydHVhbCB2b2lkIERpc3BsYXlQYXNza2V5KENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgPSAwOwotCi0gIC8qIEFzayB0aGUgdXNlciB0byBlbnRlciBhIFBJTiAqLwotICB2aXJ0dWFsIHZvaWQgRGlzcGxheUVudGVyUGluRGlhbG9nKENvbmZpcm1hdGlvbkRhdGEgZGF0YSkgPSAwOwotfTsKLQotLyogVGhyb3VnaCB0aGlzIGludGVyZmFjZSwgVUkgcHJvdmlkZXMgdXMgd2l0aCB1c2VyIGNob2ljZXMuICovCi1jbGFzcyBVSUNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5VSUNhbGxiYWNrcygpID0gZGVmYXVsdDsKLQotICAvKiBVc2VyIGFjY2VwdGVkIHBhaXJpbmcgcHJvbXB0ICovCi0gIHZpcnR1YWwgdm9pZCBPblBhaXJpbmdQcm9tcHRBY2NlcHRlZChjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzLCBib29sIGNvbmZpcm1lZCkgPSAwOwotCi0gIC8qIFVzZXIgY29uZmlybWVkIHRoYXQgZGlzcGxheWVkIHZhbHVlIG1hdGNoZXMgdGhlIHZhbHVlIG9uIHRoZSBvdGhlciBkZXZpY2UgKi8KLSAgdmlydHVhbCB2b2lkIE9uQ29uZmlybVllc05vKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIGJvb2wgY29uZmlybWVkKSA9IDA7Ci0KLSAgLyogVXNlciB0eXBlZCB0aGUgdmFsdWUgZGlzcGxheWVkIG9uIHRoZSBvdGhlciBkZXZpY2UuIFRoaXMgaXMgZWl0aGVyIFBhc3NrZXkgb3IgdGhlIENvbmZpcm0gdmFsdWUgKi8KLSAgdmlydHVhbCB2b2lkIE9uUGFzc2tleUVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHVpbnQzMl90IHBhc3NrZXkpID0gMDsKLQotICAvKiBVc2VyIHR5cGVkIHRoZSBQSU4gZm9yIHRoZSBvdGhlciBkZXZpY2UuICovCi0gIHZpcnR1YWwgdm9pZCBPblBpbkVudHJ5KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBpbikgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNlY3VyaXR5Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zZXR1cC5weSBiL2dkL3NldHVwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTg3MzRhLi4wMDAwMDAwCi0tLSBhL2dkL3NldHVwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNNb2R1bGVFcnJvcgotaW1wb3J0IG9zCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IGZpbmRfcGFja2FnZXMKLWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKLWZyb20gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwKLWltcG9ydCBzdGF0Ci1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cwotCi1pbnN0YWxsX3JlcXVpcmVzID0gWwotICAgICdncnBjaW8nLAotICAgICdwc3V0aWwnLAotXQotCi1ob3N0X2V4ZWN1dGFibGVzID0gWwotICAgICdyb290LWNhbmFsJywKLSAgICAnYmx1ZXRvb3RoX3N0YWNrX3dpdGhfZmFjYWRlJywgICMgYysrCi0gICAgJ2JsdWV0b290aF93aXRoX2ZhY2FkZXMnLCAgIyBydXN0Ci1dCi0KLQotIyBOZWVkIHRvIHZlcmlmeSBhY3RzIGlzIGltcG9ydGFibGUgaW4gYSBuZXcgUHl0aG9uIGNvbnRleHQKLWRlZiBpc19hY3RzX2ltcG9ydGFibGUoKToKLSAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsICctYycsICdpbXBvcnQgYWN0cyddCi0gICAgY29tcGxldGVkX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLnJ1bihjbWQsIGN3ZD1vcy5nZXRjd2QoKSkKLSAgICByZXR1cm4gY29tcGxldGVkX3Byb2Nlc3MucmV0dXJuY29kZSA9PSAwCi0KLQotZGVmIHNldHVwX2FjdHNfZm9yX2NtZF9vcl9kaWUoY21kX3N0cik6Ci0gICAgYWN0c19mcmFtZXdvcmtfZGlyID0gb3MucGF0aC5hYnNwYXRoKCdhY3RzX2ZyYW1ld29yaycpCi0gICAgYWN0c19zZXR1cF9iaW4gPSBvcy5wYXRoLmpvaW4oYWN0c19mcmFtZXdvcmtfZGlyLCAnc2V0dXAucHknKQotICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgYWN0c19zZXR1cF9iaW4sIGNtZF9zdHJdCi0gICAgc3VicHJvY2Vzcy5ydW4oY21kLCBjd2Q9YWN0c19mcmFtZXdvcmtfZGlyLCBjaGVjaz1UcnVlKQotCi0KLWRlZiBzZXRfcGVybWlzc2lvbnNfZm9yX2hvc3RfZXhlY3V0YWJsZXMob3V0cHV0cyk6Ci0gICAgZm9yIGZpbGUgaW4gb3V0cHV0czoKLSAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShmaWxlKSBpbiBob3N0X2V4ZWN1dGFibGVzOgotICAgICAgICAgICAgY3VycmVudF9tb2RlID0gb3Muc3RhdChmaWxlKS5zdF9tb2RlCi0gICAgICAgICAgICBuZXdfbW9kZSA9IGN1cnJlbnRfbW9kZSB8IHN0YXQuU19JRVhFQwotICAgICAgICAgICAgb3MuY2htb2QoZmlsZSwgbmV3X21vZGUpCi0gICAgICAgICAgICBsb2cubG9nKGxvZy5JTkZPLCAiQ2hhbmdlZCBmaWxlIG1vZGUgb2YgJXMgZnJvbSAlcyB0byAlcyIgJSAoZmlsZSwgb2N0KGN1cnJlbnRfbW9kZSksIG9jdChuZXdfbW9kZSkpKQotCi0KLWNsYXNzIEluc3RhbGxMb2NhbFBhY2thZ2VzRm9ySW5zdGFsbGF0aW9uKGluc3RhbGwpOgotCi0gICAgdXNlcl9vcHRpb25zID0gaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCi0gICAgICAgICgncmV1c2UtYWN0cycsIE5vbmUsICJTa2lwIEFDVFMgaW5zdGFsbGF0aW9uIGlmIGFscmVhZHkgaW5zdGFsbGVkIiksCi0gICAgXQotICAgIGJvb2xlYW5fb3B0aW9ucyA9IGluc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWydyZXVzZS1hY3RzJ10KLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIGluc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0gICAgICAgIHNlbGYucmV1c2VfYWN0cyA9IEZhbHNlCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnJldXNlX2FjdHMgYW5kIGlzX2FjdHNfaW1wb3J0YWJsZSgpOgotICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnUmV1c2luZyBleGlzdGluZyBBQ1RTIGluc3RhbGxhdGlvbicsIGxvZy5XQVJOKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnSW5zdGFsbGluZyBBQ1RTIGxpYnJhcnknLCBsb2cuV0FSTikKLSAgICAgICAgICAgIHNldHVwX2FjdHNfZm9yX2NtZF9vcl9kaWUoImluc3RhbGwiKQotICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnQUNUUyBpbnN0YWxsZWQuJywgbG9nLldBUk4pCi0gICAgICAgIGlmIG5vdCBpc19hY3RzX2ltcG9ydGFibGUoKToKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc01vZHVsZUVycm9yKCJDYW5ub3QgaW1wb3J0IGFjdHMgYWZ0ZXIgaW5zdGFsbGF0aW9uIikKLSAgICAgICAgaW5zdGFsbC5ydW4oc2VsZikKLSAgICAgICAgc2V0X3Blcm1pc3Npb25zX2Zvcl9ob3N0X2V4ZWN1dGFibGVzKHNlbGYuZ2V0X291dHB1dHMoKSkKLQotCi1kZWYgbWFpbigpOgotICAgICMgUmVsYXRpdmUgcGF0aCBmcm9tIGNhbGxpbmcgZGlyZWN0b3J5IHRvIHRoaXMgZmlsZQotICAgIG91cl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCi0gICAgIyBNdXN0IGNkIGludG8gdGhpcyBkaXIgZm9yIHBhY2thZ2UgcmVzb2x1dGlvbiB0byB3b3JrCi0gICAgIyBUaGlzIHdvbid0IGFmZmVjdCB0aGUgY2FsbGluZyBzaGVsbAotICAgIG9zLmNoZGlyKG91cl9kaXIpCi0gICAgc2V0dXAoCi0gICAgICAgIG5hbWU9J2JsdWV0b290aF9jZXJ0X3Rlc3RzJywKLSAgICAgICAgdmVyc2lvbj0nMS4wJywKLSAgICAgICAgYXV0aG9yPSdBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QnLAotICAgICAgICBsaWNlbnNlPSdBcGFjaGUyLjAnLAotICAgICAgICBkZXNjcmlwdGlvbj0iIiJCbHVldG9vdGggQ2VydCBUZXN0cyBQYWNrYWdlIiIiLAotICAgICAgICAjIEluY2x1ZGUgcm9vdCBwYWNrYWdlIHNvIHRoYXQgYmx1ZXRvb3RoX3BhY2tldHNfcHl0aG9uMy5zbyBjYW4gYmUKLSAgICAgICAgIyBpbmNsdWRlZCBhcyB3ZWxsCi0gICAgICAgIHBhY2thZ2VzPVsnJ10gKwotICAgICAgICBmaW5kX3BhY2thZ2VzKGV4Y2x1ZGU9WydhY3RzX2ZyYW1ld29yaycsICdhY3RzX2ZyYW1ld29yay4qJywgJ2xsdm1fYmludXRpbHMnLCAnbGx2bV9iaW51dGlscy4qJ10pLAotICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCi0gICAgICAgIHBhY2thZ2VfZGF0YT17Ci0gICAgICAgICAgICAnJzogaG9zdF9leGVjdXRhYmxlcyArIFsnKi5zbycsICdsaWI2NC8qLnNvJywgJ3RhcmdldC8qJywgJ2xsdm1fYmludXRpbHMvYmluLyonLCAnbGx2bV9iaW51dGlscy9saWI2NC8qJ10sCi0gICAgICAgICAgICAnY2VydCc6IFsnYWxsX3Rlc3RfY2FzZXMnXSwKLSAgICAgICAgfSwKLSAgICAgICAgY21kY2xhc3M9ewotICAgICAgICAgICAgJ2luc3RhbGwnOiBJbnN0YWxsTG9jYWxQYWNrYWdlc0Zvckluc3RhbGxhdGlvbiwKLSAgICAgICAgfSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS9BbmRyb2lkLmJwIGIvZ2Qvc2hpbS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI5M2JkLi4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFNoaW1Tb3VyY2VzIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICAgICAiZHVtcHN5cy5jYyIsCi0gICAgICAgICAgICAiZHVtcHN5c19hcmdzLmNjIiwKLSAgICBdCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFNoaW1UZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAgICAgImR1bXBzeXNfdGVzdC5jYyIsCi0gICAgICAgICAgICAiZHVtcHN5c19hcmdzX3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aEZhY2FkZV9zaGltX2xheWVyIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmYWNhZGUvZmFjYWRlLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS9CVUlMRC5nbiBiL2dkL3NoaW0vQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDQ2MDEuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1zb3VyY2Vfc2V0KCJCbHVldG9vdGhTaGltU291cmNlcyIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiZHVtcHN5cy5jYyIsCi0gICAgImR1bXBzeXNfYXJncy5jYyIsCi0gIF0KLQotICBkZXBzID0gWwotICAgICIvL2J0L2dkL2R1bXBzeXM6bGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICIvL2J0L2dkL2R1bXBzeXMvYnVuZGxlcjpCbHVldG9vdGhHZW5lcmF0ZWRCdW5kbGVyU2NoZW1hX2hfYmZicyIsCi0gIF0KLQotICBjb25maWdzICs9IFsKLSAgICAiLy9idC9nZDpnZF9kZWZhdWx0cyIsCi0gICAgIi8vYnQ6ZXh0ZXJuYWxfZmxhdGJ1ZmZlcnMiLAotICBdCi19CmRpZmYgLS1naXQgYS9nZC9zaGltL2NlcnQvc2hpbV90ZXN0LnB5IGIvZ2Qvc2hpbS9jZXJ0L3NoaW1fdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2NzlhYi4uMDAwMDAwMAotLS0gYS9nZC9zaGltL2NlcnQvc2hpbV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mcm9tIGNlcnQuZ2RfYmFzZV90ZXN0IGltcG9ydCBHZEJhc2VUZXN0Q2xhc3MKLWZyb20gc2hpbS5jZXJ0LnNoaW1fdGVzdF9saWIgaW1wb3J0IFNoaW1UZXN0QmFzZQotCi0KLWNsYXNzIFNoaW1UZXN0KEdkQmFzZVRlc3RDbGFzcywgU2hpbVRlc3RCYXNlKToKLQotICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKLSAgICAgICAgR2RCYXNlVGVzdENsYXNzLnNldHVwX2NsYXNzKHNlbGYsIGR1dF9tb2R1bGU9J1NISU0nLCBjZXJ0X21vZHVsZT0nU0hJTScpCi0KLSAgICBkZWYgdGVzdF9kdW1wc3lzKHNlbGYpOgotICAgICAgICBTaGltVGVzdEJhc2UudGVzdF9kdW1wc3lzKHNlbGYsIHNlbGYuZHV0LCBzZWxmLmNlcnQpCmRpZmYgLS1naXQgYS9nZC9zaGltL2NlcnQvc2hpbV90ZXN0X2xpYi5weSBiL2dkL3NoaW0vY2VydC9zaGltX3Rlc3RfbGliLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjRkYzM5Li4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vY2VydC9zaGltX3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCBsb2dnaW5nCi0KLWZyb20gY2VydC5ldmVudF9zdHJlYW0gaW1wb3J0IEV2ZW50U3RyZWFtCi1mcm9tIGNlcnQudHJ1dGggaW1wb3J0IGFzc2VydFRoYXQKLWZyb20gZmFjYWRlIGltcG9ydCBjb21tb25fcGIyIGFzIGNvbW1vbgotZnJvbSBmYWNhZGUgaW1wb3J0IHJvb3RzZXJ2aWNlX3BiMiBhcyBmYWNhZGVfcm9vdHNlcnZpY2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBlbXB0eV9wYjIgYXMgZW1wdHlfcHJvdG8KLWZyb20gc2hpbS5mYWNhZGUgaW1wb3J0IGZhY2FkZV9wYjIgYXMgc2hpbV9mYWNhZGUKLQotCi1jbGFzcyBTaGltVGVzdEJhc2UoKToKLQotICAgIGRlZiB0ZXN0X2R1bXBzeXMoc2VsZiwgZHV0LCBjZXJ0KToKLSAgICAgICAgcmVzdWx0ID0gY2VydC5zaGltLkR1bXAoZW1wdHlfcHJvdG8uRW1wdHkoKSkKLSAgICAgICAgcmVzdWx0ID0gZHV0LnNoaW0uRHVtcChlbXB0eV9wcm90by5FbXB0eSgpKQpkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS9jZXJ0L3N0YWNrX3Rlc3QucHkgYi9nZC9zaGltL2NlcnQvc3RhY2tfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzZjA5MS4uMDAwMDAwMAotLS0gYS9nZC9zaGltL2NlcnQvc3RhY2tfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMKLSMgICBDb3B5cmlnaHQgMjAyMCAtIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotZnJvbSBjZXJ0LmdkX2Jhc2VfdGVzdCBpbXBvcnQgR2RCYXNlVGVzdENsYXNzCi1mcm9tIHNoaW0uY2VydC5zdGFja190ZXN0X2xpYiBpbXBvcnQgU3RhY2tUZXN0QmFzZQotCi0KLWNsYXNzIFN0YWNrVGVzdChHZEJhc2VUZXN0Q2xhc3MsIFN0YWNrVGVzdEJhc2UpOgotCi0gICAgZGVmIHNldHVwX2NsYXNzKHNlbGYpOgotICAgICAgICBzdXBlcigpLnNldHVwX2NsYXNzKGR1dF9tb2R1bGU9J1NISU0nLCBjZXJ0X21vZHVsZT0nU0hJTScpCmRpZmYgLS1naXQgYS9nZC9zaGltL2NlcnQvc3RhY2tfdGVzdF9saWIucHkgYi9nZC9zaGltL2NlcnQvc3RhY2tfdGVzdF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWNkYTQuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS9jZXJ0L3N0YWNrX3Rlc3RfbGliLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAgIENvcHlyaWdodCAyMDIwIC0gVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotCi1jbGFzcyBTdGFja1Rlc3RCYXNlKCk6Ci0KLSAgICBkZWYgdGVzdF90ZXN0KHNlbGYpOgotICAgICAgICByZXR1cm4gVHJ1ZQpkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS9kdW1wc3lzLmNjIGIvZ2Qvc2hpbS9kdW1wc3lzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI1OWRlLi4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vZHVtcHN5cy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJidF9nZF9zaGltIgotCi0jaW5jbHVkZSAiZHVtcHN5cy9kdW1wc3lzLmgiCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZHVtcHN5cy9maWx0ZXIuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvcy9zeXN0ZW1fcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInNoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgInNoaW0vZHVtcHN5c19hcmdzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1JlYWRPbmx5RGVidWdnYWJsZVByb3BlcnR5ID0gInJvLmRlYnVnZ2FibGUiOwotCi1uYW1lc3BhY2UgewotY29uc3RleHByIGNoYXIga01vZHVsZU5hbWVbXSA9ICJzaGltOjpEdW1wc3lzIjsKLWNvbnN0ZXhwciBjaGFyIGtEdW1wc3lzVGl0bGVbXSA9ICItLS0tLSBHZCBEdW1wc3lzIC0tLS0tLSI7Ci19ICAvLyBuYW1lc3BhY2UKLQotc3RydWN0IER1bXBzeXM6OmltcGwgewotIHB1YmxpYzoKLSAgdm9pZCBEdW1wV2l0aEFyZ3NTeW5jKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3MsIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLSAgaW50IEdldE51bWJlck9mQnVuZGxlZFNjaGVtYXMoKSBjb25zdDsKLQotICBpbXBsKGNvbnN0IER1bXBzeXMmIGR1bXBzeXNfbW9kdWxlLCBjb25zdCBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hJiByZWZsZWN0aW9uX3NjaGVtYSk7Ci0gIH5pbXBsKCkgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIEZpbHRlckFzVXNlcihzdGQ6OnN0cmluZyogZHVtcHN5c19kYXRhKTsKLSAgdm9pZCBGaWx0ZXJBc0RldmVsb3BlcihzdGQ6OnN0cmluZyogZHVtcHN5c19kYXRhKTsKLSAgc3RkOjpzdHJpbmcgUHJpbnRBc0pzb24oc3RkOjpzdHJpbmcqIGR1bXBzeXNfZGF0YSkgY29uc3Q7Ci0KLSAgYm9vbCBJc0RlYnVnZ2FibGUoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRHVtcFdpdGhBcmdzQXN5bmMoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncyk7Ci0KLSAgY29uc3QgRHVtcHN5cyYgZHVtcHN5c19tb2R1bGVfOwotICBjb25zdCBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hIHJlZmxlY3Rpb25fc2NoZW1hXzsKLX07Ci0KLWNvbnN0IE1vZHVsZUZhY3RvcnkgRHVtcHN5czo6RmFjdG9yeSA9Ci0gICAgTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG5ldyBEdW1wc3lzKGJsdWV0b290aDo6ZHVtcHN5czo6R2V0QnVuZGxlZFNjaGVtYURhdGEoKSk7IH0pOwotCi1EdW1wc3lzOjppbXBsOjppbXBsKGNvbnN0IER1bXBzeXMmIGR1bXBzeXNfbW9kdWxlLCBjb25zdCBkdW1wc3lzOjpSZWZsZWN0aW9uU2NoZW1hJiByZWZsZWN0aW9uX3NjaGVtYSkKLSAgICA6IGR1bXBzeXNfbW9kdWxlXyhkdW1wc3lzX21vZHVsZSksIHJlZmxlY3Rpb25fc2NoZW1hXyhzdGQ6Om1vdmUocmVmbGVjdGlvbl9zY2hlbWEpKSB7fQotCi1pbnQgRHVtcHN5czo6aW1wbDo6R2V0TnVtYmVyT2ZCdW5kbGVkU2NoZW1hcygpIGNvbnN0IHsKLSAgcmV0dXJuIHJlZmxlY3Rpb25fc2NoZW1hXy5HZXROdW1iZXJPZkJ1bmRsZWRTY2hlbWFzKCk7Ci19Ci0KLWJvb2wgRHVtcHN5czo6aW1wbDo6SXNEZWJ1Z2dhYmxlKCkgY29uc3QgewotICByZXR1cm4gKG9zOjpHZXRTeXN0ZW1Qcm9wZXJ0eShrUmVhZE9ubHlEZWJ1Z2dhYmxlUHJvcGVydHkpID09ICIxIik7Ci19Ci0KLXZvaWQgRHVtcHN5czo6aW1wbDo6RmlsdGVyQXNEZXZlbG9wZXIoc3RkOjpzdHJpbmcqIGR1bXBzeXNfZGF0YSkgewotICBBU1NFUlQoZHVtcHN5c19kYXRhICE9IG51bGxwdHIpOwotICBkdW1wc3lzOjpGaWx0ZXJJblBsYWNlKGR1bXBzeXM6OkZpbHRlclR5cGU6OkFTX0RFVkVMT1BFUiwgcmVmbGVjdGlvbl9zY2hlbWFfLCBkdW1wc3lzX2RhdGEpOwotfQotCi12b2lkIER1bXBzeXM6OmltcGw6OkZpbHRlckFzVXNlcihzdGQ6OnN0cmluZyogZHVtcHN5c19kYXRhKSB7Ci0gIEFTU0VSVChkdW1wc3lzX2RhdGEgIT0gbnVsbHB0cik7Ci0gIGR1bXBzeXM6OkZpbHRlckluUGxhY2UoZHVtcHN5czo6RmlsdGVyVHlwZTo6QVNfVVNFUiwgcmVmbGVjdGlvbl9zY2hlbWFfLCBkdW1wc3lzX2RhdGEpOwotfQotCi1zdGQ6OnN0cmluZyBEdW1wc3lzOjppbXBsOjpQcmludEFzSnNvbihzdGQ6OnN0cmluZyogZHVtcHN5c19kYXRhKSBjb25zdCB7Ci0gIEFTU0VSVChkdW1wc3lzX2RhdGEgIT0gbnVsbHB0cik7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgcm9vdF9uYW1lID0gcmVmbGVjdGlvbl9zY2hlbWFfLkdldFJvb3ROYW1lKCk7Ci0gIGlmIChyb290X25hbWUuZW1wdHkoKSkgewotICAgIGNoYXIgYnVmWzI1NV07Ci0gICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkVSUk9SOiBVbmFibGUgdG8gZmluZCByb290IG5hbWUgaW4gcHJlYnVuZGxlZCByZWZsZWN0aW9uIHNjaGVtYVxuIik7Ci0gICAgTE9HX1dBUk4oIiVzIiwgYnVmKTsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmKTsKLSAgfQotCi0gIGNvbnN0IHJlZmxlY3Rpb246OlNjaGVtYSogc2NoZW1hID0gcmVmbGVjdGlvbl9zY2hlbWFfLkZpbmRJblJlZmxlY3Rpb25TY2hlbWEocm9vdF9uYW1lKTsKLSAgaWYgKHNjaGVtYSA9PSBudWxscHRyKSB7Ci0gICAgY2hhciBidWZbMjU1XTsKLSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRVJST1I6IFVuYWJsZSB0byBmaW5kIHNjaGVtYSByb290IG5hbWU6JXNcbiIsIHJvb3RfbmFtZS5jX3N0cigpKTsKLSAgICBMT0dfV0FSTigiJXMiLCBidWYpOwotICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWYpOwotICB9Ci0KLSAgZmxhdGJ1ZmZlcnM6OlBhcnNlciBwYXJzZXI7Ci0gIGlmICghcGFyc2VyLkRlc2VyaWFsaXplKHNjaGVtYSkpIHsKLSAgICBjaGFyIGJ1ZlsyNTVdOwotICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJFUlJPUjogVW5hYmxlIHRvIGRlc2VyaWFsaXplIGJ1bmRsZSByb290IG5hbWU6JXNcbiIsIHJvb3RfbmFtZS5jX3N0cigpKTsKLSAgICBMT0dfV0FSTigiJXMiLCBidWYpOwotICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWYpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNvbmdlbjsKLSAgZmxhdGJ1ZmZlcnM6OkdlbmVyYXRlVGV4dChwYXJzZXIsIGR1bXBzeXNfZGF0YS0+ZGF0YSgpLCAmanNvbmdlbik7Ci0gIHJldHVybiBqc29uZ2VuOwotfQotCi12b2lkIER1bXBzeXM6OmltcGw6OkR1bXBXaXRoQXJnc0FzeW5jKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3MpIHsKLSAgUGFyc2VkRHVtcHN5c0FyZ3MgcGFyc2VkX2R1bXBzeXNfYXJncyhhcmdzKTsKLSAgY29uc3QgYXV0byByZWdpc3RyeSA9IGR1bXBzeXNfbW9kdWxlXy5HZXRNb2R1bGVSZWdpc3RyeSgpOwotCi0gIE1vZHVsZUR1bXBlciBkdW1wZXIoKnJlZ2lzdHJ5LCBrRHVtcHN5c1RpdGxlKTsKLSAgc3RkOjpzdHJpbmcgZHVtcHN5c19kYXRhOwotICBkdW1wZXIuRHVtcFN0YXRlKCZkdW1wc3lzX2RhdGEpOwotCi0gIGlmIChwYXJzZWRfZHVtcHN5c19hcmdzLklzRGV2ZWxvcGVyKCkgfHwgSXNEZWJ1Z2dhYmxlKCkpIHsKLSAgICBkcHJpbnRmKGZkLCAiIC0tLS0tIEZpbHRlcmluZyBhcyBEZXZlbG9wZXIgLS0tLS1cbiIpOwotICAgIEZpbHRlckFzRGV2ZWxvcGVyKCZkdW1wc3lzX2RhdGEpOwotICB9IGVsc2UgewotICAgIGRwcmludGYoZmQsICIgLS0tLS0gRmlsdGVyaW5nIGFzIFVzZXIgLS0tLS1cbiIpOwotICAgIEZpbHRlckFzVXNlcigmZHVtcHN5c19kYXRhKTsKLSAgfQotCi0gIGRwcmludGYoZmQsICIlcyIsIFByaW50QXNKc29uKCZkdW1wc3lzX2RhdGEpLmNfc3RyKCkpOwotfQotCi12b2lkIER1bXBzeXM6OmltcGw6OkR1bXBXaXRoQXJnc1N5bmMoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpIHsKLSAgRHVtcFdpdGhBcmdzQXN5bmMoZmQsIGFyZ3MpOwotICBwcm9taXNlLnNldF92YWx1ZSgpOwotfQotCi1EdW1wc3lzOjpEdW1wc3lzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVfYnVuZGxlZF9zY2hlbWEpCi0gICAgOiByZWZsZWN0aW9uX3NjaGVtYV8oZHVtcHN5czo6UmVmbGVjdGlvblNjaGVtYShwcmVfYnVuZGxlZF9zY2hlbWEpKSB7fQotCi12b2lkIER1bXBzeXM6OkR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncykgewotICBpZiAoZmQgPD0gMCkgewotICAgIHJldHVybjsKLSAgfQotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgQ2FsbE9uKHBpbXBsXy5nZXQoKSwgJkR1bXBzeXM6OmltcGw6OkR1bXBXaXRoQXJnc1N5bmMsIGZkLCBhcmdzLCBzdGQ6Om1vdmUocHJvbWlzZSkpOwotICBmdXR1cmUuZ2V0KCk7Ci19Ci0KLXZvaWQgRHVtcHN5czo6RHVtcChpbnQgZmQsIGNvbnN0IGNoYXIqKiBhcmdzLCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICBpZiAoZmQgPD0gMCkgewotICAgIHByb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENhbGxPbihwaW1wbF8uZ2V0KCksICZEdW1wc3lzOjppbXBsOjpEdW1wV2l0aEFyZ3NTeW5jLCBmZCwgYXJncywgc3RkOjptb3ZlKHByb21pc2UpKTsKLX0KLQotb3M6OkhhbmRsZXIqIER1bXBzeXM6OkdldEdkU2hpbUhhbmRsZXIoKSB7Ci0gIHJldHVybiBHZXRIYW5kbGVyKCk7Ci19Ci0KLS8qKgotICogTW9kdWxlIG1ldGhvZHMKLSAqLwotdm9pZCBEdW1wc3lzOjpMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IHt9Ci0KLXZvaWQgRHVtcHN5czo6U3RhcnQoKSB7Ci0gIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oKnRoaXMsIHJlZmxlY3Rpb25fc2NoZW1hXyk7Ci19Ci0KLXZvaWQgRHVtcHN5czo6U3RvcCgpIHsKLSAgcGltcGxfLnJlc2V0KCk7Ci19Ci0KLUR1bXBzeXNEYXRhRmluaXNoZXIgRHVtcHN5czo6R2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBmYl9idWlsZGVyKSBjb25zdCB7Ci0gIGF1dG8gbmFtZSA9IGZiX2J1aWxkZXItPkNyZWF0ZVN0cmluZygiLS0tLS0gU2hpbSBEdW1wc3lzIC0tLS0tIik7Ci0gIGF1dG8gZXhhbXBsZV9waWVjZW1lYWxfc3RyaW5nID0gZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKCJFeGFtcGxlIFBpZWNlbWVhbCBTdHJpbmciKTsKLSAgYXV0byBleGFtcGxlX2luc3RhbnRfc3RyaW5nID0gZmJfYnVpbGRlci0+Q3JlYXRlU3RyaW5nKCJFeGFtcGxlIEluc3RhbnQgU3RyaW5nIik7Ci0KLSAgRXhhbXBsZVBpZWNlbWVhbFRhYmxlQnVpbGRlciBleGFtcGxlX3BpZWNlbWVhbF90YWJsZV9idWlsZGVyKCpmYl9idWlsZGVyKTsKLSAgZXhhbXBsZV9waWVjZW1lYWxfdGFibGVfYnVpbGRlci5hZGRfZXhhbXBsZV9zdHJpbmcoZXhhbXBsZV9waWVjZW1lYWxfc3RyaW5nKTsKLSAgZXhhbXBsZV9waWVjZW1lYWxfdGFibGVfYnVpbGRlci5hZGRfZXhhbXBsZV9pbnQoMTIzKTsKLSAgZXhhbXBsZV9waWVjZW1lYWxfdGFibGVfYnVpbGRlci5hZGRfZXhhbXBsZV9mbG9hdCgxLjIzKTsKLSAgYXV0byBleGFtcGxlX3BpZWNlbWVhbF90YWJsZSA9IGV4YW1wbGVfcGllY2VtZWFsX3RhYmxlX2J1aWxkZXIuRmluaXNoKCk7Ci0KLSAgYXV0byBleGFtcGxlX2luc3RhbnRfdGFibGUgPSBDcmVhdGVFeGFtcGxlSW5zdGFudFRhYmxlKCpmYl9idWlsZGVyLCBleGFtcGxlX2luc3RhbnRfc3RyaW5nLCAyNDYsIDIuNDYpOwotCi0gIER1bXBzeXNNb2R1bGVEYXRhQnVpbGRlciBidWlsZGVyKCpmYl9idWlsZGVyKTsKLSAgYnVpbGRlci5hZGRfdGl0bGUobmFtZSk7Ci0gIGJ1aWxkZXIuYWRkX251bWJlcl9vZl9idW5kbGVkX3NjaGVtYXMocGltcGxfLT5HZXROdW1iZXJPZkJ1bmRsZWRTY2hlbWFzKCkpOwotICBidWlsZGVyLmFkZF9leGFtcGxlX3BpZWNlbWVhbF90YWJsZShleGFtcGxlX3BpZWNlbWVhbF90YWJsZSk7Ci0gIGJ1aWxkZXIuYWRkX2V4YW1wbGVfaW5zdGFudF90YWJsZShleGFtcGxlX2luc3RhbnRfdGFibGUpOwotICBhdXRvIGR1bXBzeXNfZGF0YSA9IGJ1aWxkZXIuRmluaXNoKCk7Ci0KLSAgcmV0dXJuIFtkdW1wc3lzX2RhdGFdKER1bXBzeXNEYXRhQnVpbGRlciogYnVpbGRlcikgeyBidWlsZGVyLT5hZGRfc2hpbV9kdW1wc3lzX2RhdGEoZHVtcHN5c19kYXRhKTsgfTsKLX0KLQotc3RkOjpzdHJpbmcgRHVtcHN5czo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBrTW9kdWxlTmFtZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NoaW0vZHVtcHN5cy5mYnMgYi9nZC9zaGltL2R1bXBzeXMuZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhMWY1Li4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vZHVtcHN5cy5mYnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLyBzaGltOjpkdW1wc3lzIGRhdGEKLW5hbWVzcGFjZSBibHVldG9vdGguc2hpbTsKLQotYXR0cmlidXRlICJwcml2YWN5IjsKLQotdGFibGUgRXhhbXBsZVBpZWNlbWVhbFRhYmxlIHsKLSAgICBleGFtcGxlX3N0cmluZzpzdHJpbmcgKHByaXZhY3k6IkFueSIpOwotICAgIGV4YW1wbGVfaW50OmludCAocHJpdmFjeToiQW55Iik7Ci0gICAgZXhhbXBsZV9mbG9hdDpmbG9hdCAocHJpdmFjeToiQW55Iik7Ci19Ci0KLXRhYmxlIEV4YW1wbGVJbnN0YW50VGFibGUgewotICAgIGV4YW1wbGVfc3RyaW5nOnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci0gICAgZXhhbXBsZV9pbnQ6aW50IChwcml2YWN5OiJBbnkiKTsKLSAgICBleGFtcGxlX2Zsb2F0OmZsb2F0IChwcml2YWN5OiJBbnkiKTsKLX0KLQotdGFibGUgRHVtcHN5c01vZHVsZURhdGEgewotICAgIHRpdGxlOnN0cmluZyAocHJpdmFjeToiQW55Iik7Ci0gICAgbnVtYmVyX29mX2J1bmRsZWRfc2NoZW1hczppbnQgKHByaXZhY3k6IkFueSIpOwotICAgIGV4YW1wbGVfcGllY2VtZWFsX3RhYmxlOkV4YW1wbGVQaWVjZW1lYWxUYWJsZSAocHJpdmFjeToiQW55Iik7Ci0gICAgZXhhbXBsZV9pbnN0YW50X3RhYmxlOkV4YW1wbGVJbnN0YW50VGFibGUgKHByaXZhY3k6IkFueSIpOwotfQotCi1yb290X3R5cGUgRHVtcHN5c01vZHVsZURhdGE7CmRpZmYgLS1naXQgYS9nZC9zaGltL2R1bXBzeXMuaCBiL2dkL3NoaW0vZHVtcHN5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWMxOTM2Li4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vZHVtcHN5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJkdW1wc3lzL3JlZmxlY3Rpb25fc2NoZW1hLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1jb25zdGV4cHIgY2hhciBrQXJndW1lbnREZXZlbG9wZXJbXSA9ICItLWRldiI7Ci0KLWNsYXNzIER1bXBzeXMgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgdm9pZCBEdW1wKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3MpOwotICB2b2lkIER1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgc3RkOjpwcm9taXNlPHZvaWQ+IHByb21pc2UpOwotCi0gIC8vIENvbnZlbmllbmNlIHRocmVhZCB1c2VkIGJ5IHNoaW0gbGF5ZXIgZm9yIHRhc2sgZXhlY3V0aW9uCi0gIG9zOjpIYW5kbGVyKiBHZXRHZFNoaW1IYW5kbGVyKCk7Ci0KLSAgRHVtcHN5cyhjb25zdCBzdGQ6OnN0cmluZyYgcHJlX2J1bmRsZWRfc2NoZW1hKTsKLSAgfkR1bXBzeXMoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMaXN0RGVwZW5kZW5jaWVzKE1vZHVsZUxpc3QqIGxpc3QpIGNvbnN0IG92ZXJyaWRlOyAgLy8gTW9kdWxlCi0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZHVsZQotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2R1bGUKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsgICAgICAgICAgICAgLy8gTW9kdWxlCi0gIER1bXBzeXNEYXRhRmluaXNoZXIgR2V0RHVtcHN5c0RhdGEoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyKiBidWlsZGVyKSBjb25zdCBvdmVycmlkZTsgIC8vIE1vZHVsZQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IGltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0gIGNvbnN0IGR1bXBzeXM6OlJlZmxlY3Rpb25TY2hlbWEgcmVmbGVjdGlvbl9zY2hlbWFfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRHVtcHN5cyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS9kdW1wc3lzX2FyZ3MuY2MgYi9nZC9zaGltL2R1bXBzeXNfYXJncy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NmVkMS4uMDAwMDAwMAotLS0gYS9nZC9zaGltL2R1bXBzeXNfYXJncy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzaGltL2R1bXBzeXNfYXJncy5oIgotI2luY2x1ZGUgInNoaW0vZHVtcHN5cy5oIgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDsKLQotc2hpbTo6UGFyc2VkRHVtcHN5c0FyZ3M6OlBhcnNlZER1bXBzeXNBcmdzKGNvbnN0IGNoYXIqKiBhcmdzKSB7Ci0gIGlmIChhcmdzID09IG51bGxwdHIpIHJldHVybjsKLSAgY29uc3QgY2hhciogcCA9ICphcmdzOwotICB3aGlsZSAocCAhPSBudWxscHRyKSB7Ci0gICAgbnVtX2FyZ3NfKys7Ci0gICAgaWYgKCFzdGQ6OnN0cmNtcChwLCBrQXJndW1lbnREZXZlbG9wZXIpKSB7Ci0gICAgICBkZXZfYXJnXyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSB1bmV4cGVjdGVkIG9wdGlvbgotICAgIH0KLSAgICBpZiAoKythcmdzID09IG51bGxwdHIpIGJyZWFrOwotICAgIHAgPSAqYXJnczsKLSAgfQotfQotCi1ib29sIHNoaW06OlBhcnNlZER1bXBzeXNBcmdzOjpJc0RldmVsb3BlcigpIGNvbnN0IHsKLSAgcmV0dXJuIGRldl9hcmdfOwotfQpkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS9kdW1wc3lzX2FyZ3MuaCBiL2dkL3NoaW0vZHVtcHN5c19hcmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Nzk3OTkuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS9kdW1wc3lzX2FyZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotY2xhc3MgUGFyc2VkRHVtcHN5c0FyZ3MgewotIHB1YmxpYzoKLSAgUGFyc2VkRHVtcHN5c0FyZ3MoY29uc3QgY2hhcioqIGFyZ3MpOwotICBib29sIElzRGV2ZWxvcGVyKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB1bnNpZ25lZCBudW1fYXJnc197MH07Ci0gIGJvb2wgZGV2X2FyZ197ZmFsc2V9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NoaW0vZHVtcHN5c19hcmdzX3Rlc3QuY2MgYi9nZC9zaGltL2R1bXBzeXNfYXJnc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk4YmFjLi4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vZHVtcHN5c19hcmdzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2hpbS9kdW1wc3lzX2FyZ3MuaCIKLSNpbmNsdWRlICJzaGltL2R1bXBzeXMuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotVEVTVChEdW1wc3lzQXJnc1Rlc3QsIG5vX2FyZ3MpIHsKLSAgc2hpbTo6UGFyc2VkRHVtcHN5c0FyZ3MgcGFyc2VkX2R1bXBzeXNfYXJncyhudWxscHRyKTsKLSAgQVNTRVJUX0ZBTFNFKHBhcnNlZF9kdW1wc3lzX2FyZ3MuSXNEZXZlbG9wZXIoKSk7Ci19Ci0KLVRFU1QoRHVtcHN5c0FyZ3NUZXN0LCBwYXJzZWRfYXJnc193aXRob3V0X2RldikgewotICBjb25zdCBjaGFyKiBhcmdzW117Ci0gICAgICBudWxscHRyLAotICB9OwotICBzaGltOjpQYXJzZWREdW1wc3lzQXJncyBwYXJzZWRfZHVtcHN5c19hcmdzKGFyZ3MpOwotICBBU1NFUlRfRkFMU0UocGFyc2VkX2R1bXBzeXNfYXJncy5Jc0RldmVsb3BlcigpKTsKLX0KLQotVEVTVChEdW1wc3lzQXJnc1Rlc3QsIHBhcnNlZF9hcmdzX3dpdGhfZGV2KSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3NbXXsKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6a0FyZ3VtZW50RGV2ZWxvcGVyLAotICAgICAgbnVsbHB0ciwKLSAgfTsKLSAgc2hpbTo6UGFyc2VkRHVtcHN5c0FyZ3MgcGFyc2VkX2R1bXBzeXNfYXJncyhhcmdzKTsKLSAgQVNTRVJUX1RSVUUocGFyc2VkX2R1bXBzeXNfYXJncy5Jc0RldmVsb3BlcigpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2dkL3NoaW0vZHVtcHN5c190ZXN0LmNjIGIvZ2Qvc2hpbS9kdW1wc3lzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjU4Y2UuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS9kdW1wc3lzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0jaW5jbHVkZSAic2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAic2hpbS9kdW1wc3lzX2FyZ3MuaCIKLSNpbmNsdWRlICJ0ZXN0X2RhdGEvZHVtcHN5c190ZXN0X2RhdGFfYmluLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpUZXN0TW9kdWxlUmVnaXN0cnk7Ci11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOwotCi1uYW1lc3BhY2UgewotCi1ib29sIFNpbXBsZUpzb25WYWxpZGF0b3IoaW50IGZkLCBpbnQqIGR1bXBzeXNfYnl0ZV9jbnQpIHsKLSAgY2hhciBidWZ7MH07Ci0gIGJvb2wgd2l0aGluX2RvdWJsZV9xdW90ZXN7ZmFsc2V9OwotICBpbnQgbGVmdF9icmFja2V0ezB9LCByaWdodF9icmFja2V0ezB9OwotICB3aGlsZSAocmVhZChmZCwgJmJ1ZiwgMSkgIT0gLTEpIHsKLSAgICBzd2l0Y2ggKGJ1ZikgewotICAgICAgKCpkdW1wc3lzX2J5dGVfY250KSsrOwotICAgICAgY2FzZSAnIic6Ci0gICAgICAgIHdpdGhpbl9kb3VibGVfcXVvdGVzID0gIXdpdGhpbl9kb3VibGVfcXVvdGVzOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3snOgotICAgICAgICBpZiAoIXdpdGhpbl9kb3VibGVfcXVvdGVzKSB7Ci0gICAgICAgICAgbGVmdF9icmFja2V0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd9JzoKLSAgICAgICAgaWYgKCF3aXRoaW5fZG91YmxlX3F1b3RlcykgewotICAgICAgICAgIHJpZ2h0X2JyYWNrZXQrKzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gbGVmdF9icmFja2V0ID09IHJpZ2h0X2JyYWNrZXQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBUbyBjcmVhdGUgZHVtcHN5c190ZXN0X2hlYWRlcl9iaW4uaDoKLS8vIG1ha2UgYmx1ZXRvb3RoX2ZsYXRidWZmZXJfYnVuZGxlcgotLy8gJHtBTkRST0lEX0JVSUxEX1RPUH0vb3V0L2hvc3QvbGludXgteDg2L2Jpbi9ibHVldG9vdGhfZmxhdGJ1ZmZlcl9idW5kbGVyIC13IC1tIGJsdWV0b290aC5EdW1wc3lzRGF0YSAtZgotLy8gdGVzdF9nZW4vZHVtcHN5c190ZXN0X2RhdGFfYmluIC1uIGJsdWV0b290aDo6dGVzdCB0ZXN0X2dlbi8qCi0KLWNsYXNzIER1bXBzeXNUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBkdW1wc3lzX21vZHVsZV8gPSBuZXcgYmx1ZXRvb3RoOjpzaGltOjpEdW1wc3lzKGJsdWV0b290aDo6dGVzdDo6R2V0QnVuZGxlZFNjaGVtYURhdGEoKSk7Ci0gICAgZmFrZV9yZWdpc3RyeV8uSW5qZWN0VGVzdE1vZHVsZSgmc2hpbTo6RHVtcHN5czo6RmFjdG9yeSwgZHVtcHN5c19tb2R1bGVfKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZmFrZV9yZWdpc3RyeV8uU3RvcEFsbCgpOwotICB9Ci0KLSAgdm9pZCBQcmludCgpIHsKLSAgICBkdW1wc3lzX21vZHVsZV8tPkR1bXAoMCwgbnVsbHB0cik7Ci0gIH0KLQotICBpbnQgR2V0U29ja2V0QnVmZmVyU2l6ZShpbnQgc29ja2ZkKSB7Ci0gICAgaW50IHNvY2tldF9idWZmZXJfc2l6ZTsKLSAgICBzb2NrbGVuX3Qgb3B0bGVuID0gc2l6ZW9mKHNvY2tldF9idWZmZXJfc2l6ZSk7Ci0gICAgZ2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKHZvaWQqKSZzb2NrZXRfYnVmZmVyX3NpemUsICZvcHRsZW4pOwotICAgIHJldHVybiBzb2NrZXRfYnVmZmVyX3NpemU7Ci0gIH0KLQotICB2b2lkIFNldFNvY2tldEJ1ZmZlclNpemUoaW50IHNvY2tmZCwgaW50IHNvY2tldF9idWZmZXJfc2l6ZSkgewotICAgIHNvY2tsZW5fdCBvcHRsZW4gPSBzaXplb2Yoc29ja2V0X2J1ZmZlcl9zaXplKTsKLSAgICBBU1NFUlRfRVEoMCwgc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNvbnN0IHZvaWQqKSZzb2NrZXRfYnVmZmVyX3NpemUsIG9wdGxlbikpOwotICB9Ci0KLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IGZha2VfcmVnaXN0cnlfOwotICBvczo6VGhyZWFkJiB0aHJlYWRfID0gZmFrZV9yZWdpc3RyeV8uR2V0VGVzdFRocmVhZCgpOwotICBibHVldG9vdGg6OnNoaW06OkR1bXBzeXMqIGR1bXBzeXNfbW9kdWxlXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBjbGllbnRfaGFuZGxlcl8gPSBudWxscHRyOwotfTsKLQotVEVTVF9GKER1bXBzeXNUZXN0LCBkdW1wX2FzX2RldmVsb3BlcikgewotICBjb25zdCBjaGFyKiBhcmdzW117Ymx1ZXRvb3RoOjpzaGltOjprQXJndW1lbnREZXZlbG9wZXIsIG51bGxwdHJ9OwotCi0gIGludCBzdlsyXTsKLSAgQVNTRVJUX0VRKDAsIHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNIHwgU09DS19OT05CTE9DSywgMCwgc3YpKTsKLSAgaW50IHNvY2tldF9idWZmZXJfc2l6ZSA9IEdldFNvY2tldEJ1ZmZlclNpemUoc3ZbMF0pOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBzdGQ6OmZ1dHVyZSBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgZHVtcHN5c19tb2R1bGVfLT5EdW1wKHN2WzBdLCBhcmdzLCBzdGQ6Om1vdmUocHJvbWlzZSkpOwotICBmdXR1cmUud2FpdCgpOwotCi0gIGludCBkdW1wc3lzX2J5dGVfY250ID0gMDsKLSAgQVNTRVJUX1RSVUUoU2ltcGxlSnNvblZhbGlkYXRvcihzdlsxXSwgJmR1bXBzeXNfYnl0ZV9jbnQpKTsKLSAgQVNTRVJUX1RSVUUoZHVtcHN5c19ieXRlX2NudCA8IHNvY2tldF9idWZmZXJfc2l6ZSk7Ci19Ci0KLVRFU1RfRihEdW1wc3lzVGVzdCwgZHVtcF9hc191c2VyKSB7Ci0gIGNvbnN0IGNoYXIqIGFyZ3NbXXsibm90LWEtZGV2ZWxvcGVyLW9wdGlvbiIsIG51bGxwdHJ9OwotCi0gIGludCBzdlsyXTsKLSAgQVNTRVJUX0VRKDAsIHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNIHwgU09DS19OT05CTE9DSywgMCwgc3YpKTsKLSAgaW50IHNvY2tldF9idWZmZXJfc2l6ZSA9IEdldFNvY2tldEJ1ZmZlclNpemUoc3ZbMF0pOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBzdGQ6OmZ1dHVyZSBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgZHVtcHN5c19tb2R1bGVfLT5EdW1wKHN2WzBdLCBhcmdzLCBzdGQ6Om1vdmUocHJvbWlzZSkpOwotICBmdXR1cmUud2FpdCgpOwotCi0gIGludCBkdW1wc3lzX2J5dGVfY250ID0gMDsKLSAgQVNTRVJUX1RSVUUoU2ltcGxlSnNvblZhbGlkYXRvcihzdlsxXSwgJmR1bXBzeXNfYnl0ZV9jbnQpKTsKLSAgQVNTRVJUX1RSVUUoZHVtcHN5c19ieXRlX2NudCA8IHNvY2tldF9idWZmZXJfc2l6ZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS9nZC9zaGltL2ZhY2FkZS9mYWNhZGUuY2MgYi9nZC9zaGltL2ZhY2FkZS9mYWNhZGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzI1OTYuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS9mYWNhZGUvZmFjYWRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNoaW0vZmFjYWRlL2ZhY2FkZS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29tbW9uL2JpbmQuaCIKLSNpbmNsdWRlICJmbGF0YnVmZmVycy9pZGwuaCIKLSNpbmNsdWRlICJmbGF0YnVmZmVycy9yZWZsZWN0aW9uX2dlbmVyYXRlZC5oIgotI2luY2x1ZGUgImdycGMvZ3JwY19ldmVudF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInNoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgInNoaW0vZmFjYWRlL2ZhY2FkZS5ncnBjLnBiLmgiCi0jaW5jbHVkZSAic2hpbS9mYWNhZGUvZmFjYWRlLnBiLmgiCi0KLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNSZXNwb25zZVdyaXRlcjsKLXVzaW5nIDo6Z3JwYzo6U2VydmVyQXN5bmNXcml0ZXI7Ci11c2luZyA6OmdycGM6OlNlcnZlckNvbnRleHQ7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotbmFtZXNwYWNlIGZhY2FkZSB7Ci0KLWNsYXNzIFNoaW1GYWNhZGVTZXJ2aWNlIDogcHVibGljIFNoaW1GYWNhZGU6OlNlcnZpY2UgewotIHB1YmxpYzoKLSAgU2hpbUZhY2FkZVNlcnZpY2Uoc2hpbTo6RHVtcHN5cyogZHVtcHN5c19sYXllciwgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcikKLSAgICAgIDogZHVtcHN5c19sYXllcl8oZHVtcHN5c19sYXllciksIGZhY2FkZV9oYW5kbGVyXyhmYWNhZGVfaGFuZGxlcikge30KLQotICB2aXJ0dWFsIH5TaGltRmFjYWRlU2VydmljZSgpIHt9Ci0KLSAgOjpncnBjOjpTdGF0dXMgRHVtcCgKLSAgICAgIDo6Z3JwYzo6U2VydmVyQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW1wdHkqIHJlcXVlc3QsCi0gICAgICA6OmdycGM6OlNlcnZlcldyaXRlcjxEdW1wc3lzTXNnPiogd3JpdGVyKSBvdmVycmlkZSB7Ci0gICAgZHVtcHN5c19sYXllcl8tPkR1bXAoMCwgbnVsbHB0cik7Ci0gICAgcmV0dXJuIDo6Z3JwYzo6U3RhdHVzOjpPSzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc2hpbTo6RHVtcHN5cyogZHVtcHN5c19sYXllcl97bnVsbHB0cn07Ci0gIFtbbWF5YmVfdW51c2VkXV0gOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyKiBmYWNhZGVfaGFuZGxlcl97bnVsbHB0cn07Ci19OwotCi12b2lkIFNoaW1GYWNhZGVNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6TGlzdERlcGVuZGVuY2llcyhsaXN0KTsKLSAgbGlzdC0+YWRkPER1bXBzeXM+KCk7Ci19Ci0KLXZvaWQgU2hpbUZhY2FkZU1vZHVsZTo6U3RhcnQoKSB7Ci0gIDo6Ymx1ZXRvb3RoOjpncnBjOjpHcnBjRmFjYWRlTW9kdWxlOjpTdGFydCgpOwotICBzZXJ2aWNlXyA9IG5ldyBTaGltRmFjYWRlU2VydmljZShHZXREZXBlbmRlbmN5PER1bXBzeXM+KCksIEdldEhhbmRsZXIoKSk7Ci19Ci0KLXZvaWQgU2hpbUZhY2FkZU1vZHVsZTo6U3RvcCgpIHsKLSAgZGVsZXRlIHNlcnZpY2VfOwotICA6OmJsdWV0b290aDo6Z3JwYzo6R3JwY0ZhY2FkZU1vZHVsZTo6U3RvcCgpOwotfQotCi06OmdycGM6OlNlcnZpY2UqIFNoaW1GYWNhZGVNb2R1bGU6OkdldFNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotY29uc3QgTW9kdWxlRmFjdG9yeSBTaGltRmFjYWRlTW9kdWxlOjpGYWN0b3J5ID0gOjpibHVldG9vdGg6Ok1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBuZXcgU2hpbUZhY2FkZU1vZHVsZSgpOyB9KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NoaW0vZmFjYWRlL2ZhY2FkZS5oIGIvZ2Qvc2hpbS9mYWNhZGUvZmFjYWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzgzNTEuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS9mYWNhZGUvZmFjYWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdycGMrKy9ncnBjKysuaD4KLQotI2luY2x1ZGUgImdycGMvZ3JwY19tb2R1bGUuaCIKLSNpbmNsdWRlICJzaGltL2R1bXBzeXMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci1uYW1lc3BhY2UgZmFjYWRlIHsKLQotY2xhc3MgU2hpbUZhY2FkZVNlcnZpY2U7Ci0KLWNsYXNzIFNoaW1GYWNhZGVNb2R1bGUgOiBwdWJsaWMgOjpibHVldG9vdGg6OmdycGM6OkdycGNGYWNhZGVNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IE1vZHVsZUZhY3RvcnkgRmFjdG9yeTsKLQotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0gIDo6Z3JwYzo6U2VydmljZSogR2V0U2VydmljZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgU2hpbUZhY2FkZVNlcnZpY2UqIHNlcnZpY2VfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZhY2FkZQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3NoaW0vZmFjYWRlL2ZhY2FkZS5wcm90byBiL2dkL3NoaW0vZmFjYWRlL2ZhY2FkZS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjMDM0MC4uMDAwMDAwMAotLS0gYS9nZC9zaGltL2ZhY2FkZS9mYWNhZGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBibHVldG9vdGguc2hpbS5mYWNhZGU7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIjsKLQotc2VydmljZSBTaGltRmFjYWRlIHsKLSAgcnBjIER1bXAoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChzdHJlYW0gRHVtcHN5c01zZykge30KLX0KLQotbWVzc2FnZSBEdW1wc3lzTXNnIHsKLSAgYnl0ZXMgZGF0YSA9IDE7Ci19CmRpZmYgLS1naXQgYS9nZC9zaGltL3Rlc3RfZGF0YS9kdW1wc3lzX2RhdGEuYmZicyBiL2dkL3NoaW0vdGVzdF9kYXRhL2R1bXBzeXNfZGF0YS5iZmJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmUyZWE1Li4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vdGVzdF9kYXRhL2R1bXBzeXNfZGF0YS5iZmJzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ2Qvc2hpbS90ZXN0X2RhdGEvZHVtcHN5c190ZXN0X2RhdGFfYmluIGIvZ2Qvc2hpbS90ZXN0X2RhdGEvZHVtcHN5c190ZXN0X2RhdGFfYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM0MTBkLi4wMDAwMDAwCi0tLSBhL2dkL3NoaW0vdGVzdF9kYXRhL2R1bXBzeXNfdGVzdF9kYXRhX2JpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dkL3NoaW0vdGVzdF9kYXRhL2R1bXBzeXNfdGVzdF9kYXRhX2Jpbi5oIGIvZ2Qvc2hpbS90ZXN0X2RhdGEvZHVtcHN5c190ZXN0X2RhdGFfYmluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTkwNDkuLjAwMDAwMDAKLS0tIGEvZ2Qvc2hpbS90ZXN0X2RhdGEvZHVtcHN5c190ZXN0X2RhdGFfYmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgZmlsZSBieSBibHVldG9vdGhfZmxhdGJ1ZmZlciBidW5kbGVyCi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0ZXN0IHsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhOwotZXh0ZXJuIGNvbnN0IHNpemVfdCBkYXRhX3NpemU7Ci1jb25zdCBzdGQ6OnN0cmluZyYgR2V0QnVuZGxlZFNjaGVtYURhdGEoKTsKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi1jb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfW10gPSB7Ci0gICAgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjIsIDB4NmMsIDB4NzUsIDB4NjUsIDB4NzQsIDB4NmYsIDB4NmYsIDB4NzQsIDB4NjgsIDB4MmUsIDB4NDQsIDB4NzUsIDB4NmQsCi0gICAgMHg3MCwgMHg3MywgMHg3OSwgMHg3MywgMHg0NCwgMHg2MSwgMHg3NCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg3NSwgMHg2ZSwgMHg2NCwKLSAgICAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDczLCAweDYzLCAweDY4LCAweDY1LCAweDZkLCAweDYxLCAweDIwLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDczLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0NiwgMHg0MiwgMHg1MywgMHgxMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgwNCwKLSAgICAweDAwLCAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDEwLCAweDAwLCAweDE0LCAweDAwLCAweDE4LCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweDAxLCAweDAwLCAweDAwLCAweDM4LAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4M2MsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDYyLCAweDZjLCAweDc1LCAweDY1LCAweDc0LCAweDZmLCAweDZmLCAweDc0LCAweDY4LCAweDJlLCAweDQ0LCAweDc1LCAweDZkLCAweDcwLCAweDczLCAweDc5LCAweDczLCAweDQ0LAotICAgIDB4NjEsIDB4NzQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGMsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MiwgMHhmZiwgMHhmZiwgMHhmZiwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDZkLCAweDZmLCAweDY0LCAweDc1LCAweDZjLCAweDY1LCAweDVmLAotICAgIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NzQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0gICAgMHgxNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDEwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweDRjLCAweDAwLCAweDAwLCAweDAwLCAweDNjLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4MTAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MSwgMHg2ZSwgMHg3OSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MiwKLSAgICAweDY5LCAweDc2LCAweDYxLCAweDYzLCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDBjLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDBhLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzMsIDB4NjgsIDB4NjksIDB4NmQsCi0gICAgMHg1ZiwgMHg2NCwgMHg3NSwgMHg2ZCwgMHg3MCwgMHg3MywgMHg3OSwgMHg3MywgMHg1ZiwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgxMCwKLSAgICAweDAwLCAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjYsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsCi0gICAgMHg2OSwgMHg3NCwgMHg2YywgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDJjLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDYyLCAweDZjLCAweDc1LAotICAgIDB4NjUsIDB4NzQsIDB4NmYsIDB4NmYsIDB4NzQsIDB4NjgsIDB4MmUsIDB4NzMsIDB4NjgsIDB4NjksIDB4NmQsIDB4MmUsIDB4NDQsIDB4NzUsIDB4NmQsIDB4NzAsIDB4NzMsIDB4NzksIDB4NzMsCi0gICAgMHg0ZCwgMHg2ZiwgMHg2NCwgMHg3NSwgMHg2YywgMHg2NSwgMHg0NCwgMHg2MSwgMHg3NCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2OCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwKLSAgICAweDAwLCAweDA0LCAweDAwLCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHg0MSwgMHg2ZSwgMHg3OSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MiwgMHg2OSwgMHg3NiwgMHg2MSwgMHg2MywgMHg3OSwgMHgwMCwgMHg0NiwgMHhmZiwKLSAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDBkLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDc0LCAweDY5LCAweDc0LCAweDZjLCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDBjLAotICAgIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDYyLCAweDZjLCAweDc1LCAweDY1LCAweDc0LCAweDZmLCAweDZmLCAweDc0LCAweDY4LCAweDJlLCAweDRkLCAweDZmLCAweDY0LCAweDc1LCAweDZjLCAweDY1LCAweDU1LCAweDZlLAotICAgIDB4NjksIDB4NzQsIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NDQsIDB4NjEsIDB4NzQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDgsCi0gICAgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKLSAgICAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDRjLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MSwgMHg2ZSwgMHg3OSwgMHgwMCwgMHgwNywKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDcyLCAweDY5LCAweDc2LCAweDYxLCAweDYzLCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDA4LCAweDAwLCAweDA3LCAweDAwLAotICAgIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4NjksIDB4NzQsIDB4NmMsIDB4NjUsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2MiwgMHg2YywgMHg3NSwgMHg2NSwgMHg3NCwgMHg2ZiwgMHg2ZiwgMHg3NCwgMHg2OCwgMHgyZSwgMHg0NCwgMHg3NSwgMHg2ZCwgMHg3MCwKLSAgICAweDczLCAweDc5LCAweDczLCAweDQ0LCAweDYxLCAweDc0LCAweDYxLCAweDAwLCAweDAwLCAweDAwfTsKLWNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ19kYXRhXyhkYXRhXywgZGF0YV8gKyBzaXplb2YoZGF0YV8pKTsKLWNvbnN0IHVuc2lnbmVkIGNoYXIqIGJsdWV0b290aDo6dGVzdDo6ZGF0YSA9IGRhdGFfOwotY29uc3Qgc2l6ZV90IGJsdWV0b290aDo6dGVzdDo6ZGF0YV9zaXplID0gODg0OwotY29uc3Qgc3RkOjpzdHJpbmcmIGJsdWV0b290aDo6dGVzdDo6R2V0QnVuZGxlZFNjaGVtYURhdGEoKSB7Ci0gIHJldHVybiBzdHJpbmdfZGF0YV87Ci19CmRpZmYgLS1naXQgYS9nZC9zdGFja19tYW5hZ2VyLmNjIGIvZ2Qvc3RhY2tfbWFuYWdlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiNjU4Mi4uMDAwMDAwMAotLS0gYS9nZC9zdGFja19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0YWNrX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAib3MvaGFuZGxlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zL3dha2Vsb2NrX21hbmFnZXIuaCIKLQotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpIYW5kbGVyOwotdXNpbmcgOjpibHVldG9vdGg6Om9zOjpUaHJlYWQ7Ci11c2luZyA6OmJsdWV0b290aDo6b3M6Oldha2Vsb2NrTWFuYWdlcjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXZvaWQgU3RhY2tNYW5hZ2VyOjpTdGFydFVwKE1vZHVsZUxpc3QqIG1vZHVsZXMsIFRocmVhZCogc3RhY2tfdGhyZWFkKSB7Ci0gIG1hbmFnZW1lbnRfdGhyZWFkXyA9IG5ldyBUaHJlYWQoIm1hbmFnZW1lbnRfdGhyZWFkIiwgVGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgaGFuZGxlcl8gPSBuZXcgSGFuZGxlcihtYW5hZ2VtZW50X3RocmVhZF8pOwotCi0gIFdha2Vsb2NrTWFuYWdlcjo6R2V0KCkuQWNxdWlyZSgpOwotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBoYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZTdGFja01hbmFnZXI6OmhhbmRsZV9zdGFydF91cCwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpLCBtb2R1bGVzLCBzdGFja190aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb21pc2UpKSk7Ci0KLSAgYXV0byBpbml0X3N0YXR1cyA9IGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygzKSk7Ci0KLSAgV2FrZWxvY2tNYW5hZ2VyOjpHZXQoKS5SZWxlYXNlKCk7Ci0KLSAgQVNTRVJUX0xPRygKLSAgICAgIGluaXRfc3RhdHVzID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksCi0gICAgICAiQ2FuJ3Qgc3RhcnQgc3RhY2ssIGxhc3QgaW5zdGFuY2U6ICVzIiwKLSAgICAgIHJlZ2lzdHJ5Xy5sYXN0X2luc3RhbmNlXy5jX3N0cigpKTsKLQotICBMT0dfSU5GTygiaW5pdCBjb21wbGV0ZSIpOwotfQotCi12b2lkIFN0YWNrTWFuYWdlcjo6aGFuZGxlX3N0YXJ0X3VwKE1vZHVsZUxpc3QqIG1vZHVsZXMsIFRocmVhZCogc3RhY2tfdGhyZWFkLCBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICByZWdpc3RyeV8uU3RhcnQobW9kdWxlcywgc3RhY2tfdGhyZWFkKTsKLSAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLX0KLQotdm9pZCBTdGFja01hbmFnZXI6OlNodXREb3duKCkgewotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkFjcXVpcmUoKTsKLQotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgaGFuZGxlcl8tPlBvc3QoY29tbW9uOjpCaW5kT25jZSgmU3RhY2tNYW5hZ2VyOjpoYW5kbGVfc2h1dF9kb3duLCBjb21tb246OlVucmV0YWluZWQodGhpcyksIHN0ZDo6bW92ZShwcm9taXNlKSkpOwotCi0gIGF1dG8gc3RvcF9zdGF0dXMgPSBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpOwotCi0gIFdha2Vsb2NrTWFuYWdlcjo6R2V0KCkuUmVsZWFzZSgpOwotICBXYWtlbG9ja01hbmFnZXI6OkdldCgpLkNsZWFuVXAoKTsKLQotICBBU1NFUlRfTE9HKAotICAgICAgc3RvcF9zdGF0dXMgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSwKLSAgICAgICJDYW4ndCBzdG9wIHN0YWNrLCBsYXN0IGluc3RhbmNlOiAlcyIsCi0gICAgICByZWdpc3RyeV8ubGFzdF9pbnN0YW5jZV8uY19zdHIoKSk7Ci0KLSAgaGFuZGxlcl8tPkNsZWFyKCk7Ci0gIGhhbmRsZXJfLT5XYWl0VW50aWxTdG9wcGVkKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwMCkpOwotICBkZWxldGUgaGFuZGxlcl87Ci0gIGRlbGV0ZSBtYW5hZ2VtZW50X3RocmVhZF87Ci19Ci0KLXZvaWQgU3RhY2tNYW5hZ2VyOjpoYW5kbGVfc2h1dF9kb3duKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKSB7Ci0gIHJlZ2lzdHJ5Xy5TdG9wQWxsKCk7Ci0gIHByb21pc2Uuc2V0X3ZhbHVlKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3N0YWNrX21hbmFnZXIuaCBiL2dkL3N0YWNrX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5YTdmNi4uMDAwMDAwMAotLS0gYS9nZC9zdGFja19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIFN0YWNrTWFuYWdlciB7Ci0gcHVibGljOgotICB2b2lkIFN0YXJ0VXAoTW9kdWxlTGlzdCAqbW9kdWxlcywgb3M6OlRocmVhZCogc3RhY2tfdGhyZWFkKTsKLSAgdm9pZCBTaHV0RG93bigpOwotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBUKiBHZXRJbnN0YW5jZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KHJlZ2lzdHJ5Xy5HZXQoJlQ6OkZhY3RvcnkpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBib29sIElzU3RhcnRlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVnaXN0cnlfLklzU3RhcnRlZCgmVDo6RmFjdG9yeSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIG9zOjpUaHJlYWQqIG1hbmFnZW1lbnRfdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXyA9IG51bGxwdHI7Ci0gIE1vZHVsZVJlZ2lzdHJ5IHJlZ2lzdHJ5XzsKLQotICB2b2lkIGhhbmRsZV9zdGFydF91cChNb2R1bGVMaXN0KiBtb2R1bGVzLCBvczo6VGhyZWFkKiBzdGFja190aHJlYWQsIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLSAgdm9pZCBoYW5kbGVfc2h1dF9kb3duKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3N0YWNrX21hbmFnZXJfdW5pdHRlc3QuY2MgYi9nZC9zdGFja19tYW5hZ2VyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ2NzVlLi4wMDAwMDAwCi0tLSBhL2dkL3N0YWNrX21hbmFnZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RhY2tfbWFuYWdlci5oIgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJvcy90aHJlYWQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgewotCi1URVNUKFN0YWNrTWFuYWdlclRlc3QsIHN0YXJ0X2FuZF9zaHV0ZG93bl9ub19tb2R1bGUpIHsKLSAgU3RhY2tNYW5hZ2VyIHN0YWNrX21hbmFnZXI7Ci0gIE1vZHVsZUxpc3QgbW9kdWxlX2xpc3Q7Ci0gIG9zOjpUaHJlYWQgdGhyZWFkeyJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUx9OwotICBzdGFja19tYW5hZ2VyLlN0YXJ0VXAoJm1vZHVsZV9saXN0LCAmdGhyZWFkKTsKLSAgc3RhY2tfbWFuYWdlci5TaHV0RG93bigpOwotfQotCi1jbGFzcyBUZXN0TW9kdWxlTm9EZXBlbmRlbmN5IDogcHVibGljIE1vZHVsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgTW9kdWxlRmFjdG9yeSBGYWN0b3J5OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIExpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3Qge30KLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlIHt9Ci0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiVGVzdE1vZHVsZURlcCIpOwotICB9Ci19OwotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgeyByZXR1cm4gbmV3IFRlc3RNb2R1bGVOb0RlcGVuZGVuY3koKTsgfSk7Ci0KLVRFU1QoU3RhY2tNYW5hZ2VyVGVzdCwgZ2V0X21vZHVsZV9pbnN0YW5jZSkgewotICBTdGFja01hbmFnZXIgc3RhY2tfbWFuYWdlcjsKLSAgTW9kdWxlTGlzdCBtb2R1bGVfbGlzdDsKLSAgbW9kdWxlX2xpc3QuYWRkPFRlc3RNb2R1bGVOb0RlcGVuZGVuY3k+KCk7Ci0gIG9zOjpUaHJlYWQgdGhyZWFkeyJ0ZXN0X3RocmVhZCIsIG9zOjpUaHJlYWQ6OlByaW9yaXR5OjpOT1JNQUx9OwotICBzdGFja19tYW5hZ2VyLlN0YXJ0VXAoJm1vZHVsZV9saXN0LCAmdGhyZWFkKTsKLSAgRVhQRUNUX05FKHN0YWNrX21hbmFnZXIuR2V0SW5zdGFuY2U8VGVzdE1vZHVsZU5vRGVwZW5kZW5jeT4oKSwgbnVsbHB0cik7Ci0gIHN0YWNrX21hbmFnZXIuU2h1dERvd24oKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL0FuZHJvaWQuYnAgYi9nZC9zdG9yYWdlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDRkYTEuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoU3RvcmFnZVNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgICAgICJhZGFwdGVyX2NvbmZpZy5jYyIsCi0gICAgICAgICAgICAiY2xhc3NpY19kZXZpY2UuY2MiLAotICAgICAgICAgICAgImNvbmZpZ19jYWNoZS5jYyIsCi0gICAgICAgICAgICAiY29uZmlnX2NhY2hlX2hlbHBlci5jYyIsCi0gICAgICAgICAgICAiZGV2aWNlLmNjIiwKLSAgICAgICAgICAgICJsZV9kZXZpY2UuY2MiLAotICAgICAgICAgICAgImxlZ2FjeV9jb25maWdfZmlsZS5jYyIsCi0gICAgICAgICAgICAibXV0YXRpb24uY2MiLAotICAgICAgICAgICAgIm11dGF0aW9uX2VudHJ5LmNjIiwKLSAgICAgICAgICAgICJzdG9yYWdlX21vZHVsZS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiQmx1ZXRvb3RoU3RvcmFnZVVuaXRUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAgICAgImFkYXB0ZXJfY29uZmlnX3Rlc3QuY2MiLAotICAgICAgICAgICAgImNsYXNzaWNfZGV2aWNlX3Rlc3QuY2MiLAotICAgICAgICAgICAgImNvbmZpZ19jYWNoZV90ZXN0LmNjIiwKLSAgICAgICAgICAgICJjb25maWdfY2FjaGVfaGVscGVyX3Rlc3QuY2MiLAotICAgICAgICAgICAgImRldmljZV90ZXN0LmNjIiwKLSAgICAgICAgICAgICJsZV9kZXZpY2VfdGVzdC5jYyIsCi0gICAgICAgICAgICAibGVnYWN5X2NvbmZpZ19maWxlX3Rlc3QuY2MiLAotICAgICAgICAgICAgIm11dGF0aW9uX3Rlc3QuY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkJsdWV0b290aFN0b3JhZ2VUZXN0U291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAgICAgInN0b3JhZ2VfbW9kdWxlX3Rlc3QuY2MiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL0JVSUxELmduIGIvZ2Qvc3RvcmFnZS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4NjRlNC4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXNvdXJjZV9zZXQoIkJsdWV0b290aFN0b3JhZ2VTb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJhZGFwdGVyX2NvbmZpZy5jYyIsCi0gICAgImNsYXNzaWNfZGV2aWNlLmNjIiwKLSAgICAiY29uZmlnX2NhY2hlLmNjIiwKLSAgICAiY29uZmlnX2NhY2hlX2hlbHBlci5jYyIsCi0gICAgImRldmljZS5jYyIsCi0gICAgImxlX2RldmljZS5jYyIsCi0gICAgImxlZ2FjeV9jb25maWdfZmlsZS5jYyIsCi0gICAgIm11dGF0aW9uLmNjIiwKLSAgICAibXV0YXRpb25fZW50cnkuY2MiLAotICAgICJzdG9yYWdlX21vZHVsZS5jYyIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdHMiIF0KLSAgZGVwcyA9IFsgIi8vYnQvZ2Q6Z2RfZGVmYXVsdF9kZXBzIiBdCi19CmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2FkYXB0ZXJfY29uZmlnLmNjIGIvZ2Qvc3RvcmFnZS9hZGFwdGVyX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2MjBkMS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL2FkYXB0ZXJfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0b3JhZ2UvYWRhcHRlcl9jb25maWcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLUFkYXB0ZXJDb25maWc6OkFkYXB0ZXJDb25maWcoQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZywgc3RkOjpzdHJpbmcgc2VjdGlvbikKLSAgICA6IGNvbmZpZ18oY29uZmlnKSwgbWVtb3J5X29ubHlfY29uZmlnXyhtZW1vcnlfb25seV9jb25maWcpLCBzZWN0aW9uXyhzdGQ6Om1vdmUoc2VjdGlvbikpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9hZGFwdGVyX2NvbmZpZy5oIGIvZ2Qvc3RvcmFnZS9hZGFwdGVyX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjhhMzk0Li4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvYWRhcHRlcl9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImNvbW1vbi9ieXRlX2FycmF5LmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1jbGFzcyBBZGFwdGVyQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIEFkYXB0ZXJDb25maWcoQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZywgc3RkOjpzdHJpbmcgc2VjdGlvbik7Ci0KLSAgLy8gZm9yIG1vdmUKLSAgQWRhcHRlckNvbmZpZyhBZGFwdGVyQ29uZmlnJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLSAgQWRhcHRlckNvbmZpZyYgb3BlcmF0b3I9KEFkYXB0ZXJDb25maWcmJiBvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OwotCi0gIC8vIGZvciBjb3B5Ci0gIEFkYXB0ZXJDb25maWcoY29uc3QgQWRhcHRlckNvbmZpZyYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLSAgQWRhcHRlckNvbmZpZyYgb3BlcmF0b3I9KGNvbnN0IEFkYXB0ZXJDb25maWcmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0KLSAgLy8gb3BlcmF0b3JzCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZGFwdGVyQ29uZmlnJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBjb25maWdfID09IG90aGVyLmNvbmZpZ18gJiYgbWVtb3J5X29ubHlfY29uZmlnXyA9PSBvdGhlci5tZW1vcnlfb25seV9jb25maWdfICYmIHNlY3Rpb25fID09IG90aGVyLnNlY3Rpb25fOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBZGFwdGVyQ29uZmlnJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgfQotICBib29sIG9wZXJhdG9yPChjb25zdCBBZGFwdGVyQ29uZmlnJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBjb25maWdfIDwgb3RoZXIuY29uZmlnXyAmJiBtZW1vcnlfb25seV9jb25maWdfIDwgb3RoZXIubWVtb3J5X29ubHlfY29uZmlnXyAmJiBzZWN0aW9uXyA8IG90aGVyLnNlY3Rpb25fOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFkYXB0ZXJDb25maWcmIHJocykgY29uc3QgewotICAgIHJldHVybiAocmhzIDwgKnRoaXMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBZGFwdGVyQ29uZmlnJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA+IHJocyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEFkYXB0ZXJDb25maWcmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzIDwgcmhzKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQ29uZmlnQ2FjaGUqIGNvbmZpZ187Ci0gIENvbmZpZ0NhY2hlKiBtZW1vcnlfb25seV9jb25maWdfOwotICBzdGQ6OnN0cmluZyBzZWN0aW9uXzsKLQotIHB1YmxpYzoKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKEFkZHJlc3MsIGhjaTo6QWRkcmVzcywgIkFkZHJlc3MiKTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKExlSWRlbnRpdHlSZXNvbHZpbmdLZXksIGNvbW1vbjo6Qnl0ZUFycmF5PDE2PiwgIkxFX0xPQ0FMX0tFWV9JUksiKTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKExlZ2FjeVNjYW5Nb2RlLCBoY2k6OkxlZ2FjeVNjYW5Nb2RlLCAiU2Nhbk1vZGUiKTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKERpc2NvdmVyeVRpbWVvdXRTZWNvbmRzLCBpbnQsICJEaXNjb3ZlcnlUaW1lb3V0Iik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvYWRhcHRlcl9jb25maWdfdGVzdC5jYyBiL2dkL3N0b3JhZ2UvYWRhcHRlcl9jb25maWdfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjMzc5MS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL2FkYXB0ZXJfY29uZmlnX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic3RvcmFnZS9hZGFwdGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbXV0YXRpb24uaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkJ5dGVBcnJheTsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkRldmljZVR5cGU7Ci11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6OkFkYXB0ZXJDb25maWc7Ci11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6OkNvbmZpZ0NhY2hlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpEZXZpY2U7Ci11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6Ok11dGF0aW9uOwotdXNpbmcgOjp0ZXN0aW5nOjpFcTsKLXVzaW5nIDo6dGVzdGluZzo6T3B0aW9uYWw7Ci0KLVRFU1QoQWRhcHRlckNvbmZpZ1Rlc3QsIGNyZWF0ZV9uZXdfYWRhcHRlcl9jb25maWcpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZygxMCwge30pOwotICBBZGFwdGVyQ29uZmlnIGFkYXB0ZXJfY29uZmlnKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsICJBZGFwdGVyIik7Ci0gIEFTU0VSVF9GQUxTRShhZGFwdGVyX2NvbmZpZy5HZXRBZGRyZXNzKCkpOwotfQotCi1URVNUKEFkYXB0ZXJDb25maWdUZXN0LCBzZXRfcHJvcGVydHkpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZygxMCwge30pOwotICBBZGRyZXNzIGFkZHJlc3MgPSB7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgQWRhcHRlckNvbmZpZyBhZGFwdGVyX2NvbmZpZygmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCAiQWRhcHRlciIpOwotICBBU1NFUlRfRkFMU0UoYWRhcHRlcl9jb25maWcuR2V0QWRkcmVzcygpKTsKLSAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gIG11dGF0aW9uLkFkZChhZGFwdGVyX2NvbmZpZy5TZXRBZGRyZXNzKGFkZHJlc3MpKTsKLSAgbXV0YXRpb24uQ29tbWl0KCk7Ci0gIEFTU0VSVF9USEFUKGFkYXB0ZXJfY29uZmlnLkdldEFkZHJlc3MoKSwgT3B0aW9uYWwoRXEoYWRkcmVzcykpKTsKLX0KLQotVEVTVChBZGFwdGVyQ29uZmlnVGVzdCwgZXF1YWxpdHlfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwLCB7fSk7Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIGFkZHJlc3MgPSB7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgQWRhcHRlckNvbmZpZyBhZGFwdGVyX2NvbmZpZ18xKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsICJBZGFwdGVyIik7Ci0gIEFkYXB0ZXJDb25maWcgYWRhcHRlcl9jb25maWdfMigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCAiQWRhcHRlciIpOwotICBBU1NFUlRfRVEoYWRhcHRlcl9jb25maWdfMSwgYWRhcHRlcl9jb25maWdfMik7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZ18yKDEwLCB7fSk7Ci0gIEFkYXB0ZXJDb25maWcgYWRhcHRlcl9jb25maWdfMygmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnXzIsICJBZGFwdGVyIik7Ci0gIEFTU0VSVF9ORShhZGFwdGVyX2NvbmZpZ18xLCBhZGFwdGVyX2NvbmZpZ18zKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9jbGFzc2ljX2RldmljZS5jYyBiL2dkL3N0b3JhZ2UvY2xhc3NpY19kZXZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWFiZDYuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jbGFzc2ljX2RldmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdG9yYWdlL2NsYXNzaWNfZGV2aWNlLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjb21tb24vc3RyaW5ncy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nX3ZpZXc+IENsYXNzaWNEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyA9IHsiTGlua0tleSJ9OwotCi1DbGFzc2ljRGV2aWNlOjpDbGFzc2ljRGV2aWNlKENvbmZpZ0NhY2hlKiBjb25maWcsIENvbmZpZ0NhY2hlKiBtZW1vcnlfb25seV9jb25maWcsIHN0ZDo6c3RyaW5nIHNlY3Rpb24pCi0gICAgOiBjb25maWdfKGNvbmZpZyksIG1lbW9yeV9vbmx5X2NvbmZpZ18obWVtb3J5X29ubHlfY29uZmlnKSwgc2VjdGlvbl8oc3RkOjptb3ZlKHNlY3Rpb24pKSB7fQotCi1EZXZpY2UgQ2xhc3NpY0RldmljZTo6UGFyZW50KCkgewotICByZXR1cm4gRGV2aWNlKGNvbmZpZ18sIG1lbW9yeV9vbmx5X2NvbmZpZ18sIHNlY3Rpb25fKTsKLX0KLQotc3RkOjpzdHJpbmcgQ2xhc3NpY0RldmljZTo6VG9Mb2dTdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBzZWN0aW9uXzsKLX0KLQotaGNpOjpBZGRyZXNzIENsYXNzaWNEZXZpY2U6OkdldEFkZHJlc3MoKSBjb25zdCB7Ci0gIC8vIHNlY3Rpb24gbmFtZSBvZiBhIGNsYXNzaWMgZGV2aWNlIGlzIGl0cyBNQUMgYWRkcmVzcwotICBhdXRvIGFkZHIgPSBoY2k6OkFkZHJlc3M6OkZyb21TdHJpbmcoc2VjdGlvbl8pOwotICBBU1NFUlQoYWRkci5oYXNfdmFsdWUoKSk7Ci0gIHJldHVybiBzdGQ6Om1vdmUoYWRkci52YWx1ZSgpKTsKLX0KLQotYm9vbCBDbGFzc2ljRGV2aWNlOjpJc1BhaXJlZCgpIGNvbnN0IHsKLSAgLy8gVGhpcyBmaXJzdCBjaGVjayBpcyBoZXJlIG9ubHkgdG8gc3BlZWQgdXAgdGhlIGNoZWNraW5nIHByb2Nlc3MKLSAgaWYgKCFjb25maWdfLT5Jc1BlcnNpc3RlbnRTZWN0aW9uKHNlY3Rpb25fKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gY29uZmlnXy0+SGFzQXRMZWFzdE9uZU1hdGNoaW5nUHJvcGVydGllc0luU2VjdGlvbihzZWN0aW9uXywga0xpbmtLZXlQcm9wZXJ0aWVzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2NsYXNzaWNfZGV2aWNlLmggYi9nZC9zdG9yYWdlL2NsYXNzaWNfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTg3NDMuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jbGFzc2ljX2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiaGNpL2xpbmtfa2V5LmgiCi0jaW5jbHVkZSAiaGNpL3V1aWQuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlX2hlbHBlci5oIgotI2luY2x1ZGUgInN0b3JhZ2UvZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1jbGFzcyBDbGFzc2ljRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIENsYXNzaWNEZXZpY2UoQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZywgc3RkOjpzdHJpbmcgc2VjdGlvbik7Ci0KLSAgLy8gZm9yIG1vdmUKLSAgQ2xhc3NpY0RldmljZShDbGFzc2ljRGV2aWNlJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLSAgQ2xhc3NpY0RldmljZSYgb3BlcmF0b3I9KENsYXNzaWNEZXZpY2UmJiBvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OwotCi0gIC8vIGZvciBjb3B5Ci0gIENsYXNzaWNEZXZpY2UoY29uc3QgQ2xhc3NpY0RldmljZSYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLSAgQ2xhc3NpY0RldmljZSYgb3BlcmF0b3I9KGNvbnN0IENsYXNzaWNEZXZpY2UmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0KLSAgLy8gb3BlcmF0b3JzCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDbGFzc2ljRGV2aWNlJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBjb25maWdfID09IG90aGVyLmNvbmZpZ18gJiYgbWVtb3J5X29ubHlfY29uZmlnXyA9PSBvdGhlci5tZW1vcnlfb25seV9jb25maWdfICYmIHNlY3Rpb25fID09IG90aGVyLnNlY3Rpb25fOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDbGFzc2ljRGV2aWNlJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgfQotICBib29sIG9wZXJhdG9yPChjb25zdCBDbGFzc2ljRGV2aWNlJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBjb25maWdfIDwgb3RoZXIuY29uZmlnXyAmJiBtZW1vcnlfb25seV9jb25maWdfIDwgb3RoZXIubWVtb3J5X29ubHlfY29uZmlnXyAmJiBzZWN0aW9uXyA8IG90aGVyLnNlY3Rpb25fOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IENsYXNzaWNEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiAocmhzIDwgKnRoaXMpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDbGFzc2ljRGV2aWNlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA+IHJocyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IENsYXNzaWNEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzIDwgcmhzKTsKLSAgfQotCi0gIC8vIEdldCB0aGUgcGFyZW50IGRldmljZQotICBEZXZpY2UgUGFyZW50KCk7Ci0KLSAgLy8gRm9yIGxvZ2dpbmcgcHVycG9zZSBvbmx5LCB5b3UgY2FuJ3QgZ2V0IGEgQ2xhc3NpY0RldmljZSBvYmplY3QgZnJvbSBwYXJzaW5nIGEgc3RkOjpzdHJpbmcKLSAgc3RkOjpzdHJpbmcgVG9Mb2dTdHJpbmcoKSBjb25zdDsKLQotICAvLyBHZXQgYWRkcmVzcyBvZiB0aGlzIGNsYXNzaWMgZGV2aWNlLCBpdCBtdXN0IGV4aXN0Ci0gIGhjaTo6QWRkcmVzcyBHZXRBZGRyZXNzKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJuIHRydWUgaWYgZGV2aWNlIGhhcyBhIGxpbmsga2V5IGluIG9uZSBvZiB8a0xpbmtLZXlQcm9wZXJ0aWVzfAotICBib29sIElzUGFpcmVkKCkgY29uc3Q7Ci0KLSAgLy8gUHJvcGVydHkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIGEgbGluayBrZXkgdXNlZCBpbiBCbHVldG9vdGggY2xhc3NpYyBkZXZpY2UKLSAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZ192aWV3PiBrTGlua0tleVByb3BlcnRpZXM7Ci0KLSBwcml2YXRlOgotICBDb25maWdDYWNoZSogY29uZmlnXzsKLSAgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZ187Ci0gIHN0ZDo6c3RyaW5nIHNlY3Rpb25fOwotICBmcmllbmQgc3RkOjpoYXNoPENsYXNzaWNEZXZpY2U+OwotCi0gcHVibGljOgotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoTGlua0tleSwgaGNpOjpMaW5rS2V5LCAiTGlua0tleSIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoTGlua0tleVR5cGUsIGhjaTo6S2V5VHlwZSwgIkxpbmtLZXlUeXBlIik7Ci0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihTZXJ2aWNlVXVpZHMsIHN0ZDo6dmVjdG9yPGhjaTo6VXVpZD4sICJTZXJ2aWNlIik7Ci0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihTZHBEaU1hbnVmYWN0dXJlciwgdWludDE2X3QsICJTZHBEaU1hbnVmYWN0dXJlciIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoU2RwRGlNb2RlbCwgdWludDE2X3QsICJTZHBEaU1vZGVsIik7Ci0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihTZHBEaUhhcmR3YXJlVmVyc2lvbiwgdWludDE2X3QsICJTZHBEaUhhcmR3YXJlVmVyc2lvbiIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoU2RwRGlWZW5kb3JJZFNvdXJjZSwgdWludDE2X3QsICJTZHBEaVZlbmRvcklkU291cmNlIik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2Ugc3RkIHsKLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgaGFzaDxibHVldG9vdGg6OnN0b3JhZ2U6OkNsYXNzaWNEZXZpY2U+IHsKLSAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBibHVldG9vdGg6OnN0b3JhZ2U6OkNsYXNzaWNEZXZpY2UmIHZhbCkgY29uc3Qgbm9leGNlcHQgewotICAgIHN0ZDo6c2l6ZV90IHBvaW50ZXJfaGFzaF8xID0gc3RkOjpoYXNoPGJsdWV0b290aDo6c3RvcmFnZTo6Q29uZmlnQ2FjaGUqPnt9KHZhbC5jb25maWdfKTsKLSAgICBzdGQ6OnNpemVfdCBwb2ludGVyX2hhc2hfMiA9IHN0ZDo6aGFzaDxibHVldG9vdGg6OnN0b3JhZ2U6OkNvbmZpZ0NhY2hlKj57fSh2YWwuY29uZmlnXyk7Ci0gICAgc3RkOjpzaXplX3QgYWRkcl9oYXNoID0gc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPnt9KHZhbC5zZWN0aW9uXyk7Ci0gICAgcmV0dXJuIGFkZHJfaGFzaCBeIChwb2ludGVyX2hhc2hfMSA8PCAxKSBeIChwb2ludGVyX2hhc2hfMiA8PCAyKTsKLSAgfQotfTsKLX0gIC8vIG5hbWVzcGFjZSBzdGQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2NsYXNzaWNfZGV2aWNlX3Rlc3QuY2MgYi9nZC9zdG9yYWdlL2NsYXNzaWNfZGV2aWNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWVlNzkuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jbGFzc2ljX2RldmljZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9ieXRlX2FycmF5LmgiCi0jaW5jbHVkZSAiaGNpL2xpbmtfa2V5LmgiCi0jaW5jbHVkZSAic3RvcmFnZS9jbGFzc2ljX2RldmljZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbXV0YXRpb24uaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkJ5dGVBcnJheTsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkRldmljZVR5cGU7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6a0V4YW1wbGVMaW5rS2V5OwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpDbGFzc2ljRGV2aWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpNdXRhdGlvbjsKLXVzaW5nIDo6dGVzdGluZzo6RXE7Ci11c2luZyA6OnRlc3Rpbmc6Ok9wdGlvbmFsOwotCi1URVNUKENsYXNzaWNEZXZpY2VUZXN0LCBjcmVhdGVfbmV3X2xlX2RldmljZSkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwLCB7fSk7Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIGFkZHJlc3MgPSB7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgQ2xhc3NpY0RldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5HZXRMaW5rS2V5KCkpOwotfQotCi1URVNUKENsYXNzaWNEZXZpY2VUZXN0LCBzZXRfcHJvcGVydHkpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZygxMCwge30pOwotICBBZGRyZXNzIGFkZHJlc3MgPSB7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgQ2xhc3NpY0RldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5HZXRMaW5rS2V5KCkpOwotICBNdXRhdGlvbiBtdXRhdGlvbigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnKTsKLSAgbXV0YXRpb24uQWRkKGRldmljZS5TZXRMaW5rS2V5KGtFeGFtcGxlTGlua0tleSkpOwotICBtdXRhdGlvbi5Db21taXQoKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlLkdldExpbmtLZXkoKSwgT3B0aW9uYWwoRXEoa0V4YW1wbGVMaW5rS2V5KSkpOwotfQotCi1URVNUKENsYXNzaWNEZXZpY2VUZXN0LCBlcXVhbGl0eV90ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBDbGFzc2ljRGV2aWNlIGRldmljZTEoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgQ2xhc3NpY0RldmljZSBkZXZpY2UyKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MuVG9TdHJpbmcoKSk7Ci0gIEFTU0VSVF9FUShkZXZpY2UxLCBkZXZpY2UyKTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzczMgPSB7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDd9fTsKLSAgQ2xhc3NpY0RldmljZSBkZXZpY2UzKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MzLlRvU3RyaW5nKCkpOwotICBBU1NFUlRfTkUoZGV2aWNlMSwgZGV2aWNlMyk7Ci19Ci0KZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvY29uZmlnX2NhY2hlLmNjIGIvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZGMxYmQuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlLmgiCi0KLSNpbmNsdWRlIDxpb3M+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiaGNpL2VudW1faGVscGVyLmgiCi0jaW5jbHVkZSAib3MvcGFyYW1ldGVyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbi5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmdfdmlldz4ga0VuY3J5cHRLZXlOYW1lTGlzdCA9IHsKLSAgICAiTGlua0tleSIsICJMRV9LRVlfUEVOQyIsICJMRV9LRVlfUElEIiwgIkxFX0tFWV9MSUQiLCAiTEVfS0VZX1BDU1JLIiwgIkxFX0tFWV9MRU5DIiwgIkxFX0tFWV9MQ1NSSyJ9OwotCi1ib29sIFRyaW1BZnRlck5ld0xpbmUoc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHN0ZDo6c3RyaW5nIHZhbHVlX25vX25ld2xpbmU7Ci0gIHNpemVfdCBuZXdsaW5lX3Bvc2l0aW9uID0gdmFsdWUuZmluZF9maXJzdF9vZignXG4nKTsKLSAgaWYgKG5ld2xpbmVfcG9zaXRpb24gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICB2YWx1ZS5lcmFzZShuZXdsaW5lX3Bvc2l0aW9uKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSW5FbmNyeXB0S2V5TmFtZUxpc3Qoc3RkOjpzdHJpbmcga2V5KSB7Ci0gIHJldHVybiBrRW5jcnlwdEtleU5hbWVMaXN0LmZpbmQoa2V5KSAhPSBrRW5jcnlwdEtleU5hbWVMaXN0LmVuZCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLWNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZ192aWV3PiBrTGVQcm9wZXJ0eU5hbWVzID0gewotICAgICJMRV9LRVlfUEVOQyIsICJMRV9LRVlfUElEIiwgIkxFX0tFWV9QQ1NSSyIsICJMRV9LRVlfTEVOQyIsICJMRV9LRVlfTENTUksifTsKLQotY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nX3ZpZXc+IGtDbGFzc2ljUHJvcGVydHlOYW1lcyA9IHsKLSAgICAiTGlua0tleSIsICJTZHBEaU1hdWZhY3R1cmVyIiwgIlNkcERpTW9kZWwiLCAiU2RwRGlIYXJkd2FyZVZlcnNpb24iLCAiU2RwRGlWZW5kb3JTb3VyY2UifTsKLQotY29uc3Qgc3RkOjpzdHJpbmcgQ29uZmlnQ2FjaGU6OmtEZWZhdWx0U2VjdGlvbk5hbWUgPSAiR2xvYmFsIjsKLQotc3RkOjpzdHJpbmcga0VuY3J5cHRlZFN0ciA9ICJlbmNyeXB0ZWQiOwotCi1Db25maWdDYWNoZTo6Q29uZmlnQ2FjaGUoc2l6ZV90IHRlbXBfZGV2aWNlX2NhcGFjaXR5LCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmdfdmlldz4gcGVyc2lzdGVudF9wcm9wZXJ0eV9uYW1lcykKLSAgICA6IHBlcnNpc3RlbnRfcHJvcGVydHlfbmFtZXNfKHN0ZDo6bW92ZShwZXJzaXN0ZW50X3Byb3BlcnR5X25hbWVzKSksCi0gICAgICBpbmZvcm1hdGlvbl9zZWN0aW9uc18oKSwKLSAgICAgIHBlcnNpc3RlbnRfZGV2aWNlc18oKSwKLSAgICAgIHRlbXBvcmFyeV9kZXZpY2VzXyh0ZW1wX2RldmljZV9jYXBhY2l0eSkge30KLQotdm9pZCBDb25maWdDYWNoZTo6U2V0UGVyc2lzdGVudENvbmZpZ0NoYW5nZWRDYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFjaykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFja18gPSBzdGQ6Om1vdmUocGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFjayk7Ci19Ci0KLUNvbmZpZ0NhY2hlOjpDb25maWdDYWNoZShDb25maWdDYWNoZSYmIG90aGVyKSBub2V4Y2VwdAotICAgIDogcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFja18oc3RkOjptb3ZlKG90aGVyLnBlcnNpc3RlbnRfY29uZmlnX2NoYW5nZWRfY2FsbGJhY2tfKSksCi0gICAgICBwZXJzaXN0ZW50X3Byb3BlcnR5X25hbWVzXyhzdGQ6Om1vdmUob3RoZXIucGVyc2lzdGVudF9wcm9wZXJ0eV9uYW1lc18pKSwKLSAgICAgIGluZm9ybWF0aW9uX3NlY3Rpb25zXyhzdGQ6Om1vdmUob3RoZXIuaW5mb3JtYXRpb25fc2VjdGlvbnNfKSksCi0gICAgICBwZXJzaXN0ZW50X2RldmljZXNfKHN0ZDo6bW92ZShvdGhlci5wZXJzaXN0ZW50X2RldmljZXNfKSksCi0gICAgICB0ZW1wb3JhcnlfZGV2aWNlc18oc3RkOjptb3ZlKG90aGVyLnRlbXBvcmFyeV9kZXZpY2VzXykpIHsKLSAgLy8gc3RkOjpmdW5jdGlvbiB3aWxsIGJlIGluIGEgdmFsaWQgYnV0IHVuc3BlY2lmaWVkIHN0YXRlIGFmdGVyIHN0ZDo6bW92ZSgpLCBoZW5jZSByZXNldHRpbmcgaXQKLSAgb3RoZXIucGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFja18gPSB7fTsKLX0KLQotQ29uZmlnQ2FjaGUmIENvbmZpZ0NhY2hlOjpvcGVyYXRvcj0oQ29uZmlnQ2FjaGUmJiBvdGhlcikgbm9leGNlcHQgewotICBpZiAoJm90aGVyID09IHRoaXMpIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBteV9sb2NrKG11dGV4Xyk7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gb3RoZXJzX2xvY2sob3RoZXIubXV0ZXhfKTsKLSAgcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFja18uc3dhcChvdGhlci5wZXJzaXN0ZW50X2NvbmZpZ19jaGFuZ2VkX2NhbGxiYWNrXyk7Ci0gIG90aGVyLnBlcnNpc3RlbnRfY29uZmlnX2NoYW5nZWRfY2FsbGJhY2tfID0ge307Ci0gIHBlcnNpc3RlbnRfcHJvcGVydHlfbmFtZXNfID0gc3RkOjptb3ZlKG90aGVyLnBlcnNpc3RlbnRfcHJvcGVydHlfbmFtZXNfKTsKLSAgaW5mb3JtYXRpb25fc2VjdGlvbnNfID0gc3RkOjptb3ZlKG90aGVyLmluZm9ybWF0aW9uX3NlY3Rpb25zXyk7Ci0gIHBlcnNpc3RlbnRfZGV2aWNlc18gPSBzdGQ6Om1vdmUob3RoZXIucGVyc2lzdGVudF9kZXZpY2VzXyk7Ci0gIHRlbXBvcmFyeV9kZXZpY2VzXyA9IHN0ZDo6bW92ZShvdGhlci50ZW1wb3JhcnlfZGV2aWNlc18pOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWJvb2wgQ29uZmlnQ2FjaGU6Om9wZXJhdG9yPT0oY29uc3QgQ29uZmlnQ2FjaGUmIHJocykgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IG15X2xvY2sobXV0ZXhfKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBvdGhlcnNfbG9jayhyaHMubXV0ZXhfKTsKLSAgcmV0dXJuIHBlcnNpc3RlbnRfcHJvcGVydHlfbmFtZXNfID09IHJocy5wZXJzaXN0ZW50X3Byb3BlcnR5X25hbWVzXyAmJgotICAgICAgICAgaW5mb3JtYXRpb25fc2VjdGlvbnNfID09IHJocy5pbmZvcm1hdGlvbl9zZWN0aW9uc18gJiYgcGVyc2lzdGVudF9kZXZpY2VzXyA9PSByaHMucGVyc2lzdGVudF9kZXZpY2VzXyAmJgotICAgICAgICAgdGVtcG9yYXJ5X2RldmljZXNfID09IHJocy50ZW1wb3JhcnlfZGV2aWNlc187Ci19Ci0KLWJvb2wgQ29uZmlnQ2FjaGU6Om9wZXJhdG9yIT0oY29uc3QgQ29uZmlnQ2FjaGUmIHJocykgY29uc3QgewotICByZXR1cm4gISgqdGhpcyA9PSByaHMpOwotfQotCi12b2lkIENvbmZpZ0NhY2hlOjpDbGVhcigpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGlmIChpbmZvcm1hdGlvbl9zZWN0aW9uc18uc2l6ZSgpID4gMCkgewotICAgIGluZm9ybWF0aW9uX3NlY3Rpb25zXy5jbGVhcigpOwotICAgIFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soKTsKLSAgfQotICBpZiAocGVyc2lzdGVudF9kZXZpY2VzXy5zaXplKCkgPiAwKSB7Ci0gICAgcGVyc2lzdGVudF9kZXZpY2VzXy5jbGVhcigpOwotICAgIFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soKTsKLSAgfQotICBpZiAodGVtcG9yYXJ5X2RldmljZXNfLnNpemUoKSA+IDApIHsKLSAgICB0ZW1wb3JhcnlfZGV2aWNlc18uY2xlYXIoKTsKLSAgfQotfQotCi1ib29sIENvbmZpZ0NhY2hlOjpIYXNTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICByZXR1cm4gaW5mb3JtYXRpb25fc2VjdGlvbnNfLmNvbnRhaW5zKHNlY3Rpb24pIHx8IHBlcnNpc3RlbnRfZGV2aWNlc18uY29udGFpbnMoc2VjdGlvbikgfHwKLSAgICAgICAgIHRlbXBvcmFyeV9kZXZpY2VzXy5jb250YWlucyhzZWN0aW9uKTsKLX0KLQotYm9vbCBDb25maWdDYWNoZTo6SGFzUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgYXV0byBzZWN0aW9uX2l0ZXIgPSBpbmZvcm1hdGlvbl9zZWN0aW9uc18uZmluZChzZWN0aW9uKTsKLSAgaWYgKHNlY3Rpb25faXRlciAhPSBpbmZvcm1hdGlvbl9zZWN0aW9uc18uZW5kKCkpIHsKLSAgICByZXR1cm4gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZmluZChwcm9wZXJ0eSkgIT0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gIH0KLSAgc2VjdGlvbl9pdGVyID0gcGVyc2lzdGVudF9kZXZpY2VzXy5maW5kKHNlY3Rpb24pOwotICBpZiAoc2VjdGlvbl9pdGVyICE9IHBlcnNpc3RlbnRfZGV2aWNlc18uZW5kKCkpIHsKLSAgICByZXR1cm4gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZmluZChwcm9wZXJ0eSkgIT0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gIH0KLSAgc2VjdGlvbl9pdGVyID0gdGVtcG9yYXJ5X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgIT0gdGVtcG9yYXJ5X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgcmV0dXJuIHNlY3Rpb25faXRlci0+c2Vjb25kLmZpbmQocHJvcGVydHkpICE9IHNlY3Rpb25faXRlci0+c2Vjb25kLmVuZCgpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gQ29uZmlnQ2FjaGU6OkdldFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGF1dG8gc2VjdGlvbl9pdGVyID0gaW5mb3JtYXRpb25fc2VjdGlvbnNfLmZpbmQoc2VjdGlvbik7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgIT0gaW5mb3JtYXRpb25fc2VjdGlvbnNfLmVuZCgpKSB7Ci0gICAgYXV0byBwcm9wZXJ0eV9pdGVyID0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZmluZChwcm9wZXJ0eSk7Ci0gICAgaWYgKHByb3BlcnR5X2l0ZXIgIT0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZW5kKCkpIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eV9pdGVyLT5zZWNvbmQ7Ci0gICAgfQotICB9Ci0gIHNlY3Rpb25faXRlciA9IHBlcnNpc3RlbnRfZGV2aWNlc18uZmluZChzZWN0aW9uKTsKLSAgaWYgKHNlY3Rpb25faXRlciAhPSBwZXJzaXN0ZW50X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgYXV0byBwcm9wZXJ0eV9pdGVyID0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZmluZChwcm9wZXJ0eSk7Ci0gICAgaWYgKHByb3BlcnR5X2l0ZXIgIT0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZW5kKCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gcHJvcGVydHlfaXRlci0+c2Vjb25kOwotICAgICAgaWYgKG9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpICE9IG51bGxwdHIgJiYgdmFsdWUgPT0ga0VuY3J5cHRlZFN0cikgewotICAgICAgICByZXR1cm4gb3M6OlBhcmFtZXRlclByb3ZpZGVyOjpHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCktPmdldF9rZXkoc2VjdGlvbiArICItIiArIHByb3BlcnR5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gIH0KLSAgc2VjdGlvbl9pdGVyID0gdGVtcG9yYXJ5X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgIT0gdGVtcG9yYXJ5X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgYXV0byBwcm9wZXJ0eV9pdGVyID0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZmluZChwcm9wZXJ0eSk7Ci0gICAgaWYgKHByb3BlcnR5X2l0ZXIgIT0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZW5kKCkpIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eV9pdGVyLT5zZWNvbmQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci19Ci0KLXZvaWQgQ29uZmlnQ2FjaGU6OlNldFByb3BlcnR5KHN0ZDo6c3RyaW5nIHNlY3Rpb24sIHN0ZDo6c3RyaW5nIHByb3BlcnR5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgaWYgKFRyaW1BZnRlck5ld0xpbmUoc2VjdGlvbikgfHwgVHJpbUFmdGVyTmV3TGluZShwcm9wZXJ0eSkgfHwgVHJpbUFmdGVyTmV3TGluZSh2YWx1ZSkpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcwODA4MjczIik7Ci0gIH0KLSAgQVNTRVJUX0xPRyghc2VjdGlvbi5lbXB0eSgpLCAiRW1wdHkgc2VjdGlvbiBuYW1lIG5vdCBhbGxvd2VkIik7Ci0gIEFTU0VSVF9MT0coIXByb3BlcnR5LmVtcHR5KCksICJFbXB0eSBwcm9wZXJ0eSBuYW1lIG5vdCBhbGxvd2VkIik7Ci0gIGlmICghSXNEZXZpY2VTZWN0aW9uKHNlY3Rpb24pKSB7Ci0gICAgYXV0byBzZWN0aW9uX2l0ZXIgPSBpbmZvcm1hdGlvbl9zZWN0aW9uc18uZmluZChzZWN0aW9uKTsKLSAgICBpZiAoc2VjdGlvbl9pdGVyID09IGluZm9ybWF0aW9uX3NlY3Rpb25zXy5lbmQoKSkgewotICAgICAgc2VjdGlvbl9pdGVyID0gaW5mb3JtYXRpb25fc2VjdGlvbnNfLnRyeV9lbXBsYWNlX2JhY2soc2VjdGlvbiwgY29tbW9uOjpMaXN0TWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz57fSkuZmlyc3Q7Ci0gICAgfQotICAgIHNlY3Rpb25faXRlci0+c2Vjb25kLmluc2VydF9vcl9hc3NpZ24ocHJvcGVydHksIHN0ZDo6bW92ZSh2YWx1ZSkpOwotICAgIFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBzZWN0aW9uX2l0ZXIgPSBwZXJzaXN0ZW50X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgPT0gcGVyc2lzdGVudF9kZXZpY2VzXy5lbmQoKSAmJiBJc1BlcnNpc3RlbnRQcm9wZXJ0eShwcm9wZXJ0eSkpIHsKLSAgICAvLyBtb3ZlIHBhaXJlZCBkZXZpY2VzIG9yIGNyZWF0ZSBuZXcgcGFpcmVkIGRldmljZSB3aGVuIGEgbGluayBrZXkgaXMgc2V0Ci0gICAgYXV0byBzZWN0aW9uX3Byb3BlcnRpZXMgPSB0ZW1wb3JhcnlfZGV2aWNlc18uZXh0cmFjdChzZWN0aW9uKTsKLSAgICBpZiAoc2VjdGlvbl9wcm9wZXJ0aWVzKSB7Ci0gICAgICBzZWN0aW9uX2l0ZXIgPSBwZXJzaXN0ZW50X2RldmljZXNfLnRyeV9lbXBsYWNlX2JhY2soc2VjdGlvbiwgc3RkOjptb3ZlKHNlY3Rpb25fcHJvcGVydGllcy0+c2Vjb25kKSkuZmlyc3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlY3Rpb25faXRlciA9IHBlcnNpc3RlbnRfZGV2aWNlc18udHJ5X2VtcGxhY2VfYmFjayhzZWN0aW9uLCBjb21tb246Okxpc3RNYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPnt9KS5maXJzdDsKLSAgICB9Ci0gIH0KLSAgaWYgKHNlY3Rpb25faXRlciAhPSBwZXJzaXN0ZW50X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgYm9vbCBpc19lbmNyeXB0ZWQgPSB2YWx1ZSA9PSBrRW5jcnlwdGVkU3RyOwotICAgIGlmICgoIXZhbHVlLmVtcHR5KCkpICYmIG9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpICE9IG51bGxwdHIgJiYKLSAgICAgICAgb3M6OlBhcmFtZXRlclByb3ZpZGVyOjpJc0NvbW1vbkNyaXRlcmlhTW9kZSgpICYmIEluRW5jcnlwdEtleU5hbWVMaXN0KHByb3BlcnR5KSAmJiAhaXNfZW5jcnlwdGVkKSB7Ci0gICAgICBpZiAob3M6OlBhcmFtZXRlclByb3ZpZGVyOjpHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCktPnNldF9lbmNyeXB0X2tleV9vcl9yZW1vdmVfa2V5KAotICAgICAgICAgICAgICBzZWN0aW9uICsgIi0iICsgcHJvcGVydHksIHZhbHVlKSkgewotICAgICAgICB2YWx1ZSA9IGtFbmNyeXB0ZWRTdHI7Ci0gICAgICB9Ci0gICAgfQotICAgIHNlY3Rpb25faXRlci0+c2Vjb25kLmluc2VydF9vcl9hc3NpZ24ocHJvcGVydHksIHN0ZDo6bW92ZSh2YWx1ZSkpOwotICAgIFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2VjdGlvbl9pdGVyID0gdGVtcG9yYXJ5X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgPT0gdGVtcG9yYXJ5X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgYXV0byB0cmlwbGUgPSB0ZW1wb3JhcnlfZGV2aWNlc18udHJ5X2VtcGxhY2Uoc2VjdGlvbiwgY29tbW9uOjpMaXN0TWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz57fSk7Ci0gICAgc2VjdGlvbl9pdGVyID0gc3RkOjpnZXQ8MD4odHJpcGxlKTsKLSAgfQotICBzZWN0aW9uX2l0ZXItPnNlY29uZC5pbnNlcnRfb3JfYXNzaWduKHByb3BlcnR5LCBzdGQ6Om1vdmUodmFsdWUpKTsKLX0KLQotYm9vbCBDb25maWdDYWNoZTo6UmVtb3ZlU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgLy8gc2VjdGlvbnMgYXJlIHVuaXF1ZSBhbW9uZyBhbGwgdGhyZWUgbWFwcywgaGVuY2UgcmVtb3ZpbmcgZnJvbSBvbmUgb2YgdGhlbSBpcyBlbm91Z2gKLSAgaWYgKGluZm9ybWF0aW9uX3NlY3Rpb25zXy5leHRyYWN0KHNlY3Rpb24pIHx8IHBlcnNpc3RlbnRfZGV2aWNlc18uZXh0cmFjdChzZWN0aW9uKSkgewotICAgIFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdGVtcG9yYXJ5X2RldmljZXNfLmV4dHJhY3Qoc2VjdGlvbikuaGFzX3ZhbHVlKCk7Ci0gIH0KLX0KLQotYm9vbCBDb25maWdDYWNoZTo6UmVtb3ZlUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgYXV0byBzZWN0aW9uX2l0ZXIgPSBpbmZvcm1hdGlvbl9zZWN0aW9uc18uZmluZChzZWN0aW9uKTsKLSAgaWYgKHNlY3Rpb25faXRlciAhPSBpbmZvcm1hdGlvbl9zZWN0aW9uc18uZW5kKCkpIHsKLSAgICBhdXRvIHZhbHVlID0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZXh0cmFjdChwcm9wZXJ0eSk7Ci0gICAgLy8gaWYgc2VjdGlvbiBpcyBlbXB0eSBhZnRlciByZW1vdmFsLCByZW1vdmUgdGhlIHdob2xlIHNlY3Rpb24gYXMgZW1wdHkgc2VjdGlvbiBpcyBub3QgYWxsb3dlZAotICAgIGlmIChzZWN0aW9uX2l0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgewotICAgICAgaW5mb3JtYXRpb25fc2VjdGlvbnNfLmVyYXNlKHNlY3Rpb25faXRlcik7Ci0gICAgfQotICAgIGlmICh2YWx1ZS5oYXNfdmFsdWUoKSkgewotICAgICAgUGVyc2lzdGVudENvbmZpZ0NoYW5nZWRDYWxsYmFjaygpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgc2VjdGlvbl9pdGVyID0gcGVyc2lzdGVudF9kZXZpY2VzXy5maW5kKHNlY3Rpb24pOwotICBpZiAoc2VjdGlvbl9pdGVyICE9IHBlcnNpc3RlbnRfZGV2aWNlc18uZW5kKCkpIHsKLSAgICBhdXRvIHZhbHVlID0gc2VjdGlvbl9pdGVyLT5zZWNvbmQuZXh0cmFjdChwcm9wZXJ0eSk7Ci0gICAgLy8gaWYgc2VjdGlvbiBpcyBlbXB0eSBhZnRlciByZW1vdmFsLCByZW1vdmUgdGhlIHdob2xlIHNlY3Rpb24gYXMgZW1wdHkgc2VjdGlvbiBpcyBub3QgYWxsb3dlZAotICAgIGlmIChzZWN0aW9uX2l0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgewotICAgICAgcGVyc2lzdGVudF9kZXZpY2VzXy5lcmFzZShzZWN0aW9uX2l0ZXIpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgSXNQZXJzaXN0ZW50UHJvcGVydHkocHJvcGVydHkpKSB7Ci0gICAgICAvLyBtb3ZlIHVucGFpcmVkIGRldmljZQotICAgICAgYXV0byBzZWN0aW9uX3Byb3BlcnRpZXMgPSBwZXJzaXN0ZW50X2RldmljZXNfLmV4dHJhY3Qoc2VjdGlvbik7Ci0gICAgICB0ZW1wb3JhcnlfZGV2aWNlc18uaW5zZXJ0X29yX2Fzc2lnbihzZWN0aW9uLCBzdGQ6Om1vdmUoc2VjdGlvbl9wcm9wZXJ0aWVzLT5zZWNvbmQpKTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlLmhhc192YWx1ZSgpKSB7Ci0gICAgICBQZXJzaXN0ZW50Q29uZmlnQ2hhbmdlZENhbGxiYWNrKCk7Ci0gICAgICBpZiAob3M6OlBhcmFtZXRlclByb3ZpZGVyOjpHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCkgIT0gbnVsbHB0ciAmJiBvczo6UGFyYW1ldGVyUHJvdmlkZXI6OklzQ29tbW9uQ3JpdGVyaWFNb2RlKCkgJiYKLSAgICAgICAgICBJbkVuY3J5cHRLZXlOYW1lTGlzdChwcm9wZXJ0eSkpIHsKLSAgICAgICAgb3M6OlBhcmFtZXRlclByb3ZpZGVyOjpHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCktPnNldF9lbmNyeXB0X2tleV9vcl9yZW1vdmVfa2V5KHNlY3Rpb24gKyAiLSIgKyBwcm9wZXJ0eSwgIiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgc2VjdGlvbl9pdGVyID0gdGVtcG9yYXJ5X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gIGlmIChzZWN0aW9uX2l0ZXIgIT0gdGVtcG9yYXJ5X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgYXV0byB2YWx1ZSA9IHNlY3Rpb25faXRlci0+c2Vjb25kLmV4dHJhY3QocHJvcGVydHkpOwotICAgIGlmIChzZWN0aW9uX2l0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgewotICAgICAgdGVtcG9yYXJ5X2RldmljZXNfLmVyYXNlKHNlY3Rpb25faXRlcik7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZS5oYXNfdmFsdWUoKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ29uZmlnQ2FjaGU6OkNvbnZlcnRFbmNyeXB0T3JEZWNyeXB0S2V5SWZOZWVkZWQoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGF1dG8gcGVyc2lzdGVudF9zZWN0aW9ucyA9IEdldFBlcnNpc3RlbnRTZWN0aW9ucygpOwotICBmb3IgKGNvbnN0IGF1dG8mIHNlY3Rpb24gOiBwZXJzaXN0ZW50X3NlY3Rpb25zKSB7Ci0gICAgYXV0byBzZWN0aW9uX2l0ZXIgPSBwZXJzaXN0ZW50X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwcm9wZXJ0eSA6IGtFbmNyeXB0S2V5TmFtZUxpc3QpIHsKLSAgICAgIGF1dG8gcHJvcGVydHlfaXRlciA9IHNlY3Rpb25faXRlci0+c2Vjb25kLmZpbmQoc3RkOjpzdHJpbmcocHJvcGVydHkpKTsKLSAgICAgIGlmIChwcm9wZXJ0eV9pdGVyICE9IHNlY3Rpb25faXRlci0+c2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkID0gcHJvcGVydHlfaXRlci0+c2Vjb25kID09IGtFbmNyeXB0ZWRTdHI7Ci0gICAgICAgIGlmICgoIXByb3BlcnR5X2l0ZXItPnNlY29uZC5lbXB0eSgpKSAmJiBvczo6UGFyYW1ldGVyUHJvdmlkZXI6OkdldEJ0S2V5c3RvcmVJbnRlcmZhY2UoKSAhPSBudWxscHRyICYmCi0gICAgICAgICAgICBvczo6UGFyYW1ldGVyUHJvdmlkZXI6OklzQ29tbW9uQ3JpdGVyaWFNb2RlKCkgJiYgIWlzX2VuY3J5cHRlZCkgewotICAgICAgICAgIGlmIChvczo6UGFyYW1ldGVyUHJvdmlkZXI6OkdldEJ0S2V5c3RvcmVJbnRlcmZhY2UoKS0+c2V0X2VuY3J5cHRfa2V5X29yX3JlbW92ZV9rZXkoCi0gICAgICAgICAgICAgICAgICBzZWN0aW9uICsgIi0iICsgc3RkOjpzdHJpbmcocHJvcGVydHkpLCBwcm9wZXJ0eV9pdGVyLT5zZWNvbmQpKSB7Ci0gICAgICAgICAgICBTZXRQcm9wZXJ0eShzZWN0aW9uLCBzdGQ6OnN0cmluZyhwcm9wZXJ0eSksIGtFbmNyeXB0ZWRTdHIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAob3M6OlBhcmFtZXRlclByb3ZpZGVyOjpHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCkgIT0gbnVsbHB0ciAmJiBpc19lbmNyeXB0ZWQpIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZV9zdHIgPQotICAgICAgICAgICAgICBvczo6UGFyYW1ldGVyUHJvdmlkZXI6OkdldEJ0S2V5c3RvcmVJbnRlcmZhY2UoKS0+Z2V0X2tleShzZWN0aW9uICsgIi0iICsgc3RkOjpzdHJpbmcocHJvcGVydHkpKTsKLSAgICAgICAgICBpZiAoIW9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6SXNDb21tb25Dcml0ZXJpYU1vZGUoKSkgewotICAgICAgICAgICAgU2V0UHJvcGVydHkoc2VjdGlvbiwgc3RkOjpzdHJpbmcocHJvcGVydHkpLCB2YWx1ZV9zdHIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIENvbmZpZ0NhY2hlOjpJc0RldmljZVNlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgcmV0dXJuIGhjaTo6QWRkcmVzczo6SXNWYWxpZEFkZHJlc3Moc2VjdGlvbik7Ci19Ci0KLWJvb2wgQ29uZmlnQ2FjaGU6OklzUGVyc2lzdGVudFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgY29uc3QgewotICByZXR1cm4gcGVyc2lzdGVudF9wcm9wZXJ0eV9uYW1lc18uZmluZChwcm9wZXJ0eSkgIT0gcGVyc2lzdGVudF9wcm9wZXJ0eV9uYW1lc18uZW5kKCk7Ci19Ci0KLXZvaWQgQ29uZmlnQ2FjaGU6OlJlbW92ZVNlY3Rpb25XaXRoUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICBzaXplX3QgbnVtX3BlcnNpc3RlbnRfcmVtb3ZlZCA9IDA7Ci0gIGZvciAoYXV0byogY29uZmlnX3NlY3Rpb24gOiB7JmluZm9ybWF0aW9uX3NlY3Rpb25zXywgJnBlcnNpc3RlbnRfZGV2aWNlc199KSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gY29uZmlnX3NlY3Rpb24tPmJlZ2luKCk7IGl0ICE9IGNvbmZpZ19zZWN0aW9uLT5lbmQoKTspIHsKLSAgICAgIGlmIChpdC0+c2Vjb25kLmNvbnRhaW5zKHByb3BlcnR5KSkgewotICAgICAgICBMT0dfSU5GTygiUmVtb3ZpbmcgcGVyc2lzdGVudCBzZWN0aW9uICVzIHdpdGggcHJvcGVydHkgJXMiLCBpdC0+Zmlyc3QuY19zdHIoKSwgcHJvcGVydHkuY19zdHIoKSk7Ci0gICAgICAgIGl0ID0gY29uZmlnX3NlY3Rpb24tPmVyYXNlKGl0KTsKLSAgICAgICAgbnVtX3BlcnNpc3RlbnRfcmVtb3ZlZCsrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGl0Kys7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byBpdCA9IHRlbXBvcmFyeV9kZXZpY2VzXy5iZWdpbigpOyBpdCAhPSB0ZW1wb3JhcnlfZGV2aWNlc18uZW5kKCk7KSB7Ci0gICAgaWYgKGl0LT5zZWNvbmQuY29udGFpbnMocHJvcGVydHkpKSB7Ci0gICAgICBMT0dfSU5GTygiUmVtb3ZpbmcgdGVtcG9yYXJ5IHNlY3Rpb24gJXMgd2l0aCBwcm9wZXJ0eSAlcyIsIGl0LT5maXJzdC5jX3N0cigpLCBwcm9wZXJ0eS5jX3N0cigpKTsKLSAgICAgIGl0ID0gdGVtcG9yYXJ5X2RldmljZXNfLmVyYXNlKGl0KTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpdCsrOwotICB9Ci0gIGlmIChudW1fcGVyc2lzdGVudF9yZW1vdmVkID4gMCkgewotICAgIFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soKTsKLSAgfQotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29uZmlnQ2FjaGU6OkdldFBlcnNpc3RlbnRTZWN0aW9ucygpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYWlyZWRfZGV2aWNlczsKLSAgcGFpcmVkX2RldmljZXMucmVzZXJ2ZShwZXJzaXN0ZW50X2RldmljZXNfLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgZWxlbSA6IHBlcnNpc3RlbnRfZGV2aWNlc18pIHsKLSAgICBwYWlyZWRfZGV2aWNlcy5lbXBsYWNlX2JhY2soZWxlbS5maXJzdCk7Ci0gIH0KLSAgcmV0dXJuIHBhaXJlZF9kZXZpY2VzOwotfQotCi12b2lkIENvbmZpZ0NhY2hlOjpDb21taXQoc3RkOjpxdWV1ZTxNdXRhdGlvbkVudHJ5PiYgbXV0YXRpb25fZW50cmllcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgd2hpbGUgKCFtdXRhdGlvbl9lbnRyaWVzLmVtcHR5KCkpIHsKLSAgICBhdXRvIGVudHJ5ID0gc3RkOjptb3ZlKG11dGF0aW9uX2VudHJpZXMuZnJvbnQoKSk7Ci0gICAgbXV0YXRpb25fZW50cmllcy5wb3AoKTsKLSAgICBzd2l0Y2ggKGVudHJ5LmVudHJ5X3R5cGUpIHsKLSAgICAgIGNhc2UgTXV0YXRpb25FbnRyeTo6RW50cnlUeXBlOjpTRVQ6Ci0gICAgICAgIFNldFByb3BlcnR5KHN0ZDo6bW92ZShlbnRyeS5zZWN0aW9uKSwgc3RkOjptb3ZlKGVudHJ5LnByb3BlcnR5KSwgc3RkOjptb3ZlKGVudHJ5LnZhbHVlKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNdXRhdGlvbkVudHJ5OjpFbnRyeVR5cGU6OlJFTU9WRV9QUk9QRVJUWToKLSAgICAgICAgUmVtb3ZlUHJvcGVydHkoZW50cnkuc2VjdGlvbiwgZW50cnkucHJvcGVydHkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTXV0YXRpb25FbnRyeTo6RW50cnlUeXBlOjpSRU1PVkVfU0VDVElPTjoKLSAgICAgICAgUmVtb3ZlU2VjdGlvbihlbnRyeS5zZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vIGRvIG5vdCB3cml0ZSBhIGRlZmF1bHQgY2FzZSBzbyB0aGF0IHdoZW4gYSBuZXcgZW51bSBpcyBkZWZpbmVkLCBjb21waWxhdGlvbiB3b3VsZCBmYWlsIGF1dG9tYXRpY2FsbHkKLSAgICB9Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgQ29uZmlnQ2FjaGU6OlNlcmlhbGl6ZVRvTGVnYWN5Rm9ybWF0KCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc2VyaWFsaXplZDsKLSAgZm9yIChjb25zdCBhdXRvKiBjb25maWdfc2VjdGlvbiA6IHsmaW5mb3JtYXRpb25fc2VjdGlvbnNfLCAmcGVyc2lzdGVudF9kZXZpY2VzX30pIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHNlY3Rpb24gOiAqY29uZmlnX3NlY3Rpb24pIHsKLSAgICAgIHNlcmlhbGl6ZWQgPDwgIlsiIDw8IHNlY3Rpb24uZmlyc3QgPDwgIl0iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvcGVydHkgOiBzZWN0aW9uLnNlY29uZCkgewotICAgICAgICBzZXJpYWxpemVkIDw8IHByb3BlcnR5LmZpcnN0IDw8ICIgPSAiIDw8IHByb3BlcnR5LnNlY29uZCA8PCBzdGQ6OmVuZGw7Ci0gICAgICB9Ci0gICAgICBzZXJpYWxpemVkIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlcmlhbGl6ZWQuc3RyKCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPENvbmZpZ0NhY2hlOjpTZWN0aW9uQW5kUHJvcGVydHlWYWx1ZT4gQ29uZmlnQ2FjaGU6OkdldFNlY3Rpb25OYW1lc1dpdGhQcm9wZXJ0eSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHN0ZDo6dmVjdG9yPFNlY3Rpb25BbmRQcm9wZXJ0eVZhbHVlPiByZXN1bHQ7Ci0gIGZvciAoYXV0byogY29uZmlnX3NlY3Rpb24gOiB7JmluZm9ybWF0aW9uX3NlY3Rpb25zXywgJnBlcnNpc3RlbnRfZGV2aWNlc199KSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbGVtIDogKmNvbmZpZ19zZWN0aW9uKSB7Ci0gICAgICBhdXRvIGl0ID0gZWxlbS5zZWNvbmQuZmluZChwcm9wZXJ0eSk7Ci0gICAgICBpZiAoaXQgIT0gZWxlbS5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhTZWN0aW9uQW5kUHJvcGVydHlWYWx1ZXsuc2VjdGlvbiA9IGVsZW0uZmlyc3QsIC5wcm9wZXJ0eSA9IGl0LT5zZWNvbmR9KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgZWxlbSA6IHRlbXBvcmFyeV9kZXZpY2VzXykgewotICAgIGF1dG8gaXQgPSBlbGVtLnNlY29uZC5maW5kKHByb3BlcnR5KTsKLSAgICBpZiAoaXQgIT0gZWxlbS5zZWNvbmQuZW5kKCkpIHsKLSAgICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soU2VjdGlvbkFuZFByb3BlcnR5VmFsdWV7LnNlY3Rpb24gPSBlbGVtLmZpcnN0LCAucHJvcGVydHkgPSBpdC0+c2Vjb25kfSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotbmFtZXNwYWNlIHsKLQotYm9vbCBGaXhEZXZpY2VUeXBlSW5jb25zaXN0ZW5jeUluU2VjdGlvbigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbl9uYW1lLCBjb21tb246Okxpc3RNYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZGV2aWNlX3NlY3Rpb25fZW50cmllcykgewotICBpZiAoIWhjaTo6QWRkcmVzczo6SXNWYWxpZEFkZHJlc3Moc2VjdGlvbl9uYW1lKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBib29sIGlzX2xlID0gZmFsc2U7Ci0gIGJvb2wgaXNfY2xhc3NpYyA9IGZhbHNlOwotICAvLyBkZWZhdWx0Ci0gIGhjaTo6RGV2aWNlVHlwZSBkZXZpY2VfdHlwZSA9IGhjaTo6RGV2aWNlVHlwZTo6QlJfRURSOwotICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZGV2aWNlX3NlY3Rpb25fZW50cmllcykgewotICAgIGlmIChrTGVQcm9wZXJ0eU5hbWVzLmZpbmQoZW50cnkuZmlyc3QpICE9IGtMZVByb3BlcnR5TmFtZXMuZW5kKCkpIHsKLSAgICAgIGlzX2xlID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGtDbGFzc2ljUHJvcGVydHlOYW1lcy5maW5kKGVudHJ5LmZpcnN0KSAhPSBrQ2xhc3NpY1Byb3BlcnR5TmFtZXMuZW5kKCkpIHsKLSAgICAgIGlzX2NsYXNzaWMgPSB0cnVlOwotICAgIH0KLSAgfQotICBpZiAoaXNfY2xhc3NpYyAmJiBpc19sZSkgewotICAgIGRldmljZV90eXBlID0gaGNpOjpEZXZpY2VUeXBlOjpEVUFMOwotICB9IGVsc2UgaWYgKGlzX2NsYXNzaWMpIHsKLSAgICBkZXZpY2VfdHlwZSA9IGhjaTo6RGV2aWNlVHlwZTo6QlJfRURSOwotICB9IGVsc2UgaWYgKGlzX2xlKSB7Ci0gICAgZGV2aWNlX3R5cGUgPSBoY2k6OkRldmljZVR5cGU6OkxFOwotICB9Ci0gIGJvb2wgaW5jb25zaXN0ZW50ID0gdHJ1ZTsKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX3R5cGVfc3RyID0gc3RkOjp0b19zdHJpbmcoZGV2aWNlX3R5cGUpOwotICBhdXRvIGl0ID0gZGV2aWNlX3NlY3Rpb25fZW50cmllcy5maW5kKCJEZXZUeXBlIik7Ci0gIGlmIChpdCAhPSBkZXZpY2Vfc2VjdGlvbl9lbnRyaWVzLmVuZCgpKSB7Ci0gICAgaW5jb25zaXN0ZW50ID0gZGV2aWNlX3R5cGVfc3RyICE9IGl0LT5zZWNvbmQ7Ci0gICAgaWYgKGluY29uc2lzdGVudCkgewotICAgICAgaXQtPnNlY29uZCA9IHN0ZDo6bW92ZShkZXZpY2VfdHlwZV9zdHIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBkZXZpY2Vfc2VjdGlvbl9lbnRyaWVzLmluc2VydF9vcl9hc3NpZ24oIkRldlR5cGUiLCBzdGQ6Om1vdmUoZGV2aWNlX3R5cGVfc3RyKSk7Ci0gIH0KLSAgcmV0dXJuIGluY29uc2lzdGVudDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgQ29uZmlnQ2FjaGU6OkZpeERldmljZVR5cGVJbmNvbnNpc3RlbmNpZXMoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICBib29sIHBlcnNpc3RlbnRfZGV2aWNlX2NoYW5nZWQgPSBmYWxzZTsKLSAgZm9yIChhdXRvKiBjb25maWdfc2VjdGlvbiA6IHsmaW5mb3JtYXRpb25fc2VjdGlvbnNfLCAmcGVyc2lzdGVudF9kZXZpY2VzX30pIHsKLSAgICBmb3IgKGF1dG8mIGVsZW0gOiAqY29uZmlnX3NlY3Rpb24pIHsKLSAgICAgIGlmIChGaXhEZXZpY2VUeXBlSW5jb25zaXN0ZW5jeUluU2VjdGlvbihlbGVtLmZpcnN0LCBlbGVtLnNlY29uZCkpIHsKLSAgICAgICAgcGVyc2lzdGVudF9kZXZpY2VfY2hhbmdlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGJvb2wgdGVtcF9kZXZpY2VfY2hhbmdlZCA9IGZhbHNlOwotICBmb3IgKGF1dG8mIGVsZW0gOiB0ZW1wb3JhcnlfZGV2aWNlc18pIHsKLSAgICBpZiAoRml4RGV2aWNlVHlwZUluY29uc2lzdGVuY3lJblNlY3Rpb24oZWxlbS5maXJzdCwgZWxlbS5zZWNvbmQpKSB7Ci0gICAgICB0ZW1wX2RldmljZV9jaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKHBlcnNpc3RlbnRfZGV2aWNlX2NoYW5nZWQpIHsKLSAgICBQZXJzaXN0ZW50Q29uZmlnQ2hhbmdlZENhbGxiYWNrKCk7Ci0gIH0KLSAgcmV0dXJuIHBlcnNpc3RlbnRfZGV2aWNlX2NoYW5nZWQgfHwgdGVtcF9kZXZpY2VfY2hhbmdlZDsKLX0KLQotYm9vbCBDb25maWdDYWNoZTo6SGFzQXRMZWFzdE9uZU1hdGNoaW5nUHJvcGVydGllc0luU2VjdGlvbigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nX3ZpZXc+JiBwcm9wZXJ0eV9uYW1lcykgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgY29uc3QgY29tbW9uOjpMaXN0TWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4qIHNlY3Rpb25fcHRyOwotICBpZiAoIUlzRGV2aWNlU2VjdGlvbihzZWN0aW9uKSkgewotICAgIGF1dG8gc2VjdGlvbl9pdGVyID0gaW5mb3JtYXRpb25fc2VjdGlvbnNfLmZpbmQoc2VjdGlvbik7Ci0gICAgaWYgKHNlY3Rpb25faXRlciA9PSBpbmZvcm1hdGlvbl9zZWN0aW9uc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc2VjdGlvbl9wdHIgPSAmc2VjdGlvbl9pdGVyLT5zZWNvbmQ7Ci0gIH0gZWxzZSB7Ci0gICAgYXV0byBzZWN0aW9uX2l0ZXIgPSBwZXJzaXN0ZW50X2RldmljZXNfLmZpbmQoc2VjdGlvbik7Ci0gICAgaWYgKHNlY3Rpb25faXRlciA9PSBwZXJzaXN0ZW50X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgICBzZWN0aW9uX2l0ZXIgPSB0ZW1wb3JhcnlfZGV2aWNlc18uZmluZChzZWN0aW9uKTsKLSAgICAgIGlmIChzZWN0aW9uX2l0ZXIgPT0gdGVtcG9yYXJ5X2RldmljZXNfLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2VjdGlvbl9wdHIgPSAmc2VjdGlvbl9pdGVyLT5zZWNvbmQ7Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiBwcm9wZXJ0eSA6ICpzZWN0aW9uX3B0cikgewotICAgIGlmIChwcm9wZXJ0eV9uYW1lcy5jb3VudChwcm9wZXJ0eS5maXJzdCkgPiAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENvbmZpZ0NhY2hlOjpJc1BlcnNpc3RlbnRTZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICByZXR1cm4gcGVyc2lzdGVudF9kZXZpY2VzXy5jb250YWlucyhzZWN0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2NvbmZpZ19jYWNoZS5oIGIvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlMWZlNC4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL2NvbmZpZ19jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nX3ZpZXc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvbW1vbi9saXN0X21hcC5oIgotI2luY2x1ZGUgImNvbW1vbi9scnVfY2FjaGUuaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgIm9zL3V0aWxzLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbl9lbnRyeS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotY2xhc3MgTXV0YXRpb247Ci0KLS8vIEEgbWVtb3J5IG9wZXJhdGVkIHNlY3Rpb24ta2V5LXZhbHVlIHN0cnVjdHVyZWQgY29uZmlnCi0vLwotLy8gQSBzZWN0aW9uIGNhbiBiZSBlaXRoZXIgcGVyc2lzdGVudCBvciB0ZW1wb3JhcnkuIFdoZW4gYSBzZWN0aW9uIGJlY29tZXMgcGVyc2lzdGVudCwgYWxsIGl0cyBwcm9wZXJ0aWVzIGFyZQotLy8gd3JpdHRlbiB0byBkaXNrLgotLy8KLS8vIEEgc2VjdGlvbiBiZWNvbWVzIHBlcnNpc3RlbnQgd2hlbiBhIHByb3BlcnR5IHRoYXQgaXMgcGFydCBvZiBwZXJzaXN0ZW50X3Byb3BlcnR5X25hbWVzXyBpcyB3cml0dGVuIHRvIGNvbmZpZyBjYWNoZTsKLS8vIEEgc2VjdGlvbiBiZWNvbWVzIHRlbXBvcmFyeSB3aGVuIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHBhcnQgb2YgcGVyc2lzdGVudF9wcm9wZXJ0eV9uYW1lc18gaXMgcmVtb3ZlZAotLy8KLS8vIFRoZSBkZWZpbml0aW9uIG9mIHBlcnNpc3RlbnQgc2VjdGlvbnMgaXMgdXAgdG8gdGhlIHVzZXIgYW5kIGlzIGRlZmluZWQgdGhyb3VnaCB0aGUgfHBlcnNpc3RlbnRfcHJvcGVydHlfbmFtZXN8Ci0vLyBhcmd1bWVudC4gV2hlbiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBsaW5rIGtleSBwcm9wZXJ0aWVzLCB0aGVuIHBlcnNpc3RlbnQgc2VjdGlvbnMgaXMgZXF1YWwgdG8gYm9uZGVkIGRldmljZXMKLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHRocmVhZCBzYWZlCi1jbGFzcyBDb25maWdDYWNoZSB7Ci0gcHVibGljOgotICBDb25maWdDYWNoZShzaXplX3QgdGVtcF9kZXZpY2VfY2FwYWNpdHksIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZ192aWV3PiBwZXJzaXN0ZW50X3Byb3BlcnR5X25hbWVzKTsKLSAgdmlydHVhbCB+Q29uZmlnQ2FjaGUoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gbm8gY29weQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29uZmlnQ2FjaGUpOwotCi0gIC8vIGNhbiBtb3ZlCi0gIENvbmZpZ0NhY2hlKENvbmZpZ0NhY2hlJiYgb3RoZXIpIG5vZXhjZXB0OwotICBDb25maWdDYWNoZSYgb3BlcmF0b3I9KENvbmZpZ0NhY2hlJiYgb3RoZXIpIG5vZXhjZXB0OwotCi0gIC8vIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBjYWxsYmFjayBkb2Vzbid0IGNvdW50Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb25maWdDYWNoZSYgcmhzKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbmZpZ0NhY2hlJiByaHMpIGNvbnN0OwotCi0gIC8vIG9ic2VydmVycwotICB2aXJ0dWFsIGJvb2wgSGFzU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBIYXNQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSBjb25zdDsKLSAgLy8gR2V0IHByb3BlcnR5LCByZXR1cm4gc3RkOjpudWxsb3B0IGlmIHNlY3Rpb24gb3IgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QKLSAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBHZXRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSBjb25zdDsKLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgcGVyc2lzdGVudCBkZXZpY2UgTUFDIGFkZHJlc3NlcwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRQZXJzaXN0ZW50U2VjdGlvbnMoKSBjb25zdDsKLSAgLy8gUmV0dXJuIHRydWUgaWYgYSBzZWN0aW9uIGlzIHBlcnNpc3RlbnQKLSAgdmlydHVhbCBib29sIElzUGVyc2lzdGVudFNlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIGNvbnN0OwotICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHNlY3Rpb24gaGFzIG9uZSBvZiB0aGUgcHJvcGVydGllcyBpbiB8cHJvcGVydHlfbmFtZXN8Ci0gIHZpcnR1YWwgYm9vbCBIYXNBdExlYXN0T25lTWF0Y2hpbmdQcm9wZXJ0aWVzSW5TZWN0aW9uKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZ192aWV3PiYgcHJvcGVydHlfbmFtZXMpIGNvbnN0OwotICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHByb3BlcnR5IGlzIHBhcnQgb2YgcGVyc2lzdGVudF9wcm9wZXJ0eV9uYW1lc18KLSAgdmlydHVhbCBib29sIElzUGVyc2lzdGVudFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgY29uc3Q7Ci0gIC8vIFNlcmlhbGl6ZSB0byBsZWdhY3kgY29uZmlnIGZvcm1hdAotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFNlcmlhbGl6ZVRvTGVnYWN5Rm9ybWF0KCkgY29uc3Q7Ci0gIC8vIFJldHVybiBhIGNvcHkgb2YgcGFpcjxzZWN0aW9uX25hbWUsIHByb3BlcnR5X3ZhbHVlPiB3aXRoIHByb3BlcnR5Ci0gIHN0cnVjdCBTZWN0aW9uQW5kUHJvcGVydHlWYWx1ZSB7Ci0gICAgc3RkOjpzdHJpbmcgc2VjdGlvbjsKLSAgICBzdGQ6OnN0cmluZyBwcm9wZXJ0eTsKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VjdGlvbkFuZFByb3BlcnR5VmFsdWUmIHJocykgY29uc3QgewotICAgICAgcmV0dXJuIHNlY3Rpb24gPT0gcmhzLnNlY3Rpb24gJiYgcHJvcGVydHkgPT0gcmhzLnByb3BlcnR5OwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2VjdGlvbkFuZFByb3BlcnR5VmFsdWUmIHJocykgY29uc3QgewotICAgICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKLSAgICB9Ci0gIH07Ci0gIHZpcnR1YWwgc3RkOjp2ZWN0b3I8U2VjdGlvbkFuZFByb3BlcnR5VmFsdWU+IEdldFNlY3Rpb25OYW1lc1dpdGhQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0OwotCi0gIC8vIG1vZGlmaWVycwotICAvLyBDb21taXQgYWxsIG11dGF0aW9uIGVudHJpZXMgaW4gc2VxdWVuY2Ugd2hpbGUgaG9sZGluZyB0aGUgY29uZmlnIG11dGV4Ci0gIHZpcnR1YWwgdm9pZCBDb21taXQoc3RkOjpxdWV1ZTxNdXRhdGlvbkVudHJ5PiYgbXV0YXRpb24pOwotICB2aXJ0dWFsIHZvaWQgU2V0UHJvcGVydHkoc3RkOjpzdHJpbmcgc2VjdGlvbiwgc3RkOjpzdHJpbmcgcHJvcGVydHksIHN0ZDo6c3RyaW5nIHZhbHVlKTsKLSAgdmlydHVhbCBib29sIFJlbW92ZVNlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pOwotICB2aXJ0dWFsIGJvb2wgUmVtb3ZlUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSk7Ci0gIHZpcnR1YWwgdm9pZCBDb252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCk7Ci0gIC8vIFRPRE86IGhhdmUgYSBzeXN0ZW1hdGljIHdheSBvZiBkb2luZyB0aGlzIGluc3RlYWQgb2Ygc3BlY2lhbGl6ZWQgbWV0aG9kcwotICAvLyBSZW1vdmUgc2VjdGlvbnMgd2l0aCB8cHJvcGVydHl8IHNldAotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlU2VjdGlvbldpdGhQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpOwotICAvLyByZW1vdmUgYWxsIGNvbnRlbnQgaW4gdGhpcyBjb25maWcgY2FjaGUsIHJlc3RvcmUgaXQgdG8gdGhlIHN0YXRlIGFmdGVyIHRoZSBleHBsaWNpdCBjb25zdHJ1Y3RvcgotICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKTsKLSAgLy8gU2V0IGEgY2FsbGJhY2sgdG8gbm90aWZ5IGludGVyZXN0ZWQgcGFydHkgdGhhdCBhIHBlcnNpc3RlbnQgY29uZmlnIGNoYW5nZSBoYXMganVzdCBoYXBwZW5lZAotICB2aXJ0dWFsIHZvaWQgU2V0UGVyc2lzdGVudENvbmZpZ0NoYW5nZWRDYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFjayk7Ci0KLSAgLy8gRGV2aWNlIGNvbmZpZyBzcGVjaWZpYyBtZXRob2RzCi0gIC8vIFRPRE86IG1ldGhvZHMgaGVyZSBzaG91bGQgYmUgbW92ZWQgdG8gYSBkZXZpY2Ugc3BlY2lmaWMgY29uZmlnIGNhY2hlIGlmIHRoaXMgY29uZmlnIGNhY2hlIGlzIHN1cHBvc2VkIHRvIGJlIGdlbmVyaWMKLSAgLy8gTGVnYWN5IHN0YWNrIGhhcyBkZXZpY2UgdHlwZSBpbmNvbnNpc3RlbmNpZXMsIHRoaXMgbWV0aG9kIGlzIHRyeWluZyB0byBmaXggaXQKLSAgdmlydHVhbCBib29sIEZpeERldmljZVR5cGVJbmNvbnNpc3RlbmNpZXMoKTsKLQotICAvLyBzdGF0aWMgbWV0aG9kcwotICAvLyBDaGVjayBpZiBzZWN0aW9uIGlzIGZvcm1hdHRlZCBhcyBhIE1BQyBhZGRyZXNzCi0gIHN0YXRpYyBib29sIElzRGV2aWNlU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbik7Ci0KLSAgLy8gY29uc3RhbnRzCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGVmYXVsdFNlY3Rpb25OYW1lOwotCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBtdXRleF87Ci0gIC8vIEEgY2FsbGJhY2sgdG8gbm90aWZ5IGludGVyZXN0ZWQgcGFydHkgdGhhdCBhIHBlcnNpc3RlbnQgY29uZmlnIGNoYW5nZSBoYXMganVzdCBoYXBwZW5lZCwgZW1wdHkgYnkgZGVmYXVsdAotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFja187Ci0gIC8vIEEgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgaWYgc2V0IHdvdWxkIG1ha2UgYSBzZWN0aW9uIHBlcnNpc3RlbnQgYW5kIGlmIG5vbiBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQsIGEKLSAgLy8gc2VjdGlvbiB3b3VsZCBiZWNvbWUgdGVtcG9yYXJ5IGFnYWluCi0gIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZ192aWV3PiBwZXJzaXN0ZW50X3Byb3BlcnR5X25hbWVzXzsKLSAgLy8gQ29tbW9uIHNlY3Rpb24gdGhhdCBkb2VzIG5vdCByZWxhdGUgdG8gcmVtb3RlIGRldmljZSwgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2sKLSAgY29tbW9uOjpMaXN0TWFwPHN0ZDo6c3RyaW5nLCBjb21tb246Okxpc3RNYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gaW5mb3JtYXRpb25fc2VjdGlvbnNfOwotICAvLyBJbmZvcm1hdGlvbiBhYm91dCBwZXJzaXN0ZW50IGRldmljZXMsIG5vcm1hbGx5IHBhaXJlZCwgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2sKLSAgY29tbW9uOjpMaXN0TWFwPHN0ZDo6c3RyaW5nLCBjb21tb246Okxpc3RNYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcGVyc2lzdGVudF9kZXZpY2VzXzsKLSAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGVtcG9yYXJ5IGRldmljZXMsIG5vcm1hbGx5IHVucGFpcmVkLCB3aWxsIG5vdCBiZSB3cml0dGVuIHRvIGRpc2ssIHdpbGwgYmUgZXZpY3RlZCBhdXRvbWF0aWNhbGx5Ci0gIC8vIGlmIGNhcGFjaXR5IGV4Y2VlZHMgZ2l2ZW4gdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uCi0gIGNvbW1vbjo6THJ1Q2FjaGU8c3RkOjpzdHJpbmcsIGNvbW1vbjo6TGlzdE1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB0ZW1wb3JhcnlfZGV2aWNlc187Ci0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBjYWxsYmFjayBpcyB2YWxpZCBiZWZvcmUgY2FsbGluZyBpdAotICBpbmxpbmUgdm9pZCBQZXJzaXN0ZW50Q29uZmlnQ2hhbmdlZENhbGxiYWNrKCkgY29uc3QgewotICAgIGlmIChwZXJzaXN0ZW50X2NvbmZpZ19jaGFuZ2VkX2NhbGxiYWNrXykgewotICAgICAgcGVyc2lzdGVudF9jb25maWdfY2hhbmdlZF9jYWxsYmFja18oKTsKLSAgICB9Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2NvbmZpZ19jYWNoZV9oZWxwZXIuY2MgYi9nZC9zdG9yYWdlL2NvbmZpZ19jYWNoZV9oZWxwZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Nzc0OWEuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZV9oZWxwZXIuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9udW1iZXJzLmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0cmluZ3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLXZvaWQgQ29uZmlnQ2FjaGVIZWxwZXI6OlNldEJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgYm9vbCB2YWx1ZSkgewotICBjb25maWdfY2FjaGVfLlNldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5LCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotfQotCi1zdGQ6Om9wdGlvbmFsPGJvb2w+IENvbmZpZ0NhY2hlSGVscGVyOjpHZXRCb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZV9zdHIgPSBjb25maWdfY2FjaGVfLkdldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5KTsKLSAgaWYgKCF2YWx1ZV9zdHIpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIGlmICgqdmFsdWVfc3RyID09ICJ0cnVlIikgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKCp2YWx1ZV9zdHIgPT0gImZhbHNlIikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci19Ci0KLXZvaWQgQ29uZmlnQ2FjaGVIZWxwZXI6OlNldFVpbnQ2NChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LCB1aW50NjRfdCB2YWx1ZSkgewotICBjb25maWdfY2FjaGVfLlNldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5LCBzdGQ6OnRvX3N0cmluZyh2YWx1ZSkpOwotfQotCi1zdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBDb25maWdDYWNoZUhlbHBlcjo6R2V0VWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZV9zdHIgPSBjb25maWdfY2FjaGVfLkdldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5KTsKLSAgaWYgKCF2YWx1ZV9zdHIpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiBjb21tb246OlVpbnQ2NEZyb21TdHJpbmcoKnZhbHVlX3N0cik7Ci19Ci0KLXZvaWQgQ29uZmlnQ2FjaGVIZWxwZXI6OlNldFVpbnQzMihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LCB1aW50MzJfdCB2YWx1ZSkgewotICBjb25maWdfY2FjaGVfLlNldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5LCBzdGQ6OnRvX3N0cmluZyh2YWx1ZSkpOwotfQotCi1zdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBDb25maWdDYWNoZUhlbHBlcjo6R2V0VWludDMyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZV9zdHIgPSBjb25maWdfY2FjaGVfLkdldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5KTsKLSAgaWYgKCF2YWx1ZV9zdHIpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIGF1dG8gbGFyZ2VfdmFsdWUgPSBHZXRVaW50NjQoc2VjdGlvbiwgcHJvcGVydHkpOwotICBpZiAoIWxhcmdlX3ZhbHVlKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpZiAoIWNvbW1vbjo6SXNOdW1iZXJJbk51bWVyaWNMaW1pdHM8dWludDMyX3Q+KCpsYXJnZV92YWx1ZSkpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKmxhcmdlX3ZhbHVlKTsKLX0KLQotdm9pZCBDb25maWdDYWNoZUhlbHBlcjo6U2V0SW50NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgaW50NjRfdCB2YWx1ZSkgewotICBjb25maWdfY2FjaGVfLlNldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5LCBzdGQ6OnRvX3N0cmluZyh2YWx1ZSkpOwotfQotCi1zdGQ6Om9wdGlvbmFsPGludDY0X3Q+IENvbmZpZ0NhY2hlSGVscGVyOjpHZXRJbnQ2NChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSBjb25zdCB7Ci0gIGF1dG8gdmFsdWVfc3RyID0gY29uZmlnX2NhY2hlXy5HZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gIGlmICghdmFsdWVfc3RyKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICByZXR1cm4gY29tbW9uOjpJbnQ2NEZyb21TdHJpbmcoKnZhbHVlX3N0cik7Ci19Ci0KLXZvaWQgQ29uZmlnQ2FjaGVIZWxwZXI6OlNldEludChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LCBpbnQgdmFsdWUpIHsKLSAgY29uZmlnX2NhY2hlXy5TZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSwgc3RkOjp0b19zdHJpbmcodmFsdWUpKTsKLX0KLQotc3RkOjpvcHRpb25hbDxpbnQ+IENvbmZpZ0NhY2hlSGVscGVyOjpHZXRJbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgY29uc3QgewotICBhdXRvIHZhbHVlX3N0ciA9IGNvbmZpZ19jYWNoZV8uR2V0UHJvcGVydHkoc2VjdGlvbiwgcHJvcGVydHkpOwotICBpZiAoIXZhbHVlX3N0cikgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgYXV0byBsYXJnZV92YWx1ZSA9IEdldEludDY0KHNlY3Rpb24sIHByb3BlcnR5KTsKLSAgaWYgKCFsYXJnZV92YWx1ZSkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgaWYgKCFjb21tb246OklzTnVtYmVySW5OdW1lcmljTGltaXRzPGludD4oKmxhcmdlX3ZhbHVlKSkgewotICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PigqbGFyZ2VfdmFsdWUpOwotfQotCi12b2lkIENvbmZpZ0NhY2hlSGVscGVyOjpTZXRCaW4oCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gIGNvbmZpZ19jYWNoZV8uU2V0UHJvcGVydHkoc2VjdGlvbiwgcHJvcGVydHksIGNvbW1vbjo6VG9IZXhTdHJpbmcodmFsdWUpKTsKLX0KLQotc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gQ29uZmlnQ2FjaGVIZWxwZXI6OkdldEJpbigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSBjb25zdCB7Ci0gIGF1dG8gdmFsdWVfc3RyID0gY29uZmlnX2NhY2hlXy5HZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gIGlmICghdmFsdWVfc3RyKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBhdXRvIHZhbHVlID0gY29tbW9uOjpGcm9tSGV4U3RyaW5nKCp2YWx1ZV9zdHIpOwotICBpZiAoIXZhbHVlKSB7Ci0gICAgTE9HX1dBUk4oInZhbHVlX3N0ciBjYW5ub3QgYmUgcGFyc2VkIHRvIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Iik7Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvY29uZmlnX2NhY2hlX2hlbHBlci5oIGIvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTBkZmQuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLSNpbmNsdWRlICJjb21tb24vbnVtYmVycy5oIgotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiY29tbW9uL3R5cGVfaGVscGVyLmgiCi0jaW5jbHVkZSAiaGNpL2VudW1faGVscGVyLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9jb25maWdfY2FjaGUuaCIKLSNpbmNsdWRlICJzdG9yYWdlL211dGF0aW9uX2VudHJ5LmgiCi0jaW5jbHVkZSAic3RvcmFnZS9zZXJpYWxpemFibGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLS8vIEEgdGhpbiB3cmFwcGVyIGFyb3VuZCBDb25maWdDYWNoZSBhbmQgaW1wbGVtZW50IG1vcmUgdHlwZSBzdXBwb3J0cyBvdGhlciB0aGFuIHN0ZDo6c3RyaW5nCi0vLwotLy8gLSBhbGwgU2V0WCBtZXRob2RzIGFjY2VwdCB2YWx1ZSBhcyBjb3B5IGFuZCBzdGQ6Om1vdmUoKSBpbiBlbmNvdXJhZ2VkCi0vLyAtIGFsbCBHZXRYIG1ldGhvZHMgcmV0dXJuIHN0ZDo6b3B0aW9uYWw8WD4gYW5kIHN0ZDo6bnVsbG9wdCBpZiBub3QgZXhpc3QuIHN0ZDo6b3B0aW9uYWw8PiBjYW4gYmUgdHJlYXRlZCBhcyBib29sCi1jbGFzcyBDb25maWdDYWNoZUhlbHBlciB7Ci0gcHVibGljOgotICBzdGF0aWMgQ29uZmlnQ2FjaGVIZWxwZXIgRnJvbUNvbmZpZ0NhY2hlKENvbmZpZ0NhY2hlJiBjb25maWdfY2FjaGUpIHsKLSAgICByZXR1cm4gQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnX2NhY2hlKTsKLSAgfQotICBleHBsaWNpdCBDb25maWdDYWNoZUhlbHBlcihDb25maWdDYWNoZSYgY29uZmlnX2NhY2hlKSA6IGNvbmZpZ19jYWNoZV8oY29uZmlnX2NhY2hlKSB7fQotICB2aXJ0dWFsIH5Db25maWdDYWNoZUhlbHBlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIFNldEJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgYm9vbCB2YWx1ZSk7Ci0gIHZpcnR1YWwgc3RkOjpvcHRpb25hbDxib29sPiBHZXRCb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2V0VWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksIHVpbnQ2NF90IHZhbHVlKTsKLSAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBHZXRVaW50NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXRVaW50MzIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgdWludDMyX3QgdmFsdWUpOwotICB2aXJ0dWFsIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IEdldFVpbnQzMihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFNldEludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksIGludDY0X3QgdmFsdWUpOwotICB2aXJ0dWFsIHN0ZDo6b3B0aW9uYWw8aW50NjRfdD4gR2V0SW50NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXRJbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgaW50IHZhbHVlKTsKLSAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPGludD4gR2V0SW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2V0QmluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSk7Ci0gIHZpcnR1YWwgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gR2V0QmluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIGNvbnN0OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NpZ25lZF92PFQ+ICYmIHN0ZDo6aXNfaW50ZWdyYWxfdjxUPiwgaW50Pjo6dHlwZSA9IDA+Ci0gIHN0ZDo6b3B0aW9uYWw8VD4gR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgICBhdXRvIHZhbHVlID0gR2V0SW50NjQoc2VjdGlvbiwgcHJvcGVydHkpOwotICAgIGlmICghdmFsdWUpIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICAgIGlmICghY29tbW9uOjpJc051bWJlckluTnVtZXJpY0xpbWl0czxUPigqdmFsdWUpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VD4oKnZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkX3Y8VD4gJiYgc3RkOjppc19pbnRlZ3JhbF92PFQ+LCBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RkOjpvcHRpb25hbDxUPiBHZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSkgewotICAgIGF1dG8gdmFsdWUgPSBHZXRVaW50NjQoc2VjdGlvbiwgcHJvcGVydHkpOwotICAgIGlmICghdmFsdWUpIHsKLSAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgfQotICAgIGlmICghY29tbW9uOjpJc051bWJlckluTnVtZXJpY0xpbWl0czxUPigqdmFsdWUpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VD4oKnZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWVfdjxULCBzdGQ6OnN0cmluZz4sIGludD46OnR5cGUgPSAwPgotICBzdGQ6Om9wdGlvbmFsPFQ+IEdldChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSB7Ci0gICAgcmV0dXJuIGNvbmZpZ19jYWNoZV8uR2V0UHJvcGVydHkoc2VjdGlvbiwgcHJvcGVydHkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZV92PFQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiwgaW50Pjo6dHlwZSA9IDA+Ci0gIHN0ZDo6b3B0aW9uYWw8VD4gR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgICByZXR1cm4gR2V0QmluKHNlY3Rpb24sIHByb3BlcnR5KTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWVfdjxULCBib29sPiwgaW50Pjo6dHlwZSA9IDA+Ci0gIHN0ZDo6b3B0aW9uYWw8VD4gR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgICByZXR1cm4gR2V0Qm9vbChzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mX3Y8U2VyaWFsaXphYmxlPFQ+LCBUPiwgaW50Pjo6dHlwZSA9IDA+Ci0gIHN0ZDo6b3B0aW9uYWw8VD4gR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgICBhdXRvIHZhbHVlID0gY29uZmlnX2NhY2hlXy5HZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgcmV0dXJuIFQ6OkZyb21MZWdhY3lDb25maWdTdHJpbmcoKnZhbHVlKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW1fdjxUPiwgaW50Pjo6dHlwZSA9IDA+Ci0gIHN0ZDo6b3B0aW9uYWw8VD4gR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgICBhdXRvIHZhbHVlID0gY29uZmlnX2NhY2hlXy5HZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6RnJvbUxlZ2FjeUNvbmZpZ1N0cmluZzxUPigqdmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGUgPAotICAgICAgdHlwZW5hbWUgVCwKLSAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjppc19zcGVjaWFsaXphdGlvbl9vZjxULCBzdGQ6OnZlY3Rvcj46OnZhbHVlICYmCi0gICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZl92PFNlcmlhbGl6YWJsZTx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiwgdHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4sCi0gICAgICAgICAgaW50Pjo6dHlwZSA9IDA+Ci0gIHN0ZDo6b3B0aW9uYWw8VD4gR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgICBhdXRvIHZhbHVlID0gY29uZmlnX2NhY2hlXy5HZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICB9Ci0gICAgYXV0byB2YWx1ZXMgPSBjb21tb246OlN0cmluZ1NwbGl0KCp2YWx1ZSwgIiAiKTsKLSAgICBUIHJlc3VsdDsKLSAgICByZXN1bHQucmVzZXJ2ZSh2YWx1ZXMuc2l6ZSgpKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHN0ciA6IHZhbHVlcykgewotICAgICAgYXV0byB2ID0gVDo6dmFsdWVfdHlwZTo6RnJvbUxlZ2FjeUNvbmZpZ1N0cmluZyhzdHIpOwotICAgICAgaWYgKCF2KSB7Ci0gICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7Ci0gICAgICB9Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCp2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQ29uZmlnQ2FjaGUmIGNvbmZpZ19jYWNoZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyX3Rlc3QuY2MgYi9nZC9zdG9yYWdlL2NvbmZpZ19jYWNoZV9oZWxwZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2OWE0YS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL2NvbmZpZ19jYWNoZV9oZWxwZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RvcmFnZS9kZXZpY2UuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6OkNvbmZpZ0NhY2hlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZUhlbHBlcjsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlOwotCi1URVNUKENvbmZpZ0NhY2hlSGVscGVyVGVzdCwgc2V0X2dldF9ib29sX3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICAvLyB0cnVlCi0gIENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuU2V0Qm9vbCgiQSIsICJCIiwgdHJ1ZSk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCJ0cnVlIikpKTsKLSAgQVNTRVJUX1RIQVQoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRCb29sKCJBIiwgIkIiKSwgT3B0aW9uYWwoSXNUcnVlKCkpKTsKLSAgLy8gZmFsc2UKLSAgQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5TZXRCb29sKCJBIiwgIkIiLCBmYWxzZSk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCJmYWxzZSIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0Qm9vbCgiQSIsICJCIiksIE9wdGlvbmFsKElzRmFsc2UoKSkpOwotfQotCi1URVNUKENvbmZpZ0NhY2hlSGVscGVyVGVzdCwgc2V0X2dldF91aW50NjRfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIC8vIHNtYWxsCi0gIENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuU2V0VWludDY0KCJBIiwgIkIiLCAxMjMpOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcSgiMTIzIikpKTsKLSAgQVNTRVJUX1RIQVQoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRVaW50NjQoIkEiLCAiQiIpLCBPcHRpb25hbChFcSh1aW50NjRfdCgxMjMpKSkpOwotICAvLyBiaWcKLSAgdWludDY0X3QgbnVtID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKLSAgbnVtID0gbnVtICogMTA7Ci0gIENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuU2V0VWludDY0KCJBIiwgIkIiLCBudW0pOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcShzdGQ6OnRvX3N0cmluZyhzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSArICIwIikpKTsKLSAgQVNTRVJUX1RIQVQoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRVaW50NjQoIkEiLCAiQiIpLCBPcHRpb25hbChFcShudW0pKSk7Ci0gIC8vIHplcm8KLSAgQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5TZXRVaW50NjQoIkEiLCAiQiIsIDApOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcSgiMCIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0VWludDY0KCJBIiwgIkIiKSwgT3B0aW9uYWwoRXEoMCkpKTsKLX0KLQotVEVTVChDb25maWdDYWNoZUhlbHBlclRlc3QsIHNldF9nZXRfdWludDMyX3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICAvLyBzbWFsbAotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldFVpbnQzMigiQSIsICJCIiwgMTIzKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlnLkdldFByb3BlcnR5KCJBIiwgIkIiKSwgT3B0aW9uYWwoU3RyRXEoIjEyMyIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0VWludDY0KCJBIiwgIkIiKSwgT3B0aW9uYWwoRXEodWludDMyX3QoMTIzKSkpKTsKLSAgLy8gYmlnCi0gIHVpbnQ2NF90IG51bSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKLSAgbnVtICo9IDEwOwotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldFVpbnQ2NCgiQSIsICJCIiwgbnVtKTsKLSAgQVNTRVJUX1RIQVQoCi0gICAgICBjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcShzdGQ6OnRvX3N0cmluZyhzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpICsgIjAiKSkpOwotICBBU1NFUlRfRkFMU0UoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRVaW50MzIoIkEiLCAiQiIpKTsKLSAgLy8gemVybwotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldFVpbnQzMigiQSIsICJCIiwgMCk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCIwIikpKTsKLSAgQVNTRVJUX1RIQVQoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRVaW50MzIoIkEiLCAiQiIpLCBPcHRpb25hbChFcSgwKSkpOwotfQotCi1URVNUKENvbmZpZ0NhY2hlSGVscGVyVGVzdCwgc2V0X2dldF9pbnQ2NF90ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMDAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgLy8gcG9zaXRpdmUKLSAgaW50NjRfdCBudW0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKLSAgbnVtICo9IDEwOwotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldEludDY0KCJBIiwgIkIiLCBudW0pOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcShzdGQ6OnRvX3N0cmluZyhzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSkgKyAiMCIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0SW50NjQoIkEiLCAiQiIpLCBPcHRpb25hbChFcShpbnQ2NF90KG51bSkpKSk7Ci0gIC8vIG5lZ2F0aXZlCi0gIENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuU2V0SW50NjQoIkEiLCAiQiIsIC0xICogbnVtKTsKLSAgQVNTRVJUX1RIQVQoCi0gICAgICBjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcSgiLSIgKyBzdGQ6OnRvX3N0cmluZyhzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSkgKyAiMCIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0SW50NjQoIkEiLCAiQiIpLCBPcHRpb25hbChFcSgtMSAqIG51bSkpKTsKLSAgLy8gemVybwotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldEludCgiQSIsICJCIiwgMCk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCIwIikpKTsKLSAgQVNTRVJUX1RIQVQoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRJbnQ2NCgiQSIsICJCIiksIE9wdGlvbmFsKEVxKGludDY0X3QoMCkpKSk7Ci19Ci0KLVRFU1QoQ29uZmlnQ2FjaGVIZWxwZXJUZXN0LCBzZXRfZ2V0X2ludF90ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMDAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgLy8gcG9zaXRpdmUKLSAgQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5TZXRJbnQoIkEiLCAiQiIsIDEyMyk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCIxMjMiKSkpOwotICBBU1NFUlRfVEhBVChDb25maWdDYWNoZUhlbHBlcihjb25maWcpLkdldEludCgiQSIsICJCIiksIE9wdGlvbmFsKEVxKGludCgxMjMpKSkpOwotICAvLyBuZWdhdGl2ZQotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldEludCgiQSIsICJCIiwgLTEyMyk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCItMTIzIikpKTsKLSAgQVNTRVJUX1RIQVQoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRJbnQoIkEiLCAiQiIpLCBPcHRpb25hbChFcShpbnQoLTEyMykpKSk7Ci0gIC8vIHplcm8KLSAgQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5TZXRJbnQoIkEiLCAiQiIsIDApOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcSgiMCIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0SW50KCJBIiwgIkIiKSwgT3B0aW9uYWwoRXEoaW50KDApKSkpOwotICAvLyBiaWcKLSAgaW50NjRfdCBudW0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKLSAgbnVtICo9IDEwOwotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldEludDY0KCJBIiwgIkIiLCBudW0pOwotICBBU1NFUlRfRkFMU0UoQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5HZXRJbnQoIkEiLCAiQiIpKTsKLX0KLQotVEVTVChDb25maWdDYWNoZUhlbHBlclRlc3QsIHNldF9nZXRfYmluX3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICAvLyBlbXB0eQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOwotICBDb25maWdDYWNoZUhlbHBlcihjb25maWcpLlNldEJpbigiQSIsICJCIiwgZGF0YSk7Ci0gIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIiksIE9wdGlvbmFsKFN0ckVxKCIiKSkpOwotICBBU1NFUlRfVEhBVChDb25maWdDYWNoZUhlbHBlcihjb25maWcpLkdldEJpbigiQSIsICJCIiksIE9wdGlvbmFsKENvbnRhaW5lckVxKGRhdGEpKSk7Ci0gIC8vIG5vbi1lbXB0eQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMiA9IHsweEFCLCAweDVELCAweDQyfTsKLSAgQ29uZmlnQ2FjaGVIZWxwZXIoY29uZmlnKS5TZXRCaW4oIkEiLCAiQiIsIGRhdGEyKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlnLkdldFByb3BlcnR5KCJBIiwgIkIiKSwgT3B0aW9uYWwoU3RyRXEoImFiNWQ0MiIpKSk7Ci0gIEFTU0VSVF9USEFUKENvbmZpZ0NhY2hlSGVscGVyKGNvbmZpZykuR2V0QmluKCJBIiwgIkIiKSwgT3B0aW9uYWwoQ29udGFpbmVyRXEoZGF0YTIpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfdGVzdC5jYyBiL2dkL3N0b3JhZ2UvY29uZmlnX2NhY2hlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzA1NmYuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RvcmFnZS9jb25maWdfY2FjaGUuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGNzdGRpbz4KLQotI2luY2x1ZGUgImhjaS9lbnVtX2hlbHBlci5oIgotI2luY2x1ZGUgInN0b3JhZ2UvZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLXN0ZDo6c3RyaW5nIEdldFRlc3RBZGRyZXNzKGludCBpKSB7Ci0gIHN0ZDo6c3RyaW5nIHJlcyA9ICIwMDowMDowMDowMDowMDowMCI7Ci0gIHJlcy5yZXNlcnZlKHJlcy5zaXplKCkgKyAxKTsKLSAgc3RkOjpzbnByaW50ZihyZXMuZGF0YSgpLCByZXMuY2FwYWNpdHkoKSwgIkFBOkJCOkNDOkREOkVFOiUwMmQiLCBpKTsKLSAgcmV0dXJuIHJlczsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6OkNvbmZpZ0NhY2hlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpEZXZpY2U7Ci11c2luZyBTZWN0aW9uQW5kUHJvcGVydHlWYWx1ZSA9IGJsdWV0b290aDo6c3RvcmFnZTo6Q29uZmlnQ2FjaGU6OlNlY3Rpb25BbmRQcm9wZXJ0eVZhbHVlOwotCi1URVNUKENvbmZpZ0NhY2hlVGVzdCwgc2ltcGxlX3NldF9nZXRfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgYXV0byB2YWx1ZSA9IGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCIik7Ci0gIEFTU0VSVF9UUlVFKHZhbHVlKTsKLSAgQVNTRVJUX0VRKCp2YWx1ZSwgIkMiKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIGVtcHR5X3ZhbHVlc190ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMDAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQVNTRVJUX0RFQVRIKHsgY29uZmlnLlNldFByb3BlcnR5KCIiLCAiQiIsICJDIik7IH0sICJFbXB0eSBzZWN0aW9uIG5hbWUgbm90IGFsbG93ZWQiKTsKLSAgQVNTRVJUX0RFQVRIKHsgY29uZmlnLlNldFByb3BlcnR5KCJBIiwgIiIsICJDIik7IH0sICJFbXB0eSBwcm9wZXJ0eSBuYW1lIG5vdCBhbGxvd2VkIik7Ci0gIC8vIGVtcHR5IHZhbHVlIGlzIGFsbG93ZWQKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBIiwgIkIiLCAiIik7Ci0gIGF1dG8gdmFsdWUgPSBjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpOwotICBBU1NFUlRfVFJVRSh2YWx1ZSk7Ci0gIEFTU0VSVF9FUSgqdmFsdWUsICIiKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIGluc2VydF9ib3VuZGFyeV9kZXZpY2Vfd2l0aF9saW5ra2V5X3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDIsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBIiwgIkIiLCAiQyIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjEwIiwgIk5hbWUiLCAiSGVsbG8iKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDowOSIsICJOYW1lIiwgIkhlbGxvIDIiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJMaW5rS2V5IiwgIkFBQkJBQUJCQ0NEREVFIik7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTAiLCAiTmFtZSIpKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIGNvbXBhcmlzb25fdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWdfMSgyLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZ18xLlNldFByb3BlcnR5KCJBIiwgIkIiLCAiQyIpOwotICBjb25maWdfMS5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTAiLCAiTmFtZSIsICJIZWxsbyIpOwotICBjb25maWdfMS5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MDkiLCAiTmFtZSIsICJIZWxsbyAyIik7Ci0gIGNvbmZpZ18xLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJMaW5rS2V5IiwgIkFBQkJBQUJCQ0NEREVFIik7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZ18yKDIsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgY29uZmlnXzIuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIGNvbmZpZ18yLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMCIsICJOYW1lIiwgIkhlbGxvIik7Ci0gIGNvbmZpZ18yLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDowOSIsICJOYW1lIiwgIkhlbGxvIDIiKTsKLSAgY29uZmlnXzIuU2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjExIiwgIkxpbmtLZXkiLCAiQUFCQkFBQkJDQ0RERUUiKTsKLSAgQVNTRVJUX0VRKGNvbmZpZ18xLCBjb25maWdfMik7Ci0gIC8vIENvbmZpZyB3aXRoIGRpZmZlcmVudCB0ZW1wIGRldmljZSBvcmRlciBzaG91bGQgbm90IGJlIGVxdWFsCi0gIEFTU0VSVF9UUlVFKGNvbmZpZ18yLkdldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMCIsICJOYW1lIikpOwotICBBU1NFUlRfTkUoY29uZmlnXzEsIGNvbmZpZ18yKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnXzEuR2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjEwIiwgIk5hbWUiKSk7Ci0gIEFTU0VSVF9FUShjb25maWdfMSwgY29uZmlnXzIpOwotICAvLyBDb25maWcgd2l0aCBkaWZmZXJlbnQgcGVyc2lzdGVudCBkZXZpY2Ugb3JkZXIgc2hvdWxkIG5vdCBiZSBlcXVhbAotICBjb25maWdfMS5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTIiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBjb25maWdfMi5SZW1vdmVTZWN0aW9uKCJDQzpERDpFRTpGRjowMDoxMSIpOwotICBjb25maWdfMi5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTIiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBjb25maWdfMi5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBBU1NFUlRfTkUoY29uZmlnXzEsIGNvbmZpZ18yKTsKLSAgLy8gQ29uZmlnIHdpdGggZGlmZmVyZW50IGNhcGFjaXR5IHNob3VsZCBub3QgYmUgZXF1YWwKLSAgQ29uZmlnQ2FjaGUgY29uZmlnXzMoMywgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBjb25maWdfMy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnXzMuU2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjEwIiwgIk5hbWUiLCAiSGVsbG8iKTsKLSAgY29uZmlnXzMuU2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjA5IiwgIk5hbWUiLCAiSGVsbG8gMiIpOwotICBjb25maWdfMy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBjb25maWdfMy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTIiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBBU1NFUlRfTkUoY29uZmlnXzEsIGNvbmZpZ18zKTsKLSAgLy8gRW1wdHkgY29uZmlnIHNob3VsZCBub3QgYmUgZXF1YWwgdG8gbm9uLWVtcHR5IG9uZXMKLSAgQ29uZmlnQ2FjaGUgY29uZmlnXzQoMiwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBBU1NFUlRfTkUoY29uZmlnXzEsIGNvbmZpZ180KTsKLSAgLy8gRW1wdHkgY29uZmlncyBzaG91bGQgYmUgZXF1YWwKLSAgQ29uZmlnQ2FjaGUgY29uZmlnXzUoMiwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBBU1NFUlRfRVEoY29uZmlnXzQsIGNvbmZpZ181KTsKLSAgLy8gRW1wdHkgY29uZmlncyB3aXRoIGRpZmZlcmVudCBjYXBhY2l0eSBzaG91bGQgbm90IGJlIGVxdWFsCi0gIENvbmZpZ0NhY2hlIGNvbmZpZ182KDMsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQVNTRVJUX05FKGNvbmZpZ180LCBjb25maWdfNik7Ci19Ci0KLVRFU1QoQ29uZmlnQ2FjaGVUZXN0LCBlbXB0eV9zdHJpbmdfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIiIpOwotICBhdXRvIHZhbHVlID0gY29uZmlnLkdldFByb3BlcnR5KCJBIiwgIkIiKTsKLSAgQVNTRVJUX1RSVUUodmFsdWUpOwotICBBU1NFUlRfRVEoKnZhbHVlLCAiIik7Ci19Ci0KLVRFU1QoQ29uZmlnQ2FjaGVUZXN0LCBtYWNfYWRkcmVzc19zZXRfZ2V0X3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIsICJDIik7Ci0gIGF1dG8gdmFsdWUgPSBjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpOwotICBBU1NFUlRfVFJVRSh2YWx1ZSk7Ci0gIEFTU0VSVF9FUSgqdmFsdWUsICJDIik7Ci0gIHZhbHVlID0gY29uZmlnLkdldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIik7Ci0gIEFTU0VSVF9UUlVFKHZhbHVlKTsKLSAgQVNTRVJUX0VRKCp2YWx1ZSwgIkMiKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJCQyIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQUJDIiwgIkIiKSk7Ci19Ci0KLVRFU1QoQ29uZmlnQ2FjaGVUZXN0LCBoYXNfc2VjdGlvbl9hbmRfcHJvcGVydHlfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJDIiwgIkQiKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1NlY3Rpb24oIkEiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNTZWN0aW9uKCJBQTpCQjpDQzpERDpFRTpGRiIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1Byb3BlcnR5KCJBIiwgIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIpKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJDIiwgIkQiKTsKLSAgYXV0byB2YWx1ZSA9IGNvbmZpZy5HZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQyIpOwotICBBU1NFUlRfVFJVRSh2YWx1ZSk7Ci0gIEFTU0VSVF9FUSgqdmFsdWUsICJEIik7Ci0gIHZhbHVlID0gY29uZmlnLkdldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIik7Ci0gIEFTU0VSVF9UUlVFKHZhbHVlKTsKLSAgQVNTRVJUX0VRKCp2YWx1ZSwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkUiKTsKLSAgdmFsdWUgPSBjb25maWcuR2V0UHJvcGVydHkoIkFBOkJCOkNDOkREOkVFOkZGIiwgIkIiKTsKLSAgQVNTRVJUX1RSVUUodmFsdWUpOwotICBBU1NFUlRfVEhBVCh2YWx1ZSwgT3B0aW9uYWwoU3RyRXEoIkUiKSkpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oIkFiIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oIkFBOjExOkNDOkREOkVFOkZGIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1Byb3BlcnR5KCJBIiwgImJCIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1Byb3BlcnR5KCJBQTpCQjoxMTpERDpFRTpGRiIsICJCIikpOwotfQotCi1URVNUKENvbmZpZ0NhY2hlVGVzdCwgcmVtb3ZlX3NlY3Rpb25fdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJDIiwgIkQiKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1NlY3Rpb24oIkEiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNTZWN0aW9uKCJBQTpCQjpDQzpERDpFRTpGRiIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1Byb3BlcnR5KCJBIiwgIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLlJlbW92ZVNlY3Rpb24oIkFBOkJCOkNDOkREOkVFOkZGIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuUmVtb3ZlU2VjdGlvbigiQSIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJCIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1Byb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIikpOwotfQotCi1URVNUKENvbmZpZ0NhY2hlVGVzdCwgcmVtb3ZlX3Byb3BlcnR5X3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQyIsICJEIik7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNTZWN0aW9uKCJBIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzU2VjdGlvbigiQUE6QkI6Q0M6REQ6RUU6RkYiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJCIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzUHJvcGVydHkoIkFBOkJCOkNDOkREOkVFOkZGIiwgIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQyIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLlJlbW92ZVByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1Byb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkdldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIikpOwotfQotCi1URVNUKENvbmZpZ0NhY2hlVGVzdCwgcmVtb3ZlX2FsbF9wcm9wZXJ0aWVzX2Zyb21fc2VjdGlvbl90ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMDAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBIiwgIkIiLCAiQyIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkFBOkJCOkNDOkREOkVFOkZGIiwgIkIiLCAiQyIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkFBOkJCOkNDOkREOkVFOkZGIiwgIkMiLCAiRCIpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzU2VjdGlvbigiQSIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1NlY3Rpb24oIkFBOkJCOkNDOkREOkVFOkZGIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzUHJvcGVydHkoIkEiLCAiQiIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1Byb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzUHJvcGVydHkoIkFBOkJCOkNDOkREOkVFOkZGIiwgIkMiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5SZW1vdmVTZWN0aW9uKCJBQTpCQjpDQzpERDpFRTpGRiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNTZWN0aW9uKCJBQTpCQjpDQzpERDpFRTpGRiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5HZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQyIpKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIGdldF9wZXJzaXN0ZW50X2RldmljZXNfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJDIiwgIkQiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJMaW5rS2V5IiwgIkFBQkJBQUJCQ0NEREVFIik7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIpKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlnLkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgiQ0M6REQ6RUU6RkY6MDA6MTEiKSk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiTGlua0tleSIsICJERUVSREVFUkRFRVIiKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlnLkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiQUE6QkI6Q0M6REQ6RUU6RkYiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5SZW1vdmVQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIpKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlnLkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgiQUE6QkI6Q0M6REQ6RUU6RkYiKSk7Ci19Ci0KLVRFU1QoQ29uZmlnQ2FjaGVUZXN0LCBhcHBvYWNoaW5nX3RlbXBvcmFyeV9jb25maWdfbGltaXRfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMiwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKLSAgICBjb25maWcuU2V0UHJvcGVydHkoR2V0VGVzdEFkZHJlc3MoaSksICJOYW1lIiwgIkhlbGxvIiArIHN0ZDo6dG9fc3RyaW5nKGkpKTsKLSAgICBpZiAoaSAlIDIgPT0gMCkgewotICAgICAgY29uZmlnLlNldFByb3BlcnR5KEdldFRlc3RBZGRyZXNzKGkpLCAiTGlua0tleSIsICJLZXkiICsgc3RkOjp0b19zdHJpbmcoaSkpOwotICAgIH0KLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKLSAgICBpZiAoaSAlIDIgPT0gMCkgewotICAgICAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1NlY3Rpb24oR2V0VGVzdEFkZHJlc3MoaSkpKTsKLSAgICAgIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eShHZXRUZXN0QWRkcmVzcyhpKSwgIkxpbmtLZXkiKSk7Ci0gICAgICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoR2V0VGVzdEFkZHJlc3MoaSksICJOYW1lIiksIE9wdGlvbmFsKFN0ckVxKCJIZWxsbyIgKyBzdGQ6OnRvX3N0cmluZyhpKSkpKTsKLSAgICB9IGVsc2UgaWYgKGkgPj0gNykgewotICAgICAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1NlY3Rpb24oR2V0VGVzdEFkZHJlc3MoaSkpKTsKLSAgICAgIEFTU0VSVF9USEFUKGNvbmZpZy5HZXRQcm9wZXJ0eShHZXRUZXN0QWRkcmVzcyhpKSwgIk5hbWUiKSwgT3B0aW9uYWwoU3RyRXEoIkhlbGxvIiArIHN0ZDo6dG9fc3RyaW5nKGkpKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oR2V0VGVzdEFkZHJlc3MoaSkpKTsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUX1RIQVQoCi0gICAgICBjb25maWcuR2V0UGVyc2lzdGVudFNlY3Rpb25zKCksCi0gICAgICBFbGVtZW50c0FyZShHZXRUZXN0QWRkcmVzcygwKSwgR2V0VGVzdEFkZHJlc3MoMiksIEdldFRlc3RBZGRyZXNzKDQpLCBHZXRUZXN0QWRkcmVzcyg2KSwgR2V0VGVzdEFkZHJlc3MoOCkpKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIHJlbW92ZV9zZWN0aW9uX3dpdGhfcHJvcGVydHlfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJDIiwgIkQiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJCIiwgIkFBQkJBQUJCQ0NEREVFIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBjb25maWcuUmVtb3ZlU2VjdGlvbldpdGhQcm9wZXJ0eSgiQiIpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oIkEiKSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzU2VjdGlvbigiQUE6QkI6Q0M6REQ6RUU6RkYiKSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzU2VjdGlvbigiQ0M6REQ6RUU6RkY6MDA6MTEiKSk7Ci19Ci0KLVRFU1QoQ29uZmlnQ2FjaGVUZXN0LCBwZXJzaXN0ZW50X2NvbmZpZ19jaGFuZ2VkX2NhbGxiYWNrX3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBpbnQgbnVtX2NoYW5nZSA9IDA7Ci0gIGNvbmZpZy5TZXRQZXJzaXN0ZW50Q29uZmlnQ2hhbmdlZENhbGxiYWNrKFsmbnVtX2NoYW5nZV0geyBudW1fY2hhbmdlKys7IH0pOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIEFTU0VSVF9FUShudW1fY2hhbmdlLCAxKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgQVNTRVJUX0VRKG51bV9jaGFuZ2UsIDEpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkFBOkJCOkNDOkREOkVFOkZGIiwgIkMiLCAiRCIpOwotICBBU1NFUlRfRVEobnVtX2NoYW5nZSwgMSk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiQiIsICJBQUJCQUFCQkNDRERFRSIpOwotICBBU1NFUlRfRVEobnVtX2NoYW5nZSwgMSk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBBU1NFUlRfRVEobnVtX2NoYW5nZSwgMik7Ci0gIGNvbmZpZy5SZW1vdmVQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIpOwotICBBU1NFUlRfRVEobnVtX2NoYW5nZSwgMyk7Ci0gIGNvbmZpZy5SZW1vdmVTZWN0aW9uV2l0aFByb3BlcnR5KCJCIik7Ci0gIEFTU0VSVF9FUShudW1fY2hhbmdlLCA0KTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIGZpeF9kZXZpY2VfdHlwZV9pbmNvbnNpc3RlbmN5X3Rlc3QpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQyIsICJEIik7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5GaXhEZXZpY2VUeXBlSW5jb25zaXN0ZW5jaWVzKCkpOwotICBBU1NFUlRfVEhBVCgKLSAgICAgIGNvbmZpZy5HZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiRGV2VHlwZSIpLAotICAgICAgT3B0aW9uYWwoU3RyRXEoc3RkOjp0b19zdHJpbmcoYmx1ZXRvb3RoOjpoY2k6OkRldmljZVR5cGU6OkJSX0VEUikpKSk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiQiIsICJBQUJCQUFCQkNDRERFRSIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjExIiwgIkRldlR5cGUiLCBzdGQ6OnRvX3N0cmluZyhibHVldG9vdGg6OmhjaTo6RGV2aWNlVHlwZTo6QlJfRURSKSk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkZpeERldmljZVR5cGVJbmNvbnNpc3RlbmNpZXMoKSk7Ci0gIEFTU0VSVF9USEFUKAotICAgICAgY29uZmlnLkdldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJEZXZUeXBlIiksCi0gICAgICBPcHRpb25hbChTdHJFcShzdGQ6OnRvX3N0cmluZyhibHVldG9vdGg6OmhjaTo6RGV2aWNlVHlwZTo6QlJfRURSKSkpKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJMRV9LRVlfUEVOQyIsICJBQUJCQUFCQkNDRERFRSIpOwotICBBU1NFUlRfVFJVRShjb25maWcuRml4RGV2aWNlVHlwZUluY29uc2lzdGVuY2llcygpKTsKLSAgQVNTRVJUX1RIQVQoCi0gICAgICBjb25maWcuR2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjExIiwgIkRldlR5cGUiKSwKLSAgICAgIE9wdGlvbmFsKFN0ckVxKHN0ZDo6dG9fc3RyaW5nKGJsdWV0b290aDo6aGNpOjpEZXZpY2VUeXBlOjpEVUFMKSkpKTsKLSAgY29uZmlnLlJlbW92ZVByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJMaW5rS2V5Iik7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5GaXhEZXZpY2VUeXBlSW5jb25zaXN0ZW5jaWVzKCkpOwotICBBU1NFUlRfVEhBVCgKLSAgICAgIGNvbmZpZy5HZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiRGV2VHlwZSIpLAotICAgICAgT3B0aW9uYWwoU3RyRXEoc3RkOjp0b19zdHJpbmcoYmx1ZXRvb3RoOjpoY2k6OkRldmljZVR5cGU6OkxFKSkpKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIHRlc3RfZ2V0X3NlY3Rpb25fd2l0aF9wcm9wZXJ0eSkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpFRiIsICJDIiwgIkQiKTsKLSAgQVNTRVJUX1RIQVQoCi0gICAgICBjb25maWcuR2V0U2VjdGlvbk5hbWVzV2l0aFByb3BlcnR5KCJCIiksCi0gICAgICBFbGVtZW50c0FyZSgKLSAgICAgICAgICBTZWN0aW9uQW5kUHJvcGVydHlWYWx1ZXsuc2VjdGlvbiA9ICJBIiwgLnByb3BlcnR5ID0gIkMifSwKLSAgICAgICAgICBTZWN0aW9uQW5kUHJvcGVydHlWYWx1ZXsuc2VjdGlvbiA9ICJBQTpCQjpDQzpERDpFRTpGRiIsIC5wcm9wZXJ0eSA9ICJDIn0pKTsKLX0KLQotVEVTVChDb25maWdDYWNoZVRlc3QsIHRlc3RfZ2V0X3NlY3Rpb25zX21hdGNoaW5nX2F0X2xlYXN0X29uZV9wcm9wZXJ0eSkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpFRiIsICJDIiwgIkQiKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc0F0TGVhc3RPbmVNYXRjaGluZ1Byb3BlcnRpZXNJblNlY3Rpb24oIkFBOkJCOkNDOkREOkVFOkZGIiwgeyJCIiwgIkMiLCAiRCJ9KSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNBdExlYXN0T25lTWF0Y2hpbmdQcm9wZXJ0aWVzSW5TZWN0aW9uKCJBIiwgeyJCIiwgIkMiLCAiRCJ9KSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzQXRMZWFzdE9uZU1hdGNoaW5nUHJvcGVydGllc0luU2VjdGlvbigiQUE6QkI6Q0M6REQ6RUU6RkYiLCB7IkJDIiwgIkQifSkpOwotfQotCi1URVNUKENvbmZpZ0NhY2hlVGVzdCwgdGVzdF9lbXB0eV9wZXJzaXN0ZW50X3Byb3BlcnRpZXMpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwge30pOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RUYiLCAiQyIsICJEIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RUYiLCAiTGlua0tleSIsICJEIik7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNBdExlYXN0T25lTWF0Y2hpbmdQcm9wZXJ0aWVzSW5TZWN0aW9uKCJBQTpCQjpDQzpERDpFRTpGRiIsIHsiQiIsICJDIiwgIkQifSkpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzQXRMZWFzdE9uZU1hdGNoaW5nUHJvcGVydGllc0luU2VjdGlvbigiQSIsIHsiQiIsICJDIiwgIkQifSkpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc0F0TGVhc3RPbmVNYXRjaGluZ1Byb3BlcnRpZXNJblNlY3Rpb24oIkFBOkJCOkNDOkREOkVFOkZGIiwgeyJCQyIsICJEIn0pKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlnLkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2RldmljZS5jYyBiL2dkL3N0b3JhZ2UvZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZiMzBmLi4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdG9yYWdlL2RldmljZS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY2xhc3NpY19kZXZpY2UuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZV9oZWxwZXIuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2xlX2RldmljZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotdXNpbmcgaGNpOjpEZXZpY2VUeXBlOwotCi1uYW1lc3BhY2UgewotLy8gVE9ETyhzaXl1YW5oKTogYWxzbyBkZWZpbmVkIGluIHN0b3JhZ2UvbGVfZGV2aWNlLmNjCi1jb25zdCBzdGQ6OnN0cmluZyBrTGVJZGVudGl0eUFkZHJlc3NLZXkgPSAiTGVJZGVudGl0eUFkZHIiOwotY29uc3Qgc3RkOjpzdHJpbmcga0xlTGVnYWN5UHNldWRvQWRkciA9ICJMZUxlZ2FjeVBzZXVkb0FkZHIiOwotCi1zdGQ6OnN0cmluZyBHZXRDb25maWdTZWN0aW9uKAotICAgIENvbmZpZ0NhY2hlKiBjb25maWcsIGNvbnN0IGhjaTo6QWRkcmVzcyYga2V5X2FkZHJlc3MsIERldmljZTo6Q29uZmlnS2V5QWRkcmVzc1R5cGUga2V5X2FkZHJlc3NfdHlwZSkgewotICBBU1NFUlRfTE9HKGNvbmZpZyAhPSBudWxscHRyLCAiY29uZmlnIGNhbm5vdCBiZSBudWxsIik7Ci0gIEFTU0VSVF9MT0coIWtleV9hZGRyZXNzLklzRW1wdHkoKSwgImtleV9hZGRyZXNzIGNhbm5vdCBiZSBlbXB0eSIpOwotICAvLyBhc3N1bWUgbG93ZXIgY2FzZQotICBhdXRvIGtleV9hZGRyZXNzX3N0cmluZyA9IGtleV9hZGRyZXNzLlRvU3RyaW5nKCk7Ci0gIHN3aXRjaCAoa2V5X2FkZHJlc3NfdHlwZSkgewotICAgIGNhc2UgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVHQUNZX0tFWV9BRERSRVNTOgotICAgIGNhc2UgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6Q0xBU1NJQ19BRERSRVNTOgotICAgICAgcmV0dXJuIGtleV9hZGRyZXNzX3N0cmluZzsKLSAgICBjYXNlIERldmljZTo6Q29uZmlnS2V5QWRkcmVzc1R5cGU6OkxFX0lERU5USVRZX0FERFJFU1M6Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlY3Rpb25fYW5kX3Byb3BlcnR5IDogY29uZmlnLT5HZXRTZWN0aW9uTmFtZXNXaXRoUHJvcGVydHkoa0xlSWRlbnRpdHlBZGRyZXNzS2V5KSkgewotICAgICAgICBpZiAoc2VjdGlvbl9hbmRfcHJvcGVydHkucHJvcGVydHkgPT0ga2V5X2FkZHJlc3Nfc3RyaW5nKSB7Ci0gICAgICAgICAgcmV0dXJuIHNlY3Rpb25fYW5kX3Byb3BlcnR5LnNlY3Rpb247Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBrZXlfYWRkcmVzc19zdHJpbmc7Ci0gICAgY2FzZSBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRV9MRUdBQ1lfUFNFVURPX0FERFJFU1M6Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlY3Rpb25fYW5kX3Byb3BlcnR5IDogY29uZmlnLT5HZXRTZWN0aW9uTmFtZXNXaXRoUHJvcGVydHkoa0xlTGVnYWN5UHNldWRvQWRkcikpIHsKLSAgICAgICAgaWYgKHNlY3Rpb25fYW5kX3Byb3BlcnR5LnByb3BlcnR5ID09IGtleV9hZGRyZXNzX3N0cmluZykgewotICAgICAgICAgIHJldHVybiBzZWN0aW9uX2FuZF9wcm9wZXJ0eS5zZWN0aW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBPbmUgY2Fubm90IGNyZWF0ZSBhIG5ldyBkZXZpY2UganVzdCB1c2luZyBMRSBsZWdhY3kgcHNldWRvIGFkZHJlc3MKLSAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBrZXlfYWRkcmVzc190eXBlICVkIiwgc3RhdGljX2Nhc3Q8aW50PihrZXlfYWRkcmVzc190eXBlKSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZ192aWV3PiBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyA9IHsKLSAgICAiTGlua0tleSIsICJMRV9LRVlfUEVOQyIsICJMRV9LRVlfUElEIiwgIkxFX0tFWV9QQ1NSSyIsICJMRV9LRVlfTEVOQyIsICJMRV9LRVlfTENTUksifTsKLQotRGV2aWNlOjpEZXZpY2UoCi0gICAgQ29uZmlnQ2FjaGUqIGNvbmZpZywKLSAgICBDb25maWdDYWNoZSogbWVtb3J5X29ubHlfY29uZmlnLAotICAgIGNvbnN0IGhjaTo6QWRkcmVzcyYga2V5X2FkZHJlc3MsCi0gICAgQ29uZmlnS2V5QWRkcmVzc1R5cGUga2V5X2FkZHJlc3NfdHlwZSkKLSAgICA6IERldmljZShjb25maWcsIG1lbW9yeV9vbmx5X2NvbmZpZywgR2V0Q29uZmlnU2VjdGlvbihjb25maWcsIGtleV9hZGRyZXNzLCBrZXlfYWRkcmVzc190eXBlKSkge30KLQotRGV2aWNlOjpEZXZpY2UoQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZywgc3RkOjpzdHJpbmcgc2VjdGlvbikKLSAgICA6IGNvbmZpZ18oY29uZmlnKSwgbWVtb3J5X29ubHlfY29uZmlnXyhtZW1vcnlfb25seV9jb25maWcpLCBzZWN0aW9uXyhzdGQ6Om1vdmUoc2VjdGlvbikpIHt9Ci0KLWJvb2wgRGV2aWNlOjpFeGlzdHMoKSB7Ci0gIHJldHVybiBjb25maWdfLT5IYXNTZWN0aW9uKHNlY3Rpb25fKTsKLX0KLQotTXV0YXRpb25FbnRyeSBEZXZpY2U6OlJlbW92ZUZyb21Db25maWcoKSB7Ci0gIHJldHVybiBNdXRhdGlvbkVudHJ5OjpSZW1vdmUoTXV0YXRpb25FbnRyeTo6UHJvcGVydHlUeXBlOjpOT1JNQUwsIHNlY3Rpb25fKTsKLX0KLQotTXV0YXRpb25FbnRyeSBEZXZpY2U6OlJlbW92ZUZyb21UZW1wQ29uZmlnKCkgewotICByZXR1cm4gTXV0YXRpb25FbnRyeTo6UmVtb3ZlKE11dGF0aW9uRW50cnk6OlByb3BlcnR5VHlwZTo6TUVNT1JZX09OTFksIHNlY3Rpb25fKTsKLX0KLQotTGVEZXZpY2UgRGV2aWNlOjpMZSgpIHsKLSAgYXV0byBkZXZpY2VfdHlwZSA9IEdldERldmljZVR5cGUoKTsKLSAgQVNTRVJUKGRldmljZV90eXBlKTsKLSAgQVNTRVJUKGRldmljZV90eXBlID09IERldmljZVR5cGU6OkxFIHx8IGRldmljZV90eXBlID09IERldmljZVR5cGU6OkRVQUwpOwotICByZXR1cm4gTGVEZXZpY2UoY29uZmlnXywgbWVtb3J5X29ubHlfY29uZmlnXywgc2VjdGlvbl8pOwotfQotCi1DbGFzc2ljRGV2aWNlIERldmljZTo6Q2xhc3NpYygpIHsKLSAgYXV0byBkZXZpY2VfdHlwZSA9IEdldERldmljZVR5cGUoKTsKLSAgQVNTRVJUKGRldmljZV90eXBlKTsKLSAgQVNTRVJUKGRldmljZV90eXBlID09IERldmljZVR5cGU6OkJSX0VEUiB8fCBkZXZpY2VfdHlwZSA9PSBEZXZpY2VUeXBlOjpEVUFMKTsKLSAgcmV0dXJuIENsYXNzaWNEZXZpY2UoY29uZmlnXywgbWVtb3J5X29ubHlfY29uZmlnXywgc2VjdGlvbl8pOwotfQotCi1oY2k6OkFkZHJlc3MgRGV2aWNlOjpHZXRBZGRyZXNzKCkgY29uc3QgewotICAvLyBzZWN0aW9uIG5hbWUgb2YgYSBkZXZpY2UgaXMgaXRzIGFkZHJlc3MKLSAgYXV0byBhZGRyID0gaGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKHNlY3Rpb25fKTsKLSAgQVNTRVJUKGFkZHIuaGFzX3ZhbHVlKCkpOwotICByZXR1cm4gYWRkci52YWx1ZSgpOwotfQotCi1zdGQ6OnN0cmluZyBEZXZpY2U6OlRvTG9nU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gc2VjdGlvbl87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2RldmljZS5oIGIvZ2Qvc3RvcmFnZS9kZXZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxMGY1Ny4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImhjaS9jbGFzc19vZl9kZXZpY2UuaCIKLSNpbmNsdWRlICJoY2kvZW51bV9oZWxwZXIuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlX2hlbHBlci5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbXV0YXRpb25fZW50cnkuaCIKLSNpbmNsdWRlICJzdG9yYWdlL3NlcmlhbGl6YWJsZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotY2xhc3MgTGVEZXZpY2U7Ci1jbGFzcyBDbGFzc2ljRGV2aWNlOwotCi0vLyBNYWtlIHN1cmUgb3VyIG1hY3JvIGlzIHVzZWQKLSNpZmRlZiBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIKLXN0YXRpY19hc3NlcnQoZmFsc2UsICJHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoKSBtdXN0IGJlIHVuaXF1ZWx5IGRlZmluZWQgb25jZSBpbiB0aGlzIGZpbGUiKTsKLSNlbmRpZgotCi0jZGVmaW5lIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihOQU1FLCBSRVRVUk5fVFlQRSwgUFJPUEVSVFlfS0VZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RkOjpvcHRpb25hbDxSRVRVUk5fVFlQRT4gR2V0IyNOQU1FKCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIENvbmZpZ0NhY2hlSGVscGVyKCpjb25maWdfKS5HZXQ8UkVUVVJOX1RZUEU+KHNlY3Rpb25fLCBQUk9QRVJUWV9LRVkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTXV0YXRpb25FbnRyeSBTZXQjI05BTUUoY29uc3QgUkVUVVJOX1RZUEUmIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIE11dGF0aW9uRW50cnk6OlNldDxSRVRVUk5fVFlQRT4oTXV0YXRpb25FbnRyeTo6UHJvcGVydHlUeXBlOjpOT1JNQUwsIHNlY3Rpb25fLCBQUk9QRVJUWV9LRVksIHZhbHVlKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTXV0YXRpb25FbnRyeSBSZW1vdmUjI05BTUUoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIE11dGF0aW9uRW50cnk6OlJlbW92ZShNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgc2VjdGlvbl8sIFBST1BFUlRZX0tFWSk7ICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8vIE1ha2Ugc3VyZSBvdXIgbWFjcm8gaXMgdXNlZAotI2lmZGVmIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUl9XSVRIX0NVU1RPTV9TRVRURVIKLXN0YXRpY19hc3NlcnQoCi0gICAgZmFsc2UsICJHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVJfV0lUSF9DVVNUT01fU0VUVEVSKCkgbXVzdCBiZSB1bmlxdWVseSBkZWZpbmVkIG9uY2UgaW4gdGhpcyBmaWxlIik7Ci0jZW5kaWYKLQotLy8gRlVOQyBpcyBicmFja2V0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbiB0aGF0IHRha2VzIGEgY29uc3QgUkVUVVJOX1RZUEUmIHZhbHVlIGFuZCByZXR1cm4gUkVUVVJOX1RZUEUKLS8vIGUuZy4geyByZXR1cm4gdmFsdWUgKyAxOyB9Ci0jZGVmaW5lIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUl9XSVRIX0NVU1RPTV9TRVRURVIoTkFNRSwgUkVUVVJOX1RZUEUsIFBST1BFUlRZX0tFWSwgRlVOQykgICAgICAgICAgIFwKLSBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGQ6Om9wdGlvbmFsPFJFVFVSTl9UWVBFPiBHZXQjI05BTUUoKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIENvbmZpZ0NhY2hlSGVscGVyKCpjb25maWdfKS5HZXQ8UkVUVVJOX1RZUEU+KHNlY3Rpb25fLCBQUk9QRVJUWV9LRVkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBNdXRhdGlvbkVudHJ5IFNldCMjTkFNRShjb25zdCBSRVRVUk5fVFlQRSYgdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXV0byBuZXdfdmFsdWUgPSBbdGhpc10oY29uc3QgUkVUVVJOX1RZUEUmIHZhbHVlKSAtPiBSRVRVUk5fVFlQRSBGVU5DKHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gTXV0YXRpb25FbnRyeTo6U2V0PFJFVFVSTl9UWVBFPihNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgc2VjdGlvbl8sIFBST1BFUlRZX0tFWSwgbmV3X3ZhbHVlKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIE11dGF0aW9uRW50cnkgUmVtb3ZlIyNOQU1FKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gTXV0YXRpb25FbnRyeTo6UmVtb3ZlKE11dGF0aW9uRW50cnk6OlByb3BlcnR5VHlwZTo6Tk9STUFMLCBzZWN0aW9uXywgUFJPUEVSVFlfS0VZKTsgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8vIE1ha2Ugc3VyZSBvdXIgbWFjcm8gaXMgdXNlZAotI2lmZGVmIEdFTkVSQVRFX1RFTVBfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSCi1zdGF0aWNfYXNzZXJ0KGZhbHNlLCAiR0VORVJBVEVfVEVNUF9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoKSBtdXN0IGJlIHVuaXF1ZWx5IGRlZmluZWQgb25jZSBpbiB0aGlzIGZpbGUiKTsKLSNlbmRpZgotCi0vLyBNYWNybyB0byBnZW5lcmF0ZSB0ZW1wb2FyYXJ5IHByb3BlcnR5IHRoYXQgZXhpc3RzIGluIG1lbW9yeSBvbmx5Ci0vLyBJdCBpcyBzdWJqZWN0ZWQgdG8gYSBsaW1pdCBvZiAxMCwwMDAgZGV2aWNlcwotLy8gSXQgd2lsbCBiZSBjbGVhcmVkIHdoZW4gdGhlIHN0YWNrIGlzIHJlc3RhcnRlZAotI2RlZmluZSBHRU5FUkFURV9URU1QX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihOQU1FLCBSRVRVUk5fVFlQRSwgUFJPUEVSVFlfS0VZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGQ6Om9wdGlvbmFsPFJFVFVSTl9UWVBFPiBHZXRUZW1wIyNOQU1FKCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBDb25maWdDYWNoZUhlbHBlcigqbWVtb3J5X29ubHlfY29uZmlnXykuR2V0PFJFVFVSTl9UWVBFPihzZWN0aW9uXywgUFJPUEVSVFlfS0VZKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBNdXRhdGlvbkVudHJ5IFNldFRlbXAjI05BTUUoY29uc3QgUkVUVVJOX1RZUEUmIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBNdXRhdGlvbkVudHJ5OjpTZXQ8UkVUVVJOX1RZUEU+KE11dGF0aW9uRW50cnk6OlByb3BlcnR5VHlwZTo6TUVNT1JZX09OTFksIHNlY3Rpb25fLCBQUk9QRVJUWV9LRVksIHZhbHVlKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBNdXRhdGlvbkVudHJ5IFJlbW92ZVRlbXAjI05BTUUoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBNdXRhdGlvbkVudHJ5OjpSZW1vdmUoTXV0YXRpb25FbnRyeTo6UHJvcGVydHlUeXBlOjpNRU1PUllfT05MWSwgc2VjdGlvbl8sIFBST1BFUlRZX0tFWSk7ICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8vIEEgdGhpbmsgd3JhcHBlciBvZiBkZXZpY2UgaW4gQ29uZmlnQ2FjaGUsIGFsbG93aW5nIGVhc3kgYWNjZXNzIHRvIHZhcmlvdXMgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzIG9mIGEgQmx1ZXRvb3RoIGRldmljZQotLy8KLS8vIERldmljZSwgTGVEZXZpY2UsIGFuZCBDbGFzc2ljIGRldmljZSBvYmplY3RzIGFyZSBmdWxseSBjb3B5YWJsZSwgY29tcGFyYWJsZSBoYXNoYWJsZQotLy8KLS8vIEEgbmV3bHkgY3JlYXRlZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbnkgRGV2aWNlVHlwZSBpbmZvcm1hdGlvbiBhbmQgdXNlciBjYW4gb25seSByZWFkIG9yIHdyaXRlIHRoZSB2YWx1ZXMgaW4gdGhpcwotLy8gY29tbW9uIERldmljZSBhYnN0cmFjdGlvbiBsYXllci4KLS8vCi0vLyBBcyBzb29uIGFzIGEgdXNlciBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIGRldmljZSwgdGhleSBzaG91bGQgY2FsbCBTZXREZXZpY2VUeXBlKCkgdG8gYXNzaWduIGRldmljZSB0byBhIHR5cGUKLS8vIEFmdGVyIHRoYXQsIENsYXNzaWMoKSBvciBMZSgpIHdpbGwgcmV0dXJuIGludGVyZmFjZXMgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIGRlZXBlciBsYXllciBwcm9wZXJ0aWVzCi1jbGFzcyBEZXZpY2UgewotIHB1YmxpYzoKLSAgZW51bSBDb25maWdLZXlBZGRyZXNzVHlwZSB7IExFR0FDWV9LRVlfQUREUkVTUywgQ0xBU1NJQ19BRERSRVNTLCBMRV9JREVOVElUWV9BRERSRVNTLCBMRV9MRUdBQ1lfUFNFVURPX0FERFJFU1MgfTsKLQotICBEZXZpY2UoCi0gICAgICBDb25maWdDYWNoZSogY29uZmlnLAotICAgICAgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZywKLSAgICAgIGNvbnN0IGhjaTo6QWRkcmVzcyYga2V5X2FkZHJlc3MsCi0gICAgICBDb25maWdLZXlBZGRyZXNzVHlwZSBrZXlfYWRkcmVzc190eXBlKTsKLSAgRGV2aWNlKENvbmZpZ0NhY2hlKiBjb25maWcsIENvbmZpZ0NhY2hlKiBtZW1vcnlfb25seV9jb25maWcsIHN0ZDo6c3RyaW5nIHNlY3Rpb24pOwotCi0gIC8vIGZvciBtb3ZlCi0gIERldmljZShEZXZpY2UmJiBvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OwotICBEZXZpY2UmIG9wZXJhdG9yPShEZXZpY2UmJiBvdGhlcikgbm9leGNlcHQgPSBkZWZhdWx0OwotCi0gIC8vIGZvciBjb3B5Ci0gIERldmljZShjb25zdCBEZXZpY2UmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0gIERldmljZSYgb3BlcmF0b3I9KGNvbnN0IERldmljZSYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLQotICAvLyBvcGVyYXRvcnMKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERldmljZSYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uZmlnXyA9PSBvdGhlci5jb25maWdfICYmIG1lbW9yeV9vbmx5X2NvbmZpZ18gPT0gb3RoZXIubWVtb3J5X29ubHlfY29uZmlnXyAmJiBzZWN0aW9uXyA9PSBvdGhlci5zZWN0aW9uXzsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGV2aWNlJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgfQotICBib29sIG9wZXJhdG9yPChjb25zdCBEZXZpY2UmIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbmZpZ18gPCBvdGhlci5jb25maWdfICYmIG1lbW9yeV9vbmx5X2NvbmZpZ18gPCBvdGhlci5tZW1vcnlfb25seV9jb25maWdfICYmIHNlY3Rpb25fIDwgb3RoZXIuc2VjdGlvbl87Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj4oY29uc3QgRGV2aWNlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gKHJocyA8ICp0aGlzKTsKLSAgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgRGV2aWNlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA+IHJocyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IERldmljZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPCByaHMpOwotICB9Ci0KLSAgLy8gQSBuZXdseSBjcmVhdGVkIERldmljZSBvYmplY3QgbWF5IG5vdCBiZSBiYWNrZWQgYnkgYW55IHByb3BlcnRpZXMgaW4gdGhlIENvbmZpZ0NhY2hlLCB3aGVyZSBFeGlzdHMoKSB3aWxsIHJldHVybgotICAvLyBmYWxzZS4gQXMgc29vbiBhcyBhIHByb3BlcnR5IHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBkZXZpY2UuIEV4aXN0cygpIHdpbGwgYmVjb21lIHRydWUuCi0gIGJvb2wgRXhpc3RzKCk7Ci0KLSAgLy8gUmVtb3ZlIGRldmljZSBhbmQgYWxsIGl0cyBwcm9wZXJ0aWVzIGZyb20gY29uZmlnIGFuZCBtZW1vcnktb25seSB0ZW1wIGNvbmZpZwotICBNdXRhdGlvbkVudHJ5IFJlbW92ZUZyb21Db25maWcoKTsKLSAgLy8gUmVtb3ZlIGRldmljZSBhbmQgYWxsIGl0cyBwcm9wZXJ0aWVzIGZyb20gbWVtb3J5LW9ubHkgdGVtcCBjb25maWcsIGJ1dCBrZWVwIGl0ZW1zIGluIG5vcm1hbCBjb25maWcKLSAgTXV0YXRpb25FbnRyeSBSZW1vdmVGcm9tVGVtcENvbmZpZygpOwotCi0gIC8vIE9ubHkgd29ya3Mgd2hlbiBHZXREZXZpY2VUeXBlKCkgcmV0dXJucyBCUl9FRFIgb3IgRFVBTCwgd2lsbCBjcmFzaCBvdGhlcndpc2UKLSAgLy8gRm9yIGZpcnN0IHRpbWUgdXNlLCBwbGVhc2UgU2V0RGV2aWNlVHlwZSgpIHRvIHRoZSByaWdodCB2YWx1ZQotICBDbGFzc2ljRGV2aWNlIENsYXNzaWMoKTsKLQotICAvLyBPbmx5IHdvcmtzIHdoZW4gR2V0RGV2aWNlVHlwZSgpIHJldHVybnMgTEUgb3IgRFVBTCwgd2lsbCBjcmFzaCBvdGhlcndpc2UKLSAgLy8gRm9yIGZpcnN0IHRpbWUgdXNlLCBwbGVhc2UgU2V0RGV2aWNlVHlwZSgpIHRvIHRoZSByaWdodCB2YWx1ZQotICBMZURldmljZSBMZSgpOwotCi0gIC8vIEZvciBsb2dnaW5nIHB1cnBvc2Ugb25seSwgeW91IGNhbid0IGdldCBhIERldmljZSBvYmplY3QgZnJvbSBwYXJzaW5nIGEgc3RkOjpzdHJpbmcKLSAgc3RkOjpzdHJpbmcgVG9Mb2dTdHJpbmcoKSBjb25zdDsKLQotICBoY2k6OkFkZHJlc3MgR2V0QWRkcmVzcygpIGNvbnN0OwotCi0gIC8vIFByb3BlcnR5IG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byBhIGxpbmsga2V5IHVzZWQgaW4gQmx1ZXRvb3RoIENsYXNzaWMgYW5kIExFIGRldmljZQotICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nX3ZpZXc+IGtMaW5rS2V5UHJvcGVydGllczsKLQotIHByaXZhdGU6Ci0gIENvbmZpZ0NhY2hlKiBjb25maWdfOwotICBDb25maWdDYWNoZSogbWVtb3J5X29ubHlfY29uZmlnXzsKLSAgc3RkOjpzdHJpbmcgc2VjdGlvbl87Ci0gIGZyaWVuZCBzdGQ6Omhhc2g8RGV2aWNlPjsKLQotIHB1YmxpYzoKLSAgLy8gTWFjcm8gZ2VuZXJhdGUgZ2V0dGVycywgc2V0dGVycyBhbmQgcmVtb3ZlcnMKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKE5hbWUsIHN0ZDo6c3RyaW5nLCAiTmFtZSIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoQ2xhc3NPZkRldmljZSwgaGNpOjpDbGFzc09mRGV2aWNlLCAiRGV2Q2xhc3MiKTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSX1dJVEhfQ1VTVE9NX1NFVFRFUihEZXZpY2VUeXBlLCBoY2k6OkRldmljZVR5cGUsICJEZXZUeXBlIiwgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxoY2k6OkRldmljZVR5cGU+KHZhbHVlIHwgR2V0RGV2aWNlVHlwZSgpLnZhbHVlX29yKGhjaTo6RGV2aWNlVHlwZTo6VU5LTk9XTikpOwotICB9KTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKE1hbnVmYWN0dXJlckNvZGUsIHVpbnQxNl90LCAiTWFudWZhY3R1cmVyIik7Ci0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihMbXBWZXJzaW9uLCB1aW50OF90LCAiTG1wVmVyIik7Ci0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihMbXBTdWJWZXJzaW9uLCB1aW50MTZfdCwgIkxtcFN1YlZlciIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoU2RwRGlNYW51ZmFjdHVyZXIsIHVpbnQxNl90LCAiU2RwRGlNYW51ZmFjdHVyZXIiKTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKFNkcERpTW9kZWwsIHVpbnQxNl90LCAiU2RwRGlNb2RlbCIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoU2RwRGlIYXJkd2FyZVZlcnNpb24sIHVpbnQxNl90LCAiU2RwRGlIYXJkd2FyZVZlcnNpb24iKTsKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKFNkcERpVmVuZG9ySWRTb3VyY2UsIHVpbnQxNl90LCAiU2RwRGlWZW5kb3JJZFNvdXJjZSIpOwotCi0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihNZXRyaWNzSWQsIGludCwgIk1ldHJpY3NJZCIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoUGluTGVuZ3RoLCBpbnQsICJQaW5MZW5ndGgiKTsKLSAgLy8gdW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBmcm9tIGVwb2NoCi0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihDcmVhdGlvblVuaXhUaW1lc3RhbXAsIGludCwgIkRldkNsYXNzIik7Ci0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihJc0F1dGhlbnRpY2F0ZWQsIGludCwgIklzQXV0aGVudGljYXRlZCIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoUmVxdWlyZXNNaXRtUHJvdGVjdGlvbiwgaW50LCAiUmVxdWlyZXNNaXRtUHJvdGVjdGlvbiIpOwotICBHRU5FUkFURV9QUk9QRVJUWV9HRVRURVJfU0VUVEVSX1JFTU9WRVIoSXNFbmNyeXB0aW9uUmVxdWlyZWQsIGludCwgIklzRW5jcnlwdGlvblJlcXVpcmVkIik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2Ugc3RkIHsKLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgaGFzaDxibHVldG9vdGg6OnN0b3JhZ2U6OkRldmljZT4gewotICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlJiB2YWwpIGNvbnN0IG5vZXhjZXB0IHsKLSAgICBzdGQ6OnNpemVfdCBwb2ludGVyX2hhc2hfMSA9IHN0ZDo6aGFzaDxibHVldG9vdGg6OnN0b3JhZ2U6OkNvbmZpZ0NhY2hlKj57fSh2YWwuY29uZmlnXyk7Ci0gICAgc3RkOjpzaXplX3QgcG9pbnRlcl9oYXNoXzIgPSBzdGQ6Omhhc2g8Ymx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZSo+e30odmFsLmNvbmZpZ18pOwotICAgIHN0ZDo6c2l6ZV90IGFkZHJfaGFzaCA9IHN0ZDo6aGFzaDxzdGQ6OnN0cmluZz57fSh2YWwuc2VjdGlvbl8pOwotICAgIHJldHVybiBhZGRyX2hhc2ggXiAocG9pbnRlcl9oYXNoXzEgPDwgMSkgXiAocG9pbnRlcl9oYXNoXzIgPDwgMik7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2Ugc3RkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9kZXZpY2VfdGVzdC5jYyBiL2dkL3N0b3JhZ2UvZGV2aWNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDY0MDMuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9kZXZpY2VfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RvcmFnZS9kZXZpY2UuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInN0b3JhZ2UvY2xhc3NpY19kZXZpY2UuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2RldmljZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbGVfZGV2aWNlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbi5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpEZXZpY2VUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpNdXRhdGlvbjsKLXVzaW5nIDo6dGVzdGluZzo6RXE7Ci11c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXNSZWdleDsKLXVzaW5nIDo6dGVzdGluZzo6T3B0aW9uYWw7Ci11c2luZyA6OnRlc3Rpbmc6OlN0ckVxOwotCi1URVNUKERldmljZVRlc3QsIGNyZWF0ZV9uZXdfZGV2aWNlX3VzaW5nX2xlZ2FjeV9rZXlfYWRkcmVzcykgewotICBDb25maWdDYWNoZSBjb25maWcoMTAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwLCB7fSk7Ci0KLSAgLy8gQSBuZXcgZGV2aWNlCi0gIEFkZHJlc3MgYWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBEZXZpY2UgZGV2aWNlKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MsIERldmljZTo6Q29uZmlnS2V5QWRkcmVzc1R5cGU6OkxFR0FDWV9LRVlfQUREUkVTUyk7Ci0gIEFTU0VSVF9GQUxTRShkZXZpY2UuRXhpc3RzKCkpOwotICBBU1NFUlRfRkFMU0UoZGV2aWNlLkdldENsYXNzT2ZEZXZpY2UoKSk7Ci0KLSAgLy8gQW4gZXhpc3RpbmcgZGV2aWNlCi0gIEFkZHJlc3MgYWRkcmVzczIgPSB7ezB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmZ9fTsKLSAgY29uZmlnLlNldFByb3BlcnR5KGFkZHJlc3MyLlRvU3RyaW5nKCksICJOYW1lIiwgImhlbGxvIik7Ci0gIERldmljZSBkZXZpY2UyKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MyLCBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRUdBQ1lfS0VZX0FERFJFU1MpOwotICBBU1NFUlRfVFJVRShkZXZpY2UyLkV4aXN0cygpKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlMi5HZXROYW1lKCksIE9wdGlvbmFsKFN0ckVxKCJoZWxsbyIpKSk7Ci0KLSAgLy8gZGV2aWNlcyB3aXRoIHRoZSBzYW1lIGtleSBhZGRyZXNzIGFuZCBjb25maWcgcG9pbnRlciBhcmUgdGhlIHNhbWUKLSAgQWRkcmVzcyBhZGRyZXNzMyA9IHt7MHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZn19OwotICBEZXZpY2UgZGV2aWNlMygmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCBhZGRyZXNzMywgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVHQUNZX0tFWV9BRERSRVNTKTsKLSAgQVNTRVJUX0VRKGRldmljZTIsIGRldmljZTMpOwotICBBU1NFUlRfVFJVRShkZXZpY2UzLkV4aXN0cygpKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlMy5HZXROYW1lKCksIE9wdGlvbmFsKFN0ckVxKCJoZWxsbyIpKSk7Ci19Ci0KLVRFU1QoRGV2aWNlVGVzdCwgY3JlYXRlX25ld19kZXZpY2VfdXNpbmdfY2xhc3NpY19hZGRyZXNzKSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLQotICAvLyBBIG5ldyBkZXZpY2UKLSAgQWRkcmVzcyBhZGRyZXNzID0ge3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIERldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcywgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6Q0xBU1NJQ19BRERSRVNTKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5FeGlzdHMoKSk7Ci0gIEFTU0VSVF9GQUxTRShkZXZpY2UuR2V0Q2xhc3NPZkRldmljZSgpKTsKLQotICAvLyBBbiBleGlzdGluZyBkZXZpY2UKLSAgQWRkcmVzcyBhZGRyZXNzMiA9IHt7MHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZn19OwotICBjb25maWcuU2V0UHJvcGVydHkoYWRkcmVzczIuVG9TdHJpbmcoKSwgIk5hbWUiLCAiaGVsbG8iKTsKLSAgRGV2aWNlIGRldmljZTIoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzczIsIERldmljZTo6Q29uZmlnS2V5QWRkcmVzc1R5cGU6OkNMQVNTSUNfQUREUkVTUyk7Ci0gIEFTU0VSVF9UUlVFKGRldmljZTIuRXhpc3RzKCkpOwotICBBU1NFUlRfVEhBVChkZXZpY2UyLkdldE5hbWUoKSwgT3B0aW9uYWwoU3RyRXEoImhlbGxvIikpKTsKLQotICAvLyBkZXZpY2VzIHdpdGggdGhlIHNhbWUga2V5IGFkZHJlc3MgYW5kIGNvbmZpZyBwb2ludGVyIGFyZSB0aGUgc2FtZQotICBBZGRyZXNzIGFkZHJlc3MzID0ge3sweGFhLCAweGJiLCAweGNjLCAweGRkLCAweGVlLCAweGZmfX07Ci0gIERldmljZSBkZXZpY2UzKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MzLCBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpDTEFTU0lDX0FERFJFU1MpOwotICBBU1NFUlRfRVEoZGV2aWNlMiwgZGV2aWNlMyk7Ci0gIEFTU0VSVF9UUlVFKGRldmljZTMuRXhpc3RzKCkpOwotICBBU1NFUlRfVEhBVChkZXZpY2UzLkdldE5hbWUoKSwgT3B0aW9uYWwoU3RyRXEoImhlbGxvIikpKTsKLX0KLQotVEVTVChEZXZpY2VUZXN0LCBjcmVhdGVfbmV3X2RldmljZV91c2luZ19sZV9pZGVudGl0eV9hZGRyZXNzKSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLQotICAvLyBBIG5ldyBkZXZpY2UKLSAgQWRkcmVzcyBhZGRyZXNzID0ge3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIERldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcywgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVfSURFTlRJVFlfQUREUkVTUyk7Ci0gIEFTU0VSVF9GQUxTRShkZXZpY2UuRXhpc3RzKCkpOwotICBBU1NFUlRfRkFMU0UoZGV2aWNlLkdldENsYXNzT2ZEZXZpY2UoKSk7Ci0KLSAgLy8gQW4gZXhpc3RpbmcgZGV2aWNlCi0gIEFkZHJlc3MgcHNldWRvX2ZpcnN0X3NlZW5fYWRkcmVzcyA9IHt7MHhhYiwgMHhjZCwgMHhlZiwgMHgxMiwgMHgzNCwgMHg1Nn19OwotICBBZGRyZXNzIGxlX2lkZW50aXR5X2FkZHJlc3MgPSB7ezB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmZ9fTsKLSAgLy8gZmlyc3Qgc2VlbiBhZGRyZXNzIHVzZWQgYXMga2V5Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eShwc2V1ZG9fZmlyc3Rfc2Vlbl9hZGRyZXNzLlRvU3RyaW5nKCksICJOYW1lIiwgImhlbGxvIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eShwc2V1ZG9fZmlyc3Rfc2Vlbl9hZGRyZXNzLlRvU3RyaW5nKCksICJMZUlkZW50aXR5QWRkciIsIGxlX2lkZW50aXR5X2FkZHJlc3MuVG9TdHJpbmcoKSk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eShhZGRyZXNzLlRvU3RyaW5nKCksICJOYW1lIiwgIndvcmxkIik7Ci0gIERldmljZSBkZXZpY2UyKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGxlX2lkZW50aXR5X2FkZHJlc3MsIERldmljZTo6Q29uZmlnS2V5QWRkcmVzc1R5cGU6OkxFX0lERU5USVRZX0FERFJFU1MpOwotICBBU1NFUlRfVFJVRShkZXZpY2UyLkV4aXN0cygpKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlMi5HZXROYW1lKCksIE9wdGlvbmFsKFN0ckVxKCJoZWxsbyIpKSk7Ci19Ci0KLVRFU1QoRGV2aWNlVGVzdCwgc2V0X3Byb3BlcnR5KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLSAgQWRkcmVzcyBhZGRyZXNzID0ge3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIERldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcywgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVHQUNZX0tFWV9BRERSRVNTKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5FeGlzdHMoKSk7Ci0gIEFTU0VSVF9GQUxTRShkZXZpY2UuR2V0TmFtZSgpKTsKLSAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gIG11dGF0aW9uLkFkZChkZXZpY2UuU2V0TmFtZSgiaGVsbG8gd29ybGQhIikpOwotICBtdXRhdGlvbi5Db21taXQoKTsKLSAgQVNTRVJUX1RSVUUoZGV2aWNlLkV4aXN0cygpKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlLkdldE5hbWUoKSwgT3B0aW9uYWwoU3RyRXEoImhlbGxvIHdvcmxkISIpKSk7Ci19Ci0KLVRFU1QoRGV2aWNlVGVzdCwgc2V0X2RldmljZV90eXBlKSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLSAgQWRkcmVzcyBhZGRyZXNzID0ge3sweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2fX07Ci0gIERldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcywgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVHQUNZX0tFWV9BRERSRVNTKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5FeGlzdHMoKSk7Ci0gIEFTU0VSVF9GQUxTRShkZXZpY2UuR2V0TmFtZSgpKTsKLSAgewotICAgIE11dGF0aW9uIG11dGF0aW9uKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcpOwotICAgIG11dGF0aW9uLkFkZChkZXZpY2UuU2V0RGV2aWNlVHlwZShEZXZpY2VUeXBlOjpCUl9FRFIpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfVEhBVChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpLCBPcHRpb25hbChFcShEZXZpY2VUeXBlOjpCUl9FRFIpKSk7Ci0gIHsKLSAgICBNdXRhdGlvbiBtdXRhdGlvbigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnKTsKLSAgICBtdXRhdGlvbi5BZGQoZGV2aWNlLlNldERldmljZVR5cGUoRGV2aWNlVHlwZTo6TEUpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfVEhBVChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpLCBPcHRpb25hbChFcShEZXZpY2VUeXBlOjpEVUFMKSkpOwotfQotCi1URVNUKERldmljZVRlc3QsIGdldF9sZV9hbmRfYnJlZHIpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZygxMCwge30pOwotICBBZGRyZXNzIGFkZHJlc3MgPSB7ezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDZ9fTsKLSAgRGV2aWNlIGRldmljZSgmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCBhZGRyZXNzLCBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRUdBQ1lfS0VZX0FERFJFU1MpOwotICBBU1NFUlRfRkFMU0UoZGV2aWNlLkdldERldmljZVR5cGUoKSk7Ci0gIEFTU0VSVF9ERUFUSCh7IGRldmljZS5MZSgpOyB9LCBNYXRjaGVzUmVnZXgoIi4qIikpOwotICBBU1NFUlRfREVBVEgoeyBkZXZpY2UuQ2xhc3NpYygpOyB9LCBNYXRjaGVzUmVnZXgoIi4qIikpOwotCi0gIC8vIGNsYXNzaWMKLSAgewotICAgIE11dGF0aW9uIG11dGF0aW9uKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcpOwotICAgIG11dGF0aW9uLkFkZChkZXZpY2UuU2V0RGV2aWNlVHlwZShEZXZpY2VUeXBlOjpCUl9FRFIpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfVEhBVChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpLCBPcHRpb25hbChFcShEZXZpY2VUeXBlOjpCUl9FRFIpKSk7Ci0gIGF1dG8gY2xhc3NpY19kZXZpY2UgPSBkZXZpY2UuQ2xhc3NpYygpOwotICBBU1NFUlRfVEhBVChjbGFzc2ljX2RldmljZS5QYXJlbnQoKSwgRXEoZGV2aWNlKSk7Ci0KLSAgLy8gbGUKLSAgewotICAgIE11dGF0aW9uIG11dGF0aW9uKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcpOwotICAgIG11dGF0aW9uLkFkZChkZXZpY2UuUmVtb3ZlRGV2aWNlVHlwZSgpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfRkFMU0UoZGV2aWNlLkdldERldmljZVR5cGUoKSk7Ci0gIHsKLSAgICBNdXRhdGlvbiBtdXRhdGlvbigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnKTsKLSAgICBtdXRhdGlvbi5BZGQoZGV2aWNlLlNldERldmljZVR5cGUoRGV2aWNlVHlwZTo6TEUpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfVEhBVChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpLCBPcHRpb25hbChFcShEZXZpY2VUeXBlOjpMRSkpKTsKLSAgYXV0byBsZV9kZXZpY2UgPSBkZXZpY2UuTGUoKTsKLSAgQVNTRVJUX1RIQVQobGVfZGV2aWNlLlBhcmVudCgpLCBFcShkZXZpY2UpKTsKLQotICAvLyBkdWFsCi0gIHsKLSAgICBNdXRhdGlvbiBtdXRhdGlvbigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnKTsKLSAgICBtdXRhdGlvbi5BZGQoZGV2aWNlLlJlbW92ZURldmljZVR5cGUoKSk7Ci0gICAgbXV0YXRpb24uQ29tbWl0KCk7Ci0gIH0KLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5HZXREZXZpY2VUeXBlKCkpOwotICB7Ci0gICAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gICAgbXV0YXRpb24uQWRkKGRldmljZS5TZXREZXZpY2VUeXBlKERldmljZVR5cGU6OkRVQUwpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfVEhBVChkZXZpY2UuR2V0RGV2aWNlVHlwZSgpLCBPcHRpb25hbChFcShEZXZpY2VUeXBlOjpEVUFMKSkpOwotICBjbGFzc2ljX2RldmljZSA9IGRldmljZS5DbGFzc2ljKCk7Ci0gIEFTU0VSVF9USEFUKGNsYXNzaWNfZGV2aWNlLlBhcmVudCgpLCBFcShkZXZpY2UpKTsKLSAgbGVfZGV2aWNlID0gZGV2aWNlLkxlKCk7Ci0gIEFTU0VSVF9USEFUKGxlX2RldmljZS5QYXJlbnQoKSwgRXEoZGV2aWNlKSk7Ci19Ci0KLVRFU1QoRGV2aWNlVGVzdCwgZXF1YWxpdHlfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwLCB7fSk7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBEZXZpY2UgZGV2aWNlMSgmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCBhZGRyZXNzLCBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRUdBQ1lfS0VZX0FERFJFU1MpOwotICBEZXZpY2UgZGV2aWNlMigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCBhZGRyZXNzLCBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRUdBQ1lfS0VZX0FERFJFU1MpOwotICBBU1NFUlRfRVEoZGV2aWNlMSwgZGV2aWNlMik7Ci0KLSAgLy8gZGlmZmVyZW50IGNvbmZpZyBjYWNoZQotICBDb25maWdDYWNoZSBjb25maWdfYWx0KDEwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZ19hbHQoMTAsIHt9KTsKLSAgRGV2aWNlIGRldmljZTMoJmNvbmZpZ19hbHQsICZtZW1vcnlfb25seV9jb25maWdfYWx0LCBhZGRyZXNzLCBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRUdBQ1lfS0VZX0FERFJFU1MpOwotICBBU1NFUlRfTkUoZGV2aWNlMSwgZGV2aWNlMyk7Ci0KLSAgLy8gZGlmZmVyZW50IGFkZHJlc3MKLSAgQWRkcmVzcyBhZGRyZXNzX2FsdCA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwN319OwotICBEZXZpY2UgZGV2aWNlNCgmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnLCBhZGRyZXNzX2FsdCwgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVHQUNZX0tFWV9BRERSRVNTKTsKLSAgQVNTRVJUX05FKGRldmljZTEsIGRldmljZTQpOwotCi0gIERldmljZSBkZXZpY2U1ID0gc3RkOjptb3ZlKGRldmljZTIpOwotICBBU1NFUlRfRVEoZGV2aWNlMSwgZGV2aWNlNSk7Ci0KLSAgY29uZmlnLlNldFByb3BlcnR5KGFkZHJlc3MuVG9TdHJpbmcoKSwgIk5hbWUiLCAiaGVsbG8iKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlNS5HZXROYW1lKCksIE9wdGlvbmFsKFN0ckVxKCJoZWxsbyIpKSk7Ci0gIEFTU0VSVF9USEFUKGRldmljZTEuR2V0TmFtZSgpLCBPcHRpb25hbChTdHJFcSgiaGVsbG8iKSkpOwotfQotCi1URVNUKERldmljZVRlc3QsIHJlbW92ZV9jb25maWdfdGVzdCkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwLCB7fSk7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IHt7MHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZn19OwotICBjb25maWcuU2V0UHJvcGVydHkoYWRkcmVzcy5Ub1N0cmluZygpLCAiTmFtZSIsICJoZWxsbyIpOwotICBEZXZpY2UgZGV2aWNlKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MsIERldmljZTo6Q29uZmlnS2V5QWRkcmVzc1R5cGU6OkxFR0FDWV9LRVlfQUREUkVTUyk7Ci0gIEFTU0VSVF9UUlVFKGRldmljZS5FeGlzdHMoKSk7Ci0gIEFTU0VSVF9USEFUKGRldmljZS5HZXROYW1lKCksIE9wdGlvbmFsKFN0ckVxKCJoZWxsbyIpKSk7Ci0gIE11dGF0aW9uIG11dGF0aW9uKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcpOwotICBtdXRhdGlvbi5BZGQoZGV2aWNlLlJlbW92ZUZyb21Db25maWcoKSk7Ci0gIG11dGF0aW9uLkNvbW1pdCgpOwotICBBU1NFUlRfRkFMU0UoZGV2aWNlLkV4aXN0cygpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5HZXRQcm9wZXJ0eShhZGRyZXNzLlRvU3RyaW5nKCksICJOYW1lIikpOwotfQotCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2xlX2RldmljZS5jYyBiL2dkL3N0b3JhZ2UvbGVfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZhNTAzLi4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvbGVfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0b3JhZ2UvbGVfZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1uYW1lc3BhY2UgewotY29uc3Qgc3RkOjpzdHJpbmcga0xlSWRlbnRpdHlBZGRyZXNzS2V5ID0gIkxlSWRlbnRpdHlBZGRyIjsKLS8vIFRPRE8oc2l5dWFuaCk6IGNoZWNrIGlmIHdlIHN0aWxsIG5lZWQgdGhlc2Uga2V5cyBpbiBHRAotLy8gY29uc3Qgc3RkOjpzdHJpbmcga0xlUGVuY0tleSA9ICJMRV9LRVlfUEVOQyI7Ci0vLyBjb25zdCBzdGQ6OnN0cmluZyBrTGVQaWRLZXkgPSAiTEVfS0VZX1BFTkMiOwotLy8gY29uc3Qgc3RkOjpzdHJpbmcga0xlUHNya0tleSA9ICJMRV9LRVlfUEVOQyI7Ci0vLyBjb25zdCBzdGQ6OnN0cmluZyBrTGVMZW5jS2V5ID0gIkxFX0tFWV9QRU5DIjsKLS8vIGNvbnN0IHN0ZDo6c3RyaW5nIGtMZUxjc3JrS2V5ID0gIkxFX0tFWV9QRU5DIjsKLS8vIGNvbnN0IHN0ZDo6c3RyaW5nIGtMZUxpZEtleSA9ICJMRV9LRVlfUEVOQyI7Ci19ICAvLyBuYW1lc3BhY2UKLQotY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nX3ZpZXc+IExlRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMgPSB7Ci0gICAgIkxFX0tFWV9QRU5DIiwgIkxFX0tFWV9QSUQiLCAiTEVfS0VZX1BDU1JLIiwgIkxFX0tFWV9MRU5DIiwgIkxFX0tFWV9MQ1NSSyJ9OwotCi1MZURldmljZTo6TGVEZXZpY2UoQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZywgc3RkOjpzdHJpbmcgc2VjdGlvbikKLSAgICA6IGNvbmZpZ18oY29uZmlnKSwgbWVtb3J5X29ubHlfY29uZmlnXyhtZW1vcnlfb25seV9jb25maWcpLCBzZWN0aW9uXyhzdGQ6Om1vdmUoc2VjdGlvbikpIHt9Ci0KLURldmljZSBMZURldmljZTo6UGFyZW50KCkgewotICByZXR1cm4gRGV2aWNlKGNvbmZpZ18sIG1lbW9yeV9vbmx5X2NvbmZpZ18sIHNlY3Rpb25fKTsKLX0KLQotc3RkOjpzdHJpbmcgTGVEZXZpY2U6OlRvTG9nU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gc2VjdGlvbl87Ci19Ci0KLWJvb2wgTGVEZXZpY2U6OklzUGFpcmVkKCkgY29uc3QgewotICAvLyBUaGlzIGZpcnN0IGNoZWNrIGlzIGhlcmUgb25seSB0byBzcGVlZCB1cCB0aGUgY2hlY2tpbmcgcHJvY2VzcwotICBpZiAoIWNvbmZpZ18tPklzUGVyc2lzdGVudFNlY3Rpb24oc2VjdGlvbl8pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBjb25maWdfLT5IYXNBdExlYXN0T25lTWF0Y2hpbmdQcm9wZXJ0aWVzSW5TZWN0aW9uKHNlY3Rpb25fLCBrTGlua0tleVByb3BlcnRpZXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvbGVfZGV2aWNlLmggYi9nZC9zdG9yYWdlL2xlX2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWUzMDQ1Li4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvbGVfZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9kZXZpY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLWNsYXNzIExlRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIExlRGV2aWNlKENvbmZpZ0NhY2hlKiBjb25maWcsIENvbmZpZ0NhY2hlKiBtZW1vcnlfb25seV9jb25maWcsIHN0ZDo6c3RyaW5nIHNlY3Rpb24pOwotCi0gIC8vIGZvciBtb3ZlCi0gIExlRGV2aWNlKExlRGV2aWNlJiYgb3RoZXIpIG5vZXhjZXB0ID0gZGVmYXVsdDsKLSAgTGVEZXZpY2UmIG9wZXJhdG9yPShMZURldmljZSYmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0KLSAgLy8gZm9yIGNvcHkKLSAgTGVEZXZpY2UoY29uc3QgTGVEZXZpY2UmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0gIExlRGV2aWNlJiBvcGVyYXRvcj0oY29uc3QgTGVEZXZpY2UmIG90aGVyKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0KLSAgLy8gb3BlcmF0b3JzCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMZURldmljZSYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uZmlnXyA9PSBvdGhlci5jb25maWdfICYmIG1lbW9yeV9vbmx5X2NvbmZpZ18gPT0gb3RoZXIubWVtb3J5X29ubHlfY29uZmlnXyAmJiBzZWN0aW9uXyA9PSBvdGhlci5zZWN0aW9uXzsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgTGVEZXZpY2UmIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExlRGV2aWNlJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBjb25maWdfIDwgb3RoZXIuY29uZmlnXyAmJiBtZW1vcnlfb25seV9jb25maWdfIDwgb3RoZXIubWVtb3J5X29ubHlfY29uZmlnXyAmJiBzZWN0aW9uXyA8IG90aGVyLnNlY3Rpb25fOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IExlRGV2aWNlJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gKHJocyA8ICp0aGlzKTsKLSAgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgTGVEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID4gcmhzKTsKLSAgfQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgTGVEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzIDwgcmhzKTsKLSAgfQotCi0gIC8vIEdldCB0aGUgcGFyZW50IGRldmljZQotICBEZXZpY2UgUGFyZW50KCk7Ci0KLSAgLy8gRm9yIGxvZ2dpbmcgcHVycG9zZSBvbmx5LCB5b3UgY2FuJ3QgZ2V0IGEgTGVEZXZpY2Ugb2JqZWN0IGZyb20gcGFyc2luZyBhIHN0ZDo6c3RyaW5nCi0gIHN0ZDo6c3RyaW5nIFRvTG9nU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJuIHRydWUgaWYgZGV2aWNlIGhhcyBhIGxpbmsga2V5IGluIG9uZSBvZiB8a0xpbmtLZXlQcm9wZXJ0aWVzfAotICBib29sIElzUGFpcmVkKCkgY29uc3Q7Ci0KLSAgLy8gUHJvcGVydHkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIGEgbGluayBrZXkgdXNlZCBpbiBCbHVldG9vdGggTEUgZGV2aWNlCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmdfdmlldz4ga0xpbmtLZXlQcm9wZXJ0aWVzOwotCi0gcHJpdmF0ZToKLSAgQ29uZmlnQ2FjaGUqIGNvbmZpZ187Ci0gIENvbmZpZ0NhY2hlKiBtZW1vcnlfb25seV9jb25maWdfOwotICBzdGQ6OnN0cmluZyBzZWN0aW9uXzsKLSAgZnJpZW5kIHN0ZDo6aGFzaDxMZURldmljZT47Ci0KLSBwdWJsaWM6Ci0gIC8vIEdldCBMRSBhZGRyZXNzIHR5cGUgb2YgdGhlIGtleSBhZGRyZXNzCi0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihBZGRyZXNzVHlwZSwgaGNpOjpBZGRyZXNzVHlwZSwgIkFkZHJUeXBlIik7Ci0gIC8vIElSSyArIElkZW50aXR5IEFkZHJlc3MgVHlwZSArIElkZW50aXR5IEFkZHJlc3MKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKFBlZXJJZCwgc3RkOjpzdHJpbmcsICJMRV9LRVlfUElEIik7Ci0gIC8vIExUSyArIFJBTkQgKyBFRElWICsgU2VjdXJpdHkgTGV2ZWwgKyBLZXkgTGVuZ3RoCi0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihQZWVyRW5jcnlwdGlvbktleXMsIHN0ZDo6c3RyaW5nLCAiTEVfS0VZX1BFTkMiKTsKLSAgLy8gY291bnRlciArIENTUksgKGNvbm5lY3Rpb24gc2lnbmF0dXJlIHJlc29sdmluZyBrZXkpICsgc2VjdXJpdHkgbGV2ZWwKLSAgR0VORVJBVEVfUFJPUEVSVFlfR0VUVEVSX1NFVFRFUl9SRU1PVkVSKFBlZXJTaWduYXR1cmVSZXNvbHZpbmdLZXlzLCBzdGQ6OnN0cmluZywgIkxFX0tFWV9QQ1NSSyIpOwotCi0gIEdFTkVSQVRFX1BST1BFUlRZX0dFVFRFUl9TRVRURVJfUkVNT1ZFUihMZWdhY3lQc2V1ZG9BZGRyZXNzLCBoY2k6OkFkZHJlc3MsICJMZUxlZ2FjeVBzZXVkb0FkZHIiKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLW5hbWVzcGFjZSBzdGQgewotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGJsdWV0b290aDo6c3RvcmFnZTo6TGVEZXZpY2U+IHsKLSAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBibHVldG9vdGg6OnN0b3JhZ2U6OkxlRGV2aWNlJiB2YWwpIGNvbnN0IG5vZXhjZXB0IHsKLSAgICBzdGQ6OnNpemVfdCBwb2ludGVyX2hhc2hfMSA9IHN0ZDo6aGFzaDxibHVldG9vdGg6OnN0b3JhZ2U6OkNvbmZpZ0NhY2hlKj57fSh2YWwuY29uZmlnXyk7Ci0gICAgc3RkOjpzaXplX3QgcG9pbnRlcl9oYXNoXzIgPSBzdGQ6Omhhc2g8Ymx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZSo+e30odmFsLmNvbmZpZ18pOwotICAgIHN0ZDo6c2l6ZV90IGFkZHJfaGFzaCA9IHN0ZDo6aGFzaDxzdGQ6OnN0cmluZz57fSh2YWwuc2VjdGlvbl8pOwotICAgIHJldHVybiBhZGRyX2hhc2ggXiAocG9pbnRlcl9oYXNoXzEgPDwgMSkgXiAocG9pbnRlcl9oYXNoXzIgPDwgMik7Ci0gIH0KLX07Ci19ICAvLyBuYW1lc3BhY2Ugc3RkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9sZV9kZXZpY2VfdGVzdC5jYyBiL2dkL3N0b3JhZ2UvbGVfZGV2aWNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2Y0ODkuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9sZV9kZXZpY2VfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdG9yYWdlL2RldmljZS5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic3RvcmFnZS9jbGFzc2ljX2RldmljZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbGVfZGV2aWNlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbi5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZTsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjpEZXZpY2VUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpMZURldmljZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6TXV0YXRpb247Ci11c2luZyA6OnRlc3Rpbmc6OkVxOwotdXNpbmcgOjp0ZXN0aW5nOjpPcHRpb25hbDsKLQotVEVTVChMZURldmljZVRlc3QsIGNyZWF0ZV9uZXdfbGVfZGV2aWNlKSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBMZURldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5HZXRBZGRyZXNzVHlwZSgpKTsKLX0KLQotVEVTVChMZURldmljZVRlc3QsIHNldF9wcm9wZXJ0eSkgewotICBDb25maWdDYWNoZSBjb25maWcoMTAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwLCB7fSk7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBMZURldmljZSBkZXZpY2UoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgQVNTRVJUX0ZBTFNFKGRldmljZS5HZXRBZGRyZXNzVHlwZSgpKTsKLSAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gIG11dGF0aW9uLkFkZChkZXZpY2UuU2V0QWRkcmVzc1R5cGUoQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUykpOwotICBtdXRhdGlvbi5Db21taXQoKTsKLSAgQVNTRVJUX1RIQVQoZGV2aWNlLkdldEFkZHJlc3NUeXBlKCksIE9wdGlvbmFsKEVxKEFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpKSk7Ci19Ci0KLVRFU1QoTGVEZXZpY2VUZXN0LCBlcXVhbGl0eV90ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAsIHt9KTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNn19OwotICBMZURldmljZSBkZXZpY2UxKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MuVG9TdHJpbmcoKSk7Ci0gIExlRGV2aWNlIGRldmljZTIoJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZywgYWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgQVNTRVJUX0VRKGRldmljZTEsIGRldmljZTIpOwotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyZXNzMyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwN319OwotICBMZURldmljZSBkZXZpY2UzKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcsIGFkZHJlc3MzLlRvU3RyaW5nKCkpOwotICBBU1NFUlRfTkUoZGV2aWNlMSwgZGV2aWNlMyk7Ci19Ci0KZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvbGVnYWN5X2NvbmZpZ19maWxlLmNjIGIvZ2Qvc3RvcmFnZS9sZWdhY3lfY29uZmlnX2ZpbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDZkZDUuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9sZWdhY3lfY29uZmlnX2ZpbGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RvcmFnZS9sZWdhY3lfY29uZmlnX2ZpbGUuaCIKLQotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJjb21tb24vc3RyaW5ncy5oIgotI2luY2x1ZGUgIm9zL2ZpbGVzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9kZXZpY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLUxlZ2FjeUNvbmZpZ0ZpbGU6OkxlZ2FjeUNvbmZpZ0ZpbGUoc3RkOjpzdHJpbmcgcGF0aCkgOiBwYXRoXyhzdGQ6Om1vdmUocGF0aCkpIHsKLSAgQVNTRVJUKCFwYXRoXy5lbXB0eSgpKTsKLX07Ci0KLXN0ZDo6b3B0aW9uYWw8Q29uZmlnQ2FjaGU+IExlZ2FjeUNvbmZpZ0ZpbGU6OlJlYWQoc2l6ZV90IHRlbXBfZGV2aWNlc19jYXBhY2l0eSkgewotICBBU1NFUlQoIXBhdGhfLmVtcHR5KCkpOwotICBzdGQ6Omlmc3RyZWFtIGNvbmZpZ19maWxlKHBhdGhfKTsKLSAgaWYgKCFjb25maWdfZmlsZSB8fCAhY29uZmlnX2ZpbGUuaXNfb3BlbigpKSB7Ci0gICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8gb3BlbiBmaWxlICclcycsIGVycm9yOiAlcyIsIHBhdGhfLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICBpbnQgbGluZV9udW0gPSAwOwotICBDb25maWdDYWNoZSBjYWNoZSh0ZW1wX2RldmljZXNfY2FwYWNpdHksIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgc3RkOjpzdHJpbmcgbGluZTsKLSAgc3RkOjpzdHJpbmcgc2VjdGlvbihDb25maWdDYWNoZTo6a0RlZmF1bHRTZWN0aW9uTmFtZSk7Ci0gIHdoaWxlIChzdGQ6OmdldGxpbmUoY29uZmlnX2ZpbGUsIGxpbmUpKSB7Ci0gICAgKytsaW5lX251bTsKLSAgICBsaW5lID0gY29tbW9uOjpTdHJpbmdUcmltKHN0ZDo6bW92ZShsaW5lKSk7Ci0gICAgaWYgKGxpbmUuZnJvbnQoKSA9PSAnXDAnIHx8IGxpbmUuZnJvbnQoKSA9PSAnIycpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAobGluZS5mcm9udCgpID09ICdbJykgewotICAgICAgaWYgKGxpbmUuYmFjaygpICE9ICddJykgewotICAgICAgICBMT0dfV0FSTigidW50ZXJtaW5hdGVkIHNlY3Rpb24gbmFtZSBvbiBsaW5lICVkIiwgbGluZV9udW0pOwotICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICAgICAgfQotICAgICAgLy8gUmVhZCAndGVzdCcgZnJvbSAnW3RleHRdJywgaGVuY2UgLTIKLSAgICAgIHNlY3Rpb24gPSBsaW5lLnN1YnN0cigxLCBsaW5lLnNpemUoKSAtIDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhdXRvIHRva2VucyA9IGNvbW1vbjo6U3RyaW5nU3BsaXQobGluZSwgIj0iLCAyKTsKLSAgICAgIGlmICh0b2tlbnMuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgTE9HX1dBUk4oIm5vIGtleS92YWx1ZSBzZXBhcmF0b3IgZm91bmQgb24gbGluZSAlZCIsIGxpbmVfbnVtKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgICAgIH0KLSAgICAgIHRva2Vuc1swXSA9IGNvbW1vbjo6U3RyaW5nVHJpbShzdGQ6Om1vdmUodG9rZW5zWzBdKSk7Ci0gICAgICB0b2tlbnNbMV0gPSBjb21tb246OlN0cmluZ1RyaW0oc3RkOjptb3ZlKHRva2Vuc1sxXSkpOwotICAgICAgY2FjaGUuU2V0UHJvcGVydHkoc2VjdGlvbiwgdG9rZW5zWzBdLCBzdGQ6Om1vdmUodG9rZW5zWzFdKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjYWNoZTsKLX0KLQotYm9vbCBMZWdhY3lDb25maWdGaWxlOjpXcml0ZShjb25zdCBDb25maWdDYWNoZSYgY2FjaGUpIHsKLSAgcmV0dXJuIG9zOjpXcml0ZVRvRmlsZShwYXRoXywgY2FjaGUuU2VyaWFsaXplVG9MZWdhY3lGb3JtYXQoKSk7Ci19Ci0KLWJvb2wgTGVnYWN5Q29uZmlnRmlsZTo6RGVsZXRlKCkgewotICBpZiAoIW9zOjpGaWxlRXhpc3RzKHBhdGhfKSkgewotICAgIExPR19XQVJOKCJDb25maWcgZmlsZSBhdCBcIiVzXCIgZG9lcyBub3QgZXhpc3QiLCBwYXRoXy5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIG9zOjpSZW1vdmVGaWxlKHBhdGhfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL2xlZ2FjeV9jb25maWdfZmlsZS5oIGIvZ2Qvc3RvcmFnZS9sZWdhY3lfY29uZmlnX2ZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzMTljOS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL2xlZ2FjeV9jb25maWdfZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotLy8gc2ltaWxhciB0byBJTkkKLWNsYXNzIExlZ2FjeUNvbmZpZ0ZpbGUgewotIHB1YmxpYzoKLSAgc3RhdGljIExlZ2FjeUNvbmZpZ0ZpbGUgRnJvbVBhdGgoc3RkOjpzdHJpbmcgcGF0aCkgewotICAgIHJldHVybiBMZWdhY3lDb25maWdGaWxlKHN0ZDo6bW92ZShwYXRoKSk7Ci0gIH0KLSAgZXhwbGljaXQgTGVnYWN5Q29uZmlnRmlsZShzdGQ6OnN0cmluZyBwYXRoKTsKLSAgc3RkOjpvcHRpb25hbDxDb25maWdDYWNoZT4gUmVhZChzaXplX3QgdGVtcF9kZXZpY2VzX2NhcGFjaXR5KTsKLSAgYm9vbCBXcml0ZShjb25zdCBDb25maWdDYWNoZSYgY2FjaGUpOwotICBib29sIERlbGV0ZSgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvbGVnYWN5X2NvbmZpZ19maWxlX3Rlc3QuY2MgYi9nZC9zdG9yYWdlL2xlZ2FjeV9jb25maWdfZmlsZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjgyYjc0Li4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvbGVnYWN5X2NvbmZpZ19maWxlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0b3JhZ2UvbGVnYWN5X2NvbmZpZ19maWxlLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxmaWxlc3lzdGVtPgotCi0jaW5jbHVkZSAib3MvZmlsZXMuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2RldmljZS5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6b3M6OlJlYWRTbWFsbEZpbGU7Ci11c2luZyBibHVldG9vdGg6Om9zOjpXcml0ZVRvRmlsZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6Q29uZmlnQ2FjaGU7Ci11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6OkRldmljZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6TGVnYWN5Q29uZmlnRmlsZTsKLQotVEVTVChMZWdhY3lDb25maWdGaWxlVGVzdCwgd3JpdGVfYW5kX3JlYWRfbG9vcF9iYWNrX3Rlc3QpIHsKLSAgYXV0byB0ZW1wX2RpciA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICBhdXRvIHRlbXBfY29uZmlnID0gdGVtcF9kaXIgLyAidGVtcF9jb25maWcudHh0IjsKLQotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQSIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBQTpCQjpDQzpERDpFRTpGRiIsICJDIiwgIkQiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJDQzpERDpFRTpGRjowMDoxMSIsICJMaW5rS2V5IiwgIkFBQkJBQUJCQ0NEREVFIik7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIpKTsKLSAgRVhQRUNUX1RIQVQoY29uZmlnLkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgiQ0M6REQ6RUU6RkY6MDA6MTEiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgodGVtcF9jb25maWcuc3RyaW5nKCkpLldyaXRlKGNvbmZpZykpOwotICBhdXRvIGNvbmZpZ19yZWFkID0gTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgodGVtcF9jb25maWcuc3RyaW5nKCkpLlJlYWQoMTAwKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnX3JlYWQpOwotICAvLyBVbnBhaXJlZCBkZXZpY2VzIGRvIG5vdCBleGlzdCBpbiBwZXJzaXN0ZW50IGNvbmZpZyBmaWxlCi0gIGNvbmZpZy5SZW1vdmVTZWN0aW9uKCJBQTpCQjpDQzpERDpFRTpGRiIpOwotICBFWFBFQ1RfRVEoY29uZmlnLCAqY29uZmlnX3JlYWQpOwotICBFWFBFQ1RfVEhBVChjb25maWdfcmVhZC0+R2V0UGVyc2lzdGVudFNlY3Rpb25zKCksIEVsZW1lbnRzQXJlKCJDQzpERDpFRTpGRjowMDoxMSIpKTsKLSAgRVhQRUNUX1RIQVQoY29uZmlnX3JlYWQtPkdldFByb3BlcnR5KCJBIiwgIkIiKSwgT3B0aW9uYWwoU3RyRXEoIkMiKSkpOwotICBFWFBFQ1RfVEhBVChjb25maWdfcmVhZC0+R2V0UHJvcGVydHkoIkNDOkREOkVFOkZGOjAwOjExIiwgIkxpbmtLZXkiKSwgT3B0aW9uYWwoU3RyRXEoIkFBQkJBQUJCQ0NEREVFIikpKTsKLQotICBFWFBFQ1RfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZSh0ZW1wX2NvbmZpZykpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1JlYWRUZXN0Q29uZmlnID0KLSAgICAiW0luZm9dXG4iCi0gICAgIkZpbGVTb3VyY2UgPSBFbXB0eVxuIgotICAgICJUaW1lQ3JlYXRlZCA9IDIwMjAtMDUtMjAgMDE6MjA6NTZcbiIKLSAgICAiXG4iCi0gICAgIltNZXRyaWNzXVxuIgotICAgICJTYWx0MjU2Qml0ID0gMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZlxuIgotICAgICJcbiIKLSAgICAiW0FkYXB0ZXJdXG4iCi0gICAgIkFkZHJlc3MgPSAwMTowMjowMzphYjpjZDplZlxuIgotICAgICJMRV9MT0NBTF9LRVlfSVJLID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjFcbiIKLSAgICAiTEVfTE9DQUxfS0VZX0lSID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjJcbiIKLSAgICAiTEVfTE9DQUxfS0VZX0RISyA9IGZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzIzXG4iCi0gICAgIkxFX0xPQ0FMX0tFWV9FUiA9IGZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzI0XG4iCi0gICAgIlNjYW5Nb2RlID0gMlxuIgotICAgICJEaXNjb3ZlcnlUaW1lb3V0ID0gMTIwXG4iCi0gICAgIlxuIgotICAgICJbMDE6MDI6MDM6YWI6Y2Q6ZWFdXG4iCi0gICAgIm5hbWUgPSBoZWxsbyB3b3JsZFxuIgotICAgICJMaW5rS2V5ID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjhcbiI7Ci0KLVRFU1QoTGVnYWN5Q29uZmlnRmlsZVRlc3QsIHJlYWRfdGVzdCkgewotICBhdXRvIHRlbXBfZGlyID0gc3RkOjpmaWxlc3lzdGVtOjp0ZW1wX2RpcmVjdG9yeV9wYXRoKCk7Ci0gIGF1dG8gdGVtcF9jb25maWcgPSB0ZW1wX2RpciAvICJ0ZW1wX2NvbmZpZy50eHQiOwotICBFWFBFQ1RfVFJVRShXcml0ZVRvRmlsZSh0ZW1wX2NvbmZpZy5zdHJpbmcoKSwga1JlYWRUZXN0Q29uZmlnKSk7Ci0KLSAgYXV0byBjb25maWdfcmVhZCA9IExlZ2FjeUNvbmZpZ0ZpbGU6OkZyb21QYXRoKHRlbXBfY29uZmlnLnN0cmluZygpKS5SZWFkKDEwMCk7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZ19yZWFkKTsKLSAgRVhQRUNUX1RIQVQoY29uZmlnX3JlYWQtPkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgiMDE6MDI6MDM6YWI6Y2Q6ZWEiKSk7Ci0gIEVYUEVDVF9USEFUKGNvbmZpZ19yZWFkLT5HZXRQcm9wZXJ0eSgiSW5mbyIsICJGaWxlU291cmNlIiksIE9wdGlvbmFsKFN0ckVxKCJFbXB0eSIpKSk7Ci0gIEVYUEVDVF9USEFUKGNvbmZpZ19yZWFkLT5HZXRQcm9wZXJ0eSgiSW5mbyIsICJGaWxlU291cmNlIiksIE9wdGlvbmFsKFN0ckVxKCJFbXB0eSIpKSk7Ci0gIEVYUEVDVF9USEFUKAotICAgICAgY29uZmlnX3JlYWQtPkdldFByb3BlcnR5KCIwMTowMjowMzphYjpjZDplYSIsICJMaW5rS2V5IiksIE9wdGlvbmFsKFN0ckVxKCJmZWRjYmEwOTg3NjU0MzIxZmVkY2JhMDk4NzY1NDMyOCIpKSk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpyZW1vdmUodGVtcF9jb25maWcpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtXcml0ZVRlc3RDb25maWcgPQotICAgICJbSW5mb11cbiIKLSAgICAiRmlsZVNvdXJjZSA9IEVtcHR5XG4iCi0gICAgIlRpbWVDcmVhdGVkID0gXG4iCi0gICAgIlxuIgotICAgICJbQWRhcHRlcl1cbiIKLSAgICAiQWRkcmVzcyA9IDAxOjAyOjAzOmFiOmNkOmVmXG4iCi0gICAgIlxuIgotICAgICJbMDE6MDI6MDM6YWI6Y2Q6ZWFdXG4iCi0gICAgIm5hbWUgPSBoZWxsbyB3b3JsZFxuIgotICAgICJMaW5rS2V5ID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjhcbiIKLSAgICAiXG4iOwotCi1URVNUKExlZ2FjeUNvbmZpZ0ZpbGVUZXN0LCB3cml0ZV90ZXN0KSB7Ci0gIGF1dG8gdGVtcF9kaXIgPSBzdGQ6OmZpbGVzeXN0ZW06OnRlbXBfZGlyZWN0b3J5X3BhdGgoKTsKLSAgYXV0byB0ZW1wX2NvbmZpZyA9IHRlbXBfZGlyIC8gInRlbXBfY29uZmlnLnR4dCI7Ci0KLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkluZm8iLCAiRmlsZVNvdXJjZSIsICJFbXB0eSIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkluZm8iLCAiVGltZUNyZWF0ZWQiLCAiIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQWRhcHRlciIsICJBZGRyZXNzIiwgIjAxOjAyOjAzOmFiOmNkOmVmIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiMDE6MDI6MDM6YWI6Y2Q6ZWEiLCAibmFtZSIsICJoZWxsbyB3b3JsZCIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIjAxOjAyOjAzOmFiOmNkOmVhIiwgIkxpbmtLZXkiLCAiZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjgiKTsKLSAgRVhQRUNUX1RSVUUoTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgodGVtcF9jb25maWcuc3RyaW5nKCkpLldyaXRlKGNvbmZpZykpOwotCi0gIEVYUEVDVF9USEFUKFJlYWRTbWFsbEZpbGUodGVtcF9jb25maWcuc3RyaW5nKCkpLCBPcHRpb25hbChTdHJFcShrV3JpdGVUZXN0Q29uZmlnKSkpOwotCi0gIEVYUEVDVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKHRlbXBfY29uZmlnKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQ29uZmlnV2l0aER1cGxpY2F0ZVNlY3Rpb25BbmRLZXkgPQotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotZmlyc3Rfa2V5PXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBEZXZpY2UgSUQgKERJRCkgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotW0RJRF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBSZWNvcmQgTnVtYmVyOiAxLCAyIG9yIDMgLSBtYXhpbXVtIG9mIDMgcmVjb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotcmVjb3JkTnVtYmVyID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBQcmltYXJ5IFJlY29yZCAtIHRydWUgb3IgZmFsc2UgKGRlZmF1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBUaGVyZSBjYW4gYmUgb25seSBvbmUgcHJpbWFyeSByZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotcHJpbWFyeVJlY29yZCA9IHRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBWZW5kb3IgSUQgJzB4RkZGRicgaW5kaWNhdGVzIG5vIERldmljZSBJRCBTZXJ2aWNlIFJlY29yZCBpcyBwcmVzZW50IGluIHRoZSBkZXZpY2UgIFxuXAotIyAweDAwMEYgPSBCcm9hZGNvbSBDb3Jwb3JhdGlvbiAoZGVmYXVsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI3ZlbmRvcklkID0gMHgwMDBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBWZW5kb3IgSUQgU291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyAweDAwMDEgPSBCbHVldG9vdGggU0lHIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUgKGRlZmF1bHQpICAgICAgICAgICAgICAgIFxuXAotIyAweDAwMDIgPSBVU0IgSW1wbGVtZW50ZXIncyBGb3J1bSBhc3NpZ25lZCBEZXZpY2UgSUQgVmVuZG9yIElEIHZhbHVlICAgICAgICAgICAgICAgIFxuXAotI3ZlbmRvcklkU291cmNlID0gMHgwMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBQcm9kdWN0IElEICYgUHJvZHVjdCBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBQZXIgc3BlYyBESUQgdjEuMyAweEpKTU4gZm9yIHZlcnNpb24gaXMgaW50ZXJwcmV0ZWQgYXMgSkouTS5OICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBKSjogbWFqb3IgdmVyc2lvbiBudW1iZXIsIE06IG1pbm9yIHZlcnNpb24gbnVtYmVyLCBOOiBzdWItbWlub3IgdmVyc2lvbiBudW1iZXIgICAgIFxuXAotIyBGb3IgZXhhbXBsZTogMTIwMCwgdjE0LjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotcHJvZHVjdElkID0gMHgxMjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotdmVyc2lvbiA9IDB4MTExMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBPcHRpb25hbCBhdHRyaWJ1dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI2NsaWVudEV4ZWN1dGFibGVVUkwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI3NlcnZpY2VEZXNjcmlwdGlvbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI2RvY3VtZW50YXRpb25VUkwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBBZGRpdGlvbmFsIG9wdGlvbmFsIERJRCByZWNvcmRzLiBCbHVlZHJvaWQgc3VwcG9ydHMgdXAgdG8gMyByZWNvcmRzLiAgICAgICAgICAgICAgIFxuXAotW0RJRF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotW0RJRF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotdmVyc2lvbiA9IDB4MTQzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotSGlTeW5jSWQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotSGlTeW5jSWQyID0gMTUwMDE5MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIjsKLQotVEVTVChMZWdhY3lDb25maWdGaWxlVGVzdCwgZHVwbGljYXRlX3NlY3Rpb25fYW5kX2tleV90ZXN0KSB7Ci0gIGF1dG8gdGVtcF9kaXIgPSBzdGQ6OmZpbGVzeXN0ZW06OnRlbXBfZGlyZWN0b3J5X3BhdGgoKTsKLSAgYXV0byB0ZW1wX2NvbmZpZyA9IHRlbXBfZGlyIC8gInRlbXBfY29uZmlnLnR4dCI7Ci0gIEFTU0VSVF9UUlVFKFdyaXRlVG9GaWxlKHRlbXBfY29uZmlnLnN0cmluZygpLCBrQ29uZmlnV2l0aER1cGxpY2F0ZVNlY3Rpb25BbmRLZXkpKTsKLQotICBhdXRvIGNvbmZpZ19yZWFkID0gTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgodGVtcF9jb25maWcuc3RyaW5nKCkpLlJlYWQoMTAwKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnX3JlYWQpOwotICBFWFBFQ1RfVEhBVChjb25maWdfcmVhZC0+R2V0UHJvcGVydHkoQ29uZmlnQ2FjaGU6OmtEZWZhdWx0U2VjdGlvbk5hbWUsICJmaXJzdF9rZXkiKSwgT3B0aW9uYWwoU3RyRXEoInZhbHVlIikpKTsKLSAgLy8gQWxsIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBtZXJnZSBpbnRvIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlyCi0gIEVYUEVDVF9USEFUKGNvbmZpZ19yZWFkLT5HZXRQcm9wZXJ0eSgiRElEIiwgInByaW1hcnlSZWNvcmQiKSwgT3B0aW9uYWwoU3RyRXEoInRydWUiKSkpOwotICAvLyBXaGVuIGtleXMgYXJlIHJlcGVhdGVkLCB0aGUgbGF0ZXIgb25lIHdpbnMKLSAgRVhQRUNUX1RIQVQoY29uZmlnX3JlYWQtPkdldFByb3BlcnR5KCJESUQiLCAidmVyc2lvbiIpLCBPcHRpb25hbChTdHJFcSgiMHgxNDM2IikpKTsKLQotICBFWFBFQ1RfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZSh0ZW1wX2NvbmZpZykpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvbXV0YXRpb24uY2MgYi9nZC9zdG9yYWdlL211dGF0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhlNTYwLi4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvbXV0YXRpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbi5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1NdXRhdGlvbjo6TXV0YXRpb24oQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZykKLSAgICA6IGNvbmZpZ18oY29uZmlnKSwgbWVtb3J5X29ubHlfY29uZmlnXyhtZW1vcnlfb25seV9jb25maWcpIHsKLSAgQVNTRVJUKGNvbmZpZ18gIT0gbnVsbHB0cik7Ci0gIEFTU0VSVChtZW1vcnlfb25seV9jb25maWdfICE9IG51bGxwdHIpOwotfQotCi12b2lkIE11dGF0aW9uOjpBZGQoTXV0YXRpb25FbnRyeSBlbnRyeSkgewotICBzd2l0Y2ggKGVudHJ5LnByb3BlcnR5X3R5cGUpIHsKLSAgICBjYXNlIE11dGF0aW9uRW50cnk6OlByb3BlcnR5VHlwZTo6Tk9STUFMOgotICAgICAgaWYgKGVudHJ5LmVudHJ5X3R5cGUgIT0gTXV0YXRpb25FbnRyeTo6RW50cnlUeXBlOjpTRVQpIHsKLSAgICAgICAgLy8gV2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQgZnJvbSBub3JtYWwgY29uZmlnLCBpdCBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0ZW1wIGNvbmZpZyBhcyB3ZWxsCi0gICAgICAgIG1lbW9yeV9vbmx5X2NvbmZpZ19lbnRyaWVzXy5lbXBsYWNlKGVudHJ5KTsKLSAgICAgIH0KLSAgICAgIG5vcm1hbF9jb25maWdfZW50cmllc18uZW1wbGFjZShzdGQ6Om1vdmUoZW50cnkpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTXV0YXRpb25FbnRyeTo6UHJvcGVydHlUeXBlOjpNRU1PUllfT05MWToKLSAgICAgIG1lbW9yeV9vbmx5X2NvbmZpZ19lbnRyaWVzXy5lbXBsYWNlKHN0ZDo6bW92ZShlbnRyeSkpOwotICAgICAgYnJlYWs7Ci0gICAgICAvLyBkbyBub3Qgd3JpdGUgYSBkZWZhdWx0IGNhc2Ugc28gdGhhdCB3aGVuIGEgbmV3IGVudW0gaXMgZGVmaW5lZCwgY29tcGlsYXRpb24gd291bGQgZmFpbCBhdXRvbWF0aWNhbGx5Ci0gIH0KLX0KLQotdm9pZCBNdXRhdGlvbjo6Q29tbWl0KCkgewotICBjb25maWdfLT5Db21taXQobm9ybWFsX2NvbmZpZ19lbnRyaWVzXyk7Ci0gIG1lbW9yeV9vbmx5X2NvbmZpZ18tPkNvbW1pdChtZW1vcnlfb25seV9jb25maWdfZW50cmllc18pOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvbXV0YXRpb24uaCBiL2dkL3N0b3JhZ2UvbXV0YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwNzJmOS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL211dGF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbl9lbnRyeS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotY2xhc3MgTXV0YXRpb24gewotIHB1YmxpYzoKLSAgTXV0YXRpb24oQ29uZmlnQ2FjaGUqIGNvbmZpZywgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gIHZvaWQgQWRkKE11dGF0aW9uRW50cnkgZW50cnkpOwotICB2b2lkIENvbW1pdCgpOwotICBmcmllbmQgQ29uZmlnQ2FjaGU7Ci0KLSBwcml2YXRlOgotICBDb25maWdDYWNoZSogY29uZmlnXzsKLSAgQ29uZmlnQ2FjaGUqIG1lbW9yeV9vbmx5X2NvbmZpZ187Ci0gIHN0ZDo6cXVldWU8TXV0YXRpb25FbnRyeT4gbm9ybWFsX2NvbmZpZ19lbnRyaWVzXzsKLSAgc3RkOjpxdWV1ZTxNdXRhdGlvbkVudHJ5PiBtZW1vcnlfb25seV9jb25maWdfZW50cmllc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2UvbXV0YXRpb25fZW50cnkuY2MgYi9nZC9zdG9yYWdlL211dGF0aW9uX2VudHJ5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2JlYTUxLi4wMDAwMDAwCi0tLSBhL2dkL3N0b3JhZ2UvbXV0YXRpb25fZW50cnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RvcmFnZS9tdXRhdGlvbl9lbnRyeS5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1NdXRhdGlvbkVudHJ5OjpNdXRhdGlvbkVudHJ5KAotICAgIEVudHJ5VHlwZSBlbnRyeV90eXBlX3BhcmFtLAotICAgIFByb3BlcnR5VHlwZSBwcm9wZXJ0eV90eXBlX3BhcmFtLAotICAgIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sCi0gICAgc3RkOjpzdHJpbmcgcHJvcGVydHlfcGFyYW0sCi0gICAgc3RkOjpzdHJpbmcgdmFsdWVfcGFyYW0pCi0gICAgOiBlbnRyeV90eXBlKGVudHJ5X3R5cGVfcGFyYW0pLAotICAgICAgcHJvcGVydHlfdHlwZShwcm9wZXJ0eV90eXBlX3BhcmFtKSwKLSAgICAgIHNlY3Rpb24oc3RkOjptb3ZlKHNlY3Rpb25fcGFyYW0pKSwKLSAgICAgIHByb3BlcnR5KHN0ZDo6bW92ZShwcm9wZXJ0eV9wYXJhbSkpLAotICAgICAgdmFsdWUoc3RkOjptb3ZlKHZhbHVlX3BhcmFtKSkgewotICBzd2l0Y2ggKGVudHJ5X3R5cGUpIHsKLSAgICBjYXNlIEVudHJ5VHlwZTo6U0VUOgotICAgICAgQVNTRVJUX0xPRyghc2VjdGlvbi5lbXB0eSgpLCAic2VjdGlvbiBjYW5ub3QgYmUgZW1wdHkgZm9yIEVudHJ5VHlwZTo6U0VUIik7Ci0gICAgICBBU1NFUlRfTE9HKCFwcm9wZXJ0eS5lbXB0eSgpLCAicHJvcGVydHkgY2Fubm90IGJlIGVtcHR5IGZvciBFbnRyeVR5cGU6OlNFVCIpOwotICAgICAgQVNTRVJUX0xPRyghdmFsdWUuZW1wdHkoKSwgInZhbHVlIGNhbm5vdCBiZSBlbXB0eSBmb3IgRW50cnlUeXBlOjpTRVQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRW50cnlUeXBlOjpSRU1PVkVfUFJPUEVSVFk6Ci0gICAgICBBU1NFUlRfTE9HKCFzZWN0aW9uLmVtcHR5KCksICJzZWN0aW9uIGNhbm5vdCBiZSBlbXB0eSBmb3IgRW50cnlUeXBlOjpSRU1PVkVfUFJPUEVSVFkiKTsKLSAgICAgIEFTU0VSVF9MT0coIXByb3BlcnR5LmVtcHR5KCksICJwcm9wZXJ0eSBjYW5ub3QgYmUgZW1wdHkgZm9yIEVudHJ5VHlwZTo6UkVNT1ZFX1BST1BFUlRZIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVudHJ5VHlwZTo6UkVNT1ZFX1NFQ1RJT046Ci0gICAgICBBU1NFUlRfTE9HKCFzZWN0aW9uLmVtcHR5KCksICJzZWN0aW9uIGNhbm5vdCBiZSBlbXB0eSBmb3IgRW50cnlUeXBlOjpSRU1PVkVfU0VDVElPTiIpOwotICAgICAgYnJlYWs7Ci0gICAgICAvLyBkbyBub3Qgd3JpdGUgYSBkZWZhdWx0IGNhc2Ugc28gdGhhdCB3aGVuIGEgbmV3IGVudW0gaXMgZGVmaW5lZCwgY29tcGlsYXRpb24gd291bGQgZmFpbCBhdXRvbWF0aWNhbGx5Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL211dGF0aW9uX2VudHJ5LmggYi9nZC9zdG9yYWdlL211dGF0aW9uX2VudHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjkwMmMuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9tdXRhdGlvbl9lbnRyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotI2luY2x1ZGUgImNvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiY29tbW9uL3R5cGVfaGVscGVyLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9zZXJpYWxpemFibGUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLWNsYXNzIE11dGF0aW9uRW50cnkgewotIHB1YmxpYzoKLSAgZW51bSBFbnRyeVR5cGUgeyBTRVQsIFJFTU9WRV9QUk9QRVJUWSwgUkVNT1ZFX1NFQ1RJT04gfTsKLQotICBlbnVtIFByb3BlcnR5VHlwZSB7IE5PUk1BTCwgTUVNT1JZX09OTFkgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbF92PFQ+LCBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgU2V0KAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sIHN0ZDo6c3RyaW5nIHByb3BlcnR5X3BhcmFtLCBUIHZhbHVlX3BhcmFtKSB7Ci0gICAgcmV0dXJuIE11dGF0aW9uRW50cnk6OlNldCgKLSAgICAgICAgcHJvcGVydHlfdHlwZSwgc3RkOjptb3ZlKHNlY3Rpb25fcGFyYW0pLCBzdGQ6Om1vdmUocHJvcGVydHlfcGFyYW0pLCBzdGQ6OnRvX3N0cmluZyh2YWx1ZV9wYXJhbSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bV92PFQ+LCBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgU2V0KAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sIHN0ZDo6c3RyaW5nIHByb3BlcnR5X3BhcmFtLCBUIHZhbHVlX3BhcmFtKSB7Ci0gICAgdXNpbmcgRW51bVVuZGVybHlpbmdUeXBlID0gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxUPjsKLSAgICByZXR1cm4gTXV0YXRpb25FbnRyeTo6U2V0PEVudW1VbmRlcmx5aW5nVHlwZT4oCi0gICAgICAgIHByb3BlcnR5X3R5cGUsCi0gICAgICAgIHN0ZDo6bW92ZShzZWN0aW9uX3BhcmFtKSwKLSAgICAgICAgc3RkOjptb3ZlKHByb3BlcnR5X3BhcmFtKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8RW51bVVuZGVybHlpbmdUeXBlPih2YWx1ZV9wYXJhbSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZV92PFQsIGJvb2w+LCBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgU2V0KAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sIHN0ZDo6c3RyaW5nIHByb3BlcnR5X3BhcmFtLCBUIHZhbHVlX3BhcmFtKSB7Ci0gICAgcmV0dXJuIE11dGF0aW9uRW50cnk6OlNldCgKLSAgICAgICAgcHJvcGVydHlfdHlwZSwgc3RkOjptb3ZlKHNlY3Rpb25fcGFyYW0pLCBzdGQ6Om1vdmUocHJvcGVydHlfcGFyYW0pLCBjb21tb246OlRvU3RyaW5nKHZhbHVlX3BhcmFtKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lX3Y8VCwgc3RkOjpzdHJpbmc+LCBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgU2V0KAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sIHN0ZDo6c3RyaW5nIHByb3BlcnR5X3BhcmFtLCBUIHZhbHVlX3BhcmFtKSB7Ci0gICAgcmV0dXJuIE11dGF0aW9uRW50cnk6OlNldCgKLSAgICAgICAgcHJvcGVydHlfdHlwZSwgc3RkOjptb3ZlKHNlY3Rpb25fcGFyYW0pLCBzdGQ6Om1vdmUocHJvcGVydHlfcGFyYW0pLCBzdGQ6Om1vdmUodmFsdWVfcGFyYW0pKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2ZfdjxTZXJpYWxpemFibGU8VD4sIFQ+LCBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgU2V0KAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sIHN0ZDo6c3RyaW5nIHByb3BlcnR5X3BhcmFtLCBjb25zdCBUJiB2YWx1ZV9wYXJhbSkgewotICAgIHJldHVybiBNdXRhdGlvbkVudHJ5OjpTZXQoCi0gICAgICAgIHByb3BlcnR5X3R5cGUsIHN0ZDo6bW92ZShzZWN0aW9uX3BhcmFtKSwgc3RkOjptb3ZlKHByb3BlcnR5X3BhcmFtKSwgdmFsdWVfcGFyYW0uVG9MZWdhY3lDb25maWdTdHJpbmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Ci0gICAgICB0eXBlbmFtZSBULAotICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OmlzX3NwZWNpYWxpemF0aW9uX29mPFQsIHN0ZDo6dmVjdG9yPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mX3Y8U2VyaWFsaXphYmxlPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+LCB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiwKLSAgICAgICAgICBpbnQ+Ojp0eXBlID0gMD4KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgU2V0KAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0sIHN0ZDo6c3RyaW5nIHByb3BlcnR5X3BhcmFtLCBjb25zdCBUJiB2YWx1ZV9wYXJhbSkgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJfdmFsdWVzOwotICAgIHN0cl92YWx1ZXMucmVzZXJ2ZSh2YWx1ZV9wYXJhbS5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byYgdiA6IHZhbHVlX3BhcmFtKSB7Ci0gICAgICBzdHJfdmFsdWVzLnB1c2hfYmFjayh2LlRvTGVnYWN5Q29uZmlnU3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gTXV0YXRpb25FbnRyeTo6U2V0KAotICAgICAgICBwcm9wZXJ0eV90eXBlLCBzdGQ6Om1vdmUoc2VjdGlvbl9wYXJhbSksIHN0ZDo6bW92ZShwcm9wZXJ0eV9wYXJhbSksIGNvbW1vbjo6U3RyaW5nSm9pbihzdHJfdmFsdWVzLCAiICIpKTsKLSAgfQotCi0gIHN0YXRpYyBNdXRhdGlvbkVudHJ5IFNldCgKLSAgICAgIFByb3BlcnR5VHlwZSBwcm9wZXJ0eV90eXBlLCBzdGQ6OnN0cmluZyBzZWN0aW9uX3BhcmFtLCBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9wYXJhbSwgc3RkOjpzdHJpbmcgdmFsdWVfcGFyYW0pIHsKLSAgICByZXR1cm4gTXV0YXRpb25FbnRyeSgKLSAgICAgICAgRW50cnlUeXBlOjpTRVQsIHByb3BlcnR5X3R5cGUsIHN0ZDo6bW92ZShzZWN0aW9uX3BhcmFtKSwgc3RkOjptb3ZlKHByb3BlcnR5X3BhcmFtKSwgc3RkOjptb3ZlKHZhbHVlX3BhcmFtKSk7Ci0gIH0KLQotICBzdGF0aWMgTXV0YXRpb25FbnRyeSBSZW1vdmUoUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGUsIHN0ZDo6c3RyaW5nIHNlY3Rpb25fcGFyYW0pIHsKLSAgICByZXR1cm4gTXV0YXRpb25FbnRyeShFbnRyeVR5cGU6OlJFTU9WRV9TRUNUSU9OLCBwcm9wZXJ0eV90eXBlLCBzdGQ6Om1vdmUoc2VjdGlvbl9wYXJhbSkpOwotICB9Ci0KLSAgc3RhdGljIE11dGF0aW9uRW50cnkgUmVtb3ZlKFByb3BlcnR5VHlwZSBwcm9wZXJ0eV90eXBlLCBzdGQ6OnN0cmluZyBzZWN0aW9uX3BhcmFtLCBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9wYXJhbSkgewotICAgIHJldHVybiBNdXRhdGlvbkVudHJ5KAotICAgICAgICBFbnRyeVR5cGU6OlJFTU9WRV9QUk9QRVJUWSwgcHJvcGVydHlfdHlwZSwgc3RkOjptb3ZlKHNlY3Rpb25fcGFyYW0pLCBzdGQ6Om1vdmUocHJvcGVydHlfcGFyYW0pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENvbmZpZ0NhY2hlOwotICBmcmllbmQgY2xhc3MgTXV0YXRpb247Ci0KLSAgTXV0YXRpb25FbnRyeSgKLSAgICAgIEVudHJ5VHlwZSBlbnRyeV90eXBlX3BhcmFtLAotICAgICAgUHJvcGVydHlUeXBlIHByb3BlcnR5X3R5cGVfcGFyYW0sCi0gICAgICBzdGQ6OnN0cmluZyBzZWN0aW9uX3BhcmFtLAotICAgICAgc3RkOjpzdHJpbmcgcHJvcGVydHlfcGFyYW0gPSAiIiwKLSAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlX3BhcmFtID0gIiIpOwotCi0gIEVudHJ5VHlwZSBlbnRyeV90eXBlOwotICBQcm9wZXJ0eVR5cGUgcHJvcGVydHlfdHlwZTsKLSAgc3RkOjpzdHJpbmcgc2VjdGlvbjsKLSAgc3RkOjpzdHJpbmcgcHJvcGVydHk7Ci0gIHN0ZDo6c3RyaW5nIHZhbHVlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL211dGF0aW9uX3Rlc3QuY2MgYi9nZC9zdG9yYWdlL211dGF0aW9uX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzJjNTkuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9tdXRhdGlvbl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdG9yYWdlL211dGF0aW9uLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzdG9yYWdlL2NvbmZpZ19jYWNoZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpDb25maWdDYWNoZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpzdG9yYWdlOjpNdXRhdGlvbjsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6TXV0YXRpb25FbnRyeTsKLQotVEVTVChNdXRhdGlvblRlc3QsIHNpbXBsZV9zZXF1ZW5jZV90ZXN0KSB7Ci0gIENvbmZpZ0NhY2hlIGNvbmZpZygxMDAsIERldmljZTo6a0xpbmtLZXlQcm9wZXJ0aWVzKTsKLSAgQ29uZmlnQ2FjaGUgbWVtb3J5X29ubHlfY29uZmlnKDEwMCwge30pOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQiIsICJDIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQUE6QkI6Q0M6REQ6RUU6RkYiLCAiQyIsICJEIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQ0M6REQ6RUU6RkY6MDA6MTEiLCAiTGlua0tleSIsICJBQUJCQUFCQkNDRERFRSIpOwotICBNdXRhdGlvbiBtdXRhdGlvbigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnKTsKLSAgbXV0YXRpb24uQWRkKE11dGF0aW9uRW50cnk6OlNldChNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkFBOkJCOkNDOkREOkVFOkZGIiwgIkxpbmtLZXkiLCAiQ0NEREVFRkZHRyIpKTsKLSAgbXV0YXRpb24uQWRkKE11dGF0aW9uRW50cnk6OlJlbW92ZShNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkFBOkJCOkNDOkREOkVFOkZGIiwgIkxpbmtLZXkiKSk7Ci0gIG11dGF0aW9uLkNvbW1pdCgpOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UGVyc2lzdGVudFNlY3Rpb25zKCksIEVsZW1lbnRzQXJlKCJDQzpERDpFRTpGRjowMDoxMSIpKTsKLSAgTXV0YXRpb24gbXV0YXRpb24yKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcpOwotICBtdXRhdGlvbjIuQWRkKE11dGF0aW9uRW50cnk6OlNldChNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkFBOkJCOkNDOkREOkVFOkZGIiwgIkxpbmtLZXkiLCAiQ0NEREVFRkZHRyIpKTsKLSAgbXV0YXRpb24yLkNvbW1pdCgpOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UGVyc2lzdGVudFNlY3Rpb25zKCksIEVsZW1lbnRzQXJlKCJDQzpERDpFRTpGRjowMDoxMSIsICJBQTpCQjpDQzpERDpFRTpGRiIpKTsKLX0KLQotVEVTVChNdXRhdGlvblRlc3QsIHJlbW92ZV9wcm9wZXJ0eV9hbmRfc2VjdGlvbikgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZygxMDAsIHt9KTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJBIiwgIkIiLCAiQyIpOwotICBjb25maWcuU2V0UHJvcGVydHkoIkEiLCAiQyIsICJEIik7Ci0gIGNvbmZpZy5TZXRQcm9wZXJ0eSgiQiIsICJCIiwgIkMiKTsKLSAgY29uZmlnLlNldFByb3BlcnR5KCJCIiwgIkMiLCAiRCIpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzU2VjdGlvbigiQSIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1Byb3BlcnR5KCJBIiwgIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJDIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzU2VjdGlvbigiQiIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1Byb3BlcnR5KCJCIiwgIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQiIsICJDIikpOwotICB7Ci0gICAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gICAgbXV0YXRpb24uQWRkKE11dGF0aW9uRW50cnk6OlJlbW92ZShNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkEiLCAiQiIpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfVFJVRShjb25maWcuSGFzU2VjdGlvbigiQSIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJCIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzUHJvcGVydHkoIkEiLCAiQyIpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLkhhc1NlY3Rpb24oIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQiIsICJCIikpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzUHJvcGVydHkoIkIiLCAiQyIpKTsKLSAgewotICAgIE11dGF0aW9uIG11dGF0aW9uKCZjb25maWcsICZtZW1vcnlfb25seV9jb25maWcpOwotICAgIG11dGF0aW9uLkFkZChNdXRhdGlvbkVudHJ5OjpSZW1vdmUoTXV0YXRpb25FbnRyeTo6UHJvcGVydHlUeXBlOjpOT1JNQUwsICJCIikpOwotICAgIG11dGF0aW9uLkNvbW1pdCgpOwotICB9Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNTZWN0aW9uKCJBIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1Byb3BlcnR5KCJBIiwgIkIiKSk7Ci0gIEFTU0VSVF9UUlVFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJDIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oIkIiKSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzUHJvcGVydHkoIkIiLCAiQiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQiIsICJDIikpOwotICB7Ci0gICAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gICAgbXV0YXRpb24uQWRkKE11dGF0aW9uRW50cnk6OlJlbW92ZShNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkEiLCAiQyIpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLSAgfQotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oIkEiKSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzUHJvcGVydHkoIkEiLCAiQiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJDIikpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLkhhc1NlY3Rpb24oIkIiKSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzUHJvcGVydHkoIkIiLCAiQiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQiIsICJDIikpOwotfQotCi1URVNUKE11dGF0aW9uVGVzdCwgYWRkX2FuZF9yZW1vdmVfY2FuY2VsX2VhY2hfb3RoZXIpIHsKLSAgQ29uZmlnQ2FjaGUgY29uZmlnKDEwMCwgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jb25maWcoMTAwLCB7fSk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzU2VjdGlvbigiQSIpKTsKLSAgTXV0YXRpb24gbXV0YXRpb24oJmNvbmZpZywgJm1lbW9yeV9vbmx5X2NvbmZpZyk7Ci0gIG11dGF0aW9uLkFkZChNdXRhdGlvbkVudHJ5OjpTZXQoTXV0YXRpb25FbnRyeTo6UHJvcGVydHlUeXBlOjpOT1JNQUwsICJBIiwgIkIiLCAiQyIpKTsKLSAgbXV0YXRpb24uQWRkKE11dGF0aW9uRW50cnk6OlJlbW92ZShNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkEiLCAiQiIpKTsKLSAgbXV0YXRpb24uQ29tbWl0KCk7Ci0gIEFTU0VSVF9GQUxTRShjb25maWcuSGFzU2VjdGlvbigiQSIpKTsKLX0KLQotVEVTVChNdXRhdGlvblRlc3QsIGFkZF90b19kaWZmZXJlbnRfY29uZmlncykgewotICBDb25maWdDYWNoZSBjb25maWcoMTAwLCBEZXZpY2U6OmtMaW5rS2V5UHJvcGVydGllcyk7Ci0gIENvbmZpZ0NhY2hlIG1lbW9yeV9vbmx5X2NvbmZpZygxMDAsIHt9KTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNTZWN0aW9uKCJBIikpOwotICBNdXRhdGlvbiBtdXRhdGlvbigmY29uZmlnLCAmbWVtb3J5X29ubHlfY29uZmlnKTsKLSAgbXV0YXRpb24uQWRkKE11dGF0aW9uRW50cnk6OlNldChNdXRhdGlvbkVudHJ5OjpQcm9wZXJ0eVR5cGU6Ok5PUk1BTCwgIkEiLCAiQiIsICJDIikpOwotICBtdXRhdGlvbi5BZGQoTXV0YXRpb25FbnRyeTo6U2V0KE11dGF0aW9uRW50cnk6OlByb3BlcnR5VHlwZTo6TUVNT1JZX09OTFksICJBIiwgIkQiLCAiSGVsbG8iKSk7Ci0gIG11dGF0aW9uLkNvbW1pdCgpOwotICBBU1NFUlRfVFJVRShjb25maWcuSGFzUHJvcGVydHkoIkEiLCAiQiIpKTsKLSAgQVNTRVJUX0ZBTFNFKGNvbmZpZy5IYXNQcm9wZXJ0eSgiQSIsICJEIikpOwotICBBU1NFUlRfVEhBVChjb25maWcuR2V0UHJvcGVydHkoIkEiLCAiQiIpLCBPcHRpb25hbChTdHJFcSgiQyIpKSk7Ci0gIEFTU0VSVF9GQUxTRShtZW1vcnlfb25seV9jb25maWcuSGFzUHJvcGVydHkoIkEiLCAiQiIpKTsKLSAgQVNTRVJUX1RSVUUobWVtb3J5X29ubHlfY29uZmlnLkhhc1Byb3BlcnR5KCJBIiwgIkQiKSk7Ci0gIEFTU0VSVF9USEFUKG1lbW9yeV9vbmx5X2NvbmZpZy5HZXRQcm9wZXJ0eSgiQSIsICJEIiksIE9wdGlvbmFsKFN0ckVxKCJIZWxsbyIpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Qvc3RvcmFnZS9zZXJpYWxpemFibGUuaCBiL2dkL3N0b3JhZ2Uvc2VyaWFsaXphYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhN2RkOTMuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9zZXJpYWxpemFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotLy8gQSBjb25maWcgc2VyaWFsaXphYmxlIG1vZHVsZQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTZXJpYWxpemFibGUgewotIHB1YmxpYzoKLSAgU2VyaWFsaXphYmxlKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5TZXJpYWxpemFibGUoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gR0Qgc3RhY2sgY29kZQotCi0gIC8vIFNlcmlhbGl6ZSB0byBzdHJpbmcgdXNlZCBpbiBHRCBzdGFjawotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgPSAwOwotICAvLyBUIG11c3QgaW1wbGVtZW50IEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmKSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGZhaWwgdG8gY29tcGlsZQotICAvLyBQYXJzZSBzdHJpbmcgZnJvbSBHRCBzdGFjawotICBzdGF0aWMgc3RkOjpvcHRpb25hbDxUPiBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICByZXR1cm4gVDo6RnJvbVN0cmluZyhzdHIpOwotICB9Ci0KLSAgLy8gTGVnYWN5IGhhbmRsaW5nCi0KLSAgLy8gU2VyaWFsaXplIHRvIHN0cmluZyB1c2VkIGluIGxlZ2FjeSBzdGFjayBjb25maWcsIHRoaXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyBUb1N0cmluZygpCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9MZWdhY3lDb25maWdTdHJpbmcoKSBjb25zdCA9IDA7Ci0gIC8vIFQgbXVzdCBpbXBsZW1lbnQgRnJvbUxlZ2FjeUNvbmZpZ1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYpLCBvdGhlcndpc2UsIGl0IHdpbGwgZmFpbCB0byBjb21waWxlCi0gIC8vIFBhcnNlIHN0cmluZyBmcm9tIGxlZ2FjeSBjb25maWcKLSAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8VD4gRnJvbUxlZ2FjeUNvbmZpZ1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgcmV0dXJuIFQ6OkZyb21MZWdhY3lDb25maWdTdHJpbmcoc3RyKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL3N0b3JhZ2VfbW9kdWxlLmNjIGIvZ2Qvc3RvcmFnZS9zdG9yYWdlX21vZHVsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MzdjYS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL3N0b3JhZ2VfbW9kdWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzdG9yYWdlL3N0b3JhZ2VfbW9kdWxlLmgiCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvbW1vbi9iaW5kLmgiCi0jaW5jbHVkZSAib3MvYWxhcm0uaCIKLSNpbmNsdWRlICJvcy9maWxlcy5oIgotI2luY2x1ZGUgIm9zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJvcy9wYXJhbWV0ZXJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJvcy9zeXN0ZW1fcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9sZWdhY3lfY29uZmlnX2ZpbGUuaCIKLSNpbmNsdWRlICJzdG9yYWdlL211dGF0aW9uLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi11c2luZyBjb21tb246Okxpc3RNYXA7Ci11c2luZyBjb21tb246OkxydUNhY2hlOwotdXNpbmcgb3M6OkFsYXJtOwotdXNpbmcgb3M6OkhhbmRsZXI7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRmFjdG9yeVJlc2V0UHJvcGVydHkgPSAicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0IjsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdFRlbXBEZXZpY2VDYXBhY2l0eSA9IDEwMDAwOwotLy8gU2F2ZSBjb25maWcgd2hlbmV2ZXIgdGhlcmUgaXMgYSBjaGFuZ2UsIGJ1dCBkZWxheSBpdCBieSB0aGlzIHZhbHVlIHNvIHRoYXQgYnVyc3QgY29uZmlnIGNoYW5nZSB3b24ndCBvdmVyd2hlbG0gZGlzawotc3RhdGljIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga0RlZmF1bHRDb25maWdTYXZlRGVsYXkgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMwMDApOwotLy8gV3JpdGluZyBhIGNvbmZpZyB0byBkaXNrIHRha2VzIGEgbWluaW11bSAxMCBtcyBvbiBhIGRlY2VudCB4ODZfNjQgbWFjaGluZSwgYW5kIDIwIG1zIGlmIGluY2x1ZGluZyBiYWNrdXAgZmlsZQotLy8gVGhlIGNvbmZpZyBzYXZpbmcgZGVsYXkgbXVzdCBiZSBiaWdnZXIgdGhhbiB0aGlzIHZhbHVlIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgZGlzawotc3RhdGljIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga01pbkNvbmZpZ1NhdmVEZWxheSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApOwotCi1jb25zdCBpbnQga0NvbmZpZ0ZpbGVDb21wYXJlUGFzcyA9IDE7Ci1jb25zdCBpbnQga0NvbmZpZ0JhY2t1cENvbXBhcmVQYXNzID0gMjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtDb25maWdGaWxlUHJlZml4ID0gImJ0X2NvbmZpZy1vcmlnaW4iOwotY29uc3Qgc3RkOjpzdHJpbmcga0NvbmZpZ0ZpbGVIYXNoID0gImhhc2giOwotCi1jb25zdCBzdGQ6OnN0cmluZyBTdG9yYWdlTW9kdWxlOjprSW5mb1NlY3Rpb24gPSAiSW5mbyI7Ci1jb25zdCBzdGQ6OnN0cmluZyBTdG9yYWdlTW9kdWxlOjprRmlsZVNvdXJjZVByb3BlcnR5ID0gIkZpbGVTb3VyY2UiOwotY29uc3Qgc3RkOjpzdHJpbmcgU3RvcmFnZU1vZHVsZTo6a1RpbWVDcmVhdGVkUHJvcGVydHkgPSAiVGltZUNyZWF0ZWQiOwotY29uc3Qgc3RkOjpzdHJpbmcgU3RvcmFnZU1vZHVsZTo6a1RpbWVDcmVhdGVkRm9ybWF0ID0gIiVZLSVtLSVkICVIOiVNOiVTIjsKLQotY29uc3Qgc3RkOjpzdHJpbmcgU3RvcmFnZU1vZHVsZTo6a0FkYXB0ZXJTZWN0aW9uID0gIkFkYXB0ZXIiOwotCi1TdG9yYWdlTW9kdWxlOjpTdG9yYWdlTW9kdWxlKAotICAgIHN0ZDo6c3RyaW5nIGNvbmZpZ19maWxlX3BhdGgsCi0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBjb25maWdfc2F2ZV9kZWxheSwKLSAgICBzaXplX3QgdGVtcF9kZXZpY2VzX2NhcGFjaXR5LAotICAgIGJvb2wgaXNfcmVzdHJpY3RlZF9tb2RlLAotICAgIGJvb2wgaXNfc2luZ2xlX3VzZXJfbW9kZSkKLSAgICA6IGNvbmZpZ19maWxlX3BhdGhfKHN0ZDo6bW92ZShjb25maWdfZmlsZV9wYXRoKSksCi0gICAgICBjb25maWdfc2F2ZV9kZWxheV8oY29uZmlnX3NhdmVfZGVsYXkpLAotICAgICAgdGVtcF9kZXZpY2VzX2NhcGFjaXR5Xyh0ZW1wX2RldmljZXNfY2FwYWNpdHkpLAotICAgICAgaXNfcmVzdHJpY3RlZF9tb2RlXyhpc19yZXN0cmljdGVkX21vZGUpLAotICAgICAgaXNfc2luZ2xlX3VzZXJfbW9kZV8oaXNfc2luZ2xlX3VzZXJfbW9kZSkgewotICAvLyBlLmcuICIvZGF0YS9taXNjL2JsdWVkcm9pZC9idF9jb25maWcuY29uZiIgdG8gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5iYWsiCi0gIGNvbmZpZ19iYWNrdXBfcGF0aF8gPSBjb25maWdfZmlsZV9wYXRoXy5zdWJzdHIoMCwgY29uZmlnX2ZpbGVfcGF0aF8uZmluZF9sYXN0X29mKCcuJykpICsgIi5iYWsiOwotICBBU1NFUlRfTE9HKAotICAgICAgY29uZmlnX3NhdmVfZGVsYXkgPiBrTWluQ29uZmlnU2F2ZURlbGF5LAotICAgICAgIkNvbmZpZyBzYXZlIGRlbGF5IG9mICVsbGQgbXMgaXMgbm90IGVub3VnaCwgbXVzdCBiZSBhdCBsZWFzdCAlbGxkIG1zIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgZGlzayIsCi0gICAgICBjb25maWdfc2F2ZV9kZWxheV8uY291bnQoKSwKLSAgICAgIGtNaW5Db25maWdTYXZlRGVsYXkuY291bnQoKSk7Ci19OwotCi1TdG9yYWdlTW9kdWxlOjp+U3RvcmFnZU1vZHVsZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHBpbXBsXy5yZXNldCgpOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IFN0b3JhZ2VNb2R1bGU6OkZhY3RvcnkgPSBNb2R1bGVGYWN0b3J5KFtdKCkgewotICByZXR1cm4gbmV3IFN0b3JhZ2VNb2R1bGUoCi0gICAgICBvczo6UGFyYW1ldGVyUHJvdmlkZXI6OkNvbmZpZ0ZpbGVQYXRoKCksIGtEZWZhdWx0Q29uZmlnU2F2ZURlbGF5LCBrRGVmYXVsdFRlbXBEZXZpY2VDYXBhY2l0eSwgZmFsc2UsIGZhbHNlKTsKLX0pOwotCi1zdHJ1Y3QgU3RvcmFnZU1vZHVsZTo6aW1wbCB7Ci0gIGV4cGxpY2l0IGltcGwoSGFuZGxlciogaGFuZGxlciwgQ29uZmlnQ2FjaGUgY2FjaGUsIHNpemVfdCBpbl9tZW1vcnlfY2FjaGVfc2l6ZV9saW1pdCkKLSAgICAgIDogY29uZmlnX3NhdmVfYWxhcm1fKGhhbmRsZXIpLCBjYWNoZV8oc3RkOjptb3ZlKGNhY2hlKSksIG1lbW9yeV9vbmx5X2NhY2hlXyhpbl9tZW1vcnlfY2FjaGVfc2l6ZV9saW1pdCwge30pIHt9Ci0gIEFsYXJtIGNvbmZpZ19zYXZlX2FsYXJtXzsKLSAgQ29uZmlnQ2FjaGUgY2FjaGVfOwotICBDb25maWdDYWNoZSBtZW1vcnlfb25seV9jYWNoZV87Ci0gIGJvb2wgaGFzX3BlbmRpbmdfY29uZmlnX3NhdmVfID0gZmFsc2U7Ci19OwotCi1NdXRhdGlvbiBTdG9yYWdlTW9kdWxlOjpNb2RpZnkoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICByZXR1cm4gTXV0YXRpb24oJnBpbXBsXy0+Y2FjaGVfLCAmcGltcGxfLT5tZW1vcnlfb25seV9jYWNoZV8pOwotfQotCi1Db25maWdDYWNoZSogU3RvcmFnZU1vZHVsZTo6R2V0Q29uZmlnQ2FjaGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICByZXR1cm4gJnBpbXBsXy0+Y2FjaGVfOwotfQotCi1Db25maWdDYWNoZSogU3RvcmFnZU1vZHVsZTo6R2V0TWVtb3J5T25seUNvbmZpZ0NhY2hlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuICZwaW1wbF8tPm1lbW9yeV9vbmx5X2NhY2hlXzsKLX0KLQotdm9pZCBTdG9yYWdlTW9kdWxlOjpTYXZlRGVsYXllZCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGlmIChwaW1wbF8tPmhhc19wZW5kaW5nX2NvbmZpZ19zYXZlXykgewotICAgIHJldHVybjsKLSAgfQotICBwaW1wbF8tPmNvbmZpZ19zYXZlX2FsYXJtXy5TY2hlZHVsZSgKLSAgICAgIGNvbW1vbjo6QmluZE9uY2UoJlN0b3JhZ2VNb2R1bGU6OlNhdmVJbW1lZGlhdGVseSwgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSwgY29uZmlnX3NhdmVfZGVsYXlfKTsKLSAgcGltcGxfLT5oYXNfcGVuZGluZ19jb25maWdfc2F2ZV8gPSB0cnVlOwotfQotCi12b2lkIFN0b3JhZ2VNb2R1bGU6OlNhdmVJbW1lZGlhdGVseSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGlmIChwaW1wbF8tPmhhc19wZW5kaW5nX2NvbmZpZ19zYXZlXykgewotICAgIHBpbXBsXy0+Y29uZmlnX3NhdmVfYWxhcm1fLkNhbmNlbCgpOwotICAgIHBpbXBsXy0+aGFzX3BlbmRpbmdfY29uZmlnX3NhdmVfID0gZmFsc2U7Ci0gIH0KLSAgLy8gMS4gcmVuYW1lIG9sZCBjb25maWcgdG8gYmFja3VwIG5hbWUKLSAgaWYgKG9zOjpGaWxlRXhpc3RzKGNvbmZpZ19maWxlX3BhdGhfKSkgewotICAgIEFTU0VSVChvczo6UmVuYW1lRmlsZShjb25maWdfZmlsZV9wYXRoXywgY29uZmlnX2JhY2t1cF9wYXRoXykpOwotICB9Ci0gIC8vIDIuIHdyaXRlIGluLW1lbW9yeSBjb25maWcgdG8gZGlzaywgaWYgZmFpbGVkLCBiYWNrdXAgY2FuIHN0aWxsIGJlIHVzZWQKLSAgQVNTRVJUKExlZ2FjeUNvbmZpZ0ZpbGU6OkZyb21QYXRoKGNvbmZpZ19maWxlX3BhdGhfKS5Xcml0ZShwaW1wbF8tPmNhY2hlXykpOwotICAvLyAzLiBub3cgd3JpdGUgYmFjayB1cCB0byBkaXNrIGFzIHdlbGwKLSAgQVNTRVJUKExlZ2FjeUNvbmZpZ0ZpbGU6OkZyb21QYXRoKGNvbmZpZ19iYWNrdXBfcGF0aF8pLldyaXRlKHBpbXBsXy0+Y2FjaGVfKSk7Ci0gIC8vIDQuIHNhdmUgY2hlY2tzdW0gaWYgaXQgaXMgcnVubmluZyBpbiBjb21tb24gY3JpdGVyaWEgbW9kZQotICBpZiAoYmx1ZXRvb3RoOjpvczo6UGFyYW1ldGVyUHJvdmlkZXI6OkdldEJ0S2V5c3RvcmVJbnRlcmZhY2UoKSAhPSBudWxscHRyICYmCi0gICAgICBibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6SXNDb21tb25Dcml0ZXJpYU1vZGUoKSkgewotICAgIGJsdWV0b290aDo6b3M6OlBhcmFtZXRlclByb3ZpZGVyOjpHZXRCdEtleXN0b3JlSW50ZXJmYWNlKCktPnNldF9lbmNyeXB0X2tleV9vcl9yZW1vdmVfa2V5KAotICAgICAgICBrQ29uZmlnRmlsZVByZWZpeCwga0NvbmZpZ0ZpbGVIYXNoKTsKLSAgfQotfQotCi12b2lkIFN0b3JhZ2VNb2R1bGU6Okxpc3REZXBlbmRlbmNpZXMoTW9kdWxlTGlzdCogbGlzdCkgY29uc3QgewotICAvLyBObyBkZXBlbmRlbmNpZXMKLX0KLQotdm9pZCBTdG9yYWdlTW9kdWxlOjpTdGFydCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHN0ZDo6c3RyaW5nIGZpbGVfc291cmNlOwotICBpZiAob3M6OkdldFN5c3RlbVByb3BlcnR5KGtGYWN0b3J5UmVzZXRQcm9wZXJ0eSkgPT0gInRydWUiKSB7Ci0gICAgTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgoY29uZmlnX2ZpbGVfcGF0aF8pLkRlbGV0ZSgpOwotICAgIExlZ2FjeUNvbmZpZ0ZpbGU6OkZyb21QYXRoKGNvbmZpZ19iYWNrdXBfcGF0aF8pLkRlbGV0ZSgpOwotICB9Ci0gIGlmICghaXNfY29uZmlnX2NoZWNrc3VtX3Bhc3Moa0NvbmZpZ0ZpbGVDb21wYXJlUGFzcykpIHsKLSAgICBMZWdhY3lDb25maWdGaWxlOjpGcm9tUGF0aChjb25maWdfZmlsZV9wYXRoXykuRGVsZXRlKCk7Ci0gIH0KLSAgaWYgKCFpc19jb25maWdfY2hlY2tzdW1fcGFzcyhrQ29uZmlnQmFja3VwQ29tcGFyZVBhc3MpKSB7Ci0gICAgTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgoY29uZmlnX2JhY2t1cF9wYXRoXykuRGVsZXRlKCk7Ci0gIH0KLSAgYXV0byBjb25maWcgPSBMZWdhY3lDb25maWdGaWxlOjpGcm9tUGF0aChjb25maWdfZmlsZV9wYXRoXykuUmVhZCh0ZW1wX2RldmljZXNfY2FwYWNpdHlfKTsKLSAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy0+SGFzU2VjdGlvbihrQWRhcHRlclNlY3Rpb24pKSB7Ci0gICAgTE9HX1dBUk4oImNhbm5vdCBsb2FkIGNvbmZpZyBhdCAlcywgdXNpbmcgYmFja3VwIGF0ICVzLiIsIGNvbmZpZ19maWxlX3BhdGhfLmNfc3RyKCksIGNvbmZpZ19iYWNrdXBfcGF0aF8uY19zdHIoKSk7Ci0gICAgY29uZmlnID0gTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgoY29uZmlnX2JhY2t1cF9wYXRoXykuUmVhZCh0ZW1wX2RldmljZXNfY2FwYWNpdHlfKTsKLSAgICBmaWxlX3NvdXJjZSA9ICJCYWNrdXAiOwotICB9Ci0gIGlmICghY29uZmlnIHx8ICFjb25maWctPkhhc1NlY3Rpb24oa0FkYXB0ZXJTZWN0aW9uKSkgewotICAgIExPR19XQVJOKCJjYW5ub3QgbG9hZCBiYWNrdXAgY29uZmlnIGF0ICVzOyBjcmVhdGluZyBuZXcgZW1wdHkgb25lcyIsIGNvbmZpZ19iYWNrdXBfcGF0aF8uY19zdHIoKSk7Ci0gICAgY29uZmlnLmVtcGxhY2UodGVtcF9kZXZpY2VzX2NhcGFjaXR5XywgRGV2aWNlOjprTGlua0tleVByb3BlcnRpZXMpOwotICAgIGZpbGVfc291cmNlID0gIkVtcHR5IjsKLSAgfQotICBpZiAoIWZpbGVfc291cmNlLmVtcHR5KCkpIHsKLSAgICBjb25maWctPlNldFByb3BlcnR5KGtJbmZvU2VjdGlvbiwga0ZpbGVTb3VyY2VQcm9wZXJ0eSwgc3RkOjptb3ZlKGZpbGVfc291cmNlKSk7Ci0gIH0KLSAgLy8gQ2xlYW51cCB0ZW1wb3JhcnkgcGFpcmluZ3MgaWYgd2UgaGF2ZSBsZWZ0IGd1ZXN0IG1vZGUKLSAgaWYgKCFpc19yZXN0cmljdGVkX21vZGVfKSB7Ci0gICAgY29uZmlnLT5SZW1vdmVTZWN0aW9uV2l0aFByb3BlcnR5KCJSZXN0cmljdGVkIik7Ci0gIH0KLSAgLy8gUmVhZCBvciBzZXQgY29uZmlnIGZpbGUgY3JlYXRpb24gdGltZXN0YW1wCi0gIGF1dG8gdGltZV9zdHIgPSBjb25maWctPkdldFByb3BlcnR5KGtJbmZvU2VjdGlvbiwga1RpbWVDcmVhdGVkUHJvcGVydHkpOwotICBpZiAoIXRpbWVfc3RyKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKLSAgICBhdXRvIG5vd190aW1lX3QgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3Qobm93KTsKLSAgICBzcyA8PCBzdGQ6OnB1dF90aW1lKHN0ZDo6bG9jYWx0aW1lKCZub3dfdGltZV90KSwga1RpbWVDcmVhdGVkRm9ybWF0LmNfc3RyKCkpOwotICAgIGNvbmZpZy0+U2V0UHJvcGVydHkoa0luZm9TZWN0aW9uLCBrVGltZUNyZWF0ZWRQcm9wZXJ0eSwgc3Muc3RyKCkpOwotICB9Ci0gIGNvbmZpZy0+Rml4RGV2aWNlVHlwZUluY29uc2lzdGVuY2llcygpOwotICBjb25maWctPlNldFBlcnNpc3RlbnRDb25maWdDaGFuZ2VkQ2FsbGJhY2soW3RoaXNdIHsgdGhpcy0+Q2FsbE9uKHRoaXMsICZTdG9yYWdlTW9kdWxlOjpTYXZlRGVsYXllZCk7IH0pOwotICAvLyBUT0RPIChiLzE1ODAzNTg4OSkgTWlncmF0ZSBtZXRyaWNzIG1vZHVsZSB0byBHRAotICBwaW1wbF8gPSBzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KEdldEhhbmRsZXIoKSwgc3RkOjptb3ZlKGNvbmZpZy52YWx1ZSgpKSwgdGVtcF9kZXZpY2VzX2NhcGFjaXR5Xyk7Ci0gIFNhdmVEZWxheWVkKCk7Ci0gIGlmIChibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICBibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpLT5Db252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCk7Ci0gIH0KLX0KLQotdm9pZCBTdG9yYWdlTW9kdWxlOjpTdG9wKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgU2F2ZUltbWVkaWF0ZWx5KCk7Ci0gIGlmIChibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpICE9IG51bGxwdHIpIHsKLSAgICBibHVldG9vdGg6Om9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0QnRLZXlzdG9yZUludGVyZmFjZSgpLT5jbGVhcl9tYXAoKTsKLSAgfQotICBwaW1wbF8ucmVzZXQoKTsKLX0KLQotc3RkOjpzdHJpbmcgU3RvcmFnZU1vZHVsZTo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiU3RvcmFnZSBNb2R1bGUiOwotfQotCi1EZXZpY2UgU3RvcmFnZU1vZHVsZTo6R2V0RGV2aWNlQnlMZWdhY3lLZXkoaGNpOjpBZGRyZXNzIGxlZ2FjeV9rZXlfYWRkcmVzcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIERldmljZSgKLSAgICAgICZwaW1wbF8tPmNhY2hlXywKLSAgICAgICZwaW1wbF8tPm1lbW9yeV9vbmx5X2NhY2hlXywKLSAgICAgIHN0ZDo6bW92ZShsZWdhY3lfa2V5X2FkZHJlc3MpLAotICAgICAgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6TEVHQUNZX0tFWV9BRERSRVNTKTsKLX0KLQotRGV2aWNlIFN0b3JhZ2VNb2R1bGU6OkdldERldmljZUJ5Q2xhc3NpY01hY0FkZHJlc3MoaGNpOjpBZGRyZXNzIGNsYXNzaWNfYWRkcmVzcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIERldmljZSgKLSAgICAgICZwaW1wbF8tPmNhY2hlXywKLSAgICAgICZwaW1wbF8tPm1lbW9yeV9vbmx5X2NhY2hlXywKLSAgICAgIHN0ZDo6bW92ZShjbGFzc2ljX2FkZHJlc3MpLAotICAgICAgRGV2aWNlOjpDb25maWdLZXlBZGRyZXNzVHlwZTo6Q0xBU1NJQ19BRERSRVNTKTsKLX0KLQotRGV2aWNlIFN0b3JhZ2VNb2R1bGU6OkdldERldmljZUJ5TGVJZGVudGl0eUFkZHJlc3MoaGNpOjpBZGRyZXNzIGxlX2lkZW50aXR5X2FkZHJlc3MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHJldHVybiBEZXZpY2UoCi0gICAgICAmcGltcGxfLT5jYWNoZV8sCi0gICAgICAmcGltcGxfLT5tZW1vcnlfb25seV9jYWNoZV8sCi0gICAgICBzdGQ6Om1vdmUobGVfaWRlbnRpdHlfYWRkcmVzcyksCi0gICAgICBEZXZpY2U6OkNvbmZpZ0tleUFkZHJlc3NUeXBlOjpMRV9JREVOVElUWV9BRERSRVNTKTsKLX0KLQotQWRhcHRlckNvbmZpZyBTdG9yYWdlTW9kdWxlOjpHZXRBZGFwdGVyQ29uZmlnKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIEFkYXB0ZXJDb25maWcoJnBpbXBsXy0+Y2FjaGVfLCAmcGltcGxfLT5tZW1vcnlfb25seV9jYWNoZV8sIGtBZGFwdGVyU2VjdGlvbik7Ci19Ci0KLXN0ZDo6dmVjdG9yPERldmljZT4gU3RvcmFnZU1vZHVsZTo6R2V0Qm9uZGVkRGV2aWNlcygpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGF1dG8gcGVyc2lzdGVudF9zZWN0aW9ucyA9IEdldENvbmZpZ0NhY2hlKCktPkdldFBlcnNpc3RlbnRTZWN0aW9ucygpOwotICBzdGQ6OnZlY3RvcjxEZXZpY2U+IHJlc3VsdDsKLSAgcmVzdWx0LnJlc2VydmUocGVyc2lzdGVudF9zZWN0aW9ucy5zaXplKCkpOwotICBmb3IgKGNvbnN0IGF1dG8mIHNlY3Rpb24gOiBwZXJzaXN0ZW50X3NlY3Rpb25zKSB7Ci0gICAgcmVzdWx0LmVtcGxhY2VfYmFjaygmcGltcGxfLT5jYWNoZV8sICZwaW1wbF8tPm1lbW9yeV9vbmx5X2NhY2hlXywgc2VjdGlvbik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBTdG9yYWdlTW9kdWxlOjppc19jb25maWdfY2hlY2tzdW1fcGFzcyhpbnQgY2hlY2tfYml0KSB7Ci0gIHJldHVybiAoKG9zOjpQYXJhbWV0ZXJQcm92aWRlcjo6R2V0Q29tbW9uQ3JpdGVyaWFDb25maWdDb21wYXJlUmVzdWx0KCkgJiBjaGVja19iaXQpID09IGNoZWNrX2JpdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9nZC9zdG9yYWdlL3N0b3JhZ2VfbW9kdWxlLmggYi9nZC9zdG9yYWdlL3N0b3JhZ2VfbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTNhNGUuLjAwMDAwMDAKLS0tIGEvZ2Qvc3RvcmFnZS9zdG9yYWdlX21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9hZGFwdGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgInN0b3JhZ2UvY29uZmlnX2NhY2hlLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9kZXZpY2UuaCIKLSNpbmNsdWRlICJzdG9yYWdlL211dGF0aW9uLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2Ugc2hpbSB7Ci1jbGFzcyBCdGlmQ29uZmlnSW50ZXJmYWNlOwotfQotCi1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLWNsYXNzIFN0b3JhZ2VNb2R1bGUgOiBwdWJsaWMgYmx1ZXRvb3RoOjpNb2R1bGUgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJbmZvU2VjdGlvbjsKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGaWxlU291cmNlUHJvcGVydHk7Ci0gIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGltZUNyZWF0ZWRQcm9wZXJ0eTsKLSAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaW1lQ3JlYXRlZEZvcm1hdDsKLQotICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FkYXB0ZXJTZWN0aW9uOwotCi0gIH5TdG9yYWdlTW9kdWxlKCk7Ci0gIHN0YXRpYyBjb25zdCBNb2R1bGVGYWN0b3J5IEZhY3Rvcnk7Ci0KLSAgLy8gTWV0aG9kcyB0byBhY2Nlc3MgdGhlIHN0b3JhZ2UgbGF5ZXIgdmlhIERldmljZSBhYnN0cmFjdGlvbgotICAvLyAtIERldmljZXMgd2lsbCBiZSBsYXppbHkgY3JlYXRlZCB3aGVuIG1ldGhvZHMgYmVsb3cgYXJlIGNhbGxlZC4gSGVuY2UsIG5vIHN0ZDo6b3B0aW9uYWw8PiBub3IgbnVsbHB0ciBpcyB1c2VkIGluCi0gIC8vICAgdGhlIHJldHVybiB0eXBlLiBVc2VyIG9mIHRoZSBBUEkgY2FuIHVzZSB0aGUgRGV2aWNlIG9iamVjdCdzIEFQSSB0byBmaW5kIG91dCBpZiB0aGUgZGV2aWNlIGhhcyBleGlzdGVkIGJlZm9yZQotICAvLyAtIERldmljZXMgd2l0aCBubyBjb25maWcgdmFsdWVzIHdpbGwgbm90IGJlIHNhdmVkIHRvIGNvbmZpZyBjYWNoZQotICAvLyAtIERldmljZXMgdGhhdCBhcmUgbm90IHBhaXJlZCB3aWxsIGFsc28gYmUgZGlzY2FyZGVkIHdoZW4gc3RhY2sgc2h1dGRvd24KLQotICAvLyBDb25jZXB0OgotICAvLwotICAvLyBCUi9FRFIgQWRkcmVzczoKLSAgLy8gIC0+IFB1YmxpYyBzdGF0aWMgYWRkcmVzcyBvbmx5LCBiZWdpbiB3aXRoIDMgYnl0ZSBJRUVFIGFzc2lnbmVkIE9VSSBudW1iZXIKLSAgLy8KLSAgLy8gQkxFIEFkZHJlc3NlcwotICAvLyAgLT4gUHVibGljIEFkZHJlc3M6IGJlZ2luIHdpdGggSUVFRSBhc3NpZ25lZCBPVUkgbnVtYmVyCi0gIC8vICAgICAtPiBTdGF0aWM6IHN0YXRpYyBwdWJsaWMgYWRkcmVzcyBkbyBub3QgY2hhbmdlCi0gIC8vICAgICAtPiBQcml2YXRlL1ZhcmlhYmxlOiBXZSBoYXZlbid0IHNlZW4gcHJpdmF0ZS92YXJpYWJsZSBwdWJsaWMgYWRkcmVzcyB5ZXQKLSAgLy8gIC0+IFJhbmRvbSBBZGRyZXNzOiByYW5kb21seSBnZW5lcmF0ZWQsIGRvZXMgbm90IGJlZ2luIHdpdGggSUVFRSBhc3NpZ25lZCBPVUkgbnVtYmVyCi0gIC8vICAgICAtPiBTdGF0aWM6IHN0YXRpYyByYW5kb20gYWRkcmVzcyBkbyBub3QgY2hhbmdlCi0gIC8vICAgICAtPiBQcml2YXRlL1ZhcmlhYmxlOiBwcml2YXRlIHJhbmRvbSBhZGRyZXNzIGNoYW5nZXMgb25jZSBzbyBvZnRlbgotICAvLyAgICAgICAgLT4gUmVzb2x2YWJsZTogdGhpcyBhZGRyZXNzIGNhbiBiZSByZXNvbHZlZCBpbnRvIGEgc3RhdGljIGFkZHJlc3MgdXNpbmcgaWRlbnRpdHkgcmVzb2x2aW5nIGtleSAoSVJLKQotICAvLyAgICAgICAgLT4gTm9uLXJlc29sdmFibGU6IHRoaXMgYWRkcmVzcyBpcyBmb3IgdGVtcG9yYXJ5IHVzZSBvbmx5LCBkbyBub3Qgc2F2ZSB0aGlzIGFkZHJlc3MKLSAgLy8KLSAgLy8gTUFDIGFkZHJlc3NlcyBhcmUgc2l4IGJ5dGVzIG9ubHkgYW5kIGhlbmNlIGFyZSBvbmx5IHJlZ2lvbmFsbHkgdW5pcXVlCi0KLSAgLy8gR2V0IGEgZGV2aWNlIG9iamVjdCB1c2luZyB0aGUgfGxlZ2FjeV9rZXlfYWRkcmVzc3wuIEluIGxlZ2FjeSBjb25maWcsIGVhY2ggZGV2aWNlJ3MgY29uZmlnIGlzIHN0b3JlZCBpbiBhIGNvbmZpZwotICAvLyBzZWN0aW9uIGtleWVkIGJ5IGEgc2luZ2xlIE1BQyBhZGRyZXNzLiBGb3IgQlIvRURSIGRldmljZSwgdGhpcyBpcyBzdHJhaWdodGZvcndhcmQgYXMgYSBCUi9FRFIgZGV2aWNlIGhhcyBvbmx5IGEKLSAgLy8gc2luZ2xlIHB1YmxpYyBzdGF0aWMgTUFDIGFkZHJlc3MuIEhvd2V2ZXIsIGZvciBMRSBkZXZpY2VzIHVzaW5nIHByaXZhdGUgYWRkcmVzc2VzLCB3ZSBvbmx5IGxlYXJuIGl0cyByZWFsIHN0YXRpYwotICAvLyBhZGRyZXNzIGFmdGVyIHBhaXJpbmcuIFNpbmNlIHdlIHN0aWxsIG5lZWQgdG8gc3RvcmUgdGhhdCBkZXZpY2UncyBpbmZvcm1hdGlvbiBwcmlvciB0byBwYWlyaW5nLCB3ZSB1c2UgdGhlCi0gIC8vIGZpcnN0LXNlZW4gYWRkcmVzcyBvZiB0aGF0IGRldmljZSwgbm8gbWF0dGVyIHJhbmRvbSBwcml2YXRlIG9yIHN0YXRpYyBwdWJsaWMsIGFzIGEgImtleSIgdG8gc3RvcmUgdGhhdCBkZXZpY2UncwotICAvLyBjb25maWcuIFRoaXMgbWV0aG9kIGdpdmVzIHlvdSBhIGRldmljZSBvYmplY3QgdXNpbmcgdGhpcyBsZWdhY3kga2V5LiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgZGV2aWNlIHdpbGwKLSAgLy8gYmUgbGF6aWx5IGNyZWF0ZWQgaW4gdGhlIGNvbmZpZwotICBEZXZpY2UgR2V0RGV2aWNlQnlMZWdhY3lLZXkoaGNpOjpBZGRyZXNzIGxlZ2FjeV9rZXlfYWRkcmVzcyk7Ci0KLSAgLy8gQSBjbGFzc2ljIChCUi9FRFIpIG9yIGR1YWwgbW9kZSBkZXZpY2UgY2FuIGJlIHVuaXF1ZWx5IGxvY2F0ZWQgYnkgaXRzIGNsYXNzaWMgKEJSL0VEUikgTUFDIGFkZHJlc3MKLSAgRGV2aWNlIEdldERldmljZUJ5Q2xhc3NpY01hY0FkZHJlc3MoaGNpOjpBZGRyZXNzIGNsYXNzaWNfYWRkcmVzcyk7Ci0KLSAgLy8gQSBMRSBvciBkdWFsIG1vZGUgZGV2aWNlIGNhbiBiZSB1bmlxdWVseSBsb2NhdGVkIGJ5IGl0cyBpZGVudGl0eSBhZGRyZXNzIHRoYXQgaXMgZWl0aGVyOgotICAvLyAgIC0+IFB1YmxpYyBzdGF0aWMgYWRkcmVzcwotICAvLyAgIC0+IFJhbmRvbSBzdGF0aWMgYWRkcmVzcwotICAvLyBJZiByZW1vdGUgZGV2aWNlIHVzZXMgTEUgcmFuZG9tIHByaXZhdGUgcmVzb2x2YWJsZSBhZGRyZXNzLCB1c2VyIG9mIHRoaXMgQVBJIG11c3QgcmVzb2x2ZSBpdHMgaWRlbnRpdHkgYWRkcmVzcwotICAvLyBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIGRldmljZSBvYmplY3QKLSAgLy8KLSAgLy8gTm90ZTogQSBkdWFsIG1vZGUgZGV2aWNlJ3MgaWRlbnRpdHkgYWRkcmVzcyBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyBpdHMgQlIvRURSIGFkZHJlc3MsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlCi0gIC8vIGRpZmZlcmVudC4gSGVuY2UsIHBsZWFzZSBkb24ndCBtYWtlIHN1Y2ggYXNzdW1wdGlvbiBhbmQgZG9uJ3QgdXNlIEdldERldmljZUJ5QnJFZHJNYWNBZGRyZXNzKCkgaW50ZXJjaGFuZ2VhYmx5Ci0gIERldmljZSBHZXREZXZpY2VCeUxlSWRlbnRpdHlBZGRyZXNzKGhjaTo6QWRkcmVzcyBsZV9pZGVudGl0eV9hZGRyZXNzKTsKLQotICAvLyBBIHRoaW5rIGNvcHlhYmxlLCBtb3ZhYmxlLCBjb21wYXJhYmxlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIGFkYXB0ZXIgbGV2ZWwgaW5mb3JtYXRpb24KLSAgQWRhcHRlckNvbmZpZyBHZXRBZGFwdGVyQ29uZmlnKCk7Ci0KLSAgLy8gR2V0IGEgbGlzdCBvZiBib25kZWQgZGV2aWNlcyBmcm9tIGNvbmZpZwotICBzdGQ6OnZlY3RvcjxEZXZpY2U+IEdldEJvbmRlZERldmljZXMoKTsKLQotICAvLyBNb2RpZnkgdGhlIHVuZGVybHlpbmcgY29uZmlnIGJ5IHN0YXJ0aW5nIGEgbXV0YXRpb24uIEFsbCBlbnRyaWVzIGluIHRoZSBtdXRhdGlvbiB3aWxsIGJlIGFwcGxpZWQgYXRvbWljYWxseSB3aGVuCi0gIC8vIENvbW1pdCgpIGlzIGNhbGxlZC4gVXNlciBzaG91bGQgbmV2ZXIgdG91Y2ggQ29uZmlnQ2FjaGUoKSBkaXJlY3RseS4KLSAgTXV0YXRpb24gTW9kaWZ5KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgTGlzdERlcGVuZGVuY2llcyhNb2R1bGVMaXN0KiBsaXN0KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdGFydCgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotICBmcmllbmQgc2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTsKLSAgLy8gRm9yIHNoaW0gbGF5ZXIgb25seQotICBDb25maWdDYWNoZSogR2V0Q29uZmlnQ2FjaGUoKTsKLSAgLy8gRm9yIHVuaXQgdGVzdCBvbmx5Ci0gIENvbmZpZ0NhY2hlKiBHZXRNZW1vcnlPbmx5Q29uZmlnQ2FjaGUoKTsKLSAgLy8gTm9ybWFsbHksIHVuZGVybHlpbmcgY29uZmlnIHdpbGwgYmUgc2F2ZWQgYXQgbW9zdCAzIHNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGNvbmZpZyBjaGFuZ2UgaW4gYSBzZXJpZXMgb2YgY2hhbmdlcwotICAvLyBUaGlzIG1ldGhvZCB0cmlnZ2VycyB0aGUgZGVsYXllZCBzYXZpbmcgYXV0b21hdGljYWxseSwgdGhlIGRlbGF5IGlzIGVxdWFsIHRvIHxjb25maWdfc2F2ZV9kZWxheV98Ci0gIHZvaWQgU2F2ZURlbGF5ZWQoKTsKLSAgLy8gSW4gc29tZSBjYXNlcywgb25lIG1heSB3YW50IHRvIHNhdmUgdGhlIGNvbmZpZyBpbW1lZGlhdGVseSB0byBkaXNrLiBDYWxsIHRoaXMgbWV0aG9kIHdpdGggY2F1dGlvbiBhcyBpdCBydW5zCi0gIC8vIGltbWVkaWF0ZWx5IG9uIHRoZSBjYWxsaW5nIHRocmVhZAotICB2b2lkIFNhdmVJbW1lZGlhdGVseSgpOwotCi0gIC8vIENyZWF0ZSB0aGUgc3RvcmFnZSBtb2R1bGUgd2hlcmU6Ci0gIC8vIC0gY29uZmlnX2ZpbGVfcGF0aCBpcyB0aGUgcGF0aCB0byB0aGUgY29uZmlnIGZpbGUgb24gZGlzaywgYSAuYmFrIGZpbGUgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsCi0gIC8vIC0gY29uZmlnX3NhdmVfZGVsYXkgaXMgdGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHRvIGR1bXAgY29uZmlnIHRvIGRpc2sgYWZ0ZXIgU2F2ZURlbGF5ZWQoKSBpcyBjYWxsZWQKLSAgLy8gLSB0ZW1wX2RldmljZXNfY2FwYWNpdHkgaXMgdGhlIG51bWJlciBvZiB0ZW1wb3JhcnksIHR5cGljYWxseSB1bnBhaXJlZCBkZXZpY2VzIHRvIGhvbGQgaW4gYSBtZW1vcnkgYmFzZWQgTFJVCi0gIC8vIC0gaXNfcmVzdHJpY3RlZF9tb2RlIGFuZCBpc19zaW5nbGVfdXNlcl9tb2RlIGFyZSBmbGFncyBmcm9tIHVwcGVyIGxheWVyCi0gIFN0b3JhZ2VNb2R1bGUoCi0gICAgICBzdGQ6OnN0cmluZyBjb25maWdfZmlsZV9wYXRoLAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBjb25maWdfc2F2ZV9kZWxheSwKLSAgICAgIHNpemVfdCB0ZW1wX2RldmljZXNfY2FwYWNpdHksCi0gICAgICBib29sIGlzX3Jlc3RyaWN0ZWRfbW9kZSwKLSAgICAgIGJvb2wgaXNfc2luZ2xlX3VzZXJfbW9kZSk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgbXV0YWJsZSBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBtdXRleF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0gIHN0ZDo6c3RyaW5nIGNvbmZpZ19maWxlX3BhdGhfOwotICBzdGQ6OnN0cmluZyBjb25maWdfYmFja3VwX3BhdGhfOwotICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGNvbmZpZ19zYXZlX2RlbGF5XzsKLSAgc2l6ZV90IHRlbXBfZGV2aWNlc19jYXBhY2l0eV87Ci0gIGJvb2wgaXNfcmVzdHJpY3RlZF9tb2RlXzsKLSAgYm9vbCBpc19zaW5nbGVfdXNlcl9tb2RlXzsKLSAgc3RhdGljIGJvb2wgaXNfY29uZmlnX2NoZWNrc3VtX3Bhc3MoaW50IGNoZWNrX2JpdCk7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0b3JhZ2VNb2R1bGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2dkL3N0b3JhZ2Uvc3RvcmFnZV9tb2R1bGVfdGVzdC5jYyBiL2dkL3N0b3JhZ2Uvc3RvcmFnZV9tb2R1bGVfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4NWQ5MS4uMDAwMDAwMAotLS0gYS9nZC9zdG9yYWdlL3N0b3JhZ2VfbW9kdWxlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8ZmlsZXN5c3RlbT4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm9zL2ZpbGVzLmgiCi0jaW5jbHVkZSAic3RvcmFnZS9jb25maWdfY2FjaGUuaCIKLSNpbmNsdWRlICJzdG9yYWdlL2RldmljZS5oIgotI2luY2x1ZGUgInN0b3JhZ2UvbGVnYWN5X2NvbmZpZ19maWxlLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpUZXN0TW9kdWxlUmVnaXN0cnk7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6Q29uZmlnQ2FjaGU7Ci11c2luZyBibHVldG9vdGg6OnN0b3JhZ2U6OkRldmljZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6TGVnYWN5Q29uZmlnRmlsZTsKLXVzaW5nIGJsdWV0b290aDo6c3RvcmFnZTo6U3RvcmFnZU1vZHVsZTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga1Rlc3RDb25maWdTYXZlRGVsYXkgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCk7Ci0vLyBBc3N1bWUgaXQgdGFrZXMgYXQgbW9zdCAxIHNlY29uZCB0byB3cml0ZSB0aGUgZmlsZQotc3RhdGljIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga1Rlc3RDb25maWdTYXZlV2FpdERlbGF5ID0KLSAgICBrVGVzdENvbmZpZ1NhdmVEZWxheSArIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCk7Ci0KLXN0YXRpYyBzdGQ6Om9wdGlvbmFsPHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQ+IFBhcnNlVGltZXN0YW1wKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmb3JtYXQpIHsKLSAgc3RkOjppc3RyaW5nc3RyZWFtIHNzKHRpbWVzdGFtcCk7Ci0gIC8vIDEuIFBhcnNlIHRvIHRpbWVfdCBmcm9tIHRpbWVzdGFtcCB0aGF0IG1heSBub3QgY29udGFpbiBkYXkgbGlnaHQgc2F2aW5nIGluZm9ybWF0aW9uCi0gIHN0ZDo6dG0gbm9fZHN0X3RtID0ge307Ci0gIHNzID4+IHN0ZDo6Z2V0X3RpbWUoJm5vX2RzdF90bSwgZm9ybWF0LmNfc3RyKCkpOwotICBpZiAoc3MuZmFpbCgpKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICAvLyAyLiBNYWtlIGEgY29weSBvZiB0aGUgcGFyc2VkIHJlc3VsdCBzbyB0aGF0IHdlIGNhbiBzZXQgdG1faXNkc3QgYml0IGxhdGVyCi0gIGF1dG8gZHN0X3RtID0gbm9fZHN0X3RtOwotICBhdXRvIG5vX2RzdF90aW1lX3QgPSBzdGQ6Om1rdGltZSgmbm9fZHN0X3RtKTsKLSAgaWYgKG5vX2RzdF90aW1lX3QgPT0gLTEpIHsKLSAgICByZXR1cm4gc3RkOjpudWxsb3B0OwotICB9Ci0gIC8vIDMuIENvbnZlcnQgdGltZV90IHRvIHRtIGFnYWluLCBidXQgbGV0IHN5c3RlbSBkZWNpZGUgaWYgZGF5IGxpZ2h0IHNhdmluZyBzaG91bGQgYmUgc2V0IGF0IHRoYXQgZGF0ZSBhbmQgdGltZQotICBhdXRvIGRzdF90bV9vbmx5ID0gc3RkOjpsb2NhbHRpbWUoJm5vX2RzdF90aW1lX3QpOwotICAvLyA0LiBTZXQgdGhlIGNvcnJlY3QgdG1faXNkc3QgYml0Ci0gIGRzdF90bS50bV9pc2RzdCA9IGRzdF90bV9vbmx5LT50bV9pc2RzdDsKLSAgYXV0byBkc3RfdGltZV90ID0gc3RkOjpta3RpbWUoJmRzdF90bSk7Ci0gIGlmIChkc3RfdGltZV90ID09IC0xKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKLSAgfQotICAvLyA1LiBQYXJzZSBpcyB0byB0aW1lIHBvaW50Ci0gIHJldHVybiBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpmcm9tX3RpbWVfdChkc3RfdGltZV90KTsKLX0KLQotY2xhc3MgVGVzdFN0b3JhZ2VNb2R1bGUgOiBwdWJsaWMgU3RvcmFnZU1vZHVsZSB7Ci0gcHVibGljOgotICBUZXN0U3RvcmFnZU1vZHVsZSgKLSAgICAgIHN0ZDo6c3RyaW5nIGNvbmZpZ19maWxlX3BhdGgsCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGNvbmZpZ19zYXZlX2RlbGF5LAotICAgICAgc2l6ZV90IHRlbXBfZGV2aWNlc19jYXBhY2l0eSwKLSAgICAgIGJvb2wgaXNfcmVzdHJpY3RlZF9tb2RlLAotICAgICAgYm9vbCBpc19zaW5nbGVfdXNlcl9tb2RlKQotICAgICAgOiBTdG9yYWdlTW9kdWxlKAotICAgICAgICAgICAgc3RkOjptb3ZlKGNvbmZpZ19maWxlX3BhdGgpLAotICAgICAgICAgICAgY29uZmlnX3NhdmVfZGVsYXksCi0gICAgICAgICAgICB0ZW1wX2RldmljZXNfY2FwYWNpdHksCi0gICAgICAgICAgICBpc19yZXN0cmljdGVkX21vZGUsCi0gICAgICAgICAgICBpc19zaW5nbGVfdXNlcl9tb2RlKSB7fQotCi0gIENvbmZpZ0NhY2hlKiBHZXRDb25maWdDYWNoZVB1YmxpYygpIHsKLSAgICByZXR1cm4gU3RvcmFnZU1vZHVsZTo6R2V0Q29uZmlnQ2FjaGUoKTsKLSAgfQotCi0gIENvbmZpZ0NhY2hlKiBHZXRNZW1vcnlPbmx5Q29uZmlnQ2FjaGVQdWJsaWMoKSB7Ci0gICAgcmV0dXJuIFN0b3JhZ2VNb2R1bGU6OkdldE1lbW9yeU9ubHlDb25maWdDYWNoZSgpOwotICB9Ci0KLSAgdm9pZCBTYXZlSW1tZWRpYXRlbHlQdWJsaWMoKSB7Ci0gICAgU3RvcmFnZU1vZHVsZTo6U2F2ZUltbWVkaWF0ZWx5KCk7Ci0gIH0KLX07Ci0KLWNsYXNzIFN0b3JhZ2VNb2R1bGVUZXN0IDogcHVibGljIFRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICB0ZW1wX2Rpcl8gPSBzdGQ6OmZpbGVzeXN0ZW06OnRlbXBfZGlyZWN0b3J5X3BhdGgoKTsKLSAgICB0ZW1wX2NvbmZpZ18gPSB0ZW1wX2Rpcl8gLyAidGVtcF9jb25maWcudHh0IjsKLSAgICB0ZW1wX2JhY2t1cF9jb25maWdfID0gdGVtcF9kaXJfIC8gInRlbXBfY29uZmlnLmJhayI7Ci0gICAgRGVsZXRlQ29uZmlnRmlsZXMoKTsKLSAgICBBU1NFUlRfRkFMU0Uoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9jb25maWdfKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfYmFja3VwX2NvbmZpZ18pKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgRGVsZXRlQ29uZmlnRmlsZXMoKTsKLSAgfQotCi0gIHZvaWQgRGVsZXRlQ29uZmlnRmlsZXMoKSB7Ci0gICAgaWYgKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfY29uZmlnXykpIHsKLSAgICAgIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKHRlbXBfY29uZmlnXykpOwotICAgIH0KLSAgICBpZiAoc3RkOjpmaWxlc3lzdGVtOjpleGlzdHModGVtcF9iYWNrdXBfY29uZmlnXykpIHsKLSAgICAgIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKHRlbXBfYmFja3VwX2NvbmZpZ18pKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggdGVtcF9kaXJfOwotICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggdGVtcF9jb25maWdfOwotICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggdGVtcF9iYWNrdXBfY29uZmlnXzsKLX07Ci0KLVRFU1RfRihTdG9yYWdlTW9kdWxlVGVzdCwgZW1wdHlfY29uZmlnX25vX29wX3Rlc3QpIHsKLSAgLy8gQWN0dWFsIHRlc3QKLSAgYXV0byB0aW1lX2JlZm9yZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwotICBhdXRvKiBzdG9yYWdlID0gbmV3IFRlc3RTdG9yYWdlTW9kdWxlKHRlbXBfY29uZmlnXy5zdHJpbmcoKSwga1Rlc3RDb25maWdTYXZlRGVsYXksIDEwLCBmYWxzZSwgZmFsc2UpOwotICBUZXN0TW9kdWxlUmVnaXN0cnkgdGVzdF9yZWdpc3RyeTsKLSAgdGVzdF9yZWdpc3RyeS5JbmplY3RUZXN0TW9kdWxlKCZTdG9yYWdlTW9kdWxlOjpGYWN0b3J5LCBzdG9yYWdlKTsKLSAgdGVzdF9yZWdpc3RyeS5TdG9wQWxsKCk7Ci0gIGF1dG8gdGltZV9hZnRlciA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwotCi0gIC8vIFZlcmlmeSBzdGF0ZXMgYWZ0ZXIgdGVzdAotICBBU1NFUlRfVFJVRShzdGQ6OmZpbGVzeXN0ZW06OmV4aXN0cyh0ZW1wX2NvbmZpZ18pKTsKLQotICAvLyBWZXJpZnkgY29uZmlnIGFmdGVyIHRlc3QKLSAgYXV0byBjb25maWcgPSBMZWdhY3lDb25maWdGaWxlOjpGcm9tUGF0aCh0ZW1wX2NvbmZpZ18uc3RyaW5nKCkpLlJlYWQoMTApOwotICBBU1NFUlRfVFJVRShjb25maWcpOwotICBBU1NFUlRfVFJVRShjb25maWctPkhhc1NlY3Rpb24oU3RvcmFnZU1vZHVsZTo6a0luZm9TZWN0aW9uKSk7Ci0gIEFTU0VSVF9USEFUKAotICAgICAgY29uZmlnLT5HZXRQcm9wZXJ0eShTdG9yYWdlTW9kdWxlOjprSW5mb1NlY3Rpb24sIFN0b3JhZ2VNb2R1bGU6OmtGaWxlU291cmNlUHJvcGVydHkpLCBPcHRpb25hbChTdHJFcSgiRW1wdHkiKSkpOwotCi0gIC8vIFZlcmlmeSBmaWxlIGNyZWF0aW9uIHRpbWVzdGFtcCBmYWxscyBiZXR3ZWVuIHRpbWVfYmVmb3JlIGFuZCB0aW1lX2FmdGVyCi0gIGF1dG8gdGltZXN0YW1wID0gY29uZmlnLT5HZXRQcm9wZXJ0eShTdG9yYWdlTW9kdWxlOjprSW5mb1NlY3Rpb24sIFN0b3JhZ2VNb2R1bGU6OmtUaW1lQ3JlYXRlZFByb3BlcnR5KTsKLSAgQVNTRVJUX1RSVUUodGltZXN0YW1wKTsKLSAgYXV0byBmaWxlX3RpbWUgPSBQYXJzZVRpbWVzdGFtcCgqdGltZXN0YW1wLCBTdG9yYWdlTW9kdWxlOjprVGltZUNyZWF0ZWRGb3JtYXQpOwotICBBU1NFUlRfVFJVRShmaWxlX3RpbWUpOwotICBBU1NFUlRfR0Uoc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KHRpbWVfYWZ0ZXIgLSAqZmlsZV90aW1lKS5jb3VudCgpLCAwKTsKLSAgQVNTRVJUX0dFKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpzZWNvbmRzPigqZmlsZV90aW1lIC0gdGltZV9iZWZvcmUpLmNvdW50KCksIDApOwotfQotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1JlYWRUZXN0Q29uZmlnID0KLSAgICAiW0luZm9dXG4iCi0gICAgIkZpbGVTb3VyY2UgPSBFbXB0eVxuIgotICAgICJUaW1lQ3JlYXRlZCA9IDIwMjAtMDUtMjAgMDE6MjA6NTZcbiIKLSAgICAiXG4iCi0gICAgIltNZXRyaWNzXVxuIgotICAgICJTYWx0MjU2Qml0ID0gMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZlxuIgotICAgICJcbiIKLSAgICAiW0FkYXB0ZXJdXG4iCi0gICAgIkFkZHJlc3MgPSAwMTowMjowMzphYjpjZDplZlxuIgotICAgICJMRV9MT0NBTF9LRVlfSVJLID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjFcbiIKLSAgICAiTEVfTE9DQUxfS0VZX0lSID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjJcbiIKLSAgICAiTEVfTE9DQUxfS0VZX0RISyA9IGZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzIzXG4iCi0gICAgIkxFX0xPQ0FMX0tFWV9FUiA9IGZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzI0XG4iCi0gICAgIlNjYW5Nb2RlID0gMlxuIgotICAgICJEaXNjb3ZlcnlUaW1lb3V0ID0gMTIwXG4iCi0gICAgIlxuIgotICAgICJbMDE6MDI6MDM6YWI6Y2Q6ZWFdXG4iCi0gICAgIm5hbWUgPSBoZWxsbyB3b3JsZFxuIgotICAgICJMaW5rS2V5ID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjhcbiIKLSAgICAiXG4iOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1JlYWRUZXN0Q29uZmlnQ29ycmVjdGVkID0KLSAgICAiW0luZm9dXG4iCi0gICAgIkZpbGVTb3VyY2UgPSBFbXB0eVxuIgotICAgICJUaW1lQ3JlYXRlZCA9IDIwMjAtMDUtMjAgMDE6MjA6NTZcbiIKLSAgICAiXG4iCi0gICAgIltNZXRyaWNzXVxuIgotICAgICJTYWx0MjU2Qml0ID0gMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZlxuIgotICAgICJcbiIKLSAgICAiW0FkYXB0ZXJdXG4iCi0gICAgIkFkZHJlc3MgPSAwMTowMjowMzphYjpjZDplZlxuIgotICAgICJMRV9MT0NBTF9LRVlfSVJLID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjFcbiIKLSAgICAiTEVfTE9DQUxfS0VZX0lSID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjJcbiIKLSAgICAiTEVfTE9DQUxfS0VZX0RISyA9IGZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzIzXG4iCi0gICAgIkxFX0xPQ0FMX0tFWV9FUiA9IGZlZGNiYTA5ODc2NTQzMjFmZWRjYmEwOTg3NjU0MzI0XG4iCi0gICAgIlNjYW5Nb2RlID0gMlxuIgotICAgICJEaXNjb3ZlcnlUaW1lb3V0ID0gMTIwXG4iCi0gICAgIlxuIgotICAgICJbMDE6MDI6MDM6YWI6Y2Q6ZWFdXG4iCi0gICAgIm5hbWUgPSBoZWxsbyB3b3JsZFxuIgotICAgICJMaW5rS2V5ID0gZmVkY2JhMDk4NzY1NDMyMWZlZGNiYTA5ODc2NTQzMjhcbiIKLSAgICAiRGV2VHlwZSA9IDFcbiIKLSAgICAiXG4iOwotCi1URVNUX0YoU3RvcmFnZU1vZHVsZVRlc3QsIHJlYWRfZXhpc3RpbmdfY29uZmlnX3Rlc3QpIHsKLSAgQVNTRVJUX1RSVUUoYmx1ZXRvb3RoOjpvczo6V3JpdGVUb0ZpbGUodGVtcF9jb25maWdfLnN0cmluZygpLCBrUmVhZFRlc3RDb25maWcpKTsKLSAgLy8gQWN0dWFsIHRlc3QKLQotICAvLyBTZXQgdXAKLSAgYXV0byogc3RvcmFnZSA9IG5ldyBUZXN0U3RvcmFnZU1vZHVsZSh0ZW1wX2NvbmZpZ18uc3RyaW5nKCksIGtUZXN0Q29uZmlnU2F2ZURlbGF5LCAxMCwgZmFsc2UsIGZhbHNlKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU3RvcmFnZU1vZHVsZTo6RmFjdG9yeSwgc3RvcmFnZSk7Ci0KLSAgLy8gVGVzdAotICBBU1NFUlRfTkUoc3RvcmFnZS0+R2V0Q29uZmlnQ2FjaGVQdWJsaWMoKSwgbnVsbHB0cik7Ci0gIEFTU0VSVF9UUlVFKHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCktPkhhc1NlY3Rpb24oIk1ldHJpY3MiKSk7Ci0gIEFTU0VSVF9USEFUKHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCktPkdldFBlcnNpc3RlbnRTZWN0aW9ucygpLCBFbGVtZW50c0FyZSgiMDE6MDI6MDM6YWI6Y2Q6ZWEiKSk7Ci0gIEFTU0VSVF9USEFUKAotICAgICAgc3RvcmFnZS0+R2V0Q29uZmlnQ2FjaGVQdWJsaWMoKS0+R2V0UHJvcGVydHkoU3RvcmFnZU1vZHVsZTo6a0FkYXB0ZXJTZWN0aW9uLCAiQWRkcmVzcyIpLAotICAgICAgT3B0aW9uYWwoU3RyRXEoIjAxOjAyOjAzOmFiOmNkOmVmIikpKTsKLQotICAvLyBUZWFyIGRvd24KLSAgdGVzdF9yZWdpc3RyeS5TdG9wQWxsKCk7Ci0KLSAgLy8gVmVyaWZ5IHN0YXRlcyBhZnRlciB0ZXN0Ci0gIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfY29uZmlnXykpOwotCi0gIC8vIFZlcmlmeSBjb25maWcgYWZ0ZXIgdGVzdAotICBhdXRvIGNvbmZpZyA9IGJsdWV0b290aDo6b3M6OlJlYWRTbWFsbEZpbGUodGVtcF9jb25maWdfLnN0cmluZygpKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnKTsKLSAgQVNTRVJUX0VRKCpjb25maWcsIGtSZWFkVGVzdENvbmZpZ0NvcnJlY3RlZCk7Ci19Ci0KLVRFU1RfRihTdG9yYWdlTW9kdWxlVGVzdCwgc2F2ZV9jb25maWdfdGVzdCkgewotICAvLyBQcmVwYXJlIGNvbmZpZyBmaWxlCi0gIEFTU0VSVF9UUlVFKGJsdWV0b290aDo6b3M6OldyaXRlVG9GaWxlKHRlbXBfY29uZmlnXy5zdHJpbmcoKSwga1JlYWRUZXN0Q29uZmlnKSk7Ci0KLSAgLy8gU2V0IHVwCi0gIGF1dG8qIHN0b3JhZ2UgPSBuZXcgVGVzdFN0b3JhZ2VNb2R1bGUodGVtcF9jb25maWdfLnN0cmluZygpLCBrVGVzdENvbmZpZ1NhdmVEZWxheSwgMTAsIGZhbHNlLCBmYWxzZSk7Ci0gIFRlc3RNb2R1bGVSZWdpc3RyeSB0ZXN0X3JlZ2lzdHJ5OwotICB0ZXN0X3JlZ2lzdHJ5LkluamVjdFRlc3RNb2R1bGUoJlN0b3JhZ2VNb2R1bGU6OkZhY3RvcnksIHN0b3JhZ2UpOwotCi0gIC8vIFRlc3QKLSAgQVNTRVJUX05FKHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCksIG51bGxwdHIpOwotCi0gIC8vIENoYW5nZSBhIHByb3BlcnR5Ci0gIEFTU0VSVF9USEFUKAotICAgICAgc3RvcmFnZS0+R2V0Q29uZmlnQ2FjaGVQdWJsaWMoKS0+R2V0UHJvcGVydHkoIjAxOjAyOjAzOmFiOmNkOmVhIiwgIm5hbWUiKSwgT3B0aW9uYWwoU3RyRXEoImhlbGxvIHdvcmxkIikpKTsKLSAgc3RvcmFnZS0+R2V0Q29uZmlnQ2FjaGVQdWJsaWMoKS0+U2V0UHJvcGVydHkoIjAxOjAyOjAzOmFiOmNkOmVhIiwgIm5hbWUiLCAiZm9vIik7Ci0gIEFTU0VSVF9USEFUKHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCktPkdldFByb3BlcnR5KCIwMTowMjowMzphYjpjZDplYSIsICJuYW1lIiksIE9wdGlvbmFsKFN0ckVxKCJmb28iKSkpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa1Rlc3RDb25maWdTYXZlV2FpdERlbGF5KTsKLSAgYXV0byBjb25maWcgPSBMZWdhY3lDb25maWdGaWxlOjpGcm9tUGF0aCh0ZW1wX2NvbmZpZ18uc3RyaW5nKCkpLlJlYWQoMTApOwotICBBU1NFUlRfVFJVRShjb25maWcpOwotICBBU1NFUlRfVEhBVChjb25maWctPkdldFByb3BlcnR5KCIwMTowMjowMzphYjpjZDplYSIsICJuYW1lIiksIE9wdGlvbmFsKFN0ckVxKCJmb28iKSkpOwotCi0gIC8vIFJlbW92ZSBhIHByb3BlcnR5Ci0gIHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCktPlJlbW92ZVByb3BlcnR5KCIwMTowMjowMzphYjpjZDplYSIsICJuYW1lIik7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrVGVzdENvbmZpZ1NhdmVXYWl0RGVsYXkpOwotICBjb25maWcgPSBMZWdhY3lDb25maWdGaWxlOjpGcm9tUGF0aCh0ZW1wX2NvbmZpZ18uc3RyaW5nKCkpLlJlYWQoMTApOwotICBBU1NFUlRfVFJVRShjb25maWcpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLT5IYXNQcm9wZXJ0eSgiMDE6MDI6MDM6YWI6Y2Q6ZWEiLCAibmFtZSIpKTsKLQotICAvLyBSZW1vdmUgYSBzZWN0aW9uCi0gIHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCktPlJlbW92ZVNlY3Rpb24oIjAxOjAyOjAzOmFiOmNkOmVhIik7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrVGVzdENvbmZpZ1NhdmVXYWl0RGVsYXkpOwotICBjb25maWcgPSBMZWdhY3lDb25maWdGaWxlOjpGcm9tUGF0aCh0ZW1wX2NvbmZpZ18uc3RyaW5nKCkpLlJlYWQoMTApOwotICBBU1NFUlRfVFJVRShjb25maWcpOwotICBBU1NFUlRfRkFMU0UoY29uZmlnLT5IYXNTZWN0aW9uKCIwMTowMjowMzphYjpjZDplYSIpKTsKLQotICAvLyBBZGQgYSBzZWN0aW9uIGFuZCBzYXZlIGltbWVkaWF0ZWx5Ci0gIHN0b3JhZ2UtPkdldENvbmZpZ0NhY2hlUHVibGljKCktPlNldFByb3BlcnR5KCIwMTowMjowMzphYjpjZDplYiIsICJMaW5rS2V5IiwgIjEyMzQ1NiIpOwotICBzdG9yYWdlLT5TYXZlSW1tZWRpYXRlbHlQdWJsaWMoKTsKLSAgY29uZmlnID0gTGVnYWN5Q29uZmlnRmlsZTo6RnJvbVBhdGgodGVtcF9jb25maWdfLnN0cmluZygpKS5SZWFkKDEwKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnKTsKLSAgQVNTRVJUX1RSVUUoY29uZmlnLT5IYXNTZWN0aW9uKCIwMTowMjowMzphYjpjZDplYiIpKTsKLQotICAvLyBUZWFyIGRvd24KLSAgdGVzdF9yZWdpc3RyeS5TdG9wQWxsKCk7Ci0KLSAgLy8gVmVyaWZ5IHN0YXRlcyBhZnRlciB0ZXN0Ci0gIEFTU0VSVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKHRlbXBfY29uZmlnXykpOwotfQotCi1URVNUX0YoU3RvcmFnZU1vZHVsZVRlc3QsIGdldF9ib25kZWRfZGV2aWNlc190ZXN0KSB7Ci0gIC8vIFByZXBhcmUgY29uZmlnIGZpbGUKLSAgQVNTRVJUX1RSVUUoYmx1ZXRvb3RoOjpvczo6V3JpdGVUb0ZpbGUodGVtcF9jb25maWdfLnN0cmluZygpLCBrUmVhZFRlc3RDb25maWcpKTsKLQotICAvLyBTZXQgdXAKLSAgYXV0byogc3RvcmFnZSA9IG5ldyBUZXN0U3RvcmFnZU1vZHVsZSh0ZW1wX2NvbmZpZ18uc3RyaW5nKCksIGtUZXN0Q29uZmlnU2F2ZURlbGF5LCAxMCwgZmFsc2UsIGZhbHNlKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU3RvcmFnZU1vZHVsZTo6RmFjdG9yeSwgc3RvcmFnZSk7Ci0KLSAgQVNTRVJUX1RIQVQoCi0gICAgICBzdG9yYWdlLT5HZXRCb25kZWREZXZpY2VzKCksCi0gICAgICBFbGVtZW50c0FyZSgKLSAgICAgICAgICBEZXZpY2Uoc3RvcmFnZS0+R2V0Q29uZmlnQ2FjaGVQdWJsaWMoKSwgc3RvcmFnZS0+R2V0TWVtb3J5T25seUNvbmZpZ0NhY2hlUHVibGljKCksICIwMTowMjowMzphYjpjZDplYSIpKSk7Ci0KLSAgLy8gVGVhciBkb3duCi0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotfQotCi1URVNUX0YoU3RvcmFnZU1vZHVsZVRlc3QsIGdldF9hZGFwdGVyX2NvbmZpZ190ZXN0KSB7Ci0gIC8vIFByZXBhcmUgY29uZmlnIGZpbGUKLSAgQVNTRVJUX1RSVUUoYmx1ZXRvb3RoOjpvczo6V3JpdGVUb0ZpbGUodGVtcF9jb25maWdfLnN0cmluZygpLCBrUmVhZFRlc3RDb25maWcpKTsKLQotICAvLyBTZXQgdXAKLSAgYXV0byogc3RvcmFnZSA9IG5ldyBUZXN0U3RvcmFnZU1vZHVsZSh0ZW1wX2NvbmZpZ18uc3RyaW5nKCksIGtUZXN0Q29uZmlnU2F2ZURlbGF5LCAxMCwgZmFsc2UsIGZhbHNlKTsKLSAgVGVzdE1vZHVsZVJlZ2lzdHJ5IHRlc3RfcmVnaXN0cnk7Ci0gIHRlc3RfcmVnaXN0cnkuSW5qZWN0VGVzdE1vZHVsZSgmU3RvcmFnZU1vZHVsZTo6RmFjdG9yeSwgc3RvcmFnZSk7Ci0KLSAgYXV0byBhZGRyZXNzID0gQWRkcmVzczo6RnJvbVN0cmluZygiMDE6MDI6MDM6YWI6Y2Q6ZWYiKTsKLSAgQVNTRVJUX1RSVUUoYWRkcmVzcyk7Ci0gIEFTU0VSVF9USEFUKHN0b3JhZ2UtPkdldEFkYXB0ZXJDb25maWcoKS5HZXRBZGRyZXNzKCksIE9wdGlvbmFsKEVxKGFkZHJlc3MpKSk7Ci0KLSAgLy8gVGVhciBkb3duCi0gIHRlc3RfcmVnaXN0cnkuU3RvcEFsbCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hjaS9BbmRyb2lkLmJwIGIvaGNpL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzQ4YjIuLjAwMDAwMDAKLS0tIGEvaGNpL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJidC1oY2lfZGVmYXVsdHMiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgIF0sCi19Ci0KLS8vIEhDSSBzdGF0aWMgbGlicmFyeSBmb3IgdGFyZ2V0Ci1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0LWhjaSIsCi0gICAgZGVmYXVsdHM6IFsibGliYnQtaGNpX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2J0c25vb3AuY2MiLAotICAgICAgICAic3JjL2J0c25vb3BfbWVtLmNjIiwKLSAgICAgICAgInNyYy9idHNub29wX25ldC5jYyIsCi0gICAgICAgICJzcmMvYnVmZmVyX2FsbG9jYXRvci5jYyIsCi0gICAgICAgICJzcmMvaGNpX2luamVjdC5jYyIsCi0gICAgICAgICJzcmMvaGNpX3BhY2tldF9mYWN0b3J5LmNjIiwKLSAgICAgICAgInNyYy9oY2lfcGFja2V0X3BhcnNlci5jYyIsCi0gICAgICAgICJzcmMvcGFja2V0X2ZyYWdtZW50ZXIuY2MiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHNyY3M6IFsic3JjL2hjaV9sYXllcl9hbmRyb2lkLmNjIl0sCi0gICAgICAgIH0sCi0gICAgICAgIGhvc3Q6IHsKLSAgICAgICAgICAgIHNyY3M6IFsic3JjL2hjaV9sYXllcl9saW51eC5jYyJdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGlmL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2xpYmh3YmluZGVyL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2dkL3J1c3Qvc2hpbSIsCi0gICAgXSwKLSAgICBwcm9kdWN0X3ZhcmlhYmxlczogewotICAgICAgICBkZWJ1Z2dhYmxlOiB7Ci0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURCVF9ORVRfREVCVUc9dHJ1ZSIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi19Ci0KLS8vIEhDSSB1bml0IHRlc3RzIGZvciB0YXJnZXQKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9oY2kiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbImxpYmJ0LWhjaV9kZWZhdWx0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L29zaS90ZXN0IiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC91dGlscy9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9saWJod2JpbmRlci9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9nZC9ydXN0L3NoaW0iLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9wYWNrZXRfZnJhZ21lbnRlcl90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliZGwiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0LWhjaSIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlib3NpLUFsYXJtVGVzdEhhcm5lc3MiLAotICAgICAgICAibGlib3NpLUFsbG9jYXRpb25UZXN0SGFybmVzcyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliYnRjb3JlIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJsdWV0b290aC1mb3ItdGVzdHMiLAotICAgIF0sCi19Ci0KLS8vIEhDSSBuYXRpdmUgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfaGNpX25hdGl2ZSIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2hjaV9sYXllcl90ZXN0LmNjIiwKLSAgICAgICAgInRlc3Qvb3RoZXJfc3RhY2tfc3R1Yi5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJvc2ktQWxsb2NhdGlvblRlc3RIYXJuZXNzIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGFkZHJlc3M6IHRydWUsCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2hjaV9mcmFnbWVudGVyX25hdGl2ZSIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L29zaS90ZXN0IiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9idWZmZXJfYWxsb2NhdG9yLmNjIiwKLSAgICAgICAgInRlc3QvcGFja2V0X2ZyYWdtZW50ZXJfaG9zdF90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYm9zaS1BbGxvY2F0aW9uVGVzdEhhcm5lc3MiLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJib3VuZHMiXSwKLSAgICB9LAotfQotCmRpZmYgLS1naXQgYS9oY2kvQlVJTEQuZ24gYi9oY2kvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2Y5YmQuLjAwMDAwMDAKLS0tIGEvaGNpL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXN0YXRpY19saWJyYXJ5KCJoY2kiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgInNyYy9idHNub29wLmNjIiwKLSAgICAic3JjL2J0c25vb3BfbWVtLmNjIiwKLSAgICAic3JjL2J0c25vb3BfbmV0LmNjIiwKLSAgICAic3JjL2J1ZmZlcl9hbGxvY2F0b3IuY2MiLAotICAgICJzcmMvaGNpX2luamVjdC5jYyIsCi0gICAgInNyYy9oY2lfcGFja2V0X2ZhY3RvcnkuY2MiLAotICAgICJzcmMvaGNpX3BhY2tldF9wYXJzZXIuY2MiLAotICAgICJzcmMvcGFja2V0X2ZyYWdtZW50ZXIuY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICJpbmNsdWRlIiwKLSAgICAiLy9idC8iLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgIi8vYnQvc3RhY2svaW5jbHVkZSIsCi0gIF0KLQotICBkZXBzID0gWwotICAgICIvL2J0L2NvbW1vbiIsCi0gIF0KLQotICBjb25maWdzICs9IFsKLSAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICBdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBleGVjdXRhYmxlKCJuZXRfdGVzdF9oY2kiKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICIvL2J0L29zaS90ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5jYyIsCi0gICAgICAiLy9idC9vc2kvdGVzdC9BbGFybVRlc3RIYXJuZXNzLmNjIiwKLSAgICAgICJ0ZXN0L3BhY2tldF9mcmFnbWVudGVyX3Rlc3QuY2MiLAotICAgIF0KLQotICAgIGluY2x1ZGVfZGlycyA9IFsKLSAgICAgICIvL2J0LyIsCi0gICAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICIvL2J0L2J0Y29yZS9pbmNsdWRlIiwKLSAgICAgICIvL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICIvL2J0L29zaS90ZXN0IiwKLSAgICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0KLQotICAgIGRlcHMgPSBbCi0gICAgICAiLy9idC9oY2kiLAotICAgICAgIi8vYnQvb3NpIiwKLSAgICAgICIvL2J0L2J0Y29yZSIsCi0gICAgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICAgICAgIi8vYnQ6ZXh0ZXJuYWxfZ3Rlc3RfbWFpbiIsCi0gICAgXQotCi0gICAgbGlicyA9IFsKLSAgICAgICJwdGhyZWFkIiwKLSAgICAgICJydCIsCi0gICAgICAiZGwiLAotICAgIF0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvaGNpL2luY2x1ZGUvYnRfaGNpX2Jkcm9pZC5oIGIvaGNpL2luY2x1ZGUvYnRfaGNpX2Jkcm9pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE0YzBhLi4wMDAwMDAwCi0tLSBhL2hjaS9pbmNsdWRlL2J0X2hjaV9iZHJvaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRfaGNpX2Jkcm9pZC5oCi0gKgotICogIERlc2NyaXB0aW9uOiAgIEEgd3JhcHBlciBoZWFkZXIgZmlsZSBvZiBidF9oY2lfbGliLmgKLSAqCi0gKiAgICAgICAgICAgICAgICAgQ29udGFpbnMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgZm9yIGludGVyZmFjaW5nIHdpdGggQmx1ZWRyb2lkCi0gKiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZmRlZiBIQVNfQkRST0lEX0JVSUxEQ0ZHCi0jaW5jbHVkZSAiYmRyb2lkX2J1aWxkY2ZnLmgiCi0jZW5kaWYKLQotI3ByYWdtYSBtZXNzYWdlICJUaGlzIGhlYWRlciBmaWxlIGJ0X2hjaV9iZHJvaWQuaCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIgotI3ByYWdtYSBtZXNzYWdlICJQbGVhc2UgdXBkYXRlIHRvIHJlbW92ZSB0aGVzZSBkZWNsYXJhdGlvbnMiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBNU0dfU1RBQ0tfVE9fSENfSENJX0NNRCAweDIwMDAgLyogZXEuIEJUX0VWVF9UT19MTV9IQ0lfQ01EICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgZXZlbnQ7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDE2X3Qgb2Zmc2V0OwotICB1aW50MTZfdCBsYXllcl9zcGVjaWZpYzsKLSAgdWludDhfdCBkYXRhW107Ci19IEhDX0JUX0hEUjsKLQotI2RlZmluZSBCVF9IQ19IRFJfU0laRSAoc2l6ZW9mKEhDX0JUX0hEUikpCmRpZmYgLS1naXQgYS9oY2kvaW5jbHVkZS9idF92ZW5kb3JfbGliLmggYi9oY2kvaW5jbHVkZS9idF92ZW5kb3JfbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzRhZjcuLjAwMDAwMDAKLS0tIGEvaGNpL2luY2x1ZGUvYnRfdmVuZG9yX2xpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRfVkVORE9SX0xJQl9ICi0jZGVmaW5lIEJUX1ZFTkRPUl9MSUJfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0vKiogU3RydWN0IHR5cGVzICovCi0KLS8qKiBUeXBlZGVmcyBhbmQgZGVmaW5lcyAqLwotCi0vKiogVmVuZG9yIHNwZWNpZmljIG9wZXJhdGlvbnMgT1BDT0RFICovCi10eXBlZGVmIGVudW0gewotICAvKiAgW29wZXJhdGlvbl0KLSAgICogICAgICBQb3dlciBvbiBvciBvZmYgdGhlIEJUIENvbnRyb2xsZXIuCi0gICAqICBbaW5wdXQgcGFyYW1dCi0gICAqICAgICAgQSBwb2ludGVyIHRvIGludCB0eXBlIHdpdGggY29udGVudCBvZiBidF92ZW5kb3JfcG93ZXJfc3RhdGVfdC4KLSAgICogICAgICBUeXBlY2FzdGluZyBjb252ZXJzaW9uOiAoaW50ICopIHBhcmFtLgotICAgKiAgW3JldHVybl0KLSAgICogICAgICAwIC0gZGVmYXVsdCwgZG9uJ3QgY2FyZS4KLSAgICogIFtjYWxsYmFja10KLSAgICogICAgICBOb25lLgotICAgKi8KLSAgQlRfVk5EX09QX1BPV0VSX0NUUkwsCi0KLSAgLyogIFtvcGVyYXRpb25dCi0gICAqICAgICAgUGVyZm9ybSBhbnkgdmVuZG9yIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIG9yIGNvbmZpZ3VyYXRpb24KLSAgICogICAgICBvbiB0aGUgQlQgQ29udHJvbGxlci4gVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHN0YWNrIGluaXRpYWxpemF0aW9uLgotICAgKiAgW2lucHV0IHBhcmFtXQotICAgKiAgICAgIE5vbmUuCi0gICAqICBbcmV0dXJuXQotICAgKiAgICAgIDAgLSBkZWZhdWx0LCBkb24ndCBjYXJlLgotICAgKiAgW2NhbGxiYWNrXQotICAgKiAgICAgIE11c3QgY2FsbCBmd2NmZ19jYiB0byBub3RpZnkgdGhlIHN0YWNrIG9mIHRoZSBjb21wbGV0aW9uIG9mIHZlbmRvcgotICAgKiAgICAgIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIG9uY2UgaXQgaGFzIGJlZW4gZG9uZS4KLSAgICovCi0gIEJUX1ZORF9PUF9GV19DRkcsCi0KLSAgLyogIFtvcGVyYXRpb25dCi0gICAqICAgICAgUGVyZm9ybSBhbnkgdmVuZG9yIHNwZWNpZmljIFNDTy9QQ00gY29uZmlndXJhdGlvbiBvbiB0aGUgQlQKLSAgICogQ29udHJvbGxlci4KLSAgICogICAgICBUaGlzIGlzIGNhbGxlZCBhZnRlciBzdGFjayBpbml0aWFsaXphdGlvbi4KLSAgICogIFtpbnB1dCBwYXJhbV0KLSAgICogICAgICBOb25lLgotICAgKiAgW3JldHVybl0KLSAgICogICAgICAwIC0gZGVmYXVsdCwgZG9uJ3QgY2FyZS4KLSAgICogIFtjYWxsYmFja10KLSAgICogICAgICBNdXN0IGNhbGwgc2NvY2ZnX2NiIHRvIG5vdGlmeSB0aGUgc3RhY2sgb2YgdGhlIGNvbXBsZXRpb24gb2YgdmVuZG9yCi0gICAqICAgICAgc3BlY2lmaWMgU0NPIGNvbmZpZ3VyYXRpb24gb25jZSBpdCBoYXMgYmVlbiBkb25lLgotICAgKi8KLSAgQlRfVk5EX09QX1NDT19DRkcsCi0KLSAgLyogIFtvcGVyYXRpb25dCi0gICAqICAgICAgT3BlbiBVQVJUIHBvcnQgb24gd2hlcmUgdGhlIEJUIENvbnRyb2xsZXIgaXMgYXR0YWNoZWQuCi0gICAqICAgICAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHN0YWNrIGluaXRpYWxpemF0aW9uLgotICAgKiAgW2lucHV0IHBhcmFtXQotICAgKiAgICAgIEEgcG9pbnRlciB0byBpbnQgYXJyYXkgdHlwZSBmb3Igb3BlbiBmaWxlIGRlc2NyaXB0b3JzLgotICAgKiAgICAgIFRoZSBtYXBwaW5nIG9mIEhDSSBjaGFubmVsIHRvIGZkIHNsb3QgaW4gdGhlIGludCBhcnJheSBpcyBnaXZlbiBpbgotICAgKiAgICAgIGJ0X3ZlbmRvcl9oY2lfY2hhbm5lbHNfdC4KLSAgICogICAgICBBbmQsIGl0IHJlcXVpcmVzIHRoZSB2ZW5kb3IgbGliIHRvIGZpbGwgdXAgdGhlIGNvbnRlbnQgYmVmb3JlCi0gICAqIHJldHVybmluZwotICAgKiAgICAgIHRoZSBjYWxsLgotICAgKiAgICAgIFR5cGVjYXN0aW5nIGNvbnZlcnNpb246IChpbnQgKCopW10pIHBhcmFtLgotICAgKiAgW3JldHVybl0KLSAgICogICAgICBOdW1iZXJzIG9mIG9wZW5lZCBmaWxlIGRlc2NyaXB0b3JzLgotICAgKiAgICAgIFZhbGlkIG51bWJlcjoKLSAgICogICAgICAgICAgMSAtIENNRC9FVlQvQUNMLUluL0FDTC1PdXQgdmlhIHRoZSBzYW1lIGZkIChlLmcuIFVBUlQpCi0gICAqICAgICAgICAgIDIgLSBDTUQvRVZUIG9uIG9uZSBmZCwgYW5kIEFDTC1Jbi9BQ0wtT3V0IG9uIHRoZSBvdGhlciBmZAotICAgKiAgICAgICAgICA0IC0gQ01ELCBFVlQsIEFDTC1JbiwgQUNMLU91dCBhcmUgb24gdGhlaXIgaW5kaXZpZHVhbCBmZAotICAgKiAgW2NhbGxiYWNrXQotICAgKiAgICAgIE5vbmUuCi0gICAqLwotICBCVF9WTkRfT1BfVVNFUklBTF9PUEVOLAotCi0gIC8qICBbb3BlcmF0aW9uXQotICAgKiAgICAgIENsb3NlIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBVQVJUIHBvcnQuCi0gICAqICBbaW5wdXQgcGFyYW1dCi0gICAqICAgICAgTm9uZS4KLSAgICogIFtyZXR1cm5dCi0gICAqICAgICAgMCAtIGRlZmF1bHQsIGRvbid0IGNhcmUuCi0gICAqICBbY2FsbGJhY2tdCi0gICAqICAgICAgTm9uZS4KLSAgICovCi0gIEJUX1ZORF9PUF9VU0VSSUFMX0NMT1NFLAotCi0gIC8qICBbb3BlcmF0aW9uXQotICAgKiAgICAgIEdldCB0aGUgTFBNIGlkbGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAqICAgICAgVGhlIHN0YWNrIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBsYXVuY2ggYSB0aW1lciBkZWxheSBiZWZvcmUgaXQKLSAgICogICAgICBhdHRlbXB0cyB0byBkZS1hc3NlcnQgTFBNIFdBS0Ugc2lnbmFsIG9uY2UgZG93bnN0cmVhbSBIQ0kgcGFja2V0Ci0gICAqICAgICAgaGFzIGJlZW4gZGVsaXZlcmVkLgotICAgKiAgW2lucHV0IHBhcmFtXQotICAgKiAgICAgIEEgcG9pbnRlciB0byB1aW50MzJfdCB0eXBlIHdoaWNoIGlzIHBhc3NlZCBpbiBieSB0aGUgc3RhY2suIEFuZCwgaXQKLSAgICogICAgICByZXF1aXJlcyB0aGUgdmVuZG9yIGxpYiB0byBmaWxsIHVwIHRoZSBjb250ZW50IGJlZm9yZSByZXR1cm5pbmcKLSAgICogICAgICB0aGUgY2FsbC4KLSAgICogICAgICBUeXBlY2FzdGluZyBjb252ZXJzaW9uOiAodWludDMyX3QgKikgcGFyYW0uCi0gICAqICBbcmV0dXJuXQotICAgKiAgICAgIDAgLSBkZWZhdWx0LCBkb24ndCBjYXJlLgotICAgKiAgW2NhbGxiYWNrXQotICAgKiAgICAgIE5vbmUuCi0gICAqLwotICBCVF9WTkRfT1BfR0VUX0xQTV9JRExFX1RJTUVPVVQsCi0KLSAgLyogIFtvcGVyYXRpb25dCi0gICAqICAgICAgRW5hYmxlIG9yIGRpc2FibGUgTFBNIG1vZGUgb24gQlQgQ29udHJvbGxlci4KLSAgICogIFtpbnB1dCBwYXJhbV0KLSAgICogICAgICBBIHBvaW50ZXIgdG8gdWludDhfdCB0eXBlIHdpdGggY29udGVudCBvZiBidF92ZW5kb3JfbHBtX21vZGVfdC4KLSAgICogICAgICBUeXBlY2FzdGluZyBjb252ZXJzaW9uOiAodWludDhfdCAqKSBwYXJhbS4KLSAgICogIFtyZXR1cm5dCi0gICAqICAgICAgMCAtIGRlZmF1bHQsIGRvbid0IGNhcmUuCi0gICAqICBbY2FsbGJhY2tdCi0gICAqICAgICAgTXVzdCBjYWxsIGxwbV9jYiB0byBub3RpZnkgdGhlIHN0YWNrIG9mIHRoZSBjb21wbGV0aW9uIG9mIExQTQotICAgKiAgICAgIGRpc2FibGUvZW5hYmxlIHByb2Nlc3Mgb25jZSBpdCBoYXMgYmVlbiBkb25lLgotICAgKi8KLSAgQlRfVk5EX09QX0xQTV9TRVRfTU9ERSwKLQotICAvKiAgW29wZXJhdGlvbl0KLSAgICogICAgICBBc3NlcnQgb3IgRGVhc3NlcnQgTFBNIFdBS0Ugb24gQlQgQ29udHJvbGxlci4KLSAgICogIFtpbnB1dCBwYXJhbV0KLSAgICogICAgICBBIHBvaW50ZXIgdG8gdWludDhfdCB0eXBlIHdpdGggY29udGVudCBvZiBidF92ZW5kb3JfbHBtX3dha2Vfc3RhdGVfdC4KLSAgICogICAgICBUeXBlY2FzdGluZyBjb252ZXJzaW9uOiAodWludDhfdCAqKSBwYXJhbS4KLSAgICogIFtyZXR1cm5dCi0gICAqICAgICAgMCAtIGRlZmF1bHQsIGRvbid0IGNhcmUuCi0gICAqICBbY2FsbGJhY2tdCi0gICAqICAgICAgTm9uZS4KLSAgICovCi0gIEJUX1ZORF9PUF9MUE1fV0FLRV9TRVRfU1RBVEUsCi0KLSAgLyogIFtvcGVyYXRpb25dCi0gICAqICAgICAgUGVyZm9ybSBhbnkgdmVuZG9yIHNwZWNpZmljIGNvbW1hbmRzIHJlbGF0ZWQgdG8gYXVkaW8gc3RhdGUgY2hhbmdlcy4KLSAgICogIFtpbnB1dCBwYXJhbV0KLSAgICogICAgICBhIHBvaW50ZXIgdG8gYnRfdmVuZG9yX29wX2F1ZGlvX3N0YXRlX3QgaW5kaWNhdGluZyB3aGF0IGF1ZGlvIHN0YXRlIGlzCi0gICAqICAgICAgc2V0LgotICAgKiAgW3JldHVybl0KLSAgICogICAgICAwIC0gZGVmYXVsdCwgZG9uJ3QgY2FyZS4KLSAgICogIFtjYWxsYmFja10KLSAgICogICAgICBOb25lLgotICAgKi8KLSAgQlRfVk5EX09QX1NFVF9BVURJT19TVEFURSwKLQotICAvKiAgW29wZXJhdGlvbl0KLSAgICogICAgICBUaGUgZXBpbG9nIGNhbGwgdG8gdGhlIHZlbmRvciBtb2R1bGUgc28gdGhhdCBpdCBjYW4gcGVyZm9ybSBhbnkKLSAgICogICAgICB2ZW5kb3Itc3BlY2lmaWMgcHJvY2Vzc2VzIChlLmcuIHNlbmQgYSBIQ0lfUkVTRVQgdG8gQlQgQ29udHJvbGxlcikKLSAgICogICAgICBiZWZvcmUgdGhlIGNhbGxlciBjYWxscyBmb3IgY2xlYW51cCgpLgotICAgKiAgW2lucHV0IHBhcmFtXQotICAgKiAgICAgIE5vbmUuCi0gICAqICBbcmV0dXJuXQotICAgKiAgICAgIDAgLSBkZWZhdWx0LCBkb24ndCBjYXJlLgotICAgKiAgW2NhbGxiYWNrXQotICAgKiAgICAgIE11c3QgY2FsbCBlcGlsb2dfY2IgdG8gbm90aWZ5IHRoZSBzdGFjayBvZiB0aGUgY29tcGxldGlvbiBvZiB2ZW5kb3IKLSAgICogICAgICBzcGVjaWZpYyBlcGlsb2cgcHJvY2VzcyBvbmNlIGl0IGhhcyBiZWVuIGRvbmUuCi0gICAqLwotICBCVF9WTkRfT1BfRVBJTE9HLAotCi0gIC8qICBbb3BlcmF0aW9uXQotICAgKiAgICAgIENhbGwgdG8gdGhlIHZlbmRvciBtb2R1bGUgc28gdGhhdCBpdCBjYW4gcGVyZm9ybSBhbGwgdmVuZG9yLXNwZWNpZmljCi0gICAqICAgICAgb3BlcmF0aW9ucyB0byBzdGFydCBvZmZsb2FkaW5nIGEyZHAgbWVkaWEgZW5jb2RlICYgdHguCi0gICAqICBbaW5wdXQgcGFyYW1dCi0gICAqICAgICAgcG9pbnRlciB0byBidF92ZW5kb3Jfb3BfYTJkcF9vZmZsb2FkX3N0YXJ0X3QgY29udGFpbmluZyBlbGVtZW50cwotICAgKiAgICAgIHJlcXVpcmVkIGZvciBWTkQgRlcgdG8gc2V0dXAgYTJkcCBvZmZsb2FkLgotICAgKiAgW3JldHVybl0KLSAgICogICAgICAwICAtIGRlZmF1bHQsIGRvbnQgY2FyZS4KLSAgICogIFtjYWxsYmFja10KLSAgICogICAgICBNdXN0IGNhbGwgYTJkcF9vZmZsb2FkX3N0YXJ0X2NiIHRvIG5vdGlmeSB0aGUgc3RhY2sgb2YgdGhlCi0gICAqICAgICAgY29tcGxldGlvbiBvZiB2ZW5kb3Igc3BlY2lmaWMgc2V0dXAgcHJvY2VzcyBvbmNlIGl0IGhhcyBiZWVuIGRvbmUuCi0gICAqLwotICBCVF9WTkRfT1BfQTJEUF9PRkZMT0FEX1NUQVJULAotCi0gIC8qICBbb3BlcmF0aW9uXQotICAgKiAgICAgIENhbGwgdG8gdGhlIHZlbmRvciBtb2R1bGUgc28gdGhhdCBpdCBjYW4gcGVyZm9ybSBhbGwgdmVuZG9yLXNwZWNpZmljCi0gICAqICAgICAgb3BlcmF0aW9ucyB0byBzdXNwZW5kIG9mZmxvYWRpbmcgYTJkcCBtZWRpYSBlbmNvZGUgJiB0eC4KLSAgICogIFtpbnB1dCBwYXJhbV0KLSAgICogICAgICBwb2ludGVyIHRvIGJ0X3ZlbmRvcl9vcF9hMmRwX29mZmxvYWRfdCBjb250YWluaW5nIGVsZW1lbnRzCi0gICAqICAgICAgcmVxdWlyZWQgZm9yIFZORCBGVyB0byBzZXR1cCBhMmRwIG9mZmxvYWQuCi0gICAqICBbcmV0dXJuXQotICAgKiAgICAgIDAgIC0gZGVmYXVsdCwgZG9udCBjYXJlLgotICAgKiAgW2NhbGxiYWNrXQotICAgKiAgICAgIE11c3QgY2FsbCBhMmRwX29mZmxvYWRfY2IgdG8gbm90aWZ5IHRoZSBzdGFjayBvZiB0aGUKLSAgICogICAgICBjb21wbGV0aW9uIG9mIHZlbmRvciBzcGVjaWZpYyBzZXR1cCBwcm9jZXNzIG9uY2UgaXQgaGFzIGJlZW4gZG9uZS4KLSAgICovCi0gIEJUX1ZORF9PUF9BMkRQX09GRkxPQURfU1RPUCwKLQotfSBidF92ZW5kb3Jfb3Bjb2RlX3Q7Ci0KLS8qKiBQb3dlciBvbi9vZmYgY29udHJvbCBzdGF0ZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUX1ZORF9QV1JfT0ZGLAotICBCVF9WTkRfUFdSX09OLAotfSBidF92ZW5kb3JfcG93ZXJfc3RhdGVfdDsKLQotLyoqIERlZmluZSBIQ0kgY2hhbm5lbCBpZGVudGlmaWVyIGluIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGFycmF5Ci0gICAgdXNlZCBpbiBCVF9WTkRfT1BfVVNFUklBTF9PUEVOIG9wZXJhdGlvbi4KLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQ0hfQ01ELCAgICAgIC8vIEhDSSBDb21tYW5kIGNoYW5uZWwKLSAgQ0hfRVZULCAgICAgIC8vIEhDSSBFdmVudCBjaGFubmVsCi0gIENIX0FDTF9PVVQsICAvLyBIQ0kgQUNMIGRvd25zdHJlYW0gY2hhbm5lbAotICBDSF9BQ0xfSU4sICAgLy8gSENJIEFDTCB1cHN0cmVhbSBjaGFubmVsCi0KLSAgQ0hfTUFYICAvLyBUb3RhbCBjaGFubmVscwotfSBidF92ZW5kb3JfaGNpX2NoYW5uZWxzX3Q7Ci0KLS8qKiBMUE0gZGlzYWJsZS9lbmFibGUgcmVxdWVzdCAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfVk5EX0xQTV9ESVNBQkxFLAotICBCVF9WTkRfTFBNX0VOQUJMRSwKLX0gYnRfdmVuZG9yX2xwbV9tb2RlX3Q7Ci0KLS8qKiBMUE0gV0FLRSBzZXQgc3RhdGUgcmVxdWVzdCAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfVk5EX0xQTV9XQUtFX0FTU0VSVCwKLSAgQlRfVk5EX0xQTV9XQUtFX0RFQVNTRVJULAotfSBidF92ZW5kb3JfbHBtX3dha2Vfc3RhdGVfdDsKLQotLyoqIENhbGxiYWNrIHJlc3VsdCB2YWx1ZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUX1ZORF9PUF9SRVNVTFRfU1VDQ0VTUywKLSAgQlRfVk5EX09QX1JFU1VMVF9GQUlMLAotfSBidF92ZW5kb3Jfb3BfcmVzdWx0X3Q7Ci0KLS8qKiBhdWRpbyAoU0NPKSBzdGF0ZSBjaGFuZ2VzIHRyaWdnZXJpbmcgVlMgY29tbWFuZHMgZm9yIGNvbmZpZ3VyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBwZWVyX2NvZGVjOwotICB1aW50MTZfdCBzdGF0ZTsKLSAgYm9vbCB1c2VfZW5oYW5jZWRfc2NvOwotfSBidF92ZW5kb3Jfb3BfYXVkaW9fc3RhdGVfdDsKLQotLyoKLSAqIEJsdWV0b290aCBIb3N0L0NvbnRyb2xsZXIgVmVuZG9yIGNhbGxiYWNrIHN0cnVjdHVyZS4KLSAqLwotCi0vKiB2ZW5kb3IgaW5pdGlhbGl6YXRpb24vY29uZmlndXJhdGlvbiBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICgqY2ZnX3Jlc3VsdF9jYikoYnRfdmVuZG9yX29wX3Jlc3VsdF90IHJlc3VsdCk7Ci0KLS8qIGRhdGFwYXRoIGJ1ZmZlciBhbGxvY2F0aW9uIGNhbGxiYWNrIChjYWxsb3V0KQotICoKLSAqICBWZW5kb3IgbGliIG5lZWRzIHRvIHJlcXVlc3QgYSBidWZmZXIgdGhyb3VnaCB0aGUgYWxsb2MgY2FsbG91dCBmdW5jdGlvbgotICogIGZyb20gSENJIGxpYiBpZiB0aGUgYnVmZmVyIGlzIGZvciBjb25zdHJ1Y3RpbmcgYSBIQ0kgQ29tbWFuZCBwYWNrZXQgd2hpY2gKLSAqICB3aWxsIGJlIHNlbnQgdGhyb3VnaCB4bWl0X2NiIHRvIEJUIENvbnRyb2xsZXIuCi0gKgotICogIEZvciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uLCB0aGUgcmVxdWVzdGVkIHNpemUgbmVlZHMgdG8gYmUgYmlnIGVub3VnaCB0bwotICogIGFjY29tbW9kYXRlIHRoZSBiZWxvdyBoZWFkZXIgcGx1cyBhIGNvbXBsZXRlIEhDSSBwYWNrZXQgLS0KLSAqICAgICAgdHlwZWRlZiBzdHJ1Y3QKLSAqICAgICAgewotICogICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnQ7Ci0gKiAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBsZW47Ci0gKiAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBvZmZzZXQ7Ci0gKiAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBsYXllcl9zcGVjaWZpYzsKLSAqICAgICAgfSBIQ19CVF9IRFI7Ci0gKgotICogIEhDSSBsaWIgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aGVyZSBWZW5kb3IgbGliIHNob3VsZCB1c2UgdG8KLSAqICBjb25zdHJ1Y3QgYSBIQ0kgY29tbWFuZCBwYWNrZXQgYXMgYmVsb3cgZm9ybWF0OgotICoKLSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIHwgIEhDX0JUX0hEUiAgfCAgSENJIGNvbW1hbmQgICAgICAgICAgICAgICB8Ci0gKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICB3aGVyZQotICogICAgICBIQ19CVF9IRFIuZXZlbnQgPSAweDIwMDA7Ci0gKiAgICAgIEhDX0JUX0hEUi5sZW4gPSBMZW5ndGggb2YgSENJIGNvbW1hbmQ7Ci0gKiAgICAgIEhDX0JUX0hEUi5vZmZzZXQgPSAwOwotICogICAgICBIQ19CVF9IRFIubGF5ZXJfc3BlY2lmaWMgPSAwOwotICoKLSAqICBGb3IgZXhhbXBsZSwgYSBIQ0lfUkVTRVQgQ29tbWFuZCB3aWxsIGJlIGZvcm1lZCBhcwotICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIHwgIEhDX0JUX0hEUiAgfDAzfDBjfDAwfAotICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIHdpdGgKLSAqICAgICAgSENfQlRfSERSLmV2ZW50ID0gMHgyMDAwOwotICogICAgICBIQ19CVF9IRFIubGVuID0gMzsKLSAqICAgICAgSENfQlRfSERSLm9mZnNldCA9IDA7Ci0gKiAgICAgIEhDX0JUX0hEUi5sYXllcl9zcGVjaWZpYyA9IDA7Ci0gKi8KLXR5cGVkZWYgdm9pZCogKCptYWxsb2NfY2IpKGludCBzaXplKTsKLQotLyogZGF0YXBhdGggYnVmZmVyIGRlYWxsb2NhdGlvbiBjYWxsYmFjayAoY2FsbG91dCkgKi8KLXR5cGVkZWYgdm9pZCAoKm1kZWFsbG9jX2NiKSh2b2lkKiBwX2J1Zik7Ci0KLS8qIGRlZmluZSBjYWxsYmFjayBvZiB0aGUgY21kX3htaXRfY2IKLSAqCi0gKiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIEhDSSBsaWIgd2lsbCBjYWxsIHdpdGggdGhlIHJldHVybiBvZiBjb21tYW5kCi0gKiAgY29tcGxldGUgcGFja2V0LiBWZW5kb3IgbGliIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIGJ1ZmZlciBwYXNzZWQKLSAqICBpbiBhdCB0aGUgcF9tZW0gcGFyYW1ldGVyIGJ5IGNhbGxpbmcgZGVhbGxvYyBjYWxsb3V0IGZ1bmN0aW9uLgotICovCi10eXBlZGVmIHZvaWQgKCp0SU5UX0NNRF9DQkFDSykodm9pZCogcF9tZW0pOwotCi0vKiBoY2kgY29tbWFuZCBwYWNrZXQgdHJhbnNtaXQgY2FsbGJhY2sgKGNhbGxvdXQpCi0gKgotICogIFZlbmRvciBsaWIgY2FsbHMgeG1pdF9jYiBjYWxsb3V0IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHNlbmQgYSBIQ0kgQ29tbWFuZAotICogIHBhY2tldCB0byBCVCBDb250cm9sbGVyLiBUaGUgYnVmZmVyIGNhcnJ5aW5nIEhDSSBDb21tYW5kIHBhY2tldCBjb250ZW50Ci0gKiAgbmVlZHMgdG8gYmUgZmlyc3QgYWxsb2NhdGVkIHRocm91Z2ggdGhlIGFsbG9jIGNhbGxvdXQgZnVuY3Rpb24uCi0gKiAgSENJIGxpYiB3aWxsIHJlbGVhc2UgdGhlIGJ1ZmZlciBmb3IgVmVuZG9yIGxpYiBvbmNlIGl0IGhhcyBkZWxpdmVyZWQgdGhlCi0gKiAgcGFja2V0IGNvbnRlbnQgdG8gQlQgQ29udHJvbGxlci4KLSAqCi0gKiAgVmVuZG9yIGxpYiBuZWVkcyBhbHNvIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiAocF9jYmFjaykgd2hpY2ggSENJIGxpYgotICogIHdpbGwgY2FsbCB3aXRoIHRoZSByZXR1cm4gb2YgY29tbWFuZCBjb21wbGV0ZSBwYWNrZXQuCi0gKgotICogIFRoZSBvcGNvZGUgcGFyYW1ldGVyIGdpdmVzIHRoZSBIQ0kgT3BDb2RlIChjb21iaW5hdGlvbiBvZiBPR0YgYW5kIE9DRikgb2YKLSAqICBIQ0kgQ29tbWFuZCBwYWNrZXQuIEZvciBleGFtcGxlLCBvcGNvZGUgPSAweDBjMDMgZm9yIHRoZSBIQ0lfUkVTRVQgY29tbWFuZAotICogIHBhY2tldC4KLSAqLwotdHlwZWRlZiB1aW50OF90ICgqY21kX3htaXRfY2IpKHVpbnQxNl90IG9wY29kZSwgdm9pZCogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdElOVF9DTURfQ0JBQ0sgcF9jYmFjayk7Ci0KLXR5cGVkZWYgdm9pZCAoKmNmZ19hMmRwX2NiKShidF92ZW5kb3Jfb3BfcmVzdWx0X3QgcmVzdWx0LCBidF92ZW5kb3Jfb3Bjb2RlX3Qgb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidGFfYXZfaGFuZGxlKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogc2V0IHRvIHNpemVvZihidF92ZW5kb3JfY2FsbGJhY2tzX3QpICovCi0gIHNpemVfdCBzaXplOwotCi0gIC8qCi0gICAqIENhbGxiYWNrIGFuZCBjYWxsb3V0IGZ1bmN0aW9ucyBoYXZlIGltcGxlbWVudGVkIGluIEhDSSBsaWJyYXkKLSAgICogKGxpYmJ0LWhjaS5zbykuCi0gICAqLwotCi0gIC8qIG5vdGlmaWVzIGNhbGxlciByZXN1bHQgb2YgZmlybXdhcmUgY29uZmlndXJhdGlvbiByZXF1ZXN0ICovCi0gIGNmZ19yZXN1bHRfY2IgZndjZmdfY2I7Ci0KLSAgLyogbm90aWZpZXMgY2FsbGVyIHJlc3VsdCBvZiBzY28gY29uZmlndXJhdGlvbiByZXF1ZXN0ICovCi0gIGNmZ19yZXN1bHRfY2Igc2NvY2ZnX2NiOwotCi0gIC8qIG5vdGlmaWVzIGNhbGxlciByZXN1bHQgb2YgbHBtIGVuYWJsZS9kaXNhYmxlICovCi0gIGNmZ19yZXN1bHRfY2IgbHBtX2NiOwotCi0gIC8qIG5vdGlmaWVzIHRoZSByZXN1bHQgb2YgY29kZWMgc2V0dGluZyAqLwotICBjZmdfcmVzdWx0X2NiIGF1ZGlvX3N0YXRlX2NiOwotCi0gIC8qIGJ1ZmZlciBhbGxvY2F0aW9uIHJlcXVlc3QgKi8KLSAgbWFsbG9jX2NiIGFsbG9jOwotCi0gIC8qIGJ1ZmZlciBkZWFsbG9jYXRpb24gcmVxdWVzdCAqLwotICBtZGVhbGxvY19jYiBkZWFsbG9jOwotCi0gIC8qIGhjaSBjb21tYW5kIHBhY2tldCB0cmFuc21pdCByZXF1ZXN0ICovCi0gIGNtZF94bWl0X2NiIHhtaXRfY2I7Ci0KLSAgLyogbm90aWZpZXMgY2FsbGVyIGNvbXBsZXRpb24gb2YgZXBpbG9nIHByb2Nlc3MgKi8KLSAgY2ZnX3Jlc3VsdF9jYiBlcGlsb2dfY2I7Ci0KLSAgLyogbm90aWZpZXMgc3RhdHVzIG9mIGEyZHAgb2ZmbG9hZCBjbWQncyAqLwotICBjZmdfYTJkcF9jYiBhMmRwX29mZmxvYWRfY2I7Ci19IGJ0X3ZlbmRvcl9jYWxsYmFja3NfdDsKLQotLyoqIEEyRFAgb2ZmbG9hZCByZXF1ZXN0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYnRhX2F2X2hhbmRsZTsgIC8qIEJUQV9BViBIYW5kbGUgZm9yIGNhbGxiYWNrcyAqLwotICB1aW50MTZfdCB4bWl0X3F1b3RhOyAgICAvKiBUb3RhbCBBQ0wgcXVvdGEgZm9yIGxpZ2h0IHN0YWNrICovCi0gIHVpbnQxNl90IGFjbF9kYXRhX3NpemU7IC8qIE1heCBBQ0wgZGF0YSBzaXplIGFjcm9zcyBIQ0kgdHJhbnNwb3J0ICovCi0gIHVpbnQxNl90IHN0cmVhbV9tdHU7Ci0gIHVpbnQxNl90IGxvY2FsX2NpZDsKLSAgdWludDE2X3QgcmVtb3RlX2NpZDsKLSAgdWludDE2X3QgbG1faGFuZGxlOwotICB1aW50OF90IGlzX2ZsdXNoYWJsZTsgLyogdHJ1ZSBpZiBmbHVzaGFibGUgY2hhbm5lbCAqLwotICB1aW50MzJfdCBzdHJlYW1fc291cmNlOwotICB1aW50OF90IGNvZGVjX2luZm9bMTBdOyAvKiBDb2RlYyBjYXBhYmlsaXRpZXMgYXJyYXkgKi8KLX0gYnRfdmVuZG9yX29wX2EyZHBfb2ZmbG9hZF90OwotCi0vKgotICogQmx1ZXRvb3RoIEhvc3QvQ29udHJvbGxlciBWRU5ET1IgSW50ZXJmYWNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIFNldCB0byBzaXplb2YoYnRfdm5kb3JfaW50ZXJmYWNlX3QpICovCi0gIHNpemVfdCBzaXplOwotCi0gIC8qCi0gICAqIEZ1bmN0aW9ucyBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGluIFZlbmRvciBsaWJyYXkgKGxpYmJ0LXZlbmRvci5zbykuCi0gICAqLwotCi0gIC8qKgotICAgKiBDYWxsZXIgd2lsbCBvcGVuIHRoZSBpbnRlcmZhY2UgYW5kIHBhc3MgaW4gdGhlIGNhbGxiYWNrIHJvdXRpbmVzCi0gICAqIHRvIHRoZSBpbXBsZW1lbmF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLgotICAgKi8KLSAgaW50ICgqaW5pdCkoY29uc3QgYnRfdmVuZG9yX2NhbGxiYWNrc190KiBwX2NiLCB1bnNpZ25lZCBjaGFyKiBsb2NhbF9iZGFkZHIpOwotCi0gIC8qKiAgVmVuZG9yIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KLSAgaW50ICgqb3ApKGJ0X3ZlbmRvcl9vcGNvZGVfdCBvcGNvZGUsIHZvaWQqIHBhcmFtKTsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UgKi8KLSAgdm9pZCAoKmNsZWFudXApKHZvaWQpOwotfSBidF92ZW5kb3JfaW50ZXJmYWNlX3Q7Ci0KLS8qCi0gKiBFeHRlcm5hbCBzaGFyZWQgbGliIGZ1bmN0aW9ucy9kYXRhCi0gKi8KLQotLyogRW50cnkgcG9pbnQgb2YgRExpYiAtLQotICogICAgICBWZW5kb3IgbGlicmFyeSBuZWVkcyB0byBpbXBsZW1lbnQgdGhlIGJvZHkgb2YgYnRfdmVuZG9yX2ludGVyZmFjZV90Ci0gKiAgICAgIHN0cnVjdHVyZSBhbmQgdXNlcyB0aGUgYmVsb3cgbmFtZSBhcyB0aGUgdmFyaWFibGUgbmFtZS4gSENJIGxpYnJhcnkKLSAqICAgICAgd2lsbCB1c2UgdGhpcyBzeW1ib2wgbmFtZSB0byBnZXQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRocm91Z2ggdGhlCi0gKiAgICAgIGRsc3ltIGNhbGwuCi0gKi8KLWV4dGVybiBjb25zdCBidF92ZW5kb3JfaW50ZXJmYWNlX3QgQkxVRVRPT1RIX1ZFTkRPUl9MSUJfSU5URVJGQUNFOwotCi0jZW5kaWYgLyogQlRfVkVORE9SX0xJQl9IICovCmRpZmYgLS1naXQgYS9oY2kvaW5jbHVkZS9idHNub29wLmggYi9oY2kvaW5jbHVkZS9idHNub29wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzRjOTguLjAwMDAwMDAKLS0tIGEvaGNpL2luY2x1ZGUvYnRzbm9vcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgQlRTTk9PUF9NT0RVTEVbXSA9ICJidHNub29wX21vZHVsZSI7Ci0KLXR5cGVkZWYgc3RydWN0IGJ0c25vb3BfdCB7Ci0gIC8vIENhcHR1cmUgfHBhY2tldHwgYW5kIGR1bXAgaXQgdG8gdGhlIGJ0c25vb3AgbG9ncy4gSWYgfGlzX3JlY2VpdmVkfCBpcwotICAvLyB0cnVlLCB0aGUgcGFja2V0IGlzIG1hcmtlZCBhcyBpbmNvbWluZy4gT3RoZXJ3aXNlLCB0aGUgcGFja2V0IGlzIG1hcmtlZAotICAvLyBhcyBvdXRnb2luZy4KLSAgdm9pZCAoKmNhcHR1cmUpKGNvbnN0IEJUX0hEUiogcGFja2V0LCBib29sIGlzX3JlY2VpdmVkKTsKLQotICAvLyBTZXQgYSBMMkNBUCBjaGFubmVsIGFzIGFsbG93bGlzdGVkLCBhbGxvd2luZyBwYWNrZXRzIHdpdGggdGhhdCBMMkNBUCBDSUQKLSAgLy8gdG8gc2hvdyB1cCBpbiB0aGUgc25vb3AgbG9ncy4KLSAgdm9pZCAoKmFsbG93bGlzdF9sMmNfY2hhbm5lbCkodWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQxNl90IGxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVtb3RlX2NpZCk7Ci0KLSAgLy8gU2V0IGEgUkZDT01NIGRsY2kgYXMgYWxsb3dsaXN0ZWQsIGFsbG93aW5nIHBhY2tldHMgd2l0aCB0aGF0IFJGQ09NTSBDSUQKLSAgLy8gdG8gc2hvdyB1cCBpbiB0aGUgc25vb3AgbG9ncy4gVGhlIGxvY2FsX2NpZCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBpdCB3aXRoCi0gIC8vIGl0cyBjb3JyaXNwb25kaW5nIEFDTCBjb25uZWN0aW9uLiBUaGUgZGxjaSBpcyB0aGUgY2hhbm5lbCB3aXRoIGRpcmVjdGlvbgotICAvLyBzbyB0aGVyZSBpcyBubyBjaGFuY2Ugb2YgYSBjb2xsaXNpb24gaWYgdHdvIHNlcnZpY2VzIGFyZSB1c2luZyB0aGUgc2FtZQotICAvLyBjaGFubmVsIGJ1dCBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucy4KLSAgdm9pZCAoKmFsbG93bGlzdF9yZmNfZGxjaSkodWludDE2X3QgbG9jYWxfY2lkLCB1aW50OF90IGRsY2kpOwotCi0gIC8vIEluZGljYXRlIHRoYXQgdGhlIHByb3ZpZGVkIEwyQ0FQIGNoYW5uZWwgaXMgYmVpbmcgdXNlZCBmb3IgUkZDT01NLgotICAvLyBJZiBwYWNrZXRzIHdpdGggdGhlIHByb3ZpZGVkIEwyQ0FQIENJRCBhcmUgZW5jb3VudGVyZWQsIHRoZXkgd2lsbCBiZQotICAvLyBmaWx0ZXJlZCBvbiBSRkNPTU0gYmFzZWQgb24gY2hhbm5lbHMgcHJvdmlkZWQgdG8gfGZpbHRlcl9yZmNfY2hhbm5lbHwuCi0gIHZvaWQgKCphZGRfcmZjX2wyY19jaGFubmVsKSh1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDE2X3QgbG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVtb3RlX2NpZCk7Ci0KLSAgLy8gQ2xlYXIgYW4gTDJDQVAgY2hhbm5lbCBmcm9tIGJlaW5nIGZpbHRlcmVkLgotICB2b2lkICgqY2xlYXJfbDJjYXBfYWxsb3dsaXN0KSh1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDE2X3QgbG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZW1vdGVfY2lkKTsKLX0gYnRzbm9vcF90OwotCi1jb25zdCBidHNub29wX3QqIGJ0c25vb3BfZ2V0X2ludGVyZmFjZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2hjaS9pbmNsdWRlL2J0c25vb3BfbWVtLmggYi9oY2kvaW5jbHVkZS9idHNub29wX21lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM3MmRhLi4wMDAwMDAwCi0tLSBhL2hjaS9pbmNsdWRlL2J0c25vb3BfbWVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8vIENhbGxiYWNrIGludm9rZWQgZm9yIGVhY2ggSENJIHBhY2tldC4KLS8vIEhpZ2hsYW5kZXIgbW9kZSAtIHRoZXJlIGNhbiBiZSBvbmx5IG9uZS4uLgotdHlwZWRlZiB2b2lkICgqYnRzbm9vcF9kYXRhX2NiKShjb25zdCB1aW50MTZfdCB0eXBlLCBjb25zdCB1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBsZW4sIGNvbnN0IHVpbnQ2NF90IHRpbWVzdGFtcF91cyk7Ci0KLS8vIENhbGxiYWNrIGludm9rZWQgZm9yIGVhY2ggSENJIHBhY2tldCB3aGVuIGFjdGl2aXR5IGF0dHJpYnV0aW9uIGlzIGVuYWJsZWQuCi10eXBlZGVmIHZvaWQgKCphY3Rpdml0eV9hdHRyaWJ1dGlvbl9jYikoY29uc3QgdWludDE2X3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2RhdGEsIGNvbnN0IHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QgdGltZXN0YW1wX3VzKTsKLQotLy8gVGhpcyBjYWxsIHNldHMgdGhlIChvbmUgYW5kIG9ubHkpIGNhbGxiYWNrIHRoYXQgd2lsbAotLy8gYmUgaW52b2tlZCBvbmNlIGZvciBlYWNoIEhDSSBwYWNrZXQvZXZlbnQuCi12b2lkIGJ0c25vb3BfbWVtX3NldF9jYWxsYmFjayhidHNub29wX2RhdGFfY2IgY2IpOwotCi12b2lkIGFjdGl2aXR5X2F0dHJpYnV0aW9uX3NldF9jYWxsYmFjayhhY3Rpdml0eV9hdHRyaWJ1dGlvbl9jYiBjYik7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBldmVyeSB0aW1lIGFuIEhDSSBwYWNrZXQKLS8vIGlzIHNlbnQvcmVjZWl2ZWQuIFBhY2tldHMgd2lsbCBiZSBmaWx0ZXJlZCAgYW5kIHRoZW4KLS8vIGZvcndhcmRlZCB0byB0aGUgfGJ0c25vb3BfZGF0YV9jYnwuCi12b2lkIGJ0c25vb3BfbWVtX2NhcHR1cmUoY29uc3QgQlRfSERSKiBwX2J1ZiwgY29uc3QgdWludDY0X3QgdGltZXN0YW1wX3VzKTsKZGlmZiAtLWdpdCBhL2hjaS9pbmNsdWRlL2J1ZmZlcl9hbGxvY2F0b3IuaCBiL2hjaS9pbmNsdWRlL2J1ZmZlcl9hbGxvY2F0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmYTJlNDQuLjAwMDAwMDAKLS0tIGEvaGNpL2luY2x1ZGUvYnVmZmVyX2FsbG9jYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotCi1jb25zdCBhbGxvY2F0b3JfdCogYnVmZmVyX2FsbG9jYXRvcl9nZXRfaW50ZXJmYWNlKCk7CmRpZmYgLS1naXQgYS9oY2kvaW5jbHVkZS9oY2lfbGF5ZXIuaCBiL2hjaS9pbmNsdWRlL2hjaV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGZmYzVjLi4wMDAwMDAwCi0tLSBhL2hjaS9pbmNsdWRlL2hjaV9sYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIElOVkFMSURfRkQKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotLy8vLy8gTEVHQUNZIERFRklOSVRJT05TIC8vLy8vCi0KLS8qIE1lc3NhZ2UgZXZlbnQgbWFzayBhY3Jvc3MgSG9zdC9Db250cm9sbGVyIGxpYiBhbmQgc3RhY2sgKi8KLSNkZWZpbmUgTVNHX0VWVF9NQVNLIDB4RkYwMCAgICAgLyogZXEuIEJUX0VWVF9NQVNLICovCi0jZGVmaW5lIE1TR19TVUJfRVZUX01BU0sgMHgwMEZGIC8qIGVxLiBCVF9TVUJfRVZUX01BU0sgKi8KLQotLyogTWVzc2FnZSBldmVudCBJRCBwYXNzZWQgZnJvbSBIb3N0L0NvbnRyb2xsZXIgbGliIHRvIHN0YWNrICovCi0jZGVmaW5lIE1TR19IQ19UT19TVEFDS19IQ0lfQUNMIDB4MTEwMCAgICAgIC8qIGVxLiBCVF9FVlRfVE9fQlRVX0hDSV9BQ0wgKi8KLSNkZWZpbmUgTVNHX0hDX1RPX1NUQUNLX0hDSV9TQ08gMHgxMjAwICAgICAgLyogZXEuIEJUX0VWVF9UT19CVFVfSENJX1NDTyAqLwotI2RlZmluZSBNU0dfSENfVE9fU1RBQ0tfSENJX0VSUiAweDEzMDAgICAgICAvKiBlcS4gQlRfRVZUX1RPX0JUVV9IQ0lUX0VSUiAqLwotI2RlZmluZSBNU0dfSENfVE9fU1RBQ0tfSENJX0lTTyAweDE3MDAgICAgICAvKiBlcS4gQlRfRVZUX1RPX0JUVV9IQ0lfSVNPICovCi0jZGVmaW5lIE1TR19IQ19UT19TVEFDS19IQ0lfRVZUIDB4MTAwMCAgICAgIC8qIGVxLiBCVF9FVlRfVE9fQlRVX0hDSV9FVlQgKi8KLQotLyogTWVzc2FnZSBldmVudCBJRCBwYXNzZWQgZnJvbSBzdGFjayB0byB2ZW5kb3IgbGliICovCi0jZGVmaW5lIE1TR19TVEFDS19UT19IQ19IQ0lfQUNMIDB4MjEwMCAvKiBlcS4gQlRfRVZUX1RPX0xNX0hDSV9BQ0wgKi8KLSNkZWZpbmUgTVNHX1NUQUNLX1RPX0hDX0hDSV9TQ08gMHgyMjAwIC8qIGVxLiBCVF9FVlRfVE9fTE1fSENJX1NDTyAqLwotI2RlZmluZSBNU0dfU1RBQ0tfVE9fSENfSENJX0lTTyAweDJkMDAgLyogZXEuIEJUX0VWVF9UT19MTV9IQ0lfSVNPICovCi0jZGVmaW5lIE1TR19TVEFDS19UT19IQ19IQ0lfQ01EIDB4MjAwMCAvKiBlcS4gQlRfRVZUX1RPX0xNX0hDSV9DTUQgKi8KLQotLyogTG9jYWwgQmx1ZXRvb3RoIENvbnRyb2xsZXIgSUQgZm9yIEJSL0VEUiAqLwotI2RlZmluZSBMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCAwCi0KLS8vLy8vIEVORCBMRUdBQ1kgREVGSU5JVElPTlMgLy8vLy8KLXR5cGVkZWYgc3RydWN0IHBhY2tldF9mcmFnbWVudGVyX3QgcGFja2V0X2ZyYWdtZW50ZXJfdDsKLXR5cGVkZWYgdWludDE2X3QgY29tbWFuZF9vcGNvZGVfdDsKLQotdHlwZWRlZiB2b2lkICgqY29tbWFuZF9jb21wbGV0ZV9jYikoQlRfSERSKiByZXNwb25zZSwgdm9pZCogY29udGV4dCk7Ci10eXBlZGVmIHZvaWQgKCpjb21tYW5kX3N0YXR1c19jYikodWludDhfdCBzdGF0dXMsIEJUX0hEUiogY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KTsKLQotdHlwZWRlZiBzdHJ1Y3QgaGNpX3QgewotICAvLyBTZXQgdGhlIGNhbGxiYWNrIHRoYXQgdGhlIEhDSSBsYXllciB1c2VzIHRvIHNlbmQgZGF0YSB1cHdhcmRzCi0gIHZvaWQgKCpzZXRfZGF0YV9jYikoCi0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiwgQlRfSERSKik+IHNlbmRfZGF0YV9jYik7Ci0KLSAgLy8gU2VuZCBhIGNvbW1hbmQgdGhyb3VnaCB0aGUgSENJIGxheWVyCi0gIHZvaWQgKCp0cmFuc21pdF9jb21tYW5kKShjb25zdCBCVF9IRFIqIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvbXBsZXRlX2NiIGNvbXBsZXRlX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9zdGF0dXNfY2Igc3RhdHVzX2NiLCB2b2lkKiBjb250ZXh0KTsKLQotICBmdXR1cmVfdCogKCp0cmFuc21pdF9jb21tYW5kX2Z1dHVyZWQpKGNvbnN0IEJUX0hEUiogY29tbWFuZCk7Ci0KLSAgLy8gU2VuZCBzb21lIGRhdGEgZG93bndhcmQgdGhyb3VnaCB0aGUgSENJIGxheWVyCi0gIHZvaWQgKCp0cmFuc21pdF9kb3dud2FyZCkodWludDE2X3QgdHlwZSwgdm9pZCogZGF0YSk7Ci19IGhjaV90OwotCi1jb25zdCBoY2lfdCogaGNpX2xheWVyX2dldF9pbnRlcmZhY2UoKTsKLQotYm9vbCBoY2lfaXNfcm9vdF9pbmZsYW1tYXRpb25fZXZlbnRfcmVjZWl2ZWQoKTsKZGlmZiAtLWdpdCBhL2hjaS9pbmNsdWRlL2hjaV9wYWNrZXRfZmFjdG9yeS5oIGIvaGNpL2luY2x1ZGUvaGNpX3BhY2tldF9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL2luY2x1ZGUvaGNpX3BhY2tldF9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvaGNpL2luY2x1ZGUvaGNpX3BhY2tldF9wYXJzZXIuaCBiL2hjaS9pbmNsdWRlL2hjaV9wYWNrZXRfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzE2ZWEuLjAwMDAwMDAKLS0tIGEvaGNpL2luY2x1ZGUvaGNpX3BhY2tldF9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9kZXZpY2VfZmVhdHVyZXMuaCIKLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZmVhdHVyZXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAoKnBhcnNlX2dlbmVyaWNfY29tbWFuZF9jb21wbGV0ZSkoQlRfSERSKiByZXNwb25zZSk7Ci0KLSAgdm9pZCAoKnBhcnNlX3JlYWRfYnVmZmVyX3NpemVfcmVzcG9uc2UpKEJUX0hEUiogcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZGF0YV9zaXplX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBhY2xfYnVmZmVyX2NvdW50X3B0cik7Ci0KLSAgdm9pZCAoKnBhcnNlX3JlYWRfbG9jYWxfdmVyc2lvbl9pbmZvX3Jlc3BvbnNlKShCVF9IRFIqIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3ZlcnNpb25fdCogYnRfdmVyc2lvbl9wdHIpOwotCi0gIHZvaWQgKCpwYXJzZV9yZWFkX2JkX2FkZHJfcmVzcG9uc2UpKEJUX0hEUiogcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGFkZHJlc3NfcHRyKTsKLQotICB2b2lkICgqcGFyc2VfcmVhZF9sb2NhbF9zdXBwb3J0ZWRfY29tbWFuZHNfcmVzcG9uc2UpKAotICAgICAgQlRfSERSKiByZXNwb25zZSwgdWludDhfdCogc3VwcG9ydGVkX2NvbW1hbmRzX3B0ciwKLSAgICAgIHNpemVfdCBzdXBwb3J0ZWRfY29tbWFuZHNfbGVuZ3RoKTsKLQotICB2b2lkICgqcGFyc2VfcmVhZF9sb2NhbF9leHRlbmRlZF9mZWF0dXJlc19yZXNwb25zZSkoCi0gICAgICBCVF9IRFIqIHJlc3BvbnNlLCB1aW50OF90KiBwYWdlX251bWJlcl9wdHIsIHVpbnQ4X3QqIG1heF9wYWdlX251bWJlcl9wdHIsCi0gICAgICBidF9kZXZpY2VfZmVhdHVyZXNfdCogZmVhdHVyZV9wYWdlcywgc2l6ZV90IGZlYXR1cmVfcGFnZXNfY291bnQpOwotCi0gIHZvaWQgKCpwYXJzZV9ibGVfcmVhZF9hY2NlcHRsaXN0X3NpemVfcmVzcG9uc2UpKEJUX0hEUiogcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFjY2VwdGxpc3Rfc2l6ZV9wdHIpOwotCi0gIHZvaWQgKCpwYXJzZV9ibGVfcmVhZF9idWZmZXJfc2l6ZV9yZXNwb25zZSkoQlRfSERSKiByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZGF0YV9zaXplX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhY2xfYnVmZmVyX2NvdW50X3B0cik7Ci0gIHZvaWQgKCpwYXJzZV9ibGVfcmVhZF9idWZmZXJfc2l6ZV92Ml9yZXNwb25zZSkoQlRfSERSKiByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogYWNsX2RhdGFfc2l6ZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWNsX2J1ZmZlcl9jb3VudF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGlzb19kYXRhX3NpemVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGlzb19idWZmZXJfY291bnRfcHRyKTsKLQotICB2b2lkICgqcGFyc2VfYmxlX3JlYWRfc3VwcG9ydGVkX3N0YXRlc19yZXNwb25zZSkoCi0gICAgICBCVF9IRFIqIHJlc3BvbnNlLCB1aW50OF90KiBzdXBwb3J0ZWRfc3RhdGVzLAotICAgICAgc2l6ZV90IHN1cHBvcnRlZF9zdGF0ZXNfc2l6ZSk7Ci0KLSAgdm9pZCAoKnBhcnNlX2JsZV9yZWFkX2xvY2FsX3N1cHBvcnRlZF9mZWF0dXJlc19yZXNwb25zZSkoCi0gICAgICBCVF9IRFIqIHJlc3BvbnNlLCBidF9kZXZpY2VfZmVhdHVyZXNfdCogc3VwcG9ydGVkX2ZlYXR1cmVzKTsKLQotICB2b2lkICgqcGFyc2VfYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3Rfc2l6ZV9yZXNwb25zZSkoCi0gICAgICBCVF9IRFIqIHJlc3BvbnNlLCB1aW50OF90KiByZXNvbHZpbmdfbGlzdF9zaXplX3B0cik7Ci0KLSAgdm9pZCAoKnBhcnNlX2JsZV9yZWFkX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoX3Jlc3BvbnNlKSgKLSAgICAgIEJUX0hEUiogcmVzcG9uc2UsIHVpbnQxNl90KiBibGVfZGVmYXVsdF9wYWNrZXRfbGVuZ3RoX3B0cik7Ci0KLSAgdm9pZCAoKnBhcnNlX2JsZV9yZWFkX21heGltdW1fZGF0YV9sZW5ndGhfcmVzcG9uc2UpKAotICAgICAgQlRfSERSKiByZXNwb25zZSwgdWludDE2X3QqIGJsZV9zdXBwb3J0ZWRfbWF4X3R4X29jdGV0cywKLSAgICAgIHVpbnQxNl90KiBibGVfc3VwcG9ydGVkX21heF90eF90aW1lLAotICAgICAgdWludDE2X3QqIGJsZV9zdXBwb3J0ZWRfbWF4X3J4X29jdGV0cywKLSAgICAgIHVpbnQxNl90KiBibGVfc3VwcG9ydGVkX21heF9yeF90aW1lKTsKLQotICB2b2lkICgqcGFyc2VfYmxlX3JlYWRfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aCkoCi0gICAgICBCVF9IRFIqIHJlc3BvbnNlLCB1aW50MTZfdCogYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGhfcHRyKTsKLQotICB2b2lkICgqcGFyc2VfYmxlX3JlYWRfbnVtYmVyX29mX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzKSgKLSAgICAgIEJUX0hEUiogcmVzcG9uc2UsIHVpbnQ4X3QqIGJsZV9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHNfcHRyKTsKLQotICB2b2lkICgqcGFyc2VfYmxlX3JlYWRfc2l6ZV9vZl9hZHZlcnRpc2VyX2xpc3QpKAotICAgICAgQlRfSERSKiByZXNwb25zZSwgdWludDhfdCogYmxlX3NpemVfb2ZfYWR2ZXJ0aXNlcl9saXN0X3B0cik7Ci0KLSAgdm9pZCAoKnBhcnNlX3JlYWRfbG9jYWxfc3VwcG9ydGVkX2NvZGVjc19yZXNwb25zZSkoCi0gICAgICBCVF9IRFIqIHJlc3BvbnNlLCB1aW50OF90KiBudW1iZXJfb2ZfbG9jYWxfc3VwcG9ydGVkX2NvZGVjcywKLSAgICAgIHVpbnQ4X3QqIGxvY2FsX3N1cHBvcnRlZF9jb2RlY3MpOwotCi19IGhjaV9wYWNrZXRfcGFyc2VyX3Q7Ci0KLWNvbnN0IGhjaV9wYWNrZXRfcGFyc2VyX3QqIGhjaV9wYWNrZXRfcGFyc2VyX2dldF9pbnRlcmZhY2UoKTsKLQotY29uc3QgaGNpX3BhY2tldF9wYXJzZXJfdCogaGNpX3BhY2tldF9wYXJzZXJfZ2V0X3Rlc3RfaW50ZXJmYWNlKAotICAgIGFsbG9jYXRvcl90KiBidWZmZXJfYWxsb2NhdG9yX2ludGVyZmFjZSk7CmRpZmYgLS1naXQgYS9oY2kvaW5jbHVkZS9wYWNrZXRfZnJhZ21lbnRlci5oIGIvaGNpL2luY2x1ZGUvcGFja2V0X2ZyYWdtZW50ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2NTFhMC4uMDAwMDAwMAotLS0gYS9oY2kvaW5jbHVkZS9wYWNrZXRfZnJhZ21lbnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi10eXBlZGVmIHZvaWQgKCp0cmFuc21pdF9maW5pc2hlZF9jYikoQlRfSERSKiBwYWNrZXQsIGJvb2wgYWxsX2ZyYWdtZW50c19zZW50KTsKLXR5cGVkZWYgdm9pZCAoKnBhY2tldF9yZWFzc2VtYmxlZF9jYikoQlRfSERSKiBwYWNrZXQpOwotdHlwZWRlZiB2b2lkICgqcGFja2V0X2ZyYWdtZW50ZWRfY2IpKEJUX0hEUiogcGFja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VuZF90cmFuc21pdF9maW5pc2hlZCk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gQ2FsbGVkIGZvciBldmVyeSBwYWNrZXQgZnJhZ21lbnQuCi0gIHBhY2tldF9mcmFnbWVudGVkX2NiIGZyYWdtZW50ZWQ7Ci0KLSAgLy8gQ2FsbGVkIGZvciBldmVyeSBjb21wbGV0ZWx5IHJlYXNzZW1ibGVkIHBhY2tldC4KLSAgcGFja2V0X3JlYXNzZW1ibGVkX2NiIHJlYXNzZW1ibGVkOwotCi0gIC8vIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudGVyIGZpbmlzaGVzIHNlbmRpbmcgYWxsIHJlcXVlc3RlZCBmcmFnbWVudHMsCi0gIC8vIGJ1dCB0aGUgcGFja2V0IGhhcyBub3QgYmVlbiBlbnRpcmVseSBzZW50LgotICB0cmFuc21pdF9maW5pc2hlZF9jYiB0cmFuc21pdF9maW5pc2hlZDsKLX0gcGFja2V0X2ZyYWdtZW50ZXJfY2FsbGJhY2tzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHBhY2tldF9mcmFnbWVudGVyX3QgewotICAvLyBJbml0aWFsaXplIHRoZSBmcmFnbWVudGVyLCBzcGVjaWZ5aW5nIHRoZSB8cmVzdWx0X2NhbGxiYWNrc3wuCi0gIHZvaWQgKCppbml0KShjb25zdCBwYWNrZXRfZnJhZ21lbnRlcl9jYWxsYmFja3NfdCogcmVzdWx0X2NhbGxiYWNrcyk7Ci0KLSAgLy8gUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnJhZ21lbnRlci4KLSAgdm9pZCAoKmNsZWFudXApKHZvaWQpOwotCi0gIC8vIEZyYWdtZW50cyB8cGFja2V0fCBpZiBuZWNlc3NhcnkgYW5kIGhhbmRzIG9mZiBldmVyeXRoaW5nIHRvIHRoZSBmcmFnbWVudGVkCi0gIC8vIGNhbGxiYWNrLgotICB2b2lkICgqZnJhZ21lbnRfYW5kX2Rpc3BhdGNoKShCVF9IRFIqIHBhY2tldCk7Ci0gIC8vIElmIHxwYWNrZXR8IGlzIGEgY29tcGxldGUgcGFja2V0LCBmb3J3YXJkcyB0byB0aGUgcmVhc3NlbWJsZWQgY2FsbGJhY2suCi0gIC8vIE90aGVyd2lzZQotICAvLyBob2xkcyBvbnRvIGl0IHVudGlsIGFsbCBmcmFnbWVudHMgYXJyaXZlLCBhdCB3aGljaCBwb2ludCB0aGUgcmVhc3NlbWJsZWQKLSAgLy8gY2FsbGJhY2sgaXMgY2FsbGVkCi0gIC8vIHdpdGggdGhlIHJlYXNzZW1ibGVkIGRhdGEuCi0gIHZvaWQgKCpyZWFzc2VtYmxlX2FuZF9kaXNwYXRjaCkoQlRfSERSKiBwYWNrZXQpOwotfSBwYWNrZXRfZnJhZ21lbnRlcl90OwotCi1jb25zdCBwYWNrZXRfZnJhZ21lbnRlcl90KiBwYWNrZXRfZnJhZ21lbnRlcl9nZXRfaW50ZXJmYWNlKCk7Ci0KLWNvbnN0IHBhY2tldF9mcmFnbWVudGVyX3QqIHBhY2tldF9mcmFnbWVudGVyX2dldF90ZXN0X2ludGVyZmFjZSgKLSAgICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXJfaW50ZXJmYWNlLAotICAgIGNvbnN0IGFsbG9jYXRvcl90KiBidWZmZXJfYWxsb2NhdG9yX2ludGVyZmFjZSk7CmRpZmYgLS1naXQgYS9oY2kvaW5jbHVkZS91c2VyaWFsLmggYi9oY2kvaW5jbHVkZS91c2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjE4MDYuLjAwMDAwMDAKLS0tIGEvaGNpL2luY2x1ZGUvdXNlcmlhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBtZXNzYWdlICJUaGlzIGhlYWRlciBmaWxlIHVzZXJpYWwuaCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIgotI3ByYWdtYSBtZXNzYWdlICJQbGVhc2UgdXBkYXRlIHRvIHJlbW92ZSB0aGVzZSBkZWNsYXJhdGlvbnMiCi0KLSNwcmFnbWEgb25jZQotCi0vLyAgICAgQ3VycmVudGx5IHN0aWxsIGluY2x1ZGVkIGJ5OgotLy8gICAgICAgICBoYXJkd2FyZS9icm9hZGNvbS9saWJidC9pbmNsdWRlL3VzZXJpYWxfdmVuZG9yLmgKLS8vICAgICAgICAgdmVuZG9yL2FtbG9naWMvY29tbW9uL3dpZmlfYnQvYmx1ZXRvb3RoL3JlYWx0ZWsvcnRrYnQvY29kZS9saWJidC12ZW5kb3IvaW5jbHVkZS91c2VyaWFsX3ZlbmRvci5oCi0vLyAgICAgICAgIHZlbmRvci9hbWxvZ2ljL2NvbW1vbi93aWZpX2J0L2JsdWV0b290aC9icm9hZGNvbS92ZW5kb3IvaW5jbHVkZS91c2VyaWFsX3ZlbmRvci5oCi0vLyAgICAgICAgIHZlbmRvci9hbWxvZ2ljL2NvbW1vbi93aWZpX2J0L2JsdWV0b290aC9hbWxvZ2ljL2FtbF9saWJidC12ZW5kb3IvaW5jbHVkZS91c2VyaWFsX3ZlbmRvci5oCmRpZmYgLS1naXQgYS9oY2kvc3JjL2J0c25vb3AuY2MgYi9oY2kvc3JjL2J0c25vb3AuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTJkYWEuLjAwMDAwMDAKLS0tIGEvaGNpL3NyYy9idHNub29wLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9zbm9vcCIKLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgImhjaS9pbmNsdWRlL2J0c25vb3AuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9idHNub29wX21lbS5oIgotI2luY2x1ZGUgImhjaV9sYXllci5oIgotI2luY2x1ZGUgImludGVybmFsX2luY2x1ZGUvYnRfdHJhY2UuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpbXNncy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcmZjZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL2wyY2FwL2wyY19pbnQuaCIKLSNpbmNsdWRlICJzdGFja19jb25maWcuaCIKLQotLy8gVGhlIG51bWJlciBvZiBvZiBwYWNrZXRzIHBlciBidHNub29wIGZpbGUgYmVmb3JlIHdlIHJvdGF0ZSB0byB0aGUgbmV4dAotLy8gZmlsZS4gQXMgb2YgcmlnaHQgbm93IHRoZXJlIGFyZSB0d28gc25vb3AgZmlsZXMgdGhhdCBhcmUgcm90YXRlZCB0aHJvdWdoLgotLy8gVGhlIHNpemUgY2FuIGJlIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgYnkgc2V0aW5nIHRoZSByZWxldmFudCBzeXN0ZW0KLS8vIHByb3BlcnR5Ci0jZGVmaW5lIERFRkFVTFRfQlRTTk9PUF9TSVpFIDB4ZmZmZgotCi0jZGVmaW5lIElTX0RFQlVHR0FCTEVfUFJPUEVSVFkgInJvLmRlYnVnZ2FibGUiCi0KLSNkZWZpbmUgQlRTTk9PUF9MT0dfTU9ERV9QUk9QRVJUWSAicGVyc2lzdC5ibHVldG9vdGguYnRzbm9vcGxvZ21vZGUiCi0jZGVmaW5lIEJUU05PT1BfREVGQVVMVF9NT0RFX1BST1BFUlRZICJwZXJzaXN0LmJsdWV0b290aC5idHNub29wZGVmYXVsdG1vZGUiCi0jZGVmaW5lIEJUU05PT1BfTU9ERV9ESVNBQkxFRCAiZGlzYWJsZWQiCi0jZGVmaW5lIEJUU05PT1BfTU9ERV9GSUxURVJFRCAiZmlsdGVyZWQiCi0jZGVmaW5lIEJUU05PT1BfTU9ERV9GVUxMICJmdWxsIgotCi0jZGVmaW5lIEJUU05PT1BfUEFUSF9QUk9QRVJUWSAicGVyc2lzdC5ibHVldG9vdGguYnRzbm9vcHBhdGgiCi0jZGVmaW5lIERFRkFVTFRfQlRTTk9PUF9QQVRIICIvZGF0YS9taXNjL2JsdWV0b290aC9sb2dzL2J0c25vb3BfaGNpLmxvZyIKLSNkZWZpbmUgQlRTTk9PUF9NQVhfUEFDS0VUU19QUk9QRVJUWSAicGVyc2lzdC5ibHVldG9vdGguYnRzbm9vcHNpemUiCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGtDb21tYW5kUGFja2V0ID0gMSwKLSAga0FjbFBhY2tldCA9IDIsCi0gIGtTY29QYWNrZXQgPSAzLAotICBrRXZlbnRQYWNrZXQgPSA0LAotICBrSXNvUGFja2V0ID0gNSwKLX0gcGFja2V0X3R5cGVfdDsKLQotLy8gRXBvY2ggaW4gbWljcm9zZWNvbmRzIHNpbmNlIDAxLzAxLzAwMDAKLXN0YXRpYyBjb25zdCB1aW50NjRfdCBCVFNOT09QX0VQT0NIX0RFTFRBID0gMHgwMGRjZGRiMzBmMmY4MDAwVUxMOwotCi0vLyBOdW1iZXIgb2YgYnl0ZXMgaW50byBhIHBhY2tldCB3aGVyZSB5b3UgY2FuIGZpbmQgdGhlIHZhbHVlIGZvciBhIGNoYW5uZWwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IEFDTF9DSEFOTkVMX09GRlNFVCA9IDA7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IEwyQ19DSEFOTkVMX09GRlNFVCA9IDY7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IFJGQ19DSEFOTkVMX09GRlNFVCA9IDg7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IFJGQ19FVkVOVF9PRkZTRVQgPSA5OwotCi0vLyBUaGUgc2l6ZSBvZiB0aGUgTDJDQVAgaGVhZGVyLiBBbGwgaW5mb3JtYXRpb24gcGFzdCB0aGlzIHBvaW50IGlzIHJlbW92ZWQgZnJvbQotLy8gYSBmaWx0ZXJlZCBwYWNrZXQuCi1zdGF0aWMgY29uc3QgdWludDMyX3QgTDJDX0hFQURFUl9TSVpFID0gOTsKLQotc3RhdGljIGludCBsb2dmaWxlX2ZkID0gSU5WQUxJRF9GRDsKLXN0YXRpYyBzdGQ6Om11dGV4IGJ0c25vb3BfbXV0ZXg7Ci0KLXN0YXRpYyBpbnQzMl90IHBhY2tldHNfcGVyX2ZpbGU7Ci1zdGF0aWMgaW50MzJfdCBwYWNrZXRfY291bnRlcjsKLQotLy8gQ2hhbm5lbCB0cmFja2luZyB2YXJpYWJsZXMgZm9yIGZpbHRlcmluZy4KLQotLy8gS2VlcHMgdHJhY2sgb2YgTDJDQVAgY2hhbm5lbHMgdGhhdCBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dCBvZiB0aGUgc25vb3AKLS8vIGxvZ3MuCi1jbGFzcyBGaWx0ZXJUcmFja2VyIHsKLSBwdWJsaWM6Ci0gIC8vIE5PVEU6IDEgaXMgdXNlZCBhcyBhIHN0YXRpYyBDSUQgZm9yIEwyQ0FQIHNpZ25hbGluZwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDE2X3Q+IGwyY19sb2NhbF9jaWQgPSB7MX07Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MTZfdD4gbDJjX3JlbW90ZV9jaWQgPSB7MX07Ci0gIHVpbnQxNl90IHJmY19sb2NhbF9jaWQgPSAwOwotICB1aW50MTZfdCByZmNfcmVtb3RlX2NpZCA9IDA7Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MTZfdD4gcmZjX2NoYW5uZWxzID0gezB9OwotCi0gIC8vIEFkZHMgTDJDIGNoYW5uZWwgdG8gYWxsb3dsaXN0LgotICB2b2lkIGFkZEwyY0NpZCh1aW50MTZfdCBsb2NhbF9jaWQsIHVpbnQxNl90IHJlbW90ZV9jaWQpIHsKLSAgICBsMmNfbG9jYWxfY2lkLmluc2VydChsb2NhbF9jaWQpOwotICAgIGwyY19yZW1vdGVfY2lkLmluc2VydChyZW1vdGVfY2lkKTsKLSAgfQotCi0gIC8vIFNldHMgTDJDQVAgY2hhbm5lbCB0aGF0IFJGQ09NTSB1c2VzLgotICB2b2lkIHNldFJmY0NpZCh1aW50MTZfdCBsb2NhbF9jaWQsIHVpbnQxNl90IHJlbW90ZV9jaWQpIHsKLSAgICByZmNfbG9jYWxfY2lkID0gbG9jYWxfY2lkOwotICAgIHJmY19yZW1vdGVfY2lkID0gcmVtb3RlX2NpZDsKLSAgfQotCi0gIC8vIFJlbW92ZSBMMkMgY2hhbm5lbCBmcm9tIGFsbG93bGlzdC4KLSAgdm9pZCByZW1vdmVMMmNDaWQodWludDE2X3QgbG9jYWxfY2lkLCB1aW50MTZfdCByZW1vdGVfY2lkKSB7Ci0gICAgaWYgKHJmY19sb2NhbF9jaWQgPT0gbG9jYWxfY2lkKSB7Ci0gICAgICByZmNfY2hhbm5lbHMuY2xlYXIoKTsKLSAgICAgIHJmY19jaGFubmVscy5pbnNlcnQoMCk7Ci0gICAgICByZmNfbG9jYWxfY2lkID0gMDsKLSAgICAgIHJmY19yZW1vdGVfY2lkID0gMDsKLSAgICB9Ci0KLSAgICBsMmNfbG9jYWxfY2lkLmVyYXNlKGxvY2FsX2NpZCk7Ci0gICAgbDJjX3JlbW90ZV9jaWQuZXJhc2UocmVtb3RlX2NpZCk7Ci0gIH0KLQotICB2b2lkIGFkZFJmY0RsY2kodWludDhfdCBjaGFubmVsKSB7IHJmY19jaGFubmVscy5pbnNlcnQoY2hhbm5lbCk7IH0KLQotICBib29sIGlzQWxsb3dsaXN0ZWRMMmMoYm9vbCBsb2NhbCwgdWludDE2X3QgY2lkKSB7Ci0gICAgY29uc3QgYXV0byYgc2V0ID0gbG9jYWwgPyBsMmNfbG9jYWxfY2lkIDogbDJjX3JlbW90ZV9jaWQ7Ci0gICAgcmV0dXJuIChzZXQuZmluZChjaWQpICE9IHNldC5lbmQoKSk7Ci0gIH0KLQotICBib29sIGlzUmZjQ2hhbm5lbChib29sIGxvY2FsLCB1aW50MTZfdCBjaWQpIHsKLSAgICBjb25zdCBhdXRvJiBjaGFubmVsID0gbG9jYWwgPyByZmNfbG9jYWxfY2lkIDogcmZjX3JlbW90ZV9jaWQ7Ci0gICAgcmV0dXJuIGNpZCA9PSBjaGFubmVsOwotICB9Ci0KLSAgYm9vbCBpc0FsbG93bGlzdGVkRGxjaSh1aW50OF90IGRsY2kpIHsKLSAgICByZXR1cm4gcmZjX2NoYW5uZWxzLmZpbmQoZGxjaSkgIT0gcmZjX2NoYW5uZWxzLmVuZCgpOwotICB9Ci19OwotCi1zdGQ6Om11dGV4IGZpbHRlcl9saXN0X211dGV4Owotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBGaWx0ZXJUcmFja2VyPiBmaWx0ZXJfbGlzdDsKLXN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgdWludDE2X3Q+IGxvY2FsX2NpZF90b19hY2w7Ci0KLS8vIENhY2hlZCB2YWx1ZSBmb3Igd2hldGhlciBmdWxsIHNub29wIGxvZ3MgYXJlIGVuYWJsZWQuIFNvIHRoZSBwcm9wZXJ0eSBpc24ndAotLy8gY2hlY2tlZCBmb3IgZXZlcnkgcGFja2V0Lgotc3RhdGljIGJvb2wgaXNfYnRzbm9vcF9lbmFibGVkOwotc3RhdGljIGJvb2wgaXNfYnRzbm9vcF9maWx0ZXJlZDsKLQotLy8gVE9ETyh6YWNob3ZlcmZsb3cpOiBtZXJnZSBidHNub29wIGFuZCBidHNub29wX25ldCB0b2dldGhlcgotdm9pZCBidHNub29wX25ldF9vcGVuKCk7Ci12b2lkIGJ0c25vb3BfbmV0X2Nsb3NlKCk7Ci12b2lkIGJ0c25vb3BfbmV0X3dyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpOwotCi1zdGF0aWMgdm9pZCBkZWxldGVfYnRzbm9vcF9maWxlcyhib29sIGZpbHRlcmVkKTsKLXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfYnRzbm9vcF9sb2dfcGF0aChib29sIGZpbHRlcmVkKTsKLXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfYnRzbm9vcF9sYXN0X2xvZ19wYXRoKHN0ZDo6c3RyaW5nIGxvZ19wYXRoKTsKLXN0YXRpYyB2b2lkIG9wZW5fbmV4dF9zbm9vcF9maWxlKCk7Ci1zdGF0aWMgdm9pZCBidHNub29wX3dyaXRlX3BhY2tldChwYWNrZXRfdHlwZV90IHR5cGUsIHVpbnQ4X3QqIHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVjZWl2ZWQsIHVpbnQ2NF90IHRpbWVzdGFtcF91cyk7Ci0KLS8vIE1vZHVsZSBsaWZlY3ljbGUgZnVuY3Rpb25zCi0KLXN0YXRpYyBmdXR1cmVfdCogc3RhcnRfdXAoKSB7Ci0gIHN0ZDo6YXJyYXk8Y2hhciwgUFJPUEVSVFlfVkFMVUVfTUFYPiBwcm9wZXJ0eSA9IHt9OwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhidHNub29wX211dGV4KTsKLQotICAvLyBEZWZhdWx0IG1vZGUgaXMgRklMVEVSRUQgb24gdXNlcmRlYnVnL2VuZyBidWlsZCwgRElTQUJMRUQgb24gdXNlciBidWlsZC4KLSAgLy8gSXQgY2FuIGFsc28gYmUgb3ZlcndyaXR0ZW4gYnkgbW9kaWZ5aW5nIHRoZSBnbG9iYWwgc2V0dGluZy4KLSAgaW50IGlzX2RlYnVnZ2FibGUgPSBvc2lfcHJvcGVydHlfZ2V0X2ludDMyKElTX0RFQlVHR0FCTEVfUFJPUEVSVFksIDApOwotICBzdGQ6OnN0cmluZyBkZWZhdWx0X21vZGUgPSBCVFNOT09QX01PREVfRElTQUJMRUQ7Ci0gIGlmIChpc19kZWJ1Z2dhYmxlKSB7Ci0gICAgaW50IGxlbiA9IG9zaV9wcm9wZXJ0eV9nZXQoQlRTTk9PUF9ERUZBVUxUX01PREVfUFJPUEVSVFksIHByb3BlcnR5LmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVFNOT09QX01PREVfRElTQUJMRUQpOwotICAgIGRlZmF1bHRfbW9kZSA9IHN0ZDo6c3RyaW5nKHByb3BlcnR5LmRhdGEoKSwgbGVuKTsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWN0dWFsIG1vZGUKLSAgaW50IGxlbiA9IG9zaV9wcm9wZXJ0eV9nZXQoQlRTTk9PUF9MT0dfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHkuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X21vZGUuY19zdHIoKSk7Ci0gIHN0ZDo6c3RyaW5nIGJ0c25vb3BfbW9kZShwcm9wZXJ0eS5kYXRhKCksIGxlbik7Ci0KLSAgaWYgKGJ0c25vb3BfbW9kZSA9PSBCVFNOT09QX01PREVfRklMVEVSRUQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogRmlsdGVyZWQgU25vb3AgTG9ncyBlbmFibGVkIjsKLSAgICBpc19idHNub29wX2VuYWJsZWQgPSB0cnVlOwotICAgIGlzX2J0c25vb3BfZmlsdGVyZWQgPSB0cnVlOwotICAgIGRlbGV0ZV9idHNub29wX2ZpbGVzKGZhbHNlKTsKLSAgfSBlbHNlIGlmIChidHNub29wX21vZGUgPT0gQlRTTk9PUF9NT0RFX0ZVTEwpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU25vb3AgTG9ncyBmdWxseSBlbmFibGVkIjsKLSAgICBpc19idHNub29wX2VuYWJsZWQgPSB0cnVlOwotICAgIGlzX2J0c25vb3BfZmlsdGVyZWQgPSBmYWxzZTsKLSAgICBkZWxldGVfYnRzbm9vcF9maWxlcyh0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU25vb3AgTG9ncyBkaXNhYmxlZCI7Ci0gICAgaXNfYnRzbm9vcF9lbmFibGVkID0gZmFsc2U7Ci0gICAgaXNfYnRzbm9vcF9maWx0ZXJlZCA9IGZhbHNlOwotICAgIGRlbGV0ZV9idHNub29wX2ZpbGVzKHRydWUpOwotICAgIGRlbGV0ZV9idHNub29wX2ZpbGVzKGZhbHNlKTsKLSAgfQotCi0gIGlmIChpc19idHNub29wX2VuYWJsZWQpIHsKLSAgICBvcGVuX25leHRfc25vb3BfZmlsZSgpOwotICAgIHBhY2tldHNfcGVyX2ZpbGUgPSBvc2lfcHJvcGVydHlfZ2V0X2ludDMyKEJUU05PT1BfTUFYX1BBQ0tFVFNfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9CVFNOT09QX1NJWkUpOwotICAgIGJ0c25vb3BfbmV0X29wZW4oKTsKLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZnV0dXJlX3QqIHNodXRfZG93bih2b2lkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJ0c25vb3BfbXV0ZXgpOwotCi0gIGlmIChpc19idHNub29wX2VuYWJsZWQpIHsKLSAgICBpZiAoaXNfYnRzbm9vcF9maWx0ZXJlZCkgewotICAgICAgZGVsZXRlX2J0c25vb3BfZmlsZXMoZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZWxldGVfYnRzbm9vcF9maWxlcyh0cnVlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZGVsZXRlX2J0c25vb3BfZmlsZXModHJ1ZSk7Ci0gICAgZGVsZXRlX2J0c25vb3BfZmlsZXMoZmFsc2UpOwotICB9Ci0KLSAgaWYgKGxvZ2ZpbGVfZmQgIT0gSU5WQUxJRF9GRCkgY2xvc2UobG9nZmlsZV9mZCk7Ci0gIGxvZ2ZpbGVfZmQgPSBJTlZBTElEX0ZEOwotCi0gIGlmIChpc19idHNub29wX2VuYWJsZWQpIGJ0c25vb3BfbmV0X2Nsb3NlKCk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUVYUE9SVF9TWU1CT0wgZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGJ0c25vb3BfbW9kdWxlID0gewotICAgIC5uYW1lID0gQlRTTk9PUF9NT0RVTEUsCi0gICAgLmluaXQgPSBOVUxMLAotICAgIC5zdGFydF91cCA9IHN0YXJ0X3VwLAotICAgIC5zaHV0X2Rvd24gPSBzaHV0X2Rvd24sCi0gICAgLmNsZWFuX3VwID0gTlVMTCwKLSAgICAuZGVwZW5kZW5jaWVzID0ge1NUQUNLX0NPTkZJR19NT0RVTEUsIE5VTEx9fTsKLQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9ucwotc3RhdGljIHZvaWQgY2FwdHVyZShjb25zdCBCVF9IRFIqIGJ1ZmZlciwgYm9vbCBpc19yZWNlaXZlZCkgewotICB1aW50OF90KiBwID0gY29uc3RfY2FzdDx1aW50OF90Kj4oYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5vZmZzZXQpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJ0c25vb3BfbXV0ZXgpOwotCi0gIHN0cnVjdCB0aW1lc3BlYyB0c19ub3cgPSB7fTsKLSAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzX25vdyk7Ci0gIHVpbnQ2NF90IHRpbWVzdGFtcF91cyA9Ci0gICAgICAoKHVpbnQ2NF90KXRzX25vdy50dl9zZWMgKiAxMDAwMDAwTCkgKyAoKHVpbnQ2NF90KXRzX25vdy50dl9uc2VjIC8gMTAwMCk7Ci0KLSAgYnRzbm9vcF9tZW1fY2FwdHVyZShidWZmZXIsIHRpbWVzdGFtcF91cyk7Ci0KLSAgaWYgKGxvZ2ZpbGVfZmQgPT0gSU5WQUxJRF9GRCkgcmV0dXJuOwotCi0gIHN3aXRjaCAoYnVmZmVyLT5ldmVudCAmIE1TR19FVlRfTUFTSykgewotICAgIGNhc2UgTVNHX0hDX1RPX1NUQUNLX0hDSV9FVlQ6Ci0gICAgICBidHNub29wX3dyaXRlX3BhY2tldChrRXZlbnRQYWNrZXQsIHAsIGZhbHNlLCB0aW1lc3RhbXBfdXMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNU0dfSENfVE9fU1RBQ0tfSENJX0FDTDoKLSAgICBjYXNlIE1TR19TVEFDS19UT19IQ19IQ0lfQUNMOgotICAgICAgYnRzbm9vcF93cml0ZV9wYWNrZXQoa0FjbFBhY2tldCwgcCwgaXNfcmVjZWl2ZWQsIHRpbWVzdGFtcF91cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1TR19IQ19UT19TVEFDS19IQ0lfU0NPOgotICAgIGNhc2UgTVNHX1NUQUNLX1RPX0hDX0hDSV9TQ086Ci0gICAgICBidHNub29wX3dyaXRlX3BhY2tldChrU2NvUGFja2V0LCBwLCBpc19yZWNlaXZlZCwgdGltZXN0YW1wX3VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVNHX1NUQUNLX1RPX0hDX0hDSV9DTUQ6Ci0gICAgICBidHNub29wX3dyaXRlX3BhY2tldChrQ29tbWFuZFBhY2tldCwgcCwgdHJ1ZSwgdGltZXN0YW1wX3VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTVNHX0hDX1RPX1NUQUNLX0hDSV9JU086Ci0gICAgY2FzZSBNU0dfU1RBQ0tfVE9fSENfSENJX0lTTzoKLSAgICAgIGJ0c25vb3Bfd3JpdGVfcGFja2V0KGtJc29QYWNrZXQsIHAsIGlzX3JlY2VpdmVkLCB0aW1lc3RhbXBfdXMpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYWxsb3dsaXN0X2wyY19jaGFubmVsKHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50MTZfdCBsb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVtb3RlX2NpZCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICI6IEFsbG93bGlzdGluZyBsMmNhcCBjaGFubmVsLiBjb25uX2hhbmRsZT0iIDw8IGNvbm5faGFuZGxlCi0gICAgICAgICAgICA8PCAiIGNpZD0iIDw8IGxvZ2hleChsb2NhbF9jaWQpIDw8ICI6IiA8PCBsb2doZXgocmVtb3RlX2NpZCk7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkIGxvY2soZmlsdGVyX2xpc3RfbXV0ZXgpOwotCi0gIC8vIFRoaXMgd2lsbCBjcmVhdGUgdGhlIGVudHJ5IGlmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgZmlsdGVyIHdpdGggdGhlCi0gIC8vIGNvbm5lY3Rpb24uCi0gIGZpbHRlcl9saXN0W2Nvbm5faGFuZGxlXS5hZGRMMmNDaWQobG9jYWxfY2lkLCByZW1vdGVfY2lkKTsKLX0KLQotc3RhdGljIHZvaWQgYWxsb3dsaXN0X3JmY19kbGNpKHVpbnQxNl90IGxvY2FsX2NpZCwgdWludDhfdCBkbGNpKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgPDwgIjogQWxsb3dsaXN0aW5nIHJmY29tbSBjaGFubmVsLiBMMkNBUCBDSUQ9IiA8PCBsb2doZXgobG9jYWxfY2lkKQotICAgICAgICAgICAgPDwgIiBETENJPSIgPDwgbG9naGV4KGRsY2kpOwotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZCBsb2NrKGZpbHRlcl9saXN0X211dGV4KTsKLQotICB0TDJDX0NDQiogcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChudWxscHRyLCBsb2NhbF9jaWQpOwotICBmaWx0ZXJfbGlzdFtwX2NjYi0+cF9sY2ItPkhhbmRsZSgpXS5hZGRSZmNEbGNpKGRsY2kpOwotfQotCi1zdGF0aWMgdm9pZCBhZGRfcmZjX2wyY19jaGFubmVsKHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50MTZfdCBsb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlbW90ZV9jaWQpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICA8PCAiOiByZmNvbW0gZGF0YSBnb2luZyBvdmVyIGwyY2FwIGNoYW5uZWwuIGNvbm5faGFuZGxlPSIKLSAgICAgICAgICAgIDw8IGNvbm5faGFuZGxlIDw8ICIgY2lkPSIgPDwgbG9naGV4KGxvY2FsX2NpZCkgPDwgIjoiCi0gICAgICAgICAgICA8PCBsb2doZXgocmVtb3RlX2NpZCk7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkIGxvY2soZmlsdGVyX2xpc3RfbXV0ZXgpOwotCi0gIGZpbHRlcl9saXN0W2Nvbm5faGFuZGxlXS5zZXRSZmNDaWQobG9jYWxfY2lkLCByZW1vdGVfY2lkKTsKLSAgbG9jYWxfY2lkX3RvX2FjbC5pbnNlcnQoe2xvY2FsX2NpZCwgY29ubl9oYW5kbGV9KTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYXJfbDJjYXBfYWxsb3dsaXN0KHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50MTZfdCBsb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVtb3RlX2NpZCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICI6IENsZWFyaW5nIGFjY2VwdGxpc3QgZnJvbSBsMmNhcCBjaGFubmVsLiBjb25uX2hhbmRsZT0iCi0gICAgICAgICAgICA8PCBjb25uX2hhbmRsZSA8PCAiIGNpZD0iIDw8IGxvY2FsX2NpZCA8PCAiOiIgPDwgcmVtb3RlX2NpZDsKLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZCBsb2NrKGZpbHRlcl9saXN0X211dGV4KTsKLSAgZmlsdGVyX2xpc3RbY29ubl9oYW5kbGVdLnJlbW92ZUwyY0NpZChsb2NhbF9jaWQsIHJlbW90ZV9jaWQpOwotfQotCi1zdGF0aWMgY29uc3QgYnRzbm9vcF90IGludGVyZmFjZSA9IHtjYXB0dXJlLCBhbGxvd2xpc3RfbDJjX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2xpc3RfcmZjX2RsY2ksIGFkZF9yZmNfbDJjX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9sMmNhcF9hbGxvd2xpc3R9OwotCi1jb25zdCBidHNub29wX3QqIGJ0c25vb3BfZ2V0X2ludGVyZmFjZSgpIHsgcmV0dXJuICZpbnRlcmZhY2U7IH0KLQotc3RhdGljIHZvaWQgZGVsZXRlX2J0c25vb3BfZmlsZXMoYm9vbCBmaWx0ZXJlZCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgIDw8ICI6IERlbGV0aW5nIHNub29wIGxvZ3MgaWYgdGhleSBleGlzdC4gZmlsdGVyZWQgPSAiIDw8IGZpbHRlcmVkOwotICBhdXRvIGxvZ19wYXRoID0gZ2V0X2J0c25vb3BfbG9nX3BhdGgoZmlsdGVyZWQpOwotICByZW1vdmUobG9nX3BhdGguY19zdHIoKSk7Ci0gIHJlbW92ZShnZXRfYnRzbm9vcF9sYXN0X2xvZ19wYXRoKGxvZ19wYXRoKS5jX3N0cigpKTsKLX0KLQotc3RkOjpzdHJpbmcgZ2V0X2J0c25vb3BfbG9nX3BhdGgoYm9vbCBmaWx0ZXJlZCkgewotICBjaGFyIGJ0c25vb3BfcGF0aFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICBvc2lfcHJvcGVydHlfZ2V0KEJUU05PT1BfUEFUSF9QUk9QRVJUWSwgYnRzbm9vcF9wYXRoLCBERUZBVUxUX0JUU05PT1BfUEFUSCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdChidHNub29wX3BhdGgpOwotICBpZiAoZmlsdGVyZWQpIHJlc3VsdCA9IHJlc3VsdC5hcHBlbmQoIi5maWx0ZXJlZCIpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIGdldF9idHNub29wX2xhc3RfbG9nX3BhdGgoc3RkOjpzdHJpbmcgYnRzbm9vcF9wYXRoKSB7Ci0gIHJldHVybiBidHNub29wX3BhdGguYXBwZW5kKCIubGFzdCIpOwotfQotCi1zdGF0aWMgdm9pZCBvcGVuX25leHRfc25vb3BfZmlsZSgpIHsKLSAgcGFja2V0X2NvdW50ZXIgPSAwOwotCi0gIGlmIChsb2dmaWxlX2ZkICE9IElOVkFMSURfRkQpIHsKLSAgICBjbG9zZShsb2dmaWxlX2ZkKTsKLSAgICBsb2dmaWxlX2ZkID0gSU5WQUxJRF9GRDsKLSAgfQotCi0gIGF1dG8gbG9nX3BhdGggPSBnZXRfYnRzbm9vcF9sb2dfcGF0aChpc19idHNub29wX2ZpbHRlcmVkKTsKLSAgYXV0byBsYXN0X2xvZ19wYXRoID0gZ2V0X2J0c25vb3BfbGFzdF9sb2dfcGF0aChsb2dfcGF0aCk7Ci0KLSAgaWYgKHJlbmFtZShsb2dfcGF0aC5jX3N0cigpLCBsYXN0X2xvZ19wYXRoLmNfc3RyKCkpICE9IDAgJiYgZXJybm8gIT0gRU5PRU5UKQotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIHJlbmFtZSAnIiA8PCBsb2dfcGF0aCA8PCAiJyB0byAnIgotICAgICAgICAgICAgICAgPDwgbGFzdF9sb2dfcGF0aCA8PCAiJyA6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotCi0gIG1vZGVfdCBwcmV2bWFzayA9IHVtYXNrKDApOwotICBsb2dmaWxlX2ZkID0gb3Blbihsb2dfcGF0aC5jX3N0cigpLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotICAgICAgICAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCk7Ci0gIHVtYXNrKHByZXZtYXNrKTsKLSAgaWYgKGxvZ2ZpbGVfZmQgPT0gSU5WQUxJRF9GRCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIG9wZW4gJyIgPDwgbG9nX3BhdGgKLSAgICAgICAgICAgICAgIDw8ICInIDogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgKHZvaWQpd3JpdGUobG9nZmlsZV9mZCwgImJ0c25vb3BcMFwwXDBcMFwxXDBcMFx4M1x4ZWEiLCAxNik7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgbGVuZ3RoX29yaWdpbmFsOwotICB1aW50MzJfdCBsZW5ndGhfY2FwdHVyZWQ7Ci0gIHVpbnQzMl90IGZsYWdzOwotICB1aW50MzJfdCBkcm9wcGVkX3BhY2tldHM7Ci0gIHVpbnQ2NF90IHRpbWVzdGFtcDsKLSAgdWludDhfdCB0eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgYnRzbm9vcF9oZWFkZXJfdDsKLQotc3RhdGljIHVpbnQ2NF90IGh0b25sbCh1aW50NjRfdCBsbCkgewotICBjb25zdCB1aW50MzJfdCBsID0gMTsKLSAgaWYgKCoocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJmwpKSA9PSAxKQotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oaHRvbmwobGwgJiAweGZmZmZmZmZmKSkgPDwgMzIgfAotICAgICAgICAgICBodG9ubChsbCA+PiAzMik7Ci0KLSAgcmV0dXJuIGxsOwotfQotCi1zdGF0aWMgYm9vbCBzaG91bGRfZmlsdGVyX2xvZyhib29sIGlzX3JlY2VpdmVkLCB1aW50OF90KiBwYWNrZXQpIHsKLSAgdWludDE2X3QgYWNsX2hhbmRsZSA9Ci0gICAgICBIQ0lEX0dFVF9IQU5ETEUoKCgodWludDE2X3QpcGFja2V0W0FDTF9DSEFOTkVMX09GRlNFVCArIDFdKSA8PCA4KSArCi0gICAgICAgICAgICAgICAgICAgICAgcGFja2V0W0FDTF9DSEFOTkVMX09GRlNFVF0pOwotCi0gIHN0ZDo6bG9ja19ndWFyZCBsb2NrKGZpbHRlcl9saXN0X211dGV4KTsKLSAgYXV0byYgZmlsdGVycyA9IGZpbHRlcl9saXN0W2FjbF9oYW5kbGVdOwotICB1aW50MTZfdCBsMmNfY2hhbm5lbCA9Ci0gICAgICAocGFja2V0W0wyQ19DSEFOTkVMX09GRlNFVCArIDFdIDw8IDgpICsgcGFja2V0W0wyQ19DSEFOTkVMX09GRlNFVF07Ci0gIGlmIChmaWx0ZXJzLmlzUmZjQ2hhbm5lbChpc19yZWNlaXZlZCwgbDJjX2NoYW5uZWwpKSB7Ci0gICAgdWludDhfdCByZmNfZXZlbnQgPSBwYWNrZXRbUkZDX0VWRU5UX09GRlNFVF0gJiAwYjExMTAxMTExOwotICAgIGlmIChyZmNfZXZlbnQgPT0gUkZDT01NX1NBQk1FIHx8IHJmY19ldmVudCA9PSBSRkNPTU1fVUEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50OF90IHJmY19kbGNpID0gcGFja2V0W1JGQ19DSEFOTkVMX09GRlNFVF0gPj4gMjsKLSAgICBpZiAoIWZpbHRlcnMuaXNBbGxvd2xpc3RlZERsY2kocmZjX2RsY2kpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoIWZpbHRlcnMuaXNBbGxvd2xpc3RlZEwyYyhpc19yZWNlaXZlZCwgbDJjX2NoYW5uZWwpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c25vb3Bfd3JpdGVfcGFja2V0KHBhY2tldF90eXBlX3QgdHlwZSwgdWludDhfdCogcGFja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZWNlaXZlZCwgdWludDY0X3QgdGltZXN0YW1wX3VzKSB7Ci0gIHVpbnQzMl90IGxlbmd0aF9oZSA9IDA7Ci0gIHVpbnQzMl90IGZsYWdzID0gMDsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIGtDb21tYW5kUGFja2V0OgotICAgICAgbGVuZ3RoX2hlID0gcGFja2V0WzJdICsgNDsKLSAgICAgIGZsYWdzID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0FjbFBhY2tldDoKLSAgICAgIGxlbmd0aF9oZSA9IChwYWNrZXRbM10gPDwgOCkgKyBwYWNrZXRbMl0gKyA1OwotICAgICAgZmxhZ3MgPSBpc19yZWNlaXZlZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1Njb1BhY2tldDoKLSAgICAgIGxlbmd0aF9oZSA9IHBhY2tldFsyXSArIDQ7Ci0gICAgICBmbGFncyA9IGlzX3JlY2VpdmVkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrRXZlbnRQYWNrZXQ6Ci0gICAgICBsZW5ndGhfaGUgPSBwYWNrZXRbMV0gKyAzOwotICAgICAgZmxhZ3MgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrSXNvUGFja2V0OgotICAgICAgbGVuZ3RoX2hlID0gKChwYWNrZXRbM10gJiAweDNmKSA8PCA4KSArIHBhY2tldFsyXSArIDU7Ci0gICAgICBmbGFncyA9IGlzX3JlY2VpdmVkOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBidHNub29wX2hlYWRlcl90IGhlYWRlcjsKLSAgaGVhZGVyLmxlbmd0aF9vcmlnaW5hbCA9IGh0b25sKGxlbmd0aF9oZSk7Ci0KLSAgYm9vbCByZWplY3RsaXN0ZWQgPSBmYWxzZTsKLSAgaWYgKGlzX2J0c25vb3BfZmlsdGVyZWQgJiYgdHlwZSA9PSBrQWNsUGFja2V0KSB7Ci0gICAgcmVqZWN0bGlzdGVkID0gc2hvdWxkX2ZpbHRlcl9sb2coaXNfcmVjZWl2ZWQsIHBhY2tldCk7Ci0gIH0KLQotICBoZWFkZXIubGVuZ3RoX2NhcHR1cmVkID0KLSAgICAgIHJlamVjdGxpc3RlZCA/IGh0b25sKEwyQ19IRUFERVJfU0laRSkgOiBoZWFkZXIubGVuZ3RoX29yaWdpbmFsOwotICBpZiAocmVqZWN0bGlzdGVkKSBsZW5ndGhfaGUgPSBMMkNfSEVBREVSX1NJWkU7Ci0gIGhlYWRlci5mbGFncyA9IGh0b25sKGZsYWdzKTsKLSAgaGVhZGVyLmRyb3BwZWRfcGFja2V0cyA9IDA7Ci0gIGhlYWRlci50aW1lc3RhbXAgPSBodG9ubGwodGltZXN0YW1wX3VzICsgQlRTTk9PUF9FUE9DSF9ERUxUQSk7Ci0gIGhlYWRlci50eXBlID0gdHlwZTsKLQotICBidHNub29wX25ldF93cml0ZSgmaGVhZGVyLCBzaXplb2YoYnRzbm9vcF9oZWFkZXJfdCkpOwotICBidHNub29wX25ldF93cml0ZShwYWNrZXQsIGxlbmd0aF9oZSAtIDEpOwotCi0gIGlmIChsb2dmaWxlX2ZkICE9IElOVkFMSURfRkQpIHsKLSAgICBwYWNrZXRfY291bnRlcisrOwotICAgIGlmIChwYWNrZXRfY291bnRlciA+IHBhY2tldHNfcGVyX2ZpbGUpIHsKLSAgICAgIG9wZW5fbmV4dF9zbm9vcF9maWxlKCk7Ci0gICAgfQotCi0gICAgaW92ZWMgaW92W10gPSB7eyZoZWFkZXIsIHNpemVvZihidHNub29wX2hlYWRlcl90KX0sCi0gICAgICAgICAgICAgICAgICAge3JlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHBhY2tldCksIGxlbmd0aF9oZSAtIDF9fTsKLSAgICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGV2KGxvZ2ZpbGVfZmQsIGlvdiwgMikpOwotICB9Ci19CmRpZmYgLS1naXQgYS9oY2kvc3JjL2J0c25vb3BfbWVtLmNjIGIvaGNpL3NyYy9idHNub29wX21lbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0YmVkNC4uMDAwMDAwMAotLS0gYS9oY2kvc3JjL2J0c25vb3BfbWVtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9idHNub29wX21lbS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotc3RhdGljIGJ0c25vb3BfZGF0YV9jYiBkYXRhX2NhbGxiYWNrID0gTlVMTDsKLXN0YXRpYyBhY3Rpdml0eV9hdHRyaWJ1dGlvbl9jYiBhdHRyaWJ1dGlvbl9jYWxsYmFjayA9IE5VTEw7Ci0KLXZvaWQgYnRzbm9vcF9tZW1fc2V0X2NhbGxiYWNrKGJ0c25vb3BfZGF0YV9jYiBjYikgeyBkYXRhX2NhbGxiYWNrID0gY2I7IH0KLQotdm9pZCBhY3Rpdml0eV9hdHRyaWJ1dGlvbl9zZXRfY2FsbGJhY2soYWN0aXZpdHlfYXR0cmlidXRpb25fY2IgY2IpIHsKLSAgYXR0cmlidXRpb25fY2FsbGJhY2sgPSBjYjsKLX0KLQotdm9pZCBidHNub29wX21lbV9jYXB0dXJlKGNvbnN0IEJUX0hEUiogcGFja2V0LCB1aW50NjRfdCB0aW1lc3RhbXBfdXMpIHsKLSAgaWYgKCFkYXRhX2NhbGxiYWNrICYmICFhdHRyaWJ1dGlvbl9jYWxsYmFjaykgcmV0dXJuOwotCi0gIENIRUNLKHBhY2tldCk7Ci0KLSAgY29uc3QgdWludDhfdCogZGF0YSA9ICZwYWNrZXQtPmRhdGFbcGFja2V0LT5vZmZzZXRdOwotICBjb25zdCB1aW50MTZfdCB0eXBlID0gcGFja2V0LT5ldmVudCAmIEJUX0VWVF9NQVNLOwotICBzaXplX3QgbGVuZ3RoID0gMDsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEJUX0VWVF9UT19MTV9IQ0lfQ01EOgotICAgICAgaWYgKHBhY2tldC0+bGVuID4gMikgbGVuZ3RoID0gZGF0YVsyXSArIDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0JUVV9IQ0lfRVZUOgotICAgICAgaWYgKHBhY2tldC0+bGVuID4gMSkgbGVuZ3RoID0gZGF0YVsxXSArIDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0xNX0hDSV9BQ0w6Ci0gICAgY2FzZSBCVF9FVlRfVE9fQlRVX0hDSV9BQ0w6Ci0gICAgICBpZiAocGFja2V0LT5sZW4gPiAzKSBsZW5ndGggPSAoZGF0YVsyXSB8IChkYXRhWzNdIDw8IDgpKSArIDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0xNX0hDSV9TQ086Ci0gICAgY2FzZSBCVF9FVlRfVE9fQlRVX0hDSV9TQ086Ci0gICAgICBpZiAocGFja2V0LT5sZW4gPiAyKSBsZW5ndGggPSBkYXRhWzJdICsgMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVF9FVlRfVE9fTE1fSENJX0lTTzoKLSAgICBjYXNlIEJUX0VWVF9UT19CVFVfSENJX0lTTzoKLSAgICAgIGlmIChwYWNrZXQtPmxlbiA+IDMpIGxlbmd0aCA9IChkYXRhWzJdIHwgKChkYXRhWzNdICYgMHgzZikgPDwgOCkpICsgNDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGxlbmd0aCAmJiBkYXRhX2NhbGxiYWNrKQotICAgICgqZGF0YV9jYWxsYmFjaykodHlwZSwgZGF0YSwgbGVuZ3RoLCB0aW1lc3RhbXBfdXMpOwotICBpZiAobGVuZ3RoICYmIGF0dHJpYnV0aW9uX2NhbGxiYWNrICYmCi0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6YnRhYV9oY2lfaXNfZW5hYmxlZCgpKSB7Ci0gICAgKCphdHRyaWJ1dGlvbl9jYWxsYmFjaykodHlwZSwgZGF0YSwgbGVuZ3RoLCB0aW1lc3RhbXBfdXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9oY2kvc3JjL2J0c25vb3BfbmV0LmNjIGIvaGNpL3NyYy9idHNub29wX25ldC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4OWU4Yy4uMDAwMDAwMAotLS0gYS9oY2kvc3JjL2J0c25vb3BfbmV0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTMgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9zbm9vcF9uZXQiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi1zdGF0aWMgdm9pZCBzYWZlX2Nsb3NlXyhpbnQqIGZkKTsKLXN0YXRpYyB2b2lkKiBsaXN0ZW5fZm5fKHZvaWQqIGNvbnRleHQpOwotCi1zdGF0aWMgY29uc3QgY2hhciogTElTVEVOX1RIUkVBRF9OQU1FXyA9ICJidHNub29wX25ldF9saXN0ZW4iOwotc3RhdGljIGNvbnN0IGludCBMT0NBTEhPU1RfID0gMHg3RjAwMDAwMTsKLXN0YXRpYyBjb25zdCBpbnQgTElTVEVOX1BPUlRfID0gODg3MjsKLQotc3RhdGljIHB0aHJlYWRfdCBsaXN0ZW5fdGhyZWFkXzsKLXN0YXRpYyBib29sIGxpc3Rlbl90aHJlYWRfdmFsaWRfID0gZmFsc2U7Ci1zdGF0aWMgc3RkOjptdXRleCBjbGllbnRfc29ja2V0X211dGV4XzsKLXN0YXRpYyBpbnQgbGlzdGVuX3NvY2tldF8gPSAtMTsKLXN0YXRpYyBpbnQgY2xpZW50X3NvY2tldF8gPSAtMTsKLQotdm9pZCBidHNub29wX25ldF9vcGVuKCkgewotI2lmIChCVF9ORVRfREVCVUcgIT0gdHJ1ZSkKLSAgcmV0dXJuOyAgLy8gRGlzYWJsZSB1c2luZyBuZXR3b3JrIHNvY2tldHMgZm9yIHNlY3VyaXR5IHJlYXNvbnMKLSNlbmRpZgotCi0gIGxpc3Rlbl90aHJlYWRfdmFsaWRfID0KLSAgICAgIChwdGhyZWFkX2NyZWF0ZSgmbGlzdGVuX3RocmVhZF8sIE5VTEwsIGxpc3Rlbl9mbl8sIE5VTEwpID09IDApOwotICBpZiAoIWxpc3Rlbl90aHJlYWRfdmFsaWRfKQotICAgIExPR19FUlJPUigiJXMgcHRocmVhZF9jcmVhdGUgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotfQotCi12b2lkIGJ0c25vb3BfbmV0X2Nsb3NlKCkgewotI2lmIChCVF9ORVRfREVCVUcgIT0gdHJ1ZSkKLSAgcmV0dXJuOyAgLy8gRGlzYWJsZSB1c2luZyBuZXR3b3JrIHNvY2tldHMgZm9yIHNlY3VyaXR5IHJlYXNvbnMKLSNlbmRpZgotCi0gIGlmIChsaXN0ZW5fdGhyZWFkX3ZhbGlkXykgewotICAgIHNodXRkb3duKGxpc3Rlbl9zb2NrZXRfLCBTSFVUX1JEV1IpOwotICAgIHB0aHJlYWRfam9pbihsaXN0ZW5fdGhyZWFkXywgTlVMTCk7Ci0gICAgc2FmZV9jbG9zZV8oJmNsaWVudF9zb2NrZXRfKTsKLSAgICBsaXN0ZW5fdGhyZWFkX3ZhbGlkXyA9IGZhbHNlOwotICB9Ci19Ci0KLXZvaWQgYnRzbm9vcF9uZXRfd3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotI2lmIChCVF9ORVRfREVCVUcgIT0gdHJ1ZSkKLSAgcmV0dXJuOyAgLy8gRGlzYWJsZSB1c2luZyBuZXR3b3JrIHNvY2tldHMgZm9yIHNlY3VyaXR5IHJlYXNvbnMKLSNlbmRpZgotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNsaWVudF9zb2NrZXRfbXV0ZXhfKTsKLSAgaWYgKGNsaWVudF9zb2NrZXRfICE9IC0xKSB7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgT1NJX05PX0lOVFIocmV0ID0gc2VuZChjbGllbnRfc29ja2V0XywgZGF0YSwgbGVuZ3RoLCAwKSk7Ci0KLSAgICBpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVDT05OUkVTRVQpIHsKLSAgICAgIHNhZmVfY2xvc2VfKCZjbGllbnRfc29ja2V0Xyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkKiBsaXN0ZW5fZm5fKFVOVVNFRF9BVFRSIHZvaWQqIGNvbnRleHQpIHsKLSAgaW50IGVuYWJsZSA9IDE7Ci0KLSAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKUxJU1RFTl9USFJFQURfTkFNRV8sIDAsIDAsIDApOwotCi0gIGxpc3Rlbl9zb2NrZXRfID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7Ci0gIGlmIChsaXN0ZW5fc29ja2V0XyA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgc29ja2V0IGNyZWF0aW9uIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGNsZWFudXA7Ci0gIH0KLQotICBpZiAoc2V0c29ja29wdChsaXN0ZW5fc29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmZW5hYmxlLAotICAgICAgICAgICAgICAgICBzaXplb2YoZW5hYmxlKSkgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gY2xlYW51cDsKLSAgfQotCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKExPQ0FMSE9TVF8pOwotICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMoTElTVEVOX1BPUlRfKTsKLSAgaWYgKGJpbmQobGlzdGVuX3NvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYmluZCBsaXN0ZW4gc29ja2V0OiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gY2xlYW51cDsKLSAgfQotCi0gIGlmIChsaXN0ZW4obGlzdGVuX3NvY2tldF8sIDEwKSA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGxpc3RlbjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGNsZWFudXA7Ci0gIH0KLQotICBmb3IgKDs7KSB7Ci0gICAgaW50IGNsaWVudF9zb2NrZXQ7Ci0gICAgT1NJX05PX0lOVFIoY2xpZW50X3NvY2tldCA9IGFjY2VwdChsaXN0ZW5fc29ja2V0XywgTlVMTCwgTlVMTCkpOwotICAgIGlmIChjbGllbnRfc29ja2V0ID09IC0xKSB7Ci0gICAgICBpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVCQURGKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgTE9HX1dBUk4oIiVzIGVycm9yIGFjY2VwdGluZyBzb2NrZXQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBXaGVuIGEgbmV3IGNsaWVudCBjb25uZWN0cywgd2UgaGF2ZSB0byBzZW5kIHRoZSBidHNub29wIGZpbGUgaGVhZGVyLiBUaGlzCi0gICAgICogYWxsb3dzIGEgZGVjb2RlciB0byB0cmVhdCB0aGUgc2Vzc2lvbiBhcyBhIG5ldywgdmFsaWQgYnRzbm9vcCBmaWxlLiAqLwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNsaWVudF9zb2NrZXRfbXV0ZXhfKTsKLSAgICBzYWZlX2Nsb3NlXygmY2xpZW50X3NvY2tldF8pOwotICAgIGNsaWVudF9zb2NrZXRfID0gY2xpZW50X3NvY2tldDsKLQotICAgIE9TSV9OT19JTlRSKHNlbmQoY2xpZW50X3NvY2tldF8sICJidHNub29wXDBcMFwwXDBcMVwwXDBceDNceGVhIiwgMTYsIDApKTsKLSAgfQotCi1jbGVhbnVwOgotICBzYWZlX2Nsb3NlXygmbGlzdGVuX3NvY2tldF8pOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgc2FmZV9jbG9zZV8oaW50KiBmZCkgewotICBDSEVDSyhmZCAhPSBOVUxMKTsKLSAgaWYgKCpmZCAhPSAtMSkgewotICAgIGNsb3NlKCpmZCk7Ci0gICAgKmZkID0gLTE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2hjaS9zcmMvYnVmZmVyX2FsbG9jYXRvci5jYyBiL2hjaS9zcmMvYnVmZmVyX2FsbG9jYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwOWVlYy4uMDAwMDAwMAotLS0gYS9oY2kvc3JjL2J1ZmZlcl9hbGxvY2F0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9idWZmZXJfYWxsb2NhdG9yLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0KLXN0YXRpYyB2b2lkKiBidWZmZXJfYWxsb2Moc2l6ZV90IHNpemUpIHsKLSAgQ0hFQ0soc2l6ZSA8PSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFKTsKLSAgcmV0dXJuIG9zaV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBhbGxvY2F0b3JfdCBpbnRlcmZhY2UgPSB7YnVmZmVyX2FsbG9jLCBvc2lfZnJlZX07Ci0KLWNvbnN0IGFsbG9jYXRvcl90KiBidWZmZXJfYWxsb2NhdG9yX2dldF9pbnRlcmZhY2UoKSB7IHJldHVybiAmaW50ZXJmYWNlOyB9CmRpZmYgLS1naXQgYS9oY2kvc3JjL2hjaV9pbmplY3QuY2MgYi9oY2kvc3JjL2hjaV9pbmplY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3NyYy9oY2lfaW5qZWN0LmNjCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2hjaS9zcmMvaGNpX2xheWVyLmNjIGIvaGNpL3NyYy9oY2lfbGF5ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3NyYy9oY2lfbGF5ZXIuY2MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvaGNpL3NyYy9oY2lfbGF5ZXJfYW5kcm9pZC5jYyBiL2hjaS9zcmMvaGNpX2xheWVyX2FuZHJvaWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3NyYy9oY2lfbGF5ZXJfYW5kcm9pZC5jYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9oY2kvc3JjL2hjaV9sYXllcl9saW51eC5jYyBiL2hjaS9zcmMvaGNpX2xheWVyX2xpbnV4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2hjaS9zcmMvaGNpX2xheWVyX2xpbnV4LmNjCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2hjaS9zcmMvaGNpX3BhY2tldF9mYWN0b3J5LmNjIGIvaGNpL3NyYy9oY2lfcGFja2V0X2ZhY3RvcnkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3NyYy9oY2lfcGFja2V0X2ZhY3RvcnkuY2MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvaGNpL3NyYy9oY2lfcGFja2V0X3BhcnNlci5jYyBiL2hjaS9zcmMvaGNpX3BhY2tldF9wYXJzZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3NyYy9oY2lfcGFja2V0X3BhcnNlci5jYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9oY2kvc3JjL3BhY2tldF9mcmFnbWVudGVyLmNjIGIvaGNpL3NyYy9wYWNrZXRfZnJhZ21lbnRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmNDMyNy4uMDAwMDAwMAotLS0gYS9oY2kvc3JjL3BhY2tldF9mcmFnbWVudGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9oY2lfcGFja2V0X2ZyYWdtZW50ZXIiCi0KLSNpbmNsdWRlICJwYWNrZXRfZnJhZ21lbnRlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvYnVmZmVyX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8vIDIgYnl0ZXMgZm9yIGhhbmRsZSwgMiBieXRlcyBmb3IgZGF0YSBsZW5ndGggKFZvbHVtZSAyLCBQYXJ0IEUsIDUuNC4yKQotI2RlZmluZSBIQ0lfQUNMX1BSRUFNQkxFX1NJWkUgNAotCi0jZGVmaW5lIEhDSV9JU09fQkZfRklSU1RfRlJBR01FTlRFRF9QQUNLRVQgKDApCi0jZGVmaW5lIEhDSV9JU09fQkZfQ09OVElOVUFUSU9OX0ZSQUdNRU5UX1BBQ0tFVCAoMSkKLSNkZWZpbmUgSENJX0lTT19CRl9DT01QTEVURV9QQUNLRVQgKDIpCi0jZGVmaW5lIEhDSV9JU09fQkZfTEFTVF9GUkFHTUVOVF9QQUNLRVQgKDMpCi0KLSNkZWZpbmUgSENJX0lTT19IRUFERVJfVElNRVNUQU1QX1NJWkUgKDQpCi0jZGVmaW5lIEhDSV9JU09fSEVBREVSX0lTT19MRU5fU0laRSAoMikKLSNkZWZpbmUgSENJX0lTT19IRUFERVJfUEFDS0VUX1NFUV9TSVpFICgyKQotCi0vLyBJU08KLS8vIDIgYnl0ZXMgZm9yIGhhbmRsZSwgMiBieXRlcyBmb3IgZGF0YSBsZW5ndGggKFZvbHVtZSAyLCBQYXJ0IEUsIDUuNC41KQotI2RlZmluZSBIQ0lfSVNPX1BSRUFNQkxFX1NJWkUgNAotCi0jZGVmaW5lIEhDSV9JU09fSEVBREVSX0xFTl9XSVRIT1VUX1RTIFwKLSAgKEhDSV9JU09fSEVBREVSX0lTT19MRU5fU0laRSArIEhDSV9JU09fSEVBREVSX1BBQ0tFVF9TRVFfU0laRSkKLSNkZWZpbmUgSENJX0lTT19IRUFERVJfTEVOX1dJVEhfVFMgXAotICAoSENJX0lTT19IRUFERVJfTEVOX1dJVEhPVVRfVFMgKyBIQ0lfSVNPX0hFQURFUl9USU1FU1RBTVBfU0laRSkKLQotI2RlZmluZSBIQ0lfSVNPX1NFVF9DT05USU5VQVRJT05fRkxBRyhoYW5kbGUpIFwKLSAgKCgoaGFuZGxlKSYweDRGRkYpIHwgKDB4MDAwMSA8PCAxMikpCi0jZGVmaW5lIEhDSV9JU09fU0VUX0NPTVBMRVRFX0ZMQUcoaGFuZGxlKSAoKChoYW5kbGUpJjB4NEZGRikgfCAoMHgwMDAyIDw8IDEyKSkKLSNkZWZpbmUgSENJX0lTT19TRVRfRU5EX0ZSQUdfRkxBRyhoYW5kbGUpICgoKGhhbmRsZSkmMHg0RkZGKSB8ICgweDAwMDMgPDwgMTIpKQotI2RlZmluZSBIQ0lfSVNPX1NFVF9USU1FU1RBTVBfRkxBRyhoYW5kbGUpICgoKGhhbmRsZSkmMHgzRkZGKSB8ICgweDAwMDEgPDwgMTQpKQotCi0jZGVmaW5lIEhDSV9JU09fR0VUX1RTX0ZMQUcoaGFuZGxlKSAoKChoYW5kbGUpID4+IDE0KSAmIDB4MDAwMSkKLSNkZWZpbmUgSENJX0lTT19HRVRfUEFDS0VUX1NUQVRVU19GTEFHUyhpc29fc2R1X2xlbmd0aCkgXAotICAoaXNvX3NkdV9sZW5ndGggJiAweEMwMDApCi0jZGVmaW5lIEhDSV9JU09fU0RVX0xFTkdUSF9NQVNLIDB4MEZGRgotCi0jZGVmaW5lIEFQUExZX0NPTlRJTlVBVElPTl9GTEFHKGhhbmRsZSkgKCgoaGFuZGxlKSYweENGRkYpIHwgMHgxMDAwKQotI2RlZmluZSBBUFBMWV9TVEFSVF9GTEFHKGhhbmRsZSkgKCgoaGFuZGxlKSYweENGRkYpIHwgMHgyMDAwKQotI2RlZmluZSBTVUJfRVZFTlQoZXZlbnQpICgoZXZlbnQpJk1TR19TVUJfRVZUX01BU0spCi0jZGVmaW5lIEdFVF9CT1VOREFSWV9GTEFHKGhhbmRsZSkgKCgoaGFuZGxlKSA+PiAxMikgJiAweDAwMDMpCi0jZGVmaW5lIEdFVF9CUk9BRENBU1RfRkxBRyhoYW5kbGUpICgoKGhhbmRsZSkgPj4gMTQpICYgMHgwMDAzKQotCi0jZGVmaW5lIEhBTkRMRV9NQVNLIDB4MEZGRgotI2RlZmluZSBTVEFSVF9QQUNLRVRfQk9VTkRBUlkgMgotI2RlZmluZSBQT0lOVF9UT19QT0lOVCAwCi0jZGVmaW5lIEwyQ0FQX0hFQURFUl9QRFVfTEVOX1NJWkUgMgotI2RlZmluZSBMMkNBUF9IRUFERVJfQ0lEX1NJWkUgMgotI2RlZmluZSBMMkNBUF9IRUFERVJfU0laRSAoTDJDQVBfSEVBREVSX1BEVV9MRU5fU0laRSArIEwyQ0FQX0hFQURFUl9DSURfU0laRSkKLQotLy8gT3VyIGludGVyZmFjZSBhbmQgY2FsbGJhY2tzCi0KLXN0YXRpYyBjb25zdCBhbGxvY2F0b3JfdCogYnVmZmVyX2FsbG9jYXRvcjsKLXN0YXRpYyBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXI7Ci1zdGF0aWMgY29uc3QgcGFja2V0X2ZyYWdtZW50ZXJfY2FsbGJhY2tzX3QqIGNhbGxiYWNrczsKLQotc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCAvKiBoYW5kbGUgKi8sIEJUX0hEUio+IHBhcnRpYWxfcGFja2V0czsKLXN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QgLyogaGFuZGxlICovLCBCVF9IRFIqPiBwYXJ0aWFsX2lzb19wYWNrZXRzOwotCi1zdGF0aWMgdm9pZCBpbml0KGNvbnN0IHBhY2tldF9mcmFnbWVudGVyX2NhbGxiYWNrc190KiByZXN1bHRfY2FsbGJhY2tzKSB7Ci0gIGNhbGxiYWNrcyA9IHJlc3VsdF9jYWxsYmFja3M7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFudXAoKSB7Ci0gIHBhcnRpYWxfcGFja2V0cy5jbGVhcigpOwotICBwYXJ0aWFsX2lzb19wYWNrZXRzLmNsZWFyKCk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrX3VpbnQxNl9vdmVyZmxvdyh1aW50MTZfdCBhLCB1aW50MTZfdCBiKSB7Ci0gIHJldHVybiAoVUlOVDE2X01BWCAtIGEpIDwgYjsKLX0KLQotc3RhdGljIHZvaWQgZnJhZ21lbnRfYW5kX2Rpc3BhdGNoX2FjbChCVF9IRFIqIHBhY2tldCk7Ci1zdGF0aWMgdm9pZCBmcmFnbWVudF9hbmRfZGlzcGF0Y2hfaXNvKEJUX0hEUiogcGFja2V0KTsKLQotc3RhdGljIHZvaWQgZnJhZ21lbnRfYW5kX2Rpc3BhdGNoKEJUX0hEUiogcGFja2V0KSB7Ci0gIENIRUNLKHBhY2tldCAhPSBOVUxMKTsKLQotICB1aW50MTZfdCBldmVudCA9IHBhY2tldC0+ZXZlbnQgJiBNU0dfRVZUX01BU0s7Ci0KLSAgaWYgKGV2ZW50ID09IE1TR19TVEFDS19UT19IQ19IQ0lfQUNMKSB7Ci0gICAgZnJhZ21lbnRfYW5kX2Rpc3BhdGNoX2FjbChwYWNrZXQpOwotICB9IGVsc2UgaWYgKGV2ZW50ID09IE1TR19IQ19UT19TVEFDS19IQ0lfU0NPKSB7Ci0gICAgY2FsbGJhY2tzLT5mcmFnbWVudGVkKHBhY2tldCwgdHJ1ZSk7Ci0gIH0gZWxzZSBpZiAoZXZlbnQgPT0gTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08pIHsKLSAgICBmcmFnbWVudF9hbmRfZGlzcGF0Y2hfaXNvKHBhY2tldCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2FsbGJhY2tzLT5mcmFnbWVudGVkKHBhY2tldCwgdHJ1ZSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZnJhZ21lbnRfYW5kX2Rpc3BhdGNoX2FjbChCVF9IRFIqIHBhY2tldCkgewotICB1aW50MTZfdCBtYXhfZGF0YV9zaXplID0KLSAgICAgIFNVQl9FVkVOVChwYWNrZXQtPmV2ZW50KSA9PSBMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRAotICAgICAgICAgID8gY29udHJvbGxlci0+Z2V0X2FjbF9kYXRhX3NpemVfY2xhc3NpYygpCi0gICAgICAgICAgOiBjb250cm9sbGVyLT5nZXRfYWNsX2RhdGFfc2l6ZV9ibGUoKTsKLQotICB1aW50MTZfdCBtYXhfcGFja2V0X3NpemUgPSBtYXhfZGF0YV9zaXplICsgSENJX0FDTF9QUkVBTUJMRV9TSVpFOwotICB1aW50MTZfdCByZW1haW5pbmdfbGVuZ3RoID0gcGFja2V0LT5sZW47Ci0KLSAgdWludDhfdCogc3RyZWFtID0gcGFja2V0LT5kYXRhICsgcGFja2V0LT5vZmZzZXQ7Ci0KLSAgdWludDE2X3QgY29udGludWF0aW9uX2hhbmRsZTsKLSAgU1RSRUFNX1RPX1VJTlQxNihjb250aW51YXRpb25faGFuZGxlLCBzdHJlYW0pOwotICBjb250aW51YXRpb25faGFuZGxlID0gQVBQTFlfQ09OVElOVUFUSU9OX0ZMQUcoY29udGludWF0aW9uX2hhbmRsZSk7Ci0KLSAgd2hpbGUgKHJlbWFpbmluZ19sZW5ndGggPiBtYXhfcGFja2V0X3NpemUpIHsKLSAgICAvLyBNYWtlIHN1cmUgd2UgdXNlIHRoZSByaWdodCBBQ0wgcGFja2V0IHNpemUKLSAgICBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgICBTVFJFQU1fU0tJUF9VSU5UMTYoc3RyZWFtKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHN0cmVhbSwgbWF4X2RhdGFfc2l6ZSk7Ci0KLSAgICBwYWNrZXQtPmxlbiA9IG1heF9wYWNrZXRfc2l6ZTsKLSAgICBjYWxsYmFja3MtPmZyYWdtZW50ZWQocGFja2V0LCBmYWxzZSk7Ci0KLSAgICBwYWNrZXQtPm9mZnNldCArPSBtYXhfZGF0YV9zaXplOwotICAgIHJlbWFpbmluZ19sZW5ndGggLT0gbWF4X2RhdGFfc2l6ZTsKLSAgICBwYWNrZXQtPmxlbiA9IHJlbWFpbmluZ19sZW5ndGg7Ci0KLSAgICAvLyBXcml0ZSB0aGUgQUNMIGhlYWRlciBmb3IgdGhlIG5leHQgZnJhZ21lbnQKLSAgICBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHN0cmVhbSwgY29udGludWF0aW9uX2hhbmRsZSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShzdHJlYW0sIHJlbWFpbmluZ19sZW5ndGggLSBIQ0lfQUNMX1BSRUFNQkxFX1NJWkUpOwotCi0gICAgLy8gQXBwYXJlbnRseSBMMkNBUCBjYW4gc2V0IGxheWVyX3NwZWNpZmljIHRvIGEgbWF4IG51bWJlciBvZiBzZWdtZW50cyB0bwotICAgIC8vIHRyYW5zbWl0Ci0gICAgaWYgKHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMpIHsKLSAgICAgIHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMtLTsKLQotICAgICAgaWYgKHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgPT0gMCkgewotICAgICAgICBwYWNrZXQtPmV2ZW50ID0gQlRfRVZUX1RPX0JUVV9MMkNfU0VHX1hNSVQ7Ci0gICAgICAgIGNhbGxiYWNrcy0+dHJhbnNtaXRfZmluaXNoZWQocGFja2V0LCBmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjYWxsYmFja3MtPmZyYWdtZW50ZWQocGFja2V0LCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgZnJhZ21lbnRfYW5kX2Rpc3BhdGNoX2lzbyhCVF9IRFIqIHBhY2tldCkgewotICB1aW50OF90KiBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgdWludDE2X3QgbWF4X2RhdGFfc2l6ZSA9IGNvbnRyb2xsZXItPmdldF9pc29fZGF0YV9zaXplKCk7Ci0gIHVpbnQxNl90IG1heF9wYWNrZXRfc2l6ZSA9IG1heF9kYXRhX3NpemUgKyBIQ0lfSVNPX1BSRUFNQkxFX1NJWkU7Ci0gIHVpbnQxNl90IHJlbWFpbmluZ19sZW5ndGggPSBwYWNrZXQtPmxlbjsKLQotICB1aW50MTZfdCBoYW5kbGU7Ci0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBzdHJlYW0pOwotCi0gIGlmIChwYWNrZXQtPmxheWVyX3NwZWNpZmljICYgQlRfSVNPX0hEUl9DT05UQUlOU19UUykgewotICAgIC8vIEZpcnN0IHBhY2tldCBtaWdodCBoYXZlIHRpbWVzdGFtcAotICAgIGhhbmRsZSA9IEhDSV9JU09fU0VUX1RJTUVTVEFNUF9GTEFHKGhhbmRsZSk7Ci0gIH0KLQotICBpZiAocmVtYWluaW5nX2xlbmd0aCA8PSBtYXhfcGFja2V0X3NpemUpIHsKLSAgICBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHN0cmVhbSwgSENJX0lTT19TRVRfQ09NUExFVEVfRkxBRyhoYW5kbGUpKTsKLSAgfSBlbHNlIHsKLSAgICB3aGlsZSAocmVtYWluaW5nX2xlbmd0aCA+IG1heF9wYWNrZXRfc2l6ZSkgewotICAgICAgLy8gTWFrZSBzdXJlIHdlIHVzZSB0aGUgcmlnaHQgSVNPIHBhY2tldCBzaXplCi0gICAgICBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgICAgIFNUUkVBTV9TS0lQX1VJTlQxNihzdHJlYW0pOwotICAgICAgVUlOVDE2X1RPX1NUUkVBTShzdHJlYW0sIG1heF9kYXRhX3NpemUpOwotCi0gICAgICBwYWNrZXQtPmxlbiA9IG1heF9wYWNrZXRfc2l6ZTsKLSAgICAgIGNhbGxiYWNrcy0+ZnJhZ21lbnRlZChwYWNrZXQsIGZhbHNlKTsKLQotICAgICAgcGFja2V0LT5vZmZzZXQgKz0gbWF4X2RhdGFfc2l6ZTsKLSAgICAgIHJlbWFpbmluZ19sZW5ndGggLT0gbWF4X2RhdGFfc2l6ZTsKLSAgICAgIHBhY2tldC0+bGVuID0gcmVtYWluaW5nX2xlbmd0aDsKLQotICAgICAgLy8gV3JpdGUgdGhlIElTTyBoZWFkZXIgZm9yIHRoZSBuZXh0IGZyYWdtZW50Ci0gICAgICBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgICAgIGlmIChyZW1haW5pbmdfbGVuZ3RoID4gbWF4X3BhY2tldF9zaXplKSB7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0oc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhDSV9JU09fU0VUX0NPTlRJTlVBVElPTl9GTEFHKGhhbmRsZSAmIEhBTkRMRV9NQVNLKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfSVNPX1NFVF9FTkRfRlJBR19GTEFHKGhhbmRsZSAmIEhBTkRMRV9NQVNLKSk7Ci0gICAgICB9Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHN0cmVhbSwgcmVtYWluaW5nX2xlbmd0aCAtIEhDSV9JU09fUFJFQU1CTEVfU0laRSk7Ci0gICAgfQotICB9Ci0gIGNhbGxiYWNrcy0+ZnJhZ21lbnRlZChwYWNrZXQsIHRydWUpOwotfQotCi1zdGF0aWMgdm9pZCByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaF9pc28oVU5VU0VEX0FUVFIgQlRfSERSKiBwYWNrZXQpIHsKLSAgdWludDhfdCogc3RyZWFtID0gcGFja2V0LT5kYXRhOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQxNl90IGlzb19sZW5ndGg7Ci0gIHVpbnQ4X3QgaXNvX2hkcl9sZW4gPSBIQ0lfSVNPX0hFQURFUl9MRU5fV0lUSE9VVF9UUzsKLSAgQlRfSERSKiBwYXJ0aWFsX3BhY2tldDsKLSAgdWludDE2X3QgaXNvX2Z1bGxfbGVuOwotCi0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBzdHJlYW0pOwotICBTVFJFQU1fVE9fVUlOVDE2KGlzb19sZW5ndGgsIHN0cmVhbSk7Ci0gIC8vIGxhc3QgMiBiaXRzIGlzIFJGVQotICBpc29fbGVuZ3RoID0gaXNvX2xlbmd0aCAmIDB4M0ZGRjsKLQotICBDSEVDSyhpc29fbGVuZ3RoID09IHBhY2tldC0+bGVuIC0gSENJX0lTT19QUkVBTUJMRV9TSVpFKTsKLQotICB1aW50OF90IGJvdW5kYXJ5X2ZsYWcgPSBHRVRfQk9VTkRBUllfRkxBRyhoYW5kbGUpOwotICB1aW50OF90IHRzX2ZsYWcgPSBIQ0lfSVNPX0dFVF9UU19GTEFHKGhhbmRsZSk7Ci0gIGhhbmRsZSA9IGhhbmRsZSAmIEhBTkRMRV9NQVNLOwotCi0gIGF1dG8gbWFwX2l0ZXIgPSBwYXJ0aWFsX2lzb19wYWNrZXRzLmZpbmQoaGFuZGxlKTsKLQotICBzd2l0Y2ggKGJvdW5kYXJ5X2ZsYWcpIHsKLSAgICBjYXNlIEhDSV9JU09fQkZfQ09NUExFVEVfUEFDS0VUOgotICAgIGNhc2UgSENJX0lTT19CRl9GSVJTVF9GUkFHTUVOVEVEX1BBQ0tFVDoKLSAgICAgIHVpbnQxNl90IGlzb19zZHVfbGVuZ3RoOwotICAgICAgdWludDhfdCBwYWNrZXRfc3RhdHVzX2ZsYWdzOwotCi0gICAgICBpZiAobWFwX2l0ZXIgIT0gcGFydGlhbF9pc29fcGFja2V0cy5lbmQoKSkgewotICAgICAgICBMT0dfV0FSTigKLSAgICAgICAgICAgICIlcyBmb3VuZCB1bmZpbmlzaGVkIHBhY2tldCBmb3IgdGhlIGlzbyBoYW5kbGUgd2l0aCBzdGFydCBwYWNrZXQuICIKLSAgICAgICAgICAgICJEcm9wcGluZyBvbGQuIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgQlRfSERSKiBoZGwgPSBtYXBfaXRlci0+c2Vjb25kOwotICAgICAgICBwYXJ0aWFsX2lzb19wYWNrZXRzLmVyYXNlKG1hcF9pdGVyKTsKLSAgICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShoZGwpOwotICAgICAgfQotCi0gICAgICBpZiAodHNfZmxhZykgewotICAgICAgICAvKiBTa2lwIHRpbWVzdGFtcCB1MzIgKi8KLSAgICAgICAgU1RSRUFNX1NLSVBfVUlOVDMyKHN0cmVhbSk7Ci0gICAgICAgIHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgfD0gQlRfSVNPX0hEUl9DT05UQUlOU19UUzsKLSAgICAgICAgaXNvX2hkcl9sZW4gPSBIQ0lfSVNPX0hFQURFUl9MRU5fV0lUSF9UUzsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzb19sZW5ndGggPCBpc29faGRyX2xlbikgewotICAgICAgICBMT0dfV0FSTigiJXMgSVNPIHBhY2tldCB0b28gc21hbGwgKCVkIDwgJWQpLiBEcm9wcGluZyBpdC4iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgcGFja2V0LT5sZW4sIGlzb19oZHJfbGVuKTsKLSAgICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNraXAgcGFja2V0X3NlcS4gKi8KLSAgICAgIFNUUkVBTV9TS0lQX1VJTlQxNihzdHJlYW0pOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihpc29fc2R1X2xlbmd0aCwgc3RyZWFtKTsKLQotICAgICAgLyogU2lsZW50bHkgaWdub3JlIGVtcHR5IHJlcG9ydCBpZiB0aGVyZSdzIG5vICdsb3N0IGRhdGEnIGZsYWcgc2V0LiAqLwotICAgICAgaWYgKGlzb19zZHVfbGVuZ3RoID09IDApIHsKLSAgICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBhY2tldF9zdGF0dXNfZmxhZ3MgPSBIQ0lfSVNPX0dFVF9QQUNLRVRfU1RBVFVTX0ZMQUdTKGlzb19zZHVfbGVuZ3RoKTsKLSAgICAgIGlzb19zZHVfbGVuZ3RoID0gaXNvX3NkdV9sZW5ndGggJiBIQ0lfSVNPX1NEVV9MRU5HVEhfTUFTSzsKLQotICAgICAgaWYgKHBhY2tldF9zdGF0dXNfZmxhZ3MpCi0gICAgICAgIExPR19FUlJPUigiJXMgcGFja2V0IHN0YXR1cyBmbGFnczogMHglMDJ4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwYWNrZXRfc3RhdHVzX2ZsYWdzKTsKLQotICAgICAgaXNvX2Z1bGxfbGVuID0gaXNvX3NkdV9sZW5ndGggKyBpc29faGRyX2xlbiArIEhDSV9JU09fUFJFQU1CTEVfU0laRTsKLSAgICAgIGlmICgoaXNvX2Z1bGxfbGVuICsgc2l6ZW9mKEJUX0hEUikpID4gQlRfREVGQVVMVF9CVUZGRVJfU0laRSkgewotICAgICAgICBMT0dfRVJST1IoIiVzIERyb3BwaW5nIElTTyBwYWNrZXQgd2l0aCBpbnZhbGlkIGxlbmd0aCAoJWQpLiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgaXNvX3NkdV9sZW5ndGgpOwotICAgICAgICBidWZmZXJfYWxsb2NhdG9yLT5mcmVlKHBhY2tldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKCgoYm91bmRhcnlfZmxhZyA9PSBIQ0lfSVNPX0JGX0NPTVBMRVRFX1BBQ0tFVCkgJiYKLSAgICAgICAgICAgKGlzb19mdWxsX2xlbiAhPSBwYWNrZXQtPmxlbikpIHx8Ci0gICAgICAgICAgKChib3VuZGFyeV9mbGFnID09IEhDSV9JU09fQkZfRklSU1RfRlJBR01FTlRFRF9QQUNLRVQpICYmCi0gICAgICAgICAgIChpc29fZnVsbF9sZW4gPD0gcGFja2V0LT5sZW4pKSkgewotICAgICAgICBMT0dfRVJST1IoIiVzIGNvcnJ1cHRlZCBJU08gZnJhbWUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcGFydGlhbF9wYWNrZXQgPQotICAgICAgICAgIChCVF9IRFIqKWJ1ZmZlcl9hbGxvY2F0b3ItPmFsbG9jKGlzb19mdWxsX2xlbiArIHNpemVvZihCVF9IRFIpKTsKLSAgICAgIGlmICghcGFydGlhbF9wYWNrZXQpIHsKLSAgICAgICAgTE9HX0VSUk9SKCIlcyBjYW5ub3QgYWxsb2NhdGUgcGFydGlhbCBwYWNrZXQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFja2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwYXJ0aWFsX3BhY2tldC0+ZXZlbnQgPSBwYWNrZXQtPmV2ZW50OwotICAgICAgcGFydGlhbF9wYWNrZXQtPmxlbiA9IGlzb19mdWxsX2xlbjsKLSAgICAgIHBhcnRpYWxfcGFja2V0LT5sYXllcl9zcGVjaWZpYyA9IHBhY2tldC0+bGF5ZXJfc3BlY2lmaWM7Ci0KLSAgICAgIG1lbWNweShwYXJ0aWFsX3BhY2tldC0+ZGF0YSwgcGFja2V0LT5kYXRhLCBwYWNrZXQtPmxlbik7Ci0KLSAgICAgIC8vIFVwZGF0ZSB0aGUgSVNPIGRhdGEgc2l6ZSB0byBpbmRpY2F0ZSB0aGUgZnVsbCBleHBlY3RlZCBsZW5ndGgKLSAgICAgIHN0cmVhbSA9IHBhcnRpYWxfcGFja2V0LT5kYXRhOwotICAgICAgU1RSRUFNX1NLSVBfVUlOVDE2KHN0cmVhbSk7ICAvLyBza2lwIHRoZSBJU08gaGFuZGxlCi0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHN0cmVhbSwgaXNvX2Z1bGxfbGVuIC0gSENJX0lTT19QUkVBTUJMRV9TSVpFKTsKLQotICAgICAgaWYgKGJvdW5kYXJ5X2ZsYWcgPT0gSENJX0lTT19CRl9GSVJTVF9GUkFHTUVOVEVEX1BBQ0tFVCkgewotICAgICAgICBwYXJ0aWFsX3BhY2tldC0+b2Zmc2V0ID0gcGFja2V0LT5sZW47Ci0gICAgICAgIHBhcnRpYWxfaXNvX3BhY2tldHNbaGFuZGxlXSA9IHBhcnRpYWxfcGFja2V0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFja2V0LT5sYXllcl9zcGVjaWZpYyB8PSBCVF9JU09fSERSX09GRlNFVF9QT0lOVFNfREFUQTsKLSAgICAgICAgcGFydGlhbF9wYWNrZXQtPm9mZnNldCA9IGlzb19oZHJfbGVuICsgSENJX0lTT19QUkVBTUJMRV9TSVpFOwotICAgICAgICBjYWxsYmFja3MtPnJlYXNzZW1ibGVkKHBhcnRpYWxfcGFja2V0KTsKLSAgICAgIH0KLQotICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhDSV9JU09fQkZfQ09OVElOVUFUSU9OX0ZSQUdNRU5UX1BBQ0tFVDoKLSAgICAgIC8vIHBhc3MtdGhyb3VnaAotICAgIGNhc2UgSENJX0lTT19CRl9MQVNUX0ZSQUdNRU5UX1BBQ0tFVDoKLSAgICAgIGlmIChtYXBfaXRlciA9PSBwYXJ0aWFsX2lzb19wYWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIExPR19XQVJOKCIlcyBnb3QgY29udGludWF0aW9uIGZvciB1bmtub3duIHBhY2tldC4gRHJvcHBpbmcgaXQuIiwKLSAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBidWZmZXJfYWxsb2NhdG9yLT5mcmVlKHBhY2tldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcGFydGlhbF9wYWNrZXQgPSBtYXBfaXRlci0+c2Vjb25kOwotICAgICAgaWYgKHBhcnRpYWxfcGFja2V0LT5sZW4gPAotICAgICAgICAgIChwYXJ0aWFsX3BhY2tldC0+b2Zmc2V0ICsgcGFja2V0LT5sZW4gLSBIQ0lfSVNPX1BSRUFNQkxFX1NJWkUpKSB7Ci0gICAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAgICIlcyBnb3QgcGFja2V0IHdoaWNoIHdvdWxkIGV4Y2VlZCBleHBlY3RlZCBsZW5ndGggb2YgJWQuICIKLSAgICAgICAgICAgICJkcm9wcGluZyBmdWxsIHBhY2tldCIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgcGFydGlhbF9wYWNrZXQtPmxlbik7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFja2V0KTsKLSAgICAgICAgcGFydGlhbF9pc29fcGFja2V0cy5lcmFzZShtYXBfaXRlcik7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFydGlhbF9wYWNrZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIG1lbWNweShwYXJ0aWFsX3BhY2tldC0+ZGF0YSArIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQsCi0gICAgICAgICAgICAgcGFja2V0LT5kYXRhICsgSENJX0lTT19QUkVBTUJMRV9TSVpFLAotICAgICAgICAgICAgIHBhY2tldC0+bGVuIC0gSENJX0lTT19QUkVBTUJMRV9TSVpFKTsKLQotICAgICAgaWYgKGJvdW5kYXJ5X2ZsYWcgPT0gSENJX0lTT19CRl9DT05USU5VQVRJT05fRlJBR01FTlRfUEFDS0VUKSB7Ci0gICAgICAgIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQgKz0gcGFja2V0LT5sZW4gLSBIQ0lfSVNPX1BSRUFNQkxFX1NJWkU7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFja2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGFydGlhbF9wYWNrZXQtPmxlbiAhPQotICAgICAgICAgIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQgKyBwYWNrZXQtPmxlbiAtIEhDSV9JU09fUFJFQU1CTEVfU0laRSkgewotICAgICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgICAiJXMgZ290IGxhc3QgZnJhZ21lbnQsIGJ1dCBpdCBkb2Vzbid0IGZpbGwgdXAgdGhlIHdob2xlIHBhY2tldCBvZiAiCi0gICAgICAgICAgICAic2l6ZSAlZCIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgcGFydGlhbF9wYWNrZXQtPmxlbik7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFja2V0KTsKLSAgICAgICAgcGFydGlhbF9pc29fcGFja2V0cy5lcmFzZShtYXBfaXRlcik7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFydGlhbF9wYWNrZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBhcnRpYWxfcGFja2V0LT5sYXllcl9zcGVjaWZpYyB8PSBCVF9JU09fSERSX09GRlNFVF9QT0lOVFNfREFUQTsKLSAgICAgIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQgPSBIQ0lfSVNPX1BSRUFNQkxFX1NJWkU7Ci0gICAgICBpZiAocGFydGlhbF9wYWNrZXQtPmxheWVyX3NwZWNpZmljICYgQlRfSVNPX0hEUl9DT05UQUlOU19UUykKLSAgICAgICAgcGFydGlhbF9wYWNrZXQtPm9mZnNldCArPSBIQ0lfSVNPX0hFQURFUl9MRU5fV0lUSF9UUzsKLSAgICAgIGVsc2UKLSAgICAgICAgcGFydGlhbF9wYWNrZXQtPm9mZnNldCArPSBIQ0lfSVNPX0hFQURFUl9MRU5fV0lUSE9VVF9UUzsKLQotICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotCi0gICAgICBwYXJ0aWFsX2lzb19wYWNrZXRzLmVyYXNlKG1hcF9pdGVyKTsKLSAgICAgIGNhbGxiYWNrcy0+cmVhc3NlbWJsZWQocGFydGlhbF9wYWNrZXQpOwotCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCIlcyBVbmV4cGVjdGVkIHBhY2tldCwgZHJvcHBpbmcgZnVsbCBwYWNrZXQiLCBfX2Z1bmNfXyk7Ci0gICAgICBidWZmZXJfYWxsb2NhdG9yLT5mcmVlKHBhY2tldCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChCVF9IRFIqIHBhY2tldCkgewotICBpZiAoKHBhY2tldC0+ZXZlbnQgJiBNU0dfRVZUX01BU0spID09IE1TR19IQ19UT19TVEFDS19IQ0lfQUNMKSB7Ci0gICAgdWludDhfdCogc3RyZWFtID0gcGFja2V0LT5kYXRhOwotICAgIHVpbnQxNl90IGhhbmRsZTsKLSAgICB1aW50MTZfdCBhY2xfbGVuZ3RoOwotCi0gICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHN0cmVhbSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihhY2xfbGVuZ3RoLCBzdHJlYW0pOwotCi0gICAgQ0hFQ0soYWNsX2xlbmd0aCA9PSBwYWNrZXQtPmxlbiAtIEhDSV9BQ0xfUFJFQU1CTEVfU0laRSk7Ci0KLSAgICB1aW50OF90IGJvdW5kYXJ5X2ZsYWcgPSBHRVRfQk9VTkRBUllfRkxBRyhoYW5kbGUpOwotICAgIHVpbnQ4X3QgYnJvYWRjYXN0X2ZsYWcgPSBHRVRfQlJPQURDQVNUX0ZMQUcoaGFuZGxlKTsKLSAgICBoYW5kbGUgPSBoYW5kbGUgJiBIQU5ETEVfTUFTSzsKLQotICAgIGlmIChicm9hZGNhc3RfZmxhZyAhPSBQT0lOVF9UT19QT0lOVCkgewotICAgICAgTE9HX1dBUk4oImRyb3BwaW5nIGJyb2FkY2FzdCBwYWNrZXQiKTsKLSAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTY5MzI3NTY3Iik7Ci0gICAgICBidWZmZXJfYWxsb2NhdG9yLT5mcmVlKHBhY2tldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJvdW5kYXJ5X2ZsYWcgPT0gU1RBUlRfUEFDS0VUX0JPVU5EQVJZKSB7Ci0gICAgICBpZiAoYWNsX2xlbmd0aCA8IDIpIHsKLSAgICAgICAgTE9HX1dBUk4oIiVzIGludmFsaWQgYWNsX2xlbmd0aCAlZCIsIF9fZnVuY19fLCBhY2xfbGVuZ3RoKTsKLSAgICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB1aW50MTZfdCBsMmNhcF9sZW5ndGg7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGwyY2FwX2xlbmd0aCwgc3RyZWFtKTsKLSAgICAgIGF1dG8gbWFwX2l0ZXIgPSBwYXJ0aWFsX3BhY2tldHMuZmluZChoYW5kbGUpOwotICAgICAgaWYgKG1hcF9pdGVyICE9IHBhcnRpYWxfcGFja2V0cy5lbmQoKSkgewotICAgICAgICBMT0dfV0FSTigKLSAgICAgICAgICAgICIlcyBmb3VuZCB1bmZpbmlzaGVkIHBhY2tldCBmb3IgaGFuZGxlIHdpdGggc3RhcnQgcGFja2V0LiAiCi0gICAgICAgICAgICAiRHJvcHBpbmcgb2xkLiIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0KLSAgICAgICAgQlRfSERSKiBoZGwgPSBtYXBfaXRlci0+c2Vjb25kOwotICAgICAgICBwYXJ0aWFsX3BhY2tldHMuZXJhc2UobWFwX2l0ZXIpOwotICAgICAgICBidWZmZXJfYWxsb2NhdG9yLT5mcmVlKGhkbCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhY2xfbGVuZ3RoIDwgTDJDQVBfSEVBREVSX1BEVV9MRU5fU0laRSkgewotICAgICAgICBMT0dfV0FSTigiJXMgTDJDQVAgcGFja2V0IHRvbyBzbWFsbCAoJWQgPCAlZCkuIERyb3BwaW5nIGl0LiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICBwYWNrZXQtPmxlbiwgTDJDQVBfSEVBREVSX1BEVV9MRU5fU0laRSk7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFja2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB1aW50MTZfdCBmdWxsX2xlbmd0aCA9Ci0gICAgICAgICAgbDJjYXBfbGVuZ3RoICsgTDJDQVBfSEVBREVSX1NJWkUgKyBIQ0lfQUNMX1BSRUFNQkxFX1NJWkU7Ci0KLSAgICAgIC8vIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cgYW5kIHRoYXQgdGhlIGZ1bGwgcGFja2V0IHNpemUgKyBCVF9IRFIgc2l6ZQotICAgICAgLy8gaXMgbGVzcyB0aGFuIHRoZSBtYXggYnVmZmVyIHNpemUKLSAgICAgIGlmIChjaGVja191aW50MTZfb3ZlcmZsb3cobDJjYXBfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTDJDQVBfSEVBREVSX1NJWkUgKyBIQ0lfQUNMX1BSRUFNQkxFX1NJWkUpKSB8fAotICAgICAgICAgICgoZnVsbF9sZW5ndGggKyBzaXplb2YoQlRfSERSKSkgPiBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFKSkgewotICAgICAgICBMT0dfRVJST1IoIiVzIERyb3BwaW5nIEwyQ0FQIHBhY2tldCB3aXRoIGludmFsaWQgbGVuZ3RoICglZCkuIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsMmNhcF9sZW5ndGgpOwotICAgICAgICBidWZmZXJfYWxsb2NhdG9yLT5mcmVlKHBhY2tldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKGZ1bGxfbGVuZ3RoIDw9IHBhY2tldC0+bGVuKSB7Ci0gICAgICAgIGlmIChmdWxsX2xlbmd0aCA8IHBhY2tldC0+bGVuKQotICAgICAgICAgIExPR19XQVJOKCIlcyBmb3VuZCBsMmNhcCBmdWxsIGxlbmd0aCAlZCBsZXNzIHRoYW4gdGhlIGhjaSBsZW5ndGggJWQuIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbDJjYXBfbGVuZ3RoLCBwYWNrZXQtPmxlbik7Ci0KLSAgICAgICAgY2FsbGJhY2tzLT5yZWFzc2VtYmxlZChwYWNrZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIEJUX0hEUiogcGFydGlhbF9wYWNrZXQgPQotICAgICAgICAgIChCVF9IRFIqKWJ1ZmZlcl9hbGxvY2F0b3ItPmFsbG9jKGZ1bGxfbGVuZ3RoICsgc2l6ZW9mKEJUX0hEUikpOwotICAgICAgcGFydGlhbF9wYWNrZXQtPmV2ZW50ID0gcGFja2V0LT5ldmVudDsKLSAgICAgIHBhcnRpYWxfcGFja2V0LT5sZW4gPSBmdWxsX2xlbmd0aDsKLSAgICAgIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQgPSBwYWNrZXQtPmxlbjsKLQotICAgICAgbWVtY3B5KHBhcnRpYWxfcGFja2V0LT5kYXRhLCBwYWNrZXQtPmRhdGEsIHBhY2tldC0+bGVuKTsKLQotICAgICAgLy8gVXBkYXRlIHRoZSBBQ0wgZGF0YSBzaXplIHRvIGluZGljYXRlIHRoZSBmdWxsIGV4cGVjdGVkIGxlbmd0aAotICAgICAgc3RyZWFtID0gcGFydGlhbF9wYWNrZXQtPmRhdGE7Ci0gICAgICBTVFJFQU1fU0tJUF9VSU5UMTYoc3RyZWFtKTsgIC8vIHNraXAgdGhlIGhhbmRsZQotICAgICAgVUlOVDE2X1RPX1NUUkVBTShzdHJlYW0sIGZ1bGxfbGVuZ3RoIC0gSENJX0FDTF9QUkVBTUJMRV9TSVpFKTsKLQotICAgICAgcGFydGlhbF9wYWNrZXRzW2hhbmRsZV0gPSBwYXJ0aWFsX3BhY2tldDsKLQotICAgICAgLy8gRnJlZSB0aGUgb2xkIHBhY2tldCBidWZmZXIsIHNpbmNlIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZQotICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhdXRvIG1hcF9pdGVyID0gcGFydGlhbF9wYWNrZXRzLmZpbmQoaGFuZGxlKTsKLSAgICAgIGlmIChtYXBfaXRlciA9PSBwYXJ0aWFsX3BhY2tldHMuZW5kKCkpIHsKLSAgICAgICAgTE9HX1dBUk4oIiVzIGdvdCBjb250aW51YXRpb24gZm9yIHVua25vd24gcGFja2V0LiBEcm9wcGluZyBpdC4iLAotICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ1ZmZlcl9hbGxvY2F0b3ItPmZyZWUocGFja2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgQlRfSERSKiBwYXJ0aWFsX3BhY2tldCA9IG1hcF9pdGVyLT5zZWNvbmQ7Ci0KLSAgICAgIHBhY2tldC0+b2Zmc2V0ID0gSENJX0FDTF9QUkVBTUJMRV9TSVpFOwotICAgICAgdWludDE2X3QgcHJvamVjdGVkX29mZnNldCA9Ci0gICAgICAgICAgcGFydGlhbF9wYWNrZXQtPm9mZnNldCArIChwYWNrZXQtPmxlbiAtIEhDSV9BQ0xfUFJFQU1CTEVfU0laRSk7Ci0gICAgICBpZiAoKHBhY2tldC0+bGVuIC0gcGFja2V0LT5vZmZzZXQpID4KLSAgICAgICAgICAocGFydGlhbF9wYWNrZXQtPmxlbiAtIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQpKSB7Ci0gICAgICAgIExPR19XQVJOKAotICAgICAgICAgICAgIiVzIGdvdCBwYWNrZXQgd2hpY2ggd291bGQgZXhjZWVkIGV4cGVjdGVkIGxlbmd0aCBvZiAlZC4gIgotICAgICAgICAgICAgIlRydW5jYXRpbmcuIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwYXJ0aWFsX3BhY2tldC0+bGVuKTsKLSAgICAgICAgcGFja2V0LT5sZW4gPSAocGFydGlhbF9wYWNrZXQtPmxlbiAtIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQpICsgcGFja2V0LT5vZmZzZXQ7Ci0gICAgICAgIHByb2plY3RlZF9vZmZzZXQgPSBwYXJ0aWFsX3BhY2tldC0+bGVuOwotICAgICAgfQotCi0gICAgICBtZW1jcHkocGFydGlhbF9wYWNrZXQtPmRhdGEgKyBwYXJ0aWFsX3BhY2tldC0+b2Zmc2V0LAotICAgICAgICAgICAgIHBhY2tldC0+ZGF0YSArIHBhY2tldC0+b2Zmc2V0LCBwYWNrZXQtPmxlbiAtIHBhY2tldC0+b2Zmc2V0KTsKLQotICAgICAgLy8gRnJlZSB0aGUgb2xkIHBhY2tldCBidWZmZXIsIHNpbmNlIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZQotICAgICAgYnVmZmVyX2FsbG9jYXRvci0+ZnJlZShwYWNrZXQpOwotICAgICAgcGFydGlhbF9wYWNrZXQtPm9mZnNldCA9IHByb2plY3RlZF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChwYXJ0aWFsX3BhY2tldC0+b2Zmc2V0ID09IHBhcnRpYWxfcGFja2V0LT5sZW4pIHsKLSAgICAgICAgcGFydGlhbF9wYWNrZXRzLmVyYXNlKGhhbmRsZSk7Ci0gICAgICAgIHBhcnRpYWxfcGFja2V0LT5vZmZzZXQgPSAwOwotICAgICAgICBjYWxsYmFja3MtPnJlYXNzZW1ibGVkKHBhcnRpYWxfcGFja2V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoKHBhY2tldC0+ZXZlbnQgJiBNU0dfRVZUX01BU0spID09IE1TR19IQ19UT19TVEFDS19IQ0lfU0NPKSB7Ci0gICAgY2FsbGJhY2tzLT5yZWFzc2VtYmxlZChwYWNrZXQpOwotICB9IGVsc2UgaWYgKChwYWNrZXQtPmV2ZW50ICYgTVNHX0VWVF9NQVNLKSA9PSBNU0dfSENfVE9fU1RBQ0tfSENJX0lTTykgewotICAgIHJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoX2lzbyhwYWNrZXQpOwotICB9IGVsc2UgewotICAgIGNhbGxiYWNrcy0+cmVhc3NlbWJsZWQocGFja2V0KTsKLSAgfQotfQotCi1zdGF0aWMgY29uc3QgcGFja2V0X2ZyYWdtZW50ZXJfdCBpbnRlcmZhY2UgPSB7aW5pdCwgY2xlYW51cCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50X2FuZF9kaXNwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaH07Ci0KLWNvbnN0IHBhY2tldF9mcmFnbWVudGVyX3QqIHBhY2tldF9mcmFnbWVudGVyX2dldF9pbnRlcmZhY2UoKSB7Ci0gIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLSAgYnVmZmVyX2FsbG9jYXRvciA9IGJ1ZmZlcl9hbGxvY2F0b3JfZ2V0X2ludGVyZmFjZSgpOwotICByZXR1cm4gJmludGVyZmFjZTsKLX0KLQotY29uc3QgcGFja2V0X2ZyYWdtZW50ZXJfdCogcGFja2V0X2ZyYWdtZW50ZXJfZ2V0X3Rlc3RfaW50ZXJmYWNlKAotICAgIGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcl9pbnRlcmZhY2UsCi0gICAgY29uc3QgYWxsb2NhdG9yX3QqIGJ1ZmZlcl9hbGxvY2F0b3JfaW50ZXJmYWNlKSB7Ci0gIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2ludGVyZmFjZTsKLSAgYnVmZmVyX2FsbG9jYXRvciA9IGJ1ZmZlcl9hbGxvY2F0b3JfaW50ZXJmYWNlOwotICByZXR1cm4gJmludGVyZmFjZTsKLX0KZGlmZiAtLWdpdCBhL2hjaS90ZXN0L2hjaV9sYXllcl90ZXN0LmNjIGIvaGNpL3Rlc3QvaGNpX2xheWVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3Rlc3QvaGNpX2xheWVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvaGNpL3Rlc3Qvb3RoZXJfc3RhY2tfc3R1Yi5jYyBiL2hjaS90ZXN0L290aGVyX3N0YWNrX3N0dWIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaGNpL3Rlc3Qvb3RoZXJfc3RhY2tfc3R1Yi5jYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9oY2kvdGVzdC9wYWNrZXRfZnJhZ21lbnRlcl9ob3N0X3Rlc3QuY2MgYi9oY2kvdGVzdC9wYWNrZXRfZnJhZ21lbnRlcl9ob3N0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGU3OTkuLjAwMDAwMDAKLS0tIGEvaGNpL3Rlc3QvcGFja2V0X2ZyYWdtZW50ZXJfaG9zdF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImhjaS9zcmMvcGFja2V0X2ZyYWdtZW50ZXIuY2MiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL3Rlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotZXh0ZXJuIHZvaWQgYWxsb2NhdGlvbl90cmFja2VyX3VuaW5pdCh2b2lkKTsKLQotZW51bSBrUGFja2V0T3JkZXIgewotICBrU3RhcnQgPSAxLAotICBrQ29udGludWF0aW9uID0gMiwKLX07Ci0KLXN0cnVjdCBBY2xQYWNrZXRIZWFkZXIgewotICBzdHJ1Y3QgewotICAgIHVpbnQxNl90IGhhbmRsZSA6IDEyOwotICAgIHVpbnQxNl90IGNvbnRpbnVhdGlvbiA6IDE7Ci0gICAgdWludDE2X3Qgc3RhcnQgOiAxOwotICAgIHVpbnQxNl90IHJlc2VydmVkIDogMjsKLSAgfSBzOwotICB1aW50MTZfdCBsZW5ndGg7Ci0KLSAgdWludDE2X3QgR2V0UmF3SGFuZGxlKCkgY29uc3QgeyByZXR1cm4gKih1aW50MTZfdCopKHRoaXMpOyB9Ci0KLSAgdWludDE2X3QgR2V0SGFuZGxlKCkgY29uc3QgeyByZXR1cm4gcy5oYW5kbGU7IH0KLSAgdWludDE2X3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoOyB9Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgTDJjYXBQYWNrZXRIZWFkZXIgewotICB1aW50MTZfdCBsZW5ndGg7Ci0gIHVpbnQxNl90IGNpZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBY2xMMmNhcFBhY2tldEhlYWRlciB7Ci0gIHN0cnVjdCBBY2xQYWNrZXRIZWFkZXIgYWNsX2hlYWRlcjsKLSAgc3RydWN0IEwyY2FwUGFja2V0SGVhZGVyIGwyY2FwX2hlYWRlcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrSGFuZGxlID0gMHgxMjM7Ci1jb25zdGV4cHIgdWludDE2X3Qga0NpZCA9IDB4NDU2NzsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTWF4UGFja2V0U2l6ZSA9IEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUgLSBzaXplb2YoQlRfSERSKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9IRUFERVJfU0laRSAtIEhDSV9BQ0xfUFJFQU1CTEVfU0laRTsKLWNvbnN0ZXhwciBzaXplX3Qga1R5cGljYWxQYWNrZXRTaXplc1tdID0gewotICAgIDEsIDIsIDMsIDQsIDgsIDE2LCAzMiwgNjQsIDEyNywgMTI4LCAxMjksIDI1NiwgMTAyNCwgMjA0OCwga01heFBhY2tldFNpemV9OwotY29uc3RleHByIHNpemVfdCBrTnVtYmVyT2ZUeXBpY2FsUGFja2V0U2l6ZXMgPQotICAgIHNpemVvZihrVHlwaWNhbFBhY2tldFNpemVzKSAvIHNpemVvZihrVHlwaWNhbFBhY2tldFNpemVzWzBdKTsKLQotdm9pZCBGcmVlQnVmZmVyKEJUX0hEUiogYnRfaGRyKSB7IG9zaV9mcmVlKGJ0X2hkcik7IH0KLQotc3RydWN0IFRlc3RNdXRhYmxlcyB7Ci0gIHN0cnVjdCB7Ci0gICAgaW50IGFjY2Vzc19jb3VudF97MH07Ci0gIH0gZnJhZ21lbnRlZDsKLSAgc3RydWN0IHsKLSAgICBpbnQgYWNjZXNzX2NvdW50X3swfTsKLSAgICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxCVF9IRFIsIGRlY2x0eXBlKCZGcmVlQnVmZmVyKT4+IHF1ZXVlOwotICB9IHJlYXNzZW1ibGVkOwotICBzdHJ1Y3QgewotICAgIGludCBhY2Nlc3NfY291bnRfezB9OwotICB9IHRyYW5zbWl0X2ZpbmlzaGVkOwotfTsKLQotVGVzdE11dGFibGVzIHRlc3Rfc3RhdGVfOwotCi12b2lkIE9uRnJhZ21lbnRlZChCVF9IRFIqIHBhY2tldCwgYm9vbCBzZW5kX3RyYW5zbWl0X2ZpbmlzaGVkKSB7Ci0gIHRlc3Rfc3RhdGVfLmZyYWdtZW50ZWQuYWNjZXNzX2NvdW50XysrOwotfQotCi12b2lkIE9uUmVhc3NlbWJsZWQoQlRfSERSKiBwYWNrZXQpIHsKLSAgdGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQuYWNjZXNzX2NvdW50XysrOwotICB0ZXN0X3N0YXRlXy5yZWFzc2VtYmxlZC5xdWV1ZS5wdXNoKAotICAgICAgc3RkOjp1bmlxdWVfcHRyPEJUX0hEUiwgZGVjbHR5cGUoJkZyZWVCdWZmZXIpPihwYWNrZXQsICZGcmVlQnVmZmVyKSk7Ci19Ci0KLXZvaWQgT25UcmFuc21pdEZpbmlzaGVkKEJUX0hEUiogcGFja2V0LCBib29sIGFsbF9mcmFnbWVudHNfc2VudCkgewotICB0ZXN0X3N0YXRlXy50cmFuc21pdF9maW5pc2hlZC5hY2Nlc3NfY291bnRfKys7Ci19Ci0KLXBhY2tldF9mcmFnbWVudGVyX2NhbGxiYWNrc190IHJlc3VsdF9jYWxsYmFja3MgPSB7Ci0gICAgLmZyYWdtZW50ZWQgPSBPbkZyYWdtZW50ZWQsCi0gICAgLnJlYXNzZW1ibGVkID0gT25SZWFzc2VtYmxlZCwKLSAgICAudHJhbnNtaXRfZmluaXNoZWQgPSBPblRyYW5zbWl0RmluaXNoZWQsCi19OwotCi1BY2xQYWNrZXRIZWFkZXIqIEFjbEhlYWRlcihCVF9IRFIqIHBhY2tldCkgewotICByZXR1cm4gKEFjbFBhY2tldEhlYWRlciopcGFja2V0LT5kYXRhOwotfQotTDJjYXBQYWNrZXRIZWFkZXIqIEwyY2FwSGVhZGVyKEJUX0hEUiogcGFja2V0KSB7Ci0gIHJldHVybiAmKChBY2xMMmNhcFBhY2tldEhlYWRlciopcGFja2V0LT5kYXRhKS0+bDJjYXBfaGVhZGVyOwotfQotCi11aW50OF90KiBEYXRhKEJUX0hEUiogcGFja2V0KSB7Ci0gIEFjbFBhY2tldEhlYWRlciogYWNsX2hlYWRlciA9Ci0gICAgICByZWludGVycHJldF9jYXN0PEFjbFBhY2tldEhlYWRlcio+KHBhY2tldC0+ZGF0YSk7Ci0gIHJldHVybiBhY2xfaGVhZGVyLT5zLnN0YXJ0Ci0gICAgICAgICAgICAgPyAodWludDhfdCopKHBhY2tldC0+ZGF0YSArIHNpemVvZihBY2xMMmNhcFBhY2tldEhlYWRlcikpCi0gICAgICAgICAgICAgOiAodWludDhfdCopKHBhY2tldC0+ZGF0YSArIHNpemVvZihBY2xQYWNrZXRIZWFkZXIpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIE5lZWRlZCBmb3IgbGlua2FnZQotY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKSB7IHJldHVybiBudWxscHRyOyB9Ci0KLS8qKgotICogVGVzdCBjbGFzcyB0byB0ZXN0IHNlbGVjdGVkIGZ1bmN0aW9uYWxpdHkgaW4gaGNpL3NyYy9oY2lfbGF5ZXIuY2MKLSAqLwotY2xhc3MgSGNpUGFja2V0RnJhZ21lbnRlclRlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgQWxsb2NhdGlvblRlc3RIYXJuZXNzOjpTZXRVcCgpOwotICAgIC8vIERpc2FibGUgb3VyIGFsbG9jYXRpb24gdHJhY2tlciB0byBhbGxvdyBBU0FOIGZ1bGwgcmFuZ2UKLSAgICBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KCk7Ci0gICAgcGFja2V0X2ZyYWdtZW50ZXJfID0gcGFja2V0X2ZyYWdtZW50ZXJfZ2V0X2ludGVyZmFjZSgpOwotICAgIHBhY2tldF9mcmFnbWVudGVyXy0+aW5pdCgmcmVzdWx0X2NhbGxiYWNrcyk7Ci0gICAgdGVzdF9zdGF0ZV8gPSBUZXN0TXV0YWJsZXMoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgRmx1c2hQYXJ0aWFsUGFja2V0cygpOwotICAgIHdoaWxlICghdGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQucXVldWUuZW1wdHkoKSkgewotICAgICAgdGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQucXVldWUucG9wKCk7Ci0gICAgfQotICAgIHBhY2tldF9mcmFnbWVudGVyXy0+Y2xlYW51cCgpOwotICAgIEFsbG9jYXRpb25UZXN0SGFybmVzczo6VGVhckRvd24oKTsKLSAgfQotICBjb25zdCBwYWNrZXRfZnJhZ21lbnRlcl90KiBwYWNrZXRfZnJhZ21lbnRlcl87Ci0KLSAgLy8gU3RhcnQgYWNsIHBhY2tldAotICBCVF9IRFIqIEFsbG9jYXRlTDJjYXBQYWNrZXQoc2l6ZV90IGwyY2FwX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIGNvbnN0IHsKLSAgICBhdXRvIHBhY2tldCA9Ci0gICAgICAgIEFsbG9jYXRlQWNsUGFja2V0KGRhdGEuc2l6ZSgpICsgc2l6ZW9mKEwyY2FwUGFja2V0SGVhZGVyKSwga1N0YXJ0KTsKLSAgICBMMmNhcEhlYWRlcihwYWNrZXQpLT5sZW5ndGggPSBsMmNhcF9sZW5ndGg7Ci0gICAgTDJjYXBIZWFkZXIocGFja2V0KS0+Y2lkID0ga0NpZDsKLSAgICBzdGQ6OmNvcHkoZGF0YS5jYmVnaW4oKSwgZGF0YS5jZW5kKCksIERhdGEocGFja2V0KSk7Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIC8vIENvbnRpbnVhdGlvbiBhY2wgcGFja2V0Ci0gIEJUX0hEUiogQWxsb2NhdGVMMmNhcFBhY2tldChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSBjb25zdCB7Ci0gICAgYXV0byBwYWNrZXQgPSBBbGxvY2F0ZUFjbFBhY2tldChkYXRhLnNpemUoKSwga0NvbnRpbnVhdGlvbik7Ci0gICAgc3RkOjpjb3B5KGRhdGEuY2JlZ2luKCksIGRhdGEuY2VuZCgpLCBEYXRhKHBhY2tldCkpOwotICAgIHJldHVybiBwYWNrZXQ7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVEYXRhKHNpemVfdCBzaXplKSBjb25zdCB7Ci0gICAgQ0hFQ0soc2l6ZSA+IDApOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYoc2l6ZSk7Ci0gICAgdWludDhfdCBzdW0gPSAwOwotICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgc2l6ZTsgcysrKSB7Ci0gICAgICBzdW0gKz0gdltzXSA9IHM7Ci0gICAgfQotICAgIHZbMF0gPSAofnN1bSArIDEpOyAgLy8gRmlyc3QgYnl0ZSBoYXMgc3VtIGNvbXBsZW1lbnQKLSAgICByZXR1cm4gdjsKLSAgfQotCi0gIC8vIFZlcmlmeSBwYWNrZXQgaW50ZWdyaXR5Ci0gIGJvb2wgVmVyaWZ5RGF0YShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgY29uc3QgewotICAgIENIRUNLKHNpemUgPiAwKTsKLSAgICB1aW50OF90IHN1bSA9IDA7Ci0gICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCBzaXplOyBzKyspIHsKLSAgICAgIHN1bSArPSBkYXRhW3NdOwotICAgIH0KLSAgICByZXR1cm4gc3VtID09IDA7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEJUX0hEUiogQWxsb2NhdGVBY2xQYWNrZXQoc2l6ZV90IGFjbF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga1BhY2tldE9yZGVyIHBhY2tldF9vcmRlcikgY29uc3QgewotICAgIEJUX0hEUiogcGFja2V0ID0gQWxsb2NhdGVQYWNrZXQoc2l6ZW9mKEFjbFBhY2tldEhlYWRlcikgKyBhY2xfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX0hDX1RPX1NUQUNLX0hDSV9BQ0wpOwotICAgIEFjbEhlYWRlcihwYWNrZXQpLT5zLmhhbmRsZSA9IGtIYW5kbGU7Ci0gICAgQWNsSGVhZGVyKHBhY2tldCktPmxlbmd0aCA9IGFjbF9sZW5ndGg7Ci0gICAgc3dpdGNoIChwYWNrZXRfb3JkZXIpIHsKLSAgICAgIGNhc2Uga1N0YXJ0OgotICAgICAgICBBY2xIZWFkZXIocGFja2V0KS0+cy5zdGFydCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrQ29udGludWF0aW9uOgotICAgICAgICBBY2xIZWFkZXIocGFja2V0KS0+cy5jb250aW51YXRpb24gPSAxOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIEJUX0hEUiogQWxsb2NhdGVQYWNrZXQoc2l6ZV90IHBhY2tldF9sZW5ndGgsIHVpbnQxNl90IGV2ZW50X21hc2spIGNvbnN0IHsKLSAgICBCVF9IRFIqIHBhY2tldCA9Ci0gICAgICAgIHN0YXRpY19jYXN0PEJUX0hEUio+KG9zaV9jYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBwYWNrZXRfbGVuZ3RoKSk7Ci0gICAgcGFja2V0LT5ldmVudCA9IGV2ZW50X21hc2s7Ci0gICAgcGFja2V0LT5sZW4gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4ocGFja2V0X2xlbmd0aCk7Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIHZvaWQgRmx1c2hQYXJ0aWFsUGFja2V0cygpIGNvbnN0IHsKLSAgICB3aGlsZSAoIXBhcnRpYWxfcGFja2V0cy5lbXB0eSgpKSB7Ci0gICAgICBCVF9IRFIqIHBhcnRpYWxfcGFja2V0ID0gcGFydGlhbF9wYWNrZXRzLmF0KGtIYW5kbGUpOwotICAgICAgcGFydGlhbF9wYWNrZXRzLmVyYXNlKGtIYW5kbGUpOwotICAgICAgb3NpX2ZyZWUocGFydGlhbF9wYWNrZXQpOwotICAgIH0KLSAgfQotfTsKLQotVEVTVF9GKEhjaVBhY2tldEZyYWdtZW50ZXJUZXN0LCBUZXN0U3RydWN0X0hhbmRsZSkgewotICBBY2xQYWNrZXRIZWFkZXIgYWNsX2hlYWRlcjsKLSAgbWVtc2V0KCZhY2xfaGVhZGVyLCAwLCBzaXplb2YoYWNsX2hlYWRlcikpOwotCi0gIGZvciAodWludDE2X3QgaCA9IDA7IGggPCBVSU5UMTZfTUFYOyBoKyspIHsKLSAgICBhY2xfaGVhZGVyLnMuaGFuZGxlID0gaDsKLSAgICBDSEVDSyhhY2xfaGVhZGVyLkdldEhhbmRsZSgpID09IChoICYgSEFORExFX01BU0spKTsKLSAgICBDSEVDSyhhY2xfaGVhZGVyLnMuY29udGludWF0aW9uID09IDApOwotICAgIENIRUNLKGFjbF9oZWFkZXIucy5zdGFydCA9PSAwKTsKLSAgICBDSEVDSyhhY2xfaGVhZGVyLnMucmVzZXJ2ZWQgPT0gMCk7Ci0KLSAgICBDSEVDSygoYWNsX2hlYWRlci5HZXRSYXdIYW5kbGUoKSAmIEhBTkRMRV9NQVNLKSA9PSAoaCAmIEhBTkRMRV9NQVNLKSk7Ci0gICAgR0VUX0JPVU5EQVJZX0ZMQUcoYWNsX2hlYWRlci5HZXRSYXdIYW5kbGUoKSA9PSAwKTsKLSAgfQotfQotCi1URVNUX0YoSGNpUGFja2V0RnJhZ21lbnRlclRlc3QsIFRlc3RTdHJ1Y3RfQ29udGludWF0aW9uKSB7Ci0gIEFjbFBhY2tldEhlYWRlciBhY2xfaGVhZGVyOwotICBtZW1zZXQoJmFjbF9oZWFkZXIsIDAsIHNpemVvZihhY2xfaGVhZGVyKSk7Ci0KLSAgZm9yICh1aW50MTZfdCBoID0gMDsgaCA8IFVJTlQxNl9NQVg7IGgrKykgewotICAgIGFjbF9oZWFkZXIucy5jb250aW51YXRpb24gPSBoOwotICAgIENIRUNLKGFjbF9oZWFkZXIuR2V0SGFuZGxlKCkgPT0gMCk7Ci0gICAgQ0hFQ0soYWNsX2hlYWRlci5zLmNvbnRpbnVhdGlvbiA9PSAoaCAmIDB4MSkpOwotICAgIENIRUNLKGFjbF9oZWFkZXIucy5zdGFydCA9PSAwKTsKLSAgICBDSEVDSyhhY2xfaGVhZGVyLnMucmVzZXJ2ZWQgPT0gMCk7Ci0KLSAgICBDSEVDSygoYWNsX2hlYWRlci5HZXRSYXdIYW5kbGUoKSAmIEhBTkRMRV9NQVNLKSA9PSAwKTsKLSAgICBHRVRfQk9VTkRBUllfRkxBRyhhY2xfaGVhZGVyLkdldFJhd0hhbmRsZSgpID09IChoICYgMHgzKSk7Ci0gIH0KLX0KLQotVEVTVF9GKEhjaVBhY2tldEZyYWdtZW50ZXJUZXN0LCBUZXN0U3RydWN0X1N0YXJ0KSB7Ci0gIEFjbFBhY2tldEhlYWRlciBhY2xfaGVhZGVyOwotICBtZW1zZXQoJmFjbF9oZWFkZXIsIDAsIHNpemVvZihhY2xfaGVhZGVyKSk7Ci0KLSAgZm9yICh1aW50MTZfdCBoID0gMDsgaCA8IFVJTlQxNl9NQVg7IGgrKykgewotICAgIGFjbF9oZWFkZXIucy5zdGFydCA9IGg7Ci0gICAgQ0hFQ0soYWNsX2hlYWRlci5HZXRIYW5kbGUoKSA9PSAwKTsKLSAgICBDSEVDSyhhY2xfaGVhZGVyLnMuY29udGludWF0aW9uID09IDApOwotICAgIENIRUNLKGFjbF9oZWFkZXIucy5zdGFydCA9PSAoaCAmIDB4MSkpOwotICAgIENIRUNLKGFjbF9oZWFkZXIucy5yZXNlcnZlZCA9PSAwKTsKLQotICAgIENIRUNLKChhY2xfaGVhZGVyLkdldFJhd0hhbmRsZSgpICYgSEFORExFX01BU0spID09IDApOwotICAgIEdFVF9CT1VOREFSWV9GTEFHKGFjbF9oZWFkZXIuR2V0UmF3SGFuZGxlKCkgPT0gKGggJiAweDMpKTsKLSAgfQotfQotCi1URVNUX0YoSGNpUGFja2V0RnJhZ21lbnRlclRlc3QsIFRlc3RTdHJ1Y3RfUmVzZXJ2ZWQpIHsKLSAgQWNsUGFja2V0SGVhZGVyIGFjbF9oZWFkZXI7Ci0gIG1lbXNldCgmYWNsX2hlYWRlciwgMCwgc2l6ZW9mKGFjbF9oZWFkZXIpKTsKLQotICBmb3IgKHVpbnQxNl90IGggPSAwOyBoIDwgVUlOVDE2X01BWDsgaCsrKSB7Ci0gICAgYWNsX2hlYWRlci5zLnJlc2VydmVkID0gaDsKLSAgICBDSEVDSyhhY2xfaGVhZGVyLkdldEhhbmRsZSgpID09IDApOwotICAgIENIRUNLKGFjbF9oZWFkZXIucy5jb250aW51YXRpb24gPT0gMCk7Ci0gICAgQ0hFQ0soYWNsX2hlYWRlci5zLnN0YXJ0ID09IDApOwotICAgIENIRUNLKGFjbF9oZWFkZXIucy5yZXNlcnZlZCA9PSAoaCAmIDB4MykpOwotICB9Ci19Ci1URVNUX0YoSGNpUGFja2V0RnJhZ21lbnRlclRlc3QsIENyZWF0ZUFuZFZlcmlmeVBhY2tldHMpIHsKLSAgY29uc3Qgc2l6ZV90IHNpemVfY2hlY2tbXSA9IHsxLCAgMiwgICAzLCAgIDQsICAgOCwgICAxNiwgICAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwgMTI3LCAxMjgsIDEyOSwgMjU2LCAxMDI0LCAweGZmZjB9OwotICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+IHNpemVzKAotICAgICAgc2l6ZV9jaGVjaywgc2l6ZV9jaGVjayArIHNpemVvZihzaXplX2NoZWNrKSAvIHNpemVvZihzaXplX2NoZWNrWzBdKSk7Ci0KLSAgZm9yIChjb25zdCBhdXRvIHBhY2tldF9zaXplIDogc2l6ZXMpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhID0gQ3JlYXRlRGF0YShwYWNrZXRfc2l6ZSk7Ci0gICAgdWludDhfdCBidWZbcGFja2V0X3NpemVdOwotICAgIHN0ZDo6Y29weShkYXRhLmNiZWdpbigpLCBkYXRhLmNlbmQoKSwgYnVmKTsKLSAgICBDSEVDSyhWZXJpZnlEYXRhKGJ1ZiwgcGFja2V0X3NpemUpKTsKLSAgfQotfQotCi1URVNUX0YoSGNpUGFja2V0RnJhZ21lbnRlclRlc3QsIE9uZVBhY2tldF9JbW1lZGlhdGUpIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiBzaXplcygKLSAgICAgIGtUeXBpY2FsUGFja2V0U2l6ZXMsIGtUeXBpY2FsUGFja2V0U2l6ZXMgKyBrTnVtYmVyT2ZUeXBpY2FsUGFja2V0U2l6ZXMpOwotCi0gIGludCByZWFzc2VtYmxlZF9hY2Nlc3NfY291bnQgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8gcGFja2V0X3NpemUgOiBzaXplcykgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgPSBDcmVhdGVEYXRhKHBhY2tldF9zaXplKTsKLSAgICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChBbGxvY2F0ZUwyY2FwUGFja2V0KGRhdGEuc2l6ZSgpLCBkYXRhKSk7Ci0KLSAgICBDSEVDSyhwYXJ0aWFsX3BhY2tldHMuc2l6ZSgpID09IDApOwotICAgIENIRUNLKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLmFjY2Vzc19jb3VudF8gPT0gKytyZWFzc2VtYmxlZF9hY2Nlc3NfY291bnQpOwotICAgIGF1dG8gcGFja2V0ID0gc3RkOjptb3ZlKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLnF1ZXVlLmZyb250KCkpOwotICAgIHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLnF1ZXVlLnBvcCgpOwotICAgIENIRUNLKFZlcmlmeURhdGEoRGF0YShwYWNrZXQuZ2V0KCkpLCBwYWNrZXRfc2l6ZSkpOwotICB9Ci19Ci0KLVRFU1RfRihIY2lQYWNrZXRGcmFnbWVudGVyVGVzdCwgT25lUGFja2V0X0ltbWVkaWF0ZVRvb0JpZykgewotICBjb25zdCBzaXplX3QgcGFja2V0X3NpemUgPSBrTWF4UGFja2V0U2l6ZSArIDE7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgPSBDcmVhdGVEYXRhKHBhY2tldF9zaXplKTsKLSAgcmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2goQWxsb2NhdGVMMmNhcFBhY2tldChkYXRhLnNpemUoKSwgZGF0YSkpOwotCi0gIENIRUNLKHBhcnRpYWxfcGFja2V0cy5zaXplKCkgPT0gMCk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLmFjY2Vzc19jb3VudF8gPT0gMCk7Ci19Ci0KLVRFU1RfRihIY2lQYWNrZXRGcmFnbWVudGVyVGVzdCwgVGhyZWVQYWNrZXRzX0ltbWVkaWF0ZSkgewotICBjb25zdCBzaXplX3QgcGFja2V0X3NpemUgPSA1MTI7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgPSBDcmVhdGVEYXRhKHBhY2tldF9zaXplKTsKLSAgcmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2goQWxsb2NhdGVMMmNhcFBhY2tldChkYXRhLnNpemUoKSwgZGF0YSkpOwotICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChBbGxvY2F0ZUwyY2FwUGFja2V0KGRhdGEuc2l6ZSgpLCBkYXRhKSk7Ci0gIHJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKEFsbG9jYXRlTDJjYXBQYWNrZXQoZGF0YS5zaXplKCksIGRhdGEpKTsKLSAgQ0hFQ0socGFydGlhbF9wYWNrZXRzLnNpemUoKSA9PSAwKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQuYWNjZXNzX2NvdW50XyA9PSAzKTsKLX0KLQotVEVTVF9GKEhjaVBhY2tldEZyYWdtZW50ZXJUZXN0LCBPbmVQYWNrZXRfU3BsaXRUd28pIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiBzaXplcygKLSAgICAgIGtUeXBpY2FsUGFja2V0U2l6ZXMsIGtUeXBpY2FsUGFja2V0U2l6ZXMgKyBrTnVtYmVyT2ZUeXBpY2FsUGFja2V0U2l6ZXMpOwotCi0gIGludCByZWFzc2VtYmxlZF9hY2Nlc3NfY291bnQgPSAwOwotICBmb3IgKGF1dG8gcGFja2V0X3NpemUgOiBzaXplcykgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEgPSBDcmVhdGVEYXRhKHBhY2tldF9zaXplKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJ0MShkYXRhLmNiZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2JlZ2luKCkgKyBwYWNrZXRfc2l6ZSAvIDIpOwotICAgIHJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKEFsbG9jYXRlTDJjYXBQYWNrZXQoZGF0YS5zaXplKCksIHBhcnQxKSk7Ci0KLSAgICBDSEVDSyhwYXJ0aWFsX3BhY2tldHMuc2l6ZSgpID09IDEpOwotICAgIENIRUNLKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLmFjY2Vzc19jb3VudF8gPT0gcmVhc3NlbWJsZWRfYWNjZXNzX2NvdW50KTsKLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcnQyKGRhdGEuY2JlZ2luKCkgKyBwYWNrZXRfc2l6ZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jZW5kKCkpOwotICAgIHJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKEFsbG9jYXRlTDJjYXBQYWNrZXQocGFydDIpKTsKLQotICAgIENIRUNLKHBhcnRpYWxfcGFja2V0cy5zaXplKCkgPT0gMCk7Ci0gICAgQ0hFQ0sodGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQuYWNjZXNzX2NvdW50XyA9PSArK3JlYXNzZW1ibGVkX2FjY2Vzc19jb3VudCk7Ci0KLSAgICBhdXRvIHBhY2tldCA9IHN0ZDo6bW92ZSh0ZXN0X3N0YXRlXy5yZWFzc2VtYmxlZC5xdWV1ZS5mcm9udCgpKTsKLSAgICB0ZXN0X3N0YXRlXy5yZWFzc2VtYmxlZC5xdWV1ZS5wb3AoKTsKLSAgICBDSEVDSyhWZXJpZnlEYXRhKERhdGEocGFja2V0LmdldCgpKSwgcGFja2V0X3NpemUpKTsKLSAgfQotfQotCi1URVNUX0YoSGNpUGFja2V0RnJhZ21lbnRlclRlc3QsIE9uZVBhY2tldF9TcGxpdEFMb3QpIHsKLSAgY29uc3Qgc2l6ZV90IHBhY2tldF9zaXplID0gNTEyOwotICBjb25zdCBzaXplX3Qgc3RyaWRlID0gMjsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhID0gQ3JlYXRlRGF0YShwYWNrZXRfc2l6ZSk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGZpcnN0X3BhcnQoZGF0YS5jYmVnaW4oKSwgZGF0YS5jYmVnaW4oKSArIHN0cmlkZSk7Ci0gIHJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKEFsbG9jYXRlTDJjYXBQYWNrZXQoZGF0YS5zaXplKCksIGZpcnN0X3BhcnQpKTsKLSAgQ0hFQ0socGFydGlhbF9wYWNrZXRzLnNpemUoKSA9PSAxKTsKLQotICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHBhY2tldF9zaXplIC0gc3RyaWRlOyBpICs9IHN0cmlkZSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1pZGRsZV9wYXJ0KGRhdGEuY2JlZ2luKCkgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2JlZ2luKCkgKyBpICsgc3RyaWRlKTsKLSAgICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChBbGxvY2F0ZUwyY2FwUGFja2V0KG1pZGRsZV9wYXJ0KSk7Ci0gIH0KLSAgQ0hFQ0socGFydGlhbF9wYWNrZXRzLnNpemUoKSA9PSAxKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQuYWNjZXNzX2NvdW50XyA9PSAwKTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsYXN0X3BhcnQoZGF0YS5jYmVnaW4oKSArIHBhY2tldF9zaXplIC0gc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jZW5kKCkpOwotICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChBbGxvY2F0ZUwyY2FwUGFja2V0KGxhc3RfcGFydCkpOwotCi0gIENIRUNLKHBhcnRpYWxfcGFja2V0cy5zaXplKCkgPT0gMCk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLmFjY2Vzc19jb3VudF8gPT0gMSk7Ci0gIGF1dG8gcGFja2V0ID0gc3RkOjptb3ZlKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLnF1ZXVlLmZyb250KCkpOwotICBDSEVDSyhWZXJpZnlEYXRhKERhdGEocGFja2V0LmdldCgpKSwgcGFja2V0X3NpemUpKTsKLX0KLQotVEVTVF9GKEhjaVBhY2tldEZyYWdtZW50ZXJUZXN0LCBUd29QYWNrZXRfSW52YWxpZExlbmd0aCkgewotICBjb25zdCBzaXplX3QgcGFja2V0X3NpemUgPSBVSU5UMTZfTUFYOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhID0gQ3JlYXRlRGF0YShwYWNrZXRfc2l6ZSk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGZpcnN0X3BhcnQoZGF0YS5jYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNiZWdpbigpICsgcGFja2V0X3NpemUgLyAyKTsKLSAgcmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2goQWxsb2NhdGVMMmNhcFBhY2tldChkYXRhLnNpemUoKSwgZmlyc3RfcGFydCkpOwotCi0gIENIRUNLKHBhcnRpYWxfcGFja2V0cy5zaXplKCkgPT0gMCk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLnJlYXNzZW1ibGVkLmFjY2Vzc19jb3VudF8gPT0gMCk7Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vjb25kX3BhcnQoZGF0YS5jYmVnaW4oKSArIHBhY2tldF9zaXplIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jZW5kKCkpOwotICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChBbGxvY2F0ZUwyY2FwUGFja2V0KHNlY29uZF9wYXJ0KSk7Ci0KLSAgQ0hFQ0socGFydGlhbF9wYWNrZXRzLnNpemUoKSA9PSAwKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQuYWNjZXNzX2NvdW50XyA9PSAwKTsKLX0KLQotVEVTVF9GKEhjaVBhY2tldEZyYWdtZW50ZXJUZXN0LCBUd29QYWNrZXRfSHVnZUJvZ3VzU2Vjb25kKSB7Ci0gIGNvbnN0IHNpemVfdCBwYWNrZXRfc2l6ZSA9IGtNYXhQYWNrZXRTaXplOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhID0gQ3JlYXRlRGF0YShVSU5UMTZfTUFYKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZmlyc3RfcGFydChkYXRhLmNiZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2JlZ2luKCkgKyBwYWNrZXRfc2l6ZSAtIDEpOwotICByZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChBbGxvY2F0ZUwyY2FwUGFja2V0KHBhY2tldF9zaXplLCBmaXJzdF9wYXJ0KSk7Ci0KLSAgQ0hFQ0socGFydGlhbF9wYWNrZXRzLnNpemUoKSA9PSAxKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8ucmVhc3NlbWJsZWQuYWNjZXNzX2NvdW50XyA9PSAwKTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZWNvbmRfcGFydChkYXRhLmNiZWdpbigpICsgcGFja2V0X3NpemUgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNlbmQoKSk7Ci0gIHJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKEFsbG9jYXRlTDJjYXBQYWNrZXQoc2Vjb25kX3BhcnQpKTsKLQotICBDSEVDSyhwYXJ0aWFsX3BhY2tldHMuc2l6ZSgpID09IDApOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5yZWFzc2VtYmxlZC5hY2Nlc3NfY291bnRfID09IDEpOwotfQpkaWZmIC0tZ2l0IGEvaGNpL3Rlc3QvcGFja2V0X2ZyYWdtZW50ZXJfdGVzdC5jYyBiL2hjaS90ZXN0L3BhY2tldF9mcmFnbWVudGVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDhmYTkuLjAwMDAwMDAKLS0tIGEvaGNpL3Rlc3QvcGFja2V0X2ZyYWdtZW50ZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9wYWNrZXRfZnJhZ21lbnRlci5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInRlc3Rfc3R1YnMuaCIKLQotI2lmbmRlZiBIQ0lfQUNMX1BSRUFNQkxFX1NJWkUKLSNkZWZpbmUgSENJX0FDTF9QUkVBTUJMRV9TSVpFIDQKLSNlbmRpZgotCi0jaWZuZGVmIEhDSV9JU09fUFJFQU1CTEVfU0laRQotI2RlZmluZSBIQ0lfSVNPX1BSRUFNQkxFX1NJWkUgNAotI2VuZGlmCi0KLURFQ0xBUkVfVEVTVF9NT0RFUyhpbml0LCBzZXRfZGF0YV9zaXplcywgbm9fZnJhZ21lbnRhdGlvbiwgZnJhZ21lbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBibGVfbm9fZnJhZ21lbnRhdGlvbiwgYmxlX2ZyYWdtZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgbm9uX2FjbF9wYXNzdGhyb3VnaF9mcmFnbWVudGF0aW9uLCBub19yZWFzc2VtYmx5LCByZWFzc2VtYmx5LAotICAgICAgICAgICAgICAgICAgIG5vbl9hY2xfcGFzc3Rocm91Z2hfcmVhc3NlbWJseSwgaXNvX25vX3JlYXNzZW1ibHksCi0gICAgICAgICAgICAgICAgICAgaXNvX3JlYXNzZW1ibHksIGlzb19mcmFnbWVudGF0aW9uLCBpc29fbm9fZnJhZ21lbnRhdGlvbik7Ci0KLSNkZWZpbmUgTE9DQUxfQkxFX0NPTlRST0xMRVJfSUQgMQotCi1zdGF0aWMgY29uc3QgY2hhciogc2FtcGxlX2RhdGEgPQotICAgICJBdCB0aGlzIHBvaW50IHRoZXkgY2FtZSBpbiBzaWdodCBvZiB0aGlydHkgZm9ydHkgd2luZG1pbGxzIHRoYXQgdGhlcmUgYXJlICIKLSAgICAib24gcGxhaW4sIGFuZCAiCi0gICAgImFzIHNvb24gYXMgRG9uIFF1aXhvdGUgc2F3IHRoZW0gaGUgc2FpZCB0byBoaXMgc3F1aXJlLCBcIkZvcnR1bmUgaXMgIgotICAgICJhcnJhbmdpbmcgbWF0dGVycyAiCi0gICAgImZvciB1cyBiZXR0ZXIgdGhhbiB3ZSBjb3VsZCBoYXZlIHNoYXBlZCBvdXIgZGVzaXJlcyBvdXJzZWx2ZXMsIGZvciBsb29rICIKLSAgICAidGhlcmUsIGZyaWVuZCAiCi0gICAgIlNhbmNobyBQYW56YSwgd2hlcmUgdGhpcnR5IG9yIG1vcmUgbW9uc3Ryb3VzIGdpYW50cyBwcmVzZW50IHRoZW1zZWx2ZXMsICIKLSAgICAiYWxsIG9mIHdob20gSSAiCi0gICAgIm1lYW4gdG8gZW5nYWdlIGluIGJhdHRsZSBhbmQgc2xheSwgYW5kIHdpdGggd2hvc2Ugc3BvaWxzIHdlIHNoYWxsIGJlZ2luICIKLSAgICAidG8gbWFrZSBvdXIgIgotICAgICJmb3J0dW5lczsgZm9yIHRoaXMgaXMgcmlnaHRlb3VzIHdhcmZhcmUsIGFuZCBpdCBpcyBHb2QncyBnb29kIHNlcnZpY2UgdG8gIgotICAgICJzd2VlcCBzbyBldmlsICIKLSAgICAiYSBicmVlZCBmcm9tIG9mZiB0aGUgZmFjZSBvZiB0aGUgZWFydGguXCIiOwotCi1zdGF0aWMgY29uc3QgY2hhciogc21hbGxfc2FtcGxlX2RhdGEgPSAiXCJXaGF0IGdpYW50cz9cIiBzYWlkIFNhbmNobyBQYW56YS4iOwotc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfaGFuZGxlX3N0YXJ0ID0gKDB4MTk5MiAmIDB4Q0ZGRikgfCAweDIwMDA7Ci1zdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF9oYW5kbGVfY29udGludWF0aW9uID0gKDB4MTk5MiAmIDB4Q0ZGRikgfCAweDEwMDA7Ci1zdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF9pc29faGFuZGxlX2NvbXBsZXRlX3dpdGhfdHMgPQotICAgICgweDA2NjYgfCAoMHgwMDAyIDw8IDEyKSB8ICgweDAwMDEgPDwgMTQpKTsKLXN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X2lzb19oYW5kbGVfY29tcGxldGVfd2l0aG91dF90cyA9Ci0gICAgKDB4MDY2NiB8ICgweDAwMDIgPDwgMTIpKTsKLXN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X2lzb19oYW5kbGVfc3RhcnRfd2l0aF90cyA9ICgweDA2NjYgfCAoMHgwMDAxIDw8IDE0KSk7Ci1zdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF9pc29faGFuZGxlX3N0YXJ0X3dpdGhvdXRfdHMgPQotICAgICgweDA2NjYpOyAgLy8gQWxzbyBiYXNlIGhhbmRsZQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfaXNvX2hhbmRsZV9jb250aW51YXRpb24gPSAoMHgwNjY2IHwgKDB4MDAwMSA8PCAxMikpOwotc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfaXNvX2hhbmRsZV9lbmQgPSAoMHgwNjY2IHwgKDB4MDAwMyA8PCAxMikpOwotCi1zdGF0aWMgaW50IHBhY2tldF9pbmRleDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGF0YV9zaXplX3N1bTsKLQotc3RhdGljIGNvbnN0IHBhY2tldF9mcmFnbWVudGVyX3QqIGZyYWdtZW50ZXI7Ci0KLXN0YXRpYyB1aW50MzJfdCBpc29fdGltZXN0YW1wID0gMHgzMjEyMjMyMTsKLXN0YXRpYyB1aW50MTZfdCBpc29fcGFja2V0X3NlcSA9IDB4MTI5MTsKLXN0YXRpYyBib29sIGlzb19oYXNfdHMgPSB0cnVlOwotCi1zdGF0aWMgQlRfSERSKiBtYW51ZmFjdHVyZV9wYWNrZXRfZm9yX2ZyYWdtZW50YXRpb24odWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSkgewotICB1aW50MTZfdCBkYXRhX2xlbmd0aCA9IHN0cmxlbihkYXRhKTsKLSAgdWludDE2X3Qgc2l6ZSA9IGRhdGFfbGVuZ3RoOwotICBpZiAoZXZlbnQgPT0gTVNHX1NUQUNLX1RPX0hDX0hDSV9BQ0wpIHsKLSAgICBzaXplICs9IDQ7ICAvLyAyIGZvciB0aGUgaGFuZGxlLCAyIGZvciB0aGUgbGVuZ3RoOwotICB9IGVsc2UgaWYgKGV2ZW50ID09IE1TR19TVEFDS19UT19IQ19IQ0lfSVNPKSB7Ci0gICAgc2l6ZSArPSA4OyAgLy8gaGFuZGxlICgyKSwgbGVuZ3RoICgyKSwgcGFja2V0X3NlcSAoMiksIHNkdV9sZW4oMikKLSAgICBpZiAoaXNvX2hhc190cykgewotICAgICAgc2l6ZSArPSA0OwotICAgIH0KLSAgfQotCi0gIEJUX0hEUiogcGFja2V0ID0gKEJUX0hEUiopb3NpX21hbGxvYyhzaXplICsgc2l6ZW9mKEJUX0hEUikpOwotICBwYWNrZXQtPmxlbiA9IHNpemU7Ci0gIHBhY2tldC0+b2Zmc2V0ID0gMDsKLSAgcGFja2V0LT5ldmVudCA9IGV2ZW50OwotICBwYWNrZXQtPmxheWVyX3NwZWNpZmljID0gMDsKLSAgdWludDhfdCogcGFja2V0X2RhdGEgPSBwYWNrZXQtPmRhdGE7Ci0KLSAgaWYgKGV2ZW50ID09IE1TR19TVEFDS19UT19IQ19IQ0lfQUNMKSB7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwYWNrZXRfZGF0YSwgdGVzdF9oYW5kbGVfc3RhcnQpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGRhdGFfbGVuZ3RoKTsKLSAgfSBlbHNlIGlmIChldmVudCA9PSBNU0dfU1RBQ0tfVE9fSENfSENJX0lTTykgewotICAgIGlmIChpc29faGFzX3RzKSB7Ci0gICAgICBwYWNrZXQtPmxheWVyX3NwZWNpZmljIHw9IEJUX0lTT19IRFJfQ09OVEFJTlNfVFM7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCB0ZXN0X2lzb19oYW5kbGVfc3RhcnRfd2l0aF90cyk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBkYXRhX2xlbmd0aCArIDgpOwotICAgICAgVUlOVDMyX1RPX1NUUkVBTShwYWNrZXRfZGF0YSwgaXNvX3RpbWVzdGFtcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIHRlc3RfaXNvX2hhbmRsZV9zdGFydF93aXRob3V0X3RzKTsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGRhdGFfbGVuZ3RoICsgNCk7Ci0gICAgfQotICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGlzb19wYWNrZXRfc2VxKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBkYXRhX2xlbmd0aCk7Ci0gIH0KLQotICBtZW1jcHkocGFja2V0X2RhdGEsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKLSAgcmV0dXJuIHBhY2tldDsKLX0KLQotc3RhdGljIHZvaWQgZXhwZWN0X3BhY2tldF9mcmFnbWVudGVkKHVpbnQxNl90IGV2ZW50LCBpbnQgbWF4X2FjbF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwYWNrZXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kX2NvbXBsZXRlKSB7Ci0gIHVpbnQ4X3QqIGRhdGEgPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgaW50IGV4cGVjdGVkX2RhdGFfb2Zmc2V0OwotICBpbnQgbGVuZ3RoX3RvX2NoZWNrOwotCi0gIGlmIChldmVudCA9PSBNU0dfU1RBQ0tfVE9fSENfSENJX0FDTCkgewotICAgIHVpbnQxNl90IGhhbmRsZTsKLSAgICB1aW50MTZfdCBsZW5ndGg7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UMTYobGVuZ3RoLCBkYXRhKTsKLQotICAgIGlmIChwYWNrZXRfaW5kZXggPT0gMCkKLSAgICAgIEVYUEVDVF9FUSh0ZXN0X2hhbmRsZV9zdGFydCwgaGFuZGxlKTsKLSAgICBlbHNlCi0gICAgICBFWFBFQ1RfRVEodGVzdF9oYW5kbGVfY29udGludWF0aW9uLCBoYW5kbGUpOwotCi0gICAgaW50IGxlbmd0aF9yZW1haW5pbmcgPSBzdHJsZW4oZXhwZWN0ZWRfZGF0YSkgLSBkYXRhX3NpemVfc3VtOwotICAgIGludCBwYWNrZXRfZGF0YV9sZW5ndGggPSBwYWNrZXQtPmxlbiAtIEhDSV9BQ0xfUFJFQU1CTEVfU0laRTsKLSAgICBFWFBFQ1RfRVEocGFja2V0X2RhdGFfbGVuZ3RoLCBsZW5ndGgpOwotCi0gICAgaWYgKGxlbmd0aF9yZW1haW5pbmcgPiBtYXhfYWNsX2RhdGFfc2l6ZSkKLSAgICAgIEVYUEVDVF9FUShtYXhfYWNsX2RhdGFfc2l6ZSwgcGFja2V0X2RhdGFfbGVuZ3RoKTsKLQotICAgIGxlbmd0aF90b19jaGVjayA9IHBhY2tldF9kYXRhX2xlbmd0aDsKLSAgICBleHBlY3RlZF9kYXRhX29mZnNldCA9IHBhY2tldF9pbmRleCAqIG1heF9hY2xfZGF0YV9zaXplOwotICAgIHBhY2tldF9pbmRleCsrOwotICB9IGVsc2UgaWYgKGV2ZW50ID09IE1TR19TVEFDS19UT19IQ19IQ0lfSVNPKSB7Ci0gICAgdWludDE2X3QgaGFuZGxlOwotICAgIHVpbnQxNl90IGxlbmd0aDsKLQotICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGxlbmd0aCwgZGF0YSk7Ci0KLSAgICBpbnQgbGVuZ3RoX3JlbWFpbmluZyA9IHN0cmxlbihleHBlY3RlZF9kYXRhKSAtIGRhdGFfc2l6ZV9zdW07Ci0gICAgaW50IHBhY2tldF9kYXRhX2xlbmd0aCA9IHBhY2tldC0+bGVuIC0gSENJX0lTT19QUkVBTUJMRV9TSVpFOwotCi0gICAgaWYgKHBhY2tldF9pbmRleCA9PSAwKSB7Ci0gICAgICB1aW50OF90IGhkcl9zaXplID0gODsgIC8vIHRzLCBwYWNrZXRfc2VxLCBsZW4KLQotICAgICAgaWYgKGlzb19oYXNfdHMpIHsKLSAgICAgICAgdWludDMyX3QgdGltZXN0YW1wOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKHRpbWVzdGFtcCwgZGF0YSk7Ci0gICAgICAgIEFTU0VSVF9FUSh0aW1lc3RhbXAsIGlzb190aW1lc3RhbXApOwotCi0gICAgICAgIGlmIChzZW5kX2NvbXBsZXRlKQotICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0X2lzb19oYW5kbGVfY29tcGxldGVfd2l0aF90cywgaGFuZGxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0X2lzb19oYW5kbGVfc3RhcnRfd2l0aF90cywgaGFuZGxlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzZW5kX2NvbXBsZXRlKQotICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0X2lzb19oYW5kbGVfY29tcGxldGVfd2l0aG91dF90cywgaGFuZGxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0X2lzb19oYW5kbGVfc3RhcnRfd2l0aG91dF90cywgaGFuZGxlKTsKLSAgICAgICAgaGRyX3NpemUgLT0gNDsKLSAgICAgIH0KLQotICAgICAgdWludDE2X3QgcGFja2V0X3NlcTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYocGFja2V0X3NlcSwgZGF0YSk7Ci0gICAgICBBU1NFUlRfRVEocGFja2V0X3NlcSwgaXNvX3BhY2tldF9zZXEpOwotCi0gICAgICB1aW50MTZfdCBpc29fc2R1X2xlbmd0aDsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaXNvX3NkdV9sZW5ndGgsIGRhdGEpOwotCi0gICAgICBBU1NFUlRfRVEoaXNvX3NkdV9sZW5ndGgsIHN0cmxlbihleHBlY3RlZF9kYXRhKSk7Ci0KLSAgICAgIGxlbmd0aF90b19jaGVjayA9IHBhY2tldF9kYXRhX2xlbmd0aCAtIGhkcl9zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIXNlbmRfY29tcGxldGUpCi0gICAgICAgIEFTU0VSVF9FUSh0ZXN0X2lzb19oYW5kbGVfY29udGludWF0aW9uLCBoYW5kbGUpOwotICAgICAgZWxzZQotICAgICAgICBBU1NFUlRfRVEodGVzdF9pc29faGFuZGxlX2VuZCwgaGFuZGxlKTsKLQotICAgICAgbGVuZ3RoX3RvX2NoZWNrID0gcGFja2V0X2RhdGFfbGVuZ3RoOwotICAgIH0KLQotICAgIGlmIChsZW5ndGhfcmVtYWluaW5nID4gbWF4X2FjbF9kYXRhX3NpemUpCi0gICAgICBBU1NFUlRfRVEobWF4X2FjbF9kYXRhX3NpemUsIHBhY2tldF9kYXRhX2xlbmd0aCk7Ci0KLSAgICBleHBlY3RlZF9kYXRhX29mZnNldCA9IHBhY2tldF9pbmRleCAqIG1heF9hY2xfZGF0YV9zaXplOwotICAgIGlmIChleHBlY3RlZF9kYXRhX29mZnNldCA+IDApIHsKLSAgICAgIGlmIChpc29faGFzX3RzKSB7Ci0gICAgICAgIGV4cGVjdGVkX2RhdGFfb2Zmc2V0IC09IDg7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBleHBlY3RlZF9kYXRhX29mZnNldCAtPSA0OwotICAgICAgfQotICAgIH0KLSAgICBwYWNrZXRfaW5kZXgrKzsKLSAgfSBlbHNlIHsKLSAgICBsZW5ndGhfdG9fY2hlY2sgPSBzdHJsZW4oZXhwZWN0ZWRfZGF0YSk7Ci0gICAgZXhwZWN0ZWRfZGF0YV9vZmZzZXQgPSAwOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGhfdG9fY2hlY2s7IGkrKykgewotICAgIEVYUEVDVF9FUShleHBlY3RlZF9kYXRhW2V4cGVjdGVkX2RhdGFfb2Zmc2V0ICsgaV0sIGRhdGFbaV0pOwotICAgIGRhdGFfc2l6ZV9zdW0rKzsKLSAgfQotCi0gIGlmIChldmVudCA9PSBNU0dfU1RBQ0tfVE9fSENfSENJX0lTTyB8fCBldmVudCA9PSBNU0dfU1RBQ0tfVE9fSENfSENJX0FDTCkKLSAgICBFWFBFQ1RfVFJVRShzZW5kX2NvbXBsZXRlID09IChkYXRhX3NpemVfc3VtID09IHN0cmxlbihleHBlY3RlZF9kYXRhKSkpOwotCi0gIGlmIChzZW5kX2NvbXBsZXRlKSBvc2lfZnJlZShwYWNrZXQpOwotfQotCi1zdGF0aWMgdm9pZCBtYW51ZmFjdHVyZV9hY2xfcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUodWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYWNsX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSkgewotICB1aW50MTZfdCBkYXRhX2xlbmd0aCA9IHN0cmxlbihkYXRhKTsKLSAgdWludDE2X3QgdG90YWxfbGVuZ3RoID0gZGF0YV9sZW5ndGggKyAyOyAgLy8gMiBmb3IgbDJjYXAgbGVuZ3RoOwotICB1aW50MTZfdCBsZW5ndGhfc2VudCA9IDA7Ci0gIHVpbnQxNl90IGwyY2FwX2xlbmd0aCA9IGRhdGFfbGVuZ3RoIC0gMjsgIC8vIGwyY2FwIGxlbmd0aCBmaWVsZCwgMiBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXRlbmQgY2hhbm5lbCBpZCBib3Jyb3dlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkYXRhCi0KLSAgZG8gewotICAgIGludCBsZW5ndGhfdG9fc2VuZCA9IChsZW5ndGhfc2VudCArIChhY2xfc2l6ZSAtIDQpIDwgdG90YWxfbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChhY2xfc2l6ZSAtIDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRvdGFsX2xlbmd0aCAtIGxlbmd0aF9zZW50KTsKLSAgICBCVF9IRFIqIHBhY2tldCA9IChCVF9IRFIqKW9zaV9tYWxsb2MobGVuZ3RoX3RvX3NlbmQgKyA0ICsgc2l6ZW9mKEJUX0hEUikpOwotICAgIHBhY2tldC0+bGVuID0gbGVuZ3RoX3RvX3NlbmQgKyA0OwotICAgIHBhY2tldC0+b2Zmc2V0ID0gMDsKLSAgICBwYWNrZXQtPmV2ZW50ID0gZXZlbnQ7Ci0gICAgcGFja2V0LT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0KLSAgICB1aW50OF90KiBwYWNrZXRfZGF0YSA9IHBhY2tldC0+ZGF0YTsKLSAgICBpZiAobGVuZ3RoX3NlbnQgPT0gMCkgeyAgLy8gZmlyc3QgcGFja2V0Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCB0ZXN0X2hhbmRsZV9zdGFydCk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBsZW5ndGhfdG9fc2VuZCk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBsMmNhcF9sZW5ndGgpOwotICAgICAgbWVtY3B5KHBhY2tldF9kYXRhLCBkYXRhLCBsZW5ndGhfdG9fc2VuZCAtIDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCB0ZXN0X2hhbmRsZV9jb250aW51YXRpb24pOwotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwYWNrZXRfZGF0YSwgbGVuZ3RoX3RvX3NlbmQpOwotICAgICAgbWVtY3B5KHBhY2tldF9kYXRhLCBkYXRhICsgbGVuZ3RoX3NlbnQgLSAyLCBsZW5ndGhfdG9fc2VuZCk7Ci0gICAgfQotCi0gICAgbGVuZ3RoX3NlbnQgKz0gbGVuZ3RoX3RvX3NlbmQ7Ci0gICAgZnJhZ21lbnRlci0+cmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2gocGFja2V0KTsKLSAgfSB3aGlsZSAobGVuZ3RoX3NlbnQgPCB0b3RhbF9sZW5ndGgpOwotfQotCi1zdGF0aWMgdm9pZCBtYW51ZmFjdHVyZV9pc29fcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUodWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaXNvX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSkgewotICB1aW50MTZfdCBkYXRhX2xlbmd0aCA9IHN0cmxlbihkYXRhKTsKLSAgdWludDE2X3QgdG90YWxfbGVuZ3RoOwotICB1aW50MTZfdCBsZW5ndGhfc2VudCA9IDA7Ci0gIHVpbnQxNl90IGlzb19sZW5ndGggPSBkYXRhX2xlbmd0aDsKLSAgQlRfSERSKiBwYWNrZXQ7Ci0gIHVpbnQ4X3QqIHBhY2tldF9kYXRhOwotICB1aW50OF90IGhkcl9zaXplID0gNDsgIC8vIHBhY2tldCBzZXEsIHNkdSBsZW4KLQotICAvLyBJU08gbGVuZ3RoICgyKSwgcGFja2V0IHNlcSAoMiksIG9wdGlvbmFsIHRpbWVzdGFtcCAoNCkKLSAgdG90YWxfbGVuZ3RoID0gZGF0YV9sZW5ndGggKyA0OwotICBpZiAoaXNvX2hhc190cykgdG90YWxfbGVuZ3RoICs9IDQ7Ci0KLSAgZG8gewotICAgIGludCBsZW5ndGhfdG9fc2VuZCA9IChsZW5ndGhfc2VudCArIChpc29fc2l6ZSAtIDQpIDwgdG90YWxfbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChpc29fc2l6ZSAtIDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRvdGFsX2xlbmd0aCAtIGxlbmd0aF9zZW50KTsKLQotICAgIHBhY2tldCA9IChCVF9IRFIqKW9zaV9tYWxsb2MobGVuZ3RoX3RvX3NlbmQgKyA0ICsgc2l6ZW9mKEJUX0hEUikpOwotICAgIHBhY2tldF9kYXRhID0gcGFja2V0LT5kYXRhOwotICAgIHBhY2tldC0+bGVuID0gbGVuZ3RoX3RvX3NlbmQgKyA0OwotICAgIHBhY2tldC0+b2Zmc2V0ID0gMDsKLSAgICBwYWNrZXQtPmV2ZW50ID0gZXZlbnQ7Ci0gICAgcGFja2V0LT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0KLSAgICBib29sIGlzX2NvbXBsZXRlID0gbGVuZ3RoX3RvX3NlbmQgPT0gdG90YWxfbGVuZ3RoOwotCi0gICAgaWYgKGxlbmd0aF9zZW50ID09IDApIHsgIC8vIGZpcnN0IHBhY2tldAotICAgICAgaWYgKGlzb19oYXNfdHMpIHsKLSAgICAgICAgaGRyX3NpemUgKz0gNDsKLSAgICAgICAgaWYgKGlzX2NvbXBsZXRlKSB7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwYWNrZXRfZGF0YSwgdGVzdF9pc29faGFuZGxlX2NvbXBsZXRlX3dpdGhfdHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIHRlc3RfaXNvX2hhbmRsZV9zdGFydF93aXRoX3RzKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGlzX2NvbXBsZXRlKSB7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwYWNrZXRfZGF0YSwgdGVzdF9pc29faGFuZGxlX2NvbXBsZXRlX3dpdGhvdXRfdHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIHRlc3RfaXNvX2hhbmRsZV9zdGFydF93aXRob3V0X3RzKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBsZW5ndGhfdG9fc2VuZCk7Ci0KLSAgICAgIGlmIChpc29faGFzX3RzKSB7Ci0gICAgICAgIFVJTlQzMl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGlzb190aW1lc3RhbXApOwotICAgICAgfQotCi0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBpc29fcGFja2V0X3NlcSk7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBpc29fbGVuZ3RoKTsKLSAgICAgIG1lbWNweShwYWNrZXRfZGF0YSwgZGF0YSwgbGVuZ3RoX3RvX3NlbmQgLSBoZHJfc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChsZW5ndGhfc2VudCArIGxlbmd0aF90b19zZW5kID09IHRvdGFsX2xlbmd0aCkgewotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCB0ZXN0X2lzb19oYW5kbGVfZW5kKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIHRlc3RfaXNvX2hhbmRsZV9jb250aW51YXRpb24pOwotICAgICAgfQotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwYWNrZXRfZGF0YSwgbGVuZ3RoX3RvX3NlbmQpOwotICAgICAgbWVtY3B5KHBhY2tldF9kYXRhLCBkYXRhICsgbGVuZ3RoX3NlbnQgLSBoZHJfc2l6ZSwgbGVuZ3RoX3RvX3NlbmQpOwotICAgIH0KLQotICAgIGxlbmd0aF9zZW50ICs9IGxlbmd0aF90b19zZW5kOwotICAgIGZyYWdtZW50ZXItPnJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKHBhY2tldCk7Ci0gIH0gd2hpbGUgKGxlbmd0aF9zZW50IDwgdG90YWxfbGVuZ3RoKTsKLX0KLQotc3RhdGljIHZvaWQgbWFudWZhY3R1cmVfcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUodWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYWNrZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEpIHsKLSAgdWludDE2X3QgZGF0YV9sZW5ndGggPSBzdHJsZW4oZGF0YSk7Ci0KLSAgaWYgKGV2ZW50ID09IE1TR19IQ19UT19TVEFDS19IQ0lfQUNMKSB7Ci0gICAgbWFudWZhY3R1cmVfYWNsX3BhY2tldF9hbmRfdGhlbl9yZWFzc2VtYmxlKGV2ZW50LCBwYWNrZXRfc2l6ZSwgZGF0YSk7Ci0gIH0gZWxzZSBpZiAoZXZlbnQgPT0gTVNHX0hDX1RPX1NUQUNLX0hDSV9JU08pIHsKLSAgICBtYW51ZmFjdHVyZV9pc29fcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUoZXZlbnQsIHBhY2tldF9zaXplLCBkYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBCVF9IRFIqIHBhY2tldCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoZGF0YV9sZW5ndGggKyBzaXplb2YoQlRfSERSKSk7Ci0gICAgcGFja2V0LT5sZW4gPSBkYXRhX2xlbmd0aDsKLSAgICBwYWNrZXQtPm9mZnNldCA9IDA7Ci0gICAgcGFja2V0LT5ldmVudCA9IGV2ZW50OwotICAgIHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotICAgIG1lbWNweShwYWNrZXQtPmRhdGEsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKLQotICAgIGZyYWdtZW50ZXItPnJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKHBhY2tldCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZXhwZWN0X3BhY2tldF9yZWFzc2VtYmxlZCh1aW50MTZfdCBldmVudCwgQlRfSERSKiBwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2RhdGEpIHsKLSAgdWludDE2X3QgZXhwZWN0ZWRfZGF0YV9sZW5ndGggPSBzdHJsZW4oZXhwZWN0ZWRfZGF0YSk7Ci0gIHVpbnQ4X3QqIGRhdGEgPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLQotICBpZiAoZXZlbnQgPT0gTVNHX0hDX1RPX1NUQUNLX0hDSV9BQ0wpIHsKLSAgICB1aW50MTZfdCBoYW5kbGU7Ci0gICAgdWludDE2X3QgbGVuZ3RoOwotICAgIHVpbnQxNl90IGwyY2FwX2xlbmd0aDsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihsZW5ndGgsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UMTYobDJjYXBfbGVuZ3RoLCBkYXRhKTsKLQotICAgIEVYUEVDVF9FUSh0ZXN0X2hhbmRsZV9zdGFydCwgaGFuZGxlKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZGF0YV9sZW5ndGggKyAyLCBsZW5ndGgpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZF9kYXRhX2xlbmd0aCAtIDIsCi0gICAgICAgICAgICAgIGwyY2FwX2xlbmd0aCk7ICAvLyAtMiBmb3IgdGhlIHByZXRlbmQgY2hhbm5lbCBpZAotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZF9kYXRhX2xlbmd0aDsgaSsrKSB7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkX2RhdGFbaV0sIGRhdGFbaV0pOwotICAgIGRhdGFfc2l6ZV9zdW0rKzsKLSAgfQotCi0gIG9zaV9mcmVlKHBhY2tldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4cGVjdF9wYWNrZXRfcmVhc3NlbWJsZWRfaXNvKHVpbnQxNl90IGV2ZW50LCBCVF9IRFIqIHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZF90aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBleHBlY3RlZF9wYWNrZXRfc2VxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jb21wbGV0ZSA9IGZhbHNlKSB7Ci0gIHVpbnQxNl90IGV4cGVjdGVkX2RhdGFfbGVuZ3RoID0gc3RybGVuKGV4cGVjdGVkX2RhdGEpOwotICB1aW50OF90KiBkYXRhID0gcGFja2V0LT5kYXRhOwotICB1aW50OF90IGhkcl9zaXplID0gODsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBsZW5ndGg7Ci0gIHVpbnQxNl90IGlzb19sZW5ndGg7Ci0gIHVpbnQzMl90IHRpbWVzdGFtcDsKLSAgdWludDE2X3QgcGFja2V0X3NlcTsKLQotICBBU1NFUlRfRVEoZXZlbnQsIE1TR19IQ19UT19TVEFDS19IQ0lfSVNPKTsKLQotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgZGF0YSk7Ci0gIFNUUkVBTV9UT19VSU5UMTYobGVuZ3RoLCBkYXRhKTsKLSAgaWYgKGlzb19oYXNfdHMpIHsKLSAgICBTVFJFQU1fVE9fVUlOVDMyKHRpbWVzdGFtcCwgZGF0YSk7Ci0gICAgQVNTRVJUX1RSVUUoKHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgJiBCVF9JU09fSERSX0NPTlRBSU5TX1RTKSAhPSAwKTsKLSAgICBBU1NFUlRfRVEodGltZXN0YW1wLCBleHBlY3RlZF90aW1lc3RhbXApOwotICAgIEFTU0VSVF9FUShpc19jb21wbGV0ZSA/IHRlc3RfaXNvX2hhbmRsZV9jb21wbGV0ZV93aXRoX3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogdGVzdF9pc29faGFuZGxlX3N0YXJ0X3dpdGhfdHMsCi0gICAgICAgICAgICAgIGhhbmRsZSk7Ci0gIH0gZWxzZSB7Ci0gICAgQVNTRVJUX1RSVUUoKHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgJiBCVF9JU09fSERSX0NPTlRBSU5TX1RTKSA9PSAwKTsKLSAgICBBU1NFUlRfRVEoaXNfY29tcGxldGUgPyB0ZXN0X2lzb19oYW5kbGVfY29tcGxldGVfd2l0aG91dF90cwotICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlc3RfaXNvX2hhbmRsZV9zdGFydF93aXRob3V0X3RzLAotICAgICAgICAgICAgICBoYW5kbGUpOwotICAgIGhkcl9zaXplIC09IDQ7Ci0gIH0KLQotICBBU1NFUlRfRVEoZXhwZWN0ZWRfZGF0YV9sZW5ndGggKyBoZHJfc2l6ZSwgbGVuZ3RoKTsKLQotICBTVFJFQU1fVE9fVUlOVDE2KHBhY2tldF9zZXEsIGRhdGEpOwotICBBU1NFUlRfRVEocGFja2V0X3NlcSwgZXhwZWN0ZWRfcGFja2V0X3NlcSk7Ci0KLSAgU1RSRUFNX1RPX1VJTlQxNihpc29fbGVuZ3RoLCBkYXRhKTsKLSAgQVNTRVJUX0VRKGV4cGVjdGVkX2RhdGFfbGVuZ3RoLCBpc29fbGVuZ3RoKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkX2RhdGFfbGVuZ3RoOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfZGF0YVtpXSwgZGF0YVtpXSk7Ci0gICAgZGF0YV9zaXplX3N1bSsrOwotICB9Ci0KLSAgb3NpX2ZyZWUocGFja2V0KTsKLX0KLQotU1RVQl9GVU5DVElPTih2b2lkLCBmcmFnbWVudGVkX2NhbGxiYWNrLCAoQlRfSERSICogcGFja2V0LCBib29sIHNlbmRfY29tcGxldGUpKQotRFVSSU5HKG5vX2ZyYWdtZW50YXRpb24pIEFUX0NBTEwoMCkgewotICBleHBlY3RfcGFja2V0X2ZyYWdtZW50ZWQoTVNHX1NUQUNLX1RPX0hDX0hDSV9BQ0wsIDQyLCBwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSwgc2VuZF9jb21wbGV0ZSk7Ci0gIHJldHVybjsKLX0KLQotRFVSSU5HKGZyYWdtZW50YXRpb24pIHsKLSAgZXhwZWN0X3BhY2tldF9mcmFnbWVudGVkKE1TR19TVEFDS19UT19IQ19IQ0lfQUNMLCAxMCwgcGFja2V0LCBzYW1wbGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29tcGxldGUpOwotICByZXR1cm47Ci19Ci0KLURVUklORyhibGVfbm9fZnJhZ21lbnRhdGlvbikgQVRfQ0FMTCgwKSB7Ci0gIGV4cGVjdF9wYWNrZXRfZnJhZ21lbnRlZChNU0dfU1RBQ0tfVE9fSENfSENJX0FDTCwgNDIsIHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsX3NhbXBsZV9kYXRhLCBzZW5kX2NvbXBsZXRlKTsKLSAgcmV0dXJuOwotfQotCi1EVVJJTkcoYmxlX2ZyYWdtZW50YXRpb24pIHsKLSAgZXhwZWN0X3BhY2tldF9mcmFnbWVudGVkKE1TR19TVEFDS19UT19IQ19IQ0lfQUNMLCAxMCwgcGFja2V0LCBzYW1wbGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29tcGxldGUpOwotICByZXR1cm47Ci19Ci0KLURVUklORyhpc29fZnJhZ21lbnRhdGlvbikgewotICBleHBlY3RfcGFja2V0X2ZyYWdtZW50ZWQoTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08sIDEwLCBwYWNrZXQsIHNhbXBsZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9jb21wbGV0ZSk7Ci0gIHJldHVybjsKLX0KLQotRFVSSU5HKGlzb19ub19mcmFnbWVudGF0aW9uKSB7Ci0gIGV4cGVjdF9wYWNrZXRfZnJhZ21lbnRlZChNU0dfU1RBQ0tfVE9fSENfSENJX0lTTywgNDIsIHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsX3NhbXBsZV9kYXRhLCBzZW5kX2NvbXBsZXRlKTsKLSAgcmV0dXJuOwotfQotCi1EVVJJTkcobm9uX2FjbF9wYXNzdGhyb3VnaF9mcmFnbWVudGF0aW9uKSBBVF9DQUxMKDApIHsKLSAgZXhwZWN0X3BhY2tldF9mcmFnbWVudGVkKE1TR19TVEFDS19UT19IQ19IQ0lfQ01ELCAxMCwgcGFja2V0LCBzYW1wbGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29tcGxldGUpOwotICByZXR1cm47Ci19Ci0KLVVORVhQRUNURURfQ0FMTDsKLX0KLQotU1RVQl9GVU5DVElPTih2b2lkLCByZWFzc2VtYmxlZF9jYWxsYmFjaywgKEJUX0hEUiAqIHBhY2tldCkpCi1EVVJJTkcobm9fcmVhc3NlbWJseSkgQVRfQ0FMTCgwKSB7Ci0gIGV4cGVjdF9wYWNrZXRfcmVhc3NlbWJsZWQoTVNHX0hDX1RPX1NUQUNLX0hDSV9BQ0wsIHBhY2tldCwgc21hbGxfc2FtcGxlX2RhdGEpOwotICByZXR1cm47Ci19Ci0KLURVUklORyhyZWFzc2VtYmx5KSBBVF9DQUxMKDApIHsKLSAgZXhwZWN0X3BhY2tldF9yZWFzc2VtYmxlZChNU0dfSENfVE9fU1RBQ0tfSENJX0FDTCwgcGFja2V0LCBzYW1wbGVfZGF0YSk7Ci0gIHJldHVybjsKLX0KLQotRFVSSU5HKGlzb19yZWFzc2VtYmx5KSBBVF9DQUxMKDApIHsKLSAgZXhwZWN0X3BhY2tldF9yZWFzc2VtYmxlZF9pc28oTVNHX0hDX1RPX1NUQUNLX0hDSV9JU08sIHBhY2tldCwgc2FtcGxlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb190aW1lc3RhbXAsIGlzb19wYWNrZXRfc2VxKTsKLSAgcmV0dXJuOwotfQotCi1EVVJJTkcoaXNvX25vX3JlYXNzZW1ibHkpIEFUX0NBTEwoMCkgewotICBleHBlY3RfcGFja2V0X3JlYXNzZW1ibGVkX2lzbyhNU0dfSENfVE9fU1RBQ0tfSENJX0lTTywgcGFja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSwgaXNvX3RpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvX3BhY2tldF9zZXEsIHRydWUpOwotICByZXR1cm47Ci19Ci0KLURVUklORyhub25fYWNsX3Bhc3N0aHJvdWdoX3JlYXNzZW1ibHkpIEFUX0NBTEwoMCkgewotICBleHBlY3RfcGFja2V0X3JlYXNzZW1ibGVkKE1TR19IQ19UT19TVEFDS19IQ0lfRVZULCBwYWNrZXQsIHNhbXBsZV9kYXRhKTsKLSAgcmV0dXJuOwotfQotCi1VTkVYUEVDVEVEX0NBTEw7Ci19Ci0KLVNUVUJfRlVOQ1RJT04odm9pZCwgdHJhbnNtaXRfZmluaXNoZWRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgIChVTlVTRURfQVRUUiBCVF9IRFIgKiBwYWNrZXQsCi0gICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIHNlbnRfYWxsX2ZyYWdtZW50cykpCi1VTkVYUEVDVEVEX0NBTEw7Ci19Ci0KLVNUVUJfRlVOQ1RJT04odWludDE2X3QsIGdldF9hY2xfZGF0YV9zaXplX2NsYXNzaWMsICh2b2lkKSkKLURVUklORyhub19mcmFnbWVudGF0aW9uLCBub25fYWNsX3Bhc3N0aHJvdWdoX2ZyYWdtZW50YXRpb24sIG5vX3JlYXNzZW1ibHkpCi1yZXR1cm4gNDI7Ci1EVVJJTkcoZnJhZ21lbnRhdGlvbikgcmV0dXJuIDEwOwotRFVSSU5HKG5vX3JlYXNzZW1ibHkpIHJldHVybiAxMzM3OwotCi1VTkVYUEVDVEVEX0NBTEw7Ci1yZXR1cm4gMDsKLX0KLQotU1RVQl9GVU5DVElPTih1aW50MTZfdCwgZ2V0X2FjbF9kYXRhX3NpemVfYmxlLCAodm9pZCkpCi1EVVJJTkcoYmxlX25vX2ZyYWdtZW50YXRpb24pIHJldHVybiA0MjsKLURVUklORyhibGVfZnJhZ21lbnRhdGlvbikgcmV0dXJuIDEwOwotCi1VTkVYUEVDVEVEX0NBTEw7Ci1yZXR1cm4gMDsKLX0KLQotU1RVQl9GVU5DVElPTih1aW50MTZfdCwgZ2V0X2lzb19kYXRhX3NpemUsICh2b2lkKSkKLURVUklORyhpc29fbm9fZnJhZ21lbnRhdGlvbikgcmV0dXJuIDQyOwotRFVSSU5HKGlzb19mcmFnbWVudGF0aW9uKSByZXR1cm4gMTA7Ci0KLVVORVhQRUNURURfQ0FMTDsKLXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByZXNldF9mb3IoVEVTVF9NT0RFU19UIG5leHQpIHsKLSAgUkVTRVRfQ0FMTF9DT1VOVChmcmFnbWVudGVkX2NhbGxiYWNrKTsKLSAgUkVTRVRfQ0FMTF9DT1VOVChyZWFzc2VtYmxlZF9jYWxsYmFjayk7Ci0gIFJFU0VUX0NBTExfQ09VTlQodHJhbnNtaXRfZmluaXNoZWRfY2FsbGJhY2spOwotICBSRVNFVF9DQUxMX0NPVU5UKGdldF9hY2xfZGF0YV9zaXplX2NsYXNzaWMpOwotICBSRVNFVF9DQUxMX0NPVU5UKGdldF9hY2xfZGF0YV9zaXplX2JsZSk7Ci0gIFJFU0VUX0NBTExfQ09VTlQoZ2V0X2lzb19kYXRhX3NpemUpOwotICBDVVJSRU5UX1RFU1RfTU9ERSA9IG5leHQ7Ci19Ci0KLWNsYXNzIFBhY2tldEZyYWdtZW50ZXJUZXN0IDogcHVibGljIEFsbG9jYXRpb25UZXN0SGFybmVzcyB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIEFsbG9jYXRpb25UZXN0SGFybmVzczo6U2V0VXAoKTsKLSAgICBmcmFnbWVudGVyID0KLSAgICAgICAgcGFja2V0X2ZyYWdtZW50ZXJfZ2V0X3Rlc3RfaW50ZXJmYWNlKCZjb250cm9sbGVyLCAmYWxsb2NhdG9yX21hbGxvYyk7Ci0KLSAgICBwYWNrZXRfaW5kZXggPSAwOwotICAgIGRhdGFfc2l6ZV9zdW0gPSAwOwotCi0gICAgY2FsbGJhY2tzLmZyYWdtZW50ZWQgPSBmcmFnbWVudGVkX2NhbGxiYWNrOwotICAgIGNhbGxiYWNrcy5yZWFzc2VtYmxlZCA9IHJlYXNzZW1ibGVkX2NhbGxiYWNrOwotICAgIGNhbGxiYWNrcy50cmFuc21pdF9maW5pc2hlZCA9IHRyYW5zbWl0X2ZpbmlzaGVkX2NhbGxiYWNrOwotICAgIGNvbnRyb2xsZXIuZ2V0X2FjbF9kYXRhX3NpemVfY2xhc3NpYyA9IGdldF9hY2xfZGF0YV9zaXplX2NsYXNzaWM7Ci0gICAgY29udHJvbGxlci5nZXRfYWNsX2RhdGFfc2l6ZV9ibGUgPSBnZXRfYWNsX2RhdGFfc2l6ZV9ibGU7Ci0gICAgY29udHJvbGxlci5nZXRfaXNvX2RhdGFfc2l6ZSA9IGdldF9pc29fZGF0YV9zaXplOwotCi0gICAgcmVzZXRfZm9yKGluaXQpOwotICAgIGZyYWdtZW50ZXItPmluaXQoJmNhbGxiYWNrcyk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGZyYWdtZW50ZXItPmNsZWFudXAoKTsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7Ci0gIH0KLQotICBjb250cm9sbGVyX3QgY29udHJvbGxlcjsKLSAgcGFja2V0X2ZyYWdtZW50ZXJfY2FsbGJhY2tzX3QgY2FsbGJhY2tzOwotfTsKLQotVEVTVF9GKFBhY2tldEZyYWdtZW50ZXJUZXN0LCB0ZXN0X25vX2ZyYWdtZW50X25lY2Vzc2FyeSkgewotICByZXNldF9mb3Iobm9fZnJhZ21lbnRhdGlvbik7Ci0gIEJUX0hEUiogcGFja2V0ID0gbWFudWZhY3R1cmVfcGFja2V0X2Zvcl9mcmFnbWVudGF0aW9uKE1TR19TVEFDS19UT19IQ19IQ0lfQUNMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSk7Ci0gIGZyYWdtZW50ZXItPmZyYWdtZW50X2FuZF9kaXNwYXRjaChwYWNrZXQpOwotCi0gIEVYUEVDVF9FUShzdHJsZW4oc21hbGxfc2FtcGxlX2RhdGEpLCBkYXRhX3NpemVfc3VtKTsKLSAgRVhQRUNUX0NBTExfQ09VTlQoZnJhZ21lbnRlZF9jYWxsYmFjaywgMSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9mcmFnbWVudF9uZWNlc3NhcnkpIHsKLSAgcmVzZXRfZm9yKGZyYWdtZW50YXRpb24pOwotICBCVF9IRFIqIHBhY2tldCA9IG1hbnVmYWN0dXJlX3BhY2tldF9mb3JfZnJhZ21lbnRhdGlvbihNU0dfU1RBQ0tfVE9fSENfSENJX0FDTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2RhdGEpOwotICBmcmFnbWVudGVyLT5mcmFnbWVudF9hbmRfZGlzcGF0Y2gocGFja2V0KTsKLQotICBFWFBFQ1RfRVEoc3RybGVuKHNhbXBsZV9kYXRhKSwgZGF0YV9zaXplX3N1bSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9ibGVfbm9fZnJhZ21lbnRfbmVjZXNzYXJ5KSB7Ci0gIHJlc2V0X2ZvcihibGVfbm9fZnJhZ21lbnRhdGlvbik7Ci0gIEJUX0hEUiogcGFja2V0ID0gbWFudWZhY3R1cmVfcGFja2V0X2Zvcl9mcmFnbWVudGF0aW9uKE1TR19TVEFDS19UT19IQ19IQ0lfQUNMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSk7Ci0gIHBhY2tldC0+ZXZlbnQgfD0gTE9DQUxfQkxFX0NPTlRST0xMRVJfSUQ7Ci0gIGZyYWdtZW50ZXItPmZyYWdtZW50X2FuZF9kaXNwYXRjaChwYWNrZXQpOwotCi0gIEVYUEVDVF9FUShzdHJsZW4oc21hbGxfc2FtcGxlX2RhdGEpLCBkYXRhX3NpemVfc3VtKTsKLSAgRVhQRUNUX0NBTExfQ09VTlQoZnJhZ21lbnRlZF9jYWxsYmFjaywgMSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9ibGVfZnJhZ21lbnRfbmVjZXNzYXJ5KSB7Ci0gIHJlc2V0X2ZvcihibGVfZnJhZ21lbnRhdGlvbik7Ci0gIEJUX0hEUiogcGFja2V0ID0gbWFudWZhY3R1cmVfcGFja2V0X2Zvcl9mcmFnbWVudGF0aW9uKE1TR19TVEFDS19UT19IQ19IQ0lfQUNMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZGF0YSk7Ci0gIHBhY2tldC0+ZXZlbnQgfD0gTE9DQUxfQkxFX0NPTlRST0xMRVJfSUQ7Ci0gIGZyYWdtZW50ZXItPmZyYWdtZW50X2FuZF9kaXNwYXRjaChwYWNrZXQpOwotCi0gIEVYUEVDVF9FUShzdHJsZW4oc2FtcGxlX2RhdGEpLCBkYXRhX3NpemVfc3VtKTsKLX0KLQotVEVTVF9GKFBhY2tldEZyYWdtZW50ZXJUZXN0LCB0ZXN0X25vbl9hY2xfcGFzc3Rocm91Z2hfZnJhZ21lbnRhdGlvbikgewotICByZXNldF9mb3Iobm9uX2FjbF9wYXNzdGhyb3VnaF9mcmFnbWVudGF0aW9uKTsKLSAgQlRfSERSKiBwYWNrZXQgPSBtYW51ZmFjdHVyZV9wYWNrZXRfZm9yX2ZyYWdtZW50YXRpb24oTVNHX1NUQUNLX1RPX0hDX0hDSV9DTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKTsKLSAgZnJhZ21lbnRlci0+ZnJhZ21lbnRfYW5kX2Rpc3BhdGNoKHBhY2tldCk7Ci0KLSAgRVhQRUNUX0VRKHN0cmxlbihzYW1wbGVfZGF0YSksIGRhdGFfc2l6ZV9zdW0pOwotICBFWFBFQ1RfQ0FMTF9DT1VOVChmcmFnbWVudGVkX2NhbGxiYWNrLCAxKTsKLX0KLQotVEVTVF9GKFBhY2tldEZyYWdtZW50ZXJUZXN0LCB0ZXN0X25vX3JlYXNzZW1ibHlfbmVjZXNzYXJ5KSB7Ci0gIHJlc2V0X2Zvcihub19yZWFzc2VtYmx5KTsKLSAgbWFudWZhY3R1cmVfcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUoTVNHX0hDX1RPX1NUQUNLX0hDSV9BQ0wsIDEzMzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsX3NhbXBsZV9kYXRhKTsKLQotICBFWFBFQ1RfRVEoc3RybGVuKHNtYWxsX3NhbXBsZV9kYXRhKSwgZGF0YV9zaXplX3N1bSk7Ci0gIEVYUEVDVF9DQUxMX0NPVU5UKHJlYXNzZW1ibGVkX2NhbGxiYWNrLCAxKTsKLX0KLQotVEVTVF9GKFBhY2tldEZyYWdtZW50ZXJUZXN0LCB0ZXN0X3JlYXNzZW1ibHlfbmVjZXNzYXJ5KSB7Ci0gIHJlc2V0X2ZvcihyZWFzc2VtYmx5KTsKLSAgbWFudWZhY3R1cmVfcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUoTVNHX0hDX1RPX1NUQUNLX0hDSV9BQ0wsIDQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKHN0cmxlbihzYW1wbGVfZGF0YSksIGRhdGFfc2l6ZV9zdW0pOwotICBFWFBFQ1RfQ0FMTF9DT1VOVChyZWFzc2VtYmxlZF9jYWxsYmFjaywgMSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9ub25fYWNsX3Bhc3N0aHJvdWdoX3JlYXNzZWVtYmx5KSB7Ci0gIHJlc2V0X2Zvcihub25fYWNsX3Bhc3N0aHJvdWdoX3JlYXNzZW1ibHkpOwotICBtYW51ZmFjdHVyZV9wYWNrZXRfYW5kX3RoZW5fcmVhc3NlbWJsZShNU0dfSENfVE9fU1RBQ0tfSENJX0VWVCwgNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKTsKLQotICBFWFBFQ1RfRVEoc3RybGVuKHNhbXBsZV9kYXRhKSwgZGF0YV9zaXplX3N1bSk7Ci0gIEVYUEVDVF9DQUxMX0NPVU5UKHJlYXNzZW1ibGVkX2NhbGxiYWNrLCAxKTsKLX0KLQotVEVTVF9GKFBhY2tldEZyYWdtZW50ZXJUZXN0LCB0ZXN0X2lzb19mcmFnbWVudF9uZWNlc3NhcnkpIHsKLSAgcmVzZXRfZm9yKGlzb19mcmFnbWVudGF0aW9uKTsKLSAgaXNvX2hhc190cyA9IHRydWU7Ci0KLSAgQlRfSERSKiBwYWNrZXQgPSBtYW51ZmFjdHVyZV9wYWNrZXRfZm9yX2ZyYWdtZW50YXRpb24oTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKTsKLSAgcGFja2V0LT5ldmVudCB8PSBMT0NBTF9CTEVfQ09OVFJPTExFUl9JRDsKLSAgZnJhZ21lbnRlci0+ZnJhZ21lbnRfYW5kX2Rpc3BhdGNoKHBhY2tldCk7Ci0KLSAgQVNTRVJUX0VRKHN0cmxlbihzYW1wbGVfZGF0YSksIGRhdGFfc2l6ZV9zdW0pOwotfQotCi1URVNUX0YoUGFja2V0RnJhZ21lbnRlclRlc3QsIHRlc3RfaXNvX25vX2ZyYWdtZW50X25lY2Vzc2FyeSkgewotICByZXNldF9mb3IoaXNvX25vX2ZyYWdtZW50YXRpb24pOwotICBpc29faGFzX3RzID0gdHJ1ZTsKLQotICBCVF9IRFIqIHBhY2tldCA9IG1hbnVmYWN0dXJlX3BhY2tldF9mb3JfZnJhZ21lbnRhdGlvbihNU0dfU1RBQ0tfVE9fSENfSENJX0lTTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxfc2FtcGxlX2RhdGEpOwotICBwYWNrZXQtPmV2ZW50IHw9IExPQ0FMX0JMRV9DT05UUk9MTEVSX0lEOwotICBmcmFnbWVudGVyLT5mcmFnbWVudF9hbmRfZGlzcGF0Y2gocGFja2V0KTsKLQotICBBU1NFUlRfRVEoc3RybGVuKHNtYWxsX3NhbXBsZV9kYXRhKSwgZGF0YV9zaXplX3N1bSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9pc29fZnJhZ21lbnRfbmVjZXNzYXJ5X25vX3RzKSB7Ci0gIHJlc2V0X2Zvcihpc29fZnJhZ21lbnRhdGlvbik7Ci0gIGlzb19oYXNfdHMgPSBmYWxzZTsKLSAgQlRfSERSKiBwYWNrZXQgPSBtYW51ZmFjdHVyZV9wYWNrZXRfZm9yX2ZyYWdtZW50YXRpb24oTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKTsKLSAgcGFja2V0LT5ldmVudCB8PSBMT0NBTF9CTEVfQ09OVFJPTExFUl9JRDsKLSAgZnJhZ21lbnRlci0+ZnJhZ21lbnRfYW5kX2Rpc3BhdGNoKHBhY2tldCk7Ci0KLSAgQVNTRVJUX0VRKHN0cmxlbihzYW1wbGVfZGF0YSksIGRhdGFfc2l6ZV9zdW0pOwotfQotCi1URVNUX0YoUGFja2V0RnJhZ21lbnRlclRlc3QsIHRlc3RfaXNvX25vX2ZyYWdtZW50X25lY2Vzc2FyeV9ub190cykgewotICByZXNldF9mb3IoaXNvX25vX2ZyYWdtZW50YXRpb24pOwotICBpc29faGFzX3RzID0gZmFsc2U7Ci0gIEJUX0hEUiogcGFja2V0ID0gbWFudWZhY3R1cmVfcGFja2V0X2Zvcl9mcmFnbWVudGF0aW9uKE1TR19TVEFDS19UT19IQ19IQ0lfSVNPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSk7Ci0gIHBhY2tldC0+ZXZlbnQgfD0gTE9DQUxfQkxFX0NPTlRST0xMRVJfSUQ7Ci0gIGZyYWdtZW50ZXItPmZyYWdtZW50X2FuZF9kaXNwYXRjaChwYWNrZXQpOwotCi0gIEFTU0VSVF9FUShzdHJsZW4oc21hbGxfc2FtcGxlX2RhdGEpLCBkYXRhX3NpemVfc3VtKTsKLX0KLQotVEVTVF9GKFBhY2tldEZyYWdtZW50ZXJUZXN0LCB0ZXN0X2lzb19ub19yZWFzc2VtYmx5X25lY2Vzc2FyeSkgewotICByZXNldF9mb3IoaXNvX25vX3JlYXNzZW1ibHkpOwotICBpc29faGFzX3RzID0gdHJ1ZTsKLSAgbWFudWZhY3R1cmVfcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUoTVNHX0hDX1RPX1NUQUNLX0hDSV9JU08sIDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSk7Ci0KLSAgQVNTRVJUX0VRKHN0cmxlbihzbWFsbF9zYW1wbGVfZGF0YSksIGRhdGFfc2l6ZV9zdW0pOwotICBFWFBFQ1RfQ0FMTF9DT1VOVChyZWFzc2VtYmxlZF9jYWxsYmFjaywgMSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9pc29fcmVhc3NlbWJseV9uZWNlc3NhcnkpIHsKLSAgcmVzZXRfZm9yKGlzb19yZWFzc2VtYmx5KTsKLSAgaXNvX2hhc190cyA9IHRydWU7Ci0gIG1hbnVmYWN0dXJlX3BhY2tldF9hbmRfdGhlbl9yZWFzc2VtYmxlKE1TR19IQ19UT19TVEFDS19IQ0lfSVNPLCA0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2RhdGEpOwotCi0gIEFTU0VSVF9FUShzdHJsZW4oc2FtcGxlX2RhdGEpLCBkYXRhX3NpemVfc3VtKTsKLSAgRVhQRUNUX0NBTExfQ09VTlQocmVhc3NlbWJsZWRfY2FsbGJhY2ssIDEpOwotfQotCi1URVNUX0YoUGFja2V0RnJhZ21lbnRlclRlc3QsIHRlc3RfaXNvX25vX3JlYXNzZW1ibHlfbmVjZXNzYXJ5X25vX3RzKSB7Ci0gIHJlc2V0X2Zvcihpc29fbm9fcmVhc3NlbWJseSk7Ci0gIGlzb19oYXNfdHMgPSBmYWxzZTsKLSAgbWFudWZhY3R1cmVfcGFja2V0X2FuZF90aGVuX3JlYXNzZW1ibGUoTVNHX0hDX1RPX1NUQUNLX0hDSV9JU08sICg0MiArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zYW1wbGVfZGF0YSk7Ci0KLSAgQVNTRVJUX0VRKHN0cmxlbihzbWFsbF9zYW1wbGVfZGF0YSksIGRhdGFfc2l6ZV9zdW0pOwotICBFWFBFQ1RfQ0FMTF9DT1VOVChyZWFzc2VtYmxlZF9jYWxsYmFjaywgMSk7Ci19Ci0KLVRFU1RfRihQYWNrZXRGcmFnbWVudGVyVGVzdCwgdGVzdF9pc29fcmVhc3NlbWJseV9uZWNlc3Nhcnlfbm9fdHMpIHsKLSAgcmVzZXRfZm9yKGlzb19yZWFzc2VtYmx5KTsKLSAgaXNvX2hhc190cyA9IGZhbHNlOwotICBtYW51ZmFjdHVyZV9wYWNrZXRfYW5kX3RoZW5fcmVhc3NlbWJsZShNU0dfSENfVE9fU1RBQ0tfSENJX0lTTywgNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kYXRhKTsKLQotICBBU1NFUlRfRVEoc3RybGVuKHNhbXBsZV9kYXRhKSwgZGF0YV9zaXplX3N1bSk7Ci0gIEVYUEVDVF9DQUxMX0NPVU5UKHJlYXNzZW1ibGVkX2NhbGxiYWNrLCAxKTsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQW5kcm9pZC5icCBiL2luY2x1ZGUvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxMWNiZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X2hlYWRlcnMgewotICAgIG5hbWU6ICJhdnJjcF9oZWFkZXJzIiwKLSAgICBkZWZhdWx0czogWyJsaWJjaHJvbWVfc3VwcG9ydF9kZWZhdWx0cyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLi9oYXJkd2FyZS9hdnJjcC8iXSwKLSAgICBoZWFkZXJfbGliczogWyJpbnRlcm5hbF9pbmNsdWRlX2hlYWRlcnMiXSwKLSAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImludGVybmFsX2luY2x1ZGVfaGVhZGVycyJdLAotCi0gICAgLy8gV2UgbmVlZCB0aGlzIGluIGNhc2Ugc29tZSBmaWxlIG91dHNpZGUgb2YgdGhlIEJsdWV0b290aCBwcm9qZWN0IGluY2x1ZGVzCi0gICAgLy8gYmx1ZXRvb3RoLmggYnV0IGRvZXNuJ3QgaW5jbHVkZSBsaWJjaHJvbWUgd2hpY2ggYXZyY3AuaCBkZXBlbmRzIG9uLgotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGliY2hyb21lIl0sCi0KLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnlfaGVhZGVycyB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aF9oZWFkZXJzIiwKLSAgICBkZWZhdWx0czogWyJsaWJjaHJvbWVfc3VwcG9ydF9kZWZhdWx0cyJdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJhdnJjcF9oZWFkZXJzIiwKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcy1oZWFkZXIiLAotICAgICAgICAibGliYnRjb3JlX2hlYWRlcnMiLAotICAgIF0sCi0gICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwotICAgICAgICAiYXZyY3BfaGVhZGVycyIsCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMtaGVhZGVyIiwKLSAgICAgICAgImxpYmJ0Y29yZV9oZWFkZXJzIiwKLSAgICBdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLi8iXSwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hYnN0cmFjdF9tZXNzYWdlX2xvb3AuaCBiL2luY2x1ZGUvYWJzdHJhY3RfbWVzc2FnZV9sb29wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjY1YjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hYnN0cmFjdF9tZXNzYWdlX2xvb3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIGRlZmluZWQoQkFTRV9WRVIpICYmIEJBU0VfVkVSID4gNzgwMDAwCi0vKiBsaWJjaHJvbWUgdmVyc2lvbiA8IDc4MDAwMCBzdGlsbCBoYXMgdGhlIG9sZCBtZXNzYWdlIGxvb3AuIEFuZHJvaWQgc3RpbGwgdXNlcwotICogdGhlIG9sZCBsaWJjaHJvbWUgdmVyc2lvbiBzbyB1c2UgdGhlIGJhc2ljIG1lc3NhZ2Vsb29wIHdoZXJlIHRoYXQncyByZXF1aXJlZC4KLSAqIEVsc2V3aGVyZSwgdXNlIHRoZSBTaW5nbGVUaHJlYWRUYXNrRXhlY3V0b3IgaW5zdGVhZC4KLSAqLwotI2lmIEJBU0VfVkVSID49IDgyMjA2NAotI2luY2x1ZGUgPGJhc2UvdGFzay9jdXJyZW50X3RocmVhZC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3BfY3VycmVudC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YmFzZS9tZXNzYWdlX2xvb3AvbWVzc2FnZV9wdW1wLmg+Ci0jaW5jbHVkZSA8YmFzZS90YXNrL3NpbmdsZV90aHJlYWRfdGFza19leGVjdXRvci5oPgotI2luY2x1ZGUgPGJhc2UvdGVzdC90YXNrX2Vudmlyb25tZW50Lmg+Ci0jaW5jbHVkZSA8YmFzZS90aHJlYWRpbmcvdGhyZWFkLmg+Ci0jaW5jbHVkZSA8YmFzZS90aHJlYWRpbmcvdGhyZWFkX3Rhc2tfcnVubmVyX2hhbmRsZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxiYXNlL21lc3NhZ2VfbG9vcC9tZXNzYWdlX2xvb3AuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgYnRiYXNlIHsKLQotI2lmIGRlZmluZWQoQkFTRV9WRVIpICYmIEJBU0VfVkVSID4gNzgwMDAwCi0KLWNsYXNzIEFic3RyYWN0TWVzc2FnZUxvb3AgOiBwdWJsaWMgYmFzZTo6U2luZ2xlVGhyZWFkVGFza0V4ZWN1dG9yIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IGN1cnJlbnRfdGFza19ydW5uZXIoKSB7Ci0gICAgcmV0dXJuIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpOwotICB9Ci19OwotCi1jbGFzcyBBYnN0cmFjdFRlc3RNZXNzYWdlTG9vcCA6IHB1YmxpYyBiYXNlOjp0ZXN0OjpUYXNrRW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgc3RhdGljIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gY3VycmVudF90YXNrX3J1bm5lcigpIHsKLSAgICByZXR1cm4gYmFzZTo6VGhyZWFkVGFza1J1bm5lckhhbmRsZTo6R2V0KCk7Ci0gIH0KLX07Ci0KLS8vIEluaXRpYWxpemUgdGhlIHRlc3QgdGFzayBlbnZpcm9ubWVudAotI2RlZmluZSBERUZJTkVfVEVTVF9UQVNLX0VOVih2YXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJhc2U6OkFic3RyYWN0VGVzdE1lc3NhZ2VMb29wIHZhciB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBiYXNlOjp0ZXN0OjpUYXNrRW52aXJvbm1lbnQ6OlRocmVhZGluZ01vZGU6Ok1BSU5fVEhSRUFEX09OTFkgXAotICB9Ci0KLWlubGluZSB2b2lkIHNldF9tZXNzYWdlX2xvb3BfdHlwZV9JTyhiYXNlOjpUaHJlYWQ6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgb3B0aW9ucy5tZXNzYWdlX3B1bXBfdHlwZSA9IGJhc2U6Ok1lc3NhZ2VQdW1wVHlwZTo6SU87Ci19Ci0KLSNlbHNlCi1jbGFzcyBBYnN0cmFjdE1lc3NhZ2VMb29wIDogcHVibGljIGJhc2U6Ok1lc3NhZ2VMb29wIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IGN1cnJlbnRfdGFza19ydW5uZXIoKSB7Ci0gICAgcmV0dXJuIGJhc2U6Ok1lc3NhZ2VMb29wOjpjdXJyZW50KCktPnRhc2tfcnVubmVyKCk7Ci0gIH0KLX07Ci0KLWNsYXNzIEFic3RyYWN0VGVzdE1lc3NhZ2VMb29wIDogcHVibGljIEFic3RyYWN0TWVzc2FnZUxvb3Age307Ci0KLSNkZWZpbmUgREVGSU5FX1RFU1RfVEFTS19FTlYodmFyKSBiYXNlOjpBYnN0cmFjdFRlc3RNZXNzYWdlTG9vcCogdmFyCi0KLWlubGluZSB2b2lkIHNldF9tZXNzYWdlX2xvb3BfdHlwZV9JTyhiYXNlOjpUaHJlYWQ6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgb3B0aW9ucy5tZXNzYWdlX2xvb3BfdHlwZSA9IGJhc2U6Ok1lc3NhZ2VMb29wOjpUWVBFX0lPOwotfQotCi0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIGJ0YmFzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hYnN0cmFjdF9vYnNlcnZlcl9saXN0LmggYi9pbmNsdWRlL2Fic3RyYWN0X29ic2VydmVyX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4ODI1OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2Fic3RyYWN0X29ic2VydmVyX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2Uvb2JzZXJ2ZXJfbGlzdC5oPgotCi1uYW1lc3BhY2UgYnRiYXNlIHsKLSNpZiBkZWZpbmVkKEJBU0VfVkVSKSAmJiBCQVNFX1ZFUiA+IDc4MDAwMAotCi0vLyBDaGVja2VkIE9ic2VydmVycyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoZSBvbGRlciBsaWJjaHJvbWUgc28gdXNlIHVuY2hlY2tlZAotLy8gb25lcyBpbnN0ZWFkIHRvIHByZXNlcnZlIGJlaGF2aW9yLgotdGVtcGxhdGUgPGNsYXNzIE9ic2VydmVyVHlwZT4KLWNsYXNzIEFic3RyYWN0T2JzZXJ2ZXJMaXN0Ci0gICAgOiBwdWJsaWMgYmFzZTo6T2JzZXJ2ZXJMaXN0PE9ic2VydmVyVHlwZT46OlVuY2hlY2tlZCB7fTsKLQotI2Vsc2UKLQotdGVtcGxhdGUgPGNsYXNzIE9ic2VydmVyVHlwZT4KLWNsYXNzIEFic3RyYWN0T2JzZXJ2ZXJMaXN0IDogcHVibGljIGJhc2U6Ok9ic2VydmVyTGlzdDxPYnNlcnZlclR5cGU+IHt9OwotCi0jZW5kaWYKLX0gIC8vIG5hbWVzcGFjZSBidGJhc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJyYXlfdXRpbHMuaCBiL2luY2x1ZGUvYXJyYXlfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2OWQwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FycmF5X3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDIxIEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIEFSUkFZX1NJWkUKLSNkZWZpbmUgQVJSQVlfU0laRShhcnIpIChzaXplb2YoYXJyKSAvIHNpemVvZihhcnJbMF0pKQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRfaGVscGVycy5oIGIvaW5jbHVkZS9iaW5kX2hlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyZDhmNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRfaGVscGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0jcHJhZ21hIG9uY2UKLQotI2lmIGRlZmluZWQoQkFTRV9WRVIpICYmIEJBU0VfVkVSID49IDg2MDIyMAotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfaGVscGVycy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxiYXNlL2JpbmRfaGVscGVycy5oPgotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NoZWNrLmggYi9pbmNsdWRlL2NoZWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzNmNWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jaGVjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAyMSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0jcHJhZ21hIG9uY2UKLQotLy8gT24gYWxsIG9sZCBsaWJjaHJvbWUsIENIRUNLIGlzIGF2YWlsYWJsZSB2aWEgbG9nZ2luZy5oCi0vLyBBZnRlciA4MjIwNjQsIHRoaXMgd2FzIG1vdmVkIGludG8gYmFzZS9jaGVjay5oIGFuZCBiYXNlL2NoZWNrX29wLmgKLSNpZiBkZWZpbmVkKEJBU0VfVkVSKSAmJiBCQVNFX1ZFUiA+PSA4MjIwNjQKLSNpbmNsdWRlIDxiYXNlL2NoZWNrLmg+IC8vIENIRUNLL0RDSEVDSwotI2luY2x1ZGUgPGJhc2UvY2hlY2tfb3AuaD4gLy8gQ0hFQ0tfTEUvRENIRUNLX0xFL0NIRUNLL19HVCwgZXRjCi0jZWxzZQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwLmggYi9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODAyN2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9hdnJjcC9hdnJjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrX2ZvcndhcmQuaD4KLQotI2luY2x1ZGUgImF2cmNwX2NvbW1vbi5oIgotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotc3RydWN0IFNvbmdJbmZvIHsKLSAgc3RkOjpzdHJpbmcgbWVkaWFfaWQ7ICAvLyBUaGlzIGdldHMgY29udmVydGVkIHRvIGEgVUlEIGluIHRoZSBuYXRpdmUgc2VydmljZQotICBzdGQ6OnNldDxBdHRyaWJ1dGVFbnRyeT4gYXR0cmlidXRlczsKLX07Ci0KLWVudW0gUGxheVN0YXRlIDogdWludDhfdCB7Ci0gIFNUT1BQRUQgPSAweDAwLAotICBQTEFZSU5HLAotICBQQVVTRUQsCi0gIEZXRF9TRUVLLAotICBSRVZfU0VFSywKLSAgRVJST1IgPSAweEZGLAotfTsKLQotc3RydWN0IFBsYXlTdGF0dXMgewotICB1aW50MzJfdCBwb3NpdGlvbjsKLSAgdWludDMyX3QgZHVyYXRpb247Ci0gIFBsYXlTdGF0ZSBzdGF0ZTsKLX07Ci0KLXN0cnVjdCBNZWRpYVBsYXllckluZm8gewotICB1aW50MTZfdCBpZDsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgYm9vbCBicm93c2luZ19zdXBwb3J0ZWQ7Ci19OwotCi1zdHJ1Y3QgRm9sZGVySW5mbyB7Ci0gIHN0ZDo6c3RyaW5nIG1lZGlhX2lkOwotICBib29sIGlzX3BsYXlhYmxlOwotICBzdGQ6OnN0cmluZyBuYW1lOwotfTsKLQotLy8gVE9ETyAoYXBhbmlja2UpOiBDb252ZXJ0IHRoaXMgdG8gYSB1bmlvbgotc3RydWN0IExpc3RJdGVtIHsKLSAgZW51bSA6IHVpbnQ4X3QgewotICAgIEZPTERFUiwKLSAgICBTT05HLAotICB9IHR5cGU7Ci0KLSAgRm9sZGVySW5mbyBmb2xkZXI7Ci0gIFNvbmdJbmZvIHNvbmc7Ci19OwotCi1jbGFzcyBNZWRpYUNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgU2VuZE1lZGlhVXBkYXRlKGJvb2wgdHJhY2tfY2hhbmdlZCwgYm9vbCBwbGF5X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcXVldWUpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNlbmRGb2xkZXJVcGRhdGUoYm9vbCBhdmFpbGFibGVfcGxheWVycywgYm9vbCBhZGRyZXNzZWRfcGxheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1aWRzX2NoYW5nZWQpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNlbmRBY3RpdmVEZXZpY2VDaGFuZ2VkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgdmlydHVhbCB+TWVkaWFDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci19OwotCi0vLyBUaGUgY2xhc3NlcyBiZWxvdyBhcmUgdXNlZCBieSB0aGUgSk5JIGFuZCBhcmUgbG9hZGVkIGR5bmFtaWNhbGx5IHdpdGggdGhlCi0vLyBCbHVldG9vdGggbGlicmFyeS4gQWxsIGNsYXNzZXMgbXVzdCBiZSBwdXJlIHZpcnR1YWwgb3RoZXJ3aXNlIGEgY29tcGlsZXIKLS8vIGVycm9yIG9jY3VycyB3aGVuIHRyeWluZyB0byBsaW5rIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi4KLQotLy8gTWVkaWFJbnRlcmZhY2UgZGVmaW5lcyB0aGUgY2xhc3MgdGhhdCB0aGUgQVZSQ1AgU2VydmljZSB1c2VzIGluIG9yZGVyCi0vLyBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtZWRpYSBsYXllci4gVGhlIG1lZGlhIGxheWVyIHdpbGwgZGVmaW5lIGl0cyBvd24KLS8vIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb2JqZWN0IGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBzZXJ2aWNlIHVzaW5nCi0vLyBBdnJjcDo6U2VydmljZUludGVyZmFjZTo6SW5pdCgpLiBBdCB0aGlzIHBvaW50IHRoZSBBVlJDUCBTZXJ2aWNlIHdpbGwKLS8vIGNhbGwgUmVnaXN0ZXJVcGRhdGVDYWxsYmFja3MoKSB0byBwcm92aWRlIGFuIGhhbmRsZSB0byB1c2UgdG8gc2VuZAotLy8gbm90aWZpY2F0aW9ucyBhYm91dCBjaGFuZ2VzIGluIHRoZSBNZWRpYSBJbnRlcmZhY2UuCi0vLwotLy8gTk9URVM6IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGhhcyB0aGUgbmF0aXZlIHNlcnZpY2UgaGFuZGxlIGFsbCB0aGUKLS8vIHRocmVhZCBzd2l0Y2hpbmcuIEl0IHdpbGwgY2FsbCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBvbiB0aGUgYnRpZi9qbmkKLS8vIHRocmVhZCBhbmQgdGhlIGNhbGxiYWNrIHdpbGwgcG9zdCBpdHMgcmVzdWx0cyB0byB0aGUgYnRhIHRocmVhZC4KLS8vIEluIHRoZSBmdXR1cmUgdGhlIGludGVyZmFjZSB0aGUgSk5JIHJlZ2lzdGVyZWQgd2l0aCB0aGUKLS8vIHNlcnZpY2Ugc2hvdWxkIHBvc3QgYWxsIGl0cyB0YXNrcyB0byB0aGUgSk5JIHRocmVhZCBpdHNlbGYgc28gdGhhdCB0aGUgbmF0aXZlCi0vLyBzZXJ2aWNlIGlzbid0IGF3YXJlIG9mIHRoZSB0aHJlYWQgdGhlIGludGVyZmFjZSBmdW5jdGlvbnMgbmVlZCB0byBiZSBjYWxsZWQKLS8vIG9uLiBJdCBjYW4gdGhlbiBzdXBwbHkgY2FsbGJhY2tzIHRoYXQgcG9zdCByZXN1bHRzIHRvIHRoZSBjb3JyZWN0IHRocmVhZAotLy8gYWxsb3dpbmcgdGhlIHRocmVhZGluZyBtb2RlbCB0byBiZSB0b3RhbGx5IGVuY2Fwc3VsYXRlZCBhbmQgYWxsb3cgY29ycmVjdAotLy8gYmVoYXZpb3IgaW4gY2FzZSB0aGUgdGhyZWFkaW5nIG1vZGVsIGNoYW5nZXMgb24gZWl0aGVyIHNpZGUuCi1jbGFzcyBNZWRpYUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgU2VuZEtleUV2ZW50KHVpbnQ4X3Qga2V5LCBLZXlTdGF0ZSBzdGF0ZSkgPSAwOwotCi0gIHVzaW5nIFNvbmdJbmZvQ2FsbGJhY2sgPSBiYXNlOjpDYWxsYmFjazx2b2lkKFNvbmdJbmZvKT47Ci0gIHZpcnR1YWwgdm9pZCBHZXRTb25nSW5mbyhTb25nSW5mb0NhbGxiYWNrIGluZm9fY2IpID0gMDsKLQotICB1c2luZyBQbGF5U3RhdHVzQ2FsbGJhY2sgPSBiYXNlOjpDYWxsYmFjazx2b2lkKFBsYXlTdGF0dXMpPjsKLSAgdmlydHVhbCB2b2lkIEdldFBsYXlTdGF0dXMoUGxheVN0YXR1c0NhbGxiYWNrIHN0YXR1c19jYikgPSAwOwotCi0gIC8vIENvbnRhaW5zIHRoZSBjdXJyZW50IHF1ZXVlIGFuZCB0aGUgbWVkaWEgSUQgb2YgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGl0ZW0KLSAgLy8gaW4gdGhlIHF1ZXVlCi0gIHVzaW5nIE5vd1BsYXlpbmdDYWxsYmFjayA9Ci0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxTb25nSW5mbz4pPjsKLSAgdmlydHVhbCB2b2lkIEdldE5vd1BsYXlpbmdMaXN0KE5vd1BsYXlpbmdDYWxsYmFjayBub3dfcGxheWluZ19jYikgPSAwOwotCi0gIC8vIFRPRE8gKGFwYW5pY2tlKTogVXNlIGEgbWFwIHdpdGggdGhlIElEIGFzIHRoZSBrZXkgaW5zdGVhZCBvZiB2ZWN0b3IKLSAgLy8gaW4gZm9sbG93IHVwIGNsZWFudXAgcGF0Y2hlcy4gVGhpcyBhbGxvd3Mgc2ltcGxpZmljYXRpb24gb2YgdGhlCi0gIC8vIE1lZGlhUGxheWVySW5mbyBvYmplY3QKLSAgdXNpbmcgTWVkaWFMaXN0Q2FsbGJhY2sgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50MTZfdCBjdXJyX3BsYXllciwgc3RkOjp2ZWN0b3I8TWVkaWFQbGF5ZXJJbmZvPik+OwotICB2aXJ0dWFsIHZvaWQgR2V0TWVkaWFQbGF5ZXJMaXN0KE1lZGlhTGlzdENhbGxiYWNrIGxpc3RfY2IpID0gMDsKLQotICB1c2luZyBGb2xkZXJJdGVtc0NhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnZlY3RvcjxMaXN0SXRlbT4pPjsKLSAgdmlydHVhbCB2b2lkIEdldEZvbGRlckl0ZW1zKHVpbnQxNl90IHBsYXllcl9pZCwgc3RkOjpzdHJpbmcgbWVkaWFfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkZXJJdGVtc0NhbGxiYWNrIGZvbGRlcl9jYikgPSAwOwotCi0gIHVzaW5nIFNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjayA9IGJhc2U6OkNhbGxiYWNrPHZvaWQoCi0gICAgICBib29sIHN1Y2Nlc3MsIHN0ZDo6c3RyaW5nIHJvb3RfaWQsIHVpbnQzMl90IG51bV9pdGVtcyk+OwotICB2aXJ0dWFsIHZvaWQgU2V0QnJvd3NlZFBsYXllcih1aW50MTZfdCBwbGF5ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjayBicm93c2VfY2IpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgUGxheUl0ZW0odWludDE2X3QgcGxheWVyX2lkLCBib29sIG5vd19wbGF5aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVkaWFfaWQpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgU2V0QWN0aXZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJVcGRhdGVDYWxsYmFjayhNZWRpYUNhbGxiYWNrcyogY2FsbGJhY2spID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlclVwZGF0ZUNhbGxiYWNrKE1lZGlhQ2FsbGJhY2tzKiBjYWxsYmFjaykgPSAwOwotCi0gIE1lZGlhSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5NZWRpYUludGVyZmFjZSgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIFZvbHVtZUludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBUT0RPIChhcGFuaWNrZSk6IEludmVzdGlnYXRlIHRoZSBiZXN0IHZhbHVlIHR5cGUgZm9yIHZvbHVtZS4gUmlnaHQgbm93IGl0Ci0gIC8vIGlzIGEgdmFsdWUgZnJvbSAwLTEyNyBiZWNhdXNlIHRoYXRzIHdoYXQgQVZSQ1AgdXNlcy4KLSAgdXNpbmcgVm9sdW1lQ2hhbmdlZENiID0gYmFzZTo6Q2FsbGJhY2s8dm9pZChpbnQ4X3Qgdm9sdW1lKT47Ci0KLSAgLy8gSW5kaWNhdGUgdGhhdCBhIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGFic29sdXRlCi0gIC8vIHZvbHVtZS4KLSAgdmlydHVhbCB2b2lkIERldmljZUNvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpID0gMDsKLQotICAvLyBJbmRpY2F0ZSB0aGF0IGEgZGV2aWNlIGhhcyBiZWVuIGNvbm5lY3RlZCB0aGF0IGRvZXMgc3VwcG9ydCBhYnNvbHV0ZQotICAvLyB2b2x1bWUuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGltbWVkaWF0ZWx5IGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IHZvbHVtZQotICAvLyB3aGljaCB3aWxsIGJlIHNlbnQgdG8gdGhlIGRldmljZS4KLSAgdmlydHVhbCB2b2lkIERldmljZUNvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ2hhbmdlZENiIGNiKSA9IDA7Ci0KLSAgLy8gSW5kaWNhdGUgdGhhdCBhIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgZnJvbSBBVlJDUC4gV2lsbCB1bnJlZ2lzdGVyCi0gIC8vIGFueSBjYWxsYmFja3MgaWYgYWJzb2x1dGUgdm9sdW1lIGlzIHN1cHBvcnRlZC4KLSAgdmlydHVhbCB2b2lkIERldmljZURpc2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGludDhfdCB2b2x1bWUpID0gMDsKLQotICB2aXJ0dWFsIH5Wb2x1bWVJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBTZXJ2aWNlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIG1lZGlhSW50ZXJmYWNlIGNhbiBub3QgYmUgbnVsbC4gSWYgdm9sdW1lSW50ZXJmYWNlIGlzIG51bGwgdGhlbiBBYnNvbHV0ZQotICAvLyBWb2x1bWUgaXMgZGlzYWJsZWQuCi0gIHZpcnR1YWwgdm9pZCBJbml0KE1lZGlhSW50ZXJmYWNlKiBtZWRpYUludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lSW50ZXJmYWNlKiB2b2x1bWVJbnRlcmZhY2UpID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQmlwU2VydmVyKGludCBwc20pID0gMDsKLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJCaXBTZXJ2ZXIoKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBDb25uZWN0RGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikgPSAwOwotICB2aXJ0dWFsIGJvb2wgRGlzY29ubmVjdERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldEJpcENsaWVudFN0YXR1cyhjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsIGJvb2wgY29ubmVjdGVkKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBDbGVhbnVwKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5TZXJ2aWNlSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwX2NvbW1vbi5oIGIvaW5jbHVkZS9oYXJkd2FyZS9hdnJjcC9hdnJjcF9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyZjk1ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSA8YmFzZS9zeXNfYnl0ZW9yZGVyLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY29uc3RleHByIHVpbnQzMl90IEJMVUVUT09USF9DT01QQU5ZX0lEID0gMHgwMDE5NTg7Ci0KLWNvbnN0ZXhwciB1aW50OF90IE1BWF9UUkFOU0FDVElPTl9MQUJFTCA9IDB4RjsKLQotZW51bSBjbGFzcyBDVHlwZSA6IHVpbnQ4X3QgewotICBDT05UUk9MID0gMHgwLAotICBTVEFUVVMgPSAweDEsCi0gIE5PVElGWSA9IDB4MywKLSAgTk9UX0lNUExFTUVOVEVEID0gMHg4LAotICBBQ0NFUFRFRCA9IDB4OSwKLSAgUkVKRUNURUQgPSAweGEsCi0gIFNUQUJMRSA9IDB4YywKLSAgQ0hBTkdFRCA9IDB4ZCwKLSAgSU5URVJJTSA9IDB4ZiwKLX07Ci0KLWVudW0gY2xhc3MgT3Bjb2RlIDogdWludDhfdCB7Ci0gIFZFTkRPUiA9IDB4MDAsCi0gIFVOSVRfSU5GTyA9IDB4MzAsCi0gIFNVQlVOSVRfSU5GTyA9IDB4MzEsCi0gIFBBU1NfVEhST1VHSCA9IDB4N2MsCi19OwotCi0vLyBGb3VuZCBpbiBBVlJDUF92MS42LjEgU2VjdGlvbiA0LjUgVGFibGUgNC41Ci0vLyBTZWFyY2hpbmcgY2FuIGJlIGRvbmUgaW4gdGhlIHNwZWMgYnkgQ2FtZWwgQ2FzaW5nIHRoZSBjb25zdGFudCBuYW1lCi1lbnVtIGNsYXNzIENvbW1hbmRQZHUgOiB1aW50OF90IHsKLSAgR0VUX0NBUEFCSUxJVElFUyA9IDB4MTAsCi0gIExJU1RfQVBQTElDQVRJT05fU0VUVElOR19BVFRSSUJVVEVTID0gMHgxMSwKLSAgR0VUX0VMRU1FTlRfQVRUUklCVVRFUyA9IDB4MjAsCi0gIEdFVF9QTEFZX1NUQVRVUyA9IDB4MzAsCi0gIFJFR0lTVEVSX05PVElGSUNBVElPTiA9IDB4MzEsCi0gIFNFVF9BQlNPTFVURV9WT0xVTUUgPSAweDUwLAotICBTRVRfQUREUkVTU0VEX1BMQVlFUiA9IDB4NjAsCi0gIFBMQVlfSVRFTSA9IDB4NzQsCi19OwotCi1lbnVtIGNsYXNzIFBhY2tldFR5cGUgOiB1aW50OF90IHsKLSAgU0lOR0xFID0gMHgwMCwKLX07Ci0KLWVudW0gY2xhc3MgQ2FwYWJpbGl0eSA6IHVpbnQ4X3QgewotICBDT01QQU5ZX0lEID0gMHgwMiwKLSAgRVZFTlRTX1NVUFBPUlRFRCA9IDB4MDMsCi19OwotCi0vLyBGb3VuZCBpbiBBVlJDUF92MS42LjEgU2VjdGlvbiAyOCBBcHBlbmRpeCBICi1lbnVtIGNsYXNzIEV2ZW50IDogdWludDhfdCB7Ci0gIFBMQVlCQUNLX1NUQVRVU19DSEFOR0VEID0gMHgwMSwKLSAgVFJBQ0tfQ0hBTkdFRCA9IDB4MDIsCi0gIFBMQVlCQUNLX1BPU19DSEFOR0VEID0gMHgwNSwKLSAgUExBWUVSX0FQUExJQ0FUSU9OX1NFVFRJTkdfQ0hBTkdFRCA9IDB4MDgsCi0gIE5PV19QTEFZSU5HX0NPTlRFTlRfQ0hBTkdFRCA9IDB4MDksCi0gIEFWQUlMQUJMRV9QTEFZRVJTX0NIQU5HRUQgPSAweDBhLAotICBBRERSRVNTRURfUExBWUVSX0NIQU5HRUQgPSAweDBiLAotICBVSURTX0NIQU5HRUQgPSAweDBjLAotICBWT0xVTUVfQ0hBTkdFRCA9IDB4MGQsCi19OwotCi1lbnVtIGNsYXNzIEF0dHJpYnV0ZSA6IHVpbnQzMl90IHsKLSAgVElUTEUgPSAweDAxLAotICBBUlRJU1RfTkFNRSA9IDB4MDIsCi0gIEFMQlVNX05BTUUgPSAweDAzLAotICBUUkFDS19OVU1CRVIgPSAweDA0LAotICBUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTID0gMHgwNSwKLSAgR0VOUkUgPSAweDA2LAotICBQTEFZSU5HX1RJTUUgPSAweDA3LAotICBERUZBVUxUX0NPVkVSX0FSVCA9IDB4MDgsCi19OwotCi1lbnVtIGNsYXNzIFN0YXR1cyA6IHVpbnQ4X3QgewotICBJTlZBTElEX0NPTU1BTkQgPSAweDAwLAotICBJTlZBTElEX1BBUkFNRVRFUiA9IDB4MDEsCi0gIFBBUkFNRVRFUl9DT05URU5UX0VSUk9SID0gMHgwMiwKLSAgSU5URVJOQUxfRVJST1IgPSAweDAzLAotICBOT19FUlJPUiA9IDB4MDQsCi0gIFVJRFNfQ0hBTkdFRCA9IDB4MDUsCi0gIFJFU0VSVkVEID0gMHgwNiwKLSAgSU5WQUxJRF9ESVJFQ1RJT04gPSAweDA3LAotICBOT1RfQV9ESVJFQ1RPUlkgPSAweDA4LAotICBET0VTX05PVF9FWElTVCA9IDB4MDksCi0gIElOVkFMSURfU0NPUEUgPSAweDBhLAotICBSQU5HRV9PVVRfT0ZfQk9VTkRTID0gMHhiLAotICBGT0xERVJfSVRFTV9OT1RfUExBWUFCTEUgPSAweDBjLAotICBNRURJQV9JTl9VU0UgPSAweDBkLAotICBOT1dfUExBWUlOR19MSVNUX0ZVTEwgPSAweDBlLAotICBTRUFSQ0hfTk9UX1NVUFBPUlRFRCA9IDB4MGYsCi0gIFNFQVJDSF9JTl9QUk9HUkVTUyA9IDB4MTAsCi0gIElOVkFMSURfUExBWUVSX0lEID0gMHgxMSwKLSAgUExBWUVSX05PVF9CUk9XU0FCTEUgPSAweDEyLAotICBQTEFZRVJfTk9UX0FERFJFU1NFRCA9IDB4MTMsCi0gIE5PX1ZBTElEX1NFQVJDSF9SRVNVTFRTID0gMHgxNCwKLSAgTk9fQVZBSUxBQkxFX1BMQVlFUlMgPSAweDE1LAotICBBRERSRVNTRURfUExBWUVSX0NIQU5HRUQgPSAweDE2LAotfTsKLQotZW51bSBjbGFzcyBCcm93c2VQZHUgOiB1aW50OF90IHsKLSAgU0VUX0JST1dTRURfUExBWUVSID0gMHg3MCwKLSAgR0VUX0ZPTERFUl9JVEVNUyA9IDB4NzEsCi0gIENIQU5HRV9QQVRIID0gMHg3MiwKLSAgR0VUX0lURU1fQVRUUklCVVRFUyA9IDB4NzMsCi0gIEdFVF9UT1RBTF9OVU1CRVJfT0ZfSVRFTVMgPSAweDc1LAotICBHRU5FUkFMX1JFSkVDVCA9IDB4YTAsCi19OwotCi1lbnVtIGNsYXNzIFNjb3BlIDogdWludDhfdCB7Ci0gIE1FRElBX1BMQVlFUl9MSVNUID0gMHgwMCwKLSAgVkZTID0gMHgwMSwKLSAgU0VBUkNIID0gMHgwMiwKLSAgTk9XX1BMQVlJTkcgPSAweDAzLAotfTsKLQotZW51bSBjbGFzcyBEaXJlY3Rpb24gOiB1aW50OF90IHsKLSAgVVAgPSAweDAwLAotICBET1dOID0gMHgwMSwKLX07Ci0KLWVudW0gY2xhc3MgS2V5U3RhdGUgOiB1aW50OF90IHsKLSAgUFVTSEVEID0gMHgwMCwKLSAgUkVMRUFTRUQgPSAweDAxLAotfTsKLQotY2xhc3MgQXR0cmlidXRlRW50cnkgewotIHB1YmxpYzoKLSAgQXR0cmlidXRlRW50cnkoY29uc3QgQXR0cmlidXRlJiBhdHRyaWJ1dGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkKLSAgICAgIDogYXR0cmlidXRlXyhhdHRyaWJ1dGUpLCB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgQXR0cmlidXRlRW50cnkoY29uc3QgQXR0cmlidXRlJiBhdHRyaWJ1dGUpIDogYXR0cmlidXRlXyhhdHRyaWJ1dGUpIHt9Ci0KLSAgQXR0cmlidXRlRW50cnkoY29uc3QgQXR0cmlidXRlRW50cnkmKSA9IGRlZmF1bHQ7Ci0KLSAgQXR0cmlidXRlIGF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIGF0dHJpYnV0ZV87IH0KLQotICBzdGQ6OnN0cmluZyB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtIZWFkZXJTaXplKCkgewotICAgIHNpemVfdCByZXQgPSAwOwotICAgIHJldCArPSA0OyAgLy8gU2l6ZSBvZiBhdHRyaWJ1dGUgZmllbGQKLSAgICByZXQgKz0gMjsgIC8vIFNpemUgb2YgbGVuZ3RoIGZpZWxkCi0gICAgcmV0ICs9IDI7ICAvLyBTaXplIG9mIGNoYXJhY3RlciBlbmNvZGluZyBmaWVsZAotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGtIZWFkZXJTaXplKCkgKyB2YWx1ZV8uc2l6ZSgpOyB9Ci0KLSAgdm9pZCByZXNpemUoc2l6ZV90IG5ld19zaXplKSB7Ci0gICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA8IGtIZWFkZXJTaXplKCkgPyAwIDogbmV3X3NpemUgLSBrSGVhZGVyU2l6ZSgpOwotICAgIGlmICh2YWx1ZV8uc2l6ZSgpID4gbmV3X3NpemUpIHsKLSAgICAgIHZhbHVlXy5yZXNpemUobmV3X3NpemUpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgZW1wdHkoKSB7IHJldHVybiB2YWx1ZV8uZW1wdHkoKTsgfQotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEF0dHJpYnV0ZUVudHJ5JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gYXR0cmlidXRlXyA8IHJocy5hdHRyaWJ1dGVfOwotICB9Ci0KLSBwcml2YXRlOgotICBBdHRyaWJ1dGUgYXR0cmlidXRlXzsKLSAgc3RkOjpzdHJpbmcgdmFsdWVfOwotfTsKLQotY29uc3RleHByIHNpemVfdCBNQVhfRklFTERfTEVOID0gMTAwOwotCi1zdHJ1Y3QgTWVkaWFQbGF5ZXJJdGVtIHsKLSAgdWludDE2X3QgaWRfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgYm9vbCBicm93c2FibGVfOwotCi0gIE1lZGlhUGxheWVySXRlbSh1aW50MTZfdCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGJvb2wgYnJvd3NhYmxlKQotICAgICAgOiBpZF8oaWQpLCBuYW1lXyhuYW1lKSwgYnJvd3NhYmxlXyhicm93c2FibGUpIHsKLSAgICBpZiAobmFtZV8uc2l6ZSgpID4gTUFYX0ZJRUxEX0xFTikgewotICAgICAgbmFtZV8ucmVzaXplKE1BWF9GSUVMRF9MRU4pOwotICAgIH0KLSAgfQotCi0gIE1lZGlhUGxheWVySXRlbShjb25zdCBNZWRpYVBsYXllckl0ZW0mKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0hlYWRlclNpemUoKSB7Ci0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgcmV0ICs9IDE7ICAgLy8gTWVkaWEgUGxheWVyIFR5cGUKLSAgICByZXQgKz0gMjsgICAvLyBJdGVtIExlbmd0aAotICAgIHJldCArPSAyOyAgIC8vIFBsYXllciBJZAotICAgIHJldCArPSAxOyAgIC8vIFBsYXllciBUeXBlCi0gICAgcmV0ICs9IDQ7ICAgLy8gUGxheWVyIFN1YnR5cGUKLSAgICByZXQgKz0gMTsgICAvLyBQbGF5IFN0YXR1cwotICAgIHJldCArPSAxNjsgIC8vIEZlYXR1cmVzCi0gICAgcmV0ICs9IDI7ICAgLy8gVVRGLTggY2hhcmFjdGVyIHNldAotICAgIHJldCArPSAyOyAgIC8vIE5hbWUgTGVuZ3RoCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4ga0hlYWRlclNpemUoKSArIG5hbWVfLnNpemUoKTsgfQotfTsKLQotc3RydWN0IEZvbGRlckl0ZW0gewotICB1aW50NjRfdCB1aWRfOwotICB1aW50OF90IGZvbGRlcl90eXBlXzsKLSAgYm9vbCBpc19wbGF5YWJsZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIEZvbGRlckl0ZW0odWludDY0X3QgdWlkLCB1aW50OF90IGZvbGRlcl90eXBlLCBib29sIGlzX3BsYXlhYmxlLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQotICAgICAgOiB1aWRfKHVpZCksCi0gICAgICAgIGZvbGRlcl90eXBlXyhmb2xkZXJfdHlwZSksCi0gICAgICAgIGlzX3BsYXlhYmxlXyhpc19wbGF5YWJsZSksCi0gICAgICAgIG5hbWVfKG5hbWUpIHsKLSAgICBpZiAobmFtZV8uc2l6ZSgpID4gTUFYX0ZJRUxEX0xFTikgewotICAgICAgbmFtZV8ucmVzaXplKE1BWF9GSUVMRF9MRU4pOwotICAgIH0KLSAgfQotCi0gIEZvbGRlckl0ZW0oY29uc3QgRm9sZGVySXRlbSYpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrSGVhZGVyU2l6ZSgpIHsKLSAgICBzaXplX3QgcmV0ID0gMDsKLSAgICByZXQgKz0gMTsgIC8vIEZvbGRlciBJdGVtIFR5cGUKLSAgICByZXQgKz0gMjsgIC8vIEl0ZW0gTGVuZ3RoCi0gICAgcmV0ICs9IDg7ICAvLyBGb2xkZXIgVUlECi0gICAgcmV0ICs9IDE7ICAvLyBGb2xkZXIgVHlwZQotICAgIHJldCArPSAxOyAgLy8gSXMgUGxheWFibGUgYnl0ZQotICAgIHJldCArPSAyOyAgLy8gVVRGLTggQ2hhcmFjdGVyIFNldAotICAgIHJldCArPSAyOyAgLy8gTmFtZSBMZW5ndGgKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBrSGVhZGVyU2l6ZSgpICsgbmFtZV8uc2l6ZSgpOyB9Ci19OwotCi0vLyBOT1RFOiBXZSBuZXZlciB1c2UgbWVkaWEgdHlwZSBmaWVsZCBiZWNhdXNlIHdlIG9ubHkgc3VwcG9ydCBhdWRpbyB0eXBlcwotc3RydWN0IE1lZGlhRWxlbWVudEl0ZW0gewotICB1aW50NjRfdCB1aWRfID0gMDsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIHN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PiBhdHRyaWJ1dGVzXzsKLQotICAvLyBUcnVuY2F0ZSB0aGUgbmFtZSBhbmQgYXR0cmlidXRlIGZpZWxkcyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYSBzaW5nbGUgaXRlbQotICAvLyB0aGF0IGNhbiBleGNlZWQgdGhlIEJyb3dzaW5nIE1UVQotICBNZWRpYUVsZW1lbnRJdGVtKHVpbnQ2NF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8QXR0cmlidXRlRW50cnk+IGF0dHJpYnV0ZXMpCi0gICAgICA6IHVpZF8odWlkKSwgbmFtZV8obmFtZSkgewotICAgIGlmIChuYW1lXy5zaXplKCkgPiBNQVhfRklFTERfTEVOKSB7Ci0gICAgICBuYW1lXy5yZXNpemUoTUFYX0ZJRUxEX0xFTik7Ci0gICAgfQotCi0gICAgZm9yIChBdHRyaWJ1dGVFbnRyeSB2YWwgOiBhdHRyaWJ1dGVzKSB7Ci0gICAgICB2YWwucmVzaXplKE1BWF9GSUVMRF9MRU4pOwotICAgICAgYXR0cmlidXRlc18uaW5zZXJ0KHZhbCk7Ci0gICAgfQotICB9Ci0KLSAgTWVkaWFFbGVtZW50SXRlbShjb25zdCBNZWRpYUVsZW1lbnRJdGVtJikgPSBkZWZhdWx0OwotCi0gIHNpemVfdCBzaXplKCkgY29uc3QgewotICAgIHNpemVfdCByZXQgPSAwOwotICAgIHJldCArPSAxOyAgLy8gTWVkaWEgRWxlbWVudCBJdGVtIFR5cGUKLSAgICByZXQgKz0gMjsgIC8vIEl0ZW0gTGVuZ3RoCi0gICAgcmV0ICs9IDg7ICAvLyBJdGVtIFVJRAotICAgIHJldCArPSAxOyAgLy8gTWVkaWEgVHlwZQotICAgIHJldCArPSAyOyAgLy8gVVRGLTggQ2hhcmFjdGVyIFNldAotICAgIHJldCArPSAyOyAgLy8gTmFtZSBMZW5ndGgKLSAgICByZXQgKz0gbmFtZV8uc2l6ZSgpOwotICAgIHJldCArPSAxOyAgLy8gTnVtYmVyIG9mIEF0dHJpYnV0ZXMKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogYXR0cmlidXRlc18pIHsKLSAgICAgIHJldCArPSBlbnRyeS5zaXplKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotfTsKLQotc3RydWN0IE1lZGlhTGlzdEl0ZW0gewotICBlbnVtIDogdWludDhfdCB7IFBMQVlFUiA9IDB4MDEsIEZPTERFUiA9IDB4MDIsIFNPTkcgPSAweDAzIH0gdHlwZV87Ci0KLSAgdW5pb24gewotICAgIE1lZGlhUGxheWVySXRlbSBwbGF5ZXJfOwotICAgIEZvbGRlckl0ZW0gZm9sZGVyXzsKLSAgICBNZWRpYUVsZW1lbnRJdGVtIHNvbmdfOwotICB9OwotCi0gIE1lZGlhTGlzdEl0ZW0oTWVkaWFQbGF5ZXJJdGVtIGl0ZW0pIDogdHlwZV8oUExBWUVSKSwgcGxheWVyXyhpdGVtKSB7fQotCi0gIE1lZGlhTGlzdEl0ZW0oRm9sZGVySXRlbSBpdGVtKSA6IHR5cGVfKEZPTERFUiksIGZvbGRlcl8oaXRlbSkge30KLQotICBNZWRpYUxpc3RJdGVtKE1lZGlhRWxlbWVudEl0ZW0gaXRlbSkgOiB0eXBlXyhTT05HKSwgc29uZ18oaXRlbSkge30KLQotICBNZWRpYUxpc3RJdGVtKGNvbnN0IE1lZGlhTGlzdEl0ZW0mIGl0ZW0pIHsKLSAgICB0eXBlXyA9IGl0ZW0udHlwZV87Ci0gICAgc3dpdGNoIChpdGVtLnR5cGVfKSB7Ci0gICAgICBjYXNlIFBMQVlFUjoKLSAgICAgICAgbmV3ICgmcGxheWVyXykgTWVkaWFQbGF5ZXJJdGVtKGl0ZW0ucGxheWVyXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgRk9MREVSOgotICAgICAgICBuZXcgKCZmb2xkZXJfKSBGb2xkZXJJdGVtKGl0ZW0uZm9sZGVyXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09ORzoKLSAgICAgICAgbmV3ICgmc29uZ18pIE1lZGlhRWxlbWVudEl0ZW0oaXRlbS5zb25nXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICB+TWVkaWFMaXN0SXRlbSgpIHsKLSAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICBjYXNlIFBMQVlFUjoKLSAgICAgICAgcGxheWVyXy5+TWVkaWFQbGF5ZXJJdGVtKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgRk9MREVSOgotICAgICAgICBmb2xkZXJfLn5Gb2xkZXJJdGVtKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09ORzoKLSAgICAgICAgc29uZ18ufk1lZGlhRWxlbWVudEl0ZW0oKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHNpemVfdCBzaXplKCkgY29uc3QgewotICAgIHN3aXRjaCAodHlwZV8pIHsKLSAgICAgIGNhc2UgUExBWUVSOgotICAgICAgICByZXR1cm4gcGxheWVyXy5zaXplKCk7Ci0gICAgICBjYXNlIEZPTERFUjoKLSAgICAgICAgcmV0dXJuIGZvbGRlcl8uc2l6ZSgpOwotICAgICAgY2FzZSBTT05HOgotICAgICAgICByZXR1cm4gc29uZ18uc2l6ZSgpOwotICAgIH0KLSAgfQotfTsKLQotY29uc3RleHByIHNpemVfdCBBVkNUX0hEUl9MRU4gPSAzOwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwX2xvZ2dpbmdfaGVscGVyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2F2cmNwL2F2cmNwX2xvZ2dpbmdfaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUzMzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9hdnJjcC9hdnJjcF9sb2dnaW5nX2hlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotI2luY2x1ZGUgImF2cmNwX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0KLWlubGluZSBzdGQ6OnN0cmluZyBDVHlwZVRleHQoY29uc3QgQ1R5cGUmIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDVHlwZTo6Q09OVFJPTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDVHlwZTo6U1RBVFVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENUeXBlOjpOT1RJRlkpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ1R5cGU6OkFDQ0VQVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENUeXBlOjpSRUpFQ1RFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDVHlwZTo6U1RBQkxFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENUeXBlOjpDSEFOR0VEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENUeXBlOjpJTlRFUklNKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIENUeXBlOiAiICsgbG9naGV4KCh1aW50OF90KXR5cGUpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQ1R5cGUmIHR5cGUpIHsKLSAgcmV0dXJuIG9zIDw8IENUeXBlVGV4dCh0eXBlKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIE9wY29kZVRleHQoY29uc3QgT3Bjb2RlJiBvcGNvZGUpIHsKLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKE9wY29kZTo6VkVORE9SKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKE9wY29kZTo6VU5JVF9JTkZPKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKE9wY29kZTo6U1VCVU5JVF9JTkZPKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKE9wY29kZTo6UEFTU19USFJPVUdIKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIE9wY29kZTogIiArIGxvZ2hleCgodWludDhfdClvcGNvZGUpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgT3Bjb2RlJiBvcGNvZGUpIHsKLSAgcmV0dXJuIG9zIDw8IE9wY29kZVRleHQob3Bjb2RlKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIENvbW1hbmRQZHVUZXh0KGNvbnN0IENvbW1hbmRQZHUmIHBkdSkgewotICBzd2l0Y2ggKHBkdSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQ29tbWFuZFBkdTo6R0VUX0NBUEFCSUxJVElFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDb21tYW5kUGR1OjpMSVNUX0FQUExJQ0FUSU9OX1NFVFRJTkdfQVRUUklCVVRFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDb21tYW5kUGR1OjpHRVRfRUxFTUVOVF9BVFRSSUJVVEVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENvbW1hbmRQZHU6OkdFVF9QTEFZX1NUQVRVUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDb21tYW5kUGR1OjpSRUdJU1RFUl9OT1RJRklDQVRJT04pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ29tbWFuZFBkdTo6U0VUX0FCU09MVVRFX1ZPTFVNRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDb21tYW5kUGR1OjpTRVRfQUREUkVTU0VEX1BMQVlFUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDb21tYW5kUGR1OjpQTEFZX0lURU0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gQ29tbWFuZCBQRFU6ICIgKyBsb2doZXgoKHVpbnQ4X3QpcGR1KTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENvbW1hbmRQZHUmIHBkdSkgewotICByZXR1cm4gb3MgPDwgQ29tbWFuZFBkdVRleHQocGR1KTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIFBhY2tldFR5cGVUZXh0KGNvbnN0IFBhY2tldFR5cGUmIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQYWNrZXRUeXBlOjpTSU5HTEUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gUGFja2V0IFR5cGU6ICIgKyBsb2doZXgoKHVpbnQ4X3QpdHlwZSk7Ci0gIH0KLX0KLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBQYWNrZXRUeXBlJiB0eXBlKSB7Ci0gIHJldHVybiBvcyA8PCBQYWNrZXRUeXBlVGV4dCh0eXBlKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIENhcGFiaWxpdHlUZXh0KGNvbnN0IENhcGFiaWxpdHkmIGNhcCkgewotICBzd2l0Y2ggKGNhcCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQ2FwYWJpbGl0eTo6Q09NUEFOWV9JRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChDYXBhYmlsaXR5OjpFVkVOVFNfU1VQUE9SVEVEKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIENhcGFiaWxpdHk6ICIgKyBsb2doZXgoKHVpbnQ4X3QpY2FwKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENhcGFiaWxpdHkmIGNhcCkgewotICByZXR1cm4gb3MgPDwgQ2FwYWJpbGl0eVRleHQoY2FwKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIEV2ZW50VGV4dChjb25zdCBFdmVudCYgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoRXZlbnQ6OlBMQVlCQUNLX1NUQVRVU19DSEFOR0VEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEV2ZW50OjpUUkFDS19DSEFOR0VEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEV2ZW50OjpQTEFZQkFDS19QT1NfQ0hBTkdFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChFdmVudDo6UExBWUVSX0FQUExJQ0FUSU9OX1NFVFRJTkdfQ0hBTkdFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChFdmVudDo6Tk9XX1BMQVlJTkdfQ09OVEVOVF9DSEFOR0VEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEV2ZW50OjpBVkFJTEFCTEVfUExBWUVSU19DSEFOR0VEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEV2ZW50OjpBRERSRVNTRURfUExBWUVSX0NIQU5HRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRXZlbnQ6OlVJRFNfQ0hBTkdFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChFdmVudDo6Vk9MVU1FX0NIQU5HRUQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gRXZlbnQ6ICIgKyBsb2doZXgoKHVpbnQ4X3QpZXZlbnQpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRXZlbnQmIGV2ZW50KSB7Ci0gIHJldHVybiBvcyA8PCBFdmVudFRleHQoZXZlbnQpOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgQXR0cmlidXRlVGV4dChjb25zdCBBdHRyaWJ1dGUmIGF0dHIpIHsKLSAgc3dpdGNoIChhdHRyKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGU6OlRJVExFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQXR0cmlidXRlOjpBTEJVTV9OQU1FKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGU6OkdFTlJFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZTo6UExBWUlOR19USU1FKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gQXR0cmlidXRlIFZhbHVlOiAiICsgbG9naGV4KCh1aW50MzJfdClhdHRyKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEF0dHJpYnV0ZSYgYXR0cikgewotICByZXR1cm4gb3MgPDwgQXR0cmlidXRlVGV4dChhdHRyKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIFN0YXR1c1RleHQoY29uc3QgU3RhdHVzJiBzdGF0dXMpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6SU5WQUxJRF9DT01NQU5EKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU3RhdHVzOjpQQVJBTUVURVJfQ09OVEVOVF9FUlJPUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6OklOVEVSTkFMX0VSUk9SKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6Tk9fRVJST1IpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU3RhdHVzOjpVSURTX0NIQU5HRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU3RhdHVzOjpSRVNFUlZFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6OklOVkFMSURfRElSRUNUSU9OKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6Tk9UX0FfRElSRUNUT1JZKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6RE9FU19OT1RfRVhJU1QpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU3RhdHVzOjpJTlZBTElEX1NDT1BFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6UkFOR0VfT1VUX09GX0JPVU5EUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6OkZPTERFUl9JVEVNX05PVF9QTEFZQUJMRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6Ok1FRElBX0lOX1VTRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6Ok5PV19QTEFZSU5HX0xJU1RfRlVMTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6OlNFQVJDSF9OT1RfU1VQUE9SVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6U0VBUkNIX0lOX1BST0dSRVNTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6SU5WQUxJRF9QTEFZRVJfSUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU3RhdHVzOjpQTEFZRVJfTk9UX0JST1dTQUJMRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6OlBMQVlFUl9OT1RfQUREUkVTU0VEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFN0YXR1czo6Tk9fVkFMSURfU0VBUkNIX1JFU1VMVFMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU3RhdHVzOjpOT19BVkFJTEFCTEVfUExBWUVSUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTdGF0dXM6OkFERFJFU1NFRF9QTEFZRVJfQ0hBTkdFRCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBTdGF0dXM6ICIgKyBsb2doZXgoKHVpbnQ4X3Qpc3RhdHVzKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0YXR1cyYgc3RhdHVzKSB7Ci0gIHJldHVybiBvcyA8PCBTdGF0dXNUZXh0KHN0YXR1cyk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBCcm93c2VQZHVUZXh0KGNvbnN0IEJyb3dzZVBkdSYgcGR1KSB7Ci0gIHN3aXRjaCAocGR1KSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCcm93c2VQZHU6OlNFVF9CUk9XU0VEX1BMQVlFUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCcm93c2VQZHU6OkdFVF9GT0xERVJfSVRFTVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQnJvd3NlUGR1OjpDSEFOR0VfUEFUSCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCcm93c2VQZHU6OkdFVF9JVEVNX0FUVFJJQlVURVMpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gQnJvd3NlIFBEVTogIiArIGxvZ2hleCgodWludDhfdClwZHUpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQnJvd3NlUGR1JiBwZHUpIHsKLSAgcmV0dXJuIG9zIDw8IEJyb3dzZVBkdVRleHQocGR1KTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIFNjb3BlVGV4dChjb25zdCBTY29wZSYgc2NvcGUpIHsKLSAgc3dpdGNoIChzY29wZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoU2NvcGU6Ok1FRElBX1BMQVlFUl9MSVNUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNjb3BlOjpWRlMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU2NvcGU6OlNFQVJDSCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTY29wZTo6Tk9XX1BMQVlJTkcpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gU2NvcGU6ICIgKyBsb2doZXgoKHVpbnQ4X3Qpc2NvcGUpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgU2NvcGUmIHBkdSkgewotICByZXR1cm4gb3MgPDwgU2NvcGVUZXh0KHBkdSk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBEaXJlY3Rpb25UZXh0KGNvbnN0IERpcmVjdGlvbiYgZGlyKSB7Ci0gIHN3aXRjaCAoZGlyKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChEaXJlY3Rpb246OlVQKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKERpcmVjdGlvbjo6RE9XTik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBEaXJlY3Rpb246ICIgKyBsb2doZXgoKHVpbnQ4X3QpZGlyKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IERpcmVjdGlvbiYgZGlyKSB7Ci0gIHJldHVybiBvcyA8PCBEaXJlY3Rpb25UZXh0KGRpcik7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBLZXlTdGF0ZVRleHQoY29uc3QgS2V5U3RhdGUmIHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEtleVN0YXRlOjpQVVNIRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoS2V5U3RhdGU6OlJFTEVBU0VEKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIEtleVN0YXRlOiAiICsgbG9naGV4KCh1aW50OF90KXN0YXRlKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEtleVN0YXRlJiBkaXIpIHsKLSAgcmV0dXJuIG9zIDw8IEtleVN0YXRlVGV4dChkaXIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYmxlX2FkdmVydGlzZXIuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYmxlX2FkdmVydGlzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlNGE1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2JsZV9hZHZlcnRpc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JMRV9BRFZFUlRJU0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JMRV9BRFZFUlRJU0VSX0gKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oPgotI2luY2x1ZGUgPHJhd19hZGRyZXNzLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidF9jb21tb25fdHlwZXMuaCIKLSNpbmNsdWRlICJidF9nYXR0X3R5cGVzLmgiCi0KLXN0cnVjdCBBZHZlcnRpc2VQYXJhbWV0ZXJzIHsKLSAgdWludDE2X3QgYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllczsKLSAgdWludDMyX3QgbWluX2ludGVydmFsOwotICB1aW50MzJfdCBtYXhfaW50ZXJ2YWw7Ci0gIHVpbnQ4X3QgY2hhbm5lbF9tYXA7Ci0gIGludDhfdCB0eF9wb3dlcjsKLSAgdWludDhfdCBwcmltYXJ5X2FkdmVydGlzaW5nX3BoeTsKLSAgdWludDhfdCBzZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5OwotICB1aW50OF90IHNjYW5fcmVxdWVzdF9ub3RpZmljYXRpb25fZW5hYmxlOwotfTsKLQotc3RydWN0IFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHsKLSAgdWludDhfdCBlbmFibGU7Ci0gIHVpbnQxNl90IG1pbl9pbnRlcnZhbDsKLSAgdWludDE2X3QgbWF4X2ludGVydmFsOwotICB1aW50MTZfdCBwZXJpb2RpY19hZHZlcnRpc2luZ19wcm9wZXJ0aWVzOwotfTsKLQotLyoqCi0gKiBMRSBBZHZlcnRpc2luZyByZWxhdGVkIGNhbGxiYWNrcyBpbnZva2VkIGZyb20gZnJvbSB0aGUgQmx1ZXRvb3RoIG5hdGl2ZSBzdGFjawotICogQWxsIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbiB0aGUgSk5JIHRocmVhZAotICovCi1jbGFzcyBBZHZlcnRpc2luZ0NhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5BZHZlcnRpc2luZ0NhbGxiYWNrcygpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE9uQWR2ZXJ0aXNpbmdTZXRTdGFydGVkKGludCByZWdfaWQsIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCB0eF9wb3dlciwgdWludDhfdCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQWR2ZXJ0aXNpbmdFbmFibGVkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25BZHZlcnRpc2luZ0RhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TY2FuUmVzcG9uc2VEYXRhU2V0KHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25QZXJpb2RpY0FkdmVydGlzaW5nRGF0YVNldCh1aW50OF90IGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbk93bkFkZHJlc3NSZWFkKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBhZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MgYWRkcmVzcykgPSAwOwotfTsKLQotY2xhc3MgQmxlQWR2ZXJ0aXNlckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5CbGVBZHZlcnRpc2VySW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gbXVsdGktYWR2IG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCi0gIHVzaW5nIFN0YXR1c0NhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLyk+OwotICB1c2luZyBJZFN0YXR1c0NhbGxiYWNrID0KLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBhZHZlcnRpc2VyX2lkICovLCB1aW50OF90IC8qIHN0YXR1cyAqLyk+OwotICB1c2luZyBJZFR4UG93ZXJTdGF0dXNDYWxsYmFjayA9Ci0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogYWR2ZXJ0aXNlcl9pZCAqLywgaW50OF90IC8qIHR4X3Bvd2VyICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IC8qIHN0YXR1cyAqLyk+OwotICB1c2luZyBQYXJhbWV0ZXJzQ2FsbGJhY2sgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLywgaW50OF90IC8qIHR4X3Bvd2VyICovKT47Ci0KLSAgLyoqIFJlZ2lzdGVycyBhbiBhZHZlcnRpc2VyIHdpdGggdGhlIHN0YWNrICovCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckFkdmVydGlzZXIoSWRTdGF0dXNDYWxsYmFjaykgPSAwOwotCi0gIHVzaW5nIEdldEFkZHJlc3NDYWxsYmFjayA9Ci0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogYWRkcmVzc190eXBlKi8sIFJhd0FkZHJlc3MgLyphZGRyZXNzKi8pPjsKLSAgdmlydHVhbCB2b2lkIEdldE93bkFkZHJlc3ModWludDhfdCBhZHZlcnRpc2VyX2lkLCBHZXRBZGRyZXNzQ2FsbGJhY2sgY2IpID0gMDsKLQotICAvKiBTZXQgdGhlIHBhcmFtZXRlcnMgYXMgcGVyIHNwZWMsIHVzZXIgbWFudWFsIHNwZWNpZmllZCB2YWx1ZXMgKi8KLSAgdmlydHVhbCB2b2lkIFNldFBhcmFtZXRlcnModWludDhfdCBhZHZlcnRpc2VyX2lkLCBBZHZlcnRpc2VQYXJhbWV0ZXJzIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0NhbGxiYWNrIGNiKSA9IDA7Ci0KLSAgLyogU2V0dXAgdGhlIGRhdGEgKi8KLSAgdmlydHVhbCB2b2lkIFNldERhdGEoaW50IGFkdmVydGlzZXJfaWQsIGJvb2wgc2V0X3NjYW5fcnNwLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLCBTdGF0dXNDYWxsYmFjayBjYikgPSAwOwotCi0gIC8qIEVuYWJsZSB0aGUgYWR2ZXJ0aXNpbmcgaW5zdGFuY2UgKi8KLSAgdmlydHVhbCB2b2lkIEVuYWJsZSh1aW50OF90IGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLCBTdGF0dXNDYWxsYmFjayBjYiwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkdXJhdGlvbiwgdWludDhfdCBtYXhFeHRBZHZFdmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgdGltZW91dF9jYikgPSAwOwotCi0gIC8qICBVbnJlZ2lzdGVycyBhbiBhZHZlcnRpc2VyICovCi0gIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBTdGFydEFkdmVydGlzaW5nKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgU3RhdHVzQ2FsbGJhY2sgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmVydGlzZVBhcmFtZXRlcnMgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dF9zLCBTdGF0dXNDYWxsYmFjayB0aW1lb3V0X2NiKSA9IDA7Ci0KLSAgLyoqIFN0YXJ0IHRoZSBhZHZlcnRpc2luZyBzZXQuIFRoaXMgaW5jbHVkZSByZWdpc3RlcmluZywgc2V0dGluZyBhbGwKLSAgICogcGFyYW1ldGVycyBhbmQgZGF0YSwgYW5kIGVuYWJsaW5nIGl0LiB8cmVnaXN0ZXJfY2J8IGlzIGNhbGxlZCB3aGVuIHRoZSBzZXQKLSAgICogaXMgYWR2ZXJ0aXNpbmcuIHx0aW1lb3V0X2NifCBpcyBjYWxsZWQgd2hlbiB0aGUgdGltZW91dF9zIGhhdmUgcGFzc2VkLgotICAgKiB8cmVnX2lkfCBpcyB0aGUgY2FsbGJhY2sgaWQgYXNzaWduZWQgZnJvbSB1cHBlciBsYXllciAqLwotICB2aXJ0dWFsIHZvaWQgU3RhcnRBZHZlcnRpc2luZ1NldCgKLSAgICAgIGludCByZWdfaWQsIElkVHhQb3dlclN0YXR1c0NhbGxiYWNrIHJlZ2lzdGVyX2NiLAotICAgICAgQWR2ZXJ0aXNlUGFyYW1ldGVycyBwYXJhbXMsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfcGFyYW1zLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGVyaW9kaWNfZGF0YSwgdWludDE2X3QgZHVyYXRpb24sCi0gICAgICB1aW50OF90IG1heEV4dEFkdkV2ZW50cywgSWRTdGF0dXNDYWxsYmFjayB0aW1lb3V0X2NiKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKAotICAgICAgaW50IGFkdmVydGlzZXJfaWQsIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsCi0gICAgICBTdGF0dXNDYWxsYmFjayBjYikgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YShpbnQgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayBjYikgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlKGludCBhZHZlcnRpc2VyX2lkLCBib29sIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2IpID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKEFkdmVydGlzaW5nQ2FsbGJhY2tzKiBjYWxsYmFja3MpID0gMDsKLX07Ci0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQkxFX0FEVkVSVElTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9ibGVfc2Nhbm5lci5oIGIvaW5jbHVkZS9oYXJkd2FyZS9ibGVfc2Nhbm5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2U4MDViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYmxlX3NjYW5uZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQkxFX1NDQU5ORVJfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQkxFX1NDQU5ORVJfSAotCi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3V1aWQuaD4KLSNpbmNsdWRlIDxyYXdfYWRkcmVzcy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0X2NvbW1vbl90eXBlcy5oIgotI2luY2x1ZGUgImJ0X2dhdHRfY2xpZW50LmgiCi0jaW5jbHVkZSAiYnRfZ2F0dF90eXBlcy5oIgotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGJhdGNoc2NhbiByZXBvcnRzIGFyZSBvYnRhaW5lZCAqLwotdHlwZWRlZiB2b2lkICgqYmF0Y2hzY2FuX3JlcG9ydHNfY2FsbGJhY2spKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcG9ydF9mb3JtYXQsIGludCBudW1fcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBiYXRjaHNjYW4gc3RvcmFnZSB0aHJlc2hvbGQgbGltaXQgaXMgY3Jvc3NlZCAqLwotdHlwZWRlZiB2b2lkICgqYmF0Y2hzY2FuX3RocmVzaG9sZF9jYWxsYmFjaykoaW50IGNsaWVudF9pZik7Ci0KLS8qKiBUcmFjayBBRFYgVlNFIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0cmFja2VkIGRldmljZSBpcyBmb3VuZCBvciBsb3N0ICovCi10eXBlZGVmIHZvaWQgKCp0cmFja19hZHZfZXZlbnRfY2FsbGJhY2spKAotICAgIGJ0Z2F0dF90cmFja19hZHZfaW5mb190KiBwX3RyYWNrX2Fkdl9pbmZvKTsKLQotLyoqIENhbGxiYWNrIGZvciBzY2FuIHJlc3VsdHMgKi8KLXR5cGVkZWYgdm9pZCAoKnNjYW5fcmVzdWx0X2NhbGxiYWNrKSh1aW50MTZfdCBldmVudF90eXBlLCB1aW50OF90IGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZGEsIHVpbnQ4X3QgcHJpbWFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmRhcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLCBpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHJzc2ksIHVpbnQxNl90IHBlcmlvZGljX2Fkdl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGEpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNjYW5fcmVzdWx0X2NhbGxiYWNrIHNjYW5fcmVzdWx0X2NiOwotICBiYXRjaHNjYW5fcmVwb3J0c19jYWxsYmFjayBiYXRjaHNjYW5fcmVwb3J0c19jYjsKLSAgYmF0Y2hzY2FuX3RocmVzaG9sZF9jYWxsYmFjayBiYXRjaHNjYW5fdGhyZXNob2xkX2NiOwotICB0cmFja19hZHZfZXZlbnRfY2FsbGJhY2sgdHJhY2tfYWR2X2V2ZW50X2NiOwotfSBidGdhdHRfc2Nhbm5lcl9jYWxsYmFja3NfdDsKLQotY2xhc3MgQWR2ZXJ0aXNpbmdUcmFja0luZm8gewotIHB1YmxpYzoKLSAgdWludDhfdCBzY2FubmVyX2lkOwotICB1aW50OF90IGZpbHRlcl9pbmRleDsKLSAgdWludDhfdCBhZHZlcnRpc2VyX3N0YXRlOwotICB1aW50OF90IGFkdmVydGlzZXJfaW5mb19wcmVzZW50OwotICBSYXdBZGRyZXNzIGFkdmVydGlzZXJfYWRkcmVzczsKLSAgdWludDhfdCBhZHZlcnRpc2VyX2FkZHJlc3NfdHlwZTsKLSAgdWludDhfdCB0eF9wb3dlcjsKLSAgaW50OF90IHJzc2k7Ci0gIHVpbnQxNl90IHRpbWVfc3RhbXA7Ci0gIHVpbnQ4X3QgYWR2X3BhY2tldF9sZW47Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9wYWNrZXQ7Ci0gIHVpbnQ4X3Qgc2Nhbl9yZXNwb25zZV9sZW47Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2U7Ci19OwotCi0vKioKLSAqIExFIFNjYW5uaW5nIHJlbGF0ZWQgY2FsbGJhY2tzIGludm9rZWQgZnJvbSBmcm9tIHRoZSBCbHVldG9vdGggbmF0aXZlIHN0YWNrCi0gKiBBbGwgY2FsbGJhY2tzIGFyZSBpbnZva2VkIG9uIHRoZSBKTkkgdGhyZWFkCi0gKi8KLWNsYXNzIFNjYW5uaW5nQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNjYW5uaW5nQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIHZvaWQgT25TY2FubmVyUmVnaXN0ZXJlZChjb25zdCBibHVldG9vdGg6OlV1aWQgYXBwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Nhbm5lcklkLCB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TZXRTY2FubmVyUGFyYW1ldGVyQ29tcGxldGUodWludDhfdCBzY2FubmVySWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TY2FuUmVzdWx0KHVpbnQxNl90IGV2ZW50X3R5cGUsIHVpbnQ4X3QgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MgYmRhLCB1aW50OF90IHByaW1hcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR4X3Bvd2VyLCBpbnQ4X3QgcnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblRyYWNrQWR2Rm91bmRMb3N0KAotICAgICAgQWR2ZXJ0aXNpbmdUcmFja0luZm8gYWR2ZXJ0aXNpbmdfdHJhY2tfaW5mbykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25CYXRjaFNjYW5SZXBvcnRzKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsIGludCByZXBvcnRfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkJhdGNoU2NhblRocmVzaG9sZENyb3NzZWQoaW50IGNsaWVudF9pZikgPSAwOwotfTsKLQotY2xhc3MgQmxlU2Nhbm5lckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5CbGVTY2FubmVySW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIHVzaW5nIFJlZ2lzdGVyQ2FsbGJhY2sgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHNjYW5uZXJfaWQgKi8sIHVpbnQ4X3QgLyogYnRtX3N0YXR1cyAqLyk+OwotCi0gIHVzaW5nIENhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGJ0bV9zdGF0dXMgKi8pPjsKLQotICB1c2luZyBFbmFibGVDYWxsYmFjayA9Ci0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogYWN0aW9uICovLCB1aW50OF90IC8qIGJ0bV9zdGF0dXMgKi8pPjsKLQotICB1c2luZyBGaWx0ZXJQYXJhbVNldHVwQ2FsbGJhY2sgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGF2Ymxfc3BhY2UgKi8sIHVpbnQ4X3QgLyogYWN0aW9uX3R5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgLyogYnRtX3N0YXR1cyAqLyk+OwotCi0gIHVzaW5nIEZpbHRlckNvbmZpZ0NhbGxiYWNrID0KLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBmaWx0X3R5cGUgKi8sIHVpbnQ4X3QgLyogYXZibF9zcGFjZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAvKiBhY3Rpb24gKi8sIHVpbnQ4X3QgLyogYnRtX3N0YXR1cyAqLyk+OwotCi0gIC8qKiBSZWdpc3RlcnMgYSBzY2FubmVyIHdpdGggdGhlIHN0YWNrICovCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlclNjYW5uZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckNhbGxiYWNrKSA9IDA7Ci0KLSAgLyoqIFVucmVnaXN0ZXIgYSBzY2FubmVyIGZyb20gdGhlIHN0YWNrICovCi0gIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyKGludCBzY2FubmVyX2lkKSA9IDA7Ci0KLSAgLyoqIFN0YXJ0IG9yIHN0b3AgTEUgZGV2aWNlIHNjYW5uaW5nICovCi0gIHZpcnR1YWwgdm9pZCBTY2FuKGJvb2wgc3RhcnQpID0gMDsKLQotICAvKiogU2V0dXAgc2NhbiBmaWx0ZXIgcGFyYW1zICovCi0gIHZpcnR1YWwgdm9pZCBTY2FuRmlsdGVyUGFyYW1TZXR1cCgKLSAgICAgIHVpbnQ4X3QgY2xpZW50X2lmLCB1aW50OF90IGFjdGlvbiwgdWludDhfdCBmaWx0X2luZGV4LAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q+IGZpbHRfcGFyYW0sCi0gICAgICBGaWx0ZXJQYXJhbVNldHVwQ2FsbGJhY2sgY2IpID0gMDsKLQotICAvKiogQ29uZmlndXJlIGEgc2NhbiBmaWx0ZXIgY29uZGl0aW9uICAqLwotICB2aXJ0dWFsIHZvaWQgU2NhbkZpbHRlckFkZChpbnQgZmlsdGVyX2luZGV4LCBzdGQ6OnZlY3RvcjxBcGNmQ29tbWFuZD4gZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29uZmlnQ2FsbGJhY2sgY2IpID0gMDsKLQotICAvKiogQ2xlYXIgYWxsIHNjYW4gZmlsdGVyIGNvbmRpdGlvbnMgZm9yIHNwZWNpZmljIGZpbHRlciBpbmRleCovCi0gIHZpcnR1YWwgdm9pZCBTY2FuRmlsdGVyQ2xlYXIoaW50IGZpbHRfaW5kZXgsIEZpbHRlckNvbmZpZ0NhbGxiYWNrIGNiKSA9IDA7Ci0KLSAgLyoqIEVuYWJsZSAvIGRpc2FibGUgc2NhbiBmaWx0ZXIgZmVhdHVyZSovCi0gIHZpcnR1YWwgdm9pZCBTY2FuRmlsdGVyRW5hYmxlKGJvb2wgZW5hYmxlLCBFbmFibGVDYWxsYmFjayBjYikgPSAwOwotCi0gIC8qKiBTZXRzIHRoZSBMRSBzY2FuIGludGVydmFsIGFuZCB3aW5kb3cgaW4gdW5pdHMgb2YgTiowLjYyNSBtc2VjICovCi0gIHZpcnR1YWwgdm9pZCBTZXRTY2FuUGFyYW1ldGVycyhpbnQgc2Nhbm5lcl9pZCwgaW50IHNjYW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Nhbl93aW5kb3csIENhbGxiYWNrIGNiKSA9IDA7Ci0KLSAgLyogQ29uZmlndXJlIHRoZSBiYXRjaHNjYW4gc3RvcmFnZSAqLwotICB2aXJ0dWFsIHZvaWQgQmF0Y2hzY2FuQ29uZmlnU3RvcmFnZShpbnQgY2xpZW50X2lmLCBpbnQgYmF0Y2hfc2Nhbl9mdWxsX21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhdGNoX3NjYW5fdHJ1bmNfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBjYikgPSAwOwotCi0gIC8qIEVuYWJsZSBiYXRjaHNjYW4gKi8KLSAgdmlydHVhbCB2b2lkIEJhdGNoc2NhbkVuYWJsZShpbnQgc2Nhbl9tb2RlLCBpbnQgc2Nhbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Nhbl93aW5kb3csIGludCBhZGRyX3R5cGUsIGludCBkaXNjYXJkX3J1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgY2IpID0gMDsKLQotICAvKiBEaXNhYmxlIGJhdGNoc2NhbiAqLwotICB2aXJ0dWFsIHZvaWQgQmF0Y2hzY2FuRGlzYWJsZShDYWxsYmFjayBjYikgPSAwOwotCi0gIC8qIFJlYWQgb3V0IGJhdGNoc2NhbiByZXBvcnRzICovCi0gIHZpcnR1YWwgdm9pZCBCYXRjaHNjYW5SZWFkUmVwb3J0cyhpbnQgY2xpZW50X2lmLCBpbnQgc2Nhbl9tb2RlKSA9IDA7Ci0KLSAgdXNpbmcgU3RhcnRTeW5jQ2IgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IHN0YXR1cywgdWludDE2X3Qgc3luY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLCB1aW50OF90IGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyBhZGRyZXNzLCB1aW50OF90IHBoeSwgdWludDE2X3QgaW50ZXJ2YWwpPjsKLSAgdXNpbmcgU3luY1JlcG9ydENiID0KLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDE2X3Qgc3luY19oYW5kbGUsIGludDhfdCB0eF9wb3dlciwgaW50OF90IHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKT47Ci0gIHVzaW5nIFN5bmNMb3N0Q2IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQxNl90IHN5bmNfaGFuZGxlKT47Ci0gIHZpcnR1YWwgdm9pZCBTdGFydFN5bmModWludDhfdCBzaWQsIFJhd0FkZHJlc3MgYWRkcmVzcywgdWludDE2X3Qgc2tpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0LCBTdGFydFN5bmNDYiBzdGFydF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jUmVwb3J0Q2IgcmVwb3J0X2NiLCBTeW5jTG9zdENiIGxvc3RfY2IpID0gMDsKLSAgdmlydHVhbCB2b2lkIFN0b3BTeW5jKHVpbnQxNl90IGhhbmRsZSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckNhbGxiYWNrcyhTY2FubmluZ0NhbGxiYWNrcyogY2FsbGJhY2tzKSA9IDA7Ci19OwotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JMRV9TQ0FOTkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmggYi9pbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODA2OWRiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JMVUVUT09USF9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CTFVFVE9PVEhfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAiYXZyY3AvYXZyY3AuaCIKLSNpbmNsdWRlICJibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgImJ0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLS8qKgotICogVGhlIEJsdWV0b290aCBIYXJkd2FyZSBNb2R1bGUgSUQKLSAqLwotCi0jZGVmaW5lIEJUX0hBUkRXQVJFX01PRFVMRV9JRCAiYmx1ZXRvb3RoIgotI2RlZmluZSBCVF9TVEFDS19NT0RVTEVfSUQgImJsdWV0b290aCIKLQotLyoqIEJsdWV0b290aCBwcm9maWxlIGludGVyZmFjZSBJRHMgKi8KLSNkZWZpbmUgQlRfUFJPRklMRV9IQU5EU0ZSRUVfSUQgImhhbmRzZnJlZSIKLSNkZWZpbmUgQlRfUFJPRklMRV9IQU5EU0ZSRUVfQ0xJRU5UX0lEICJoYW5kc2ZyZWVfY2xpZW50IgotI2RlZmluZSBCVF9QUk9GSUxFX0FEVkFOQ0VEX0FVRElPX0lEICJhMmRwIgotI2RlZmluZSBCVF9QUk9GSUxFX0FEVkFOQ0VEX0FVRElPX1NJTktfSUQgImEyZHBfc2luayIKLSNkZWZpbmUgQlRfUFJPRklMRV9TT0NLRVRTX0lEICJzb2NrZXQiCi0jZGVmaW5lIEJUX1BST0ZJTEVfSElESE9TVF9JRCAiaGlkaG9zdCIKLSNkZWZpbmUgQlRfUFJPRklMRV9ISURERVZfSUQgImhpZGRldiIKLSNkZWZpbmUgQlRfUFJPRklMRV9QQU5fSUQgInBhbiIKLSNkZWZpbmUgQlRfUFJPRklMRV9NQVBfQ0xJRU5UX0lEICJtYXBfY2xpZW50IgotI2RlZmluZSBCVF9QUk9GSUxFX1NEUF9DTElFTlRfSUQgInNkcCIKLSNkZWZpbmUgQlRfUFJPRklMRV9HQVRUX0lEICJnYXR0IgotI2RlZmluZSBCVF9QUk9GSUxFX0FWX1JDX0lEICJhdnJjcCIKLSNkZWZpbmUgQlRfUFJPRklMRV9BVl9SQ19DVFJMX0lEICJhdnJjcF9jdHJsIgotI2RlZmluZSBCVF9QUk9GSUxFX0hFQVJJTkdfQUlEX0lEICJoZWFyaW5nX2FpZCIKLSNkZWZpbmUgQlRfUFJPRklMRV9MRV9BVURJT19JRCAibGVfYXVkaW8iCi0jZGVmaW5lIEJUX0tFWVNUT1JFX0lEICJibHVldG9vdGhfa2V5c3RvcmUiCi0jZGVmaW5lIEJUX0FDVElWSVRZX0FUVFJJQlVUSU9OX0lEICJhY3Rpdml0eV9hdHRyaWJ1dGlvbiIKLSNkZWZpbmUgQlRfUFJPRklMRV9WQ19JRCAidm9sdW1lX2NvbnRyb2wiCi0jZGVmaW5lIEJUX1BST0ZJTEVfQ1NJU19DTElFTlRfSUQgImNzaXNfY2xpZW50IgotI2RlZmluZSBCVF9QUk9GSUxFX0xFX0FVRElPX0lEICJsZV9hdWRpbyIKLQotLyoqIEJsdWV0b290aCBEZXZpY2UgTmFtZSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB1aW50OF90IG5hbWVbMjQ5XTsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBidF9iZG5hbWVfdDsKLQotLyoqIEJsdWV0b290aCBBZGFwdGVyIFZpc2liaWxpdHkgTW9kZXMqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfU0NBTl9NT0RFX05PTkUsCi0gIEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRSwKLSAgQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRQotfSBidF9zY2FuX21vZGVfdDsKLQotLyoqIEJsdWV0b290aCBBZGFwdGVyIFN0YXRlICovCi10eXBlZGVmIGVudW0geyBCVF9TVEFURV9PRkYsIEJUX1NUQVRFX09OIH0gYnRfc3RhdGVfdDsKLQotLyoqIEJsdWV0b290aCBBZGFwdGVyIElucHV0IE91dHB1dCBDYXBhYmlsaXRpZXMgd2hpY2ggZGV0ZXJtaW5lIFBhaXJpbmcvU2VjdXJpdHkKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfSU9fQ0FQX09VVCwgICAgLyogRGlzcGxheU9ubHkgKi8KLSAgQlRfSU9fQ0FQX0lPLCAgICAgLyogRGlzcGxheVllc05vICovCi0gIEJUX0lPX0NBUF9JTiwgICAgIC8qIEtleWJvYXJkT25seSAqLwotICBCVF9JT19DQVBfTk9ORSwgICAvKiBOb0lucHV0Tm9PdXRwdXQgKi8KLSAgQlRfSU9fQ0FQX0tCRElTUCwgLyogS2V5Ym9hcmQgZGlzcGxheSAqLwotICBCVF9JT19DQVBfTUFYLAotICBCVF9JT19DQVBfVU5LTk9XTiA9IDB4RkYgLyogVW5rbm93biB2YWx1ZSAqLwotfSBidF9pb19jYXBfdDsKLQotLyoqIEJsdWV0b290aCBFcnJvciBTdGF0dXMgKi8KLS8qKiBXZSBuZWVkIHRvIGJ1aWxkIG9uIHRoaXMgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRfU1RBVFVTX1NVQ0NFU1MgPSAwLAotICBCVF9TVEFUVVNfRkFJTCwKLSAgQlRfU1RBVFVTX05PVF9SRUFEWSwKLSAgQlRfU1RBVFVTX05PTUVNLAotICBCVF9TVEFUVVNfQlVTWSwKLSAgQlRfU1RBVFVTX0RPTkUsIC8qIHJlcXVlc3QgYWxyZWFkeSBjb21wbGV0ZWQgKi8KLSAgQlRfU1RBVFVTX1VOU1VQUE9SVEVELAotICBCVF9TVEFUVVNfUEFSTV9JTlZBTElELAotICBCVF9TVEFUVVNfVU5IQU5ETEVELAotICBCVF9TVEFUVVNfQVVUSF9GQUlMVVJFLAotICBCVF9TVEFUVVNfUk1UX0RFVl9ET1dOLAotICBCVF9TVEFUVVNfQVVUSF9SRUpFQ1RFRCwKLSAgQlRfU1RBVFVTX0pOSV9FTlZJUk9OTUVOVF9FUlJPUiwKLSAgQlRfU1RBVFVTX0pOSV9USFJFQURfQVRUQUNIX0VSUk9SLAotICBCVF9TVEFUVVNfV0FLRUxPQ0tfRVJST1IKLX0gYnRfc3RhdHVzX3Q7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBidF9zdGF0dXNfdGV4dChjb25zdCBidF9zdGF0dXNfdCYgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBCVF9TVEFUVVNfU1VDQ0VTUzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygic3VjY2VzcyIpOwotICAgIGNhc2UgQlRfU1RBVFVTX0ZBSUw6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImZhaWwiKTsKLSAgICBjYXNlIEJUX1NUQVRVU19OT1RfUkVBRFk6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIm5vdF9yZWFkeSIpOwotICAgIGNhc2UgQlRfU1RBVFVTX05PTUVNOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJub19tZW1vcnkiKTsKLSAgICBjYXNlIEJUX1NUQVRVU19CVVNZOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJidXN5Iik7Ci0gICAgY2FzZSBCVF9TVEFUVVNfRE9ORToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiYWxyZWFkeV9kb25lIik7Ci0gICAgY2FzZSBCVF9TVEFUVVNfVU5TVVBQT1JURUQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInVuc3VwcG9ydGVkIik7Ci0gICAgY2FzZSBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJwYXJhbWV0ZXJfaW52YWxpZCIpOwotICAgIGNhc2UgQlRfU1RBVFVTX1VOSEFORExFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygidW5oYW5kbGVkIik7Ci0gICAgY2FzZSBCVF9TVEFUVVNfQVVUSF9GQUlMVVJFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJmYWlsdXJlIik7Ci0gICAgY2FzZSBCVF9TVEFUVVNfUk1UX0RFVl9ET1dOOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJyZW1vdGVfZGV2aWNlX2Rvd24iKTsKLSAgICBjYXNlIEJUX1NUQVRVU19BVVRIX1JFSkVDVEVEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJyZWplY3RlZCIpOwotICAgIGNhc2UgQlRfU1RBVFVTX0pOSV9FTlZJUk9OTUVOVF9FUlJPUjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiam5pX2Vudl9lcnJvciIpOwotICAgIGNhc2UgQlRfU1RBVFVTX0pOSV9USFJFQURfQVRUQUNIX0VSUk9SOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJqbmlfdGhyZWFkX2Vycm9yIik7Ci0gICAgY2FzZSBCVF9TVEFUVVNfV0FLRUxPQ0tfRVJST1I6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIndha2Vsb2NrX2Vycm9yIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTiIpOwotICB9Ci19Ci0KLS8qKiBCbHVldG9vdGggSENJIEVycm9yIENvZGVzICovCi0vKiogQ29ycmVzcG9uZGluZyB0byBbVm9sIDJdIFBhcnQgRCwgIkVycm9yIENvZGVzIiBvZiBDb3JlX3Y1LjEgc3BlY3MgKi8KLXR5cGVkZWYgdWludDhfdCBidF9oY2lfZXJyb3JfY29kZV90OwotCi0vKiogQmx1ZXRvb3RoIFBpbktleSBDb2RlICovCi10eXBlZGVmIHN0cnVjdCB7IHVpbnQ4X3QgcGluWzE2XTsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBidF9waW5fY29kZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50OF90IGN0cmxfc3RhdGU7ICAgLyogc3RhY2sgcmVwb3J0ZWQgc3RhdGUgKi8KLSAgdWludDY0X3QgdHhfdGltZTsgICAgIC8qIGluIG1zICovCi0gIHVpbnQ2NF90IHJ4X3RpbWU7ICAgICAvKiBpbiBtcyAqLwotICB1aW50NjRfdCBpZGxlX3RpbWU7ICAgLyogaW4gbXMgKi8KLSAgdWludDY0X3QgZW5lcmd5X3VzZWQ7IC8qIGEgcHJvZHVjdCBvZiBtQSwgViBhbmQgbXMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYnRfYWN0aXZpdHlfZW5lcmd5X2luZm87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50MzJfdCBhcHBfdWlkOwotICB1aW50NjRfdCB0eF9ieXRlczsKLSAgdWludDY0X3QgcnhfYnl0ZXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGJ0X3VpZF90cmFmZmljX3Q7Ci0KLS8qKiBCbHVldG9vdGggQWRhcHRlciBEaXNjb3Zlcnkgc3RhdGUgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUX0RJU0NPVkVSWV9TVE9QUEVELAotICBCVF9ESVNDT1ZFUllfU1RBUlRFRAotfSBidF9kaXNjb3Zlcnlfc3RhdGVfdDsKLQotLyoqIEJsdWV0b290aCBBQ0wgY29ubmVjdGlvbiBzdGF0ZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfQUNMX1NUQVRFX0NPTk5FQ1RFRCwKLSAgQlRfQUNMX1NUQVRFX0RJU0NPTk5FQ1RFRAotfSBidF9hY2xfc3RhdGVfdDsKLQotLyoqIEJsdWV0b290aCBTRFAgc2VydmljZSByZWNvcmQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIHVpbnQxNl90IGNoYW5uZWw7Ci0gIGNoYXIgbmFtZVsyNTZdOyAgLy8gd2hhdCdzIHRoZSBtYXhpbXVtIGxlbmd0aAotfSBidF9zZXJ2aWNlX3JlY29yZF90OwotCi0vKiogQmx1ZXRvb3RoIFJlbW90ZSBWZXJzaW9uIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHZlcnNpb247Ci0gIGludCBzdWJfdmVyOwotICBpbnQgbWFudWZhY3R1cmVyOwotfSBidF9yZW1vdGVfdmVyc2lvbl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHZlcnNpb25fc3VwcG9ydGVkOwotICB1aW50OF90IGxvY2FsX3ByaXZhY3lfZW5hYmxlZDsKLSAgdWludDhfdCBtYXhfYWR2X2luc3RhbmNlOwotICB1aW50OF90IHJwYV9vZmZsb2FkX3N1cHBvcnRlZDsKLSAgdWludDhfdCBtYXhfaXJrX2xpc3Rfc2l6ZTsKLSAgdWludDhfdCBtYXhfYWR2X2ZpbHRlcl9zdXBwb3J0ZWQ7Ci0gIHVpbnQ4X3QgYWN0aXZpdHlfZW5lcmd5X2luZm9fc3VwcG9ydGVkOwotICB1aW50MTZfdCBzY2FuX3Jlc3VsdF9zdG9yYWdlX3NpemU7Ci0gIHVpbnQxNl90IHRvdGFsX3RyYWNrYWJsZV9hZHZlcnRpc2VyczsKLSAgYm9vbCBleHRlbmRlZF9zY2FuX3N1cHBvcnQ7Ci0gIGJvb2wgZGVidWdfbG9nZ2luZ19zdXBwb3J0ZWQ7Ci0gIGJvb2wgbGVfMm1fcGh5X3N1cHBvcnRlZDsKLSAgYm9vbCBsZV9jb2RlZF9waHlfc3VwcG9ydGVkOwotICBib29sIGxlX2V4dGVuZGVkX2FkdmVydGlzaW5nX3N1cHBvcnRlZDsKLSAgYm9vbCBsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zdXBwb3J0ZWQ7Ci0gIHVpbnQxNl90IGxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGg7Ci0gIHVpbnQzMl90IGR5bmFtaWNfYXVkaW9fYnVmZmVyX3N1cHBvcnRlZDsKLSAgYm9vbCBsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlcl9zdXBwb3J0ZWQ7Ci0gIGJvb2wgbGVfY29ubmVjdGVkX2lzb2Nocm9ub3VzX3N0cmVhbV9jZW50cmFsX3N1cHBvcnRlZDsKLX0gYnRfbG9jYWxfbGVfZmVhdHVyZXNfdDsKLQotLyogU3RvcmVkIHRoZSBkZWZhdWx0L21heGltdW0vbWluaW11bSBidWZmZXIgdGltZSBmb3IgZHluYW1pYyBhdWRpbyBidWZmZXIuCi0gKiBGb3IgQTJEUCBvZmZsb2FkIHVzYWdlLCB0aGUgdW5pdCBpcyBtaWxsaXNlY29uZC4KLSAqIEZvciBBMkRQIGxlZ2FjeSB1c2FnZSwgdGhlIHVuaXQgaXMgYnVmZmVyIHF1ZXVlIHNpemUqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBkZWZhdWx0X2J1ZmZlcl90aW1lOwotICB1aW50MTZfdCBtYXhpbXVtX2J1ZmZlcl90aW1lOwotICB1aW50MTZfdCBtaW5pbXVtX2J1ZmZlcl90aW1lOwotfSBidF9keW5hbWljX2F1ZGlvX2J1ZmZlcl90eXBlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYnRfZHluYW1pY19hdWRpb19idWZmZXJfdHlwZV90IGRhYl9pdGVtWzMyXTsKLX0gYnRfZHluYW1pY19hdWRpb19idWZmZXJfaXRlbV90OwotCi0vKiBCbHVldG9vdGggQWRhcHRlciBhbmQgUmVtb3RlIERldmljZSBwcm9wZXJ0eSB0eXBlcyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgLyogUHJvcGVydGllcyBjb21tb24gdG8gYm90aCBhZGFwdGVyIGFuZCByZW1vdGUgZGV2aWNlICovCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIEJsdWV0b290aCBEZXZpY2UgTmFtZQotICAgKiBBY2Nlc3MgbW9kZSAtIEFkYXB0ZXIgbmFtZSBjYW4gYmUgR0VUL1NFVC4gUmVtb3RlIGRldmljZSBjYW4gYmUgR0VUCi0gICAqIERhdGEgdHlwZSAgIC0gYnRfYmRuYW1lX3QKLSAgICovCi0gIEJUX1BST1BFUlRZX0JETkFNRSA9IDB4MSwKLSAgLyoqCi0gICAqIERlc2NyaXB0aW9uIC0gQmx1ZXRvb3RoIERldmljZSBBZGRyZXNzCi0gICAqIEFjY2VzcyBtb2RlIC0gT25seSBHRVQuCi0gICAqIERhdGEgdHlwZSAgIC0gUmF3QWRkcmVzcwotICAgKi8KLSAgQlRfUFJPUEVSVFlfQkRBRERSLAotICAvKioKLSAgICogRGVzY3JpcHRpb24gLSBCbHVldG9vdGggU2VydmljZSAxMjgtYml0IFVVSURzCi0gICAqIEFjY2VzcyBtb2RlIC0gT25seSBHRVQuCi0gICAqIERhdGEgdHlwZSAgIC0gQXJyYXkgb2YgYmx1ZXRvb3RoOjpVdWlkIChBcnJheSBzaXplIGluZmVycmVkIGZyb20gcHJvcGVydHkKLSAgICogICAgICAgICAgICAgICBsZW5ndGgpLgotICAgKi8KLSAgQlRfUFJPUEVSVFlfVVVJRFMsCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIEJsdWV0b290aCBDbGFzcyBvZiBEZXZpY2UgYXMgZm91bmQgaW4gQXNzaWduZWQgTnVtYmVycwotICAgKiBBY2Nlc3MgbW9kZSAtIE9ubHkgR0VULgotICAgKiBEYXRhIHR5cGUgICAtIHVpbnQzMl90LgotICAgKi8KLSAgQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFLAotICAvKioKLSAgICogRGVzY3JpcHRpb24gLSBEZXZpY2UgVHlwZSAtIEJSRURSLCBCTEUgb3IgRFVBTCBNb2RlCi0gICAqIEFjY2VzcyBtb2RlIC0gT25seSBHRVQuCi0gICAqIERhdGEgdHlwZSAgIC0gYnRfZGV2aWNlX3R5cGVfdAotICAgKi8KLSAgQlRfUFJPUEVSVFlfVFlQRV9PRl9ERVZJQ0UsCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIEJsdWV0b290aCBTZXJ2aWNlIFJlY29yZAotICAgKiBBY2Nlc3MgbW9kZSAtIE9ubHkgR0VULgotICAgKiBEYXRhIHR5cGUgICAtIGJ0X3NlcnZpY2VfcmVjb3JkX3QKLSAgICovCi0gIEJUX1BST1BFUlRZX1NFUlZJQ0VfUkVDT1JELAotCi0gIC8qIFByb3BlcnRpZXMgdW5pcXVlIHRvIGFkYXB0ZXIgKi8KLSAgLyoqCi0gICAqIERlc2NyaXB0aW9uIC0gQmx1ZXRvb3RoIEFkYXB0ZXIgc2NhbiBtb2RlCi0gICAqIEFjY2VzcyBtb2RlIC0gR0VUIGFuZCBTRVQKLSAgICogRGF0YSB0eXBlICAgLSBidF9zY2FuX21vZGVfdC4KLSAgICovCi0gIEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFLAotICAvKioKLSAgICogRGVzY3JpcHRpb24gLSBMaXN0IG9mIGJvbmRlZCBkZXZpY2VzCi0gICAqIEFjY2VzcyBtb2RlIC0gT25seSBHRVQuCi0gICAqIERhdGEgdHlwZSAgIC0gQXJyYXkgb2YgUmF3QWRkcmVzcyBvZiB0aGUgYm9uZGVkIHJlbW90ZSBkZXZpY2VzCi0gICAqICAgICAgICAgICAgICAgKEFycmF5IHNpemUgaW5mZXJyZWQgZnJvbSBwcm9wZXJ0eSBsZW5ndGgpLgotICAgKi8KLSAgQlRfUFJPUEVSVFlfQURBUFRFUl9CT05ERURfREVWSUNFUywKLSAgLyoqCi0gICAqIERlc2NyaXB0aW9uIC0gQmx1ZXRvb3RoIEFkYXB0ZXIgRGlzY292ZXJ5IHRpbWVvdXQgKGluIHNlY29uZHMpCi0gICAqIEFjY2VzcyBtb2RlIC0gR0VUIGFuZCBTRVQKLSAgICogRGF0YSB0eXBlICAgLSB1aW50MzJfdAotICAgKi8KLSAgQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVCwKLQotICAvKiBQcm9wZXJ0aWVzIHVuaXF1ZSB0byByZW1vdGUgZGV2aWNlICovCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIFVzZXIgZGVmaW5lZCBmcmllbmRseSBuYW1lIG9mIHRoZSByZW1vdGUgZGV2aWNlCi0gICAqIEFjY2VzcyBtb2RlIC0gR0VUIGFuZCBTRVQKLSAgICogRGF0YSB0eXBlICAgLSBidF9iZG5hbWVfdC4KLSAgICovCi0gIEJUX1BST1BFUlRZX1JFTU9URV9GUklFTkRMWV9OQU1FLAotICAvKioKLSAgICogRGVzY3JpcHRpb24gLSBSU1NJIHZhbHVlIG9mIHRoZSBpbnF1aXJlZCByZW1vdGUgZGV2aWNlCi0gICAqIEFjY2VzcyBtb2RlIC0gT25seSBHRVQuCi0gICAqIERhdGEgdHlwZSAgIC0gaW50OF90LgotICAgKi8KLSAgQlRfUFJPUEVSVFlfUkVNT1RFX1JTU0ksCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIFJlbW90ZSB2ZXJzaW9uIGluZm8KLSAgICogQWNjZXNzIG1vZGUgLSBTRVQvR0VULgotICAgKiBEYXRhIHR5cGUgICAtIGJ0X3JlbW90ZV92ZXJzaW9uX3QuCi0gICAqLwotCi0gIEJUX1BST1BFUlRZX1JFTU9URV9WRVJTSU9OX0lORk8sCi0KLSAgLyoqCi0gICAqIERlc2NyaXB0aW9uIC0gTG9jYWwgTEUgZmVhdHVyZXMKLSAgICogQWNjZXNzIG1vZGUgLSBHRVQuCi0gICAqIERhdGEgdHlwZSAgIC0gYnRfbG9jYWxfbGVfZmVhdHVyZXNfdC4KLSAgICovCi0gIEJUX1BST1BFUlRZX0xPQ0FMX0xFX0ZFQVRVUkVTLAotCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIExvY2FsIElucHV0L091dHB1dCBDYXBhYmlsaXRpZXMgZm9yIGNsYXNzaWMgQmx1ZXRvb3RoCi0gICAqIEFjY2VzcyBtb2RlIC0gR0VUIGFuZCBTRVQKLSAgICogRGF0YSBUeXBlIC0gYnRfaW9fY2FwX3QuCi0gICAqLwotICBCVF9QUk9QRVJUWV9MT0NBTF9JT19DQVBTLAotCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiAtIExvY2FsIElucHV0L091dHB1dCBDYXBhYmlsaXRpZXMgZm9yIEJMRQotICAgKiBBY2Nlc3MgbW9kZSAtIEdFVCBhbmQgU0VUCi0gICAqIERhdGEgVHlwZSAtIGJ0X2lvX2NhcF90LgotICAgKi8KLSAgQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQU19CTEUsCi0KLSAgQlRfUFJPUEVSVFlfRFlOQU1JQ19BVURJT19CVUZGRVIsCi0KLSAgLyoqCi0gICAqIERlc2NyaXB0aW9uIC0gVHJ1ZSBpZiBSZW1vdGUgaXMgYSBNZW1iZXIgb2YgYSBDb29yZGluYXRlZCBTZXQuCi0gICAqIEFjY2VzcyBtb2RlIC0gR0VULgotICAgKiBEYXRhIFR5cGUgLSBib29sLgotICAgKi8KLSAgQlRfUFJPUEVSVFlfUkVNT1RFX0lTX0NPT1JESU5BVEVEX1NFVF9NRU1CRVIsCi0KLSAgQlRfUFJPUEVSVFlfUkVNT1RFX0RFVklDRV9USU1FU1RBTVAgPSAweEZGLAotfSBidF9wcm9wZXJ0eV90eXBlX3Q7Ci0KLS8qKiBCbHVldG9vdGggQWRhcHRlciBQcm9wZXJ0eSBkYXRhIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBidF9wcm9wZXJ0eV90eXBlX3QgdHlwZTsKLSAgaW50IGxlbjsKLSAgdm9pZCogdmFsOwotfSBidF9wcm9wZXJ0eV90OwotCi0vKiogUmVwcmVzZW50cyB0aGUgYWN0dWFsIE91dCBvZiBCYW5kIGRhdGEgaXRzZWxmICovCi10eXBlZGVmIHN0cnVjdCBidF9vb2JfZGF0YV9zIHsKLSAgLy8gQm90aAotICBib29sIGlzX3ZhbGlkID0gZmFsc2U7IC8qIERlZmF1bHQgdG8gaW52YWxpZCBkYXRhOyBmb3JjZSBjYWxsZXIgdG8gdmVyaWZ5ICovCi0gIHVpbnQ4X3QgYWRkcmVzc1s3XTsgLyogQmx1ZXRvb3RoIERldmljZSBBZGRyZXNzICg2KSBwbHVzIEFkZHJlc3MgVHlwZSAoMSkgKi8KLSAgdWludDhfdCBjWzE2XTsgICAgICAvKiBTaW1wbGUgUGFpcmluZyBIYXNoIEMtMTkyLzI1NiAoQ2xhc3NpYyBvciBMRSkgKi8KLSAgdWludDhfdCByWzE2XTsgICAgICAvKiBTaW1wbGUgUGFpcmluZyBSYW5kb21pemVyIFItMTkyLzI1NiAoQ2xhc3NpYyBvciBMRSkgKi8KLSAgdWludDhfdCBkZXZpY2VfbmFtZVsyNTZdOyAvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KLQotICAvLyBDbGFzc2ljCi0gIHVpbnQ4X3Qgb29iX2RhdGFfbGVuZ3RoWzJdOyAvKiBDbGFzc2ljIG9ubHkgZGF0YSBMZW5ndGguIFZhbHVlIGluY2x1ZGVzIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGxlbmd0aCAqLwotICB1aW50OF90IGNsYXNzX29mX2RldmljZVsyXTsgLyogQ2xhc3Mgb2YgRGV2aWNlIChDbGFzc2ljIG9yIExFKSAqLwotCi0gIC8vIExFCi0gIHVpbnQ4X3QgbGVfZGV2aWNlX3JvbGU7ICAgLyogU3VwcG9ydGVkIGFuZCBwcmVmZXJyZWQgcm9sZSBvZiBkZXZpY2UgKi8KLSAgdWludDhfdCBzbV90a1sxNl07ICAgICAgICAvKiBTZWN1cml0eSBNYW5hZ2VyIFRLIFZhbHVlIChMRSBPbmx5KSAqLwotICB1aW50OF90IGxlX2ZsYWdzOyAgICAgICAgIC8qIExFIEZsYWdzIGZvciBkaXNjb3ZlcmFiaWxpdHkgYW5kIGZlYXR1cmVzICovCi0gIHVpbnQ4X3QgbGVfYXBwZWFyYW5jZVsyXTsgLyogRm9yIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkZXZpY2UgKi8KLX0gYnRfb29iX2RhdGFfdDsKLQotLyoqIEJsdWV0b290aCBEZXZpY2UgVHlwZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfREVWSUNFX0RFVlRZUEVfQlJFRFIgPSAweDEsCi0gIEJUX0RFVklDRV9ERVZUWVBFX0JMRSwKLSAgQlRfREVWSUNFX0RFVlRZUEVfRFVBTAotfSBidF9kZXZpY2VfdHlwZV90OwotCi0vKiogQmx1ZXRvb3RoIEJvbmQgc3RhdGUgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUX0JPTkRfU1RBVEVfTk9ORSwKLSAgQlRfQk9ORF9TVEFURV9CT05ESU5HLAotICBCVF9CT05EX1NUQVRFX0JPTkRFRAotfSBidF9ib25kX3N0YXRlX3Q7Ci0KLS8qKiBCbHVldG9vdGggU1NQIEJvbmRpbmcgVmFyaWFudCAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfU1NQX1ZBUklBTlRfUEFTU0tFWV9DT05GSVJNQVRJT04sCi0gIEJUX1NTUF9WQVJJQU5UX1BBU1NLRVlfRU5UUlksCi0gIEJUX1NTUF9WQVJJQU5UX0NPTlNFTlQsCi0gIEJUX1NTUF9WQVJJQU5UX1BBU1NLRVlfTk9USUZJQ0FUSU9OCi19IGJ0X3NzcF92YXJpYW50X3Q7Ci0KLSNkZWZpbmUgQlRfTUFYX05VTV9VVUlEUyAzMgotCi0vKiogQmx1ZXRvb3RoIEludGVyZmFjZSBjYWxsYmFja3MgKi8KLQotLyoqIEJsdWV0b290aCBFbmFibGUvRGlzYWJsZSBDYWxsYmFjay4gKi8KLXR5cGVkZWYgdm9pZCAoKmFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFjaykoYnRfc3RhdGVfdCBzdGF0ZSk7Ci0KLS8qKiBHRVQvU0VUIEFkYXB0ZXIgUHJvcGVydGllcyBjYWxsYmFjayAqLwotLyogVE9ETzogRm9yIHRoZSBHRVQvU0VUIHByb3BlcnR5IEFQSXMvY2FsbGJhY2tzLCB3ZSBtYXkgbmVlZCBhIHNlc3Npb24KLSAqIGlkZW50aWZpZXIgdG8gYXNzb2NpYXRlIHRoZSBjYWxsIHdpdGggdGhlIGNhbGxiYWNrLiBUaGlzIHdvdWxkIGJlIG5lZWRlZAotICogd2hlbmV2ZXIgbW9yZSB0aGFuIG9uZSBzaW11bHRhbmVvdXMgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgYWRhcHRlcl90eXBlCi0gKiBpcyBnZXQvc2V0LgotICoKLSAqIElmIHRoaXMgaXMgZ29pbmcgdG8gYmUgaGFuZGxlZCBpbiB0aGUgSmF2YSBmcmFtZXdvcmssIHRoZW4gd2UgZG8gbm90IG5lZWQKLSAqIHRvIG1hbmFnZSBzZXNzaW9ucyBoZXJlLgotICovCi10eXBlZGVmIHZvaWQgKCphZGFwdGVyX3Byb3BlcnRpZXNfY2FsbGJhY2spKGJ0X3N0YXR1c190IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKTsKLQotLyoqIEdFVC9TRVQgUmVtb3RlIERldmljZSBQcm9wZXJ0aWVzIGNhbGxiYWNrICovCi0vKiogVE9ETzogRm9yIHJlbW90ZSBkZXZpY2UgcHJvcGVydGllcywgZG8gbm90IHNlZSBhIG5lZWQgdG8gZ2V0L3NldAotICogbXVsdGlwbGUgcHJvcGVydGllcyAtIG51bV9wcm9wZXJ0aWVzIHNoYWxsIGJlIDEKLSAqLwotdHlwZWRlZiB2b2lkICgqcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NhbGxiYWNrKShidF9zdGF0dXNfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcyk7Ci0KLS8qKiBOZXcgZGV2aWNlIGRpc2NvdmVyZWQgY2FsbGJhY2sgKi8KLS8qKiBJZiBFSVIgZGF0YSBpcyBub3QgcHJlc2VudCwgdGhlbiBCRF9OQU1FIGFuZCBSU1NJIHNoYWxsIGJlIE5VTEwgYW5kIC0xCi0gKiByZXNwZWN0aXZlbHkgKi8KLXR5cGVkZWYgdm9pZCAoKmRldmljZV9mb3VuZF9jYWxsYmFjaykoaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKTsKLQotLyoqIERpc2NvdmVyeSBzdGF0ZSBjaGFuZ2VkIGNhbGxiYWNrICovCi10eXBlZGVmIHZvaWQgKCpkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYWxsYmFjaykoYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpOwotCi0vKiogQmx1ZXRvb3RoIExlZ2FjeSBQaW5LZXkgUmVxdWVzdCBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICgqcGluX3JlcXVlc3RfY2FsbGJhY2spKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JkbmFtZV90KiBiZF9uYW1lLCB1aW50MzJfdCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtaW5fMTZfZGlnaXQpOwotCi0vKiogQmx1ZXRvb3RoIFNTUCBSZXF1ZXN0IGNhbGxiYWNrIC0gSnVzdCBXb3JrcyAmIE51bWVyaWMgQ29tcGFyaXNvbiovCi0vKiogcGFzc19rZXkgLSBTaGFsbCBiZSAwIGZvciBCVF9TU1BfUEFJUklOR19WQVJJQU5UX0NPTlNFTlQgJgotICogIEJUX1NTUF9QQUlSSU5HX1BBU1NLRVlfRU5UUlkgKi8KLS8qIFRPRE86IFBhc3NrZXkgcmVxdWVzdCBjYWxsYmFjayBzaGFsbCBub3QgYmUgbmVlZGVkIGZvciBkZXZpY2VzIHdpdGggZGlzcGxheQotICogY2FwYWJpbGl0eS4gV2Ugc3RpbGwgbmVlZCBzdXBwb3J0IHRoaXMgaW4gdGhlIHN0YWNrIGZvciBjb21wbGV0ZW5lc3MgKi8KLXR5cGVkZWYgdm9pZCAoKnNzcF9yZXF1ZXN0X2NhbGxiYWNrKShSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9iZG5hbWVfdCogYmRfbmFtZSwgdWludDMyX3QgY29kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3Nfa2V5KTsKLQotLyoqIEJsdWV0b290aCBCb25kIHN0YXRlIGNoYW5nZWQgY2FsbGJhY2sgKi8KLS8qIEludm9rZWQgaW4gcmVzcG9uc2UgdG8gY3JlYXRlX2JvbmQsIGNhbmNlbF9ib25kIG9yIHJlbW92ZV9ib25kICovCi10eXBlZGVmIHZvaWQgKCpib25kX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2spKGJ0X3N0YXR1c190IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhaWxfcmVhc29uKTsKLQotLyoqIEJsdWV0b290aCBBQ0wgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkIGNhbGxiYWNrICovCi10eXBlZGVmIHZvaWQgKCphY2xfc3RhdGVfY2hhbmdlZF9jYWxsYmFjaykoYnRfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2FjbF9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BvcnRfbGlua190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2hjaV9lcnJvcl9jb2RlX3QgaGNpX3JlYXNvbik7Ci0KLS8qKiBCbHVldG9vdGggbGluayBxdWFsaXR5IHJlcG9ydCBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICgqbGlua19xdWFsaXR5X3JlcG9ydF9jYWxsYmFjaykoCi0gICAgdWludDY0X3QgdGltZXN0YW1wLCBpbnQgcmVwb3J0X2lkLCBpbnQgcnNzaSwgaW50IHNuciwKLSAgICBpbnQgcmV0cmFuc21pc3Npb25fY291bnQsIGludCBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LAotICAgIGludCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpOwotCi10eXBlZGVmIGVudW0geyBBU1NPQ0lBVEVfSlZNLCBESVNBU1NPQ0lBVEVfSlZNIH0gYnRfY2JfdGhyZWFkX2V2dDsKLQotLyoqIFRocmVhZCBBc3NvY2lhdGUvRGlzYXNzb2NpYXRlIEpWTSBDYWxsYmFjayAqLwotLyogQ2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIGJ5IHRoZSBjYWxsYmFjayB0aHJlYWQgdG8gYWxsb3cgdXBwZXIgbGF5ZXIgdG8KLSAqIGF0dGFjaC9kZXRhY2ggdG8vZnJvbSB0aGUgSlZNICovCi10eXBlZGVmIHZvaWQgKCpjYWxsYmFja190aHJlYWRfZXZlbnQpKGJ0X2NiX3RocmVhZF9ldnQgZXZ0KTsKLQotLyoqIEJsdWV0b290aCBUZXN0IE1vZGUgQ2FsbGJhY2sgKi8KLS8qIFJlY2VpdmUgYW55IEhDSSBldmVudCBmcm9tIGNvbnRyb2xsZXIuIE11c3QgYmUgaW4gRFVUIE1vZGUgZm9yIHRoaXMgY2FsbGJhY2sKLSAqIHRvIGJlIHJlY2VpdmVkICovCi10eXBlZGVmIHZvaWQgKCpkdXRfbW9kZV9yZWN2X2NhbGxiYWNrKSh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuKTsKLQotLyogTEUgVGVzdCBtb2RlIGNhbGxiYWNrcwotICogVGhpcyBjYWxsYmFjayBzaGFsbCBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBsZV90eF90ZXN0LCBsZV9yeF90ZXN0IG9yCi0gKiBsZV90ZXN0X2VuZCBpcyBpbnZva2VkIFRoZSBudW1fcGFja2V0cyBpcyB2YWxpZCBvbmx5IGZvciBsZV90ZXN0X2VuZCBjb21tYW5kCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmxlX3Rlc3RfbW9kZV9jYWxsYmFjaykoYnRfc3RhdHVzX3Qgc3RhdHVzLCB1aW50MTZfdCBudW1fcGFja2V0cyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gZW5lcmd5IGRldGFpbHMgYXJlIG9idGFpbmVkICovCi0vKiBDdHJsX3N0YXRlLUN1cnJlbnQgY29udHJvbGxlciBzdGF0ZS1BY3RpdmUtMSxzY2FuLTIsb3IgaWRsZS0zIHN0YXRlIGFzCi0gKiBkZWZpbmVkIGJ5IEhDSSBzcGVjLiBJZiB0aGUgY3RybF9zdGF0ZSB2YWx1ZSBpcyAwLCBpdCBtZWFucyB0aGUgQVBJIGNhbGwKLSAqIGZhaWxlZCBUaW1lIHZhbHVlcy1JbiBtaWxsaXNlY29uZHMgYXMgcmV0dXJuZWQgYnkgdGhlIGNvbnRyb2xsZXIgRW5lcmd5Ci0gKiB1c2VkLVZhbHVlIGFzIHJldHVybmVkIGJ5IHRoZSBjb250cm9sbGVyIFN0YXR1cy1Qcm92aWRlcyB0aGUgc3RhdHVzIG9mIHRoZQotICogcmVhZF9lbmVyZ3lfaW5mbyBBUEkgY2FsbCB1aWRfZGF0YSBwcm92aWRlcyBhbiBhcnJheSBvZiBidF91aWRfdHJhZmZpY190LAotICogd2hlcmUgdGhlIGFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZWxlbWVudCB3aXRoIGFwcF91aWQgc2V0IHRvIC0xLgotICovCi10eXBlZGVmIHZvaWQgKCplbmVyZ3lfaW5mb19jYWxsYmFjaykoYnRfYWN0aXZpdHlfZW5lcmd5X2luZm8qIGVuZXJneV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3VpZF90cmFmZmljX3QqIHVpZF9kYXRhKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBPT0IgZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjb250cm9sbGVyICovCi10eXBlZGVmIHZvaWQgKCpnZW5lcmF0ZV9sb2NhbF9vb2JfZGF0YV9jYWxsYmFjaykodEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfb29iX2RhdGFfdCBvb2JfZGF0YSk7Ci0KLS8qKiBUT0RPOiBBZGQgY2FsbGJhY2tzIGZvciBMaW5rIFVwL0Rvd24gYW5kIG90aGVyIGdlbmVyaWMKLSAqICBub3RpZmljYXRpb25zL2NhbGxiYWNrcyAqLwotCi0vKiogQmx1ZXRvb3RoIERNIGNhbGxiYWNrIHN0cnVjdHVyZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoYnRfY2FsbGJhY2tzX3QpICovCi0gIHNpemVfdCBzaXplOwotICBhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2sgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiOwotICBhZGFwdGVyX3Byb3BlcnRpZXNfY2FsbGJhY2sgYWRhcHRlcl9wcm9wZXJ0aWVzX2NiOwotICByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2FsbGJhY2sgcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiOwotICBkZXZpY2VfZm91bmRfY2FsbGJhY2sgZGV2aWNlX2ZvdW5kX2NiOwotICBkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYWxsYmFjayBkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYjsKLSAgcGluX3JlcXVlc3RfY2FsbGJhY2sgcGluX3JlcXVlc3RfY2I7Ci0gIHNzcF9yZXF1ZXN0X2NhbGxiYWNrIHNzcF9yZXF1ZXN0X2NiOwotICBib25kX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2sgYm9uZF9zdGF0ZV9jaGFuZ2VkX2NiOwotICBhY2xfc3RhdGVfY2hhbmdlZF9jYWxsYmFjayBhY2xfc3RhdGVfY2hhbmdlZF9jYjsKLSAgY2FsbGJhY2tfdGhyZWFkX2V2ZW50IHRocmVhZF9ldnRfY2I7Ci0gIGR1dF9tb2RlX3JlY3ZfY2FsbGJhY2sgZHV0X21vZGVfcmVjdl9jYjsKLSAgbGVfdGVzdF9tb2RlX2NhbGxiYWNrIGxlX3Rlc3RfbW9kZV9jYjsKLSAgZW5lcmd5X2luZm9fY2FsbGJhY2sgZW5lcmd5X2luZm9fY2I7Ci0gIGxpbmtfcXVhbGl0eV9yZXBvcnRfY2FsbGJhY2sgbGlua19xdWFsaXR5X3JlcG9ydF9jYjsKLSAgZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGFfY2FsbGJhY2sgZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGFfY2I7Ci19IGJ0X2NhbGxiYWNrc190OwotCi10eXBlZGVmIHZvaWQgKCphbGFybV9jYikodm9pZCogZGF0YSk7Ci10eXBlZGVmIGJvb2wgKCpzZXRfd2FrZV9hbGFybV9jYWxsb3V0KSh1aW50NjRfdCBkZWxheV9taWxsaXMsIGJvb2wgc2hvdWxkX3dha2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9jYiBjYiwgdm9pZCogZGF0YSk7Ci10eXBlZGVmIGludCAoKmFjcXVpcmVfd2FrZV9sb2NrX2NhbGxvdXQpKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSk7Ci10eXBlZGVmIGludCAoKnJlbGVhc2Vfd2FrZV9sb2NrX2NhbGxvdXQpKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSk7Ci0KLS8qKiBUaGUgc2V0IG9mIGZ1bmN0aW9ucyByZXF1aXJlZCBieSBibHVlZHJvaWQgdG8gc2V0IHdha2UgYWxhcm1zIGFuZAotICogZ3JhYiB3YWtlIGxvY2tzLiBUaGlzIHN0cnVjdCBpcyBwYXNzZWQgaW50byB0aGUgc3RhY2sgdGhyb3VnaCB0aGUKLSAqIHxzZXRfb3NfY2FsbG91dHN8IGZ1bmN0aW9uIG9uIHxidF9pbnRlcmZhY2VfdHwuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogc2V0IHRvIHNpemVvZihidF9vc19jYWxsb3V0c190KSAqLwotICBzaXplX3Qgc2l6ZTsKLQotICBzZXRfd2FrZV9hbGFybV9jYWxsb3V0IHNldF93YWtlX2FsYXJtOwotICBhY3F1aXJlX3dha2VfbG9ja19jYWxsb3V0IGFjcXVpcmVfd2FrZV9sb2NrOwotICByZWxlYXNlX3dha2VfbG9ja19jYWxsb3V0IHJlbGVhc2Vfd2FrZV9sb2NrOwotfSBidF9vc19jYWxsb3V0c190OwotCi0vKiogTk9URTogQnkgZGVmYXVsdCwgbm8gcHJvZmlsZXMgYXJlIGluaXRpYWxpemVkIGF0IHRoZSB0aW1lIG9mIGluaXQvZW5hYmxlLgotICogIFdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiBpbnZva2VzIHRoZSAnaW5pdCcgQVBJIG9mIGEgcHJvZmlsZSwgdGhlbiBvbmUgb2YKLSAqICB0aGUgZm9sbG93aW5nIHNoYWxsIG9jY3VyOgotICoKLSAqICAgIDEuKSBJZiBCbHVldG9vdGggaXMgbm90IGVuYWJsZWQsIHRoZW4gdGhlIEJsdWV0b290aCBjb3JlIHNoYWxsIG1hcmsgdGhlCi0gKiAgICAgICAgcHJvZmlsZSBhcyBlbmFibGVkLiBTdWJzZXF1ZW50bHksIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGludm9rZXMgdGhlCi0gKiAgICAgICAgQmx1ZXRvb3RoICdlbmFibGUnLCBhcyBwYXJ0IG9mIHRoZSBlbmFibGUgc2VxdWVuY2UgdGhlIHByb2ZpbGUgdGhhdAotICogd2VyZSBtYXJrZWQgc2hhbGwgYmUgZW5hYmxlZCBieSBjYWxsaW5nIGFwcHJvcHJpYXRlIHN0YWNrIEFQSXMuIFRoZQotICogICAgICAgICdhZGFwdGVyX3Byb3BlcnRpZXNfY2InIHNoYWxsIHJldHVybiB0aGUgbGlzdCBvZiBVVUlEcyBvZiB0aGUKLSAqICAgICAgICBlbmFibGVkIHByb2ZpbGVzLgotICoKLSAqICAgIDIuKSBJZiBCbHVldG9vdGggaXMgZW5hYmxlZCwgdGhlbiB0aGUgQmx1ZXRvb3RoIGNvcmUgc2hhbGwgaW52b2tlIHRoZQotICogc3RhY2sgcHJvZmlsZSBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvZmlsZSBhbmQgdHJpZ2dlciBhCi0gKiAgICAgICAgJ2FkYXB0ZXJfcHJvcGVydGllc19jYicgd2l0aCB0aGUgY3VycmVudCBsaXN0IG9mIFVVSURzIGluY2x1ZGluZyB0aGUKLSAqICAgICAgICBuZXdseSBhZGRlZCBwcm9maWxlJ3MgVVVJRC4KLSAqCi0gKiAgIFRoZSByZXZlcnNlIHNoYWxsIG9jY3VyIHdoZW5ldmVyIHRoZSBwcm9maWxlICdjbGVhbnVwJyBBUElzIGFyZSBpbnZva2VkCi0gKi8KLQotLyoqIFJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJsdWV0b290aCBETSBpbnRlcmZhY2UuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0X2ludGVyZmFjZV90KSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyoqCi0gICAqIE9wZW5zIHRoZSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIHRoZSBjYWxsYmFjayByb3V0aW5lcwotICAgKiB0byB0aGUgaW1wbGVtZW5hdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KLSAgICogVGhlIHxzdGFydF9yZXN0cmljdGVkfCBmbGFnIGluaXRzIHRoZSBhZGFwdGVyIGluIHJlc3RyaWN0ZWQgbW9kZS4gSW4KLSAgICogcmVzdHJpY3RlZCBtb2RlLCBib25kcyB0aGF0IGFyZSBjcmVhdGVkIGFyZSBtYXJrZWQgYXMgcmVzdHJpY3RlZCBpbiB0aGUKLSAgICogY29uZmlnIGZpbGUuIFRoZXNlIGRldmljZXMgYXJlIGRlbGV0ZWQgdXBvbiBsZWF2aW5nIHJlc3RyaWN0ZWQgbW9kZS4KLSAgICogVGhlIHxpc19jb21tb25fY3JpdGVyaWFfbW9kZXwgZmxhZyBpbml0cyB0aGUgYWRhcHRlciBpbiBjb21tb20gY3JpdGVyaWEKLSAgICogbW9kZS4gVGhlIHxjb25maWdfY29tcGFyZV9yZXN1bHR8IGZsYWcgc2hvdyB0aGUgY29uZmlnIGNoZWNrc3VtIGNoZWNrCi0gICAqIHJlc3VsdCBpZiBpcyBpbiBjb21tb24gY3JpdGVyaWEgbW9kZS4gVGhlIHxpbml0X2ZsYWdzfCBhcmUgY29uZmlnIGZsYWdzCi0gICAqIHRoYXQgY2Fubm90IGNoYW5nZSBkdXJpbmcgcnVuLiBUaGUgfGlzX2F0dnwgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGUKLSAgICogbG9jYWwgZGV2aWNlIGlzIGFuIEFuZHJvaWQgVFYKLSAgICovCi0gIGludCAoKmluaXQpKGJ0X2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGJvb2wgZ3Vlc3RfbW9kZSwKLSAgICAgICAgICAgICAgYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSwgaW50IGNvbmZpZ19jb21wYXJlX3Jlc3VsdCwKLSAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGluaXRfZmxhZ3MsIGJvb2wgaXNfYXR2KTsKLQotICAvKiogRW5hYmxlIEJsdWV0b290aC4gKi8KLSAgaW50ICgqZW5hYmxlKSgpOwotCi0gIC8qKiBEaXNhYmxlIEJsdWV0b290aC4gKi8KLSAgaW50ICgqZGlzYWJsZSkodm9pZCk7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2b2lkICgqY2xlYW51cCkodm9pZCk7Ci0KLSAgLyoqIEdldCBhbGwgQmx1ZXRvb3RoIEFkYXB0ZXIgcHJvcGVydGllcyBhdCBpbml0ICovCi0gIGludCAoKmdldF9hZGFwdGVyX3Byb3BlcnRpZXMpKHZvaWQpOwotCi0gIC8qKiBHZXQgQmx1ZXRvb3RoIEFkYXB0ZXIgcHJvcGVydHkgb2YgJ3R5cGUnICovCi0gIGludCAoKmdldF9hZGFwdGVyX3Byb3BlcnR5KShidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSk7Ci0KLSAgLyoqIFNldCBCbHVldG9vdGggQWRhcHRlciBwcm9wZXJ0eSBvZiAndHlwZScgKi8KLSAgLyogQmFzZWQgb24gdGhlIHR5cGUsIHZhbCBzaGFsbCBiZSBvbmUgb2YKLSAgICogUmF3QWRkcmVzcyBvciBidF9iZG5hbWVfdCBvciBidF9zY2FubW9kZV90IGV0YwotICAgKi8KLSAgaW50ICgqc2V0X2FkYXB0ZXJfcHJvcGVydHkpKGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KTsKLQotICAvKiogR2V0IGFsbCBSZW1vdGUgRGV2aWNlIHByb3BlcnRpZXMgKi8KLSAgaW50ICgqZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcykoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIpOwotCi0gIC8qKiBHZXQgUmVtb3RlIERldmljZSBwcm9wZXJ0eSBvZiAndHlwZScgKi8KLSAgaW50ICgqZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkpKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpOwotCi0gIC8qKiBTZXQgUmVtb3RlIERldmljZSBwcm9wZXJ0eSBvZiAndHlwZScgKi8KLSAgaW50ICgqc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkpKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotCi0gIC8qKiBHZXQgUmVtb3RlIERldmljZSdzIHNlcnZpY2UgcmVjb3JkICBmb3IgdGhlIGdpdmVuIFVVSUQgKi8KLSAgaW50ICgqZ2V0X3JlbW90ZV9zZXJ2aWNlX3JlY29yZCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCk7Ci0KLSAgLyoqIFN0YXJ0IHNlcnZpY2UgZGlzY292ZXJ5IHdpdGggdHJhbnBvcnQgdG8gZ2V0IHJlbW90ZSBzZXJ2aWNlcyAqLwotICBpbnQgKCpnZXRfcmVtb3RlX3NlcnZpY2VzKShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwgaW50IHRyYW5zcG9ydCk7Ci0KLSAgLyoqIFN0YXJ0IERpc2NvdmVyeSAqLwotICBpbnQgKCpzdGFydF9kaXNjb3ZlcnkpKHZvaWQpOwotCi0gIC8qKiBDYW5jZWwgRGlzY292ZXJ5ICovCi0gIGludCAoKmNhbmNlbF9kaXNjb3ZlcnkpKHZvaWQpOwotCi0gIC8qKiBDcmVhdGUgQmx1ZXRvb3RoIEJvbmRpbmcgKi8KLSAgaW50ICgqY3JlYXRlX2JvbmQpKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGludCB0cmFuc3BvcnQpOwotCi0gIC8qKiBDcmVhdGUgQmx1ZXRvb3RoIEJvbmQgdXNpbmcgb3V0IG9mIGJhbmQgZGF0YSAqLwotICBpbnQgKCpjcmVhdGVfYm9uZF9vdXRfb2ZfYmFuZCkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X29vYl9kYXRhX3QqIHAxOTJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X29vYl9kYXRhX3QqIHAyNTZfZGF0YSk7Ci0KLSAgLyoqIFJlbW92ZSBCb25kICovCi0gIGludCAoKnJlbW92ZV9ib25kKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotICAvKiogQ2FuY2VsIEJvbmQgKi8KLSAgaW50ICgqY2FuY2VsX2JvbmQpKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGZvciBhIGdpdmVuIHJlbW90ZSBkZXZpY2UuCi0gICAqIHJldHVybiB2YWx1ZSBvZiAwIG1lYW5zIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCwKLSAgICogbm9uLXplcm8gcmV0dXJuIHN0YXR1cyBpbmRpY2F0ZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uCi0gICAqLwotICBpbnQgKCpnZXRfY29ubmVjdGlvbl9zdGF0ZSkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcik7Ci0KLSAgLyoqIEJUIExlZ2FjeSBQaW5LZXkgUmVwbHkgKi8KLSAgLyoqIElmIGFjY2VwdD09RkFMU0UsIHRoZW4gcGluX2xlbiBhbmQgcGluX2NvZGUgc2hhbGwgYmUgMHgwICovCi0gIGludCAoKnBpbl9yZXBseSkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdWludDhfdCBhY2NlcHQsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICBidF9waW5fY29kZV90KiBwaW5fY29kZSk7Ci0KLSAgLyoqIEJUIFNTUCBSZXBseSAtIEp1c3QgV29ya3MsIE51bWVyaWMgQ29tcGFyaXNvbiBhbmQgUGFzc2tleQotICAgKiBwYXNza2V5IHNoYWxsIGJlIHplcm8gZm9yIEJUX1NTUF9WQVJJQU5UX1BBU1NLRVlfQ09NUEFSSVNPTiAmCi0gICAqIEJUX1NTUF9WQVJJQU5UX0NPTlNFTlQKLSAgICogRm9yIEJUX1NTUF9WQVJJQU5UX1BBU1NLRVlfRU5UUlksIGlmIGFjY2VwdD09RkFMU0UsIHRoZW4gcGFzc2tleQotICAgKiBzaGFsbCBiZSB6ZXJvICovCi0gIGludCAoKnNzcF9yZXBseSkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgYnRfc3NwX3ZhcmlhbnRfdCB2YXJpYW50LAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWNjZXB0LCB1aW50MzJfdCBwYXNza2V5KTsKLQotICAvKiogR2V0IEJsdWV0b290aCBwcm9maWxlIGludGVyZmFjZSAqLwotICBjb25zdCB2b2lkKiAoKmdldF9wcm9maWxlX2ludGVyZmFjZSkoY29uc3QgY2hhciogcHJvZmlsZV9pZCk7Ci0KLSAgLyoqIEJsdWV0b290aCBUZXN0IE1vZGUgQVBJcyAtIEJsdWV0b290aCBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoZXNlIEFQSXMgKi8KLSAgLyogQ29uZmlndXJlIERVVCBNb2RlIC0gVXNlIHRoaXMgbW9kZSB0byBlbnRlci9leGl0IERVVCBtb2RlICovCi0gIGludCAoKmR1dF9tb2RlX2NvbmZpZ3VyZSkodWludDhfdCBlbmFibGUpOwotCi0gIC8qIFNlbmQgYW55IHRlc3QgSENJICh2ZW5kb3Itc3BlY2lmaWMpIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuIE11c3QgYmUgaW4KLSAgICogRFVUIE1vZGUgKi8KLSAgaW50ICgqZHV0X21vZGVfc2VuZCkodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKTsKLSAgLyoqIEJMRSBUZXN0IE1vZGUgQVBJcyAqLwotICAvKiBvcGNvZGUgTVVTVCBiZSBvbmUgb2Y6IExFX1JlY2VpdmVyX1Rlc3QsIExFX1RyYW5zbWl0dGVyX1Rlc3QsIExFX1Rlc3RfRW5kCi0gICAqLwotICBpbnQgKCpsZV90ZXN0X21vZGUpKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogYnVmLCB1aW50OF90IGxlbik7Ci0KLSAgLyoqIFNldHMgdGhlIE9TIGNhbGwtb3V0IGZ1bmN0aW9ucyB0aGF0IGJsdWVkcm9pZCBuZWVkcyBmb3IgYWxhcm1zIGFuZCB3YWtlCi0gICAqIGxvY2tzLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIHxpbml0fC4KLSAgICovCi0gIGludCAoKnNldF9vc19jYWxsb3V0cykoYnRfb3NfY2FsbG91dHNfdCogY2FsbG91dHMpOwotCi0gIC8qKiBSZWFkIEVuZXJneSBpbmZvIGRldGFpbHMgLSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIEJUX1NUQVRVU19TVUNDRVNTIG9yCi0gICAqIEJUX1NUQVRVU19OT1RfUkVBRFkgU3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCB0aGUgVlNDIGNvbW1hbmQgd2FzIHNlbnQgdG8KLSAgICogY29udHJvbGxlcgotICAgKi8KLSAgaW50ICgqcmVhZF9lbmVyZ3lfaW5mbykoKTsKLQotICAvKioKLSAgICogTmF0aXZlIHN1cHBvcnQgZm9yIGR1bXBzeXMgZnVuY3Rpb24KLSAgICogRnVuY3Rpb24gaXMgc3luY2hyb25vdXMgYW5kIHxmZHwgaXMgb3duZWQgYnkgY2FsbGVyLgotICAgKiB8YXJndW1lbnRzfCBhcmUgYXJndW1lbnRzIHdoaWNoIG1heSBhZmZlY3QgdGhlIG91dHB1dCwgZW5jb2RlZCBhcwotICAgKiBVVEYtOCBzdHJpbmdzLgotICAgKi8KLSAgdm9pZCAoKmR1bXApKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3VtZW50cyk7Ci0KLSAgLyoqCi0gICAqIE5hdGl2ZSBzdXBwb3J0IGZvciBtZXRyaWNzIHByb3RvYnVmIGR1bXBpbmcuIFRoZSBkdW1waW5nIGZvcm1hdCB3aWxsIGJlCi0gICAqIHJhdyBieXRlIGFycmF5Ci0gICAqCi0gICAqIEBwYXJhbSBvdXRwdXQgYW4gZXh0ZXJuYWxseSBhbGxvY2F0ZWQgc3RyaW5nIHRvIGR1bXAgc2VyaWFsaXplZCBwcm90b2J1ZgotICAgKi8KLSAgdm9pZCAoKmR1bXBNZXRyaWNzKShzdGQ6OnN0cmluZyogb3V0cHV0KTsKLQotICAvKioKLSAgICogQ2xlYXIgL2RhdGEvbWlzYy9idF9jb25maWcuY29uZiBhbmQgZXJhc2UgYWxsIHN0b3JlZCBjb25uZWN0aW9ucwotICAgKi8KLSAgaW50ICgqY29uZmlnX2NsZWFyKSh2b2lkKTsKLQotICAvKioKLSAgICogQ2xlYXIgKHJlc2V0KSB0aGUgZHluYW1pYyBwb3J0aW9uIG9mIHRoZSBkZXZpY2UgaW50ZXJvcGVyYWJpbGl0eSBkYXRhYmFzZS4KLSAgICovCi0gIHZvaWQgKCppbnRlcm9wX2RhdGFiYXNlX2NsZWFyKSh2b2lkKTsKLQotICAvKioKLSAgICogQWRkIGEgbmV3IGRldmljZSBpbnRlcm9wZXJhYmlsaXR5IHdvcmthcm91bmQgZm9yIGEgcmVtb3RlIGRldmljZSB3aG9zZQotICAgKiBmaXJzdCB8bGVufCBieXRlcyBvZiB0aGUgaXRzIGRldmljZSBhZGRyZXNzIG1hdGNoIHxhZGRyfC4KLSAgICogTk9URTogfGZlYXR1cmV8IGhhcyB0byBtYXRjaCBhbiBpdGVtIGRlZmluZWQgaW4gaW50ZXJvcF9mZWF0dXJlX3QKLSAgICogKGludGVyb3AuaCkuCi0gICAqLwotICB2b2lkICgqaW50ZXJvcF9kYXRhYmFzZV9hZGQpKHVpbnQxNl90IGZlYXR1cmUsIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgQXZyY3BUYXJnZXQgU2VydmljZSBpbnRlcmZhY2UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgQXZyY3AgU2VydmljZQotICAgKi8KLSAgYmx1ZXRvb3RoOjphdnJjcDo6U2VydmljZUludGVyZmFjZSogKCpnZXRfYXZyY3Bfc2VydmljZSkodm9pZCk7Ci0KLSAgLyoqCi0gICAqIE9iZnVzY2F0ZSBCbHVldG9vdGggTUFDIGFkZHJlc3MgaW50byBhIFBJSSBmcmVlIElEIHN0cmluZwotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBCbHVldG9vdGggTUFDIGFkZHJlc3MgdG8gYmUgb2JmdXNjYXRlZAotICAgKiBAcmV0dXJuIGEgc3RyaW5nIG9mIHVpbnQ4X3QgdGhhdCBpcyB1bmlxdWUgdG8gdGhpcyBNQUMgYWRkcmVzcwotICAgKi8KLSAgc3RkOjpzdHJpbmcgKCpvYmZ1c2NhdGVfYWRkcmVzcykoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIEdldCBhbiBpbmNyZW1lbnRhbCBpZCBmb3IgYXMgcHJpbWFyeSBrZXkgZm9yIEJsdWV0b290aCBtZXRyaWMgYW5kIGxvZwotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBCbHVldG9vdGggTUFDIGFkZHJlc3Mgb2YgQmx1ZXRvb3RoIGRldmljZQotICAgKiBAcmV0dXJuIGludCBpbmNyZW1lbnRhbCBCbHVldG9vdGggaWQKLSAgICovCi0gIGludCAoKmdldF9tZXRyaWNfaWQpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGR5bmFtaWMgYXVkaW8gYnVmZmVyIHNpemUgdG8gdGhlIENvbnRyb2xsZXIKLSAgICovCi0gIGludCAoKnNldF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplKShpbnQgY29kZWMsIGludCBzaXplKTsKLQotICAvKioKLSAgICogRmV0Y2hlcyB0aGUgbG9jYWwgT3V0IG9mIEJhbmQgZGF0YS4KLSAgICovCi0gIGludCAoKmdlbmVyYXRlX2xvY2FsX29vYl9kYXRhKSh0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci19IGJ0X2ludGVyZmFjZV90OwotCi0jZGVmaW5lIEJMVUVUT09USF9JTlRFUkZBQ0VfU1RSSU5HICJibHVldG9vdGhJbnRlcmZhY2UiCi0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQkxVRVRPT1RIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoX2hlYWRzZXRfY2FsbGJhY2tzLmggYi9pbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2NhbGxiYWNrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzk3MzFiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoX2hlYWRzZXRfY2FsbGJhY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxyYXdfYWRkcmVzcy5oPgotCi0jaW5jbHVkZSAiYnRfaGYuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGVhZHNldCB7Ci0KLS8qKgotICogSGVhZHNldCByZWxhdGVkIGNhbGxiYWNrcyBpbnZva2VkIGZyb20gZnJvbSB0aGUgQmx1ZXRvb3RoIG5hdGl2ZSBzdGFjawotICogQWxsIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbiB0aGUgSk5JIHRocmVhZAotICovCi1jbGFzcyBDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgotICAgKgotICAgKiBAcGFyYW0gc3RhdGUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBidGhmX2Nvbm5lY3Rpb25fc3RhdGVfdAotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0aW9uU3RhdGVDYWxsYmFjayhidGhmX2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIGF1ZGlvIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgotICAgKgotICAgKiBAcGFyYW0gc3RhdGUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBidGhmX2F1ZGlvX3N0YXRlX3QKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQXVkaW9TdGF0ZUNhbGxiYWNrKGJ0aGZfYXVkaW9fc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENhbGxiYWNrIGZvciBWUiBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXRlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gYnRoZl92cl9zdGF0ZV90Ci0gICAqIEBwYXJhbSBiZF9hZGRyCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgVm9pY2VSZWNvZ25pdGlvbkNhbGxiYWNrKGJ0aGZfdnJfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENhbGxiYWNrIGZvciBhbnN3ZXIgaW5jb21pbmcgY2FsbCAoQVRBKQotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBbnN3ZXJDYWxsQ2FsbGJhY2soUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgZGlzY29ubmVjdCBjYWxsIChBVCtDSFVQKQotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBIYW5ndXBDYWxsQ2FsbGJhY2soUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgZGlzY29ubmVjdCBjYWxsIChBVCtDSFVQKQotICAgKgotICAgKiBAcGFyYW0gdHlwZSBkZW5vdGUgU3BlYWtlci9NaWMgZ2FpbiBidGhmX3ZvbHVtZV90eXBlX3QKLSAgICogQHBhcmFtIHZvbHVtZSB2b2x1bWUgdmFsdWUgMCB0byAxNSwgcDY5LCBIRlAgMS43LjEgc3BlYwotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBWb2x1bWVDb250cm9sQ2FsbGJhY2soYnRoZl92b2x1bWVfdHlwZV90IHR5cGUsIGludCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgZGlhbGluZyBhbiBvdXRnb2luZyBjYWxsCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgaW50ZW5kZWQgcGhvbmUgbnVtYmVyLCBpZiBudW1iZXIgaXMgTlVMTCwgcmVkaWFsCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIERpYWxDYWxsQ2FsbGJhY2soY2hhciogbnVtYmVyLCBSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENhbGxiYWNrIGZvciBzZW5kaW5nIERUTUYgdG9uZXMKLSAgICoKLSAgICogQHBhcmFtIHRvbmUgY29udGFpbnMgdGhlIGR0bWYgY2hhcmFjdGVyIHRvIGJlIHNlbnQKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgRHRtZkNtZENhbGxiYWNrKGNoYXIgdG9uZSwgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIG5vaXNlIHJlZHVjdGlvbi9lY2hvIGNhbmNlbGxhdGlvbgotICAgKgotICAgKiBAcGFyYW0gbnJlYyAxIHRvIGVuYWJsZSwgMCB0byBkaXNhYmxlCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIE5vaXNlUmVkdWN0aW9uQ2FsbGJhY2soYnRoZl9ucmVjX3QgbnJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgQVQrQkNTIGFuZCBldmVudCBmcm9tIEJBQwotICAgKgotICAgKiBAcGFyYW0gd2JzIFdCUyBlbmFibGUsIFdCUyBkaXNhYmxlCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIFdic0NhbGxiYWNrKGJ0aGZfd2JzX2NvbmZpZ190IHdicywgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgY2FsbCBob2xkIGhhbmRsaW5nIChBVCtDSExEKQotICAgKgotICAgKiBAcGFyYW0gY2hsZCB0aGUgY2FsbCBob2xkIGNvbW1hbmQgKDAsIDEsIDIsIDMpCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIEF0Q2hsZENhbGxiYWNrKGJ0aGZfY2hsZF90eXBlX3QgY2hsZCwgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgQ05VTSAoc3Vic2NyaWJlciBudW1iZXIpCi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIEF0Q251bUNhbGxiYWNrKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIGluZGljYXRvcnMgKENJTkQpCi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIEF0Q2luZENhbGxiYWNrKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIG9wZXJhdG9yIHNlbGVjdGlvbiAoQ09QUykKLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQXRDb3BzQ2FsbGJhY2soUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgY2FsbCBsaXN0IChBVCtDTENDKQotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBdENsY2NDYWxsYmFjayhSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENhbGxiYWNrIGZvciB1bmtub3duIEFUIGNvbW1hbmQgcmVjZCBmcm9tIEhGCi0gICAqCi0gICAqIEBwYXJhbSBhdF9zdHJpbmcgaGUgdW5wYXJzZWQgQVQgc3RyaW5nCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIFVua25vd25BdENhbGxiYWNrKGNoYXIqIGF0X3N0cmluZywgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmb3Iga2V5cHJlc3NlZCAoSFNQKSBldmVudC4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgS2V5UHJlc3NlZENhbGxiYWNrKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIEJJTkQuIFBhc3MgdGhlIHJlbW90ZSBIRiBJbmRpY2F0b3JzIHN1cHBvcnRlZC4KLSAgICoKLSAgICogQHBhcmFtIGF0X3N0cmluZyB1bnBhcnNlZCBBVCBjb21tYW5kIHN0cmluZwotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBdEJpbmRDYWxsYmFjayhjaGFyKiBhdF9zdHJpbmcsIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIEJJRVYuIFBhc3MgdGhlIGNoYW5nZSBpbiB0aGUgUmVtb3RlIEhGIGluZGljYXRvciB2YWx1ZXMKLSAgICoKLSAgICogQHBhcmFtIGluZF9pZCBIRiBpbmRpY2F0b3IgaWQKLSAgICogQHBhcmFtIGluZF92YWx1ZSBIRiBpbmRpY2F0b3IgdmFsdWUKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQXRCaWV2Q2FsbGJhY2soYnRoZl9oZl9pbmRfdHlwZV90IGluZF9pZCwgaW50IGluZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIEJJQS4gUGFzcyB0aGUgY2hhbmdlIGluIEFHIGluZGljYXRvciBhY3RpdmF0aW9uLgotICAgKiBOT1RFOiBDYWxsLCBDYWxsIFNldHVwIGFuZCBDYWxsIEhlbGQgaW5kaWNhdG9ycyBhcmUgbWFuZGF0b3J5IGFuZCBjYW5ub3QKLSAgICogICAgICAgYmUgZGlzYWJsZWQuIFRodXMsIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLgotICAgKgotICAgKiBAcGFyYW0gc2VydmljZSB3aGV0aGVyIEhGIHNob3VsZCByZWNlaXZlIG5ldHdvcmsgc2VydmljZSBzdGF0ZSB1cGRhdGUKLSAgICogQHBhcmFtIHJvYW0gd2hldGhlciBIRiBzaG91bGQgcmVjZWl2ZSByb2FtaW5nIHN0YXRlIHVwZGF0ZQotICAgKiBAcGFyYW0gc2lnbmFsIHdoZXRoZXIgSEYgc2hvdWxkIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIHVwZGF0ZQotICAgKiBAcGFyYW0gYmF0dGVyeSB3aGV0aGVyIEhGIHNob3VsZCByZWNlaXZlIEFHIGJhdHRlcnkgbGV2ZWwgdXBkYXRlCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBIRiBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIEF0QmlhQ2FsbGJhY2soYm9vbCBzZXJ2aWNlLCBib29sIHJvYW0sIGJvb2wgc2lnbmFsLCBib29sIGJhdHRlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkc2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2ludGVyZmFjZS5oIGIvaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfaGVhZHNldF9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyOTc5YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotI2luY2x1ZGUgImJsdWV0b290aF9oZWFkc2V0X2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgImJ0X2hmLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhlYWRzZXQgewotCi0vKioKLSAqIFByb2dyYW1taW5nIGludGVyZmFjZSBmb3IgSGVhZHNldCBwcm9maWxlcyBpbiB0aGUgRmx1b3JpZGUgc3RhY2sKLSAqIFRocmVhZC1zYWZlCi0gKi8KLWNsYXNzIEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgQnRIZiBjYWxsYmFja3MKLSAgICoKLSAgICogQHBhcmFtIGNhbGxiYWNrcyBjYWxsYmFja3MgZm9yIHRoZSB1c2VyIG9mIHRoZSBuYXRpdmUgc3RhY2sKLSAgICogQHBhcmFtIG1heF9oZl9jbGllbnRzIG1heGltdW0gbnVtYmVyIG9mIGhlYWRzZXQgY2xpZW50cwotICAgKiBAcGFyYW0gaW5iYW5kX3JpbmdpbmdfZW5hYmxlZCB3aGV0aGVyIGluYmFuZCByaW5ndG9uZSBpcyBlbmFibGVkCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCBidF9zdGF0dXNfdCBJbml0KENhbGxiYWNrcyogY2FsbGJhY2tzLCBpbnQgbWF4X2hmX2NsaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluYmFuZF9yaW5naW5nX2VuYWJsZWQpID0gMDsKLQotICAvKioKLSAgICogQ29ubmVjdCB0byBoZWFkc2V0Ci0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgQ29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIERpc2Nvbm5lY3QgZnJvbSBoZWFkc2V0Ci0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgRGlzY29ubmVjdChSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBhdWRpbyBjb25uZWN0aW9uCi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgQ29ubmVjdEF1ZGlvKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIGF1ZGlvIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCBidF9zdGF0dXNfdCBEaXNjb25uZWN0QXVkaW8oUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnQgZWNobyBjYW5jZWxsYXRpb24gYW5kL29yIG5vaXNlIHJlZHVjdGlvbgotICAgKiB2aWEgdGhlIEFUK0JSU0YgYml0bWFzawotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IGlzTm9pc2VSZWR1Y3Rpb25TdXBwb3J0ZWQoUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHZvaWNlIHJlY29nbml0aW9uIHZpYSB0aGUgQVQrQlJTRgotICAgKiBiaXRtYXNrCi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgaXNWb2ljZVJlY29nbml0aW9uU3VwcG9ydGVkKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKiogc3RhcnQgdm9pY2UgcmVjb2duaXRpb24gKi8KLSAgLyoqCi0gICAqIFN0YXJ0IHZvaWNlIHJlY29nbml0aW9uCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgU3RhcnRWb2ljZVJlY29nbml0aW9uKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogU3RvcCB2b2ljZSByZWNvZ25pdGlvbgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IFN0b3BWb2ljZVJlY29nbml0aW9uKFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogQ2hhbmdlIEhGUCByZWxhdGVkIHZvbHVtZSBvbiByZW1vdGUgaGVhZHNldAotICAgKgotICAgKiBAcGFyYW0gdHlwZSBTcGVha2VyICgrVkdTKSBvciBNaWMgKCtWR00pCi0gICAqIEBwYXJhbSB2b2x1bWUgdm9sdW1lIGxldmVsIG9uIHNjYWxlIGZyb20gMCB0byAxNSwgcDY5LCBIRlAgMS43LjEgc3BlYwotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IFZvbHVtZUNvbnRyb2woYnRoZl92b2x1bWVfdHlwZV90IHR5cGUsIGludCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENvbWJpbmVkIGRldmljZSBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgKgotICAgKiBAcGFyYW0gbnRrX3N0YXRlIE5ldHdvcmsgc3RhdGUsIGF2YWlsYWJsZSBvciBub3QgYXZhaWxhYmxlCi0gICAqIEBwYXJhbSBzdmNfdHlwZSBTZXJ2aWNlIHR5cGUsIHJvYW1pbmcgb3IgaG9tZQotICAgKiBAcGFyYW0gc2lnbmFsIFNpZ25hbCBzdHJlbmd0aCwgMCB0byA1LCBwODYsIEhGUCAxLjcuMSBzcGVjCi0gICAqIEBwYXJhbSBiYXR0X2NoZyBCYXR0ZXJ5IGxldmVsIG9mIHRoZSBwaG9uZSwgMCB0byA1LCBwODcsIEhGUCAxLjcuMSBzcGVjCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgRGV2aWNlU3RhdHVzTm90aWZpY2F0aW9uKGJ0aGZfbmV0d29ya19zdGF0ZV90IG50a19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9zZXJ2aWNlX3R5cGVfdCBzdmNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpZ25hbCwgaW50IGJhdHRfY2hnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlc3BvbnNlIGZvciBDT1BTIChRdWVyeSBPcGVyYXRvciBTZWxlY3Rpb24pIGNvbW1hbmQKLSAgICoKLSAgICogQHBhcmFtIGNvcHMgT3BlcmF0b3IgTmFtZSwgbWF4IGxlbmd0aCAxNiBjaGFyLCBwMzIgSEZQIDEuNy4xIHNwZWMKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCBidF9zdGF0dXNfdCBDb3BzUmVzcG9uc2UoY29uc3QgY2hhciogY29wcywgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBSZXNwb25zZSBmb3IgQ0lORCAoU3RhbmZvcmQgSW5kaWNhdG9yIFVwZGF0ZSkgY29tbWFuZAotICAgKgotICAgKiBAcGFyYW0gc3ZjIHNlcnZpY2UgYXZhaWxhYmlsaXR5LCBhdmFpbGFibGUgb3Igbm90IGF2YWlsYWJsZQotICAgKiBAcGFyYW0gbnVtX2FjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIGNhbGxzCi0gICAqIEBwYXJhbSBudW1faGVsZCBudW1iZXIgb2YgaGVsZCBjYWxscwotICAgKiBAcGFyYW0gY2FsbF9zZXR1cF9zdGF0ZSBjYWxsIHNldHVwIHN0YXRlCi0gICAqIEBwYXJhbSBzaWduYWwgc2lnbmFsIHN0cmVuZ3RoLCAwIHRvIDUsIHA4NiBIRlAgMS43LjEgc3BlYwotICAgKiBAcGFyYW0gcm9hbSByb2FtaW5nIHN0YXRlLCAxIGZvciByb2FtaW5nLCAwIGZvciBob21lLCBwODYgSEZQIDEuNy4xIHNwZWMKLSAgICogQHBhcmFtIGJhdHRfY2hnIEFHIGJhdHRlcnkgY2hhcmdlLCAwIHRvIDUsIHA4NyBIRlAgMS43LjEgc3BlYwotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IENpbmRSZXNwb25zZShpbnQgc3ZjLCBpbnQgbnVtX2FjdGl2ZSwgaW50IG51bV9oZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NhbGxfc3RhdGVfdCBjYWxsX3NldHVwX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lnbmFsLCBpbnQgcm9hbSwgaW50IGJhdHRfY2hnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiBiZF9hZGRyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFByZS1mb3JtYXR0ZWQgQVQgcmVzcG9uc2UsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byB1bmtub3duIEFUIGNtZAotICAgKgotICAgKiBAcGFyYW0gcnNwIGZvcm1hdHRlZCBBVCByZXNwb25zZQotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IEZvcm1hdHRlZEF0UmVzcG9uc2UoY29uc3QgY2hhciogcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBvay9lcnJvciByZXNwb25zZSB0byBBVCBjb21tYW5kcwotICAgKgotICAgKiBAcGFyYW0gcmVzcG9uc2VfY29kZSBPSyBvciBFUlJPUgotICAgKiBAcGFyYW0gZXJyb3JfY29kZSBhY3R1YWwgZXJyb3IgY29kZSBkZXBlbmQgb24gdXNlIGNhc2UKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCBidF9zdGF0dXNfdCBBdFJlc3BvbnNlKGJ0aGZfYXRfcmVzcG9uc2VfdCByZXNwb25zZV9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX2NvZGUsIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogUmVzcG9uc2UgZm9yIENMQ0MgKEN1cnJlbnQgTGlzdCBvZiBDYWxscykgY29tbWFuZC4KLSAgICogQ2FuIGJlIGl0ZXJhdGl2ZWx5IGNhbGxlZCBmb3IgZWFjaCBjYWxsIGluZGV4Ci0gICAqIENhbGwgaW5kZXggb2YgMCB3aWxsIGJlIHRyZWF0ZWQgYXMgTlVMTCB0ZXJtaW5hdGlvbiAoQ29tcGxldGVzIHJlc3BvbnNlKQotICAgKgotICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGNhbGwKLSAgICogQHBhcmFtIGRpciBkaXJlY3Rpb24gb2YgdGhlIGNhbGwKLSAgICogQHBhcmFtIHN0YXRlIHN0YXRlIG9mIHRoZSBjYWxsCi0gICAqIEBwYXJhbSBtb2RlIG1vZGUgb2YgdGhlIGNhbGwKLSAgICogQHBhcmFtIG1wdHkgd2hldGhlciB0aGUgY2FsbCBpcyBtdWx0aSBwYXJ0eQotICAgKiBAcGFyYW0gbnVtYmVyIHBob25lIG51bWJlciBvZiB0aGUgY2FsbAotICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBjYWxsCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgQ2xjY1Jlc3BvbnNlKAotICAgICAgaW50IGluZGV4LCBidGhmX2NhbGxfZGlyZWN0aW9uX3QgZGlyLCBidGhmX2NhbGxfc3RhdGVfdCBzdGF0ZSwKLSAgICAgIGJ0aGZfY2FsbF9tb2RlX3QgbW9kZSwgYnRoZl9jYWxsX21wdHlfdHlwZV90IG1wdHksIGNvbnN0IGNoYXIqIG51bWJlciwKLSAgICAgIGJ0aGZfY2FsbF9hZGRydHlwZV90IHR5cGUsIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogTm90aWZ5IG9mIGEgY2FsbCBzdGF0ZSBjaGFuZ2UKLSAgICogIEVhY2ggdXBkYXRlIG5vdGlmaWVzCi0gICAqICAgIDEuIE51bWJlciBvZiBhY3RpdmUvaGVsZC9yaW5naW5nIGNhbGxzCi0gICAqICAgIDIuIGNhbGxfc3RhdGU6IFRoaXMgZGVub3RlcyB0aGUgc3RhdGUgY2hhbmdlIHRoYXQgdHJpZ2dlcmVkIHRoaXMgbXNnCi0gICAqICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCB0YWtlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gQnRIZkNhbGxTdGF0ZQotICAgKiAgICAzLiBudW1iZXIgJiB0eXBlOiB2YWxpZCBvbmx5IGZvciBpbmNvbWluZyAmIHdhaXRpbmcgY2FsbAotICAgKgotICAgKiBAcGFyYW0gbnVtX2FjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIGNhbGxzCi0gICAqIEBwYXJhbSBudW1faGVsZCBudW1iZXIgb2YgaGVsZCBjYWxscwotICAgKiBAcGFyYW0gY2FsbF9zZXR1cF9zdGF0ZSBjdXJyZW50IGNhbGwgc2V0dXAgc3RhdGUKLSAgICogQHBhcmFtIG51bWJlciBwaG9uZSBudW1iZXIgb2YgdGhlIGNhbGwKLSAgICogQHBhcmFtIHR5cGUgdHlwZSBvZiB0aGUgY2FsbAotICAgKiBAcGFyYW0gbmFtZSBjYWxsZXIgZGlzcGxheSBuYW1lCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgUGhvbmVTdGF0ZUNoYW5nZShpbnQgbnVtX2FjdGl2ZSwgaW50IG51bV9oZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jYWxsX3N0YXRlX3QgY2FsbF9zZXR1cF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2FsbF9hZGRydHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogYmRfYWRkcikgPSAwOwotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGludGVyZmFjZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhbnVwKCkgPSAwOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHdlIGFyZSBhbGxvd2VkIHRvIGluaXRpYXRlIFNDTwotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSB0byBhbGxvdywgZmFsc2UgdG8gZGlzYWxsb3cKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IFNldFNjb0FsbG93ZWQoYm9vbCB2YWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBTZW5kICtCU0lSIHJlc3BvbnNlIGNvZGUgdG8gZW5hYmxlL2Rpc2FibGUgaW4tYmFuZCByaW5ndG9uZSBpbiBhbiBhY3RpdmUKLSAgICogSEZQIHNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBmb3IgZW5hYmxlZCwgZmFsc2UgZm9yIGRpc2FibGUKLSAgICogQHBhcmFtIGJkX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IFNlbmRCc2lyKGJvb2wgdmFsdWUsIFJhd0FkZHJlc3MqIGJkX2FkZHIpID0gMDsKLQotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IGFjdGl2ZSBoZWFkc2V0IGRldmljZSBmb3IgU0NPIGF1ZGlvCi0gICAqCi0gICAqIEBwYXJhbSBhY3RpdmVfZGV2aWNlX2FkZHIgcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IFNldEFjdGl2ZURldmljZShSYXdBZGRyZXNzKiBhY3RpdmVfZGV2aWNlX2FkZHIpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkc2V0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2FjdGl2aXR5X2F0dHJpYnV0aW9uLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MDQyNzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfQUNUSVZJVFlfQVRUUklCVVRJT05fSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQUNUSVZJVFlfQVRUUklCVVRJT05fSAotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24gewotCi1jbGFzcyBBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIGVudW0gY2xhc3MgQWN0aXZpdHkgOiB1aW50OF90IHsKLSAgICBVTktOT1dOID0gMCwKLSAgICBBQ0wsCi0gICAgQURWRVJUSVNFLAotICAgIENPTk5FQ1QsCi0gICAgQ09OVFJPTCwKLSAgICBIRlAsCi0gICAgSVNPLAotICAgIFNDQU4sCi0gICAgVkVORE9SLAotICB9OwotCi0gIHN0cnVjdCBCdGFhQWdncmVnYXRpb25FbnRyeSB7Ci0gICAgUmF3QWRkcmVzcyBhZGRyZXNzOwotICAgIEFjdGl2aXR5IGFjdGl2aXR5OwotICAgIHVpbnQxNl90IHdha2V1cF9jb3VudDsKLSAgICB1aW50MzJfdCBieXRlX2NvdW50OwotICAgIHVpbnQzMl90IHdha2Vsb2NrX2R1cmF0aW9uOwotICB9OwotCi0gIHZpcnR1YWwgfkFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqIENhbGxiYWNrIHdoZW4gQmx1ZXRvb3RoIHdva2UgdXAgdGhlIHN5c3RlbSAqLwotICB2aXJ0dWFsIHZvaWQgT25XYWtldXAoY29uc3QgQWN0aXZpdHkgYWN0aXZpdHksIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICAvKiogQ2FsbGJhY2sgd2hlbiBCbHVldG9vdGggYWN0aXZpdHkgbG9ncyBhcmUgcmVhZHkgdG8gYmUgbW92ZWQgKi8KLSAgdmlydHVhbCB2b2lkIE9uQWN0aXZpdHlMb2dzUmVhZHkoCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxCdGFhQWdncmVnYXRpb25FbnRyeT4gbG9ncykgPSAwOwotfTsKLQotY2xhc3MgQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5BY3Rpdml0eUF0dHJpYnV0aW9uSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBJbml0IHRoZSBpbnRlcmZhY2UuICovCi0gIHZpcnR1YWwgdm9pZCBJbml0KHZvaWQpID0gMDsKLQotICAvKiogUmVnaXN0ZXIgSk5JIGNhbGxiYWNrcyB3aXRoIHRoZSBpbnRlcmZhY2UuICovCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckNhbGxiYWNrcyhBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2tzKiBjYWxsYmFja3MpID0gMDsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UuICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhbnVwKHZvaWQpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX0FDVElWSVRZX0FUVFJJQlVUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfYXYuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfYXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3MjM0Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2F2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JUX0FWX0gKLSNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JUX0FWX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPHJhd19hZGRyZXNzLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLV9fQkVHSU5fREVDTFMKLQotLyogQmx1ZXRvb3RoIEFWIGNvbm5lY3Rpb24gc3RhdGVzICovCi10eXBlZGVmIGVudW0gewotICBCVEFWX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEID0gMCwKLSAgQlRBVl9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gIEJUQVZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQsCi0gIEJUQVZfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HCi19IGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90OwotCi0vKiBCbHVldG9vdGggQVYgZGF0YXBhdGggc3RhdGVzICovCi10eXBlZGVmIGVudW0gewotICBCVEFWX0FVRElPX1NUQVRFX1JFTU9URV9TVVNQRU5EID0gMCwKLSAgQlRBVl9BVURJT19TVEFURV9TVE9QUEVELAotICBCVEFWX0FVRElPX1NUQVRFX1NUQVJURUQsCi19IGJ0YXZfYXVkaW9fc3RhdGVfdDsKLQotLyoKLSAqIEVudW0gdmFsdWVzIGZvciBlYWNoIEEyRFAgc3VwcG9ydGVkIGNvZGVjLgotICogVGhlcmUgc2hvdWxkIGJlIGEgc2VwYXJhdGUgZW50cnkgZm9yIGVhY2ggQTJEUCBjb2RlYyB0aGF0IGlzIHN1cHBvcnRlZAotICogZm9yIGVuY29kaW5nIChTUkMpLCBhbmQgZm9yIGRlY29kaW5nIHB1cnBvc2UgKFNJTkspLgotICovCi10eXBlZGVmIGVudW0gewotICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX01JTiA9IDAsCi0KLSAgLy8gQWRkIGFuIGVudHJ5IGZvciBlYWNoIHNvdXJjZSBjb2RlYyBoZXJlLgotICAvLyBOT1RFOiBUaGUgdmFsdWVzIHNob3VsZCBiZSBzYW1lIGFzIHRob3NlIGxpc3RlZCBpbiB0aGUgZm9sbG93aW5nIGZpbGU6Ci0gIC8vICAgQmx1ZXRvb3RoQ29kZWNDb25maWcuamF2YQotICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQyA9IDAsCi0gIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDLAotICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFgsCi0gIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRCwKLSAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9MREFDLAotCi0gIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUFYLAotCi0gIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX01JTiA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUFYLAotCi0gIC8vIEFkZCBhbiBlbnRyeSBmb3IgZWFjaCBzaW5rIGNvZGVjIGhlcmUKLSAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfTUlOLAotICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUMsCi0gIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0xEQUMsCi0KLSAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfTUFYLAotCi0gIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NSU4gPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX01JTiwKLSAgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX01BWAotfSBidGF2X2EyZHBfY29kZWNfaW5kZXhfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgLy8gRGlzYWJsZSB0aGUgY29kZWMuCi0gIC8vIE5PVEU6IFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgb25seSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gd2hlbgotICAvLyBmdW5jdGlvbiBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdDo6aW5pdCgpIGlzIGNhbGxlZC4KLSAgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0RJU0FCTEVEID0gLTEsCi0KLSAgLy8gUmVzZXQgdGhlIGNvZGVjIHByaW9yaXR5IHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotICBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVCA9IDAsCi0KLSAgLy8gSGlnaGVzdCBjb2RlYyBwcmlvcml0eS4KLSAgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0hJR0hFU1QgPSAxMDAwICogMTAwMAotfSBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUgPSAweDAsCi0gIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMCA9IDB4MSA8PCAwLAotICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDAgPSAweDEgPDwgMSwKLSAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwID0gMHgxIDw8IDIsCi0gIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMCA9IDB4MSA8PCAzLAotICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwID0gMHgxIDw8IDQsCi0gIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDAgPSAweDEgPDwgNSwKLSAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwID0gMHgxIDw8IDYsCi0gIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMCA9IDB4MSA8PCA3Ci19IGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUgPSAweDAsCi0gIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYgPSAweDEgPDwgMCwKLSAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCA9IDB4MSA8PCAxLAotICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyID0gMHgxIDw8IDIKLX0gYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkUgPSAweDAsCi0gIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTyA9IDB4MSA8PCAwLAotICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTyA9IDB4MSA8PCAxCi19IGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRBVl9BMkRQX1NDTVNUX0RJU0FCTEVEID0gMHgwMCwKLSAgQlRBVl9BMkRQX1NDTVNUX0VOQUJMRUQgPSAweDAxCi19IGJ0YXZfYTJkcF9zY21zdF9lbmFibGVfc3RhdHVzX3Q7Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyBjb2RlYyBjYXBhYmlsaXR5IG9yIGNvbmZpZ3VyYXRpb24uCi0gKiBJdCBpcyB1c2VkIGZvciBjb25maWd1cmluZyBBMkRQIGNvZGVjIHByZWZlcmVuY2UsIGFuZCBmb3IgcmVwb3J0aW5nIGJhY2sKLSAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvciBjb2RlYyBjYXBhYmlsaXR5LgotICogRm9yIGNvZGVjIGNhcGFiaWxpdHksIGZpZWxkcyAic2FtcGxlX3JhdGUiLCAiYml0c19wZXJfc2FtcGxlIiBhbmQKLSAqICJjaGFubmVsX21vZGUiIGNhbiBjb250YWluIGJpdC1tYXNrcyB3aXRoIGFsbCBzdXBwb3J0ZWQgZmVhdHVyZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfdHlwZTsKLSAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QKLSAgICAgIGNvZGVjX3ByaW9yaXR5OyAgLy8gQ29kZWMgc2VsZWN0aW9uIHByaW9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIG90aGVyIGNvZGVjczogbGFyZ2VyIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYW5zIGhpZ2hlciBwcmlvcml0eS4gSWYgMCwgcmVzZXQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdC4KLSAgYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3Qgc2FtcGxlX3JhdGU7Ci0gIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBiaXRzX3Blcl9zYW1wbGU7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCBjaGFubmVsX21vZGU7Ci0gIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMTsgIC8vIENvZGVjLXNwZWNpZmljIHZhbHVlIDEKLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18yOyAgLy8gQ29kZWMtc3BlY2lmaWMgdmFsdWUgMgotICBpbnQ2NF90IGNvZGVjX3NwZWNpZmljXzM7ICAvLyBDb2RlYy1zcGVjaWZpYyB2YWx1ZSAzCi0gIGludDY0X3QgY29kZWNfc3BlY2lmaWNfNDsgIC8vIENvZGVjLXNwZWNpZmljIHZhbHVlIDQKLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBjb2RlY19uYW1lX3N0cjsKLQotICAgIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzoKLSAgICAgICAgY29kZWNfbmFtZV9zdHIgPSAiU0JDIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDOgotICAgICAgICBjb2RlY19uYW1lX3N0ciA9ICJBQUMiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYOgotICAgICAgICBjb2RlY19uYW1lX3N0ciA9ICJhcHRYIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRDoKLSAgICAgICAgY29kZWNfbmFtZV9zdHIgPSAiYXB0WCBIRCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM6Ci0gICAgICAgIGNvZGVjX25hbWVfc3RyID0gIkxEQUMiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDOgotICAgICAgICBjb2RlY19uYW1lX3N0ciA9ICJTQkMgKFNpbmspIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQzoKLSAgICAgICAgY29kZWNfbmFtZV9zdHIgPSAiQUFDIChTaW5rKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19MREFDOgotICAgICAgICBjb2RlY19uYW1lX3N0ciA9ICJMREFDIChTaW5rKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOgotICAgICAgICBjb2RlY19uYW1lX3N0ciA9ICJVbmtub3duKENPREVDX0lOREVYX01BWCkiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBzYW1wbGVfcmF0ZV9zdHI7Ci0gICAgQXBwZW5kQ2FwYWJpbGl0eShzYW1wbGVfcmF0ZV9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAoc2FtcGxlX3JhdGUgPT0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUpLCAiTk9ORSIpOwotICAgIEFwcGVuZENhcGFiaWxpdHkoc2FtcGxlX3JhdGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwKSwKLSAgICAgICAgICAgICAgICAgICAgICI0NDEwMCIpOwotICAgIEFwcGVuZENhcGFiaWxpdHkoc2FtcGxlX3JhdGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICI0ODAwMCIpOwotICAgIEFwcGVuZENhcGFiaWxpdHkoc2FtcGxlX3JhdGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwKSwKLSAgICAgICAgICAgICAgICAgICAgICI4ODIwMCIpOwotICAgIEFwcGVuZENhcGFiaWxpdHkoc2FtcGxlX3JhdGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICI5NjAwMCIpOwotICAgIEFwcGVuZENhcGFiaWxpdHkoc2FtcGxlX3JhdGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMCksCi0gICAgICAgICAgICAgICAgICAgICAiMTc2NDAwIik7Ci0gICAgQXBwZW5kQ2FwYWJpbGl0eShzYW1wbGVfcmF0ZV9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAoc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICIxOTIwMDAiKTsKLSAgICBBcHBlbmRDYXBhYmlsaXR5KHNhbXBsZV9yYXRlX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgIChzYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNjAwMCksCi0gICAgICAgICAgICAgICAgICAgICAiMTYwMDAiKTsKLSAgICBBcHBlbmRDYXBhYmlsaXR5KHNhbXBsZV9yYXRlX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgIChzYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAiMjQwMDAiKTsKLQotICAgIHN0ZDo6c3RyaW5nIGJpdHNfcGVyX3NhbXBsZV9zdHI7Ci0gICAgQXBwZW5kQ2FwYWJpbGl0eShiaXRzX3Blcl9zYW1wbGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKGJpdHNfcGVyX3NhbXBsZSA9PSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpLAotICAgICAgICAgICAgICAgICAgICAgIk5PTkUiKTsKLSAgICBBcHBlbmRDYXBhYmlsaXR5KGJpdHNfcGVyX3NhbXBsZV9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNiksCi0gICAgICAgICAgICAgICAgICAgICAiMTYiKTsKLSAgICBBcHBlbmRDYXBhYmlsaXR5KGJpdHNfcGVyX3NhbXBsZV9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCksCi0gICAgICAgICAgICAgICAgICAgICAiMjQiKTsKLSAgICBBcHBlbmRDYXBhYmlsaXR5KGJpdHNfcGVyX3NhbXBsZV9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMiksCi0gICAgICAgICAgICAgICAgICAgICAiMzIiKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxfbW9kZV9zdHI7Ci0gICAgQXBwZW5kQ2FwYWJpbGl0eShjaGFubmVsX21vZGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxfbW9kZSA9PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkUpLAotICAgICAgICAgICAgICAgICAgICAgIk5PTkUiKTsKLSAgICBBcHBlbmRDYXBhYmlsaXR5KGNoYW5uZWxfbW9kZV9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbF9tb2RlICYgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05PKSwKLSAgICAgICAgICAgICAgICAgICAgICJNT05PIik7Ci0gICAgQXBwZW5kQ2FwYWJpbGl0eShjaGFubmVsX21vZGVfc3RyLAotICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxfbW9kZSAmIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPKSwKLSAgICAgICAgICAgICAgICAgICAgICJTVEVSRU8iKTsKLQotICAgIHJldHVybiAiY29kZWM6ICIgKyBjb2RlY19uYW1lX3N0ciArCi0gICAgICAgICAgICIgcHJpb3JpdHk6ICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlY19wcmlvcml0eSkgKwotICAgICAgICAgICAiIHNhbXBsZV9yYXRlOiAiICsgc2FtcGxlX3JhdGVfc3RyICsKLSAgICAgICAgICAgIiBiaXRzX3Blcl9zYW1wbGU6ICIgKyBiaXRzX3Blcl9zYW1wbGVfc3RyICsKLSAgICAgICAgICAgIiBjaGFubmVsX21vZGU6ICIgKyBjaGFubmVsX21vZGVfc3RyICsKLSAgICAgICAgICAgIiBjb2RlY19zcGVjaWZpY18xOiAiICsgc3RkOjp0b19zdHJpbmcoY29kZWNfc3BlY2lmaWNfMSkgKwotICAgICAgICAgICAiIGNvZGVjX3NwZWNpZmljXzI6ICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlY19zcGVjaWZpY18yKSArCi0gICAgICAgICAgICIgY29kZWNfc3BlY2lmaWNfMzogIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGVjX3NwZWNpZmljXzMpICsKLSAgICAgICAgICAgIiBjb2RlY19zcGVjaWZpY180OiAiICsgc3RkOjp0b19zdHJpbmcoY29kZWNfc3BlY2lmaWNfNCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBBcHBlbmRDYXBhYmlsaXR5KHN0ZDo6c3RyaW5nJiByZXN1bHQsIGJvb2wgYXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIGlmICghYXBwZW5kKSByZXR1cm4gcmVzdWx0OwotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9IG5hbWU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfSBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYnRhdl9hMmRwX3NjbXN0X2VuYWJsZV9zdGF0dXNfdCBlbmFibGVfc3RhdHVzOwotICB1aW50OF90IGNwX2hlYWRlcjsKLX0gYnRhdl9hMmRwX3NjbXN0X2luZm9fdDsKLQotLyoqIENhbGxiYWNrIGZvciBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZS4KLSAqICBzdGF0ZSB3aWxsIGhhdmUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdAotICovCi10eXBlZGVmIHZvaWQgKCpidGF2X2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlKTsKLQotLyoqIENhbGxiYWNrIGZvciBhdWRpb3BhdGggc3RhdGUgY2hhbmdlLgotICogIHN0YXRlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIGJ0YXZfYXVkaW9fc3RhdGVfdAotICovCi10eXBlZGVmIHZvaWQgKCpidGF2X2F1ZGlvX3N0YXRlX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKTsKLQotLyoqIENhbGxiYWNrIGZvciBhdWRpbyBjb25maWd1cmF0aW9uIGNoYW5nZS4KLSAqICBVc2VkIG9ubHkgZm9yIHRoZSBBMkRQIFNvdXJjZSBpbnRlcmZhY2UuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0YXZfYXVkaW9fc291cmNlX2NvbmZpZ19jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZywKLSAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGF1ZGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgotICogIFVzZWQgb25seSBmb3IgdGhlIEEyRFAgU2luayBpbnRlcmZhY2UuCi0gKiAgc2FtcGxlX3JhdGU6IHNhbXBsZSByYXRlIGluIEh6Ci0gKiAgY2hhbm5lbF9jb3VudDogbnVtYmVyIG9mIGNoYW5uZWxzICgxIGZvciBtb25vLCAyIGZvciBzdGVyZW8pCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0YXZfYXVkaW9fc2lua19jb25maWdfY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudCk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgcXVlcnlpbmcgd2hldGhlciB0aGUgbWFuZGF0b3J5IGNvZGVjIGlzIG1vcmUgcHJlZmVycmVkLgotICogIFVzZWQgb25seSBmb3IgdGhlIEEyRFAgU291cmNlIGludGVyZmFjZS4KLSAqICBSZXR1cm4gdHJ1ZSBpZiBvcHRpb25hbCBjb2RlY3MgYXJlIG5vdCBwcmVmZXJyZWQuCi0gKi8KLXR5cGVkZWYgYm9vbCAoKmJ0YXZfbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBCVC1BViBBMkRQIFNvdXJjZSBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0YXZfc291cmNlX2NhbGxiYWNrc190KSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrIGNvbm5lY3Rpb25fc3RhdGVfY2I7Ci0gIGJ0YXZfYXVkaW9fc3RhdGVfY2FsbGJhY2sgYXVkaW9fc3RhdGVfY2I7Ci0gIGJ0YXZfYXVkaW9fc291cmNlX2NvbmZpZ19jYWxsYmFjayBhdWRpb19jb25maWdfY2I7Ci0gIGJ0YXZfbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF9jYWxsYmFjayBtYW5kYXRvcnlfY29kZWNfcHJlZmVycmVkX2NiOwotfSBidGF2X3NvdXJjZV9jYWxsYmFja3NfdDsKLQotLyoqIEJULUFWIEEyRFAgU2luayBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0YXZfc2lua19jYWxsYmFja3NfdCkgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjayBjb25uZWN0aW9uX3N0YXRlX2NiOwotICBidGF2X2F1ZGlvX3N0YXRlX2NhbGxiYWNrIGF1ZGlvX3N0YXRlX2NiOwotICBidGF2X2F1ZGlvX3NpbmtfY29uZmlnX2NhbGxiYWNrIGF1ZGlvX2NvbmZpZ19jYjsKLX0gYnRhdl9zaW5rX2NhbGxiYWNrc190OwotCi0vKioKLSAqIE5PVEU6Ci0gKgotICogMS4gQVZSQ1AgMS4wIHNoYWxsIGJlIHN1cHBvcnRlZCBpbml0aWFsbHkuIEFWUkNQIHBhc3N0aHJvdWdoIGNvbW1hbmRzCi0gKiAgICBzaGFsbCBiZSBoYW5kbGVkIGludGVybmFsbHkgdmlhIHVpbnB1dAotICoKLSAqIDIuIEEyRFAgZGF0YSBwYXRoIHNoYWxsIGJlIGhhbmRsZWQgdmlhIGEgc29ja2V0IHBpcGUgYmV0d2VlbiB0aGUgQXVkaW9GbGluZ2VyCi0gKiAgICBhbmRyb2lkX2F1ZGlvX2h3IGxpYnJhcnkgYW5kIHRoZSBCbHVldG9vdGggc3RhY2suCi0gKgotICovCi0KLS8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1BViBBMkRQIFNvdXJjZSBpbnRlcmZhY2UuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoYnRhdl9zb3VyY2VfaW50ZXJmYWNlX3QpICovCi0gIHNpemVfdCBzaXplOwotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIEJ0QXYgY2FsbGJhY2tzLgotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCppbml0KSgKLSAgICAgIGJ0YXZfc291cmNlX2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGludCBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgb2ZmbG9hZGluZ19wcmVmZXJlbmNlKTsKLQotICAvKiogY29ubmVjdCB0byBoZWFkc2V0ICovCi0gIGJ0X3N0YXR1c190ICgqY29ubmVjdCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLSAgLyoqIGRpcy1jb25uZWN0IGZyb20gaGVhZHNldCAqLwotICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3QpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKiBzZXRzIHRoZSBjb25uZWN0ZWQgZGV2aWNlIHNpbGVuY2Ugc3RhdGUgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfc2lsZW5jZV9kZXZpY2UpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgc2lsZW5jZSk7Ci0KLSAgLyoqIHNldHMgdGhlIGNvbm5lY3RlZCBkZXZpY2UgYXMgYWN0aXZlICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X2FjdGl2ZV9kZXZpY2UpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKiBjb25maWd1cmUgdGhlIGNvZGVjcyBzZXR0aW5ncyBwcmVmZXJlbmNlcyAqLwotICBidF9zdGF0dXNfdCAoKmNvbmZpZ19jb2RlYykoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY19wcmVmZXJlbmNlcyk7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2b2lkICgqY2xlYW51cCkodm9pZCk7Ci0KLX0gYnRhdl9zb3VyY2VfaW50ZXJmYWNlX3Q7Ci0KLS8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1BViBBMkRQIFNpbmsgaW50ZXJmYWNlLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0YXZfc2lua19pbnRlcmZhY2VfdCkgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgQnRBdiBjYWxsYmFja3MKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqaW5pdCkoYnRhdl9zaW5rX2NhbGxiYWNrc190KiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcyk7Ci0KLSAgLyoqIGNvbm5lY3QgdG8gaGVhZHNldCAqLwotICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKiBkaXMtY29ubmVjdCBmcm9tIGhlYWRzZXQgKi8KLSAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UuICovCi0gIHZvaWQgKCpjbGVhbnVwKSh2b2lkKTsKLQotICAvKiogU2VuZHMgQXVkaW8gRm9jdXMgU3RhdGUuICovCi0gIHZvaWQgKCpzZXRfYXVkaW9fZm9jdXNfc3RhdGUpKGludCBmb2N1c19zdGF0ZSk7Ci0KLSAgLyoqIFNldHMgdGhlIGF1ZGlvIHRyYWNrIGdhaW4uICovCi0gIHZvaWQgKCpzZXRfYXVkaW9fdHJhY2tfZ2FpbikoZmxvYXQgZ2Fpbik7Ci0KLSAgLyoqIHNldHMgdGhlIGNvbm5lY3RlZCBkZXZpY2UgYXMgYWN0aXZlICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X2FjdGl2ZV9kZXZpY2UpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotfSBidGF2X3NpbmtfaW50ZXJmYWNlX3Q7Ci0KLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQlRfQVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9jb21tb25fdHlwZXMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfY29tbW9uX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWE0NTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9jb21tb25fdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb25zdGFudHMgYW5kIGRlZmluaXRpb25zIHRoYXQgY2FuIGJlIHVzZWQgY29tbW9ubHkKLSAqIGJldHdlZW4gSk5JIGFuZCBzdGFjayBsYXllcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9DT01NT05fVFlQRVNfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQ09NTU9OX1RZUEVTX0gKLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJsdWV0b290aC5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgY2xpZW50X2lmOwotICB1aW50OF90IGZpbHRfaW5kZXg7Ci0gIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9zdGF0ZTsKLSAgdWludDhfdCBhZHZlcnRpc2VyX2luZm9fcHJlc2VudDsKLSAgdWludDhfdCBhZGRyX3R5cGU7Ci0gIHVpbnQ4X3QgdHhfcG93ZXI7Ci0gIGludDhfdCByc3NpX3ZhbHVlOwotICB1aW50MTZfdCB0aW1lX3N0YW1wOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQ4X3QgYWR2X3BrdF9sZW47Ci0gIHVpbnQ4X3QqIHBfYWR2X3BrdF9kYXRhOwotICB1aW50OF90IHNjYW5fcnNwX2xlbjsKLSAgdWludDhfdCogcF9zY2FuX3JzcF9kYXRhOwotfSBidGdhdHRfdHJhY2tfYWR2X2luZm9fdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRHQVRUX0RCX1BSSU1BUllfU0VSVklDRSwKLSAgQlRHQVRUX0RCX1NFQ09OREFSWV9TRVJWSUNFLAotICBCVEdBVFRfREJfSU5DTFVERURfU0VSVklDRSwKLSAgQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICBCVEdBVFRfREJfREVTQ1JJUFRPUiwKLX0gYnRfZ2F0dF9kYl9hdHRyaWJ1dGVfdHlwZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGlkOwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgYnRfZ2F0dF9kYl9hdHRyaWJ1dGVfdHlwZV90IHR5cGU7Ci0gIHVpbnQxNl90IGF0dHJpYnV0ZV9oYW5kbGU7Ci0KLSAgLyoKLSAgICogSWYgfHR5cGV8IGlzIHxCVEdBVFRfREJfUFJJTUFSWV9TRVJWSUNFfCwgb3IKLSAgICogfEJUR0FUVF9EQl9TRUNPTkRBUllfU0VSVklDRXwsIHRoaXMgY29udGFpbnMgdGhlIHN0YXJ0IGFuZCBlbmQgYXR0cmlidXRlCi0gICAqIGhhbmRsZXMuCi0gICAqLwotICB1aW50MTZfdCBzdGFydF9oYW5kbGU7Ci0gIHVpbnQxNl90IGVuZF9oYW5kbGU7Ci0KLSAgLyoKLSAgICogSWYgfHR5cGV8IGlzIHxCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUN8LCB0aGlzIGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mCi0gICAqIHRoZSBjaGFyYWN0ZXJpc3RpYy4KLSAgICovCi0gIHVpbnQ4X3QgcHJvcGVydGllczsKLSAgdWludDE2X3QgZXh0ZW5kZWRfcHJvcGVydGllczsKLQotICB1aW50MTZfdCBwZXJtaXNzaW9uczsKLX0gYnRnYXR0X2RiX2VsZW1lbnRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBmZWF0X3NlbG47Ci0gIHVpbnQxNl90IGxpc3RfbG9naWNfdHlwZTsKLSAgdWludDhfdCBmaWx0X2xvZ2ljX3R5cGU7Ci0gIHVpbnQ4X3QgcnNzaV9oaWdoX3RocmVzOwotICB1aW50OF90IHJzc2lfbG93X3RocmVzOwotICB1aW50OF90IGRlbHlfbW9kZTsKLSAgdWludDE2X3QgZm91bmRfdGltZW91dDsKLSAgdWludDE2X3QgbG9zdF90aW1lb3V0OwotICB1aW50OF90IGZvdW5kX3RpbWVvdXRfY250OwotICB1aW50MTZfdCBudW1fb2ZfdHJhY2tpbmdfZW50cmllczsKLX0gYnRnYXR0X2ZpbHRfcGFyYW1fc2V0dXBfdDsKLQotLy8gQWR2ZXJ0aXNpbmcgUGFja2V0IENvbnRlbnQgRmlsdGVyCi1zdHJ1Y3QgQXBjZkNvbW1hbmQgewotICB1aW50OF90IHR5cGU7Ci0gIFJhd0FkZHJlc3MgYWRkcmVzczsKLSAgdWludDhfdCBhZGRyX3R5cGU7Ci0gIGJsdWV0b290aDo6VXVpZCB1dWlkOwotICBibHVldG9vdGg6OlV1aWQgdXVpZF9tYXNrOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBuYW1lOwotICB1aW50MTZfdCBjb21wYW55OwotICB1aW50MTZfdCBjb21wYW55X21hc2s7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfbWFzazsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gaXJrOyAgLy8gMTI4IGJpdC8xNiBvY3RldCBJUksKLX07Ci0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQlRfQ09NTU9OX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfY3Npcy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9jc2lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYjM5M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9jc2lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi10eXBlZGVmIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IE9jdGV0MTY7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNzaXMgewotCi0vKiogQ29ubmVjdGlvbiBTdGF0ZSAqLwotZW51bSBjbGFzcyBDb25uZWN0aW9uU3RhdGUgOiB1aW50OF90IHsKLSAgRElTQ09OTkVDVEVEID0gMCwKLSAgQ09OTkVDVElORywKLSAgQ09OTkVDVEVELAotICBESVNDT05ORUNUSU5HLAotfTsKLQotZW51bSBjbGFzcyBDc2lzR3JvdXBMb2NrU3RhdHVzIHsKLSAgU1VDQ0VTUyA9IDAsCi0gIEZBSUxFRF9JTlZBTElEX0dST1VQLAotICBGQUlMRURfR1JPVVBfRU1QVFksCi0gIEZBSUxFRF9HUk9VUF9OT1RfQ09OTkVDVEVELAotICBGQUlMRURfTE9DS0VEX0JZX09USEVSLAotICBGQUlMRURfT1RIRVJfUkVBU09OLAotICBMT0NLRURfR1JPVVBfTUVNQkVSX0xPU1QsCi19OwotCi1jbGFzcyBDc2lzQ2xpZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNzaXNDbGllbnRDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqIENhbGxiYWNrIGZvciBwcm9maWxlIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlICovCi0gIHZpcnR1YWwgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblN0YXRlIHN0YXRlKSA9IDA7Ci0KLSAgLyoqIENhbGxiYWNrIGZvciB0aGUgbmV3IGF2YWlsYWJsZSBkZXZpY2UgKi8KLSAgdmlydHVhbCB2b2lkIE9uRGV2aWNlQXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIGludCBncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKSA9IDA7Ci0KLSAgLyogQ2FsbGJhY2sgZm9yIGF2YWlsYWJsZSBzZXQgbWVtYmVyKi8KLSAgdmlydHVhbCB2b2lkIE9uU2V0TWVtYmVyQXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfaWQpID0gMDsKLQotICAvKiBDYWxsYmFjayBmb3IgbG9jayBjaGFuZ2VkIGluIHRoZSBncm91cCAqLwotICB2aXJ0dWFsIHZvaWQgT25Hcm91cExvY2tDaGFuZ2VkKGludCBncm91cF9pZCwgYm9vbCBsb2NrZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Npc0dyb3VwTG9ja1N0YXR1cyBzdGF0dXMpID0gMDsKLX07Ci0KLWNsYXNzIENzaXNDbGllbnRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q3Npc0NsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAvKiogUmVnaXN0ZXIgdGhlIENzaXMgQ2xpZW50IHByb2ZpbGUgY2FsbGJhY2tzICovCi0gIHZpcnR1YWwgdm9pZCBJbml0KENzaXNDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcykgPSAwOwotCi0gIC8qKiBDb25uZWN0IHRvIENzaXMgQ2xpZW50ICovCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpID0gMDsKLQotICAvKiogRGlzY29ubmVjdCBmcm9tIENzaXMgQ2xpZW50ICovCi0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpID0gMDsKLQotICAvKiogTG9jay9VbmxvY2sgQ3NpcyBncm91cCAqLwotICB2aXJ0dWFsIHZvaWQgTG9ja0dyb3VwKGludCBncm91cF9pZCwgYm9vbCBsb2NrKSA9IDA7Ci0KLSAgLyogQ2FsbGVkIHdoZW4gdW5ib25kZWQuICovCi0gIHZpcnR1YWwgdm9pZCBSZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKiBDbG9zZXMgdGhlIGludGVyZmFjZSAqLwotICB2aXJ0dWFsIHZvaWQgQ2xlYW51cCh2b2lkKSA9IDA7Ci19OwotCi19IC8qIG5hbWVzcGFjZSBjc2lzICovCi19IC8qIG5hbWVzcGFjZSBibHVldG9vdGggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGM0MDguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfR0FUVF9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9HQVRUX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImJsZV9hZHZlcnRpc2VyLmgiCi0jaW5jbHVkZSAiYmxlX3NjYW5uZXIuaCIKLSNpbmNsdWRlICJidF9nYXR0X2NsaWVudC5oIgotI2luY2x1ZGUgImJ0X2dhdHRfc2VydmVyLmgiCi0KLV9fQkVHSU5fREVDTFMKLQotLyoqIEJULUdBVFQgY2FsbGJhY2tzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBTZXQgdG8gc2l6ZW9mKGJ0Z2F0dF9jYWxsYmFja3NfdCkgKi8KLSAgc2l6ZV90IHNpemU7Ci0KLSAgLyoqIEdBVFQgQ2xpZW50IGNhbGxiYWNrcyAqLwotICBjb25zdCBidGdhdHRfY2xpZW50X2NhbGxiYWNrc190KiBjbGllbnQ7Ci0KLSAgLyoqIEdBVFQgU2VydmVyIGNhbGxiYWNrcyAqLwotICBjb25zdCBidGdhdHRfc2VydmVyX2NhbGxiYWNrc190KiBzZXJ2ZXI7Ci0KLSAgLyoqIExFIHNjYW5uZXIgY2FsbGJhY2tzICovCi0gIGNvbnN0IGJ0Z2F0dF9zY2FubmVyX2NhbGxiYWNrc190KiBzY2FubmVyOwotfSBidGdhdHRfY2FsbGJhY2tzX3Q7Ci0KLS8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCbHVldG9vdGggR0FUVCBpbnRlcmZhY2UuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBTZXQgdG8gc2l6ZW9mKGJ0Z2F0dF9pbnRlcmZhY2VfdCkgKi8KLSAgc2l6ZV90IHNpemU7Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHRoZSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGNhbGxiYWNrIHJvdXRpbmVzCi0gICAqLwotICBidF9zdGF0dXNfdCAoKmluaXQpKGNvbnN0IGJ0Z2F0dF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKTsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UgKi8KLSAgdm9pZCAoKmNsZWFudXApKHZvaWQpOwotCi0gIC8qKiBQb2ludGVyIHRvIHRoZSBHQVRUIGNsaWVudCBpbnRlcmZhY2UgbWV0aG9kcy4qLwotICBjb25zdCBidGdhdHRfY2xpZW50X2ludGVyZmFjZV90KiBjbGllbnQ7Ci0KLSAgLyoqIFBvaW50ZXIgdG8gdGhlIEdBVFQgc2VydmVyIGludGVyZmFjZSBtZXRob2RzLiovCi0gIGNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QqIHNlcnZlcjsKLQotICAvKiogUG9pbnRlciB0byB0aGUgTEUgc2Nhbm5lciBpbnRlcmZhY2UgbWV0aG9kcy4qLwotICBCbGVTY2FubmVySW50ZXJmYWNlKiBzY2FubmVyOwotCi0gIC8qKiBQb2ludGVyIHRvIHRoZSBhZHZlcnRpc2VyIGludGVyZmFjZSBtZXRob2RzLiovCi0gIEJsZUFkdmVydGlzZXJJbnRlcmZhY2UqIGFkdmVydGlzZXI7Ci19IGJ0Z2F0dF9pbnRlcmZhY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9HQVRUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dF9jbGllbnQuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dF9jbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0NjhkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2dhdHRfY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JUX0dBVFRfQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JUX0dBVFRfQ0xJRU5UX0gKLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImJ0X2NvbW1vbl90eXBlcy5oIgotI2luY2x1ZGUgImJ0X2dhdHRfdHlwZXMuaCIKLQotX19CRUdJTl9ERUNMUwotCi0vKioKLSAqIEJ1ZmZlciBzaXplcyBmb3IgbWF4aW11bSBhdHRyaWJ1dGUgbGVuZ3RoIGFuZCBtYXhpbXVtIHJlYWQvd3JpdGUKLSAqIG9wZXJhdGlvbiBidWZmZXIgc2l6ZS4KLSAqLwotI2RlZmluZSBCVEdBVFRfTUFYX0FUVFJfTEVOIDYwMAotCi0vKiogQnVmZmVyIHR5cGUgZm9yIHVuZm9ybWF0dGVkIHJlYWRzL3dyaXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHZhbHVlW0JUR0FUVF9NQVhfQVRUUl9MRU5dOwotICB1aW50MTZfdCBsZW47Ci19IGJ0Z2F0dF91bmZvcm1hdHRlZF92YWx1ZV90OwotCi0vKiogUGFyYW1ldGVycyBmb3IgR0FUVCByZWFkIG9wZXJhdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgaGFuZGxlOwotICBidGdhdHRfdW5mb3JtYXR0ZWRfdmFsdWVfdCB2YWx1ZTsKLSAgdWludDE2X3QgdmFsdWVfdHlwZTsKLSAgdWludDhfdCBzdGF0dXM7Ci19IGJ0Z2F0dF9yZWFkX3BhcmFtc190OwotCi0vKiogUGFyYW1ldGVycyBmb3IgR0FUVCB3cml0ZSBvcGVyYXRpb25zICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJ0Z2F0dF9zcnZjX2lkX3Qgc3J2Y19pZDsKLSAgYnRnYXR0X2dhdHRfaWRfdCBjaGFyX2lkOwotICBidGdhdHRfZ2F0dF9pZF90IGRlc2NyX2lkOwotICB1aW50OF90IHN0YXR1czsKLX0gYnRnYXR0X3dyaXRlX3BhcmFtc190OwotCi0vKiogQXR0cmlidXRlIGNoYW5nZSBub3RpZmljYXRpb24gcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHZhbHVlW0JUR0FUVF9NQVhfQVRUUl9MRU5dOwotICBSYXdBZGRyZXNzIGJkYTsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QgaXNfbm90aWZ5OwotfSBidGdhdHRfbm90aWZ5X3BhcmFtc190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MqIGJkYTE7Ci0gIGJsdWV0b290aDo6VXVpZCogdXVpZDE7Ci0gIHVpbnQxNl90IHUxOwotICB1aW50MTZfdCB1MjsKLSAgdWludDE2X3QgdTM7Ci0gIHVpbnQxNl90IHU0OwotICB1aW50MTZfdCB1NTsKLX0gYnRnYXR0X3Rlc3RfcGFyYW1zX3Q7Ci0KLS8qIEJUIEdBVFQgY2xpZW50IGVycm9yIGNvZGVzICovCi10eXBlZGVmIGVudW0gewotICBCVF9HQVRUQ19DT01NQU5EX1NVQ0NFU1MgPSAwLCAvKiAwICBDb21tYW5kIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgKi8KLSAgQlRfR0FUVENfQ09NTUFORF9TVEFSVEVELCAgICAgLyogMSAgQ29tbWFuZCBzdGFydGVkIE9LLiAgICAgICAgICAgICAgICovCi0gIEJUX0dBVFRDX0NPTU1BTkRfQlVTWSwgICAgICAgIC8qIDIgIERldmljZSBidXN5IHdpdGggYW5vdGhlciBjb21tYW5kICAqLwotICBCVF9HQVRUQ19DT01NQU5EX1NUT1JFRCwgICAgICAvKiAzIHJlcXVlc3QgaXMgc3RvcmVkIGluIGNvbnRyb2wgYmxvY2sgKi8KLSAgQlRfR0FUVENfTk9fUkVTT1VSQ0VTLCAgICAgICAgLyogNCAgTm8gcmVzb3VyY2VzIHRvIGlzc3VlIGNvbW1hbmQgICAgICovCi0gIEJUX0dBVFRDX01PREVfVU5TVVBQT1JURUQsICAgIC8qIDUgIFJlcXVlc3QgZm9yIDEgb3IgbW9yZSB1bnN1cHBvcnRlZCBtb2RlcyAqLwotICBCVF9HQVRUQ19JTExFR0FMX1ZBTFVFLCAgICAgICAvKiA2ICBJbGxlZ2FsIGNvbW1hbmQgL3BhcmFtZXRlciB2YWx1ZSAgKi8KLSAgQlRfR0FUVENfSU5DT1JSRUNUX1NUQVRFLCAgICAgLyogNyAgRGV2aWNlIGluIHdyb25nIHN0YXRlIGZvciByZXF1ZXN0ICAqLwotICBCVF9HQVRUQ19VTktOT1dOX0FERFIsICAgICAgICAvKiA4ICBVbmtub3duIHJlbW90ZSBCRCBhZGRyZXNzICAgICAgICAgKi8KLSAgQlRfR0FUVENfREVWSUNFX1RJTUVPVVQsICAgICAgLyogOSAgRGV2aWNlIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICovCi0gIEJUX0dBVFRDX0lOVkFMSURfQ09OVFJPTExFUl9PVVRQVVQsIC8qIDEwICBBbiBpbmNvcnJlY3QgdmFsdWUgd2FzIHJlY2VpdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gSENJICovCi0gIEJUX0dBVFRDX1NFQ1VSSVRZX0VSUk9SLCAvKiAxMSBBdXRob3JpemF0aW9uIG9yIHNlY3VyaXR5IGZhaWx1cmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkICAqLwotICBCVF9HQVRUQ19ERUxBWUVEX0VOQ1JZUFRJT05fQ0hFQ0ssIC8qMTIgRGVsYXllZCBlbmNyeXB0aW9uIGNoZWNrICovCi0gIEJUX0dBVFRDX0VSUl9QUk9DRVNTSU5HICAgICAgICAgICAgLyogMTIgR2VuZXJpYyBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCi19IGJ0Z2F0dGNfZXJyb3JfdDsKLQotLyoqIEJULUdBVFQgQ2xpZW50IGNhbGxiYWNrIHN0cnVjdHVyZS4gKi8KLQotLyoqIENhbGxiYWNrIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gcmVnaXN0ZXJfY2xpZW50ICovCi10eXBlZGVmIHZvaWQgKCpyZWdpc3Rlcl9jbGllbnRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgYXBwX3V1aWQpOwotCi0vKiogR0FUVCBvcGVuIGNhbGxiYWNrIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gb3BlbiAqLwotdHlwZWRlZiB2b2lkICgqY29ubmVjdF9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBzdGF0dXMsIGludCBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCBpbiByZXNwb25zZSB0byBjbG9zZSAqLwotdHlwZWRlZiB2b2lkICgqZGlzY29ubmVjdF9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBzdGF0dXMsIGludCBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotCi0vKioKLSAqIEludm9rZWQgaW4gcmVzcG9uc2UgdG8gc2VhcmNoX3NlcnZpY2Ugd2hlbiB0aGUgR0FUVCBzZXJ2aWNlIHNlYXJjaAotICogaGFzIGJlZW4gY29tcGxldGVkLgotICovCi10eXBlZGVmIHZvaWQgKCpzZWFyY2hfY29tcGxldGVfY2FsbGJhY2spKGludCBjb25uX2lkLCBpbnQgc3RhdHVzKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gW2RlXXJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24gKi8KLXR5cGVkZWYgdm9pZCAoKnJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb25fY2FsbGJhY2spKGludCBjb25uX2lkLCBpbnQgcmVnaXN0ZXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qKgotICogUmVtb3RlIGRldmljZSBub3RpZmljYXRpb24gY2FsbGJhY2ssIGludm9rZWQgd2hlbiBhIHJlbW90ZSBkZXZpY2Ugc2VuZHMKLSAqIGEgbm90aWZpY2F0aW9uIG9yIGluZGljYXRpb24gdGhhdCBhIGNsaWVudCBoYXMgcmVnaXN0ZXJlZCBmb3IuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKm5vdGlmeV9jYWxsYmFjaykoaW50IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0Z2F0dF9ub3RpZnlfcGFyYW1zX3QmIHBfZGF0YSk7Ci0KLS8qKiBSZXBvcnRzIHJlc3VsdCBvZiBhIEdBVFQgcmVhZCBvcGVyYXRpb24gKi8KLXR5cGVkZWYgdm9pZCAoKnJlYWRfY2hhcmFjdGVyaXN0aWNfY2FsbGJhY2spKGludCBjb25uX2lkLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRnYXR0X3JlYWRfcGFyYW1zX3QqIHBfZGF0YSk7Ci0KLS8qKiBHQVRUIHdyaXRlIGNoYXJhY3RlcmlzdGljIG9wZXJhdGlvbiBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICgqd3JpdGVfY2hhcmFjdGVyaXN0aWNfY2FsbGJhY2spKGludCBjb25uX2lkLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKTsKLQotLyoqIEdBVFQgZXhlY3V0ZSBwcmVwYXJlZCB3cml0ZSBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkICgqZXhlY3V0ZV93cml0ZV9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBzdGF0dXMpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCBpbiByZXNwb25zZSB0byByZWFkX2Rlc2NyaXB0b3IgKi8KLXR5cGVkZWYgdm9pZCAoKnJlYWRfZGVzY3JpcHRvcl9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0Z2F0dF9yZWFkX3BhcmFtc190JiBwX2RhdGEpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCBpbiByZXNwb25zZSB0byB3cml0ZV9kZXNjcmlwdG9yICovCi10eXBlZGVmIHZvaWQgKCp3cml0ZV9kZXNjcmlwdG9yX2NhbGxiYWNrKShpbnQgY29ubl9pZCwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUpOwotCi0vKiogQ2FsbGJhY2sgdHJpZ2dlcmVkIGluIHJlc3BvbnNlIHRvIHJlYWRfcmVtb3RlX3Jzc2kgKi8KLXR5cGVkZWYgdm9pZCAoKnJlYWRfcmVtb3RlX3Jzc2lfY2FsbGJhY2spKGludCBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByc3NpLCBpbnQgc3RhdHVzKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgTVRVIGZvciBhIGdpdmVuIGNvbm5lY3Rpb24gY2hhbmdlcyAqLwotdHlwZWRlZiB2b2lkICgqY29uZmlndXJlX210dV9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBzdGF0dXMsIGludCBtdHUpOwotCi0vKioKLSAqIENhbGxiYWNrIG5vdGlmeWluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IGEgcmVtb3RlIGRldmljZSBjb25uZWN0aW9uIGlzCi0gKiBjdXJyZW50bHkgY29uZ2VzdGVkIGFuZCBjYW5ub3QgcmVjZWl2ZSBhbnkgbW9yZSBkYXRhLiBBbiBhcHBsaWNhdGlvbiBzaG91bGQKLSAqIGF2b2lkIHNlbmRpbmcgbW9yZSBkYXRhIHVudGlsIGEgZnVydGhlciBjYWxsYmFjayBpcyByZWNlaXZlZCBpbmRpY2F0aW5nIHRoZQotICogY29uZ2VzdGlvbiBzdGF0dXMgaGFzIGJlZW4gY2xlYXJlZC4KLSAqLwotdHlwZWRlZiB2b2lkICgqY29uZ2VzdGlvbl9jYWxsYmFjaykoaW50IGNvbm5faWQsIGJvb2wgY29uZ2VzdGVkKTsKLQotLyoqIEdBVFQgZ2V0IGRhdGFiYXNlIGNhbGxiYWNrICovCi10eXBlZGVmIHZvaWQgKCpnZXRfZ2F0dF9kYl9jYWxsYmFjaykoaW50IGNvbm5faWQsIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGRiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCk7Ci0KLS8qKiBHQVRUIHNlcnZpY2VzIGJldHdlZW4gc3RhcnRfaGFuZGxlIGFuZCBlbmRfaGFuZGxlIHdlcmUgcmVtb3ZlZCAqLwotdHlwZWRlZiB2b2lkICgqc2VydmljZXNfcmVtb3ZlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVuZF9oYW5kbGUpOwotCi0vKiogR0FUVCBzZXJ2aWNlcyB3ZXJlIGFkZGVkICovCi10eXBlZGVmIHZvaWQgKCpzZXJ2aWNlc19hZGRlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X2RiX2VsZW1lbnRfdCYgYWRkZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZGVkX2NvdW50KTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgUEhZIGZvciBhIGdpdmVuIGNvbm5lY3Rpb24gY2hhbmdlcyAqLwotdHlwZWRlZiB2b2lkICgqcGh5X3VwZGF0ZWRfY2FsbGJhY2spKGludCBjb25uX2lkLCB1aW50OF90IHR4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ4X3BoeSwgdWludDhfdCBzdGF0dXMpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbgotICogY2hhbmdlcyAqLwotdHlwZWRlZiB2b2lkICgqY29ubl91cGRhdGVkX2NhbGxiYWNrKShpbnQgY29ubl9pZCwgdWludDE2X3QgaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKTsKLQotLyoqIENhbGxiYWNrIHdoZW4gc2VydmljZXMgYXJlIGNoYW5nZWQgKi8KLXR5cGVkZWYgdm9pZCAoKnNlcnZpY2VfY2hhbmdlZF9jYWxsYmFjaykoaW50IGNvbm5faWQpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHJlZ2lzdGVyX2NsaWVudF9jYWxsYmFjayByZWdpc3Rlcl9jbGllbnRfY2I7Ci0gIGNvbm5lY3RfY2FsbGJhY2sgb3Blbl9jYjsKLSAgZGlzY29ubmVjdF9jYWxsYmFjayBjbG9zZV9jYjsKLSAgc2VhcmNoX2NvbXBsZXRlX2NhbGxiYWNrIHNlYXJjaF9jb21wbGV0ZV9jYjsKLSAgcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbl9jYWxsYmFjayByZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uX2NiOwotICBub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiOwotICByZWFkX2NoYXJhY3RlcmlzdGljX2NhbGxiYWNrIHJlYWRfY2hhcmFjdGVyaXN0aWNfY2I7Ci0gIHdyaXRlX2NoYXJhY3RlcmlzdGljX2NhbGxiYWNrIHdyaXRlX2NoYXJhY3RlcmlzdGljX2NiOwotICByZWFkX2Rlc2NyaXB0b3JfY2FsbGJhY2sgcmVhZF9kZXNjcmlwdG9yX2NiOwotICB3cml0ZV9kZXNjcmlwdG9yX2NhbGxiYWNrIHdyaXRlX2Rlc2NyaXB0b3JfY2I7Ci0gIGV4ZWN1dGVfd3JpdGVfY2FsbGJhY2sgZXhlY3V0ZV93cml0ZV9jYjsKLSAgcmVhZF9yZW1vdGVfcnNzaV9jYWxsYmFjayByZWFkX3JlbW90ZV9yc3NpX2NiOwotICBjb25maWd1cmVfbXR1X2NhbGxiYWNrIGNvbmZpZ3VyZV9tdHVfY2I7Ci0gIGNvbmdlc3Rpb25fY2FsbGJhY2sgY29uZ2VzdGlvbl9jYjsKLSAgZ2V0X2dhdHRfZGJfY2FsbGJhY2sgZ2V0X2dhdHRfZGJfY2I7Ci0gIHNlcnZpY2VzX3JlbW92ZWRfY2FsbGJhY2sgc2VydmljZXNfcmVtb3ZlZF9jYjsKLSAgc2VydmljZXNfYWRkZWRfY2FsbGJhY2sgc2VydmljZXNfYWRkZWRfY2I7Ci0gIHBoeV91cGRhdGVkX2NhbGxiYWNrIHBoeV91cGRhdGVkX2NiOwotICBjb25uX3VwZGF0ZWRfY2FsbGJhY2sgY29ubl91cGRhdGVkX2NiOwotICBzZXJ2aWNlX2NoYW5nZWRfY2FsbGJhY2sgc2VydmljZV9jaGFuZ2VkX2NiOwotfSBidGdhdHRfY2xpZW50X2NhbGxiYWNrc190OwotCi0vKiogUmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQtR0FUVCBjbGllbnQgaW50ZXJmYWNlLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBSZWdpc3RlcnMgYSBHQVRUIGNsaWVudCBhcHBsaWNhdGlvbiB3aXRoIHRoZSBzdGFjayAqLwotICBidF9zdGF0dXNfdCAoKnJlZ2lzdGVyX2NsaWVudCkoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlYXR0X3N1cHBvcnQpOwotCi0gIC8qKiBVbnJlZ2lzdGVyIGEgY2xpZW50IGFwcGxpY2F0aW9uIGZyb20gdGhlIHN0YWNrICovCi0gIGJ0X3N0YXR1c190ICgqdW5yZWdpc3Rlcl9jbGllbnQpKGludCBjbGllbnRfaWYpOwotCi0gIC8qKiBDcmVhdGUgYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIExFIG9yIGR1YWwtbW9kZSBkZXZpY2UgKi8KLSAgYnRfc3RhdHVzX3QgKCpjb25uZWN0KShpbnQgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCBpbnQgdHJhbnNwb3J0LCBib29sIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYXRpbmdfcGh5cyk7Ci0KLSAgLyoqIERpc2Nvbm5lY3QgYSByZW1vdGUgZGV2aWNlIG9yIGNhbmNlbCBhIHBlbmRpbmcgY29ubmVjdGlvbiAqLwotICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3QpKGludCBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQpOwotCi0gIC8qKiBDbGVhciB0aGUgYXR0cmlidXRlIGNhY2hlIGZvciBhIGdpdmVuIGRldmljZSAqLwotICBidF9zdGF0dXNfdCAoKnJlZnJlc2gpKGludCBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKgotICAgKiBFbnVtZXJhdGUgYWxsIEdBVFQgc2VydmljZXMgb24gYSBjb25uZWN0ZWQgZGV2aWNlLgotICAgKiBPcHRpb25hbGx5LCB0aGUgcmVzdWx0cyBjYW4gYmUgZmlsdGVyZWQgZm9yIGEgZ2l2ZW4gVVVJRC4KLSAgICovCi0gIGJ0X3N0YXR1c190ICgqc2VhcmNoX3NlcnZpY2UpKGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQqIGZpbHRlcl91dWlkKTsKLQotICAvKioKLSAgICogU2VhZCAiRmluZCBzZXJ2aWNlIGJ5IFVVSUQiIHJlcXVlc3QuIFVzZWQgb25seSBmb3IgUFRTIHRlc3RzLgotICAgKi8KLSAgdm9pZCAoKmJ0aWZfZ2F0dGNfZGlzY292ZXJfc2VydmljZV9ieV91dWlkKShpbnQgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQpOwotCi0gIC8qKiBSZWFkIGEgY2hhcmFjdGVyaXN0aWMgb24gYSByZW1vdGUgZGV2aWNlICovCi0gIGJ0X3N0YXR1c190ICgqcmVhZF9jaGFyYWN0ZXJpc3RpYykoaW50IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aF9yZXEpOwotCi0gIC8qKiBSZWFkIGEgY2hhcmFjdGVyaXN0aWMgb24gYSByZW1vdGUgZGV2aWNlICovCi0gIGJ0X3N0YXR1c190ICgqcmVhZF91c2luZ19jaGFyYWN0ZXJpc3RpY191dWlkKShpbnQgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aF9yZXEpOwotCi0gIC8qKiBXcml0ZSBhIHJlbW90ZSBjaGFyYWN0ZXJpc3RpYyAqLwotICBidF9zdGF0dXNfdCAoKndyaXRlX2NoYXJhY3RlcmlzdGljKShpbnQgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfdHlwZSwgaW50IGF1dGhfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSwgc2l6ZV90IGxlbmd0aCk7Ci0KLSAgLyoqIFJlYWQgdGhlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyaXN0aWMgKi8KLSAgYnRfc3RhdHVzX3QgKCpyZWFkX2Rlc2NyaXB0b3IpKGludCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsIGludCBhdXRoX3JlcSk7Ci0KLSAgLyoqIFdyaXRlIGEgcmVtb3RlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyaXN0aWMgKi8KLSAgYnRfc3RhdHVzX3QgKCp3cml0ZV9kZXNjcmlwdG9yKShpbnQgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCBpbnQgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpOwotCi0gIC8qKiBFeGVjdXRlIGEgcHJlcGFyZWQgd3JpdGUgb3BlcmF0aW9uICovCi0gIGJ0X3N0YXR1c190ICgqZXhlY3V0ZV93cml0ZSkoaW50IGNvbm5faWQsIGludCBleGVjdXRlKTsKLQotICAvKioKLSAgICogUmVnaXN0ZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9yIGluZGljYXRpb25zIGZvciBhIGdpdmVuCi0gICAqIGNoYXJhY3RlcmlzdGljCi0gICAqLwotICBidF9zdGF0dXNfdCAoKnJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24pKGludCBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpOwotCi0gIC8qKiBEZXJlZ2lzdGVyIGEgcHJldmlvdXMgcmVxdWVzdCBmb3Igbm90aWZpY2F0aW9ucy9pbmRpY2F0aW9ucyAqLwotICBidF9zdGF0dXNfdCAoKmRlcmVnaXN0ZXJfZm9yX25vdGlmaWNhdGlvbikoaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpOwotCi0gIC8qKiBSZXF1ZXN0IFJTU0kgZm9yIGEgZ2l2ZW4gcmVtb3RlIGRldmljZSAqLwotICBidF9zdGF0dXNfdCAoKnJlYWRfcmVtb3RlX3Jzc2kpKGludCBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIHJlbW90ZSBkZXZpY2UgKExFLCBCUi9FRFIsIER1YWwtbW9kZSkgKi8KLSAgaW50ICgqZ2V0X2RldmljZV90eXBlKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAvKiogQ29uZmlndXJlIHRoZSBNVFUgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbiAqLwotICBidF9zdGF0dXNfdCAoKmNvbmZpZ3VyZV9tdHUpKGludCBjb25uX2lkLCBpbnQgbXR1KTsKLQotICAvKiogUmVxdWVzdCBhIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHVwZGF0ZSAqLwotICBidF9zdGF0dXNfdCAoKmNvbm5fcGFyYW1ldGVyX3VwZGF0ZSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5faW50ZXJ2YWwsIGludCBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGF0ZW5jeSwgaW50IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2NlX2xlbik7Ci0KLSAgYnRfc3RhdHVzX3QgKCpzZXRfcHJlZmVycmVkX3BoeSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCB0eF9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5LCB1aW50MTZfdCBwaHlfb3B0aW9ucyk7Ci0KLSAgYnRfc3RhdHVzX3QgKCpyZWFkX3BoeSkoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHksIHVpbnQ4X3Qgc3RhdHVzKT4gY2IpOwotCi0gIC8qKiBUZXN0IG1vZGUgaW50ZXJmYWNlICovCi0gIGJ0X3N0YXR1c190ICgqdGVzdF9jb21tYW5kKShpbnQgY29tbWFuZCwgY29uc3QgYnRnYXR0X3Rlc3RfcGFyYW1zX3QmIHBhcmFtcyk7Ci0KLSAgLyoqIEdldCBnYXR0IGRiIGNvbnRlbnQgKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfZ2F0dF9kYikoaW50IGNvbm5faWQpOwotCi19IGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3Q7Ci0KLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQlRfR0FUVF9DTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X3NlcnZlci5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTliMDM5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dF9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfR0FUVF9TRVJWRVJfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfR0FUVF9TRVJWRVJfSAotCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImJ0X2dhdHRfdHlwZXMuaCIKLQotX19CRUdJTl9ERUNMUwotCi0vKiogR0FUVCB2YWx1ZSB0eXBlIHVzZWQgaW4gcmVzcG9uc2UgdG8gcmVtb3RlIHJlYWQgcmVxdWVzdHMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCB2YWx1ZVtCVEdBVFRfTUFYX0FUVFJfTEVOXTsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBvZmZzZXQ7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCBhdXRoX3JlcTsKLX0gYnRnYXR0X3ZhbHVlX3Q7Ci0KLS8qKiBHQVRUIHJlbW90ZSByZWFkIHJlcXVlc3QgcmVzcG9uc2UgdHlwZSAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIGJ0Z2F0dF92YWx1ZV90IGF0dHJfdmFsdWU7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLX0gYnRnYXR0X3Jlc3BvbnNlX3Q7Ci0KLS8qKiBCVC1HQVRUIFNlcnZlciBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi0KLS8qKiBDYWxsYmFjayBpbnZva2VkIGluIHJlc3BvbnNlIHRvIHJlZ2lzdGVyX3NlcnZlciAqLwotdHlwZWRlZiB2b2lkICgqcmVnaXN0ZXJfc2VydmVyX2NhbGxiYWNrKShpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKTsKLQotLyoqIENhbGxiYWNrIGluZGljYXRpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzIGNvbm5lY3RlZCBvciBiZWVuIGRpc2Nvbm5lY3RlZAotICovCi10eXBlZGVmIHZvaWQgKCpjb25uZWN0aW9uX2NhbGxiYWNrKShpbnQgY29ubl9pZCwgaW50IHNlcnZlcl9pZiwgaW50IGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIGluIHJlc3BvbnNlIHRvIGNyZWF0ZV9zZXJ2aWNlICovCi10eXBlZGVmIHZvaWQgKCpzZXJ2aWNlX2FkZGVkX2NhbGxiYWNrKShpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X2RiX2VsZW1lbnRfdCogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZXJ2aWNlX2NvdW50KTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gc3RvcF9zZXJ2aWNlICovCi10eXBlZGVmIHZvaWQgKCpzZXJ2aWNlX3N0b3BwZWRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcnZjX2hhbmRsZSk7Ci0KLS8qKiBDYWxsYmFjayB0cmlnZ2VyZWQgd2hlbiBhIHNlcnZpY2UgaGFzIGJlZW4gZGVsZXRlZCAqLwotdHlwZWRlZiB2b2lkICgqc2VydmljZV9kZWxldGVkX2NhbGxiYWNrKShpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3J2Y19oYW5kbGUpOwotCi0vKioKLSAqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIHJlbW90ZSBkZXZpY2UgaGFzIHJlcXVlc3RlZCB0byByZWFkIGEgY2hhcmFjdGVyaXN0aWMKLSAqIG9yIGRlc2NyaXB0b3IuIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHJlc3BvbmQgYnkgY2FsbGluZyBzZW5kX3Jlc3BvbnNlCi0gKi8KLXR5cGVkZWYgdm9pZCAoKnJlcXVlc3RfcmVhZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZyk7Ci0KLS8qKgotICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgcmVtb3RlIGRldmljZSBoYXMgcmVxdWVzdGVkIHRvIHdyaXRlIHRvIGEKLSAqIGNoYXJhY3RlcmlzdGljIG9yIGRlc2NyaXB0b3IuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKnJlcXVlc3Rfd3JpdGVfY2FsbGJhY2spKGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBhdHRyX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGJvb2wgbmVlZF9yc3AsIGJvb2wgaXNfcHJlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCBzaXplX3QgbGVuZ3RoKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIHByZXZpb3VzbHkgcHJlcGFyZWQgd3JpdGUgaXMgdG8gYmUgZXhlY3V0ZWQgKi8KLXR5cGVkZWYgdm9pZCAoKnJlcXVlc3RfZXhlY193cml0ZV9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhlY193cml0ZSk7Ci0KLS8qKgotICogQ2FsbGJhY2sgdHJpZ2dlcmVkIGluIHJlc3BvbnNlIHRvIHNlbmRfcmVzcG9uc2UgaWYgdGhlIHJlbW90ZSBkZXZpY2UKLSAqIHNlbmRzIGEgY29uZmlybWF0aW9uLgotICovCi10eXBlZGVmIHZvaWQgKCpyZXNwb25zZV9jb25maXJtYXRpb25fY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBoYW5kbGUpOwotCi0vKioKLSAqIENhbGxiYWNrIGNvbmZpcm1pbmcgdGhhdCBhIG5vdGlmaWNhdGlvbiBvciBpbmRpY2F0aW9uIGhhcyBiZWVuIHNlbnQKLSAqIHRvIGEgcmVtb3RlIGRldmljZS4KLSAqLwotdHlwZWRlZiB2b2lkICgqaW5kaWNhdGlvbl9zZW50X2NhbGxiYWNrKShpbnQgY29ubl9pZCwgaW50IHN0YXR1cyk7Ci0KLS8qKgotICogQ2FsbGJhY2sgbm90aWZ5aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgYSByZW1vdGUgZGV2aWNlIGNvbm5lY3Rpb24gaXMKLSAqIGN1cnJlbnRseSBjb25nZXN0ZWQgYW5kIGNhbm5vdCByZWNlaXZlIGFueSBtb3JlIGRhdGEuIEFuIGFwcGxpY2F0aW9uIHNob3VsZAotICogYXZvaWQgc2VuZGluZyBtb3JlIGRhdGEgdW50aWwgYSBmdXJ0aGVyIGNhbGxiYWNrIGlzIHJlY2VpdmVkIGluZGljYXRpbmcgdGhlCi0gKiBjb25nZXN0aW9uIHN0YXR1cyBoYXMgYmVlbiBjbGVhcmVkLgotICovCi10eXBlZGVmIHZvaWQgKCpjb25nZXN0aW9uX2NhbGxiYWNrKShpbnQgY29ubl9pZCwgYm9vbCBjb25nZXN0ZWQpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBNVFUgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbiBjaGFuZ2VzICovCi10eXBlZGVmIHZvaWQgKCptdHVfY2hhbmdlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBtdHUpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBQSFkgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbiBjaGFuZ2VzICovCi10eXBlZGVmIHZvaWQgKCpwaHlfdXBkYXRlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIHVpbnQ4X3QgdHhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBjb25uZWN0aW9uCi0gKiBjaGFuZ2VzICovCi10eXBlZGVmIHZvaWQgKCpjb25uX3VwZGF0ZWRfY2FsbGJhY2spKGludCBjb25uX2lkLCB1aW50MTZfdCBpbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpOwotdHlwZWRlZiBzdHJ1Y3QgewotICByZWdpc3Rlcl9zZXJ2ZXJfY2FsbGJhY2sgcmVnaXN0ZXJfc2VydmVyX2NiOwotICBjb25uZWN0aW9uX2NhbGxiYWNrIGNvbm5lY3Rpb25fY2I7Ci0gIHNlcnZpY2VfYWRkZWRfY2FsbGJhY2sgc2VydmljZV9hZGRlZF9jYjsKLSAgc2VydmljZV9zdG9wcGVkX2NhbGxiYWNrIHNlcnZpY2Vfc3RvcHBlZF9jYjsKLSAgc2VydmljZV9kZWxldGVkX2NhbGxiYWNrIHNlcnZpY2VfZGVsZXRlZF9jYjsKLSAgcmVxdWVzdF9yZWFkX2NhbGxiYWNrIHJlcXVlc3RfcmVhZF9jaGFyYWN0ZXJpc3RpY19jYjsKLSAgcmVxdWVzdF9yZWFkX2NhbGxiYWNrIHJlcXVlc3RfcmVhZF9kZXNjcmlwdG9yX2NiOwotICByZXF1ZXN0X3dyaXRlX2NhbGxiYWNrIHJlcXVlc3Rfd3JpdGVfY2hhcmFjdGVyaXN0aWNfY2I7Ci0gIHJlcXVlc3Rfd3JpdGVfY2FsbGJhY2sgcmVxdWVzdF93cml0ZV9kZXNjcmlwdG9yX2NiOwotICByZXF1ZXN0X2V4ZWNfd3JpdGVfY2FsbGJhY2sgcmVxdWVzdF9leGVjX3dyaXRlX2NiOwotICByZXNwb25zZV9jb25maXJtYXRpb25fY2FsbGJhY2sgcmVzcG9uc2VfY29uZmlybWF0aW9uX2NiOwotICBpbmRpY2F0aW9uX3NlbnRfY2FsbGJhY2sgaW5kaWNhdGlvbl9zZW50X2NiOwotICBjb25nZXN0aW9uX2NhbGxiYWNrIGNvbmdlc3Rpb25fY2I7Ci0gIG10dV9jaGFuZ2VkX2NhbGxiYWNrIG10dV9jaGFuZ2VkX2NiOwotICBwaHlfdXBkYXRlZF9jYWxsYmFjayBwaHlfdXBkYXRlZF9jYjsKLSAgY29ubl91cGRhdGVkX2NhbGxiYWNrIGNvbm5fdXBkYXRlZF9jYjsKLX0gYnRnYXR0X3NlcnZlcl9jYWxsYmFja3NfdDsKLQotLyoqIFJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJULUdBVFQgc2VydmVyIGludGVyZmFjZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIFJlZ2lzdGVycyBhIEdBVFQgc2VydmVyIGFwcGxpY2F0aW9uIHdpdGggdGhlIHN0YWNrICovCi0gIGJ0X3N0YXR1c190ICgqcmVnaXN0ZXJfc2VydmVyKShjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVhdHRfc3VwcG9ydCk7Ci0KLSAgLyoqIFVucmVnaXN0ZXIgYSBzZXJ2ZXIgYXBwbGljYXRpb24gZnJvbSB0aGUgc3RhY2sgKi8KLSAgYnRfc3RhdHVzX3QgKCp1bnJlZ2lzdGVyX3NlcnZlcikoaW50IHNlcnZlcl9pZik7Ci0KLSAgLyoqIENyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgcGVyaXBoZXJhbCAqLwotICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKGludCBzZXJ2ZXJfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGludCB0cmFuc3BvcnQpOwotCi0gIC8qKiBEaXNjb25uZWN0IGFuIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24gb3IgY2FuY2VsIGEgcGVuZGluZyBvbmUgKi8KLSAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KShpbnQgc2VydmVyX2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkKTsKLQotICAvKiogQ3JlYXRlIGEgbmV3IHNlcnZpY2UgKi8KLSAgYnRfc3RhdHVzX3QgKCphZGRfc2VydmljZSkoaW50IHNlcnZlcl9pZiwgY29uc3QgYnRnYXR0X2RiX2VsZW1lbnRfdCogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlcnZpY2VfY291bnQpOwotCi0gIC8qKiBTdG9wcyBhIGxvY2FsIHNlcnZpY2UgKi8KLSAgYnRfc3RhdHVzX3QgKCpzdG9wX3NlcnZpY2UpKGludCBzZXJ2ZXJfaWYsIGludCBzZXJ2aWNlX2hhbmRsZSk7Ci0KLSAgLyoqIERlbGV0ZSBhIGxvY2FsIHNlcnZpY2UgKi8KLSAgYnRfc3RhdHVzX3QgKCpkZWxldGVfc2VydmljZSkoaW50IHNlcnZlcl9pZiwgaW50IHNlcnZpY2VfaGFuZGxlKTsKLQotICAvKiogU2VuZCB2YWx1ZSBpbmRpY2F0aW9uIHRvIGEgcmVtb3RlIGRldmljZSAqLwotICBidF9zdGF0dXNfdCAoKnNlbmRfaW5kaWNhdGlvbikoaW50IHNlcnZlcl9pZiwgaW50IGF0dHJpYnV0ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCwgaW50IGNvbmZpcm0sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci0KLSAgLyoqIFNlbmQgYSByZXNwb25zZSB0byBhIHJlYWQvd3JpdGUgb3BlcmF0aW9uICovCi0gIGJ0X3N0YXR1c190ICgqc2VuZF9yZXNwb25zZSkoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidGdhdHRfcmVzcG9uc2VfdCYgcmVzcG9uc2UpOwotCi0gIGJ0X3N0YXR1c190ICgqc2V0X3ByZWZlcnJlZF9waHkpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgdHhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ4X3BoeSwgdWludDE2X3QgcGh5X29wdGlvbnMpOwotCi0gIGJ0X3N0YXR1c190ICgqcmVhZF9waHkpKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+IGNiKTsKLQotfSBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90OwotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX0dBVFRfQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dF90eXBlcy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MWNjYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfR0FUVF9UWVBFU19ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9HQVRUX1RZUEVTX0gKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLV9fQkVHSU5fREVDTFMKLQotLyoqCi0gKiBHQVRUIFNlcnZpY2UgdHlwZXMKLSAqLwotI2RlZmluZSBCVEdBVFRfU0VSVklDRV9UWVBFX1BSSU1BUlkgMAotI2RlZmluZSBCVEdBVFRfU0VSVklDRV9UWVBFX1NFQ09OREFSWSAxCi0KLS8qKiBHQVRUIElEIGFkZGluZyBpbnN0YW5jZSBpZCB0cmFja2luZyB0byB0aGUgVVVJRCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgdWludDhfdCBpbnN0X2lkOwotfSBidGdhdHRfZ2F0dF9pZF90OwotCi0vKiogR0FUVCBTZXJ2aWNlIElEIGFsc28gaWRlbnRpZmllcyB0aGUgc2VydmljZSB0eXBlIChwcmltYXJ5L3NlY29uZGFyeSkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYnRnYXR0X2dhdHRfaWRfdCBpZDsKLSAgdWludDhfdCBpc19wcmltYXJ5OwotfSBidGdhdHRfc3J2Y19pZF90OwotCi0vKiogUHJlZmVycmVkIHBoeXNpY2FsIFRyYW5zcG9ydCBmb3IgR0FUVCBjb25uZWN0aW9uICovCi10eXBlZGVmIGVudW0gewotICBHQVRUX1RSQU5TUE9SVF9BVVRPLAotICBHQVRUX1RSQU5TUE9SVF9CUkVEUiwKLSAgR0FUVF9UUkFOU1BPUlRfTEUKLX0gYnRnYXR0X3RyYW5zcG9ydF90OwotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX0dBVFRfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9oZC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9oZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY2ZTg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfaGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfSERfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfSERfSAotCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotX19CRUdJTl9ERUNMUwotCi10eXBlZGVmIGVudW0gewotICBCVEhEX1JFUE9SVF9UWVBFX09USEVSID0gMCwKLSAgQlRIRF9SRVBPUlRfVFlQRV9JTlBVVCwKLSAgQlRIRF9SRVBPUlRfVFlQRV9PVVRQVVQsCi0gIEJUSERfUkVQT1JUX1RZUEVfRkVBVFVSRSwKLSAgLy8gc3BlY2lhbCB2YWx1ZSBmb3IgcmVwb3J0cyB0byBiZSBzZW50IG9uIElOVFIoSU5QVVQgaXMgYXNzdW1lZCkKLSAgQlRIRF9SRVBPUlRfVFlQRV9JTlRSREFUQQotfSBidGhkX3JlcG9ydF90eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSERfQVBQX1NUQVRFX05PVF9SRUdJU1RFUkVELAotICBCVEhEX0FQUF9TVEFURV9SRUdJU1RFUkVECi19IGJ0aGRfYXBwbGljYXRpb25fc3RhdGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRF9DT05OX1NUQVRFX0NPTk5FQ1RFRCwKLSAgQlRIRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gIEJUSERfQ09OTl9TVEFURV9ESVNDT05ORUNURUQsCi0gIEJUSERfQ09OTl9TVEFURV9ESVNDT05ORUNUSU5HLAotICBCVEhEX0NPTk5fU1RBVEVfVU5LTk9XTgotfSBidGhkX2Nvbm5lY3Rpb25fc3RhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiBuYW1lOwotICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbjsKLSAgY29uc3QgY2hhciogcHJvdmlkZXI7Ci0gIHVpbnQ4X3Qgc3ViY2xhc3M7Ci0gIHVpbnQ4X3QqIGRlc2NfbGlzdDsKLSAgaW50IGRlc2NfbGlzdF9sZW47Ci19IGJ0aGRfYXBwX3BhcmFtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzZXJ2aWNlX3R5cGU7Ci0gIHVpbnQzMl90IHRva2VuX3JhdGU7Ci0gIHVpbnQzMl90IHRva2VuX2J1Y2tldF9zaXplOwotICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aDsKLSAgdWludDMyX3QgYWNjZXNzX2xhdGVuY3k7Ci0gIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbjsKLX0gYnRoZF9xb3NfcGFyYW1fdDsKLQotdHlwZWRlZiB2b2lkICgqYnRoZF9hcHBsaWNhdGlvbl9zdGF0ZV9jYWxsYmFjaykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGRfYXBwbGljYXRpb25fc3RhdGVfdCBzdGF0ZSk7Ci10eXBlZGVmIHZvaWQgKCpidGhkX2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2spKFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGRfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlKTsKLXR5cGVkZWYgdm9pZCAoKmJ0aGRfZ2V0X3JlcG9ydF9jYWxsYmFjaykodWludDhfdCB0eXBlLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBidWZmZXJfc2l6ZSk7Ci10eXBlZGVmIHZvaWQgKCpidGhkX3NldF9yZXBvcnRfY2FsbGJhY2spKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBpZCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpOwotdHlwZWRlZiB2b2lkICgqYnRoZF9zZXRfcHJvdG9jb2xfY2FsbGJhY2spKHVpbnQ4X3QgcHJvdG9jb2wpOwotdHlwZWRlZiB2b2lkICgqYnRoZF9pbnRyX2RhdGFfY2FsbGJhY2spKHVpbnQ4X3QgcmVwb3J0X2lkLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKTsKLXR5cGVkZWYgdm9pZCAoKmJ0aGRfdmNfdW5wbHVnX2NhbGxiYWNrKSh2b2lkKTsKLQotLyoqIEJULUhEIGNhbGxiYWNrcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3Qgc2l6ZTsKLQotICBidGhkX2FwcGxpY2F0aW9uX3N0YXRlX2NhbGxiYWNrIGFwcGxpY2F0aW9uX3N0YXRlX2NiOwotICBidGhkX2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2sgY29ubmVjdGlvbl9zdGF0ZV9jYjsKLSAgYnRoZF9nZXRfcmVwb3J0X2NhbGxiYWNrIGdldF9yZXBvcnRfY2I7Ci0gIGJ0aGRfc2V0X3JlcG9ydF9jYWxsYmFjayBzZXRfcmVwb3J0X2NiOwotICBidGhkX3NldF9wcm90b2NvbF9jYWxsYmFjayBzZXRfcHJvdG9jb2xfY2I7Ci0gIGJ0aGRfaW50cl9kYXRhX2NhbGxiYWNrIGludHJfZGF0YV9jYjsKLSAgYnRoZF92Y191bnBsdWdfY2FsbGJhY2sgdmNfdW5wbHVnX2NiOwotfSBidGhkX2NhbGxiYWNrc190OwotCi0vKiogQlQtSEQgaW50ZXJmYWNlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNpemVfdCBzaXplOwotCi0gIC8qKiBpbml0IGludGVyZmFjZSBhbmQgcmVnaXN0ZXIgY2FsbGJhY2tzICovCi0gIGJ0X3N0YXR1c190ICgqaW5pdCkoYnRoZF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKTsKLQotICAvKiogY2xvc2UgaW50ZXJmYWNlICovCi0gIHZvaWQgKCpjbGVhbnVwKSh2b2lkKTsKLQotICAvKiogcmVnaXN0ZXIgYXBwbGljYXRpb24gKi8KLSAgYnRfc3RhdHVzX3QgKCpyZWdpc3Rlcl9hcHApKGJ0aGRfYXBwX3BhcmFtX3QqIGFwcF9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGRfcW9zX3BhcmFtX3QqIGluX3FvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGRfcW9zX3BhcmFtX3QqIG91dF9xb3MpOwotCi0gIC8qKiB1bnJlZ2lzdGVyIGFwcGxpY2F0aW9uICovCi0gIGJ0X3N0YXR1c190ICgqdW5yZWdpc3Rlcl9hcHApKHZvaWQpOwotCi0gIC8qKiBjb25uZWN0cyB0byBob3N0IHdpdGggdmlydHVhbCBjYWJsZSAqLwotICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBkaXNjb25uZWN0cyBmcm9tIGN1cnJlbnRseSBjb25uZWN0ZWQgaG9zdCAqLwotICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3QpKHZvaWQpOwotCi0gIC8qKiBzZW5kIHJlcG9ydCAqLwotICBidF9zdGF0dXNfdCAoKnNlbmRfcmVwb3J0KShidGhkX3JlcG9ydF90eXBlX3QgdHlwZSwgdWludDhfdCBpZCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpOwotCi0gIC8qKiBub3RpZmllcyBlcnJvciBmb3IgaW52YWxpZCBTRVRfUkVQT1JUICovCi0gIGJ0X3N0YXR1c190ICgqcmVwb3J0X2Vycm9yKSh1aW50OF90IGVycm9yKTsKLQotICAvKiogc2VuZCBWaXJ0dWFsIENhYmxlIFVucGx1ZyAgKi8KLSAgYnRfc3RhdHVzX3QgKCp2aXJ0dWFsX2NhYmxlX3VucGx1Zykodm9pZCk7Ci0KLX0gYnRoZF9pbnRlcmZhY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9IRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hlYXJpbmdfYWlkLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2hlYXJpbmdfYWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTg4MGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9oZWFyaW5nX2FpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfSEVBUklOR19BSURfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfSEVBUklOR19BSURfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGVhcmluZ19haWQgewotCi1lbnVtIGNsYXNzIENvbm5lY3Rpb25TdGF0ZSB7Ci0gIERJU0NPTk5FQ1RFRCA9IDAsCi0gIENPTk5FQ1RJTkcsCi0gIENPTk5FQ1RFRCwKLSAgRElTQ09OTkVDVElORwotfTsKLQotY2xhc3MgSGVhcmluZ0FpZENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5IZWFyaW5nQWlkQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgcHJvZmlsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKiBDYWxsYmFjayBmb3IgZGV2aWNlIGJlaW5nIGF2YWlsYWJsZS4gSXMgZXhlY3V0ZWQgd2hlbiBkZXZpY2VzIGFyZSBsb2FkZWQKLSAgICogZnJvbSBzdG9yYWdlIG9uIHN0YWNrIGJyaW5ndXAsIGFuZCB3aGVuIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHByb2ZpbGUuCi0gICAqIE1haW4gcHVycG9zZSBvZiB0aGlzIGNhbGxiYWNrIGlzIHRvIGtlZXAgaXRzIHVzZXJzIGluZm9ybWVkIG9mIGRldmljZQotICAgKiBjYXBhYmlsaXRpZXMgYW5kIGhpU3luY0lkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIE9uRGV2aWNlQXZhaWxhYmxlKHVpbnQ4X3QgY2FwYWJpbGl0aWVzLCB1aW50NjRfdCBoaVN5bmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLX07Ci0KLWNsYXNzIEhlYXJpbmdBaWRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SGVhcmluZ0FpZEludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAvKiogUmVnaXN0ZXIgdGhlIEhlYXJpbmcgQWlkIGNhbGxiYWNrcyAqLwotICB2aXJ0dWFsIHZvaWQgSW5pdChIZWFyaW5nQWlkQ2FsbGJhY2tzKiBjYWxsYmFja3MpID0gMDsKLQotICAvKiogQ29ubmVjdCB0byBIZWFyaW5nIEFpZCAqLwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgLyoqIERpc2Nvbm5lY3QgZnJvbSBIZWFyaW5nIEFpZCAqLwotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgLyoqIEFkZCBhIGhlYXJpbmcgYWlkIGRldmljZSB0byBhY2NlcHRsaXN0ICovCi0gIHZpcnR1YWwgdm9pZCBBZGRUb0FjY2VwdGxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKiBTZXQgdGhlIHZvbHVtZSAqLwotICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGludDhfdCB2b2x1bWUpID0gMDsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UuICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhbnVwKHZvaWQpID0gMDsKLQotICAvKiBDYWxsZWQgd2hlbiBIZWFyaW5nIEFpZCBpcyB1bmJvbmRlZC4gKi8KLSAgdmlydHVhbCB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGVhcmluZ19haWQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9IRUFSSU5HX0FJRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMmRlNGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9oZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGVhZHNldCB7Ci0KLS8qIEFUIHJlc3BvbnNlIGNvZGUgLSBPSy9FcnJvciAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9BVF9SRVNQT05TRV9FUlJPUiA9IDAsCi0gIEJUSEZfQVRfUkVTUE9OU0VfT0sKLX0gYnRoZl9hdF9yZXNwb25zZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEID0gMCwKLSAgQlRIRl9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gIEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQsCi0gIEJUSEZfQ09OTkVDVElPTl9TVEFURV9TTENfQ09OTkVDVEVELAotICBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORwotfSBidGhmX2Nvbm5lY3Rpb25fc3RhdGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9BVURJT19TVEFURV9ESVNDT05ORUNURUQgPSAwLAotICBCVEhGX0FVRElPX1NUQVRFX0NPTk5FQ1RJTkcsCi0gIEJUSEZfQVVESU9fU1RBVEVfQ09OTkVDVEVELAotICBCVEhGX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RJTkcKLX0gYnRoZl9hdWRpb19zdGF0ZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX1ZSX1NUQVRFX1NUT1BQRUQgPSAwLAotICBCVEhGX1ZSX1NUQVRFX1NUQVJURUQKLX0gYnRoZl92cl9zdGF0ZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX1ZPTFVNRV9UWVBFX1NQSyA9IDAsCi0gIEJUSEZfVk9MVU1FX1RZUEVfTUlDCi19IGJ0aGZfdm9sdW1lX3R5cGVfdDsKLQotLyogTm9pc2UgUmVkdWN0aW9uIGFuZCBFY2hvIENhbmNlbGxhdGlvbiAqLwotdHlwZWRlZiBlbnVtIHsgQlRIRl9OUkVDX1NUT1AsIEJUSEZfTlJFQ19TVEFSVCB9IGJ0aGZfbnJlY190OwotCi0vKiBXQlMgY29kZWMgc2V0dGluZyAqLwotdHlwZWRlZiBlbnVtIHsgQlRIRl9XQlNfTk9ORSwgQlRIRl9XQlNfTk8sIEJUSEZfV0JTX1lFUyB9IGJ0aGZfd2JzX2NvbmZpZ190OwotCi0vKiBDSExEIC0gQ2FsbCBoZWxkIGhhbmRsaW5nICovCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NITERfVFlQRV9SRUxFQVNFSEVMRCwgIC8vIFRlcm1pbmF0ZSBhbGwgaGVsZCBvciBzZXQgVURVQigiYnVzeSIpIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0aW5nIGNhbGwKLSAgQlRIRl9DSExEX1RZUEVfUkVMRUFTRUFDVElWRV9BQ0NFUFRIRUxELCAgLy8gVGVybWluYXRlIGFsbCBhY3RpdmUgY2FsbHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdHMgYSB3YWl0aW5nL2hlbGQgY2FsbAotICBCVEhGX0NITERfVFlQRV9IT0xEQUNUSVZFX0FDQ0VQVEhFTEQsICAvLyBIb2xkIGFsbCBhY3RpdmUgY2FsbHMgYW5kIGFjY2VwdHMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0aW5nL2hlbGQgY2FsbAotICBCVEhGX0NITERfVFlQRV9BRERIRUxEVE9DT05GLCAgICAgICAgICAvLyBBZGQgYWxsIGhlbGQgY2FsbHMgdG8gYSBjb25mZXJlbmNlCi19IGJ0aGZfY2hsZF90eXBlX3Q7Ci0KLS8qIEhGIEluZGljYXRvcnMgSEZQIDEuNyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9IRl9JTkRfRU5IQU5DRURfRFJJVkVSX1NBRkVUWSA9IDEsCi0gIEJUSEZfSEZfSU5EX0JBVFRFUllfTEVWRUxfU1RBVFVTID0gMiwKLX0gYnRoZl9oZl9pbmRfdHlwZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0hGX0lORF9ESVNBQkxFRCA9IDAsCi0gIEJUSEZfSEZfSU5EX0VOQUJMRUQsCi19IGJ0aGZfaGZfaW5kX3N0YXR1c190OwotCi0vKiogTmV0d29yayBTdGF0dXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfTkVUV09SS19TVEFURV9OT1RfQVZBSUxBQkxFID0gMCwKLSAgQlRIRl9ORVRXT1JLX1NUQVRFX0FWQUlMQUJMRQotfSBidGhmX25ldHdvcmtfc3RhdGVfdDsKLQotLyoqIFNlcnZpY2UgdHlwZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9TRVJWSUNFX1RZUEVfSE9NRSA9IDAsCi0gIEJUSEZfU0VSVklDRV9UWVBFX1JPQU1JTkcKLX0gYnRoZl9zZXJ2aWNlX3R5cGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9DQUxMX1NUQVRFX0FDVElWRSA9IDAsCi0gIEJUSEZfQ0FMTF9TVEFURV9IRUxELAotICBCVEhGX0NBTExfU1RBVEVfRElBTElORywKLSAgQlRIRl9DQUxMX1NUQVRFX0FMRVJUSU5HLAotICBCVEhGX0NBTExfU1RBVEVfSU5DT01JTkcsCi0gIEJUSEZfQ0FMTF9TVEFURV9XQUlUSU5HLAotICBCVEhGX0NBTExfU1RBVEVfSURMRSwKLSAgQlRIRl9DQUxMX1NUQVRFX0RJU0NPTk5FQ1RFRAotfSBidGhmX2NhbGxfc3RhdGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9DQUxMX0RJUkVDVElPTl9PVVRHT0lORyA9IDAsCi0gIEJUSEZfQ0FMTF9ESVJFQ1RJT05fSU5DT01JTkcKLX0gYnRoZl9jYWxsX2RpcmVjdGlvbl90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NBTExfVFlQRV9WT0lDRSA9IDAsCi0gIEJUSEZfQ0FMTF9UWVBFX0RBVEEsCi0gIEJUSEZfQ0FMTF9UWVBFX0ZBWAotfSBidGhmX2NhbGxfbW9kZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NBTExfTVBUWV9UWVBFX1NJTkdMRSA9IDAsCi0gIEJUSEZfQ0FMTF9NUFRZX1RZUEVfTVVMVEkKLX0gYnRoZl9jYWxsX21wdHlfdHlwZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NBTExfQUREUlRZUEVfVU5LTk9XTiA9IDB4ODEsCi0gIEJUSEZfQ0FMTF9BRERSVFlQRV9JTlRFUk5BVElPTkFMID0gMHg5MQotfSBidGhmX2NhbGxfYWRkcnR5cGVfdDsKLQotfSAgLy8gbmFtZXNwYWNlIGhlYWRzZXQKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmX2NsaWVudC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9oZl9jbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2MzgwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmX2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JUX0hGX0NMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9IRl9DTElFTlRfSAotI2luY2x1ZGUgPHJhd19hZGRyZXNzLmg+Ci0KLV9fQkVHSU5fREVDTFMKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9DTElFTlRfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwLAotICBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gIEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVELAotICBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQsCi0gIEJUSEZfQ0xJRU5UX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORwotfSBidGhmX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDAsCi0gIEJUSEZfQ0xJRU5UX0FVRElPX1NUQVRFX0NPTk5FQ1RJTkcsCi0gIEJUSEZfQ0xJRU5UX0FVRElPX1NUQVRFX0NPTk5FQ1RFRCwKLSAgQlRIRl9DTElFTlRfQVVESU9fU1RBVEVfQ09OTkVDVEVEX01TQkMsCi19IGJ0aGZfY2xpZW50X2F1ZGlvX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX1ZSX1NUQVRFX1NUT1BQRUQgPSAwLAotICBCVEhGX0NMSUVOVF9WUl9TVEFURV9TVEFSVEVECi19IGJ0aGZfY2xpZW50X3ZyX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX1ZPTFVNRV9UWVBFX1NQSyA9IDAsCi0gIEJUSEZfQ0xJRU5UX1ZPTFVNRV9UWVBFX01JQwotfSBidGhmX2NsaWVudF92b2x1bWVfdHlwZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9ORVRXT1JLX1NUQVRFX05PVF9BVkFJTEFCTEUgPSAwLAotICBCVEhGX0NMSUVOVF9ORVRXT1JLX1NUQVRFX0FWQUlMQUJMRQotfSBidGhmX2NsaWVudF9uZXR3b3JrX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX1NFUlZJQ0VfVFlQRV9IT01FID0gMCwKLSAgQlRIRl9DTElFTlRfU0VSVklDRV9UWVBFX1JPQU1JTkcKLX0gYnRoZl9jbGllbnRfc2VydmljZV90eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX0NBTExfU1RBVEVfQUNUSVZFID0gMCwKLSAgQlRIRl9DTElFTlRfQ0FMTF9TVEFURV9IRUxELAotICBCVEhGX0NMSUVOVF9DQUxMX1NUQVRFX0RJQUxJTkcsCi0gIEJUSEZfQ0xJRU5UX0NBTExfU1RBVEVfQUxFUlRJTkcsCi0gIEJUSEZfQ0xJRU5UX0NBTExfU1RBVEVfSU5DT01JTkcsCi0gIEJUSEZfQ0xJRU5UX0NBTExfU1RBVEVfV0FJVElORywKLSAgQlRIRl9DTElFTlRfQ0FMTF9TVEFURV9IRUxEX0JZX1JFU1BfSE9MRCwKLX0gYnRoZl9jbGllbnRfY2FsbF9zdGF0ZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9DQUxMX05PX0NBTExTX0lOX1BST0dSRVNTID0gMCwKLSAgQlRIRl9DTElFTlRfQ0FMTF9DQUxMU19JTl9QUk9HUkVTUwotfSBidGhmX2NsaWVudF9jYWxsX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX0NBTExTRVRVUF9OT05FID0gMCwKLSAgQlRIRl9DTElFTlRfQ0FMTFNFVFVQX0lOQ09NSU5HLAotICBCVEhGX0NMSUVOVF9DQUxMU0VUVVBfT1VUR09JTkcsCi0gIEJUSEZfQ0xJRU5UX0NBTExTRVRVUF9BTEVSVElORwotCi19IGJ0aGZfY2xpZW50X2NhbGxzZXR1cF90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9DQUxMSEVMRF9OT05FID0gMCwKLSAgQlRIRl9DTElFTlRfQ0FMTEhFTERfSE9MRF9BTkRfQUNUSVZFLAotICBCVEhGX0NMSUVOVF9DQUxMSEVMRF9IT0xELAotfSBidGhmX2NsaWVudF9jYWxsaGVsZF90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9SRVNQX0FORF9IT0xEX0hFTEQgPSAwLAotICBCVFJIX0NMSUVOVF9SRVNQX0FORF9IT0xEX0FDQ0VQVCwKLSAgQlRSSF9DTElFTlRfUkVTUF9BTkRfSE9MRF9SRUpFQ1QsCi19IGJ0aGZfY2xpZW50X3Jlc3BfYW5kX2hvbGRfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRIRl9DTElFTlRfQ0FMTF9ESVJFQ1RJT05fT1VUR09JTkcgPSAwLAotICBCVEhGX0NMSUVOVF9DQUxMX0RJUkVDVElPTl9JTkNPTUlORwotfSBidGhmX2NsaWVudF9jYWxsX2RpcmVjdGlvbl90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9DQUxMX01QVFlfVFlQRV9TSU5HTEUgPSAwLAotICBCVEhGX0NMSUVOVF9DQUxMX01QVFlfVFlQRV9NVUxUSQotfSBidGhmX2NsaWVudF9jYWxsX21wdHlfdHlwZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9DTURfQ09NUExFVEVfT0sgPSAwLAotICBCVEhGX0NMSUVOVF9DTURfQ09NUExFVEVfRVJST1IsCi0gIEJUSEZfQ0xJRU5UX0NNRF9DT01QTEVURV9FUlJPUl9OT19DQVJSSUVSLAotICBCVEhGX0NMSUVOVF9DTURfQ09NUExFVEVfRVJST1JfQlVTWSwKLSAgQlRIRl9DTElFTlRfQ01EX0NPTVBMRVRFX0VSUk9SX05PX0FOU1dFUiwKLSAgQlRIRl9DTElFTlRfQ01EX0NPTVBMRVRFX0VSUk9SX0RFTEFZRUQsCi0gIEJUSEZfQ0xJRU5UX0NNRF9DT01QTEVURV9FUlJPUl9SRUpFQ1RMSVNURUQsCi0gIEJUSEZfQ0xJRU5UX0NNRF9DT01QTEVURV9FUlJPUl9DTUUKLX0gYnRoZl9jbGllbnRfY21kX2NvbXBsZXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfMCA9IDAsCi0gIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfMSwKLSAgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQ0hMRF8yLAotICBCVEhGX0NMSUVOVF9DQUxMX0FDVElPTl9DSExEXzMsCi0gIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0NITERfNCwKLSAgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQ0hMRF8xeCwKLSAgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQ0hMRF8yeCwKLSAgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQVRBLAotICBCVEhGX0NMSUVOVF9DQUxMX0FDVElPTl9DSFVQLAotICBCVEhGX0NMSUVOVF9DQUxMX0FDVElPTl9CVFJIXzAsCi0gIEJUSEZfQ0xJRU5UX0NBTExfQUNUSU9OX0JUUkhfMSwKLSAgQlRIRl9DTElFTlRfQ0FMTF9BQ1RJT05fQlRSSF8yLAotfSBidGhmX2NsaWVudF9jYWxsX2FjdGlvbl90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9TRVJWSUNFX1VOS05PV04gPSAwLAotICBCVEhGX0NMSUVOVF9TRVJWSUNFX1ZPSUNFLAotICBCVEhGX0NMSUVOVF9TRVJWSUNFX0ZBWAotfSBidGhmX2NsaWVudF9zdWJzY3JpYmVyX3NlcnZpY2VfdHlwZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVEhGX0NMSUVOVF9JTl9CQU5EX1JJTkdUT05FX05PVF9QUk9WSURFRCA9IDAsCi0gIEJUSEZfQ0xJRU5UX0lOX0JBTkRfUklOR1RPTkVfUFJPVklERUQsCi19IGJ0aGZfY2xpZW50X2luX2JhbmRfcmluZ19zdGF0ZV90OwotCi0vKiBQZWVyIGZlYXR1cmVzIG1hc2tzICovCi0jZGVmaW5lIEJUSEZfQ0xJRU5UX1BFRVJfRkVBVF8zV0FZIDB4MDAwMDAwMDEgLyogVGhyZWUtd2F5IGNhbGxpbmcgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfUEVFUl9GRUFUX0VDTlIgXAotICAweDAwMDAwMDAyIC8qIEVjaG8gY2FuY2VsbGF0aW9uIGFuZC9vciBub2lzZSByZWR1Y3Rpb24gKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfUEVFUl9GRUFUX1ZSRUMgMHgwMDAwMDAwNCAgIC8qIFZvaWNlIHJlY29nbml0aW9uICovCi0jZGVmaW5lIEJUSEZfQ0xJRU5UX1BFRVJfRkVBVF9JTkJBTkQgMHgwMDAwMDAwOCAvKiBJbi1iYW5kIHJpbmcgdG9uZSAqLwotI2RlZmluZSBCVEhGX0NMSUVOVF9QRUVSX0ZFQVRfVlRBRyBcCi0gIDB4MDAwMDAwMTAgLyogQXR0YWNoIGEgcGhvbmUgbnVtYmVyIHRvIGEgdm9pY2UgdGFnICovCi0jZGVmaW5lIEJUSEZfQ0xJRU5UX1BFRVJfRkVBVF9SRUpFQ1QgXAotICAweDAwMDAwMDIwIC8qIEFiaWxpdHkgdG8gcmVqZWN0IGluY29taW5nIGNhbGwgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfUEVFUl9GRUFUX0VDUyAweDAwMDAwMDQwICAgIC8qIEVuaGFuY2VkIENhbGwgU3RhdHVzICovCi0jZGVmaW5lIEJUSEZfQ0xJRU5UX1BFRVJfRkVBVF9FQ0MgMHgwMDAwMDA4MCAgICAvKiBFbmhhbmNlZCBDYWxsIENvbnRyb2wgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfUEVFUl9GRUFUX0VYVEVSUiAweDAwMDAwMTAwIC8qIEV4dGVuZGVkIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIEJUSEZfQ0xJRU5UX1BFRVJfRkVBVF9DT0RFQyAweDAwMDAwMjAwICAvKiBDb2RlYyBOZWdvdGlhdGlvbiAqLwotCi0vKiBQZWVyIGNhbGwgaGFuZGxpbmcgZmVhdHVyZXMgbWFza3MgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfQ0hMRF9GRUFUX1JFTCBcCi0gIDB4MDAwMDAwMDEgLyogMCAgUmVsZWFzZSB3YWl0aW5nIGNhbGwgb3IgaGVsZCBjYWxscyAqLwotI2RlZmluZSBCVEhGX0NMSUVOVF9DSExEX0ZFQVRfUkVMX0FDQyAgICAgICAgICAgICAgICAgICAgXAotICAweDAwMDAwMDAyIC8qIDEgIFJlbGVhc2UgYWN0aXZlIGNhbGxzIGFuZCBhY2NlcHQgb3RoZXIgXAotICAgICAgICAgICAgICAgICAgICh3YWl0aW5nIG9yIGhlbGQpIGNhbCAqLwotI2RlZmluZSBCVEhGX0NMSUVOVF9DSExEX0ZFQVRfUkVMX1ggXAotICAweDAwMDAwMDA0IC8qIDF4IFJlbGVhc2Ugc3BlY2lmaWVkIGFjdGl2ZSBjYWxsIG9ubHkgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfQ0hMRF9GRUFUX0hPTERfQUNDICAgICAgICAgICAgICAgICAgIFwKLSAgMHgwMDAwMDAwOCAvKiAyICBBY3RpdmUgY2FsbHMgb24gaG9sZCBhbmQgYWNjZXB0IG90aGVyIFwKLSAgICAgICAgICAgICAgICAgICAod2FpdGluZyBvciBoZWxkKSBjYWxsICovCi0jZGVmaW5lIEJUSEZfQ0xJRU5UX0NITERfRkVBVF9QUklWX1ggICAgICAgICAgICAgICAgICAgXAotICAweDAwMDAwMDEwIC8qIDJ4IFJlcXVlc3QgcHJpdmF0ZSBtb2RlIHdpdGggc3BlY2lmaWVkIFwKLSAgICAgICAgICAgICAgICAgICBjYWxsIChwdXQgdGhlIHJlc3Qgb24gaG9sZCkgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfQ0hMRF9GRUFUX01FUkdFIFwKLSAgMHgwMDAwMDAyMCAvKiAzICBBZGQgaGVsZCBjYWxsIHRvIG11bHRpcGFydHkgKi8KLSNkZWZpbmUgQlRIRl9DTElFTlRfQ0hMRF9GRUFUX01FUkdFX0RFVEFDSCAgICAgXAotICAweDAwMDAwMDQwIC8qIDQgIENvbm5lY3QgdHdvIGNhbGxzIGFuZCBsZWF2ZSBcCi0gICAgICAgICAgICAgICAgICAgKGRpc2Nvbm5lY3QgZnJvbSkgbXVsdGlwYXJ0eSAqLwotCi0vKiogQ2FsbGJhY2sgZm9yIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgotICogIHN0YXRlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIEJ0SGZDb25uZWN0aW9uU3RhdGUKLSAqICBwZWVyL2NobGRfZmVhdHVyZXMgYXJlIHZhbGlkIG9ubHkgZm9yCi0gKiBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQgc3RhdGUKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgYnRoZl9jbGllbnRfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlLAotICAgIHVuc2lnbmVkIGludCBwZWVyX2ZlYXQsIHVuc2lnbmVkIGludCBjaGxkX2ZlYXQpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGF1ZGlvIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgotICogIHN0YXRlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIEJ0SGZBdWRpb1N0YXRlCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2F1ZGlvX3N0YXRlX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBidGhmX2NsaWVudF9hdWRpb19zdGF0ZV90IHN0YXRlKTsKLQotLyoqIENhbGxiYWNrIGZvciBWUiBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZS4KLSAqICBzdGF0ZSB3aWxsIGhhdmUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBCdEhmVlJTdGF0ZQotICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF92cl9jbWRfY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X3ZyX3N0YXRlX3Qgc3RhdGUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIG5ldHdvcmsgc3RhdGUgY2hhbmdlCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X25ldHdvcmtfc3RhdGVfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJ0aGZfY2xpZW50X25ldHdvcmtfc3RhdGVfdCBzdGF0ZSk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgbmV0d29yayByb2FtaW5nIHN0YXR1cyBjaGFuZ2UKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfbmV0d29ya19yb2FtaW5nX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBidGhmX2NsaWVudF9zZXJ2aWNlX3R5cGVfdCB0eXBlKTsKLQotLyoqIENhbGxiYWNrIGZvciBzaWduYWwgc3RyZW5ndGggaW5kaWNhdGlvbgotICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF9uZXR3b3JrX3NpZ25hbF9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lnbmFsX3N0cmVuZ3RoKTsKLQotLyoqIENhbGxiYWNrIGZvciBiYXR0ZXJ5IGxldmVsIGluZGljYXRpb24KLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfYmF0dGVyeV9sZXZlbF9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXR0ZXJ5X2xldmVsKTsKLQotLyoqIENhbGxiYWNrIGZvciBjdXJyZW50IG9wZXJhdG9yIG5hbWUKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfY3VycmVudF9vcGVyYXRvcl9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGNhbGwgaW5kaWNhdG9yCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2NhbGxfY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF9jYWxsX3QgY2FsbCk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgY2FsbHNldHVwIGluZGljYXRvcgotICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF9jYWxsc2V0dXBfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJ0aGZfY2xpZW50X2NhbGxzZXR1cF90IGNhbGxzZXR1cCk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgY2FsbGhlbGQgaW5kaWNhdG9yCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2NhbGxoZWxkX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxoZWxkX3QgY2FsbGhlbGQpOwotCi0vKiogQ2FsbGJhY2sgZm9yIHJlc3BvbnNlIGFuZCBob2xkCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X3Jlc3BfYW5kX2hvbGRfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJ0aGZfY2xpZW50X3Jlc3BfYW5kX2hvbGRfdCByZXNwX2FuZF9ob2xkKTsKLQotLyoqIENhbGxiYWNrIGZvciBDYWxsaW5nIExpbmUgSWRlbnRpZmljYXRpb24gbm90aWZpY2F0aW9uCi0gKiAgV2lsbCBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIGNhbGwgYW5kIG51bWJlciBpcyBwcm92aWRlZC4KLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfY2xpcF9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG51bWJlcik7Ci0KLS8qKgotICogQ2FsbGJhY2sgZm9yIENhbGwgV2FpdGluZyBub3RpZmljYXRpb24KLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfY2FsbF93YWl0aW5nX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBudW1iZXIpOwotCi0vKioKLSAqICBDYWxsYmFjayBmb3IgbGlzdGluZyBjdXJyZW50IGNhbGxzLiBDYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUuCi0gKiAgSWYgbnVtYmVyIGlzIHVua25vd24gTlVMTCBpcyBwYXNzZWQuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2N1cnJlbnRfY2FsbHMpKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxfZGlyZWN0aW9uX3QgZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jbGllbnRfY2FsbF9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jbGllbnRfY2FsbF9tcHR5X3R5cGVfdCBtcHR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbnVtYmVyKTsKLQotLyoqIENhbGxiYWNrIGZvciBhdWRpbyB2b2x1bWUgY2hhbmdlCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X3ZvbHVtZV9jaGFuZ2VfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJ0aGZfY2xpZW50X3ZvbHVtZV90eXBlX3QgdHlwZSwgaW50IHZvbHVtZSk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgY29tbWFuZCBjb21wbGV0ZSBldmVudAotICogIGNtZSBpcyB2YWxpZCBvbmx5IGZvciBCVEhGX0NMSUVOVF9DTURfQ09NUExFVEVfRVJST1JfQ01FIHR5cGUKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfY21kX2NvbXBsZXRlX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBidGhmX2NsaWVudF9jbWRfY29tcGxldGVfdCB0eXBlLCBpbnQgY21lKTsKLQotLyoqIENhbGxiYWNrIGZvciBzdWJzY3JpYmVyIGluZm9ybWF0aW9uCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X3N1YnNjcmliZXJfaW5mb19jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgY29uc3QgY2hhciogbmFtZSwKLSAgICBidGhmX2NsaWVudF9zdWJzY3JpYmVyX3NlcnZpY2VfdHlwZV90IHR5cGUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGluLWJhbmQgcmluZyB0b25lIHNldHRpbmdzCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2luX2JhbmRfcmluZ190b25lX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBidGhmX2NsaWVudF9pbl9iYW5kX3Jpbmdfc3RhdGVfdCBzdGF0ZSk7Ci0KLS8qKgotICogQ2FsbGJhY2sgZm9yIHJlcXVlc3RlZCBudW1iZXIgZnJvbSBBRwotICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF9sYXN0X3ZvaWNlX3RhZ19udW1iZXJfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGNvbnN0IGNoYXIqIG51bWJlcik7Ci0KLS8qKgotICogQ2FsbGJhY2sgZm9yIHNlbmRpbmcgcmluZyBpbmRpY2F0aW9uIHRvIGFwcAotICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF9yaW5nX2luZGljYXRpb25fY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0vKioKLSAqIENhbGxiYWNrIGZvciBzZW5kaW5nIHVua25vd24gKHZlbmRvciBzcGVjaWZpYykgZXZlbnQKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfdW5rbm93bl9ldmVudF9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVua25vd19ldmVudCk7Ci0KLS8qKiBCVC1IRiBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKEJ0SGZDbGllbnRDYWxsYmFja3MpICovCi0gIHNpemVfdCBzaXplOwotICBidGhmX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrIGNvbm5lY3Rpb25fc3RhdGVfY2I7Ci0gIGJ0aGZfY2xpZW50X2F1ZGlvX3N0YXRlX2NhbGxiYWNrIGF1ZGlvX3N0YXRlX2NiOwotICBidGhmX2NsaWVudF92cl9jbWRfY2FsbGJhY2sgdnJfY21kX2NiOwotICBidGhmX2NsaWVudF9uZXR3b3JrX3N0YXRlX2NhbGxiYWNrIG5ldHdvcmtfc3RhdGVfY2I7Ci0gIGJ0aGZfY2xpZW50X25ldHdvcmtfcm9hbWluZ19jYWxsYmFjayBuZXR3b3JrX3JvYW1pbmdfY2I7Ci0gIGJ0aGZfY2xpZW50X25ldHdvcmtfc2lnbmFsX2NhbGxiYWNrIG5ldHdvcmtfc2lnbmFsX2NiOwotICBidGhmX2NsaWVudF9iYXR0ZXJ5X2xldmVsX2NhbGxiYWNrIGJhdHRlcnlfbGV2ZWxfY2I7Ci0gIGJ0aGZfY2xpZW50X2N1cnJlbnRfb3BlcmF0b3JfY2FsbGJhY2sgY3VycmVudF9vcGVyYXRvcl9jYjsKLSAgYnRoZl9jbGllbnRfY2FsbF9jYWxsYmFjayBjYWxsX2NiOwotICBidGhmX2NsaWVudF9jYWxsc2V0dXBfY2FsbGJhY2sgY2FsbHNldHVwX2NiOwotICBidGhmX2NsaWVudF9jYWxsaGVsZF9jYWxsYmFjayBjYWxsaGVsZF9jYjsKLSAgYnRoZl9jbGllbnRfcmVzcF9hbmRfaG9sZF9jYWxsYmFjayByZXNwX2FuZF9ob2xkX2NiOwotICBidGhmX2NsaWVudF9jbGlwX2NhbGxiYWNrIGNsaXBfY2I7Ci0gIGJ0aGZfY2xpZW50X2NhbGxfd2FpdGluZ19jYWxsYmFjayBjYWxsX3dhaXRpbmdfY2I7Ci0gIGJ0aGZfY2xpZW50X2N1cnJlbnRfY2FsbHMgY3VycmVudF9jYWxsc19jYjsKLSAgYnRoZl9jbGllbnRfdm9sdW1lX2NoYW5nZV9jYWxsYmFjayB2b2x1bWVfY2hhbmdlX2NiOwotICBidGhmX2NsaWVudF9jbWRfY29tcGxldGVfY2FsbGJhY2sgY21kX2NvbXBsZXRlX2NiOwotICBidGhmX2NsaWVudF9zdWJzY3JpYmVyX2luZm9fY2FsbGJhY2sgc3Vic2NyaWJlcl9pbmZvX2NiOwotICBidGhmX2NsaWVudF9pbl9iYW5kX3JpbmdfdG9uZV9jYWxsYmFjayBpbl9iYW5kX3JpbmdfdG9uZV9jYjsKLSAgYnRoZl9jbGllbnRfbGFzdF92b2ljZV90YWdfbnVtYmVyX2NhbGxiYWNrIGxhc3Rfdm9pY2VfdGFnX251bWJlcl9jYWxsYmFjazsKLSAgYnRoZl9jbGllbnRfcmluZ19pbmRpY2F0aW9uX2NhbGxiYWNrIHJpbmdfaW5kaWNhdGlvbl9jYjsKLSAgYnRoZl9jbGllbnRfdW5rbm93bl9ldmVudF9jYWxsYmFjayB1bmtub3duX2V2ZW50X2NiOwotfSBidGhmX2NsaWVudF9jYWxsYmFja3NfdDsKLQotLyoqIFJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJULUhGIGludGVyZmFjZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoQnRIZkNsaWVudEludGVyZmFjZSkgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgQnRIZiBjYWxsYmFja3MKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqaW5pdCkoYnRoZl9jbGllbnRfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7Ci0KLSAgLyoqIGNvbm5lY3QgdG8gYXVkaW8gZ2F0ZXdheSAqLwotICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBkaXNjb25uZWN0IGZyb20gYXVkaW8gZ2F0ZXdheSAqLwotICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3QpKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBjcmVhdGUgYW4gYXVkaW8gY29ubmVjdGlvbiAqLwotICBidF9zdGF0dXNfdCAoKmNvbm5lY3RfYXVkaW8pKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBjbG9zZSB0aGUgYXVkaW8gY29ubmVjdGlvbiAqLwotICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3RfYXVkaW8pKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBzdGFydCB2b2ljZSByZWNvZ25pdGlvbiAqLwotICBidF9zdGF0dXNfdCAoKnN0YXJ0X3ZvaWNlX3JlY29nbml0aW9uKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotICAvKiogc3RvcCB2b2ljZSByZWNvZ25pdGlvbiAqLwotICBidF9zdGF0dXNfdCAoKnN0b3Bfdm9pY2VfcmVjb2duaXRpb24pKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiB2b2x1bWUgY29udHJvbCAqLwotICBidF9zdGF0dXNfdCAoKnZvbHVtZV9jb250cm9sKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF92b2x1bWVfdHlwZV90IHR5cGUsIGludCB2b2x1bWUpOwotCi0gIC8qKiBwbGFjZSBhIGNhbGwgd2l0aCBudW1iZXIgYSBudW1iZXIKLSAgICogaWYgbnVtYmVyIGlzIE5VTEwgbGFzdCBjYWxsZWQgbnVtYmVyIGlzIGNhbGxlZCAoYWthIHJlLWRpYWwpKi8KLSAgYnRfc3RhdHVzX3QgKCpkaWFsKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBjb25zdCBjaGFyKiBudW1iZXIpOwotCi0gIC8qKiBwbGFjZSBhIGNhbGwgd2l0aCBudW1iZXIgc3BlY2lmaWVkIGJ5IGxvY2F0aW9uIChzcGVlZCBkaWFsKSAqLwotICBidF9zdGF0dXNfdCAoKmRpYWxfbWVtb3J5KShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBpbnQgbG9jYXRpb24pOwotCi0gIC8qKiBwZXJmb3JtIHNwZWNpZmllZCBjYWxsIHJlbGF0ZWQgYWN0aW9uCi0gICAqIGlkeCBpcyBsaW1pdGVkIG9ubHkgZm9yIGVuaGFuY2VkIGNhbGwgY29udHJvbCByZWxhdGVkIGFjdGlvbgotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCpoYW5kbGVfY2FsbF9hY3Rpb24pKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF9jYWxsX2FjdGlvbl90IGFjdGlvbiwgaW50IGlkeCk7Ci0KLSAgLyoqIHF1ZXJ5IGxpc3Qgb2YgY3VycmVudCBjYWxscyAqLwotICBidF9zdGF0dXNfdCAoKnF1ZXJ5X2N1cnJlbnRfY2FsbHMpKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBxdWVyeSBuYW1lIG9mIGN1cnJlbnQgc2VsZWN0ZWQgb3BlcmF0b3IgKi8KLSAgYnRfc3RhdHVzX3QgKCpxdWVyeV9jdXJyZW50X29wZXJhdG9yX25hbWUpKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBSZXRyaWV2ZSBzdWJzY3JpYmVyIGluZm9ybWF0aW9uICovCi0gIGJ0X3N0YXR1c190ICgqcmV0cmlldmVfc3Vic2NyaWJlcl9pbmZvKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotICAvKiogU2VuZCBEVE1GIGNvZGUqLwotICBidF9zdGF0dXNfdCAoKnNlbmRfZHRtZikoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgY2hhciBjb2RlKTsKLQotICAvKiogUmVxdWVzdCBhIHBob25lIG51bWJlciBmcm9tIEFHIGNvcnJlc3BvbmRpbmcgdG8gbGFzdCB2b2ljZSB0YWcgcmVjb3JkZWQgKi8KLSAgYnRfc3RhdHVzX3QgKCpyZXF1ZXN0X2xhc3Rfdm9pY2VfdGFnX251bWJlcikoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcik7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2b2lkICgqY2xlYW51cCkodm9pZCk7Ci0KLSAgLyoqIFNlbmQgQVQgQ29tbWFuZC4gKi8KLSAgYnRfc3RhdHVzX3QgKCpzZW5kX2F0X2NtZCkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IGNtZCwgaW50IHZhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwyLCBjb25zdCBjaGFyKiBhcmcpOwotfSBidGhmX2NsaWVudF9pbnRlcmZhY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9IRl9DTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9oaC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9oaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU1ZWNhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfaGguaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfSEhfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfSEhfSAotCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotX19CRUdJTl9ERUNMUwotCi0jZGVmaW5lIEJUSEhfTUFYX0RTQ19MRU4gODg0Ci0KLS8qIEhIIGNvbm5lY3Rpb24gc3RhdGVzICovCi10eXBlZGVmIGVudW0gewotICBCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVEVEID0gMCwKLSAgQlRISF9DT05OX1NUQVRFX0NPTk5FQ1RJTkcgPSAxLAotICBCVEhIX0NPTk5fU1RBVEVfRElTQ09OTkVDVEVEID0gMiwKLSAgQlRISF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzLAotICBCVEhIX0NPTk5fU1RBVEVfVU5LTk9XTiA9IDB4ZmYsCi19IGJ0aGhfY29ubmVjdGlvbl9zdGF0ZV90OwotCi1fX0VORF9ERUNMUwotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0KLWlubGluZSBzdGQ6OnN0cmluZyBidGhoX2Nvbm5lY3Rpb25fc3RhdGVfdGV4dCgKLSAgICBjb25zdCBidGhoX2Nvbm5lY3Rpb25fc3RhdGVfdCYgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRISF9DT05OX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEhIX0NPTk5fU1RBVEVfQ09OTkVDVElORyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEhIX0NPTk5fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUSEhfQ09OTl9TVEFURV9ESVNDT05ORUNUSU5HKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUSEhfQ09OTl9TVEFURV9VTktOT1dOKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOWyV1XSIsIHN0YXRlKTsKLSAgfQotfQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLV9fQkVHSU5fREVDTFMKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRISF9PSyA9IDAsCi0gIEJUSEhfSFNfSElEX05PVF9SRUFEWSwgIC8qIGhhbmRzaGFrZSBlcnJvciA6IGRldmljZSBub3QgcmVhZHkgKi8KLSAgQlRISF9IU19JTlZBTElEX1JQVF9JRCwgLyogaGFuZHNoYWtlIGVycm9yIDogaW52YWxpZCByZXBvcnQgSUQgKi8KLSAgQlRISF9IU19UUkFOU19OT1RfU1BULCAgLyogaGFuZHNoYWtlIGVycm9yIDogdHJhbnNhY3Rpb24gbm90IHNwdCAqLwotICBCVEhIX0hTX0lOVkFMSURfUEFSQU0sICAvKiBoYW5kc2hha2UgZXJyb3IgOiBpbnZhbGlkIHBhcmVtdGVyICovCi0gIEJUSEhfSFNfRVJST1IsICAgICAgICAgIC8qIGhhbmRzaGFrZSBlcnJvciA6IHVuc3BlY2lmaWVkIEhTIGVycm9yICovCi0gIEJUSEhfRVJSLCAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgQlRBIEhIIGVycm9yICovCi0gIEJUSEhfRVJSX1NEUCwgICAgICAgICAgIC8qIFNEUCBlcnJvciAqLwotICBCVEhIX0VSUl9QUk9UTywgICAgICAgICAvKiBTRVRfUHJvdG9jb2wgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgdXNlZCBpbiBCVEFfSEhfT1BFTl9FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgKi8KLSAgQlRISF9FUlJfREJfRlVMTCwgICAgICAgLyogZGV2aWNlIGRhdGFiYXNlIGZ1bGwgZXJyb3IsIHVzZWQgICovCi0gIEJUSEhfRVJSX1RPRF9VTlNQVCwgICAgIC8qIHR5cGUgb2YgZGV2aWNlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgQlRISF9FUlJfTk9fUkVTLCAgICAgICAgLyogb3V0IG9mIHN5c3RlbSByZXNvdXJjZXMgKi8KLSAgQlRISF9FUlJfQVVUSF9GQUlMRUQsICAgLyogYXV0aGVudGljYXRpb24gZmFpbCAqLwotICBCVEhIX0VSUl9IREwKLX0gYnRoaF9zdGF0dXNfdDsKLQotLyogUHJvdG9jb2wgbW9kZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUSEhfUkVQT1JUX01PREUgPSAweDAwLAotICBCVEhIX0JPT1RfTU9ERSA9IDB4MDEsCi0gIEJUSEhfVU5TVVBQT1JURURfTU9ERSA9IDB4ZmYKLX0gYnRoaF9wcm90b2NvbF9tb2RlX3Q7Ci0KLS8qIFJlcG9ydCB0eXBlcyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRISF9JTlBVVF9SRVBPUlQgPSAxLAotICBCVEhIX09VVFBVVF9SRVBPUlQsCi0gIEJUSEhfRkVBVFVSRV9SRVBPUlQKLX0gYnRoaF9yZXBvcnRfdHlwZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBhdHRyX21hc2s7Ci0gIHVpbnQ4X3Qgc3ViX2NsYXNzOwotICB1aW50OF90IGFwcF9pZDsKLSAgaW50IHZlbmRvcl9pZDsKLSAgaW50IHByb2R1Y3RfaWQ7Ci0gIGludCB2ZXJzaW9uOwotICB1aW50OF90IGN0cnlfY29kZTsKLSAgaW50IGRsX2xlbjsKLSAgdWludDhfdCBkc2NfbGlzdFtCVEhIX01BWF9EU0NfTEVOXTsKLX0gYnRoaF9oaWRfaW5mb190OwotCi0vKiogQ2FsbGJhY2sgZm9yIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgotICogIHN0YXRlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIGJ0aGhfY29ubmVjdGlvbl9zdGF0ZV90Ci0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGhfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjaykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoaF9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIHZpdHVhbCB1bnBsdWcgYXBpLgotICogIHRoZSBzdGF0dXMgb2YgdGhlIHZpdHVhbCB1bnBsdWcKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoaF92aXJ0dWFsX3VucGx1Z19jYWxsYmFjaykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGhfc3RhdHVzX3QgaGhfc3RhdHVzKTsKLQotLyoqIENhbGxiYWNrIGZvciBnZXQgaGlkIGluZm8KLSAqICBoaWRfaW5mbyB3aWxsIGNvbnRhaW4gYXR0cl9tYXNrLCBzdWJfY2xhc3MsIGFwcF9pZCwgdmVuZG9yX2lkLCBwcm9kdWN0X2lkLAotICogdmVyc2lvbiwgY3RyeV9jb2RlLCBsZW4KLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoaF9oaWRfaW5mb19jYWxsYmFjaykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGhfaGlkX2luZm9fdCBoaWRfaW5mbyk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgZ2V0IHByb3RvY29sIGFwaS4KLSAqICB0aGUgcHJvdG9jb2wgbW9kZSBpcyBvbmUgb2YgdGhlIHZhbHVlIGZyb20gYnRoaF9wcm90b2NvbF9tb2RlX3QKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoaF9wcm90b2NvbF9tb2RlX2NhbGxiYWNrKShSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhoX3N0YXR1c190IGhoX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoaF9wcm90b2NvbF9tb2RlX3QgbW9kZSk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgZ2V0L3NldF9pZGxlX3RpbWUgYXBpLgotICovCi10eXBlZGVmIHZvaWQgKCpidGhoX2lkbGVfdGltZV9jYWxsYmFjaykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhoX3N0YXR1c190IGhoX3N0YXR1cywgaW50IGlkbGVfcmF0ZSk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgZ2V0IHJlcG9ydCBhcGkuCi0gKiAgaWYgc3RhdXMgaXMgb2sgcnB0X2RhdGEgY29udGFpbnMgdGhlIHJlcG9ydCBkYXRhCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGhfZ2V0X3JlcG9ydF9jYWxsYmFjaykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoaF9zdGF0dXNfdCBoaF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJwdF9kYXRhLCBpbnQgcnB0X3NpemUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIHNldF9yZXBvcnQvc2V0X3Byb3RvY29sIGFwaSBhbmQgaWYgZXJyb3IKLSAqICBvY2N1cnMgZm9yIGdldF9yZXBvcnQvZ2V0X3Byb3RvY29sIGFwaS4KLSAqLwotdHlwZWRlZiB2b2lkICgqYnRoaF9oYW5kc2hha2VfY2FsbGJhY2spKFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoaF9zdGF0dXNfdCBoaF9zdGF0dXMpOwotCi0vKiogQlQtSEggY2FsbGJhY2sgc3RydWN0dXJlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogc2V0IHRvIHNpemVvZihCdEhmQ2FsbGJhY2tzKSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgYnRoaF9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrIGNvbm5lY3Rpb25fc3RhdGVfY2I7Ci0gIGJ0aGhfaGlkX2luZm9fY2FsbGJhY2sgaGlkX2luZm9fY2I7Ci0gIGJ0aGhfcHJvdG9jb2xfbW9kZV9jYWxsYmFjayBwcm90b2NvbF9tb2RlX2NiOwotICBidGhoX2lkbGVfdGltZV9jYWxsYmFjayBpZGxlX3RpbWVfY2I7Ci0gIGJ0aGhfZ2V0X3JlcG9ydF9jYWxsYmFjayBnZXRfcmVwb3J0X2NiOwotICBidGhoX3ZpcnR1YWxfdW5wbHVnX2NhbGxiYWNrIHZpcnR1YWxfdW5wbHVnX2NiOwotICBidGhoX2hhbmRzaGFrZV9jYWxsYmFjayBoYW5kc2hha2VfY2I7Ci0KLX0gYnRoaF9jYWxsYmFja3NfdDsKLQotLyoqIFJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJULUhIIGludGVyZmFjZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoQnRIaEludGVyZmFjZSkgKi8KLSAgc2l6ZV90IHNpemU7Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBCdEhoIGNhbGxiYWNrcwotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCppbml0KShidGhoX2NhbGxiYWNrc190KiBjYWxsYmFja3MpOwotCi0gIC8qKiBjb25uZWN0IHRvIGhpZCBkZXZpY2UgKi8KLSAgYnRfc3RhdHVzX3QgKCpjb25uZWN0KShSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotICAvKiogZGlzLWNvbm5lY3QgZnJvbSBoaWQgZGV2aWNlICovCi0gIGJ0X3N0YXR1c190ICgqZGlzY29ubmVjdCkoUmF3QWRkcmVzcyogYmRfYWRkcik7Ci0KLSAgLyoqIFZpcnR1YWwgVW5QbHVnIChWVVApIHRoZSBzcGVjaWZpZWQgSElEIGRldmljZSAqLwotICBidF9zdGF0dXNfdCAoKnZpcnR1YWxfdW5wbHVnKShSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotICAvKiogU2V0IHRoZSBISUQgZGV2aWNlIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgSElEIGRldmljZS4gKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfaW5mbykoUmF3QWRkcmVzcyogYmRfYWRkciwgYnRoaF9oaWRfaW5mb190IGhpZF9pbmZvKTsKLQotICAvKiogR2V0IHRoZSBISUQgcHJvdG8gbW9kZS4gKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfcHJvdG9jb2wpKFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhoX3Byb3RvY29sX21vZGVfdCBwcm90b2NvbE1vZGUpOwotCi0gIC8qKiBTZXQgdGhlIEhJRCBwcm90byBtb2RlLiAqLwotICBidF9zdGF0dXNfdCAoKnNldF9wcm90b2NvbCkoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGhfcHJvdG9jb2xfbW9kZV90IHByb3RvY29sTW9kZSk7Ci0KLSAgLyoqIEdldCB0aGUgSElEIElkbGUgVGltZSAqLwotICBidF9zdGF0dXNfdCAoKmdldF9pZGxlX3RpbWUpKFJhd0FkZHJlc3MqIGJkX2FkZHIpOwotCi0gIC8qKiBTZXQgdGhlIEhJRCBJZGxlIFRpbWUgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfaWRsZV90aW1lKShSYXdBZGRyZXNzKiBiZF9hZGRyLCB1aW50OF90IGlkbGVUaW1lKTsKLQotICAvKiogU2VuZCBhIEdFVF9SRVBPUlQgdG8gSElEIGRldmljZS4gKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfcmVwb3J0KShSYXdBZGRyZXNzKiBiZF9hZGRyLCBidGhoX3JlcG9ydF90eXBlX3QgcmVwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcG9ydElkLCBpbnQgYnVmZmVyU2l6ZSk7Ci0KLSAgLyoqIFNlbmQgYSBTRVRfUkVQT1JUIHRvIEhJRCBkZXZpY2UuICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X3JlcG9ydCkoUmF3QWRkcmVzcyogYmRfYWRkciwgYnRoaF9yZXBvcnRfdHlwZV90IHJlcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcmVwb3J0KTsKLQotICAvKiogU2VuZCBkYXRhIHRvIEhJRCBkZXZpY2UuICovCi0gIGJ0X3N0YXR1c190ICgqc2VuZF9kYXRhKShSYXdBZGRyZXNzKiBiZF9hZGRyLCBjaGFyKiBkYXRhKTsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UuICovCi0gIHZvaWQgKCpjbGVhbnVwKSh2b2lkKTsKLQotfSBidGhoX2ludGVyZmFjZV90OwotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9ISF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2tleXN0b3JlLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2tleXN0b3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjMzNGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9rZXlzdG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJzdHJpbmciCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJsdWV0b290aF9rZXlzdG9yZSB7Ci0KLWNsYXNzIEJsdWV0b290aEtleXN0b3JlQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkJsdWV0b290aEtleXN0b3JlQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3Iga2V5IGVuY3J5cHQgb3IgcmVtb3ZlIGtleSAqLwotICB2aXJ0dWFsIHZvaWQgc2V0X2VuY3J5cHRfa2V5X29yX3JlbW92ZV9rZXkoc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW5jcnlwdGVkU3RyaW5nKSA9IDA7Ci0KLSAgLyoqIENhbGxiYWNrIGZvciBnZXQga2V5LiAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9rZXkoc3RkOjpzdHJpbmcgcHJlZml4KSA9IDA7Ci19OwotCi1jbGFzcyBCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5CbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAvKiogUmVnaXN0ZXIgdGhlIGJsdWV0b290aCBrZXlzdG9yZSBjYWxsYmFja3MgKi8KLSAgdmlydHVhbCB2b2lkIGluaXQoQmx1ZXRvb3RoS2V5c3RvcmVDYWxsYmFja3MqIGNhbGxiYWNrcykgPSAwOwotCi0gIC8qKiBHZXQgYm9uZGVkIGRldmljZXMgbnVtYmVyIHRvIGdldCBhbGwgYm9uZGVkIGRldmljZXMga2V5ICovCi0gIHZpcnR1YWwgdm9pZCBDb252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCkgPSAwOwotCi0gIC8qKiBJbnRlcmZhY2UgZm9yIGtleSBlbmNyeXB0IG9yIHJlbW92ZSBrZXkgKi8KLSAgdmlydHVhbCBib29sIHNldF9lbmNyeXB0X2tleV9vcl9yZW1vdmVfa2V5KHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVuY3J5cHRlZFN0cmluZykgPSAwOwotCi0gIC8qKiBJbnRlcmZhY2UgZm9yIGdldCBrZXkuICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2tleShzdGQ6OnN0cmluZyBwcmVmaXgpID0gMDsKLQotICAvKiogSW50ZXJmYWNlIGZvciBjbGVhciBtYXAuICovCi0gIHZpcnR1YWwgdm9pZCBjbGVhcl9tYXAoKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoX2tleXN0b3JlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2xlX2F1ZGlvLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2xlX2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZThmMWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9sZV9hdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0KLSNpbmNsdWRlICJyYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBsZV9hdWRpbyB7Ci0KLWVudW0gY2xhc3MgQ29ubmVjdGlvblN0YXRlIHsKLSAgRElTQ09OTkVDVEVEID0gMCwKLSAgQ09OTkVDVElORywKLSAgQ09OTkVDVEVELAotICBESVNDT05ORUNUSU5HCi19OwotCi1lbnVtIGNsYXNzIEdyb3VwU3RhdHVzIHsKLSAgSU5BQ1RJVkUgPSAwLAotICBBQ1RJVkUsCi19OwotCi1lbnVtIGNsYXNzIEdyb3VwU3RyZWFtU3RhdHVzIHsKLSAgSURMRSA9IDAsCi0gIFNUUkVBTUlORywKLSAgU1VTUEVOREVELAotICBSRUNPTkZJR1VSRUQsCi0gIERFU1RST1lFRCwKLX07Ci0KLWVudW0gY2xhc3MgR3JvdXBOb2RlU3RhdHVzIHsKLSAgQURERUQgPSAxLAotICBSRU1PVkVELAotfTsKLQotY2xhc3MgTGVBdWRpb0NsaWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5MZUF1ZGlvQ2xpZW50Q2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgcHJvZmlsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qIENhbGxiYWNrIHdpdGggZ3JvdXAgc3RhdHVzIHVwZGF0ZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Hcm91cFN0YXR1cyhpbnQgZ3JvdXBfaWQsIEdyb3VwU3RhdHVzIGdyb3VwX3N0YXR1cykgPSAwOwotCi0gIC8qIENhbGxiYWNrIHdpdGggbm9kZSBzdGF0dXMgdXBkYXRlICovCi0gIHZpcnR1YWwgdm9pZCBPbkdyb3VwTm9kZVN0YXR1cyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBpbnQgZ3JvdXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cE5vZGVTdGF0dXMgbm9kZV9zdGF0dXMpID0gMDsKLSAgLyogQ2FsbGJhY2sgZm9yIG5ld2x5IHJlY29nbml6ZWQgb3IgcmVjb25maWd1cmVkIGV4aXN0aW5nIGxlIGF1ZGlvIGdyb3VwICovCi0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvQ29uZih1aW50OF90IGRpcmVjdGlvbiwgaW50IGdyb3VwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc25rX2F1ZGlvX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX2F1ZGlvX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXZhaWxfY29udCkgPSAwOwotfTsKLQotY2xhc3MgTGVBdWRpb0NsaWVudEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5MZUF1ZGlvQ2xpZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIC8qIFJlZ2lzdGVyIHRoZSBMZUF1ZGlvIGNhbGxiYWNrcyAqLwotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShMZUF1ZGlvQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MpID0gMDsKLQotICAvKiogQ29ubmVjdCB0byBMRUF1ZGlvICovCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICAvKiogRGlzY29ubmVjdCBmcm9tIExFQXVkaW8gKi8KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qIENsZWFudXAgdGhlIExlQXVkaW8gKi8KLSAgdmlydHVhbCB2b2lkIENsZWFudXAodm9pZCkgPSAwOwotCi0gIC8qIENhbGxlZCB3aGVuIExlQXVkaW8gaXMgdW5ib25kZWQuICovCi0gIHZpcnR1YWwgdm9pZCBSZW1vdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qIEF0dGFjaCBsZSBhdWRpbyBub2RlIHRvIGdyb3VwICovCi0gIHZpcnR1YWwgdm9pZCBHcm91cEFkZE5vZGUoaW50IGdyb3VwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSA9IDA7Ci0KLSAgLyogRGV0YWNoIGxlIGF1ZGlvIG5vZGUgZnJvbSBhIGdyb3VwICovCi0gIHZpcnR1YWwgdm9pZCBHcm91cFJlbW92ZU5vZGUoaW50IGdyb3VwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSA9IDA7Ci0KLSAgLyogU2V0IGFjdGl2ZSBsZSBhdWRpbyBncm91cCAqLwotICB2aXJ0dWFsIHZvaWQgR3JvdXBTZXRBY3RpdmUoaW50IGdyb3VwX2lkKSA9IDA7Ci19OwotCi1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3QgSU5TVEFOQ0VfSURfVU5ERUZJTkVEID0gMHhGRjsKLQotfSAvKiBuYW1lc3BhY2UgbGVfYXVkaW8gKi8KLX0gLyogbmFtZXNwYWNlIGJsdWV0b290aCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9wYW4uaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfcGFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOWVkZjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9wYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9QQU5fSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfUEFOX0gKLSNpbmNsdWRlIDxyYXdfYWRkcmVzcy5oPgotCi1fX0JFR0lOX0RFQ0xTCi0KLSNkZWZpbmUgQlRQQU5fUk9MRV9OT05FIDAKLSNkZWZpbmUgQlRQQU5fUk9MRV9QQU5OQVAgMQotI2RlZmluZSBCVFBBTl9ST0xFX1BBTlUgMgotCi10eXBlZGVmIGVudW0gewotICBCVFBBTl9TVEFURV9DT05ORUNURUQgPSAwLAotICBCVFBBTl9TVEFURV9DT05ORUNUSU5HID0gMSwKLSAgQlRQQU5fU1RBVEVfRElTQ09OTkVDVEVEID0gMiwKLSAgQlRQQU5fU1RBVEVfRElTQ09OTkVDVElORyA9IDMKLX0gYnRwYW5fY29ubmVjdGlvbl9zdGF0ZV90OwotCi10eXBlZGVmIGVudW0gewotICBCVFBBTl9TVEFURV9FTkFCTEVEID0gMCwKLSAgQlRQQU5fU1RBVEVfRElTQUJMRUQgPSAxCi19IGJ0cGFuX2NvbnRyb2xfc3RhdGVfdDsKLQotLyoqCi0gKiBDYWxsYmFjayBmb3IgcGFuIGNvbm5lY3Rpb24gc3RhdGUKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRwYW5fY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjaykoYnRwYW5fY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfc3RhdHVzX3QgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2FsX3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlX3JvbGUpOwotdHlwZWRlZiB2b2lkICgqYnRwYW5fY29udHJvbF9zdGF0ZV9jYWxsYmFjaykoYnRwYW5fY29udHJvbF9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2FsX3JvbGUsIGJ0X3N0YXR1c190IGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaWZuYW1lKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3Qgc2l6ZTsKLSAgYnRwYW5fY29udHJvbF9zdGF0ZV9jYWxsYmFjayBjb250cm9sX3N0YXRlX2NiOwotICBidHBhbl9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrIGNvbm5lY3Rpb25fc3RhdGVfY2I7Ci19IGJ0cGFuX2NhbGxiYWNrc190OwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogc2V0IHRvIHNpemUgb2YgdGhpcyBzdHJ1Y3QqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhlIHBhbiBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIHRoZSBidHBhbiBjYWxsYmFja3MKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqaW5pdCkoY29uc3QgYnRwYW5fY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7Ci0gIC8qCi0gICAqIGVuYWJsZSB0aGUgcGFuIHNlcnZpY2UgYnkgc3BlY2lmaWVkIHJvbGUuIFRoZSByZXN1bHQgc3RhdGUgb2YKLSAgICogZW5hYmwgd2lsbCBiZSByZXR1cm5lZCBieSBidHBhbl9jb250cm9sX3N0YXRlX2NhbGxiYWNrLiB3aGVuIHBhbi1uYXAgaXMKLSAgICogZW5hYmxlZCwgdGhlIHN0YXRlIG9mIGNvbm5lY3RpbmcgcGFudSBkZXZpY2Ugd2lsbCBiZSBub3RpZmllZCBieQotICAgKiBidHBhbl9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrCi0gICAqLwotICBidF9zdGF0dXNfdCAoKmVuYWJsZSkoaW50IGxvY2FsX3JvbGUpOwotICAvKgotICAgKiBnZXQgY3VycmVudCBwYW4gbG9jYWwgcm9sZQotICAgKi8KLSAgaW50ICgqZ2V0X2xvY2FsX3JvbGUpKHZvaWQpOwotICAvKioKLSAgICogc3RhcnQgYmx1ZXRvb3RoIHBhbiBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGV2aWNlIGJ5IHNwZWNpZmllZCBwYW4gcm9sZS4KLSAgICogVGhlIHJlc3VsdCBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGJ5IGJ0cGFuX2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2sKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqY29ubmVjdCkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IGxvY2FsX3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbW90ZV9yb2xlKTsKLSAgLyoqCi0gICAqIHN0b3AgYmx1ZXRvb3RoIHBhbiBjb25uZWN0aW9uLiBUaGUgcmVzdWx0IHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYnkKLSAgICogYnRwYW5fY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjawotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotICAvKioKLSAgICogQ2xlYW51cCB0aGUgcGFuIGludGVyZmFjZQotICAgKi8KLSAgdm9pZCAoKmNsZWFudXApKHZvaWQpOwotCi19IGJ0cGFuX2ludGVyZmFjZV90OwotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX1BBTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X3JjLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X3JjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjMzE3OWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9yYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9SQ19ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9SQ19ICi0KLSNpbmNsdWRlIDxyYXdfYWRkcmVzcy5oPgotX19CRUdJTl9ERUNMUwotCi0vKiBDaGFuZ2UgdGhpcyBtYWNybyB0byB1c2UgbXVsdGlwbGUgUkMgKi8KLSNkZWZpbmUgQlRfUkNfTlVNX0FQUCA2Ci0KLS8qIE1hY3JvcyAqLwotI2RlZmluZSBCVFJDX01BWF9BVFRSX1NUUl9MRU4gKDEgPDwgMTYpCi0jZGVmaW5lIEJUUkNfVUlEX1NJWkUgOAotI2RlZmluZSBCVFJDX01BWF9BUFBfU0VUVElOR1MgOAotI2RlZmluZSBCVFJDX01BWF9GT0xERVJfREVQVEggNAotI2RlZmluZSBCVFJDX01BWF9BUFBfQVRUUl9TSVpFIDE2Ci0jZGVmaW5lIEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFIDgKLSNkZWZpbmUgQlRSQ19GRUFUVVJFX0JJVF9NQVNLX1NJWkUgMTYKLQotLyogTWFjcm9zIGZvciB2YWxpZCBzY29wZXMgaW4gZ2V0X2ZvbGRlcl9pdGVtcyAqLwotI2RlZmluZSBCVFJDX1NDT1BFX1BMQVlFUl9MSVNUIDB4MDAgLyogTWVkaWEgUGxheWVyIExpc3QgKi8KLSNkZWZpbmUgQlRSQ19TQ09QRV9GSUxFX1NZU1RFTSAweDAxIC8qIFZpcnR1YWwgRmlsZSBTeXN0ZW0gKi8KLSNkZWZpbmUgQlRSQ19TQ09QRV9TRUFSQ0ggMHgwMiAgICAgIC8qIFNlYXJjaCAqLwotI2RlZmluZSBCVFJDX1NDT1BFX05PV19QTEFZSU5HIDB4MDMgLyogTm93IFBsYXlpbmcgKi8KLQotLyogTWFjcm9zIGZvciBzdXBwb3J0ZWQgY2hhcmFjdGVyIGVuY29kaW5nICovCi0jZGVmaW5lIEJUUkNfQ0hBUlNFVF9JRF9VVEY4IDB4MDA2QQotCi0vKiBNYWNyb3MgZm9yIGl0ZW0gdHlwZXMgKi8KLSNkZWZpbmUgQlRSQ19JVEVNX1BMQVlFUiAweDAxIC8qIE1lZGlhIFBsYXllciAqLwotI2RlZmluZSBCVFJDX0lURU1fRk9MREVSIDB4MDIgLyogRm9sZGVyICovCi0jZGVmaW5lIEJUUkNfSVRFTV9NRURJQSAweDAzICAvKiBNZWRpYSBGaWxlICovCi0KLS8qIE1hY3JvcyBmb3IgbWVkaWEgYXR0cmlidXRlIElEcyAqLwotI2RlZmluZSBCVFJDX01FRElBX0FUVFJfSURfSU5WQUxJRCAtMQotI2RlZmluZSBCVFJDX01FRElBX0FUVFJfSURfVElUTEUgMHgwMDAwMDAwMQotI2RlZmluZSBCVFJDX01FRElBX0FUVFJfSURfQVJUSVNUIDB4MDAwMDAwMDIKLSNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX0FMQlVNIDB4MDAwMDAwMDMKLSNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX1RSQUNLX05VTSAweDAwMDAwMDA0Ci0jZGVmaW5lIEJUUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTIDB4MDAwMDAwMDUKLSNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX0dFTlJFIDB4MDAwMDAwMDYKLSNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX1BMQVlJTkdfVElNRSAweDAwMDAwMDA3IC8qIGluIG1pbGlzZWNvbmRzICovCi0jZGVmaW5lIEJUUkNfTUVESUFfQVRUUl9JRF9DT1ZFUl9BUlRXT1JLX0hBTkRMRSAweDAwMDAwMDA4Ci0KLS8qIE1hY3JvcyBmb3IgZm9sZGVyIHR5cGVzICovCi0jZGVmaW5lIEJUUkNfRk9MREVSX1RZUEVfTUlYRUQgMHgwMAotI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX1RJVExFUyAweDAxCi0jZGVmaW5lIEJUUkNfRk9MREVSX1RZUEVfQUxCVU1TIDB4MDIKLSNkZWZpbmUgQlRSQ19GT0xERVJfVFlQRV9BUlRJU1RTIDB4MDMKLSNkZWZpbmUgQlRSQ19GT0xERVJfVFlQRV9HRU5SRVMgMHgwNAotI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX1BMQVlMSVNUUyAweDA1Ci0jZGVmaW5lIEJUUkNfRk9MREVSX1RZUEVfWUVBUlMgMHgwNgotCi0vKiBNYWNyb3MgZm9yIG1lZGlhIHR5cGVzICovCi0jZGVmaW5lIEJUUkNfTUVESUFfVFlQRV9BVURJTyAweDAwIC8qIGF1ZGlvICovCi0jZGVmaW5lIEJUUkNfTUVESUFfVFlQRV9WSURFTyAweDAxIC8qIHZpZGVvICovCi0KLS8qIE1hY3JvcyBmb3IgbnVtIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgQlRSQ19OVU1fQVRUUl9OT05FIDB4RkYgLyogTm8gYXR0cmlidXRlcyByZXF1aXJlZCAqLwotI2RlZmluZSBCVFJDX05VTV9BVFRSX0FMTCAwWDAwICAvKiBBbGwgYXR0cmlidXRlcyByZXF1aXJlZCAqLwotCi0jZGVmaW5lIEJUUkNfSEFORExFX05PTkUgMHhGRgotCi10eXBlZGVmIHVpbnQ4X3QgYnRyY191aWRfdFtCVFJDX1VJRF9TSVpFXTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRSQ19DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDAsCi0gIEJUUkNfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKLX0gYnRyY19jb25uZWN0aW9uX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUUkNfRkVBVF9OT05FID0gMHgwMCwgICAgICAgICAgICAvKiBBVlJDUCAxLjAgKi8KLSAgQlRSQ19GRUFUX01FVEFEQVRBID0gMHgwMSwgICAgICAgIC8qIEFWUkNQIDEuMyAqLwotICBCVFJDX0ZFQVRfQUJTT0xVVEVfVk9MVU1FID0gMHgwMiwgLyogU3VwcG9ydHMgVEcgcm9sZSBhbmQgdm9sdW1lIHN5bmMgKi8KLSAgQlRSQ19GRUFUX0JST1dTRSA9IDB4MDQsIC8qIEFWUkNQIDEuNCBhbmQgdXAsIHdpdGggQnJvd3Npbmcgc3VwcG9ydCAqLwotICBCVFJDX0ZFQVRfQ09WRVJfQVJUV09SSyA9IDB4OCwgICAgLyogQVZSQ1AgMS42IGFuZCB1cCwgQ292ZXIgQXJ0ICovCi19IGJ0cmNfcmVtb3RlX2ZlYXR1cmVzX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUUkNfUExBWVNUQVRFX1NUT1BQRUQgPSAweDAwLCAgLyogU3RvcHBlZCAqLwotICBCVFJDX1BMQVlTVEFURV9QTEFZSU5HID0gMHgwMSwgIC8qIFBsYXlpbmcgKi8KLSAgQlRSQ19QTEFZU1RBVEVfUEFVU0VEID0gMHgwMiwgICAvKiBQYXVzZWQgICovCi0gIEJUUkNfUExBWVNUQVRFX0ZXRF9TRUVLID0gMHgwMywgLyogRndkIFNlZWsqLwotICBCVFJDX1BMQVlTVEFURV9SRVZfU0VFSyA9IDB4MDQsIC8qIFJldiBTZWVrKi8KLSAgQlRSQ19QTEFZU1RBVEVfRVJST1IgPSAweEZGLCAgICAvKiBFcnJvciAgICovCi19IGJ0cmNfcGxheV9zdGF0dXNfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRSQ19FVlRfUExBWV9TVEFUVVNfQ0hBTkdFRCA9IDB4MDEsCi0gIEJUUkNfRVZUX1RSQUNLX0NIQU5HRSA9IDB4MDIsCi0gIEJUUkNfRVZUX1RSQUNLX1JFQUNIRURfRU5EID0gMHgwMywKLSAgQlRSQ19FVlRfVFJBQ0tfUkVBQ0hFRF9TVEFSVCA9IDB4MDQsCi0gIEJUUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQgPSAweDA1LAotICBCVFJDX0VWVF9BUFBfU0VUVElOR1NfQ0hBTkdFRCA9IDB4MDgsCi0gIEJUUkNfRVZUX05PV19QTEFZSU5HX0NPTlRFTlRfQ0hBTkdFRCA9IDB4MDksCi0gIEJUUkNfRVZUX0FWQUxfUExBWUVSX0NIQU5HRSA9IDB4MGEsCi0gIEJUUkNfRVZUX0FERFJfUExBWUVSX0NIQU5HRSA9IDB4MGIsCi0gIEJUUkNfRVZUX1VJRFNfQ0hBTkdFRCA9IDB4MGMsCi0gIEJUUkNfRVZUX1ZPTF9DSEFOR0VEID0gMHgwZCwKLX0gYnRyY19ldmVudF9pZF90OwotCi10eXBlZGVmIGVudW0gewotICBCVFJDX05PVElGSUNBVElPTl9UWVBFX0lOVEVSSU0gPSAwLAotICBCVFJDX05PVElGSUNBVElPTl9UWVBFX0NIQU5HRUQgPSAxLAotfSBidHJjX25vdGlmaWNhdGlvbl90eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUUkNfUExBWUVSX0FUVFJfRVFVQUxJWkVSID0gMHgwMSwKLSAgQlRSQ19QTEFZRVJfQVRUUl9SRVBFQVQgPSAweDAyLAotICBCVFJDX1BMQVlFUl9BVFRSX1NIVUZGTEUgPSAweDAzLAotICBCVFJDX1BMQVlFUl9BVFRSX1NDQU4gPSAweDA0LAotfSBidHJjX3BsYXllcl9hdHRyX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUUkNfTUVESUFfQVRUUl9USVRMRSA9IDB4MDEsCi0gIEJUUkNfTUVESUFfQVRUUl9BUlRJU1QgPSAweDAyLAotICBCVFJDX01FRElBX0FUVFJfQUxCVU0gPSAweDAzLAotICBCVFJDX01FRElBX0FUVFJfVFJBQ0tfTlVNID0gMHgwNCwKLSAgQlRSQ19NRURJQV9BVFRSX05VTV9UUkFDS1MgPSAweDA1LAotICBCVFJDX01FRElBX0FUVFJfR0VOUkUgPSAweDA2LAotICBCVFJDX01FRElBX0FUVFJfUExBWUlOR19USU1FID0gMHgwNywKLX0gYnRyY19tZWRpYV9hdHRyX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUUkNfUExBWUVSX1ZBTF9PRkZfUkVQRUFUID0gMHgwMSwKLSAgQlRSQ19QTEFZRVJfVkFMX1NJTkdMRV9SRVBFQVQgPSAweDAyLAotICBCVFJDX1BMQVlFUl9WQUxfQUxMX1JFUEVBVCA9IDB4MDMsCi0gIEJUUkNfUExBWUVSX1ZBTF9HUk9VUF9SRVBFQVQgPSAweDA0Ci19IGJ0cmNfcGxheWVyX3JlcGVhdF92YWxfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQlRSQ19QTEFZRVJfVkFMX09GRl9TSFVGRkxFID0gMHgwMSwKLSAgQlRSQ19QTEFZRVJfVkFMX0FMTF9TSFVGRkxFID0gMHgwMiwKLSAgQlRSQ19QTEFZRVJfVkFMX0dST1VQX1NIVUZGTEUgPSAweDAzCi19IGJ0cmNfcGxheWVyX3NodWZmbGVfdmFsX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUUkNfU1RTX0JBRF9DTUQgPSAweDAwLCAgICAgICAvKiBJbnZhbGlkIGNvbW1hbmQgKi8KLSAgQlRSQ19TVFNfQkFEX1BBUkFNID0gMHgwMSwgICAgIC8qIEludmFsaWQgcGFyYW1ldGVyICovCi0gIEJUUkNfU1RTX05PVF9GT1VORCA9IDB4MDIsICAgICAvKiBTcGVjaWZpZWQgcGFyYW1ldGVyIGlzIHdyb25nIG9yIG5vdCBmb3VuZCAqLwotICBCVFJDX1NUU19JTlRFUk5BTF9FUlIgPSAweDAzLCAgLyogSW50ZXJuYWwgRXJyb3IgKi8KLSAgQlRSQ19TVFNfTk9fRVJST1IgPSAweDA0LCAgICAgIC8qIE9wZXJhdGlvbiBTdWNjZXNzICovCi0gIEJUUkNfU1RTX1VJRF9DSEFOR0VEID0gMHgwNSwgICAvKiBVSURzIGNoYW5nZWQgKi8KLSAgQlRSQ19TVFNfUkVTRVJWRUQgPSAweDA2LCAgICAgIC8qIFJlc2VydmVkICovCi0gIEJUUkNfU1RTX0lOVl9ESVJOID0gMHgwNywgICAgICAvKiBJbnZhbGlkIGRpcmVjdGlvbiAqLwotICBCVFJDX1NUU19JTlZfRElSRUNUT1JZID0gMHgwOCwgLyogSW52YWxpZCBkaXJlY3RvcnkgKi8KLSAgQlRSQ19TVFNfSU5WX0lURU0gPSAweDA5LCAgICAgIC8qIEludmFsaWQgSXRlbSAqLwotICBCVFJDX1NUU19JTlZfU0NPUEUgPSAweDBhLCAgICAgLyogSW52YWxpZCBzY29wZSAqLwotICBCVFJDX1NUU19JTlZfUkFOR0UgPSAweDBiLCAgICAgLyogSW52YWxpZCByYW5nZSAqLwotICBCVFJDX1NUU19ESVJFQ1RPUlkgPSAweDBjLCAgICAgLyogVUlEIGlzIGEgZGlyZWN0b3J5ICovCi0gIEJUUkNfU1RTX01FRElBX0lOX1VTRSA9IDB4MGQsICAvKiBNZWRpYSBpbiB1c2UgKi8KLSAgQlRSQ19TVFNfUExBWV9MSVNUX0ZVTEwgPSAweDBlLCAvKiBQbGF5aW5nIGxpc3QgZnVsbCAqLwotICBCVFJDX1NUU19TUkNIX05PVF9TUFJURCA9IDB4MGYsIC8qIFNlYXJjaCBub3Qgc3VwcG9ydGVkICovCi0gIEJUUkNfU1RTX1NSQ0hfSU5fUFJPRyA9IDB4MTAsICAgLyogU2VhcmNoIGluIHByb2dyZXNzICovCi0gIEJUUkNfU1RTX0lOVl9QTEFZRVIgPSAweDExLCAgICAgLyogSW52YWxpZCBwbGF5ZXIgKi8KLSAgQlRSQ19TVFNfUExBWV9OT1RfQlJPVyA9IDB4MTIsICAvKiBQbGF5ZXIgbm90IGJyb3dzYWJsZSAqLwotICBCVFJDX1NUU19QTEFZX05PVF9BRERSID0gMHgxMywgIC8qIFBsYXllciBub3QgYWRkcmVzc2VkICovCi0gIEJUUkNfU1RTX0lOVl9SRVNVTFRTID0gMHgxNCwgICAgLyogSW52YWxpZCByZXN1bHRzICovCi0gIEJUUkNfU1RTX05PX0FWQkxfUExBWSA9IDB4MTUsICAgLyogTm8gYXZhaWxhYmxlIHBsYXllcnMgKi8KLSAgQlRSQ19TVFNfQUREUl9QTEFZX0NIR0QgPSAweDE2LCAvKiBBZGRyZXNzZWQgcGxheWVyIGNoYW5nZWQgKi8KLX0gYnRyY19zdGF0dXNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBwbGF5ZXJfaWQ7Ci0gIHVpbnQxNl90IHVpZF9jb3VudGVyOwotfSBidHJjX2FkZHJfcGxheWVyX2NoYW5nZWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG51bV9hdHRyOwotICB1aW50OF90IGF0dHJfaWRzW0JUUkNfTUFYX0FQUF9TRVRUSU5HU107Ci0gIHVpbnQ4X3QgYXR0cl92YWx1ZXNbQlRSQ19NQVhfQVBQX1NFVFRJTkdTXTsKLX0gYnRyY19wbGF5ZXJfc2V0dGluZ3NfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHZhbDsKLSAgdWludDE2X3QgY2hhcnNldF9pZDsKLSAgdWludDE2X3Qgc3RyX2xlbjsKLSAgdWludDhfdCogcF9zdHI7Ci19IGJ0cmNfcGxheWVyX2FwcF9leHRfYXR0cl92YWxfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGF0dHJfaWQ7Ci0gIHVpbnQxNl90IGNoYXJzZXRfaWQ7Ci0gIHVpbnQxNl90IHN0cl9sZW47Ci0gIHVpbnQ4X3QqIHBfc3RyOwotICB1aW50OF90IG51bV92YWw7Ci0gIGJ0cmNfcGxheWVyX2FwcF9leHRfYXR0cl92YWxfdCBleHRfYXR0cl92YWxbQlRSQ19NQVhfQVBQX0FUVFJfU0laRV07Ci19IGJ0cmNfcGxheWVyX2FwcF9leHRfYXR0cl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYXR0cl9pZDsKLSAgdWludDhfdCBudW1fdmFsOwotICB1aW50OF90IGF0dHJfdmFsW0JUUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotfSBidHJjX3BsYXllcl9hcHBfYXR0cl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHN0YXJ0X2l0ZW07Ci0gIHVpbnQzMl90IGVuZF9pdGVtOwotICB1aW50MzJfdCBzaXplOwotICB1aW50MzJfdCBhdHRyc1tCVFJDX01BWF9FTEVNX0FUVFJfU0laRV07Ci0gIHVpbnQ4X3QgYXR0cl9jb3VudDsKLX0gYnRyY19nZXRmb2xkZXJpdGVtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgdHlwZTsKLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci19IGJ0cmNfdWlkc19jaGFuZ2VkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsgdWludDE2X3QgdHlwZTsgfSBidHJjX25vd19wbGF5aW5nX2NoYW5nZWRfdDsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIGJ0cmNfcGxheV9zdGF0dXNfdCBwbGF5X3N0YXR1czsKLSAgYnRyY191aWRfdCB0cmFjazsgLyogcXVldWUgcG9zaXRpb24gaW4gTm93UGxheWluZyAqLwotICB1aW50MzJfdCBzb25nX3BvczsKLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci0gIGJ0cmNfcGxheWVyX3NldHRpbmdzX3QgcGxheWVyX3NldHRpbmc7Ci0gIGJ0cmNfYWRkcl9wbGF5ZXJfY2hhbmdlZF90IGFkZHJfcGxheWVyX2NoYW5nZWQ7Ci0gIGJ0cmNfdWlkc19jaGFuZ2VkX3QgdWlkc19jaGFuZ2VkOwotICBidHJjX25vd19wbGF5aW5nX2NoYW5nZWRfdCBub3dfcGxheWluZ19jaGFuZ2VkOwotfSBidHJjX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgaWQ7IC8qIGNhbiBiZSBhdHRyX2lkIG9yIHZhbHVlX2lkICovCi0gIHVpbnQ4X3QgdGV4dFtCVFJDX01BWF9BVFRSX1NUUl9MRU5dOwotfSBidHJjX3BsYXllcl9zZXR0aW5nX3RleHRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBhdHRyX2lkOwotICB1aW50OF90IHRleHRbQlRSQ19NQVhfQVRUUl9TVFJfTEVOXTsKLX0gYnRyY19lbGVtZW50X2F0dHJfdmFsX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgcGxheWVyX2lkOwotICB1aW50OF90IG1ham9yX3R5cGU7Ci0gIHVpbnQzMl90IHN1Yl90eXBlOwotICB1aW50OF90IHBsYXlfc3RhdHVzOwotICB1aW50OF90IGZlYXR1cmVzW0JUUkNfRkVBVFVSRV9CSVRfTUFTS19TSVpFXTsKLSAgdWludDE2X3QgY2hhcnNldF9pZDsKLSAgdWludDhfdCBuYW1lW0JUUkNfTUFYX0FUVFJfU1RSX0xFTl07Ci19IGJ0cmNfaXRlbV9wbGF5ZXJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHVpZFtCVFJDX1VJRF9TSVpFXTsKLSAgdWludDhfdCB0eXBlOwotICB1aW50OF90IHBsYXlhYmxlOwotICB1aW50MTZfdCBjaGFyc2V0X2lkOwotICB1aW50OF90IG5hbWVbQlRSQ19NQVhfQVRUUl9TVFJfTEVOXTsKLX0gYnRyY19pdGVtX2ZvbGRlcl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgdWlkW0JUUkNfVUlEX1NJWkVdOwotICB1aW50OF90IHR5cGU7Ci0gIHVpbnQxNl90IGNoYXJzZXRfaWQ7Ci0gIHVpbnQ4X3QgbmFtZVtCVFJDX01BWF9BVFRSX1NUUl9MRU5dOwotICBpbnQgbnVtX2F0dHJzOwotICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCogcF9hdHRyczsKLX0gYnRyY19pdGVtX21lZGlhX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBpdGVtX3R5cGU7Ci0gIHVuaW9uIHsKLSAgICBidHJjX2l0ZW1fcGxheWVyX3QgcGxheWVyOwotICAgIGJ0cmNfaXRlbV9mb2xkZXJfdCBmb2xkZXI7Ci0gICAgYnRyY19pdGVtX21lZGlhX3QgbWVkaWE7Ci0gIH07Ci19IGJ0cmNfZm9sZGVyX2l0ZW1zX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3Qgc3RyX2xlbjsKLSAgdWludDhfdCBwX3N0cltCVFJDX01BWF9BVFRSX1NUUl9MRU5dOwotfSBidHJjX2JyX2ZvbGRlcl9uYW1lX3Q7Ci0KLS8qKiBDYWxsYmFjayBmb3IgdGhlIGNvbnRyb2xsZXIncyBzdXBwb3J0ZWQgZmVhdXRyZXMgKi8KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfcmVtb3RlX2ZlYXR1cmVzX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcmVtb3RlX2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwotCi0vKiogQ2FsbGJhY2sgZm9yIHBsYXkgc3RhdHVzIHJlcXVlc3QgKi8KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfZ2V0X3BsYXlfc3RhdHVzX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIGZvciBsaXN0IHBsYXllciBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIChTaHVmZmxlLCBSZXBlYXQsLi4uKSAqLwotdHlwZWRlZiB2b2lkICgqYnRyY19saXN0X3BsYXllcl9hcHBfYXR0cl9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayBmb3IgbGlzdCBwbGF5ZXIgYXBwbGljYXRpb24gYXR0cmlidXRlcyAoU2h1ZmZsZSwgUmVwZWF0LC4uLikgKi8KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfbGlzdF9wbGF5ZXJfYXBwX3ZhbHVlc19jYWxsYmFjaykoYnRyY19wbGF5ZXJfYXR0cl90IGF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgcGxheWVyIGFwcGxpY2F0aW9uIHNldHRpbmdzIHZhbHVlCi0qKiAgbnVtX2F0dHI6IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSBpZHMgY29udGFpbmVkIGluIHBfYXR0cnMKLSovCi10eXBlZGVmIHZvaWQgKCpidHJjX2dldF9wbGF5ZXJfYXBwX3ZhbHVlX2NhbGxiYWNrKSh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19wbGF5ZXJfYXR0cl90KiBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayBmb3IgZ2V0dGluZyB0aGUgcGxheWVyIGFwcGxpY2F0aW9uIHNldHRpbmdzIGF0dHJpYnV0ZXMnIHRleHQKLSoqICBudW1fYXR0cjogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlIGlkcyBjb250YWluZWQgaW4gcF9hdHRycwotKi8KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfZ2V0X3BsYXllcl9hcHBfYXR0cnNfdGV4dF9jYWxsYmFjaykoCi0gICAgdWludDhfdCBudW1fYXR0ciwgYnRyY19wbGF5ZXJfYXR0cl90KiBwX2F0dHJzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIGZvciBnZXR0aW5nIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24gc2V0dGluZ3MgdmFsdWVzJyB0ZXh0Ci0qKiAgbnVtX2F0dHI6IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbHVlIGlkcyBjb250YWluZWQgaW4gcF92YWxzCi0qLwotdHlwZWRlZiB2b2lkICgqYnRyY19nZXRfcGxheWVyX2FwcF92YWx1ZXNfdGV4dF9jYWxsYmFjaykoCi0gICAgdWludDhfdCBhdHRyX2lkLCB1aW50OF90IG51bV92YWwsIHVpbnQ4X3QqIHBfdmFscywKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIGZvciBzZXR0aW5nIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24gc2V0dGluZ3MgdmFsdWVzICovCi10eXBlZGVmIHZvaWQgKCpidHJjX3NldF9wbGF5ZXJfYXBwX3ZhbHVlX2NhbGxiYWNrKSgKLSAgICBidHJjX3BsYXllcl9zZXR0aW5nc190KiBwX3ZhbHMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogQ2FsbGJhY2sgdG8gZmV0Y2ggdGhlIGdldCBlbGVtZW50IGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnQgc29uZwotKiogIG51bV9hdHRyOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHJlcXVlc3RlZCBpbiBwX2F0dHJzCi0qLwotdHlwZWRlZiB2b2lkICgqYnRyY19nZXRfZWxlbWVudF9hdHRyX2NhbGxiYWNrKSh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX21lZGlhX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayBmb3IgcmVnaXN0ZXIgbm90aWZpY2F0aW9uIChQbGF5IHN0YXRlIGNoYW5nZS90cmFjayBjaGFuZ2UvLi4uKQotKiogIHBhcmFtOiBJcyBvbmx5IHZhbGlkIGlmIGV2ZW50X2lkIGlzIEJUUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQKLSovCi10eXBlZGVmIHZvaWQgKCpidHJjX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9jYWxsYmFjaykoYnRyY19ldmVudF9pZF90IGV2ZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiBBVlJDUCAxLjQgRW5oYW5jZW1lbnRzICovCi0vKiogQ2FsbGJhY2sgZm9yIHZvbHVtZSBjaGFuZ2Ugb24gQ1QKLSoqICB2b2x1bWU6IEN1cnJlbnQgdm9sdW1lIHNldHRpbmcgb24gdGhlIENUICgwLTEyNykKLSovCi10eXBlZGVmIHZvaWQgKCpidHJjX3ZvbHVtZV9jaGFuZ2VfY2FsbGJhY2spKHVpbnQ4X3Qgdm9sdW1lLCB1aW50OF90IGN0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIGZvciBwYXNzdGhyb3VnaCBjb21tYW5kcyAqLwotdHlwZWRlZiB2b2lkICgqYnRyY19wYXNzdGhyb3VnaF9jbWRfY2FsbGJhY2spKGludCBpZCwgaW50IGtleV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIGZvciBzZXQgYWRkcmVzc2VkIHBsYXllciByZXNwb25zZSBvbiBURyAqKi8KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfc2V0X2FkZHJlc3NlZF9wbGF5ZXJfY2FsbGJhY2spKHVpbnQxNl90IHBsYXllcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogQ2FsbGJhY2sgZm9yIHNldCBicm93c2VkIHBsYXllciByZXNwb25zZSBvbiBURyAqKi8KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfc2V0X2Jyb3dzZWRfcGxheWVyX2NhbGxiYWNrKSh1aW50MTZfdCBwbGF5ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayBmb3IgZ2V0IGZvbGRlciBpdGVtcyBvbiBURwotKiogIG51bV9hdHRyOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHJlcXVlc3RlZCBpbiBwX2F0dHJfaWRzCi0qLwotdHlwZWRlZiB2b2lkICgqYnRyY19nZXRfZm9sZGVyX2l0ZW1zX2NhbGxiYWNrKSgKLSAgICB1aW50OF90IHNjb3BlLCB1aW50MzJfdCBzdGFydF9pdGVtLCB1aW50MzJfdCBlbmRfaXRlbSwgdWludDhfdCBudW1fYXR0ciwKLSAgICB1aW50MzJfdCogcF9hdHRyX2lkcywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayBmb3IgY2hhbmdpbmcgYnJvd3NlZCBwYXRoIG9uIFRHICoqLwotdHlwZWRlZiB2b2lkICgqYnRyY19jaGFuZ2VfcGF0aF9jYWxsYmFjaykodWludDhfdCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBmb2xkZXJfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayB0byBmZXRjaCB0aGUgZ2V0IGl0ZW0gYXR0cmlidXRlcyBvZiB0aGUgbWVkaWEgaXRlbQotKiogIG51bV9hdHRyOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHJlcXVlc3RlZCBpbiBwX2F0dHJzCi0qLwotdHlwZWRlZiB2b2lkICgqYnRyY19nZXRfaXRlbV9hdHRyX2NhbGxiYWNrKSh1aW50OF90IHNjb3BlLCB1aW50OF90KiB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX21lZGlhX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayBmb3IgcGxheSByZXF1ZXN0IGZvciB0aGUgbWVkaWEgaXRlbSBpbmRpY2F0ZWQgYnkgYW4gaWRlbnRpZmllciAqLwotdHlwZWRlZiB2b2lkICgqYnRyY19wbGF5X2l0ZW1fY2FsbGJhY2spKHVpbnQ4X3Qgc2NvcGUsIHVpbnQxNl90IHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIHRvIGZldGNoIHRvdGFsIG51bWJlciBvZiBpdGVtcyBmcm9tIGEgZm9sZGVyICoqLwotdHlwZWRlZiB2b2lkICgqYnRyY19nZXRfdG90YWxfbnVtX29mX2l0ZW1zX2NhbGxiYWNrKSh1aW50OF90IHNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIGZvciBjb25kdWN0aW5nIHJlY3Vyc2l2ZSBzZWFyY2ggb24gYSBjdXJyZW50IGJyb3dzZWQgcGF0aCBmb3IgYQotICogc3BlY2lmaWVkIHN0cmluZyAqLwotdHlwZWRlZiB2b2lkICgqYnRyY19zZWFyY2hfY2FsbGJhY2spKHVpbnQxNl90IGNoYXJzZXRfaWQsIHVpbnQxNl90IHN0cl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zdHIsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogQ2FsbGJhY2sgdG8gYWRkIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gaW5kaWNhdGVkIGJ5IGFuIGlkZW50aWZpZXIgdG8gbm93Ci0gKiBwbGF5aW5nIHF1ZXVlLiAqLwotdHlwZWRlZiB2b2lkICgqYnRyY19hZGRfdG9fbm93X3BsYXlpbmdfY2FsbGJhY2spKHVpbnQ4X3Qgc2NvcGUsIHVpbnQ4X3QqIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIEJULVJDIFRhcmdldCBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKEJ0UmNDYWxsYmFja3MpICovCi0gIHNpemVfdCBzaXplOwotICBidHJjX3JlbW90ZV9mZWF0dXJlc19jYWxsYmFjayByZW1vdGVfZmVhdHVyZXNfY2I7Ci0gIGJ0cmNfZ2V0X3BsYXlfc3RhdHVzX2NhbGxiYWNrIGdldF9wbGF5X3N0YXR1c19jYjsKLSAgYnRyY19saXN0X3BsYXllcl9hcHBfYXR0cl9jYWxsYmFjayBsaXN0X3BsYXllcl9hcHBfYXR0cl9jYjsKLSAgYnRyY19saXN0X3BsYXllcl9hcHBfdmFsdWVzX2NhbGxiYWNrIGxpc3RfcGxheWVyX2FwcF92YWx1ZXNfY2I7Ci0gIGJ0cmNfZ2V0X3BsYXllcl9hcHBfdmFsdWVfY2FsbGJhY2sgZ2V0X3BsYXllcl9hcHBfdmFsdWVfY2I7Ci0gIGJ0cmNfZ2V0X3BsYXllcl9hcHBfYXR0cnNfdGV4dF9jYWxsYmFjayBnZXRfcGxheWVyX2FwcF9hdHRyc190ZXh0X2NiOwotICBidHJjX2dldF9wbGF5ZXJfYXBwX3ZhbHVlc190ZXh0X2NhbGxiYWNrIGdldF9wbGF5ZXJfYXBwX3ZhbHVlc190ZXh0X2NiOwotICBidHJjX3NldF9wbGF5ZXJfYXBwX3ZhbHVlX2NhbGxiYWNrIHNldF9wbGF5ZXJfYXBwX3ZhbHVlX2NiOwotICBidHJjX2dldF9lbGVtZW50X2F0dHJfY2FsbGJhY2sgZ2V0X2VsZW1lbnRfYXR0cl9jYjsKLSAgYnRyY19yZWdpc3Rlcl9ub3RpZmljYXRpb25fY2FsbGJhY2sgcmVnaXN0ZXJfbm90aWZpY2F0aW9uX2NiOwotICBidHJjX3ZvbHVtZV9jaGFuZ2VfY2FsbGJhY2sgdm9sdW1lX2NoYW5nZV9jYjsKLSAgYnRyY19wYXNzdGhyb3VnaF9jbWRfY2FsbGJhY2sgcGFzc3Rocm91Z2hfY21kX2NiOwotICBidHJjX3NldF9hZGRyZXNzZWRfcGxheWVyX2NhbGxiYWNrIHNldF9hZGRyZXNzZWRfcGxheWVyX2NiOwotICBidHJjX3NldF9icm93c2VkX3BsYXllcl9jYWxsYmFjayBzZXRfYnJvd3NlZF9wbGF5ZXJfY2I7Ci0gIGJ0cmNfZ2V0X2ZvbGRlcl9pdGVtc19jYWxsYmFjayBnZXRfZm9sZGVyX2l0ZW1zX2NiOwotICBidHJjX2NoYW5nZV9wYXRoX2NhbGxiYWNrIGNoYW5nZV9wYXRoX2NiOwotICBidHJjX2dldF9pdGVtX2F0dHJfY2FsbGJhY2sgZ2V0X2l0ZW1fYXR0cl9jYjsKLSAgYnRyY19wbGF5X2l0ZW1fY2FsbGJhY2sgcGxheV9pdGVtX2NiOwotICBidHJjX2dldF90b3RhbF9udW1fb2ZfaXRlbXNfY2FsbGJhY2sgZ2V0X3RvdGFsX251bV9vZl9pdGVtc19jYjsKLSAgYnRyY19zZWFyY2hfY2FsbGJhY2sgc2VhcmNoX2NiOwotICBidHJjX2FkZF90b19ub3dfcGxheWluZ19jYWxsYmFjayBhZGRfdG9fbm93X3BsYXlpbmdfY2I7Ci19IGJ0cmNfY2FsbGJhY2tzX3Q7Ci0KLS8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1SQyBBVlJDUCBUYXJnZXQgaW50ZXJmYWNlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogc2V0IHRvIHNpemVvZihCdFJjSW50ZXJmYWNlKSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBCdFJjIGNhbGxiYWNrcwotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCppbml0KShidHJjX2NhbGxiYWNrc190KiBjYWxsYmFja3MpOwotCi0gIC8qKiBSZXNwb3NlIHRvIEdldFBsYXlTdGF0dXMgcmVxdWVzdC4gQ29udGFpbnMgdGhlIGN1cnJlbnQKLSAgKiogIDEuIFBsYXkgc3RhdHVzCi0gICoqICAyLiBTb25nIGR1cmF0aW9uL2xlbmd0aAotICAqKiAgMy4gU29uZyBwb3NpdGlvbgotICAqLwotICBidF9zdGF0dXNfdCAoKmdldF9wbGF5X3N0YXR1c19yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19wbGF5X3N0YXR1c190IHBsYXlfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvbmdfbGVuLCB1aW50MzJfdCBzb25nX3Bvcyk7Ci0KLSAgLyoqIExpc3RzIHRoZSBzdXBwb3J0IHBsYXllciBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIChTaHVmZmxlL1JlcGVhdC8uLi4pCi0gICoqICBudW1fYXR0cjogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHBvaW50ZXIKLSAgKnBfYXR0cnMKLSAgKi8KLSAgYnRfc3RhdHVzX3QgKCpsaXN0X3BsYXllcl9hcHBfYXR0cl9yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3BsYXllcl9hdHRyX3QqIHBfYXR0cnMpOwotCi0gIC8qKiBMaXN0cyB0aGUgc3VwcG9ydCBwbGF5ZXIgYXBwbGljYXRpb24gYXR0cmlidXRlcyAoU2h1ZmZsZSBPZmYvT24vR3JvdXApCi0gICoqICBudW1fdmFsOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBwb2ludGVyIHBfdmFscwotICAqLwotICBidF9zdGF0dXNfdCAoKmxpc3RfcGxheWVyX2FwcF92YWx1ZV9yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV92YWwsIHVpbnQ4X3QqIHBfdmFscyk7Ci0KLSAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gYXR0cmlidXRlIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgc3BlY2lmaWVkCi0gICAqIGF0dHJfaWQgKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfcGxheWVyX2FwcF92YWx1ZV9yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3BsYXllcl9zZXR0aW5nc190KiBwX3ZhbHMpOwotCi0gIC8qKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIHRleHQgKCJTaHVmZmxlIi8iUmVwZWF0Ii8uLi4pCi0gICoqICBudW1fYXR0cjogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcycgdGV4dCBjb250YWluZWQgaW4gdGhlCi0gICpwb2ludGVyIHBfYXR0cnMKLSAgKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfcGxheWVyX2FwcF9hdHRyX3RleHRfcnNwKSgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBudW1fYXR0ciwKLSAgICAgIGJ0cmNfcGxheWVyX3NldHRpbmdfdGV4dF90KiBwX2F0dHJzKTsKLQotICAvKiogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlcyB0ZXh0ICgiU2h1ZmZsZSIvIlJlcGVhdCIvLi4uKQotICAqKiAgbnVtX2F0dHI6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSB2YWx1ZXMnIHRleHQgY29udGFpbmVkIGluIHRoZQotICAqcG9pbnRlciBwX3ZhbHMKLSAgKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfcGxheWVyX2FwcF92YWx1ZV90ZXh0X3JzcCkoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBpbnQgbnVtX3ZhbCwKLSAgICAgIGJ0cmNfcGxheWVyX3NldHRpbmdfdGV4dF90KiBwX3ZhbHMpOwotCi0gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNvbmdzJyBlbGVtZW50IGF0dHJpYnV0ZXMgdGV4dAotICAgKigiVGl0bGUiLyJBbGJ1bSIvIkFydGlzdCIpCi0gICAqKiAgbnVtX2F0dHI6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMnIHRleHQgY29udGFpbmVkIGluIHRoZQotICAgKnBvaW50ZXIgcF9hdHRycwotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfZWxlbWVudF9hdHRyX3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIHBfYXR0cnMpOwotCi0gIC8qKiBSZXNwb25zZSB0byBzZXQgcGxheWVyIGF0dHJpYnV0ZSByZXF1ZXN0ICgiU2h1ZmZsZSIvIlJlcGVhdCIpCi0gICoqICByc3Bfc3RhdHVzOiBTdGF0dXMgb2Ygc2V0dGluZyB0aGUgcGxheWVyIGF0dHJpYnV0ZXMgZm9yIHRoZSBjdXJyZW50IG1lZGlhCi0gICpwbGF5ZXIKLSAgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfcGxheWVyX2FwcF92YWx1ZV9yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpOwotCi0gIC8qIFJlc3BvbnNlIHRvIHRoZSByZWdpc3RlciBub3RpZmljYXRpb24gcmVxdWVzdCAoUGxheSBzdGF0ZSBjaGFuZ2UvdHJhY2sKLSAgICpjaGFuZ2UvLi4uKS4KLSAgICoqIGV2ZW50X2lkOiBSZWZlcnMgdG8gdGhlIGV2ZW50X2lkIHRoaXMgbm90aWZpY2F0aW9uIGNoYW5nZSBjb3JyZXNwb25kcyB0b28KLSAgICoqIHR5cGU6IFJlc3BvbnNlIHR5cGUgLSBpbnRlcmltL2NoYW5nZWQKLSAgICoqIHBfcGFyYW1zOiBCYXNlZCBvbiB0aGUgZXZlbnRfaWQsIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSBwb3B1bGF0ZWQKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3JzcCkoCi0gICAgICBidHJjX2V2ZW50X2lkX3QgZXZlbnRfaWQsIGJ0cmNfbm90aWZpY2F0aW9uX3R5cGVfdCB0eXBlLAotICAgICAgYnRyY19yZWdpc3Rlcl9ub3RpZmljYXRpb25fdCogcF9wYXJhbSk7Ci0KLSAgLyogQVZSQ1AgMS40IGVuaGFuY2VtZW50cyAqLwotCi0gIC8qKlNlbmQgY3VycmVudCB2b2x1bWUgc2V0dGluZyB0byByZW1vdGUgc2lkZS4gU3VwcG9ydCBsaW1pdGVkIHRvCi0gICAqU2V0QWJzb2x1dGVWb2x1bWUKLSAgICoqIFRoaXMgY2FuIGJlIGVuaGFuY2VkIHRvIHN1cHBvcnQgUmVsYXRpdmUgVm9sdW1lIChBVlJDUCAxLjApLgotICAgKiogV2l0aCBSZWxhdGVWb2x1bWUsIHdlIHdpbGwgc2VuZCBWT0xVTUVfVVAvVk9MVU1FX0RPV04gb3Bwb3NlZCB0byBhYnNvbHV0ZQotICAgKnZvbHVtZSBsZXZlbAotICAgKiogdm9sdW1lOiBTaG91bGQgYmUgaW4gdGhlIHJhbmdlIDAtMTI3LiBiaXQ3IGlzIHJlc2V2ZWQgYW5kIGNhbm5vdCBiZSBzZXQKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X3ZvbHVtZSkodWludDhfdCB2b2x1bWUpOwotCi0gIC8qIFNldCBhZGRyZXNzZWQgcGxheWVyIHJlc3BvbnNlIGZyb20gVEcgdG8gQ1QgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfYWRkcmVzc2VkX3BsYXllcl9yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpOwotCi0gIC8qIFNldCBicm93c2VkIHBsYXllciByZXNwb25zZSBmcm9tIFRHIHRvIENUICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X2Jyb3dzZWRfcGxheWVyX3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX2l0ZW1zLCB1aW50MTZfdCBjaGFyc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZm9sZGVyX2RlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfYnJfZm9sZGVyX25hbWVfdCogcF9mb2xkZXJzKTsKLQotICAvKiBHZXQgZm9sZGVyIGl0ZW0gbGlzdCByZXNwb25zZSBmcm9tIFRHIHRvIENUICovCi0gIGJ0X3N0YXR1c190ICgqZ2V0X2ZvbGRlcl9pdGVtc19saXN0X3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdWlkX2NvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1faXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19mb2xkZXJfaXRlbXNfdCogcF9pdGVtcyk7Ci0KLSAgLyogQ2hhbmdlIHBhdGggcmVzcG9uc2UgZnJvbSBURyB0byBDVCAqLwotICBidF9zdGF0dXNfdCAoKmNoYW5nZV9wYXRoX3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cywgdWludDMyX3QgbnVtX2l0ZW1zKTsKLQotICAvKiogUmV0dXJucyB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMgbnVtX2F0dHI6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCi0gICAqIGF0dHJpYnV0ZXMnIHRleHQgY29udGFpbmVkIGluIHRoZSBwb2ludGVyIHBfYXR0cnMKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqZ2V0X2l0ZW1fYXR0cl9yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cywgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIHBfYXR0cnMpOwotCi0gIC8qIHBsYXkgbWVkaWEgaXRlbSByZXNwb25zZSBmcm9tIFRHIHRvIENUICovCi0gIGJ0X3N0YXR1c190ICgqcGxheV9pdGVtX3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpOwotCi0gIC8qIGdldCB0b3RhbCBudW1iZXIgb2YgaXRlbXMgcmVzcG9uc2UgZnJvbSBURyB0byBDVCovCi0gIGJ0X3N0YXR1c190ICgqZ2V0X3RvdGFsX251bV9vZl9pdGVtc19yc3ApKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdWlkX2NvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9pdGVtcyk7Ci0KLSAgLyogU2VhcmNoIFZGUyByZXNwb25zZSBmcm9tIFRHIHRvIENUICovCi0gIGJ0X3N0YXR1c190ICgqc2VhcmNoX3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVpZF9jb3VudGVyLCB1aW50MzJfdCBudW1faXRlbXMpOwotCi0gIC8qIGFkZF90b19ub3cgcGxheWluZyBsaXN0IHJlc3BvbnNlIGZyb20gVEcgdG8gQ1QgKi8KLSAgYnRfc3RhdHVzX3QgKCphZGRfdG9fbm93X3BsYXlpbmdfcnNwKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cyk7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2b2lkICgqY2xlYW51cCkodm9pZCk7Ci19IGJ0cmNfaW50ZXJmYWNlX3Q7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfcGFzc3Rocm91Z2hfcnNwX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9zdGF0ZSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfZ3JvdXBuYXZpZ2F0aW9uX3JzcF9jYWxsYmFjaykoaW50IGlkLCBpbnQga2V5X3N0YXRlKTsKLQotdHlwZWRlZiB2b2lkICgqYnRyY19jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrKShib29sIHJjX2Nvbm5lY3QsIGJvb2wgYnRfY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfY3RybF9nZXRyY2ZlYXR1cmVzX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZWF0dXJlcyk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfY3RybF9zZXRhYnN2b2xfY21kX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWJzX3ZvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxhYmVsKTsKLQotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX3JlZ2lzdGVybm90aWZpY2F0aW9uX2Fic192b2xfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgbGFiZWwpOwotCi10eXBlZGVmIHZvaWQgKCpidHJjX2N0cmxfc2V0cGxheWVyYXBwbGljYXRpb25zZXR0aW5nX3JzcF9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBhY2NlcHRlZCk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfY3RybF9wbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgbnVtX2F0dHIsCi0gICAgYnRyY19wbGF5ZXJfYXBwX2F0dHJfdCogYXBwX2F0dHJzLCB1aW50OF90IG51bV9leHRfYXR0ciwKLSAgICBidHJjX3BsYXllcl9hcHBfZXh0X2F0dHJfdCogZXh0X2F0dHJzKTsKLQotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX3BsYXllcmFwcGxpY2F0aW9uc2V0dGluZ19jaGFuZ2VkX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCBidHJjX3BsYXllcl9zZXR0aW5nc190JiB2YWxzKTsKLQotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX3RyYWNrX2NoYW5nZWRfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgbnVtX2F0dHIsCi0gICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIHBfYXR0cnMpOwotCi10eXBlZGVmIHZvaWQgKCpidHJjX2N0cmxfcGxheV9wb3NpdGlvbl9jaGFuZ2VkX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCBzb25nX2xlbiwgdWludDMyX3Qgc29uZ19wb3MpOwotCi10eXBlZGVmIHZvaWQgKCpidHJjX2N0cmxfcGxheV9zdGF0dXNfY2hhbmdlZF9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYnRyY19wbGF5X3N0YXR1c190IHBsYXlfc3RhdHVzKTsKLQotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX2dldF9mb2xkZXJfaXRlbXNfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJ0cmNfc3RhdHVzX3Qgc3RhdHVzLAotICAgIGNvbnN0IGJ0cmNfZm9sZGVyX2l0ZW1zX3QqIGZvbGRlcl9pdGVtcywgdWludDhfdCBjb3VudCk7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfY3RybF9jaGFuZ2VfcGF0aF9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQpOwotCi10eXBlZGVmIHZvaWQgKCpidHJjX2N0cmxfc2V0X2Jyb3dzZWRfcGxheWVyX2NhbGxiYWNrKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1faXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlcHRoKTsKLXR5cGVkZWYgdm9pZCAoKmJ0cmNfY3RybF9zZXRfYWRkcmVzc2VkX3BsYXllcl9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBzdGF0dXMpOwotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX2FkZHJlc3NlZF9wbGF5ZXJfY2hhbmdlZF9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgaWQpOwotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX25vd19wbGF5aW5nX2NvbnRlbnRzX2NoYW5nZWRfY2FsbGJhY2spKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotdHlwZWRlZiB2b2lkICgqYnRyY19jdHJsX2F2YWlsYWJsZV9wbGF5ZXJfY2hhbmdlZF9jYWxsYmFjaykoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLXR5cGVkZWYgdm9pZCAoKmJ0cmNfY3RybF9nZXRfY292ZXJfYXJ0X3BzbV9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBjb25zdCB1aW50MTZfdCBwc20pOwotCi0vKiogQlQtUkMgQ29udHJvbGxlciBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBzZXQgdG8gc2l6ZW9mKEJ0UmNDYWxsYmFja3MpICovCi0gIHNpemVfdCBzaXplOwotICBidHJjX3Bhc3N0aHJvdWdoX3JzcF9jYWxsYmFjayBwYXNzdGhyb3VnaF9yc3BfY2I7Ci0gIGJ0cmNfZ3JvdXBuYXZpZ2F0aW9uX3JzcF9jYWxsYmFjayBncm91cG5hdmlnYXRpb25fcnNwX2NiOwotICBidHJjX2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2sgY29ubmVjdGlvbl9zdGF0ZV9jYjsKLSAgYnRyY19jdHJsX2dldHJjZmVhdHVyZXNfY2FsbGJhY2sgZ2V0cmNmZWF0dXJlc19jYjsKLSAgYnRyY19jdHJsX3NldHBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ19yc3BfY2FsbGJhY2sgc2V0cGxheWVyYXBwc2V0dGluZ19yc3BfY2I7Ci0gIGJ0cmNfY3RybF9wbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdfY2FsbGJhY2sgcGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NiOwotICBidHJjX2N0cmxfcGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NoYW5nZWRfY2FsbGJhY2sKLSAgICAgIHBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ19jaGFuZ2VkX2NiOwotICBidHJjX2N0cmxfc2V0YWJzdm9sX2NtZF9jYWxsYmFjayBzZXRhYnN2b2xfY21kX2NiOwotICBidHJjX2N0cmxfcmVnaXN0ZXJub3RpZmljYXRpb25fYWJzX3ZvbF9jYWxsYmFjawotICAgICAgcmVnaXN0ZXJub3RpZmljYXRpb25fYWJzdm9sX2NiOwotICBidHJjX2N0cmxfdHJhY2tfY2hhbmdlZF9jYWxsYmFjayB0cmFja19jaGFuZ2VkX2NiOwotICBidHJjX2N0cmxfcGxheV9wb3NpdGlvbl9jaGFuZ2VkX2NhbGxiYWNrIHBsYXlfcG9zaXRpb25fY2hhbmdlZF9jYjsKLSAgYnRyY19jdHJsX3BsYXlfc3RhdHVzX2NoYW5nZWRfY2FsbGJhY2sgcGxheV9zdGF0dXNfY2hhbmdlZF9jYjsKLSAgYnRyY19jdHJsX2dldF9mb2xkZXJfaXRlbXNfY2FsbGJhY2sgZ2V0X2ZvbGRlcl9pdGVtc19jYjsKLSAgYnRyY19jdHJsX2NoYW5nZV9wYXRoX2NhbGxiYWNrIGNoYW5nZV9mb2xkZXJfcGF0aF9jYjsKLSAgYnRyY19jdHJsX3NldF9icm93c2VkX3BsYXllcl9jYWxsYmFjayBzZXRfYnJvd3NlZF9wbGF5ZXJfY2I7Ci0gIGJ0cmNfY3RybF9zZXRfYWRkcmVzc2VkX3BsYXllcl9jYWxsYmFjayBzZXRfYWRkcmVzc2VkX3BsYXllcl9jYjsKLSAgYnRyY19jdHJsX2FkZHJlc3NlZF9wbGF5ZXJfY2hhbmdlZF9jYWxsYmFjayBhZGRyZXNzZWRfcGxheWVyX2NoYW5nZWRfY2I7Ci0gIGJ0cmNfY3RybF9ub3dfcGxheWluZ19jb250ZW50c19jaGFuZ2VkX2NhbGxiYWNrCi0gICAgICBub3dfcGxheWluZ19jb250ZW50c19jaGFuZ2VkX2NiOwotICBidHJjX2N0cmxfYXZhaWxhYmxlX3BsYXllcl9jaGFuZ2VkX2NhbGxiYWNrIGF2YWlsYWJsZV9wbGF5ZXJfY2hhbmdlZF9jYjsKLSAgYnRyY19jdHJsX2dldF9jb3Zlcl9hcnRfcHNtX2NhbGxiYWNrIGdldF9jb3Zlcl9hcnRfcHNtX2NiOwotfSBidHJjX2N0cmxfY2FsbGJhY2tzX3Q7Ci0KLS8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1SQyBBVlJDUCBDb250cm9sbGVyIGludGVyZmFjZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoQnRSY0ludGVyZmFjZSkgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgQnRSYyBjYWxsYmFja3MKLSAgICovCi0gIGJ0X3N0YXR1c190ICgqaW5pdCkoYnRyY19jdHJsX2NhbGxiYWNrc190KiBjYWxsYmFja3MpOwotCi0gIC8qKiBzZW5kIHBhc3MgdGhyb3VnaCBjb21tYW5kIHRvIHRhcmdldCAqLwotICBidF9zdGF0dXNfdCAoKnNlbmRfcGFzc190aHJvdWdoX2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2NvZGUsIHVpbnQ4X3Qga2V5X3N0YXRlKTsKLQotICAvKiogc2VuZCBncm91cCBuYXZpZ2F0aW9uIGNvbW1hbmQgdG8gdGFyZ2V0ICovCi0gIGJ0X3N0YXR1c190ICgqc2VuZF9ncm91cF9uYXZpZ2F0aW9uX2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9jb2RlLCB1aW50OF90IGtleV9zdGF0ZSk7Ci0KLSAgLyoqIHNlbmQgY29tbWFuZCB0byBzZXQgcGxheWVyIGFwcGxpY2FpdG9uIHNldHRpbmcgYXR0cmlidXRlcyB0byB0YXJnZXQgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfcGxheWVyX2FwcF9zZXR0aW5nX2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXR0cmliLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhdHRyaWJfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhdHRyaWJfdmFscyk7Ci0KLSAgLyoqIHNlbmQgY29tbWFuZCB0byBwbGF5IGEgcGFydGljdWxhciBpdGVtICovCi0gIGJ0X3N0YXR1c190ICgqcGxheV9pdGVtX2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1aWQsIHVpbnQxNl90IHVpZF9jb3VudGVyKTsKLQotICAvKiogZ2V0IHRoZSBjdXJyZW50IHRyYWNrJ3MgbWVkaWEgbWV0YWRhdGEgKi8KLSAgYnRfc3RhdHVzX3QgKCpnZXRfY3VycmVudF9tZXRhZGF0YV9jbWQpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKiBnZXQgdGhlIHBsYXliYWNrIHN0YXRlICovCi0gIGJ0X3N0YXR1c190ICgqZ2V0X3BsYXliYWNrX3N0YXRlX2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLSAgLyoqIGdldCB0aGUgbm93IHBsYXlpbmcgbGlzdCAqLwotICBidF9zdGF0dXNfdCAoKmdldF9ub3dfcGxheWluZ19saXN0X2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpOwotCi0gIC8qKiBnZXQgdGhlIGZvbGRlciBsaXN0ICovCi0gIGJ0X3N0YXR1c190ICgqZ2V0X2ZvbGRlcl9saXN0X2NtZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDMyX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZW5kKTsKLQotICAvKiogZ2V0IHRoZSBwbGF5ZXIgbGlzdCAqLwotICBidF9zdGF0dXNfdCAoKmdldF9wbGF5ZXJfbGlzdF9jbWQpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuZCk7Ci0KLSAgLyoqIGNoYW5nZSB0aGUgZm9sZGVyIHBhdGggKi8KLSAgYnRfc3RhdHVzX3QgKCpjaGFuZ2VfZm9sZGVyX3BhdGhfY21kKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlyZWN0aW9uLCB1aW50OF90KiB1aWQpOwotCi0gIC8qKiBzZXQgYnJvd3NlZCBwbGF5ZXIgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfYnJvd3NlZF9wbGF5ZXJfY21kKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBsYXllcl9pZCk7Ci0KLSAgLyoqIHNldCBhZGRyZXNzZWQgcGxheWVyICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X2FkZHJlc3NlZF9wbGF5ZXJfY21kKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGxheWVyX2lkKTsKLQotICAvKiogc2VuZCByc3AgdG8gc2V0X2Fic192b2wgcmVjZWl2ZWQgZnJvbSB0YXJnZXQgKi8KLSAgYnRfc3RhdHVzX3QgKCpzZXRfdm9sdW1lX3JzcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBhYnNfdm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxhYmVsKTsKLQotICAvKiogc2VuZCBub3RpZmljYWl0b24gcnNwIGZvciBhYnMgdm9sIHRvIHRhcmdldCAqLwotICBidF9zdGF0dXNfdCAoKnJlZ2lzdGVyX2Fic192b2xfcnNwKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX25vdGlmaWNhdGlvbl90eXBlX3QgcnNwX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWJzX3ZvbCwgdWludDhfdCBsYWJlbCk7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2b2lkICgqY2xlYW51cCkodm9pZCk7Ci19IGJ0cmNfY3RybF9pbnRlcmZhY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9SQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X3NkcC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9zZHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljNTcyOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X3NkcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotI2luY2x1ZGUgImJsdWV0b290aC5oIgotCi0jZGVmaW5lIFNEUF9PUFBfU1VQUE9SVEVEX0ZPUk1BVFNfTUFYX0xFTkdUSCAxNQotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qKgotICogVGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFNEUF9UWVBFX1JBVywgICAgICAgICAvLyBVc2VkIHRvIGNhcnJ5IHJhdyBTRFAgc2VhcmNoIGRhdGEgZm9yIHVua25vd24gVVVJRHMKLSAgU0RQX1RZUEVfTUFQX01BUywgICAgIC8vIE1lc3NhZ2UgQWNjZXNzIFByb2ZpbGUgLSBTZXJ2ZXIKLSAgU0RQX1RZUEVfTUFQX01OUywgICAgIC8vIE1lc3NhZ2UgQWNjZXNzIFByb2ZpbGUgLSBDbGllbnQgKE5vdGlmaWNhdGlvbiBTZXJ2ZXIpCi0gIFNEUF9UWVBFX1BCQVBfUFNFLCAgICAvLyBQaG9uZSBCb29rIFByb2ZpbGUgLSBTZXJ2ZXIKLSAgU0RQX1RZUEVfUEJBUF9QQ0UsICAgIC8vIFBob25lIEJvb2sgUHJvZmlsZSAtIENsaWVudAotICBTRFBfVFlQRV9PUFBfU0VSVkVSLCAgLy8gT2JqZWN0IFB1c2ggUHJvZmlsZQotICBTRFBfVFlQRV9TQVBfU0VSVkVSLCAgIC8vIFNJTSBBY2Nlc3MgUHJvZmlsZQotICBTRFBfVFlQRV9ESVAgICAgICAgICAgIC8vIERldmljZSBJZGVudGlmaWNhdGlvbiBQcm9maWxlCi19IGJsdWV0b290aF9zZHBfdHlwZXM7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibHVldG9vdGhfc2RwX2hkciB7Ci0gIGJsdWV0b290aF9zZHBfdHlwZXMgdHlwZTsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIHVpbnQzMl90IHNlcnZpY2VfbmFtZV9sZW5ndGg7Ci0gIGNoYXIqIHNlcnZpY2VfbmFtZTsKLSAgaW50MzJfdCByZmNvbW1fY2hhbm5lbF9udW1iZXI7Ci0gIGludDMyX3QgbDJjYXBfcHNtOwotICBpbnQzMl90IHByb2ZpbGVfdmVyc2lvbjsKLX0gYmx1ZXRvb3RoX3NkcF9oZHI7Ci0KLS8qKgotICogU29tZSBzaWduYWxzIG5lZWQgYWRkaXRpb25hbCBwb2ludGVycywgaGVuY2Ugd2UgaW50cm9kdWNlIGEKLSAqIGdlbmVyaWMgd2F5IHRvIGhhbmRsZSB0aGVzZSBwb2ludGVycy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgX2JsdWV0b290aF9zZHBfaGRyX292ZXJsYXkgewotICBibHVldG9vdGhfc2RwX3R5cGVzIHR5cGU7Ci0gIGJsdWV0b290aDo6VXVpZCB1dWlkOwotICB1aW50MzJfdCBzZXJ2aWNlX25hbWVfbGVuZ3RoOwotICBjb25zdCBjaGFyKiBzZXJ2aWNlX25hbWU7Ci0gIGludDMyX3QgcmZjb21tX2NoYW5uZWxfbnVtYmVyOwotICBpbnQzMl90IGwyY2FwX3BzbTsKLSAgaW50MzJfdCBwcm9maWxlX3ZlcnNpb247Ci0KLSAgLy8gVXNlciBwb2ludGVycywgb25seSB1c2VkIGZvciBzb21lIHNpZ25hbHMgLSBzZWUgYmx1ZXRvb3RoX3NkcF9vcHNfcmVjb3JkCi0gIGludCB1c2VyMV9wdHJfbGVuOwotICBjb25zdCB1aW50OF90KiB1c2VyMV9wdHI7Ci0gIGludCB1c2VyMl9wdHJfbGVuOwotICBjb25zdCB1aW50OF90KiB1c2VyMl9wdHI7Ci19IGJsdWV0b290aF9zZHBfaGRyX292ZXJsYXk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibHVldG9vdGhfc2RwX21hc19yZWNvcmQgewotICBibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IGhkcjsKLSAgdWludDMyX3QgbWFzX2luc3RhbmNlX2lkOwotICB1aW50MzJfdCBzdXBwb3J0ZWRfZmVhdHVyZXM7Ci0gIHVpbnQzMl90IHN1cHBvcnRlZF9tZXNzYWdlX3R5cGVzOwotfSBibHVldG9vdGhfc2RwX21hc19yZWNvcmQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibHVldG9vdGhfc2RwX21uc19yZWNvcmQgewotICBibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IGhkcjsKLSAgdWludDMyX3Qgc3VwcG9ydGVkX2ZlYXR1cmVzOwotfSBibHVldG9vdGhfc2RwX21uc19yZWNvcmQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibHVldG9vdGhfc2RwX3BzZV9yZWNvcmQgewotICBibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IGhkcjsKLSAgdWludDMyX3Qgc3VwcG9ydGVkX2ZlYXR1cmVzOwotICB1aW50MzJfdCBzdXBwb3J0ZWRfcmVwb3NpdG9yaWVzOwotfSBibHVldG9vdGhfc2RwX3BzZV9yZWNvcmQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibHVldG9vdGhfc2RwX3BjZV9yZWNvcmQgewotICBibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IGhkcjsKLX0gYmx1ZXRvb3RoX3NkcF9wY2VfcmVjb3JkOwotCi10eXBlZGVmIHN0cnVjdCBfYmx1ZXRvb3RoX3NkcF9vcHNfcmVjb3JkIHsKLSAgYmx1ZXRvb3RoX3NkcF9oZHJfb3ZlcmxheSBoZHI7Ci0gIGludCBzdXBwb3J0ZWRfZm9ybWF0c19saXN0X2xlbjsKLSAgdWludDhfdCBzdXBwb3J0ZWRfZm9ybWF0c19saXN0W1NEUF9PUFBfU1VQUE9SVEVEX0ZPUk1BVFNfTUFYX0xFTkdUSF07Ci19IGJsdWV0b290aF9zZHBfb3BzX3JlY29yZDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JsdWV0b290aF9zZHBfc2FwX3JlY29yZCB7Ci0gIGJsdWV0b290aF9zZHBfaGRyX292ZXJsYXkgaGRyOwotfSBibHVldG9vdGhfc2RwX3NhcF9yZWNvcmQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9ibHVldG9vdGhfc2RwX2RpcF9yZWNvcmQgewotICBibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IGhkcjsKLSAgdWludDE2X3Qgc3BlY19pZDsKLSAgdWludDE2X3QgdmVuZG9yOwotICB1aW50MTZfdCB2ZW5kb3JfaWRfc291cmNlOwotICB1aW50MTZfdCBwcm9kdWN0OwotICB1aW50MTZfdCB2ZXJzaW9uOwotICBib29sIHByaW1hcnlfcmVjb3JkOwotfSBibHVldG9vdGhfc2RwX2RpcF9yZWNvcmQ7Ci0KLXR5cGVkZWYgdW5pb24gewotICBibHVldG9vdGhfc2RwX2hkcl9vdmVybGF5IGhkcjsKLSAgYmx1ZXRvb3RoX3NkcF9tYXNfcmVjb3JkIG1hczsKLSAgYmx1ZXRvb3RoX3NkcF9tbnNfcmVjb3JkIG1uczsKLSAgYmx1ZXRvb3RoX3NkcF9wc2VfcmVjb3JkIHBzZTsKLSAgYmx1ZXRvb3RoX3NkcF9wY2VfcmVjb3JkIHBjZTsKLSAgYmx1ZXRvb3RoX3NkcF9vcHNfcmVjb3JkIG9wczsKLSAgYmx1ZXRvb3RoX3NkcF9zYXBfcmVjb3JkIHNhcDsKLSAgYmx1ZXRvb3RoX3NkcF9kaXBfcmVjb3JkIGRpcDsKLX0gYmx1ZXRvb3RoX3NkcF9yZWNvcmQ7Ci0KLS8qKiBDYWxsYmFjayBmb3IgU0RQIHNlYXJjaCAqLwotdHlwZWRlZiB2b2lkICgqYnRzZHBfc2VhcmNoX2NhbGxiYWNrKShidF9zdGF0dXNfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3Jkcyk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIFNldCB0byBzaXplb2YoYnRzZHBfY2FsbGJhY2tzX3QpICovCi0gIHNpemVfdCBzaXplOwotICBidHNkcF9zZWFyY2hfY2FsbGJhY2sgc2RwX3NlYXJjaF9jYjsKLX0gYnRzZHBfY2FsbGJhY2tzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIFNldCB0byBzaXplIG9mIHRoaXMgc3RydWN0ICovCi0gIHNpemVfdCBzaXplOwotCi0gIC8qKiBSZWdpc3RlciBCVCBTRFAgc2VhcmNoIGNhbGxiYWNrcyAqLwotICBidF9zdGF0dXNfdCAoKmluaXQpKGJ0c2RwX2NhbGxiYWNrc190KiBjYWxsYmFja3MpOwotCi0gIC8qKiBVbnJlZ2lzdGVyIEJUIFNEUCAqLwotICBidF9zdGF0dXNfdCAoKmRlaW5pdCkoKTsKLQotICAvKiogU2VhcmNoIGZvciBTRFAgcmVjb3JkcyB3aXRoIHNwZWNpZmljIHV1aWQgb24gcmVtb3RlIGRldmljZSAqLwotICBidF9zdGF0dXNfdCAoKnNkcF9zZWFyY2gpKFJhd0FkZHJlc3MqIGJkX2FkZHIsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCk7Ci0KLSAgLyoqCi0gICAqIFVzZSBsaXN0ZW4gaW4gdGhlIHNvY2tldCBpbnRlcmZhY2UgdG8gY3JlYXRlIHJmY29tbSBhbmQvb3IgbDJjYXAgUFNNCi0gICAqIGNoYW5uZWxzLCAod2l0aG91dCBVVUlEIGFuZCBzZXJ2aWNlX25hbWUgYW5kIHNldCB0aGUgQlRTT0NLX0ZMQUdfTk9fU0RQCi0gICAqIGZsYWcgaW4gZmxhZ3MpLiBUaGVuIHVzZSBjcmVhdGVTZHBSZWNvcmQgdG8gY3JlYXRlIHRoZSBTRFAgcmVjb3JkCi0gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmZjb21tL2wyY2FwIGNoYW5uZWxzLgotICAgKgotICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBTRFAgcmVjb3JkLCB3aGljaCBjYW4gYmUgcGFyc2VkIHRvCi0gICAqIHJlbW92ZV9zZHBfcmVjb3JkLgotICAgKgotICAgKiByZWNvcmQgICAgICAgICAgIChpbikgVGhlIFNEUCByZWNvcmQgdG8gY3JlYXRlCi0gICAqIHJlY29yZF9oYW5kbGUgICAgKG91dClUaGUgY29ycmVzcG9uZGluZyByZWNvcmQgaGFuZGxlIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgKiB0aGlzIHBvaW50ZXIuCi0gICAqLwotICBidF9zdGF0dXNfdCAoKmNyZWF0ZV9zZHBfcmVjb3JkKShibHVldG9vdGhfc2RwX3JlY29yZCogcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlY29yZF9oYW5kbGUpOwotCi0gIC8qKiBSZW1vdmUgYSBTRFAgcmVjb3JkIGNyZWF0ZWQgYnkgY3JlYXRlU2RwUmVjb3JkICovCi0gIGJ0X3N0YXR1c190ICgqcmVtb3ZlX3NkcF9yZWNvcmQpKGludCBzZHBfaGFuZGxlKTsKLX0gYnRzZHBfaW50ZXJmYWNlX3Q7Ci0KLV9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X3NvY2suaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfc29jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQzMmU2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfc29jay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGguaCIKLSNpbmNsdWRlICJibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLV9fQkVHSU5fREVDTFMKLQotI2RlZmluZSBCVFNPQ0tfRkxBR19FTkNSWVBUIDEKLSNkZWZpbmUgQlRTT0NLX0ZMQUdfQVVUSCAoMSA8PCAxKQotI2RlZmluZSBCVFNPQ0tfRkxBR19OT19TRFAgKDEgPDwgMikKLSNkZWZpbmUgQlRTT0NLX0ZMQUdfQVVUSF9NSVRNICgxIDw8IDMpCi0jZGVmaW5lIEJUU09DS19GTEFHX0FVVEhfMTZfRElHSVQgKDEgPDwgNCkKLSNkZWZpbmUgQlRTT0NLX0ZMQUdfTEVfQ09DICgxIDw8IDUpCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEJUU09DS19SRkNPTU0gPSAxLAotICBCVFNPQ0tfU0NPID0gMiwKLSAgQlRTT0NLX0wyQ0FQID0gMywKLSAgQlRTT0NLX0wyQ0FQX0xFID0gNAotfSBidHNvY2tfdHlwZV90OwotCi0vKiogUmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQgU09DS0VUIGludGVyZmFjZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgc2hvcnQgc2l6ZTsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBpbnQgY2hhbm5lbDsKLSAgaW50IHN0YXR1czsKLQotICAvLyBUaGUgd3JpdGVyIG11c3QgbWFrZSB3cml0ZXMgdXNpbmcgYSBidWZmZXIgb2YgdGhpcyBtYXhpbXVtIHNpemUKLSAgLy8gdG8gYXZvaWQgbG9vc2luZyBkYXRhLiAoTDJDQVAgb25seSkKLSAgdW5zaWduZWQgc2hvcnQgbWF4X3R4X3BhY2tldF9zaXplOwotCi0gIC8vIFRoZSByZWFkZXIgbXVzdCByZWFkIHVzaW5nIGEgYnVmZmVyIG9mIGF0IGxlYXN0IHRoaXMgc2l6ZSB0byBhdm9pZAotICAvLyBsb29zaW5nIGRhdGEuIChMMkNBUCBvbmx5KQotICB1bnNpZ25lZCBzaG9ydCBtYXhfcnhfcGFja2V0X3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNvY2tfY29ubmVjdF9zaWduYWxfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogc2V0IHRvIHNpemUgb2YgdGhpcyBzdHJ1Y3QqLwotICBzaXplX3Qgc2l6ZTsKLQotICAvKioKLSAgICogTGlzdGVuIHRvIGEgUkZDT01NIFVVSUQgb3IgY2hhbm5lbC4gSXQgcmV0dXJucyB0aGUgc29ja2V0IGZkIGZyb20gd2hpY2gKLSAgICogYnRzb2NrX2Nvbm5lY3Rfc2lnbmFsIGNhbiBiZSByZWFkIG91dCB3aGVuIGEgcmVtb3RlIGRldmljZSBjb25uZWN0ZWQuCi0gICAqIElmIG5laXRoZXIgYSBVVUlEIG5vciBhIGNoYW5uZWwgaXMgcHJvdmlkZWQsIGEgY2hhbm5lbCB3aWxsIGJlIGFsbG9jYXRlZAotICAgKiBhbmQgYSBzZXJ2aWNlIHJlY29yZCBjYW4gYmUgY3JlYXRlZCBwcm92aWRpbmcgdGhlIGNoYW5uZWwgbnVtYmVyIHRvCi0gICAqIGNyZWF0ZV9zZHBfcmVjb3JkKC4uLikgaW4gYnRfc2RwLgotICAgKiBUaGUgY2FsbGluZ1VpZCBpcyB0aGUgVUlEIG9mIHRoZSBhcHBsaWNhdGlvbiB3aGljaCBpcyByZXF1ZXN0aW5nIHRoZQotICAgKiBzb2NrZXQuIFRoaXMgaXMgdXNlZCBmb3IgdHJhZmZpYyBhY2NvdW50aW5nIHB1cnBvc2VzLgotICAgKi8KLSAgYnRfc3RhdHVzX3QgKCpsaXN0ZW4pKGJ0c29ja190eXBlX3QgdHlwZSwgY29uc3QgY2hhciogc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBzZXJ2aWNlX3V1aWQsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzb2NrX2ZkLCBpbnQgZmxhZ3MsIGludCBjYWxsaW5nVWlkKTsKLQotICAvKioKLSAgICogQ29ubmVjdCB0byBhIFJGQ09NTSBVVUlEIGNoYW5uZWwgb2YgcmVtb3RlIGRldmljZSwgSXQgcmV0dXJucyB0aGUgc29ja2V0IGZkCi0gICAqIGZyb20gd2hpY2ggdGhlIGJ0c29ja19jb25uZWN0X3NpZ25hbCBhbmQgYSBuZXcgc29ja2V0IGZkIHRvIGJlIGFjY2VwdGVkIGNhbgotICAgKiBiZSByZWFkIG91dCB3aGVuIGNvbm5lY3RlZC4gVGhlIGNhbGxpbmdVaWQgaXMgdGhlIFVJRCBvZiB0aGUgYXBwbGljYXRpb24KLSAgICogd2hpY2ggaXMgcmVxdWVzdGluZyB0aGUgc29ja2V0LiBUaGlzIGlzIHVzZWQgZm9yIHRyYWZmaWMgYWNjb3VudGluZwotICAgKiBwdXJwb3Nlcy4KLSAgICovCi0gIGJ0X3N0YXR1c190ICgqY29ubmVjdCkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgYnRzb2NrX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogdXVpZCwgaW50IGNoYW5uZWwsIGludCogc29ja19mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBjYWxsaW5nVWlkKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBMRSBEYXRhIExlbmd0aCB2YWx1ZSB0byB0aGlzIGNvbm5lY3RlZCBwZWVyIHRvIHRoZQotICAgKiBtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGlzIEJUIGNvbnRyb2xsZXIuIFRoaXMgY29tbWFuZAotICAgKiBzdWdnZXN0cyB0byB0aGUgQlQgY29udHJvbGxlciB0byBzZXQgaXRzIG1heGltdW0gdHJhbnNtaXNzaW9uCi0gICAqIHBhY2tldCBzaXplLgotICAgKi8KLSAgdm9pZCAoKnJlcXVlc3RfbWF4X3R4X2RhdGFfbGVuZ3RoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotfSBidHNvY2tfaW50ZXJmYWNlX3Q7Ci0KLV9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X3ZjLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X3ZjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMGI3MjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF92Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxyYXdfYWRkcmVzcy5oPgotCi0jaW5jbHVkZSA8dmFyaWFudD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdmMgewotCi1lbnVtIGNsYXNzIENvbm5lY3Rpb25TdGF0ZSB7Ci0gIERJU0NPTk5FQ1RFRCA9IDAsCi0gIENPTk5FQ1RJTkcsCi0gIENPTk5FQ1RFRCwKLSAgRElTQ09OTkVDVElORwotfTsKLQotY2xhc3MgVm9sdW1lQ29udHJvbENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Wb2x1bWVDb250cm9sQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgcHJvZmlsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qIENhbGxiYWNrIGZvciB0aGUgdm9sdW1lIGNoYW5nZSBjaGFuZ2VkIG9uIHRoZSBkZXZpY2UgKi8KLSAgdmlydHVhbCB2b2lkIE9uVm9sdW1lU3RhdGVDaGFuZ2VkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXRlKSA9IDA7Ci0KLSAgLyogQ2FsbGJhY2sgZm9yIHRoZSB2b2x1bWUgY2hhbmdlIGNoYW5nZWQgb24gdGhlIGdyb3VwKi8KLSAgdmlydHVhbCB2b2lkIE9uR3JvdXBWb2x1bWVTdGF0ZUNoYW5nZWQoaW50IGdyb3VwX2lkLCB1aW50OF90IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXRlKSA9IDA7Ci19OwotCi1jbGFzcyBWb2x1bWVDb250cm9sSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflZvbHVtZUNvbnRyb2xJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqIFJlZ2lzdGVyIHRoZSBWb2x1bWUgQ29udHJvbCBjYWxsYmFja3MgKi8KLSAgdmlydHVhbCB2b2lkIEluaXQoVm9sdW1lQ29udHJvbENhbGxiYWNrcyogY2FsbGJhY2tzKSA9IDA7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhbnVwKHZvaWQpID0gMDsKLQotICAvKiogQ29ubmVjdCB0byBWb2x1bWUgQ29udHJvbCAqLwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgLyoqIERpc2Nvbm5lY3QgZnJvbSBWb2x1bWUgQ29udHJvbCAqLwotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgLyoqIENhbGxlZCB3aGVuIFZvbHVtZSBjb250cm9sIGRldmljZXMgaXMgdW5ib25kZWQgKi8KLSAgdmlydHVhbCB2b2lkIFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgLyoqIFNldCB0aGUgdm9sdW1lICovCi0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoc3RkOjp2YXJpYW50PFJhd0FkZHJlc3MsIGludD4gYWRkcl9vcl9ncm91cF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZvbHVtZSkgPSAwOwotfTsKLQotfSAvKiBuYW1lc3BhY2UgdmMgKi8KLX0gLyogbmFtZXNwYWNlIGJsdWV0b290aCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ub3RyZWFjaGVkLmggYi9pbmNsdWRlL25vdHJlYWNoZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjODQ5Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25vdHJlYWNoZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotI3ByYWdtYSBvbmNlCi0KLS8vIE9uIGFsbCBvbGQgbGliY2hyb21lLCBOT1RSRUFDSEVEIGlzIGF2YWlsYWJsZSB2aWEgbG9nZ2luZy5oCi0vLyBBZnRlciA4MjIwNjQsIHRoaXMgd2FzIG1vdmVkIGludG8gYmFzZS9ub3RyZWFjaGVkLmgKLSNpZiBkZWZpbmVkKEJBU0VfVkVSKSAmJiBCQVNFX1ZFUiA+PSA4MjIwNjQKLSNpbmNsdWRlIDxiYXNlL25vdHJlYWNoZWQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGVybmFsX2luY2x1ZGUvQW5kcm9pZC5icCBiL2ludGVybmFsX2luY2x1ZGUvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1YmUyYS4uMDAwMDAwMAotLS0gYS9pbnRlcm5hbF9pbmNsdWRlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X2hlYWRlcnMgewotICAgIG5hbWU6ICJpbnRlcm5hbF9pbmNsdWRlX2hlYWRlcnMiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLi8iXSwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQpkaWZmIC0tZ2l0IGEvaW50ZXJuYWxfaW5jbHVkZS9idF90YXJnZXQuaCBiL2ludGVybmFsX2luY2x1ZGUvYnRfdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODRhMDIuLjAwMDAwMDAKLS0tIGEvaW50ZXJuYWxfaW5jbHVkZS9idF90YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAxOTk5LTIwMTYgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUX1RBUkdFVF9ICi0jZGVmaW5lIEJUX1RBUkdFVF9ICi0KLSNpZm5kZWYgQlVJTERDRkcKLSNkZWZpbmUgQlVJTERDRkcKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSEFTX0JEUk9JRF9CVUlMRENGRykgJiYgIWRlZmluZWQoSEFTX05PX0JEUk9JRF9CVUlMRENGRykKLSNlcnJvciBcCi0gICAgIkFuIEFuZHJvaWQubWsgZmlsZSBkaWQgbm90IGluY2x1ZGUgYmRyb2lkX0NGTEFHUyBhbmQgcG9zc2libHkgbm90IGJkcm9pZF9DX0lOQ0xVREVTIgotI2VuZGlmCi0KLSNpZmRlZiBIQVNfQkRST0lEX0JVSUxEQ0ZHCi0jaW5jbHVkZSAiYmRyb2lkX2J1aWxkY2ZnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImJ0X3R5cGVzLmgiIC8qIFRoaXMgbXVzdCBiZSBkZWZpbmVkIEFGVEVSIGJ1aWxkY2ZnLmggKi8KLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSBmYWxzZQotI2VuZGlmCi0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFIHRydWUKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLUFkZGVkIGZyb20gYmRyb2lkX2J1aWxkY2ZnLmgtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZm5kZWYgTDJDQVBfRVhURkVBX1NVUFBPUlRFRF9NQVNLCi0jZGVmaW5lIEwyQ0FQX0VYVEZFQV9TVVBQT1JURURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoTDJDQVBfRVhURkVBX0VOSF9SRVRSQU5TIHwgTDJDQVBfRVhURkVBX1NUUkVBTV9NT0RFIHwgTDJDQVBfRVhURkVBX05PX0NSQyB8IFwKLSAgIEwyQ0FQX0VYVEZFQV9GSVhFRF9DSE5MUykKLSNlbmRpZgotCi0jaWZuZGVmIEJUVUlfT1BTX0ZPUk1BVFMKLSNkZWZpbmUgQlRVSV9PUFNfRk9STUFUUyAoQlRBX09QX1ZDQVJEMjFfTUFTSyB8IEJUQV9PUF9BTllfTUFTSykKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9SRkNfTVRVX1NJWkUKLSNkZWZpbmUgQlRBX1JGQ19NVFVfU0laRSBcCi0gIChMMkNBUF9NVFVfU0laRSAtIEwyQ0FQX01JTl9PRkZTRVQgLSBSRkNPTU1fREFUQV9PVkVSSEVBRCkKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9QQU5fSU5DTFVERUQKLSNkZWZpbmUgQlRBX1BBTl9JTkNMVURFRCBUUlVFCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfSERfSU5DTFVERUQKLSNkZWZpbmUgQlRBX0hEX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9ISF9JTkNMVURFRAotI2RlZmluZSBCVEFfSEhfSU5DTFVERUQgVFJVRQotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0hIX1JPTEUKLSNkZWZpbmUgQlRBX0hIX1JPTEUgQlRBX0NFTlRSQUxfUk9MRV9QUkVGCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfQVZfU0lOS19JTkNMVURFRAotI2RlZmluZSBCVEFfQVZfU0lOS19JTkNMVURFRCBGQUxTRQotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0RJU0FCTEVfREVMQVkKLSNkZWZpbmUgQlRBX0RJU0FCTEVfREVMQVkgMjAwIC8qIGluIG1pbGxpc2Vjb25kcyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgQVZEVF9WRVJTSU9OCi0jZGVmaW5lIEFWRFRfVkVSU0lPTiAweDAxMDMKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9BR19BVF9NQVhfTEVOCi0jZGVmaW5lIEJUQV9BR19BVF9NQVhfTEVOIDUxMgotI2VuZGlmCi0KLSNpZm5kZWYgQlRBX0FHX1NDT19QS1RfVFlQRVMKLSNkZWZpbmUgQlRBX0FHX1NDT19QS1RfVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQlRNX1NDT19MSU5LX09OTFlfTUFTSyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfRVYzIHwgICAgICAgICAgICBcCi0gICBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVYzIHwgRVNDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWNSB8IFwKLSAgIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfQVZfUkVUX1RPVVQKLSNkZWZpbmUgQlRBX0FWX1JFVF9UT1VUIDE1Ci0jZW5kaWYKLQotLyogVFJVRSB0byB1c2UgU0NNUy1UIGNvbnRlbnQgcHJvdGVjdGlvbiAqLwotI2lmbmRlZiBCVEFfQVZfQ09fQ1BfU0NNU19UCi0jZGVmaW5lIEJUQV9BVl9DT19DUF9TQ01TX1QgRkFMU0UKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9ETV9TRFBfREJfU0laRQotI2RlZmluZSBCVEFfRE1fU0RQX0RCX1NJWkUgMjAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIEhMX0lOQ0xVREVECi0jZGVmaW5lIEhMX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0jaWZuZGVmIEFHX1ZPSUNFX1NFVFRJTkdTCi0jZGVmaW5lIEFHX1ZPSUNFX1NFVFRJTkdTIEhDSV9ERUZBVUxUX1ZPSUNFX1NFVFRJTkdTCi0jZW5kaWYKLQotI2lmbmRlZiBCVElGX0RNX09PQl9URVNUCi0jZGVmaW5lIEJUSUZfRE1fT09CX1RFU1QgVFJVRQotI2VuZGlmCi0KLS8vIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGFjdGl2YXRpbmcgc25pZmYgbW9kZSBhZnRlciBlbnRlcmluZyB0aGUKLS8vIGlkbGUgc3RhdGUgZm9yIHNlcnZlciBGVC9SRkNPTU0sIE9QUyBjb25uZWN0aW9ucwotI2lmbmRlZiBCVEFfRlRTX09QU19JRExFX1RPX1NOSUZGX0RFTEFZX01TCi0jZGVmaW5lIEJUQV9GVFNfT1BTX0lETEVfVE9fU05JRkZfREVMQVlfTVMgNzAwMAotI2VuZGlmCi0KLS8vIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGFjdGl2YXRpbmcgc25pZmYgbW9kZSBhZnRlciBlbnRlcmluZyB0aGUKLS8vIGlkbGUgc3RhdGUgZm9yIGNsaWVudCBGVC9SRkNPTU0gY29ubmVjdGlvbnMKLSNpZm5kZWYgQlRBX0ZUQ19JRExFX1RPX1NOSUZGX0RFTEFZX01TCi0jZGVmaW5lIEJUQV9GVENfSURMRV9UT19TTklGRl9ERUxBWV9NUyA1MDAwCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS1FbmQgYWRkZWQgZnJvbSBiZHJvaWRfYnVpbGRjZmcuaC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQnVmZmVyIHNpemVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLSNkZWZpbmUgQlRfREVGQVVMVF9CVUZGRVJfU0laRSAoNDA5NiArIDE2KQotI2VuZGlmCi0KLSNpZm5kZWYgQlRfU01BTExfQlVGRkVSX1NJWkUKLSNkZWZpbmUgQlRfU01BTExfQlVGRkVSX1NJWkUgNjYwCi0jZW5kaWYKLQotLyogUmVjZWl2ZXMgSENJIGV2ZW50cyBmcm9tIHRoZSBsb3dlci1sYXllci4gKi8KLSNpZm5kZWYgSENJX0NNRF9CVUZfU0laRQotI2RlZmluZSBIQ0lfQ01EX0JVRl9TSVpFIEJUX1NNQUxMX0JVRkZFUl9TSVpFCi0jZW5kaWYKLQotLyogU2VuZHMgU0RQIGRhdGEgcGFja2V0cy4gKi8KLSNpZm5kZWYgU0RQX0RBVEFfQlVGX1NJWkUKLSNkZWZpbmUgU0RQX0RBVEFfQlVGX1NJWkUgQlRfREVGQVVMVF9CVUZGRVJfU0laRQotI2VuZGlmCi0KLS8qIFNlbmRzIFJGQ09NTSBjb21tYW5kIHBhY2tldHMuICovCi0jaWZuZGVmIFJGQ09NTV9DTURfQlVGX1NJWkUKLSNkZWZpbmUgUkZDT01NX0NNRF9CVUZfU0laRSBCVF9TTUFMTF9CVUZGRVJfU0laRQotI2VuZGlmCi0KLS8qIFNlbmRzIFJGQ09NTSBkYXRhIHBhY2tldHMuICovCi0jaWZuZGVmIFJGQ09NTV9EQVRBX0JVRl9TSVpFCi0jZGVmaW5lIFJGQ09NTV9EQVRBX0JVRl9TSVpFIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLSNlbmRpZgotCi0vKiBTZW5kcyBMMkNBUCBwYWNrZXRzIHRvIHRoZSBwZWVyIGFuZCBIQ0kgbWVzc2FnZXMgdG8gdGhlIGNvbnRyb2xsZXIuICovCi0jaWZuZGVmIEwyQ0FQX0NNRF9CVUZfU0laRQotI2RlZmluZSBMMkNBUF9DTURfQlVGX1NJWkUgQlRfU01BTExfQlVGRkVSX1NJWkUKLSNlbmRpZgotCi0jaWZuZGVmIEwyQ0FQX0ZDUl9FUlRNX0JVRl9TSVpFCi0jZGVmaW5lIEwyQ0FQX0ZDUl9FUlRNX0JVRl9TSVpFICgxMDI0MCArIDI0KQotI2VuZGlmCi0KLS8qIE51bWJlciBvZiBBQ0wgYnVmZmVycyB0byBhc3NpZ24gdG8gTEUgKi8KLS8qCi0gKiBUT0RPOiBEbyB3ZSBuZWVkIHRoaXM/Ci0gKiBJdCB3YXMgdXNlZCB3aGVuIHRoZSBIQ0kgYnVmZmVycyB3ZXJlIHNoYXJlZCB3aXRoIEJSL0VEUi4KLSAqLwotI2lmbmRlZiBMMkNfREVGX05VTV9CTEVfQlVGX1NIQVJFRAotI2RlZmluZSBMMkNfREVGX05VTV9CTEVfQlVGX1NIQVJFRCAxCi0jZW5kaWYKLQotLyogVXNlZCBieSBCVE0gd2hlbiBpdCBzZW5kcyBIQ0kgY29tbWFuZHMgdG8gdGhlIGNvbnRyb2xsZXIuICovCi0jaWZuZGVmIEJUTV9DTURfQlVGX1NJWkUKLSNkZWZpbmUgQlRNX0NNRF9CVUZfU0laRSBCVF9TTUFMTF9CVUZGRVJfU0laRQotI2VuZGlmCi0KLSNpZm5kZWYgT0JYX0xSR19EQVRBX0JVRl9TSVpFCi0jZGVmaW5lIE9CWF9MUkdfREFUQV9CVUZfU0laRSAoODA4MCArIDI2KQotI2VuZGlmCi0KLS8qIEJORVAgZGF0YSBhbmQgcHJvdG9jb2wgbWVzc2FnZXMuICovCi0jaWZuZGVmIEJORVBfQlVGX1NJWkUKLSNkZWZpbmUgQk5FUF9CVUZfU0laRSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFCi0jZW5kaWYKLQotLyogQVZEVFAgYnVmZmVyIHNpemUgZm9yIHByb3RvY29sIG1lc3NhZ2VzICovCi0jaWZuZGVmIEFWRFRfQ01EX0JVRl9TSVpFCi0jZGVmaW5lIEFWRFRfQ01EX0JVRl9TSVpFIEJUX1NNQUxMX0JVRkZFUl9TSVpFCi0jZW5kaWYKLQotI2lmbmRlZiBQQU5fQlVGX1NJWkUKLSNkZWZpbmUgUEFOX0JVRl9TSVpFIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIGFsbG9jYXRlIGZvciBQQU4gKi8KLSNpZm5kZWYgUEFOX0JVRl9NQVgKLSNkZWZpbmUgUEFOX0JVRl9NQVggMTAwCi0jZW5kaWYKLQotLyogQVZDVFAgYnVmZmVyIHNpemUgZm9yIHByb3RvY29sIG1lc3NhZ2VzICovCi0jaWZuZGVmIEFWQ1RfQ01EX0JVRl9TSVpFCi0jZGVmaW5lIEFWQ1RfQ01EX0JVRl9TSVpFIDI4OAotI2VuZGlmCi0KLS8qIEFWUkNQIGJ1ZmZlciBzaXplIGZvciBwcm90b2NvbCBtZXNzYWdlcyAqLwotI2lmbmRlZiBBVlJDX0NNRF9CVUZfU0laRQotI2RlZmluZSBBVlJDX0NNRF9CVUZfU0laRSAyODgKLSNlbmRpZgotCi0vKiBBVlJDUCBNZXRhZGF0YSBidWZmZXIgc2l6ZSBmb3IgcHJvdG9jb2wgbWVzc2FnZXMgKi8KLSNpZm5kZWYgQVZSQ19NRVRBX0NNRF9CVUZfU0laRQotI2RlZmluZSBBVlJDX01FVEFfQ01EX0JVRl9TSVpFIEJUX1NNQUxMX0JVRkZFUl9TSVpFCi0jZW5kaWYKLQotI2lmbmRlZiBCVEFfSExfTFJHX0RBVEFfQlVGX1NJWkUKLSNkZWZpbmUgQlRBX0hMX0xSR19EQVRBX0JVRl9TSVpFICgxMDI0MCArIDI0KQotI2VuZGlmCi0KLS8qIEdBVFQgRGF0YSBzZW5kaW5nIGJ1ZmZlciBzaXplICovCi0jaWZuZGVmIEdBVFRfREFUQV9CVUZfU0laRQotI2RlZmluZSBHQVRUX0RBVEFfQlVGX1NJWkUgQlRfREVGQVVMVF9CVUZGRVJfU0laRQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBCVE0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENhbmNlbCBJbnF1aXJ5IG9uIGluY29taW5nIFNTUCAqLwotI2lmbmRlZiBCVE1fTk9fU1NQX09OX0lOUVVJUlkKLSNkZWZpbmUgQlRNX05PX1NTUF9PTl9JTlFVSVJZIEZBTFNFCi0jZW5kaWYKLQotI2lmbmRlZiBESVNBQkxFX1dCUwotI2RlZmluZSBESVNBQkxFX1dCUyBGQUxTRQotI2VuZGlmCi0KLS8qICBUaGlzIGlzIHVzZWQgdG8gd29yayBhcm91bmQgYSBjb250cm9sbGVyIGJ1ZyB0aGF0IGRvZXNuJ3QgbGlrZSBEaXNjb25uZWN0Ci0gKiAgaXNzdWVkIHdoaWxlIHRoZXJlIGlzIGEgcm9sZSBzd2l0Y2ggaW4gcHJvZ3Jlc3MKLSovCi0jaWZuZGVmIEJUTV9ESVNDX0RVUklOR19SUwotI2RlZmluZSBCVE1fRElTQ19EVVJJTkdfUlMgVFJVRQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5pdGlhbCBTQ08gVFggY3JlZGl0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogbWF4IFRYIFNDTyBkYXRhIHBhY2tldCBzaXplICovCi0jaWZuZGVmIEJUTV9TQ09fREFUQV9TSVpFX01BWAotI2RlZmluZSBCVE1fU0NPX0RBVEFfU0laRV9NQVggMjQwCi0jZW5kaWYKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEJUTSBpbnF1aXJ5IGRhdGFiYXNlLiAqLwotI2lmbmRlZiBCVE1fSU5RX0RCX1NJWkUKLSNkZWZpbmUgQlRNX0lOUV9EQl9TSVpFIDQwCi0jZW5kaWYKLQotLyogU2V0cyB0aGUgUGFnZV9TY2FuX1dpbmRvdzogIHRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBkZXZpY2UgaXMgcGVyZm9ybWluZwotICogYSBwYWdlIHNjYW4uICovCi0jaWZuZGVmIEJUTV9ERUZBVUxUX0NPTk5fV0lORE9XCi0jZGVmaW5lIEJUTV9ERUZBVUxUX0NPTk5fV0lORE9XIDB4MDAxMgotI2VuZGlmCi0KLS8qIFNldHMgdGhlIFBhZ2VfU2Nhbl9BY3Rpdml0eTogIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0d28KLSAqIGNvbnNlY3V0aXZlIHBhZ2Ugc2NhbnMuICovCi0jaWZuZGVmIEJUTV9ERUZBVUxUX0NPTk5fSU5URVJWQUwKLSNkZWZpbmUgQlRNX0RFRkFVTFRfQ09OTl9JTlRFUlZBTCAweDA0MDAKLSNlbmRpZgotCi0vKiBXaGVuIGF1dG9tYXRpYyBpbnF1aXJ5IHNjYW4gaXMgZW5hYmxlZCwgdGhpcyBzZXRzIHRoZSBpbnF1aXJ5IHNjYW4gd2luZG93LiAqLwotI2lmbmRlZiBCVE1fREVGQVVMVF9ESVNDX1dJTkRPVwotI2RlZmluZSBCVE1fREVGQVVMVF9ESVNDX1dJTkRPVyAweDAwMTIKLSNlbmRpZgotCi0vKiBXaGVuIGF1dG9tYXRpYyBpbnF1aXJ5IHNjYW4gaXMgZW5hYmxlZCwgdGhpcyBzZXRzIHRoZSBpbnF1aXJ5IHNjYW4gaW50ZXJ2YWwuCi0gKi8KLSNpZm5kZWYgQlRNX0RFRkFVTFRfRElTQ19JTlRFUlZBTAotI2RlZmluZSBCVE1fREVGQVVMVF9ESVNDX0lOVEVSVkFMIDB4MDgwMAotI2VuZGlmCi0KLS8qIERlZmF1bHQgY2xhc3Mgb2YgZGV2aWNlCi0qIHtTRVJWSUNFX0NMQVNTLCBNQUpPUl9DTEFTUywgTUlOT1JfQ0xBU1N9Ci0qCi0qIFNFUlZJQ0VfQ0xBU1M6MHg1QSAoQml0MTcgLU5ldHdvcmtpbmcsQml0MTkgLSBDYXB0dXJpbmcsQml0MjAgLU9iamVjdAotKiBUcmFuc2ZlcixCaXQyMiAtVGVsZXBob255KQotKiBNQUpPUl9DTEFTUzoweDAyIC0gUEhPTkUKLSogTUlOT1JfQ0xBU1M6MHgwQyAtIFNNQVJUX1BIT05FCi0qCi0qLwotI2lmbmRlZiBCVEFfRE1fQ09ECi0jZGVmaW5lIEJUQV9ETV9DT0QgXAotICB7IDB4NUEsIDB4MDIsIDB4MEMgfQotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2YgU0NPIGxpbmtzLiAqLwotI2lmbmRlZiBCVE1fTUFYX1NDT19MSU5LUwotI2RlZmluZSBCVE1fTUFYX1NDT19MSU5LUyA2Ci0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBzZWN1cml0eSByZWNvcmRzIGZvciBwZWVyIGRldmljZXMuICovCi0jaWZuZGVmIEJUTV9TRUNfTUFYX0RFVklDRV9SRUNPUkRTCi0jZGVmaW5lIEJUTV9TRUNfTUFYX0RFVklDRV9SRUNPUkRTIDEwMAotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2Ygc2VjdXJpdHkgcmVjb3JkcyBmb3Igc2VydmljZXMuICovCi0jaWZuZGVmIEJUTV9TRUNfTUFYX1NFUlZJQ0VfUkVDT1JEUwotI2RlZmluZSBCVE1fU0VDX01BWF9TRVJWSUNFX1JFQ09SRFMgMzIKLSNlbmRpZgotCi0vKiBJZiBUcnVlLCBmb3JjZSBhIHJldHJpZXZhbCBvZiByZW1vdGUgZGV2aWNlIG5hbWUgZm9yIGVhY2ggYm9uZCBpbiBjYXNlIGl0J3MKLSAqIGNoYW5nZWQgKi8KLSNpZm5kZWYgQlRNX1NFQ19GT1JDRV9STlJfRk9SX0RCT05ECi0jZGVmaW5lIEJUTV9TRUNfRk9SQ0VfUk5SX0ZPUl9EQk9ORCBGQUxTRQotI2VuZGlmCi0KLS8qIE1heGltdW0gZGV2aWNlIG5hbWUgbGVuZ3RoIHVzZWQgaW4gYnRtIGRhdGFiYXNlLiAqLwotI2lmbmRlZiBCVE1fTUFYX1JFTV9CRF9OQU1FX0xFTgotI2RlZmluZSBCVE1fTUFYX1JFTV9CRF9OQU1FX0xFTiAyNDgKLSNlbmRpZgotCi0vKiBNYXhpbXVtIGxvY2FsIGRldmljZSBuYW1lIGxlbmd0aCBzdG9yZWQgYnRtIGRhdGFiYXNlICovCi0jaWZuZGVmIEJUTV9NQVhfTE9DX0JEX05BTUVfTEVOCi0jZGVmaW5lIEJUTV9NQVhfTE9DX0JEX05BTUVfTEVOIDI0OAotI2VuZGlmCi0KLS8qIEZpeGVkIERlZmF1bHQgU3RyaW5nLiBXaGVuIHRoaXMgaXMgZGVmaW5lZCBhcyBudWxsIHN0cmluZywgdGhlIGRldmljZSdzCi0gKiBwcm9kdWN0IG1vZGVsIG5hbWUgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBsb2NhbCBuYW1lLgotICovCi0jaWZuZGVmIEJUTV9ERUZfTE9DQUxfTkFNRQotI2RlZmluZSBCVE1fREVGX0xPQ0FMX05BTUUgIiIKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHNlcnZpY2UgbmFtZSBzdG9yZWQgd2l0aCBzZWN1cml0eSBhdXRob3JpemF0aW9uICgwIGlmIG5vdCBuZWVkZWQpICovCi0jaWZuZGVmIEJUTV9TRUNfU0VSVklDRV9OQU1FX0xFTgotI2RlZmluZSBCVE1fU0VDX1NFUlZJQ0VfTkFNRV9MRU4gQlRfTUFYX1NFUlZJQ0VfTkFNRV9MRU4KLSNlbmRpZgotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2VydmljZSBuYW1lLiAqLwotI2lmbmRlZiBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTgotI2RlZmluZSBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTiAyMQotI2VuZGlmCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnRzIHRoYXQgY2FuIHJlZ2lzdGVyIHdpdGggdGhlIHBvd2VyIG1hbmFnZXIuICovCi0jaWZuZGVmIEJUTV9NQVhfUE1fUkVDT1JEUwotI2RlZmluZSBCVE1fTUFYX1BNX1JFQ09SRFMgMgotI2VuZGlmCi0KLS8qIElmIHRoZSB1c2VyIGRvZXMgbm90IHJlc3BvbmQgdG8gc2VjdXJpdHkgcHJvY2VzcyByZXF1ZXN0cyB3aXRoaW4gdGhpcyBtYW55Ci0gKiBzZWNvbmRzLCBhIG5lZ2F0aXZlIHJlc3BvbnNlIHdvdWxkIGJlIHNlbnQgYXV0b21hdGljYWxseS4KLSAqIDMwIGlzIExNUCByZXNwb25zZSB0aW1lb3V0IHZhbHVlICovCi0jaWZuZGVmIEJUTV9TRUNfVElNRU9VVF9WQUxVRQotI2RlZmluZSBCVE1fU0VDX1RJTUVPVVRfVkFMVUUgMzUKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCB1c2luZwotICogQlRNX1JlZ2lzdGVyRm9yVlNFdmVudHMgKi8KLSNpZm5kZWYgQlRNX01BWF9WU0VfQ0FMTEJBQ0tTCi0jZGVmaW5lIEJUTV9NQVhfVlNFX0NBTExCQUNLUyAzCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgTGlzYm9uIEZlYXR1cmVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhpcyBpcyBzZXQgdG8gVFJVRSBpZiB0aGUgRkVDIGlzIHJlcXVpcmVkIGZvciBFSVIgcGFja2V0LiAqLwotI2lmbmRlZiBCVE1fRUlSX0RFRkFVTFRfRkVDX1JFUVVJUkVECi0jZGVmaW5lIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQgVFJVRQotI2VuZGlmCi0KLS8qIFRoZSBJTyBjYXBhYmlsaXR5IG9mIHRoZSBsb2NhbCBkZXZpY2UgKGZvciBTaW1wbGUgUGFpcmluZykgKi8KLSNpZm5kZWYgQlRNX0xPQ0FMX0lPX0NBUFMKLSNkZWZpbmUgQlRNX0xPQ0FMX0lPX0NBUFMgQlRNX0lPX0NBUF9JTwotI2VuZGlmCi0KLSNpZm5kZWYgQlRNX0xPQ0FMX0lPX0NBUFNfQkxFCi0jZGVmaW5lIEJUTV9MT0NBTF9JT19DQVBTX0JMRSBCVE1fSU9fQ0FQX0tCRElTUAotI2VuZGlmCi0KLS8qIFRSVUUgdG8gaW5jbHVkZSBTbmlmZiBTdWJyYXRpbmcgKi8KLSNpZm5kZWYgQlRNX1NTUl9JTkNMVURFRAotI2RlZmluZSBCVE1fU1NSX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRW5kIG9mIExpc2JvbiBGZWF0dXJlcwotICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDQuMS80LjIgc2VjdXJlIGNvbm5lY3Rpb25zIGZlYXR1cmUgKi8KLSNpZm5kZWYgU0NfTU9ERV9JTkNMVURFRAotI2RlZmluZSBTQ19NT0RFX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0vKiBVc2VkIGZvciBjb25mb3JtYW5jZSB0ZXN0aW5nIE9OTFkgKi8KLSNpZm5kZWYgQlRNX0JMRV9DT05GT1JNQU5DRV9URVNUSU5HCi0jZGVmaW5lIEJUTV9CTEVfQ09ORk9STUFOQ0VfVEVTVElORyBGQUxTRQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBMMkNBUAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBsaW5rcyB0aGF0IEwyQ0FQIGNhbiBzdXBwb3J0LiAqLwotI2lmbmRlZiBNQVhfQUNMX0NPTk5FQ1RJT05TCi0jZGVmaW5lIE1BWF9MMkNBUF9MSU5LUyAxMwotI2Vsc2UKLSNkZWZpbmUgTUFYX0wyQ0FQX0xJTktTIE1BWF9BQ0xfQ09OTkVDVElPTlMKLSNlbmRpZgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGNoYW5uZWxzIHRoYXQgTDJDQVAgY2FuIHN1cHBvcnQuICovCi0jaWZuZGVmIE1BWF9MMkNBUF9DSEFOTkVMUwotI2RlZmluZSBNQVhfTDJDQVBfQ0hBTk5FTFMgMzIKLSNlbmRpZgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiByZWdpc3RlciB3aXRoIEwyQ0FQLgotICovCi0jaWZuZGVmIE1BWF9MMkNBUF9DTElFTlRTCi0jZGVmaW5lIE1BWF9MMkNBUF9DTElFTlRTIDE1Ci0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIGxpbmsgaW5hY3Rpdml0eSBiZWZvcmUgYSBsaW5rIGlzIGRpc2Nvbm5lY3RlZC4gKi8KLSNpZm5kZWYgTDJDQVBfTElOS19JTkFDVElWSVRZX1RPVVQKLSNkZWZpbmUgTDJDQVBfTElOS19JTkFDVElWSVRZX1RPVVQgNAotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiBsaW5rIGluYWN0aXZpdHkgYWZ0ZXIgYm9uZGluZyBiZWZvcmUgYSBsaW5rIGlzCi0gKiBkaXNjb25uZWN0ZWQuICovCi0jaWZuZGVmIEwyQ0FQX0JPTkRJTkdfVElNRU9VVAotI2RlZmluZSBMMkNBUF9CT05ESU5HX1RJTUVPVVQgMwotI2VuZGlmCi0KLS8qIFRoZSB0aW1lIGZyb20gdGhlIEhDSSBjb25uZWN0aW9uIGNvbXBsZXRlIHRvIGRpc2Nvbm5lY3QgaWYgbm8gY2hhbm5lbCBpcwotICogZXN0YWJsaXNoZWQuICovCi0jaWZuZGVmIEwyQ0FQX0xJTktfU1RBUlRVUF9UT1VUCi0jZGVmaW5lIEwyQ0FQX0xJTktfU1RBUlRVUF9UT1VUIDYwCi0jZW5kaWYKLQotLyogVGhlIEwyQ0FQIE1UVTsgbXVzdCBiZSBpbiBhY2NvcmQgd2l0aCB0aGUgSENJIEFDTCBidWZmZXIgc2l6ZS4gKi8KLSNpZm5kZWYgTDJDQVBfTVRVX1NJWkUKLSNkZWZpbmUgTDJDQVBfTVRVX1NJWkUgMTY5MQotI2VuZGlmCi0KLS8qCi0gKiBUaGUgTDJDQVAgTVBTIG92ZXIgQmx1ZXRvb3RoOyBtdXN0IGJlIGluIGFjY29yZCB3aXRoIHRoZSBGQ1IgdHggYnVmZmVyIHNpemUKLSAqIGFuZCBBQ0wgZG93biBidWZmZXIgc2l6ZS4KLSAqLwotI2lmbmRlZiBMMkNBUF9NUFNfT1ZFUl9CUl9FRFIKLSNkZWZpbmUgTDJDQVBfTVBTX09WRVJfQlJfRURSIDEwMTAKLSNlbmRpZgotCi0vKiBJZiBob3N0IGZsb3cgY29udHJvbCBlbmFibGVkLCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGUgY29udHJvbGxlcgotICogY2FuIGhhdmUgdW5hY2tub3dsZWRnZWQuICovCi0jaWZuZGVmIEwyQ0FQX0hPU1RfRkNfQUNMX0JVRlMKLSNkZWZpbmUgTDJDQVBfSE9TVF9GQ19BQ0xfQlVGUyAyMAotI2VuZGlmCi0KLS8qIFRoaXMgaXMgc2V0IHRvIGVuYWJsZSBMMkNBUCB0byAgdGFrZSB0aGUgQUNMIGxpbmsgb3V0IG9mIHBhcmsgbW9kZSB3aGVuIEFDTAotICogZGF0YSBpcyB0byBiZSBzZW50LiAqLwotI2lmbmRlZiBMMkNBUF9XQUtFX1BBUktFRF9MSU5LCi0jZGVmaW5lIEwyQ0FQX1dBS0VfUEFSS0VEX0xJTksgVFJVRQotI2VuZGlmCi0KLS8qIE1pbmltdW0gbnVtYmVyIG9mIEFDTCBjcmVkaXQgZm9yIGhpZ2ggcHJpb3JpdHkgbGluayAqLwotI2lmbmRlZiBMMkNBUF9ISUdIX1BSSV9NSU5fWE1JVF9RVU9UQQotI2RlZmluZSBMMkNBUF9ISUdIX1BSSV9NSU5fWE1JVF9RVU9UQSA1Ci0jZW5kaWYKLQotLyogdXNlZCBmb3IgbW9uaXRvcmluZyBIQ0kgQUNMIGNyZWRpdCBtYW5hZ2VtZW50ICovCi0jaWZuZGVmIEwyQ0FQX0hDSV9GTE9XX0NPTlRST0xfREVCVUcKLSNkZWZpbmUgTDJDQVBfSENJX0ZMT1dfQ09OVFJPTF9ERUJVRyBUUlVFCi0jZW5kaWYKLQotLyogVXNlZCBmb3IgZmVhdHVyZXMgdXNpbmcgZml4ZWQgY2hhbm5lbHM7IHNldCB0byB6ZXJvIGlmIG5vIGZpeGVkIGNoYW5uZWxzCi0gKiBzdXBwb3J0ZWQgKEJMRSwgZXRjLikgKi8KLS8qIEV4Y2x1ZGluZyBMMkNBUCBzaWduYWxpbmcgY2hhbm5lbCBhbmQgVUNEICovCi0jaWZuZGVmIEwyQ0FQX05VTV9GSVhFRF9DSE5MUwotI2RlZmluZSBMMkNBUF9OVU1fRklYRURfQ0hOTFMgMzIKLSNlbmRpZgotCi0vKiBGaXJzdCBmaXhlZCBjaGFubmVsIHN1cHBvcnRlZCAqLwotI2lmbmRlZiBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MCi0jZGVmaW5lIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwgNAotI2VuZGlmCi0KLSNpZm5kZWYgTDJDQVBfTEFTVF9GSVhFRF9DSE5MCi0jZGVmaW5lIEwyQ0FQX0xBU1RfRklYRURfQ0hOTCBcCi0gIChMMkNBUF9GSVJTVF9GSVhFRF9DSE5MICsgTDJDQVBfTlVNX0ZJWEVEX0NITkxTIC0gMSkKLSNlbmRpZgotCi0vKiBSb3VuZCBSb2JpbiBzZXJ2aWNlIGNoYW5uZWxzIGluIGxpbmsgKi8KLSNpZm5kZWYgTDJDQVBfUk9VTkRfUk9CSU5fQ0hBTk5FTF9TRVJWSUNFCi0jZGVmaW5lIEwyQ0FQX1JPVU5EX1JPQklOX0NIQU5ORUxfU0VSVklDRSBUUlVFCi0jZW5kaWYKLQotLyogVXNlZCBmb3IgY29uZm9ybWFuY2UgdGVzdGluZyBPTkxZOiAgV2hlbiBUUlVFIGxldHMgc2NyaXB0d3JhcHBlciBvdmVyd3JpdGUKLSAqIGluZm8gcmVzcG9uc2UgKi8KLSNpZm5kZWYgTDJDQVBfQ09ORk9STUFOQ0VfVEVTVElORwotI2RlZmluZSBMMkNBUF9DT05GT1JNQU5DRV9URVNUSU5HIEZBTFNFCi0jZW5kaWYKLQotLyoKLSAqIE1heCBieXRlcyBwZXIgY29ubmVjdGlvbiB0byBidWZmZXIgbG9jYWxseSBiZWZvcmUgZHJvcHBpbmcgdGhlCi0gKiBjb25uZWN0aW9uIGlmIGxvY2FsIGNsaWVudCBkb2VzIG5vdCByZWNlaXZlIGl0ICAtIGRlZmF1bHQgaXMgMU1CCi0gKi8KLSNpZm5kZWYgTDJDQVBfTUFYX1JYX0JVRkZFUgotI2RlZmluZSBMMkNBUF9NQVhfUlhfQlVGRkVSIDB4MTAwMDAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEJMRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBMT0NBTF9CTEVfQ09OVFJPTExFUl9JRAotI2RlZmluZSBMT0NBTF9CTEVfQ09OVFJPTExFUl9JRCAxCi0jZW5kaWYKLQotLyoKLSAqIFRvZ2dsZXMgc3VwcG9ydCBmb3IgZ2VuZXJhbCBMRSBwcml2YWN5IGZlYXR1cmVzIHN1Y2ggYXMgcmVtb3RlIGFkZHJlc3MKLSAqIHJlc29sdXRpb24sIGxvY2FsIGFkZHJlc3Mgcm90YXRpb24gZXRjLgotICovCi0jaWZuZGVmIEJMRV9QUklWQUNZX1NQVAotI2RlZmluZSBCTEVfUFJJVkFDWV9TUFQgVFJVRQotI2VuZGlmCi0KLS8qCi0gKiBFbmFibGVzIG9yIGRpc2FibGVzIHN1cHBvcnQgZm9yIGxvY2FsIHByaXZhY3kgKGV4LiBhZGRyZXNzIHJvdGF0aW9uKQotICovCi0jaWZuZGVmIEJMRV9MT0NBTF9QUklWQUNZX0VOQUJMRUQKLSNkZWZpbmUgQkxFX0xPQ0FMX1BSSVZBQ1lfRU5BQkxFRCBUUlVFCi0jZW5kaWYKLQotLyoKLSAqIFRvZ2dsZXMgc3VwcG9ydCBmb3IgdmVuZG9yIHNwZWNpZmljIGV4dGVuc2lvbnMgc3VjaCBhcyBSUEEgb2ZmbG9hZGluZywKLSAqIGZlYXR1cmUgZGlzY292ZXJ5LCBtdWx0aS1hZHYgZXRjLgotICovCi0jaWZuZGVmIEJMRV9WTkRfSU5DTFVERUQKLSNkZWZpbmUgQkxFX1ZORF9JTkNMVURFRCBGQUxTRQotI2VuZGlmCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgYXBwbGljYXRpb25zIHRoYXQgY2FuIHJlZ2lzdGVyIHdpdGggTEUKLSAqIEwyQ0FQLiAqLwotI2lmbmRlZiBCTEVfTUFYX0wyQ0FQX0NMSUVOVFMKLSNkZWZpbmUgQkxFX01BWF9MMkNBUF9DTElFTlRTIDE1Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFUVC9HQVRUIFByb3RvY29sL1Byb2ZpbGUgU2V0dGluZ3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEdBVFRfTUFYX1NSX1BST0ZJTEVTCi0jZGVmaW5lIEdBVFRfTUFYX1NSX1BST0ZJTEVTIDMyIC8qIG1heCBpcyAzMiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgR0FUVF9NQVhfQVBQUwotI2RlZmluZSBHQVRUX01BWF9BUFBTIDMyIC8qIG5vdGU6IDIgYXBwcyB1c2VkIGludGVybmFsbHkgR0FUVCBhbmQgR0FQICovCi0jZW5kaWYKLQotLyogY29ubmVjdGlvbiBtYW5hZ2VyIGRvZXNuJ3QgZ2VuZXJhdGUgaXQncyBvd24gSURzLiBJbnN0ZWFkLCBhbGwgR0FUVCBjbGllbnRzCi0gKiB1c2UgdGhlaXIgZ2F0dF9pZiB0byBpZGVudGlmeSBhZ2FpbnN0IGNvbmVjdGlvbiBtYW5hZ2VyLiBXaGVuIHN0YWNrIHRyaWVzIHRvCi0gKiBjcmVhdGUgbDJjYXAgY29ubmVjdGlvbiwgaXQgd2lsbCB1c2UgdGhpcyBmaXhlZCBJRC4gKi8KLSNkZWZpbmUgQ09OTl9NR1JfSURfTDJDQVAgKEdBVFRfTUFYX0FQUFMgKyAxMCkKLQotI2lmbmRlZiBHQVRUX01BWF9QSFlfQ0hBTk5FTAotI2RlZmluZSBHQVRUX01BWF9QSFlfQ0hBTk5FTCA3Ci0jZW5kaWYKLQotLyogVXNlZCBmb3IgY29uZm9ybWFuY2UgdGVzdGluZyBPTkxZICovCi0jaWZuZGVmIEdBVFRfQ09ORk9STUFOQ0VfVEVTVElORwotI2RlZmluZSBHQVRUX0NPTkZPUk1BTkNFX1RFU1RJTkcgRkFMU0UKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogU01QCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBTTVBfREVCVUcKLSNkZWZpbmUgU01QX0RFQlVHIEZBTFNFCi0jZW5kaWYKLQotI2lmbmRlZiBTTVBfREVGQVVMVF9BVVRIX1JFUQotI2RlZmluZSBTTVBfREVGQVVMVF9BVVRIX1JFUSBTTVBfQVVUSF9OQl9FTkNfT05MWQotI2VuZGlmCi0KLSNpZm5kZWYgU01QX01BWF9FTkNfS0VZX1NJWkUKLSNkZWZpbmUgU01QX01BWF9FTkNfS0VZX1NJWkUgMTYKLSNlbmRpZgotCi0vKiBtaW5pbXVtIGxpbmsgdGltZW91dCBhZnRlciBTTVAgcGFpcmluZyBpcyBkb25lLCBsZWF2ZSByb29tIGZvciBrZXkgZXhjaGFuZ2UKLSAgIGFuZCByYWNpbmcgY29uZGl0aW9uIGZvciB0aGUgZm9sbG93aW5nIHNlcnZpY2UgY29ubmVjdGlvbi4KLSAgIFByZWZlciBncmVhdGVyIHRoYW4gMCBzZWNvbmQsIGFuZCBubyBsZXNzIHRoYW4gZGVmYXVsdCBpbmFjdGl2aXR5IGxpbmsgaWRsZQotICAgdGltZXIoTDJDQVBfTElOS19JTkFDVElWSVRZX1RPVVQpIGluIGwyY2FwKSAqLwotI2lmbmRlZiBTTVBfTElOS19UT1VUX01JTgotI2lmIChMMkNBUF9MSU5LX0lOQUNUSVZJVFlfVE9VVCA+IDApCi0jZGVmaW5lIFNNUF9MSU5LX1RPVVRfTUlOIEwyQ0FQX0xJTktfSU5BQ1RJVklUWV9UT1VUCi0jZWxzZQotI2RlZmluZSBTTVBfTElOS19UT1VUX01JTiAyCi0jZW5kaWYKLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFNEUAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIFNEUCByZWNvcmRzIHRoZSBzZXJ2ZXIgY2FuIHN1cHBvcnQuICovCi0jaWZuZGVmIFNEUF9NQVhfUkVDT1JEUwotI2RlZmluZSBTRFBfTUFYX1JFQ09SRFMgMzAKLSNlbmRpZgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0cmlidXRlcyBpbiBlYWNoIHJlY29yZC4gKi8KLSNpZm5kZWYgU0RQX01BWF9SRUNfQVRUUgotI2RlZmluZSBTRFBfTUFYX1JFQ19BVFRSIDI1Ci0jZW5kaWYKLQotI2lmbmRlZiBTRFBfTUFYX1BBRF9MRU4KLSNkZWZpbmUgU0RQX01BWF9QQURfTEVOIDYwMAotI2VuZGlmCi0KLS8qIFRoZSBtYXhpbXVtIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIGFuIGF0dHJpYnV0ZS4gKi8KLSNpZm5kZWYgU0RQX01BWF9BVFRSX0xFTgotI2RlZmluZSBTRFBfTUFYX0FUVFJfTEVOIDQwMAotI2VuZGlmCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRyaWJ1dGUgZmlsdGVycyBzdXBwb3J0ZWQgYnkgU0RQIGRhdGFiYXNlcy4gKi8KLSNpZm5kZWYgU0RQX01BWF9BVFRSX0ZJTFRFUlMKLSNkZWZpbmUgU0RQX01BWF9BVFRSX0ZJTFRFUlMgMTUKLSNlbmRpZgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgVVVJRCBmaWx0ZXJzIHN1cHBvcnRlZCBieSBTRFAgZGF0YWJhc2VzLiAqLwotI2lmbmRlZiBTRFBfTUFYX1VVSURfRklMVEVSUwotI2RlZmluZSBTRFBfTUFYX1VVSURfRklMVEVSUyAzCi0jZW5kaWYKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZCBoYW5kbGVzIHJldHJpZXZlZCBpbiBhIHNlYXJjaC4gKi8KLSNpZm5kZWYgU0RQX01BWF9ESVNDX1NFUlZFUl9SRUNTCi0jZGVmaW5lIFNEUF9NQVhfRElTQ19TRVJWRVJfUkVDUyAyMQotI2VuZGlmCi0KLS8qIFRoZSBzaXplIG9mIGEgc2NyYXRjaHBhZCBidWZmZXIsIGluIGJ5dGVzLCBmb3Igc3RvcmluZyB0aGUgcmVzcG9uc2UgdG8gYW4KLSAqIGF0dHJpYnV0ZSByZXF1ZXN0LiAqLwotI2lmbmRlZiBTRFBfTUFYX0xJU1RfQllURV9DT1VOVAotI2RlZmluZSBTRFBfTUFYX0xJU1RfQllURV9DT1VOVCA0MDk2Ci0jZW5kaWYKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gYW4gU0RQIHByb3RvY29sIGVsZW1lbnQuICovCi0jaWZuZGVmIFNEUF9NQVhfUFJPVE9DT0xfUEFSQU1TCi0jZGVmaW5lIFNEUF9NQVhfUFJPVE9DT0xfUEFSQU1TIDIKLSNlbmRpZgotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGNsaWVudCBhbmQgc2VydmVyIGNvbm5lY3Rpb25zLiAqLwotI2lmbmRlZiBTRFBfTUFYX0NPTk5FQ1RJT05TCi0jZGVmaW5lIFNEUF9NQVhfQ09OTkVDVElPTlMgNAotI2VuZGlmCi0KLS8qIFRoZSBNVFUgc2l6ZSBmb3IgdGhlIEwyQ0FQIGNvbmZpZ3VyYXRpb24uICovCi0jaWZuZGVmIFNEUF9NVFVfU0laRQotI2RlZmluZSBTRFBfTVRVX1NJWkUgMTAyNAotI2VuZGlmCi0KLS8qIFRoZSBuYW1lIGZvciBzZWN1cml0eSBhdXRob3JpemF0aW9uLiAqLwotI2lmbmRlZiBTRFBfU0VSVklDRV9OQU1FCi0jZGVmaW5lIFNEUF9TRVJWSUNFX05BTUUgIlNlcnZpY2UgRGlzY292ZXJ5IgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSRkNPTU0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyBzdXBwb3J0ZWQuICovCi0jaWZuZGVmIE1BWF9SRkNfUE9SVFMKLSNkZWZpbmUgTUFYX1JGQ19QT1JUUyAzMAotI2VuZGlmCi0KLS8qIFRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBsaW5rcyB0byBkaWZmZXJlbnQgZGV2aWNlcy4gKi8KLSNpZm5kZWYgTUFYX0FDTF9DT05ORUNUSU9OUwotI2RlZmluZSBNQVhfQkRfQ09OTkVDVElPTlMgNwotI2Vsc2UKLSNkZWZpbmUgTUFYX0JEX0NPTk5FQ1RJT05TIE1BWF9BQ0xfQ09OTkVDVElPTlMKLSNlbmRpZgotCi0vKiBUaGUgcG9ydCByZWNlaXZlIHF1ZXVlIGxvdyB3YXRlcm1hcmsgbGV2ZWwsIGluIGJ5dGVzLiAqLwotI2lmbmRlZiBQT1JUX1JYX0xPV19XTQotI2RlZmluZSBQT1JUX1JYX0xPV19XTSAoQlRBX1JGQ19NVFVfU0laRSAqIFBPUlRfUlhfQlVGX0xPV19XTSkKLSNlbmRpZgotCi0vKiBUaGUgcG9ydCByZWNlaXZlIHF1ZXVlIGhpZ2ggd2F0ZXJtYXJrIGxldmVsLCBpbiBieXRlcy4gKi8KLSNpZm5kZWYgUE9SVF9SWF9ISUdIX1dNCi0jZGVmaW5lIFBPUlRfUlhfSElHSF9XTSAoQlRBX1JGQ19NVFVfU0laRSAqIFBPUlRfUlhfQlVGX0hJR0hfV00pCi0jZW5kaWYKLQotLyogVGhlIHBvcnQgcmVjZWl2ZSBxdWV1ZSBjcml0aWNhbCB3YXRlcm1hcmsgbGV2ZWwsIGluIGJ5dGVzLiAqLwotI2lmbmRlZiBQT1JUX1JYX0NSSVRJQ0FMX1dNCi0jZGVmaW5lIFBPUlRfUlhfQ1JJVElDQUxfV00gKEJUQV9SRkNfTVRVX1NJWkUgKiBQT1JUX1JYX0JVRl9DUklUSUNBTF9XTSkKLSNlbmRpZgotCi0vKiBUaGUgcG9ydCByZWNlaXZlIHF1ZXVlIGxvdyB3YXRlcm1hcmsgbGV2ZWwsIGluIG51bWJlciBvZiBidWZmZXJzLiAqLwotI2lmbmRlZiBQT1JUX1JYX0JVRl9MT1dfV00KLSNkZWZpbmUgUE9SVF9SWF9CVUZfTE9XX1dNIDQKLSNlbmRpZgotCi0vKiBUaGUgcG9ydCByZWNlaXZlIHF1ZXVlIGhpZ2ggd2F0ZXJtYXJrIGxldmVsLCBpbiBudW1iZXIgb2YgYnVmZmVycy4gKi8KLSNpZm5kZWYgUE9SVF9SWF9CVUZfSElHSF9XTQotI2RlZmluZSBQT1JUX1JYX0JVRl9ISUdIX1dNIDEwCi0jZW5kaWYKLQotLyogVGhlIHBvcnQgcmVjZWl2ZSBxdWV1ZSBjcml0aWNhbCB3YXRlcm1hcmsgbGV2ZWwsIGluIG51bWJlciBvZiBidWZmZXJzLiAqLwotI2lmbmRlZiBQT1JUX1JYX0JVRl9DUklUSUNBTF9XTQotI2RlZmluZSBQT1JUX1JYX0JVRl9DUklUSUNBTF9XTSAxNQotI2VuZGlmCi0KLS8qIFRoZSBwb3J0IHRyYW5zbWl0IHF1ZXVlIGhpZ2ggd2F0ZXJtYXJrIGxldmVsLCBpbiBieXRlcy4gKi8KLSNpZm5kZWYgUE9SVF9UWF9ISUdIX1dNCi0jZGVmaW5lIFBPUlRfVFhfSElHSF9XTSAoQlRBX1JGQ19NVFVfU0laRSAqIFBPUlRfVFhfQlVGX0hJR0hfV00pCi0jZW5kaWYKLQotLyogVGhlIHBvcnQgdHJhbnNtaXQgcXVldWUgY3JpdGljYWwgd2F0ZXJtYXJrIGxldmVsLCBpbiBieXRlcy4gKi8KLSNpZm5kZWYgUE9SVF9UWF9DUklUSUNBTF9XTQotI2RlZmluZSBQT1JUX1RYX0NSSVRJQ0FMX1dNIChCVEFfUkZDX01UVV9TSVpFICogUE9SVF9UWF9CVUZfQ1JJVElDQUxfV00pCi0jZW5kaWYKLQotLyogVGhlIHBvcnQgdHJhbnNtaXQgcXVldWUgaGlnaCB3YXRlcm1hcmsgbGV2ZWwsIGluIG51bWJlciBvZiBidWZmZXJzLiAqLwotI2lmbmRlZiBQT1JUX1RYX0JVRl9ISUdIX1dNCi0jZGVmaW5lIFBPUlRfVFhfQlVGX0hJR0hfV00gMTAKLSNlbmRpZgotCi0vKiBUaGUgcG9ydCB0cmFuc21pdCBxdWV1ZSBoaWdoIHdhdGVybWFyayBsZXZlbCwgaW4gbnVtYmVyIG9mIGJ1ZmZlcnMuICovCi0jaWZuZGVmIFBPUlRfVFhfQlVGX0NSSVRJQ0FMX1dNCi0jZGVmaW5lIFBPUlRfVFhfQlVGX0NSSVRJQ0FMX1dNIDE1Ci0jZW5kaWYKLQotLyogVGhlIFJGQ09NTSBtdWx0aXBsZXhlciBwcmVmZXJyZWQgZmxvdyBjb250cm9sIG1lY2hhbmlzbS4gKi8KLSNpZm5kZWYgUE9SVF9GQ19ERUZBVUxUCi0jZGVmaW5lIFBPUlRfRkNfREVGQVVMVCBQT1JUX0ZDX0NSRURJVAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBCTkVQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJORVBfSU5DTFVERUQKLSNkZWZpbmUgQk5FUF9JTkNMVURFRCBUUlVFCi0jZW5kaWYKLQotLyogQk5FUCBzdGF0dXMgQVBJIGNhbGwgaXMgdXNlZCBtYWlubHkgdG8gZ2V0IHRoZSBMMkNBUCBoYW5kbGUgKi8KLSNpZm5kZWYgQk5FUF9TVVBQT1JUU19TVEFUVVNfQVBJCi0jZGVmaW5lIEJORVBfU1VQUE9SVFNfU1RBVFVTX0FQSSBUUlVFCi0jZW5kaWYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgcHJvdG9jb2wgZmlsdGVycyBzdXBwb3J0ZWQuICovCi0jaWZuZGVmIEJORVBfTUFYX1BST1RfRklMVEVSUwotI2RlZmluZSBCTkVQX01BWF9QUk9UX0ZJTFRFUlMgNQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBmaWx0ZXJzIHN1cHBvcnRlZC4gKi8KLSNpZm5kZWYgQk5FUF9NQVhfTVVMVElfRklMVEVSUwotI2RlZmluZSBCTkVQX01BWF9NVUxUSV9GSUxURVJTIDUKLSNlbmRpZgotCi0vKiBQcmVmZXJyZWQgTVRVIHNpemUuICovCi0jaWZuZGVmIEJORVBfTVRVX1NJWkUKLSNkZWZpbmUgQk5FUF9NVFVfU0laRSBMMkNBUF9NVFVfU0laRQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb3dlZCBpbiB0cmFuc21pdCBkYXRhIHF1ZXVlLiAqLwotI2lmbmRlZiBCTkVQX01BWF9YTUlUUV9ERVBUSAotI2RlZmluZSBCTkVQX01BWF9YTUlUUV9ERVBUSCAyMAotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIEJORVAgb2YgY29ubmVjdGlvbnMgc3VwcG9ydGVkLiAqLwotI2lmbmRlZiBCTkVQX01BWF9DT05ORUNUSU9OUwotI2RlZmluZSBCTkVQX01BWF9DT05ORUNUSU9OUyA3Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFWRFRQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGxpbmtzIHRvIGRpZmZlcmVudCBwZWVyIGRldmljZXMuICovCi0jaWZuZGVmIEFWRFRfTlVNX0xJTktTCi0jZGVmaW5lIEFWRFRfTlVNX0xJTktTIDYKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHN0cmVhbSBlbmRwb2ludHMuICovCi0jaWZuZGVmIEFWRFRfTlVNX1NFUFMKLSNkZWZpbmUgQVZEVF9OVU1fU0VQUyA2Ci0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHRyYW5zcG9ydCBjaGFubmVscyBzZXR1cCBieSBBVkRUIGZvciBhbGwgbWVkaWEgc3RyZWFtcyAqLwotI2lmbmRlZiBBVkRUX05VTV9UQ19UQkwKLSNkZWZpbmUgQVZEVF9OVU1fVENfVEJMIChBVkRUX05VTV9TRVBTICsgQVZEVF9OVU1fTElOS1MpCi0jZW5kaWYKLQotLyogTWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjb250ZW50IHByb3RlY3Rpb24gaW5mb3JtYXRpb24gZWxlbWVudC4gKi8KLSNpZm5kZWYgQVZEVF9QUk9URUNUX1NJWkUKLSNkZWZpbmUgQVZEVF9QUk9URUNUX1NJWkUgOTAKLSNlbmRpZgotCi0vKiBEZWZhdWx0IHNpbmsgZGVsYXkgdmFsdWUgaW4gbXMuICovCi0jaWZuZGVmIEFWRFRfU0lOS19ERUxBWV9NUwotI2RlZmluZSBBVkRUX1NJTktfREVMQVlfTVMgMzAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFBBTgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBQQU5fSU5DTFVERUQKLSNkZWZpbmUgUEFOX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0jaWZuZGVmIFBBTl9OQVBfRElTQUJMRUQKLSNkZWZpbmUgUEFOX05BUF9ESVNBQkxFRCBGQUxTRQotI2VuZGlmCi0KLSNpZm5kZWYgUEFOVV9ESVNBQkxFRAotI2RlZmluZSBQQU5VX0RJU0FCTEVEIEZBTFNFCi0jZW5kaWYKLQotLyogVGhpcyB3aWxsIGVuYWJsZSB0aGUgUEFOVSByb2xlICovCi0jaWZuZGVmIFBBTl9TVVBQT1JUU19ST0xFX1BBTlUKLSNkZWZpbmUgUEFOX1NVUFBPUlRTX1JPTEVfUEFOVSBUUlVFCi0jZW5kaWYKLQotLyogVGhpcyB3aWxsIGVuYWJsZSB0aGUgTkFQIHJvbGUgKi8KLSNpZm5kZWYgUEFOX1NVUFBPUlRTX1JPTEVfTkFQCi0jZGVmaW5lIFBBTl9TVVBQT1JUU19ST0xFX05BUCBUUlVFCi0jZW5kaWYKLQotLyogVGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KLSNpZm5kZWYgUEFOX1NVUFBPUlRTX0RFQlVHX0RVTVAKLSNkZWZpbmUgUEFOX1NVUFBPUlRTX0RFQlVHX0RVTVAgVFJVRQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIFBBTiBjb25uZWN0aW9ucyBhbGxvd2VkICovCi0jaWZuZGVmIE1BWF9QQU5fQ09OTlMKLSNkZWZpbmUgTUFYX1BBTl9DT05OUyA3Ci0jZW5kaWYKLQotLyogRGVmYXVsdCBzZXJ2aWNlIG5hbWUgZm9yIE5BUCByb2xlICovCi0jaWZuZGVmIFBBTl9OQVBfREVGQVVMVF9TRVJWSUNFX05BTUUKLSNkZWZpbmUgUEFOX05BUF9ERUZBVUxUX1NFUlZJQ0VfTkFNRSAiTmV0d29yayBBY2Nlc3MgUG9pbnQgU2VydmljZSIKLSNlbmRpZgotCi0vKiBEZWZhdWx0IHNlcnZpY2UgbmFtZSBmb3IgUEFOVSByb2xlICovCi0jaWZuZGVmIFBBTl9QQU5VX0RFRkFVTFRfU0VSVklDRV9OQU1FCi0jZGVmaW5lIFBBTl9QQU5VX0RFRkFVTFRfU0VSVklDRV9OQU1FICJQQU4gVXNlciBTZXJ2aWNlIgotI2VuZGlmCi0KLS8qIERlZmF1bHQgZGVzY3JpcHRpb24gZm9yIE5BUCByb2xlIHNlcnZpY2UgKi8KLSNpZm5kZWYgUEFOX05BUF9ERUZBVUxUX0RFU0NSSVBUSU9OCi0jZGVmaW5lIFBBTl9OQVBfREVGQVVMVF9ERVNDUklQVElPTiAiTkFQIgotI2VuZGlmCi0KLS8qIERlZmF1bHQgZGVzY3JpcHRpb24gZm9yIFBBTlUgcm9sZSBzZXJ2aWNlICovCi0jaWZuZGVmIFBBTl9QQU5VX0RFRkFVTFRfREVTQ1JJUFRJT04KLSNkZWZpbmUgUEFOX1BBTlVfREVGQVVMVF9ERVNDUklQVElPTiAiUEFOVSIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR0FQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEdBUF9JTkNMVURFRAotI2RlZmluZSBHQVBfSU5DTFVERUQgVFJVRQotI2VuZGlmCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgR0FQIEwyQ0FQIGNvbm5lY3Rpb25zLiAqLwotI2lmbmRlZiBHQVBfTUFYX0NPTk5FQ1RJT05TCi0jZGVmaW5lIEdBUF9NQVhfQ09OTkVDVElPTlMgMzAKLSNlbmRpZgotCi0vKiBrZWVwIHRoZSByYXcgZGF0YSByZWNlaXZlZCBmcm9tIFNEUCBzZXJ2ZXIgaW4gZGF0YWJhc2UuICovCi0jaWZuZGVmIFNEUF9SQVdfREFUQV9JTkNMVURFRAotI2RlZmluZSBTRFBfUkFXX0RBVEFfSU5DTFVERUQgVFJVRQotI2VuZGlmCi0KLS8qIElucXVpcnkgZHVyYXRpb24gaW4gMS4yOCBzZWNvbmQgdW5pdHMuICovCi0jaWZuZGVmIFNEUF9ERUJVRwotI2RlZmluZSBTRFBfREVCVUcgVFJVRQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBISUQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEhJRCBEZXZpY2UgUm9sZSBJbmNsdWRlZCAqLwotI2lmbmRlZiBISURfREVWX0lOQ0xVREVECi0jZGVmaW5lIEhJRF9ERVZfSU5DTFVERUQgVFJVRQotI2VuZGlmCi0KLSNpZm5kZWYgSElEX0NPTlRST0xfQlVGX1NJWkUKLSNkZWZpbmUgSElEX0NPTlRST0xfQlVGX1NJWkUgQlRfREVGQVVMVF9CVUZGRVJfU0laRQotI2VuZGlmCi0KLSNpZm5kZWYgSElEX0lOVEVSUlVQVF9CVUZfU0laRQotI2RlZmluZSBISURfSU5URVJSVVBUX0JVRl9TSVpFIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLSNlbmRpZgotCi0jaWZuZGVmIEhJRF9ERVZfTVRVX1NJWkUKLSNkZWZpbmUgSElEX0RFVl9NVFVfU0laRSA1MTIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVmaW5pdGlvbnMgZm9yIEJvdGggSElELUhvc3QgJiBEZXZpY2UKLSovCi0jaWZuZGVmIEhJRF9NQVhfU1ZDX05BTUVfTEVOCi0jZGVmaW5lIEhJRF9NQVhfU1ZDX05BTUVfTEVOIDMyCi0jZW5kaWYKLQotI2lmbmRlZiBISURfTUFYX1NWQ19ERVNDUl9MRU4KLSNkZWZpbmUgSElEX01BWF9TVkNfREVTQ1JfTEVOIDMyCi0jZW5kaWYKLQotI2lmbmRlZiBISURfTUFYX1BST1ZfTkFNRV9MRU4KLSNkZWZpbmUgSElEX01BWF9QUk9WX05BTUVfTEVOIDMyCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlZmluaXRpb25zIGZvciBISUQtSG9zdAotKi8KLSNpZm5kZWYgSElEX0hPU1RfSU5DTFVERUQKLSNkZWZpbmUgSElEX0hPU1RfSU5DTFVERUQgVFJVRQotI2VuZGlmCi0KLSNpZm5kZWYgSElEX0hPU1RfTUFYX0RFVklDRVMKLSNkZWZpbmUgSElEX0hPU1RfTUFYX0RFVklDRVMgNwotI2VuZGlmCi0KLSNpZm5kZWYgSElEX0hPU1RfTVRVCi0jZGVmaW5lIEhJRF9IT1NUX01UVSA2NDAKLSNlbmRpZgotCi0jaWZuZGVmIEhJRF9IT1NUX01BWF9DT05OX1JFVFJZCi0jZGVmaW5lIEhJRF9IT1NUX01BWF9DT05OX1JFVFJZIDEKLSNlbmRpZgotCi0jaWZuZGVmIEhJRF9IT1NUX1JFUEFHRV9XSU4KLSNkZWZpbmUgSElEX0hPU1RfUkVQQUdFX1dJTiAyCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFWQ1RQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIEFDTCBsaW5rcyB0byBkaWZmZXJlbnQgcGVlciBkZXZpY2VzLiAqLwotI2lmbmRlZiBBVkNUX05VTV9MSU5LUwotI2RlZmluZSBBVkNUX05VTV9MSU5LUyA2Ci0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHNpbXVsdGFuZW91cyBBVkNUUCBjb25uZWN0aW9ucy4gKi8KLSNpZm5kZWYgQVZDVF9OVU1fQ09OTgotI2RlZmluZSBBVkNUX05VTV9DT05OIDE0ICAvLyAyICogTWF4RGV2aWNlcyArIDIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQVZSQ1AKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQVZSQ19BRFZfQ1RSTF9JTkNMVURFRAotI2RlZmluZSBBVlJDX0FEVl9DVFJMX0lOQ0xVREVEIFRSVUUKLSNlbmRpZgotCi0jaWZuZGVmIERVTVBfUENNX0RBVEEKLSNkZWZpbmUgRFVNUF9QQ01fREFUQSBGQUxTRQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBCVEEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBCVEEgRUlSIGNhbm5lZCBVVUlEIGxpc3QgKGRlZmF1bHQgaXMgZHluYW1pYykgKi8KLSNpZm5kZWYgQlRBX0VJUl9DQU5ORURfVVVJRF9MSVNUCi0jZGVmaW5lIEJUQV9FSVJfQ0FOTkVEX1VVSURfTElTVCBGQUxTRQotI2VuZGlmCi0KLS8qIE51bWJlciBvZiBzdXBwb3J0ZWQgY3VzdG9tZXIgVVVJRCBpbiBFSVIgKi8KLSNpZm5kZWYgQlRBX0VJUl9TRVJWRVJfTlVNX0NVU1RPTV9VVUlECi0jZGVmaW5lIEJUQV9FSVJfU0VSVkVSX05VTV9DVVNUT01fVVVJRCA4Ci0jZW5kaWYKLQotLyogQ0hMRCBvdmVycmlkZSAqLwotI2lmbmRlZiBCVEFfQUdfQ0hMRF9WQUxfRUNDCi0jZGVmaW5lIEJUQV9BR19DSExEX1ZBTF9FQ0MgIigwLDEsMXgsMiwyeCwzKSIKLSNlbmRpZgotCi0jaWZuZGVmIEJUQV9BR19DSExEX1ZBTAotI2RlZmluZSBCVEFfQUdfQ0hMRF9WQUwgIigwLDEsMiwzKSIKLSNlbmRpZgotCi0vKiBTZXQgdGhlIENJTkQgdG8gbWF0Y2ggSEZQIDEuNSAqLwotI2lmbmRlZiBCVEFfQUdfQ0lORF9JTkZPCi0jZGVmaW5lIEJUQV9BR19DSU5EX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAiKFwiY2FsbFwiLCgwLDEpKSwoXCJjYWxsc2V0dXBcIiwoMC0zKSksKFwic2VydmljZVwiLCgwLTEpKSwoXCJzaWduYWxcIiwoMC0iIFwKLSAgIjUpKSwoXCJyb2FtXCIsKDAsMSkpLChcImJhdHRjaGdcIiwoMC01KSksKFwiY2FsbGhlbGRcIiwoMC0yKSkiCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRyYWNpbmc6ICBJbmNsdWRlIHRyYWNlIGhlYWRlciBmaWxlIGhlcmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFbmFibGUvZGlzYWJsZSBCVFNub29wIG1lbW9yeSBsb2dnaW5nICovCi0jaWZuZGVmIEJUU05PT1BfTUVNCi0jZGVmaW5lIEJUU05PT1BfTUVNIFRSVUUKLSNlbmRpZgotCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIKLQotI2lmbmRlZiBCVE1fREVMQVlfQVVUSF9NUwotI2RlZmluZSBCVE1fREVMQVlfQVVUSF9NUyAwCi0jZW5kaWYKLQotI2lmbmRlZiBCVE1fRElTQUJMRV9DT05DVVJSRU5UX1BFRVJfQVVUSAotI2RlZmluZSBCVE1fRElTQUJMRV9DT05DVVJSRU5UX1BFRVJfQVVUSCBGQUxTRQotI2VuZGlmCi0KLSNlbmRpZiAvKiBCVF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW50ZXJuYWxfaW5jbHVkZS9idF90cmFjZS5oIGIvaW50ZXJuYWxfaW5jbHVkZS9idF90cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBlMWQyLi4wMDAwMDAwCi0tLSBhL2ludGVybmFsX2luY2x1ZGUvYnRfdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGVmaW5lIHRyYWNlIGxldmVscyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgQlRfVFJBQ0VfTEVWRUxfTk9ORSA9IDAsICAgIC8qIE5vIHRyYWNlIG1lc3NhZ2VzIHRvIGJlIGdlbmVyYXRlZCAgICAqLwotICBCVF9UUkFDRV9MRVZFTF9FUlJPUiA9IDEsICAgLyogRXJyb3IgY29uZGl0aW9uIHRyYWNlIG1lc3NhZ2VzICAgICAgICovCi0gIEJUX1RSQUNFX0xFVkVMX1dBUk5JTkcgPSAyLCAvKiBXYXJuaW5nIGNvbmRpdGlvbiB0cmFjZSBtZXNzYWdlcyAgICAgKi8KLSAgQlRfVFJBQ0VfTEVWRUxfQVBJID0gMywgICAgIC8qIEFQSSB0cmFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBCVF9UUkFDRV9MRVZFTF9FVkVOVCA9IDQsICAgLyogRGVidWcgbWVzc2FnZXMgZm9yIGV2ZW50cyAgICAgICAgICAgICovCi0gIEJUX1RSQUNFX0xFVkVMX0RFQlVHID0gNSwgICAvKiBGdWxsIGRlYnVnIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgKi8KLSAgQlRfVFJBQ0VfTEVWRUxfVkVSQk9TRSA9IDYsIC8qIFZlcmJvc2UgZGVidWcgbWVzc2FnZXMgICAgICAgICAgICAgICAqLwotfSB0TEVHQUNZX1RSQUNFX0xFVkVMOwotCi0jZGVmaW5lIFRSQUNFX0NUUkxfR0VORVJBTCAweDAwMDAwMDAwCi0KLSNkZWZpbmUgVFJBQ0VfTEFZRVJfTUFTSyAweDAwZmYwMDAwCi0jZGVmaW5lIFRSQUNFX0dFVF9MQVlFUih4KSAoKCgodWludDMyX3QpKHgpKSAmIFRSQUNFX0xBWUVSX01BU0spID4+IDE2KQotCi0jZGVmaW5lIFRSQUNFX0xBWUVSX05PTkUgMHgwMDAwMDAwMAotI2RlZmluZSBUUkFDRV9MQVlFUl9IQ0kgMHgwMDA3MDAwMAotI2RlZmluZSBUUkFDRV9MQVlFUl9MMkNBUCAweDAwMDgwMDAwCi0jZGVmaW5lIFRSQUNFX0xBWUVSX1JGQ09NTSAweDAwMDkwMDAwCi0jZGVmaW5lIFRSQUNFX0xBWUVSX1NEUCAweDAwMGEwMDAwCi0jZGVmaW5lIFRSQUNFX0xBWUVSX0JUTSAweDAwMGQwMDAwCi0jZGVmaW5lIFRSQUNFX0xBWUVSX0JORVAgMHgwMDFiMDAwMAotI2RlZmluZSBUUkFDRV9MQVlFUl9QQU4gMHgwMDFjMDAwMAotI2RlZmluZSBUUkFDRV9MQVlFUl9ISUQgMHgwMDFlMDAwMAotI2RlZmluZSBUUkFDRV9MQVlFUl9BVlAgMHgwMDIwMDAwMAotI2RlZmluZSBUUkFDRV9MQVlFUl9BMkRQIDB4MDAyMTAwMDAKLSNkZWZpbmUgVFJBQ0VfTEFZRVJfU01QIDB4MDAyNjAwMDAKLQotI2RlZmluZSBUUkFDRV9MQVlFUl9NQVhfTlVNIDB4MDAzMQotCi0jZGVmaW5lIFRSQUNFX09SR19NQVNLIDB4MDAwMGZmMDAKLSNkZWZpbmUgVFJBQ0VfR0VUX09SRyh4KSAoKCgodWludDMyX3QpKHgpKSAmIFRSQUNFX09SR19NQVNLKSA+PiA4KQotCi0jZGVmaW5lIFRSQUNFX09SR19TVEFDSyAweDAwMDAwMDAwCi0jZGVmaW5lIFRSQUNFX09SR19BUFBMIDB4MDAwMDA1MDAKLSNkZWZpbmUgVFJBQ0VfT1JHX1VTRVJfU0NSIDB4MDAwMDA4MDAKLQotI2RlZmluZSBUUkFDRV9UWVBFX01BU0sgMHgwMDAwMDBmZgotI2RlZmluZSBUUkFDRV9HRVRfVFlQRSh4KSAoKCh1aW50MzJfdCkoeCkpICYgVFJBQ0VfVFlQRV9NQVNLKQotCi0jZGVmaW5lIFRSQUNFX1RZUEVfRVJST1IgMHgwMDAwMDAwMAotI2RlZmluZSBUUkFDRV9UWVBFX1dBUk5JTkcgMHgwMDAwMDAwMQotI2RlZmluZSBUUkFDRV9UWVBFX0FQSSAweDAwMDAwMDAyCi0jZGVmaW5lIFRSQUNFX1RZUEVfRVZFTlQgMHgwMDAwMDAwMwotI2RlZmluZSBUUkFDRV9UWVBFX0RFQlVHIDB4MDAwMDAwMDQKLQotc3RhdGljIGNvbnN0IGNoYXIgQlRFX0xPR01TR19NT0RVTEVbXSA9ICJidGVfbG9nbXNnX21vZHVsZSI7Ci0KLS8qIEJURSB0cmFjaW5nIElEcyBmb3IgZGVidWcgcHVycG9zZXMgKi8KLS8qIExheWVySURzIGZvciBzdGFjayAqLwotI2RlZmluZSBCVFRSQ19JRF9TVEtfR0tJIDEKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0JUVSAyCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19IQ0kgMwotI2RlZmluZSBCVFRSQ19JRF9TVEtfTDJDQVAgNAotI2RlZmluZSBCVFRSQ19JRF9TVEtfUkZDTV9NWCA1Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19SRkNNX1BSVCA2Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19PQkVYX0MgNwotI2RlZmluZSBCVFRSQ19JRF9TVEtfT0JFWF9TIDgKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0FWQ1QgOQotI2RlZmluZSBCVFRSQ19JRF9TVEtfQVZEVCAxMAotI2RlZmluZSBCVFRSQ19JRF9TVEtfQVZSQyAxMQotI2RlZmluZSBCVFRSQ19JRF9TVEtfQklDIDEyCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19CSVMgMTMKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0JORVAgMTQKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0JQUCAxNQotI2RlZmluZSBCVFRSQ19JRF9TVEtfQlRNX0FDTCAxNgotI2RlZmluZSBCVFRSQ19JRF9TVEtfQlRNX1BNIDE3Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19CVE1fREVWX0NUUkwgMTgKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0JUTV9TVkNfRFNDIDE5Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19CVE1fSU5RIDIwCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19CVE1fU0NPIDIxCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19CVE1fU0VDIDIyCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19ISUQgMjQKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0hTUDIgMjUKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0NUUCAyNgotI2RlZmluZSBCVFRSQ19JRF9TVEtfRlRDIDI3Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19GVFMgMjgKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0hDUlAgMzEKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0lDUCAzMgotI2RlZmluZSBCVFRSQ19JRF9TVEtfT1BDIDMzCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19PUFMgMzQKLSNkZWZpbmUgQlRUUkNfSURfU1RLX1BBTiAzNQotI2RlZmluZSBCVFRSQ19JRF9TVEtfU0FQIDM2Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19TRFAgMzcKLSNkZWZpbmUgQlRUUkNfSURfU1RLX1NMSVAgMzgKLSNkZWZpbmUgQlRUUkNfSURfU1RLX1NQUCAzOQotI2RlZmluZSBCVFRSQ19JRF9TVEtfVENTIDQwCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19WRFAgNDEKLSNkZWZpbmUgQlRUUkNfSURfU1RLX01DQVAgNDIgLyogT0JTT0xFVEUgKi8KLSNkZWZpbmUgQlRUUkNfSURfU1RLX0dBVFQgNDMKLSNkZWZpbmUgQlRUUkNfSURfU1RLX1NNUCA0NAotI2RlZmluZSBCVFRSQ19JRF9TVEtfTkZDIDQ1Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19OQ0kgNDYKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0lERVAgNDcKLSNkZWZpbmUgQlRUUkNfSURfU1RLX05ERVAgNDgKLSNkZWZpbmUgQlRUUkNfSURfU1RLX0xMQ1AgNDkKLSNkZWZpbmUgQlRUUkNfSURfU1RLX1JXIDUwCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19DRSA1MQotI2RlZmluZSBCVFRSQ19JRF9TVEtfU05FUCA1MgotI2RlZmluZSBCVFRSQ19JRF9TVEtfTkRFRiA1MwotI2RlZmluZSBCVFRSQ19JRF9TVEtfSElERCA1NAotCi0vKiBMYXllcklEcyBmb3IgQlRBICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9BQ0MgNTUgLyogQWR2YW5jZWQgQ2FtZXJhIENsaWVudCAqLwotI2RlZmluZSBCVFRSQ19JRF9CVEFfQUcgNTYgIC8qIGF1ZGlvIGdhdGV3YXkgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX0FWIDU3ICAvKiBBZHZhbmNlZCBhdWRpbyAqLwotI2RlZmluZSBCVFRSQ19JRF9CVEFfQklDIDU4IC8qIEJhc2ljIEltYWdpbmcgQ2xpZW50ICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9CSVMgNTkgLyogQmFzaWMgSW1hZ2luZyBTZXJ2ZXIgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX0JQIDYwICAvKiBCYXNpYyBQcmludGluZyBDbGllbnQgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX0NHIDYxCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9DVCA2MiAgICAgIC8qIGNvcmRsZXNzIHRlbGVwaG9ueSB0ZXJtaW5hbCAqLwotI2RlZmluZSBCVFRSQ19JRF9CVEFfREcgNjMgICAgICAvKiBkYXRhIGdhdGV3YXkgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX0RNIDY0ICAgICAgLyogZGV2aWNlIG1hbmFnZXIgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX0RNX1NSQ0ggNjUgLyogZGV2aWNlIG1hbmFnZXIgc2VhcmNoICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9ETV9TRUMgNjYgIC8qIGRldmljZSBtYW5hZ2VyIHNlY3VyaXR5ICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9GTSA2NwotI2RlZmluZSBCVFRSQ19JRF9CVEFfRlRDIDY4IC8qIGZpbGUgdHJhbnNmZXIgY2xpZW50ICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9GVFMgNjkgLyogZmlsZSB0cmFuc2ZlciBzZXJ2ZXIgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX0hJREggNzAKLSNkZWZpbmUgQlRUUkNfSURfQlRBX0hJREQgNzEKLSNkZWZpbmUgQlRUUkNfSURfQlRBX0pWIDcyCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9PUEMgNzMgIC8qIG9iamVjdCBwdXNoIGNsaWVudCAqLwotI2RlZmluZSBCVFRSQ19JRF9CVEFfT1BTIDc0ICAvKiBvYmplY3QgcHVzaCBzZXJ2ZXIgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX1BBTiA3NSAgLyogUGVyc29uYWwgQXJlYSBOZXR3b3JraW5nICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9QUiA3NiAgIC8qIFByaW50ZXIgY2xpZW50ICovCi0jZGVmaW5lIEJUVFJDX0lEX0JUQV9TQyA3NyAgIC8qIFNJTSBDYXJkIEFjY2VzcyBzZXJ2ZXIgKi8KLSNkZWZpbmUgQlRUUkNfSURfQlRBX1NTIDc4ICAgLyogc3luY2hyb25pemF0aW9uIHNlcnZlciAqLwotI2RlZmluZSBCVFRSQ19JRF9CVEFfU1lTIDc5ICAvKiBzeXN0ZW0gbWFuYWdlciAqLwotI2RlZmluZSBCVFRSQ19JRF9BVkRUX1NDQiA4MCAvKiBhdmR0IHNjYiAqLwotI2RlZmluZSBCVFRSQ19JRF9BVkRUX0NDQiA4MSAvKiBhdmR0IGNjYiAqLwotCi0vKiBMYXllcklEcyBhZGRlZCBmb3IgQlRMLUEuIFByb2JhYmx5IHNob3VsZCBtb2RpZnkgYnRlX2xvZ21zZy5jYyBpbiBmdXR1cmUuICovCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19SRkNPTU0gODIKLSNkZWZpbmUgQlRUUkNfSURfU1RLX1JGQ09NTV9EQVRBIDgzCi0jZGVmaW5lIEJUVFJDX0lEX1NUS19PQkVYIDg0Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19BMkRQIDg1Ci0jZGVmaW5lIEJUVFJDX0lEX1NUS19CSVAgODYKLQotLyogTGF5ZXJJRHMgZm9yIEJUIEFQUCAqLwotI2RlZmluZSBCVFRSQ19JRF9CVEFQUCA4NwotLyogdGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byBhbGxvdyBkeW5hbWljIGVuYWJsZS9kaXNhYmxlIG9mCi0gKiBCVF9QUk9UT0NPTF9UUkFDRSAqLwotI2RlZmluZSBCVFRSQ19JRF9CVF9QUk9UT0NPTCA4OAotI2RlZmluZSBCVFRSQ19JRF9NQVhfSUQgQlRUUkNfSURfQlRfUFJPVE9DT0wKLSNkZWZpbmUgQlRUUkNfSURfQUxMX0xBWUVSUyAweEZGIC8qIGFsbCB0cmFjZSBsYXllcnMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRyYWNlIExldmVscwotICoKLSAqIFRoZSBmb2xsb3dpbmcgdmFsdWVzIG1heSBiZSB1c2VkIGZvciBkaWZmZXJlbnQgbGV2ZWxzOgotICogICAgICBCVF9UUkFDRV9MRVZFTF9OT05FICAgIDAgICAgICAgICogTm8gdHJhY2UgbWVzc2FnZXMgdG8gYmUgZ2VuZXJhdGVkCi0gKiAgICAgIEJUX1RSQUNFX0xFVkVMX0VSUk9SICAgMSAgICAgICAgKiBFcnJvciBjb25kaXRpb24gdHJhY2UgbWVzc2FnZXMKLSAqICAgICAgQlRfVFJBQ0VfTEVWRUxfV0FSTklORyAyICAgICAgICAqIFdhcm5pbmcgY29uZGl0aW9uIHRyYWNlIG1lc3NhZ2VzCi0gKiAgICAgIEJUX1RSQUNFX0xFVkVMX0FQSSAgICAgMyAgICAgICAgKiBBUEkgdHJhY2VzCi0gKiAgICAgIEJUX1RSQUNFX0xFVkVMX0VWRU5UICAgNCAgICAgICAgKiBEZWJ1ZyBtZXNzYWdlcyBmb3IgZXZlbnRzCi0gKiAgICAgIEJUX1RSQUNFX0xFVkVMX0RFQlVHICAgNSAgICAgICAgKiBEZWJ1ZyBtZXNzYWdlcyAoZ2VuZXJhbCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29yZSBTdGFjayBkZWZhdWx0IHRyYWNlIGxldmVscyAqLwotI2lmbmRlZiBIQ0lfSU5JVElBTF9UUkFDRV9MRVZFTAotI2RlZmluZSBIQ0lfSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2lmbmRlZiBCVE1fSU5JVElBTF9UUkFDRV9MRVZFTAotI2RlZmluZSBCVE1fSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2lmbmRlZiBMMkNBUF9JTklUSUFMX1RSQUNFX0xFVkVMCi0jZGVmaW5lIEwyQ0FQX0lOSVRJQUxfVFJBQ0VfTEVWRUwgQlRfVFJBQ0VfTEVWRUxfV0FSTklORwotI2VuZGlmCi0KLSNpZm5kZWYgUkZDT01NX0lOSVRJQUxfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgUkZDT01NX0lOSVRJQUxfVFJBQ0VfTEVWRUwgQlRfVFJBQ0VfTEVWRUxfV0FSTklORwotI2VuZGlmCi0KLSNpZm5kZWYgQk5FUF9JTklUSUFMX1RSQUNFX0xFVkVMCi0jZGVmaW5lIEJORVBfSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2lmbmRlZiBQQU5fSU5JVElBTF9UUkFDRV9MRVZFTAotI2RlZmluZSBQQU5fSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2lmbmRlZiBBMkRQX0lOSVRJQUxfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgQTJEUF9JTklUSUFMX1RSQUNFX0xFVkVMIEJUX1RSQUNFX0xFVkVMX1dBUk5JTkcKLSNlbmRpZgotCi0jaWZuZGVmIEFWRFRfSU5JVElBTF9UUkFDRV9MRVZFTAotI2RlZmluZSBBVkRUX0lOSVRJQUxfVFJBQ0VfTEVWRUwgQlRfVFJBQ0VfTEVWRUxfV0FSTklORwotI2VuZGlmCi0KLSNpZm5kZWYgQVZDVF9JTklUSUFMX1RSQUNFX0xFVkVMCi0jZGVmaW5lIEFWQ1RfSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2lmbmRlZiBBVlJDX0lOSVRJQUxfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgQVZSQ19JTklUSUFMX1RSQUNFX0xFVkVMIEJUX1RSQUNFX0xFVkVMX1dBUk5JTkcKLSNlbmRpZgotCi0jaWZuZGVmIEhJRF9JTklUSUFMX1RSQUNFX0xFVkVMCi0jZGVmaW5lIEhJRF9JTklUSUFMX1RSQUNFX0xFVkVMIEJUX1RSQUNFX0xFVkVMX1dBUk5JTkcKLSNlbmRpZgotCi0jaWZuZGVmIEFQUExfSU5JVElBTF9UUkFDRV9MRVZFTAotI2RlZmluZSBBUFBMX0lOSVRJQUxfVFJBQ0VfTEVWRUwgQlRfVFJBQ0VfTEVWRUxfV0FSTklORwotI2VuZGlmCi0KLSNpZm5kZWYgR0FUVF9JTklUSUFMX1RSQUNFX0xFVkVMCi0jZGVmaW5lIEdBVFRfSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2lmbmRlZiBTTVBfSU5JVElBTF9UUkFDRV9MRVZFTAotI2RlZmluZSBTTVBfSU5JVElBTF9UUkFDRV9MRVZFTCBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HCi0jZW5kaWYKLQotI2RlZmluZSBCVF9UUkFDRShsLCB0LCAuLi4pIFwKLSAgTG9nTXNnKChUUkFDRV9DVFJMX0dFTkVSQUwgfCAobCkgfCBUUkFDRV9PUkdfU1RBQ0sgfCAodCkpLCAjI19fVkFfQVJHU19fKQotCi0vKiBEZWZpbmUgdHJhY2luZyBmb3IgdGhlIEhDSSB1bml0ICovCi0jZGVmaW5lIEhDSV9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0dV90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9IQ0ksIFRSQUNFX1RZUEVfRVJST1IsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgSENJX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0dV90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0hDSSwgVFJBQ0VfVFlQRV9XQVJOSU5HLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEhDSV9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0dV90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9IQ0ksIFRSQUNFX1RZUEVfRVZFTlQsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgSENJX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYnR1X3RyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0hDSSwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0vKiBEZWZpbmUgdHJhY2luZyBmb3IgQlRNICovCi0jZGVmaW5lIEJUTV9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0bV9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CVE0sIFRSQUNFX1RZUEVfRVJST1IsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQlRNX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0bV9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0JUTSwgVFJBQ0VfVFlQRV9XQVJOSU5HLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEJUTV9UUkFDRV9BUEkoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYnRtX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CVE0sIFRSQUNFX1RZUEVfQVBJLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEJUTV9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0bV9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CVE0sIFRSQUNFX1RZUEVfRVZFTlQsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQlRNX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYnRtX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0JUTSwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0vKiBEZWZpbmUgdHJhY2luZyBmb3IgdGhlIEwyQ0FQIHVuaXQgKi8KLSNkZWZpbmUgTDJDQVBfVFJBQ0VfRVJST1IoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGwyY2IubDJjYXBfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVJST1IpICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0wyQ0FQLCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEwyQ0FQX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAobDJjYi5sMmNhcF90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9MMkNBUCwgVFJBQ0VfVFlQRV9XQVJOSU5HLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEwyQ0FQX1RSQUNFX0FQSSguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGwyY2IubDJjYXBfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfQVBJKSAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9MMkNBUCwgVFJBQ0VfVFlQRV9BUEksICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgTDJDQVBfVFJBQ0VfRVZFTlQoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGwyY2IubDJjYXBfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVZFTlQpICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0wyQ0FQLCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEwyQ0FQX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChsMmNiLmwyY2FwX3RyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9MMkNBUCwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0vKiBEZWZpbmUgdHJhY2luZyBmb3IgdGhlIFNEUCB1bml0ICovCi0jZGVmaW5lIFNEUF9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHNkcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9TRFAsIFRSQUNFX1RZUEVfRVJST1IsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgU0RQX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHNkcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX1NEUCwgVFJBQ0VfVFlQRV9XQVJOSU5HLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFNEUF9UUkFDRV9BUEkoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoc2RwX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9TRFAsIFRSQUNFX1RZUEVfQVBJLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFNEUF9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHNkcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9TRFAsIFRSQUNFX1RZUEVfRVZFTlQsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgU0RQX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoc2RwX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX1NEUCwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0vKiBEZWZpbmUgdHJhY2luZyBmb3IgdGhlIFJGQ09NTSB1bml0ICovCi0jZGVmaW5lIFJGQ09NTV9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHJmY19jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9SRkNPTU0sIFRSQUNFX1RZUEVfRVJST1IsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgUkZDT01NX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHJmY19jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX1JGQ09NTSwgVFJBQ0VfVFlQRV9XQVJOSU5HLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFJGQ09NTV9UUkFDRV9BUEkoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocmZjX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9SRkNPTU0sIFRSQUNFX1RZUEVfQVBJLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFJGQ09NTV9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHJmY19jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9SRkNPTU0sIFRSQUNFX1RZUEVfRVZFTlQsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgUkZDT01NX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocmZjX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX1JGQ09NTSwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0vKiBkZWZpbmUgdHJhY2VzIGZvciBISUQgSG9zdCAqLwotI2RlZmluZSBISURIX1RSQUNFX0VSUk9SKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoaF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfSElELCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEhJREhfVFJBQ0VfV0FSTklORyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoaF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9ISUQsIFRSQUNFX1RZUEVfV0FSTklORywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBISURIX1RSQUNFX0FQSSguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGhoX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfSElELCBUUkFDRV9UWVBFX0FQSSwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBISURIX1RSQUNFX0VWRU5UKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoaF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfSElELCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEhJREhfVFJBQ0VfREVCVUcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGhoX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9ISUQsIFRSQUNFX1RZUEVfREVCVUcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotLyogZGVmaW5lIHRyYWNlcyBmb3IgSElEIERldmljZSAqLwotI2RlZmluZSBISUREX1RSQUNFX0VSUk9SKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoZF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfSElELCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEhJRERfVFJBQ0VfV0FSTklORyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoZF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9ISUQsIFRSQUNFX1RZUEVfV0FSTklORywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBISUREX1RSQUNFX0FQSSguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGhkX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfSElELCBUUkFDRV9UWVBFX0FQSSwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBISUREX1RSQUNFX0VWRU5UKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoZF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfSElELCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEhJRERfVFJBQ0VfREVCVUcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGhkX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9ISUQsIFRSQUNFX1RZUEVfREVCVUcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgSElERF9UUkFDRV9WRVJCT1NFKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoaGRfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfVkVSQk9TRSkgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0hJRCwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0vKiBkZWZpbmUgdHJhY2VzIGZvciBCTkVQICovCi0jZGVmaW5lIEJORVBfVFJBQ0VfRVJST1IoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYm5lcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CTkVQLCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEJORVBfVFJBQ0VfV0FSTklORyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJuZXBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORykgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CTkVQLCBUUkFDRV9UWVBFX1dBUk5JTkcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQk5FUF9UUkFDRV9BUEkoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJuZXBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfQVBJKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0JORVAsIFRSQUNFX1RZUEVfQVBJLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEJORVBfVFJBQ0VfRVZFTlQoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYm5lcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CTkVQLCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEJORVBfVFJBQ0VfREVCVUcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYm5lcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9ERUJVRykgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9CTkVQLCBUUkFDRV9UWVBFX0RFQlVHLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLS8qIGRlZmluZSB0cmFjZXMgZm9yIFBBTiAqLwotI2RlZmluZSBQQU5fVFJBQ0VfRVJST1IoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChwYW5fY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVJST1IpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfUEFOLCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFBBTl9UUkFDRV9XQVJOSU5HKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChwYW5fY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORykgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9QQU4sIFRSQUNFX1RZUEVfV0FSTklORywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBQQU5fVFJBQ0VfQVBJKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHBhbl9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9BUEkpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfUEFOLCBUUkFDRV9UWVBFX0FQSSwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBQQU5fVFJBQ0VfRVZFTlQoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChwYW5fY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVZFTlQpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfUEFOLCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFBBTl9UUkFDRV9ERUJVRyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHBhbl9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9ERUJVRykgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9QQU4sIFRSQUNFX1RZUEVfREVCVUcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotLyogRGVmaW5lIHRyYWNpbmcgZm9yIHRoZSBBMkRQIHByb2ZpbGUgKi8KLSNkZWZpbmUgQTJEUF9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhMmRwX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VSUk9SKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0EyRFAsIFRSQUNFX1RZUEVfRVJST1IsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQTJEUF9UUkFDRV9XQVJOSU5HKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYTJkcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0EyRFAsIFRSQUNFX1RZUEVfV0FSTklORywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBMkRQX1RSQUNFX0VWRU5UKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGEyZHBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVZFTlQpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQTJEUCwgVFJBQ0VfVFlQRV9FVkVOVCwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBMkRQX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGEyZHBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfREVCVUcpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQTJEUCwgVFJBQ0VfVFlQRV9ERUJVRywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBMkRQX1RSQUNFX0FQSSguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYTJkcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9BUEkpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQTJEUCwgVFJBQ0VfVFlQRV9BUEksICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotLyogQVZEVFAgKi8KLSNkZWZpbmUgQVZEVF9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZkdHBfY2IuVHJhY2VMZXZlbCgpID49IEJUX1RSQUNFX0xFVkVMX0VSUk9SKSAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0FWUCwgVFJBQ0VfVFlQRV9FUlJPUiwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBVkRUX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZkdHBfY2IuVHJhY2VMZXZlbCgpID49IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkcpICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQVZQLCBUUkFDRV9UWVBFX1dBUk5JTkcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQVZEVF9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZkdHBfY2IuVHJhY2VMZXZlbCgpID49IEJUX1RSQUNFX0xFVkVMX0VWRU5UKSAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0FWUCwgVFJBQ0VfVFlQRV9FVkVOVCwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBVkRUX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdmR0cF9jYi5UcmFjZUxldmVsKCkgPj0gQlRfVFJBQ0VfTEVWRUxfREVCVUcpICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQVZQLCBUUkFDRV9UWVBFX0RFQlVHLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEFWRFRfVFJBQ0VfQVBJKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZkdHBfY2IuVHJhY2VMZXZlbCgpID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9BVlAsIFRSQUNFX1RZUEVfQVBJLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLS8qIERlZmluZSB0cmFjaW5nIGZvciB0aGUgQVZDVFAgcHJvdG9jb2wgKi8KLSNkZWZpbmUgQVZDVF9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZjdF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FUlJPUikgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0FWUCwgVFJBQ0VfVFlQRV9FUlJPUiwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBVkNUX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZjdF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9XQVJOSU5HKSAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQVZQLCBUUkFDRV9UWVBFX1dBUk5JTkcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQVZDVF9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZjdF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9FVkVOVCkgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0FWUCwgVFJBQ0VfVFlQRV9FVkVOVCwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBVkNUX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdmN0X2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0RFQlVHKSAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQVZQLCBUUkFDRV9UWVBFX0RFQlVHLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEFWQ1RfVFJBQ0VfQVBJKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXZjdF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9BUEkpICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9BVlAsIFRSQUNFX1RZUEVfQVBJLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLS8qIERlZmluZSB0cmFjaW5nIGZvciB0aGUgQVZSQ1AgcHJvZmlsZSAqLwotI2RlZmluZSBBVlJDX1RSQUNFX0VSUk9SKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdnJjX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VSUk9SKSAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQVZQLCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEFWUkNfVFJBQ0VfV0FSTklORyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdnJjX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkcpICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9BVlAsIFRSQUNFX1RZUEVfV0FSTklORywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBBVlJDX1RSQUNFX0VWRU5UKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdnJjX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VWRU5UKSAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfQVZQLCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIEFWUkNfVFJBQ0VfREVCVUcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGF2cmNfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfREVCVUcpICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9BVlAsIFRSQUNFX1RZUEVfREVCVUcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNkZWZpbmUgQVZSQ19UUkFDRV9BUEkoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdnJjX2NiLnRyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0FQSSkgICAgICAgICAgICAgIFwKLSAgICAgIEJUX1RSQUNFKFRSQUNFX0xBWUVSX0FWUCwgVFJBQ0VfVFlQRV9BUEksICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotLyogRGVmaW5lIHRyYWNpbmcgZm9yIHRoZSBTTVAgdW5pdCAqLwotI2RlZmluZSBTTVBfVFJBQ0VfRVJST1IoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzbXBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVJST1IpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfU01QLCBUUkFDRV9UWVBFX0VSUk9SLCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFNNUF9UUkFDRV9XQVJOSU5HKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzbXBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORykgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9TTVAsIFRSQUNFX1RZUEVfV0FSTklORywgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBTTVBfVFJBQ0VfQVBJKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHNtcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9BUEkpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfU01QLCBUUkFDRV9UWVBFX0FQSSwgIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotI2RlZmluZSBTTVBfVFJBQ0VfRVZFTlQoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzbXBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfRVZFTlQpICAgICAgICAgICAgICAgXAotICAgICAgQlRfVFJBQ0UoVFJBQ0VfTEFZRVJfU01QLCBUUkFDRV9UWVBFX0VWRU5ULCAjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZGVmaW5lIFNNUF9UUkFDRV9ERUJVRyguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHNtcF9jYi50cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9ERUJVRykgICAgICAgICAgICAgICBcCi0gICAgICBCVF9UUkFDRShUUkFDRV9MQVlFUl9TTVAsIFRSQUNFX1RZUEVfREVCVUcsICMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotZXh0ZXJuIHVpbnQ4X3QgYnRpZl90cmFjZV9sZXZlbDsKLQotLyogZGVmaW5lIHRyYWNlcyBmb3IgYXBwbGljYXRpb24gKi8KLSNkZWZpbmUgQlRJRl9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidGlmX3RyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VSUk9SKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExvZ01zZyhUUkFDRV9DVFJMX0dFTkVSQUwgfCBUUkFDRV9MQVlFUl9OT05FIHwgVFJBQ0VfT1JHX0FQUEwgfCBcCi0gICAgICAgICAgICAgICAgIFRSQUNFX1RZUEVfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBCVElGX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0aWZfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORykgICAgICAgICAgICAgICAgICAgXAotICAgICAgTG9nTXNnKFRSQUNFX0NUUkxfR0VORVJBTCB8IFRSQUNFX0xBWUVSX05PTkUgfCBUUkFDRV9PUkdfQVBQTCB8IFwKLSAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9XQVJOSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIEJUSUZfVFJBQ0VfQVBJKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYnRpZl90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9BUEkpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMb2dNc2coVFJBQ0VfQ1RSTF9HRU5FUkFMIHwgVFJBQ0VfTEFZRVJfTk9ORSB8IFRSQUNFX09SR19BUFBMIHwgXAotICAgICAgICAgICAgICAgICBUUkFDRV9UWVBFX0FQSSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgQlRJRl9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChidGlmX3RyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VWRU5UKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExvZ01zZyhUUkFDRV9DVFJMX0dFTkVSQUwgfCBUUkFDRV9MQVlFUl9OT05FIHwgVFJBQ0VfT1JHX0FQUEwgfCBcCi0gICAgICAgICAgICAgICAgIFRSQUNFX1RZUEVfRVZFTlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBCVElGX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJ0aWZfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfREVCVUcpICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgTG9nTXNnKFRSQUNFX0NUUkxfR0VORVJBTCB8IFRSQUNFX0xBWUVSX05PTkUgfCBUUkFDRV9PUkdfQVBQTCB8IFwKLSAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9ERUJVRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIEJUSUZfVFJBQ0VfVkVSQk9TRSguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYnRpZl90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9WRVJCT1NFKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMb2dNc2coVFJBQ0VfQ1RSTF9HRU5FUkFMIHwgVFJBQ0VfTEFZRVJfTk9ORSB8IFRSQUNFX09SR19BUFBMIHwgXAotICAgICAgICAgICAgICAgICBUUkFDRV9UWVBFX0RFQlVHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotLyogZGVmaW5lIHRyYWNlcyBmb3IgYXBwbGljYXRpb24gKi8KLSNkZWZpbmUgQVBQTF9UUkFDRV9FUlJPUiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhcHBsX3RyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VSUk9SKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExvZ01zZyhUUkFDRV9DVFJMX0dFTkVSQUwgfCBUUkFDRV9MQVlFUl9OT05FIHwgVFJBQ0VfT1JHX0FQUEwgfCBcCi0gICAgICAgICAgICAgICAgIFRSQUNFX1RZUEVfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBBUFBMX1RSQUNFX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGFwcGxfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfV0FSTklORykgICAgICAgICAgICAgICAgICAgXAotICAgICAgTG9nTXNnKFRSQUNFX0NUUkxfR0VORVJBTCB8IFRSQUNFX0xBWUVSX05PTkUgfCBUUkFDRV9PUkdfQVBQTCB8IFwKLSAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9XQVJOSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIEFQUExfVFJBQ0VfQVBJKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXBwbF90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9BUEkpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMb2dNc2coVFJBQ0VfQ1RSTF9HRU5FUkFMIHwgVFJBQ0VfTEFZRVJfTk9ORSB8IFRSQUNFX09SR19BUFBMIHwgXAotICAgICAgICAgICAgICAgICBUUkFDRV9UWVBFX0FQSSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgQVBQTF9UUkFDRV9FVkVOVCguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhcHBsX3RyYWNlX2xldmVsID49IEJUX1RSQUNFX0xFVkVMX0VWRU5UKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExvZ01zZyhUUkFDRV9DVFJMX0dFTkVSQUwgfCBUUkFDRV9MQVlFUl9OT05FIHwgVFJBQ0VfT1JHX0FQUEwgfCBcCi0gICAgICAgICAgICAgICAgIFRSQUNFX1RZUEVfRVZFTlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBBUFBMX1RSQUNFX0RFQlVHKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGFwcGxfdHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfREVCVUcpICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgTG9nTXNnKFRSQUNFX0NUUkxfR0VORVJBTCB8IFRSQUNFX0xBWUVSX05PTkUgfCBUUkFDRV9PUkdfQVBQTCB8IFwKLSAgICAgICAgICAgICAgICAgVFJBQ0VfVFlQRV9ERUJVRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIEFQUExfVFJBQ0VfVkVSQk9TRSguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYXBwbF90cmFjZV9sZXZlbCA+PSBCVF9UUkFDRV9MRVZFTF9WRVJCT1NFKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMb2dNc2coVFJBQ0VfQ1RSTF9HRU5FUkFMIHwgVFJBQ0VfTEFZRVJfTk9ORSB8IFRSQUNFX09SR19BUFBMIHwgXAotICAgICAgICAgICAgICAgICBUUkFDRV9UWVBFX0RFQlVHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotdHlwZWRlZiB1aW50OF90IHRCVFRSQ19MQVlFUl9JRDsKLXR5cGVkZWYgdWludDhfdCh0QlRUUkNfU0VUX1RSQUNFX0xFVkVMKSh1aW50OF90KTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCB0QlRUUkNfTEFZRVJfSUQgbGF5ZXJfaWRfc3RhcnQ7Ci0gIGNvbnN0IHRCVFRSQ19MQVlFUl9JRCBsYXllcl9pZF9lbmQ7Ci0gIHRCVFRSQ19TRVRfVFJBQ0VfTEVWRUwqIHBfZjsKLSAgY29uc3QgY2hhciogdHJjX25hbWU7Ci0gIHVpbnQ4X3QgdHJhY2VfbGV2ZWw7Ci19IHRCVFRSQ19GVU5DX01BUDsKLQotLyogRXh0ZXJuYWwgZGVjbGFyYXRpb24gZm9yIGFwcGxfdHJhY2VfbGV2ZWwgaGVyZSB0byBhdm9pZCB0byBhZGQgdGhlCi0gKiBkZWNsYXJhdGlvbiBpbiBhbGwgdGhlIGZpbGVzIHVzaW5nIEFQUExfVFJBQ0V4eHggbWFjcm9zICovCi1leHRlcm4gdWludDhfdCBhcHBsX3RyYWNlX2xldmVsOwotCi12b2lkIExvZ01zZyh1aW50MzJfdCB0cmFjZV9zZXRfbWFzaywgY29uc3QgY2hhciogZm10X3N0ciwgLi4uKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotCi0vKiBQcmludHMgaW50ZWdyYWwgcGFyYW1ldGVyIHggYXMgaGV4IHN0cmluZywgd2l0aCAnMCcgZmlsbCAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGQ6OnN0cmluZyBsb2doZXgoVCB4KSB7Ci0gIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgImxvZ2hleCBwYXJhbWV0ZXIgbXVzdCBiZSBpbnRlZ3JhbC4iKTsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gdG1wOwotICB0bXAgPDwgc3RkOjpzaG93YmFzZSA8PCBzdGQ6OmludGVybmFsIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCi0gICAgICA8PCBzdGQ6OnNldHcoKHNpemVvZihUKSAqIDIpICsgMikgPDwgK3g7Ci0gIHJldHVybiB0bXAuc3RyKCk7Ci19Ci0KLS8qIFByaW50cyBpbnRlZ3JhbCBhcnJheSBhcyBoZXggc3RyaW5nLCB3aXRoICcwJyBmaWxsICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1zdGQ6OnN0cmluZyBsb2doZXgoc3RkOjphcnJheTxULCBOPiBhcnJheSkgewotICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAotICAgICAgICAgICAgICAgICJ0eXBlIHN0b3JlZCBpbiBhcnJheSBtdXN0IGJlIGludGVncmFsLiIpOwotICBzdGQ6OnN0cmluZ3N0cmVhbSB0bXA7Ci0gIGZvciAoY29uc3QgYXV0byYgeCA6IGFycmF5KSB7Ci0gICAgdG1wIDw8IHN0ZDo6aW50ZXJuYWwgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykKLSAgICAgICAgPDwgc3RkOjpzZXR3KChzaXplb2YodWludDhfdCkgKiAyKSArIDIpIDw8ICt4OwotICB9Ci0gIHJldHVybiB0bXAuc3RyKCk7Ci19Ci0KLS8qKgotICogT2J0YWlucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYm9vbGVhbiB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdmFsdWUgdGhlIGJvb2xlYW4gdmFsdWUgdG8gdXNlCi0gKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJvb2xlYW4gdmFsdWU6ICJ0cnVlIiBvciAiZmFsc2UiCi0gKi8KLWlubGluZSBzdGQ6OnN0cmluZyBsb2dib29sKGJvb2wgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gdG1wOwotICB0bXAgPDwgc3RkOjpib29sYWxwaGEgPDwgdmFsdWU7Ci0gIHJldHVybiB0bXAuc3RyKCk7Ci19Ci0KLS8qKgotICogQXBwZW5kIGEgZmllbGQgbmFtZSB0byBhIHN0cmluZy4KLSAqCi0gKiBUaGUgZmllbGQgbmFtZXMgYXJlIGFkZGVkIHRvIHRoZSBzdHJpbmcgd2l0aCAifCIgaW4gYmV0d2Vlbi4KLSAqCi0gKiBAcGFyYW0gcF9yZXN1bHQgYSBwb2ludGVyIHRvIHRoZSByZXN1bHQgc3RyaW5nIHRvIGFkZCB0aGUgZmllbGQgbmFtZSB0bwotICogQHBhcmFtIGFwcGVuZCBpZiB0cnVlIHRoZSBmaWVsZCBuYW1lIHdpbGwgYmUgYWRkZWQKLSAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCBuYW1lIHRvIGFkZAotICogQHJldHVybiB0aGUgcmVzdWx0IHN0cmluZwotICovCi1pbmxpbmUgc3RkOjpzdHJpbmcmIEFwcGVuZEZpZWxkKHN0ZDo6c3RyaW5nKiBwX3Jlc3VsdCwgYm9vbCBhcHBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gIENIRUNLKHBfcmVzdWx0ICE9IG51bGxwdHIpOwotICBpZiAoIWFwcGVuZCkgcmV0dXJuICpwX3Jlc3VsdDsKLSAgaWYgKCFwX3Jlc3VsdC0+ZW1wdHkoKSkgKnBfcmVzdWx0ICs9ICJ8IjsKLSAgKnBfcmVzdWx0ICs9IG5hbWU7Ci0gIHJldHVybiAqcF9yZXN1bHQ7Ci19Ci0KLS8vIFRoaXMgb2JqZWN0IHB1dHMgdGhlIHN0cmVhbSBpbiBhIHN0YXRlIHdoZXJlIGV2ZXJ5IHRpbWUgdGhhdCBhIG5ldyBsaW5lCi0vLyBvY2N1cnMsIHRoZSBuZXh0IGxpbmUgaXMgaW5kZW50ZWQgYSBjZXJ0YWluIG51bWJlciBvZiBzcGFjZXMuIFRoZSBzdHJlYW0gaXMKLS8vIHJlc2V0IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLgotY2xhc3MgU2NvcGVkSW5kZW50IHsKLSBwdWJsaWM6Ci0gIFNjb3BlZEluZGVudChzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgaW50IGluZGVudF9zaXplID0gREVGQVVMVF9UQUIpCi0gICAgICA6IGluZGVudGVkX2J1Zl8oc3RyZWFtLCBpbmRlbnRfc2l6ZSkgewotICAgIG9sZF9zdHJlYW1fID0gJnN0cmVhbTsKLSAgICBvbGRfc3RyZWFtX2J1Zl8gPSBzdHJlYW0ucmRidWYoKTsKLSAgICBzdHJlYW0ucmRidWYoJmluZGVudGVkX2J1Zl8pOwotICB9Ci0KLSAgflNjb3BlZEluZGVudCgpIHsgb2xkX3N0cmVhbV8tPnJkYnVmKG9sZF9zdHJlYW1fYnVmXyk7IH0KLQotICBzdGF0aWMgY29uc3Qgc2l6ZV90IERFRkFVTFRfVEFCID0gMjsKLQotIHByaXZhdGU6Ci0gIGNsYXNzIEluZGVudGVkU3RyZWFtQnVmIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKLSAgIHB1YmxpYzoKLSAgICBJbmRlbnRlZFN0cmVhbUJ1ZihzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgaW50IGluZGVudF9zaXplKQotICAgICAgICA6IHdyYXBwZWRfYnVmXyhzdHJlYW0ucmRidWYoKSksCi0gICAgICAgICAgaW5kZW50X3NpemVfKGluZGVudF9zaXplKSwKLSAgICAgICAgICBpbmRlbnRfbmV4dF9saW5lXyh0cnVlKXt9OwotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGNoYXJhY3Rlcikgb3ZlcnJpZGUgewotICAgICAgaWYgKGluZGVudF9uZXh0X2xpbmVfICYmIGNoYXJhY3RlciAhPSAnXG4nKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50X3NpemVfOyBpKyspIHdyYXBwZWRfYnVmXy0+c3B1dGMoJyAnKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X25leHRfbGluZV8gPSBmYWxzZTsKLSAgICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1xuJykgewotICAgICAgICBpbmRlbnRfbmV4dF9saW5lXyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB3cmFwcGVkX2J1Zl8tPnNwdXRjKGNoYXJhY3Rlcik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIHN0ZDo6c3RyZWFtYnVmKiB3cmFwcGVkX2J1Zl87Ci0gICAgaW50IGluZGVudF9zaXplXzsKLSAgICBib29sIGluZGVudF9uZXh0X2xpbmVfOwotICB9OwotCi0gIHN0ZDo6b3N0cmVhbSogb2xkX3N0cmVhbV87Ci0gIHN0ZDo6c3RyZWFtYnVmKiBvbGRfc3RyZWFtX2J1Zl87Ci0gIEluZGVudGVkU3RyZWFtQnVmIGluZGVudGVkX2J1Zl87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGVybmFsX2luY2x1ZGUvYnRlX2FwcGwuaCBiL2ludGVybmFsX2luY2x1ZGUvYnRlX2FwcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhYjY0MS4uMDAwMDAwMAotLS0gYS9pbnRlcm5hbF9pbmNsdWRlL2J0ZV9hcHBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmaWxlIGZvciB0aGUgYnRlIGFwcGxpY2F0aW9uIHRhc2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGJsZV9hdXRoX3JlcTsKLSAgdWludDhfdCBibGVfaW9fY2FwOwotICB1aW50OF90IGJsZV9pbml0X2tleTsKLSAgdWludDhfdCBibGVfcmVzcF9rZXk7Ci0gIHVpbnQ4X3QgYmxlX21heF9rZXlfc2l6ZTsKLX0gdEJURV9BUFBMX0NGRzsKLQotZXh0ZXJuIHRCVEVfQVBQTF9DRkcgYnRlX2FwcGxfY2ZnOwpkaWZmIC0tZ2l0IGEvaW50ZXJuYWxfaW5jbHVkZS9zdGFja19jb25maWcuaCBiL2ludGVybmFsX2luY2x1ZGUvc3RhY2tfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTY4Y2EuLjAwMDAwMDAKLS0tIGEvaW50ZXJuYWxfaW5jbHVkZS9zdGFja19jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb25maWcuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgU1RBQ0tfQ09ORklHX01PRFVMRVtdID0gInN0YWNrX2NvbmZpZ19tb2R1bGUiOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgKCpnZXRfdHJhY2VfY29uZmlnX2VuYWJsZWQpKHZvaWQpOwotICBib29sICgqZ2V0X3B0c19hdnJjcF90ZXN0KSh2b2lkKTsKLSAgYm9vbCAoKmdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSkodm9pZCk7Ci0gIGJvb2wgKCpnZXRfcHRzX2Nvbm5fdXBkYXRlc19kaXNhYmxlZCkodm9pZCk7Ci0gIGJvb2wgKCpnZXRfcHRzX2Nyb3Nza2V5X3NkcF9kaXNhYmxlKSh2b2lkKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcqICgqZ2V0X3B0c19zbXBfb3B0aW9ucykodm9pZCk7Ci0gIGludCAoKmdldF9wdHNfc21wX2ZhaWx1cmVfY2FzZSkodm9pZCk7Ci0gIGNvbmZpZ190KiAoKmdldF9hbGwpKHZvaWQpOwotfSBzdGFja19jb25maWdfdDsKLQotY29uc3Qgc3RhY2tfY29uZmlnX3QqIHN0YWNrX2NvbmZpZ19nZXRfaW50ZXJmYWNlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL2JhcF91Y2xpZW50X3Rlc3RfdG9vbC9BbmRyb2lkLmJwIGIvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL2JhcF91Y2xpZW50X3Rlc3RfdG9vbC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQ2NmE1Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC9iYXBfdWNsaWVudF90ZXN0X3Rvb2wvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImJhcF91Y2xpZW50X3Rlc3QiLAotICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCi0gICAgZW5hYmxlZDogZmFsc2UsCi0gICAgc3JjczogWyJiYXBfdWNsaWVudF90ZXN0LmNwcCJdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICIuIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC90eXBlcyIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvc3RhY2svbDJjYXAiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0IiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9sZWEvdmhhbC9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2xpYmNocm9tZSIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItREhBU19OT19CRFJPSURfQlVJTERDRkciXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliY2hyb21lIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsibGliYmx1ZXRvb3RoLXR5cGVzLXF0aSJdLAotCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvYmFwX3VjbGllbnRfdGVzdF90b29sL2JhcF91Y2xpZW50X3Rlc3QuY3BwIGIvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL2JhcF91Y2xpZW50X3Rlc3RfdG9vbC9iYXBfdWNsaWVudF90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYjcwMy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvYmFwX3VjbGllbnRfdGVzdF90b29sL2JhcF91Y2xpZW50X3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIDIwMjAgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJhcF91Y2xpZW50X3Rlc3QuY3BwCi0gKgotICogIERlc2NyaXB0aW9uOiAgIGJhcCB1bmljYXN0IGNsaWVudCB0ZXN0IGFwcGxpY2F0aW9uCi0gKgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqLwotCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9nYXR0X3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9iYXBfdWNsaWVudC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYXNjc19jbGllbnQuaD4KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1jb25zdGV4cHIgdWludDhfdCBBU0VfRElSRUNUSU9OX1NJTksgICAgICAgICAgID0gMHgwMSA8PCAwOwotY29uc3RleHByIHVpbnQ4X3QgQVNFX0RJUkVDVElPTl9TUkMgICAgICAgICAgICA9IDB4MDEgPDwgMTsKLQotY29uc3RleHByIHVpbnQ4X3QgQVNFX1NJTktfU1RFUkVPICAgICA9IDB4MDEgPDwgMDsKLWNvbnN0ZXhwciB1aW50OF90IEFTRV9TUkNfU1RFUkVPICAgICAgPSAweDAxIDw8IDE7Ci0KLSNpZm5kZWYgQkFQX1VOSUNBU1RfVEVTVF9BUFBfSU5URVJGQUNFCi0jZGVmaW5lIEJBUF9VTklDQVNUX1RFU1RfQVBQX0lOVEVSRkFDRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqCi0qKiAgQ29uc3RhbnRzICYgTWFjcm9zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKi8KLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lICAgICBUUlVFICAgICAgIDEKLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotI2RlZmluZSAgICAgRkFMU0UgICAgICAwCi0jZW5kaWYKLQotI2RlZmluZSBQSURfRklMRSAiL2RhdGEvLmJkdF9waWQiCi0KLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWCh4LCB5KSAoKHgpID4gKHkpID8gKHgpIDogKHkpKQotI2VuZGlmCi0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fU1RSKGNvbnN0KSBjYXNlIGNvbnN0OiByZXR1cm4gI2NvbnN0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKgotKiogIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKgotKiogIFN0YXRpYyB2YXJpYWJsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBtYWluX2RvbmUgPSAwOwotc3RhdGljIGludCBzdGF0dXM7Ci0KLSNkZWZpbmUgTEVfQUNMX01BWF9CVUZGX1NJWkUgNDA5Ngotc3RhdGljIGludCBudW1fZnJhbWVzID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdfZGVsYXkgPSAxOyAvKiBEZWZhdWx0IGRlbGF5IGJlZm9yZSBkYXRhIHRyYW5zZmVyICovCi1zdGF0aWMgaW50IGNvdW50ID0gMTsKLXN0YXRpYyB1aW50MTZfdCBnX0JsZUVuY0tleVNpemUgPSAxNjsKLXN0YXRpYyBpbnQgZ19sZV9jb2NfaWYgPSAwOwotc3RhdGljIGludCByY3ZfaXRyYXRpb24gPSAwOwotc3RhdGljIHZvbGF0aWxlIGJvb2wgY29uZ19zdGF0dXMgPSBGQUxTRTsKLQotCi0vKiBNYWluIEFQSSAqLwotY29uc3QgYnRfaW50ZXJmYWNlX3QqIHNCdEludGVyZmFjZSA9IE5VTEw7Ci0KLXN0YXRpYyBnaWRfdCBncm91cHNbXSA9IHsgQUlEX05FVF9CVCwgQUlEX0lORVQsIEFJRF9ORVRfQlRfQURNSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFJRF9TWVNURU0sIEFJRF9NSVNDLCBBSURfU0RDQVJEX1JXLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBSURfTkVUX0FETUlOLCBBSURfVlBOfTsKLQotZW51bSB7Ci0gICBESVNDT05ORUNULAotICAgQ09OTkVDVElORywKLSAgIENPTk5FQ1RFRCwKLSAgIERJU0NPTk5FQ1RJTkcKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ0X2VuYWJsZWQgPSAwOwotc3RhdGljIGludCAgZ19Db25uZWN0aW9uU3RhdGUgICA9IERJU0NPTk5FQ1Q7Ci1zdGF0aWMgaW50ICBnX0FkYXB0ZXJTdGF0ZSAgICAgID0gQlRfU1RBVEVfT0ZGOwotc3RhdGljIGludCAgZ19QYWlyU3RhdGUgICAgICAgICA9IEJUX0JPTkRfU1RBVEVfTk9ORTsKLQotc3RhdGljIGludCAgZ19jb25uX2lkICAgICAgICA9IDA7Ci1zdGF0aWMgaW50ICBnX2NsaWVudF9pZiAgICAgID0gMDsKLXN0YXRpYyBpbnQgIGdfc2VydmVyX2lmICAgICAgPSAwOwotc3RhdGljIGludCAgZ19jbGllbnRfaWZfc2NhbiA9IDA7Ci1zdGF0aWMgaW50ICBnX3NlcnZlcl9pZl9zY2FuID0gMDsKLQotCi1SYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkcmVzczsKLQotc3RhdGljIHVpbnQxNl90IGdfU2VjTGV2ZWwgPSAwOwotc3RhdGljIGJvb2wgZ19Db25uVHlwZSA9IFRSVUU7Ly9EVVQgaXMgaW5pdGlhdGluZyBjb25uZWN0aW9uCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKgotKiogIFN0YXRpYyBmdW5jdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqLwotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NtZChjaGFyICpwLCB1bnNpZ25lZCBjaGFyIGlzX2pvYik7Ci0vL3N0YXRpYyB2b2lkIGpvYl9oYW5kbGVyKHZvaWQgKnBhcmFtKTsKLXN0YXRpYyB2b2lkIGJkdF9sb2coY29uc3QgY2hhciAqZm10X3N0ciwgLi4uKTsKLXN0YXRpYyB2b2lkIGwyY19jb25uZWN0KFJhd0FkZHJlc3MgYmRfYWRkcik7Ci1zdGF0aWMgdWludDE2X3QgZG9fbDJjYXBfY29ubmVjdChSYXdBZGRyZXNzIGJkX2FkZHIpOwotCi1pbnQgR2V0QmRBZGRyKGNoYXIgKnAsIFJhd0FkZHJlc3MqIHBiZF9hZGRyKTsKLXZvaWQgYmR0X2luaXQodm9pZCk7Ci1pbnQgcmVnX2luc3RfaWQgPSAtMTsKLWludCByZWdfc3RhdHVzID0gLTE7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqCi0qKiAgQVNDUyBDbGllbnQgQ2FsbGJhY2tzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioKLSoqICBQQUNTIGNsaWVudCBDYWxsYmFja3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqCi0qKiAgQkFQIFVuaWNhc3QgY2xpZW50IENhbGxiYWNrcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKgotKiogIFNodXRkb3duIGhlbHBlciBmdW5jdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqLwotCi1zdGF0aWMgdm9pZCBiZHRfc2h1dGRvd24odm9pZCkKLXsKLSAgICBiZHRfbG9nKCJzaHV0ZG93biBiZHJvaWQgdGVzdCBhcHAuXG4iKTsKLSAgICBtYWluX2RvbmUgPSAxOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiogQW5kcm9pZCdzIGluaXQucmMgZG9lcyBub3QgeWV0IHN1cHBvcnQgYXBwbHlpbmcgbGludXggY2FwYWJpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY29uZmlnX3Blcm1pc3Npb25zKHZvaWQpCi17Ci0gICAgc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0cnVjdCBoZWFkZXI7Ci0gICAgc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgY2FwWzJdOwotCi0gICAgYmR0X2xvZygic2V0X2FpZF9hbmRfY2FwIDogcGlkICVkLCB1aWQgJWQgZ2lkICVkIiwgZ2V0cGlkKCksIGdldHVpZCgpLCBnZXRnaWQoKSk7Ci0KLSAgICBoZWFkZXIucGlkID0gMDsKLQotICAgIHByY3RsKFBSX1NFVF9LRUVQQ0FQUywgMSwgMCwgMCwgMCk7Ci0KLSAgICBzZXR1aWQoQUlEX0JMVUVUT09USCk7Ci0gICAgc2V0Z2lkKEFJRF9CTFVFVE9PVEgpOwotCi0gICAgaGVhZGVyLnZlcnNpb24gPSBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OXzM7Ci0KLSAgICBjYXBbQ0FQX1RPX0lOREVYKENBUF9ORVRfUkFXKV0ucGVybWl0dGVkIHw9IENBUF9UT19NQVNLKENBUF9ORVRfUkFXKTsKLSAgICBjYXBbQ0FQX1RPX0lOREVYKENBUF9ORVRfQURNSU4pXS5wZXJtaXR0ZWQgfD0gQ0FQX1RPX01BU0soQ0FQX05FVF9BRE1JTik7Ci0gICAgY2FwW0NBUF9UT19JTkRFWChDQVBfTkVUX0JJTkRfU0VSVklDRSldLnBlcm1pdHRlZCB8PSBDQVBfVE9fTUFTSyhDQVBfTkVUX0JJTkRfU0VSVklDRSk7Ci0gICAgY2FwW0NBUF9UT19JTkRFWChDQVBfU1lTX1JBV0lPKV0ucGVybWl0dGVkIHw9IENBUF9UT19NQVNLKENBUF9TWVNfUkFXSU8pOwotICAgIGNhcFtDQVBfVE9fSU5ERVgoQ0FQX1NZU19OSUNFKV0ucGVybWl0dGVkIHw9IENBUF9UT19NQVNLKENBUF9TWVNfTklDRSk7Ci0gICAgY2FwW0NBUF9UT19JTkRFWChDQVBfU0VUR0lEKV0ucGVybWl0dGVkIHw9IENBUF9UT19NQVNLKENBUF9TRVRHSUQpOwotICAgIGNhcFtDQVBfVE9fSU5ERVgoQ0FQX1dBS0VfQUxBUk0pXS5wZXJtaXR0ZWQgfD0gQ0FQX1RPX01BU0soQ0FQX1dBS0VfQUxBUk0pOwotCi0gICAgY2FwW0NBUF9UT19JTkRFWChDQVBfTkVUX1JBVyldLmVmZmVjdGl2ZSB8PSBDQVBfVE9fTUFTSyhDQVBfTkVUX1JBVyk7Ci0gICAgY2FwW0NBUF9UT19JTkRFWChDQVBfTkVUX0FETUlOKV0uZWZmZWN0aXZlIHw9IENBUF9UT19NQVNLKENBUF9ORVRfQURNSU4pOwotICAgIGNhcFtDQVBfVE9fSU5ERVgoQ0FQX05FVF9CSU5EX1NFUlZJQ0UpXS5lZmZlY3RpdmUgfD0gQ0FQX1RPX01BU0soQ0FQX05FVF9CSU5EX1NFUlZJQ0UpOwotICAgIGNhcFtDQVBfVE9fSU5ERVgoQ0FQX1NZU19SQVdJTyldLmVmZmVjdGl2ZSB8PSBDQVBfVE9fTUFTSyhDQVBfU1lTX1JBV0lPKTsKLSAgICBjYXBbQ0FQX1RPX0lOREVYKENBUF9TWVNfTklDRSldLmVmZmVjdGl2ZSB8PSBDQVBfVE9fTUFTSyhDQVBfU1lTX05JQ0UpOwotICAgIGNhcFtDQVBfVE9fSU5ERVgoQ0FQX1NFVEdJRCldLmVmZmVjdGl2ZSB8PSBDQVBfVE9fTUFTSyhDQVBfU0VUR0lEKTsKLSAgICBjYXBbQ0FQX1RPX0lOREVYKENBUF9XQUtFX0FMQVJNKV0uZWZmZWN0aXZlIHw9IENBUF9UT19NQVNLKENBUF9XQUtFX0FMQVJNKTsKLQotICAgIGNhcHNldCgmaGVhZGVyLCAmY2FwWzBdKTsKLSAgICBzZXRncm91cHMoc2l6ZW9mKGdyb3Vwcykvc2l6ZW9mKGdyb3Vwc1swXSksIGdyb3Vwcyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKiAgIExvZ2dlciBBUEkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJkdF9sb2coY29uc3QgY2hhciAqZm10X3N0ciwgLi4uKQotewotICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICB2YV9saXN0IGFwOwotCi0gICAgdmFfc3RhcnQoYXAsIGZtdF9zdHIpOwotICAgIHZzbnByaW50ZihidWZmZXIsIDEwMjQsIGZtdF9zdHIsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotCi0gICAgZnByaW50ZihzdGRvdXQsICIlc1xuIiwgYnVmZmVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotICoqIE1pc2MgaGVscGVyIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IGNoYXIqIGR1bXBfYnRfc3RhdHVzKGludCBzdGF0dXMpCi17Ci0gICAgc3dpdGNoKHN0YXR1cykKLSAgICB7Ci0gICAgICAgIENBU0VfUkVUVVJOX1NUUihCVF9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1NUQVRVU19GQUlMKQotICAgICAgICBDQVNFX1JFVFVSTl9TVFIoQlRfU1RBVFVTX05PVF9SRUFEWSkKLSAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1NUQVRVU19OT01FTSkKLSAgICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJUX1NUQVRVU19CVVNZKQotICAgICAgICBDQVNFX1JFVFVSTl9TVFIoQlRfU1RBVFVTX1VOU1VQUE9SVEVEKQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gInVua25vd24gc3RhdHVzIGNvZGUiOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0gKiogQ29uc29sZSBoZWxwZXIgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgc2tpcF9ibGFua3MoY2hhciAqKnApCi17Ci0gICAgd2hpbGUgKCoqcCA9PSAnICcpCi0gICAgKCpwKSsrOwotfQotCi11aW50MzJfdCBnZXRfaW50KGNoYXIgKipwLCBpbnQgRGVmYXVsdFZhbHVlKQotewotICAgIHVpbnQzMl90IFZhbHVlID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICAgVXNlRGVmYXVsdDsKLQotICAgIFVzZURlZmF1bHQgPSAxOwotICAgIHNraXBfYmxhbmtzKHApOwotCi0gICAgd2hpbGUgKCAoKCoqcCk8PSAnOScgJiYgKCoqcCk+PSAnMCcpICkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgKiAxMCArICgqKnApIC0gJzAnOwotICAgICAgICBVc2VEZWZhdWx0ID0gMDsKLSAgICAgICAgKCpwKSsrOwotICAgIH0KLSAgIGlmIChVc2VEZWZhdWx0KQotICAgICAgIHJldHVybiBEZWZhdWx0VmFsdWU7Ci0gICBlbHNlCi0gICAgICAgcmV0dXJuIFZhbHVlOwotfQotCi1pbnQgZ2V0X3NpZ25lZF9pbnQoY2hhciAqKnAsIGludCBEZWZhdWx0VmFsdWUpCi17Ci0gICAgaW50ICAgIFZhbHVlID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICAgVXNlRGVmYXVsdDsKLSAgICB1bnNpZ25lZCBjaGFyICBOZWdhdGl2ZU51bSA9IDA7Ci0KLSAgICBVc2VEZWZhdWx0ID0gMTsKLSAgICBza2lwX2JsYW5rcyhwKTsKLQotICAgIGlmICgoKipwKSA9PSAnLScpCi0gICAgewotICAgICAgICBOZWdhdGl2ZU51bSA9IDE7Ci0gICAgICAgICgqcCkrKzsKLSAgICB9Ci0gICAgd2hpbGUgKCAoKCoqcCk8PSAnOScgJiYgKCoqcCk+PSAnMCcpICkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgKiAxMCArICgqKnApIC0gJzAnOwotICAgICAgICBVc2VEZWZhdWx0ID0gMDsKLSAgICAgICAgKCpwKSsrOwotICAgIH0KLQotICAgIGlmIChVc2VEZWZhdWx0KQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbHVlOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICgoTmVnYXRpdmVOdW0gPT0gMCk/IFZhbHVlIDogLVZhbHVlKTsKLX0KLQotdm9pZCBnZXRfc3RyXzEoY2hhciAqKnAsIGNoYXIgKkJ1ZmZlcikKLXsKLSAgICBza2lwX2JsYW5rcyhwKTsKLSAgICB3aGlsZSAoKipwICE9IDAgJiYgKipwICE9ICdcMCcpCi0gICAgewotICAgICAgICAqQnVmZmVyID0gKipwOwotICAgICAgICAoKnApKys7Ci0gICAgICAgIEJ1ZmZlcisrOwotICAgIH0KLQotICAgICpCdWZmZXIgPSAwOwotfQotCi12b2lkIGdldF9zdHIoY2hhciAqKnAsIGNoYXIgKkJ1ZmZlcikKLXsKLSAgICBza2lwX2JsYW5rcyhwKTsKLSAgICB3aGlsZSAoKipwICE9IDAgJiYgKipwICE9ICcgJykKLSAgICB7Ci0gICAgICAgICpCdWZmZXIgPSAqKnA7Ci0gICAgICAgICgqcCkrKzsKLSAgICAgICAgQnVmZmVyKys7Ci0gICAgfQotCi0gICAgKkJ1ZmZlciA9IDA7Ci19Ci0KLQotCi0jZGVmaW5lIGlzX2NtZChzdHIpICgoc3RybGVuKHN0cikgPT0gc3RybGVuKGNtZCkpICYmIHN0cm5jbXAoKGNvbnN0IGNoYXIgKikmY21kLCBzdHIsIHN0cmxlbihzdHIpKSA9PSAwKQotI2RlZmluZSBpZl9jbWQoc3RyKSAgaWYgKGlzX2NtZChzdHIpKQotCi10eXBlZGVmIHZvaWQgKHRfY29uc29sZV9jbWRfaGFuZGxlcikgKGNoYXIgKnApOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB0X2NvbnNvbGVfY21kX2hhbmRsZXIgKmhhbmRsZXI7Ci0gICAgY29uc3QgY2hhciAqaGVscDsKLSAgICB1bnNpZ25lZCBjaGFyIGlzX2pvYjsKLX0gdF9jbWQ7Ci0KLXZvaWQgZG9faGVscChjaGFyICpwKTsKLXZvaWQgZG9fcXVpdChjaGFyICpwKTsKLXZvaWQgZG9faW5pdChjaGFyICpwKTsKLXZvaWQgZG9fZW5hYmxlKGNoYXIgKnApOwotdm9pZCBkb19kaXNhYmxlKGNoYXIgKnApOwotdm9pZCBkb19jbGVhbnVwKGNoYXIgKnApOwotdm9pZCBkb19wYWlyaW5nKGNoYXIgKnApOwotdm9pZCBkb19wYWNzX2Rpc2NvdmVyeShjaGFyICpwKTsKLXZvaWQgZG9fYXNjc19kaXNjb3ZlcnkoY2hhciAqcCk7Ci12b2lkIGRvX2JhcF9jb25uZWN0KGNoYXIgKnApOwotdm9pZCBkb19iYXBfZGlzY29ubmVjdChjaGFyICpwKTsKLXZvaWQgZG9fYmFwX3N0YXJ0KGNoYXIgKnApOwotdm9pZCBkb19iYXBfc3RvcChjaGFyICpwKTsKLXZvaWQgZG9fYmFwX2Rpc2NfaW5fY29ubmVjdGluZyhjaGFyICpwKTsKLXZvaWQgZG9fYmFwX2Rpc2NfaW5fc3RhcnRpbmcoY2hhciAqcCk7Ci12b2lkIGRvX2JhcF9kaXNjX2luX3N0b3BwaW5nKGNoYXIgKnApOwotdm9pZCBkb19iYXBfc3RvcF9pbl9zdGFydGluZyhjaGFyICpwKTsKLXZvaWQgZG9fYmFwX3VwZGF0ZV9zdHJlYW0oY2hhciAqcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENPTlNPTEUgQ09NTUFORCBUQUJMRQotICoKLSovCi0KLWNvbnN0IHRfY21kIGNvbnNvbGVfY21kX2xpc3RbXSA9Ci17Ci0gICAgLyoKLSAgICAgKiBJTlRFUk5BTAotICAgICAqLwotCi0gICAgeyAiaGVscCIsIGRvX2hlbHAsICJsaXN0cyBhbGwgYXZhaWxhYmxlIGNvbnNvbGUgY29tbWFuZHMiLCAwIH0sCi0gICAgeyAicXVpdCIsIGRvX3F1aXQsICIiLCAwfSwKLQotICAgIC8qCi0gICAgICogQVBJIENPTlNPTEUgQ09NTUFORFMKLSAgICAgKi8KLQotICAgICAvKiBJbml0IGFuZCBDbGVhbnVwIHNoYWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5ICovCi0gICAgeyAiZW5hYmxlIiwgZG9fZW5hYmxlLCAiY21kIDo6IGVuYWJsZSIsIDAgfSwKLSAgICB7ICJkaXNhYmxlIiwgZG9fZGlzYWJsZSwgImNtZCAgOjogZGlzYWJsZSIsIDAgfSwKLSAgICB7ICJwYWlyIiwgZG9fcGFpcmluZywgImNtZCA6OiBwYWlyIDxCZEFkZHIgYXMgMDAxMTIyMzM0NDU1NjY+IiwgMCB9LAotICAgIHsgInBhY3NfZGlzY292ZXJ5IiwgZG9fcGFjc19kaXNjb3ZlcnksICJjbWQgOjogcGFjc19kaXNjb3ZlcnkgPEJkQWRkcj4iLCAwIH0sCi0gICAgeyAiYXNjc19kaXNjb3ZlcnkiLCBkb19hc2NzX2Rpc2NvdmVyeSwgImNtZCA6OiBhc2NzX2Rpc2NvdmVyeSA8QmRBZGRyPiIsIDAgfSwKLSAgICB7ICJiYXBfY29ubmVjdCIsIGRvX2JhcF9jb25uZWN0LCAiY21kIDo6IGJhcF9jb25uZWN0IDxDb2RlY0NvbmZpZz4gPEF1ZGlvQ29uZmlnPiA8QmRBZGRyPiA8cHJvZmlsZT4gPGRpcmVjdGlvbj4gPGNvbnRleHQ+IiwgMCB9LAotICAgIHsgImJhcF9kaXNjb25uZWN0IiwgZG9fYmFwX2Rpc2Nvbm5lY3QsICJjbWQgOjogYmFwX2Rpc2Nvbm5lY3QgPEJkQWRkcj4gPHByb2ZpbGU+IDxkaXJlY3Rpb24+IDxjb250ZXh0PiIsIDAgfSwKLSAgICB7ICJiYXBfc3RhcnQiLCBkb19iYXBfc3RhcnQsICJjbWQgOjogYmFwX3N0YXJ0IDxCZEFkZHI+IDxwcm9maWxlPiA8ZGlyZWN0aW9uPiA8Y29udGV4dD4iLCAwIH0sCi0gICAgeyAiYmFwX3N0b3AiLCBkb19iYXBfc3RvcCwgImNtZCA6OiBiYXBfc3RvcCA8QmRBZGRyPiA8cHJvZmlsZT4gPGRpcmVjdGlvbj4gPGNvbnRleHQ+IiwgMCB9LAotICAgIHsgImJhcF9kaXNjX2luX2Nvbm5lY3RpbmciLCBkb19iYXBfZGlzY19pbl9jb25uZWN0aW5nLCAiY21kIDo6IGJhcF9kaXNjX2luX2Nvbm5lY3RpbmcgPENvZGVjQ29uZmlnPiA8QXVkaW9Db25maWc+IDxCZEFkZHI+IDxwcm9maWxlPiA8ZGlyZWN0aW9uPiA8Y29udGV4dD4iLCAwIH0sCi0gICAgeyAiYmFwX2Rpc2NfaW5fc3RhcnRpbmciLCBkb19iYXBfZGlzY19pbl9zdGFydGluZywgImNtZCA6OiBiYXBfZGlzY19pbl9zdGFydGluZyA8QmRBZGRyPiA8cHJvZmlsZT4gPGRpcmVjdGlvbj4gPGNvbnRleHQ+IiwgMCB9LAotICAgIHsgImJhcF9kaXNjX2luX3N0b3BwaW5nIiwgZG9fYmFwX2Rpc2NfaW5fc3RvcHBpbmcsICJjbWQgOjogYmFwX2Rpc2NfaW5fc3RvcHBpbmcgPEJkQWRkcj4gPHByb2ZpbGU+IDxkaXJlY3Rpb24+IDxjb250ZXh0PiIsIDAgfSwKLSAgICB7ICJiYXBfc3RvcF9pbl9zdGFydGluZyIsIGRvX2JhcF9zdG9wX2luX3N0YXJ0aW5nLCAiY21kIDo6IGJhcF9zdG9wX2luX3N0YXJ0aW5nIDxCZEFkZHI+IDxwcm9maWxlPiA8ZGlyZWN0aW9uPiA8Y29udGV4dD4iLCAwIH0sCi0gICAgeyAiYmFwX3VwZGF0ZV9zdHJlYW0iLCBkb19iYXBfdXBkYXRlX3N0cmVhbSwgImNtZCA6OiBiYXBfdXBkYXRlX3N0cmVhbSA8QmRBZGRyPiA8cHJvZmlsZT4gPGRpcmVjdGlvbj4gPG5ldyBjb250ZXh0PiIsIDAgfSwKLSAgICAvKiBsYXN0IGVudHJ5ICovCi0gICAge05VTEwsIE5VTEwsICIiLCAwfSwKLX07Ci0KLQotc3RhdGljIGludCBjb25zb2xlX2NtZF9tYXhsZW4gPSAwOwotCi1zdGF0aWMgdm9pZCAqY21kam9iX2hhbmRsZXIodm9pZCAqcGFyYW0pCi17Ci0gICAgY2hhciAqam9iX2NtZCA9IChjaGFyKilwYXJhbTsKLQotICAgIGJkdF9sb2coImNtZGpvYiBzdGFydGluZyAoJXMpIiwgam9iX2NtZCk7Ci0KLSAgICBwcm9jZXNzX2NtZChqb2JfY21kLCAxKTsKLQotICAgIGJkdF9sb2coImNtZGpvYiB0ZXJtaW5hdGluZyIpOwotCi0gICAgZnJlZShqb2JfY21kKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBjcmVhdGVfY21kam9iKGNoYXIgKmNtZCkKLXsKLSAgICBwdGhyZWFkX3QgdGhyZWFkX2lkOwotICAgIGNoYXIgKmpvYl9jbWQ7Ci0KLSAgICBqb2JfY21kID0gKGNoYXIqKWNhbGxvYygxLCBzdHJsZW4oY21kKSsxKTsgLyogZnJlZWQgaW4gam9iIGhhbmRsZXIgKi8KLSAgICBpZiAoam9iX2NtZCkgewotICAgICAgIHN0cmxjcHkoam9iX2NtZCwgY21kLChzdHJsZW4oY21kKSsxKSk7Ci0gICAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfaWQsIE5VTEwsIGNtZGpvYl9oYW5kbGVyLCAodm9pZCAqKWpvYl9jbWQpICE9IDApCi0gICAgICAvKmlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkX2lkLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopY21kam9iX2hhbmRsZXIsICh2b2lkKilqb2JfY21kKSAhPTApKi8KLSAgICAgICAgIHBlcnJvcigicHRocmVhZF9jcmVhdGUiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgcGVycm9yKCJjcmVhdGVfQ21kam9iIG1hbGxvYyBmYWlsZWQgIik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0gKiogTG9hZCBzdGFjayBsaWIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQkxVRVRPT1RIX0xJQlJBUllfTkFNRSAibGliYmx1ZXRvb3RoX3F0aS5zbyIKLWludCBsb2FkX2J0X2xpYihjb25zdCBidF9pbnRlcmZhY2VfdCoqIGludGVyZmFjZSkgewotICAgIGNvbnN0IGNoYXIqIHN5bSA9IEJMVUVUT09USF9JTlRFUkZBQ0VfU1RSSU5HOwotICBidF9pbnRlcmZhY2VfdCogaXRmID0gbnVsbHB0cjsKLQotICAvLyBBbHdheXMgdHJ5IHRvIGxvYWQgdGhlIGRlZmF1bHQgQmx1ZXRvb3RoIHN0YWNrIG9uIEdOIGJ1aWxkcy4KLSAgY29uc3QgY2hhciogcGF0aCA9IEJMVUVUT09USF9MSUJSQVJZX05BTUU7Ci0gIHZvaWQqIGhhbmRsZSA9IGRsb3BlbihwYXRoLCBSVExEX05PVyk7Ci0gIGlmICghaGFuZGxlKSB7Ci0gICAgLy9jb25zdCBjaGFyKiBlcnJfc3RyID0gZGxlcnJvcigpOwotICAgIHByaW50ZigiZmFpbGVkIHRvIGxvYWQgQmx1ZXRvb3RoIGxpYnJhcnlcbiIpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ0X2ludGVyZmFjZV90LgotICBpdGYgPSAoYnRfaW50ZXJmYWNlX3QqKWRsc3ltKGhhbmRsZSwgc3ltKTsKLSAgaWYgKCFpdGYpIHsKLSAgICBwcmludGYoImZhaWxlZCB0byBsb2FkIHN5bWJvbCBmcm9tIEJsdWV0b290aCBsaWJyYXJ5XG4iKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgLy8gU3VjY2Vzcy4KLSAgcHJpbnRmKCIgbG9hZGVkIEhBTCBTdWNjZXNzXG4iKTsKLSAgKmludGVyZmFjZSA9IGl0ZjsKLSAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICAqaW50ZXJmYWNlID0gTlVMTDsKLSAgaWYgKGhhbmRsZSkgZGxjbG9zZShoYW5kbGUpOwotCi0gIHJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgSEFMX2xvYWQodm9pZCkKLXsKLSAgICBpZiAobG9hZF9idF9saWIoKGJ0X2ludGVyZmFjZV90IGNvbnN0KiopJnNCdEludGVyZmFjZSkpIHsKLSAgICAgICAgcHJpbnRmKCJObyBCbHVldG9vdGggTGlicmFyeSBmb3VuZFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBIQUxfdW5sb2FkKHZvaWQpCi17Ci0gICAgaW50IGVyciA9IDA7Ci0KLSAgICBiZHRfbG9nKCJVbmxvYWRpbmcgSEFMIGxpYiIpOwotCi0gICAgc0J0SW50ZXJmYWNlID0gTlVMTDsKLQotICAgIGJkdF9sb2coIkhBTCBsaWJyYXJ5IHVubG9hZGVkICglcykiLCBzdHJlcnJvcihlcnIpKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSAqKiBIQUwgdGVzdCBmdW5jdGlvbnMgJiBjYWxsYmFja3MKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBzZXR1cF90ZXN0X2Vudih2b2lkKQotewotICAgIGludCBpID0gMDsKLQotICAgIHdoaWxlIChjb25zb2xlX2NtZF9saXN0W2ldLm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGNvbnNvbGVfY21kX21heGxlbiA9IE1BWChjb25zb2xlX2NtZF9tYXhsZW4sIChpbnQpc3RybGVuKGNvbnNvbGVfY21kX2xpc3RbaV0ubmFtZSkpOwotICAgICAgICBpKys7Ci0gICAgfQotfQotCi12b2lkIGNoZWNrX3JldHVybl9zdGF0dXMoaW50IHN0YXR1cykKLXsKLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgYmR0X2xvZygiSEFMIFJFUVVFU1QgRkFJTEVEIHN0YXR1cyA6ICVkICglcykiLCBzdGF0dXMsIGR1bXBfYnRfc3RhdHVzKHN0YXR1cykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBiZHRfbG9nKCJIQUwgUkVRVUVTVCBTVUNDRVNTIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBkb19zZXRfbG9jYWxuYW1lKGNoYXIgKnApCi17Ci0gICAgcHJpbnRmKCJzZXQgbmFtZSBpbiBwcm9ncmVzczogJXNcbiIsIHApOwotICAgIGJ0X3Byb3BlcnR5X3QgcHJvcGVydHkgPSB7QlRfUFJPUEVSVFlfQkROQU1FLCBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbihwKSksIHB9OwotICAgIHN0YXR1cyA9ICBzQnRJbnRlcmZhY2UtPnNldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wZXJ0eSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZChidF9zdGF0ZV90IHN0YXRlKQotewotICAgIGludCBWMSA9IDEwMDAsIFYyPTI7Ci0gICAgY2hhciBWM1tdID0gImJhcF91Y2xpZW50X3Rlc3QiOwotICAgIGJ0X3Byb3BlcnR5X3QgcHJvcGVydHkgPSB7KGJ0X3Byb3BlcnR5X3R5cGVfdCk5IC8qCi1CVF9QUk9QRVJUWV9ESVNDT1ZFUllfVElNRU9VVCovLCA0LCAmVjF9OwotICAgIGJ0X3Byb3BlcnR5X3QgcHJvcGVydHkxID0geyhidF9wcm9wZXJ0eV90eXBlX3QpNyAvKlNDQU4qLywgMiwgJlYyfTsKLSAgICBidF9wcm9wZXJ0eV90IHByb3BlcnR5MiA9eyhidF9wcm9wZXJ0eV90eXBlX3QpMSw5LCAmVjN9OwotICAgIHByaW50ZigiQURBUFRFUiBTVEFURSBVUERBVEVEIDogJXNcbiIsIChzdGF0ZSA9PSBCVF9TVEFURV9PRkYpPyJPRkYiOiJPTiIpOwotCi0gICAgZ19BZGFwdGVyU3RhdGUgPSBzdGF0ZTsKLQotICAgIGlmIChzdGF0ZSA9PSBCVF9TVEFURV9PTikgewotICAgICAgICBidF9lbmFibGVkID0gMTsKLSAgICAgICAgc3RhdHVzID0gc0J0SW50ZXJmYWNlLT5zZXRfYWRhcHRlcl9wcm9wZXJ0eSgmcHJvcGVydHkxKTsKLSAgICAgICAgc3RhdHVzID0gc0J0SW50ZXJmYWNlLT5zZXRfYWRhcHRlcl9wcm9wZXJ0eSgmcHJvcGVydHkpOwotICAgICAgICBzdGF0dXMgPSBzQnRJbnRlcmZhY2UtPnNldF9hZGFwdGVyX3Byb3BlcnR5KCZwcm9wZXJ0eTIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0X2VuYWJsZWQgPSAwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWRhcHRlcl9wcm9wZXJ0aWVzX2NoYW5nZWQoYnRfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLCBidF9wcm9wZXJ0eV90ICpwcm9wZXJ0aWVzKQotewotIGNoYXIgQmRfYWRkclsxNV0gPSB7MH07Ci0gICAgaWYoTlVMTCA9PSBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJwcm9wZXJ0aWVzIGlzIG51bGxcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaChwcm9wZXJ0aWVzLT50eXBlKQotICAgIHsKLSAgICBjYXNlIEJUX1BST1BFUlRZX0JEQUREUjoKLSAgICAgICAgbWVtY3B5KEJkX2FkZHIsIHByb3BlcnRpZXMtPnZhbCwgcHJvcGVydGllcy0+bGVuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcHJpbnRmKCJwcm9wZXJ0eSB0eXBlIG5vdCB1c2VkXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZChidF9kaXNjb3Zlcnlfc3RhdGVfdCBzdGF0ZSkKLXsKLSAgICBwcmludGYoIkRpc2NvdmVyeSBTdGF0ZSBVcGRhdGVkIDogJXNcbiIsCi0gICAgICAgICAoc3RhdGUgPT0gQlRfRElTQ09WRVJZX1NUT1BQRUQpPyJTVE9QUEVEIjoiU1RBUlRFRCIpOwotfQotCi0KLXN0YXRpYyB2b2lkIHBpbl9yZXF1ZXN0X2NiKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9iZG5hbWVfdCAqYmRfbmFtZSwKLSAgICAgIHVpbnQzMl90IGNvZCwgYm9vbCBtaW5fMTZfZGlnaXQgKQotewotICAgIHJlbW90ZV9iZF9hZGRyZXNzID0gcmVtb3RlX2JkX2FkZHI7Ci0gICAgLy9idF9waW5fY29kZV90IHBpbmNvZGUgPSB7ezB4MzEsIDB4MzIsIDB4MzMsIDB4MzR9fTsKLSAgICBwcmludGYoIkVudGVyIHRoZSBwaW4ga2V5IGRpc3BsYXllZCBpbiB0aGUgcmVtb3RlIGRldmljZSBhbmQgdGVybWluYXRlIHRoZSBrZXkgZW50cnkgd2l0aCAuXG4iKTsKLQotICAgIC8qaWYoQlRfU1RBVFVTX1NVQ0NFU1MgIT0gc0J0SW50ZXJmYWNlLT5waW5fcmVwbHkocmVtb3RlX2JkX2FkZHIsIFRSVUUsIDQKLSwgJnBpbmNvZGUpKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJQaW4gUmVwbHkgZmFpbGVkXG4iKTsKLSAgICB9Ki8KLX0KLXN0YXRpYyB2b2lkIHNzcF9yZXF1ZXN0X2NiKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9iZG5hbWVfdCAqYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZCwgYnRfc3NwX3ZhcmlhbnRfdCBwYWlyaW5nX3ZhcmlhbnQsCi11aW50MzJfdCBwYXNzX2tleSkKLXsKLSAgICBwcmludGYoInNzcF9yZXF1ZXN0X2NiIDogbmFtZT0lcyB2YXJpYW50PSVkIHBhc3NrZXk9JXVcbiIsIGJkX25hbWUtPm5hbWUsCi1wYWlyaW5nX3ZhcmlhbnQsIHBhc3Nfa2V5KTsKLSAgICBpZihCVF9TVEFUVVNfU1VDQ0VTUyAhPSBzQnRJbnRlcmZhY2UtPnNzcF9yZXBseShyZW1vdGVfYmRfYWRkciwKLXBhaXJpbmdfdmFyaWFudCwgVFJVRSwgcGFzc19rZXkpKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJTU1AgUmVwbHkgZmFpbGVkXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJvbmRfc3RhdGVfY2hhbmdlZF9jYihidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqCi1yZW1vdGVfYmRfYWRkciwgYnRfYm9uZF9zdGF0ZV90IHN0YXRlKQotewotICAgIGdfUGFpclN0YXRlID0gc3RhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjbF9zdGF0ZV9jaGFuZ2VkKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi1idF9hY2xfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2hjaV9lcnJvcl9jb2RlX3QgaGNpX3JlYXNvbikKLXsKLSAgICBwcmludGYoImFjbF9zdGF0ZV9jaGFuZ2VkIDogcmVtb3RlX2JkX2FkZHI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngsIFwKLSAgICAgICAgICAgYWNsIHN0YXR1cz0lcyBcbiIsCi0gICAgcmVtb3RlX2JkX2FkZHItPmFkZHJlc3NbMF0sIHJlbW90ZV9iZF9hZGRyLT5hZGRyZXNzWzFdLCByZW1vdGVfYmRfYWRkci0+YWRkcmVzc1syXSwKLSAgICByZW1vdGVfYmRfYWRkci0+YWRkcmVzc1szXSwgcmVtb3RlX2JkX2FkZHItPmFkZHJlc3NbNF0sIHJlbW90ZV9iZF9hZGRyLT5hZGRyZXNzWzVdLAotICAgIChzdGF0ZSA9PSBCVF9BQ0xfU1RBVEVfQ09OTkVDVEVEKT8iQUNMIENvbm5lY3RlZCIgOiJBQ0wgRGlzY29ubmVjdGVkIik7Ci19Ci1zdGF0aWMgdm9pZCBkdXRfbW9kZV9yZWN2KHVpbnQxNl90IG9wY29kZSwgdWludDhfdCAqYnVmLCB1aW50OF90IGxlbikKLXsKLSAgICBiZHRfbG9nKCJEVVQgTU9ERSBSRUNWIDogTk9UIElNUExFTUVOVEVEIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxlX3Rlc3RfbW9kZShidF9zdGF0dXNfdCBzdGF0dXMsIHVpbnQxNl90IHBhY2tldF9jb3VudCkKLXsKLSAgICBiZHRfbG9nKCJMRSBURVNUIE1PREUgRU5EIHN0YXR1czolcyBudW1iZXJfb2ZfcGFja2V0czolZCIsCi0gICAgICAgICBkdW1wX2J0X3N0YXR1cyhzdGF0dXMpLCBwYWNrZXRfY291bnQpOwotfQotCi1leHRlcm4gaW50IHRpbWVyX2NyZWF0ZSAoY2xvY2tpZF90LCBzdHJ1Y3Qgc2lnZXZlbnQgKl9fcmVzdHJpY3QsIHRpbWVyX3QgKgotX19yZXN0cmljdCk7Ci1leHRlcm4gaW50IHRpbWVyX3NldHRpbWUgKHRpbWVyX3QsIGludCwgY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMgKl9fcmVzdHJpY3QsCi1zdHJ1Y3QgaXRpbWVyc3BlYyAqX19yZXN0cmljdCk7Ci0KLXN0YXRpYyBib29sIHNldF93YWtlX2FsYXJtKHVpbnQ2NF90IGRlbGF5X21pbGxpcywgYm9vbCBzaG91bGRfd2FrZSwgYWxhcm1fY2IKLWNiLCB2b2lkICpkYXRhKQotewotCi0gICBzdGF0aWMgdGltZXJfdCB0aW1lcjsKLSAgIHN0YXRpYyBib29sIHRpbWVyX2NyZWF0ZWQ7Ci0KLSAgIGlmICghdGltZXJfY3JlYXRlZCkgewotICAgICAgc3RydWN0IHNpZ2V2ZW50IHNpZ2V2ZW50OwotICAgICAgbWVtc2V0KCZzaWdldmVudCwgMCwgc2l6ZW9mKHNpZ2V2ZW50KSk7Ci0gICAgICBzaWdldmVudC5zaWdldl9ub3RpZnkgPSBTSUdFVl9USFJFQUQ7Ci0gICAgICBzaWdldmVudC5zaWdldl9ub3RpZnlfZnVuY3Rpb24gPSAodm9pZCAoKikodW5pb24gc2lndmFsKSljYjsKLSAgICAgIHNpZ2V2ZW50LnNpZ2V2X3ZhbHVlLnNpdmFsX3B0ciA9IGRhdGE7Ci0gICAgICB0aW1lcl9jcmVhdGUoQ0xPQ0tfTU9OT1RPTklDLCAmc2lnZXZlbnQsICZ0aW1lcik7Ci0gICAgICB0aW1lcl9jcmVhdGVkID0gdHJ1ZTsKLSAgIH0KLQotICAgc3RydWN0IGl0aW1lcnNwZWMgbmV3X3ZhbHVlOwotICAgbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3NlYyA9IGRlbGF5X21pbGxpcyAvIDEwMDA7Ci0gICBuZXdfdmFsdWUuaXRfdmFsdWUudHZfbnNlYyA9IChkZWxheV9taWxsaXMgJSAxMDAwKSAqIDEwMDAgKiAxMDAwOwotICAgbmV3X3ZhbHVlLml0X2ludGVydmFsLnR2X3NlYyA9IDA7Ci0gICBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfbnNlYyA9IDA7Ci0gICB0aW1lcl9zZXR0aW1lKHRpbWVyLCAwLCAmbmV3X3ZhbHVlLCBOVUxMKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIGludCBhY3F1aXJlX3dha2VfbG9jayhjb25zdCBjaGFyICpsb2NrX25hbWUpCi17Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHJlbGVhc2Vfd2FrZV9sb2NrKGNvbnN0IGNoYXIgKmxvY2tfbmFtZSkKLXsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBidF9jYWxsYmFja3NfdCBidF9jYWxsYmFja3MgPSB7Ci0gICAgc2l6ZW9mKGJ0X2NhbGxiYWNrc190KSwKLSAgICBhZGFwdGVyX3N0YXRlX2NoYW5nZWQsCi0gICAgYWRhcHRlcl9wcm9wZXJ0aWVzX2NoYW5nZWQsIC8qYWRhcHRlcl9wcm9wZXJ0aWVzX2NiICovCi0gICAgTlVMTCwgLyogcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiICovCi0gICAgTlVMTCwgLyogZGV2aWNlX2ZvdW5kX2NiICovCi0gICAgZGlzY292ZXJ5X3N0YXRlX2NoYW5nZWQsIC8qIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiICovCi0gICAgcGluX3JlcXVlc3RfY2IsIC8qIHBpbl9yZXF1ZXN0X2NiICAqLwotICAgIHNzcF9yZXF1ZXN0X2NiLCAvKiBzc3BfcmVxdWVzdF9jYiAgKi8KLSAgICBib25kX3N0YXRlX2NoYW5nZWRfY2IsIC8qYm9uZF9zdGF0ZV9jaGFuZ2VkX2NiICovCi0gICAgYWNsX3N0YXRlX2NoYW5nZWQsIC8qIGFjbF9zdGF0ZV9jaGFuZ2VkX2NiICovCi0gICAgTlVMTCwgLyogdGhyZWFkX2V2dF9jYiAqLwotICAgIGR1dF9tb2RlX3JlY3YsIC8qZHV0X21vZGVfcmVjdl9jYiAqLwotICAgIGxlX3Rlc3RfbW9kZSwgLyogbGVfdGVzdF9tb2RlX2NiICovCi0gICAgTlVMTCAgICAgIC8qZW5lcmd5X2luZm9fY2IqLwotfTsKLQotc3RhdGljIGJ0X29zX2NhbGxvdXRzX3QgYnRfb3NfY2FsbGJhY2tzID0gewotICAgICBzaXplb2YoYnRfb3NfY2FsbG91dHNfdCksCi0gICAgIHNldF93YWtlX2FsYXJtLAotICAgICBhY3F1aXJlX3dha2VfbG9jaywKLSAgICAgcmVsZWFzZV93YWtlX2xvY2sKLX07Ci0KLQotdm9pZCBiZHRfZW5hYmxlKHZvaWQpCi17Ci0gICAgYmR0X2xvZygiRU5BQkxFIEJUIik7Ci0gICAgaWYgKGJ0X2VuYWJsZWQpIHsKLSAgICAgICAgYmR0X2xvZygiQmx1ZXRvb3RoIGlzIGFscmVhZHkgZW5hYmxlZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXR1cyA9IHNCdEludGVyZmFjZS0+ZW5hYmxlKCk7Ci0KLSAgICBjaGVja19yZXR1cm5fc3RhdHVzKHN0YXR1cyk7Ci19Ci0KLXZvaWQgYmR0X2Rpc2FibGUodm9pZCkKLXsKLSAgICBiZHRfbG9nKCJESVNBQkxFIEJUIik7Ci0gICAgaWYgKCFidF9lbmFibGVkKSB7Ci0gICAgICAgIGJkdF9sb2coIkJsdWV0b290aCBpcyBhbHJlYWR5IGRpc2FibGVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdHVzID0gc0J0SW50ZXJmYWNlLT5kaXNhYmxlKCk7Ci0KLSAgICBjaGVja19yZXR1cm5fc3RhdHVzKHN0YXR1cyk7Ci19Ci0KLXZvaWQgZG9fcGFpcmluZyhjaGFyICpwKQotewotICAgIFJhd0FkZHJlc3MgYmRfYWRkciA9IHt7MH19OwotICAgIGludCB0cmFuc3BvcnQgPSBHQVRUX1RSQU5TUE9SVF9MRTsKLSAgICBpZihGQUxTRSA9PSBHZXRCZEFkZHIocCwgJmJkX2FkZHIpKSAgICByZXR1cm47ICAgIC8vIGFyZzEKLSAgICBpZihCVF9TVEFUVVNfU1VDQ0VTUyAhPSBzQnRJbnRlcmZhY2UtPmNyZWF0ZV9ib25kKCZiZF9hZGRyLCB0cmFuc3BvcnQpKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gSW5pdGlhdGUgUGFpcmluZyBcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi0KLXZvaWQgYmR0X2NsZWFudXAodm9pZCkKLXsKLSAgICBiZHRfbG9nKCJDTEVBTlVQIik7Ci0gICAgc0J0SW50ZXJmYWNlLT5jbGVhbnVwKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSAqKiBDb25zb2xlIGNvbW1hbmRzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgZG9faGVscChjaGFyICpwKQotewotICAgIGludCBpID0gMDsKLSAgICBjaGFyIGxpbmVbMTI4XTsKLS8vICAgIGludCBwb3MgPSAwOwotCi0gICAgd2hpbGUgKGNvbnNvbGVfY21kX2xpc3RbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgc25wcmludGYobGluZSwgMTI4LCIlcyIsIChjaGFyKiljb25zb2xlX2NtZF9saXN0W2ldLm5hbWUpOwotICAgICAgICBiZHRfbG9nKCIlcyAlc1xuIiwgKGNoYXIqKWxpbmUsIChjaGFyKiljb25zb2xlX2NtZF9saXN0W2ldLmhlbHApOwotICAgICAgICBpKys7Ci0gICAgfQotfQotCi12b2lkIGRvX3F1aXQoY2hhciAqcCkKLXsKLSAgICBiZHRfc2h1dGRvd24oKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQlQgVEVTVCAgQ09OU09MRSBDT01NQU5EUwotICoKLSAqICBQYXJzZXMgYXJndW1lbnQgbGlzdHMgYW5kIHBhc3NlcyB0byBBUEkgdGVzdCBmdW5jdGlvbgotICoKLSovCi0KLXZvaWQgZG9faW5pdChjaGFyICpwKQotewotICAgIGJkdF9pbml0KCk7Ci19Ci0KLXZvaWQgZG9fZW5hYmxlKGNoYXIgKnApCi17Ci0gICAgYmR0X2VuYWJsZSgpOwotfQotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudEludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50Q2FsbGJhY2tzOwotCi1zdGF0aWMgUGFjc0NsaWVudEludGVyZmFjZSogc1BhY3NDbGllbnRJbnRlcmZhY2UgPSBudWxscHRyOwotc3RhdGljIHVpbnQxNl90IHBhY3NfY2xpZW50X2lkID0gMDsKLXN0YXRpYyB1aW50OF90IHBhY3NTZWFyY2hDb21wbGV0ZSA9IDA7Ci1zdGF0aWMgdWludDhfdCBwYWNzQ29ubmVjdGlvbkNvbXBsZXRlID0gMDsKLXN0YXRpYyB1aW50OF90IGJhcENvbm5lY3Rpb25Db21wbGV0ZSA9IDA7Ci1zdGF0aWMgUmF3QWRkcmVzcyBwYWNfYmRfYWRkcjsKLQotY2xhc3MgUGFjc0NsaWVudENhbGxiYWNrc0ltcGwgOiBwdWJsaWMgUGFjc0NsaWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB+UGFjc0NsaWVudENhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgT25Jbml0aWFsaXplZChpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudF9pZCkgb3ZlcnJpZGUgewotICAgIHByaW50ZigiJWRcbiIsIGNsaWVudF9pZCk7Ci0gICAgcGFjc19jbGllbnRfaWQgPSBjbGllbnRfaWQ7Ci0gIH0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb25uZWN0aW9uU3RhdGUgc3RhdGUpCi1vdmVycmlkZSB7Ci0gICAgcHJpbnRmKCIlc1xuIiwgX19mdW5jX18pOwotICAgIGlmKHN0YXRlID09IGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCkgIHsKLSAgICAgIHByaW50ZigiJXMgQ29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICBwYWNzQ29ubmVjdGlvbkNvbXBsZXRlID0gMTsKLSAgICB9IGVsc2UgaWYoc3RhdGUgPT0gYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKSAgewotICAgICAgcHJpbnRmKCIlcyBEaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBPbkF1ZGlvQ29udGV4dEF2YWlsYWJsZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzKSBvdmVycmlkZSB7Ci0gICAgcHJpbnRmKCIlc1xuIiwgX19mdW5jX18pOwotICB9Ci0gICB2b2lkIE9uU2VhcmNoQ29tcGxldGUoaW50IHN0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZz4gc2lua19wYWNfcmVjb3JkcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZz4gc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgdWludDMyX3Qgc2lua19sb2NhdGlvbnMsCi0gICAgICAgICAgICB1aW50MzJfdCBzcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgdWludDMyX3Qgc3VwcG9ydGVkX2NvbnRleHRzKSBvdmVycmlkZSB7Ci0gICAgcGFjc1NlYXJjaENvbXBsZXRlID0gMTsKLSAgICBwcmludGYoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0gIH0KLX07Ci0KLXN0YXRpYyBQYWNzQ2xpZW50Q2FsbGJhY2tzSW1wbCBzUGFjc0NsaWVudENhbGxiYWNrczsKLQotdm9pZCBkb19wYWNzX2Rpc2NvdmVyeShjaGFyICpwKQotewotICBpZihGQUxTRSA9PSBHZXRCZEFkZHIocCwgJnBhY19iZF9hZGRyKSkgICAgcmV0dXJuOyAgICAvLyBhcmcxCi0gIHNQYWNzQ2xpZW50SW50ZXJmYWNlID0gKFBhY3NDbGllbnRJbnRlcmZhY2UqKQotICAgICAgICBzQnRJbnRlcmZhY2UtPmdldF9wcm9maWxlX2ludGVyZmFjZShCVF9QUk9GSUxFX1BBQ1NfQ0xJRU5UX0lEKTsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkluaXQoJnNQYWNzQ2xpZW50Q2FsbGJhY2tzKTsKLSAgc2xlZXAoMSk7Ci0gIHByaW50ZigiJXMgZ29pbmcgZm9yIGNvbm5lY3RcbiIsIF9fZnVuY19fKTsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QocGFjc19jbGllbnRfaWQsIHBhY19iZF9hZGRyKTsKLSAgd2hpbGUoIXBhY3NDb25uZWN0aW9uQ29tcGxldGUpIHNsZWVwKDEpOwotICBwcmludGYoIiVzIGdvaW5nIGZvciBkaXNjb3ZlcnlcbiIsIF9fZnVuY19fKTsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPlN0YXJ0RGlzY292ZXJ5KHBhY3NfY2xpZW50X2lkLCBwYWNfYmRfYWRkcik7Ci0gIHdoaWxlKCFwYWNzU2VhcmNoQ29tcGxldGUpIHNsZWVwKDEpOwotICBwcmludGYoIiVzIGdvaW5nIGZvciBkaXNjb25uZWN0XG4iLCBfX2Z1bmNfXyk7Ci0gIHNsZWVwKDUpOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdChwYWNzX2NsaWVudF9pZCwgcGFjX2JkX2FkZHIpOwotfQotCi11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNjc0NsaWVudEludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2NzQ2xpZW50Q2FsbGJhY2tzOwotCi1zdGF0aWMgQXNjc0NsaWVudEludGVyZmFjZSogc0FzY3NDbGllbnRJbnRlcmZhY2UgPSBudWxscHRyOwotc3RhdGljIHVpbnQxNl90IGFzY3NfY2xpZW50X2lkID0gMDsKLXN0YXRpYyB1aW50OF90IGFzY3NTZWFyY2hDb21wbGV0ZSA9IDA7Ci1zdGF0aWMgdWludDhfdCBhc2NzQ29ubmVjdGlvbkNvbXBsZXRlID0gMDsKLXN0YXRpYyBSYXdBZGRyZXNzIGFzY3NfYmRfYWRkcjsKLQotY2xhc3MgQXNjc0NsaWVudENhbGxiYWNrc0ltcGwgOiBwdWJsaWMgQXNjc0NsaWVudENhbGxiYWNrcyB7Ci0gIHB1YmxpYzoKLSAgICB+QXNjc0NsaWVudENhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gICAgdm9pZCBPbkFzY3NJbml0aWFsaXplZChpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgICAgIHByaW50ZigiJWRcbiIsIGNsaWVudF9pZCk7Ci0gICAgICAgIGFzY3NfY2xpZW50X2lkID0gY2xpZW50X2lkOwotICAgIH0KLQotICAgIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkdhdHRTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgICAgICBwcmludGYoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGlmKHN0YXRlID09IGJsdWV0b290aDo6YmFwOjphc2NzOjpHYXR0U3RhdGU6OkNPTk5FQ1RFRCkgIHsKLSAgICAgICAgICBwcmludGYoIiVzIENvbm5lY3RlZFxuIiwgX19mdW5jX18pOwotICAgICAgICAgIGFzY3NDb25uZWN0aW9uQ29tcGxldGUgPSAxOwotICAgICAgICB9IGVsc2UgaWYoc3RhdGUgPT0gYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkdhdHRTdGF0ZTo6RElTQ09OTkVDVEVEKSAgewotICAgICAgICAgIHByaW50ZigiJXMgRGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIE9uQXNlT3BGYWlsZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZU9wSWQgYXNlX29wX2lkLAotICAgICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlT3BTdGF0dXM+IHN0YXR1cykgewotICAgICAgICBwcmludGYoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLSAgICB9Ci0KLSAgICB2b2lkIE9uQXNlU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZVBhcmFtcyBhc2UpIG92ZXJyaWRlIHsKLSAgICAgICAgcHJpbnRmKCIlc1xuIiwgX19mdW5jX18pOwotICAgIH0KLQotICAgIHZvaWQgT25TZWFyY2hDb21wbGV0ZShpbnQgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlUGFyYW1zPiBzaW5rX2FzZV9saXN0LAotICAgICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlUGFyYW1zPiBzcmNfYXNlX2xpc3QpIG92ZXJyaWRlIHsKLSAgICAgICAgcHJpbnRmKCIlc1xuIiwgX19mdW5jX18pOwotICAgICAgICBhc2NzU2VhcmNoQ29tcGxldGUgPSAxOwotICAgIH0KLX07Ci0KLXN0YXRpYyBBc2NzQ2xpZW50Q2FsbGJhY2tzSW1wbCBzQXNjc0NsaWVudENhbGxiYWNrczsKLQotdm9pZCBkb19hc2NzX2Rpc2NvdmVyeShjaGFyICpwKQotewotICBpZihGQUxTRSA9PSBHZXRCZEFkZHIocCwgJmFzY3NfYmRfYWRkcikpICAgIHJldHVybjsgICAgLy8gYXJnMQotICBzQXNjc0NsaWVudEludGVyZmFjZSA9IChBc2NzQ2xpZW50SW50ZXJmYWNlKikKLSAgICAgICAgc0J0SW50ZXJmYWNlLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoQlRfUFJPRklMRV9BU0NTX0NMSUVOVF9JRCk7Ci0gIHNBc2NzQ2xpZW50SW50ZXJmYWNlLT5Jbml0KCZzQXNjc0NsaWVudENhbGxiYWNrcyk7Ci0gIHNsZWVwKDEpOwotICBwcmludGYoIiVzIGdvaW5nIGZvciBjb25uZWN0XG4iLCBfX2Z1bmNfXyk7Ci0gIHNBc2NzQ2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KGFzY3NfY2xpZW50X2lkLCBhc2NzX2JkX2FkZHIpOwotICB3aGlsZSghYXNjc0Nvbm5lY3Rpb25Db21wbGV0ZSkgc2xlZXAoMSk7Ci0gIHByaW50ZigiJXMgZ29pbmcgZm9yIGRpc2NvdmVyeVxuIiwgX19mdW5jX18pOwotICBzQXNjc0NsaWVudEludGVyZmFjZS0+U3RhcnREaXNjb3ZlcnkoYXNjc19jbGllbnRfaWQsIGFzY3NfYmRfYWRkcik7Ci0gIHdoaWxlKCFhc2NzU2VhcmNoQ29tcGxldGUpIHNsZWVwKDEpOwotICBwcmludGYoIiVzIGdvaW5nIGZvciBkaXNjb25uZWN0XG4iLCBfX2Z1bmNfXyk7Ci0gIHNBc2NzQ2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KGFzY3NfY2xpZW50X2lkLCBhc2NzX2JkX2FkZHIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIGxvZ2hleChUIHgpIHsKLSAgIHN0ZDo6c3RyaW5nc3RyZWFtIHRtcDsKLSAgIHRtcCA8PCAiMHgiIDw8IHN0ZDo6aW50ZXJuYWwgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykKLSAgICAgICA8PCBzdGQ6OnNldHcoc2l6ZW9mKFQpICogMikgPDwgKHVuc2lnbmVkIGludCl4OwotICAgcmV0dXJuIHRtcC5zdHIoKTsKLX0KLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpVY2FzdENsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VWNhc3RDbGllbnRJbnRlcmZhY2U7Ci0KLXN0YXRpYyBVY2FzdENsaWVudEludGVyZmFjZSogc1VjYXN0Q2xpZW50SW50ZXJmYWNlID0gbnVsbHB0cjsKLQotY2xhc3MgVWNhc3RDbGllbnRDYWxsYmFja3NJbXBsIDogcHVibGljIFVjYXN0Q2xpZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIH5VY2FzdENsaWVudENhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgT25TdHJlYW1TdGF0ZShjb25zdCBSYXdBZGRyZXNzICZhZGRyZXNzLAotICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1TdGF0ZUluZm8+IHN0cmVhbXNfc3RhdGVfaW5mbykgb3ZlcnJpZGUgewotICAgIGZvciAoYXV0byBpdCA9IHN0cmVhbXNfc3RhdGVfaW5mby5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHN0cmVhbXNfc3RhdGVfaW5mby5lbmQoKTsgaXQrKykgewotICAgICAgcHJpbnRmKCIlcyBzdHJlYW0gdHlwZSAlZFxuIiwgX19mdW5jX18sIChpdC0+c3RyZWFtX3R5cGUudHlwZSkpOwotICAgICAgcHJpbnRmKCIlcyBzdHJlYW0gZGlyICVzXG4iLCBfX2Z1bmNfXywgbG9naGV4KGl0LT5zdHJlYW1fdHlwZS5kaXJlY3Rpb24pLmNfc3RyKCkpOwotICAgICAgcHJpbnRmKCIlcyBzdHJlYW0gc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0aWNfY2FzdDxpbnQ+IChpdC0+c3RyZWFtX3N0YXRlKSk7Ci0gICAgICBpZihzdGF0aWNfY2FzdDxpbnQ+IChpdC0+c3RyZWFtX3N0YXRlKSA9PSAyIHx8Ci0gICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+IChpdC0+c3RyZWFtX3N0YXRlKSA9PSAwKSB7Ci0gICAgICAgIGJhcENvbm5lY3Rpb25Db21wbGV0ZSA9IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHZvaWQgT25TdHJlYW1Db25maWcoY29uc3QgUmF3QWRkcmVzcyAmYWRkcmVzcywKLSAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtQ29uZmlnSW5mbz4gc3RyZWFtc19jb25maWdfaW5mbykgb3ZlcnJpZGUgewotICAgIHByaW50ZigiJXNcbiIsX19mdW5jX18pOwotICB9Ci0gIHZvaWQgT25TdHJlYW1BdmFpbGFibGUoY29uc3QgUmF3QWRkcmVzcyAmYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcmNfYXVkaW9fY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2lua19hdWRpb19jb250ZXh0cykgIG92ZXJyaWRlIHsKLSAgICBwcmludGYoIiVzXG4iLF9fZnVuY19fKTsKLSAgfQotfTsKLQotc3RhdGljIFVjYXN0Q2xpZW50Q2FsbGJhY2tzSW1wbCBzVWNhc3RDbGllbnRDYWxsYmFja3M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyIGJkQWRkclsxM107Ci0gICAgdWludDE2X3QgcHJvZmlsZTsKLSAgICB1aW50MTZfdCBjb250ZXh0OwotICAgIHVpbnQ4X3QgZGlyZWN0aW9uOwotfSBTZXJ2ZXJzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDhfdCBjbnQ7Ci0gICAgY2hhciBjb2RlY0NvbmZpZ1s3XTsKLSAgICBjaGFyIGF1ZGlvQ29uZmlnWzVdOwotICAgIHN0ZDo6dmVjdG9yPFNlcnZlcnM+IHNlcnY7Ci19IFVzZXJQYXJtczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgYXVkaW9fZGlyOwotICAgIHVpbnQ4X3Qgc3RlcmVvOwotfSBBdWRpb1R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1aW50OF90IG51bV9zZXJ2ZXJzOwotICAgIHVpbnQ4X3QgbnVtX2Npc2VzOwotICAgIHN0ZDo6dmVjdG9yPEF1ZGlvVHlwZT4gYXVkaW9fdHlwZTsKLX0gQXVkaW9Db25maWdTZXR0aW5nczsKLQotLy8KLQotc3RkOjptYXA8c3RkOjpzdHJpbmcsIEF1ZGlvQ29uZmlnU2V0dGluZ3M+IGF1ZGlvQ29uZmlnTWFwID0gewotIHsiMV8xIiwgezEsIDEsIHt7QVNFX0RJUkVDVElPTl9TSU5LLCAwfX19fSwgIC8vIEVCIHN0cmVhbWluZwotIHsiMl8xIiwgezEsIDEsIHt7QVNFX0RJUkVDVElPTl9TUkMsIDB9fX19LCAgIC8vIEVCIFJlY29yZGluZwotIHsiM18xIiwgezEsIDEsIHt7QVNFX0RJUkVDVElPTl9TUkN8QVNFX0RJUkVDVElPTl9TSU5LLCAwfX19fSwgLy8gRUIgQ2FsbCBNb25vIEJpLURpciBDSVMKLSB7IjRfMSIsIHsxLCAxLCB7e0FTRV9ESVJFQ1RJT05fU0lOSywgQVNFX1NJTktfU1RFUkVPfX19fSwgLy8gU3RlcmVvIEhlYWRzZXQgc3RlcmVvIHN0cmVhbWluZwotCi0geyI1XzEiLCB7MSwgMSwge3tBU0VfRElSRUNUSU9OX1NSQ3xBU0VfRElSRUNUSU9OX1NJTkssIEFTRV9TSU5LX1NURVJFT319fX0sIC8vIEVCIENhbGwgd2l0aCBzcGVha2VyIHN0ZXJlbyAgbW9ubyBtaWMKLQotIHsiNl8xIiwgezEsIDIsIHt7QVNFX0RJUkVDVElPTl9TSU5LLCAwfSwge0FTRV9ESVJFQ1RJT05fU0lOSywgMH19fX0sIC8vIFRXTSBTdHJlYW1pbmcKLSB7IjZfMiIsIHsyLCAyLCB7e0FTRV9ESVJFQ1RJT05fU0lOSywgMH0sIHtBU0VfRElSRUNUSU9OX1NJTkssIDB9fX19LCAvLyBFQlAgU3RyZWFtaW5nIHNhbWUgYXMgMV8xCi0geyI3XzEiLCB7MSwgMiwge3tBU0VfRElSRUNUSU9OX1NJTkssIDB9LCB7QVNFX0RJUkVDVElPTl9TUkMsIDB9fX19LCAgLy8gRUIgQ2FsbCB3aXRoIGR1YWwgQ0lTICggc2FtZSBhcyAzXzEpCi0geyI3XzIiLCB7MiwgMiwge3tBU0VfRElSRUNUSU9OX1NJTkssIDB9LCB7QVNFX0RJUkVDVElPTl9TUkMsIDB9fX19LCAgLy8gRUJQIENhbGwgd2l0aCBzcGVha2VyIG9uIEVCMSBhbmQgbWljIG9uIEVCMgotIHsiOF8xIiwgezEsIDIsIHt7QVNFX0RJUkVDVElPTl9TSU5LLCAwfSwge0FTRV9ESVJFQ1RJT05fU1JDfEFTRV9ESVJFQ1RJT05fU0lOSywgMH19fX0sIC8vIEhlYWRzZXQgQ2FsbCB3aXRoIHNpbmdsZSBtaWMKLSB7IjhfMiIsIHsyLCAyLCB7e0FTRV9ESVJFQ1RJT05fU1JDfEFTRV9ESVJFQ1RJT05fU0lOSywgMH0sIHtBU0VfRElSRUNUSU9OX1NJTkssIDB9fX19LCAvLyBFQlAgQ2FsbCB3aXRoIG1pYyBmcm9tIG9uZSBFQgotIHsiOV8xIiwgezEsIDIsIHt7QVNFX0RJUkVDVElPTl9TUkMsIDB9LCB7QVNFX0RJUkVDVElPTl9TUkMsIDB9fX19LCAvLyBUV00gUmVjb3JkaW5nCi0geyI5XzIiLCB7MiwgMiwge3tBU0VfRElSRUNUSU9OX1NSQywgMH0sIHtBU0VfRElSRUNUSU9OX1NSQywgMH19fX0sIC8vIEVCUCBSZWNvcmRpbmcKLXsiMTBfMSIsIHsxLCAxLCB7e0FTRV9ESVJFQ1RJT05fU1JDLCBBU0VfU1JDX1NURVJFT319fX0sIC8vIEVCIHN0ZXJlbyBSZWNvcmRpbmcKLXsiMTFfMSIsIHsxLCAyLCB7e0FTRV9ESVJFQ1RJT05fU1JDfEFTRV9ESVJFQ1RJT05fU0lOSywgMH0sIHtBU0VfRElSRUNUSU9OX1NSQ3xBU0VfRElSRUNUSU9OX1NJTkssIDB9fX19LCAvLyBUV00gQ2FsbAoteyIxMV8yIiwgezIsIDIsIHt7QVNFX0RJUkVDVElPTl9TUkN8QVNFX0RJUkVDVElPTl9TSU5LLCAwfSwge0FTRV9ESVJFQ1RJT05fU1JDfEFTRV9ESVJFQ1RJT05fU0lOSywgMH19fX19OyAvLyBFQlAgQ2FsbAotCi1pbnQgZ2V0SW50KHN0ZDo6c3RyaW5nICZzdHIpCi17Ci0gICAgaW50IHJldDsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpbnRlZ2VyKHN0cik7Ci0gICAgaW50ZWdlciA+PiByZXQ7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBwYXJzZV9wYXJtcyhjaGFyICpwLCBVc2VyUGFybXMgKnB0cikKLXsKLSAgICBzdGQ6OnN0cmluZyBsaW5lKHApOwotICAgIHN0ZDo6dmVjdG9yIDxzdGQ6OnN0cmluZz4gdG9rZW47Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gY2hlY2sxKGxpbmUpOwotICAgIHN0ZDo6c3RyaW5nIGludGVybWVkaWF0ZTsKLSAgICB3aGlsZShnZXRsaW5lKGNoZWNrMSwgaW50ZXJtZWRpYXRlLCAnICcpKQotICAgIHsKLSAgICAgICAgdG9rZW4ucHVzaF9iYWNrKGludGVybWVkaWF0ZSk7Ci0gICAgfQotICAgIHB0ci0+Y250ID0gdG9rZW4uc2l6ZSgpOwotICAgIGlmIChwdHItPmNudCA9PSAxMSkKLSAgICB7Ci0gICAgICAgIG1lbWNweShwdHItPmNvZGVjQ29uZmlnLCB0b2tlblsxXS5jX3N0cigpLCB0b2tlblsxXS5zaXplKCkpOwotICAgICAgICBtZW1jcHkocHRyLT5hdWRpb0NvbmZpZywgdG9rZW5bMl0uY19zdHIoKSwgdG9rZW5bMl0uc2l6ZSgpKTsKLSAgICAgICAgU2VydmVycyBzZXJ2MSwgc2VydjI7Ci0gICAgICAgIG1lbWNweShzZXJ2MS5iZEFkZHIsIHRva2VuWzNdLmNfc3RyKCksIHRva2VuWzNdLnNpemUoKSk7Ci0gICAgICAgIHNlcnYxLnByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzRdKSk7Ci0gICAgICAgIHNlcnYxLmRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bNV0pKTsKLSAgICAgICAgc2VydjEuY29udGV4dCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bNl0pKTsKLSAgICAgICAgcHRyLT5zZXJ2LnB1c2hfYmFjayhzZXJ2MSk7Ci0gICAgICAgIG1lbWNweShzZXJ2Mi5iZEFkZHIsIHRva2VuWzddLmNfc3RyKCksIHRva2VuWzddLnNpemUoKSk7Ci0gICAgICAgIHNlcnYyLnByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzhdKSk7Ci0gICAgICAgIHNlcnYyLmRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bOV0pKTsKLSAgICAgICAgc2VydjIuY29udGV4dCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bMTBdKSk7Ci0gICAgICAgIHB0ci0+c2Vydi5wdXNoX2JhY2soc2VydjIpOwotICAgIH0KLSAgICBlbHNlIGlmIChwdHItPmNudCA9PSA5KQotICAgIHsKLSAgICAgICAgU2VydmVycyBzZXJ2MSwgc2VydjI7Ci0gICAgICAgIG1lbWNweShzZXJ2MS5iZEFkZHIsIHRva2VuWzFdLmNfc3RyKCksIHRva2VuWzFdLnNpemUoKSk7Ci0gICAgICAgIHNlcnYxLnByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzJdKSk7Ci0gICAgICAgIHNlcnYxLmRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bM10pKTsKLSAgICAgICAgc2VydjEuY29udGV4dCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bNF0pKTsKLSAgICAgICAgcHRyLT5zZXJ2LnB1c2hfYmFjayhzZXJ2MSk7Ci0gICAgICAgIG1lbWNweShzZXJ2Mi5iZEFkZHIsIHRva2VuWzVdLmNfc3RyKCksIHRva2VuWzVdLnNpemUoKSk7Ci0gICAgICAgIHNlcnYyLnByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzZdKSk7Ci0gICAgICAgIHNlcnYyLmRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bN10pKTsKLSAgICAgICAgc2VydjIuY29udGV4dCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bOF0pKTsKLSAgICAgICAgcHRyLT5zZXJ2LnB1c2hfYmFjayhzZXJ2Mik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHB0ci0+Y250ID09IDcpCi0gICAgewotICAgICAgICBtZW1jcHkocHRyLT5jb2RlY0NvbmZpZywgdG9rZW5bMV0uY19zdHIoKSwgdG9rZW5bMV0uc2l6ZSgpKTsKLSAgICAgICAgbWVtY3B5KHB0ci0+YXVkaW9Db25maWcsIHRva2VuWzJdLmNfc3RyKCksIHRva2VuWzJdLnNpemUoKSk7Ci0gICAgICAgIFNlcnZlcnMgc2VydjE7Ci0gICAgICAgIG1lbWNweShzZXJ2MS5iZEFkZHIsIHRva2VuWzNdLmNfc3RyKCksIHRva2VuWzNdLnNpemUoKSk7Ci0gICAgICAgIHNlcnYxLnByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzRdKSk7Ci0gICAgICAgIHNlcnYxLmRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bNV0pKTsKLSAgICAgICAgc2VydjEuY29udGV4dCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihnZXRJbnQodG9rZW5bNl0pKTsKLSAgICAgICAgcHRyLT5zZXJ2LnB1c2hfYmFjayhzZXJ2MSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHB0ci0+Y250ID09IDUpCi0gICAgewotICAgICAgICBTZXJ2ZXJzIHNlcnYxOwotICAgICAgICBtZW1jcHkoc2VydjEuYmRBZGRyLCB0b2tlblsxXS5jX3N0cigpLCB0b2tlblsxXS5zaXplKCkpOwotICAgICAgICBzZXJ2MS5wcm9maWxlID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGdldEludCh0b2tlblsyXSkpOwotICAgICAgICBzZXJ2MS5kaXJlY3Rpb24gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzNdKSk7Ci0gICAgICAgIHNlcnYxLmNvbnRleHQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZ2V0SW50KHRva2VuWzRdKSk7Ci0gICAgICAgIHB0ci0+c2Vydi5wdXNoX2JhY2soc2VydjEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcmludGYoIiVzIEVSUk9SOiBJbnB1dFxuIiwgX19mdW5jX18pOwotICAgIH0KLX0KLQotY29uc3RleHByIHVpbnQ4X3QgIENPTkZJR19GUkFNRV9EVVJfSU5ERVggICAgICAgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3QgIENPTkZJR19PQ1RTX1BFUl9GUkFNRV9JTkRFWCAgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3QgIENPTkZJR19QUkVGX0FVRElPX0NPTlRfSU5ERVggPSAweDA2OyAvLyBDUzEKLQotYm9vbCBVcGRhdGVGcmFtZUR1cmF0aW9uKGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZyAqY29uZmlnICwKLSAgICAgICAgIHVpbnQ4X3QgZnJhbWVfZHVyKSB7Ci0gICB1aW50NjRfdCB2YWx1ZSA9IDB4RkY7Ci0gICBjb25maWctPmNvZGVjX3NwZWNpZmljXzEgJj0KLSAgICAgICB+KHZhbHVlIDw8IChDT05GSUdfRlJBTUVfRFVSX0lOREVYKjgpKTsKLSAgIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSB8PQotICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZV9kdXIpIDw8IChDT05GSUdfRlJBTUVfRFVSX0lOREVYICogOCk7Ci0gICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIFVwZGF0ZVByZWZlcnJlZEF1ZGlvQ29udGV4dChibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDb25maWcgKmNvbmZpZyAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcmVmX2F1ZGlvX2NvbnRleHQpIHsKLSAgdWludDY0X3QgdmFsdWUgPSAweEZGRkY7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSAmPSB+KHZhbHVlIDw8IChDT05GSUdfUFJFRl9BVURJT19DT05UX0lOREVYKjgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xIHw9ICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocHJlZl9hdWRpb19jb250ZXh0KSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfUFJFRl9BVURJT19DT05UX0lOREVYICogOCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVwZGF0ZU9jdHNQZXJGcmFtZShibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDb25maWcgKmNvbmZpZyAsCi0gICAgICAgIHVpbnQxNl90IG9jdHNfcGVyX2ZyYW1lKSB7Ci0gICAgdWludDY0X3QgdmFsdWUgPSAweEZGRkY7Ci0gICAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18yICY9Ci0gICAgICAgIH4odmFsdWUgPDwgKENPTkZJR19PQ1RTX1BFUl9GUkFNRV9JTkRFWCAqIDgpKTsKLSAgICBjb25maWctPmNvZGVjX3NwZWNpZmljXzIgfD0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG9jdHNfcGVyX2ZyYW1lKSA8PCAoQ09ORklHX09DVFNfUEVSX0ZSQU1FX0lOREVYICogOCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgc2V0X2Nvbm5faW5mbyhibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbUNvbm5lY3QgKmNvbm5faW5mbywgaW50IHR5cGUsIGludCBjb250ZXh0LCBpbnQgZGlyKQotewotICAgIGNvbm5faW5mby0+c3RyZWFtX3R5cGUudHlwZSA9IHR5cGU7Ci0gICAgY29ubl9pbmZvLT5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBkaXI7Ci0gICAgY29ubl9pbmZvLT5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gY29udGV4dDsKLX0KLQotYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZSBnZXRfc2FtcGxlX3JhdGUgKGNoYXIgKnApCi17Ci0gICAgc3RkOjpzdHJpbmcgc3RyID0gcDsKLSAgICBpZiAoc3RyLmZpbmQoIjE2XyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQotICAgICAgICByZXR1cm4gYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTYwMDA7Ci0gICAgZWxzZSBpZiAoc3RyLmZpbmQoIjI0XyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQotICAgICAgICByZXR1cm4gYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDA7Ci0gICAgZWxzZSBpZiAoc3RyLmZpbmQoIjMyXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQotICAgICAgICByZXR1cm4gYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDA7Ci0gICAgZWxzZSBpZiAoc3RyLmZpbmQoIjQ4XyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQotICAgICAgICByZXR1cm4gYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgZWxzZSBpZiAoc3RyLmZpbmQoIjhfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCi0gICAgICAgIHJldHVybiBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV84MDAwOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci19Ci0KLWludCBnZXRfZnJhbWVfZHVyYXRpb24gKGNoYXIgKnApCi17Ci0gICAgc3RkOjpzdHJpbmcgc3RyID0gcDsKLSAgICBpbnQgcmV0OwotICAgIGlmICgoc3RyLmZpbmQoIl8xXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAotICAgICAgICAoc3RyLmZpbmQoIl8zXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAotICAgICAgICAoc3RyLmZpbmQoIl81XyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkKLSAgICAgICAgcmV0ID0gc3RhdGljX2Nhc3Q8aW50PihibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNGcmFtZUR1cmF0aW9uOjpGUkFNRV9EVVJfN181KTsKLSAgICBlbHNlIGlmICgoc3RyLmZpbmQoIl8yXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAotICAgICAgICAgICAgIChzdHIuZmluZCgiXzRfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8Ci0gICAgICAgICAgICAgKHN0ci5maW5kKCJfNl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpCi0gICAgICAgIHJldCA9IHN0YXRpY19jYXN0PGludD4oYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldCA9IC0xOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBnZXRfc2R1X2ludGVydmFsIChjaGFyICpwKQotewotICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHA7Ci0gICAgaW50IHJldDsKLSAgICBpZiAoKHN0ci5maW5kKCJfMV8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKLSAgICAgICAgKHN0ci5maW5kKCJfM18iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKLSAgICAgICAgKHN0ci5maW5kKCJfNV8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpCi0gICAgICAgIHJldCA9IDc1MDA7Ci0gICAgZWxzZSBpZiAoKHN0ci5maW5kKCJfMl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKLSAgICAgICAgICAgICAoc3RyLmZpbmQoIl80XyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAotICAgICAgICAgICAgIChzdHIuZmluZCgiXzZfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKQotICAgICAgICByZXQgPSAxMDAwMDsKLSAgICBlbHNlCi0gICAgICAgIHJldCA9IC0xOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG9jdGV0UGVyRnJhbWUgPQote3siOF8xIiwgMjZ9LHsiOF8yIiwgMzB9LHsiMTZfMSIsIDMwfSx7IjE2XzIiLCA0MH0sCi17IjI0XzEiLCA0NX0seyIyNF8yIiwgNjB9LHsiMzJfMSIsIDYwfSx7IjMyXzIiLCA4MH0sCi17IjQ4XzEiLCA3NX0seyI0OF8yIiwgMTAwfSx7IjQ4XzMiLCA5MH0seyI0OF80IiwgMTIwfSwKLXsiNDhfNSIsIDExN30seyI0OF82IiwgMTU1fX07Ci0KLWludCBnZXRfb2N0ZXRQZXJGcmFtZSAoY2hhciAqcCkKLXsKLSAgICBzdGQ6OnN0cmluZyBzdHIgPSBwOwotICAgIGludCByZXQgPSAtMTsKLSAgICBzaXplX3QgcG9zID0gc3RyLnJmaW5kKCdfJyk7Ci0gICAgc3RkOjpzdHJpbmcga2V5ID0gc3RyLnN1YnN0cigwLCBwb3MpOwotICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD46Oml0ZXJhdG9yIGl0ID0KLSAgICAgICAgb2N0ZXRQZXJGcmFtZS5iZWdpbigpOyBpdCAhPSBvY3RldFBlckZyYW1lLmVuZCgpOyBpdCsrKQotICAgIHsKLSAgICAgICAgaWYgKGtleS5jb21wYXJlKGl0LT5maXJzdCkgPT0gMCkKLSAgICAgICAgICAgIHJldCA9IGl0LT5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHRwb3J0X2xhdGVuY3kgPQote3siOF8xXzEiLCA4fSx7IjE2XzFfMSIsIDh9LHsiMjRfMV8xIiwgOH0seyIzMl8xXzEiLCA4fSwKLSB7IjhfMl8xIiwgMTB9LHsiMTZfMl8xIiwgMTB9LHsiMjRfMl8xIiwgMTB9LHsiMzJfMl8xIiwgMTB9LAoteyI0OF8xXzEiLCAxNX0seyI0OF8zXzEiLCAxNX0seyI0OF81XzEiLCAxNX0sCi17IjQ4XzJfMSIsIDIwfSx7IjQ4XzRfMSIsIDIwfSx7IjQ4XzZfMSIsIDIwfSwKLSB7IjhfMV8yIiwgNzV9LHsiMTZfMV8yIiwgNzV9LHsiMjRfMV8yIiwgNzV9LAoteyIzMV8xXzIiLCA3NX0seyI0OF8xXzIiLCA3NX0seyI0OF8zXzIiLCA3NX0seyI0OF81XzIiLCA3NX0sCi0geyI4XzJfMiIsIDk1fSx7IjE2XzJfMiIsIDk1fSx7IjI0XzJfMiIsIDk1fSwKLXsiMzJfMl8yIiwgOTV9LHsiNDhfMl8yIiwgOTV9LAoteyI0OF80XzIiLCAxMDB9LHsiNDhfNl8yIiwgMTAwfX07Ci0KLWludCBnZXRfdHBvcnRfbGF0ZW5jeSAoY2hhciAqcCkKLXsKLSAgICBzdGQ6OnN0cmluZyBzdHIgPSBwOwotICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD46Oml0ZXJhdG9yIGl0ID0gdHBvcnRfbGF0ZW5jeS5iZWdpbigpOwotICAgICAgICBpdCAhPSB0cG9ydF9sYXRlbmN5LmVuZCgpOyBpdCsrKQotICAgIHsKLSAgICAgICAgaWYgKHN0ci5jb21wYXJlKGl0LT5maXJzdCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBnZXRfcnRuIChjaGFyICpwKQotewotICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHA7Ci0gICAgaW50IHJldDsKLSAgICBzaXplX3QgcG9zID0gc3RyLnJmaW5kKCdfJyk7Ci0gICAgc3RkOjpzdHJpbmcga2V5ID0gc3RyLnN1YnN0cihwb3MpOwotICAgIGlmIChzdHIuZmluZCgiXzFfMiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zIHx8Ci0gICAgICAgIHN0ci5maW5kKCJfMl8yIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKLSAgICAgICAgc3RyLmZpbmQoIl8zXzIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fAotICAgICAgICBzdHIuZmluZCgiXzRfMiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zIHx8Ci0gICAgICAgIHN0ci5maW5kKCJfNV8yIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKLSAgICAgICAgc3RyLmZpbmQoIl82XzIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKLSAgICAgICAgcmV0ID0gMTM7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChzdHIuZmluZCgiNDhfIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCi0gICAgICAgIHJldCA9IDU7Ci0gICAgaWYgKChzdHIuZmluZCgiOF8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKLSAgICAgICAgKHN0ci5maW5kKCIxNl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKLSAgICAgICAgKHN0ci5maW5kKCIyNF8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKLSAgICAgICAgKHN0ci5maW5kKCIzMl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpCi0gICAgICAgIHJldCA9IDI7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSAtMTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgZ2V0QXVkaW9Db25maWdTZXR0aW5ncyhjaGFyICpwLCBBdWRpb0NvbmZpZ1NldHRpbmdzICpwdHIpCi17Ci0gICAgaW50IHJldCA9IC0xOwotICAgIHN0ZDo6c3RyaW5nIGtleSA9IHA7Ci0gICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQXVkaW9Db25maWdTZXR0aW5ncz46Oml0ZXJhdG9yIGl0ID0KLSAgICAgICAgYXVkaW9Db25maWdNYXAuYmVnaW4oKTsKLSAgICAgICAgaXQgIT0gYXVkaW9Db25maWdNYXAuZW5kKCk7IGl0KyspCi0gICAgewotICAgICAgICBpZiAoa2V5LmNvbXBhcmUoaXQtPmZpcnN0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcHRyID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIHByaW50ZigiICVzIEVSUk9SOiBhdWRpbyB0eXBlIDAgJWQgXG4iLCBfX2Z1bmNfXywgcHRyLT5hdWRpb190eXBlWzBdLmF1ZGlvX2Rpcik7Ci0gICAgICAgICAgICBwcmludGYoIiAlcyBFUlJPUjogYXVkaW8gdHlwZSAxICVkIFxuIiwgX19mdW5jX18sIHB0ci0+YXVkaW9fdHlwZVsxXS5hdWRpb19kaXIpOwotICAgICAgICAgICAgLy9tZW1jcHkocHRyLCAmaXQtPnNlY29uZCwgc2l6ZW9mKEF1ZGlvQ29uZmlnU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1aW50OF90IEE7Ci0gICAgdWludDhfdCBCOwotICAgIHVpbnQ4X3QgQzsKLX0gc2V0Rm9ybWF0OwotCi12b2lkIHNldCh2b2lkICpkZXN0LCBzZXRGb3JtYXQgc3JjKQotewotICAgIG1lbWNweShkZXN0LCAmc3JjLCBzaXplb2Yoc2V0Rm9ybWF0KSk7Ci19Ci0KLXZvaWQgc2V0X2NvZGVjX3Fvc19jb25maWcgKGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q29kZWNRb3NDb25maWcgKmNvZGVjX3Fvc19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb2RlY0NvbmZpZywgQXVkaW9Db25maWdTZXR0aW5ncyAqYWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhdWRpb19kaXJlY3Rpb24sIHVpbnQxNl90IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlcnZlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmVyX2NvdW50LCB1aW50OF90IHRvdGFsX3NlcnZlcnMpCi17Ci0gICAgaW50IGZyYW1lRHVyYXRpb24sIG9jdGV0UGVyRnJhbWUsIHRwb3J0X2xhdGVuY3ksIHNkdV9pbnRlcnZhbCwgcnRuLCBjaXNfdDsKLSAgICBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNTYW1wbGVSYXRlIHNhbXBsZVJhdGU7Ci0gICAgYm9vbCBzdGVyZW9fdCA9IGZhbHNlOwotICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q0lHQ29uZmlnIGNpZ19jb25maWc7Ci0gICAgc2FtcGxlUmF0ZSA9IGdldF9zYW1wbGVfcmF0ZShjb2RlY0NvbmZpZyk7Ci0gICAgcHJpbnRmKCJTYW1wbGUgUmF0ZSAlZFxuIiwgc2FtcGxlUmF0ZSk7Ci0gICAgcHJpbnRmKCJzZXJ2ZXJfaWQgICVkXG4iLCBzZXJ2ZXJfaWQpOwotCi0gICAgaWYgKHNhbXBsZVJhdGUgPT0gYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfTk9ORSkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiICVzIEVSUk9SOiBzYW1wbGUgcmF0ZVxuIiwgX19mdW5jX18pOwotICAgICAgICBleGl0KDApOwotICAgIH0KLSAgICBmcmFtZUR1cmF0aW9uID0gZ2V0X2ZyYW1lX2R1cmF0aW9uKGNvZGVjQ29uZmlnKTsKLSAgICBpZiAoZnJhbWVEdXJhdGlvbiA8IDApCi0gICAgewotICAgICAgICBwcmludGYoIiAlcyBFUlJPUjogZnJhbWUgZHVyYXRpb25cbiIsIF9fZnVuY19fKTsKLSAgICAgICAgZXhpdCgwKTsKLSAgICB9Ci0gICAgb2N0ZXRQZXJGcmFtZSA9IGdldF9vY3RldFBlckZyYW1lKGNvZGVjQ29uZmlnKTsKLSAgICBpZiAob2N0ZXRQZXJGcmFtZSA8IDApCi0gICAgewotICAgICAgICBwcmludGYoIiAlcyBFUlJPUjogb2N0ZXQgcGVyIGZyYW1lXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotICAgIHRwb3J0X2xhdGVuY3kgPSBnZXRfdHBvcnRfbGF0ZW5jeShjb2RlY0NvbmZpZyk7Ci0gICAgaWYgKHRwb3J0X2xhdGVuY3kgPCAwKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCIgJXMgRVJST1I6IG1heCB0cmFuc3BvcnQgbGF0ZW5jeVxuIiwgX19mdW5jX18pOwotICAgICAgICBleGl0KDApOwotICAgIH0KLSAgICBydG4gPSBnZXRfcnRuKGNvZGVjQ29uZmlnKTsKLSAgICBpZiAocnRuIDwgMCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiICVzIEVSUk9SOiByZS10cmFuc21pc3Npb25cbiIsIF9fZnVuY19fKTsKLSAgICAgICAgZXhpdCgwKTsKLSAgICB9Ci0gICAgc2R1X2ludGVydmFsID0gZ2V0X3NkdV9pbnRlcnZhbChjb2RlY0NvbmZpZyk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZy0+Y29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnLT5jb2RlY19jb25maWcuY29kZWNfcHJpb3JpdHkgPQotICAgICAgICBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLSAgICBjb2RlY19xb3NfY29uZmlnLT5jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOwotICAgIFVwZGF0ZUZyYW1lRHVyYXRpb24oJmNvZGVjX3Fvc19jb25maWctPmNvZGVjX2NvbmZpZywKLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oZnJhbWVEdXJhdGlvbikpOwotICAgIFVwZGF0ZVByZWZlcnJlZEF1ZGlvQ29udGV4dCgmY29kZWNfcW9zX2NvbmZpZy0+Y29kZWNfY29uZmlnLCBjb250ZXh0KTsKLSAgICBjaWdfY29uZmlnLmNpZ19pZCA9IDE7Ci0gICAgY2lnX2NvbmZpZy5jaXNfY291bnQgPSBhY3MtPm51bV9jaXNlczsKLSAgICBjaWdfY29uZmlnLnBhY2tpbmcgPSAweDAxOyAvLyBpbnRlcmxlYXZlZAotICAgIGNpZ19jb25maWcuZnJhbWluZyA9IDB4MDA7IC8vIHVuZnJhbWVkCi0gICAgY2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odHBvcnRfbGF0ZW5jeSk7Ci0gICAgY2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odHBvcnRfbGF0ZW5jeSk7Ci0gICAgaWYgKHNkdV9pbnRlcnZhbCA9PSA3NTAwKQotICAgIHsKLSAgICAgICAgc2V0KCZjaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9tX3RvX3MsIHsweDRDLCAweDFELCAweDAwfSk7Ci0gICAgICAgIHNldCgmY2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfc190b19tLCB7MHg0QywgMHgxRCwgMHgwMH0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzZXQoJmNpZ19jb25maWcuc2R1X2ludGVydmFsX21fdG9fcywgezB4MTAsIDB4MjcsIDB4MDB9KTsKLSAgICAgICAgc2V0KCZjaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9zX3RvX20sIHsweDEwLCAweDI3LCAweDAwfSk7Ci0gICAgfQotICAgIG1lbWNweSgmY29kZWNfcW9zX2NvbmZpZy0+cW9zX2NvbmZpZy5jaWdfY29uZmlnLAotICAgICAgICAmY2lnX2NvbmZpZywgc2l6ZW9mKGNpZ19jb25maWcpKTsKLSAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBhY3MtPm51bV9jaXNlczsgaSsrKSB7Ci0gICAgICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q0lTQ29uZmlnIGNpc19jb25maWc7Ci0gICAgICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6QVNDU0NvbmZpZyBhc2NzX2NvbmZpZzsKLSAgICAgICAgaW50IG1heF9zZHVfbV90b19zOwotICAgICAgICBpbnQgbWF4X3NkdV9zX3RvX207Ci0gICAgICAgIGNpc19jb25maWcuY2lzX2lkID0gaTsKLSAgICAgICAgYXNjc19jb25maWcuY2lnX2lkID0gMTsKLSAgICAgICAgYXNjc19jb25maWcuY2lzX2lkID0gaTsKLSAgICAgICAgbWF4X3NkdV9tX3RvX3MgPSBtYXhfc2R1X3NfdG9fbSA9IGdldF9vY3RldFBlckZyYW1lKGNvZGVjQ29uZmlnKTsKLSAgICAgICAgcHJpbnRmKCJhdWRpb19kaXIgJWRcbiIsIGFjcy0+YXVkaW9fdHlwZVtpXS5hdWRpb19kaXIpOwotICAgICAgICBwcmludGYoIm1heF9zZHVfbV90b19zICVkXG4iLCBtYXhfc2R1X21fdG9fcyk7Ci0gICAgICAgIHByaW50ZigibWF4X3NkdV9zX3RvX20gJWRcbiIsIG1heF9zZHVfc190b19tKTsKLSAgICAgICAgaWYoYWNzLT5hdWRpb190eXBlW2ldLnN0ZXJlbyAmIEFTRV9TUkNfU1RFUkVPKSB7Ci0gICAgICAgICAgbWF4X3NkdV9zX3RvX20gKj0gMjsKLSAgICAgICAgICBpZihhdWRpb19kaXJlY3Rpb24gJiBBU0VfRElSRUNUSU9OX1NSQykgc3RlcmVvX3QgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKGFjcy0+YXVkaW9fdHlwZVtpXS5zdGVyZW8gJiBBU0VfU0lOS19TVEVSRU8pIHsKLSAgICAgICAgICBtYXhfc2R1X21fdG9fcyAqPSAyOwotICAgICAgICAgIGlmKGF1ZGlvX2RpcmVjdGlvbiAmIEFTRV9ESVJFQ1RJT05fU0lOSykgc3RlcmVvX3QgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjcy0+YXVkaW9fdHlwZVtpXS5hdWRpb19kaXIgPT0gKEFTRV9ESVJFQ1RJT05fU0lOS3xBU0VfRElSRUNUSU9OX1NSQykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiaSAlZCAgIEZpbGxpbmcgYm90aCBtIHRvIHMgYW5kIHMgdG8gbSBcbiIsIGkpOwotICAgICAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X21fdG9fcyA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihtYXhfc2R1X21fdG9fcyk7Ci0gICAgICAgICAgICBjaXNfY29uZmlnLm1heF9zZHVfc190b19tID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG1heF9zZHVfc190b19tKTsKLSAgICAgICAgICAgIGFzY3NfY29uZmlnLmJpX2RpcmVjdGlvbmFsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhY3MtPmF1ZGlvX3R5cGVbaV0uYXVkaW9fZGlyID09IEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoImkgJWQgICBGaWxsaW5nIHMgdG8gbSBcbiIsIGkpOwotICAgICAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X3NfdG9fbSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihtYXhfc2R1X3NfdG9fbSk7Ci0gICAgICAgICAgICBjaXNfY29uZmlnLm1heF9zZHVfbV90b19zID0gMDsKLSAgICAgICAgICAgIGFzY3NfY29uZmlnLmJpX2RpcmVjdGlvbmFsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWNzLT5hdWRpb190eXBlW2ldLmF1ZGlvX2RpciA9PSBBU0VfRElSRUNUSU9OX1NJTkspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiaSAlZCAgIEZpbGxpbmcgbSB0byBzICBcbiIsIGkpOwotICAgICAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X21fdG9fcyA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihtYXhfc2R1X21fdG9fcyk7Ci0gICAgICAgICAgICBjaXNfY29uZmlnLm1heF9zZHVfc190b19tID0gMDsKLSAgICAgICAgICAgIGFzY3NfY29uZmlnLmJpX2RpcmVjdGlvbmFsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2lzX2NvbmZpZy5waHlfbV90b19zID0gMHgwMjsKLSAgICAgICAgY2lzX2NvbmZpZy5waHlfc190b19tID0gMHgwMjsKLSAgICAgICAgY2lzX2NvbmZpZy5ydG5fbV90b19zID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocnRuKTsKLSAgICAgICAgY2lzX2NvbmZpZy5ydG5fc190b19tID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocnRuKTsKLSAgICAgICAgcHJpbnRmKCJydG4gICAlZCAgIFxuIiwgcnRuKTsKLSAgICAgICAgc2V0KCZhc2NzX2NvbmZpZy5wcmVzZW50YXRpb25fZGVsYXksIHsweDQwLCAweDlDLCAweDAwfSk7Ci0gICAgICAgIGNvZGVjX3Fvc19jb25maWctPnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWcpOwotCi0KLSAgICAgICAgcHJpbnRmKCJpICVkICAgc2VydmVyX2lkICAgJWQgXG4iLCBpLCBzZXJ2ZXJfaWQpOwotICAgICAgICBpZih0b3RhbF9zZXJ2ZXJzID09IDEpIHsKLSAgICAgICAgICBpZihhY3MtPm51bV9jaXNlcyA9PSAxKSB7Ci0gICAgICAgICAgICBjb2RlY19xb3NfY29uZmlnLT5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5wdXNoX2JhY2soYXNjc19jb25maWcpOwotICAgICAgICAgIH0gZWxzZSBpZihhY3MtPm51bV9jaXNlcyA9PSAyKSB7Ci0gICAgICAgICAgICBpZihhY3MtPmF1ZGlvX3R5cGVbaSAlIGFjcy0+bnVtX2Npc2VzXS5hdWRpb19kaXIgPT0KLSAgICAgICAgICAgICAgYWNzLT5hdWRpb190eXBlWyhpICsgMSkgJSBhY3MtPm51bV9jaXNlc10uYXVkaW9fZGlyKSB7Ci0gICAgICAgICAgICAgIGNvZGVjX3Fvc19jb25maWctPnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoIGkgPT0gc2VydmVyX2NvdW50KSB7Ci0gICAgICAgICAgICAgIGNvZGVjX3Fvc19jb25maWctPnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYodG90YWxfc2VydmVycyA9PSAyKSB7Ci0gICAgICAgICAgIGlmKGkgPT0gc2VydmVyX2lkKSB7Ci0gICAgICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy0+cW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChzdGVyZW9fdCA9PSB0cnVlKSB7Ci0gICAgICAgIGNvZGVjX3Fvc19jb25maWctPmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZy0+Y29kZWNfY29uZmlnLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KG9jdGV0UGVyRnJhbWUqMikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvZGVjX3Fvc19jb25maWctPmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJmNvZGVjX3Fvc19jb25maWctPmNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihvY3RldFBlckZyYW1lKSk7Ci0gICAgfQotfQotCi12b2lkIGRvX2JhcF9jb25uZWN0IChjaGFyICpwKQotewotICAgIFVzZXJQYXJtcyBhcmdzOwotICAgIHBhcnNlX3Bhcm1zKHAsICZhcmdzKTsKLSAgICBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWc7Ci0gICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnXzI7Ci0gICAgQXVkaW9Db25maWdTZXR0aW5ncyBhY3M7Ci0gICAgYmFwQ29ubmVjdGlvbkNvbXBsZXRlID0gMDsKLSAgICBpZiAoZ2V0QXVkaW9Db25maWdTZXR0aW5ncyhhcmdzLmF1ZGlvQ29uZmlnLCAmYWNzKSA8IDApCi0gICAgewotICAgICAgICBwcmludGYoIiVzIEVSUk9SOiBBdWRpb0NvbmZpZ1xuIiwgX19mdW5jX18pOwotICAgICAgICBleGl0KDApOwotICAgIH0KLSAgICAvL3NldF9jb2RlY19xb3NfY29uZmlnKCZjb2RlY19xb3NfY29uZmlnLCBhcmdzLmNvZGVjQ29uZmlnLCAmYWNzKTsKLSAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBhcmdzLnNlcnYuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgUmF3QWRkcmVzcyBiYXBfYmRfYWRkcjsKLSAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1Db25uZWN0IGNvbm5faW5mbzsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1Db25uZWN0PiBzdHJlYW1zOwotICAgICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuY2lzX2NvbmZpZ3MuY2xlYXIoKTsKLSAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5jbGVhcigpOwotICAgICAgICBjb2RlY19xb3NfY29uZmlnXzIucW9zX2NvbmZpZy5jaXNfY29uZmlncy5jbGVhcigpOwotICAgICAgICBjb2RlY19xb3NfY29uZmlnXzIucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MuY2xlYXIoKTsKLSAgICAgICAgaWYoRkFMU0UgPT0gR2V0QmRBZGRyKGFyZ3Muc2VydltpXS5iZEFkZHIsICZiYXBfYmRfYWRkcikpICAgICByZXR1cm47Ci0gICAgICAgIGlmIChhcmdzLnNlcnZbaV0uZGlyZWN0aW9uICYgQVNFX0RJUkVDVElPTl9TSU5LKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRfY29kZWNfcW9zX2NvbmZpZygmY29kZWNfcW9zX2NvbmZpZywgYXJncy5jb2RlY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3MsIEFTRV9ESVJFQ1RJT05fU0lOSywgYXJncy5zZXJ2W2ldLmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zZXJ2LnNpemUoKSk7Ci0gICAgICAgICAgICBzZXRfY29ubl9pbmZvKCZjb25uX2luZm8sIGFyZ3Muc2VydltpXS5wcm9maWxlLAotICAgICAgICAgICAgICAgIGFyZ3Muc2VydltpXS5jb250ZXh0LCBBU0VfRElSRUNUSU9OX1NJTkspOwotICAgICAgICAgICAgcHJpbnRmKCIlcyBFUlJPUjogY29udGV4dCAlZFxuIiwgX19mdW5jX18sIGFyZ3Muc2VydltpXS5jb250ZXh0KTsKLSAgICAgICAgICAgIGNvbm5faW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWcpOwotICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl9pbmZvKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJncy5zZXJ2W2ldLmRpcmVjdGlvbiAmIEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRfY29kZWNfcW9zX2NvbmZpZygmY29kZWNfcW9zX2NvbmZpZ18yLCBhcmdzLmNvZGVjQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjcywgQVNFX0RJUkVDVElPTl9TUkMsIGFyZ3Muc2VydltpXS5jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2Vydi5zaXplKCkpOwotICAgICAgICAgICAgc2V0X2Nvbm5faW5mbygmY29ubl9pbmZvLCBhcmdzLnNlcnZbaV0ucHJvZmlsZSwKLSAgICAgICAgICAgICAgICBhcmdzLnNlcnZbaV0uY29udGV4dCwgQVNFX0RJUkVDVElPTl9TUkMpOwotICAgICAgICAgICAgcHJpbnRmKCIlcyBFUlJPUjogY29udGV4dCAlZFxuIiwgX19mdW5jX18sIGFyZ3Muc2VydltpXS5jb250ZXh0KTsKLSAgICAgICAgICAgIGNvbm5faW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfMik7Ci0gICAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm8pOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGFkZHJlc3M7Ci0gICAgICAgIGFkZHJlc3MucHVzaF9iYWNrKGJhcF9iZF9hZGRyKTsKLSAgICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KGFkZHJlc3MsIHRydWUsIHN0cmVhbXMpOwotICAgIH0KLSAgICB3aGlsZSghYmFwQ29ubmVjdGlvbkNvbXBsZXRlKSBzbGVlcCgxKTsKLX0KLQotdm9pZCBkb19iYXBfZGlzY29ubmVjdCAoY2hhciAqcCkKLXsKLSAgICBVc2VyUGFybXMgYXJnczsKLSAgICBwYXJzZV9wYXJtcyhwLCAmYXJncyk7Ci0gICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKChhcmdzLmNudCkvNCk7IGkrKykgewotICAgICAgICBSYXdBZGRyZXNzIGJhcF9iZF9hZGRyOwotICAgICAgICBpZihGQUxTRSA9PSBHZXRCZEFkZHIoYXJncy5zZXJ2W2ldLmJkQWRkciwgJmJhcF9iZF9hZGRyKSkgcmV0dXJuOwotICAgICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVR5cGU+IHN0cmVhbXM7Ci0gICAgICAgIGlmIChhcmdzLnNlcnZbaV0uZGlyZWN0aW9uICYgMSkgewotICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlIHR5cGVfMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgeyAudHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ3Muc2VydltpXS5wcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gYXJncy5zZXJ2W2ldLmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gMQotICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzLnNlcnZbaV0uZGlyZWN0aW9uICYgMikgewotICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVR5cGUgdHlwZV8xID0KLSAgICAgICAgICAgICAgICAgICAgICB7IC50eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJncy5zZXJ2W2ldLnByb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBhcmdzLnNlcnZbaV0uY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSAyCi0gICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0KLSAgICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KGJhcF9iZF9hZGRyLCBzdHJlYW1zKTsKLSAgICB9Ci19Ci0KLXZvaWQgZG9fYmFwX3N0YXJ0IChjaGFyICpwKQotewotICAgIFVzZXJQYXJtcyBhcmdzOwotICAgIHBhcnNlX3Bhcm1zKHAsICZhcmdzKTsKLSAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAoKGFyZ3MuY250KS80KTsgaSsrKSB7Ci0gICAgICAgIFJhd0FkZHJlc3MgYmFwX2JkX2FkZHI7Ci0gICAgICAgIGlmKEZBTFNFID09IEdldEJkQWRkcihhcmdzLnNlcnZbaV0uYmRBZGRyLCAmYmFwX2JkX2FkZHIpKSByZXR1cm47Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtVHlwZT4gc3RyZWFtczsKLSAgICAgICAgaWYgKGFyZ3Muc2VydltpXS5kaXJlY3Rpb24gJiAxKSB7Ci0gICAgICAgICAgICBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVR5cGUgdHlwZV8xID0KLSAgICAgICAgICAgICAgICAgICAgICB7IC50eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJncy5zZXJ2W2ldLnByb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBhcmdzLnNlcnZbaV0uY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSAxCi0gICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFyZ3Muc2VydltpXS5kaXJlY3Rpb24gJiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtVHlwZSB0eXBlXzEgPQotICAgICAgICAgICAgICAgICAgICAgIHsgLnR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihhcmdzLnNlcnZbaV0ucHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IGFyZ3Muc2VydltpXS5jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IDIKLSAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KGJhcF9iZF9hZGRyLCBzdHJlYW1zKTsKLSAgICB9Ci19Ci0KLXZvaWQgZG9fYmFwX3N0b3AgKGNoYXIgKnApCi17Ci0gICAgVXNlclBhcm1zIGFyZ3M7Ci0gICAgcGFyc2VfcGFybXMocCwgJmFyZ3MpOwotICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8ICgoYXJncy5jbnQpLzQpOyBpKyspIHsKLSAgICAgICAgUmF3QWRkcmVzcyBiYXBfYmRfYWRkcjsKLSAgICAgICAgaWYoRkFMU0UgPT0gR2V0QmRBZGRyKGFyZ3Muc2VydltpXS5iZEFkZHIsICZiYXBfYmRfYWRkcikpIHJldHVybjsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlPiBzdHJlYW1zOwotICAgICAgICBpZiAoYXJncy5zZXJ2W2ldLmRpcmVjdGlvbiAmIDEpIHsKLSAgICAgICAgICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtVHlwZSB0eXBlXzEgPQotICAgICAgICAgICAgICAgICAgICAgIHsgLnR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihhcmdzLnNlcnZbaV0ucHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IGFyZ3Muc2VydltpXS5jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IDEKLSAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJncy5zZXJ2W2ldLmRpcmVjdGlvbiAmIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlIHR5cGVfMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgeyAudHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ3Muc2VydltpXS5wcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gYXJncy5zZXJ2W2ldLmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gMgotICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcChiYXBfYmRfYWRkciwgc3RyZWFtcyk7Ci0gICAgfQotfQotCi12b2lkIGRvX2JhcF9kaXNjX2luX2Nvbm5lY3RpbmcgKGNoYXIgKnApCi17Ci0gICAgaW50IGRlbDsKLSAgICBwcmludGYoIkVudGVyIHRoZSBkZWxheSAobXMpPiAiKTsKLSAgICBzdGQ6OmNpbiA+PiBkZWw7Ci0gICAgZG9fYmFwX2Nvbm5lY3QocCk7Ci0gICAgdXNsZWVwKGRlbCAqMTAwMCk7Ci0gICAgZG9fYmFwX2Rpc2Nvbm5lY3QocCk7Ci19Ci0KLXZvaWQgZG9fYmFwX2Rpc2NfaW5fc3RhcnRpbmcgKGNoYXIgKnApCi17Ci0gICAgaW50IGRlbDsKLSAgICBwcmludGYoIkVudGVyIHRoZSBkZWxheSAobXMpPiAiKTsKLSAgICBzdGQ6OmNpbiA+PiBkZWw7Ci0gICAgZG9fYmFwX3N0YXJ0KHApOwotICAgIHVzbGVlcChkZWwgKjEwMDApOwotICAgIGRvX2JhcF9kaXNjb25uZWN0KHApOwotfQotCi12b2lkIGRvX2JhcF9kaXNjX2luX3N0b3BwaW5nIChjaGFyICpwKQotewotICAgIGludCBkZWw7Ci0gICAgcHJpbnRmKCJFbnRlciB0aGUgZGVsYXkgKG1zKT4gIik7Ci0gICAgc3RkOjpjaW4gPj4gZGVsOwotICAgIGRvX2JhcF9zdG9wKHApOwotICAgIHVzbGVlcChkZWwgKjEwMDApOwotICAgIGRvX2JhcF9kaXNjb25uZWN0KHApOwotfQotCi12b2lkIGRvX2JhcF9zdG9wX2luX3N0YXJ0aW5nIChjaGFyICpwKQotewotICAgIGludCBkZWw7Ci0gICAgcHJpbnRmKCJFbnRlciB0aGUgZGVsYXkgKG1zKT4gIik7Ci0gICAgc3RkOjpjaW4gPj4gZGVsOwotICAgIGRvX2JhcF9zdGFydChwKTsKLSAgICB1c2xlZXAoZGVsICoxMDAwKTsKLSAgICBkb19iYXBfc3RvcChwKTsKLX0KLQotdm9pZCBkb19iYXBfdXBkYXRlX3N0cmVhbSAoY2hhciAqcCkKLXsKLSAgICBVc2VyUGFybXMgYXJnczsKLSAgICBwYXJzZV9wYXJtcyhwLCAmYXJncyk7Ci0gICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKChhcmdzLmNudCkvNCk7IGkrKykgewotICAgICAgICBSYXdBZGRyZXNzIGJhcF9iZF9hZGRyOwotICAgICAgICBpZihGQUxTRSA9PSBHZXRCZEFkZHIoYXJncy5zZXJ2W2ldLmJkQWRkciwgJmJhcF9iZF9hZGRyKSkgcmV0dXJuOwotICAgICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVVwZGF0ZT4gVXBkYXRlX1N0cmVhbTsKLSAgICAgICAgaWYgKGFyZ3Muc2VydltpXS5kaXJlY3Rpb24gJiAxKSB7Ci0gICAgICAgICAgICBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVR5cGUgdHlwZV8xID0KLSAgICAgICAgICAgICAgICAgICAgICB7IC50eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJncy5zZXJ2W2ldLnByb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IDEKLSAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1VcGRhdGUgc1VwZGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1VcGRhdGVUeXBlOjpTVFJFQU1JTkdfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2VydltpXS5jb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFVwZGF0ZV9TdHJlYW0ucHVzaF9iYWNrKHNVcGRhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzLnNlcnZbaV0uZGlyZWN0aW9uICYgMikgewotICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlIHR5cGVfMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgeyAudHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ3Muc2VydltpXS5wcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSAyCi0gICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtVXBkYXRlIHNVcGRhdGUgPQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtVXBkYXRlVHlwZTo6U1RSRUFNSU5HX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNlcnZbaV0uY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBVcGRhdGVfU3RyZWFtLnB1c2hfYmFjayhzVXBkYXRlKTsKLSAgICAgICAgfQotICAgICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlVwZGF0ZVN0cmVhbShiYXBfYmRfYWRkciwgVXBkYXRlX1N0cmVhbSk7Ci0gICAgfQotfQotCi12b2lkIGRvX2Rpc2FibGUoY2hhciAqcCkKLXsKLSAgICBiZHRfZGlzYWJsZSgpOwotfQotCi12b2lkIGRvX2NsZWFudXAoY2hhciAqcCkKLXsKLSAgICBiZHRfY2xlYW51cCgpOwotfQotCi12b2lkIGJkdF9pbml0KHZvaWQpCi17Ci0gICAgYmR0X2xvZygiSU5JVCBCVCAiKTsKLSAgICBzdGF0dXMgPSBzQnRJbnRlcmZhY2UtPmluaXQoJmJ0X2NhbGxiYWNrcywgZmFsc2UsIGZhbHNlLCAwLCBudWxscHRyLCBmYWxzZSk7Ci0gICAgc2xlZXAoMSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBzdGF0dXMgPSBzQnRJbnRlcmZhY2UtPnNldF9vc19jYWxsb3V0cygmYnRfb3NfY2FsbGJhY2tzKTsKLSAgICB9Ci0gICAgY2hlY2tfcmV0dXJuX3N0YXR1cyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0gKiogR0FUVCBTRVJWRVIgQVBJIGNvbW1hbmRzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBNYWluIGNvbnNvbGUgY29tbWFuZCBoYW5kbGVyCi0qLwotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NtZChjaGFyICpwLCB1bnNpZ25lZCBjaGFyIGlzX2pvYikKLXsKLSAgICBjaGFyIGNtZFsyMDQ4XTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgYnRfcGluX2NvZGVfdCBwaW5jb2RlOwotICAgIGNoYXIgKnBfc2F2ZWQgPSBwOwotCi0gICAgZ2V0X3N0cigmcCwgY21kKTsKLQotICAgIC8qIHRhYmxlIGNvbW1hbmRzICovCi0gICAgd2hpbGUgKGNvbnNvbGVfY21kX2xpc3RbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgaWYgKGlzX2NtZChjb25zb2xlX2NtZF9saXN0W2ldLm5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlzX2pvYiAmJiBjb25zb2xlX2NtZF9saXN0W2ldLmlzX2pvYikKLSAgICAgICAgICAgICAgICBjcmVhdGVfY21kam9iKHBfc2F2ZWQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnNvbGVfY21kX2xpc3RbaV0uaGFuZGxlcihwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIC8vcGluIGtleQotICAgIGlmKGNtZFs2XSA9PSAnLicpIHsKLSAgICAgICAgZm9yKGk9MDsgaTw2OyBpKyspIHsKLSAgICAgICAgICAgIHBpbmNvZGUucGluW2ldID0gY21kW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmKEJUX1NUQVRVU19TVUNDRVNTICE9IHNCdEludGVyZmFjZS0+cGluX3JlcGx5KHJlbW90ZV9iZF9hZGRyZXNzLAotVFJVRSwgc3RybGVuKChjb25zdCBjaGFyKilwaW5jb2RlLnBpbiksICZwaW5jb2RlKSkgewotICAgICAgICAgICAgcHJpbnRmKCJQaW4gUmVwbHkgZmFpbGVkXG4iKTsKLSAgICAgICAgfQotICAgICAgICAvL2ZsdXNoIHRoZSBjaGFyIGZvciBwaW5rZXkKLSAgICAgICAgY21kWzZdID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGJkdF9sb2coIiVzIDogdW5rbm93biBjb21tYW5kXG4iLCBwX3NhdmVkKTsKLSAgICAgICAgZG9faGVscChOVUxMKTsKLSAgICB9Ci19Ci0KLWludCBtYWluKCkKLXsKLSAgICBjb25maWdfcGVybWlzc2lvbnMoKTsKLSAgICBiZHRfbG9nKCJcbjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiIpOwotICAgIGJkdF9sb2coIjo6IEJsdWVkcm9pZCB0ZXN0IGFwcCBzdGFydGluZyIpOwotCi0gICAgaWYgKCBIQUxfbG9hZCgpIDwgMCApIHsKLSAgICAgICAgcGVycm9yKCJIQUwgZmFpbGVkIHRvIGluaXRpYWxpemUsIGV4aXRcbiIpOwotICAgICAgICB1bmxpbmsoUElEX0ZJTEUpOwotICAgICAgICBleGl0KDApOwotICAgIH0KLQotICAgIHNldHVwX3Rlc3RfZW52KCk7Ci0KLSAgICAvKiBBdXRvbWF0aWNhbGx5IHBlcmZvcm0gdGhlIGluaXQgKi8KLSAgICBiZHRfaW5pdCgpOwotICAgIHNsZWVwKDUpOwotICAgIGJkdF9lbmFibGUoKTsKLSAgICBzbGVlcCg1KTsKLQotICAgIHNVY2FzdENsaWVudEludGVyZmFjZSA9IChVY2FzdENsaWVudEludGVyZmFjZSopCi0gICAgICAgIHNCdEludGVyZmFjZS0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKEJUX1BST0ZJTEVfQkFQX1VDTElFTlRfSUQpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+SW5pdCgmc1VjYXN0Q2xpZW50Q2FsbGJhY2tzKTsKLSAgICBzUGFjc0NsaWVudEludGVyZmFjZSA9IChQYWNzQ2xpZW50SW50ZXJmYWNlKikKLSAgICAgICAgc0J0SW50ZXJmYWNlLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoQlRfUFJPRklMRV9QQUNTX0NMSUVOVF9JRCk7Ci0gICAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkluaXQoJnNQYWNzQ2xpZW50Q2FsbGJhY2tzKTsKLSAgICBzQXNjc0NsaWVudEludGVyZmFjZSA9IChBc2NzQ2xpZW50SW50ZXJmYWNlKikKLSAgICAgICAgc0J0SW50ZXJmYWNlLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoQlRfUFJPRklMRV9BU0NTX0NMSUVOVF9JRCk7Ci0gICAgc0FzY3NDbGllbnRJbnRlcmZhY2UtPkluaXQoJnNBc2NzQ2xpZW50Q2FsbGJhY2tzKTsKLQotICAgIHNsZWVwKDUpOwotICAgIHdoaWxlKCFtYWluX2RvbmUpCi0gICAgewotICAgICAgICBjaGFyIGxpbmVbMjA0OF0sICpyZXN1bHQ7Ci0KLQotICAgICAgICAvKiBjb21tYW5kIHByb21wdCAqLwotICAgICAgICBwcmludGYoICI+IiApOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICBpZiAoKHJlc3VsdCA9IGZnZXRzIChsaW5lLCAyMDQ4LCBzdGRpbikpID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiRVJST1I6IFRoZSBzdHJpbmcgaXMgTlVMTC4gY29kZSAlZFxuIiwgZXJybm8pOwotICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiVXNlcklucHV0XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lWzBdIT0gJ1wwJykKLSAgICAgICAgewotICAgICAgICAgICAgLyogcmVtb3ZlIGxpbmVmZWVkICovCi0gICAgICAgICAgICBsaW5lW3N0cmxlbihsaW5lKS0xXSA9IDA7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NfY21kKGxpbmUsIDApOwotICAgICAgICAgICAgbWVtc2V0KGxpbmUsICdcMCcsIDIwNDgpOwotICAgICAgICB9Ci0gICAgfQotICAgIEhBTF91bmxvYWQoKTsKLQotICAgIGJkdF9sb2coIjo6IGJhcCB1Y2EgdGVzdCBhcHAgdGVybWluYXRpbmciKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgR2V0RmlsZU5hbWUoY2hhciAqcCwgY2hhciAqZmlsZW5hbWUpCi17Ci0vLyAgICB1aW50OF90ICBpOwotICAgIGludCBsZW47Ci0KLSAgICBza2lwX2JsYW5rcygmcCk7Ci0KLSAgICBwcmludGYoIklucHV0IGZpbGUgbmFtZSA9ICVzXG4iLCBwKTsKLQotICAgIGlmIChwID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIlxuSW52YWxpZCBGaWxlIE5hbWUuLi4gUGxlYXNlIGVudGVyIGZpbGUgbmFtZVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbGVuID0gc3RybGVuKHApOwotCi0gICAgbWVtY3B5KGZpbGVuYW1lLCBwLCBsZW4pOwotICAgIGZpbGVuYW1lW2xlbl0gPSAnXDAnOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci11aW50OF90IGNoZWNrX2xlbmd0aChjaGFyICpwKQotewotICAgIHVpbnQ4X3QgdmFsID0gMDsKLSAgICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMCcpCi0gICAgewotICAgICAgICB2YWwrKzsKLSAgICAgICAgcCsrOwotICAgIH0KLSAgICByZXR1cm4gdmFsOwotfQotaW50IEdldEJkQWRkcihjaGFyICpwLCBSYXdBZGRyZXNzKiBwYmRfYWRkcikKLXsKLSAgICBjaGFyIEFyclsxM10gPSB7MH07Ci0gICAgY2hhciAqcHN6QWRkciA9IE5VTEw7Ci0gICAgdWludDhfdCBrMSA9IDA7Ci0gICAgdWludDhfdCBrMiA9IDA7Ci0gICAgdWludDhfdCAgaTsKLQotICAgIHNraXBfYmxhbmtzKCZwKTsKLQotICAgIHByaW50ZigiSW5wdXQ9JXNcbiIsIHApOwotCi0gICAgaWYoMTIgIT0gY2hlY2tfbGVuZ3RoKHApKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJcbkludmFsaWQgQmQgQWRkcmVzcy4gRm9ybWF0WzExMjIzMzQ0NTU2Nl1cbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1lbWNweShBcnIsIHAsIDEyKTsKLQotICAgIGZvcihpPTA7IGk8MTI7IGkrKykKLSAgICB7Ci0gICAgICAgIEFycltpXSA9IHRvbG93ZXIoQXJyW2ldKTsKLSAgICB9Ci0gICAgcHN6QWRkciA9IEFycjsKLQotICAgIGZvcihpPTA7IGk8NjsgaSsrKQotICAgIHsKLSAgICAgICAgazEgPSAodWludDhfdCkgKCAoKnBzekFkZHIgPj0gJ2EnKSA/Ci0gICAgICAgICAgICAoIDEwICsgKHVpbnQ4X3QpKCAqcHN6QWRkciAtICdhJyApKSA6ICgqcHN6QWRkciAtICcwJykgKTsKLSAgICAgICAgcHN6QWRkcisrOwotICAgICAgICBrMiA9ICh1aW50OF90KSAoICgqcHN6QWRkciA+PSAnYScpID8KLSAgICAgICAgICAgICggMTAgKyAodWludDhfdCkoICpwc3pBZGRyIC0gJ2EnICkpIDogKCpwc3pBZGRyIC0gJzAnKSApOwotICAgICAgICBwc3pBZGRyKys7Ci0KLSAgICAgICAgaWYgKCAoazE+MTUpfHwoazI+MTUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBiZF9hZGRyLT5hZGRyZXNzW2ldID0gKGsxPDw0IHwgazIpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvL0JBUF9VTklDQVNUX1RFU1RfQVBQX0lOVEVSRkFDRQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL0FuZHJvaWQuYnAgYi9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2NzlkZi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGgtdHlwZXMtcXRpIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX3R5cGVzX2RlZmF1bHRzIl0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgIC8qIHdlIGV4cG9ydCBhbGwgY2xhc3Nlcywgc28gY2hhbmdlIGRlZmF1bHQgdmlzaWJpbGl0eSwgaW5zdGVhZCBvZiBoYXZpbmcgRVhQT1JUX1NZTUJPTCBvbiBlYWNoIGNsYXNzKi8KLSAgICAgICAgIi1mdmlzaWJpbGl0eT1kZWZhdWx0IiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNsYXNzX29mX2RldmljZS5jYyIsCi0gICAgICAgICJyYXdfYWRkcmVzcy5jYyIsCi0gICAgICAgICJibHVldG9vdGgvdXVpZC5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC90eXBlcy9ibHVldG9vdGgvdXVpZC5jYyBiL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC90eXBlcy9ibHVldG9vdGgvdXVpZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZjQzNy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvYmx1ZXRvb3RoL3V1aWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ1dWlkLmgiCi0KLSNpbmNsdWRlIDxiYXNlL3JhbmRfdXRpbC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihVdWlkKSA9PSAxNiwgIlV1aWQgbXVzdCBiZSAxNiBieXRlcyBsb25nISIpOwotCi11c2luZyBVVUlEMTI4Qml0ID0gVXVpZDo6VVVJRDEyOEJpdDsKLQotY29uc3QgVXVpZCBVdWlkOjprRW1wdHkgPSBVdWlkOjpGcm9tMTI4Qml0QkUoVVVJRDEyOEJpdHt7MHgwMH19KTsKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBVdWlkIGtCYXNlID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFVVSUQxMjhCaXR7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsCi0gICAgICAgICAgICAgICAgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn19KTsKLX0gIC8vIG5hbWVzcGFjZQotCi1zaXplX3QgVXVpZDo6R2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBjb25zdCB7Ci0gIGlmIChtZW1jbXAodXUuZGF0YSgpICsga051bUJ5dGVzMzIsIGtCYXNlLnV1LmRhdGEoKSArIGtOdW1CeXRlczMyLAotICAgICAgICAgICAgIGtOdW1CeXRlczEyOCAtIGtOdW1CeXRlczMyKSAhPSAwKSB7Ci0gICAgcmV0dXJuIGtOdW1CeXRlczEyODsKLSAgfQotCi0gIGlmICh1dVswXSA9PSAwICYmIHV1WzFdID09IDApIHJldHVybiBrTnVtQnl0ZXMxNjsKLQotICByZXR1cm4ga051bUJ5dGVzMzI7Ci19Ci0KLWJvb2wgVXVpZDo6SXMxNkJpdCgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgPT0ga051bUJ5dGVzMTY7Ci19Ci0KLXVpbnQxNl90IFV1aWQ6OkFzMTZCaXQoKSBjb25zdCB7IHJldHVybiAoKCh1aW50MTZfdCl1dVsyXSkgPDwgOCkgKyB1dVszXTsgfQotCi11aW50MzJfdCBVdWlkOjpBczMyQml0KCkgY29uc3QgewotICByZXR1cm4gKCgodWludDMyX3QpdXVbMF0pIDw8IDI0KSArICgoKHVpbnQzMl90KXV1WzFdKSA8PCAxNikgKwotICAgICAgICAgKCgodWludDMyX3QpdXVbMl0pIDw8IDgpICsgdXVbM107Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgdXVpZCwgYm9vbCogaXNfdmFsaWQpIHsKLSAgaWYgKGlzX3ZhbGlkKSAqaXNfdmFsaWQgPSBmYWxzZTsKLSAgVXVpZCByZXQgPSBrQmFzZTsKLQotICBpZiAodXVpZC5lbXB0eSgpKSByZXR1cm4gcmV0OwotCi0gIHVpbnQ4X3QqIHAgPSByZXQudXUuZGF0YSgpOwotICBpZiAodXVpZC5zaXplKCkgPT0ga1N0cmluZzEyOEJpdExlbikgewotICAgIGlmICh1dWlkWzhdICE9ICctJyB8fCB1dWlkWzEzXSAhPSAnLScgfHwgdXVpZFsxOF0gIT0gJy0nIHx8Ci0gICAgICAgIHV1aWRbMjNdICE9ICctJykgewotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpbnQgYzsKLSAgICBpbnQgcmMgPQotICAgICAgICBzc2NhbmYodXVpZC5jX3N0cigpLAotICAgICAgICAgICAgICAgIiUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeC0lMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4IgotICAgICAgICAgICAgICAgIi0lMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JW4iLAotICAgICAgICAgICAgICAgJnBbMF0sICZwWzFdLCAmcFsyXSwgJnBbM10sICZwWzRdLCAmcFs1XSwgJnBbNl0sICZwWzddLCAmcFs4XSwKLSAgICAgICAgICAgICAgICZwWzldLCAmcFsxMF0sICZwWzExXSwgJnBbMTJdLCAmcFsxM10sICZwWzE0XSwgJnBbMTVdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDE2KSByZXR1cm4gcmV0OwotICAgIGlmIChjICE9IGtTdHJpbmcxMjhCaXRMZW4pIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoaXNfdmFsaWQpICppc192YWxpZCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodXVpZC5zaXplKCkgPT0gOCkgewotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZih1dWlkLmNfc3RyKCksICIlMDJoaHglMDJoaHglMDJoaHglMDJoaHglbiIsICZwWzBdLCAmcFsxXSwKLSAgICAgICAgICAgICAgICAgICAgJnBbMl0sICZwWzNdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDQpIHJldHVybiByZXQ7Ci0gICAgaWYgKGMgIT0gOCkgcmV0dXJuIHJldDsKLQotICAgIGlmIChpc192YWxpZCkgKmlzX3ZhbGlkID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICh1dWlkLnNpemUoKSA9PSA0KSB7Ci0gICAgaW50IGM7Ci0gICAgaW50IHJjID0gc3NjYW5mKHV1aWQuY19zdHIoKSwgIiUwMmhoeCUwMmhoeCVuIiwgJnBbMl0sICZwWzNdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDIpIHJldHVybiByZXQ7Ci0gICAgaWYgKGMgIT0gNCkgcmV0dXJuIHJldDsKLQotICAgIGlmIChpc192YWxpZCkgKmlzX3ZhbGlkID0gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTE2Qml0KHVpbnQxNl90IHV1aWQxNikgewotICBVdWlkIHUgPSBrQmFzZTsKLQotICB1LnV1WzJdID0gKHVpbnQ4X3QpKCgweEZGMDAgJiB1dWlkMTYpID4+IDgpOwotICB1LnV1WzNdID0gKHVpbnQ4X3QpKDB4MDBGRiAmIHV1aWQxNik7Ci0gIHJldHVybiB1OwotfQotCi1VdWlkIFV1aWQ6OkZyb20zMkJpdCh1aW50MzJfdCB1dWlkMzIpIHsKLSAgVXVpZCB1ID0ga0Jhc2U7Ci0KLSAgdS51dVswXSA9ICh1aW50OF90KSgoMHhGRjAwMDAwMCAmIHV1aWQzMikgPj4gMjQpOwotICB1LnV1WzFdID0gKHVpbnQ4X3QpKCgweDAwRkYwMDAwICYgdXVpZDMyKSA+PiAxNik7Ci0gIHUudXVbMl0gPSAodWludDhfdCkoKDB4MDAwMEZGMDAgJiB1dWlkMzIpID4+IDgpOwotICB1LnV1WzNdID0gKHVpbnQ4X3QpKDB4MDAwMDAwRkYgJiB1dWlkMzIpOwotICByZXR1cm4gdTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tMTI4Qml0QkUoY29uc3QgdWludDhfdCogdXVpZCkgewotICBVVUlEMTI4Qml0IHRtcDsKLSAgbWVtY3B5KHRtcC5kYXRhKCksIHV1aWQsIGtOdW1CeXRlczEyOCk7Ci0gIHJldHVybiBGcm9tMTI4Qml0QkUodG1wKTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tMTI4Qml0TEUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCkgewotICBVdWlkIHU7Ci0gIHN0ZDo6cmV2ZXJzZV9jb3B5KHV1aWQuZGF0YSgpLCB1dWlkLmRhdGEoKSArIGtOdW1CeXRlczEyOCwgdS51dS5iZWdpbigpKTsKLSAgcmV0dXJuIHU7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTEyOEJpdExFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpIHsKLSAgVVVJRDEyOEJpdCB0bXA7Ci0gIG1lbWNweSh0bXAuZGF0YSgpLCB1dWlkLCBrTnVtQnl0ZXMxMjgpOwotICByZXR1cm4gRnJvbTEyOEJpdExFKHRtcCk7Ci19Ci0KLWNvbnN0IFVVSUQxMjhCaXQgVXVpZDo6VG8xMjhCaXRMRSgpIGNvbnN0IHsKLSAgVVVJRDEyOEJpdCBsZTsKLSAgc3RkOjpyZXZlcnNlX2NvcHkodXUuZGF0YSgpLCB1dS5kYXRhKCkgKyBrTnVtQnl0ZXMxMjgsIGxlLmJlZ2luKCkpOwotICByZXR1cm4gbGU7Ci19Ci0KLWNvbnN0IFVVSUQxMjhCaXQmIFV1aWQ6OlRvMTI4Qml0QkUoKSBjb25zdCB7IHJldHVybiB1dTsgfQotCi1VdWlkIFV1aWQ6OkdldFJhbmRvbSgpIHsKLSAgVXVpZCB1dWlkOwotICBiYXNlOjpSYW5kQnl0ZXModXVpZC51dS5kYXRhKCksIHV1aWQudXUuc2l6ZSgpKTsKLSAgcmV0dXJuIHV1aWQ7Ci19Ci0KLWJvb2wgVXVpZDo6SXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzID09IGtFbXB0eTsgfQotCi12b2lkIFV1aWQ6OlVwZGF0ZVV1aWQoY29uc3QgVXVpZCYgdXVpZCkgewotICB1dSA9IHV1aWQudXU7Ci19Ci0KLWJvb2wgVXVpZDo6b3BlcmF0b3I8KGNvbnN0IFV1aWQmIHJocykgY29uc3QgewotICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSh1dS5iZWdpbigpLCB1dS5lbmQoKSwgcmhzLnV1LmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocy51dS5lbmQoKSk7Ci19Ci0KLWJvb2wgVXVpZDo6b3BlcmF0b3I9PShjb25zdCBVdWlkJiByaHMpIGNvbnN0IHsgcmV0dXJuIHV1ID09IHJocy51dTsgfQotCi1ib29sIFV1aWQ6Om9wZXJhdG9yIT0oY29uc3QgVXVpZCYgcmhzKSBjb25zdCB7IHJldHVybiB1dSAhPSByaHMudXU7IH0KLQotc3RkOjpzdHJpbmcgVXVpZDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAiJTAyeCUwMnglMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgdXVbMF0sIHV1WzFdLCB1dVsyXSwgdXVbM10sIHV1WzRdLCB1dVs1XSwgdXVbNl0sIHV1WzddLCB1dVs4XSwgdXVbOV0sCi0gICAgICB1dVsxMF0sIHV1WzExXSwgdXVbMTJdLCB1dVsxM10sIHV1WzE0XSwgdXVbMTVdKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC90eXBlcy9ibHVldG9vdGgvdXVpZC5oIGIvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL2JsdWV0b290aC91dWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTViNWIuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL2JsdWV0b290aC91dWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gVGhpcyBjbGFzcyBpcyByZXByZXNlbnRpbmcgQmx1ZXRvb3RoIFVVSURzIGFjcm9zcyB3aG9sZSBzdGFjay4KLS8vIEhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBlbmRpYW5uZXNzIHJ1bGVzOgotLy8gMS4gVVVJRCBpcyBpbnRlcm5hbGx5IGtlcHQgYXMgYXMgQmlnIEVuZGlhbi4KLS8vIDIuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIHVwcGVyIGxheWVycywgSmF2YSBvciBCaW5kZXIsIGFyZSBCaWcKLS8vICAgIEVuZGlhbi4KLS8vIDMuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIGxvd2VyIGxheWVyLCBIQ0kgcGFja2V0cywgYXJlIExpdHRsZQotLy8gICAgRW5kaWFuLgotLy8gNC4gVVVJRCBpbiBzdG9yYWdlIGlzIGFsd2F5cyBzdHJpbmcuCi1jbGFzcyBVdWlkIGZpbmFsIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczEyOCA9IDE2OwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtQnl0ZXMzMiA9IDQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczE2ID0gMjsKLQotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU3RyaW5nMTI4Qml0TGVuID0gMzY7Ci0KLSAgc3RhdGljIGNvbnN0IFV1aWQga0VtcHR5OyAgLy8gMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwCi0KLSAgdXNpbmcgVVVJRDEyOEJpdCA9IHN0ZDo6YXJyYXk8dWludDhfdCwga051bUJ5dGVzMTI4PjsKLQotICBVdWlkKCkgPSBkZWZhdWx0OwotCi0gIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSByYW5kb20gMTI4LWJpdCBVVUlELgotICBzdGF0aWMgVXVpZCBHZXRSYW5kb20oKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQgaW4gYnl0ZXMuIEVpdGhlcgotICAvLyBrTnVtQnl0ZXMxNiwga051bUJ5dGVzMzIsIG9yIGtOdW1CeXRlczEyOAotICBzaXplX3QgR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBVVUlEIGNhbiBiZSByZXByZXNlbnRlZCBhcyAxNiBiaXQuCi0gIGJvb2wgSXMxNkJpdCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMTYgYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlELiBVc2UKLSAgLy8gR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBvciBJczE2Qml0KCkgYmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kLgotICB1aW50MTZfdCBBczE2Qml0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyAzMiBiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQuIFVzZQotICAvLyBHZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpIGJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZC4KLSAgdWludDMyX3QgQXMzMkJpdCgpIGNvbnN0OwotCi0gIC8vIENvbnZlcnRzIHN0cmluZyByZXByZXNlbnRpbmcgMTI4LCAzMiwgb3IgMTYgYml0IFVVSUQgaW4KLSAgLy8geHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4LCB4eHh4eHh4eCwgb3IgeHh4eCBmb3JtYXQgdG8gVVVJRC4gSWYKLSAgLy8gc2V0LCBvcHRpb25hbCBpc192YWxpZCBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiBjb252ZXJzaW9uIGlzCi0gIC8vIHN1Y2Nlc3NmdWxsLCBmYWxzZSBvdGhlcndpc2UuCi0gIHN0YXRpYyBVdWlkIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHV1aWQsIGJvb2wqIGlzX3ZhbGlkID0gbnVsbHB0cik7Ci0KLSAgLy8gQ29udmVydHMgMTZiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiBVVUlEIHRvIFVVSUQKLSAgc3RhdGljIFV1aWQgRnJvbTE2Qml0KHVpbnQxNl90IHV1aWQxNmJpdCk7Ci0KLSAgLy8gQ29udmVydHMgMzJiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiBVVUlEIHRvIFVVSUQKLSAgc3RhdGljIFV1aWQgRnJvbTMyQml0KHVpbnQzMl90IHV1aWQzMmJpdCk7Ci0KLSAgLy8gQ29udmVydHMgMTI4IGJpdCBCaWcgRW5kaWFuIGFycmF5IHJlcHJlc2VudGluZyBVVUlEIHRvIFVVSUQuCi0gIHN0YXRpYyBjb25zdGV4cHIgVXVpZCBGcm9tMTI4Qml0QkUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCkgewotICAgIFV1aWQgdSh1dWlkKTsKLSAgICByZXR1cm4gdTsKLSAgfQotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgQmlnIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELiB8dXVpZHwgcG9pbnRzCi0gIC8vIHRvIGJlZ2lubmluZyBvZiBhcnJheS4KLSAgc3RhdGljIFV1aWQgRnJvbTEyOEJpdEJFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpOwotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgTGl0dGxlIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELgotICBzdGF0aWMgVXVpZCBGcm9tMTI4Qml0TEUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCk7Ci0KLSAgLy8gQ29udmVydHMgMTI4IGJpdCBMaXR0bGUgRW5kaWFuIGFycmF5IHJlcHJlc2VudGluZyBVVUlEIHRvIFVVSUQuIHx1dWlkfAotICAvLyBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIGFycmF5LgotICBzdGF0aWMgVXVpZCBGcm9tMTI4Qml0TEUoY29uc3QgdWludDhfdCogdXVpZCk7Ci0KLSAgLy8gUmV0dXJucyAxMjggYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlECi0gIGNvbnN0IFVVSUQxMjhCaXQgVG8xMjhCaXRMRSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMTI4IGJpdCBCaWcgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVVJRAotICBjb25zdCBVVUlEMTI4Qml0JiBUbzEyOEJpdEJFKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgVVVJRCBpbgotICAvLyB4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHggZm9ybWF0LCBsb3dlcmNhc2UuCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgVVVJRCBpcyBlcXVhbCB0byBrRW1wdHkKLSAgYm9vbCBJc0VtcHR5KCkgY29uc3Q7Ci0KLSAgLy8gVXBkYXRlIFVVSUQgd2l0aCBuZXcgdmFsdWUKLSAgdm9pZCBVcGRhdGVVdWlkKGNvbnN0IFV1aWQmIHV1aWQpOwotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFV1aWQmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVdWlkJiByaHMpIGNvbnN0OwotICBib29sIG9wZXJhdG9yIT0oY29uc3QgVXVpZCYgcmhzKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0ZXhwciBVdWlkKGNvbnN0IFVVSUQxMjhCaXQmIHZhbCkgOiB1dXt2YWx9IHt9OwotCi0gIC8vIE5ldHdvcmstYnl0ZS1vcmRlcmVkIElEIChCaWcgRW5kaWFuKS4KLSAgVVVJRDEyOEJpdCB1dTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhKSB7Ci0gIG9zIDw8IGEuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi0vLyBDdXN0b20gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgYmx1ZXRvb3RoOjpVVUlEIGNhbiBiZSB1c2VkIGFzIGEga2V5Ci0vLyBpbiBzdGQ6OnVub3JkZXJlZF9tYXAuCi1uYW1lc3BhY2Ugc3RkIHsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGJsdWV0b290aDo6VXVpZD4gewotICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGJsdWV0b290aDo6VXVpZCYga2V5KSBjb25zdCB7Ci0gICAgY29uc3QgYXV0byYgdXVpZF9ieXRlcyA9IGtleS5UbzEyOEJpdEJFKCk7Ci0gICAgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPiBoYXNoX2ZuOwotICAgIHJldHVybiBoYXNoX2ZuKHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHV1aWRfYnl0ZXMuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2J5dGVzLnNpemUoKSkpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmNjIGIvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL2NsYXNzX29mX2RldmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1YTQxMi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImNsYXNzX29mX2RldmljZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19zcGxpdC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihDbGFzc09mRGV2aWNlKSA9PSBDbGFzc09mRGV2aWNlOjprTGVuZ3RoLAotICAgICAgICAgICAgICAiQ2xhc3NPZkRldmljZSBtdXN0IGJlIDMgYnl0ZXMgbG9uZyEiKTsKLQotQ2xhc3NPZkRldmljZTo6Q2xhc3NPZkRldmljZShjb25zdCB1aW50OF90ICgmY2xhc3Nfb2ZfZGV2aWNlKVtrTGVuZ3RoXSkgewotICBzdGQ6OmNvcHkoY2xhc3Nfb2ZfZGV2aWNlLCBjbGFzc19vZl9kZXZpY2UgKyBrTGVuZ3RoLCBjb2QpOwotfTsKLQotc3RkOjpzdHJpbmcgQ2xhc3NPZkRldmljZTo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoIiUwM3gtJTAxeC0lMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvZFsyXSkgPDwgNCkgfCBjb2RbMV0gPj4gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RbMV0gJiAweDBmLCBjb2RbMF0pOwotfQotCi1ib29sIENsYXNzT2ZEZXZpY2U6OkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sIENsYXNzT2ZEZXZpY2UmIHRvKSB7Ci0gIENsYXNzT2ZEZXZpY2UgbmV3X2NvZDsKLSAgaWYgKGZyb20ubGVuZ3RoKCkgIT0gOCkgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBieXRlX3Rva2VucyA9Ci0gICAgICBiYXNlOjpTcGxpdFN0cmluZyhmcm9tLCAiLSIsIGJhc2U6OlRSSU1fV0hJVEVTUEFDRSwgYmFzZTo6U1BMSVRfV0FOVF9BTEwpOwotCi0gIGlmIChieXRlX3Rva2Vucy5zaXplKCkgIT0gMykgcmV0dXJuIGZhbHNlOwotICBpZiAoYnl0ZV90b2tlbnNbMF0ubGVuZ3RoKCkgIT0gMykgcmV0dXJuIGZhbHNlOwotICBpZiAoYnl0ZV90b2tlbnNbMV0ubGVuZ3RoKCkgIT0gMSkgcmV0dXJuIGZhbHNlOwotICBpZiAoYnl0ZV90b2tlbnNbMl0ubGVuZ3RoKCkgIT0gMikgcmV0dXJuIGZhbHNlOwotCi0gIHVpbnQxNl90IHZhbHVlc1szXTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtMZW5ndGg7IGkrKykgewotICAgIGNvbnN0IGF1dG8mIHRva2VuID0gYnl0ZV90b2tlbnNbaV07Ci0KLSAgICBjaGFyKiB0ZW1wID0gbnVsbHB0cjsKLSAgICB2YWx1ZXNbaV0gPSBzdHJ0b2wodG9rZW4uY19zdHIoKSwgJnRlbXAsIDE2KTsKLSAgICBpZiAoKnRlbXAgIT0gJ1wwJykgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbmV3X2NvZC5jb2RbMF0gPSB2YWx1ZXNbMl07Ci0gIG5ld19jb2QuY29kWzFdID0gdmFsdWVzWzFdIHwgKCh2YWx1ZXNbMF0gJiAweGYpIDw8IDQpOwotICBuZXdfY29kLmNvZFsyXSA9IHZhbHVlc1swXSA+PiA0OwotCi0gIHRvID0gbmV3X2NvZDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXNpemVfdCBDbGFzc09mRGV2aWNlOjpGcm9tT2N0ZXRzKGNvbnN0IHVpbnQ4X3QqIGZyb20pIHsKLSAgc3RkOjpjb3B5KGZyb20sIGZyb20gKyBrTGVuZ3RoLCBjb2QpOwotICByZXR1cm4ga0xlbmd0aDsKLX07Ci0KLWJvb2wgQ2xhc3NPZkRldmljZTo6SXNWYWxpZChjb25zdCBzdGQ6OnN0cmluZyYgY29kKSB7Ci0gIENsYXNzT2ZEZXZpY2UgdG1wOwotICByZXR1cm4gQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZyhjb2QsIHRtcCk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmggYi9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZmZmYzguLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL2NsYXNzX29mX2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdHlwZXMgewotCi0vKiogQmx1ZXRvb3RoIENsYXNzIG9mIERldmljZSAqLwotY2xhc3MgQ2xhc3NPZkRldmljZSBmaW5hbCB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTGVuZ3RoID0gMzsKLQotICB1aW50OF90IGNvZFtrTGVuZ3RoXTsKLQotICBDbGFzc09mRGV2aWNlKCkgPSBkZWZhdWx0OwotICBDbGFzc09mRGV2aWNlKGNvbnN0IHVpbnQ4X3QgKCZjbGFzc19vZl9kZXZpY2UpW2tMZW5ndGhdKTsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2xhc3NPZkRldmljZSYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIChzdGQ6Om1lbWNtcChjb2QsIHJocy5jb2QsIHNpemVvZihjb2QpKSA9PSAwKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gQ29udmVydHMgfHN0cmluZ3wgdG8gQ2xhc3NPZkRldmljZSBhbmQgcGxhY2VzIGl0IGluIHx0b3wuIElmIHxmcm9tfCBkb2VzCi0gIC8vIG5vdCByZXByZXNlbnQgYSBDbGFzcyBvZiBEZXZpY2UsIHx0b3wgaXMgbm90IG1vZGlmaWVkIGFuZCB0aGlzIGZ1bmN0aW9uCi0gIC8vIHJldHVybnMgZmFsc2UuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgotICBzdGF0aWMgYm9vbCBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBDbGFzc09mRGV2aWNlJiB0byk7Ci0KLSAgLy8gQ29waWVzIHxmcm9tfCByYXcgQ2xhc3Mgb2YgRGV2aWNlIG9jdGV0cyB0byB0aGUgbG9jYWwgb2JqZWN0LgotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29waWVkIG9jdGV0cyAoYWx3YXlzIENsYXNzT2ZEZXZpY2U6OmtMZW5ndGgpCi0gIHNpemVfdCBGcm9tT2N0ZXRzKGNvbnN0IHVpbnQ4X3QqIGZyb20pOwotCi0gIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNsYXNzX29mX2RldmljZSk7Ci19OwotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENsYXNzT2ZEZXZpY2UmIGMpIHsKLSAgb3MgPDwgYy5Ub1N0cmluZygpOwotICByZXR1cm4gb3M7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0eXBlcwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi11c2luZyA6OmJsdWV0b290aDo6dHlwZXM6OkNsYXNzT2ZEZXZpY2U7ICAvLyBUT0RPLCByZW1vdmUKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC90eXBlcy9yYXdfYWRkcmVzcy5jYyBiL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC90eXBlcy9yYXdfYWRkcmVzcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2OWY1Zi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9jZXJ0aWZpY2F0aW9uX3Rvb2wvdHlwZXMvcmF3X2FkZHJlc3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3NwbGl0Lmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLXN0YXRpY19hc3NlcnQoc2l6ZW9mKFJhd0FkZHJlc3MpID09IDYsICJSYXdBZGRyZXNzIG11c3QgYmUgNiBieXRlcyBsb25nISIpOwotCi1jb25zdCBSYXdBZGRyZXNzIFJhd0FkZHJlc3M6OmtBbnl7ezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9fTsKLWNvbnN0IFJhd0FkZHJlc3MgUmF3QWRkcmVzczo6a0VtcHR5e3sweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfX07Ci0KLVJhd0FkZHJlc3M6OlJhd0FkZHJlc3MoY29uc3QgdWludDhfdCAoJmFkZHIpWzZdKSB7Ci0gIHN0ZDo6Y29weShhZGRyLCBhZGRyICsga0xlbmd0aCwgYWRkcmVzcyk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFJhd0FkZHJlc3M6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIGFkZHJlc3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1sxXSwgYWRkcmVzc1syXSwgYWRkcmVzc1szXSwgYWRkcmVzc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzWzVdKTsKLX0KLQotYm9vbCBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBSYXdBZGRyZXNzJiB0bykgewotICBSYXdBZGRyZXNzIG5ld19hZGRyOwotICBpZiAoZnJvbS5sZW5ndGgoKSAhPSAxNykgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBieXRlX3Rva2VucyA9Ci0gICAgICBiYXNlOjpTcGxpdFN0cmluZyhmcm9tLCAiOiIsIGJhc2U6OlRSSU1fV0hJVEVTUEFDRSwgYmFzZTo6U1BMSVRfV0FOVF9BTEwpOwotCi0gIGlmIChieXRlX3Rva2Vucy5zaXplKCkgIT0gNikgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgY29uc3QgYXV0byYgdG9rZW4gPSBieXRlX3Rva2Vuc1tpXTsKLQotICAgIGlmICh0b2tlbi5sZW5ndGgoKSAhPSAyKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBjaGFyKiB0ZW1wID0gbnVsbHB0cjsKLSAgICBuZXdfYWRkci5hZGRyZXNzW2ldID0gc3RydG9sKHRva2VuLmNfc3RyKCksICZ0ZW1wLCAxNik7Ci0gICAgaWYgKCp0ZW1wICE9ICdcMCcpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHRvID0gbmV3X2FkZHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgUmF3QWRkcmVzczo6RnJvbU9jdGV0cyhjb25zdCB1aW50OF90KiBmcm9tKSB7Ci0gIHN0ZDo6Y29weShmcm9tLCBmcm9tICsga0xlbmd0aCwgYWRkcmVzcyk7Ci0gIHJldHVybiBrTGVuZ3RoOwotfTsKLQotYm9vbCBSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcykgewotICBSYXdBZGRyZXNzIHRtcDsKLSAgcmV0dXJuIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoYWRkcmVzcywgdG1wKTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL2NlcnRpZmljYXRpb25fdG9vbC90eXBlcy9yYXdfYWRkcmVzcy5oIGIvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL3Jhd19hZGRyZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzUwMTguLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vY2VydGlmaWNhdGlvbl90b29sL3R5cGVzL3Jhd19hZGRyZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKiogQmx1ZXRvb3RoIEFkZHJlc3MgKi8KLWNsYXNzIFJhd0FkZHJlc3MgZmluYWwgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga0xlbmd0aCA9IDY7Ci0KLSAgdWludDhfdCBhZGRyZXNzW2tMZW5ndGhdOwotCi0gIFJhd0FkZHJlc3MoKSA9IGRlZmF1bHQ7Ci0gIFJhd0FkZHJlc3MoY29uc3QgdWludDhfdCAoJmFkZHIpW2tMZW5ndGhdKTsKLQotICBib29sIG9wZXJhdG9yPChjb25zdCBSYXdBZGRyZXNzJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gKHN0ZDo6bWVtY21wKGFkZHJlc3MsIHJocy5hZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpIDwgMCk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJhd0FkZHJlc3MmIHJocykgY29uc3QgewotICAgIHJldHVybiAoc3RkOjptZW1jbXAoYWRkcmVzcywgcmhzLmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSkgPT0gMCk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmF3QWRkcmVzcyYgcmhzKSBjb25zdCB7IHJldHVybiAocmhzIDwgKnRoaXMpOyB9Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSYXdBZGRyZXNzJiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPiByaHMpOyB9Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXdBZGRyZXNzJiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPCByaHMpOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSYXdBZGRyZXNzJiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQotCi0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzID09IGtFbXB0eTsgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gQ29udmVydHMgfHN0cmluZ3wgdG8gUmF3QWRkcmVzcyBhbmQgcGxhY2VzIGl0IGluIHx0b3wuIElmIHxmcm9tfCBkb2VzCi0gIC8vIG5vdCByZXByZXNlbnQgYSBCbHVldG9vdGggYWRkcmVzcywgfHRvfCBpcyBub3QgbW9kaWZpZWQgYW5kIHRoaXMgZnVuY3Rpb24KLSAgLy8gcmV0dXJucyBmYWxzZS4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRydWUuCi0gIHN0YXRpYyBib29sIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sIFJhd0FkZHJlc3MmIHRvKTsKLQotICAvLyBDb3BpZXMgfGZyb218IHJhdyBCbHVldG9vdGggYWRkcmVzcyBvY3RldHMgdG8gdGhlIGxvY2FsIG9iamVjdC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcGllZCBvY3RldHMgLSBzaG91bGQgYmUgYWx3YXlzIFJhd0FkZHJlc3M6OmtMZW5ndGgKLSAgc2l6ZV90IEZyb21PY3RldHMoY29uc3QgdWludDhfdCogZnJvbSk7Ci0KLSAgc3RhdGljIGJvb2wgSXNWYWxpZEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpOwotCi0gIHN0YXRpYyBjb25zdCBSYXdBZGRyZXNzIGtFbXB0eTsgIC8vIDAwOjAwOjAwOjAwOjAwOjAwCi0gIHN0YXRpYyBjb25zdCBSYXdBZGRyZXNzIGtBbnk7ICAgIC8vIEZGOkZGOkZGOkZGOkZGOkZGCi19OwotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJhd0FkZHJlc3MmIGEpIHsKLSAgb3MgPDwgYS5Ub1N0cmluZygpOwotICByZXR1cm4gb3M7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3Qgc3RkOjpoYXNoPFJhd0FkZHJlc3M+IHsKLSAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiB2YWwpIGNvbnN0IHsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50NjRfdCkgPj0gUmF3QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgdWludDY0X3QgaW50X2FkZHIgPSAwOwotICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmaW50X2FkZHIpLCB2YWwuYWRkcmVzcywKLSAgICAgICAgICAgUmF3QWRkcmVzczo6a0xlbmd0aCk7Ci0gICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShpbnRfYWRkcik7Ci0gIH0KLX07CmRpZmYgLS1naXQgYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvQW5kcm9pZC5icCBiL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ0Njc1Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiZnJhbWV3b3JrLWJsdWV0b290aC1hZHZhLXNyY3MiLAotICAgIHNyY3M6IFsiY29yZS8qKi8qLmphdmEiLF0sCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjVhMzAuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5SZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS5sYW5nLkludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotCi0vKioKLSAqIEJsdWV0b290aCBMRSBCcm9hZGNhc3QgU2NhbiBBc3Npc3RhbmNlIHJlbGF0ZWQgY2FsbGJhY2tzLCB1c2VkIHRvIGRlbGl2ZXIgcmVzdWx0IG9mCi0gKiBCcm9hZGNhc3QgQXNzaXN0IG9wZXJhdGlvbnMgcGVyZm9ybWVkIHVzaW5nIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyfQotICoKLSAqIEBoaWRlCi0gKiBAc2VlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIHsKLQotICAgIC8qKiBAaGlkZSAqLwotICAgIEBJbnREZWYocHJlZml4ID0gIkJBU1NfU1RBVFVTXyIsIHZhbHVlID0gewotICAgICAgICAgICAgICBCQVNTX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgICBCQVNTX1NUQVRVU19GQUlMVVJFLAotICAgICAgICAgICAgICBCQVNTX1NUQVRVU19GQVRBTCwKLSAgICAgICAgICAgICAgQkFTU19TVEFUVVNfVFhOX1RJTUVPVVQsCi0gICAgICAgICAgICAgIEJBU1NfU1RBVFVTX0lOVkFMSURfU09VUkNFX0lELAotICAgICAgICAgICAgICBCQVNTX1NUQVRVU19DT0xPQ0FURURfU1JDX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICBCQVNTX1NUQVRVU19JTlZBTElEX1NPVVJDRV9TRUxFQ1RFRCwKLSAgICAgICAgICAgICAgQkFTU19TVEFUVVNfU09VUkNFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICBCQVNTX1NUQVRVU19EVVBMSUNBVEVfQURESVRJT04sCi0gICAgfSkKLQotICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNzX1N0YXR1cyB7fQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTU19TVEFUVVNfU1VDQ0VTUyA9IDB4MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTU19TVEFUVVNfRkFJTFVSRSA9IDB4MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTU19TVEFUVVNfRkFUQUwgPSAweDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU1NfU1RBVFVTX1RYTl9USU1FT1VUID0gMHgwMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU1NfU1RBVFVTX0lOVkFMSURfU09VUkNFX0lEID0gMHgwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNTX1NUQVRVU19DT0xPQ0FURURfU1JDX1VOQVZBSUxBQkxFID0gMHgwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNTX1NUQVRVU19JTlZBTElEX1NPVVJDRV9TRUxFQ1RFRCA9IDB4MDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTU19TVEFUVVNfU09VUkNFX1VOQVZBSUxBQkxFID0gMHgwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNTX1NUQVRVU19EVVBMSUNBVEVfQURESVRJT04gPSAweDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU1NfU1RBVFVTX05PX0VNUFRZX1NMT1QgPSAweDA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU1NfU1RBVFVTX0lOVkFMSURfR1JPVVBfT1AgPSAweDEwOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hlbiBCTEUgYnJvYWRjYXN0IGF1ZGlvIHNvdXJjZSBmb3VuZC4KLSAgICAgKiByZXN1bHQgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIjc2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVyc30gd2lsbCBiZQotICAgICAqIGRlbGl2ZXJlZCB0aHJvdWdoIHRoaXMgY2FsbGJhY2sKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2FucmVzIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3Qgb2YgdGhlIHNjYW5uZWQgcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZChTY2FuUmVzdWx0IHNjYW5yZXMpIHsKLSAgICB9OwotCi0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGVuIEJMRSBicm9hZGNhc3QgYXVkaW8gc291cmNlIGZvdW5kLgotICAgICAqIHJlc3VsdCBvZiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNzZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzfSB3aWxsIGJlCi0gICAgICogZGVsaXZlcmVkIHRocm91Z2ggdGhpcyBjYWxsYmFjawotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXR1cyBTdGF0dXMgb2YgdGhlIEJyb2FkY2FzdCBzb3VyY2Ugc2VsZWN0aW9uLgotICAgICAqIEBwYXJhbSBicm9hZGNhc3RTb3VyY2VDaGFubmVscyB7QGxpbmsgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbH0gTGlzdAotICAgICAqIGNvbnRhaW5pbmcgYXZhaWFibGUgYnJvYWRjYXN0IHNvdXJjZSBjaGFubmVscyB0aGF0IGFyZSBiZWluZyBicm9hZGNhc3RlZCBmcm9tIHRoZSBzZWxlY3RlZAotICAgICAqIGJyb2FkY2FzdCBzb3VyY2UKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0U291cmNlU2VsZWN0ZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCYXNzX1N0YXR1cyBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IGJyb2FkY2FzdFNvdXJjZUNoYW5uZWxzKSB7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoZW4gQkxFIGJyb2FkY2FzdCBhdWRpbyBzb3VyY2UgaXMgYmVlbiBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gdGhlIHJlbW90ZSBTY2FuIGRlbGVnYXRvci4KLSAgICAgKiByZXN1bHQgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIjYWRkQnJvYWRjYXN0U291cmNlfSB3aWxsIGJlCi0gICAgICogZGVsaXZlcmVkIHRocm91Z2ggdGhpcyBjYWxsYmFjawotICAgICAqCi0gICAgICogVGhpcyBjYWxsYmFjayBpcyBhbiBhY2tub3dsZWRnZW1lbnQgY29uZmlybWluZyB0aGUgc291cmNlIGluZm9ybWF0aW9uIGFkZGVkCi0gICAgICogdG8gdGhlIFNjYW4gZGVsZWdhdG9yLiBBY3R1YWwgdXBkYXRlZCBzb3VyY2UgSW5mb3JtYXRpb24gdmFsdWVzIG9mIHJlc3VsdGluZyBCcm9hZGNhc3QgU291cmNlIEluZm9ybWF0aW9uCi0gICAgICogd2lsbCBiZSBub3RpZmllZCB1c2luZyB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfSBpbnRlbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgcmVtb3RlIHNjYW4gZGVsZWdhdG9yIGZvciB3aGljaCBTb3VyY2UgaXMgYmVlbiBhZGRlZC4KLSAgICAgKiBAcGFyYW0gc3JjSWQgc291cmNlIElkIG9mIHRoZSBCcm9hZGNhc3Qgc291cmNlIGluZm9ybWF0aW9uIGFkZGVkCi0gICAgICogQHBhcmFtIHN0YXR1cyB0cnVlIG9uIHN1Y2Nlc2Z1bCBhZGRpdGlvbiBvZiBzb3VyY2UgSW5mb3JtYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKgotICAgICAqLwotICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZUFkZGVkKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJhc3NfU3RhdHVzIGludCBzdGF0dXMpIHsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hlbiBCTEUgYnJvYWRjYXN0IGF1ZGlvIHNvdXJjZSBJbmZvcm1hdGlvbiBpcyBiZWVuIHVwZGF0ZWQgdG8gdGhlIHJlbW90ZSBTY2FuIGRlbGVnYXRvci4KLSAgICAgKiByZXN1bHQgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIjdXBkYXRlQnJvYWRjYXN0U291cmNlfSB3aWxsIGJlCi0gICAgICogZGVsaXZlcmVkIHRocm91Z2ggdGhpcyBjYWxsYmFjawotICAgICAqCi0gICAgICogVGhpcyBjYWxsYmFjayBpcyBhbiBhY2tub3dsZWRnZW1lbnQgY29uZmlybWluZyB0aGUgc291cmNlIGluZm9ybWF0aW9uIHVwZGF0ZSByZXF1ZXN0IGlzIHN1Y2Nlc2Z1bGx5Ci0gICAgICogd3JpdHRlbiBvbiB0aGUgU2NhbiBkZWxlZ2F0b3IuIEFjdHVhbCB1cGRhdGVkIHNvdXJjZSBJbmZvcm1hdGlvbiB2YWx1ZXMgb2YgcmVzdWx0aW5nIEJyb2FkY2FzdCBTb3VyY2UgSW5mb3JtYXRpb24KLSAgICAgKiB3aWxsIGJlIG5vdGlmaWVkIHVzaW5nIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI0FDVElPTl9CUk9BRENBU1RfUkVDRUlWRVJfU1RBVEV9IGludGVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSByZW1vdGUgc2NhbiBkZWxlZ2F0b3IgZm9yIHdoaWNoIFNvdXJjZSBpcyBiZWVuIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIHNyY0lkIHNvdXJjZSBJZCBvZiB0aGUgQnJvYWRjYXN0IHNvdXJjZSBpbmZvcm1hdGlvbiB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0dXMgdHJ1ZSBvbiBzdWNjZXNmdWwgdXBkYXRpbmcgb2Ygc291cmNlIEluZm9ybWF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlVXBkYXRlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCYXNzX1N0YXR1cyBpbnQgc3RhdHVzKSB7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoZW4gQkxFIGJyb2FkY2FzdCBhdWRpbyBzb3VyY2UgSW5mb3JtYXRpb24gaXMgdXBkYXRlZCB3aXRoIGJyb2FkY2FzdCBQSU4gY29kZSB0byB0aGUgcmVtb3RlIFNjYW4gZGVsZWdhdG9yLgotICAgICAqIHJlc3VsdCBvZiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNzZXRCcm9hZGNhc3RDb2RlfSB3aWxsIGJlCi0gICAgICogZGVsaXZlcmVkIHRocm91Z2ggdGhpcyBjYWxsYmFjawotICAgICAqCi0gICAgICogVGhpcyBjYWxsYmFjayBpcyBhbiBhY2tub3dsZWRnZW1lbnQgY29uZmlybWluZyB0aGUgQnJvYWRjYXN0IFBJTiB1cGRhdGUgcmVxdWVzdCBpcyBzdWNjZXNmdWxseQotICAgICAqIHdyaXR0ZW4gdG8gdGhlIFNjYW4gZGVsZWdhdG9yLiBBY3R1YWwgdXBkYXRlZCBzb3VyY2UgSW5mb3JtYXRpb24gdmFsdWVzIG9mIHJlc3VsdGluZyBCcm9hZGNhc3QgU291cmNlIEluZm9ybWF0aW9uCi0gICAgICogd2lsbCBiZSBub3RpZmllZCB1c2luZyB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfSBpbnRlbnQuCi0gICAgICogRW5jcnlwdGlvbiBzdGF0dXMgZnJvbSB0aGUge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIjQUNUSU9OX0JST0FEQ0FTVF9SRUNFSVZFUl9TVEFURX0gd2lsbAotICAgICAqIGNvbmZpcm0gdGhlIHN1Y2Nlc2Z1bGwgQnJvYWRjYXN0IFBJTiBjb2RlIGFuZCByZXN1bHRpbmcgZGVjcnlwdGlvbiBvZiB0aGUgQnJvYWRjYXN0IGRhdGEgYXQgdGhlIHJlY2l2ZXIgc2lkZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgcmVtb3RlIHNjYW4gZGVsZWdhdG9yIGZvciB3aGljaCBTb3VyY2UgaXMgYmVlbiB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzcmNJZCBzb3VyY2UgSWQgb2YgdGhlIEJyb2FkY2FzdCBQSU4gdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gc3RhdHVzIHRydWUgb24gc3VjY2VzZnVsIHVwZGF0aW5nIG9mIHNvdXJjZSBJbmZvcm1hdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RQaW5VcGRhdGVkKEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCYXNzX1N0YXR1cyBpbnQgc3RhdHVzKSB7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoZW4gQkxFIGJyb2FkY2FzdCBhdWRpbyBzb3VyY2UgSW5mb3JtYXRpb24gaXMgcmVtb3ZlZCBmcm9tIHRoZSByZW1vdGUgU2NhbiBkZWxlZ2F0b3IuCi0gICAgICogcmVzdWx0IG9mIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI3JlbW92ZUJyb2FkY2FzdFNvdXJjZX0gd2lsbCBiZQotICAgICAqIGRlbGl2ZXJlZCB0aHJvdWdoIHRoaXMgY2FsbGJhY2sKLSAgICAgKgotICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgYW4gYWNrbm93bGVkZ2VtZW50IGNvbmZpcm1pbmcgdGhlIEJyb2FkY2FzdCBzb3VyY2UgaW5mb3IgcmVtb3ZhbCByZXF1ZXN0IGlzIHN1Y2Nlc2Z1bGx5Ci0gICAgICogd3JpdHRlbiB0byB0aGUgU2NhbiBkZWxlZ2F0b3IuIEFjdHVhbCByZW1vdmFsIG9mIHNvdXJjZSBJbmZvcm1hdGlvbiB2YWx1ZXMgb2YgcmVzdWx0aW5nIEJyb2FkY2FzdCBTb3VyY2UgSW5mb3JtYXRpb24KLSAgICAgKiB3aWxsIGJlIG5vdGlmaWVkIHVzaW5nIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI0FDVElPTl9CUk9BRENBU1RfUkVDRUlWRVJfU1RBVEV9IGludGVudC4KLSAgICAgKiBEZWxldGlvbiBvZiBzb3VyY2UgSW5mb3JtYXRpb24gd2lsbCByZXN1bHQgaXMgc2V0dGluZyBhbGwgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiBhdHRyaWJ1dGVzIHRvIFpFUk8gb3RoZXIgdGhhbgotICAgICAqIHNvdXJjZSBJZAotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSByZW1vdGUgc2NhbiBkZWxlZ2F0b3IgZm9yIHdoaWNoIFNvdXJjZSBpcyByZW1vdmVkLgotICAgICAqIEBwYXJhbSBzcmNJZCBzb3VyY2UgSWQgb2YgdGhlIEJyb2FkY2FzdCBzb3VyY2UgaW5mb3JtYXRpb24gcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gc3RhdHVzIHRydWUgb24gc3VjY2VzZnVsIHVwZGF0aW5nIG9mIHNvdXJjZSBJbmZvcm1hdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZVJlbW92ZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJhc3NfU3RhdHVzIGludCBzdGF0dXMpIHsKLSAgICB9OwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyLmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2YmNiNi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3lzdGVtQXBpOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhHYXR0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlci5MZVNjYW5DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW52YWxpZENsYXNzRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLQotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhbkZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlY29yZDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5CbHVldG9vdGhMZVNjYW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcjsKLQotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdG8gcGVyZm9ybSBCcm9hZGNhc3QgQXNzaXN0YW5jZSByZWxhdGVkCi0gKiBvcGVyYXRpb25zLgotICogPHA+Ci0gKiBVc2Uge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIoKX0gdG8gZ2V0IGFuCi0gKiBpbnN0YW5jZSBvZiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcn0uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBNb3N0IG9mIHRoZSBtZXRob2RzIGhlcmUgcmVxdWlyZQotICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59IHBlcm1pc3Npb24uCi0gKgotICogQGhpZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHID0gdHJ1ZTsKLQotICAgIC8qKiBAaGlkZSAqLwotICAgIEBJbnREZWYocHJlZml4ID0gIlNZTkNfIiwgdmFsdWUgPSB7Ci0gICAgICAgICAgIFNZTkNfTUVUQURBVEEsCi0gICAgICAgICAgIFNZTkNfQVVESU8sCi0gICAgICAgICAgIFNZTkNfTUVUQURBVEFfQVVESU8KLSAgICB9KQotICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICBwdWJsaWMgQGludGVyZmFjZSBCcm9hZGNhc3RBc3Npc3RTeW5jU3RhdGUge30KLSAgICAvKioKLSAgICAgKiBJbnB1dCB0byB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNhZGRCcm9hZGNhc3RTb3VyY2V9IG1ldGhvZAotICAgICAqIHdoZXJlIEFwcGxpY2F0aW9uIHdhbnRzIHRvIHN5bmNocm9uaXplIG9ubHkgdG8gTWV0YWRhdGEgKGkuZS4gT25seSBQZXJpb2RpYyBhZHZzKSBhbmQgbm90IHRvCi0gICAgICogIEJyb2FkY3NhdCBhdWRpbyBzdHJlYW0gKGkuZS4gQklTIClmcm9tIGJyb2FkY2FzdCBzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5DX01FVEFEQVRBID0gMDsKLSAgICAvKioKLSAgICAgKiBJbnB1dCB0byB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNhZGRCcm9hZGNhc3RTb3VyY2V9IG1ldGhvZAotICAgICAqIHdoZXJlIEFwcGxpY2F0aW9uIHdhbnRzIHRvIHN5bmNocm9uaXplIG9ubHkgdG8gQnJvYWRjYXN0IEF1ZGlvIHN0cmVhbSAoaS5lLiBCSVMpIGFuZCBub3QgdG8KLSAgICAgICBNZXRhZGF0YSAoaS5lLiBQZXJpb2RpYyBhZHZzIClmcm9tIGJyb2FkY2FzdCBzb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5DX0FVRElPID0gMTsKLSAgICAvKioKLSAgICAgKiBJbnB1dCB0byB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNhZGRCcm9hZGNhc3RTb3VyY2V9IG1ldGhvZAotICAgICAqIHdoZXJlIEFwcGxpY2F0aW9uIHdhbnRzIHRvIHN5bmNocm9uaXplIHRvIGJvdGggIEJyb2FkY2FzdCBBdWRpbyBzdHJlYW0gKGkuZS4gQklTKSBhbmQgYWxzbyB0bwotICAgICAqIE1ldGFkYXRhIChpLmUuIFBlcmlvZGljIGFkdnMgKWZyb20gYnJvYWRjYXN0IHNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTkNfTUVUQURBVEFfQVVESU8gPSAyOwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1CbHVldG9vdGhBZGFwdGVyOwotICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIG1BcHBDYWxsYmFjazsKLSAgICBCbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aERldmljZTsKLSAgICBpbnQgbVN5bmNTdGF0ZSA9IFNZTkNfTUVUQURBVEE7Ci0gICAgQmx1ZXRvb3RoU3luY0hlbHBlciBtQmx1ZXRvb3RoU3luY0hlbHBlciA9IG51bGw7Ci0gICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBtQnJvYWRjYXN0QXVkaW9Tb3VyY2VJbmZvID0gbnVsbDsKLSAgICBwcml2YXRlIGJ5dGUgSU5WQUxJRF9TT1VSQ0VfSUQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgIkJyb2FkY2FzdCByZWNlaXZlciBTdGF0ZSIgaW5mb3JtYXRpb24gb2YgYSBTY2FuIGRlbGVnYXRvciBkZXZpY2UuCi0gICAgICogV2hlbmV2ZXIgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gQnJvYWRjYXN0IHNvdXJjZSBJbmZvcm1hdGlvbiBzdG9yZWQgYXQgU2NhbiBkZWxlZ2F0b3IgZGV2aWNlCi0gICAgICogdGhpcyBJdGVudCB3aWxsIGJlIGRlbGl2ZXJlZCB0byBBcHBsaWNhdGlvbiBsYXllcgotICAgICAqCi0gICAgICoge0BsaW5rICNCbHVldG9vdGhTeW5jSGVscGVyfSBwcm9maWxlIG5lZWQgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBTY2FuIGRlbGVnYXRvciBkZXZpY2UKLSAgICAgKiB0byBnZXQgdGhlc2Ugbm90aWZpY2F0aW9ucwotICAgICAqCi0gICAgICogPHA+VGhpcyBpbnRlbnQgd2lsbCBoYXZlIHR3byBleHRyYToKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0VYVFJBX0RFVklDRX0gLSBUaGUgcmVtb3RlIGRldmljZSBmb3Igd2hpY2ggYnJvYWRjYXN0IHJlY2l2ZXIKLSAgICAgKiBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBicm9hZGNhc3RlZC4gSXQgY2FuCi0gICAgICogYmUgbnVsbCBpZiBubyBkZXZpY2UgaXMgYWN0aXZlLiA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4ge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8jRVhUUkFfU09VUkNFX0lORk99IC0gVGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICogaGF2aW5nIGluZm9ybWF0aW9uIEJyb2FkY2FzdCByZWNlaXZlciBzdGF0ZSA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4ge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8jRVhUUkFfU09VUkNFX0lORk9fSU5ERVh9IC0gSW5kZXggb2YgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8KLSAgICAgKiBvYmplY3QgYnJvYWRjYXN0ZWQgPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IHtAbGluayBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvI0VYVFJBX01BWF9OVU1fU09VUkNFX0lORk9TfSAtIE1heGltdW0gbnVtYmVyIG9mIHNvdXJjZSBJbmZvcm1hdGlvbnMKLSAgICAgKiB0aGF0IHRoaXMgQnJvYWRjYXN0IHJlY2VpdmVyIGNhbiBob2xkIDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSBwZXJtaXNzaW9uIHRvCi0gICAgICogcmVjZWl2ZS4KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQlJPQURDQVNUX1NPVVJDRV9JTkZPID0KLSAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5Ccm9hZGNhc3RBdWRpb1NBTWFuYWdlci5hY3Rpb24uQlJPQURDQVNUX1NPVVJDRV9JTkZPIjsKLQotCi0gICAgLy8gVGhlc2UgY2FsbGJhY2tzIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBCYXNzY2xpZW50U2VydmljZUxpc3RlbmVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW50IHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUgcHJveHkpIHsKLSAgICAgICAgICAgIGxvZyhUQUcsICJCYXNzU2VydmljZSBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgIG9uQmx1ZXRvb3RoU3luY0hlbHBlclN0YXRlQ2hhbmdlZCh0cnVlLCBwcm94eSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgewotICAgICAgICAgICAgbG9nKFRBRywgIkJhc3NTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICAgICAgb25CbHVldG9vdGhTeW5jSGVscGVyU3RhdGVDaGFuZ2VkKGZhbHNlLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkJsdWV0b290aFN5bmNIZWxwZXJTdGF0ZUNoYW5nZWQoYm9vbGVhbiBvbiwgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSkgewotICAgICAgICBpZiAob24pIHsKLSAgICAgICAgICAgIG1CbHVldG9vdGhTeW5jSGVscGVyID0gKEJsdWV0b290aFN5bmNIZWxwZXIpIHByb3h5OwotICAgICAgICAgICAgbUJsdWV0b290aFN5bmNIZWxwZXIucmVnaXN0ZXJBcHBDYWxsYmFjayhtQmx1ZXRvb3RoRGV2aWNlLCBtQXBwQ2FsbGJhY2spOwotICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CbHVldG9vdGhTeW5jSGVscGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qcGFja2FnZSovQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcihCbHVldG9vdGhTeW5jSGVscGVyIHNjYW5PZmZsb2FkZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgIG1CbHVldG9vdGhBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotCi0gICAgICAgIG1BcHBDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQmx1ZXRvb3RoRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBtQmx1ZXRvb3RoU3luY0hlbHBlciA9IHNjYW5PZmZsb2FkZXI7Ci0gICAgfQotCi0KLSAgICAvKmZpbmFsaXplIG1ldGhvZCB0byBjbGVhbnVwKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgbG9nKFRBRywgImZpbmFsaXplKCkiKTsKLSAgICAgICAgaWYgKG1CbHVldG9vdGhTeW5jSGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CbHVldG9vdGhTeW5jSGVscGVyLnVucmVnaXN0ZXJBcHBDYWxsYmFjayhtQmx1ZXRvb3RoRGV2aWNlLCBtQXBwQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBMZSBBdWRpbyBCcm9hZGNhc3RlcnMgb24gYmVoYWxmIG9mIHRoZSBTY2FuIGRlbGVnYXRvciB3aXRoIHdoaWNoIHRoaXMKLSAgICAgKiB7QCBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyfSBpcyBpbnN0YW50aWF0ZWQKLSAgICAgKgotICAgICAqICBzZWFyY2ggcmVzdWx0cyB3aWxsIGJlIGRlbGl2ZXJlZCB0byBhcHBsaWNhdGlvbiB1c2luZwotICAgICAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayNvbkJsZUJyb2FkY2FzdFNvdXJjZUZvdW5kfQotICAgICAqCi0gICAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgSXQgaXMgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCB0aGUgU2VhcmNoIGZvciBBdWRpbyBicm9hZGNhc3RlcnMsCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMgKCkgewotICAgICAgICBsb2coVEFHLCAic2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVyczogIik7Ci0gICAgICAgIGlmIChtQmx1ZXRvb3RoU3luY0hlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJsdWV0b290aFN5bmNIZWxwZXIuc2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhtQmx1ZXRvb3RoRGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnM6IG1CbHVldG9vdGhTeW5jSGVscGVyIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgLyoqCi0gICAgICogU3RvcHMgYW4gb25nb2luZyBCbHVldG9vdGggTEUgU2VhcmNoIGZvciBBdWRpbyBCcm9hZGNhc3RlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBJdCBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkIHRoZSBTdG9wcGVkIHRoZSBTZWFyY2ggZm9yIEF1ZGlvIGJyb2FkY2FzdGVycwotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICoKLSAgICAgKkBoaWRlCi0gICAgICovCi0gICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTikKLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycygpIHsKLSAgICAgICAgbG9nKFRBRywgInN0b3BTZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzKCkiKTsKLSAgICAgICAgaWYgKG1CbHVldG9vdGhTeW5jSGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoU3luY0hlbHBlci5zdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhtQmx1ZXRvb3RoRGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInN0b3BTZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzOiBtQmx1ZXRvb3RoU3luY0hlbHBlciBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgLyogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdXNlciBpbnB1dCBzeW5jIHN0YXRlIHRvIHJlcXVpcmVkIGludGVybmFsCi0gICAgICogZm9ybWF0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgY29udmVydE1ldGFkYXRhU3luY1N0YXRlKGludCBzeW5jU3RhdGUpIHsKLSAgICAgICAgaWYgKHN5bmNTdGF0ZSA9PSBTWU5DX01FVEFEQVRBX0FVRElPIHx8IHN5bmNTdGF0ZSA9PSBTWU5DX01FVEFEQVRBKSB7Ci0gICAgICAgICAgICByZXR1cm4gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSURMRTsKLSAgICB9Ci0KLSAgICAvKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCB1c2VyIGlucHV0IHN5bmMgc3RhdGUgdG8gcmVxdWlyZWQgaW50ZXJuYWwKLSAgICAgKiBmb3JtYXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBjb252ZXJ0QXVkaW9EYXRhU3luY1N0YXRlKGludCBzeW5jU3RhdGUpIHsKLSAgICAgICAgaWYgKHN5bmNTdGF0ZSA9PSBTWU5DX01FVEFEQVRBX0FVRElPIHx8IHN5bmNTdGF0ZSA9PSBTWU5DX0FVRElPKSB7Ci0gICAgICAgICAgICByZXR1cm4gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfU1lOQ0hST05JWkVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVyczogbUJsdWV0b290aFN5bmNIZWxwZXIgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9OT1RfU1lOQ0hST05JWkVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgYnJvYWRjYXN0IHNvdXJjZSBmb3IgdGhlIFNjYW4gZGVsZWdhdG9yLiBUaGlzIGludGVybmFsbHkgcGVyZm9ybXMgUGVyaW9kaWMKLSAgICAgKiBzeW5jaHJvbml6YXRpb24gdG8gdGhlIGdpdmVuIEJyb2FkY2FzdCBzb3VyY2UgZGV2aWNlLCB1cG9uIGFjcXVpc2lvbiBvZiBTeW5jaHJvbml6YXRpb24gaW5mb3JtYXRpb24sCi0gICAgICogSXQgd2lsbCBiZSBub3RpZmllZCB3aXRoIGF2YWlhYmxlIEJyb2FkY2FzdCBzb3VyY2UgY2hhbm5lbHMgdGhhdCBjYW4gYmUgc3luY2hyb25pemVkIGluIHRoZSByZW1vdGUKLSAgICAgKiBkZXZpY2UuCi0gICAgICogQXBwbGljYXRpb24gc2hvdWxkIHNlbGVjdCBzZXQgb2YgQnJvYWRjYXN0IGNoYW5uZWxzIHRoYXQgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQgYW5kIGZvbGxvdyB1cAotICAgICAqIHdpdGggYSBjYWxsIHRvIHtAbGluayAjYWRkQnJvYWRjYXN0U291cmNlfSBvcGVyYXRpb24KLSAgICAgKgotICAgICAqIFJlc3VsdCBvZiBzZWxjdGlvbiBvZiBCcm9hZGNhc3Qgc291cmNlICB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoCi0gICAgICoge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrI09uQnJvYWRjYXN0QXVkaW9Tb3VyY2VTZWxlY3RlZH0KLSAgICAgKgotICAgICAqIElmIHRoaXMgb3BlcmF0aW9uIG5lZWQgdG8gYmUgcGVyZm9ybWVkIG92ZXIgYWxsIHRoZSBtZW1iZXJzIG9mIGNvb3JkaW5hdGVkIHNldCBtZW1iZXJzLCBpc0dyb3VwT3AKLSAgICAgKiB3aWxsIGJlIHNldCB0byB0cnVlLiBTZWxlY3QgYnJvYWRjYXN0IHNvdXJjZSBvcGVyYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgb24gYmVoYWxmIG9mCi0gICAgICogYWxsIHRoZSBDb29yZGluYXRlZCBzZXQgZGV2aWNlcwotICAgICAqCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIFNjYW5SZXN1bHQge0BsaW5rICNTY2FuUmVzdWx0fSBvZiB0aGUgQnJvYWRjYXN0aW5nIHNvdXJjZSwKLSAgICAgKiAgdGhpcyBpcyB0aGUgcmVzdWx0IG9idGFpbmVkIGZyb20gdGhlIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayNvbkJsZUJyb2FkY2FzdFNvdXJjZUZvdW5kfQotICAgICAqICBAcGFyYW0gaXNHcm91cE9wIHNldCB0byB0cnVlIElmIEFwcGxpY2F0aW9uIHdhbnRzIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHRoZSB3aG9sZQotICAgICAqICBjb29yZGluYXRlZCBzZXQgbWVtYmVycwotICAgICAqCi0gICAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgSXQgaXMgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCBzZWxlY3QgQnJvYWRjYXN0IHNvdXJjZSBvcGVyYXRpb24KLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0QnJvYWRjYXN0U291cmNlKFNjYW5SZXN1bHQgc2NhblJlcywgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgaWYgKHNjYW5SZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VsZWN0QnJvYWRjYXN0U291cmNlOiBJbnZhbGlkIHNjYW4gcmVzIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nKFRBRywgInNlbGVjdEJyb2FkY2FzdFNvdXJjZTogIiArIHNjYW5SZXMpOwotICAgICAgICBpZiAobUJsdWV0b290aFN5bmNIZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhTeW5jSGVscGVyLnNlbGVjdEJyb2FkY2FzdFNvdXJjZShtQmx1ZXRvb3RoRGV2aWNlLCBzY2FuUmVzLCBpc0dyb3VwT3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VsZWN0QnJvYWRjYXN0U291cmNlOiBtQmx1ZXRvb3RoU3luY0hlbHBlciBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRCcm9hZGNhc3RTb3VyY2VJbmZvKEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbykgewotICAgICAgICBib29sZWFuIHJldCA9IHRydWU7Ci0gICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gY3VycmVudFNvdXJjZUluZm9zID0KLSAgICAgICAgICAgIG1CbHVldG9vdGhTeW5jSGVscGVyLmdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKG1CbHVldG9vdGhEZXZpY2UpOwotICAgICAgICBpZiAoY3VycmVudFNvdXJjZUluZm9zID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm5vIHNvdXJjZSBpbmZvIGRldGFpbHMgZm9yIHJlbW90ZSIpOwotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y3VycmVudFNvdXJjZUluZm9zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY0luZm8ubWF0Y2hlcyhjdXJyZW50U291cmNlSW5mb3MuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKFRBRywgImlzVmFsaWRCcm9hZGNhc3RTb3VyY2VJbmZvIHJldHVybnM6ICIgKyByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU291cmNlSWQgKGJ5dGUgc291cmNlSWQpIHsKLSAgICAgICAgYm9vbGVhbiByZXRWYWwgPSBmYWxzZTsKLSAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBjdXJyZW50U291cmNlSW5mb3MgPQotICAgICAgICBtQmx1ZXRvb3RoU3luY0hlbHBlci5nZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbihtQmx1ZXRvb3RoRGV2aWNlKTsKLSAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VJbmZvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXRWYWwgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjdXJyZW50U291cmNlSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNvdXJjZUluZm9zLmdldChpKS5nZXRTb3VyY2VJZCgpID09IHNvdXJjZUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2coVEFHLCAiaXNWYWxpZFNvdXJjZUlkIHJldHVybnM6ICIgKyByZXRWYWwpOwotICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFNlbGVjdGVkSW5kaWNpZXMoTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBzZWxlY3RlZEJJU0luZGljaWVzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEJJU0luZGljaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZyhUQUcsICJwcmludFNlbGVjdGVkSW5kaWNpZXMgOiBubyBzZWxlY3RlZCBpbmRpY2llcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzZWxlY3RlZEJJU0luZGljaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBsb2coVEFHLCBzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXREZXNjcmlwdGlvbigpICsgIjogIiArIHNlbGVjdGVkQklTSW5kaWNpZXMuZ2V0KGkpLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgYnJvYWRjYXN0IHNvdXJjZSBpbmZvcm1hdGlvbiB0byB0aGUgU2NhbiBkZWxlZ2F0b3IuIFRoaXMgaW50ZXJuYWxseSBwZXJmb3JtcyBQZXJpb2RpYwotICAgICAqIHN5bmNocm9uaXphdGlvbiB0byB0aGUgZ2l2ZW4gQnJvYWRjYXN0IHNvdXJjZSBkZXZpY2UsIHVwb24gYWNxdWlzaW9uIG9mIFN5bmNocm9uaXphdGlvbiBpbmZvcm1hdGlvbiwKLSAgICAgKiBJdCB3aWxsIGJlIHdyaXR0ZW4gb24gdG8gdGhlICJTY2FuIGRlbGVnYXRvcnMiIENoYXJhY3RlcmlzdGljcwotICAgICAqCi0gICAgICogUmVzdWx0IG9mIGFkZGl0aW9uIG9mIEJyb2FkY2FzdCBzb3VyY2UgdG8gdGhlIHNjYW4gZGVsZWdhdG9yIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2gKLSAgICAgKiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sjb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZUFkZGVkfQotICAgICAqCi0gICAgICogU3VjY2Vzc2Z1bCBhZGRpdGlvbiBCcm9hZGNhc3Qgc291cmNlIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggQnJvYWRjYXN0IHJlY2l2ZXIgc3RhdGUgaW5mb3JtYXRpb24KLSAgICAgKiB1cGRhdGUgaW50ZW50IHRocm91Z2gge0BsaW5rICNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfSBpbnRlbnQKLSAgICAgKgotICAgICAqCi0gICAgICogSWYgdGhpcyBvcGVyYXRpb24gbmVlZCB0byBiZSBwZXJmb3JtZWQgb3ZlciBhbGwgdGhlIG1lbWJlcnMgb2YgY29vcmRpbmF0ZWQgc2V0IG1lbWJlcnMsIGlzR3JvdXBPcAotICAgICAqIHdpbGwgYmUgc2V0IHRvIHRydWUuIGFkZCBicm9hZGNhc3Qgc291cmNlIG9wZXJhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbiBiZWhhbGYgb2YKLSAgICAgKiBhbGwgdGhlIENvb3JkaW5hdGVkIHNldCBkZXZpY2VzCi0gICAgICoKLSAgICAgKiBTYW1lIEJyb2FkY2FzdCBzb3VyY2UgSW5mb3JtYXRpb24gd2lsbCBiZSB3cml0dGVuIG9uIHRvIGFsbCB0aGUgbWVtYmVycyBvZiBDb29yZGluYXRlZCBzZXQgYW5kCi0gICAgICogUEFTVCB3aWxsIGJlIHBlcmZvcm1lZCBiYXNlZCBvbiB0aGUgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEluIGNhc2Ugb2YgR3JvdXAgT3BlcmF0aW9uLCBJZiB0aGVyZSBpcyBhbnkgbWF0Y2hpbmcgZW50cnkgYWxyZWFkeSBwcmVzZW50IGluIGFueSBvZiBjb29yZGluYXRlZCBzZXQgbWVtYmVycywKLSAgICAgKiBBZGQgQnJvYWRjYXN0IHNvdXJjZSBvcGVhdGlvbiB3aWxsIGJlIGZhaWxlZCBhbmQgcmVzdWx0IHdpbGwgbm90aWZpZWQgdGhyb3VnaAotICAgICAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayNvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWR9Ci0gICAgICoKLSAgICAgKiAgQHBhcmFtIGF1ZGlvU291cmNlIHtAbGluayAjQmx1ZXRvb3RoRGV2aWNlfSBvYmplY3Qgc2VsZWN0ZWQgYXMgU291cmNlIHdoaWNoIG5lZWQgdG8gYmUgc3luY2hyb25pemVkIHdpdGgKLSAgICAgKiAgQHBhcmFtIFNjYW5SZXN1bHQge0BsaW5rICNTY2FuUmVzdWx0fSByZXN1bHQgb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrI29uQmxlQnJvYWRjYXN0U291cmNlRm91bmR9Ci0gICAgICogIEBwYXJhbSBzeW5jU3RhdGUgIGNhbiBiZSBvbmUgb2Yge0BsaW5rICNTWU5DX01FVEFEQVRBfSwKLSAgICAgKiAge0BsaW5rICNTWU5DX01FVEFEQVRBX0FVRElPfQotICAgICAqICBAcGFyYW0gc2VsZWN0ZWRCcm9hZGNhc3RDaGFubmVscyBpcyBhIExpc3Qgb2YgQnJvYWRjYXN0IGNoYW5uZWxzIHRoYXQgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgZ2l2ZW4gYnJvYWRjYXN0IGF1ZGlvIHNvdXJjZQotICAgICAqICBmcm9tIEF2YWlhbGJsZSBCcm9hZGNhc3QgaW5kaWNpZXMuCi0gICAgICogIEF2YWlhYmxlIGJyb2FkY2FzdCBpbmRpY2llcyBhcmUgbm90aWZpZWQgYXBwbGljYXRpb24gdXNpbmcge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrI29uQmxlQnJvYWRjYXN0U291cmNlU2VsZWN0ZWR9Ci0gICAgICogIEJyb2FkY2FzdFNvdXJjZUNoYW5uZWwubVN0YXR1cyBzZXQgdG8gYmUgVFJVRSBvciBGQUxTRSBiYXNlZCBvbiB0aGUgbmVlZCBvZiBzeW5jaHJvbml6YXRpb24uCi0gICAgICoKLSAgICAgKgotICAgICAqICBudWxsIHZhbHVlIG9mIHNlbGVjdGVkQnJvYWRjYXN0Q2hhbm5lbHMgcmVzdWx0aW5nIGluIHN5bmNpbmcgdG8gYWxsIGF2YWlhbGJsZSBCcm9hZGNhc3QgY2hhbm5lbHMuCi0gICAgICogIGNoZWNrIHtAbGluayBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsfSBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICAgICAqICBAcGFyYW0gaXNHcm91cE9wIHNldCB0byB0cnVlIElmIEFwcGxpY2F0aW9uIHdhbnRzIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHRoZSB3aG9sZQotICAgICAqICBjb29yZGluYXRlZCBzZXQgbWVtYmVycywgRmFsc2Ugb3RoZXJ3aXNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBJdCBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkIGFkZCBCcm9hZGNhc3Qgc291cmNlIG9wZXJhdGlvbgotICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAgcHVibGljIGJvb2xlYW4gYWRkQnJvYWRjYXN0U291cmNlIChCbHVldG9vdGhEZXZpY2UgYXVkaW9Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBAQnJvYWRjYXN0QXNzaXN0U3luY1N0YXRlIGludCBzeW5jU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IHNlbGVjdGVkQnJvYWRjYXN0Q2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXBPcCkgewotICAgICAgICBpZiAobUJsdWV0b290aFN5bmNIZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKFRBRywgImFkZEJyb2FkY2FzdFNvdXJjZTogbm8gQmx1ZXRvb3RoU3luY0hlbHBlciBoYW5kbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgICBpZiAoc3luY1N0YXRlICE9IFNZTkNfTUVUQURBVEEgJiYKLSAgICAgICAgICAgICAgc3luY1N0YXRlICE9IFNZTkNfTUVUQURBVEFfQVVESU8pIHsKLSAgICAgICAgICAgICAgbG9nKFRBRywgImFkZEJyb2FkY2FzdFNvdXJjZTogSW52YWxpZCBzeW5jU3RhdGUiICsgc3luY1N0YXRlKTsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludFNlbGVjdGVkSW5kaWNpZXMoc2VsZWN0ZWRCcm9hZGNhc3RDaGFubmVscyk7Ci0gICAgICAgICBpbnQgbWV0YWRhdGFTeW5jU3RhdGUgPSAtMTsKLSAgICAgICAgIGludCBhdWRpb1N5bmNTdGF0ZSA9IC0xOwotICAgICAgICAgbVN5bmNTdGF0ZSA9IHN5bmNTdGF0ZTsKLSAgICAgICAgIG1ldGFkYXRhU3luY1N0YXRlID0gY29udmVydE1ldGFkYXRhU3luY1N0YXRlIChtU3luY1N0YXRlKTsKLSAgICAgICAgIGF1ZGlvU3luY1N0YXRlID0gY29udmVydEF1ZGlvRGF0YVN5bmNTdGF0ZShtU3luY1N0YXRlKTsKLSAgICAgICAgIGlmIChtQnJvYWRjYXN0QXVkaW9Tb3VyY2VJbmZvID09ICBudWxsKSB7Ci0gICAgICAgICAgICAgLy9hbGwgb2YgdGhlc2Ugd2lsbCBiZSBvdmVycmlkZW4gYXQgc2VydmljZSBsYXllciBsYXRlcgotICAgICAgICAgICAgbUJyb2FkY2FzdEF1ZGlvU291cmNlSW5mbyA9IG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkweEJCLCAvKmFkdlNpZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX1BVQkxJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhU3luY1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TeW5jU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEJyb2FkY2FzdENoYW5uZWxzKTsKLSAgICAgICAgICAgICBpZiAobUJyb2FkY2FzdEF1ZGlvU291cmNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImFkZEJyb2FkY2FzdFNvdXJjZTogbUJyb2FkY2FzdEF1ZGlvU291cmNlSW5mbyBpbnN0YW50aWF0ZWQgZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgaWYoaXNWYWxpZEJyb2FkY2FzdFNvdXJjZUluZm8obUJyb2FkY2FzdEF1ZGlvU291cmNlSW5mbykpIHsKLSAgICAgICAgICAgICBtQmx1ZXRvb3RoU3luY0hlbHBlci5hZGRCcm9hZGNhc3RTb3VyY2UobUJsdWV0b290aERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0QXVkaW9Tb3VyY2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR3JvdXBPcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGxvZyhUQUcsICJTaW1pbGFyIHNvdXJjZSBpbmZvcm1hdGlvbiBhbHJlYWR5IGV4aXN0cyIpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgYnJvYWRjYXN0IHNvdXJjZSBpbmZvcm1hdGlvbiBpbiB0aGUgU2NhbiBkZWxlZ2F0b3IuCi0gICAgICogSXQgd2lsbCBiZSB3cml0dGVuIG9uIHRvIHRoZSBTY2FuIGRlbGVnYXRvcidzIENoYXJhY3RlcmlzdGljcwotICAgICAqCi0gICAgICogUmVzdWx0IG9mIHVwZGF0aW5nIG9mIEJyb2FkY2FzdCBzb3VyY2UgdG8gdGhlIHNjYW4gZGVsZWdhdG9yIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2gKLSAgICAgKiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sjb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZVVwZGF0ZWR9Ci0gICAgICoKLSAgICAgKiAgSG93ZXZlciBTdWNjZXNzZnVsIHVwZGF0aW5nIG9mIEJyb2FkY2FzdCBzb3VyY2UgaW5mb3JtYXRpb24gd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCBCcm9hZGNhc3QgcmVjaXZlciBzdGF0ZSBpbmZvcm1hdGlvbgotICAgICAqICB1cGRhdGUgaW50ZW50IHRocm91Z2gge0BsaW5rICNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfSBpbnRlbnQKLSAgICAgKgotICAgICAqIElmIHRoaXMgb3BlcmF0aW9uIG5lZWQgdG8gYmUgcGVyZm9ybWVkIG92ZXIgYWxsIHRoZSBtZW1iZXJzIG9mIGNvb3JkaW5hdGVkIHNldCBtZW1iZXJzLCBpc0dyb3VwT3AKLSAgICAgKiB3aWxsIGJlIHNldCB0byB0cnVlLiBVcGRhdGUgYnJvYWRjYXN0IHNvdXJjZSBvcGVyYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgb24gYmVoYWxmIG9mCi0gICAgICogYWxsIHRoZSBDb29yZGluYXRlZCBzZXQgZGV2aWNlcwotICAgICAqCi0gICAgICogU2FtZSBCcm9hZGNhc3Qgc291cmNlIEluZm9ybWF0aW9uIGNoYW5nZSB3aWxsIGJlIHdyaXR0ZW4gb24gdG8gYWxsIHRoZSBtZW1iZXJzIG9mIENvb3JkaW5hdGVkIHNldCBhbmQKLSAgICAgKiBQQVNUIHdpbGwgYmUgcGVyZm9ybWVkIGJhc2VkIG9uIHRoZSByZXF1ZXN0IGZyb20gcmVtb3RlLgotICAgICAqCi0gICAgICogSW4gY2FzZSBvZiBHcm91cCBPcGVyYXRpb24sIElmIHRoZXJlIGFyZSBubyBtYXRjaGluZyBzb3VyY2UgSW5mb3JtYXRpb24gcHJlc2VudCBpbiBhbnkgb2YgY29vcmRpbmF0ZWQgc2V0IG1lbWJlcnMsCi0gICAgICogVXBkYXRlIEJyb2FkY2FzdCBzb3VyY2Ugb3BlYXRpb24gd2lsbCBiZSBmYWlsZWQgYW5kIHJlc3VsdCB3aWxsIG5vdGlmaWVkIHRocm91Z2gKLSAgICAgKiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sjb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZVVwZGF0ZWR9Ci0gICAgICoKLSAgICAgKiAgQHBhcmFtIHNvdXJjZUlkIHNvdXJjZUlkIG9mIHRoZSBCcm9hZGNhc3QgU291cmNlIGluZm9ybWF0aW9uIHdoaWNoIG5lZWQgdG8gYmUgdXBkYXRlZAotICAgICAqICBAcGFyYW0gc3luY1N0YXRlICBjYW4gYmUgb25lIG9mIHtAbGluayAjU1lOQ19NRVRBREFUQX0sCi0gICAgICogIHtAbGluayAjU1lOQ19BVURJT30sIHtAbGluayAjU1lOQ19NRVRBREFUQV9BVURJT30KLSAgICAgKgotICAgICAqICBAcGFyYW0gc2VsZWN0ZWRCcm9hZGNhc3RDaGFubmVscyBpcyBhIExpc3Qgb2YgQnJvYWRjYXN0IGNoYW5uZWxzIHRoYXQgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgZ2l2ZW4gYnJvYWRjYXN0IGF1ZGlvIHNvdXJjZQotICAgICAqICBmcm9tIEF2YWlhbGJsZSBCcm9hZGNhc3QgaW5kaWNpZXMuCi0gICAgICogIEF2YWlhYmxlIGJyb2FkY2FzdCBpbmRpY2llcyBhcmUgbm90aWZpZWQgYXBwbGljYXRpb24gdXNpbmcge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrI29uQmxlQnJvYWRjYXN0U291cmNlU2VsZWN0ZWR9Ci0gICAgICogIEJyb2FkY2FzdFNvdXJjZUNoYW5uZWwubVN0YXR1cyBzZXQgdG8gYmUgVFJVRSBvciBGQUxTRSBiYXNlZCBvbiB0aGUgbmVlZCBvZiBzeW5jaHJvbml6YXRpb24uCi0gICAgICoKLSAgICAgKiAgbnVsbCB2YWx1ZSBvZiBzZWxlY3RlZEJyb2FkY2FzdENoYW5uZWxzIHJlc3VsdGluZyBpbiBzeW5jaW5nIHRvIGFsbCBhdmFpYWxibGUgQnJvYWRjYXN0IGNoYW5uZWxzLgotICAgICAqICBjaGVjayB7QGxpbmsgQmxldXJjZUNoYW5uZWx9IGZvciBtb3JlIGluZm9ybWF0aW9uCi0gICAgICogIEBwYXJhbSBpc0dyb3VwT3Agc2V0IHRvIHRydWUgSWYgQXBwbGljYXRpb24gd2FudHMgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdGhlIHdob2xlCi0gICAgICogIGNvb3JkaW5hdGVkIHNldCBtZW1iZXJzLCBGYWxzZSBvdGhlcndpc2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIEl0IGlzIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQgdXBkYXRlIEJyb2FkY2FzdCBzb3VyY2UgaW5mb3JtYXRpb24KLSAgICAgKiAgb3BlcmF0aW9uCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCcm9hZGNhc3RTb3VyY2UgKGJ5dGUgc291cmNlSWQsIGludCBzeW5jU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gc2VsZWN0ZWRCcm9hZGNhc3RDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgICAgaWYgKG1CbHVldG9vdGhTeW5jSGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgIGxvZyhUQUcsICJ1cGRhdGVCcm9hZGNhc3RTb3VyY2U6IG5vIEJsdWV0b290aFN5bmNIZWxwZXIgaGFuZGxlIik7Ci0gICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGlzVmFsaWRTb3VyY2VJZChzb3VyY2VJZCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgbG9nKFRBRywgInVwZGF0ZUJyb2FkY2FzdFNvdXJjZTogSW52YWxpZCBzb3VyY2UgSWQiKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGludCBhdWRpb1N5bmNTdGF0ZSA9IC0xOwotICAgICAgICAgICBpbnQgbWV0YWRhdGFTeW5jU3RhdGUgPSAtMTsKLSAgICAgICAgICAgbG9nKFRBRywgInVwZGF0ZUJyb2FkY2FzdFNvdXJjZTogc291cmNlSWQiICsgc291cmNlSWQgKyAiLCBzeW5jU3RhdGU6IiArIHN5bmNTdGF0ZSk7Ci0KLSAgICAgICAgICAgbVN5bmNTdGF0ZSA9IHN5bmNTdGF0ZTsKLSAgICAgICAgICAgbWV0YWRhdGFTeW5jU3RhdGUgPSBjb252ZXJ0TWV0YWRhdGFTeW5jU3RhdGUgKG1TeW5jU3RhdGUpOwotICAgICAgICAgICBhdWRpb1N5bmNTdGF0ZSA9IGNvbnZlcnRBdWRpb0RhdGFTeW5jU3RhdGUobVN5bmNTdGF0ZSk7Ci0KLSAgICAgICAgICAgcHJpbnRTZWxlY3RlZEluZGljaWVzKHNlbGVjdGVkQnJvYWRjYXN0Q2hhbm5lbHMpOwotCi0gICAgICAgICAgIGxvZyhUQUcsICJ1cGRhdGVCcm9hZGNhc3RTb3VyY2U6IGF1ZGlvU3luY1N0YXRlOiIgKyBhdWRpb1N5bmNTdGF0ZSk7Ci0gICAgICAgICAgIGxvZyhUQUcsICJ1cGRhdGVCcm9hZGNhc3RTb3VyY2U6IG1ldGFkYXRhU3luY1N0YXRlOiIgKyBtZXRhZGF0YVN5bmNTdGF0ZSk7Ci0KLSAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzb3VyY2VJbmZvID0gbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8oc291cmNlSWQpOwotICAgICAgICAgICBpZiAoc291cmNlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHNvdXJjZUluZm8uc2V0TWV0YWRhdGFTeW5jU3RhdGUobWV0YWRhdGFTeW5jU3RhdGUpOwotICAgICAgICAgICAgICBzb3VyY2VJbmZvLnNldEF1ZGlvU3luY1N0YXRlKGF1ZGlvU3luY1N0YXRlKTsKLSAgICAgICAgICAgICAgc291cmNlSW5mby5zZXRTb3VyY2VJZChzb3VyY2VJZCk7Ci0gICAgICAgICAgICAgIHNvdXJjZUluZm8uc2V0QnJvYWRjYXN0Q2hhbm5lbHNTeW5jU3RhdHVzKHNlbGVjdGVkQnJvYWRjYXN0Q2hhbm5lbHMpOwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBMb2cuZShUQUcsICJ1cGRhdGVCcm9hZGNhc3RTb3VyY2U6IHNvdXJjZUluZm8gbm90IGNyZWF0ZWQiKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoU3luY0hlbHBlci51cGRhdGVCcm9hZGNhc3RTb3VyY2UobUJsdWV0b290aERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcm91cE9wKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICAqIFNldHMgdGhlIEJyb2FkY2FzdCBwaW4gY29kZSB0byB0aGUgU2NhbiBkZWxlZ2F0b3Igc28gdGhhdCBJdCBjYW4gZGVjcnlwdAotICAgICAgKiB0aGUgc3luY2hyb25pemVkIGF1ZGlvIGF0IHRoZSByZWNpdmVyIHNpZGUKLSAgICAgICoKLSAgICAgICogSXQgd2lsbCBiZSB3cml0dGVuIG9uIHRvIHRoZSBTY2FuIGRlbGVnYXRvcidzIENoYXJhY3RlcmlzdGljcy4KLSAgICAgICogUmVzdWx0IG9mIFNldHRpbmcgIG9mIEJyb2FkY2FzdCBQSU4gY29kZSB0byB0aGUgc2NhbiBkZWxlZ2F0b3Igd2lsbCBiZSBkZWxpdmVyZWQgdGhyb3VnaAotICAgICAgKiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sjb25Ccm9hZGNhc3RQaW5VcGRhdGVkfQotICAgICAgKgotICAgICAgKiBJZiB0aGlzIG9wZXJhdGlvbiBuZWVkIHRvIGJlIHBlcmZvcm1lZCBvdmVyIGFsbCB0aGUgbWVtYmVycyBvZiBjb29yZGluYXRlZCBzZXQgbWVtYmVycywgaXNHcm91cE9wCi0gICAgICAqIHdpbGwgYmUgc2V0IHRvIHRydWUuIHNldCBCcm9hZGNhc3QgUElOIG9wZXJhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbiBhbGwgdGhlIENvb3JkaW5hdGVkIHNldCBkZXZpY2VzCi0gICAgICAqCi0gICAgICAqIFNhbWUgQnJvYWRjYXN0IFBJTiBjb2RlIHdpbGwgYmUgd3JpdHRlbiBvbiB0byBhbGwgdGhlIG1lbWJlcnMgb2YgQ29vcmRpbmF0ZWQgc2V0IGFuZAotICAgICAgKiBvbiB0aGUgcmVxdWVzdCBmcm9tIHJlbW90ZS4KLSAgICAgICoKLSAgICAgICogSW4gY2FzZSBvZiBHcm91cCBPcGVyYXRpb24sIElmIHRoZXJlIGFyZSBubyBtYXRjaGluZyBzb3VyY2UgSW5mb3JtYXRpb24oQkQgYWRkcmVzcywgYWR2IGluc3RhbmNlKQotICAgICAgKiBwcmVzZW50IGluIGFueSBvZiBjb29yZGluYXRlZCBzZXQgbWVtYmVycywKLSAgICAgICogU2V0IEJyb2FkY2FzdCBQSU4gb3BlYXRpb24gd2lsbCBiZSBmYWlsZWQgYW5kIHJlc3VsdCB3aWxsIG5vdGlmaWVkIHRocm91Z2gKLSAgICAgICoge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrI29uQnJvYWRjYXN0UGluVXBkYXRlZH0KLSAgICAgICoKLSAgICAgICoKLSAgICAgICogSG93ZXZlciwgU3VjY2Vzc2Z1bCB1cGRhdGluZyBvZiBCcm9hZGNhc3QgUElOIGNvZGUgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCBCcm9hZGNhc3QgcmVjaXZlciBzdGF0ZSBpbmZvcm1hdGlvbgotICAgICAgKiB1cGRhdGUgaW50ZW50IHRocm91Z2gge0BsaW5rICNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfSBpbnRlbnQuCi0gICAgICAqCi0gICAgICAqICBAcGFyYW0gc291cmNlSWQgc291cmNlSWQgb2YgdGhlIEJyb2FkY2FzdCBTb3VyY2UgaW5mb3JtYXRpb24gd2hpY2ggbmVlZCB0byBiZSB1cGRhdGVkCi0gICAgICAqICBAcGFyYW0gYnJvYWRjYXN0Q29kZSBpcyB0aGUgU3RyaW5nIG9mIG1heGltdW0gMTYgY2hhcmFjdGVycyBpbiBsZW5ndGgKLSAgICAgICogIEBwYXJhbSBpc0dyb3VwT3Agc2V0IHRvIHRydWUgSWYgQXBwbGljYXRpb24gd2FudHMgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdGhlIHdob2xlCi0gICAgICAqICBjb29yZGluYXRlZCBzZXQgbWVtYmVycywgRmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAqCi0gICAgICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIEl0IGlzIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQgc2V0IEJyb2FkY2FzdCBjb2RlIG9wZXJhdGlvbgotICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgICAgKiBAaGlkZQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRCcm9hZGNhc3RDb2RlIChieXRlIHNvdXJjZUlkLCBTdHJpbmcgYnJvYWRjYXN0Q29kZSwgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgICAgaWYgKG1CbHVldG9vdGhTeW5jSGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgIGxvZyhUQUcsICJzZXRCcm9hZGNhc3RDb2RlOiBubyBCbHVldG9vdGhTeW5jSGVscGVyIGhhbmRsZSIpOwotICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChpc1ZhbGlkU291cmNlSWQoc291cmNlSWQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgIGxvZyhUQUcsICJzZXRCcm9hZGNhc3RDb2RlOiBJbnZhbGlkIHNvdXJjZSBJZCIpOwotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBsb2coVEFHLCAic2V0QnJvYWRjYXN0Q29kZTogIiArICJzb3VyY2VJZDoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VJZCArICJCcm9hZGNhc3RDb2RlOiIgKyBicm9hZGNhc3RDb2RlKTsKLSAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzb3VyY2VJbmZvID0gbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8oc291cmNlSWQpOwotICAgICAgICAgICBpZiAoc291cmNlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlSW5mby5zZXRTb3VyY2VJZChzb3VyY2VJZCk7Ci0gICAgICAgICAgICAgICAgc291cmNlSW5mby5zZXRCcm9hZGNhc3RDb2RlKGJyb2FkY2FzdENvZGUpOwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0QnJvYWRjYXN0Q29kZTogc291cmNlSW5mbyBub3QgY3JlYXRlZCIpOwotICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoU3luY0hlbHBlci5zZXRCcm9hZGNhc3RDb2RlKG1CbHVldG9vdGhEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcm91cE9wKTsKLSAgICB9Ci0gICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIEJyb2FkY2FzdCBTb3VyY2UgSW5mb3JtYXRpb24gZnJvbSB0aGUgU2NhbiBkZWxlZ2F0b3IKLSAgICAgKiBJdCB3aWxsIGJlIHdyaXR0ZW4gb24gdG8gdGhlICJTY2FuIGRlbGVnYXRvcnMiIENoYXJhY3RlcmlzdGljcwotICAgICAqCi0gICAgICogUmVzdWx0IG9mIHJlbW92YWwgb2YgQnJvYWRjYXN0IHNvdXJjZSB0byB0aGUgc2NhbiBkZWxlZ2F0b3Igd2lsbCBiZSBkZWxpdmVyZWQgdGhyb3VnaAotICAgICAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayNPbkJyb2FkY2FzdEF1ZGlvU291clJlbW92ZWR9Ci0gICAgICoKLSAgICAgKiBJZiB0aGlzIG9wZXJhdGlvbiBuZWVkIHRvIGJlIHBlcmZvcm1lZCBvdmVyIGFsbCB0aGUgbWVtYmVycyBvZiBjb29yZGluYXRlZCBzZXQgbWVtYmVycywgaXNHcm91cE9wCi0gICAgICogd2lsbCBiZSBzZXQgdG8gdHJ1ZS4gcmVtb3ZlIGJyb2FkY2FzdCBvcGVyYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgb24gYWxsIHRoZSBDb29yZGluYXRlZCBzZXQgZGV2aWNlcwotICAgICAqCi0gICAgICogUmVtb3ZlIEJyb2FkY2FzdCB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0byBhbGwgdGhlIG1lbWJlcnMgb2YgQ29vcmRpbmF0ZWQgc2V0Ci0gICAgICoKLSAgICAgKiBJbiBjYXNlIG9mIEdyb3VwIE9wZXJhdGlvbiwgSWYgdGhlcmUgYXJlIG5vIG1hdGNoaW5nIHNvdXJjZSBJbmZvcm1hdGlvbihCRCBhZGRyZXNzLCBhZHYgaW5zdGFuY2UpCi0gICAgICogcHJlc2VudCBpbiBhbnkgb2YgY29vcmRpbmF0ZWQgc2V0IG1lbWJlcnMuCi0gICAgICoKLSAgICAgKiBTZXQgQnJvYWRjYXN0IFBJTiBvcGVhdGlvbiB3aWxsIGJlIGZhaWxlZCBhbmQgcmVzdWx0IHdpbGwgbm90aWZpZWQgdGhyb3VnaAotICAgICAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayNvbkJyb2FkY2FzdFBpblVwZGF0ZWR9Ci0gICAgICogU3VjY2Vzc2Z1bCByZW1vdmFsIG9mIEJyb2Nhc3Qgc291cmNlIGluZm9ybWF0aW9uIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2gKLSAgICAgKiBCcm9hZGNhc3QgcmVjZWl2ZXIgc3RhdGUgSW5mb3JtYXRpb24gdGhyb3VnaAotICAgICAqIHtAbGluayAjQUNUSU9OX0JST0FEQ0FTVF9SRUNFSVZFUl9TVEFURX0gaW50ZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlSWQgc291cmNlSWQgb2YgdGhlIEJyb2FkY2FzdCBTb3VyY2UgaW5mb3JtYXRpb24gd2hpY2ggbmVlZCB0byBiZSB1cGRhdGVkCi0gICAgICogIEBwYXJhbSBpc0dyb3VwT3Agc2V0IHRvIHRydWUgSWYgQXBwbGljYXRpb24gd2FudHMgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdGhlIHdob2xlCi0gICAgICogIGNvb3JkaW5hdGVkIHNldCBtZW1iZXJzLCBGYWxzZSBvdGhlcndpc2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIEl0IGlzIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQgcmVtb3ZlIGJyb2FkY2FzdCBzb3VyY2Ugb3BlcmF0aW9uCi0gICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVCcm9hZGNhc3RTb3VyY2UgKGJ5dGUgc291cmNlSWQsIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgICAgIGlmIChtQmx1ZXRvb3RoU3luY0hlbHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICBsb2coVEFHLCAicmVtb3ZlQnJvYWRjYXN0U291cmNlOiBubyBCbHVldG9vdGhTeW5jSGVscGVyIGhhbmRsZSIpOwotICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChpc1ZhbGlkU291cmNlSWQoc291cmNlSWQpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgIGxvZyhUQUcsICJyZW1vdmVCcm9hZGNhc3RTb3VyY2U6IEludmFsaWQgc291cmNlIElkIik7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBsb2coVEFHLCAicmVtb3ZlQnJvYWRjYXN0U291cmNlOiBzb3VyY2VJZCIgKyBzb3VyY2VJZCk7Ci0KLSAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhTeW5jSGVscGVyLnJlbW92ZUJyb2FkY2FzdFNvdXJjZShtQmx1ZXRvb3RoRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcm91cE9wKTsKLSAgICB9Ci0gICAgIC8qKgotICAgICAqIEdldCBhbGwgdGhlIEJyb2FkY2FzdCBTb3VyY2UgSW5mb3JtYXRpb24gc3RvcmVkIGluIHJlbW90ZSBTY2FuIGRlbGVnYXRvcnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgTGlzdCBvZiBCcm9hZGNhc3QgU291cmNlIEluZm9ybWF0aW9uIHtAbGluayAjQmxlQnJvYWRjYXN0U291cmNlSW5mb30gc3RvcmVkIGluCi0gICAgICogcmVtb3RlIGFuZCBpdHMgY29ycmVzcG9uZGluZyBzdGF0ZSBvciBudWxsIGluIGNhc2UgaWYgdGhlcmUgYXJlIG5vdGhpbmcKLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24gKCkgewotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhTeW5jSGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coVEFHLCAiR2V0TnVtYmVyT2ZBY2NlcHRhYmxlQnJvYWRjYXN0U291cmNlczogbm8gQmx1ZXRvb3RoU3luY0hlbHBlciBoYW5kbGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoU3luY0hlbHBlci5nZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbihtQmx1ZXRvb3RoRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgVEFHLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQkFTU19EZWJ1ZyhUQUcsIG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsLmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmM2Q2MS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEdhdHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKLQotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgSW50ZXJmYWNlIHRvIHNlbGVjdCB0aGUgQnJvYWRjYXN0IHNvdXJjZSBjaGFubmVscwotICogdG8gYmUgc3luY2hyb25pemVkIGZyb20gdGhlIEJyb2FkY2FzdCBzb3VyY2UuIHRoZXNlIEJyb2FkY2FzdCBzb3VyY2UgY2hhbm5lbHMKLSAqIGFyZSBtYXBwZWQgdG8gdGhlIEJJUyBpbmRpY2llcyB0aGF0IGdpdmVuIEJyb2FkY2FzdCBzb3VyY2UgaXMgYnJvYWRjYXN0aW5nIHdpdGguCi0gKgotICogPHA+VGhpcyBhbHNvIGFjdHMgYXMgZ2VuZXJhbCBkYXRhIHN0cnVjdHVyZSBmb3IgdXBkYXRpbmcgdGhlIEJyb2FkY2FzdAotICogc291cmNlIGNoYW5uZWwgaW5mb3JtYXRpb24KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5wdXQgdGhlIFVzZXIgcHJvdmlkZWQgZGF0YSBmb3IgYmVsb3cgb3BlcmF0aW9ucwotICoge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIjYWRkQnJvYWRjYXN0U291cmNlfSwKLSAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI3VwZGF0ZUJyb2FkY2FzdFNvdXJjZX0gYW5kCi0gKgotICogbUluZGV4IDogaW5kZXggaXMgdGhlIElkZW50aWZpZXIgZm9yIEJyb2FkY2FzdCBjaGFubmVsCi0gKiBtRGVzY3JpcHRpb246IERlc2NyaXB0aW9uIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgQnJvYWRjYXN0IGRhdGEgYmVpbmcgYnJvYWRjYXN0ZWQKLSAqIG1TdGF0dXM6IFRSVUUgbWVhbnMgYnJvYWRjYXN0IHNvdXJjZSBjaGFubmVsIG5lZWQgdG8gYmUgc3luY2hyb25pemVkCi0gKiAgICAgICAgICAgIEZBTFNFIG1lYW5zIGJyb2FkY2FzdCBzb3VyY2UgY2hhbm5lbCBuZWVkIE5PVCBiZSBzeW5jaHJvbml6ZWQKLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbCBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIjsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhdHVzOwotICAgIHByaXZhdGUgaW50IG1TdWJHcm91cElkOwotICAgIHByaXZhdGUgYnl0ZVtdIG1NZXRhZGF0YTsKLQotICAgIHB1YmxpYyBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIChpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFTdWJHcm91cElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhTWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1JbmRleCA9IGluZGV4OwotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgICAgICAgICBtU3RhdHVzID0gc3Q7Ci0gICAgICAgICAgICBtU3ViR3JvdXBJZCA9IGFTdWJHcm91cElkOwotICAgICAgICAgICAgaWYgKGFNZXRhZGF0YSAhPSBudWxsICYmIGFNZXRhZGF0YS5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBieXRlW2FNZXRhZGF0YS5sZW5ndGhdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYU1ldGFkYXRhLCAwLCBtTWV0YWRhdGEsIDAsIGFNZXRhZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsKSB7Ci0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIG90aGVyID0gKEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwpIG87Ci0gICAgICAgICAgICByZXR1cm4gKG90aGVyLm1JbmRleCA9PSBtSW5kZXgKLSAgICAgICAgICAgICAgICAgICAgJiYgb3RoZXIubURlc2NyaXB0aW9uID09IG1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAmJiBvdGhlci5tU3RhdHVzID09IG1TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobUluZGV4LCBtRGVzY3JpcHRpb24sIG1TdGF0dXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTb3VyY2UgSWQgb2YgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwgT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJ5dGUgcmVwcmVzZW50aW5nIHRoZSBTb3VyY2UgSWQgb2YgdGhlIEJyb2FkY2FzdCBTb3VyY2UgSW5mbyBPYmplY3QKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfSU5WQUxJRF9TT1VSQ0VfSUR9IGluIGNhc2UgaWYgdGhpcyBmaWVsZCBpcyBub3QgdmFsaWQKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXggKCkgewotICAgICAgICByZXR1cm4gbUluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIEJyb2FkY2FzdCBzb3VyY2UgRGV2aWNlIG9iamVjdCBmcm9tIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIE9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBCbHVldG9vdGhEZXZpY2Ugb2JqZWN0IGZvciBCcm9hZGNhc3Qgc291cmNlIGRldmljZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIEdldHMgdGhlIHN0YXR1cyBvZiBnaXZlbiBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2VsZWN0ZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEBoaWRlCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U3RhdHVzICgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0dXM7Ci0gICAgfQotCi0gICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFkZHJlc3MgdHlwZSBvZiB0aGUgQnJvYWRjYXN0IHNvdXJjZSBhZHZlcnRpc2VtZW50IGZvciB0aGUgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbCBPYmplY3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gYnl0ZSBhZGRyZXNzVHlwZSwgdGhpcyBjYW4gYmUgb25lIG9mIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDfSBPUiB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX1BVQkxJQ30KLSAgICAgKiBAaGlkZQotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0TWV0YWRhdGEgKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzdWJncm91cCBJZCB0aGF0IGJyb2FkY2FzdCBDaGFubmVsIGJlbG9uZ3MKLSAgICAgKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN1Ykdyb3VwSWQgKCkgewotICAgICAgICAgcmV0dXJuIG1TdWJHcm91cElkOwotICAgIH0KLQotICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdGF0dXMgb2YgZ2l2ZW4gQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbAotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiBAaGlkZQotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMgKGJvb2xlYW4gc3RhdHVzKSB7Ci0gICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBQYXJjZWxhYmxlLkNyZWF0b3I8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gQ1JFQVRPUiA9Ci0gICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nKFRBRywgImNyZWF0ZUZyb21QYXJjZWw+Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MgPSBpbi5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhdHVzID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN1Ykdyb3VwSWQgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1ldGFkYXRhTGVuZ3RoID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgICAgICAgICBieXRlW10gbWV0YWRhdGEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFMZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IG5ldyBieXRlW21ldGFkYXRhTGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLnJlYWRCeXRlQXJyYXkobWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbCBzcmNDaGFubmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsKGluZGV4LCBkZXNjLCBzdGF0dXMsIHN1Ykdyb3VwSWQsIG1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKFRBRywgImNyZWF0ZUZyb21QYXJjZWw6IiArIHNyY0NoYW5uZWwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjQ2hhbm5lbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbFtdIG5ld0FycmF5KGludCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbFtzaXplXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGxvZyhUQUcsICJ3cml0ZVRvUGFyY2VsPiIpOwotICAgICAgICBvdXQud3JpdGVJbnQobUluZGV4KTsKLSAgICAgICAgb3V0LndyaXRlU3RyaW5nKG1EZXNjcmlwdGlvbik7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obVN0YXR1cyk7Ci0gICAgICAgIG91dC53cml0ZUludChtU3ViR3JvdXBJZCk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LndyaXRlSW50KG1NZXRhZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgb3V0LndyaXRlQnl0ZUFycmF5KG1NZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nKFRBRywgIndyaXRlVG9QYXJjZWw6IiArIHRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgVEFHLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQkFTU19EZWJ1ZyhUQUcsIG1zZyk7Ci0gICAgfQotfTsKLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvLmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxNTkwMS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhHYXR0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhNYW5hZ2VyOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdG8gZ2V0IHZhcmlvdXMgaW5mb3JtYXRpb24gb2YgQnJvYWRjYXN0Ci0gKiBzb3VyY2UgaW5mb3JtYXRpb24gc3RvcmVkIGluIHJlbW90ZS4gVXNlcnMgY2FuIGNhbGwgZ2V0L3NldCBtZXRob2RzCi0gKiBlbnF1aXJlIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbgotICoKLSAqIDxwPlRoaXMgYWxzbyBhY3RzIGFzIGdlbmVyYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIHVwZGF0aW5nIHRoZSBCcm9hZGNhc3QKLSAqIHNvdXJjZSBpbmZvcm1hdGlvbgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGlucHV0IHRoZSBVc2VyIHByb3ZpZGVkIGRhdGEgZm9yIGJlbG93IG9wZXJhdGlvbnMKLSAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI2FkZEJyb2FkY2FzdFNvdXJjZX0sCi0gKiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciN1cGRhdGVCcm9hZGNhc3RTb3VyY2V9IGFuZAotICoge0BsaW5rIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIjc2V0QnJvYWRjYXN0Q29kZX0KLSAqCi0gKiA8cD5UaGlzIGlzIGFsc28gdXNlZCB0byBwYWNrIGFsbCBCcm9hZGNhc3Qgc291cmNlIGluZm9ybWF0aW9uIGFzIHBhcnQgb2Yge0BsaW5rICNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfQotICogSW50ZW50LiBVc2VyIGNhbiByZXRyaXZlIHRoZSB7QGxpbmsgQmxlQnJvYWRjYXN0U291cmNlSW5mb30gdXNpbmcge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8jRVhUUkFfUkVDRUlWRVJfU1RBVEV9Ci0gKiBleHRyYSBmaWVsZAotICogQGhpZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmxlQnJvYWRjYXN0U291cmNlSW5mbyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBCQVNTX0RCRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwotCi0gICAgLyoqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIEBJbnREZWYocHJlZml4ID0gIkJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFXyIsIHZhbHVlID0gewotICAgICAgICAgICBCUk9BRENBU1RfQVNTSVNUX0FERFJFU1NfVFlQRV9QVUJMSUMsCi0gICAgICAgICAgIEJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX1JBTkRPTQotICAgIH0pCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJyb2FkY2FzdEFzc2lzdEFkZHJlc3NUeXBlIHt9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRyZXNzIFR5cGUgb2YgdGhlIExFIEJyb2FkY2FzdCBBdWRpbyBTb3VyY2UgRGV2aWNlCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgTEUgQnJvYWRjYXN0IEF1ZGlvIFNvdXJjZSBkZXZpY2UgdXNpbmcgcHVibGljIE9SCi0gICAgICogcmFuZG9tIGFkZHJlc3MgZm9yIHRoZSBMRSBBdWRpbyBicm9hZGNhc3RzCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDID0gMDsKLSAgICAvKioKLSAgICAgKiBBZGRyZXNzIFR5cGUgb2YgdGhlIExFIEJyb2FkY2FzdCBBdWRpbyBTb3VyY2UgRGV2aWNlCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgTEUgQnJvYWRjYXN0IEF1ZGlvIFNvdXJjZSBkZXZpY2UgdXNpbmcgcHVibGljIE9SCi0gICAgICogcmFuZG9tIGFkZHJlc3MgZm9yIHRoZSBMRSBBdWRpbyBicm9hZGNhc3RzCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUkFORE9NID0gMTsKLSAgICAgLyoqCi0gICAgICogQWRkcmVzcyBUeXBlIG9mIHRoZSBMRSBCcm9hZGNhc3QgQXVkaW8gU291cmNlIERldmljZQotICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIExFIEJyb2FkY2FzdCBBdWRpbyBTb3VyY2UgZGV2aWNlIHVzaW5nIHB1YmxpYyBQUgotICAgICAqIHJhbmRvbSBhZGRyZXNzIGZvciB0aGUgTEUgQXVkaW8gYnJvYWRjYXN0cwotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX0lOVkFMSUQgPSAweEZGRkY7Ci0KLSAgICAvKiogQGhpZGUgKi8KLSAgICBASW50RGVmKHByZWZpeCA9ICJCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfIiwgdmFsdWUgPSB7Ci0gICAgICAgICAgIEJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JRExFLAotICAgICAgICAgICBCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ0lORk9fUkVRLAotICAgICAgICAgICBCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQywKLSAgICAgICAgICAgQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNfRkFJTCwKLSAgICAgICAgICAgQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX05PX1BBU1QKLSAgICB9KQotICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICBwdWJsaWMgQGludGVyZmFjZSBCcm9hZGNhc3RBc3Npc3RNZXRhZGF0YVN5bmNTdGF0ZSB7fQotCi0gICAgLyoqCi0gICAgICogTWV0YSBkYXRhIFN5bmMgU3RhdGUKLSAgICAgKiBCcm9hZGNhc3QgcmVjZWl2ZXIgc3luYyBzdGF0ZSB3LnIudCBQQS4gU3RhdGUgSURMRSBzcGVjaWZpZXMgdGhhdCBicm9hZGNhc3QKLSAgICAgKiByZWNlaXZlciBpcyBub3QgYWJsZSB0byBzeW5jIHRoZSBNZXRhZGEvUEEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSURMRSA9IDA7Ci0gICAgLyoqCi0gICAgICogTWV0YSBkYXRhIFN5bmMgU3RhdGUKLSAgICAgKiBCcm9hZGNhc3QgcmVjZWl2ZXIgc3luYyBzdGF0ZSB3LnIudCBQQS4gU3RhdGUgU1lOQ0lORk8gUkVRIHNwZWNpZmllcyB0aGF0IGJyb2FkY2FzdAotICAgICAqIHJlY2VpdmVyIHJlcXVlc3RpbmcgZm9yIFNZTkNJTkZPIGZyb20gdGhlIFNjYW4gT2ZmbG9hZGVyIHRvIHN5bmNocm9uaWUKLSAgICAgKiB0byBNZXRhZGF0YS9QQQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9TWU5DSU5GT19SRVEgPSAxOwotICAgIC8qKgotICAgICAqIE1ldGEgZGF0YSBTeW5jIFN0YXRlCi0gICAgICogQnJvYWRjYXN0IHJlY2VpdmVyIHN5bmMgc3RhdGUgdy5yLnQgUEEuIFN0YXRlIElOU1lOQyBzcGVjaWZpZXMgdGhhdCBicm9hZGNhc3QKLSAgICAgKiByZWNlaXZlciBpbiBzeW5jIHdpdGggdG8gTWV0YWRhdGEvUEEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkMgPSAyOwotICAgIC8qKgotICAgICAqIE1ldGEgZGF0YSBTeW5jIFN0YXRlCi0gICAgICogQnJvYWRjYXN0IHJlY2VpdmVyIHN5bmMgc3RhdGUgdy5yLnQgUEEuIFN0YXRlIElOU1lOQyBzcGVjaWZpZXMgdGhhdCBicm9hZGNhc3QKLSAgICAgKiByZWNlaXZlciBpcyBmYWlsZWQgdG8gc3luYyB3aXRoIE1ldGFkYXRhL1BBLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9TWU5DX0ZBSUwgPSAzOwotICAgIC8qKgotICAgICAqIE1ldGEgZGF0YSBTeW5jIFN0YXRlCi0gICAgICogQnJvYWRjYXN0IHJlY2VpdmVyIHN5bmMgc3RhdGUgdy5yLnQgUEEuIFN0YXRlIFNZTkMgTk9QQVNUIGRlbm90ZXMgdGhhdCBicm9hZGNhc3QKLSAgICAgKiByZWNlaXZlciBuZWVkcyBQQVNUIHByb2NlZHVyZSB0byBzeW5jIHdpdGggTWV0YWRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX05PX1BBU1QgPSA0OwotICAgIC8qKgotICAgICAqIE1ldGEgZGF0YSBTeW5jIFN0YXRlCi0gICAgICogQnJvYWRjYXN0IHJlY2VpdmVyIHN5bmMgc3RhdGUgdy5yLnQgUEEuIFN0YXRlIFNZTkMgTk9QQVNUIGRlbm90ZXMgdGhhdCBicm9hZGNhc3QKLSAgICAgKiByZWNlaXZlciBuZWVkcyBQQVNUIHByb2NlZHVyZSB0byBzeW5jIHdpdGggTWV0YWRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOVkFMSUQgPSAweEZGRkY7Ci0KLSAgICAvKiogQGhpZGUgKi8KLSAgICBASW50RGVmKHByZWZpeCA9ICJCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfIiwgdmFsdWUgPSB7Ci0gICAgICAgICAgIEJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9OT1RfU1lOQ0hST05JWkVELAotICAgICAgICAgICBCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfU1lOQ0hST05JWkVECi0gICAgfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHVibGljIEBpbnRlcmZhY2UgQnJvYWRjYXN0QXNzaXN0QXVkaW9TeW5jU3RhdGUge30KLQotICAgIC8qKgotICAgICAqIEJyb2FkY2FzdCBBdWRpbyBzdHJlYW0gU3luYyBTdGF0ZQotICAgICAqIEJyb2FkY2FzdCByZWNlaXZlciBzeW5jIHN0YXRlIHcuci50IEJyb2FkY2FzdCBBdWRpbyBzdHJlYW0gQklTLiBkZW5vdGVzCi0gICAgICogcmVjZWl2ZXIgaXMgbm90IHN5bmNocm9uaXplZCB0byBMRSBBdWRpbyBCSVMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfTk9UX1NZTkNIUk9OSVpFRCA9IDA7Ci0gICAgLyoqCi0gICAgICogQnJvYWRjYXN0IEF1ZGlvIHN0cmVhbSBTeW5jIFN0YXRlCi0gICAgICogQnJvYWRjYXN0IHJlY2VpdmVyIHN5bmMgc3RhdGUgdy5yLnQgQnJvYWRjYXN0IEF1ZGlvIHN0cmVhbSBCSVMuIGRlbm90ZXMKLSAgICAgKiByZWNlaXZlciBpcyBub3Qgc3luY2hyb25pemVkIHRvIExFIEF1ZGlvIEJJUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQgPSAxOwotICAgIC8qKgotICAgICAqIEJyb2FkY2FzdCBBdWRpbyBzdHJlYW0gU3luYyBTdGF0ZQotICAgICAqIEJyb2FkY2FzdCByZWNlaXZlciBzeW5jIHN0YXRlIHcuci50IEJyb2FkY2FzdCBBdWRpbyBzdHJlYW0gQklTLiBkZW5vdGVzCi0gICAgICogcmVjZWl2ZXIgaXMgbm90IHN5bmNocm9uaXplZCB0byBMRSBBdWRpbyBCSVMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfSU5WQUxJRCA9IDB4RkZGRjsKLQotCi0gICAgLyoqIEBoaWRlICovCi0gICAgQEludERlZihwcmVmaXggPSAiQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfIiwgdmFsdWUgPSB7Ci0gICAgICAgICAgIEJST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX1VORU5DUllQVEVELAotICAgICAgICAgICBCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9QSU5fTkVFREVELAotICAgICAgICAgICBCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9ERUNSWVBUSU5HCi0gICAgfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHVibGljIEBpbnRlcmZhY2UgQnJvYWRjYXN0QXNzaXN0RW5jcnlwdGlvblN0YXRlIHt9Ci0gICAvKioKLSAgICAqIEVuY3J5cHRpb24gU3RhdHVzIGF0IHRoZSBMRSBBdWRpbyBicm9hZGNhc3QgcmVjZWl2ZXIgc2lkZQotICAgICogVU5FTkNSWVBURUQgZGVub3RlZCB0aGF0IGJyb2FkY2FzdCByZWNlaXZlciBpcyBpbiBzeW5jIHdpdGggYW4gdW5jcnlwdGVkCi0gICAgKiBicm9hZGNhc3RlZCBhdWRpbwotICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfVU5FTkNSWVBURUQgPSAwOwotICAgLyoqCi0gICAgKiBFbmNyeXB0aW9uIFN0YXR1cyBhdCB0aGUgTEUgQXVkaW8gYnJvYWRjYXN0IHJlY2VpdmVyIHNpZGUKLSAgICAqIFBJTl9ORUVERUQgZGVub3RlIHRoYXQgdGhlIEJyb2FkY2FzdCByZWNlaXZlciBuZWVkcyBicm9hZGNhc3QgUElOCi0gICAgKiB0byBzeW5jIGFuZCBsaXN0ZW4gdG8gQnJvYWRjYXN0ZWQgQXVkaW8KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX1BJTl9ORUVERUQgPSAxOwotICAgLyoqCi0gICAgICogRW5jcnlwdGlvbiBTdGF0dXMgYXQgdGhlIExFIEF1ZGlvIGJyb2FkY2FzdCByZWNlaXZlciBzaWRlCi0gICAgICogc3RhdGUgREVDUllQVElORyBkZW5vdGUgdGhhdCB0aGUgQnJvYWRjYXN0IHJlY2VpdmVyIGlzIGFibGUgdG8gZGVjcnlwdAotICAgICAqIGFuZCBsaXN0ZW4gdG8gdGhlIEJyb2FkY2FzdGVkIEF1ZGlvCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfREVDUllQVElORyA9IDI7Ci0gICAvKioKLSAgICAgKiBFbmNyeXB0aW9uIFN0YXR1cyBhdCB0aGUgTEUgQXVkaW8gYnJvYWRjYXN0IHJlY2VpdmVyIHNpZGUKLSAgICAgKiBzdGF0ZSBCQURDT0RFIGRlbm90ZSB0aGF0IHRoZSBCcm9hZGNhc3QgcmVjZWl2ZXIgaGFzIGdvdCBiYWQgY29kZQotICAgICAqIGFuZCBub3QgYWJsZSBkZWNyeXB0Ci0gICAgICogSW5jb3JyZWN0IGNvZGUgdGhhdCBTY2FuIGRlbGVnYXRvciB0cmllZCB0byBkZWNyeXB0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbQotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfQkFEQ09ERSA9IDM7Ci0gICAvKioKLSAgICAgKiBFbmNyeXB0aW9uIFN0YXR1cyBhdCB0aGUgTEUgQXVkaW8gYnJvYWRjYXN0IHJlY2VpdmVyIHNpZGUKLSAgICAgKiBzdGF0ZSBERUNSWVBUSU5HIGRlbm90ZSB0aGF0IHRoZSBCcm9hZGNhc3QgcmVjZWl2ZXIgaXMgYWJsZSB0byBkZWNyeXB0Ci0gICAgICogYW5kIGxpc3RlbiB0byB0aGUgQnJvYWRjYXN0ZWQgQXVkaW8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9JTlZBTElEID0gMHhGRkZGOwotCi0gICAgLyoKLSAgICAgKiBJbnZhbGlkIEJyb2FkY2FzdCBzb3VyY2UgSW5mb3JtYXRpb24gSWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQlJPQURDQVNUX0FTU0lTVF9JTlZBTElEX1NPVVJDRV9JRCA9IChieXRlKTB4MDA7Ci0gICAgLyoKLSAgICAgKiBJbnZhbGlkIEJyb2FkY2FzdGVyIElkZW50aWZpZXIgb2YgdGhlIGdpdmVuIEJyb2FkY2FzdCBTb3VyY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RFUl9JRF9JTlZBTElEID0gMHhGRkZGOwotICAgIC8qKgotICAgICAqIFVzZWQgYXMgYW4gaW50IGV4dHJhIGZpZWxkIGluIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI0FDVElPTl9CUk9BRENBU1RfUkVDRUlWRVJfU1RBVEV9Ci0gICAgICogaW50ZW50IG5vdGlmeXMgdGhlIEJyb2FkY2FzdCBTb3VyY2UgSW5mb3JtYXRpb24gdG8gQXBwbGljYXRpb24gbGF5ZXIKLSAgICAgKgotICAgICAqIDxwPiBTb3VyY2UgSW5mbyBvYmplY3QgY2FuIGJlIGV4dHJhY3RlZCB1c2luZyB0aGlzIGV4dHJhIGZpZWxkIGF0IEFwcGxpY2F0aW9uIGxheWVyCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gcmVhZCB0aGUge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gfSBwYXJjZWxhYmxlIG9iamVjdAotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU09VUkNFX0lORk8gPSAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmV4dHJhLlNPVVJDRV9JTkZPIjsKLSAgICAvKioKLSAgICAgKiBVc2VkIGFzIGFuIGludCBleHRyYSBmaWVsZCBpbiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfQotICAgICAqIGludGVudCBCcm9hZGNhc3QgU291cmNlIEluZm9ybWF0aW9uIHRvIEFwcGxpY2F0aW9uIGxheWVyCi0gICAgICoKLSAgICAgKiA8cD4gSW5kZXggb2YgdGhlIFNvdXJjZSBJbmZvIG9iamVjdCBjYW4gYmUgZXh0cmFjdGVkIHVzaW5nIHRoaXMgZXh0cmEgZmllbGQgYXQgQXBwbGljYXRpb24gbGF5ZXIKLSAgICAgKgotICAgICAqIFRoaXMgaXMgdXNlZCB0byByZWFkIHRoZSB7QGxpbmsgQmxlQnJvYWRjYXN0U291cmNlSW5mbyB9IHBhcmNlbGFibGUgb2JqZWN0Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TT1VSQ0VfSU5GT19JTkRFWCA9ICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuZXh0cmEuU09VUkNFX0lORk9fSU5ERVgiOwotICAgIC8qKgotICAgICAqIFVzZWQgYXMgYW4gaW50IGV4dHJhIGZpZWxkIGluIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyI0FDVElPTl9CUk9BRENBU1RfUkVDRUlWRVJfU1RBVEV9Ci0gICAgICogaW50ZW50IG5vdGlmeXMgdGhlIEJyb2FkY2FzdCBTb3VyY2UgSW5mb3JtYXRpb24gdG8gQXBwbGljYXRpb24gbGF5ZXIKLSAgICAgKgotICAgICAqIDxwPiBNYXhpbW0gbnVtYmVyIG9mIHRoZSBCcm9hZGNhc3QgU291cmNlIEluZm9ybWF0aW9uIHRoYXQgZ2l2ZW4gYnJvYWRjYXN0IHJlY2VpdmVyIGNhbiBob2xkLCBjYW4gYmUgZXh0cmFjdGVkIHVzaW5nCi0gICAgICogdGhpcyBleHRyYSBmaWVsZCBhdCBBcHBsaWNhdGlvbiBsYXllcgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NQVhfTlVNX1NPVVJDRV9JTkZPUyA9ICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuZXh0cmEuTUFYX05VTV9TT1VSQ0VfSU5GT1MiOwotICAgIHByaXZhdGUgYnl0ZSBtU291cmNlSWQ7Ci0gICAgcHJpdmF0ZSBAQnJvYWRjYXN0QXNzaXN0QWRkcmVzc1R5cGUgaW50IG1Tb3VyY2VBZGRyZXNzVHlwZTsKLSAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtU291cmNlRGV2aWNlOwotICAgIHByaXZhdGUgYnl0ZSBtU291cmNlQWR2U2lkOwotICAgIHByaXZhdGUgaW50IG1Ccm9hZGNhc3RlcklkOwotICAgIHByaXZhdGUgQEJyb2FkY2FzdEFzc2lzdE1ldGFkYXRhU3luY1N0YXRlIGludCBtTWV0YURhdGFTeW5jU3RhdGU7Ci0gICAgcHJpdmF0ZSBAQnJvYWRjYXN0QXNzaXN0QXVkaW9TeW5jU3RhdGUgaW50IG1BdWRpb1N5bmNTdGF0ZTsKLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtQXVkaW9CaXNJbmRleExpc3QgPSBuZXcgSGFzaE1hcCA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICBwcml2YXRlIEBCcm9hZGNhc3RBc3Npc3RFbmNyeXB0aW9uU3RhdGUgaW50IG1FbmN5cHRpb25TdGF0dXM7Ci0gICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgYnl0ZVtdPiBtTWV0YWRhdGFMaXN0ID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPigpOwotICAgIHByaXZhdGUgU3RyaW5nIG1Ccm9hZGNhc3RDb2RlOwotICAgIHByaXZhdGUgYnl0ZVtdIG1CYWRCcm9hZGNhc3RDb2RlOwotICAgIHByaXZhdGUgYnl0ZSBtTnVtU3ViR3JvdXBzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVNfTk9fUFJFRiA9IDB4RkZGRkZGRkY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9DT0RFX1NJWkUgPSAxNjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBFbXB0eSBvYmplY3Qgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gfSB3aXRoIGdpdmVuIHNvdXJjZSBJZCwKLSAgICAgKiB3aGljaCBjb250YWlucywgQnJvYWRjYXN0IHJlY2lldmVyIHN0YXRlIGluZm9ybWF0aW9uIGZvciBCcm9hZGNhc3QgQXNzaXN0YW50IFVzZWNhc2VzLgotICAgICAqCi0gICAgICogVGhpcyBpcyBtYWlubHkgdXNlZCB0byByZXByZXNlbnQgdGhlIEVtcHR5IEJyb2FkY2FzdCBzb3VyY2UgZW50cmllcwotICAgICAqCi0gICAgICogIEBwYXJhbSBzb3VyY2VJZCBTb3VyY2UgSWQgZm9yIHRoaXMgYnJvYWRjYXN0IHNvdXJjZSBpbmZvIG9iamVjdAotICAgICAqCi0gICAgICogIEBkZXByZWNhdGVkCi0gICAgICogIEBoaWRlCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgQmxlQnJvYWRjYXN0U291cmNlSW5mbyAoYnl0ZSBzb3VyY2VJZCkgewotICAgICAgIG1Tb3VyY2VJZCA9IHNvdXJjZUlkOwotICAgICAgIG1NZXRhRGF0YVN5bmNTdGF0ZSA9IEJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JTlZBTElEOwotICAgICAgIG1BdWRpb1N5bmNTdGF0ZSA9IEJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9JTlZBTElEOwotICAgICAgIG1Tb3VyY2VBZGRyZXNzVHlwZSA9IEJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX0lOVkFMSUQ7Ci0gICAgICAgbVNvdXJjZURldmljZSA9IG51bGw7Ci0gICAgICAgbVNvdXJjZUFkdlNpZCA9IChieXRlKTB4MDA7Ci0gICAgICAgbUVuY3lwdGlvblN0YXR1cyA9IEJST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX0lOVkFMSUQ7Ci0gICAgICAgbUJyb2FkY2FzdENvZGUgPSBudWxsOwotICAgICAgIG1CYWRCcm9hZGNhc3RDb2RlID0gbnVsbDsKLSAgICAgICBtTnVtU3ViR3JvdXBzID0gMDsKLSAgICAgICBtQnJvYWRjYXN0ZXJJZCA9IEJST0FEQ0FTVEVSX0lEX0lOVkFMSUQ7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBvYmplY3Qgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gfSB3aGljaCBjb250YWlucwotICAgICAqIEJyb2FkY2FzdCByZWNpZXZlciBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgQnJvYWRjYXN0IEFzc2lzdGFudCBVc2VjYXNlcy4KLSAgICAgKiBUaGlzIGlzICBtYWlubHkgdXNlZCBmb3IgaW5wdXQgcHVycG9zZSBvZiB7QGxpbmsgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciNhZGRCcm9hZGNhc3RTb3VyY2V9Ci0gICAgICogb3BlcmF0aW9uCi0gICAgICoKLSAgICAgKiAgQHBhcmFtIGF1ZGlvU291cmNlIEJsdWV0b290aERldmljZSBvYmplY3Qgd2hjaWggaXMgc2VsZWN0ZWQgYXMgQnJvYWRjYXN0IHNvdXJjZQotICAgICAqICBAcGFyYW0gYWR2U2lkIGFkdmVydGlzaW5nIFNpZCBvZiB0aGUgQnJvYWRjYXN0IHNvdXJjZSBkZXZpY2UgZm9yIHdoaWNoIHJlY2lldmVyIHN5bmNocm9uaXplZCB3aXRoLgotICAgICAqICBAcGFyYW0gYWRkcmVzc1R5cGUgdHlwZSBvZiBhZGRyZXNzLiBUaGlzIGNhbiBiZSBiZSBvbmUgb2Yge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0FERFJFU1NfVFlQRV9QVUJMSUN9IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0FERFJFU1NfVFlQRV9SQU5ET019Ci0gICAgICogIEBwYXJhbSBtZXRhZGF0YVN5bmNTdGF0ZSBzeW5jIHN0YXR1cyBvZiBtZXRhZGF0YSBhdCB0aGUgcmVjZWl2ZXIgc2lkZSBmcm9tIHRoaXMgQnJvYWRjYXN0IHNvdXJjZS4gVGhpcyBjYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG9uZSBvZiB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JRExFfSwge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ0lORk9fUkVRfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkN9LAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ19GQUlMfSBPUiAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ19OT19QQVNUfQotICAgICAqICBAcGFyYW0gYXVkaW9TeW5jU3RhdGUgQXVkaW8gc3luYyBzdGF0dXMgb2YgbWV0YWRhdGEgYXQgdGhlIHJlY2VpdmVyIHNpZGUgZnJvbSB0aGlzIGJyb2FkY2FzdCBzb3VyY2UuIFRoaXMgY2FuIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2Yge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfTk9UX1NZTkNIUk9OSVpFRH0gT1IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRH0KLSAgICAgKiAgQHBhcmFtIGF1ZGlvQmlzSW5kZXggQXVkaW8gQklTIGluZGV4IGZvciB3aGF0IEJyb2FkY2FzdCByZWNpZXZlciBzeW5jaHJvbml6ZWQgd2l0aAotICAgICAqICBAcGFyYW0gbWV0YWRhdGFMZW5ndGggTGVuZ3RoIG9mIHRoZSAgbWV0YWRhdGEgZmllbGQKLSAgICAgKiAgQHByYW1hIG1ldGFkYXRhIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIEJyb2FkY2FzdCBpbmZvcm1hdGlvbiBiZWluZyBzeW5jaHJvbml6ZWQgYXQgcmVjZWl2ZXIgc2lkZQotICAgICAqCi0gICAgICoKLSAgICAgKiAgQGhpZGUKLSAgICAgKi8KLSAgICAvKnBhY2thZ2UqLyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIChCbHVldG9vdGhEZXZpY2UgYXVkaW9Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBhZHZTaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdEFkZHJlc3NUeXBlIGludCBhZGRyZXNzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQnJvYWRjYXN0QXNzaXN0TWV0YWRhdGFTeW5jU3RhdGUgaW50IG1ldGFkYXRhU3luY3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCcm9hZGNhc3RBc3Npc3RBdWRpb1N5bmNTdGF0ZSBpbnQgYXVkaW9TeW5jc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBzZWxlY3RlZEJJU0luZGljaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgbU1ldGFEYXRhU3luY1N0YXRlID0gIG1ldGFkYXRhU3luY3N0YXRlOwotICAgICAgIG1BdWRpb1N5bmNTdGF0ZSA9IGF1ZGlvU3luY3N0YXRlOwotICAgICAgIG1Tb3VyY2VBZGRyZXNzVHlwZSA9IGFkZHJlc3NUeXBlOwotICAgICAgIG1Tb3VyY2VEZXZpY2UgPSBhdWRpb1NvdXJjZTsKLSAgICAgICBtU291cmNlQWR2U2lkID0gYWR2U2lkOwotICAgICAgIG1Ccm9hZGNhc3RlcklkID0gQlJPQURDQVNURVJfSURfSU5WQUxJRDsKLSAgICAgICBpZiAoc2VsZWN0ZWRCSVNJbmRpY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAic2VsZWN0ZWRCSVNJbmRpY2llc0xpc3QgaXMgbnVsbCIpOwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzZWxlY3RlZEJJU0luZGljaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgaWYgKHNlbGVjdGVkQklTSW5kaWNpZXMuZ2V0KGkpLmdldFN0YXR1cygpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgIEludGVnZXIgYXVkaW9CaXNJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgIGludCBzdWJHcm91cElkID0gc2VsZWN0ZWRCSVNJbmRpY2llcy5nZXQoaSkuZ2V0U3ViR3JvdXBJZCgpOwotICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvQmlzSW5kZXhMaXN0LmNvbnRhaW5zS2V5KHN1Ykdyb3VwSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBhdWRpb0Jpc0luZGV4ID0gbUF1ZGlvQmlzSW5kZXhMaXN0LmdldChzdWJHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBhdWRpb0Jpc0luZGV4ID0gYXVkaW9CaXNJbmRleCB8ICgxPDxzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICAgICAgICAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJpbmRleCIgKyBzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXRJbmRleCgpICsgImlzIHNldCIpOwotICAgICAgICAgICAgICAgICBtQXVkaW9CaXNJbmRleExpc3QucHV0KHN1Ykdyb3VwSWQsIGF1ZGlvQmlzSW5kZXgpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgIC8vbm90IHZhbGlkIGluZm8KLSAgICAgICBtU291cmNlSWQgPSBCUk9BRENBU1RfQVNTSVNUX0lOVkFMSURfU09VUkNFX0lEOwotICAgICAgIG1FbmN5cHRpb25TdGF0dXMgPSBCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9JTlZBTElEOwotICAgICAgIG1Ccm9hZGNhc3RDb2RlID0gbnVsbDsKLSAgICAgICBtQmFkQnJvYWRjYXN0Q29kZSA9IG51bGw7Ci0gICAgICAgbU51bVN1Ykdyb3VwcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb3ZlcnJpZGUgIHRvIGNyZWF0ZSBhbiBvYmplY3Qgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gfSB3aGljaCBjb250YWlucwotICAgICAqIEJyb2FkY2FzdCByZWNpZXZlciBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgQnJvYWRjYXN0IEFzc2lzdGFudCBVc2VjYXNlcy4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgbWFpbmx5IHVzZWQgZm9yIG91dHB1dCBwdXJwb3NlIHRvIGNyZWF0ZSBhbiBvYmplY3QgZnJvbSB0aGUgcmVjZWl2ZXIgc3RhdGUgaW5mb3JtYXRpb24KLSAgICAgKiByZWFkIGZyb20gdGhlIHJlbW90ZSBCQVNTIHNlcnZlci4gVGhpcyB3aWxsIGJlIHBhY2tlZCBhbmQgYnJvYWRjYXN0ZWQgYXMgYW4gSW50ZW50IHVzaW5nCi0gICAgICoge0BsaW5rICNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfQotICAgICAqCi0gICAgICogIEBwYXJhbSBhdWRpb1NvdXJjZSBCbHVldG9vdGhEZXZpY2Ugb2JqZWN0IHdoY2loIGlzIHNlbGVjdGVkIGFzIEJyb2FkY2FzdCBzb3VyY2UKLSAgICAgKiAgQHBhcmFtIHNvdXJjZUlkIFNvdXJjZSBJZCBmb3IgdGhpcyBicm9hZGNhc3Qgc291cmNlIGluZm8gb2JqZWN0Ci0gICAgICogIEBwYXJhbSBhZHZTaWQgYWR2ZXJ0aXNpbmcgU2lkIG9mIHRoZSBCcm9hZGNhc3Qgc291cmNlIGRldmljZSBmb3Igd2hpY2ggcmVjaWV2ZXIgc3luY2hyb25pemVkIHdpdGgKLSAgICAgKiAgQHBhcmFtIGFkZHJlc3NUeXBlIHR5cGUgb2YgYWRkcmVzcy4gVGhpcyBjYW4gYmUgYmUgb25lIG9mIHtAbGluayAjQkxFX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDfSBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQkxFX0FTU0lTVF9BRERSRVNTX1RZUEVfUkFORE9NfQotICAgICAqICBAcGFyYW0gbWV0YWRhdGFTeW5jU3RhdGUgc3luYyBzdGF0dXMgb2YgbWV0YWRhdGEgYXQgdGhlIHJlY2VpdmVyIHNpZGUgZnJvbSB0aGlzIEJyb2FkY2FzdCBzb3VyY2UuIFRoaXMgY2FuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBvbmUgb2Yge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSURMRX0sIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNJTkZPX1JFUX0sCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JTl9TWU5DfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNfRkFJTH0gT1IgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNfTk9fUEFTVH0KLSAgICAgKiAgQHBhcmFtIGF1ZGlvU3luY1N0YXRlIEF1ZGlvIHN5bmMgc3RhdHVzIG9mIG1ldGFkYXRhIGF0IHRoZSByZWNlaXZlciBzaWRlIGZyb20gdGhpcyBicm9hZGNhc3Qgc291cmNlLiBUaGlzIGNhbiBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX05PVF9TWU5DSFJPTklaRUR9IE9SCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUR9Ci0gICAgICogIEBwYXJhbSBlbmNyeXB0aW9uU3RhdHVzIEVuY3J5b3Rpb24gc3RhdGUgYXQgQnJvYWRjYXN0IHJlY2VpdmVyLiBUaGlzIGNhbiBiZSBvbmUgb2Yge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9VTkVOQ1JZUFRFRH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfUElOX05FRURFRH0gT1Ige0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9ERUNSWVBUSU5HfQotICAgICAqICBAcGFyYW0gYXVkaW9CaXNJbmRleCBBdWRpbyBCSVMgaW5kZXggZm9yIHdoYXQgQnJvYWRjYXN0IHJlY2lldmVyIHN5bmNocm9uaXplZCB3aXRoCi0gICAgICogIEBwYXJhbSBtZXRhZGF0YUxlbmd0aCBMZW5ndGggb2YgdGhlICBtZXRhZGF0YSBmaWVsZAotICAgICAqICBAcHJhbWEgbWV0YWRhdGEgbWV0YWRhdGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgQnJvYWRjYXN0IGluZm9ybWF0aW9uIGJlaW5nIHN5bmNocm9uaXplZCBhdCByZWNlaXZlciBzaWRlCi0gICAgICoKLSAgICAgKgotICAgICAqICBAZGVwcmVjYXRlZAotICAgICAqICBAaGlkZQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gKEJsdWV0b290aERldmljZSBhdWRpb1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNvdXJjZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgYWR2U2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicm9hZGNhc3RlcklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCcm9hZGNhc3RBc3Npc3RBZGRyZXNzVHlwZSBpbnQgYWRkcmVzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdE1ldGFkYXRhU3luY1N0YXRlIGludCBtZXRhZGF0YVN5bmNzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQnJvYWRjYXN0QXNzaXN0RW5jcnlwdGlvblN0YXRlIGludCBlbmNyeXB0aW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiYWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgbnVtU3ViR3JvdXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCcm9hZGNhc3RBc3Npc3RBdWRpb1N5bmNTdGF0ZSBpbnQgYXVkaW9TeW5jc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4+IHNlbGVjdGVkQklTSW5kaWNpZXNMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBieXRlW10+IG1ldGFkYXRhTGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgIG1Tb3VyY2VJZCA9IHNvdXJjZUlkOwotICAgICAgIG1Tb3VyY2VBZGRyZXNzVHlwZSA9IGFkZHJlc3NUeXBlOwotICAgICAgIG1Tb3VyY2VEZXZpY2UgPSBhdWRpb1NvdXJjZTsKLSAgICAgICBtU291cmNlQWR2U2lkID0gYWR2U2lkOwotICAgICAgIG1Ccm9hZGNhc3RlcklkID0gYnJvYWRjYXN0ZXJJZDsKLSAgICAgICBtTWV0YURhdGFTeW5jU3RhdGUgPSAgbWV0YWRhdGFTeW5jc3RhdGU7Ci0gICAgICAgbUF1ZGlvU3luY1N0YXRlID0gYXVkaW9TeW5jc3RhdGU7Ci0gICAgICAgbUVuY3lwdGlvblN0YXR1cyA9IGVuY3J5cHRpb25TdGF0dXM7Ci0gICAgICAgaWYgKGJhZENvZGUgIT0gbnVsbCkgewotICAgICAgICAgICBtQmFkQnJvYWRjYXN0Q29kZSA9IG5ldyBieXRlW0JST0FEQ0FTVF9DT0RFX1NJWkVdOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJhZENvZGUsIDAsIG1CYWRCcm9hZGNhc3RDb2RlLCAwLCBtQmFkQnJvYWRjYXN0Q29kZS5sZW5ndGgpOwotICAgICAgIH0KLSAgICAgICBtTnVtU3ViR3JvdXBzID0gbnVtU3ViR3JvdXBzOwotICAgICAgIGludCBhdWRpb0Jpc0luZGV4ID0gMDsKLSAgICAgICBpZiAoc2VsZWN0ZWRCSVNJbmRpY2llc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+PiBlbnRyeSA6IHNlbGVjdGVkQklTSW5kaWNpZXNMaXN0LmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gc2VsZWN0ZWRCSVNJbmRpY2llcyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRCSVNJbmRpY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJzZWxlY3RlZEJJU0luZGljaWVzTGlzdCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzZWxlY3RlZEJJU0luZGljaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXRTdGF0dXMoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Jpc0luZGV4ID0gYXVkaW9CaXNJbmRleCB8ICgxPDxzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAiaW5kZXgiICsgc2VsZWN0ZWRCSVNJbmRpY2llcy5nZXQoaSkuZ2V0SW5kZXgoKSArICJpcyBzZXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAic3ViR3JvdXBJZDoiICsgZW50cnkuZ2V0S2V5KCkgKyAiYXVkaW9CaXNJbmRleCIgKyBhdWRpb0Jpc0luZGV4KTsKLSAgICAgICAgICAgICAgIG1BdWRpb0Jpc0luZGV4TGlzdC5wdXQoZW50cnkuZ2V0S2V5KCksIGF1ZGlvQmlzSW5kZXgpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGlmIChtZXRhZGF0YUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBieXRlW10+IGVudHJ5IDogbWV0YWRhdGFMaXN0LmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgIGJ5dGVbXSBtZXRhZGF0YSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiBtZXRhZGF0YS5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBtRCA9IG5ldyBieXRlW21ldGFkYXRhLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtZXRhZGF0YSwgMCwgbUQsIDAsIG1ldGFkYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBtTWV0YWRhdGFMaXN0LnB1dChlbnRyeS5nZXRLZXkoKSwgbWV0YWRhdGEpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igb3ZlcnJpZGUgIHRvIGNyZWF0ZSBhbiBvYmplY3Qgb2Yge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gfSB3aGljaCBjb250YWlucwotICAgICAqIEJyb2FkY2FzdCByZWNpZXZlciBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgQnJvYWRjYXN0IEFzc2lzdGFudCBVc2VjYXNlcy4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgbWFpbmx5IHVzZWQgZm9yIG91dHB1dCBwdXJwb3NlIHRvIGNyZWF0ZSBhbiBvYmplY3QgZnJvbSB0aGUgcmVjZWl2ZXIgc3RhdGUgaW5mb3JtYXRpb24KLSAgICAgKiByZWFkIGZyb20gdGhlIHJlbW90ZSBCQVNTIHNlcnZlci4gVGhpcyB3aWxsIGJlIHBhY2tlZCBhbmQgYnJvYWRjYXN0ZWQgYXMgYW4gSW50ZW50IHVzaW5nCi0gICAgICoge0BsaW5rICNBQ1RJT05fQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFfQotICAgICAqCi0gICAgICogIEBwYXJhbSBhdWRpb1NvdXJjZSBCbHVldG9vdGhEZXZpY2Ugb2JqZWN0IHdoY2loIGlzIHNlbGVjdGVkIGFzIEJyb2FkY2FzdCBzb3VyY2UKLSAgICAgKiAgQHBhcmFtIGFkdlNpZCBhZHZlcnRpc2luZyBTaWQgb2YgdGhlIEJyb2FkY2FzdCBzb3VyY2UgZGV2aWNlIGZvciB3aGljaCByZWNpZXZlciBzeW5jaHJvbml6ZWQgd2l0aAotICAgICAqICBAcGFyYW0gYWRkcmVzc1R5cGUgdHlwZSBvZiBhZGRyZXNzLiBUaGlzIGNhbiBiZSBiZSBvbmUgb2Yge0BsaW5rICNCTEVfQVNTSVNUX0FERFJFU1NfVFlQRV9QVUJMSUN9IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCTEVfQVNTSVNUX0FERFJFU1NfVFlQRV9SQU5ET019Ci0gICAgICogIEBwYXJhbSBtZXRhZGF0YVN5bmNTdGF0ZSBzeW5jIHN0YXR1cyBvZiBtZXRhZGF0YSBhdCB0aGUgcmVjZWl2ZXIgc2lkZSBmcm9tIHRoaXMgQnJvYWRjYXN0IHNvdXJjZS4gVGhpcyBjYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG9uZSBvZiB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JRExFfSwge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ0lORk9fUkVRfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkN9LAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ19GQUlMfSBPUiAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ19OT19QQVNUfQotICAgICAqICBAcGFyYW0gYXVkaW9TeW5jU3RhdGUgQXVkaW8gc3luYyBzdGF0dXMgb2YgbWV0YWRhdGEgYXQgdGhlIHJlY2VpdmVyIHNpZGUgZnJvbSB0aGlzIGJyb2FkY2FzdCBzb3VyY2UuIFRoaXMgY2FuIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2Yge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfTk9UX1NZTkNIUk9OSVpFRH0gT1IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRH0KLSAgICAgKiAgQHBhcmFtIGVuY3J5cHRpb25TdGF0dXMgRW5jcnlvdGlvbiBzdGF0ZSBhdCBCcm9hZGNhc3QgcmVjZWl2ZXIuIFRoaXMgY2FuIGJlIG9uZSBvZiB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX1VORU5DUllQVEVEfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9QSU5fTkVFREVEfSBPUiB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX0RFQ1JZUFRJTkd9Ci0gICAgICogIEBwYXJhbSBhdWRpb0Jpc0luZGV4IEF1ZGlvIEJJUyBpbmRleCBmb3Igd2hhdCBCcm9hZGNhc3QgcmVjaWV2ZXIgc3luY2hyb25pemVkIHdpdGgKLSAgICAgKiAgQHBhcmFtIG1ldGFkYXRhTGVuZ3RoIExlbmd0aCBvZiB0aGUgIG1ldGFkYXRhIGZpZWxkCi0gICAgICogIEBwcmFtYSBtZXRhZGF0YSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBCcm9hZGNhc3QgaW5mb3JtYXRpb24gYmVpbmcgc3luY2hyb25pemVkIGF0IHJlY2VpdmVyIHNpZGUKLSAgICAgKiAgQHBhcmFtIGJyb2FkY2FzdENvZGUgTnVtZXJpYyBDaGFyYWN0ZXIgU3RyaW5nIG1heGltdW0gb2YgMTYgY2hhcmFjdGVycyBpbiBsZW5ndGgsIHdoaWNoIHNlcnZlcyBhcyBicm9hZGNhc3QgUElOIGNvZGUKLSAgICAgKgotICAgICAqICBAaGlkZQotICAgICAqLwotICAgIC8qcGFja2FnZSovIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzb3VyY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGFkdlNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQnJvYWRjYXN0QXNzaXN0QWRkcmVzc1R5cGUgaW50IGFkZHJlc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCcm9hZGNhc3RBc3Npc3RNZXRhZGF0YVN5bmNTdGF0ZSBpbnQgbWV0YWRhdGFTeW5jc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdEF1ZGlvU3luY1N0YXRlIGludCBhdWRpb1N5bmNzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IHNlbGVjdGVkQklTSW5kaWNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdEVuY3J5cHRpb25TdGF0ZSBpbnQgZW5jcnlwdGlvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnJvYWRjYXN0Q29kZSkgewotICAgICAgIG1Tb3VyY2VJZCA9IHNvdXJjZUlkOwotICAgICAgIG1NZXRhRGF0YVN5bmNTdGF0ZSA9ICBtZXRhZGF0YVN5bmNzdGF0ZTsKLSAgICAgICBtQXVkaW9TeW5jU3RhdGUgPSBhdWRpb1N5bmNzdGF0ZTsKLSAgICAgICBtRW5jeXB0aW9uU3RhdHVzID0gZW5jcnlwdGlvblN0YXR1czsKLSAgICAgICBtU291cmNlQWRkcmVzc1R5cGUgPSBhZGRyZXNzVHlwZTsKLSAgICAgICBtU291cmNlRGV2aWNlID0gZGV2aWNlOwotICAgICAgIG1Tb3VyY2VBZHZTaWQgPSBhZHZTaWQ7Ci0gICAgICAgbUJyb2FkY2FzdGVySWQgPSBCUk9BRENBU1RFUl9JRF9JTlZBTElEOwotICAgICAgIGlmIChzZWxlY3RlZEJJU0luZGljaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJzZWxlY3RlZEJJU0luZGljaWVzTGlzdCBpcyBudWxsIik7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNlbGVjdGVkQklTSW5kaWNpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRCSVNJbmRpY2llcy5nZXQoaSkuZ2V0U3RhdHVzKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgSW50ZWdlciBhdWRpb0Jpc0luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgaW50IHN1Ykdyb3VwSWQgPSBzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXRTdWJHcm91cElkKCk7Ci0gICAgICAgICAgICAgICAgIGlmIChtQXVkaW9CaXNJbmRleExpc3QuY29udGFpbnNLZXkoc3ViR3JvdXBJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQmlzSW5kZXggPSBtQXVkaW9CaXNJbmRleExpc3QuZ2V0KHN1Ykdyb3VwSWQpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGF1ZGlvQmlzSW5kZXggPSBhdWRpb0Jpc0luZGV4IHwgKDE8PHNlbGVjdGVkQklTSW5kaWNpZXMuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgICAgICAgICAgICAgICBCQVNTX0RlYnVnKFRBRywgImluZGV4IiArIHNlbGVjdGVkQklTSW5kaWNpZXMuZ2V0KGkpLmdldEluZGV4KCkgKyAiaXMgc2V0Iik7Ci0gICAgICAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAiYXVkaW9CaXNJbmRleCIgKyBhdWRpb0Jpc0luZGV4KTsKLSAgICAgICAgICAgICAgICAgbUF1ZGlvQmlzSW5kZXhMaXN0LnB1dChzdWJHcm91cElkLCBhdWRpb0Jpc0luZGV4KTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLQotICAgICAgIH0KLSAgICAgICAvKmlmIChtZXRhZGF0YSAhPSBudWxsICYmIG1ldGFkYXRhLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBieXRlW21ldGFkYXRhLmxlbmd0aF07Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWV0YWRhdGEsIDAsIG1NZXRhZGF0YSwgMCwgbWV0YWRhdGEubGVuZ3RoKTsKLSAgICAgICB9Ki8KLSAgICAgICBtQnJvYWRjYXN0Q29kZSA9IGJyb2FkY2FzdENvZGU7Ci0gICAgICAgbUJhZEJyb2FkY2FzdENvZGUgPSBudWxsOwotICAgICAgIG1OdW1TdWJHcm91cHMgPSAwOwotICAgIH0KLQotICAgIC8qcGFja2FnZSovIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgc291cmNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgYWR2U2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnJvYWRjYXN0ZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdEFkZHJlc3NUeXBlIGludCBhZGRyZXNzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdE1ldGFkYXRhU3luY1N0YXRlIGludCBtZXRhZGF0YVN5bmNzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdEF1ZGlvU3luY1N0YXRlIGludCBhdWRpb1N5bmNzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJyb2FkY2FzdEFzc2lzdEVuY3J5cHRpb25TdGF0ZSBpbnQgZW5jcnlwdGlvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJyb2FkY2FzdENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiYWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIG51bVN1Ykdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IGJpc0luZGljaWVzTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIGJ5dGVbXT4gbWV0YWRhdGFMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICBtU291cmNlSWQgPSBzb3VyY2VJZDsKLSAgICAgICAgICAgbU1ldGFEYXRhU3luY1N0YXRlID0gIG1ldGFkYXRhU3luY3N0YXRlOwotICAgICAgICAgICBtQXVkaW9TeW5jU3RhdGUgPSBhdWRpb1N5bmNzdGF0ZTsKLSAgICAgICAgICAgbUVuY3lwdGlvblN0YXR1cyA9IGVuY3J5cHRpb25TdGF0dXM7Ci0gICAgICAgICAgIG1Tb3VyY2VBZGRyZXNzVHlwZSA9IGFkZHJlc3NUeXBlOwotICAgICAgICAgICBtU291cmNlRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICBtU291cmNlQWR2U2lkID0gYWR2U2lkOwotICAgICAgICAgICBtQnJvYWRjYXN0ZXJJZCA9IGJyb2FkY2FzdGVySWQ7Ci0gICAgICAgICAgIG1Ccm9hZGNhc3RDb2RlID0gYnJvYWRjYXN0Q29kZTsKLSAgICAgICAgICAgaWYgKGJhZENvZGUgIT0gbnVsbCAmJiBiYWRDb2RlLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICBtQmFkQnJvYWRjYXN0Q29kZT0gbmV3IGJ5dGVbYmFkQ29kZS5sZW5ndGhdOwotICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiYWRDb2RlLCAwLCBtQmFkQnJvYWRjYXN0Q29kZSwgMCwgYmFkQ29kZS5sZW5ndGgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIG1OdW1TdWJHcm91cHMgPSBudW1TdWJHcm91cHM7Ci0gICAgICAgICAgIG1BdWRpb0Jpc0luZGV4TGlzdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+IChiaXNJbmRpY2llc0xpc3QpOwotICAgICAgICAgICBtTWV0YWRhdGFMaXN0ID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPiAobWV0YWRhdGFMaXN0KTsKLSAgICAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQmxlQnJvYWRjYXN0U291cmNlSW5mbykgewotICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBvdGhlciA9IChCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKSBvOwotICAgICAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJvdGhlcj4+ICAiICsgby50b1N0cmluZygpKTsKLSAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAibG9jYWw+PiAgIiArIHRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIChvdGhlci5tU291cmNlSWQgPT0gbVNvdXJjZUlkCi0gICAgICAgICAgICAgICAgICAgICYmIG90aGVyLm1NZXRhRGF0YVN5bmNTdGF0ZSA9PSBtTWV0YURhdGFTeW5jU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgJiYgb3RoZXIubUF1ZGlvU3luY1N0YXRlID09IG1BdWRpb1N5bmNTdGF0ZQotICAgICAgICAgICAgICAgICAgICAmJiBvdGhlci5tU291cmNlQWRkcmVzc1R5cGUgPT0gbVNvdXJjZUFkZHJlc3NUeXBlCi0gICAgICAgICAgICAgICAgICAgICYmIG90aGVyLm1Tb3VyY2VEZXZpY2UgPT0gbVNvdXJjZURldmljZQotICAgICAgICAgICAgICAgICAgICAmJiBvdGhlci5tU291cmNlQWR2U2lkID09IG1Tb3VyY2VBZHZTaWQKLSAgICAgICAgICAgICAgICAgICAgJiYgb3RoZXIubUVuY3lwdGlvblN0YXR1cyA9PSBtRW5jeXB0aW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICYmIG90aGVyLm1Ccm9hZGNhc3RDb2RlID09IG1Ccm9hZGNhc3RDb2RlCi0gICAgICAgICAgICAgICAgICAgICYmIG90aGVyLm1Ccm9hZGNhc3RlcklkID09IG1Ccm9hZGNhc3RlcklkCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlFbnRyeSgpICB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGlmIChtTWV0YURhdGFTeW5jU3RhdGUgPT0gKGludClCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5WQUxJRCAmJgotICAgICAgICAgICAgbUF1ZGlvU3luY1N0YXRlID09IChpbnQpQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX0lOVkFMSUQgJiYKLSAgICAgICAgICAgIG1Tb3VyY2VBZGRyZXNzVHlwZSA9PSAoaW50KUJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX0lOVkFMSUQgJiYKLSAgICAgICAgICAgIG1Tb3VyY2VEZXZpY2UgPT0gbnVsbCAmJgotICAgICAgICAgICAgbVNvdXJjZUFkdlNpZCA9PSAoYnl0ZSkwICYmCi0gICAgICAgICAgICBtRW5jeXB0aW9uU3RhdHVzID09IChpbnQpQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfSU5WQUxJRAotICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJpc0VtcHR5RW50cnkgcmV0dXJuczogIiArIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8pIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHNyY0luZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZURldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VBZHZTaWQgPT0gc3JjSW5mby5nZXRBZHZlcnRpc2luZ1NpZCgpICYmCi0gICAgICAgICAgICAgICAgICAgbVNvdXJjZUFkZHJlc3NUeXBlID09IHNyY0luZm8uZ2V0QWR2QWRkcmVzc1R5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZURldmljZS5lcXVhbHMoc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSkgJiYKLSAgICAgICAgICAgICAgICAgICBtU291cmNlQWR2U2lkID09IHNyY0luZm8uZ2V0QWR2ZXJ0aXNpbmdTaWQoKSAmJgotICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VBZGRyZXNzVHlwZSA9PSBzcmNJbmZvLmdldEFkdkFkZHJlc3NUeXBlKCkgJiYKLSAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0ZXJJZCA9PSBzcmNJbmZvLmdldEJyb2FkY2FzdGVySWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEJBU1NfRGVidWcoVEFHLCAibWF0Y2hlcyByZXR1cm5zOiAiICsgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1Tb3VyY2VJZCwgbU1ldGFEYXRhU3luY1N0YXRlLCBtQXVkaW9TeW5jU3RhdGUsCi0gICAgICAgICAgICAgICAgbVNvdXJjZUFkZHJlc3NUeXBlLCBtU291cmNlRGV2aWNlLCBtU291cmNlQWR2U2lkLAotICAgICAgICAgICAgICAgIG1FbmN5cHRpb25TdGF0dXMsIG1Ccm9hZGNhc3RDb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIntCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIDogbVNvdXJjZUlkIiArIG1Tb3VyY2VJZAotICAgICAgICAgICAgICAgKyAiIHNvdXJjZURldmljZTogIiArIG1Tb3VyY2VEZXZpY2UKLSAgICAgICAgICAgICAgICsgIiBhZGRyZXNzVHlwZTogIiArIG1Tb3VyY2VBZGRyZXNzVHlwZQotICAgICAgICAgICAgICAgKyAiIG1Tb3VyY2VBZHZTaWQ6IiArIG1Tb3VyY2VBZHZTaWQKLSAgICAgICAgICAgICAgICsgIiBtTWV0YURhdGFTeW5jU3RhdGU6IiArIG1NZXRhRGF0YVN5bmNTdGF0ZQotICAgICAgICAgICAgICAgKyAiIG1BdWRpb1N5bmNTdGF0ZSIgKyBtQXVkaW9TeW5jU3RhdGUKLSAgICAgICAgICAgICAgICsgIiBtRW5jeXB0aW9uU3RhdHVzIiArIG1FbmN5cHRpb25TdGF0dXMKLSAgICAgICAgICAgICAgICsgIiBtQmFkQnJvYWRjYXN0Q29kZSIgKyBtQmFkQnJvYWRjYXN0Q29kZQotICAgICAgICAgICAgICAgKyAiIG1OdW1TdWJHcm91cHMiICsgbU51bVN1Ykdyb3VwcwotICAgICAgICAgICAgICAgKyAiIG1Ccm9hZGNhc3RDb2RlIiArIG1Ccm9hZGNhc3RDb2RlCi0gICAgICAgICAgICAgICArICIgbUF1ZGlvQmlzSW5kZXhMaXN0IiArIG1BdWRpb0Jpc0luZGV4TGlzdAotICAgICAgICAgICAgICAgKyAiIG1NZXRhZGF0YUxpc3QiICsgbU1ldGFkYXRhTGlzdAotICAgICAgICAgICAgICAgKyAiIG1Ccm9hZGNhc3RlcklkIiArIG1Ccm9hZGNhc3RlcklkCi0gICAgICAgICAgICAgICArICJ9IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTb3VyY2UgSWQgb2YgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJ5dGUgcmVwcmVzZW50aW5nIHRoZSBTb3VyY2UgSWQgb2YgdGhlIEJyb2FkY2FzdCBTb3VyY2UgSW5mbyBPYmplY3QKLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfSU5WQUxJRF9TT1VSQ0VfSUR9IGluIGNhc2UgaWYgdGhpcyBmaWVsZCBpcyBub3QgdmFsaWQKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBieXRlIGdldFNvdXJjZUlkICgpIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2VJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTb3VyY2UgSWQgb2YgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnl0ZSBzb3VyY2UgSWQgZm9yIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VJZCAoYnl0ZSBzb3VyY2VJZCkgewotICAgICAgICBtU291cmNlSWQgPSBzb3VyY2VJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBCcm9hZGNhc3Qgc291cmNlIGRldmljZSBmb3IgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gQmx1ZXRvb3RoRGV2aWNlIHdoaWNoIG5lZWQgdG8gYmUgc2V0IGFzIEJyb2FkY2FzdCBzb3VyY2UgZGV2aWNlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIHNvdXJjZURldmljZSkgewotICAgICAgICBtU291cmNlRGV2aWNlID0gc291cmNlRGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIEJyb2FkY2FzdCBzb3VyY2UgRGV2aWNlIG9iamVjdCBmcm9tIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBCbHVldG9vdGhEZXZpY2Ugb2JqZWN0IGZvciBCcm9hZGNhc3Qgc291cmNlIGRldmljZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXRTb3VyY2VEZXZpY2UgKCkgewotICAgICAgICByZXR1cm4gbVNvdXJjZURldmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhZGRyZXNzIHR5cGUgb2YgdGhlIEJyb2FkY2FzdCBzb3VyY2UgYWR2ZXJ0aXNlbWVudCBmb3IgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnl0ZSBhZGRyZXNzVHlwZSwgdGhpcyBjYW4gYmUgb25lIG9mIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDfSBPUiB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX1BVQkxJQ30KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXRBZHZBZGRyZXNzVHlwZShpbnQgYWRkcmVzc1R5cGUpIHsKLSAgICAgICAgbVNvdXJjZUFkZHJlc3NUeXBlID0gYWRkcmVzc1R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYWRkcmVzcyB0eXBlIG9mIHRoZSBCcm9hZGNhc3Qgc291cmNlIGFkdmVydGlzZW1lbnQgZm9yIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBieXRlIGFkZHJlc3NUeXBlLCB0aGlzIGNhbiBiZSBvbmUgb2Yge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0FERFJFU1NfVFlQRV9QVUJMSUN9IE9SIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDfQotICAgICAqIEBoaWRlCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgaW50IGdldEFkdkFkZHJlc3NUeXBlICgpIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2VBZGRyZXNzVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhZHZlcnRpc2luZyBTaWQgb2YgdGhlIEJyb2FkY2FzdCBzb3VyY2UgYWR2ZXJ0aXNlbWVudCBmb3IgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnl0ZSBhZHZlcnRpc2luZyBTaWQgdmFsdWUKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFkdmVydGlzaW5nU2lkKGJ5dGUgYWR2U2lkKSB7Ci0gICAgICAgIG1Tb3VyY2VBZHZTaWQgPSBhZHZTaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYWR2ZXJ0aXNpbmcgU2lkIG9mIHRoZSBCcm9hZGNhc3Qgc291cmNlIGFkdmVydGlzZW1lbnQgZm9yIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBieXRlIGFkdmVydGlzaW5nIFNpZCB2YWx1ZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJ5dGUgZ2V0QWR2ZXJ0aXNpbmdTaWQgKCkgewotICAgICAgICByZXR1cm4gbVNvdXJjZUFkdlNpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBCcm9hZGNhc3QgSWQgb2YgdGhlIEJyb2FkY2FzdCBzb3VyY2Ugb2YgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGludCBicm9hZGNhc3Qgc291cmNlIElkZW50aWZpZXIKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QnJvYWRjYXN0ZXJJZCAoKSB7Ci0gICAgICAgIHJldHVybiBtQnJvYWRjYXN0ZXJJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBNZXRhZGF0YSBzeW5jIHN0YXR1cyBhdCB0aGUgQnJvYWRjYXN0IHJlY2VpdmVyIHNpZGUgZm9yIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIEJyb2FkY2FzdEFzc2lzdE1ldGFkYXRhU3luY1N0YXRlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgTWV0YSBkYXRhIHN5bmMgc3RhdHVzLiB0aGlzIGNhbiBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSURMRX0sIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNJTkZPX1JFUX0sCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkN9LAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9TWU5DX0ZBSUx9IE9SICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9TWU5DX05PX1BBU1R9Ci0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8qcGFja2FnZSovIHZvaWQgc2V0TWV0YWRhdGFTeW5jU3RhdGUoQEJyb2FkY2FzdEFzc2lzdE1ldGFkYXRhU3luY1N0YXRlIGludCBtZXRhZGF0YVN5bmNTdGF0ZSkgewotICAgICAgICBtTWV0YURhdGFTeW5jU3RhdGUgPSBtZXRhZGF0YVN5bmNTdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBNZXRhZGF0YSBzeW5jIHN0YXR1cyBhdCB0aGUgQnJvYWRjYXN0IHJlY2VpdmVyIHNpZGUgZnJvbSB0aGUgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBPYmplY3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gQnJvYWRjYXN0QXNzaXN0TWV0YWRhdGFTeW5jU3RhdGUgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiBNZXRhIGRhdGEgc3luYyBzdGF0dXMuIHRoaXMgY2FuIGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JRExFfSwge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfU1lOQ0lORk9fUkVRfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQ30sCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNfRkFJTH0gT1IgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNfTk9fUEFTVH0KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljICBAQnJvYWRjYXN0QXNzaXN0TWV0YWRhdGFTeW5jU3RhdGUgaW50IGdldE1ldGFkYXRhU3luY1N0YXRlICgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhRGF0YVN5bmNTdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBBdWRpbyBzeW5jIHN0YXR1cyBhdCB0aGUgQnJvYWRjYXN0IHJlY2VpdmVyIHNpZGUgZm9yIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIEJyb2FkY2FzdEFzc2lzdEF1ZGlvU3luY1N0YXRlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgTWV0YSBkYXRhIHN5bmMgc3RhdHVzLiB0aGlzIGNhbiBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9OT1RfU1lOQ0hST05JWkVEfSBPUgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfU1lOQ0hST05JWkVEfQotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvKnBhY2thZ2UqLyB2b2lkIHNldEF1ZGlvU3luY1N0YXRlKEBCcm9hZGNhc3RBc3Npc3RBdWRpb1N5bmNTdGF0ZSBpbnQgYXVkaW9TeW5jU3RhdGUpIHsKLSAgICAgICAgbUF1ZGlvU3luY1N0YXRlID0gYXVkaW9TeW5jU3RhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgQXVkaW8gc3luYyBzdGF0dXMgYXQgdGhlIEJyb2FkY2FzdCByZWNlaXZlciBzaWRlIGZyb20gdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJyb2FkY2FzdEFzc2lzdEF1ZGlvU3luY1N0YXRlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgTWV0YSBkYXRhIHN5bmMgc3RhdHVzLiB0aGlzIGNhbiBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX05PVF9TWU5DSFJPTklaRUR9IE9SCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUR9ICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIEBCcm9hZGNhc3RBc3Npc3RBdWRpb1N5bmNTdGF0ZSBpbnQgZ2V0QXVkaW9TeW5jU3RhdGUgKCkgewotICAgICAgICByZXR1cm4gbUF1ZGlvU3luY1N0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEVuY3J5cHRpb24gc3RhdHVzIGF0IHRoZSBCcm9hZGNhc3QgcmVjZWl2ZXIgc2lkZSBmb3IgdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gQnJvYWRjYXN0QXNzaXN0RW5jcnlwdGlvblN0YXRlICByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIE1ldGEgZGF0YSBzeW5jIHN0YXR1cy4gVGhpcyBjYW4gYmUgb25lIG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI0JST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX1VORU5DUllQVEVEfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfUElOX05FRURFRH0sIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfREVDUllQVElOR30KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfQkFEQ09ERX0KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8qcGFja2FnZSovIHZvaWQgc2V0RW5jcnlwdGlvblN0YXR1cyhAQnJvYWRjYXN0QXNzaXN0RW5jcnlwdGlvblN0YXRlIGludCBlbmNyeXB0aW9uU3RhdHVzKSB7Ci0gICAgICAgIG1FbmN5cHRpb25TdGF0dXMgPSBlbmNyeXB0aW9uU3RhdHVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIEF1ZGlvIHN5bmMgc3RhdHVzIGF0IHRoZSBCcm9hZGNhc3QgcmVjZWl2ZXIgc2lkZSBmcm9tIHRoZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIE9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBCcm9hZGNhc3RBc3Npc3RFbmNyeXB0aW9uU3RhdGUgIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgTWV0YSBkYXRhIHN5bmMgc3RhdHVzLiBUaGlzIGNhbiBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfVU5FTkNSWVBURUR9LAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9QSU5fTkVFREVEfSAse0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9ERUNSWVBUSU5HfQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Ige0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9CQURDT0RFfQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIEBCcm9hZGNhc3RBc3Npc3RFbmNyeXB0aW9uU3RhdGUgaW50IGdldEVuY3J5cHRpb25TdGF0dXMgKCkgewotICAgICAgICByZXR1cm4gbUVuY3lwdGlvblN0YXR1czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJbmNvcnJlY3QgQnJvYWRjYXN0IGNvZGUgd2l0aCB3aGljaCBTY2FuIGRlbGVnYXRvciB0cnkKLSAgICAgKiBkZWNyeXB0IHRoZSBCcm9hZGNhc3QgYXVkaW8gYW5kIGZhaWxlZAotICAgICAqCi0gICAgICogVGhpcyBjb2RlIGlzIHZhbGlkIG9ubHkgaWYge0BsaW5rICNnZXRFbmNyeXB0aW9uU3RhdHVzfSByZXR1cm5zCi0gICAgICoge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9CQURDT0RFfQotICAgICAqCi0gICAgICogQHBhcmFtIGJ5dGVbXSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYmFkIGJyb2FkY2FzdCB2YWx1ZQotICAgICAqICAgICAgICAgICAgICAgbnVsbCBpZiB0aGUgY3VycmVudCBFbmNyeXB0ZXRpb24gc3RhdHVzIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICBub3Qge0BsaW5rICNCUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9CQURDT0RFfQotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJhZEJyb2FkY2FzdENvZGUgKCkgewotICAgICAgICByZXR1cm4gbUJhZEJyb2FkY2FzdENvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN1Ymdyb3VwcyBvZiB0aGUgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBPYmplY3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gYnl0ZSBudW1iZXIgb2Ygc3ViZ3JvdXBzCi0gICAgICogQGhpZGUKLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBieXRlIGdldE51bWJlck9mU3ViR3JvdXBzICgpIHsKLSAgICAgICAgcmV0dXJuIG1OdW1TdWJHcm91cHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQXVkaW8gQnJvYWRjYXN0IGNoYW5uZWxzIHRvIHdoaWNoIHJlY2VpdmVyIG5lZWQgdG8gYmUgc3luY2hyb25pemVkIHdpdGgsCi0gICAgICogZm9yIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnQgYXVkaW9CaXMgSW5kZXggdG8gd2hpY2ggcmVjaWV2ZXIgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQgd2l0aAotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLypwYWNrYWdlKi8gdm9pZCBzZXRCcm9hZGNhc3RDaGFubmVsc1N5bmNTdGF0dXMoTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBzZWxlY3RlZEJJU0luZGljaWVzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEJJU0luZGljaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vc2V0IE5vIHByZWZlcmVuY2UKLSAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAic2VsZWN0ZWRCSVNJbmRpY2llc0xpc3QgaXMgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzZWxlY3RlZEJJU0luZGljaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkQklTSW5kaWNpZXMuZ2V0KGkpLmdldFN0YXR1cygpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgSW50ZWdlciBhdWRpb0Jpc0luZGV4ID0gMDsKLSAgICAgICAgICAgICAgaW50IHN1Ykdyb3VwSWQgPSBzZWxlY3RlZEJJU0luZGljaWVzLmdldChpKS5nZXRTdWJHcm91cElkKCk7Ci0gICAgICAgICAgICAgIGlmIChtQXVkaW9CaXNJbmRleExpc3QuY29udGFpbnNLZXkoc3ViR3JvdXBJZCkpIHsKLSAgICAgICAgICAgICAgICAgYXVkaW9CaXNJbmRleCA9IG1BdWRpb0Jpc0luZGV4TGlzdC5nZXQoc3ViR3JvdXBJZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYXVkaW9CaXNJbmRleCA9IGF1ZGlvQmlzSW5kZXggfCAoMTw8c2VsZWN0ZWRCSVNJbmRpY2llcy5nZXQoaSkuZ2V0SW5kZXgoKSk7Ci0gICAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAiaW5kZXgiICsgc2VsZWN0ZWRCSVNJbmRpY2llcy5nZXQoaSkuZ2V0SW5kZXgoKSArICJpcyBzZXQiKTsKLSAgICAgICAgICAgICAgbUF1ZGlvQmlzSW5kZXhMaXN0LnB1dChzdWJHcm91cElkLCBhdWRpb0Jpc0luZGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBCcm9hZGNhc3QgY2hhbm5lbHMgaW5kZXggYW5kIHRoZSBzeW5jIHN0YXR1cyBmcm9tIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICogVGhpcyBtYXBzIHRoZSB2YXJpb3VzIGJyb2FkY2FzdCBzb3VyY2UgaW5kaWNpZXMgYW5kIHN5bmMgc3RhdHVzIG9mIHRoZW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnQgYXVkaW8gQklTIGluZGV4IGZyb20gdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gb2JqZWN0Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBnZXRCcm9hZGNhc3RDaGFubmVsc1N5bmNTdGF0dXMgKCkgewotICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IGJjYXN0SW5kaWNpZXMgPSBuZXcgQXJyYXlMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtTnVtU3ViR3JvdXBzOyBpKyspIHsKLSAgICAgICAgICAgIGludCBiaXNJbmRleFZhbHVlID0gbUF1ZGlvQmlzSW5kZXhMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9MDsKLSAgICAgICAgICAgIHdoaWxlIChiaXNJbmRleFZhbHVlICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoKGJpc0luZGV4VmFsdWUmMHgwMSkgPT0gMHgwMSkgewotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIGJJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsKGluZGV4LCBTdHJpbmcudmFsdWVPZihpbmRleCksIHRydWUsIGksIG1NZXRhZGF0YUxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgYmNhc3RJbmRpY2llcy5hZGQoYkkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiaXNJbmRleFZhbHVlID0gYmlzSW5kZXhWYWx1ZT4+MTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJyZXR1cm5pbmcgQmlzaW5kaWNpZXM6IiArIGJjYXN0SW5kaWNpZXMpOwotICAgICAgICByZXR1cm4gYmNhc3RJbmRpY2llczsKLSAgICB9Ci0KLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRCaXNJbmRleExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9CaXNJbmRleExpc3Q7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gdm9pZCBzZXRCcm9hZGNhc3RDb2RlKFN0cmluZyBicm9hZGNhc3RDb2RlKSB7Ci0gICAgICAgIG1Ccm9hZGNhc3RDb2RlID0gYnJvYWRjYXN0Q29kZTsKLSAgICB9Ci0KLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgc2V0QnJvYWRjYXN0ZXJJZChpbnQgYnJvYWRjYXN0ZXJJZCkgewotICAgICAgICBtQnJvYWRjYXN0ZXJJZCA9IGJyb2FkY2FzdGVySWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYnJvYWRjYXN0Q29kZSB2YWx1ZSBmcm9tIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gU3RyaW5nIGJyb2FkY2FzdCBjb2RlIGZyb20gdGhlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gb2JqZWN0Ci0gICAgICogQGhpZGUKLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnJvYWRjYXN0Q29kZSAoKSB7Ci0gICAgICAgIHJldHVybiBtQnJvYWRjYXN0Q29kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVNYXBUb1BhcmNlbChQYXJjZWwgZGVzdCwgTWFwPEludGVnZXIsIEludGVnZXI+IGJpc0luZGV4TGlzdCkgewotICAgICAgICBkZXN0LndyaXRlSW50KGJpc0luZGV4TGlzdC5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA6IGJpc0luZGV4TGlzdC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBkZXN0LndyaXRlSW50KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRNYXBGcm9tUGFyY2VsKFBhcmNlbCBpbiwgTWFwPEludGVnZXIsIEludGVnZXI+IGJpc0luZGV4TGlzdCkgewotICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgSW50ZWdlciBrZXkgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgYmlzSW5kZXhMaXN0LnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZU1ldGFkYXRhTGlzdFRvUGFyY2VsKFBhcmNlbCBkZXN0LCBNYXA8SW50ZWdlciwgYnl0ZVtdPiBtZXRhZGF0YUxpc3QpIHsKLSAgICAgICAgZGVzdC53cml0ZUludChtZXRhZGF0YUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgYnl0ZVtdPiBlbnRyeSA6IG1ldGFkYXRhTGlzdC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBkZXN0LndyaXRlSW50KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGJ5dGVbXSBtZXRhZGF0YSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobWV0YWRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1ldGFkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZE1ldGFkYXRhTGlzdEZyb21QYXJjZWwoUGFyY2VsIGluLCBNYXA8SW50ZWdlciwgYnl0ZVtdPiBtZXRhZGF0YUxpc3QpIHsKLSAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIEludGVnZXIga2V5ID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgSW50ZWdlciBtZXRhRGF0YUxlbiA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGJ5dGVbXSBtZXRhZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobWV0YURhdGFMZW4gIT0gMCkgewotICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gbmV3IGJ5dGVbbWV0YURhdGFMZW5dOwotICAgICAgICAgICAgICAgIGluLnJlYWRCeXRlQXJyYXkobWV0YWRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YWRhdGFMaXN0LnB1dChrZXksIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIFBhcmNlbGFibGUuQ3JlYXRvcjxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBDUkVBVE9SID0KLSAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKLQotICAgICAgICAgICAgICAgICAgICBCQVNTX0RlYnVnKFRBRywgImNyZWF0ZUZyb21QYXJjZWw+Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGUgc291cmNlSWQgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlQWRkcmVzc1R5cGUgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEJsdWV0b290aERldmljZSBzb3VyY2VEZXZpY2UgPSBpbi5yZWFkVHlwZWRPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5DUkVBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYnl0ZSBzb3VyY2VBZHZTaWQgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYnJvYWRjYXN0SWQgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIEJBU1NfRGVidWcoVEFHLCAiYnJvYWRjYXN0SWQiICsgYnJvYWRjYXN0SWQpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWV0YURhdGFTeW5jU3RhdGUgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhdWRpb1N5bmNTdGF0ZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJhdWRpb1N5bmNTdGF0ZSIgKyBhdWRpb1N5bmNTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBlbmN5cHRpb25TdGF0dXMgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBiYWRCcm9hZGNhc3RMZW4gPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiYWRCcm9hZGNhc3RDb2RlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhZEJyb2FkY2FzdExlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhZEJyb2FkY2FzdENvZGUgPSBuZXcgYnl0ZVtiYWRCcm9hZGNhc3RMZW5dOwotICAgICAgICAgICAgICAgICAgICAgICAgaW4ucmVhZEJ5dGVBcnJheShiYWRCcm9hZGNhc3RDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlIG51bVN1Ykdyb3VwcyA9IGluLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBicm9hZGNhc3RDb2RlID0gaW4ucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlcixJbnRlZ2VyPiBiaXNJbmRleExpc3QgPSBuZXcgSGFzaE1hcCA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVhZE1hcEZyb21QYXJjZWwoaW4sIGJpc0luZGV4TGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLGJ5dGVbXT4gbWV0YWRhdGFMaXN0ID0gbmV3IEhhc2hNYXAgPEludGVnZXIsIGJ5dGVbXT4oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGFkYXRhTGlzdEZyb21QYXJjZWwoaW4sIG1ldGFkYXRhTGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvID0gbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8oc291cmNlRGV2aWNlLCBzb3VyY2VJZCwgc291cmNlQWR2U2lkLCBicm9hZGNhc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VBZGRyZXNzVHlwZSwgbWV0YURhdGFTeW5jU3RhdGUsYXVkaW9TeW5jU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jeXB0aW9uU3RhdHVzLCBicm9hZGNhc3RDb2RlLCBiYWRCcm9hZGNhc3RDb2RlLCBudW1TdWJHcm91cHMsIGJpc0luZGV4TGlzdCwgbWV0YWRhdGFMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgQkFTU19EZWJ1ZyhUQUcsICJjcmVhdGVGcm9tUGFyY2VsOiIgKyBzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNyY0luZm87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9bXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm9bc2l6ZV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7Ci0gICAgICAgIEJBU1NfRGVidWcoVEFHLCAid3JpdGVUb1BhcmNlbD4iKTsKLSAgICAgICAgb3V0LndyaXRlQnl0ZShtU291cmNlSWQpOwotICAgICAgICBvdXQud3JpdGVJbnQobVNvdXJjZUFkZHJlc3NUeXBlKTsKLSAgICAgICAgb3V0LndyaXRlVHlwZWRPYmplY3QobVNvdXJjZURldmljZSwgMCk7Ci0gICAgICAgIG91dC53cml0ZUJ5dGUobVNvdXJjZUFkdlNpZCk7Ci0gICAgICAgIG91dC53cml0ZUludChtQnJvYWRjYXN0ZXJJZCk7Ci0gICAgICAgIG91dC53cml0ZUludChtTWV0YURhdGFTeW5jU3RhdGUpOwotICAgICAgICBvdXQud3JpdGVJbnQobUF1ZGlvU3luY1N0YXRlKTsKLSAgICAgICAgb3V0LndyaXRlSW50KG1FbmN5cHRpb25TdGF0dXMpOwotICAgICAgICBpZiAobUJhZEJyb2FkY2FzdENvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LndyaXRlSW50KG1CYWRCcm9hZGNhc3RDb2RlLmxlbmd0aCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVCeXRlQXJyYXkobUJhZEJyb2FkY2FzdENvZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy93cml0ZSBaRVJPIHRvIHBhcmNlbCB0byBzYXkgbm8gYmFkQnJvYWRjYXN0Y29kZQotICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZUJ5dGUobU51bVN1Ykdyb3Vwcyk7Ci0gICAgICAgIG91dC53cml0ZVN0cmluZyhtQnJvYWRjYXN0Q29kZSk7Ci0gICAgICAgIHdyaXRlTWFwVG9QYXJjZWwob3V0LCBtQXVkaW9CaXNJbmRleExpc3QpOwotICAgICAgICB3cml0ZU1ldGFkYXRhTGlzdFRvUGFyY2VsKG91dCwgbU1ldGFkYXRhTGlzdCk7Ci0gICAgICAgIEJBU1NfRGVidWcoVEFHLCAid3JpdGVUb1BhcmNlbDoiICsgdG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgQkFTU19EZWJ1ZyhTdHJpbmcgVEFHLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChCQVNTX0RCRykgewotICAgICAgICAgICBMb2cuZChUQUcsIG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX07Ci0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQnJvYWRjYXN0LmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEJyb2FkY2FzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA5MDc4Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQnJvYWRjYXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBwdWJsaWMgQVBJcyB0byBjb250cm9sIHRoZSBCbHVldG9vdGggQnJvYWRjYXN0Ci0gKiBwcm9maWxlLgotICoKLSAqIDxwPkJsdWV0b290aEJyb2FkY2FzdCBpcyBhIHByb3h5IG9iamVjdCBmb3IgY29udHJvbGxpbmcgdGhlIEJsdWV0b290aAotICogQnJvYWRjYXN0IFNlcnZpY2UgdmlhIElQQy4gVXNlIHtAbGluayBCbHVldG9vdGhBZGFwdGVyI2dldFByb2ZpbGVQcm94eX0KLSAqIHRvIGdldCB0aGUgQmx1ZXRvb3RoQnJvYWRjYXN0IHByb3h5IG9iamVjdC4KLSAqCi0gKiBAaGlkZQotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhCcm9hZGNhc3QgaW1wbGVtZW50cyBCbHVldG9vdGhQcm9maWxlewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoQnJvYWRjYXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlbnQgdXNlZCB0byBicm9hZGNhc3QgdGhlIGNoYW5nZSBpbiBicm9hZGNhc3Qgc3RhdGUuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGludGVudCB3aWxsIGhhdmUgMyBleHRyYXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4ge0BsaW5rICNFWFRSQV9TVEFURX0gLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvZmlsZS4gPC9saT4KLSAgICAgKiA8bGk+IHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2ZpbGUuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPHA+e0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gY2FuIGJlIGFueSBvZgotICAgICAqIHtAbGluayAjU1RBVEVfRGlzYWJsZWR9LCB7QGxpbmsgI0VuYWJsaW5nfSwKLSAgICAgKiB7QGxpbmsgI1NUQVRFX0VOQUJMRUR9LCB7QGxpbmsgI1NUQVRFX0RJU0FCTElOR30uCi0gICAgICoKLSAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0gcGVybWlzc2lvbiB0bwotICAgICAqIHJlY2VpdmUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9CUk9BRENBU1RfU1RBVEVfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYnJvYWRjYXN0LnByb2ZpbGUuYWN0aW9uLkJST0FEQ0FTVF9TVEFURV9DSEFOR0VEIjsKLQotICAgIC8qKgotICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgY2hhbmdlIGluIGJyb2FkY2FzdCBhdWRpbyBzdGF0ZS4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgaW50ZW50IHdpbGwgaGF2ZSAzIGV4dHJhczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPiB7QGxpbmsgI0VYVFJBX1NUQVRFfSAtIFRoZSBjdXJyZW50IGF1ZGlvIHN0YXRlIC4gPC9saT4KLSAgICAgKiA8bGk+IHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMgYXVkaW8gc3RhdGUuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPHA+e0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gY2FuIGJlIGFueSBvZgotICAgICAqIHtAbGluayAjU1RBVEVfUExBWUlOR30sIHtAbGluayAjU1RBVEVfTk9UX1BMQVlJTkd9LAotICAgICAqCi0gICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHBlcm1pc3Npb24gdG8KLSAgICAgKiByZWNlaXZlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQlJPQURDQVNUX0FVRElPX1NUQVRFX0NIQU5HRUQgPQotICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdC5wcm9maWxlLmFjdGlvbi5CUk9BRENBU1RfQVVESU9fU1RBVEVfQ0hBTkdFRCI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlbnQgdXNlZCB0byBicm9hZGNhc3QgZW5jcnlwdGlvbiBrZXkgZ2VuZXJhdGlvbiBzdGF0dXMuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGludGVudCB3aWxsIGhhdmUgMiBleHRyYXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4ge0BsaW5rICNFWFRSQV9TVEFURX0gLSBUaGUgY3VycmVudCBhdWRpbyBzdGF0ZSAuIDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxwPntAbGluayAjRVhUUkFfU1RBVEV9IGNhbiBiZSBhbnkgb2YKLSAgICAgKiB7QGxpbmsgI1RSVUV9LCB7QGxpbmsgI0ZBTFNFfSwKLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSBwZXJtaXNzaW9uIHRvCi0gICAgICogcmVjZWl2ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0JST0FEQ0FTVF9FTkNSWVBUSU9OX0tFWV9HRU5FUkFURUQgPQotICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdC5wcm9maWxlLmFjdGlvbi5CUk9BRENBU1RfRU5DUllQVElPTl9LRVlfR0VORVJBVEVEIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0FCTEVEID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU5BQkxJTkcgPSAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9FTkFCTEVEID0gMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQUJMSU5HID0gMTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RSRUFNSU5HID0gMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUlORyA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PVF9QTEFZSU5HID0gMTE7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhQcm9maWxlQ29ubmVjdG9yPElCbHVldG9vdGhCcm9hZGNhc3Q+IG1Qcm9maWxlQ29ubmVjdG9yID0KLSAgICAgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlQ29ubmVjdG9yKHRoaXMsIEJsdWV0b290aFByb2ZpbGUuQlJPQURDQVNULCAiQmx1ZXRvb3RoQnJvYWRjYXN0IiwKLSAgICAgICAgICAgICAgICAgICAgSUJsdWV0b290aEJyb2FkY2FzdC5jbGFzcy5nZXROYW1lKCkpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgSUJsdWV0b290aEJyb2FkY2FzdCBnZXRTZXJ2aWNlSW50ZXJmYWNlKElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSUJsdWV0b290aEJyb2FkY2FzdC5TdHViLmFzSW50ZXJmYWNlKEJpbmRlci5hbGxvd0Jsb2NraW5nKHNlcnZpY2UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgfTsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbHVldG9vdGhCcm9hZGNhc3QgcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAotICAgICAqIEJsdWV0b290aCBCcm9hZGNhc3Qgc2VydmljZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8qcGFja2FnZSovIEJsdWV0b290aEJyb2FkY2FzdChDb250ZXh0IGNvbnRleHQsIFNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgbVByb2ZpbGVDb25uZWN0b3IuY29ubmVjdChjb250ZXh0LCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAaGlkZQotICAgICovCi0gICAgLy9AVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIC8qcGFja2FnZSovIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIG1Qcm9maWxlQ29ubmVjdG9yLmRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBoaWRlCi0gICAgKi8KLSAgICBwcml2YXRlIElCbHVldG9vdGhCcm9hZGNhc3QgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxlQ29ubmVjdG9yLmdldFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgLy8gVGhlIGVtcHR5IGZpbmFsaXplIG5lZWRzIHRvIGJlIGtlcHQgb3IgdGhlCi0gICAgICAgIC8vIGN0cyBzaWduYXR1cmUgdGVzdHMgd291bGQgZmFpbC4KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBAaGlkZQotICAgICovCi0gICAgLy9AVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIHB1YmxpYyBib29sZWFuIFNldEJyb2FkY2FzdE1vZGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJFbmFibGVCcm9hZGNhc3QiKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gQWN0aXZpdHlUaHJlYWQuY3VycmVudFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoQnJvYWRjYXN0IHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuU2V0QnJvYWRjYXN0KGVuYWJsZSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBOb3Qgc3VwcG9ydGVkIC0gcGxlYXNlIHVzZSB7QGxpbmsgQmx1ZXRvb3RoTWFuYWdlciNnZXRDb25uZWN0ZWREZXZpY2VzKGludCl9Ci0gICAgICogd2l0aCB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNHQVRUfSBhcyBhcmd1bWVudAotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICJVc2UgQmx1ZXRvb3RoTWFuYWdlciNnZXRDb25uZWN0ZWREZXZpY2VzIGluc3RlYWQuIik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE5vdCBzdXBwb3J0ZWQgLSBwbGVhc2UgdXNlIHtAbGluayBCbHVldG9vdGhNYW5hZ2VyI2dldENvbm5lY3RlZERldmljZXMoaW50KX0KLSAgICAgKiB3aXRoIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0dBVFR9IGFzIGFyZ3VtZW50Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGludFtdIHN0YXRlcykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIlVzZSBCbHVldG9vdGhNYW5hZ2VyI2dldENvbm5lY3RlZERldmljZXMgaW5zdGVhZC4iKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogTm90IHN1cHBvcnRlZCAtIHBsZWFzZSB1c2Uge0BsaW5rIEJsdWV0b290aE1hbmFnZXIjZ2V0Q29ubmVjdGVkRGV2aWNlcyhpbnQpfQotICAgICAqIHdpdGgge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjR0FUVH0gYXMgYXJndW1lbnQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAiVXNlIEJsdWV0b290aE1hbmFnZXIjZ2V0Q29ubmVjdGVkRGV2aWNlcyBpbnN0ZWFkLiIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQGhpZGUKLSAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIFNldEVuY3J5cHRpb24oYm9vbGVhbiBlbmFibGUsIGludCBlbmNfbGVuLyo0Ynl0ZXMsMTZieXRlcyovLCBib29sZWFuIHVzZV9leGlzdGluZykgewotICAgICAgICBpZiAoREJHKSBsb2coIlNldEVuY3J5cHRpb24iKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gQWN0aXZpdHlUaHJlYWQuY3VycmVudFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoQnJvYWRjYXN0IHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuU2V0RW5jcnlwdGlvbihlbmFibGUsIGVuY19sZW4sIHVzZV9leGlzdGluZywgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKgotICAgICAqIEBoaWRlCi0gICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIEdldEVuY3J5cHRpb25LZXkoKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiR2V0QnJvYWRjYXN0RW5jcnlwdGlvbktleSIpOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIElCbHVldG9vdGhCcm9hZGNhc3Qgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5HZXRFbmNyeXB0aW9uS2V5KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogQGhpZGUKLSAgICAqLwotICAgIHB1YmxpYyBpbnQgR2V0QnJvYWRjYXN0U3RhdHVzKCkgewotICAgICAgICBpZiAoREJHKSBsb2coIkdldEJyb2FkY2FzdFN0YXR1cyIpOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIElCbHVldG9vdGhCcm9hZGNhc3Qgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5HZXRCcm9hZGNhc3RTdGF0dXMocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFURV9ESVNBQkxFRDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFURV9ESVNBQkxFRDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvL0BVbnN1cHBvcnRlZEFwcFVzYWdlCi0vLyAgICBwdWJsaWMgQE51bGxhYmxlIEJsdWV0b290aENvZGVjU3RhdHVzIGdldENvZGVjU3RhdHVzKEJsdWV0b290aERldmljZSBkZXZpY2UpIHtyZXR1cm4gbnVsbDt9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICBpZiAobUFkYXB0ZXIuZ2V0U3RhdGUoKSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgTG9nLmQoVEFHLCBtc2cpOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN5bmNIZWxwZXIuamF2YSBiL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3luY0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcyODkxLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3luY0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEdhdHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhTeW5jSGVscGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXIuTGVTY2FuQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVjb3JkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5QZXJpb2RpY0FkdmVydGlzaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5QZXJpb2RpY0FkdmVydGlzaW5nUmVwb3J0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkJsdWV0b290aExlU2Nhbm5lcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgdG8gcGVyZm9ybSBCcm9hZGNhc3QgU2NhbiBBc3Npc3RhbmNlIGNsaWVudCBQcm9maWxlIHJlbGF0ZWQKLSAqIG9wZXJhdGlvbnMuCi0gKiBJdCB1c2VzIEJsdWV0b290aCBHQVRUIEFQSXMgdG8gYWNoaWV2ZSBCcmFvZGNhc3QgU2NhbiBhc3Npc3RhbmNlIGNsaWVudCBvcGVyYXRpb25zLiBBcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlCi0gKiBCQVNTIHByb2ZpbGUgaXMgY29ubmVjdGVkIHdpdGggdGhlIGdpdmVuIHJlbW90ZSBkZXZpY2UgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbnMgdXNpbmcKLSAqIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyfSBpbnRlcmZhY2Ugb3BlcmF0aW9ucwotICoKLSAqIDxwPkJsdWV0b290aFN5bmNIZWxwZXIgaXMgYSBwcm94eSBvYmplY3QgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggU2NhbiBPZmZsb2FkZXIgKEJBU1MgY2xpZW50KQotICogU2VydmljZSB2aWEgSVBDLgotICoKLSAqIDxwPiBVc2Uge0BsaW5rIEJsdWV0b290aEFkYXB0ZXIjZ2V0UHJvZmlsZVByb3h5fSB0byBnZXQKLSAqIHRoZSBCbHVldG9vdGhTY2FuT2ZmbGFvZGVyIHByb3h5IG9iamVjdC4gVXNlCi0gKiB7QGxpbmsgQmx1ZXRvb3RoQWRhcHRlciNjbG9zZVByb2ZpbGVQcm94eX0gdG8gY2xvc2UgdGhlIHNlcnZpY2UgY29ubmVjdGlvbi4KLSAqCi0gKiA8cD4gVXNlIHtAbGluayBCbHVldG9vdGhBZGFwdGVyI2dldFByb2ZpbGVQcm94eX0gdG8gZ2V0Ci0gKiB0aGUgQmx1ZXRvb3RoU3luY0hlbHBlciBwcm94eSBvYmplY3QuIFVzZQotICoge0BsaW5rIEJsdWV0b290aEFkYXB0ZXIjY2xvc2VQcm9maWxlUHJveHl9IHRvIGNsb3NlIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24uCi0gKgotICogPGI+Tm90ZTo8L2I+IE1vc3Qgb2YgdGhlIG1ldGhvZHMgaGVyZSByZXF1aXJlCi0gKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0gcGVybWlzc2lvbi4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoU3luY0hlbHBlciBpbXBsZW1lbnRzIEJsdWV0b290aFByb2ZpbGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhTeW5jSGVscGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUJsdWV0b290aEFkYXB0ZXI7Ci0gICAgLyogbWFwcyBjYWxsYmFjaywgdG8gY2FsbGJhY2sgd3JhcHBlciBhbmQgc3luYyBoYW5kbGUgKi8KLSAgICBwcml2YXRlIE1hcDxCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaywKLSAgICAgICAgICAgICBJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgLyogY2FsbGJhY2tXcmFwcGVyICovPiBtQXBwQ2FsbGJhY2tXcmFwcGVyczsKLQotICAgIHByaXZhdGUgTWFwPEJsdWV0b290aERldmljZSwKLSAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcj4gc0JsZUFzc2lzdE1hbmFnZXJzID0gbnVsbDsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQgPSBudWxsOwotCi0gICAvKioKLSAgICAgKiBJbnRlbnQgdXNlZCB0byBicm9hZGNhc3QgdGhlIGNoYW5nZSBpbiBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBCYXNzIGNsaWVudAotICAgICAqIHByb2ZpbGUuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIGludGVudCB3aWxsIGhhdmUgMyBleHRyYXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4ge0BsaW5rICNFWFRSQV9TVEFURX0gLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvZmlsZS4gPC9saT4KLSAgICAgKiA8bGk+IHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2ZpbGUuPC9saT4KLSAgICAgKiA8bGk+IHtAbGluayBCbHVldG9vdGhEZXZpY2UjRVhUUkFfREVWSUNFfSAtIFRoZSByZW1vdGUgZGV2aWNlLiA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8cD57QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBjYW4gYmUgYW55IG9mCi0gICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RJTkd9LAotICAgICAqIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfS4KLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSBwZXJtaXNzaW9uIHRvCi0gICAgICogcmVjZWl2ZS4KLSAgICAgKi8KLSAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPQotICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmJjLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCI7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZUNvbm5lY3RvcjxJQmx1ZXRvb3RoU3luY0hlbHBlcj4gbVByb2ZpbGVDb25uZWN0b3IgPQotICAgICAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGVDb25uZWN0b3IodGhpcywgQmx1ZXRvb3RoUHJvZmlsZS5CQ19QUk9GSUxFLAotICAgICAgICAgICAgICAgICAgICAiQmx1ZXRvb3RoU3luY0hlbHBlciIsIElCbHVldG9vdGhTeW5jSGVscGVyLmNsYXNzLmdldE5hbWUoKSkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJQmx1ZXRvb3RoU3luY0hlbHBlciBnZXRTZXJ2aWNlSW50ZXJmYWNlKElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSUJsdWV0b290aFN5bmNIZWxwZXIuU3R1Yi5hc0ludGVyZmFjZShCaW5kZXIuYWxsb3dCbG9ja2luZyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKnBhY2thZ2UqLyB2b2lkIGNsb3NlKCkgewotICAgICAgICBtUHJvZmlsZUNvbm5lY3Rvci5kaXNjb25uZWN0KCk7Ci0gICAgICAgIG1BcHBDYWxsYmFja1dyYXBwZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gSUJsdWV0b290aFN5bmNIZWxwZXIgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxlQ29ubmVjdG9yLmdldFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1N1cHBvcnRlZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5iYyIsIHRydWUpOwotICAgICAgICBsb2coIkJsdWV0b290aFN5bmNIZWxwZXI6IGlzU3VwcG9ydGVkIHJldHVybnMgIiArIGlzU3VwcG9ydGVkKTsKLSAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbHVldG9vdGhIZWFkc2V0IHByb3h5IG9iamVjdC4KLSAgICAgKi8KLSAgICAvKnBhY2thZ2UqLyBCbHVldG9vdGhTeW5jSGVscGVyKENvbnRleHQgY29udGV4dCwgU2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1CbHVldG9vdGhBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBtUHJvZmlsZUNvbm5lY3Rvci5jb25uZWN0KGNvbnRleHQsIGxpc3RlbmVyKTsKLSAgICAgICAgQmx1ZXRvb3RoTWFuYWdlciBibHVldG9vdGhNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICBCbHVldG9vdGhNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgbUFwcENhbGxiYWNrV3JhcHBlcnMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLCBJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s+KCk7Ci0gICAgICAgIHNCbGVBc3Npc3RNYW5hZ2VycyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyPigpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHRvIGdldCBCcm9hZGNhc3QgQXVkaW8gU2NhbiBhc3Npc3RhbmNlIGZvciBMRSBBdWRpbyB1c2VjYXNlcy5UaGlzIGlzIGluc3RhbnRpYXRlZCBwZXIgQmx1ZXRvb3RoRGV2aWNlCi0gICAgICogd2hpY2ggaXMgU2NhbiBkZWxlZ2F0b3IKLSAgICAgKiBBcHBsaWNhdGlvbiB3aWxsIGdldCBhbiBJbnN0YW5jZSBvZiB0aGUgIHtAbGluayBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyfSBmb3IgdGhlIGdpdmVuCi0gICAgICogc2NhbiBkZWxlZ2F0b3IgZGV2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gQmx1ZXRvb3RoRGV2aWNlIFNjYW4gRGVsZWdhdG9yIGRldmljZSBmb3Igd2hpY2ggQkxFIEJyb2FkY2FzdCBTQ0FOIEFzc2lzdGFuY2Ugb3BlcmF0aW9ucyB3aWxsCi0gICAgICogYmUgcGVyZm9ybWVkCi0gICAgICogQHBhcmFtIHtAbGluayAjQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2t9IHdoZXJlIGNhbGxiYWNrcyByZWxhdGVkIHRvIEJMRSBCcm9hZGNhc3QgU2NhbgotICAgICAqIGFzc2lzdGFuY2Ugd2lsbCBiZSBkZWxpdmVyZAotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIgZ2V0QmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGlzU3VwcG9ydGVkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkJyb2FkY2FzdCBzY2FuIGFzc2lzdGFuY2Ugbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyIGFzc2lzdE1nciA9IG51bGw7Ci0gICAgICAgIGlmIChzQmxlQXNzaXN0TWFuYWdlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgYXNzaXN0TWdyID0gc0JsZUFzc2lzdE1hbmFnZXJzLmdldChkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhc3Npc3RNZ3IgPT0gbnVsbCkgewotICAgICAgICAgICAgYXNzaXN0TWdyID0gbmV3IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIodGhpcywgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL29iamVjdCBhbHJlYWR5IGV4aXN0cywganVzdCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrIGFuZCByZXRydW4gdGhlIHNhbWUgb2JqZWN0Ci0gICAgICAgICAgICBsb2coImNhbGxpbmcgcmVnaXN0ZXJBcHBDYiBvbmx5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVnaXN0ZXJBcHBDYWxsYmFjayhkZXZpY2UsIGNhbGxiYWNrKTsKLSAgICAgICAgcmV0dXJuIGFzc2lzdE1ncjsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgICogSW5pdGlhdGUgY29ubmVjdGlvbiB0byBhIEJBU1Mgc2VydmVyIHByb2ZpbGUgb2YgdGhlIHJlbW90ZSBibHVldG9vdGggZGV2aWNlLgotICAgICAqCi0gICAgICogPHA+IFRoaXMgQVBJIHJldHVybnMgZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCi0gICAgICogZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIEJsdWV0b290aCBpcyBub3QgdHVybmVkIG9uLgotICAgICAqIFdoZW4gdGhpcyBBUEkgcmV0dXJucyB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQKLSAgICAgKiBjb25uZWN0aW9uIHN0YXRlIGludGVudCBmb3IgdGhlIHByb2ZpbGUgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoCi0gICAgICogdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlCi0gICAgICogZnJvbSB0aGlzIGludGVudC4KLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQotICAgICAqIHBlcm1pc3Npb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCi0gICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbG9nKCJjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoU3luY0hlbHBlciBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5jb25uZWN0KGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgZGlzY29ubmVjdGlvbiBmcm9tIGEgcHJvZmlsZQotICAgICAqCi0gICAgICogPHA+IFRoaXMgQVBJIHdpbGwgcmV0dXJuIGZhbHNlIGluIHNjZW5hcmlvcyBsaWtlIHRoZSBwcm9maWxlIG9uIHRoZQotICAgICAqIEJsdWV0b290aCBkZXZpY2UgaXMgbm90IGluIGNvbm5lY3RlZCBzdGF0ZSBldGMuIFdoZW4gdGhpcyBBUEkgcmV0dXJucywKLSAgICAgKiB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlCi0gICAgICogaW50ZW50IHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aCB0aGUgc3RhdGUuIFVzZXJzIGNhbiBnZXQgdGhlCi0gICAgICogZGlzY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZSBmcm9tIHRoaXMgaW50ZW50LgotICAgICAqCi0gICAgICogPHA+IElmIHRoZSBkaXNjb25uZWN0aW9uIGlzIGluaXRpYXRlZCBieSBhIHJlbW90ZSBkZXZpY2UsIHRoZSBzdGF0ZQotICAgICAqIHdpbGwgdHJhbnNpdGlvbiBmcm9tIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSB0bwotICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfS4gSWYgdGhlIGRpc2Nvbm5lY3QgaXMgaW5pdGlhdGVkIGJ5IHRoZQotICAgICAqIGhvc3QgKGxvY2FsKSBkZXZpY2UgdGhlIHN0YXRlIHdpbGwgdHJhbnNpdGlvbiBmcm9tCi0gICAgICoge0BsaW5rICNTVEFURV9DT05ORUNURUR9IHRvIHN0YXRlIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30gdG8KLSAgICAgKiBzdGF0ZSB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0uIFRoZSB0cmFuc2l0aW9uIHRvCi0gICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZQotICAgICAqIHR3byBzY2VuYXJpb3MuCi0gICAgICoKLSAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KLSAgICAgKiBwZXJtaXNzaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQotICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE5vbk51bGwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKSB7Ci0gICAgICAgIGxvZygiZ2V0Q29ubmVjdGVkRGV2aWNlcygpIik7Ci0gICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q29ubmVjdGVkRGV2aWNlcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE5vbk51bGwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoCi0gICAgQE5vbk51bGwgaW50W10gc3RhdGVzKSB7Ci0gICAgICAgIGxvZygiZ2V0RGV2aWNlc01hdGNoaW5nU3RhdGVzKCkiKTsKLSAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKHN0YXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBAQmx1ZXRvb3RoUHJvZmlsZS5CdFByb2ZpbGVTdGF0ZSBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKAotICAgIEBOb25OdWxsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbG9nKCJnZXRTdGF0ZSgiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29ubmVjdGlvbiBwb2xpY3kgb2YgdGhlIHByb2ZpbGUuCi0gICAgICoKLSAgICAgKiA8cD4gVGhlIGNvbm5lY3Rpb24gcG9saWN5IGNhbiBiZSBhbnkgb2Y6Ci0gICAgICoge0BsaW5rICNDT05ORUNUSU9OX1BPTElDWV9BTExPV0VEfSwge0BsaW5rICNDT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU59LAotICAgICAqIHtAbGluayAjQ09OTkVDVElPTl9QT0xJQ1lfVU5LTk9XTn0KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgQmx1ZXRvb3RoIGRldmljZQotICAgICAqIEByZXR1cm4gY29ubmVjdGlvbiBwb2xpY3kgb2YgdGhlIGRldmljZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy9AU3lzdGVtQXBpCi0gICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USCkKLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koQE5vbk51bGwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBsb2coImdldENvbm5lY3Rpb25Qb2xpY3koIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU47Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgY29ubmVjdGlvbiBwb2xpY3kgb2YgdGhlIHByb2ZpbGUKLSAgICAgKgotICAgICAqIDxwPiBUaGUgZGV2aWNlIHNob3VsZCBhbHJlYWR5IGJlIHBhaXJlZC4KLSAgICAgKiBDb25uZWN0aW9uIHBvbGljeSBjYW4gYmUgb25lIG9mIHtAbGluayAjQ09OTkVDVElPTl9QT0xJQ1lfQUxMT1dFRH0sCi0gICAgICoge0BsaW5rICNDT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU59LCB7QGxpbmsgI0NPTk5FQ1RJT05fUE9MSUNZX1VOS05PV059Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBibHVldG9vdGggZGV2aWNlCi0gICAgICogQHBhcmFtIGNvbm5lY3Rpb25Qb2xpY3kgaXMgdGhlIGNvbm5lY3Rpb24gcG9saWN5IHRvIHNldCB0byBmb3IgdGhpcyBwcm9maWxlCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNvbm5lY3Rpb25Qb2xpY3kgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy9AU3lzdGVtQXBpCi0gICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTikKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KEBOb25OdWxsIEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBpbnQgY29ubmVjdGlvblBvbGljeSkgewotICAgICAgICBpZiAoREJHKSBsb2coInNldENvbm5lY3Rpb25Qb2xpY3koIiArIGRldmljZSArICIsICIgKyBjb25uZWN0aW9uUG9saWN5ICsgIikiKTsKLSAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25Qb2xpY3kgIT0gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU4KLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbm5lY3Rpb25Qb2xpY3kgIT0gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9BTExPV0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc2V0Q29ubmVjdGlvblBvbGljeShkZXZpY2UsIGNvbm5lY3Rpb25Qb2xpY3kpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIHdyYXAoQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgIHJldHVybiBuZXcgSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLlN0dWIoKSB7Ci0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0U291cmNlRm91bmQoU2NhblJlc3VsdCBzY2FucmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJjYWxsaW5nIG9uQmxlQnJvYWRjYXN0U291cmNlRm91bmQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2FucmVzOiIgKyBzY2FucmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5yZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VTZWxlY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYnJvYWRjYXN0U291cmNlQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImNhbGxpbmcgb25CbGVCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1czoiICsgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uQmxlQnJvYWRjYXN0U291cmNlU2VsZWN0ZWQoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYnJvYWRjYXN0U291cmNlQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VBZGRlZChCbHVldG9vdGhEZXZpY2UgcmN2ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiY2FsbGluZyBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWQgZm9yICIgKyByY3ZyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmNJZDoiICsgc3JjSWQgKyAic3RhdHVzOiIgKyBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWQocmN2ciwgc3JjSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlVXBkYXRlZChCbHVldG9vdGhEZXZpY2UgcmN2ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgc3JjSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJjYWxsaW5nIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VVcGRhdGVkIGZvciAiICsgcmN2ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjSWQ6IiArIHNyY0lkICsgInN0YXR1czoiICsgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZVVwZGF0ZWQocmN2ciwgc3JjSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiY2FsbGluZyBvbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQgZm9yICIgKyByY3ZyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmNJZDoiICsgc3JjSWQgKyAic3RhdHVzOiIgKyBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQocmN2ciwgc3JjSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwIGNhbiBzdGlsbCB1bnJlZ2lzdGVyIHRoZSBzeW5jIHVudGlsIG5vdGlmaWVkIGl0J3MgbG9zdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGNhbGxiYWNrIGFmdGVyIGFwcCB3YXMgbm90aWZlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tQ2FsbGJhY2tXcmFwcGVycy5yZW1vdmUoY2FsbGJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZVJlbW92ZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiY2FsbGluZyBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlUmVtb3ZlZCBmb3IgIiArIHJjdnIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyY0lkOiIgKyBzcmNJZCArICJzdGF0dXM6IiArIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VSZW1vdmVkKHJjdnIsIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH07Ci0gICAgICAgICB9Ci0KLQotICAgICBib29sZWFuIHN0YXJ0U2Nhbk9mZmxvYWQgKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgIGxvZygic3RhcnRTY2FuT2ZmbG9hZCgiICsgZGV2aWNlICsgIiwgaXNHcm91cE9wOiAiICsgaXNHcm91cE9wICsgIikiKTsKLSAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc3RhcnRTY2FuT2ZmbG9hZChkZXZpY2UsIGlzR3JvdXBPcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgIH0KLQotICAgICBib29sZWFuIHN0b3BTY2FuT2ZmbG9hZCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgbG9nKCJzdG9wU2Nhbk9mZmxvYWQoIiArIGRldmljZSArICIsIGlzR3JvdXBPcDogIiArIGlzR3JvdXBPcCArICIpIiApOwotICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoU3luY0hlbHBlciBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICAgICAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5zdG9wU2Nhbk9mZmxvYWQoZGV2aWNlLCBpc0dyb3VwT3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgICAgYm9vbGVhbiBzZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICBsb2coInNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoU3luY0hlbHBlciBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhkZXZpY2UpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQURNSU4pCi0gICAgIGJvb2xlYW4gc3RvcFNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgbG9nKCJzdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycygiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5zdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhkZXZpY2UpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIGJvb2xlYW4gc2VsZWN0QnJvYWRjYXN0U291cmNlIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBTY2FuUmVzdWx0IHNjYW5SZXMsIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgIGxvZygic2VsZWN0QnJvYWRjYXN0U291cmNlKCIgKyBkZXZpY2UgKyAiOiBncm91cG9wIiArIGlzR3JvdXBPcCArIikiKTsKLSAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0QnJvYWRjYXN0U291cmNlKGRldmljZSwgc2NhblJlcywgaXNHcm91cE9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgIHZvaWQgcmVnaXN0ZXJBcHBDYWxsYmFjayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayBhcHBDYWxsYmFjaykgewotICAgICAgICAgIGxvZygicmVnaXN0ZXJBcHBDYWxsYmFjayBkZXZpY2UgOiIgKyBkZXZpY2UgKyAiYXBwQ0I6ICIgKyBhcHBDYWxsYmFjayk7Ci0gICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSk7Ci0KLSAgICAgICAgICBJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgd3JhcHBlZCA9IHdyYXAoYXBwQ2FsbGJhY2ssIGhhbmRsZXIpOwotICAgICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICBzZXJ2aWNlLnJlZ2lzdGVyQXBwQ2FsbGJhY2soZGV2aWNlLCB3cmFwcGVkKTsKLSAgICAgICAgICAgICAgIGlmIChtQXBwQ2FsbGJhY2tXcmFwcGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgbUFwcENhbGxiYWNrV3JhcHBlcnMucHV0KGFwcENhbGxiYWNrLCB3cmFwcGVkKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIHZvaWQgdW5yZWdpc3RlckFwcENhbGxiYWNrKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGFwcENhbGxiYWNrKSB7Ci0gICAgICAgICBsb2coInVucmVnaXN0ZXJBcHBDYWxsYmFjazogZGV2aWNlIiArIGRldmljZSArICJhcHBDQjoiICsgYXBwQ2FsbGJhY2spOwotICAgICAgICAgLy8gUmVtb3ZlIGNhbGxiYWNrIGFmdGVyIGFwcCB3YXMgbm90aWZlZC4KLQotICAgICAgICAgZmluYWwgSUJsdWV0b290aFN5bmNIZWxwZXIgc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgIElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayBjYiA9IG1BcHBDYWxsYmFja1dyYXBwZXJzLmdldChkZXZpY2UpOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS51bnJlZ2lzdGVyQXBwQ2FsbGJhY2soZGV2aWNlLCBjYik7Ci0gICAgICAgICAgICAgICAgbUFwcENhbGxiYWNrV3JhcHBlcnMucmVtb3ZlKGFwcENhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICB9Ci0KLQotICAgIGJvb2xlYW4gYWRkQnJvYWRjYXN0U291cmNlIChCbHVldG9vdGhEZXZpY2Ugc2lua0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgIGxvZygiYWRkQnJvYWRjYXN0U291cmNlICBmb3IgOiIgKyBzaW5rRGV2aWNlCi0gICAgICAgICAgICArICJTb3VyY2VJbmZvOiAiICsgc3JjSW5mbysgImlzR3JvdXBPcDogIiArIGlzR3JvdXBPcCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2Uoc2lua0RldmljZSkpIHsKLQotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmFkZEJyb2FkY2FzdFNvdXJjZShzaW5rRGV2aWNlLCBzcmNJbmZvLCBpc0dyb3VwT3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgYm9vbGVhbiB1cGRhdGVCcm9hZGNhc3RTb3VyY2UgKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgICAgIC8vU2FtZSBkZXZpY2UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBTb3VyY2VJZAotICAgICAgICAgICAgbG9nKCJ1cGRhdGVCcm9hZGNhc3RTb3VyY2UgZm9yIDoiICsgZGV2aWNlICsKLSAgICAgICAgICAgICAgICAiU291cmNlSW5mbzogIiArIHNyY0luZm8rICJpc0dyb3VwT3A6ICIgKyBpc0dyb3VwT3ApOwotICAgICAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS51cGRhdGVCcm9hZGNhc3RTb3VyY2UoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbmZvLCBpc0dyb3VwT3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgICBib29sZWFuIHNldEJyb2FkY2FzdENvZGUgKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgICAgIC8vU2FtZSBkZXZpY2UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBTb3VyY2VJZAotICAgICAgICAgICAgbG9nKCJzZXRCcm9hZGNhc3RDb2RlIGZvciA6IiArIGRldmljZSk7Ci0gICAgICAgICAgICBsb2coIlNvdXJjZUluZm86ICIgKyBzcmNJbmZvKyAiaXNHcm91cE9wOiAiICsgaXNHcm91cE9wKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoU3luY0hlbHBlciBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLnNldEJyb2FkY2FzdENvZGUoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luZm8sIGlzR3JvdXBPcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGJvb2xlYW4gcmVtb3ZlQnJvYWRjYXN0U291cmNlIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNvdXJjZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXBPcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgIGxvZygicmVtb3ZlQnJvYWRjYXN0U291cmNlIGZvciA6IiArIGRldmljZSArCi0gICAgICAgICAgICAgICAgIlNvdXJjZUlkOiAiICsgc291cmNlSWQgKyAiaXNHcm91cE9wOiAiICsgaXNHcm91cE9wKTsKLSAgICAgICAgICAgIGZpbmFsIElCbHVldG9vdGhTeW5jSGVscGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUJyb2FkY2FzdFNvdXJjZShkZXZpY2UsIHNvdXJjZUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpc0dyb3VwT3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24gKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbG9nKCJHZXRBbGxCcm9hZGNhc3RSZWNlaXZlclN0YXRlcyBmb3IgOiIgKyBkZXZpY2UpOwotICAgICAgICBmaW5hbCBJQmx1ZXRvb3RoU3luY0hlbHBlciBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChtQmx1ZXRvb3RoQWRhcHRlci5nZXRTdGF0ZSgpID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04pIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoQmx1ZXRvb3RoQWRhcHRlci5jaGVja0JsdWV0b290aEFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSkpIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJBU1NfRGVidWcoVEFHLCBtc2cpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzTGliL0FuZHJvaWQuYnAgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0ZmRhZC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogImZyYW1ld29yay1zZXR0aW5nc2xpYi1hZHZhLXNyY3MiLAotICAgIHNyY3M6IFsic3JjLyoqLyouamF2YSJdLAotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9ibHVldG9vdGgvQkNQcm9maWxlLmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2JsdWV0b290aC9CQ1Byb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3MTg2ZS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2JsdWV0b290aC9CQ1Byb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoU3luY0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RTb3VyY2VJbmZvOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuUjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotCi1pbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5LZWVwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLUBLZWVwCi1wdWJsaWMgY2xhc3MgQkNQcm9maWxlIGltcGxlbWVudHMgTG9jYWxCbHVldG9vdGhQcm9maWxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJDUHJvZmlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBWID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoU3luY0hlbHBlciBtU2VydmljZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUHJvZmlsZVJlYWR5OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDYWNoZWRCbHVldG9vdGhEZXZpY2VNYW5hZ2VyIG1EZXZpY2VNYW5hZ2VyOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkJDUHJvZmlsZSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2NhbEJsdWV0b290aFByb2ZpbGVNYW5hZ2VyIG1Qcm9maWxlTWFuYWdlcjsKLQotICAgIC8vIE9yZGVyIG9mIHRoaXMgcHJvZmlsZSBpbiBkZXZpY2UgcHJvZmlsZXMgbGlzdAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPUkRJTkFMID0gMTsKLQotICAgIC8vIFRoZXNlIGNhbGxiYWNrcyBydW4gb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQmFzc2NsaWVudFNlcnZpY2VMaXN0ZW5lcgotICAgICAgICAgICAgaW1wbGVtZW50cyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJCYXNzY2xpZW50U2VydmljZSBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgIG1TZXJ2aWNlID0gKEJsdWV0b290aFN5bmNIZWxwZXIpIHByb3h5OwotICAgICAgICAgICAgLy8gV2UganVzdCBib3VuZCB0byB0aGUgc2VydmljZSwgc28gcmVmcmVzaCB0aGUgVUkgZm9yIGFueSBjb25uZWN0ZWQgQmFzc2NsaWVudCBkZXZpY2VzLgotICAgICAgICAgICAgLy9MaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlTGlzdCA9IG1TZXJ2aWNlLmdldENvbm5lY3RlZERldmljZXMoKTsKLSAgICAgICAgICAgIG1Jc1Byb2ZpbGVSZWFkeT10cnVlOy8vQmFzc1NlcnZpY2UgY29ubmVjdGVkCi0gICAgICAgICAgICBtUHJvZmlsZU1hbmFnZXIuY2FsbFNlcnZpY2VDb25uZWN0ZWRMaXN0ZW5lcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQmFzc2NsaWVudFNlcnZpY2UgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICBtSXNQcm9maWxlUmVhZHk9ZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2ZpbGVSZWFkeSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc1Byb2ZpbGVSZWFkeTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFByb2ZpbGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuQkNfUFJPRklMRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRFbmFibGVkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJCQ1Byb2ZpbGU6ICIgKyBkZXZpY2UgKyAiOiIgKyBlbmFibGVkKTsKLSAgICAgICAgICAgIGlmIChtU2VydmljZS5nZXRDb25uZWN0aW9uUG9saWN5KGRldmljZSkgPCBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUQpIHsKLSAgICAgICAgICAgICAgICBpc0VuYWJsZWQgPSBtU2VydmljZS5zZXRDb25uZWN0aW9uUG9saWN5KGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9BTExPV0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzRW5hYmxlZCA9IG1TZXJ2aWNlLnNldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0ZPUkJJRERFTik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNFbmFibGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKSA+IEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfRk9SQklEREVOOwotCi0gICAgfQotCi0gICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9BTExPV0VEOwotICAgIH0KLQotICAgIEJDUHJvZmlsZShDb250ZXh0IGNvbnRleHQsIENhY2hlZEJsdWV0b290aERldmljZU1hbmFnZXIgZGV2aWNlTWFuYWdlciwKLSAgICAgICAgICAgIExvY2FsQmx1ZXRvb3RoUHJvZmlsZU1hbmFnZXIgcHJvZmlsZU1hbmFnZXIpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtRGV2aWNlTWFuYWdlciA9IGRldmljZU1hbmFnZXI7Ci0gICAgICAgIG1Qcm9maWxlTWFuYWdlciA9IHByb2ZpbGVNYW5hZ2VyOwotICAgICAgICBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuZ2V0UHJvZmlsZVByb3h5KGNvbnRleHQsCi0gICAgICAgICAgICAgICAgbmV3IEJhc3NjbGllbnRTZXJ2aWNlTGlzdGVuZXIoKSwgQmx1ZXRvb3RoUHJvZmlsZS5CQ19QUk9GSUxFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2Nlc3NQcm9maWxlRW5hYmxlZCgpIHsKLSAgICAgICAgLy9yZXR1cm4gdHJ1ZSBmb3IgQkFTUyBhbHdheXMgc28gdGhhdAotICAgICAgICAvL0l0IHNob3dzIHRoZSBwcm9maWxlIHByZWZlcmVuY2UgaW4gZGV2aWNlIGRldGFpbHMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdXRvQ29ubmVjdGFibGUoKSB7Ci0gICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIExvZy5kKFRBRywgImlzQXV0b0Nvbm5lY3RhYmxlIHJldHVybiBmYWxzZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IFNjYW4gZGVsZWdhdG9yIGRldmljZXMgbWF0Y2hpbmcgY29ubmVjdGlvbiBzdGF0ZXN7Ci0gICAgICogQGNvZGUgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsCi0gICAgICogQGNvZGUgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HLAotICAgICAqIEBjb2RlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElOR30KLSAgICAgKgotICAgICAqIEByZXR1cm4gTWF0Y2hpbmcgZGV2aWNlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXREZXZpY2VzQnlTdGF0ZXMobmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IFNjYW4gZGVsZWdhdG9yICBkZXZpY2VzIG1hdGNoaW5nIGNvbm5lY3Rpb24gc3RhdGVzewotICAgICAqIEBjb2RlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVELAotICAgICAqIEBjb2RlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVELAotICAgICAqIEBjb2RlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORywKLSAgICAgKiBAY29kZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkd9Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIE1hdGNoaW5nIGRldmljZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0YWJsZURldmljZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXREZXZpY2VzQnlTdGF0ZXMobmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc0J5U3RhdGVzKGludFtdIHN0YXRlcykgewotICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhzdGF0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJCQ1Byb2ZpbGUgQ29ubmVjdCB0byAgZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3QoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiQkNQcm9maWxlIGRpc29ubmVjdCB0byAgZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy8gRG93bmdyYWRlIHByaW9yaXR5IGFzIHVzZXIgaXMgZGlzY29ubmVjdGluZyB0aGUgQmFzc2NsaWVudC4KLSAgICAgICAgaWYgKG1TZXJ2aWNlLmdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKSA+IEJsdWV0b290aFByb2ZpbGUuUFJJT1JJVFlfT04pewotICAgICAgICAgICAgbVNlcnZpY2Uuc2V0Q29ubmVjdGlvblBvbGljeShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuUFJJT1JJVFlfT04pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0KGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdHVzKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQcmVmZXJyZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfVU5LTk9XTjsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBwcmVmZXJyZWQpIHsKLSAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIHJldHVybjsKLSAgICAgICAgaWYgKHByZWZlcnJlZCkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlLmdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKSAhPQotICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUQpIHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRDb25uZWN0aW9uUG9saWN5KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9BTExPV0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLnNldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX1VOS05PV04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRPcmRpbmFsKCkgewotICAgICAgICByZXR1cm4gT1JESU5BTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVSZXNvdXJjZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBSLnN0cmluZy5ibHVldG9vdGhfcHJvZmlsZV9iYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlciBnZXRCU0FNYW5hZ2VyKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJnZXRCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyOiBzZXJ2aWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VydmljZS5nZXRCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyKGRldmljZSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3VtbWFyeVJlc291cmNlRm9yRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXR1cyhkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBSLnN0cmluZy5ibHVldG9vdGhfYmNfcHJvZmlsZV9zdW1tYXJ5X3VzZV9mb3I7Ci0KLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFIuc3RyaW5nLmJsdWV0b290aF9iY19wcm9maWxlX3N1bW1hcnlfY29ubmVjdGVkOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhVdGlscy5nZXRDb25uZWN0aW9uU3RhdGVTdW1tYXJ5KHN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RHJhd2FibGVSZXNvdXJjZShCbHVldG9vdGhDbGFzcyBidENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX2J0X2hlYXJpbmdfYWlkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBMb2cuZChUQUcsICJmaW5hbGl6ZSgpIik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKS5jbG9zZVByb2ZpbGVQcm94eShCbHVldG9vdGhQcm9maWxlLkJDX1BST0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZSA9IG51bGw7Ci0gICAgICAgICAgICB9Y2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRXJyb3IgY2xlYW5pbmcgdXAgQkFzcyBjbGllbnQgcHJveHkiLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzQkNTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCQ1N1cHBvcnRlZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5iYyIsIHRydWUpOwotICAgICAgICBMb2cuZChUQUcsICJCYXNzQ2xpZW50UHJvZmlsZTogaXNCQ1N1cHBvcnRlZCByZXR1cm5zICIgKyBpc0JDU3VwcG9ydGVkKTsKLSAgICAgICAgcmV0dXJuIGlzQkNTdXBwb3J0ZWQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzQkFTZWVrZXIoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgIC8vYWx3YXlzIHNlbmQgdHJ1ZQotICAgICAgIGJvb2xlYW4gaXNTZWVrZXIgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQuYmFzZWVrZXIiLCBmYWxzZSk7Ci0gICAgICAgUGFyY2VsVXVpZFtdIHV1aWRzID0gbnVsbDsKLSAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICB1dWlkcyA9IGRldmljZS5nZXRVdWlkcygpOwotICAgICAgIH0KLSAgICAgICBQYXJjZWxVdWlkIHNkID0gUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTg0Ri0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLSAgICAgICBpZiAoaXNCQ1N1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgIGlmICh1dWlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICBmb3IgKFBhcmNlbFV1aWQgdWlkIDogdXVpZHMpIHsKLSAgICAgICAgICAgICAgICAgIGlmICh1aWQuZXF1YWxzKHNkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU0QgdXVpZCBwcmVzZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgaXNTZWVrZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIExvZy5kKFRBRywiaXNCQVNlZWtlciByZXR1cm5zOiIgKyBpc1NlZWtlcik7Ci0gICAgICAgcmV0dXJuIGlzU2Vla2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9ibHVldG9vdGgvQnJvYWRjYXN0UHJvZmlsZS5qYXZhIGIvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9ibHVldG9vdGgvQnJvYWRjYXN0UHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWQ5YzAxLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL2ZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvYmx1ZXRvb3RoL0Jyb2FkY2FzdFByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQnJvYWRjYXN0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU47Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfQUxMT1dFRDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5SOwotaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uS2VlcDsKLQotLyoqCi0gKiBCcm9hZGNhc3RQcm9maWxlIGhhbmRsZXMgQmx1ZXRvb3RoIEJyb2FkY2FzdCBwcm9maWxlLgotICovCi1AS2VlcAotcHVibGljIGZpbmFsIGNsYXNzIEJyb2FkY2FzdFByb2ZpbGUgaW1wbGVtZW50cyBMb2NhbEJsdWV0b290aFByb2ZpbGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvYWRjYXN0UHJvZmlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBWID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoQnJvYWRjYXN0IG1TZXJ2aWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQcm9maWxlUmVhZHkgPSBmYWxzZTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJCcm9hZGNhc3QiOwotCi0gICAgLy8gT3JkZXIgb2YgdGhpcyBwcm9maWxlIGluIGRldmljZSBwcm9maWxlcyBsaXN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9SRElOQUwgPSAwOwotCi0gICAgLy8gVGhlc2UgY2FsbGJhY2tzIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBCcm9hZGNhc3RMaXN0ZW5lcgotICAgICAgICAgICAgaW1wbGVtZW50cyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLkJST0FEQ0FTVCkgewotICAgICAgICAgICAgICBpZiAoVikgTG9nLmQoVEFHLCJCbHVldG9vdGggQnJvYWRjYXN0IHNlcnZpY2UgY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgIG1TZXJ2aWNlID0gKEJsdWV0b290aEJyb2FkY2FzdCkgcHJveHk7Ci0gICAgICAgICAgICAgIG1Jc1Byb2ZpbGVSZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKLSAgICAgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuQlJPQURDQVNUKSB7Ci0gICAgICAgICAgICAgIGlmIChWKSBMb2cuZChUQUcsIkJsdWV0b290aCBCcm9hZGNhc3Qgc2VydmljZSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgbUlzUHJvZmlsZVJlYWR5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2ZpbGVSZWFkeSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCJpc1Byb2ZpbGVSZWFkeSA9ICIgKyBtSXNQcm9maWxlUmVhZHkpOwotICAgICAgICByZXR1cm4gbUlzUHJvZmlsZVJlYWR5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZmlsZUlkKCkgewotICAgICAgICBMb2cuZChUQUcsImdldFByb2ZpbGVJZCIpOwotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5CUk9BRENBU1Q7Ci0gICAgfQotCi0gICAgQnJvYWRjYXN0UHJvZmlsZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCJCcm9hZGNhc3RQcm9maWxlIGNvbnN0cnVjdG9yIik7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKS5nZXRQcm9maWxlUHJveHkoY29udGV4dCwKLSAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0TGlzdGVuZXIoKSwgQmx1ZXRvb3RoUHJvZmlsZS5CUk9BRENBU1QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2Vzc1Byb2ZpbGVFbmFibGVkKCkgewotICAgICAgICBMb2cuZChUQUcsImFjY2Vzc1Byb2ZpbGVFbmFibGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9Db25uZWN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0dXMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblBvbGljeShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBDT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU47ICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRFbmFibGVkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ly9DT05ORUNUSU9OX1BPTElDWV9BTExPV0VEOwotICAgIH0KLSAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZmVycmVkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gcHJlZmVycmVkKSB7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0UHJlZmVycmVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuUFJJT1JJVFlfT0ZGOwotICAgIH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcnJlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRPcmRpbmFsKCkgewotICAgICAgICByZXR1cm4gT1JESU5BTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVSZXNvdXJjZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBSLnN0cmluZy5ibHVldG9vdGhfcHJvZmlsZV9icm9hZGNhc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdW1tYXJ5UmVzb3VyY2VGb3JEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERyYXdhYmxlUmVzb3VyY2UoQmx1ZXRvb3RoQ2xhc3MgYnRDbGFzcykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRFbmNyeXB0aW9uKGJvb2xlYW4gZW5hYmxlLCBpbnQgZW5jX2xlbiwgYm9vbGVhbiB1c2VfZXhpc3RpbmcpIHsKLSAgICAgIExvZy5kKFRBRywic2V0RW5jcnlwdGlvbiIpOwotICAgICAgcmV0dXJuIG1TZXJ2aWNlLlNldEVuY3J5cHRpb24oZW5hYmxlLCBlbmNfbGVuLCB1c2VfZXhpc3RpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0RW5jcnlwdGlvbktleSgpIHsKLSAgICAgIExvZy5kKFRBRywiZ2V0RW5jcnlwdGlvbktleSIpOwotICAgICAgcmV0dXJuIG1TZXJ2aWNlLkdldEVuY3J5cHRpb25LZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEJyb2FkY2FzdFN0YXR1cygpIHsKLSAgICAgIExvZy5kKFRBRywiZ2V0QnJvYWRjYXN0U3RhdHVzIik7Ci0gICAgICByZXR1cm4gbVNlcnZpY2UuR2V0QnJvYWRjYXN0U3RhdHVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QnJvYWRjYXN0TW9kZShib29sZWFuIGVuYWJsZSkgewotICAgICAgTG9nLmQoVEFHLCJzZXRCcm9hZGNhc3RNb2RlIik7Ci0gICAgICByZXR1cm4gbVNlcnZpY2UuU2V0QnJvYWRjYXN0TW9kZShlbmFibGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBpZiAoVikgTG9nLmQoVEFHLCAiZmluYWxpemUoKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuY2xvc2VQcm9maWxlUHJveHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbHVldG9vdGhQcm9maWxlLkJST0FEQ0FTVCwgbVNlcnZpY2UpOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRXJyb3IgY2xlYW5pbmcgdXAgQnJvYWRjYXN0IHByb3h5IiwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2JsdWV0b290aC9Ccm9hZGNhc3RTb3VyY2VJbmZvSGFuZGxlci5qYXZhIGIvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9ibHVldG9vdGgvQnJvYWRjYXN0U291cmNlSW5mb0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0NjIzZS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2JsdWV0b290aC9Ccm9hZGNhc3RTb3VyY2VJbmZvSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgQnJvYWRjYXN0U291cmNlSW5mb0hhbmRsZXIgaW1wbGVtZW50cyBCbHVldG9vdGhFdmVudE1hbmFnZXIuSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQnJvYWRjYXN0U291cmNlSW5mb0hhbmRsZXIiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFYgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDYWNoZWRCbHVldG9vdGhEZXZpY2VNYW5hZ2VyIG1EZXZpY2VNYW5hZ2VyOwotICAgICAgICBCcm9hZGNhc3RTb3VyY2VJbmZvSGFuZGxlcihDYWNoZWRCbHVldG9vdGhEZXZpY2VNYW5hZ2VyIGRldmljZU1hbmFnZXIKLSAgICAgICAgICAgICkgewotICAgICAgICAgICAgbURldmljZU1hbmFnZXIgPSBkZXZpY2VNYW5hZ2VyOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJCcm9hZGNhc3RTb3VyY2VJbmZvSGFuZGxlcjogZGV2aWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJCcm9hZGNhc3RTb3VyY2VJbmZvSGFuZGxlcjogYWN0aW9uIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5FWFRSQV9TT1VSQ0VfSU5GTyk7Ci0KLSAgICAgICAgICAgIGludCBzb3VyY2VJbmZvSWR4ID0gaW50ZW50LmdldEludEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5FWFRSQV9TT1VSQ0VfSU5GT19JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuRVJST1IpOwotCi0gICAgICAgICAgICBpbnQgbWF4TnVtT2ZzcmNJbmZvID0gaW50ZW50LmdldEludEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5FWFRSQV9NQVhfTlVNX1NPVVJDRV9JTkZPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuRVJST1IpOwotICAgICAgICAgICAgaWYgKFYpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSY3ZlZCA6QkNBU1RfUkVDRUlWRVJfU1RBVEUgSW50ZW50IGZvciA6ICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJjdmQgQnJvYWRjYXN0U291cmNlSW5mbyBpbmRleD0iICsgc291cmNlSW5mb0lkeCk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmN2ZCBtYXggbnVtIG9mIHNvdXJjZSBJbmZvPSIgKyBtYXhOdW1PZnNyY0luZm8pOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJjdmQgQnJvYWRjYXN0U291cmNlSW5mbz0iICsgc291cmNlSW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDYWNoZWRCbHVldG9vdGhEZXZpY2UgY2FjaGVkRGV2aWNlID0gbURldmljZU1hbmFnZXIuZmluZERldmljZShkZXZpY2UpOwotICAgICAgICAgICAgVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIHZEZXZpY2UgPQotICAgICAgICAgICAgVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlLmdldFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZShjYWNoZWREZXZpY2UsIG51bGwpOwotICAgICAgICAgICAgaWYgKHZEZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZEZXZpY2Uub25Ccm9hZGNhc3RSZWNlaXZlclN0YXRlQ2hhbmdlZChzb3VyY2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZm9JZHgsIG1heE51bU9mc3JjSW5mbyk7Ci0gICAgICAgICAgICAgICAgY2FjaGVkRGV2aWNlLmRpc3BhdGNoQXR0cmlidXRlc0NoYW5nZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gdkNhY2hlZERldmljZSBjcmVhdGVkIGZvciB0aGlzIERldmljZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci19OwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9ibHVldG9vdGgvVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlLmphdmEgYi9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2JsdWV0b290aC9WZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkMGFmZC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9mcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2JsdWV0b290aC9WZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENsYXNzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFyaW5nQWlkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLQotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuVXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwotCi0vKioKLSAqIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZSByZXByZXNlbnRzIGEgcmVtb3RlIEJsdWV0b290aCBkZXZpY2UuIEl0IGNvbnRhaW5zCi0gKiBhdHRyaWJ1dGVzIG9mIHRoZSBkZXZpY2UgKHN1Y2ggYXMgdGhlIGFkZHJlc3MsIG5hbWUsIFJTU0ksIGV0Yy4pIGFuZAotICogZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIGRldmljZSAoY29ubmVjdCwgcGFpciwgZGlzY29ubmVjdCwKLSAqIGV0Yy4pLgotICovCi1wdWJsaWMgY2xhc3MgVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGV4dGVuZHMgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZlbmRvckNhY2hlZEJsdWV0b290aERldmljZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7Ci0gICAgcHJpdmF0ZSBTY2FuUmVzdWx0IG1TY2FuUmVzID0gbnVsbDsKLSAgICBwcml2YXRlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIgbVNjYW5Bc3Npc3RNYW5hZ2VyOwotICAgIHN0YXRpYyBwcml2YXRlIE1hcDxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBtQmxlQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXMKLSAgICAgICAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPigpOwotICAgIHByaXZhdGUgTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlciBtUHJvZmlsZU1hbmFnZXIgPSBudWxsOwotICAgIHN0YXRpYyBwcml2YXRlIE1hcDxDYWNoZWRCbHVldG9vdGhEZXZpY2UsCi0gICAgICAgICAgICAgICAgIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZT4gbVZjYmRFbnRyaWVzID0gbmV3IElkZW50aXR5SGFzaE1hcDxDYWNoZWRCbHVldG9vdGhEZXZpY2UsIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZT4oKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGdldFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZSgKLSAgICAgICAgICAgICAgICAgICAgIENhY2hlZEJsdWV0b290aERldmljZSBjYWNoZWREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICBMb2NhbEJsdWV0b290aFByb2ZpbGVNYW5hZ2VyIHByb2ZpbGVNYW5hZ2VyKSB7Ci0gICAgICAgIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZSB2Q2JkID0gbnVsbDsKLSAgICAgICAgaWYgKG1WY2JkRW50cmllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2Q2JkID0gbVZjYmRFbnRyaWVzLmdldChjYWNoZWREZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vZG9udCBjcmVhdGUgbmV3IGluc3RhbmNlIGlmIHByb2ZpbGVNZ3IgaXMgbnVsbAotICAgICAgICBpZiAodkNiZCA9PSBudWxsICYmIHByb2ZpbGVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZDYmQgPSBuZXcgVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlKGNhY2hlZERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU1hbmFnZXIpOwotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ2V0VmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlOiBjcmVhdGVkIG5ldyBJbnN0YW5jZSIpOwotICAgICAgICAgICAgbVZjYmRFbnRyaWVzLnB1dChjYWNoZWREZXZpY2UsIHZDYmQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2Q2JkOwotICAgIH0KLQotICAgIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZShDYWNoZWRCbHVldG9vdGhEZXZpY2UgY2FjaGVkRGV2aWNlLExvY2FsQmx1ZXRvb3RoUHJvZmlsZU1hbmFnZXIgcHJvZmlsZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIoY2FjaGVkRGV2aWNlKTsKLSAgICAgICAgbVByb2ZpbGVNYW5hZ2VyID0gcHJvZmlsZU1hbmFnZXI7Ci0gICAgICAgIG1CbGVCcm9hZGNhc3RSZWNlaXZlclN0YXRlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+KCk7Ci0gICAgICAgIEluaXRpYWxpemVTQU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBWZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UoQ29udGV4dCBjb250ZXh0LCBMb2NhbEJsdWV0b290aFByb2ZpbGVNYW5hZ2VyIHByb2ZpbGVNYW5hZ2VyLAotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgc3VwZXIoY29udGV4dCwgcHJvZmlsZU1hbmFnZXIsIGRldmljZSk7Ci0gICAgICAgIG1Qcm9maWxlTWFuYWdlciA9IHByb2ZpbGVNYW5hZ2VyOwotICAgICAgICBtQmxlQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPigpOwotICAgICAgICBJbml0aWFsaXplU0FNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzY3JpYmVzIHRoZSBjdXJyZW50IGRldmljZSBhbmQgcHJvZmlsZSBmb3IgbG9nZ2luZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9maWxlIFByb2ZpbGUgdG8gZGVzY3JpYmUKLSAgICAgKiBAcmV0dXJuIERlc2NyaXB0aW9uIG9mIHRoZSBkZXZpY2UgYW5kIHByb2ZpbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmliZShMb2NhbEJsdWV0b290aFByb2ZpbGUgcHJvZmlsZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJBZGRyZXNzOiIpLmFwcGVuZChtRGV2aWNlKTsKLSAgICAgICAgaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIgUHJvZmlsZToiKS5hcHBlbmQocHJvZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uUHJvZmlsZVN0YXRlQ2hhbmdlZChMb2NhbEJsdWV0b290aFByb2ZpbGUgcHJvZmlsZSwgaW50IG5ld1Byb2ZpbGVTdGF0ZSkgewotICAgICAgICBpZiAoVikgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Qcm9maWxlU3RhdGVDaGFuZ2VkOiBwcm9maWxlICIgKyBwcm9maWxlICsgIiwgZGV2aWNlPSIgKyBtRGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbmV3UHJvZmlsZVN0YXRlICIgKyBuZXdQcm9maWxlU3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9maWxlIGluc3RhbmNlb2YgQkNQcm9maWxlCi0gICAgICAgICAgICAgICAgICYmIG5ld1Byb2ZpbGVTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICBjbGVhblVwU0FNYW5hbmdlcigpOwotICAgICAgICAgICBzdXBlci5kaXNwYXRjaEF0dHJpYnV0ZXNDaGFuZ2VkKCk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgbVNjYW5Bc3Npc3RDYWxsYmFjayA9IG5ldyBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaygpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZChTY2FuUmVzdWx0IHJlcykgewotICAgICAgICAgICAgaWYgKFYpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkJsZUJyb2FkY2FzdFNvdXJjZUZvdW5kIiArIHJlcy5nZXREZXZpY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTY2FuUmVzdWx0KHJlcyk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZUFkZGVkKEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdFNvdXJjZVNlbGVjdGVkKCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBicm9hZGNhc3RTb3VyY2VJbmRpY2llcykgewotICAgICAgICB9OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VVcGRhdGVkKEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICB9OwotICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlUmVtb3ZlZChCbHVldG9vdGhEZXZpY2UgcmN2ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgc3JjSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgIH07Ci0gICAgfTsKLQotICAgIHB1YmxpYyBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyIGdldFNjYW5Bc3Npc3RNYW5hZ2VyKCkKLSAgICB7ICAgSW5pdGlhbGl6ZVNBTWFuYWdlcigpOwotICAgICAgICByZXR1cm4gbVNjYW5Bc3Npc3RNYW5hZ2VyOwotICAgIH0KLQotICAgIHZvaWQgSW5pdGlhbGl6ZVNBTWFuYWdlcigpIHsKLSAgICAgICAgQkNQcm9maWxlIGJjUHJvZmlsZSA9IChCQ1Byb2ZpbGUpbVByb2ZpbGVNYW5hZ2VyLmdldEJDUHJvZmlsZSgpOwotICAgICAgICBtU2NhbkFzc2lzdE1hbmFnZXIgPSBiY1Byb2ZpbGUuZ2V0QlNBTWFuYWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLCBtU2NhbkFzc2lzdENhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFuVXBTQU1hbmFuZ2VyKCkgewotICAgICAgICBtU2NhbkFzc2lzdE1hbmFnZXIgPSBudWxsOwotICAgICAgICBpZiAobUJsZUJyb2FkY2FzdFJlY2VpdmVyU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RSZWNlaXZlclN0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVCcm9hZGNhc3RyZWNlaXZlclN0YXRlcyhCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8sIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhTb3VyY2VJbmZvc051bSkgewotICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIGVudHJ5ID0gbUJsZUJyb2FkY2FzdFJlY2VpdmVyU3RhdGVzLmdldChpbmRleCk7Ci0gICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVCcm9hZGNhc3RyZWNlaXZlclN0YXRlczogUmVwbGFjaW5nIHJlY2VpdmVyIFN0YXRlIEluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICBtQmxlQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXMucmVwbGFjZShpbmRleCwgc3JjSW5mbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQmxlQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXMucHV0KGluZGV4LCBzcmNJbmZvKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5kaXNwYXRjaEF0dHJpYnV0ZXNDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZkJsZUJyb2FkY2FzdFJlY2VpdmVyU3RhdGVzKCkgewotICAgICAgICBpbnQgcmV0ID0gMDsKLSAgICAgICAgaWYgKG1TY2FuQXNzaXN0TWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJbml0aWFsaXplU0FNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAobVNjYW5Bc3Npc3RNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gc3JjSW5mbyA9IG1TY2FuQXNzaXN0TWFuYWdlci5nZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbigpOwotICAgICAgICBpZiAoc3JjSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSBzcmNJbmZvLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVikgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ2V0TnVtYmVyT2ZCbGVCcm9hZGNhc3RSZWNlaXZlclN0YXRlczoiKyByZXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBnZXRBbGxCbGVCcm9hZGNhc3RyZWNlaXZlclN0YXRlcygpIHsKLSAgICAgICAgaWYgKG1TY2FuQXNzaXN0TWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJbml0aWFsaXplU0FNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAobVNjYW5Bc3Npc3RNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTQSBNYW5hZ2VyIGNhbnQgYmUgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+IHNyY0luZm9zID0gbVNjYW5Bc3Npc3RNYW5hZ2VyLmdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKCk7Ci0gICAgICAgIGlmIChzcmNJbmZvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0QWxsQmxlQnJvYWRjYXN0cmVjZWl2ZXJTdGF0ZXM6IG5vIHNyYyBJbmZvIik7Ci0gICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNyY0luZm9zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNJID0gc3JjSW5mb3MuZ2V0KGkpOwotICAgICAgICAgICAgbUJsZUJyb2FkY2FzdFJlY2VpdmVyU3RhdGVzLnB1dCgoaW50KXNJLmdldFNvdXJjZUlkKCksIHNJKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIG1CbGVCcm9hZGNhc3RSZWNlaXZlclN0YXRlczsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZUNoYW5nZWQgKEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heFNvdXJjZUluZm9OdW0pIHsKLSAgICAgICB1cGRhdGVCcm9hZGNhc3RyZWNlaXZlclN0YXRlcyhzcmNJbmZvLCBpbmRleCwgbWF4U291cmNlSW5mb051bSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NhblJlc3VsdChTY2FuUmVzdWx0IHJlcykgewotICAgICAgICBtU2NhblJlcyA9IHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NhblJlc3VsdCBnZXRTY2FuUmVzdWx0KCkgewotICAgICAgICByZXR1cm4gbVNjYW5SZXM7Ci0gICAgfQotCi0gICAgQGFuZHJvaWR4LmFubm90YXRpb24uS2VlcAotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvYWRjYXN0QXVkaW9TeW5jZWQoKSB7Ci0gICAgICAgIGlmIChtU2NhbkFzc2lzdE1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgSW5pdGlhbGl6ZVNBTWFuYWdlcigpOwotICAgICAgICAgICAgaWYgKG1TY2FuQXNzaXN0TWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU0EgTWFuYWdlciBjYW50IGJlIGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gc3JjSW5mb3MgPSBtU2NhbkFzc2lzdE1hbmFnZXIuZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24oKTsKLSAgICAgICAgaWYgKHNyY0luZm9zID09IG51bGwpIHsKLSAgICAgICAgICAgICBMb2cuZShUQUcsICJpc0Jyb2FkY2FzdEF1ZGlvU3luY2VkOiBubyBzcmMgSW5mbyIpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpPTA7IGk8c3JjSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc0kgPSBzcmNJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoc0kuZ2V0QXVkaW9TeW5jU3RhdGUoKSA9PQotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsImlzQXVkaW9TeW5jZWQ6IGZhbHNlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9BbmRyb2lkLmJwIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjOTZjMi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RoLWFwcHMtYWR2YS1zcmNzIiwKLSAgICBzcmNzOiBbInNyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvZ3JvdXBjbGllbnQvKi5qYXZhIiwKLSAgICAgICAgICAgInNyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC8qLmphdmEiLAotICAgICAgICAgICAic3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9icm9hZGNhc3QvKi5qYXZhIiwKLSAgICAgICAgICAgInNyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtLyouamF2YSIsCi0gICAgICAgICAgICJzcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY3NjbGllbnQvKi5qYXZhIiwKLSAgICAgICAgICAgInNyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYXBtLyouamF2YSIsCi0gICAgICAgICAgICJzcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC8qLmphdmEiLAotICAgICAgICAgICAic3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9tY3AvKi5qYXZhIiwKLSAgICAgICAgICAgInNyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvY2MvKi5qYXZhIl0sCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvQW5kcm9pZC5icCBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFkOGNkLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGhxdGlfam5pX2FkdmFfZGVmYXVsdCIsCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiLCAibGlibmF0aXZlaGVscGVyX2hlYWRlcl9vbmx5Il0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvdHlwZXMiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9leHQvdmhhbC9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9sZWEvdmhhbC9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzLWludGYvYmx1ZXRvb3RoL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2xlYS92aGFsL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCi0gICAgXSwKLX0KLQotLy8gQlQgTEUgQXVkaW8gc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RocXRpX2puaV9hZHZhIiwKLSAgICBkZWZhdWx0czogWyJsaWJibHVldG9vdGhxdGlfam5pX2FkdmFfZGVmYXVsdCJdLAotICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNvbV9hbmRyb2lkX2JsdWV0b290aF9idHNlcnZpY2VfQWRhcHRlclNlcnZpY2VFeHQuY3BwIiwKLSAgICAgICAgImNvbV9hbmRyb2lkX2JsdWV0b290aF9wYWNzX2NsaWVudC5jcHAiLAotICAgICAgICAiY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2Jyb2FkY2FzdC5jcHAiLAotICAgICAgICAiY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2NzaXBfY2xpZW50LmNwcCIsCi0gICAgICAgICJjb21fYW5kcm9pZF9ibHVldG9vdGhfYWNtLmNwcCIsCi0gICAgICAgICJjb21fYW5kcm9pZF9ibHVldG9vdGhfYXBtLmNwcCIsCi0gICAgICAgICJjb21fYW5kcm9pZF9ibHVldG9vdGhfdmNwX2NvbnRyb2xsZXIuY3BwIiwKLSAgICAgICAgImNvbV9hbmRyb2lkX2JsdWV0b290aF9tY3AuY3BwIiwKLSAgICAgICAgImNvbV9hbmRyb2lkX2JsdWV0b290aF9jYy5jcHAiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2FjbS5jcHAgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2FjbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMGFmMGUuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF9hY20uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBMT0dfVEFHICJCbHVldG9vdGhBY21TZXJ2aWNlSm5pIgotCi0jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCi0jaW5jbHVkZSAiY29tX2FuZHJvaWRfYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvYnRfYWNtLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+Ci0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0luZGV4OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjUHJpb3JpdHk7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNTYW1wbGVSYXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQlBTOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ2hhbm5lbE1vZGU7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQXVkaW9TdGF0ZUNoYW5nZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNvZGVjQ29uZmlnQ2hhbmdlZDsKLQotc3RhdGljIHN0cnVjdCB7Ci0gIGpjbGFzcyBjbGF6ejsKLSAgam1ldGhvZElEIGNvbnN0cnVjdG9yOwotICBqbWV0aG9kSUQgZ2V0Q29kZWNUeXBlOwotICBqbWV0aG9kSUQgZ2V0Q29kZWNQcmlvcml0eTsKLSAgam1ldGhvZElEIGdldFNhbXBsZVJhdGU7Ci0gIGptZXRob2RJRCBnZXRCaXRzUGVyU2FtcGxlOwotICBqbWV0aG9kSUQgZ2V0Q2hhbm5lbE1vZGU7Ci0gIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljMTsKLSAgam1ldGhvZElEIGdldENvZGVjU3BlY2lmaWMyOwotICBqbWV0aG9kSUQgZ2V0Q29kZWNTcGVjaWZpYzM7Ci0gIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljNDsKLX0gYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWc7Ci0KLXN0YXRpYyBjb25zdCBidGFjbV9pbml0aWF0b3JfaW50ZXJmYWNlX3QqIHNCbHVldG9vdGhBY21JbnRlcmZhY2UgPSBudWxscHRyOwotc3RhdGljIHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4IGludGVyZmFjZV9tdXRleDsKLQotc3RhdGljIGpvYmplY3QgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci1zdGF0aWMgc3RkOjpzaGFyZWRfdGltZWRfbXV0ZXggY2FsbGJhY2tzX211dGV4OwotCi1zdGF0aWMgdm9pZCBidGFjbV9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YWNtX2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSwgdWludDE2X3QgY29udGV4dFR5cGUpIHsKLSAgQUxPR0koIiVzIiwgX19mdW5jX18pOwotCi0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soY2FsbGJhY2tzX211dGV4KTsKLSAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLQotICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgaWYgKCFhZGRyLmdldCgpKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc0NhbGxiYWNrRW52LT5TZXRCeXRlQXJyYXlSZWdpb24oCi0gICAgICBhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGpieXRlKj4oYmRfYWRkci5hZGRyZXNzKSk7Ci0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLmdldCgpLCAoamludClzdGF0ZSwgKGppbnQpY29udGV4dFR5cGUpOwotfQotCi1zdGF0aWMgdm9pZCBidGFjbV9hdWRpb19zdGF0ZV9jYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhY21fYXVkaW9fc3RhdGVfdCBzdGF0ZSwgdWludDE2X3QgY29udGV4dFR5cGUpIHsKLSAgQUxPR0koIiVzIiwgX19mdW5jX18pOwotCi0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soY2FsbGJhY2tzX211dGV4KTsKLSAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLQotICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgaWYgKCFhZGRyLmdldCgpKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc0NhbGxiYWNrRW52LT5TZXRCeXRlQXJyYXlSZWdpb24oCi0gICAgICBhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGpieXRlKj4oYmRfYWRkci5hZGRyZXNzKSk7Ci0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uQXVkaW9TdGF0ZUNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5nZXQoKSwgKGppbnQpc3RhdGUsIChqaW50KWNvbnRleHRUeXBlKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhY21fYXVkaW9fY29uZmlnX2NhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIENvZGVjQ29uZmlnIGNvZGVjX2NvbmZpZywKLSAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzLCB1aW50MTZfdCBjb250ZXh0VHlwZSkgewotICBBTE9HSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIGpvYmplY3QgY29kZWNDb25maWdPYmogPSBzQ2FsbGJhY2tFbnYtPk5ld09iamVjdCgKLSAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6LAotICAgICAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY29uc3RydWN0b3IsCi0gICAgICAoamludCljb2RlY19jb25maWcuY29kZWNfdHlwZSwgKGppbnQpY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5LAotICAgICAgKGppbnQpY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlLCAoamludCljb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlLAotICAgICAgKGppbnQpY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSwgKGpsb25nKWNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY18xLAotICAgICAgKGpsb25nKWNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY18yLAotICAgICAgKGpsb25nKWNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zLAotICAgICAgKGpsb25nKWNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY180KTsKLQotICBqc2l6ZSBpID0gMDsKLSAgam9iamVjdEFycmF5IGxvY2FsX2NhcGFiaWxpdGllc19hcnJheSA9IHNDYWxsYmFja0Vudi0+TmV3T2JqZWN0QXJyYXkoCi0gICAgICAoanNpemUpY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcy5zaXplKCksCi0gICAgICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5jbGF6eiwgbnVsbHB0cik7Ci0gIGZvciAoYXV0byBjb25zdCYgY2FwIDogY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcykgewotICAgIGpvYmplY3QgY2FwT2JqID0gc0NhbGxiYWNrRW52LT5OZXdPYmplY3QoCi0gICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6LAotICAgICAgICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5jb25zdHJ1Y3RvciwKLSAgICAgICAgKGppbnQpY2FwLmNvZGVjX3R5cGUsIChqaW50KWNhcC5jb2RlY19wcmlvcml0eSwgKGppbnQpY2FwLnNhbXBsZV9yYXRlLAotICAgICAgICAoamludCljYXAuYml0c19wZXJfc2FtcGxlLCAoamludCljYXAuY2hhbm5lbF9tb2RlLAotICAgICAgICAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzEsIChqbG9uZyljYXAuY29kZWNfc3BlY2lmaWNfMiwKLSAgICAgICAgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY18zLCAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzQpOwotICAgIHNDYWxsYmFja0Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGxvY2FsX2NhcGFiaWxpdGllc19hcnJheSwgaSsrLCBjYXBPYmopOwotICAgIHNDYWxsYmFja0Vudi0+RGVsZXRlTG9jYWxSZWYoY2FwT2JqKTsKLSAgfQotCi0gIGkgPSAwOwotICBqb2JqZWN0QXJyYXkgc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXNfYXJyYXkgPSBzQ2FsbGJhY2tFbnYtPk5ld09iamVjdEFycmF5KAotICAgICAgKGpzaXplKWNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcy5zaXplKCksCi0gICAgICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5jbGF6eiwgbnVsbHB0cik7Ci0gIGZvciAoYXV0byBjb25zdCYgY2FwIDogY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gICAgam9iamVjdCBjYXBPYmogPSBzQ2FsbGJhY2tFbnYtPk5ld09iamVjdCgKLSAgICAgICAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY2xhenosCi0gICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNvbnN0cnVjdG9yLAotICAgICAgICAoamludCljYXAuY29kZWNfdHlwZSwgKGppbnQpY2FwLmNvZGVjX3ByaW9yaXR5LCAoamludCljYXAuc2FtcGxlX3JhdGUsCi0gICAgICAgIChqaW50KWNhcC5iaXRzX3Blcl9zYW1wbGUsIChqaW50KWNhcC5jaGFubmVsX21vZGUsCi0gICAgICAgIChqbG9uZyljYXAuY29kZWNfc3BlY2lmaWNfMSwgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY18yLAotICAgICAgICAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzMsIChqbG9uZyljYXAuY29kZWNfc3BlY2lmaWNfNCk7Ci0gICAgc0NhbGxiYWNrRW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXNfYXJyYXksIGkrKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBPYmopOwotICAgIHNDYWxsYmFja0Vudi0+RGVsZXRlTG9jYWxSZWYoY2FwT2JqKTsKLSAgfQotCi0gIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IGFkZHIoCi0gICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KFJhd0FkZHJlc3M6OmtMZW5ndGgpKTsKLSAgaWYgKCFhZGRyLmdldCgpKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKAotICAgICAgYWRkci5nZXQoKSwgMCwgUmF3QWRkcmVzczo6a0xlbmd0aCwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgamJ5dGUqPihiZF9hZGRyLmFkZHJlc3MpKTsKLQotICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKAotICAgICAgbUNhbGxiYWNrc09iaiwgbWV0aG9kX29uQ29kZWNDb25maWdDaGFuZ2VkLCBhZGRyLmdldCgpLCBjb2RlY0NvbmZpZ09iaiwKLSAgICAgIGxvY2FsX2NhcGFiaWxpdGllc19hcnJheSwgc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXNfYXJyYXksIChqaW50KWNvbnRleHRUeXBlKTsKLX0KLQotc3RhdGljIGJ0YWNtX2luaXRpYXRvcl9jYWxsYmFja3NfdCBzQmx1ZXRvb3RoQWNtQ2FsbGJhY2tzID0gewotICAgIHNpemVvZihzQmx1ZXRvb3RoQWNtQ2FsbGJhY2tzKSwKLSAgICBidGFjbV9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrLAotICAgIGJ0YWNtX2F1ZGlvX3N0YXRlX2NhbGxiYWNrLAotICAgIGJ0YWNtX2F1ZGlvX2NvbmZpZ19jYWxsYmFjawotfTsKLQotc3RhdGljIHZvaWQgY2xhc3NJbml0TmF0aXZlKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKLSAgamNsYXNzIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MgPQotICAgICAgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjQ29uZmlnIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNvbnN0cnVjdG9yID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgIjxpbml0PiIsICIoSUlJSUlKSkpKKVYiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNUeXBlID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjVHlwZSIsICIoKUkiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNQcmlvcml0eSA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1ByaW9yaXR5IiwgIigpSSIpOwotICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRTYW1wbGVSYXRlID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldFNhbXBsZVJhdGUiLCAiKClJIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldEJpdHNQZXJTYW1wbGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Qml0c1BlclNhbXBsZSIsICIoKUkiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q2hhbm5lbE1vZGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Q2hhbm5lbE1vZGUiLCAiKClJIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMxID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1NwZWNpZmljMSIsICIoKUoiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzIgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjU3BlY2lmaWMyIiwgIigpSiIpOwotICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMyA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICBqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Q29kZWNTcGVjaWZpYzMiLCAiKClKIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWM0ID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1NwZWNpZmljNCIsICIoKUoiKTsKLQotICBtZXRob2Rfb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQiLCAiKFtCSUkpViIpOwotCi0gIG1ldGhvZF9vbkF1ZGlvU3RhdGVDaGFuZ2VkID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkF1ZGlvU3RhdGVDaGFuZ2VkIiwgIihbQklJKVYiKTsKLQotICBtZXRob2Rfb25Db2RlY0NvbmZpZ0NoYW5nZWQgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ29kZWNDb25maWdDaGFuZ2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIihbQkxhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZzsiCi0gICAgICAgICAgICAgICAgICAgICAgICJbTGFuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjQ29uZmlnOyIKLSAgICAgICAgICAgICAgICAgICAgICAgIltMYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ29kZWNDb25maWc7SSlWIik7Ci0KLSAgQUxPR0koIiVzOiBzdWNjZWVkcyIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBwcmVwYXJlQ29kZWNQcmVmZXJlbmNlcygKLSAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpvYmplY3RBcnJheSBjb2RlY0NvbmZpZ0FycmF5KSB7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBjb2RlY19wcmVmZXJlbmNlczsKLQotICBpbnQgbnVtQ29uZmlncyA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29kZWNDb25maWdBcnJheSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7Ci0gICAgam9iamVjdCBqY29kZWNDb25maWcgPSBlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChjb2RlY0NvbmZpZ0FycmF5LCBpKTsKLSAgICBpZiAoamNvZGVjQ29uZmlnID09IG51bGxwdHIpIGNvbnRpbnVlOwotICAgIGlmICghZW52LT5Jc0luc3RhbmNlT2YoamNvZGVjQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY2xhenopKSB7Ci0gICAgICBBTE9HRSgiJXM6IEludmFsaWQgQmx1ZXRvb3RoQ29kZWNDb25maWcgaW5zdGFuY2UiLCBfX2Z1bmNfXyk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgamludCBjb2RlY1R5cGUgPSBlbnYtPkNhbGxJbnRNZXRob2QoCi0gICAgICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNUeXBlKTsKLSAgICBqaW50IGNvZGVjUHJpb3JpdHkgPSBlbnYtPkNhbGxJbnRNZXRob2QoCi0gICAgICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNQcmlvcml0eSk7Ci0gICAgamludCBzYW1wbGVSYXRlID0gZW52LT5DYWxsSW50TWV0aG9kKAotICAgICAgICBqY29kZWNDb25maWcsIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldFNhbXBsZVJhdGUpOwotICAgIGppbnQgYml0c1BlclNhbXBsZSA9IGVudi0+Q2FsbEludE1ldGhvZCgKLSAgICAgICAgamNvZGVjQ29uZmlnLCBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRCaXRzUGVyU2FtcGxlKTsKLSAgICBqaW50IGNoYW5uZWxNb2RlID0gZW52LT5DYWxsSW50TWV0aG9kKAotICAgICAgICBqY29kZWNDb25maWcsIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldENoYW5uZWxNb2RlKTsKLSAgICBqbG9uZyBjb2RlY1NwZWNpZmljMSA9IGVudi0+Q2FsbExvbmdNZXRob2QoCi0gICAgICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzEpOwotICAgIGpsb25nIGNvZGVjU3BlY2lmaWMyID0gZW52LT5DYWxsTG9uZ01ldGhvZCgKLSAgICAgICAgamNvZGVjQ29uZmlnLCBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMik7Ci0gICAgamxvbmcgY29kZWNTcGVjaWZpYzMgPSBlbnYtPkNhbGxMb25nTWV0aG9kKAotICAgICAgICBqY29kZWNDb25maWcsIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMzKTsKLSAgICBqbG9uZyBjb2RlY1NwZWNpZmljNCA9IGVudi0+Q2FsbExvbmdNZXRob2QoCi0gICAgICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzQpOwotCi0gICAgQ29kZWNDb25maWcgY29kZWNfY29uZmlnID0gewotICAgICAgICAuY29kZWNfdHlwZSA9IHN0YXRpY19jYXN0PENvZGVjSW5kZXg+KGNvZGVjVHlwZSksCi0gICAgICAgIC5jb2RlY19wcmlvcml0eSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDb2RlY1ByaW9yaXR5Pihjb2RlY1ByaW9yaXR5KSwKLSAgICAgICAgLnNhbXBsZV9yYXRlID0gc3RhdGljX2Nhc3Q8Q29kZWNTYW1wbGVSYXRlPihzYW1wbGVSYXRlKSwKLSAgICAgICAgLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDb2RlY0JQUz4oYml0c1BlclNhbXBsZSksCi0gICAgICAgIC5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNDaGFubmVsTW9kZT4oY2hhbm5lbE1vZGUpLAotICAgICAgICAuY29kZWNfc3BlY2lmaWNfMSA9IGNvZGVjU3BlY2lmaWMxLAotICAgICAgICAuY29kZWNfc3BlY2lmaWNfMiA9IGNvZGVjU3BlY2lmaWMyLAotICAgICAgICAuY29kZWNfc3BlY2lmaWNfMyA9IGNvZGVjU3BlY2lmaWMzLAotICAgICAgICAuY29kZWNfc3BlY2lmaWNfNCA9IGNvZGVjU3BlY2lmaWM0fTsKLQotICAgIGNvZGVjX3ByZWZlcmVuY2VzLnB1c2hfYmFjayhjb2RlY19jb25maWcpOwotICB9Ci0gIHJldHVybiBjb2RlY19wcmVmZXJlbmNlczsKLX0KLQotc3RhdGljIHZvaWQgaW5pdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBtYXhDb25uZWN0ZWRBdWRpb0RldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdEFycmF5IGNvZGVjQ29uZmlnQXJyYXkpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiJXM6IEJsdWV0b290aCBtb2R1bGUgaXMgbm90IGxvYWRlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc0JsdWV0b290aEFjbUludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgQUxPR1coIiVzOiBDbGVhbmluZyB1cCBBQ00gSW50ZXJmYWNlIGJlZm9yZSBpbml0aWFsaXppbmcuLi4iLCBfX2Z1bmNfXyk7Ci0gICAgc0JsdWV0b290aEFjbUludGVyZmFjZS0+Y2xlYW51cCgpOwotICAgIHNCbHVldG9vdGhBY21JbnRlcmZhY2UgPSBudWxscHRyOwotICB9Ci0KLSAgaWYgKG1DYWxsYmFja3NPYmogIT0gbnVsbHB0cikgewotICAgIEFMT0dXKCIlczogQ2xlYW5pbmcgdXAgQUNNIGNhbGxiYWNrIG9iamVjdCIsIF9fZnVuY19fKTsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2FsbGJhY2tzT2JqKTsKLSAgICBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmICgobUNhbGxiYWNrc09iaiA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCkpID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBHbG9iYWwgUmVmIGZvciBBQ00gQ2FsbGJhY2tzIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6ID0gKGpjbGFzcyllbnYtPk5ld0dsb2JhbFJlZigKLSAgICAgIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZyIpKTsKLSAgaWYgKGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6ID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBHbG9iYWwgUmVmIGZvciBCbHVldG9vdGhDb2RlY0NvbmZpZyBjbGFzcyIsCi0gICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNCbHVldG9vdGhBY21JbnRlcmZhY2UgPQotICAgICAgKGJ0YWNtX2luaXRpYXRvcl9pbnRlcmZhY2VfdCopYnRJbmYtPmdldF9wcm9maWxlX2ludGVyZmFjZSgKLSAgICAgICAgICBCVF9QUk9GSUxFX0FDTV9JRCk7Ci0gIGlmIChzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgQmx1ZXRvb3RoIEFDTSBJbnRlcmZhY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGNvZGVjX3ByaW9yaXRpZXMgPQotICAgICAgcHJlcGFyZUNvZGVjUHJlZmVyZW5jZXMoZW52LCBvYmplY3QsIGNvZGVjQ29uZmlnQXJyYXkpOwotCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNCbHVldG9vdGhBY21JbnRlcmZhY2UtPmluaXQoCi0gICAgICAmc0JsdWV0b290aEFjbUNhbGxiYWNrcywgbWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzLCBjb2RlY19wcmlvcml0aWVzKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgQmx1ZXRvb3RoIEFDTSwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgIHN0YXR1cyk7Ci0gICAgc0JsdWV0b290aEFjbUludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFudXBOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGludGVyZmFjZV9sb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGNhbGxiYWNrc19sb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0KLSAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIGJ0SW5mID0gZ2V0Qmx1ZXRvb3RoSW50ZXJmYWNlKCk7Ci0gIGlmIChidEluZiA9PSBudWxscHRyKSB7Ci0gICAgQUxPR0UoIiVzOiBCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHNCbHVldG9vdGhBY21JbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIHNCbHVldG9vdGhBY21JbnRlcmZhY2UtPmNsZWFudXAoKTsKLSAgICBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgfQotCi0gIGVudi0+RGVsZXRlR2xvYmFsUmVmKGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6KTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY2xhenogPSBudWxscHRyOwotCi0gIGlmIChtQ2FsbGJhY2tzT2JqICE9IG51bGxwdHIpIHsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2FsbGJhY2tzT2JqKTsKLSAgICBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLSAgfQotfQotCi1zdGF0aWMgamJvb2xlYW4gY29ubmVjdEFjbU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlQXJyYXkgYWRkcmVzcywgamludCBjb250ZXh0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBwcm9maWxlVHlwZSwgamludCBwcmVmZXJyZWRDb250ZXh0KSB7Ci0gIEFMT0dJKCIlczogc0JsdWV0b290aEFjbUludGVyZmFjZTogJXAiLCBfX2Z1bmNfXywgc0JsdWV0b290aEFjbUludGVyZmFjZSk7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHRoZSBCbHVldG9vdGggQUNNIEludGVyZmFjZSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgamJ5dGUqIGFkZHIgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIG51bGxwdHIpOwotICBpZiAoIWFkZHIpIHsKLSAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgRUlOVkFMKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBiZF9hZGRyLkZyb21PY3RldHMocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYWRkcikpOwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlLT5jb25uZWN0KGJkX2FkZHIsIGNvbnRleHRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLCBwcmVmZXJyZWRDb250ZXh0KTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIEFDTSBjb25uZWN0aW9uLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gIH0KLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdEFjbU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IGFkZHJlc3MsIGppbnQgY29udGV4dFR5cGUpIHsKLSAgQUxPR0koIiVzOiBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlOiAlcCIsIF9fZnVuY19fLCBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNCbHVldG9vdGhBY21JbnRlcmZhY2UpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdGhlIEJsdWV0b290aCBBQ00gSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGJkX2FkZHIuRnJvbU9jdGV0cyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihhZGRyKSk7Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNCbHVldG9vdGhBY21JbnRlcmZhY2UtPmRpc2Nvbm5lY3QoYmRfYWRkciwgY29udGV4dFR5cGUpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgQUNNIGRpc2Nvbm5lY3Rpb24sIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgfQotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBzdGFydFN0cmVhbU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IGFkZHJlc3MsIGppbnQgY29udGV4dFR5cGUpIHsKLSAgQUxPR0koIiVzOiBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlOiAlcCIsIF9fZnVuY19fLCBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNCbHVldG9vdGhBY21JbnRlcmZhY2UpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdGhlIEJsdWV0b290aCBBQ00gSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBpZiAoYWRkcikgewotICAgIGJkX2FkZHIuRnJvbU9jdGV0cyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihhZGRyKSk7Ci0gIH0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0JsdWV0b290aEFjbUludGVyZmFjZS0+c3RhcnRfc3RyZWFtKGJkX2FkZHIsIGNvbnRleHRUeXBlKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIEFDTSBzZXRfYWN0aXZlX2RldmljZSwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICB9Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIGFkZHIsIDApOwotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHN0b3BTdHJlYW1OYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IGFkZHJlc3MsIGppbnQgY29udGV4dFR5cGUpIHsKLSAgQUxPR0koIiVzOiBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlOiAlcCIsIF9fZnVuY19fLCBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNCbHVldG9vdGhBY21JbnRlcmZhY2UpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdGhlIEJsdWV0b290aCBBQ00gSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBpZiAoYWRkcikgewotICAgIGJkX2FkZHIuRnJvbU9jdGV0cyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihhZGRyKSk7Ci0gIH0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0JsdWV0b290aEFjbUludGVyZmFjZS0+c3RvcF9zdHJlYW0oYmRfYWRkciwgY29udGV4dFR5cGUpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgQUNNIHNldF9hY3RpdmVfZGV2aWNlLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gIH0KLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzLCBqaW50IGNvbnRleHRUeXBlKSB7Ci0gIEFMT0dJKCIlczogc0JsdWV0b290aEFjbUludGVyZmFjZTogJXAiLCBfX2Z1bmNfXywgc0JsdWV0b290aEFjbUludGVyZmFjZSk7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHRoZSBCbHVldG9vdGggQUNNIEludGVyZmFjZSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgamJ5dGUqIGFkZHIgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIG51bGxwdHIpOwotCi0gIFJhd0FkZHJlc3MgYmRfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgaWYgKGFkZHIpIHsKLSAgICBiZF9hZGRyLkZyb21PY3RldHMocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYWRkcikpOwotICB9Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNCbHVldG9vdGhBY21JbnRlcmZhY2UtPnNldF9hY3RpdmVfZGV2aWNlKGJkX2FkZHIsIGNvbnRleHRUeXBlKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIEFDTSBzZXRfYWN0aXZlX2RldmljZSwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICB9Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIGFkZHIsIDApOwotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlQXJyYXkgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdEFycmF5IGNvZGVjQ29uZmlnQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY29udGV4dFR5cGUsIGppbnQgcHJlZmVycmVkQ29udGV4dCkgewotICBBTE9HSSgiJXM6IHNCbHVldG9vdGhBY21JbnRlcmZhY2U6ICVwIiwgX19mdW5jX18sIHNCbHVldG9vdGhBY21JbnRlcmZhY2UpOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0JsdWV0b290aEFjbUludGVyZmFjZSkgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCB0aGUgQmx1ZXRvb3RoIEFDTSBJbnRlcmZhY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgYmRfYWRkci5Gcm9tT2N0ZXRzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGFkZHIpKTsKLSAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGNvZGVjX3ByZWZlcmVuY2VzID0KLSAgICAgIHByZXBhcmVDb2RlY1ByZWZlcmVuY2VzKGVudiwgb2JqZWN0LCBjb2RlY0NvbmZpZ0FycmF5KTsKLQotICBidF9zdGF0dXNfdCBzdGF0dXMgPQotICAgICAgc0JsdWV0b290aEFjbUludGVyZmFjZS0+Y29uZmlnX2NvZGVjKGJkX2FkZHIsIGNvZGVjX3ByZWZlcmVuY2VzLCBjb250ZXh0VHlwZSwgcHJlZmVycmVkQ29udGV4dCk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCBjb2RlYyBjb25maWd1cmF0aW9uLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gIH0KLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gQ2hhbmdlQ29kZWNDb25maWdQcmVmZXJlbmNlTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIG1lc3NhZ2UpIHsKLSAgQUxPR0koIiVzOiBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlOiAlcCIsIF9fZnVuY19fLCBzQmx1ZXRvb3RoQWNtSW50ZXJmYWNlKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNCbHVldG9vdGhBY21JbnRlcmZhY2UpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdGhlIEJsdWV0b290aCBBQ00gSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGJkX2FkZHIuRnJvbU9jdGV0cyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihhZGRyKSk7Ci0gIGNvbnN0IGNoYXIqIGNfbXNnID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhtZXNzYWdlLCBOVUxMKTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgIHNCbHVldG9vdGhBY21JbnRlcmZhY2UtPmNoYW5nZV9jb25maWdfY29kZWMoYmRfYWRkciwgKGNoYXIqKWNfbXNnKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIGNvZGVjIGNvbmZpZ3VyYXRpb24sIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgfQotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKLSAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKLSAgICB7ImluaXROYXRpdmUiLCAiKElbTGFuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjQ29uZmlnOylWIiwKLSAgICAgKHZvaWQqKWluaXROYXRpdmV9LAotICAgIHsiY2xlYW51cE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xlYW51cE5hdGl2ZX0sCi0gICAgeyJjb25uZWN0QWNtTmF0aXZlIiwgIihbQklJSSlaIiwgKHZvaWQqKWNvbm5lY3RBY21OYXRpdmV9LAotICAgIHsiZGlzY29ubmVjdEFjbU5hdGl2ZSIsICIoW0JJKVoiLCAodm9pZCopZGlzY29ubmVjdEFjbU5hdGl2ZX0sCi0gICAgeyJzdGFydFN0cmVhbU5hdGl2ZSIsICIoW0JJKVoiLCAodm9pZCopc3RhcnRTdHJlYW1OYXRpdmV9LAotICAgIHsic3RvcFN0cmVhbU5hdGl2ZSIsICIoW0JJKVoiLCAodm9pZCopc3RvcFN0cmVhbU5hdGl2ZX0sCi0gICAgeyJzZXRBY3RpdmVEZXZpY2VOYXRpdmUiLCAiKFtCSSlaIiwgKHZvaWQqKXNldEFjdGl2ZURldmljZU5hdGl2ZX0sCi0gICAgeyJzZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2VOYXRpdmUiLAotICAgICAiKFtCW0xhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZztJSSlaIiwKLSAgICAgKHZvaWQqKXNldENvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZX0sCi0gICAgeyJDaGFuZ2VDb2RlY0NvbmZpZ1ByZWZlcmVuY2VOYXRpdmUiLAotICAgICAiKFtCTGphdmEvbGFuZy9TdHJpbmc7KVoiLAotICAgICAodm9pZCopQ2hhbmdlQ29kZWNDb25maWdQcmVmZXJlbmNlTmF0aXZlfSwKLX07Ci0KLWludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfYWNtKEpOSUVudiogZW52KSB7Ci0gIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoCi0gICAgICBlbnYsICJjb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbU5hdGl2ZUludGVyZmFjZSIsIHNNZXRob2RzLAotICAgICAgTkVMRU0oc01ldGhvZHMpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfYXBtLmNwcCBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfYXBtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmYTJkYS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2FwbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIExPR19UQUcgIkJsdWV0b290aEFQTV9KbmkiCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKLSNpbmNsdWRlICJjb21fYW5kcm9pZF9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9hcG0uaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNoYXJlZF9tdXRleD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25HZXRBY3RpdmVwcm9maWxlQ2FsbGJhY2s7Ci0KLXN0YXRpYyBjb25zdCBidF9hcG1faW50ZXJmYWNlX3QqIHNCbHVldG9vdGhBcG1JbnRlcmZhY2UgPSBudWxscHRyOwotc3RhdGljIHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4IGludGVyZmFjZV9tdXRleDsKLQotc3RhdGljIGpvYmplY3QgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci1zdGF0aWMgc3RkOjpzaGFyZWRfdGltZWRfbXV0ZXggY2FsbGJhY2tzX211dGV4OwotCi0KLXN0YXRpYyBpbnQgYnRhcG1fYWN0aXZlX3Byb2ZpbGVfY2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgYXVkaW9fdHlwZSkKLXsKLSAgQUxPR0koIiVzIiwgX19mdW5jX18pOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkgfHwgbUNhbGxiYWNrc09iaiA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0KLSAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gYWRkcigKLSAgICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgaWYgKCFhZGRyLmdldCgpKSB7Ci0gIEFMT0dFKCIlczogRmFpbCB0byBuZXcgamJ5dGVBcnJheSBiZCBhZGRyIiwgX19mdW5jX18pOwotICByZXR1cm4gLTE7Ci0gIH0KLQotICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbigKLSAgICAgICAgICBhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSo+KGJkX2FkZHIuYWRkcmVzcykpOwotICByZXR1cm4gc0NhbGxiYWNrRW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vbkdldEFjdGl2ZXByb2ZpbGVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIuZ2V0KCksIChqaW50KWF1ZGlvX3R5cGUpOwotfQotCi0KLXN0YXRpYyBidGFwbV9pbml0aWF0b3JfY2FsbGJhY2tzX3Qgc0JsdWV0b290aEFwbUNhbGxiYWNrcyA9IHsKLSAgICAgICAgc2l6ZW9mKHNCbHVldG9vdGhBcG1DYWxsYmFja3MpLAotICAgICAgICBidGFwbV9hY3RpdmVfcHJvZmlsZV9jYWxsYmFjawotfTsKLQotc3RhdGljIHZvaWQgY2xhc3NJbml0TmF0aXZlKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKLQotICBBTE9HSSgiJXM6IHN1Y2NlZWRzIiwgX19mdW5jX18pOwotICBtZXRob2Rfb25HZXRBY3RpdmVwcm9maWxlQ2FsbGJhY2sgPQotICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0QWN0aXZlUHJvZmlsZSIsICIoW0JJKUkiKTsKLX0KLQotc3RhdGljIGJvb2wgaW5pdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiJXM6IEJsdWV0b290aCBtb2R1bGUgaXMgbm90IGxvYWRlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgaWYgKHNCbHVldG9vdGhBcG1JbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIEFMT0dXKCIlczogQ2xlYW5pbmcgdXAgQVBNIEludGVyZmFjZSBiZWZvcmUgaW5pdGlhbGl6aW5nLi4uIiwgX19mdW5jX18pOwotICAgIHNCbHVldG9vdGhBcG1JbnRlcmZhY2UtPmNsZWFudXAoKTsKLSAgICBzQmx1ZXRvb3RoQXBtSW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmIChtQ2FsbGJhY2tzT2JqICE9IG51bGxwdHIpIHsKLSAgICBBTE9HVygiJXM6IENsZWFuaW5nIHVwIEFQTSBjYWxsYmFjayBvYmplY3QiLCBfX2Z1bmNfXyk7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAoKG1DYWxsYmFja3NPYmogPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpKSA9PSBudWxscHRyKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgR2xvYmFsIFJlZiBmb3IgQVBNIENhbGxiYWNrcyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgc0JsdWV0b290aEFwbUludGVyZmFjZSA9Ci0gICAgICAoYnRfYXBtX2ludGVyZmFjZV90KilidEluZi0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgICAgIEJUX0FQTV9NT0RVTEVfSUQpOwotICBpZiAoc0JsdWV0b290aEFwbUludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IEJsdWV0b290aCBBUE0gSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0JsdWV0b290aEFwbUludGVyZmFjZS0+aW5pdCgmc0JsdWV0b290aEFwbUNhbGxiYWNrcyk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIEJsdWV0b290aCBBUE0sIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICBzdGF0dXMpOwotICAgIHNCbHVldG9vdGhBcG1JbnRlcmZhY2UgPSBudWxscHRyOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBpbnRlcmZhY2VfbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBjYWxsYmFja3NfbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidEluZiA9IGdldEJsdWV0b290aEludGVyZmFjZSgpOwotICBpZiAoYnRJbmYgPT0gbnVsbHB0cikgewotICAgIEFMT0dFKCIlczogQmx1ZXRvb3RoIG1vZHVsZSBpcyBub3QgbG9hZGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzQmx1ZXRvb3RoQXBtSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBzQmx1ZXRvb3RoQXBtSW50ZXJmYWNlLT5jbGVhbnVwKCk7Ci0gICAgc0JsdWV0b290aEFwbUludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAobUNhbGxiYWNrc09iaiAhPSBudWxscHRyKSB7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLX0KLQotc3RhdGljIGpib29sZWFuIGFjdGl2ZURldmljZVVwZGF0ZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzLCBqaW50IHByb2ZpbGUsIGppbnQgYXVkaW9fdHlwZSkgewotICBBTE9HSSgiJXM6IHNCbHVldG9vdGhBcG1JbnRlcmZhY2U6ICVwIiwgX19mdW5jX18sIHNCbHVldG9vdGhBcG1JbnRlcmZhY2UpOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0JsdWV0b290aEFwbUludGVyZmFjZSkgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCB0aGUgQmx1ZXRvb3RoIEFQTSBJbnRlcmZhY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLQotICBSYXdBZGRyZXNzIGJkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIGlmIChhZGRyKSB7Ci0gICAgYmRfYWRkci5Gcm9tT2N0ZXRzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGFkZHIpKTsKLSAgfQotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQmx1ZXRvb3RoQXBtSW50ZXJmYWNlLT5hY3RpdmVfZGV2aWNlX2NoYW5nZShiZF9hZGRyLCBwcm9maWxlLCBhdWRpb190eXBlKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIEFQTSBhY3RpdmVfZGV2aWNlX2NoYW5nZSwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICB9Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIGFkZHIsIDApOwotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHNldENvbnRlbnRDb250cm9sTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjb250ZW50X2NvbnRyb2xfaWQsIGppbnQgcHJvZmlsZSkgewotICBBTE9HSSgiJXM6IHNCbHVldG9vdGhBcG1JbnRlcmZhY2U6ICVwIiwgX19mdW5jX18sIHNCbHVldG9vdGhBcG1JbnRlcmZhY2UpOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0JsdWV0b290aEFwbUludGVyZmFjZSkgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCB0aGUgQmx1ZXRvb3RoIEFQTSBJbnRlcmZhY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNCbHVldG9vdGhBcG1JbnRlcmZhY2UtPnNldF9jb250ZW50X2NvbnRyb2xfaWQoY29udGVudF9jb250cm9sX2lkLCBwcm9maWxlKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIEFQTSBjb250ZW50IGNvbnRyb2wgdXBkYXRlLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gIH0KLQotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewotICAgIHsiY2xhc3NJbml0TmF0aXZlIiwgIigpViIsICh2b2lkKiljbGFzc0luaXROYXRpdmV9LAotICAgIHsiaW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopaW5pdE5hdGl2ZX0sCi0gICAgeyJjbGVhbnVwTmF0aXZlIiwgIigpViIsICh2b2lkKiljbGVhbnVwTmF0aXZlfSwKLSAgICB7ImFjdGl2ZURldmljZVVwZGF0ZU5hdGl2ZSIsICIoW0JJSSlaIiwgKHZvaWQqKWFjdGl2ZURldmljZVVwZGF0ZU5hdGl2ZX0sCi0gICAgeyJzZXRDb250ZW50Q29udHJvbE5hdGl2ZSIsICIoSUkpWiIsICh2b2lkKilzZXRDb250ZW50Q29udHJvbE5hdGl2ZX0sCi19OwotCi1pbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2FwbShKTklFbnYqIGVudikgewotICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKAotICAgICAgZW52LCAiY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9BcG1OYXRpdmVJbnRlcmZhY2UiLCBzTWV0aG9kcywKLSAgICAgIE5FTEVNKHNNZXRob2RzKSk7Ci19Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2Jyb2FkY2FzdC5jcHAgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2Jyb2FkY2FzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWEwODUuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF9icm9hZGNhc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoQmFwQnJvYWRjYXN0U2VydmljZUpuaSIKLQotI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgImNvbV9hbmRyb2lkX2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2F2LmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvYnRfYmFwX2JhLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQnJvYWRjYXN0U3RhdGVDaGFuZ2VkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BdWRpb1N0YXRlQ2hhbmdlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ29kZWNDb25maWdDaGFuZ2VkOwotLy9zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbklzb0RhdGFQYXRoQ2hhbmdlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uRW5jcnlwdGlvbktleUdlbmVyYXRlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uU2V0dXBCSUc7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkJyb2FkY2FzdElkR2VuZXJhdGVkOwotc3RhdGljIHN0cnVjdCB7Ci0gIGpjbGFzcyBjbGF6ejsKLSAgam1ldGhvZElEIGNvbnN0cnVjdG9yOwotICBqbWV0aG9kSUQgZ2V0Q29kZWNUeXBlOwotICBqbWV0aG9kSUQgZ2V0Q29kZWNQcmlvcml0eTsKLSAgam1ldGhvZElEIGdldFNhbXBsZVJhdGU7Ci0gIGptZXRob2RJRCBnZXRCaXRzUGVyU2FtcGxlOwotICBqbWV0aG9kSUQgZ2V0Q2hhbm5lbE1vZGU7Ci0gIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljMTsKLSAgam1ldGhvZElEIGdldENvZGVjU3BlY2lmaWMyOwotICBqbWV0aG9kSUQgZ2V0Q29kZWNTcGVjaWZpYzM7Ci0gIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljNDsKLX0gYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWc7Ci0KLXN0YXRpYyBjb25zdCBidGJhcF9icm9hZGNhc3RfaW50ZXJmYWNlX3QqIHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UgPSBudWxscHRyOwotc3RhdGljIHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4IGludGVyZmFjZV9tdXRleDsKLQotc3RhdGljIGpvYmplY3QgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci1zdGF0aWMgc3RkOjpzaGFyZWRfdGltZWRfbXV0ZXggY2FsbGJhY2tzX211dGV4OwotCi1zdGF0aWMgdm9pZCBidGJhcF9icm9hZGNhc3Rfc3RhdGVfY2FsbGJhY2soamludCBhZHZfaWQsIGJ0YmFwX2Jyb2FkY2FzdF9zdGF0ZV90IHN0YXRlKSB7Ci0gIEFMT0dJKCIlcyIsIF9fZnVuY19fKTsKLQotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gIEFMT0dJKCIlczogbG9jayBhY3F1aXJlZCIsIF9fZnVuY19fKTsKLSAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgQUxPR0koIiVzOmdvdCBjYWxsYmFjayBlbnYiLCBfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkgfHwgbUNhbGxiYWNrc09iaiA9PSBudWxscHRyKSB7Ci0gICAgQUxPR0koIiVzOmVpdGhlciBjYWxsYmFjayBpcyBub3QgdmFsaWQgb3IgY2FsbGJhY2tvYmogaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQUxPR0koIiVzOiBjYWxsaW5nIG1ldGhvZCB0byBuYXRpdmUgaW50ZXJmYWNlIiwgX19mdW5jX18pOwotICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vbkJyb2FkY2FzdFN0YXRlQ2hhbmdlZCwgYWR2X2lkLCAoamludClzdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0YmFwX2Jyb2FkY2FzdF9hdWRpb19zdGF0ZV9jYWxsYmFjayhqaW50IGJpZ19oYW5kbGUsIGJ0YmFwX2Jyb2FkY2FzdF9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIEFMT0dJKCIlcyIsIF9fZnVuY19fKTsKLQotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkgfHwgbUNhbGxiYWNrc09iaiA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25BdWRpb1N0YXRlQ2hhbmdlZCwgYmlnX2hhbmRsZSwgKGppbnQpc3RhdGUpOwotfQotCi1zdGF0aWMgdm9pZCBidGJhcF9icm9hZGNhc3RfYXVkaW9fY29uZmlnX2NhbGxiYWNrKGppbnQgYWR2X2lkLCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIEFMT0dJKCIlcyIsIF9fZnVuY19fKTsKLQotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkgfHwgbUNhbGxiYWNrc09iaiA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgam9iamVjdCBjb2RlY0NvbmZpZ09iaiA9IHNDYWxsYmFja0Vudi0+TmV3T2JqZWN0KAotICAgICAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY2xhenosCi0gICAgICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5jb25zdHJ1Y3RvciwKLSAgICAgIChqaW50KWNvZGVjX2NvbmZpZy5jb2RlY190eXBlLCAoamludCljb2RlY19jb25maWcuY29kZWNfcHJpb3JpdHksCi0gICAgICAoamludCljb2RlY19jb25maWcuc2FtcGxlX3JhdGUsIChqaW50KWNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAoamludCljb2RlY19jb25maWcuY2hhbm5lbF9tb2RlLCAoamxvbmcpY29kZWNfY29uZmlnLmNvZGVjX3NwZWNpZmljXzEsCi0gICAgICAoamxvbmcpY29kZWNfY29uZmlnLmNvZGVjX3NwZWNpZmljXzIsCi0gICAgICAoamxvbmcpY29kZWNfY29uZmlnLmNvZGVjX3NwZWNpZmljXzMsCi0gICAgICAoamxvbmcpY29kZWNfY29uZmlnLmNvZGVjX3NwZWNpZmljXzQpOwotCi0gIGpzaXplIGkgPSAwOwotICBqb2JqZWN0QXJyYXkgbG9jYWxfY2FwYWJpbGl0aWVzX2FycmF5ID0gc0NhbGxiYWNrRW52LT5OZXdPYmplY3RBcnJheSgKLSAgICAgIChqc2l6ZSljb2RlY19jYXBhYmlsaXRpZXMuc2l6ZSgpLAotICAgICAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY2xhenosIG51bGxwdHIpOwotICBmb3IgKGF1dG8gY29uc3QmIGNhcCA6IGNvZGVjX2NhcGFiaWxpdGllcykgewotICAgIGpvYmplY3QgY2FwT2JqID0gc0NhbGxiYWNrRW52LT5OZXdPYmplY3QoCi0gICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6LAotICAgICAgICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5jb25zdHJ1Y3RvciwKLSAgICAgICAgKGppbnQpY2FwLmNvZGVjX3R5cGUsIChqaW50KWNhcC5jb2RlY19wcmlvcml0eSwgKGppbnQpY2FwLnNhbXBsZV9yYXRlLAotICAgICAgICAoamludCljYXAuYml0c19wZXJfc2FtcGxlLCAoamludCljYXAuY2hhbm5lbF9tb2RlLAotICAgICAgICAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzEsIChqbG9uZyljYXAuY29kZWNfc3BlY2lmaWNfMiwKLSAgICAgICAgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY18zLCAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzQpOwotICAgIHNDYWxsYmFja0Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGxvY2FsX2NhcGFiaWxpdGllc19hcnJheSwgaSsrLCBjYXBPYmopOwotICAgIHNDYWxsYmFja0Vudi0+RGVsZXRlTG9jYWxSZWYoY2FwT2JqKTsKLSAgfQotCi0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uQ29kZWNDb25maWdDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2lkLCBjb2RlY0NvbmZpZ09iaiwgbG9jYWxfY2FwYWJpbGl0aWVzX2FycmF5KTsKLX0KLQotLypzdGF0aWMgdm9pZCBidGJhcF9icm9hZGNhc3RfaXNvX2RhdGFwYXRoX2NhbGxiYWNrKGppbnQgYmlnX2hhbmRsZSwgamludCBzdGF0ZSkgewotICBBTE9HSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uSXNvRGF0YVBhdGhDaGFuZ2VkLCBiaWdfaGFuZGxlLCBzdGF0ZSk7Ci19Ki8KLQotc3RhdGljIHZvaWQgYnRiYXBfYnJvYWRjYXN0X2VuY2tleV9jYWxsYmFjayhzdGQ6OnN0cmluZyBwaW4pIHsKLSAgQUxPR0koIiVzIiwgX19mdW5jX18pOwotCi0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soY2FsbGJhY2tzX211dGV4KTsKLSAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLSAgLypTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBwaW5rZXkoCi0gICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHNpemVvZihwaW4pKSk7Ci0gIGlmICghYWRkci5nZXQoKSkgewotICAgIEFMT0dFKCIlczogRmFpbCB0byBuZXcgamJ5dGVBcnJheSBiZCBhZGRyIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKAotICAgICAgcGlua2V5LmdldCgpLCAwLCBzaXplb2YocGluKSwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgamJ5dGUqPihwaW4pKTsqLwotCi0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uRW5jcnlwdGlvbktleUdlbmVyYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2FsbGJhY2tFbnYtPk5ld1N0cmluZ1VURihwaW4uY19zdHIoKSkpOwotfQotCi1zdGF0aWMgdm9pZCBidGJhcF9icm9hZGNhc3Rfc2V0dXBfYmlnX2NhbGxiYWNrKGppbnQgc2V0dXAsIGppbnQgYWR2X2lkLCBqaW50IGJpZ19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG51bV9iaXNlcywgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGJpc19oYW5kbGVzKSB7Ci0gIEFMT0dJKCIlcyIsIF9fZnVuY19fKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotICBTY29wZWRMb2NhbFJlZjxqY2hhckFycmF5PiBqYyhzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Q2hhckFycmF5KGJpc19oYW5kbGVzLnNpemUoKSkpOwotICBzQ2FsbGJhY2tFbnYtPlNldENoYXJBcnJheVJlZ2lvbihqYy5nZXQoKSwgMCwgYmlzX2hhbmRsZXMuc2l6ZSgpLCAoamNoYXIqKSBiaXNfaGFuZGxlcy5kYXRhKCkpOwotICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vblNldHVwQklHLCBzZXR1cCwgYWR2X2lkLCBiaWdfaGFuZGxlLCBudW1fYmlzZXMsIGpjLmdldCgpKTsKLX0KLQotc3RhdGljIHZvaWQgYnRiYXBfYnJvYWRjYXN0X2JpZF9jYWxsYmFjayhzdGQ6OnZlY3Rvcjx1aW50OF90PiBicm9hZGNhc3RfaWQpIHsKLSAgQUxPR0koIiVzIiwgX19mdW5jX18pOwotCi0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soY2FsbGJhY2tzX211dGV4KTsKLSAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLSAgQUxPR0koIiVzOiBicm9hZGNhc3RfaWQgc2l6ZSA9ICVkIixfX2Z1bmNfXyxicm9hZGNhc3RfaWQuc2l6ZSgpKTsKLSAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gamIoc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShicm9hZGNhc3RfaWQuc2l6ZSgpKSk7Ci0gIGlmICghamIuZ2V0KCkpIHsKLSAgICAgIEFMT0dJKCIlczpGYWlsZWQgdG8gYWxsb2NhdGUgYnl0ZSBhcnJheSIpOwotICAgICAgcmV0dXJuOwotICB9Ci0gIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGpiLmdldCgpLCAwLCBicm9hZGNhc3RfaWQuc2l6ZSgpLCAoamJ5dGUqKSBicm9hZGNhc3RfaWQuZGF0YSgpKTsKLSAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25Ccm9hZGNhc3RJZEdlbmVyYXRlZCwgamIuZ2V0KCkpOwotfQotCi1zdGF0aWMgYnRiYXBfYnJvYWRjYXN0X2NhbGxiYWNrc190IHNCbHVldG9vdGhCYXBCcm9hZGNhc3RDYWxsYmFja3MgPSB7Ci0gICAgc2l6ZW9mKHNCbHVldG9vdGhCYXBCcm9hZGNhc3RDYWxsYmFja3MpLAotICAgIGJ0YmFwX2Jyb2FkY2FzdF9zdGF0ZV9jYWxsYmFjaywKLSAgICBidGJhcF9icm9hZGNhc3RfYXVkaW9fc3RhdGVfY2FsbGJhY2ssCi0gICAgYnRiYXBfYnJvYWRjYXN0X2F1ZGlvX2NvbmZpZ19jYWxsYmFjaywKLSAgICAvL2J0YmFwX2Jyb2FkY2FzdF9pc29fZGF0YXBhdGhfY2FsbGJhY2ssCi0gICAgYnRiYXBfYnJvYWRjYXN0X2VuY2tleV9jYWxsYmFjaywKLSAgICBidGJhcF9icm9hZGNhc3Rfc2V0dXBfYmlnX2NhbGxiYWNrLAotICAgIGJ0YmFwX2Jyb2FkY2FzdF9iaWRfY2FsbGJhY2ssCi19OwotCi1zdGF0aWMgdm9pZCBjbGFzc0luaXROYXRpdmUoSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eikgewotICBqY2xhc3Mgam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcyA9Ci0gICAgICBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ29kZWNDb25maWciKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuY29uc3RydWN0b3IgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiPGluaXQ+IiwgIihJSUlJSUpKSkopViIpOwotICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1R5cGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Q29kZWNUeXBlIiwgIigpSSIpOwotICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1ByaW9yaXR5ID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjUHJpb3JpdHkiLCAiKClJIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldFNhbXBsZVJhdGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0U2FtcGxlUmF0ZSIsICIoKUkiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Qml0c1BlclNhbXBsZSA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRCaXRzUGVyU2FtcGxlIiwgIigpSSIpOwotICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDaGFubmVsTW9kZSA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDaGFubmVsTW9kZSIsICIoKUkiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzEgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjU3BlY2lmaWMxIiwgIigpSiIpOwotICBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMiA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICBqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Q29kZWNTcGVjaWZpYzIiLCAiKClKIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMzID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1NwZWNpZmljMyIsICIoKUoiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzQgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjU3BlY2lmaWM0IiwgIigpSiIpOwotCi0gIG1ldGhvZF9vbkJyb2FkY2FzdFN0YXRlQ2hhbmdlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25Ccm9hZGNhc3RTdGF0ZUNoYW5nZWQiLCAiKElJKVYiKTsKLQotICBtZXRob2Rfb25BdWRpb1N0YXRlQ2hhbmdlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25BdWRpb1N0YXRlQ2hhbmdlZCIsICIoSUkpViIpOwotCi0gIG1ldGhvZF9vbkNvZGVjQ29uZmlnQ2hhbmdlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25Db2RlY0NvbmZpZ0NoYW5nZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAiKElMYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ29kZWNDb25maWc7IgotICAgICAgICAgICAgICAgICAgICAgICAiW0xhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZzspViIpOwotCi0vLyAgbWV0aG9kX29uSXNvRGF0YVBhdGhDaGFuZ2VkID0KLS8vICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uSXNvRGF0YVBhdGhDaGFuZ2VkIiwiKElJKVYiKTsKLSAgbWV0aG9kX29uRW5jcnlwdGlvbktleUdlbmVyYXRlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25FbmNyeXB0aW9uS2V5R2VuZXJhdGVkIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOwotCi0gIG1ldGhvZF9vblNldHVwQklHID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uU2V0dXBCSUciLCAiKElJSUlbQylWIik7Ci0gIG1ldGhvZF9vbkJyb2FkY2FzdElkR2VuZXJhdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQnJvYWRjYXN0SWRHZW5lcmF0ZWQiLCAiKFtCKVYiKTsKLQotICBBTE9HSSgiJXM6IHN1Y2NlZWRzIiwgX19mdW5jX18pOwotfQotc3RhdGljIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBwcmVwYXJlX2NvZGVjX2NvbmZpZygKLSAgICAgICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LGpvYmplY3QgamNvZGVjQ29uZmlnKSB7Ci0KLSAgLyppZiAoIWVudi0+SXNJbnN0YW5jZU9mKGpjb2RlY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6KSkgewotICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEJsdWV0b290aENvZGVjQ29uZmlnIGluc3RhbmNlIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuICgoYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KU5VTEwpOwotICB9Ki8KLSAgamludCBjb2RlY1R5cGUgPSBlbnYtPkNhbGxJbnRNZXRob2QoCi0gICAgamNvZGVjQ29uZmlnLCBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1R5cGUpOwotICBqaW50IGNvZGVjUHJpb3JpdHkgPSBlbnYtPkNhbGxJbnRNZXRob2QoCi0gICAgamNvZGVjQ29uZmlnLCBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1ByaW9yaXR5KTsKLSAgamludCBzYW1wbGVSYXRlID0gZW52LT5DYWxsSW50TWV0aG9kKAotICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0U2FtcGxlUmF0ZSk7Ci0gIGppbnQgYml0c1BlclNhbXBsZSA9IGVudi0+Q2FsbEludE1ldGhvZCgKLSAgICBqY29kZWNDb25maWcsIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldEJpdHNQZXJTYW1wbGUpOwotICBqaW50IGNoYW5uZWxNb2RlID0gZW52LT5DYWxsSW50TWV0aG9kKAotICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q2hhbm5lbE1vZGUpOwotICBqbG9uZyBjb2RlY1NwZWNpZmljMSA9IGVudi0+Q2FsbExvbmdNZXRob2QoCi0gICAgamNvZGVjQ29uZmlnLCBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMSk7Ci0gIGpsb25nIGNvZGVjU3BlY2lmaWMyID0gZW52LT5DYWxsTG9uZ01ldGhvZCgKLSAgICBqY29kZWNDb25maWcsIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMyKTsKLSAgamxvbmcgY29kZWNTcGVjaWZpYzMgPSBlbnYtPkNhbGxMb25nTWV0aG9kKAotICAgIGpjb2RlY0NvbmZpZywgYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzMpOwotICBqbG9uZyBjb2RlY1NwZWNpZmljNCA9IGVudi0+Q2FsbExvbmdNZXRob2QoCi0gICAgamNvZGVjQ29uZmlnLCBhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljNCk7Ci0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZyA9IHsKLSAgICAgICAgIC5jb2RlY190eXBlID0gc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3Q+KGNvZGVjVHlwZSksCi0gICAgICAgICAuY29kZWNfcHJpb3JpdHkgPQotICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90Pihjb2RlY1ByaW9yaXR5KSwKLSAgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHN0YXRpY19jYXN0PGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90PihzYW1wbGVSYXRlKSwKLSAgICAgICAgIC5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdD4oYml0c1BlclNhbXBsZSksCi0gICAgICAgICAuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3Q+KGNoYW5uZWxNb2RlKSwKLSAgICAgICAgIC5jb2RlY19zcGVjaWZpY18xID0gY29kZWNTcGVjaWZpYzEsCi0gICAgICAgICAuY29kZWNfc3BlY2lmaWNfMiA9IGNvZGVjU3BlY2lmaWMyLAotICAgICAgICAgLmNvZGVjX3NwZWNpZmljXzMgPSBjb2RlY1NwZWNpZmljMywKLSAgICAgICAgIC5jb2RlY19zcGVjaWZpY180ID0gY29kZWNTcGVjaWZpYzR9OwotICByZXR1cm4gY29kZWNfY29uZmlnOwotfQotCi1zdGF0aWMgdm9pZCBpbml0TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgamludCBtYXhCcm9hZGNhc3QsIGpvYmplY3QgY29kZWNDb25maWcsIGppbnQgbW9kZSkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBpbnRlcmZhY2VfbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBjYWxsYmFja3NfbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidEluZiA9IGdldEJsdWV0b290aEludGVyZmFjZSgpOwotICBpZiAoYnRJbmYgPT0gbnVsbHB0cikgewotICAgIEFMT0dFKCIlczogQmx1ZXRvb3RoIG1vZHVsZSBpcyBub3QgbG9hZGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBBTE9HVygiJXM6IENsZWFuaW5nIHVwIEJhcEJyb2FkY2FzdCBJbnRlcmZhY2UgYmVmb3JlIGluaXRpYWxpemluZy4uLiIsIF9fZnVuY19fKTsKLSAgICBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlLT5jbGVhbnVwKCk7Ci0gICAgc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAobUNhbGxiYWNrc09iaiAhPSBudWxscHRyKSB7Ci0gICAgQUxPR1coIiVzOiBDbGVhbmluZyB1cCBCYXBCcm9hZGNhc3QgY2FsbGJhY2sgb2JqZWN0IiwgX19mdW5jX18pOwotICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1DYWxsYmFja3NPYmopOwotICAgIG1DYWxsYmFja3NPYmogPSBudWxscHRyOwotICB9Ci0KLSAgaWYgKChtQ2FsbGJhY2tzT2JqID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KSkgPT0gbnVsbHB0cikgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIEdsb2JhbCBSZWYgZm9yIGJhcCBicm9hZGNhc3QgQ2FsbGJhY2tzIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6ID0gKGpjbGFzcyllbnYtPk5ld0dsb2JhbFJlZigKLSAgICAgIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZyIpKTsKLSAgaWYgKGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6ID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBHbG9iYWwgUmVmIGZvciBCbHVldG9vdGhDb2RlY0NvbmZpZyBjbGFzcyIsCi0gICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UgPQotICAgICAgKGJ0YmFwX2Jyb2FkY2FzdF9pbnRlcmZhY2VfdCopYnRJbmYtPmdldF9wcm9maWxlX2ludGVyZmFjZSgKLSAgICAgICAgICBCVF9QUk9GSUxFX0JBUF9CUk9BRENBU1RfSUQpOwotICBpZiAoc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IEJsdWV0b290aCBCYXBCcm9hZGNhc3QgSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnID0KLSAgICAgICAgICAgICAgICAgcHJlcGFyZV9jb2RlY19jb25maWcoZW52LCBvYmplY3QsIGNvZGVjQ29uZmlnKTsKLSAgLyppZiAoY29kZWNfY29uZmlnID09IE5VTEwpIHsKLSAgICBBTE9HRSgiJXM6SW52YWxpZCBjb2RlYyBjb25maWciLF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0qLwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlLT5pbml0KAotICAgICAgJnNCbHVldG9vdGhCYXBCcm9hZGNhc3RDYWxsYmFja3MsIG1heEJyb2FkY2FzdCwgY29kZWNfY29uZmlnLCBtb2RlKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgQmx1ZXRvb3RoIEEyRFAsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICBzdGF0dXMpOwotICAgIHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UgPSBudWxscHRyOwotICAgIHJldHVybjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBpbnRlcmZhY2VfbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBjYWxsYmFja3NfbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidEluZiA9IGdldEJsdWV0b290aEludGVyZmFjZSgpOwotICBpZiAoYnRJbmYgPT0gbnVsbHB0cikgewotICAgIEFMT0dFKCIlczogQmx1ZXRvb3RoIG1vZHVsZSBpcyBub3QgbG9hZGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlLT5jbGVhbnVwKCk7Ci0gICAgc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhDb2RlY0NvbmZpZy5jbGF6eik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aENvZGVjQ29uZmlnLmNsYXp6ID0gbnVsbHB0cjsKLQotICBpZiAobUNhbGxiYWNrc09iaiAhPSBudWxscHRyKSB7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLX0KLQotc3RhdGljIGpib29sZWFuIHNldEFjdGl2ZURldmljZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIGVuYWJsZSwgamludCBhZHZfaWQpIHsKLSAgQUxPR0koIiVzOiBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlOiAlcCIsIF9fZnVuY19fLCBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdGhlIEJhcEJyb2FkY2FzdCBJbnRlcmZhY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlLT5zZXRfYnJvYWRjYXN0X2FjdGl2ZShlbmFibGUsIGFkdl9pZCk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gZW5hYmxlQnJvYWRjYXN0TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgam9iamVjdCBjb2RlY0NvbmZpZykgewotICBBTE9HSSgiJXM6IHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2U6ICVwIiwgX19mdW5jX18sIHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UpOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnID0KLSAgICAgICAgICAgICAgIHByZXBhcmVfY29kZWNfY29uZmlnKGVudiwgb2JqZWN0LCBjb2RlY0NvbmZpZyk7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHRoZSBCYXBCcm9hZGNhc3QgSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZS0+ZW5hYmxlX2Jyb2FkY2FzdChjb2RlY19jb25maWcpOwotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIGRpc2FibGVCcm9hZGNhc3ROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IGFkdl9pZCkgewotICBBTE9HSSgiJXM6IHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2U6ICVwIiwgX19mdW5jX18sIHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UpOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSkgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCB0aGUgQmFwQnJvYWRjYXN0IEludGVyZmFjZSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UtPmRpc2FibGVfYnJvYWRjYXN0KGFkdl9pZCk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gc2V0dXBBdWRpb1BhdGhOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqYm9vbGVhbiBlbmFibGUsamludCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlnX2hhbmRsZSwgamludCBudW1fYmlzZXMsIGppbnRBcnJheSBiaXNlcykgewotICBBTE9HSSgiJXM6IHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2U6ICVwIiwgX19mdW5jX18sIHNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UpOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSkgewotICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCB0aGUgQmFwQnJvYWRjYXN0IEludGVyZmFjZSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0gIGppbnQqIGJpc19oYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGJpc2VzLCBOVUxMKTsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZS0+c2V0dXBfYXVkaW9wYXRoKGVuYWJsZSwgYWR2X2lkLCBiaWdfaGFuZGxlLCBudW1fYmlzZXMsIGJpc19oYW5kbGVzKTsKLSAgcmV0dXJuIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyBqc3RyaW5nIGdldEVuY3J5cHRpb25LZXlOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gIEFMT0dJKCIlczogc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZTogJXAiLCBfX2Z1bmNfXywgc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSk7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHRoZSBCYXBCcm9hZGNhc3QgSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgc3Rkc3RyID0gc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZS0+Z2V0X2VuY3J5cHRpb25fa2V5KCk7Ci0gIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihzdGRzdHIuY19zdHIoKSk7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBzZXRFbmNyeXB0aW9uS2V5TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamJvb2xlYW4gZW5hYmxlZCwgamludCBsZW5ndGgpIHsKLSAgQUxPR0koIiVzOiBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlOiAlcCIsIF9fZnVuY19fLCBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlKTsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNCbHVldG9vdGhCYXBCcm9hZGNhc3RJbnRlcmZhY2UpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgdGhlIEJhcEJyb2FkY2FzdCBJbnRlcmZhY2UiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlLT5zZXRfZW5jcnlwdGlvbihlbmFibGVkLCBsZW5ndGgpOwotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBhZHZfaGFuZGxlLCBqb2JqZWN0IGNvZGVjQ29uZmlnKSB7Ci0gIEFMT0dJKCIlczogc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZTogJXAiLCBfX2Z1bmNfXywgc0JsdWV0b290aEJhcEJyb2FkY2FzdEludGVyZmFjZSk7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IHRoZSBCYXBCcm9hZGNhc3QgSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZyA9Ci0gICAgICAgICAgICAgICBwcmVwYXJlX2NvZGVjX2NvbmZpZyhlbnYsIG9iamVjdCwgY29kZWNDb25maWcpOwotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQmx1ZXRvb3RoQmFwQnJvYWRjYXN0SW50ZXJmYWNlLT5jb2RlY19jb25maWdfY2hhbmdlKGFkdl9oYW5kbGUsIGNvZGVjX2NvbmZpZyk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCi0gICAgeyJpbml0TmF0aXZlIiwgIihJTGFuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjQ29uZmlnO0kpViIsCi0gICAgICh2b2lkKilpbml0TmF0aXZlfSwKLSAgICB7ImNsZWFudXBOYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsZWFudXBOYXRpdmV9LAotICAgIHsic2V0QWN0aXZlRGV2aWNlTmF0aXZlIiwgIihaSSlaIiwgKHZvaWQqKXNldEFjdGl2ZURldmljZU5hdGl2ZX0sCi0gICAgeyJlbmFibGVCcm9hZGNhc3ROYXRpdmUiLCAiKExhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZzspWiIsICh2b2lkKillbmFibGVCcm9hZGNhc3ROYXRpdmV9LAotICAgIHsiZGlzYWJsZUJyb2FkY2FzdE5hdGl2ZSIsICIoSSlaIiwgKHZvaWQqKWRpc2FibGVCcm9hZGNhc3ROYXRpdmV9LAotICAgIHsiZ2V0RW5jcnlwdGlvbktleU5hdGl2ZSIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkKilnZXRFbmNyeXB0aW9uS2V5TmF0aXZlfSwKLSAgICB7InNldEVuY3J5cHRpb25LZXlOYXRpdmUiLCAiKFpJKVoiLCAodm9pZCopc2V0RW5jcnlwdGlvbktleU5hdGl2ZX0sCi0gICAgeyJzZXR1cEF1ZGlvUGF0aE5hdGl2ZSIsICIoWklJSVtJKVoiLCAodm9pZCopc2V0dXBBdWRpb1BhdGhOYXRpdmV9LAotICAgIHsic2V0Q29kZWNDb25maWdQcmVmZXJlbmNlTmF0aXZlIiwKLSAgICAgIihJTGFuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjQ29uZmlnOylaIiwKLSAgICAgKHZvaWQqKXNldENvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZX0sCi19OwotCi1pbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2JhcF9icm9hZGNhc3QoSk5JRW52KiBlbnYpIHsKLSAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcygKLSAgICAgIGVudiwgImNvbS9hbmRyb2lkL2JsdWV0b290aC9icm9hZGNhc3QvQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlIiwgc01ldGhvZHMsCi0gICAgICBORUxFTShzTWV0aG9kcykpOwotfQotCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2J0c2VydmljZV9BZGFwdGVyU2VydmljZUV4dC5jcHAgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2J0c2VydmljZV9BZGFwdGVyU2VydmljZUV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NjMzMTAuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF9idHNlcnZpY2VfQWRhcHRlclNlcnZpY2VFeHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCi0jaW5jbHVkZSAiY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2V4dC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSAgaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9hZHZfYXVkaW9fcHJvZmlsZXMoSk5JRW52KiBlbnYpIHsKLSAgICBBTE9HRSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgICBpbnQgc3RhdHVzID0gYW5kcm9pZDo6cmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2NzaXBfY2xpZW50KGVudik7Ci0gICAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICAgIEFMT0dFKCJqbmkgY3NpcCByZWdpc3RyYXRpb24gZmFpbHVyZTogJWQiLCBzdGF0dXMpOwotICAgICAgcmV0dXJuIEpOSV9FUlI7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gYW5kcm9pZDo6cmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2FjbShlbnYpOwotICAgIGlmIChzdGF0dXMgPCAwKSB7Ci0gICAgICBBTE9HRSgiam5pIGFjbSByZWdpc3RyYXRpb24gZmFpbHVyZTogJWQiLCBzdGF0dXMpOwotICAgICAgcmV0dXJuIEpOSV9FUlI7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gYW5kcm9pZDo6cmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2FwbShlbnYpOwotICAgIGlmIChzdGF0dXMgPCAwKSB7Ci0gICAgICBBTE9HRSgiam5pIEFQTSByZWdpc3RyYXRpb24gZmFpbHVyZTogJWQiLCBzdGF0dXMpOwotICAgICAgcmV0dXJuIEpOSV9FUlI7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gYW5kcm9pZDo6cmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2JhcF9icm9hZGNhc3QoZW52KTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgQUxPR0UoImpuaSBiYXAgYnJvYWRjYXN0IHJlZ2lzdHJhdGlvbiBmYWlsdXJlOiAlZCIsIHN0YXR1cyk7Ci0gICAgICByZXR1cm4gSk5JX0VSUjsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBhbmRyb2lkOjpyZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfdmNwX2NvbnRyb2xsZXIoZW52KTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgQUxPR0UoImpuaSB2Y3AgY29udHJvbGxlciByZWdpc3RyYXRpb24gZmFpbHVyZTogJWQiLCBzdGF0dXMpOwotICAgICAgcmV0dXJuIEpOSV9FUlI7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gYW5kcm9pZDo6cmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfY2xpZW50KGVudik7Ci0gICAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICAgIEFMT0dFKCJqbmkgcGFjcyBjbGllbnQgcmVnaXN0cmF0aW9uIGZhaWx1cmU6ICVkIiwgc3RhdHVzKTsKLSAgICAgIHJldHVybiBKTklfRVJSOwotICAgIH0KLSAgICBzdGF0dXMgPSBhbmRyb2lkOjpyZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfY2FsbF9jb250cm9sbGVyKGVudik7Ci0gICAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICAgIEFMT0dFKCJqbmkgQ0MgcmVnaXN0cmF0aW9uIGZhaWx1cmU6ICVkIiwgc3RhdHVzKTsKLSAgICAgIHJldHVybiBKTklfRVJSOwotICAgIH0KLQotICAgIHN0YXR1cyA9IGFuZHJvaWQ6OnJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9tY3AoZW52KTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgQUxPR0UoImpuaSBtY3AgcmVnaXN0cmF0aW9uIGZhaWx1cmU6ICVkIiwgc3RhdHVzKTsKLSAgICAgIHJldHVybiBKTklfRVJSOwotICAgIH0KLSAgICByZXR1cm4gSk5JX1ZFUlNJT05fMV82OwotICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2NjLmNwcCBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfY2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIwM2VhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfY2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qCi0gKkNvcHlyaWdodCAoYykgMjAyMC0yMDIxLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICogQ29weXJpZ2h0IDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJsdWV0b290aENDU2VydmljZUpuaSIKLQotI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c2hhcmVkX211dGV4PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImNvbV9hbmRyb2lkX2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2JsdWV0b290aF9jYWxsY29udHJvbF9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9ibHVldG9vdGhfY2FsbGNvbnRyb2xfaW50ZXJmYWNlLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6Y2FsbF9jb250cm9sOjpDYWxsQ29udHJvbGxlckNhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6Y2FsbF9jb250cm9sOjpDYWxsQ29udHJvbGxlckludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXN0YXRpYyBDYWxsQ29udHJvbGxlckludGVyZmFjZSogc0NhbGxDb250cm9sbGVySW50ZXJmYWNlID0gbnVsbHB0cjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotc3RhdGljIGptZXRob2RJRCBtZXRob2RfQ2FsbENvbnRyb2xJbml0aWFsaXplZENhbGxiYWNrOwotc3RhdGljIGptZXRob2RJRCBtZXRob2RfT25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2RfQ2FsbENvbnRyb2xQb2ludENoYW5nZWRSZXF1ZXN0Owotc3RhdGljIHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4IGludGVyZmFjZV9tdXRleDsKLXN0YXRpYyBqb2JqZWN0IG1DYWxsYmFja3NPYmogPSBudWxscHRyOwotc3RhdGljIHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4IGNhbGxiYWNrc19tdXRleDsKLQotY2xhc3MgQ2FsbENvbnRyb2xsZXJDYWxsYmFja3NJbXBsIDogcHVibGljIENhbGxDb250cm9sbGVyQ2FsbGJhY2tzIHsKLSAgIHB1YmxpYzoKLSAgfkNhbGxDb250cm9sbGVyQ2FsbGJhY2tzSW1wbCgpID0gZGVmYXVsdDsKLSAgdm9pZCBDYWxsQ29udHJvbEluaXRpYWxpemVkQ2FsbGJhY2sodWludDhfdCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gICAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX0NhbGxDb250cm9sSW5pdGlhbGl6ZWRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KXN0YXRlKTsKLSAgfQotICB2b2lkIENvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKHVpbnQ4X3Qgc3RhdGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICAgIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gICAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLSAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHNpemVvZihSYXdBZGRyZXNzKSkpOwotICAgIGlmICghYWRkci5nZXQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIgZm9yIGNvbm5lY3Rpb24gc3RhdGUiOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpieXRlKikmYmRfYWRkcik7Ci0gICAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2RfT25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpc3RhdGUsIGFkZHIuZ2V0KCkpOwotICB9Ci0KLSAgdm9pZCBDYWxsQ29udHJvbENhbGxiYWNrKHVpbnQ4X3Qgb3AsIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHBfaW5kaWNlcywgaW50IGNvdW50LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1cmlfZGF0YSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gICAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gYWRkcigKLSAgICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgICBpZiAoIWFkZHIuZ2V0KCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBuZXcgamJ5dGVBcnJheSBiZCBhZGRyIGZvciBjb25uZWN0aW9uIHN0YXRlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU2NvcGVkTG9jYWxSZWY8amludEFycmF5PiBpbmRpY2VzKHNDYWxsYmFja0Vudi5nZXQoKSwgKGppbnRBcnJheSlzQ2FsbGJhY2tFbnYtPk5ld0ludEFycmF5KGNvdW50KSk7Ci0gICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gb3JpZ2luYXRlX3VyaSgKLSAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHVyaV9kYXRhLnNpemUoKSkpOwotICAgIGlmICghb3JpZ2luYXRlX3VyaS5nZXQoKSkgewotICAgICAgICBBTE9HRSgiRXJyb3Igd2hpbGUgYWxsb2NhdGlvbiBieXRlIGFycmF5IGZvciB1cmkgZGF0YSBpbiAlcyIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihvcmlnaW5hdGVfdXJpLmdldCgpLCAwLCB1cmlfZGF0YS5zaXplKCksCi0gICAgICAgICAgIChqYnl0ZSopdXJpX2RhdGEuZGF0YSgpKTsKLQotICAgIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIuZ2V0KCksIDAsIHNpemVvZihSYXdBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSZiZF9hZGRyKTsKLSAgICBzQ2FsbGJhY2tFbnYtPlNldEludEFycmF5UmVnaW9uKGluZGljZXMuZ2V0KCksIDAsIGNvdW50LChqaW50KilwX2luZGljZXMuZGF0YSgpKTsKLSAgICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9DYWxsQ29udHJvbFBvaW50Q2hhbmdlZFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpb3AsIGluZGljZXMuZ2V0KCksIChqaW50KWNvdW50LCBvcmlnaW5hdGVfdXJpLmdldCgpLCBhZGRyLmdldCgpKTsKLSAgfQotfTsKLQotc3RhdGljIENhbGxDb250cm9sbGVyQ2FsbGJhY2tzSW1wbCBzQ2FsbENvbnRyb2xsZXJDYWxsYmFja3M7Ci0KLXN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7Ci0gIG1ldGhvZF9DYWxsQ29udHJvbEluaXRpYWxpemVkQ2FsbGJhY2sgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImNhbGxDb250cm9sSW5pdGlhbGl6ZWRDYWxsYmFjayIsICIoSSlWIik7Ci0gIG1ldGhvZF9PbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCIsICIoSVtCKVYiKTsKLSAgbWV0aG9kX0NhbGxDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiY2FsbENvbnRyb2xQb2ludENoYW5nZWRSZXF1ZXN0IiwgIihJW0lJW0JbQilWIik7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgOiBzdWNjZWVkcyI7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgamludCBtYXhfY2NzX2NsaWVudHMsIGpib29sZWFuIGluYmFuZF9yaW5naW5nX2VuYWJsZWQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKCFidEluZikgewotICAgIEFMT0dFKCIlczogQmx1ZXRvb3RoIG1vZHVsZSBpcyBub3QgbG9hZGVkIiwgX19mdW5jX18pOwotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HSSgiJXM6IENsZWFuaW5nIHVwIEJsdWV0b290aCBDYWxsQ29udHJvbCBJbnRlcmZhY2UgYmVmb3JlIGluaXRpYWxpemluZyIsCi0gICAgICAgICAgX19mdW5jX18pOwotICAgIHNDYWxsQ29udHJvbGxlckludGVyZmFjZS0+Q2xlYW51cCgpOwotICAgIHNDYWxsQ29udHJvbGxlckludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAobUNhbGxiYWNrc09iaikgewotICAgIEFMT0dJKCIlczogQ2xlYW5pbmcgdXAgQmx1ZXRvb3RoIENhbGxDb250cm9sIGNhbGxiYWNrIG9iamVjdCIsIF9fZnVuY19fKTsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2FsbGJhY2tzT2JqKTsKLSAgICBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLSAgfQotCi0gIGNvbnN0IGNoYXIqIF91dWlkID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh1dWlkLCBudWxscHRyKTsKLQotICBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UgPQotICAgICAgKENhbGxDb250cm9sbGVySW50ZXJmYWNlKilidEluZi0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgICAgIEJUX1BST0ZJTEVfQ0NfSUQpOwotICBpZiAoIXNDYWxsQ29udHJvbGxlckludGVyZmFjZSkgewotICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGdldCBCbHVldG9vdGggQ2FsbENvbnRyb2wgSW50ZXJmYWNlIiwgX19mdW5jX18pOwotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybjsKLSAgfQotICBidF9zdGF0dXNfdCBzdGF0dXMgPQotICAgICAgc0NhbGxDb250cm9sbGVySW50ZXJmYWNlLT5Jbml0KCZzQ2FsbENvbnRyb2xsZXJDYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbVN0cmluZyhfdXVpZCksIG1heF9jY3NfY2xpZW50cywgaW5iYW5kX3JpbmdpbmdfZW5hYmxlZCk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIExFIGF1ZGlvIENhbGwgY29udHJvbCBJbnRlcmZhY2UsIHN0YXR1czogJWQiLAotICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHNDYWxsQ29udHJvbGxlckludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnModXVpZCwgX3V1aWQpOwotICBtQ2FsbGJhY2tzT2JqID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UgIT0gbnVsbHB0cikgewotICAgIHNDYWxsQ29udHJvbGxlckludGVyZmFjZS0+Q2xlYW51cCgpOwotICAgIHNDYWxsQ29udHJvbGxlckludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAobUNhbGxiYWNrc09iaiAhPSBudWxscHRyKSB7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLX0KLQotc3RhdGljIGpib29sZWFuIHVwZGF0ZUJlYXJlck5hbWVOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIG9wZXJhdG9yX3N0cikgewotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0NhbGxDb250cm9sbGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1coIiVzOiBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0gIGNvbnN0IGNoYXIqIG9wZXJhdG9yX25hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKG9wZXJhdG9yX3N0ciwgbnVsbHB0cik7Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9Ci0gICAgICBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UtPlVwZGF0ZUJlYXJlck5hbWUoKHVpbnQ4X3QqKW9wZXJhdG9yX25hbWUpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB1cGRhdGVCZWFyZXJOYW1lTmF0aXZlLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKLSAgfQotICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhvcGVyYXRvcl9zdHIsIG9wZXJhdG9yX25hbWUpOwotICByZXR1cm4gKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHVwZGF0ZUJlYXJlclRlY2hub2xvZ3lOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiZWFyZXJfdGVjaCkgewotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0NhbGxDb250cm9sbGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1coIiVzOiBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNDYWxsQ29udHJvbGxlckludGVyZmFjZS0+VXBkYXRlQmVhcmVyVGVjaG5vbG9neShiZWFyZXJfdGVjaCk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHVwZGF0ZUJlYXJlclRlY2hub2xvZ3lOYXRpdmUsIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICB9Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gdXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGJlYXJlcl9saXN0KSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVygiJXM6IHNDYWxsQ29udHJvbGxlckludGVyZmFjZSBpcyBudWxsIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgY29uc3QgY2hhciogbGlzdF9iZWFyZXJfc3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhiZWFyZXJfbGlzdCwgbnVsbHB0cik7Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IHNDYWxsQ29udHJvbGxlckludGVyZmFjZS0+VXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdCgodWludDhfdCopbGlzdF9iZWFyZXJfc3RyaW5nKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCJGYWlsZWQgdXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdE5hdGl2ZSwgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gIH0KLSAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYmVhcmVyX2xpc3QsIGxpc3RfYmVhcmVyX3N0cmluZyk7Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi0KLXN0YXRpYyBqYm9vbGVhbiBjYWxsQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGZlYXR1cmUpIHsKLSAgIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgIGlmICghc0NhbGxDb250cm9sbGVySW50ZXJmYWNlKSB7Ci0gICAgIEFMT0dXKCIlczogc0NhbGxDb250cm9sbGVySW50ZXJmYWNlIGlzIG51bGwiLCBfX2Z1bmNfXyk7Ci0gICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICB9Ci0gICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UtPkNhbGxDb250cm9sT3B0aW9uYWxPcFN1cHBvcnRlZChmZWF0dXJlKTsKLSAgIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gdXBkYXRlU3RhdHVzRmxhZ3NOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGZsYWdzKSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVygiJXM6IHNDYWxsQ29udHJvbGxlckludGVyZmFjZSBpcyBudWxsIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0NhbGxDb250cm9sbGVySW50ZXJmYWNlLT5VcGRhdGVTdGF0dXNGbGFncyhmbGFncyk7Ci0KLSAgcmV0dXJuIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiB1cGRhdGVTaWduYWxTdGF0dXNOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzaWduYWwpIHsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNDYWxsQ29udHJvbGxlckludGVyZmFjZSkgewotICAgIEFMT0dXKCIlczogc0NhbGxDb250cm9sbGVySW50ZXJmYWNlIGlzIG51bGwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UtPlVwZGF0ZVNpZ25hbFN0YXR1cyhzaWduYWwpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgQUxPR0UoIkZBSUxFRCB1cGRhdGVTaWduYWxTdGF0dXNOYXRpdmUsIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICB9Ci0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotc3RhdGljIGpib29sZWFuIHVwZGF0ZUluY29taW5nQ2FsbE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGluZGV4LCBqc3RyaW5nIHVyaV9zdHIpIHsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNDYWxsQ29udHJvbGxlckludGVyZmFjZSkgewotICAgIEFMT0dXKCIlczogc0NhbGxDb250cm9sbGVySW50ZXJmYWNlIGlzIG51bGwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBjb25zdCBjaGFyKiB1cmkgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHVyaV9zdHIsIG51bGxwdHIpOwotICBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UtPlVwZGF0ZUluY29taW5nQ2FsbChpbmRleCwgKHVpbnQ4X3QqKXVyaSk7Ci0gIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHVyaV9zdHIsIHVyaSk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIGNhbGxDb250cm9sUmVzcG9uc2VOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG9wLCBqaW50IGluZGV4LCBqaW50IHN0YXR1cywgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVygiJXM6IHNDYWxsQ29udHJvbGxlckludGVyZmFjZSBpcyBudWxsIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgamJ5dGUqIGFkZHIgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIG51bGxwdHIpOwotICBpZiAoIWFkZHIpIHsKLSAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBSYXdBZGRyZXNzKiB0bXByYXcgPSAoUmF3QWRkcmVzcyopYWRkcjsKLSAgYnRfc3RhdHVzX3QgcmV0X3N0YXR1cyA9Ci0gICAgICBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UtPkNhbGxDb250cm9sUmVzcG9uc2Uob3AsIGluZGV4LCBzdGF0dXMsICp0bXByYXcpOwotICBpZiAocmV0X3N0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VuZCBjYWxsQ29udHJvbFJlc3BvbnNlTmF0aXZlLCBzdGF0dXM6ICVkIiwgcmV0X3N0YXR1cyk7Ci0gIH0KLSAgcmV0dXJuIChyZXRfc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc2V0X2lkLCBqYnl0ZUFycmF5IGFkZHJlc3MpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0NhbGxDb250cm9sbGVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotICBzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UtPlNldEFjdGl2ZURldmljZSgqdG1wcmF3LCBzZXRfaWQpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLQotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBjYWxsU3RhdGVOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICBqYnl0ZUFycmF5IGNhbGxMaXN0KSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotCi0gIGpieXRlKiBjTGlzdCA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoY2FsbExpc3QsIE5VTEwpOwotICBpZiAoIWNMaXN0KSB7Ci0gICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgRUlOVkFMKTsKLSAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgdWludDE2X3QgYXJyYXlfbGVuID0gKHVpbnQxNl90KWVudi0+R2V0QXJyYXlMZW5ndGgoY2FsbExpc3QpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY3RfdmFsKGNMaXN0LCBjTGlzdCArIGFycmF5X2xlbik7Ci0KLSAgaWYgKCFzQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVygiJXM6IHNDYWxsQ29udHJvbGxlckludGVyZmFjZSBpcyBudWxsIiwgX19mdW5jX18pOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgc0NhbGxDb250cm9sbGVySW50ZXJmYWNlLT5DYWxsU3RhdGUobGVuLCBzdGQ6Om1vdmUodmVjdF92YWwpKTsKLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoY2FsbExpc3QsIGNMaXN0LCAwKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gY29udGVudENvbnRyb2xJZE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjY2lkKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0NhbGxDb250cm9sbGVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIHNDYWxsQ29udHJvbGxlckludGVyZmFjZS0+Q29udGVudENvbnRyb2xJZChjY2lkKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc0NhbGxDb250cm9sbGVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgRUlOVkFMKTsKLSAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgUmF3QWRkcmVzcyogdG1wcmF3ID0gKFJhd0FkZHJlc3MqKWFkZHI7Ci0KLSAgc0NhbGxDb250cm9sbGVySW50ZXJmYWNlLT5EaXNjb25uZWN0KCp0bXByYXcpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCi0gICAgeyJpbml0aWFsaXplTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztJWilWIiwgKHZvaWQqKWluaXRpYWxpemVOYXRpdmV9LAotICAgIHsiY2xlYW51cE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xlYW51cE5hdGl2ZX0sCi0gICAgeyJ1cGRhdGVCZWFyZXJOYW1lTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkKil1cGRhdGVCZWFyZXJOYW1lTmF0aXZlfSwKLSAgICB7InVwZGF0ZUJlYXJlclRlY2hub2xvZ3lOYXRpdmUiLCAiKEkpWiIsICh2b2lkKil1cGRhdGVCZWFyZXJUZWNobm9sb2d5TmF0aXZlfSwKLSAgICB7InVwZGF0ZVN1cHBvcnRlZEJlYXJlckxpc3ROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQqKXVwZGF0ZVN1cHBvcnRlZEJlYXJlckxpc3ROYXRpdmV9LAotICAgIHsidXBkYXRlU2lnbmFsU3RhdHVzTmF0aXZlIiwgIihJKVoiLCAodm9pZCopdXBkYXRlU2lnbmFsU3RhdHVzTmF0aXZlfSwKLSAgICB7InVwZGF0ZVN0YXR1c0ZsYWdzTmF0aXZlIiwgIihJKVoiLCAodm9pZCopdXBkYXRlU3RhdHVzRmxhZ3NOYXRpdmV9LAotICAgIHsidXBkYXRlSW5jb21pbmdDYWxsTmF0aXZlIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopdXBkYXRlSW5jb21pbmdDYWxsTmF0aXZlfSwKLSAgICB7ImNhbGxDb250cm9sUmVzcG9uc2VOYXRpdmUiLCAiKElJSVtCKVoiLCAodm9pZCopY2FsbENvbnRyb2xSZXNwb25zZU5hdGl2ZX0sCi0gICAgeyJjYWxsU3RhdGVOYXRpdmUiLCAiKElbQilaIiwgKHZvaWQqKWNhbGxTdGF0ZU5hdGl2ZX0sCi0gICAgeyJjYWxsQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkTmF0aXZlIiwgIihJKVoiLCAodm9pZCopY2FsbENvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZE5hdGl2ZX0sCi0gICAgeyJzZXRBY3RpdmVEZXZpY2VOYXRpdmUiLCAiKElbQilaIiwgKHZvaWQqKXNldEFjdGl2ZURldmljZU5hdGl2ZX0sCi0gICAgeyJjb250ZW50Q29udHJvbElkTmF0aXZlIiwgIihJKVoiLCAodm9pZCopY29udGVudENvbnRyb2xJZE5hdGl2ZX0sCi0gICAgeyJkaXNjb25uZWN0TmF0aXZlIiwgIihbQilaIiwgKHZvaWQqKWRpc2Nvbm5lY3ROYXRpdmV9LAotfTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9jYWxsX2NvbnRyb2xsZXIoSk5JRW52KiBlbnYpIHsKLSAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcygKLSAgICAgIGVudiwgImNvbS9hbmRyb2lkL2JsdWV0b290aC9jYy9DQ05hdGl2ZUludGVyZmFjZSIsCi0gICAgICBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2NzaXBfY2xpZW50LmNwcCBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfY3NpcF9jbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2E4ZjZkLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfY3NpcF9jbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoQ3NpcENsaWVudEpuaSIKLQotI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgImNvbV9hbmRyb2lkX2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2NzaXAuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgPHNoYXJlZF9tdXRleD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0jZGVmaW5lIFVVSURfUEFSQU1TKHV1aWQpIHV1aWRfbHNiKHV1aWQpLCB1dWlkX21zYih1dWlkKQotCi1zdGF0aWMgdWludDY0X3QgdXVpZF9sc2IoY29uc3QgVXVpZCYgdXVpZCkgewotICB1aW50NjRfdCBsc2IgPSAwOwotCi0gIGF1dG8gdXUgPSB1dWlkLlRvMTI4Qml0QkUoKTsKLSAgZm9yIChpbnQgaSA9IDg7IGkgPD0gMTU7IGkrKykgewotICAgIGxzYiA8PD0gODsKLSAgICBsc2IgfD0gdXVbaV07Ci0gIH0KLQotICByZXR1cm4gbHNiOwotfQotCi1zdGF0aWMgdWludDY0X3QgdXVpZF9tc2IoY29uc3QgVXVpZCYgdXVpZCkgewotICB1aW50NjRfdCBtc2IgPSAwOwotCi0gIGF1dG8gdXUgPSB1dWlkLlRvMTI4Qml0QkUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPD0gNzsgaSsrKSB7Ci0gICAgbXNiIDw8PSA4OwotICAgIG1zYiB8PSB1dVtpXTsKLSAgfQotCi0gIHJldHVybiBtc2I7Ci19Ci0KLXN0YXRpYyBVdWlkIGZyb21famF2YV91dWlkKGpsb25nIHV1aWRfbXNiLCBqbG9uZyB1dWlkX2xzYikgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIFV1aWQ6OmtOdW1CeXRlczEyOD4gdXV7fTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICB1dVs3IC0gaV0gPSAodXVpZF9tc2IgPj4gKDggKiBpKSkgJiAweEZGOwotICAgIHV1WzE1IC0gaV0gPSAodXVpZF9sc2IgPj4gKDggKiBpKSkgJiAweEZGOwotICB9Ci0gIHJldHVybiBVdWlkOjpGcm9tMTI4Qml0QkUodXUpOwotfQotCi1zdGF0aWMgUmF3QWRkcmVzcyBzdHIyYWRkcihKTklFbnYqIGVudiwganN0cmluZyBhZGRyZXNzKSB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgY29uc3QgY2hhciogY19hZGRyZXNzID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhhZGRyZXNzLCBOVUxMKTsKLSAgaWYgKCFjX2FkZHJlc3MpIHJldHVybiBiZF9hZGRyOwotCi0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoc3RkOjpzdHJpbmcoY19hZGRyZXNzKSwgYmRfYWRkcik7Ci0gIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFkZHJlc3MsIGNfYWRkcmVzcyk7Ci0KLSAgcmV0dXJuIGJkX2FkZHI7Ci19Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ3NpcEFwcFJlZ2lzdGVyZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbk5ld1NldEZvdW5kOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXdTZXRNZW1iZXJGb3VuZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uTG9ja1N0YXR1c0NoYW5nZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkxvY2tBdmFpbGFibGU7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblNldFNpcmtDaGFuZ2VkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25TZXRTaXplQ2hhbmdlZDsKLQotc3RhdGljIGNvbnN0IGJ0Y3NpcF9pbnRlcmZhY2VfdCogc0JsdWV0b290aENzaXBJbnRlcmZhY2UgPSBOVUxMOwotc3RhdGljIGpvYmplY3QgbUNhbGxiYWNrc09iaiA9IE5VTEw7Ci1zdGF0aWMgc3RkOjpzaGFyZWRfdGltZWRfbXV0ZXggbUNhbGxiYWNrc19tdXRleDsKLQotc3RhdGljIGpzdHJpbmcgYmRhZGRyMm5ld2pzdHIoSk5JRW52KiBlbnYsIGNvbnN0IFJhd0FkZHJlc3MqIGJkYSkgewotICBjaGFyIGNfYWRkcmVzc1szMl07Ci0gIHNucHJpbnRmKGNfYWRkcmVzcywgc2l6ZW9mKGNfYWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0gICAgICAgICAgIGJkYS0+YWRkcmVzc1swXSwgYmRhLT5hZGRyZXNzWzFdLCBiZGEtPmFkZHJlc3NbMl0sIGJkYS0+YWRkcmVzc1szXSwKLSAgICAgICAgICAgYmRhLT5hZGRyZXNzWzRdLCBiZGEtPmFkZHJlc3NbNV0pOwotCi0gIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihjX2FkZHJlc3MpOwotfQotCi1zdGF0aWMgdm9pZCBjbGFzc0luaXROYXRpdmUoSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eikgewotICBtZXRob2Rfb25Dc2lwQXBwUmVnaXN0ZXJlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25Dc2lwQXBwUmVnaXN0ZXJlZCIsICIoSUlKSilWIik7Ci0KLSAgbWV0aG9kX29uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUkpViIpOwotCi0gIG1ldGhvZF9vbk5ld1NldEZvdW5kID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbk5ld1NldEZvdW5kIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SVtCSkpaKVYiKTsKLQotICBtZXRob2Rfb25OZXdTZXRNZW1iZXJGb3VuZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25OZXdTZXRNZW1iZXJGb3VuZCIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylWIik7Ci0KLSAgbWV0aG9kX29uTG9ja1N0YXR1c0NoYW5nZWQgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uTG9ja1N0YXR1c0NoYW5nZWQiLCAiKElJSUlbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLQotICBtZXRob2Rfb25Mb2NrQXZhaWxhYmxlID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkxvY2tBdmFpbGFibGUiLCAiKElJTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLQotICBtZXRob2Rfb25TZXRTaXJrQ2hhbmdlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25TZXRTaXJrQ2hhbmdlZCIsICIoSVtCTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLQotICBtZXRob2Rfb25TZXRTaXplQ2hhbmdlZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25TZXRTaXplQ2hhbmdlZCIsICIoSUlMamF2YS9sYW5nL1N0cmluZzspViIpOwotCi0gIEFMT0dJKCIlczogc3VjY2VlZHMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzaXBfYXBwX3JlZ2lzdGVyZWRfY2FsbGJhY2sodWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQpewotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpKSByZXR1cm47Ci0KLSAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25Dc2lwQXBwUmVnaXN0ZXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFwcF9pZCwgVVVJRF9QQVJBTVModXVpZCkpOwotfQotCi1zdGF0aWMgdm9pZCBjb25uZWN0aW9uX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2sodWludDhfdCBhcHBfaWQsIFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0ZSwgdWludDhfdCBzdGF0dXMpewotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpKSByZXR1cm47Ci0KLSAgLy8gYWRkcmVzcwotICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBhZGRyZXNzKHNDYWxsYmFja0Vudi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGFkZHIybmV3anN0cihzQ2FsbGJhY2tFbnYuZ2V0KCksICZhZGRyKSk7Ci0KLSAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZCwgYWRkcmVzcy5nZXQoKSwgc3RhdGUsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5ld19zZXRfZm91bmRfY2FsbGJhY2sodWludDhfdCBzZXRfaWQsIFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc2lyaywgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBwX3NydmNfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrX3N1cHBvcnQpIHsKLSAgQUxPR0koIiVzOiAiLCBfX2Z1bmNfXyk7Ci0gIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkpIHJldHVybjsKLQotICAvLyBhZGRyZXNzCi0gIFNjb3BlZExvY2FsUmVmPGpzdHJpbmc+IGFkZHJlc3Moc0NhbGxiYWNrRW52LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkYWRkcjJuZXdqc3RyKHNDYWxsYmFja0Vudi5nZXQoKSwgJmJkX2FkZHIpKTsKLQotICBBTE9HSSgiJXM6IG5ld19zZXRfZm91bmRfY2FsbGJhY2s6IHByb2Nlc3Mgc2lyayIsIF9fZnVuY19fKTsKLSAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gamIoc0NhbGxiYWNrRW52LmdldCgpLCBOVUxMKTsKLSAgamIucmVzZXQoc0NhbGxiYWNrRW52LT5OZXdCeXRlQXJyYXkoMTYpKTsKLSAgc0NhbGxiYWNrRW52LT5TZXRCeXRlQXJyYXlSZWdpb24oamIuZ2V0KCksIDAsIDE2LCAoamJ5dGUqKXNpcmspOwotCi0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uTmV3U2V0Rm91bmQsIHNldF9pZCwgYWRkcmVzcy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBqYi5nZXQoKSwgVVVJRF9QQVJBTVMocF9zcnZjX3V1aWQpLCBsb2NrX3N1cHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBuZXdfc2V0X21lbWJlcl9mb3VuZF9jYih1aW50OF90IHNldF9pZCwgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpKSByZXR1cm47Ci0KLSAgLy8gYWRkcmVzcwotICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBhZGRyZXNzKHNDYWxsYmFja0Vudi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGFkZHIybmV3anN0cihzQ2FsbGJhY2tFbnYuZ2V0KCksICZiZF9hZGRyKSk7Ci0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uTmV3U2V0TWVtYmVyRm91bmQsIHNldF9pZCwgYWRkcmVzcy5nZXQoKSk7Ci19Ci0KLS8qKiBDYWxsYmFjayBmb3IgbG9jayBzdGF0dXMgY2hhbmdlZCBldmVudCBmcm9tIHN0YWNrCi0gKi8KLXN0YXRpYyB2b2lkIGxvY2tfc3RhdGVfY2hhbmdlZF9jYWxsYmFjayh1aW50OF90IGFwcF9pZCwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWx1ZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYWRkcl9saXN0KSB7Ci0gIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkpIHJldHVybjsKLSAgaWYgKCFtQ2FsbGJhY2tzT2JqKSB7Ci0gICAgQUxPR0UoIm1DYWxsYmFja3NPYmogaXMgTlVMTC4gUmV0dXJuLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBpOwotICBqc3RyaW5nIGJkX2FkZHI7Ci0gIGpvYmplY3RBcnJheSBkZXZpY2VfbGlzdDsKLSAganNpemUgbGVuID0gYWRkcl9saXN0LnNpemUoKTsKLSAgZGV2aWNlX2xpc3QgPSBzQ2FsbGJhY2tFbnYtPk5ld09iamVjdEFycmF5KAotICAgICAgICAgICAgICAgICAgICBsZW4sIHNDYWxsYmFja0Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvU3RyaW5nIiksIDApOwotCi0gIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQotICB7Ci0gICAgYmRfYWRkciA9IHNDYWxsYmFja0Vudi0+TmV3U3RyaW5nVVRGKGFkZHJfbGlzdFtpXS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHNDYWxsYmFja0Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGRldmljZV9saXN0LCBpLCBiZF9hZGRyKTsKLSAgfQotCi0gIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX29uTG9ja1N0YXR1c0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX2lkLCBzZXRfaWQsIHZhbHVlLCBzdGF0dXMsIGRldmljZV9saXN0KTsKLX0KLQotLyoqIENhbGxiYWNrIHdoZW4gbG9jayBpcyBhdmFpbGFibGUgb24gZWFybGllciBkZW55aW5nIHNldCBtZW1iZXIKLSAqLwotc3RhdGljIHZvaWQgbG9ja19hdmFpbGFibGVfY2FsbGJhY2sodWludDhfdCBhcHBfaWQsIHVpbnQ4X3Qgc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpKSByZXR1cm47Ci0gIGlmICghbUNhbGxiYWNrc09iaikgewotICAgIEFMT0dFKCJtQ2FsbGJhY2tzT2JqIGlzIE5VTEwuIFJldHVybi4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotLy8gYWRkcmVzcwotICBTY29wZWRMb2NhbFJlZjxqc3RyaW5nPiBhZGRyZXNzKHNDYWxsYmFja0Vudi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGFkZHIybmV3anN0cihzQ2FsbGJhY2tFbnYuZ2V0KCksICZiZF9hZGRyKSk7Ci0KLSAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25Mb2NrQXZhaWxhYmxlLCBhcHBfaWQsIHNldF9pZCwgYWRkcmVzcy5nZXQoKSk7Ci19Ci0KLS8qKiBDYWxsYmFjayB3aGVuIHNpemUgb2YgY29vcmRpbmF0ZWQgc2V0IGhhcyBiZWVuIGNoYW5nZWQKLSAqLwotc3RhdGljIHZvaWQgc2V0X3NpemVfY2hhbmdlZF9jYWxsYmFjayh1aW50OF90IHNldF9pZCwgdWludDhfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkpIHJldHVybjsKLSAgaWYgKCFtQ2FsbGJhY2tzT2JqKSB7Ci0gICAgQUxPR0UoIm1DYWxsYmFja3NPYmogaXMgTlVMTC4gUmV0dXJuLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGFkZHJlc3MKLSAgU2NvcGVkTG9jYWxSZWY8anN0cmluZz4gYWRkcmVzcyhzQ2FsbGJhY2tFbnYuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRhZGRyMm5ld2pzdHIoc0NhbGxiYWNrRW52LmdldCgpLCAmYmRfYWRkcikpOwotICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vblNldFNpemVDaGFuZ2VkLCBzZXRfaWQsIHNpemUsIGFkZHJlc3MuZ2V0KCkpOwotfQotCi0vKiogQ2FsbGJhY2sgd2hlbiBTSVJLIG9mIGNvb3JkaW5hdGVkIHNldCBoYXMgYmVlbiBjaGFuZ2VkCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9zaXJrX2NoYW5nZWRfY2FsbGJhY2sodWludDhfdCBzZXRfaWQsIHVpbnQ4X3QqIHNpcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSkgcmV0dXJuOwotICBpZiAoIW1DYWxsYmFja3NPYmopIHsKLSAgICBBTE9HRSgibUNhbGxiYWNrc09iaiBpcyBOVUxMLiBSZXR1cm4uIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gamIoc0NhbGxiYWNrRW52LmdldCgpLCBOVUxMKTsKLSAgamIucmVzZXQoc0NhbGxiYWNrRW52LT5OZXdCeXRlQXJyYXkoMjQpKTsKLSAgc0NhbGxiYWNrRW52LT5TZXRCeXRlQXJyYXlSZWdpb24oamIuZ2V0KCksIDAsIDI0LCAoamJ5dGUqKXNpcmspOwotCi0gIC8vIGFkZHJlc3MKLSAgU2NvcGVkTG9jYWxSZWY8anN0cmluZz4gYWRkcmVzcyhzQ2FsbGJhY2tFbnYuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRhZGRyMm5ld2pzdHIoc0NhbGxiYWNrRW52LmdldCgpLCAmYmRfYWRkcikpOwotICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vblNldFNpcmtDaGFuZ2VkLCBzZXRfaWQsIGpiLmdldCgpLCBhZGRyZXNzLmdldCgpKTsKLX0KLQotc3RhdGljIGJ0Y3NpcF9jYWxsYmFja3NfdCBzQmx1ZXRvb3RoQ3NpcENhbGxiYWNrcyA9IHsKLSAgc2l6ZW9mKHNCbHVldG9vdGhDc2lwQ2FsbGJhY2tzKSwKLSAgY3NpcF9hcHBfcmVnaXN0ZXJlZF9jYWxsYmFjaywKLSAgY29ubmVjdGlvbl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrLAotICBuZXdfc2V0X2ZvdW5kX2NhbGxiYWNrLAotICBuZXdfc2V0X21lbWJlcl9mb3VuZF9jYiwKLSAgbG9ja19zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrLAotICBsb2NrX2F2YWlsYWJsZV9jYWxsYmFjaywKLSAgc2V0X3NpemVfY2hhbmdlZF9jYWxsYmFjaywKLSAgc2V0X3NpcmtfY2hhbmdlZF9jYWxsYmFjaywKLX07Ci0KLXN0YXRpYyB2b2lkIGluaXROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gIEFMT0dJKCIlczogaW5pdE5hdGl2ZSgpIiwgX19mdW5jX18pOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2sobUNhbGxiYWNrc19tdXRleCk7Ci0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidEluZiA9IGdldEJsdWV0b290aEludGVyZmFjZSgpOwotICBpZiAoYnRJbmYgPT0gTlVMTCkgewotICAgIEFMT0dFKCJCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc0JsdWV0b290aENzaXBJbnRlcmZhY2UgIT0gTlVMTCkgewotICAgIEFMT0dXKCJDbGVhbmluZyB1cCBCbHVldG9vdGggQ1NJUCBDTElFTlQgSW50ZXJmYWNlIGJlZm9yZSBpbml0aWFsaXppbmcuLi4iKTsKLSAgICBzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZS0+Y2xlYW51cCgpOwotICAgIHNCbHVldG9vdGhDc2lwSW50ZXJmYWNlID0gTlVMTDsKLSAgfQotCi0gIGlmIChtQ2FsbGJhY2tzT2JqICE9IE5VTEwpIHsKLSAgICBBTE9HVygiQ2xlYW5pbmcgdXAgQmx1ZXRvb3RoIENTSVAgY2FsbGJhY2sgb2JqZWN0Iik7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IE5VTEw7Ci0gIH0KLQotICBzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZSA9Ci0gICAgICAoYnRjc2lwX2ludGVyZmFjZV90KilidEluZi0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKEJUX1BST0ZJTEVfQ1NJUF9DTElFTlRfSUQpOwotICBpZiAoc0JsdWV0b290aENzaXBJbnRlcmZhY2UgPT0gTlVMTCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IEJsdWV0b290aCBDU0lQSW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gc0JsdWV0b290aENzaXBJbnRlcmZhY2UtPmluaXQoJnNCbHVldG9vdGhDc2lwQ2FsbGJhY2tzKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBCbHVldG9vdGggQ1NJUCBDbGllbnQsIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgIHNCbHVldG9vdGhDc2lwSW50ZXJmYWNlID0gTlVMTDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtQ2FsbGJhY2tzT2JqID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgQUxPR0koIiVzOiBjbGVhbnVwTmF0aXZlKCkiLCBfX2Z1bmNfXyk7Ci0gIGlmICghc0JsdWV0b290aENzaXBJbnRlcmZhY2UpIHJldHVybjsKLQotICBzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZS0+Y2xlYW51cCgpOwotfQotCi1zdGF0aWMgamJvb2xlYW4gY29ubmVjdFNldERldmljZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGFwcF9pZCwgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIGlmICghc0JsdWV0b290aENzaXBJbnRlcmZhY2UpIHJldHVybiBKTklfRkFMU0U7Ci0KLSAgQUxPR0koIiVzOiBjb25uZWN0U2V0RGV2aWNlTmF0aXZlKCkiLCBfX2Z1bmNfXyk7Ci0gIGpib29sZWFuIHJldCA9IEpOSV9UUlVFOwotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGJkX2FkZHIuRnJvbU9jdGV0cyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihhZGRyKSk7Ci0gIHNCbHVldG9vdGhDc2lwSW50ZXJmYWNlLT5jb25uZWN0KGFwcF9pZCwgJmJkX2FkZHIpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdFNldERldmljZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYXBwX2lkLCBqYnl0ZUFycmF5IGFkZHJlc3MpIHsKLSAgaWYgKCFzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBqYm9vbGVhbiByZXQgPSBKTklfVFJVRTsKLSAgQUxPR0koIiVzOiBkaXNjb25uZWN0U2V0RGV2aWNlTmF0aXZlKCkiLCBfX2Z1bmNfXyk7Ci0KLSAgamJ5dGUqIGFkZHIgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIG51bGxwdHIpOwotICBpZiAoIWFkZHIpIHsKLSAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgRUlOVkFMKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBiZF9hZGRyLkZyb21PY3RldHMocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYWRkcikpOwotICBzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZS0+ZGlzY29ubmVjdChhcHBfaWQsICZiZF9hZGRyKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJDc2lwQXBwTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyBhcHBfdXVpZF9sc2IsIGpsb25nIGFwcF91dWlkX21zYikgewotICBpZiAoIXNCbHVldG9vdGhDc2lwSW50ZXJmYWNlKSByZXR1cm47Ci0KLSAgVXVpZCB1dWlkID0gZnJvbV9qYXZhX3V1aWQoYXBwX3V1aWRfbXNiLCBhcHBfdXVpZF9sc2IpOwotICBzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZS0+cmVnaXN0ZXJfY3NpcF9hcHAodXVpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVucmVnaXN0ZXJDc2lwQXBwTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCBhcHBfaWQpIHsKLSAgaWYgKCFzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZSkgcmV0dXJuOwotCi0gIHNCbHVldG9vdGhDc2lwSW50ZXJmYWNlLT51bnJlZ2lzdGVyX2NzaXBfYXBwKGFwcF9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldExvY2tWYWx1ZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc2V0X2lkLCBqaW50IHZhbHVlLCBqb2JqZWN0QXJyYXkgZGV2aWNlc0xpc3QpIHsKLSAgaWYgKCFzQmx1ZXRvb3RoQ3NpcEludGVyZmFjZSkgcmV0dXJuOwotCi0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGxvY2tfbGlzdDsKLSAgaW50IGxpc3RDb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoZGV2aWNlc0xpc3QpOwotICBmb3IgKGludCBpPTA7IGkgPCBsaXN0Q291bnQ7IGkrKykgewotICAgIGpzdHJpbmcgYWRkcmVzcyA9IChqc3RyaW5nKSAoZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoZGV2aWNlc0xpc3QsIGkpKTsKLSAgICBSYXdBZGRyZXNzIGJkX2FkZHIgPSBzdHIyYWRkcihlbnYsIGFkZHJlc3MpOwotICAgIGxvY2tfbGlzdC5wdXNoX2JhY2soYmRfYWRkcik7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihhZGRyZXNzKTsKLSAgfQotCi0gIHNCbHVldG9vdGhDc2lwSW50ZXJmYWNlLT5zZXRfbG9ja192YWx1ZShhcHBfaWQsIHNldF9pZCwgdmFsdWUsIGxvY2tfbGlzdCk7Ci19Ci0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKLSAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKLSAgICB7ImluaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWluaXROYXRpdmV9LAotICAgIHsiY2xlYW51cE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xlYW51cE5hdGl2ZX0sCi0gICAgeyJjb25uZWN0U2V0RGV2aWNlTmF0aXZlIiwgIihJW0IpWiIsICh2b2lkKiljb25uZWN0U2V0RGV2aWNlTmF0aXZlfSwKLSAgICB7ImRpc2Nvbm5lY3RTZXREZXZpY2VOYXRpdmUiLCAiKElbQilaIiwgKHZvaWQqKWRpc2Nvbm5lY3RTZXREZXZpY2VOYXRpdmV9LAotICAgIHsicmVnaXN0ZXJDc2lwQXBwTmF0aXZlIiwgIihKSilWIiwgKHZvaWQqKXJlZ2lzdGVyQ3NpcEFwcE5hdGl2ZX0sCi0gICAgeyJ1bnJlZ2lzdGVyQ3NpcEFwcE5hdGl2ZSIsICIoSSlWIiwgKHZvaWQqKXVucmVnaXN0ZXJDc2lwQXBwTmF0aXZlfSwKLSAgICB7InNldExvY2tWYWx1ZU5hdGl2ZSIsICIoSUlJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQqKXNldExvY2tWYWx1ZU5hdGl2ZX0sCi19OwotCi1pbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2NzaXBfY2xpZW50KEpOSUVudiogZW52KSB7Ci0gIEFMT0dFKCIlcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcygKLSAgICAgIGVudiwgImNvbS9hbmRyb2lkL2JsdWV0b290aC9ncm91cGNsaWVudC9Hcm91cENsaWVudE5hdGl2ZUludGVyZmFjZSIsCi0gICAgICBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfZXh0LmggYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2V4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODIxNDZkLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIENPTV9BTkRST0lEX0JMVUVUT09USF9FWFQKLSNkZWZpbmUgQ09NX0FORFJPSURfQkxVRVRPT1RIX0VYVAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfYmFwX2Jyb2FkY2FzdChKTklFbnYqIGVudik7Ci0KLWludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfYWNtKEpOSUVudiogZW52KTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9hcG0oSk5JRW52KiBlbnYpOwotCi1pbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX2NzaXBfY2xpZW50KEpOSUVudiogZW52KTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9hZHZfYXVkaW9fcHJvZmlsZXMoSk5JRW52KiBlbnYpOwotCi1pbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfYmx1ZXRvb3RoX3ZjcF9jb250cm9sbGVyKEpOSUVudiogZW52KTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9wYWNzX2NsaWVudChKTklFbnYqIGVudik7Ci0KLWludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfbWNwKEpOSUVudiogZW52KTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9jYWxsX2NvbnRyb2xsZXIoSk5JRW52KiBlbnYpOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF9tY3AuY3BwIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF9tY3AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGMyMTIyLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL2puaS9jb21fYW5kcm9pZF9ibHVldG9vdGhfbWNwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoTUNQU2VydmljZV9qbmkiCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNoYXJlZF9tdXRleD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLQotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImNvbV9hbmRyb2lkX2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X21jcC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2JsdWV0b290aC5oIgotCi0KLQotdXNpbmcgYmx1ZXRvb3RoOjptY3Bfc2VydmVyOjpNY3BTZXJ2ZXJDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6Om1jcF9zZXJ2ZXI6Ok1jcFNlcnZlckludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXN0YXRpYyBNY3BTZXJ2ZXJJbnRlcmZhY2UqIHNNY3BTZXJ2ZXJJbnRlcmZhY2UgPSBudWxscHRyOwotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX09uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX01lZGlhQ29udHJvbFBvaW50Q2hhbmdlZFJlcXVlc3Q7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9UcmFja1Bvc2l0aW9uQ2hhbmdlZFJlcXVlc3Q7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9QbGF5aW5nT3JkZXJDaGFuZ2VkUmVxdWVzdDsKLQotCi1zdGF0aWMgc3RkOjpzaGFyZWRfdGltZWRfbXV0ZXggaW50ZXJmYWNlX211dGV4OwotCi1zdGF0aWMgam9iamVjdCBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLXN0YXRpYyBzdGQ6OnNoYXJlZF90aW1lZF9tdXRleCBjYWxsYmFja3NfbXV0ZXg7Ci0KLWNsYXNzIE1jcFNlcnZlckNhbGxiYWNrc0ltcGwgOiBwdWJsaWMgTWNwU2VydmVyQ2FsbGJhY2tzIHsKLSAgIHB1YmxpYzoKLSAgfk1jcFNlcnZlckNhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShpbnQgc3RhdGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICAgIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gICAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLSAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHNpemVvZihSYXdBZGRyZXNzKSkpOwotICAgIGlmICghYWRkci5nZXQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIgZm9yIGNvbm5lY3Rpb24gc3RhdGUiOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpieXRlKikmYmRfYWRkcik7Ci0gICAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2RfT25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpc3RhdGUsIGFkZHIuZ2V0KCkpOwotICB9Ci0KLQotICB2b2lkIE1lZGlhQ29udHJvbFBvaW50Q2hhbmdlUmVxKHVpbnQ4X3Qgc3RhdGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gICAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gYWRkcigKLSAgICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgICBpZiAoIWFkZHIuZ2V0KCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBuZXcgamJ5dGVBcnJheSBiZCBhZGRyIGZvciBjb25uZWN0aW9uIHN0YXRlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpieXRlKikmYmRfYWRkcik7Ci0gICAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2RfTWVkaWFDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KXN0YXRlLCBhZGRyLmdldCgpKTsKLSAgfQotCi0gIHZvaWQgVHJhY2tQb3NpdGlvbkNoYW5nZVJlcShpbnQzMl90IHBvc2l0aW9uKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gICAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICAgIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gICAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX1RyYWNrUG9zaXRpb25DaGFuZ2VkUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KXBvc2l0aW9uKTsKLSAgfQotCi0gIHZvaWQgUGxheWluZ09yZGVyQ2hhbmdlUmVxKHVpbnQzMl90IG9yZGVyKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gICAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICAgIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gICAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIHNDYWxsYmFja0Vudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgbWV0aG9kX1BsYXlpbmdPcmRlckNoYW5nZWRSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpb3JkZXIpOwotICB9Ci19OwotCi0KLXN0YXRpYyBNY3BTZXJ2ZXJDYWxsYmFja3NJbXBsIHNNY3BTZXJ2ZXJDYWxsYmFja3M7Ci0KLXN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBjbGFzcyBpbml0IG5hdGl2ZSI7Ci0gIG1ldGhvZF9PbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIk9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCIsICIoSVtCKVYiKTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGNsYXNzIGluaXQgbmF0aXZlIDEiOwotICBtZXRob2RfTWVkaWFDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiTWVkaWFDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdCIsICIoSVtCKVYiKTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGNsYXNzIGluaXQgbmF0aXZlIDIiOwotICBtZXRob2RfVHJhY2tQb3NpdGlvbkNoYW5nZWRSZXF1ZXN0ID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJUcmFja1Bvc2l0aW9uQ2hhbmdlZFJlcXVlc3QiLCAiKEkpViIpOwotICBtZXRob2RfUGxheWluZ09yZGVyQ2hhbmdlZFJlcXVlc3QgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIlBsYXlpbmdPcmRlckNoYW5nZWRSZXF1ZXN0IiwgIihJKVYiKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3VjY2VlZHMiOwotfQotCi0vLzxUQkQ+IHV1aWQgbm90IGZpeGVkCi1VdWlkIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwOGZkMS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLQotc3RhdGljIHZvaWQgaW5pdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzTWNwU2VydmVySW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBMT0coSU5GTykgPDwgIkNsZWFuaW5nIHVwIE1jcFNlcnZlciBJbnRlcmZhY2UgYmVmb3JlIGluaXRpYWxpemluZy4uLiI7Ci0gICAgc01jcFNlcnZlckludGVyZmFjZS0+Q2xlYW51cCgpOwotICAgIHNNY3BTZXJ2ZXJJbnRlcmZhY2UgPSBudWxscHRyOwotICB9Ci0KLSAgaWYgKG1DYWxsYmFja3NPYmogIT0gbnVsbHB0cikgewotICAgIExPRyhJTkZPKSA8PCAiQ2xlYW5pbmcgdXAgTWNwU2VydmVyIGNhbGxiYWNrIG9iamVjdCI7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAoKG1DYWxsYmFja3NPYmogPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpKSA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIEdsb2JhbCBSZWYgZm9yIE1jcCBDb250cm9sbGVyIENhbGxiYWNrcyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPRyhJTkZPKSA8PCAibWNzIGNhbGxiYWNrIGluaXRpYWxpemVkIjsKLSAgc01jcFNlcnZlckludGVyZmFjZSA9IChNY3BTZXJ2ZXJJbnRlcmZhY2UqIClidEluZi0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgQlRfUFJPRklMRV9NQ1BfSUQpOwotICBpZiAoc01jcFNlcnZlckludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBCbHVldG9vdGggSGVhcmluZyBBaWQgSW50ZXJmYWNlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzTWNwU2VydmVySW50ZXJmYWNlLT5Jbml0KCZzTWNwU2VydmVyQ2FsbGJhY2tzLCB1dWlkKTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzTWNwU2VydmVySW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBzTWNwU2VydmVySW50ZXJmYWNlLT5DbGVhbnVwKCk7Ci0gICAgc01jcFNlcnZlckludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAobUNhbGxiYWNrc09iaiAhPSBudWxscHRyKSB7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLX0KLQotCi0KLXN0YXRpYyBqYm9vbGVhbiBtZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBmZWF0dXJlKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc01jcFNlcnZlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBzTWNwU2VydmVySW50ZXJmYWNlLT5NZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZChmZWF0dXJlKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gbWVkaWFDb250cm9sUG9pbnROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgdmFsdWUpIHsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzTWNwU2VydmVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIHNNY3BTZXJ2ZXJJbnRlcmZhY2UtPk1lZGlhQ29udHJvbFBvaW50KHZhbHVlKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gbWVkaWFTdGF0ZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGF0ZSkgewotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNNY3BTZXJ2ZXJJbnRlcmZhY2UpIHJldHVybiBKTklfRkFMU0U7Ci0KLSAgc01jcFNlcnZlckludGVyZmFjZS0+TWVkaWFTdGF0ZShzdGF0ZSk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIG1lZGlhUGxheWVyTmFtZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwbGF5ZXJOYW1lKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc01jcFNlcnZlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotCi0gIGNvbnN0IGNoYXIgKm5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGxheWVyTmFtZSwgbnVsbHB0cik7Ci0gIGlmICghbmF0aXZlU3RyaW5nKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBzTWNwU2VydmVySW50ZXJmYWNlLT5NZWRpYVBsYXllck5hbWUoKHVpbnQ4X3QqKW5hdGl2ZVN0cmluZyk7Ci0gIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBsYXllck5hbWUsIG5hdGl2ZVN0cmluZyk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHRyYWNrQ2hhbmdlZE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGF0dXMpIHsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzTWNwU2VydmVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIHNNY3BTZXJ2ZXJJbnRlcmZhY2UtPlRyYWNrQ2hhbmdlZCgoYm9vbClzdGF0dXMpOwotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiB0cmFja1Bvc2l0aW9uTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHBsYXlQb3NpdGlvbikgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzTWNwU2VydmVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0KLSAgc01jcFNlcnZlckludGVyZmFjZS0+VHJhY2tQb3NpdGlvbihwbGF5UG9zaXRpb24pOwotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiB0cmFja0R1cmF0aW9uTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGR1cmF0aW9uKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc01jcFNlcnZlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBzTWNwU2VydmVySW50ZXJmYWNlLT5UcmFja0R1cmF0aW9uKGR1cmF0aW9uKTsKLQotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLQotCi1zdGF0aWMgamJvb2xlYW4gdHJhY2tUaXRsZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyB0aXRsZSkgewotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNNY3BTZXJ2ZXJJbnRlcmZhY2UpIHJldHVybiBKTklfRkFMU0U7Ci0KLSAgY29uc3QgY2hhciAqbmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh0aXRsZSwgbnVsbHB0cik7Ci0gIGlmICghbmF0aXZlU3RyaW5nKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotICBzTWNwU2VydmVySW50ZXJmYWNlLT5UcmFja1RpdGxlKCh1aW50OF90KiluYXRpdmVTdHJpbmcpOwotICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh0aXRsZSwgbmF0aXZlU3RyaW5nKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBwcm9maWxlLCBqaW50IHNldF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNNY3BTZXJ2ZXJJbnRlcmZhY2UpIHJldHVybiBKTklfRkFMU0U7Ci0KLSAgamJ5dGUqIGFkZHIgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIG51bGxwdHIpOwotICBSYXdBZGRyZXNzIGJkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIGlmIChhZGRyKSB7Ci0gICAgYmRfYWRkci5Gcm9tT2N0ZXRzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGFkZHIpKTsKLSAgfQotICBpZiAoYmRfYWRkciA9PSBSYXdBZGRyZXNzOjprRW1wdHkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhY3RpdmUgZGV2aWNlIGlzIG51bGwiOwotICB9Ci0KLSAgc01jcFNlcnZlckludGVyZmFjZS0+U2V0QWN0aXZlRGV2aWNlKGJkX2FkZHIsIHNldF9pZCwgcHJvZmlsZSk7Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIGFkZHIsIDApOwotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBib25kU3RhdGVDaGFuZ2VOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGF0ZSwgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNNY3BTZXJ2ZXJJbnRlcmZhY2UpIHJldHVybiBKTklfRkFMU0U7Ci0KLSAgamJ5dGUqIGFkZHIgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIG51bGxwdHIpOwotICBpZiAoIWFkZHIpIHsKLSAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgRUlOVkFMKTsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotCi0gIHNNY3BTZXJ2ZXJJbnRlcmZhY2UtPkJvbmRTdGF0ZUNoYW5nZSgqdG1wcmF3LCBzdGF0ZSk7Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIGFkZHIsIDApOwotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBwbGF5aW5nT3JkZXJTdXBwb3J0ZWROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgb3JkZXIpIHsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzTWNwU2VydmVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIHNNY3BTZXJ2ZXJJbnRlcmZhY2UtPlBsYXlpbmdPcmRlclN1cHBvcnRlZChvcmRlcik7Ci0KLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gcGxheWluZ09yZGVyTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG9yZGVyKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc01jcFNlcnZlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBzTWNwU2VydmVySW50ZXJmYWNlLT5QbGF5aW5nT3JkZXIob3JkZXIpOwotCi0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIGNvbnRlbnRDb250cm9sSWROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY2NpZCkgewotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNNY3BTZXJ2ZXJJbnRlcmZhY2UpIHJldHVybiBKTklfRkFMU0U7Ci0KLSAgc01jcFNlcnZlckludGVyZmFjZS0+Q29udGVudENvbnRyb2xJZChjY2lkKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdE1jcE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGludGVyZmFjZV9tdXRleCk7Ci0gIGlmICghc01jcFNlcnZlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLSAgUmF3QWRkcmVzcyogdG1wcmF3ID0gKFJhd0FkZHJlc3MqKWFkZHI7Ci0KLSAgc01jcFNlcnZlckludGVyZmFjZS0+RGlzY29ubmVjdE1jcCgqdG1wcmF3KTsKLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewotICAgIHsiY2xhc3NJbml0TmF0aXZlIiwgIigpViIsICh2b2lkKiljbGFzc0luaXROYXRpdmV9LAotICAgIHsiaW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopaW5pdE5hdGl2ZX0sCi0gICAgeyJjbGVhbnVwTmF0aXZlIiwgIigpViIsICh2b2lkKiljbGVhbnVwTmF0aXZlfSwKLSAgICB7Im1lZGlhU3RhdGVOYXRpdmUiLCAiKEkpWiIsICh2b2lkKiltZWRpYVN0YXRlTmF0aXZlfSwKLSAgICB7Im1lZGlhUGxheWVyTmFtZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopbWVkaWFQbGF5ZXJOYW1lTmF0aXZlfSwKLSAgICB7Im1lZGlhQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkTmF0aXZlIiwgIihJKVoiLCAodm9pZCopbWVkaWFDb250cm9sUG9pbnRPcGNvZGVTdXBwb3J0ZWROYXRpdmV9LAotICAgIHsibWVkaWFDb250cm9sUG9pbnROYXRpdmUiLCAiKEkpWiIsICh2b2lkKiltZWRpYUNvbnRyb2xQb2ludE5hdGl2ZX0sCi0gICAgeyJ0cmFja0NoYW5nZWROYXRpdmUiLCAiKEkpWiIsICh2b2lkKil0cmFja0NoYW5nZWROYXRpdmV9LAotICAgIHsidHJhY2tUaXRsZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopdHJhY2tUaXRsZU5hdGl2ZX0sCi0gICAgeyJ0cmFja1Bvc2l0aW9uTmF0aXZlIiwgIihJKVoiLCAodm9pZCopdHJhY2tQb3NpdGlvbk5hdGl2ZX0sCi0gICAgeyJ0cmFja0R1cmF0aW9uTmF0aXZlIiwgIihJKVoiLCAodm9pZCopdHJhY2tEdXJhdGlvbk5hdGl2ZX0sCi0gICAgeyJwbGF5aW5nT3JkZXJTdXBwb3J0ZWROYXRpdmUiLCAiKEkpWiIsICh2b2lkKilwbGF5aW5nT3JkZXJTdXBwb3J0ZWROYXRpdmV9LAotICAgIHsicGxheWluZ09yZGVyTmF0aXZlIiwgIihJKVoiLCAodm9pZCopcGxheWluZ09yZGVyTmF0aXZlfSwKLSAgICB7InNldEFjdGl2ZURldmljZU5hdGl2ZSIsICIoSUlbQilaIiwgKHZvaWQqKXNldEFjdGl2ZURldmljZU5hdGl2ZX0sCi0gICAgeyJjb250ZW50Q29udHJvbElkTmF0aXZlIiwgIihJKVoiLCAodm9pZCopY29udGVudENvbnRyb2xJZE5hdGl2ZX0sCi0gICAgeyJkaXNjb25uZWN0TWNwTmF0aXZlIiwgIihbQilaIiwgKHZvaWQqKWRpc2Nvbm5lY3RNY3BOYXRpdmV9LAotICAgIHsiYm9uZFN0YXRlQ2hhbmdlTmF0aXZlIiwgIihJW0IpWiIsICh2b2lkKilib25kU3RhdGVDaGFuZ2VOYXRpdmV9LAotfTsKLQotCi0KLWludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9ibHVldG9vdGhfbWNwKEpOSUVudiogZW52KSB7Ci0gIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoCi0gICAgICBlbnYsICJjb20vYW5kcm9pZC9ibHVldG9vdGgvbWNwL01jcE5hdGl2ZUludGVyZmFjZSIsCi0gICAgICBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF9wYWNzX2NsaWVudC5jcHAgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfY2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1YTVkMC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfY2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJsdWV0b290aFBhY3NDbGllblNlcnZpY2VKbmkiCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJjb21fYW5kcm9pZF9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9wYWNzX2NsaWVudC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2hhcmVkX211dGV4PgotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29ubmVjdGlvblN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OlBhY3NDbGllbnRJbnRlcmZhY2U7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudENhbGxiYWNrczsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9PbkluaXRpYWxpemVkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2RfT25BdWRpb0NvbnRleHRBdmFpbGFibGU7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblNlcnZpY2VEaXNjb3Zlcnk7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotICAgamNsYXNzIGNsYXp6OwotICAgam1ldGhvZElEIGNvbnN0cnVjdG9yOwotICAgam1ldGhvZElEIGdldENvZGVjVHlwZTsKLSAgIGptZXRob2RJRCBnZXRDb2RlY1ByaW9yaXR5OwotICAgam1ldGhvZElEIGdldFNhbXBsZVJhdGU7Ci0gICBqbWV0aG9kSUQgZ2V0Qml0c1BlclNhbXBsZTsKLSAgIGptZXRob2RJRCBnZXRDaGFubmVsTW9kZTsKLSAgIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljMTsKLSAgIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljMjsKLSAgIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljMzsKLSAgIGptZXRob2RJRCBnZXRDb2RlY1NwZWNpZmljNDsKLX0gYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQ7Ci0KLXN0YXRpYyBQYWNzQ2xpZW50SW50ZXJmYWNlKiBzUGFjc0NsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci1zdGF0aWMgc3RkOjpzaGFyZWRfdGltZWRfbXV0ZXggaW50ZXJmYWNlX211dGV4OwotCi1zdGF0aWMgam9iamVjdCBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLXN0YXRpYyBzdGQ6OnNoYXJlZF90aW1lZF9tdXRleCBjYWxsYmFja3NfbXV0ZXg7Ci0KLWNsYXNzIFBhY3NDbGllbnRDYWxsYmFja3NJbXBsIDogcHVibGljIFBhY3NDbGllbnRDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgflBhY3NDbGllbnRDYWxsYmFja3NJbXBsKCkgPSBkZWZhdWx0OwotICB2b2lkIE9uSW5pdGlhbGl6ZWQoaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRfaWQpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gICAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2RfT25Jbml0aWFsaXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KXN0YXR1cywgKGppbnQpY2xpZW50X2lkKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uU3RhdGUgc3RhdGUpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gICAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gYWRkcigKLSAgICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgICBpZiAoIWFkZHIuZ2V0KCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBuZXcgamJ5dGVBcnJheSBiZCBhZGRyIGZvciBjb25uZWN0aW9uIHN0YXRlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpieXRlKikmYmRfYWRkcik7Ci0gICAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5nZXQoKSwgKGppbnQpc3RhdGUpOwotICB9Ci0KLSAgdm9pZCBPbkF1ZGlvQ29udGV4dEF2YWlsYWJsZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gICAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICAgIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gICAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IGFkZHIoCi0gICAgICAgIHNDYWxsYmFja0Vudi5nZXQoKSwgc0NhbGxiYWNrRW52LT5OZXdCeXRlQXJyYXkoc2l6ZW9mKFJhd0FkZHJlc3MpKSk7Ci0gICAgaWYgKCFhZGRyLmdldCgpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbmV3IGpieXRlQXJyYXkgYmQgYWRkciBmb3IgYXZhaWxhYmxlIGF1ZGlvIGNvbnRleHQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIuZ2V0KCksIDAsIHNpemVvZihSYXdBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSZiZF9hZGRyKTsKLSAgICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9PbkF1ZGlvQ29udGV4dEF2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIuZ2V0KCksIChqaW50KWF2YWlsYWJsZV9jb250ZXh0cyk7Ci0gIH0KLQotICAgdm9pZCBPblNlYXJjaENvbXBsZXRlKGludCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ29uZmlnPiBzaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZz4gc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1cHBvcnRlZF9jb250ZXh0cykgb3ZlcnJpZGUgewotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gICAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotICAgIENhbGxiYWNrRW52IHNDYWxsYmFja0VudihfX2Z1bmNfXyk7Ci0gICAgaWYgKCFzQ2FsbGJhY2tFbnYudmFsaWQoKSB8fCBtQ2FsbGJhY2tzT2JqID09IG51bGxwdHIpIHJldHVybjsKLQotCi0gICAganNpemUgaSA9IDA7Ci0gICAgam9iamVjdEFycmF5IHNpbmtfcGFjX3JlY29yZHNfYXJyYXkgPSBzQ2FsbGJhY2tFbnYtPk5ld09iamVjdEFycmF5KAotICAgICAgICAoanNpemUpc2lua19wYWNfcmVjb3Jkcy5zaXplKCksCi0gICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmNsYXp6LCBudWxscHRyKTsKLSAgICBmb3IgKGF1dG8gY29uc3QmIGNhcCA6IHNpbmtfcGFjX3JlY29yZHMpIHsKLSAgICAgIGpvYmplY3QgY2FwT2JqID0gc0NhbGxiYWNrRW52LT5OZXdPYmplY3QoCi0gICAgICAgICAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuY2xhenosCi0gICAgICAgICAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuY29uc3RydWN0b3IsCi0gICAgICAgICAgKGppbnQpY2FwLmNvZGVjX3R5cGUsIChqaW50KWNhcC5jb2RlY19wcmlvcml0eSwgKGppbnQpY2FwLnNhbXBsZV9yYXRlLAotICAgICAgICAgIChqaW50KWNhcC5iaXRzX3Blcl9zYW1wbGUsIChqaW50KWNhcC5jaGFubmVsX21vZGUsCi0gICAgICAgICAgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY18xLCAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzIsCi0gICAgICAgICAgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY18zLCAoamxvbmcpY2FwLmNvZGVjX3NwZWNpZmljXzQpOwotICAgICAgc0NhbGxiYWNrRW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoc2lua19wYWNfcmVjb3Jkc19hcnJheSwgaSsrLCBjYXBPYmopOwotICAgICAgc0NhbGxiYWNrRW52LT5EZWxldGVMb2NhbFJlZihjYXBPYmopOwotICAgIH0KLQotICAgIGkgPSAwOwotICAgIGpvYmplY3RBcnJheSBzcmNfcGFjX3JlY29yZHNfYXJyYXkgPSBzQ2FsbGJhY2tFbnYtPk5ld09iamVjdEFycmF5KAotICAgICAgICAoanNpemUpc3JjX3BhY19yZWNvcmRzLnNpemUoKSwKLSAgICAgICAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuY2xhenosIG51bGxwdHIpOwotICAgIGZvciAoYXV0byBjb25zdCYgY2FwIDogc3JjX3BhY19yZWNvcmRzKSB7Ci0gICAgICBqb2JqZWN0IGNhcE9iaiA9IHNDYWxsYmFja0Vudi0+TmV3T2JqZWN0KAotICAgICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmNsYXp6LAotICAgICAgICAgIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmNvbnN0cnVjdG9yLAotICAgICAgICAgIChqaW50KWNhcC5jb2RlY190eXBlLCAoamludCljYXAuY29kZWNfcHJpb3JpdHksIChqaW50KWNhcC5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAoamludCljYXAuYml0c19wZXJfc2FtcGxlLCAoamludCljYXAuY2hhbm5lbF9tb2RlLAotICAgICAgICAgIChqbG9uZyljYXAuY29kZWNfc3BlY2lmaWNfMSwgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY18yLAotICAgICAgICAgIChqbG9uZyljYXAuY29kZWNfc3BlY2lmaWNfMywgKGpsb25nKWNhcC5jb2RlY19zcGVjaWZpY180KTsKLSAgICAgIHNDYWxsYmFja0Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHNyY19wYWNfcmVjb3Jkc19hcnJheSwgaSsrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwT2JqKTsKLSAgICAgIHNDYWxsYmFja0Vudi0+RGVsZXRlTG9jYWxSZWYoY2FwT2JqKTsKLSAgICB9Ci0KLSAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHNpemVvZihSYXdBZGRyZXNzKSkpOwotICAgIGlmICghYWRkci5nZXQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIuZ2V0KCksIDAsIHNpemVvZihSYXdBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSZhZGRyZXNzKTsKLSAgICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vblNlcnZpY2VEaXNjb3ZlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rX3BhY19yZWNvcmRzX2FycmF5LCBzcmNfcGFjX3JlY29yZHNfYXJyYXksIChqaW50KXNpbmtfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpc3JjX2xvY2F0aW9ucywgKGppbnQpYXZhaWxhYmxlX2NvbnRleHRzLCAoamludClzdXBwb3J0ZWRfY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamludClzdGF0dXMsIGFkZHIuZ2V0KCkpOwotICB9Ci19OwotCi1zdGF0aWMgUGFjc0NsaWVudENhbGxiYWNrc0ltcGwgc1BhY3NDbGllbnRDYWxsYmFja3M7Ci0KLXN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7Ci0KLSAgamNsYXNzIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MgPQotICAgICAgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENvZGVjQ29uZmlnIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmNvbnN0cnVjdG9yID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgIjxpbml0PiIsICIoSUlJSUlKSkpKKVYiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuZ2V0Q29kZWNUeXBlID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjVHlwZSIsICIoKUkiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuZ2V0Q29kZWNQcmlvcml0eSA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1ByaW9yaXR5IiwgIigpSSIpOwotICBhbmRyb2lkX2JsdWV0b290aF9wYWNzX3JlY29yZC5nZXRTYW1wbGVSYXRlID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldFNhbXBsZVJhdGUiLCAiKClJIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmdldEJpdHNQZXJTYW1wbGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Qml0c1BlclNhbXBsZSIsICIoKUkiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuZ2V0Q2hhbm5lbE1vZGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Q2hhbm5lbE1vZGUiLCAiKClJIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmdldENvZGVjU3BlY2lmaWMxID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1NwZWNpZmljMSIsICIoKUoiKTsKLSAgYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuZ2V0Q29kZWNTcGVjaWZpYzIgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgam5pQmx1ZXRvb3RoQ29kZWNDb25maWdDbGFzcywgImdldENvZGVjU3BlY2lmaWMyIiwgIigpSiIpOwotICBhbmRyb2lkX2JsdWV0b290aF9wYWNzX3JlY29yZC5nZXRDb2RlY1NwZWNpZmljMyA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICBqbmlCbHVldG9vdGhDb2RlY0NvbmZpZ0NsYXNzLCAiZ2V0Q29kZWNTcGVjaWZpYzMiLCAiKClKIik7Ci0gIGFuZHJvaWRfYmx1ZXRvb3RoX3BhY3NfcmVjb3JkLmdldENvZGVjU3BlY2lmaWM0ID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgIGpuaUJsdWV0b290aENvZGVjQ29uZmlnQ2xhc3MsICJnZXRDb2RlY1NwZWNpZmljNCIsICIoKUoiKTsKLQotICBtZXRob2RfT25Jbml0aWFsaXplZCA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiT25Jbml0aWFsaXplZCIsICIoSUkpViIpOwotCi0gIG1ldGhvZF9vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCIsICIoW0JJKVYiKTsKLQotICBtZXRob2RfT25BdWRpb0NvbnRleHRBdmFpbGFibGUgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIk9uQXVkaW9Db250ZXh0QXZhaWxhYmxlIiwgIihbQkkpViIpOwotCi0gIG1ldGhvZF9vblNlcnZpY2VEaXNjb3ZlcnkgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uU2VydmljZURpc2NvdmVyeSIsICIoW0xhbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDb2RlY0NvbmZpZzsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltMYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ29kZWNDb25maWc7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJSUlJSVtCKVYiKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3VjY2VlZHMiOwotfQotCi1zdGF0aWMgdm9pZCBpbml0TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBpbnRlcmZhY2VfbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBjYWxsYmFja3NfbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidEluZiA9IGdldEJsdWV0b290aEludGVyZmFjZSgpOwotICBpZiAoYnRJbmYgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgIkJsdWV0b290aCBtb2R1bGUgaXMgbm90IGxvYWRlZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHNQYWNzQ2xpZW50SW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBMT0coSU5GTykgPDwgIkNsZWFuaW5nIHVwIFBhY3NDbGllbnQgSW50ZXJmYWNlIGJlZm9yZSBpbml0aWFsaXppbmcuLi4iOwotICAgIHNQYWNzQ2xpZW50SW50ZXJmYWNlLT5DbGVhbnVwKDApOwotICAgIHNQYWNzQ2xpZW50SW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmIChtQ2FsbGJhY2tzT2JqICE9IG51bGxwdHIpIHsKLSAgICBMT0coSU5GTykgPDwgIkNsZWFuaW5nIHVwIFBhY3NDbGllbnQgY2FsbGJhY2sgb2JqZWN0IjsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2FsbGJhY2tzT2JqKTsKLSAgICBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmICgobUNhbGxiYWNrc09iaiA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCkpID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgR2xvYmFsIFJlZiBmb3IgcGFjcyBjbGllbnQgQ2FsbGJhY2tzIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhbmRyb2lkX2JsdWV0b290aF9wYWNzX3JlY29yZC5jbGF6eiA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoCi0gICAgICBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ29kZWNDb25maWciKSk7Ci0gIGlmIChhbmRyb2lkX2JsdWV0b290aF9wYWNzX3JlY29yZC5jbGF6eiA9PSBudWxscHRyKSB7Ci0gICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgR2xvYmFsIFJlZiBmb3IgQmx1ZXRvb3RoQ29kZWNDb25maWcgY2xhc3MiLAotICAgICAgICAgIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzUGFjc0NsaWVudEludGVyZmFjZSA9IChQYWNzQ2xpZW50SW50ZXJmYWNlKilidEluZi0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgQlRfUFJPRklMRV9QQUNTX0NMSUVOVF9JRCk7Ci0gIGlmIChzUGFjc0NsaWVudEludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBCbHVldG9vdGggcGFjcyBjbGllbnQgSW50ZXJmYWNlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzUGFjc0NsaWVudEludGVyZmFjZS0+SW5pdCgmc1BhY3NDbGllbnRDYWxsYmFja3MpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCBjbGllbnRfaWQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzUGFjc0NsaWVudEludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkNsZWFudXAoY2xpZW50X2lkKTsKLSAgICBzUGFjc0NsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLQotICBpZiAobUNhbGxiYWNrc09iaiAhPSBudWxscHRyKSB7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNhbGxiYWNrc09iaik7Ci0gICAgbUNhbGxiYWNrc09iaiA9IG51bGxwdHI7Ci0gIH0KLSAgZW52LT5EZWxldGVHbG9iYWxSZWYoYW5kcm9pZF9ibHVldG9vdGhfcGFjc19yZWNvcmQuY2xhenopOwotICBhbmRyb2lkX2JsdWV0b290aF9wYWNzX3JlY29yZC5jbGF6eiA9IG51bGxwdHI7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBjb25uZWN0UGFjc0NsaWVudE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjbGllbnRfaWQsIGpieXRlQXJyYXkgYWRkcmVzcykgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzUGFjc0NsaWVudEludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzKiB0bXByYXcgPSAoUmF3QWRkcmVzcyopYWRkcjsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoY2xpZW50X2lkLCAqdG1wcmF3KTsKLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIGRpc2Nvbm5lY3RQYWNzQ2xpZW50TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNsaWVudF9pZCwgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNQYWNzQ2xpZW50SW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdChjbGllbnRfaWQsICp0bXByYXcpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gc3RhcnREaXNjb3ZlcnlOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY2xpZW50X2lkLCBqYnl0ZUFycmF5IGFkZHJlc3MpIHsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNQYWNzQ2xpZW50SW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzKiB0bXByYXcgPSAoUmF3QWRkcmVzcyopYWRkcjsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPlN0YXJ0RGlzY292ZXJ5KGNsaWVudF9pZCwgKnRtcHJhdyk7Ci0gIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGFkZHJlc3MsIGFkZHIsIDApOwotICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkIEdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHNOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNsaWVudF9pZCwgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzUGFjc0NsaWVudEludGVyZmFjZSkgcmV0dXJuOwotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+R2V0QXZhaWxhYmxlQXVkaW9Db250ZXh0cyhjbGllbnRfaWQsICp0bXByYXcpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLX0KLQotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCi0gICAgeyJpbml0TmF0aXZlIiwgIigpViIsICh2b2lkKilpbml0TmF0aXZlfSwKLSAgICB7ImNsZWFudXBOYXRpdmUiLCAiKEkpViIsICh2b2lkKiljbGVhbnVwTmF0aXZlfSwKLSAgICB7ImNvbm5lY3RQYWNzQ2xpZW50TmF0aXZlIiwgIihJW0IpWiIsICh2b2lkKiljb25uZWN0UGFjc0NsaWVudE5hdGl2ZX0sCi0gICAgeyJkaXNjb25uZWN0UGFjc0NsaWVudE5hdGl2ZSIsICIoSVtCKVoiLCAodm9pZCopZGlzY29ubmVjdFBhY3NDbGllbnROYXRpdmV9LAotICAgIHsic3RhcnREaXNjb3ZlcnlOYXRpdmUiLCAiKElbQilaIiwgKHZvaWQqKXN0YXJ0RGlzY292ZXJ5TmF0aXZlfSwKLSAgICB7IkdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHNOYXRpdmUiLCAiKElbQilaIiwgKHZvaWQqKUdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHNOYXRpdmV9LAotfTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF9wYWNzX2NsaWVudChKTklFbnYqIGVudikgewotICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKAotICAgICAgZW52LCAiY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3BjL1BhY3NDbGllbnROYXRpdmVJbnRlcmZhY2UiLAotICAgICAgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvam5pL2NvbV9hbmRyb2lkX2JsdWV0b290aF92Y3BfY29udHJvbGxlci5jcHAgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX3ZjcF9jb250cm9sbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyZmQ4YS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9qbmkvY29tX2FuZHJvaWRfYmx1ZXRvb3RoX3ZjcF9jb250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICpDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoVkNQQ29udHJvbGxlckpuaSIKLQotI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImNvbV9hbmRyb2lkX2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X3ZjcF9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+Ci0KLXVzaW5nIGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OlZjcENvbnRyb2xsZXJDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OnZjcF9jb250cm9sbGVyOjpWY3BDb250cm9sbGVySW50ZXJmYWNlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblZvbHVtZVN0YXRlQ2hhbmdlOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25Wb2x1bWVGbGFnc0NoYW5nZTsKLQotc3RhdGljIFZjcENvbnRyb2xsZXJJbnRlcmZhY2UqIHNWY3BDb250cm9sbGVySW50ZXJmYWNlID0gbnVsbHB0cjsKLXN0YXRpYyBzdGQ6OnNoYXJlZF90aW1lZF9tdXRleCBpbnRlcmZhY2VfbXV0ZXg7Ci0KLXN0YXRpYyBqb2JqZWN0IG1DYWxsYmFja3NPYmogPSBudWxscHRyOwotc3RhdGljIHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4IGNhbGxiYWNrc19tdXRleDsKLQotY2xhc3MgVmNwQ29udHJvbGxlckNhbGxiYWNrc0ltcGwgOiBwdWJsaWMgVmNwQ29udHJvbGxlckNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB+VmNwQ29udHJvbGxlckNhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soY2FsbGJhY2tzX211dGV4KTsKLSAgICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICAgIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkgfHwgbUNhbGxiYWNrc09iaiA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHNpemVvZihSYXdBZGRyZXNzKSkpOwotICAgIGlmICghYWRkci5nZXQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIgZm9yIGNvbm5lY3Rpb24gc3RhdGUiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIuZ2V0KCksIDAsIHNpemVvZihSYXdBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSZiZF9hZGRyKTsKLSAgICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamludClzdGF0ZSwgYWRkci5nZXQoKSk7Ci0gIH0KLQotCi0gIHZvaWQgT25Wb2x1bWVTdGF0ZUNoYW5nZSh1aW50OF90IHZvbHVtZSwgdWludDhfdCBtdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgICBzdGQ6OnNoYXJlZF9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBsb2NrKGNhbGxiYWNrc19tdXRleCk7Ci0gICAgQ2FsbGJhY2tFbnYgc0NhbGxiYWNrRW52KF9fZnVuY19fKTsKLSAgICBpZiAoIXNDYWxsYmFja0Vudi52YWxpZCgpIHx8IG1DYWxsYmFja3NPYmogPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gYWRkcigKLSAgICAgICAgc0NhbGxiYWNrRW52LmdldCgpLCBzQ2FsbGJhY2tFbnYtPk5ld0J5dGVBcnJheShzaXplb2YoUmF3QWRkcmVzcykpKTsKLSAgICBpZiAoIWFkZHIuZ2V0KCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBuZXcgamJ5dGVBcnJheSBiZCBhZGRyIGZvciBjb25uZWN0aW9uIHN0YXRlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzQ2FsbGJhY2tFbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihhZGRyLmdldCgpLCAwLCBzaXplb2YoUmF3QWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpieXRlKikmYmRfYWRkcik7Ci0gICAgc0NhbGxiYWNrRW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBtZXRob2Rfb25Wb2x1bWVTdGF0ZUNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KXZvbHVtZSwgKGpib29sZWFuKW11dGUsIGFkZHIuZ2V0KCkpOwotICB9Ci0KLSAgdm9pZCBPblZvbHVtZUZsYWdzQ2hhbmdlKHVpbnQ4X3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soY2FsbGJhY2tzX211dGV4KTsKLSAgICBDYWxsYmFja0VudiBzQ2FsbGJhY2tFbnYoX19mdW5jX18pOwotICAgIGlmICghc0NhbGxiYWNrRW52LnZhbGlkKCkgfHwgbUNhbGxiYWNrc09iaiA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiBhZGRyKAotICAgICAgICBzQ2FsbGJhY2tFbnYuZ2V0KCksIHNDYWxsYmFja0Vudi0+TmV3Qnl0ZUFycmF5KHNpemVvZihSYXdBZGRyZXNzKSkpOwotICAgIGlmICghYWRkci5nZXQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG5ldyBqYnl0ZUFycmF5IGJkIGFkZHIgZm9yIGNvbm5lY3Rpb24gc3RhdGUiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNDYWxsYmFja0Vudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFkZHIuZ2V0KCksIDAsIHNpemVvZihSYXdBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSZiZF9hZGRyKTsKLSAgICBzQ2FsbGJhY2tFbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIG1ldGhvZF9vblZvbHVtZUZsYWdzQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpZmxhZ3MsIGFkZHIuZ2V0KCkpOwotICB9Ci19OwotCi1zdGF0aWMgVmNwQ29udHJvbGxlckNhbGxiYWNrc0ltcGwgc1ZjcENvbnRyb2xsZXJDYWxsYmFja3M7Ci0KLXN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZShKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KSB7Ci0gIG1ldGhvZF9vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCIsICIoSVtCKVYiKTsKLQotICBtZXRob2Rfb25Wb2x1bWVTdGF0ZUNoYW5nZSA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiT25Wb2x1bWVTdGF0ZUNoYW5nZSIsICIoSUlbQilWIik7Ci0KLSAgbWV0aG9kX29uVm9sdW1lRmxhZ3NDaGFuZ2UgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIk9uVm9sdW1lRmxhZ3NDaGFuZ2UiLCAiKElbQilWIik7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN1Y2NlZWRzIjsKLX0KLQotc3RhdGljIHZvaWQgaW5pdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gaW50ZXJmYWNlX2xvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gY2FsbGJhY2tzX2xvY2soY2FsbGJhY2tzX211dGV4KTsKLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRJbmYgPSBnZXRCbHVldG9vdGhJbnRlcmZhY2UoKTsKLSAgaWYgKGJ0SW5mID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJCbHVldG9vdGggbW9kdWxlIGlzIG5vdCBsb2FkZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzVmNwQ29udHJvbGxlckludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgTE9HKElORk8pIDw8ICJDbGVhbmluZyB1cCBWY3BDb250cm9sbGVyIEludGVyZmFjZSBiZWZvcmUgaW5pdGlhbGl6aW5nLi4uIjsKLSAgICBzVmNwQ29udHJvbGxlckludGVyZmFjZS0+Q2xlYW51cCgpOwotICAgIHNWY3BDb250cm9sbGVySW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmIChtQ2FsbGJhY2tzT2JqICE9IG51bGxwdHIpIHsKLSAgICBMT0coSU5GTykgPDwgIkNsZWFuaW5nIHVwIFZjcENvbnRyb2xsZXIgY2FsbGJhY2sgb2JqZWN0IjsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2FsbGJhY2tzT2JqKTsKLSAgICBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmICgobUNhbGxiYWNrc09iaiA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCkpID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgR2xvYmFsIFJlZiBmb3IgVmNwIENvbnRyb2xsZXIgQ2FsbGJhY2tzIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzVmNwQ29udHJvbGxlckludGVyZmFjZSA9IChWY3BDb250cm9sbGVySW50ZXJmYWNlKilidEluZi0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgQlRfUFJPRklMRV9WT0xVTUVfQ09OVFJPTF9JRCk7Ci0gIGlmIChzVmNwQ29udHJvbGxlckludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBCbHVldG9vdGggSGVhcmluZyBBaWQgSW50ZXJmYWNlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzVmNwQ29udHJvbGxlckludGVyZmFjZS0+SW5pdCgmc1ZjcENvbnRyb2xsZXJDYWxsYmFja3MpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwTmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBpbnRlcmZhY2VfbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4PiBjYWxsYmFja3NfbG9jayhjYWxsYmFja3NfbXV0ZXgpOwotCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidEluZiA9IGdldEJsdWV0b290aEludGVyZmFjZSgpOwotICBpZiAoYnRJbmYgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgIkJsdWV0b290aCBtb2R1bGUgaXMgbm90IGxvYWRlZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHNWY3BDb250cm9sbGVySW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBzVmNwQ29udHJvbGxlckludGVyZmFjZS0+Q2xlYW51cCgpOwotICAgIHNWY3BDb250cm9sbGVySW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmIChtQ2FsbGJhY2tzT2JqICE9IG51bGxwdHIpIHsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2FsbGJhY2tzT2JqKTsKLSAgICBtQ2FsbGJhY2tzT2JqID0gbnVsbHB0cjsKLSAgfQotfQotCi1zdGF0aWMgamJvb2xlYW4gY29ubmVjdFZjcE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzLCBqYm9vbGVhbiBpc0RpcmVjdCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzVmNwQ29udHJvbGxlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzKiB0bXByYXcgPSAoUmF3QWRkcmVzcyopYWRkcjsKLSAgc1ZjcENvbnRyb2xsZXJJbnRlcmZhY2UtPkNvbm5lY3QoKnRtcHJhdywgaXNEaXJlY3QpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdFZjcE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNWY3BDb250cm9sbGVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotICBzVmNwQ29udHJvbGxlckludGVyZmFjZS0+RGlzY29ubmVjdCgqdG1wcmF3KTsKLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHNldEFic1ZvbHVtZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCB2b2x1bWUsIGpieXRlQXJyYXkgYWRkcmVzcykgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c3RkOjpzaGFyZWRfdGltZWRfbXV0ZXg+IGxvY2soaW50ZXJmYWNlX211dGV4KTsKLSAgaWYgKCFzVmNwQ29udHJvbGxlckludGVyZmFjZSkgcmV0dXJuIEpOSV9GQUxTRTsKLQotICBqYnl0ZSogYWRkciA9IGVudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgbnVsbHB0cik7Ci0gIGlmICghYWRkcikgewotICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBFSU5WQUwpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci0gIH0KLQotICBSYXdBZGRyZXNzKiB0bXByYXcgPSAoUmF3QWRkcmVzcyopYWRkcjsKLSAgc1ZjcENvbnRyb2xsZXJJbnRlcmZhY2UtPlNldEFic1ZvbHVtZSh2b2x1bWUsICp0bXByYXcpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gbXV0ZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNWY3BDb250cm9sbGVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotICBzVmNwQ29udHJvbGxlckludGVyZmFjZS0+TXV0ZSgqdG1wcmF3KTsKLSAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoYWRkcmVzcywgYWRkciwgMCk7Ci0gIHJldHVybiBKTklfVFJVRTsKLX0KLQotc3RhdGljIGpib29sZWFuIHVubXV0ZU5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyZXNzKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpzaGFyZWRfbG9jazxzdGQ6OnNoYXJlZF90aW1lZF9tdXRleD4gbG9jayhpbnRlcmZhY2VfbXV0ZXgpOwotICBpZiAoIXNWY3BDb250cm9sbGVySW50ZXJmYWNlKSByZXR1cm4gSk5JX0ZBTFNFOwotCi0gIGpieXRlKiBhZGRyID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBudWxscHRyKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIEVJTlZBTCk7Ci0gICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgfQotCi0gIFJhd0FkZHJlc3MqIHRtcHJhdyA9IChSYXdBZGRyZXNzKilhZGRyOwotICBzVmNwQ29udHJvbGxlckludGVyZmFjZS0+VW5tdXRlKCp0bXByYXcpOwotICBlbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhhZGRyZXNzLCBhZGRyLCAwKTsKLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7Ci0gICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCi0gICAgeyJpbml0TmF0aXZlIiwgIigpViIsICh2b2lkKilpbml0TmF0aXZlfSwKLSAgICB7ImNsZWFudXBOYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsZWFudXBOYXRpdmV9LAotICAgIHsiY29ubmVjdFZjcE5hdGl2ZSIsICIoW0JaKVoiLCAodm9pZCopY29ubmVjdFZjcE5hdGl2ZX0sCi0gICAgeyJkaXNjb25uZWN0VmNwTmF0aXZlIiwgIihbQilaIiwgKHZvaWQqKWRpc2Nvbm5lY3RWY3BOYXRpdmV9LAotICAgIHsic2V0QWJzVm9sdW1lTmF0aXZlIiwgIihJW0IpWiIsICh2b2lkKilzZXRBYnNWb2x1bWVOYXRpdmV9LAotICAgIHsibXV0ZU5hdGl2ZSIsICIoW0IpWiIsICh2b2lkKiltdXRlTmF0aXZlfSwKLSAgICB7InVubXV0ZU5hdGl2ZSIsICIoW0IpWiIsICh2b2lkKil1bm11dGVOYXRpdmV9LAotfTsKLQotaW50IHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2JsdWV0b290aF92Y3BfY29udHJvbGxlcihKTklFbnYqIGVudikgewotICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKAotICAgICAgZW52LCAiY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC9WY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlIiwKLSAgICAgIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwotfQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtQ29kZWNDb25maWcuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbUNvZGVjQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzljNjYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtQ29kZWNDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFjbTsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjU3RhdHVzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguUjsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLkFkYXB0ZXJTZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLS8qCi0gKiBBQ00gQ29kZWMgQ29uZmlndXJhdGlvbiBzZXR1cC4KLSAqLwotY2xhc3MgQWNtQ29kZWNDb25maWcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjbUNvZGVjQ29uZmlnIjsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9VTktOT1dOID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9NVVNJQyA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1RZUEVfVk9JQ0UgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFID0gMzsKLQotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIEFjbU5hdGl2ZUludGVyZmFjZSBtQWNtTmF0aXZlSW50ZXJmYWNlOwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIG1Db2RlY0NvbmZpZ1ByaW9yaXRpZXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUFjbVNvdXJjZUNvZGVjUHJpb3JpdHlMQzMgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DT0RFQ19QUklPUklUWV9ERUZBVUxUOwotCi0gICAgcHJpdmF0ZSBpbnQgYXNzaWduZWRfY29kZWNfbGVuZ3RoID0gMDsKLSAgICBBY21Db2RlY0NvbmZpZyhDb250ZXh0IGNvbnRleHQsIEFjbU5hdGl2ZUludGVyZmFjZSBhY21OYXRpdmVJbnRlcmZhY2UpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQWNtTmF0aXZlSW50ZXJmYWNlID0gYWNtTmF0aXZlSW50ZXJmYWNlOwotICAgICAgICBtQ29kZWNDb25maWdQcmlvcml0aWVzID0gYXNzaWduQ29kZWNDb25maWdQcmlvcml0aWVzKCk7Ci0gICAgfQotCi0gICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBjb2RlY0NvbmZpZ1ByaW9yaXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ29kZWNDb25maWdQcmlvcml0aWVzOwotICAgIH0KLQotICAgIHZvaWQgc2V0Q29kZWNDb25maWdQcmVmZXJlbmNlKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWcgbmV3Q29kZWNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIC8vT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjb2RlY1N0YXR1cyk7Ci0KLSAgICAgICAgLyovLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlY0NvbmZpZyBpcyBzZWxlY3RhYmxlIGZvciB0aGlzIEJsdWV0b290aCBkZXZpY2UuCi0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnW10gc2VsZWN0YWJsZUNvZGVjcyA9IGNvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgaWYgKCFBcnJheXMuYXNMaXN0KHNlbGVjdGFibGVDb2RlY3MpLnN0cmVhbSgpLmFueU1hdGNoKGNvZGVjIC0+Ci0gICAgICAgICAgICAgICAgY29kZWMuaXNNYW5kYXRvcnlDb2RlYygpKSkgewotICAgICAgICAgICAgLy8gRG8gbm90IHNldCBjb2RlYyBwcmVmZXJlbmNlIHRvIG5hdGl2ZSBpZiB0aGUgc2VsZWN0YWJsZUNvZGVjcyBub3QgY29udGFpbiBtYW5kYXRvcnkKLSAgICAgICAgICAgIC8vIGNvZGVjLiBUaGUgcmVhc29uIGNvdWxkIGJlIHJlbW90ZSBjb2RlYyBuZWdvdGlhdGlvbiBpcyBub3QgY29tcGxldGVkIHlldC4KLSAgICAgICAgICAgIExvZy53KFRBRywgInNldENvZGVjQ29uZmlnUHJlZmVyZW5jZTogbXVzdCBoYXZlIG1hbmRhdG9yeSBjb2RlYyBiZWZvcmUgY2hhbmdpbmcuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjb2RlY1N0YXR1cy5pc0NvZGVjQ29uZmlnU2VsZWN0YWJsZShuZXdDb2RlY0NvbmZpZykpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNldENvZGVjQ29uZmlnUHJlZmVyZW5jZTogaW52YWxpZCBjb2RlYyAiCi0gICAgICAgICAgICAgICAgICAgICsgT2JqZWN0cy50b1N0cmluZyhuZXdDb2RlY0NvbmZpZykpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWNDb25maWcgd291bGQgY2hhbmdlIGN1cnJlbnQgY29kZWMgY29uZmlnLgotICAgICAgICBpbnQgcHJpb3JpdGl6ZWRDb2RlY1R5cGUgPSBnZXRQcmlvaXRpemVkQ29kZWNUeXBlKG5ld0NvZGVjQ29uZmlnLCBzZWxlY3RhYmxlQ29kZWNzKTsKLSAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWcgY3VycmVudENvZGVjQ29uZmlnID0gY29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKTsKLSAgICAgICAgaWYgKHByaW9yaXRpemVkQ29kZWNUeXBlID09IGN1cnJlbnRDb2RlY0NvbmZpZy5nZXRDb2RlY1R5cGUoKQotICAgICAgICAgICAgICAgICYmIChwcmlvcml0aXplZENvZGVjVHlwZSAhPSBuZXdDb2RlY0NvbmZpZy5nZXRDb2RlY1R5cGUoKQotICAgICAgICAgICAgICAgIHx8IChjdXJyZW50Q29kZWNDb25maWcuc2ltaWxhckNvZGVjRmVlZGluZ1BhcmFtZXRlcnMobmV3Q29kZWNDb25maWcpCi0gICAgICAgICAgICAgICAgJiYgY3VycmVudENvZGVjQ29uZmlnLnNhbWVDb2RlY1NwZWNpZmljUGFyYW1ldGVycyhuZXdDb2RlY0NvbmZpZykpKSkgewotICAgICAgICAgICAgLy8gU2FtZSBjb2RlYyB3aXRoIHNhbWUgcGFyYW1ldGVycywgbm8gbmVlZCB0byBzZW5kIHRoaXMgcmVxdWVzdCB0byBuYXRpdmUuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJzZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2U6IGNvZGVjIG5vdCBjaGFuZ2VkLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ki8KLQotICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIGNvZGVjQ29uZmlnQXJyYXkgPSBuZXcgQmx1ZXRvb3RoQ29kZWNDb25maWdbMV07Ci0gICAgICAgIGNvZGVjQ29uZmlnQXJyYXlbMF0gPSBuZXdDb2RlY0NvbmZpZzsKLSAgICAgICAgbUFjbU5hdGl2ZUludGVyZmFjZS5zZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2UoZGV2aWNlLCBjb2RlY0NvbmZpZ0FycmF5LCBjb250ZXh0VHlwZSwgY29udGV4dFR5cGUpOwotICAgIH0KLQotICAgIC8vIEdldCB0aGUgY29kZWMgdHlwZSBvZiB0aGUgaGlnaGVzdCBwcmlvcml0eSBvZiBzZWxlY3RhYmxlQ29kZWNzIGFuZCBjb2RlY0NvbmZpZy4KLSAgICBwcml2YXRlIGludCBnZXRQcmlvaXRpemVkQ29kZWNUeXBlKEJsdWV0b290aENvZGVjQ29uZmlnIGNvZGVjQ29uZmlnLAotICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBzZWxlY3RhYmxlQ29kZWNzKSB7Ci0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIHByaW9yaXRpemVkQ29kZWNDb25maWcgPSBjb2RlY0NvbmZpZzsKLSAgICAgICAgZm9yIChCbHVldG9vdGhDb2RlY0NvbmZpZyBjb25maWcgOiBzZWxlY3RhYmxlQ29kZWNzKSB7Ci0gICAgICAgICAgICBpZiAocHJpb3JpdGl6ZWRDb2RlY0NvbmZpZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpb3JpdGl6ZWRDb2RlY0NvbmZpZyA9IGNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb25maWcuZ2V0Q29kZWNQcmlvcml0eSgpID4gcHJpb3JpdGl6ZWRDb2RlY0NvbmZpZy5nZXRDb2RlY1ByaW9yaXR5KCkpIHsKLSAgICAgICAgICAgICAgICBwcmlvcml0aXplZENvZGVjQ29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmlvcml0aXplZENvZGVjQ29uZmlnLmdldENvZGVjVHlwZSgpOwotICAgIH0KLQotICAgIC8vIEFzc2lnbiB0aGUgQUNNIFNvdXJjZSBjb2RlYyBjb25maWcgcHJpb3JpdGllcwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBhc3NpZ25Db2RlY0NvbmZpZ1ByaW9yaXRpZXMoKSB7Ci0gICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgbUFjbVNvdXJjZUNvZGVjUHJpb3JpdHlMQzMgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DT0RFQ19QUklPUklUWV9ISUdIRVNUOwotCi0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIGNvZGVjQ29uZmlnOwotICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIGNvZGVjQ29uZmlnQXJyYXk7Ci0gICAgICAgIGludCBjb2RlY0NvdW50ID0gMDsKLSAgICAgICAgY29kZWNDb25maWdBcnJheSA9Ci0gICAgICAgICAgICAgICAgbmV3IEJsdWV0b290aENvZGVjQ29uZmlnW0JsdWV0b290aENvZGVjQ29uZmlnLlNPVVJDRV9RVkFfQ09ERUNfVFlQRV9NQVhdOwotCi0gICAgICAgIGNvZGVjQ29uZmlnID0gbmV3IEJsdWV0b290aENvZGVjQ29uZmlnKEJsdWV0b290aENvZGVjQ29uZmlnLlNPVVJDRV9DT0RFQ19UWVBFX0xDMywKLSAgICAgICAgICAgICAgICBtQWNtU291cmNlQ29kZWNQcmlvcml0eUxDMywgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfTk9ORSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZy5CSVRTX1BFUl9TQU1QTEVfTk9ORSwgQmx1ZXRvb3RoQ29kZWNDb25maWcKLSAgICAgICAgICAgICAgICAuQ0hBTk5FTF9NT0RFX05PTkUsIDAgLyogY29kZWNTcGVjaWZpYzEgKi8sCi0gICAgICAgICAgICAgICAgMCAvKiBjb2RlY1NwZWNpZmljMiAqLywgMCAvKiBjb2RlY1NwZWNpZmljMyAqLywgMCAvKiBjb2RlY1NwZWNpZmljNCAqLyk7Ci0gICAgICAgIGNvZGVjQ29uZmlnQXJyYXlbY29kZWNDb3VudCsrXSA9IGNvZGVjQ29uZmlnOwotICAgICAgICBhc3NpZ25lZF9jb2RlY19sZW5ndGggPSBjb2RlY0NvdW50OwotICAgICAgICByZXR1cm4gY29kZWNDb25maWdBcnJheTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbU5hdGl2ZUludGVyZmFjZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtTmF0aXZlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZjI0ZGMuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtTmF0aXZlSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5hY207Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjU3RhdHVzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotLyoqCi0gKiBBQ00gTmF0aXZlIEludGVyZmFjZSB0by9mcm9tIEpOSS4KLSAqLwotcHVibGljIGNsYXNzIEFjbU5hdGl2ZUludGVyZmFjZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY21OYXRpdmVJbnRlcmZhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1RZUEVfVU5LTk9XTiA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1RZUEVfTVVTSUMgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX1ZPSUNFID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSA9IDM7Ci0gICAgQEd1YXJkZWRCeSgiSU5TVEFOQ0VfTE9DSyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWNtTmF0aXZlSW50ZXJmYWNlIHNJbnN0YW5jZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSU5TVEFOQ0VfTE9DSyA9IG5ldyBPYmplY3QoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHByaXZhdGUgQWNtTmF0aXZlSW50ZXJmYWNlKCkgewotICAgICAgICBtQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53dGYoVEFHLCAiTm8gQmx1ZXRvb3RoIEFkYXB0ZXIgQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWNtTmF0aXZlSW50ZXJmYWNlIGdldEluc3RhbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKElOU1RBTkNFX0xPQ0spIHsKLSAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBY21OYXRpdmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgbWF4aW11bSBudW1iZXIgb2YgQTJEUCBTaW5rIGRldmljZXMgdGhhdCBjYW4gYmUgY29ubmVjdGVkCi0gICAgICogc2ltdWx0YW5lb3VzbHkKLSAgICAgKiBAcGFyYW0gY29kZWNDb25maWdQcmlvcml0aWVzIGFuIGFycmF5IHdpdGggdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBwcmlvcml0aWVzIHRvIGNvbmZpZ3VyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KGludCBtYXhDb25uZWN0ZWRBdWRpb0RldmljZXMsIEJsdWV0b290aENvZGVjQ29uZmlnW10gY29kZWNDb25maWdQcmlvcml0aWVzKSB7Ci0gICAgICAgIGluaXROYXRpdmUobWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzLCBjb2RlY0NvbmZpZ1ByaW9yaXRpZXMpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGVzIEFDTSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3RBY20oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlLCBpbnQgcHJvZmlsZVR5cGUsIGludCBwcmVmZXJyZWRDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBjb25uZWN0QWNtTmF0aXZlKGdldEJ5dGVBZGRyZXNzKGRldmljZSksIGNvbnRleHRUeXBlLCBwcm9maWxlVHlwZSwgcHJlZmVycmVkQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgQUNNIGZyb20gYSByZW1vdGUgZGV2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgcmVtb3RlIGRldmljZQotICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEFjbShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29udGV4dFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3RBY21OYXRpdmUoZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSwgY29udGV4dFR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb25uZWN0ZWQgQUNNIGdyb3VwL3JlbW90ZSBhcyBhY3RpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIHJldHVybiBzZXRBY3RpdmVEZXZpY2VOYXRpdmUoZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSwgY29udGV4dFR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIFN0YXJ0IHN0cmVhbSB0byByZW1vdGUgZ3JvdXAvcmVtb3RlIGZvciB2b2ljZSBjYWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgcmVtb3RlIGRldmljZQotICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRTdHJlYW0oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIHJldHVybiBzdGFydFN0cmVhbU5hdGl2ZShnZXRCeXRlQWRkcmVzcyhkZXZpY2UpLCBjb250ZXh0VHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgU3RvcCBzdHJlYW0gdG8gcmVtb3RlIGdyb3VwL3JlbW90ZSBmb3Igdm9pY2UgY2FsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN0b3BTdHJlYW0oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIHJldHVybiBzdG9wU3RyZWFtTmF0aXZlKGdldEJ5dGVBZGRyZXNzKGRldmljZSksIGNvbnRleHRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIHByZWZlcmVuY2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgcmVtb3RlIEJsdWV0b290aCBkZXZpY2UKLSAgICAgKiBAcGFyYW0gY29kZWNDb25maWdBcnJheSBhbiBhcnJheSB3aXRoIHRoZSBjb2RlYyBjb25maWd1cmF0aW9ucyB0bwotICAgICAqIGNvbmZpZ3VyZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIGNvZGVjQ29uZmlnQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZXh0VHlwZSwgaW50IHByZWZlcnJlZENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZShnZXRCeXRlQWRkcmVzcyhkZXZpY2UpLCBjb2RlY0NvbmZpZ0FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRUeXBlLCBwcmVmZXJyZWRDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBDaGFuZ2VDb2RlY0NvbmZpZ1ByZWZlcmVuY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIENoYW5nZUNvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZShnZXRCeXRlQWRkcmVzcyhkZXZpY2UpLCBtZXNzYWdlKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2xlYW51cCB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICBjbGVhbnVwTmF0aXZlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlKGJ5dGVbXSBhZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gZ2V0Qnl0ZUFkZHJlc3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKCIwMDowMDowMDowMDowMDowMCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVRvU2VydmljZShBY21TdGFja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIEFjbVNlcnZpY2Ugc2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLm1lc3NhZ2VGcm9tTmF0aXZlKGV2ZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkV2ZW50IGlnbm9yZWQsIHNlcnZpY2Ugbm90IGF2YWlsYWJsZTogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBuYXRpdmUgc3RhY2sgYmFjayBpbnRvIHRoZSBKYXZhIGZyYW1ld29yay4KLSAgICAvLyBBbGwgY2FsbGJhY2tzIGFyZSByb3V0ZWQgdmlhIHRoZSBTZXJ2aWNlIHdoaWNoIHdpbGwgZGlzYW1iaWd1YXRlIHdoaWNoCi0gICAgLy8gc3RhdGUgbWFjaGluZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgcm91dGVkIHRvLgotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChieXRlW10gYWRkcmVzcywgaW50IHN0YXRlLCBpbnQgY29udGV4dFR5cGUpIHsKLSAgICAgICAgQWNtU3RhY2tFdmVudCBldmVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFjbVN0YWNrRXZlbnQoQWNtU3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGV2ZW50LmRldmljZSA9IGdldERldmljZShhZGRyZXNzKTsKLSAgICAgICAgZXZlbnQudmFsdWVJbnQxID0gc3RhdGU7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50MiA9IGNvbnRleHRUeXBlOwotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kTWVzc2FnZVRvU2VydmljZShldmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQXVkaW9TdGF0ZUNoYW5nZWQoYnl0ZVtdIGFkZHJlc3MsIGludCBzdGF0ZSwgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIEFjbVN0YWNrRXZlbnQgZXZlbnQgPSBuZXcgQWNtU3RhY2tFdmVudChBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQVVESU9fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGV2ZW50LmRldmljZSA9IGdldERldmljZShhZGRyZXNzKTsKLSAgICAgICAgZXZlbnQudmFsdWVJbnQxID0gc3RhdGU7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50MiA9IGNvbnRleHRUeXBlOwotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQXVkaW9TdGF0ZUNoYW5nZWQ6ICIgKyBldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZE1lc3NhZ2VUb1NlcnZpY2UoZXZlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvZGVjQ29uZmlnQ2hhbmdlZChieXRlW10gYWRkcmVzcywKLSAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG5ld0NvZGVjQ29uZmlnLAotICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBjb2RlY3NMb2NhbENhcGFiaWxpdGllcywKLSAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnW10gY29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcywgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIEFjbVN0YWNrRXZlbnQgZXZlbnQgPSBuZXcgQWNtU3RhY2tFdmVudChBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICBldmVudC5kZXZpY2UgPSBnZXREZXZpY2UoYWRkcmVzcyk7Ci0gICAgICAgIGV2ZW50LmNvZGVjU3RhdHVzID0gbmV3IEJsdWV0b290aENvZGVjU3RhdHVzKG5ld0NvZGVjQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3NMb2NhbENhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcyk7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50MiA9IGNvbnRleHRUeXBlOwotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvZGVjQ29uZmlnQ2hhbmdlZDogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kTWVzc2FnZVRvU2VydmljZShldmVudCk7Ci0gICAgfQotCi0gICAgLy8gTmF0aXZlIG1ldGhvZHMgdGhhdCBjYWxsIGludG8gdGhlIEpOSSBpbnRlcmZhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXROYXRpdmUoaW50IG1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBjb2RlY0NvbmZpZ1ByaW9yaXRpZXMpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdEFjbU5hdGl2ZShieXRlW10gYWRkcmVzcywgaW50IGNvbnRleHRUeXBlLCBpbnQgcHJvZmlsZVR5cGUsIGludCBwcmVmZXJyZWRDb250ZXh0KTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RBY21OYXRpdmUoYnl0ZVtdIGFkZHJlc3MsIGludCBjb250ZXh0VHlwZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2VOYXRpdmUoYnl0ZVtdIGFkZHJlc3MsIGludCBjb250ZXh0VHlwZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzdGFydFN0cmVhbU5hdGl2ZShieXRlW10gYWRkcmVzcywgaW50IGNvbnRleHRUeXBlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHN0b3BTdHJlYW1OYXRpdmUoYnl0ZVtdIGFkZHJlc3MsIGludCBjb250ZXh0VHlwZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2VOYXRpdmUoYnl0ZVtdIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBjb2RlY0NvbmZpZ0FycmF5LCBpbnQgY29udGV4dFR5cGUsIGludCBwcmVmZXJyZWRDb250ZXh0KTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIENoYW5nZUNvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZShieXRlW10gYWRkcmVzcywgU3RyaW5nIElkKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGNsZWFudXBOYXRpdmUoKTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbVNlcnZpY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyNjRhMS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FjbS9BY21TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYWNtOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHMuZW5mb3JjZUJsdWV0b290aFByaXZpbGVnZWRQZXJtaXNzaW9uOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwLk9wdGlvbmFsQ29kZWNzUHJlZmVyZW5jZVN0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwLk9wdGlvbmFsQ29kZWNzU3VwcG9ydFN0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY1N0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdyb3VwQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmdyb3VwY2xpZW50Lkdyb3VwU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5EZXZpY2VHcm91cDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2VHcm91cDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uVm9sdW1lTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGVNYWNoaW5lOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoTWV0cmljc1Byb3RvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTdGF0c0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkFwbUNvbnN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5NZXRyaWNzTG9nZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5TZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGgudmNwLlZjcENvbnRyb2xsZXI7Ci0vKioKLSAqIFByb3ZpZGVzIEJsdWV0b290aCBBQ00gcHJvZmlsZSwgYXMgYSBzZXJ2aWNlIGluIHRoZSBCbHVldG9vdGggYXBwbGljYXRpb24uCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgQWNtU2VydmljZSBleHRlbmRzIFByb2ZpbGVTZXJ2aWNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY21TZXJ2aWNlIjsKLSAgICBwcml2YXRlIFN0cmluZyBtQWNtTmFtZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ01fQVVESU9fVU5JQ0FTVCA9IDI1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0VUX0lEID0gMHgxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBBY21TZXJ2aWNlIHNBY21TZXJ2aWNlOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZTsKLSAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbVN0YXRlTWFjaGluZXNUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfUkVMRUFTRUQgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gKExPQ0sgUmVsZWFzZWQgc3VjY2Vzc2Z1bGx5KQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX1JFTEVBU0VEX1RJTUVPVVQgPSAxOyAgICAgICAgICAvLyAoTE9DSyBSZWxlYXNlZCBieSB0aW1lb3V0KQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExfTE9DS1NfQUNRVUlSRUQgPSAyOyAgICAgICAgICAgICAgLy8gKExPQ0sgQWNxdWlyZWQgZm9yIGFsbCByZXF1ZXN0ZWQgc2V0IG1lbWJlcnMpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNPTUVfTE9DS1NfQUNRVUlSRURfUkVBU09OX1RJTUVPVVQgPSAzOyAvLyAoUmVxdWVzdCB0aW1lb3V0IGZvciBzb21lIHNldCBtZW1iZXJzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTT01FX0xPQ0tTX0FDUVVJUkVEX1JFQVNPTl9ESVNDID0gNDsgICAvLyAoU29tZSBvZiB0aGUgc2V0IG1lbWJlcnMgd2VyZSBkaXNjb25uZWN0ZWQpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfREVOSUVEID0gNTsgICAgICAgICAgICAgICAgICAgICAvLyAoRGVuaWVkIGJ5IG9uZSBvZiB0aGUgc2V0IG1lbWJlcnMpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUkVRVUVTVF9QQVJBTVMgPSA2OyAgICAgICAgIC8vIChVcHBlciBsYXllciBwcm92aWRlZCBpbnZhbGlkIHBhcmFtZXRlcnMpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfUkVMRUFTRV9OT1RfQUxMT1dFRCA9IDc7ICAgICAgICAgICAvLyAoUmVzcG9uc2UgZnJvbSByZW1vdGUgKFBUUykpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVkFMVUUgPSA4OwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIEFjbU5hdGl2ZUludGVyZmFjZSBtQWNtTmF0aXZlSW50ZXJmYWNlOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIFNlcnZpY2VGYWN0b3J5IG1GYWN0b3J5ID0gbmV3IFNlcnZpY2VGYWN0b3J5KCk7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9VTktOT1dOID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9NVVNJQyA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1RZUEVfVk9JQ0UgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9CUk9BRENBU1RfQVVESU8gPSA2OwotCi0gICAgcHJpdmF0ZSBBY21Db2RlY0NvbmZpZyBtQWNtQ29kZWNDb25maWc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUF1ZGlvTWFuYWdlckxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUJ0TGVhTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtQnRBY21Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgU3RyaW5nIG1MZWFDaGFubmVsTW9kZSA9ICJzdGVyZW8iOwotICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgQEd1YXJkZWRCeSgibVN0YXRlTWFjaGluZXMiKQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1Hcm91cEJkQWRkcmVzcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZURldmljZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZURldmljZVZvaWNlID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBtQWN0aXZlRGV2aWNlUHJvZmlsZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZURldmljZVZvaWNlUHJvZmlsZSA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPEJsdWV0b290aERldmljZSwgQWNtU3RhdGVNYWNoaW5lPiBtU3RhdGVNYWNoaW5lcyA9Ci0gICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEJsdWV0b290aEFjbURldmljZT4gbUFjbURldmljZXMgPQotICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBCbHVldG9vdGhBY21EZXZpY2U+KCk7Ci0KLSAgICAvLyBVcHBlciBsaW1pdCBvZiBhbGwgQUNNIGRldmljZXM6IEJvbmRlZCBvciBDb25uZWN0ZWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FDTV9TVEFURV9NQUNISU5FUyA9IDUwOwotICAgIC8vIFVwcGVyIGxpbWl0IG9mIGFsbCBBQ00gZGV2aWNlcyB0aGF0IGFyZSBDb25uZWN0ZWQgb3IgQ29ubmVjdGluZwotICAgIHByaXZhdGUgaW50IG1NYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgPSAxOwotICAgIENzaXBNYW5hZ2VyIG1Dc2lwTWFuYWdlciA9IG51bGw7Ci0gICAgYm9vbGVhbiBtSXNDc2lwUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgIGJvb2xlYW4gbVNob1BlbmQgPSBmYWxzZTsKLSAgICBib29sZWFuIG1Wb2ljZVNob1BlbmQgPSBmYWxzZTsKLSAgICAvL3ZvbHVtZQotICAgIHByaXZhdGUgaW50IG1BdWRpb1N0cmVhbU1heDsKLSAgICBwcml2YXRlIGludCBtQWN0aXZlRGV2aWNlTG9jYWxNZWRpYVZvbDsKLSAgICBwcml2YXRlIGludCBtQWN0aXZlRGV2aWNlTG9jYWxWb2ljZVZvbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFjdGl2ZURldmljZUlzTXV0ZWQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZDUF9NQVhfVk9MID0gMjU1OwotICAgIHByaXZhdGUgVmNwQ29udHJvbGxlciBtVmNwQ29udHJvbGxlcjsKLQotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbUFjbU5hdGl2ZUludGVyZmFjZUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwotICAgIHB1YmxpYyBpbnQgbUNzaXBBcHBJZCA9IC0xOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9FQk1PTk9fQ0ZHID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0VCU1RFUkVPX0NGRyA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1vbm9DZmdfVGltZW91dCA9IDMwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFN0ZXJlb0NmZ19UaW1lb3V0ID0gMzAwMDsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKLSAgICAgICBAT3ZlcnJpZGUKLSAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKQotICAgICAgIHsKLSAgICAgICAgIHN5bmNocm9uaXplZChtQnRMZWFMb2NrKSB7Ci0gICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgIGNhc2UgU0VUX0VCTU9OT19DRkc6Ci0gICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0cGFyYW1ldGVycyB0byBNb25vIik7Ci0gICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQXVkaW9NYW5hZ2VyTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYobUF1ZGlvTWFuYWdlciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRQYXJhbWV0ZXJzKCJMRUFNb25vPXRydWUiKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgbUxlYUNoYW5uZWxNb2RlID0gIm1vbm8iOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBTRVRfRUJTVEVSRU9fQ0ZHOgotICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNldHBhcmFtZXRlcnMgdG8gc3RlcmVvIik7Ci0gICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQXVkaW9NYW5hZ2VyTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICBpZihtQXVkaW9NYW5hZ2VyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFBhcmFtZXRlcnMoIkxFQU1vbm89ZmFsc2UiKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgbUxlYUNoYW5uZWxNb2RlID0gInN0ZXJlbyI7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiY3JlYXRlKCkiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydCgpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAic3RhcnQoKSIpOwotICAgICAgICBTdHJpbmcgcHJvcFZhbHVlOwotCi0gICAgICAgIGlmIChzQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJBY21TZXJ2aWNlIGlzIGFscmVhZHkgcnVubmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDE6IEdldCBBZGFwdGVyU2VydmljZSwgQWNtTmF0aXZlSW50ZXJmYWNlLgotICAgICAgICAvLyBOb25lIG9mIHRoZW0gY2FuIGJlIG51bGwuCi0gICAgICAgIG1BZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBtQWRhcHRlclNlcnZpY2UgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCksCi0gICAgICAgICAgICAgICAgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIHdoZW4gQWNtU2VydmljZSBzdGFydHMiKTsKLSAgICAgICAgbUFjbU5hdGl2ZUludGVyZmFjZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoQWNtTmF0aXZlSW50ZXJmYWNlLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgIkFjbU5hdGl2ZUludGVyZmFjZSBjYW5ub3QgYmUgbnVsbCB3aGVuIEFjbVNlcnZpY2Ugc3RhcnRzIik7Ci0KLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChBZGFwdGVyU2VydmljZS5nZXRBZGFwdGVyU2VydmljZSgpLAotICAgICAgICAgICAgICAgICJBZGFwdGVyU2VydmljZSBjYW5ub3QgYmUgbnVsbCB3aGVuIFN0cmVhbUF1ZGlvU2VydmljZSBzdGFydHMiKTsKLQotICAgICAgICBMb2cuaShUQUcsICJtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9VbmljYXN0RmVhdHVyZVN1cHBvcnRlZCgpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICsgbUFkYXB0ZXJTZXJ2aWNlLmlzSG9zdEFkdkF1ZGlvVW5pY2FzdEZlYXR1cmVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIExvZy5pKFRBRywgIm1BZGFwdGVyU2VydmljZS5pc0hvc3RBZHZBdWRpb1N0ZXJlb1JlY29yZGluZ0ZlYXR1cmVTdXBwb3J0ZWQoKSByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICArIG1BZGFwdGVyU2VydmljZS5pc0hvc3RBZHZBdWRpb1N0ZXJlb1JlY29yZGluZ0ZlYXR1cmVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIExvZy5pKFRBRywgIm1BZGFwdGVyU2VydmljZS5pc0FkdlVuaWNhc3RBdWRpb0ZlYXRFbmFibGVkKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgKyBtQWRhcHRlclNlcnZpY2UuaXNBZHZVbmljYXN0QXVkaW9GZWF0RW5hYmxlZCgpKTsKLQotICAgICAgICAvLyBTT0Mgc3VwcG9ydHMgdW5pY2FzdCwgaG9zdCBzdXBwb3J0cyB1bmljYXN0IGFuZCBzdGVyZW8gcmVjb3JkaW5nCi0gICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9VbmljYXN0RmVhdHVyZVN1cHBvcnRlZCgpICYmCi0gICAgICAgICAgICBtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9TdGVyZW9SZWNvcmRpbmdGZWF0dXJlU3VwcG9ydGVkKCkgJiYKLSAgICAgICAgICAgIG1BZGFwdGVyU2VydmljZS5pc0FkdlVuaWNhc3RBdWRpb0ZlYXRFbmFibGVkKCkpIHsKLQotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU09DIHN1cHBvcnRzIHVuaWNhc3QsIGhvc3Qgc3VwcG9ydHMgdW5pY2FzdCwgc3RlcmVvIHJlY29yZGluZyIpOwotICAgICAgICAgICAgLy8gc2V0IHByb3BlcnRpZXMgb25seSBpZiB0aGV5IGFyZSBub3Qgc2V0IHRvIGFsbG93IHVzZXIgZW5hYmxlL2Rpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBmZWF0dXJlcyBleHBsaWNpdGx5Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5iYXAuZW5hYmxlX3VjYXN0Iik7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCB8fCBwcm9wVmFsdWUubGVuZ3RoKCkgPT0gMCB8fCAhcHJvcFZhbHVlLmVxdWFscygiZmFsc2UiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmJhcC5lbmFibGVfdWNhc3QiLCAidHJ1ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmJhcC5lbmFibGVfdWNhc3QgaXMgYWxyZWFkeSBzZXQgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wVmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9wVmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5yZWNvcmRpbmdfc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgfHwgcHJvcFZhbHVlLmxlbmd0aCgpID09IDAgfHwgIXByb3BWYWx1ZS5lcXVhbHMoImZhbHNlIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5yZWNvcmRpbmdfc3VwcG9ydGVkIiwgInRydWUiKTsKLSAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5yZWNvcmRpbmdfc3VwcG9ydGVkIHNldCB0byB0cnVlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQucmVjb3JkaW5nX3N1cHBvcnRlZCBpcyBhbHJlYWR5IHNldCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuaShUQUcsICJtQWRhcHRlclNlcnZpY2UuaXNIb3N0UUhTRmVhdHVyZVN1cHBvcnRlZCgpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICsgbUFkYXB0ZXJTZXJ2aWNlLmlzSG9zdFFIU0ZlYXR1cmVTdXBwb3J0ZWQoKSk7Ci0KLSAgICAgICAgLy8gU09DIHN1cHBvcnRzIHVuaWNhc3QsIGhvc3Qgc3VwcG9ydHMgdW5pY2FzdCBhbmQgUUhTCi0gICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9VbmljYXN0RmVhdHVyZVN1cHBvcnRlZCgpICYmCi0gICAgICAgICAgICBtQWRhcHRlclNlcnZpY2UuaXNIb3N0UUhTRmVhdHVyZVN1cHBvcnRlZCgpICYmCi0gICAgICAgICAgICBtQWRhcHRlclNlcnZpY2UuaXNBZHZVbmljYXN0QXVkaW9GZWF0RW5hYmxlZCgpKSB7Ci0KLSAgICAgICAgICAgIExvZy5pKFRBRywgIlNPQyBzdXBwb3J0cyB1bmljYXN0LCBob3N0IHN1cHBvcnRzIHVuaWNhc3QsIFFIUyIpOwotICAgICAgICAgICAgLy8gc2V0IHByb3BlcnRpZXMgb25seSBpZiB0aGV5IGFyZSBub3Qgc2V0IHRvIGFsbG93IHVzZXIgZW5hYmxlL2Rpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBmZWF0dXJlcyBleHBsaWNpdGx5Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5xaHNfZW5hYmxlIik7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCB8fCBwcm9wVmFsdWUubGVuZ3RoKCkgPT0gMCB8fCAhcHJvcFZhbHVlLmVxdWFscygiZmFsc2UiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnZlbmRvci5idHN0YWNrLnFoc19lbmFibGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmJhcC5lbmFibGVfdWNhc3QgaXMgYWxyZWFkeSBzZXQgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAiaXNIb3N0QWR2QXVkaW9MQzNRRmVhdHVyZVN1cHBvcnRlZCgpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9MQzNRRmVhdHVyZVN1cHBvcnRlZCgpKTsKLQotICAgICAgICAvLyBTT0Mgc3VwcG9ydHMgdW5pY2FzdCwgaG9zdCBzdXBwb3J0cyB1bmljYXN0IGFuZCBMQzNRCi0gICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9VbmljYXN0RmVhdHVyZVN1cHBvcnRlZCgpICYmCi0gICAgICAgICAgICBtQWRhcHRlclNlcnZpY2UuaXNIb3N0QWR2QXVkaW9MQzNRRmVhdHVyZVN1cHBvcnRlZCgpICYmCi0gICAgICAgICAgICBtQWRhcHRlclNlcnZpY2UuaXNBZHZVbmljYXN0QXVkaW9GZWF0RW5hYmxlZCgpKSB7Ci0KLSAgICAgICAgICAgIExvZy5pKFRBRywgImhvc3Qgc3VwcG9ydHMgTEMzUSIpOwotICAgICAgICAgICAgLy8gc2V0IHByb3BlcnRpZXMgb25seSBpZiB0aGV5IGFyZSBub3Qgc2V0IHRvIGFsbG93IHVzZXIgZW5hYmxlL2Rpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBmZWF0dXJlcyBleHBsaWNpdGx5Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5pc19sYzNxX3N1cHBvcnRlZCIpOwotCi0gICAgICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgfHwgcHJvcFZhbHVlLmxlbmd0aCgpID09IDAgfHwgIXByb3BWYWx1ZS5lcXVhbHMoImZhbHNlIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5pc19sYzNxX3N1cHBvcnRlZCIsICJ0cnVlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQuaXNfbGMzcV9zdXBwb3J0ZWQgaXMgYWxyZWFkeSBzZXQgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RlcCAyOiBHZXQgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGVkIGF1ZGlvIGRldmljZXMKLSAgICAgICAgbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyA9IG1BZGFwdGVyU2VydmljZS5nZXRNYXhDb25uZWN0ZWRBdWRpb0RldmljZXMoKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiTWF4IGNvbm5lY3RlZCBhdWRpbyBkZXZpY2VzIHNldCB0byAiICsgbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyk7Ci0KLQotICAgICAgICBTdHJpbmcgTGVhQ2hhbm5lbE1vZGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5MZWEuZGVmYXVsdGNoYW5uZWxtb2RlIik7Ci0gICAgICAgIGlmICghTGVhQ2hhbm5lbE1vZGUuaXNFbXB0eSgpICYmICJtb25vIi5lcXVhbHMoTGVhQ2hhbm5lbE1vZGUpKSB7Ci0gICAgICAgICAgICBtTGVhQ2hhbm5lbE1vZGUgPSAibW9ubyI7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAiRGVmYXVsdCBMRUEgQ2hhbm5lbE1vZGU6ICIgKyBMZWFDaGFubmVsTW9kZSk7Ci0gICAgICAgIC8vIFN0ZXAgMzogU3RhcnQgaGFuZGxlciB0aHJlYWQgZm9yIHN0YXRlIG1hY2hpbmVzCi0gICAgICAgIG1TdGF0ZU1hY2hpbmVzLmNsZWFyKCk7Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkFjbVNlcnZpY2UuU3RhdGVNYWNoaW5lcyIpOwotICAgICAgICBtU3RhdGVNYWNoaW5lc1RocmVhZC5zdGFydCgpOwotCi0gICAgICAgIC8vIFN0ZXAgNDogU2V0dXAgY29kZWMgY29uZmlnCi0gICAgICAgIG1BY21Db2RlY0NvbmZpZyA9IG5ldyBBY21Db2RlY0NvbmZpZyh0aGlzLCBtQWNtTmF0aXZlSW50ZXJmYWNlKTsKLQotICAgICAgICBpZiAobUFkYXB0ZXJTZXJ2aWNlLmlzQWR2VW5pY2FzdEF1ZGlvRmVhdEVuYWJsZWQoKSkgewotICAgICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxpemUgQWNtTmF0aXZlSW50ZXJmYWNlIik7Ci0gICAgICAgICAgLy8gU3RlcCA1OiBJbml0aWFsaXplIG5hdGl2ZSBpbnRlcmZhY2UKLSAgICAgICAgICBtQWNtTmF0aXZlSW50ZXJmYWNlLmluaXQobU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjbUNvZGVjQ29uZmlnLmNvZGVjQ29uZmlnUHJpb3JpdGllcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgNjogU2V0dXAgYnJvYWRjYXN0IHJlY2VpdmVycwotICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgbUJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciA9IG5ldyBCb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIoKTsKLSAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyLCBmaWx0ZXIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdWRpb01hbmFnZXJMb2NrKSB7Ci0gICAgICAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG1BdWRpb01hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpb01hbmFnZXIgY2Fubm90IGJlIG51bGwgd2hlbiBBY21TZXJ2aWNlIHN0YXJ0cyIpOwotICAgICAgICAgICAgIG1BdWRpb1N0cmVhbU1heCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0ZXAgNzogTWFyayBzZXJ2aWNlIGFzIHN0YXJ0ZWQKLSAgICAgICAgc2V0QWNtU2VydmljZSh0aGlzKTsKLQotICAgICAgICAvL3N0ZXAgODogUmVnaXN0ZXIgQ1NJUCBtb2R1bGUKLSAgICAgICAgbUNzaXBNYW5hZ2VyID0gbmV3IENzaXBNYW5hZ2VyKCk7Ci0KLSAgICAgICAgLy9zdGVwIDk6IEdldCBWY3AgQ29udHJvbGxlcgotICAgICAgICBtVmNwQ29udHJvbGxlciA9IFZjcENvbnRyb2xsZXIubWFrZSh0aGlzKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChtVmNwQ29udHJvbGxlciwgIm1WY3BDb250cm9sbGVyIGNhbm5vdCBiZSBudWxsIHdoZW4gQWNtU2VydmljZSBzdGFydHMiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcCgpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAic3RvcCgpIik7Ci0gICAgICAgIGlmIChzQWNtU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzdG9wKCkgY2FsbGVkIGJlZm9yZSBzdGFydCgpIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgOTogZG8gcXVpdCBWY3AgQ29udHJvbGxlcgotICAgICAgICBpZiAobVZjcENvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVZjcENvbnRyb2xsZXIuZG9RdWl0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDg6IE1hcmsgc2VydmljZSBhcyBzdG9wcGVkCi0gICAgICAgIHNldEFjbVNlcnZpY2UobnVsbCk7Ci0KLSAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIpOwotICAgICAgICBtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyID0gbnVsbDsKLSAgICAgICAgLy8gU3RlcCA2OiBDbGVhbnVwIG5hdGl2ZSBpbnRlcmZhY2UKLSAgICAgICAgbUFjbU5hdGl2ZUludGVyZmFjZS5jbGVhbnVwKCk7Ci0gICAgICAgIG1BY21OYXRpdmVJbnRlcmZhY2UgPSBudWxsOwotCi0gICAgICAgIC8vIFN0ZXAgNTogQ2xlYXIgY29kZWMgY29uZmlnCi0gICAgICAgIG1BY21Db2RlY0NvbmZpZyA9IG51bGw7Ci0KLSAgICAgICAgLy8gU3RlcCA0OiBEZXN0cm95IHN0YXRlIG1hY2hpbmVzIGFuZCBzdG9wIGhhbmRsZXIgdGhyZWFkCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZvciAoQWNtU3RhdGVNYWNoaW5lIHNtIDogbVN0YXRlTWFjaGluZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzbS5kb1F1aXQoKTsKLSAgICAgICAgICAgICAgICBzbS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgbVN0YXRlTWFjaGluZXNUaHJlYWQgPSBudWxsOwotCi0gICAgICAgIC8vIFN0ZXAgMjogUmVzZXQgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGVkIGF1ZGlvIGRldmljZXMKLSAgICAgICAgbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyA9IDE7Ci0KLSAgICAgICAgLy8gU3RlcCAxOiBDbGVhciBBZGFwdGVyU2VydmljZSwgQWNtTmF0aXZlSW50ZXJmYWNlLCBBdWRpb01hbmFnZXIKLSAgICAgICAgbUFjbU5hdGl2ZUludGVyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1BZGFwdGVyU2VydmljZSA9IG51bGw7Ci0gICAgICAgIGlmIChtQWNtRGV2aWNlcyAhPSBudWxsKQotICAgICAgICAgICAgbUFjbURldmljZXMuY2xlYXIoKTsKLQotICAgICAgICBtQ3NpcE1hbmFnZXIudW5yZWdpc3RlckNzaXAoKTsKLSAgICAgICAgbUNzaXBNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiY2xlYW51cCgpIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElQcm9maWxlU2VydmljZUJpbmRlciBpbml0QmluZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEFjbUJpbmRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEJsdWV0b290aEFjbURldmljZSB7Ci0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1HcnBEZXZpY2U7IC8vIGdyb3VwIGJkIGFkZHJlc3MKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOwotICAgICAgICBwcml2YXRlIGludCBtc2V0SUQ7Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSwgaW50IHNldElEKSB7Ci0gICAgICAgICAgICBtR3JwRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBtc2V0SUQgPSBzZXRJRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIGdldEFkZHJlc3NGcm9tU3RyaW5nKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBtYWtlR3JvdXBCZEFkZHJlc3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlLCBpbnQgc2V0aWQpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiIFNldCBpZCA6ICIgKyBzZXRpZCArICIgTnVtIG9mIGNvbm5lY3RlZCBhY20gZGV2aWNlczogIiArIG1BY21EZXZpY2VzLnNpemUoKSk7Ci0gICAgICAgIGJvb2xlYW4gc2V0SWRNYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChzZXRpZCA9PSBJTlZBTElEX1NFVF9JRCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIGlzIG5vdCBwYXJ0IG9mIGFueSBncm91cCIpOwotICAgICAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlIGFjbURldmljZSA9IG5ldyBCbHVldG9vdGhBY21EZXZpY2UoZGV2aWNlLCBzdGF0ZSwgc2V0aWQpOwotICAgICAgICAgICAgbUFjbURldmljZXMucHV0KGRldmljZSwgYWNtRGV2aWNlKTsKLSAgICAgICAgICAgIG1Hcm91cEJkQWRkcmVzcyA9IGFjbURldmljZS5tR3JwRGV2aWNlOwotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cEJkQWRkcmVzczsKLSAgICAgICAgfQotICAgICAgIC8vIEJsdWV0b290aERldmljZSBiZGFkZHIgPSBudWxsOwotICAgICAgICBpZiAobUFjbURldmljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiSGFzaCBNYXAgaXMgTlVMTCIpOwotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cEJkQWRkcmVzczsKLSAgICAgICAgfQotICAgICAgICBpZiAobUFjbURldmljZXMuY29udGFpbnNLZXkoZGV2aWNlKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIGlzIGF2YWlsYWJsZSBpbiBIYXNoIE1hcCIpOwotICAgICAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlIGFjbURldmljZSA9IG1BY21EZXZpY2VzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgbUdyb3VwQmRBZGRyZXNzID0gYWNtRGV2aWNlLm1HcnBEZXZpY2U7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3VwQmRBZGRyZXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQWNtRGV2aWNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZG0gOiBtQWNtRGV2aWNlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aEFjbURldmljZSBkID0gbUFjbURldmljZXMuZ2V0KGRtKTsKLSAgICAgICAgICAgICAgICBpZiAoZC5tc2V0SUQgPT0gc2V0aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SWRNYXRjaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIGlzIHBhcnQgb2Ygc2FtZSBzZXQgSUQiKTsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlIGFjbURldmljZSA9IG5ldyBCbHVldG9vdGhBY21EZXZpY2UoZC5tR3JwRGV2aWNlLCBzdGF0ZSwgc2V0aWQpOwotICAgICAgICAgICAgICAgICAgICBtQWNtRGV2aWNlcy5wdXQoZGV2aWNlLCBhY21EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtR3JvdXBCZEFkZHJlc3MgPSBhY21EZXZpY2UubUdycERldmljZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghc2V0SWRNYXRjaGVkKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJjcmVhdGUgbmV3IGdyb3VwIG9yIGRldmljZSBpcyBub3QgcGFydCBvZiBleGlzdGluZyBzZXQgSUQiKTsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gIjlFOjhCOjAwOjAwOjAwOjAiOwotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGJkYWRkciA9IGdldEFkZHJlc3NGcm9tU3RyaW5nKGFkZHJlc3MgKyBzZXRpZCk7Ci0gICAgICAgICAgICBCbHVldG9vdGhBY21EZXZpY2UgYWNtRGV2aWNlID0gbmV3IEJsdWV0b290aEFjbURldmljZShiZGFkZHIsIHN0YXRlLCBzZXRpZCk7Ci0gICAgICAgICAgICBtQWNtRGV2aWNlcy5wdXQoZGV2aWNlLCBhY21EZXZpY2UpOwotICAgICAgICAgICAgbUdyb3VwQmRBZGRyZXNzID0gYmRhZGRyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtR3JvdXBCZEFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlQWNtRGV2aWNlU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlLCBpbnQgc2V0aWQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlQWNtRGV2aWNlU3RhdGVDaGFuZ2U6IGRldmljZTogIiArIGRldmljZSArICIsIHN0YXRlOiAiICsgc3RhdGUKLSAgICAgICAgICAgICAgICArICIgU2V0IGlkIDogIiArIHNldGlkKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiIE51bSBvZiBjb25uZWN0ZWQgQUNNIGRldmljZXM6ICIgKyBtQWNtRGV2aWNlcy5zaXplKCkpOwotICAgICAgICBib29sZWFuIHVwZGF0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwgfHwgbUFjbURldmljZXMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIEJsdWV0b290aEFjbURldmljZSBhY21EZXZpY2UgPSBtQWNtRGV2aWNlcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgLy9jaGVjayBpZiBjdXJyZW50IGFjdGl2ZSBncm91cCBhZGRyZXNzIGlzIHNhbWUgYXMgdGhpcyBkZXZpY2UgZ3JvdXAgYWRkcmVzcwotICAgICAgICBpZiAoYWNtRGV2aWNlICE9IG51bGwgJiYgbUdyb3VwQmRBZGRyZXNzICE9IGFjbURldmljZS5tR3JwRGV2aWNlKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJJbmFjdGl2ZSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICB1cGRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVtb3ZlIERldmljZSBmcm9tIGhhc2ggbWFwIik7Ci0gICAgICAgICAgICBtQWNtRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFjbURldmljZS5tU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlVwZGF0ZSBzdGF0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRtIDogbUFjbURldmljZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIEJsdWV0b290aEFjbURldmljZSBkID0gbUFjbURldmljZXMuZ2V0KGRtKTsKLSAgICAgICAgICAgIGlmIChkLm1zZXRJRCA9PSBzZXRpZCkgewotICAgICAgICAgICAgICAgIGlmIChkLm1TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBdGxlYXN0IG9uZSBtZW1iZXIgaXMgY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXVwZGF0ZSkgewotICAgICAgICAgICAgLyppZiAoIW1BY21OYXRpdmVJbnRlcmZhY2Uuc2V0QWN0aXZlRGV2aWNlKG51bGwsIDApKSB7Ly9zZW5kIHVua25vd24gY29udGV4dCB0eXBlCi0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0QWN0aXZlRGV2aWNlKG51bGwpOiBDYW5ub3QgcmVtb3ZlIGFjdGl2ZSBkZXZpY2UgaW4gbmF0aXZlIGxheWVyIik7Ci0gICAgICAgICAgICB9Ki8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEFjbVNlcnZpY2UgZ2V0QWNtU2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNBY21TZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImdldEFjbVNlcnZpY2UoKTogc2VydmljZSBpcyBudWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXNBY21TZXJ2aWNlLmlzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImdldEFjbVNlcnZpY2UoKTogc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0FjbVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0QWNtU2VydmljZShBY21TZXJ2aWNlIGluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNldEFjbVNlcnZpY2UoKTogc2V0IHRvOiAiICsgaW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNBY21TZXJ2aWNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29udGV4dFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZVR5cGUsIGludCBwcmVmZXJyZWRDb250ZXh0KSB7Ci0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29ubmVjdCgpOiAiICsgZGV2aWNlICsgIiBjb250ZXh0VHlwZTogIiArIGNvbnRleHRUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiBwcm9maWxlVHlwZTogIiArIHByb2ZpbGVUeXBlICsgIiBwcmVmZXJyZWRDb250ZXh0OiAiICsgcHJlZmVycmVkQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZS5nZXRBZGRyZXNzKCkuY29udGFpbnMoIjlFOjhCOjAwOjAwOjAwIikpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbm5lY3QgcmVxdWVzdCBmb3IgZ3JvdXAiKTsKLSAgICAgICAgICAgIGJ5dGVbXSBhZGRyQnl0ZSA9IFV0aWxzLmdldEJ5dGVBZGRyZXNzKGRldmljZSk7Ci0gICAgICAgICAgICBpbnQgc2V0X2lkID0gYWRkckJ5dGVbNV07Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZCA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldF9pZCk7Ci0gICAgICAgICAgICBpZiAoZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gc2V0IG1lbWJlciBmb3VuZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEl0ZXJhdG9yPEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IGQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGlmIChtZW1iZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAobWVtYmVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFkZHIgPSBtZW1iZXJzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29ubmVjdCBtZW1iZXI6ICIgKyBhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uQWxsb3dlZENoZWNrTWF4RGV2aWNlcyhhZGRyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyBpcyBvbmUsIGRpc2Nvbm5lY3QgY3VycmVudCBkZXZpY2UgZmlyc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1NYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gc2lua3MgPSBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Qmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkd9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2Ugc2luayA6IHNpbmtzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2luay5lcXVhbHMoYWRkcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0aW5nIHRvIGRldmljZSAiICsgYWRkciArICIgOiBkaXNjb25uZWN0IHNraXBwZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Qoc2luaywgY29udGV4dFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gIiArIGFkZHIgKyAiIDogdG9vIG1hbnkgY29ubmVjdGVkIGRldmljZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbUNvbm5lY3QgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbUNvbm5lY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBjb25uZWN0IHRvICIgKyBhZGRyICsgIiA6IG5vIHN0YXRlIG1hY2hpbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHNtQ29ubmVjdC5vYnRhaW5NZXNzYWdlKEFjbVN0YXRlTWFjaGluZS5DT05ORUNUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBwcmVmZXJyZWRDb250ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSBjb250ZXh0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcyID0gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbUNvbm5lY3Quc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGlmICghY29ubmVjdGlvbkFsbG93ZWRDaGVja01heERldmljZXMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIC8vIHdoZW4gbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyBpcyBvbmUsIGRpc2Nvbm5lY3QgY3VycmVudCBkZXZpY2UgZmlyc3QuCi0gICAgICAgICAgICAgICAgaWYgKG1NYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gc2lua3MgPSBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Qmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkd9KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2Ugc2luayA6IHNpbmtzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2luay5lcXVhbHMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RpbmcgdG8gZGV2aWNlICIgKyBkZXZpY2UgKyAiIDogZGlzY29ubmVjdCBza2lwcGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KHNpbmssIGNvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBjb25uZWN0IHRvICIgKyBkZXZpY2UgKyAiIDogdG9vIG1hbnkgY29ubmVjdGVkIGRldmljZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbUNvbm5lY3QgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtQ29ubmVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gIiArIGRldmljZSArICIgOiBubyBzdGF0ZSBtYWNoaW5lIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBzbUNvbm5lY3Qub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuQ09OTkVDVCk7Ci0gICAgICAgICAgICBtc2cub2JqID0gcHJlZmVycmVkQ29udGV4dDsKLSAgICAgICAgICAgIG1zZy5hcmcxID0gY29udGV4dFR5cGU7Ci0gICAgICAgICAgICBtc2cuYXJnMiA9IHByb2ZpbGVUeXBlOwotICAgICAgICAgICAgc21Db25uZWN0LnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3RzIEFjbSBmb3IgdGhlIHJlbW90ZSBibHVldG9vdGggZGV2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGlzIHRoZSBkZXZpY2Ugd2l0aCB3aGljaCB3ZSB3b3VsZCBsaWtlIHRvIGRpc2Nvbm5lY3QgYWNtCi0gICAgICogQHJldHVybiB0cnVlIGlmIHByb2ZpbGUgZGlzY29ubmVjdGVkLCBmYWxzZSBpZiBkZXZpY2Ugbm90IGNvbm5lY3RlZCBvdmVyIGFjbQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlKSB7Ci0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlzY29ubmVjdCgpOiAiICsgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXZpY2UuZ2V0QWRkcmVzcygpLmNvbnRhaW5zKCI5RTo4QjowMDowMDowMCIpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJEaXNvbm5lY3QgcmVxdWVzdCBmb3IgZ3JvdXAiKTsKLSAgICAgICAgICAgIGJ5dGVbXSBhZGRyQnl0ZSA9IFV0aWxzLmdldEJ5dGVBZGRyZXNzKGRldmljZSk7Ci0gICAgICAgICAgICBpbnQgc2V0X2lkID0gYWRkckJ5dGVbNV07Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZCA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldF9pZCk7Ci0gICAgICAgICAgICBpZiAoZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gc2V0IG1lbWJlciBmb3VuZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEl0ZXJhdG9yPEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IGQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGlmIChtZW1iZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAobWVtYmVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFkZHIgPSBtZW1iZXJzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlzY29ubmVjdCBtZW1iZXI6ICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklnbm9yZWQgZGlzY29ubmVjdCByZXF1ZXN0IGZvciAiICsgYWRkciArICIgOiBubyBzdGF0ZSBtYWNoaW5lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBzbS5vYnRhaW5NZXNzYWdlKEFjbVN0YXRlTWFjaGluZS5ESVNDT05ORUNUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBjb250ZXh0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgQWNtU3RhdGVNYWNoaW5lIHNtID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklnbm9yZWQgZGlzY29ubmVjdCByZXF1ZXN0IGZvciAiICsgZGV2aWNlICsgIiA6IG5vIHN0YXRlIG1hY2hpbmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHNtLm9idGFpbk1lc3NhZ2UoQWNtU3RhdGVNYWNoaW5lLkRJU0NPTk5FQ1QpOwotICAgICAgICAgICAgbXNnLm9iaiA9IGNvbnRleHRUeXBlOwotICAgICAgICAgICAgc20uc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgewotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEFjbVN0YXRlTWFjaGluZSBzbSA6IG1TdGF0ZU1hY2hpbmVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNtLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoc20uZ2V0RGV2aWNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9jaGVjayBpZiBpdCBjYW4gYmUgYSBsaXN0ID8KLSAgICBwdWJsaWMgQmx1ZXRvb3RoRGV2aWNlIGdldENzaXBMb2NrUmVxdWVzdGVkRGV2aWNlKCkgewotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgZm9yIChBY21TdGF0ZU1hY2hpbmUgc20gOiBtU3RhdGVNYWNoaW5lcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChzbS5pc0NzaXBMb2NrUmVxdWVzdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gc20uZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIElzTG9ja1N1cHBvcnRBdmFpbGFibGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBib29sZWFuIGlzTG9ja1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAvKmludCBzZXRJZCA9IG1TZXRDb29yZGluYXRvci5nZXRSZW1vdGVTZXRJZChkZXZpY2UsIEFDTV9VVUlEKTsKLSAgICAgICAgRGV2aWNlR3JvdXAgc2V0ID0gbVNldENvb3JkaW5hdG9yLmdldERldmljZUdyb3VwKHNldElkKTsKLSAgICAgICAgaXNMb2NrU3VwcG9ydGVkID0gc2V0Lm1Mb2NrU3VwcG9ydDsqLwotICAgICAgICAvL2lzTG9ja1N1cHBvcnRlZCA9IG1BZGFwdGVyU2VydmljZS5pc0NzaXBMb2NrU3VwcG9ydChkZXZpY2UpOwotICAgICAgICBMb2cuZChUQUcsICJFeGNsdXNpdmUgQWNjZXNzIFN1cHBvcnRBdmFpYmxlIGZvcjoiICsgZGV2aWNlICsgInJldHVybnMgIiArIGlzTG9ja1N1cHBvcnRlZCk7Ci0gICAgICAgIHJldHVybiBpc0xvY2tTdXBwb3J0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBjYW4gY29ubmVjdCB0byBhIHBlZXIgZGV2aWNlLgotICAgICAqIFRoZSBjaGVjayBjb25zaWRlcnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3RlZCBwZWVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHBlZXIgZGV2aWNlIHRvIGNvbm5lY3QgdG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29ubmVjdGlvbiBpcyBhbGxvd2VkLCBvdGhlcndpc2UgZmFsc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29ubmVjdGlvbkFsbG93ZWRDaGVja01heERldmljZXMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgY29ubmVjdGVkID0gMDsKLSAgICAgICAgLy8gQ291bnQgZGV2aWNlcyB0aGF0IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIG9yIGFscmVhZHkgY29ubmVjdGVkCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZvciAoQWNtU3RhdGVNYWNoaW5lIHNtIDogbVN0YXRlTWFjaGluZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHNtLmdldENvbm5lY3Rpb25TdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGRldmljZSwgc20uZ2V0RGV2aWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgIC8vIEFscmVhZHkgY29ubmVjdGVkIG9yIGFjY291bnRlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChjb25uZWN0ZWQgPCBtTWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzKTsKLSAgICB9Ci0KLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKLQotICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBpZiAoc3RhdGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VzOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJsdWV0b290aERldmljZVtdIGJvbmRlZERldmljZXMgPSBtQWRhcHRlclNlcnZpY2UuZ2V0Qm9uZGVkRGV2aWNlcygpOwotICAgICAgICBpZiAoYm9uZGVkRGV2aWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlczsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBib25kZWREZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgLyppZiAoIUFycmF5VXRpbHMuY29udGFpbnMobUFkYXB0ZXJTZXJ2aWNlLmdldFJlbW90ZVV1aWRzKGRldmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVXVpZC5BQ01fU0lOSykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgaW50IGNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0ZSA9IHNtLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBzdGF0ZSA6IHN0YXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvblN0YXRlID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBkZXZpY2VzIHRoYXQgaGF2ZSBzdGF0ZSBtYWNoaW5lcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IGhhdmUgc3RhdGUgbWFjaGluZXMKLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlcygpIHsKLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgZm9yIChBY21TdGF0ZU1hY2hpbmUgc20gOiBtU3RhdGVNYWNoaW5lcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKHNtLmdldERldmljZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc20uZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENzaXBDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc20uZ2V0Q3NpcENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIG1lc3NhZ2VzIGZyb20gbmF0aXZlIChKTkkpIHRvIEphdmEKLSAgICB2b2lkIG1lc3NhZ2VGcm9tTmF0aXZlKEFjbVN0YWNrRXZlbnQgc3RhY2tFdmVudCkgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHN0YWNrRXZlbnQuZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIG51bGwsIGV2ZW50OiAiICsgc3RhY2tFdmVudCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBzdGFja0V2ZW50LmRldmljZTsKLSAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhY2tFdmVudC50eXBlID09IEFjbVN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGFja0V2ZW50LnZhbHVlSW50MSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgc3RhdGUgbWFjaGluZSBvbmx5IHdoZW4gY29ubmVjdGluZyB0byBhIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29ubmVjdGlvbkFsbG93ZWRDaGVja01heERldmljZXMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3QgY29ubmVjdCB0byAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogdG9vIG1hbnkgY29ubmVjdGVkIGRldmljZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3QgcHJvY2VzcyBzdGFjayBldmVudDogbm8gc3RhdGUgbWFjaGluZTogIiArIHN0YWNrRXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKEFjbVN0YXRlTWFjaGluZS5TVEFDS19FVkVOVCwgc3RhY2tFdmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFjbVN0YXRlTWFjaGluZSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUgZmFpbGVkOiBkZXZpY2UgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhdGUgbWFjaGluZXMgdG8gYXZvaWQgRG9TIGF0dGFjawotICAgICAgICAgICAgaWYgKG1TdGF0ZU1hY2hpbmVzLnNpemUoKSA+PSBNQVhfQUNNX1NUQVRFX01BQ0hJTkVTKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWF4aW11bSBudW1iZXIgb2YgQUNNIHN0YXRlIG1hY2hpbmVzIHJlYWNoZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgTUFYX0FDTV9TVEFURV9NQUNISU5FUyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ3JlYXRpbmcgYSBuZXcgc3RhdGUgbWFjaGluZSBmb3IgIiArIGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbSA9IEFjbVN0YXRlTWFjaGluZS5tYWtlKGRldmljZSwgdGhpcywgbUFjbU5hdGl2ZUludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlTWFjaGluZXNUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICAgICAgbVN0YXRlTWFjaGluZXMucHV0KGRldmljZSwgc20pOwotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBCb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIUJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9CT05EX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5FUlJPUik7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKTsKLSAgICAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGV2aWNlLCAiQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRCB3aXRoIG5vIEVYVFJBX0RFVklDRSIpOwotICAgICAgICAgICAgYm9uZFN0YXRlQ2hhbmdlZChkZXZpY2UsIHN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBjaGFuZ2UgaW4gdGhlIGJvbmRpbmcgc3RhdGUgZm9yIGEgZGV2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHdob3NlIGJvbmRpbmcgc3RhdGUgaGFzIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gYm9uZFN0YXRlIHRoZSBuZXcgYm9uZCBzdGF0ZSBmb3IgdGhlIGRldmljZS4gUG9zc2libGUgdmFsdWVzIGFyZToKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0JPTkRfTk9ORX0sCi0gICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNCT05EX0JPTkRJTkd9LAotICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjQk9ORF9CT05ERUR9LgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgYm9uZFN0YXRlQ2hhbmdlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgYm9uZFN0YXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkJvbmQgc3RhdGUgY2hhbmdlZCBmb3IgZGV2aWNlOiAiICsgZGV2aWNlICsgIiBzdGF0ZTogIiArIGJvbmRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVtb3ZlIHN0YXRlIG1hY2hpbmUgaWYgdGhlIGJvbmRpbmcgZm9yIGEgZGV2aWNlIGlzIHJlbW92ZWQKLSAgICAgICAgaWYgKGJvbmRTdGF0ZSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgQWNtU3RhdGVNYWNoaW5lIHNtID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzbS5nZXRDb25uZWN0aW9uU3RhdGUoKSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZW1vdmVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlU3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgQWNtU3RhdGVNYWNoaW5lIHNtID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInJlbW92ZVN0YXRlTWFjaGluZTogZGV2aWNlICIgKyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBoYXZlIGEgc3RhdGUgbWFjaGluZSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5pKFRBRywgInJlbW92ZVN0YXRlTWFjaGluZTogcmVtb3Zpbmcgc3RhdGUgbWFjaGluZSBmb3IgZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIHNtLmRvUXVpdCgpOwotICAgICAgICAgICAgc20uY2xlYW51cCgpOwotICAgICAgICAgICAgbVN0YXRlTWFjaGluZXMucmVtb3ZlKGRldmljZSk7Ci0gICAgICAgICAgICBtQWNtRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTGVhQ2hhbm5lbE1vZGUoaW50IHN0YXRlLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBwZWVyTGVhRGV2aWNlID0gbnVsbDsKLSAgICAgICAgcGVlckxlYURldmljZSA9IGdldExlYVBlZXJEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgaWYgKHBlZXJMZWFEZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlTGVhQ2hhbm5lbE1vZGU6IHBlZXIgZGV2aWNlIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJMZWFDaGFubmVsTW9kZTogIiArIG1MZWFDaGFubmVsTW9kZSArICJzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgc3luY2hyb25pemVkKG1CdExlYUxvY2spIHsKLSAgICAgICAgICAgIGlmICgibW9ubyIuZXF1YWxzKG1MZWFDaGFubmVsTW9kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgJiYgKHBlZXJMZWFEZXZpY2UhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgJiYgcGVlckxlYURldmljZS5pc0Nvbm5lY3RlZCgpICYmIGlzQWNtUGxheWluZ011c2ljKHBlZXJMZWFEZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZUxlYUNoYW5uZWxNb2RlOiBzZW5kIGRlbGF5IG1lc3NhZ2UgdG8gc2V0IHN0ZXJlbyAiKTsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFNFVF9FQlNURVJFT19DRkcpOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBTdGVyZW9DZmdfVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlTGVhQ2hhbm5lbE1vZGU6IHNldHBhcmFtZXRlcnMgdG8gTW9ubyIpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdWRpb01hbmFnZXJMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlTGVhQ2hhbm5lbE1vZGU6IEFjcXVpcmVkIG1WYXJpYWJsZUxvY2siKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFBhcmFtZXRlcnMoIkxlYUNoYW5uZWxDb25maWc9bW9ubyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZUxlYUNoYW5uZWxNb2RlOiBSZWxlYXNlZCBtVmFyaWFibGVMb2NrIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9OT1RfUExBWUlORykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgaXNBY21QbGF5aW5nTXVzaWMocGVlckxlYURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYW5kbGVyLmhhc01lc3NhZ2VzKFN0ZXJlb0NmZ19UaW1lb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlTGVhQ2hhbm5lbE1vZGU6cmVtb3ZlIGRlbGF5IG1lc3NhZ2UgZm9yIHN0ZXJlbyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU3RlcmVvQ2ZnX1RpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgic3RlcmVvIi5lcXVhbHMobUxlYUNoYW5uZWxNb2RlKSkgewotICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSAmJgotICAgICAgICAgICAgICAgICAgICAgKGdldENvbm5lY3Rpb25TdGF0ZShwZWVyTGVhRGV2aWNlKSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgfHwgIWlzQWNtUGxheWluZ011c2ljKHBlZXJMZWFEZXZpY2UpKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVMZWFDaGFubmVsTW9kZTogc2VuZCBkZWxheSBtZXNzYWdlIHRvIHNldCBtb25vIik7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShTRVRfRUJNT05PX0NGRyk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIE1vbm9DZmdfVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSAmJiBpc0FjbVBsYXlpbmdNdXNpYyhwZWVyTGVhRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoU0VUX0VCTU9OT19DRkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVMZWFDaGFubmVsTW9kZTogcmVtb3ZlIGRlbGF5IG1lc3NhZ2UgdG8gc2V0IG1vbm8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFNFVF9FQk1PTk9fQ0ZHKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcpICYmIGlzQWNtUGxheWluZ011c2ljKHBlZXJMZWFEZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNldHBhcmFtZXRlcnMgdG8gTW9ubyIpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdWRpb01hbmFnZXJMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvTWFuYWdlciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UGFyYW1ldGVycygiTGVhQ2hhbm5lbENvbmZpZz1tb25vIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxlYUNoYW5uZWxNb2RlID0gIm1vbm8iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIGdldExlYVBlZXJEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc20uZ2V0UGVlckRldmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQZWVyRGV2aWNlQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzZXRpZCkgewotICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChtQWNtRGV2aWNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZG0gOiBtQWNtRGV2aWNlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aEFjbURldmljZSBkID0gbUFjbURldmljZXMuZ2V0KGRtKTsKLSAgICAgICAgICAgICAgICBpZiAoKGQubXNldElEID09IHNldGlkKSAmJiAhT2JqZWN0cy5lcXVhbHMoZG0sIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGQubVN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0Nvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBdCBsZWFzdCBvbmUgbWVtYmVyIGlzIGluIGNvbm5lY3RlZCBzdGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzQ29ubmVjdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGVlckRldmljZVN0cmVhbWluZ011c2ljKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzZXRpZCkgewotICAgICAgICBib29sZWFuIGlzU3RyZWFtaW5nID0gZmFsc2U7Ci0gICAgICAgIGlmIChtQWNtRGV2aWNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZG0gOiBtQWNtRGV2aWNlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aEFjbURldmljZSBkID0gbUFjbURldmljZXMuZ2V0KGRtKTsKLSAgICAgICAgICAgICAgICBpZiAoKGQubXNldElEID09IHNldGlkKSAmJiAhT2JqZWN0cy5lcXVhbHMoZG0sIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGQubVN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1CdEFjbUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZG0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtLmlzTXVzaWNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdHJlYW1pbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBdCBsZWFzdCBvbmUgbWVtYmVyIGlzIHN0cmVhbWluZyBmb3IgbXVzaWMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1N0cmVhbWluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob1BlbmRpbmdTdG9wKCkgewotICAgICAgICBMb2cuZChUQUcsICJpc1Nob1BlbmRpbmdTdG9wICIgKyBtU2hvUGVuZCk7Ci0gICAgICAgIHJldHVybiBtU2hvUGVuZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldFNob1BlbmRpbmdTdG9wKCkgewotICAgICAgICBtU2hvUGVuZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVm9pY2VTaG9QZW5kaW5nU3RvcCgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiaXNWb2ljZVNob1BlbmRpbmdTdG9wICIgKyBtVm9pY2VTaG9QZW5kKTsKLSAgICAgICAgcmV0dXJuIG1Wb2ljZVNob1BlbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRWb2ljZVNob1BlbmRpbmdTdG9wKCkgewotICAgICAgICBtVm9pY2VTaG9QZW5kID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXRWb2ljZUFjdGl2ZURldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVEZXZpY2VWb2ljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQZWVyc0Zyb21CZ1dsKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzZXRpZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZCA9IG51bGw7Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldGlkKTsKLSAgICAgICAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJObyBzZXQgbWVtYmVyIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSXRlcmF0b3I8Qmx1ZXRvb3RoRGV2aWNlPiBpID0gbWVtYmVycy5pdGVyYXRvcigpOwotICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKE9iamVjdHMuZXF1YWxzKGQsIGRldmljZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2U6ICIgKyBkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc20ucmVtb3ZlRGV2aWNlZnJvbUJnV0woKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWNtUGxheWluZ011c2ljKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiaXNBY21QbGF5aW5nTXVzaWMoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtQnRBY21Mb2NrKSB7Ci0gICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNtLmlzTXVzaWNQbGF5aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjbVBsYXlpbmdWb2ljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImlzQWNtUGxheWluZ1ZvaWNlKCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUJ0QWNtTG9jaykgewotICAgICAgICAgICAgQWNtU3RhdGVNYWNoaW5lIHNtID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzbS5pc1ZvaWNlUGxheWluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXRHcm91cChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIkdldCBncm91cCBhZGRyZXNzIGZvciAoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIGlmIChkZXZpY2UuZ2V0QWRkcmVzcygpLmNvbnRhaW5zKCI5RTo4QjowMDowMDowMCIpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJDYWxsZWQgZm9yIGdyb3VwIGFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRtID0gbnVsbDsKLQotICAgICAgICBpZiAobUFjbURldmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiSGFzaCBNYXAgaXMgbm90IE5VTEwiKTsKLSAgICAgICAgICAgIEJsdWV0b290aEFjbURldmljZSBkID0gbUFjbURldmljZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRtID0gZC5tR3JwRGV2aWNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJHcm91cCBhZGRyZXNzIGlzIE5VTEwsIG1ha2UgTmV3Iik7Ci0gICAgICAgICAgICBpbnQgSWQgPSBtQ3NpcE1hbmFnZXIuZ2V0Q3NpcFNldElkKGRldmljZSwgbnVsbCAvKkFDTV9VVUlEKi8pOyAvL1RPRE86IFVVSUQgd2hhdCB0byBzZXQgPwotICAgICAgICAgICAgZG0gPSBtYWtlR3JvdXBCZEFkZHJlc3MoZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgSWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNldEFjdGl2ZURldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY29udGV4dFR5cGUsIGludCBwcm9maWxlVHlwZSwgYm9vbGVhbiBwbGF5UmVxKSB7Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlOiAiICsgZGV2aWNlICsgIiBjb250ZXh0VHlwZTogIiArIGNvbnRleHRUeXBlICsgIiBwcm9maWxlVHlwZTogIiArIHByb2ZpbGVUeXBlICsKLSAgICAgICAgICAgICAgICAiIHBsYXkgcmVxOiAiICsgcGxheVJlcSArICIgbUFjdGl2ZURldmljZVByb2ZpbGU6ICIgKyBtQWN0aXZlRGV2aWNlUHJvZmlsZSsgIiBtQWN0aXZlRGV2aWNlVm9pY2VQcm9maWxlOiAiICsgbUFjdGl2ZURldmljZVZvaWNlUHJvZmlsZSk7Ci0KLSAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGRldmljZSwgbUFjdGl2ZURldmljZSkgJiYgY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDICYmIChtQWN0aXZlRGV2aWNlUHJvZmlsZSA9PSBwcm9maWxlVHlwZSkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNldEFjdGl2ZURldmljZSgiICsgZGV2aWNlICsgIik6IGFscmVhZHkgc2V0IHRvIGFjdGl2ZSBmb3IgbWVkaWEgYW5kIHByb2ZpbGVUeXBlIHNhbWUgYXMgYWN0aXZlIHByb2ZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5BTFJFQURZX0FDVElWRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZGV2aWNlLCBtQWN0aXZlRGV2aWNlVm9pY2UpICYmIGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSAmJiAobUFjdGl2ZURldmljZVZvaWNlUHJvZmlsZSA9PSBwcm9maWxlVHlwZSkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNldEFjdGl2ZURldmljZSgiICsgZGV2aWNlICsgIik6IGFscmVhZHkgc2V0IHRvIGFjdGl2ZSBmb3Igdm9pY2UgYW5kIHByb2ZpbGVUeXBlIHNhbWUgYXMgYWN0aXZlIHByb2ZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5BTFJFQURZX0FDVElWRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICBtU2hvUGVuZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKChkZXZpY2UgPT0gbnVsbCkgJiYgKG1BY3RpdmVEZXZpY2UgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZURldmljZS5nZXRBZGRyZXNzKCkuY29udGFpbnMoIjlFOjhCOjAwOjAwOjAwIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFkZHJCeXRlID0gVXRpbHMuZ2V0Qnl0ZUFkZHJlc3MobUFjdGl2ZURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzZXRfaWQgPSBhZGRyQnl0ZVs1XTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IG1lbWJlcnMgPSBtQ3NpcE1hbmFnZXIuZ2V0U2V0TWVtYmVycyhzZXRfaWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJObyBzZXQgbWVtYmVyIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8Qmx1ZXRvb3RoRGV2aWNlPiBpID0gbWVtYmVycy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgYWRkciA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImlzQWNtUGxheWluZ011c2ljKGFkZHIpICIgKyBpc0FjbVBsYXlpbmdNdXNpYyhhZGRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWNtUGxheWluZ011c2ljKGFkZHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaG9QZW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVFdNIGFjdGl2ZSBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbVNob1BlbmQgPSBpc0FjbVBsYXlpbmdNdXNpYyhtQWN0aXZlRGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJtU2hvUGVuZCAiICsgbVNob1BlbmQpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgbVZvaWNlU2hvUGVuZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1BY3RpdmVEZXZpY2VWb2ljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVEZXZpY2VWb2ljZS5nZXRBZGRyZXNzKCkuY29udGFpbnMoIjlFOjhCOjAwOjAwOjAwIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFkZHJCeXRlID0gVXRpbHMuZ2V0Qnl0ZUFkZHJlc3MobUFjdGl2ZURldmljZVZvaWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNldF9pZCA9IGFkZHJCeXRlWzVdOwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldF9pZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5vIHNldCBtZW1iZXIgZm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxCbHVldG9vdGhEZXZpY2U+IGkgPSBtZW1iZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBhZGRyID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaXNBY21QbGF5aW5nVm9pY2UoYWRkcikgIiArIGlzQWNtUGxheWluZ1ZvaWNlKGFkZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBY21QbGF5aW5nVm9pY2UoYWRkcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvaWNlU2hvUGVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRXTSBhY3RpdmUgZGV2aWNlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2ljZVNob1BlbmQgPSBpc0FjbVBsYXlpbmdWb2ljZShtQWN0aXZlRGV2aWNlVm9pY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKFRBRywgIm1Wb2ljZVNob1BlbmQgIiArIG1Wb2ljZVNob1BlbmQpOwotICAgICAgICB9Ci0gICAgICAgIExvZy5kKFRBRywgIm9sZCBtQWN0aXZlRGV2aWNlOiAiICsgbUFjdGl2ZURldmljZSArICIgJiBvbGQgbUFjdGl2ZURldmljZVZvaWNlOiAiICsgbUFjdGl2ZURldmljZVZvaWNlKTsKLQotICAgICAgICBpZiAoc2V0QWN0aXZlRGV2aWNlQWNtKGRldmljZSwgY29udGV4dFR5cGUsIHByb2ZpbGVUeXBlKSkgewotICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlUHJvZmlsZSA9IHByb2ZpbGVUeXBlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgbUFjdGl2ZURldmljZVZvaWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlVm9pY2VQcm9maWxlID0gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJuZXcgbUFjdGl2ZURldmljZTogIiArIG1BY3RpdmVEZXZpY2UgKyAiICYgbmV3IG1BY3RpdmVEZXZpY2VWb2ljZTogIiArIG1BY3RpdmVEZXZpY2VWb2ljZSk7Ci0gICAgICAgICAgICBpZighcGxheVJlcSkgewotICAgICAgICAgICAgICAgaWYgKG1TaG9QZW5kIHx8IG1Wb2ljZVNob1BlbmQpIHsKLSAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXRBY3RpdmVEZXZpY2UoIiArIGRldmljZSArICIpOiByZXR1cm5zIHdpdGggc3RhdHVzICIgKyBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5TSE9fUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLlNIT19QRU5ESU5HOwotICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXRBY3RpdmVEZXZpY2UoIiArIGRldmljZSArICIpOiByZXR1cm5zIHdpdGggc3RhdHVzICIgKyBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5TSE9fU1VDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLlNIT19TVUNDRVNTOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXRBY3RpdmVEZXZpY2UoIiArIGRldmljZSArICIpOiByZXR1cm5zIHdpdGggc3RhdHVzICIgKyBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5TSE9fUEVORElORyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLlNIT19QRU5ESU5HOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExvZy5kKFRBRywgInNldEFjdGl2ZURldmljZSgiICsgZGV2aWNlICsgIik6IHJldHVybnMgd2l0aCBzdGF0dXMgIiArIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLlNIT19GQUlMRUQpOwotICAgICAgICBtU2hvUGVuZCA9IGZhbHNlOwotICAgICAgICBtVm9pY2VTaG9QZW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5TSE9fRkFJTEVEOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2VBY20oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlLCBpbnQgcHJvZmlsZVR5cGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlQWNtOiAiICsgZGV2aWNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1BY21OYXRpdmVJbnRlcmZhY2VMb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICAgICAgaWYgKG1BY21OYXRpdmVJbnRlcmZhY2UgIT0gbnVsbCAmJiAhbUFjbU5hdGl2ZUludGVyZmFjZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBwcm9maWxlVHlwZSkpIHsKLSAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0QWN0aXZlRGV2aWNlKCIgKyBkZXZpY2UgKyAiKTogQ2Fubm90IHNldCBhcyBhY3RpdmUgaW4gbmF0aXZlIGxheWVyIik7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1BY21OYXRpdmVJbnRlcmZhY2VMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlQWNtKCIgKyBkZXZpY2UgKyAiKTogcmV0dXJucyB0cnVlIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWcgY29kZWNDb25maWcsIGludCBjb250ZXh0VHlwZSkgewotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNldENvZGVjQ29uZmlnUHJlZmVyZW5jZSgiICsgZGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBPYmplY3RzLnRvU3RyaW5nKGNvZGVjQ29uZmlnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFjbUNvZGVjQ29uZmlnLnNldENvZGVjQ29uZmlnUHJlZmVyZW5jZShkZXZpY2UsIGNvZGVjQ29uZmlnLCBjb250ZXh0VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgQ2hhbmdlQ29kZWNDb25maWdQcmVmZXJlbmNlKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNnKSB7Ci0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2hhbmdlQ29kZWNDb25maWdQcmVmZXJlbmNlICIgKyBkZXZpY2UgKyAic3RyaW5nOiAiICsgbWVzZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtQWNtTmFtZSA9IG1lc2c7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGlmIChtQWNtRGV2aWNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRtIDogbUFjbURldmljZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlIGQgPSBtQWNtRGV2aWNlcy5nZXQoZG0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZGV2aWNlLCBkLm1HcnBEZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5tU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOmhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gc20ub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuQ09ERUNfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBkLm1zZXRJRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gU3RhcnRTdHJlYW0oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN0YXJ0U3RyZWFtIGZvciAiICsgZGV2aWNlKyAiIGNvbnRleHQgdHlwZTogIiArIGNvbnRleHRUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGlmIChtQWNtRGV2aWNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRtIDogbUFjbURldmljZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlIGQgPSBtQWNtRGV2aWNlcy5nZXQoZG0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZGV2aWNlLCBkLm1HcnBEZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5tU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOmhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gc20ub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuU1RBUlRfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cub2JqID0gY29udGV4dFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBTdG9wU3RyZWFtKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb250ZXh0VHlwZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzdG9wU3RyZWFtIGZvciAiICsgZGV2aWNlKyAiIGNvbnRleHQgdHlwZTogIiArIGNvbnRleHRUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGlmIChtQWNtRGV2aWNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRtIDogbUFjbURldmljZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWNtRGV2aWNlIGQgPSBtQWNtRGV2aWNlcy5nZXQoZG0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZGV2aWNlLCBkLm1HcnBEZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5tU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOmhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gc20ub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuU1RPUF9TVFJFQU0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBjb250ZXh0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFic29sdXRlVm9sdW1lKEJsdWV0b290aERldmljZSBncnBBZGRyLCBpbnQgdm9sdW1lTGV2ZWwsIGludCBhdWRpb1R5cGUpIHsKLSAgICAgICAgLy9Db252ZXJ0IHZvbHVtZSBsZXZlbCB0byBWQ1AgbGV2ZWwgYmVmb3JlIHNlbmRpbmcuCi0gICAgICAgIGludCB2Y3BWb2x1bWUgPSBjb252ZXJ0VG9WY3BWb2x1bWUodm9sdW1lTGV2ZWwpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgYWN0aXZlRGV2aWNlID0gbnVsbDsKLSAgICAgICAgTG9nLmQoVEFHLCAiQXVkaW9Wb2x1bWVMZXZlbCAiICsgdm9sdW1lTGV2ZWwgKyAiIHZjcFZvbHVtZSAiICArIHZjcFZvbHVtZSk7Ci0KLSAgICAgICAgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPIHx8Ci0gICAgICAgICAgICAgICAgYXVkaW9UeXBlID09IEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTykgewotICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgYWN0aXZlRGV2aWNlTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLmdldCh0aGlzKTsKLSAgICAgICAgICAgIGFjdGl2ZURldmljZSA9IGFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlRGV2aWNlKGF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhY3RpdmVEZXZpY2UgIiArIGFjdGl2ZURldmljZSArICIgZ3JwQWRkciAiICArIGdycEFkZHIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGF1ZGlvVHlwZSAiICsgYXVkaW9UeXBlKTsKLSAgICAgICAgICAgIGlmICghZ3JwQWRkci5lcXVhbHMoYWN0aXZlRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklnbm9yZSBzZXRBYnNvbHV0ZVZvbHVtZSBmb3IgaW5hY3RpdmUgZGV2aWNlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkJST0FEQ0FTVF9BVURJTykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gYWN0aXZlIGRldmljZSwgZ3JwQWRkciAiICsgZ3JwQWRkciArICIgaXMgYnJvYWRjYXN0IGRldmljZSBvciBncm91cCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBhdWRpbyB0eXBlIGZvciBzZXQgdm9sdW1lLCBpZ25vcmUgdGhpcyByZXF1ZXN0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXVkaW9UeXBlID09IEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pIHsKLSAgICAgICAgICAgIG1BY3RpdmVEZXZpY2VMb2NhbE1lZGlhVm9sID0gdm9sdW1lTGV2ZWw7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9UeXBlID09IEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTykgewotICAgICAgICAgICAgbUFjdGl2ZURldmljZUxvY2FsVm9pY2VWb2wgPSB2b2x1bWVMZXZlbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChncnBBZGRyLmdldEFkZHJlc3MoKS5jb250YWlucygiOUU6OEI6MDA6MDA6MDAiKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0QWJzb2x1dGVWb2x1bWUgZm9yIGdyb3VwIGFkZHIsIHNlbmQgYWJzIHZvbCB0byBhbGwgbWVtYmVycyIpOwotICAgICAgICAgICAgYnl0ZVtdIGFkZHJCeXRlID0gVXRpbHMuZ2V0Qnl0ZUFkZHJlc3MoZ3JwQWRkcik7Ci0gICAgICAgICAgICBpbnQgc2V0X2lkID0gYWRkckJ5dGVbNV07Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldF9pZCk7Ci0gICAgICAgICAgICBpZiAobWVtYmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gc2V0IG1lbWJlciBmb3VuZCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEl0ZXJhdG9yPEJsdWV0b290aERldmljZT4gaSA9IG1lbWJlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFkZHIgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kIHZvbCB0byBtZW1iZXI6ICIgKyBhZGRyKTsKLSAgICAgICAgICAgICAgICBtVmNwQ29udHJvbGxlci5zZXRBYnNvbHV0ZVZvbHVtZShhZGRyLCB2Y3BWb2x1bWUsIGF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNldEFic29sdXRlVm9sdW1lIGZvciBzaW5nbGUgYWRkciwgc2VuZCBhYnMgdm9sIHRvICIgKyBncnBBZGRyKTsKLSAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLnNldEFic29sdXRlVm9sdW1lKGdycEFkZHIsIHZjcFZvbHVtZSwgYXVkaW9UeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE11dGUoQmx1ZXRvb3RoRGV2aWNlIGdycEFkZHIsIGJvb2xlYW4gZW5hYmxlTXV0ZSkgewotICAgICAgICBpZiAobUFjdGl2ZURldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJObyBhY3RpdmUgZGV2aWNlIHNldCwgdGhpcyBncnBBZGRyICIgKyBncnBBZGRyICsgIiBpcyBicm9hZGNhc3QgZ3JvdXAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm1BY3RpdmVEZXZpY2UgIiArIG1BY3RpdmVEZXZpY2UgKyAiIGdycEFkZHIgIiAgKyBncnBBZGRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChncnBBZGRyLmdldEFkZHJlc3MoKS5jb250YWlucygiOUU6OEI6MDA6MDA6MDAiKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0TXV0ZSBmb3IgZ3JvdXAgYWRkciwgc2VuZCBtdXRlL3VubXV0ZSB0byBhbGwgbWVtYmVycyIpOwotICAgICAgICAgICAgYnl0ZVtdIGFkZHJCeXRlID0gVXRpbHMuZ2V0Qnl0ZUFkZHJlc3MoZ3JwQWRkcik7Ci0gICAgICAgICAgICBpbnQgc2V0X2lkID0gYWRkckJ5dGVbNV07Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldF9pZCk7Ci0gICAgICAgICAgICBpZiAobWVtYmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gc2V0IG1lbWJlciBmb3VuZCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEl0ZXJhdG9yPEJsdWV0b290aERldmljZT4gaSA9IG1lbWJlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFkZHIgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kIHNldE11dGUgdG8gbWVtYmVyOiAiICsgYWRkcik7Ci0gICAgICAgICAgICAgICAgbVZjcENvbnRyb2xsZXIuc2V0TXV0ZShhZGRyLCBlbmFibGVNdXRlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0TXV0ZSBmb3Igc2luZ2xlIGFkZHIsIHNlbmQgbXV0ZS91bm11dGUgdG8gIiArIGdycEFkZHIpOwotICAgICAgICAgICAgbVZjcENvbnRyb2xsZXIuc2V0TXV0ZShncnBBZGRyLCBlbmFibGVNdXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU3RhdGVDaGFuZ2VkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCB2b2wsIGludCBhdWRpb1R5cGUpIHsKLSAgICAgICAgVm9sdW1lTWFuYWdlciBzZXJ2aWNlID0gVm9sdW1lTWFuYWdlci5nZXQoKTsKLSAgICAgICAgLy9HZXQgb3IgTWFrZSBncm91cCBhZGRyZXNzCi0gICAgICAgIEJsdWV0b290aERldmljZSBncnBEZXYgPSBnZXRHcm91cChkZXZpY2UpOwotCi0gICAgICAgIGlmIChhdWRpb1R5cGUgPT0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5CUk9BRENBU1RfQVVESU8pIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZvbHVtZSBub3RpZmljYXRpb24gZm9yIEJyb2FkY2FzdCBhdWRpbyIpOwotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2b2x1bWUgbm90aWZpY2F0aW9uIGZvciBNZWRpYSBhdWRpbyIpOwotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZvbHVtZSBub3RpZmljYXRpb24gZm9yIENhbGwgYXVkaW8iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlbW90ZSB2b2x1bWUgY2hhbmdlIGNhc2UKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlZvbHVtZSBjaGFuZ2UgZnJvbSByZW1vdGU6ICIgKyBkZXZpY2UgKyAgIiB2Y3Agdm9sICIgKyB2b2wpOwotICAgICAgICAgICAgYXVkaW9UeXBlID0gc2VydmljZS5nZXRBY3RpdmVBdWRpb1R5cGUoZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQ29udmVydCB2b2wKLSAgICAgICAgaW50IGF1ZGlvVm9sdW1lID0gY29udmVydFRvQXVkaW9TdHJlYW1Wb2x1bWUodm9sKTsKLSAgICAgICAgTG9nLmQoVEFHLCAidmNwIHZvbCAiICsgdm9sICsgIiBhdWRpb1ZvbHVtZSAiICsgYXVkaW9Wb2x1bWUpOwotCi0gICAgICAgIGlmIChhdWRpb1R5cGUgPT0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5CUk9BRENBU1RfQVVESU8pIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZSB2b2x1bWUgdG8gQVBNIGZvciBCcm9hZGNhc3QgYXVkaW8iKTsKLSAgICAgICAgICAgIHNlcnZpY2Uub25Wb2x1bWVDaGFuZ2UoZ3JwRGV2LCBhdWRpb1ZvbHVtZSwgYXVkaW9UeXBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdWRpb1R5cGUgPT0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTykgewotICAgICAgICAgICAgLy9DaGVjayBpZiBuZXcgdm9sIGlzIGRpZmYgdGhhbiBhY3RpdmUgZ3JvdXAgdm9sCi0gICAgICAgICAgICBMb2cuZChUQUcsICJuZXcgdm9sOiAiICsgYXVkaW9Wb2x1bWUgKyAiIG1BY3RpdmVEZXZpY2VMb2NhbE1lZGlhVm9sOiAiICsgbUFjdGl2ZURldmljZUxvY2FsTWVkaWFWb2wpOwotICAgICAgICAgICAgaWYgKG1BY3RpdmVEZXZpY2VMb2NhbE1lZGlhVm9sICE9IGF1ZGlvVm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibmV3IHZvbCBpcyBkaWZmZXJlbnQgdGhhbiBtQWN0aXZlRGV2aWNlTG9jYWxNZWRpYVZvbCB1cGRhdGUgQVBNIik7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5vblZvbHVtZUNoYW5nZShncnBEZXYsIGF1ZGlvVm9sdW1lLCBhdWRpb1R5cGUpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVEZXZpY2VMb2NhbE1lZGlhVm9sID0gYXVkaW9Wb2x1bWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImxvY2FsIGFjdGl2ZSBtZWRpYSB2b2wgc2FtZSBhcyBkZXZpY2UgbmV3IHZvbCwgaWdub3JlIHNlbmRpbmcgdG8gQVBNIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9UeXBlID09IEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAibmV3IHZvbDogIiArIGF1ZGlvVm9sdW1lICsgIiBtQWN0aXZlRGV2aWNlTG9jYWxWb2ljZVZvbDogIiArIG1BY3RpdmVEZXZpY2VMb2NhbFZvaWNlVm9sKTsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlRGV2aWNlTG9jYWxWb2ljZVZvbCAhPSBhdWRpb1ZvbHVtZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm5ldyB2b2wgaXMgZGlmZmVyZW50IHRoYW4gbUFjdGl2ZURldmljZUxvY2FsVm9pY2VWb2wgdXBkYXRlIEFQTSIpOwotICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Wb2x1bWVDaGFuZ2UoZ3JwRGV2LCBhdWRpb1ZvbHVtZSwgYXVkaW9UeXBlKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlTG9jYWxWb2ljZVZvbCA9IGF1ZGlvVm9sdW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJsb2NhbCBhY3RpdmUgY2FsbCB2b2wgc2FtZSBhcyBkZXZpY2UgbmV3IHZvbCwgaWdub3JlIHNlbmRpbmcgdG8gQVBNIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJObyBhdWRpbyBpcyBzdHJlYW1pbmcgYW5kIGlzIGluYWN0aXZlIGRldmljZSwgaWdub3JlIHNlbmRpbmcgdG8gQVBNIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NoZWNrIGlmIHRoaXMgZGV2aWNlIGlzIGdyb3VwIGRldmljZSwgdGhlbiB0YWtlIGxvY2sgKGlnbm9yZWQgZm9yIG5vdykgYW5kIHVwZGF0ZSB2b2wgdG8gb3RoZXIgbWVtYmVycyBhcyB3ZWxsLgotICAgICAgICBhcHBseVZvbFRvT3RoZXJNZW1iZXJzKGRldmljZSwgbUNzaXBNYW5hZ2VyLmdldENzaXBTZXRJZChkZXZpY2UsIG51bGwgLypBQ01fVVVJRCovKSwgdm9sLCBhdWRpb1R5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uTXV0ZVN0YXR1c0NoYW5nZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc011dGVkKSB7Ci0gICAgICAgIFZvbHVtZU1hbmFnZXIgc2VydmljZSA9IFZvbHVtZU1hbmFnZXIuZ2V0KCk7Ci0gICAgICAgIC8vR2V0IG9yIE1ha2UgZ3JvdXAgYWRkcmVzcwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZ3JwRGV2ID0gZ2V0R3JvdXAoZGV2aWNlKTsKLSAgICAgICAgLy9kZWZhdWx0IGNvbnRleHQgdHlwZQotICAgICAgICBpbnQgY190eXBlID0gQ09OVEVYVF9UWVBFX1VOS05PV047Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAiaXNNdXRlZCAiICsgaXNNdXRlZCArICIgbUFjdGl2ZURldmljZUlzTXV0ZWQgIiArIG1BY3RpdmVEZXZpY2VJc011dGVkKTsKLQotICAgICAgICBpZiAoIW1WY3BDb250cm9sbGVyLmlzQnJvYWRjYXN0RGV2aWNlKGRldmljZSkgJiYgKChtQWN0aXZlRGV2aWNlID09IG51bGwpIHx8IChtQWN0aXZlRGV2aWNlICE9IGdycERldikpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1bmljYXN0LW1vZGUsIGVpdGhlciBBY3RpdmUgZGV2aWNlIG51bGwgb3IgbXV0ZVN0YXR1cyBjaGFuZ2VkIGZvciBpbmFjdGl2ZSBkZXZpY2UgLS0gcmV0dXJuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1BY3RpdmVEZXZpY2UgPT0gbnVsbCkgfHwgKG1BY3RpdmVEZXZpY2UgIT0gZ3JwRGV2KSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gQWN0aXZlIGRldmljZSBvciBkZXZpY2UgaXMgbm90IGFjdGl2ZSwgc2VlbXMgaW4gQnJvYWRjYXN0IG1vZGUiKTsKLSAgICAgICAgICAgIGNfdHlwZSA9IENPTlRFWFRfVFlQRV9CUk9BRENBU1RfQVVESU87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJtQWN0aXZlRGV2aWNlICIgKyBtQWN0aXZlRGV2aWNlICsgIiBncnBEZXYgIiAgKyBncnBEZXYgKyAiIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIGNfdHlwZSA9IENPTlRFWFRfVFlQRV9NVVNJQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQ2hlY2sgaWYgbmV3IG11dGUgc3RhdGUgaXMgZGlmZiB0aGFuIGFjdGl2ZSBncm91cCBtdXRlIHN0YXRlCi0gICAgICAgIGlmIChtQWN0aXZlRGV2aWNlSXNNdXRlZCAhPSBpc011dGVkKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJuZXcgbXV0ZSBzdGF0ZSBpcyBkaWZmZXJlbnQgdGhhbiBtQWN0aXZlRGV2aWNlSXNNdXRlZCB1cGRhdGUgQVBNIik7Ci0gICAgICAgICAgICBzZXJ2aWNlLm9uTXV0ZVN0YXR1c0NoYW5nZShncnBEZXYsIGlzTXV0ZWQsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgICAgICBtQWN0aXZlRGV2aWNlSXNNdXRlZCA9IGlzTXV0ZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJsb2NhbCBhY3RpdmUgZGV2aWNlIG11dGUgc3RhdGUgc2FtZSBhcyBkZXZpY2UgbmV3IG11dGUgc3RhdGUsIGlnbm9yZSBzZW5kaW5nIHRvIEFQTSwgYnV0IHNlbmQgdG8gb3RoZXIgbWVtYmVycyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9DaGVjayBpZiB0aGlzIGRldmljZSBpcyBncm91cCBkZXZpY2UsIHRoZW4gdGFrZSBsb2NrKGlnbm9yZWQgZm9yIG5vdykgYW5kIHVwZGF0ZSBtdXRlIHN0YXRlIHRvIG90aGVyIG1lbWJlcnMgYXMgd2VsbC4KLSAgICAgICAgYXBwbHlNdXRlU3RhdGVUb090aGVyTWVtYmVycyhkZXZpY2UsIG1Dc2lwTWFuYWdlci5nZXRDc2lwU2V0SWQoZGV2aWNlLCBudWxsIC8qQUNNX1VVSUQqLyksIGlzTXV0ZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFic1ZvbFN1cHBvcnQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc0Fic1ZvbFN1cHBvcnRlZCwgaW50IGluaXRpYWxWb2wpIHsKLSAgICAgICAgVm9sdW1lTWFuYWdlciBzZXJ2aWNlID0gVm9sdW1lTWFuYWdlci5nZXQoKTsKLSAgICAgICAgLy9HZXQgb3IgTWFrZSBncm91cCBhZGRyZXNzCi0gICAgICAgIEJsdWV0b290aERldmljZSBncnBEZXYgPSBnZXRHcm91cChkZXZpY2UpOwotICAgICAgICBpZiAoZ3JwRGV2ID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkdyb3VwIG5vdCBjcmVhdGVkLCByZXR1cm4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1WY3BDb250cm9sbGVyLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSAmJiBpc0Fic1ZvbFN1cHBvcnRlZCkgewotICAgICAgICAgICAgaWYgKCFpc1ZjcFBlZXJEZXZpY2VDb25uZWN0ZWQoZGV2aWNlLCBtQ3NpcE1hbmFnZXIuZ2V0Q3NpcFNldElkKGRldmljZSwgbnVsbCAvKkFDTV9VVUlEKi8pKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlZDUCBQZWVyIGRldmljZSBub3QgY29ubmVjdGVkLCB0aGlzIGlzIDFzdCBtZW1iZXIsIHVwZGF0ZSBzdXBwb3J0IHRvIEFQTSAiKTsKLSAgICAgICAgICAgICAgICAvL2dldCBjdXJyZW50IHZvbCBmcm9tIFZDUCBhbmQgc2VuZCB0byBBUE0gZHVyaW5nIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVkNQIGluaXRpYWxWb2wgIiArIGluaXRpYWxWb2wgKyAiIHdoZW4gY29ubmVjdGVkIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGUgQVBNIHdpdGggY29ubmVjdGlvbiB2b2wgIiArIGNvbnZlcnRUb0F1ZGlvU3RyZWFtVm9sdW1lKGluaXRpYWxWb2wpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldEFic29sdXRlVm9sdW1lU3VwcG9ydChncnBEZXYsIGlzQWJzVm9sU3VwcG9ydGVkLCBjb252ZXJ0VG9BdWRpb1N0cmVhbVZvbHVtZShpbml0aWFsVm9sKSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5WQ1ApOwotCi0gICAgICAgICAgICAgICAgLy9nZXQgY3VycmVudCBtdXRlIHN0YXRlIGZyb20gVkNQIGFuZCBzZW50IHRvIEFQTSBkdXJpbmcgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJWQ1AgbXV0ZSBzdGF0ZSAiICsgbVZjcENvbnRyb2xsZXIuaXNNdXRlKGRldmljZSkgKyAiIHdoZW4gY29ubmVjdGVkIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uTXV0ZVN0YXR1c0NoYW5nZShncnBEZXYsIG1WY3BDb250cm9sbGVyLmlzTXV0ZShkZXZpY2UpLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJWQ1AgUGVlciBkZXZpY2UgY29ubmVjdGVkLCB0aGlzIGlzIG5vdCAxc3QgbWVtYmVyLCBza2lwIHVwZGF0ZSB0byBBUE0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgobVZjcENvbnRyb2xsZXIuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpICYmICFpc0Fic1ZvbFN1cHBvcnRlZCkgewotICAgICAgICAgICAgaWYgKGlzVmNwUGVlckRldmljZUNvbm5lY3RlZChkZXZpY2UsIG1Dc2lwTWFuYWdlci5nZXRDc2lwU2V0SWQoZGV2aWNlLCBudWxsIC8qQUNNX1VVSUQqLykpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVkNQIFBlZXIgZGV2aWNlIGNvbm5lY3RlZCwgdGhpcyBpcyBub3QgbGFzdCBtZW1iZXIsIHNraXAgdXBkYXRlIHRvIEFQTSAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVkNQIFBlZXIgZGV2aWNlIG5vdCBjb25uZWN0ZWQsIHRoaXMgaXMgbGFzdCBtZW1iZXIsIHVwZGF0ZSB0byBBUE0iKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldEFic29sdXRlVm9sdW1lU3VwcG9ydChncnBEZXYsIGlzQWJzVm9sU3VwcG9ydGVkLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlZDUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZjcFBlZXJEZXZpY2VDb25uZWN0ZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHNldGlkKSB7Ci0gICAgICBib29sZWFuIGlzVmNwUGVlckNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgaWYgKHNldGlkID09IElOVkFMSURfU0VUX0lEKQotICAgICAgICAgIHJldHVybiBpc1ZjcFBlZXJDb25uZWN0ZWQ7Ci0gICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG1Dc2lwTWFuYWdlci5nZXRTZXRNZW1iZXJzKHNldGlkKTsKLSAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICBMb2cuZChUQUcsICJObyBzZXQgbWVtYmVyIGZvdW5kIik7Ci0gICAgICAgICAgcmV0dXJuIGlzVmNwUGVlckNvbm5lY3RlZDsKLSAgICAgIH0KLSAgICAgIEl0ZXJhdG9yPEJsdWV0b290aERldmljZT4gaSA9IG1lbWJlcnMuaXRlcmF0b3IoKTsKLSAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFkZHIgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhhZGRyLCBkZXZpY2UpICYmIChtVmNwQ29udHJvbGxlci5nZXRDb25uZWN0aW9uU3RhdGUoYWRkcikgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpKSB7Ci0gICAgICAgICAgICAgICAgICBpc1ZjcFBlZXJDb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQXQgbGVhc3Qgb25lIG90aGVyIHZjcCBtZW1iZXIgaXMgaW4gY29ubmVjdGVkIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBpc1ZjcFBlZXJDb25uZWN0ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY29udmVydFRvQXVkaW9TdHJlYW1Wb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAvLyBSZXNjYWxlIHZvbHVtZSB0byBtYXRjaCBBdWRpb1N5c3RlbSdzIHZvbHVtZQotICAgICAgICByZXR1cm4gKGludCkgTWF0aC5yb3VuZCgoZG91YmxlKSB2b2x1bWUgKiBtQXVkaW9TdHJlYW1NYXggLyBWQ1BfTUFYX1ZPTCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY29udmVydFRvVmNwVm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguY2VpbCgoZG91YmxlKSB2b2x1bWUgKiBWQ1BfTUFYX1ZPTCAvIG1BdWRpb1N0cmVhbU1heCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5Vm9sVG9PdGhlck1lbWJlcnMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHNldGlkLCBpbnQgdm9sdW1lLCBpbnQgYXVkaW9UeXBlKSB7Ci0gICAgICAgIGlmIChzZXRpZCA9PSBJTlZBTElEX1NFVF9JRCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IG1lbWJlcnMgPSBtQ3NpcE1hbmFnZXIuZ2V0U2V0TWVtYmVycyhzZXRpZCk7Ci0gICAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk5vIHNldCBtZW1iZXIgZm91bmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxCbHVldG9vdGhEZXZpY2U+IGkgPSBtZW1iZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBhZGRyID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhhZGRyLCBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNlbmQgdm9sIGNoYW5nZWQgdG8gYWRkciAiICsgYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLnNldEFic29sdXRlVm9sdW1lKGFkZHIsIHZvbHVtZSwgYXVkaW9UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlNdXRlU3RhdGVUb090aGVyTWVtYmVycyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc2V0aWQsIGJvb2xlYW4gbXV0ZVN0YXRlKSB7Ci0gICAgICAgIGlmIChzZXRpZCA9PSBJTlZBTElEX1NFVF9JRCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IG1lbWJlcnMgPSBtQ3NpcE1hbmFnZXIuZ2V0U2V0TWVtYmVycyhzZXRpZCk7Ci0gICAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk5vIHNldCBtZW1iZXIgZm91bmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxCbHVldG9vdGhEZXZpY2U+IGkgPSBtZW1iZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBhZGRyID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhhZGRyLCBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNlbmQgbXV0ZSBzdGF0ZSB0byBhZGRyICIgKyBhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgbVZjcENvbnRyb2xsZXIuc2V0TXV0ZShhZGRyLCBtdXRlU3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VmNwQ29ublN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1WY3BDb250cm9sbGVyLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VmNwQ29ubk1vZGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gbVZjcENvbnRyb2xsZXIuZ2V0Q29ubmVjdGlvbk1vZGUoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZjcE11dGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gbVZjcENvbnRyb2xsZXIuaXNNdXRlKGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY21OYW1lKCkgewotICAgICAgICByZXR1cm4gbUFjbU5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNtQmluZGVyIGV4dGVuZHMgQmluZGVyIGltcGxlbWVudHMgSVByb2ZpbGVTZXJ2aWNlQmluZGVyIHsKLSAgICAgICAgQWNtQmluZGVyKEFjbVNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhHcm91cENhbGxiYWNrIG1CbHVldG9vdGhHcm91cENhbGxiYWNrID0gbmV3IEJsdWV0b290aEdyb3VwQ2FsbGJhY2soKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uR3JvdXBDbGllbnRBcHBSZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBhcHBJZCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Hcm91cENsaWVudEFwcFJlZ2lzdGVyZWQsIHN0YXR1czogIiArIHN0YXR1cyArICJhcHBJZDogIiArIGFwcElkKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgIG1Dc2lwTWFuYWdlci51cGRhdGVBcHBJZChhcHBJZCk7Ci0gICAgICAgICAgICAgICAgbUlzQ3NpcFJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEZXZpY2VHcm91cCByZWdpc3RlcmF0aW9uIGZhaWxlZCwgc3RhdHVzOiIgKyBzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkIChpbnQgc3RhdGUsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDogRGV2aWNlOiAiICsgZGV2aWNlICsgInN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgLy9ub3RpZnkgc3RhdGVtYWNoaW5lIGFib3V0IGRldmljZSBjb25uZWN0aW9uIHN0YXRlCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBzbS5vYnRhaW5NZXNzYWdlKEFjbVN0YXRlTWFjaGluZS5DU0lQX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FeGNsdXNpdmVBY2Nlc3NDaGFuZ2VkIChpbnQgc2V0SWQsIGludCB2YWx1ZSwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkV4Y2x1c2l2ZUFjY2Vzc0NoYW5nZWQ6IHNldElkIiArIHNldElkICsgZGV2aWNlcyArICJzdGF0dXM6IiArIHN0YXR1cyk7Ci0KLSAgICAgICAgICAgIC8vbm90aWZ5IHRoZSBzdGF0ZW1hY2hpbmUgYWJvdXQgQ1NJUCBMb2NrIHN0YXR1cwotICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFMTF9MT0NLU19BQ1FVSVJFRDogewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNtU3RhdGVNYWNoaW5lIHNtID0gZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86aGFuZGxlIHRoaXMgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBzbS5vYnRhaW5NZXNzYWdlKEFjbVN0YXRlTWFjaGluZS5DU0lQX0xPQ0tfU1RBVFVTX0xPQ0tFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHNldElkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNPTUVfTE9DS1NfQUNRVUlSRURfUkVBU09OX1RJTUVPVVQ6IC8vY2hlY2sgaWYgbmVlZCB0byBoYW5kbGUgc2VwYXJhdGVseQotICAgICAgICAgICAgICAgIGNhc2UgU09NRV9MT0NLU19BQ1FVSVJFRF9SRUFTT05fRElTQzogewotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgbURldmljZSA9IGdldENzaXBMb2NrUmVxdWVzdGVkRGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VzLmNvbnRhaW5zKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOmhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gc20ub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuQ1NJUF9MT0NLX1NUQVRVU19QQVJUSUFMX0xPQ0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cub2JqID0gc2V0SWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIGFjY2VzcyByZXF1ZXN0ZWQgZGV2aWNlIGlzIG5vdCBwcmVzZW50IGluIGxpc3QsIHJlbGVhc2UgYWNjZXNzIGZvciBhbGwgZGV2aWNlcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNzaXBNYW5hZ2VyLnNldExvY2soc2V0SWQsIGRldmljZXMsIG1Dc2lwTWFuYWdlci5VTkxPQ0spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTE9DS19ERU5JRUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOmhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gc20ub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuQ1NJUF9MT0NLX1NUQVRVU19ERU5JRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBzZXRJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBMT0NLX1JFTEVBU0VEOiB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzpoYW5kbGUgdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHNtLm9idGFpbk1lc3NhZ2UoQWNtU3RhdGVNYWNoaW5lLkNTSVBfTE9DS19TVEFUVVNfUkVMRUFTRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBzZXRJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBMT0NLX1JFTEVBU0VEX1RJTUVPVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjbVN0YXRlTWFjaGluZSBzbSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOmhhbmRsZSB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gc20ub2J0YWluTWVzc2FnZShBY21TdGF0ZU1hY2hpbmUuQ1NJUF9MT0NLX1NUQVRVU19SRUxFQVNFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHNldElkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvKmNhc2UgSU5WQUxJRF9SRVFVRVNUX1BBUkFNUzogewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNtU3RhdGVNYWNoaW5lIHNtID0gZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86aGFuZGxlIHRoaXMgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBzbS5vYnRhaW5NZXNzYWdlKEFjbVN0YXRlTWFjaGluZS5DU0lQX0xPQ0tfU1RBVFVTX0lOVkFMSURfUEFSQU0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBzZXRJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGJyZWFrOyovCi0KLSAgICAgICAgICAgICAgICAvKmNhc2UgTE9DS19SRUxFQVNFX05PVF9BTExPV0VEOiB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY21TdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzpoYW5kbGUgdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHNtLm9idGFpbk1lc3NhZ2UoQWNtU3RhdGVNYWNoaW5lLkNTSVBfTE9DS19TVEFUVVNfUkVMRUFTRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHNldElkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ki8KLQotICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxJRF9WQUxVRToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3B1YmxpYyB2b2lkIG9uU2V0TWVtYmVyRm91bmQgKGludCBzZXRJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeyAgICB9Ci0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBvblNldERpc2NvdmVyeVN0YXR1c0NoYW5nZWQgKGludCBzZXRJZCwgaW50IHN0YXR1cywgaW50IHJlYXNvbikgeyAgICB9Ci0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBvbkxvY2tBdmFpbGFibGUgKGludCBzZXRJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeyAgICB9Ci0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBvbk5ld1NldEZvdW5kIChpbnQgc2V0SWQsICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBVVUlEIHV1aWQpIHsgICAgIH0KLQotICAgICAgICAvL3B1YmxpYyB2b2lkIG9uTG9ja1N0YXR1c0ZldGNoZWQgKGludCBzZXRJZCwgaW50IGxvY2tTdGF0dXMpIHsgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgQ3NpcE1hbmFnZXIgZ2V0Q3NpcE1hbmFnZXIoKXsKLSAgICAgICAgcmV0dXJuIG1Dc2lwTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBjbGFzcyBDc2lwTWFuYWdlciB7Ci0gICAgICAgIHB1YmxpYyBpbnQgTE9DSyA9IDA7Ci0gICAgICAgIHB1YmxpYyBpbnQgVU5MT0NLID0gMDsKLQotICAgICAgICBpbnQgbUNzaXBBcHBpZDsKLQotICAgICAgICBDc2lwTWFuYWdlcigpIHsKLSAgICAgICAgICAgIExPQ0sgPSBCbHVldG9vdGhEZXZpY2VHcm91cC5BQ0NFU1NfR1JBTlRFRDsKLSAgICAgICAgICAgIFVOTE9DSyA9IEJsdWV0b290aERldmljZUdyb3VwLkFDQ0VTU19SRUxFQVNFRDsKLQotICAgICAgICAgICAgcmVnaXN0ZXJDc2lwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDc2lwTWFuYWdlcihCbHVldG9vdGhHcm91cENhbGxiYWNrIGNhbGxiYWNrcykgewotICAgICAgICAgICAgTE9DSyA9IEJsdWV0b290aERldmljZUdyb3VwLkFDQ0VTU19HUkFOVEVEOwotICAgICAgICAgICAgVU5MT0NLID0gQmx1ZXRvb3RoRGV2aWNlR3JvdXAuQUNDRVNTX1JFTEVBU0VEOwotCi0gICAgICAgICAgICByZWdpc3RlckNzaXAoY2FsbGJhY2tzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlQXBwSWQoaW50IGlkKSB7Ci0gICAgICAgICAgICBtQ3NpcEFwcGlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0QXBwSWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNzaXBBcHBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVnaXN0ZXJDc2lwKCkgewotICAgICAgICAgICAgR3JvdXBTZXJ2aWNlIG1Hcm91cFNlcnZpY2UgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihtR3JvdXBTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJtR3JvdXBTZXJ2aWNlIGlzIG5vdCBudWxsLCByZWdpc3RlciIpOwotICAgICAgICAgICAgICAgIG1Hcm91cFNlcnZpY2UucmVnaXN0ZXJHcm91cENsaWVudE1vZHVsZShtQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlZ2lzdGVyQ3NpcChCbHVldG9vdGhHcm91cENhbGxiYWNrIGNhbGxiYWNrcykgewotICAgICAgICAgICAgR3JvdXBTZXJ2aWNlIG1Hcm91cFNlcnZpY2UgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihtR3JvdXBTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJtR3JvdXBTZXJ2aWNlIGlzIG5vdCBudWxsLCByZWdpc3RlciAiICsgY2FsbGJhY2tzKTsKLSAgICAgICAgICAgICAgICBtR3JvdXBTZXJ2aWNlLnJlZ2lzdGVyR3JvdXBDbGllbnRNb2R1bGUoY2FsbGJhY2tzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdW5yZWdpc3RlckNzaXAoKSB7Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2UgbUdyb3VwU2VydmljZSA9IEdyb3VwU2VydmljZS5nZXRHcm91cFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBTZXJ2aWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbUdyb3VwU2VydmljZS51bnJlZ2lzdGVyR3JvdXBDbGllbnRNb2R1bGUobUNzaXBBcHBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNvbm5lY3RDc2lwKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBtR3JvdXBTZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICAgICAgbUdyb3VwU2VydmljZS5jb25uZWN0KG1Dc2lwQXBwaWQsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRpc2Nvbm5lY3RDc2lwKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBtR3JvdXBTZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICAgICAgbUdyb3VwU2VydmljZS5kaXNjb25uZWN0KG1Dc2lwQXBwaWQsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldExvY2soaW50IHNldElkLCBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcywgaW50IGxvY2tWYWwpIHsKLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBtR3JvdXBTZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICAgICAgbUdyb3VwU2VydmljZS5zZXRMb2NrVmFsdWUobUNzaXBBcHBpZCwgc2V0SWQsIGRldmljZXMsIGxvY2tWYWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGV2aWNlR3JvdXAgZ2V0Q3NpcFNldChpbnQgc2V0SWQpIHsKLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBtR3JvdXBTZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cFNlcnZpY2UuZ2V0Q29vcmRpbmF0ZWRTZXQoc2V0SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldFNldE1lbWJlcnMoaW50IHNldElkKSB7Ci0gICAgICAgICAgICBEZXZpY2VHcm91cCBzZXQgPSBnZXRDc2lwU2V0KHNldElkKTsKLSAgICAgICAgICAgIGlmKHNldCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBzZXQuZ2V0RGV2aWNlR3JvdXBNZW1iZXJzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDc2lwU2V0SWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgUGFyY2VsVXVpZCB1dWlkKSB7Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2UgbUdyb3VwU2VydmljZSA9IEdyb3VwU2VydmljZS5nZXRHcm91cFNlcnZpY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBTZXJ2aWNlLmdldFJlbW90ZURldmljZUdyb3VwSWQoZGV2aWNlLCB1dWlkKTsKLSAgICAgICAgICAgIC8vcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtU3RhY2tFdmVudC5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtU3RhY2tFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmMzOWZiLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbVN0YWNrRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFjbTsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjU3RhdHVzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLQotLyoqCi0gKiBTdGFjayBldmVudCBzZW50IHZpYSBhIGNhbGxiYWNrIGZyb20gSk5JIHRvIEphdmEsIG9yIGdlbmVyYXRlZAotICogaW50ZXJuYWxseSBieSB0aGUgQUNNIFN0YXRlIE1hY2hpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY21TdGFja0V2ZW50IHsKLSAgICAvLyBFdmVudCB0eXBlcyBmb3IgU1RBQ0tfRVZFTlQgbWVzc2FnZSAoY29taW5nIGZyb20gbmF0aXZlKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX05PTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX0FVRElPX1NUQVRFX0NIQU5HRUQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQgPSAzOwotCi0gICAgLy8gRG8gbm90IG1vZGlmeSB3aXRob3V0IHVwZGF0aW5nIHRoZSBIQUwgYnRfYWNtLmggZmlsZXMuCi0gICAgLy8gTWF0Y2ggdXAgd2l0aCBidGFjbV9jb25uZWN0aW9uX3N0YXRlX3QgZW51bSBvZiBidF9hY20uaAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORyA9IDM7Ci0gICAgLy8gTWF0Y2ggdXAgd2l0aCBidGFjbV9hdWRpb19zdGF0ZV90IGVudW0gb2YgYnRfYWNtLmgKLSAgICBzdGF0aWMgZmluYWwgaW50IEFVRElPX1NUQVRFX1JFTU9URV9TVVNQRU5EID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEFVRElPX1NUQVRFX1NUT1BQRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVESU9fU1RBVEVfU1RBUlRFRCA9IDI7Ci0KLSAgICAvLyBNYXRjaCB1cCB3aXRoIGJ0YWNtX2F1ZGlvX3N0YXRlX3QgZW51bSBvZiBidF9hY20uaAotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX1VOS05PV04gPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX01VU0lDID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9WT0lDRSA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UgPSAzOwotCi0gICAgIC8vIE1hdGNoIHVwIHdpdGggYnRhY21fYXVkaW9fc3RhdGVfdCBlbnVtIG9mIGJ0X2FjbS5oCi0gICAgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX1RZUEVfTk9ORSA9IDA7Ci0KLSAgICBwdWJsaWMgaW50IHR5cGUgPSBFVkVOVF9UWVBFX05PTkU7Ci0gICAgcHVibGljIEJsdWV0b290aERldmljZSBkZXZpY2U7Ci0gICAgcHVibGljIGludCB2YWx1ZUludDEgPSAwOwotICAgIHB1YmxpYyBpbnQgdmFsdWVJbnQyID0gMDsKLSAgICBwdWJsaWMgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgY29kZWNTdGF0dXM7Ci0KLSAgICBBY21TdGFja0V2ZW50KGludCB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gZXZlbnQgZHVtcAotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkFjbVN0YWNrRXZlbnQge3R5cGU6IiArIGV2ZW50VHlwZVRvU3RyaW5nKHR5cGUpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXZpY2U6IiArIGRldmljZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc3RhdGU6IiArIGV2ZW50VHlwZVZhbHVlSW50VG9TdHJpbmcodHlwZSwgdmFsdWVJbnQxKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGV4dCB0eXBlOiIgKyBjb250ZXh0VHlwZVZhbHVlSW50VG9TdHJpbmcodmFsdWVJbnQyKSk7Ci0gICAgICAgIGlmIChjb2RlY1N0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvZGVjU3RhdHVzOiIgKyBjb2RlY1N0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgifSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV2ZW50VHlwZVRvU3RyaW5nKGludCB0eXBlKSB7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX05PTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX05PTkUiOwotICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9BVURJT19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9BVURJT19TVEFURV9DSEFOR0VEIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9DT0RFQ19DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfVU5LTk9XTjoiICsgdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBldmVudFR5cGVWYWx1ZUludFRvU3RyaW5nKGludCB0eXBlLCBpbnQgdmFsdWUpIHsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRElTQ09OTkVDVEVEIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RJTkciOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNURUQiOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRElTQ09OTkVDVElORyI7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfQVVESU9fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fU1RBVEVfUkVNT1RFX1NVU1BFTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlJFTU9URV9TVVNQRU5EIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19TVEFURV9TVE9QUEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTVE9QUEVEIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19TVEFURV9TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTVEFSVEVEIjsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcodmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb250ZXh0VHlwZVZhbHVlSW50VG9TdHJpbmcoaW50IHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgIGNhc2UgQ09OVEVYVF9UWVBFX1VOS05PV046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKLSAgICAgICAgICAgIGNhc2UgQ09OVEVYVF9UWVBFX01VU0lDOgotICAgICAgICAgICAgICAgIHJldHVybiAiTUVESUEiOwotICAgICAgICAgICAgY2FzZSBDT05URVhUX1RZUEVfVk9JQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05WRVJTQVRJT05BTCI7Ci0gICAgICAgICAgICBjYXNlIENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIk1FRElBK0NPTlZFUlNBVElPTkFMIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOOiIgKyB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYWNtL0FjbVN0YXRlTWFjaGluZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtU3RhdGVNYWNoaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzM4N2MuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hY20vQWNtU3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYWNtOwotLy9wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG07Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ29kZWNDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ29kZWNTdGF0dXM7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLklTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoU3RhdHNMb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGVNYWNoaW5lOwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5BcG1Db25zdDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLlN0cmVhbUF1ZGlvU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGgudmNwLlZjcENvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVmNwOwotCi1maW5hbCBjbGFzcyBBY21TdGF0ZU1hY2hpbmUgZXh0ZW5kcyBTdGF0ZU1hY2hpbmUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjbVN0YXRlTWFjaGluZSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgIG1SZWNvbmZpZyA9ICIiOwotICAgIHB1YmxpYyBVVUlEIHV1aWQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1QgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSAzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9MT0NLX1NUQVRVU19MT0NLRUQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9MT0NLX1NUQVRVU19QQVJUSUFMX0xPQ0sgPSA1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9MT0NLX1NUQVRVU19ERU5JRUQgPSA2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9MT0NLX1NUQVRVU19SRUxFQVNFRCA9IDc7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT0RFQ19DT05GSUdfQ0hBTkdFRCA9IDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHQVRUX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9IDk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHQVRUX0NPTk5FQ1RJT05fVElNRU9VVCA9IDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1RSRUFNID0gMTE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTVE9QX1NUUkVBTSA9IDEyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1RSRUFNX1JFUSA9IDEzOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBQ0tfRVZFTlQgPSAxMDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfVElNRU9VVCA9IDIwMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9MT0NLX1JFTEVBU0VfVElNRU9VVCA9IDMwMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9MT0NLX1RJTUVPVVQgPSA0MDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFX0FVRElPX0FWQUlMQUJMRV9MSUNFTlNFRCA9IDB4MDAwMDAzMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHQVRUX0NPTk5FQ1RJT05fVElNRU9VVF9NUyA9IDMwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgR0FUVF9QRUVSX0NPTk5fVElNRU9VVCA9IDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHQVRUX0NPTk5fRkFJTEVEX0VTVEFCTElTSEVEID0gMHgzRTsKLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBpbnQgc0Nvbm5lY3RUaW1lb3V0TXMgPSAzMDAwMDsgICAgICAgIC8vIDMwcwotICAgIHN0YXRpYyBpbnQgc0NzaXBMb2NrUmVsZWFzZVRpbWVvdXRNcyA9IDUwMDA7ICAvL1RPRE8KLSAgICBzdGF0aWMgaW50IHNDc2lwTG9ja1RpbWVvdXRNcyA9IDUwMDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBBQ01fTUFYX0JZVEVTID0gMTAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgQ1NfUEFSQU1fTlVNX0JJVFMgID0gODsKLSAgICBwcml2YXRlIGZpbmFsIGludCBDU19QQVJBTV9JTkRfTUFTSyAgPSAweGZmOwotICAgIHByaXZhdGUgZmluYWwgaW50IENTX1BBUkFNXzFTVF9JTkRFWCA9IDB4MDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgQ1NfUEFSQU1fMk5EX0lOREVYID0gMHgwMTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBDU19QQVJBTV8zUkRfSU5ERVggPSAweDAyOwotICAgIHByaXZhdGUgZmluYWwgaW50IENTX1BBUkFNXzRUSF9JTkRFWCA9IDB4MDM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgQ1NfUEFSQU1fNVRIX0lOREVYID0gMHgwNDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBDU19QQVJBTV82VEhfSU5ERVggPSAweDA1OwotICAgIHByaXZhdGUgZmluYWwgaW50IENTX1BBUkFNXzdUSF9JTkRFWCA9IDB4MDY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgQ1NfUEFSQU1fOFRIX0lOREVYID0gMHgwNzsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IENPREVDX1RZUEVfTEMzUSAgICA9IDB4MTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUNfTkFNRSA9ICJDb2RlYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9NQVAgPSAiU3RyZWFtTWFwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVfRFVSQVRJT04gPSAiRnJhbWVEdXJhdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNEVV9CTE9DSyA9ICJCbG9ja3NfZm9yU0RVIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlhDT05GSUdfSU5EWCA9ICJyeGNvbmZpZ19pbmRleCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRYQ09ORklHX0lORFggPSAidHhjb25maWdfaW5kZXgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTUVUQV9EQVRBID0gInZlbmRvciI7Ci0gICAgcHJpdmF0ZSBEaXNjb25uZWN0ZWQgbURpc2Nvbm5lY3RlZDsKLSAgICBwcml2YXRlIENvbm5lY3RpbmcgbUNvbm5lY3Rpbmc7Ci0gICAgcHJpdmF0ZSBEaXNjb25uZWN0aW5nIG1EaXNjb25uZWN0aW5nOwotICAgIHByaXZhdGUgQ29ubmVjdGVkIG1Db25uZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBTdHJlYW1pbmcgbVN0cmVhbWluZzsKLSAgICBwcml2YXRlIGludCBtQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3RDb25uZWN0aW9uU3RhdGUgPSAtMTsKLSAgICBwcml2YXRlIGludCBtTXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICBwcml2YXRlIGludCBtTGFzdE11c2ljQ29ubmVjdGlvblN0YXRlID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvaWNlQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3RWb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IC0xOwotCi0gICAgcHJpdmF0ZSBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBBY21OYXRpdmVJbnRlcmZhY2UgbUFjbU5hdGl2ZUludGVyZmFjZTsKLSAgICBwcml2YXRlIEJsdWV0b290aEdhdHQgbUJsdWV0b290aEdhdHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKLSAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtR3JvdXBBZGRyZXNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXNpY1BsYXlpbmcgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVm9pY2VQbGF5aW5nID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBWY3BDb250cm9sbGVyIG1WY3BDb250cm9sbGVyOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgbU11c2ljQ29kZWNTdGF0dXM7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhDb2RlY1N0YXR1cyBtVm9pY2VDb2RlY1N0YXR1czsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX1VOS05PV04gPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9UWVBFX01VU0lDID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVFlQRV9WT0lDRSA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UgPSAzOwotCi0gICAgcHJpdmF0ZSBpbnQgbUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID0gQ09OVEVYVF9UWVBFX1VOS05PV047Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRDb250ZXh0VHlwZSA9IENPTlRFWFRfVFlQRV9VTktOT1dOOwotICAgIHByaXZhdGUgaW50IG1Qcm9maWxlVHlwZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZWZlcnJlZENvbnRleHQgPSBDT05URVhUX1RZUEVfVU5LTk9XTjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBJc0Rpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gSXNSZWNvbmZpZ1JlcXVlc3RlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IG1Dc2lwQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EZXZpY2VMb2NrZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNzaXBMb2NrUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RldmljZVdoaXRlbGlzdGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldElkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQWNtTVRVQ2hhbmdlUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkX3N0YXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNVcGRhdGVQcm9mRGlzQ29ubmVjdGlvbiA9IGZhbHNlOwotCi0gICAgQWNtU3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UsIEFjbVNlcnZpY2UgYWNtU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgIEFjbU5hdGl2ZUludGVyZmFjZSBhY21OYXRpdmVJbnRlcmZhY2UsIExvb3BlciBsb29wZXIpIHsKLSAgICAgICAgc3VwZXIoVEFHLCBsb29wZXIpOwotICAgICAgICBzZXREYmcoREJHKTsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgbUFjbVNlcnZpY2UgPSBhY21TZXJ2aWNlOwotICAgICAgICBtQWNtTmF0aXZlSW50ZXJmYWNlID0gYWNtTmF0aXZlSW50ZXJmYWNlOwotCi0gICAgICAgIG1EaXNjb25uZWN0ZWQgPSBuZXcgRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgIG1Db25uZWN0aW5nID0gbmV3IENvbm5lY3RpbmcoKTsKLSAgICAgICAgbURpc2Nvbm5lY3RpbmcgPSBuZXcgRGlzY29ubmVjdGluZygpOwotICAgICAgICBtQ29ubmVjdGVkID0gbmV3IENvbm5lY3RlZCgpOwotICAgICAgICBtU3RyZWFtaW5nID0gbmV3IFN0cmVhbWluZygpOwotCi0gICAgICAgIGFkZFN0YXRlKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICBhZGRTdGF0ZShtQ29ubmVjdGluZyk7Ci0gICAgICAgIGFkZFN0YXRlKG1EaXNjb25uZWN0aW5nKTsKLSAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RlZCk7Ci0gICAgICAgIGFkZFN0YXRlKG1TdHJlYW1pbmcpOwotCi0gICAgICAgIG1DdXJyZW50Q29udGV4dFR5cGUgPSBDT05URVhUX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgbURldmljZUxvY2tlZCA9IGZhbHNlOwotICAgICAgICBJc0Rpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgSXNSZWNvbmZpZ1JlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICBtSXNEZXZpY2VXaGl0ZWxpc3RlZCA9IGZhbHNlOwotICAgICAgICBzZXRJbml0aWFsU3RhdGUobURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgIG1TZXRJZCA9IC0xOwotICAgICAgICBjYWNoZWRfc3RhdGUgPSAtMTsKLSAgICAgICAgbUFjbU1UVUNoYW5nZVJlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICBtSXNVcGRhdGVQcm9mRGlzQ29ubmVjdGlvbiA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJkaXNjb25uZWN0IGdhdHQiKTsKLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmNsb3NlKCk7Ci0gICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgQWNtU3RhdGVNYWNoaW5lIG1ha2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgQWNtU2VydmljZSBhY21TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjbU5hdGl2ZUludGVyZmFjZSBhY21OYXRpdmVJbnRlcmZhY2UsIExvb3BlciBsb29wZXIpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAibWFrZSBhY20gZm9yIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgQWNtU3RhdGVNYWNoaW5lIGFjbVNtID0gbmV3IEFjbVN0YXRlTWFjaGluZShkZXZpY2UsIGFjbVNlcnZpY2UsIGFjbU5hdGl2ZUludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wZXIpOwotICAgICAgICBhY21TbS5zdGFydCgpOwotICAgICAgICByZXR1cm4gYWNtU207Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9RdWl0KCkgewotICAgICAgICBsb2coImRvUXVpdCBmb3IgZGV2aWNlICIgKyBtRGV2aWNlKTsKLSAgICAgICAgaWYgKG1Jc011c2ljUGxheWluZykgewotICAgICAgICAgICAgLy8gU3RvcCBpZiBhdWRpbyBpcyBzdGlsbCBwbGF5aW5nCi0gICAgICAgICAgICBsb2coImRvUXVpdDogc3RvcHBlZCBNdXNpYyBwbGF5aW5nICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgIG1Jc011c2ljUGxheWluZyA9IGZhbHNlOwotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlcnZpY2Uub25TdHJlYW1TdGF0ZUNoYW5nZShtRGV2aWNlLCBCbHVldG9vdGhBMmRwLlNUQVRFX05PVF9QTEFZSU5HLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSXNWb2ljZVBsYXlpbmcpIHsKLSAgICAgICAgICAgIGxvZygiZG9RdWl0OiBzdG9wcGVkIHZvaWNlIHN0cmVhbWluZyAiICsgbURldmljZSk7Ci0gICAgICAgICAgICBtSXNWb2ljZVBsYXlpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uU3RyZWFtU3RhdGVDaGFuZ2UobURldmljZSwgQmx1ZXRvb3RoQTJkcC5TVEFURV9OT1RfUExBWUlORywgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgfQotICAgICAgICBxdWl0Tm93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgbG9nKCJjbGVhbnVwIGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZGlzY29ubmVjdCBnYXR0Iik7Ci0gICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5jbG9zZSgpOwotICAgICAgICAgICAgbUJsdWV0b290aEdhdHQgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhHYXR0Q2FsbGJhY2sgbUdhdHRDYWxsYmFjayA9IG5ldyBCbHVldG9vdGhHYXR0Q2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShCbHVldG9vdGhHYXR0IGdhdHQsIGludCBzdGF0dXMsIGludCBuZXdTdGF0ZSkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAib25Db25uZWN0aW9uU3RhdGVDaGFuZ2U6IFN0YXR1czogIiArIHN0YXR1cyArICIgbmV3U3RhdGU6ICIgKyBuZXdTdGF0ZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTIC8qIHx8IHN0YXR1cyA9PSAweDE2ICovKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LnJlcXVlc3RNdHUoQUNNX01BWF9CWVRFUyk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY21NVFVDaGFuZ2VSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjYWNoZWRfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFjbU1UVUNoYW5nZVJlcXVlc3RlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNtTVRVQ2hhbmdlUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkX3N0YXRlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRfc3RhdGUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG9idGFpbk1lc3NhZ2UoR0FUVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgICAgICBtLm9iaiA9IG5ld1N0YXRlOwotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBHQVRUX1BFRVJfQ09OTl9USU1FT1VUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBHQVRUX0NPTk5fRkFJTEVEX0VTVEFCTElTSEVEKSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIHRhcmdldCA9IGdhdHQuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiW0FDTV0gcmVtb3RlIHNpZGUgZGlzY29ubmVjdGlvbiwgZm9yIGRldmljZSBhZGQgaW4gQkcgV0w6ICIgK3RhcmdldCk7Ci0gICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dCA9IHRhcmdldC5jb25uZWN0R2F0dChtQWNtU2VydmljZSwgdHJ1ZSwgbUdhdHRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5UUkFOU1BPUlRfTEUsIGZhbHNlLCAoQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV8xTV9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5QSFlfTEVfMk1fTUFTSyB8IEJsdWV0b290aERldmljZS5QSFlfTEVfQ09ERURfTUFTSyksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBtSXNEZXZpY2VXaGl0ZWxpc3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQgPSBudWxsOwotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIltBQ01dIEZhaWxlZCB0byBjb25uZWN0IEdBVFQgc2VydmVyLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTXR1Q2hhbmdlZChCbHVldG9vdGhHYXR0IGdhdHQsIGludCBtdHUsIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgIGxvZygib25NdHVDaGFuZ2VkOiBtdHU6ICIgKyBtdHUgKwotICAgICAgICAgICAgICAgICIgbUFjbU1UVUNoYW5nZVJlcXVlc3RlZDogIiArIG1BY21NVFVDaGFuZ2VSZXF1ZXN0ZWQgKwotICAgICAgICAgICAgICAgICIgY2FjaGVkX3N0YXRlOiAiICsgY2FjaGVkX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChtQWNtTVRVQ2hhbmdlUmVxdWVzdGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkX3N0YXRlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG9idGFpbk1lc3NhZ2UoR0FUVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgICAgICBtLm9iaiA9IGNhY2hlZF9zdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY21NVFVDaGFuZ2VSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVkX3N0YXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIm9uTXR1Q2hhbmdlZDogUmVtb3RlIGluaXRpYXRlZCB0cmlnZ2VyIik7Ci0gICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgY2xhc3MgRGlzY29ubmVjdGVkIGV4dGVuZHMgU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0gICAgICAgICAgICAvL0Rpc2Nvbm5lY3QgdW5pY2FzdCBWQ1AgMXN0Ci0gICAgICAgICAgICBtVmNwQ29udHJvbGxlciA9IFZjcENvbnRyb2xsZXIuZ2V0VmNwQ29udHJvbGxlcigpOwotICAgICAgICAgICAgaWYgKG1WY3BDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEaXNjb25uZWN0IFZDUCBmb3IgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLmRpc2Nvbm5lY3QobURldmljZSwgQmx1ZXRvb3RoVmNwLk1PREVfVU5JQ0FTVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1WY3BDb250cm9sbGVyIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVzc2FnZSBjdXJyZW50TWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJFbnRlciBEaXNjb25uZWN0ZWQoIiArIG1EZXZpY2UgKyAiKTogIiArIChjdXJyZW50TWVzc2FnZSA9PSBudWxsID8gIm51bGwiCi0gICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZVdoYXRUb1N0cmluZyhjdXJyZW50TWVzc2FnZS53aGF0KSkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhESVNDT05ORUNUKTsKLSAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKENTSVBfTE9DS19SRUxFQVNFX1RJTUVPVVQpOwotICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoR0FUVF9DT05ORUNUSU9OX1RJTUVPVVQpOwotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAobUxhc3RNdXNpY0Nvbm5lY3Rpb25TdGF0ZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IGJyb2FkY2FzdCBkdXJpbmcgc3RhcnR1cAotICAgICAgICAgICAgICAgIGlmIChtSXNNdXNpY1BsYXlpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGlzY29ubmVjdGVkOiBzdG9wIG11c2ljIHN0cmVhbWluZzogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtSXNNdXNpY1BsYXlpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTGFzdFZvaWNlQ29ubmVjdGlvblN0YXRlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWb2ljZVBsYXlpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RlZDogc3RvcCB2b2ljZSBzdHJlYW1pbmc6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1ZvaWNlUGxheWluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHdoZW4gb25lIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIG5lZWQgdG8gdXBkYXRlIHRoZSBjaGFubmVsIG1vZGUuCi0gICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UudXBkYXRlTGVhQ2hhbm5lbE1vZGUoQmx1ZXRvb3RoQTJkcC5TVEFURV9OT1RfUExBWUlORywgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgLy9VbmxvY2ssIGRldmljZSBzdGF0ZSBjaGFuZ2VkIGZyb20gY29ubmVjdGVkIHRvIGRpc2Nvbm5lY3RlZAotCi0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1Jc1VwZGF0ZVByb2ZEaXNDb25uZWN0aW9uOiAiICsgbUlzVXBkYXRlUHJvZkRpc0Nvbm5lY3Rpb24pOwotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlLmdldEJvbmRTdGF0ZSgpID09IEJsdWV0b290aERldmljZS5CT05EX05PTkUgfHwKLSAgICAgICAgICAgICAgICAgICAgbUlzVXBkYXRlUHJvZkRpc0Nvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGV2aWNlIGlzIHVucGFpcmVkL21Jc1VwZGF0ZVByb2ZEaXNDb25uZWN0aW9uIGhhcyBiZWVuIHNldCwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHVwZGF0ZSBkaXNjb25uZWN0ZWQgdG8gQVBNIGZvciAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1VwZGF0ZVByb2ZEaXNDb25uZWN0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgbm90IGxhc3QgbWVtYmVyICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0Vm9pY2VDb25uZWN0aW9uU3RhdGUgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RWb2ljZUNvbm5lY3Rpb25TdGF0ZSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vYXNzdW1pbmcgZGlzY29ubmVjdGVkIHN0YXRlIHdlIGFyZSBtb3ZpbmcgaGVuY2UgdXBkYXRlIEFjbURldmljZSBoYXNoIG1hcAotICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5oYW5kbGVBY21EZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlLCBtQ29ubmVjdGlvblN0YXRlLCBtU2V0SWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobURldmljZUxvY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBY2Nlc3MgUkVMRUFTRUQgZm9yIGRldmljZSAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlcnMuYWRkKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLnNldExvY2sobVNldElkLCBtZW1iZXJzLCBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLlVOTE9DSyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Dc2lwQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBhY2Nlc3MgaXMgYWxyZWFkeSBSRUxFQVNFRCwgR28gZm9yIERldmljZUdyb3VwIERpc2Nvbm5lY3QgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLmRpc2Nvbm5lY3RDc2lwKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsICYmICFtSXNEZXZpY2VXaGl0ZWxpc3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlIG90aGVyIGRldmljZXMgZnJvbSBCRyBXTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UucmVtb3ZlUGVlcnNGcm9tQmdXbChtRGV2aWNlLCBtU2V0SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiR28gZm9yIEdBVFQgRGlzY29ubmVjdCAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtQmx1ZXRvb3RoR2F0dCBpcyBOVUxMIG9yIGRldmljZSBpcyBpbiBCRyBXTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIG5vdCBsYXN0IG1lbWJlciAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0Vm9pY2VDb25uZWN0aW9uU3RhdGUgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUlzRGV2aWNlV2hpdGVsaXN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UucmVtb3ZlUGVlcnNGcm9tQmdXbChtRGV2aWNlLCBtU2V0SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmUgb3RoZXIgZGV2aWNlcyBmcm9tIEJHIFdMIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFZvaWNlQ29ubmVjdGlvblN0YXRlICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYXNzdW1pbmcgZGlzY29ubmVjdGVkIHN0YXRlIHdlIGFyZSBtb3ZpbmcgaGVuY2UgdXBkYXRlIEFjbURldmljZSBoYXNoIG1hcAotICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuaGFuZGxlQWNtRGV2aWNlU3RhdGVDaGFuZ2UobURldmljZSwgbUNvbm5lY3Rpb25TdGF0ZSwgbVNldElkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgTWVzc2FnZSBjdXJyZW50TWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBsb2coIkV4aXQgRGlzY29ubmVjdGVkKCIgKyBtRGV2aWNlICsgIik6ICIgKyAoY3VycmVudE1lc3NhZ2UgPT0gbnVsbCA/ICJudWxsIgotICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VXaGF0VG9TdHJpbmcoY3VycmVudE1lc3NhZ2Uud2hhdCkpKTsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIG1MYXN0TXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIG1MYXN0Vm9pY2VDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIGxvZygiRGlzY29ubmVjdGVkIHByb2Nlc3MgbWVzc2FnZSgiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDb250ZXh0VHlwZSA9IG1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgbVByb2ZpbGVUeXBlID0gbWVzc2FnZS5hcmcyOwotICAgICAgICAgICAgICAgICAgICBtUHJlZmVycmVkQ29udGV4dCA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNvbm5lY3RpbmcgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUN1cnJlbnRDb250ZXh0VHlwZSkgKyAiIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLklzTG9ja1N1cHBvcnRBdmFpbGFibGUobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4Y2x1c2l2ZSBBY2Nlc3Mgc3VwcG9ydCBhdmFpbGFibGUsIGdvIGZvciBHQVRUIGNvbm5lY3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbG9jayBzdXBwb3J0IGF2YWlsYWJsZSB0aGVuIGdvIGZvciBDU0lQIGNvbm5lY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0ID0gbURldmljZS5jb25uZWN0R2F0dChtQWNtU2VydmljZSwgZmFsc2UsIG1HYXR0Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5UUkFOU1BPUlRfTEUsIGZhbHNlLCAoQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV8xTV9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV8yTV9NQVNLIHwgQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV9DT0RFRF9NQVNLKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChHQVRUX0NPTk5FQ1RJT05fVElNRU9VVCwgR0FUVF9DT05ORUNUSU9OX1RJTUVPVVRfTVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyBzdXBwb3J0IG5vdCBhdmFpbGFibGUsIGdvIGZvciBHQVRUIGNvbm5lY3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0ID0gbURldmljZS5jb25uZWN0R2F0dChtQWNtU2VydmljZSwgZmFsc2UsIG1HYXR0Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5UUkFOU1BPUlRfTEUsIGZhbHNlLCAoQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV8xTV9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV8yTV9NQVNLIHwgQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV9DT0RFRF9NQVNLKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChHQVRUX0NPTk5FQ1RJT05fVElNRU9VVCwgR0FUVF9DT05ORUNUSU9OX1RJTUVPVVRfTVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYgKCFtQWNtTmF0aXZlSW50ZXJmYWNlLmNvbm5lY3RBY20obURldmljZSwgbWVzc2FnZS5hcmcxLCBtZXNzYWdlLmFyZzIsIChpbnQpbWVzc2FnZS5vYmopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZyk7Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEdBVFRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOiB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKEdBVFRfQ09OTkVDVElPTl9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0ID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0ID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJHQVRUIERpc2Nvbm5lY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUlzRGV2aWNlV2hpdGVsaXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgbm90IGxhc3QgbWVtYmVyICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCBNRURJQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRDb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCBub3QgbGFzdCBtZW1iZXIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJMYXN0IG1lbWJlciB0byBkaXNjb25uZWN0IFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIG5vdCBsYXN0IG1lbWJlciAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhc3QgbWVtYmVyIHRvIGRpc2Nvbm5lY3QgTUVESUErVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYXNzdW1pbmcgZGlzY29ubmV0ZWQgc3RhdGUgd2UgYXJlIG1vdmluZyBoZW5jZSB1cGRhdGUgQWNtRGV2aWNlIGhhc2ggbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5oYW5kbGVBY21EZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgbVNldElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0RldmljZVdoaXRlbGlzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJHQVRUIGNvbm5lY3RlZCBmcm9tIGJhY2tncm91bmQsIGdvIGZvciBwcm9maWxlIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZSA9IEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkYXB0ZXJTZXJ2aWNlICE9IG51bGwgJiYgIW1BZGFwdGVyU2VydmljZS5jb25uZWN0QWxsRW5hYmxlZFByb2ZpbGVzKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY29ubmVjdGVkOiBESVNDT05ORUNUIGlnbm9yZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEdBVFRfQ09OTkVDVElPTl9USU1FT1VUOiB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkdBVFQgY29ubmVjdGlvbiBUaW1lb3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgQ1NJUF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2lwQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQ1NJUF9MT0NLX1NUQVRVU19SRUxFQVNFRDogewotICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgLy9kaXNjb25uZWN0IENTSVAKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gKGludCltZXNzYWdlLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4Y2x1c2l2ZSBBY2Nlc3Mgc3RhdGUgY2hhbmdlZDoiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5VTkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3NpcENvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5kaXNjb25uZWN0Q3NpcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3NpcExvY2tSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZUxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQUNLX0VWRU5UOgotICAgICAgICAgICAgICAgICAgICBBY21TdGFja0V2ZW50IGV2ZW50ID0gKEFjbVN0YWNrRXZlbnQpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIkRpc2Nvbm5lY3RlZDogc3RhY2sgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoZXZlbnQuZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJEZXZpY2UoIiArIG1EZXZpY2UgKyAiKTogZXZlbnQgbWlzbWF0Y2g6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChldmVudC52YWx1ZUludDEsIGV2ZW50LnZhbHVlSW50Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT0RFQ19DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29kZWNDb25maWdFdmVudChldmVudC5jb2RlY1N0YXR1cywgZXZlbnQudmFsdWVJbnQyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIERpc2Nvbm5lY3RlZCBzdGF0ZQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChpbnQgc3RhdGUsIGludCBjb250ZXh0VHlwZSkgewotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JlIEFDTSBESVNDT05ORUNURUQgZXZlbnQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzp7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWplY3QgdGhlIGNvbm5lY3Rpb24gYW5kIHN0YXkgaW4gRGlzY29ubmVjdGVkIHN0YXRlIGl0c2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW5jb21pbmcgQTJEUCBDb25uZWN0aW5nIHJlcXVlc3QgcmVqZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY21OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdEFjbShtRGV2aWNlLCBjb250ZXh0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOiB7Ly9TaG91bGRuJ3QgY29tZQotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBQ00gQ29ubmVjdGVkIGZyb20gRGlzY29ubmVjdGVkIHN0YXRlOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc3RheSBpbiBEaXNjb25uZWN0ZWQgc3RhdGUgaXRzZWxmCi0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkluY29taW5nIEFDTSBDb25uZWN0ZWQgcmVxdWVzdCByZWplY3RlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQWNtTmF0aXZlSW50ZXJmYWNlLmRpc2Nvbm5lY3RBY20obURldmljZSwgY29udGV4dFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSBBQ00gRElTQ09OTkVDVElORyBldmVudDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbmNvcnJlY3Qgc3RhdGU6ICIgKyBzdGF0ZSArICIgZGV2aWNlOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgY2xhc3MgQ29ubmVjdGluZyBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgLy9Db25uZWN0IHVuaWNhc3QgVkNQIDFzdAotICAgICAgICAgICAgbVZjcENvbnRyb2xsZXIgPSBWY3BDb250cm9sbGVyLmdldFZjcENvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIGlmIChtVmNwQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29ubmVjdCBWQ1AgZm9yICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICBtVmNwQ29udHJvbGxlci5jb25uZWN0KG1EZXZpY2UsIEJsdWV0b290aFZjcC5NT0RFX1VOSUNBU1QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtVmNwQ29udHJvbGxlciBpcyBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lc3NhZ2UgY3VycmVudE1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW50ZXIgQ29ubmVjdGluZygiICsgbURldmljZSArICIpOiAiICsgKGN1cnJlbnRNZXNzYWdlID09IG51bGwgPyAibnVsbCIKLSAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlV2hhdFRvU3RyaW5nKGN1cnJlbnRNZXNzYWdlLndoYXQpKSk7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ09OTkVDVF9USU1FT1VULCBzQ29ubmVjdFRpbWVvdXRNcyk7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgIC8vdGhpcyBjb250ZXh0IHR5cGUgaGVyZSBpcyBnbG9iYWwgY29udGV4dCB0eXBlLCBpZiBub3QgYmFzZWQgb24gY3VycmVudAotICAgICAgICAgICAgLy9hbmQgcHJldiBzdGF0ZXMgcGVyIGNvbnRleHQsIGZvcm0gdGhpcyBjb250ZXh0VHlwZSBoZXJlCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNldElkID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5nZXRDc2lwU2V0SWQobURldmljZSwgbnVsbCAvKkFDTV9VVUlEKi8pOyAvL1RPRE86IFVVSUQgd2hhdCB0byBzZXQgPwotICAgICAgICAgICAgbUdyb3VwQWRkcmVzcyA9IG1BY21TZXJ2aWNlLmdldEdyb3VwKG1EZXZpY2UpOwotICAgICAgICAgICAgTG9nLmQoVEFHLCAiR3JvdXAgYmQgYWRkcmVzcyAgIiArIG1Hcm91cEFkZHJlc3MpOwotICAgICAgICAgICAgbUFjbVNlcnZpY2UuaGFuZGxlQWNtRGV2aWNlU3RhdGVDaGFuZ2UobURldmljZSwgbUNvbm5lY3Rpb25TdGF0ZSwgbVNldElkKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICBtTXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgbm90IGZpcnN0IG1lbWJlciAiKTsKLSAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpcnN0IG1lbWJlciBvZiBncm91cCB0byBjb25uZWN0IE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgICBtVm9pY2VDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgbm90IGZpcnN0IG1lbWJlciAiKTsKLSAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpcnN0IG1lbWJlciBvZiBncm91cCB0byBjb25uZWN0IFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICAgICAgICBtTXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCBub3QgZmlyc3QgbWVtYmVyICIpOwotICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlyc3QgbWVtYmVyIG9mIGdyb3VwIHRvIGNvbm5lY3QgTVVTSUMgJiBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGxvZygiRXhpdCBDb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIgKyAoY3VycmVudE1lc3NhZ2UgPT0gbnVsbCA/ICJudWxsIgotICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VXaGF0VG9TdHJpbmcoY3VycmVudE1lc3NhZ2Uud2hhdCkpKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICBtTGFzdE11c2ljQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgICBtTGFzdFZvaWNlQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudENvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICAgICAgICBtTGFzdE11c2ljQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgICBtTGFzdFZvaWNlQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoQ09OTkVDVF9USU1FT1VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIGxvZygiQ29ubmVjdGluZyBwcm9jZXNzIG1lc3NhZ2UoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcobWVzc2FnZS53aGF0KSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7IC8vIERvIHdlIG5lZWQgdG8gZGVmZXIgdGhpcyA/IEl0IHNob3VsZG4ndCBoYXZlIGNvbWUuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9USU1FT1VUOiB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RpbmcgY29ubmVjdGlvbiB0aW1lb3V0OiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgQ1NJUCBpcyBjb25uZWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Dc2lwQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5kaXNjb25uZWN0Q3NpcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0QWNtKG1EZXZpY2UsIG1DdXJyZW50Q29udGV4dFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBBY21TdGFja0V2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWNtU3RhY2tFdmVudChBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZGV2aWNlID0gbURldmljZTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWVJbnQxID0gQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWVJbnQyID0gbUN1cnJlbnRDb250ZXh0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoU1RBQ0tfRVZFTlQsIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDogewotICAgICAgICAgICAgICAgICAgICAvLyBDYW5jZWwgY29ubmVjdGlvbiwgc2hvdWxkbid0IGNvbWUKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBkaXNjb25uZWN0IGlzIGZvciBpbmRpdmlkdWFsIGNvbnRleHQgdHlwZQotICAgICAgICAgICAgICAgICAgICBJU3RhdGUgc3RhdGUgPSBtRGlzY29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDb25uZWN0aW5nOiBjb25uZWN0aW9uIGNhbmNlbGVkIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0QWNtKG1EZXZpY2UsIG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobU11c2ljQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChtVm9pY2VDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCAhPSBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9ubHkgMS8yIGNvbnRleHRzIGFyZSBiZWluZyBkaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluIGluIGNvbm5lY3Rpbmcgc3RhdGUgYnV0IGJyb2FkY2FzdCB0aGUgY29ubmVjdGlvbiBzdGF0ZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBtQ29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kaXNjb25uZWN0IGlzIGZvciBib3RoIGNvbnRleHQgdHlwZSB0aGVuIGRpc2Nvbm5lY3QgQ1NJUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3NpcENvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5kaXNjb25uZWN0Q3NpcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVHJhbnNpdGlvbkNvbnRleHRTdGF0ZShtQ29ubmVjdGluZywgbURpc2Nvbm5lY3RlZCwgbUNvbnRleHRUeXBlVG9EaXNjb25uZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBtQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCA9PSBDT05URVhUX1RZUEVfTVVTSUMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID09IENPTlRFWFRfVFlQRV9WT0lDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8oc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgR0FUVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoR0FUVF9DT05ORUNUSU9OX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3QgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3QgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0RldmljZVdoaXRlbGlzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJHQVRUIGNvbm5lY3RlZCwgZ28gZm9yIGNvbm5lY3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5jb25uZWN0QWNtKG1EZXZpY2UsIG1DdXJyZW50Q29udGV4dFR5cGUsIG1Qcm9maWxlVHlwZSwgbVByZWZlcnJlZENvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdCA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiR0FUVCBEaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0RldmljZVdoaXRlbGlzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKmlmIChzdCA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiR0FUVCBjb25uZWN0ZWQsIGdvIGZvciBEZXZpY2VHcm91cCBjb25uZWN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLmNvbm5lY3RDc2lwKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJHQVRUIERpc2Nvbm5lY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEdBVFRfQ09OTkVDVElPTl9USU1FT1VUOiB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkdBVFQgY29ubmVjdGlvbiBUaW1lb3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUGVlciBkZXZpY2UgaXMgY29ubmVjdGVkLCBhZGQgdG8gQkcgV0wiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0RldmljZVdoaXRlbGlzdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0ID0gbURldmljZS5jb25uZWN0R2F0dChtQWNtU2VydmljZSwgdHJ1ZSwgbUdhdHRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLlRSQU5TUE9SVF9MRSwgZmFsc2UsIChCbHVldG9vdGhEZXZpY2UuUEhZX0xFXzFNX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuUEhZX0xFXzJNX01BU0sgfCBCbHVldG9vdGhEZXZpY2UuUEhZX0xFX0NPREVEX01BU0spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm8gbWVtYmVyIGlzIGluIGNvbm5lY3RlZCBzdGF0ZSwgZG8gbm90IGFkZCBpbiBCRyBXTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUlzRGV2aWNlV2hpdGVsaXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdCBnYXR0IGFuZCBtYWtlIGdhdHQgaW5zdGFuY2UgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENTSVBfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOiB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGV2aWNlR3JvdXAgQ29ubmVjdGVkIHRvICAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3NpcENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldElkID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5nZXRDc2lwU2V0SWQobURldmljZSwgbnVsbCAvKkFDTV9VVUlEKi8pOyAvL1RPRE86IFVVSUQgd2hhdCB0byBzZXQgPwotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8Qmx1ZXRvb3RoRGV2aWNlPiBpID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5nZXRTZXRNZW1iZXJzKG1TZXRJZCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmdldENzaXBDb25uZWN0aW9uU3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0bG9ja3ZhbHVlIHRha2VzIGRldmljZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3NpcExvY2tSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5zZXRMb2NrKG1TZXRJZCwgbWVtYmVycywgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5MT0NLKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRldmljZUdyb3VwIENvbm5lY3Rpb24gZmFpbGVkIHRvICAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3NpcENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNzaXBMb2NrUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfU1RBVFVTX0xPQ0tFRDogewotICAgICAgICAgICAgICAgICAgICBtQ3NpcExvY2tSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gKGludCltZXNzYWdlLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4Y2x1c2l2ZSBBY2Nlc3Mgc3RhdGUgY2hhbmdlZDoiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2V0SWQgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3QgPSBtQWNtU2VydmljZS5nZXRDc2lwQ29ubmVjdGlvblN0YXRlKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKG1EZXZpY2VMb2NrZWQgJiYgc3QgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEZXZpY2UgYWNjZXNzIGlzIGFscmVhZHkgZ3JhbnRlZCBhbmQgRGV2aWNlR3JvdXAgaXMgaW4gY29ubmVjdGVkIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5MT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5jb25uZWN0QWNtKG1EZXZpY2UsIG1DdXJyZW50Q29udGV4dFR5cGUsIG1Qcm9maWxlVHlwZSwgbVByZWZlcnJlZENvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLmRpc2Nvbm5lY3RDc2lwKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2x1c2l2ZSBBY2Nlc3MgZmFpbGVkIHRvICIgKyBzZXRJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfU1RBVFVTX1BBUlRJQUxfTE9DSzogewotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHJlcXVlc3RlZCBsb2NrIGlzIGZyb20gdGhpcyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Dc2lwTG9ja1JlcXVlc3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gKGludCltZXNzYWdlLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFeGNsdXNpdmUgQWNjZXNzIHN0YXRlIGNoYW5nZWQ6IiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3QgPSBtQWNtU2VydmljZS5nZXRDc2lwQ29ubmVjdGlvblN0YXRlKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VMb2NrZWQgJiYgc3QgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEZXZpY2UgYWNjZXNzIGlzIGFscmVhZHkgZ3JhbnRlZCBhbmQgRGV2aWNlR3JvdXAgaXMgaW4gY29ubmVjdGVkIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5MT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZUxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWNtTmF0aXZlSW50ZXJmYWNlLmNvbm5lY3RBY20obURldmljZSwgbUN1cnJlbnRDb250ZXh0VHlwZSwgbVByb2ZpbGVUeXBlLCBtUHJlZmVycmVkQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5kaXNjb25uZWN0Q3NpcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJFeGNsdXNpdmUgQWNjZXNzIGZhaWxlZCB0byAiICsgc2V0SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2lwTG9ja1JlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2NrIGlzIG5vdCByZXF1ZXN0ZWQgZnJvbSB0aGlzIGRldmljZSBUT0RPOiBjaGVjayBpZgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyBpcyBub3QgcmVxdWVzdGVkIGZyb20gdGhpcyBkZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGxvY2sgcmVsZWFzZSBpbmRpdmlkdWFsID8KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyB0aW1lb3V0IHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IHNldCA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLnNldExvY2sobVNldElkLCBzZXQsIG1BY21TZXJ2aWNlLmdldENzaXBNYW5hZ2VyKCkuVU5MT0NLKTsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZUxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQ1NJUF9MT0NLX1NUQVRVU19ERU5JRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vbG9jayBkZW5pZWQgZmFpbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRldmljZUdyb3VwIENvbm5lY3Rpb24gZmFpbGVkIHRvICAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Dc2lwTG9ja1JlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfU1RBVFVTX1JFTEVBU0VEOgotICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgbUNzaXBMb2NrUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQUNLX0VWRU5UOgotICAgICAgICAgICAgICAgICAgICBBY21TdGFja0V2ZW50IGV2ZW50ID0gKEFjbVN0YWNrRXZlbnQpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIkNvbm5lY3Rpbmc6IHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRGV2aWNlKCIgKyBtRGV2aWNlICsgIik6IGV2ZW50IG1pc21hdGNoOiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoZXZlbnQudmFsdWVJbnQxLCBldmVudC52YWx1ZUludDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvZGVjQ29uZmlnRXZlbnQoZXZlbnQuY29kZWNTdGF0dXMsIGV2ZW50LnZhbHVlSW50Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuRVZFTlRfVFlQRV9BVURJT19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb25uZWN0aW5nOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIENvbm5lY3Rpbmcgc3RhdGUKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoaW50IHN0YXRlLCBpbnQgY29udGV4dFR5cGUpIHsKLSAgICAgICAgICAgIElTdGF0ZSBzbVN0YXRlOwotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOiB7Ci0gICAgICAgICAgICAgICAgICAgIHNtU3RhdGUgPSBtRGlzY29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0aW5nIGRldmljZSBkaXNjb25uZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtTXVzaWNDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dFR5cGUgIT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvbmx5IDEvMiBjb250ZXh0cyBhcmUgYmVpbmcgZGlzY29ubmVjdGVkLCByZW1haW4gaW4gY29ubmVjdGluZyBzdGF0ZSBidXQgYnJvYWRjYXN0IHRoZSBjb25uZWN0aW9uIHN0YXRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbVN0YXRlID0gbUNvbm5lY3Rpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyYW5zaXRpb25Db250ZXh0U3RhdGUobUNvbm5lY3RpbmcsIG1EaXNjb25uZWN0ZWQsIGNvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNtU3RhdGUgPT0gbUNvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGaXJzdCBtZW1iZXIgb2YgZ3JvdXAgdG8gY29ubmVjdCBNVVNJQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpcnN0IG1lbWJlciBvZiBncm91cCB0byBjb25uZWN0IFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhzbVN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgbG9jayByZWxlYXNlIHRpbWVyICBUT0RPOndoZW4gQ1NJUCBzdXBwb3J0IGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAvL3NlbmRNZXNzYWdlRGVsYXllZChDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VULCBzQ3NpcExvY2tSZWxlYXNlVGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgTVVTSUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZpcnN0IG1lbWJlciBvZiBncm91cCB0byBjb25uZWN0IE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVm9pY2VDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIHVwZGF0ZSBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlyc3QgbWVtYmVyIG9mIGdyb3VwIHRvIGNvbm5lY3QgVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgLSBwcm9iYWJseSBhbiBldmVudCB0aGF0IHRoZSBvdXRnb2luZyBjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzogewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0aW5nIGRldmljZSBkaXNjb25uZWN0aW5nOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkluY29ycmVjdCBldmVudDogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBjbGFzcyBEaXNjb25uZWN0aW5nIGV4dGVuZHMgU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0gICAgICAgICAgICAvL0Rpc2Nvbm5lY3QgdW5pY2FzdCBWQ1AgMXN0Ci0gICAgICAgICAgICBtVmNwQ29udHJvbGxlciA9IFZjcENvbnRyb2xsZXIuZ2V0VmNwQ29udHJvbGxlcigpOwotICAgICAgICAgICAgaWYgKG1WY3BDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEaXNjb25uZWN0IFZDUCBmb3IgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLmRpc2Nvbm5lY3QobURldmljZSwgQmx1ZXRvb3RoVmNwLk1PREVfVU5JQ0FTVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1WY3BDb250cm9sbGVyIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVzc2FnZSBjdXJyZW50TWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJFbnRlciBEaXNjb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIgKyAoY3VycmVudE1lc3NhZ2UgPT0gbnVsbCA/ICJudWxsIgotICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VXaGF0VG9TdHJpbmcoY3VycmVudE1lc3NhZ2Uud2hhdCkpKTsKLSAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChDT05ORUNUX1RJTUVPVVQsIHNDb25uZWN0VGltZW91dE1zKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWNtU2VydmljZS5oYW5kbGVBY21EZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlLCBtQ29ubmVjdGlvblN0YXRlLCBtU2V0SWQpOwotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID09IENPTlRFWFRfVFlQRV9NVVNJQyAmJiBtTXVzaWNDb25uZWN0aW9uU3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgbU11c2ljQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOwotICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgTUVESUEiKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCwgdXBkYXRlIE1FRElBIik7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgdHJ1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID09IENPTlRFWFRfVFlQRV9WT0lDRSAmJiBtVm9pY2VDb25uZWN0aW9uU3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgbVZvaWNlQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOwotICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgVk9JQ0UgIik7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhc3QgbWVtYmVyIHRvIGRpc2Nvbm5lY3QsIHVwZGF0ZSBWT0lDRSIpOwotICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHRydWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCA9PSBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UgJiYgbU11c2ljQ29ubmVjdGlvblN0YXRlICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICAgICYmIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBtTXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIE1FRElBK1ZPSUNFIik7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJMYXN0IG1lbWJlciB0byBkaXNjb25uZWN0LCB1cGRhdGUgTUVESUErVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGxvZygiRXhpdCBEaXNjb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIgKyAoY3VycmVudE1lc3NhZ2UgPT0gbnVsbCA/ICJudWxsIgotICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VXaGF0VG9TdHJpbmcoY3VycmVudE1lc3NhZ2Uud2hhdCkpKTsKLSAgICAgICAgICAgIG1MYXN0Q29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOwotICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoQ09OTkVDVF9USU1FT1VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIGxvZygiRGlzY29ubmVjdGluZyBwcm9jZXNzIG1lc3NhZ2UoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcobWVzc2FnZS53aGF0KSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9USU1FT1VUOiB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2Nvbm5lY3RpbmcgY29ubmVjdGlvbiB0aW1lb3V0OiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY21OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdEFjbShtRGV2aWNlLCBtQ3VycmVudENvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgQWNtU3RhY2tFdmVudCBldmVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjbVN0YWNrRXZlbnQoQWNtU3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmRldmljZSA9IG1EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlSW50MSA9IEFjbVN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlSW50MiA9IG1DdXJyZW50Q29udGV4dFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFNUQUNLX0VWRU5ULCBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBHQVRUX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQUNLX0VWRU5UOgotICAgICAgICAgICAgICAgICAgICBBY21TdGFja0V2ZW50IGV2ZW50ID0gKEFjbVN0YWNrRXZlbnQpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIkRpc2Nvbm5lY3Rpbmc6IHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRGV2aWNlKCIgKyBtRGV2aWNlICsgIik6IGV2ZW50IG1pc21hdGNoOiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoZXZlbnQudmFsdWVJbnQxLCBldmVudC52YWx1ZUludDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvZGVjQ29uZmlnRXZlbnQoZXZlbnQuY29kZWNTdGF0dXMsIGV2ZW50LnZhbHVlSW50Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuRVZFTlRfVFlQRV9BVURJT19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEaXNjb25uZWN0aW5nOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW4gRGlzY29ubmVjdGluZyBzdGF0ZQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChpbnQgZXZlbnQsIGludCBjb250ZXh0VHlwZSkgewotICAgICAgICAgICAgSVN0YXRlIHNtU3RhdGU7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY29ubmVjdGluZyBkZXZpY2UgZGlzY29ubmVjdGVkICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyYW5zaXRpb25Db250ZXh0U3RhdGUobURpc2Nvbm5lY3RpbmcsIG1EaXNjb25uZWN0ZWQsIGNvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJMYXN0IG1lbWJlciB0byBkaXNjb25uZWN0LCB1cGRhdGUgVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobU11c2ljQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtVm9pY2VDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPOnNlbmRNZXNzYWdlRGVsYXllZChDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VULCBzQ3NpcExvY2tSZWxlYXNlVGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVqZWN0IHRoZSBjb25uZWN0aW9uIGFuZCBzdGF5IGluIERpc2Nvbm5lY3Rpbmcgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW5jb21pbmcgQUNNIENvbm5lY3RlZCByZXF1ZXN0IHJlamVjdGVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY21OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdEFjbShtRGV2aWNlLCBjb250ZXh0VHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpCi0gICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkcsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HLCBDT05URVhUX1RZUEVfVk9JQ0UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkcsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORywgQ09OVEVYVF9UWVBFX1ZPSUNFLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVXBkYXRpbmcgZGlzY29ubmVjdGluZyBzdGF0ZSB0byBBUE0gIiArIG1EZXZpY2UgKyAiY29udGV4dFR5cGUgIiArIGNvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgSXNEaXNjb25uZWN0UmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RpbmcsIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW5jb3JyZWN0IGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIENvbm5lY3RlZCBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgTWVzc2FnZSBjdXJyZW50TWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJFbnRlciBDb25uZWN0ZWQoIiArIG1EZXZpY2UgKyAiKTogIiArIChjdXJyZW50TWVzc2FnZSA9PSBudWxsID8gIm51bGwiCi0gICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZVdoYXRUb1N0cmluZyhjdXJyZW50TWVzc2FnZS53aGF0KSkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUFjbVNlcnZpY2UuaGFuZGxlQWNtRGV2aWNlU3RhdGVDaGFuZ2UobURldmljZSwgbUNvbm5lY3Rpb25TdGF0ZSwgbVNldElkKTsKLSAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgY3VycmVudE1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOwotICAgICAgICAgICAgbG9nKCJFeGl0IENvbm5lY3RlZCgiICsgbURldmljZSArICIpOiAiICsgKGN1cnJlbnRNZXNzYWdlID09IG51bGwgPyAibnVsbCIKLSAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlV2hhdFRvU3RyaW5nKGN1cnJlbnRNZXNzYWdlLndoYXQpKSk7Ci0gICAgICAgICAgICBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJDb25uZWN0ZWQgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVDogewotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IENPTlRFWFRfVFlQRV9NVVNJQyAmJiBtTXVzaWNDb25uZWN0aW9uU3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBDT05URVhUX1RZUEVfVk9JQ0UgJiYgbVZvaWNlQ29ubmVjdGlvblN0YXRlICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFICYmIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENvbnRleHRUeXBlICs9IG1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAibUN1cnJlbnRDb250ZXh0VHlwZSBub3cgaXMgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUN1cnJlbnRDb250ZXh0VHlwZSkpOwotICAgICAgICAgICAgICAgICAgICBtUHJvZmlsZVR5cGUgPSBtZXNzYWdlLmFyZzI7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVmZXJyZWRDb250ZXh0ID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29ubmVjdGluZyAiICsgY29udGV4dFR5cGVUb1N0cmluZyhtZXNzYWdlLmFyZzEpICsgIiB0byAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5Jc0xvY2tTdXBwb3J0QXZhaWxhYmxlKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFeGNsdXNpdmUgQWNjZXNzIHN1cHBvcnQgYXZhaWxhYmxlLCBnYXR0IHNob3VsZCBhbHJlYWR5IGJlIGNvbm5lY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBsb2NrIHN1cHBvcnQgYXZhaWxhYmxlIHRoZW4gZ28gZm9yIENTSVAgY29ubmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgLy9tQmx1ZXRvb3RoR2F0dCA9IG1EZXZpY2UuY29ubmVjdEdhdHQobUFjbVNlcnZpY2UsIGZhbHNlLCBtR2F0dENhbGxiYWNrLCBCbHVldG9vdGhEZXZpY2UuVFJBTlNQT1JUX0xFLCA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2VEZWxheWVkKEdBVFRfQ09OTkVDVElPTl9USU1FT1VULCBHQVRUX0NPTk5FQ1RJT05fVElNRU9VVF9NUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3RyYW5zaXRpb25UbyhtQ29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2JyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyBzdXBwb3J0IG5vdCBhdmFpbGFibGUsIGdhdHQgc2hvdWxkIGFscmVhZHkgYmUgY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL21CbHVldG9vdGhHYXR0ID0gbURldmljZS5jb25uZWN0R2F0dChtQWNtU2VydmljZSwgZmFsc2UsIG1HYXR0Q2FsbGJhY2ssIEJsdWV0b290aERldmljZS5UUkFOU1BPUlRfTEUsIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9zZW5kTWVzc2FnZURlbGF5ZWQoR0FUVF9DT05ORUNUSU9OX1RJTUVPVVQsIEdBVFRfQ09OTkVDVElPTl9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuY29ubmVjdEFjbShtRGV2aWNlLCBtZXNzYWdlLmFyZzEsIG1lc3NhZ2UuYXJnMiwgKGludCltZXNzYWdlLm9iaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRpc2Nvbm5lY3RlZDogZXJyb3IgY29ubmVjdGluZyB0byAiICsgbURldmljZSArICIgcmVtYWluIGluIGNvbm5lY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDogey8vZGlzY29ubmVjdCByZXF1ZXN0IGdvZXMgaW5kaXZpZHVhbAotICAgICAgICAgICAgICAgICAgICBJc0Rpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtSXNEZXZpY2VXaGl0ZWxpc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBJU3RhdGUgc3RhdGUgPSBtRGlzY29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNjb25uZWN0ZWRfZmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGRpc2Nvbm5lY3QgaXMgZm9yIGluZGl2aWR1YWwgY29udGV4dCB0eXBlCi0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RpbmcgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0KSArICAiIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdEFjbShtRGV2aWNlLCBtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBkaXNjb25uZWN0aW5nICIgKyBjb250ZXh0VHlwZVRvU3RyaW5nKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCkgKyAgIiBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZF9mbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChtVm9pY2VDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ICE9IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb25seSAxLzIgY29udGV4dHMgYXJlIGJlaW5nIGRpc2Nvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW4gaW4gY29ubmVjdGVkIHN0YXRlIGJ1dCBicm9hZGNhc3QgdGhlIGNvbm5lY3Rpb24gc3RhdGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyYW5zaXRpb25Db250ZXh0U3RhdGUobUNvbm5lY3RlZCwgKGRpc2Nvbm5lY3RlZF9mbGFnID8gbURpc2Nvbm5lY3RlZCA6IG1EaXNjb25uZWN0aW5nKSwgbUNvbnRleHRUeXBlVG9EaXNjb25uZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IG1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIHVwZGF0ZSBNVVNJQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhc3QgbWVtYmVyIHRvIGRpc2Nvbm5lY3QsIHVwZGF0ZSBNVVNJQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIHVwZGF0ZSBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCwgdXBkYXRlIFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyptU2V0SWQgPSBtU2V0Q29vcmRpbmF0b3IuZ2V0UmVtb3RlRGV2aWNlU2V0SWQobURldmljZSwgbnVsbCk7IC8vIFRPRE86IFVVSUQgPwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLmFkZChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgLy9zZXRsb2NrdmFsdWUgdGFrZXMgZGV2aWNlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgbUNzaXBMb2NrUmVxdWVzdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZUxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtU2V0Q29vcmRpbmF0b3Iuc2V0TG9ja1ZhbHVlKG1BY21TZXJ2aWNlLm1Dc2lwQXBwSWQsIG1TZXRJZCwgbWVtYmVycywgQmx1ZXRvb3RoQ3NpcC5MT0NLKTsqLwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENTSVBfTE9DS19TVEFUVVNfTE9DS0VEOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Dc2lwTG9ja1JlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KW1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNldElkID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0ID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcENvbm5lY3Rpb25TdGF0ZShtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyBzdGF0ZSBjaGFuZ2VkOiIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzRGlzY29ubmVjdFJlcXVlc3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RpbmcgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0KSArICAiIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0QWNtKG1EZXZpY2UsIG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCkpIHsgLy8gdGhpcyBjb250ZXh0IFR5cGUgaXMgcGFzc2VkIGluIGRpc2Nvbm5lY3QgYXBpIGZyb20gQVBNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIGRpc2Nvbm5lY3RpbmcgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0KSArICAiIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElzUmVjb25maWdSZXF1ZXN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWNvbmZpZyByZXF1ZXN0ZWQgRXhjbHVzaXZlIEFjY2VzcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5DaGFuZ2VDb2RlY0NvbmZpZ1ByZWZlcmVuY2UobURldmljZSwgbVJlY29uZmlnKSkgeyAvLyB0aGlzIGNvbnRleHQgVHlwZSBpcyBwYXNzZWQgaW4gZGlzY29ubmVjdCBhcGkgZnJvbSBBUE0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVjb25maWcgZXJyb3IgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgbUNzaXBDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENTSVBfTE9DS19SRUxFQVNFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vbG9jayByZWxlYXNlIGluZGl2aWR1YWwgPwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFeGNsdXNpdmUgQWNjZXNzIHRpbWVvdXQgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5zZXRMb2NrKG1TZXRJZCwgZGV2aWNlcywgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5VTkxPQ0spOwotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfU1RBVFVTX1JFTEVBU0VEOgotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZGlzY29ubmVjdCBDU0lQCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKENTSVBfTE9DS19SRUxFQVNFX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDT0RFQ19DT05GSUdfQ0hBTkdFRDogewotICAgICAgICAgICAgICAgICAgICBJc1JlY29uZmlnUmVxdWVzdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVJlY29uZmlnID0gbUFjbVNlcnZpY2UuZ2V0QWNtTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuQ2hhbmdlQ29kZWNDb25maWdQcmVmZXJlbmNlKG1EZXZpY2UsIG1SZWNvbmZpZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlY29uZmlnIGVycm9yICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qaW50IHNldElkID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0ID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcENvbm5lY3Rpb25TdGF0ZShtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtRGV2aWNlTG9ja2VkICYmIHN0ID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGV2aWNlIGFjY2VzcyBpcyBhbHJlYWR5IGdyYW50ZWQgYW5kIERldmljZUdyb3VwIGlzIGluIGNvbm5lY3RlZCBzdGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWNtTmF0aXZlSW50ZXJmYWNlLkNoYW5nZUNvZGVjQ29uZmlnUHJlZmVyZW5jZShtRGV2aWNlLCBtUmVjb25maWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVjb25maWcgZXJyb3IgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9tU2V0SWQgPSBtU2V0Q29vcmRpbmF0b3IuZ2V0UmVtb3RlRGV2aWNlU2V0SWQobURldmljZSwgbnVsbCApOyAvL1RPRE86IFVVSUQgd2hhdCB0byBzZXQgPwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxCbHVldG9vdGhEZXZpY2U+IGkgPSBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLmdldFNldE1lbWJlcnMobVNldElkKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmdldENzaXBDb25uZWN0aW9uU3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLnNldExvY2sobVNldElkLCBtZW1iZXJzLCBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLkxPQ0spOyovCi0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfU1RSRUFNOiB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5zdGFydFN0cmVhbShtRGV2aWNlLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInN0YXJ0IHN0cmVhbSBlcnJvciAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKmludCBzZXRJZCA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdCA9IG1BY21TZXJ2aWNlLmdldENzaXBDb25uZWN0aW9uU3RhdGUobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobURldmljZUxvY2tlZCAmJiBzdCA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRldmljZSBhY2Nlc3MgaXMgYWxyZWFkeSBncmFudGVkIGFuZCBEZXZpY2VHcm91cCBpcyBpbiBjb25uZWN0ZWQgc3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5DaGFuZ2VDb2RlY0NvbmZpZ1ByZWZlcmVuY2UobURldmljZSwgbVJlY29uZmlnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlY29uZmlnIGVycm9yICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vbVNldElkID0gbVNldENvb3JkaW5hdG9yLmdldFJlbW90ZURldmljZVNldElkKG1EZXZpY2UsIG51bGwgKTsgLy9UT0RPOiBVVUlEIHdoYXQgdG8gc2V0ID8KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8Qmx1ZXRvb3RoRGV2aWNlPiBpID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5nZXRTZXRNZW1iZXJzKG1TZXRJZCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5nZXRDc2lwQ29ubmVjdGlvblN0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5zZXRMb2NrKG1TZXRJZCwgbWVtYmVycywgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5MT0NLKTsqLwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX1NUUkVBTV9SRVE6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VTdHJlYW1pbmdNdXNpYyhtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5TdGFydFN0cmVhbShtR3JvdXBBZGRyZXNzLCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU1RBQ0tfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIEFjbVN0YWNrRXZlbnQgZXZlbnQgPSAoQWNtU3RhY2tFdmVudCkgbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ29ubmVjdGVkOiBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhldmVudC5kZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkRldmljZSgiICsgbURldmljZSArICIpOiBldmVudCBtaXNtYXRjaDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGV2ZW50LnZhbHVlSW50MSwgZXZlbnQudmFsdWVJbnQyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5FVkVOVF9UWVBFX0FVRElPX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F1ZGlvU3RhdGVFdmVudChldmVudC52YWx1ZUludDEsIGV2ZW50LnZhbHVlSW50Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT0RFQ19DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29kZWNDb25maWdFdmVudChldmVudC5jb2RlY1N0YXR1cywgZXZlbnQudmFsdWVJbnQyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29ubmVjdGVkOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgR0FUVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29ubmVjdGlvbiBzdGF0ZSBhcyBkaXNjb25uZWN0ZWQgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhHQVRUX0NPTk5FQ1RJT05fVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdCA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdCA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiIEdBVFQgRGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNEZXZpY2VXaGl0ZWxpc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUlzVXBkYXRlUHJvZkRpc0Nvbm5lY3Rpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW4gQ29ubmVjdGVkIHN0YXRlCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGludCBldmVudCwgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgICAgICBJU3RhdGUgc21TdGF0ZTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ6IHsKLSAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDb250ZXh0VHlwZSAtPSBjb250ZXh0VHlwZTsKLSAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm1DdXJyZW50Q29udGV4dFR5cGUgbm93IGlzICIgKyBjb250ZXh0VHlwZVRvU3RyaW5nKG1DdXJyZW50Q29udGV4dFR5cGUpKTsKLSAgICAgICAgICAgICAgICAgIHByb2Nlc3NUcmFuc2l0aW9uQ29udGV4dFN0YXRlKG1EaXNjb25uZWN0aW5nLCBtRGlzY29ubmVjdGVkLCBjb250ZXh0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIHVwZGF0ZSBNVVNJQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhc3QgbWVtYmVyIHRvIGRpc2Nvbm5lY3QsIHVwZGF0ZSBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDogewotICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPOnNlbmRNZXNzYWdlRGVsYXllZChDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VULCBzQ3NpcExvY2tSZWxlYXNlVGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQUNNIENPTk5FQ1RFRCBldmVudCBmb3IgZGV2aWNlOiAiICsgbURldmljZSArICIgY29udGV4dCB0eXBlOiAiICsgY29udGV4dFR5cGVUb1N0cmluZyhjb250ZXh0VHlwZSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIHVwZGF0ZSBNVVNJQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlyc3QgbWVtYmVyIG9mIGdyb3VwIHRvIGNvbm5lY3QgTVVTSUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGaXJzdCBtZW1iZXIgb2YgZ3JvdXAgdG8gY29ubmVjdCBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzogewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmUgQUNNIENPTk5FQ1RFRCBldmVudDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmUgRGlzY29ubmVjdGluZyBmb3IgbWVkaWEgLSBhbHJlYWR5IGRpc2Nvbm5lY3RpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVm9pY2VDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JlIERpc2Nvbm5lY3RpbmcgZm9yIHZvaWNlIC0gYWxyZWFkeSBkaXNjb25uZWN0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbVN0YXRlID0gbURpc2Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0ZWQgZGV2aWNlIGRpc2Nvbm5lY3Rpbmc6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobU11c2ljQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVm9pY2VDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlICE9IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9ubHkgMS8yIGNvbnRleHRzIGFyZSBiZWluZyBkaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbiBpbiBjb25uZWN0aW5nIHN0YXRlIGJ1dCBicm9hZGNhc3QgdGhlIGNvbm5lY3Rpb24gc3RhdGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbVN0YXRlID0gbUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVHJhbnNpdGlvbkNvbnRleHRTdGF0ZShtQ29ubmVjdGVkLCBtRGlzY29ubmVjdGluZywgY29udGV4dFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc21TdGF0ZSA9PSBtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKHNtU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvbm5lY3Rpb24gU3RhdGUgRGV2aWNlOiAiICsgbURldmljZSArICIgYmFkIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gaW4gQ29ubmVjdGVkIHN0YXRlCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXVkaW9TdGF0ZUV2ZW50KGludCBzdGF0ZSwgIGludCBjb250ZXh0VHlwZSkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29ubmVjdGVkOiBwcm9jZXNzQXVkaW9TdGF0ZUV2ZW50OiBzdGF0ZTogIiArIHN0YXRlICsgIiBtSXNNdXNpY1BsYXlpbmc6ICIgKyBtSXNNdXNpY1BsYXlpbmcpOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5BVURJT19TVEFURV9TVEFSVEVEOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpCi0gICAgICAgICAgICAgICAgICAgICAgbUlzTXVzaWNQbGF5aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKQotICAgICAgICAgICAgICAgICAgICAgIG1Jc1ZvaWNlUGxheWluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU3RyZWFtaW5nKTsKLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5BVURJT19TVEFURV9SRU1PVEVfU1VTUEVORDoKLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQVVESU9fU1RBVEVfU1RPUFBFRDogewotICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc011c2ljUGxheWluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDb25uZWN0ZWQ6IHN0b3BwZWQgbWVkaWEgcGxheWluZzogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNNdXNpY1BsYXlpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1ZvaWNlUGxheWluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDb25uZWN0ZWQ6IHN0b3BwZWQgdm9pY2UgcGxheWluZzogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNWb2ljZVBsYXlpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJBdWRpbyBTdGF0ZSBEZXZpY2U6ICIgKyBtRGV2aWNlICsgIiBiYWQgc3RhdGU6ICIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBjbGFzcyBTdHJlYW1pbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgY3VycmVudE1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW50ZXIgU3RyZWFtaW5nKCIgKyBtRGV2aWNlICsgIik6ICIgKyAoY3VycmVudE1lc3NhZ2UgPT0gbnVsbCA/ICJudWxsIgotICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VXaGF0VG9TdHJpbmcoY3VycmVudE1lc3NhZ2Uud2hhdCkpKTsKLQotICAgICAgICAgICAgaWYgKChtTXVzaWNDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhDT05ORUNUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgaWYgKG1Jc011c2ljUGxheWluZykgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInN0YXJ0IHBsYXlpbmcgbWVkaWE6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uU3RyZWFtU3RhdGVDaGFuZ2UobURldmljZSwgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgICAgICBtQWNtU2VydmljZS51cGRhdGVMZWFDaGFubmVsTW9kZShCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkcsIG1EZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNWb2ljZVBsYXlpbmcpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJzdGFydCBwbGF5aW5nIHZvaWNlOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVELCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgICAgIHNldFZvaWNlUGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIHNldENhbGxBdWRpb09uKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGxvZygiRXhpdCBTdHJlYW1pbmcoIiArIG1EZXZpY2UgKyAiKTogIiArIChjdXJyZW50TWVzc2FnZSA9PSBudWxsID8gIm51bGwiCi0gICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZVdoYXRUb1N0cmluZyhjdXJyZW50TWVzc2FnZS53aGF0KSkpOwotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAobUlzTXVzaWNQbGF5aW5nKQotICAgICAgICAgICAgICBzZXJ2aWNlLm9uU3RyZWFtU3RhdGVDaGFuZ2UobURldmljZSwgQmx1ZXRvb3RoQTJkcC5TVEFURV9OT1RfUExBWUlORywgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChtSXNWb2ljZVBsYXlpbmcpIHsKLSAgICAgICAgICAgICAgc2VydmljZS5vblN0cmVhbVN0YXRlQ2hhbmdlKG1EZXZpY2UsIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fRElTQ09OTkVDVEVELCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgICBzZXRDYWxsQXVkaW9PbihmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNNdXNpY1BsYXlpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1Jc1ZvaWNlUGxheWluZyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJTdHJlYW1pbmcgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVDogewotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IENPTlRFWFRfVFlQRV9NVVNJQyAmJiBtTXVzaWNDb25uZWN0aW9uU3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBDT05URVhUX1RZUEVfVk9JQ0UgJiYgbVZvaWNlQ29ubmVjdGlvblN0YXRlICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFICYmIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENvbnRleHRUeXBlICs9IG1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAibUN1cnJlbnRDb250ZXh0VHlwZSBub3cgaXMgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUN1cnJlbnRDb250ZXh0VHlwZSkpOwotICAgICAgICAgICAgICAgICAgICBtUHJvZmlsZVR5cGUgPSBtZXNzYWdlLmFyZzI7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVmZXJyZWRDb250ZXh0ID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29ubmVjdGluZyAiICsgY29udGV4dFR5cGVUb1N0cmluZyhtZXNzYWdlLmFyZzEpICsgIiB0byAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5Jc0xvY2tTdXBwb3J0QXZhaWxhYmxlKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFeGNsdXNpdmUgQWNjZXNzIHN1cHBvcnQgYXZhaWxhYmxlLCBnYXR0IHNob3VsZCBhbHJlYWR5IGJlIGNvbm5lY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBsb2NrIHN1cHBvcnQgYXZhaWxhYmxlIHRoZW4gZ28gZm9yIENTSVAgY29ubmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgLy9tQmx1ZXRvb3RoR2F0dCA9IG1EZXZpY2UuY29ubmVjdEdhdHQobUFjbVNlcnZpY2UsIGZhbHNlLCBtR2F0dENhbGxiYWNrLCBCbHVldG9vdGhEZXZpY2UuVFJBTlNQT1JUX0xFLCA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2VEZWxheWVkKEdBVFRfQ09OTkVDVElPTl9USU1FT1VULCBHQVRUX0NPTk5FQ1RJT05fVElNRU9VVF9NUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3RyYW5zaXRpb25UbyhtQ29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2JyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyBzdXBwb3J0IG5vdCBhdmFpbGFibGUsIGdhdHQgc2hvdWxkIGFscmVhZHkgYmUgY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL21CbHVldG9vdGhHYXR0ID0gbURldmljZS5jb25uZWN0R2F0dChtQWNtU2VydmljZSwgZmFsc2UsIG1HYXR0Q2FsbGJhY2ssIEJsdWV0b290aERldmljZS5UUkFOU1BPUlRfTEUsIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9zZW5kTWVzc2FnZURlbGF5ZWQoR0FUVF9DT05ORUNUSU9OX1RJTUVPVVQsIEdBVFRfQ09OTkVDVElPTl9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuY29ubmVjdEFjbShtRGV2aWNlLCBtZXNzYWdlLmFyZzEsIG1lc3NhZ2UuYXJnMiwgKGludCltZXNzYWdlLm9iaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRpc2Nvbm5lY3RlZDogZXJyb3IgY29ubmVjdGluZyB0byAiICsgbURldmljZSArICIgcmVtYWluIGluIHN0cmVhbWluZyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDogey8vZGlzY29ubmVjdCByZXF1ZXN0IGdvZXMgaW5kaXZpZHVhbAotICAgICAgICAgICAgICAgICAgICBJc0Rpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtSXNEZXZpY2VXaGl0ZWxpc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBJU3RhdGUgc3RhdGUgPSBtRGlzY29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNjb25uZWN0ZWRfZmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGRpc2Nvbm5lY3QgaXMgZm9yIGluZGl2aWR1YWwgY29udGV4dCB0eXBlCi0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RpbmcgIiArIGNvbnRleHRUeXBlVG9TdHJpbmcobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0KSArICAiIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdEFjbShtRGV2aWNlLCBtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBkaXNjb25uZWN0aW5nICIgKyBjb250ZXh0VHlwZVRvU3RyaW5nKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCkgKyAgIiBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZF9mbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QgIT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvbmx5IDEvMiBjb250ZXh0cyBhcmUgYmVpbmcgZGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbiBpbiBjb25uZWN0ZWQgc3RhdGUgYnV0IGJyb2FkY2FzdCB0aGUgY29ubmVjdGlvbiBzdGF0ZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBtQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVHJhbnNpdGlvbkNvbnRleHRTdGF0ZShtQ29ubmVjdGVkLCAoZGlzY29ubmVjdGVkX2ZsYWcgPyBtRGlzY29ubmVjdGVkIDogbURpc2Nvbm5lY3RpbmcpLCBtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTGFzdCBtZW1iZXIgdG8gZGlzY29ubmVjdCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbnRleHRUeXBlVG9EaXNjb25uZWN0ID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhc3QgbWVtYmVyIHRvIGRpc2Nvbm5lY3QsIHVwZGF0ZSBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8oc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qbVNldElkID0gbVNldENvb3JkaW5hdG9yLmdldFJlbW90ZURldmljZVNldElkKG1EZXZpY2UsIG51bGwpOyAvLyBUT0RPOiBVVUlEID8KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2V0bG9ja3ZhbHVlIHRha2VzIGRldmljZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIG1Dc2lwTG9ja1JlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVNldENvb3JkaW5hdG9yLnNldExvY2tWYWx1ZShtQWNtU2VydmljZS5tQ3NpcEFwcElkLCBtU2V0SWQsIG1lbWJlcnMsIEJsdWV0b290aENzaXAuTE9DSyk7Ki8KLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfU1RBVFVTX0xPQ0tFRDogewotICAgICAgICAgICAgICAgICAgICBtQ3NpcExvY2tSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gKGludCltZXNzYWdlLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdCA9IG1BY21TZXJ2aWNlLmdldENzaXBDb25uZWN0aW9uU3RhdGUobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4Y2x1c2l2ZSBBY2Nlc3Mgc3RhdGUgY2hhbmdlZDoiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5MT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0Rpc2Nvbm5lY3RSZXF1ZXN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJEaXNjb25uZWN0aW5nICIgKyBjb250ZXh0VHlwZVRvU3RyaW5nKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCkgKyAgIiBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdEFjbShtRGV2aWNlLCBtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QpKSB7IC8vIHRoaXMgY29udGV4dCBUeXBlIGlzIHBhc3NlZCBpbiBkaXNjb25uZWN0IGFwaSBmcm9tIEFQTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBkaXNjb25uZWN0aW5nICIgKyBjb250ZXh0VHlwZVRvU3RyaW5nKG1Db250ZXh0VHlwZVRvRGlzY29ubmVjdCkgKyAgIiBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJc1JlY29uZmlnUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjb25maWcgcmVxdWVzdGVkIEV4Y2x1c2l2ZSBBY2Nlc3MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY21OYXRpdmVJbnRlcmZhY2UuQ2hhbmdlQ29kZWNDb25maWdQcmVmZXJlbmNlKG1EZXZpY2UsIG1SZWNvbmZpZykpIHsgLy8gdGhpcyBjb250ZXh0IFR5cGUgaXMgcGFzc2VkIGluIGRpc2Nvbm5lY3QgYXBpIGZyb20gQVBNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlY29uZmlnIGVycm9yICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQ1NJUF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2lwQ29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICAvL2xvY2sgcmVsZWFzZSBpbmRpdmlkdWFsID8KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhjbHVzaXZlIEFjY2VzcyB0aW1lb3V0IHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY21TZXJ2aWNlLmdldENzaXBNYW5hZ2VyKCkuc2V0TG9jayhtU2V0SWQsIGRldmljZXMsIG1BY21TZXJ2aWNlLmdldENzaXBNYW5hZ2VyKCkuVU5MT0NLKTsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZUxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQ1NJUF9MT0NLX1NUQVRVU19SRUxFQVNFRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGRpc2Nvbm5lY3QgQ1NJUAotICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZUxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQ09ERUNfQ09ORklHX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgSXNSZWNvbmZpZ1JlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNvbmZpZyA9IG1BY21TZXJ2aWNlLmdldEFjbU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWNtTmF0aXZlSW50ZXJmYWNlLkNoYW5nZUNvZGVjQ29uZmlnUHJlZmVyZW5jZShtRGV2aWNlLCBtUmVjb25maWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJyZWNvbmZpZyBlcnJvciAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKmludCBzZXRJZCA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdCA9IG1BY21TZXJ2aWNlLmdldENzaXBDb25uZWN0aW9uU3RhdGUobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobURldmljZUxvY2tlZCAmJiBzdCA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRldmljZSBpcyBhbHJlYWR5IGFjcXVpcmVkIGFuZCBEZXZpY2VHcm91cCBpcyBpbiBjb25uZWN0ZWQgc3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5DaGFuZ2VDb2RlY0NvbmZpZ1ByZWZlcmVuY2UobURldmljZSwgbVJlY29uZmlnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlY29uZmlnIGVycm9yICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vbVNldElkID0gbVNldENvb3JkaW5hdG9yLmdldFJlbW90ZURldmljZVNldElkKG1EZXZpY2UsIG51bGwpOyAvL1RPRE86IFVVSUQgd2hhdCB0byBzZXQgPwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxCbHVldG9vdGhEZXZpY2U+IGkgPSBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLmdldFNldE1lbWJlcnMoc2V0SWQpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuZ2V0Q3NpcENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnMuYWRkKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1BY21TZXJ2aWNlLmdldENzaXBNYW5hZ2VyKCkuc2V0TG9jayhzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5MT0NLKTsqLwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfU1RSRUFNOiB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUFjbU5hdGl2ZUludGVyZmFjZS5zdG9wU3RyZWFtKG1EZXZpY2UsIHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RhcnQgc3RyZWFtIGVycm9yICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qaW50IHNldElkID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0ID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcENvbm5lY3Rpb25TdGF0ZShtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtRGV2aWNlTG9ja2VkICYmIHN0ID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGV2aWNlIGFjY2VzcyBpcyBhbHJlYWR5IGdyYW50ZWQgYW5kIERldmljZUdyb3VwIGlzIGluIGNvbm5lY3RlZCBzdGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWNtTmF0aXZlSW50ZXJmYWNlLkNoYW5nZUNvZGVjQ29uZmlnUHJlZmVyZW5jZShtRGV2aWNlLCBtUmVjb25maWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVjb25maWcgZXJyb3IgIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9tU2V0SWQgPSBtU2V0Q29vcmRpbmF0b3IuZ2V0UmVtb3RlRGV2aWNlU2V0SWQobURldmljZSwgbnVsbCApOyAvL1RPRE86IFVVSUQgd2hhdCB0byBzZXQgPwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxCbHVldG9vdGhEZXZpY2U+IGkgPSBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLmdldFNldE1lbWJlcnMobVNldElkKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmdldENzaXBDb25uZWN0aW9uU3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLnNldExvY2sobVNldElkLCBtZW1iZXJzLCBtQWNtU2VydmljZS5nZXRDc2lwTWFuYWdlcigpLkxPQ0spOyovCi0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfU1RSRUFNOgotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFICYmIG1Jc011c2ljUGxheWluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG9idGFpbk1lc3NhZ2UoU1RBUlRfU1RSRUFNX1JFUSwgdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRGVmZXIgU1RBUlQgcmVxdWVzdCBmb3Igdm9pY2UgY29udGV4dCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTVEFDS19FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgQWNtU3RhY2tFdmVudCBldmVudCA9IChBY21TdGFja0V2ZW50KSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTdHJlYW1pbmc6IHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRGV2aWNlKCIgKyBtRGV2aWNlICsgIik6IGV2ZW50IG1pc21hdGNoOiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoZXZlbnQudmFsdWVJbnQxLCBldmVudC52YWx1ZUludDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkVWRU5UX1RZUEVfQVVESU9fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXVkaW9TdGF0ZUV2ZW50KGV2ZW50LnZhbHVlSW50MSwgZXZlbnQudmFsdWVJbnQyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPREVDX0NPTkZJR19DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb2RlY0NvbmZpZ0V2ZW50KGV2ZW50LmNvZGVjU3RhdHVzLCBldmVudC52YWx1ZUludDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdHJlYW1pbmc6IGlnbm9yaW5nIHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbiBTdHJlYW1pbmcgc3RhdGUKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoaW50IGV2ZW50LCBpbnQgY29udGV4dFR5cGUpIHsKLSAgICAgICAgICAgIElTdGF0ZSBzbVN0YXRlOwotICAgICAgICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDogewotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IHNlbmRNZXNzYWdlRGVsYXllZChDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VULCBzQ3NpcExvY2tSZWxlYXNlVGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU3RyZWFtaW5nIGRldmljZSBkaXNjb25uZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q29udGV4dFR5cGUgLT0gY29udGV4dFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm1DdXJyZW50Q29udGV4dFR5cGUgbm93IGlzICIgKyBjb250ZXh0VHlwZVRvU3RyaW5nKG1DdXJyZW50Q29udGV4dFR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyYW5zaXRpb25Db250ZXh0U3RhdGUobURpc2Nvbm5lY3RpbmcsIG1EaXNjb25uZWN0ZWQsIGNvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIE1VU0lDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJMYXN0IG1lbWJlciB0byBkaXNjb25uZWN0LCB1cGRhdGUgTVVTSUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29udGV4dFR5cGVUb0Rpc2Nvbm5lY3QgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNQZWVyRGV2aWNlQ29ubmVjdGVkKG1EZXZpY2UsIG1TZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGZWxsb3cgZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkLCB1cGRhdGUgVk9JQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkxhc3QgbWVtYmVyIHRvIGRpc2Nvbm5lY3QsIHVwZGF0ZSBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDogewotICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPOnNlbmRNZXNzYWdlRGVsYXllZChDU0lQX0xPQ0tfUkVMRUFTRV9USU1FT1VULCBzQ3NpcExvY2tSZWxlYXNlVGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQUNNIENPTk5FQ1RFRCBldmVudCBmb3IgZGV2aWNlOiAiICsgbURldmljZSArICIgY29udGV4dCB0eXBlOiAiICsgY29udGV4dFR5cGVUb1N0cmluZyhjb250ZXh0VHlwZSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXVzaWNDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5pc1BlZXJEZXZpY2VDb25uZWN0ZWQobURldmljZSwgbVNldElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZlbGxvdyBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQsIHVwZGF0ZSBNVVNJQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbU11c2ljQ29ubmVjdGlvblN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlyc3QgbWVtYmVyIG9mIGdyb3VwIHRvIGNvbm5lY3QgTVVTSUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKG1EZXZpY2UsIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSwgQ09OVEVYVF9UWVBFX01VU0lDLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzUGVlckRldmljZUNvbm5lY3RlZChtRGV2aWNlLCBtU2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmVsbG93IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCwgdXBkYXRlIFZPSUNFIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtVm9pY2VDb25uZWN0aW9uU3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGaXJzdCBtZW1iZXIgb2YgZ3JvdXAgdG8gY29ubmVjdCBWT0lDRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc6IHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQUNNIENPTk5FQ1RJTkcgZXZlbnQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzogewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChtTXVzaWNDb25uZWN0aW9uU3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JlIERpc2Nvbm5lY3RpbmcgZm9yIG1lZGlhIC0gYWxyZWFkeSBkaXNjb25uZWN0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVZvaWNlQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSBEaXNjb25uZWN0aW5nIGZvciB2b2ljZSAtIGFscmVhZHkgZGlzY29ubmVjdGluZyIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc21TdGF0ZSA9IG1EaXNjb25uZWN0aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGVkIGRldmljZSBkaXNjb25uZWN0aW5nOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVZvaWNlQ29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSAhPSBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvbmx5IDEvMiBjb250ZXh0cyBhcmUgYmVpbmcgZGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW4gaW4gY29ubmVjdGluZyBzdGF0ZSBidXQgYnJvYWRjYXN0IHRoZSBjb25uZWN0aW9uIHN0YXRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21TdGF0ZSA9IG1Db25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyYW5zaXRpb25Db250ZXh0U3RhdGUobUNvbm5lY3RlZCwgbURpc2Nvbm5lY3RpbmcsIGNvbnRleHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtU3RhdGUgPT0gbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShtRGV2aWNlLCBtTXVzaWNDb25uZWN0aW9uU3RhdGUsIENPTlRFWFRfVFlQRV9NVVNJQywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2UobURldmljZSwgbVZvaWNlQ29ubmVjdGlvblN0YXRlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhzbVN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb25uZWN0aW9uIFN0YXRlIERldmljZTogIiArIG1EZXZpY2UgKyAiIGJhZCBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbiBTdHJlYW1pbmcgc3RhdGUKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBdWRpb1N0YXRlRXZlbnQoaW50IHN0YXRlLCAgaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTdHJlYW1pbmc6IHByb2Nlc3NBdWRpb1N0YXRlRXZlbnQ6IHN0YXRlOiAiICsgc3RhdGUgKyAibUlzTXVzaWNQbGF5aW5nOiAiICsgbUlzTXVzaWNQbGF5aW5nKTsKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFjbVN0YWNrRXZlbnQuQVVESU9fU1RBVEVfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3RyZWFtaW5nOiBhbHJlYWR5IHN0YXJ0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBY21TdGFja0V2ZW50LkFVRElPX1NUQVRFX1JFTU9URV9TVVNQRU5EOgotICAgICAgICAgICAgICAgIGNhc2UgQWNtU3RhY2tFdmVudC5BVURJT19TVEFURV9TVE9QUEVEOgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNdXNpY1BsYXlpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3RyZWFtaW5nOiBzdG9wcGVkIG1lZGlhIHBsYXlpbmc6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzTXVzaWNQbGF5aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25TdHJlYW1TdGF0ZUNoYW5nZShtRGV2aWNlLCBCbHVldG9vdGhBMmRwLlNUQVRFX05PVF9QTEFZSU5HLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjbVNlcnZpY2UuaXNTaG9QZW5kaW5nU3RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTdHJlYW1pbmc6IFNITyB3YXMgcGVuZGluZyBlYXJsaWVyLCBjb21wbGV0ZSBub3ciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY21TZXJ2aWNlLnJlc2V0U2hvUGVuZGluZ1N0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25BY3RpdmVEZXZpY2VDaGFuZ2UobnVsbCwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzVm9pY2VQbGF5aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlN0cmVhbWluZzogc3RvcHBlZCB2b2ljZSBwbGF5aW5nOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1ZvaWNlUGxheWluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uU3RyZWFtU3RhdGVDaGFuZ2UobURldmljZSwgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19ESVNDT05ORUNURUQsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxBdWRpb09uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlLmlzVm9pY2VTaG9QZW5kaW5nU3RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJWb2ljZSBTSE8gd2FzIHBlbmRpbmcgZWFybGllciwgY29tcGxldGUgbm93Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5yZXNldFZvaWNlU2hvUGVuZGluZ1N0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25BY3RpdmVEZXZpY2VDaGFuZ2UobUFjbVNlcnZpY2UuZ2V0Vm9pY2VBY3RpdmVEZXZpY2UoKSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkF1ZGlvIFN0YXRlIERldmljZTogIiArIG1EZXZpY2UgKyAiIGJhZCBzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRGcmFtZUR1cmF0aW9uKCkgewotICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZyBtQ29kZWNDb25maWcgPSBtVm9pY2VDb2RlY1N0YXR1cy5nZXRDb2RlY0NvbmZpZygpOwotICAgICAgICBsb25nIGNzMSA9IG1Db2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMSgpID4+IDMyICYgMHhmZjsKLSAgICAgICAgaWYgKGNzMSA9PSAweDAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjcuNSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIjEwIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldExjM0Jsb2Nrc1BlclNkdSgpIHsKLSAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWcgbUNvZGVjQ29uZmlnID0gbVZvaWNlQ29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKTsKLSAgICAgICAgbG9uZyBjczEgPSBtQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzEoKSA+PiA0MCAmIDB4ZmY7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKChpbnQpY3MxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb2RlY3R5cGUoKSB7Ci0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG1Db2RlY0NvbmZpZyA9IG1Wb2ljZUNvZGVjU3RhdHVzLmdldENvZGVjQ29uZmlnKCk7Ci0gICAgICAgIGxvbmcgY3MzID0gKG1Db2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMygpID4+Ci0gICAgICAgICAgICAgICAgKENTX1BBUkFNX05VTV9CSVRTICogQ1NfUEFSQU1fMVNUX0lOREVYKSkgJiBDU19QQVJBTV9JTkRfTUFTSzsKLSAgICAgICAgaWYgKGNzMyA9PSBDT0RFQ19UWVBFX0xDM1EpIHsKLSAgICAgICAgICByZXR1cm4gIkxDM1EiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAiTEMzIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldExjM3FWYWx1ZXMoKSB7Ci0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG1Db2RlY0NvbmZpZyA9IG1Wb2ljZUNvZGVjU3RhdHVzLmdldENvZGVjQ29uZmlnKCk7Ci0gICAgICAgIGxvbmcgY3MzID0gbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMzKCk7Ci0gICAgICAgIGxvbmcgY3M0ID0gbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWM0KCk7Ci0KLSAgICAgICAgU3RyaW5nIHZzTWV0YURhdGFMYzNxVmFsID0gU3RyaW5nLmpvaW4oIiwiLCBuZXcgU3RyaW5nW117Ci0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV84VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV83VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV82VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV81VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV80VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV8zUkRfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV8yTkRfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczQgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV8xU1RfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV84VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKCgoY3MzID4+Ci0gICAgICAgICAgICAgICAgKENTX1BBUkFNX05VTV9CSVRTICogQ1NfUEFSQU1fMk5EX0lOREVYKSkgJiBDU19QQVJBTV9JTkRfTUFTSykgJiAweDAxKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV8xU1RfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV83VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV82VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV81VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV80VEhfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSksCi0gICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlMDJYIiwgKChjczMgPj4KLSAgICAgICAgICAgICAgICAoQ1NfUEFSQU1fTlVNX0JJVFMgKiBDU19QQVJBTV8zUkRfSU5ERVgpKSAmIENTX1BBUkFNX0lORF9NQVNLKSkKLSAgICAgICAgICB9KTsKLSAgICAgICAgTG9nLmkoVEFHLCAiZ2V0TGMzcVZhbHVlcygpIGZvciAiICsgbURldmljZSArICI6ICIgKyB2c01ldGFEYXRhTGMzcVZhbCk7Ci0gICAgICAgIHJldHVybiB2c01ldGFEYXRhTGMzcVZhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSeFR4Q29uZmlnSW5kZXgoKSB7Ci0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG1Db2RlY0NvbmZpZyA9IG1Wb2ljZUNvZGVjU3RhdHVzLmdldENvZGVjQ29uZmlnKCk7Ci0gICAgICAgIGludCBzYW1wbGVSYXRlID0gbUNvZGVjQ29uZmlnLmdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgbG9uZyBjczEgPSBtQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzEoKSA+PiAwICYgMHhmZjsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfODAwMCkgewotICAgICAgICAgICAgaWYgKGNzMSA9PSAweDAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIwIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIxIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlID09IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFXzE2MDAwKSB7Ci0gICAgICAgICAgICBpZiAoY3MxID09IDB4MDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjIiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjMiOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNhbXBsZVJhdGUgPT0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMzIwMDApIHsKLSAgICAgICAgICAgIGlmIChjczEgPT0gMHgwMSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiNCI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiNSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIwIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Vm9pY2VQYXJhbWV0ZXJzKCkgewotICAgICAgICBTdHJpbmcga2V5VmFsdWVQYWlycyA9IFN0cmluZy5qb2luKCI7IiwgbmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgIENPREVDX05BTUUgKyAiPSIgKyAiTEMzIiwKLSAgICAgICAgICAgICAgICBTVFJFQU1fTUFQICsgIj0iICsgIigwLCAwLCBNLCAwLCAxLCBMKSwoMSwgMCwgTSwgMSwgMSwgUikiLAotICAgICAgICAgICAgICAgIEZSQU1FX0RVUkFUSU9OICsgIj0iICsgZ2V0RnJhbWVEdXJhdGlvbigpLAotICAgICAgICAgICAgICAgIFNEVV9CTE9DSyArICI9IiArIGdldExjM0Jsb2Nrc1BlclNkdSgpLAotICAgICAgICAgICAgICAgIFJYQ09ORklHX0lORFggKyAiPSIgKyBnZXRSeFR4Q29uZmlnSW5kZXgoKSwKLSAgICAgICAgICAgICAgICBUWENPTkZJR19JTkRYICsgIj0iICsgZ2V0UnhUeENvbmZpZ0luZGV4KCksCi0gICAgICAgICAgICAgICAgVkVSU0lPTiArICI9IiArICIyMSIsCi0gICAgICAgICAgICAgICAgVkVORE9SX01FVEFfREFUQSArICI9IiArIGdldExjM3FWYWx1ZXMoKQotICAgICAgICB9KTsKLSAgICAgICAgTG9nLmkoVEFHLCAic2V0Vm9pY2VQYXJhbWV0ZXJzIGZvciAiICsgbURldmljZSArICI6ICIgKyBrZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0Q2FsbEF1ZGlvUGFyYW0oa2V5VmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENhbGxBdWRpb09uKGJvb2xlYW4gb24pIHsKLSAgICAgICAgTG9nLmkoVEFHLCAic2V0IENhbGwgQXVkaW8gT246ICIgKyBvbik7Ci0gICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlLnNldENhbGxBdWRpb09uKG9uKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q3NpcENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Dc2lwQ29ubmVjdGlvblN0YXRlOwotICAgIH0KLQotICAgIEJsdWV0b290aERldmljZSBnZXREZXZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOwotICAgIH0KLQotICAgIEJsdWV0b290aERldmljZSBnZXRQZWVyRGV2aWNlKCkgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZCA9IG51bGw7Ci0gICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBtZW1iZXJzID0gbUFjbVNlcnZpY2UuZ2V0Q3NpcE1hbmFnZXIoKS5nZXRTZXRNZW1iZXJzKG1TZXRJZCk7Ci0gICAgICAgIGlmIChtZW1iZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk5vIHNldCBtZW1iZXIgZm91bmQiKTsKLSAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yPEJsdWV0b290aERldmljZT4gaSA9IG1lbWJlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKGkgIT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZCA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghKE9iamVjdHMuZXF1YWxzKGQsIG1EZXZpY2UpKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2U6ICIgKyBkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkOwotICAgIH0KLQotICAgIHZvaWQgcmVtb3ZlRGV2aWNlZnJvbUJnV0woKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInJlbW92ZSBkZXZpY2UgZnJvbSBCRyBXTCIpOwotICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCAmJiBtSXNEZXZpY2VXaGl0ZWxpc3RlZCkgewotICAgICAgICAgICAgbUlzRGV2aWNlV2hpdGVsaXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIChnZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzQ3NpcExvY2tSZXF1ZXN0ZWQoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1Dc2lwTG9ja1JlcXVlc3RlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNNdXNpY1BsYXlpbmcoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1Jc011c2ljUGxheWluZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNWb2ljZVBsYXlpbmcoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1ZvaWNlUGxheWluZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVHJhbnNpdGlvbkNvbnRleHRTdGF0ZShJU3RhdGUgcHJldlN0YXRlLCBJU3RhdGUgbmV4dFN0YXRlLCBpbnQgY29udGV4dFR5cGUpIHsKLSAgICAgICAgaW50IHBTdGF0ZSA9IEFjbVN0YXRlVG9CbHVldG9vdGhQcm9maWxlU3RhdGUocHJldlN0YXRlKTsKLSAgICAgICAgaW50IG5TdGF0ZSA9IEFjbVN0YXRlVG9CbHVldG9vdGhQcm9maWxlU3RhdGUobmV4dFN0YXRlKTsKLSAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgbUxhc3RNdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9IHBTdGF0ZTsKLSAgICAgICAgICAgIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9IG5TdGF0ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgIG1MYXN0Vm9pY2VDb25uZWN0aW9uU3RhdGUgPSBwU3RhdGU7Ci0gICAgICAgICAgICBtVm9pY2VDb25uZWN0aW9uU3RhdGUgPSBuU3RhdGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFKSB7Ci0gICAgICAgICAgICBtTGFzdE11c2ljQ29ubmVjdGlvblN0YXRlID0gcFN0YXRlOwotICAgICAgICAgICAgbUxhc3RWb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IHBTdGF0ZTsKLSAgICAgICAgICAgIG1NdXNpY0Nvbm5lY3Rpb25TdGF0ZSA9IG5TdGF0ZTsKLSAgICAgICAgICAgIG1Wb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IG5TdGF0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5PVEU6IFRoaXMgZXZlbnQgaXMgcHJvY2Vzc2VkIGluIGFueSBzdGF0ZQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgcHJvY2Vzc0NvZGVjQ29uZmlnRXZlbnQoQmx1ZXRvb3RoQ29kZWNTdGF0dXMgbmV3Q29kZWNTdGF0dXMsIGludCBjb250ZXh0VHlwZSkgewotICAgICAgICBMb2cuZChUQUcsIlByb2Nlc3NDb2RlY0NvbmZpZ0V2ZW50OiBjb250ZXh0IHR5cGUgOiIgKyBjb250ZXh0VHlwZSk7Ci0gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG1Db2RlY0NvbmZpZyA9IG5ld0NvZGVjU3RhdHVzLmdldENvZGVjQ29uZmlnKCk7Ci0gICAgICAgICAgICBsb25nIGNzMyA9IG1Db2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMygpOwotICAgICAgICAgICAgY3MzIHw9IExFX0FVRElPX0FWQUlMQUJMRV9MSUNFTlNFRDsKLSAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG1Db2RlY0NvbmZpZ0xjMyA9IG5ldyBCbHVldG9vdGhDb2RlY0NvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWcuZ2V0Q29kZWNUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlnLmdldENvZGVjUHJpb3JpdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWcuZ2V0U2FtcGxlUmF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZy5nZXRCaXRzUGVyU2FtcGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlnLmdldENoYW5uZWxNb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMxKCksIG1Db2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzMywgbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWM0KCkpOwotICAgICAgICAgICAgbU11c2ljQ29kZWNTdGF0dXMgPSBuZXcgQmx1ZXRvb3RoQ29kZWNTdGF0dXMobUNvZGVjQ29uZmlnTGMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZWNTdGF0dXMuZ2V0Q29kZWNzTG9jYWxDYXBhYmlsaXRpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKSk7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgIHNlcnZpY2Uub25NZWRpYUNvZGVjQ29uZmlnQ2hhbmdlKG1Hcm91cEFkZHJlc3MsIG1NdXNpY0NvZGVjU3RhdHVzLCBjb250ZXh0VHlwZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICBtVm9pY2VDb2RlY1N0YXR1cyA9IG5ld0NvZGVjU3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dSZWNTdHJpbmcoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQobWVzc2FnZVdoYXRUb1N0cmluZyhtc2cud2hhdCkpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoImFyZzE9IikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG1zZy5hcmcxKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgYXJnMj0iKQotICAgICAgICAgICAgICAgIC5hcHBlbmQobXNnLmFyZzIpCi0gICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBvYmo9IikKLSAgICAgICAgICAgICAgICAuYXBwZW5kKG1zZy5vYmopOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2FtZVNlbGVjdGFibGVDb2RlYyhCbHVldG9vdGhDb2RlY1N0YXR1cyBwcmV2Q29kZWNTdGF0dXMsCi0gICAgICAgICAgICBCbHVldG9vdGhDb2RlY1N0YXR1cyBuZXdDb2RlY1N0YXR1cykgewotICAgICAgICBpZiAocHJldkNvZGVjU3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoQ29kZWNTdGF0dXMuc2FtZUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgICAgICBwcmV2Q29kZWNTdGF0dXMuZ2V0Q29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcygpLAotICAgICAgICAgICAgICAgIG5ld0NvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lc3NhZ2VXaGF0VG9TdHJpbmcoaW50IHdoYXQpIHsKLSAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUIjsKLSAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkRJU0NPTk5FQ1QiOwotICAgICAgICAgICAgY2FzZSBTVEFDS19FVkVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNUQUNLX0VWRU5UIjsKLSAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9USU1FT1VUOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9USU1FT1VUIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcod2hhdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnRleHRUeXBlVG9TdHJpbmcoaW50IGNvbnRleHRUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoY29udGV4dFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ09OVEVYVF9UWVBFX1VOS05PV046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKLSAgICAgICAgICAgIGNhc2UgQ09OVEVYVF9UWVBFX01VU0lDOgotICAgICAgICAgICAgICAgIHJldHVybiAiTUVESUEiOwotICAgICAgICAgICAgY2FzZSBDT05URVhUX1RZUEVfVk9JQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05WRVJTQVRJT05BTCI7Ci0gICAgICAgICAgICBjYXNlIENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIk1FRElBK0NPTlZFUlNBVElPTkFMIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoY29udGV4dFR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcm9maWxlU3RhdGVUb1N0cmluZyhpbnQgc3RhdGUpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkRJU0NPTk5FQ1RFRCI7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RJTkciOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RFRCI7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkRJU0NPTk5FQ1RJTkciOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgLypwcml2YXRlIHN0YXRpYyBTdHJpbmcgbXVzaWNBdWRpb1N0YXRlVG9TdHJpbmcoaW50IHN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiUExBWUlORyI7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJOT1RfUExBWUlORyI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHN0YXRlKTsKLSAgICB9Ki8KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB2b2ljZUF1ZGlvU3RhdGVUb1N0cmluZyhpbnQgc3RhdGUpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICByZXR1cm4gIkFVRElPX0RJU0NPTk5FQ1RFRCI7Ci0gICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICByZXR1cm4gIkFVRElPX0NPTk5FQ1RJTkciOwotICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19DT05ORUNURUQ6Ci0gICAgICAgICAgICByZXR1cm4gIkFVRElPX0NPTk5FQ1RFRCI7Ci0gICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICByZXR1cm4gIkFVRElPX0RJU0NPTk5FQ1RJTkciOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IEFjbVN0YXRlVG9CbHVldG9vdGhQcm9maWxlU3RhdGUoSVN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIGlmIChzdGF0ZSBpbnN0YW5jZW9mIERpc2Nvbm5lY3RlZCkgewotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlIGluc3RhbmNlb2YgQ29ubmVjdGluZykgewotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSBpbnN0YW5jZW9mIENvbm5lY3RlZCkgewotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlIGluc3RhbmNlb2YgRGlzY29ubmVjdGluZykgewotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgfQotICAgICAgICBMb2cudyhUQUcsICJVbmtub3duIFN0YXRlIik7Ci0gICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZ0J1aWxkZXIgc2IpIHsKLSAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIm1EZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIiAgU3RhdGVNYWNoaW5lOiAiICsgdGhpcy50b1N0cmluZygpKTsKLSAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIiAgbUlzTXVzaWNQbGF5aW5nOiAiICsgbUlzTXVzaWNQbGF5aW5nKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAobVZvaWNlQ29kZWNTdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFByb2ZpbGVTZXJ2aWNlLnByaW50bG4oc2IsICIgVm9pY2UgbUNvZGVjQ29uZmlnOiAiICsgbVZvaWNlQ29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU11c2ljQ29kZWNTdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFByb2ZpbGVTZXJ2aWNlLnByaW50bG4oc2IsICIgTXVzaWMgbUNvZGVjQ29uZmlnOiAiICsgbU11c2ljQ29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRHVtcCB0aGUgc3RhdGUgbWFjaGluZSBsb2dzCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0gICAgICAgIHN1cGVyLmR1bXAobmV3IEZpbGVEZXNjcmlwdG9yKCksIHByaW50V3JpdGVyLCBuZXcgU3RyaW5nW117fSk7Ci0gICAgICAgIHByaW50V3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIHN0cmluZ1dyaXRlci5mbHVzaCgpOwotICAgICAgICBQcm9maWxlU2VydmljZS5wcmludGxuKHNiLCAiICBTdGF0ZU1hY2hpbmVMb2c6Iik7Ci0gICAgICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKLSAgICAgICAgd2hpbGUgKHNjYW5uZXIuaGFzTmV4dExpbmUoKSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBzY2FubmVyLm5leHRMaW5lKCk7Ci0gICAgICAgICAgICBQcm9maWxlU2VydmljZS5wcmludGxuKHNiLCAiICAgICIgKyBsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBzY2FubmVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgc3VwZXIubG9nKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9BY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjYWJmMS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9BY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKgotICogQmx1ZXRvb3RoIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLiBUaGVyZSBpcyBvbmUgaW5zdGFuY2UgZWFjaCBmb3IKLSAqICB2b2ljZSBhbmQgbWVkaWEgcHJvZmlsZSBtYW5hZ2VtZW50Li4KLSAqICAtICJJZGxlIiBhbmQgIkFjdGl2ZSIgYXJlIHN0ZWFkeSBzdGF0ZXMuCi0gKiAgLSAiQWN0aXZhdGluZyIgYW5kICJEZWFjdGl2YXRpbmciIGFyZSB0cmFuc2llbnQgc3RhdGVzIHVudGlsIHRoZQotICogICAgIFNITyAvIERlYWN0aXZhdGlvbiBpcyBjb21wbGV0ZWQuCi0gKgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJZGxlKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgICAgIFNldEFjdGl2ZSB8ICAgICAgICB8IFJlbW92ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgKEFjdGl2YXRpbmcpICAgICAgICAgIChEZWFjdGl2YXRpbmcpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgXgotICogICAgICAgICAgICAgICAgIEFjdGl2YXRlZCAgIHwgICAgICAgIHwgc2V0QWN0aXZlKE5VTEwpIC8gcmVtb3ZlRGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgViAgICAgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgKEFjdGl2ZSAvIEJyb2FkY2FzdGluZykKLSAqCi0gKgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1Q7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5BY3RpdmVEZXZpY2VNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAuQTJkcFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmhlYXJpbmdhaWQuSGVhcmluZ0FpZFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmhmcC5IZWFkc2V0U2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGgubWNwLk1jcFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdC5Ccm9hZGNhc3RTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5jYy5DQ1NlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTdGF0c0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGVNYWNoaW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5Cb29sZWFuOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7Ci1pbXBvcnQgamF2YS5sYW5nLkludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQVBNOiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2Ugc0FjdGl2ZURldmljZU1hbmFnZXIgPSBudWxsOwotICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkW10gdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWRbQXVkaW9UeXBlLlNJWkVdOwotICAgIHByaXZhdGUgU2hvU3RhdGVNYWNoaW5lW10gc20gPSBuZXcgU2hvU3RhdGVNYWNoaW5lW0F1ZGlvVHlwZS5TSVpFXTsKLSAgICBwcml2YXRlIEFwbU5hdGl2ZUludGVyZmFjZSBhcG1OYXRpdmU7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiB0eFN0cmVhbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgTG9jayBsb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLSAgICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiBtZWRpYUhhbmRvZmZDb21wbGV0ZSA9IGxvY2submV3Q29uZGl0aW9uKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gdm9pY2VIYW5kb2ZmQ29tcGxldGUgPSBsb2NrLm5ld0NvbmRpdGlvbigpOwotICAgIHN0YXRpYyBjbGFzcyBFdmVudCB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0FDVElWRSA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZFX0RFVklDRV9DSEFOR0UgPSAyOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9ERVZJQ0UgPSAzOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFVklDRV9SRU1PVkVEID0gNDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkFURV9USU1FT1VUID0gNTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBERUFDVElWQVRFX1RJTUVPVVQgPSA2OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNVU1BFTkRfUkVDT1JESU5HID0gNzsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRVNVTUVfUkVDT1JESU5HID0gODsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRVRSWV9ERUFDVElWQVRFID0gOTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVE9QX1NNID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9fU1VDQ0VTUyA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPX1BFTkRJTkcgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT19GQUlMRUQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUkVBRFlfQUNUSVZFID0gMzsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVUUllfTElNSVQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZBVEVfVElNRU9VVF9ERUxBWSA9IDMwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUFDVElWQVRFX1RJTUVPVVRfREVMQVkgPSAyMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVBQ1RJVkFURV9UUllfREVMQVkgPSA1MDA7Ci0KLSAgICBwcml2YXRlIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhyZWFkW0F1ZGlvVHlwZS5NRURJQV0gPSBuZXcgSGFuZGxlclRocmVhZCgiQWN0aXZlRGV2aWNlTWFuYWdlci5NZWRpYVRocmVhZCIpOwotICAgICAgICB0aHJlYWRbQXVkaW9UeXBlLk1FRElBXS5zdGFydCgpOwotICAgICAgICBMb29wZXIgbWVkaWFMb29wZXIgPSB0aHJlYWRbQXVkaW9UeXBlLk1FRElBXS5nZXRMb29wZXIoKTsKLSAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXSA9IG5ldyBTaG9TdGF0ZU1hY2hpbmUoQXVkaW9UeXBlLk1FRElBLCBtZWRpYUxvb3Blcik7Ci0KLSAgICAgICAgdGhyZWFkW0F1ZGlvVHlwZS5WT0lDRV0gPSBuZXcgSGFuZGxlclRocmVhZCgiQWN0aXZlRGV2aWNlTWFuYWdlci5Wb2ljZVRocmVhZCIpOwotICAgICAgICB0aHJlYWRbQXVkaW9UeXBlLlZPSUNFXS5zdGFydCgpOwotICAgICAgICBMb29wZXIgdm9pY2VMb29wZXIgPSB0aHJlYWRbQXVkaW9UeXBlLlZPSUNFXS5nZXRMb29wZXIoKTsKLSAgICAgICAgc21bQXVkaW9UeXBlLlZPSUNFXSA9IG5ldyBTaG9TdGF0ZU1hY2hpbmUoQXVkaW9UeXBlLlZPSUNFLCB2b2ljZUxvb3Blcik7Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBhcG1OYXRpdmUgPSBBcG1OYXRpdmVJbnRlcmZhY2UuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXBtTmF0aXZlLmluaXQoKTsKLQotICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChtQXVkaW9NYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpb01hbmFnZXIgY2Fubm90IGJlIG51bGwgd2hlbiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSBzdGFydHMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYoc0FjdGl2ZURldmljZU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgc0FjdGl2ZURldmljZU1hbmFnZXIgPSBuZXcgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UoY29udGV4dCk7Ci0gICAgICAgICAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZUludGYuaW5pdChzQWN0aXZlRGV2aWNlTWFuYWdlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNBY3RpdmVEZXZpY2VNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgZ2V0KCkgewotICAgICAgICByZXR1cm4gc0FjdGl2ZURldmljZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvVHlwZSwgQm9vbGVhbiBpc1VJUmVxLCBCb29sZWFuIHBsYXlSZXEpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlKCIgKyBkZXZpY2UgKyAiKSBhdWRpb1R5cGU6ICIgKyBtQXVkaW9UeXBlKTsKLSAgICAgICAgYm9vbGVhbiBpc0NhbGxBY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgaWYoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPID09IG1BdWRpb1R5cGUpIHsKLSAgICAgICAgICAgIENhbGxBdWRpbyBtQ2FsbEF1ZGlvID0gQ2FsbEF1ZGlvLmdldCgpOwotICAgICAgICAgICAgaXNDYWxsQWN0aXZlID0gbUNhbGxBdWRpby5pc0F1ZGlvT24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZChzbVttQXVkaW9UeXBlXSkgewotICAgICAgICAgICAgc21bbUF1ZGlvVHlwZV0ubVNIT1F1ZXVlLmRldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIHNtW21BdWRpb1R5cGVdLm1TSE9RdWV1ZS5pc1VJUmVxID0gaXNVSVJlcTsKLSAgICAgICAgICAgIHNtW21BdWRpb1R5cGVdLm1TSE9RdWV1ZS5QbGF5UmVxID0gKHBsYXlSZXEgfHwgaXNDYWxsQWN0aXZlKTsKLSAgICAgICAgICAgIHNtW21BdWRpb1R5cGVdLm1TSE9RdWV1ZS5pc0Jyb2FkY2FzdCA9IGZhbHNlOwotICAgICAgICAgICAgc21bbUF1ZGlvVHlwZV0ubVNIT1F1ZXVlLmlzUmVjb3JkaW5nTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgc21bbUF1ZGlvVHlwZV0ubVNIT1F1ZXVlLmlzR2FtaW5nTW9kZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNtW21BdWRpb1R5cGVdLnNlbmRNZXNzYWdlKEV2ZW50LlNFVF9BQ1RJVkUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKG1BdWRpb1R5cGUgPT0gQXVkaW9UeXBlLk1FRElBICYmIHNtW21BdWRpb1R5cGVdLm1TdGF0ZSA9PSBzbVttQXVkaW9UeXBlXS5tQnJvYWRjYXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTEUgQnJvYWRjYXN0IGlzIGFjdGl2ZSwgaWdub3JlIFJFTU9WRV9ERVZJQ0UiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc21bbUF1ZGlvVHlwZV0uc2VuZE1lc3NhZ2UoRXZlbnQuUkVNT1ZFX0RFVklDRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzVUlSZXE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvVHlwZSwgQm9vbGVhbiBpc1VJUmVxKSB7Ci0gICAgICAgIHJldHVybiBzZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBtQXVkaW9UeXBlLCBpc1VJUmVxLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvVHlwZSkgewotICAgICAgICByZXR1cm4gc2V0QWN0aXZlRGV2aWNlKGRldmljZSwgbUF1ZGlvVHlwZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2VCbG9ja2luZyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIG1BdWRpb1R5cGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlQmxvY2tpbmc6IEVudGVyIik7Ci0gICAgICAgIGlmKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyA9PSBtQXVkaW9UeXBlKSB7Ci0gICAgICAgICAgICBzZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBtQXVkaW9UeXBlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICB2b2ljZUhhbmRvZmZDb21wbGV0ZS5hd2FpdCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNldEFjdGl2ZURldmljZUJsb2NraW5nOiBVbmJsb2NrZWQgYmVjYXVzZSBvZiBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlQmxvY2tpbmc6IHVubG9jayIpOwotICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlQmxvY2tpbmc6IEV4aXQiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXRRdWV1ZWREZXZpY2UoSW50ZWdlciBtQXVkaW9UeXBlKSB7Ci0gICAgICAgIHJldHVybiBzbVttQXVkaW9UeXBlXS5tU0hPUXVldWUuZGV2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFjdGl2ZURldmljZShJbnRlZ2VyIG1BdWRpb1R5cGUsIEJvb2xlYW4gZm9yY2VTdG9wQXVkaW8pIHsKLSAgICAgICAgc21bbUF1ZGlvVHlwZV0ubVNIT1F1ZXVlLmZvcmNlU3RvcEF1ZGlvID0gZm9yY2VTdG9wQXVkaW87Ci0gICAgICAgIHNldEFjdGl2ZURldmljZShudWxsLCBtQXVkaW9UeXBlLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBCbHVldG9vdGhEZXZpY2UgZ2V0QWN0aXZlRGV2aWNlKEludGVnZXIgbUF1ZGlvVHlwZSkgewotICAgICAgICByZXR1cm4gc21bbUF1ZGlvVHlwZV0uQ3VycmVudC5EZXZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBY3RpdmVQcm9maWxlKEludGVnZXIgbUF1ZGlvVHlwZSkgewotICAgICAgICBpZihzbVttQXVkaW9UeXBlXS5tU3RhdGUgPT0gc21bbUF1ZGlvVHlwZV0ubUJyb2FkY2FzdGluZykgewotICAgICAgICAgICAgLy8gVXNlIEN1cnJlbnQuUHJvZmlsZSBoZXJlCi0gICAgICAgICAgICByZXR1cm4gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CUk9BRENBU1RfTEU7Ci0gICAgICAgIH0gZWxzZSBpZihzbVttQXVkaW9UeXBlXS5tU3RhdGUgPT0gc21bbUF1ZGlvVHlwZV0ubUFjdGl2ZSkgewotICAgICAgICAgICAgcmV0dXJuIHNtW21BdWRpb1R5cGVdLkN1cnJlbnQuUHJvZmlsZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aXZlRGV2aWNlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvVHlwZSkgewotICAgICAgICByZXR1cm4gb25BY3RpdmVEZXZpY2VDaGFuZ2UoZGV2aWNlLCBtQXVkaW9UeXBlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aXZlRGV2aWNlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvVHlwZSwgSW50ZWdlciBtUHJvZmlsZSkgewotICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgfHwgbVByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CUk9BRENBU1RfTEUpIHsKLSAgICAgICAgICAgIERldmljZVByb2ZpbGVDb21ibyBtRGV2aWNlUHJvZmlsZUNvbWJvID0gbmV3IERldmljZVByb2ZpbGVDb21ibyhkZXZpY2UsIG1Qcm9maWxlKTsKLSAgICAgICAgICAgIHNtW21BdWRpb1R5cGVdLnNlbmRNZXNzYWdlKEV2ZW50LkFDVElWRV9ERVZJQ0VfQ0hBTkdFLCBtRGV2aWNlUHJvZmlsZUNvbWJvKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzbVttQXVkaW9UeXBlXS5zZW5kTWVzc2FnZShFdmVudC5ERVZJQ0VfUkVNT1ZFRCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZUJyb2FkY2FzdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChzbVtBdWRpb1R5cGUuTUVESUFdKSB7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLm1TSE9RdWV1ZS5kZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLm1TSE9RdWV1ZS5pc0Jyb2FkY2FzdCA9IHRydWU7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLm1TSE9RdWV1ZS5QbGF5UmVxID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5zZW5kTWVzc2FnZShFdmVudC5TRVRfQUNUSVZFKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZUJyb2FkY2FzdCgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZGlzYWJsZUJyb2FkY2FzdCIpOwotICAgICAgICBzeW5jaHJvbml6ZWQoc21bQXVkaW9UeXBlLk1FRElBXSkgewotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuaXNCcm9hZGNhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLlBsYXlSZXEgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc21bQXVkaW9UeXBlLk1FRElBXS5tU3RhdGUgPT0gc21bQXVkaW9UeXBlLk1FRElBXS5tQnJvYWRjYXN0aW5nKSB7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLnNlbmRNZXNzYWdlKEV2ZW50LlJFTU9WRV9ERVZJQ0UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZUdhbWluZyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChzbVtBdWRpb1R5cGUuTUVESUFdLm1TdGF0ZSA9PSBzbVtBdWRpb1R5cGUuTUVESUFdLm1HYW1pbmdNb2RlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZXF1YWxzKGdldEFjdGl2ZURldmljZShBdWRpb1R5cGUuTUVESUEpKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlIGFscmVhZHkgaW4gR2FtaW5nIE1vZGUiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAiZW5hYmxlR2FtaW5nIik7Ci0gICAgICAgIHN5bmNocm9uaXplZChzbVtBdWRpb1R5cGUuTUVESUFdKSB7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLm1TSE9RdWV1ZS5kZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLm1TSE9RdWV1ZS5pc0Jyb2FkY2FzdCA9IGZhbHNlOwotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuaXNHYW1pbmdNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLlBsYXlSZXEgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLnNlbmRNZXNzYWdlKEV2ZW50LlNFVF9BQ1RJVkUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlR2FtaW5nKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKHNtW0F1ZGlvVHlwZS5NRURJQV0ubVN0YXRlICE9IHNtW0F1ZGlvVHlwZS5NRURJQV0ubUdhbWluZ01vZGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkdhbWluZyBNb2RlIG5vdCBhY3RpdmUiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLypNZWRpYUF1ZGlvIG1NZWRpYUF1ZGlvID0gTWVkaWFBdWRpby5nZXQoKTsKLSAgICAgICAgaWYobU1lZGlhQXVkaW8gIT0gbnVsbCAmJiBtTWVkaWFBdWRpby5pc0EyZHBQbGF5aW5nKGRldmljZSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkdhbWluZyBTdHJlYW0gaXMgQWN0aXZlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0qLwotCi0gICAgICAgIExvZy5kKFRBRywgImRpc2FibGVHYW1pbmciKTsKLSAgICAgICAgc3luY2hyb25pemVkKHNtW0F1ZGlvVHlwZS5NRURJQV0pIHsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLmRldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLmlzR2FtaW5nTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuUGxheVJlcSA9IGZhbHNlOwotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuaXNVSVJlcSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NtW0F1ZGlvVHlwZS5NRURJQV0uc2VuZE1lc3NhZ2VEZWxheWVkKEV2ZW50LlNFVF9BQ1RJVkUsIERFQUNUSVZBVEVfVFJZX0RFTEFZKTsKLSAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5zZW5kTWVzc2FnZShFdmVudC5TRVRfQUNUSVZFKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZW5hYmxlUmVjb3JkaW5nKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZW5hYmxlUmVjb3JkaW5nOiAiICsgZGV2aWNlKTsKLQotICAgICAgICBNZWRpYUF1ZGlvIG1NZWRpYUF1ZGlvID0gTWVkaWFBdWRpby5nZXQoKTsKLSAgICAgICAgaWYodHhTdHJlYW1TdXNwZW5kZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNldCBBMmRwU3VzcGVuZGVkPXRydWUiKTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UGFyYW1ldGVycygiQTJkcFN1c3BlbmRlZD10cnVlIik7Ci0gICAgICAgICAgICB0eFN0cmVhbVN1c3BlbmRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQoc21bQXVkaW9UeXBlLk1FRElBXSkgewotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuZGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuaXNCcm9hZGNhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLmlzR2FtaW5nTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuaXNSZWNvcmRpbmdNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLlBsYXlSZXEgPSBmYWxzZTsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0ubVNIT1F1ZXVlLmlzVUlSZXEgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0uc2VuZE1lc3NhZ2UoRXZlbnQuU0VUX0FDVElWRSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVSZWNvcmRpbmcoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJkaXNhYmxlUmVjb3JkaW5nOiAiICsgZGV2aWNlKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQoc21bQXVkaW9UeXBlLk1FRElBXSkgewotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuZGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5tU0hPUXVldWUuaXNSZWNvcmRpbmdNb2RlID0gZmFsc2U7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLm1TSE9RdWV1ZS5QbGF5UmVxID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc21bQXVkaW9UeXBlLk1FRElBXS5tU3RhdGUgPT0gc21bQXVkaW9UeXBlLk1FRElBXS5tUmVjb3JkaW5nTW9kZSkgewotICAgICAgICAgICAgc21bQXVkaW9UeXBlLk1FRElBXS5zZW5kTWVzc2FnZShFdmVudC5TRVRfQUNUSVZFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXNwZW5kUmVjb3JkaW5nKEJvb2xlYW4gc3VzcGVuZCkgewotICAgICAgICBMb2cuZChUQUcsICJzdXNwZW5kUmVjb3JkaW5nOiAiICsgc3VzcGVuZCk7Ci0KLSAgICAgICAgaWYoc21bQXVkaW9UeXBlLk1FRElBXS5tU3RhdGUgPT0gc21bQXVkaW9UeXBlLk1FRElBXS5tUmVjb3JkaW5nTW9kZSkgewotICAgICAgICAgIGlmKHN1c3BlbmQpIHsKLSAgICAgICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0uc2VuZE1lc3NhZ2UoRXZlbnQuU1VTUEVORF9SRUNPUkRJTkcpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLnNlbmRNZXNzYWdlKEV2ZW50LlJFU1VNRV9SRUNPUkRJTkcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlY29yZGluZ0FjdGl2ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImlzUmVjb3JkaW5nQWN0aXZlIik7Ci0gICAgICAgIHJldHVybiBzbVtBdWRpb1R5cGUuTUVESUFdLm1TdGF0ZSA9PSBzbVtBdWRpb1R5cGUuTUVESUFdLm1SZWNvcmRpbmdNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhYmxlU3RhdGUoaW50IG1BdWRpb1R5cGUpIHsKLSAgICAgICAgU3RhdGUgc3RhdGUgPSBzbVttQXVkaW9UeXBlXS5tU3RhdGU7Ci0gICAgICAgIHJldHVybiAhKHNtW21BdWRpb1R5cGVdLm1BY3RpdmF0aW5nID09IHN0YXRlIHx8IHNtW21BdWRpb1R5cGVdLm1EZWFjdGl2YXRpbmcgPT0gc3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3RBY3RpdmVEZXZpY2VDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IG1BdWRpb1R5cGUpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYnJvYWRjYXN0QWN0aXZlRGV2aWNlQ2hhbmdlKCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIEludGVudCBpbnRlbnQ7Ci0KLSAgICAgICAgLyppZiAobUFkYXB0ZXJTZXJ2aWNlICE9IG51bGwpCi0gICAgICAgICAgICBCbHVldG9vdGhTdGF0c0xvZy53cml0ZShCbHVldG9vdGhTdGF0c0xvZy5CTFVFVE9PVEhfQUNUSVZFX0RFVklDRV9DSEFOR0VELCBCbHVldG9vdGhQcm9maWxlLkEyRFAsCi0gICAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlLm9iZnVzY2F0ZUFkZHJlc3MoZGV2aWNlKSwgMCk7Ki8KLQotICAgICAgICBpZihtQXVkaW9UeXBlID09IEF1ZGlvVHlwZS5NRURJQSkKLSAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQUNUSVZFX0RFVklDRV9DSEFOR0VEKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9BQ1RJVkVfREVWSUNFX0NIQU5HRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAotICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9JTkNMVURFX0JBQ0tHUk9VTkQpOwotICAgICAgICBpZihtQXVkaW9UeXBlID09IEF1ZGlvVHlwZS5NRURJQSkgewotICAgICAgICAgICAgQTJkcFNlcnZpY2UgbUEyZHBTZXJ2aWNlID0gQTJkcFNlcnZpY2UuZ2V0QTJkcFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKG1BMmRwU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQTJkcCBTZXJ2aWNlIG5vdCByZWFkeSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BMmRwU2VydmljZS5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0NPTk5FQ1QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGVhZHNldFNlcnZpY2UgbUhlYWRzZXRTZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSGVhZHNldCBTZXJ2aWNlIG5vdCByZWFkeSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1IZWFkc2V0U2VydmljZS5zZW5kQnJvYWRjYXN0QXNVc2VyKGludGVudCwgVXNlckhhbmRsZS5BTEwsIEJMVUVUT09USF9DT05ORUNULAotICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldFRlbXBBbGxvd2xpc3RCcm9hZGNhc3RPcHRpb25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzYWJsZSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZGlzYWJsZSgpIGNhbGxlZCIpOwotICAgICAgICBzbVtBdWRpb1R5cGUuTUVESUFdLnNlbmRNZXNzYWdlKEV2ZW50LlNUT1BfU00pOwotICAgICAgICBzbVtBdWRpb1R5cGUuVk9JQ0VdLnNlbmRNZXNzYWdlKEV2ZW50LlNUT1BfU00pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIHNtW0F1ZGlvVHlwZS5WT0lDRV0uZG9RdWl0KCk7Ci0gICAgICAgIHNtW0F1ZGlvVHlwZS5NRURJQV0uZG9RdWl0KCk7Ci0gICAgICAgIHRocmVhZFtBdWRpb1R5cGUuVk9JQ0VdLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgdGhyZWFkW0F1ZGlvVHlwZS5NRURJQV0ucXVpdFNhZmVseSgpOwotICAgICAgICB0aHJlYWRbQXVkaW9UeXBlLlZPSUNFXSA9IG51bGw7Ci0gICAgICAgIHRocmVhZFtBdWRpb1R5cGUuTUVESUFdID0gbnVsbDsKLSAgICAgICAgc0FjdGl2ZURldmljZU1hbmFnZXIgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlUHJvZmlsZUNvbWJvIHsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIERldmljZTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFic29sdXRlRGV2aWNlOwotICAgICAgICBpbnQgUHJvZmlsZTsKLQotICAgICAgICBEZXZpY2VQcm9maWxlQ29tYm8oQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2UsIGludCBtUHJvZmlsZSkgewotICAgICAgICAgICAgRGV2aWNlID0gbURldmljZTsKLSAgICAgICAgICAgIFByb2ZpbGUgPSBtUHJvZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIERldmljZVByb2ZpbGVDb21ibygpIHsKLSAgICAgICAgICAgIERldmljZSA9IG51bGw7Ci0gICAgICAgICAgICBQcm9maWxlID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBTaG9TdGF0ZU1hY2hpbmUgZXh0ZW5kcyBTdGF0ZU1hY2hpbmUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQVBNOiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBJRExFID0gMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkFUSU5HID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkUgPSAyOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVElORyA9IDM7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0FDVElWRSA9IDQ7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgR0FNSU5HX0FDVElWRSA9IDU7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVDT1JESU5HX0FDVElWRSA9IDY7Ci0KLSAgICAgICAgcHJpdmF0ZSBJZGxlIG1JZGxlOwotICAgICAgICBwcml2YXRlIEFjdGl2YXRpbmcgbUFjdGl2YXRpbmc7Ci0gICAgICAgIHByaXZhdGUgQWN0aXZlIG1BY3RpdmU7Ci0gICAgICAgIHByaXZhdGUgRGVhY3RpdmF0aW5nIG1EZWFjdGl2YXRpbmc7Ci0gICAgICAgIHByaXZhdGUgQnJvYWRjYXN0aW5nIG1Ccm9hZGNhc3Rpbmc7Ci0gICAgICAgIHByaXZhdGUgR2FtaW5nIG1HYW1pbmdNb2RlOwotICAgICAgICBwcml2YXRlIFJlY29yZGluZyBtUmVjb3JkaW5nTW9kZTsKLQotICAgICAgICBwcml2YXRlIERldmljZVByb2ZpbGVDb21ibyBDdXJyZW50OwotICAgICAgICBwcml2YXRlIERldmljZVByb2ZpbGVDb21ibyBUYXJnZXQ7Ci0gICAgICAgIHByaXZhdGUgU0hPUmVxIG1UYXJnZXRTSE87Ci0gICAgICAgIHByaXZhdGUgU0hPUmVxIG1TSE9RdWV1ZTsKLQotICAgICAgICBwcml2YXRlIERldmljZVByb2ZpbGVNYXAgZHBtOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1BdWRpb1R5cGU7Ci0gICAgICAgIHByaXZhdGUgU3RhdGUgbVN0YXRlOwotICAgICAgICBwcml2YXRlIFN0YXRlIG1QcmV2U3RhdGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtUHJldkFjdGl2ZURldmljZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByZXZBY3RpdmVQcm9maWxlID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICBib29sZWFuIGVuYWJsZWQ7Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIG1SZWNvcmRpbmdTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc0F1ZGlvVHlwZTsKLQotICAgICAgICBTaG9TdGF0ZU1hY2hpbmUgKGludCBhdWRpb1R5cGUsIExvb3BlciBsb29wZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKFRBRywgbG9vcGVyKTsKLSAgICAgICAgICAgIHNldERiZyhEQkcpOwotCi0gICAgICAgICAgICBtSWRsZSA9IG5ldyBJZGxlKCk7Ci0gICAgICAgICAgICBtQWN0aXZhdGluZyA9IG5ldyBBY3RpdmF0aW5nKCk7Ci0gICAgICAgICAgICBtQWN0aXZlID0gbmV3IEFjdGl2ZSgpOwotICAgICAgICAgICAgbURlYWN0aXZhdGluZyA9IG5ldyBEZWFjdGl2YXRpbmcoKTsKLSAgICAgICAgICAgIG1Ccm9hZGNhc3RpbmcgPSBuZXcgQnJvYWRjYXN0aW5nKCk7Ci0gICAgICAgICAgICBtR2FtaW5nTW9kZSA9IG5ldyBHYW1pbmcoKTsKLSAgICAgICAgICAgIG1SZWNvcmRpbmdNb2RlID0gbmV3IFJlY29yZGluZygpOwotCi0gICAgICAgICAgICBDdXJyZW50ID0gbmV3IERldmljZVByb2ZpbGVDb21ibygpOwotICAgICAgICAgICAgVGFyZ2V0ID0gbmV3IERldmljZVByb2ZpbGVDb21ibygpOwotICAgICAgICAgICAgbVNIT1F1ZXVlID0gbmV3IFNIT1JlcSgpOwotICAgICAgICAgICAgbVRhcmdldFNITyA9IG5ldyBTSE9SZXEoKTsKLQotICAgICAgICAgICAgYWRkU3RhdGUobUlkbGUpOwotICAgICAgICAgICAgYWRkU3RhdGUobUFjdGl2YXRpbmcpOwotICAgICAgICAgICAgYWRkU3RhdGUobUFjdGl2ZSk7Ci0gICAgICAgICAgICBhZGRTdGF0ZShtRGVhY3RpdmF0aW5nKTsKLSAgICAgICAgICAgIGFkZFN0YXRlKG1Ccm9hZGNhc3RpbmcpOwotICAgICAgICAgICAgYWRkU3RhdGUobUdhbWluZ01vZGUpOwotICAgICAgICAgICAgYWRkU3RhdGUobVJlY29yZGluZ01vZGUpOwotCi0gICAgICAgICAgICBtQXVkaW9UeXBlID0gYXVkaW9UeXBlOwotICAgICAgICAgICAgaWYobUF1ZGlvVHlwZSA9PSBBdWRpb1R5cGUuTUVESUEpCi0gICAgICAgICAgICAgICAgc0F1ZGlvVHlwZSA9IG5ldyBTdHJpbmcoIk1FRElBIik7Ci0gICAgICAgICAgICBlbHNlIGlmKG1BdWRpb1R5cGUgPT0gQXVkaW9UeXBlLlZPSUNFKQotICAgICAgICAgICAgICAgIHNBdWRpb1R5cGUgPSBuZXcgU3RyaW5nKCJWT0lDRSIpOwotCi0gICAgICAgICAgICBlbmFibGVkID0gIHRydWU7Ci0gICAgICAgICAgICBzZXRJbml0aWFsU3RhdGUobUlkbGUpOwotICAgICAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvUXVpdCAoKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTdG9wcGluZyBTSE8gU3RhdGVNYWNoaW5lIGZvciAiICsgbUF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICBzQXVkaW9UeXBlID0gbnVsbDsKLSAgICAgICAgICAgIHF1aXROb3coKTsKLSAgICAgICAgfQotCi0gICAgICAgLyogcHVibGljIHZvaWQgY2xlYW5VcCB7Ci0KLSAgICAgICAgfSovCi0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZVdoYXRUb1N0cmluZyhpbnQgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZykgewotICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuU0VUX0FDVElWRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTRVQgQUNUSVZFIjsKLSAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkFDVElWRV9ERVZJQ0VfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFDVElWRSBERVZJQ0UgQ0hBTkdFRCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFdmVudC5SRU1PVkVfREVWSUNFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlJFTU9WRSBERVZJQ0UiOwotICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuREVWSUNFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiUkVNT1ZFRCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFdmVudC5BQ1RJVkFURV9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNFVCBBQ1RJVkUgVElNRU9VVCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFdmVudC5ERUFDVElWQVRFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiUkVNT1ZFIERFVklDRSBUSU1FT1VUIjsKLSAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNUT1BfU006Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiU1RPUCBTVEFURSBNQUNISU5FIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKG1zZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhcnRTaG8oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUpIHsKLSAgICAgICAgICAgIE1lZGlhQXVkaW8gbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICAgICAgaW50IHJldCA9IFNIT19GQUlMRUQ7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc3RyZWFtQXVkaW9TZXJ2aWNlOwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiOiBzdGFydFNobygpIGZvciBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiLCBmb3IgcHJvZmlsZTogIiArIHByb2ZpbGUpOwotICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFA6Ci0gICAgICAgICAgICAgICAgICAgIEEyZHBTZXJ2aWNlIGEyZHBTZXJ2aWNlID0gQTJkcFNlcnZpY2UuZ2V0QTJkcFNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYTJkcFNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgcGxheSBzdGF0dXMgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYTJkcFNlcnZpY2Uuc2V0QWN0aXZlRGV2aWNlKGRldmljZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQOgotICAgICAgICAgICAgICAgICAgICBIZWFkc2V0U2VydmljZSBoZWFkc2V0U2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGhlYWRzZXRTZXJ2aWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBoZWFkc2V0U2VydmljZS5zZXRBY3RpdmVEZXZpY2VIRihkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9NRURJQToKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBOgotICAgICAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb1NlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHN0cmVhbUF1ZGlvU2VydmljZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLkFMUkVBRFlfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0ID0gU0hPX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9SRUNPUkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvU2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RyZWFtQXVkaW9TZXJ2aWNlLnNldEFjdGl2ZURldmljZShkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLkFMUkVBRFlfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0ID0gU0hPX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfQ0FMTDoKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEw6Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvU2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RyZWFtQXVkaW9TZXJ2aWNlLnNldEFjdGl2ZURldmljZShkZXZpY2UsIHByb2ZpbGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9HQ1A6Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvU2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RyZWFtQXVkaW9TZXJ2aWNlLnNldEFjdGl2ZURldmljZShkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0dDUCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLkFMUkVBRFlfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0ID0gU0hPX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9MRToKLSAgICAgICAgICAgICAgICAgICAgLy9yZXQgPSBTSE9fU1VDQ0VTUzsvL2Jyb2FkY2FzdFNlcnZpY2Uuc2V0QWN0aXZlRGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNlcnZpY2UgbUJyb2FkY2FzdFNlcnZpY2UgPSBCcm9hZGNhc3RTZXJ2aWNlLmdldEJyb2FkY2FzdFNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Ccm9hZGNhc3RTZXJ2aWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtQnJvYWRjYXN0U2VydmljZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9CUkVEUjoKLSAgICAgICAgICAgICAgICAgICAgSGVhcmluZ0FpZFNlcnZpY2UgaGVhcmluZ0FpZFNlcnZpY2UgPSBIZWFyaW5nQWlkU2VydmljZS5nZXRIZWFyaW5nQWlkU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBoZWFyaW5nQWlkU2VydmljZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlKSA/ICBTSE9fU1VDQ0VTUyA6IFNIT19GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIElkbGUgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBtSWRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ3VycmVudC5EZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIC8vMiBVcGRhdGUgZGVwZW5kZW50IHByb2ZpbGVzCi0gICAgICAgICAgICAgICAgaWYobVByZXZTdGF0ZSAhPSBudWxsICYmIG1QcmV2QWN0aXZlRGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0QWN0aXZlRGV2aWNlQ2hhbmdlIChudWxsLCBtQXVkaW9UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHlwZSA9PSBBdWRpb1R5cGUuTUVESUEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2QWN0aXZlUHJvZmlsZSAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9CUkVEUikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZBY3RpdmVQcm9maWxlID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFBdWRpbyBtTWVkaWFBdWRpbyA9IE1lZGlhQXVkaW8uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHByZXNzTm9pc3lJbnRlbnQgPSAhbVRhcmdldFNITy5mb3JjZVN0b3BBdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobU1lZGlhQXVkaW8uZ2V0Q29ubmVjdGlvblN0YXRlKG1QcmV2QWN0aXZlRGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRPRE86IEFkZCBwcm9maWxlIGNoZWNrIGhlcmUqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYobUF1ZGlvTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEZS1BY3RpdmF0ZSBEZXZpY2UgIiArIG1QcmV2QWN0aXZlRGV2aWNlICsgIiBOb2lzeSBJbnRlbnQ6ICIgKyBzdXBwcmVzc05vaXN5SW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmhhbmRsZUJsdWV0b290aEEyZHBBY3RpdmVEZXZpY2VDaGFuZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZBY3RpdmVEZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuQTJEUCwgc3VwcHJlc3NOb2lzeUludGVudCwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lTWFuYWdlciBtVm9sdW1lTWFuYWdlciA9IFZvbHVtZU1hbmFnZXIuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1Wb2x1bWVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYW5hZ2VyLm9uQWN0aXZlRGV2aWNlQ2hhbmdlKEN1cnJlbnQuRGV2aWNlLCBtQXVkaW9UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHR4U3RyZWFtU3VzcGVuZGVkICYmIG1BdWRpb1R5cGUgPT0gQXVkaW9UeXBlLk1FRElBKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UGFyYW1ldGVycygiQTJkcFN1c3BlbmRlZD1mYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICB0eFN0cmVhbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCFlbmFibGVkKQotICAgICAgICAgICAgICAgICAgICBsb2coInN0YXRlIG1hY2hpbmUgc3RvcHBlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1JZGxlOwotICAgICAgICAgICAgICAgIG1QcmV2QWN0aXZlRGV2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBsb2coIklkbGU6IFByb2Nlc3MgTWVzc2FnZSAoIiArIG1BdWRpb1R5cGUgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotICAgICAgICAgICAgICAgIGlmKCFlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiU3RhdGUgTWFjaGluZSBub3QgcnVubmluZy4gUmV0dXJuaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuU0VUX0FDVElWRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkFDVElWRV9ERVZJQ0VfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogTWlnaHQgbW92ZSB0byBhY3RpdmUgaGVyZSovCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuUkVNT1ZFX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSWRsZTogUHJvY2VzcyBNZXNzYWdlIElnbm9yZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNUT1BfU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coInN0YXRlIG1hY2hpbmUgc3RvcHBlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgQWN0aXZhdGluZyBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBtQWN0aXZhdGluZzsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGVuZGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LkRldmljZSA9IG1TSE9RdWV1ZS5kZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIFRhcmdldC5hYnNvbHV0ZURldmljZSA9IFRhcmdldC5EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTSE8uY29weShtU0hPUXVldWUpOwotICAgICAgICAgICAgICAgICAgICBtU0hPUXVldWUucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQWN0aXZhdGluZyAiICsgc0F1ZGlvVHlwZSArICIgRGV2aWNlOiAiICsgVGFyZ2V0LkRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHBtID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobVRhcmdldFNITy5pc0Jyb2FkY2FzdCkgewotICAgICAgICAgICAgICAgICAgICBUYXJnZXQuUHJvZmlsZSA9IGRwbS5nZXRQcm9maWxlKFRhcmdldC5EZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQlJPQURDQVNUX0FVRElPKTsKLSAgICAgICAgICAgICAgICAgICAgbVNIT1F1ZXVlLmRldmljZSA9IEN1cnJlbnQuRGV2aWNlOwotICAgICAgICAgICAgICAgICAgICBtU0hPUXVldWUuaXNVSVJlcSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRhcmdldFNITy5pc1JlY29yZGluZ01vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNIT1F1ZXVlLmRldmljZSA9IEN1cnJlbnQuRGV2aWNlOwotICAgICAgICAgICAgICAgICAgICBUYXJnZXQuUHJvZmlsZSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORzsKLSAgICAgICAgICAgICAgICAgICAgbVNIT1F1ZXVlLmlzVUlSZXEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UYXJnZXRTSE8uaXNHYW1pbmdNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qT25seSBzaW5nbGUgcHJvZmlsZSBzdXBwb3J0cyBnYW1pbmcgTW9kZSovCi0gICAgICAgICAgICAgICAgICAgIFRhcmdldC5Qcm9maWxlID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfR0NQOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhcmdldC5Qcm9maWxlID0gZHBtLmdldFByb2ZpbGUoVGFyZ2V0LkRldmljZSwgbUF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoVGFyZ2V0LlByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LlByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldC5Qcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LlByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfR0NQKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzdHJlYW1BdWRpb1NlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRhcmdldC5EZXZpY2UgPSBzdHJlYW1BdWRpb1NlcnZpY2UuZ2V0RGV2aWNlR3JvdXAoVGFyZ2V0LkRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoVGFyZ2V0LkRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlRhcmdldCBEZXZpY2UgaXMgbnVsbCwgUmV0dXJuaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtUHJldlN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoVGFyZ2V0LkRldmljZS5lcXVhbHMoQ3VycmVudC5EZXZpY2UpICYmIFRhcmdldC5Qcm9maWxlID09IEN1cnJlbnQuUHJvZmlsZSl7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiVGFyZ2V0IERldmljZTogIiArIFRhcmdldC5EZXZpY2UgKyAiIGFuZCBQcm9maWxlOiAiICsgVGFyZ2V0LlByb2ZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbHJlYWR5IGFjdGl2ZSIpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVByZXZTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEN1cnJlbnQuRGV2aWNlID09IG51bGwgfHwgaXNTYW1lUHJvZmlsZShDdXJyZW50LlByb2ZpbGUsIFRhcmdldC5Qcm9maWxlLCBtQXVkaW9UeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBTaW5nbGUgU3RlcCBTSE8qLwotICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZURldmljZShUYXJnZXQsIG1UYXJnZXRTSE8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXVsdGkgU3RlcCBTSE8qLwotICAgICAgICAgICAgICAgICAgICByZXQgPSBzdGFydFNobyhudWxsLCBDdXJyZW50LlByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZihTSE9fUEVORElORyA9PSByZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChFdmVudC5ERUFDVElWQVRFX1RJTUVPVVQsIERFQUNUSVZBVEVfVElNRU9VVF9ERUxBWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZXQgPT0gU0hPX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFNITy5yZXRyeUNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChFdmVudC5SRVRSWV9ERUFDVElWQVRFLCBERUFDVElWQVRFX1RSWV9ERUxBWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihTSE9fU1VDQ0VTUyA9PSByZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtSWRsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2YXRlRGV2aWNlKFRhcmdldCwgbVRhcmdldFNITyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhFdmVudC5BQ1RJVkFURV9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICBtUHJldlN0YXRlID0gbUFjdGl2YXRpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJBY3RpdmF0aW5nOiBQcm9jZXNzIE1lc3NhZ2UgKCIgKyBtQXVkaW9UeXBlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5TRVRfQUNUSVZFOgotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJOZXcgU0hPIHJlcXVlc3Qgd2hpbGUgaGFuZGxpbmcgcHJldmlvdXMuIEFkZCB0byBxdWV1ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhFdmVudC5SRU1PVkVfREVWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURlZmVycmVkTWVzc2FnZXMoRXZlbnQuU0VUX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkFDVElWRV9ERVZJQ0VfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUHJvZmlsZUNvbWJvIG1EZXZpY2VQcm9maWxlQ29tYm8gPSAoRGV2aWNlUHJvZmlsZUNvbWJvKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoRXZlbnQuQUNUSVZBVEVfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVGFyZ2V0LlByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfR0NQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUYXJnZXQuUHJvZmlsZSA9PSBtRGV2aWNlUHJvZmlsZUNvbWJvLlByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50LkRldmljZSA9IFRhcmdldC5EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5Qcm9maWxlID0gVGFyZ2V0LlByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1HYW1pbmdNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVGFyZ2V0LlByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CUk9BRENBU1RfTEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFRhcmdldC5Qcm9maWxlID09IG1EZXZpY2VQcm9maWxlQ29tYm8uUHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlID0gVGFyZ2V0LkRldmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50LlByb2ZpbGUgPSBUYXJnZXQuUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUJyb2FkY2FzdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoVGFyZ2V0LkRldmljZSAhPSBudWxsICYmIFRhcmdldC5EZXZpY2UuZXF1YWxzKG1EZXZpY2VQcm9maWxlQ29tYm8uRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlID0gbURldmljZVByb2ZpbGVDb21iby5EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5Qcm9maWxlID0gVGFyZ2V0LlByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5hYnNvbHV0ZURldmljZSA9IFRhcmdldC5hYnNvbHV0ZURldmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlJFTU9WRV9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEZWZlcnJlZE1lc3NhZ2VzKEV2ZW50LlJFTU9WRV9ERVZJQ0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5ERVZJQ0VfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtSWRsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKEV2ZW50LkRFQUNUSVZBVEVfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZURldmljZShUYXJnZXQsIG1UYXJnZXRTSE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5SRVRSWV9ERUFDVElWQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRTaG8obnVsbCwgQ3VycmVudC5Qcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFNIT19QRU5ESU5HID09IHJldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTSE8ucmV0cnlDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKEV2ZW50LkRFQUNUSVZBVEVfVElNRU9VVCwgREVBQ1RJVkFURV9USU1FT1VUX0RFTEFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZXQgPT0gU0hPX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1UYXJnZXRTSE8ucmV0cnlDb3VudCA+PSBSRVRSWV9MSU1JVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtUHJldlN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U0hPLnJldHJ5Q291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKEV2ZW50LlJFVFJZX0RFQUNUSVZBVEUsIERFQUNUSVZBVEVfVFJZX0RFTEFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoU0hPX1NVQ0NFU1MgPT0gcmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFNITy5yZXRyeUNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldlN0YXRlID0gbUlkbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5EZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2YXRlRGV2aWNlKFRhcmdldCwgbVRhcmdldFNITyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkFDVElWQVRFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuREVBQ1RJVkFURV9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1QcmV2U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5TVE9QX1NNOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvaWQgQWN0aXZhdGVEZXZpY2UoRGV2aWNlUHJvZmlsZUNvbWJvIG1UYXJnZXQsIFNIT1JlcSBtVGFyZ2V0U0hPKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gc3RhcnRTaG8obVRhcmdldC5EZXZpY2UsIG1UYXJnZXQuUHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgaWYoU0hPX1BFTkRJTkcgPT0gcmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlID0gbVRhcmdldC5EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuYWJzb2x1dGVEZXZpY2UgPSBtVGFyZ2V0LmFic29sdXRlRGV2aWNlOwotICAgICAgICAgICAgICAgICAgICBDdXJyZW50LlByb2ZpbGUgPSBtVGFyZ2V0LlByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1BdWRpb1R5cGUgPT0gQXVkaW9UeXBlLk1FRElBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kQWN0aXZlRGV2aWNlTWVkaWFVcGRhdGUoQ3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKEV2ZW50LkFDVElWQVRFX1RJTUVPVVQsIEFDVElWQVRFX1RJTUVPVVRfREVMQVkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZXQgPT0gU0hPX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IG1Ccm9hZGNhc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTSE8uZm9yY2VTdG9wQXVkaW8gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJQcmV2aW91cyBzdGF0ZSB3YXMgYnJvYWRjYXN0aW5nLCBtb3ZpbmcgdG8gaWRsZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1QcmV2U3RhdGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihTSE9fU1VDQ0VTUyA9PSByZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5EZXZpY2UgPSBtVGFyZ2V0LkRldmljZTsKLSAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5hYnNvbHV0ZURldmljZSA9IG1UYXJnZXQuYWJzb2x1dGVEZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuUHJvZmlsZSA9IG1UYXJnZXQuUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgaWYobVRhcmdldFNITy5pc0Jyb2FkY2FzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ccm9hZGNhc3RpbmcpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UYXJnZXRTSE8uaXNHYW1pbmdNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUdhbWluZ01vZGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UYXJnZXRTSE8uaXNSZWNvcmRpbmdNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVJlY29yZGluZ01vZGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1BY3RpdmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKEFMUkVBRFlfQUNUSVZFID09IHJldCkgewotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgRGVhY3RpdmF0aW5nIGV4dGVuZHMgU3RhdGUgewotICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IG1EZWFjdGl2YXRpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJldlN0YXRlID09IG1Ccm9hZGNhc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1JZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUYXJnZXQuRGV2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBUYXJnZXQuUHJvZmlsZSA9IEN1cnJlbnQuUHJvZmlsZTsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0U0hPLmNvcHkobVNIT1F1ZXVlKTsKLSAgICAgICAgICAgICAgICBtU0hPUXVldWUucmVzZXQoKTsKLQotICAgICAgICAgICAgICAgIHJldCA9IHN0YXJ0U2hvKFRhcmdldC5EZXZpY2UsIFRhcmdldC5Qcm9maWxlKTsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZXQ6ICIgKyByZXQpOwotICAgICAgICAgICAgICAgIGlmIChTSE9fU1VDQ0VTUyA9PSByZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JZGxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNIT19QRU5ESU5HID09IHJldCkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoRXZlbnQuREVBQ1RJVkFURV9USU1FT1VULCBERUFDVElWQVRFX1RJTUVPVVRfREVMQVkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtUHJldlN0YXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhFdmVudC5ERUFDVElWQVRFX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtRGVhY3RpdmF0aW5nOwotICAgICAgICAgICAgICAgIG1QcmV2QWN0aXZlRGV2aWNlID0gIEN1cnJlbnQuRGV2aWNlOwotICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtUHJldkFjdGl2ZVByb2ZpbGUgPSBDdXJyZW50LlByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgQ3VycmVudC5Qcm9maWxlID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOyAvLyBBZGQgcHJvZmlsZSB2YWx1ZSBoZXJlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJEZWFjdGl2YXRpbmc6IFByb2Nlc3MgTWVzc2FnZSAoIiArIG1BdWRpb1R5cGUgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNFVF9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIk5ldyBTSE8gcmVxdWVzdCB3aGlsZSBoYW5kbGluZyBwcmV2aW91cy4gQWRkIHRvIHF1ZXVlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEZWZlcnJlZE1lc3NhZ2VzKEV2ZW50LlNFVF9BQ1RJVkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5BQ1RJVkVfREVWSUNFX0NIQU5HRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuUkVNT1ZFX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuREVWSUNFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhFdmVudC5ERUFDVElWQVRFX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuREVBQ1RJVkFURV9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1QcmV2U3RhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuU1RPUF9TTToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgQWN0aXZlIGV4dGVuZHMgU3RhdGUgewotICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IG1BY3RpdmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHVwZGF0ZVBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobUF1ZGlvVHlwZSA9PSBBdWRpb1R5cGUuTUVESUEpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kQWN0aXZlRGV2aWNlTWVkaWFVcGRhdGUoQ3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobUF1ZGlvVHlwZSA9PSBBdWRpb1R5cGUuVk9JQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kQWN0aXZlRGV2aWNlVm9pY2VVcGRhdGUoQ3VycmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHR4U3RyZWFtU3VzcGVuZGVkICYmIG1BdWRpb1R5cGUgPT0gQXVkaW9UeXBlLk1FRElBKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UGFyYW1ldGVycygiQTJkcFN1c3BlbmRlZD1mYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICB0eFN0cmVhbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvVHlwZSA9PSBBdWRpb1R5cGUuVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWNlSGFuZG9mZkNvbXBsZXRlLnNpZ25hbCgpOwotICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJWb2ljZSBBY3RpdmU6IHVubG9jayBieSBzaWduYWwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIC8vMiB1cGRhdGUgZGVwZW5kZW50IHByb2ZpbGVzCi0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1BY3RpdmU7Ci0gICAgICAgICAgICAgICAgbVByZXZBY3RpdmVEZXZpY2UgPSBDdXJyZW50LkRldmljZTsKLSAgICAgICAgICAgICAgICBWb2x1bWVNYW5hZ2VyIG1Wb2x1bWVNYW5hZ2VyID0gVm9sdW1lTWFuYWdlci5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZihtVm9sdW1lTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYW5hZ2VyLnNhdmVWb2x1bWUobUF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIGxvZygiQWN0aXZlOiBQcm9jZXNzIE1lc3NhZ2UgKCIgKyBtQXVkaW9UeXBlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5TRVRfQUNUSVZFOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYobVNIT1F1ZXVlLmRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW52YWxpZCByZXF1ZXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUFjdGl2YXRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5BQ1RJVkVfREVWSUNFX0NIQU5HRToKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGhhdmUgdG8gaGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlJFTU9WRV9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURlYWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkRFVklDRV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgLy9taWdodCBoYXZlIHRvIGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5TVE9QX1NNOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EZWFjdGl2YXRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBHYW1pbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgICAgICBpbnQgcmV0OwotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gbUdhbWluZ01vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHVwZGF0ZVBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEFjdGl2ZURldmljZUdhbWluZ1VwZGF0ZShDdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodHhTdHJlYW1TdXNwZW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRQYXJhbWV0ZXJzKCJBMmRwU3VzcGVuZGVkPWZhbHNlIik7Ci0gICAgICAgICAgICAgICAgICAgIHR4U3RyZWFtU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICAvLzIgdXBkYXRlIGRlcGVuZGVudCBwcm9maWxlcwotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtR2FtaW5nTW9kZTsKLSAgICAgICAgICAgICAgICBtUHJldkFjdGl2ZURldmljZSA9IEN1cnJlbnQuRGV2aWNlOwotICAgICAgICAgICAgICAgIFZvbHVtZU1hbmFnZXIgbVZvbHVtZU1hbmFnZXIgPSBWb2x1bWVNYW5hZ2VyLmdldCgpOwotICAgICAgICAgICAgICAgIGlmKG1Wb2x1bWVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXIuc2F2ZVZvbHVtZShtQXVkaW9UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJHYW1pbmc6IFByb2Nlc3MgTWVzc2FnZSAoIiArIG1BdWRpb1R5cGUgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNFVF9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihtU0hPUXVldWUuZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbnZhbGlkIHJlcXVlc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFtU0hPUXVldWUuaXNVSVJlcSAmJiBDdXJyZW50LkRldmljZS5lcXVhbHMobVNIT1F1ZXVlLmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTcHVyaW91cyByZXF1ZXN0IGZvciBzYW1lIGRldmljZS4gSWdub3JlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNIT1F1ZXVlLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKk1lZGlhQXVkaW8gbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYobU1lZGlhQXVkaW8gIT0gbnVsbCAmJiBtTWVkaWFBdWRpby5pc0EyZHBQbGF5aW5nKG1TSE9RdWV1ZS5kZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShtU0hPUXVldWUuaXNCcm9hZGNhc3QgfHwgbVNIT1F1ZXVlLmlzUmVjb3JkaW5nTW9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiR2FtaW5nIHN0cmVhbWluZyBpcyBvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkFDVElWRV9ERVZJQ0VfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlnaHQgaGF2ZSB0byBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuUkVNT1ZFX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGVhY3RpdmF0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuREVWSUNFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL21pZ2h0IGhhdmUgdG8gaGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNUT1BfU006Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURlYWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIEJyb2FkY2FzdGluZyBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBtQnJvYWRjYXN0aW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodXBkYXRlUGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICBhcG1OYXRpdmUuYWN0aXZlRGV2aWNlVXBkYXRlKEN1cnJlbnQuRGV2aWNlLCBDdXJyZW50LlByb2ZpbGUsIG1BdWRpb1R5cGUpOwotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RBY3RpdmVEZXZpY2VDaGFuZ2UoQ3VycmVudC5EZXZpY2UsIEF1ZGlvVHlwZS5NRURJQSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYXZyY3BTdXBwb3J0c0Fic29sdXRlVm9sdW1lKEN1cnJlbnQuRGV2aWNlLmdldEFkZHJlc3MoKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYWN0aXZlIGRldmljZSB0byBudWxsIGluIFZvbHVtZU1hbmFnZXIgd2hpbGUgZW50ZXIgYnJvYWRjYXN0aW5nIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIFZvbHVtZU1hbmFnZXIgbVZvbHVtZU1hbmFnZXIgPSBWb2x1bWVNYW5hZ2VyLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBpZihtVm9sdW1lTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWFuYWdlci5vbkFjdGl2ZURldmljZUNoYW5nZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHJlbWVtYmVyZWRWb2x1bWUgPSAxNTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5oYW5kbGVCbHVldG9vdGhBMmRwQWN0aXZlRGV2aWNlQ2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuRGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHJlbWVtYmVyZWRWb2x1bWUpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHR4U3RyZWFtU3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UGFyYW1ldGVycygiQTJkcFN1c3BlbmRlZD1mYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICB0eFN0cmVhbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtQnJvYWRjYXN0aW5nOwotICAgICAgICAgICAgICAgIG1QcmV2QWN0aXZlRGV2aWNlID0gQ3VycmVudC5EZXZpY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJCcm9hZGNhc3Rpbmc6IFByb2Nlc3MgTWVzc2FnZSAoIiArIG1BdWRpb1R5cGUgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNFVF9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihtU0hPUXVldWUuaXNVSVJlcSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUFjdGl2YXRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5BQ1RJVkVfREVWSUNFX0NIQU5HRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuUkVNT1ZFX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1TSE9RdWV1ZS5kZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGVhY3RpdmF0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1BY3RpdmF0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuREVWSUNFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNUT1BfU006Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURlYWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIFJlY29yZGluZyBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBtUmVjb3JkaW5nTW9kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodXBkYXRlUGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICBzZW5kQWN0aXZlRGV2aWNlUmVjb3JkaW5nVXBkYXRlKEN1cnJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUmVjb3JkaW5nU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgICAgICBtUHJldlN0YXRlID0gbVJlY29yZGluZ01vZGU7Ci0gICAgICAgICAgICAgICAgbVByZXZBY3RpdmVEZXZpY2UgPSBDdXJyZW50LkRldmljZTsKLSAgICAgICAgICAgICAgICBIZWFkc2V0U2VydmljZSBoZnBTZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaGFuZGxlQmx1ZXRvb3RoQTJkcEFjdGl2ZURldmljZUNoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldkFjdGl2ZURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkEyRFBfU0lOSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAtMSk7Ci0gICAgICAgICAgICAgICAgaWYobVJlY29yZGluZ1N1c3BlbmRlZCkgewotICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRQYXJhbWV0ZXJzKCJBMmRwQ2FwdHVyZVN1c3BlbmQ9ZmFsc2UiKTsKLSAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ2FsbEF1ZGlvIG1DYWxsQXVkaW8gPSBDYWxsQXVkaW8uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luQ2FsbCA9IG1DYWxsQXVkaW8gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbEF1ZGlvLmlzVm9pY2VPckNhbGxBY3RpdmUoKTsKLSAgICAgICAgICAgICAgICBpZihpc0luQ2FsbCkgewotICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiIHJlc2V0IHR4U3RyZWFtU3VzcGVuZGVkIGFzIGNhbGwgaXMgYWN0aXZlIiApOwotICAgICAgICAgICAgICAgICAgdHhTdHJlYW1TdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVm9sdW1lTWFuYWdlciBtVm9sdW1lTWFuYWdlciA9IFZvbHVtZU1hbmFnZXIuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYobVZvbHVtZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWFuYWdlci5zYXZlVm9sdW1lKG1BdWRpb1R5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBsb2coIlJlY29yZGluZzogUHJvY2VzcyBNZXNzYWdlICgiICsgbUF1ZGlvVHlwZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcobWVzc2FnZS53aGF0KSk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuU0VUX0FDVElWRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU0hPUXVldWUuZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURlYWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQWN0aXZhdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LkFDVElWRV9ERVZJQ0VfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5SRU1PVkVfREVWSUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EZWFjdGl2YXRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5ERVZJQ0VfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbWlnaHQgaGF2ZSB0byBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEV2ZW50LlNVU1BFTkRfUkVDT1JESU5HOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihtUmVjb3JkaW5nU3VzcGVuZGVkKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UGFyYW1ldGVycygiQTJkcENhcHR1cmVTdXNwZW5kPXRydWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdTdXNwZW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgRXZlbnQuUkVTVU1FX1JFQ09SRElORzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW1SZWNvcmRpbmdTdXNwZW5kZWQpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRQYXJhbWV0ZXJzKCJBMmRwQ2FwdHVyZVN1c3BlbmQ9ZmFsc2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFdmVudC5TVE9QX1NNOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EZWFjdGl2YXRpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbmRBY3RpdmVEZXZpY2VNZWRpYVVwZGF0ZShEZXZpY2VQcm9maWxlQ29tYm8gQ3VycmVudCkgewotICAgICAgICAgICAgaWYoQ3VycmVudC5Qcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSKSB7Ci0gICAgICAgICAgICAgICAgaWYobVByZXZBY3RpdmVEZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RBY3RpdmVEZXZpY2VDaGFuZ2UgKG51bGwsIEF1ZGlvVHlwZS5NRURJQSApOwotICAgICAgICAgICAgICAgICAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyIG1EZXZpY2VNYW5hZ2VyID0gQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKS5nZXRBY3RpdmVEZXZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLm9uQWN0aXZlRGV2aWNlQ2hhbmdlKG51bGwsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmhhbmRsZUJsdWV0b290aEEyZHBBY3RpdmVEZXZpY2VDaGFuZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2QWN0aXZlRGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQLCB0cnVlLCAtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwbU5hdGl2ZS5hY3RpdmVEZXZpY2VVcGRhdGUoQ3VycmVudC5EZXZpY2UsIEN1cnJlbnQuUHJvZmlsZSwgQXVkaW9UeXBlLk1FRElBKTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbmRBY3RpdmVEZXZpY2VNZWRpYVVwZGF0ZTogbVByZXZBY3RpdmVEZXZpY2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVByZXZBY3RpdmVEZXZpY2UgKyAiLCBDdXJyZW50LkRldmljZTogIiArIEN1cnJlbnQuRGV2aWNlKTsKLQotICAgICAgICAgICAgTWVkaWFBdWRpbyBtTWVkaWFBdWRpbyA9IE1lZGlhQXVkaW8uZ2V0KCk7Ci0gICAgICAgICAgICBtTWVkaWFBdWRpby5yZWZyZXNoQ3VycmVudENvZGVjKEN1cnJlbnQuRGV2aWNlKTsKLQotICAgICAgICAgICAgYnJvYWRjYXN0QWN0aXZlRGV2aWNlQ2hhbmdlIChDdXJyZW50LmFic29sdXRlRGV2aWNlLCBBdWRpb1R5cGUuTUVESUEpOwotICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlciBtRGV2aWNlTWFuYWdlciA9IEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCkuZ2V0QWN0aXZlRGV2aWNlTWFuYWdlcigpOwotICAgICAgICAgICAgbURldmljZU1hbmFnZXIub25BY3RpdmVEZXZpY2VDaGFuZ2UoQ3VycmVudC5EZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgaWYoQ3VycmVudC5Qcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUCkgewotICAgICAgICAgICAgICAgIEEyZHBTZXJ2aWNlIG1BMmRwU2VydmljZSA9IEEyZHBTZXJ2aWNlLmdldEEyZHBTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmJyb2FkY2FzdEFjdGl2ZUNvZGVjQ29uZmlnKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLzIgVXBkYXRlIGRlcGVuZGVudCBwcm9maWxlcwotICAgICAgICAgICAgVm9sdW1lTWFuYWdlciBtVm9sdW1lTWFuYWdlciA9IFZvbHVtZU1hbmFnZXIuZ2V0KCk7Ci0gICAgICAgICAgICBpZihtVm9sdW1lTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXIub25BY3RpdmVEZXZpY2VDaGFuZ2UoQ3VycmVudC5EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1jcFNlcnZpY2UgbU1jcFNlcnZpY2UgPSBNY3BTZXJ2aWNlLmdldE1jcFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChtTWNwU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1jcFNlcnZpY2UuU2V0QWN0aXZlRGV2aWNlcyhDdXJyZW50LmFic29sdXRlRGV2aWNlLCBDdXJyZW50LlByb2ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGRldmljZVZvbHVtZSA9IDc7Ci0gICAgICAgICAgICBpZihtVm9sdW1lTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlVm9sdW1lID0gbVZvbHVtZU1hbmFnZXIuZ2V0QWN0aXZlVm9sdW1lKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYobUF1ZGlvTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5oYW5kbGVCbHVldG9vdGhBMmRwQWN0aXZlRGV2aWNlQ2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5EZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVELCBCbHVldG9vdGhQcm9maWxlLkEyRFAsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkZXZpY2VWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZW5kQWN0aXZlRGV2aWNlR2FtaW5nVXBkYXRlKERldmljZVByb2ZpbGVDb21ibyBDdXJyZW50KSB7Ci0gICAgICAgICAgICBhcG1OYXRpdmUuYWN0aXZlRGV2aWNlVXBkYXRlKEN1cnJlbnQuRGV2aWNlLCBDdXJyZW50LlByb2ZpbGUsIEF1ZGlvVHlwZS5NRURJQSk7Ci0KLSAgICAgICAgICAgIE1lZGlhQXVkaW8gbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICAgICAgbU1lZGlhQXVkaW8ucmVmcmVzaEN1cnJlbnRDb2RlYyhDdXJyZW50LkRldmljZSk7Ci0KLSAgICAgICAgICAgIGJyb2FkY2FzdEFjdGl2ZURldmljZUNoYW5nZSAoQ3VycmVudC5hYnNvbHV0ZURldmljZSwgQXVkaW9UeXBlLk1FRElBKTsKLSAgICAgICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXIgbURldmljZU1hbmFnZXIgPSBBZGFwdGVyU2VydmljZS5nZXRBZGFwdGVyU2VydmljZSgpLmdldEFjdGl2ZURldmljZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLm9uQWN0aXZlRGV2aWNlQ2hhbmdlKEN1cnJlbnQuRGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLQotICAgICAgICAgICAgLy8yIFVwZGF0ZSBkZXBlbmRlbnQgcHJvZmlsZXMKLSAgICAgICAgICAgIFZvbHVtZU1hbmFnZXIgbVZvbHVtZU1hbmFnZXIgPSBWb2x1bWVNYW5hZ2VyLmdldCgpOwotICAgICAgICAgICAgaW50IGRldmljZVZvbHVtZSA9IDc7Ci0gICAgICAgICAgICBpZihtVm9sdW1lTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXIub25BY3RpdmVEZXZpY2VDaGFuZ2UoQ3VycmVudC5EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICAgICAgZGV2aWNlVm9sdW1lID0gbVZvbHVtZU1hbmFnZXIuZ2V0QWN0aXZlVm9sdW1lKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYobUF1ZGlvTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5oYW5kbGVCbHVldG9vdGhBMmRwQWN0aXZlRGV2aWNlQ2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5EZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVELCBCbHVldG9vdGhQcm9maWxlLkEyRFAsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkZXZpY2VWb2x1bWUpOwotCi0gICAgICAgICAgICAgICAgLypBZGQgYmFjayBjaGFubmVsIGNhbGwgaGVyZSovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbmRBY3RpdmVEZXZpY2VWb2ljZVVwZGF0ZShEZXZpY2VQcm9maWxlQ29tYm8gQ3VycmVudCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZEFjdGl2ZURldmljZVZvaWNlVXBkYXRlIik7Ci0gICAgICAgICAgICBpZihDdXJyZW50LlByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfQlJFRFIpIHsKLSAgICAgICAgICAgICAgICBpZihtUHJldkFjdGl2ZURldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdEFjdGl2ZURldmljZUNoYW5nZSAobnVsbCwgQXVkaW9UeXBlLlZPSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlciBtRGV2aWNlTWFuYWdlciA9IEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCkuZ2V0QWN0aXZlRGV2aWNlTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlTWFuYWdlci5vbkFjdGl2ZURldmljZUNoYW5nZShDdXJyZW50LkRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJvYWRjYXN0QWN0aXZlRGV2aWNlQ2hhbmdlIChDdXJyZW50LmFic29sdXRlRGV2aWNlLCBBdWRpb1R5cGUuVk9JQ0UpOwotICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlciBtRGV2aWNlTWFuYWdlciA9IEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCkuZ2V0QWN0aXZlRGV2aWNlTWFuYWdlcigpOwotICAgICAgICAgICAgbURldmljZU1hbmFnZXIub25BY3RpdmVEZXZpY2VDaGFuZ2UoQ3VycmVudC5EZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgICAgICBWb2x1bWVNYW5hZ2VyIG1Wb2x1bWVNYW5hZ2VyID0gVm9sdW1lTWFuYWdlci5nZXQoKTsKLSAgICAgICAgICAgIGlmKG1Wb2x1bWVNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lTWFuYWdlci5vbkFjdGl2ZURldmljZUNoYW5nZShDdXJyZW50LkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0NTZXJ2aWNlIGNjU2VydmljZSA9IENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChjY1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNjU2VydmljZS5zZXRBY3RpdmVEZXZpY2UoQ3VycmVudC5hYnNvbHV0ZURldmljZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKG1UYXJnZXRTSE8uUGxheVJlcSkgewotICAgICAgICAgICAgICAgIENhbGxBdWRpbyBtQ2FsbEF1ZGlvID0gQ2FsbEF1ZGlvLmdldCgpOwotICAgICAgICAgICAgICAgIG1DYWxsQXVkaW8uY29ubmVjdEF1ZGlvKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVwZGF0ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VuZEFjdGl2ZURldmljZVJlY29yZGluZ1VwZGF0ZShEZXZpY2VQcm9maWxlQ29tYm8gQ3VycmVudCkgewotICAgICAgICAgICAgYXBtTmF0aXZlLmFjdGl2ZURldmljZVVwZGF0ZShDdXJyZW50LkRldmljZSwgQ3VycmVudC5Qcm9maWxlLCBBdWRpb1R5cGUuTUVESUEpOwotCi0gICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kQWN0aXZlRGV2aWNlUmVjb3JkaW5nVXBkYXRlOiBtUHJldkFjdGl2ZURldmljZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgbVByZXZBY3RpdmVEZXZpY2UgKyAiLCBDdXJyZW50LkRldmljZTogIiArIEN1cnJlbnQuRGV2aWNlKTsKLSAgICAgICAgICAgIE1lZGlhQXVkaW8gbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICAgICAgbU1lZGlhQXVkaW8ucmVmcmVzaEN1cnJlbnRDb2RlYyhDdXJyZW50LkRldmljZSk7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5oYW5kbGVCbHVldG9vdGhBMmRwQWN0aXZlRGV2aWNlQ2hhbmdlKEN1cnJlbnQuRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsIEJsdWV0b290aFByb2ZpbGUuQTJEUF9TSU5LLCBmYWxzZSwgLTEpOyAvLyBUTy1DaGVjawotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1NhbWVQcm9maWxlIChpbnQgcDEsIGludCBwMiwgaW50IGF1ZGlvVHlwZSkgewotICAgICAgICAgICAgaWYocDEgPT0gcDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoYXVkaW9UeXBlID09IEF1ZGlvVHlwZS5NRURJQSkgewotICAgICAgICAgICAgICAgIGludCBsZU1lZGlhTWFzayA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9NRURJQSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfR0NQOwotICAgICAgICAgICAgICAgIGlmKChsZU1lZGlhTWFzayAmIHAxKSA+IDAgJiYgKGxlTWVkaWFNYXNrICYgcDIpID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYoYXVkaW9UeXBlID09IEF1ZGlvVHlwZS5WT0lDRSkgewotICAgICAgICAgICAgICAgIGludCBsZVZvaWNlTWFzayA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9DQUxMIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTDsKLSAgICAgICAgICAgICAgICBpZigobGVWb2ljZU1hc2sgJiBwMSkgPiAwICYmIChsZVZvaWNlTWFzayAmIHAyKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQXVkaW9UeXBlIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgVk9JQ0UgPSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU87Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1FRElBID0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTzsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTSVpFID0gMjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNIT1JlcSB7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2U7Ci0gICAgICAgIGJvb2xlYW4gUGxheVJlcTsKLSAgICAgICAgaW50IHJldHJ5Q291bnQ7Ci0gICAgICAgIGJvb2xlYW4gaXNCcm9hZGNhc3Q7Ci0gICAgICAgIGJvb2xlYW4gaXNHYW1pbmdNb2RlOwotICAgICAgICBib29sZWFuIGlzUmVjb3JkaW5nTW9kZTsKLSAgICAgICAgYm9vbGVhbiBpc1VJUmVxOwotICAgICAgICBib29sZWFuIGZvcmNlU3RvcEF1ZGlvOwotCi0gICAgICAgIHZvaWQgY29weShTSE9SZXEgc3JjKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBzcmMuZGV2aWNlOwotICAgICAgICAgICAgUGxheVJlcSA9IHNyYy5QbGF5UmVxOwotICAgICAgICAgICAgcmV0cnlDb3VudCA9IHNyYy5yZXRyeUNvdW50OwotICAgICAgICAgICAgaXNCcm9hZGNhc3QgPSBzcmMuaXNCcm9hZGNhc3Q7Ci0gICAgICAgICAgICBpc0dhbWluZ01vZGUgPSBzcmMuaXNHYW1pbmdNb2RlOwotICAgICAgICAgICAgaXNSZWNvcmRpbmdNb2RlID0gc3JjLmlzUmVjb3JkaW5nTW9kZTsKLSAgICAgICAgICAgIGlzVUlSZXEgPSBzcmMuaXNVSVJlcTsKLSAgICAgICAgICAgIGZvcmNlU3RvcEF1ZGlvID0gc3JjLmZvcmNlU3RvcEF1ZGlvOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIGRldmljZSA9IG51bGw7Ci0gICAgICAgICAgICBQbGF5UmVxID0gZmFsc2U7Ci0gICAgICAgICAgICByZXRyeUNvdW50ID0gMDsKLSAgICAgICAgICAgIGlzQnJvYWRjYXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpc0dhbWluZ01vZGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlzUmVjb3JkaW5nTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgaXNVSVJlcSA9IGZhbHNlOwotICAgICAgICAgICAgZm9yY2VTdG9wQXVkaW8gPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYXBtL0FwbUNvbnN0LmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9BcG1Db25zdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZhYjBkLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYXBtL0FwbUNvbnN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbTsKLQotcHVibGljIGNsYXNzIEFwbUNvbnN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbGVBdWRpb0VuYWJsZWQgPSBmYWxzZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBncm91cEFkZHJlc3MgPSAiOUU6OEI6MDA6MDA6MDAiOwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldExlQXVkaW9FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbGVBdWRpb0VuYWJsZWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldExlQXVkaW9FbmFibGVkKGJvb2xlYW4gbGVBdWRpb1N1cHBvcnQpIHsKLSAgICAgICAgbGVBdWRpb0VuYWJsZWQgPSBsZUF1ZGlvU3VwcG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF1ZGlvRmVhdHVyZXMgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExfQVVESU8gPSAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9BVURJTyA9IDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExfQ09OVFJPTCA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX0NPTlRST0wgPSAzOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9WT0xVTUVfQ09OVFJPTCA9IDQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExfVk9MVU1FX0NPTlRST0wgPSA1OwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQVVESU8gPSA2OwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFSSU5HX0FJRCA9IDc7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9BVURJT19GRUFUVVJFUyA9IDg7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF1ZGlvUHJvZmlsZXMgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgICAgICAgICAgICA9IDB4MDAwMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQTJEUCAgICAgICAgICAgID0gMHgwMDAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRlAgICAgICAgICAgICAgPSAweDAwMDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWUkNQICAgICAgICAgICA9IDB4MDAwNDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE1BUF9NRURJQSAgICAgID0gMHgwMDA4OwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVBfTUVESUEgICAgICAgPSAweDAwMTA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1DUCAgICAgICAgICAgICA9IDB4MDAyMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0NQICAgICAgICAgICAgID0gMHgwMDQwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ1AgICAgICAgICAgICAgPSAweDAwODA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUF9CUkVEUiAgICAgICA9IDB4MDEwMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFQX0xFICAgICAgICAgID0gMHgwMjAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQlJFRFIgPSAweDA0MDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9MRSAgICA9IDB4MDgwMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE1BUF9DQUxMICAgICAgID0gMHgxMDAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVBfQ0FMTCAgICAgICAgPSAweDIwMDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBUF9HQ1AgICAgICAgICA9IDB4NDAwMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFQX1JFQ09SRElORyAgID0gMHg4MDAwOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vQXBtTmF0aXZlSW50ZXJmYWNlLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9BcG1OYXRpdmVJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzNzAyMy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9BcG1OYXRpdmVJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbTsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi0vKioKLSAqIEEyRFAgTmF0aXZlIEludGVyZmFjZSB0by9mcm9tIEpOSS4KLSAqLwotcHVibGljIGNsYXNzIEFwbU5hdGl2ZUludGVyZmFjZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBcG1OYXRpdmVJbnRlcmZhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLQotICAgIEBHdWFyZGVkQnkoIklOU1RBTkNFX0xPQ0siKQotICAgIHByaXZhdGUgc3RhdGljIEFwbU5hdGl2ZUludGVyZmFjZSBzSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJTlNUQU5DRV9MT0NLID0gbmV3IE9iamVjdCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHJpdmF0ZSBBcG1OYXRpdmVJbnRlcmZhY2UoKSB7Ci0gICAgICAgIG1BZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiTm8gQmx1ZXRvb3RoIEFkYXB0ZXIgQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXBtTmF0aXZlSW50ZXJmYWNlIGdldEluc3RhbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKElOU1RBTkNFX0xPQ0spIHsKLSAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBcG1OYXRpdmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICBpbml0TmF0aXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYW51cCB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICBjbGVhbnVwTmF0aXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IG5ldyBhY3RpdmUgZGV2aWNlIHRvIHN0YWNrLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZTogbmV3IGFjdGl2ZSBkZXZpY2UKLSAgICAgKiBAcGFyYW0gcHJvZmlsZTogbmV3IGFjdGl2ZSBwcm9maWxlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhY3RpdmVEZXZpY2VVcGRhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsIGludCBhdWRpb1R5cGUpIHsKLSAgICAgICAgcmV0dXJuIGFjdGl2ZURldmljZVVwZGF0ZU5hdGl2ZShnZXRCeXRlQWRkcmVzcyhkZXZpY2UpLCBwcm9maWxlLCBhdWRpb1R5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCBDb250ZW50IENvbnRyb2wgSUQgdG8gc3RhY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWQ6IENvbnRlbnQgQ29udHJvbCBJRAotICAgICAqIEBwYXJhbSBwcm9maWxlOiBjb250ZW50IGNvbnRyb2wgcHJvZmlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Q29udGVudENvbnRyb2woaW50IGlkLCBpbnQgcHJvZmlsZSkgewotICAgICAgICByZXR1cm4gc2V0Q29udGVudENvbnRyb2xOYXRpdmUoaWQsIHByb2ZpbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIGdldERldmljZShieXRlW10gYWRkcmVzcykgewotICAgICAgICByZXR1cm4gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVBZGRyZXNzKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gVXRpbHMuZ2V0Qnl0ZXNGcm9tQWRkcmVzcygiMDA6MDA6MDA6MDA6MDA6MDAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVXRpbHMuZ2V0Qnl0ZXNGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICB9Ci0KLSAgICAvL0N1cnJlbnQgbG9naWMgaXMgaW1wbGVtZW50ZWQgb25seSBmb3IgQ0FMTF9BVURJTwotICAgIC8vUHJvcGVyIEF1ZGlvX3R5cGUgbmVlZHMgdG8gYmUgc2VudCB0byBkZXZpY2UgcHJvZmlsZSBtYXAKLSAgICAvL2ZvciBvdGhlciBhdWRpbyBmZWF0dXJlcwotICAgIHByaXZhdGUgaW50IGdldEFjdGl2ZVByb2ZpbGUoYnl0ZVtdIGFkZHJlc3MsIGludCBhdWRpb190eXBlKSB7Ci0gICAgICAgIERldmljZVByb2ZpbGVNYXAgZHBtID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGdldERldmljZShhZGRyZXNzKTsKLSAgICAgICAgaW50IHByb2ZpbGUgPSBkcG0uZ2V0UHJvZmlsZShkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgIHJldHVybiBwcm9maWxlOwotICAgIH0KLQotICAgIC8vIE5hdGl2ZSBtZXRob2RzIHRoYXQgY2FsbCBpbnRvIHRoZSBKTkkgaW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbGVhbnVwTmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBhY3RpdmVEZXZpY2VVcGRhdGVOYXRpdmUoYnl0ZVtdIGFkZHJlc3MsIGludCBwcm9maWxlLCBpbnQgYXVkaW9UeXBlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldENvbnRlbnRDb250cm9sTmF0aXZlKGludCBpZCwgaW50IHByb2ZpbGUpOwotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9DYWxsQXVkaW8uamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYXBtL0NhbGxBdWRpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg0NjkxLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYXBtL0NhbGxBdWRpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQ09OTkVDVDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguaGZwLkhlYWRzZXRTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5oZnAuSGVhZHNldEEyZHBTeW5jOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uQXBtQ29uc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5NZWRpYUF1ZGlvOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uQ2FsbENvbnRyb2w7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5BY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLkFkYXB0ZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5BZGFwdGVyU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5JbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDYWxsQXVkaW8gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2FsbEF1ZGlvIG1DYWxsQXVkaW87Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBUE06IENhbGxBdWRpbyI7Ci0gICAgTWFwPFN0cmluZywgQ2FsbERldmljZT4gbUNhbGxEZXZpY2VzTWFwOwotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIHByaXZhdGUgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBZGFwdGVyU2VydmljZSBtQWRhcHRlclNlcnZpY2U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX1BFUk0gPSBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9BRE1JTl9QRVJNID0gYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFVE9PVEhfUFJJVklMRUdFRCA9Ci0gICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX1BSSVZJTEVHRUQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ERVZJQ0VTID0gMjAwOwotICAgIHB1YmxpYyBib29sZWFuIG1WaXJ0dWFsQ2FsbFN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBDYWxsQ29udHJvbCBtQ2FsbENvbnRyb2wgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBDYWxsQXVkaW8oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxpemF0aW9uIik7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUNhbGxEZXZpY2VzTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQ2FsbERldmljZT4oKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKTsKLSAgICAgICAgbUNhbGxDb250cm9sID0gQ2FsbENvbnRyb2wuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDYWxsQXVkaW8gaW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYobUNhbGxBdWRpbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2FsbEF1ZGlvID0gbmV3IENhbGxBdWRpbyhjb250ZXh0KTsKLSAgICAgICAgICAgIENhbGxBdWRpb0ludGYuaW5pdChtQ2FsbEF1ZGlvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUNhbGxBdWRpbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENhbGxBdWRpbyBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbEF1ZGlvOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgIExvZy5pKFRBRywgImNvbm5lY3Q6ICIgKyBkZXZpY2UpOwotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7Ci0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBib29sZWFuIHN0YXR1czsKLSAgICAgICAgaWYgKGdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKSA9PSBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0ZPUkJJRERFTikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gIiArIGRldmljZSArICIgOiBDT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIERldmljZVByb2ZpbGVNYXAgZE1hcCA9IERldmljZVByb2ZpbGVNYXAuZ2V0RGV2aWNlUHJvZmlsZU1hcEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChkTWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaW50IHByb2ZpbGVJRCA9IGRNYXAuZ2V0U3VwcG9ydGVkUHJvZmlsZShkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgIGlmIChwcm9maWxlSUQgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDYW4gTm90IGNvbm5lY3QgdG8gIiArIGRldmljZSArICIuIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNhbGwgc2VydmljZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENhbGxEZXZpY2UgbUNhbGxEZXZpY2UgPSBtQ2FsbERldmljZXNNYXAuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBpZihtQ2FsbERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZihtQ2FsbERldmljZXNNYXAuc2l6ZSgpID49IE1BWF9ERVZJQ0VTKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIG1DYWxsRGV2aWNlID0gbmV3IENhbGxEZXZpY2UoZGV2aWNlLCBwcm9maWxlSUQpOwotICAgICAgICAgICAgbUNhbGxEZXZpY2VzTWFwLnB1dChkZXZpY2UuZ2V0QWRkcmVzcygpLCBtQ2FsbERldmljZSk7Ci0gICAgICAgIH0gZWxzZSBpZihtQ2FsbERldmljZS5kZXZpY2VDb25uU3RhdHVzICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJEZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCAmIHByb2ZpbGVJRCkgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlApIHsKLSAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2UuY29ubmVjdEhmcChkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIG1TdHJlYW1TZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICBpZihtU3RyZWFtU2VydmljZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwgJiBwcm9maWxlSUQpID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpIHsKLSAgICAgICAgICAgIG1TdHJlYW1TZXJ2aWNlLmNvbm5lY3RMZVN0cmVhbShkZXZpY2UsIHByb2ZpbGVJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCb29sZWFuIGFsbFByb2ZpbGVzKSB7Ci0gICAgICAgIGlmKGFsbFByb2ZpbGVzKSB7Ci0gICAgICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRNYXAgPSBEZXZpY2VQcm9maWxlTWFwLmdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpOwotICAgICAgICAgICAgaWYgKGRNYXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGludCBwcm9maWxlSUQgPSBkTWFwLmdldFN1cHBvcnRlZFByb2ZpbGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgaWYoKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQICYgcHJvZmlsZUlEKSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCkgewotICAgICAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5jb25uZWN0SGZwKGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qQ29tbW9uIGNvbm5lY3QgZm9yIExFIE1lZGlhIGFuZCBDYWxsIGhhbmRsZWQgZnJvbSBTdHJlYW1BdWRpb1NlcnZpY2UqLwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbm5lY3QoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiIGRpc2Nvbm5lY3Q6ICIgKyBkZXZpY2UpOwotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USCBBRE1JTiBwZXJtaXNzaW9uIik7Ci0gICAgICAgIENhbGxEZXZpY2UgbUNhbGxEZXZpY2U7Ci0KLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbUNhbGxEZXZpY2UgPSBtQ2FsbERldmljZXNNYXAuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBpZihtQ2FsbERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmU6IERldmljZSAiICsgZGV2aWNlICsgIiBub3QgcHJlc2VudCBpbiBsaXN0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNhbGxEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbQ2FsbERldmljZS5TQ09fU1RSRUFNXSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgSGVhZHNldFNlcnZpY2Ugc2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmRpc2Nvbm5lY3RIZnAoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCQkKLSAgICAgICAgaWYgKG1DYWxsRGV2aWNlLnByb2ZpbGVDb25uU3RhdHVzW0NhbGxEZXZpY2UuTEVfU1RSRUFNXSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmRpc2Nvbm5lY3RMZVN0cmVhbShkZXZpY2UsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgQm9vbGVhbiBhbGxQcm9maWxlcykgewotICAgICAgICBpZihhbGxQcm9maWxlcykgewotICAgICAgICAgICAgQ2FsbERldmljZSBtQ2FsbERldmljZSA9IG1DYWxsRGV2aWNlc01hcC5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBpZihtQ2FsbERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSWdub3JlOiBEZXZpY2UgIiArIGRldmljZSArICIgbm90IHByZXNlbnQgaW4gbGlzdCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKG1DYWxsRGV2aWNlLnByb2ZpbGVDb25uU3RhdHVzW0NhbGxEZXZpY2UuU0NPX1NUUkVBTV0gIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGlzY29ubmVjdChkZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKkNvbW1vbiBjb25uZWN0IGZvciBMRSBNZWRpYSBhbmQgQ2FsbCBoYW5kbGVkIGZyb20gU3RyZWFtQXVkaW9TZXJ2aWNlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkaXNjb25uZWN0KGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRTY29Vc2luZ1ZpcnR1YWxWb2ljZUNhbGwoKSB7Ci0gICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKLSAgICAgICAgTG9nLmQoVEFHLCAic3RhcnRTY29Vc2luZ1ZpcnR1YWxWb2ljZUNhbGwiKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1BY3RpdmVkZXZpY2UgPSBudWxsOwotICAgICAgICBpbnQgcHJvZmlsZTsKLSAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUFjdGl2ZWRldmljZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgaWYobUFjdGl2ZWRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RhcnRTY29Vc2luZ1ZpcnR1YWxWb2ljZUNhbGwgZmFpbGVkLiBBY3RpdmUgRGV2aWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGVja0EyZHBTdGF0ZSgpOwotCi0gICAgICAgIHByb2ZpbGUgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVQcm9maWxlKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgIHN3aXRjaChwcm9maWxlKSB7Ci0gICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQOgotICAgICAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIGhlYWRzZXRTZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBpZihoZWFkc2V0U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGhlYWRzZXRTZXJ2aWNlLnN0YXJ0U2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaXJ0dWFsQ2FsbFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEw6Ci0gICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9DQUxMOgotICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBtU3RyZWFtQXVkaW9TZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgICAgIGlmKG1TdHJlYW1BdWRpb1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihtU3RyZWFtQXVkaW9TZXJ2aWNlLnN0YXJ0U3RyZWFtKG1BY3RpdmVkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlydHVhbENhbGxTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsQ29udHJvbCA9IENhbGxDb250cm9sLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYWxsQ29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxDb250cm9sLnNldFZpcnR1YWxDYWxsQWN0aXZlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuaGFuZGxlZCBwcm9maWxlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZShUQUcsICJzdGFydFNjb1VzaW5nVmlydHVhbFZvaWNlQ2FsbCBmYWlsZWQuIERldmljZTogIiArIG1BY3RpdmVkZXZpY2UpOwotICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICBIZWFkc2V0U2VydmljZSBzZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0SGZwQTJEUFN5bmNJbnRlcmZhY2UoKS5yZWxlYXNlQTJEUChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcFNjb1VzaW5nVmlydHVhbFZvaWNlQ2FsbCgpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLCAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwotICAgICAgICBMb2cuZChUQUcsICJzdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsIik7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBtQWN0aXZlZGV2aWNlID0gbnVsbDsKLSAgICAgICAgaW50IHByb2ZpbGU7Ci0gICAgICAgIG1BY3RpdmVEZXZpY2VNYW5hZ2VyID0gQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgIGlmKG1BY3RpdmVEZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BY3RpdmVkZXZpY2UgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgIGlmKG1BY3RpdmVkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInN0b3BTY29Vc2luZ1ZpcnR1YWxWb2ljZUNhbGwgZmFpbGVkLiBBY3RpdmUgRGV2aWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9maWxlID0gbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlUHJvZmlsZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICBzd2l0Y2gocHJvZmlsZSkgewotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUDoKLSAgICAgICAgICAgICAgICBIZWFkc2V0U2VydmljZSBoZWFkc2V0U2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYoaGVhZHNldFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtVmlydHVhbENhbGxTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkc2V0U2VydmljZS5zdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9DQUxMOgotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfQ0FMTDoKLSAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2UgbVN0cmVhbUF1ZGlvU2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBpZihtU3RyZWFtQXVkaW9TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZpcnR1YWxDYWxsU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtQ2FsbENvbnRyb2wgPSBDYWxsQ29udHJvbC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DYWxsQ29udHJvbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbENvbnRyb2wuc2V0VmlydHVhbENhbGxBY3RpdmUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtU3RyZWFtQXVkaW9TZXJ2aWNlLnN0b3BTdHJlYW0obUFjdGl2ZWRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmhhbmRsZWQgcHJvZmlsZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmUoVEFHLCAic3RvcFNjb1VzaW5nVmlydHVhbFZvaWNlQ2FsbCBmYWlsZWQuIERldmljZTogIiArIG1BY3RpdmVkZXZpY2UpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdGVEaXNjb25uZWN0VmlydHVhbFZvaWNlQ2FsbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSBtQWN0aXZlRGV2aWNlTWFuYWdlciA9IEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLmdldCgpOwotICAgICAgICBpZihkZXZpY2UuZXF1YWxzKG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuaXNTdGFibGVTdGF0ZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pKSB7Ci0gICAgICAgICAgICBzdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgZ2V0UHJvZmlsZShCbHVldG9vdGhEZXZpY2UgbURldmljZSkgewotICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRNYXAgPSBEZXZpY2VQcm9maWxlTWFwLmdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpOwotICAgICAgICBpbnQgcHJvZmlsZUlEID0gZE1hcC5nZXRQcm9maWxlKG1EZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgIExvZy5kKFRBRywiIGdldFByb2ZpbGUgZm9yIGRldmljZSAiICsgbURldmljZSArICIgcHJvZmlsZUlEICIgKyBwcm9maWxlSUQpOwotICAgICAgICByZXR1cm4gcHJvZmlsZUlEOwotICAgIH0KLQotICAgIHZvaWQgY2hlY2tBMmRwU3RhdGUoKSB7Ci0gICAgICAgIE1lZGlhQXVkaW8gc01lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2Ugc01lZGlhQWN0aXZlZGV2aWNlID0KLSAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlRGV2aWNlKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAvL2lmKHNNZWRpYUF1ZGlvLmlzQTJkcFBsYXlpbmcoc01lZGlhQWN0aXZlZGV2aWNlKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCIgc3VzcGVuZEEyRFAgaXNBMmRwUGxheWluZyB0cnVlICIgKyAiIGZvciBkZXZpY2UgIiArIHNNZWRpYUFjdGl2ZWRldmljZSk7Ci0gICAgICAgICAgICBpbnQgcHJvZmlsZUlEID0gbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgIGlmKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQICE9IHByb2ZpbGVJRCkgewotICAgICAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICAgICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldEhmcEEyRFBTeW5jSW50ZXJmYWNlKCkuc3VzcGVuZEEyRFAoCi0gICAgICAgICAgICAgICAgICAgIEhlYWRzZXRBMmRwU3luYy5BMkRQX1NVU1BFTkRFRF9CWV9DU19DQUxMLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8vfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3RBdWRpbygpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLCAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZWRldmljZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gc3RhdHVzID0gZmFsc2U7Ci0KLSAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVkZXZpY2UgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJjb25uZWN0QXVkaW86IGRldmljZT0iICsgbUFjdGl2ZWRldmljZSArICIsICIgKyBVdGlscy5nZXRVaWRQaWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgaW50IHByb2ZpbGVJRCA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZVByb2ZpbGUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgY2hlY2tBMmRwU3RhdGUoKTsKLQotICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCA9PSBwcm9maWxlSUQpIHsKLSAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gc2VydmljZS5jb25uZWN0QXVkaW8obUFjdGl2ZWRldmljZSk7Ci0gICAgICAgIH0gZWxzZSBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9DQUxMID09IHByb2ZpbGVJRCkgewotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIHNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLnN0YXJ0U3RyZWFtKG1BY3RpdmVkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5oYW5kbGVkIGNvbm5lY3QgYXVkaW8gcmVxdWVzdCBmb3IgcHJvZmlsZTogIiArIHByb2ZpbGVJRCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHN0YXR1cyA9PSBmYWxzZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZmFpbGVkIGNvbm5lY3QgYXVkaW8gcmVxdWVzdCBmb3IgZGV2aWNlOiAiICsgbUFjdGl2ZWRldmljZSk7Ci0gICAgICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCAhPSBwcm9maWxlSUQpIHsKLSAgICAgICAgICAgICAgICBIZWFkc2V0U2VydmljZSBzZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRIZnBBMkRQU3luY0ludGVyZmFjZSgpLnJlbGVhc2VBMkRQKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEF1ZGlvKCkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBtQWN0aXZlZGV2aWNlID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBtU3RhdHVzID0gZmFsc2U7Ci0KLSAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVkZXZpY2UgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJkaXNjb25uZWN0QXVkaW86IGRldmljZT0iICsgbUFjdGl2ZWRldmljZSArICIsICIgKyBVdGlscy5nZXRVaWRQaWRTdHJpbmcoKSk7Ci0KLSAgICAgICAgaW50IHByb2ZpbGVJRCA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZVByb2ZpbGUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLQotICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCA9PSBwcm9maWxlSUQpIHsKLSAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdHVzID0gc2VydmljZS5kaXNjb25uZWN0QXVkaW8oKTsKLSAgICAgICAgfSBlbHNlIGlmKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwgPT0gcHJvZmlsZUlEKSB7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXMgPSBzZXJ2aWNlLnN0b3BTdHJlYW0obUFjdGl2ZWRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbmhhbmRsZWQgZGlzY29ubmVjdEF1ZGlvIHJlcXVlc3QgZm9yIHByb2ZpbGU6ICIgKyBwcm9maWxlSUQpOwotICAgICAgICAgICAgbVN0YXR1cyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCAhPSBwcm9maWxlSUQpIHsKLSAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRIZnBBMkRQU3luY0ludGVyZmFjZSgpLnJlbGVhc2VBMkRQKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSW50ZWdlciBjb25uZWN0aW9uUG9saWN5KSB7Ci0gICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUFJJVklMRUdFRCwKLSAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfUFJJVklMRUdFRCBwZXJtaXNzaW9uIik7Ci0gICAgICAgIGJvb2xlYW4gbVN0YXR1czsKLQotICAgICAgICBMb2cuZChUQUcsICJzZXRDb25uZWN0aW9uUG9saWN5OiBkZXZpY2U9IiArIGRldmljZQotICAgICAgICAgICAgKyAiLCBjb25uZWN0aW9uUG9saWN5PSIgKyBjb25uZWN0aW9uUG9saWN5ICsgIiwgIiArIFV0aWxzLmdldFVpZFBpZFN0cmluZygpKTsKLQotICAgICAgICBtU3RhdHVzID0gbUFkYXB0ZXJTZXJ2aWNlLmdldERhdGFiYXNlKCkKLSAgICAgICAgICAgIC5zZXRQcm9maWxlQ29ubmVjdGlvblBvbGljeShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCwgY29ubmVjdGlvblBvbGljeSk7Ci0KLSAgICAgICAgaWYgKG1TdGF0dXMgJiYKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uUG9saWN5ID09IEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfQUxMT1dFRCkgewotICAgICAgICAgICAgY29ubmVjdChkZXZpY2UpOwotICAgICAgICB9IGVsc2UgaWYgKG1TdGF0dXMgJiYKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uUG9saWN5ID09IEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfRk9SQklEREVOKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUG9saWN5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYobUFkYXB0ZXJTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBjb25uUG9saWN5OwotICAgICAgICAgICAgY29ublBvbGljeSA9IG1BZGFwdGVyU2VydmljZS5nZXREYXRhYmFzZSgpCi0gICAgICAgICAgICAgICAgLmdldFByb2ZpbGVDb25uZWN0aW9uUG9saWN5KGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImdldENvbm5lY3Rpb25Qb2xpY3k6IGRldmljZT0iICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGlvblBvbGljeT0iICsgY29ublBvbGljeSk7Ci0gICAgICAgICAgICByZXR1cm4gY29ublBvbGljeTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX1VOS05PV047Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXVkaW9TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEOwotICAgICAgICBDYWxsRGV2aWNlIG1DYWxsRGV2aWNlOwotICAgICAgICBtQ2FsbERldmljZSA9IG1DYWxsRGV2aWNlc01hcC5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGlmIChtQ2FsbERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJnZXRBdWRpb1N0YXRlOiBkZXZpY2UgIiArIGRldmljZSArICIgd2FzIG5ldmVyIGNvbm5lY3RlZC9jb25uZWN0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DYWxsRGV2aWNlLnNjb1N0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXROb25JZGxlQXVkaW9EZXZpY2VzKCkgewotICAgICAgICBpZihtQ2FsbERldmljZXNNYXAuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoQ2FsbERldmljZSBtQ2FsbERldmljZSA6IG1DYWxsRGV2aWNlc01hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKG1DYWxsRGV2aWNlLnNjb1N0YXR1cyAhPSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKG1DYWxsRGV2aWNlLm1EZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXVkaW9PbigpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotICAgICAgICBpbnQgbnVtQ29ubmVjdGVkQXVkaW9EZXZpY2VzID0gZ2V0Tm9uSWRsZUF1ZGlvRGV2aWNlcygpLnNpemUoKTsKLSAgICAgICAgTG9nLmQoVEFHLCIgaXNBdWRpb09uOiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNvbm5lY3RlZCBkZXZpY2VzICIKLSAgICAgICAgICAgICAgICAgICAgICArIG51bUNvbm5lY3RlZEF1ZGlvRGV2aWNlcyk7Ci0gICAgICAgICAgICAgcmV0dXJuIG51bUNvbm5lY3RlZEF1ZGlvRGV2aWNlcyA+IDA7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7Ci0gICAgICAgIExvZy5pKFRBRywgImdldENvbm5lY3RlZERldmljZXM6ICIpOwotICAgICAgICBpZihtQ2FsbERldmljZXNNYXAuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIm5vIGRldmljZSBpcyBDb25uZWN0ZWQ6Iik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZERldmljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yKENhbGxEZXZpY2UgbUNhbGxEZXZpY2UgOiBtQ2FsbERldmljZXNNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmKG1DYWxsRGV2aWNlLmRldmljZUNvbm5TdGF0dXMgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0ZWREZXZpY2VzLmFkZChtQ2FsbERldmljZS5tRGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJDb25uZWN0ZWREZXZpY2VzOiA9ICIgKyBjb25uZWN0ZWREZXZpY2VzLnNpemUoKSk7Ci0gICAgICAgIHJldHVybiBjb25uZWN0ZWREZXZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotCi0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBDYWxsRGV2aWNlIG1DYWxsRGV2aWNlOwotICAgICAgICBtQ2FsbERldmljZSA9IG1DYWxsRGV2aWNlc01hcC5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGlmKG1DYWxsRGV2aWNlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbUNhbGxEZXZpY2UuZGV2aWNlQ29ublN0YXR1czsKLQotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2ljZU9yQ2FsbEFjdGl2ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZvaWNlQWN0aXZlID0gaXNBdWRpb09uKCkgfHwgbVZpcnR1YWxDYWxsU3RhcnRlZDsKLSAgICAgICAgSGVhZHNldFNlcnZpY2UgbUhlYWRzZXRTZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLSAgICAgICAgaWYobUhlYWRzZXRTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzVm9pY2VBY3RpdmUgPSBpc1ZvaWNlQWN0aXZlIHx8IG1IZWFkc2V0U2VydmljZS5pc1Njb09yQ2FsbEFjdGl2ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1ZvaWNlQWN0aXZlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3RDb25uU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGZyb21TdGF0ZSwgaW50IHRvU3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCJicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUgIiArIGRldmljZSArICI6ICIgKyBmcm9tU3RhdGUgKyAiLT4iICsgdG9TdGF0ZSk7Ci0gICAgICAgIEhlYWRzZXRTZXJ2aWNlIG1IZWFkc2V0U2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsImJyb2FkY2FzdENvbm5lY3Rpb25TdGF0ZTogSGVhZHNldFNlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBSZXR1cm4hIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgZnJvbVN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIHRvU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1IZWFkc2V0U2VydmljZS5zZW5kQnJvYWRjYXN0QXNVc2VyKGludGVudCwgVXNlckhhbmRsZS5BTEwsCi0gICAgICAgICAgICAgICAgQkxVRVRPT1RIX0NPTk5FQ1QsIFV0aWxzLmdldFRlbXBBbGxvd2xpc3RCcm9hZGNhc3RPcHRpb25zKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3RBdWRpb1N0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBmcm9tU3RhdGUsIGludCB0b1N0YXRlKSB7Ci0gICAgICAgICBMb2cuZChUQUcsImJyb2FkY2FzdEF1ZGlvU3RhdGUgIiArIGRldmljZSArICI6ICIgKyBmcm9tU3RhdGUgKyAiLT4iICsgdG9TdGF0ZSk7Ci0gICAgICAgIEhlYWRzZXRTZXJ2aWNlIG1IZWFkc2V0U2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsImJyb2FkY2FzdEF1ZGlvU3RhdGU6IEhlYWRzZXRTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gUmV0dXJuISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQVVESU9fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1BSRVZJT1VTX1NUQVRFLCBmcm9tU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgdG9TdGF0ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBtSGVhZHNldFNlcnZpY2Uuc2VuZEJyb2FkY2FzdEFzVXNlcihpbnRlbnQsIFVzZXJIYW5kbGUuQUxMLAotICAgICAgICAgICAgICAgIEJMVUVUT09USF9DT05ORUNULCBVdGlscy5nZXRUZW1wQWxsb3dsaXN0QnJvYWRjYXN0T3B0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNvbm5TdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIHN0YXRlLCBJbnRlZ2VyIHByb2ZpbGUpIHsKLSAgICAgICAgaW50IHByZXZTdGF0ZTsKLSAgICAgICAgTG9nLncoVEFHLCAib25Db25uU3RhdGVDaGFuZ2U6IHByb2ZpbGU6ICIgKyBwcm9maWxlICsgIiBzdGF0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXRlICsgIiBmb3IgZGV2aWNlICIgKyBkZXZpY2UpOwotICAgICAgICBpZihkZXZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgQ2FsbERldmljZSBtQ2FsbERldmljZSA9IG1DYWxsRGV2aWNlc01hcC5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgaWYobUNhbGxEZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYobUNhbGxEZXZpY2VzTWFwLnNpemUoKSA+PSBNQVhfREVWSUNFUykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsRGV2aWNlID0gbmV3IENhbGxEZXZpY2UoZGV2aWNlLCBwcm9maWxlLCBzdGF0ZSk7Ci0gICAgICAgICAgICBtQ2FsbERldmljZXNNYXAucHV0KGRldmljZS5nZXRBZGRyZXNzKCksIG1DYWxsRGV2aWNlKTsKLSAgICAgICAgICAgIGJyb2FkY2FzdENvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVELCBzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcHJvZmlsZUluZGV4ID0gbUNhbGxEZXZpY2UuZ2V0UHJvZmlsZUluZGV4KHByb2ZpbGUpOwotICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRNYXAgPSBEZXZpY2VQcm9maWxlTWFwLmdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpOwotICAgICAgICBwcmV2U3RhdGUgPSBtQ2FsbERldmljZS5kZXZpY2VDb25uU3RhdHVzOwotICAgICAgICBtQ2FsbERldmljZS5wcm9maWxlQ29ublN0YXR1c1twcm9maWxlSW5kZXhdID0gc3RhdGU7Ci0KLSAgICAgICAgaWYoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIGRNYXAucHJvZmlsZUNvbm5lY3Rpb25VcGRhdGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHByb2ZpbGUsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBvdGhlclByb2ZpbGVDb25uZWN0aW9uU3RhdGUgPSBtQ2FsbERldmljZS5wcm9maWxlQ29ublN0YXR1c1socHJvZmlsZUluZGV4KzEpJTJdOwotICAgICAgICBMb2cudyhUQUcsICIgb3RoZXJQcm9maWxlQ29ubmVjdGlvblN0YXRlOiAiICsgb3RoZXJQcm9maWxlQ29ubmVjdGlvblN0YXRlKTsKLQotICAgICAgICBzd2l0Y2gob3RoZXJQcm9maWxlQ29ubmVjdGlvblN0YXRlKSB7Ci0gICAgICAgIC8qU2VuZCBCcm9hZGNhc3QgYmFzZWQgb24gc3RhdGUgb2Ygb3RoZXIgcHJvZmlsZSovCi0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIHByZXZTdGF0ZSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIG1DYWxsRGV2aWNlLmRldmljZUNvbm5TdGF0dXMgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICBpZihzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3VwcG9ydGVkUHJvZmlsZXMgPSBkTWFwLmdldFN1cHBvcnRlZFByb2ZpbGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgICAgICAgICBpZihwcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRlZFByb2ZpbGVzICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTCkgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdCBMRSBWb2ljZSBhZnRlciBIRlAgYXV0byBjb25uZWN0IGZyb20gcmVtb3RlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2UgbVN0cmVhbVNlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihtU3RyZWFtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVNlcnZpY2UuY29ubmVjdExlU3RyZWFtKGRldmljZSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSBtQWN0aXZlRGV2aWNlTWFuYWdlciA9IEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuc2V0QWN0aXZlRGV2aWNlKGRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGludCBwcmVmZXJyZWRQcm9maWxlID0gZE1hcC5nZXRQcm9maWxlKGRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJlZmVycmVkUHJvZmlsZSA9IChwcmVmZXJyZWRQcm9maWxlID09IHByb2ZpbGUpOwotICAgICAgICAgICAgICAgIGlmKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEICYmIGlzUHJlZmVycmVkUHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RDb25uU3RhdGVDaGFuZ2UoZGV2aWNlLCBwcmV2U3RhdGUsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxEZXZpY2UuZGV2aWNlQ29ublN0YXR1cyA9IHN0YXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGlmKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0Q29ublN0YXRlQ2hhbmdlKGRldmljZSwgcHJldlN0YXRlLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsRGV2aWNlLmRldmljZUNvbm5TdGF0dXMgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGlmKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHByZXZTdGF0ZSAhPSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0Q29ublN0YXRlQ2hhbmdlKGRldmljZSwgcHJldlN0YXRlLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbERldmljZS5kZXZpY2VDb25uU3RhdHVzID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlTWFuYWdlci5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBpZihwcmV2U3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIHByZXZTdGF0ZSwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxEZXZpY2UuZGV2aWNlQ29ublN0YXR1cyA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGV2aWNlLmVxdWFscyhtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlTWFuYWdlci5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgIGRNYXAucHJvZmlsZUNvbm5lY3Rpb25VcGRhdGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8sIHByb2ZpbGUsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25BdWRpb1N0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgc3RhdGUpIHsKLSAgICAgICAgaW50IHByZXZTdGF0dXM7Ci0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBDYWxsRGV2aWNlIG1DYWxsRGV2aWNlID0gbUNhbGxEZXZpY2VzTWFwLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgaWYobUNhbGxEZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobUNhbGxEZXZpY2Uuc2NvU3RhdHVzID09IHN0YXRlKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEhlYWRzZXRTZXJ2aWNlIHNlcnZpY2UgPSBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpOwotICAgICAgICBpbnQgcHJvZmlsZUlEID0gbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZWRldmljZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZighKHNlcnZpY2Uuc2hvdWxkQ2FsbEF1ZGlvQmVBY3RpdmUoKSB8fCBtVmlydHVhbENhbGxTdGFydGVkKSkgewotICAgICAgICAgICAgICAgIGlmKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwgID09IHByb2ZpbGVJRCkgewotICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2UgbVN0cmVhbUF1ZGlvU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobVN0cmVhbUF1ZGlvU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYWxsIG5vdCBhY3RpdmUsIGRpc2Nvbm5lY3Qgc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQXVkaW9TZXJ2aWNlLnN0b3BTdHJlYW0obUFjdGl2ZWRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2U3RhdHVzID0gbUNhbGxEZXZpY2Uuc2NvU3RhdHVzOwotICAgICAgICBtQ2FsbERldmljZS5zY29TdGF0dXMgPSBzdGF0ZTsKLSAgICAgICAgVm9sdW1lTWFuYWdlciBtVm9sdW1lTWFuYWdlciA9IFZvbHVtZU1hbmFnZXIuZ2V0KCk7Ci0gICAgICAgIG1Wb2x1bWVNYW5hZ2VyLnVwZGF0ZVN0cmVhbVN0YXRlKGRldmljZSwgc3RhdGUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgIGJyb2FkY2FzdEF1ZGlvU3RhdGUoZGV2aWNlLCBwcmV2U3RhdHVzLCBzdGF0ZSk7Ci0gICAgICAgIGlmKHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCAhPSBwcm9maWxlSUQpIHsKLSAgICAgICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRIZnBBMkRQU3luY0ludGVyZmFjZSgpLnJlbGVhc2VBMkRQKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAvL21BdWRpb01hbmFnZXIuc2V0Qmx1ZXRvb3RoU2NvT24oZmFsc2UpOwotICAgICAgICB9IC8qZWxzZSB7Ci0gICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRCbHVldG9vdGhTY29Pbih0cnVlKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9QYXJhbShTdHJpbmcgcGFyYW0pIHsKLSAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRQYXJhbWV0ZXJzKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCbHVldG9vdGhTY29Pbihib29sZWFuIG9uKSB7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIuc2V0Qmx1ZXRvb3RoU2NvT24ob24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBdWRpb01hbmFnZXIgZ2V0QXVkaW9NYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gbUF1ZGlvTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBjbGFzcyBDYWxsRGV2aWNlIHsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7Ci0gICAgICAgIGludFtdIHByb2ZpbGVDb25uU3RhdHVzID0gbmV3IGludFsyXTsKLSAgICAgICAgaW50IGRldmljZUNvbm5TdGF0dXM7Ci0gICAgICAgIGludCBzY29TdGF0dXM7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NPX1NUUkVBTSA9IDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFX1NUUkVBTSA9IDE7Ci0KLSAgICAgICAgQ2FsbERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgaWYocHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVDb25uU3RhdHVzW1NDT19TVFJFQU1dID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUNvbm5TdGF0dXNbTEVfU1RSRUFNXSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlQ29ublN0YXR1c1tMRV9TVFJFQU1dID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUNvbm5TdGF0dXNbU0NPX1NUUkVBTV0gPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZUNvbm5TdGF0dXMgPSBzdGF0ZTsKLSAgICAgICAgICAgIHNjb1N0YXR1cyA9IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEOzsKLSAgICAgICAgfQotCi0gICAgICAgIENhbGxEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUpIHsKLSAgICAgICAgICAgIHRoaXMoZGV2aWNlLCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFByb2ZpbGVJbmRleChpbnQgcHJvZmlsZSkgewotICAgICAgICAgICAgaWYocHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCkKLSAgICAgICAgICAgICAgICByZXR1cm4gU0NPX1NUUkVBTTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gTEVfU1RSRUFNOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9DYWxsQ29udHJvbC5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vQ2FsbENvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlNWZkMS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9DYWxsQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5oZnAuSGVhZHNldFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmhmcC5IZWFkc2V0U3lzdGVtSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uQXBtQ29uc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmNjLkNDU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGVsZWNvbS5QaG9uZUFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi1wdWJsaWMgY2xhc3MgQ2FsbENvbnRyb2wgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2FsbENvbnRyb2wgbUNhbGxDb250cm9sOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FsbENvbnRyb2wiOwotICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NDRW5hYmxlZCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBDYWxsQ29udHJvbChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiSW5pdGlhbGl6YXRpb24iKTsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZihtQ2FsbENvbnRyb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxDb250cm9sID0gbmV3IENhbGxDb250cm9sKGNvbnRleHQpOwotICAgICAgICAgQ2FsbENvbnRyb2xJbnRmLmluaXQobUNhbGxDb250cm9sKTsKLSAgICAgICAgfQotICAgICAgICBpc0NDRW5hYmxlZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5jYyIsIHRydWUpOwotICAgICAgICBMb2cuZChUQUcsICJpc0NDRW5hYmxlZCIgKyBpc0NDRW5hYmxlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDYWxsQ29udHJvbCBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbENvbnRyb2w7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGhvbmVTdGF0ZUNoYW5nZWQoSW50ZWdlciBudW1BY3RpdmUsIEludGVnZXIgbnVtSGVsZCwgSW50ZWdlciBjYWxsU3RhdGUsIFN0cmluZyBudW1iZXIsCi0gICAgICAgICAgICBJbnRlZ2VyIHR5cGUsIFN0cmluZyBuYW1lLCBCb29sZWFuIGlzVmlydHVhbENhbGwpIHsKLSAgICAgICBMb2cuZChUQUcsICJwaG9uZVN0YXRlQ2hhbmdlZCIpOwotICAgICAgIGlmKGlzQ0NFbmFibGVkID09IHRydWUpIHsKLSAgICAgICAgIENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKS5waG9uZVN0YXRlQ2hhbmdlZChudW1BY3RpdmUsIG51bUhlbGQsY2FsbFN0YXRlLG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG5hbWUsIGlzVmlydHVhbENhbGwpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXJ0dWFsQ2FsbEFjdGl2ZShib29sZWFuIHN0YXRlKSB7Ci0gICAgICAgaWYoaXNDQ0VuYWJsZWQgPT0gdHJ1ZSkgewotICAgICAgICAgIENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKS5zZXRWaXJ0dWFsQ2FsbEFjdGl2ZShzdGF0ZSk7Ci0gICAgICAgfQotICAgIH0KLQotICAgcHVibGljIHZvaWQgY2xjY1Jlc3BvbnNlKEludGVnZXIgaW5kZXgsIEludGVnZXIgZGlyZWN0aW9uLCBJbnRlZ2VyIHN0YXR1cywgSW50ZWdlciBtb2RlLCBCb29sZWFuIG1wdHksCi0gICAgICAgICAgICAgICAgU3RyaW5nIG51bWJlciwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICBMb2cuZChUQUcsICJjbGNjUmVzcG9uc2UiKTsKLSAgICAgIGlmIChpc0NDRW5hYmxlZCA9PSB0cnVlKSB7Ci0gICAgICAgIENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKS5jbGNjUmVzcG9uc2UoaW5kZXgsIGRpcmVjdGlvbiwgc3RhdHVzLCBtb2RlLCBtcHR5LCBudW1iZXIsIHR5cGUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJlYXJlclRlY2hub2xvZ3koSW50ZWdlciB0ZWNoKSB7Ci0gICAgICAgTG9nLmQoVEFHLCAidXBkYXRlQmVhcmVyVGVjaG5vbG9neSIpOwotICAgICAgIGlmIChpc0NDRW5hYmxlZCA9PSB0cnVlKSB7Ci0gICAgICAgICBDQ1NlcnZpY2UuZ2V0Q0NTZXJ2aWNlKCkudXBkYXRlQmVhcmVyUHJvdmlkZXJUZWNobm9sb2d5KHRlY2gpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTaWduYWxTdGF0dXMoSW50ZWdlciBzaWduYWwpIHsKLSAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVTaWduYWxTdGF0dXMiKTsKLSAgICAgICBpZiAoaXNDQ0VuYWJsZWQgPT0gdHJ1ZSkgewotICAgICAgICAgQ0NTZXJ2aWNlLmdldENDU2VydmljZSgpLnVwZGF0ZVNpZ25hbFN0cmVuZ3RoKHNpZ25hbCk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJlYXJlck5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVCZWFyZXJQcm92aWRlck5hbWUiKTsKLSAgICAgICBpZiAoaXNDQ0VuYWJsZWQgPT0gdHJ1ZSkgewotICAgICAgICAgQ0NTZXJ2aWNlLmdldENDU2VydmljZSgpLnVwZGF0ZUJlYXJlclByb3ZpZGVyTmFtZShuYW1lKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlT3JpZ2luYXRlUmVzdWx0KEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgZXZlbnQsIEludGVnZXIgcmVzKSB7Ci0gICAgICAgTG9nLmQoVEFHLCAidXBkYXRlT3JpZ2luYXRlUmVzdWx0Iik7Ci0gICAgICAgaWYgKGlzQ0NFbmFibGVkID09IHRydWUpIHsKLSAgICAgICAgIENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKS51cGRhdGVPcmlnaW5hdGVSZXN1bHQoZGV2aWNlLCBldmVudCwgcmVzKTsKLSAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsaXN0ZW5Gb3JQaG9uZVN0YXRlIChpbnQgZXZlbnRzKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImxpc3RlbkZvclBob25lU3RhdGUiKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGR1bW15RGV2aWNlID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpLmdldFJlbW90ZURldmljZSgiQ0M6Q0M6Q0M6Q0M6Q0M6Q0MiKTsKLSAgICAgICAgSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKS5nZXRTeXN0ZW1JbnRlcmZhY2VPYmooKS5nZXRIZWFkc2V0UGhvbmVTdGF0ZSgpLmxpc3RlbkZvclBob25lU3RhdGUoZHVtbXlEZXZpY2UsIGV2ZW50cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFuc3dlckNhbGwgKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYW5zd2VyQ2FsbCIpOwotICAgICAgICBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpLmdldFN5c3RlbUludGVyZmFjZU9iaigpLmFuc3dlckNhbGwoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZ3VwQ2FsbCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJoYW5ndXBDYWxsIik7Ci0gICAgICAgIEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCkuZ2V0U3lzdGVtSW50ZXJmYWNlT2JqKCkuaGFuZ3VwQ2FsbChkZXZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXJtaW5hdGVDYWxsIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAidGVybWluYXRlQ2FsbCIpOwotICAgICAgICBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpLmdldFN5c3RlbUludGVyZmFjZU9iaigpLnRlcm1pbmF0ZUNhbGwoZGV2aWNlLCBpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2Nlc3NDaGxkIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgY2hsZCkgewotICAgICAgICBMb2cuZChUQUcsICJwcm9jZXNzQ2hsZCIpOwotICAgICAgICByZXR1cm4gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKS5nZXRTeXN0ZW1JbnRlcmZhY2VPYmooKS5wcm9jZXNzQ2hsZChjaGxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaG9sZENhbGwgKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBpbmRleCkgewotICAgICAgICBMb2cuZChUQUcsICJob2xkQ2FsbCIpOwotICAgICAgICByZXR1cm4gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKS5nZXRTeXN0ZW1JbnRlcmZhY2VPYmooKS5ob2xkQ2FsbChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxpc3RDdXJyZW50Q2FsbHMgKCkgewotICAgICAgICBMb2cuZChUQUcsICJsaXN0Q3VycmVudENhbGxzIik7Ci0gICAgICAgIHJldHVybiBIZWFkc2V0U2VydmljZS5nZXRIZWFkc2V0U2VydmljZSgpLmdldFN5c3RlbUludGVyZmFjZU9iaigpLmxpc3RDdXJyZW50Q2FsbHMoKTsKLSAgICB9Ci0KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaWFsT3V0Z29pbmdDYWxsKEJsdWV0b290aERldmljZSBmcm9tRGV2aWNlLCBTdHJpbmcgZGlhbE51bWJlcikgewotICAgICAgICBMb2cuaShUQUcsICJkaWFsT3V0Z29pbmdDYWxsOiBmcm9tICIgKyBmcm9tRGV2aWNlKTsKLSAgICAgICAgSGVhZHNldFNlcnZpY2Ugc2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2UuZGlhbE91dGdvaW5nQ2FsbEludGVybmFsKGZyb21EZXZpY2UsIGRpYWxOdW1iZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaWFsIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBTdHJpbmcgZGlhbE51bWJlcikgewotICAgICAgICBkaWFsT3V0Z29pbmdDYWxsKGRldmljZSwgZGlhbE51bWJlcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9EZXZpY2VQcm9maWxlTWFwLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9EZXZpY2VQcm9maWxlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDFmOTguLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vRGV2aWNlUHJvZmlsZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLWltcG9ydCBqYXZhLmxhbmcuQm9vbGVhbjsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLQotcHVibGljIGNsYXNzIERldmljZVByb2ZpbGVNYXAgewotCi0gICAgTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4gbVN1cHBvcnRlZFByb2ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIE1hcDxCbHVldG9vdGhEZXZpY2UsIGludCBbXT4gbUFjdGl2ZVByb2ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+IG1Db25uZWN0ZWRQcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRGV2aWNlUHJvZmlsZU1hcCBEUE1TaW5nbGVJbnN0YW5jZSA9IG51bGw7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgW10gbVByZWZlcnJlZFByb2ZpbGVMaXN0ID0gbmV3IGludFtBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1BWF9BVURJT19GRUFUVVJFU107Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVEVEX1BST0ZJTEVfTUFQID0gImJsdWV0b290aF9zdXBwb3J0ZWRfcHJvZmlsZV9tYXAiOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NIVVRET1dOID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fU0hVVERPV04iOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BPV0VSX09GRiA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uUVVJQ0tCT09UX1BPV0VST0ZGIjsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMZU1lZGlhUHJvZmlsZXMgPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfTUVESUEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfR0NQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMZUNhbGxQcm9maWxlcyA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX0NBTEw7Ci0KLSAgICAvLyBwcml2YXRlIGNvbnN0cnVjdG9yIHJlc3RyaWN0ZWQgdG8gdGhpcyBjbGFzcyBpdHNlbGYKLSAgICBwcml2YXRlIERldmljZVByb2ZpbGVNYXAoKSB7Ci0gICAgICAgIExvZy53KExPR1RBRywgIkRldmljZVByb2ZpbGVNYXAgb2JqZWN0IGNyZWF0aW9uIik7Ci0gICAgfQotCi0gICAgLy8gc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgaW5zdGFuY2Ugb2YgU2luZ2xldG9uIGNsYXNzCi0gICAgcHVibGljIHN0YXRpYyBEZXZpY2VQcm9maWxlTWFwIGdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIGlmIChEUE1TaW5nbGVJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBEUE1TaW5nbGVJbnN0YW5jZSA9IG5ldyBEZXZpY2VQcm9maWxlTWFwKCk7Ci0gICAgICAgICAgICBEZXZpY2VQcm9maWxlTWFwSW50Zi5pbml0KERQTVNpbmdsZUluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRFBNU2luZ2xlSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJEZXZpY2VQcm9maWxlTWFwIjsKLSAgICBwcml2YXRlIFNoYXJlZFByZWZlcmVuY2VzIGdldFN1cHBvcnRlZFByb2ZpbGVNYXAoKSB7Ci0gICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoU1VQUE9SVEVEX1BST0ZJTEVfTUFQLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHByb2ZpbGUgbWFwCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIExvZy5kKExPR1RBRywgImluaXQ6ICIpOwotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgc3VwcG9ydGVkIHByb2ZpbGUgbGlzdC4KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBNYXA8U3RyaW5nLCA/PiBhbGxLZXlzID0gZ2V0U3VwcG9ydGVkUHJvZmlsZU1hcCgpLmdldEFsbCgpOwotICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgbVN1cHBvcnRlZFByb2ZpbGVNYXBFZGl0b3IgPSBnZXRTdXBwb3J0ZWRQcm9maWxlTWFwKCkuZWRpdCgpOwotCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgPz4gZW50cnkgOiBhbGxLZXlzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aERldmljZSA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbW90ZURldmljZShrZXkpOwotICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIgJiYgbUJsdWV0b290aERldmljZS5nZXRCb25kU3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVNYXAucHV0KG1CbHVldG9vdGhEZXZpY2UsIChJbnRlZ2VyKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgImFkZHJlc3MgIiArIGtleSArICIgZnJvbSB0aGUgU3VwcG9ydGVkIFByb2ZpbGUgTWFwOiAiICsgdmFsdWUpOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgIlJlbW92aW5nICIgKyBrZXkgKyAiIGZyb20gdGhlIFN1cHBvcnRlZCBQcm9maWxlIG1hcCIpOwotICAgICAgICAgICAgICAgICBtU3VwcG9ydGVkUHJvZmlsZU1hcEVkaXRvci5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVNYXBFZGl0b3IuYXBwbHkoKTsKLSAgICAgICAgLy9pbnRpYWxpemUgdGhlIHByZWZlcnJlZCBwcm9maWxlIGxpc3QKLSAgICAgICAgaW50IG1QcmVmZXJyZWRQcm9maWxlVmFsID0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoInBlcnNpc3QudmVuZG9yLnFjb20uYmx1ZXRvb3RoLmRlZmF1bHRfcHJvZmlsZXMiLCAwKTsKLSAgICAgICAgTG9nLmQoTE9HVEFHLCAiaW5pdDogUHJlZmVycmVkIFByb2ZpbGUgPSAiICsgbVByZWZlcnJlZFByb2ZpbGVWYWwpOwotICAgICAgICBpbnQgbWZlYXR1cmUgPSAwOwotICAgICAgICB3aGlsZSAobWZlYXR1cmUgPCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1BWF9BVURJT19GRUFUVVJFUykgewotICAgICAgICAgICAgc3dpdGNoKG1mZWF0dXJlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU86Ci0gICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgcHJlZmVycmVkIHByb2ZpbGUgZm9yIGNhbGwgKi8KLSAgICAgICAgICAgICAgICAgICAgbVByZWZlcnJlZFByb2ZpbGVMaXN0W21mZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQOwotICAgICAgICAgICAgICAgICAgICBpZigobVByZWZlcnJlZFByb2ZpbGVWYWwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX0NBTEwpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJyZWRQcm9maWxlTGlzdFttZmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfQ0FMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKChtUHJlZmVycmVkUHJvZmlsZVZhbCAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9DQUxMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVycmVkUHJvZmlsZUxpc3RbbWZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU86Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVmZXJyZWRQcm9maWxlTGlzdFttZmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChtUHJlZmVycmVkUHJvZmlsZVZhbCAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfTUVESUEpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJyZWRQcm9maWxlTGlzdFttZmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfTUVESUE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZigobVByZWZlcnJlZFByb2ZpbGVWYWwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfUkVDT1JESU5HKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVycmVkUHJvZmlsZUxpc3RbbWZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfUkVDT1JESU5HOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoKG1QcmVmZXJyZWRQcm9maWxlVmFsICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVycmVkUHJvZmlsZUxpc3RbbWZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQ09OVFJPTDoKLSAgICAgICAgICAgICAgICAgICAgbVByZWZlcnJlZFByb2ZpbGVMaXN0W21mZWF0dXJlXSA9ICgobVByZWZlcnJlZFByb2ZpbGVWYWwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5DQ1ApICE9IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQ0NQIDogQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQ09OVFJPTDoKLSAgICAgICAgICAgICAgICAgICAgbVByZWZlcnJlZFByb2ZpbGVMaXN0W21mZWF0dXJlXSA9ICgobVByZWZlcnJlZFByb2ZpbGVWYWwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUCkgIT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUCA6IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTUNQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9WT0xVTUVfQ09OVFJPTDoKLSAgICAgICAgICAgICAgICAgICAgbVByZWZlcnJlZFByb2ZpbGVMaXN0W21mZWF0dXJlXSA9ICgobVByZWZlcnJlZFByb2ZpbGVWYWwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwgfCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfQ0FMTCkpICE9IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQIDogQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9WT0xVTUVfQ09OVFJPTDoKLSAgICAgICAgICAgICAgICAgICAgbVByZWZlcnJlZFByb2ZpbGVMaXN0W21mZWF0dXJlXSA9ICgobVByZWZlcnJlZFByb2ZpbGVWYWwgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUCkgIT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUCA6IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuSEVBUklOR19BSUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVmZXJyZWRQcm9maWxlTGlzdFttZmVhdHVyZV0gPSAoKG1QcmVmZXJyZWRQcm9maWxlVmFsICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSKSAhPSAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9CUkVEUiA6IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0xFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQlJPQURDQVNUX0FVRElPOgotICAgICAgICAgICAgICAgICAgICBtUHJlZmVycmVkUHJvZmlsZUxpc3RbbWZlYXR1cmVdID0gKChtUHJlZmVycmVkUHJvZmlsZVZhbCAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9CUkVEUikgIT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CUk9BRENBU1RfQlJFRFIgOiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9MRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJpbml0OiBQcmVmZXJyZWQgUHJvZmlsZSA9ICIgKyBtUHJlZmVycmVkUHJvZmlsZUxpc3RbbWZlYXR1cmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBhdWRpbyBmZWF0dXJlICIgKyBtZmVhdHVyZSk7Ci0gICAgICAgICAgICAgICAgbWZlYXR1cmUrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9VVUlEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBQ1RJT05fU0hVVERPV04pOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEFDVElPTl9QT1dFUl9PRkYpOwotICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1EZXZpY2VQcm9maWxlTWFwUmVjZWl2ZXIsIGZpbHRlcik7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtRGV2aWNlUHJvZmlsZU1hcFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJtRGV2aWNlUHJvZmlsZU1hcFJlY2VpdmVyLCBhY3Rpb24gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1VVSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwotICAgICAgICAgICAgICAgICAgICAgUGFyY2VsYWJsZVtdIHV1aWRzID0gaW50ZW50LmdldFBhcmNlbGFibGVBcnJheUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9VVUlEKTsKLSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURldmljZVV1aWRFdmVudChkZXZpY2UsIHV1aWRzKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9TSFVURE9XTjoKLSAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9QT1dFUl9PRkY6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZURldmljZVNodXRkb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJVbmtub3duIGFjdGlvbiAiICsgYWN0aW9uKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgfTsKLQotICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGV2aWNlVXVpZEV2ZW50KEJsdWV0b290aERldmljZSBkZXZpY2UsIFBhcmNlbGFibGVbXSB1dWlkcykgewotICAgICAgICAgTG9nLmQoTE9HVEFHLCAiVVVJRHMgZm91bmQsIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgICAgICBpZiAodXVpZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgIFBhcmNlbFV1aWRbXSB1dWlkc1RvU2VuZCA9IG5ldyBQYXJjZWxVdWlkW3V1aWRzLmxlbmd0aF07Ci0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1dWlkc1RvU2VuZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICB1dWlkc1RvU2VuZFtpXSA9IChQYXJjZWxVdWlkKSB1dWlkc1tpXTsKLSAgICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCJpbmRleD0iICsgaSArICJ1dWlkPSIgKyB1dWlkc1RvU2VuZFtpXSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGNoZWNrSWZQcm9maWxlU3VwcG9ydGVkKGRldmljZSwgdXVpZHNUb1NlbmQpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJZlByb2ZpbGVTdXBwb3J0ZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgUGFyY2VsVXVpZFtdIHJlbW90ZURldmljZVV1aWRzKSB7Ci0gICAgICAgIFBhcmNlbFV1aWQgQURWX0FVRElPX1RfTUVESUEgPQotICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwNkFEMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLQotICAgICAgICBQYXJjZWxVdWlkIEhFQVJJTkdBSURfQURWX0FVRElPID0KLSAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDZBRDItMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci0KLSAgICAgICAgUGFyY2VsVXVpZCBBRFZfQVVESU9fUF9NRURJQSA9Ci0gICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDA2QUQxLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotCi0gICAgICAgIFBhcmNlbFV1aWQgQURWX0FVRElPX1BfVk9JQ0UgPQotICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwNkFENC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLQotICAgICAgICBQYXJjZWxVdWlkIEFEVl9BVURJT19UX1ZPSUNFID0KLSAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDZBRDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci0KLSAgICAgICAgUGFyY2VsVXVpZCBBRFZfQVVESU9fR19NRURJQSA9Ci0gICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjEyOTk0QjdFLTZkNDctNDIxNS04QzlFLUFBRTlBMTA5NUJBMyIpOwotCi0gICAgICAgIFBhcmNlbFV1aWQgQURWX0FVRElPX1dfUkVDT1JESU5HID0KLSAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMjU4N0RCM0MtQ0U3MC00RkM5LTkzNUYtNzc3QUI0MTg4RkQ3Iik7Ci0KLSAgICAgICAgaWYgKEFycmF5VXRpbHMuY29udGFpbnMocmVtb3RlRGV2aWNlVXVpZHMsIEJsdWV0b290aFV1aWQuSEZQKSkgewotICAgICAgICAgICAgdXBkYXRlU3VwcG9ydGVkUHJvZmlsZU1hcChkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXJyYXlVdGlscy5jb250YWlucyhyZW1vdGVEZXZpY2VVdWlkcywgQmx1ZXRvb3RoVXVpZC5BMkRQX1NJTkspKSB7Ci0gICAgICAgICAgICB1cGRhdGVTdXBwb3J0ZWRQcm9maWxlTWFwKGRldmljZSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BMkRQKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXJyYXlVdGlscy5jb250YWlucyhyZW1vdGVEZXZpY2VVdWlkcywgQmx1ZXRvb3RoVXVpZC5IRUFSSU5HX0FJRCkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN1cHBvcnRlZFByb2ZpbGVNYXAoZGV2aWNlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9CUkVEUik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEFycmF5VXRpbHMuY29udGFpbnMocmVtb3RlRGV2aWNlVXVpZHMsIEJsdWV0b290aFV1aWQuQVZSQ1BfQ09OVFJPTExFUikpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN1cHBvcnRlZFByb2ZpbGVNYXAoZGV2aWNlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkFWUkNQKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXJyYXlVdGlscy5jb250YWlucyhyZW1vdGVEZXZpY2VVdWlkcywgQURWX0FVRElPX1RfTUVESUEpKSB7Ci0gICAgICAgICAgICB1cGRhdGVTdXBwb3J0ZWRQcm9maWxlTWFwKGRldmljZSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX01FRElBKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXJyYXlVdGlscy5jb250YWlucyhyZW1vdGVEZXZpY2VVdWlkcywgQURWX0FVRElPX1RfVk9JQ0UpKSB7Ci0gICAgICAgICAgICB1cGRhdGVTdXBwb3J0ZWRQcm9maWxlTWFwKGRldmljZSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX0NBTEwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChBcnJheVV0aWxzLmNvbnRhaW5zKHJlbW90ZURldmljZVV1aWRzLCBBRFZfQVVESU9fUF9NRURJQSkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVN1cHBvcnRlZFByb2ZpbGVNYXAoZGV2aWNlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEFycmF5VXRpbHMuY29udGFpbnMocmVtb3RlRGV2aWNlVXVpZHMsIEFEVl9BVURJT19QX1ZPSUNFKSkgewotICAgICAgICAgICAgdXBkYXRlU3VwcG9ydGVkUHJvZmlsZU1hcChkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChBcnJheVV0aWxzLmNvbnRhaW5zKHJlbW90ZURldmljZVV1aWRzLCBBRFZfQVVESU9fV19SRUNPUkRJTkcpKSB7Ci0gICAgICAgICAgICB1cGRhdGVTdXBwb3J0ZWRQcm9maWxlTWFwKGRldmljZSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfUkVDT1JESU5HKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdXBwb3J0ZWRQcm9maWxlTWFwKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBtUHJvZmlsZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpbnQgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgPSAwOwotICAgICAgICAgICAgaWYoIW1TdXBwb3J0ZWRQcm9maWxlTWFwLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAvL2RldmljZSBpcyBub3QgYWRkZWQgaW4gc3VwcG9ydGVkIG1hcCwgYWRkIHRvIGl0Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAidXBkYXRlU3VwcG9ydGVkUHJvZmlsZU1hcDogZGV2aWNlICIgKyBkZXZpY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhZGRlZCBpbiBzdXBwb3J0ZWQgbWFwLCBhZGQgaXQiKTsKLSAgICAgICAgICAgICAgICBtU3VwcG9ydGVkUHJvZmlsZU1hcC5wdXQoZGV2aWNlLCBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwID0gbVN1cHBvcnRlZFByb2ZpbGVNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZChMT0dUQUcsICJ1cGRhdGVTdXBwb3J0ZWRQcm9maWxlTWFwOiBkZXZpY2UgIiArIGRldmljZSArICIgZm9yIHByb2ZpbGUgIgotICAgICAgICAgICAgICAgICAgICArIG1Qcm9maWxlICsgIiBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCAiICsgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXApOwotICAgICAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgPSBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCB8IG1Qcm9maWxlOwotICAgICAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVNYXAucHV0KGRldmljZSwgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXApOwotICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAidXBkYXRlU3VwcG9ydGVkUHJvZmlsZU1hcDogZGV2aWNlICIgKyBkZXZpY2UgKyAiIGZvciBwcm9maWxlICIKLSAgICAgICAgICAgICAgICAgICAgKyBtUHJvZmlsZSArICIgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgIiArIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QWxsU3VwcG9ydGVkUHJvZmlsZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCA9IDA7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmKCFtU3VwcG9ydGVkUHJvZmlsZU1hcC5jb250YWluc0tleShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiTm8gU3VwcG9ydGVkIFByb2ZpbGUgZm91bmQgZm9yIHRoZSBkZXZpY2UgIiArIGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwID0gbVN1cHBvcnRlZFByb2ZpbGVNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZChMT0dUQUcsICJnZXRBbGxTdXBwb3J0ZWRQcm9maWxlOiBTdXBwb3J0ZWQgUHJvZmlsZSBmb3IgdGhlIGRldmljZSAiCi0gICAgICAgICAgICAgICAgKyBkZXZpY2UgKyAiIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZmlsZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIG1BdWRpb0ZlYXR1cmUpIHsKLSAgICAgICAgaW50IHByb2ZpbGVNYXAgPSBnZXRTdXBwb3J0ZWRQcm9maWxlKGRldmljZSwgbUF1ZGlvRmVhdHVyZSk7Ci0gICAgICAgIGludCBwcmVmZXJyZWRQcm9maWxlID0gcHJvZmlsZU1hcDsKLSAgICAgICAgaW50IFtdIG1BY2l2ZVByb2ZpbGVBcnJheSA9IG1BY3RpdmVQcm9maWxlTWFwLmdldChkZXZpY2UpOwotCi0gICAgICAgIGlmKHByb2ZpbGVNYXAgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKQotICAgICAgICAgICAgcmV0dXJuIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLQotICAgICAgICBzd2l0Y2gobUF1ZGlvRmVhdHVyZSkgewotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU86Ci0gICAgICAgICAgICAgICAgaW50IG1BY3RpdmVQcm9maWxlRm9yQ2FsbEF1ZGlvID0gbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdOwotICAgICAgICAgICAgICAgIGlmKG1BY3RpdmVQcm9maWxlRm9yQ2FsbEF1ZGlvICE9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAvL2FjdGl2ZSBwcm9maWxlIGlzIHNldAotICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQcm9maWxlID0gbUFjdGl2ZVByb2ZpbGVGb3JDYWxsQXVkaW87Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQcm9maWxlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHByb2ZpbGVNYXAgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfQlJFRFIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVNYXAgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IHByb2ZpbGVNYXA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQcm9maWxlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBtSEZQID0gcHJvZmlsZU1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQOwotICAgICAgICAgICAgICAgIGludCBtTGVDYWxsID0gcHJvZmlsZU1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9DQUxMOwotICAgICAgICAgICAgICAgIGlmKG1MZUNhbGwgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKQotICAgICAgICAgICAgICAgICAgICBtTGVDYWxsID0gcHJvZmlsZU1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEw7Ci0KLSAgICAgICAgICAgICAgICBpZihtSEZQICE9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbUxlQ2FsbCAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IG1QcmVmZXJyZWRQcm9maWxlTGlzdFttQXVkaW9GZWF0dXJlXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYobUhGUCAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IG1IRlA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IG1MZUNhbGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiZ2V0UHJvZmlsZTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIHByZWZlcnJlZFByb2ZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBwcmVmZXJyZWRQcm9maWxlICsgIiBmb3IgQ0FMTF9BVURJTyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU86Ci0gICAgICAgICAgICAgICAgaW50IG1BY3RpdmVQcm9maWxlRm9yTWVkaWFBdWRpbyA9IG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXTsKLSAgICAgICAgICAgICAgICBpZihtQWN0aXZlUHJvZmlsZUZvck1lZGlhQXVkaW8gIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vYWN0aXZlIHByb2ZpbGUgaXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFByb2ZpbGUgPSBtQWN0aXZlUHJvZmlsZUZvck1lZGlhQXVkaW87Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgImdldFByb2ZpbGU6IGRldmljZSAiICsgZGV2aWNlICsgIiBBY3RpdmUgUHJvZmlsZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJlZmVycmVkUHJvZmlsZSArICIgZm9yIE1FRElBX0FVRElPIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQcm9maWxlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHByb2ZpbGVNYXAgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfQlJFRFIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVNYXAgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IHByb2ZpbGVNYXA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQcm9maWxlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBtQTJkcCA9IHByb2ZpbGVNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFA7Ci0gICAgICAgICAgICAgICAgaW50IG1MZU1lZGlhID0gcHJvZmlsZU1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9NRURJQTsKLSAgICAgICAgICAgICAgICBpZihtTGVNZWRpYSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpCi0gICAgICAgICAgICAgICAgICAgIG1MZU1lZGlhID0gcHJvZmlsZU1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBOwotCi0gICAgICAgICAgICAgICAgaWYobUEyZHAgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGVNZWRpYSAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IG1QcmVmZXJyZWRQcm9maWxlTGlzdFttQXVkaW9GZWF0dXJlXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYobUEyZHAgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFByb2ZpbGUgPSBtQTJkcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZigocHJlZmVycmVkUHJvZmlsZSAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IG1QcmVmZXJyZWRQcm9maWxlTGlzdFttQXVkaW9GZWF0dXJlXTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUHJvZmlsZSA9IG1MZU1lZGlhOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgImdldFByb2ZpbGU6IGRldmljZSAiICsgZGV2aWNlICsgIiBwcmVmZXJyZWRQcm9maWxlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgcHJlZmVycmVkUHJvZmlsZSArICIgZm9yIE1FRElBX0FVRElPIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWZlcnJlZFByb2ZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdXBwb3J0ZWRQcm9maWxlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvRmVhdHVyZSkgewotICAgICAgICBpbnQgW10gbUFjaXZlUHJvZmlsZUFycmF5OwotCi0gICAgICAgIExvZy5kKExPR1RBRywgImdldFN1cHBvcnRlZFByb2ZpbGU6IGZvciB0aGUgZGV2aWNlICIgKyBkZXZpY2UgKyAiIEF1ZGlvRmVhdHVyZSAiICsgbUF1ZGlvRmVhdHVyZSk7Ci0gICAgICAgIGlmKCFtQWN0aXZlUHJvZmlsZU1hcC5jb250YWluc0tleShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAvLyBpbnRpYWxpemUgdGhlIGFjdGl2ZSBwcm9maWxlIGJ1dCBtYXAgZm9yIHRoZSBkZXZpY2UKLSAgICAgICAgICAgIExvZy5kKExPR1RBRywgImdldFN1cHBvcnRlZFByb2ZpbGU6IGludGlhbGl6ZSB0aGUgYWN0aXZlIHByb2ZpbGUgbWFwIGZvciB0aGUgZGV2aWNlICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5ID0gbmV3IGludFtBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1BWF9BVURJT19GRUFUVVJFU107Ci0gICAgICAgICAgICBBcnJheXMuZmlsbChtQWNpdmVQcm9maWxlQXJyYXksIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORSk7Ci0gICAgICAgICAgICBtQWN0aXZlUHJvZmlsZU1hcC5wdXQoZGV2aWNlLCBtQWNpdmVQcm9maWxlQXJyYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5ID0gbUFjdGl2ZVByb2ZpbGVNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9nZXQgdGhlIHN1cHBydGVkIHByb2ZpbGUgbGlzdAotICAgICAgICBpbnQgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgPSAwOwotICAgICAgICBpZighbVN1cHBvcnRlZFByb2ZpbGVNYXAuY29udGFpbnNLZXkoZGV2aWNlKSkgewotICAgICAgICAgICAgLy9kZXZpY2UgaXMgbm90IGFkZGVkIGluIHN1cHBvcnRlZCBtYXAsIGFkZCB0byBpdAotICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiZ2V0U3VwcG9ydGVkUHJvZmlsZTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIGlzIG5vdCBhZGRlZCBpbiBzdXBwb3J0ZWQgbWFwLCBhZGQgaXQiKTsKLSAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlTWFwLnB1dChkZXZpY2UsIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwID0gbVN1cHBvcnRlZFByb2ZpbGVNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoTE9HVEFHLCAiZ2V0U3VwcG9ydGVkUHJvZmlsZTogc3VwcG9ydGVkIFByb2ZpbGVzIGZvciB0aGUgZGV2aWNlICIgKyBkZXZpY2UKLSAgICAgICAgICAgICsgIiB2YWwgPSAiICsgSW50ZWdlci50b0hleFN0cmluZyhtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCkpOwotCi0gICAgICAgIHN3aXRjaChtQXVkaW9GZWF0dXJlKSB7Ci0gICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbUlzSGFwQlJFRFJTdXBwb3J0ZWQgPSBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSOwotICAgICAgICAgICAgICAgIGludCBtSXNIYXBMRVN1cHBvcnRlZCA9IG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfTEU7Ci0KLSAgICAgICAgICAgICAgICBpZihtSXNIYXBCUkVEUlN1cHBvcnRlZCAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzSGFwTEVTdXBwb3J0ZWQgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9MRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgbUNhbGxBdWRpb1Byb2ZpbGUgPSBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCAmICggQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9DQUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX0NBTEwpOwotCi0gICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiZ2V0U3VwcG9ydGVkUHJvZmlsZTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIHN1cHBvcnRzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbUNhbGxBdWRpb1Byb2ZpbGUgKyAiIGZvciBDQUxMX0FVRElPIik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUNhbGxBdWRpb1Byb2ZpbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbUlzSGFwQlJFRFJTdXBwb3J0ZWQgPSBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSOwotICAgICAgICAgICAgICAgIGludCBtSXNIYXBMRVN1cHBvcnRlZCA9IG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IQVBfTEU7Ci0KLSAgICAgICAgICAgICAgICBpZihtSXNIYXBCUkVEUlN1cHBvcnRlZCAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzSGFwTEVTdXBwb3J0ZWQgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9MRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgbU1lZGlhQXVkaW9Qcm9maWxlID0gbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgJiAoIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX01FRElBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfUkVDT1JESU5HKTsKLQotICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgImdldFN1cHBvcnRlZFByb2ZpbGU6IGRldmljZSAiICsgZGV2aWNlICsgIiBzdXBwb3J0czogIgotICAgICAgICAgICAgICAgICAgICArIG1NZWRpYUF1ZGlvUHJvZmlsZSArICIgZm9yIE1FRElBX0FVRElPIik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhQXVkaW9Qcm9maWxlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0NPTlRST0w6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG1BY3RpdmVQcm9maWxlRm9yTWVkaWFDb250cm9sID0gbUFjaXZlUHJvZmlsZUFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQ09OVFJPTF07Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiZ2V0U3VwcG9ydGVkUHJvZmlsZTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIEFjdGl2ZVByb2ZpbGUgRm9yIE1lZGlhQ29udHJvbCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQcm9maWxlRm9yTWVkaWFDb250cm9sKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVByb2ZpbGVGb3JNZWRpYUNvbnRyb2w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9DT05UUk9MOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBtQWN0aXZlUHJvZmlsZUZvckNhbGxDb250cm9sID0gbUFjaXZlUHJvZmlsZUFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQ09OVFJPTF07Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiZ2V0U3VwcG9ydGVkUHJvZmlsZTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIEFjdGl2ZVByb2ZpbGUgRm9yIENhbGwgQ29udHJvbCAiICsKLSAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQcm9maWxlRm9yQ2FsbENvbnRyb2wpOwotICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUHJvZmlsZUZvckNhbGxDb250cm9sOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX1ZPTFVNRV9DT05UUk9MOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBtQWN0aXZlUHJvZmlsZUZvck1lZGlhVm9sQ29udHJvbCA9IG1BY2l2ZVByb2ZpbGVBcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfVk9MVU1FX0NPTlRST0xdOwotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJnZXRTdXBwb3J0ZWRQcm9maWxlOiBkZXZpY2UgIiArIGRldmljZSArCi0gICAgICAgICAgICAgICAgICAgICAgIiBBY3RpdmVQcm9maWxlIEZvciBNZWRpYSBWb2x1bWUgQ29udHJvbCAiICsgbUFjdGl2ZVByb2ZpbGVGb3JNZWRpYVZvbENvbnRyb2wpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUHJvZmlsZUZvck1lZGlhVm9sQ29udHJvbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX1ZPTFVNRV9DT05UUk9MOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBtQWN0aXZlUHJvZmlsZUZvckNhbGxWb2xDb250cm9sID0gbUFjaXZlUHJvZmlsZUFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX1ZPTFVNRV9DT05UUk9MXTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJnZXRTdXBwb3J0ZWRQcm9maWxlOiBkZXZpY2UgIiArIGRldmljZSArCi0gICAgICAgICAgICAgICAgICAgICAgICIgQWN0aXZlUHJvZmlsZSBGb3IgY2FsbCBWb2x1bWUgQ29udHJvbCAiICsgbUFjdGl2ZVByb2ZpbGVGb3JDYWxsVm9sQ29udHJvbCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVByb2ZpbGVGb3JDYWxsVm9sQ29udHJvbDsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkJST0FEQ0FTVF9BVURJTzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbUFjdGl2ZVByb2ZpbGVGb3JCcm9hZENhc3RBdWRpbyA9IG1BY2l2ZVByb2ZpbGVBcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkJST0FEQ0FTVF9BVURJT107Ci0gICAgICAgICAgICAgICAgaWYobUFjdGl2ZVByb2ZpbGVGb3JCcm9hZENhc3RBdWRpbyAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9hY3RpdmUgcHJvZmlsZSBpcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQcm9maWxlRm9yQnJvYWRDYXN0QXVkaW87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IG1Jc0Jyb2FkQ2FzdEJSRURSU3VwcG9ydGVkID0gbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQlJPQURDQVNUX0JSRURSOwotICAgICAgICAgICAgICAgIGludCBtSXNCcm9hZENhc3RMRVN1cHBvcnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9MRTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJnZXRTdXBwb3J0ZWRQcm9maWxlOiBkZXZpY2UgIiArIGRldmljZSArICIgbUlzQnJvYWRDYXN0QlJFRFJTdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgICAgICArIG1Jc0Jyb2FkQ2FzdEJSRURSU3VwcG9ydGVkICsgIiBtSXNCcm9hZENhc3RMRVN1cHBvcnRlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSXNCcm9hZENhc3RMRVN1cHBvcnRlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZigobUlzQnJvYWRDYXN0QlJFRFJTdXBwb3J0ZWQgIT0gMCkgJiYgKG1Jc0Jyb2FkQ2FzdExFU3VwcG9ydGVkICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUHJlZmVycmVkUHJvZmlsZUxpc3RbQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5CUk9BRENBU1RfQVVESU9dOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzQnJvYWRDYXN0QlJFRFJTdXBwb3J0ZWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CUk9BRENBU1RfQlJFRFI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1Jc0Jyb2FkQ2FzdExFU3VwcG9ydGVkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQlJPQURDQVNUX0xFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5IRUFSSU5HX0FJRDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbUFjdGl2ZVByb2ZpbGVGb3JIZWFyaW5nQWlkID0gbUFjaXZlUHJvZmlsZUFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkhFQVJJTkdfQUlEXTsKLSAgICAgICAgICAgICAgICBpZihtQWN0aXZlUHJvZmlsZUZvckhlYXJpbmdBaWQgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vYWN0aXZlIHByb2ZpbGUgaXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUHJvZmlsZUZvckhlYXJpbmdBaWQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IG1Jc0hBUEJSRURSU3VwcG9ydGVkID0gbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9CUkVEUjsKLSAgICAgICAgICAgICAgICBpbnQgbUlzSEFQTEVTdXBwb3J0ZWQgPSBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0xFOwotICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgImdldFN1cHBvcnRlZFByb2ZpbGU6IGRldmljZSAiICsgZGV2aWNlICsgIiBtSXNIQVBCUkVEUlN1cHBvcnRlZCAiCi0gICAgICAgICAgICAgICAgICAgICsgbUlzSEFQQlJFRFJTdXBwb3J0ZWQgKyAiIG1Jc0hBUExFU3VwcG9ydGVkICIgKyBtSXNIQVBMRVN1cHBvcnRlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZigobUlzSEFQQlJFRFJTdXBwb3J0ZWQgIT0gMCkgJiYgKG1Jc0hBUExFU3VwcG9ydGVkICE9MCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWRQcm9maWxlTGlzdFtBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkhFQVJJTkdfQUlEXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc0hBUEJSRURSU3VwcG9ydGVkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEFQX0JSRURSOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtSXNIQVBMRVN1cHBvcnRlZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhBUF9MRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJnZXRTdXBwb3J0ZWRQcm9maWxlOiBubyBwcm9maWxlIHN1cHBvcnRlZCBmb3IiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZlYXR1cmUgKyAiIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvZmlsZURlc2NvdmVyeVVwZGF0ZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSW50ZWdlciBtQXVkaW9Qcm9maWxlKSB7Ci0gICAgICAgIGludCBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCA9IDA7Ci0gICAgICAgIGlmKG1TdXBwb3J0ZWRQcm9maWxlTWFwLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwID0gbVN1cHBvcnRlZFByb2ZpbGVNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCA9IG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwIHwgbUF1ZGlvUHJvZmlsZTsKLSAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVNYXAucHV0KGRldmljZSwgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2ZpbGVDb25uZWN0aW9uVXBkYXRlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgbUF1ZGlvRmVhdHVyZSwKLSAgICAgICAgICAgSW50ZWdlciBtQXVkaW9Qcm9maWxlLCBCb29sZWFuIG1Qcm9maWxlU3RhdHVzKSB7Ci0gICAgICAgIGludCBtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCA9IDA7Ci0gICAgICAgIGludCBtQ29ubmVjdGVkUHJvZmlsZUJpdE1hcCA9IDA7Ci0gICAgICAgIGludCBbXSBtQWNpdmVQcm9maWxlQXJyYXk7Ci0KLSAgICAgICAgTG9nLmQoTE9HVEFHLCAicHJvZmlsZUNvbm5lY3Rpb25VcGRhdGU6IGRldmljZSA6ICIgKyBkZXZpY2UgKyAiIEF1ZGlvUHJvZmlsZSAiCi0gICAgICAgICAgICAgICAgKyBtQXVkaW9Qcm9maWxlICsgIiBQcm9maWxlU3RhdHVzICIgKyBtUHJvZmlsZVN0YXR1cyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBDb25uZWN0ZWQgcHJvZmlsZSBsaXN0Ci0gICAgICAgICAgICBpZihtQ29ubmVjdGVkUHJvZmlsZU1hcC5jb250YWluc0tleShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgPSBtQ29ubmVjdGVkUHJvZmlsZU1hcC5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBTdXBwb3J0ZWQgcHJvZmlsZSBsaXN0Ci0gICAgICAgICAgICBpZihtU3VwcG9ydGVkUHJvZmlsZU1hcC5jb250YWluc0tleShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgPSBtU3VwcG9ydGVkUHJvZmlsZU1hcC5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIW1BY3RpdmVQcm9maWxlTWFwLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBpbnRpYWxpemUgdGhlIGFjdGl2ZSBwcm9maWxlIGJ1dCBtYXAgZm9yIHRoZSBkZXZpY2UKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJwcm9maWxlQ29ubmVjdGlvblVwZGF0ZTogaW50aWFsaXplIHRoZSBhY3RpdmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHByb2ZpbGUgbWFwIGZvciB0aGUgZGV2aWNlICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheSA9IG5ldyBpbnRbQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NQVhfQVVESU9fRkVBVFVSRVNdOwotICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKG1BY2l2ZVByb2ZpbGVBcnJheSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlUHJvZmlsZU1hcC5wdXQoZGV2aWNlLCBtQWNpdmVQcm9maWxlQXJyYXkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXkgPSBtQWN0aXZlUHJvZmlsZU1hcC5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgQXVkaW8gcHJvZmlsZSBjb25uZWN0aW9uIGluIGxpc3QKLSAgICAgICAgICAgIGlmIChtUHJvZmlsZVN0YXR1cykgewotICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwID0gbVN1cHBvcnRlZFByb2ZpbGVCaXRNYXAgfCBtQXVkaW9Qcm9maWxlOwotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRQcm9maWxlQml0TWFwID0gbUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgfCBtQXVkaW9Qcm9maWxlOwotCi0gICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIGFjdGl2ZSBwcm9maWxlIGxpc3QKLSAgICAgICAgICAgICAgICBpZihtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IG1BdWRpb1Byb2ZpbGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSAhPSBtQXVkaW9Qcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlmZnJlbnQgcHJvZmlsZSBjb25uZWN0ZWQgZm9yIHRoZSBzYW1lIG1BdWRpb0ZlYXR1cmUgbmVlZCB0byB1cGRhdGUgdGhlIGFjdGl2ZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBpbnQgbVByZWZlcnJlZFByb2ZpbGUgPSBtUHJlZmVycmVkUHJvZmlsZUxpc3RbbUF1ZGlvRmVhdHVyZV07Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR1RBRywgInByb2ZpbGVDb25uZWN0aW9uVXBkYXRlOiBQcmVmZXJyZWRQcm9maWxlIGZvciBhdWRpbyBmZWF0dXJlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GZWF0dXJlICsgIiBpcyAiICsgbVByZWZlcnJlZFByb2ZpbGUgKyAiIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoKG1QcmVmZXJyZWRQcm9maWxlICE9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgbVByZWZlcnJlZFByb2ZpbGUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IG1QcmVmZXJyZWRQcm9maWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGVkUHJvZmlsZUJpdE1hcCA9IG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgfm1BdWRpb1Byb2ZpbGU7Ci0gICAgICAgICAgICAgICAgLy8gcHJvZmlsZSBkaXNjb25uZWN0IGZvciBhY3RpdmUgcHJvZmlsZQotICAgICAgICAgICAgICAgIGlmKG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9PSBtQXVkaW9Qcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFjdGl2ZSBwcm9maWxlIHdpdGggb3RoZXIgY29ubmVjdGVkIHByb2ZpbGUgZm9yIHRoYXQgYXVkaW8gZmVhdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1BdWRpb0ZlYXR1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1BdWRpb1Byb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX0NBTEwpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX0NBTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9DQUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9Qcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9DQUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9Qcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobUF1ZGlvUHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5UTUFQX01FRElBKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVE1BUF9NRURJQTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvUHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfTUVESUEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1Byb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BMkRQKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0NPTlRST0w6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobUF1ZGlvUHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigobUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkNDUCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkNDUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvUHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkNDUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigobUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9DT05UUk9MOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1BdWRpb1Byb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigobUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk1DUCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk1DUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvUHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk1DUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigobUNvbm5lY3RlZFByb2ZpbGVCaXRNYXAgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkFWUkNQKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQVZSQ1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfVk9MVU1FX0NPTlRST0w6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobUF1ZGlvUHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkFWUkNQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtQ29ubmVjdGVkUHJvZmlsZUJpdE1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9Qcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtQ29ubmVjdGVkUHJvZmlsZUJpdE1hcCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQVZSQ1ApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX1ZPTFVNRV9DT05UUk9MOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1BdWRpb1Byb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5WQ1ApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5WQ1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb1Byb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5WQ1ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwICYgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlApID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5W21BdWRpb0ZlYXR1cmVdID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5IRlA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2l2ZVByb2ZpbGVBcnJheVttQXVkaW9GZWF0dXJlXSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUFjdGl2ZVByb2ZpbGVNYXAucHV0KGRldmljZSwgbUFjaXZlUHJvZmlsZUFycmF5KTsKLSAgICAgICAgICAgIExvZy5kKExPR1RBRywgInByb2ZpbGVDb25uZWN0aW9uVXBkYXRlOiBzdXBwb3J0ZWQgUHJvZmlsZXMgZm9yIHRoZSBkZXZpY2UgIiArIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHZhbCAiICsgSW50ZWdlci50b0hleFN0cmluZyhtU3VwcG9ydGVkUHJvZmlsZUJpdE1hcCkpOwotICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAicHJvZmlsZUNvbm5lY3Rpb25VcGRhdGU6IGNvbm5lY3RlZCBQcm9maWxlcyBmb3IgdGhlIGRldmljZSAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmFsICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1Db25uZWN0ZWRQcm9maWxlQml0TWFwKSk7Ci0KLSAgICAgICAgICAgIG1Db25uZWN0ZWRQcm9maWxlTWFwLnB1dChkZXZpY2UsIG1Db25uZWN0ZWRQcm9maWxlQml0TWFwKTsKLSAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlTWFwLnB1dChkZXZpY2UsIG1TdXBwb3J0ZWRQcm9maWxlQml0TWFwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvZmlsZUNvbm5lY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIG1BdWRpb1Byb2ZpbGUpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGludCBtQ29ubmVjdGVkUHJvZmlsZUJpdE1hcCA9IG1Db25uZWN0ZWRQcm9maWxlTWFwLmdldChkZXZpY2UpOwotICAgICAgICBMb2cuZChMT0dUQUcsICJpc1Byb2ZpbGVDb25uZWN0ZWQ6IGRldmljZTogIiArIGRldmljZQotICAgICAgICAgICAgICAgKyAiIG1BdWRpb1Byb2ZpbGU6ICIgKyBtQXVkaW9Qcm9maWxlICsgIiBtQ29ubmVjdGVkUHJvZmlsZU1hcDogIiArIG1Db25uZWN0ZWRQcm9maWxlQml0TWFwKTsKLQotICAgICAgICByZXR1cm4gKChtQ29ubmVjdGVkUHJvZmlsZUJpdE1hcCAmIG1BdWRpb1Byb2ZpbGUpID09IG1BdWRpb1Byb2ZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVByb2ZpbGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSW50ZWdlciBtQXVkaW9GZWF0dXJlLCBJbnRlZ2VyIG1BdWRpb1Byb2ZpbGUpIHsKLSAgICAgICAgaW50IFtdIG1BY2l2ZVByb2ZpbGVBcnJheTsKLSAgICAgICAgTG9nLmQoTE9HVEFHLCAic2V0QWN0aXZlUHJvZmlsZTogZGV2aWNlIDogIiArIGRldmljZSArICIgQXVkaW9Qcm9maWxlICIKLSAgICAgICAgICAgICsgbUF1ZGlvUHJvZmlsZSArICIgQXVkaW9GZWF0dXJlICIgKyBtQXVkaW9GZWF0dXJlKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYoIW1BY3RpdmVQcm9maWxlTWFwLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJzZXRBY3RpdmVQcm9maWxlOiBpbnRpYWxpemUgdGhlIGFjdGl2ZSBwcm9maWxlIG1hcCBmb3IgdGhlIGRldmljZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXkgPSBuZXcgaW50W0FwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUFYX0FVRElPX0ZFQVRVUkVTXTsKLSAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChtQWNpdmVQcm9maWxlQXJyYXksIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORSk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVByb2ZpbGVNYXAucHV0KGRldmljZSwgbUFjaXZlUHJvZmlsZUFycmF5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUFjaXZlUHJvZmlsZUFycmF5ID0gbUFjdGl2ZVByb2ZpbGVNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWNpdmVQcm9maWxlQXJyYXlbbUF1ZGlvRmVhdHVyZV0gPSBtQXVkaW9Qcm9maWxlOwotICAgICAgICAgICAgbUFjdGl2ZVByb2ZpbGVNYXAucHV0KGRldmljZSwgbUFjaXZlUHJvZmlsZUFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0TGVNZWRpYVByb2ZpbGVzKCkgewotICAgICAgICByZXR1cm4gTGVNZWRpYVByb2ZpbGVzOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0TGVDYWxsUHJvZmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBMZUNhbGxQcm9maWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlRGV2aWNlU2h1dGRvd24oKSB7Ci0gICAgICAgIExvZy5kKExPR1RBRywgImhhbmRsZURldmljZVNodXRkb3duOiBzdGFydGVkIik7Ci0KLSAgICAgICAgLy9zdG9yZSB0aGUgc3VwcG9ydGVkIHByb2ZpbGVzIGZvciB0aGUgYm9uZGVkIGRldmljZXMKLSAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIHByZWYgPSBnZXRTdXBwb3J0ZWRQcm9maWxlTWFwKCkuZWRpdCgpOwotICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBtQmx1ZXRvb3RoRGV2aWNlIDogbVN1cHBvcnRlZFByb2ZpbGVNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGludCBtU3VwcG9ydGVkUHJvZmlsZXNWYWwgPSBtU3VwcG9ydGVkUHJvZmlsZU1hcC5nZXQobUJsdWV0b290aERldmljZSk7Ci0gICAgICAgICAgICBMb2cuZChMT0dUQUcsICJjbGVhbnVwOiBzdXBwb3J0ZWQgUHJvZmlsZXMgZm9yIHRoZSBkZXZpY2UgIiArIG1CbHVldG9vdGhEZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHZhbCA9ICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1TdXBwb3J0ZWRQcm9maWxlc1ZhbCkpOwotICAgICAgICAgICAgaWYobUJsdWV0b290aERldmljZS5nZXRCb25kU3RhdGUoKSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgICAgICBwcmVmLnB1dEludChtQmx1ZXRvb3RoRGV2aWNlLmdldEFkZHJlc3MoKSwgbVN1cHBvcnRlZFByb2ZpbGVzVmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmVmLmFwcGx5KCk7Ci0gICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlTWFwLmNsZWFyKCk7Ci0gICAgICAgIG1BY3RpdmVQcm9maWxlTWFwLmNsZWFyKCk7Ci0gICAgICAgIG1Db25uZWN0ZWRQcm9maWxlTWFwLmNsZWFyKCk7Ci0KLSAgICAgICAgTG9nLmQoTE9HVEFHLCAiaGFuZGxlRGV2aWNlU2h1dGRvd246IERvbmUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYW51cCAoKSB7Ci0gICAgICAgIGlmKERQTVNpbmdsZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR1RBRywgImNsZWFudXAgY2FsbGVkIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24sIFJldHVybmluZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoTE9HVEFHLCAiY2xlYW51cDogc3RhcnRlZCIpOwotCi0gICAgICAgIC8vc3RvcmUgdGhlIHN1cHBvcnRlZCBwcm9maWxlcyBmb3IgdGhlIGJvbmRlZCBkZXZpY2VzCi0gICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBwcmVmID0gZ2V0U3VwcG9ydGVkUHJvZmlsZU1hcCgpLmVkaXQoKTsKLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgbUJsdWV0b290aERldmljZSA6IG1TdXBwb3J0ZWRQcm9maWxlTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBpbnQgbVN1cHBvcnRlZFByb2ZpbGVzVmFsID0gbVN1cHBvcnRlZFByb2ZpbGVNYXAuZ2V0KG1CbHVldG9vdGhEZXZpY2UpOwotICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiY2xlYW51cDogc3VwcG9ydGVkIFByb2ZpbGVzIGZvciB0aGUgZGV2aWNlICIgKyBtQmx1ZXRvb3RoRGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB2YWwgPSAiICsgSW50ZWdlci50b0hleFN0cmluZyhtU3VwcG9ydGVkUHJvZmlsZXNWYWwpKTsKLSAgICAgICAgICAgIGlmKG1CbHVldG9vdGhEZXZpY2UuZ2V0Qm9uZFN0YXRlKCkgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEKSB7Ci0gICAgICAgICAgICAgICAgcHJlZi5wdXRJbnQobUJsdWV0b290aERldmljZS5nZXRBZGRyZXNzKCksIG1TdXBwb3J0ZWRQcm9maWxlc1ZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZi5hcHBseSgpOwotICAgICAgICBtU3VwcG9ydGVkUHJvZmlsZU1hcC5jbGVhcigpOwotICAgICAgICBtQWN0aXZlUHJvZmlsZU1hcC5jbGVhcigpOwotICAgICAgICBtQ29ubmVjdGVkUHJvZmlsZU1hcC5jbGVhcigpOwotICAgICAgICBEUE1TaW5nbGVJbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtRGV2aWNlUHJvZmlsZU1hcFJlY2VpdmVyKTsKLQotICAgICAgICBMb2cuZChMT0dUQUcsICJjbGVhbnVwOiBEb25lIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vTWVkaWFBdWRpby5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vTWVkaWFBdWRpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTdjMGViLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYXBtL01lZGlhQXVkaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG07Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY1N0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQTJkcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5BY3RpdmVEZXZpY2VNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAuQTJkcFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5BY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkFwbUNvbnN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5icm9hZGNhc3QuQnJvYWRjYXN0U2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYWNtLkFjbVNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0c0xvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguaGZwLkhlYWRzZXRTZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFBdWRpbyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWVkaWFBdWRpbyBzTWVkaWFBdWRpbzsKLSAgICBwcml2YXRlIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZTsKLS8vICAgIHByaXZhdGUgQmFwQnJvYWRjYXN0U2VydmljZSBtQmFwQnJvYWRjYXN0U2VydmljZTsKLSAgICBwcml2YXRlIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG1BY3RpdmVEZXZpY2VNYW5hZ2VyOwotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBCYXBCcm9hZGNhc3RNYW5hZ2VyIG1CYXBCcm9hZGNhc3RNYW5hZ2VyOwotICAgIE1hcDxTdHJpbmcsIE1lZGlhRGV2aWNlPiBtTWVkaWFEZXZpY2VzOwotCi0gICAgZmluYWwgQXJyYXlMaXN0IDxTdHJpbmc+IHN1cHBvcnRlZF9jb2RlYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPiggTGlzdC5vZigKLSAgICAgICAgIkxDMyIKLSAgICApKTsKLQotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUNvZGVjQ29uZmlnUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUW9zQ29uZmlnUmVjZWl2ZXI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX1BFUk0gPSBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9QUklWSUxFR0VEID0KLSAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfUFJJVklMRUdFRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFVE9PVEhfQURNSU5fUEVSTSA9IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CTFVFVE9PVEhfQURNSU47Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1VQREFURV9DT0RFQ19DT05GSUcgPQotICAgICAgICAgICAgICAgICJxdGkuaW50ZW50LmJsdWV0b290aC5hY3Rpb24uVVBEQVRFX0NPREVDX0NPTkZJRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUNfSUQgPQotICAgICAgICAgICAgICAgICJxdGkuYmx1ZXRvb3RoLmV4dHJhLkNPREVDX0lEIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQ19DT05GSUcgPQotICAgICAgICAgICAgICAgICJxdGkuYmx1ZXRvb3RoLmV4dHJhLkNPREVDX0NPTkZJRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTk5FTF9NT0RFID0KLSAgICAgICAgICAgICAgICAicXRpLmJsdWV0b290aC5leHRyYS5DSEFOTkVMX01PREUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VUERBVEVfUU9TX0NPTkZJRyA9Ci0gICAgICAgICAgICAgICAgInF0aS5pbnRlbnQuYmx1ZXRvb3RoLmFjdGlvbi5VUERBVEVfUU9TX0NPTkZJRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUU9TX0NPTkZJRyA9Ci0gICAgICAgICAgICAgICAgInF0aS5ibHVldG9vdGguZXh0cmEuUU9TX0NPTkZJRyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ERVZJQ0VTID0gMjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBUE06IE1lZGlhQXVkaW8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBVURJT19SRUNPUkRJTkdfTUFTSyA9IDB4MDAwMzAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBVURJT19SRUNPUkRJTkdfT0ZGID0gMHgwMDAxMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFVRElPX1JFQ09SRElOR19PTiA9IDB4MDAwMjAwMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEdBTUlOR19PRkYgPSAweDAwMDAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR0FNSU5HX09OID0gMHgwMDAwMjAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEdBTUlOR19NT0RFX01BU0sgPSAweDAwMDA3MDAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtSXNSZWNvcmRpbmdFbmFibGVkOwotCi0gICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLQotICAgIHByaXZhdGUgTWVkaWFBdWRpbyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiaW5pdGlhbGl6YXRpb24iKTsKLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1NZWRpYURldmljZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBNZWRpYURldmljZT4oKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobUF1ZGlvTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW9NYW5hZ2VyIGNhbm5vdCBiZSBudWxsIHdoZW4gQTJkcFNlcnZpY2Ugc3RhcnRzIik7Ci0KLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKTsKLSAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLQotICAgICAgICBtQmFwQnJvYWRjYXN0TWFuYWdlciA9IG5ldyBCYXBCcm9hZGNhc3RNYW5hZ2VyKCk7Ci0KLSAgICAgICAgSW50ZW50RmlsdGVyIGNvZGVjRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBjb2RlY0ZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX1VQREFURV9DT0RFQ19DT05GSUcpOwotICAgICAgICBtQ29kZWNDb25maWdSZWNlaXZlciA9IG5ldyBMZUNvZGVjQ29uZmlnKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQ29kZWNDb25maWdSZWNlaXZlciwgY29kZWNGaWx0ZXIpOwotCi0gICAgICAgIEludGVudEZpbHRlciBxb3NGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIHFvc0ZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX1VQREFURV9RT1NfQ09ORklHKTsKLSAgICAgICAgbVFvc0NvbmZpZ1JlY2VpdmVyID0gbmV3IFFvc0NvbmZpZ1JlY2VpdmVyKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUW9zQ29uZmlnUmVjZWl2ZXIsIHFvc0ZpbHRlcik7Ci0KLSAgICAgICAgbUlzUmVjb3JkaW5nRW5hYmxlZCA9Ci0gICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQucmVjb3JkaW5nX3N1cHBvcnRlZCIsIGZhbHNlKTsKLQotICAgICAgICAvLzIgU2V0dXAgQ29kZWMgQ29uZmlnIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhQXVkaW8gaW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYoc01lZGlhQXVkaW8gPT0gbnVsbCkgewotICAgICAgICAgICAgc01lZGlhQXVkaW8gPSBuZXcgTWVkaWFBdWRpbyhjb250ZXh0KTsKLSAgICAgICAgICAgIE1lZGlhQXVkaW9JbnRmLmluaXQoc01lZGlhQXVkaW8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzTWVkaWFBdWRpbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhQXVkaW8gZ2V0KCkgewotICAgICAgICByZXR1cm4gc01lZGlhQXVkaW87Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBjb25uZWN0IChkZXZpY2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCb29sZWFuIGFsbFByb2ZpbGUpIHsKLSAgICAgICAgcmV0dXJuIGNvbm5lY3QgKGRldmljZSwgYWxsUHJvZmlsZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGF1dG9Db25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmUoVEFHLCAiYXV0b0Nvbm5lY3Q6ICIgKyBkZXZpY2UpOwotICAgICAgICByZXR1cm4gY29ubmVjdChkZXZpY2UsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIGFsbFByb2ZpbGUsIGJvb2xlYW4gYXV0b0Nvbm5lY3QpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLCAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwotCi0gICAgICAgIExvZy5lKFRBRywgImNvbm5lY3Q6ICIgKyBkZXZpY2UgKyAiIGFsbFByb2ZpbGU6ICIgKyBhbGxQcm9maWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXV0b0Nvbm5lY3Q6ICIgKyBhdXRvQ29ubmVjdCk7Ci0gICAgICAgIGlmIChnZXRDb25uZWN0aW9uUG9saWN5KGRldmljZSkgPT0gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9GT1JCSURERU4pIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBjb25uZWN0IHRvICIgKyBkZXZpY2UgKyAiIDogQ09OTkVDVElPTl9QT0xJQ1lfRk9SQklEREVOIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRNYXAgPSBEZXZpY2VQcm9maWxlTWFwLmdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpOwotICAgICAgICBpZiAoZE1hcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGludCBwZWVyX3N1cHBvcnRlZF9wcm9maWxlcyA9IGRNYXAuZ2V0QWxsU3VwcG9ydGVkUHJvZmlsZShkZXZpY2UpOwotICAgICAgICBib29sZWFuIGlzX3BlZXJfc3VwcG9ydF9yZWNvcmRpbmcgPQotICAgICAgICAgICAgICAgICgocGVlcl9zdXBwb3J0ZWRfcHJvZmlsZXMgJiBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9SRUNPUkRJTkcpICE9IDApOwotICAgICAgICBpbnQgcHJvZmlsZUlEID0gZE1hcC5nZXRTdXBwb3J0ZWRQcm9maWxlKGRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgIGlmIChwcm9maWxlSUQgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDYW4gTm90IGNvbm5lY3QgdG8gIiArIGRldmljZSArICIuIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IG1lZGlhIHNlcnZpY2UuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYURldmljZSBtTWVkaWFEZXZpY2UgPSBtTWVkaWFEZXZpY2VzLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgaWYobU1lZGlhRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmKG1NZWRpYURldmljZXMuc2l6ZSgpID49IE1BWF9ERVZJQ0VTKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIG1NZWRpYURldmljZSA9IG5ldyBNZWRpYURldmljZShkZXZpY2UsIHByb2ZpbGVJRCk7Ci0gICAgICAgICAgICBtTWVkaWFEZXZpY2VzLnB1dChkZXZpY2UuZ2V0QWRkcmVzcygpLCBtTWVkaWFEZXZpY2UpOwotICAgICAgICB9IGVsc2UgaWYobU1lZGlhRGV2aWNlLmRldmljZUNvbm5TdGF0dXMgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBhbHJlYWR5IGNvbm5lY3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUCAmIHByb2ZpbGVJRCkgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BMkRQKSB7Ci0gICAgICAgICAgICBBMmRwU2VydmljZSBzZXJ2aWNlID0gQTJkcFNlcnZpY2UuZ2V0QTJkcFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UuY29ubmVjdEEyZHAoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aERldmljZSBncm91cERldmljZSA9IGRldmljZTsKLSAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIG1TdHJlYW1TZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotCi0gICAgICAgIGlmKG1TdHJlYW1TZXJ2aWNlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEgJiBwcm9maWxlSUQpID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBKSB7Ci0gICAgICAgICAgICBpbnQgZGVmYXVsdE1lZGlhUHJvZmlsZSA9IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBOwotCi0gICAgICAgICAgICAvKiBoYW5kbGUgY29tbW9uIGNvbmVjdCBvZiBjYWxsIGFuZCBtZWRpYSBhdWRpbyAqLwotICAgICAgICAgICAgaWYoYXV0b0Nvbm5lY3QpIHsKLSAgICAgICAgICAgICAgICBncm91cERldmljZSA9IG1TdHJlYW1TZXJ2aWNlLmdldERldmljZUdyb3VwKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQXV0byBDb25uZWN0IFJlcXVlc3QuIENvbm5lY3RpbmcgZ3JvdXA6ICIgKyBncm91cERldmljZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qaW50IGRlZmF1bHRNdXNpY1Byb2ZpbGUgPSBkTWFwLmdldFByb2ZpbGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgIGlmKChBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFAgJiBkZWZhdWx0TXVzaWNQcm9maWxlKSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFApIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBMkRQIGlzIGRlZmF1bHQgcHJvZmlsZSBmb3IgTXVzaWMsIGNvbmZpZ3VyZSBCQVAgZm9yIEdhbWluZyIpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRNZWRpYVByb2ZpbGUgPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9HQ1A7Ci0gICAgICAgICAgICB9Ki8KLQotICAgICAgICAgICAgaWYobUlzUmVjb3JkaW5nRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFkZCBSZWNvcmRpbmcgcHJvZmlsZSB0byBMRSBjb25uZWN0IHJlcXVlc3QiKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0TWVkaWFQcm9maWxlID0gZGVmYXVsdE1lZGlhUHJvZmlsZSB8IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoYWxsUHJvZmlsZSkgewotICAgICAgICAgICAgICAgIGludCBjYWxsUHJvZmlsZUlEID0gZE1hcC5nZXRTdXBwb3J0ZWRQcm9maWxlKGRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgICAgICBpZigoY2FsbFByb2ZpbGVJRCAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWRkIEJBUF9DQUxMIHRvIExFIGNvbm5lY3QgcmVxdWVzdCIpOwotICAgICAgICAgICAgICAgICAgICBtU3RyZWFtU2VydmljZS5jb25uZWN0TGVTdHJlYW0oZ3JvdXBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVkaWFQcm9maWxlIHwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVNlcnZpY2UuY29ubmVjdExlU3RyZWFtKGdyb3VwRGV2aWNlLCBkZWZhdWx0TWVkaWFQcm9maWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdHJlYW1TZXJ2aWNlLmNvbm5lY3RMZVN0cmVhbShncm91cERldmljZSwgZGVmYXVsdE1lZGlhUHJvZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBkaXNjb25uZWN0KGRldmljZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgQm9vbGVhbiBhbGxQcm9maWxlKSB7Ci0gICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwgIk5lZWQgQkxVRVRPT1RIIEFETUlOIHBlcm1pc3Npb24iKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiRGlzY29ubmVjdDogIiArIGRldmljZSk7Ci0gICAgICAgIE1lZGlhRGV2aWNlIG1NZWRpYURldmljZSA9IG51bGw7Ci0KLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGlmKG1NZWRpYURldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmU6IERldmljZSAiICsgZGV2aWNlICsgIiBub3QgcHJlc2VudCBpbiBsaXN0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1lZGlhRGV2aWNlLnByb2ZpbGVDb25uU3RhdHVzW01lZGlhRGV2aWNlLkEyRFBfU1RSRUFNXSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgQTJkcFNlcnZpY2Ugc2VydmljZSA9IEEyZHBTZXJ2aWNlLmdldEEyZHBTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmRpc2Nvbm5lY3RBMmRwKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NZWRpYURldmljZS5wcm9maWxlQ29ublN0YXR1c1tNZWRpYURldmljZS5MRV9TVFJFQU1dICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIERldmljZVByb2ZpbGVNYXAgZE1hcCA9IERldmljZVByb2ZpbGVNYXAuZ2V0RGV2aWNlUHJvZmlsZU1hcEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkTWFwLmlzUHJvZmlsZUNvbm5lY3RlZChkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiQkFQX0NBTEwgbm90IGNvbm5lY3RlZCIpOwotICAgICAgICAgICAgICAgICAgICBhbGxQcm9maWxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlcnZpY2UuZGlzY29ubmVjdExlU3RyZWFtKGRldmljZSwgYWxsUHJvZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImdldENvbm5lY3RlZERldmljZXM6ICIpOwotICAgICAgICBpZihtTWVkaWFEZXZpY2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZERldmljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yKE1lZGlhRGV2aWNlIG1NZWRpYURldmljZSA6IG1NZWRpYURldmljZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmKG1NZWRpYURldmljZS5kZXZpY2VDb25uU3RhdHVzID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGVkRGV2aWNlcy5hZGQobU1lZGlhRGV2aWNlLm1EZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25uZWN0ZWREZXZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhJbnRlZ2VyW10gc3RhdGVzKSB7Ci0gICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKLQotICAgICAgICBMb2cuaShUQUcsICJnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzOiAiKTsKLSAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgaWYgKHN0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlczsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aERldmljZSBbXSBib25kZWREZXZpY2VzID0gbnVsbDsKLSAgICAgICAgYm9uZGVkRGV2aWNlcyA9IG1BZGFwdGVyU2VydmljZS5nZXRCb25kZWREZXZpY2VzKCk7Ci0gICAgICAgIGlmKGJvbmRlZERldmljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBib25kZWREZXZpY2VzKSB7Ci0gICAgICAgICAgICBNZWRpYURldmljZSBtTWVkaWFEZXZpY2U7Ci0gICAgICAgICAgICBpbnQgc3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLQotICAgICAgICAgICAgRGV2aWNlUHJvZmlsZU1hcCBkTWFwID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmKGRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihkTWFwLmdldFByb2ZpbGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBpZihtTWVkaWFEZXZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IG1NZWRpYURldmljZS5kZXZpY2VDb25uU3RhdHVzOwotCi0gICAgICAgICAgICBmb3IoaW50IHM6IHN0YXRlcykgewotICAgICAgICAgICAgICAgIGlmKHMgPT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotCi0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotCi0gICAgICAgIE1lZGlhRGV2aWNlIG1NZWRpYURldmljZSA9IG1NZWRpYURldmljZXMuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBpZihtTWVkaWFEZXZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtTWVkaWFEZXZpY2UuZGV2aWNlQ29ublN0YXR1czsKLQotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKLSAgICAgICAgaWYobUFkYXB0ZXJTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWRhcHRlclNlcnZpY2UuZ2V0RGF0YWJhc2UoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9maWxlQ29ubmVjdGlvblBvbGljeShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuUFJJT1JJVFlfVU5ERUZJTkVEOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQTJkcFBsYXlpbmcoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7Ci0KLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTWVkaWFEZXZpY2UgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGlmKG1NZWRpYURldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJpc0EyZHBQbGF5aW5nOiAiICsgbU1lZGlhRGV2aWNlLnN0cmVhbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gKG1NZWRpYURldmljZS5zdHJlYW1TdGF0dXMgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgZ2V0Q29kZWNTdGF0dXMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAiZ2V0Q29kZWNTdGF0dXM6IGZvciBkZXZpY2U6ICIgKyBkZXZpY2UpOwotICAgICAgICBpZihkZXZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGlmIChtQmFwQnJvYWRjYXN0TWFuYWdlci5pc0JhcEJyb2FkY2FzdEFjdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJhcEJyb2FkY2FzdE1hbmFnZXIuZ2V0Q29kZWNTdGF0dXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG1BY3RpdmVEZXZpY2VNYW5hZ2VyID0gQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgIGludCBwcm9maWxlID0gbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlUHJvZmlsZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgaWYocHJvZmlsZSAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLk5PTkUgJiYgcHJvZmlsZSAhPSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFApIHsKLSAgICAgICAgICAgIFN0cmVhbUF1ZGlvU2VydmljZSBzZXJ2aWNlID0gU3RyZWFtQXVkaW9TZXJ2aWNlLmdldFN0cmVhbUF1ZGlvU2VydmljZSgpOwotICAgICAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gc2VydmljZS5nZXREZXZpY2VHcm91cChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFEZXZpY2UgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIExvZy5pKFRBRywgImdldENvZGVjU3RhdHVzOiBmb3IgbU1lZGlhRGV2aWNlOiAiICsgbU1lZGlhRGV2aWNlKTsKLSAgICAgICAgaWYobU1lZGlhRGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBMb2cuaShUQUcsICJnZXRDb2RlY1N0YXR1czogIiArIG1NZWRpYURldmljZS5tQ29kZWNTdGF0dXMpOwotICAgICAgICByZXR1cm4gbU1lZGlhRGV2aWNlLm1Db2RlY1N0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2UoQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZyBjb2RlY0NvbmZpZykgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtRGV2aWNlOwotCi0gICAgICAgIExvZy5pKFRBRywgInNldENvZGVjQ29uZmlnUHJlZmVyZW5jZTogIiArIGNvZGVjQ29uZmlnKTsKLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmKG1BY3RpdmVEZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGNvZGVjQ29uZmlnID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNldENvZGVjQ29uZmlnUHJlZmVyZW5jZTogQ29kZWMgY29uZmlnIGNhbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb25nIGNzNCA9IGNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWM0KCk7Ci0KLSAgICAgICAgaWYgKG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZVByb2ZpbGUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTykgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQlJPQURDQVNUX0xFKSB7Ci0gICAgICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgbVByZXZEZXZpY2UgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRRdWV1ZWREZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICBpZiAobVByZXZEZXZpY2UgIT0gbnVsbCAmJiBtQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjczQgJiBBVURJT19SRUNPUkRJTkdfTUFTSykgPT0gQVVESU9fUkVDT1JESU5HX09OKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdGUobVByZXZEZXZpY2UpID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBtUHJldkRldmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiUmVjb3JkaW5nIHJlcXVlc3QsIHN3aXRjaCBkZXZpY2UgdG8gIiArIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIk5vdCBEVU1PIGRldmljZSwgaWdub3JlIHJlY29yZGluZyByZXF1ZXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjczQgJiBHQU1JTkdfTU9ERV9NQVNLKSA9PSBHQU1JTkdfT04pIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmUgZ2FtaW5nIG1vZGUgcmVxdWVzdCB3aGVuIGJyb2FkY2FzdCBpcyBhY3RpdmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRNYXAgPSBEZXZpY2VQcm9maWxlTWFwLmdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpOwotICAgICAgICBpbnQgc3VwcG9ydGVkX3ByZmlsZXMgPSBkTWFwLmdldEFsbFN1cHBvcnRlZFByb2ZpbGUoZGV2aWNlKTsKLQotICAgICAgICBNZWRpYURldmljZSBtTWVkaWFEZXZpY2UgPSBtTWVkaWFEZXZpY2VzLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgYm9vbGVhbiBwZWVyX3N1cHBvcnRzX3JlY29yZGluZyA9Ci0gICAgICAgICAgICAgICAgKChzdXBwb3J0ZWRfcHJmaWxlcyAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORykgIT0gMCk7Ci0KLSAgICAgICAgaW50IHByb2ZpbGVJbmRleCA9IG1NZWRpYURldmljZS5nZXRQcm9maWxlSW5kZXgoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEpOwotICAgICAgICBpbnQgcHJvZmlsZUluZGV4QTJkcCA9IG1NZWRpYURldmljZS5nZXRQcm9maWxlSW5kZXgoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BMkRQKTsKLSAgICAgICAgYm9vbGVhbiBpc19wZWVyX2Nvbm5lY3RlZF9mb3JfcmVjb3JkaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTWVkaWFEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbcHJvZmlsZUluZGV4XSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKTsKLSAgICAgICAgYm9vbGVhbiBpc19wZWVyX2Nvbm5lY3RlZF9mb3JfYTJkcCA9IChtTWVkaWFEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbcHJvZmlsZUluZGV4QTJkcF0gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgIExvZy5pKFRBRywgImlzX3BlZXJfY29ubmVjdGVkX2Zvcl9yZWNvcmRpbmc6ICIgKyBpc19wZWVyX2Nvbm5lY3RlZF9mb3JfcmVjb3JkaW5nICsKLSAgICAgICAgICAgICAgICAgICAiLCBpc19wZWVyX2Nvbm5lY3RlZF9mb3JfYTJkcDogIiArIGlzX3BlZXJfY29ubmVjdGVkX2Zvcl9hMmRwKTsKLSAgICAgICAgQ2FsbEF1ZGlvIG1DYWxsQXVkaW8gPSBDYWxsQXVkaW8uZ2V0KCk7Ci0gICAgICAgIGJvb2xlYW4gaXNJbkNhbGwgPSBtQ2FsbEF1ZGlvICE9IG51bGwgJiYgbUNhbGxBdWRpby5pc1ZvaWNlT3JDYWxsQWN0aXZlKCk7Ci0gICAgICAgIC8vIFRPRE8gOiBjaGVjayB0aGUgRk0gcmVsYXRlZCByeCBhY3Rpdml0eQotICAgICAgICBpZiAobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCAmJgotICAgICAgICAgICAgcGVlcl9zdXBwb3J0c19yZWNvcmRpbmcgJiYgbUlzUmVjb3JkaW5nRW5hYmxlZCAmJgotICAgICAgICAgICAgaXNfcGVlcl9jb25uZWN0ZWRfZm9yX3JlY29yZGluZyAmJiBpc19wZWVyX2Nvbm5lY3RlZF9mb3JfYTJkcCkgewotICAgICAgICAgICAgaWYgKChjczQgJiBBVURJT19SRUNPUkRJTkdfTUFTSykgPT0gQVVESU9fUkVDT1JESU5HX09OKSB7Ci0gICAgICAgICAgICAgICAgaWYoIWlzSW5DYWxsICYmCi0gICAgICAgICAgICAgICAgICAgIW1BY3RpdmVEZXZpY2VNYW5hZ2VyLmlzUmVjb3JkaW5nQWN0aXZlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgIG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmVuYWJsZVJlY29yZGluZyhkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICgoY3M0ICYgQVVESU9fUkVDT1JESU5HX01BU0spID09IEFVRElPX1JFQ09SRElOR19PRkYpIHsKLSAgICAgICAgICAgICAgICBpZihtQWN0aXZlRGV2aWNlTWFuYWdlci5pc1JlY29yZGluZ0FjdGl2ZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlTWFuYWdlci5kaXNhYmxlUmVjb3JkaW5nKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0JhcENvbm5lY3RlZCA9IChtTWVkaWFEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbbU1lZGlhRGV2aWNlLkxFX1NUUkVBTV0KLSAgICAgICAgICAgICAgICAgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpOwotCi0gICAgICAgIGlmKGlzQmFwQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBsb25nIG1HYW1pbmdTdGF0dXMgPSAoY3M0ICYgR0FNSU5HX01PREVfTUFTSyk7Ci0gICAgICAgICAgICBpZigobUdhbWluZ1N0YXR1cyAmIEdBTUlOR19PTikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVHVybmluZyBPbiBHYW1pbmcgTW9kZSIpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmVuYWJsZUdhbWluZyhkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZigobUdhbWluZ1N0YXR1cyAmIEdBTUlOR19PRkYpID4gMCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlR1cm5pbmcgT2ZmIEdhbWluZyBNb2RlIik7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuZGlzYWJsZUdhbWluZyhkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBwcm9maWxlSUQgPSBkTWFwLmdldFByb2ZpbGUoZGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLQotICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkEyRFAgPT0gcHJvZmlsZUlEKSB7Ci0gICAgICAgICAgICBpZihjb2RlY0NvbmZpZy5nZXRDb2RlY1R5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWcuU09VUkNFX0NPREVDX1RZUEVfTEMzKSB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEEyZHBTZXJ2aWNlIHNlcnZpY2UgPSBBMmRwU2VydmljZS5nZXRBMmRwU2VydmljZSgpOwotICAgICAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5zZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2VBMmRwKGRldmljZSwgY29kZWNDb25maWcpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS8qIGVsc2UgaWYoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVAgPT0gcHJvZmlsZUlEKSB7IC8vIG9uY2UgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgIExlU3RyZWFtU2VydmljZSBzZXJ2aWNlID0gTGVTdHJlYW1TZXJ2aWNlLmdldExlU3RyZWFtU2VydmljZSgpOwotICAgICAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5zZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2VMZVN0cmVhbShkZXZpY2UsIGNvZGVjQ29uZmlnKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0qLwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5hYmxlT3B0aW9uYWxDb2RlY3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7Ci0gICAgICAgIExvZy5pKFRBRywgImVuYWJsZU9wdGlvbmFsQ29kZWNzOiAiKTsKLQotICAgICAgICBCbHVldG9vdGhDb2RlY1N0YXR1cyBtQ29kZWNTdGF0dXMgPSBudWxsOwotCi0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImVuYWJsZU9wdGlvbmFsQ29kZWNzOiBJbnZhbGlkIGRldmljZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldFN1cHBvcnRzT3B0aW9uYWxDb2RlY3MoZGV2aWNlKSAhPSBCbHVldG9vdGhBMmRwLk9QVElPTkFMX0NPREVDU19TVVBQT1JURUQpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImVuYWJsZU9wdGlvbmFsQ29kZWNzOiBObyBvcHRpb25hbCBjb2RlY3MiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhRGV2aWNlIG1NZWRpYURldmljZSA9IG1NZWRpYURldmljZXMuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOwotCi0gICAgICAgIEEyZHBTZXJ2aWNlIHNlcnZpY2UgPSBBMmRwU2VydmljZS5nZXRBMmRwU2VydmljZSgpOwotICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBwcm9maWxlSW5kZXggPSBtTWVkaWFEZXZpY2UuZ2V0UHJvZmlsZUluZGV4KEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUCk7Ci0gICAgICAgICAgICBtQ29kZWNTdGF0dXMgPSBtTWVkaWFEZXZpY2UubVByb2ZpbGVDb2RlY1N0YXR1c1twcm9maWxlSW5kZXhdOwotICAgICAgICAgICAgaWYobUNvZGVjU3RhdHVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmVuYWJsZU9wdGlvbmFsQ29kZWNzQTJkcChkZXZpY2UsIG1Db2RlY1N0YXR1cy5nZXRDb2RlY0NvbmZpZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyAyIFNob3VsZCBpbXBsZW1lbnQgY29tbW9uIGNvZGVjIGhhbmRsaW5nIHdoZW4KLSAgICAgICAgLy92ZW5kb3IgY29kZWNzIGlzIGludHJvZHVjZWQgaW4gTEUgQXVkaW8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlT3B0aW9uYWxDb2RlY3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7Ci0gICAgICAgIExvZy5pKFRBRywgImRpc2FibGVPcHRpb25hbENvZGVjczogIik7Ci0gICAgICAgIEJsdWV0b290aENvZGVjU3RhdHVzIG1Db2RlY1N0YXR1cyA9IG51bGw7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImRpc2FibGVPcHRpb25hbENvZGVjczogSW52YWxpZCBkZXZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRTdXBwb3J0c09wdGlvbmFsQ29kZWNzKGRldmljZSkgIT0gQmx1ZXRvb3RoQTJkcC5PUFRJT05BTF9DT0RFQ1NfU1VQUE9SVEVEKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJkaXNhYmxlT3B0aW9uYWxDb2RlY3M6IE5vIG9wdGlvbmFsIGNvZGVjcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFEZXZpY2UgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgQTJkcFNlcnZpY2Ugc2VydmljZSA9IEEyZHBTZXJ2aWNlLmdldEEyZHBTZXJ2aWNlKCk7Ci0gICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHByb2ZpbGVJbmRleCA9IG1NZWRpYURldmljZS5nZXRQcm9maWxlSW5kZXgoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BMkRQKTsKLSAgICAgICAgICAgIG1Db2RlY1N0YXR1cyA9IG1NZWRpYURldmljZS5tUHJvZmlsZUNvZGVjU3RhdHVzW3Byb2ZpbGVJbmRleF07Ci0gICAgICAgICAgICBpZihtQ29kZWNTdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UuZGlzYWJsZU9wdGlvbmFsQ29kZWNzQTJkcChkZXZpY2UsIG1Db2RlY1N0YXR1cy5nZXRDb2RlY0NvbmZpZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyAyIFNob3VsZCBpbXBsZW1lbnQgY29tbW9uIGNvZGVjIGhhbmRsaW5nIHdoZW4KLSAgICAgICAgLy92ZW5kb3IgY29kZWNzIGlzIGludHJvZHVjZWQgaW4gTEUgQXVkaW8KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN1cHBvcnRzT3B0aW9uYWxDb2RlY3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZihtQWRhcHRlclNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtQWRhcHRlclNlcnZpY2UuZ2V0RGF0YWJhc2UoKS5nZXRBMmRwU3VwcG9ydHNPcHRpb25hbENvZGVjcyhkZXZpY2UpOwotICAgICAgICByZXR1cm4gQmx1ZXRvb3RoQTJkcC5PUFRJT05BTF9DT0RFQ1NfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHN1cHBvcnRzT3B0aW9uYWxDb2RlY3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7Ci0gICAgICAgIGlmKG1BZGFwdGVyU2VydmljZS5pc1R3c1BsdXNEZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2FibGUgb3B0aW9uYWwgY29kZWMgc3VwcG9ydCBmb3IgVFdTKyBkZXZpY2UiKTsKLSAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoQTJkcC5PUFRJT05BTF9DT0RFQ1NfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0U3VwcG9ydHNPcHRpb25hbENvZGVjcyhkZXZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0T3B0aW9uYWxDb2RlY3NFbmFibGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLCAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwotICAgICAgICBpZihtQWRhcHRlclNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtQWRhcHRlclNlcnZpY2UuZ2V0RGF0YWJhc2UoKS5nZXRBMmRwT3B0aW9uYWxDb2RlY3NFbmFibGVkKGRldmljZSk7Ci0gICAgICAgIHJldHVybiBCbHVldG9vdGhBMmRwLk9QVElPTkFMX0NPREVDU19QUkVGX1VOS05PV047Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWxDb2RlY3NFbmFibGVkKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAic2V0T3B0aW9uYWxDb2RlY3NFbmFibGVkOiAiICsgdmFsdWUpOwotICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBCbHVldG9vdGhBMmRwLk9QVElPTkFMX0NPREVDU19QUkVGX1VOS05PV04KLSAgICAgICAgICAgICAgICAmJiB2YWx1ZSAhPSBCbHVldG9vdGhBMmRwLk9QVElPTkFMX0NPREVDU19QUkVGX0RJU0FCTEVECi0gICAgICAgICAgICAgICAgJiYgdmFsdWUgIT0gQmx1ZXRvb3RoQTJkcC5PUFRJT05BTF9DT0RFQ1NfUFJFRl9FTkFCTEVEKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkIHZhbHVlIHBhc3NlZCB0byBzZXRPcHRpb25hbENvZGVjc0VuYWJsZWQ6IiArIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1BZGFwdGVyU2VydmljZSAhPSBudWxsKQotICAgICAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlLmdldERhdGFiYXNlKCkuc2V0QTJkcE9wdGlvbmFsQ29kZWNzRW5hYmxlZChkZXZpY2UsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZihtQWRhcHRlclNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtQWRhcHRlclNlcnZpY2UuZ2V0RGF0YWJhc2UoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9maWxlQ29ubmVjdGlvblBvbGljeShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCk7Ci0gICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX1VOS05PV047Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Q29ubmVjdGlvblBvbGljeShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIGNvbm5lY3Rpb25Qb2xpY3kpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QUklWSUxFR0VELAotICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9QUklWSUxFR0VEIHBlcm1pc3Npb24iKTsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2F2ZWQgY29ubmVjdGlvblBvbGljeSAiICsgZGV2aWNlICsgIiA9ICIgKyBjb25uZWN0aW9uUG9saWN5KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHNldFN1Y2Nlc3NmdWxseTsKLSAgICAgICAgc2V0U3VjY2Vzc2Z1bGx5ID0gbUFkYXB0ZXJTZXJ2aWNlLmdldERhdGFiYXNlKCkKLSAgICAgICAgICAgICAgICAuc2V0UHJvZmlsZUNvbm5lY3Rpb25Qb2xpY3koZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkEyRFAsIGNvbm5lY3Rpb25Qb2xpY3kpOwotCi0gICAgICAgIGlmIChzZXRTdWNjZXNzZnVsbHkgJiYgY29ubmVjdGlvblBvbGljeSA9PSBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIGNvbm5lY3QoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXRTdWNjZXNzZnVsbHkKLSAgICAgICAgICAgICAgICAmJiBjb25uZWN0aW9uUG9saWN5ID09IEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfRk9SQklEREVOKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNldFN1Y2Nlc3NmdWxseTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRTaWxlbmNlTW9kZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCb29sZWFuIHNpbGVuY2UpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0U2lsZW5jZU1vZGUoIiArIGRldmljZSArICIpOiAiICsgc2lsZW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1BY3RpdmVEZXZpY2UgPSBtQWN0aXZlRGV2aWNlTWFuYWdlci5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgIGlmIChzaWxlbmNlICYmIE9iamVjdHMuZXF1YWxzKG1BY3RpdmVEZXZpY2UsIGRldmljZSkpIHsKLSAgICAgICAgICAgIG1BY3RpdmVEZXZpY2VNYW5hZ2VyLnJlbW92ZUFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIGlmICghc2lsZW5jZSAmJiBudWxsID09Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlRGV2aWNlKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pKSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGRldmljZSBhcyB0aGUgYWN0aXZlIGRldmljZSBpZiBjdXJyZW50bHkgbm8gYWN0aXZlIGRldmljZS4KLSAgICAgICAgICAgIG1BY3RpdmVEZXZpY2VNYW5hZ2VyLnNldEFjdGl2ZURldmljZShkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8sIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNvbm5TdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIHN0YXRlLCBJbnRlZ2VyIHByb2ZpbGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25Db25uU3RhdGVDaGFuZ2U6IHByb2ZpbGU6ICIgKyBwcm9maWxlICsgIiBzdGF0ZTogIiArIHN0YXRlICsgIiBmb3IgZGV2aWNlICIgKyBkZXZpY2UpOwotICAgICAgICBpZihkZXZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgTWVkaWFEZXZpY2UgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgaWYobU1lZGlhRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmKG1NZWRpYURldmljZXMuc2l6ZSgpID49IE1BWF9ERVZJQ0VTKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lZGlhRGV2aWNlID0gbmV3IE1lZGlhRGV2aWNlKGRldmljZSwgcHJvZmlsZSwgc3RhdGUpOwotICAgICAgICAgICAgbU1lZGlhRGV2aWNlcy5wdXQoZGV2aWNlLmdldEFkZHJlc3MoKSwgbU1lZGlhRGV2aWNlKTsKLSAgICAgICAgICAgIGJyb2FkY2FzdENvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVELCBzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcHJvZmlsZUluZGV4ID0gbU1lZGlhRGV2aWNlLmdldFByb2ZpbGVJbmRleChwcm9maWxlKTsKLSAgICAgICAgaW50IHByZXZTdGF0ZSA9IG1NZWRpYURldmljZS5kZXZpY2VDb25uU3RhdHVzOwotICAgICAgICBpZihtTWVkaWFEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbcHJvZmlsZUluZGV4XSA9PSBzdGF0ZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJvZmlsZSBhbHJlYWR5IGluIHN0YXRlOiAiICsgc3RhdGUgKyAiLiBSZXR1cm4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbcHJvZmlsZUluZGV4XSA9IHN0YXRlOwotCi0gICAgICAgIGlmKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRNYXAgPSBEZXZpY2VQcm9maWxlTWFwLmdldERldmljZVByb2ZpbGVNYXBJbnN0YW5jZSgpOwotICAgICAgICAgICAgZE1hcC5wcm9maWxlQ29ubmVjdGlvblVwZGF0ZShkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8sIHByb2ZpbGUsIHRydWUpOwotICAgICAgICAgICAgcmVmcmVzaEN1cnJlbnRDb2RlYyhkZXZpY2UpOwotICAgICAgICB9IGVsc2UgaWYoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIERldmljZVByb2ZpbGVNYXAgZE1hcCA9IERldmljZVByb2ZpbGVNYXAuZ2V0RGV2aWNlUHJvZmlsZU1hcEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBkTWFwLnByb2ZpbGVDb25uZWN0aW9uVXBkYXRlKGRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTywgcHJvZmlsZSwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG90aGVyUHJvZmlsZUNvbm5lY3Rpb25TdGF0ZSA9IG1NZWRpYURldmljZS5wcm9maWxlQ29ublN0YXR1c1socHJvZmlsZUluZGV4KzEpJTJdOwotICAgICAgICBMb2cudyhUQUcsICIgb3RoZXJQcm9maWxlQ29ubmVjdGlvblN0YXRlOiAiICsgb3RoZXJQcm9maWxlQ29ubmVjdGlvblN0YXRlKTsKLQotICAgICAgICBzd2l0Y2gob3RoZXJQcm9maWxlQ29ubmVjdGlvblN0YXRlKSB7Ci0gICAgICAgIC8qU2VuZCBCcm9hZGNhc3QgYmFzZWQgb24gc3RhdGUgb2Ygb3RoZXIgcHJvZmlsZSovCi0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIHByZXZTdGF0ZSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIG1NZWRpYURldmljZS5kZXZpY2VDb25uU3RhdHVzID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBpZihzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RDb25uU3RhdGVDaGFuZ2UoZGV2aWNlLCBwcmV2U3RhdGUsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhRGV2aWNlLmRldmljZUNvbm5TdGF0dXMgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBpZihzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIHByZXZTdGF0ZSwgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UuZGV2aWNlQ29ublN0YXR1cyA9IHN0YXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZURldmljZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLQotICAgICAgICAgICAgICAgIGlmKChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZXF1YWxzKG1BY3RpdmVEZXZpY2UpKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvbkNvbm5TdGF0ZUNoYW5nZTogVHJpZ2dlciBNZWRpYSBoYW5kb2ZmIGZvciBEZXZpY2U6ICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlTWFuYWdlci5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9maWxlSW5kZXggPT0gbU1lZGlhRGV2aWNlLkxFX1NUUkVBTSAmJgotICAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBtTWVkaWFEZXZpY2UubVByb2ZpbGVDb2RlY1N0YXR1c1twcm9maWxlSW5kZXhdID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ29ublN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSwgaW50IHByb2ZpbGUsIGJvb2xlYW4gaXNGaXJzdE1lbWJlcikgewotICAgICAgICBMb2cudyhUQUcsICJvbkNvbm5TdGF0ZUNoYW5nZTogc3RhdGU6IiArIHN0YXRlICsgIiBmb3IgZGV2aWNlICIgKyBkZXZpY2UgKyAiIG5ldyBncm91cDogIiArIGlzRmlyc3RNZW1iZXIpOwotICAgICAgICBpZigoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQgfHwgc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNGaXJzdE1lbWJlcikgewotICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIG1TdHJlYW1BdWRpb1NlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZ3JvdXBEZXZpY2UgPSBtU3RyZWFtQXVkaW9TZXJ2aWNlLmdldERldmljZUdyb3VwKGRldmljZSk7Ci0gICAgICAgICAgICBpZihncm91cERldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFEZXZpY2UgbU1lZGlhRGV2aWNlID0gbU1lZGlhRGV2aWNlcy5nZXQoZ3JvdXBEZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgICAgICBpZihtTWVkaWFEZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UgPSBuZXcgTWVkaWFEZXZpY2UoZ3JvdXBEZXZpY2UsIHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhRGV2aWNlcy5wdXQoZ3JvdXBEZXZpY2UuZ2V0QWRkcmVzcygpLCBtTWVkaWFEZXZpY2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwcm9maWxlSW5kZXggPSBtTWVkaWFEZXZpY2UuZ2V0UHJvZmlsZUluZGV4KHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UucHJvZmlsZUNvbm5TdGF0dXNbcHJvZmlsZUluZGV4XSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UuZGV2aWNlQ29ublN0YXR1cyA9IHN0YXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmKGlzRmlyc3RNZW1iZXIgJiYgKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpKSB7Ci0gICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2UgbVN0cmVhbUF1ZGlvU2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBncm91cERldmljZSA9IG1TdHJlYW1BdWRpb1NlcnZpY2UuZ2V0RGV2aWNlR3JvdXAoZGV2aWNlKTsKLSAgICAgICAgICAgIE1lZGlhRGV2aWNlIG1NZWRpYURldmljZSA9IG1NZWRpYURldmljZXMuZ2V0KGdyb3VwRGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBpbnQgcHJldlN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkNvbm5TdGF0ZUNoYW5nZTogbU1lZGlhRGV2aWNlOiAiICsgbU1lZGlhRGV2aWNlKTsKLSAgICAgICAgICAgIGlmKG1NZWRpYURldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJldlN0YXRlID0gbU1lZGlhRGV2aWNlLmRldmljZUNvbm5TdGF0dXM7Ci0gICAgICAgICAgICAgICAgaW50IHByb2ZpbGVJbmRleCA9IG1NZWRpYURldmljZS5nZXRQcm9maWxlSW5kZXgocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhRGV2aWNlLnByb2ZpbGVDb25uU3RhdHVzW3Byb2ZpbGVJbmRleF0gPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UuZGV2aWNlQ29ublN0YXR1cyA9IHN0YXRlOwotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ29ublN0YXRlQ2hhbmdlOiBkZXZpY2U6ICIgKyBncm91cERldmljZSArICIgc3RhdGUgPSAiICsgIG1NZWRpYURldmljZS5kZXZpY2VDb25uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXIgbURldmljZU1hbmFnZXIgPSBBZGFwdGVyU2VydmljZS5nZXRBZGFwdGVyU2VydmljZSgpLmdldEFjdGl2ZURldmljZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLm9uRGV2aWNlQ29ublN0YXRlQ2hhbmdlKGdyb3VwRGV2aWNlLCBzdGF0ZSwgcHJldlN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICB9Ci0gICAgICAgIG9uQ29ublN0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUsIHByb2ZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3RyZWFtU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSW50ZWdlciBzdHJlYW1TdGF0dXMpIHsKLSAgICAgICAgaW50IHByZXZTdGF0dXM7Ci0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBNZWRpYURldmljZSBtTWVkaWFEZXZpY2UgPSBtTWVkaWFEZXZpY2VzLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgaWYobU1lZGlhRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1NZWRpYURldmljZS5zdHJlYW1TdGF0dXMgPT0gc3RyZWFtU3RhdHVzKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHByZXZTdGF0dXMgPSBtTWVkaWFEZXZpY2Uuc3RyZWFtU3RhdHVzOwotICAgICAgICBtTWVkaWFEZXZpY2Uuc3RyZWFtU3RhdHVzID0gc3RyZWFtU3RhdHVzOwotICAgICAgICBMb2cuZChUQUcsICJvblN0cmVhbVN0YXRlQ2hhbmdlIHVwZGF0ZSB0byB2b2x1bWUgbWFuYWdlciIpOwotICAgICAgICBWb2x1bWVNYW5hZ2VyIG1Wb2x1bWVNYW5hZ2VyID0gVm9sdW1lTWFuYWdlci5nZXQoKTsKLSAgICAgICAgbVZvbHVtZU1hbmFnZXIudXBkYXRlU3RyZWFtU3RhdGUoZGV2aWNlLCBzdHJlYW1TdGF0dXMsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICBicm9hZGNhc3RTdHJlYW1TdGF0ZShkZXZpY2UsIHByZXZTdGF0dXMsIHN0cmVhbVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJsdWV0b290aENvZGVjU3RhdHVzIGNvbnZlcmdlQ29kZWNDb25maWcoTWVkaWFEZXZpY2UgbU1lZGlhRGV2aWNlKSB7Ci0gICAgICAgIEJsdWV0b290aENvZGVjU3RhdHVzIEEyZHBDb2RlY1N0YXR1cyA9IG1NZWRpYURldmljZS5tUHJvZmlsZUNvZGVjU3RhdHVzW01lZGlhRGV2aWNlLkEyRFBfU1RSRUFNXTsKLSAgICAgICAgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgQmFwQ29kZWNTdGF0dXMgPSBtTWVkaWFEZXZpY2UubVByb2ZpbGVDb2RlY1N0YXR1c1tNZWRpYURldmljZS5MRV9TVFJFQU1dOwotICAgICAgICBCbHVldG9vdGhDb2RlY1N0YXR1cyBtQ29kZWNTdGF0dXMgPSBudWxsOwotCi0gICAgICAgIGlmKEEyZHBDb2RlY1N0YXR1cyA9PSBudWxsIHx8Ci0gICAgICAgICAgIG1NZWRpYURldmljZS5wcm9maWxlQ29ublN0YXR1c1tNZWRpYURldmljZS5BMkRQX1NUUkVBTV0gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gQmFwQ29kZWNTdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihCYXBDb2RlY1N0YXR1cyA9PSBudWxsIHx8Ci0gICAgICAgICAgIG1NZWRpYURldmljZS5wcm9maWxlQ29ublN0YXR1c1tNZWRpYURldmljZS5MRV9TVFJFQU1dICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgcmV0dXJuIEEyZHBDb2RlY1N0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG1BY3RpdmVEZXZpY2VNYW5hZ2VyID0gQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgIGludCBtQWN0aXZlUHJvZmlsZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZVByb2ZpbGUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgIGludCBtQWN0aXZlUHJvZmlsZUluZGV4ID0gbU1lZGlhRGV2aWNlLmdldFByb2ZpbGVJbmRleChtQWN0aXZlUHJvZmlsZSk7Ci0gICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnIG1Db2RlY0NvbmZpZyA9IG1NZWRpYURldmljZS5tUHJvZmlsZUNvZGVjU3RhdHVzW21BY3RpdmVQcm9maWxlSW5kZXhdLmdldENvZGVjQ29uZmlnKCk7Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAiY29udmVyZ2VDb2RlY0NvbmZpZzogbUFjdGl2ZVByb2ZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICArIG1BY3RpdmVQcm9maWxlICsgIiwgbUFjdGl2ZVByb2ZpbGVJbmRleDogIiArICBtQWN0aXZlUHJvZmlsZUluZGV4KTsKLQotICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIG1Db2RlY3NMb2NhbENhcGFiaWxpdGllcyA9IG5ldyBCbHVldG9vdGhDb2RlY0NvbmZpZ1sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQ29kZWNTdGF0dXMuZ2V0Q29kZWNzTG9jYWxDYXBhYmlsaXRpZXMoKS5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhcENvZGVjU3RhdHVzLmdldENvZGVjc0xvY2FsQ2FwYWJpbGl0aWVzKCkubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShBMmRwQ29kZWNTdGF0dXMuZ2V0Q29kZWNzTG9jYWxDYXBhYmlsaXRpZXMoKSwgMCwgbUNvZGVjc0xvY2FsQ2FwYWJpbGl0aWVzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY1N0YXR1cy5nZXRDb2RlY3NMb2NhbENhcGFiaWxpdGllcygpLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoQmFwQ29kZWNTdGF0dXMuZ2V0Q29kZWNzTG9jYWxDYXBhYmlsaXRpZXMoKSwgMCwgbUNvZGVjc0xvY2FsQ2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBDb2RlY1N0YXR1cy5nZXRDb2RlY3NMb2NhbENhcGFiaWxpdGllcygpLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCYXBDb2RlY1N0YXR1cy5nZXRDb2RlY3NMb2NhbENhcGFiaWxpdGllcygpLmxlbmd0aCk7Ci0KLSAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBtQ29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcyA9IG5ldyBCbHVldG9vdGhDb2RlY0NvbmZpZ1sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQ29kZWNTdGF0dXMuZ2V0Q29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcygpLmxlbmd0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFwQ29kZWNTdGF0dXMuZ2V0Q29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcygpLmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoQTJkcENvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKSwgMCwgbUNvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQTJkcENvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKS5sZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KEJhcENvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKSwgMCwgbUNvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQTJkcENvZGVjU3RhdHVzLmdldENvZGVjc1NlbGVjdGFibGVDYXBhYmlsaXRpZXMoKS5sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQmFwQ29kZWNTdGF0dXMuZ2V0Q29kZWNzU2VsZWN0YWJsZUNhcGFiaWxpdGllcygpLmxlbmd0aCk7Ci0KLSAgICAgICAgbUNvZGVjU3RhdHVzID0gbmV3IEJsdWV0b290aENvZGVjU3RhdHVzKG1Db2RlY0NvbmZpZywKLSAgICAgICAgICAgICAgICBtQ29kZWNzTG9jYWxDYXBhYmlsaXRpZXMsIG1Db2RlY3NTZWxlY3RhYmxlQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgcmV0dXJuIG1Db2RlY1N0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNvZGVjQ29uZmlnQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJsdWV0b290aENvZGVjU3RhdHVzIG1Db2RlY1N0YXR1cywgSW50ZWdlciBwcm9maWxlKSB7Ci0gICAgICAgIG9uQ29kZWNDb25maWdDaGFuZ2UoZGV2aWNlLCBtQ29kZWNTdGF0dXMsIHByb2ZpbGUsIHRydWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDdXJyZW50Q29kZWMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBNZWRpYURldmljZSBtTWVkaWFEZXZpY2UgPSBtTWVkaWFEZXZpY2VzLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgaWYobU1lZGlhRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1NZWRpYURldmljZS5tQ29kZWNTdGF0dXMgPSBjb252ZXJnZUNvZGVjQ29uZmlnKG1NZWRpYURldmljZSk7Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAicmVmcmVzaEN1cnJlbnRDb2RlYzogIiArIGRldmljZSArICIsICIgKyBtTWVkaWFEZXZpY2UubUNvZGVjU3RhdHVzKTsKLQotICAgICAgICBicm9hZGNhc3RDb2RlY1N0YXR1cyhkZXZpY2UsIG1NZWRpYURldmljZS5tQ29kZWNTdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ29kZWNDb25maWdDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgIEJsdWV0b290aENvZGVjU3RhdHVzIGNvZGVjU3RhdHVzLCBJbnRlZ2VyIHByb2ZpbGUsIEJvb2xlYW4gdXBkYXRlQXVkaW8pIHsKLSAgICAgICAgTG9nLncoVEFHLCAib25Db2RlY0NvbmZpZ0NoYW5nZTogZm9yIHByb2ZpbGU6IiArIHByb2ZpbGUgKyAiIGZvciBkZXZpY2UgIgotICAgICAgICAgICAgICAgICsgZGV2aWNlICsgIiB1cGRhdGUgYXVkaW86ICIgKyB1cGRhdGVBdWRpbyArICIgd2l0aCBzdGF0dXMgIiArIGNvZGVjU3RhdHVzKTsKLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwgfHwgY29kZWNTdGF0dXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBNZWRpYURldmljZSBtTWVkaWFEZXZpY2UgPSBtTWVkaWFEZXZpY2VzLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgcHJldkNvZGVjU3RhdHVzID0gbnVsbDsKLSAgICAgICAgLy9CYXBCcm9hZGNhc3RTZXJ2aWNlIG1CYXBCcm9hZGNhc3RTZXJ2aWNlID0gQmFwQnJvYWRjYXN0U2VydmljZS5nZXRCYXBCcm9hZGNhc3RTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtTWVkaWFEZXZpY2UgPT0gbnVsbCAmJiBwcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQlJPQURDQVNUX0xFKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIkxFIEJyb2FkY2FzdCBjb2RlYyBjaGFuZ2UiKTsKLSAgICAgICAgfSBlbHNlIGlmKG1NZWRpYURldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJObyBlbnRyeSBpbiBEZXZpY2UgUHJvZmlsZSBtYXAgZm9yIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NZWRpYURldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgcHJvZmlsZUluZGV4ID0gbU1lZGlhRGV2aWNlLmdldFByb2ZpbGVJbmRleChwcm9maWxlKTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInByb2ZpbGVJbmRleDogIiArIHByb2ZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmKGNvZGVjU3RhdHVzLmVxdWFscyhtTWVkaWFEZXZpY2UubVByb2ZpbGVDb2RlY1N0YXR1c1twcm9maWxlSW5kZXhdKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ29kZWNDb25maWdDaGFuZ2U6IENvZGVjIGFscmVhZHkgdXBkYXRlZCBmb3IgdGhlIGRldmljZSBhbmQgcHJvZmlsZSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1lZGlhRGV2aWNlLm1Qcm9maWxlQ29kZWNTdGF0dXNbcHJvZmlsZUluZGV4XSA9IGNvZGVjU3RhdHVzOwotICAgICAgICAgICAgcHJldkNvZGVjU3RhdHVzID0gbU1lZGlhRGV2aWNlLm1Db2RlY1N0YXR1czsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGNvZGVjIHN0YXR1cyBmb3IgYWx0ZXJuYXRlIE1lZGlhIHByb2ZpbGUgZm9yIHRoaXMgZGV2aWNlICovCi0gICAgICAgICAgICBpZihtTWVkaWFEZXZpY2UubVByb2ZpbGVDb2RlY1N0YXR1c1socHJvZmlsZUluZGV4KzEpJTJdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UubUNvZGVjU3RhdHVzID0gY29udmVyZ2VDb2RlY0NvbmZpZyhtTWVkaWFEZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFEZXZpY2UubUNvZGVjU3RhdHVzID0gY29kZWNTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExvZy53KFRBRywgIkJyb2FkQ2FzdGluZyBjb2RlY3N0YXR1cyAiICsgbU1lZGlhRGV2aWNlLm1Db2RlY1N0YXR1cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgICAgICAgICBicm9hZGNhc3RDb2RlY1N0YXR1cyhkZXZpY2UsIG1NZWRpYURldmljZS5tQ29kZWNTdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocHJldkNvZGVjU3RhdHVzICE9IG51bGwgJiYgbU1lZGlhRGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcmV2Q29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKS5lcXVhbHMobU1lZGlhRGV2aWNlLm1Db2RlY1N0YXR1cy5nZXRDb2RlY0NvbmZpZygpKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByZXZpb3VzIGFuZCBjdXJyZW50IGNvZGVjIGNvbmZpZyBhcmUgc2FtZS4gUmV0dXJuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgaWYobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCAmJiAoIW1BY3RpdmVEZXZpY2VNYW5hZ2VyLmlzU3RhYmxlU3RhdGUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTykpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTSE8gdW5kZXIgcHJvZ3Jlc3MuIE1NIEF1ZGlvIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBTSE8gY29tcGxldGVzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihkZXZpY2UuZXF1YWxzKG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKSkgJiYgdXBkYXRlQXVkaW8pIHsKLSAgICAgICAgICAgIFZvbHVtZU1hbmFnZXIgbVZvbHVtZU1hbmFnZXIgPSBWb2x1bWVNYW5hZ2VyLmdldCgpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRWb2x1bWUgPSBtVm9sdW1lTWFuYWdlci5nZXRBY3RpdmVWb2x1bWUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9MRSkKLSAgICAgICAgICAgICAgICBjdXJyZW50Vm9sdW1lID0gMTU7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGdyb3VwRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICAgIGlmKHByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIG1TdHJlYW1BdWRpb1NlcnZpY2UgPSBTdHJlYW1BdWRpb1NlcnZpY2UuZ2V0U3RyZWFtQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwRGV2aWNlID0gbVN0cmVhbUF1ZGlvU2VydmljZS5nZXREZXZpY2VHcm91cChkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvZGVjQ29uZmlnQ2hhbmdlIENhbGxpbmcgaGFuZGxlQmx1ZXRvb3RoQTJkcEFjdGl2ZURldmljZUNoYW5nZSIpOwotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaGFuZGxlQmx1ZXRvb3RoQTJkcEFjdGl2ZURldmljZUNoYW5nZShncm91cERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVELCBCbHVldG9vdGhQcm9maWxlLkEyRFAsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3RDb25uU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByZXZTdGF0ZSwgaW50IG5ld1N0YXRlKSB7Ci0gICAgICBBMmRwU2VydmljZSBtQTJkcFNlcnZpY2UgPSBBMmRwU2VydmljZS5nZXRBMmRwU2VydmljZSgpOwotICAgICAgaWYgKG1BMmRwU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIkJyb2FkY2FzdCBDb25uIFN0YXRlIENoYW5nZTogIiArIHByZXZTdGF0ZSArICItPiIgKyBuZXdTdGF0ZSArICIgZm9yIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfUFJFVklPVVNfU1RBVEUsIHByZXZTdGF0ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCBuZXdTdGF0ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1BMmRwU2VydmljZS5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0NPTk5FQ1QsCi0gICAgICAgICAgICAgVXRpbHMuZ2V0VGVtcEFsbG93bGlzdEJyb2FkY2FzdE9wdGlvbnMoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdFN0cmVhbVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmV2U3RhdHVzLCBpbnQgc3RyZWFtU3RhdHVzKSB7Ci0gICAgICBBMmRwU2VydmljZSBtQTJkcFNlcnZpY2UgPSBBMmRwU2VydmljZS5nZXRBMmRwU2VydmljZSgpOwotICAgICAgaWYgKG1BMmRwU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aEEyZHAuQUNUSU9OX1BMQVlJTkdfU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgcHJldlN0YXR1cyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCBzdHJlYW1TdGF0dXMpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgbUEyZHBTZXJ2aWNlLnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQ09OTkVDVCwKLSAgICAgICAgICAgICBVdGlscy5nZXRUZW1wQWxsb3dsaXN0QnJvYWRjYXN0T3B0aW9ucygpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0Q29kZWNTdGF0dXMgKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJsdWV0b290aENvZGVjU3RhdHVzIG1Db2RlY1N0YXR1cykgewotICAgICAgQTJkcFNlcnZpY2UgbUEyZHBTZXJ2aWNlID0gQTJkcFNlcnZpY2UuZ2V0QTJkcFNlcnZpY2UoKTsKLSAgICAgIGlmIChtQTJkcFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhBMmRwLkFDVElPTl9DT0RFQ19DT05GSUdfQ0hBTkdFRCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhDb2RlY1N0YXR1cy5FWFRSQV9DT0RFQ19TVEFUVVMsIG1Db2RlY1N0YXR1cyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1BMmRwU2VydmljZS5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0NPTk5FQ1QsCi0gICAgICAgICAgICAgVXRpbHMuZ2V0VGVtcEFsbG93bGlzdEJyb2FkY2FzdE9wdGlvbnMoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvZGVjIChTdHJpbmcgbUNvZGVjKSB7Ci0gICAgICAgIHJldHVybiBzdXBwb3J0ZWRfY29kZWMuY29udGFpbnMobUNvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXVkaW9NYW5hZ2VyIGdldEF1ZGlvTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb01hbmFnZXI7Ci0gICAgfQotCi0gICAgY2xhc3MgTWVkaWFEZXZpY2UgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKLSAgICAgICAgaW50W10gcHJvZmlsZUNvbm5TdGF0dXMgPSBuZXcgaW50WzJdOwotICAgICAgICBpbnQgZGV2aWNlQ29ublN0YXR1czsKLSAgICAgICAgaW50IHN0cmVhbVN0YXR1czsKLSAgICAgICAgcHJpdmF0ZSBCbHVldG9vdGhDb2RlY1N0YXR1cyBtQ29kZWNTdGF0dXM7Ci0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNTdGF0dXNbXSBtUHJvZmlsZUNvZGVjU3RhdHVzID0gbmV3IEJsdWV0b290aENvZGVjU3RhdHVzWzJdOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RSRUFNID0gMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVfU1RSRUFNID0gMTsKLQotICAgICAgICBNZWRpYURldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBwcm9maWxlQ29ublN0YXR1c1tBMkRQX1NUUkVBTV0gPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIHByb2ZpbGVDb25uU3RhdHVzW0xFX1NUUkVBTV0gPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBpZigocHJvZmlsZSAmIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUCkgIT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZUNvbm5TdGF0dXNbQTJEUF9TVFJFQU1dID0gc3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigocHJvZmlsZSAmIChBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlRNQVBfTUVESUEgfCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQSkpICE9Ci0gICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuTk9ORSkgewotICAgICAgICAgICAgICAgIHByb2ZpbGVDb25uU3RhdHVzW0xFX1NUUkVBTV0gPSBzdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZUNvbm5TdGF0dXMgPSBzdGF0ZTsKLSAgICAgICAgICAgIHN0cmVhbVN0YXR1cyA9IEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYURldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSkgewotICAgICAgICAgICAgdGhpcyhkZXZpY2UsIHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJvZmlsZUluZGV4KGludCBwcm9maWxlKSB7Ci0gICAgICAgICAgICBpZihwcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQTJEUCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQTJEUF9TVFJFQU07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIExFX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTGVDb2RlY0NvbmZpZyBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgLyphbSBicm9hZGNhc3QgLWEgcXRpLmludGVudC5ibHVldG9vdGguYWN0aW9uLlVQREFURV9DT0RFQ19DT05GSUcgLS1lcwotICAgICAgICAgICAgcXRpLmJsdWV0b290aC5leHRyYS5DT0RFQ19JRCAiTEMzIiAtLWVzIHF0aS5ibHVldG9vdGguZXh0cmEuQ09ERUNfQ09ORklHICI8SUQ+IiovCi0KLSAgICAgICAgQXJyYXlMaXN0IDxTdHJpbmc+IHN1cHBvcnRlZF9jb2RlY19jb25maWcgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oIExpc3Qub2YoCi0gICAgICAgIC8qIGNvbmZpZyBJRCAgICAgIFNhbXBsaW5nIEZyZXEgICAgT2N0ZXRzL0ZyYW1lICAqLwotICAgICAgICAgICAgIjhfMSIsICAvKiAgICAgICAgICA4ICAgICAgICAgICAgICAgMjYgICAgICAgKi8KLSAgICAgICAgICAgICI4XzIiLCAgLyogICAgICAgICAgOCAgICAgICAgICAgICAgIDMwICAgICAgICovCi0gICAgICAgICAgICAiMTZfMSIsIC8qICAgICAgICAgIDE2ICAgICAgICAgICAgICAzMCAgICAgICAqLwotICAgICAgICAgICAgIjE2XzIiLCAvKiAgICAgICAgICAxNiAgICAgICAgICAgICAgNDAgICAgICAgKi8KLSAgICAgICAgICAgICIyNF8xIiwgLyogICAgICAgICAgMjQgICAgICAgICAgICAgIDQ1ICAgICAgICovCi0gICAgICAgICAgICAiMjRfMiIsIC8qICAgICAgICAgIDI0ICAgICAgICAgICAgICA2MCAgICAgICAqLwotICAgICAgICAgICAgIjMyXzEiLCAvKiAgICAgICAgICAzMiAgICAgICAgICAgICAgNjAgICAgICAgKi8KLSAgICAgICAgICAgICIzMl8yIiwgLyogICAgICAgICAgMzIgICAgICAgICAgICAgIDgwICAgICAgICovCi0gICAgICAgICAgICAiNDQxXzEiLC8qICAgICAgICAgIDQ0LjEgICAgICAgICAgICA5OCAgICAgICAqLwotICAgICAgICAgICAgIjQ0MV8yIiwvKiAgICAgICAgICA0NC4xICAgICAgICAgICAgMTMwICAgICAgKi8KLSAgICAgICAgICAgICI0OF8xIiwgLyogICAgICAgICAgNDggICAgICAgICAgICAgIDc1ICAgICAgICovCi0gICAgICAgICAgICAiNDhfMiIsIC8qICAgICAgICAgIDQ4ICAgICAgICAgICAgICAxMDAgICAgICAqLwotICAgICAgICAgICAgIjQ4XzMiLCAvKiAgICAgICAgICA0OCAgICAgICAgICAgICAgOTAgICAgICAgKi8KLSAgICAgICAgICAgICI0OF80IiwgLyogICAgICAgICAgNDggICAgICAgICAgICAgIDEyMCAgICAgICovCi0gICAgICAgICAgICAiNDhfNSIsIC8qICAgICAgICAgIDQ4ICAgICAgICAgICAgICAxMTcgICAgICAqLwotICAgICAgICAgICAgIjQ4XzYiLCAvKiAgICAgICAgICA0OCAgICAgICAgICAgICAgMTU1ICAgICAgKi8KLSAgICAgICAgICAgICJHQ1BfVFgiLAotICAgICAgICAgICAgIkdDUF9UWF9SWCIKLSAgICAgICAgKSk7Ci0KLSAgICAgICAgTWFwIDxTdHJpbmcsIEludGVnZXI+IGNoYW5uZWxfbW9kZSA9IE1hcC5vZigKLSAgICAgICAgICAgICJOT05FIiwgMCwKLSAgICAgICAgICAgICJNT05PIiwgMSwKLSAgICAgICAgICAgICJTVEVSRU8iLCAyCi0gICAgICAgICk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmICghQUNUSU9OX1VQREFURV9DT0RFQ19DT05GSUcuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbUNvZGVjSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoQ09ERUNfSUQpOwotICAgICAgICAgICAgaWYobUNvZGVjSWQgPT0gbnVsbCB8fCAhaXNWYWxpZENvZGVjKG1Db2RlY0lkKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgQ29kZWMgIiArIG1Db2RlY0lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbUNvZGVjQ29uZmlnID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKENPREVDX0NPTkZJRyk7Ci0gICAgICAgICAgICBpZihtQ29kZWNDb25maWcgPT0gbnVsbCB8fCAhaXNWYWxpZENvZGVjQ29uZmlnKG1Db2RlY0NvbmZpZykpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbnZhbGlkIENvZGVjIENvbmZpZyAiICsgbUNvZGVjQ29uZmlnKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBtQ2hhbm5lbE1vZGUgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfTk9ORTsKLSAgICAgICAgICAgIFN0cmluZyBjaE1vZGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoQ0hBTk5FTF9NT0RFKTsKLSAgICAgICAgICAgIGlmKGNoTW9kZSAhPSBudWxsICYmIGNoYW5uZWxfbW9kZS5jb250YWluc0tleShjaE1vZGUpKSB7Ci0gICAgICAgICAgICAgICAgbUNoYW5uZWxNb2RlID0gY2hhbm5lbF9tb2RlLmdldChjaE1vZGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSBtQWN0aXZlRGV2aWNlTWFuYWdlcgotICAgICAgICAgICAgICAgID0gQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgICAgICBpbnQgcHJvZmlsZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZVByb2ZpbGUoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyk7Ci0gICAgICAgICAgICBpZihwcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQlJPQURDQVNUX0xFKSB7Ci0gICAgICAgICAgICAgICAgLypVcGRhdGUgQnJvYWRjYXN0IG1vZHVsZSBoZXJlKi8KLSAgICAgICAgICAgICAgICBtQmFwQnJvYWRjYXN0TWFuYWdlci5zZXRDb2RlY1ByZWZlcmVuY2UobUNvZGVjQ29uZmlnLCBtQ2hhbm5lbE1vZGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBKSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSA9IFN0cmVhbUF1ZGlvU2VydmljZS5nZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldENvZGVjQ29uZmlnKGRldmljZSwgbUNvZGVjQ29uZmlnLCBtQ2hhbm5lbE1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29kZWMgQ29uZmlnIFJlcXVlc3Q6IENvZGVjIE5hbWU6ICIgKyBtQ29kZWNJZCArICIgQ29uZmlnIElEOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbUNvZGVjQ29uZmlnICsgIiBtQ2hhbm5lbE1vZGU6ICIgKyBtQ2hhbm5lbE1vZGUgKyAiIGZvciBwcm9maWxlOiAiICsgcHJvZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVmFsaWRDb2RlY0NvbmZpZyAoU3RyaW5nIG1Db2RlY0NvbmZpZykgewotICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZF9jb2RlY19jb25maWcuY29udGFpbnMobUNvZGVjQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUW9zQ29uZmlnUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIC8qYW0gYnJvYWRjYXN0IC1hIHF0aS5pbnRlbnQuYmx1ZXRvb3RoLmFjdGlvbi5VUERBVEVfUU9TX0NPTkZJRyAtLWVzCi0gICAgICAgICAgICBxdGkuYmx1ZXRvb3RoLmV4dHJhLkNPREVDX0lEICJMQzMiIC0tZXMgcXRpLmJsdWV0b290aC5leHRyYS5RT1NfQ09ORklHICI8SUQ+IiovCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0KLSAgICAgICAgQXJyYXlMaXN0IDxTdHJpbmc+IHN1cHBvcnRlZF9Rb3NfY29uZmlnID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCBMaXN0Lm9mKAotICAgICAgICAgICAgIjhfMV8xIiwKLSAgICAgICAgICAgICI4XzJfMSIsCi0gICAgICAgICAgICAiMTZfMV8xIiwKLSAgICAgICAgICAgICIxNl8yXzEiLAotICAgICAgICAgICAgIjI0XzFfMSIsCi0gICAgICAgICAgICAiMjRfMl8xIiwKLSAgICAgICAgICAgICIzMl8xXzEiLAotICAgICAgICAgICAgIjMyXzJfMSIsCi0gICAgICAgICAgICAiNDQxXzFfMSIsCi0gICAgICAgICAgICAiNDQxXzJfMSIsCi0gICAgICAgICAgICAiNDhfMV8xIiwKLSAgICAgICAgICAgICI0OF8yXzEiLAotICAgICAgICAgICAgIjQ4XzNfMSIsCi0gICAgICAgICAgICAiNDhfNF8xIiwKLSAgICAgICAgICAgICI0OF81XzEiLAotICAgICAgICAgICAgIjQ4XzZfMSIsCi0KLSAgICAgICAgICAgICI4XzFfMiIsCi0gICAgICAgICAgICAiOF8yXzIiLAotICAgICAgICAgICAgIjE2XzFfMiIsCi0gICAgICAgICAgICAiMTZfMl8yIiwKLSAgICAgICAgICAgICIyNF8xXzIiLAotICAgICAgICAgICAgIjI0XzJfMiIsCi0gICAgICAgICAgICAiMzJfMV8yIiwKLSAgICAgICAgICAgICIzMl8yXzIiLAotICAgICAgICAgICAgIjQ0MV8xXzIiLAotICAgICAgICAgICAgIjQ0MV8yXzIiLAotICAgICAgICAgICAgIjQ4XzFfMiIsCi0gICAgICAgICAgICAiNDhfMl8yIiwKLSAgICAgICAgICAgICI0OF8zXzIiLAotICAgICAgICAgICAgIjQ4XzRfMiIsCi0gICAgICAgICAgICAiNDhfNV8yIiwKLSAgICAgICAgICAgICI0OF82XzIiCi0gICAgICAgICkpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZighZW5hYmxlKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmICghQUNUSU9OX1VQREFURV9RT1NfQ09ORklHLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbUNvZGVjSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoQ09ERUNfSUQpOwotICAgICAgICAgICAgaWYobUNvZGVjSWQgPT0gbnVsbCB8fCAhaXNWYWxpZENvZGVjKG1Db2RlY0lkKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgQ29kZWMgIiArIG1Db2RlY0lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbVFvc0NvbmZpZyA9IGludGVudC5nZXRTdHJpbmdFeHRyYShRT1NfQ09ORklHKTsKLSAgICAgICAgICAgIGlmKG1Rb3NDb25maWcgPT0gbnVsbCB8fCAhaXNWYWxpZFFvc0NvbmZpZyhtUW9zQ29uZmlnKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgUW9zQ29uZmlnICIgKyBtUW9zQ29uZmlnKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG1BY3RpdmVEZXZpY2VNYW5hZ2VyCi0gICAgICAgICAgICAgICAgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgICAgIGludCBwcm9maWxlID0gbUFjdGl2ZURldmljZU1hbmFnZXIuZ2V0QWN0aXZlUHJvZmlsZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgIGlmKHByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CUk9BRENBU1RfTEUpIHsKLSAgICAgICAgICAgICAgICAvKlVwZGF0ZSBCcm9hZGNhc3QgbW9kdWxlIGhlcmUqLwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBKSB7Ci0gICAgICAgICAgICAgICAgLypVcGRhdGUgQUNNIGhlcmUqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmkoVEFHLCAiTmV3IFFvcyBDb25maWcgSUQ6ICIgKyBtUW9zQ29uZmlnICsgIiBmb3IgcHJvZmlsZTogIiArIHByb2ZpbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkUW9zQ29uZmlnKFN0cmluZyBtUW9zQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkX1Fvc19jb25maWcuY29udGFpbnMobVFvc0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBCYXBCcm9hZGNhc3RNYW5hZ2VyIHsKLSAgICAgICAgdm9pZCBzZXRDb2RlY1ByZWZlcmVuY2UoU3RyaW5nIGNvZGVjQ29uZmlnLCBpbnQgY2hhbm5lbE1vZGUpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNlcnZpY2UgbUJyb2FkY2FzdFNlcnZpY2UgPSBCcm9hZGNhc3RTZXJ2aWNlLmdldEJyb2FkY2FzdFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmKG1Ccm9hZGNhc3RTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U2VydmljZS5zZXRDb2RlY1ByZWZlcmVuY2UoY29kZWNDb25maWcsIGNoYW5uZWxNb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aENvZGVjU3RhdHVzIGdldENvZGVjU3RhdHVzKCkgewotICAgICAgICAgICAgQnJvYWRjYXN0U2VydmljZSBtQnJvYWRjYXN0U2VydmljZSA9IEJyb2FkY2FzdFNlcnZpY2UuZ2V0QnJvYWRjYXN0U2VydmljZSgpOwotICAgICAgICAgICAgaWYobUJyb2FkY2FzdFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQnJvYWRjYXN0U2VydmljZS5nZXRDb2RlY1N0YXR1cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzQmFwQnJvYWRjYXN0QWN0aXZlKCkgewotICAgICAgICAgICAgQnJvYWRjYXN0U2VydmljZSBtQnJvYWRjYXN0U2VydmljZSA9IEJyb2FkY2FzdFNlcnZpY2UuZ2V0QnJvYWRjYXN0U2VydmljZSgpOwotICAgICAgICAgICAgaWYobUJyb2FkY2FzdFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQnJvYWRjYXN0U2VydmljZS5pc0Jyb2FkY2FzdEFjdGl2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9NZWRpYUNvbnRyb2xNYW5hZ2VyLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9NZWRpYUNvbnRyb2xNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTk3Y2IuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vTWVkaWFDb250cm9sTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QbGF5YmFja0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyaXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb24uUXVldWVJdGVtOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlN0YXRzTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXZyY3AuTWVkaWFDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uU3RyZWFtQXVkaW9TZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5tY3AuTWNwU2VydmljZTsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbE1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFQTTogTWVkaWFDb250cm9sTWFuYWdlciI7Ci0KLSAgICBzdGF0aWMgTWVkaWFDb250cm9sTWFuYWdlciBtTWVkaWFDb250cm9sTWFuYWdlciA9IG51bGw7Ci0KLSAgICBQbGF5YmFja0NhbGxiYWNrIG1QbGF5YmFja0NhbGxiYWNrQ2I7Ci0gICAgLy9NZWRpYUNvbnRyb2xDYWxsYmFjayBtTWVkaWFDb250cm9sQ2FsbGJhY2tDYjsKLSAgICBCcm9hZGNhc3RSZWNlaXZlciBtTWVkaWFDb250cm9sUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBtQ29udGV4dDsKLSAgICAvL3ByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgTWNwU2VydmljZSBtTWNwU2VydmljZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNdXNpY1BsYXllckNvbnRyb2xTZXJ2aWNlTmFtZSA9ICJjb20uYW5kcm9pZC5ibHVldG9vdGgubWNwLk1jcFNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1VU0lDX1BMQVlFUl9DT05UUk9MID0gTWNwU2VydmljZS5NVVNJQ19QTEFZRVJfQ09OVFJPTDsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbE1hbmFnZXIgKCkgewotICAgICAgICBtUGxheWJhY2tDYWxsYmFja0NiID0gIG5ldyBQbGF5YmFja0NhbGxiYWNrKCk7Ci0gICAgICAgIC8vbU1lZGlhQ29udHJvbENhbGxiYWNrQ2IgPSBuZXcgTWVkaWFDb250cm9sQ2FsbGJhY2soKTsKLSAgICAgICAgbU1lZGlhQ29udHJvbFJlY2VpdmVyID0gbmV3IE1lZGlhQ29udHJvbFJlY2VpdmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYUNvbnRyb2xNYW5hZ2VyIGdldCgpIHsKLSAgICAgICAgaWYobU1lZGlhQ29udHJvbE1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbE1hbmFnZXIgPSBuZXcgTWVkaWFDb250cm9sTWFuYWdlcigpOwotICAgICAgICB9Ci0gICAgICAgIExvZy52KFRBRywgImdldCIpOwotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1ha2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmKG1NZWRpYUNvbnRyb2xNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xNYW5hZ2VyID0gbmV3IE1lZGlhQ29udHJvbE1hbmFnZXIoKTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xNYW5hZ2VyLmluaXQoY29udGV4dCk7Ci0gICAgICAgICAgICBNZWRpYUNvbnRyb2xNYW5hZ2VySW50Zi5pbml0KG1NZWRpYUNvbnRyb2xNYW5hZ2VyKTsKLSAgICAgICAgICAgIExvZy52KFRBRywgImluaXQsIE5ldyBtTWVkaWFDb250cm9sTWFuYWdlciBpbnN0YW5jZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotCi0KLQotICAgICAgICAvKm1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIHRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJNZWRpYUNvbnRyb2xUaHJlYWQiKTsKLSAgICAgICAgTG9vcGVyIGxvb3BlciA9IHRocmVhZC5nZXRMb29wZXIoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihsb29wZXIpOwotICAgICAgICBtQXVkaW9NYW5hZ2VyLnJlZ2lzdGVyQXVkaW9QbGF5YmFja0NhbGxiYWNrKG1QbGF5YmFja0NhbGxiYWNrQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlcik7Ki8KLQotICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9DSEFOR0VEKTsKLSAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtTWVkaWFDb250cm9sUmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgICAgIExvZy52KFRBRywgImluaXQgZG9uZSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50UGxheWVyIChpbnQgcGxheWVySWQsIGludCBicm93c2VJZCkgewotICAgIH0KLQotICAgIHZvaWQgaGFuZGxlUGFzc3Rocm91Z2hDbWQoaW50IG9wLCBpbnQgc3RhdGUpIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFBsYXliYWNrQ2FsbGJhY2sgZXh0ZW5kcyBBdWRpb01hbmFnZXIuQXVkaW9QbGF5YmFja0NhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tDb25maWdDaGFuZ2VkKExpc3Q8QXVkaW9QbGF5YmFja0NvbmZpZ3VyYXRpb24+IGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uUGxheWJhY2tDb25maWdDaGFuZ2VkKGNvbmZpZ3MpOwotCi0gICAgICAgICAgICAvKlVwZGF0ZSBQbGF5YmFjayBjb25maWcqLwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8qVXBkYXRlIE1ldGFkYXRhIGNoYW5nZSovCi0gICAgICAgIExvZy52KFRBRywgIm9uTWV0YWRhdGFDaGFuZ2VkIik7Ci0gICAgICAgIG1NY3BTZXJ2aWNlID0gTWNwU2VydmljZS5nZXRNY3BTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtTWNwU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1NY3BTZXJ2aWNlLnVwZGF0ZU1ldGFEYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKFBsYXliYWNrU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgLypVcGRhdGUgUGxheWJhY2sgU3RhdGUqLwotICAgICAgICBMb2cudihUQUcsICJvblBsYXliYWNrU3RhdGVDaGFuZ2VkIik7Ci0gICAgICAgIG1NY3BTZXJ2aWNlID0gTWNwU2VydmljZS5nZXRNY3BTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtTWNwU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1NY3BTZXJ2aWNlLnVwZGF0ZVBsYXliYWNrU3RhdGUoc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25QYWNrYWdlQ2hhbmdlZChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgTG9nLnYoVEFHLCAib25QYWNrYWdlQ2hhbmdlZCIpOwotICAgICAgICBtTWNwU2VydmljZSA9IE1jcFNlcnZpY2UuZ2V0TWNwU2VydmljZSgpOwotICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpCi0gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1NY3BTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgbU1jcFNlcnZpY2UudXBkYXRlUGxheWVyTmFtZShwYWNrYWdlTmFtZSwgcmVtb3ZlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBMb2cudihUQUcsICJvblNlc3Npb25EZXN0cm95ZWQiKTsKLSAgICAgICAgbU1jcFNlcnZpY2UgPSBNY3BTZXJ2aWNlLmdldE1jcFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKG1NY3BTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgbU1jcFNlcnZpY2UudXBkYXRlUGxheWVyTmFtZShwYWNrYWdlTmFtZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblF1ZXVlQ2hhbmdlZChMaXN0PE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+IHF1ZXVlKSB7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lZGlhQ29udHJvbFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIExvZy52KFRBRywgImFjdGlvbiAiICsgYWN0aW9uKTsKLSAgICAgICAgICAgIGlmKGFjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgc3dpdGNoKGFjdGlvbikgewotICAgICAgICAgICAgICAgIGNhc2UgSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gaW50ZW50LmdldERhdGEoKS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgLypoYW5kbGUgcGFja2FnZSByZW1vdmVkKi8KLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEOgotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IGludGVudC5nZXREYXRhKCkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qaGFuZGxlIHBhY2thZ2UgYWRkZWQqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEludGVudC5BQ1RJT05fUEFDS0FHRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IGludGVudC5nZXREYXRhKCkuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qaGFuZGxlIHBhY2thZ2UgY2hhbmdlZCovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NY3BTZXJ2aWNlID0gTWNwU2VydmljZS5nZXRNY3BTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAobU1jcFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NY3BTZXJ2aWNlLnVwZGF0ZVBsYXllck5hbWUocGFja2FnZU5hbWUsIHJlbW92ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vU3RyZWFtQXVkaW9TZXJ2aWNlLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9TdHJlYW1BdWRpb1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0MjcwMy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9TdHJlYW1BdWRpb1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHMuZW5mb3JjZUJsdWV0b290aFBlcm1pc3Npb247Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmJsdWV0b290aC5VdGlscy5lbmZvcmNlQmx1ZXRvb3RoUHJpdmlsZWdlZFBlcm1pc3Npb247Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY1N0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoVmNwOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLkFkYXB0ZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFjbS5BY21TZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgU3RyZWFtQXVkaW9TZXJ2aWNlIGV4dGVuZHMgUHJvZmlsZVNlcnZpY2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFQTTogU3RyZWFtQXVkaW9TZXJ2aWNlOiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVfQVVESU9fVU5JQ0FTVCA9IDI2OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ29vcmRpbmF0ZWRBdWRpb1NlcnZpY2VOYW1lID0gImNvbS5hbmRyb2lkLmJsdWV0b290aC5hY20uQWNtU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09PUkRJTkFURURfQVVESU9fVU5JQ0FTVCA9IEFjbVNlcnZpY2UuQUNNX0FVRElPX1VOSUNBU1Q7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJlYW1BdWRpb1NlcnZpY2Ugc1N0cmVhbUF1ZGlvU2VydmljZTsKLSAgICBwcml2YXRlIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG1BY3RpdmVEZXZpY2VNYW5hZ2VyOwotICAgIHByaXZhdGUgTWVkaWFBdWRpbyBtTWVkaWFBdWRpbzsKLSAgICBwcml2YXRlIFZvbHVtZU1hbmFnZXIgbVZvbHVtZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVZvbHVtZU1hbmFnZXJMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiY3JlYXRlKCkiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFQICAgICAgID0gMHgwMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0NQICAgICAgID0gMHgwMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV01DUCAgICAgID0gMHgwNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVk1DUCAgICAgID0gMHgwODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFQX0NBTEwgID0gMHgxMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9DT05URVhUID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVk9JQ0VfQ09OVEVYVCA9IDI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydCgpIHsKLSAgICAgICAgaWYoc1N0cmVhbUF1ZGlvU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJTdHJlYW1BdWRpb1NlcnZpY2UgYWxyZWFkeSBzdGFydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBMb2cuaShUQUcsICJzdGFydCgpIik7Ci0KLSAgICAgICAgQXBtQ29uc3Quc2V0TGVBdWRpb0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIEFwbUNvbnN0SW50Zi5pbml0KCk7Ci0KLSAgICAgICAgc2V0U3RyZWFtQXVkaW9TZXJ2aWNlKHRoaXMpOwotCi0gICAgICAgIG1BY3RpdmVEZXZpY2VNYW5hZ2VyID0gQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KHRoaXMpOwotICAgICAgICBtTWVkaWFBdWRpbyA9IE1lZGlhQXVkaW8uaW5pdCh0aGlzKTsKLQotICAgICAgICBEZXZpY2VQcm9maWxlTWFwIGRwbSA9IERldmljZVByb2ZpbGVNYXAuZ2V0RGV2aWNlUHJvZmlsZU1hcEluc3RhbmNlKCk7Ci0gICAgICAgIGRwbS5pbml0KHRoaXMpOwotICAgICAgICBDYWxsQXVkaW8gbUNhbGxBdWRpbyA9IENhbGxBdWRpby5pbml0KHRoaXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Wb2x1bWVNYW5hZ2VyTG9jaykgewotICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXIgPSBWb2x1bWVNYW5hZ2VyLmluaXQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuaShUQUcsICJzdGFydCgpIGNvbXBsZXRlIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3AoKSB7Ci0gICAgICAgIExvZy53KFRBRywgInN0b3AoKSBjYWxsZWQiKTsKLSAgICAgICAgaWYgKHNTdHJlYW1BdWRpb1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAic3RvcCgpIGNhbGxlZCBiZWZvcmUgc3RhcnQoKSIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUFjdGl2ZURldmljZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuZGlzYWJsZSgpOwotICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGV2aWNlUHJvZmlsZU1hcCBkTWFwID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgZE1hcC5jbGVhbnVwKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImNsZWFudXAoKSIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Wb2x1bWVNYW5hZ2VyTG9jaykgewotICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXIuY2xlYW51cCgpOwotICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHNldFN0cmVhbUF1ZGlvU2VydmljZShudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0TGVTdHJlYW0oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUpIHsKLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICBpbnQgbUNvbnRleHQgPSBnZXRDb250ZXh0KHByb2ZpbGUpOwotCi0gICAgICAgIGlmKG1Db250ZXh0ID09IDApIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIk5vIHZhbGlkIGNvbnRleHQgZm9yIHByb2ZpbGVzIHBhc3NlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQWNtU2VydmljZS5jb25uZWN0KGRldmljZSwgbUNvbnRleHQsIGdldEFjbVByb2ZpbGVJRChwcm9maWxlKSwgTUVESUFfQ09OVEVYVCk7Ci0gICAgICAgIC8vcmV0dXJuIG1BY21TZXJ2aWNlLmNvbm5lY3QoZGV2aWNlLCBWT0lDRV9DT05URVhULCBCQVBfQ0FMTCwgVk9JQ0VfQ09OVEVYVCk7Ci0gICAgICAgIC8vcmV0dXJuIG1BY21TZXJ2aWNlLmNvbm5lY3QoZGV2aWNlLCBNRURJQV9DT05URVhULCBCQVB8V01DUCwgTUVESUFfQ09OVEVYVCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdExlU3RyZWFtKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gY2FsbEF1ZGlvLCBib29sZWFuIG1lZGlhQXVkaW8pIHsKLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICBpZihjYWxsQXVkaW8gJiYgbWVkaWFBdWRpbykKLSAgICAgICAgICAgIHJldHVybiBtQWNtU2VydmljZS5kaXNjb25uZWN0KGRldmljZSwgVk9JQ0VfQ09OVEVYVCB8IE1FRElBX0NPTlRFWFQpOwotICAgICAgICAgICAgLy9yZXR1cm4gbUFjbVNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UsIFZPSUNFX0NPTlRFWFQpOwotICAgICAgICAgICAgLy9yZXR1cm4gbUFjbVNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UsIE1FRElBX0NPTlRFWFQpOwotICAgICAgICBlbHNlIGlmKG1lZGlhQXVkaW8pCi0gICAgICAgICAgICByZXR1cm4gbUFjbVNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UsIE1FRElBX0NPTlRFWFQpOwotICAgICAgICBlbHNlIGlmKGNhbGxBdWRpbykKLSAgICAgICAgICAgIHJldHVybiBtQWNtU2VydmljZS5kaXNjb25uZWN0KGRldmljZSwgVk9JQ0VfQ09OVEVYVCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U3RyZWFtKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICByZXR1cm4gbUFjbVNlcnZpY2UuU3RhcnRTdHJlYW0oZGV2aWNlLCBWT0lDRV9DT05URVhUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wU3RyZWFtKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICByZXR1cm4gbUFjbVNlcnZpY2UuU3RvcFN0cmVhbShkZXZpY2UsIFZPSUNFX0NPTlRFWFQpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2V0QWN0aXZlRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcm9maWxlLCBib29sZWFuIHBsYXlSZXEpIHsKLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICBpZiAobUFjbVNlcnZpY2UgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiOiBkZXZpY2UgaXMgbnVsbCwgZmFrZSBzdWNjZXNzLiIpOwotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEZXZpY2VNYW5hZ2VyLlNIT19TVUNDRVNTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY21TZXJ2aWNlLnNldEFjdGl2ZURldmljZShkZXZpY2UsIE1FRElBX0NPTlRFWFQsIEJBUCwgcGxheVJlcSk7Ci0gICAgICAgIH0gZWxzZSBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9HQ1AgPT0gcHJvZmlsZSl7Ci0gICAgICAgICAgICByZXR1cm4gbUFjbVNlcnZpY2Uuc2V0QWN0aXZlRGV2aWNlKGRldmljZSwgTUVESUFfQ09OVEVYVCwgR0NQLCBwbGF5UmVxKTsKLSAgICAgICAgfSBlbHNlIGlmKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX1JFQ09SRElORyA9PSBwcm9maWxlKXsKLSAgICAgICAgICAgIHJldHVybiBtQWNtU2VydmljZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBNRURJQV9DT05URVhULCBXTUNQLCBwbGF5UmVxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtQWNtU2VydmljZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBWT0lDRV9DT05URVhULCBCQVBfQ0FMTCwgcGxheVJlcSk7Ci0gICAgICAgICAgICAvL3JldHVybiBtQWNtU2VydmljZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLCBNRURJQV9DT05URVhULCBCQVAsIHBsYXlSZXEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29kZWNDb25maWcoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgU3RyaW5nIGNvZGVjSUQsIGludCBjaGFubmVsTW9kZSkgewotICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIG1BY21TZXJ2aWNlLkNoYW5nZUNvZGVjQ29uZmlnUHJlZmVyZW5jZShkZXZpY2UsIGNvZGVjSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlR3JvdXAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSl7Ci0gICAgICAgIEFjbVNlcnZpY2UgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgcmV0dXJuIG1BY21TZXJ2aWNlLmdldEdyb3VwKGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlLCBpbnQgYXVkaW9UeXBlLCBib29sZWFuIHByaW1lRGV2aWNlKSB7Ci0gICAgICAgIE1lZGlhQXVkaW8gbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICBDYWxsQXVkaW8gbUNhbGxBdWRpbyA9IENhbGxBdWRpby5nZXQoKTsKLSAgICAgICAgaW50IHByb2ZpbGUgPSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1BWF9BVURJT19GRUFUVVJFUzsKLSAgICAgICAgaWYoYXVkaW9UeXBlID09IEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTykgewotICAgICAgICAgICAgbUNhbGxBdWRpby5vbkNvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9DQUxMKTsKLSAgICAgICAgfSBlbHNlIGlmKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ3NpcERldmljZSA9IChkZXZpY2UgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUdyb3VwKGRldmljZSkuZ2V0QWRkcmVzcygpLmNvbnRhaW5zKEFwbUNvbnN0Lmdyb3VwQWRkcmVzcyk7Ci0gICAgICAgICAgICBpZihpc0NzaXBEZXZpY2UpCi0gICAgICAgICAgICAgICAgbU1lZGlhQXVkaW8ub25Db25uU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEsIHByaW1lRGV2aWNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtTWVkaWFBdWRpby5vbkNvbm5TdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0cmVhbVN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSwgaW50IGF1ZGlvVHlwZSkgewotICAgICAgICBNZWRpYUF1ZGlvIG1NZWRpYUF1ZGlvID0gTWVkaWFBdWRpby5nZXQoKTsKLSAgICAgICAgQ2FsbEF1ZGlvIG1DYWxsQXVkaW8gPSBDYWxsQXVkaW8uZ2V0KCk7Ci0gICAgICAgIGlmKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKQotICAgICAgICAgICAgbU1lZGlhQXVkaW8ub25TdHJlYW1TdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlKTsKLSAgICAgICAgZWxzZSBpZihhdWRpb1R5cGUgPT0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKQotICAgICAgICAgICAgIG1DYWxsQXVkaW8ub25BdWRpb1N0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlRGV2aWNlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBhdWRpb1R5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVEZXZpY2VNYW5hZ2VyICE9IG51bGwpCi0gICAgICAgICAgICBtQWN0aXZlRGV2aWNlTWFuYWdlci5vbkFjdGl2ZURldmljZUNoYW5nZShkZXZpY2UsIGF1ZGlvVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25NZWRpYUNvZGVjQ29uZmlnQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJsdWV0b290aENvZGVjU3RhdHVzIGNvZGVjU3RhdHVzLCBpbnQgYXVkaW9UeXBlKSB7Ci0gICAgICAgIE1lZGlhQXVkaW8gbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICBtTWVkaWFBdWRpby5vbkNvZGVjQ29uZmlnQ2hhbmdlKGRldmljZSwgY29kZWNTdGF0dXMsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbk1lZGlhQ29kZWNDb25maWdDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgY29kZWNTdGF0dXMsIGludCBhdWRpb1R5cGUsIGJvb2xlYW4gdXBkYXRlQXVkaW8pIHsKLSAgICAgICAgTWVkaWFBdWRpbyBtTWVkaWFBdWRpbyA9IE1lZGlhQXVkaW8uZ2V0KCk7Ci0gICAgICAgIG1NZWRpYUF1ZGlvLm9uQ29kZWNDb25maWdDaGFuZ2UoZGV2aWNlLCBjb2RlY1N0YXR1cywgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfTUVESUEsIHVwZGF0ZUF1ZGlvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsQXVkaW9QYXJhbShTdHJpbmcgcGFyYW0pIHsKLSAgICAgICAgQ2FsbEF1ZGlvIG1DYWxsQXVkaW8gPSBDYWxsQXVkaW8uZ2V0KCk7Ci0gICAgICAgIG1DYWxsQXVkaW8uc2V0QXVkaW9QYXJhbShwYXJhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbEF1ZGlvT24oYm9vbGVhbiBvbikgewotICAgICAgICBDYWxsQXVkaW8gbUNhbGxBdWRpbyA9IENhbGxBdWRpby5nZXQoKTsKLSAgICAgICAgbUNhbGxBdWRpby5zZXRCbHVldG9vdGhTY29Pbihvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRWY3BDb25uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Wb2x1bWVNYW5hZ2VyTG9jaykgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYW5hZ2VyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVNYW5hZ2VyLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uTW9kZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVZvbHVtZU1hbmFnZXJMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVZvbHVtZU1hbmFnZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZU1hbmFnZXIuZ2V0Q29ubmVjdGlvbk1vZGUoZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFic29sdXRlVm9sdW1lKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCB2b2x1bWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtVm9sdW1lTWFuYWdlckxvY2spIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lTWFuYWdlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIG1Wb2x1bWVNYW5hZ2VyLnVwZGF0ZUJyb2FkY2FzdFZvbHVtZShkZXZpY2UsIHZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEFic29sdXRlVm9sdW1lKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtVm9sdW1lTWFuYWdlckxvY2spIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lTWFuYWdlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVNYW5hZ2VyLmdldEJhc3NWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE11dGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBtdXRlU3RhdHVzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVZvbHVtZU1hbmFnZXJMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVZvbHVtZU1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtVm9sdW1lTWFuYWdlci5zZXRNdXRlKGRldmljZSwgbXV0ZVN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011dGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Wb2x1bWVNYW5hZ2VyTG9jaykgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYW5hZ2VyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVNYW5hZ2VyLmdldE11dGVTdGF0dXMoZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldENvbnRleHQoaW50IHByb2ZpbGVJRCkgewotICAgICAgICBpbnQgY29udGV4dCA9IDA7Ci0gICAgICAgIGlmKChEZXZpY2VQcm9maWxlTWFwLmdldExlTWVkaWFQcm9maWxlcygpICYgcHJvZmlsZUlEKSA+IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSAoY29udGV4dHxNRURJQV9DT05URVhUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChEZXZpY2VQcm9maWxlTWFwLmdldExlQ2FsbFByb2ZpbGVzKCkgJiBwcm9maWxlSUQpID4gMCkgewotICAgICAgICAgICAgY29udGV4dCA9IChjb250ZXh0fFZPSUNFX0NPTlRFWFQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEFjbVByb2ZpbGVJRCAoaW50IFByb2ZpbGVJRCkgewotICAgICAgICBpbnQgQWNtUHJvZmlsZUlEID0gMDsKLSAgICAgICAgaWYoKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX01FRElBICYgUHJvZmlsZUlEKSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9NRURJQSkKLSAgICAgICAgICAgIEFjbVByb2ZpbGVJRCA9IEJBUDsKLSAgICAgICAgaWYoKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwgJiBQcm9maWxlSUQpID09IEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0NBTEwpCi0gICAgICAgICAgICBBY21Qcm9maWxlSUQgPSBBY21Qcm9maWxlSUQgfCBCQVBfQ0FMTDsKLSAgICAgICAgaWYoKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuQkFQX0dDUCAmIFByb2ZpbGVJRCkgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfR0NQKQotICAgICAgICAgICAgQWNtUHJvZmlsZUlEID0gQWNtUHJvZmlsZUlEIHwgR0NQOwotICAgICAgICBpZigoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5CQVBfUkVDT1JESU5HICYgUHJvZmlsZUlEKSA9PSBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJBUF9SRUNPUkRJTkcpCi0gICAgICAgICAgICBBY21Qcm9maWxlSUQgPSBBY21Qcm9maWxlSUQgfCBXTUNQOwotICAgICAgICByZXR1cm4gQWNtUHJvZmlsZUlEOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgaW5pdEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMZUF1ZGlvVW5pY2FzdEJpbmRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMZUF1ZGlvVW5pY2FzdEJpbmRlciBleHRlbmRzIElCbHVldG9vdGhWY3AuU3R1YiBpbXBsZW1lbnRzIElQcm9maWxlU2VydmljZUJpbmRlciB7Ci0KLSAgICAgICAgU3RyZWFtQXVkaW9TZXJ2aWNlIG1TZXJ2aWNlOwotICAgICAgICBMZUF1ZGlvVW5pY2FzdEJpbmRlcihTdHJlYW1BdWRpb1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgaWYobVNlcnZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0VmNwQ29ublN0YXRlKGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uTW9kZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBpZihtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldENvbm5lY3Rpb25Nb2RlKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBYnNvbHV0ZVZvbHVtZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZihtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWJzb2x1dGVWb2x1bWUoZGV2aWNlLCB2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWJzb2x1dGVWb2x1bWUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgaWYobVNlcnZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gNzsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRBYnNvbHV0ZVZvbHVtZShkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE11dGUgKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gZW5hYmxlTXV0ZSkgewotICAgICAgICAgICAgaWYobVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldE11dGUoZGV2aWNlLCBlbmFibGVNdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc011dGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgaWYobVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5pc011dGUoZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyZWFtQXVkaW9TZXJ2aWNlIGdldFN0cmVhbUF1ZGlvU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHNTdHJlYW1BdWRpb1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3RyZWFtQXVkaW9TZXJ2aWNlKFN0cmVhbUF1ZGlvU2VydmljZSBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZXRTdHJlYW1BdWRpb1NlcnZpY2UoKTogc2V0IHRvOiAiICsgaW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNTdHJlYW1BdWRpb1NlcnZpY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9Wb2x1bWVNYW5hZ2VyLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2FwbS9Wb2x1bWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzE5NTcuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9hcG0vVm9sdW1lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RTb3VyY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAuQTJkcFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLkF2cmNwX2V4dDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYWNtLkFjbVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJjLkJDU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguaGZwLkhlYWRzZXRTZXJ2aWNlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFZvbHVtZU1hbmFnZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBUE06IFZvbHVtZU1hbmFnZXIiOwotICAgIHByaXZhdGUgc3RhdGljIFZvbHVtZU1hbmFnZXIgbVZvbHVtZU1hbmFnZXIgPSBudWxsOwotICAgIHByaXZhdGUgRGV2aWNlVm9sdW1lIG1NZWRpYTsKLSAgICBwcml2YXRlIERldmljZVZvbHVtZSBtQ2FsbDsKLSAgICBwcml2YXRlIERldmljZVZvbHVtZSBtQnJvYWRjYXN0OwotICAgIHByaXZhdGUgRGV2aWNlUHJvZmlsZU1hcCBkcG07Ci0gICAgcHJpdmF0ZSBNZWRpYUF1ZGlvIG1NZWRpYUF1ZGlvOwotICAgIHByaXZhdGUgQ2FsbEF1ZGlvIG1DYWxsQXVkaW87Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBtQ29udGV4dDsKLSAgICBCcm9hZGNhc3RSZWNlaXZlciBtVm9sdW1lTWFuYWdlclJlY2VpdmVyOwotICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IEFic1ZvbHVtZVN1cHBvcnQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMX1ZPTFVNRV9NQVAgPSAiYmx1ZXRvb3RoX2NhbGxfdm9sdW1lX21hcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVk9MVU1FX01BUCA9ICJibHVldG9vdGhfbWVkaWFfdm9sdW1lX21hcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPQURDQVNUX1ZPTFVNRV9NQVAgPSAiYmx1ZXRvb3RoX2Jyb2FkY2FzdF92b2x1bWVfbWFwIjsKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIEFDVElPTl9TSFVURE9XTiA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX1NIVVRET1dOIjsKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIEFDVElPTl9QT1dFUl9PRkYgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlFVSUNLQk9PVF9QT1dFUk9GRiI7Ci0KLSAgICBwcml2YXRlIFZvbHVtZU1hbmFnZXIoKSB7Ci0gICAgICAgIG1DYWxsID0gbmV3IERldmljZVZvbHVtZShtQ29udGV4dCwgQ0FMTF9WT0xVTUVfTUFQKTsKLSAgICAgICAgbU1lZGlhID0gbmV3IERldmljZVZvbHVtZShtQ29udGV4dCwgTUVESUFfVk9MVU1FX01BUCk7Ci0gICAgICAgIG1Ccm9hZGNhc3QgPSBuZXcgRGV2aWNlVm9sdW1lKG1Db250ZXh0LCBCUk9BRENBU1RfVk9MVU1FX01BUCk7Ci0KLSAgICAgICAgZHBtID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgbU1lZGlhQXVkaW8gPSBNZWRpYUF1ZGlvLmdldCgpOwotICAgICAgICBtQ2FsbEF1ZGlvID0gQ2FsbEF1ZGlvLmdldCgpOwotCi0gICAgICAgIEFic1ZvbHVtZVN1cHBvcnQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgICAgIG1Wb2x1bWVNYW5hZ2VyUmVjZWl2ZXIgPSBuZXcgVm9sdW1lTWFuYWdlclJlY2VpdmVyKCk7Ci0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQXVkaW9NYW5hZ2VyLlZPTFVNRV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEFDVElPTl9TSFVURE9XTik7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQUNUSU9OX1BPV0VSX09GRik7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlci5BQ1RJT05fQlJPQURDQVNUX1NPVVJDRV9JTkZPKTsKLSAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVm9sdW1lTWFuYWdlclJlY2VpdmVyLCBmaWx0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVm9sdW1lTWFuYWdlciBpbml0IChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIGlmKG1Wb2x1bWVNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVNYW5hZ2VyID0gbmV3IFZvbHVtZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIFZvbHVtZU1hbmFnZXJJbnRmLmluaXQobVZvbHVtZU1hbmFnZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImNsZWFudXAiKTsKLSAgICAgICAgaGFuZGxlRGV2aWNlU2h1dGRvd24oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtVm9sdW1lTWFuYWdlcikgewotICAgICAgICAgICAgbUNhbGwgPSBudWxsOwotICAgICAgICAgICAgbU1lZGlhID0gbnVsbDsKLSAgICAgICAgICAgIG1Ccm9hZGNhc3QgPSBudWxsOwotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Wb2x1bWVNYW5hZ2VyUmVjZWl2ZXIpOwotICAgICAgICAgICAgbVZvbHVtZU1hbmFnZXJSZWNlaXZlciA9IG51bGw7Ci0gICAgICAgICAgICBBYnNWb2x1bWVTdXBwb3J0LmNsZWFyKCk7Ci0gICAgICAgICAgICBBYnNWb2x1bWVTdXBwb3J0ID0gbnVsbDsKLSAgICAgICAgICAgIG1Wb2x1bWVNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVm9sdW1lTWFuYWdlciBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERldmljZVZvbHVtZSBWb2x1bWVUeXBlKGludCBtQXVkaW9UeXBlKSB7Ci0gICAgICAgIGlmKEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyA9PSBtQXVkaW9UeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbGw7Ci0gICAgICAgIH0gZWxzZSBpZihBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPID09IG1BdWRpb1R5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVkaWE7Ci0gICAgICAgIH0gZWxzZSBpZihBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkJST0FEQ0FTVF9BVURJTyA9PSBtQXVkaW9UeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJyb2FkY2FzdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25Nb2RlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICBpZihtQWNtU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BY21TZXJ2aWNlLmdldFZjcENvbm5Nb2RlKGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFBYnNvbHV0ZVZvbHVtZSAoSW50ZWdlciB2b2x1bWUpIHsKLSAgICAgICAgaWYobU1lZGlhLm1EZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUgKFRBRywgInNldE1lZGlhQWJzb2x1dGVWb2x1bWU6IE5vIERldmljZSBBY3RpdmUgZm9yIE1lZGlhLiBJZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWEudXBkYXRlVm9sdW1lKHZvbHVtZSk7Ci0KLSAgICAgICAgaWYoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5BVlJDUCA9PSBtTWVkaWEubVByb2ZpbGUpIHsKLSAgICAgICAgICAgIEF2cmNwX2V4dCBtQXZyY3AgPSBBdnJjcF9leHQuZ2V0KCk7Ci0gICAgICAgICAgICBpZihtQXZyY3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5pIChUQUcsICJzZXRNZWRpYUFic29sdXRlVm9sdW1lOiBVcGRhdGluZyBuZXcgdm9sdW1lIHRvIEFWUkNQOiAiICsgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICBtQXZyY3Auc2V0QWJzb2x1dGVWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQID09IG1NZWRpYS5tUHJvZmlsZSkgewotICAgICAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICAgICAgaWYobUFjbVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5pIChUQUcsICJzZXRNZWRpYUFic29sdXRlVm9sdW1lOiBVcGRhdGluZyBuZXcgdm9sdW1lIHRvIFZDUDogIiArIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhLnVwZGF0ZVZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIG1BY21TZXJ2aWNlLnNldEFic29sdXRlVm9sdW1lKG1NZWRpYS5tRGV2aWNlLCB2b2x1bWUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlTWVkaWFTdHJlYW1Wb2x1bWUgKEludGVnZXIgdm9sdW1lKSB7Ci0gICAgICAgIGlmKG1NZWRpYS5tRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lIChUQUcsICJ1cGRhdGVNZWRpYVN0cmVhbVZvbHVtZTogTm8gRGV2aWNlIEFjdGl2ZSBmb3IgTWVkaWEuIElnbm9yZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobU1lZGlhLm1TdXBwb3J0QWJzb2x1dGVWb2x1bWUpIHsKLSAgICAgICAgICAgIC8qIElnbm9yZTogV2lsbCB1cGRhdGUgdm9sdW1lIHZpYSBBUEkgY2FsbCAqLwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYS51cGRhdGVWb2x1bWUodm9sdW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVCcm9hZGNhc3RWb2x1bWUgKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCB2b2x1bWUpIHsKLSAgICAgICAgaW50IGNhbGxBdWRpb1N0YXRlID0gbUNhbGxBdWRpby5nZXRBdWRpb1N0YXRlKGRldmljZSk7Ci0gICAgICAgIGJvb2xlYW4gaXNDYWxsID0gKGNhbGxBdWRpb1N0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgICBjYWxsQXVkaW9TdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0NPTk5FQ1RFRCk7Ci0gICAgICAgIGlmIChpc0NhbGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbGwgaW4gcHJvZ3Jlc3MsIGlnbm9yZSB2b2x1bWUgY2hhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtQnJvYWRjYXN0LnVwZGF0ZVZvbHVtZShkZXZpY2UsIHZvbHVtZSk7Ci0gICAgICAgIEFjbVNlcnZpY2UgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1Hcm91cERldmljZSA9IG1BY21TZXJ2aWNlLmdldEdyb3VwKGRldmljZSk7Ci0gICAgICAgIG1BY21TZXJ2aWNlLnNldEFic29sdXRlVm9sdW1lKG1Hcm91cERldmljZSwgdm9sdW1lLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkJST0FEQ0FTVF9BVURJTyk7Ci0gICAgICAgIG1Ccm9hZGNhc3QudXBkYXRlVm9sdW1lKG1Hcm91cERldmljZSwgdm9sdW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNdXRlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gbXV0ZVN0YXR1cykgewotICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBtR3JvdXBEZXZpY2UgPSBtQWNtU2VydmljZS5nZXRHcm91cChkZXZpY2UpOwotICAgICAgICBtQWNtU2VydmljZS5zZXRNdXRlKG1Hcm91cERldmljZSwgbXV0ZVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZUNhbGxWb2x1bWUgKEludGVnZXIgdm9sdW1lKSB7Ci0gICAgICAgIGlmKG1DYWxsLm1EZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUgKFRBRywgInJlc3RvcmVDYWxsVm9sdW1lOiBObyBEZXZpY2UgQWN0aXZlIGZvciBDYWxsLiBJZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuSEZQID09IG1DYWxsLm1Qcm9maWxlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgcmVzdG9yaW5nIGNhbGwgdm9sdW1lIGZvciBIRlAgY2FzZQotICAgICAgICAgICAgTG9nLncgKFRBRywgInJlc3RvcmVDYWxsVm9sdW1lOiBJZ25vcmUgcmVzdG9yZSBjYWxsIHZvbHVtZSBmb3IgSEZQIik7Ci0gICAgICAgIH0gZWxzZSBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlZDUCA9PSBtQ2FsbC5tUHJvZmlsZSkgewotICAgICAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICAgICAgaWYobUFjbVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5pIChUQUcsICJyZXN0b3JlQ2FsbFZvbHVtZTogVXBkYXRpbmcgbmV3IHZvbHVtZSB0byBWQ1A6ICIgKyB2b2x1bWUpOwotICAgICAgICAgICAgICAgIG1DYWxsLnVwZGF0ZVZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIG1BY21TZXJ2aWNlLnNldEFic29sdXRlVm9sdW1lKG1DYWxsLm1EZXZpY2UsIHZvbHVtZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IFJlc3RvcmUgY2FsbCB2b2x1bWUgdG8gTU0tQXVkaW8gYWxzbwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbFZvbHVtZSAoSW50ZW50IGludGVudCkgewotICAgICAgICBpZihtQ2FsbC5tRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lIChUQUcsICJzZXRDYWxsVm9sdW1lOiBObyBEZXZpY2UgQWN0aXZlIGZvciBDYWxsLiBJZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB2b2x1bWUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQXVkaW9NYW5hZ2VyLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIDApOwotICAgICAgICBpZihBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkhGUCA9PSBtQ2FsbC5tUHJvZmlsZSkgewotICAgICAgICAgICAgTG9nLmkgKFRBRywgInNldENhbGxWb2x1bWU6IFVwZGF0aW5nIG5ldyB2b2x1bWUgdG8gSEZQOiAiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIEhlYWRzZXRTZXJ2aWNlIGhlYWRzZXRTZXJ2aWNlID0gSGVhZHNldFNlcnZpY2UuZ2V0SGVhZHNldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGhlYWRzZXRTZXJ2aWNlLnNldEludGVudFNjb1ZvbHVtZShpbnRlbnQpOwotICAgICAgICB9IGVsc2UgaWYoQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5WQ1AgPT0gbUNhbGwubVByb2ZpbGUpIHsKLSAgICAgICAgICAgIExvZy5pIChUQUcsICJzZXRDYWxsVm9sdW1lOiBtQ2FsbCB2b2x1bWU6ICIgKyBtQ2FsbC5tVm9sdW1lICsgIiwgdm9sdW1lOiAiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIC8vIEF2b2lkIHVwZGF0aW5nIHNhbWUgY2FsbCB2b2x1bWUgYWZ0ZXIgcmVtb3RlIHZvbHVtZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICh2b2x1bWUgPT0gbUNhbGwubVZvbHVtZSkgewotICAgICAgICAgICAgICAgIExvZy53IChUQUcsICJzZXRDYWxsVm9sdW1lOiBJZ25vcmUgdXBkYXRpbmcgc2FtZSBjYWxsIHZvbHVtZSB0byByZW1vdGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihtQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkgKFRBRywgInNldENhbGxWb2x1bWU6IFVwZGF0aW5nIG5ldyB2b2x1bWUgdG8gVkNQOiAiICsgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICBtQ2FsbC51cGRhdGVWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICBtQWNtU2VydmljZS5zZXRBYnNvbHV0ZVZvbHVtZShtQ2FsbC5tRGV2aWNlLCB2b2x1bWUsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIEFjbVNlcnZpY2UgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgcmV0dXJuIG1BY21TZXJ2aWNlLmdldFZjcENvbm5TdGF0ZShkZXZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ29ublN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgc3RhdGUsIEludGVnZXIgcHJvZmlsZSkgewotICAgICAgICBMb2cuZCAoVEFHLCAib25Db25uU3RhdGVDaGFuZ2U6IHN0YXRlOiAiICsgc3RhdGUgKyAiIFByb2ZpbGU6ICIgKyBwcm9maWxlKTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZSAoVEFHLCAib25Db25uU3RhdGVDaGFuZ2U6IGRldmljZSBpcyBudWxsLiBJZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFjbVNlcnZpY2UgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1Hcm91cERldmljZTsKLSAgICAgICAgaWYobUFjbVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwRGV2aWNlID0gbUFjbVNlcnZpY2UuZ2V0R3JvdXAoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Hcm91cERldmljZSA9IGRldmljZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtR3JvdXBEZXZpY2UuZXF1YWxzKG1NZWRpYS5tRGV2aWNlKSkgewotICAgICAgICAgICAgbU1lZGlhLm1Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgZHBtLmdldFByb2ZpbGUobUdyb3VwRGV2aWNlLCBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX1ZPTFVNRV9DT05UUk9MKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUdyb3VwRGV2aWNlLmVxdWFscyhtQ2FsbC5tRGV2aWNlKSkgewotICAgICAgICAgICAgbUNhbGwubVByb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICBkcG0uZ2V0UHJvZmlsZShtR3JvdXBEZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9WT0xVTUVfQ09OVFJPTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgIGludCBhdWRpb1R5cGUgPSBnZXRBY3RpdmVBdWRpb1R5cGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPID09IGF1ZGlvVHlwZSAmJiBtTWVkaWEubVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgIExvZy5kIChUQUcsICJvbkNvbm5TdGF0ZUNoYW5nZTogTWVkaWEgaXMgc3RyZWFtaW5nIG9yIGFjdGl2ZSwgdXBkYXRlIG1lZGlhIHZvbHVtZSIpOwotICAgICAgICAgICAgICAgIHNldE1lZGlhQWJzb2x1dGVWb2x1bWUobU1lZGlhLm1Wb2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8gPT0gYXVkaW9UeXBlICYmCi0gICAgICAgICAgICAgICAgICAgIG1DYWxsLm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZCAoVEFHLCAib25Db25uU3RhdGVDaGFuZ2U6IENhbGwgaXMgc3RyZWFtaW5nLCB1cGRhdGUgY2FsbCB2b2x1bWUiKTsKLSAgICAgICAgICAgICAgICByZXN0b3JlQ2FsbFZvbHVtZShtQ2FsbC5tVm9sdW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5CUk9BRENBU1RfQVVESU8gPT0gYXVkaW9UeXBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQgKFRBRywgIm9uQ29ublN0YXRlQ2hhbmdlOiBCcm9hZGNhc3QgaXMgc3RyZWFtaW5nLCB1cGRhdGUgYnJvYWRjYXN0IHZvbHVtZSIpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUJyb2FkY2FzdFZvbHVtZShkZXZpY2UsIGdldEJhc3NWb2x1bWUoZGV2aWNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblZvbHVtZUNoYW5nZShJbnRlZ2VyIHZvbHVtZSwgSW50ZWdlciBhdWRpb1R5cGUsIEJvb2xlYW4gc2hvd1VJKSB7Ci0gICAgICAgIGludCBmbGFnID0gc2hvd1VJID8gQXVkaW9NYW5hZ2VyLkZMQUdfU0hPV19VSSA6IDA7Ci0gICAgICAgIGlmKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8pewotICAgICAgICAgICAgbUNhbGwudXBkYXRlVm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICBtQ2FsbEF1ZGlvLmdldEF1ZGlvTWFuYWdlcigpLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX0JMVUVUT09USF9TQ08sCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZSwgZmxhZyk7Ci0gICAgICAgIH0gZWxzZSBpZihhdWRpb1R5cGUgPT0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTykgewotICAgICAgICAgICAgbU1lZGlhLnVwZGF0ZVZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgbU1lZGlhQXVkaW8uZ2V0QXVkaW9NYW5hZ2VyKCkuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgZmxhZyB8IEF1ZGlvTWFuYWdlci5GTEFHX0JMVUVUT09USF9BQlNfVk9MVU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEludGVnZXIgdm9sdW1lLCBJbnRlZ2VyIGF1ZGlvVHlwZSkgewotICAgICAgICBpZiAoKFZvbHVtZVR5cGUoYXVkaW9UeXBlKSA9PSBtQ2FsbCAmJiBkZXZpY2UuZXF1YWxzKG1DYWxsLm1EZXZpY2UpKSB8fAotICAgICAgICAgICAgKFZvbHVtZVR5cGUoYXVkaW9UeXBlKSA9PSBtTWVkaWEgJiYgZGV2aWNlLmVxdWFscyhtTWVkaWEubURldmljZSkpKSB7Ci0gICAgICAgICAgICBvblZvbHVtZUNoYW5nZSh2b2x1bWUsIGF1ZGlvVHlwZSwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnJvYWRjYXN0LnVwZGF0ZVZvbHVtZShkZXZpY2UsIHZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbk11dGVTdGF0dXNDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc011dGUsIGludCBhdWRpb1R5cGUpIHsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlRGV2aWNlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBhdWRpb1R5cGUpIHsKLSAgICAgICAgaWYoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZChtVm9sdW1lTWFuYWdlcikgewotICAgICAgICAgICAgICAgIGlmKFZvbHVtZVR5cGUoYXVkaW9UeXBlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBWb2x1bWVUeXBlKGF1ZGlvVHlwZSkucmVzZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBtUHJvZmlsZSA9IGRwbS5nZXRQcm9maWxlKGRldmljZSwgYXVkaW9UeXBlID09IEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTz8KLSAgICAgICAgICAgICAgICAgICAgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX1ZPTFVNRV9DT05UUk9MOkFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfVk9MVU1FX0NPTlRST0wpOwotICAgICAgICAgICAgRGV2aWNlVm9sdW1lIG1EZXZpY2VWb2x1bWUgPSBWb2x1bWVUeXBlKGF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICBtRGV2aWNlVm9sdW1lLnVwZGF0ZURldmljZShkZXZpY2UsIG1Qcm9maWxlKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkFjdGl2ZURldmljZUNoYW5nZTogZGV2aWNlOiAiICsgbURldmljZVZvbHVtZS5tRGV2aWNlICsgIi4gQXVkaW9UeXBlOiAiICsgYXVkaW9UeXBlKTsKLSAgICAgICAgICAgIGlmKG1EZXZpY2VWb2x1bWUuZXF1YWxzKG1NZWRpYSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbUFic1ZvbFN1cHBvcnRQcm9maWxlcyA9IEFic1ZvbHVtZVN1cHBvcnQuZ2V0T3JEZWZhdWx0KGRldmljZS5nZXRBZGRyZXNzKCksIDApOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBYnNTdXBwb3J0ZWQgPSAoKG1Qcm9maWxlICYgbUFic1ZvbFN1cHBvcnRQcm9maWxlcykgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiaXNBYnNvbHV0ZVZvbHVtZVN1cHBvcnQ6ICAiICsgaXNBYnNTdXBwb3J0ZWQpOwotICAgICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUubVN1cHBvcnRBYnNvbHV0ZVZvbHVtZSA9IGlzQWJzU3VwcG9ydGVkOwotICAgICAgICAgICAgICAgIG1NZWRpYUF1ZGlvLmdldEF1ZGlvTWFuYWdlcigpLmF2cmNwU3VwcG9ydHNBYnNvbHV0ZVZvbHVtZSAoCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0QWRkcmVzcygpLCBpc0Fic1N1cHBvcnRlZCk7Ci0KLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBY3RpdmVEZXZpY2VDaGFuZ2U6IFByb2ZpbGU6ICIgKyBtUHJvZmlsZSArICIuIE5ldyBWb2x1bWU6ICIgKyBtRGV2aWNlVm9sdW1lLm1Wb2x1bWUpOwotICAgICAgICAgICAgICAgIGlmICghaXNCcm9hZGNhc3RBdWRpb1N5bmNlZChkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtTWVkaWFBdWRpby5pc0EyZHBQbGF5aW5nKGRldmljZSkgJiYgbU1lZGlhQXVkaW8uZ2V0QXVkaW9NYW5hZ2VyKCkuaXNNdXNpY0FjdGl2ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRNZWRpYUFic29sdXRlVm9sdW1lKG1EZXZpY2VWb2x1bWUubVZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU3RyZWFtU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSW50ZWdlciBzdHJlYW1TdGF0ZSwgSW50ZWdlciBhdWRpb1R5cGUpIHsKLSAgICAgICAgYm9vbGVhbiBpc011c2ljQWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUgKFRBRywgInVwZGF0ZVN0cmVhbVN0YXRlOiBkZXZpY2UgaXMgbnVsbC4gSWdub3JlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPICYmCi0gICAgICAgICAgICBzdHJlYW1TdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkcpIHsKLSAgICAgICAgICAgIGlzTXVzaWNBY3RpdmUgPSBtTWVkaWFBdWRpby5nZXRBdWRpb01hbmFnZXIoKS5pc011c2ljQWN0aXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlU3RyZWFtU3RhdGUsIGRldmljZTogIiArIGRldmljZSArICIgdHlwZTogIiArIGF1ZGlvVHlwZQotICAgICAgICAgICAgICAgICsgIiBzdHJlYW1TdGF0ZTogIiArIHN0cmVhbVN0YXRlICsgIiBpc011c2ljQWN0aXZlOiAiICsgaXNNdXNpY0FjdGl2ZSk7Ci0KLSAgICAgICAgQWNtU2VydmljZSBtQWNtU2VydmljZSA9IEFjbVNlcnZpY2UuZ2V0QWNtU2VydmljZSgpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgbUdyb3VwRGV2aWNlOwotICAgICAgICBpZihtQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtR3JvdXBEZXZpY2UgPSBtQWNtU2VydmljZS5nZXRHcm91cChkZXZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUdyb3VwRGV2aWNlID0gZGV2aWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChhdWRpb1R5cGUgPT0gQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9BVURJTyAmJgotICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcpIHx8Ci0gICAgICAgICAgICAgICAgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8gJiYKLSAgICAgICAgICAgICAgICBzdHJlYW1TdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgIGlmIChpc0Jyb2FkY2FzdEF1ZGlvU3luY2VkKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVCcm9hZGNhc3RBdWRpb1N5bmNlZChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPICYmCi0gICAgICAgICAgICAgICAgc3RyZWFtU3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HICYmIGlzTXVzaWNBY3RpdmUpIHsKLSAgICAgICAgICAgIGlmIChtR3JvdXBEZXZpY2UuZXF1YWxzKG1NZWRpYS5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlc3RvcmUgdm9sdW1lIGZvciBBMmRwIHN0cmVhbWluZyIpOwotICAgICAgICAgICAgICAgIHNldE1lZGlhQWJzb2x1dGVWb2x1bWUobU1lZGlhLm1Wb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvVHlwZSA9PSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU8gJiYKLSAgICAgICAgICAgICAgICBzdHJlYW1TdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgaWYgKG1Hcm91cERldmljZS5lcXVhbHMobUNhbGwubURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZXN0b3JlIHZvbHVtZSBmb3IgY2FsbCIpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsVm9sdW1lKG1DYWxsLm1Wb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBY3RpdmVBdWRpb1R5cGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgY2FsbEF1ZGlvU3RhdGUgPSBtQ2FsbEF1ZGlvLmdldEF1ZGlvU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgYm9vbGVhbiBpc0NhbGwgPSAoY2FsbEF1ZGlvU3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19DT05ORUNUSU5HIHx8Ci0gICAgICAgICAgICAgICAgIGNhbGxBdWRpb1N0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVEKTsKLSAgICAgICAgaW50IGF1ZGlvVHlwZSA9IC0xOwotCi0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUgKFRBRywgImdldEFjdGl2ZUF1ZGlvVHlwZTogZGV2aWNlIGlzIG51bGwuIElnbm9yZSIpOwotICAgICAgICAgICAgcmV0dXJuIGF1ZGlvVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFjbVNlcnZpY2UgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1Hcm91cERldmljZTsKLSAgICAgICAgaWYobUFjbVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwRGV2aWNlID0gbUFjbVNlcnZpY2UuZ2V0R3JvdXAoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Hcm91cERldmljZSA9IGRldmljZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWVkaWFBdWRpby5pc0EyZHBQbGF5aW5nKGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICBtTWVkaWFBdWRpby5nZXRBdWRpb01hbmFnZXIoKS5pc011c2ljQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIGlmIChtR3JvdXBEZXZpY2UuZXF1YWxzKG1NZWRpYS5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFjdGl2ZSBNZWRpYSBhdWRpbyBpcyBzdHJlYW1pbmciKTsKLSAgICAgICAgICAgICAgICBhdWRpb1R5cGUgPSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzQ2FsbCkgewotICAgICAgICAgICAgaWYgKG1Hcm91cERldmljZS5lcXVhbHMobUNhbGwubURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBY3RpdmUgQ2FsbCBhdWRpbyBpcyBzdHJlYW1pbmciKTsKLSAgICAgICAgICAgICAgICBhdWRpb1R5cGUgPSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfQVVESU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNCcm9hZGNhc3RBdWRpb1N5bmNlZChkZXZpY2UpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJCcm9hZGNhc3QgYXVkaW8gaXMgc3RyZWFtaW5nIik7Ci0gICAgICAgICAgICBhdWRpb1R5cGUgPSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkJST0FEQ0FTVF9BVURJTzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk5vbmUgb2YgYXVkaW8gaXMgc3RyZWFtaW5nIik7Ci0gICAgICAgICAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSBhY3RpdmVEZXZpY2VNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuZ2V0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBhY3RpdmVEZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXZpY2VNYW5hZ2VyLmdldEFjdGl2ZURldmljZShBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBEZXZpY2UuZXF1YWxzKG1NZWRpYS5tRGV2aWNlKSAmJiBtR3JvdXBEZXZpY2UuZXF1YWxzKGFjdGl2ZURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQZWVyIGlzIE1lZGlhIGFjdGl2ZSwgc2V0IGZvciBtZWRpYSB0eXBlIGJ5IGRlZmF1bHQiKTsKLSAgICAgICAgICAgICAgICBhdWRpb1R5cGUgPSBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX0FVRElPOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbmFjdGl2ZSBwZWVyLCB1bmtub3cgYXVkaW8gdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAiZ2V0QWN0aXZlQXVkaW9UeXBlOiByZXQgIiArIGF1ZGlvVHlwZSk7Ci0gICAgICAgIHJldHVybiBhdWRpb1R5cGU7Ci0gICAgfQotCi0gICAgLypTaG91bGQgYmUgY2FsbGVkIGJ5IEFWUkNQIGFuZCBWQ1AgYWZ0ZXIgZXZlcnkgY29ubmVjdGlvbiovCi0gICAgcHVibGljIHZvaWQgc2V0QWJzb2x1dGVWb2x1bWVTdXBwb3J0KEJsdWV0b290aERldmljZSBkZXZpY2UsIEJvb2xlYW4gaXNTdXBwb3J0ZWQsCi0gICAgICAgICAgICBJbnRlZ2VyIGluaXRWb2wsIEludGVnZXIgcHJvZmlsZSkgewotICAgICAgICBzZXRBYnNvbHV0ZVZvbHVtZVN1cHBvcnQoZGV2aWNlLCBpc1N1cHBvcnRlZCwgcHJvZmlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWJzb2x1dGVWb2x1bWVTdXBwb3J0KEJsdWV0b290aERldmljZSBkZXZpY2UsIEJvb2xlYW4gaXNTdXBwb3J0ZWQsCi0gICAgICAgICAgICBJbnRlZ2VyIHByb2ZpbGUpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAic2V0QWJzb2x1dGVWb2x1bWVTdXBwb3J0IGRldmljZSAiICsgZGV2aWNlICsgIiBwcm9maWxlICIgKyBwcm9maWxlCi0gICAgICAgICAgICAgICAgKyAiIGlzU3VwcG9ydGVkICIgKyBpc1N1cHBvcnRlZCk7Ci0gICAgICAgIGlmKGRldmljZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBtUHJvZmlsZSA9IGRwbS5nZXRQcm9maWxlKGRldmljZSwgQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5NRURJQV9WT0xVTUVfQ09OVFJPTCk7Ci0gICAgICAgIGludCBtQWJzVm9sU3VwcG9ydFByb2ZpbGVzID0gQWJzVm9sdW1lU3VwcG9ydC5nZXRPckRlZmF1bHQoZGV2aWNlLmdldEFkZHJlc3MoKSwgMCk7Ci0gICAgICAgIGlmIChpc1N1cHBvcnRlZCkgewotICAgICAgICAgICAgbUFic1ZvbFN1cHBvcnRQcm9maWxlcyA9IG1BYnNWb2xTdXBwb3J0UHJvZmlsZXMgfCBwcm9maWxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUFic1ZvbFN1cHBvcnRQcm9maWxlcyA9IG1BYnNWb2xTdXBwb3J0UHJvZmlsZXMgJiB+cHJvZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGRldmljZS5lcXVhbHMobU1lZGlhLm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzQWJzU3VwcG9ydGVkID0gKChtUHJvZmlsZSAmIG1BYnNWb2xTdXBwb3J0UHJvZmlsZXMpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiVXBkYXRlIGFicyB2b2x1bWUgc3VwcG9ydDogICIgKyBpc0Fic1N1cHBvcnRlZCk7Ci0gICAgICAgICAgICBtTWVkaWEubVN1cHBvcnRBYnNvbHV0ZVZvbHVtZSA9IGlzQWJzU3VwcG9ydGVkOwotICAgICAgICAgICAgbU1lZGlhQXVkaW8uZ2V0QXVkaW9NYW5hZ2VyKCkuYXZyY3BTdXBwb3J0c0Fic29sdXRlVm9sdW1lICgKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldEFkZHJlc3MoKSwgaXNBYnNTdXBwb3J0ZWQpOwotCi0gICAgICAgICAgICBpZihtTWVkaWEubVByb2ZpbGUgPT0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhLm1Qcm9maWxlID0gbVByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic2V0QWJzb2x1dGVWb2x1bWVTdXBwb3J0OiBQcm9maWxlOiAiICsgbU1lZGlhLm1Qcm9maWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBYnNWb2x1bWVTdXBwb3J0LnB1dChkZXZpY2UuZ2V0QWRkcmVzcygpLCBtQWJzVm9sU3VwcG9ydFByb2ZpbGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlVm9sdW1lKEludGVnZXIgYXVkaW9UeXBlKSB7Ci0gICAgICAgIFZvbHVtZVR5cGUoYXVkaW9UeXBlKS5zYXZlVm9sdW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTYXZlZFZvbHVtZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJbnRlZ2VyIGF1ZGlvVHlwZSkgewotICAgICAgICByZXR1cm4gVm9sdW1lVHlwZShhdWRpb1R5cGUpLmdldFNhdmVkVm9sdW1lKGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBY3RpdmVWb2x1bWUoSW50ZWdlciBhdWRpb1R5cGUpIHsKLSAgICAgICAgcmV0dXJuIFZvbHVtZVR5cGUoYXVkaW9UeXBlKS5tVm9sdW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QmFzc1ZvbHVtZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIEFjbVNlcnZpY2UgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1Hcm91cERldmljZSA9IG1BY21TZXJ2aWNlLmdldEdyb3VwKGRldmljZSk7Ci0gICAgICAgIGludCB2b2x1bWUgPSBtQnJvYWRjYXN0LmdldFZvbHVtZShtR3JvdXBEZXZpY2UpOwotICAgICAgICBMb2cuaShUQUcsICJnZXRCYXNzVm9sdW1lOiAiICsgZGV2aWNlICsgIiB2b2x1bWU6ICIgKyB2b2x1bWUpOwotICAgICAgICByZXR1cm4gdm9sdW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldE11dGVTdGF0dXMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIGlmKG1BY21TZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUFjbVNlcnZpY2UuaXNWY3BNdXRlKGRldmljZSk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0Jyb2FkY2FzdEF1ZGlvU3luY2VkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgQkNTZXJ2aWNlIG1CQ1NlcnZpY2UgPSBCQ1NlcnZpY2UuZ2V0QkNTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtQkNTZXJ2aWNlID09IG51bGwgfHwgZGV2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBzcmNJbmZvcyA9Ci0gICAgICAgICAgICAgICAgbUJDU2VydmljZS5nZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbihkZXZpY2UpOwotICAgICAgICBpZiAoc3JjSW5mb3MgPT0gbnVsbCB8fCBzcmNJbmZvcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic291cmNlIEluZm9zIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzcmNJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHNyY0luZm9zLmdldChpKS5nZXRBdWRpb1N5bmNTdGF0ZSgpID09Ci0gICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRCkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlbW90ZSBzeW5jZWQgYXVkaW8gdG8gYnJvYWRjYXN0IHNvdXJjZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUJyb2FkY2FzdEF1ZGlvU3luY2VkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBtR3JvdXBEZXZpY2U7Ci0gICAgICAgIGlmKG1BY21TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Hcm91cERldmljZSA9IG1BY21TZXJ2aWNlLmdldEdyb3VwKGRldmljZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtR3JvdXBEZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY2FsbEF1ZGlvU3RhdGUgPSBtQ2FsbEF1ZGlvLmdldEF1ZGlvU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgYm9vbGVhbiBpc0NhbGwgPSAoY2FsbEF1ZGlvU3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19DT05ORUNUSU5HIHx8Ci0gICAgICAgICAgICAgICAgY2FsbEF1ZGlvU3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19DT05ORUNURUQpOwotCi0gICAgICAgIGlmIChtR3JvdXBEZXZpY2UuZXF1YWxzKG1NZWRpYS5tRGV2aWNlKSAmJiBtTWVkaWFBdWRpby5pc0EyZHBQbGF5aW5nKGRldmljZSkpIHsKLSAgICAgICAgICAgIExvZy5kIChUQUcsICJBY3RpdmUgbWVkaWEgZGV2aWNlIGFuZCBzdHJlYW1pbmcsIG5vdCByZXN0b3JlIGJyb2FkY2FzdCB2b2x1bWUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtR3JvdXBEZXZpY2UuZXF1YWxzKG1DYWxsLm1EZXZpY2UpICYmIGlzQ2FsbCkgewotICAgICAgICAgICAgTG9nLmQgKFRBRywgIkFjdGl2ZSBjYWxsIGRldmljZSBhbmQgaW4gY2FsbCwgbm90IHJlc3RvcmUgYnJvYWRjYXN0IHZvbHVtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmQgKFRBRywgIlJlc3RvcmUgYnJvYWRjYXN0IHZvbHVtZSB3aGlsZSByZW1vdGUgc3luY2VkIGF1ZGlvIik7Ci0gICAgICAgICAgICB1cGRhdGVCcm9hZGNhc3RWb2x1bWUoZGV2aWNlLCBnZXRCYXNzVm9sdW1lKGRldmljZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVEZXZpY2VVbmJvbmQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZihkZXZpY2UgPT0gbUNhbGwubURldmljZSkgewotICAgICAgICAgICAgbUNhbGwucmVzZXQoKTsKLSAgICAgICAgfQotICAgICAgICBpZihkZXZpY2UgPT0gbU1lZGlhLm1EZXZpY2UpIHsKLSAgICAgICAgICAgIG1NZWRpYS5yZXNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNhbGwucmVtb3ZlRGV2aWNlKGRldmljZSk7Ci0gICAgICAgIG1NZWRpYS5yZW1vdmVEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgbUJyb2FkY2FzdC5yZW1vdmVEZXZpY2UoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZURldmljZVNodXRkb3duKCkgewotICAgICAgICBMb2cuaShUQUcsICJoYW5kbGVEZXZpY2VTaHV0ZG93biBTYXZlIFZvbHVtZSBzdGFydCIpOwotICAgICAgICBpZihtQ2FsbC5tRGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsLnNhdmVWb2x1bWUoKTsKLSAgICAgICAgICAgIG1DYWxsLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobU1lZGlhLm1EZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhLnNhdmVWb2x1bWUoKTsKLSAgICAgICAgICAgIG1NZWRpYS5yZXNldCgpOwotICAgICAgICB9Ci0gICAgICAgIG1Ccm9hZGNhc3Quc2F2ZVZvbHVtZSgpOwotICAgICAgICBMb2cuaShUQUcsICJoYW5kbGVEZXZpY2VTaHV0ZG93biBTYXZlIFZvbHVtZSBlbmQiKTsKLSAgICB9Ci0KLSAgICBjbGFzcyBEZXZpY2VWb2x1bWUgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKLSAgICAgICAgaW50IG1Wb2x1bWU7Ci0gICAgICAgIGludCBtUHJvZmlsZTsKLSAgICAgICAgYm9vbGVhbiBtU3VwcG9ydEFic29sdXRlVm9sdW1lOwotICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtQmFzc1ZvbE1hcDsKLQotICAgICAgICBDb250ZXh0IG1Db250ZXh0OwotICAgICAgICBwcml2YXRlIFN0cmluZyBtQXVkaW9UeXBlU3RyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQUZFX1ZPTCA9IDc7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgbVZvbHVtZU1hcDsKLQotICAgICAgICBEZXZpY2VWb2x1bWUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbWFwKSB7Ci0gICAgICAgICAgICB0aGlzLnJlc2V0KCk7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICBtVm9sdW1lTWFwID0gbWFwOwotICAgICAgICAgICAgbVN1cHBvcnRBYnNvbHV0ZVZvbHVtZSA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZihtYXAgPT0gImJsdWV0b290aF9jYWxsX3ZvbHVtZV9tYXAiKSB7Ci0gICAgICAgICAgICAgICAgIG1BdWRpb1R5cGVTdHIgPSAiQ2FsbCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKG1hcCA9PSAiYmx1ZXRvb3RoX21lZGlhX3ZvbHVtZV9tYXAiKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHlwZVN0ciA9ICJNZWRpYSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UeXBlU3RyID0gIkJyb2FkY2FzdCI7Ci0gICAgICAgICAgICAgICAgbUJhc3NWb2xNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBhbGxLZXlzID0gZ2V0Vm9sdW1lTWFwKCkuZ2V0QWxsKCk7Ci0gICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgcHJlZiA9IGdldFZvbHVtZU1hcCgpLmVkaXQoKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgPz4gZW50cnkgOiBhbGxLZXlzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZCA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKS5nZXRSZW1vdGVEZXZpY2Uoa2V5KTsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIgJiYgZC5nZXRCb25kU3RhdGUoKSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1R5cGVTdHIuZXF1YWxzKCJCcm9hZGNhc3QiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJhc3NWb2xNYXAucHV0KGtleSwgKEludGVnZXIpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImFkZHJlc3MgIiArIGtleSArICIgZnJvbSB0aGUgYnJvYWRjYXN0IHZvbHVtZSBtYXAgdm9sdW1lIDoiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVtb3ZpbmcgIiArIGtleSArICIgZnJvbSB0aGUgIiArIG1BdWRpb1R5cGVTdHIgKyAiIHZvbHVtZSBtYXAiKTsKLSAgICAgICAgICAgICAgICAgICAgcHJlZi5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmVmLmFwcGx5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZURldmljZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUpIHsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBtUHJvZmlsZSA9IHByb2ZpbGU7Ci0KLSAgICAgICAgICAgIG1Wb2x1bWUgPSBnZXRTYXZlZFZvbHVtZShkZXZpY2UpOwotICAgICAgICAgICAgTG9nLmkgKFRBRywgIk5ldyAiICsgbUF1ZGlvVHlwZVN0ciArICIgZGV2aWNlOiAiICsgbURldmljZSArICIgVm9sOiAiICsgbVZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0U2F2ZWRWb2x1bWUgKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIGludCBtU2F2ZWRWb2x1bWU7Ci0gICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmID0gZ2V0Vm9sdW1lTWFwKCk7Ci0gICAgICAgICAgICBtU2F2ZWRWb2x1bWUgPSBwcmVmLmdldEludChkZXZpY2UuZ2V0QWRkcmVzcygpLCBTQUZFX1ZPTCk7Ci0gICAgICAgICAgICByZXR1cm4gbVNhdmVkVm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGVWb2x1bWUgKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1Wb2x1bWUgPSB2b2x1bWU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZVZvbHVtZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgaWYobUF1ZGlvVHlwZVN0ci5lcXVhbHMoIkJyb2FkY2FzdCIpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAidXBkYXRlVm9sdW1lLCBkZXZpY2UgIiArIGRldmljZSArICIgdm9sdW1lOiAiICsgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICBtQmFzc1ZvbE1hcC5wdXQoZGV2aWNlLmdldEFkZHJlc3MoKSwgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgZ2V0Vm9sdW1lKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgIGlmKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUgKFRBRywgIk51bGwgRGV2aWNlIHBhc3NlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYobUF1ZGlvVHlwZVN0ci5lcXVhbHMoIkJyb2FkY2FzdCIpKSB7Ci0gICAgICAgICAgICAgICAgaWYobUJhc3NWb2xNYXAuY29udGFpbnNLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1CYXNzVm9sTWFwLmdldE9yRGVmYXVsdChkZXZpY2UuZ2V0QWRkcmVzcygpLCA3KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbVNhdmVkVm9sdW1lID0gZ2V0U2F2ZWRWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUJhc3NWb2xNYXAucHV0KGRldmljZS5nZXRBZGRyZXNzKCksIG1TYXZlZFZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImdldCBzYXZlZCB2b2x1bWUsIGRldmljZSAiICsgZGV2aWNlICsgIiB2b2x1bWU6ICIgKyBtU2F2ZWRWb2x1bWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNhdmVkVm9sdW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgU2hhcmVkUHJlZmVyZW5jZXMgZ2V0Vm9sdW1lTWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKG1Wb2x1bWVNYXAsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNhdmVWb2x1bWUoKSB7Ci0gICAgICAgICAgICBpZihtQXVkaW9UeXBlU3RyLmVxdWFscygiQnJvYWRjYXN0IikpIHsKLSAgICAgICAgICAgICAgICBzYXZlQnJvYWRjYXN0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihtRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZSAoVEFHLCAic2F2ZVZvbHVtZTogTm8gRGV2aWNlIEFjdGl2ZSBmb3IgIiArIG1BdWRpb1R5cGVTdHIgKyAiLiBJZ25vcmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBwcmVmID0gZ2V0Vm9sdW1lTWFwKCkuZWRpdCgpOwotICAgICAgICAgICAgcHJlZi5wdXRJbnQobURldmljZS5nZXRBZGRyZXNzKCksIG1Wb2x1bWUpOwotICAgICAgICAgICAgcHJlZi5hcHBseSgpOwotICAgICAgICAgICAgTG9nLmkgKFRBRywgIlNhdmVkICIgKyBtQXVkaW9UeXBlU3RyICsgIiBWb2x1bWU6ICIgKyBtVm9sdW1lICsgIiBmb3IgZGV2aWNlOiAiICsgbURldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzYXZlQnJvYWRjYXN0Vm9sdW1lKCkgewotICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIHByZWYgPSBnZXRWb2x1bWVNYXAoKS5lZGl0KCk7Ci0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gaXRyIDogbUJhc3NWb2xNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIHByZWYucHV0SW50KGl0ci5nZXRLZXkoKSwgaXRyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJlZi5hcHBseSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2F2ZVZvbHVtZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBpZihkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lIChUQUcsICJOdWxsIERldmljZSBwYXNzZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihtQXVkaW9UeXBlU3RyLmVxdWFscygiQnJvYWRjYXN0IikpIHsKLSAgICAgICAgICAgICAgICBpbnQgbVZvbCA9IG1CYXNzVm9sTWFwLmdldE9yRGVmYXVsdChkZXZpY2UuZ2V0QWRkcmVzcygpLCA3KTsKLSAgICAgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgcHJlZiA9IGdldFZvbHVtZU1hcCgpLmVkaXQoKTsKLSAgICAgICAgICAgICAgICBwcmVmLnB1dEludChkZXZpY2UuZ2V0QWRkcmVzcygpLCBtVm9sKTsKLSAgICAgICAgICAgICAgICBwcmVmLmFwcGx5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlbW92ZURldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBpZihtQXVkaW9UeXBlU3RyLmVxdWFscygiQnJvYWRjYXN0IikpIHsKLSAgICAgICAgICAgICAgICBMb2cuaSAoVEFHLCAiUmVtb3ZlIGRldmljZSAiICsgZGV2aWNlICsgIiBmcm9tIGJyb2FkY2FzdCB2b2x1bWUgbWFwICIpOwotICAgICAgICAgICAgICAgIG1CYXNzVm9sTWFwLnJlbW92ZShkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBwcmVmID0gZ2V0Vm9sdW1lTWFwKCkuZWRpdCgpOwotICAgICAgICAgICAgcHJlZi5yZW1vdmUoZGV2aWNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBwcmVmLmFwcGx5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlc2V0ICgpIHsKLSAgICAgICAgICAgIExvZy5pIChUQUcsICJSZXNldCAiICsgbUF1ZGlvVHlwZVN0ciArICIgRGV2aWNlOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICBtRGV2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIG1Wb2x1bWUgPSBTQUZFX1ZPTDsKLSAgICAgICAgICAgIG1Qcm9maWxlID0gQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5OT05FOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWb2x1bWVNYW5hZ2VyUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYoYWN0aW9uID09IG51bGwpIAotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgc3dpdGNoKGFjdGlvbikgewotICAgICAgICAgICAgICAgIGNhc2UgQXVkaW9NYW5hZ2VyLlZPTFVNRV9DSEFOR0VEX0FDVElPTjoKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQXVkaW9NYW5hZ2VyLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgdm9sdW1lVmFsdWUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQXVkaW9NYW5hZ2VyLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIDApOwotICAgICAgICAgICAgICAgICAgICBpZihzdHJlYW1UeXBlID09IEF1ZGlvTWFuYWdlci5TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFZvbHVtZShpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWVkaWFTdHJlYW1Wb2x1bWUodm9sdW1lVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9CT05EX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZihkZXZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICBpZihzdGF0ZSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZXZpY2VVbmJvbmQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlci5BQ1RJT05fQlJPQURDQVNUX1NPVVJDRV9JTkZPOgotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNvdXJjZUluZm8gPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkVYVFJBX1NPVVJDRV9JTkZPKTsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IG51bGwgfHwgc291cmNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyAoVEFHLCAiQmx1ZXRvb3RoIERldmljZSBvciBTb3VyY2UgaW5mbyBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmZvLmdldEF1ZGlvU3luY1N0YXRlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUJyb2FkY2FzdEF1ZGlvU3luY2VkKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9TSFVURE9XTjoKLSAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9QT1dFUl9PRkY6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZURldmljZVNodXRkb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0JDU2VydmljZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0JDU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNiZjgxLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC9CQ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAyMCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5iYzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1Q7Ci0KLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoU3luY0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoU3luY0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RTb3VyY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjazsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5SZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlY29yZDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5QZXJpb2RpY0FkdmVydGlzaW5nQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuUGVyaW9kaWNBZHZlcnRpc2luZ01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuUGVyaW9kaWNBZHZlcnRpc2luZ1JlcG9ydDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHREZXNjcmlwdG9yOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1ldHJpY3NQcm90bzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5NZXRyaWNzTG9nZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5BZGFwdGVyU2VydmljZTsKLS8vKl9DU0lQCi0vL0NTSVAgcmVsYXRlZCBpbXBvcnRzCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmdyb3VwY2xpZW50Lkdyb3VwU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHcm91cENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkRldmljZUdyb3VwOwotLy9fQ1NJUCovCi0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci0vKiogQGhpZGUgKi8KLXB1YmxpYyBjbGFzcyBCQ1NlcnZpY2UgZXh0ZW5kcyBQcm9maWxlU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBCQ1NlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBDQVNfVVVJRCA9IG51bGw7Ly9QYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDA4OUZGLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkNfSUQgPSAiMDAwMDE4NEYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCU19JRCA9ICIwMDAwMTg1Mi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiOwotICAgIHByaXZhdGUgc3RhdGljIEJDU2VydmljZSBzQkNTZXJ2aWNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQkFTU19DTElFTlRfU1RBVEVfTUFDSElORVMgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JBU1NfQ0xJRU5UX0NTRVRfTUVNQkVSUyA9IDEwOwotICAgIHByaXZhdGUgZmluYWwgTWFwPEJsdWV0b290aERldmljZSwgQmFzc0NsaWVudFN0YXRlTWFjaGluZT4gbVN0YXRlTWFjaGluZXMgPQotICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbVN0YXRlTWFjaGluZXNUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgQmFzc0NzZXRNYW5hZ2VyPiBtU2V0TWFuYWdlcnMgPQotICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbVNldE1hbmFnZXJUaHJlYWQ7Ci0KLSAgICBwcml2YXRlIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZTsKLQotICAgIHByaXZhdGUgTWFwPEJsdWV0b290aERldmljZSwgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4+IG1BcHBDYWxsYmFja01hcCA9Ci0gICAgICAgICAgICAgbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBBcnJheUxpc3Q8SUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrPj4oKTsKLQotICAgIHByaXZhdGUgQmFzc1V0aWxzIGJhc3NVdGlscyA9IG51bGw7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TWU5DX0hBTkRMRSA9IC0xOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQURWX1NJRCA9IC0xOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQURWX0FERFJFU1NfVFlQRSA9IC0xOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQURWX0lOVEVSVkFMID0gLTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9CUk9BRENBU1RfSUQgPSAtMTsKLSAgICBwcml2YXRlIE1hcDxCbHVldG9vdGhEZXZpY2UsIEJsdWV0b290aERldmljZT4gbUFjdGl2ZVNvdXJjZU1hcDsKLQotICAgIC8vKl9DU0lQCi0gICAgLy9DU0VUIGludGVyZmFjZXMKLSAgICBwcml2YXRlIEdyb3VwU2VydmljZSBtU2V0Q29vcmRpbmF0b3IgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgcHVibGljIGludCBtQ3NpcEFwcElkID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbVF1ZXVlZE9wcyA9IDA7Ci0gICAgLy9fQ1NJUCovCi0KLSAgICAvKkNhY2hpbmcgdGhlIFBBcmVzdWx0cyBmcm9tIEJyb2FkY2FzdCBzb3VyY2UqLwotICAgIC8qVGhpcyBpcyBzdG9yZWQgYXQgc2VydmljZSBzbyB0aGF0IGVhY2ggZGV2aWNlIHN0YXRlIG1hY2hpbmUgY2FuIGFjY2VzcwotICAgIGFuZCB1c2UgaXQgYXMgbmVlZGVkLiBPbmNlIHRoZSBwZXJpb2RpYyBzeW5jIGluIGNhbmNlbGxlZCwgdGhpcyBkYXRhIHdpbGwgYnJlCi0gICAgcmVtb3ZlZCB0byBlbnN1cmUgc3RhYmxlIGRhdGEgd29uJ3QgdXNlZCovCi0gICAgLypicm9hZGNhc3RTcmNEZXZpY2UsIHN5bmNIYW5kbGUqLwotICAgIHByaXZhdGUgTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4gbVN5bmNIYW5kbGVNYXA7Ci0gICAgLypzeW5jSGFuZGxlLCBwYXJzZWQgQmFzZURhdGEgZGF0YSovCi0gICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgQmFzZURhdGE+IG1TeW5jSGFuZGxlVnNCYXNlSW5mbzsKLSAgICAvKmJjYXN0U3JjRGV2aWNlLCBjb3JyZXNwb25kaW5nIFBBUmVzdWx0c01hcCovCi0gICAgcHJpdmF0ZSBNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBQQVJlc3VsdHM+IG1QQVJlc3VsdHNNYXA7Ci0gICAgcHVibGljIGNsYXNzIFBBUmVzdWx0cyB7Ci0gICAgICAgIHB1YmxpYyBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKLSAgICAgICAgcHVibGljIGludCBtQWRkcmVzc1R5cGU7Ci0gICAgICAgIHB1YmxpYyBpbnQgbUFkdlNpZDsKLSAgICAgICAgcHVibGljIGludCBtU3luY0hhbmRsZTsKLSAgICAgICAgcHVibGljIGJ5dGUgbWV0YURhdGFMZW5ndGg7Ci0gICAgICAgIHB1YmxpYyBieXRlW10gbWV0YURhdGE7Ci0gICAgICAgIHB1YmxpYyBpbnQgbVBBSW50ZXJ2YWw7Ci0gICAgICAgIHB1YmxpYyBpbnQgbUJyb2FkY2FzdElkOwotCi0gICAgICAgIFBBUmVzdWx0cyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgYWRkcmVzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5bmNIYW5kbGUsIGludCBhZHZTaWQsIGludCBwYUludGVydmFsLCBpbnQgYnJvYWRjYXN0SWQpIHsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBtQWRkcmVzc1R5cGUgPSBhZGRyZXNzVHlwZTsKLSAgICAgICAgICAgIG1BZHZTaWQgPSBhZHZTaWQ7Ci0gICAgICAgICAgICBtU3luY0hhbmRsZSA9IHN5bmNIYW5kbGU7Ci0gICAgICAgICAgICBtUEFJbnRlcnZhbCA9IHBhSW50ZXJ2YWw7Ci0gICAgICAgICAgICBtQnJvYWRjYXN0SWQgPSBicm9hZGNhc3RJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN5bmNIYW5kbGUoaW50IHN5bmNIYW5kbGUpIHsKLSAgICAgICAgICAgIG1TeW5jSGFuZGxlID0gc3luY0hhbmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFkdlNpZChpbnQgYWR2U2lkKSB7Ci0gICAgICAgICAgICBtQWR2U2lkID0gYWR2U2lkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlQWRkcmVzc1R5cGUoaW50IGFkZHJlc3NUeXBlKSB7Ci0gICAgICAgICAgICBtQWRkcmVzc1R5cGUgPSBhZGRyZXNzVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFkdkludGVydmFsKGludCBhZHZJbnRlcnZhbCkgewotICAgICAgICAgICAgbVBBSW50ZXJ2YWwgPSBhZHZJbnRlcnZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJyb2FkY2FzdElkKGludCBicm9hZGNhc3RJZCkgewotICAgICAgICAgICAgbUJyb2FkY2FzdElkID0gYnJvYWRjYXN0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcmludCgpIHsKLSAgICAgICAgICAgIGxvZygiLS0gUEFSZXN1bHRzIC0tIik7Ci0gICAgICAgICAgICBsb2coIm1EZXZpY2U6IiArIG1EZXZpY2UpOwotICAgICAgICAgICAgbG9nKCJtQWRkcmVzc1R5cGU6IiArIG1BZGRyZXNzVHlwZSk7Ci0gICAgICAgICAgICBsb2coIm1BZHZTaWQ6IiArIG1BZHZTaWQpOwotICAgICAgICAgICAgbG9nKCJtU3luY0hhbmRsZToiICsgbVN5bmNIYW5kbGUpOwotICAgICAgICAgICAgbG9nKCJtUEFJbnRlcnZhbDoiICsgbVBBSW50ZXJ2YWwpOwotICAgICAgICAgICAgbG9nKCJtQnJvYWRjYXN0SWQ6IiArIG1Ccm9hZGNhc3RJZCk7Ci0gICAgICAgICAgICBsb2coIi0tIEVORDogUEFSZXN1bHRzIC0tIik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUEFSZXN1bHRzTWFwKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBhZGRyZXNzVHlwZSwgaW50IHN5bmNIYW5kbGUsIGludCBhZHZTaWQsIGludCBhZHZJbnRlcnZhbCwgaW50IGJJZCkgewotICAgICAgICAgIGxvZygidXBkYXRlUEFSZXN1bHRzTWFwOiBkZXZpY2U6ICIgKyBkZXZpY2UpOwotICAgICAgICAgIGxvZygidXBkYXRlUEFSZXN1bHRzTWFwOiBzeW5jSGFuZGxlOiAiICsgc3luY0hhbmRsZSk7Ci0gICAgICAgICAgbG9nKCJ1cGRhdGVQQVJlc3VsdHNNYXA6IGFkdlNpZDogIiArIGFkdlNpZCk7Ci0gICAgICAgICAgbG9nKCJ1cGRhdGVQQVJlc3VsdHNNYXA6IGFkZHJlc3NUeXBlOiAiICsgYWRkcmVzc1R5cGUpOwotICAgICAgICAgIGxvZygidXBkYXRlUEFSZXN1bHRzTWFwOiBhZHZJbnRlcnZhbDogIiArIGFkdkludGVydmFsKTsKLSAgICAgICAgICBsb2coInVwZGF0ZVBBUmVzdWx0c01hcDogYnJvYWRjYXN0SWQ6ICIgKyBiSWQpOwotICAgICAgICAgIGxvZygibVN5bmNIYW5kbGVNYXAiICsgbVN5bmNIYW5kbGVNYXApOwotICAgICAgICAgIGxvZygibVBBUmVzdWx0c01hcCIgKyBtUEFSZXN1bHRzTWFwKTsKLSAgICAgICAgICAvL0NhY2hlIHRoZSBTeW5jSGFuZGxlCi0gICAgICAgICAgaWYgKG1TeW5jSGFuZGxlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgSW50ZWdlciBpID0gbmV3IEludGVnZXIoc3luY0hhbmRsZSk7Ci0gICAgICAgICAgICAgIG1TeW5jSGFuZGxlTWFwLnB1dChkZXZpY2UsIGkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobVBBUmVzdWx0c01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIFBBUmVzdWx0cyBwYVJlcyA9IG1QQVJlc3VsdHNNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgIGlmIChwYVJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBsb2coIlBBUmVzbWFwOiBhZGQgPj4+Iik7Ci0gICAgICAgICAgICAgICAgICBwYVJlcyA9IG5ldyBQQVJlc3VsdHMgKGRldmljZSwgYWRkcmVzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jSGFuZGxlLCBhZHZTaWQsIGFkdkludGVydmFsLCBiSWQpOwotICAgICAgICAgICAgICAgICAgaWYgKHBhUmVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICBwYVJlcy5wcmludCgpOwotICAgICAgICAgICAgICAgICAgICAgIG1QQVJlc3VsdHNNYXAucHV0KGRldmljZSwgcGFSZXMpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgaWYgKGFkdlNpZCAhPSBJTlZBTElEX0FEVl9TSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBwYVJlcy51cGRhdGVBZHZTaWQoYWR2U2lkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChzeW5jSGFuZGxlICE9IElOVkFMSURfU1lOQ19IQU5ETEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICBwYVJlcy51cGRhdGVTeW5jSGFuZGxlKHN5bmNIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NUeXBlICE9IElOVkFMSURfQURWX0FERFJFU1NfVFlQRSkgewotICAgICAgICAgICAgICAgICAgICAgIHBhUmVzLnVwZGF0ZUFkZHJlc3NUeXBlKGFkZHJlc3NUeXBlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChhZHZJbnRlcnZhbCAhPSBJTlZBTElEX0FEVl9JTlRFUlZBTCkgewotICAgICAgICAgICAgICAgICAgICAgIHBhUmVzLnVwZGF0ZUFkdkludGVydmFsKGFkdkludGVydmFsKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChiSWQgIT0gSU5WQUxJRF9CUk9BRENBU1RfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBwYVJlcy51cGRhdGVCcm9hZGNhc3RJZChiSWQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgbG9nKCJQQVJlc21hcDogdXBkYXRlID4+PiIpOwotICAgICAgICAgICAgICAgICAgcGFSZXMucHJpbnQoKTsKLSAgICAgICAgICAgICAgICAgIG1QQVJlc3VsdHNNYXAucmVwbGFjZShkZXZpY2UsIHBhUmVzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBsb2coIj4+bVBBUmVzdWx0c01hcCIgKyBtUEFSZXN1bHRzTWFwKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIFBBUmVzdWx0cyBnZXRQQVJlc3VsdHMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgIFBBUmVzdWx0cyByZXMgPSBudWxsOwotICAgICAgICAgIGlmIChtUEFSZXN1bHRzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlcyA9IG1QQVJlc3VsdHNNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImdldFBBUmVzdWx0czogbVBBUmVzdWx0c01hcCBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBQQVJlc3VsdHMgY2xlYXJQQVJlc3VsdHMoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgIFBBUmVzdWx0cyByZXMgPSBudWxsOwotICAgICAgICAgIGlmIChtUEFSZXN1bHRzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlcyA9IG1QQVJlc3VsdHNNYXAucmVtb3ZlKGRldmljZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImdldFBBUmVzdWx0czogbVBBUmVzdWx0c01hcCBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgdXBkYXRlQkFTRShpbnQgc3luY0hhbmRsZW1hcCwgQmFzZURhdGEgYmFzZSkgewotICAgICAgICAgaWYgKG1TeW5jSGFuZGxlVnNCYXNlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgbG9nKCJ1cGRhdGVCQVNFIDogbVN5bmNIYW5kbGVWc0Jhc2VJbmZvPj4iKTsKLSAgICAgICAgICAgICBtU3luY0hhbmRsZVZzQmFzZUluZm8ucHV0KHN5bmNIYW5kbGVtYXAsIGJhc2UpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBMb2cuZShUQUcsICJ1cGRhdGVCQVNFOiBtU3luY0hhbmRsZVZzQmFzZUluZm8gaXMgbnVsbCIpOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgcHVibGljIEJhc2VEYXRhIGdldEJBU0UoaW50IHN5bmNIYW5kbGVtYXApIHsKLSAgICAgICAgQmFzZURhdGEgYmFzZSA9IG51bGw7Ci0gICAgICAgIGlmIChtU3luY0hhbmRsZVZzQmFzZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCJnZXRCQVNFIDogc3luY0hhbmRsZW1hcDo6IiArIHN5bmNIYW5kbGVtYXApOwotICAgICAgICAgICAgYmFzZSA9IG1TeW5jSGFuZGxlVnNCYXNlSW5mby5nZXQoc3luY0hhbmRsZW1hcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJnZXRCQVNFOiBtU3luY0hhbmRsZVZzQmFzZUluZm8gaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvZygiZ2V0QkFTRSByZXR1cm5zIiArIGJhc2UpOwotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckJBU0UoaW50IHN5bmNIYW5kbGVtYXApIHsKLSAgICAgICAgaWYgKG1TeW5jSGFuZGxlVnNCYXNlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2coImNsZWFyQkFTRSA6IG1TeW5jSGFuZGxlVnNCYXNlSW5mbz4+Iik7Ci0gICAgICAgICAgICBtU3luY0hhbmRsZVZzQmFzZUluZm8ucmVtb3ZlKHN5bmNIYW5kbGVtYXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAidXBkYXRlQkFTRTogbVN5bmNIYW5kbGVWc0Jhc2VJbmZvIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVN5bmNlZFNvdXJjZShCbHVldG9vdGhEZXZpY2Ugc2NhbkRlbGVnYXRvciwgQmx1ZXRvb3RoRGV2aWNlIHNvdXJjZURldmljZSkgewotICAgICAgICBsb2coInNldEFjdGl2ZVN5bmNlZFNvdXJjZTogc2NhbkRlbGVnYXRvciIgKyBzY2FuRGVsZWdhdG9yICsgIjo6IHNvdXJjZURldmljZToiICsgc291cmNlRGV2aWNlKTsKLSAgICAgICAgaWYgKHNvdXJjZURldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQWN0aXZlU291cmNlTWFwLnJlbW92ZShzY2FuRGVsZWdhdG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BY3RpdmVTb3VyY2VNYXAucHV0KHNjYW5EZWxlZ2F0b3IsIHNvdXJjZURldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQmx1ZXRvb3RoRGV2aWNlIGdldEFjdGl2ZVN5bmNlZFNvdXJjZShCbHVldG9vdGhEZXZpY2Ugc2NhbkRlbGVnYXRvcikgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgY3VycmVudFNvdXJjZSA9ICBtQWN0aXZlU291cmNlTWFwLmdldChzY2FuRGVsZWdhdG9yKTsKLSAgICAgICAgbG9nKCJnZXRBY3RpdmVTeW5jZWRTb3VyY2U6IHNjYW5EZWxlZ2F0b3IiICsgc2NhbkRlbGVnYXRvciArICJyZXR1cm5pbmcgIiArIGN1cnJlbnRTb3VyY2UpOwotICAgICAgICByZXR1cm4gY3VycmVudFNvdXJjZTsKLSAgICB9Ci0KLSAgICAgQE92ZXJyaWRlCi0gICAgIHByb3RlY3RlZCBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgaW5pdEJpbmRlcigpIHsKLSAgICAgICAgIHJldHVybiBuZXcgQmx1ZXRvb3RoU3luY0hlbHBlckJpbmRlcih0aGlzKTsKLSAgICAgfQotCi0gICAgIC8vKl9DU0lQCi0gICAgIHByaXZhdGUgQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayBtQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayA9IG5ldyBCbHVldG9vdGhHcm91cENhbGxiYWNrKCkgewotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR3JvdXBDbGllbnRBcHBSZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBhcHBJZCkgewotICAgICAgICAgICAgICBsb2coIm9uQ3NpcEFwcFJlZ2lzdGVyZWQ6IiArIHN0YXR1cyArICJhcHBJZDogIiArIGFwcElkKTsKLSAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICBtQ3NpcEFwcElkID0gYXBwSWQ7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDc2lwIHJlZ2lzdGVyYXRpb24gZmFpbGVkLCBzdGF0dXM6IiArIHN0YXR1cyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgKGludCBzdGF0ZSwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgICBsb2coIm9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDogRGV2aWNlOiAiICsgZGV2aWNlICsgInN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgLy9ub3RpZnkgdGhlIHN0YXRlbWFjaGluZSBhYm91dCBDU0lQIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gc3RhdGVNYWNoaW5lLm9idGFpbk1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5DU0lQX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbS5vYmogPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcHVibGljIHZvaWQgb25OZXdHcm91cEZvdW5kIChpbnQgc2V0SWQsICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBVVUlEIHV1aWQpIHsgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdyb3VwRGlzY292ZXJ5U3RhdHVzQ2hhbmdlZCAoaW50IHNldElkLCBpbnQgc3RhdHVzLCBpbnQgcmVhc29uKSB7ICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdyb3VwRGV2aWNlRm91bmQgKGludCBzZXRJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeyAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQgb25FeGNsdXNpdmVBY2Nlc3NDaGFuZ2VkIChpbnQgc2V0SWQsIGludCB2YWx1ZSwgaW50IHN0YXR1cywgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMpIHsKLSAgICAgICAgICAgICAgbG9nKCJvbkxvY2tTdGF0dXNDaGFuZ2VkOiBzZXRJZCIgKyBzZXRJZCArIGRldmljZXMgKyAic3RhdHVzOiIgKyBzdGF0dXMpOwotICAgICAgICAgICAgICBCYXNzQ3NldE1hbmFnZXIgc2V0TWdyID0gbnVsbDsKLSAgICAgICAgICAgICAgc2V0TWdyID0gZ2V0T3JDcmVhdGVDU2V0TWFuYWdlcihzZXRJZCwgbnVsbCk7Ci0gICAgICAgICAgICAgIGlmIChzZXRNZ3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsb2cgKCJzZW5kaW5nIExvY2sgc3RhdHVzIHRvIHNldElkOiIgKyBzZXRJZCk7Ci0gICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHNldE1nci5vYnRhaW5NZXNzYWdlKEJhc3NDc2V0TWFuYWdlci5MT0NLX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICAgICAgICBtLm9iaiA9IGRldmljZXM7Ci0gICAgICAgICAgICAgIG0uYXJnMSA9IHZhbHVlOwotICAgICAgICAgICAgICBzZXRNZ3Iuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXhjbHVzaXZlQWNjZXNzU3RhdHVzRmV0Y2hlZCAoaW50IHNldElkLCBpbnQgbG9ja1N0YXR1cykgeyAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQgb25FeGNsdXNpdmVBY2Nlc3NBdmFpbGFibGUgKGludCBzZXRJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeyAgICB9Ci0gICAgIH07Ci0gICAgIC8vX0NTSVAqLwotCi0gICAgIEBPdmVycmlkZQotICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RhcnQoKSIpOwotICAgICAgICB9Ci0gICAgICAgIG1BZGFwdGVyU2VydmljZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKSwKLSAgICAgICAgICAgICAgICAgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIHdoZW4gQkNTZXJ2aWNlIHN0YXJ0cyIpOwotICAgICAgICAgbVN0YXRlTWFjaGluZXMuY2xlYXIoKTsKLSAgICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkJDU2VydmljZS5TdGF0ZU1hY2hpbmVzIik7Ci0gICAgICAgICBtU3RhdGVNYWNoaW5lc1RocmVhZC5zdGFydCgpOwotCi0gICAgICAgICBtU2V0TWFuYWdlcnMuY2xlYXIoKTsKLSAgICAgICAgIG1TZXRNYW5hZ2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkJDU2VydmljZS5TZXRNYW5hZ2VycyIpOwotICAgICAgICAgbVNldE1hbmFnZXJUaHJlYWQuc3RhcnQoKTsKLQotICAgICAgICAgc2V0QkNTZXJ2aWNlKHRoaXMpOwotICAgICAgICAgYmFzc1V0aWxzID0gbmV3IEJhc3NVdGlscyh0aGlzKTsKLSAgICAgICAgIC8vU2F2aW5nIFBTeW5jIHN0dWZmIGZvciBmdXR1cmUgYWRkaXRpb24KLSAgICAgICAgIG1TeW5jSGFuZGxlTWFwID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPigpOwotICAgICAgICAgbVBBUmVzdWx0c01hcCA9IG5ldyBIYXNoTWFwPEJsdWV0b290aERldmljZSwgUEFSZXN1bHRzPigpOwotICAgICAgICAgbVN5bmNIYW5kbGVWc0Jhc2VJbmZvID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQmFzZURhdGE+KCk7Ci0gICAgICAgICBtQWN0aXZlU291cmNlTWFwID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBCbHVldG9vdGhEZXZpY2U+KCk7Ci0KLSAgICAgICAgIC8vKl9DU0lQCi0gICAgICAgICAvL0NTRVQgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgIG1TZXRDb29yZGluYXRvciA9IEdyb3VwU2VydmljZS5nZXRHcm91cFNlcnZpY2UoKTsKLSAgICAgICAgIGlmIChtU2V0Q29vcmRpbmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgIG1TZXRDb29yZGluYXRvci5yZWdpc3Rlckdyb3VwQ2xpZW50TW9kdWxlKG1CbHVldG9vdGhHcm91cENhbGxiYWNrKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgLypfUEFDUwotICAgICAgICAgbVBhY3NDbGllbnRTZXJ2aWNlID0gUGFjc0NsaWVudFNlcnZpY2UuZ2V0UGFjc0NsaWVudFNlcnZpY2UoKTsKLSAgICAgICAgIF9QQUNTKi8KLQotICAgICAgICAgLy8vKl9HQVAKLSAgICAgICAgIC8vR0FQIHJlZ2lzdGVyYXRpb24gZm9yIEJhc3MgVVVJRCBub3RpZmljYXRpb24KLSAgICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgIGxvZygicmVnaXN0ZXIgZm9yIEJBU1MgVVVJRCBub3RpZiIpOwotICAgICAgICAgICAgUGFyY2VsVXVpZCBiYXNzVXVpZCA9IG5ldyBQYXJjZWxVdWlkKEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuQkFTU19VVUlEKTsKLSAgICAgICAgICAgIG1BZGFwdGVyU2VydmljZS5yZWdpc3RlclV1aWRTcnZjRGlzYyhiYXNzVXVpZCk7Ci0gICAgICAgICB9Ci0gICAgICAgICAvL19HQVAqLwotICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3AoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN0b3AoKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgIGZvciAoQmFzc0NsaWVudFN0YXRlTWFjaGluZSBzbSA6IG1TdGF0ZU1hY2hpbmVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgIHNtLmRvUXVpdCgpOwotICAgICAgICAgICAgICAgICBzbS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN0YXRlTWFjaGluZXNUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgICAgICBtU3RhdGVNYWNoaW5lc1RocmVhZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNldE1hbmFnZXJUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgIG1TZXRNYW5hZ2VyVGhyZWFkLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgICAgICBtU2V0TWFuYWdlclRocmVhZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRCQ1NlcnZpY2UobnVsbCk7Ci0KLSAgICAgICAgaWYgKG1BcHBDYWxsYmFja01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQXBwQ2FsbGJhY2tNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1BcHBDYWxsYmFja01hcCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN5bmNIYW5kbGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN5bmNIYW5kbGVNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1TeW5jSGFuZGxlTWFwID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQWN0aXZlU291cmNlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BY3RpdmVTb3VyY2VNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1BY3RpdmVTb3VyY2VNYXAgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vKl9DU0lQCi0gICAgICAgIGlmIChtU2V0Q29vcmRpbmF0b3IgIT0gbnVsbCAmJiBtQ3NpcEFwcElkICE9IC0xKSB7Ci0gICAgICAgICAgIC8vbVNldENvb3JkaW5hdG9yLnVucmVnaXN0ZXJHcm91cENsaWVudE1vZHVsZShtQ3NpcEFwcElkKTsKLSAgICAgICAgfQotICAgICAgICAvL19DU0lQKi8KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgIH0KLQotICAgICBAT3ZlcnJpZGUKLSAgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBMb2cuZChUQUcsICJOZWVkIHRvIHVucmVnaXN0ZXIgYXBwIik7Ci0gICAgICAgIC8vdW5yZWdpc3RlckFwcCgpOwotICAgICAgICByZXR1cm4gc3VwZXIub25VbmJpbmQoaW50ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEJDU2VydmljZSBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gQkNTZXJ2aWNlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQkNTZXJ2aWNlIGdldEJDU2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNCQ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0QkNTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgTlVMTCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXNCQ1NlcnZpY2UuaXNBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0QkNTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNCQ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJhc3NVdGlscyBnZXRCYXNzVXRpbHMoKSB7Ci0gICAgICAgIHJldHVybiBiYXNzVXRpbHM7Ci0gICAgfQotCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXREZXZpY2VGb3JTeW5jSGFuZGxlKGludCBzeW5jSGFuZGxlKSB7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXYgPSBudWxsOwotICAgICAgICBpZiAobVN5bmNIYW5kbGVNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPiBlbnRyeSA6IG1TeW5jSGFuZGxlTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gc3luY0hhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICBkZXYgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRldjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCQ1NlcnZpY2UoQkNTZXJ2aWNlIGluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNldEJDU2VydmljZSgpOiBzZXQgdG86ICIgKyBpbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0JDU2VydmljZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbm5lY3RzIHRoZSBiYXNzIHByb2ZpbGUgdG8gdGhlIHBhc3NlZCBpbiBkZXZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgaXMgdGhlIGRldmljZSB3aXRoIHdoaWNoIHdlIHdpbGwgY29ubmVjdCB0aGUgQmFzcyBwcm9maWxlCi0gICAgICogQHJldHVybiB0cnVlIGlmIEJBc3MgcHJvZmlsZSBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29ubmVjdCgpOiAiICsgZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRDb25uZWN0aW9uUG9saWN5KGRldmljZSkgPT0gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9VTktOT1dOKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotCi0gICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5DT05ORUNUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgQmFzc2NsaWVudCBwcm9maWxlIGZvciB0aGUgcGFzc2VkIGluIGRldmljZQotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBpcyB0aGUgZGV2aWNlIHdpdGggd2hpY2ggd2Ugd2FudCB0byBkaXNjb25uZWN0ZWQgdGhlIEJBc3MgY2xpZW50IHByb2ZpbGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgQmFzcyBjbGllbnQgcHJvZmlsZSBzdWNjZXNzZnVsbHkgZGlzY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJkaXNjb25uZWN0KCk6ICIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0KLSAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5ESVNDT05ORUNUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpIHsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHNtIDogbVN0YXRlTWFjaGluZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc20uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChzbS5nZXREZXZpY2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzOiAiICsgZGV2aWNlcyk7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgY2FuIGNvbm5lY3QgdG8gYSBwZWVyIGRldmljZS4KLSAgICAgKiBUaGUgY2hlY2sgY29uc2lkZXJzIGEgbnVtYmVyIG9mIGZhY3RvcnMgZHVyaW5nIHRoZSBldmFsdWF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgcGVlciBkZXZpY2UgdG8gY29ubmVjdCB0bwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGFsbG93ZWQsIG90aGVyd2lzZSBmYWxzZQotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIG9rVG9Db25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBpbmNvbWluZyBjb25uZWN0aW9uIGluIFF1aWV0IG1vZGUuCi0gICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UuaXNRdWlldE1vZGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm9rVG9Db25uZWN0OiBjYW5ub3QgY29ubmVjdCB0byAiICsgZGV2aWNlICsgIiA6IHF1aWV0IG1vZGUgZW5hYmxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGNvbm5lY3Rpb24gcG9saWN5IGFuZCBhY2NlcHQgb3IgcmVqZWN0IHRoZSBjb25uZWN0aW9uLgotICAgICAgICBpbnQgY29ubmVjdGlvblBvbGljeSA9IGdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKTsKLSAgICAgICAgaW50IGJvbmRTdGF0ZSA9IG1BZGFwdGVyU2VydmljZS5nZXRCb25kU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgLy8gQWxsb3cgdGhpcyBjb25uZWN0aW9uIG9ubHkgaWYgdGhlIGRldmljZSBpcyBib25kZWQuIEFueSBhdHRlbXB0IHRvIGNvbm5lY3Qgd2hpbGUKLSAgICAgICAgLy8gYm9uZGluZyB3b3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGFuIHVuYXV0aG9yaXplZCBjb25uZWN0aW9uLgotICAgICAgICBpZiAoYm9uZFN0YXRlICE9IEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib2tUb0Nvbm5lY3Q6IHJldHVybiBmYWxzZSwgYm9uZFN0YXRlPSIgKyBib25kU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rpb25Qb2xpY3kgIT0gQmx1ZXRvb3RoUHJvZmlsZS5DT05ORUNUSU9OX1BPTElDWV9VTktOT1dOCi0gICAgICAgICAgICAgICAgJiYgY29ubmVjdGlvblBvbGljeSAhPSBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmVqZWN0IHRoZSBjb25uZWN0aW9uIGlmIGNvbm5lY3Rpb25Qb2xpY3kgaXMgbm90IHZhbGlkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAib2tUb0Nvbm5lY3Q6IHJldHVybiBmYWxzZSwgY29ubmVjdGlvblBvbGljeT0iICsgY29ubmVjdGlvblBvbGljeSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW50W10gc3RhdGVzKSB7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBpZiAoc3RhdGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VzOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJsdWV0b290aERldmljZVtdIGJvbmRlZERldmljZXMgPSBtQWRhcHRlclNlcnZpY2UuZ2V0Qm9uZGVkRGV2aWNlcygpOwotICAgICAgICBpZiAoYm9uZGVkRGV2aWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlczsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBib25kZWREZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUGFyY2VsVXVpZFtdIGZlYXR1cmVVdWlkcyA9IGRldmljZS5nZXRVdWlkcygpOwotICAgICAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyhmZWF0dXJlVXVpZHMsIG5ldyBQYXJjZWxVdWlkKEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuQkFTU19VVUlEKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBjb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHNtID0gZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uU3RhdGUgPSBzbS5nZXRDb25uZWN0aW9uU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGF0ZSA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRldmljZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coImdldENvbm5lY3Rpb25TdGF0ZSByZXR1cm5zIFNUQVRFX0RJU0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc20uZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb25Qb2xpY3kgb2YgdGhlIEhlYXJpbmcgQWlkIHByb2ZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHBhcmFtIGNvbm5lY3Rpb25Qb2xpY3kgdGhlIGNvbm5lY3Rpb24gcG9saWN5IG9mIHRoZSBwcm9maWxlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3kpIHsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTYXZlZCBjb25uZWN0aW9uUG9saWN5ICIgKyBkZXZpY2UgKyAiID0gIiArIGNvbm5lY3Rpb25Qb2xpY3kpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc2V0U3VjY2Vzc2Z1bGx5OwotICAgICAgICBzZXRTdWNjZXNzZnVsbHkgPSBtQWRhcHRlclNlcnZpY2UuZ2V0RGF0YWJhc2UoKQotICAgICAgICAgICAgICAgIC5zZXRQcm9maWxlQ29ubmVjdGlvblBvbGljeShkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQkNfUFJPRklMRSwgY29ubmVjdGlvblBvbGljeSk7Ci0gICAgICAgIGlmIChzZXRTdWNjZXNzZnVsbHkgJiYgY29ubmVjdGlvblBvbGljeSA9PSBCbHVldG9vdGhQcm9maWxlLkNPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIGNvbm5lY3QoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXRTdWNjZXNzZnVsbHkKLSAgICAgICAgICAgICAgICAmJiBjb25uZWN0aW9uUG9saWN5ID09IEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfRk9SQklEREVOKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNldFN1Y2Nlc3NmdWxseTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbm5lY3Rpb24gcG9saWN5IG9mIHRoZSBwcm9maWxlLgotICAgICAqCi0gICAgICogPHA+IFRoZSBjb25uZWN0aW9uIHBvbGljeSBjYW4gYmUgYW55IG9mOgotICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0NPTk5FQ1RJT05fUE9MSUNZX0FMTE9XRUR9LAotICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0NPTk5FQ1RJT05fUE9MSUNZX0ZPUkJJRERFTn0sCi0gICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjQ09OTkVDVElPTl9QT0xJQ1lfVU5LTk9XTn0KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgQmx1ZXRvb3RoIGRldmljZQotICAgICAqIEByZXR1cm4gY29ubmVjdGlvbiBwb2xpY3kgb2YgdGhlIGRldmljZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uUG9saWN5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLQotICAgICAgICByZXR1cm4gbUFkYXB0ZXJTZXJ2aWNlLmdldERhdGFiYXNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJvZmlsZUNvbm5lY3Rpb25Qb2xpY3koZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkJDX1BST0ZJTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKEJsdWV0b290aERldmljZSBkZXZpY2UsIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYkNoYW5uZWxzLCBpbnQgc3RhdHVzKXsKLSAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzID0gbUFwcENhbGxiYWNrTWFwLmdldChkZXZpY2UpOwotICAgICAgICBpZiAoY2JzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm5vIEFwcCBjYWxsYmFjayBmb3IgdGhpcyBkZXZpY2UiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayBjYiA6IGNicykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIGNiLm9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VTZWxlY3RlZChkZXZpY2UsIHN0YXR1cywgYkNoYW5uZWxzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSAgewotICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgc2VuZEJyb2FkY2FzdFNvdXJjZVNlbGVjdGVkQ2FsbGJhY2siKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRBZGRCcm9hZGNhc3RTb3VyY2VDYWxsYmFjayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBieXRlIHNyY0lkLCBpbnQgc3RhdHVzKXsKLSAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzID0gbUFwcENhbGxiYWNrTWFwLmdldChkZXZpY2UpOwotICAgICAgICBpZiAoY2JzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm5vIEFwcCBjYWxsYmFjayBmb3IgdGhpcyBkZXZpY2UiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayBjYiA6IGNicykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIGNiLm9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VBZGRlZChkZXZpY2UsIHNyY0lkLCBzdGF0dXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpICB7Ci0gICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRVcGRhdGVCcm9hZGNhc3RTb3VyY2VDYWxsYmFjayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBieXRlIHNvdXJjZUlkLCBpbnQgc3RhdHVzKXsKLSAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzID0gbUFwcENhbGxiYWNrTWFwLmdldChkZXZpY2UpOwotICAgICAgICBpZiAoY2JzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm5vIEFwcCBjYWxsYmFjayBmb3IgdGhpcyBkZXZpY2UiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiIDogY2JzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNiLm9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VVcGRhdGVkKGRldmljZSwgc291cmNlSWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlVXBkYXRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNlbmRSZW1vdmVCcm9hZGNhc3RTb3VyY2VDYWxsYmFjayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBieXRlIHNvdXJjZUlkLCBpbnQgc3RhdHVzKXsKLSAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzID0gbUFwcENhbGxiYWNrTWFwLmdldChkZXZpY2UpOwotICAgICAgICBpZiAoY2JzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm5vIEFwcCBjYWxsYmFjayBmb3IgdGhpcyBkZXZpY2UiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiIDogY2JzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNiLm9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VSZW1vdmVkKGRldmljZSwgc291cmNlSWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlUmVtb3ZlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNlbmRTZXRCcm9hZGNhc3RQSU51cGRhdGVkQ2FsbGJhY2soQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYnl0ZSBzb3VyY2VJZCwgaW50IHN0YXR1cyl7Ci0gICAgICAgIEFycmF5TGlzdDxJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s+IGNicyA9IG1BcHBDYWxsYmFja01hcC5nZXQoZGV2aWNlKTsKLSAgICAgICAgaWYgKGNicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJubyBBcHAgY2FsbGJhY2sgZm9yIHRoaXMgZGV2aWNlIiArIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayBjYiA6IGNicykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjYi5vbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQoZGV2aWNlLCBzb3VyY2VJZCwgc3RhdHVzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSAgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIG9uQmxlQnJvYWRjYXN0UGluVXBkYXRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJBcHBDYWxsYmFjayAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiKSB7Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAicmVnaXN0ZXJBcHBDYWxsYmFjayIgKyBkZXZpY2UpOwotCi0gICAgICAgIEFycmF5TGlzdDxJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s+IGNicyA9IG1BcHBDYWxsYmFja01hcC5nZXQoZGV2aWNlKTsKLSAgICAgICAgaWYgKGNicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJyZWdpc3RlckFwcENhbGxiYWNrOiBlbnRyeSBleGlzdHMiKTsKLSAgICAgICAgICAgIGNicyA9IG5ldyBBcnJheUxpc3Q8SUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrPigpOwotICAgICAgICB9Ci0gICAgICAgIGNicy5hZGQoY2IpOwotICAgICAgICBtQXBwQ2FsbGJhY2tNYXAucHV0KGRldmljZSwgY2JzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJBcHBDYWxsYmFjayAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiKSB7Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAidW5yZWdpc3RlckFwcENhbGxiYWNrIiArIGRldmljZSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzID0gbUFwcENhbGxiYWNrTWFwLmdldChkZXZpY2UpOwotICAgICAgICBpZiAoY2JzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgInVucmVnaXN0ZXJBcHBDYWxsYmFjazogY2IgbGlzdCBpcyBudWxsIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGJvb2xlYW4gcmV0ID0gY2JzLnJlbW92ZShjYik7Ci0gICAgICAgICAgIExvZy5pKFRBRywgInVucmVnaXN0ZXJBcHBDYWxsYmFjazogcmV0IHZhbHVlIG9mIHJlbW92YWwgZnJvbSBsaXN0OiIgKyByZXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIG1BcHBDYWxsYmFja01hcC5yZXBsYWNlKGRldmljZSwgY2JzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgInVucmVnaXN0ZXJBcHBDYWxsYmFjazogUmVtb3ZlIHRoZSBjbXBsZXRlIGVudHJ5Iik7Ci0gICAgICAgICAgICBtQXBwQ2FsbGJhY2tNYXAucmVtb3ZlKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMgKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLQotICAgICAgICBMb2cuaShUQUcsICJzZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzIG9uIGJlaGFsZiBvZiIgKyBkZXZpY2UpOwotICAgICAgICBBcnJheUxpc3Q8SUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrPiBjYnMgPSBtQXBwQ2FsbGJhY2tNYXAuZ2V0KGRldmljZSk7Ci0gICAgICAgIGlmIChjYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAibm8gQXBwIGNhbGxiYWNrIGZvciB0aGlzIGRldmljZSIgKyBkZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGlmIChiYXNzVXRpbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0ID0gYmFzc1V0aWxzLnNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoZGV2aWNlLCBjYnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyA6TnVsbCBCYXNzIFV0aWwgSGFuZGxlIiArIGRldmljZSk7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BTZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAic3RvcHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMgb24gYmVoYWxmIG9mIiArIGRldmljZSk7Ci0gICAgICAgIEFycmF5TGlzdDxJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s+IGNicyA9IG1BcHBDYWxsYmFja01hcC5nZXQoZGV2aWNlKTsKLSAgICAgICAgaWYgKGNicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJubyBBcHAgY2FsbGJhY2sgZm9yIHRoaXMgZGV2aWNlIiArIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGJhc3NVdGlscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSBiYXNzVXRpbHMuc3RvcFNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoZGV2aWNlLCBjYnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RvcHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMgOk51bGwgQmFzcyBVdGlsIEhhbmRsZSIgKyBkZXZpY2UpOwotICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RCcm9hZGNhc3RTb3VyY2UgKEJsdWV0b290aERldmljZSBkZXZpY2UsIFNjYW5SZXN1bHQgc2NhblJlcywgYm9vbGVhbiBpc0dyb3VwT3AsIGJvb2xlYW4gYXV0bykgewotCi0gICAgICAgIExvZy5pKFRBRywgInNlbGVjdEJyb2FkY2FzdFNvdXJjZSBmb3IgIiArIGRldmljZSArICJpc0dyb3VwT3A6IiArIGlzR3JvdXBPcCk7Ci0gICAgICAgIExvZy5pKFRBRywgIlNjYW5SZXN1bHQgIiArIHNjYW5SZXMpOwotCi0gICAgICAgIGlmIChzY2FuUmVzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNlbGVjdEJyb2FkY2FzdFNvdXJjZTogbnVsbCBTY2FuIHJlc3VsdHMiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbGlzdE9mRGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICBsaXN0T2ZEZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICBpZiAoaXNSb29tRm9yQnJvYWRjYXN0U291cmNlQWRkaXRpb24obGlzdE9mRGV2aWNlcykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKGRldmljZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19OT19FTVBUWV9TTE9UKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvL2R1bW15IEJsZVNvdXJjZUluZm8gZnJvbSBzY2FuUmVzCi0gICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc2NhblJlc1NJID0gbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gKHNjYW5SZXMuZ2V0RGV2aWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLklOVkFMSURfU1JDX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpc2NhblJlcy5nZXRBZHZlcnRpc2luZ1NpZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RFUl9JRF9JTlZBTElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlcy5nZXRBZGRyZXNzVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfSU5WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfTk9UX1NZTkNIUk9OSVpFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgaWYgKGlzVmFsaWRCcm9hZGNhc3RTb3VyY2VBZGRpdGlvbihsaXN0T2ZEZXZpY2VzLCBzY2FuUmVzU0kpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBzZW5kQnJvYWRjYXN0U291cmNlU2VsZWN0ZWRDYWxsYmFjayhkZXZpY2UsCi0gICAgICAgICAgICAgICAgbnVsbCwgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfRFVQTElDQVRFX0FERElUSU9OKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdGFydFNjYW5PZmZsb2FkSW50ZXJuYWwoZGV2aWNlLCBpc0dyb3VwT3ApOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHNtID0gZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVzc2FnZSBtID0gc20ub2J0YWluTWVzc2FnZShCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLlNFTEVDVF9CQ0FTVF9TT1VSQ0UpOwotICAgICAgICAgICAgbS5vYmogPSBzY2FuUmVzOwotICAgICAgICAgICAgaWYgKGF1dG8pIHsKLSAgICAgICAgICAgICAgICBtLmFyZzEgPSBzbS5BVVRPOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtLmFyZzEgPSBzbS5VU0VSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzR3JvdXBPcCkgewotICAgICAgICAgICAgICAgIG0uYXJnMiA9IHNtLkdST1VQX09QOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtLmFyZzIgPSBzbS5OT05fR1JPVVBfT1A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5T3BlcmF0aW9uQ29tcGxldGlvbihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcGVuZGluZ09wZXJhdGlvbikgewotICAgICAgICBsb2coIm5vdGlmeU9wZXJhdGlvbkNvbXBsZXRpb246ICIgKyBkZXZpY2UgKyAicGVuZGluZ09wZXJhdGlvbjogIiArCi0gICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLm1lc3NhZ2VXaGF0VG9TdHJpbmcocGVuZGluZ09wZXJhdGlvbikpOwotICAgICAgICAvL3N5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocGVuZGluZ09wZXJhdGlvbikgewotICAgICAgICAgICAgICAgIGNhc2UgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5TVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLlNUT1BfU0NBTl9PRkZMT0FEOgotICAgICAgICAgICAgICAgIGNhc2UgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5BRERfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5VUERBVEVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5SRU1PVkVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5TRVRfQkNBU1RfQ09ERToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1RdWV1ZWRPcHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIm5vdCBhIHF1ZXVlZCBvcCwgSW50ZXJuYWwgb3AiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJub3RpZnlPcGVyYXRpb25Db21wbGV0aW9uOiB1bmhhbmRsZWQgY2FzZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAvL30KLSAgICAgICAgICBpZiAobVF1ZXVlZE9wcyA9PSAwKSB7Ci0gICAgICAgICAgICAgIGxvZygibm90aWZ5T3BlcmF0aW9uQ29tcGxldGlvbjogYWxsIG9wcyBhcmUgZG9uZSEiKTsKLSAgICAgICAgICAgICAgLy90cmlnZ2VyIHVubG9jayB3aXRoIGxhc3QgZGV2aWNlCi0gICAgICAgICAgICAgIHRyaWdnZXJVbmxvY2tmb3JDU2V0KGRldmljZSk7Ci0gICAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0U2Nhbk9mZmxvYWQgKEJsdWV0b290aERldmljZSBtYXN0ZXJEZXZpY2UsIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzKSB7Ci0KLSAgICAgICAgTG9nLmkoVEFHLCAic3RhcnRTY2FuT2ZmbG9hZCBmb3IgIiArIGRldmljZXMpOwotICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXYgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldik7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLlNUQVJUX1NDQU5fT0ZGTE9BRCk7Ci0gICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BTY2FuT2ZmbG9hZCAoQmx1ZXRvb3RoRGV2aWNlIG1hc3RlckRldmljZSwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMpIHsKLQotICAgICAgICBMb2cuaShUQUcsICJzdG9wU2Nhbk9mZmxvYWQgZm9yICIgKyBkZXZpY2VzKTsKLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXYpOwotICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5TVE9QX1NDQU5fT0ZGTE9BRCk7Ci0gICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsQnJvYWRjYXN0aW5nKCkgewotICAgICAgICByZXR1cm4gYmFzc1V0aWxzLmlzTG9jYWxMRUF1ZGlvQnJvYWRjYXN0aW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRCcm9hZGNhc3RTb3VyY2VBZGRpdGlvbihMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbykgewotICAgICAgICBib29sZWFuIHJldCA9IHRydWU7Ci0KLSAgICAgICAgLy9ydW4gdGhyb3VnaCBhbGwgdGhlIGRldmljZSwgaWYgaXQgaXMgbm90IHZhbGlkCi0gICAgICAgIC8vdG8gZXZlbiBvbmUgZGV2aWNlIHRvIGFkZCB0aGlzIHNvdXJjZSwgcmV0dXJuIGZhaWx1cmUKLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBjdXJyZW50U291cmNlSW5mb3MgPQotICAgICAgICAgICAgICAgIGdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKGRldik7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFNvdXJjZUluZm9zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coImN1cnJlbnRTb3VyY2VJbmZvcyBpcyBudWxsIGZvciAiICsgZGV2KTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjdXJyZW50U291cmNlSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjSW5mby5tYXRjaGVzKGN1cnJlbnRTb3VyY2VJbmZvcy5nZXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiaXNWYWxpZEJyb2FkY2FzdFNvdXJjZUFkZGl0aW9uOiBmYWlscyBmb3I6ICIgKyBkZXYgKyAiJnNyY0luZm8iICsgc3JjSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKCJpc1ZhbGlkQnJvYWRjYXN0U291cmNlSW5mbyByZXR1cm5zOiAiICsgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSb29tRm9yQnJvYWRjYXN0U291cmNlQWRkaXRpb24oTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Jvb21BdmFpbCA9IGZhbHNlOwotCi0gICAgICAgIC8vcnVuIHRocm91Z2ggYWxsIHRoZSBkZXZpY2UsIGlmIGl0IGlzIG5vdCB2YWxpZAotICAgICAgICAvL3RvIGV2ZW4gb25lIGRldmljZSB0byBhZGQgdGhpcyBzb3VyY2UsIHJldHVybiBmYWlsdXJlCi0gICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldiA6IGRldmljZXMpIHsKLSAgICAgICAgICAgIGlzUm9vbUF2YWlsID0gZmFsc2U7Ci0gICAgICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+IGN1cnJlbnRTb3VyY2VJbmZvcyA9Ci0gICAgICAgICAgICAgICAgZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24oZGV2KTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjdXJyZW50U291cmNlSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8gPSBjdXJyZW50U291cmNlSW5mb3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChzcmNJbmZvLmlzRW1wdHlFbnRyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgaXNSb29tQXZhaWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc1Jvb21BdmFpbCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImlzUm9vbUZvckJyb2FkY2FzdFNvdXJjZUFkZGl0aW9uOiBmYWlscyBmb3I6ICIgKyBkZXYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKCJpc1Jvb21Gb3JCcm9hZGNhc3RTb3VyY2VBZGRpdGlvbiByZXR1cm5zOiAiICsgaXNSb29tQXZhaWwpOwotICAgICAgICByZXR1cm4gaXNSb29tQXZhaWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEJyb2FkY2FzdFNvdXJjZSAoQmx1ZXRvb3RoRGV2aWNlIG1hc3RlckRldmljZSwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLQotICAgICAgICBMb2cuaShUQUcsICJhZGRCcm9hZGNhc3RTb3VyY2UgZm9yICIgKyBkZXZpY2VzICsKLSAgICAgICAgICAgICAgICAgICAiU291cmNlSW5mbyAiICsgc3JjSW5mbyk7Ci0gICAgICAgIGlmIChzcmNJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImFkZEJyb2FkY2FzdFNvdXJjZTogbnVsbCBTcmNJbmZvIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUm9vbUZvckJyb2FkY2FzdFNvdXJjZUFkZGl0aW9uKGRldmljZXMpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBzZW5kQWRkQnJvYWRjYXN0U291cmNlQ2FsbGJhY2sobWFzdGVyRGV2aWNlLAotICAgICAgICAgICAgICAgIEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuSU5WQUxJRF9TUkNfSUQsIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX05PX0VNUFRZX1NMT1QpOwotICAgICAgICAgICAgdHJpZ2dlclVubG9ja2ZvckNTZXQobWFzdGVyRGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ZhbGlkQnJvYWRjYXN0U291cmNlQWRkaXRpb24oZGV2aWNlcywgc3JjSW5mbykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHNlbmRBZGRCcm9hZGNhc3RTb3VyY2VDYWxsYmFjayhtYXN0ZXJEZXZpY2UsCi0gICAgICAgICAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5JTlZBTElEX1NSQ19JRCwgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfRFVQTElDQVRFX0FERElUSU9OKTsKLSAgICAgICAgICAgIHRyaWdnZXJVbmxvY2tmb3JDU2V0KG1hc3RlckRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXYpOwotICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiYWRkQnJvYWRjYXN0U291cmNlOiBkZXZpY2Ugc2VlbSB0byBiZSBub3QgYXZhaWFibGUsIHByb2NlZWQiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHN0YXRlTWFjaGluZS5vYnRhaW5NZXNzYWdlKEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuQUREX0JDQVNUX1NPVVJDRSk7Ci0gICAgICAgICAgICBtLm9iaiA9IHNyY0luZm87Ci0gICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlIGdldFNyY0lkRm9yQ1NNZW1iZXIoQmx1ZXRvb3RoRGV2aWNlIG1hc3RlckRldmljZSwgQmx1ZXRvb3RoRGV2aWNlIG1lbWJlckRldmljZSwgYnl0ZSBtYXN0ZXJTcmNJZCkgewotICAgICAgICBieXRlIHRhcmdldFNyY0lkID0gLTE7Ci0gICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gbWFzdGVyU3JjSW5mb3MgPSBnZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbihtYXN0ZXJEZXZpY2UpOwotICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+IG1lbWJlclNyY0luZm9zID0gZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24obWVtYmVyRGV2aWNlKTsKLSAgICAgICAgaWYgKG1hc3RlclNyY0luZm9zID09IG51bGwgfHwgbWFzdGVyU3JjSW5mb3Muc2l6ZSgpID09IDAgfHwKLSAgICAgICAgICAgIG1lbWJlclNyY0luZm9zID09IG51bGwgfHwgbWVtYmVyU3JjSW5mb3Muc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm1hc3RlciBvciBtZW1iZXIgc291cmNlIEluZm9zIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRTcmNJZDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFzdGVyRGV2aWNlLmVxdWFscyhtZW1iZXJEZXZpY2UpKSB7Ci0gICAgICAgICAgICBsb2coIm1hc3RlcjogIiArIG1hc3RlckRldmljZSArICJtZW1iZXI6bWVtYmVyRGV2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm4gbWFzdGVyU3JjSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIG1hc3RlclNyY0RldmljZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtYXN0ZXJTcmNJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1hc3RlclNyY0luZm9zLmdldChpKS5nZXRTb3VyY2VJZCgpID09IG1hc3RlclNyY0lkKSB7Ci0gICAgICAgICAgICAgICAgbWFzdGVyU3JjRGV2aWNlID0gbWFzdGVyU3JjSW5mb3MuZ2V0KGkpLmdldFNvdXJjZURldmljZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXN0ZXJTcmNEZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gbWF0Y2hpbmcgU1JDIElkIGZvciB0aGUgb3BlcmF0aW9uIGluIG1hc3RlckRldmljZSIpOwotICAgICAgICAgICAgcmV0dXJuIHRhcmdldFNyY0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9sb29rIGZvciB0aGlzIHNyY0FkZHJlc3MgaW4gbWVtYmVyIHRvIHJldHJpZXZlIHRoZSBzcmNJZAotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVyU3JjSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtYXN0ZXJTcmNEZXZpY2UuZXF1YWxzKG1lbWJlclNyY0luZm9zLmdldChpKS5nZXRTb3VyY2VEZXZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRTcmNJZCA9IG1hc3RlclNyY0luZm9zLmdldChpKS5nZXRTb3VyY2VJZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXRTcmNJZCA9PSAtMSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gbWF0Y2hpbmcgU1JDIEFkZHJlc3MgaW4gdGhlIG1lbWJlciBTcmMgSW5mb3MiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0U3JjSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVwZGF0ZUJyb2FkY2FzdFNvdXJjZSAoQmx1ZXRvb3RoRGV2aWNlIG1hc3RlckRldmljZSwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotCi0gICAgICAgICBpbnQgc3RhdHVzID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfSUQ7Ci0gICAgICAgICBMb2cuaShUQUcsICJ1cGRhdGVCcm9hZGNhc3RTb3VyY2UgZm9yICIgKyBkZXZpY2VzICsKLSAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJEZXZpY2UgIiArIG1hc3RlckRldmljZSArCi0gICAgICAgICAgICAgICAgICAgICAiU291cmNlSW5mbyAiICsgc3JjSW5mbyk7Ci0KLSAgICAgICAgIGlmIChzcmNJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICBMb2cuZShUQUcsICJ1cGRhdGVCcm9hZGNhc3RTb3VyY2U6IG51bGwgU3JjSW5mbyIpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgIGlmIChnZXRTcmNJZEZvckNTTWVtYmVyKG1hc3RlckRldmljZSwgZGV2LCBzcmNJbmZvLmdldFNvdXJjZUlkKCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9HUk9VUF9PUDsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfSUQ7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBzZW5kUmVtb3ZlQnJvYWRjYXN0U291cmNlQ2FsbGJhY2sobWFzdGVyRGV2aWNlLCBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLklOVkFMSURfU1JDX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgdHJpZ2dlclVubG9ja2ZvckNTZXQobWFzdGVyRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldiA6IGRldmljZXMpIHsKLSAgICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldik7Ci0gICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgIExvZy53KFRBRywgInVwZGF0ZUJyb2FkY2FzdFNvdXJjZTogRGV2aWNlIHNlZW0gdG8gYmUgbm90IGF2YWlhYmxlIik7Ci0gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBieXRlIHRhcmdldFNyY0lkID0gZ2V0U3JjSWRGb3JDU01lbWJlcihtYXN0ZXJEZXZpY2UsIGRldiwgc3JjSW5mby5nZXRTb3VyY2VJZCgpKTsKLSAgICAgICAgICAgICBzcmNJbmZvLnNldFNvdXJjZUlkKHRhcmdldFNyY0lkKTsKLQotICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHN0YXRlTWFjaGluZS5vYnRhaW5NZXNzYWdlKEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuVVBEQVRFX0JDQVNUX1NPVVJDRSk7Ci0gICAgICAgICAgICAgbS5vYmogPSBzcmNJbmZvOwotICAgICAgICAgICAgIG0uYXJnMSA9IHN0YXRlTWFjaGluZS5VU0VSOwotICAgICAgICAgICAgIHN0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyArIDE7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldEJyb2FkY2FzdENvZGUgIChCbHVldG9vdGhEZXZpY2UgbWFzdGVyRGV2aWNlLCBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLQotICAgICAgICBpbnQgc3RhdHVzID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfSUQ7Ci0gICAgICAgIExvZy5pKFRBRywgInNldEJyb2FkY2FzdENvZGUgZm9yICIgKyBkZXZpY2VzICsKLSAgICAgICAgICAgICAgICAgICAibWFzdGVyRGV2aWNlIiArIG1hc3RlckRldmljZSArCi0gICAgICAgICAgICAgICAgICAgIkJyb2FkY2FzdCBQSU4iICsgc3JjSW5mby5nZXRCcm9hZGNhc3RDb2RlKCkpOwotCi0gICAgICAgIGlmIChzcmNJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNldEJyb2FkY2FzdENvZGU6IG51bGwgU3JjSW5mbyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGdldFNyY0lkRm9yQ1NNZW1iZXIobWFzdGVyRGV2aWNlLCBkZXYsIHNyY0luZm8uZ2V0U291cmNlSWQoKSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9HUk9VUF9PUDsKLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX0lOVkFMSURfU09VUkNFX0lEOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIHNlbmRSZW1vdmVCcm9hZGNhc3RTb3VyY2VDYWxsYmFjayhtYXN0ZXJEZXZpY2UsIEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuSU5WQUxJRF9TUkNfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgdHJpZ2dlclVubG9ja2ZvckNTZXQobWFzdGVyRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXYpOwotICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldEJyb2FkY2FzdENvZGU6IERldmljZSBzZWVtIHRvIGJlIG5vdCBhdmFpYWJsZSIpOwotICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZSB0YXJnZXRTcmNJZCA9IGdldFNyY0lkRm9yQ1NNZW1iZXIobWFzdGVyRGV2aWNlLCBkZXYsIHNyY0luZm8uZ2V0U291cmNlSWQoKSk7Ci0gICAgICAgICAgICBzcmNJbmZvLnNldFNvdXJjZUlkKHRhcmdldFNyY0lkKTsKLQotICAgICAgICAgICAgTWVzc2FnZSBtID0gc3RhdGVNYWNoaW5lLm9idGFpbk1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5TRVRfQkNBU1RfQ09ERSk7Ci0gICAgICAgICAgICBtLm9iaiA9IHNyY0luZm87Ci0gICAgICAgICAgICBtLmFyZzEgPSBzdGF0ZU1hY2hpbmUuRlJFU0g7Ci0gICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlQnJvYWRjYXN0U291cmNlIChCbHVldG9vdGhEZXZpY2UgbWFzdGVyRGV2aWNlLCBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgc291cmNlSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotCi0gICAgICAgIGludCBzdGF0dXMgPSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19JTlZBTElEX1NPVVJDRV9JRDsKLSAgICAgICAgTG9nLmkoVEFHLCAgInJlbW92ZUJyb2FkY2FzdFNvdXJjZSBmb3IgIiArIGRldmljZXMgKwotICAgICAgICAgICAgICAgICAgICJtYXN0ZXJEZXZpY2UgIiArIG1hc3RlckRldmljZSArCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdmVCcm9hZGNhc3RTb3VyY2U6IHNvdXJjZUlkOiIgKyBzb3VyY2VJZCk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZUlkID09IEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuSU5WQUxJRF9TUkNfSUQpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInJlbW92ZUJyb2FkY2FzdFNvdXJjZTogSW52YWxpZCBzb3VyY2UgSWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2IDogZGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGdldFNyY0lkRm9yQ1NNZW1iZXIobWFzdGVyRGV2aWNlLCBkZXYsIHNvdXJjZUlkKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19JTlZBTElEX0dST1VQX09QOwotICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfSUQ7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgc2VuZFJlbW92ZUJyb2FkY2FzdFNvdXJjZUNhbGxiYWNrKG1hc3RlckRldmljZSwgQmFzc0NsaWVudFN0YXRlTWFjaGluZS5JTlZBTElEX1NSQ19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICAgICAgICAgICB0cmlnZ2VyVW5sb2NrZm9yQ1NldChtYXN0ZXJEZXZpY2UpOwotICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXYgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldik7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRCcm9hZGNhc3RDb2RlOiBEZXZpY2Ugc2VlbSB0byBiZSBub3QgYXZhaWFibGUiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVzc2FnZSBtID0gc3RhdGVNYWNoaW5lLm9idGFpbk1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5SRU1PVkVfQkNBU1RfU09VUkNFKTsKLSAgICAgICAgICAgIG0uYXJnMSA9IGdldFNyY0lkRm9yQ1NNZW1iZXIobWFzdGVyRGV2aWNlLCBkZXYsIHNvdXJjZUlkKTsKLSAgICAgICAgICAgIGxvZygicmVtb3ZlQnJvYWRjYXN0U291cmNlOiBzZW5kIG1lc3NhZ2UgdG8gU00gIiArIGRldik7Ci0gICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICBtUXVldWVkT3BzID0gbVF1ZXVlZE9wcyArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIHRyaWdnZXJVbmxvY2tmb3JDU2V0IChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIC8vZ2V0IHNldElkCi0gICAgICAgIGludCBzZXRJZCA9IGdldENzZXRJZChkZXZpY2UpOwotICAgICAgICBCYXNzQ3NldE1hbmFnZXIgc2V0TWdyID0gZ2V0T3JDcmVhdGVDU2V0TWFuYWdlcihzZXRJZCwgZGV2aWNlKTsKLSAgICAgICAgaWYgKHNldE1nciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJ0cmlnZ2VyVW5sb2NrZm9yQ1NldDogc2V0TWdyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvL1NlbmRpbmcgVW5Mb2NrIHRvCi0gICAgICAgIGxvZyAoInNlbmRpbmcgVW5sb2NrIHRvIGRldmljZToiICsgZGV2aWNlKTsKLSAgICAgICAgTWVzc2FnZSBtID0gc2V0TWdyLm9idGFpbk1lc3NhZ2UoQmFzc0NzZXRNYW5hZ2VyLlVOTE9DSyk7Ci0gICAgICAgIHNldE1nci5zZW5kTWVzc2FnZShtKTsKLSAgICB9Ci0gICAgcHVibGljIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24gKEJsdWV0b290aERldmljZSBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICBMb2cuaShUQUcsICJnZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbiBmb3IgIiArIGRldmljZSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzbS5nZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJnZXRPckNyZWF0ZVN0YXRlTWFjaGluZSBmYWlsZWQ6IGRldmljZSBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhdGUgbWFjaGluZXMgdG8gYXZvaWQgRG9TIGF0dGFjawotICAgICAgICAgICAgaWYgKG1TdGF0ZU1hY2hpbmVzLnNpemUoKSA+PSBNQVhfQkFTU19DTElFTlRfU1RBVEVfTUFDSElORVMpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJNYXhpbXVtIG51bWJlciBvZiBCYXNzY2xpZW50IHN0YXRlIG1hY2hpbmVzIHJlYWNoZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgTUFYX0JBU1NfQ0xJRU5UX1NUQVRFX01BQ0hJTkVTKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDcmVhdGluZyBhIG5ldyBzdGF0ZSBtYWNoaW5lIGZvciAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtID0gQmFzc0NsaWVudFN0YXRlTWFjaGluZS5tYWtlKGRldmljZSwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlTWFjaGluZXNUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICAgICAgbVN0YXRlTWFjaGluZXMucHV0KGRldmljZSwgc20pOwotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCYXNzQ3NldE1hbmFnZXIgZ2V0T3JDcmVhdGVDU2V0TWFuYWdlcihpbnQgc2V0SWQsIEJsdWV0b290aERldmljZSBtYXN0ZXJEZXZpY2UpIHsKLSAgICAgICAgaWYgKHNldElkID09IC0xKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJnZXRPckNyZWF0ZUNTZXRNYW5hZ2VyIGZhaWxlZDogaW52YWxpZCBzZXRJZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU2V0TWFuYWdlcnMpIHsKLSAgICAgICAgICAgIEJhc3NDc2V0TWFuYWdlciBzbSA9IG1TZXRNYW5hZ2Vycy5nZXQoc2V0SWQpOwotICAgICAgICAgICAgbG9nKCJnZXRPckNyZWF0ZUNTZXRNYW5hZ2VyOiBoYXNobWFwIEVudHJ5OiIgKyBzbSk7Ci0gICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIExpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXQgbWFuYWdlciBzdGF0ZSBtYWNoaW5lcwotICAgICAgICAgICAgaWYgKG1TdGF0ZU1hY2hpbmVzLnNpemUoKSA+PSBNQVhfQkFTU19DTElFTlRfQ1NFVF9NRU1CRVJTKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWF4aW11bSBudW1iZXIgb2YgQmFzc2NsaWVudCBjc2V0IG1lbWJlcnMgcmVhY2hlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBNQVhfQkFTU19DTElFTlRfQ1NFVF9NRU1CRVJTKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDcmVhdGluZyBhIG5ldyBzZXQgTWFuYWdlciBmb3IgIiArIHNldElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtID0gQmFzc0NzZXRNYW5hZ2VyLm1ha2Uoc2V0SWQsIG1hc3RlckRldmljZSwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgbVNldE1hbmFnZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICAgICAgbVNldE1hbmFnZXJzLnB1dChzZXRJZCwgc20pOwotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrU3VwcG9ydEF2YWlsYWJsZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNMb2NrQXZhaWwgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3JjZU5vQ3NpcCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5mb3JjZU5vQ3NpcCIsIGZhbHNlKTsKLSAgICAgICAgaWYgKGZvcmNlTm9Dc2lwKSB7Ci0gICAgICAgICAgICBsb2coImZvcmNlTm9Dc2lwIGlzIHNldCIpOwotICAgICAgICAgICAgcmV0dXJuIGlzTG9ja0F2YWlsOwotICAgICAgICB9Ci0gICAgICAgIC8vKl9DU0lQCi0gICAgICAgIGlzTG9ja0F2YWlsID0gbUFkYXB0ZXJTZXJ2aWNlLmlzR3JvdXBFeGNsQWNjZXNzU3VwcG9ydChkZXZpY2UpOwotICAgICAgICAvL19DU0lQKi8KLQotICAgICAgICBsb2coImlzTG9ja1N1cHBvcnRBdmFpbGFibGUgZm9yOiIgKyBkZXZpY2UgKyAicmV0dXJucyAiICsgaXNMb2NrQXZhaWwpOwotICAgICAgICByZXR1cm4gaXNMb2NrQXZhaWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q3NldElkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IHNldElkID0gMTsKLSAgICAgICAgLy8qX0NTSVAKLSAgICAgICAgc2V0SWQgPSBtU2V0Q29vcmRpbmF0b3IuZ2V0UmVtb3RlRGV2aWNlR3JvdXBJZChkZXZpY2UsIENBU19VVUlEKTsKLSAgICAgICAgLy9fQ1NJUCovCi0gICAgICAgIGxvZygiZ2V0Q3NldElkIHJldHVybjoiICsgc2V0SWQpOwotICAgICAgICByZXR1cm4gc2V0SWQ7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BTY2FuT2ZmbG9hZEludGVybmFsIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIGlzR3JvdXBPcCkgewotICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICBsb2coInN0b3BTY2FuT2ZmbG9hZEludGVybmFsOiBkZXZpY2U6ICIgKyBkZXZpY2UKLSAgICAgICAgICAgICArICJpc0dyb3VwT3AiICsgaXNHcm91cE9wKTsKLSAgICAgICAgLyogRXZlbiBJZiB0aGUgcmVxdWVzdCBpcyBmb3IgR3JvdW9vcCwgSWYgTG9jayBzdXBwb3J0IG5vdCBhdmFpYWJsZQotICAgICAgICAgKiBmb3IgdGhhdCBkZXZpY2UsIGdvIGFoZWFkIGFuZCB0cmVhdCB0aGlzIGFzIHNpbmdsZSBkZXZpY2Ugb3BlcmF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoaXNHcm91cE9wICYmIGlzTG9ja1N1cHBvcnRBdmFpbGFibGUoZGV2aWNlKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgc2V0SWQgPSBnZXRDc2V0SWQoZGV2aWNlKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNldE1hbmFnZXJzKSB7Ci0gICAgICAgICAgICAgICAgQmFzc0NzZXRNYW5hZ2VyIHNldE1nciA9IGdldE9yQ3JlYXRlQ1NldE1hbmFnZXIoc2V0SWQsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNldE1nciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBNZXNzYWdlIG0gPSBzZXRNZ3Iub2J0YWluTWVzc2FnZShCYXNzQ3NldE1hbmFnZXIuQkFTU19HUlBfU1RPUF9TQ0FOX09GRkxPQUQpOwotICAgICAgICAgICAgICAgICBzZXRNZ3Iuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICAgICAgIC8vcXVldWUgcmVxIGFuZCByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGxpc3RPZkRldmljZXMgPSBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKTsKLSAgICAgICAgICAgIGxpc3RPZkRldmljZXMuYWRkKGRldmljZSk7Ci0gICAgICAgICAgICByZXQgPSBzdG9wU2Nhbk9mZmxvYWQoZGV2aWNlLCBsaXN0T2ZEZXZpY2VzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U2Nhbk9mZmxvYWRJbnRlcm5hbCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc0dyb3VwT3ApIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgbG9nKCJzdGFydFNjYW5PZmZsb2FkSW50ZXJuYWw6IGRldmljZTogIiArIGRldmljZQotICAgICAgICAgICAgICsgImlzR3JvdXBPcCIgKyBpc0dyb3VwT3ApOwotICAgICAgICAvKiBFdmVuIElmIHRoZSByZXF1ZXN0IGlzIGZvciBHcm91b29wLCBJZiBMb2NrIHN1cHBvcnQgbm90IGF2YWlhYmxlCi0gICAgICAgICAqIGZvciB0aGF0IGRldmljZSwgZ28gYWhlYWQgYW5kIHRyZWF0IHRoaXMgYXMgc2luZ2xlIGRldmljZSBvcGVyYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIGlmIChpc0dyb3VwT3AmJiBpc0xvY2tTdXBwb3J0QXZhaWxhYmxlKGRldmljZSkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgaW50IHNldElkID0gZ2V0Q3NldElkKGRldmljZSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TZXRNYW5hZ2VycykgewotICAgICAgICAgICAgICAgIEJhc3NDc2V0TWFuYWdlciBzZXRNZ3IgPSBnZXRPckNyZWF0ZUNTZXRNYW5hZ2VyKHNldElkLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChzZXRNZ3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gc2V0TWdyLm9idGFpbk1lc3NhZ2UoQmFzc0NzZXRNYW5hZ2VyLkJBU1NfR1JQX1NUQVJUX1NDQU5fT0ZGTE9BRCk7Ci0gICAgICAgICAgICAgICAgIHNldE1nci5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgICAgICAgLy9xdWV1ZSByZXEgYW5kIHJldHVybiB0cnVlCi0gICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBsaXN0T2ZEZXZpY2VzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgICAgIGxpc3RPZkRldmljZXMuYWRkKGRldmljZSk7Ci0gICAgICAgICAgIHJldCA9IHN0YXJ0U2Nhbk9mZmxvYWQoZGV2aWNlLCBsaXN0T2ZEZXZpY2VzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEJyb2FkY2FzdFNvdXJjZUludGVybmFsIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGxvZygiYWRkQnJvYWRjYXN0U291cmNlSW50ZXJuYWw6IGRldmljZTogIiArIGRldmljZQotICAgICAgICAgICAgKyAic3JjSW5mbyIgKyBzcmNJbmZvCi0gICAgICAgICAgICArICJpc0dyb3VwT3AiICsgaXNHcm91cE9wKTsKLSAgICAgICAgLyogRXZlbiBJZiB0aGUgcmVxdWVzdCBpcyBmb3IgR3JvdXAsIElmIExvY2sgc3VwcG9ydCBub3QgYXZhaWFibGUKLSAgICAgICAgICogZm9yIHRoYXQgZGV2aWNlLCBnbyBhaGVhZCBhbmQgdHJlYXQgdGhpcyBhcyBzaW5nbGUgZGV2aWNlIG9wZXJhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGlzR3JvdXBPcCAmJiBpc0xvY2tTdXBwb3J0QXZhaWxhYmxlKGRldmljZSkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgaW50IHNldElkID0gZ2V0Q3NldElkKGRldmljZSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TZXRNYW5hZ2VycykgewotICAgICAgICAgICAgICAgIEJhc3NDc2V0TWFuYWdlciBzZXRNZ3IgPSBnZXRPckNyZWF0ZUNTZXRNYW5hZ2VyKHNldElkLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChzZXRNZ3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gc2V0TWdyLm9idGFpbk1lc3NhZ2UoQmFzc0NzZXRNYW5hZ2VyLkJBU1NfR1JQX0FERF9CQ0FTVF9TT1VSQ0UpOwotICAgICAgICAgICAgICAgICBtLm9iaiA9IHNyY0luZm87Ci0gICAgICAgICAgICAgICAgIHNldE1nci5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgICAgICAgLy9xdWV1ZSByZXEgYW5kIHJldHVybiB0cnVlCi0gICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBsaXN0T2ZEZXZpY2VzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgICAgIGxpc3RPZkRldmljZXMuYWRkKGRldmljZSk7Ci0gICAgICAgICAgIHJldCA9IGFkZEJyb2FkY2FzdFNvdXJjZShkZXZpY2UsIGxpc3RPZkRldmljZXMsIHNyY0luZm8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQnJvYWRjYXN0U291cmNlSW50ZXJuYWwgKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXBPcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgbG9nKCJ1cGRhdGVCcm9hZGNhc3RTb3VyY2VJbnRlcm5hbDogZGV2aWNlOiAiICsgZGV2aWNlCi0gICAgICAgICAgICArICJzcmNJbmZvIiArIHNyY0luZm8KLSAgICAgICAgICAgICsgImlzR3JvdXBPcCIgKyBpc0dyb3VwT3ApOwotICAgICAgICAvKiBFdmVuIElmIHRoZSByZXF1ZXN0IGlzIGZvciBHcm91b29wLCBJZiBMb2NrIHN1cHBvcnQgbm90IGF2YWlhYmxlCi0gICAgICAgICAqIGZvciB0aGF0IGRldmljZSwgZ28gYWhlYWQgYW5kIHRyZWF0IHRoaXMgYXMgc2luZ2xlIGRldmljZSBvcGVyYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIGlmIChpc0dyb3VwT3AgJiYgaXNMb2NrU3VwcG9ydEF2YWlsYWJsZShkZXZpY2UpID09IHRydWUpIHsKLSAgICAgICAgICAgIGludCBzZXRJZCA9IGdldENzZXRJZChkZXZpY2UpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtU2V0TWFuYWdlcnMpIHsKLSAgICAgICAgICAgICAgICBCYXNzQ3NldE1hbmFnZXIgc2V0TWdyID0gZ2V0T3JDcmVhdGVDU2V0TWFuYWdlcihzZXRJZCwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoc2V0TWdyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHNldE1nci5vYnRhaW5NZXNzYWdlKEJhc3NDc2V0TWFuYWdlci5CQVNTX0dSUF9VUERBVEVfQkNBU1RfU09VUkNFKTsKLSAgICAgICAgICAgICAgICAgbS5vYmogPSBzcmNJbmZvOwotICAgICAgICAgICAgICAgICBzZXRNZ3Iuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICAgICAgIC8vcXVldWUgcmVxIGFuZCByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbGlzdE9mRGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICBsaXN0T2ZEZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICAgICByZXQgPSB1cGRhdGVCcm9hZGNhc3RTb3VyY2UoZGV2aWNlLCBsaXN0T2ZEZXZpY2VzLCBzcmNJbmZvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHNldEJyb2FkY2FzdENvZGVJbnRlcm5hbCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0dyb3VwT3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGxvZygic2V0QnJvYWRjYXN0Q29kZUludGVybmFsOiBkZXZpY2U6ICIgKyBkZXZpY2UKLSAgICAgICAgICAgICsgInNyY0luZm8iICsgc3JjSW5mbwotICAgICAgICAgICAgKyAiaXNHcm91cE9wIiArIGlzR3JvdXBPcCk7Ci0gICAgICAgIC8qIEV2ZW4gSWYgdGhlIHJlcXVlc3QgaXMgZm9yIEdyb3Vvb3AsIElmIExvY2sgc3VwcG9ydCBub3QgYXZhaWFibGUKLSAgICAgICAgICogZm9yIHRoYXQgZGV2aWNlLCBnbyBhaGVhZCBhbmQgdHJlYXQgdGhpcyBhcyBzaW5nbGUgZGV2aWNlIG9wZXJhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGlzR3JvdXBPcCAmJiBpc0xvY2tTdXBwb3J0QXZhaWxhYmxlKGRldmljZSkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgaW50IHNldElkID0gZ2V0Q3NldElkKGRldmljZSk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TZXRNYW5hZ2VycykgewotICAgICAgICAgICAgICAgIEJhc3NDc2V0TWFuYWdlciBzZXRNZ3IgPSBnZXRPckNyZWF0ZUNTZXRNYW5hZ2VyKHNldElkLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChzZXRNZ3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gc2V0TWdyLm9idGFpbk1lc3NhZ2UoQmFzc0NzZXRNYW5hZ2VyLkJBU1NfR1JQX1NFVF9CQ0FTVF9DT0RFKTsKLSAgICAgICAgICAgICAgICAgbS5vYmogPSBzcmNJbmZvOwotICAgICAgICAgICAgICAgICBzZXRNZ3Iuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICAgICAgIC8vcXVldWUgcmVxIGFuZCByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbGlzdE9mRGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICBsaXN0T2ZEZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICAgICByZXQgPSBzZXRCcm9hZGNhc3RDb2RlKGRldmljZSwgbGlzdE9mRGV2aWNlcywgc3JjSW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVCcm9hZGNhc3RTb3VyY2VJbnRlcm5hbCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYnl0ZSBzb3VyY2VJZCwgYm9vbGVhbiBpc0dyb3VwT3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgIC8qIEV2ZW4gSWYgdGhlIHJlcXVlc3QgaXMgZm9yIEdyb3Vvb3AsIElmIExvY2sgc3VwcG9ydCBub3QgYXZhaWFibGUKLSAgICAgICAgICAqIGZvciB0aGF0IGRldmljZSwgZ28gYWhlYWQgYW5kIHRyZWF0IHRoaXMgYXMgc2luZ2xlIGRldmljZSBvcGVyYXRpb24KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGlzR3JvdXBPcCAmJiBpc0xvY2tTdXBwb3J0QXZhaWxhYmxlKGRldmljZSkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgIGludCBzZXRJZCA9IGdldENzZXRJZChkZXZpY2UpOwotICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNldE1hbmFnZXJzKSB7Ci0gICAgICAgICAgICAgICAgIEJhc3NDc2V0TWFuYWdlciBzZXRNZ3IgPSBnZXRPckNyZWF0ZUNTZXRNYW5hZ2VyKHNldElkLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgICBpZiAoc2V0TWdyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHNldE1nci5vYnRhaW5NZXNzYWdlKEJhc3NDc2V0TWFuYWdlci5CQVNTX0dSUF9SRU1PVkVfQkNBU1RfU09VUkNFKTsKLSAgICAgICAgICAgICAgICAgIG0uYXJnMSA9IHNvdXJjZUlkOwotICAgICAgICAgICAgICAgICAgc2V0TWdyLnNlbmRNZXNzYWdlKG0pOwotICAgICAgICAgICAgICAgICAgLy9xdWV1ZSByZXEgYW5kIHJldHVybiB0cnVlCi0gICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gbGlzdE9mRGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICAgICAgbGlzdE9mRGV2aWNlcy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgIHJldCA9IHJlbW92ZUJyb2FkY2FzdFNvdXJjZShkZXZpY2UsIGxpc3RPZkRldmljZXMsIHNvdXJjZUlkKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLkJBU1NfREJHKSB7Ci0gICAgICAgICAgIExvZy5kKFRBRywgbXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmRlciBvYmplY3Q6IG11c3QgYmUgYSBzdGF0aWMgY2xhc3Mgb3IgbWVtb3J5IGxlYWsgbWF5IG9jY3VyCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGNsYXNzIEJsdWV0b290aFN5bmNIZWxwZXJCaW5kZXIgZXh0ZW5kcyBJQmx1ZXRvb3RoU3luY0hlbHBlci5TdHViCi0gICAgICAgICAgICBpbXBsZW1lbnRzIElQcm9maWxlU2VydmljZUJpbmRlciB7Ci0gICAgICAgIHByaXZhdGUgQkNTZXJ2aWNlIG1TZXJ2aWNlOwotCi0gICAgICAgIHByaXZhdGUgQkNTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgICAgICBpZiAoIVV0aWxzLmNoZWNrQ2FsbGVySXNTeXN0ZW1PckFjdGl2ZVVzZXIoVEFHKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBtU2VydmljZS5pc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhTeW5jSGVscGVyQmluZGVyKEJDU2VydmljZSBzdmMpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlID0gc3ZjOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgICAgICBtU2VydmljZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5jb25uZWN0KGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5kaXNjb25uZWN0KGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q29ubmVjdGVkRGV2aWNlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKLSAgICAgICAgICAgIEJDU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoc3RhdGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXRDb25uZWN0aW9uUG9saWN5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBjb25uZWN0aW9uUG9saWN5KSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIHJldHVybiBzZXJ2aWNlLnNldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlLCBjb25uZWN0aW9uUG9saWN5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25Qb2xpY3koQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuQ09OTkVDVElPTl9QT0xJQ1lfVU5LTk9XTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldENvbm5lY3Rpb25Qb2xpY3koZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN0b3BTZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5zdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdEJyb2FkY2FzdFNvdXJjZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgU2NhblJlc3VsdCBzY2FuUmVzLCBib29sZWFuIGlzR3JvdXBPcCkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0QnJvYWRjYXN0U291cmNlKGRldmljZSwgc2NhblJlcywgaXNHcm91cE9wLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJBcHBDYWxsYmFjayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgICAgIEJDU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2UucmVnaXN0ZXJBcHBDYWxsYmFjayhkZXZpY2UsIGNiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQXBwQ2FsbGJhY2soQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJBcHBDYWxsYmFjayhkZXZpY2UsIGNiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW5PZmZsb2FkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5zdGFydFNjYW5PZmZsb2FkSW50ZXJuYWwoZGV2aWNlLCBpc0dyb3VwT3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN0b3BTY2FuT2ZmbG9hZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIGlzR3JvdXBPcCkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc3RvcFNjYW5PZmZsb2FkSW50ZXJuYWwoZGV2aWNlLCBpc0dyb3VwT3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEJyb2FkY2FzdFNvdXJjZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBib29sZWFuIGlzR3JvdXBPcCkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuYWRkQnJvYWRjYXN0U291cmNlSW50ZXJuYWwoZGV2aWNlLCBzcmNJbmZvLCBpc0dyb3VwT3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJyb2FkY2FzdFNvdXJjZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS51cGRhdGVCcm9hZGNhc3RTb3VyY2VJbnRlcm5hbChkZXZpY2UsIHNyY0luZm8sIGlzR3JvdXBPcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2V0QnJvYWRjYXN0Q29kZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cE9wKSB7Ci0gICAgICAgICAgICBCQ1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5zZXRCcm9hZGNhc3RDb2RlSW50ZXJuYWwoZGV2aWNlLCBzcmNJbmZvLCBpc0dyb3VwT3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUJyb2FkY2FzdFNvdXJjZSAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgc291cmNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXBPcCkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UucmVtb3ZlQnJvYWRjYXN0U291cmNlSW50ZXJuYWwoZGV2aWNlLCBzb3VyY2VJZCwgaXNHcm91cE9wKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24gKEJsdWV0b290aERldmljZSBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgQkNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbihkZXZpY2UpOwotICAgICAgIH0KLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC9CYXNlRGF0YS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0Jhc2VEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDRhZmEuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0Jhc2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYmM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5TdGF0ZU1hY2hpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcjsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5sYW5nLkJ5dGU7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLS8vLypfQk1TCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdC5Ccm9hZGNhc3RTZXJ2aWNlLkJpc0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdC5Ccm9hZGNhc3RTZXJ2aWNlLk1ldGFkYXRhTHR2OwotLy9fQk1TKi8KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcGFyYXNlIHRoZSBCcm9hZGNhc3QgQW5ub3VuY2VtZW50IEJBU0UgZGF0YQotICovCi1maW5hbCBjbGFzcyBCYXNlRGF0YSB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJhc3NjbGllbnQtQmFzZURhdGEiOwotICAgICAgICAgICAgQmFzZUluZm9ybWF0aW9uIGxldmVsT25lID0gbmV3IEJhc2VJbmZvcm1hdGlvbigpOwotICAgICAgICAgICAgQXJyYXlMaXN0PEJhc2VJbmZvcm1hdGlvbj4gbGV2ZWxUd28gPSBuZXcgQXJyYXlMaXN0PEJhc2VJbmZvcm1hdGlvbj4oKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCYXNlSW5mb3JtYXRpb24+IGxldmVsVGhyZWUgPSBuZXcgQXJyYXlMaXN0PEJhc2VJbmZvcm1hdGlvbj4oKTsKLSAgICAgICAgICAgIGludCBtTnVtQklTSW5kaWNpZXM7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVU5LTk9XTl9DT0RFQyA9IChieXRlKTB4RkU7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBCYXNlSW5mb3JtYXRpb24gewotICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBwcmVzZW50YXRpb25EZWxheSA9IG5ldyBieXRlWzNdOyAgICAvL3ZhbGlkIG9ubHkgaWYgbGV2ZWw9MQotICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBjb2RlY0lkID0gbmV3IGJ5dGVbNV07IC8vdmFsaWQgb25seSBpZiBsZXZlbD0xCi0gICAgICAgICAgICBwdWJsaWMgYnl0ZSBjb2RlY0NvbmZpZ0xlbmd0aDsKLSAgICAgICAgICAgIHB1YmxpYyBieXRlW10gY29kZWNDb25maWdJbmZvOwotICAgICAgICAgICAgcHVibGljIGJ5dGUgbWV0YURhdGFMZW5ndGg7Ci0gICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIG1ldGFEYXRhOwotICAgICAgICAgICAgcHVibGljIGJ5dGUgbnVtU3ViR3JvdXBzOwotICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBiaXNJbmRpY2llczsgLy92YWxpZCBvbmx5IGlmIGxldmVsID0gMgotICAgICAgICAgICAgcHVibGljIGJ5dGUgaW5kZXg7IC8vdmFsaWQgb25seSBpZiBsZXZlbD0zIGFuZCBsZXZlbD0yIChhcyBzdWJncm91cCBJZCkKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgc3ViR3JvdXBJZDsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbGV2ZWw7Ly9kaWZmZXJlbnRpYXRlIGRpZmZlcmVudCBsZXZlbHMgb2YgQkFTRSBkYXRhCi0gICAgICAgICAgICBwdWJsaWMgTGlua2VkSGFzaFNldDxTdHJpbmc+IGtleUNvZGVjQ2ZnRGlmZjsKLSAgICAgICAgICAgIHB1YmxpYyBMaW5rZWRIYXNoU2V0PFN0cmluZz4ga2V5TWV0YWRhdGFEaWZmOwotICAgICAgICAgICAgcHVibGljIFN0cmluZyBkaWZmVGV4dDsKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICAgICAgICAgIHB1YmxpYyBieXRlW10gY29uc29saWRhdGVkQ29kZWNJZDsKLSAgICAgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBjb25zb2xpZGF0ZWRNZXRhZGF0YTsKLSAgICAgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBjb25zb2xpZGF0ZWRDb2RlY0luZm87Ci0gICAgICAgICAgICBwdWJsaWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGNvbnNvbGlkYXRlZFVuaXF1ZUNvZGVjSW5mbzsKLSAgICAgICAgICAgIHB1YmxpYyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4gY29uc29saWRhdGVkVW5pcXVlTWV0YWRhdGE7Ci0KLSAgICAgICAgICAgIEJhc2VJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgICAgICBwcmVzZW50YXRpb25EZWxheSA9IG5ldyBieXRlWzNdOwotICAgICAgICAgICAgIGNvZGVjSWQgPSBuZXcgYnl0ZVs1XTsKLSAgICAgICAgICAgICBjb2RlY0NvbmZpZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgY29kZWNDb25maWdJbmZvID0gbnVsbDsKLSAgICAgICAgICAgICBtZXRhRGF0YUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOwotICAgICAgICAgICAgIG51bVN1Ykdyb3VwcyA9IDA7Ci0gICAgICAgICAgICAgYmlzSW5kaWNpZXMgPSBudWxsOwotICAgICAgICAgICAgIGluZGV4ID0gKGJ5dGUpMHhGRjsKLSAgICAgICAgICAgICBsZXZlbCA9IDA7Ci0KLSAgICAgICAgICAgICBrZXlDb2RlY0NmZ0RpZmYgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAga2V5TWV0YWRhdGFEaWZmID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgICAgICAgY29uc29saWRhdGVkTWV0YWRhdGEgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgY29uc29saWRhdGVkQ29kZWNJbmZvID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgIGNvbnNvbGlkYXRlZENvZGVjSWQgPSBuZXcgYnl0ZVs1XTsKLSAgICAgICAgICAgICBjb25zb2xpZGF0ZWRVbmlxdWVNZXRhZGF0YSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgICAgICBjb25zb2xpZGF0ZWRVbmlxdWVDb2RlY0luZm8gPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgZGlmZlRleHQgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmcoIiIpOwotICAgICAgICAgICAgIGxvZygiQmFzZUluZm9ybWF0aW9uIGlzIEluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb2RlY0lkVW5rbm93bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGNvZGVjSWQgIT0gbnVsbCAmJiBjb2RlY0lkWzRdID09IChieXRlKUJhc2VEYXRhLlVOS05PV05fQ09ERUMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIHByaW50Q29uc29saWRhdGVkKCkgewotICAgICAgICAgICAgICAgICAgICBsb2coIioqQkVHSU46IEJJUyBjb25zb2xpZGF0ZWQgSW5mb3JtYXRpb24qKiIpOwotICAgICAgICAgICAgICAgICAgICBsb2coIkJJUyBpbmRleDoiICsgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBsb2coIkNvZGVjSWQ6IiArIEFycmF5cy50b1N0cmluZyhjb25zb2xpZGF0ZWRDb2RlY0lkKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyppZiAoY29uc29saWRhdGVkQ29kZWNJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gY29uc29saWRhdGVkQ29kZWNJbmZvLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGl0ci5oYXNOZXh0KCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiY29uc29saWRhdGVkQ29kZWNJbmZvOlsiICsgayArICJdOiIgKyBBcnJheXMudG9TdHJpbmcoaXRyLm5leHQoKS5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29uc29saWRhdGVkTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSBjb25zb2xpZGF0ZWRNZXRhZGF0YS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBpdHIuaGFzTmV4dCgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImNvbnNvbGlkYXRlZE1ldGFkYXRhOlsiICsgayArICJdOiIgKyBBcnJheXMudG9TdHJpbmcoaXRyLm5leHQoKS5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xpZGF0ZWRVbmlxdWVDb2RlY0luZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlcixTdHJpbmc+IGVudHJ5IDogY29uc29saWRhdGVkVW5pcXVlQ29kZWNJbmZvLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImNvbnNvbGlkYXRlZFVuaXF1ZUNvZGVjSW5mbzpbIiArIGVudHJ5LmdldEtleSgpICsgIl06IiArIEFycmF5cy50b1N0cmluZyhlbnRyeS5nZXRWYWx1ZSgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xpZGF0ZWRVbmlxdWVNZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLFN0cmluZz4gZW50cnkgOiBjb25zb2xpZGF0ZWRVbmlxdWVNZXRhZGF0YS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJjb25zb2xpZGF0ZWRVbmlxdWVNZXRhZGF0YTpbIiArIGVudHJ5LmdldEtleSgpICsgIl06IiArIEFycmF5cy50b1N0cmluZyhlbnRyeS5nZXRWYWx1ZSgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2coIioqRU5EOiBCSVMgY29uc29saWRhdGVkIEluZm9ybWF0aW9uKioqKiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdm9pZCBwcmludCgpIHsKLSAgICAgICAgICAgICAgICBsb2coIioqQkVHSU46IEJhc2UgSW5mb3JtYXRpb24qKiIpOwotICAgICAgICAgICAgICAgIGxvZygiKipMZXZlbDogIiArIGxldmVsICsgIioqKiIpOwotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygicHJlc2VudGF0aW9uRGVsYXk6ICIgKyBBcnJheXMudG9TdHJpbmcocHJlc2VudGF0aW9uRGVsYXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJjb2RlY0lkOiAiICsgQXJyYXlzLnRvU3RyaW5nKGNvZGVjSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDIgfHwgbGV2ZWwgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBsb2coImNvZGVjQ29uZmlnTGVuZ3RoOiAiICsgY29kZWNDb25maWdMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBsb2coInN1Ykdyb3VwSWQ6ICIgKyBzdWJHcm91cElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVjQ29uZmlnTGVuZ3RoICE9IChieXRlKTApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJjb2RlY0NvbmZpZ0luZm86ICIgKyBBcnJheXMudG9TdHJpbmcoY29kZWNDb25maWdJbmZvKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygibWV0YURhdGFMZW5ndGg6ICIgKyBtZXRhRGF0YUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUxlbmd0aCAhPSAoYnl0ZSkwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIm1ldGFEYXRhOiAiICsgQXJyYXlzLnRvU3RyaW5nKG1ldGFEYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMSB8fCBsZXZlbCA9PSAyKQotICAgICAgICAgICAgICAgICAgICBsb2coIm51bVN1Ykdyb3VwczogIiArIG51bVN1Ykdyb3Vwcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiTGV2ZWwyOiBLZXkgTWV0YWRhdGEgZGlmZmVyZW50aWF0b3JzIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXlNZXRhZGF0YURpZmYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSBrZXlNZXRhZGF0YURpZmYuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgaXRyLmhhc05leHQoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJrZXlNZXRhZGF0YURpZmY6WyIgKyBrICsgIl06IiArIEFycmF5cy50b1N0cmluZyhpdHIubmV4dCgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2coIkVORDogTGV2ZWwyOiBLZXkgTWV0YWRhdGEgZGlmZmVyZW50aWF0b3JzIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nKCJMZXZlbDI6IEtleSBDb2RlY0NvbmZpZyBkaWZmZXJlbnRpYXRvcnMiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleUNvZGVjQ2ZnRGlmZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ciA9IGtleUNvZGVjQ2ZnRGlmZi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBpdHIuaGFzTmV4dCgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxFVkVMMjoga2V5Q29kZWNDZmdEaWZmOlsiICsgayArICJdOiIgKyBBcnJheXMudG9TdHJpbmcoaXRyLm5leHQoKS5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nKCJFTkQ6IExldmVsMjogS2V5IENvZGVjQ29uZmlnIGRpZmZlcmVudGlhdG9ycyIpOwotICAgICAgICAgICAgICAgICAgICAvL2xvZygiYmlzSW5kaWNpZXM6ICIgKyBBcnJheXMudG9TdHJpbmcoYmlzSW5kaWNpZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJMRVZFTDI6IGRpZmZUZXh0OiAiICsgZGlmZlRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBsb2coIkxldmVsMzogS2V5IENvZGVjQ29uZmlnIGRpZmZlcmVudGlhdG9ycyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Q29kZWNDZmdEaWZmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0ga2V5Q29kZWNDZmdEaWZmLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGl0ci5oYXNOZXh0KCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTEVWRUwzOiBrZXlDb2RlY0NmZ0RpZmY6WyIgKyBrICsgIl06IiArIEFycmF5cy50b1N0cmluZyhpdHIubmV4dCgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2coIkVORDogTGV2ZWwzOiBLZXkgQ29kZWNDb25maWcgZGlmZmVyZW50aWF0b3JzIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiaW5kZXg6ICIgKyBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiTEVWRUwzOiBkaWZmVGV4dDogIiArIGRpZmZUZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9nKCIqKkVORDogQmFzZSBJbmZvcm1hdGlvbioqKioiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgICAgIC8vLypfQk1TCi0gICAgICAgICAgICBCYXNlRGF0YShpbnQgbnVtU3ViR3JvdXBzLCBMaXN0PEJpc0luZm8+IGNvbG9jYXRlZEJpc0luZm8sIE1hcDxJbnRlZ2VyLCBNZXRhZGF0YUx0dj4gbWV0YUluZm8pIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0YUluZm8gPT0gbnVsbCB8fCBjb2xvY2F0ZWRCaXNJbmZvID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJCYXNlRGF0YSBDb250cnVjdGlvbiB3aXRoIEludmFsaWQgcGFyYW1ldGVycyIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYXNlZGF0YTogUGFyYW1ldGVycyBjYW4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldmVsT25lID0gbmV3IEJhc2VJbmZvcm1hdGlvbigpOwotICAgICAgICAgICAgICAgIGxldmVsVHdvID0gbmV3IEFycmF5TGlzdDxCYXNlSW5mb3JtYXRpb24+KCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxUaHJlZSA9IG5ldyBBcnJheUxpc3Q8QmFzZUluZm9ybWF0aW9uPigpOwotCi0gICAgICAgICAgICAgICAgbGV2ZWxPbmUubGV2ZWwgPSAxOwotICAgICAgICAgICAgICAgIGxldmVsT25lLm51bVN1Ykdyb3VwcyA9IChieXRlKW51bVN1Ykdyb3VwczsKLQotICAgICAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBsZXZlbCBUd28gYW5kIHVwZGF0ZSB0aGUgTWV0YWRhdGEgSW5mbwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdWJHcm91cHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBCYXNlSW5mb3JtYXRpb24gYSA9IG5ldyBCYXNlSW5mb3JtYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYS5sZXZlbCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IE1ldGFkYXRhIEx0dgotICAgICAgICAgICAgICAgICAgICBieXRlW10gbWV0YWRhdGFMdHYgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibWV0YUluZm86ICIgKyBtZXRhSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUx0diBvYmogPSBtZXRhSW5mby5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUx0diA9IG9iai5nZXRCeXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtZXRhZGF0YUx0djogIiArIG1ldGFkYXRhTHR2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibWV0YWRhdGFMdHZbIiAraSsiXSBpcyBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTHR2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGEubWV0YURhdGEgPSBuZXcgYnl0ZVsoaW50KW1ldGFkYXRhTHR2Lmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1ldGFkYXRhTHR2LCAwLCBhLm1ldGFEYXRhLCAwLCAoaW50KW1ldGFkYXRhTHR2Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUd28uYWRkKGEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjb2xvY2F0ZWRCaXNJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU51bUJJU0luZGljaWVzID0gY29sb2NhdGVkQmlzSW5mby5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sb2NhdGVkQmlzSW5mby5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQmlzSW5mbyBiaXNJbmZvID0gY29sb2NhdGVkQmlzSW5mby5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCYXNlSW5mb3JtYXRpb24gYiA9IG5ldyBCYXNlSW5mb3JtYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIubGV2ZWwgPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgYi5zdWJHcm91cElkID0gYmlzSW5mby5tU3ViR3JvdXBJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIuaW5kZXggPSAoYnl0ZSliaXNJbmZvLkJpc0luZGV4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBiLmNvbnNvbGlkYXRlZENvZGVjSWQgPSBiaXNJbmZvLm1Db2RlY0lkOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBNZXRhZGF0YSBMdHYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBtZXRhZGF0YUx0diA9IGJpc0luZm8uQmlzTWV0YWRhdGEuZ2V0Qnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFMdHYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoazxtZXRhZGF0YUx0di5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBsZW5ndGggPSBtZXRhZGF0YUx0dltrKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gbHR2ID0gbmV3IGJ5dGVbbGVuZ3RoKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdHZbMF0gPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWV0YWRhdGFMdHYsIGssIGx0diwgMSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wdXQgaW4gdHlwZSwgbHR2IGhhc2htYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGx0dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuY29uc29saWRhdGVkVW5pcXVlTWV0YWRhdGEucHV0KChpbnQpbHR2WzFdLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJhZGQgTWV0YWRhdGE6OjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IGsrbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgQ29kZWNDb25maWcgbHR2Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gY29kZWNDb25maWdMdHYgPSBiaXNJbmZvLkJpc0NvZGVjQ29uZmlnLmdldEJ5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjQ29uZmlnTHR2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGs8Y29kZWNDb25maWdMdHYubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgbGVuZ3RoID0gY29kZWNDb25maWdMdHZbaysrXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGx0diA9IG5ldyBieXRlW2xlbmd0aCsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHR2WzBdID0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvZGVjQ29uZmlnTHR2LCBrLCBsdHYsIDEsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHV0IGluIHR5cGUsIGx0diBoYXNobWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhsdHYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNvbnNvbGlkYXRlZFVuaXF1ZUNvZGVjSW5mby5wdXQoKGludClsdHZbMV0sIHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImFkZCBDb2RlY0NvbmZpZyBlbnRyeTo6OiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gaytsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgZGVzY3JpcHRpb24gd2l0aCAiQ2hlbm5lbDogWCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGIuZGVzY3JpcHRpb24gPSAiQ2hhbm5lbDogIiArIFN0cmluZy52YWx1ZU9mKGIuaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUaHJlZS5hZGQoYik7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vX0JNUyovCi0gICAgICAgICAgICBCYXNlRGF0YShieXRlW10gc2VydmljZURhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHNlcnZpY2UgZGF0YSBmb3IgQmFzZURhdGEgY29uc3RydWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhc2VkYXRhOiBzZXJ2aWNlRGF0YSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldmVsT25lID0gbmV3IEJhc2VJbmZvcm1hdGlvbigpOwotICAgICAgICAgICAgICAgIGxldmVsVHdvID0gbmV3IEFycmF5TGlzdDxCYXNlSW5mb3JtYXRpb24+KCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxUaHJlZSA9IG5ldyBBcnJheUxpc3Q8QmFzZUluZm9ybWF0aW9uPigpOwotICAgICAgICAgICAgICAgIG1OdW1CSVNJbmRpY2llcyA9IDA7Ci0gICAgICAgICAgICAgICAgbG9nKCJtZW1iZXJzIGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICAgICAgbG9nKCJCQVNFIGlucHV0IiArIEFycmF5cy50b1N0cmluZyhzZXJ2aWNlRGF0YSkpOwotCi0gICAgICAgICAgICAgICAgLy9QYXJzZSBMZXZlbCAxIGJhc2UKLSAgICAgICAgICAgICAgICBsZXZlbE9uZS5sZXZlbCA9IDE7Ci0gICAgICAgICAgICAgICAgaW50IGxldmVsMUlkeCA9IDA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzZXJ2aWNlRGF0YSwgbGV2ZWwxSWR4LCBsZXZlbE9uZS5wcmVzZW50YXRpb25EZWxheSwwLCAzKTsKLSAgICAgICAgICAgICAgICBsZXZlbDFJZHggPSBsZXZlbDFJZHggKyAzOwotCi0gICAgICAgICAgICAgICAgbGV2ZWxPbmUubnVtU3ViR3JvdXBzID0gc2VydmljZURhdGFbbGV2ZWwxSWR4KytdOwotICAgICAgICAgICAgICAgIGxldmVsT25lLnByaW50KCk7Ci0gICAgICAgICAgICAgICAgbG9nKCJsZXZlbE9uZSBzdWJncm91cHMiICsgbGV2ZWxPbmUubnVtU3ViR3JvdXBzKTsKLQotICAgICAgICAgICAgICAgIGludCBsZXZlbDJJZHggPSBsZXZlbDFJZHg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9MDsgaTwoaW50KWxldmVsT25lLm51bVN1Ykdyb3VwczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygicGFyc2luZyBzdWJncm91cCIgKyBpKTsKLSAgICAgICAgICAgICAgICAgICAgQmFzZUluZm9ybWF0aW9uIGIgPSBuZXcgQmFzZUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYi5sZXZlbCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGIuc3ViR3JvdXBJZCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGIubnVtU3ViR3JvdXBzID0gc2VydmljZURhdGFbbGV2ZWwySWR4KytdOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZURhdGFbbGV2ZWwySWR4XSA9PSAoYnl0ZSlVTktOT1dOX0NPREVDKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1BsYWNlIEl0IGluIHRoZSBsYXN0IGJ5dGUgb2YgY29kZWNJRAotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzZXJ2aWNlRGF0YSwgbGV2ZWwySWR4LCBiLmNvZGVjSWQsIDQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwySWR4ID0gIGxldmVsMklkeCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coImNvZGVjSWQgaXMgRkUiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VydmljZURhdGEsIGxldmVsMklkeCwgYi5jb2RlY0lkLCAwLCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsMklkeCA9ICBsZXZlbDJJZHggKyA1OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYi5jb2RlY0NvbmZpZ0xlbmd0aCA9ICBzZXJ2aWNlRGF0YVtsZXZlbDJJZHgrK107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiLmNvZGVjQ29uZmlnTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIuY29kZWNDb25maWdJbmZvID0gbmV3IGJ5dGVbKGludCliLmNvZGVjQ29uZmlnTGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VydmljZURhdGEsIGxldmVsMklkeCwgYi5jb2RlY0NvbmZpZ0luZm8sIDAsIChpbnQpYi5jb2RlY0NvbmZpZ0xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDJJZHggPSBsZXZlbDJJZHggKyAoaW50KWIuY29kZWNDb25maWdMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYi5tZXRhRGF0YUxlbmd0aCA9IHNlcnZpY2VEYXRhW2xldmVsMklkeCsrXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGIubWV0YURhdGFMZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYi5tZXRhRGF0YSA9IG5ldyBieXRlWyhpbnQpYi5tZXRhRGF0YUxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNlcnZpY2VEYXRhLCBsZXZlbDJJZHgsIGIubWV0YURhdGEsIDAsIChpbnQpYi5tZXRhRGF0YUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDJJZHggPSBsZXZlbDJJZHggKyAoaW50KWIubWV0YURhdGFMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU51bUJJU0luZGljaWVzID0gbU51bUJJU0luZGljaWVzICsgYi5udW1TdWJHcm91cHM7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsVHdvLmFkZChiKTsKLSAgICAgICAgICAgICAgICAgICAgYi5wcmludCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL1BhcnNlIExldmVsIDMgQmFzZQotICAgICAgICAgICAgICAgIGludCBsZXZlbDNJbmRleCA9IGxldmVsMklkeDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8bU51bUJJU0luZGljaWVzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQmFzZUluZm9ybWF0aW9uIGMgPSBuZXcgQmFzZUluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGMubGV2ZWwgPSAzOwotICAgICAgICAgICAgICAgICAgICBjLmluZGV4ID0gc2VydmljZURhdGFbbGV2ZWwzSW5kZXgrK107Ci0KLSAgICAgICAgICAgICAgICAgICAgYy5jb2RlY0NvbmZpZ0xlbmd0aCA9ICBzZXJ2aWNlRGF0YVtsZXZlbDNJbmRleCsrXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMuY29kZWNDb25maWdMZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYy5jb2RlY0NvbmZpZ0luZm8gPSBuZXcgYnl0ZVsoaW50KWMuY29kZWNDb25maWdMZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzZXJ2aWNlRGF0YSwgbGV2ZWwzSW5kZXgsIGMuY29kZWNDb25maWdJbmZvLCAwLCAoaW50KWMuY29kZWNDb25maWdMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwzSW5kZXggPSBsZXZlbDNJbmRleCArIChpbnQpYy5jb2RlY0NvbmZpZ0xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgbGV2ZWxUaHJlZS5hZGQoYyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc29saWRhdGVCYXNlb2ZMZXZlbFR3bygpOwotCi0gICAgICAgICAgICAgICAgLy9EZXRhaWxlZCBCQVNFIHBhcnNpbmcgYmVsb3cKLSAgICAgICAgICAgICAgICAvL2xvZygiY2FsbGluZyB1cGRhdGVVbmlxdWVuZXNzRm9yTGV2ZWxUd28iKTsKLSAgICAgICAgICAgICAgICAvL3VwZGF0ZVVuaXF1ZW5lc3NGb3JMZXZlbFR3byhsZXZlbE9uZS5udW1TdWJHcm91cHMpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlRGlmZlRleHRmb3JOb2RlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdm9pZCBjb25zb2xpZGF0ZUJhc2VvZkxldmVsVHdvKCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRJZHggPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hpbGRyZW4gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZXZlbFR3by5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJZHggPSBzdGFydElkeCsgY2hpbGRyZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuICsgbGV2ZWxUd28uZ2V0KGkpLm51bVN1Ykdyb3VwczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc29saWRhdGVCYXNlb2ZMZXZlbFRocmVlKGksIHN0YXJ0SWR4LCBsZXZlbFR3by5nZXQoaSkubnVtU3ViR3JvdXBzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vRWxpbWluYXRlIER1cGxpY2F0ZXMgYXQgTGV2ZWwgMwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bGV2ZWxUaHJlZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIFN0cmluZz4gdW5pcXVlTWRzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHVuaXF1ZUNjaXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+ICgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBDc2ZzID0gbGV2ZWxUaHJlZS5nZXQoaSkuY29uc29saWRhdGVkQ29kZWNJbmZvOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ3Nmcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSBDc2ZzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBpdHIuaGFzTmV4dCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGx0dkVudHJpZXMgPSBpdHIubmV4dCgpLmdldEJ5dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGsgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGxlbmd0aCA9IGx0dkVudHJpZXNbaysrXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGx0diA9IG5ldyBieXRlW2xlbmd0aCsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHR2WzBdID0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGx0dkVudHJpZXMsIGssIGx0diwgMSwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IChpbnQpbHR2WzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHVuaXF1ZUNjaXMuZ2V0KHR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbHR2UyA9IG5ldyBTdHJpbmcobHR2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ2Npcy5wdXQodHlwZSwgbHR2Uyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHNhbWUgdHlwZSBleGlzdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ2Npcy5yZXBsYWNlKHR5cGUsIGx0dlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBNZHMgPSBsZXZlbFRocmVlLmdldChpKS5jb25zb2xpZGF0ZWRNZXRhZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNZHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gTWRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBpdHIuaGFzTmV4dCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGx0dkVudHJpZXMgPSBpdHIubmV4dCgpLmdldEJ5dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGsgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGxlbmd0aCA9IGx0dkVudHJpZXNbaysrXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGx0diA9IG5ldyBieXRlW2xlbmd0aCsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHR2WzBdID0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGx0dkVudHJpZXMsIGssIGx0diwgMSwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNIRUNLOiBUaGlzIGNhbiBiZSBzdHJhaWdodCBQVVQsIHRoZXJlIHdvbnQgYmUgZHVwcyBpbiBNZXRhZGF0YSB3aXRoIG5ldyBCQVNFKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUgPSAoaW50KWx0dlsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSB1bmlxdWVDY2lzLmdldCh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGx0dlMgPSBuZXcgU3RyaW5nKGx0dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZU1kcy5wdXQodHlwZSwgbHR2Uyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHNhbWUgdHlwZSBleGlzdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlTWRzLnJlcGxhY2UodHlwZSwgbHR2Uyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLmNvbnNvbGlkYXRlZFVuaXF1ZU1ldGFkYXRhID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPih1bmlxdWVNZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUaHJlZS5nZXQoaSkuY29uc29saWRhdGVkVW5pcXVlQ29kZWNJbmZvID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPih1bmlxdWVDY2lzKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2b2lkIGNvbnNvbGlkYXRlQmFzZW9mTGV2ZWxUaHJlZShpbnQgcGFyZW50U3ViZ3JvdXAsIGludCBzdGFydElkeCwgaW50IG51bU5vZGVzKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1zdGFydElkeDsgaTxzdGFydElkeCtudW1Ob2Rlc3x8aTxsZXZlbFRocmVlLnNpemUoKTsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLnN1Ykdyb3VwSWQgPSBsZXZlbFR3by5nZXQocGFyZW50U3ViZ3JvdXApLnN1Ykdyb3VwSWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29weSBDb2RlYyBJZCBmcm9tIExldmVsMiBQYXJlbnQiICsgcGFyZW50U3ViZ3JvdXApOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsZXZlbFR3by5nZXQocGFyZW50U3ViZ3JvdXApLmNvbnNvbGlkYXRlZENvZGVjSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAsbGV2ZWxUaHJlZS5nZXQoaSkuY29uc29saWRhdGVkQ29kZWNJZCwgMCwgNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vTWV0YWRhdGEgY2xvbmUgZnJvbSBQYXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLmNvbnNvbGlkYXRlZE1ldGFkYXRhID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPihsZXZlbFR3by5nZXQocGFyZW50U3ViZ3JvdXApLmNvbnNvbGlkYXRlZE1ldGFkYXRhKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2coIlBhcmVudCBDb25zIEluZm8+PiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXZlbFR3by5nZXQocGFyZW50U3ViZ3JvdXApLnByaW50Q29uc29saWRhdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0NDSSBjbG9uZSBmcm9tIFBhcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUaHJlZS5nZXQoaSkuY29uc29saWRhdGVkQ29kZWNJbmZvID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPihsZXZlbFR3by5nZXQocGFyZW50U3ViZ3JvdXApLmNvbnNvbGlkYXRlZENvZGVjSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2xvZygiYmVmb3JlICIgKyBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV2ZWxUaHJlZS5nZXQoaSkucHJpbnRDb25zb2xpZGF0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQXBwZW5kIExldmVsIDIgQ29kZWMgQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUaHJlZS5nZXQoaSkuY29kZWNDb25maWdMZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiYXBwZW5kIGxldmVsIDMgY2NpIHRvIGxldmVsIDMgY29uczoiICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGxldmVsVGhyZWUuZ2V0KGkpLmNvZGVjQ29uZmlnSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUaHJlZS5nZXQoaSkuY29uc29saWRhdGVkQ29kZWNJbmZvLmFkZChzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKCJhZnRlciAiICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2xldmVsVGhyZWUuZ2V0KGkpLnByaW50Q29uc29saWRhdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2xvZygiUGFyZW50IENvbnMgSW5mbz4+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2xldmVsVHdvLmdldChwYXJlbnRTdWJncm91cCkucHJpbnRDb25zb2xpZGF0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBnZXROdW1iZXJPZkluZGljaWVzKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU51bUJJU0luZGljaWVzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlIGdldE51bWJlck9mU3ViZ3JvdXBzb2ZCSUcoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGUgcmV0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsT25lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGxldmVsT25lLm51bVN1Ykdyb3VwczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyAgQXJyYXlMaXN0PEJhc2VJbmZvcm1hdGlvbj4gZ2V0QklTSW5kZXhJbmZvcygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsVGhyZWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gIGdldEJyb2FkY2FzdENoYW5uZWxzKCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IGJDaGFubmVscyA9IG5ldyBBcnJheUxpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPG1OdW1CSVNJbmRpY2llczsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBsZXZlbFRocmVlLmdldChrKS5pbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjID0gbGV2ZWxUaHJlZS5nZXQoaykuZGVzY3JpcHRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZyBkZXNjID0gU3RyaW5nLnZhbHVlT2YoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbCBiYyA9IG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsKGluZGV4LCBkZXNjLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGspLnN1Ykdyb3VwSWQsIGxldmVsVGhyZWUuZ2V0KGspLm1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFubmVscy5hZGQoYmMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBiQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBwaWNrQWxsQnJvYWRjYXN0Q2hhbm5lbHMoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYkNoYW5uZWxzID0gbmV3IEFycmF5TGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8bU51bUJJU0luZGljaWVzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxldmVsVGhyZWUuZ2V0KGspLmluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmcgZGVzYyA9IGxldmVsVGhyZWUuZ2V0KGspLmRlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmcgZGVzYyA9IFN0cmluZy52YWx1ZU9mKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwgYmMgPSBuZXcgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbChpbmRleCwgU3RyaW5nLnZhbHVlT2YoaW5kZXgpLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUaHJlZS5nZXQoaykuc3ViR3JvdXBJZCwgbGV2ZWxUaHJlZS5nZXQoaykubWV0YURhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5uZWxzLmFkZChiYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJDaGFubmVsczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGdldE1ldGFkYXRhKGludCBzdWJHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUd28gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsVHdvLmdldChzdWJHcm91cCkubWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGdldE1ldGFkYXRhU3RyaW5nKGJ5dGVbXSBtZXRhZGF0YUJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBfTEFOR1VBR0UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9EaWZmZXJlbnQgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBfRU5HTElTSCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgX1NQQU5JU0ggPSAyOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgX0RFU0NSSVBUSU9OID0gMTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWV0YWRhdGFCeXRlc1sxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBfTEFOR1VBR0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXRhZGF0YUJ5dGVzWzJdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgX0VOR0xJU0g6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAiRU5HTElTSCI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIF9TUEFOSVNIOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIlNQQU5JU0giOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICJVTktOT1dOIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBfREVTQ1JJUFRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIlVOS05PV04iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAiVU5LTk9XTiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nKCJnZXRNZXRhZGF0YVN0cmluZzogIiArIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGdldENvZGVjUGFyYW1TdHJpbmcoYnl0ZVtdIGNzaUJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsICBpbnQgTE9DQVRJT04gPSA0OwotICAgICAgICAgICAgICAgICAgICBmaW5hbCAgaW50IExFRlQgPSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCAgaW50IFJJR0hUID0weDAyMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbmV3IFN0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vc2FtcGxlIHJhdGUKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IFNBTVBMRV9SQVRFID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAvL2ZyYW1lIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBGUkFNRV9EVVJBVElPTiA9IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9PY3RldHMgcGVyIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBPQ1RFVFNfUEVSX0ZSQU1FID0gODsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGNzaUJ5dGVzWzFdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExPQ0FUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsb2NhdGlvbiA9IG5ldyBieXRlWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3NpQnl0ZXMsIDIsIGxvY2F0aW9uLCAwLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHdyYXBwZWQgPSBCeXRlQnVmZmVyLndyYXAobG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb0xvY2F0aW9uID0gd3JhcHBlZC5nZXRJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImF1ZGlvTG9jYXRpb246ICIgKyBhdWRpb0xvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYXVkaW9Mb2NhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlQ6IHJldCA9ICJMRUZUIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUklHSFQ6IHJldCA9ICJSSUdIVCI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlR8UklHSFQ6IHJldCA9ICJMUiI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0FNUExFX1JBVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGNzaUJ5dGVzWzJdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIjhLIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIjE2SyI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICIyNEsiOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAiMzJLIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIjQ0LjFLIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIjQ4SyI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlJBTUVfRFVSQVRJT046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGNzaUJ5dGVzWzJdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIkZEXzEiOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9DVEVUU19QRVJfRlJBTUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGNzaUJ5dGVzWzJdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICJPUEZfMjgiOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIk9QRl82NCI7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIlVOS05PV04iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiZ2V0Q29kZWNQYXJhbVN0cmluZzogIiArIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdm9pZCB1cGRhdGVEaWZmVGV4dGZvck5vZGVzKCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bGV2ZWxUd28uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFR3by5nZXQoaSkua2V5TWV0YWRhdGFEaWZmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ciA9IGxldmVsVHdvLmdldChpKS5rZXlNZXRhZGF0YURpZmYuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGl0ci5oYXNOZXh0KCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFR3by5nZXQoaSkuZGlmZlRleHQgPSBsZXZlbFR3by5nZXQoaSkuZGlmZlRleHQuY29uY2F0KGdldE1ldGFkYXRhU3RyaW5nKGl0ci5uZXh0KCkuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFR3by5nZXQoaSkuZGlmZlRleHQgPSBsZXZlbFR3by5nZXQoaSkuZGlmZlRleHQuY29uY2F0KCJfIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHdvLmdldChpKS5rZXlDb2RlY0NmZ0RpZmYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gbGV2ZWxUd28uZ2V0KGkpLmtleUNvZGVjQ2ZnRGlmZi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgaXRyLmhhc05leHQoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHdvLmdldChpKS5kaWZmVGV4dCA9IGxldmVsVHdvLmdldChpKS5kaWZmVGV4dC5jb25jYXQoZ2V0Q29kZWNQYXJhbVN0cmluZyhpdHIubmV4dCgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUd28uZ2V0KGkpLmRpZmZUZXh0ID0gbGV2ZWxUd28uZ2V0KGkpLmRpZmZUZXh0LmNvbmNhdCgiXyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZXZlbFRocmVlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUaHJlZS5nZXQoaSkua2V5Q29kZWNDZmdEaWZmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ciA9IGxldmVsVGhyZWUuZ2V0KGkpLmtleUNvZGVjQ2ZnRGlmZi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgaXRyLmhhc05leHQoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLmRpZmZUZXh0ID0gbGV2ZWxUaHJlZS5nZXQoaSkuZGlmZlRleHQuY29uY2F0KGdldENvZGVjUGFyYW1TdHJpbmcoaXRyLm5leHQoKS5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLmRpZmZUZXh0ID0gbGV2ZWxUaHJlZS5nZXQoaSkuZGlmZlRleHQuY29uY2F0KCJfIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9Db25jYXQgYW5kIHVwZGF0ZSB0aGUgRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0SWR4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoaWxkcmVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxldmVsVHdvLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IHN0YXJ0SWR4KyBjaGlsZHJlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gKyBsZXZlbFR3by5nZXQoaSkubnVtU3ViR3JvdXBzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj1zdGFydElkeDsgajxzdGFydElkeCtsZXZlbFR3by5nZXQoaSkubnVtU3ViR3JvdXBzfHxqPGxldmVsVGhyZWUuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRocmVlLmdldChqKS5kZXNjcmlwdGlvbiA9IGxldmVsVHdvLmdldChpKS5kaWZmVGV4dCArICAgICBsZXZlbFRocmVlLmdldChqKS5kaWZmVGV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZvaWQgdXBkYXRlVW5pcXVlbmVzc0ZvckxldmVsVHdvKGludCBudW1Ob2RlcykgewotICAgICAgICAgICAgICAgICAgICBsb2coInVwZGF0ZVVuaXF1ZW5lc3NGb3JMZXZlbFR3bzogRU5URVIiKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdW5pcXVlQ29kZWNJZHMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHVuaXF1ZUNzZnMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHVuaXF1ZU1ldGFkYXRhcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgICAgICAgICBsb2coInVwZGF0ZVVuaXF1ZW5lc3NGb3JMZXZlbFR3byIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGFydElkeCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaGlsZHJlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZXZlbFR3by5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXZlbFR3by5nZXQoaSkucHJpbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUd28uZ2V0KGkpLmlzQ29kZWNJZFVua25vd24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiYWRkIGNvZGVjSWQgb2Ygc3ViZzogIiArIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhsZXZlbFR3by5nZXQoaSkuY29kZWNJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29kZWNJZHMuYWRkKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUd28uZ2V0KGkpLmNvZGVjQ29uZmlnTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImFkZCBjb2RlY0NvbmZpZyBvZiBzdWJnOiAiICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGxldmVsVHdvLmdldChpKS5jb2RlY0NvbmZpZ0luZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNzZnMuYWRkKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUd28uZ2V0KGkpLm1ldGFEYXRhTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcobGV2ZWxUd28uZ2V0KGkpLm1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImFkZCBtZXRhZGF0YSBvZiBzdWJnOiAiICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlTWV0YWRhdGFzLmFkZChzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gc3RhcnRJZHgrIGNoaWxkcmVuOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiArIGxldmVsVHdvLmdldChpKS5udW1TdWJHcm91cHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVuaXF1ZW5lc3NGb3JMZXZlbFRocmVlKGksIHN0YXJ0SWR4LCBsZXZlbFR3by5nZXQoaSkubnVtU3ViR3JvdXBzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHVuaXF1ZUNvZGVjUGFyYW1zID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB1bmlxdWVNZXRhZGF0YVBhcmFtcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29kZWNJZHMuc2l6ZSgpID4gMCkgbG9nKCJMZXZlbFR3bzogVW5pcXVlQ29kZWNJZHMiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ3Nmcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxldmVsVHdvOiB1bmlxdWVDc2ZzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3VuaXF1ZUNvZGVjUGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gdW5pcXVlQ3Nmcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpdHIuaGFzTmV4dCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gbHR2RW50cmllcyA9IGl0ci5uZXh0KCkuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGxlbmd0aCA9IGx0dkVudHJpZXNbaysrXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gbHR2ID0gbmV3IGJ5dGVbbGVuZ3RoKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0dlswXSA9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGx0dkVudHJpZXMsIGssIGx0diwgMSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoaXMgc2hvdWxkIGVuc3VyZSBEdXBsaWNhdGUgZW50cmllcyBhdCB0aGlzIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGx0dkVudHJpZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvZGVjUGFyYW1zLmFkZChzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlTWV0YWRhdGFzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTGV2ZWxUd286IHVuaXF1ZU1ldGFkYXRhcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy91bmlxdWVNZXRhZGF0YVBhcmFtcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gdW5pcXVlTWV0YWRhdGFzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGl0ci5oYXNOZXh0KCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsdHZFbnRyaWVzID0gaXRyLm5leHQoKS5nZXRCeXRlcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGsgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgbGVuZ3RoID0gbHR2RW50cmllc1trKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsdHYgPSBuZXcgYnl0ZVtsZW5ndGgrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHR2WzBdID0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobHR2RW50cmllcywgaywgbHR2LCAxLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgZW5zdXJlIER1cGxpY2F0ZSBlbnRyaWVzIGF0IHRoaXMgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcobHR2RW50cmllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlTWV0YWRhdGFQYXJhbXMuYWRkKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9ydW4gdGhvdWdoIHRoZSBub2RlcyBhbmQgdXBkYXRlIEtFWSBkaWZmZXJlbnRpYXRpbmcgZmFjdG9ycwotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29kZWNQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSB1bmlxdWVDb2RlY1BhcmFtcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBpdHIuaGFzTmV4dCgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFR3by5nZXQoaSkua2V5Q29kZWNDZmdEaWZmLmFkZChpdHIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gKGkrMSklKG51bU5vZGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vcnVuIHRob3VnaCB0aGUgbm9kZXMgYW5kIHVwZGF0ZSBLRVkgZGlmZmVyZW50aWF0aW5nIGZhY3RvcnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZU1ldGFkYXRhUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gdW5pcXVlTWV0YWRhdGFQYXJhbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgaXRyLmhhc05leHQoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUd28uZ2V0KGkpLmtleU1ldGFkYXRhRGlmZi5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpKzEpJShudW1Ob2Rlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKmxvZygiTGV2ZWwyOiBVbmlxdWVuZXNzIGFtb25nIHN1Ymdyb3VwcyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29kZWNQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSB1bmlxdWVDb2RlY1BhcmFtcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBpdHIuaGFzTmV4dCgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVuaXF1ZUNvZGVjUGFyYW1zOlsiICsgayArICJdIiArIEFycmF5cy50b1N0cmluZyhpdHIubmV4dCgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlTWV0YWRhdGFQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiAgaXRyID0gdW5pcXVlTWV0YWRhdGFQYXJhbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgaXRyLmhhc05leHQoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJ1bmlxdWVNZXRhZGF0YVBhcmFtczpbIisgayArICJdIiArIEFycmF5cy50b1N0cmluZyhpdHIubmV4dCgpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2coIkVORDogTGV2ZWwyOiBVbmlxdWVuZXNzIGFtb25nIHN1Ymdyb3VwcyIpOwotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2b2lkIHVwZGF0ZVVuaXF1ZW5lc3NGb3JMZXZlbFRocmVlKGludCBwYXJlbnRTdWJncm91cCwgaW50IHN0YXJ0SWR4LCBpbnQgbnVtTm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TZXQ8U3RyaW5nPiB1bmlxdWVDb2RlY0lkcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdW5pcXVlQ3NmcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgLy9TZXQ8U3RyaW5nPiB1bmlxdWVNZXRhZGF0YXMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nKCJ1cGRhdGVVbmlxdWVuZXNzRm9yTGV2ZWxUaHJlZTogc3RhcnRJZHgiICsgc3RhcnRJZHggKyAibnVtTm9kZXMiICsgbnVtTm9kZXMpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPXN0YXJ0SWR4OyBpPHN0YXJ0SWR4K251bU5vZGVzfHxpPGxldmVsVGhyZWUuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRocmVlLmdldChpKS5jb2RlY0NvbmZpZ0xlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGxldmVsVGhyZWUuZ2V0KGkpLmNvZGVjQ29uZmlnSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ3Nmcy5hZGQocyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJMRVZFTDM6IGFkZCB1bmlxdWUgQ1NGczoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHVuaXF1ZUNvZGVjUGFyYW1zID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ3Nmcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxldmVsVGhyZWU6IHVuaXF1ZUNzZnMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdW5pcXVlQ29kZWNQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSB1bmlxdWVDc2ZzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGl0ci5oYXNOZXh0KCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsdHZFbnRyaWVzID0gaXRyLm5leHQoKS5nZXRCeXRlcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGsgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgbGVuZ3RoID0gbHR2RW50cmllc1trKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsdHYgPSBuZXcgYnl0ZVtsZW5ndGgrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHR2WzBdID0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobHR2RW50cmllcywgaywgbHR2LCAxLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgZW5zdXJlIER1cGxpY2F0ZSBlbnRyaWVzIGF0IHRoaXMgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcobHR2RW50cmllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29kZWNQYXJhbXMuYWRkKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vcnVuIHRob3VnaCB0aGUgbm9kZXMgYW5kIHVwZGF0ZSBLRVkgZGlmZmVyZW50aWF0aW5nIGZhY3RvcnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZUNvZGVjUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRyID0gdW5pcXVlQ29kZWNQYXJhbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gc3RhcnRJZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGl0ci5oYXNOZXh0KCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLmtleUNvZGVjQ2ZnRGlmZi5hZGQoaXRyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpKzEpJShzdGFydElkeCtudW1Ob2Rlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJMZXZlbDM6IFVuaXF1ZW5lc3MgYW1vbmcgY2hpbGRyZW4gb2YgIiArIHBhcmVudFN1Ymdyb3VwICsgInRoIFN1Ymdyb3VwIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVDb2RlY1BhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ciA9IHVuaXF1ZUNvZGVjUGFyYW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGl0ci5oYXNOZXh0KCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiVW5pcXVlQ29kZWNQYXJhbXM6WyIgKyBrICsgIl0iICsgQXJyYXlzLnRvU3RyaW5nKGl0ci5uZXh0KCkuZ2V0Qnl0ZXMoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nKCJFTkQ6IExldmVsMzogVW5pcXVlbmVzcyBhbW9uZyBjaGlsZHJlbiBvZiAiICsgcGFyZW50U3ViZ3JvdXAgKyAidGggU3ViZ3JvdXAiKTsKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICB2b2lkIHByaW50KCkgewotICAgICAgICAgICAgICAgIGxldmVsT25lLnByaW50KCk7Ci0gICAgICAgICAgICAgICAgbG9nKCItLS0tLSBMZXZlbCBUV08gQkFTRSAtLS0tIik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxldmVsVHdvLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsVHdvLmdldChpKS5wcmludCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2coIi0tLS0tIExldmVsIFRIUkVFIEJBU0UgLS0tLSIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZXZlbFRocmVlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLnByaW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIHByaW50Q29uc29saWRhdGVkKCkgewotICAgICAgICAgICAgICAgIGxvZygiLS0tLS0gcHJpbnRDb25zb2xpZGF0ZWQgLS0tLSIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsZXZlbFRocmVlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsVGhyZWUuZ2V0KGkpLnByaW50Q29uc29saWRhdGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICAgICAgICAgIGlmIChCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLkJBU1NfREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBtc2cpOwotICAgICAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC9CYXNzQ2xpZW50U3RhdGVNYWNoaW5lLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2Jhc3NjbGllbnQvQmFzc0NsaWVudFN0YXRlTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzVjZmE5Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC9CYXNzQ2xpZW50U3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJsdWV0b290aCBCYXNzY2xpZW50IFN0YXRlTWFjaGluZS4gVGhlcmUgaXMgb25lIGluc3RhbmNlIHBlciByZW1vdGUgZGV2aWNlLgotICogIC0gIkRpc2Nvbm5lY3RlZCIgYW5kICJDb25uZWN0ZWQiIGFyZSBzdGVhZHkgc3RhdGVzLgotICogIC0gIkNvbm5lY3RpbmciIGFuZCAiRGlzY29ubmVjdGluZyIgYXJlIHRyYW5zaWVudCBzdGF0ZXMgdW50aWwgdGhlCi0gKiAgICAgY29ubmVjdGlvbiAvIGRpc2Nvbm5lY3Rpb24gaXMgY29tcGxldGVkLgotICogIC0gIkNvbm5lY3RlZFByb2Nlc3NpbmciIGlzIGFuIGludGVybWVkaWF0ZSBzdGF0ZSB0byBlbnN1cmUsIHRoZXJlIGlzIG9ubHkKLSAqICAgIG9uZSBHYXR0IHRyYW5zYWN0aW9uIGZyb20gdGhlIHByb2ZpbGUgYXQgYW55IHBvaW50IG9mIHRpbWUKLSAqCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAoRGlzY29ubmVjdGVkKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIF4KLSAqICAgICAgICAgICAgICAgICAgIENPTk5FQ1QgfCAgICAgICB8IERJU0NPTk5FQ1RFRAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBWICAgICAgIHwKLSAqICAgICAgICAgICAgICAgICAoQ29ubmVjdGluZyk8LS0tPihEaXNjb25uZWN0aW5nKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIF4KLSAqICAgICAgICAgICAgICAgICBDT05ORUNURUQgfCAgICAgICB8IERJU0NPTk5FQ1QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgViAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbm5lY3RlZCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBeCi0gKiAgICAgICAgICAgICAgICAgR0FUVF9UWE4gIHwgICAgICAgfCBHQVRUX1RYTl9ET05FL0dBVFRfVFhOX1RJTUVPVVQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgViAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbm5lY3RlZFByb2Nlc3NpbmcpCi0gKiBOT1RFUzoKLSAqICAtIElmIHN0YXRlIG1hY2hpbmUgaXMgaW4gIkNvbm5lY3RpbmciIHN0YXRlIGFuZCB0aGUgcmVtb3RlIGRldmljZSBzZW5kcwotICogICAgRElTQ09OTkVDVCByZXF1ZXN0LCB0aGUgc3RhdGUgbWFjaGluZSB0cmFuc2l0aW9ucyB0byAiRGlzY29ubmVjdGluZyIgc3RhdGUuCi0gKiAgLSBTaW1pbGFybHksIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIGluICJEaXNjb25uZWN0aW5nIiBzdGF0ZSBhbmQgdGhlIHJlbW90ZSBkZXZpY2UKLSAqICAgIHNlbmRzIENPTk5FQ1QgcmVxdWVzdCwgdGhlIHN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbnMgdG8gIkNvbm5lY3RpbmciIHN0YXRlLgotICogIC0gV2hlbmV2ZXIgdGhlcmUgaXMgYW55IEdhdHQgV3JpdGUvcmVhZCwgU3RhdGUgbWFjaGluZSB3aWxsIG1vdmVkICJDb25uZWN0ZWRQcm9jZXNzaW5nIiBhbmQKLSAqICAgIGFsbCBvdGhlciByZXF1ZXN0cyAoYWRkLCB1cGRhdGUsIHJlbW92ZSBzb3VyY2UpIG9wZXJhdGlvbnMgd2lsbCBiZSBkZWZlcnJlZCBpbiAiQ29ubmVjdGVkUHJvY2Vzc2luZyIgc3RhdGUKLSAqICAtIE9uY2UgdGhlIGdhdHQgdHJhbnNhY3Rpb24gaXMgZG9uZSAob3IgYWZ0ZXIgYSBzcGVjaWZpZWQgdGltZW91dCBvZiBubyByZXNwb25zZSksIFN0YXRlIG1hY2hpbmUgd2lsbAotICogICAgbW92ZSBiYWNrIHRvICJDb25uZWN0ZWQiIGFuZCB0cnkgdG8gcHJvY2VzcyB0aGUgZGVmZXJyZWQgcmVxdWVzdHMgYXMgbmVlZGVkCi0gKgotICogICAgICAgICAgICAgICAgICAgIERJU0NPTk5FQ1QKLSAqICAgIChDb25uZWN0aW5nKSAtLS0tLS0tLS0tLS0tLS0+IChEaXNjb25uZWN0aW5nKQotICogICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0KLSAqICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1QKLSAqCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguYmM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWM7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVjb3JkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTeW5jSGVscGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci0KLS8vQ1NJUCByZWxhdGVkIGltcG9ydHMKLS8vLypfQ1NJUAotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5ncm91cGNsaWVudC5Hcm91cFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR3JvdXBDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5EZXZpY2VHcm91cDsKLS8vX0NTSVAqLwotCi0vLy8qX1ZDUAotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFZjcDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGgudmNwLlZjcENvbnRyb2xsZXI7Ci0vL19WQ1AqLwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuQmx1ZXRvb3RoTGVTY2FubmVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5QZXJpb2RpY0FkdmVydGlzaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5QZXJpb2RpY0FkdmVydGlzaW5nUmVwb3J0OwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlByb2ZpbGVTZXJ2aWNlOwotLypfUEFDUwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5wYWNzY2xpZW50LlBhY3NDbGllbnRTZXJ2aWNlOwotX1BBQ1MqLwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5TZXJ2aWNlRmFjdG9yeTsKLS8vLypfQk1TCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdC5Ccm9hZGNhc3RTZXJ2aWNlOwotLy9fQk1TKi8KLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5TdGF0ZU1hY2hpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcjsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5sYW5nLkJ5dGU7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLQotCi1maW5hbCBjbGFzcyBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lIGV4dGVuZHMgU3RhdGVNYWNoaW5lIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJhc3NDbGllbnRTdGF0ZU1hY2hpbmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBCQVNTX0RCRyA9IHRydWU7Ci0gICAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gQkFTU19EQkcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzV2hpdGVsaXN0ID0gZmFsc2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEJDQVNUX1JFQ0VJVkVSX1NUQVRFX0xFTkdUSCA9IDE1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9IDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHQVRUX1RYTl9QUk9DRVNTRUQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9CQVNTX0NIQVJBQ1RFUklTVElDUz0gNTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NDQU5fT0ZGTE9BRCA9IDY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTVE9QX1NDQU5fT0ZGTE9BRCA9IDc7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfQkNBU1RfU09VUkNFID0gODsKLSAgICBzdGF0aWMgZmluYWwgaW50IEFERF9CQ0FTVF9TT1VSQ0UgPSA5OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0JDQVNUX1NPVVJDRSA9IDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0JDQVNUX0NPREUgPSAxMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9CQ0FTVF9TT1VSQ0UgPSAxMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEdBVFRfVFhOX1RJTUVPVVQgPSAxMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBTWU5DX0FDVElWRV9USU1FT1VUID0gMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1NJUF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSAxNTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfVElNRU9VVCA9IDE2OwotCi0gICAgLy8zMCBzZWNzIHRpbWUgb3V0IGZvciBhbGwgZ2F0dCB3cml0ZXMKLSAgICBzdGF0aWMgZmluYWwgaW50IEdBVFRfVFhOX1RJTUVPVVRfTVMgPSAzMDAwMDsKLQotICAgIC8vMyBtaW4gdGltZSBvdXQgZm9yIGtlZXBpbmcgUFNZTkMgYWN0aXZlCi0gICAgc3RhdGljIGZpbmFsIGludCBQU1lOQ19BQ1RJVkVfVElNRU9VVF9NUyA9IDMqNjAwMDA7Ci0gICAgLy8yIHNlY3MgdGltZSBvdXQgYWNoaWV2aW5nIHBzeW5jCi0gICAgc3RhdGljIGZpbmFsIGludCBQU1lOQ19USU1FT1VUID0gMjAwOwotCi0gICAgaW50IE5VTV9PRl9CUk9BRENBU1RfUkVDRUlWRVJfU1RBVEVTID0gMDsKLQotICAgIHByaXZhdGUgZmluYWwgRGlzY29ubmVjdGVkIG1EaXNjb25uZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0ZWQgbUNvbm5lY3RlZDsKLSAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RpbmcgbUNvbm5lY3Rpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEaXNjb25uZWN0aW5nIG1EaXNjb25uZWN0aW5nOwotICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGVkUHJvY2Vzc2luZyBtQ29ubmVjdGVkUHJvY2Vzc2luZzsKLSAgICBwcml2YXRlIGludCBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGludCBtQ29ubmVjdFRpbWVvdXRNcyA9IDMwMDAwOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTVRVQ2hhbmdlUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb3ZlcnlJbml0aWF0ZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgQkNTZXJ2aWNlIG1TZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhHYXR0IG1CbHVldG9vdGhHYXR0ID0gbnVsbDsKLQotICAgIC8vQkFTUyBDaGFyYWN0ZXJpc3RpY3MgVVVJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVVJRCBCQVNTX1VVSUQgPSBVVUlELmZyb21TdHJpbmcoIjAwMDAxODRGLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgQkFTU19CQ0FTVF9BVURJT19TQ0FOX0NUUkxfUE9JTlQgPSBVVUlELmZyb21TdHJpbmcoIjAwMDAyQkM3LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgQkFTU19CQ0FTVF9SRUNFSVZFUl9TVEFURSA9IFVVSUQuZnJvbVN0cmluZygiMDAwMDJCQzgtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRCBDTElFTlRfQ0hBUkFDVEVSSVNUSUNfQ09ORklHID0gVVVJRC5mcm9tU3RyaW5nKAotICAgICAgICAgICAgICIwMDAwMjkwMi0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKLSAgICBwcml2YXRlIExpc3Q8Qmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljPiBtQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXM7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQ7Ci0gICAgLyprZXkgaXMgY29tYmluYXRpb24gb2Ygc291cmNlSWQsIEFkZHJlc3MgYW5kIGFkdlNpZCBmb3IgdGhpcyBoYXNobWFwKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBtQmxlQnJvYWRjYXN0U291cmNlSW5mb3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1GaXJzdFRpbWVCaXNEaXNjb3ZlcnkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtUEFTeW5jUmV0cnlDb3VudGVyID0gMDsKLSAgICBwcml2YXRlIFNjYW5SZXN1bHQgbVNjYW5SZXMgPSBudWxsOwotCi0gICAgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICBwcml2YXRlIFNlcnZpY2VGYWN0b3J5IG1GYWN0b3J5ID0gbmV3IFNlcnZpY2VGYWN0b3J5KCk7Ci0gICAgLy8vKl9CTVMKLSAgICBwcml2YXRlIEJyb2FkY2FzdFNlcnZpY2UgbUJBU2VydmljZSA9IG51bGw7Ci0gICAgLy9fQk1TKi8KLQotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIFJFTU9URV9TQ0FOX1NUT1AgPSB7MDB9OwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIFJFTU9URV9TQ0FOX1NUQVJUID0gezAxfTsKLSAgICBwcml2YXRlIGJ5dGUgQkFTU19BRERfU09VUkNFX09QQ09ERSA9IDB4MDI7Ci0gICAgcHJpdmF0ZSBieXRlIEJBU1NfVVBEQVRFX1NPVVJDRV9PUENPREUgPSAweDAzOwotICAgIHByaXZhdGUgYnl0ZSBCQVNTX1NFVF9CQ0FTVF9QSU5fT1BDT0RFID0gMHgwNDsKLSAgICBwcml2YXRlIGJ5dGUgQkFTU19SRU1PVkVfU09VUkNFX09QQ09ERSA9IDB4MDU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtX29mX3JlY2V2ZXJfc3RhdGVzID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgUElOX0NPREVfQ01EX0xFTiA9IDE4OwotICAgIHByaXZhdGUgZmluYWwgaW50IEJBU1NfTUFYX0JZVEVTID0gMTAwOwotICAgIHByaXZhdGUgaW50IG1QZW5kaW5nT3BlcmF0aW9uID0gLTE7Ci0gICAgcHJpdmF0ZSBieXRlIG1QZW5kaW5nU291cmNlSWQgPSAtMTsKLSAgICBwdWJsaWMgc3RhdGljIGJ5dGUgSU5WQUxJRF9TUkNfSUQgPSAtMTsKLSAgICBwcml2YXRlIGludCAgR0FUVF9UWE5fVE9VVF9FUlJPUiA9IC0xOwotICAgIHByaXZhdGUgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBtU2V0QnJvYWRjYXN0UElOU3JjSW5mbyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZXRCcm9hZGNhc3RDb2RlUGVuZGluZyA9IGZhbHNlOwotCi0gICAgLy90eXBlcyBvZiBjb21tYW5kIGZvciAgc2V0IGJyb2FkY2FzdCBQSU4gb3BlcmF0aW9uCi0gICAgcHVibGljIGludCBGUkVTSCA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgUVVFVUVEID0gMjsKLQotICAgIC8vdHlwZXMgb2YgY29tbWFuZCBmb3Igc2VsZWN0IGFuZCBhZGQgQnJvYWRjYXN0IHNvdXJjZSBvcGVyYXRpb25zCi0gICAgcHVibGljIGludCBBVVRPID0gMTsKLSAgICBwdWJsaWMgaW50IFVTRVIgPSAyOwotCi0gICAgLy90eXBlcyBvZiBvcGVyYXRpb24gZm9yIFNlbGVjdCBzb3VyY2UgdG8gZGV0ZXJtaW5lCi0gICAgLy9pZiBwc3luYyBhY2hpZXZlZCBvbiBiZWhhbGYgb2Ygc2luZ2xlIGRldmljZSBvciBtdWx0aXBsZSBkZXZpY2VzCi0gICAgcHVibGljIGludCBHUk9VUF9PUCA9IDE7Ci0gICAgcHVibGljIGludCBOT05fR1JPVVBfT1AgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDID0gMDsKLQotICAgIC8vU2VydmljZSBkYXRhIE9jdGV0MAotICAgIHByaXZhdGUgc3RhdGljIGludCBCUk9BRENBU1RfQURWX0FERFJFU1NfRE9OVF9NQVRDSEVTX0VYVF9BRFZfQUREUkVTUyA9IDB4MDAwMDAwMDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IEJST0FEQ0FTVF9BRFZfQUREUkVTU19ET05UX01BVENIRVNfU09VUkNFX0FEVl9BRERSRVNTID0gMHgwMDAwMDAwMjsKLQotICAgIC8vUHN5bmMgYW5kIFBBU1QgaW50ZXJmYWNlcwotICAgIHByaXZhdGUgUGVyaW9kaWNBZHZlcnRpc2luZ01hbmFnZXIgbVBlcmlvZGljQWR2TWFuYWdlcjsKLSAgICBwcml2YXRlIHN0YXRpYyBVVUlEIEJBU0lDX0FVRElPX1VVSUQgPSBVVUlELmZyb21TdHJpbmcoIjAwMDAxODUxLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXV0b0Fzc2lzdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTm9SZXZlcnNlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1BdXRvVHJpZ2dlcnJlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3luY2luZ09uQmVoYWxmT2ZHcm91cCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTm9TdG9wU2Nhbk9mZmxvYWQgPSBmYWxzZTsKLQotICAgIC8vQ1NFVCBpbnRlcmZhY2VzCi0gICAgLy8vKl9DU0lQCi0gICAgcHJpdmF0ZSBHcm91cFNlcnZpY2UgbVNldENvb3JkaW5hdG9yID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3NpcENvbm5lY3RlZCA9IGZhbHNlOwotICAgIC8vX0NTSVAqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QYWNzQXZhaWwgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlZk5vUEFTID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ob1Bhc3QgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vQ1NJUFJlY29ubiA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUHVibGljQWRkckZvcmNTcmMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlU0IgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZjcEZvckJyb2FkY2FzdCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBpbnQgQlJPQURDQVNUX1NPVVJDRV9JRF9MRU5HVEggPSAzOwotICAgIHByaXZhdGUgYnl0ZSBtVGVtcFNvdXJjZUlkID0gMDsKLSAgICAvL2Jyb2FkY2FzdCByZWNlaXZlciBzdGF0ZSBpbmRpY2llcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX1NSQ19JRF9JRFggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX1NSQ19BRERSX1RZUEVfSURYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkNBU1RfUkNWUl9TVEFURV9TUkNfQUREUl9TVEFSVF9JRFggPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX1NSQ19CQ0FTVF9JRF9TVEFSVF9JRFggPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX1NSQ19BRERSX1NJWkUgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX1NSQ19BRFZfU0lEX0lEWCA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJDQVNUX1JDVlJfU1RBVEVfUEFfU1lOQ19JRFggPSAxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkNBU1RfUkNWUl9TVEFURV9FTkNfU1RBVFVTX0lEWCA9IDEzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX0JBRENPREVfU1RBUlRfSURYID0gMTQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJDQVNUX1JDVlJfU1RBVEVfQkFEQ09ERV9TSVpFID0gMTY7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX0JJU19TWU5DX1NUQVJUX0lEWCA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX0JJU19TWU5DX1NJWkUgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQ0FTVF9SQ1ZSX1NUQVRFX01FVEFEQVRBX0xFTkdUSF9JRFggPSAxNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkNBU1RfUkNWUl9TVEFURV9NRVRBREFUQV9TVEFSVF9JRFggPSAxNjsKLSAgICBCYXNzQ2xpZW50U3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJDU2VydmljZSBzdmMsCi0gICAgICAgICAgICBMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgIHN1cGVyKFRBRyArICIoIiArIGRldmljZS50b1N0cmluZygpICsgIikiLCBsb29wZXIpOwotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBtU2VydmljZSA9IHN2YzsKLQotICAgICAgICBtRGlzY29ubmVjdGVkID0gbmV3IERpc2Nvbm5lY3RlZCgpOwotICAgICAgICBtRGlzY29ubmVjdGluZyA9IG5ldyBEaXNjb25uZWN0aW5nKCk7Ci0gICAgICAgIG1Db25uZWN0ZWQgPSBuZXcgQ29ubmVjdGVkKCk7Ci0gICAgICAgIG1Db25uZWN0aW5nID0gbmV3IENvbm5lY3RpbmcoKTsKLSAgICAgICAgbUNvbm5lY3RlZFByb2Nlc3NpbmcgPSBuZXcgIENvbm5lY3RlZFByb2Nlc3NpbmcoKTsKLQotICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RpbmcpOwotICAgICAgICBhZGRTdGF0ZShtQ29ubmVjdGVkKTsKLSAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmcpOwotICAgICAgICBhZGRTdGF0ZShtQ29ubmVjdGVkUHJvY2Vzc2luZyk7Ci0KLSAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICBtQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYz4oKTsKLSAgICAgICAgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm9zID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQmxlQnJvYWRjYXN0U291cmNlSW5mbz4oKTsKLQotICAgICAgICAvL1BTWU5DIGFuZCBQQVNUIGluc3RhbmNlcwotICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgaWYgKG1CbHVldG9vdGhBZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QZXJpb2RpY0Fkdk1hbmFnZXIgPSBtQmx1ZXRvb3RoQWRhcHRlci5nZXRQZXJpb2RpY0FkdmVydGlzaW5nTWFuYWdlcigpOwotICAgICAgICB9Ci0gICAgICAgIC8vLypfQk1TCi0gICAgICAgIG1CQVNlcnZpY2UgPSBCcm9hZGNhc3RTZXJ2aWNlLmdldEJyb2FkY2FzdFNlcnZpY2UoKTsKLSAgICAgICAgLy9fQk1TKi8KLQotICAgICAgICBtTm9SZXZlcnNlID0gU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0Lm5SZXZlcnNlIiwgZmFsc2UpOwotICAgICAgICBtQXV0b0Fzc2lzdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5hdXRvYXNzaXN0IiwgZmFsc2UpOwotICAgICAgICBtSXNXaGl0ZWxpc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQud2wiLCB0cnVlKTsKLSAgICAgICAgbURlZk5vUEFTID0gU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmRlZk5vUEFTIiwgZmFsc2UpOwotICAgICAgICBtTm9QYXN0ID0gU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0Lm5vUGFzdCIsIGZhbHNlKTsKLSAgICAgICAgbU5vQ1NJUFJlY29ubiA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5ub0NzaXBSZWMiLCBmYWxzZSk7Ci0gICAgICAgIG1QdWJsaWNBZGRyRm9yY1NyYyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5wQWRkckZvcmNTb3VyY2UiLCB0cnVlKTsKLSAgICAgICAgbUZvcmNlU0IgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQuZm9yY2VTQiIsIGZhbHNlKTsKLSAgICAgICAgbVZjcEZvckJyb2FkY2FzdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC52Y3BGb3JCcm9hZGNhc3QiLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBtYWtlKEJsdWV0b290aERldmljZSBkZXZpY2UsIEJDU2VydmljZSBzdmMsCi0gICAgICAgICAgICBMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm1ha2UgZm9yIGRldmljZSAiICsgZGV2aWNlKTsKLSAgICAgICAgQmFzc0NsaWVudFN0YXRlTWFjaGluZSBCYXNzY2xpZW50U20gPSBuZXcgQmFzc0NsaWVudFN0YXRlTWFjaGluZShkZXZpY2UsIHN2YywKLSAgICAgICAgICAgICAgICBsb29wZXIpOwotICAgICAgICBCYXNzY2xpZW50U20uc3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIEJhc3NjbGllbnRTbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1F1aXQoKSB7Ci0gICAgICAgIGxvZygiZG9RdWl0IGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBxdWl0Tm93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgbG9nKCJjbGVhbnVwIGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBjbGVhckNoYXJzQ2FjaGUoKTsKLQotICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCJkaXNjb25uZWN0IGdhdHQiKTsKLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmNsb3NlKCk7Ci0gICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgbVBlbmRpbmdPcGVyYXRpb24gPSAtMTsKLSAgICAgICAgbVBlbmRpbmdTb3VyY2VJZCA9IC0xOwotICAgIH0KLQotICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gZ2V0QnJvYWRjYXN0U291cmNlSW5mb0ZvclNvdXJjZURldmljZSAoQmx1ZXRvb3RoRGV2aWNlIHNyY0RldmljZSkgewotICAgICAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+IGN1cnJlbnRTb3VyY2VJbmZvcyA9Ci0gICAgICAgICAgICAgICAgZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24oKTsKLSAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGN1cnJlbnRTb3VyY2VJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGN1cnJlbnRTb3VyY2VJbmZvcy5nZXQoaSkuZ2V0U291cmNlRGV2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLmVxdWFscyhzcmNEZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgc3JjSW5mbyA9IGN1cnJlbnRTb3VyY2VJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0QnJvYWRjYXN0U291cmNlSW5mb0ZvclNvdXJjZURldmljZTogcmV0dXJucyBmb3I6ICIgKyBzcmNEZXZpY2UgKyAiJnNyY0luZm8iICsgc3JjSW5mbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNyY0luZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgIH0KLQotICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gZ2V0QnJvYWRjYXN0U291cmNlSW5mb0ZvclNvdXJjZUlkIChpbnQgc3JjSWQpIHsKLSAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBjdXJyZW50U291cmNlSW5mb3MgPQotICAgICAgICAgICAgICAgIGdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKCk7Ci0gICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbyA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxjdXJyZW50U291cmNlSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGludCBzSWQgPSBjdXJyZW50U291cmNlSW5mb3MuZ2V0KGkpLmdldFNvdXJjZUlkKCk7Ci0gICAgICAgICAgICBpZiAoc3JjSWQgPT0gc0lkKSB7Ci0gICAgICAgICAgICAgICAgc3JjSW5mbyA9IGN1cnJlbnRTb3VyY2VJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0QnJvYWRjYXN0U291cmNlSW5mb0ZvclNvdXJjZUlkOiByZXR1cm5zIGZvcjogIiArIHNyY0lkICsgIiZzcmNJbmZvIiArIHNyY0luZm8pOwotICAgICAgICAgICAgICAgIHJldHVybiBzcmNJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICB9Ci0KLSAgICB2b2lkIHBhcnNlQmFzZURhdGEoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN5bmNIYW5kbGUsIGJ5dGVbXSBzZXJ2aWNlRGF0YSkgewotICAgICAgICBsb2coInBhcnNlQmFzZURhdGEiICsgQXJyYXlzLnRvU3RyaW5nKHNlcnZpY2VEYXRhKSk7Ci0gICAgICAgIEJhc2VEYXRhIGJhc2VfID0gbmV3IEJhc2VEYXRhKHNlcnZpY2VEYXRhKTsKLSAgICAgICAgaWYgKGJhc2VfICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUJBU0Uoc3luY0hhbmRsZSwgYmFzZV8pOwotICAgICAgICAgICAgYmFzZV8ucHJpbnQoKTsKLSAgICAgICAgICAgIGJhc2VfLnByaW50Q29uc29saWRhdGVkKCk7Ci0gICAgICAgICAgICBpZiAobUF1dG9UcmlnZ2VycmVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZEJyb2FkY2FzdFNvdXJjZVNlbGVjdGVkQ2FsbGJhY2soZGV2aWNlLCBiYXNlXy5nZXRCcm9hZGNhc3RDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfU1VDQ0VTUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vc3VjY2Vzc2Z1bGwgYXV0byBwZXJpb2RpYyBzeW5jaHJuaXphdGlvbiB3aXRoIHNvdXJjZQotICAgICAgICAgICAgICAgIGxvZygiYXV0byB0cmlnZ2VyZWQgYXNzaXN0Iik7Ci0gICAgICAgICAgICAgICAgbUF1dG9UcmlnZ2VycmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy9wZXJmb3JtIFBBU1Qgd2l0aCB0aGlzIGRldmljZQotICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBzcmNEZXZpY2UgPSBtU2VydmljZS5nZXREZXZpY2VGb3JTeW5jSGFuZGxlKHN5bmNIYW5kbGUpOwotICAgICAgICAgICAgICAgIGlmIChzcmNEZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8gPSBnZXRCcm9hZGNhc3RTb3VyY2VJbmZvRm9yU291cmNlRGV2aWNlKHNyY0RldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQQVN5bmNTdGF0ZShzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBdXRvYXNzaXN0OiBubyBtYXRjaGluZyBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VlbXMgQkFTRSBpcyBub3QgaW4gcGFyc2FibGUgZm9ybWF0Iik7Ci0gICAgICAgICAgICBpZiAobUF1dG9UcmlnZ2VycmVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZEJyb2FkY2FzdFNvdXJjZVNlbGVjdGVkQ2FsbGJhY2soZGV2aWNlLCBiYXNlXy5nZXRCcm9hZGNhc3RDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19JTlZBTElEX1NPVVJDRV9TRUxFQ1RFRCk7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIHNyY0RldmljZSA9IG1TZXJ2aWNlLmdldERldmljZUZvclN5bmNIYW5kbGUoc3luY0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luYyhzcmNEZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXV0b1RyaWdnZXJyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcGFyc2VTY2FuUmVjb3JkKGludCBzeW5jSGFuZGxlLCBTY2FuUmVjb3JkIHJlY29yZCkgewotICAgICAgICBsb2coInBhcnNlU2NhblJlY29yZCIgKyByZWNvcmQpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2Ugc3JjRGV2aWNlID0gbVNlcnZpY2UuZ2V0RGV2aWNlRm9yU3luY0hhbmRsZShzeW5jSGFuZGxlKTsKLSAgICAgICAgTWFwPFBhcmNlbFV1aWQsIGJ5dGVbXT4gYm1zQWR2RGF0YU1hcCA9IHJlY29yZC5nZXRTZXJ2aWNlRGF0YSgpOwotICAgICAgICBpZiAoYm1zQWR2RGF0YU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxQYXJjZWxVdWlkLGJ5dGVbXT4gZW50cnkgOiBibXNBZHZEYXRhTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIlBhcmNlbFVVaWQgPSAiICsgZW50cnkuZ2V0S2V5KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBWYWx1ZSA9ICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgbG9nKCJibXNBZHZEYXRhTWFwIGlzIG51bGwiKTsKLSAgICAgICAgICAgaWYgKG1BdXRvVHJpZ2dlcnJlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZEJyb2FkY2FzdFNvdXJjZVNlbGVjdGVkQ2FsbGJhY2sobURldmljZSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX0lOVkFMSURfU09VUkNFX1NFTEVDVEVEKTsKLSAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMoc3JjRGV2aWNlKTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIG1BdXRvVHJpZ2dlcnJlZCA9IGZhbHNlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsVXVpZCBiYXNpY0F1ZGlvVXVpZCA9IG5ldyBQYXJjZWxVdWlkKEJBU0lDX0FVRElPX1VVSUQpOwotICAgICAgICBieXRlW10gYm1zQWR2RGF0YSA9IHJlY29yZC5nZXRTZXJ2aWNlRGF0YShiYXNpY0F1ZGlvVXVpZCk7Ci0gICAgICAgIGlmIChibXNBZHZEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcChibXNBZHZEYXRhKTsKLSAgICAgICAgICAgIHBhcnNlQmFzZURhdGEobURldmljZSwgc3luY0hhbmRsZSwgYm1zQWR2RGF0YSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIk5vIHNlcnZpY2UgZGF0YSBpbiBTY2FuIHJlY29yZCIpOwotICAgICAgICAgICAgaWYgKG1BdXRvVHJpZ2dlcnJlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKG1EZXZpY2UsIG51bGwsCi0gICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19JTlZBTElEX1NPVVJDRV9TRUxFQ1RFRCk7Ci0gICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luYyhzcmNEZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXV0b1RyaWdnZXJyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qTG9jYWwgUHVibGljIGFkZHJlc3MgYmFzZWQgY2hlY2sKLSAgICBVc2UgdGhpcyBwcmlvciB0byBhZGRpdGlvbiBvZiBCcm9hZGNhc3Qgc291cmNlKi8KLSAgICBib29sZWFuIGlzTG9jYWxCcm9hZGNhc3RTb3VyY2UgKEJsdWV0b290aERldmljZSBkZXZpY2UpCi0gICAgewotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGJ0QWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBidEFkYXB0ZXIuZ2V0QWRkcmVzcygpLmVxdWFscyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLQotICAgICAgICBsb2coImlzTG9jYWxCcm9hZGNhc3RTb3VyY2UgcmV0dXJucyIgK3JldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRCcm9hZGNhc3RTb3VyY2VJbmZvKEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbykgewotICAgICAgICBib29sZWFuIHJldCA9IHRydWU7Ci0gICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gY3VycmVudFNvdXJjZUluZm9zID0KLSAgICAgICAgICAgIGdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKCk7Ci0gICAgICAgIExvZy5pKFRBRywgImlucHV0IHNyY0luZm86ICIgKyBzcmNJbmZvKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGN1cnJlbnRTb3VyY2VJbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAic3JjSW5mbzogIFsiICsgaSArICJdIiArIGN1cnJlbnRTb3VyY2VJbmZvcy5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKHNyY0luZm8ubWF0Y2hlcyhjdXJyZW50U291cmNlSW5mb3MuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKCJpc1ZhbGlkQnJvYWRjYXN0U291cmNlSW5mbyByZXR1cm5zOiAiICsgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RCcm9hZGNhc3RTb3VyY2UgKFNjYW5SZXN1bHQgc2NhblJlcywgYm9vbGVhbiBncm91cE9wLCBib29sZWFuIGF1dG9UcmlnZ2VycmVkKSB7Ci0gICAgICAgIExvZy5pKFRBRywgInNlbGVjdEJyb2FkY2FzdFNvdXJjZSBmb3IgIiArICJpc0dyb3VwT3A6IiArIGdyb3VwT3ApOwotICAgICAgICBMb2cuaShUQUcsICJTY2FuUmVzdWx0ICIgKyBzY2FuUmVzKTsKLSAgICAgICAgaW50IGJyb2FkY2FzdElkID0gQkNTZXJ2aWNlLklOVkFMSURfQlJPQURDQVNUX0lEOwotICAgICAgICBpZiAoaXNMb2NhbEJyb2FkY2FzdFNvdXJjZShzY2FuUmVzLmdldERldmljZSgpKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICBtQXV0b1RyaWdnZXJyZWQgPSBhdXRvVHJpZ2dlcnJlZDsKLSAgICAgICAgICAgIG1GaXJzdFRpbWVCaXNEaXNjb3ZlcnkgPSB0cnVlOwotICAgICAgICAgICAgbVBBU3luY1JldHJ5Q291bnRlciA9IDE7Ci0gICAgICAgICAgICAvL0NhY2hlIFNjYW4gcmVzIGZvciBSZXRyeXMKLSAgICAgICAgICAgIG1TY2FuUmVzID0gc2NhblJlczsKLSAgICAgICAgICAgIC8qVGhpcyBpcyBhbiBvdmVycmlkZSBjYXNlCi0gICAgICAgICAgICAgIGlmIFByZXZpb3VzIHN5bmMgaXMgc3RpbGwgYWN0aXZlLCBjYW5jZWwgSXQKLSAgICAgICAgICAgICAgQnV0IGRvbnQgc3RvcCB0aGUgU2NhbiBvZmZsb2FkIGFzIHdlIHN0aWxsIHRyeWluZyB0byBhc3Npc3QgcmVtb3RlKi8KLSAgICAgICAgICAgIG1Ob1N0b3BTY2FuT2ZmbG9hZCA9IHRydWU7Ci0gICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jKG51bGwpOwotICAgICAgICAgICAgbVNlcnZpY2UuZ2V0QmFzc1V0aWxzKCkubGVTY2FuQ29udHJvbCh0cnVlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICBtUGVyaW9kaWNBZHZNYW5hZ2VyLnJlZ2lzdGVyU3luYyhzY2FuUmVzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lOQ19USU1FT1VULCBtUGVyaW9kaWNBZHZDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICBtU3luY2luZ09uQmVoYWxmT2ZHcm91cCA9IGdyb3VwT3A7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZWdpc3RlclN5bmM6SWxsZWdhbEFyZ3VlbWVudEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKG1EZXZpY2UsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX0lOVkFMSURfU09VUkNFX1NFTEVDVEVEKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zdG9wU2Nhbk9mZmxvYWRJbnRlcm5hbChtRGV2aWNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy91cGRhdGluZyBtYWlubHkgZm9yIEFkZHJlc3MgdHlwZSBhbmQgUEEgSW50ZXJ2YWwgaGVyZQotICAgICAgICAgICAgLy9leHRyYWN0IEJyb2FkY2FzdElkIGZyb20gU2NhblJlc3VsdAotICAgICAgICAgICAgU2NhblJlY29yZCBzY2FuUmVjb3JkID0gc2NhblJlcy5nZXRTY2FuUmVjb3JkKCk7Ci0gICAgICAgICAgICBpZiAoc2NhblJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFBhcmNlbFV1aWQsIGJ5dGVbXT4gbGlzdE9mVXVpZHMgPSBzY2FuUmVjb3JkLmdldFNlcnZpY2VEYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3RPZlV1aWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobGlzdE9mVXVpZHMuY29udGFpbnNLZXkoUGFyY2VsVXVpZC5mcm9tU3RyaW5nKEJhc3NVdGlscy5CQUFTX1VVSUQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJJZCA9IGxpc3RPZlV1aWRzLmdldChQYXJjZWxVdWlkLmZyb21TdHJpbmcoQmFzc1V0aWxzLkJBQVNfVVVJRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0SWQgPSAoMHgwMEZGMDAwMCAmIChiSWRbMF0gPDwgMTYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdElkIHw9ICgweDAwMDBGRjAwICYgKGJJZFsxXSA8PCA4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RJZCB8PSAoMHgwMDAwMDBGRiAmIGJJZFsyXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlUEFSZXN1bHRzTWFwKHNjYW5SZXMuZ2V0RGV2aWNlKCksIHNjYW5SZXMuZ2V0QWRkcmVzc1R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQkNTZXJ2aWNlLklOVkFMSURfU1lOQ19IQU5ETEUsIEJDU2VydmljZS5JTlZBTElEX0FEVl9TSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXMuZ2V0UGVyaW9kaWNBZHZlcnRpc2luZ0ludGVydmFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsb2coImNvbG9jYXRlZCBjYXNlIik7Ci0gICAgICAgICAgICBpZiAoYXV0b1RyaWdnZXJyZWQpIHsKLSAgICAgICAgICAgICAgICBsb2coInNob3VsZCBuZXZlciBoYXBwZW4hISEiKTsKLSAgICAgICAgICAgICAgICAvL2lnbm9yZQotICAgICAgICAgICAgICAgIG1BdXRvVHJpZ2dlcnJlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8vKl9CTVMKLSAgICAgICAgICAgIGlmIChtQkFTZXJ2aWNlID09IG51bGwgfHwgbUJBU2VydmljZS5pc0Jyb2FkY2FzdEFjdGl2ZSgpICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjb2xvY2F0ZWQgc291cmNlIGhhbmRsZSB1bmF2YWlsYWJsZSBPUiBub3QgaW4gc3RyZWFtaW5nIik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZEJyb2FkY2FzdFNvdXJjZVNlbGVjdGVkQ2FsbGJhY2sobURldmljZSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfQ09MT0NBVEVEX1NSQ19VTkFWQUlMQUJMRSk7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc3RvcFNjYW5PZmZsb2FkSW50ZXJuYWwobURldmljZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBjb2xvY2F0ZWRBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgICAgIGludCBjb2xvY2F0ZWRBZGRyZXNzVHlwZTsKLSAgICAgICAgICAgIGlmIChtUHVibGljQWRkckZvcmNTcmMgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgIGNvbG9jYXRlZEFkZHJlc3MgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgICAgIGNvbG9jYXRlZEFkZHJlc3NUeXBlID0gQlJPQURDQVNUX0FTU0lTVF9BRERSRVNTX1RZUEVfUFVCTElDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2xvY2F0ZWRBZGRyZXNzID0gbUJBU2VydmljZS5Ccm9hZGNhc3RHZXRBZHZBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgY29sb2NhdGVkQWRkcmVzc1R5cGUgPSBtQkFTZXJ2aWNlLkJyb2FkY2FzdEdldEFkdkFkZHJUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcGFJbnRlcnZhbCA9IDB4MDAwMEZGRkY7Ci0gICAgICAgICAgICBwYUludGVydmFsID0gbUJBU2VydmljZS5Ccm9hZGNhc3RHZXRBZHZJbnRlcnZhbCgpOwotCi0gICAgICAgICAgICBpZiAoY29sb2NhdGVkQWRkcmVzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJjb2xvY2F0ZWRBZGRyZXNzIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZW5kQnJvYWRjYXN0U291cmNlU2VsZWN0ZWRDYWxsYmFjayhtRGV2aWNlLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19DT0xPQ0FURURfU1JDX1VOQVZBSUxBQkxFKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zdG9wU2Nhbk9mZmxvYWRJbnRlcm5hbChtRGV2aWNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGNvbG9jYXRlZFNyY0RldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKS5nZXRSZW1vdGVEZXZpY2UoY29sb2NhdGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBsb2coImNhY2hpbmcgbG9jYWwgQnJvYWNhc3QgZGV0YWlsczogIiArIGNvbG9jYXRlZFNyY0RldmljZSk7Ci0KLSAgICAgICAgICAgIC8vYWR2U2lkIGlzIHNhbWUgYXMgYWR2SGFuZGxlIGZvciBjb2xsb2NhdGVkIGNhc2UKLSAgICAgICAgICAgIGJ5dGVbXSBicm9hZGNhc3RfaWQgPSBtQkFTZXJ2aWNlLmdldEJyb2FkY2FzdElkKCk7Ci0gICAgICAgICAgICBicm9hZGNhc3RJZCA9ICgweDAwRkYwMDAwICYgKGJyb2FkY2FzdF9pZFsyXSA8PCAxNikpOwotICAgICAgICAgICAgYnJvYWRjYXN0SWQgfD0gKDB4MDAwMEZGMDAgJiAoYnJvYWRjYXN0X2lkWzFdIDw8IDgpKTsKLSAgICAgICAgICAgIGJyb2FkY2FzdElkIHw9ICgweDAwMDAwMEZGICYgYnJvYWRjYXN0X2lkWzBdKTsKLQotICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlUEFSZXN1bHRzTWFwKGNvbG9jYXRlZFNyY0RldmljZSwgY29sb2NhdGVkQWRkcmVzc1R5cGUsCi0gICAgICAgICAgICAgICAgbUJBU2VydmljZS5Ccm9hZGNhdEdldEFkdkhhbmRsZSgpLAotICAgICAgICAgICAgICAgIG1CQVNlcnZpY2UuQnJvYWRjYXRHZXRBZHZIYW5kbGUoKSwKLSAgICAgICAgICAgICAgICBwYUludGVydmFsLAotICAgICAgICAgICAgICAgIGJyb2FkY2FzdElkKTsKLSAgICAgICAgICAgICAgICBCYXNlRGF0YSBsb2NhbEJhc2UgPSBuZXcgQmFzZURhdGEobUJBU2VydmljZS5nZXROdW1TdWJHcm91cHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CQVNlcnZpY2UuQnJvYWRjYXN0R2V0QmlzSW5mbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJBU2VydmljZS5Ccm9hZGNhc3RHZXRNZXRhSW5mbygpKTsKLSAgICAgICAgICAgICAgICBsb2NhbEJhc2UucHJpbnRDb25zb2xpZGF0ZWQoKTsKLSAgICAgICAgICAgICAgICAvL1VzZSBhZHZIYW5kbGUgdG8gY2FoY2UgQmFzZQotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUJBU0UobUJBU2VydmljZS5Ccm9hZGNhdEdldEFkdkhhbmRsZSgpLCBsb2NhbEJhc2UpOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKG1EZXZpY2UsIGxvY2FsQmFzZS5nZXRCcm9hZGNhc3RDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19TVUNDRVNTKTsKLSAgICAgICAgICAgIC8vX0JNUyovCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFjdGl2ZVN5bmMoQmx1ZXRvb3RoRGV2aWNlIHNvdXJjZURldikgewotICAgICAgICBsb2coImNhbmNlbEFjdGl2ZVN5bmMiKTsKLSAgICAgICAgYm9vbGVhbiBpc0NhbmNlbFN5bmNOZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGFjdGl2ZVN5bmNlZFNyYyA9IG1TZXJ2aWNlLmdldEFjdGl2ZVN5bmNlZFNvdXJjZShtRGV2aWNlKTsKLSAgICAgICAgaWYgKGFjdGl2ZVN5bmNlZFNyYyAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKHNvdXJjZURldiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXNDYW5jZWxTeW5jTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihhY3RpdmVTeW5jZWRTcmMuZXF1YWxzKHNvdXJjZURldikpIHsKLSAgICAgICAgICAgICAgICBpc0NhbmNlbFN5bmNOZWVkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0NhbmNlbFN5bmNOZWVkZWQpIHsKLSAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKFBTWU5DX0FDVElWRV9USU1FT1VUKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJjYWxsaW5nIHVucmVnaXN0ZXJTeW5jIik7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZGljQWR2TWFuYWdlci51bnJlZ2lzdGVyU3luYyhtUGVyaW9kaWNBZHZDYWxsYmFjayk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJ1bnJlZ2lzdGVyU3luYzpJbGxlZ2FsQXJndWVtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXJ2aWNlLmNsZWFyUEFSZXN1bHRzKGFjdGl2ZVN5bmNlZFNyYyk7Ci0gICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVTeW5jZWRTb3VyY2UobURldmljZSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAobU5vU3RvcFNjYW5PZmZsb2FkICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAvL3RyaWdnZXIgc2NhbiBzdG9wIGhlcmUKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zdG9wU2Nhbk9mZmxvYWRJbnRlcm5hbChtRGV2aWNlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbU5vU3RvcFNjYW5PZmZsb2FkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogSW50ZXJuYWwgcGVyaW9kYyBBZHZlcnRpc2luZyBtYW5hZ2VyIGNhbGxiYWNrCi0gICAgICAqCi0gICAgICAqLwotICAgICBwcml2YXRlIFBlcmlvZGljQWR2ZXJ0aXNpbmdDYWxsYmFjayBtUGVyaW9kaWNBZHZDYWxsYmFjayA9IG5ldyBQZXJpb2RpY0FkdmVydGlzaW5nQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNFc3RhYmxpc2hlZChpbnQgc3luY0hhbmRsZSwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICBpbnQgYWR2ZXJ0aXNpbmdTaWQsIGludCBza2lwLCBpbnQgdGltZW91dCwKLSAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICBsb2cgKCJvblN5bmNFc3RhYmxpc2hlZCIgKyAic3luY0hhbmRsZSIgKyBzeW5jSGFuZGxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImRldmljZSIgKyBkZXZpY2UgKyAiYWR2ZXJ0aXNpbmdTaWQiICsgYWR2ZXJ0aXNpbmdTaWQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcCIgKyBza2lwICsgInRpbWVvdXQiICsgdGltZW91dCArICJzdGF0dXMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAvL3R1cm4gb2ZmIHRoZSBMZVNjYW4gb25jZSBzeW5jIGVzdGQKLSAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRCYXNzVXRpbHMoKS5sZVNjYW5Db250cm9sKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vdXBhdGVzIHN5bmNIYW5kbGUsIGFkdlNpZAotICAgICAgICAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVQQVJlc3VsdHNNYXAoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJDU2VydmljZS5JTlZBTElEX0FEVl9BRERSRVNTX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3luY0hhbmRsZSwgYWR2ZXJ0aXNpbmdTaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQkNTZXJ2aWNlLklOVkFMSURfQURWX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJDU2VydmljZS5JTlZBTElEX0JST0FEQ0FTVF9JRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChQU1lOQ19BQ1RJVkVfVElNRU9VVCwgUFNZTkNfQUNUSVZFX1RJTUVPVVRfTVMpOwotICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVTeW5jZWRTb3VyY2UobURldmljZSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coImZhaWxlZCB0byBzeW5jIHRvIFBBIiArIG1QQVN5bmNSZXRyeUNvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICBtU2NhblJlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXV0b1RyaWdnZXJyZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKG1EZXZpY2UsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX1NPVVJDRV9VTkFWQUlMQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zdG9wU2Nhbk9mZmxvYWRJbnRlcm5hbChtRGV2aWNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUF1dG9UcmlnZ2VycmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBlcmlvZGljQWR2ZXJ0aXNpbmdSZXBvcnQoUGVyaW9kaWNBZHZlcnRpc2luZ1JlcG9ydCByZXBvcnQpIHsKLSAgICAgICAgICAgICAgIGxvZyggIm9uUGVyaW9kaWNBZHZlcnRpc2luZ1JlcG9ydCIpOwotICAgICAgICAgICAgICAgLy9QYXJzZSB0aGUgQklTIGluZGljaWVzIGZyb20gcmVwb3J0J3Mgc2VydmljZSBkYXRhCi0gICAgICAgICAgICAgICBpZiAobUZpcnN0VGltZUJpc0Rpc2NvdmVyeSkgewotICAgICAgICAgICAgICAgICAgIHBhcnNlU2NhblJlY29yZChyZXBvcnQuZ2V0U3luY0hhbmRsZSgpLHJlcG9ydC5nZXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgIG1GaXJzdFRpbWVCaXNEaXNjb3ZlcnkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgcHVibGljIHZvaWQgb25TeW5jTG9zdChpbnQgc3luY0hhbmRsZSkgewotICAgICAgICAgICAgICAgbG9nKCAiT25TeW5jTG9zdCIgKyBzeW5jSGFuZGxlKTsKLSAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBzcmNEZXZpY2UgPSBtU2VydmljZS5nZXREZXZpY2VGb3JTeW5jSGFuZGxlKHN5bmNIYW5kbGUpOwotICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luYyhzcmNEZXZpY2UpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgcHVibGljIHZvaWQgb25TeW5jVHJhbnNmZXJlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgIGxvZygic3luYyB0cmFuc2ZlcnJlZDoiICsgZGV2aWNlICsgIiA6ICIgKyBzdGF0dXMpOwotICAgICAgICAgICB9Ci0gICAgICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3RSZWNlaXZlclN0YXRlKEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3RhdGUsIGludCBpbmRleCwgaW50IG1heF9udW1fc3JjSW5mb3MpIHsKLSAgICAgICAgbG9nKCJicm9hZGNhc3RSZWNlaXZlclN0YXRlOiAiICsgbURldmljZSk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlci5BQ1RJT05fQlJPQURDQVNUX1NPVVJDRV9JTkZPKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1EZXZpY2UpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmxlQnJvYWRjYXN0U291cmNlSW5mby5FWFRSQV9TT1VSQ0VfSU5GTywgc3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmxlQnJvYWRjYXN0U291cmNlSW5mby5FWFRSQV9TT1VSQ0VfSU5GT19JTkRFWCwgaW5kZXgpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmxlQnJvYWRjYXN0U291cmNlSW5mby5FWFRSQV9NQVhfTlVNX1NPVVJDRV9JTkZPUywgbWF4X251bV9zcmNJbmZvcyk7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3RBc1VzZXIoaW50ZW50LCBVc2VySGFuZGxlLkFMTCwgQkxVRVRPT1RIX0NPTk5FQ1QsCi0gICAgICAgICAgICAgIFV0aWxzLmdldFRlbXBBbGxvd2xpc3RCcm9hZGNhc3RPcHRpb25zKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShmaW5hbCBieXRlW10gZGF0YSl7Ci0gICAgICAgIHJldHVybiBJbnRTdHJlYW0ucmFuZ2UoMCwgZGF0YS5sZW5ndGgpLnBhcmFsbGVsKCkuYWxsTWF0Y2goaSAtPiBkYXRhW2ldID09IDApOwotICAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQQVN5bmNTdGF0ZShCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8pIHsKLSAgICAgICBsb2coInByb2Nlc3NQQVN5bmNTdGF0ZSIgKyBzcmNJbmZvKTsKLSAgICAgICBpbnQgc2VydmljZURhdGEgPSAwOwotICAgICAgIGlmIChzcmNJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgTG9nLmUoVEFHLCAicHJvY2Vzc1BBU3luY1N0YXRlOiBzcmNJbmZvIGlzIG51bGwiKTsKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgIH0KLSAgICAgICBpZiAoc3JjSW5mby5nZXRNZXRhZGF0YVN5bmNTdGF0ZSgpID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX1NZTkNJTkZPX1JFUSkgewotICAgICAgICAgICBsb2coIkluaXRpYXRlIFBBU1QgcHJvY2VkdXJlIik7Ci0gICAgICAgICAgICBCQ1NlcnZpY2UuUEFSZXN1bHRzIHJlcyA9IG1TZXJ2aWNlLmdldFBBUmVzdWx0cyhzcmNJbmZvLmdldFNvdXJjZURldmljZSgpKTsKLSAgICAgICAgICAgIGlmIChpc0FkZGVkQnJvYWRjYXN0U291cmNlSXNMb2NhbChzcmNJbmZvLmdldFNvdXJjZURldmljZSgpKSAmJgotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmlzTG9jYWxCcm9hZGNhc3RpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlBvcHVsYXRlIGNvbG9jYXRlZCBQQSBhbmQgaW5pdGlhdGUgUEFTVCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjb2xvY2F0ZWRBZGRyZXNzVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1QdWJsaWNBZGRyRm9yY1NyYyA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvY2F0ZWRBZGRyZXNzVHlwZSA9IEJST0FEQ0FTVF9BU1NJU1RfQUREUkVTU19UWVBFX1BVQkxJQzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9jYXRlZEFkZHJlc3NUeXBlID0gbUJBU2VydmljZS5Ccm9hZGNhc3RHZXRBZHZBZGRyVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBicm9hZGNhc3RJZDsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJyb2FkY2FzdF9pZCA9IG1CQVNlcnZpY2UuZ2V0QnJvYWRjYXN0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0SWQgPSAoMHgwMEZGMDAwMCAmIChicm9hZGNhc3RfaWRbMl0gPDwgMTYpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0SWQgfD0gKDB4MDAwMEZGMDAgJiAoYnJvYWRjYXN0X2lkWzFdIDw8IDgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0SWQgfD0gKDB4MDAwMDAwRkYgJiBicm9hZGNhc3RfaWRbMF0pOwotICAgICAgICAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVQQVJlc3VsdHNNYXAoc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSwgY29sb2NhdGVkQWRkcmVzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkFTZXJ2aWNlLkJyb2FkY2F0R2V0QWR2SGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkFTZXJ2aWNlLkJyb2FkY2F0R2V0QWR2SGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkFTZXJ2aWNlLkJyb2FkY2FzdEdldEFkdkludGVydmFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcyA9IG1TZXJ2aWNlLmdldFBBUmVzdWx0cyhzcmNJbmZvLmdldFNvdXJjZURldmljZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzeW5jSGFuZGxlID0gcmVzLm1TeW5jSGFuZGxlOwotICAgICAgICAgICAgICAgIGxvZygicHJvY2Vzc1BBU3luY1N0YXRlOiBzeW5jSGFuZGxlIiArIHJlcy5tU3luY0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ob1Bhc3QgPT0gZmFsc2UgJiYgc3luY0hhbmRsZSAhPSBCQ1NlcnZpY2UuSU5WQUxJRF9TWU5DX0hBTkRMRSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBZGRlZEJyb2FkY2FzdFNvdXJjZUlzTG9jYWwoc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29sbG9jYXRlZCBDYXNlIEluaXRpYXRlIFBBU1QgZm9yIDoiICsgbURldmljZSArICJzeW5jSGFuZGxlOiIgKyAgc3luY0hhbmRsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VEYXRhIiArIHNlcnZpY2VEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEYXRhID0gMHgwMDAwMDBGRiAmIHNyY0luZm8uZ2V0U291cmNlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEYXRhID0gc2VydmljZURhdGEgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYWR2QSBtYXRjaGVzIEVYVF9BRFZfQUREUkVTUwotICAgICAgICAgICAgICAgICAgICAgICAgLy9idXQgbm90IG1hdGNoZXMgc291cmNlIGFkZHJlc3MgKGFzIHdlIHdvdWxkIGhhdmUgd3JpdHRlbiBwQWRkcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEYXRhID0gc2VydmljZURhdGEgJiAofkJST0FEQ0FTVF9BRFZfQUREUkVTU19ET05UX01BVENIRVNfRVhUX0FEVl9BRERSRVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEYXRhID0gc2VydmljZURhdGEgfCAoQlJPQURDQVNUX0FEVl9BRERSRVNTX0RPTlRfTUFUQ0hFU19TT1VSQ0VfQURWX0FERFJFU1MpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVyaW9kaWNBZHZNYW5hZ2VyLnRyYW5zZmVyU2V0SW5mbyhtRGV2aWNlLCBzZXJ2aWNlRGF0YSwgc3luY0hhbmRsZSxtUGVyaW9kaWNBZHZDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJ0cmFuc2ZlclNldEluZm86IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA6IFBBU1QgZmFpbHVyZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURhdGEgPSAweDAwMDAwMEZGICYgc3JjSW5mby5nZXRTb3VyY2VJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURhdGEgPSBzZXJ2aWNlRGF0YSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgLy9hZHZBIG1hdGNoZXMgRVhUX0FEVl9BRERSRVNTCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2Fsc28gbWF0Y2hlcyBzb3VyY2UgYWRkcmVzcyAoYXMgd2Ugd291bGQgaGF2ZSB3cml0dGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURhdGEgPSBzZXJ2aWNlRGF0YSAmICh+QlJPQURDQVNUX0FEVl9BRERSRVNTX0RPTlRfTUFUQ0hFU19FWFRfQURWX0FERFJFU1MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURhdGEgPSBzZXJ2aWNlRGF0YSAmICh+QlJPQURDQVNUX0FEVl9BRERSRVNTX0RPTlRfTUFUQ0hFU19TT1VSQ0VfQURWX0FERFJFU1MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJJbml0aWF0ZSBQQVNUIGZvciA6IiArIG1EZXZpY2UgKyAic3luY0hhbmRsZToiICsgIHN5bmNIYW5kbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlRGF0YSIgKyBzZXJ2aWNlRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGVyaW9kaWNBZHZNYW5hZ2VyLnRyYW5zZmVyU3luYyhtRGV2aWNlLCBzZXJ2aWNlRGF0YSwgc3luY0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlRoZXJlIGlzIG5vIHZhbGlkIHN5bmMgaGFuZGxlIGZvciB0aGlzIFNvdXJjZSIpOwotICAgICAgICAgICAgICAgIGlmIChtQXV0b0Fzc2lzdCkgewotICAgICAgICAgICAgICAgICAgICAvL2luaXRpYXRlIEF1dG8gQXNzaXN0IHByb2NlZHVyZSBmb3IgdGhpcyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuZ2V0QmFzc1V0aWxzKCkudHJpZ2dlckF1dG9Bc3Npc3QgKHNyY0luZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNyY0luZm8uZ2V0QXVkaW9TeW5jU3RhdGUoKSA9PSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQgfHwKLSAgICAgICAgICAgIHNyY0luZm8uZ2V0TWV0YWRhdGFTeW5jU3RhdGUoKSA9PSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9OT19QQVNUKSB7Ci0gICAgICAgICAgIC8vQ2FuY2VsIHRoZSBleGlzdGluZyBzeW5jIGFuZCBJbnZhbGlkYXRlIHRoZSBzeW5jIGhhbmRsZQotICAgICAgICAgICBpZiAoaXNBZGRlZEJyb2FkY2FzdFNvdXJjZUlzTG9jYWwoc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgIGlmIChtU3luY2luZ09uQmVoYWxmT2ZHcm91cCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgIC8vQ2FuY2VsIHRoZSBTeW5jIG9ubHkgSWYgaXQgaXMgTk9UIHN5Y2VkIG9uIGJlaGFsZiBvZiBncm91cC4KLSAgICAgICAgICAgICAgICAgICAvL2dyb3VwIGJhc2VkIHN5bmMgd2lsbCBiZSBrZXB0IGFjdGl2ZSBQU1lOQ19BQ1RJVkVfVElNRU9VVCBzZWNvbmRzIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAvL2FsbCBncm91cCBtZW1iZXJzIGNhbiBnZXQgYmFjayBpbiBzeW5jCi0gICAgICAgICAgICAgICAgICAgbG9nKCJVbnJlZ2lzdGVyIHN5bmMgYXMgSXQgaXMgbm9uIGNvbG9jYXRlZCIpOwotICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMoc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAvL3RyaWdnZXIgc2NhbiBzdG9wIGhlcmUKLSAgICAgICAgICAgICAgIG1TZXJ2aWNlLnN0b3BTY2FuT2ZmbG9hZEludGVybmFsKG1EZXZpY2UsIGZhbHNlKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgIH0KLQotICAgIC8qQWN0dWFsIE9UQSBhZHZlcnRpc2luZyBhZGRyZXNzIGJhc2VkIGNoZWNrCi0gICAgVXNlIHRoaXMgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIEJyb2FkY2FzdCBzb3VyY2UqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FkZGVkQnJvYWRjYXN0U291cmNlSXNMb2NhbCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkKLSAgICB7Ci0gICAgICAgIGlmIChkZXZpY2UgID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImRldmljZSBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsb2NhbEJyb2FkY2FzdGVyQWRkciA9IG51bGw7Ci0gICAgICAgIC8vLypfQk1TCi0gICAgICAgIGlmIChtUHVibGljQWRkckZvcmNTcmMpIHsKLSAgICAgICAgICAgIGxvY2FsQnJvYWRjYXN0ZXJBZGRyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtQkFTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQkFTZXJ2aWNlID0gQnJvYWRjYXN0U2VydmljZS5nZXRCcm9hZGNhc3RTZXJ2aWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJBU2VydmljZSA9PSBudWxsIHx8IG1CQVNlcnZpY2UuaXNCcm9hZGNhc3RBY3RpdmUoKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiaXNBZGRlZEJyb2FkY2FzdFNvdXJjZUlzTG9jYWw6IGNvbG9jYXRlZCBzb3VyY2UgaGFuZGxlIGlzIHVuYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9jYWxCcm9hZGNhc3RlckFkZHIgPSBtQkFTZXJ2aWNlLkJyb2FkY2FzdEdldEFkdkFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICAvL19CTVMqLwotICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICBpZiAobG9jYWxCcm9hZGNhc3RlckFkZHIgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiaXNBZGRlZEJyb2FkY2FzdFNvdXJjZUlzTG9jYWw6IGxvY2FsQnJvYWRjYXN0ZXJBZGRyIGlzIG51bGwiKTsKLSAgICAgICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gbG9jYWxCcm9hZGNhc3RlckFkZHIuZXF1YWxzKGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGxvZygiaXNBZGRlZEJyb2FkY2FzdFNvdXJjZUlzTG9jYWwgcmV0dXJucyIgK3JldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQW5kVXBkYXRlQnJvYWRjYXN0Q29kZShCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8pIHsKLSAgICAgICAgaWYgKGlzQWRkZWRCcm9hZGNhc3RTb3VyY2VJc0xvY2FsKHNyY0luZm8uZ2V0U291cmNlRGV2aWNlKCkpKSB7Ci0gICAgICAgICAgICBpZiAobUZvcmNlU0IgPT0gdHJ1ZSB8fAotICAgICAgICAgICAgICAgIHNyY0luZm8uZ2V0RW5jcnlwdGlvblN0YXR1cygpID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfUElOX05FRURFRCkgewotICAgICAgICAgICAgICAgIC8vcXVlcnkgdGhlIEVuY3J5cHRpb24gS2V5IGZyb20gQk1TIGFuZCB1cGRhdGUKLSAgICAgICAgICAgICAgICAvLy8qX0JNUwotICAgICAgICAgICAgICAgIGJ5dGVbXSBjb2xvY2F0ZWRCY2FzdENvZGUgPSBtQkFTZXJ2aWNlLkdldEVuY3J5cHRpb25LZXkobnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CQVNlcnZpY2UuaXNCcm9hZGNhc3RTdHJlYW1pbmdFbmNyeXB0ZWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzZWVtIHRvIGJlIFVuZW5jcnlwdGVkIGNvbG9jYXRlZCBicm9hZGNhc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9nKCJjb2xvY2F0ZWRCY2FzdENvZGUgaXMgIiArIGNvbG9jYXRlZEJjYXN0Q29kZSk7Ci0gICAgICAgICAgICAgICAgLy9xdWV1ZSBhIGZyZXNoIGNvbW1hbmQgdG8gdXBkYXRlIHRoZQotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG9idGFpbk1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5TRVRfQkNBU1RfQ09ERSk7Ci0gICAgICAgICAgICAgICAgbS5vYmogPSBzcmNJbmZvOwotICAgICAgICAgICAgICAgIG0uYXJnMSA9IEZSRVNIOwotICAgICAgICAgICAgICAgIGxvZygiY2hlY2tBbmRVcGRhdGVCcm9hZGNhc3RDb2RlOiBzcmMgZGV2aWNlOiAiICsgc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSk7Ci0gICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICAgICAgLy9fQk1TKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiY2hlY2tBbmRVcGRhdGVCcm9hZGNhc3RDb2RlIik7Ci0gICAgICAgICAgICAvL25vbiBjb2xvY2F0ZWQgY2FzZSwgQnJvYWRjYXN0IFBJTiBzaG91bGQgaGF2ZSBiZWVuIHVwZGF0ZWQgZnJvbSBseWFlcgotICAgICAgICAgICAgLy9JZiB0aGVyZSBpcyBwZW5kaW5nIG9uZSBwcm9jZXNzIGl0IE5vdwotICAgICAgICAgICAgaWYgKHNyY0luZm8uZ2V0RW5jcnlwdGlvblN0YXR1cygpID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfUElOX05FRURFRCAmJgotICAgICAgICAgICAgICAgIG1TZXRCcm9hZGNhc3RDb2RlUGVuZGluZyA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLy9NYWtlIGEgUVVFVUVEIGNvbW1hbmQKLSAgICAgICAgICAgICAgICBsb2coIlVwZGF0ZSB0aGUgQnJvYWRjYXN0IG5vdyIpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG9idGFpbk1lc3NhZ2UoQmFzc0NsaWVudFN0YXRlTWFjaGluZS5TRVRfQkNBU1RfQ09ERSk7Ci0gICAgICAgICAgICAgICAgbS5vYmogPSBtU2V0QnJvYWRjYXN0UElOU3JjSW5mbzsKLSAgICAgICAgICAgICAgICBtLmFyZzEgPSBRVUVVRUQ7Ci0KLSAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgICAgICBtU2V0QnJvYWRjYXN0Q29kZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtU2V0QnJvYWRjYXN0UElOU3JjSW5mbyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgIH0KLQotICAgcHJpdmF0ZSBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IGdldExpc3RPZkJpc0luZGljaWVzKGludCBiaXNJbmRpY2llcywgaW50IHN1Ykdyb3VwSWQsIGJ5dGVbXSBtZXRhRGF0YSkgewotICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYmNhc3RJbmRpY2llcyA9IG5ldyBBcnJheUxpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4oKTsKLSAgICAgICAgaW50IGluZGV4ID0wOwotICAgICAgICBsb2coImdldExpc3RPZkJpc0luZGljaWVzOiIgKyBiaXNJbmRpY2llcyk7Ci0gICAgICAgIHdoaWxlIChiaXNJbmRpY2llcyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKGJpc0luZGljaWVzICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSkgewotICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwgYkkgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbChpbmRleCwgSW50ZWdlci50b1N0cmluZyhpbmRleCksIHRydWUsIHN1Ykdyb3VwSWQsIG1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICBiY2FzdEluZGljaWVzLmFkZChiSSk7Ci0gICAgICAgICAgICAgICAgbG9nKCJBZGRpbmcgQklTIGluZGV4IGZvciA6IiArIGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpc0luZGljaWVzID0gYmlzSW5kaWNpZXM+PjE7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiY2FzdEluZGljaWVzOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCcm9hZGNhc3RSZWNlaXZlclN0YXRlIChieXRlW10gcmVjZWl2ZXJTdGF0ZSwgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIGNoYXJhY3RlcmlzdGljKSB7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICBib29sZWFuIGlzRW1wdHlFbnRyeSA9IGZhbHNlOwotICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8gPSBudWxsOwotCi0gICAgICAgIGxvZygicHJvY2Vzc0Jyb2FkY2FzdFJlY2VpdmVyU3RhdGU6OiBjaGFyYWN0ZXJpc3RpYzoiICsgY2hhcmFjdGVyaXN0aWMpOwotCi0gICAgICAgIGJ5dGUgc291cmNlSWQgPSAwOwotICAgICAgICBpZiAocmVjZWl2ZXJTdGF0ZS5sZW5ndGggPiAwKQotICAgICAgICAgICAgc291cmNlSWQgPSByZWNlaXZlclN0YXRlW0JDQVNUX1JDVlJfU1RBVEVfU1JDX0lEX0lEWF07Ci0gICAgICAgIGxvZygicHJvY2Vzc0Jyb2FkY2FzdFJlY2VpdmVyU3RhdGU6IHJlY2VpdmVyU3RhdGUgbGVuZ3RoOiAiICsgcmVjZWl2ZXJTdGF0ZS5sZW5ndGgpOwotICAgICAgICBpZiAocmVjZWl2ZXJTdGF0ZS5sZW5ndGggPT0gMCB8fAotICAgICAgICAgICAgaXNFbXB0eShBcnJheXMuY29weU9mUmFuZ2UocmVjZWl2ZXJTdGF0ZSwgMSwgcmVjZWl2ZXJTdGF0ZS5sZW5ndGgtMSkpKSB7Ci0gICAgICAgICAgICBsb2coIlRoaXMgaXMgYW4gRW1wdHkgRW50cnkiKTsKLSAgICAgICAgICAgIGlmIChtUGVuZGluZ09wZXJhdGlvbiA9PSBSRU1PVkVfQkNBU1RfU09VUkNFKSB7Ci0gICAgICAgICAgICAgICAgc3JjSW5mbyA9IG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKG1QZW5kaW5nU291cmNlSWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNlaXZlclN0YXRlLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wU291cmNlSWQgPSAoYnl0ZSltQmxlQnJvYWRjYXN0U291cmNlSW5mb3Muc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVRlbXBTb3VyY2VJZCA8IE5VTV9PRl9CUk9BRENBU1RfUkVDRUlWRVJfU1RBVEVTKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wU291cmNlSWQrKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjSW5mbyA9IG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKG1UZW1wU291cmNlSWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlYWNoZWQgdGhlIHJlbW90ZSBzdXBwb3J0ZWQgbWF4IFNvdXJjZUluZm9zIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpc0VtcHR5RW50cnkgPSB0cnVlOwotICAgICAgICAgICAgLy9qdXN0IGNyZWF0ZSBhbiBFbXB0eSBlbnRyeQotICAgICAgICAgICBpZiAoc3JjSW5mby5pc0VtcHR5RW50cnkoKSkgewotICAgICAgICAgICAgICAgIGxvZygiQW4gZW1wdHkgZW50cnkgaGFzIGJlZW4gY3JlYXRlZCIpOwotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBieXRlIHNvdXJjZUFkZHJlc3NUeXBlID0gcmVjZWl2ZXJTdGF0ZVtCQ0FTVF9SQ1ZSX1NUQVRFX1NSQ19BRERSX1RZUEVfSURYXTsKLSAgICAgICAgICAgIGJ5dGVbXSBzb3VyY2VBZGRyZXNzID0gbmV3IGJ5dGVbQkNBU1RfUkNWUl9TVEFURV9TUkNfQUREUl9TSVpFXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVjZWl2ZXJTdGF0ZSwgQkNBU1RfUkNWUl9TVEFURV9TUkNfQUREUl9TVEFSVF9JRFgsIHNvdXJjZUFkZHJlc3MsIDAsIEJDQVNUX1JDVlJfU1RBVEVfU1JDX0FERFJfU0laRSk7Ci0gICAgICAgICAgICBieXRlIHNvdXJjZUFkdlNpZCA9IHJlY2VpdmVyU3RhdGVbQkNBU1RfUkNWUl9TVEFURV9TUkNfQURWX1NJRF9JRFhdOwotCi0gICAgICAgICAgICBieXRlW10gYnJvYWRjYXN0SWRCeXRlcyA9IG5ldyBieXRlW0JST0FEQ0FTVF9TT1VSQ0VfSURfTEVOR1RIXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVjZWl2ZXJTdGF0ZSwgQkNBU1RfUkNWUl9TVEFURV9TUkNfQkNBU1RfSURfU1RBUlRfSURYLCBicm9hZGNhc3RJZEJ5dGVzLCAwLCBCUk9BRENBU1RfU09VUkNFX0lEX0xFTkdUSCk7Ci0gICAgICAgICAgICBpbnQgYnJvYWRjYXN0SWQgPSAoMHgwMEZGMDAwMCAmIChicm9hZGNhc3RJZEJ5dGVzWzJdIDw8IDE2KSk7Ci0gICAgICAgICAgICBicm9hZGNhc3RJZCB8PSAoMHgwMDAwRkYwMCAmIChicm9hZGNhc3RJZEJ5dGVzWzFdIDw8IDgpKTsKLSAgICAgICAgICAgIGJyb2FkY2FzdElkIHw9ICgweDAwMDAwMEZGICYgYnJvYWRjYXN0SWRCeXRlc1swXSk7Ci0KLSAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYnRBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlICBkZXZpY2UgPSBidEFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKHJldmVyc2VCeXRlcyhzb3VyY2VBZGRyZXNzKSk7Ci0gICAgICAgICAgICBieXRlIG1ldGFEYXRhU3luY1N0YXRlID0gcmVjZWl2ZXJTdGF0ZVtCQ0FTVF9SQ1ZSX1NUQVRFX1BBX1NZTkNfSURYXTsKLQotCi0gICAgICAgICAgICBieXRlIGVuY3lwdGlvblN0YXR1cyA9IHJlY2VpdmVyU3RhdGVbQkNBU1RfUkNWUl9TVEFURV9FTkNfU1RBVFVTX0lEWF07Ci0gICAgICAgICAgICBieXRlW10gYmFkQnJvYWRjYXN0Q29kZSA9IG51bGw7Ci0gICAgICAgICAgICBieXRlIGJhZEJyb2FkY2FzdENvZGVMZW4gPSAwOwotICAgICAgICAgICAgYnl0ZSBudW1TdWJHcm91cHMgPSAwOwotICAgICAgICAgICAgYnl0ZVtdIG1ldGFkYXRhTGVuZ3RoID0gbnVsbDsKLSAgICAgICAgICAgIGJ5dGVbXSBtZXRhRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZW5jeXB0aW9uU3RhdHVzID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfQkFEQ09ERSkgewotICAgICAgICAgICAgICAgIGJhZEJyb2FkY2FzdENvZGUgPSBuZXcgYnl0ZVtCQ0FTVF9SQ1ZSX1NUQVRFX0JBRENPREVfU0laRV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWNlaXZlclN0YXRlLCBCQ0FTVF9SQ1ZSX1NUQVRFX0JBRENPREVfU1RBUlRfSURYLCBiYWRCcm9hZGNhc3RDb2RlLCAwLCBCQ0FTVF9SQ1ZSX1NUQVRFX0JBRENPREVfU0laRSk7Ci0gICAgICAgICAgICAgICAgYmFkQnJvYWRjYXN0Q29kZSA9IHJldmVyc2VCeXRlcyhiYWRCcm9hZGNhc3RDb2RlKTsKLSAgICAgICAgICAgICAgICBiYWRCcm9hZGNhc3RDb2RlTGVuID0gQkNBU1RfUkNWUl9TVEFURV9CQURDT0RFX1NJWkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1TdWJHcm91cHMgPSByZWNlaXZlclN0YXRlW0JDQVNUX1JDVlJfU1RBVEVfQkFEQ09ERV9TVEFSVF9JRFggKyBiYWRCcm9hZGNhc3RDb2RlTGVuXTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBCQ0FTVF9SQ1ZSX1NUQVRFX0JBRENPREVfU1RBUlRfSURYICsgYmFkQnJvYWRjYXN0Q29kZUxlbiArIDE7Ci0gICAgICAgICAgICAvL01hcCBvZiBCaXMgU3RhdHVzIDxzdWJHcm91cElkLCBMaXN0X09GX0Jyb2FkY2FzdF9jaGFubmVsPgotICAgICAgICAgICAgTWFwPEludGVnZXIsIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4+IGJpc0luZGV4TGlzdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4+KCk7Ci0gICAgICAgICAgICAvL01hcCBmb3IgTWV0YWRhIDxzdWJHcm91cElkLCBNZXRhZGF0YT4KLSAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBieXRlW10+IG1ldGFkYXRhTGlzdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIGJ5dGVbXT4oKTsKLSAgICAgICAgICAgIG1ldGFkYXRhTGVuZ3RoID0gbmV3IGJ5dGVbbnVtU3ViR3JvdXBzXTsKLSAgICAgICAgICAgIGJ5dGUgYXVkaW9TeW5jU3RhdGUgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdWJHcm91cHM7IGkrKykgewotICAgICAgICAgICAgICAgIGJ5dGVbXSBhdWRpb1N5bmNJbmRleCA9IG5ldyBieXRlW0JDQVNUX1JDVlJfU1RBVEVfQklTX1NZTkNfU0laRV07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWNlaXZlclN0YXRlLCBvZmZzZXQsIGF1ZGlvU3luY0luZGV4LCAwLCBCQ0FTVF9SQ1ZSX1NUQVRFX0JJU19TWU5DX1NJWkUpOwotICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIEJDQVNUX1JDVlJfU1RBVEVfQklTX1NZTkNfU0laRTsKLSAgICAgICAgICAgICAgICBsb2coIkJJUyBpbmRleCBieXRlIGFycmF5OiAiKTsKLSAgICAgICAgICAgICAgICBCYXNzVXRpbHMucHJpbnRCeXRlQXJyYXkoYXVkaW9TeW5jSW5kZXgpOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgd3JhcHBlZCA9IEJ5dGVCdWZmZXIud3JhcChyZXZlcnNlQnl0ZXMoYXVkaW9TeW5jSW5kZXgpKTsKLSAgICAgICAgICAgICAgICBpbnQgYXVkaW9CaXNJbmRleCA9IHdyYXBwZWQuZ2V0SW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvQmlzSW5kZXggPT0gMHhGRkZGRkZGRikgewotICAgICAgICAgICAgICAgICAgICBsb2coIlJlbW90ZSBmYWlsZWQgdG8gc3luYyB0byBCSVMiKTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9TeW5jU3RhdGUgPSAweDAwOwotICAgICAgICAgICAgICAgICAgICBhdWRpb0Jpc0luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvL0JpdHMgKDAtMzApPT4gKDEtMzEpCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvQmlzSW5kZXggPSBhdWRpb0Jpc0luZGV4IDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQklTIGluZGV4IGNvbnZlcnRlZDogIiArIGF1ZGlvQmlzSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9CaXNJbmRleCAhPSAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYW55IEJJUyBpcyBpbiBzeW5jLCBTZXQgQXVkaW8gc3RhdGUgYXMgT04KLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU3luY1N0YXRlID0gMHgwMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1ldGFkYXRhTGVuZ3RoW2ldID0gIHJlY2VpdmVyU3RhdGVbb2Zmc2V0KytdOwotICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YUxlbmd0aFtpXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygibWV0YWRhdGEgb2YgbGVuZ3RoOiAiICsgbWV0YWRhdGFMZW5ndGhbaV0gKyAiaXMgYXZhaWFsYmxlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IGJ5dGVbbWV0YWRhdGFMZW5ndGhbaV1dOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlY2VpdmVyU3RhdGUsIG9mZnNldCwgbWV0YURhdGEsIDAsIG1ldGFkYXRhTGVuZ3RoW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgbWV0YWRhdGFMZW5ndGhbaV07Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gcmV2ZXJzZUJ5dGVzKG1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFMaXN0LnB1dChpLCBtZXRhRGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpc0luZGV4TGlzdC5wdXQoaSwgZ2V0TGlzdE9mQmlzSW5kaWNpZXMoYXVkaW9CaXNJbmRleCwgaSwgbWV0YURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY0luZm8gPSBuZXcgQmxlQnJvYWRjYXN0U291cmNlSW5mbyhkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUFkdlNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzb3VyY2VBZGRyZXNzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbWV0YURhdGFTeW5jU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWVuY3lwdGlvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZEJyb2FkY2FzdENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdWJHcm91cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWF1ZGlvU3luY1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlzSW5kZXhMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gb2xkU291cmNlSW5mbyA9IG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvcy5nZXQoY2hhcmFjdGVyaXN0aWMuZ2V0SW5zdGFuY2VJZCgpKTsKLSAgICAgICAgaWYgKG9sZFNvdXJjZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCJJbml0aWFsIFJlYWQgYW5kIFBvcHVsYXRpbmcgdmFsdWVzIik7Ci0gICAgICAgICAgICBpZiAobUJsZUJyb2FkY2FzdFNvdXJjZUluZm9zLnNpemUoKSA9PSBOVU1fT0ZfQlJPQURDQVNUX1JFQ0VJVkVSX1NUQVRFUykgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInJlYWNoZWQgdGhlIE1heCBTb3VyY2VJbmZvcyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvcy5wdXQoY2hhcmFjdGVyaXN0aWMuZ2V0SW5zdGFuY2VJZCgpLCBzcmNJbmZvKTsKLSAgICAgICAgICAgIGNoZWNrQW5kVXBkYXRlQnJvYWRjYXN0Q29kZShzcmNJbmZvKTsKLSAgICAgICAgICAgIHByb2Nlc3NQQVN5bmNTdGF0ZShzcmNJbmZvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygib2xkIHNvdXJjZUluZm86ICIgKyBvbGRTb3VyY2VJbmZvKTsKLSAgICAgICAgICAgIGxvZygibmV3IHNvdXJjZUluZm86ICIgKyBzcmNJbmZvKTsKLSAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvcy5yZXBsYWNlKGNoYXJhY3RlcmlzdGljLmdldEluc3RhbmNlSWQoKSwgc3JjSW5mbyk7Ci0gICAgICAgICAgICBpZiAob2xkU291cmNlSW5mby5pc0VtcHR5RW50cnkoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJOZXcgU291cmNlIEFkZGl0aW9uIik7Ci0gICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MoQUREX0JDQVNUX1NPVVJDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW5mby5nZXRTb3VyY2VJZCgpLCBCbHVldG9vdGhHYXR0LkdBVFRfU1VDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tBbmRVcGRhdGVCcm9hZGNhc3RDb2RlKHNyY0luZm8pOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQQVN5bmNTdGF0ZShzcmNJbmZvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW1wdHlFbnRyeSkgewotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgcmVtb3ZlZERldmljZSA9IG9sZFNvdXJjZUluZm8uZ2V0U291cmNlRGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygic291cmNlSW5mbyByZW1vdmFsIiArIHJlbW92ZWREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jKHJlbW92ZWREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBzZW5kUGVuZGluZ0NhbGxiYWNrcyhSRU1PVkVfQkNBU1RfU09VUkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJbmZvLmdldFNvdXJjZUlkKCksIEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coInVwZGF0ZSB0byBhbiBleGlzdGluZyBzcmNJbmZvIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRQZW5kaW5nQ2FsbGJhY2tzKFVQREFURV9CQ0FTVF9TT1VSQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luZm8uZ2V0U291cmNlSWQoKSxCbHVldG9vdGhHYXR0LkdBVFRfU1VDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQQVN5bmNTdGF0ZShzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRVcGRhdGVCcm9hZGNhc3RDb2RlKHNyY0luZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbmRleCA9IHNyY0luZm8uZ2V0U291cmNlSWQoKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBsb2coInByb2Nlc3NCcm9hZGNhc3RSZWNlaXZlclN0YXRlOiBpbnZhbGlkIGluZGV4Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZShzcmNJbmZvLCBpbmRleCwgTlVNX09GX0JST0FEQ0FTVF9SRUNFSVZFUl9TVEFURVMpOwotICAgIH0KLSAgICAvLyBJbXBsZW1lbnRzIGNhbGxiYWNrIG1ldGhvZHMgZm9yIEdBVFQgZXZlbnRzIHRoYXQgdGhlIGFwcCBjYXJlcyBhYm91dC4gIEZvciBleGFtcGxlLAotICAgIC8vIGNvbm5lY3Rpb24gY2hhbmdlIGFuZCBzZXJ2aWNlcyBkaXNjb3ZlcmVkLgotICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoR2F0dENhbGxiYWNrIG1HYXR0Q2FsbGJhY2sgPSBuZXcgQmx1ZXRvb3RoR2F0dENhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoR2F0dCBnYXR0LCBpbnQgc3RhdHVzLCBpbnQgbmV3U3RhdGUpIHsKLSAgICAgICAgICAgYm9vbGVhbiBpc1N0YXRlQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICBsb2coICJvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZSA6IFN0YXR1cz0iICsgc3RhdHVzICsgIm5ld1N0YXRlIiArIG5ld1N0YXRlKTsKLSAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEICYmIGdldENvbm5lY3Rpb25TdGF0ZSgpICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGlzU3RhdGVDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgIExvZy53KFRBRywgIkJhc3NjbGllbnQgQ29ubmVjdGVkIGZyb20gRGlzY29ubmVjdGVkIHN0YXRlOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICBpZiAobVNlcnZpY2Uub2tUb0Nvbm5lY3QobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICBsb2coIkJhc3NjbGllbnQgQ29ubmVjdGVkIHRvOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbG9nKCAiQXR0ZW1wdGluZyB0byBzdGFydCBzZXJ2aWNlIGRpc2NvdmVyeToiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmRpc2NvdmVyU2VydmljZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlJbml0aWF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVqZWN0IHRoZSBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQmFzc2NsaWVudCBDb25uZWN0IHJlcXVlc3QgcmVqZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgLy9mb3JjZSBtb3ZlIHRvIGRpc2Nvbm5lY3RlZAotICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvblN0YXRlKCkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBpc1N0YXRlQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nKCAiRGlzY29ubmVjdGVkIGZyb20gQmFzcyBHQVRUIHNlcnZlci4iKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoaXNTdGF0ZUNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG9idGFpbk1lc3NhZ2UoQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgIG0ub2JqID0gbmV3U3RhdGU7Ci0gICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VzRGlzY292ZXJlZChCbHVldG9vdGhHYXR0IGdhdHQsIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgIGxvZygib25TZXJ2aWNlc0Rpc2NvdmVyZWQ6IiArIHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAobURpc2NvdmVyeUluaXRpYXRlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeUluaXRpYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQmx1ZXRvb3RoR2F0dC5HQVRUX1NVQ0NFU1MgJiYgbUJsdWV0b290aEdhdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5yZXF1ZXN0TXR1KEJBU1NfTUFYX0JZVEVTKTsKLSAgICAgICAgICAgICAgICAgICAgbU1UVUNoYW5nZVJlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZXJ2aWNlc0Rpc2NvdmVyZWQgcmVjZWl2ZWQ6ICIgKyBzdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm1CbHVldG9vdGhHYXR0IiArIG1CbHVldG9vdGhHYXR0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygicmVtb3RlIGluaXRpYXRlZCBjYWxsYmFjayIpOwotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYXJhY3RlcmlzdGljUmVhZChCbHVldG9vdGhHYXR0IGdhdHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIGNoYXJhY3RlcmlzdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgIGxvZyggIm9uQ2hhcmFjdGVyaXN0aWNSZWFkOjogc3RhdHVzOiAiICsgc3RhdHVzICsgImNoYXI6IiArIGNoYXJhY3RlcmlzdGljKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCbHVldG9vdGhHYXR0LkdBVFRfU1VDQ0VTUyAmJgotICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljLmdldFV1aWQoKS5lcXVhbHMoQkFTU19CQ0FTVF9SRUNFSVZFUl9TVEFURSkpIHsKLSAgICAgICAgICAgICAgICBsb2coICJvbkNoYXJhY3RlcmlzdGljUmVhZDogQkFTU19CQ0FTVF9SRUNFSVZFUl9TVEFURTogc3RhdHVzIiArIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgbG9nQnl0ZUFycmF5KCJSZWNlaXZlZCAiLCBjaGFyYWN0ZXJpc3RpYy5nZXRWYWx1ZSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWMuZ2V0VmFsdWUoKS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYy5nZXRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlIHJlY2VpdmVyIHN0YXRlIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm9jZXNzQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZShjaGFyYWN0ZXJpc3RpYy5nZXRWYWx1ZSgpLCBjaGFyYWN0ZXJpc3RpYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgYWZ0ZXIgaW5pdGlhbCBjaGFyYWN0ZXJpc3RpYyByZWFkCi0gICAgICAgICAgICBCbHVldG9vdGhHYXR0RGVzY3JpcHRvciBkZXNjID0gY2hhcmFjdGVyaXN0aWMuZ2V0RGVzY3JpcHRvcihDTElFTlRfQ0hBUkFDVEVSSVNUSUNfQ09ORklHKTsKLSAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsICYmIGRlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZygiU2V0dGluZyB0aGUgdmFsdWUgZm9yIERlc2MiKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5zZXRDaGFyYWN0ZXJpc3RpY05vdGlmaWNhdGlvbihjaGFyYWN0ZXJpc3RpYywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZGVzYy5zZXRWYWx1ZShCbHVldG9vdGhHYXR0RGVzY3JpcHRvci5FTkFCTEVfTk9USUZJQ0FUSU9OX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC53cml0ZURlc2NyaXB0b3IoZGVzYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNDQyBmb3IgIiArIGNoYXJhY3RlcmlzdGljICsgInNlZW0gdG8gYmUgbm90IHByZXNlbnQiKTsKLSAgICAgICAgICAgICAgICAvL2F0bGVhc3QgbW92ZSB0aGUgU00gdG8gc3RhYmxlIHN0YXRlCi0gICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gb2J0YWluTWVzc2FnZShHQVRUX1RYTl9QUk9DRVNTRUQpOwotICAgICAgICAgICAgICAgIG0uYXJnMSA9IHN0YXR1czsKLSAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JXcml0ZShCbHVldG9vdGhHYXR0IGdhdHQsIEJsdWV0b290aEdhdHREZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgIGxvZygib25EZXNjcmlwdG9yV3JpdGUiKTsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTICYmCi0gICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZ2V0VXVpZCgpLmVxdWFscyhDTElFTlRfQ0hBUkFDVEVSSVNUSUNfQ09ORklHKSkgewotICAgICAgICAgICAgICAgICBsb2coIkNDQyB3cml0ZSByZXNwIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAvL01vdmUgdGhlIFNNIHRvIGNvbm5lY3RlZCBzbyBmdXJ0aGVyIHJlYWRzIGhhcHBlbnMKLSAgICAgICAgICAgICBNZXNzYWdlIG0gPSBvYnRhaW5NZXNzYWdlKEdBVFRfVFhOX1BST0NFU1NFRCk7Ci0gICAgICAgICAgICAgbS5hcmcxID0gc3RhdHVzOwotICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTXR1Q2hhbmdlZChCbHVldG9vdGhHYXR0IGdhdHQsIGludCBtdHUsIGludCBzdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZygib25NdHVDaGFuZ2VkOiBtdHU6IiArIG10dSk7Ci0gICAgICAgICAgICBpZiAobU1UVUNoYW5nZVJlcXVlc3RlZCA9PSB0cnVlICYmIG1CbHVldG9vdGhHYXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlQWxsQmFzc0NoYXJzKCk7Ci0gICAgICAgICAgICAgICAgbU1UVUNoYW5nZVJlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIm9uTXR1Q2hhbmdlZCBpcyByZW1vdGUgaW5pdGlhdGVkIHRyaWdnZXIsIG1CbHVldG9vdGhHYXR0OiIgKyBtQmx1ZXRvb3RoR2F0dCk7Ci0gICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFyYWN0ZXJpc3RpY0NoYW5nZWQoQmx1ZXRvb3RoR2F0dCBnYXR0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyBjaGFyYWN0ZXJpc3RpYykgewotICAgICAgICAgICAgbG9nKCAib25DaGFyYWN0ZXJpc3RpY0NoYW5nZWQgOjogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGFyYWN0ZXJpc3RpYy5nZXRVdWlkKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoY2hhcmFjdGVyaXN0aWMuZ2V0VXVpZCgpLmVxdWFscyhCQVNTX0JDQVNUX1JFQ0VJVkVSX1NUQVRFKSkgewotICAgICAgICAgICAgICAgIGxvZyggIm9uQ2hhcmFjdGVyaXN0aWNDaGFuZ2VkIGlzIHJjdnIgU3RhdGUgOjogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGFyYWN0ZXJpc3RpYy5nZXRVdWlkKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcmlzdGljLmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGUgcmVjZWl2ZXIgc3RhdGUgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvZ0J5dGVBcnJheSgib25DaGFyYWN0ZXJpc3RpY0NoYW5nZWQ6IFJlY2VpdmVkICIsIGNoYXJhY3RlcmlzdGljLmdldFZhbHVlKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYy5nZXRWYWx1ZSgpLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0Jyb2FkY2FzdFJlY2VpdmVyU3RhdGUoY2hhcmFjdGVyaXN0aWMuZ2V0VmFsdWUoKSwgY2hhcmFjdGVyaXN0aWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhcmFjdGVyaXN0aWNXcml0ZShCbHVldG9vdGhHYXR0IGdhdHQsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIGNoYXJhY3RlcmlzdGljLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICBsb2coICJvbkNoYXJhY3RlcmlzdGljV3JpdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhcmFjdGVyaXN0aWMuZ2V0VXVpZCgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInN0YXR1czoiICsgc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYy5nZXRVdWlkKCkuZXF1YWxzKEJBU1NfQkNBU1RfQVVESU9fU0NBTl9DVFJMX1BPSU5UKSkgewotICAgICAgICAgICAgICAgIGxvZyggIkJBU1NfQkNBU1RfQVVESU9fU0NBTl9DVFJMX1BPSU5UIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBvYnRhaW5NZXNzYWdlKEdBVFRfVFhOX1BST0NFU1NFRCk7Ci0gICAgICAgICAgICBtLmFyZzEgPSBzdGF0dXM7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZShtKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBnZXRBbGxCcm9hZGNhc3RTb3VyY2VJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgbG9nKCAiZ2V0QWxsQnJvYWRjYXN0U291cmNlSW5mb3JtYXRpb24iKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChtQmxlQnJvYWRjYXN0U291cmNlSW5mb3MudmFsdWVzKCkpOwotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICB2b2lkIGFjcXVpcmVBbGxCYXNzQ2hhcnMoKSB7Ci0gICAgICAgIGNsZWFyQ2hhcnNDYWNoZSgpOwotICAgICAgICBCbHVldG9vdGhHYXR0U2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiZ2V0dGluZyBCYXNzIFNlcnZpY2UgaGFuZGxlIik7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gbUJsdWV0b290aEdhdHQuZ2V0U2VydmljZShCQVNTX1VVSUQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZyggImZvdW5kIEJBU1NfU0VSVklDRSIpOwotICAgICAgICAgICAgTGlzdDxCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWM+IGFsbENoYXJzID0gc2VydmljZS5nZXRDaGFyYWN0ZXJpc3RpY3MoKTsKLSAgICAgICAgICAgIGludCBudW1PZkNoYXJzID0gYWxsQ2hhcnMuc2l6ZSgpOwotICAgICAgICAgICAgTlVNX09GX0JST0FEQ0FTVF9SRUNFSVZFUl9TVEFURVMgPSBudW1PZkNoYXJzLTE7Ci0gICAgICAgICAgICBsb2coICJUb3RhbCBudW1iZXIgb2YgY2hhcnMiICsgbnVtT2ZDaGFycyk7Ci0gICAgICAgICAgICAvL3N0YXRpYyB2YXIgdG8ga2VlcCB0cmFjayBvZiByZWFkIGNhbGxiYWNrcwotICAgICAgICAgICAgbnVtX29mX3JlY2V2ZXJfc3RhdGVzID0gTlVNX09GX0JST0FEQ0FTVF9SRUNFSVZFUl9TVEFURVM7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbENoYXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFsbENoYXJzLmdldChpKS5nZXRVdWlkKCkuZXF1YWxzKEJBU1NfQkNBU1RfQVVESU9fU0NBTl9DVFJMX1BPSU5UKSkgewotICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U2NhbkNvbnRyb2xQb2ludCA9IGFsbENoYXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCAiSW5kZXggb2YgU2NhbkN0cmxQb2ludDoiICsgaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCAiUmVhZGluZyAiICsgaSArICJ0aCBSZWNlaXZlclN0YXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RSZWNlaXZlclN0YXRlcy5hZGQoYWxsQ2hhcnMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gb2J0YWluTWVzc2FnZShSRUFEX0JBU1NfQ0hBUkFDVEVSSVNUSUNTKTsKLSAgICAgICAgICAgICAgICAgICAgbS5vYmogPSBhbGxDaGFycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImFjcXVpcmVBbGxCYXNzQ2hhcnM6IEJBU1Mgc2VydmljZSBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgICAgdm9pZCBjbGVhckNoYXJzQ2FjaGUoKSB7Ci0gICAgICAgICBpZiAobUJyb2FkY2FzdFJlY2VpdmVyU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Ccm9hZGNhc3RSZWNlaXZlclN0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnJvYWRjYXN0U2NhbkNvbnRyb2xQb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnJvYWRjYXN0U2NhbkNvbnRyb2xQb2ludCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgbnVtX29mX3JlY2V2ZXJfc3RhdGVzID0gMDsKLSAgICAgICAgaWYgKG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQmxlQnJvYWRjYXN0U291cmNlSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBtUGVuZGluZ09wZXJhdGlvbiA9IC0xOwotICAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBjbGFzcyBEaXNjb25uZWN0ZWQgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIGxvZyggIkVudGVyIERpc2Nvbm5lY3RlZCgiICsgbURldmljZSArICIpOiAiICsgbWVzc2FnZVdoYXRUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBjbGVhckNoYXJzQ2FjaGUoKTsKLSAgICAgICAgICAgIG1UZW1wU291cmNlSWQgPSAwOwotICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhESVNDT05ORUNUKTsKLQotICAgICAgICAgICAgaWYgKG1MYXN0Q29ubmVjdGlvblN0YXRlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCAibm8gQnJvYWRjYXN0IG9mIGluaXRpYWwgcHJvZmlsZSBzdGF0ZSAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QYWNzQXZhaWwgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAvKl9QQUNTCi0gICAgICAgICAgICAgICAgICAgIFBhY3NDbGllbnRTZXJ2aWNlIG1QYWNzQ2xpZW50U2VydmljZSA9IFBhY3NDbGllbnRTZXJ2aWNlLmdldFBhY3NDbGllbnRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUGFjc0NsaWVudFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJ0cmlnZ2VyIGRpc2Nvbm5lY3QgdG8gUGFjcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBhY3NDbGllbnRTZXJ2aWNlLmRpc2Nvbm5lY3QobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBBQ3MgaW50ZXJmYWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfUEFDUyovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8vKl9WQ1AKLSAgICAgICAgICAgICAgICBpZiAobVZjcEZvckJyb2FkY2FzdCkgewotICAgICAgICAgICAgICAgICAgICBWY3BDb250cm9sbGVyIHZjcENvbnRyb2xsZXIgPSBWY3BDb250cm9sbGVyLmdldFZjcENvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZjcENvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJ0cmlnZ2VyIGRpc2Nvbm5lY3QgdG8gVmNwIFJlbmRlcmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZjcENvbnRyb2xsZXIuZGlzY29ubmVjdChtRGV2aWNlLCBCbHVldG9vdGhWY3AuTU9ERV9CUk9BRENBU1QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0IFZjcCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlZjcENvbnRyb2xsZXIgaW50ZXJmYWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL19WQ1AqLwotICAgICAgICAgICAgICAgICBicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUobURldmljZSwgbUxhc3RDb25uZWN0aW9uU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIGxvZygiRXhpdCBEaXNjb25uZWN0ZWQoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotICAgICAgICAgICAgbUxhc3RDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIGxvZygiRGlzY29ubmVjdGVkIHByb2Nlc3MgbWVzc2FnZSgiICsgbURldmljZSArICIpOiAiICsgbWVzc2FnZVdoYXRUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53aGF0KSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBsb2coIkNvbm5lY3RpbmcgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2xlYXIgb2ZmLCBwZW5kaW5nIHdsIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG1CbHVldG9vdGhHYXR0ID0gbURldmljZS5jb25uZWN0R2F0dChtU2VydmljZSwgbUlzV2hpdGVsaXN0LCBtR2F0dENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5UUkFOU1BPUlRfTEUsIGZhbHNlLCAoQmx1ZXRvb3RoRGV2aWNlLlBIWV9MRV8xTV9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuUEhZX0xFXzJNX01BU0sgfCBCbHVldG9vdGhEZXZpY2UuUEhZX0xFX0NPREVEX01BU0spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRydWUpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEaXNjb25uZWN0ZWQ6IGVycm9yIGNvbm5lY3RpbmcgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY29ubmVjdGVkOiBESVNDT05ORUNUIGlnbm9yZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygicmVtb3RlL3dsIGNvbm5lY3Rpb24sIGVuc3VyZSBjc2lwIGlzIHVwIGFzIHdlbGwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTm9DU0lQUmVjb25uID09IGZhbHNlICYmIG1TZXJ2aWNlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmlzTG9ja1N1cHBvcnRBdmFpbGFibGUobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLypfQ1NJUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2lwQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNldENvb3JkaW5hdG9yLmNvbm5lY3QobVNlcnZpY2UubUNzaXBBcHBJZCwgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vX0NTSVAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjb25lY3RlZDogQ29ubmVjdGlvbiBmYWlsZWQgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUFNZTkNfQUNUSVZFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiRElTQ09OTkVDVEVEOiBub3QgaGFuZGxlZCBtZXNzYWdlOiIgKyBtZXNzYWdlLndoYXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgICBjbGFzcyBDb25uZWN0aW5nIGV4dGVuZHMgU3RhdGUgewotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgICBsb2coICJFbnRlciBDb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKENPTk5FQ1RfVElNRU9VVCwgbURldmljZSwgbUNvbm5lY3RUaW1lb3V0TXMpOwotICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5lY3Rpb25TdGF0ZShtRGV2aWNlLCBtTGFzdENvbm5lY3Rpb25TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcpOwotICAgICAgICAgfQotCi0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICAgbG9nKCJFeGl0IENvbm5lY3RpbmcoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgICBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDT05ORUNUX1RJTUVPVVQpOwotICAgICAgICAgfQotCi0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgIGxvZygiQ29ubmVjdGluZyBwcm9jZXNzIG1lc3NhZ2UoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgIGxvZygiQWxyZWFkeSBDb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGxvZygiSWdub3JlIHRoaXMgY29ubmVjdGlvbiByZXF1ZXN0ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0aW5nOiBESVNDT05ORUNUIGRlZmVycmVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBSRUFEX0JBU1NfQ0hBUkFDVEVSSVNUSUNTOgotICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVmZXIgUkVBRF9CQVNTX0NIQVJBQ1RFUklTVElDUyByZXF1ZXN0ZWQhOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBDU0lQX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IChpbnQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8vKl9DU0lQCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNzaXBDb25uZWN0ZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgICJDU0lQIGlzIGFscmVhZHkgdXAsIGlnbm9yZSB0aGlzIERVUCBldmVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUNzaXBDb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ3NpcCBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNTSVAgQ29ubmVjdGlvbiBmYWlsZWQgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Rpc2MgYmFzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3Rpbmc6IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuaXNMb2NrU3VwcG9ydEF2YWlsYWJsZShtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8qX0NTSVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBMb2NrIHN1cHBvcnQgYXZhaWxhYmxlICYgY29ubmVjdCB0byBjc2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2lwQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXRDb29yZGluYXRvci5jb25uZWN0KG1TZXJ2aWNlLm1Dc2lwQXBwSWQsIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fQ1NJUCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGlvbiBmYWlsZWQgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfVElNRU9VVDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ09OTkVDVF9USU1FT1VUIik7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSAoQmx1ZXRvb3RoRGV2aWNlKSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBkZXZpY2UgdGltZW91dCAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIFBTWU5DX0FDVElWRV9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ09OTkVDVElORzogbm90IGhhbmRsZWQgbWVzc2FnZToiICsgbWVzc2FnZS53aGF0KTsKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgICB9Ci0gICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIHJldmVyc2VCeXRlcyhieXRlW10gYSkgewotICAgICAgICBpZiAobU5vUmV2ZXJzZSkgewotICAgICAgICAgICAgICAgbG9nKCJubyByZXZlcnNlIGlzIGVuYWJsZWQ+Iik7Ci0gICAgICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgfQotICAgICAgICBmb3IoaW50IGk9MDsgaTxhLmxlbmd0aC8yOyBpKyspewotICAgICAgICAgIGJ5dGUgdG1wID0gYVtpXTsKLSAgICAgICAgICBhW2ldID0gYVthLmxlbmd0aCAtaSAtMV07Ci0gICAgICAgICAgYVthLmxlbmd0aCAtaSAtMV0gPSB0bXA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBCbHVldG9vdGhBZGRyZXNzVG9CeXRlcyAoU3RyaW5nIHMpIHsKLSAgICAgICAgbG9nKCJCbHVldG9vdGhBZGRyZXNzVG9CeXRlczogaW5wdXQgc3RyaW5nOiIgKyBzKTsKLSAgICAgICAgU3RyaW5nW10gc3BsaXRzID0gcy5zcGxpdCgiOiIpOwotCi0gICAgICAgIGJ5dGVbXSBhZGRyZXNzQnl0ZXMgPSBuZXcgYnl0ZVs2XTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPDY7IGkrKykgewotICAgICAgICAgICAgaW50IGhleFZhbHVlID0gSW50ZWdlci5wYXJzZUludChzcGxpdHNbaV0sIDE2KTsKLSAgICAgICAgICAgIGxvZygiaGV4VmFsdWU6IiArIGhleFZhbHVlKTsKLSAgICAgICAgICAgIGFkZHJlc3NCeXRlc1tpXSA9IChieXRlKWhleFZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFkZHJlc3NCeXRlczsKLQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbnZlcnRCaXNJbmRpY2llc1RvSW50ZWdlclZhbHVlKExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYmlzSW5kaWNpZXMsIGludCBzdWJHcm91cElkKSB7Ci0gICAgICAgIGludCBhdWRpb0Jpc0luZGV4ID0gMDsKLSAgICAgICAgaWYgKGJpc0luZGljaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxiaXNJbmRpY2llcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChiaXNJbmRpY2llcy5nZXQoaSkuZ2V0U3RhdHVzKCkgPT0gdHJ1ZSAmJiBiaXNJbmRpY2llcy5nZXQoaSkuZ2V0U3ViR3JvdXBJZCgpID09IHN1Ykdyb3VwSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CaXNJbmRleCA9IGF1ZGlvQmlzSW5kZXggfCAxPDwoYmlzSW5kaWNpZXMuZ2V0KGkpLmdldEluZGV4KCktMSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyggInNldCB0aGUgYml0IiArIGJpc0luZGljaWVzLmdldChpKS5nZXRJbmRleCgpICsgImFmdGVyOiIgKyBhdWRpb0Jpc0luZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2coImJpc0luZGljaWVzIENoYW5uZWxzIGFyZSBudWxsIik7Ci0gICAgICAgICAgICBhdWRpb0Jpc0luZGV4ID0gMHhGRkZGRkZGRjsKLQotICAgICAgICB9Ci0gICAgICAgIGxvZyggImF1ZGlvQmlzSW5kZXgiICsgYXVkaW9CaXNJbmRleCk7Ci0KLSAgICAgICAgcmV0dXJuIGF1ZGlvQmlzSW5kZXg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gY29udmVydFNvdXJjZUluZm9Ub0FkZFNvdXJjZUJ5dGVBcnJheShCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8pIHsKLSAgICAgICAgYnl0ZVtdIHJlczsKLSAgICAgICAgLypmaXhlZCBsZW5ndGggZm9yIGFkZCBzb3VyY2Ugb3AqLwotICAgICAgICBpbnQgYWRkU291cmNlRml4ZWRMZW5ndGggPSAxNjsKLSAgICAgICAgYnl0ZVtdIG1ldGFEYXRhTGVuZ3RoID0gbnVsbDsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGJyb2FkY2FzdFNvdXJjZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBsb2NhbEJjYXN0QWRkciA9IG51bGw7Ci0gICAgICAgIEJDU2VydmljZS5QQVJlc3VsdHMgcGFSZXMgPSBudWxsOwotICAgICAgICBsb2coIkdldCBQQXJlc3VsdHMgZm9yIDoiICsgc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSk7Ci0gICAgICAgIGJyb2FkY2FzdFNvdXJjZSA9IHNyY0luZm8uZ2V0U291cmNlRGV2aWNlKCk7Ci0KLSAgICAgICAgLy8vKl9CTVMKLSAgICAgICAgaWYgKG1QdWJsaWNBZGRyRm9yY1NyYyA9PSBmYWxzZSkgewotICAgICAgICAgICAgaWYgKGlzTG9jYWxCcm9hZGNhc3RTb3VyY2UoYnJvYWRjYXN0U291cmNlKSl7Ci0gICAgICAgICAgICAgICAgLy91cGRhdGUgYnJvYWRjYXN0U291cmNlIGlmIGl0IGlzIGNvbG9jYXRlZAotICAgICAgICAgICAgICAgIGlmIChtQkFTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxCY2FzdEFkZHIgPSBtQkFTZXJ2aWNlLkJyb2FkY2FzdEdldEFkdkFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsQmNhc3RBZGRyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY29udmVydFNvdXJjZUluZm9Ub0FkZFNvdXJjZUJ5dGVBcnJheTogbG9jYWxCQ2FzdCBub3QgYXZhaWFibGUiKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MoQUREX0JDQVNUX1NPVVJDRSxJTlZBTElEX1NSQ19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfU09VUkNFX1VOQVZBSUxBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuZ2V0UmVtb3RlRGV2aWNlKGxvY2FsQmNhc3RBZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJjb252ZXJ0U291cmNlSW5mb1RvQWRkU291cmNlQnl0ZUFycmF5OiBjb2xvY2F0ZWQgY2FzZTogIiArIGJyb2FkY2FzdFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vX0JNUyovCi0gICAgICAgIHBhUmVzID0gbVNlcnZpY2UuZ2V0UEFSZXN1bHRzKGJyb2FkY2FzdFNvdXJjZSk7Ci0gICAgICAgIGlmIChwYVJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJObyBtYXRoY2luZyBwc3luYywgc2NhbiByZXMgZm9yIHRoaXMgYWRkaXRpb24iKTsKLSAgICAgICAgICAgIHNlbmRQZW5kaW5nQ2FsbGJhY2tzKEFERF9CQ0FTVF9TT1VSQ0UsSU5WQUxJRF9TUkNfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX1NPVVJDRV9VTkFWQUlMQUJMRSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcG9wdWxhdGUgbWV0YWRhdGEgZnJvbSBCQVNFIGxldmVsT25lCi0gICAgICAgIEJhc2VEYXRhIGJhc2VfID0gbVNlcnZpY2UuZ2V0QkFTRShwYVJlcy5tU3luY0hhbmRsZSk7Ci0gICAgICAgIGlmIChiYXNlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJObyB2YWxpZCBiYXNlIGRhdGEgcG9wdWxhdGVkIGZvciB0aGlzIGRldmljZSIpOwotICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MoQUREX0JDQVNUX1NPVVJDRSxJTlZBTElEX1NSQ19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfU09VUkNFX1VOQVZBSUxBQkxFKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGludCBudW1TdWJHcm91cHMgPSBiYXNlXy5nZXROdW1iZXJPZlN1Ymdyb3Vwc29mQklHKCk7Ci0gICAgICAgIG1ldGFEYXRhTGVuZ3RoID0gbmV3IGJ5dGVbbnVtU3ViR3JvdXBzXTsKLSAgICAgICAgaW50IHRvdGFsTWV0YWRhdGFMZW5ndGggPSAwOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3ViR3JvdXBzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChiYXNlXy5nZXRNZXRhZGF0YShpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAibm8gdmFsaWQgbWV0YWRhdGEgZnJvbSBCQVNFIik7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFMZW5ndGhbaV0gPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUxlbmd0aFtpXSA9IChieXRlKWJhc2VfLmdldE1ldGFkYXRhKGkpLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBsb2coIm1ldGFEYXRhTGVuZ3RoIHVwZGF0ZWQ6IiArIG1ldGFEYXRhTGVuZ3RoW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsTWV0YWRhdGFMZW5ndGggPSB0b3RhbE1ldGFkYXRhTGVuZ3RoICsgbWV0YURhdGFMZW5ndGhbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gbmV3IGJ5dGUgW2FkZFNvdXJjZUZpeGVkTGVuZ3RoICsgbnVtU3ViR3JvdXBzKjUgKyB0b3RhbE1ldGFkYXRhTGVuZ3RoXTsKLSAgICAgICAgc3JjSW5mby5zZXRTb3VyY2VEZXZpY2UoYnJvYWRjYXN0U291cmNlKTsKLSAgICAgICAgc3JjSW5mby5zZXRBZHZBZGRyZXNzVHlwZSgoYnl0ZSlwYVJlcy5tQWRkcmVzc1R5cGUpOwotICAgICAgICBzcmNJbmZvLnNldEFkdmVydGlzaW5nU2lkKChieXRlKXBhUmVzLm1BZHZTaWQpOwotICAgICAgICBzcmNJbmZvLnNldEJyb2FkY2FzdGVySWQocGFSZXMubUJyb2FkY2FzdElkKTsKLQotICAgICAgICBpZiAoaXNWYWxpZEJyb2FkY2FzdFNvdXJjZUluZm8oc3JjSW5mbykgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIGxvZygiRGlzY2FyZGluZyB0aGlzIEFkZCBCcm9hZGNhc3Qgc291cmNlIElmIEl0IGlzIERVUCIpOwotICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MoQUREX0JDQVNUX1NPVVJDRSxJTlZBTElEX1NSQ19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19EVVBMSUNBVEVfQURESVRJT04pOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXNbMF0gPSBCQVNTX0FERF9TT1VSQ0VfT1BDT0RFOwotICAgICAgICByZXNbMV0gPSAoYnl0ZSlwYVJlcy5tQWRkcmVzc1R5cGU7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzID0gYnJvYWRjYXN0U291cmNlLmdldEFkZHJlc3MoKTsKLSAgICAgICAgYnl0ZVtdIGFkZHJCeXRlVmFsID0gQmx1ZXRvb3RoQWRkcmVzc1RvQnl0ZXMoYWRkcmVzcyk7Ci0gICAgICAgIGxvZygiQWRkcmVzcyBieXRlczogIiArIEFycmF5cy50b1N0cmluZyhhZGRyQnl0ZVZhbCkpOwotICAgICAgICBieXRlW10gcmV2QWRkcmVzcz0gcmV2ZXJzZUJ5dGVzKGFkZHJCeXRlVmFsKTsKLSAgICAgICAgbG9nKCJyZXZlcnNlIEFkZHJlc3MgYnl0ZXM6ICIgKyBBcnJheXMudG9TdHJpbmcocmV2QWRkcmVzcykpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldkFkZHJlc3MsIDAsIHJlcywgMiwgNik7Ci0gICAgICAgIHJlc1s4XSA9IChieXRlKXBhUmVzLm1BZHZTaWQ7Ci0KLSAgICAgICAgLy9TeXN0ZW0uYXJyYXljb3B5KHBhUmVzLm1Ccm9hZGNhc3RJZCwgMCwgcmVzLCA5LCBCUk9BRENBU1RfU09VUkNFX0lEX0xFTkdUSCk7Ci0gICAgICAgIGxvZygibUJyb2FkY2FzdElkOiAiICsgcGFSZXMubUJyb2FkY2FzdElkKTsKLSAgICAgICAgcmVzWzldID0gKGJ5dGUpKHBhUmVzLm1Ccm9hZGNhc3RJZCAmIDB4MDAwMDAwMDAwMDAwMDBGRik7Ci0gICAgICAgIHJlc1sxMF0gPSAoYnl0ZSkoKHBhUmVzLm1Ccm9hZGNhc3RJZCAmIDB4MDAwMDAwMDAwMDAwRkYwMCkgPj4+IDgpOwotICAgICAgICByZXNbMTFdID0gKGJ5dGUpKChwYVJlcy5tQnJvYWRjYXN0SWQgJiAweDAwMDAwMDAwMDBGRjAwMDApID4+PiAxNik7Ci0gICAgICAgIGlmIChtRGVmTm9QQVMgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgICAgICBzcmNJbmZvLmdldE1ldGFkYXRhU3luY1N0YXRlKCkgPT0gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQykgewotICAgICAgICAgICAgcmVzWzEyXSA9IChieXRlKSgweDAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygic2V0dGluZyBQQSBzeW5jIHRvIFpFUk8iKTsKLSAgICAgICAgICAgIHJlc1sxMl0gPSAoYnl0ZSkweDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzWzEzXSA9IChieXRlKShwYVJlcy5tUEFJbnRlcnZhbCAmIDB4MDAwMDAwMDAwMDAwMDBGRik7Ci0gICAgICAgIHJlc1sxNF0gPSAoYnl0ZSkoKHBhUmVzLm1QQUludGVydmFsICYgMHgwMDAwMDAwMDAwMDBGRjAwKT4+PjgpOwotCi0gICAgICAgIHJlc1sxNV0gPSBiYXNlXy5nZXROdW1iZXJPZlN1Ymdyb3Vwc29mQklHKCk7Ci0KLSAgICAgICAgaW50IG9mZnNldCA9IDE2OwotICAgICAgICBmb3IgKGludCBpPTA7IGk8YmFzZV8uZ2V0TnVtYmVyT2ZTdWJncm91cHNvZkJJRygpOyBpKyspIHsKLQotICAgICAgICAgICAgLy9TZWxlY3QgYmFzZWQgb24gUEFDcz8KLSAgICAgICAgICAgIC8vaW50IGJpc0luZGV4VmFsdWUgPSBjb252ZXJ0QmlzSW5kaWNpZXNUb0ludGVnZXJWYWx1ZShzcmNJbmZvLmdldEJyb2FkY2FzdENoYW5uZWxzU3luY1N0YXR1cygpKTsKLSAgICAgICAgICAgIGludCBiaXNJbmRleFZhbHVlID0gY29udmVydEJpc0luZGljaWVzVG9JbnRlZ2VyVmFsdWUobVNlcnZpY2UuZ2V0QmFzc1V0aWxzKCkuc2VsZWN0QmlzZXMobURldmljZSwgc3JjSW5mbywgYmFzZV8pLCBpKTsKLQotICAgICAgICAgICAgcmVzW29mZnNldCsrXSA9IChieXRlKShiaXNJbmRleFZhbHVlICYgMHgwMDAwMDAwMDAwMDAwMEZGKTsKLSAgICAgICAgICAgIHJlc1tvZmZzZXQrK10gPSAoYnl0ZSkoKGJpc0luZGV4VmFsdWUgJiAweDAwMDAwMDAwMDAwMEZGMDApPj4+OCk7Ci0gICAgICAgICAgICByZXNbb2Zmc2V0KytdID0gKGJ5dGUpKChiaXNJbmRleFZhbHVlICYgMHgwMDAwMDAwMDAwRkYwMDAwKT4+PjE2KTsKLSAgICAgICAgICAgIHJlc1tvZmZzZXQrK10gPSAoYnl0ZSkoKGJpc0luZGV4VmFsdWUgJiAweDAwMDAwMDAwRkYwMDAwMDApPj4+MjQpOwotCi0gICAgICAgICAgICByZXNbb2Zmc2V0KytdID0gbWV0YURhdGFMZW5ndGhbaV07Ci0gICAgICAgICAgICBpZiAobWV0YURhdGFMZW5ndGhbaV0gIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChpc0xvY2FsQnJvYWRjYXN0U291cmNlKGJyb2FkY2FzdFNvdXJjZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJldk1ldGFkYXRhID0gcmV2ZXJzZUJ5dGVzKGJhc2VfLmdldE1ldGFkYXRhKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXZNZXRhZGF0YSwgMCwgcmVzLCBvZmZzZXQsIG1ldGFEYXRhTGVuZ3RoW2ldKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJhc2VfLmdldE1ldGFkYXRhKGkpLCAwLCByZXMsIG9mZnNldCwgbWV0YURhdGFMZW5ndGhbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIG1ldGFEYXRhTGVuZ3RoW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nKCJBRERfQkNBU1RfU09VUkNFIGluIEJ5dGVzIik7Ci0gICAgICAgIEJhc3NVdGlscy5wcmludEJ5dGVBcnJheShyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIGNvbnZlcnRTb3VyY2VJbmZvVG9VcGRhdGVTb3VyY2VCeXRlQXJyYXkoQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvKSB7Ci0gICAgICAgIGJ5dGVbXSByZXM7Ci0gICAgICAgIGludCB1cGRhdGVTb3VyY2VGaXhlZExlbmd0aCA9IDY7Ci0gICAgICAgIEJDU2VydmljZS5QQVJlc3VsdHMgcGFSZXMgPSBudWxsOwotICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIGV4aXN0aW5nU0kgPSBnZXRCcm9hZGNhc3RTb3VyY2VJbmZvRm9yU291cmNlSWQoc3JjSW5mby5nZXRTb3VyY2VJZCgpKTsKLSAgICAgICAgaWYgKGV4aXN0aW5nU0kgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCJubyBleGlzdGluZyBTSSBmb3IgdXBkYXRlIHNvdXJjZSBvcCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlIG51bVN1Ykdyb3VwcyA9IGV4aXN0aW5nU0kuZ2V0TnVtYmVyT2ZTdWJHcm91cHMoKTsKLSAgICAgICAgLy9vbiBNb2RpZnkgc291cmNlLCBkb250IHVwZGF0ZSBhbnkgTWV0YWRhdGEKLSAgICAgICAgYnl0ZSBtZXRhRGF0YUxlbmd0aCA9IDA7Ci0gICAgICAgIHJlcyA9IG5ldyBieXRlIFt1cGRhdGVTb3VyY2VGaXhlZExlbmd0aCArIG51bVN1Ykdyb3Vwcyo1XTsKLQotICAgICAgICByZXNbMF0gPSBCQVNTX1VQREFURV9TT1VSQ0VfT1BDT0RFOwotICAgICAgICByZXNbMV0gPSBzcmNJbmZvLmdldFNvdXJjZUlkKCk7Ci0KLSAgICAgICAgaWYgKHNyY0luZm8uZ2V0TWV0YWRhdGFTeW5jU3RhdGUoKSA9PSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JTl9TWU5DKSB7Ci0gICAgICAgICAgICByZXNbMl0gPSAoYnl0ZSkoMHgwMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNbMl0gPSAoYnl0ZSkweDAwOwotICAgICAgICB9Ci0gICAgICAgIC8vdXBkYXRlIHRoZXNlIGZyb20gZXhpc3RpbmcgU0kKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGV4aXN0aW5nU3JjRGV2aWNlID0gZXhpc3RpbmdTSS5nZXRTb3VyY2VEZXZpY2UoKTsKLSAgICAgICAgaWYgKGlzQWRkZWRCcm9hZGNhc3RTb3VyY2VJc0xvY2FsKGV4aXN0aW5nU3JjRGV2aWNlKSkgewotICAgICAgICAgICAgaW50IHBhSW50ZXJ2YWwgPSAweDAwMDBGRkZGOwotICAgICAgICAgICAgcGFJbnRlcnZhbCA9IG1CQVNlcnZpY2UuQnJvYWRjYXN0R2V0QWR2SW50ZXJ2YWwoKTsKLSAgICAgICAgICAgIHJlc1s0XSA9IChieXRlKSgocGFJbnRlcnZhbCAmIDB4MDAwMDAwMDAwMDAwRkYwMCk+Pj44KTsKLSAgICAgICAgICAgIHJlc1szXSA9IChieXRlKShwYUludGVydmFsICYgMHgwMDAwMDAwMDAwMDAwMEZGKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vZm9yIG5vbi1jIG1tb2RpZnkgb3AsIHNldCBQQSBJbnRlcnZhbCBhcyBVTktOT1dOCi0gICAgICAgICAgICByZXNbNF0gPSAoYnl0ZSkweEZGOwotICAgICAgICAgICAgcmVzWzNdID0gKGJ5dGUpMHhGRjsKLSAgICAgICAgfQotICAgICAgICAvL0ZvciBtb2RpZnkgb3AsIGp1c3Qgc2V0IG51bWJlciBvZiBTdWJncm91cHMgYXMgVU5LTk9XTgotICAgICAgICAvL1pFUk8gaXMgdHJlYXRlZCBhcyBVTktOT1dOCi0gICAgICAgIHJlc1s1XSA9IG51bVN1Ykdyb3VwczsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gNjsKLSAgICAgICAgaW50IGJpc0luZGV4VmFsdWUgPSAwOwotICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gYmlzSW5kZXhMaXN0ID0gIGV4aXN0aW5nU0kuZ2V0QmlzSW5kZXhMaXN0KCk7Ci0gICAgICAgIGlmIChzcmNJbmZvLmdldEF1ZGlvU3luY1N0YXRlKCkgPT0gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfU1lOQ0hST05JWkVEKSB7Ci0gICAgICAgICAgICAvL0ZvcmNlIEJJUyBpbmRleCB2YWx1ZSB0byBOT19QUkVGIGZvciBtb2RpZnkgU1JDCi0gICAgICAgICAgICBiaXNJbmRleFZhbHVlID0gMHhGRkZGRkZGRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJpc0luZGV4VmFsdWUgPSAweDAwMDAwMDAwOwotICAgICAgICB9Ci0gICAgICAgIGxvZygiVVBEQVRFX0JDQVNUX1NPVVJDRSBiNDogYmlzSW5kZXhWYWx1ZSA6ICIgKyBiaXNJbmRleFZhbHVlKTsKLSAgICAgICAgLy9JZiB0aGVyZSBpcyBhbiBlbXB0eSBMaXN0LCBzZXQgTk8gcHJlZiBhbGwgc3ViZ3JvdXBzCi0gICAgICAgIGlmIChiaXNJbmRleExpc3QgPT0gbnVsbCB8fCBiaXNJbmRleExpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIGJpc0luZGV4VmFsdWUgPSAweEZGRkZGRkZGOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdWJHcm91cHM7IGkrKykgewotCi0gICAgICAgICAgICAvL1NlbGVjdCBiYXNlZCBvbiBQQUNzPwotICAgICAgICAgICAgLy9pbnQgYmlzSW5kZXhWYWx1ZSA9IGNvbnZlcnRCaXNJbmRpY2llc1RvSW50ZWdlclZhbHVlKHNyY0luZm8uZ2V0QnJvYWRjYXN0Q2hhbm5lbHNTeW5jU3RhdHVzKCkpOwotICAgICAgICAgICAgaWYgKGJpc0luZGV4VmFsdWUgIT0gMHhGRkZGRkZGRiAmJiBiaXNJbmRleFZhbHVlICE9IDApIHsKLSAgICAgICAgICAgICAgICBiaXNJbmRleFZhbHVlID0gYmlzSW5kZXhMaXN0LmdldChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZygiVVBEQVRFX0JDQVNUX1NPVVJDRTogYmlzSW5kZXhWYWx1ZSA6ICIgKyBiaXNJbmRleFZhbHVlKTsKLQotICAgICAgICAgICAgcmVzW29mZnNldCsrXSA9IChieXRlKShiaXNJbmRleFZhbHVlICYgMHgwMDAwMDAwMDAwMDAwMEZGKTsKLSAgICAgICAgICAgIHJlc1tvZmZzZXQrK10gPSAoYnl0ZSkoKGJpc0luZGV4VmFsdWUgJiAweDAwMDAwMDAwMDAwMEZGMDApPj4+OCk7Ci0gICAgICAgICAgICByZXNbb2Zmc2V0KytdID0gKGJ5dGUpKChiaXNJbmRleFZhbHVlICYgMHgwMDAwMDAwMDAwRkYwMDAwKT4+PjE2KTsKLSAgICAgICAgICAgIHJlc1tvZmZzZXQrK10gPSAoYnl0ZSkoKGJpc0luZGV4VmFsdWUgJiAweDAwMDAwMDAwRkYwMDAwMDApPj4+MjQpOwotCi0gICAgICAgICAgICByZXNbb2Zmc2V0KytdID0gbWV0YURhdGFMZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nKCJVUERBVEVfQkNBU1RfU09VUkNFIGluIEJ5dGVzIik7Ci0gICAgICAgIEJhc3NVdGlscy5wcmludEJ5dGVBcnJheShyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIGNvbnZlcnRBc2NpaXRvVmFsdWVzIChieXRlW10gdmFsKSB7Ci0gICAgICAgIGJ5dGVbXSByZXQgPSBuZXcgYnl0ZVt2YWwubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB2YWwubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJldFtpXSA9IChieXRlKSh2YWxbaV0gLSAoYnl0ZSknMCcpOwotICAgICAgICB9Ci0gICAgICAgIGxvZygiY29udmVydEFzY2lpdG9WYWx1ZXM6IHJldHVybnM6IiArIEFycmF5cy50b1N0cmluZyh2YWwpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBjb252ZXJ0U291cmNlSW5mb1RvU2V0QnJvYWRjYXN0Q29kZUJ5dGVBcnJheShCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8pIHsKLQotICAgICAgICBieXRlW10gcmVzID0gbmV3IGJ5dGVbUElOX0NPREVfQ01EX0xFTl07Ci0gICAgICAgIHJlc1swXSA9IEJBU1NfU0VUX0JDQVNUX1BJTl9PUENPREU7Ci0gICAgICAgIHJlc1sxXSA9IHNyY0luZm8uZ2V0U291cmNlSWQoKTsKLSAgICAgICAgbG9nKCJjb252ZXJ0U291cmNlSW5mb1RvU2V0QnJvYWRjYXN0Q29kZUJ5dGVBcnJheTogU291cmNlIGRldmljZSA6ICIgKyBzcmNJbmZvLmdldFNvdXJjZURldmljZSgpKTsKLSAgICAgICAgYnl0ZVtdIGFjdHVhbFBJTiA9IG51bGw7Ci0gICAgICAgIC8vc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKSB3aWxsIGJlIE5VTEwgaWYgdGhpcyByZXF1ZXN0IGNvbWluZyBmcm9tIFNESwotICAgICAgICAvLyBzcmNJbmZvLmdldFNvdXJjZURldmljZSgpIHdpbGwgaGF2ZSB2YWxpZCBTb3VyY2UgZGV2aWNlIG9ubHkgSWYgdGhpcyBpcwotICAgICAgICAvL2NvbGxvY2F0ZWQgZGV2aWNlCi0gICAgICAgIGlmIChzcmNJbmZvLmdldFNvdXJjZURldmljZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIGlzQWRkZWRCcm9hZGNhc3RTb3VyY2VJc0xvY2FsKHNyY0luZm8uZ2V0U291cmNlRGV2aWNlKCkpKSB7Ci0gICAgICAgICAgICAvL2NvbG9jYXRlZCBTb3VyY2UgYWRkaXRpb24KLSAgICAgICAgICAgIC8vcXVlcnkgdGhlIEVuY3J5cHRpb24gS2V5IGZyb20gQk1TIGFuZCB1cGRhdGUKLSAgICAgICAgICAgIC8vLypfQk1TCi0gICAgICAgICAgICBhY3R1YWxQSU4gPSBtQkFTZXJ2aWNlLkdldEVuY3J5cHRpb25LZXkobnVsbCk7Ci0gICAgICAgICAgICAvL19CTVMqLwotICAgICAgICAgICAgbG9nKCJjb2xvY2F0ZWRCY2FzdENvZGUgaXMgIiArIEFycmF5cy50b1N0cmluZyhhY3R1YWxQSU4pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vQ2FuIEtlZXAgYXMgQVNDSUkgYXMgaXMKLSAgICAgICAgICAgIFN0cmluZyByZXZlcnNlUElOID0gbmV3IFN0cmluZ0J1ZmZlcihzcmNJbmZvLmdldEJyb2FkY2FzdENvZGUoKSkucmV2ZXJzZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBhY3R1YWxQSU4gPSByZXZlcnNlUElOLmdldEJ5dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjdHVhbFBJTiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJhY3R1YWwgUElOIGlzIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nKCAiYnl0ZSBhcnJheSBicm9hZGNhc3QgQ29kZToiICsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbFBJTikpOwotICAgICAgICAgICAgbG9nKCAicGluTGVuZ3RoOiIgKyBhY3R1YWxQSU4ubGVuZ3RoKTsKLQotICAgICAgICAgICAgLy9GaWxsIHRoZSBQSU4gY29kZSBpbiB0aGUgTGFzdCBQb3NpdGlvbgotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhY3R1YWxQSU4sIDAsIHJlcywgKChQSU5fQ09ERV9DTURfTEVOKS1hY3R1YWxQSU4ubGVuZ3RoKSwgYWN0dWFsUElOLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGxvZygiU0VUX0JDQVNUX1BJTiBpbiBCeXRlcyIpOwotICAgICAgICAgICAgQmFzc1V0aWxzLnByaW50Qnl0ZUFycmF5KHJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gSXNJdFJpZ2h0VGltZVRvVXBkYXRlQnJvYWRjYXN0UElOKGJ5dGUgc3JjSWQpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBzcmNJbmZvcyA9IG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvcy52YWx1ZXMoKTsKLSAgICAgICAgSXRlcmF0b3I8QmxlQnJvYWRjYXN0U291cmNlSW5mbz4gaXRlcmF0b3IgPSBzcmNJbmZvcy5pdGVyYXRvcigpOwotICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICBpZiAobUZvcmNlU0IpIHsKLSAgICAgICAgICAgIGxvZygiZm9yY2UgU0IgaXMgc2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNJID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKHNJID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coInNyYyBJbmZvIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNJZCA9PSBzSS5nZXRTb3VyY2VJZCgpICYmCi0gICAgICAgICAgICAgICAgc0kuZ2V0RW5jcnlwdGlvblN0YXR1cygpID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfUElOX05FRURFRCkgewotICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nKCJJc0l0UmlnaHRUaW1lVG9VcGRhdGVCcm9hZGNhc3RQSU4gcmV0dXJuaW5nOiIgKyByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIENvbm5lY3RlZCBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgbG9nKCAiRW50ZXIgQ29ubmVjdGVkKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotCi0gICAgICAgICAgICByZW1vdmVEZWZlcnJlZE1lc3NhZ2VzKENPTk5FQ1QpOwotICAgICAgICAgICAgaWYgKG1MYXN0Q29ubmVjdGlvblN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJDT05ORUNURUQtPkNPTk5URUNURUQ6IElnbm9yZSIpOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0Q29ubmVjdGlvblN0YXRlKG1EZXZpY2UsIG1MYXN0Q29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAvL2luaXRpYWxpemUgUEFDcyBmb3IgdGhpcyBkZXZpY2VzCi0gICAgICAgICAgICAgICAgaWYgKG1QYWNzQXZhaWwgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBQYWNzQ2xpZW50U2VydmljZSBtUGFjc0NsaWVudFNlcnZpY2UgPSBQYWNzQ2xpZW50U2VydmljZS5nZXRQYWNzQ2xpZW50U2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVBhY3NDbGllbnRTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygidHJpZ2dlciBjb25uZWN0IHRvIFBhY3MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNzQ2xpZW50U2VydmljZS5jb25uZWN0KG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUEFDcyBpbnRlcmZhY2UgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vLypfVkNQCi0gICAgICAgICAgICAgICAgaWYgKG1WY3BGb3JCcm9hZGNhc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgVmNwQ29udHJvbGxlciB2Y3BDb250cm9sbGVyID0gVmNwQ29udHJvbGxlci5nZXRWY3BDb250cm9sbGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2Y3BDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygidHJpZ2dlciBjb25uZWN0IHRvIFZjcCBSZW5kZXJlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2Y3BDb250cm9sbGVyLmNvbm5lY3QobURldmljZSwgQmx1ZXRvb3RoVmNwLk1PREVfQlJPQURDQVNUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29ubmVjdCB2Y3AgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJWY3BDb250cm9sbGVyIGludGVyZmFjZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9fVkNQKi8KLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIGxvZygiRXhpdCBDb25uZWN0ZWQoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJDb25uZWN0ZWQgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvOwotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RlZDogQ09OTkVDVCBpZ25vcmVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1RyaWdnZXIgdGhlIENTaXAgZGlzY29ubmVjdGlvbiwgZG9udCB3b3JyeSBhYm91dCBwYXNzL2ZhaWx1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3NpcENvbm5lY3RlZCAmJiBtU2V0Q29vcmRpbmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2V0Q29vcmRpbmF0b3IuZGlzY29ubmVjdChtU2VydmljZS5tQ3NpcEFwcElkLCBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNzaXBDb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibUJsdWV0b290aEdhdHQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0ZWQ6Y29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkOiIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIEJhc3MiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJ1bmV4cGVjdGVkIGRpc2Nvbm5lY3RlZCBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLy8qX0NTSVAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vVHJpZ2dlciB0aGUgQ1NpcCBkaXNjb25uZWN0aW9uLCBkb250IHdvcnJ5IGFib3V0IHBhc3MvZmFpbHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Dc2lwQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2V0Q29vcmRpbmF0b3IuZGlzY29ubmVjdChtU2VydmljZS5tQ3NpcEFwcElkLCBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2lwQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL19DU0lQKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJFQURfQkFTU19DSEFSQUNURVJJU1RJQ1M6Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYyBjaGFyYWN0ZXJpc3RpYyA9IChCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5yZWFkQ2hhcmFjdGVyaXN0aWMoY2hhcmFjdGVyaXN0aWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWRQcm9jZXNzaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJFQURfQkFTU19DSEFSQUNURVJJU1RJQ1MgaXMgaWdub3JlZCwgR2F0dCBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfU0NBTl9PRkZMT0FEOgotICAgICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEdhdHQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50LnNldFZhbHVlKFJFTU9URV9TQ0FOX1NUQVJUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhHYXR0LndyaXRlQ2hhcmFjdGVyaXN0aWMobUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdPcGVyYXRpb24gPSBtZXNzYWdlLndoYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZFByb2Nlc3NpbmcpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJubyBCbHVldG9vdGggR2F0dCBoYW5kbGUsIG1heSBuZWVkIHRvIGZldGNoIHdyaXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1NDQU5fT0ZGTE9BRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQuc2V0VmFsdWUoUkVNT1RFX1NDQU5fU1RPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC53cml0ZUNoYXJhY3RlcmlzdGljKG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nT3BlcmF0aW9uID0gbWVzc2FnZS53aGF0OwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWRQcm9jZXNzaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibm8gQmx1ZXRvb3RoIEdhdHQgaGFuZGxlLCBtYXkgbmVlZCB0byBmZXRjaCB3cml0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VMRUNUX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzID0gKFNjYW5SZXN1bHQpbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0byA9ICgoaW50KSBtZXNzYWdlLmFyZzEpID09IEFVVE87Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cE9wID0gKChpbnQpIG1lc3NhZ2UuYXJnMikgPT0gR1JPVVBfT1A7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEJyb2FkY2FzdFNvdXJjZShzY2FuUmVzLCBpc0dyb3VwT3AsIGF1dG8pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFERF9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHNyY0luZm8gPSAoQmxlQnJvYWRjYXN0U291cmNlSW5mbyltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJBZGRpbmcgQnJvYWRjYXN0IHNvdXJjZSIgKyBzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFkZFNvdXJjZUluZm8gPSAgY29udmVydFNvdXJjZUluZm9Ub0FkZFNvdXJjZUJ5dGVBcnJheShzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFNvdXJjZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWRkIHNvdXJjZTogc291cmNlIEluZm8gaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQuc2V0VmFsdWUoYWRkU291cmNlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC53cml0ZUNoYXJhY3RlcmlzdGljKG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nT3BlcmF0aW9uID0gbWVzc2FnZS53aGF0OwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWRQcm9jZXNzaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChHQVRUX1RYTl9USU1FT1VULCBHQVRUX1RYTl9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkFERF9CQ0FTVF9TT1VSQ0U6IG5vIEJsdWV0b290aCBHYXR0IGhhbmRsZSwgRmF0YWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRQZW5kaW5nQ2FsbGJhY2tzKEFERF9CQ0FTVF9TT1VSQ0UsSU5WQUxJRF9TUkNfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfRkFUQUwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgc3JjSW5mbyA9IChCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBtQXV0b1RyaWdnZXJyZWQgPSAoKGludCkgbWVzc2FnZS5hcmcxKSA9PSBBVVRPOwotICAgICAgICAgICAgICAgICAgICBsb2coIlVwZGF0aW5nIEJyb2FkY2FzdCBzb3VyY2UiICsgc3JjSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB1cGRhdGVTb3VyY2VJbmZvID0gIGNvbnZlcnRTb3VyY2VJbmZvVG9VcGRhdGVTb3VyY2VCeXRlQXJyYXkoc3JjSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVTb3VyY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInVwZGF0ZSBzb3VyY2U6IHNvdXJjZSBJbmZvIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50LnNldFZhbHVlKHVwZGF0ZVNvdXJjZUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQud3JpdGVDaGFyYWN0ZXJpc3RpYyhtQnJvYWRjYXN0U2NhbkNvbnRyb2xQb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ09wZXJhdGlvbiA9IG1lc3NhZ2Uud2hhdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU291cmNlSWQgPSBzcmNJbmZvLmdldFNvdXJjZUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZFByb2Nlc3NpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKEdBVFRfVFhOX1RJTUVPVVQsIEdBVFRfVFhOX1RJTUVPVVRfTVMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVVBEQVRFX0JDQVNUX1NPVVJDRTogbm8gQmx1ZXRvb3RoIEdhdHQgaGFuZGxlLCBGYXRhbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MoVVBEQVRFX0JDQVNUX1NPVVJDRSxJTlZBTElEX1NSQ19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19GQVRBTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfQkNBU1RfQ09ERToKLSAgICAgICAgICAgICAgICAgICAgc3JjSW5mbyA9IChCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBpbnQgY21kVHlwZSA9IG1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTRVRfQkNBU1RfQ09ERSBzcmNJbmZvOiAiICsgc3JjSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNtZFR5cGUgIT0gUVVFVUVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBJc0l0UmlnaHRUaW1lVG9VcGRhdGVCcm9hZGNhc3RQSU4oc3JjSW5mby5nZXRTb3VyY2VJZCgpKSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0QnJvYWRjYXN0Q29kZVBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldEJyb2FkY2FzdFBJTlNyY0luZm8gPSBzcmNJbmZvOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJJZ25vcmUgU0VUX0JDQVNUIG5vdywgYnV0IHN0b3JlIGl0IGZvciBsYXRlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9ub3RpZnkgc28gdGhhdCBsb2NrIHJlbGVhc2UgaGFwcGVucyBhcyBTRVRfQkNBU1RfQ09ERQotICAgICAgICAgICAgICAgICAgICAgICAgLy9xdWV1ZWQgZm9yIGZ1dHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uubm90aWZ5T3BlcmF0aW9uQ29tcGxldGlvbihtRGV2aWNlLFNFVF9CQ0FTVF9DT0RFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzZXRCcm9hZGNhc3RQSU5jbWQgPSAgY29udmVydFNvdXJjZUluZm9Ub1NldEJyb2FkY2FzdENvZGVCeXRlQXJyYXkoc3JjSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0QnJvYWRjYXN0UElOY21kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTRVRfQkNBU1RfQ09ERTogQnJvYWRjYXN0IGNvZGUgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50LnNldFZhbHVlKHNldEJyb2FkY2FzdFBJTmNtZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQud3JpdGVDaGFyYWN0ZXJpc3RpYyhtQnJvYWRjYXN0U2NhbkNvbnRyb2xQb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdPcGVyYXRpb24gPSBtZXNzYWdlLndoYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTb3VyY2VJZCA9IHNyY0luZm8uZ2V0U291cmNlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZFByb2Nlc3NpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChHQVRUX1RYTl9USU1FT1VULCBHQVRUX1RYTl9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU0VUX0JDQVNUX0NPREU6IG5vIEJsdWV0b290aCBHYXR0IGhhbmRsZSwgRmF0YWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUGVuZGluZ0NhbGxiYWNrcyhTRVRfQkNBU1RfQ09ERSxJTlZBTElEX1NSQ19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfRkFUQUwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgICAgICBieXRlIHNvdXJjZUlkID0gKGJ5dGUpbWVzc2FnZS5hcmcxOwotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgYXVkaW9TcmMgPSAoQmx1ZXRvb3RoRGV2aWNlKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIlJlbW92aW5nIEJyb2FkY2FzdCBzb3VyY2U6IGF1ZGlvU291cmNlOiIgKyBhdWRpb1NyYyArICJzb3VyY2VJZDoiICsgc291cmNlSWQpOwotICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVtb3ZlU291cmNlSW5mbyA9IG5ldyBieXRlIFsyXTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU291cmNlSW5mb1swXSA9IEJBU1NfUkVNT1ZFX1NPVVJDRV9PUENPREU7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVNvdXJjZUluZm9bMV0gPSBzb3VyY2VJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhHYXR0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFNjYW5Db250cm9sUG9pbnQuc2V0VmFsdWUocmVtb3ZlU291cmNlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC53cml0ZUNoYXJhY3RlcmlzdGljKG1Ccm9hZGNhc3RTY2FuQ29udHJvbFBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nT3BlcmF0aW9uID0gbWVzc2FnZS53aGF0OwotICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTb3VyY2VJZCA9IHNvdXJjZUlkOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWRQcm9jZXNzaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChHQVRUX1RYTl9USU1FT1VULCBHQVRUX1RYTl9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJFTU9WRV9CQ0FTVF9TT1VSQ0U6IG5vIEJsdWV0b290aCBHYXR0IGhhbmRsZSwgRmF0YWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRQZW5kaW5nQ2FsbGJhY2tzKFJFTU9WRV9CQ0FTVF9TT1VSQ0UsSU5WQUxJRF9TUkNfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfRkFUQUwpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQU1lOQ19BQ1RJVkVfVElNRU9VVDoKLSAgICAgICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luYyhudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDT05ORUNURUQ6IG5vdCBoYW5kbGVkIG1lc3NhZ2U6IiArIG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICB2b2lkIHNlbmRQZW5kaW5nQ2FsbGJhY2tzKGludCBwZW5kaW5nT3AsIGJ5dGUgc291cmNlSWQsIGludCBzdGF0dXMpIHsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICAgICAvL05vdGlmeSBzZXJ2aWNlIG9ubHkgSW4gY2FzZSBvZiBmYWlsdXJlIGNhc2VzCi0gICAgICAgICAgICAvL1N1Y2Nlc3MgY2FzZSB3b3VsZCBoYXZlIGJlZW4gbm90aWZpZWQgdGhyb3VnaCBTdGF0ZSBtYWNoaW5lIGFueXdheXMKLSAgICAgICAgICAgIG1TZXJ2aWNlLm5vdGlmeU9wZXJhdGlvbkNvbXBsZXRpb24obURldmljZSwgcGVuZGluZ09wKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHBlbmRpbmdPcCkgewotICAgICAgICAgICAgY2FzZSBTVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXV0b1RyaWdnZXJyZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibm90aWZ5IHRoZSBhcHAgb25seSBpZiBzdGFydCBTY2FuIG9mZmxvYWQgZmFpbHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc2hvdWxkbnQgaGFwcGVuIGluIGdlbmVyYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZENhbGxiYWNrKG1EZXZpY2UsIG51bGwsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1dG9UcmlnZ2VycmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFERF9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlkID0gSU5WQUxJRF9TUkNfSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vc3RvcCBTY2FuIG9mZmxvYWQgZm9yIGNvbG9jYXRlZCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnN0b3BTY2FuT2ZmbG9hZEludGVybmFsKG1EZXZpY2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZEFkZEJyb2FkY2FzdFNvdXJjZUNhbGxiYWNrKG1EZXZpY2UsIHNvdXJjZUlkLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVUERBVEVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGlmIChtQXV0b1RyaWdnZXJyZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2VuZFVwZGF0ZUJyb2FkY2FzdFNvdXJjZUNhbGxiYWNrKG1EZXZpY2UsIHNvdXJjZUlkLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdXRvVHJpZ2dlcnJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVNT1ZFX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZW5kUmVtb3ZlQnJvYWRjYXN0U291cmNlQ2FsbGJhY2sobURldmljZSwgc291cmNlSWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNFVF9CQ0FTVF9DT0RFOgotICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlbmRTZXRCcm9hZGNhc3RQSU51cGRhdGVkQ2FsbGJhY2sobURldmljZSwgc291cmNlSWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coInNlbmRQZW5kaW5nQ2FsbGJhY2tzOiB1bmhhbmRsZWQgY2FzZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIENvbm5lY3RlZFByb2Nlc3NpbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgIGxvZyggIkVudGVyIENvbm5lY3RlZFByb2Nlc3NpbmcoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgIGxvZygiRXhpdCBDb25uZWN0ZWRQcm9jZXNzaW5nKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgIGxvZygiQ29ubmVjdGVkUHJvY2Vzc2luZyBwcm9jZXNzIG1lc3NhZ2UoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndoYXQpKTsKLSAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDT05ORUNUIHJlcXVlc3QgaXMgaWdub3JlZCIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJESVNDT05ORUNUIHJlcXVlc3RlZCE6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoR2F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoR2F0dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEdhdHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luYyhudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vVHJpZ2dlciB0aGUgQ1NJUCBkaXNjb25uZWN0aW9uLCBkb250IHdvcnJ5IGFib3V0IHBhc3MvZmFpbHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Dc2lwQ29ubmVjdGVkICYmIG1TZXRDb29yZGluYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXRDb29yZGluYXRvci5kaXNjb25uZWN0KG1TZXJ2aWNlLm1Dc2lwQXBwSWQsIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3NpcENvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJtQmx1ZXRvb3RoR2F0dCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIFJFQURfQkFTU19DSEFSQUNURVJJU1RJQ1M6Ci0gICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRlZmVyIFJFQURfQkFTU19DSEFSQUNURVJJU1RJQ1MgcmVxdWVzdGVkITogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSAoaW50KW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGVkUHJvY2Vzc2luZzogY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VkOiIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG91bGQgbmV2ZXIgaGFwcGVuIGZyb20gdGhpcyBzdGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkIGRpc2Nvbm5lY3Rpb24gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgR0FUVF9UWE5fUFJPQ0VTU0VEOgotICAgICAgICAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhHQVRUX1RYTl9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IChpbnQpbWVzc2FnZS5hcmcxOwotICAgICAgICAgICAgICAgICAgICBsb2coICJHQVRUIHRyYW5zYWN0aW9uIHByb2Nlc3NlZCBmb3IiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm5vdGlmeU9wZXJhdGlvbkNvbXBsZXRpb24obURldmljZSwgbVBlbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdPcGVyYXRpb24gPT0gU0VUX0JDQVNUX0NPREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIFBlbmRpbmcgb3BlcmF0aW9uIGlzIFNFVF9CQ0FTVF9DT0RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZW5kIGNhbGxiYWNrIHRvIG5vdGlmeSBCQ0FTVCBpcyB1cGRhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGlzIG5lZWRlZCBvbmx5IGZvciBTRVRfQkNBU1Qgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUGVuZGluZ0NhbGxiYWNrcyhtUGVuZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1NvdXJjZUlkLCBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19TVUNDRVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYW55IGZhaWx1cmUgdG8gd3JpdGUgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3dpbGwgYmUgY29udmVydGVkIHRvIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsbGJhY2sgd2l0aCBmYWlsdXJlIHN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MobVBlbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTb3VyY2VJZCwgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEdBVFRfVFhOX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIGxvZyggIkdBVFQgdHJhbnNhY3Rpb24gdGltZWRvdXQgZm9yIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5ub3RpZnlPcGVyYXRpb25Db21wbGV0aW9uKG1EZXZpY2UsIG1QZW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFBlbmRpbmdDYWxsYmFja3MobVBlbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1NvdXJjZUlkLCBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19UWE5fVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nT3BlcmF0aW9uID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTb3VyY2VJZCA9IC0xOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1NDQU5fT0ZGTE9BRDoKLSAgICAgICAgICAgICAgICBjYXNlIFNFTEVDVF9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBBRERfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgU0VUX0JDQVNUX0NPREU6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgUFNZTkNfQUNUSVZFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiZGVmZXIgdGhlIG1lc3NhZ2U6IiArIG1lc3NhZ2Uud2hhdCArICJzbyB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGxhdGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICBsb2coIkNPTk5FQ1RFRFBST0NFU1NJTkc6IG5vdCBoYW5kbGVkIG1lc3NhZ2U6IiArIG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgICB9Ci0gICAgIH0KLQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgIGNsYXNzIERpc2Nvbm5lY3RpbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgIGxvZyggIkVudGVyIERpc2Nvbm5lY3RpbmcoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ09OTkVDVF9USU1FT1VULCBtRGV2aWNlLCBtQ29ubmVjdFRpbWVvdXRNcyk7Ci0gICAgICAgICAgICAgYnJvYWRjYXN0Q29ubmVjdGlvblN0YXRlKG1EZXZpY2UsIG1MYXN0Q29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORyk7Ci0gICAgICAgICB9Ci0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICAgbG9nKCJFeGl0IERpc2Nvbm5lY3RpbmcoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDT05ORUNUX1RJTUVPVVQpOwotICAgICAgICAgICAgIG1MYXN0Q29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOwotICAgICAgICAgfQotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICBsb2coIkRpc2Nvbm5lY3RpbmcgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53aGF0KSk7Ci0gICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGxvZygiZGVmZXJyaW5nIHRoaXMgY29ubmVjdGlvbiByZXF1ZXN0ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBbHJlYWR5IGRpc2Nvbm5lY3Rpbmc6IERJU0NPTk5FQ1QgaWdub3JlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gKGludCltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2Nvbm5lY3Rpbmc6IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2hvdWxkIG5ldmVyIGhhcHBlbiBmcm9tIHRoaXMgc3RhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRpc2Nvbm5lY3Rpb24gc3VjY2Vzc2Z1bGwgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIC8vLypfQ1NJUAotICAgICAgICAgICAgICAgICAgICAgICAgIC8vVHJpZ2dlciB0aGUgQ1NpcCBkaXNjb25uZWN0aW9uLCBkb250IHdvcnJ5IGFib3V0IHBhc3MvZmFpbHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3NpcENvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2V0Q29vcmRpbmF0b3IuZGlzY29ubmVjdChtU2VydmljZS5tQ3NpcEFwcElkLCBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNzaXBDb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy9fQ1NJUCovCi0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDT05ORUNUX1RJTUVPVVQiKTsKLQotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gKEJsdWV0b290aERldmljZSkgbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gZGV2aWNlIHRpbWVvdXQgIiArIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICAgfQotICAgICB9Ci0KLQotICAgIHZvaWQgYnJvYWRjYXN0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBmcm9tU3RhdGUsIGludCB0b1N0YXRlKSB7Ci0gICAgICAgICBsb2coICJicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUgIiArIGRldmljZSArICI6ICIgKyBmcm9tU3RhdGUgKyAiLT4iICsgdG9TdGF0ZSk7Ci0gICAgICAgICBpZiAoZnJvbVN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgdG9TdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgIGxvZygiQ09OTkVDVEVELT5DT05OVEVDVEVEOiBJZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLSAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aFN5bmNIZWxwZXIuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgZnJvbVN0YXRlKTsKLSAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCB0b1N0YXRlKTsKLSAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgICBtU2VydmljZS5zZW5kQnJvYWRjYXN0QXNVc2VyKGludGVudCwgVXNlckhhbmRsZS5BTEwsCi0gICAgICAgICAgICAgICAgIEJMVUVUT09USF9DT05ORUNULCBVdGlscy5nZXRUZW1wQWxsb3dsaXN0QnJvYWRjYXN0T3B0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICBTdHJpbmcgY3VycmVudFN0YXRlID0gIlVua25vd24iOwotICAgICAgICBpZiAoZ2V0Q3VycmVudFN0YXRlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudFN0YXRlID0gZ2V0Q3VycmVudFN0YXRlKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlICJEaXNjb25uZWN0ZWQiOgotICAgICAgICAgICAgICAgIGxvZygiRGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgY2FzZSAiRGlzY29ubmVjdGluZyI6Ci0gICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgIGNhc2UgIkNvbm5lY3RpbmciOgotICAgICAgICAgICAgICAgIGxvZygiQ29ubmVjdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBjYXNlICJDb25uZWN0ZWQiOgotICAgICAgICAgICAgY2FzZSAiQ29ubmVjdGVkUHJvY2Vzc2luZyI6Ci0gICAgICAgICAgICAgICAgbG9nKCJjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkJhZCBjdXJyZW50U3RhdGU6ICIgKyBjdXJyZW50U3RhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEJsdWV0b290aERldmljZSBnZXREZXZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFN0YXRlKCkgPT0gbUNvbm5lY3RlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlV2hhdFRvU3RyaW5nKGludCB3aGF0KSB7Ci0gICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgY2FzZSBDT05ORUNUOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVCI7Ci0gICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJESVNDT05ORUNUIjsKLSAgICAgICAgICAgIGNhc2UgQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKLSAgICAgICAgICAgIGNhc2UgR0FUVF9UWE5fUFJPQ0VTU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiR0FUVF9UWE5fUFJPQ0VTU0VEIjsKLSAgICAgICAgICAgIGNhc2UgUkVBRF9CQVNTX0NIQVJBQ1RFUklTVElDUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlJFQURfQkFTU19DSEFSQUNURVJJU1RJQ1MiOwotICAgICAgICAgICAgY2FzZSBTVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTVEFSVF9TQ0FOX09GRkxPQUQiOwotICAgICAgICAgICAgY2FzZSBTVE9QX1NDQU5fT0ZGTE9BRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNUT1BfU0NBTl9PRkZMT0FEIjsKLSAgICAgICAgICAgIGNhc2UgQUREX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkFERF9CQ0FTVF9TT1VSQ0UiOwotICAgICAgICAgICAgY2FzZSBTRUxFQ1RfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIHJldHVybiAiU0VMRUNUX0JDQVNUX1NPVVJDRSI7Ci0gICAgICAgICAgICBjYXNlIFVQREFURV9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVUERBVEVfQkNBU1RfU09VUkNFIjsKLSAgICAgICAgICAgIGNhc2UgU0VUX0JDQVNUX0NPREU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTRVRfQkNBU1RfQ09ERSI7Ci0gICAgICAgICAgICBjYXNlIFJFTU9WRV9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJSRU1PVkVfQkNBU1RfU09VUkNFIjsKLSAgICAgICAgICAgIGNhc2UgUFNZTkNfQUNUSVZFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJQU1lOQ19BQ1RJVkVfVElNRU9VVCI7Ci0gICAgICAgICAgICBjYXNlIENTSVBfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ1NJUF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiOwotICAgICAgICAgICAgY2FzZSBDT05ORUNUX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUX1RJTUVPVVQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh3aGF0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJvZmlsZVN0YXRlVG9TdHJpbmcoaW50IHN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJESVNDT05ORUNURUQiOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUSU5HIjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNURUQiOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJESVNDT05ORUNUSU5HIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc3RhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nQnVpbGRlciBzYikgewotICAgICAgICBQcm9maWxlU2VydmljZS5wcmludGxuKHNiLCAibURldmljZTogIiArIG1EZXZpY2UpOwotICAgICAgICBQcm9maWxlU2VydmljZS5wcmludGxuKHNiLCAiICBTdGF0ZU1hY2hpbmU6ICIgKyB0aGlzKTsKLSAgICAgICAgLy8gRHVtcCB0aGUgc3RhdGUgbWFjaGluZSBsb2dzCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0gICAgICAgIHN1cGVyLmR1bXAobmV3IEZpbGVEZXNjcmlwdG9yKCksIHByaW50V3JpdGVyLCBuZXcgU3RyaW5nW117fSk7Ci0gICAgICAgIHByaW50V3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIHN0cmluZ1dyaXRlci5mbHVzaCgpOwotICAgICAgICBQcm9maWxlU2VydmljZS5wcmludGxuKHNiLCAiICBTdGF0ZU1hY2hpbmVMb2c6Iik7Ci0gICAgICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKLSAgICAgICAgd2hpbGUgKHNjYW5uZXIuaGFzTmV4dExpbmUoKSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBzY2FubmVyLm5leHRMaW5lKCk7Ci0gICAgICAgICAgICBQcm9maWxlU2VydmljZS5wcmludGxuKHNiLCAiICAgICIgKyBsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBzY2FubmVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nKCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChCQVNTX0RCRykgewotICAgICAgICAgICAgc3VwZXIubG9nKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0J5dGVBcnJheShTdHJpbmcgcHJlZml4LCBieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBjb3VudCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihwcmVmaXgpOwotICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiMHglMDJYIiwgdmFsdWVbaV0pKTsKLSAgICAgICAgICAgIGlmIChpICE9IHZhbHVlLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsIGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0Jhc3NDc2V0TWFuYWdlci5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0Jhc3NDc2V0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDJiZTdjLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC9CYXNzQ3NldE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCYXNzIENTRVQgbWFuYWdldCBTdGF0ZU1hY2hpbmUuIFRoZXJlIGlzIG9uZSBpbnN0YW5jZSBwZXIgQ29vcmRpbmF0ZWQgInNldCBJZCIuCi0gKiAgLSAiSWRsZSIgYW5kICJMb2NrZWQiIGFyZSBzdGVhZHkgc3RhdGVzLgotICogIC0gIkxvY2tpbmciIGlzIGEgdHJhbnNpZW50IHN0YXRlcyB1bnRpbCB0aGUKLSAqICAgICBMb2NraW5nIGNvbmZpcm1hdGlvbiBjb21lcyBmcm9tIHVwcGVyIGxheWVycy4KLSAqICAtIE9uY2UgbG9jayBpcyBhY3F1aXJlZCwgcHJvZmlsZSBkb250IHRyeSB0byB1bmxvY2sKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElkbGUpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgXgotICogICAgICAgICAgICAgICAgICAgTE9DSyAgICB8ICAgICAgIHwgVU5MT0NLCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgICAgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgKExvY2tpbmcpPC0+KFVubG9ja2luZykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBeCi0gKiAgICAgICAgICAgICAgICAgT05fTE9DSyAgIHwgICAgICAgfCBPTl9VTkxPQ0sKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgViAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKExvY2tlZCkKLSAqCi0gKgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJjOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWM7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVjb3JkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTeW5jSGVscGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5CbHVldG9vdGhMZVNjYW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuUGVyaW9kaWNBZHZlcnRpc2luZ0NhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlBlcmlvZGljQWR2ZXJ0aXNpbmdNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlBlcmlvZGljQWR2ZXJ0aXNpbmdSZXBvcnQ7Ci0KLS8vLypfQ1NJUAotLy9DU0VUCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlR3JvdXA7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmdyb3VwY2xpZW50Lkdyb3VwU2VydmljZTsKLS8vX0NTSVAqLwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlNlcnZpY2VGYWN0b3J5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5TdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlN0YXRlTWFjaGluZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZzsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyOwotaW1wb3J0IGphdmEubGFuZy5JbnRlZ2VyOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLmxhbmcuQnl0ZTsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotCi1maW5hbCBjbGFzcyBCYXNzQ3NldE1hbmFnZXIgZXh0ZW5kcyBTdGF0ZU1hY2hpbmUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmFzc0NzZXRNYW5hZ2VyIjsKLQotICAgIC8vQ29uc2lkZXJlZCBhcyBDb29yZGluYXRlZCBvcHMKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBU1NfR1JQX1NUQVJUX1NDQU5fT0ZGTE9BRCA9IDY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCQVNTX0dSUF9TVE9QX1NDQU5fT0ZGTE9BRCA9IDc7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCQVNTX0dSUF9BRERfQkNBU1RfU09VUkNFID0gOTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBU1NfR1JQX1VQREFURV9CQ0FTVF9TT1VSQ0UgPSAxMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBU1NfR1JQX1NFVF9CQ0FTVF9DT0RFID0gMTE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCQVNTX0dSUF9SRU1PVkVfQkNBU1RfU09VUkNFID0gMTI7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IExPQ0sgPSAxNzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVOTE9DSyA9IDE4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19TVEFURV9DSEFOR0VEID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IExPQ0tfVElNRU9VVCA9IDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBPTl9DU0lQX0NPTk5FQ1RFRCA9IDU7Ci0KLSAgICAvLzEwIHNlY3MgdGltZSBvdXQgZm9yIGFsbCBnYXR0IHdyaXRlcwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19USU1FT1VUX01TID0gMTAwMDA7Ci0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1RJTUVPVVQgPSAyMDE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElkbGUgbUlkbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2NraW5nIG1Mb2NraW5nOwotICAgIHByaXZhdGUgZmluYWwgTG9ja2VkIG1Mb2NrZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrZWRQcm9jZXNzaW5nIG1Mb2NrZWRQcm9jZXNzaW5nOwotICAgIHByaXZhdGUgZmluYWwgVW5sb2NraW5nIG1VbmxvY2tpbmc7Ci0KLSAgICBwcml2YXRlIEJDU2VydmljZSBtQkNTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNldElkOwotICAgIHByaXZhdGUgTGlzdDxCbHVldG9vdGhEZXZpY2U+IG1NZW1iZXJEZXZpY2VzID0gbnVsbDsKLQotICAgIC8vLypfQ1NJUAotICAgIC8vQ1NJUCBMb2NraW5nIEludGVyZmFjZXMKLSAgICBwcml2YXRlIEdyb3VwU2VydmljZSBtU2V0Q29vcmRpbmF0b3IgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgLy9fQ1NJUCovCi0KLSAgICBCYXNzQ3NldE1hbmFnZXIoaW50IHNldElkLCBCbHVldG9vdGhEZXZpY2UgbWFzdGVyRGV2aWNlLCBCQ1NlcnZpY2Ugc3ZjLAotICAgICAgICAgICAgTG9vcGVyIGxvb3BlcikgewotICAgICAgICBzdXBlcihUQUcsIGxvb3Blcik7Ci0gICAgICAgIG1TZXRJZCA9IHNldElkOwotICAgICAgICBtQkNTZXJ2aWNlID0gc3ZjOwotCi0gICAgICAgIG1JZGxlID0gbmV3IElkbGUoKTsKLSAgICAgICAgbUxvY2tlZCA9IG5ldyBMb2NrZWQoKTsKLSAgICAgICAgbUxvY2tlZFByb2Nlc3NpbmcgPSBuZXcgTG9ja2VkUHJvY2Vzc2luZygpOwotICAgICAgICBtTG9ja2luZyA9IG5ldyBMb2NraW5nKCk7Ci0gICAgICAgIG1VbmxvY2tpbmcgPSBuZXcgVW5sb2NraW5nKCk7Ci0KLSAgICAgICAgYWRkU3RhdGUobUlkbGUpOwotICAgICAgICBhZGRTdGF0ZShtTG9ja2luZyk7Ci0gICAgICAgIGFkZFN0YXRlKG1Mb2NrZWQpOwotICAgICAgICBhZGRTdGF0ZShtTG9ja2VkUHJvY2Vzc2luZyk7Ci0gICAgICAgIGFkZFN0YXRlKG1VbmxvY2tpbmcpOwotCi0gICAgICAgIHNldEluaXRpYWxTdGF0ZShtSWRsZSk7Ci0gICAgICAgIG1EZXZpY2UgPSBtYXN0ZXJEZXZpY2U7Ci0gICAgICAgIG1NZW1iZXJEZXZpY2VzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgQmFzc0NzZXRNYW5hZ2VyIG1ha2UoaW50IHNldElkLCBCbHVldG9vdGhEZXZpY2UgbWFzdGVyRGV2aWNlLCBCQ1NlcnZpY2Ugc3ZjLAotICAgICAgICAgICAgTG9vcGVyIGxvb3BlcikgewotICAgICAgICBMb2cuZChUQUcsICJtYWtlIGZvciBzZXRJZCwgc2V0SWQgIiArIHNldElkICsgIjogbWFzdGVyRGV2aWNlIiArIG1hc3RlckRldmljZSk7Ci0gICAgICAgIEJhc3NDc2V0TWFuYWdlciBCYXNzY2xpZW50U20gPSBuZXcgQmFzc0NzZXRNYW5hZ2VyKHNldElkLCBtYXN0ZXJEZXZpY2UsIHN2YywKLSAgICAgICAgICAgICAgICBsb29wZXIpOwotICAgICAgICBCYXNzY2xpZW50U20uc3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIEJhc3NjbGllbnRTbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1F1aXQoKSB7Ci0gICAgICAgIGxvZygiZG9RdWl0IGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBxdWl0Tm93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgbG9nKCJjbGVhbnVwIGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIElkbGUgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIGxvZyggIkVudGVyIElkbGUoIiArIG1TZXRJZCArICIpOiAiICsgbWVzc2FnZVdoYXRUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBtTWVtYmVyRGV2aWNlcyA9IG51bGw7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgbG9nKCJFeGl0IElkbGUoIiArIG1TZXRJZCArICIpOiAiICsgbWVzc2FnZVdoYXRUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBsb2coIklkbGUgcHJvY2VzcyBtZXNzYWdlKCIgKyBtU2V0SWQgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RBUlRfU0NBTl9PRkZMT0FEOgotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RPUF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9BRERfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfVVBEQVRFX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1NFVF9CQ0FTVF9DT0RFOgotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfUkVNT1ZFX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgLy9kZWZlciB0aGUgbWVlc2FnZSBhbmQgbW92ZSB0byBMb2NrZWQKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAvL0ludGVudGlvbmFsIG1pc3Mgb2YgYnJlYWsKLSAgICAgICAgICAgICAgICBjYXNlIExPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIC8vdHJlYXQgQ29ubmVjdCAmIExvY2sgYXMgc2FtZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiTG9ja2luZyB0byAiICsgbVNldElkKTsKLSAgICAgICAgICAgICAgICAgICAgLy9nZXQgQ1NJUCBjb25uZWN0aW9uIHN0YXR1cyBmb3IgQmx1ZXRvb3RoRGV2aWNlCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgQ1NJUCBkaXNjb25uZWN0ZWQ6IHN0YXJ0IENvbm5lY3QgUHJvY2VkdXJlIChtb3N0bHkgaHBucyBvbmx5IGF0IGZpcnN0IHRpbWUpCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgQ1NJUCBjb25uZWN0ZWQ6IHN0YXJ0IExvY2sgUHJvY2VkdXJlCi0gICAgICAgICAgICAgICAgICAgIC8vLypfQ1NJUAotICAgICAgICAgICAgICAgICAgICBtU2V0Q29vcmRpbmF0b3Iuc2V0TG9ja1ZhbHVlKG1CQ1NlcnZpY2UubUNzaXBBcHBJZCwgbVNldElkLCBudWxsLCBCbHVldG9vdGhEZXZpY2VHcm91cC5BQ0NFU1NfR1JBTlRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUxvY2tpbmcpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vdHJhbnNpdGlvblRvKG1Mb2NrZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFVOTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWRsZTogVU5MT0NLIGlnbm9yZWQ6ICIgKyBtU2V0SWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIExPQ0tfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgLy9UaGlzIG1vc3QgbGlrZWx5IG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgLy8vKl9DU0lQCi0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpbWVzc2FnZS5hcmcxOwotICAgICAgICAgICAgICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IChMaXN0PEJsdWV0b290aERldmljZT4pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkxvY2sgc3RhdGUgY2hhbmdlZDoiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQmx1ZXRvb3RoRGV2aWNlR3JvdXAuQUNDRVNTX0dSQU5URUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtTG9ja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklkbGU6IExvY2sgZmFpbGVkIHRvICIgKyBtU2V0SWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9OX0NTSVBfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIC8vc3RhcnRzIHRoZSBMb2NrIHByb2NlZHVyZQotICAgICAgICAgICAgICAgIC8vT25seSByZWFzb24gd2h5IHdlIENvbm5lY3QgaXMgdG8gTG9jawotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy9Eb250IHRyYW5zaXRpb24gdGhlIHN0YXRlCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJJZGxlOiBub3QgaGFuZGxlZCBtZXNzYWdlOiIgKyBtZXNzYWdlLndoYXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgICBjbGFzcyBMb2NraW5nIGV4dGVuZHMgU3RhdGUgewotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgICBsb2coICJFbnRlciBMb2NraW5nKCIgKyBtU2V0SWQgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgIGxvZygiRXhpdCBMb2NraW5nKCIgKyBtU2V0SWQgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICBsb2coIkxvY2tpbmcgcHJvY2VzcyBtZXNzYWdlKCIgKyBtU2V0SWQgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0KLSAgICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9TVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RPUF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfQUREX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9VUERBVEVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1NFVF9CQ0FTVF9DT0RFOgotICAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1JFTU9WRV9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAvL2RlZmVyIHRoZSBtZWVzYWdlIGFuZCBtb3ZlIHRvIExvY2tlZAotICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgIGxvZygiQWxyZWFkeSBMb2NraW5nIHRvICIgKyBtU2V0SWQpOwotICAgICAgICAgICAgICAgICAgICAgbG9nKCJJZ25vcmUgdGhpcyBMb2NrIHJlcXVlc3QgIiArIG1TZXRJZCk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBVTkxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJMb2NraW5nOiBVTkxPQ0sgZGVmZXJyZWQ6ICIgKyBtU2V0SWQpOwotICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGNhc2UgTE9DS19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgLy8vKl9DU0lQCi0gICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KW1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkxvY2sgc3RhdGUgY2hhbmdlZDoiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IEJsdWV0b290aERldmljZUdyb3VwLkFDQ0VTU19HUkFOVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gKExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgICBtTWVtYmVyRGV2aWNlcyA9IGRldmljZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Mb2NrZWQpOwotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJMb2NraW5nOiBVbmxvY2tlZCB0byAiICsgbVNldElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUlkbGUpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgLy9fQ1NJUCovCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBPTl9DU0lQX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgIC8vc3RhcnRzIHRoZSBMb2NrIHByb2NlZHVyZQotICAgICAgICAgICAgICAgICAgICAgLy9Pbmx5IHJlYXNvbiB3aHkgd2UgQ29ubmVjdCBpcyB0byBMb2NrCi0gICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAgLy9Eb250IHRyYW5zaXRpb24gdGhlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICBsb2coIkxPQ0tJTkc6IG5vdCBoYW5kbGVkIG1lc3NhZ2U6IiArIG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBjbGFzcyBMb2NrZWQgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIGxvZyggIkVudGVyIExvY2tlZCgiICsgbVNldElkICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotCi0gICAgICAgICAgICByZW1vdmVEZWZlcnJlZE1lc3NhZ2VzKExPQ0spOwotCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIGxvZygiRXhpdCBMb2NrZWQoIiArIG1TZXRJZCArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIGxvZygiTG9ja2VkIHByb2Nlc3MgbWVzc2FnZSgiICsgbVNldElkICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvOwotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIExPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkxvY2tlZDogTG9jayBpZ25vcmVkOiAiICsgbVNldElkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBVTkxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiVW5sb2NraW5nIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAvL3RyaWdnZXIgdW5sb2NrIHByb2NlZHVyZQotICAgICAgICAgICAgICAgICAgICAvLy8qX0NTSVAKLSAgICAgICAgICAgICAgICAgICAgbVNldENvb3JkaW5hdG9yLnNldExvY2tWYWx1ZShtQkNTZXJ2aWNlLm1Dc2lwQXBwSWQsIG1TZXRJZCwgbnVsbCwgQmx1ZXRvb3RoRGV2aWNlR3JvdXAuQUNDRVNTX1JFTEVBU0VEKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmxvY2tpbmcpOwotICAgICAgICAgICAgICAgICAgICAvL19DU0lQKi8KLQotICAgICAgICAgICAgICAgICAgICAvL3RyYW5zaXRpb25UbyhtSWRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTE9DS19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLy8qX0NTSVAKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gKGludCltZXNzYWdlLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gKExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTG9jayBzdGF0ZSBjaGFuZ2VkOiIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBCbHVldG9vdGhEZXZpY2VHcm91cC5BQ0NFU1NfR1JBTlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Mb2NrZWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTG9ja2luZzogVW5sb2NrZWQgdG8gIiArIG1TZXRJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUlkbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1NUQVJUX1NDQU5fT0ZGTE9BRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1CQ1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJTVEFSVF9TQ0FOX09GRkxPQUQ6ICIgKyBtTWVtYmVyRGV2aWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQkNTZXJ2aWNlLnN0YXJ0U2Nhbk9mZmxvYWQobURldmljZSwgbU1lbWJlckRldmljZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Mb2NrZWRQcm9jZXNzaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibm8gQmFzc2NsaWVudCBzZXJ2aWNlIGhhbmRsZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RPUF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQkNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiU1RPUF9TQ0FOX09GRkxPQUQ6ICIgKyBtTWVtYmVyRGV2aWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQkNTZXJ2aWNlLnN0b3BTY2FuT2ZmbG9hZChtRGV2aWNlLCBtTWVtYmVyRGV2aWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUxvY2tlZFByb2Nlc3NpbmcpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJubyBCYXNzY2xpZW50IHNlcnZpY2UgaGFuZGxlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9BRERfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgICAgICBzcmNJbmZvID0gKEJsZUJyb2FkY2FzdFNvdXJjZUluZm8pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQkNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CQ1NlcnZpY2UuYWRkQnJvYWRjYXN0U291cmNlKG1EZXZpY2UsIG1NZW1iZXJEZXZpY2VzLCBzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtTG9ja2VkUHJvY2Vzc2luZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIm5vIEJhc3NjbGllbnQgc2VydmljZSBoYW5kbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1VQREFURV9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHNyY0luZm8gPSAoQmxlQnJvYWRjYXN0U291cmNlSW5mbyltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1CQ1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJDU2VydmljZS51cGRhdGVCcm9hZGNhc3RTb3VyY2UobURldmljZSwgbU1lbWJlckRldmljZXMsIHNyY0luZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Mb2NrZWRQcm9jZXNzaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibm8gQmFzc2NsaWVudCBzZXJ2aWNlIGhhbmRsZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU0VUX0JDQVNUX0NPREU6Ci0gICAgICAgICAgICAgICAgICAgIHNyY0luZm8gPSAoQmxlQnJvYWRjYXN0U291cmNlSW5mbyltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1CQ1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJDU2VydmljZS5zZXRCcm9hZGNhc3RDb2RlKG1EZXZpY2UsIG1NZW1iZXJEZXZpY2VzLCBzcmNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtTG9ja2VkUHJvY2Vzc2luZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIm5vIEJhc3NjbGllbnQgc2VydmljZSBoYW5kbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1JFTU9WRV9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGUgc291cmNlSWQgPSAoYnl0ZSltZXNzYWdlLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQkNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CQ1NlcnZpY2UucmVtb3ZlQnJvYWRjYXN0U291cmNlKG1EZXZpY2UsIG1NZW1iZXJEZXZpY2VzLCBzb3VyY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUxvY2tlZFByb2Nlc3NpbmcpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJubyBCYXNzY2xpZW50IHNlcnZpY2UgaGFuZGxlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJMb2NrZWQ6IG5vdCBoYW5kbGVkIG1lc3NhZ2U6IiArIG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgIGNsYXNzIExvY2tlZFByb2Nlc3NpbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgIGxvZyggIkVudGVyIExvY2tlZFByb2Nlc3NpbmcoIiArIG1TZXRJZCArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgICBsb2coIkV4aXQgTG9ja2VkUHJvY2Vzc2luZygiICsgbVNldElkICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICBsb2coIkxvY2tlZFByb2Nlc3NpbmcgcHJvY2VzcyBtZXNzYWdlKCIgKyBtU2V0SWQgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbzsKLSAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgICBjYXNlIFVOTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgIGxvZygiTG9ja2VkUHJvY2Vzc2luZzogVU5MT0NLIGRlZmVyICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtTG9ja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIExPQ0tfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpbWVzc2FnZS5hcmcxOwotICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTG9ja2luZyBzdGF0ZSBjaGFuZ2VkOiIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAvL1Nob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICBjYXNlIExPQ0s6Ci0gICAgICAgICAgICAgICAgICAgICAgbG9nKCJMb2NrZWRQcm9jZXNzaW5nOiBMT0NLIGlnbm9yZSAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9TVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RPUF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfQUREX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9VUERBVEVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1NFVF9CQ0FTVF9DT0RFOgotICAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX1JFTU9WRV9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAvL2RlZmVyIHRoZSBtZWVzYWdlIGFuZCBtb3ZlIHRvIExvY2tlZAotICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0RlZmVycmVkTWVzc2FnZXMoVU5MT0NLKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgVW5sb2NrIGlzIGluIHBlbmRpbmcgbGlzdCwgcmVtb3ZlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy9PdmVycmlkZSB0aGUgVU5MT0NLIHdpdGggdGhpcyBuZXcgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJyZW1vdmluZyB0aGUgdW5sb2NrIG1lc3NhZ2UsIGFzIHRoZXJlIGlzIGFub3RoZXIgcmVxIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhVTkxPQ0spOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICBsb2coIkxvY2tlZFByb2Nlc3Npbmc6IG5vdCBoYW5kbGVkIG1lc3NhZ2U6IiArIG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICAgfQotICAgICB9Ci0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIFVubG9ja2luZyBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgbG9nKCAiRW50ZXIgVW5sb2NraW5nKCIgKyBtU2V0SWQgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0KLSAgICAgICAgICAgIC8vcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhMT0NLKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBsb2coIkV4aXQgVW5sb2NraW5nKCIgKyBtU2V0SWQgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBsb2coIkxvY2tlZCBwcm9jZXNzIG1lc3NhZ2UoIiArIG1TZXRJZCArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLSAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbzsKLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBVTkxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiVW5sb2NraW5nOiBVTkxPQ0sgaWdub3JlZCBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBMT0NLX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vLypfQ1NJUAotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KW1lc3NhZ2UuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTG9ja2luZyBzdGF0ZSBjaGFuZ2VkOiIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBCbHVldG9vdGhEZXZpY2VHcm91cC5BQ0NFU1NfUkVMRUFTRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBtTWVtYmVyRGV2aWNlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5Mb2NraW5nOiBmYWlsZWQgdG8gIiArIG1TZXRJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy9rZWVwIHRoYXQgYmFjayBpbiBMb2NrZWQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Mb2NrZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIExPQ0s6Ci0gICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9TVEFSVF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9TVE9QX1NDQU5fT0ZGTE9BRDoKLSAgICAgICAgICAgICAgICBjYXNlIEJBU1NfR1JQX0FERF9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9VUERBVEVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU0VUX0JDQVNUX0NPREU6Ci0gICAgICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9SRU1PVkVfQkNBU1RfU09VUkNFOgotICAgICAgICAgICAgICAgICAgICAvL2RlZmVyIHRoZSBtZWVzYWdlIGFuZCBtb3ZlIHRvIExvY2tlZAotICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiTG9ja2VkOiBub3QgaGFuZGxlZCBtZXNzYWdlOiIgKyBtZXNzYWdlLndoYXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lc3NhZ2VXaGF0VG9TdHJpbmcoaW50IHdoYXQpIHsKLSAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIExPQ0s6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJMT0NLIjsKLSAgICAgICAgICAgIGNhc2UgVU5MT0NLOgotICAgICAgICAgICAgICAgIHJldHVybiAiVU5MT0NLIjsKLSAgICAgICAgICAgIGNhc2UgTE9DS19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiTE9DS19TVEFURV9DSEFOR0VEIjsKLSAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RBUlRfU0NBTl9PRkZMT0FEOgotICAgICAgICAgICAgICAgIHJldHVybiAiQkFTU19HUlBfU1RBUlRfU0NBTl9PRkZMT0FEIjsKLSAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfU1RPUF9TQ0FOX09GRkxPQUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJCQVNTX0dSUF9TVE9QX1NDQU5fT0ZGTE9BRCI7Ci0gICAgICAgICAgICBjYXNlIEJBU1NfR1JQX0FERF9CQ0FTVF9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJCQVNTX0dSUF9BRERfQkNBU1RfU09VUkNFIjsKLSAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfVVBEQVRFX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkJBU1NfR1JQX1VQREFURV9CQ0FTVF9TT1VSQ0UiOwotICAgICAgICAgICAgY2FzZSBCQVNTX0dSUF9TRVRfQkNBU1RfQ09ERToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkJBU1NfR1JQX1NFVF9CQ0FTVF9DT0RFIjsKLSAgICAgICAgICAgIGNhc2UgQkFTU19HUlBfUkVNT1ZFX0JDQVNUX1NPVVJDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkJBU1NfR1JQX1JFTU9WRV9CQ0FTVF9TT1VSQ0UiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh3aGF0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2coIFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKEJhc3NDbGllbnRTdGF0ZU1hY2hpbmUuQkFTU19EQkcpIHsKLSAgICAgICAgICAgIHN1cGVyLmxvZyhtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0Jhc3NVdGlscy5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9iYXNzY2xpZW50L0Jhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjg5MTk4Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYmFzc2NsaWVudC9CYXNzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5iYzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5TdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlN0YXRlTWFjaGluZTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcjsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5sYW5nLkJ5dGU7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVjb3JkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkJsdWV0b290aExlU2Nhbm5lcjsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLS8vaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEJyb2FkY2FzdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuU2VydmljZUZhY3Rvcnk7Ci0vLy8qX0JNUwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5icm9hZGNhc3QuQnJvYWRjYXN0U2VydmljZTsKLS8vX0JNUyovCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ29kZWNDb25maWc7Ci0vKl9QQUNTCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnBhY3NjbGllbnQuUGFjc0NsaWVudFNlcnZpY2U7Ci1fUEFDUyovCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrOwotCi0vKioKLSAqIEJhc3MgVXRpbGl0eSBmdW5jdGlvbnMKLSAqLwotCi1maW5hbCBjbGFzcyBCYXNzVXRpbHMgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJhc3NVdGlscyI7Ci0gICAgICAgIC8qTEUgU2NhbiByZWxhdGVkIG1lbWJlcnMqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUJyb2FkY2FzdGVyc0Fyb3VuZCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUJsdWV0b290aEFkYXB0ZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIEJsdWV0b290aExlU2Nhbm5lciBtTGVTY2FubmVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBCQ1NlcnZpY2UgbUJDU2VydmljZSA9IG51bGw7Ci0KLSAgICAgICAgLy8vKl9CTVMKLSAgICAgICAgcHJpdmF0ZSBCcm9hZGNhc3RTZXJ2aWNlIG1CQVNlcnZpY2UgPSBudWxsOwotICAgICAgICAvL19CTVMqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUFTX1VVSUQgPSAiMDAwMDE4NTItMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0xvY2FsQk1TTm90aWZpZWQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBTZXJ2aWNlRmFjdG9yeSBtRmFjdG9yeSA9IG5ldyBTZXJ2aWNlRmFjdG9yeSgpOwotICAgICAgICAvL1VzaW5nIEFycmF5TGlzdCBhcyBLRVkgdG8gaGFzaG1hcC4gTWF5IGJlIG5vdCByaXNrCi0gICAgICAgIC8vaW4gdGhpcyBjYXNlIGFzIEl0IGlzIHVzZWQgdG8gdHJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbmNlbCBTY2FubmluZyBsYXRlcgotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxBcnJheUxpc3Q8SUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrPiwgU2NhbkNhbGxiYWNrPiBtTGVBdWRpb1NvdXJjZVNjYW5DYWxsYmFja3M7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPEJsdWV0b290aERldmljZSwgU2NhbkNhbGxiYWNrPiBtQmFzc0F1dG9Bc3Npc3Q7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFBX1NUQVJUX1NDQU4gPSAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUFfU0NBTl9TVUNDRVNTID0gMjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFBX1NDQU5fRkFJTFVSRSA9IDM7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQV9TQ0FOX1RJTUVPVVQgPSA0OwotICAgICAgICAvL3RpbWVvdXQgZm9yIGludGVybmFsIHNjYW4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFBX1NDQU5fVElNRU9VVF9NUyA9IDEwMDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YW5hZGFyZCBDb2RlYyBwYXJhbSB0eXBlcwotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZpbmFsICBpbnQgTE9DQVRJT04gPSAzOwotICAgICAgICAvL3NhbXBsZSByYXRlCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FNUExFX1JBVEUgPSAxOwotICAgICAgICAvL2ZyYW1lIGR1cmF0aW9uCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfRFVSQVRJT04gPSAyOwotICAgICAgICAvL09jdGV0cyBwZXIgZnJhbWUKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBPQ1RFVFNfUEVSX0ZSQU1FID0gODsKLSAgICAgICAgLypfUEFDUwotICAgICAgICBwcml2YXRlIFBhY3NDbGllbnRTZXJ2aWNlIG1QYWNzQ2xpZW50U2VydmljZSA9IFBhY3NDbGllbnRTZXJ2aWNlLmdldFBhY3NDbGllbnRTZXJ2aWNlKCk7Ci0gICAgICAgIF9QQUNTKi8KLSAgICAgICAgQmFzc1V0aWxzIChCQ1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAgICAgbUJDU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIG1MZVNjYW5uZXIgPSBtQmx1ZXRvb3RoQWRhcHRlci5nZXRCbHVldG9vdGhMZVNjYW5uZXIoKTsKLSAgICAgICAgICAgIG1MZUF1ZGlvU291cmNlU2NhbkNhbGxiYWNrcyA9IG5ldyBIYXNoTWFwPEFycmF5TGlzdDxJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2s+LCBTY2FuQ2FsbGJhY2s+KCk7Ci0gICAgICAgICAgICBtQmFzc0F1dG9Bc3Npc3QgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIFNjYW5DYWxsYmFjaz4oKTsKLSAgICAgICAgICAgIC8vLypfQk1TCi0gICAgICAgICAgICBtQkFTZXJ2aWNlID0gQnJvYWRjYXN0U2VydmljZS5nZXRCcm9hZGNhc3RTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAvL19CTVMqLwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTY2FuQ2FsbGJhY2sgbVBhU3luY1NjYW5DYWxsYmFjayA9IG5ldyBTY2FuQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhblJlc3VsdChpbnQgY2FsbGJhY2tUeXBlLCBTY2FuUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGxvZyggIm9uU2NhblJlc3VsdDoiICsgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB2b2lkIGNsZWFuVXAgKCkgewotCi0gICAgICAgICAgICAgIGlmIChtTGVBdWRpb1NvdXJjZVNjYW5DYWxsYmFja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgbUxlQXVkaW9Tb3VyY2VTY2FuQ2FsbGJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAobUJhc3NBdXRvQXNzaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIG1CYXNzQXV0b0Fzc2lzdC5jbGVhcigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGxlU2NhbkNvbnRyb2woYm9vbGVhbiBvbikgewotICAgICAgICAgICAgbG9nKCJsZVNjYW5Db250cm9sOiIgKyBvbik7Ci0gICAgICAgICAgICBtTGVTY2FubmVyID0gbUJsdWV0b290aEFkYXB0ZXIuZ2V0Qmx1ZXRvb3RoTGVTY2FubmVyKCk7Ci0gICAgICAgICAgICBpZiAobUxlU2Nhbm5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTGVTY2FuIGhhbmRsZSBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob24pIHsKLSAgICAgICAgICAgICAgICBtTGVTY2FubmVyLnN0YXJ0U2NhbihtUGFTeW5jU2NhbkNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUxlU2Nhbm5lci5zdG9wU2NhbihtUGFTeW5jU2NhbkNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgLyogcHJpdmF0ZSBoZWxwZXIgdG8gY2hlY2sgaWYgdGhlIExvY2FsIEJMRSBCcm9hZGNhc3QgaGFwcGVuaW5nIE9yIG5vdCAqLwotICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMb2NhbExFQXVkaW9Ccm9hZGNhc3RpbmcoKSB7Ci0gICAgICAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAvKlN0cmluZyBsb2NhbExlQUJyb2FkY2FzdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnZlbmRvci5idHN0YWNrLmlzTG9jYWxMZUFCIik7Ci0gICAgICAgICAgICAgaWYgKCFsb2NhbExlQUJyb2FkY2FzdC5pc0VtcHR5KCkgJiYgInRydWUiLmVxdWFscyhsb2NhbExlQUJyb2FkY2FzdCkpIHsKLSAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgbG9nKCJwcm9wZXJ0eSBpc0xvY2FsTEVBdWRpb0Jyb2FkY2FzdGluZyByZXR1cm5pbmcgIiArIHJldCk7Ki8KLSAgICAgICAgICAgICAvLy8qX0Jyb2FkY2FzdAotICAgICAgICAgICAgIGlmIChtQkFTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgbUJBU2VydmljZSA9IEJyb2FkY2FzdFNlcnZpY2UuZ2V0QnJvYWRjYXN0U2VydmljZSgpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAobUJBU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgIHJldCA9IG1CQVNlcnZpY2UuaXNCcm9hZGNhc3RBY3RpdmUoKTsKLSAgICAgICAgICAgICAgICAgLy9yZXQgPSBtQkFTZXJ2aWNlLmlzQnJvYWRjYXN0U3RyZWFtaW5nKCk7Ci0gICAgICAgICAgICAgICAgbG9nKCJsb2NhbCBicm9hZGNhc3Qgc3RyZWFtaW5nOiIgKyByZXQpOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJCcm9hZGNhc3RTZXJ2aWNlIGlzIE51bGwiKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgLy9fQnJvYWRjYXN0Ki8KLSAgICAgICAgICAgICBsb2coImlzTG9jYWxMRUF1ZGlvQnJvYWRjYXN0aW5nIHJldHVybmluZyAiICsgcmV0KTsKLSAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgfQotCi0gICAgICAgIEhhbmRsZXIgbUF1dG9Bc3Npc3RTY2FuSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUFfU1RBUlRfU0NBTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXYgPSAoQmx1ZXRvb3RoRGV2aWNlKSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtID0gb2J0YWluTWVzc2FnZShBQV9TQ0FOX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5vYmogPSBkZXY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQobSwgQUFfU0NBTl9USU1FT1VUX01TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoZGV2LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEFBX1NDQU5fU1VDQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQWJsZSB0byBmaW5kIHRvIGRlc2lyZWQgZGVzaXJlZCBTb3VyY2UgRGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXMgPSAoU2NhblJlc3VsdCkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldiA9IHNjYW5SZXMuZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycyhkZXYsbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQkNTZXJ2aWNlLnNlbGVjdEJyb2FkY2FzdFNvdXJjZShkZXYsIHNjYW5SZXMsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEFBX1NDQU5fRkFJTFVSRToKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vTm90IGFibGUgdG8gZmluZCB0aGUgZ2l2ZW4gc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUFfU0NBTl9USU1FT1VUOgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2ID0gKEJsdWV0b290aERldmljZSltc2cub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoZGV2LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUxvY2FsQnJvYWRjYXN0U291cmNlRm91bmQoQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgbG9jYWxEZXYgPQotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKS5nZXRSZW1vdGVEZXZpY2UobUJsdWV0b290aEFkYXB0ZXIuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU2NhblJlY29yZCByZWNvcmQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBuYW1lX2xlbiA9IChieXRlKWxvY2FsTmFtZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBieXRlW10gYmRfbmFtZSA9IGxvY2FsTmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKTsKLSAgICAgICAgICAgICAgICBieXRlW10gbmFtZV9rZXkgPSBuZXcgYnl0ZVtdIHsrK25hbWVfbGVuLCAweDA5IH07IC8vMHgwOSBUWVBFOk5hbWUKLSAgICAgICAgICAgICAgICBieXRlW10gc2Nhbl9yID0gbmV3IGJ5dGVbbmFtZV9rZXkubGVuZ3RoICsgYmRfbmFtZS5sZW5ndGhdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmFtZV9rZXksIDAsIHNjYW5fciwgMCwgbmFtZV9rZXkubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJkX25hbWUsIDAsIHNjYW5fciwgbmFtZV9rZXkubGVuZ3RoLCBiZF9uYW1lLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkID0gU2NhblJlY29yZC5wYXJzZUZyb21CeXRlcyhzY2FuX3IpOwotICAgICAgICAgICAgICAgIGxvZyAoIkxvY2FsIG5hbWUgcG9wdWxhdGVkIGluIGZha2UgU2NhbiByZXM6IiArIHJlY29yZC5nZXREZXZpY2VOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzID0gbmV3IFNjYW5SZXN1bHQobG9jYWxEZXYsCi0gICAgICAgICAgICAgICAgMSwgMSwgMSwyLCAwLCAwLCAwLCByZWNvcmQsIDApOwotICAgICAgICAgICAgaWYgKGNicyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgY2IgOiBjYnMpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2Iub25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZChzY2FuUmVzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIG9uQmxlQnJvYWRjYXN0U291cmNlRm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzIChCbHVldG9vdGhEZXZpY2Ugc3JjRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgbG9nKCAic2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVyczogIik7Ci0gICAgICAgICAgIEJsdWV0b290aExlU2Nhbm5lciBzY2FubmVyID0gbUJsdWV0b290aEFkYXB0ZXIuZ2V0Qmx1ZXRvb3RoTGVTY2FubmVyKCk7Ci0gICAgICAgICAgIG1Jc0xvY2FsQk1TTm90aWZpZWQgPSBmYWxzZTsKLSAgICAgICAgICAgaWYgKHNjYW5uZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInN0YXJ0TGVTY2FuOiBjYW5ub3QgZ2V0IEJsdWV0b290aExlU2Nhbm5lciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1MZUF1ZGlvU291cmNlU2NhbkNhbGxiYWNrcykgewotICAgICAgICAgICAgICAgIGlmIChtTGVBdWRpb1NvdXJjZVNjYW5DYWxsYmFja3MuY29udGFpbnNLZXkoY2JzKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJMRSBTY2FuIGhhcyBhbHJlYWR5IHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTY2FuQ2FsbGJhY2sgc2NhbkNhbGxiYWNrID0gbmV3IFNjYW5DYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TY2FuUmVzdWx0KGludCBjYWxsYmFja1R5cGUsIFNjYW5SZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coICJvblNjYW5SZXN1bHQ6IiArIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tUeXBlICE9IFNjYW5TZXR0aW5ncy5DQUxMQkFDS19UWVBFX0FMTF9NQVRDSEVTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTEUgU2NhbiBoYXMgYWxyZWFkeSBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU2NhblJlY29yZCBzY2FuUmVjb3JkID0gcmVzdWx0LmdldFNjYW5SZWNvcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50IHBJbnRlcnZhbCA9IHJlc3VsdC5nZXRQZXJpb2RpY0FkdmVydGlzaW5nSW50ZXJ2YWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8UGFyY2VsVXVpZCwgYnl0ZVtdPiBsaXN0T2ZVdWlkcyA9IHNjYW5SZWNvcmQuZ2V0U2VydmljZURhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdE9mVXVpZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmNlbFV1aWQgYm1zVXVpZCA9IG5ldyBQYXJjZWxVdWlkKEJyb2FkY2FzdFNlcnZpY2UuQkFBU19VVUlEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ib29sZWFuIGlzQnJvYWRjYXN0U291cmNlID0gbGlzdE9mVXVpZHMuY29udGFpbnNLZXkoYm1zVXVpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCcm9hZGNhc3RTb3VyY2UgPSBsaXN0T2ZVdWlkcy5jb250YWluc0tleShQYXJjZWxVdWlkLmZyb21TdHJpbmcoQkFBU19VVUlEKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyggImlzQnJvYWRjYXN0U291cmNlOiIgKyBpc0Jyb2FkY2FzdFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb2FkY2FzdFNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCAiQnJvYWRjYXN0IFNvdXJjZSBGb3VuZDoiICsgcmVzdWx0LmdldERldmljZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiIDogY2JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Iub25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBvbkJsZUJyb2FkY2FzdFNvdXJjZUZvdW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0RldmljZS5lcXVhbHMocmVzdWx0LmdldERldmljZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIm1hdGNoaW5nIHNyYyBEZXZpY2UgZm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQXV0b0Fzc2lzdFNjYW5IYW5kbGVyLm9idGFpbk1lc3NhZ2UoQUFfU0NBTl9TVUNDRVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1dG9Bc3Npc3RTY2FuSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyggIkJyb2FkY2FzdCBTb3VyY2UgVVVJRCBub3QgcHJlc2V0LCBpZ25vcmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklnbm9yZSBubyBVVUlEIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNjYW4gcmVjb3JkIGlzIG51bGwsIGlnbm9yaW5nIHRoaXMgU2NhbiByZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0JlZm9yZSBzdGFydGluZyBMRSBTY2FuLCBDYWxsIGxvY2FsIEFQSXMgdG8gZmluZCBvdXQgaWYgdGhlIGxvY2FsIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgLy9pcyBCcm9hZGNhc3RlciwgdGhlbiBnZW5lcmF0ZSBjYWxsYmFjayBmb3IgTG9jYWwgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Jc0xvY2FsQk1TTm90aWZpZWQgJiYgaXNMb2NhbExFQXVkaW9Ccm9hZGNhc3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGUgYSBEVU1NWSBzY2FuIHJlc3VsdCBmb3IgY29sb2NhdGVkIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMb2NhbEJyb2FkY2FzdFNvdXJjZUZvdW5kKGNicyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzTG9jYWxCTVNOb3RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TY2FuRmFpbGVkKGludCBlcnJvckNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTY2FuIEZhaWx1cmU6IiArIGVycm9yQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgIGlmIChtQmx1ZXRvb3RoQWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgaWYgKGNicyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgIG1MZUF1ZGlvU291cmNlU2NhbkNhbGxiYWNrcy5wdXQoY2JzLCBzY2FuQ2FsbGJhY2spOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgYXV0byBhc3Npc3QgdHJpZ2dlciByZW1lbWJlciBpdAotICAgICAgICAgICAgICAgICAvL2Jhc2VkIG9uIGRldmljZQotICAgICAgICAgICAgICAgICBtQmFzc0F1dG9Bc3Npc3QucHV0KHNyY0RldmljZSwgc2NhbkNhbGxiYWNrKTsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBTY2FuU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgU2NhblNldHRpbmdzLkJ1aWxkZXIoKS5zZXRDYWxsYmFja1R5cGUoCi0gICAgICAgICAgICAgICAgIFNjYW5TZXR0aW5ncy5DQUxMQkFDS19UWVBFX0FMTF9NQVRDSEVTKQotICAgICAgICAgICAgICAgICAuc2V0U2Nhbk1vZGUoU2NhblNldHRpbmdzLlNDQU5fTU9ERV9MT1dfTEFURU5DWSkKLSAgICAgICAgICAgICAgICAgLnNldExlZ2FjeShmYWxzZSkKLSAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgU2NhbkZpbHRlci5CdWlsZGVyIGZpbHRlckJ1aWxkZXIgPSBuZXcgU2NhbkZpbHRlci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgIFNjYW5GaWx0ZXIgc3JjRmlsdGVyID0gZmlsdGVyQnVpbGRlci5zZXRTZXJ2aWNlVXVpZCgKLSAgICAgICAgICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZyhCQUFTX1VVSUQpKS5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgTGlzdDxTY2FuRmlsdGVyPiBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxTY2FuRmlsdGVyPigpOwotICAgICAgICAgICAgICAgICBpZiAoIW1Jc0xvY2FsQk1TTm90aWZpZWQgJiYgaXNMb2NhbExFQXVkaW9Ccm9hZGNhc3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSBhIERVTU1ZIHNjYW4gcmVzdWx0IGZvciBjb2xvY2F0ZWQgY2FzZQotICAgICAgICAgICAgICAgICAgICBub3RpZnlMb2NhbEJyb2FkY2FzdFNvdXJjZUZvdW5kKGNicyk7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0xvY2FsQk1TTm90aWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIHNjYW5uZXIuc3RhcnRTY2FuKGZpbHRlcnMsIHNldHRpbmdzLCBzY2FuQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzOiBBZGFwdGVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gc3RvcFNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoQmx1ZXRvb3RoRGV2aWNlIHNyY0RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaz4gY2JzKSB7Ci0gICAgICAgIGxvZyggInN0b3BTZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzKCkiKTsKLSAgICAgICAgQmx1ZXRvb3RoTGVTY2FubmVyIHNjYW5uZXIgPSBtQmx1ZXRvb3RoQWRhcHRlci5nZXRCbHVldG9vdGhMZVNjYW5uZXIoKTsKLSAgICAgICAgaWYgKHNjYW5uZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFNjYW5DYWxsYmFjayBzY2FuQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICBpZiAoY2JzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjYW5DYWxsYmFjayA9IG1MZUF1ZGlvU291cmNlU2NhbkNhbGxiYWNrcy5yZW1vdmUoY2JzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNjYW5DYWxsYmFjayA9IG1MZUF1ZGlvU291cmNlU2NhbkNhbGxiYWNrcy5yZW1vdmUoc3JjRGV2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY2FuQ2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKCAic2NhbiBub3Qgc3RhcnRlZCB5ZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzY2FubmVyLnN0b3BTY2FuKHNjYW5DYWxsYmFjayk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbnZlcnRDb25maWd1cmF0aW9uU1JUb0NhcGFiaWxpdHlTUihieXRlIHNhbXBsZVJhdGUpIHsKLSAgICAgICAgaW50IHJldCA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFX05PTkU7Ci0gICAgICAgIHN3aXRjaCAoc2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJldCA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFX05PTkU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldCA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFX05PTkU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldCA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFX05PTkU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIC8vcmV0ID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMzIwMDA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHJldCA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFXzQ0MTAwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICByZXQgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV80ODAwMDsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGxvZygiY29udmVydENvbmZpZ3VyYXRpb25TUlRvQ2FwYWJpbGl0eVNSIHJldHVybnM6IiArIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2FtcGxlUmF0ZVN1cHBvcnRlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBieXRlIHNhbXBsZVJhdGUpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgLypfUEFDUwotICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdICBzdXBwb3J0ZWRDb25maWdzID0gbVBhY3NDbGllbnRTZXJ2aWNlLmdldFNpbmtQYWNzKGRldmljZSk7Ci0gICAgICAgIGludCBhY3R1YWxTYW1wbGVSYXRlID0gY29udmVydENvbmZpZ3VyYXRpb25TUlRvQ2FwYWJpbGl0eVNSKHNhbXBsZVJhdGUpOwotCi0gICAgICAgIGlmIChhY3R1YWxTYW1wbGVSYXRlID09IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFX05PTkUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzdXBwb3J0ZWRDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsU2FtcGxlUmF0ZSA9PSBzdXBwb3J0ZWRDb25maWdzW2ldLmdldFNhbXBsZVJhdGUoKSkgewotICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2coImlzU2FtcGxlUmF0ZVN1cHBvcnRlZCByZXR1cm5zOiIgKyByZXQpOwotICAgICAgICBfUEFDUyovCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHB1YmxpYyBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+IHNlbGVjdEJpc2VzKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvLCBCYXNlRGF0YSBiYXNlKSAgewotICAgICAgICBib29sZWFuIG5vUHJlZiA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5iYXNzX25vX3ByZWYiLCBmYWxzZSk7Ci0gICAgICAgIGlmIChub1ByZWYpIHsKLSAgICAgICAgICAgIGxvZygiTm8gcHJlZiBzZWxlY3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qX1BBQ1MKLSAgICAgICAgbVBhY3NDbGllbnRTZXJ2aWNlID0gUGFjc0NsaWVudFNlcnZpY2UuZ2V0UGFjc0NsaWVudFNlcnZpY2UoKTsKLSAgICAgICAgTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPiBiQ2hhbm5lbHMgPSBuZXcgQXJyYXlMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+KCk7Ci0gICAgICAgIC8vaWYgKG1QYWNzQ2xpZW50U2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2coInNlbGVjdEJpc2VzOiBQYWNzIFNlcnZpY2UgaXMgbnVsbCwgcGljayBCSVNlcyBhcHJvcHJpYXRlbHkiKTsKLSAgICAgICAgICAgIC8vUGFjcyBub3QgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYkNoYW5uZWxzID0gYmFzZS5waWNrQWxsQnJvYWRjYXN0Q2hhbm5lbHMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYkNoYW5uZWxzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiQ2hhbm5lbHM7Ci0gICAgICAgIC8vfQotICAgICAgICBpZiAobVBhY3NDbGllbnRTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdXBwb3J0ZWRMb2NhdGlvbnMgPSAxLyptUGFjc0NsaWVudFNlcnZpY2UuZ2V0U2lua0xvY2F0aW9ucyhkZXZpY2UpOwotICAgICAgICAgICAgQXJyYXlMaXN0PEJhc2VEYXRhLkJhc2VJbmZvcm1hdGlvbj4gYnJvYWRjYXN0ZWRDb2RlY0luZm8gPSBiYXNlLmdldEJJU0luZGV4SW5mb3MoKTsKLSAgICAgICAgICAgIGlmIChicm9hZGNhc3RlZENvZGVjSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGJyb2FkY2FzdGVkQ29kZWNJbmZvLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBjb25zb2xpZGF0ZWRVbmlxdWVDb2RlY0luZm8gPSBicm9hZGNhc3RlZENvZGVjSW5mby5nZXQoaSkuY29uc29saWRhdGVkVW5pcXVlQ29kZWNJbmZvOwotICAgICAgICAgICAgICAgICAgICBieXRlIGluZGV4ID0gYnJvYWRjYXN0ZWRDb2RlY0luZm8uZ2V0KGkpLmluZGV4OwotICAgICAgICAgICAgICAgICAgICBpZiAoY29uc29saWRhdGVkVW5pcXVlQ29kZWNJbmZvICE9IG51bGwpIHsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYmlzQ2hhbm5lbExvY2F0aW9uID0gY29uc29saWRhdGVkVW5pcXVlQ29kZWNJbmZvLmdldChMT0NBVElPTikuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsb2NhdGlvblZhbHVlID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJpc0NoYW5uZWxMb2NhdGlvbiwgMiwgbG9jYXRpb25WYWx1ZSwgMCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cgKCJsb2NhdGlvblZhbHVlPj4+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRCeXRlQXJyYXkobG9jYXRpb25WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHdyYXBwZWQgPSBCeXRlQnVmZmVyLndyYXAobG9jYXRpb25WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlzTG9jYXRpb24gPSB3cmFwcGVkLmdldEludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJiaXNMb2NhdGlvbjogIiArIGJpc0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXZlcnNlYmlzTG9jID0gSW50ZWdlci5yZXZlcnNlQnl0ZXMoYmlzTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJyZXZlcnNlYmlzTG9jOiAiICsgcmV2ZXJzZWJpc0xvYyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiaXNTYW1wbGVSYXRlID0gY29uc29saWRhdGVkVW5pcXVlQ29kZWNJbmZvLmdldChTQU1QTEVfUkFURSkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgYmlzU1IgPSBiaXNTYW1wbGVSYXRlWzJdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3VzaW5nIGJpdHdpc2Ugb3BlcmFuZCBhcyBMb2NhdGlvbiBjYW4gYmUgYml0bWFzawotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtcGxlUmF0ZVN1cHBvcnRlZChkZXZpY2UsIGJpc1NSKSAmJiAocmV2ZXJzZWJpc0xvYyAmIHN1cHBvcnRlZExvY2F0aW9ucykgPT0gc3VwcG9ydGVkTG9jYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygibWF0Y2hpbmcgbG9jYXRpb246IGJpc0xvY2F0aW9uICIgKyByZXZlcnNlYmlzTG9jICsgIjo6ICIgKyBzdXBwb3J0ZWRMb2NhdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsIGJjID0gbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwoaW5kZXgsIFN0cmluZy52YWx1ZU9mKGluZGV4KSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFubmVscy5hZGQoYmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiQ2hhbm5lbHMgIT0gbnVsbCAmJiBiQ2hhbm5lbHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIGxvZygic2VsZWN0QmlzZXM6IG5vIGNoYW5uZWwgYXJlIHNlbGVjdGVkIik7Ci0gICAgICAgICAgICBiQ2hhbm5lbHMgPSBudWxsOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJDaGFubmVsczsKLSAgICAgICAgX1BBQ1MqLwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJpZ2dlckF1dG9Bc3Npc3QgKEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbykgewotICAgICAgICAvL3NlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMgKHNyY0luZm8uZ2V0U291cmNlRGV2aWNlKCksIG51bGwsIEFVVE9fQVNTSVNUX1NDQU5fVElNRU9VVCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXYgPSBzcmNJbmZvLmdldFNvdXJjZURldmljZSgpOwotCi0gICAgICAgIE1lc3NhZ2UgbXNnID0gbUF1dG9Bc3Npc3RTY2FuSGFuZGxlci5vYnRhaW5NZXNzYWdlKEFBX1NUQVJUX1NDQU4pOwotICAgICAgICBtc2cub2JqID0gc3JjSW5mby5nZXRTb3VyY2VEZXZpY2UoKTsKLSAgICAgICAgbUF1dG9Bc3Npc3RTY2FuSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChCYXNzQ2xpZW50U3RhdGVNYWNoaW5lLkJBU1NfREJHKSB7Ci0gICAgICAgICAgIExvZy5kKFRBRywgbXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHByaW50Qnl0ZUFycmF5KGJ5dGVbXSBhcnJheSkgewotICAgICAgICBsb2coIkVudGlyZSBieXRlIEFycmF5IGFzIHN0cmluZzogIiArIEFycmF5cy50b1N0cmluZyhhcnJheSkpOwotICAgICAgICBsb2coInByaW50aXRuZyBieXRlIGJ5IGJ0ZSIpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICBsb2coICJhcnJheVsiICsgaSArICJdIDoiICsgQnl0ZS50b1Vuc2lnbmVkSW50KGFycmF5W2ldKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2Jyb2FkY2FzdC9Ccm9hZGNhc3ROYXRpdmVJbnRlcmZhY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYnJvYWRjYXN0L0Jyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTM0MGI2Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvYnJvYWRjYXN0L0Jyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEJyb2FkY2FzdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjU3RhdHVzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogQnJvYWRjYXN0IE5hdGl2ZSBJbnRlcmZhY2UgdG8vZnJvbSBKTkkuCi0gKi8KLQotcHVibGljIGNsYXNzIEJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCcm9hZGNhc3ROYXRpdmVJbnRlcmZhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgQEd1YXJkZWRCeSgiSU5TVEFOQ0VfTE9DSyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlIHNJbnN0YW5jZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSU5TVEFOQ0VfTE9DSyA9IG5ldyBPYmplY3QoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHByaXZhdGUgQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlKCkgewotICAgICAgICBtQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53dGZTdGFjayhUQUcsICJObyBCbHVldG9vdGggQWRhcHRlciBBdmFpbGFibGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCcm9hZGNhc3ROYXRpdmVJbnRlcmZhY2UgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoSU5TVEFOQ0VfTE9DSykgewotICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgbWF4aW11bSBudW1iZXIgb2YgQTJEUCBTaW5rIGRldmljZXMgdGhhdCBjYW4gYmUgY29ubmVjdGVkCi0gICAgICogc2ltdWx0YW5lb3VzbHkKLSAgICAgKiBAcGFyYW0gY29kZWNDb25maWdQcmlvcml0aWVzIGFuIGFycmF5IHdpdGggdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBwcmlvcml0aWVzIHRvIGNvbmZpZ3VyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KGludCBtYXhCcm9hZGNhc3QsIEJsdWV0b290aENvZGVjQ29uZmlnIGNvZGVjQ29uZmlnLCBpbnQgbW9kZSkgewotICAgICAgICBpbml0TmF0aXZlKG1heEJyb2FkY2FzdCwgY29kZWNDb25maWcsIG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFudXAgdGhlIG5hdGl2ZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgY2xlYW51cE5hdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb25uZWN0ZWQgQTJEUCByZW1vdGUgZGV2aWNlIGFzIGFjdGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZUJyb2FkY2FzdChCbHVldG9vdGhDb2RlY0NvbmZpZyBtQ29kZWNDb25maWcpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZW5hYmxlQnJvYWRjYXN0Iik7Ci0gICAgICAgIHJldHVybiBlbmFibGVCcm9hZGNhc3ROYXRpdmUobUNvZGVjQ29uZmlnKTsKLSAgICB9Ci0gICAgLy9Nb3ZlIFNNIHRvIElETEUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlQnJvYWRjYXN0KGludCBhZHZfaWQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZGlzYWJsZUJyb2FkY2FzdCIpOwotICAgICAgICByZXR1cm4gZGlzYWJsZUJyb2FkY2FzdE5hdGl2ZShhZHZfaWQpOwotICAgIH0KLSAgICAvL1JlbW92ZSBJU08gRGF0YSBwYXRoIGZvciByZWNvbmZpZ3VyYXRpb24KLSAgICBwdWJsaWMgYm9vbGVhbiBTZXR1cEF1ZGlvUGF0aChib29sZWFuIGVuYWJsZSwgaW50IGFkdl9pZCwgaW50IEJJR19oYW5kbGUsIGludCBudW1fYmlzZXMsIGludFtdIGJpc2VzKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIlNldHVwQXVkaW9QYXRoIGZvciBCSUcgSGFuZGxlOiAiICsgQklHX2hhbmRsZSk7Ci0gICAgICAgIHJldHVybiBzZXR1cEF1ZGlvUGF0aE5hdGl2ZShlbmFibGUsIGFkdl9pZCwgQklHX2hhbmRsZSwgbnVtX2Jpc2VzLCBiaXNlcyk7Ci0gICAgfQotICAgIC8vU3Rhci9FbmQgU2Vzc2lvbgotICAgIHB1YmxpYyBib29sZWFuIHNldEFjdGl2ZURldmljZShib29sZWFuIGVuYWJsZSwgaW50IGFkdklEKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIlNldEFjdGl2ZURldmljZSIpOwotICAgICAgICByZXR1cm4gc2V0QWN0aXZlRGV2aWNlTmF0aXZlKGVuYWJsZSwgYWR2SUQpOwotICAgIH0KLSAgICAvL1JldHJpZXZlIHN0b3JlZCBlbmNyeXB0aW9uIGtleQotICAgIHB1YmxpYyBTdHJpbmcgR2V0RW5jcnlwdGlvbktleSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiR2V0RW5jcnlwdGlvbktleSIpOwotICAgICAgICByZXR1cm4gZ2V0RW5jcnlwdGlvbktleU5hdGl2ZSgpOwotICAgIH0KLSAgICAvL1NldCBuZXcgZW5jeXB0aW9uIGtleQotICAgIHB1YmxpYyBib29sZWFuIFNldEVuY3J5cHRpb25LZXkoYm9vbGVhbiBlbmFibGVkLCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIlNldEVuY3J5cHRpb25LZXkiKTsKLSAgICAgICAgcmV0dXJuIHNldEVuY3J5cHRpb25LZXlOYXRpdmUoZW5hYmxlZCwgbGVuZ3RoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29kZWMgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBCbHVldG9vdGggZGV2aWNlCi0gICAgICogQHBhcmFtIGNvZGVjQ29uZmlnQXJyYXkgYW4gYXJyYXkgd2l0aCB0aGUgY29kZWMgY29uZmlndXJhdGlvbnMgdG8KLSAgICAgKiBjb25maWd1cmUuCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICAvL1Jlc3RhcnQgc2Vzc2lvbiB3aXRoIG5ldyBjb2RlYyBjb25maWcKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRDb2RlY0NvbmZpZ1ByZWZlcmVuY2UoaW50IGFkdl9oYW5kbGUsIEJsdWV0b290aENvZGVjQ29uZmlnIGNvZGVjQ29uZmlnKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInNldENvZGVjQ29uZmlnUHJlZmVyZW5jZSIpOwotICAgICAgICByZXR1cm4gc2V0Q29kZWNDb25maWdQcmVmZXJlbmNlTmF0aXZlKGFkdl9oYW5kbGUsIGNvZGVjQ29uZmlnKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBpbnQgdHJhbnNsYXRlX3N0YXRlX3RvX2FwcChpbnQgZXZlbnQsIGludCBzdGF0ZSkgewotICAgICAgICBpZiAoZXZlbnQgPT0gQnJvYWRjYXN0U3RhY2tFdmVudC5FVkVOVF9UWVBFX0JST0FEQ0FTVF9TVEFURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICBzd2l0Y2goc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgY2FzZSBCcm9hZGNhc3RTdGFja0V2ZW50LlNUQVRFX0lETEU6Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgICBjYXNlIEJyb2FkY2FzdFN0YWNrRXZlbnQuU1RBVEVfQ09ORklHVVJFRDoKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICAgY2FzZSBCcm9hZGNhc3RTdGFja0V2ZW50LlNUQVRFX1NUUkVBTUlORzoKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfU1RSRUFNSU5HOwotICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0RJU0FCTEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9CUk9BRENBU1RfQVVESU9fU1RBVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgIHN3aXRjaChzdGF0ZSkgewotICAgICAgICAgICAgICAgICBjYXNlIEJyb2FkY2FzdFN0YWNrRXZlbnQuU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfTk9UX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgIGNhc2UgQnJvYWRjYXN0U3RhY2tFdmVudC5TVEFURV9TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9OT1RfUExBWUlORzsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9ESVNBQkxFRDsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKEJyb2FkY2FzdFN0YWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgQnJvYWRjYXN0U2VydmljZSBzZXJ2aWNlID0gQnJvYWRjYXN0U2VydmljZS5nZXRCcm9hZGNhc3RTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2UubWVzc2FnZUZyb21OYXRpdmUoZXZlbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRXZlbnQgaWdub3JlZCwgc2VydmljZSBub3QgYXZhaWxhYmxlOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQnJvYWRjYXN0U3RhdGVDaGFuZ2VkKGludCBhZHZfaGFuZGxlLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgQnJvYWRjYXN0U3RhY2tFdmVudCBldmVudCA9Ci0gICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFN0YWNrRXZlbnQoQnJvYWRjYXN0U3RhY2tFdmVudC5FVkVOVF9UWVBFX0JST0FEQ0FTVF9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZXZlbnQudmFsdWVJbnQgPSB0cmFuc2xhdGVfc3RhdGVfdG9fYXBwKEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9CUk9BRENBU1RfU1RBVEVfQ0hBTkdFRCxzdGF0ZSk7Ci0gICAgICAgIGV2ZW50LmFkdkhhbmRsZSA9IGFkdl9oYW5kbGU7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQnJvYWRjYXN0U3RhdGVDaGFuZ2VkOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25BdWRpb1N0YXRlQ2hhbmdlZChpbnQgYWR2X2hhbmRsZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgIEJyb2FkY2FzdFN0YWNrRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RTdGFja0V2ZW50KEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9CUk9BRENBU1RfQVVESU9fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50ID0gdHJhbnNsYXRlX3N0YXRlX3RvX2FwcChCcm9hZGNhc3RTdGFja0V2ZW50LkVWRU5UX1RZUEVfQlJPQURDQVNUX0FVRElPX1NUQVRFX0NIQU5HRUQsc3RhdGUpOwotICAgICAgICBldmVudC5hZHZIYW5kbGUgPSBhZHZfaGFuZGxlOwotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkF1ZGlvU3RhdGVDaGFuZ2VkOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25FbmNyeXB0aW9uS2V5R2VuZXJhdGVkKFN0cmluZyBrZXkpIHsKLSAgICAgICAgQnJvYWRjYXN0U3RhY2tFdmVudCBldmVudCA9Ci0gICAgICAgICAgICBuZXcgQnJvYWRjYXN0U3RhY2tFdmVudChCcm9hZGNhc3RTdGFja0V2ZW50LkVWRU5UX1RZUEVfRU5DX0tFWV9HRU5FUkFURUQpOwotICAgICAgICBldmVudC5rZXkgPSBrZXk7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uRW5jcnlwdGlvbktleUdlbmVyYXRlZDogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kTWVzc2FnZVRvU2VydmljZShldmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ29kZWNDb25maWdDaGFuZ2VkKGludCBhZHZfaGFuZGxlLCBCbHVldG9vdGhDb2RlY0NvbmZpZyBuZXdDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIGNvZGVjQ2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIEJyb2FkY2FzdFN0YWNrRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFN0YWNrRXZlbnQoQnJvYWRjYXN0U3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPREVDX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgZXZlbnQuY29kZWNTdGF0dXMgPSBuZXcgQmx1ZXRvb3RoQ29kZWNTdGF0dXMobmV3Q29kZWNDb25maWcsIGNvZGVjQ2FwYWJpbGl0aWVzLCBjb2RlY0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIGV2ZW50LmFkdkhhbmRsZSA9IGFkdl9oYW5kbGU7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29kZWNDb25maWdDaGFuZ2VkOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25TZXR1cEJJRyhpbnQgc2V0dXAsIGludCBhZHZfaWQsIGludCBiaWdfaGFuZGxlLCBpbnQgbnVtX2Jpc2VzLCBjaGFyW10gYmlzX2hhbmRsZXMpIHsKLSAgICAgICAgQnJvYWRjYXN0U3RhY2tFdmVudCBldmVudCA9IG5ldyBCcm9hZGNhc3RTdGFja0V2ZW50KEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9TRVRVUF9CSUcpOwotICAgICAgICBldmVudC52YWx1ZUludCA9IHNldHVwOwotICAgICAgICBldmVudC5hZHZIYW5kbGUgPSBhZHZfaWQ7Ci0gICAgICAgIGV2ZW50LmJpZ0hhbmRsZSA9IGJpZ19oYW5kbGU7Ci0gICAgICAgIGV2ZW50Lk51bUJpc2VzID0gbnVtX2Jpc2VzOwotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblNldHVwQklHOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Ccm9hZGNhc3RJZEdlbmVyYXRlZChieXRlW10gYnJvYWRjYXN0X2lkKSB7Ci0gICAgICAgIEJyb2FkY2FzdFN0YWNrRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFN0YWNrRXZlbnQoQnJvYWRjYXN0U3RhY2tFdmVudC5FVkVOVF9UWVBFX0JST0FEQ0FTVF9JRF9HRU5FUkFURUQpOwotICAgICAgICBMb2cuZChUQUcsIm9uQnJvYWRjYXN0SWRHZW5lcmF0ZWQiKTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgZXZlbnQuQnJvYWRjYXN0SWRbaV0gPSBicm9hZGNhc3RfaWRbaV07Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJCcm9hZGNhc3RJRCBbIitpKyJdIiArICIgPSAiICsgZXZlbnQuQnJvYWRjYXN0SWRbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQnJvYWRjYXN0SWRHZW5lcmF0ZWQ6ICIgKyBldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZE1lc3NhZ2VUb1NlcnZpY2UoZXZlbnQpOwotICAgIH0KLQotICAgIC8vIE5hdGl2ZSBtZXRob2RzIHRoYXQgY2FsbCBpbnRvIHRoZSBKTkkgaW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlKGludCBtYXhCcm9hZGNhc3QsIEJsdWV0b290aENvZGVjQ29uZmlnIGNvZGVjQ29uZmlnLCBpbnQgbW9kZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbGVhbnVwTmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2VOYXRpdmUoYm9vbGVhbiBlbmFibGUsIGludCBhZHZfaWQpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZW5hYmxlQnJvYWRjYXN0TmF0aXZlKEJsdWV0b290aENvZGVjQ29uZmlnIGNvZGVjQ29uZmlnKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2FibGVCcm9hZGNhc3ROYXRpdmUoaW50IGFkdl9pZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXR1cEF1ZGlvUGF0aE5hdGl2ZShib29sZWFuIGVuYWJsZSwgaW50IGFkdl9pZCwgaW50IGJpZ19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Jpc2VzLCBpbnRbXSBiaXNlcyk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGdldEVuY3J5cHRpb25LZXlOYXRpdmUoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldEVuY3J5cHRpb25LZXlOYXRpdmUoYm9vbGVhbiBlbmFibGVkLCBpbnQgbGVuZ3RoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldENvZGVjQ29uZmlnUHJlZmVyZW5jZU5hdGl2ZShpbnQgYWR2X2lkLCBCbHVldG9vdGhDb2RlY0NvbmZpZyBjb2RlY0NvbmZpZyk7Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2Jyb2FkY2FzdC9Ccm9hZGNhc3RTZXJ2aWNlLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2Jyb2FkY2FzdC9Ccm9hZGNhc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2NkMDYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9icm9hZGNhc3QvQnJvYWRjYXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5icm9hZGNhc3Q7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhCcm9hZGNhc3Q7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY1N0YXR1czsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhCcm9hZGNhc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdHNMb2c7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLQotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1ldHJpY3NQcm90bzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLkF2cmNwOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hdnJjcC5BdnJjcF9leHQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLkF2cmNwVGFyZ2V0U2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYTJkcC5BMmRwU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLkFkYXB0ZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuTWV0cmljc0xvZ2dlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlByb2ZpbGVTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJhLkJBVFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmdhdHQuR2F0dFNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5oZnAuSGVhZHNldFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5BZHZlcnRpc2VDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5BZHZlcnRpc2VEYXRhOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkFkdmVydGlzZVNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkFkdmVydGlzaW5nU2V0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkFkdmVydGlzaW5nU2V0Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuQWR2ZXJ0aXNpbmdTZXRQYXJhbWV0ZXJzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkJsdWV0b290aExlQWR2ZXJ0aXNlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5QZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVyczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5BcG1Db25zdDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkRldmljZVByb2ZpbGVNYXA7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5NZWRpYUF1ZGlvOwotCi0vKioKLSAqIFByb3ZpZGVzIEJsdWV0b290aCBCcm9hZGNhc3QgcHJvZmlsZSwgYXMgYSBzZXJ2aWNlIGluIHRoZSBCbHVldG9vdGggYXBwbGljYXRpb24uCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgQnJvYWRjYXN0U2VydmljZSBleHRlbmRzIFByb2ZpbGVTZXJ2aWNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJyb2FkY2FzdFNlcnZpY2UiOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Ccm9hZGNhc3RMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgc3RhdGljIEJyb2FkY2FzdFNlcnZpY2Ugc0Jyb2FkY2FzdFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBBZGFwdGVyU2VydmljZSBtQWRhcHRlclNlcnZpY2U7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlIG1Ccm9hZGNhc3ROYXRpdmVJbnRlcmZhY2U7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgU2VydmljZUZhY3RvcnkgbUZhY3RvcnkgPSBuZXcgU2VydmljZUZhY3RvcnkoKTsKLSAgICBwcml2YXRlIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIGludCBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQ7Ci0gICAgaW50IG1Ccm9hZGNhc3RBdWRpb1N0YXRlID0gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX05PVF9QTEFZSU5HOwotICAgIHByaXZhdGUgU3RyaW5nIG1FbmNyeXB0aW9uU3RyaW5nOwotICAgIHByaXZhdGUgYnl0ZVtdIG1FbmNLZXkgPSBuZXcgYnl0ZVsxNl07Ci0gICAgcHJpdmF0ZSBieXRlIFtdIEJpZ0Jyb2FkY2FzdENvZGUgPSBuZXcgYnl0ZSBbMTZdOwotICAgIHByaXZhdGUgYnl0ZSBbXSBtQnJvYWRjYXN0SUQgPSBuZXcgYnl0ZVszXTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtQnJvYWRjYXN0SWRMZW5ndGggPSAzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5jcnlwdGlvbkVuYWJsZWQgPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFydGlhbFNpbXVsY2FzdCA9IGZhbHNlOy8vZHVhbCBxdWFsaXR5IHNpbXVsY2FzdAotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5jS2V5UmVmcmVzaGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbUVuY3J5cHRpb25MZW5ndGggPTE2OwotICAgIHByaXZhdGUgaW50IG1EZWZhdWx0RW5jcnlwdGlvbkxlbmd0aCA9IDE2OwotICAgIHByaXZhdGUgaW50IFtdIGJpc19oYW5kbGVzOwotICAgIHByaXZhdGUgaW50IG1CSUdIYW5kbGUgPSAtMTsKLSAgICBwcml2YXRlIGludCBtTnVtQmlzZXMgPSAtMTsKLSAgICBwcml2YXRlIGludCBtTnVtU3ViR3JwcyA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgbVBEID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ29pbmdEb3duID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FkdmVydGlzaW5nID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RNZXNzYWdlSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIEFkdmVydGlzaW5nU2V0Q2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgQWR2ZXJ0aXNpbmdTZXQgbUFkdmVydGlzaW5nU2V0OwotICAgIExpc3QgPEJpc0luZm8+IG1CaXNJbmZvOwotICAgIE1hcDxJbnRlZ2VyLCBNZXRhZGF0YUx0dj5tTWV0YUluZm8gPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8PigpKTs7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFkdkFkZHJlc3M7Ci0gICAgcHJpdmF0ZSBpbnQgbUFkdkFkZHJlc3NUeXBlOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoTGVBZHZlcnRpc2VyIG1BZHZlcnRpc2VyOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNTdGF0dXMgbUNvZGVjU3RhdHVzOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNDb25maWcgbUNvZGVjQ29uZmlnOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNDb25maWcgbUhhcENvZGVjQ29uZmlnOwotICAgIHByaXZhdGUgQnJvYWRjYXN0Q29kZWNDb25maWcgbUJyb2FkY2FzdENvZGVjQ29uZmlnOwotICAgIHByaXZhdGUgQnJvYWRjYXN0QWR2ZXJ0aXNlciBtQnJvYWRjYXN0QWR2ZXJ0aXNlcjsKLSAgICBwcml2YXRlIGludCBtQnJvYWRjYXN0Q29uZmlnU2V0dGluZ3M7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1CbHVldG9vdGhBZGFwdGVyOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1Ccm9hZGNhc3REZXZpY2UgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQnJvYWRjYXN0RGV2aWNlSXNBY3RpdmUgPSBmYWxzZTsKLSAgICBUcmFja01ldGFkYXRhIG1UcmFja01ldGFkYXRhOwotICAgIHByaXZhdGUgU3RyaW5nIG1Ccm9hZGNhc3RBZGRyZXNzID0gIkZBOkNFOkZBOkNFOkZBOkNFIjsKLSAgICBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZSBtQWN0aXZlRGV2aWNlTWFuYWdlcjsKLSAgICBwdWJsaWMgc3RhdGljIFVVSUQgQlJPQURDQVNUX0FVRElPX1VVSUQgPSBVVUlELmZyb21TdHJpbmcoIjAwMDAxODUyLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotICAgIHB1YmxpYyBzdGF0aWMgVVVJRCBCQVNJQ19BVURJT19VVUlEID0gVVVJRC5mcm9tU3RyaW5nKCIwMDAwMTg1MS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLSAgICBwcml2YXRlIEJyb2FkY2FzdEJhc2UgbUJyb2FkY2FzdEJhc2U7Ci0gICAgcHJpdmF0ZSBNZWRpYUF1ZGlvIG1NZWRpYUF1ZGlvOwotICAgIHByaXZhdGUgYm9vbGVhbiBuZXdfY29kZWNfaWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbVNlY1BoeSA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1UeFBvd2VyTGV2ZWwgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGludCBtUGFJbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZXdWZXJzaW9uID0gZmFsc2U7Ci0gICAgTGlzdCA8U3RyaW5nPiBicm9hZGNhc3Rfc3VwcG9ydGVkX2NvbmZpZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihMaXN0Lm9mKCIxNl8yIiwgIjI0XzIiLCAiNDhfMSIsICI0OF8yIiwgIjQ4XzMiLCAiNDhfNCIsICI0OF81IiwgIjQ4XzYiKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19FTkFCTEVfQlJPQURDQVNUID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RJU0FCTEVfQlJPQURDQVNUID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9FTkNSWVBUSU9OX0tFWSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19HRVRfRU5DUllQVElPTl9LRVkgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0JST0FEQ0FTVF9BQ1RJVkUgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX0JST0FEQ0FTVF9BRFZfU0VUID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FEVl9EQVRBX1NFVCA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfQVVESU9fUEFUSCA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19SRVNFVF9FTkNSWVBUSU9OX0ZMQUdfVElNRU9VVCA9IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GUk9NX05BVElWRV9DT0RFQ19TVEFURSA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRlJPTV9OQVRJVkVfQlJPQURDQVNUX1NUQVRFID0gMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GUk9NX05BVElWRV9FTkNSWVBUSU9OX0tFWSA9IDEyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRlJPTV9OQVRJVkVfQlJPQURDQVNUX0FVRElPX1NUQVRFID0gMTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GUk9NX05BVElWRV9TRVRVUF9CSUcgPSAxNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9CUk9BRENBU1RfU1RBVEUgPSAxNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZST01fTkFUSVZFX0JST0FEQ0FTVF9JRCA9IDE2OwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgaW5pdEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCbHVldG9vdGhCcm9hZGNhc3RCaW5kZXIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBMb2cuaShUQUcsICJjcmVhdGUoKSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0KCkgewotICAgICAgICBMb2cuaShUQUcsICJzdGFydCgpIik7Ci0gICAgICAgIGlmIChzQnJvYWRjYXN0U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJCcm9hZGNhc3RlcnZpY2UgaXMgYWxyZWFkeSBydW5uaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIG1IYW5kbGVyID0gbnVsbDsKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChBZGFwdGVyU2VydmljZS5nZXRBZGFwdGVyU2VydmljZSgpLAotICAgICAgICAgICAgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIHdoZW4gQTJkcFNlcnZpY2Ugc3RhcnRzIik7Ci0KLSAgICAgICAgbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwobUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgIkJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZSBjYW5ub3QgYmUgbnVsbCB3aGVuIEJyb2FkY2FzdFNlcnZpY2Ugc3RhcnRzIik7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG1BdWRpb01hbmFnZXIsCi0gICAgICAgICAgICAiQXVkaW9NYW5hZ2VyIGNhbm5vdCBiZSBudWxsIHdoZW4gQTJkcFNlcnZpY2Ugc3RhcnRzIik7Ci0gICAgICAgIEhhbmRsZXJUaHJlYWQgdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkJyb2FkY2FzdEhhbmRsZXIiKTsKLSAgICAgICAgbUJyb2FkY2FzdENvbmZpZ1NldHRpbmdzID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoInBlcnNpc3QudmVuZG9yLmJ0c3RhY2suYmFwX2JhX3NldHRpbmciLCA0KTsKLSAgICAgICAgbUJyb2FkY2FzdENvZGVjQ29uZmlnID0gbmV3IEJyb2FkY2FzdENvZGVjQ29uZmlnKCk7Ci0gICAgICAgIFN0cmluZyBQYXJ0aWFsU2ltdWxjYXN0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3QudmVuZG9yLmJ0c3RhY2sucGFydGlhbF9zaW11bGNhc3QiKTsKLSAgICAgICAgaWYgKCFQYXJ0aWFsU2ltdWxjYXN0LmlzRW1wdHkoKSAmJiAidHJ1ZSIuZXF1YWxzKFBhcnRpYWxTaW11bGNhc3QpKSB7Ci0gICAgICAgICAgICBtUGFydGlhbFNpbXVsY2FzdCA9IHRydWU7Ci0gICAgICAgICAgICBtTnVtU3ViR3JwcyA9IDI7Ci0gICAgICAgICAgICBtTnVtQmlzZXMgPSA0OwotICAgICAgICAgICAgLy9tSGFwQ29kZWNDb25maWcgPSBuZXcgQnJvYWRjYXN0Q29kZWNDb25maWcobVBhcnRpYWxTaW11bGNhc3QpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtTmV3Q29kZWNJZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnZlbmRvci5idHN0YWNrLm5ld19sYzNfaWQiKTsKLSAgICAgICAgaWYgKG1OZXdDb2RlY0lkLmlzRW1wdHkoKSB8fCAidHJ1ZSIuZXF1YWxzKG1OZXdDb2RlY0lkKSB8fAotICAgICAgICAgICAgIjYiLmVxdWFscyhtTmV3Q29kZWNJZCkpIHsKLSAgICAgICAgICAgIG5ld19jb2RlY19pZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogUHJvcGVydHkgdG8gc2V0IHNlY29uZGF5IGFkdmVydGlzaW5nIHBoeSB0byAxTSBvciAyTS4gMk0gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdAotICAgICAgICAgKiBpZiBwcm9wZXR5IGlzIG5vdCBzZXQKLSAgICAgICAgICovCi0gICAgICAgIG1TZWNQaHkgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5zZWNwaHkiLCAyKTsKLSAgICAgICAgbVR4UG93ZXJMZXZlbCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LnR4cG93ZXIiLCA5KTsKLSAgICAgICAgbVBEID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQucHJlc2VudGF0aW9uX2RlbGF5IiwgNDApOwotICAgICAgICBtUGFJbnQgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5wYV9pbnRlcnZhbCIsIDM2MCk7Ci0gICAgICAgIG1OZXdWZXJzaW9uID0gU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0Lm5ld19iYV92ZXJzaW9uIiwgdHJ1ZSk7Ci0gICAgICAgIGludCBvZmZsb2FkX21vZGUgPSAxOyAvL29mZmxvYWQKLSAgICAgICAgbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5pbml0KDEsIG1Db2RlY0NvbmZpZyxvZmZsb2FkX21vZGUpOwotICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlLnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOwotICAgICAgICBMb29wZXIgbG9vcGVyID0gdGhyZWFkLmdldExvb3BlcigpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBCcm9hZGNhc3RNZXNzYWdlSGFuZGxlcihsb29wZXIpOwotICAgICAgICBtQmx1ZXRvb3RoQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgbUJyb2FkY2FzdEJhc2UgPSBuZXcgQnJvYWRjYXN0QmFzZSgpOwotICAgICAgICBtQmlzSW5mbyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAvL21Ccm9hZGNhc3RBZHZlcnRpc2VyID0gbmV3IEJyb2FkY2FzdEFkdmVydGlzZXIoKTsKLSAgICAgICAgc2V0QnJvYWRjYXN0U2VydmljZSh0aGlzKTsKLSAgICAgICAgbUJyb2FkY2FzdERldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShtQnJvYWRjYXN0QWRkcmVzcyk7Ci0gICAgICAgIG1UcmFja01ldGFkYXRhID0gbmV3IFRyYWNrTWV0YWRhdGEobnVsbCk7Ci0KLSAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQodGhpcyk7Ci0gICAgICAgIERldmljZVByb2ZpbGVNYXAgZHBtID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgZHBtLnByb2ZpbGVDb25uZWN0aW9uVXBkYXRlKG1Ccm9hZGNhc3REZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQlJPQURDQVNUX0FVRElPLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9MRSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy9HZXQgY3VycmVudCBjb2RlYyBhbmQgY2FsbCBuYXRpdmUgaW5pdAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVfYWR2ZXJ0aXNlcigpIHsKLSAgICAgICAgTG9nLmQoVEFHLCJpbml0YWxpemVfYWR2ZXJ0aXNlciIpOwotICAgICAgICBtQnJvYWRjYXN0QWR2ZXJ0aXNlciA9IG5ldyBCcm9hZGNhc3RBZHZlcnRpc2VyKCk7Ci0gICAgICAgIEdldEVuY3J5cHRpb25LZXlGcm9tTmF0aXZlKCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzdGFydEFkdlRlc3QoKSB7Ci0gICAgICAgIC8vTG9nLmQoVEFHLCJzdGFydEFkdlRlc3QhISEiKTsKLSAgICAgICAgYm9vbGVhbiBiYV90ZXN0ID0gU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJwZXJzaXN0LnZlbmRvci5idHN0YWNrLmJhdGVzdCIsZmFsc2UpOwotICAgICAgICBpZiAoYmFfdGVzdCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCJzdGFydEFkdlRlc3QhISEiKTsKLSAgICAgICAgICAgIEVuYWJsZUJyb2FkY2FzdChudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEFkYXB0ZXIuRVhUUkFfU1RBVEUsQmx1ZXRvb3RoQWRhcHRlci5FUlJPUik7Ci0gICAgICAgICAgICAgICBMb2cuZChUQUcsImFjdGlvbjogIiArIGFjdGlvbiArICIgc3RhdGU6ICIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgewotICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVfYWR2ZXJ0aXNlcigpOwotICAgICAgICAgICAgICAgICAgIHN0YXJ0QWR2VGVzdCgpOwotICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHNCcm9hZGNhc3RTZXJ2aWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfYnJvYWRjYXN0KCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3AoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgInN0b3AoKSIpOwotICAgICAgICBpZiAoc0Jyb2FkY2FzdFNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAic3RvcCgpIGNhbGxlZCBiZWZvcmUgc3RhcnQoKSIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5QnJvYWRjYXN0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGlmIChtSXNBZHZlcnRpc2luZykgewotICAgICAgICAgICBtQnJvYWRjYXN0QWR2ZXJ0aXNlci5zdG9wQnJvYWRjYXN0QWR2ZXJ0aXNpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBtQWRhcHRlclNlcnZpY2UgPSBudWxsOwotICAgICAgICBtQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlID0gbnVsbDsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IG51bGw7Ci0gICAgICAgIG1Jc0FkdmVydGlzaW5nID0gZmFsc2U7Ci0gICAgICAgIExvb3BlciBsb29wZXIgPSBtSGFuZGxlci5nZXRMb29wZXIoKTsKLSAgICAgICAgaWYgKGxvb3BlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb29wZXIucXVpdCgpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJyb2FkY2FzdFNlcnZpY2UobnVsbCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImNsZWFudXAoKSIpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBCcm9hZGNhc3RTZXJ2aWNlIGdldEJyb2FkY2FzdFNlcnZpY2UoKSB7Ci0gICAgICAgIGlmIChzQnJvYWRjYXN0U2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJnZXRCcm9hZGNhc3RTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzQnJvYWRjYXN0U2VydmljZS5pc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJnZXRCcm9hZGNhc3RTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNCcm9hZGNhc3RTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKiBIYW5kbGVzIEJyb2FkY2FzdCBtZXNzYWdlcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEJyb2FkY2FzdE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgQnJvYWRjYXN0TWVzc2FnZUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiQnJvYWRjYXN0TWVzc2FnZUhhbmRsZXI6IHJlY2VpdmVkIG1lc3NhZ2U9IiArIG1zZy53aGF0KTsKLSAgICAgICAgICAgIGludCBwcmV2X3N0YXRlOwotICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0VOQUJMRV9CUk9BRENBU1Q6Ci0gICAgICAgICAgICAgICAgICAgIC8vaW50IHByZXZfc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUJyb2FkY2FzdExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2V0dGluZyBicm9hZGNhc3Qgc3RhdGUgdG8gRU5BQkxJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfc3RhdGUgPSBtQnJvYWRjYXN0U3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRU5BQkxJTkc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0U3RhdGUobUJyb2FkY2FzdFN0YXRlLCBwcmV2X3N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5lbmFibGVCcm9hZGNhc3QobUNvZGVjQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RJU0FCTEVfQlJPQURDQVNUOgotICAgICAgICAgICAgICAgICAgICAvL2ludCBwcmV2X3N0YXRlOwotICAgICAgICAgICAgICAgICAgICBnb2luZ0Rvd24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1Jc0FkdmVydGlzaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJCcm9hZGNhc3QgaXMgbm90IGFkdmVydGlzaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobUJyb2FkY2FzdExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCJEaXNhYmxpbmcgYnJvYWRjYXN0LCBzZXR0aW5nIHN0YXRlIHRvIERJU0FCTElORyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9zdGF0ZSA9IG1Ccm9hZGNhc3RTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTdGF0ZSA9IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9ESVNBQkxJTkc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0U3RhdGUobUJyb2FkY2FzdFN0YXRlLCBwcmV2X3N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5kaXNhYmxlQnJvYWRjYXN0KG1BZHZlcnRpc2luZ1NldC5nZXRBZHZlcnRpc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vbUJyb2FkY2FzdEFkdmVydGlzZXIuc3RvcEJyb2FkY2FzdEFkdmVydGlzaW5nKCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfRU5DUllQVElPTl9LRVk6Ci0gICAgICAgICAgICAgICAgICAgIC8vaW50IGxlbmd0aCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlLlNldEVuY3J5cHRpb25LZXkobUVuY3J5cHRpb25FbmFibGVkLCBtRW5jcnlwdGlvbkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jcnlwdGlvbkxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbURlZmF1bHRFbmNyeXB0aW9uTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdCcm9hZGNhc3RDb2RlW2ldID0gMHgwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdEVuY3J5cHRpb25rZXlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfR0VUX0VOQ1JZUFRJT05fS0VZOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmNyeXB0aW9uU3RyaW5nID0gbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5HZXRFbmNyeXB0aW9uS2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jcnlwdGlvblN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIk1TR19HRVRfRU5DUllQVElPTl9LRVk6IG1FbmNyeXB0aW9uU3RyaW5nIG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURlZmF1bHRFbmNyeXB0aW9uTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnQnJvYWRjYXN0Q29kZVtpXSA9IDB4MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRW5jS2V5PSBtRW5jcnlwdGlvblN0cmluZy5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJtRW5jcnlwdGlvblN0cmluZzogIiArIG1FbmNyeXB0aW9uU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRW5jS2V5LCAwLCBCaWdCcm9hZGNhc3RDb2RlLCAwLCBtRW5jS2V5Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jS2V5Lmxlbmd0aCA8IG1EZWZhdWx0RW5jcnlwdGlvbkxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbmNLZXkubGVuZ3RoOyBpIDwgbURlZmF1bHRFbmNyeXB0aW9uTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdCcm9hZGNhc3RDb2RlW2ldID0gMHgwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpIDwgbURlZmF1bHRFbmNyeXB0aW9uTGVuZ3RoLzI7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSB0ZW1wID0gQmlnQnJvYWRjYXN0Q29kZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0Jyb2FkY2FzdENvZGVbaV0gPSBCaWdCcm9hZGNhc3RDb2RlWyhtRGVmYXVsdEVuY3J5cHRpb25MZW5ndGggLTEpIC0gaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaWdCcm9hZGNhc3RDb2RlWyhtRGVmYXVsdEVuY3J5cHRpb25MZW5ndGggLTEpIC0gaV0gPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCJCaWdCcm9hZGNhc3RDb2RlWyIrIGkgKyAiXSA9ICIgKyBCaWdCcm9hZGNhc3RDb2RlW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFN0dWIgdG8gdGVzdCBlbmNyeXB0aW9uIGtleSBjcmVhdGlvbiwgdG8gYmUgcmVtb3ZlZAotICAgICAgICAgICAgICAgICAgICAvL0xvZy5pKFRBRywiY2FsbGluZyBzZXRlbmNyeXB0aW9ua2V5Iik7Ci0gICAgICAgICAgICAgICAgICAgIC8vbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5TZXRFbmNyeXB0aW9uS2V5KDQpOwotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RFbmNyeXB0aW9ua2V5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfQlJPQURDQVNUX0FEVl9TRVQ6Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfQlJPQURDQVNUX0FDVElWRToKLSAgICAgICAgICAgICAgICAgIC8vIENhbGwgbmF0aXZlIGxheWVyIHRvIHNldCBicm9hZGNhc3QgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgIC8vbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5zZXRBY3RpdmVEZXZpY2UodHJ1ZSwgbUFkdmVydGlzaW5nU2V0LmdldEFkdmVydGlzZXJJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgLy9zZXRBY3RpdmVEZXZpY2UobUJyb2FkY2FzdERldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUJyb2FkY2FzdEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVNFVF9FTkNSWVBUSU9OX0ZMQUdfVElNRU9VVDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCJTZXR0aW5nIG1FbmNLZXlSZWZyZXNoZWQgdG8gZmFsc2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbUVuY0tleVJlZnJlc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfRlJPTV9OQVRJVkVfQlJPQURDQVNUX1NUQVRFOgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobUJyb2FkY2FzdExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9zdGF0ZSA9IG1Ccm9hZGNhc3RTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFN0YXRlID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIk5ldyBicm9hZGNhc3Qgc3RhdGU6ICIgKyBtQnJvYWRjYXN0U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Ccm9hZGNhc3RTdGF0ZSA9PSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnb2luZ0Rvd24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlCcm9hZGNhc3RFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1CSUdIYW5kbGUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RBZHZlcnRpc2VyLnN0b3BCcm9hZGNhc3RBZHZlcnRpc2luZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfc3RhdGUgIT0gbUJyb2FkY2FzdFN0YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0U3RhdGUobUJyb2FkY2FzdFN0YXRlLCBwcmV2X3N0YXRlKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FEVl9EQVRBX1NFVDoKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQnJvYWRjYXN0TG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTZXR0aW5nIGJyb2FkY2FzdCBzdGF0ZSB0byBFTkFCTElORyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9zdGF0ZSA9IG1Ccm9hZGNhc3RTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RTdGF0ZSA9IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9FTkFCTEVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdFN0YXRlKG1Ccm9hZGNhc3RTdGF0ZSwgcHJldl9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfQVVESU9fUEFUSDoKLSAgICAgICAgICAgICAgICAgIC8vbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5TZXR1cEF1ZGlvUGF0aCh0cnVlLG1BZHZlcnRpc2luZ1NldC5nZXRBZHZlcnRpc2VySWQoKSxtQklHSGFuZGxlLG1OdW1CaXNlcyxiaXNfaGFuZGxlcyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19GUk9NX05BVElWRV9DT0RFQ19TVEFURToKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3RhdHVzID0gKEJsdWV0b290aENvZGVjU3RhdHVzKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc0NvZGVjQ29uZmlnQ2hhbmdlZChtQ29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RDb2RlY0NvbmZpZy51cGRhdGVCcm9hZGNhc3RDb2RlY0NvbmZpZyhtQ29kZWNTdGF0dXMuZ2V0Q29kZWNDb25maWcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0QmFzZS5wb3B1bGF0ZUJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RBZHZlcnRpc2VyLnVwZGF0ZVBBd2l0aEJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RDb2RlY0NvbmZpZyhtQ29kZWNTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFBdWRpbyA9IE1lZGlhQXVkaW8uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUF1ZGlvLm9uQ29kZWNDb25maWdDaGFuZ2UobUJyb2FkY2FzdERldmljZSwgbUNvZGVjU3RhdHVzLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLkJST0FEQ0FTVF9MRSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19GUk9NX05BVElWRV9FTkNSWVBUSU9OX0tFWTogewotICAgICAgICAgICAgICAgICAgICBtRW5jcnlwdGlvblN0cmluZyA9IChTdHJpbmcpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJtRW5jcnlwdGlvblN0cmluZzogIiArIG1FbmNyeXB0aW9uU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgbUVuY0tleT0gbUVuY3J5cHRpb25TdHJpbmcuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRW5jS2V5LCAwLCBCaWdCcm9hZGNhc3RDb2RlLCAwLCBtRW5jS2V5Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jS2V5Lmxlbmd0aCA8IG1EZWZhdWx0RW5jcnlwdGlvbkxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbmNLZXkubGVuZ3RoOyBpIDwgbURlZmF1bHRFbmNyeXB0aW9uTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdCcm9hZGNhc3RDb2RlW2ldID0gMHgwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbmNLZXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywibUVuY1siICsgaSArIl0gPSAiICsgbUVuY0tleVtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSA8IG1EZWZhdWx0RW5jcnlwdGlvbkxlbmd0aC8yOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgdGVtcCA9IEJpZ0Jyb2FkY2FzdENvZGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaWdCcm9hZGNhc3RDb2RlW2ldID0gQmlnQnJvYWRjYXN0Q29kZVsobURlZmF1bHRFbmNyeXB0aW9uTGVuZ3RoIC0gMSkgLSBpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0Jyb2FkY2FzdENvZGVbKG1EZWZhdWx0RW5jcnlwdGlvbkxlbmd0aCAtIDEpIC0gaV0gPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vQnJvYWRjYXN0IGVuY3lwdGlvbiBrZXkgc2V0Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdEVuY3J5cHRpb25rZXlTZXQoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZST01fTkFUSVZFX1NFVFVQX0JJRzoKLSAgICAgICAgICAgICAgICAgICAgaW50IHNldHVwID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0ID0gKHNldHVwID09IDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJCSUcgY3JlYXRlZDogIiArIG1CSUdIYW5kbGUgKyAid2l0aCBubyBvZiBiaXNlczogIiArIG1OdW1CaXNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtQmlzZXMgPSBtTnVtQmlzZXMgKiBtTnVtU3ViR3JwczsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RCYXNlLnBvcHVsYXRlQmFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdEFkdmVydGlzZXIudXBkYXRlUEF3aXRoQmFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQklHIHRlcm1pbmF0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CSUdIYW5kbGUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2xlYW4gdXAgbUJpc0luZm8gTGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgbUJpc0luZm8uY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhSW5mby5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZST01fTkFUSVZFX0JST0FEQ0FTVF9BVURJT19TVEFURToKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZXZTdGF0ZSA9IG1Ccm9hZGNhc3RBdWRpb1N0YXRlOwotICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0QXVkaW9TdGF0ZSA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJldlN0YXRlICE9IG1Ccm9hZGNhc3RBdWRpb1N0YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0QXVkaW9TdGF0ZShtQnJvYWRjYXN0QXVkaW9TdGF0ZSwgcHJldlN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfRlJPTV9OQVRJVkVfQlJPQURDQVNUX0lEOgotICAgICAgICAgICAgICAgICAgIGlmIChtQnJvYWRjYXN0QWR2ZXJ0aXNlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RBZHZlcnRpc2VyLnN0YXJ0QnJvYWRjYXN0QWR2ZXJ0aXNpbmcoKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIkRpZCBub3QgcmVjZWl2ZSBhZGF0cGVyIHN0YXRlIGNoYW5nZSBpbnRlbnQsIHR1cm5pbmcgb2ZmIEJyb2FkY2FzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3N0YXRlID0gbUJyb2FkY2FzdFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdFN0YXRlKG1Ccm9hZGNhc3RTdGF0ZSwgcHJldl9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9CUk9BRENBU1RfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgIHByZXZfc3RhdGUgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFN0YXRlID0gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIk1TR19VUERBVEVfQlJPQURDQVNUX1NUQVRFIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdFN0YXRlKG1Ccm9hZGNhc3RTdGF0ZSwgcHJldl9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBMb2cuZShUQUcsInVua25vd24gbWVzc2FnZSBtc2cud2hhdCA9ICIgKyBtc2cud2hhdCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKFRBRywiRXhpdCBoYW5kbGVNZXNzYWdlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQnJvYWRjYXN0U3RhdGVUb0hmcChpbnQgc3RhdGUpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCJ1cGRhdGVCcm9hZGNhc3RTdGF0ZVRvSGZwIik7Ci0gICAgICAgIH0KLSAgICAgICAgSGVhZHNldFNlcnZpY2UgaGZwU2VydmljZSA9IEhlYWRzZXRTZXJ2aWNlLmdldEhlYWRzZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChoZnBTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhmcFNlcnZpY2UudXBkYXRlQnJvYWRjYXN0U3RhdGUoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3RTdGF0ZShpbnQgc3RhdGUsIGludCBwcmV2X3N0YXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkJyb2FkY2FzdGluZyBicm9hZGNhc3RTdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhCcm9hZGNhc3QuQUNUSU9OX0JST0FEQ0FTVF9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfUFJFVklPVVNfU1RBVEUsIHByZXZfc3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgc3RhdGUpOwotICAgICAgICBzZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0NPTk5FQ1QsIFV0aWxzLmdldFRlbXBBbGxvd2xpc3RCcm9hZGNhc3RPcHRpb25zKCkpOwotICAgICAgICB1cGRhdGVCcm9hZGNhc3RTdGF0ZVRvSGZwKHN0YXRlKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdENvZGVjQ29uZmlnKEJsdWV0b290aENvZGVjU3RhdHVzIGNvZGVjU3RhdHVzKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkJyb2FjYXN0aW5nIGJyb2FkY2FzdENvZGVjQ29uZmlnIiArIGNvZGVjU3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhBMmRwLkFDVElPTl9DT0RFQ19DT05GSUdfQ0hBTkdFRCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhDb2RlY1N0YXR1cy5FWFRSQV9DT0RFQ19TVEFUVVMsIGNvZGVjU3RhdHVzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1Ccm9hZGNhc3REZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIC8vc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9DT05ORUNUKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RW5jcnlwdGlvbmtleVNldCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYnJvYWRjYXN0RW5jcnlwdGlvbmtleVNldCIpOwotICAgICAgICB9Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aEJyb2FkY2FzdC5BQ1RJT05fQlJPQURDQVNUX0VOQ1JZUFRJT05fS0VZX0dFTkVSQVRFRCk7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfSU5DTFVERV9CQUNLR1JPVU5EKTsKLSAgICAgICAgc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9DT05ORUNULCBVdGlscy5nZXRUZW1wQWxsb3dsaXN0QnJvYWRjYXN0T3B0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0QXVkaW9TdGF0ZShpbnQgbmV3U3RhdGUsIGludCBwcmV2U3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYnJvYWRjYXN0QXVkaW9TdGF0ZTogU3RhdGU6IiArIGF1ZGlvU3RhdGVUb1N0cmluZyhwcmV2U3RhdGUpCi0gICAgICAgICAgICAgICAgKyAiLT4iICsgYXVkaW9TdGF0ZVRvU3RyaW5nKG5ld1N0YXRlKSk7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aEJyb2FkY2FzdC5BQ1RJT05fQlJPQURDQVNUX0FVRElPX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgcHJldlN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIG5ld1N0YXRlKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7Ci0gICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQ09OTkVDVCwgVXRpbHMuZ2V0VGVtcEFsbG93bGlzdEJyb2FkY2FzdE9wdGlvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGF1ZGlvU3RhdGVUb1N0cmluZyhpbnQgc3RhdGUpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlBMQVlJTkciOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfTk9UX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJOT1RfUExBWUlORyI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHN0YXRlKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBib29sZWFuIElzQ29kZWNDb25maWdDaGFuZ2VkKEJsdWV0b290aENvZGVjQ29uZmlnIGNvbmZpZykgewotICAgICAgICByZXR1cm4gKG1Db2RlY0NvbmZpZy5nZXRTYW1wbGVSYXRlKCkgIT0gY29uZmlnLmdldFNhbXBsZVJhdGUoKSB8fAotICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZy5nZXRDaGFubmVsTW9kZSgpICE9IGNvbmZpZy5nZXRDaGFubmVsTW9kZSgpIHx8Ci0gICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMxKCkgIT0gY29uZmlnLmdldENvZGVjU3BlY2lmaWMxKCkgfHwKLSAgICAgICAgICAgICAgICBtQ29kZWNDb25maWcuZ2V0Q29kZWNTcGVjaWZpYzIoKSAhPSBjb25maWcuZ2V0Q29kZWNTcGVjaWZpYzIoKSk7Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvZGVjVmFsaWQoQmx1ZXRvb3RoQ29kZWNDb25maWcgbUNvZGVjQ29uZmlnKSB7Ci0gICAgICAgIGlmIChtQ29kZWNDb25maWcuZ2V0Q29kZWNUeXBlKCkgIT0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU09VUkNFX0NPREVDX1RZUEVfTEMzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29kZWNDb25maWdWYWxpZChTdHJpbmcgY29uZmlnX2lkKSB7Ci0gICAgICAgIGlmIChicm9hZGNhc3Rfc3VwcG9ydGVkX2NvbmZpZy5jb250YWlucyhjb25maWdfaWQpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsImlzQ29kZWNDb25maWdWYWxpZDogY29uZmlnIHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCJpc0NvZGVjQ29uZmlnVmFsaWQ6IGNvbmZpZyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmNyeXRpb25MZW5ndGhWYWxpZChpbnQgZW5jX2xlbmd0aCkgewotICAgICAgICBpZiAoZW5jX2xlbmd0aCA9PSA0IHx8IGVuY19sZW5ndGggPT0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aENvZGVjQ29uZmlnIGJ1aWxkQ29kZWNDb25maWcoU3RyaW5nIGNvbmZpZ19pZCwgaW50IGNoYW5uZWwpIHsKLSAgICAgICAgLy9CbHVldG9vdGhDb2RlY0NvbmZpZyBjYzsKLSAgICAgICAgaW50IGluZGV4ID0gYnJvYWRjYXN0X3N1cHBvcnRlZF9jb25maWcuaW5kZXhPZihjb25maWdfaWQpOwotICAgICAgICBpbnQgc3I7Ci0gICAgICAgIGxvbmcgY29kZWNzcGVjaWZpYzEsIGNvZGVjc3BlY2lmaWMyOwotICAgICAgICBTdHJpbmcgaXNNb25vID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3QudmVuZG9yLmJ0c3RhY2suZW5hYmxlLmJyb2FkY2FzdF9tb25vIik7Ci0gICAgICAgIExvZy5kKFRBRywiYnVpbGRDb2RlY0NvbmZpZzoiICsgY29uZmlnX2lkICsgIiBpbmRleDogIiArIGluZGV4KTsKLSAgICAgICAgc3dpdGNoKGluZGV4KSB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8vMTZfMgotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMTYwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDE7Ly8zMmticHMKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IC8vMjRfMgotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMjQwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDI7Ly80OGticHMKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IC8vNDhfMQotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDQ7Ly84MGticHMKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMiA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6IC8vNDhfMgotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDQ7Ly84MGticHMKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IC8vNDhfMwotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDY7Ly85NmticHMKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMiA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6IC8vNDhfNAotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDY7Ly85NmticHMKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY6IC8vNDhfNQotICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgLy9jaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDc7Ly8xMjRrYnBzCi0gICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzIgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OiAvLzQ4XzYKLSAgICAgICAgICAgICAgICBzciA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFXzQ4MDAwOwotICAgICAgICAgICAgICAgIC8vY2hfbW9kZSA9IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzEgPSAxMDA3Oy8vMTI0a2JwcwotICAgICAgICAgICAgICAgIGNvZGVjc3BlY2lmaWMyID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzciA9IEJsdWV0b290aENvZGVjQ29uZmlnLlNBTVBMRV9SQVRFXzQ4MDAwOwotICAgICAgICAgICAgICAgIC8vY2hfbW9kZSA9IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzEgPSAxMDA3Oy8vODBrYnBzCi0gICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzIgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAvL2lmIChpc01vbm8uaXNFbXB0eSgpIHx8IGlzTW9uby5lcXVhbHMoIm1vbm8iKSkgewotICAgICAgICAvLyAgICBjaF9tb2RlID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICAgIC8vfQotICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZyBjYyA9IG5ldyBCbHVldG9vdGhDb2RlY0NvbmZpZyhCbHVldG9vdGhDb2RlY0NvbmZpZy5TT1VSQ0VfQ09ERUNfVFlQRV9MQzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnLkNPREVDX1BSSU9SSVRZX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyLCBCbHVldG9vdGhDb2RlY0NvbmZpZy5CSVRTX1BFUl9TQU1QTEVfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIGNvZGVjc3BlY2lmaWMxLCBjb2RlY3NwZWNpZmljMiwgMCwgMCk7Ci0gICAgICAgIHJldHVybiBjYzsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0QnJvYWRjYXN0U2VydmljZShCcm9hZGNhc3RTZXJ2aWNlIGluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNldEJyb2FkY2FzdFNlcnZpY2UoKTogc2V0IHRvOiAiICsgaW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNCcm9hZGNhc3RTZXJ2aWNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBfYnJvYWRjYXN0KCkgewotICAgICAgICBpZiAoREJHKSBMb2cuZCAoVEFHLCAiY2xlYW51cF9icm9hZGNhc3QiKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQnJvYWRjYXN0TG9jaykgewotICAgICAgICAgICAgaWYgKG1Jc0FkdmVydGlzaW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ccm9hZGNhc3ROYXRpdmVJbnRlcmZhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5kaXNhYmxlQnJvYWRjYXN0KG1BZHZlcnRpc2luZ1NldC5nZXRBZHZlcnRpc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdEFkdmVydGlzZXIuc3RvcEJyb2FkY2FzdEFkdmVydGlzaW5nKCk7Ci0gICAgICAgICAgICAgICAgaW50IHByZXZfc3RhdGUgPSBtQnJvYWRjYXN0U3RhdGU7Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdFN0YXRlID0gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgIGJyb2FkY2FzdFN0YXRlKG1Ccm9hZGNhc3RTdGF0ZSwgcHJldl9zdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gRW5hYmxlQnJvYWRjYXN0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAoREJHKSBMb2cuZCAoVEFHLCAiRW5hYmxlQnJvYWRjYXN0Iik7Ci0KLSAgICAgICAgaWYgKG1Ccm9hZGNhc3RTdGF0ZSAhPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0VOQUJMRV9CUk9BRENBU1QpOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gRGlzYWJsZUJyb2FkY2FzdChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywgIkRpc2FibGVCcm9hZGNhc3Q6IHN0YXRlICIgKyBtQnJvYWRjYXN0U3RhdGUpOwotCi0gICAgICAgIGlmIChtQnJvYWRjYXN0U3RhdGUgPT0gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0RJU0FCTElORyB8fAotICAgICAgICAgICAgbUJyb2FkY2FzdFN0YXRlID09IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9ESVNBQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAobUJyb2FkY2FzdFN0YXRlICE9IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9FTkFCTEVEICYmCi0gICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgIT0gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX1NUUkVBTUlORykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCJCcm9hZGNhc3QgaXMgbm90IGVuYWJsZWQgeWV0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19ESVNBQkxFX0JST0FEQ0FTVCk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwdWJsaWMgYm9vbGVhbiBTZXRFbmNyeXB0aW9uKGJvb2xlYW4gZW5hYmxlLCBpbnQgZW5jX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlX2V4aXN0aW5nLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywiU2V0RW5jcnlwdGlvbiIpOwotCi0gICAgICAgIG1FbmNyeXB0aW9uRW5hYmxlZCA9IGVuYWJsZTsKLSAgICAgICAgaWYgKGVuYWJsZSkgewotICAgICAgICAgICAgaWYgKCFpc0VuY3J5dGlvbkxlbmd0aFZhbGlkKGVuY19sZW4pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywiU2V0RW5jcnlwdGlvbjogaW52YWxpZCBlbmNyeXRpb24gbGVuZ3RoIHJlcXVlc3RlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywiU2VsZWN0ZWQgdW5lbmNyeXB0ZWQiKTsKLSAgICAgICAgICAgIGVuY19sZW4gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdXNlX2V4aXN0aW5nKSB7Ci0gICAgICAgICAgICBMb2cuZCAoVEFHLCJHZW5lcmF0ZSBuZXcgZWNyeXRwaW9uIGtleSBvZiBsZW5naHQgPSAiICsgZW5jX2xlbik7Ci0gICAgICAgICAgICBtRW5jcnlwdGlvbkxlbmd0aCA9IGVuY19sZW47Ci0gICAgICAgICAgICBpZiAobUJyb2FkY2FzdFN0YXRlID09IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9FTkFCTEVEIHx8Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdFN0YXRlID09IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9TVFJFQU1JTkcpIHsKLSAgICAgICAgICAgICAgICBtRW5jS2V5UmVmcmVzaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1JFU0VUX0VOQ1JZUFRJT05fRkxBR19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX0VOQ1JZUFRJT05fS0VZKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBHZXRFbmNyeXB0aW9uS2V5KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAoREJHKSBMb2cuZCAoVEFHLCJHZXRCcm9hZGNhc3RFbmNyeXB0aW9uS2V5OiBwYWNrYWdlIG5hbWUgPSAiICsgcGFja2FnZU5hbWUpOwotCi0gICAgICAgIHJldHVybiBCaWdCcm9hZGNhc3RDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgR2V0QnJvYWRjYXN0U3RhdHVzKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAoREJHKSBMb2cuZCAoVEFHLCJHZXRCcm9hZGNhc3RTdGF0dXM6IHN0YXRlID0gIiArIG1Ccm9hZGNhc3RTdGF0ZSArICIgcGFja2FnZSBuYW1lID0gIiArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgcmV0dXJuIG1Ccm9hZGNhc3RTdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb2FkY2FzdEFjdGl2ZSgpIHsKLSAgICAgICAgaWYgKG1Ccm9hZGNhc3REZXZpY2VJc0FjdGl2ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgTG9nLmQgKFRBRywiaXNCcm9hZGNhc3RBY3RpdmU6IEJyb2FkY2FzdCBpcyB0dXJuZWQgdG8gb2ZmIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywiaXNCcm9hZGNhc3RBY3RpdmUiKTsKLSAgICAgICAgcmV0dXJuICgobUJyb2FkY2FzdFN0YXRlID09IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9FTkFCTEVEKSB8fAotICAgICAgICAgICAgICAgKG1Ccm9hZGNhc3RTdGF0ZSA9PSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfU1RSRUFNSU5HKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJsdWV0b290aERldmljZSBnZXRCcm9hZGNhc3REZXZpY2UoKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kIChUQUcsImdldEJyb2FkY2FzdERldmljZSIpOwotICAgICAgICByZXR1cm4gbUJyb2FkY2FzdERldmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJyb2FkY2FzdEFkZHJlc3MoKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kIChUQUcsImdldEJyb2FkY2FzdEFkZHJlc3MiKTsKLSAgICAgICAgcmV0dXJuIG1Ccm9hZGNhc3RBZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0QnJvYWRjYXN0SWQoKSB7Ci0gICAgICAgIExvZy5kKFRBRywiZ2V0QnJvYWRjYXN0SWQ6ICIgKyBtQnJvYWRjYXN0SUQpOwotICAgICAgICByZXR1cm4gbUJyb2FkY2FzdElEOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvYWRjYXN0U3RyZWFtaW5nRW5jcnlwdGVkKCkgewotICAgICAgICByZXR1cm4gbUVuY3J5cHRpb25FbmFibGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvYWRjYXN0U3RyZWFtaW5nKCkgewotICAgICAgICByZXR1cm4gKG1Ccm9hZGNhc3RTdGF0ZSA9PSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfU1RSRUFNSU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIEJyb2FkY2FzdEdldEFkdkFkZHJlc3MoKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kIChUQUcsIkJyb2FkY2FzdEdldEFkdkFkZHJlc3M6ICIgKyBtQWR2QWRkcmVzcyk7Ci0gICAgICAgIHJldHVybiBtQWR2QWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bVN1Ykdyb3VwcygpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywiZ2V0TnVtU3ViR3JvdXBzOiAiICsgbU51bVN1YkdycHMpOwotICAgICAgICByZXR1cm4gbU51bVN1YkdycHM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBCcm9hZGNhc3RHZXRBZHZBZGRyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BZHZBZGRyZXNzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IEJyb2FkY2F0R2V0QWR2SGFuZGxlKCkgewotICAgICAgICAvL2NoZWNrIGlmIGFkdmVydGlzaW5nCi0gICAgICAgIHJldHVybiBtQWR2ZXJ0aXNpbmdTZXQuZ2V0QWR2ZXJ0aXNlcklkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBCcm9hZGNhc3RHZXRBZHZJbnRlcnZhbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYUludDsKLSAgICB9Ci0gICAgcHVibGljIExpc3Q8QmlzSW5mbz4gQnJvYWRjYXN0R2V0QmlzSW5mbygpIHsKLSAgICAgICAgaWYgKGlzQnJvYWRjYXN0U3RyZWFtaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtQmlzSW5mbzsKLSAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsIkJyb2FkY2FzdEdldEJpc0luZm86IEJyb2FkY2FzdCBpcyBub3QgYWN0aXZlIik7Ci0gICAgICAgIHJldHVybiBtQmlzSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPEludGVnZXIsIE1ldGFkYXRhTHR2PiBCcm9hZGNhc3RHZXRNZXRhSW5mbygpIHsKLSAgICAgICAgaWYgKGlzQnJvYWRjYXN0U3RyZWFtaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWV0YUluZm87Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCJCcm9hZGNhc3RHZXRNZXRhSW5mbzogQnJvYWRjYXN0IGlzIG5vdCBhY3RpdmUiKTsKLSAgICAgICAgcmV0dXJuIG1NZXRhSW5mbzsKLSAgICB9Ci0gICAgcHVibGljIGJ5dGVbXSBCcm9hZGNhc3RHZXRNZXRhZGF0YSgpIHsKLSAgICAgICAgaWYgKGlzQnJvYWRjYXN0U3RyZWFtaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnJvYWRjYXN0QmFzZS5nZXRNZXRhZGF0YUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsIkJyb2FkY2FzdEdldE1ldGFkYXRhOiBCcm9hZGNhc3QgaXMgbm90IGFjdGl2ZSIpOwotICAgICAgICByZXR1cm4gbUJyb2FkY2FzdEJhc2UuZ2V0TWV0YWRhdGFDb250ZXh0KCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldENvZGVjUHJlZmVyZW5jZShTdHJpbmcgY29uZmlnX2lkLCBpbnQgY2hfbW9kZSkgewotICAgICAgICBpZiAoaXNDb2RlY0NvbmZpZ1ZhbGlkKGNvbmZpZ19pZCkpIHsKLSAgICAgICAgICAgIHNldENvZGVjUHJlZmVyZW5jZShidWlsZENvZGVjQ29uZmlnKGNvbmZpZ19pZCwgY2hfbW9kZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldENvZGVjUHJlZmVyZW5jZShCbHVldG9vdGhDb2RlY0NvbmZpZyBuZXdDb25maWcpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywgInNldENvZGVjUHJlZmVyZW5jZSIpOwotICAgICAgICBpZiAobmV3Q29uZmlnLmdldENvZGVjVHlwZSgpICE9IEJsdWV0b290aENvZGVjQ29uZmlnLlNPVVJDRV9DT0RFQ19UWVBFX0xDMykgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0Q29kZWNQcmVmZXJlbmNlOiBJbnZhbGlkIGNvZGVjIGZvciBicm9hZGNhc3QgbW9kZTogIiArIG5ld0NvbmZpZy5nZXRDb2RlY1R5cGUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy9tQnJvYWRjYXN0Q29kZWNDb25maWcudXBkYXRlQ29kZWNDb25maWcobmV3Q29uZmlnKTsKLSAgICAgICAgaWYgKG1Ccm9hZGNhc3RTdGF0ZSAhPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQpCi0gICAgICAgICAgICBtQnJvYWRjYXN0TmF0aXZlSW50ZXJmYWNlLnNldENvZGVjQ29uZmlnUHJlZmVyZW5jZShtQWR2ZXJ0aXNpbmdTZXQuZ2V0QWR2ZXJ0aXNlcklkKCksbmV3Q29uZmlnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBHZXRFbmNyeXB0aW9uS2V5RnJvbU5hdGl2ZSgpIHsKLSAgICAgICAgTG9nLmUoVEFHLCJHZXRFbmNyeXB0aW9uS2V5RnJvbU5hdGl2ZSIpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0dFVF9FTkNSWVBUSU9OX0tFWSk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXR1cF9pc29kYXRhcGF0aChpbnQgYWR2X2lkLCBpbnQgYmlnX2hhbmRsZSxpbnQgbnVtX2Jpc2VzLCBpbnRbXSBiaXNlcykgewotICAgIH0KLSAgICAvKiBMRSBIQVAgYnJvYWRjYXN0IGhvb2tzICovCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRIQVBCcm9hZGNhc3QoKSB7Ci0gICAgICAgIGlmIChpc0Jyb2FkY2FzdEFjdGl2ZSgpKSB7Ci0gICAgICAgIC8vVE9ETzogdXBkYXRlIGNvZGVjIGNvbmZpZyB3aXRoIEhBUCBIUSBtb2RlCi0gICAgICAgIC8vVGVybWluYXRlIEJJRyBpZiBjcmVhdGVkCi0gICAgICAgIC8vTm90aWZ5IGNvZGVjIGNvbmZpZyBjaGFuZ2UgdG8gc3RhY2sKLSAgICAgICAgLy9DcmVhdGUgQklHIGFuZCB1cGRhdGUgQkFTRQotICAgICAgICB9IGVsc2UgewotICAgICAgICAvL1RPRE86IHVwZGF0ZSBjb2RlYyBjb25maWcgd2l0aCBIQVAgSFEgbW9kZQotICAgICAgICAvL1N0YXJ0IEFkdgotICAgICAgICAvL0V4aXN0aW5nIGVuY3J5cHRpb24ga2V5IHdpbGwgYmUgdXNlZCBmb3IgSEFQIGFzIG9ubHkgbXVzaWMgc3RyZWFtaW5nIGlzIHN1cHBvcnRlZAotICAgICAgICAvL0Fubm91bmNlbWVudCBjb250ZW50IHR5cGUgd2lsbCBub3QgYmUgY292ZXJlZAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wSEFQQnJvYWRjYXN0KCkgewotICAgICAgICAvL1RPRE86IERpc2FibGVBdWRpb1BhdGgKLSAgICAgICAgLy9UZXJtaW5hdGUgQklHCi0gICAgICAgIC8vdXBkYXRlIHN0YXRlIHRvIGRpc2FibGluZwotICAgICAgICAvL3N0b3AgQWR2Ci0gICAgICAgIC8vcmVzZXQgY29kZWMgY29uZmlnIHRvIGRlZmF1bHQgY29uZmlnCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVEZXZpY2UoKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kIChUQUcsInJlbW92ZUFjdGl2ZURldmljZSIpOwotICAgICAgICAvL2ludCBbXSBiaXNfaGFuZGxlcyA9IHstMSwgLTF9OwotICAgICAgICBpZiAobUJyb2FkY2FzdERldmljZUlzQWN0aXZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZCAoVEFHLCJyZW1vdmVBY3RpdmVEZXZpY2U6IG1CQURldmljZUlzQWN0aXZlIGlzIGZhbHNlLCBhbHJlYWR5IHJlbW92ZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQnJvYWRjYXN0RGV2aWNlSXNBY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQnJvYWRjYXN0TG9jaykgewotICAgICAgICAgICAgaWYgKG1Jc0FkdmVydGlzaW5nICYmCi0gICAgICAgICAgICAgICAobUJyb2FkY2FzdFN0YXRlID09IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9FTkFCTEVEIHx8Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdFN0YXRlID09IEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9TVFJFQU1JTkcpKSB7Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5kaXNhYmxlQnJvYWRjYXN0KG1BZHZlcnRpc2luZ1NldC5nZXRBZHZlcnRpc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgLy9tQnJvYWRjYXN0QWR2ZXJ0aXNlci5zdG9wQnJvYWRjYXN0QWR2ZXJ0aXNpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5zZXRBY3RpdmVEZXZpY2UoZmFsc2UsIG1BZHZlcnRpc2luZ1NldC5nZXRBZHZlcnRpc2VySWQoKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlNldEFjdGl2ZU5hdGl2ZSBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL25vdGlmeUJyb2FkY2FzdEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCbHVldG9vdGhDb2RlY1N0YXR1cyBnZXRDb2RlY1N0YXR1cygpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywiZ2V0Q29kZWNTdGF0dXMiKTsKLSAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBtQnJvYWRjYXN0Q29kZWNDb25maWcgPSB7bUNvZGVjQ29uZmlnfTsKLSAgICAgICAgcmV0dXJuIChuZXcgQmx1ZXRvb3RoQ29kZWNTdGF0dXMobUNvZGVjQ29uZmlnLCBtQnJvYWRjYXN0Q29kZWNDb25maWcsIG1Ccm9hZGNhc3RDb2RlY0NvbmZpZykpOwotICAgIH0KLSAgICBwdWJsaWMgaW50IHNldEFjdGl2ZURldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kIChUQUcsInNldEFjdGl2ZURldmljZSIpOwotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlbW92ZUFjdGl2ZURldmljZSgpOwotICAgICAgICAgICAgcmV0dXJuIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlLlNIT19TVUNDRVNTOwotICAgICAgICB9Ci0gICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMoZGV2aWNlLCBtQnJvYWRjYXN0RGV2aWNlKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCJzZXRBY3RpdmVEZXZpY2U6IE5vdCBhIEJyb2FkY2FzdCBkZXZpY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5TSE9fRkFJTEVEOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUJyb2FkY2FzdE5hdGl2ZUludGVyZmFjZS5zZXRBY3RpdmVEZXZpY2UodHJ1ZSwgbUFkdmVydGlzaW5nU2V0LmdldEFkdmVydGlzZXJJZCgpKSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCJTZXRBY3RpdmVOYXRpdmUgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UuU0hPX0ZBSUxFRDsKLSAgICAgICAgfQotICAgICAgICBtQnJvYWRjYXN0RGV2aWNlSXNBY3RpdmUgPSB0cnVlOwotCi0gICAgICAgIHJldHVybiBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5TSE9fU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlCcm9hZGNhc3RFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAoREJHKSBMb2cuZCAoVEFHLCJub3RpZnlCcm9hZGNhc3RFbmFibGVkOiAiICsgZW5hYmxlZCk7Ci0gICAgICAgIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIGFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgaWYoYWN0aXZlRGV2aWNlTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsIkFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG5vdCBzdGFydGVkLiBSZXR1cm4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlZCkKLSAgICAgICAgICAgIGFjdGl2ZURldmljZU1hbmFnZXIuZW5hYmxlQnJvYWRjYXN0KG1Ccm9hZGNhc3REZXZpY2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhY3RpdmVEZXZpY2VNYW5hZ2VyLmRpc2FibGVCcm9hZGNhc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVNZXRhZGF0YUZyb21BdnJjcChNZWRpYU1ldGFkYXRhIGRhdGEpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQgKFRBRywidXBkYXRlTWV0YWRhdGFGcm9tQXZyY3AiKTsKLSAgICAgICAgbVRyYWNrTWV0YWRhdGEgPSBuZXcgVHJhY2tNZXRhZGF0YShkYXRhKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgbWVzc2FnZUZyb21OYXRpdmUoQnJvYWRjYXN0U3RhY2tFdmVudCBldmVudCkgewotICAgICAgICBpZiAoREJHKSBMb2cuZCAoVEFHLCJtZXNzYWdlRnJvbU5hdGl2ZTogZXZlbnQgIiArIGV2ZW50KTsKLSAgICAgICAgc3dpdGNoKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQnJvYWRjYXN0U3RhY2tFdmVudC5FVkVOVF9UWVBFX0JST0FEQ0FTVF9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRlJPTV9OQVRJVkVfQlJPQURDQVNUX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC52YWx1ZUludCwgZXZlbnQuYWR2SGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9CUk9BRENBU1RfQVVESU9fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZST01fTkFUSVZFX0JST0FEQ0FTVF9BVURJT19TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWVJbnQsIGV2ZW50LmFkdkhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCcm9hZGNhc3RTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19GUk9NX05BVElWRV9DT0RFQ19TVEFURSk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBldmVudC5jb2RlY1N0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9FTkNfS0VZX0dFTkVSQVRFRDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZST01fTkFUSVZFX0VOQ1JZUFRJT05fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IGV2ZW50LmtleTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJyb2FkY2FzdFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9TRVRVUF9CSUc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtQklHSGFuZGxlID0gIGV2ZW50LmJpZ0hhbmRsZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnZhbHVlSW50ID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtQmlzZXMgPSBldmVudC5OdW1CaXNlczsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRlJPTV9OQVRJVkVfU0VUVVBfQklHLGV2ZW50LnZhbHVlSW50LCBldmVudC5hZHZIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQnJvYWRjYXN0U3RhY2tFdmVudC5FVkVOVF9UWVBFX0JST0FEQ0FTVF9JRF9HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19GUk9NX05BVElWRV9CUk9BRENBU1RfSUQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Ccm9hZGNhc3RJZExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdElEW2ldID0gKGJ5dGUpZXZlbnQuQnJvYWRjYXN0SWRbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJtQnJvYWRjYXN0SURbIitpKyJdIiArICIgPSAiICsgbUJyb2FkY2FzdElEW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIExvZy5lIChUQUcsIm1lc3NhZ2VGcm9tTmF0aXZlOiBJbnZhbGlkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY2xhc3MgVHJhY2tNZXRhZGF0YSB7Ci0gICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotICAgICBwcml2YXRlIFN0cmluZyBhcnRpc3ROYW1lOwotICAgICBwcml2YXRlIFN0cmluZyBhbGJ1bU5hbWU7Ci0gICAgIHByaXZhdGUgU3RyaW5nIGdlbnJlOwotICAgICBwcml2YXRlIGxvbmcgcGxheWluZ1RpbWVNczsKLQotICAgICAgICAgcHVibGljIFRyYWNrTWV0YWRhdGEoTWVkaWFNZXRhZGF0YSBkYXRhKSB7Ci0gICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgIGFydGlzdE5hbWUgPSBzdHJpbmdPckJsYW5rKGRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCkpOwotICAgICAgICAgICAgIGFsYnVtTmFtZSA9IHN0cmluZ09yQmxhbmsoZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQUxCVU0pKTsKLSAgICAgICAgICAgICB0aXRsZSA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKTsKLSAgICAgICAgICAgICBnZW5yZSA9IHN0cmluZ09yQmxhbmsoZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfR0VOUkUpKTsKLSAgICAgICAgICAgICBwbGF5aW5nVGltZU1zID0gZGF0YS5nZXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZ09yQmxhbmsoU3RyaW5nIHMpIHsKLSAgICAgICAgICAgIHJldHVybiBzID09IG51bGwgPyBuZXcgU3RyaW5nKCkgOiBzOwotICAgICAgICAgfQotICAgIH0KLSAgICBjbGFzcyBCcm9hZGNhc3RBZHZlcnRpc2VyIHsKLSAgICAgIHB1YmxpYyBCcm9hZGNhc3RBZHZlcnRpc2VyKCkgewotICAgICAgICAgIExvZy5pKFRBRywiQnJvYWRjYXN0QWR2ZXJ0aXNlciIpOwotICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBCcm9hZGNhc3RBZHZlcnRpc2VyQ2FsbGJhY2soKTsKLSAgICAgICAgICBtQWR2ZXJ0aXNlciA9IG1CbHVldG9vdGhBZGFwdGVyLmdldEJsdWV0b290aExlQWR2ZXJ0aXNlcigpOwotICAgICAgICAgIGlmIChtQWR2ZXJ0aXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIExvZy5lKFRBRywgIkJyb2FkY2FzdEFkdmVydGlzZXI6IG1BZHZlcnRpc2VyIGlzIG51bGwiKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCBzdGFydEJyb2FkY2FzdEFkdmVydGlzaW5nKCkgewotICAgICAgICAgIExvZy5pKFRBRywic3RhcnRCcm9hZGNhc3RBZHZlcnRpc2luZyIpOwotICAgICAgICAgIGlmIChtQWR2ZXJ0aXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIExvZy5lKFRBRywic3RhcnRCcm9hZGNhc3RBZHZlcnRpc2luZzogQWR2ZXJ0aXNlciBpcyBudWxsIik7Ci0gICAgICAgICAgICAgIGludCBwcmV2X3N0YXRlID0gbUJyb2FkY2FzdFN0YXRlOwotICAgICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgICAgICAgIGJyb2FkY2FzdFN0YXRlKG1Ccm9hZGNhc3RTdGF0ZSwgcHJldl9zdGF0ZSk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQWR2ZXJ0aXNpbmdTZXRQYXJhbWV0ZXJzLkJ1aWxkZXIgYWR2X3BhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWR2ZXJ0aXNpbmdTZXRQYXJhbWV0ZXJzLkJ1aWxkZXIoKTsKLSAgICAgICAgICBhZHZfcGFyYW0uc2V0TGVnYWN5TW9kZShmYWxzZSk7Ci0gICAgICAgICAgYWR2X3BhcmFtLnNldENvbm5lY3RhYmxlKGZhbHNlKTsKLSAgICAgICAgICBhZHZfcGFyYW0uc2V0U2Nhbm5hYmxlKGZhbHNlKTsKLSAgICAgICAgICBhZHZfcGFyYW0uc2V0SW50ZXJ2YWwoQWR2ZXJ0aXNpbmdTZXRQYXJhbWV0ZXJzLklOVEVSVkFMX01JTik7IC8vMTAwbXNlYwotICAgICAgICAgIGFkdl9wYXJhbS5zZXRUeFBvd2VyTGV2ZWwobVR4UG93ZXJMZXZlbCk7Ci0gICAgICAgICAgYWR2X3BhcmFtLnNldFByaW1hcnlQaHkoMSk7Ci0gICAgICAgICAgYWR2X3BhcmFtLnNldFNlY29uZGFyeVBoeShtU2VjUGh5KTsKLSAgICAgICAgICBBZHZlcnRpc2VEYXRhIEFkdkRhdGEgPSBuZXcgQWR2ZXJ0aXNlRGF0YS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluY2x1ZGVEZXZpY2VOYW1lKHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRTZXJ2aWNlRGF0YShuZXcgUGFyY2VsVXVpZChCUk9BRENBU1RfQVVESU9fVVVJRCksIG1Ccm9hZGNhc3RJRCkuYnVpbGQoKTsKLSAgICAgICAgICBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycy5CdWlsZGVyIHBlcmlvZGljX3BhcmFtID0gbmV3IFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzLkJ1aWxkZXIoKTsKLSAgICAgICAgICBwZXJpb2RpY19wYXJhbS5zZXRJbmNsdWRlVHhQb3dlcih0cnVlKTsKLSAgICAgICAgICBwZXJpb2RpY19wYXJhbS5zZXRJbnRlcnZhbChtUGFJbnQpOwotICAgICAgICAgIEFkdmVydGlzZURhdGEgUGVyaW9kaWNEYXRhID0gbmV3IEFkdmVydGlzZURhdGEuQnVpbGRlcigpLmFkZFNlcnZpY2VEYXRhKG5ldyBQYXJjZWxVdWlkKEJBU0lDX0FVRElPX1VVSUQpLCBuZXcgYnl0ZVswXSkuYnVpbGQoKTsKLSAgICAgICAgICBMb2cuaShUQUcsIkNhbGxpbmcgc3RhcnRBZHZlcnRpc2luZ1NldCIpOwotICAgICAgICAgIG1BZHZlcnRpc2VyLnN0YXJ0QWR2ZXJ0aXNpbmdTZXQoYWR2X3BhcmFtLmJ1aWxkKCksIEFkdkRhdGEsIG51bGwsIHBlcmlvZGljX3BhcmFtLmJ1aWxkKCksIFBlcmlvZGljRGF0YSwgMCwgMCwgbUNhbGxiYWNrKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHN0b3BCcm9hZGNhc3RBZHZlcnRpc2luZygpIHsKLSAgICAgICAgICBMb2cuaShUQUcsInN0b3BCcm9hZGNhc3RBZHZlcnRpc2luZyIpOwotICAgICAgICAgIGlmIChtQWR2ZXJ0aXNlciAhPSBudWxsKQotICAgICAgICAgICAgICBtQWR2ZXJ0aXNlci5zdG9wQWR2ZXJ0aXNpbmdTZXQobUNhbGxiYWNrKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgdXBkYXRlUEF3aXRoQmFzZSgpIHsKLSAgICAgICAgICBMb2cuaShUQUcsInVwZGF0ZVBBd2l0aEJhc2UiKTsKLSAgICAgICAgICBBZHZlcnRpc2VEYXRhIFBlcmlvZGljRGF0YSA9IG5ldyBBZHZlcnRpc2VEYXRhLkJ1aWxkZXIoKS5hZGRTZXJ2aWNlRGF0YShuZXcgUGFyY2VsVXVpZChCQVNJQ19BVURJT19VVUlEKSwgbUJyb2FkY2FzdEJhc2UuZ2V0QnJvYWRjYXN0QmFzZUluZm8oKSkuYnVpbGQoKTsKLSAgICAgICAgICBtQWR2ZXJ0aXNpbmdTZXQuc2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGEoUGVyaW9kaWNEYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEJyb2FkY2FzdEFkdmVydGlzZXJDYWxsYmFjayBleHRlbmRzIEFkdmVydGlzaW5nU2V0Q2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoQWR2ZXJ0aXNpbmdTZXQgYWR2ZXJ0aXNpbmdTZXQsIGludCB0eFBvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJvbkFkdmVydGlzaW5nU2V0U3RhcnRlZCBzdGF0dXMgIiArIHN0YXR1cwotICAgICAgICAgICAgICAgICArICIgYWR2ZXJ0aXNpbmdTZXQ6ICIgKyBhZHZlcnRpc2luZ1NldCArICIgdHhQb3dlciAiICsgdHhQb3dlcik7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCJGYWlsZWQgdG8gc3RhcnQgQnJvYWRjYXN0IEFkdmVydGlzZW1lbnQiKTsKLSAgICAgICAgICAgICAgICBpbnQgcHJldl9zdGF0ZSA9IG1Ccm9hZGNhc3RTdGF0ZTsKLSAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0U3RhdGUobUJyb2FkY2FzdFN0YXRlLHByZXZfc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCbHVldG9vdGhHYXR0LkdBVFRfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIG1BZHZlcnRpc2luZ1NldCA9IGFkdmVydGlzaW5nU2V0OwotICAgICAgICAgICAgICAgIG1Jc0FkdmVydGlzaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpbnQgcHJldl9zdGF0ZSA9IG1Ccm9hZGNhc3RTdGF0ZTsKLSAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIm9uQWR2ZXJ0aXNpbmdTZXRTdGFydGVkOiBhZHZfaWQgPSAiICsgYWR2ZXJ0aXNpbmdTZXQuZ2V0QWR2ZXJ0aXNlcklkKCkgKyAiY29waWVkIGlkID0gIiArIG1BZHZlcnRpc2luZ1NldC5nZXRBZHZlcnRpc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0U3RhdGUobUJyb2FkY2FzdFN0YXRlLHByZXZfc3RhdGUpOwotICAgICAgICAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfUkVTRVRfRU5DUllQVElPTl9GTEFHX1RJTUVPVVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9CUk9BRENBU1RfQUNUSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZyw2MDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUJyb2FkY2FzdEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBtQ2hNb2RlID0gbUNvZGVjQ29uZmlnLmdldENoYW5uZWxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChtQ2hNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX0pPSU5UX1NURVJFTzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1CaXNlcyA9IDEgKiBtTnVtU3ViR3JwczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtQmlzZXMgPSAyICogbU51bVN1YkdycHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywiY2hhbm5lbCBtb2RlIHVua25vd24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdEJhc2UucG9wdWxhdGVCYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJyb2FkY2FzdEFkdmVydGlzZXIudXBkYXRlUEF3aXRoQmFzZSgpOwotICAgICAgICAgICAgICAgIG1BZHZlcnRpc2luZ1NldC5nZXRPd25BZGRyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25BZHZlcnRpc2luZ1NldFN0b3BwZWQoQWR2ZXJ0aXNpbmdTZXQgYWR2ZXJ0aXNpbmdTZXQpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIm9uQWR2ZXJ0aXNpbmdTZXRTdG9wcGVkIGFkdmVydGlzaW5nU2V0OiAiICsgYWR2ZXJ0aXNpbmdTZXQpOwotICAgICAgICAgICAgbUlzQWR2ZXJ0aXNpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBwcmV2X3N0YXRlID0gbUJyb2FkY2FzdFN0YXRlOwotICAgICAgICAgICAgaWYgKCFnb2luZ0Rvd24gJiYgbUJyb2FkY2FzdERldmljZUlzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJvbkFkdmVydGlzaW5nU2V0U3RvcHBlZDogVW5leHBlY3RlZCBCcm9hZGNhc3QgdHVybiBvZmYiKTsKLSAgICAgICAgICAgICAgICBub3RpZnlCcm9hZGNhc3RFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnb2luZ0Rvd24pIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9CUk9BRENBU1RfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0RJU0FCTElORyk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZyw1MDApOwotICAgICAgICAgICAgICAgIGdvaW5nRG93biA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnJvYWRjYXN0U3RhdGUgPSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0U3RhdGUobUJyb2FkY2FzdFN0YXRlLCBwcmV2X3N0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkFkdmVydGlzaW5nRW5hYmxlZChBZHZlcnRpc2luZ1NldCBhZHZlcnRpc2luZ1NldCwgYm9vbGVhbiBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIm9uQWR2ZXJ0aXNpbmdFbmFibGVkIGFkdmVydGlzaW5nU2V0OiAiICsgYWR2ZXJ0aXNpbmdTZXQKLSAgICAgICAgICAgICAgICAgICAgKyAiIHN0YXR1cyAiICsgc3RhdHVzICsgIiBlbmFibGU6ICIgKyBlbmFibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQWR2ZXJ0aXNpbmdEYXRhU2V0KEFkdmVydGlzaW5nU2V0IGFkdmVydGlzaW5nU2V0LCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJvbkFkdmVydGlzaW5nRGF0YVNldCBhZHZlcnRpc2luZ1NldDogIiArIGFkdmVydGlzaW5nU2V0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBzdGF0dXMgIiArIHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsdWV0b290aEdhdHQuR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAib25BZHZlcnRpc2luZ0RhdGFTZXQ6IEJhc2UgSW5mbyB1cGRhdGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZChBZHZlcnRpc2luZ1NldCBhZHZlcnRpc2luZ1NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eFBvd2VyLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJvbkFkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQgIGFkdmVydGlzaW5nU2V0OiAiICsgYWR2ZXJ0aXNpbmdTZXQKLSAgICAgICAgICAgICAgICAgICAgKyAiIHN0YXR1cyAiICsgc3RhdHVzICArICIgdHhQb3dlciAiICsgdHhQb3dlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Pd25BZGRyZXNzUmVhZChBZHZlcnRpc2luZ1NldCBhZHZlcnRpc2luZ1NldCwgaW50IGFkZHJlc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJvbk93bkFkZHJlc3NSZWFkIGFkdmVydGlzaW5nU2V0OiAiICsgYWR2ZXJ0aXNpbmdTZXQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGFkZHJlc3MgIiArIGFkZHJlc3MgKyAiIGFkZHJlc3NUeXBlICIgKyBhZGRyZXNzVHlwZSk7Ci0gICAgICAgICAgICBtQWR2QWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgICAgICBtQWR2QWRkcmVzc1R5cGUgPSBhZGRyZXNzVHlwZTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGNsYXNzIEJyb2FkY2FzdEJhc2UgewotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBMQzNfU0FNUExFX1JBVEVfODAwMCA9IDB4MDE7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IExDM19TQU1QTEVfUkFURV8xNjAwMCA9IDB4MDI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IExDM19TQU1QTEVfUkFURV8yNDAwMCA9IDB4MDM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IExDM19TQU1QTEVfUkFURV8zMjAwMCA9IDB4MDQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IExDM19TQU1QTEVfUkFURV80NDEwMCA9IDB4MDU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IExDM19TQU1QTEVfUkFURV80ODAwMCA9IDB4MDY7Ci0KLSAgICAgICAgaW50IHByZXNlbnRhdGlvbkRlbGF5ID0gMHgwMDlDNDA7Ci0gICAgICAgIGJ5dGUgW10gbVByZXNlbnRhdGlvbkRlbGF5ID0gbmV3IGJ5dGVbM107Ci0gICAgICAgIGJ5dGUgW10gbUNvZGVjSWQgPSBuZXcgYnl0ZVs1XTsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY0xlbmd0aCA9IG5ldyBieXRlWzFdOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljU2FtcGxlUmF0ZSA9IG5ldyBieXRlWzNdOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbiA9IG5ldyBieXRlWzNdOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbiA9IG5ldyBieXRlWzZdOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUgPSBuZXcgYnl0ZVszXTsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY0Jsb2Nrc1BlclNkdSA9IG5ldyBieXRlWzNdOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljTGVuZ3RoTDIgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGVMMiA9IG5ldyBieXRlWzNdOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbkwyID0gbmV3IGJ5dGVbM107Ci0gICAgICAgIGJ5dGUgW10gbUNvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uTDIgPSBuZXcgYnl0ZVs2XTsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lTDIgPSBuZXcgYnl0ZVszXTsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY0Jsb2Nrc1BlclNkdUwyID0gbmV3IGJ5dGVbM107Ci0gICAgICAgIGJ5dGUgW10gbU1ldGFkYXRhTGVuZ3RoID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgIGJ5dGUgW10gbU1ldGFkYXRhQ29udGV4dCA9IG5ldyBieXRlWzNdOwotICAgICAgICBieXRlIFtdIG1OdW1TdWJncm91cHMgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgYnl0ZSBbXSBtTDJDb2RlY0lEID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgIGJ5dGUgW10gbUwyQ29kZWNTcGVjaWZpY0xlbmd0aCA9IG5ldyBieXRlWzFdOwotICAgICAgICBieXRlIFtdIG1MMm1NZXRhZGF0YUxlbmd0aCA9IG5ldyBieXRlWzFdOwotICAgICAgICBieXRlIFtdIG1MMk51bUJpc2VzID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgIGJ5dGUgW10gbUwyQmlzSW5kaWNlcyA9IG5ldyBieXRlWzJdOwotICAgICAgICBieXRlIFtdIG1MM0Jpc0luZGV4ID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgIGJ5dGUgW10gbUwzQ29kZWNTcGVjaWZpY0xlbmd0aCA9IG5ldyBieXRlWzFdOwotICAgICAgICBieXRlIFtdIG1MM0NvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uID0gbmV3IGJ5dGVbNl07Ci0gICAgICAgIGJ5dGUgbVNhbXBsZVJhdGVMZW5ndGggPSAyOwotICAgICAgICBieXRlIG1TYW1wbGVSYXRlVHlwZSA9IDB4MDE7Ci0gICAgICAgIGJ5dGUgbUZyYW1lRHVyYXRpb25MZW5ndGggPSAyOwotICAgICAgICBieXRlIG1GcmFtZUR1cmF0aW9uVHlwZSA9IDB4MDI7Ci0gICAgICAgIGJ5dGUgbUZyYW1lRHVyYXRpb25fN181ID0gMHgwMDsvLzcuNSBtc2VjCi0gICAgICAgIGJ5dGUgbUZyYW1lRHVyYXRpb25fMTAgPSAweDAxOy8vMTBtc2VjCi0gICAgICAgIGJ5dGUgbUF1ZGlvTG9jYXRpb25MZW5ndGggPSA1OwotICAgICAgICBieXRlIG1BdWRpb0xvY2F0aW9uVHlwZSA9IDB4MDM7Ci0gICAgICAgIGJ5dGUgbUF1ZGlvTG9jYXRpb25MZWZ0ID0gMHgwMTsKLSAgICAgICAgYnl0ZSBtQXVkaW9Mb2NhdGlvblJpZ2h0ID0gMHgwMjsKLSAgICAgICAgYnl0ZSBtQXVkaW9Mb2NhdGlvbkNlbnRyZSA9IDB4MDQ7Ci0gICAgICAgIGJ5dGUgbU9jdGV0c1BlckZyYW1lTGVuZ3RoID0gMzsKLSAgICAgICAgYnl0ZSBtT2N0ZXN0UGVyRnJhbWVUeXBlID0gMHgwNDsKLSAgICAgICAgYnl0ZSBtQmxvY2tzUGVyU2R1TGVuZ3RoID0gMjsKLSAgICAgICAgYnl0ZSBtQmxvY2tzUGVyU2R1VHlwZSA9IDB4MDU7Ci0gICAgICAgIGxvbmcgTEMzX0NPREVDX0lEX09MRCA9IDB4MDAwMDAwMDAwMTsKLSAgICAgICAgbG9uZyBMQzNfQ09ERUNfSUQgPSAweDAwMDAwMDAwMDY7Ci0gICAgICAgIGJ5dGUgbUNvZGVjQ29uZmlnTGVuZ3RoID0gMHgxMDsgLy90byBiZSBjaGFuZ2VkCi0gICAgICAgIGJ5dGUgbU1lZGlhQ29udGV4dFR5cGUgPSAweDEwOwotICAgICAgICBieXRlIFtdIEJyb2FkY2FzdEJhc2VBcnJheSA9IG51bGw7Ci0gICAgICAgIC8vTWV0YWRhdGEgQUQgdHlwZQotICAgICAgICAvL01ldGFkYXRhCi0gICAgICBwdWJsaWMgQnJvYWRjYXN0QmFzZSgpIHsKLSAgICAgICAgICAvL21jY2lkID0gMDsKLSAgICAgICAgICAvL2ludCBwcmVzZW50YXRpb25EZWxheSA9IDB4MDAwMDE0OwotICAgICAgICAgIGlmIChtUEQgPT0gMjApIHsKLSAgICAgICAgICAgICAgTG9nLmQoVEFHLCJQcmVzZW50YXRpb24gRGVsYXkgaXMgc2V0IHRvIDIwbXNlYyIpOwotICAgICAgICAgICAgICBwcmVzZW50YXRpb25EZWxheSA9IDB4MDA0RTIwOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobU5ld1ZlcnNpb24pIHsKLSAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRlbGF5ID0gaW50VG9ieXRlQXJyYXkocHJlc2VudGF0aW9uRGVsYXksIDMpOwotICAgICAgICAgICAgICBtTnVtU3ViZ3JvdXBzWzBdID0gKGJ5dGUpbU51bVN1YkdycHM7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRlbGF5ID0gaW50VG9ieXRlQXJyYXkocHJlc2VudGF0aW9uRGVsYXksIDMpOwotICAgICAgICAgICAgICBpZiAobmV3X2NvZGVjX2lkKSB7Ci0gICAgICAgICAgICAgICAgICBtQ29kZWNJZCA9IGxvbmdUb2J5dGVBcnJheShMQzNfQ09ERUNfSUQsNSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBtQ29kZWNJZCA9IGxvbmdUb2J5dGVBcnJheShMQzNfQ09ERUNfSURfT0xELDUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljTGVuZ3RoWzBdID0gbUNvZGVjQ29uZmlnTGVuZ3RoOwotICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGUgPSB1cGRhdGVTYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbiA9IHVwZGF0ZUZyYW1lRHVyYXRpb24oKTsKLSAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uID0gdXBkYXRlQXVkaW9Mb2NhdGlvbigwKTsKLSAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSA9IHVwZGF0ZU9jdGV0c1BlckZyYW1lKCk7Ci0gICAgICAgICAgICAgIG1NZXRhZGF0YUxlbmd0aFswXSA9IChieXRlKTB4MDM7Ci0gICAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgIG1NZXRhZGF0YUNvbnRleHRbaW5kZXgrK10gPSAoYnl0ZSkweDAyOyAvL2xlbmd0aAotICAgICAgICAgICAgICBtTWV0YWRhdGFDb250ZXh0W2luZGV4KytdID0gKGJ5dGUpbU1lZGlhQ29udGV4dFR5cGU7IC8vVHlwZQotICAgICAgICAgICAgICBtTWV0YWRhdGFDb250ZXh0W2luZGV4KytdID0gKGJ5dGUpMHgwMTsgLy9WYWx1ZSBNdXNpYwotICAgICAgICAgICAgICBtTnVtU3ViZ3JvdXBzWzBdID0gKGJ5dGUpbU51bVN1YkdycHM7IC8vIG9ubHkgb25lIHNldCBvZiBicm9hZGNhc3QgaXMgc3VwcG9ydGVkLgotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHB1YmxpYyBieXRlIFtdIGdldEJyb2FkY2FzdEJhc2VJbmZvKCkgewotICAgICAgICAgIHJldHVybiBCcm9hZGNhc3RCYXNlQXJyYXk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCB1cGRhdGVCSUdoYW5kbGUoaW50IGhhbmRsZSkgewotICAgICAgICAgIG1CSUdIYW5kbGUgPSBoYW5kbGU7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBieXRlW10gZ2V0TWV0YWRhdGFDb250ZXh0KCkgewotICAgICAgICAgIHJldHVybiBtTWV0YWRhdGFDb250ZXh0OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgaW50IGdldE51bVN1Ykdyb3VwcygpIHsKLSAgICAgICAgICByZXR1cm4gbU51bVN1Ymdyb3Vwc1swXTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBieXRlIFtdIHVwZGF0ZVNhbXBsZVJhdGUoKSB7Ci0gICAgICAgICAgaW50IFNSID0gbUNvZGVjQ29uZmlnLmdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICBieXRlIGJ5dGV2YWx1ZTsKLSAgICAgICAgICBzd2l0Y2ggKFNSKSB7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMHgwNjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDQxMDA6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDc7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMHgwNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMzIwMDA6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMHgwNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMjQwMDA6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMHgwMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMHgwMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfODAwMDoKLSAgICAgICAgICAgICAgICBieXRldmFsdWUgPSAoYnl0ZSkweDAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChtTmV3VmVyc2lvbikgewotICAgICAgICAgICAgICAgICAgICBieXRldmFsdWUgPSAoYnl0ZSkweDA4OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBieXRlIFtdIGx0diA9IHttU2FtcGxlUmF0ZUxlbmd0aCwgbVNhbXBsZVJhdGVUeXBlLCBieXRldmFsdWV9OwotICAgICAgICAgIHJldHVybiBsdHY7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgYnl0ZVtdIHVwZGF0ZU9jdGV0c1BlckZyYW1lKCkgewotICAgICAgICAgIGxvbmcgYml0cmF0ZSA9IChpbnQpIG1Db2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMSgpOwotICAgICAgICAgIGxvbmcgZnJhbWVEdXJhdGlvbiA9IChpbnQpIG1Db2RlY0NvbmZpZy5nZXRDb2RlY1NwZWNpZmljMigpOwotICAgICAgICAgIGJ5dGUgYnl0ZXZhbHVlOwotICAgICAgICAgIC8vVXBkYXRlIE9jdGV0c1BlckZyYW1lIGJhc2VkIG9uIGZyYW1lIGR1cmF0aW9uCi0gICAgICAgICAgc3dpdGNoICgoaW50KWJpdHJhdGUpIHsKLSAgICAgICAgICAgICAgY2FzZSAxMDAxOgotICAgICAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID09IDApIHsgLy83LjVtc2VjCi0gICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMzA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8xMG1zZWMKLSAgICAgICAgICAgICAgICAgICBieXRldmFsdWUgPSAoYnl0ZSk0MDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgMTAwMjoKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTQ1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTYwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAxMDA0OgotICAgICAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpNzU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMTAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAxMDA2OgotICAgICAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpOTA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMTIwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAxMDA3OgotICAgICAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMTE3OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTE1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMTAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBMb2cuZChUQUcsInVwZGF0ZU9jdGV0c1BlckZyYW1lOiAiICsgYnl0ZXZhbHVlKTsKLSAgICAgICAgICBieXRlIFtdIGx0diA9IHttT2N0ZXRzUGVyRnJhbWVMZW5ndGgsIG1PY3Rlc3RQZXJGcmFtZVR5cGUsIGJ5dGV2YWx1ZSwgMHgwMH07Ci0gICAgICAgICAgcmV0dXJuIGx0djsKLSAgICAgIH0KLSAgICAgIHByaXZhdGUgYnl0ZVtdIHVwZGF0ZUJsb2Nrc1BlclNkdSgpIHsKLSAgICAgICAgICBieXRlW10gbHR2ID0ge21CbG9ja3NQZXJTZHVMZW5ndGgsIG1CbG9ja3NQZXJTZHVUeXBlLDB4MDF9OwotICAgICAgICAgIHJldHVybiBsdHY7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBieXRlIFtdIHVwZGF0ZUhBUFNhbXBsZVJhdGUoKSB7Ci0gICAgICAgICAgaW50IFNSID0gbUNvZGVjQ29uZmlnLmdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICBieXRlIGJ5dGV2YWx1ZTsKLSAgICAgICAgICBzd2l0Y2ggKFNSKSB7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpMHgwMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV8yNDAwMDoKLSAgICAgICAgICAgICAgICBieXRldmFsdWUgPSAoYnl0ZSkweDAzOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTB4MDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJ5dGVbXSBsdHYgPSB7bVNhbXBsZVJhdGVMZW5ndGgsIG1TYW1wbGVSYXRlVHlwZSwgYnl0ZXZhbHVlfTsKLSAgICAgICAgICByZXR1cm4gbHR2OwotICAgICAgfQotICAgICAgcHVibGljIGJ5dGUgW10gdXBkYXRlSGFwT2N0ZXRzUGVyRnJhbWUoKSB7Ci0gICAgICAgICAgbG9uZyBiaXRyYXRlID0gbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMxKCk7Ci0gICAgICAgICAgbG9uZyBmcmFtZUR1cmF0aW9uID0gKGludCkgbUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMyKCk7Ci0gICAgICAgICAgYnl0ZSBieXRldmFsdWU7Ci0gICAgICAgICAgLy9VcGRhdGUgT2N0ZXRzUGVyRnJhbWUgYmFzZWQgb24gZnJhbWUgZHVyYXRpb24KLSAgICAgICAgICBzd2l0Y2goKGludCliaXRyYXRlKSB7Ci0gICAgICAgICAgICAgIGNhc2UgMTAwMToKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVEdXJhdGlvbiA9PSAwKSB7IC8vNy41bXNlYwotICAgICAgICAgICAgICAgICAgIGJ5dGV2YWx1ZSA9IChieXRlKTMwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vMTBtc2VjCi0gICAgICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpNDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDEwMDI6Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBieXRldmFsdWUgPSAoYnl0ZSk0NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBieXRldmFsdWUgPSAoYnl0ZSk2MDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnl0ZXZhbHVlID0gKGJ5dGUpNDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJ5dGUgW10gbHR2ID0ge21PY3RldHNQZXJGcmFtZUxlbmd0aCwgbU9jdGVzdFBlckZyYW1lVHlwZSwgYnl0ZXZhbHVlLCAweDAwfTsKLSAgICAgICAgICByZXR1cm4gbHR2OwotICAgICAgfQotICAgICAgcHVibGljIGJ5dGUgW10gdXBkYXRlQXVkaW9Mb2NhdGlvbihpbnQgYmlzX2luZGV4KSB7Ci0gICAgICAgICAgaW50IGNoX21vZGUgPSBtQ29kZWNDb25maWcuZ2V0Q2hhbm5lbE1vZGUoKTsKLSAgICAgICAgICBieXRlIGNoID0gMDsKLSAgICAgICAgICBpZiAoYmlzX2luZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgLy8gc3RlcmVvCi0gICAgICAgICAgICAgIGlmIChjaF9tb2RlID09IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU8gfHwKLSAgICAgICAgICAgICAgICAgIGNoX21vZGUgPT0gQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX0pPSU5UX1NURVJFTykKLSAgICAgICAgICAgICAgICAgIGNoID0gKGJ5dGUpMHgwMzsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoY2hfbW9kZSA9PSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfTU9OTykKLSAgICAgICAgICAgICAgICAgIGNoID0gKGJ5dGUpMHgwMDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoY2hfbW9kZSA9PSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgICAgICAgICAgICAgICBpbnQgYmlzZXMgPSAobU51bUJpc2VzLygoaW50KW1OdW1TdWJncm91cHNbMF0pKTsKLSAgICAgICAgICAgICAgICAgIGNoID0gKGJ5dGUpKG1BdWRpb0xvY2F0aW9uUmlnaHQgLSAoYmlzX2luZGV4ICUgYmlzZXMpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaF9tb2RlID09IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICAgIGNoID0gKGJ5dGUpMHgwMzsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaF9tb2RlID09IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9NT05PKSB7Ci0gICAgICAgICAgICAgICAgICBjaCA9IChieXRlKTB4MDA7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnl0ZSBbXSBsb2MgPSB7bUF1ZGlvTG9jYXRpb25MZW5ndGgsIG1BdWRpb0xvY2F0aW9uVHlwZSwgY2gsIDB4MDAsIDB4MDAsIDB4MDB9OwotICAgICAgICAgIHJldHVybiBsb2M7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgYnl0ZVtdIHVwZGF0ZUZyYW1lRHVyYXRpb24oKSB7Ci0gICAgICAgICAgYnl0ZSBtRkQgPSBtRnJhbWVEdXJhdGlvbl8xMDsKLSAgICAgICAgICBpZiAobUNvZGVjQ29uZmlnLmdldENvZGVjU3BlY2lmaWMyKCkgPT0gMCkgewotICAgICAgICAgICAgICBMb2cuZChUQUcsInVwZGF0ZUZyYW1lRHVyYXRpb246IDcuNW1zZWMiKTsKLSAgICAgICAgICAgICAgbUZEID0gbUZyYW1lRHVyYXRpb25fN181OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIExvZy5kKFRBRywidXBkYXRlRnJhbWVEdXJhdGlvbjogMTAgbXNlYyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBieXRlW10gbHR2ID0ge21GcmFtZUR1cmF0aW9uTGVuZ3RoLG1GcmFtZUR1cmF0aW9uVHlwZSxtRkR9OwotICAgICAgICAgIHJldHVybiBsdHY7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgYnl0ZVtdIGludFRvYnl0ZUFycmF5KGludCBpbnRWYWx1ZSwgaW50IGJ5dGVsZW4pIHsKLSAgICAgICAgICBieXRlIFtdIHZhbCA9IG5ldyBieXRlW2J5dGVsZW5dOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZWxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgIHZhbFsoYnl0ZWxlbiAtIDEpIC1pXSA9IChieXRlKSgoaW50VmFsdWUgPj4gKDggKihieXRlbGVuIC0gKGkgKyAxKSkpKSAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gdmFsOwotICAgICAgfQotICAgICAgcHVibGljIGJ5dGUgW10gbG9uZ1RvYnl0ZUFycmF5KGxvbmcgbG9uZ1ZhbHVlLCBpbnQgYnl0ZWxlbikgewotICAgICAgICAgIGJ5dGUgW10gdmFsID0gbmV3IGJ5dGVbYnl0ZWxlbl07Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgdmFsWyhieXRlbGVuIC0gMSkgLWldID0gKGJ5dGUpKChsb25nVmFsdWUgPj4gKDggKihieXRlbGVuIC0gKGkgKyAxKSkpKSAmIDB4MDAwMDAwMDAwMDAwMDBGRik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgaW50IGNhbGN1bGF0ZUJpc1Blckdyb3VwKCkgewotICAgICAgICAgIGludCBtQ2hNb2RlID0gbUNvZGVjQ29uZmlnLmdldENoYW5uZWxNb2RlKCk7Ci0gICAgICAgICAgaW50IG51bWJpcyA9IDI7Ci0gICAgICAgICAgc3dpdGNoIChtQ2hNb2RlKSB7Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX0pPSU5UX1NURVJFTzoKLSAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiQmlzUGVyR3JvdXAgaXMgMSIpOwotICAgICAgICAgICAgICAgICAgbnVtYmlzID0gMTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIkJpc1Blckdyb3VwIGlzIDIiKTsKLSAgICAgICAgICAgICAgICAgIG51bWJpcyA9IDI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywiY2hhbm5lbCBtb2RlIHVua25vd24iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bWJpczsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQmFzZSgpIHsKLSAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsInBvcHVsYXRlQmFzZSIpOwotICAgICAgICAgIGJ5dGUgW10gYmFzZUwxID0gcG9wdWxhdGVfbGV2ZWwxX2Jhc2UoKTsKLSAgICAgICAgICBieXRlIFtdIGJhc2VMMiA9IHBvcHVsYXRlX2xldmVsMl9iYXNlKCk7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIEJ5dGVTdHIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgQnl0ZVN0ci53cml0ZShiYXNlTDEsIDAsIGJhc2VMMS5sZW5ndGgpOwotICAgICAgICAgIEJ5dGVTdHIud3JpdGUoYmFzZUwyLCAwLCBiYXNlTDIubGVuZ3RoKTsKLSAgICAgICAgICBpZiAoIW1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgIGJ5dGUgW10gYmFzZUwzID0gcG9wdWxhdGVfbGV2ZWwzX2Jhc2UoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShiYXNlTDMsIDAsIGJhc2VMMy5sZW5ndGgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBCcm9hZGNhc3RCYXNlQXJyYXkgPSBCeXRlU3RyLnRvQnl0ZUFycmF5KCk7Ci0gICAgICB9Ci0gICAgICBwcml2YXRlIGJ5dGUgW10gcG9wdWxhdGVfbGV2ZWwxX2Jhc2UoKSB7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIEJ5dGVTdHIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgaWYgKG1OZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EZWxheSA9IGludFRvYnl0ZUFycmF5KHByZXNlbnRhdGlvbkRlbGF5LCAzKTsKLSAgICAgICAgICAgICAgbU51bVN1Ymdyb3Vwc1swXSA9IChieXRlKW1OdW1TdWJHcnBzOy8vY2FsY3VsYXRlIGJhc2VkIG9uIG51bSBiaXNlcyBhbmQgY2hhbm5lbCBtb2RlCi0gICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobVByZXNlbnRhdGlvbkRlbGF5LCAwLCBtUHJlc2VudGF0aW9uRGVsYXkubGVuZ3RoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtTnVtU3ViZ3JvdXBzLCAwLCBtTnVtU3ViZ3JvdXBzLmxlbmd0aCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRlbGF5ID0gaW50VG9ieXRlQXJyYXkocHJlc2VudGF0aW9uRGVsYXksIDMpOwotICAgICAgICAgICAgICBpZiAobmV3X2NvZGVjX2lkKSB7Ci0gICAgICAgICAgICAgICAgICBtQ29kZWNJZCA9IGxvbmdUb2J5dGVBcnJheShMQzNfQ09ERUNfSUQsNSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBtQ29kZWNJZCA9IGxvbmdUb2J5dGVBcnJheShMQzNfQ09ERUNfSURfT0xELDUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljTGVuZ3RoWzBdID0gbUNvZGVjQ29uZmlnTGVuZ3RoOwotICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGUgPSB1cGRhdGVTYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbiA9IHVwZGF0ZUZyYW1lRHVyYXRpb24oKTsKLSAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uID0gdXBkYXRlQXVkaW9Mb2NhdGlvbigwKTsKLSAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSA9IHVwZGF0ZU9jdGV0c1BlckZyYW1lKCk7Ci0gICAgICAgICAgICAgIG1NZXRhZGF0YUxlbmd0aFswXSA9IChieXRlKTB4MDM7Ci0gICAgICAgICAgICAgIGJ5dGUgW10gbWVkaWFjb250ZXh0ID0gezIsIG1NZWRpYUNvbnRleHRUeXBlLCAoYnl0ZSkweDAxfTsKLSAgICAgICAgICAgICAgbU51bVN1Ymdyb3Vwc1swXSA9IChieXRlKW1OdW1TdWJHcnBzOy8vY2FsY3VsYXRlIGJhc2VkIG9uIG51bSBiaXNlcyBhbmQgY2hhbm5lbCBtb2RlCi0KLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtUHJlc2VudGF0aW9uRGVsYXksIDAsIG1QcmVzZW50YXRpb25EZWxheS5sZW5ndGgpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY0lkLCAwLCBtQ29kZWNJZC5sZW5ndGgpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljTGVuZ3RoLCAwLCBtQ29kZWNTcGVjaWZpY0xlbmd0aC5sZW5ndGgpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljU2FtcGxlUmF0ZSwgMCwgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlLmxlbmd0aCk7Ci0gICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobUNvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLCAwLCBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb24ubGVuZ3RoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb24sIDAsIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbi5sZW5ndGgpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUsIDAsIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUubGVuZ3RoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtTWV0YWRhdGFMZW5ndGgsIDAsIG1NZXRhZGF0YUxlbmd0aC5sZW5ndGgpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1NZXRhZGF0YUNvbnRleHQsIDAsIG1NZXRhZGF0YUNvbnRleHQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtTnVtU3ViZ3JvdXBzLCAwLCBtTnVtU3ViZ3JvdXBzLmxlbmd0aCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBCeXRlU3RyLnRvQnl0ZUFycmF5KCk7Ci0gICAgICB9Ci0gICAgICBwcml2YXRlIGJ5dGUgW10gcG9wdWxhdGVfbGV2ZWwyX2Jhc2UoKSB7Ci0gICAgICAgICAgTG9nLmQoVEFHLCJwb3B1bGF0ZV9sZXZlbDJfYmFzZSwgc3ViZ3JvdXAgPSAiICsgbU51bVN1Ymdyb3Vwc1swXSk7Ci0gICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIEJ5dGVTdHIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgYnl0ZSBbXSBtZXRhbGVuZ3RoID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgaW50IGJpc1Blckdyb3VwID0gY2FsY3VsYXRlQmlzUGVyR3JvdXAoKTsvL21OdW1CaXNlcy9tTnVtU3ViR3JwczsKLSAgICAgICAgICBieXRlIFtdIG51bUJpc2VzID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgbnVtQmlzZXMgPSBpbnRUb2J5dGVBcnJheShiaXNQZXJHcm91cCwxKTsKLSAgICAgICAgICBieXRlIFtdIGJpc0luZCA9IG5ldyBieXRlW2Jpc1Blckdyb3VwXTsKLSAgICAgICAgICBpZiAobU5ld1ZlcnNpb24pIHsKLSAgICAgICAgICAgICAgYnl0ZVtdIG1jaWQgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgICAgaWYgKG5ld19jb2RlY19pZCkgewotICAgICAgICAgICAgICAgICAgbWNpZCA9IGxvbmdUb2J5dGVBcnJheShMQzNfQ09ERUNfSUQsNSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBtY2lkID0gbG9uZ1RvYnl0ZUFycmF5KExDM19DT0RFQ19JRF9PTEQsNSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbU1ldGFkYXRhTGVuZ3RoWzBdID0gKGJ5dGUpMHgwNDsKLSAgICAgICAgICAgICAgYnl0ZSBbXSBtZWRpYWNvbnRleHQgPSB7MywgMiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgwMH07Ci0gICAgICAgICAgICAgIGludCBjb2RlY0NvbmZpZ0xlbmd0aCA9IDB4MTM7Ci0gICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljTGVuZ3RoID0gaW50VG9ieXRlQXJyYXkoY29kZWNDb25maWdMZW5ndGgsIDEpOwotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TdWJncm91cHNbMF07IGkrKykgewotICAgICAgICAgICAgICAgICAgaWYgKG1QYXJ0aWFsU2ltdWxjYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAobU51bVN1Ymdyb3Vwc1swXSAvIDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy9IaWdoIHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShudW1CaXNlcywgMCwgbnVtQmlzZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtY2lkLCAwLCBtY2lkLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljU2FtcGxlUmF0ZSA9IHVwZGF0ZVNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uID0gdXBkYXRlRnJhbWVEdXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb24gPSB1cGRhdGVBdWRpb0xvY2F0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lID0gdXBkYXRlT2N0ZXRzUGVyRnJhbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHU9IHVwZGF0ZUJsb2Nrc1BlclNkdSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljTGVuZ3RoLCAwLCBtQ29kZWNTcGVjaWZpY0xlbmd0aC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljU2FtcGxlUmF0ZSwgMCwgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobUNvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLCAwLCBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb24ubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb24sIDAsIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUsIDAsIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY0Jsb2Nrc1BlclNkdSwgMCwgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHUubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtTWV0YWRhdGFMZW5ndGgsIDAsIG1NZXRhZGF0YUxlbmd0aC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1lZGlhY29udGV4dCwgMCwgbWVkaWFjb250ZXh0Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsZXZlbDMgPSBwb3B1bGF0ZV9sZXZlbDNfbmV3X2Jhc2UoaSwgbWNpZCwgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljQmxvY2tzUGVyU2R1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobGV2ZWwzLCAwLCBsZXZlbDMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGFJbmZvLnB1dChpLG5ldyBNZXRhZGF0YUx0dihtZWRpYWNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIC8vTG93IHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShudW1CaXNlcywgMCwgbnVtQmlzZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtY2lkLCAwLCBtY2lkLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljU2FtcGxlUmF0ZUwyPSB1cGRhdGVIQVBTYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbkwyPSB1cGRhdGVGcmFtZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbkwyPSB1cGRhdGVBdWRpb0xvY2F0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lTDI9IHVwZGF0ZUhhcE9jdGV0c1BlckZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljQmxvY2tzUGVyU2R1TDI9IHVwZGF0ZUJsb2Nrc1BlclNkdSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljTGVuZ3RoLCAwLCBtQ29kZWNTcGVjaWZpY0xlbmd0aC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljU2FtcGxlUmF0ZUwyLCAwLCBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGVMMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbkwyLCAwLCBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb25MMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbkwyLCAwLCBtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb25MMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWVMMiwgMCwgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZUwyLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMiwgMCwgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1NZXRhZGF0YUxlbmd0aCwgMCwgbU1ldGFkYXRhTGVuZ3RoLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobWVkaWFjb250ZXh0LCAwLCBtZWRpYWNvbnRleHQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGxldmVsMyA9IHBvcHVsYXRlX2xldmVsM19uZXdfYmFzZShpLCBtY2lkLCBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGVMMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb25MMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lTDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYWNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKGxldmVsMywgMCwgbGV2ZWwzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhSW5mby5wdXQoaSxuZXcgTWV0YWRhdGFMdHYobWVkaWFjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG51bUJpc2VzLCAwLCBudW1CaXNlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobWNpZCwgMCwgbWNpZC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljTGVuZ3RoTDIgPSBpbnRUb2J5dGVBcnJheShjb2RlY0NvbmZpZ0xlbmd0aCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlTDIgPSB1cGRhdGVTYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uTDIgPSB1cGRhdGVGcmFtZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uTDIgPSB1cGRhdGVBdWRpb0xvY2F0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWVMMiA9IHVwZGF0ZU9jdGV0c1BlckZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMiA9IHVwZGF0ZUJsb2Nrc1BlclNkdSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY0xlbmd0aEwyLCAwLCBtQ29kZWNTcGVjaWZpY0xlbmd0aEwyLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGVMMiwgMCwgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlTDIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbkwyLCAwLCBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb25MMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobUNvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uTDIsIDAsIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbkwyLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lTDIsIDAsIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWVMMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMiwgMCwgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobU1ldGFkYXRhTGVuZ3RoLCAwLCBtTWV0YWRhdGFMZW5ndGgubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1lZGlhY29udGV4dCwgMCwgbWVkaWFjb250ZXh0Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGxldmVsMyA9IHBvcHVsYXRlX2xldmVsM19uZXdfYmFzZSgwLCBtY2lkLCBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGVMMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbkwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZUwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHVMMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShsZXZlbDMsIDAsIGxldmVsMy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIG1NZXRhSW5mby5wdXQoaSxuZXcgTWV0YWRhdGFMdHYobWVkaWFjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TdWJncm91cHNbMF07IGkrKykgewotICAgICAgICAgICAgICAgICAgaWYgKG1QYXJ0aWFsU2ltdWxjYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAobU51bVN1Ymdyb3Vwc1swXSAvIDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGlnaCBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBtY2lkID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1jaWQgPSBpbnRUb2J5dGVBcnJheSgweEZFLDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtTDJDb2RlY1NwZWNpZmljTGVuZ3RoID0gaW50VG9ieXRlQXJyYXkoMCwxKTsvLyhieXRlKSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1jaWQsIDAsIG1jaWQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtTDJDb2RlY1NwZWNpZmljTGVuZ3RoLCAwLCBtTDJDb2RlY1NwZWNpZmljTGVuZ3RoLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Mb3cgcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gbWNpZCA9IG5ldyBieXRlWzVdOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3X2NvZGVjX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2lkID0gbG9uZ1RvYnl0ZUFycmF5KExDM19DT0RFQ19JRCw1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jaWQgPSBsb25nVG9ieXRlQXJyYXkoTEMzX0NPREVDX0lEX09MRCw1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0xlbmd0aEwyID0gaW50VG9ieXRlQXJyYXkobUNvZGVjQ29uZmlnTGVuZ3RoLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlTDIgPSB1cGRhdGVIQVBTYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbkwyID0gdXBkYXRlRnJhbWVEdXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb25MMiA9IHVwZGF0ZUF1ZGlvTG9jYXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWVMMiA9IHVwZGF0ZUhhcE9jdGV0c1BlckZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUobWNpZCwgMCwgbWNpZC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKG1MMkNvZGVjU3BlY2lmaWNMZW5ndGgsIDAsIG1MMkNvZGVjU3BlY2lmaWNMZW5ndGgubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGVMMiwgMCwgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlTDIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb25MMiwgMCwgbUNvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uTDIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb25MMiwgMCwgbUNvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uTDIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lTDIsIDAsIG1Db2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWVMMi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBtZXRhbGVuZ3RoID0gaW50VG9ieXRlQXJyYXkoMCwgMSk7Ly8oYnl0ZSkwOwotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmlzUGVyR3JvdXA7aisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJpc0luZFtqXSA9IChieXRlKSgxICsgKGJpc1Blckdyb3VwICogaSkgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtZXRhbGVuZ3RoLCAwLCBtZXRhbGVuZ3RoLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShudW1CaXNlcywgMCwgbnVtQmlzZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKGJpc0luZCwgMCwgYmlzSW5kLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgW10gbWNpZCA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgICAgICAgICAgIG1jaWQgPSBpbnRUb2J5dGVBcnJheSgweEZFLDEpOy8vKGJ5dGUpMHhGRTsKLSAgICAgICAgICAgICAgICAgICAgICBtTDJDb2RlY1NwZWNpZmljTGVuZ3RoID0gaW50VG9ieXRlQXJyYXkoMCwxKTsvLyhieXRlKTA7Ci0gICAgICAgICAgICAgICAgICAgICAgbWV0YWxlbmd0aCA9IGludFRvYnl0ZUFycmF5KDAsMSk7Ly8oYnl0ZSkwOwotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmlzUGVyR3JvdXA7aisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJpc0luZFtqXSA9IChieXRlKSgxICsgKGJpc1Blckdyb3VwICogaSkgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtY2lkLCAwLCBtY2lkLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtTDJDb2RlY1NwZWNpZmljTGVuZ3RoLCAwLCBtTDJDb2RlY1NwZWNpZmljTGVuZ3RoLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShtZXRhbGVuZ3RoLCAwLCBtZXRhbGVuZ3RoLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShudW1CaXNlcywgMCwgbnVtQmlzZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKGJpc0luZCwgMCwgYmlzSW5kLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIEJ5dGVTdHIudG9CeXRlQXJyYXkoKTsKLSAgICAgIH0KLSAgICAgIHByaXZhdGUgYnl0ZVtdIHBvcHVsYXRlX2xldmVsM19iYXNlKCkgewotICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBCeXRlU3RyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bUJpc2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgYnl0ZVtdIGluZGV4ID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgICAgIGJ5dGUgW10gY29uZmlnbGVuZ3RoID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgICAgIGluZGV4WzBdID0gKGJ5dGUpKDEgKyBpKTsgLy9mZXRjaCBmcm9tIG1BZHZlcnRpc2luZ1NldAotICAgICAgICAgICAgICBjb25maWdsZW5ndGhbMF0gPSAoYnl0ZSk2OwotICAgICAgICAgICAgICBieXRlIFtdIGNvbmZpZyA9IHVwZGF0ZUF1ZGlvTG9jYXRpb24oaSsxKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShpbmRleCwgMCwgaW5kZXgubGVuZ3RoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShjb25maWdsZW5ndGgsMCwgY29uZmlnbGVuZ3RoLmxlbmd0aCk7Ci0gICAgICAgICAgICAgIEJ5dGVTdHIud3JpdGUoY29uZmlnLCAwLCBjb25maWcubGVuZ3RoKTsKLSAgICAgICAgICAgICAgbUJpc0luZm8uYWRkKG5ldyBCaXNJbmZvKChpbnQpaW5kZXhbMF0sIG1Db2RlY0lkLCBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGUsIG1Db2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSwgbU1ldGFkYXRhQ29udGV4dCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gQnl0ZVN0ci50b0J5dGVBcnJheSgpOwotICAgICAgfQotICAgICAgcHJpdmF0ZSBieXRlW10gcG9wdWxhdGVfbGV2ZWwzX25ld19iYXNlKGludCBzdWJHcm91cElkLCBieXRlW10gY29kZWNJZCwgYnl0ZVtdIFNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBmcmFtZUR1cmF0aW9uLCBieXRlW10gb2N0ZXRzUGVyRnJhbWUsIGJ5dGVbXSBCbG9ja3NQZXJTZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBtTWV0YWRhdGEpIHsKLSAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gQnl0ZVN0ciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICBpbnQgYmlzUGVyR3JvdXAgPSBjYWxjdWxhdGVCaXNQZXJHcm91cCgpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmlzUGVyR3JvdXA7IGkrKykgewotICAgICAgICAgICAgICBieXRlW10gaW5kZXggPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgICAgYnl0ZSBbXSBjb25maWdsZW5ndGggPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgICAgaW5kZXhbMF0gPSAoYnl0ZSkoMSArIGkgKyAoYmlzUGVyR3JvdXAgKiBzdWJHcm91cElkKSk7Ci0gICAgICAgICAgICAgIGNvbmZpZ2xlbmd0aFswXSA9IChieXRlKTY7Ci0gICAgICAgICAgICAgIGJ5dGUgW10gY29uZmlnID0gdXBkYXRlQXVkaW9Mb2NhdGlvbihpKzEpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKGluZGV4LCAwLCBpbmRleC5sZW5ndGgpOwotICAgICAgICAgICAgICBCeXRlU3RyLndyaXRlKGNvbmZpZ2xlbmd0aCwwLCBjb25maWdsZW5ndGgubGVuZ3RoKTsKLSAgICAgICAgICAgICAgQnl0ZVN0ci53cml0ZShjb25maWcsIDAsIGNvbmZpZy5sZW5ndGgpOwotICAgICAgICAgICAgICBtQmlzSW5mby5hZGQobmV3IEJpc0luZm8oKGludClpbmRleFswXSwgY29kZWNJZCwgU2FtcGxlUmF0ZSwgZnJhbWVEdXJhdGlvbiwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb2N0ZXRzUGVyRnJhbWUsIEJsb2Nrc1BlclNkdSwgbU1ldGFkYXRhLCBzdWJHcm91cElkKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBCeXRlU3RyLnRvQnl0ZUFycmF5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBjbGFzcyBCaXNJbmZvIHsKLSAgICAgICAgcHVibGljIGludCBCaXNJbmRleDsKLSAgICAgICAgcHVibGljIGJ5dGUgW10gbUNvZGVjSWQgPSBuZXcgYnl0ZVs1XTsKLSAgICAgICAgcHVibGljIENvZGVjQ29uZmlnTHR2IEJpc0NvZGVjQ29uZmlnOwotICAgICAgICBwdWJsaWMgTWV0YWRhdGFMdHYgQmlzTWV0YWRhdGE7Ci0gICAgICAgIHB1YmxpYyBpbnQgbVN1Ykdyb3VwSWQ7Ci0gICAgICAgIHB1YmxpYyBCaXNJbmZvKGludCBpbmRleCwgYnl0ZVtdIGNvZGVjSWQsIGJ5dGVbXSBDb2RlY1NwZWNpZmljU2FtcGxlUmF0ZSwgYnl0ZVtdIENvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb24sIGJ5dGVbXSBDb2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUsIGJ5dGVbXSBBdWRpb0NvbnRleHQpIHsKLSAgICAgICAgICAgIEJpc0luZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBtQ29kZWNJZCA9IGNvZGVjSWQ7Ci0gICAgICAgICAgICBCaXNDb2RlY0NvbmZpZyA9IG5ldyBDb2RlY0NvbmZpZ0x0dihDb2RlY1NwZWNpZmljU2FtcGxlUmF0ZSwgQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uLCBDb2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUpOwotICAgICAgICAgICAgQmlzTWV0YWRhdGEgPSBuZXcgTWV0YWRhdGFMdHYoQXVkaW9Db250ZXh0KTsKLSAgICAgICAgICAgIG1TdWJHcm91cElkID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIEJpc0luZm8gKGludCBpbmRleCwgYnl0ZVtdIGNvZGVjSWQsIGJ5dGVbXSBDb2RlY1NwZWNpZmljU2FtcGxlUmF0ZSwgYnl0ZVtdIENvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uLCBieXRlW10gQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHUsIGJ5dGVbXSBBdWRpb0NvbnRleHQsIGludCBzdWJHcm91cElkKSB7Ci0gICAgICAgICAgICAgQmlzSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICBtQ29kZWNJZCA9IGNvZGVjSWQ7Ci0gICAgICAgICAgICAgQmlzQ29kZWNDb25maWcgPSBuZXcgQ29kZWNDb25maWdMdHYoQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGUsIENvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb24sIENvZGVjU3BlY2lmaWNCbG9ja3NQZXJTZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NwZWNpZmljT2N0ZXRzUGVyRnJhbWUpOwotICAgICAgICAgICAgIEJpc01ldGFkYXRhID0gbmV3IE1ldGFkYXRhTHR2KEF1ZGlvQ29udGV4dCk7Ci0gICAgICAgICAgICAgbVN1Ykdyb3VwSWQgPSBzdWJHcm91cElkOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBjbGFzcyBDb2RlY0NvbmZpZ0x0dnsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGU7Ci0gICAgICAgIGJ5dGUgW10gbUNvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbjsKLSAgICAgICAgYnl0ZSBbXSBtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lOwotICAgICAgICBieXRlIFtdIG1Db2RlY1NwZWNpZmljQmxvY2tzUGVyU2R1OwotICAgICAgICBwdWJsaWMgQ29kZWNDb25maWdMdHYoYnl0ZVtdIENvZGVjU3BlY2lmaWNTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSkgewotICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlID0gQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGU7Ci0gICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb24gPSBDb2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbiA9IENvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uOwotICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSA9IENvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgQ29kZWNDb25maWdMdHYoYnl0ZVtdIENvZGVjU3BlY2lmaWNTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNGcmFtZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIENvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgW10gQ29kZWNTcGVjaWZpY0Jsb2Nrc1BlclNkdSkgewotICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNTYW1wbGVSYXRlID0gQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGU7Ci0gICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb24gPSBDb2RlY1NwZWNpZmljRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljQXVkaW9Mb2NhdGlvbiA9IENvZGVjU3BlY2lmaWNBdWRpb0xvY2F0aW9uOwotICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZSA9IENvZGVjU3BlY2lmaWNPY3RldHNQZXJGcmFtZTsKLSAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljQmxvY2tzUGVyU2R1ID0gQ29kZWNTcGVjaWZpY0Jsb2Nrc1BlclNkdTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheSgpIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShtQ29kZWNTcGVjaWZpY1NhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShtQ29kZWNTcGVjaWZpY0ZyYW1lRHVyYXRpb24pOwotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShtQ29kZWNTcGVjaWZpY0F1ZGlvTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShtQ29kZWNTcGVjaWZpY09jdGV0c1BlckZyYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobU5ld1ZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKG1Db2RlY1NwZWNpZmljQmxvY2tzUGVyU2R1KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0Qnl0ZXM6IGlvZXhjZXB0aW9uIGNhdWdodCEiICsgZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCApOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBjbGFzcyBNZXRhZGF0YUx0diB7Ci0gICAgICAgIGJ5dGVbXSBtQXVkaW9Db250ZXh0OwotICAgICAgICBwdWJsaWMgTWV0YWRhdGFMdHYoYnl0ZVtdIGF1ZGlvY29udGV4dCkgewotICAgICAgICAgICAgbUF1ZGlvQ29udGV4dCA9IGF1ZGlvY29udGV4dDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9Db250ZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIGNsYXNzIEJyb2FkY2FzdENvZGVjQ29uZmlnIHsKLSAgICAgICAgcHVibGljIEJyb2FkY2FzdENvZGVjQ29uZmlnKCkgewotICAgICAgICAvL0RlZmF1bHQgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgaW50IHNyLCBjaF9tb2RlOwotICAgICAgICAgICAgbG9uZyBjb2RlY3NwZWNpZmljMTsKLSAgICAgICAgICAgIHN3aXRjaChtQnJvYWRjYXN0Q29uZmlnU2V0dGluZ3MpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfMTYwMDA7Ci0gICAgICAgICAgICAgICAgICAgIGNoX21vZGUgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzEgPSAxMDAxOy8vMzJrYnBzCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgc3IgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV8xNjAwMDsKLSAgICAgICAgICAgICAgICAgICAgY2hfbW9kZSA9IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVjc3BlY2lmaWMxID0gMTAwMTsvLzMya2JwcwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgICAgIGNoX21vZGUgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzEgPSAxMDA0Oy8vODBrYnBzCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgc3IgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV80ODAwMDsKLSAgICAgICAgICAgICAgICAgICAgY2hfbW9kZSA9IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVjc3BlY2lmaWMxID0gMTAwNDsvLzgwa2JwcwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgICAgIGNoX21vZGUgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgY29kZWNzcGVjaWZpYzEgPSAxMDA2Oy8vOTZrYnBzCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgc3IgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV80ODAwMDsKLSAgICAgICAgICAgICAgICAgICAgY2hfbW9kZSA9IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVjc3BlY2lmaWMxID0gMTAwNjsvLzk2Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgICAgc3IgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV80ODAwMDsKLSAgICAgICAgICAgICAgICAgICAgY2hfbW9kZSA9IEJsdWV0b290aENvZGVjQ29uZmlnLkNIQU5ORUxfTU9ERV9NT05POwotICAgICAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDc7Ly8xMjQKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHNyID0gQmx1ZXRvb3RoQ29kZWNDb25maWcuU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICAgICAgICAgIGNoX21vZGUgPSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICBjb2RlY3NwZWNpZmljMSA9IDEwMDc7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29kZWNDb25maWcgPSBuZXcgQmx1ZXRvb3RoQ29kZWNDb25maWcoQmx1ZXRvb3RoQ29kZWNDb25maWcuU09VUkNFX0NPREVDX1RZUEVfTEMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnLkNPREVDX1BSSU9SSVRZX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3IsIEJsdWV0b290aENvZGVjQ29uZmlnLkJJVFNfUEVSX1NBTVBMRV8yNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9tb2RlLCBjb2RlY3NwZWNpZmljMSwgMSwgMCwgMCk7Ci0gICAgICAgICAgICBpZiAobVBhcnRpYWxTaW11bGNhc3QpIHsKLSAgICAgICAgICAgICAgICBtSGFwQ29kZWNDb25maWcgPSBuZXcgQmx1ZXRvb3RoQ29kZWNDb25maWcoQmx1ZXRvb3RoQ29kZWNDb25maWcuU09VUkNFX0NPREVDX1RZUEVfTEMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZy5DT0RFQ19QUklPUklUWV9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZy5TQU1QTEVfUkFURV8xNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ29kZWNDb25maWcuQklUU19QRVJfU0FNUExFXzI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLCAxLCAwLCAwKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJyb2FkY2FzdENvZGVjQ29uZmlnKEJsdWV0b290aENvZGVjQ29uZmlnIG5ld0NvbmZpZykgewotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAidXBkYXRlQnJvYWRjYXN0Q29kZWNDb25maWc6ICIgKyBuZXdDb25maWcpOwotICAgICAgICAgICAgbUNvZGVjQ29uZmlnID0gbmV3Q29uZmlnOwotICAgICAgICAgICAgaW50IG1DaE1vZGUgPSBtQ29kZWNDb25maWcuZ2V0Q2hhbm5lbE1vZGUoKTsKLSAgICAgICAgICAgIHN3aXRjaCAobUNoTW9kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhDb2RlY0NvbmZpZy5DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPOgotICAgICAgICAgICAgICAgICAgICBtTnVtQmlzZXMgPSAxICogbU51bVN1YkdycHM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ29kZWNDb25maWcuQ0hBTk5FTF9NT0RFX1NURVJFTzoKLSAgICAgICAgICAgICAgICAgICAgbU51bUJpc2VzID0gMiAqIG1OdW1TdWJHcnBzOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsImNoYW5uZWwgbW9kZSB1bmtub3duIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCaW5kZXIgb2JqZWN0OiBtdXN0IGJlIGEgc3RhdGljIGNsYXNzIG9yIG1lbW9yeSBsZWFrIG1heSBvY2N1ci4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgY2xhc3MgQmx1ZXRvb3RoQnJvYWRjYXN0QmluZGVyIGV4dGVuZHMgSUJsdWV0b290aEJyb2FkY2FzdC5TdHViCi0gICAgICAgICAgICBpbXBsZW1lbnRzIElQcm9maWxlU2VydmljZUJpbmRlciB7Ci0gICAgICAgIHByaXZhdGUgQnJvYWRjYXN0U2VydmljZSBtU2VydmljZTsKLQotICAgICAgICBwcml2YXRlIEJyb2FkY2FzdFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgICAgIGlmICghVXRpbHMuY2hlY2tDYWxsZXJJc1N5c3RlbU9yQWN0aXZlVXNlcihUQUcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIG1TZXJ2aWNlLmlzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEJyb2FkY2FzdEJpbmRlcihCcm9hZGNhc3RTZXJ2aWNlIHN2YykgewotICAgICAgICAgICAgbVNlcnZpY2UgPSBzdmM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gU2V0QnJvYWRjYXN0KGJvb2xlYW4gZW5hYmxlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuRW5hYmxlQnJvYWRjYXN0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkRpc2FibGVCcm9hZGNhc3QocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gU2V0RW5jcnlwdGlvbihib29sZWFuIGVuYWJsZSwgaW50IGVuY19sZW4sIGJvb2xlYW4gdXNlX2V4aXN0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgQnJvYWRjYXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLlNldEVuY3J5cHRpb24oZW5hYmxlLCBlbmNfbGVuLCB1c2VfZXhpc3RpbmcsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEVuY3J5cHRpb25LZXkoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5HZXRFbmNyeXB0aW9uS2V5KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBHZXRCcm9hZGNhc3RTdGF0dXMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9ESVNBQkxFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkdldEJyb2FkY2FzdFN0YXR1cyhwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2Jyb2FkY2FzdC9Ccm9hZGNhc3RTdGFja0V2ZW50LmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2Jyb2FkY2FzdC9Ccm9hZGNhc3RTdGFja0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjU1OTYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9icm9hZGNhc3QvQnJvYWRjYXN0U3RhY2tFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJyb2FkY2FzdDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjU3RhdHVzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEJyb2FkY2FzdDsKLS8qKgotICogU3RhY2sgZXZlbnQgc2VudCB2aWEgYSBjYWxsYmFjayBmcm9tIEpOSSB0byBKYXZhLCBvciBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm9hZGNhc3RTdGFja0V2ZW50IHsKLSAgICAvLyBFdmVudCB0eXBlcyBmb3IgU1RBQ0tfRVZFTlQgbWVzc2FnZSAoY29taW5nIGZyb20gbmF0aXZlKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX05PTkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQlJPQURDQVNUX1NUQVRFX0NIQU5HRUQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQlJPQURDQVNUX0FVRElPX1NUQVRFX0NIQU5HRUQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfRU5DX0tFWV9HRU5FUkFURUQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfU0VUVVBfQklHID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX0JST0FEQ0FTVF9JRF9HRU5FUkFURUQgPSA2OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSURMRSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09ORklHVVJFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RSRUFNSU5HID0gMjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUT1BQRUQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJURUQgPSAxOwotCi0gICAgcHVibGljIGludCB0eXBlID0gRVZFTlRfVFlQRV9OT05FOwotICAgIHB1YmxpYyBpbnQgYWR2SGFuZGxlID0gMDsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50ID0gMDsKLSAgICBwdWJsaWMgaW50IGJpZ0hhbmRsZSA9IDA7Ci0gICAgcHVibGljIGludCBOdW1CaXNlcyA9IDA7Ci0gICAgcHVibGljIGludFtdIEJpc0hhbmRsZXM7Ci0gICAgcHVibGljIGJ5dGVbXSBCcm9hZGNhc3RJZCA9IG5ldyBieXRlWzNdOwotICAgIHB1YmxpYyBTdHJpbmcga2V5OwotICAgIHB1YmxpYyBCbHVldG9vdGhDb2RlY1N0YXR1cyBjb2RlY1N0YXR1czsKLQotICAgIEJyb2FkY2FzdFN0YWNrRXZlbnQoaW50IHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyBldmVudCBkdW1wCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiQnJvYWRjYXN0U3RhY2tFdmVudCB7dHlwZToiICsgZXZlbnRUeXBlVG9TdHJpbmcodHlwZSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZhbHVlMToiICsgZXZlbnRUeXBlVmFsdWVJbnRUb1N0cmluZyh0eXBlLCB2YWx1ZUludCkpOwotICAgICAgICBpZiAoY29kZWNTdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb2RlY1N0YXR1czoiICsgY29kZWNTdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIn0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBldmVudFR5cGVUb1N0cmluZyhpbnQgdHlwZSkgewotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9OT05FOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9OT05FIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9CUk9BRENBU1RfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfQlJPQURDQVNUX1NUQVRFX0NIQU5HRUQiOwotICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX0JST0FEQ0FTVF9BVURJT19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9CUk9BRENBU1RfQVVESU9fU1RBVEVfQ0hBTkdFRCI7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfRU5DX0tFWV9HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX0VOQ19LRVlfR0VORVJBVEVEIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9DT0RFQ19DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfQ09ERUNfQ09ORklHX0NIQU5HRUQiOwotICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX1NFVFVQX0JJRzoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfU0VUVVBfQklHIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX1VOS05PV046IiArIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXZlbnRUeXBlVmFsdWVJbnRUb1N0cmluZyhpbnQgdHlwZSwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX0JST0FEQ0FTVF9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRJU0FCTEVEIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRU5BQkxJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVOQUJMSU5HIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ09ORklHVVJFRCI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX1NUUkVBTUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiU1RSRUFNSU5HIjsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9CUk9BRENBU1RfQVVESU9fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICBzd2l0Y2godmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQTEFZSU5HIjsKLSAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX05PVF9QTEFZSU5HOgotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTk9UIFBMQVlJTkciOwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvY2MvQ0NIYWxDb25zdGFudHMuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvY2MvQ0NIYWxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0ZGYwYi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2NjL0NDSGFsQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmNjOwotCi0vKgotICogQGhpZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENDSGFsQ29uc3RhbnRzIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfU1RBVEVfTk9UX0FWQUlMQUJMRSA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1NUQVRFX0FWQUlMQUJMRSA9IDE7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVFlQRV9IT01FID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVFlQRV9ST0FNSU5HID0gMTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTF9TVEFURV9BQ1RJVkUgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTF9TVEFURV9IRUxEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBTExfU1RBVEVfRElBTElORyA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQUxMX1NUQVRFX0FMRVJUSU5HID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBTExfU1RBVEVfSU5DT01JTkcgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTF9TVEFURV9XQUlUSU5HID0gNTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBTExfU1RBVEVfSURMRSA9IDY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQUxMX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDc7Ci0KLSAgICAvL0NhbGwgU3RhdGUgYXMgZXhwZWN0ZWQgYnkgU3RhY2svQ0MKLSAgICBzdGF0aWMgZmluYWwgaW50IENDU19TVEFURV9JTkNPTUlORyA9IDB4MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQ1NfU1RBVEVfRElBTElORyA9IDB4MDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQ1NfU1RBVEVfQUxFUlRJTkcgPSAweDAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0NTX1NUQVRFX0FDVElWRSA9IDB4MDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDQ1NfU1RBVEVfTE9DQUxfSEVMRD0gMHgwNDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENDU19TVEFURV9SRU1PVEVMWV9IRUxEPSAweDA1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0NTX1NUQVRFX0xPQ0FMX1JFTU9URV9IRUxEPSAweDA2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0NTX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDB4MDc7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEJUQ0NfT1BfQUNDRVBUID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJUQ0NfT1BfVEVSTUlOQVRFID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJUQ0NfT1BfTE9DQUxfSExEID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJUQ0NfT1BfTE9DQUxfUkVUUklFVkUgPSAzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlRDQ19PUF9PUklHSU5BVEUgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlRDQ19PUF9KT0lOID0gNTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlRDQ19PUF9TVUNDRVNTID0gMHgwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJUQ0NfT1BfTk9UX1BPU1NJQkxFID0gMHgwMjsKLQotICAgIC8vZGVmYXVsdCBjYWxsIGluZGV4IGZvciBmYWlsdXJlcwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlRDQ19ERUZfSU5ERVhfRk9SX0ZBSUxVUkVTID0gMDsKLQotICAgIHN0YXRpYyBpbnQgZ2V0Q0NzQ2FsbFN0YXRlKGludCB0ZWxlcGhvbnlDYWxsU3RhdGUpIHsKLSAgICAgICAgaW50IHJldCA9IDB4RkY7Ci0gICAgICAgIHN3aXRjaCh0ZWxlcGhvbnlDYWxsU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ0FMTF9TVEFURV9BQ1RJVkU6IHJldCA9IENDU19TVEFURV9BQ1RJVkU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQUxMX1NUQVRFX0hFTEQ6IHJldCA9IENDU19TVEFURV9MT0NBTF9IRUxEOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FMTF9TVEFURV9ESUFMSU5HOiByZXQgPSBDQ1NfU1RBVEVfRElBTElORzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTExfU1RBVEVfQUxFUlRJTkc6IHJldCA9IENDU19TVEFURV9BTEVSVElORzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTExfU1RBVEVfSU5DT01JTkc6IHJldCA9IENDU19TVEFURV9JTkNPTUlORzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTExfU1RBVEVfRElTQ09OTkVDVEVEOiByZXQgPSBDQ1NfU1RBVEVfRElTQ09OTkVDVEVEOyBicmVhazsKLSAgICAgICAgICAgIC8vdGhpcyBtZWFucyBzZWNvbmQgSW5jb21pbmcgY2FsbCBpcyB3YWl0aW5nCi0gICAgICAgICAgICBjYXNlIENBTExfU1RBVEVfV0FJVElORzogcmV0ID0gQ0NTX1NUQVRFX0lOQ09NSU5HOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlcmF0aW9uVG9TdHJpbmcoaW50IHdoYXQpIHsKLSAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIEJUQ0NfT1BfQUNDRVBUIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkJUQ0NfT1BfQUNDRVBUIjsKLSAgICAgICAgICAgIGNhc2UgQlRDQ19PUF9URVJNSU5BVEUgOgotICAgICAgICAgICAgICAgIHJldHVybiAiQlRDQ19PUF9URVJNSU5BVEUiOwotICAgICAgICAgICAgY2FzZSBCVENDX09QX0xPQ0FMX0hMRCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJCVENDX09QX0xPQ0FMX0hMRCI7Ci0gICAgICAgICAgICBjYXNlIEJUQ0NfT1BfTE9DQUxfUkVUUklFVkUgOgotICAgICAgICAgICAgICAgIHJldHVybiAiQlRDQ19PUF9MT0NBTF9SRVRSSUVWRSI7Ci0gICAgICAgICAgICBjYXNlIEJUQ0NfT1BfT1JJR0lOQVRFIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkJUQ0NfT1BfT1JJR0lOQVRFIjsKLSAgICAgICAgICAgIGNhc2UgQlRDQ19PUF9KT0lOIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkJUQ0NfT1BfSk9JTiI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHdoYXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvY2MvQ0NOYXRpdmVJbnRlcmZhY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvY2MvQ0NOYXRpdmVJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5M2M2Mi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2NjL0NDTmF0aXZlSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBEZWZpbmVzIHRoZSBuYXRpdmUgaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCBieSBzdGF0ZSBtYWNoaW5lL3NlcnZpY2UgdG8KLSAqIHNlbmQgb3IgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBuYXRpdmUgc3RhY2suIFRoaXMgZmlsZSBpcyByZWdpc3RlcmVkCi0gKiBmb3IgdGhlIG5hdGl2ZSBtZXRob2RzIGluIHRoZSBjb3JyZXNwb25kaW5nIEpOSSBDKysgZmlsZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguY2M7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLQotLyoqCi0gKiBDY3AgTmF0aXZlIEludGVyZmFjZSB0by9mcm9tIEpOSS4KLSAqLwotcHVibGljIGNsYXNzIENDTmF0aXZlSW50ZXJmYWNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNDTmF0aXZlSW50ZXJmYWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwotCi0gICAgQEd1YXJkZWRCeSgiSU5TVEFOQ0VfTE9DSyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ0NOYXRpdmVJbnRlcmZhY2Ugc0luc3RhbmNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJTlNUQU5DRV9MT0NLID0gbmV3IE9iamVjdCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDQ05hdGl2ZUludGVyZmFjZSgpIHsKLSAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJObyBCbHVldG9vdGggQWRhcHRlciBBdmFpbGFibGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGlzIGEgc2luZ2xldG9uIGJlY2F1c2UgbmF0aXZlIGxpYnJhcnkgc2hvdWxkIG9ubHkgYmUgbG9hZGVkIG9uY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gZGVmYXVsdCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ0NOYXRpdmVJbnRlcmZhY2UgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoSU5TVEFOQ0VfTE9DSykgewotICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IENDTmF0aXZlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc0luc3RhbmNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBuYXRpdmUgc3RhY2sKLSAgICAgKgotICAgICAqIEBwYXJhbSBjY3NDbGllbnRzIG1heGltdW0gbnVtYmVyIG9mIENDUyBjbGllbnRzIHRoYXQgY2FuIGJlIGNvbm5lY3RlZCBzaW11bHRhbmVvdXNseQotICAgICAqIEBwYXJhbSBpbmJhbmRSaW5naW5nRW5hYmxlZCB3aGV0aGVyIGluLWJhbmQgcmluZ2luZyBpcyBlbmFibGVkIG9uIHRoaXMgQUcKLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgdm9pZCBpbml0KGludCBtYXhDY3NDbGllbnRzLCBib29sZWFuIGluYmFuZFJpbmdpbmdFbmFibGVkKSB7Ci0gICAgICAgIGluaXRpYWxpemVOYXRpdmUoIjAwMDA4ZmQxLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIsIG1heENjc0NsaWVudHMsIGluYmFuZFJpbmdpbmdFbmFibGVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbnVwIHRoZSBuYXRpdmUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGNsZWFudXBOYXRpdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0cyBDYWxsIGNvbnRyb2wgZnJvbSBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3ROYXRpdmUoZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIHVwZGF0ZSBDQyBvcHRpb25hbCBzdXBwb3J0ZWQgZmVhdHVyZQotICAgICAqIEBwYXJhbSBmZWF0dXJlCi0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIGNhbGxDb250cm9sT3B0aW9uYWxGZWF0dXJlcyhpbnQgZmVhdHVyZSkgewotICAgICAgICByZXR1cm4gY2FsbENvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZE5hdGl2ZShmZWF0dXJlKTsKLSAgICB9Ci0KLSAgLyoqCi0gICAgICogU2V0cyB0aGUgQ0MgY2FsbCBzdGF0ZQotICAgICAqIEBwYXJhbSBzdGF0ZQotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBjYWxsU3RhdGUoQXJyYXlMaXN0PENhbGxDb250cm9sU3RhdGU+IGNhbGxMaXN0KSB7Ci0gICAgICAgIGludCBsZW4gPSBjYWxsTGlzdC5zaXplKCk7Ci0gICAgICAgIGJ5dGVbXSBjU3RhdGVMaXN0Qnl0ZXMgPSBuZXcgYnl0ZVtsZW4qM107Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgewotICAgICAgICAgICAgY1N0YXRlTGlzdEJ5dGVzWzMqaSswXSA9IChieXRlKSBjYWxsTGlzdC5nZXQoaSkubUluZGV4OwotICAgICAgICAgICAgY1N0YXRlTGlzdEJ5dGVzWzMqaSsxXSA9IChieXRlKSBDQ0hhbENvbnN0YW50cy5nZXRDQ3NDYWxsU3RhdGUoY2FsbExpc3QuZ2V0KGkpLm1TdGF0ZSk7Ci0gICAgICAgICAgICBjU3RhdGVMaXN0Qnl0ZXNbMyppKzJdID0gKGJ5dGUpIGNhbGxMaXN0LmdldChpKS5tRmxhZ3M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhbGxTdGF0ZU5hdGl2ZShsZW4sIGNTdGF0ZUxpc3RCeXRlcyk7Ci0gICAgfQotCi0gIC8qKgotICAgICAqIHVwZGF0ZSBDQyBCZWFyZXIgbmFtZQotICAgICAqIEBwYXJhbSBCZWFyZXIgbmFtZQotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCZWFyZXJQcm92aWRlck5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZUJlYXJlck5hbWVOYXRpdmUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXBkYXRlIENDIEJlYXJlciAgdGVjaG5vbG9neSB0eXBlCi0gICAgICogQHBhcmFtIEJlYXJlciB0ZWNobm9sb2d5Ci0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJlYXJlclRlY2hub2xvZ3koaW50IHRlY2hfdHlwZSkgewotICAgICAgICAgcmV0dXJuIHVwZGF0ZUJlYXJlclRlY2hub2xvZ3lOYXRpdmUodGVjaF90eXBlKTsKLQotICAgIH0KLQotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdGF0dXNGbGFncyhpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXR1c0ZsYWdzTmF0aXZlKHZhbHVlKTsKLSAgICB9Ci0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNpZ25hbFN0cmVuZ3RoKGludCBzaWduYWxfdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZVNpZ25hbFN0YXR1c05hdGl2ZShzaWduYWxfdmFsdWUpOwotICAgIH0KLQotCi0gICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUluY29taW5nQ2FsbChpbnQgaW5kZXgsIFN0cmluZyB1cmkpIHsKLSAgICAgIHVwZGF0ZUluY29taW5nQ2FsbE5hdGl2ZShpbmRleCwgdXJpKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgIH0KLQotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN1cHBvcnRlZEJlYXJlckxpc3QoU3RyaW5nIHN1cHBvcnRlZEJlYXJlcnMpIHsKLSAgICAgIHJldHVybiAgdXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdE5hdGl2ZShzdXBwb3J0ZWRCZWFyZXJzKTsKLSAgIH0KLQotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBjYWxsQ29udHJvbFJlc3BvbnNlKGludCBvcCwgaW50IGluZGV4LCBpbnQgc3RhdHVzLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBjYWxsQ29udHJvbFJlc3BvbnNlTmF0aXZlKG9wLCBpbmRleCwgc3RhdHVzLCAgZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotCi0gIC8qKgotICAgICAqIHVwZGF0ZSBhY3RpdmUgZGV2aWNlCi0gICAgICogQHBhcmFtIGRldmljZQotICAgICAgICogQHBhcmFtIHNldElkCi0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIHNldEFjdGl2ZURldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc2V0SWQpIHsKLSAgICAgICAgcmV0dXJuIHNldEFjdGl2ZURldmljZU5hdGl2ZShzZXRJZCwgZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldHMgY2FsbCBjb250ZW50IGNvbnRyb2wgaWQKLSAgICAgKiBAcGFyYW0gY2NpZAotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBjb250ZW50Q29udHJvbElkKGludCBjY2lkKSB7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRDb250cm9sSWROYXRpdmUoY2NpZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlKGJ5dGVbXSBhZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gZ2V0Qnl0ZUFkZHJlc3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKCIwMDowMDowMDowMDowMDowMCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgIH0KLQotICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBuYXRpdmUgc3RhY2sgYmFjayBpbnRvIHRoZSBKYXZhIGZyYW1ld29yay4KLSAgICBwcml2YXRlIHZvaWQgY2FsbENvbnRyb2xJbml0aWFsaXplZENhbGxiYWNrKGludCBzdGF0ZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJDYWxsQ29udHJvbEluaXRpYWxpemVkQ2FsbGJhY2s6ICIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDQ1NlcnZpY2Ugc2VydmljZSA9IENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZS5vbkNhbGxDb250cm9sSW5pdGlhbGl6ZWQoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIGJ5dGVbXSBhZGRyZXNzKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDogIiArIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gZ2V0RGV2aWNlKGFkZHJlc3MpOwotCi0gICAgICAgIENDU2VydmljZSBzZXJ2aWNlID0gQ0NTZXJ2aWNlLmdldENDU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKQotICAgICAgICAgICAgc2VydmljZS5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoZGV2aWNlLCBzdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdChpbnQgb3AsIGludFtdY2FsbF9pbmRpY2VzLCBpbnQgY291bnQsIGJ5dGVbXSBkaWFsTnVtYmVyLCBieXRlW10gYWRkcmVzcykgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gZ2V0RGV2aWNlKGFkZHJlc3MpOwotICAgICAgICBTdHJpbmcgZGlhbFVyaSA9IG5ldyBTdHJpbmcoZGlhbE51bWJlciwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkNhbGxDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdDogIiArIG9wICsgImRpYWxOdW1iZXI6ICIgKyBkaWFsVXJpKTsKLSAgICAgICAgfQotICAgICAgICBDQ1NlcnZpY2Ugc2VydmljZSA9IENDU2VydmljZS5nZXRDQ1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZpY2Uub25DYWxsQ29udHJvbFBvaW50Q2hhbmdlZFJlcXVlc3Qob3AsIGNhbGxfaW5kaWNlcywgY291bnQsIGRpYWxVcmksIGRldmljZSk7Ci0gICAgfQotCi0gICAgLy8gTmF0aXZlIG1ldGhvZHMgdGhhdCBjYWxsIGludG8gdGhlIEpOSSBpbnRlcmZhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXRpYWxpemVOYXRpdmUoU3RyaW5nIHV1aWQsIGludCBtYXhfY2NzX2NsaWVudHMsIGJvb2xlYW4gaW5iYW5kUmluZ2luZ0VuYWJsZWQpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgY2xlYW51cE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY2FsbENvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZE5hdGl2ZShpbnQgZmVhdHVyZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjYWxsU3RhdGVOYXRpdmUoaW50IGxlbiwgYnl0ZVtdIGNhbGxTdGF0ZUxpc3QpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gdXBkYXRlQmVhcmVyTmFtZU5hdGl2ZShTdHJpbmcgcHJvdmlkZXJOYW1lKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHVwZGF0ZUJlYXJlclRlY2hub2xvZ3lOYXRpdmUoaW50IHRlY2hfdHlwZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiB1cGRhdGVTaWduYWxTdGF0dXNOYXRpdmUoaW50IHNpZ25hbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiB1cGRhdGVTdGF0dXNGbGFnc05hdGl2ZShpbnQgdmFsdWUpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlTmF0aXZlKGludCBzZXRJZCwgYnl0ZVtdIGFkZHJlc3MpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29udGVudENvbnRyb2xJZE5hdGl2ZShpbnQgY2NpZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0TmF0aXZlKGJ5dGVbXSBhZGRyZXNzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNhbGxDb250cm9sUmVzcG9uc2VOYXRpdmUoaW50IG9wLCBpbnQgaW5kZXgsIGludCBzdGF0dXMsIGJ5dGVbXSBhZGRyZXNzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHVwZGF0ZVN1cHBvcnRlZEJlYXJlckxpc3ROYXRpdmUoU3RyaW5nIHN1cHBvcnRlZEJlYXJlcnMpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gdXBkYXRlSW5jb21pbmdDYWxsTmF0aXZlKGludCBpbmRleCwgU3RyaW5nIHVyaSk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2NjL0NDU2VydmljZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9jYy9DQ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzYmMyZS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2NjL0NDU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY0ICswLDAgQEAKLS8qCi0gKkNvcHlyaWdodCAoYykgMjAyMC0yMDIxLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5jYzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkxVRVRPT1RIX0NPTk5FQ1Q7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlF1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5VdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLkFkYXB0ZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5BcG1Db25zdDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkNhbGxBdWRpbzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkNhbGxDb250cm9sOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLS8qKgotICogUHJvdmlkZXMgQmx1ZXRvb3RoIENDIHByb2ZpbGUgYXMgYSBzZXJ2aWNlIGluIHRoZSBCbHVldG9vdGggYXBwbGljYXRpb24uCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgQ0NTZXJ2aWNlIGV4dGVuZHMgUHJvZmlsZVNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDQ1NlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX0lOQkFORF9SSU5HSU5HX1BST1BFUlRZID0KLSAgICAgICAgICAgICAicGVyc2lzdC5ibHVldG9vdGguZGlzYWJsZWluYmFuZHJpbmdpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBDQ1NlcnZpY2Ugc0NDU2VydmljZTsKLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXI7Ci0KLSAgICBwcml2YXRlIGludCBtQ0NJZCA9IDB4RkY7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZURldmljZTsKLSAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UgPSBudWxsOwotICAgIHByaXZhdGUgQWRhcHRlclNlcnZpY2UgbUFkYXB0ZXJTZXJ2aWNlOwotICAgIHByaXZhdGUgQ0NOYXRpdmVJbnRlcmZhY2UgbU5hdGl2ZUludGVyZmFjZTsKLSAgICBwcml2YXRlIENhbGxBdWRpbyBtQ2FsbEF1ZGlvID0gbnVsbDsKLSAgICBwcml2YXRlIEFjdGl2ZURldmljZU1hbmFnZXJTZXJ2aWNlIG1BY3RpdmVEZXZNZ3JTZXJ2aWNlID0gbnVsbDsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQgID0gbnVsbDs7Ci0gICAgcHJpdmF0ZSBDY3NNZXNzYWdlSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGludCBtTWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzID0gMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gIEluQmFuZFJpbmd0b25lU3VwcG9ydCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlydHVhbENhbGxTdGFydGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUxhdGVzdEFjdGl2ZUNhbGxJbmRleCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1MYXRlc3RIZWxkQ2FsbEluZGV4ID0gMDsKLSAgICBwcml2YXRlIENhbGxDb250cm9sU3RhdGUgbVByZXZUZWxlcGhvbnlTdGF0ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIENhbGxDb250cm9sU3RhdGU+IG1DYWxsU3RhdGVMaXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgQ2FsbENvbnRyb2xTdGF0ZT4gbVByZXZDYWxsU3RhdGVMaXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIFF1ZXVlPEludGVnZXI+IG1MY2NUb2JlUXVldWVkID0gbnVsbDsKLSAgICBwcml2YXRlIFF1ZXVlPEludGVnZXI+IG1MY2NXYWl0Rm9yUmVzcG9uc2VRID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHU19ESVJFQ1RJT05fQklUID0gMHgwMDAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ19TSUdOQUxfU1RSRU5HVEhfRkFDVE9SID0gMjA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0NfQ09OVEVOVF9DT05UUk9MX0lEID0gNzc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENDX09QVElPTkFMX0xPQ0FMX0hPTERfRkVBVCA9IDB4MDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENDX09QVElPTkFMX0pPSU5fRkVBVCA9IDB4MDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTExfQ09OVFJPTF9PUFRJT05BTF9GRUFUVVJFUyA9IENDX09QVElPTkFMX0xPQ0FMX0hPTERfRkVBVHxDQ19PUFRJT05BTF9KT0lOX0ZFQVQ7Ci0gICAgLy9uYXRpdmUgZXZlbnQKLSAgICBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQ0FMTF9DT05UUk9MX1BPSU5UX0NIQU5HRUQgPSAyOwotICAgIC8vQ0MgdG8gSk5JIHVwZGF0ZQotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0JFQVJFUl9OQU1FID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9CRUFSRVJfVEVDSCA9IDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfU1RBVFVTX0ZMQUdTID0gNTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9TSUdOQUxfU1RSRU5HVEggPSA2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0JFQVJFUkxJU1RfU1VQUE9SVEVEID0gNzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9DT05URU5UX0NPTlRST0xfSUQgPSA4OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NBTExfU1RBVEUgPSA5OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NBTExfQ09OVFJPTF9PUENPREVTX1NVUFBPUlRFRCA9IDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NBTExfQ09OVFJPTF9SRVNQT05TRSA9IDExOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0lOQ09NSU5HX0NBTEwgPSAxMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NfQ0FMTF9TVEFURSA9IDEzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU19QSE9ORV9TVEFURV9DSEFOR0VEID0gMTQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkVfREVWSUNFX0NIQU5HRUQgPSAxNTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgaW5pdEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDY0JpbmRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImNyZWF0ZSgpIik7Ci0gICAgICAgIGlmIChtQ3JlYXRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY3JlYXRlKCkgY2FsbGVkIHR3aWNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImNsZWFudXAoKSIpOwotICAgICAgICBpZiAobU5hdGl2ZUludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnQoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgInN0YXJ0KCkiKTsKLSAgICAgICAgaWYgKHNDQ1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiQ0NTZXJ2aWNlIGlzIGFscmVhZHkgcnVubmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ3JlYXRlIENDU2VydmljZSBJbnN0YW5jZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSB0aGlzOwotICAgICAgICBtQWRhcHRlclNlcnZpY2UgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCksCi0gICAgICAgICAgICAgICAgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIHdoZW4gQ0NTZXJ2aWNlIHN0YXJ0cyIpOwotICAgICAgICBtTmF0aXZlSW50ZXJmYWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChDQ05hdGl2ZUludGVyZmFjZS5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICJDY05hdGl2ZUludGVyZmFjZSBjYW5ub3QgYmUgbnVsbCB3aGVuIENjU2VydmljZSBzdGFydHMiKTsKLSAgICAgICAgLy8gU3RlcCAyOiBHZXQgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGVkIGF1ZGlvIGRldmljZXMKLSAgICAgICAgbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyA9IG1BZGFwdGVyU2VydmljZS5nZXRNYXhDb25uZWN0ZWRBdWRpb0RldmljZXMoKTsKLSAgICAgICAgTG9nLmkoVEFHLCAiTWF4IGNvbm5lY3RlZCBhdWRpbyBkZXZpY2VzIHNldCB0byAiICsgbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyk7Ci0KLSAgICAgICAgaWYgKG1IYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEhhbmRsZXJUaHJlYWQgdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkJsdWV0b290aENDU0hhbmRsZXIiKTsKLSAgICAgICAgdGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIExvb3BlciBsb29wZXIgPSB0aHJlYWQuZ2V0TG9vcGVyKCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IENjc01lc3NhZ2VIYW5kbGVyKGxvb3Blcik7Ci0gICAgICAgIC8vQVBNJ3MgQ2FsbENvbnRyb2wgYW5kIENhbGxBdWRpbyBpbml0aWFsaXphdGlvbgotICAgICAgICBDYWxsQ29udHJvbC5pbml0KG1Db250ZXh0KTsKLSAgICAgICAgbUNhbGxBdWRpbyA9IENhbGxBdWRpby5pbml0KG1Db250ZXh0KTsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5pbml0KG1NYXhDb25uZWN0ZWRBdWRpb0RldmljZXMsSW5CYW5kUmluZ3RvbmVTdXBwb3J0KTsKLSAgICAgICAgTG9nLmQoVEFHLCAiY2MgbmF0aXZlIGluaXQgZG9uZSIpOwotICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAvL21TeXN0ZW1JbnRlcmZhY2UgPSBIZWFkc2V0U2VydmljZS5nZXRTeXN0ZW1JbnRlcmZhY2VPYmooKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIgPSBuZXcgQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyKCk7Ci0gICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgbUNhbGxTdGF0ZUxpc3QgPSBuZXcgSGFzaE1hcDw+ICgpOwotICAgICAgICBtUHJldkNhbGxTdGF0ZUxpc3QgPSBuZXcgSGFzaE1hcDw+ICgpOwotICAgICAgICBtTGNjV2FpdEZvclJlc3BvbnNlUSA9IG5ldyBMaW5rZWRMaXN0PD4gKCk7Ci0gICAgICAgIG1MY2NUb2JlUXVldWVkID0gbmV3IExpbmtlZExpc3Q8PiAoKTsKLSAgICAgICAgbUFjdGl2ZURldk1nclNlcnZpY2UgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgc2V0Q0NTZXJ2aWNlKHRoaXMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wKCkgewotICAgICAgICBMb2cuaShUQUcsICJzdG9wKCkiKTsKLSAgICAgICAgaWYgKHNDQ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICBMb2cudyhUQUcsICJzdG9wKCkgY2FsbGVkIGJlZm9yZSBzdGFydCgpIik7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0ZXAgODogTWFyayBzZXJ2aWNlIGFzIHN0b3BwZWQKLSAgICAgICAgc2V0Q0NTZXJ2aWNlKG51bGwpOwotICAgICAgICAvLyBDbGVhbnVwIG5hdGl2ZSBpbnRlcmZhY2UKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5jbGVhbnVwKCk7Ci0gICAgICAgIG1OYXRpdmVJbnRlcmZhY2UgPSBudWxsOwotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlcik7Ci0gICAgICAgIC8vIENsZWFyIEFkYXB0ZXJTZXJ2aWNlCi0gICAgICAgIG1BZGFwdGVyU2VydmljZSA9IG51bGw7Ci0gICAgICAgIG1NYXhDb25uZWN0ZWRBdWRpb0RldmljZXMgPSAxOwotICAgICAgICBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UgPSBudWxsOwotICAgICAgICBDYWxsQ29udHJvbC5saXN0ZW5Gb3JQaG9uZVN0YXRlKFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTk9ORSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldENDU2VydmljZShDQ1NlcnZpY2UgaW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0Q0NTZXJ2aWNlKCk6IHNldCB0bzogIiArIGluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzQ0NTZXJ2aWNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ0NTZXJ2aWNlIGdldENDU2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNDQ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0Q0NTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNDQ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmVhcmVyUHJvdmlkZXJOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgbXNnLndoYXQgPSBVUERBVEVfQkVBUkVSX05BTUU7Ci0gICAgICAgbXNnLm9iaiA9IG5hbWU7Ci0gICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmVhcmVyUHJvdmlkZXJUZWNobm9sb2d5IChpbnQgIHRlY2hfdHlwZSkgIHsKLSAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgbXNnLndoYXQgPSBVUERBVEVfQkVBUkVSX1RFQ0g7Ci0gICAgICBtc2cuYXJnMSA9IHRlY2hfdHlwZTsKLSAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTaWduYWxTdHJlbmd0aChpbnQgc2lnbmFsKSB7Ci0gICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgbXNnLndoYXQgPSBVUERBVEVfU0lHTkFMX1NUUkVOR1RIOwotICAgICAgIG1zZy5hcmcxID0gc2lnbmFsKkNDX1NJR05BTF9TVFJFTkdUSF9GQUNUT1I7Ci0gICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdXBwb3J0ZWRCZWFyZXJMaXN0KFN0cmluZyBzdXBwb3J0ZWRCZWFyZXJzKSB7Ci0gICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgbXNnLndoYXQgPSBVUERBVEVfQkVBUkVSTElTVF9TVVBQT1JURUQgOwotICAgICAgIG1zZy5vYmogPSBzdXBwb3J0ZWRCZWFyZXJzOwotICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlT3JpZ2luYXRlUmVzdWx0KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBldmVudCwgaW50IHJlcykgewotICAgICAgICBpZiAobUNhbGxPcmlnaW5hdGVkRGV2aWNlID09IG51bGwgfHwgZGV2aWNlICE9IG1DYWxsT3JpZ2luYXRlZERldmljZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiT3JpZ2luYXRlIHJlc3AgaWdub3JlZCwgYXMgdGhlcmUgaXMgbm8gT3JnaW5hdGUgcmVxIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcyAhPSAxKSB7Ci0gICAgICAgICAgICBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgdXBkYXRlQ2FsbENvbnRyb2xSZXNwb25zZShDQ0hhbENvbnN0YW50cy5CVENDX09QX09SSUdJTkFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NIYWxDb25zdGFudHMuQlRDQ19ERUZfSU5ERVhfRk9SX0ZBSUxVUkVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0hhbENvbnN0YW50cy5CVENDX09QX05PVF9QT1NTSUJMRSwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUNvbnRlbnRDb250cm9sSUQoaW50IGNjaWQpIHsKLSAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICBtc2cud2hhdCA9IFVQREFURV9DT05URU5UX0NPTlRST0xfSUQ7Ci0gICAgICAgbXNnLmFyZzEgPSBjY2lkOwotICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgbUNDSWQgPSBjY2lkOwotICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0YXR1c0ZsYWdzKGludCBzdGF0dXNGbGFncykgewotICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgIG1zZy53aGF0ID0gVVBEQVRFX1NUQVRVU19GTEFHUzsKLSAgICAgICBtc2cuYXJnMSA9IHN0YXR1c0ZsYWdzOwotICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQ2FsbENvbnRyb2xPcHRpb25hbEZlYXR1cmVzKGludCBmZWF0dXJlKSB7Ci0gICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgbXNnLndoYXQgPSBVUERBVEVfQ0FMTF9DT05UUk9MX09QQ09ERVNfU1VQUE9SVEVEOwotICAgICAgIG1zZy5hcmcxID0gZmVhdHVyZTsKLSAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUNhbGxDb250cm9sUmVzcG9uc2UoaW50IG9wLCBpbnQgaW5kZXgsIGludCBzdGF0dXMsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICBtc2cud2hhdCA9IFVQREFURV9DQUxMX0NPTlRST0xfUkVTUE9OU0UgOwotICAgICAgIG1zZy5hcmcxID0gb3A7Ci0gICAgICAgbXNnLmFyZzIgPSBpbmRleDsKLSAgICAgICBtc2cub2JqID0gc3RhdHVzOwotICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUluY29taW5nQ2FsbChpbnQgaW5kZXgsIFN0cmluZyB1cmkpICB7Ci0gICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgbXNnLndoYXQgPSBVUERBVEVfSU5DT01JTkdfQ0FMTCA7Ci0gICAgICAgbXNnLmFyZzEgPSBpbmRleDsKLSAgICAgICBtc2cub2JqID0gdXJpOwotICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZpcnR1YWxDYWxsU3RhcnRlZCgpIHsKLQotICAgICAgICByZXR1cm4gbVZpcnR1YWxDYWxsU3RhcnRlZDsKLSAgICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHNldFZpcnR1YWxDYWxsQWN0aXZlKGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgIExvZy5pKFRBRywgInNldFZpcnR1YWxDYWxsQWN0aXZlOiAiICsgc3RhdGUpOwotICAgICAgaWYgKHN0YXRlID09IHRydWUpIHsKLSAgICAgICAgc3RhcnRTY29Vc2luZ1ZpcnR1YWxWb2ljZUNhbGwoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RvcFNjb1VzaW5nVmlydHVhbFZvaWNlQ2FsbCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNhcHRjaEZha2VDYWxsU3RhdGUgKENhbGxDb250cm9sU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsU3RhdGVMaXN0LnB1dChzdGF0ZS5tSW5kZXgsIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLndoYXQgPSBQUk9DRVNTX0NBTExfU1RBVEU7Ci0gICAgICAgIENvbGxlY3Rpb248Q2FsbENvbnRyb2xTdGF0ZT4gdmFsdWVzID0gbUNhbGxTdGF0ZUxpc3QudmFsdWVzKCk7Ci0gICAgICAgIEFycmF5TGlzdDxDYWxsQ29udHJvbFN0YXRlPiBsaXN0T2ZWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzKTsKLSAgICAgICAgbXNnLm9iaiA9IGxpc3RPZlZhbHVlczsKLSAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHN0YXJ0U2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKCkgewotCi0gICAgICAgIExvZy5pKFRBRywgInN0YXJ0U2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsOiAiICsgVXRpbHMuZ2V0VWlkUGlkU3RyaW5nKCkpOwotICAgICAgICBtVmlydHVhbENhbGxTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgLy8gU2VuZCBmYWtlIGNhbGwgc3RhdGVzIHRvIG1pbWljIG91dGdvaW5nIGNhbGxzCi0KLSAgICAgICAgbUNhbGxTdGF0ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgQ2FsbENvbnRyb2xTdGF0ZSBhbGVydGluZ1N0YXRlID0gbmV3IENhbGxDb250cm9sU3RhdGUoMSxDQ0hhbENvbnN0YW50cy5DQUxMX1NUQVRFX0FMRVJUSU5HLEZMQUdTX0RJUkVDVElPTl9CSVQpOwotICAgICAgICBkaXNhcHRjaEZha2VDYWxsU3RhdGUoYWxlcnRpbmdTdGF0ZSk7Ci0gICAgICAgIENhbGxDb250cm9sU3RhdGUgYWN0aXZlU3RhdGUgPSBuZXcgQ2FsbENvbnRyb2xTdGF0ZSgxLENDSGFsQ29uc3RhbnRzLkNBTExfU1RBVEVfQUNUSVZFLEZMQUdTX0RJUkVDVElPTl9CSVQpOwotICAgICAgICBkaXNhcHRjaEZha2VDYWxsU3RhdGUoYWN0aXZlU3RhdGUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgIH0KLQotICAgYm9vbGVhbiBzdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKCkgewotCi0gICAgICAgIExvZy5pKFRBRywgInN0b3BTY29Vc2luZ1ZpcnR1YWxWb2ljZUNhbGw6ICIgKyBVdGlscy5nZXRVaWRQaWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAvLyAxLiBDaGVjayBpZiB2aXJ0dWFsIGNhbGwgaGFzIGFscmVhZHkgc3RhcnRlZAotICAgICAgICAgaWYgKCFtVmlydHVhbENhbGxTdGFydGVkKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsOiB2aXJ0dWFsIGNhbGwgbm90IHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgICBtVmlydHVhbENhbGxTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyAyLiBTZW5kIGZha2UgY2FsbCBzdGF0ZXMgdG8gbWltaWMgaXQgaWFzIG91dGdvaW5nIGNhbGxzCi0KLSAgICAgICAgIG1DYWxsU3RhdGVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICBDYWxsQ29udHJvbFN0YXRlIGRpc0Nvbm5lY3RlZFN0YXRlID0gbmV3IENhbGxDb250cm9sU3RhdGUoMSxDQ0hhbENvbnN0YW50cy5DQ1NfU1RBVEVfRElTQ09OTkVDVEVELEZMQUdTX0RJUkVDVElPTl9CSVQpOwotICAgICAgICAgZGlzYXB0Y2hGYWtlQ2FsbFN0YXRlKGRpc0Nvbm5lY3RlZFN0YXRlKTsKLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgfQotCi0gICBwcml2YXRlIHZvaWQgdXBkYXRlQ2FsbFN0YXRlKEFycmF5TGlzdDxDYWxsQ29udHJvbFN0YXRlPiBsaXN0T2ZWYWx1ZXMpIHsKLSAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVDYWxsU3RhdGUiKTsKLSAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICBtc2cud2hhdCA9IFVQREFURV9DQUxMX1NUQVRFOwotICAgICAgIG1zZy5vYmogPSBsaXN0T2ZWYWx1ZXM7Ci0gICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgcHJvY2Vzc0FuZFVwZGF0ZUNhbGxTdGF0ZShBcnJheUxpc3Q8Q2FsbENvbnRyb2xTdGF0ZT4gbGlzdE9mVmFsdWVzKSB7Ci0gICAgICBpbnQgZmxhZ3MgPSAwOwotCi0gICAgICBmb3IgKENhbGxDb250cm9sU3RhdGUgc3RhdGUgOiBsaXN0T2ZWYWx1ZXMpIHsKLSAgICAgICAgICBMb2cuaShUQUcsICJwcm9jZXNzQW5kVXBkYXRlQ2FsbFN0YXRlOiBkaXJlY3Rpb24iICsgc3RhdGUubURpcmVjdGlvbik7Ci0gICAgICAgICAgaWYgKHN0YXRlLm1EaXJlY3Rpb24gPT0gMSkgewotICAgICAgICAgICAgICAvL0luY29taW5nIGNhbGw6IG9mZiB0aGUgZGlyZWN0aW9uIGJpdAotICAgICAgICAgICAgIGZsYWdzID0gKGZsYWdzICYgKH5GTEFHU19ESVJFQ1RJT05fQklUKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAvL091dGdvaW5nIGNhbGw6IG9uIHRoZSBkaXJlY3Rpb24gYml0Ci0gICAgICAgICAgICAgZmxhZ3MgPSAoZmxhZ3MgfCBGTEFHU19ESVJFQ1RJT05fQklUKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RhdGUubUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgU3RyaW5nIHVyaSA9ICIiOwotICAgICAgICAgIFN0cmluZyB1cmlfc3RyID0gInRlbDoiOwotICAgICAgICAgIExvZy5pKFRBRywgInByb2Nlc3NBbmRVcGRhdGVDYWxsU3RhdGU6IGluZGV4ID0gIiArIHN0YXRlLm1JbmRleCk7Ci0gICAgICAgICAgaWYgKHN0YXRlLm1TdGF0ZSA9PSBDQ0hhbENvbnN0YW50cy5DQUxMX1NUQVRFX0FDVElWRSkgewotICAgICAgICAgICAgICBtTGF0ZXN0QWN0aXZlQ2FsbEluZGV4ID0gc3RhdGUubUluZGV4OwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubVN0YXRlID09IENDSGFsQ29uc3RhbnRzLkNBTExfU1RBVEVfSEVMRCkgewotICAgICAgICAgICAgICBtTGF0ZXN0SGVsZENhbGxJbmRleCA9IHN0YXRlLm1JbmRleDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0YXRlLm1TdGF0ZSA9PSBDQ0hhbENvbnN0YW50cy5DQUxMX1NUQVRFX0lOQ09NSU5HKSB7Ci0gICAgICAgICAgICAgIGlmIChzdGF0ZS5tTnVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIHVyaSA9IHVyaV9zdHIuY29uY2F0KHN0YXRlLm1OdW1iZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIExvZy5pKFRBRywgInByb2Nlc3NBbmRVcGRhdGVDYWxsU3RhdGU6IGluYyB1cmkgPSAiICsgdXJpKTsKLSAgICAgICAgICAgICAgdXBkYXRlSW5jb21pbmdDYWxsKHN0YXRlLm1JbmRleCwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB1cGRhdGVDYWxsU3RhdGUobGlzdE9mVmFsdWVzKTsKLSAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVBbmRVcGRhdGVXaXRoUHJldkNhbGxMaXN0IChIYXNoTWFwPEludGVnZXIsIENhbGxDb250cm9sU3RhdGU+IGN1cnJlbnRDYWxsU3RhdGVMaXN0KSB7Ci0gICAgICAgIExvZy5kKFRBRywgImNvbXBhcmVBbmRVcGRhdGVXaXRoUHJldkNhbGxMaXN0Iik7Ci0gICAgICAgIGZvciAoSW50ZWdlciBrZXk6IG1QcmV2Q2FsbFN0YXRlTGlzdC5rZXlTZXQoKSkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRDYWxsU3RhdGVMaXN0LmNvbnRhaW5zS2V5KGtleSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIC8vY3JlYXRlIGEgZmFrZSBkaXNjb25uZWN0ZWQgZm9yIHRoYXQgaW5kZXgKLSAgICAgICAgICAgICAgICBpZiAobVByZXZDYWxsU3RhdGVMaXN0LmdldChrZXkpLm1TdGF0ZSAhPSBDQ0hhbENvbnN0YW50cy5DQUxMX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbnNlcnRpbmcgRElTQyBzdGF0ZSBmYWtlISIpOwotICAgICAgICAgICAgICAgICAgICBDYWxsQ29udHJvbFN0YXRlIGZha2VEaXNjRm9yRGlzYXBwZWFyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbGxDb250cm9sU3RhdGUoa2V5LENDSGFsQ29uc3RhbnRzLkNBTExfU1RBVEVfRElTQ09OTkVDVEVELCBtUHJldkNhbGxTdGF0ZUxpc3QuZ2V0KGtleSkubUZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsU3RhdGVMaXN0LnB1dChrZXksIGZha2VEaXNjRm9yRGlzYXBwZWFyZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtUHJldkNhbGxTdGF0ZUxpc3QucHV0QWxsKG1DYWxsU3RhdGVMaXN0KTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgY2xjY1Jlc3BvbnNlKGludCBpbmRleCwgaW50IGRpcmVjdGlvbiwgaW50IGNhbGxfc3RhdHVzLCBpbnQgbW9kZSwgYm9vbGVhbiBtcHR5LAotICAgICAgICAgICAgICAgICBTdHJpbmcgbnVtYmVyLCBpbnQgdHlwZSkgewotICAgICAgICBMb2cuZChUQUcsICJjbGNjUmVzcG9uc2UiKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKLSAgICAgICAgICAgIENhbGxDb250cm9sU3RhdGUgc3RhdGUgPSBuZXcgQ2FsbENvbnRyb2xTdGF0ZShpbmRleCwgZGlyZWN0aW9uLCBjYWxsX3N0YXR1cywgbnVtYmVyKTsKLSAgICAgICAgICAgIG1DYWxsU3RhdGVMaXN0LnB1dChpbmRleCwgc3RhdGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy91cGRhdGUgdGhlIGNhbGwgc3RhdGUgdG8gc3RhY2sgYXMgMCBpbmRpY2F0ZXMgZW5kIG9mIGNhbGwgbGlzdAotICAgICAgICAgICAgY29tcGFyZUFuZFVwZGF0ZVdpdGhQcmV2Q2FsbExpc3QobUNhbGxTdGF0ZUxpc3QpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgICAgICBtc2cud2hhdCA9IFBST0NFU1NfQ0FMTF9TVEFURTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248Q2FsbENvbnRyb2xTdGF0ZT4gdmFsdWVzID0gbUNhbGxTdGF0ZUxpc3QudmFsdWVzKCk7Ci0gICAgICAgICAgICAgIEFycmF5TGlzdDxDYWxsQ29udHJvbFN0YXRlPiBsaXN0T2ZWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzKTsKLSAgICAgICAgICAgIG1zZy5vYmogPSBsaXN0T2ZWYWx1ZXM7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgaWYgKCFtTGNjV2FpdEZvclJlc3BvbnNlUS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtTGNjV2FpdEZvclJlc3BvbnNlUS5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUxjY1RvYmVRdWV1ZWQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUxjY1RvYmVRdWV1ZWQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgZ2V0QmxjYygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldEJsY2MoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImdldEJsY2MiKTsKLSAgICAgICAgaWYgKG1MY2NUb2JlUXVldWVkLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKENhbGxDb250cm9sLmxpc3RDdXJyZW50Q2FsbHMoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbUxjY1dhaXRGb3JSZXNwb25zZVEuYWRkKDEpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImdldEJsY2M6IHN1Y2Nlc3NmdWxseSBzZW50Iik7Ci0gICAgICAgICAgICAgICAgLy90ZWxlcGhvbnkgc2hvdWxkIGFsd2F5cyByZXNwb25kIHdpdGggY2xjY3Jlc3BvbnNlCi0gICAgICAgICAgICAgICAgbUNhbGxTdGF0ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1MY2NUb2JlUXVldWVkLmFkZCgxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQ2FsbFN0YXRlQ2hhbmdlKENhbGxDb250cm9sU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gUFJPQ0VTU19QSE9ORV9TVEFURV9DSEFOR0VEOwotICAgICAgICBtc2cub2JqID0gc3RhdGU7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNJbmJhbmRSaW5naW5nRW5hYmxlZCgpIHsKLSAgICAgICAgYm9vbGVhbiByZXR1cm5WYWw7Ci0KLSAgICAgICAgcmV0dXJuVmFsID0gQmx1ZXRvb3RoSGVhZHNldC5pc0luYmFuZFJpbmdpbmdTdXBwb3J0ZWQodGhpcykgJiYgIVN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBESVNBQkxFX0lOQkFORF9SSU5HSU5HX1BST1BFUlRZLCB0cnVlKTsKLSAgICAgICAgTG9nLmQoVEFHLCAiaXNJbmJhbmRSaW5naW5nRW5hYmxlZCByZXR1cm5pbmc6ICIgKyByZXR1cm5WYWwpOwotICAgICAgICByZXR1cm4gcmV0dXJuVmFsOwotICAgIH0KLQotICAgICBib29sZWFuIGlzQ2FsbEF1ZGlvTmVlZGVkKENhbGxDb250cm9sU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGlzSW5iYW5kUmluZ2luZ0VuYWJsZWQoKSAmJiBzdGF0ZS5tU3RhdGUgPT0gQ0NIYWxDb25zdGFudHMuQ0FMTF9TVEFURV9JTkNPTUlORykgewotICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2FsbEF1ZGlvICE9IG51bGwgJiYgbUNhbGxBdWRpby5pc0F1ZGlvT24oKSA9PSBmYWxzZSAmJgotICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tU3RhdGUgPT0gQ0NIYWxDb25zdGFudHMuQ0FMTF9TVEFURV9BTEVSVElORyB8fAotICAgICAgICAgICAgICAgICAgIG1QcmV2VGVsZXBob255U3RhdGUgIT0gbnVsbCAmJiBtUHJldlRlbGVwaG9ueVN0YXRlLm1OdW1BY3RpdmUgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgIHN0YXRlLm1OdW1BY3RpdmUgPT0gMSkpIHsKLQotICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyAgYm9vbGVhbiAgcGhvbmVTdGF0ZUNoYW5nZWQoaW50IG51bUFjdGl2ZSwgaW50IG51bUhlbGQsIGludCBjYWxsU3RhdGUsIFN0cmluZyBudW1iZXIsIGludCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc1ZpcnR1YWxDYWxsKSAgICB7Ci0gICAgICBMb2cuZChUQUcsICJwaG9uZVN0YXRlQ2hhbmdlZDogIiArCi0gICAgICAgICAgICAgICAgICJjYWxsU3RhdGU6ICIgKyBjYWxsU3RhdGUgKwotICAgICAgICAgICAgICAgICAibnVtYmVyOiIgKyBudW1iZXIgKwotICAgICAgICAgICAgICAgICAibnVtQWN0aXZlOiIgKyBudW1BY3RpdmUgKwotICAgICAgICAgICAgICAgICAiaXNWaXJ0dWFsQ2FsbDoiICsgaXNWaXJ0dWFsQ2FsbCk7Ci0gICAgICBDYWxsQ29udHJvbFN0YXRlIGN1cnJlbnRUZWxlcGhvbnlTdGF0ZSA9IG5ldyBDYWxsQ29udHJvbFN0YXRlKG51bUFjdGl2ZSwgbnVtSGVsZCxjYWxsU3RhdGUsIG51bWJlciwgdHlwZSwgbmFtZSk7Ci0KLSAgICAgIGlmIChpc0NhbGxBdWRpb05lZWRlZChjdXJyZW50VGVsZXBob255U3RhdGUpKSB7Ci0gICAgICAgICAgaWYgKG1DYWxsQXVkaW8gIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxBdWRpby5jb25uZWN0QXVkaW8oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm5vIENhbGxBdWRpbyBoYW5kbGUiKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobVByZXZUZWxlcGhvbnlTdGF0ZSAhPSBudWxsICYmIG1QcmV2VGVsZXBob255U3RhdGUubU51bUFjdGl2ZSA9PSAxCi0gICAgICAgICAgICAmJiBjdXJyZW50VGVsZXBob255U3RhdGUubU51bUFjdGl2ZSA9PSAwICYmIGN1cnJlbnRUZWxlcGhvbnlTdGF0ZS5tTnVtSGVsZCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZUZWxlcGhvbnlTdGF0ZS5tTnVtSGVsZCA9PSAwICYmIGN1cnJlbnRUZWxlcGhvbnlTdGF0ZS5tTnVtSGVsZCA9PSAxKSB7Ci0gICAgICAgICAgICAgTG9nLmQoVEFHLCAic3BlY2lhbCBjYXNlIHdoZXJlIEFjdGl2ZSBjYWxsIG1vdmVkIHRvIEhPTEQiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGlmIChtQ2FsbEF1ZGlvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgbUNhbGxBdWRpby5kaXNjb25uZWN0QXVkaW8oKTsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJubyBDYWxsQXVkaW8gaGFuZGxlIGZvciBkaXNjIENhbGwgaGFuZGxpbmciKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY2FsbFN0YXRlID09IENDSGFsQ29uc3RhbnRzLkNBTExfU1RBVEVfRElBTElORykgewotICAgICAgICAgIC8vaWdub3JlIHRoaXMgYXMgaXQgaXMgZmFrZSBUZWxlcGhvbnkgZXZlbnQKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLy8gU2hvdWxkIHN0b3AgYWxsIG90aGVyIGF1ZGlvIG1vZGUgaW4gdGhpcyBjYXNlCi0gICAgICBpZiAoKG51bUFjdGl2ZSArIG51bUhlbGQpID4gMCB8fCBjYWxsU3RhdGUgIT0gQ0NIYWxDb25zdGFudHMuQ0FMTF9TVEFURV9JRExFKSB7Ci0gICAgICAgICAgaWYgKCFpc1ZpcnR1YWxDYWxsICYmIG1WaXJ0dWFsQ2FsbFN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgLy8gc3RvcCB2aXJ0dWFsIHZvaWNlIGNhbGwgaWYgdGhlcmUgaXMgYW4gaW5jb21pbmcgVGVsZWNvbSBjYWxsIHVwZGF0ZQotICAgICAgICAgICAgICBzdG9wU2NvVXNpbmdWaXJ0dWFsVm9pY2VDYWxsKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByb2Nlc3NDYWxsU3RhdGVDaGFuZ2UoY3VycmVudFRlbGVwaG9ueVN0YXRlKTsKLSAgICAgICAgICBtUHJldlRlbGVwaG9ueVN0YXRlID0gY3VycmVudFRlbGVwaG9ueVN0YXRlOwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gaWdub3JlIENTIG5vbi1jYWxsIHN0YXRlIHVwZGF0ZSB3aGVuIHZpcnR1YWwgY2FsbCBzdGFydGVkCi0gICAgICAgICAgaWYgKCFpc1ZpcnR1YWxDYWxsICYmIG1WaXJ0dWFsQ2FsbFN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIklnbm9yZSBDUyBub24tY2FsbCBzdGF0ZSB1cGRhdGUiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICB9Ci0KLSAgICBwdWJsaWMgQmx1ZXRvb3RoRGV2aWNlIGdldEFjdGl2ZURldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVEZXZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb250ZW50Q29udHJvbElEKCkgewotICAgICAgICByZXR1cm4gbUNDSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gQUNUSVZFX0RFVklDRV9DSEFOR0VEOwotICAgICAgICBtc2cub2JqID0gZGV2aWNlOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0QWN0aXZlRGV2aWNlUmVtb3RlVHJpZ2dlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGlmIChtQWN0aXZlRGV2TWdyU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSBtQWN0aXZlRGV2TWdyU2VydmljZS5zZXRBY3RpdmVEZXZpY2VCbG9ja2luZyhkZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9BVURJTyk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAic2V0QWN0aXZlRGV2aWNlIHJldHVybnMiICsgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBY3RpdmVEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwotICAgICAgICBpZiAobUFjdGl2ZURldk1nclNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0ID0gKGRldmljZSA9PSBtQWN0aXZlRGV2TWdyU2VydmljZS5nZXRBY3RpdmVEZXZpY2UoQXBtQ29uc3QuQXVkaW9GZWF0dXJlcy5DQUxMX0FVRElPKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAiaXNBY3RpdmVEZXZpY2UgcmV0dXJucyIgKyByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uQ2FsbENvbnRyb2xQb2ludENoYW5nZWRSZXF1ZXN0KGludCBvcCwgaW50W10gY2FsbF9pbmRpY2VzLCBpbnQgY291bnQsIFN0cmluZyBkaWFsTnVtYmVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlICkgewotICAgICAgIExvZy5kKFRBRywgIiBvbkNhbGxDb250cm9sUG9pbnRDaGFuZ2VkUmVxdWVzdCBvcGNvZGUgIDogIiArIENDSGFsQ29uc3RhbnRzLm9wZXJhdGlvblRvU3RyaW5nKG9wKSkgOwotICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgY2FzZSBDQ0hhbENvbnN0YW50cy5CVENDX09QX0FDQ0VQVDogewotICAgICAgICAgICAgc2V0QWN0aXZlRGV2aWNlUmVtb3RlVHJpZ2dlciAoZGV2aWNlKTsKLSAgICAgICAgICAgIENhbGxDb250cm9sLmFuc3dlckNhbGwoZGV2aWNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBDQ0hhbENvbnN0YW50cy5CVENDX09QX1RFUk1JTkFURTogewotICAgICAgICAgICAgaW50IGNhbGxJbmRleCA9IGNhbGxfaW5kaWNlc1swXTsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImNhbGxJbmRleDogIiArIGNhbGxJbmRleCk7Ci0gICAgICAgICAgICBDYWxsQ29udHJvbC50ZXJtaW5hdGVDYWxsKGRldmljZSwgY2FsbEluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBDQ0hhbENvbnN0YW50cy5CVENDX09QX0xPQ0FMX0hMRDp7Ci0gICAgICAgICAgICBpbnQgY2FsbEluZGV4ID0gY2FsbF9pbmRpY2VzWzBdOwotICAgICAgICAgICAgaW50IHJlczsKLSAgICAgICAgICAgIGludCBpZHggPSBDQ0hhbENvbnN0YW50cy5CVENDX0RFRl9JTkRFWF9GT1JfRkFJTFVSRVM7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJjYWxsSW5kZXg6ICIgKyBjYWxsSW5kZXgpOwotICAgICAgICAgICAgaWYgKENhbGxDb250cm9sLmhvbGRDYWxsKGRldmljZSwgY2FsbEluZGV4KSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9TVUNDRVNTOwotICAgICAgICAgICAgICAgIGlkeCA9IGNhbGxJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9OT1RfUE9TU0lCTEU7Ci0gICAgICAgICAgICAgICAgaWR4ID0gQ0NIYWxDb25zdGFudHMuQlRDQ19ERUZfSU5ERVhfRk9SX0ZBSUxVUkVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ2FsbENvbnRyb2xSZXNwb25zZShvcCwgaWR4LCByZXMsIGRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9MT0NBTF9SRVRSSUVWRTogewotICAgICAgICAgICAgIC8vQW5hbG9ndXMgdG8gU1dBUCBhcyBzdGFjayB3b3VsZCBoYXZlCi0gICAgICAgICAgICAgLy9hbHJlYWR5IHZhbGlkYXRlZCB0aGUgaW5wdXQgaW5kZXggaXMgaW4gSEVMRCBzdGF0ZQotICAgICAgICAgICAgaW50IGNobGQgPSAyOwotICAgICAgICAgICAgaW50IHJlczsKLSAgICAgICAgICAgIGludCBpZHggPSBDQ0hhbENvbnN0YW50cy5CVENDX0RFRl9JTkRFWF9GT1JfRkFJTFVSRVM7Ci0gICAgICAgICAgICBpZiAoQ2FsbENvbnRyb2wucHJvY2Vzc0NobGQoZGV2aWNlLCBjaGxkKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9TVUNDRVNTOwotICAgICAgICAgICAgICAgIGlkeCA9IGNhbGxfaW5kaWNlc1swXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9OT1RfUE9TU0lCTEU7Ci0gICAgICAgICAgICAgICAgaWR4ID0gQ0NIYWxDb25zdGFudHMuQlRDQ19ERUZfSU5ERVhfRk9SX0ZBSUxVUkVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ2FsbENvbnRyb2xSZXNwb25zZShvcCwgaWR4LCByZXMsIGRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9PUklHSU5BVEU6IHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk9yaWduYXRlOiBmcm9tIERldmljZTogIiArIGRldmljZSArICJkaWFsU3RyaW5nOiAiICsgZGlhbE51bWJlcik7Ci0gICAgICAgICAgICBpZiAoZGlhbE51bWJlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAibnVsbCBkaWFsIHN0cmluZyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DYWxsT3JpZ2luYXRlZERldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiT3JpZ2luYXRlIGlzIHBlbmRpbmcgZnJvbSBkZXZpY2U6ICIgKyBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxDb250cm9sUmVzcG9uc2Uob3AsIENDSGFsQ29uc3RhbnRzLkJUQ0NfREVGX0lOREVYX0ZPUl9GQUlMVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDSGFsQ29uc3RhbnRzLkJUQ0NfT1BfTk9UX1BPU1NJQkxFLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRBY3RpdmVEZXZpY2VSZW1vdGVUcmlnZ2VyIChkZXZpY2UpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGRpYWxOdW1iZXIuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpZiAoQ2FsbENvbnRyb2wuZGlhbE91dGdvaW5nQ2FsbChkZXZpY2UsIHJlc3VsdFsxXSkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FsbENvbnRyb2xSZXNwb25zZShvcCwgQ0NIYWxDb25zdGFudHMuQlRDQ19ERUZfSU5ERVhfRk9SX0ZBSUxVUkVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9OT1RfUE9TU0lCTEUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIENDSGFsQ29uc3RhbnRzLkJUQ0NfT1BfSk9JTjogewotICAgICAgICAgICAgIC8vU3RhY2sgd291bGQgaGF2ZSB2YWxpZGF0ZSB0byBlbnN1cmUgdGhlIGlucHV0IGluZGljaWVzCi0gICAgICAgICAgICAgLy9hcmUgdmFsaWQgY2FuZGlkYXRlcyBmb3IgSk9JTiBvcAotICAgICAgICAgICAgaW50IGNobGQgPSAzOwotICAgICAgICAgICAgaW50IHJlczsKLSAgICAgICAgICAgIGludCBpZHggPSBDQ0hhbENvbnN0YW50cy5CVENDX0RFRl9JTkRFWF9GT1JfRkFJTFVSRVM7Ci0gICAgICAgICAgICBpZiAoQ2FsbENvbnRyb2wucHJvY2Vzc0NobGQoZGV2aWNlLCBjaGxkKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9TVUNDRVNTOwotICAgICAgICAgICAgICAgIGlkeCA9IGNhbGxfaW5kaWNlc1swXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9OT1RfUE9TU0lCTEU7Ci0gICAgICAgICAgICAgICAgaWR4ID0gQ0NIYWxDb25zdGFudHMuQlRDQ19ERUZfSU5ERVhfRk9SX0ZBSUxVUkVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ2FsbENvbnRyb2xSZXNwb25zZShvcCwgaWR4LCByZXMsIGRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb250cm9sSW5pdGlhbGl6ZWQoaW50IHN0YXR1cykgewotICAgICAgIExvZy52KFRBRywgIkNhbGxDb250cm9sSW5pdGlhbGl6ZWRDYWxsYmFjazogc3RhdHVzPSIgKyBzdGF0dXMpOwotICAgICAgIGlmIChzdGF0dXMgPT0gMCkgIHsKLSAgICAgICAgICAgLy9Jbml0aWFsaXplIFRlbGVwaG9ueSBhbmQgQVBNIHJlbGF0ZWQgSW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgQ2FsbENvbnRyb2wubGlzdGVuRm9yUGhvbmVTdGF0ZShQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEV8UGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFKTsKLSAgICAgICAgICAgdXBkYXRlQ29udGVudENvbnRyb2xJRChDQ19DT05URU5UX0NPTlRST0xfSUQpOwotICAgICAgICAgICB1cGRhdGVTdXBwb3J0ZWRCZWFyZXJMaXN0KCJ0ZWwiKTsKLSAgICAgICAgICAgdXBkYXRlQ2FsbENvbnRyb2xPcHRpb25hbEZlYXR1cmVzKENBTExfQ09OVFJPTF9PUFRJT05BTF9GRUFUVVJFUyk7Ci0gICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0dXMpIHsKLSAgICAgICBMb2cudihUQUcsICJvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ6IGFkZHJlc3M9IiArIGRldmljZS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmICghQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0JPTkRfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLkVSUk9SKTsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwotICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChkZXZpY2UsICJBQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEIHdpdGggbm8gRVhUUkFfREVWSUNFIik7Ci0gICAgICAgICAgICBib25kU3RhdGVDaGFuZ2VkKGRldmljZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBib25kU3RhdGVDaGFuZ2VkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBib25kU3RhdGUpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQm9uZCBzdGF0ZSBjaGFuZ2VkIGZvciBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIHN0YXRlOiAiICsgYm9uZFN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZW1vdmUgc3RhdGUgbWFjaGluZSBpZiB0aGUgYm9uZGluZyBmb3IgYSBkZXZpY2UgaXMgcmVtb3ZlZAotICAgICAgICBpZiAoYm9uZFN0YXRlICE9IEJsdWV0b290aERldmljZS5CT05EX05PTkUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbGxMaXN0Q29udGFpbnNEaWFsaW5nQ2FsbChBcnJheUxpc3Q8Q2FsbENvbnRyb2xTdGF0ZT4gbGlzdE9mVmFsdWVzKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoQ2FsbENvbnRyb2xTdGF0ZSBzdGF0ZSA6IGxpc3RPZlZhbHVlcykgewotICAgICAgICAgICAgaWYgKHN0YXRlLm1TdGF0ZSA9PSBDQ0hhbENvbnN0YW50cy5DQUxMX1NUQVRFX0RJQUxJTkcKLSAgICAgICAgICAgICAgICB8fCBzdGF0ZS5tU3RhdGUgPT0gQ0NIYWxDb25zdGFudHMuQ0FMTF9TVEFURV9BTEVSVElORykgewotICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAgLyoqIEhhbmRsZXMgQ0NTIG1lc3NhZ2VzLiAqLwotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2NzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBDY3NNZXNzYWdlSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICB9Ci0gICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJDY3NNZXNzYWdlSGFuZGxlcjogcmVjZWl2ZWQgbWVzc2FnZT0iICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtc2cud2hhdCkpOwotICAgICAgICAgICBBcnJheUxpc3Q8Q2FsbENvbnRyb2xTdGF0ZT4gbGlzdE9mVmFsdWVzID0gbnVsbDsKLSAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQkVBUkVSX05BTUU6Ci0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGJOYW1lID0gKFN0cmluZyltc2cub2JqOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudXBkYXRlQmVhcmVyUHJvdmlkZXJOYW1lKGJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0JFQVJFUl9URUNIOgotICAgICAgICAgICAgICAgICAgIGludCB0ZWNoX3R5cGUgPSAoaW50KW1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudXBkYXRlQmVhcmVyVGVjaG5vbG9neSh0ZWNoX3R5cGUpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfU0lHTkFMX1NUUkVOR1RIOgotICAgICAgICAgICAgICAgICAgIGludCBzaWduYWwgPSAoaW50KW1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudXBkYXRlU2lnbmFsU3RyZW5ndGgoc2lnbmFsKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1NUQVRVU19GTEFHUzoKLSAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzRmxhZ3MgPSAoaW50KW1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudXBkYXRlU3RhdHVzRmxhZ3Moc3RhdHVzRmxhZ3MpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQkVBUkVSTElTVF9TVVBQT1JURUQgOgotICAgICAgICAgICAgICAgICAgIFN0cmluZyBiU0xpc3QgPSAoU3RyaW5nKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS51cGRhdGVTdXBwb3J0ZWRCZWFyZXJMaXN0KGJTTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIFVQREFURV9DT05URU5UX0NPTlRST0xfSUQ6Ci0gICAgICAgICAgICAgICAgICAgaW50IGNjaWQgPSAoaW50KW1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuY29udGVudENvbnRyb2xJZChjY2lkKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0NBTExfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgbGlzdE9mVmFsdWVzID0gKEFycmF5TGlzdDxDYWxsQ29udHJvbFN0YXRlPiltc2cub2JqOwotICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNhbGwgbGlzdCBzaXplIDogIiArIGxpc3RPZlZhbHVlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gbU5hdGl2ZUludGVyZmFjZS5jYWxsU3RhdGUobGlzdE9mVmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICBpZiAobUNhbGxPcmlnaW5hdGVkRGV2aWNlICE9IG51bGwgJiYgY2FsbExpc3RDb250YWluc0RpYWxpbmdDYWxsKGxpc3RPZlZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicHVzaCB0aGUgcGVuZGluZyBPcmlnaW5hdGUgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgLy9TdGFjayB3aWxsIHBpY2sgdGhlIHJpZ2h0IGluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxDb250cm9sUmVzcG9uc2UoQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9PUklHSU5BVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENDSGFsQ29uc3RhbnRzLkJUQ0NfREVGX0lOREVYX0ZPUl9GQUlMVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NIYWxDb25zdGFudHMuQlRDQ19PUF9TVUNDRVNTLCBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbE9yaWdpbmF0ZWREZXZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0NBTExfQ09OVFJPTF9PUENPREVTX1NVUFBPUlRFRCA6Ci0gICAgICAgICAgICAgICAgICAgaW50IGZlYXR1cmUgPSAoaW50KW1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuY2FsbENvbnRyb2xPcHRpb25hbEZlYXR1cmVzKGZlYXR1cmUpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQ0FMTF9DT05UUk9MX1JFU1BPTlNFIDoKLSAgICAgICAgICAgICAgICAgICBpbnQgb3AgPSAoaW50KW1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgIGludCBpbmQgPSAoaW50KW1zZy5hcmcyOwotICAgICAgICAgICAgICAgICAgIGludCBzdCA9IChpbnQpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLmNhbGxDb250cm9sUmVzcG9uc2Uob3AsIGluZCwgc3QsIG51bGwpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfSU5DT01JTkdfQ0FMTCA6Ci0gICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gKGludCltc2cuYXJnMTsKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZyltc2cub2JqOwotICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudXBkYXRlSW5jb21pbmdDYWxsKGluZGV4LCB1cmkpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBQUk9DRVNTX1BIT05FX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgZ2V0QmxjYygpOwotICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSBQUk9DRVNTX0NBTExfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgbGlzdE9mVmFsdWVzID0gKEFycmF5TGlzdDxDYWxsQ29udHJvbFN0YXRlPiltc2cub2JqOwotICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBbmRVcGRhdGVDYWxsU3RhdGUobGlzdE9mVmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgQUNUSVZFX0RFVklDRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSAoQmx1ZXRvb3RoRGV2aWNlKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5zZXRBY3RpdmVEZXZpY2UoZGV2aWNlLC0xKTsKLSAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ1bmtub3duIG1lc3NhZ2UhIG1zZy53aGF0PSIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1zZy53aGF0KSk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIExvZy52KFRBRywgIkV4aXQgaGFuZGxlTWVzc2FnZSIpOwotICAgICAgfQotfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWVzc2FnZVdoYXRUb1N0cmluZyhpbnQgd2hhdCkgewotICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgVVBEQVRFX0JFQVJFUl9OQU1FIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVQREFURV9CRUFSRVJfTkFNRSI7Ci0gICAgICAgICAgICBjYXNlIFVQREFURV9CRUFSRVJfVEVDSCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVUERBVEVfQkVBUkVSX1RFQ0giOwotICAgICAgICAgICAgY2FzZSBVUERBVEVfU0lHTkFMX1NUUkVOR1RIIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVQREFURV9TSUdOQUxfU1RSRU5HVEgiOwotICAgICAgICAgICAgY2FzZSBVUERBVEVfQkVBUkVSTElTVF9TVVBQT1JURUQgOgotICAgICAgICAgICAgICAgIHJldHVybiAiVVBEQVRFX0JFQVJFUkxJU1RfU1VQUE9SVEVEIjsKLSAgICAgICAgICAgIGNhc2UgVVBEQVRFX0NPTlRFTlRfQ09OVFJPTF9JRCA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVUERBVEVfQ09OVEVOVF9DT05UUk9MX0lEIjsKLSAgICAgICAgICAgIGNhc2UgVVBEQVRFX0NBTExfU1RBVEUgOgotICAgICAgICAgICAgICAgIHJldHVybiAiVVBEQVRFX0NBTExfU1RBVEUiOwotICAgICAgICAgICAgY2FzZSBVUERBVEVfQ0FMTF9DT05UUk9MX09QQ09ERVNfU1VQUE9SVEVEIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVQREFURV9DQUxMX0NPTlRST0xfT1BDT0RFU19TVVBQT1JURUQgIjsKLSAgICAgICAgICAgIGNhc2UgVVBEQVRFX0NBTExfQ09OVFJPTF9SRVNQT05TRSA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVUERBVEVfQ0FMTF9DT05UUk9MX1JFU1BPTlNFIjsKLSAgICAgICAgICAgIGNhc2UgVVBEQVRFX0lOQ09NSU5HX0NBTEwgIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVQREFURV9JTkNPTUlOR19DQUxMIjsKLSAgICAgICAgICAgIGNhc2UgUFJPQ0VTU19DQUxMX1NUQVRFIDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlBST0NFU1NfQ0FMTF9TVEFURSI7Ci0gICAgICAgICAgICBjYXNlIFVQREFURV9TVEFUVVNfRkxBR1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVUERBVEVfU1RBVFVTX0ZMQUdTIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcod2hhdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmluZGVyIG9iamVjdDogbXVzdCBiZSBhIHN0YXRpYyBjbGFzcyBvciBtZW1vcnkgbGVhayBtYXkgb2NjdXIuCi0gICAgICovCi0KLSAgICBzdGF0aWMgY2xhc3MgQ2NCaW5kZXIgZXh0ZW5kcyBCaW5kZXIgaW1wbGVtZW50cyBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgewotICAgICAgICBwcml2YXRlIENDU2VydmljZSBtU2VydmljZTsKLQotICAgICAgICBwcml2YXRlIENDU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgICAgICAgICAgaWYgKCFVdGlscy5jaGVja0NhbGxlcklzU3lzdGVtT3JBY3RpdmVVc2VyKFRBRykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgbVNlcnZpY2UuaXNBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2NCaW5kZXIoQ0NTZXJ2aWNlIHN2YykgewotICAgICAgICAgICAgbVNlcnZpY2UgPSBzdmM7Ci0gICAgICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9jYy9DYWxsQ29udHJvbFN0YXRlLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2NjL0NhbGxDb250cm9sU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlYjY1YS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2NjL0NhbGxDb250cm9sU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKkNvcHlyaWdodCAoYykgMjAyMC0yMDIxLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotLyoKLSAqIENvcHlyaWdodCAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmNjOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBBIGJsb2Igb2YgZGF0YSByZXByZXNlbnRpbmcgYW4gb3ZlcmFsbCBjYWxsIHN0YXRlIG9uIHRoZSBwaG9uZQotICovCi1jbGFzcyBDYWxsQ29udHJvbFN0YXRlIHsKLQotICAgICBpbnQgbUluZGV4OwotICAgIC8qKgotICAgICAqIE51bWJlciBvZiBhY3RpdmUgY2FsbHMKLSAgICAgKi8KLSAgICBpbnQgbU51bUFjdGl2ZTsKLSAgICAvKioKLSAgICAgKiBOdW1iZXIgb2YgaGVsZCBjYWxscwotICAgICAqLwotICAgIGludCBtTnVtSGVsZDsKLSAgICAvKioKLSAgICAgKiBDdXJyZW50IGNhbGwgc2V0dXAgc3RhdGUKLSAgICAgKi8KLSAgICBpbnQgbVN0YXRlOwotICAgIC8qKgotICAgICAqIEN1cnJlbnRseSBhY3RpdmUgY2FsbCdzIHBob25lIG51bWJlcgotICAgICAqLwotICAgIFN0cmluZyBtTnVtYmVyOwotICAgIC8qKgotICAgICAqIFBob25lIG51bWJlciB0eXBlCi0gICAgICovCi0gICAgaW50IG1UeXBlOwotCi0gICAgLyoqCi0gICAgICogIGZsYWdzIHRvIGRlZmluZSBkaXJlY3Rpb24sIGluZm9ybWF0aW9uIHdpdGhlbGQgYnkgbmV0d29yayBvciBzZXJ2ZXIuCi0gICAgICovCi0gICAgIGludCBtRmxhZ3M7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZXIgZGlzcGxheSBuYW1lCi0gICAgICovCi0gICAgU3RyaW5nIG1OYW1lOwotCi0gICAgaW50IG1EaXJlY3Rpb247Ci0KLSAgICBDYWxsQ29udHJvbFN0YXRlKGludCBudW1BY3RpdmUsIGludCBudW1IZWxkLCBpbnQgY2FsbFN0YXRlLCBTdHJpbmcgbnVtYmVyLCBpbnQgdHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1OdW1BY3RpdmUgPSBudW1BY3RpdmU7Ci0gICAgICAgIG1OdW1IZWxkID0gbnVtSGVsZDsKLSAgICAgICAgbVN0YXRlID0gY2FsbFN0YXRlOwotICAgICAgICBtTnVtYmVyID0gbnVtYmVyOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICB9Ci0gICAgQ2FsbENvbnRyb2xTdGF0ZShpbnQgaW5kZXgsIGludCBjYWxsU3RhdGUsIGludCBmbGFncykgewotICAgICAgICAgbUluZGV4ICA9IGluZGV4OwotICAgICAgICAgbVN0YXRlID0gY2FsbFN0YXRlOwotICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgfQotICAgIENhbGxDb250cm9sU3RhdGUoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uLCBpbnQgY2FsbFN0YXRlLCBTdHJpbmcgbnVtYmVyKSB7Ci0gICAgICAgICBtSW5kZXggID0gaW5kZXg7Ci0gICAgICAgICBtRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgICAgICAgbVN0YXRlID0gY2FsbFN0YXRlOwotICAgICAgICAgbU51bWJlciA9IG51bWJlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvZ3JvdXBjbGllbnQvR3JvdXBBcHBNYXAuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvZ3JvdXBjbGllbnQvR3JvdXBBcHBNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNzVlNC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2dyb3VwY2xpZW50L0dyb3VwQXBwTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguZ3JvdXBjbGllbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoR3JvdXBDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHcm91cENhbGxiYWNrOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotLyogVGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiByZWdpc3RlcmVkIEdyb3VwQ2xpZW50IGFwcGxpY2F0aW9ucyBhbmQKLSAqIG1hbmFnaW5nIGNhbGxiYWNrcyB0byBiZSBnaXZlbiB0byBhcHByb3ByaWF0ZSBhcHAgb3IgbW9kdWxlICovCi0KLXB1YmxpYyBjbGFzcyBHcm91cEFwcE1hcCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEdyb3VwQXBwTWFwIjsKLQotICAgIGNsYXNzIEdyb3VwQ2xpZW50QXBwIHsKLSAgICAgICAgLyogVGhlIFVVSUQgb2YgdGhlIGFwcGxpY2F0aW9uICovCi0gICAgICAgIHB1YmxpYyBVVUlEIHV1aWQ7Ci0KLSAgICAgICAgLyogVGhlIGlkIG9mIHRoZSBhcHBsaWNhdGlvbiAqLwotICAgICAgICBwdWJsaWMgaW50IGFwcElkOwotCi0gICAgICAgIC8qIGZsYWcgdG8gZGV0ZXJtaW5lIGlmIEJsdWV0b290aCBtb2R1bGUgaGFzIHJlZ2lzdGVyZWQuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYWw7Ci0KLSAgICAgICAgLyogQ2FsbGJhY2tzIHRvIGJlIGdpdmVuIHRvIGFwcGxpY2F0aW9uICovCi0gICAgICAgIHB1YmxpYyBJQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayBhcHBDYjsKLQotICAgICAgICAvKiBDYWxsYmFja3MgdG8gYmUgZ2l2ZW4gdG8gcmVnaXN0ZXJlZCBCbHVldG9vdGggbW9kdWxlcyovCi0gICAgICAgIHB1YmxpYyBCbHVldG9vdGhHcm91cENhbGxiYWNrICBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkOwotCi0gICAgICAgIC8qKiBEZWF0aCByZWNlaXBpZW50ICovCi0gICAgICAgIHByaXZhdGUgSUJpbmRlci5EZWF0aFJlY2lwaWVudCBtRGVhdGhSZWNpcGllbnQ7Ci0KLSAgICAgICAgR3JvdXBDbGllbnRBcHAoVVVJRCB1dWlkLCBib29sZWFuIGlzTG9jYWwsIElCbHVldG9vdGhHcm91cENhbGxiYWNrIGFwcENiLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEdyb3VwQ2FsbGJhY2sgIGxvY2FsQ2FsbGJhY2tzKSB7Ci0gICAgICAgICAgICB0aGlzLnV1aWQgPSB1dWlkOwotICAgICAgICAgICAgdGhpcy5pc0xvY2FsID0gaXNMb2NhbDsKLSAgICAgICAgICAgIHRoaXMuYXBwQ2IgPSBhcHBDYjsKLSAgICAgICAgICAgIHRoaXMubUNhbGxiYWNrID0gbG9jYWxDYWxsYmFja3M7Ci0gICAgICAgICAgICB0aGlzLmlzUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBhcHBVdWlkcy5hZGQodXVpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVG8gbGluayBkZWF0aCByZWNpcGllbnQKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgbGlua1RvRGVhdGgoSUJpbmRlci5EZWF0aFJlY2lwaWVudCBkZWF0aFJlY2lwaWVudCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQmluZGVyIGJpbmRlciA9ICgoSUludGVyZmFjZSkgYXBwQ2IpLmFzQmluZGVyKCk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmxpbmtUb0RlYXRoKGRlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSBkZWF0aFJlY2lwaWVudDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGxpbmsgZGVhdGhSZWNpcGllbnQgZm9yIGFwcElkOiAiICsgYXBwSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBMaXN0PEdyb3VwQ2xpZW50QXBwPiBtQXBwcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxHcm91cENsaWVudEFwcD4oKSk7Ci0KLSAgICBBcnJheUxpc3Q8VVVJRD4gYXBwVXVpZHMgPSBuZXcgQXJyYXlMaXN0PFVVSUQ+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gZW50cnkgdG8gdGhlIGFwcGxpY2F0aW9uIGxpc3QuCi0gICAgICovCi0gICAgR3JvdXBDbGllbnRBcHAgYWRkKFVVSUQgdXVpZCwgYm9vbGVhbiBpc0xvY2FsLCBJQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayBhcHBDYiwKLSAgICAgICAgICAgIEJsdWV0b290aEdyb3VwQ2FsbGJhY2sgIGxvY2FsQ2FsbGJhY2spIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXBwcykgewotICAgICAgICAgICAgR3JvdXBDbGllbnRBcHAgYXBwID0gbmV3IEdyb3VwQ2xpZW50QXBwKHV1aWQsIGlzTG9jYWwsIGFwcENiLCBsb2NhbENhbGxiYWNrKTsKLSAgICAgICAgICAgIG1BcHBzLmFkZChhcHApOwotICAgICAgICAgICAgcmV0dXJuIGFwcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgZW50cnkgZm9yIGEgZ2l2ZW4gVVVJRAotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlKFVVSUQgdXVpZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBzKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxHcm91cENsaWVudEFwcD4gaSA9IG1BcHBzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBHcm91cENsaWVudEFwcCBlbnRyeSA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS51dWlkLmVxdWFscyh1dWlkKSkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeS5pc1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBlbnRyeSBmb3IgYSBnaXZlbiBhcHBsaWNhdGlvbiBJRC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZShpbnQgYXBwSWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXBwcykgewotICAgICAgICAgICAgSXRlcmF0b3I8R3JvdXBDbGllbnRBcHA+IGkgPSBtQXBwcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgR3JvdXBDbGllbnRBcHAgZW50cnkgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuYXBwSWQgPT0gYXBwSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuaXNSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBHcm91cENsaWVudCBhcHBsaWNhdGlvbiBieSBVVUlELgotICAgICAqLwotICAgIEdyb3VwQ2xpZW50QXBwIGdldEJ5VXVpZChVVUlEIHV1aWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXBwcykgewotICAgICAgICAgICAgSXRlcmF0b3I8R3JvdXBDbGllbnRBcHA+IGkgPSBtQXBwcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgR3JvdXBDbGllbnRBcHAgZW50cnkgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkudXVpZC5lcXVhbHModXVpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMb2cuZShUQUcsICJBcHAgbm90IGZvdW5kIGZvciBVVUlEICIgKyB1dWlkKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgR3JvdXBDbGllbnQgYXBwbGljYXRpb24gYnkgYXBwSWQuCi0gICAgICovCi0gICAgR3JvdXBDbGllbnRBcHAgZ2V0QnlJZChpbnQgYXBwSWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXBwcykgewotICAgICAgICAgICAgSXRlcmF0b3I8R3JvdXBDbGllbnRBcHA+IGkgPSBtQXBwcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgR3JvdXBDbGllbnRBcHAgZW50cnkgPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuYXBwSWQgPT0gYXBwSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMb2cuZShUQUcsICJHcm91cENsaWVudCBBcHAgbm90IGZvdW5kIGZvciBhcHBJZCAiICsgYXBwSWQpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2dyb3VwY2xpZW50L0dyb3VwQ2xpZW50TmF0aXZlSW50ZXJmYWNlLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2dyb3VwY2xpZW50L0dyb3VwQ2xpZW50TmF0aXZlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTA3NmYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9ncm91cGNsaWVudC9Hcm91cENsaWVudE5hdGl2ZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmdyb3VwY2xpZW50OwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotLyoqCi0gKiBDU0lQIENsaWVudCBOYXRpdmUgSW50ZXJmYWNlIHRvL2Zyb20gSk5JLgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBDbGllbnROYXRpdmVJbnRlcmZhY2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoR3JvdXBOYXRpdmVJbnRmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwotCi0gICAgQEd1YXJkZWRCeSgiSU5TVEFOQ0VfTE9DSyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JvdXBDbGllbnROYXRpdmVJbnRlcmZhY2Ugc0luc3RhbmNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJTlNUQU5DRV9MT0NLID0gbmV3IE9iamVjdCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHcm91cENsaWVudE5hdGl2ZUludGVyZmFjZSgpIHsKLSAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cud3RmU3RhY2soVEFHLCAiTm8gQmx1ZXRvb3RoIEFkYXB0ZXIgQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JvdXBDbGllbnROYXRpdmVJbnRlcmZhY2UgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoSU5TVEFOQ0VfTE9DSykgewotICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEdyb3VwQ2xpZW50TmF0aXZlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc0luc3RhbmNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIG5hdGl2ZSBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBwcmlvcml0aWVzIHRvIGNvbmZpZ3VyZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICBpbml0TmF0aXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYW51cCB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICBjbGVhbnVwTmF0aXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgQ1NJUCBhcHAgd2l0aCB0aGUgc3RhY2sgY29kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcHBVdWlkTHNiIGxzYiBvZiBhcHAgdXVpZC4KLSAgICAgKiBAcGFyYW0gYXBwVXVpZE1zYiBtc2Igb2YgYXBwIHV1aWQuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDc2lwQXBwKGxvbmcgYXBwVXVpZExzYiwgbG9uZyBhcHBVdWlkTXNiKSB7Ci0gICAgICAgcmVnaXN0ZXJDc2lwQXBwTmF0aXZlKGFwcFV1aWRMc2IsIGFwcFV1aWRNc2IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIENTSVAgYXBwIHdpdGggdGhlIHN0YWNrIGNvZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBwSWQgSUQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVucmVnaXN0ZXJlZC4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ3NpcEFwcChpbnQgYXBwSWQpIHsKLSAgICAgICB1bnJlZ2lzdGVyQ3NpcEFwcE5hdGl2ZShhcHBJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlIGxvY2sgdmFsdWUgb2YgdGhlIGNvb3JkaW5hdGVkIHNldCBtZW1iZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcHBJZCBJRCBvZiB0aGUgYXBwbGljYXRpb24gd2hpY2ggaXMgcmVxdWVzdGluZyBjaGFuZ2UgaW4gbG9jayBzdGF0dXMKLSAgICAgKiBAcGFyYW0gc2V0SWQgSWRlbnRpZmllciBvZiB0aGUgc2V0Ci0gICAgICogQHBhcmFtIGRldmljZXMgTGlzdCBvZiBibHVldG9vdGggZGV2aWNlcyBmb3Igd2hpY2sgbG9jayBzdGF0dXMgY2hhbmdlIGlzIHJlcXVpcmVkCi0gICAgICogQHBhcmFtIHZhbHVlIExvY2svVW5sb2NrIHZhbHVlCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIHZvaWQgc2V0TG9ja1ZhbHVlKGludCBhcHBJZCwgaW50IHNldElkLCBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcywKLSAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKLSAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgaW50IHNpemUgPSAoKGRldmljZXMgIT0gbnVsbCkgPyBkZXZpY2VzLnNpemUoKSA6IDApOwotICAgICAgIFN0cmluZ1tdIGRldmljZXNMaXN0ID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlc0xpc3RbaSsrXSA9IGRldmljZS50b1N0cmluZygpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHNldExvY2tWYWx1ZU5hdGl2ZShhcHBJZCwgc2V0SWQsIHZhbHVlLCBkZXZpY2VzTGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGVzIENzaXAgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0U2V0RGV2aWNlKGludCBhcHBJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gY29ubmVjdFNldERldmljZU5hdGl2ZShhcHBJZCwgZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgQ3NpcCBmcm9tIGEgcmVtb3RlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RTZXREZXZpY2UoaW50IGFwcElkLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBkaXNjb25uZWN0U2V0RGV2aWNlTmF0aXZlKGFwcElkLCBnZXRCeXRlQWRkcmVzcyhkZXZpY2UpKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIGdldERldmljZShieXRlW10gYWRkcmVzcykgewotICAgICAgICByZXR1cm4gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVBZGRyZXNzKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gVXRpbHMuZ2V0Qnl0ZXNGcm9tQWRkcmVzcygiMDA6MDA6MDA6MDA6MDA6MDAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVXRpbHMuZ2V0Qnl0ZXNGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Dc2lwQXBwUmVnaXN0ZXJlZCAoaW50IHN0YXR1cywgaW50IGFwcElkLAotICAgICAgICAgICAgbG9uZyB1dWlkTHNiLCBsb25nIHV1aWRNc2IpIHsKLSAgICAgICAgVVVJRCB1dWlkID0gbmV3IFVVSUQodXVpZE1zYiwgdXVpZExzYik7Ci0KLSAgICAgICAgR3JvdXBTZXJ2aWNlIHNlcnZpY2UgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2Uub25Dc2lwQXBwUmVnaXN0ZXJlZChzdGF0dXMsIGFwcElkLCB1dWlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IGFwcElkLCBTdHJpbmcgYmRBZGRyLAotICAgICAgICAgICAgaW50IHN0YXRlLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVtb3RlRGV2aWNlKGJkQWRkcik7Ci0KLSAgICAgICAgR3JvdXBTZXJ2aWNlIHNlcnZpY2UgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkIChhcHBJZCwgZGV2aWNlLCBzdGF0ZSwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbk5ld1NldEZvdW5kIChpbnQgc2V0SWQsIFN0cmluZyBiZEFkZHIsIGludCBzaXplLCBieXRlW10gc2lyaywKLSAgICAgICAgICAgIGxvbmcgdXVpZExzYiwgbG9uZyB1dWlkTXNiLCBib29sZWFuIGxvY2tTdXBwb3J0KSB7Ci0gICAgICAgIFVVSUQgdXVpZCA9IG5ldyBVVUlEKHV1aWRNc2IsIHV1aWRMc2IpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlbW90ZURldmljZShiZEFkZHIpOwotCi0gICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLm9uTmV3U2V0Rm91bmQoc2V0SWQsIGRldmljZSwgc2l6ZSwgc2lyaywgdXVpZCwgbG9ja1N1cHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uTmV3U2V0TWVtYmVyRm91bmQgKGludCBzZXRJZCwgU3RyaW5nIGJkQWRkcikgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0KLSAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuZ2V0UmVtb3RlRGV2aWNlKGJkQWRkcik7Ci0KLSAgICAgICAgR3JvdXBTZXJ2aWNlIHNlcnZpY2UgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2Uub25OZXdTZXRNZW1iZXJGb3VuZChzZXRJZCwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkxvY2tTdGF0dXNDaGFuZ2VkIChpbnQgYXBwSWQsIGludCBzZXRJZCwgaW50IHZhbHVlLAotICAgICAgICAgICAgaW50IHN0YXR1cywgU3RyaW5nW10gYmRBZGRyKSB7Ci0gICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBsb2NrTWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICBmb3IgKFN0cmluZyBhZGRyZXNzOiBiZEFkZHIpIHsKLSAgICAgICAgICAgIGxvY2tNZW1iZXJzLmFkZChtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcy50b1VwcGVyQ2FzZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IEdyb3VwU2VydmljZS5nZXRHcm91cFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZS5vbkxvY2tTdGF0dXNDaGFuZ2VkKGFwcElkLCBzZXRJZCwgdmFsdWUsIHN0YXR1cywgbG9ja01lbWJlcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uTG9ja0F2YWlsYWJsZSAoaW50IGFwcElkLCBpbnQgc2V0SWQsIFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLm9uTG9ja0F2YWlsYWJsZShhcHBJZCwgc2V0SWQsIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25TZXRTaXplQ2hhbmdlZCAoaW50IHNldElkLCBpbnQgc2l6ZSwgU3RyaW5nIGFkZHJlc3MpIHsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKLSAgICAgICAgR3JvdXBTZXJ2aWNlIHNlcnZpY2UgPSBHcm91cFNlcnZpY2UuZ2V0R3JvdXBTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2Uub25TZXRTaXplQ2hhbmdlZChzZXRJZCwgc2l6ZSwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvblNldFNpcmtDaGFuZ2VkKGludCBzZXRJZCwgYnl0ZVtdIHNpcmssIFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gR3JvdXBTZXJ2aWNlLmdldEdyb3VwU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLm9uU2V0U2lya0NoYW5nZWQoc2V0SWQsIHNpcmssIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOYXRpdmUgbWV0aG9kcyB0aGF0IGNhbGwgSk5JIGludGVyZmFjZQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgY2xlYW51cE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcmVnaXN0ZXJDc2lwQXBwTmF0aXZlKGxvbmcgYXBwVXVpZExzYiwgbG9uZyBhcHBVdWlkTXNiKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHVucmVnaXN0ZXJDc2lwQXBwTmF0aXZlKGludCBhcHBJZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXRMb2NrVmFsdWVOYXRpdmUoaW50IGFwcElkLCBpbnQgc2V0SWQsIGludCB2YWx1ZSwgU3RyaW5nW10gZGV2aWNlc0xpc3QpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdFNldERldmljZU5hdGl2ZShpbnQgYXBwSWQsIGJ5dGVbXSBhZGRyZXNzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RTZXREZXZpY2VOYXRpdmUoaW50IGFwcElkLCBieXRlW10gYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2dyb3VwY2xpZW50L0dyb3VwU2Nhbm5lci5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9ncm91cGNsaWVudC9Hcm91cFNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxOTJiMi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL2dyb3VwY2xpZW50L0dyb3VwU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGguZ3JvdXBjbGllbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZUdyb3VwOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLkJsdWV0b290aExlU2Nhbm5lcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhbkZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVjb3JkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5SZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLWltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOwotaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7Ci1pbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuSXZQYXJhbWV0ZXJTcGVjOwotCi0vKioKLSAqIENsYXNzIHRoYXQgaGFuZGxlcyBCbHVldG9vdGggTEUgU2NhbiByZXN1bHRzIGZvciBTZXQgbWVtYmVyIGRpc2NvdmVyeS4KLSAqIEl0IHBlcmZvcm1zIHNjYW4gcmVzdWx0IHJlc29sdXRpb24gZm9yIHNldCBpZGVudGlmaWNhdGlvbi4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBTY2FubmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHID0gR3JvdXBTZXJ2aWNlLlZEQkc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhHcm91cFNjYW5uZXIiOwotCi0gICAgLy8gbWVzc2FnZXMgZm9yIGhhbmRsaW5nIGZpbHRlcmVkIFBTUkkgU2NhbiByZXN1bHRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19IQU5ETEVfTEVfU0NBTl9SRVNVTFQgPSAwOwotCi0gICAgLy8gbWVzc2FnZSBmb3Igc3RhcnRpbmcgY29vcmRpbmF0ZWQgc2V0IGRpc2NvdmVyeQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1RBUlRfU0VUX0RJU0NPVkVSWSA9IDE7Ci0KLSAgICAvLyBtZXNzYWdlIHRvIHN0b3AgY29vcmRpbmF0ZWQgc2V0IGRpc2NvdmVyeQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1RPUF9TRVRfRElTQ09WRVJZID0gMjsKLQotICAgIC8vIG1lc3NhZ2Ugd2hlbiBzZXQgbWVtYmVyIGRpc2NvdmVyeSB0aW1lb3V0IGhhcHBlbnMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9NRU1CRVJfRElTQ19USU1FT1VUID0gMzsKLQotICAgIC8vIG1lc3NhZ2UgdG8gaGFuZGxlIFBTUkkgZnJvbSBFSVIgcGFja2V0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19IQU5ETEVfRUlSX1JFU1BPTlNFID0gNDsKLQotICAgIC8vIFBTUkkgU2VydmljZSBBRCBUeXBlCi0gICAgcHJpdmF0ZSBmaW5hbCBQYXJjZWxVdWlkIFBTUklfU0VSVklDRV9BRFRZUEVfVVVJRAotICAgICAgICAgICAgPSBCbHVldG9vdGhVdWlkLnBhcnNlVXVpZEZyb20obmV3IGJ5dGVbXXsweDJFLCAweDAwfSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFNSSV9MRU4gPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQU1JJX1NQTElUX0xFTiA9IDM7IC8vIDI0IGJpdHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUVTXzEyOF9JT19MRU4gPSAxNjsKLQotICAgIC8vIFNldCBNZW1iZXIgRGlzY292ZXJ5IHRpbWVvdXQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX01FTUJFUl9ESVNDT1ZFUllfVElNRU9VVCA9IDEwMDAwOyAvLyAxMCBzZWMKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlcjsKLSAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtQ3VycmVudERldmljZTsKLSAgICBwcml2YXRlIEJsdWV0b290aExlU2Nhbm5lciBtU2Nhbm5lcjsKLSAgICBwcml2YXRlIEdyb3VwU2VydmljZSBtR3JvdXBTZXJ2aWNlOwotICAgIHByaXZhdGUgdm9sYXRpbGUgQ3NpcEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1haW5IYW5kbGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2NhblJlc29sdXRpb247Ci0gICAgcHJpdmF0ZSBpbnQgbURpc2NvdmVyeVN0b3BwZWRSZWFzb247Ci0gICAgcHJpdmF0ZSBDc2lwTGVTY2FuQ2FsbGJhY2sgbUNzaXBTY2FuQ2FsbGJhY2s7Ci0KLSAgICAvLyBwYXJhbWV0ZXJzIGZvciBzZXQgZGlzY292ZXJ5Ci0gICAgcHJpdmF0ZSBpbnQgbVNldElkOwotICAgIHByaXZhdGUgYnl0ZVtdIG1TaXJrOwotICAgIHByaXZhdGUgaW50IG1UcmFuc3BvcnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldFNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgbVRvdGFsRGlzY292ZXJlZDsKLQotICAgIHByaXZhdGUgaW50IG1TY2FuVHlwZSA9IDE7Ci0KLSAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZSBzY2FucwotICAgIEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+IHNjYW5uZWREZXZpY2VzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0KLSAgICBHcm91cFNjYW5uZXIoR3JvdXBTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgbUdyb3VwU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIG1CbHVldG9vdGhBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotCi0gICAgICAgIC8vIHJlZ2lzdGVyIHJlY2VpdmVyIGZvciBCbHVldG9vdGggU3RhdGUgY2hhbmdlCi0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIG1Hcm91cFNlcnZpY2UucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7Ci0KLSAgICAgICAgbWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihtR3JvdXBTZXJ2aWNlLmdldE1haW5Mb29wZXIoKSk7Ci0gICAgICAgIEhhbmRsZXJUaHJlYWQgdGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkNzaXBTY2FuSGFuZGxlclRocmVhZCIpOwotICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgQ3NpcEhhbmRsZXIodGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUNzaXBTY2FuQ2FsbGJhY2sgPSBuZXcgQ3NpcExlU2NhbkNhbGxiYWNrKCk7Ci0gICAgICAgIFNjYW5SZWNvcmQuREFUQV9UWVBFX0dST1VQX0FEX1RZUEUgPSAweDJFOwotICAgICAgICAvKiBUZXN0aW5nOiBQcm9wZXJ0eSB1c2VkIGZvciBkZWNpZGluZyBzY2FuIGFuZCBmaWx0ZXIgdHlwZS4gVG8gYmUgcmVtb3ZlZCAqLwotICAgICAgICBtU2NhblR5cGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmNzaXAuc2NhbnR5cGUiLCAxKTsKLSAgICB9Ci0KLSAgICAvLyBIYW5kbGVyIGZvciBDU0lQIHNjYW4gb3BlcmF0aW9ucyBhbmQgc2V0IG1lbWJlciByZXNvbHV0aW9uLgotICAgIHByaXZhdGUgY2xhc3MgQ3NpcEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgQ3NpcEhhbmRsZXIoTG9vcGVyIGxvb3BlcikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgTG9nLnYoVEFHLCAibXNnLndoYXQgPSAiICsgbXNnLndoYXQpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfSEFORExFX0xFX1NDQU5fUkVTVUxUOgotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBwcm9jZXNzaW5nIHNjYW4gcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIGludCBjYWxsQmFja1R5cGUgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnREZXZpY2UgPSByZXN1bHQuZ2V0RGV2aWNlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSW4gY2FzZSBvZiBEVU1PIGRldmljZSBpZiBhZHZlcnRpc2VtZW50IGlzIGNvbWluZyBmcm9tIG90aGVyIFJQQSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnREZXZpY2UuZ2V0Qm9uZFN0YXRlKCkgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHNjYW5yZXN1bHQgaWYgYWxyZWFkeSBwcm9jZXNzZWQgZm9yIHRoaXMgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FubmVkRGV2aWNlcy5jb250YWlucyhtQ3VycmVudERldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZHVwbGljYXRlIHNjYW5uZWQgcmVzdWx0IG9yIERldmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1cnJlbnREZXZpY2UgKyAiIEdyb3VwIGluZm8gYWxyZWFkeSByZXNvbHZlZC4gSWdub3JlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZERldmljZXMuYWRkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgU2NhblJlY29yZCByZWNvcmQgPSAgcmVzdWx0LmdldFNjYW5SZWNvcmQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgcmVxdWlyZWQgc2VydmljZSBkYXRhIHdpdGggUFNSSSBBRCBUeXBlCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzcnZjRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5UeXBlID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNydmNEYXRhID0gcmVjb3JkLmdldFNlcnZpY2VEYXRhKFBTUklfU0VSVklDRV9BRFRZUEVfVVVJRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcnZjRGF0YSA9IHJlY29yZC5nZXRHcm91cElkZW50aWZpZXJEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNydmNEYXRhID09IG51bGwgfHwgc3J2Y0RhdGEubGVuZ3RoICE9IFBTUklfTEVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJHcm91cCBpbmZvIHdpdGggaW5jb3JyZWN0IGxlbmd0aCBmb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImluIGFkdmVydGlzZW1lbnQgb2YgIiArIG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0UHNyaVJlc29sdXRpb24oc3J2Y0RhdGEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0hBTkRMRV9FSVJfUkVTUE9OU0U6Ci0gICAgICAgICAgICAgICAgICAgIEVpckRhdGEgZWlyRGF0YSA9IChFaXJEYXRhKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RGV2aWNlID0gZWlyRGF0YS5jdXJEZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBlaXJHcm91cERhdGEgPSBlaXJEYXRhLmdyb3VwRGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGVpciBpZiBhbHJlYWR5IHByb2Nlc3NlZCBmb3IgdGhpcyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5uZWREZXZpY2VzLmNvbnRhaW5zKG1DdXJyZW50RGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkdXBsaWNhdGUgZWlyIG9yIERldmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1cnJlbnREZXZpY2UgKyAiIFBTUkkgYWxyZWFkeSByZXNvbHZlZC4gSWdub3JlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZERldmljZXMuYWRkKG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVpckdyb3VwRGF0YSA9PSBudWxsIHx8IGVpckdyb3VwRGF0YS5sZW5ndGggIT0gUFNSSV9MRU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBTUkkgZGF0YSB3aXRoIGluY29ycmVjdCBsZW5ndGggZm91bmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbiBFSVIgb2YgIiArIG1DdXJyZW50RGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdGFydFBzcmlSZXNvbHV0aW9uKGVpckdyb3VwRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gSGlnaCBwcmlvcml0eSBtc2cgcmVjZWl2ZWQgaW4gZnJvbnQgb2YgdGhlIG1lc3NhZ2UgcXVldWUKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfTUVNQkVSX0RJU0NfVElNRU9VVDoKLSAgICAgICAgICAgICAgICAgICAgbURpc2NvdmVyeVN0b3BwZWRSZWFzb24gPSBCbHVldG9vdGhEZXZpY2VHcm91cC5ESVNDT1ZFUllfU1RPUFBFRF9CWV9USU1FT1VUOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NUT1BfU0VUX0RJU0NPVkVSWToKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcFNldERpc2NvdmVyeSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIEhpZ2ggcHJpb3JpdHkgbXNnIHJlY2VpdmVkIGluIGZyb250IG9mIHRoZSBtZXNzYWdlIHF1ZXVlCi0gICAgICAgICAgICAgICAgY2FzZSBNU0dfU1RBUlRfU0VUX0RJU0NPVkVSWToKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RhcnRTZXREaXNjb3ZlcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIG1lc3NhZ2UgOiAiICsgbXNnLndoYXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQnJvYWRjYXN0UmVjZWl2ZXIgZm9yIEJUIE9OIFN0YXRlIGludGVudCBmb3IgcmVnaXN0ZXJpbmcgQkxFIFNjYW5uZXIgKi8KLSAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZWNlaXZlZCBpbnRlbnQgd2l0aCBudWxsIGFjdGlvbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FubmVyID0gbUJsdWV0b290aEFkYXB0ZXIuZ2V0Qmx1ZXRvb3RoTGVTY2FubmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKiBTY2FuIHJlc3VsdHMgY2FsbGJhY2sgKi8KLSAgICBwcml2YXRlIGNsYXNzIENzaXBMZVNjYW5DYWxsYmFjayBleHRlbmRzIFNjYW5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjYW5SZXN1bHQoaW50IGNhbGxCYWNrVHlwZSwgU2NhblJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICJvblNjYW5SZXN1bHQgY2FsbEJhY2tUeXBlIDogIiArIGNhbGxCYWNrVHlwZSk7Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbCAmJiBtU2NhblJlc29sdXRpb24pIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19IQU5ETEVfTEVfU0NBTl9SRVNVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsQmFja1R5cGUsIDAsIHJlc3VsdCkpOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFZEQkcpIExvZy5lKFRBRywgIm9uU2NhblJlc3VsdCBtSGFuZGxlciBpcyBudWxsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvciBTY2FuIFJlc29sdXRpb24gaXMgc3RvcHBlZCIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbkZhaWxlZChpbnQgZXJyb3JDb2RlKSB7Ci0gICAgICAgICAgICBtU2NhblJlc29sdXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlNjYW4gZmFpbGVkLiBFcnJvciBjb2RlOiAiICsgbmV3IEludGVnZXIoZXJyb3JDb2RlKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEVJUiBEYXRhICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFaXJEYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgY3VyRGV2aWNlOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBncm91cERhdGE7Ci0KLSAgICAgICAgRWlyRGF0YShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBieXRlW10gZGF0YSkgewotICAgICAgICAgICAgY3VyRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgZ3JvdXBEYXRhID0gZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFQSSB0aGF0IGhhbmRsZXMgUFNSSSByZWNlaXZlZCBmcm9tIEVJUiAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUVJUkdyb3VwRGF0YShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBieXRlW10gZGF0YSkgewotICAgICAgICBpZiAoVkRCRykgTG9nLnYoVEFHLCAiaGFuZGxlRWlyRGF0YTogZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICAgICAgaWYgKG1IYW5kbGVyICE9IG51bGwgJiYgbVNjYW5SZXNvbHV0aW9uKSB7Ci0gICAgICAgICAgICBFaXJEYXRhIGVpckRhdGEgPSBuZXcgRWlyRGF0YShkZXZpY2UsIGRhdGEpOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfSEFORExFX0VJUl9SRVNQT05TRSwgZWlyRGF0YSkpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChWREJHKSBMb2cuZShUQUcsICJoYW5kbGVFaXJEYXRhIG1IYW5kbGVyIGlzIG51bGwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb3IgSW5xdWlyeSBTY2FuIFJlc29sdXRpb24gaXMgc3RvcHBlZCIpOwotICAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFQSSB0byBzdGFydCBzZXQgZGlzY292ZXJ5IGJ5IHN0YXJ0aW5nIGVpdGhlciBMRSBzY2FuIG9yIEJSRURSIElucXVpcnkgKi8KLSAgICB2b2lkIHN0YXJ0U2V0RGlzY292ZXJ5KGludCBzZXRJZCwgYnl0ZVtdIHNpcmssIGludCB0cmFuc3BvcnQsCi0gICAgICAgICAgICBpbnQgc2l6ZSwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IHNldERldmljZXMpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic3RhcnRHcm91cERpc2NvdmVyeTogZ3JvdXBJZDogIiArIHNldElkICsgIiwgZ3JvdXAgc2l6ZSA9ICIKLSAgICAgICAgICAgICAgICArIHNpemUgKyAiLCBUb3RhbCBkaXNjb3ZlcmVkID0gIiArIHNldERldmljZXMuc2l6ZSgpCi0gICAgICAgICAgICAgICAgKyAiIFRyYW5zcG9ydCA9ICIgKyB0cmFuc3BvcnQpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHNldCBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcwotICAgICAgICBpZiAobVNjYW5SZXNvbHV0aW9uKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJHcm91cCBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgR3JvdXAgSWQ6ICIgKyBtU2V0SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLiBJZ25vcmUgdGhpcyByZXF1ZXN0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYXJrIHBhcmFtZXRlcnMgb2YgdGhlIHNldCB0byBiZSBkaXNjb3ZlcmVkCi0gICAgICAgIG1TZXRJZCA9IHNldElkOwotICAgICAgICBtVHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgICAgICBtU2V0U2l6ZSA9IHNpemU7Ci0gICAgICAgIG1Ub3RhbERpc2NvdmVyZWQgPSBzZXREZXZpY2VzLnNpemUoKTsKLSAgICAgICAgbVNpcmsgPSBBcnJheXMuY29weU9mKHNpcmssIEFFU18xMjhfSU9fTEVOKTsKLSAgICAgICAgcmV2ZXJzZUJ5dGVBcnJheShtU2lyayk7Ci0KLSAgICAgICAgLy8gY2xlYXIgc2Nhbm5lZCBhcnJheUxpc3QgYW5kIGFkZCBhbHJlYWR5IGZvdW5kIHNldCBtZW1iZXJzIHRvIGl0Ci0gICAgICAgIHNjYW5uZWREZXZpY2VzLmNsZWFyKCk7Ci0gICAgICAgIHNjYW5uZWREZXZpY2VzLmFkZEFsbChzZXREZXZpY2VzKTsKLQotICAgICAgICAvL3Bvc3QgbWVzc2FnZSBpbiB0aGUgZnJvbnQgb2YgbWVzc2FnZSBxdWV1ZQotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0RnJvbnRPZlF1ZXVlKAotICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NUQVJUX1NFVF9ESVNDT1ZFUlkpKTsKLSAgICB9Ci0KLSAgICAvKiBBUEkgdG8gc3RhcnQgZGlzY292ZXJ5IHdpdGggcmVxdWlyZWQgc2V0dGluZ3MgYW5kIHRyYW5zcG9ydCAqLwotICAgIHZvaWQgaGFuZGxlU3RhcnRTZXREaXNjb3ZlcnkoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImhhbmRsZVN0YXJ0R3JvdXBEaXNjb3ZlcnkiKTsKLSAgICAgICAgbVNjYW5SZXNvbHV0aW9uID0gdHJ1ZTsKLQotICAgICAgICBpZiAobVRyYW5zcG9ydCA9PSBCbHVldG9vdGhEZXZpY2UuREVWSUNFX1RZUEVfQ0xBU1NJQykgewotICAgICAgICAgICAgLy8gc3RhcnQgQlJFRFIgaW5xdWlyeSAodW5maWx0ZXJlZCkKLSAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLnN0YXJ0RGlzY292ZXJ5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDb25maWlndXJlIHNjYW4gZmlsdGVyIGFuZCBzdGFydCBmaWx0ZXJlZCBzY2FuIGZvciBQU1JJIGRhdGEKLSAgICAgICAgICAgIFNjYW5TZXR0aW5ncy5CdWlsZGVyIHNldHRpbmdCdWlsZGVyID0gbmV3IFNjYW5TZXR0aW5ncy5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBMaXN0PFNjYW5GaWx0ZXI+IGZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PFNjYW5GaWx0ZXI+KCk7Ci0gICAgICAgICAgICBieXRlW10gcHNyaSA9IHt9OwotCi0gICAgICAgICAgICBtU2NhblR5cGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmNzaXAuc2NhbnR5cGUiLCAxKTsKLQotICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkKLSAgICAgICAgICAgIGlmIChtU2NhblR5cGUgPT0gMikgewotICAgICAgICAgICAgICAgIGZpbHRlcnMuYWRkKG5ldyBTY2FuRmlsdGVyLkJ1aWxkZXIoKS5zZXRTZXJ2aWNlRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTUklfU0VSVklDRV9BRFRZUEVfVVVJRCwgcHNyaSkuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TY2FuVHlwZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVycy5hZGQobmV3IFNjYW5GaWx0ZXIuQnVpbGRlcigpLnNldEdyb3VwQmFzZWRGaWx0ZXJpbmcodHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5nQnVpbGRlci5zZXRTY2FuTW9kZShTY2FuU2V0dGluZ3MuU0NBTl9NT0RFX0JBTEFOQ0VEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2FsbGJhY2tUeXBlKFNjYW5TZXR0aW5ncy5DQUxMQkFDS19UWVBFX0FMTF9NQVRDSEVTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGVnYWN5KGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gc3RhcnQgQkxFIGZpbHRlcmVkIFNjYW4KLSAgICAgICAgICAgIGlmIChtU2NhblR5cGUgIT0gMCkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBmaWx0ZXJlZCBzY2FuIHN0YXJ0ZWQiKTsvLyBkZWJ1ZwotICAgICAgICAgICAgICAgIG1TY2FubmVyLnN0YXJ0U2NhbihmaWx0ZXJzLCBzZXR0aW5nQnVpbGRlci5idWlsZCgpLCBtQ3NpcFNjYW5DYWxsYmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBVbmZpbHRlcmVkIHNjYW4gc3RhcnRlZCIpOy8vIGRlYnVnCi0gICAgICAgICAgICAgICAgbVNjYW5uZXIuc3RhcnRTY2FuKG1Dc2lwU2NhbkNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0YXJ0IFNldCBNZW1iZXIgZGlzY292ZXJ5IHRpbWVvdXQgb2YgMTAgc2VjCi0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19TRVRfTUVNQkVSX0RJU0NfVElNRU9VVCk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZCgKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfTUVNQkVSX0RJU0NfVElNRU9VVCksCi0gICAgICAgICAgICAgICAgU0VUX01FTUJFUl9ESVNDT1ZFUllfVElNRU9VVCk7Ci0gICAgfQotCi0gICAgLyogdG8gc3RvcCBzZXQgZGlzY29ydmV5IHByb2NlZHVyZSAtIHN0b3AgTEUgc2NhbiBvciBCUkVEUiBpbnF1aXJ5ICovCi0gICAgdm9pZCBzdG9wU2V0RGlzY292ZXJ5KGludCBzZXRJZCwgaW50IHJlYXNvbikgewotICAgICAgICBMb2cuZChUQUcsICJzdG9wR3JvdXBEaXNjb3ZlcnkiKTsKLQotICAgICAgICBtRGlzY292ZXJ5U3RvcHBlZFJlYXNvbiA9IHJlYXNvbjsKLQotICAgICAgICAvL3Bvc3QgbWVzc2FnZSBpbiB0aGUgZnJvbnQgb2YgbWVzc2FnZSBxdWV1ZQotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0RnJvbnRPZlF1ZXVlKAotICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NUT1BfU0VUX0RJU0NPVkVSWSkpOwotICAgIH0KLQotICAgIC8qIGhhbmRsZXMgYWN0aW9ucyB0byBiZSB0YWtlbiBvbmNlIHNldCBkaXNjb3ZlcnkgaXMgbmVlZGVkIHRvIGJlIHN0b3BwZWQqLwotICAgIHZvaWQgaGFuZGxlU3RvcFNldERpc2NvdmVyeSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3RvcEdyb3VwRGlzY292ZXJ5Iik7Ci0gICAgICAgIG1TY2FuUmVzb2x1dGlvbiA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtVHJhbnNwb3J0ID09IEJsdWV0b290aERldmljZS5ERVZJQ0VfVFlQRV9MRSB8fAotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnQgPT0gQmx1ZXRvb3RoRGV2aWNlLkRFVklDRV9UWVBFX0RVQUwpIHsKLSAgICAgICAgICAgIG1TY2FubmVyLnN0b3BTY2FuKG1Dc2lwU2NhbkNhbGxiYWNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyLmNhbmNlbERpc2NvdmVyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgcXVldWVkIHNjYW4gcmVzdWx0cyBhbmQgc2V0IG1lbWJlciBkaXNjb3ZlcnkgdGltZW91dCBtZXNzYWdlCi0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19IQU5ETEVfTEVfU0NBTl9SRVNVTFQpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfU0VUX01FTUJFUl9ESVNDX1RJTUVPVVQpOwotCi0gICAgICAgIC8vIEdpdmUgY2FsbGJhY2sgdG8gc2VydmljZSB0byByb3V0ZSBpdCB0byByZXF1ZXN0aW5nIGFwcGxpY2F0aW9uCi0gICAgICAgIG1haW5IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwU2VydmljZS5vblNldERpc2NvdmVyeUNvbXBsZXRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXRJZCwgbVRvdGFsRGlzY292ZXJlZCwgbURpc2NvdmVyeVN0b3BwZWRSZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKiBTdGFydHMgcmVzb2x1dGlvbiBvZiBQU1JJIGRhdGEgcmVjZWl2ZWQgaW4gc2NhbiByZXN1bHRzICovCi0gICAgdm9pZCBzdGFydFBzcmlSZXNvbHV0aW9uKGJ5dGVbXSBwc3JpKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInN0YXJ0R3JvdXBSZXNvbHV0aW9uIik7Ci0KLSAgICAgICAgaWYgKFZEQkcpIHByaW50Qnl0ZUFycmF5SW5IZXgocHNyaSwgIkdyb3VwSW5mbyIpOwotICAgICAgICAvLyBvYnRhaW4gcmVtb3RlIGhhc2ggYW5kIHJhbmRvbSBudW1iZXIKLSAgICAgICAgYnl0ZVtdIHJlbW90ZUhhc2ggPSBuZXcgYnl0ZVtQU1JJX1NQTElUX0xFTl07Ci0gICAgICAgIGJ5dGVbXSByYW5kb21OdW1iZXIgPSBuZXcgYnl0ZVtQU1JJX1NQTElUX0xFTl07Ci0KLSAgICAgICAgLy8gR2V0IHJlbW90ZSBoYXNoIGZyb20gZmlyc3QgMjQgYml0cyBvZiBQU1JJCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHNyaSwgMCwgcmVtb3RlSGFzaCwgMCwgUFNSSV9TUExJVF9MRU4pOwotICAgICAgICAvLyBHZXQgcmFuZG9tIG51bWJlciBmcm9tIGxhc3QgMjQgYml0cyBvZiBQU1JJCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHNyaSwgUFNSSV9TUExJVF9MRU4sIHJhbmRvbU51bWJlciwgMCwgUFNSSV9TUExJVF9MRU4pOwotCi0gICAgICAgIGJ5dGVbXSBsb2NhbEhhc2ggPSBjb21wdXRlTG9jYWxIYXNoKHJhbmRvbU51bWJlcik7Ci0KLSAgICAgICAgaWYgKFZEQkcpIHsKLSAgICAgICAgICAgIHByaW50Qnl0ZUFycmF5SW5IZXgobG9jYWxIYXNoLCAibG9jYWxIYXNoIik7Ci0gICAgICAgICAgICBwcmludEJ5dGVBcnJheUluSGV4KHJlbW90ZUhhc2gsICJyZW1vdGVIYXNoIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jYWxIYXNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlU2V0TWVtYmVyKGxvY2FsSGFzaCwgcmVtb3RlSGFzaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlcyBsb2NhbCBoYXNoIGZyb20gcmVjZWl2ZWQgcmFuZG9tIG51bWJlciBhbmQgU0lSSyAqLwotICAgIGJ5dGVbXSBjb21wdXRlTG9jYWxIYXNoKGJ5dGVbXSByYW5kb21OdW1iZXIpIHsKLSAgICAgICAgYnl0ZVtdIGxvY2FsSGFzaCA9IG5ldyBieXRlW0FFU18xMjhfSU9fTEVOXTsKLSAgICAgICAgYnl0ZVtdIHJhbmRvbU51bWJlcjEyOCA9IG5ldyBieXRlW0FFU18xMjhfSU9fTEVOXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyYW5kb21OdW1iZXIsIDAsIHJhbmRvbU51bWJlcjEyOCwgMCwgUFNSSV9TUExJVF9MRU4pOwotCi0gICAgICAgIHJldmVyc2VCeXRlQXJyYXkocmFuZG9tTnVtYmVyMTI4KTsKLQotICAgICAgICBpZiAoVkRCRykgewotICAgICAgICAgICAgLy8gZm9yIGRlYnVnZ2luZwotICAgICAgICAgICAgcHJpbnRCeXRlQXJyYXlJbkhleChtU2lyaywgInJldmVyc2VkIEdyb3VwSVJLIik7Ci0gICAgICAgICAgICBwcmludEJ5dGVBcnJheUluSGV4KHJhbmRvbU51bWJlcjEyOCwgInJldmVyc2UgcmFuZG9tTnVtYmVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VjcmV0S2V5U3BlYyBza2V5U3BlYyA9IG5ldyBTZWNyZXRLZXlTcGVjKG1TaXJrLCAiQUVTIik7Ci0gICAgICAgICAgICBDaXBoZXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKCJBRVMvRUNCL05vUGFkZGluZyIpOwotICAgICAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgc2tleVNwZWMpOwotICAgICAgICAgICAgbG9jYWxIYXNoID0gY2lwaGVyLmRvRmluYWwocmFuZG9tTnVtYmVyMTI4KTsKLSAgICAgICAgICAgIHJldmVyc2VCeXRlQXJyYXkobG9jYWxIYXNoKTsKLSAgICAgICAgICAgIGlmIChWREJHKSBwcmludEJ5dGVBcnJheUluSGV4KGxvY2FsSGFzaCwgImFmdGVyIEFFUyAxMjggZW5jcnlwdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShsb2NhbEhhc2gsIDAsIFBTUklfU1BMSVRfTEVOKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB3aGlsZSBnZW5lcmF0aW5nIGxvY2FsIGhhc2g6ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiB0byB2YWxpZGF0ZSB0aGF0IGlmIHJlbW90ZSBiZWxvbmdzIHRvIGEgZ2l2ZW4gY29vcmRpbmF0ZWQgc2V0Ki8KLSAgICB2b2lkIHZhbGlkYXRlU2V0TWVtYmVyKGJ5dGVbXSBsb2NhbEhhc2gsIGJ5dGVbXSByZW1vdGVIYXNoKSB7Ci0gICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhsb2NhbEhhc2gsIHJlbW90ZUhhc2gpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAiTmV3IEdyb3VwIGRldmljZSBkaXNjb3ZlcmVkOiAiICsgbUN1cnJlbnREZXZpY2UpOwotICAgICAgICBtVG90YWxEaXNjb3ZlcmVkKys7Ci0KLSAgICAgICAgLy8gZ2l2ZSBzZXQgbWVtYmVyIGZvdW5kIGNhbGxiYWNrIG9uIG1haW4gdGhyZWFkCi0gICAgICAgIG1haW5IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwU2VydmljZS5vblNldE1lbWJlckZvdW5kKG1TZXRJZCwgbUN1cnJlbnREZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvL2NoZWNrIGlmIGFsbCBzZXQgbWVtYmVycyBoYXZlIGJlZW4gZGlzY292ZXJlZAotICAgICAgICBpZiAobVNldFNpemUgPiAwICYmIG1Ub3RhbERpc2NvdmVyZWQgPj0gbVNldFNpemUpIHsKLSAgICAgICAgICAgIC8vIHRvIGltbWVkaWF0bHkgaWdub3JlIHByb2Nlc3Npbmcgc2NhbiByZXN1bHRzIGFmdGVyIGNvbXBsZXRpb24KLSAgICAgICAgICAgIG1TY2FuUmVzb2x1dGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgbURpc2NvdmVyeVN0b3BwZWRSZWFzb24gPSBCbHVldG9vdGhEZXZpY2VHcm91cC5ESVNDT1ZFUllfQ09NUExFVEVEOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdEZyb250T2ZRdWV1ZSgKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TVE9QX1NFVF9ESVNDT1ZFUlkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlc3RhcnQgc2V0IG1lbWJlciBkaXNjb3ZlcnkgdGltZW91dAotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NFVF9NRU1CRVJfRElTQ19USU1FT1VUKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZCgKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX01FTUJFUl9ESVNDX1RJTUVPVVQpLAotICAgICAgICAgICAgICAgICAgICBTRVRfTUVNQkVSX0RJU0NPVkVSWV9USU1FT1VUKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogY2xlYW51cCB0YXNrcyBvbiBCVCBPRkYqLwotICAgIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgbUdyb3VwU2VydmljZS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm5zIHJldmVyc2VkIGJ5dGUgYXJyYXkKLSAgICB2b2lkIHJldmVyc2VCeXRlQXJyYXkoYnl0ZVtdIGJ5dGVfYXJyKSB7Ci0gICAgICAgIGludCBzaXplID0gYnl0ZV9hcnIubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUvMjsgaSsrKSB7Ci0gICAgICAgICAgICBieXRlIGIgPSBieXRlX2FycltpXTsKLSAgICAgICAgICAgIGJ5dGVfYXJyW2ldID0gYnl0ZV9hcnJbc2l6ZSAtIDEgLSBpXTsKLSAgICAgICAgICAgIGJ5dGVfYXJyW3NpemUgLSAxIC0gaV0gPSBiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gaGV4U3RyaW5nVG9CeXRlQXJyYXkoU3RyaW5nIHN0cikgewotICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlW3N0ci5sZW5ndGgoKSAvIDJdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBpbnQgaW5kZXggPSBpICogMjsKLSAgICAgICAgICBpbnQgdmFsID0gSW50ZWdlci5wYXJzZUludChzdHIuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDIpLCAxNik7Ci0gICAgICAgICAgYltpXSA9IChieXRlKSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgICB9Ci0KLSAgICAvLyBwcmludCBieXRlIGFycmF5IGluIGhleGFkZWNpbWFsIGZvcm1hdAotICAgIHZvaWQgcHJpbnRCeXRlQXJyYXlJbkhleChieXRlW10gZGF0YSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBoZXggPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IoYnl0ZSBiIDogZGF0YSkgewotICAgICAgICAgICAgaGV4LmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJ4IiwgYikpOwotICAgICAgICB9Ci0gICAgICAgIExvZy5pKFRBRywgbmFtZSArICI6ICIgKyBoZXgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9ncm91cGNsaWVudC9Hcm91cFNlcnZpY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvZ3JvdXBjbGllbnQvR3JvdXBTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGJhNTIuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9ncm91cGNsaWVudC9Hcm91cFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5ncm91cGNsaWVudDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHMuZW5mb3JjZUJsdWV0b290aFByaXZpbGVnZWRQZXJtaXNzaW9uOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZUdyb3VwOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguRGV2aWNlR3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aERldmljZUdyb3VwOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhHcm91cENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdyb3VwQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Db25maWc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5VdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotLyoqCi0gKiBQcm92aWRlcyBCbHVldG9vdGggQ1NJUCBDbGllbnQgcHJvZmlsZSwgYXMgYSBzZXJ2aWNlIGluIHRoZSBCbHVldG9vdGggYXBwbGljYXRpb24uCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBTZXJ2aWNlIGV4dGVuZHMgUHJvZmlsZVNlcnZpY2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEdyb3VwU2VydmljZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZEQkcgPSB0cnVlOy8vTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7Ci0KLSAgICBwcml2YXRlIEdyb3VwU2Nhbm5lciBtR3JvdXBTY2FubmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JvdXBTZXJ2aWNlIHNHcm91cFNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZTsKLQotICAgIEdyb3VwQ2xpZW50TmF0aXZlSW50ZXJmYWNlIG1Hcm91cE5hdGl2ZUludGVyZmFjZTsKLQotICAgIEdyb3VwQXBwTWFwIG1BcHBNYXAgPSBuZXcgR3JvdXBBcHBNYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIENvcHlPbldyaXRlQXJyYXlMaXN0PERldmljZUdyb3VwPiBtQ29vcmRpbmF0ZWRTZXRzCi0gICAgICAgICAgICA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxEZXZpY2VHcm91cD4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPiBzZXRTaXJrTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQVBQX0lEID0gMHgxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TRVRfSUQgPSAweDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgRU1QVFlfVVVJRCA9IFVVSUQuZnJvbVN0cmluZygiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIik7Ci0KLSAgICAvKiBwYXJhbWV0ZXJzIHRvIGhvbGQgZGV0YWlscyBmb3Igb25nb2luZyBzZXQgZGlzY292ZXJ5IGFuZCBwZW5kaW5nIHNldCBkaXNjb3ZlcnkgKi8KLSAgICBwcml2YXRlIFNldERpc2NvdmVyeVJlcXVlc3QgbUN1cnJlbnRTZXREaXNjID0gbnVsbDsKLSAgICBwcml2YXRlIFNldERpc2NvdmVyeVJlcXVlc3QgbVBlbmRpbmdTZXREaXNjID0gbnVsbDsKLQotICAgIC8qIENvbnN0YW50cyBmb3IgQ29vcmRpbmF0ZWQgc2V0IHByb3BlcnRpZXMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0lEID0gIlNFVF9JRCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVRElOR19TUlZDID0gIklOQ0xVRElOR19TUlZDIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRSA9ICJTSVpFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lSSyA9ICJTSVJLIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19TVVBQT1JUID0gIkxPQ0tfU1VQUE9SVCI7Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldERpc2NvdmVyeVJlcXVlc3QgewotICAgICAgICBwcml2YXRlIGludCBtQXBwSWQgPSBJTlZBTElEX0FQUF9JRDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVNldElkID0gSU5WQUxJRF9TRVRfSUQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQotICAgICAgICBTZXREaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICAgICAgbUFwcElkID0gSU5WQUxJRF9BUFBfSUQ7Ci0gICAgICAgICAgICBtU2V0SWQgPSBJTlZBTElEX1NFVF9JRDsKLSAgICAgICAgICAgIG1EaXNjSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0RGlzY292ZXJ5UmVxdWVzdChpbnQgYXBwSWQsIGludCBzZXRJZCwgYm9vbGVhbiBpblByb2dyZXNzKSB7Ci0gICAgICAgICAgICBtQXBwSWQgPSBhcHBJZDsKLSAgICAgICAgICAgIG1TZXRJZCA9IHNldElkOwotICAgICAgICAgICAgbURpc2NJblByb2dyZXNzID0gaW5Qcm9ncmVzczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJlY2VpdmVkIGludGVudCB3aXRoIG51bGwgYWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewotICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYm9uZFN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9CT05EX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLkVSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJvbmRTdGF0ZSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2V0SWQgPSBnZXRSZW1vdGVEZXZpY2VHcm91cElkKGRldmljZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0SWQgPCBCbHVldG9vdGhEZXZpY2VHcm91cC5JTlZBTElEX0dST1VQX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIEdyb3VwIERldmljZSAiKyBkZXZpY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB1bnBhaXJlZC4gR3JvdXAgSUQ6ICIgKyBzZXRJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2V0TWVtYmVyRnJvbUNTZXQoc2V0SWQsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH07Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgaW5pdEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHcm91cEJpbmRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RhcnQoKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwTmF0aXZlSW50ZXJmYWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChHcm91cENsaWVudE5hdGl2ZUludGVyZmFjZS5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICJHcm91cENsaWVudE5hdGl2ZUludGVyZmFjZSBjYW5ub3QgYmUgbnVsbCB3aGVuIEdyb3VwU2VydmljZSBzdGFydHMiKTsKLQotICAgICAgICBtQWRhcHRlclNlcnZpY2UgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCksCi0gICAgICAgICAgICAgICAgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIHdoZW4gR3JvdXBTZXJ2aWNlIHN0YXJ0cyIpOwotCi0gICAgICAgIG1Hcm91cFNjYW5uZXIgPSBuZXcgR3JvdXBTY2FubmVyKHRoaXMpOwotCi0gICAgICAgIG1Hcm91cE5hdGl2ZUludGVyZmFjZS5pbml0KCk7Ci0gICAgICAgIHNldEdyb3VwU2VydmljZSh0aGlzKTsKLQotICAgICAgICAvLyByZWdpc3RlciByZWNlaXZlciBmb3IgQmx1ZXRvb3RoIFN0YXRlIGNoYW5nZQotICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0R3JvdXBTZXJ2aWNlKEdyb3VwU2VydmljZSBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZXRHcm91cFNlcnZpY2UoKTogc2V0IHRvOiAiICsgaW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNHcm91cFNlcnZpY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wKCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzdG9wKCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtR3JvdXBTY2FubmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Hcm91cFNjYW5uZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNHcm91cFNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAic3RvcCgpIGNhbGxlZCBhbHJlYWR5Li4iKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0KLSAgICAgICAgLy8gQ2xlYW51cCBuYXRpdmUgaW50ZXJmYWNlCi0gICAgICAgIG1Hcm91cE5hdGl2ZUludGVyZmFjZS5jbGVhbnVwKCk7Ci0gICAgICAgIG1Hcm91cE5hdGl2ZUludGVyZmFjZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFyayBzZXJ2aWNlIGFzIHN0b3BwZWQKLSAgICAgICAgc2V0R3JvdXBTZXJ2aWNlKG51bGwpOwotCi0gICAgICAgIC8vIGNsZWFudXAgaW5pdGlhbGl6YXRpb25zCi0gICAgICAgIG1Hcm91cFNjYW5uZXIgPSBudWxsOwotICAgICAgICBtQWRhcHRlclNlcnZpY2UgPSBudWxsOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImNsZWFudXAoKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cCBuYXRpdmUgaW50ZXJmYWNlCi0gICAgICAgIGlmIChtR3JvdXBOYXRpdmVJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwTmF0aXZlSW50ZXJmYWNlLmNsZWFudXAoKTsKLSAgICAgICAgICAgIG1Hcm91cE5hdGl2ZUludGVyZmFjZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjbGVhbnVwIGluaXRpYWxpemF0aW9ucwotICAgICAgICBtR3JvdXBTY2FubmVyID0gbnVsbDsKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEdyb3VwU2VydmljZSBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gR3JvdXBTZXJ2aWNlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgR3JvdXBTZXJ2aWNlIGdldEdyb3VwU2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNHcm91cFNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0R3JvdXBTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgTlVMTCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXNHcm91cFNlcnZpY2UuaXNBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0R3JvdXBTZXJ2aWNlKCk6IHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc0dyb3VwU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKiBBUEkgdG8gbG9hZCBjb29yZGluYXRlZCBzZXQgZnJvbSBib25kZWQgZGV2aWNlIG9uIEJUIE9OICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VHcm91cEZyb21Cb25kZWREZXZpY2UgKAotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgU3RyaW5nIHNldERldGFpbHMpIHsKLSAgICAgICAgU3RyaW5nW10gY3NldHMgPSBzZXREZXRhaWxzLnNwbGl0KCIgIik7Ci0gICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICIgRGV2aWNlIGlzIHBhcnQgb2YgIiArIGNzZXRzLmxlbmd0aCArICIgZGV2aWNlIGdyb3VwcyIpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIHNldEluZm86IGNzZXRzKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBzZXRQcm9wZXJ0aWVzID0gc2V0SW5mby5zcGxpdCgifiIpOwotICAgICAgICAgICAgaW50IHNldElkID0gSU5WQUxJRF9TRVRfSUQsIHNpemUgPSAwOwotICAgICAgICAgICAgVVVJRCBpbmNsU3J2Y1V1aWQgPSBVVUlELmZyb21TdHJpbmcoIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIpOwotICAgICAgICAgICAgYm9vbGVhbiBsb2NrU3VwcG9ydCA9IGZhbHNlOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eTogc2V0UHJvcGVydGllcykgewotICAgICAgICAgICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICJQcm9wZXJ0eSA9ICIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvcFNwbGl0ID0gcHJvcGVydHkuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcFNwbGl0WzBdLmVxdWFscyhTRVRfSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldElkID0gSW50ZWdlci5wYXJzZUludChwcm9wU3BsaXRbMV0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcFNwbGl0WzBdLmVxdWFscyhJTkNMVURJTkdfU1JWQykpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbFNydmNVdWlkID0gVVVJRC5mcm9tU3RyaW5nKHByb3BTcGxpdFsxXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wU3BsaXRbMF0uZXF1YWxzKFNJWkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3BTcGxpdFsxXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wU3BsaXRbMF0uZXF1YWxzKFNJUkspICYmIHNldElkICE9IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFNpcmtNYXAucHV0KHNldElkLCBHcm91cFNjYW5uZXIuaGV4U3RyaW5nVG9CeXRlQXJyYXkocHJvcFNwbGl0WzFdKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wU3BsaXRbMF0uZXF1YWxzKExPQ0tfU1VQUE9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9ja1N1cHBvcnQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wU3BsaXRbMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGV2aWNlR3JvdXAgc2V0ID0gZ2V0Q29vcmRpbmF0ZWRTZXQoc2V0SWQsIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgICAgICAgICAgbWVtYmVycy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXQgPSBuZXcgRGV2aWNlR3JvdXAoc2V0SWQsIHNpemUsIG1lbWJlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyY2VsVXVpZChpbmNsU3J2Y1V1aWQpLCBsb2NrU3VwcG9ydCk7Ci0gICAgICAgICAgICAgICAgbUNvb3JkaW5hdGVkU2V0cy5hZGQoc2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZXQuZ2V0RGV2aWNlR3JvdXBNZW1iZXJzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBzZXQuZ2V0RGV2aWNlR3JvdXBNZW1iZXJzKCkuYWRkKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFZEQkcpIExvZy52KFRBRywgIkRldmljZSAiICsgZGV2aWNlICsgIiBsb2FkZWQgaW4gR3JvdXAgKCIrIHNldElkICsiKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRGV2aWNlczogIiArIHNldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgIC8qIEFQSSB0byBhY2NlcHQgUFNSSSBkYXRhIGZyb20gRUlSIHBhY2tldCAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUVJUkdyb3VwRGF0YShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBTdHJpbmcgZGF0YSkgewotICAgICAgICBtR3JvdXBTY2FubmVyLmhhbmRsZUVJUkdyb3VwRGF0YShkZXZpY2UsIGRhdGEuZ2V0Qnl0ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFkdmFuY2VBdWRpb1N1cHBvcnQoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInNldEFkdmFuY2VBdWRpb1N1cHBvcnQ6IFNldHRpbmcgc3VwcG9ydCBmcm9tIExFQSBNb2R1bGUiKTsKLQotICAgICAgICBpZiAoU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQuYWR2X2F1ZGlvX21hc2siKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5hZHZfYXVkaW9fbWFzayIsCi0gICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihDb25maWcuQURWX0FVRElPX1VOSUNBU1RfRkVBVF9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5BRFZfQVVESU9fQkNBX0ZFQVRfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuQURWX0FVRElPX0JDU19GRUFUX01BU0spKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3VwQmluZGVyCi0gICAgICAgICAgICBleHRlbmRzIElCbHVldG9vdGhEZXZpY2VHcm91cC5TdHViIGltcGxlbWVudHMgSVByb2ZpbGVTZXJ2aWNlQmluZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBHcm91cFNlcnZpY2UgbVNlcnZpY2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBHcm91cFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIG1TZXJ2aWNlLmlzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwQmluZGVyKEdyb3VwU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiR3JvdXBCaW5kZXIoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgICAgICBtU2VydmljZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdChpbnQgYXBwSWQsIEJsdWV0b290aERldmljZSBkZXZpY2UsIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3QgRGV2aWNlICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwgfHwgIVV0aWxzLmNoZWNrQ29ubmVjdFBlcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsIHNvdXJjZSwgImNvbm5lY3QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2UuY29ubmVjdChhcHBJZCwgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KGludCBhcHBJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgQXR0cmlidXRpb25Tb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlzY29ubmVjdCBEZXZpY2UgIiArIGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCB8fCAhVXRpbHMuY2hlY2tDb25uZWN0UGVybWlzc2lvbkZvckRhdGFEZWxpdmVyeSgKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZSwgc291cmNlLCAiZGlzY29ubmVjdCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZS5kaXNjb25uZWN0KGFwcElkLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyR3JvdXBDbGllbnRBcHAoUGFyY2VsVXVpZCB1dWlkLAotICAgICAgICAgICAgICAgIElCbHVldG9vdGhHcm91cENhbGxiYWNrIGNhbGxiYWNrLCBBdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVnaXN0ZXJHcm91cENsaWVudEFwcCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgR3JvdXBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsIHx8ICFVdGlscy5jaGVja0Nvbm5lY3RQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLCBzb3VyY2UsICJyZWdpc3Rlckdyb3VwQ2xpZW50QXBwIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXJ2aWNlLnJlZ2lzdGVyR3JvdXBDbGllbnRBcHAodXVpZC5nZXRVdWlkKCksIGNhbGxiYWNrLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyR3JvdXBDbGllbnRBcHAoaW50IGFwcElkLCBBdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVucmVnaXN0ZXJHcm91cENsaWVudEFwcCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgR3JvdXBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsIHx8ICFVdGlscy5jaGVja0Nvbm5lY3RQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLCBzb3VyY2UsICJ1bnJlZ2lzdGVyR3JvdXBDbGllbnRBcHAiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2UudW5yZWdpc3Rlckdyb3VwQ2xpZW50QXBwKGFwcElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdXNpdmVBY2Nlc3MoaW50IGFwcElkLCBpbnQgZ3JvdXBJZCwgTGlzdDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLCBBdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0RXhjbHVzaXZlQWNjZXNzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwgfHwgIVV0aWxzLmNoZWNrQ29ubmVjdFBlcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsIHNvdXJjZSwgInNldEV4Y2x1c2l2ZUFjY2VzcyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZS5zZXRMb2NrVmFsdWUoYXBwSWQsIGdyb3VwSWQsIGRldmljZXMsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEdyb3VwRGlzY292ZXJ5KGludCBhcHBJZCwgaW50IGdyb3VwSWQKLSAgICAgICAgICAgICAgICAsIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiAgewotICAgICAgICAgICAgaWYgKFZEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzdGFydEdyb3VwRGlzY292ZXJ5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwgfHwgIVV0aWxzLmNoZWNrQ29ubmVjdFBlcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLCAic3RhcnRHcm91cERpc2NvdmVyeSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZS5zdGFydFNldERpc2NvdmVyeShhcHBJZCwgZ3JvdXBJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RvcEdyb3VwRGlzY292ZXJ5KGludCBhcHBJZCwgaW50IGdyb3VwSWQsIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKFZEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzdG9wR3JvdXBEaXNjb3ZlcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCB8fCAhVXRpbHMuY2hlY2tDb25uZWN0UGVybWlzc2lvbkZvckRhdGFEZWxpdmVyeSgKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZSwgc291cmNlLCAic3RvcEdyb3VwRGlzY292ZXJ5IikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmZvcmNlQmx1ZXRvb3RoUHJpdmlsZWdlZFBlcm1pc3Npb24oc2VydmljZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLnN0b3BTZXREaXNjb3ZlcnkoYXBwSWQsIGdyb3VwSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGdldEV4Y2x1c2l2ZUFjY2Vzc1N0YXR1cyhpbnQgYXBwSWQsIGludCBncm91cElkLAotICAgICAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzLCBBdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJnZXRFeGNsdXNpdmVBY2Nlc3NTdGF0dXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCB8fCAhVXRpbHMuY2hlY2tDb25uZWN0UGVybWlzc2lvbkZvckRhdGFEZWxpdmVyeSgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLCBzb3VyY2UsICJnZXRFeGNsdXNpdmVBY2Nlc3NTdGF0dXMiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZm9yY2VCbHVldG9vdGhQcml2aWxlZ2VkUGVybWlzc2lvbihzZXJ2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTGlzdDxEZXZpY2VHcm91cD4gZ2V0RGlzY292ZXJlZEdyb3Vwcyhib29sZWFuIG1QdWJsaWNBZGRyCi0gICAgICAgICAgICAgICAgLCBBdHRyaWJ1dGlvblNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJnZXREaXNjb3ZlcmVkR3JvdXBzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwgfHwgIVV0aWxzLmNoZWNrQ29ubmVjdFBlcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCi0gICAgICAgICAgICAgICAgc2VydmljZSwgc291cmNlLCAiZ2V0RGlzY292ZXJlZEdyb3VwcyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXREaXNjb3ZlcmVkQ29vcmRpbmF0ZWRTZXRzKG1QdWJsaWNBZGRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGV2aWNlR3JvdXAgZ2V0RGV2aWNlR3JvdXAoaW50IHNldElkLCBib29sZWFuIG1QdWJsaWNBZGRyLAotICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImdldERldmljZUdyb3VwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwgfHwgIVV0aWxzLmNoZWNrQ29ubmVjdFBlcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCi0gICAgICAgICAgICAgICAgc2VydmljZSwgc291cmNlLCAiZ2V0RGV2aWNlR3JvdXAiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChzZXJ2aWNlLmdldENvb3JkaW5hdGVkU2V0KHNldElkLCBtUHVibGljQWRkcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlRGV2aWNlR3JvdXBJZCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgUGFyY2VsVXVpZCB1dWlkLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gbVB1YmxpY0FkZHIsIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImdldFJlbW90ZURldmljZUdyb3VwSWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEdyb3VwU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCB8fCAhVXRpbHMuY2hlY2tDb25uZWN0UGVybWlzc2lvbkZvckRhdGFEZWxpdmVyeSgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLCBzb3VyY2UsICJnZXRSZW1vdGVEZXZpY2VHcm91cElkIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9TRVRfSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRSZW1vdGVEZXZpY2VHcm91cElkKGRldmljZSwgdXVpZCwgbVB1YmxpY0FkZHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBEaXNjb3ZlcnlJblByb2dyZXNzIChpbnQgc2V0SWQsIEF0dHJpYnV0aW9uU291cmNlIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImlzR3JvdXBEaXNjb3ZlcnlJblByb2dyZXNzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHcm91cFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwgfHwgIVV0aWxzLmNoZWNrU2NhblBlcm1pc3Npb25Gb3JEYXRhRGVsaXZlcnkoCi0gICAgICAgICAgICAgICAgc2VydmljZSwgc291cmNlLCAiaXNHcm91cERpc2NvdmVyeUluUHJvZ3Jlc3MiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmlzU2V0RGlzY292ZXJ5SW5Qcm9ncmVzcyhzZXRJZCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogRGVhdGhSZWNlaXBpZW50IGhhbmRsZXIgdG8gdW5yZWdpc3RlciBhcHBsaWNhdGlvbnMgdGhvc2UgYXJlCi0gICAgICogZGlzY29ubmVjdGVkIHVuZ3JhY2VmdWxseSAoaWUuIGNyYXNoIG9yIGZvcmNlZCBjbG9zZSkuCi0gICAgICovCi0gICAgY2xhc3MgR3JvdXBBcHBEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRzIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgewotICAgICAgICBpbnQgbUFwcElkOwotCi0gICAgICAgIEdyb3VwQXBwRGVhdGhSZWNpcGllbnQoaW50IGFwcElkKSB7Ci0gICAgICAgICAgICBtQXBwSWQgPSBhcHBJZDsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkdyb3VwQXBwRGVhdGhSZWNpcGllbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkJpbmRlciBpcyBkZWFkIC0gdW5yZWdpc3RlcmluZyBhcHAgKCIgKyBtQXBwSWQgKyAiKSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUFwcE1hcC5yZW1vdmUobUFwcElkKTsKLSAgICAgICAgICAgIHVucmVnaXN0ZXJHcm91cENsaWVudEFwcChtQXBwSWQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBmb3IgcmVnaXN0cmF0aW9uIG9mIG90aGVyIEJsdWV0b290aCBwcm9maWxlIGluIEJsdWV0b290aCBBcHAgU3BhY2UqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyR3JvdXBDbGllbnRNb2R1bGUoQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBMb2cuZChUQUcsICJyZWdpc3Rlckdyb3VwQ2xpZW50TW9kdWxlIik7Ci0KLSAgICAgICAgVVVJRCB1dWlkOwotCi0gICAgICAgIGlmIChtR3JvdXBOYXRpdmVJbnRlcmZhY2UgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAvLyBHZW5lcmF0ZSBhbiB1bmlxdWUgVVVJRCBmb3IgQmx1ZXRvb3RoIE1vZHVsZXMgd2hpY2ggaXMgbm90IHVzZWQgYnkgb3RoZXJzIGFwcHMKLSAgICAgICAgZG8gewotICAgICAgICAgICAgdXVpZCA9IFVVSUQucmFuZG9tVVVJRCgpOwotICAgICAgICB9IHdoaWxlKG1BcHBNYXAuYXBwVXVpZHMuY29udGFpbnModXVpZCkpOwotCi0gICAgICAgIHJlZ2lzdGVyR3JvdXBDbGllbnRBcHAodXVpZCwgbnVsbCwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qIFJlZ2lzdGVycyBDU0lQIEFwcCBvciBtb2R1bGUgd2l0aCBDU0lQIG5hdGl2ZSBsYXllciAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyR3JvdXBDbGllbnRBcHAoVVVJRCB1dWlkLCBJQmx1ZXRvb3RoR3JvdXBDYWxsYmFjayBhcHBDYiwKLSAgICAgICAgICAgIEJsdWV0b290aEdyb3VwQ2FsbGJhY2sgbG9jYWxDYWxsYmFjaykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZWdpc3Rlckdyb3VwQ2xpZW50QXBwOiBVVUlEID0gIiArIHV1aWQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzTG9jYWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKGxvY2FsQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgaXNMb2NhbCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtQXBwTWFwLmFkZCh1dWlkLCBpc0xvY2FsLCBhcHBDYiwgbG9jYWxDYWxsYmFjayk7Ci0gICAgICAgIG1Hcm91cE5hdGl2ZUludGVyZmFjZS5yZWdpc3RlckNzaXBBcHAodXVpZC5nZXRMZWFzdFNpZ25pZmljYW50Qml0cygpLAotICAgICAgICAgICAgICAgIHV1aWQuZ2V0TW9zdFNpZ25pZmljYW50Qml0cygpKTsKLSAgICB9Ci0KLSAgICAvKiBVbnJlZ2lzdGVycyBCbHVldG9vdGggbW9kdWxlIChCVCBwcm9maWxlKSB3aXRoIENTSVAqLwotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJHcm91cENsaWVudE1vZHVsZShpbnQgYXBwSWQpIHsKLSAgICAgICAgdW5yZWdpc3Rlckdyb3VwQ2xpZW50QXBwKGFwcElkKTsKLSAgICB9Ci0KLSAgICAvKiBVbnJlZ2lzdGVycyBBcHAvTW9kdWxlIHdpdGggQ1NJUCovCi0gICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckdyb3VwQ2xpZW50QXBwKGludCBhcHBJZCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1bnJlZ2lzdGVyR3JvdXBDbGllbnRBcHA6IGFwcElkID0gIiArIGFwcElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtR3JvdXBOYXRpdmVJbnRlcmZhY2UgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtQXBwTWFwLnJlbW92ZShhcHBJZCk7Ci0gICAgICAgIG1Hcm91cE5hdGl2ZUludGVyZmFjZS51bnJlZ2lzdGVyQ3NpcEFwcChhcHBJZCk7Ci0gICAgfQotCi0gICAgLyogQVBJIHRvIHJlcXVlc3QgY2hhbmdlIGluIGxvY2sgdmFsdWUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NrVmFsdWUoaW50IGFwcElkLCBpbnQgc2V0SWQsIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZXRFeGNsdXNpdmVBY2Nlc3M6IGFwcElkID0gIiArIGFwcElkICsgIiwgc2V0SWQ6ICIgKyBzZXRJZCArCi0gICAgICAgICAgICAgICAgICAgICIsIHZhbHVlID0gIiArIHZhbHVlICsgIiwgc2V0IE1lbWJlcnMgPSAiICsgZGV2aWNlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUdyb3VwTmF0aXZlSW50ZXJmYWNlID09IG51bGwpIHJldHVybjsKLSAgICAgICAgLy8gYXBwSWQgYW5kIHNldElkIHZhbGlkYXRpb24gaXMgZG9uZSBhdCBzdGFjayBsYXllcgotICAgICAgICBtR3JvdXBOYXRpdmVJbnRlcmZhY2Uuc2V0TG9ja1ZhbHVlKGFwcElkLCBzZXRJZCwgZGV2aWNlcywgdmFsdWUpOwotICAgIH0KLQotICAgIC8qIFN0YXJ0cyB0aGUgc2V0IG1lbWJlcnMgZGlzY292ZXJ5IGZvciB0aGUgcmVxdWVzdGVkIGNvb3JkaW5hdGVkIHNldCAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2V0RGlzY292ZXJ5KGludCBhcHBJZCwgaW50IHNldElkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RhcnRHcm91cERpc2NvdmVyeS4gc2V0SWQgPSAiICsgc2V0SWQgKyAiIEluaXRpYXRpbmcgYXBwSWQgPSAiICsgYXBwSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IEFwbGxpY2F0aW9uIGRldGFpbHMKLSAgICAgICAgR3JvdXBBcHBNYXAuR3JvdXBDbGllbnRBcHAgYXBwID0gbUFwcE1hcC5nZXRCeUlkKGFwcElkKTsKLSAgICAgICAgaWYgKGFwcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJBcHBsaWNhdGlvbiBub3QgZm91bmQgZm9yIGFwcElkOiAiICsgYXBwSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRGV2aWNlR3JvdXAgY1NldCA9IGdldENvb3JkaW5hdGVkU2V0KHNldElkLCB0cnVlKTsKLSAgICAgICAgaWYgKGNTZXQgPT0gbnVsbCB8fCAhc2V0U2lya01hcC5jb250YWluc0tleShzZXRJZCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgR3JvdXAgSWQ6ICIgKyBzZXRJZCk7Ci0gICAgICAgICAgICBtQ3VycmVudFNldERpc2MgPSBudWxsOwotICAgICAgICAgICAgYXBwLmFwcENiLm9uR3JvdXBEaXNjb3ZlcnlTdGF0dXNDaGFuZ2VkKHNldElkLCBCbHVldG9vdGhEZXZpY2VHcm91cC5HUk9VUF9ESVNDT1ZFUllfU1RPUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlR3JvdXAuRElTQ09WRVJZX05PVF9TVEFSVEVEX0lOVkFMSURfUEFSQU1TKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNoZWNrIGlmIGFsbCBzZXQgbWVtYmVycyBhcmUgYWxyZWFkeSBkaXNjb3ZlcmVkICovCi0gICAgICAgIGludCBzZXRTaXplID0gY1NldC5nZXREZXZpY2VHcm91cFNpemUoKTsKLSAgICAgICAgaWYgKHNldFNpemUgIT0gMCAmJiBjU2V0LmdldFRvdGFsRGlzY292ZXJlZEdyb3VwRGV2aWNlcygpID49IHNldFNpemUpIHsKLSAgICAgICAgICAgIGFwcC5hcHBDYi5vbkdyb3VwRGlzY292ZXJ5U3RhdHVzQ2hhbmdlZChzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlR3JvdXAuR1JPVVBfRElTQ09WRVJZX1NUT1BQRUQsCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZUdyb3VwLkRJU0NPVkVSWV9DT01QTEVURUQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJyZW50U2V0RGlzYyAhPSBudWxsICYmIG1DdXJyZW50U2V0RGlzYy5tRGlzY0luUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkdyb3VwIERpc2NvdmVyeSBpcyBhbHJlYWR5IGluIFByb2dyZXNzIGZvciBHcm91cDogIgotICAgICAgICAgICAgICAgICsgbUN1cnJlbnRTZXREaXNjLm1TZXRJZCArICIgZnJvbSBBcHBJZDogIiArIG1DdXJyZW50U2V0RGlzYy5tQXBwSWQKLSAgICAgICAgICAgICAgICArICIgU3RvcCBjdXJyZW50IEdyb3VwIGRpc2NvdmVyeSIpOwotICAgICAgICAgICAgbVBlbmRpbmdTZXREaXNjID0gbmV3IFNldERpc2NvdmVyeVJlcXVlc3QoYXBwSWQsIHNldElkLCBmYWxzZSk7Ci0gICAgICAgICAgICBtR3JvdXBTY2FubmVyLnN0b3BTZXREaXNjb3ZlcnkobUN1cnJlbnRTZXREaXNjLm1TZXRJZCwgMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRTZXREaXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U2V0RGlzYyA9IG5ldyBTZXREaXNjb3ZlcnlSZXF1ZXN0KGFwcElkLCBzZXRJZCwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHRyYW5zcG9ydDsKLSAgICAgICAgYnl0ZVtdIHNpcms7Ci0KLSAgICAgICAgc2lyayA9IHNldFNpcmtNYXAuZ2V0KHNldElkKTsKLQotICAgICAgICAvKlRPRE86IE9wdGltaXplIGxvZ2ljIGlmIGRldmljZSB0eXBlIGlzIFVOS05PV04gKi8KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBjU2V0LmdldERldmljZUdyb3VwTWVtYmVycygpLmdldCgwKTsKLSAgICAgICAgICAgIHRyYW5zcG9ydCA9IGRldmljZS5nZXRUeXBlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBHcm91cC0gTm8gZGV2aWNlIGZvdW5kIDogIiArIGUpOwotICAgICAgICAgICAgbUN1cnJlbnRTZXREaXNjID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1Hcm91cFNjYW5uZXIuc3RhcnRTZXREaXNjb3Zlcnkoc2V0SWQsIHNpcmssIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICBjU2V0LmdldERldmljZUdyb3VwU2l6ZSgpLCBjU2V0LmdldERldmljZUdyb3VwTWVtYmVycygpKTsKLSAgICAgICAgbUN1cnJlbnRTZXREaXNjLm1EaXNjSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhcHAuYXBwQ2IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcC5hcHBDYi5vbkdyb3VwRGlzY292ZXJ5U3RhdHVzQ2hhbmdlZChzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZUdyb3VwLkdST1VQX0RJU0NPVkVSWV9TVEFSVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlR3JvdXAuRElTQ09WRVJZX1NUQVJURURfQllfQVBQTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTdG9wcyB0aGUgc2V0IG1lbWJlcnMgZGlzY292ZXJ5IGZvciB0aGUgcmVxdWVzdGVkIGNvb3JkaW5hdGVkIHNldCAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BTZXREaXNjb3ZlcnkoaW50IGFwcElkLCBpbnQgc2V0SWQpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RvcEdyb3VwRGlzY292ZXJ5OiBhcHBJZCA9ICIgKyBhcHBJZCArICIgZ3JvdXBJZCA9ICIgKyBzZXRJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgQXBsbGljYXRpb24gZGV0YWlscwotICAgICAgICBHcm91cEFwcE1hcC5Hcm91cENsaWVudEFwcCBhcHAgPSBtQXBwTWFwLmdldEJ5SWQoYXBwSWQpOwotCi0gICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXBwbGljYXRpb24gbm90IGZvdW5kIGZvciBhcHBJZDogIiArIGFwcElkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHJlcXVlc3RpbmcgYXBwIGlzIHN0b3BwaW5nIHRoZSBkaXNjb3ZlcnkKLSAgICAgICAgaWYgKG1DdXJyZW50U2V0RGlzYyA9PSBudWxsIHx8IG1DdXJyZW50U2V0RGlzYy5tQXBwSWQgIT0gYXBwSWQpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIiBFaXRoZXIgbm8gZGlzY292ZXJ5IGluIHByb2dyZXNzIG9yIFN0b3AgUmVxdWVzdCBmcm9tIgotICAgICAgICAgICAgICAgICAgICsgIiBBcHAgd2hpY2ggaGFzIG5vdCBzdGFydGVkIEdyb3VwIERpc2NvdmVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwU2Nhbm5lci5zdG9wU2V0RGlzY292ZXJ5KHNldElkLCBCbHVldG9vdGhEZXZpY2VHcm91cC5ESVNDT1ZFUllfU1RPUFBFRF9CWV9BUFBMKTsKLSAgICB9Ci0KLSAgICAvKiBSZWFkaW5nIGxvY2sgc3RhdHVzIG9mIGNvb3JkaW5hdGVkIHNldCBmb3Igb3JkZXJlZCBhY2Nlc3MgcHJvY2VkdXJlICovCi0gICAgcHVibGljIHZvaWQgZ2V0TG9ja1N0YXR1cyhpbnQgc2V0SWQsIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzKSB7Ci0gICAgICAgIC8vVE9ETzogRnV0dXJlIGVuaGFuY2VtZW50Ci0gICAgfQotCi0gICAgLyogVG8gY29ubmVjdCB0byBDb29yZGluYXRlZCBTZXQgRGV2aWNlICovCi0gICAgcHVibGljIHZvaWQgY29ubmVjdCAoaW50IGFwcElkLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImNvbm5lY3QgRGV2aWNlOiAiICsgZGV2aWNlICsgIiwgYXBwSWQ6ICIgKyBhcHBJZCk7Ci0gICAgICAgIGlmIChtR3JvdXBOYXRpdmVJbnRlcmZhY2UgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtR3JvdXBOYXRpdmVJbnRlcmZhY2UuY29ubmVjdFNldERldmljZShhcHBJZCwgZGV2aWNlKTsKLSAgICB9Ci0KLSAgICAvKiBUbyBkaXNjb25uZWN0IGZyb20gQ29vcmRpbmF0ZWQgU2V0IERldmljZSAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QgKGludCBhcHBJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJkaXNjb25uZWN0IERldmljZTogIiArIGRldmljZSArICIsIGFwcElkOiAiICsgYXBwSWQpOwotICAgICAgICBpZiAobUdyb3VwTmF0aXZlSW50ZXJmYWNlID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbUdyb3VwTmF0aXZlSW50ZXJmYWNlLmRpc2Nvbm5lY3RTZXREZXZpY2UoYXBwSWQsIGRldmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8RGV2aWNlR3JvdXA+IGdldERpc2NvdmVyZWRDb29yZGluYXRlZFNldHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNjb3ZlcmVkQ29vcmRpbmF0ZWRTZXRzKHRydWUpOwotICAgIH0KLQotICAgIC8qIHJldHVybnMgYWxsIGRpc2NvdmVyZWQgY29vcmRpbmF0ZWQgc2V0cyAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXZpY2VHcm91cD4gZ2V0RGlzY292ZXJlZENvb3JkaW5hdGVkU2V0cyhib29sZWFuIG1QdWJsaWNBZGRyKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImdldERpc2NvdmVyZWRHcm91cHMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZCBsb2dpYyB0byByZXBsYWNlIHJhbmRvbSBhZGRyZXNzZXMgdG8gcHVibGljIGFkZHJlc3NlcyBpZiByZXF1ZXN0ZWQgKi8KLSAgICAgICAgLy8gSXRlcmF0ZSBvbiBjb29yZGluYXRlZCBzZXRzCi0gICAgICAgIC8vIGNoZWNrIGFkZHJlc3MgdHlwZS4gUmVwbGFjZSB3aXRoIHB1YmxpYyBpZiByZXF1ZXN0ZWQKLSAgICAgICAgaWYgKG1QdWJsaWNBZGRyKSB7Ci0gICAgICAgICAgICBMaXN0PERldmljZUdyb3VwPiBjb29yZGluYXRlZFNldHMgPSBuZXcgQXJyYXlMaXN0PERldmljZUdyb3VwPigpOwotICAgICAgICAgICAgQWRhcHRlclNlcnZpY2UgYWRhcHRlclNlcnZpY2UgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKAotICAgICAgICAgICAgICAgICAgICBBZGFwdGVyU2VydmljZS5nZXRBZGFwdGVyU2VydmljZSgpLAotICAgICAgICAgICAgICAgICAgICAiQWRhcHRlclNlcnZpY2UgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIGZvciAoRGV2aWNlR3JvdXAgc2V0OiBtQ29vcmRpbmF0ZWRTZXRzKSB7Ci0gICAgICAgICAgICAgICAgRGV2aWNlR3JvdXAgY1NldCA9IG5ldyBEZXZpY2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuZ2V0RGV2aWNlR3JvdXBJZCgpLCBzZXQuZ2V0RGV2aWNlR3JvdXBTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxCbHVldG9vdGhEZXZpY2U+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmdldEluY2x1ZGluZ1NlcnZpY2VVVUlEKCksIHNldC5pc0V4Y2x1c2l2ZUFjY2Vzc1N1cHBvcnRlZCgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IHNldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgcHVibGljRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWRhcHRlclNlcnZpY2UuaXNJZ25vcmVEZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljRGV2aWNlID0gYWRhcHRlclNlcnZpY2UuZ2V0SWRlbnRpdHlBZGRyZXNzKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKS5hZGQocHVibGljRGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29vcmRpbmF0ZWRTZXRzLmFkZChjU2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb29yZGluYXRlZFNldHM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvb3JkaW5hdGVkU2V0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIERldmljZUdyb3VwIGdldENvb3JkaW5hdGVkU2V0KGludCBzZXRJZCkgewotICAgICAgICByZXR1cm4gZ2V0Q29vcmRpbmF0ZWRTZXQoc2V0SWQsIHRydWUpOwotICAgIH0KLQotICAgIC8qIHJldHVybnMgcmVxdWVzdGVkIGNvb3JkaW5hdGVkIHNldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGV2aWNlR3JvdXAgZ2V0Q29vcmRpbmF0ZWRTZXQoaW50IHNldElkLCBib29sZWFuIG1QdWJsaWNBZGRyKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImdldERldmljZUdyb3VwIDogZ3JvdXBJZCA9ICIgKyBzZXRJZAotICAgICAgICAgICAgICAgICAgICArICIgbVB1YmxpY0FkZHI6ICIgKyBtUHVibGljQWRkcik7Ci0gICAgICAgIH0KLQotICAgICAgICBBZGFwdGVyU2VydmljZSBhZGFwdGVyU2VydmljZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoCi0gICAgICAgICAgICAgICAgQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKSwgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIik7Ci0KLSAgICAgICAgZm9yIChEZXZpY2VHcm91cCBjU2V0OiBtQ29vcmRpbmF0ZWRTZXRzKSB7Ci0gICAgICAgICAgICBpZiAoY1NldC5nZXREZXZpY2VHcm91cElkKCkgPT0gc2V0SWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1QdWJsaWNBZGRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjU2V0OwotCi0gICAgICAgICAgICAgICAgLy8gUHVibGljIGFkZHJlc3NlcyBhcmUgcmVxdWVzdGVkLiBSZXBsYWNlIGFkZHJlc3Mgd2l0aCBwdWJsaWMgYWRkcgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERldmljZUdyb3VwIHNldCA9IG5ldyBEZXZpY2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU2V0LmdldERldmljZUdyb3VwSWQoKSwgY1NldC5nZXREZXZpY2VHcm91cFNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PEJsdWV0b290aERldmljZT4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU2V0LmdldEluY2x1ZGluZ1NlcnZpY2VVVUlEKCksIGNTZXQuaXNFeGNsdXNpdmVBY2Nlc3NTdXBwb3J0ZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRCb25kU3RhdGUoKSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgcHVibGljRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGFwdGVyU2VydmljZS5pc0lnbm9yZURldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0RldmljZSA9IGFkYXB0ZXJTZXJ2aWNlLmdldElkZW50aXR5QWRkcmVzcyhkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuZ2V0RGV2aWNlR3JvdXBNZW1iZXJzKCkuYWRkKHB1YmxpY0RldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NldERpc2NvdmVyeUluUHJvZ3Jlc3MgKGludCBzZXRJZCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJpc0dyb3VwRGlzY292ZXJ5SW5Qcm9ncmVzczogZ3JvdXBJZCA9ICIgKyBzZXRJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnRTZXREaXNjICE9IG51bGwgJiYgbUN1cnJlbnRTZXREaXNjLm1TZXRJZCA9PSBzZXRJZAotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U2V0RGlzYy5tRGlzY0luUHJvZ3Jlc3MpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlRGV2aWNlR3JvdXBJZCAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgUGFyY2VsVXVpZCB1dWlkKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW1vdGVEZXZpY2VHcm91cElkKGRldmljZSwgdXVpZCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSZW1vdGVEZXZpY2VHcm91cElkIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBQYXJjZWxVdWlkIHV1aWQsCi0gICAgICAgICAgICBib29sZWFuIG1QdWJsaWNBZGRyKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImdldFJlbW90ZURldmljZUdyb3VwSWQ6IGRldmljZSA9ICIgKyBkZXZpY2UgKyAiIHV1aWQgPSAiICsgdXVpZAotICAgICAgICAgICAgICAgICAgICArICIsIG1QdWJsaWNBZGRyID0gIiArIG1QdWJsaWNBZGRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQWRhcHRlclNlcnZpY2UgaW5zdGFuY2UgaXMgTlVMTC4gUmV0dXJuLiIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfU0VUX0lEOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIHNldERldmljZSA9IG51bGw7Ci0gICAgICAgIGlmIChtUHVibGljQWRkciAmJiBtQWRhcHRlclNlcnZpY2UuaXNJZ25vcmVEZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgc2V0RGV2aWNlID0gbUFkYXB0ZXJTZXJ2aWNlLmdldElkZW50aXR5QWRkcmVzcyhkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHV1aWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdXVpZCA9IG5ldyBQYXJjZWxVdWlkKEVNUFRZX1VVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChEZXZpY2VHcm91cCBjU2V0OiBtQ29vcmRpbmF0ZWRTZXRzKSB7Ci0gICAgICAgICAgICBpZiAoKGNTZXQuZ2V0RGV2aWNlR3JvdXBNZW1iZXJzKCkuY29udGFpbnMoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICBjU2V0LmdldERldmljZUdyb3VwTWVtYmVycygpLmNvbnRhaW5zKHNldERldmljZSkpCi0gICAgICAgICAgICAgICAgICAgICYmIGNTZXQuZ2V0SW5jbHVkaW5nU2VydmljZVVVSUQoKS5lcXVhbHModXVpZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY1NldC5nZXREZXZpY2VHcm91cElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSU5WQUxJRF9TRVRfSUQ7Ci0gICAgfQotCi0gICAgLyogVGhpcyBBUEkgaXMgY2FsbGVkIHdoZW4gcGFpcmluZyB3aXRoIExFIEF1ZGlvIGNhcGFibGUgc2V0IG1lbWJlciBmYWlscyBvcgotICAgICAqIHdoZW4gc2V0IG1lbWJlciBpcyB1bnBhaXJlZC4gUmVtb3ZpbmcgdGhlIHNldCBtZW1iZXIgZnJvbSBsaXN0IGdpdmVzIG9wdGlvbgotICAgICAqIHRvIHVzZXIgdG8gcmVkaXNjb3ZlciBpdCAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNldE1lbWJlckZyb21DU2V0KGludCBzZXRJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVEZXZpY2VGcm9tRGV2aWNlR3JvdXA6IHNldElkID0gIiArIHNldElkICsgIiwgRGV2aWNlOiAiICsgZGV2aWNlKTsKLQotICAgICAgICBEZXZpY2VHcm91cCBjU2V0ID0gZ2V0Q29vcmRpbmF0ZWRTZXQoc2V0SWQsIGZhbHNlKTsKLSAgICAgICAgaWYgKGNTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKS5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChjU2V0LmdldERldmljZUdyb3VwTWVtYmVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiTGFzdCBkZXZpY2UgdW5wYWlyZWQuIFJlbW92aW5nIERldmljZSBHcm91cCBmcm9tIGRhdGFiYXNlIik7Ci0gICAgICAgICAgICAgICAgbUNvb3JkaW5hdGVkU2V0cy5yZW1vdmUoY1NldCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY1NldCA9IGdldENvb3JkaW5hdGVkU2V0KHNldElkLCB0cnVlKTsKLSAgICAgICAgaWYgKGNTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKS5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChjU2V0LmdldERldmljZUdyb3VwTWVtYmVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiTGFzdCBkZXZpY2UgdW5wYWlyZWQuIFJlbW92aW5nIERldmljZSBHcm91cCBmcm9tIGRhdGFiYXNlIik7Ci0gICAgICAgICAgICAgICAgbUNvb3JkaW5hdGVkU2V0cy5yZW1vdmUoY1NldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludEFsbENvb3JkaW5hdGVkU2V0cygpIHsKLSAgICAgICAgaWYgKFZEQkcpIHsKLSAgICAgICAgICAgIGZvciAoRGV2aWNlR3JvdXAgc2V0OiBtQ29vcmRpbmF0ZWRTZXRzKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiR1JPVVBfSUQ6ICIgKyBzZXQuZ2V0RGV2aWNlR3JvdXBJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgc2l6ZSA9ICIgKyBzZXQuZ2V0RGV2aWNlR3JvdXBTaXplKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkaXNjb3ZlcmVkID0gIiArIHNldC5nZXRUb3RhbERpc2NvdmVyZWRHcm91cERldmljZXMoKQotICAgICAgICAgICAgICAgICAgICArICIsIEluY2x1ZGluZyBTcnZjIFV1aWQgPSAiKyBzZXQuZ2V0SW5jbHVkaW5nU2VydmljZVVVSUQoKQotICAgICAgICAgICAgICAgICAgICArICIsIGRldmljZXMgPSAiICsgc2V0LmdldERldmljZUdyb3VwTWVtYmVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENhbGxiYWNrIHJlY2VpdmVkIGZyb20gQ1NJUCBuYXRpdmUgbGF5ZXIgd2hlbiBhbiBBUFAvbW9kdWxlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNzaXBBcHBSZWdpc3RlcmVkIChpbnQgc3RhdHVzLCBpbnQgYXBwSWQsIFVVSUQgdXVpZCkgewotICAgICAgICBMb2cuZChUQUcsICJvbkdyb3VwQ2xpZW50QXBwUmVnaXN0ZXJlZDogYXBwSWQ6ICIgKyBhcHBJZCArICIsIFVVSUQ6ICIgKyB1dWlkLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIEdyb3VwQXBwTWFwLkdyb3VwQ2xpZW50QXBwIGFwcCA9IG1BcHBNYXAuZ2V0QnlVdWlkKHV1aWQpOwotCi0gICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXBwbGljYXRpb24gbm90IGZvdW5kIGZvciBVVUlEOiAiICsgdXVpZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcC5hcHBJZCA9IGFwcElkOwotICAgICAgICAvLyBHaXZlIGNhbGxiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGFwcCBoYXMgYmVlbiByZWdpc3RlcmVkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXBwLmlzUmVnaXN0ZXJlZCAmJiBhcHAuaXNMb2NhbCkgewotICAgICAgICAgICAgICAgIGFwcC5tQ2FsbGJhY2sub25Hcm91cENsaWVudEFwcFJlZ2lzdGVyZWQoc3RhdHVzLCBhcHBJZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFwcC5pc1JlZ2lzdGVyZWQgJiYgIWFwcC5pc0xvY2FsKSB7Ci0gICAgICAgICAgICAgICAgYXBwLmxpbmtUb0RlYXRoKG5ldyBHcm91cEFwcERlYXRoUmVjaXBpZW50KGFwcElkKSk7Ci0gICAgICAgICAgICAgICAgYXBwLmFwcENiLm9uR3JvdXBDbGllbnRBcHBSZWdpc3RlcmVkKHN0YXR1cywgYXBwSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2hlbiBDU0lQIFByb2ZpbGUgY29ubmVjdGlvbiBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBhcHBJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUsIGludCBzdGF0dXMpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkOiBhcHBJZDogIiArIGFwcElkICsgIiwgZGV2aWNlOiAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgKyAiLCBTdGF0ZTogIiArIHN0YXRlICsgIiwgU3RhdHVzOiAiICsgc3RhdHVzKTsKLQotICAgICAgICBHcm91cEFwcE1hcC5Hcm91cENsaWVudEFwcCBhcHAgPSBtQXBwTWFwLmdldEJ5SWQoYXBwSWQpOwotCi0gICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXBwbGljYXRpb24gbm90IGZvdW5kIGZvciBhcHBJZDogIiArIGFwcElkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXBwLmlzUmVnaXN0ZXJlZCAmJiBhcHAuaXNMb2NhbCkgewotICAgICAgICAgICAgICAgIGFwcC5tQ2FsbGJhY2sub25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBkZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcHAuaXNSZWdpc3RlcmVkICYmICFhcHAuaXNMb2NhbCkgewotICAgICAgICAgICAgICAgIGFwcC5hcHBDYi5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBXaGVuIGEgbmV3IHNldCBtZW1iZXIgaXMgZGlzY292ZXJlZCBhcyBhIHBhcnQgb2YgU2V0IERpc2NvdmVyeSBwcm9jZWR1cmUgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNldE1lbWJlckZvdW5kIChpbnQgc2V0SWQsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25Hcm91cERldmljZUZvdW5kOiBncm91cElkOiAiICsgc2V0SWQgKyAiLCBkZXZpY2U6ICIgKyBkZXZpY2UpOwotICAgICAgICBmb3IgKERldmljZUdyb3VwIGNTZXQ6IG1Db29yZGluYXRlZFNldHMpIHsKLSAgICAgICAgICAgIGlmIChjU2V0LmdldERldmljZUdyb3VwSWQoKSA9PSBzZXRJZAotICAgICAgICAgICAgICAgICAgICAmJiAhY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKS5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdpdmUgY2FsbGJhY2sgdG8gYWRhcHRlcnNlcnZpY2UgdG8gaW5pdGlhdGUgYm9uZGluZyBpZiByZXF1aXJlZAotICAgICAgICBtQWRhcHRlclNlcnZpY2UucHJvY2Vzc0dyb3VwTWVtYmVyKHNldElkLCBkZXZpY2UpOwotCi0gICAgICAgIC8vIEdpdmUgY2FsbGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgc3RhcnRlZCBTZXQgRGlzY292ZXJ5Ci0gICAgICAgIEdyb3VwQXBwTWFwLkdyb3VwQ2xpZW50QXBwIGFwcCA9IG1BcHBNYXAuZ2V0QnlJZChtQ3VycmVudFNldERpc2MubUFwcElkKTsKLQotICAgICAgICBpZiAoYXBwID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkFwcGxpY2F0aW9uIG5vdCBmb3VuZCBmb3IgYXBwSWQ6ICIgKyBtQ3VycmVudFNldERpc2MubUFwcElkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXBwLmFwcENiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHAuYXBwQ2Iub25Hcm91cERldmljZUZvdW5kKHNldElkLCBkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2hlbiBzZXQgZGlzY292ZXJ5IHByb2NlZHVyZSBoYXMgYmVlbiBjb21wbGV0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNldERpc2NvdmVyeUNvbXBsZXRlZCAoaW50IHNldElkLAotICAgICAgICAgICAgaW50IHRvdGFsRGlzY292ZXJlZCwgaW50IHJlYXNvbikgewotICAgICAgICBMb2cuZChUQUcsICJvbkdyb3VwRGlzY292ZXJ5Q29tcGxldGVkOiBncm91cElkOiAiICsgc2V0SWQgKyAiLCB0b3RhbERpc2NvdmVyZWQgPSAiCi0gICAgICAgICAgICAgICAgKyB0b3RhbERpc2NvdmVyZWQgKyAicmVhc29uOiAiICsgcmVhc29uKTsKLQotICAgICAgICAvLyBtYXJrIFNldCBEaXNjb3ZlcnkgcHJvY2VkdXJlIGFzIGNvbXBsZXRlZAotICAgICAgICBtQ3VycmVudFNldERpc2MubURpc2NJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgIC8vIEdpdmUgY2FsbGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgU2V0IERpc2NvdmVyeSBoYXMgYmVlbiBjb21wbGV0ZWQKLSAgICAgICAgR3JvdXBBcHBNYXAuR3JvdXBDbGllbnRBcHAgYXBwID0gbUFwcE1hcC5nZXRCeUlkKG1DdXJyZW50U2V0RGlzYy5tQXBwSWQpOwotCi0gICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXBwbGljYXRpb24gbm90IGZvdW5kIGZvciBhcHBJZDogIiArIG1DdXJyZW50U2V0RGlzYy5tQXBwSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhcHAuYXBwQ2IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcC5hcHBDYi5vbkdyb3VwRGlzY292ZXJ5U3RhdHVzQ2hhbmdlZChzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZUdyb3VwLkdST1VQX0RJU0NPVkVSWV9TVE9QUEVELCByZWFzb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEZXZpY2VHcm91cCBjU2V0ID0gZ2V0Q29vcmRpbmF0ZWRTZXQoc2V0SWQsIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChWREJHICYmIGNTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRldmljZSBHcm91cDogZ3JvdXBJZCIgKyBzZXRJZCArICIsIGRldmljZXM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY1NldC5nZXREZXZpY2VHcm91cE1lbWJlcnMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldERpc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2V0RGlzYyA9IG1QZW5kaW5nU2V0RGlzYzsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1NldERpc2MgPSBudWxsOwotICAgICAgICAgICAgICAgIHN0YXJ0U2V0RGlzY292ZXJ5KG1DdXJyZW50U2V0RGlzYy5tQXBwSWQsIG1DdXJyZW50U2V0RGlzYy5tU2V0SWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNldERpc2MgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2FsbGJhY2sgcmVjZWl2ZWQgZnJvbSBDU0lQIG5hdGl2ZSBsYXllciB3aGVuIGEgbmV3IENvb3JkaW5hdGVkIHNldCBoYXMgYmVlbgotICAgICAqIGlkZW50aWZpZWQgd2l0aCByZW1vdGUgZGV2aWNlICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25OZXdTZXRGb3VuZChpbnQgc2V0SWQsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzaXplLAotICAgICAgICAgICAgYnl0ZVtdIHNpcmssIFVVSUQgcFNydmNVdWlkLCBib29sZWFuIGxvY2tTdXBwb3J0KSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uTmV3R3JvdXBGb3VuZDogQWRkcmVzcyA6ICIgKyBkZXZpY2UgKyAiLCBncm91cElkOiAiICsgc2V0SWQKLSAgICAgICAgICAgICAgICArICIsIHNpemU6ICIgKyBzaXplICsgIiwgdXVpZDogIiArIHBTcnZjVXVpZC50b1N0cmluZygpKTsKLQotICAgICAgICAvLyBGb3JtIENvb3JkaW5hdGVkIFNldCBPYmplY3QgYW5kIHN0b3JlIGluIEFycmF5TGlzdAotICAgICAgICBMaXN0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPigpOwotICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICBEZXZpY2VHcm91cCBjU2V0ID0gbmV3IERldmljZUdyb3VwKHNldElkLCBzaXplLCBkZXZpY2VzLAotICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxVdWlkKHBTcnZjVXVpZCksIGxvY2tTdXBwb3J0KTsKLSAgICAgICAgbUNvb3JkaW5hdGVkU2V0cy5hZGQoY1NldCk7Ci0KLSAgICAgICAgLy8gU3RvcmUgc2lyayBpbiBoYXNobWFwIG9mIHNldElkLCBzaXJrCi0gICAgICAgIHNldFNpcmtNYXAucHV0KHNldElkLCBzaXJrKTsKLQotICAgICAgICAvLyBHaXZlIENhbGxiYWNrIHRvIGFsbCByZWdpc3RlcmVkIGFwcGxpY2F0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKEdyb3VwQXBwTWFwLkdyb3VwQ2xpZW50QXBwIGFwcDogbUFwcE1hcC5tQXBwcykgewotICAgICAgICAgICAgICAgIGlmIChhcHAuaXNSZWdpc3RlcmVkICYmICFhcHAuaXNMb2NhbCkgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGFwcC5hcHBDYiAhPSBudWxsKS8vdGVtcCBjaGVjawotICAgICAgICAgICAgICAgICAgICBhcHAuYXBwQ2Iub25OZXdHcm91cEZvdW5kKHNldElkLCBkZXZpY2UsIG5ldyBQYXJjZWxVdWlkKHBTcnZjVXVpZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENhbGxiYWNrIHJlY2VpdmVkIGZyb20gQ1NJUCBuYXRpdmUgbGF5ZXIgd2hlbiB1bmRpc2NvdmVyZWQgc2V0IG1lbWJlciBpcyBjb25uZWN0ZWQgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk5ld1NldE1lbWJlckZvdW5kIChpbnQgc2V0SWQsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25OZXdHcm91cERldmljZUZvdW5kOiBncm91cElkID0gIiArIHNldElkICsgIiwgRGV2aWNlID0gIiArIGRldmljZSk7Ci0KLSAgICAgICAgaWYgKG1BZGFwdGVyU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJBZGFwdGVyU2VydmljZSBpbnN0YW5jZSBpcyBOVUxMLiBSZXR1cm4uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUFkYXB0ZXJTZXJ2aWNlLmlzSWdub3JlRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGRldmljZSA9IG1BZGFwdGVyU2VydmljZS5nZXRJZGVudGl0eUFkZHJlc3MoZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGRldmljZSBpcyBhbHJlYWR5IHBhcnQgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBjb29yZGluYXRlZCBzZXQKLSAgICAgICAgLyogU2NlbmFyaW86IFdoZW4gYSBkZXZpY2Ugd2FzIG5vdCBkaXNjb3ZlcmVkIGR1cmluZyBpbml0aWFsIHNldCBkaXNjb3ZlcnkKLSAgICAgICAgICogICAgICAgICAgIHByb2NlZHVyZSBhbmQgbGF0ZXIgdXNlciBoYWQgZXhwbGljaXRlbHkgcGFpcmVkIHdpdGggdGhpcyBkZXZpY2UKLSAgICAgICAgICogICAgICAgICAgIGZyb20gcGFpciBuZXcgZGV2aWNlIFVJIG9wdGlvbi4gTm90IHJlcXVpcmVkIHRvIHNlbmQgb25TZXRNZW1iZXJGb3VuZAotICAgICAgICAgKiAgICAgICAgICAgY2FsbGJhY2sgdG8gYXBwbGljYXRpb24qLwotICAgICAgICBpZiAoc2V0U2lya01hcC5jb250YWluc0tleShzZXRJZCkpIHsKLSAgICAgICAgICAgIGZvciAoRGV2aWNlR3JvdXAgY1NldDogbUNvb3JkaW5hdGVkU2V0cykgewotICAgICAgICAgICAgICAgIGlmIChjU2V0LmdldERldmljZUdyb3VwSWQoKSA9PSBzZXRJZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCFjU2V0LmdldERldmljZUdyb3VwTWVtYmVycygpLmNvbnRhaW5zKGRldmljZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNTZXQuZ2V0RGV2aWNlR3JvdXBNZW1iZXJzKCkuYWRkKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNhbGxiYWNrIHJlY2VpdmVkIHdoZW4gbG9jayBzdGF0dXMgaXMgY2hhbmdlZCBmb3IgcmVxdWVzdGVkIGNvb3JkaW5hdGVkIHNldCovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Mb2NrU3RhdHVzQ2hhbmdlZCAoaW50IGFwcElkLCBpbnQgc2V0SWQsIGludCB2YWx1ZSwgaW50IHN0YXR1cywKLSAgICAgICAgICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uRXhjbHVzaXZlQWNjZXNzQ2hhbmdlZDogYXBwSWQgPSAiICsgYXBwSWQgKyAiLCBncm91cElkID0gIiArIHNldElkICsKLSAgICAgICAgICAgICAgICAiLCB2YWx1ZSA9ICIgKyB2YWx1ZSArICIsIHN0YXR1cyA9ICIgKyBzdGF0dXMgKyAiLCBkZXZpY2VzID0gIiArIGRldmljZXMpOwotICAgICAgICBHcm91cEFwcE1hcC5Hcm91cENsaWVudEFwcCBhcHAgPSBtQXBwTWFwLmdldEJ5SWQoYXBwSWQpOwotCi0gICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXBwbGljYXRpb24gbm90IGZvdW5kIGZvciBhcHBJZDogIiArIGFwcElkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXBwLmlzUmVnaXN0ZXJlZCAmJiBhcHAuaXNMb2NhbCkgewotICAgICAgICAgICAgICAgIGFwcC5tQ2FsbGJhY2sub25FeGNsdXNpdmVBY2Nlc3NDaGFuZ2VkKHNldElkLCB2YWx1ZSwgc3RhdHVzLCBkZXZpY2VzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwLmlzUmVnaXN0ZXJlZCAmJiAhYXBwLmlzTG9jYWwpIHsKLSAgICAgICAgICAgICAgICBhcHAuYXBwQ2Iub25FeGNsdXNpdmVBY2Nlc3NDaGFuZ2VkKHNldElkLCB2YWx1ZSwgc3RhdHVzLCBkZXZpY2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENhbGxiYWNrIHJlY2VpdmVkIHdoZW4gZWFybGllciBkZW5pZWQgbG9jayBpcyBub3cgYXZhaWxhYmxlICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Mb2NrQXZhaWxhYmxlIChpbnQgYXBwSWQsIGludCBzZXRJZCwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJvbkV4Y2x1c2l2ZUFjY2Vzc0F2YWlsYWJsZTogUmVtb3RlKCIgKyBkZXZpY2UgKyAiKSwgR3JvdXAgSWQ6ICIKLSAgICAgICAgICAgICAgICArIHNldElkICsgIiwgQXBwIElkOiAiICsgYXBwSWQpOwotCi0gICAgICAgIEdyb3VwQXBwTWFwLkdyb3VwQ2xpZW50QXBwIGFwcCA9IG1BcHBNYXAuZ2V0QnlJZChhcHBJZCk7Ci0gICAgICAgIGlmIChhcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXBwbGljYXRpb24gbm90IGZvdW5kIGZvciBhcHBJZDogIiArIGFwcElkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXBwLmlzUmVnaXN0ZXJlZCAmJiBhcHAuaXNMb2NhbCkgewotICAgICAgICAgICAgICAgIGFwcC5tQ2FsbGJhY2sub25FeGNsdXNpdmVBY2Nlc3NBdmFpbGFibGUoc2V0SWQsIGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFwcC5pc1JlZ2lzdGVyZWQgJiYgIWFwcC5pc0xvY2FsKSB7Ci0gICAgICAgICAgICAgICAgYXBwLmFwcENiLm9uRXhjbHVzaXZlQWNjZXNzQXZhaWxhYmxlKHNldElkLCBkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBDYWxsYmFjayByZWNlaXZlZCB3aGVuIHNldCBzaXplIGhhcyBiZWVuIGNoYW5nZWQgKi8KLSAgICAvKiBUT0RPOiBTY2FuYXJpb3MgYXJlIHVua25vd24uIEFjdGlvbnMgYXJlIHRvIGJlIGRlY2lkZWQgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNldFNpemVDaGFuZ2VkIChpbnQgc2V0SWQsIGludCBzaXplLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uR3JvdXBTaXplQ2hhbmdlZDogR3JvdXAgSWQ6ICIgKyBzZXRJZCArICIsIE5ldyBTaXplOiAiICsgc2l6ZSArCi0gICAgICAgICAgIiwgTm90aWZ5aW5nIGRldmljZTogIiArIGRldmljZSk7Ci0KLSAgICAgICAgLy8gVE9ETzogTG9naWMgdG8gYmUgaW5jb3Jwb3JhdGVkIG9uY2UgdXNlIGNhc2UgaXMgdW5kZXJzdG9vZAotICAgIH0KLQotICAgIC8qIENhbGxiYWNrIHJlY2VpdmVkIHdoZW4gc2V0IFNJUksgaGFzIGJlZW4gY2hhbmdlZCAqLwotICAgIC8qIFRPRE86IFNjYW5hcmlvcyBhcmUgdW5rbm93bi4gQWN0aW9ucyBhcmUgdG8gYmUgZGVjaWRlZCAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0U2lya0NoYW5nZWQoaW50IHNldElkLCBieXRlW10gc2lyaywgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBMb2cuZChUQUcsICJvbkdyb3VwSWRDaGFuZ2VkIEdyb3VwIElkOiAiICsgc2V0SWQgKyAiLCBOb3RpZnlpbmcgZGV2aWNlOiAiICsgZGV2aWNlKTsKLQotICAgICAgICAvLyBUT0RPOiBMb2dpYyB0byBiZSBpbmNvcnBvcmF0ZWQgb25jZSB1c2UgY2FzZSBpcyB1bmRlcnN0b29kCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL21jcC9NY3BOYXRpdmVJbnRlcmZhY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvbWNwL01jcE5hdGl2ZUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODUwY2U5Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvbWNwL01jcE5hdGl2ZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGgubWNwOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5VdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KLS8qKgotICogTWNwIE5hdGl2ZSBJbnRlcmZhY2UgdG8vZnJvbSBKTkkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNY3BOYXRpdmVJbnRlcmZhY2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWNwTmF0aXZlSW50ZXJmYWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwotICAgIEBHdWFyZGVkQnkoIklOU1RBTkNFX0xPQ0siKQotICAgIHByaXZhdGUgc3RhdGljIE1jcE5hdGl2ZUludGVyZmFjZSBzSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElOU1RBTkNFX0xPQ0sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBjbGFzc0luaXROYXRpdmUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1jcE5hdGl2ZUludGVyZmFjZSgpIHsKLSAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cud3RmU3RhY2soVEFHLCAiTm8gQmx1ZXRvb3RoIEFkYXB0ZXIgQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWNwTmF0aXZlSW50ZXJmYWNlIGdldEluc3RhbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKElOU1RBTkNFX0xPQ0spIHsKLSAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBNY3BOYXRpdmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgbmF0aXZlIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIHByaW9yaXRpZXMgdG8gY29uZmlndXJlLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGluaXROYXRpdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbnVwIHRoZSBuYXRpdmUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGNsZWFudXBOYXRpdmUoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHVwZGF0ZSBNQ1AgbWVkaWEgc3VwcG9ydGVkIGZlYXR1cmUKLSAgICAgKiBAcGFyYW0gZmVhdHVyZQotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBtZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZChpbnQgZmVhdHVyZSkgewotICAgICAgICByZXR1cm4gbWVkaWFDb250cm9sUG9pbnRPcGNvZGVTdXBwb3J0ZWROYXRpdmUoZmVhdHVyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXBkYXRlIE1DUCBtZWRpYSBzdXBwb3J0ZWQgZmVhdHVyZSBjdXJyZW50IHZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIG1lZGlhQ29udHJvbFBvaW50KGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWVkaWFDb250cm9sUG9pbnROYXRpdmUodmFsdWUpOwotICAgIH0KLQotICAvKioKLSAgICAgKiBTZXRzIHRoZSBNY3AgbWVkaWEgc3RhdGUKLSAgICAgKiBAcGFyYW0gc3RhdGUKLSAgICAgKi8KLSAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gbWVkaWFTdGF0ZShpbnQgc3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG1lZGlhU3RhdGVOYXRpdmUoc3RhdGUpOwotICAgIH0KLQotICAvKioKLSAgICAgKiB1cGRhdGUgTUNQIG1lZGlhIHBsYXllciBuYW1lCi0gICAgICogQHBhcmFtIHBsYXllciBuYW1lCi0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIG1lZGlhUGxheWVyTmFtZShTdHJpbmcgcGxheWVOYW1lKSB7Ci0gICAgICAgIHJldHVybiBtZWRpYVBsYXllck5hbWVOYXRpdmUocGxheWVOYW1lKTsKLSAgICB9Ci0gIC8qKgotICAgICAqIHVwZGF0ZSB0cmFjayBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0gICAgICogQHBhcmFtIHRyYWNrIGlkCi0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIHRyYWNrQ2hhbmdlZChpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHJldHVybiB0cmFja0NoYW5nZWROYXRpdmUoc3RhdHVzKTsKLSAgICB9Ci0gIC8qKgotICAgICAqIHVwZGF0ZSBNQ1AgdHJhY2sgcG9zaXRpb24KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKi8KLSAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gdHJhY2tQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgcmV0dXJuIHRyYWNrUG9zaXRpb25OYXRpdmUocG9zaXRpb24pOwotICAgIH0KLQotICAvKioKLSAgICAgKiB1cGRhdGUgTUNQIHRyYWNrIGR1cmF0aW9uCi0gICAgICogQHBhcmFtIGR1cmF0aW9uCi0gICAgICovCi0gIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIHRyYWNrRHVyYXRpb24oaW50IGR1cmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiB0cmFja0R1cmF0aW9uTmF0aXZlKGR1cmF0aW9uKTsKLSAgICB9Ci0gIC8qKgotICAgICAqIHVwZGF0ZSBNQ1AgdHJhY2sgdGl0bGUKLSAgICAgKiBAcGFyYW0gdGl0bGUKLSAgICAgKi8KLSAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gdHJhY2tUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgcmV0dXJuIHRyYWNrVGl0bGVOYXRpdmUodGl0bGUpOwotICAgIH0KLSAgLyoqCi0gICAgICogdXBkYXRlIHBsYXlpbmcgb3JkZXIgc3VwcG9ydCBvZiBtZWRpYQotICAgICAqIEBwYXJhbSBvcmRlcgotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBwbGF5aW5nT3JkZXJTdXBwb3J0ZWQoaW50IG9yZGVyKSB7Ci0gICAgICAgIHJldHVybiBwbGF5aW5nT3JkZXJTdXBwb3J0ZWROYXRpdmUob3JkZXIpOwotICAgIH0KLSAgLyoqCi0gICAgICogdXBkYXRlIHBsYXlpbmcgb3JkZXIgdmFsdWUgb2YgbWVkaWEKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gcGxheWluZ09yZGVyKGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gcGxheWluZ09yZGVyTmF0aXZlKHZhbHVlKTsKLSAgICB9Ci0gIC8qKgotICAgICAqIHVwZGF0ZSBhY3RpdmUgZGV2aWNlCi0gICAgICogQHBhcmFtIGRldmljZQotICAgICAqIEBwYXJhbSBzZXRJZAotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHNldElkLCBpbnQgcHJvZmlsZSkgewotICAgICAgICByZXR1cm4gc2V0QWN0aXZlRGV2aWNlTmF0aXZlKHByb2ZpbGUsIHNldElkLCBnZXRCeXRlQWRkcmVzcyhkZXZpY2UpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyBNY3AgbWVkaWEgY29udGVudCBjb250cm9sIGlkCi0gICAgICogQHBhcmFtIGNjaWQKLSAgICAgKi8KLSAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gY29udGVudENvbnRyb2xJZChpbnQgY2NpZCkgewotCi0gICAgICAgIHJldHVybiBjb250ZW50Q29udHJvbElkTmF0aXZlKGNjaWQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0IE1jcCBkaXNjb25uZWN0IGRldmljZQotICAgICAqIEBwYXJhbSBkZXZpY2UKLSAgICAgKi8KLSAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdE1jcChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBkaXNjb25uZWN0TWNwTmF0aXZlKGdldEJ5dGVBZGRyZXNzKGRldmljZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3QgTWNwIGRpc2Nvbm5lY3QgZGV2aWNlCi0gICAgICogQHBhcmFtIGRldmljZQotICAgICAqLwotICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBib25kU3RhdGVDaGFuZ2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBib25kU3RhdGVDaGFuZ2VOYXRpdmUoc3RhdGUsIGdldEJ5dGVBZGRyZXNzKGRldmljZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIGdldERldmljZShieXRlW10gYWRkcmVzcykgewotICAgICAgICByZXR1cm4gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVBZGRyZXNzKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gVXRpbHMuZ2V0Qnl0ZXNGcm9tQWRkcmVzcygiMDA6MDA6MDA6MDA6MDA6MDAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVXRpbHMuZ2V0Qnl0ZXNGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKLSAgICB9Ci0KLSAgICAvLyBDYWxsYmFja3MgZnJvbSB0aGUgbmF0aXZlIHN0YWNrIGJhY2sgaW50byB0aGUgSmF2YSBmcmFtZXdvcmsuCi0gICAgLy8gQWxsIGNhbGxiYWNrcyBhcmUgcm91dGVkIHZpYSB0aGUgU2VydmljZSB3aGljaCB3aWxsIGRpc2FtYmlndWF0ZSB3aGljaAotICAgIHByaXZhdGUgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBieXRlW10gYWRkcmVzcykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ6ICIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGdldERldmljZShhZGRyZXNzKTsKLQotICAgICAgICBNY3BTZXJ2aWNlIHNlcnZpY2UgPSBNY3BTZXJ2aWNlLmdldE1jcFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKGRldmljZSwgc3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBNZWRpYUNvbnRyb2xQb2ludENoYW5nZWRSZXF1ZXN0KGludCBzdGF0ZSwgYnl0ZVtdIGFkZHJlc3MpIHsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGdldERldmljZShhZGRyZXNzKTsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWVkaWFDb250cm9sUG9pbnRDaGFuZ2VkUmVxOiAiICsgc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIE1jcFNlcnZpY2Ugc2VydmljZSA9IE1jcFNlcnZpY2UuZ2V0TWNwU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKQotICAgICAgICAgICAgc2VydmljZS5vbk1lZGlhQ29udHJvbFBvaW50Q2hhbmdlUmVxKGRldmljZSwgc3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBUcmFja1Bvc2l0aW9uQ2hhbmdlZFJlcXVlc3QoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgTG9nLmQoVEFHLCAiVHJhY2tQb3NpdGlvbkNoYW5nZWRSZXF1ZXN0OiAiICsgcG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgTWNwU2VydmljZSBzZXJ2aWNlID0gTWNwU2VydmljZS5nZXRNY3BTZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKLSAgICAgICAgc2VydmljZS5vblRyYWNrUG9zaXRpb25DaGFuZ2VSZXEocG9zaXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBQbGF5aW5nT3JkZXJDaGFuZ2VkUmVxdWVzdChpbnQgb3JkZXIpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICBMb2cuZChUQUcsICJQbGF5aW5nT3JkZXJDaGFuZ2VkUmVxdWVzdDogIiArIG9yZGVyKTsKLSAgICAgICAgfQotICAgIE1jcFNlcnZpY2Ugc2VydmljZSA9IE1jcFNlcnZpY2UuZ2V0TWNwU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlICE9IG51bGwpCi0gICAgICAgIHNlcnZpY2Uub25QbGF5aW5nT3JkZXJDaGFuZ2VSZXEob3JkZXIpOwotICAgIH0KLQotICAgIC8vIE5hdGl2ZSBtZXRob2RzIHRoYXQgY2FsbCBpbnRvIHRoZSBKTkkgaW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbGVhbnVwTmF0aXZlKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBtZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZE5hdGl2ZShpbnQgZmVhdHVyZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBtZWRpYUNvbnRyb2xQb2ludE5hdGl2ZShpbnQgdmFsdWUpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbWVkaWFTdGF0ZU5hdGl2ZShpbnQgc3RhdGUpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbWVkaWFQbGF5ZXJOYW1lTmF0aXZlKFN0cmluZyBwbGF5ZXJOYW1lKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHRyYWNrQ2hhbmdlZE5hdGl2ZShpbnQgc3RhdHVzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHRyYWNrUG9zaXRpb25OYXRpdmUoaW50IHBvc2l0aW9uKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHRyYWNrRHVyYXRpb25OYXRpdmUoaW50IGR1cmF0aW9uKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHRyYWNrVGl0bGVOYXRpdmUoU3RyaW5nIHRpdGxlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHBsYXlpbmdPcmRlclN1cHBvcnRlZE5hdGl2ZShpbnQgb3JkZXIpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gcGxheWluZ09yZGVyTmF0aXZlKGludCB2YWx1ZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRBY3RpdmVEZXZpY2VOYXRpdmUoaW50IHByb2ZpbGUsIGludCBzZXRJZCwgYnl0ZVtdIGFkZHJlc3MpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29udGVudENvbnRyb2xJZE5hdGl2ZShpbnQgY2NpZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0TWNwTmF0aXZlKGJ5dGVbXSBhZGRyZXNzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGJvbmRTdGF0ZUNoYW5nZU5hdGl2ZShpbnQgc3RhdGUsIGJ5dGVbXSBhZGRyZXNzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9tY3AvTWNwU2VydmljZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9tY3AvTWNwU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTYzMzgyLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvbWNwL01jcFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLm1jcDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhNZXRyaWNzUHJvdG87Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5BY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkFwbUNvbnN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hY20uQWNtU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLk1ldHJpY3NMb2dnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFwbS5NZWRpYUNvbnRyb2xNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLS8qKgotICogUHJvdmlkZXMgQmx1ZXRvb3RoIE1DUCBwcm9maWxlIGFzIGEgc2VydmljZSBpbiB0aGUgQmx1ZXRvb3RoIGFwcGxpY2F0aW9uLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIE1jcFNlcnZpY2UgZXh0ZW5kcyBQcm9maWxlU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1jcFNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVVNJQ19QTEFZRVJfQ09OVFJPTCA9IDI4OwotICAgIHByaXZhdGUgc3RhdGljIE1jcFNlcnZpY2Ugc01jcFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyOwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbUFjdGl2ZURldmljZTsKLSAgICBwcml2YXRlIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZTsKLSAgICBwcml2YXRlIE1jcE5hdGl2ZUludGVyZmFjZSBtTmF0aXZlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgc3RhdGljIE1jcFNlcnZpY2Ugc0luc3RhbmNlID0gbnVsbDsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNY3NNZXNzYWdlSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGludCBtTWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzID0gMTsKLSAgICBwcml2YXRlIFN0cmluZyBtQWN0aXZlTWVkaWFQbGF5ZXJOYW1lID0gbmV3IFN0cmluZygiIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLm1jcC5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKLSAgICAvL25hdGl2ZSBldmVudAotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9NRURJQV9DT05UUk9MX1BPSU5UX0NIQU5HRUQgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9UUkFDS19QT1NJVElPTl9DSEFOR0VEID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfUExBWUlOR19PUkRFUl9DSEFOR0VEID0gNDsKLSAgICAvL01DUCB0byBKTkkgdXBkYXRlCi0gICAgc3RhdGljIGZpbmFsIGludCBNRURJQV9TVEFURV9VUERBVEUgPSA1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVTX1NVUFBPUlRFRF9VUERBVEUgPSA2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfQ09OVFJPTF9QT0lOVF9VUERBVEUgPSA3OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfUExBWUVSX05BTUVfVVBEQVRFID0gODsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQUNLX0NIQU5HRURfVVBEQVRFID0gOTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQUNLX1RJVExFX1VQREFURSA9IDEwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0tfUE9TSVRJT05fVVBEQVRFID0gMTE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBUUkFDS19EVVJBVElPTl9VUERBVEUgPSAxMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlJTkdfT1JERVJfU1VQUE9SVF9VUERBVEUgPSAxMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlJTkdfT1JERVJfVVBEQVRFID0gMTQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0NPTlRST0xfSURfVVBEQVRFID0gMTU7Ci0gICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVkVfREVWSUNFX0NIQU5HRSA9IDE2OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQk9ORF9TVEFURV9DSEFOR0UgPSAxNzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FRElBX0NPTlRST0xfTUFOQUdFUl9JTklUID0gMTg7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlTVEFUVVNfRVJST1IgPSAtMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlTVEFUVVNfU1RPUFBFRCA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBQTEFZU1RBVFVTX1BMQVlJTkcgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUExBWVNUQVRVU19QQVVTRUQgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUExBWVNUQVRVU19TRUVLID0gMzsKLQotCi0gICAgLy9zdXBlciBzZXQgb2Ygc3VwcG9ydGVkIHBsYXllciBzdXBwb3J0ZWQgZmVhdHVyZQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUNQX01FRElBX0NPTlRST0xfU1VQX1BMQVkgICAgICAgICAgPSAgICAgMTw8MDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1DUF9NRURJQV9DT05UUk9MX1NVUF9QQVVTRSAgICAgICAgID0gICAgIDE8PDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfRkFTVF9SRVdJTkQgICA9ICAgICAxPDwyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUNQX01FRElBX0NPTlRST0xfU1VQX0ZBU1RfRk9SV0FSRCAgPSAgICAgMTw8MzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1DUF9NRURJQV9DT05UUk9MX1NVUF9TVE9QICAgICAgICAgID0gICAgIDE8PDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUFJFVl9UUkFDSyAgICA9ICAgICAxPDwxMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1DUF9NRURJQV9DT05UUk9MX1NVUF9ORVhUX1RSQUNLICAgID0gICAgIDE8PDEyOwotCi0gICAgLy9tZWRpYSBjb250cm9sIHBvaW50IG9wY29kZXMKLSAgICBzdGF0aWMgZmluYWwgaW50IE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9QTEFZICAgICAgICAgID0gICAgIDB4MDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUEFVU0UgICAgICAgICA9ICAgICAweDAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX0ZBU1RfUkVXSU5EICAgPSAgICAgMHgwMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9GQVNUX0ZPUldBUkQgID0gICAgIDB4MDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfU1RPUCAgICAgICAgICA9ICAgICAweDA1OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1BSRVZfVFJBQ0sgICAgPSAgICAgMHgzMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9ORVhUX1RSQUNLICAgID0gICAgIDB4MzE7Ci0KLSAgICAvL2FzIHRoZXJlIGlzIG5vdCBzdXBwb3J0ZWQgYXBpIHRvIGZldGNoIHBsYXllciBkZXRhaWxzCi0gICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01FRElBX1BMQVlFUl9TVVBQT1JURURfRkVBVFVSRSA9IDB4MTgxRjsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUExBWUVSX1NVUFBPUlRFRF9GRUFUVVJFID0gMHgwMDAxOyAvLyBTaW5nbGUgb25jZSBkZWZhdWx0Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BMQVlJTkdfT1JERVIgPSAweDAxOyAvLyBTaW5nbGUgT25jZSBkZWZhdWx0Ci0gICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJPcENvZGUgPSAtMTsKLSAgICBwcml2YXRlIGludCBtU3VwcG9ydGVkQ29udHJvbFBvaW50ID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbnRyb2xQb2ludCA9IC0xOwotICAgIHByaXZhdGUgaW50IG1TdXBwb3J0ZWRQbGF5aW5nT3JkZXIgPSAtMTsKLSAgICBwcml2YXRlIGludCBtUGxheWluZ09yZGVyID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbUNjaWQgPSAtMTsKLSAgICBwcml2YXRlIGludCBtVHJhY2tQb3NpdGlvbiA9IDB4RkZGRjsKLSAgICBwcml2YXRlIGludCBtVHJhY2tEdXJhdGlvbiA9IDB4RkZGRjsKLSAgICBwcml2YXRlIFN0cmluZyBtUGxheWVyTmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRyYWNrVGl0bGUgPSBudWxsOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sTWFuYWdlciBtTWVkaWFDb250cm9sTWFuYWdlcjsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbU1lZGlhU2Vzc2lvbk1hbmFnZXI7Ci0gICAgLypwcml2YXRlIGNsYXNzIE11c2ljUGxheWVyRGV0YWlsIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgc3RhdGU7Ci0gICAgICAgIHByaXZhdGUgaW50IGZlYXR1cmVTdXBwb3J0ZWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1TZXRGZWF0dXJlOwotICAgICAgICBwcml2YXRlIGludCBwbGF5aW5nT3JkZXJGZWF0dXJlU3VwcG9ydGVkOwotICAgICAgICBwcml2YXRlIGludCBjdXJyZW50UGxheWluZ09yZGVyOwotICAgICAgICBwcml2YXRlIGludCBjY2lkOwotICAgICAgICBwcml2YXRlIGludCBtVHJhY2tQb3NpdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY3VycmVudFRyYWNrRHVyYXRpb247Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHBsYXllck5hbWU7Ci0KLSAgICAgICAgcHVibGljIE11c2ljUGxheWVyRGV0YWlsKCkgewotCi0gICAgICAgIH0KLSAgICB9OyovCi0gICAgLy9IYXNoTWFwPE11c2ljUGxheWVyRGV0YWlsLCBTdHJpbmc+IG1NdXNpY1BsYXllck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElQcm9maWxlU2VydmljZUJpbmRlciBpbml0QmluZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IE1jcEJpbmRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgImNyZWF0ZSgpIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgTG9nLmkoVEFHLCAiY2xlYW51cCgpIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnQoKSB7Ci0gICAgICAgIExvZy5pKFRBRywgInN0YXJ0KCkiKTsKLSAgICAgICAgaWYgKHNNY3BTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIk1jcFNlcnZpY2UgaXMgYWxyZWFkeSBydW5uaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICIgQ3JlYXRlIE1jcFNlcnZpY2UgSW5zdGFuY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gdGhpczsKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChBZGFwdGVyU2VydmljZS5nZXRBZGFwdGVyU2VydmljZSgpLAotICAgICAgICAgICAgICAgICJBZGFwdGVyU2VydmljZSBjYW5ub3QgYmUgbnVsbCB3aGVuIE1jcFNlcnZpY2Ugc3RhcnRzIik7Ci0gICAgICAgIG1OYXRpdmVJbnRlcmZhY2UgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKE1jcE5hdGl2ZUludGVyZmFjZS5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICJNY3BOYXRpdmVJbnRlcmZhY2UgY2Fubm90IGJlIG51bGwgd2hlbiBNY3BTZXJ2aWNlIHN0YXJ0cyIpOwotICAgICAgICAvLyBTdGVwIDI6IEdldCBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0ZWQgYXVkaW8gZGV2aWNlcwotICAgICAgICBtTWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzID0gbUFkYXB0ZXJTZXJ2aWNlLmdldE1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcygpOwotICAgICAgICBMb2cuaShUQUcsICJNYXggY29ubmVjdGVkIGF1ZGlvIGRldmljZXMgc2V0IHRvICIgKyBtTWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzKTsKLSAgICAgICAgLy9oYW5kbGUgdG8gc3luY2hyb25pemVkIHR4IGFuZCByeCBtZXNzYWdlCi0gICAgICAgIGlmIChtSGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQmx1ZXRvb3RoTUNTSGFuZGxlciIpOwotICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgTG9vcGVyIGxvb3BlciA9IHRocmVhZC5nZXRMb29wZXIoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgTWNzTWVzc2FnZUhhbmRsZXIobG9vcGVyKTsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5pbml0KCk7Ci0gICAgICAgIExvZy5kKFRBRywgIm1jcCBuYXRpdmUgaW5pdCBkb25lIik7Ci0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0KLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIgPSBuZXcgQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyKCk7Ci0gICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgc2V0TWNwU2VydmljZSh0aGlzKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbk1hbmFnZXIgPSAoTWVkaWFTZXNzaW9uTWFuYWdlcikgdGhpcy5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgdGhpcy5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICAvL01lZGlhQ29udHJvbE1hbmFnZXIubWFrZSh0aGlzKTsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gTUVESUFfQ09OVFJPTF9NQU5BR0VSX0lOSVQ7Ci0gICAgICAgIG1zZy5vYmogPSB0aGlzOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDApOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wKCkgewotICAgICAgICBMb2cuaShUQUcsICJzdG9wKCkiKTsKLSAgICAgICAgaWYgKHNNY3BTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgTG9nLncoVEFHLCAic3RvcCgpIGNhbGxlZCBiZWZvcmUgc3RhcnQoKSIpOwotICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBTdGVwIDg6IE1hcmsgc2VydmljZSBhcyBzdG9wcGVkCi0gICAgICAgIHNldE1jcFNlcnZpY2UobnVsbCk7Ci0gICAgICAgIC8vIENsZWFudXAgbmF0aXZlIGludGVyZmFjZQotICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLmNsZWFudXAoKTsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyKTsKLSAgICAgICAgLy8gQ2xlYXIgQWRhcHRlclNlcnZpY2UKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgbU1heENvbm5lY3RlZEF1ZGlvRGV2aWNlcyA9IDE7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TWNwU2VydmljZShNY3BTZXJ2aWNlIGluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNldE1jcFNlcnZpY2UoKTogc2V0IHRvOiAiICsgaW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNNY3BTZXJ2aWNlID0gaW5zdGFuY2U7Ci0gICAgfQotICAgLyoqCi0gICAqIEdldCB0aGUgTWNwU2VydmljZSBpbnN0YW5jZQotICAgKiBAcmV0dXJuIE1jcFNlcnZpY2UgaW5zdGFuY2UKLSAgICovCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyAgTWNwU2VydmljZSBnZXRNY3BTZXJ2aWNlKCkgewotICAgICAgICBpZiAoc01jcFNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0TWNwU2VydmljZSgpOiBzZXJ2aWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzTWNwU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGNsZWFyTWNwSW5zdGFuY2UgKCkgewotICAgICAgICBMb2cudihUQUcsICJjbGVhcmluZyBNQ1AgaW5zdGF0bmNlIik7Ci0gICAgICAgIHNJbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIExvZy52KFRBRywgIkFmdGVyIGNsZWFyaW5nIE1DUCBpbnN0YXRuY2UgIik7Ci0gICAgfQotCi0gICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBNZWRpYUNvbnRyb2xQb2ludE9wY29kZVVwZGF0ZShpbnQgZmVhdHVyZSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLndoYXQgPSBNRURJQV9DT05UUk9MX1BPSU5UX09QQ09ERVNfU1VQUE9SVEVEX1VQREFURTsKLSAgICAgICAgbXNnLmFyZzEgPSBmZWF0dXJlOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gTWVkaWFDb250cm9sUG9pbnRVcGRhdGUoaW50IHZhbHVlKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICBtc2cud2hhdCA9IE1FRElBX0NPTlRST0xfUE9JTlRfVVBEQVRFOwotICAgICAgICBtc2cuYXJnMSA9IHZhbHVlOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIE1lZGlhU3RhdGVVcGRhdGUoaW50IHN0YXRlKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICBtc2cud2hhdCA9IE1FRElBX1NUQVRFX1VQREFURTsKLSAgICAgICAgbXNnLmFyZzEgPSBzdGF0ZTsKLSAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBNZWRpYVBsYXllck5hbWVVcGRhdGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gTUVESUFfUExBWUVSX05BTUVfVVBEQVRFOwotICAgICAgICBtc2cub2JqID0gbmFtZTsKLSAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBQbGF5aW5nT3JkZXJTdXBwb3J0ZWRVcGRhdGUoaW50IHN1cHBvcnQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gUExBWUlOR19PUkRFUl9TVVBQT1JUX1VQREFURTsKLSAgICAgICAgbXNnLmFyZzEgPSBzdXBwb3J0OwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIFBsYXlpbmdPcmRlclVwZGF0ZShpbnQgc3VwcG9ydCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLndoYXQgPSBQTEFZSU5HX09SREVSX1VQREFURTsKLSAgICAgICAgbXNnLmFyZzEgPSBzdXBwb3J0OwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIFRyYWNrQ2hhbmdlZFVwZGF0ZShpbnQgc3RhdHVzKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICBtc2cud2hhdCA9IFRSQUNLX0NIQU5HRURfVVBEQVRFOwotICAgICAgICBtc2cuYXJnMSA9IHN0YXR1czsKLSAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBUcmFja1RpdGxlVXBkYXRlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLndoYXQgPSBUUkFDS19USVRMRV9VUERBVEU7Ci0gICAgICAgIG1zZy5vYmogPSB0aXRsZTsKLSAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBUcmFja0R1cmF0aW9uVXBkYXRlKGludCBkdXJhdGlvbikgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLndoYXQgPSBUUkFDS19EVVJBVElPTl9VUERBVEU7Ci0gICAgICAgIG1zZy5hcmcxID0gZHVyYXRpb247Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gVHJhY2tQb3NpdGlvblVwZGF0ZShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gVFJBQ0tfUE9TSVRJT05fVVBEQVRFOwotICAgICAgICBtc2cuYXJnMSA9IHBvc2l0aW9uOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIENvbnRlbnRDb250cm9sSUQoaW50IGNjaWQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gQ09OVEVOVF9DT05UUk9MX0lEX1VQREFURTsKLSAgICAgICAgbXNnLmFyZzEgPSBjY2lkOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgY29udmVydFBsYXlTdGF0ZVRvUGxheVN0YXR1cyhQbGF5YmFja1N0YXRlIHN0YXRlKSB7Ci0gICAgICAgIGludCBwbGF5U3RhdHVzID0gUExBWVNUQVRVU19FUlJPUjsKLSAgICAgICAgc3dpdGNoIChzdGF0ZS5nZXRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICBwbGF5U3RhdHVzID0gUExBWVNUQVRVU19QTEFZSU5HOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FOgotICAgICAgICAgICAgICAgIHBsYXlTdGF0dXMgPSBQTEFZU1RBVFVTX1NUT1BQRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAgICAgcGxheVN0YXR1cyA9IFBMQVlTVEFUVVNfUEFVU0VEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfRkFTVF9GT1JXQVJESU5HOgotICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NLSVBQSU5HX1RPX05FWFQ6Ci0gICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTToKLSAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9SRVdJTkRJTkc6Ci0gICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU0tJUFBJTkdfVE9fUFJFVklPVVM6Ci0gICAgICAgICAgICAgICAgcGxheVN0YXR1cyA9IFBMQVlTVEFUVVNfU0VFSzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHBsYXlTdGF0dXMgPSBQTEFZU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBsYXlTdGF0dXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGFjdGl2ZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3RpdmUgZGV2aWNlIG9yIG51bGwgaWYgbm8gZGV2aWNlIGlzIGFjdGl2ZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlIGdldEFjdGl2ZURldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVEZXZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q29udHJvbENvbnRlbnRJRCgpIHsKLSAgICAgICAgaW50IGNjaWQgPSAxOwotICAgICAgICByZXR1cm4gY2NpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0dXMpIHsKLSAgICAgICAgTG9nLnYoVEFHLCAib25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkOiBhZGRyZXNzPSIgKyBkZXZpY2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7Ci0gICAgICAgIG1zZy5vYmogPSBkZXZpY2U7Ci0gICAgICAgIG1zZy5hcmcyID0gc3RhdHVzOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG9uTWVkaWFDb250cm9sUG9pbnRDaGFuZ2VSZXEoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICBtc2cud2hhdCA9IEVWRU5UX1RZUEVfTUVESUFfQ09OVFJPTF9QT0lOVF9DSEFOR0VEOwotICAgICAgICBtc2cub2JqID0gZGV2aWNlOwotICAgICAgICBtc2cuYXJnMSA9IHN0YXRlOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gb25UcmFja1Bvc2l0aW9uQ2hhbmdlUmVxKGludCBwb3NpdGlvbikgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLndoYXQgPSBFVkVOVF9UWVBFX1RSQUNLX1BPU0lUSU9OX0NIQU5HRUQ7Ci0gICAgICAgIG1zZy5hcmcxID0gcG9zaXRpb247Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBvblBsYXlpbmdPcmRlckNoYW5nZVJlcShpbnQgb3JkZXIpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gRVZFTlRfVFlQRV9QTEFZSU5HX09SREVSX0NIQU5HRUQ7Ci0gICAgICAgIG1zZy5hcmcxID0gb3JkZXI7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBTZXRBY3RpdmVEZXZpY2VzKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcm9maWxlKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICBtc2cud2hhdCA9IEFDVElWRV9ERVZJQ0VfQ0hBTkdFOwotICAgICAgICBtc2cub2JqID0gZGV2aWNlOwotICAgICAgICBtc2cuYXJnMSA9IDA7IC8vPFRCRD4gaXQgd2lsbCB1c2UgdG8gc2VuZCBtYXJrIHR3byBlYXJidWQgYWRkcmVzcyBpbiBvbmUgZ3AKLSAgICAgICAgbXNnLmFyZzIgPSBwcm9maWxlOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gT25NZWRpYVBsYXllclVwZGF0ZShpbnQgZmVhdHVyZSwgaW50IHN0YXRlLAotICAgICAgICAgICAgICAgaW50IHBsYXlpbmdPcmRlclN1cHBvcnQsIGludCBwbGF5aW5nT3JkZXIsIFN0cmluZyBwbGF5ZXJOYW1lKSB7Ci0gICAgICAgIExvZy53KFRBRywgIk9uTWVkaWFQbGF5ZXJVcGRhdGUgZm9yIHBsYXllciAiICsgcGxheWVyTmFtZSk7Ci0gICAgICAgIENvbnRlbnRDb250cm9sSUQoZ2V0Q29udHJvbENvbnRlbnRJRCgpKTsKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKG1NdXNpY1BsYXllck1hcC5jb250YWluc0tleShwbGF5ZXJOYW1lKSkgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiUGxheWVyIGlzIGFscmVhZHkgdGhlcmUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld1BsYXllciA9ICBuZXcgTXVzaWNQbGF5ZXJEZXRhaWwoKTsKLSAgICAgICAgICAgIG1NdXNpY1BsYXllck1hcC5hZGQobmV3UGxheWVyLCBwbGF5ZXJOYW1lKTsKLSAgICAgICAgfSovCi0KLSAgICAgICAgTWVkaWFQbGF5ZXJOYW1lVXBkYXRlKHBsYXllck5hbWUpOwotICAgICAgICBNZWRpYVN0YXRlVXBkYXRlKHN0YXRlKTsKLSAgICAgICAgLy9hZGRlZCBkZWZhdWx0IHZhbHVlIGFzIHRoZXJlIGlzIG5vIGFwaSBmb3IgZ2V0dGl0aW5nIHN1cHBvcnRlZCBmZWF0dXJlIGZyb20gcGxheWVyCi0gICAgICAgIE1lZGlhQ29udHJvbFBvaW50T3Bjb2RlVXBkYXRlKERFRkFVTFRfTUVESUFfUExBWUVSX1NVUFBPUlRFRF9GRUFUVVJFKTsKLSAgICAgICAgUGxheWluZ09yZGVyU3VwcG9ydGVkVXBkYXRlKERFRkFVTFRfUExBWUVSX1NVUFBPUlRFRF9GRUFUVVJFKTsKLSAgICAgICAgUGxheWluZ09yZGVyVXBkYXRlKERFRkFVTFRfUExBWUlOR19PUkRFUik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBPbk1lZGlhU3RhdGVVcGRhdGUoaW50IHN0YXRlKSB7Ci0gICAgICAgIExvZy53KFRBRywgIk9uTWVkaWFTdGF0ZVVwZGF0ZSBzdGF0ZSAiICsgc3RhdGUpOwotICAgICAgICBNZWRpYVN0YXRlVXBkYXRlKHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIE9uVHJhY2tVcGRhdGUoaW50IHN0YXR1cywgaW50IGR1cmF0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgTG9nLncoVEFHLCAiT25UcmFja1VwZGF0ZSB0aXRsZSAiICsgdGl0bGUgKyAiIGR1cmF0aW9uICIgKyBkdXJhdGlvbik7Ci0gICAgICAgIFRyYWNrQ2hhbmdlZFVwZGF0ZShzdGF0dXMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgIFRyYWNrVGl0bGVVcGRhdGUodGl0bGUpOwotICAgICAgICAgICAgVHJhY2tEdXJhdGlvblVwZGF0ZShkdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIE9uVHJhY2tQb3NpdGlvblVwZGF0ZShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgTG9nLncoVEFHLCAiT25UcmFja1Bvc2l0aW9uVXBkYXRlIHBvc2l0aW9uICIgKyBwb3NpdGlvbik7Ci0gICAgICAgIFRyYWNrUG9zaXRpb25VcGRhdGUocG9zaXRpb24pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gT25QbGF5aW5nT3JkZXJVcGRhdGUoaW50IG9yZGVyKSB7Ci0gICAgICAgIExvZy53KFRBRywgIk9uUGxheWluZ09yZGVyVXBkYXRlIG9yZGVyICIgKyBvcmRlcik7Ci0gICAgICAgIFBsYXlpbmdPcmRlclVwZGF0ZShvcmRlcik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvL0FzIGFwbSBpcyBub3QgaW1wbGVtZW50ZWQgY2FsbGJhY2sgZm9yIGFwbSBhYm92ZSBtZW50aW9uIGZ1bmN0aW9uCi0gICAgLy9pbXBsZW1lbnRlZCB3b3JrYXJvdW5kCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZU1ldGFEYXRhKE1lZGlhTWV0YWRhdGEgZGF0YSkgewotICAgICAgICBMb2cudyhUQUcsICJ1cGRhdGVNZXRhRGF0YSBkYXRhICIgKyBkYXRhKTsKLSAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vbGVuZ3RoIC8vVEJEIHRvIGNvbnZlcnQgaW50byBpbnQKLSAgICAgICAgaW50IGR1cmF0aW9uID0gKGludClkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSBkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgIGlmICh0aXRsZSAhPSBudWxsICYmICEodGl0bGUuZXF1YWxzKG1UcmFja1RpdGxlKSkpIHsKLSAgICAgICAgICAgIFRyYWNrQ2hhbmdlZFVwZGF0ZSgxKTsKLSAgICAgICAgICAgIFRyYWNrVGl0bGVVcGRhdGUodGl0bGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkdXJhdGlvbiAhPSBtVHJhY2tEdXJhdGlvbikKLSAgICAgICAgICAgIFRyYWNrRHVyYXRpb25VcGRhdGUoZHVyYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVQbGF5YmFja1N0YXRlKFBsYXliYWNrU3RhdGUgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICBMb2cudyhUQUcsICJ1cGRhdGVQbGF5YmFja1N0YXRlIHN0YXRlICIgKyBwbGF5YmFja1N0YXRlKTsKLSAgICAgICAgaW50IHN0YXRlID0gKGludCljb252ZXJ0UGxheVN0YXRlVG9QbGF5U3RhdHVzKHBsYXliYWNrU3RhdGUpOwotCi0gICAgICAgIGlmIChzdGF0ZSAhPSBQTEFZU1RBVFVTX0VSUk9SICYmIG1TdGF0ZSAhPSBzdGF0ZSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFBMQVlTVEFUVVNfU1RPUFBFRCkKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFBMQVlTVEFUVVNfUEFVU0VEOwotICAgICAgICAgICAgTWVkaWFTdGF0ZVVwZGF0ZShzdGF0ZSk7Ci0gICAgICAgICAgICBpZiAobUN1cnJPcENvZGUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xQb2ludFVwZGF0ZShtQ3Vyck9wQ29kZSk7Ci0gICAgICAgICAgICAgICAgbUN1cnJPcENvZGUgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgcG9zaXRpb24gPSAoaW50KXBsYXliYWNrU3RhdGUuZ2V0UG9zaXRpb24oKTsKLQotICAgICAgICBpZiAocG9zaXRpb24gIT0gbVRyYWNrUG9zaXRpb24pCi0gICAgICAgICAgICBUcmFja1Bvc2l0aW9uVXBkYXRlKHBvc2l0aW9uKTsKLSAgICAgICAgZmxvYXQgc3BlZWQgPSBwbGF5YmFja1N0YXRlLmdldFBsYXliYWNrU3BlZWQoKTsgLy9mb3IgcGxheWJhY2sgc3BlZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlUGxheWVyTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gcmVtb3ZlZCkgewotICAgICAgICBMb2cudyhUQUcsICJ1cGRhdGVQbGF5ZXJOYW1lIHBrZyAiICsgcGFja2FnZU5hbWUgKyAiIHJlbW92ZWQgIiArIHJlbW92ZWQpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIGludCB0Q2NpZCA9IDA7Ci0gICAgICAgIGludCB0UGxheWVyc3VwcG9ydCA9IDA7Ci0gICAgICAgIGludCB0TWVkaWFzdXBwb3J0ID0gMDsKLSAgICAgICAgaWYgKChyZW1vdmVkICYmIHBhY2thZ2VOYW1lID09IG51bGwgKSB8fAotICAgICAgICAgICAgcmVtb3ZlZCAmJiBwYWNrYWdlTmFtZS5lcXVhbHMobVBsYXllck5hbWUpKSB7Ci0gICAgICAgICAgICAvL25vIGFjdGl2ZSBtZWRpYSBwbGF5ZXIKLSAgICAgICAgICAgIE1lZGlhU3RhdGVVcGRhdGUoUExBWVNUQVRVU19TVE9QUEVEKTsKLSAgICAgICAgICAgIG5hbWUgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmICFwYWNrYWdlTmFtZS5lcXVhbHMobVBsYXllck5hbWUpKSB7Ci0gICAgICAgICAgICBuYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgICAgICB0Q2NpZCA9IGdldENvbnRyb2xDb250ZW50SUQoKTsKLSAgICAgICAgICAgIHRQbGF5ZXJzdXBwb3J0ID0gREVGQVVMVF9QTEFZRVJfU1VQUE9SVEVEX0ZFQVRVUkU7Ci0gICAgICAgICAgICB0TWVkaWFzdXBwb3J0ID0gREVGQVVMVF9NRURJQV9QTEFZRVJfU1VQUE9SVEVEX0ZFQVRVUkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJwbGF5ZXIgbmFtZSBpcyBzYW1lIG5vIG5lZWQgdG8gdXBkYXRlICIgKyBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbmRpbmcgcGxheWVyIGNoYW5nZSB1cGRhdGUiKTsKLSAgICAgICAgICAgIE1lZGlhQ29udHJvbFBvaW50T3Bjb2RlVXBkYXRlKHRNZWRpYXN1cHBvcnQpOwotICAgICAgICAgICAgUGxheWluZ09yZGVyU3VwcG9ydGVkVXBkYXRlKHRQbGF5ZXJzdXBwb3J0KTsKLSAgICAgICAgICAgIE1lZGlhUGxheWVyTmFtZVVwZGF0ZShuYW1lKTsKLSAgICAgICAgICAgIENvbnRlbnRDb250cm9sSUQodENjaWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgTWNwUGFzc3Rocm91Z2hUb0tleUNvZGUoaW50IG9wZXJhdGlvbikgewotICAgICAgICAgbUN1cnJPcENvZGUgPSBvcGVyYXRpb247Ci0gICAgICAgICBzd2l0Y2ggKG9wZXJhdGlvbikgewotICAgICAgICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUExBWToKLSAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZOwotICAgICAgICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUEFVU0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTUVESUFfUEFVU0U7Ci0gICAgICAgICAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9GQVNUX1JFV0lORDoKLSAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9SRVdJTkQ7Ci0gICAgICAgICAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9GQVNUX0ZPUldBUkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOwotICAgICAgICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfU1RPUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9TVE9QOwotICAgICAgICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUFJFVl9UUkFDSzoKLSAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QUkVWSU9VUzsKLSAgICAgICAgICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX05FWFRfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTUVESUFfTkVYVDsKLQotICAgICAgICAgICAgLy8gRmFsbHRocm91Z2ggZm9yIGFsbCB1bmtub3duIGtleSBtYXBwaW5ncwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtQ3Vyck9wQ29kZSA9IC0xOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVua25vd24gcGFzc3Rocm91Z2giKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmICghQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0JPTkRfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLkVSUk9SKTsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwotICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChkZXZpY2UsICJBQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEIHdpdGggbm8gRVhUUkFfREVWSUNFIik7Ci0gICAgICAgICAgICBpZiAoc0luc3RhbmNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYm9uZFN0YXRlQ2hhbmdlZChkZXZpY2UsIHN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBjaGFuZ2UgaW4gdGhlIGJvbmRpbmcgc3RhdGUgZm9yIGEgZGV2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlIHdob3NlIGJvbmRpbmcgc3RhdGUgaGFzIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gYm9uZFN0YXRlIHRoZSBuZXcgYm9uZCBzdGF0ZSBmb3IgdGhlIGRldmljZS4gUG9zc2libGUgdmFsdWVzIGFyZToKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0JPTkRfTk9ORX0sCi0gICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNCT05EX0JPTkRJTkd9LAotICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjQk9ORF9CT05ERUR9LgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgYm9uZFN0YXRlQ2hhbmdlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgYm9uZFN0YXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkJvbmQgc3RhdGUgY2hhbmdlZCBmb3IgZGV2aWNlOiAiICsgZGV2aWNlICsgIiBzdGF0ZTogIiArIGJvbmRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVtb3ZlIHN0YXRlIG1hY2hpbmUgaWYgdGhlIGJvbmRpbmcgZm9yIGEgZGV2aWNlIGlzIHJlbW92ZWQKLSAgICAgICAgaWYgKGJvbmRTdGF0ZSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy91cGRhdGUgdG8gbG93ZXIgbGF5ZXIKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gQk9ORF9TVEFURV9DSEFOR0U7Ci0gICAgICAgIG1zZy5vYmogPSBkZXZpY2U7Ci0gICAgICAgIG1zZy5hcmcxID0gYm9uZFN0YXRlOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01jcE9ubHlEZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBQYXJjZWxVdWlkIEFTQ1NfVVVJRCA9Ci0gICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDE4NEUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci0gICAgICAgIEFkYXB0ZXJTZXJ2aWNlIGFkYXB0ZXJTZXJ2aWNlID0gQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKTsKLSAgICAgICAgYm9vbGVhbiBhc2NzU3VwcG9ydGVkID0KLSAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5jb250YWlucyhhZGFwdGVyU2VydmljZS5nZXRSZW1vdGVVdWlkcyhkZXZpY2UpLCBBU0NTX1VVSUQpOwotICAgICAgICBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXNjc1N1cHBvcnRlZCAmJgotICAgICAgICAgICAgICAgIG1BY21TZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExvZy5kKFRBRywiTWNwT25seSBkZXZpY2UiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgICAvKiogSGFuZGxlcyBNQ1MgbWVzc2FnZXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNY3NNZXNzYWdlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIE1jc01lc3NhZ2VIYW5kbGVyKExvb3BlciBsb29wZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJNY3NNZXNzYWdlSGFuZGxlcjogcmVjZWl2ZWQgbWVzc2FnZT0iICsgbXNnLndoYXQpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFDVElWRV9ERVZJQ0VfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJBQ1RJVkVfREVWSUNFX0NIQU5HRSBtc2c6ICIgKyAoQmx1ZXRvb3RoRGV2aWNlKW1zZy5vYmogKyAiIG1zZzIgOiAiICsgbXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlRGV2aWNlID0gKEJsdWV0b290aERldmljZSltc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLnNldEFjdGl2ZURldmljZSgoQmx1ZXRvb3RoRGV2aWNlKW1zZy5vYmosIG1zZy5hcmcxLCBtc2cuYXJnMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEJPTkRfU1RBVEVfQ0hBTkdFOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJCT05EX1NUQVRFX0NIQU5HRSBtc2c6ICIgKyAoQmx1ZXRvb3RoRGV2aWNlKW1zZy5vYmogKyAiIG1zZzIgOiAiICsgbXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLmJvbmRTdGF0ZUNoYW5nZSgoQmx1ZXRvb3RoRGV2aWNlKW1zZy5vYmosIG1zZy5hcmcyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgUExBWUlOR19PUkRFUl9TVVBQT1JUX1VQREFURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiUExBWUlOR19PUkRFUl9TVVBQT1JUX1VQREFURSBtc2c6ICIgKyBtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQbGF5aW5nT3JkZXIgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5wbGF5aW5nT3JkZXIobXNnLmFyZzEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBQTEFZSU5HX09SREVSX1VQREFURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiUExBWUlOR19PUkRFUl9VUERBVEUgbXNnOiAiICsgbXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBtUGxheWluZ09yZGVyID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UucGxheWluZ09yZGVyKG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVTX1NVUFBPUlRFRF9VUERBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIk1FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFU19TVVBQT1JURURfVVBEQVRFIG1zZzogIiArIG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZENvbnRyb2xQb2ludCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLm1lZGlhQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkKG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVESUFfQ09OVFJPTF9QT0lOVF9VUERBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIk1FRElBX0NPTlRST0xfUE9JTlRfVVBEQVRFIG1zZzogIiArIG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xQb2ludCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLm1lZGlhQ29udHJvbFBvaW50KG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSX05BTUVfVVBEQVRFOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJNRURJQV9QTEFZRVJfTkFNRV9VUERBVEUgbXNnOiAiICsgKFN0cmluZyltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5ZXJOYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5tZWRpYVBsYXllck5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FRElBX1NUQVRFX1VQREFURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiTUVESUFfU1RBVEVfVVBEQVRFIG1zZzogIiArIG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UubWVkaWFTdGF0ZShtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFRSQUNLX0NIQU5HRURfVVBEQVRFOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJUUkFDS19DSEFOR0VEX1VQREFURSBtc2c6ICIgKyBtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudHJhY2tDaGFuZ2VkKG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgVFJBQ0tfRFVSQVRJT05fVVBEQVRFOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJUUkFDS19EVVJBVElPTl9VUERBVEUgbXNnOiAiICsgbXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBtVHJhY2tEdXJhdGlvbiA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLnRyYWNrRHVyYXRpb24obXNnLmFyZzEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBUUkFDS19QT1NJVElPTl9VUERBVEU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlRSQUNLX1BPU0lUSU9OX1VQREFURSBtc2c6ICIgKyBtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja1Bvc2l0aW9uID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudHJhY2tQb3NpdGlvbihtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFRSQUNLX1RJVExFX1VQREFURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiVFJBQ0tfVElUTEVfVVBEQVRFIG1zZzogIiArIChTdHJpbmcpbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICAoU3RyaW5nKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja1RpdGxlID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UudHJhY2tUaXRsZSh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgQ09OVEVOVF9DT05UUk9MX0lEX1VQREFURToKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ09OVEVOVF9DT05UUk9MX0lEX1VQREFURSBtc2c6ICIgKyBtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DY2lkID0gbXNnLmFyZzE7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuY29udGVudENvbnRyb2xJZChtQ2NpZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJFVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCBtc2c6ICIgKyBtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRvIEFQTQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX01FRElBX0NPTlRST0xfUE9JTlRfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiRVZFTlRfVFlQRV9NRURJQV9DT05UUk9MX1BPSU5UX0NIQU5HRUQgbXNnOiAiICsgbXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgbU1jcERldmljZSA9IChCbHVldG9vdGhEZXZpY2UpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBNY3BQYXNzdGhyb3VnaFRvS2V5Q29kZShtc2cuYXJnMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJWYWxpZCBwYXNzdGhyb3VnaCwgZGlzcGF0Y2ggdG8gbWVkaWEgcGxheWVyIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhT2JqZWN0cy5lcXVhbHMobU1jcERldmljZSwgbUFjdGl2ZURldmljZSkgJiYgIWlzTWNwT25seURldmljZShtTWNwRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlRGV2aWNlTWFuYWdlclNlcnZpY2UgbUFjdGl2ZURldmljZU1hbmFnZXIgPSBBY3RpdmVEZXZpY2VNYW5hZ2VyU2VydmljZS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlRGV2aWNlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZURldmljZU1hbmFnZXIuc2V0QWN0aXZlRGV2aWNlKG1NY3BEZXZpY2UsIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuTUVESUFfQVVESU8sIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFdBUi0gRm9yIEZGL1Jld2luZCBVQwotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01FRElBX0ZBU1RfRk9SV0FSRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9SRVdJTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gUExBWVNUQVRVU19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gUExBWVNUQVRVU19TRUVLOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGVVcGRhdGUobVN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xQb2ludFVwZGF0ZShtQ3Vyck9wQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJPcENvZGUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVcGRhdGUgUGxheXN0YXRlIGFzIHNlZWtpbmcgZm9yIEZGL1Jld2luZCBvcGNvZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUExBWVNUQVRVU19TRUVLKSB7IC8vIFRvLURvCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb25NYW5hZ2VyLmRpc3BhdGNoTWVkaWFLZXlFdmVudChldmVudCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsIGNvZGUpOwotICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uTWFuYWdlci5kaXNwYXRjaE1lZGlhS2V5RXZlbnQoZXZlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9QTEFZSU5HX09SREVSX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkVWRU5UX1RZUEVfUExBWUlOR19PUkRFUl9DSEFOR0VEIG1zZzogIiArIG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdG8gQVBNCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfVFJBQ0tfUE9TSVRJT05fQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiRVZFTlRfVFlQRV9UUkFDS19QT1NJVElPTl9DSEFOR0VEIG1zZzogIiArIG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdG8gQVBNCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FRElBX0NPTlRST0xfTUFOQUdFUl9JTklUOgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJNRURJQV9DT05UUk9MX01BTkFHRVJfSU5JVCIpOwotICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCltc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xNYW5hZ2VyLm1ha2UoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ1bmtub3duIG1lc3NhZ2UhIG1zZy53aGF0PSIgKyBtc2cud2hhdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cudihUQUcsICJFeGl0IGhhbmRsZU1lc3NhZ2UiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmRlciBvYmplY3Q6IG11c3QgYmUgYSBzdGF0aWMgY2xhc3Mgb3IgbWVtb3J5IGxlYWsgbWF5IG9jY3VyLgotICAgICAqLwotCi0gICAgc3RhdGljIGNsYXNzIE1jcEJpbmRlciBleHRlbmRzIEJpbmRlciBpbXBsZW1lbnRzIElQcm9maWxlU2VydmljZUJpbmRlciB7Ci0gICAgICAgIHByaXZhdGUgTWNwU2VydmljZSBtU2VydmljZTsKLQotICAgICAgICBwcml2YXRlIE1jcFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgICAgIGlmICghVXRpbHMuY2hlY2tDYWxsZXJJc1N5c3RlbU9yQWN0aXZlVXNlcihUQUcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIG1TZXJ2aWNlLmlzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1jcEJpbmRlcihNY3BTZXJ2aWNlIHN2YykgewotICAgICAgICAgICAgbVNlcnZpY2UgPSBzdmM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvcGFjc2NsaWVudC9QQ1NlcnZpY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvcGFjc2NsaWVudC9QQ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4NDc3MS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY3NjbGllbnQvUENTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGgucGM7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1ldHJpY3NQcm90bzsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5BZGFwdGVyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLk1ldHJpY3NMb2dnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLQotcHVibGljIGNsYXNzIFBDU2VydmljZSBleHRlbmRzIFByb2ZpbGVTZXJ2aWNlewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUENTZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QQUNTX1NUQVRFX01BQ0hJTkVTID0gNTA7Ci0KLSAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbVN0YXRlTWFjaGluZXNUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEJsdWV0b290aERldmljZSwgUGFjc0NsaWVudFN0YXRlTWFjaGluZT4gbVN0YXRlTWFjaGluZXMgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXI7Ci0KLSAgICBwcml2YXRlIEFkYXB0ZXJTZXJ2aWNlIG1BZGFwdGVyU2VydmljZTsKLSAgICBwcml2YXRlIFBhY3NDbGllbnROYXRpdmVJbnRlcmZhY2UgbU5hdGl2ZUludGVyZmFjZTsKLSAgICBwcml2YXRlIHN0YXRpYyBQQ1NlcnZpY2Ugc0luc3RhbmNlID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPQotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgucGFjcy5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUENTZXJ2aWNlIGluc3RhbmNlLiBSZXR1cm5zIG51bGwgaWYgdGhlIHNlcnZpY2UgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQQ1NlcnZpY2UgZ2V0KCkgewotICAgICAgICByZXR1cm4gc0luc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJUHJvZmlsZVNlcnZpY2VCaW5kZXIgaW5pdEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJjcmVhdGUoKSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnQoKSB7Ci0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RhcnQoKSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzSW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUENTZXJ2aWNlIGlzIGFscmVhZHkgcnVubmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtQWRhcHRlclNlcnZpY2UgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKEFkYXB0ZXJTZXJ2aWNlLmdldEFkYXB0ZXJTZXJ2aWNlKCksCi0gICAgICAgICAgICAgICAgIkFkYXB0ZXJTZXJ2aWNlIGNhbm5vdCBiZSBudWxsIHdoZW4gUENTZXJ2aWNlIHN0YXJ0cyIpOwotICAgICAgICBtTmF0aXZlSW50ZXJmYWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChQYWNzQ2xpZW50TmF0aXZlSW50ZXJmYWNlLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgIlBhY3NDbGllbnROYXRpdmVJbnRlcmZhY2UgY2Fubm90IGJlIG51bGwgd2hlbiBQQ1NlcnZpY2Ugc3RhcnRzIik7Ci0KLSAgICAgICAgLy8gU3RhcnQgaGFuZGxlciB0aHJlYWQgZm9yIHN0YXRlIG1hY2hpbmVzCi0gICAgICAgIG1TdGF0ZU1hY2hpbmVzLmNsZWFyKCk7Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlBDU2VydmljZS5TdGF0ZU1hY2hpbmVzIik7Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuaW5pdCgpOwotICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOwotCi0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyID0gbmV3IEJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlcigpOwotICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIsIGZpbHRlcik7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RvcCgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzdG9wKCkgY2FsbGVkIGJlZm9yZSBzdGFydCgpIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVucmVnaXN0ZXJSZWNlaXZlcihtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyKTsKLQotICAgICAgICAvLyBNYXJrIHNlcnZpY2UgYXMgc3RvcHBlZAotICAgICAgICBzSW5zdGFuY2UgPSBudWxsOwotCi0gICAgICAgIC8vIERlc3Ryb3kgc3RhdGUgbWFjaGluZXMgYW5kIHN0b3AgaGFuZGxlciB0aHJlYWQKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgZm9yIChQYWNzQ2xpZW50U3RhdGVNYWNoaW5lIHNtIDogbVN0YXRlTWFjaGluZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzbS5kb1F1aXQoKTsKLSAgICAgICAgICAgICAgICBzbS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lcy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TdGF0ZU1hY2hpbmVzVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsZWFudXAgbmF0aXZlIGludGVyZmFjZQotICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLmNsZWFudXAoKTsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gQ2xlYXIgQWRhcHRlclNlcnZpY2UKLSAgICAgICAgbUFkYXB0ZXJTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2xlYW51cCgpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICogR2V0IHRoZSBQQ1NlcnZpY2UgaW5zdGFuY2UKLSAgICogQHJldHVybiBQQ1NlcnZpY2UgaW5zdGFuY2UKLSAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUENTZXJ2aWNlIGdldFBDU2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJnZXRQQ1NlcnZpY2UoKTogc2VydmljZSBpcyBOVUxMIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdHMgdGhlIHBhY3MgcHJvZmlsZSB0byB0aGUgcGFzc2VkIGluIGRldmljZQotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBpcyB0aGUgZGV2aWNlIHdpdGggd2hpY2ggd2Ugd2lsbCBjb25uZWN0IHRoZSBwYWNzICBwcm9maWxlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHBhY3MgcHJvZmlsZSBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJjb25uZWN0KCk6ICIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgUGFjc0NsaWVudFN0YXRlTWFjaGluZSBzbUNvbm5lY3QgPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtQ29ubmVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gIiArIGRldmljZSArICIgOiBubyBzdGF0ZSBtYWNoaW5lIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc21Db25uZWN0LnNlbmRNZXNzYWdlKFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUuQ09OTkVDVCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0cyBwYWNzIHByb2ZpbGUgZm9yIHRoZSBwYXNzZWQgaW4gZGV2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGlzIHRoZSBkZXZpY2Ugd2l0aCB3aGljaCB3ZSB3YW50IHRvIGRpc2Nvbm5lY3RlZCB0aGUgcGFjcyBwcm9maWxlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHBhY3MgcHJvZmlsZSBzdWNjZXNzZnVsbHkgZGlzY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLQotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJkaXNjb25uZWN0KCk6ICIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkaXNjb25uZWN0OiBkZXZpY2UgIiArIGRldmljZSArICIgbm90IGV2ZXIgY29ubmVjdGVkL2Nvbm5lY3RpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgY29ubmVjdGlvblN0YXRlID0gc3RhdGVNYWNoaW5lLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAmJiBjb25uZWN0aW9uU3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGlzY29ubmVjdDogZGV2aWNlICIgKyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgY29ubmVjdGVkL2Nvbm5lY3RpbmcsIGNvbm5lY3Rpb25TdGF0ZT0iICsgY29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UoUGFjc0NsaWVudFN0YXRlTWFjaGluZS5ESVNDT05ORUNUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzdGFydCBwYWNzIGRpc29jdmVyeSBmb3IgdGhlIHBhc3NlZCBpbiBkZXZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgaXMgdGhlIGRldmljZSB3aXRoIHdoaWNoIHdlIHdhbnQgdG8gZGljc2NvZXIgdGhlIHBhY3MKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGFjcyBkaXNjb3ZlcnkgaXMgc3VjY2Vzc2Z1bGwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRQYWNzRGlzY292ZXJ5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInN0YXJ0UGFjc0Rpc2NvdmVyeTogZGV2aWNlPSIgKyBkZXZpY2UgKyAiLCAiICsgVXRpbHMuZ2V0VWlkUGlkU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInN0YXJ0UGFjc0Rpc2NvdmVyeTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIHdhcyBuZXZlciBjb25uZWN0ZWQvY29ubmVjdGluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGF0ZU1hY2hpbmUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3RhcnRQYWNzRGlzY292ZXJ5OiBwcm9maWxlIG5vdCBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UoUGFjc0NsaWVudFN0YXRlTWFjaGluZS5TVEFSVF9ESVNDT1ZFUlkpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBzaW5rIHBhY3MgZm9yIHRoZSBwYXNzZWQgaW4gZGV2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGlzIHRoZSBkZXZpY2Ugd2l0aCB3aGljaCB3ZSB3YW50IHRvIGdldCBzaW5rIHBhY3MKLSAgICAgKiBAcmV0dXJuIHNpbmsgcGFjcwotICAgICAqLwotCi0gICAgcHVibGljIEJsdWV0b290aENvZGVjQ29uZmlnW10gZ2V0U2lua1BhY3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBmaW5hbCBQYWNzQ2xpZW50U3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGdldCBTaW5rIFBhY3MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0ZU1hY2hpbmUuZ2V0U2lua1BhY3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBzcmMgcGFjcyBmb3IgdGhlIHBhc3NlZCBpbiBkZXZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgaXMgdGhlIGRldmljZSB3aXRoIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IHNyYyBwYWNzCi0gICAgICogQHJldHVybiBzcmMgcGFjcwotICAgICAqLwotCi0gICAgcHVibGljIEJsdWV0b290aENvZGVjQ29uZmlnW10gZ2V0U3JjUGFjcyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZ2V0IFNyYyBQYWNzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGVNYWNoaW5lLmdldFNpbmtQYWNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgc2luayBsb2NhdGlvbnMgZm9yIHRoZSBwYXNzZWQgaW4gZGV2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGlzIHRoZSBkZXZpY2Ugd2l0aCB3aGljaCB3ZSB3YW50IHRvIGdldCBzaW5rIGxvY2F0aW9uCi0gICAgICogQHJldHVybiBzaW5rIGxvY2F0aW9ucwotICAgICAqLwotCi0gICAgcHVibGljIGludCBnZXRTaW5rbG9jYXRpb25zKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgZmluYWwgUGFjc0NsaWVudFN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZU1hY2hpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBnZXQgc2luayBsb2NhdGlvbnMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGVNYWNoaW5lLmdldFNpbmtsb2NhdGlvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBzcmMgbG9jYXRpb25zIGZvciB0aGUgcGFzc2VkIGluIGRldmljZQotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBpcyB0aGUgZGV2aWNlIHdpdGggd2hpY2ggd2Ugd2FudCB0byBnZXQgc3JjIGxvY2F0aW9uCi0gICAgICogQHJldHVybiBzcmMgbG9jYXRpb25zCi0gICAgICovCi0KLSAgICBwdWJsaWMgaW50IGdldFNyY2xvY2F0aW9ucyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZ2V0IHNyYyBsb2NhdGlvbnMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGVNYWNoaW5lLmdldFNyY2xvY2F0aW9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IGF2YWlsYWJsZSBjb250ZXh0cyBmb3IgdGhlIHBhc3NlZCBpbiBkZXZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgaXMgdGhlIGRldmljZSB3aXRoIHdoaWNoIHdlIHdhbnQgdG8gZ2V0IGF2YWlsYWJsZSBjb250ZXh0cwotICAgICAqIEByZXR1cm4gYXZhaWFsYWJsZSBjb250ZXh0cwotICAgICAqLwotCi0gICAgcHVibGljIGludCBnZXRBdmFpbGFibGVDb250ZXh0cyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZ2V0IGF2YWlsYWJsZSBjb250ZXh0cyIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0ZU1hY2hpbmUuZ2V0QXZhaWxhYmxlQ29udGV4dHMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBzdXBwb3J0ZWQgY29udGV4dHMgZm9yIHRoZSBwYXNzZWQgaW4gZGV2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGlzIHRoZSBkZXZpY2Ugd2l0aCB3aGljaCB3ZSB3YW50IHRvIGdldCBzdXBwb3J0ZWQgY29udGV4dHMKLSAgICAgKiBAcmV0dXJuIHN1cHBvcnRlZCBjb250ZXh0cwotICAgICAqLwotCi0gICAgcHVibGljIGludCBnZXRTdXBwb3J0ZWRDb250ZXh0cyhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZ2V0IHN1cHBvcnRlZCBjb250ZXh0cyIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0ZU1hY2hpbmUuZ2V0U3VwcG9ydGVkQ29udGV4dHMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIGlzIHRoZSByZW1vdGUgYmx1ZXRvb3RoIGRldmljZQotICAgICAqIEByZXR1cm4ge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjU1RBVEVfRElTQ09OTkVDVEVEfSBpZiB0aGlzIHByb2ZpbGUgaXMgZGlzY29ubmVjdGVkLAotICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI1NUQVRFX0NPTk5FQ1RJTkd9IGlmIHRoaXMgcHJvZmlsZSBpcyBiZWluZyBjb25uZWN0ZWQsCi0gICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjU1RBVEVfQ09OTkVDVEVEfSBpZiB0aGlzIHByb2ZpbGUgaXMgY29ubmVjdGVkLCBvcgotICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IGlmIHRoaXMgcHJvZmlsZSBpcyBiZWluZyBkaXNjb25uZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNtLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gb2tUb0Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotCi0gICAgICAgIGludCBib25kU3RhdGUgPSBtQWRhcHRlclNlcnZpY2UuZ2V0Qm9uZFN0YXRlKGRldmljZSk7Ci0gICAgICAgIGlmIChib25kU3RhdGUgIT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJva1RvQ29ubmVjdDogcmV0dXJuIGZhbHNlLCBib25kU3RhdGU9IiArIGJvbmRTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgbWVzc2FnZUZyb21OYXRpdmUoUGFjc0NsaWVudFN0YWNrRXZlbnQgc3RhY2tFdmVudCkgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHN0YWNrRXZlbnQuZGV2aWNlLAotICAgICAgICAgICAgICAgICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIG51bGwsIGV2ZW50OiAiICsgc3RhY2tFdmVudCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IHN0YWNrRXZlbnQuZGV2aWNlOwotICAgICAgICAgICAgUGFjc0NsaWVudFN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhY2tFdmVudC50eXBlID09IFBhY3NDbGllbnRTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhY2tFdmVudC52YWx1ZUludDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbSA9IGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3QgcHJvY2VzcyBzdGFjayBldmVudDogbm8gc3RhdGUgbWFjaGluZTogIiArIHN0YWNrRXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUuU1RBQ0tfRVZFTlQsIHN0YWNrRXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRGcm9tU3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBpbnQgbmV3U3RhdGUsIGludCBwcmV2U3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkRnJvbVN0YXRlTWFjaGluZSBmb3IgZGV2aWNlOiAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICsgIiBuZXdTdGF0ZTogIiArIG5ld1N0YXRlKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBpbnQgYm9uZFN0YXRlID0gbUFkYXB0ZXJTZXJ2aWNlLmdldEJvbmRTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChib25kU3RhdGUgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUGFjc0NsaWVudCBnZXQgY29ubmVjdGVkIHdpdGggcmVuZGVyZXIgZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgaWYgKCFCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfQk9ORF9TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuRVJST1IpOwotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSk7Ci0gICAgICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGRldmljZSwgIkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQgd2l0aCBubyBFWFRSQV9ERVZJQ0UiKTsKLSAgICAgICAgICAgIGJvbmRTdGF0ZUNoYW5nZWQoZGV2aWNlLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGEgY2hhbmdlIGluIHRoZSBib25kaW5nIHN0YXRlIGZvciBhIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIGRldmljZSB3aG9zZSBib25kaW5nIHN0YXRlIGhhcyBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGJvbmRTdGF0ZSB0aGUgbmV3IGJvbmQgc3RhdGUgZm9yIHRoZSBkZXZpY2UuIFBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0gICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNCT05EX05PTkV9LAotICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjQk9ORF9CT05ESU5HfSwKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0JPTkRfQk9OREVEfS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICB2b2lkIGJvbmRTdGF0ZUNoYW5nZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGJvbmRTdGF0ZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJCb25kIHN0YXRlIGNoYW5nZWQgZm9yIGRldmljZTogIiArIGRldmljZSArICIgc3RhdGU6ICIgKyBib25kU3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSBzdGF0ZSBtYWNoaW5lIGlmIHRoZSBib25kaW5nIGZvciBhIGRldmljZSBpcyByZW1vdmVkCi0gICAgICAgIGlmIChib25kU3RhdGUgIT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChzbS5nZXRDb25uZWN0aW9uU3RhdGUoKSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJlbW92ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVN0YXRlTWFjaGluZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicmVtb3ZlU3RhdGVNYWNoaW5lOiBkZXZpY2UgIiArIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGhhdmUgYSBzdGF0ZSBtYWNoaW5lIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmkoVEFHLCAicmVtb3ZlU3RhdGVNYWNoaW5lOiByZW1vdmluZyBzdGF0ZSBtYWNoaW5lIGZvciBkZXZpY2U6ICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgc20uZG9RdWl0KCk7Ci0gICAgICAgICAgICBzbS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lcy5yZW1vdmUoZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUGFjc0NsaWVudFN0YXRlTWFjaGluZSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUgZmFpbGVkOiBkZXZpY2UgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZU1hY2hpbmVzLnNpemUoKSA+PSBNQVhfUEFDU19TVEFURV9NQUNISU5FUykgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIk1heGltdW0gbnVtYmVyIG9mIFBBQ1Mgc3RhdGUgbWFjaGluZXMgcmVhY2hlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBNQVhfUEFDU19TVEFURV9NQUNISU5FUyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ3JlYXRpbmcgYSBuZXcgc3RhdGUgbWFjaGluZSBmb3IgIiArIGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbSA9IFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUubWFrZShkZXZpY2UsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UsIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzLnB1dChkZXZpY2UsIHNtKTsKLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY3NjbGllbnQvUGFjc0NsaWVudE5hdGl2ZUludGVyZmFjZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9wYWNzY2xpZW50L1BhY3NDbGllbnROYXRpdmVJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhNGM1MS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY3NjbGllbnQvUGFjc0NsaWVudE5hdGl2ZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBEZWZpbmVzIHRoZSBuYXRpdmUgaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCBieSBzdGF0ZSBtYWNoaW5lL3NlcnZpY2UgdG8KLSAqIHNlbmQgb3IgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBuYXRpdmUgc3RhY2suIFRoaXMgZmlsZSBpcyByZWdpc3RlcmVkCi0gKiBmb3IgdGhlIG5hdGl2ZSBtZXRob2RzIGluIHRoZSBjb3JyZXNwb25kaW5nIEpOSSBDKysgZmlsZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGgucGM7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotLyoqCi0gKiBQYWNzQ2xpZW50IE5hdGl2ZSBJbnRlcmZhY2UgdG8vZnJvbSBKTkkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNzQ2xpZW50TmF0aXZlSW50ZXJmYWNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBhY3NDbGllbnROYXRpdmVJbnRlcmZhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgcGFjc19jbGllbnRfaWQgPSAtMTsKLQotICAgIEBHdWFyZGVkQnkoIklOU1RBTkNFX0xPQ0siKQotICAgIHByaXZhdGUgc3RhdGljIFBhY3NDbGllbnROYXRpdmVJbnRlcmZhY2Ugc0luc3RhbmNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJTlNUQU5DRV9MT0NLID0gbmV3IE9iamVjdCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYWNzQ2xpZW50TmF0aXZlSW50ZXJmYWNlKCkgewotICAgICAgICBtQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53dGYoVEFHLCAiTm8gQmx1ZXRvb3RoIEFkYXB0ZXIgQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUGFjc0NsaWVudE5hdGl2ZUludGVyZmFjZSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChJTlNUQU5DRV9MT0NLKSB7Ci0gICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgUGFjc0NsaWVudE5hdGl2ZUludGVyZmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBuYXRpdmUgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogcHJpb3JpdGllcyB0byBjb25maWd1cmUuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaW5pdE5hdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFudXAgdGhlIG5hdGl2ZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgY2xlYW51cE5hdGl2ZShwYWNzX2NsaWVudF9pZCk7Ci0gICAgICAgIHBhY3NfY2xpZW50X2lkID0gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGVzIFBhY3NDbGllbnQgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0UGFjc0NsaWVudChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBjb25uZWN0UGFjc0NsaWVudE5hdGl2ZShwYWNzX2NsaWVudF9pZCwgZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgUGFjc0NsaWVudCBmcm9tIGEgcmVtb3RlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RQYWNzQ2xpZW50KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3RQYWNzQ2xpZW50TmF0aXZlKHBhY3NfY2xpZW50X2lkLCBnZXRCeXRlQWRkcmVzcyhkZXZpY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmlnZ2VyIHNlcnZpY2UgZGlzY292ZXJ5IGZvciBwYWNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydERpc2NvdmVyeU5hdGl2ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBzdGFydERpc2NvdmVyeU5hdGl2ZShwYWNzX2NsaWVudF9pZCwgZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIGdldCBhdmFpbGFibGUgYXVkaW8gY29udGV4dHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBHZXRBdmFpbGFibGVBdWRpb0NvbnRleHRzKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIEdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHNOYXRpdmUocGFjc19jbGllbnRfaWQsIGdldEJ5dGVBZGRyZXNzKGRldmljZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIGdldERldmljZShieXRlW10gYWRkcmVzcykgewotICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gZ2V0Qnl0ZUFkZHJlc3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKCIwMDowMDowMDowMDowMDowMCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVRvU2VydmljZShQYWNzQ2xpZW50U3RhY2tFdmVudCBldmVudCkgewotICAgICAgICBQQ1NlcnZpY2Ugc2VydmljZSA9IFBDU2VydmljZS5nZXRQQ1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZS5tZXNzYWdlRnJvbU5hdGl2ZShldmVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFdmVudCBpZ25vcmVkLCBzZXJ2aWNlIG5vdCBhdmFpbGFibGU6ICIgKyBldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDYWxsYmFja3MgZnJvbSB0aGUgbmF0aXZlIHN0YWNrIGJhY2sgaW50byB0aGUgSmF2YSBmcmFtZXdvcmsuCi0gICAgLy8gQWxsIGNhbGxiYWNrcyBhcmUgcm91dGVkIHZpYSB0aGUgU2VydmljZSB3aGljaCB3aWxsIGRpc2FtYmlndWF0ZSB3aGljaAotICAgIC8vIHN0YXRlIG1hY2hpbmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHJvdXRlZCB0by4KLQotICAgIHByaXZhdGUgdm9pZCBPbkluaXRpYWxpemVkKGludCBzdGF0ZSwgaW50IGNsaWVudF9pZCkgewotICAgICAgICBwYWNzX2NsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKGJ5dGVbXSBhZGRyZXNzLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgUGFjc0NsaWVudFN0YWNrRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgICAgIG5ldyBQYWNzQ2xpZW50U3RhY2tFdmVudChQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIGV2ZW50LmRldmljZSA9IGdldERldmljZShhZGRyZXNzKTsKLSAgICAgICAgZXZlbnQudmFsdWVJbnQxID0gc3RhdGU7Ci0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgT25BdWRpb0NvbnRleHRBdmFpbGFibGUoYnl0ZVtdIGFkZHJlc3MsIGludCBhdmFpbGFibGVfY29udGV4dHMpIHsKLSAgICAgICAgUGFjc0NsaWVudFN0YWNrRXZlbnQgZXZlbnQgPQotICAgICAgICAgICAgICAgIG5ldyBQYWNzQ2xpZW50U3RhY2tFdmVudChQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX0FVRElPX0NPTlRFWFRfQVZBSUwpOwotICAgICAgICBldmVudC5kZXZpY2UgPSBnZXREZXZpY2UoYWRkcmVzcyk7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50MSA9IGF2YWlsYWJsZV9jb250ZXh0czsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJPbkF1ZGlvQ29udGV4dEF2YWlsYWJsZTogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kTWVzc2FnZVRvU2VydmljZShldmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2VydmljZURpc2NvdmVyeShCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIHNpbmtfcGFjc19hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnW10gc3JjX3BhY3NfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lua19sb2NhdGlvbnMsIGludCBzcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF2YWlsYWJsZV9jb250ZXh0cywgaW50IHN1cHBvcnRlZF9jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMsIGJ5dGVbXSBhZGRyZXNzKSB7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAib25TZXJ2aWNlRGlzY292ZXJ5OiBGYWlsZWQiICsgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBQYWNzQ2xpZW50U3RhY2tFdmVudCBldmVudCA9IG5ldyBQYWNzQ2xpZW50U3RhY2tFdmVudCgKLSAgICAgICAgICAgICAgICBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX1NFUlZJQ0VfRElTQ09WRVJZKTsKLSAgICAgICAgZXZlbnQuZGV2aWNlID0gZ2V0RGV2aWNlKGFkZHJlc3MpOwotICAgICAgICBldmVudC5zaW5rQ29kZWNDb25maWcgPSBzaW5rX3BhY3NfYXJyYXk7Ci0gICAgICAgIGV2ZW50LnNyY0NvZGVjQ29uZmlnID0gc3JjX3BhY3NfYXJyYXk7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50MSA9IHNpbmtfbG9jYXRpb25zOwotICAgICAgICBldmVudC52YWx1ZUludDIgPSBzcmNfbG9jYXRpb25zOwotICAgICAgICBldmVudC52YWx1ZUludDMgPSBhdmFpbGFibGVfY29udGV4dHM7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50NCA9IHN1cHBvcnRlZF9jb250ZXh0czsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlRGlzY292ZXJ5OiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoQmx1ZXRvb3RoQ29kZWNDb25maWcgY29kZWNDb25maWcgOgotICAgICAgICAgICAgICAgICAgICBzaW5rX3BhY3NfYXJyYXkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzaW5rX3BhY3NfYXJyYXk6ICIgKyBjb2RlY0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChCbHVldG9vdGhDb2RlY0NvbmZpZyBjb2RlY0NvbmZpZyA6Ci0gICAgICAgICAgICAgICAgICAgIHNyY19wYWNzX2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic3JjX3BhY3NfYXJyYXk6ICIgKyBjb2RlY0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic2luayBsb2NzOiAiICsgc2lua19sb2NhdGlvbnMgKyAic3JjIGxvY3M6IiArIHNyY19sb2NhdGlvbnMpOwotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYXZhaWwgY3R4dHM6ICIgKyBhdmFpbGFibGVfY29udGV4dHMgKyAic3VwcCBjdHh0czogIiArIHN1cHBvcnRlZF9jb250ZXh0cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZW5kTWVzc2FnZVRvU2VydmljZShldmVudCk7Ci0gICAgfQotCi0gICAgLy8gTmF0aXZlIG1ldGhvZHMgdGhhdCBjYWxsIGludG8gdGhlIEpOSSBpbnRlcmZhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGFzc0luaXROYXRpdmUoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXROYXRpdmUoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGNsZWFudXBOYXRpdmUoaW50IGNsaWVudF9pZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0UGFjc0NsaWVudE5hdGl2ZShpbnQgY2xpZW50X2lkLCBieXRlW10gYWRkcmVzcyk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0UGFjc0NsaWVudE5hdGl2ZShpbnQgY2xpZW50X2lkLCBieXRlW10gYWRkcmVzcyk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzdGFydERpc2NvdmVyeU5hdGl2ZShpbnQgY2xpZW50X2lkLCBieXRlW10gYWRkcmVzcyk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBHZXRBdmFpbGFibGVBdWRpb0NvbnRleHRzTmF0aXZlKGludCBjbGllbnRfaWQsIGJ5dGVbXSBhZGRyZXNzKTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvcGFjc2NsaWVudC9QYWNzQ2xpZW50U3RhY2tFdmVudC5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9wYWNzY2xpZW50L1BhY3NDbGllbnRTdGFja0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMWJlNjEuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC9wYWNzY2xpZW50L1BhY3NDbGllbnRTdGFja0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC5wYzsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDb2RlY0NvbmZpZzsKLQotCi0vKioKLSAqIFN0YWNrIGV2ZW50IHNlbnQgdmlhIGEgY2FsbGJhY2sgZnJvbSBKTkkgdG8gSmF2YSwgb3IgZ2VuZXJhdGVkCi0gKiBpbnRlcm5hbGx5IGJ5IHRoZSBQYWNzIENsZWludCBTdGF0ZSBNYWNoaW5lLgotICovCi1wdWJsaWMgY2xhc3MgUGFjc0NsaWVudFN0YWNrRXZlbnQgewotICAgIC8vIEV2ZW50IHR5cGVzIGZvciBTVEFDS19FVkVOVCBtZXNzYWdlIChjb21pbmcgZnJvbSBuYXRpdmUpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfTk9ORSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9JTklUSUFMSVpFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfU0VSVklDRV9ESVNDT1ZFUlkgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfQVVESU9fQ09OVEVYVF9BVkFJTCA9IDQ7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHdpdGhvdXQgdXBkYXRpbmcgdGhlIEhBTCBidF9wYWNzX2NsaWVudC5oIGZpbGVzLgotICAgIC8vIE1hdGNoIHVwIHdpdGggZW51bSBjbGFzcyBDb25uZWN0aW9uU3RhdGUgb2YgYnRfcGFjc19jbGllbnQuaC4KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORyA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOwotCi0gICAgcHVibGljIGludCB0eXBlOwotICAgIHB1YmxpYyBCbHVldG9vdGhEZXZpY2UgZGV2aWNlOwotICAgIHB1YmxpYyBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIHNpbmtDb2RlY0NvbmZpZzsKLSAgICBwdWJsaWMgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBzcmNDb2RlY0NvbmZpZzsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50MTsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50MjsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50MzsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50NDsKLQotICAgIFBhY3NDbGllbnRTdGFja0V2ZW50KGludCB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gZXZlbnQgZHVtcAotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlBhY3NDbGllbnRTdGFja0V2ZW50IHt0eXBlOiIgKyBldmVudFR5cGVUb1N0cmluZyh0eXBlKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGV2aWNlOiIgKyBkZXZpY2UpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZhbHVlMToiICsgdmFsdWVJbnQxKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTI6IiArIHZhbHVlSW50Mik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdmFsdWUzOiIgKyB2YWx1ZUludDMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZhbHVlNDoiICsgdmFsdWVJbnQ0KTsKLSAgICAgICAgaWYgKHNpbmtDb2RlY0NvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNpbmtDb2RlY0NvbmZpZzoiICsgc2lua0NvZGVjQ29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjQ29kZWNDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzcmNDb2RlY0NvbmZpZzoiICsgc3JjQ29kZWNDb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIn0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBldmVudFR5cGVUb1N0cmluZyhpbnQgdHlwZSkgewotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9OT05FOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9OT05FIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCI7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfSU5JVElBTElaRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX0lOSVRJQUxJWkVEIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9BVURJT19DT05URVhUX0FWQUlMOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9BVURJT19DT05URVhUX0FWQUlMIjsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9TRVJWSUNFX0RJU0NPVkVSWToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfU0VSVklDRV9ESVNDT1ZFUlkiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfVU5LTk9XTjoiICsgdHlwZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvcGFjc2NsaWVudC9QYWNzQ2xpZW50U3RhdGVNYWNoaW5lLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY3NjbGllbnQvUGFjc0NsaWVudFN0YXRlTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2ZmMTZlLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvcGFjc2NsaWVudC9QYWNzQ2xpZW50U3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCbHVldG9vdGggUGFjc0NsaWVudCBTdGF0ZU1hY2hpbmUuIFRoZXJlIGlzIG9uZSBpbnN0YW5jZSBwZXIgcmVtb3RlIGRldmljZS4KLSAqICAtICJEaXNjb25uZWN0ZWQiIGFuZCAiQ29ubmVjdGVkIiBhcmUgc3RlYWR5IHN0YXRlcy4KLSAqICAtICJDb25uZWN0aW5nIiBhbmQgIkRpc2Nvbm5lY3RpbmciIGFyZSB0cmFuc2llbnQgc3RhdGVzIHVudGlsIHRoZQotICogICAgIGNvbm5lY3Rpb24gLyBkaXNjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KLSAqCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAoRGlzY29ubmVjdGVkKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIF4KLSAqICAgICAgICAgICAgICAgICAgIENPTk5FQ1QgfCAgICAgICB8IERJU0NPTk5FQ1RFRAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBWICAgICAgIHwKLSAqICAgICAgICAgICAgICAgICAoQ29ubmVjdGluZyk8LS0tPihEaXNjb25uZWN0aW5nKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIF4KLSAqICAgICAgICAgICAgICAgICBDT05ORUNURUQgfCAgICAgICB8IERJU0NPTk5FQ1QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgViAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbm5lY3RlZCkKLSAqIE5PVEVTOgotICogIC0gSWYgc3RhdGUgbWFjaGluZSBpcyBpbiAiQ29ubmVjdGluZyIgc3RhdGUgYW5kIHRoZSByZW1vdGUgZGV2aWNlIHNlbmRzCi0gKiAgICBESVNDT05ORUNUIHJlcXVlc3QsIHRoZSBzdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb25zIHRvICJEaXNjb25uZWN0aW5nIiBzdGF0ZS4KLSAqICAtIFNpbWlsYXJseSwgaWYgdGhlIHN0YXRlIG1hY2hpbmUgaXMgaW4gIkRpc2Nvbm5lY3RpbmciIHN0YXRlIGFuZCB0aGUgcmVtb3RlIGRldmljZQotICogICAgc2VuZHMgQ09OTkVDVCByZXF1ZXN0LCB0aGUgc3RhdGUgbWFjaGluZSB0cmFuc2l0aW9ucyB0byAiQ29ubmVjdGluZyIgc3RhdGUuCi0gKgotICogICAgICAgICAgICAgICAgICAgIERJU0NPTk5FQ1QKLSAqICAgIChDb25uZWN0aW5nKSAtLS0tLS0tLS0tLS0tLS0+IChEaXNjb25uZWN0aW5nKQotICogICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0KLSAqICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1QKLSAqCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5ibHVldG9vdGgucGM7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENvZGVjQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYnRzZXJ2aWNlLlByb2ZpbGVTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5TdGF0ZU1hY2hpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci0KLWZpbmFsIGNsYXNzIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBTdGF0ZU1hY2hpbmUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQYWNzQ2xpZW50U3RhdGVNYWNoaW5lIjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0RJU0NPVkVSWSA9IDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBHRVRfQVZBSUxBQkxFX0NPTlRFWFRTID0gNDsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IFNUQUNLX0VWRU5UID0gMTAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1RJTUVPVVQgPSAyMDE7Ci0KLSAgICAvLyBOT1RFOiB0aGUgdmFsdWUgaXMgbm90ICJmaW5hbCIgLSBpdCBpcyBtb2RpZmllZCBpbiB0aGUgdW5pdCB0ZXN0cwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBpbnQgc0Nvbm5lY3RUaW1lb3V0TXMgPSAzMDAwMDsgICAgICAgIC8vIDMwcwotCi0gICAgcHJpdmF0ZSBEaXNjb25uZWN0ZWQgbURpc2Nvbm5lY3RlZDsKLSAgICBwcml2YXRlIENvbm5lY3RpbmcgbUNvbm5lY3Rpbmc7Ci0gICAgcHJpdmF0ZSBEaXNjb25uZWN0aW5nIG1EaXNjb25uZWN0aW5nOwotICAgIHByaXZhdGUgQ29ubmVjdGVkIG1Db25uZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3RDb25uZWN0aW9uU3RhdGUgPSAtMTsKLQotICAgIHByaXZhdGUgUENTZXJ2aWNlIG1TZXJ2aWNlOwotICAgIHByaXZhdGUgUGFjc0NsaWVudE5hdGl2ZUludGVyZmFjZSBtTmF0aXZlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBtU2lua1BhY3NDb25maWc7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIG1TcmNQYWNzQ29uZmlnOwotICAgIHByaXZhdGUgaW50IG1TaW5rTG9jYXRpb25zOwotICAgIHByaXZhdGUgaW50IG1TcmNMb2NhdGlvbnM7Ci0gICAgcHJpdmF0ZSBpbnQgbUF2YWlsYWJsZUNvbnRleHRzOwotICAgIHByaXZhdGUgaW50IG1TdXBwb3J0ZWRDb250ZXh0czsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aERldmljZSBtRGV2aWNlOwotCi0gICAgUGFjc0NsaWVudFN0YXRlTWFjaGluZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBQQ1NlcnZpY2Ugc3ZjLAotICAgICAgICAgICAgUGFjc0NsaWVudE5hdGl2ZUludGVyZmFjZSBuYXRpdmVJbnRlcmZhY2UsIExvb3BlciBsb29wZXIpIHsKLSAgICAgICAgc3VwZXIoVEFHLCBsb29wZXIpOwotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBtU2VydmljZSA9IHN2YzsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZSA9IG5hdGl2ZUludGVyZmFjZTsKLQotICAgICAgICBtRGlzY29ubmVjdGVkID0gbmV3IERpc2Nvbm5lY3RlZCgpOwotICAgICAgICBtQ29ubmVjdGluZyA9IG5ldyBDb25uZWN0aW5nKCk7Ci0gICAgICAgIG1EaXNjb25uZWN0aW5nID0gbmV3IERpc2Nvbm5lY3RpbmcoKTsKLSAgICAgICAgbUNvbm5lY3RlZCA9IG5ldyBDb25uZWN0ZWQoKTsKLQotICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmcpOwotICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGluZyk7Ci0gICAgICAgIGFkZFN0YXRlKG1Db25uZWN0ZWQpOwotCi0gICAgICAgIHNldEluaXRpYWxTdGF0ZShtRGlzY29ubmVjdGVkKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgUGFjc0NsaWVudFN0YXRlTWFjaGluZSBtYWtlKEJsdWV0b290aERldmljZSBkZXZpY2UsIFBDU2VydmljZSBzdmMsCi0gICAgICAgICAgICBQYWNzQ2xpZW50TmF0aXZlSW50ZXJmYWNlIG5hdGl2ZUludGVyZmFjZSwgTG9vcGVyIGxvb3BlcikgewotICAgICAgICBMb2cuaShUQUcsICJtYWtlIGZvciBkZXZpY2UgIiArIGRldmljZSk7Ci0gICAgICAgIFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUgUGFjc0NsaWVudFNtID0gbmV3IFBhY3NDbGllbnRTdGF0ZU1hY2hpbmUoZGV2aWNlLCBzdmMsCi0gICAgICAgICAgICAgICAgbmF0aXZlSW50ZXJmYWNlLCBsb29wZXIpOwotICAgICAgICBQYWNzQ2xpZW50U20uc3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIFBhY3NDbGllbnRTbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1F1aXQoKSB7Ci0gICAgICAgIGxvZygiZG9RdWl0IGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBxdWl0Tm93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgbG9nKCJjbGVhbnVwIGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIERpc2Nvbm5lY3RlZCBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW50ZXIgRGlzY29ubmVjdGVkKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLQotICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhESVNDT05ORUNUKTsKLQotICAgICAgICAgICAgaWYgKG1MYXN0Q29ubmVjdGlvblN0YXRlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYnJvYWRjYXN0IGR1cmluZyBzdGFydHVwCi0gICAgICAgICAgICAgICAgYnJvYWRjYXN0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RDb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xlYW51cERldmljZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJFeGl0IERpc2Nvbm5lY3RlZCgiICsgbURldmljZSArICIpOiAiICsgbWVzc2FnZVdoYXRUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0ZWQgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ29ubmVjdGluZyB0byAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbU5hdGl2ZUludGVyZmFjZS5jb25uZWN0UGFjc0NsaWVudChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBjb25uZWN0aW5nIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5va1RvQ29ubmVjdChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgcmVxdWVzdCBhbmQgc3RheSBpbiBEaXNjb25uZWN0ZWQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIk91dGdvaW5nIFBhY3NDbGllbnQgQ29ubmVjdGluZyByZXF1ZXN0IHJlamVjdGVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjb25uZWN0ZWQ6IERJU0NPTk5FQ1QgaWdub3JlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQUNLX0VWRU5UOgotICAgICAgICAgICAgICAgICAgICBQYWNzQ2xpZW50U3RhY2tFdmVudCBldmVudCA9IChQYWNzQ2xpZW50U3RhY2tFdmVudCkgbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRpc2Nvbm5lY3RlZDogc3RhY2sgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhldmVudC5kZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkRldmljZSgiICsgbURldmljZSArICIpOiBldmVudCBtaXNtYXRjaDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9JTklUSUFMSVpFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihldmVudC52YWx1ZUludDEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEaXNjb25uZWN0ZWQ6IGVycm9yIGluaXRpYWxpemluZyBQQUNTIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUEFDUyBJbml0aWFsaXplZCBzdWNjZXNmdWxseSAoRElTQ09OTkVDVEVEKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGV2ZW50LnZhbHVlSW50MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRpc2Nvbm5lY3RlZDogaWdub3Jpbmcgc3RhY2sgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbiBEaXNjb25uZWN0ZWQgc3RhdGUKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JlIFBhY3NDbGllbnQgRElTQ09OTkVDVEVEIGV2ZW50OiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2Uub2tUb0Nvbm5lY3QobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkluY29taW5nIFBhY3NDbGllbnQgQ29ubmVjdGluZyByZXF1ZXN0IGFjY2VwdGVkOiAiICsgbURldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc3RheSBpbiBEaXNjb25uZWN0ZWQgc3RhdGUgaXRzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbmNvbWluZyBQYWNzQ2xpZW50IENvbm5lY3RpbmcgcmVxdWVzdCByZWplY3RlZDogIiArIG1EZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFBhY3NDbGllbnQobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUGFjc0NsaWVudCBDb25uZWN0ZWQgZnJvbSBEaXNjb25uZWN0ZWQgc3RhdGU6ICIgKyBtRGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3RhdGU6ICIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5va1RvQ29ubmVjdChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiSW5jb21pbmcgUGFjc0NsaWVudCBDb25uZWN0ZWQgcmVxdWVzdCBhY2NlcHRlZDogIiArIG1EZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc3RheSBpbiBEaXNjb25uZWN0ZWQgc3RhdGUgaXRzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbmNvbWluZyBQYWNzQ2xpZW50IENvbm5lY3RlZCByZXF1ZXN0IHJlamVjdGVkOiAiICsgbURldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0UGFjc0NsaWVudChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JlIFBhY3NDbGllbnQgRElTQ09OTkVDVElORyBldmVudDogIiArIG1EZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbmNvcnJlY3Qgc3RhdGU6ICIgKyBzdGF0ZSArICIgZGV2aWNlOiAiICsgbURldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3RhdGU6ICIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgY2xhc3MgQ29ubmVjdGluZyBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW50ZXIgQ29ubmVjdGluZygiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChDT05ORUNUX1RJTUVPVVQsIHNDb25uZWN0VGltZW91dE1zKTsKLSAgICAgICAgICAgIGJyb2FkY2FzdENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkcsIG1MYXN0Q29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRXhpdCBDb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotICAgICAgICAgICAgbUxhc3RDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDT05ORUNUX1RJTUVPVVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJDb25uZWN0aW5nIHByb2Nlc3MgbWVzc2FnZSgiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RpbmcgY29ubmVjdGlvbiB0aW1lb3V0OiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFBhY3NDbGllbnQobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIFBhY3NDbGllbnRTdGFja0V2ZW50IGRpc2Nvbm5lY3RFdmVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhY3NDbGllbnRTdGFja0V2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFjc0NsaWVudFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0RXZlbnQuZGV2aWNlID0gbURldmljZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdEV2ZW50LnZhbHVlSW50MSA9IFBhY3NDbGllbnRTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShTVEFDS19FVkVOVCwgZGlzY29ubmVjdEV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBsb2coIkNvbm5lY3Rpbmc6IGNvbm5lY3Rpb24gY2FuY2VsZWQgdG8gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLmRpc2Nvbm5lY3RQYWNzQ2xpZW50KG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfRElTQ09WRVJZOgotICAgICAgICAgICAgICAgIGNhc2UgR0VUX0FWQUlMQUJMRV9DT05URVhUUzoKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQUNLX0VWRU5UOgotICAgICAgICAgICAgICAgICAgICBQYWNzQ2xpZW50U3RhY2tFdmVudCBldmVudCA9IChQYWNzQ2xpZW50U3RhY2tFdmVudCkgbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ29ubmVjdGluZzogc3RhY2sgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoZXZlbnQuZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJEZXZpY2UoIiArIG1EZXZpY2UgKyAiKTogZXZlbnQgbWlzbWF0Y2g6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkVWRU5UX1RZUEVfSU5JVElBTElaRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQudmFsdWVJbnQxICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBlcnJvciBpbml0aWFsaXppbmcgUEFDUyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlBBQ1MgSW5pdGlhbGl6ZWQgc3VjY2VzZnVsbHkgKENPTk5FQ1RJTkcpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoZXZlbnQudmFsdWVJbnQxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9TRVJWSUNFX0RJU0NPVkVSWToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9BVURJT19DT05URVhUX0FWQUlMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGVkOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIENvbm5lY3Rpbmcgc3RhdGUKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGluZyBkZXZpY2UgZGlzY29ubmVjdGVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RpbmcgaW50ZXJydXB0ZWQ6IGRldmljZSBpcyBkaXNjb25uZWN0aW5nOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkluY29ycmVjdCBzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBjbGFzcyBEaXNjb25uZWN0aW5nIGV4dGVuZHMgU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJFbnRlciBEaXNjb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKENPTk5FQ1RfVElNRU9VVCwgc0Nvbm5lY3RUaW1lb3V0TXMpOwotICAgICAgICAgICAgYnJvYWRjYXN0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORywgbUxhc3RDb25uZWN0aW9uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJFeGl0IERpc2Nvbm5lY3RpbmcoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKENPTk5FQ1RfVElNRU9VVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBsb2coIkRpc2Nvbm5lY3RpbmcgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfVElNRU9VVDogewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjb25uZWN0aW5nIGNvbm5lY3Rpb24gdGltZW91dDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLmRpc2Nvbm5lY3RQYWNzQ2xpZW50KG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBQYWNzQ2xpZW50U3RhY2tFdmVudCBkaXNjb25uZWN0RXZlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYWNzQ2xpZW50U3RhY2tFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY3NDbGllbnRTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdEV2ZW50LmRldmljZSA9IG1EZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RFdmVudC52YWx1ZUludDEgPSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoU1RBQ0tfRVZFTlQsIGRpc2Nvbm5lY3RFdmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX0RJU0NPVkVSWToKLSAgICAgICAgICAgICAgICBjYXNlIEdFVF9BVkFJTEFCTEVfQ09OVEVYVFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBQ0tfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIFBhY3NDbGllbnRTdGFja0V2ZW50IGV2ZW50ID0gKFBhY3NDbGllbnRTdGFja0V2ZW50KSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nOiBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhldmVudC5kZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkRldmljZSgiICsgbURldmljZSArICIpOiBldmVudCBtaXNtYXRjaDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChldmVudC52YWx1ZUludDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX1NFUlZJQ0VfRElTQ09WRVJZOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX0FVRElPX0NPTlRFWFRfQVZBSUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEaXNjb25uZWN0ZWQ6IGlnbm9yaW5nIHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbiBEaXNjb25uZWN0aW5nIHN0YXRlCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGludCBzdGF0ZSkgewotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5va1RvQ29ubmVjdChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY29ubmVjdGluZyBpbnRlcnJ1cHRlZDogZGV2aWNlIGlzIGNvbm5lY3RlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVqZWN0IHRoZSBjb25uZWN0aW9uIGFuZCBzdGF5IGluIERpc2Nvbm5lY3Rpbmcgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkluY29taW5nIFBhY3NDbGllbnQgQ29ubmVjdGVkIHJlcXVlc3QgcmVqZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFBhY3NDbGllbnQobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5va1RvQ29ubmVjdChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGlzY29ubmVjdGluZyBpbnRlcnJ1cHRlZDogdHJ5IHRvIHJlY29ubmVjdDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc3RheSBpbiBEaXNjb25uZWN0aW5nIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbmNvbWluZyBQYWNzQ2xpZW50IENvbm5lY3RpbmcgcmVxdWVzdCByZWplY3RlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0UGFjc0NsaWVudChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW5jb3JyZWN0IHN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIENvbm5lY3RlZCBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW50ZXIgQ29ubmVjdGVkKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhDT05ORUNUKTsKLSAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2Uuc3RhcnREaXNjb3ZlcnlOYXRpdmUobURldmljZSk7Ci0gICAgICAgICAgICBicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsIG1MYXN0Q29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRXhpdCBDb25uZWN0ZWQoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJDb25uZWN0ZWQgcHJvY2VzcyBtZXNzYWdlKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGVkOiBDT05ORUNUIGlnbm9yZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICBsb2coIkRpc2Nvbm5lY3RpbmcgZnJvbSAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0UGFjc0NsaWVudChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXJyb3IgaW4gdGhlIG5hdGl2ZSBzdGFjaywgdHJhbnNpdGlvbiBkaXJlY3RseSB0byBEaXNjb25uZWN0ZWQgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb25uZWN0ZWQ6IGVycm9yIGRpc2Nvbm5lY3RpbmcgZnJvbSAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX0RJU0NPVkVSWToKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJzZW5kaW5nIHN0YXJ0IGRpc2NvdmVyeSB0byAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbU5hdGl2ZUludGVyZmFjZS5zdGFydERpc2NvdmVyeU5hdGl2ZShtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY29ubmVjdGVkOiBlcnJvciBzZW5kaW5nIHN0YXJ0ZGlzY292ZXJ5IHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEdFVF9BVkFJTEFCTEVfQ09OVEVYVFM6Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiZ2V0IGF2YWlsYWJsZSBhdWRpbyBjb254dGVzIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlSW50ZXJmYWNlLkdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHMobURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBQ0tfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIFBhY3NDbGllbnRTdGFja0V2ZW50IGV2ZW50ID0gKFBhY3NDbGllbnRTdGFja0V2ZW50KSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDb25uZWN0ZWQ6IHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRGV2aWNlKCIgKyBtRGV2aWNlICsgIik6IGV2ZW50IG1pc21hdGNoOiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX0lOSVRJQUxJWkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChldmVudC52YWx1ZUludDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX1NFUlZJQ0VfRElTQ09WRVJZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYWNzUmVjb3JkRXZlbnQoZXZlbnQuc2lua0NvZGVjQ29uZmlnLCBldmVudC5zcmNDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlSW50MSwgZXZlbnQudmFsdWVJbnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWVJbnQzLCBldmVudC52YWx1ZUludDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYWNzQ2xpZW50U3RhY2tFdmVudC5FVkVOVF9UWVBFX0FVRElPX0NPTlRFWFRfQVZBSUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUNvbnRleHRzID0gZXZlbnQudmFsdWVJbnQxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEaXNjb25uZWN0ZWQ6IGlnbm9yaW5nIHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW4gQ29ubmVjdGVkIHN0YXRlCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGludCBzdGF0ZSkgewotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUGFjc0NsaWVudFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RlZCBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBhY3NDbGllbnRTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGlzY29ubmVjdGluZyBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29ubmVjdGlvbiBTdGF0ZSBEZXZpY2U6ICIgKyBtRGV2aWNlICsgIiBiYWQgc3RhdGU6ICIgKyBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYWNzUmVjb3JkRXZlbnQoQmx1ZXRvb3RoQ29kZWNDb25maWdbXSBzaW5rQ29kZWNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aENvZGVjQ29uZmlnW10gc3JjQ29kZWNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaW5rX2xvY2F0aW9ucywgaW50IHNyY19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdmFpbGFibGVfY29udGV4dHMsIGludCBzdXBwb3J0ZWRfY29udGV4dHMpIHsKLSAgICAgICAgICAgICBtU2lua1BhY3NDb25maWcgPSBzaW5rQ29kZWNDb25maWc7Ci0gICAgICAgICAgICAgbVNyY1BhY3NDb25maWcgPSBzcmNDb2RlY0NvbmZpZzsKLSAgICAgICAgICAgICBtU2lua0xvY2F0aW9ucyA9IHNpbmtfbG9jYXRpb25zOwotICAgICAgICAgICAgIG1TcmNMb2NhdGlvbnMgPSAgc3JjX2xvY2F0aW9uczsKLSAgICAgICAgICAgICBtQXZhaWxhYmxlQ29udGV4dHMgPSBhdmFpbGFibGVfY29udGV4dHM7Ci0gICAgICAgICAgICAgbVN1cHBvcnRlZENvbnRleHRzID0gc3VwcG9ydGVkX2NvbnRleHRzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRTdGF0ZSA9IGdldEN1cnJlbnRTdGF0ZSgpLmdldE5hbWUoKTsKLSAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgIkRpc2Nvbm5lY3RlZCI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgY2FzZSAiQ29ubmVjdGluZyI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGNhc2UgIkNvbm5lY3RlZCI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgY2FzZSAiRGlzY29ubmVjdGluZyI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQmFkIGN1cnJlbnRTdGF0ZTogIiArIGN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQmx1ZXRvb3RoRGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJyZW50U3RhdGUoKSA9PSBtQ29ubmVjdGVkOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBEZXZpY2UoKSB7Ci0gICAgICAgIGxvZygiY2xlYW51cCBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBtU2lua0xvY2F0aW9ucyA9IC0xOwotICAgICAgICBtU3JjTG9jYXRpb25zID0gLTE7Ci0gICAgICAgIG1BdmFpbGFibGVDb250ZXh0cyA9IC0xOwotICAgICAgICBtU3VwcG9ydGVkQ29udGV4dHMgPSAtMTsKLSAgICB9Ci0KLSAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIGdldFNpbmtQYWNzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2lua1BhY3NDb25maWc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBCbHVldG9vdGhDb2RlY0NvbmZpZ1tdIGdldFNyY1BhY3MoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1TcmNQYWNzQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldFNpbmtsb2NhdGlvbnMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1TaW5rTG9jYXRpb25zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldFNyY2xvY2F0aW9ucygpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNyY0xvY2F0aW9uczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRBdmFpbGFibGVDb250ZXh0cygpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUNvbnRleHRzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldFN1cHBvcnRlZENvbnRleHRzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkQ29udGV4dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayBmb3IgZXJyb3IgY29uZGl0aW9uIChuZXdTdGF0ZSA9PSBwcmV2U3RhdGUpCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdENvbm5lY3Rpb25TdGF0ZShpbnQgbmV3U3RhdGUsIGludCBwcmV2U3RhdGUpIHsKLSAgICAgICAgbG9nKCJDb25uZWN0aW9uIHN0YXRlICIgKyBtRGV2aWNlICsgIjogIiArIHByb2ZpbGVTdGF0ZVRvU3RyaW5nKHByZXZTdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgKyAiLT4iICsgcHJvZmlsZVN0YXRlVG9TdHJpbmcobmV3U3RhdGUpKTsKLSAgICAgICAgbVNlcnZpY2Uub25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkRnJvbVN0YXRlTWFjaGluZShtRGV2aWNlLCBuZXdTdGF0ZSwgcHJldlN0YXRlKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoUENTZXJ2aWNlLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgcHJldlN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIG5ld1N0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1EZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1TZXJ2aWNlLnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQ09OTkVDVCwgVXRpbHMuZ2V0VGVtcEFsbG93bGlzdEJyb2FkY2FzdE9wdGlvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lc3NhZ2VXaGF0VG9TdHJpbmcoaW50IHdoYXQpIHsKLSAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUIjsKLSAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkRJU0NPTk5FQ1QiOwotICAgICAgICAgICAgY2FzZSBTVEFDS19FVkVOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNUQUNLX0VWRU5UIjsKLSAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9USU1FT1VUOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9USU1FT1VUIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcod2hhdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb2ZpbGVTdGF0ZVRvU3RyaW5nKGludCBzdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiRElTQ09OTkVDVEVEIjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVElORyI7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVEVEIjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiRElTQ09OTkVDVElORyI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHN0YXRlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBzdXBlci5sb2cobXNnKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvdmNwL1ZjcENvbnRyb2xsZXIuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvdmNwL1ZjcENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyOWFhMC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC9WY3BDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC52Y3A7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFZjcDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLkFwbUNvbnN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5hcG0uRGV2aWNlUHJvZmlsZU1hcDsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguYXBtLlZvbHVtZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmFjbS5BY21TZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhNZXRyaWNzUHJvdG87Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuQWRhcHRlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5NZXRyaWNzTG9nZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmJsdWV0b290aC5idHNlcnZpY2UuUHJvZmlsZVNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5TZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguZ3JvdXBjbGllbnQuR3JvdXBTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLQotcHVibGljIGNsYXNzIFZjcENvbnRyb2xsZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmNwQ29udHJvbGxlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkNQX1NUQVRFX01BQ0hJTkVTID0gNTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZDUF9NSU5fVk9MID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkNQX01BWF9WT0wgPSAyNTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DT05ORUNUX0RFVklDRSA9Ci0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC52Y3AudGVzdC5hY3Rpb24uQ09OTkVDVF9ERVZJQ0UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRElTQ09OTkVDVF9ERVZJQ0UgPQotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudmNwLnRlc3QuYWN0aW9uLkRJU0NPTk5FQ1RfREVWSUNFIjsKLQotICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtU3RhdGVNYWNoaW5lc1RocmVhZDsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lPiBtU3RhdGVNYWNoaW5lcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+IG1Db25uZWN0aW9uTW9kZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyOwotCi0gICAgcHJpdmF0ZSBBZGFwdGVyU2VydmljZSBtQWRhcHRlclNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBWY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlIG1OYXRpdmVJbnRlcmZhY2U7Ci0gICAgcHJpdmF0ZSBEZXZpY2VQcm9maWxlTWFwIG1EcG07Ci0gICAgcHJpdmF0ZSBBY21TZXJ2aWNlIG1BY21TZXJ2aWNlOwotICAgIHByaXZhdGUgc3RhdGljIFZjcENvbnRyb2xsZXIgc0luc3RhbmNlID0gbnVsbDsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QdHNUZXN0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtVmNwQ29udHJvbGxlclRlc3RSZWNlaXZlciA9IG5ldyBWY3BDb250cm9sbGVyVGVzdFJlY2VpdmVyKCk7Ci0KLSAgICBwcml2YXRlIFZjcENvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkNyZWF0ZSBWY3BDb250cm9sbGVyIEluc3RhbmNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1BZGFwdGVyU2VydmljZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoQWRhcHRlclNlcnZpY2UuZ2V0QWRhcHRlclNlcnZpY2UoKSwKLSAgICAgICAgICAgICAgICAiQWRhcHRlclNlcnZpY2UgY2Fubm90IGJlIG51bGwgd2hlbiBWY3BDb250cm9sbGVyIHN0YXJ0cyIpOwotICAgICAgICBtTmF0aXZlSW50ZXJmYWNlID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChWY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgIlZjcENvbnRyb2xsZXJOYXRpdmVJbnRlcmZhY2UgY2Fubm90IGJlIG51bGwgd2hlbiBWY3BDb250cm9sbGVyIHN0YXJ0cyIpOwotCi0gICAgICAgIC8vIFN0YXJ0IGhhbmRsZXIgdGhyZWFkIGZvciBzdGF0ZSBtYWNoaW5lcwotICAgICAgICBtU3RhdGVNYWNoaW5lcy5jbGVhcigpOwotICAgICAgICBtU3RhdGVNYWNoaW5lc1RocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJWY3BDb250cm9sbGVyLlN0YXRlTWFjaGluZXMiKTsKLSAgICAgICAgbVN0YXRlTWFjaGluZXNUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5pbml0KCk7Ci0KLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgIG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIgPSBuZXcgQm9uZFN0YXRlQ2hhbmdlZFJlY2VpdmVyKCk7Ci0gICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciwgZmlsdGVyKTsKLQotICAgICAgICBpZiAobUFkYXB0ZXJTZXJ2aWNlLmlzQWR2QkNBQXVkaW9GZWF0RW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBZHYgQkNBIEF1ZGlvIHN1cHBvcnRlZCwgZW5hYmxlIFZDUCBmb3IgYnJvYWRjYXN0Iik7Ci0gICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC52Y3BGb3JCcm9hZGNhc3QiLCAidHJ1ZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQudmNwRm9yQnJvYWRjYXN0IiwgImZhbHNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVB0c1Rlc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQudmNwX2NvbnRyb2xsZXIucHRzIiwgZmFsc2UpOwotICAgICAgICBpZiAobVB0c1Rlc3QpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlJlZ2lzdGVyIGZvciBWY3BDb250cm9sbGVyVGVzdFJlY2VpdmVyIik7Ci0gICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyMiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGZpbHRlcjIuYWRkQWN0aW9uKEFDVElPTl9DT05ORUNUX0RFVklDRSk7Ci0gICAgICAgICAgICBmaWx0ZXIyLmFkZEFjdGlvbihBQ1RJT05fRElTQ09OTkVDVF9ERVZJQ0UpOwotICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1WY3BDb250cm9sbGVyVGVzdFJlY2VpdmVyLCBmaWx0ZXIyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2UgVmNwQ29udHJvbGxlciBpbnN0YW5jZSBhbmQgSW5pdGlhbGl6ZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQ6IGFwcGxpY2F0aW9uIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIFZjcENvbnRyb2xsZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFZjcENvbnRyb2xsZXIgbWFrZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTG9nLnYoVEFHLCAibWFrZSIpOwotCi0gICAgICAgIGlmKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgVmNwQ29udHJvbGxlcihjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBMb2cudihUQUcsICJFeGl0IG1ha2UiKTsKLSAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFZjcENvbnRyb2xsZXIgaW5zdGFuY2UsIHdoaWNoIHByb3ZpZGVzIHRoZSBwdWJsaWMgQVBJcwotICAgICAqIHRvIHZvbHVtZSBjb250cm9sIG9wZXJhdGlvbiB2aWEgVkNQIGNvbm5lY3Rpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gVmNwQ29udHJvbGxlciBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFZjcENvbnRyb2xsZXIgZ2V0VmNwQ29udHJvbGxlcigpIHsKLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJnZXRWY3BDb250cm9sbGVyKCk6IHNlcnZpY2UgaXMgTlVMTCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc0luc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclZjcEluc3RhbmNlICgpIHsKLSAgICAgICAgTG9nLnYoVEFHLCAiY2xlYXJpbmcgVkNQIGluc3RhdG5jZSIpOwotICAgICAgICBzSW5zdGFuY2UgPSBudWxsOwotICAgICAgICBMb2cudihUQUcsICJBZnRlciBjbGVhcmluZyBWQ1AgaW5zdGF0bmNlICIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkb1F1aXQoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImRvUXVpdCgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJkb1F1aXQoKSBjYWxsZWQgYmVmb3JlIG1ha2UoKSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cCBuYXRpdmUgaW50ZXJmYWNlCi0gICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuY2xlYW51cCgpOwotICAgICAgICBtTmF0aXZlSW50ZXJmYWNlID0gbnVsbDsKLSAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Cb25kU3RhdGVDaGFuZ2VkUmVjZWl2ZXIpOwotICAgICAgICBpZiAobVB0c1Rlc3QpIHsKLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtVmNwQ29udHJvbGxlclRlc3RSZWNlaXZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXJrIHNlcnZpY2UgYXMgc3RvcHBlZAotICAgICAgICBzSW5zdGFuY2UgPSBudWxsOwotCi0gICAgICAgIC8vIERlc3Ryb3kgc3RhdGUgbWFjaGluZXMgYW5kIHN0b3AgaGFuZGxlciB0aHJlYWQKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgZm9yIChWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIHNtIDogbVN0YXRlTWFjaGluZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzbS5kb1F1aXQoKTsKLSAgICAgICAgICAgICAgICBzbS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lcy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TdGF0ZU1hY2hpbmVzVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzVGhyZWFkID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsZWFyIEFkYXB0ZXJTZXJ2aWNlCi0gICAgICAgIG1BZGFwdGVyU2VydmljZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdCB3aXRoIHRoZSByZW1vdGUgZGV2aWNlIGZvciB1bmljYXN0IG9yIGJyb2FkY2FzdCBtb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZTogdGhlIHJlbW90ZSBkZXZpY2UgdG8gY29ubmVjdAotICAgICAqIEBwYXJhbSBtb2RlOiBjb25uZWN0aW9uIG1vZGU6IGNhbiBiZSBhbnkgb2YKLSAgICAgKiB7QGxpbmsgI0JsdWV0b290aFZjcC5NT0RFX1VOSUNBU1R9IG9yIHtAbGluayAjQmx1ZXRvb3RoVmNwLk1PREVfQlJPQURDQVNUfQotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNvbm5lY3QgaXMgYWNjZXB0ZWQsIGZhbHNlIGlmIGNvbm5lY3QgcmVxdWVzdCBpcyByZWplY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3QoKTogIiArIGRldmljZSArICIsIG1vZGU6ICIgKyBtb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIFZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUgc21Db25uZWN0ID0gZ2V0T3JDcmVhdGVTdGF0ZU1hY2hpbmUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbUNvbm5lY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBjb25uZWN0IHRvICIgKyBkZXZpY2UgKyAiIDogbm8gc3RhdGUgbWFjaGluZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcHJlQ29ubk1vZGU7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Nb2RlLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBwcmVDb25uTW9kZSA9IG1Db25uZWN0aW9uTW9kZS5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoKHByZUNvbm5Nb2RlICYgbW9kZSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY29ubk1vZGUgPSBwcmVDb25uTW9kZSB8IG1vZGU7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uTW9kZS5wdXQoZGV2aWNlLCBjb25uTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5lY3Rpb25Nb2RlQ2hhbmdlZChkZXZpY2UsIGNvbm5Nb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByZUNvbm5Nb2RlID0gQmx1ZXRvb3RoVmNwLk1PREVfTk9ORTsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbk1vZGUucHV0KGRldmljZSwgbW9kZSk7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0Q29ubmVjdGlvbk1vZGVDaGFuZ2VkKGRldmljZSwgbW9kZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzbUNvbm5lY3QuZ2V0Q29ubmVjdGlvblN0YXRlKCkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBzbUNvbm5lY3Quc2VuZE1lc3NhZ2UoVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZS5DT05ORUNULCBkZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlQ29ubk1vZGUgPT0gQmx1ZXRvb3RoVmNwLk1PREVfQlJPQURDQVNUICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IEJsdWV0b290aFZjcC5NT0RFX1VOSUNBU1QpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVkNQIGNvbm5lY3Rpb24gZnJvbSBCUk9BRENBU1QtT05MWSB0byBVTklDQVNUX0JST0FEQ0FTVDogIiArIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCB3aXRoIHRoZSByZW1vdGUgZGV2aWNlIGZvciB1bmljYXN0IG9yIGJyb2FkY2FzdCBtb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZTogdGhlIHJlbW90ZSBkZXZpY2UgdG8gY29ubmVjdAotICAgICAqIEBwYXJhbSBtb2RlOiBjb25uZWN0aW9uIG1vZGU6IGNhbiBiZSBhbnkgb2YKLSAgICAgKiB7QGxpbmsgI0JsdWV0b290aFZjcC5NT0RFX1VOSUNBU1R9IG9yIHtAbGluayAjQmx1ZXRvb3RoVmNwLk1PREVfQlJPQURDQVNUfQotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIGRpc2Nvbm5lY3QgaXMgYWNjZXB0ZWQsIGZhbHNlIGlmIGRpc2Nvbm5lY3QgaXMgcmVqZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgbW9kZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJkaXNjb25uZWN0KCk6ICIgKyBkZXZpY2UgKyAiLCBtb2RlOiAiICsgbW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBpbnQgcHJlQ29ubk1vZGUgPSBnZXRDb25uZWN0aW9uTW9kZShkZXZpY2UpOwotICAgICAgICAgICAgaW50IGNvbm5Nb2RlID0gQmx1ZXRvb3RoVmNwLk1PREVfTk9ORTsKLQotICAgICAgICAgICAgaWYgKChwcmVDb25uTW9kZSAmIG1vZGUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb25uTW9kZSA9IHByZUNvbm5Nb2RlICYgfm1vZGU7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0Q29ubmVjdGlvbk1vZGVDaGFuZ2VkKGRldmljZSwgY29ubk1vZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJkaXNjb25uZWN0IGlnbm9yZSBhcyBWY3AgaXMgbm90IGNvbm5lY3RlZCBmb3IgbW9kZTogIiArIG1vZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbm5Nb2RlID09IEJsdWV0b290aFZjcC5NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbk1vZGUucmVtb3ZlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGlzY29ubmVjdDogZGV2aWNlICIgKyBkZXZpY2UgKyAiIG5vdCBldmVyIGNvbm5lY3RlZC9jb25uZWN0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlTWFjaGluZS5nZXRDb25uZWN0aW9uU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvblN0YXRlICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb25uZWN0aW9uU3RhdGUgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRpc2Nvbm5lY3Q6IGRldmljZSAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBjb25uZWN0ZWQvY29ubmVjdGluZywgY29ubmVjdGlvblN0YXRlPSIgKyBjb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lLkRJU0NPTk5FQ1QsIGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uTW9kZS5wdXQoZGV2aWNlLCBjb25uTW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFic29sdXRlIHZvbHVtZSB0byByZW1vdGUgZGV2aWNlIHZpYSBWQ1AgY29ubmVjdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZTogcmVtb3RlIGRldmljZSBpbnN0YW5jZQotICAgICAqIEBwYXJhbSB2b2x1bWU6IHJlcXVlc3RlZCB2b2x1bWUgc2V0dGluZ3MgZm9yIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2V0IGFicyB2b2x1bWUgcmVxdXN0IGlzIGFjY2VwdGVkLCBmYWxzZSBpZiBzZXQKLSAgICAgKiBhYnMgdm9sdW1lIHJlcXVlc3QgaXMgcmVqZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRBYnNvbHV0ZVZvbHVtZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgdm9sdW1lLCBpbnQgYXVkaW9UeXBlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgInNldEFic1ZvbHVtZTogZGV2aWNlPSIgKyBkZXZpY2UgKyAiLCAiICsgVXRpbHMuZ2V0VWlkUGlkU3RyaW5nKCkpOwotICAgICAgICAgICAgZmluYWwgVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUgPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLQotICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0QWJzVm9sdW1lOiBkZXZpY2UgIiArIGRldmljZSArICIgd2FzIG5ldmVyIGNvbm5lY3RlZC9jb25uZWN0aW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lLmdldENvbm5lY3Rpb25TdGF0ZSgpICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0QWJzVm9sdW1lOiBwcm9maWxlIG5vdCBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lLlNFVF9WT0xVTUUsIHZvbHVtZSwgYXVkaW9UeXBlLCBkZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11dGUgb3IgdW5tdXRlIHJlbW90ZSBkZXZpY2UgdmlhIFZDUCBjb25uZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlOiByZW1vdGUgZGV2aWNlIGluc3RhbmNlCi0gICAgICogQHBhcmFtIGVuYWJsZU11dGU6IHRydWUgaWYgbXV0ZSwgZmFsc2UgaWYgdW5tdXRlCi0gICAgICogQHJldHVybiB0cnVlIGlmIG11dGUgcmVxdXN0IGlzIGFjY2VwdGVkLCBmYWxzZSBpZiBtdXRlCi0gICAgICogcmVxdWVzdCBpcyByZWplY3RlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldE11dGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBlbmFibGVNdXRlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgInNldE11dGU6IGRldmljZT0iICsgZGV2aWNlICsgIiwgIiArICJlbmFibGVNdXRlOiAiICsgZW5hYmxlTXV0ZSk7Ci0gICAgICAgICAgICBmaW5hbCBWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlTWFjaGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0TXV0ZTogZGV2aWNlICIgKyBkZXZpY2UgKyAiIHdhcyBuZXZlciBjb25uZWN0ZWQvY29ubmVjdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZU1hY2hpbmUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRNdXRlOiBwcm9maWxlIG5vdCBjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5hYmxlTXV0ZSkgewotICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lLk1VVEUsIGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lLlVOTVVURSwgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgY3VycmVudCBhYnNvbHV0ZSB2b2x1bWUgb2YgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2U6IHJlbW90ZSBkZXZpY2UgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIGN1cnJlbnQgYWJzb2x1dGUgdm9sdW1lIG9mIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRBYnNvbHV0ZVZvbHVtZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGVNYWNoaW5lLmdldFZvbHVtZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG11dGUgc3RhdHVzIG9mIHJlbW90ZSBkZXZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2U6IHJlbW90ZSBkZXZpY2UgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIGN1cnJlbnQgbXV0ZSBzdGF0dXMgb2YgdGhlIHJlbW90ZSBkZXZpY2U6Ci0gICAgICogdHJ1ZSBpZiBtdXRlIHN0YXR1cywgZmFsc2UgaWYgdW5tdXRlIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTXV0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVNYWNoaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGVNYWNoaW5lLmlzTXV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIFZDUAotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBpcyB0aGUgcmVtb3RlIGJsdWV0b290aCBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHtAbGluayBCbHVldG9vdGhQcm9maWxlI1NUQVRFX0RJU0NPTk5FQ1RFRH0gaWYgVkNQIGlzIGRpc2Nvbm5lY3RlZCwKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNTVEFURV9DT05ORUNUSU5HfSBpZiBWQ1AgaXMgYmVpbmcgY29ubmVjdGVkLAotICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI1NUQVRFX0NPTk5FQ1RFRH0gaWYgVkNQIGlzIGNvbm5lY3RlZCwgb3IKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNTVEFURV9ESVNDT05ORUNUSU5HfSBpZiBWQ1AgaXMgYmVpbmcgZGlzY29ubmVjdGVkCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIHNtID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzbS5nZXRDb25uZWN0aW9uU3RhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBjdXJyZW50IFZDUCBDb25uZWN0aW9uIG1vZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2U6IHJlbW90ZSBkZXZpY2UgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIGN1cnJlbnQgY29ubmVjdGlvbiBtb2RlIG9mIFZDUDoKLSAgICAgKiB7QGxpbmsgI0JsdWV0b290aFZjcC5NT0RFX05PTkV9IGlmIG5vbmUgVkNQIGNvbm5lY3Rpb24KLSAgICAgKiB7QGxpbmsgI0JsdWV0b290aFZjcC5NT0RFX1VOSUNBU1R9IGlmIFZDUCBpcyBjb25uZWN0ZWQgZm9yIHVuaWNhc3QKLSAgICAgKiB7QGxpbmsgI0JsdWV0b290aFZjcC5NT0RFX0JST0FEQ0FTVH0gaWYgVkNQIGlzIGNvbm5lY3RlZCBmb3IgYnJvYWRjYXN0Ci0gICAgICoge0BsaW5rICNCbHVldG9vdGhWY3AuTU9ERV9VTklDQVNUX0JST0FEQ0FTVH0gaWYgVkNQIGlzIGNvbm5lY3RlZAotICAgICAqIGZvciBib3RoIHVuaWNhc3QgYW5kIGJyb2FkY2FzdAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvbk1vZGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Nb2RlLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25Nb2RlLmdldChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFZjcC5NT0RFX05PTkU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBWQ1AgaXMgY29ubmVjdGVkIGZvciBicm9hZGNhc3QgbW9kZQotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZTogcmVtb3RlIGRldmljZSBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBWQ1AgaXMgY29ubmVjdGVkIGZvciBicm9hZGNhc3Qgb3IgdW5jYXN0LWJyb2FkY2FzdAotICAgICAqIHJldHVybiBmYWxzZSBpZiBWQ1AgaXMgY29ubmVjdGVkIGZvciB1bmljYXN0LW9ubHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb2FkY2FzdERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZU1hY2hpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Nb2RlLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG1Db25uZWN0aW9uTW9kZS5nZXQoZGV2aWNlKSAmIEJsdWV0b290aFZjcC5NT0RFX0JST0FEQ0FTVCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIG9rVG9Db25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBpbmNvbWluZyBjb25uZWN0aW9uIGluIFF1aWV0IG1vZGUuCi0gICAgICAgIGlmIChtQWRhcHRlclNlcnZpY2UuaXNRdWlldE1vZGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIm9rVG9Db25uZWN0OiBjYW5ub3QgY29ubmVjdCB0byAiICsgZGV2aWNlICsgIiA6IHF1aWV0IG1vZGUgZW5hYmxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJvbmRTdGF0ZSA9IG1BZGFwdGVyU2VydmljZS5nZXRCb25kU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgaWYgKGJvbmRTdGF0ZSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9rVG9Db25uZWN0OiByZXR1cm4gZmFsc2UsIGJvbmRTdGF0ZT0iICsgYm9uZFN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCBtZXNzYWdlRnJvbU5hdGl2ZShWY3BTdGFja0V2ZW50IHN0YWNrRXZlbnQpIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChzdGFja0V2ZW50LmRldmljZSwKLSAgICAgICAgICAgICAgICAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBudWxsLCBldmVudDogIiArIHN0YWNrRXZlbnQpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBzdGFja0V2ZW50LmRldmljZTsKLSAgICAgICAgICAgIFZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUgc20gPSBtU3RhdGVNYWNoaW5lcy5nZXQoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YWNrRXZlbnQudHlwZSA9PSBWY3BTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhY2tFdmVudC52YWx1ZUludDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc20gPSBnZXRPckNyZWF0ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IHByb2Nlc3Mgc3RhY2sgZXZlbnQ6IG5vIHN0YXRlIG1hY2hpbmU6ICIgKyBzdGFja0V2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lLlNUQUNLX0VWRU5ULCBzdGFja0V2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRDc2lwU2V0SWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgUGFyY2VsVXVpZCB1dWlkKSB7Ci0gICAgICAgIEdyb3VwU2VydmljZSBjc2lwU2VydmljZSA9IEdyb3VwU2VydmljZS5nZXRHcm91cFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKGNzaXBTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjc2lwU2VydmljZS5nZXRSZW1vdGVEZXZpY2VHcm91cElkKGRldmljZSwgdXVpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZEZyb21TdGF0ZU1hY2hpbmUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgIGludCBuZXdTdGF0ZSwgaW50IHByZXZTdGF0ZSkgewotICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRGcm9tU3RhdGVNYWNoaW5lIGZvciBkZXZpY2U6ICIgKyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgKyAiIG5ld1N0YXRlOiAiICsgbmV3U3RhdGUpOwotCi0gICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlIGlzIG51bGwgIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRHBtID0gRGV2aWNlUHJvZmlsZU1hcC5nZXREZXZpY2VQcm9maWxlTWFwSW5zdGFuY2UoKTsKLSAgICAgICAgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGdycERldmljZTsKLSAgICAgICAgaWYgKG1BY21TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdycERldmljZSA9IG1BY21TZXJ2aWNlLmdldEdyb3VwKGRldmljZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJBY21TZXJ2aWNlIGlzIG51bGwiKTsKLSAgICAgICAgICAgIGdycERldmljZSA9IGRldmljZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGludCBib25kU3RhdGUgPSBtQWRhcHRlclNlcnZpY2UuZ2V0Qm9uZFN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJvbmRTdGF0ZSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVN0YXRlTWFjaGluZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtQWNtU2VydmljZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIChtQWNtU2VydmljZS5pc1ZjcFBlZXJEZXZpY2VDb25uZWN0ZWQoZGV2aWNlLCBnZXRDc2lwU2V0SWQoZGV2aWNlLCBudWxsKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlZDUCBQZWVyIGRldmljZSBjb25uZWN0ZWQsIHRoaXMgaXMgbm90IGxhc3QgbWVtYmVyLCBza2lwIHVwZGF0ZSB0byBBUE0gIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8vKiBVcGRhdGUgVkNQIHByb2ZpbGUgZGlzY29ubmVjdGVkIHRvIEFQTS9BQ00KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWxsIGdyb3VwIG1lbWJlcnMgYXJlIGRpc2Nvbm5lY3RlZCwgdXBkYXRlIHRvIEFQTSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobURwbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRHBtLnByb2ZpbGVDb25uZWN0aW9uVXBkYXRlKGdycERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX1ZPTFVNRV9DT05UUk9MLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlZDUCwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtRHBtLnByb2ZpbGVDb25uZWN0aW9uVXBkYXRlKGdycERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLkNBTExfVk9MVU1FX0NPTlRST0wsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0QWJzVm9sdW1lU3VwcG9ydChkZXZpY2UsIGZhbHNlLCAtMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29ublN0YXRlKGRldmljZSwgbmV3U3RhdGUpOwotICAgICAgICAgICAgICAgIC8vKi8KLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJWQ1AgZ2V0IGRpc2Nvbm5lY3RlZCB3aXRoIHJlbmRlcmVyIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVkNQIGdldCBjb25uZWN0ZWQgd2l0aCByZW5kZXJlciBkZXZpY2U6ICIgKyBkZXZpY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1BY21TZXJ2aWNlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1BY21TZXJ2aWNlLmlzVmNwUGVlckRldmljZUNvbm5lY3RlZChkZXZpY2UsIGdldENzaXBTZXRJZChkZXZpY2UsIG51bGwpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVkNQIFBlZXIgZGV2aWNlIGNvbm5lY3RlZCwgdGhpcyBpcyBub3QgZmlyc3QgY29ubmVjdGVkIG1lbWJlciwgc2tpcCB1cGRhdGUgdG8gQVBNICIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vLyogVXBkYXRlIFZDUCBwcm9maWxlIGNvbm5lY3RlZCB0byBBUE0vQUNNCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRoZSBmaXJzdCBjb25uZWN0ZWQgbWVtZWJlciwgdXBkYXRlIHRvIEFQTSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobURwbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRHBtLnByb2ZpbGVDb25uZWN0aW9uVXBkYXRlKGdycERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcG1Db25zdC5BdWRpb0ZlYXR1cmVzLk1FRElBX1ZPTFVNRV9DT05UUk9MLCBBcG1Db25zdC5BdWRpb1Byb2ZpbGVzLlZDUCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcG0ucHJvZmlsZUNvbm5lY3Rpb25VcGRhdGUoZ3JwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwbUNvbnN0LkF1ZGlvRmVhdHVyZXMuQ0FMTF9WT0xVTUVfQ09OVFJPTCwgQXBtQ29uc3QuQXVkaW9Qcm9maWxlcy5WQ1AsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFNldCBBYnMgVm9sdW1lIFN1cHBvcnQgd2l0aCB0cnVlIHVudGlsIGdldCBpbml0aWFsIHZvbHVtZSBvZiByZW1vdGUKLSAgICAgICAgICAgICAgICAvLyovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldEFic1ZvbHVtZVN1cHBvcnQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc0Fic1ZvbFN1cHBvcnRlZCwgaW50IGluaXRpYWxfdm9sdW1lKSB7Ci0gICAgICAgIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGUgQWJzIFZvbHVtZSBTdXBwb3J0IHRvIHVwcGVyIGxheWVyICIpOwotICAgICAgICAgICAgbUFjbVNlcnZpY2Uuc2V0QWJzVm9sU3VwcG9ydChkZXZpY2UsIGlzQWJzVm9sU3VwcG9ydGVkLCBpbml0aWFsX3ZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG5vdGlmeVZvbHVtZUNoYW5nZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHZvbHVtZSwgaW50IGF1ZGlvVHlwZSkgewotICAgICAgICBMb2cuZChUQUcsICJub3RpZnkgdm9sdW1lIGNoYW5nZWQgZm9yIHJlbmRlcmVyIGRldmljZTogIiArIGRldmljZSArICIgYXVkaW9UeXBlOiAiICsgYXVkaW9UeXBlKTsKLSAgICAgICAgLy8gTm90aWZ5IEFDTSB2b2x1bWUgY2hhbmdlZCBmb3IgZGV2aWNlCi0gICAgICAgIG1BY21TZXJ2aWNlID0gQWNtU2VydmljZS5nZXRBY21TZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChtQWNtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQWNtU2VydmljZS5vblZvbHVtZVN0YXRlQ2hhbmdlZChkZXZpY2UsIHZvbHVtZSwgYXVkaW9UeXBlKTsKLSAgICAgICAgfQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhWY3AuQUNUSU9OX1ZPTFVNRV9DSEFOR0VEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFZjcC5FWFRSQV9WT0xVTUUsIHZvbHVtZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQ09OTkVDVCwKLSAgICAgICAgICAgICBVdGlscy5nZXRUZW1wQWxsb3dsaXN0QnJvYWRjYXN0T3B0aW9ucygpKTsKLSAgICB9Ci0KLSAgICB2b2lkIG5vdGlmeU11dGVDaGFuZ2VkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gbXV0ZSkgewotICAgICAgICBMb2cuZChUQUcsICJub3RpZnkgbXV0ZSBjaGFuZ2VkIGZvciByZW5kZXJlciBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIG11dGU6ICIgKyBtdXRlKTsKLSAgICAgICAgLy8gTm90aWZ5IEFDTSBtdXRlIGNoYW5nZWQKLSAgICAgICAgbUFjbVNlcnZpY2UgPSBBY21TZXJ2aWNlLmdldEFjbVNlcnZpY2UoKTsKLSAgICAgICAgaWYgKG1BY21TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BY21TZXJ2aWNlLm9uTXV0ZVN0YXR1c0NoYW5nZWQgKGRldmljZSwgbXV0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoVmNwLkFDVElPTl9NVVRFX0NIQU5HRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoVmNwLkVYVFJBX01VVEUsIG11dGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAotICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9JTkNMVURFX0JBQ0tHUk9VTkQpOwotICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX0NPTk5FQ1QsCi0gICAgICAgICAgICAgVXRpbHMuZ2V0VGVtcEFsbG93bGlzdEJyb2FkY2FzdE9wdGlvbnMoKSk7Ci0gICAgfQotCi0gICAgdm9pZCBicm9hZGNhc3RDb25uZWN0aW9uTW9kZUNoYW5nZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IG1vZGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYnJvYWRjY2FzdCBjb25uZWN0aW9uIG1vZGUgY2hhbmdlZCBmb3IgZGV2aWNlOiAiICsgZGV2aWNlICsgIiwgbW9kZTogIiArIG1vZGUpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhWY3AuQUNUSU9OX0NPTk5FQ1RJT05fTU9ERV9DSEFOR0VEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFZjcC5FWFRSQV9NT0RFLCBtb2RlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIGRldmljZSk7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfSU5DTFVERV9CQUNLR1JPVU5EKTsKLSAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9DT05ORUNULAotICAgICAgICAgICAgIFV0aWxzLmdldFRlbXBBbGxvd2xpc3RCcm9hZGNhc3RPcHRpb25zKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbm5TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgbmV3U3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlQ29ublN0YXRlOiBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiLCBzdGF0ZTogIiArIG5ld1N0YXRlKTsKLSAgICAgICAgVm9sdW1lTWFuYWdlciBtVm9sdW1lTWFuYWdlciA9IFZvbHVtZU1hbmFnZXIuZ2V0KCk7Ci0gICAgICAgIG1Wb2x1bWVNYW5hZ2VyLm9uQ29ublN0YXRlQ2hhbmdlKGRldmljZSwgbmV3U3RhdGUsIEFwbUNvbnN0LkF1ZGlvUHJvZmlsZXMuVkNQKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEJvbmRTdGF0ZUNoYW5nZWRSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmICghQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0JPTkRfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLkVSUk9SKTsKLSAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwotICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChkZXZpY2UsICJBQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEIHdpdGggbm8gRVhUUkFfREVWSUNFIik7Ci0gICAgICAgICAgICBib25kU3RhdGVDaGFuZ2VkKGRldmljZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIGNoYW5nZSBpbiB0aGUgYm9uZGluZyBzdGF0ZSBmb3IgYSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBkZXZpY2Ugd2hvc2UgYm9uZGluZyBzdGF0ZSBoYXMgY2hhbmdlZAotICAgICAqIEBwYXJhbSBib25kU3RhdGUgdGhlIG5ldyBib25kIHN0YXRlIGZvciB0aGUgZGV2aWNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgotICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjQk9ORF9OT05FfSwKLSAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0JPTkRfQk9ORElOR30sCi0gICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNCT05EX0JPTkRFRH0uCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCBib25kU3RhdGVDaGFuZ2VkKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBib25kU3RhdGUpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQm9uZCBzdGF0ZSBjaGFuZ2VkIGZvciBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIHN0YXRlOiAiICsgYm9uZFN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZW1vdmUgc3RhdGUgbWFjaGluZSBpZiB0aGUgYm9uZGluZyBmb3IgYSBkZXZpY2UgaXMgcmVtb3ZlZAotICAgICAgICBpZiAoYm9uZFN0YXRlICE9IEJsdWV0b290aERldmljZS5CT05EX05PTkUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTWFjaGluZXMpIHsKLSAgICAgICAgICAgICBWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIHNtID0gbVN0YXRlTWFjaGluZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAoc20uZ2V0Q29ubmVjdGlvblN0YXRlKCkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBtQ29ubmVjdGlvbk1vZGUucmVtb3ZlKGRldmljZSk7Ci0gICAgICAgICAgICAgcmVtb3ZlU3RhdGVNYWNoaW5lKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlU3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZW1vdmVTdGF0ZU1hY2hpbmU6IGRldmljZSAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgaGF2ZSBhIHN0YXRlIG1hY2hpbmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJyZW1vdmVTdGF0ZU1hY2hpbmU6IHJlbW92aW5nIHN0YXRlIG1hY2hpbmUgZm9yIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgICAgICAgICBzbS5kb1F1aXQoKTsKLSAgICAgICAgICAgIHNtLmNsZWFudXAoKTsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzLnJlbW92ZShkZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIGdldE9yQ3JlYXRlU3RhdGVNYWNoaW5lKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJnZXRPckNyZWF0ZVN0YXRlTWFjaGluZSBmYWlsZWQ6IGRldmljZSBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVNYWNoaW5lcykgewotICAgICAgICAgICAgVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZSBzbSA9IG1TdGF0ZU1hY2hpbmVzLmdldChkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlTWFjaGluZXMuc2l6ZSgpID49IE1BWF9WQ1BfU1RBVEVfTUFDSElORVMpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJNYXhpbXVtIG51bWJlciBvZiBWQ1Agc3RhdGUgbWFjaGluZXMgcmVhY2hlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBNQVhfVkNQX1NUQVRFX01BQ0hJTkVTKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDcmVhdGluZyBhIG5ldyBzdGF0ZSBtYWNoaW5lIGZvciAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtID0gVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZS5tYWtlKGRldmljZSwgdGhpcywgbUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UsIG1TdGF0ZU1hY2hpbmVzVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmVzLnB1dChkZXZpY2UsIHNtKTsKLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVmNwQ29udHJvbGxlclRlc3RSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fQ09OTkVDVF9ERVZJQ0UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZSBBQ1RJT05fQ09OTkVDVF9ERVZJQ0UiKTsKLSAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhWY3AuRVhUUkFfTU9ERSwgMCk7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSk7Ci0gICAgICAgICAgICAgICAgY29ubmVjdChkZXZpY2UsIG1vZGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9ESVNDT05ORUNUX0RFVklDRSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlIEFDVElPTl9ESVNDT05ORUNUX0RFVklDRSIpOwotICAgICAgICAgICAgICAgIGludCBtb2RlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFZjcC5FWFRSQV9NT0RFLCAwKTsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKTsKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0KGRldmljZSwgbW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvdmNwL1ZjcENvbnRyb2xsZXJOYXRpdmVJbnRlcmZhY2UuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvdmNwL1ZjcENvbnRyb2xsZXJOYXRpdmVJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYzY5Yi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC9WY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogRGVmaW5lcyB0aGUgbmF0aXZlIGludGVyZmFjZSB0aGF0IGlzIHVzZWQgYnkgc3RhdGUgbWFjaGluZS9zZXJ2aWNlIHRvCi0gKiBzZW5kIG9yIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgbmF0aXZlIHN0YWNrLiBUaGlzIGZpbGUgaXMgcmVnaXN0ZXJlZAotICogZm9yIHRoZSBuYXRpdmUgbWV0aG9kcyBpbiB0aGUgY29ycmVzcG9uZGluZyBKTkkgQysrIGZpbGUuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnZjcDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5ibHVldG9vdGguVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi0vKioKLSAqIFZjcCBDb250cm9sbGVyIE5hdGl2ZSBJbnRlcmZhY2UgdG8vZnJvbSBKTkkuCi0gKi8KLXB1YmxpYyBjbGFzcyBWY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZjcENvbnRyb2xsZXJOYXRpdmVJbnRlcmZhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7Ci0KLSAgICBAR3VhcmRlZEJ5KCJJTlNUQU5DRV9MT0NLIikKLSAgICBwcml2YXRlIHN0YXRpYyBWY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlIHNJbnN0YW5jZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSU5TVEFOQ0VfTE9DSyA9IG5ldyBPYmplY3QoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgVmNwQ29udHJvbGxlck5hdGl2ZUludGVyZmFjZSgpIHsKLSAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cud3RmU3RhY2soVEFHLCAiTm8gQmx1ZXRvb3RoIEFkYXB0ZXIgQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc2luZ2xldG9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVmNwQ29udHJvbGxlck5hdGl2ZUludGVyZmFjZSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChJTlNUQU5DRV9MT0NLKSB7Ci0gICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgVmNwQ29udHJvbGxlck5hdGl2ZUludGVyZmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBuYXRpdmUgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogcHJpb3JpdGllcyB0byBjb25maWd1cmUuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaW5pdE5hdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFudXAgdGhlIG5hdGl2ZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgY2xlYW51cE5hdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlcyBWY3AgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSByZW1vdGUgZGV2aWNlCi0gICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0VmNwKEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gaXNEaXJlY3QpIHsKLSAgICAgICAgcmV0dXJuIGNvbm5lY3RWY3BOYXRpdmUoZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSwgaXNEaXJlY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3RzIFZjcCBmcm9tIGEgcmVtb3RlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RWY3AoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gZGlzY29ubmVjdFZjcE5hdGl2ZShnZXRCeXRlQWRkcmVzcyhkZXZpY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBWY3AgQWJzIHZvbHVtZQotICAgICAqIEBwYXJhbSB2b2x1bWUKLSAgICAgKi8KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcodmlzaWJpbGl0eSA9IFZpc2libGVGb3JUZXN0aW5nLlZpc2liaWxpdHkuUEFDS0FHRSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRBYnNWb2x1bWUoaW50IHZvbHVtZSwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICByZXR1cm4gc2V0QWJzVm9sdW1lTmF0aXZlKHZvbHVtZSwgZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nKHZpc2liaWxpdHkgPSBWaXNpYmxlRm9yVGVzdGluZy5WaXNpYmlsaXR5LlBBQ0tBR0UpCi0gICAgcHVibGljIGJvb2xlYW4gbXV0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtdXRlTmF0aXZlKGdldEJ5dGVBZGRyZXNzKGRldmljZSkpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZyh2aXNpYmlsaXR5ID0gVmlzaWJsZUZvclRlc3RpbmcuVmlzaWJpbGl0eS5QQUNLQUdFKQotICAgIHB1YmxpYyBib29sZWFuIHVubXV0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiB1bm11dGVOYXRpdmUoZ2V0Qnl0ZUFkZHJlc3MoZGV2aWNlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlKGJ5dGVbXSBhZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gZ2V0Qnl0ZUFkZHJlc3MoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKCIwMDowMDowMDowMDowMDowMCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVdGlscy5nZXRCeXRlc0Zyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVRvU2VydmljZShWY3BTdGFja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFZjcENvbnRyb2xsZXIgc2VydmljZSA9IFZjcENvbnRyb2xsZXIuZ2V0VmNwQ29udHJvbGxlcigpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLm1lc3NhZ2VGcm9tTmF0aXZlKGV2ZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkV2ZW50IGlnbm9yZWQsIHNlcnZpY2Ugbm90IGF2YWlsYWJsZTogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBuYXRpdmUgc3RhY2sgYmFjayBpbnRvIHRoZSBKYXZhIGZyYW1ld29yay4KLSAgICAvLyBBbGwgY2FsbGJhY2tzIGFyZSByb3V0ZWQgdmlhIHRoZSBTZXJ2aWNlIHdoaWNoIHdpbGwgZGlzYW1iaWd1YXRlIHdoaWNoCi0gICAgLy8gc3RhdGUgbWFjaGluZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgcm91dGVkIHRvLgotICAgIHByaXZhdGUgdm9pZCBvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBieXRlW10gYWRkcmVzcykgewotICAgICAgICBWY3BTdGFja0V2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgICAgICBuZXcgVmNwU3RhY2tFdmVudChWY3BTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZXZlbnQuZGV2aWNlID0gZ2V0RGV2aWNlKGFkZHJlc3MpOwotICAgICAgICBldmVudC52YWx1ZUludDEgPSBzdGF0ZTsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ6ICIgKyBldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZE1lc3NhZ2VUb1NlcnZpY2UoZXZlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBPblZvbHVtZVN0YXRlQ2hhbmdlKGludCB2b2x1bWUsIGludCBtdXRlLCBieXRlW10gYWRkcmVzcykgewotICAgICAgICBWY3BTdGFja0V2ZW50IGV2ZW50ID0gbmV3IFZjcFN0YWNrRXZlbnQoCi0gICAgICAgICAgICAgICAgVmNwU3RhY2tFdmVudC5FVkVOVF9UWVBFX1ZPTFVNRV9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZXZlbnQuZGV2aWNlID0gZ2V0RGV2aWNlKGFkZHJlc3MpOwotICAgICAgICBldmVudC52YWx1ZUludDEgPSB2b2x1bWU7Ci0gICAgICAgIGV2ZW50LnZhbHVlSW50MiA9IG11dGU7Ci0KLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiT25Wb2x1bWVTdGF0ZUNoYW5nZTogIiArIGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kTWVzc2FnZVRvU2VydmljZShldmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIE9uVm9sdW1lRmxhZ3NDaGFuZ2UoaW50IGZsYWdzLCBieXRlW10gYWRkcmVzcykgewotICAgICAgICBWY3BTdGFja0V2ZW50IGV2ZW50ID0gbmV3IFZjcFN0YWNrRXZlbnQoCi0gICAgICAgICAgICAgICAgVmNwU3RhY2tFdmVudC5FVkVOVF9UWVBFX1ZPTFVNRV9GTEFHU19DSEFOR0VEKTsKLSAgICAgICAgZXZlbnQuZGV2aWNlID0gZ2V0RGV2aWNlKGFkZHJlc3MpOwotICAgICAgICBldmVudC52YWx1ZUludDEgPSBmbGFnczsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJPblZvbHVtZUZsYWdzQ2hhbmdlOiAiICsgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlVG9TZXJ2aWNlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICAvLyBOYXRpdmUgbWV0aG9kcyB0aGF0IGNhbGwgaW50byB0aGUgSk5JIGludGVyZmFjZQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgY2xlYW51cE5hdGl2ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdFZjcE5hdGl2ZShieXRlW10gYWRkcmVzcywgYm9vbGVhbiBpc0RpcmVjdCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0VmNwTmF0aXZlKGJ5dGVbXSBhZGRyZXNzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldEFic1ZvbHVtZU5hdGl2ZShpbnQgdm9sdW1lLCBieXRlW10gYWRkcmVzcyk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBtdXRlTmF0aXZlKGJ5dGVbXSBhZGRyZXNzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHVubXV0ZU5hdGl2ZShieXRlW10gYWRkcmVzcyk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvdmNwL1ZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jb20vYW5kcm9pZC9ibHVldG9vdGgvdmNwL1ZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzNTc1My4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC9WY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ2ICswLDAgQEAKLS8qCi0gKkNvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCbHVldG9vdGggVkNQIFN0YXRlTWFjaGluZS4gVGhlcmUgaXMgb25lIGluc3RhbmNlIHBlciByZW1vdGUgZGV2aWNlLgotICogIC0gIkRpc2Nvbm5lY3RlZCIgYW5kICJDb25uZWN0ZWQiIGFyZSBzdGVhZHkgc3RhdGVzLgotICogIC0gIkNvbm5lY3RpbmciIGFuZCAiRGlzY29ubmVjdGluZyIgYXJlIHRyYW5zaWVudCBzdGF0ZXMgdW50aWwgdGhlCi0gKiAgICAgY29ubmVjdGlvbiAvIGRpc2Nvbm5lY3Rpb24gaXMgY29tcGxldGVkLgotICoKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChEaXNjb25uZWN0ZWQpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgXgotICogICAgICAgICAgICAgICAgICAgQ09OTkVDVCB8ICAgICAgIHwgRElTQ09OTkVDVEVECi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgICAgICAgfAotICogICAgICAgICAgICAgICAgIChDb25uZWN0aW5nKTwtLS0+KERpc2Nvbm5lY3RpbmcpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgXgotICogICAgICAgICAgICAgICAgIENPTk5FQ1RFRCB8ICAgICAgIHwgRElTQ09OTkVDVAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBWICAgICAgIHwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGVkKQotICogTk9URVM6Ci0gKiAgLSBJZiBzdGF0ZSBtYWNoaW5lIGlzIGluICJDb25uZWN0aW5nIiBzdGF0ZSBhbmQgdGhlIHJlbW90ZSBkZXZpY2Ugc2VuZHMKLSAqICAgIERJU0NPTk5FQ1QgcmVxdWVzdCwgdGhlIHN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbnMgdG8gIkRpc2Nvbm5lY3RpbmciIHN0YXRlLgotICogIC0gU2ltaWxhcmx5LCBpZiB0aGUgc3RhdGUgbWFjaGluZSBpcyBpbiAiRGlzY29ubmVjdGluZyIgc3RhdGUgYW5kIHRoZSByZW1vdGUgZGV2aWNlCi0gKiAgICBzZW5kcyBDT05ORUNUIHJlcXVlc3QsIHRoZSBzdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb25zIHRvICJDb25uZWN0aW5nIiBzdGF0ZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgRElTQ09OTkVDVAotICogICAgKENvbm5lY3RpbmcpIC0tLS0tLS0tLS0tLS0tLT4gKERpc2Nvbm5lY3RpbmcpCi0gKiAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLQotICogICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVAotICoKLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC52Y3A7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJMVUVUT09USF9DT05ORUNUOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLlV0aWxzOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFZjcDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5Qcm9maWxlU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuU3RhdGVNYWNoaW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwotCi1maW5hbCBjbGFzcyBWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIGV4dGVuZHMgU3RhdGVNYWNoaW5lIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWY3BDb250cm9sbGVyU3RhdGVNYWNoaW5lIjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9WT0xVTUUgPSAzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVVURSA9IDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVTk1VVEUgPSA1OwotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIGludCBTVEFDS19FVkVOVCA9IDEwMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9USU1FT1VUID0gMjAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfQUJTX1ZPTF9USU1FT1VUID0gMjAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfTVVURV9USU1FT1VUID0gMjAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOTVVURV9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1VVEVfU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfU0VUVElOR19OT1RfUEVSU0lTVEVEID0gMHgwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1NFVFRJTkdfUEVSU0lTVEVEID0gMHgwMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRVJST1JfUkVUUllfVElNRVMgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQ1BfTUFYX1ZPTCA9IDI1NTsKLSAgICAvLyBUaGUgZGVmYXVsdCBWQ1Agdm9sdW1lIDB4NzcgKDExOSkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkNQX0RFRkFVTFRfVk9MID0gMTE5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVElNRU9VVF9ERUxBWSA9IDIwMDA7Ci0KLQotICAgIC8vIE5PVEU6IHRoZSB2YWx1ZSBpcyBub3QgImZpbmFsIiAtIGl0IGlzIG1vZGlmaWVkIGluIHRoZSB1bml0IHRlc3RzCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGludCBzQ29ubmVjdFRpbWVvdXRNcyA9IDMwMDAwOyAgICAgICAgLy8gMzBzCi0KLSAgICBwcml2YXRlIERpc2Nvbm5lY3RlZCBtRGlzY29ubmVjdGVkOwotICAgIHByaXZhdGUgQ29ubmVjdGluZyBtQ29ubmVjdGluZzsKLSAgICBwcml2YXRlIERpc2Nvbm5lY3RpbmcgbURpc2Nvbm5lY3Rpbmc7Ci0gICAgcHJpdmF0ZSBDb25uZWN0ZWQgbUNvbm5lY3RlZDsKLSAgICBwcml2YXRlIGludCBtTGFzdENvbm5lY3Rpb25TdGF0ZSA9IC0xOwotCi0gICAgcHJpdmF0ZSBWY3BDb250cm9sbGVyIG1WY3BDb250cm9sbGVyOwotICAgIHByaXZhdGUgVmNwQ29udHJvbGxlck5hdGl2ZUludGVyZmFjZSBtTmF0aXZlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLQotICAgIC8qIEN1cnJlbnQgcmVtb3RlIHZvbHVtZSAqLwotICAgIHByaXZhdGUgaW50IG1SZW1vdGVWb2x1bWU7Ci0gICAgLyogUmVxdWVzdGVkIHZvbHVtZSBpbiBwcm9ncmVzcyBvZiBOYXRpdmUgTGF5ZXIgc2V0QWJzVm9sdW1lICovCi0gICAgcHJpdmF0ZSBpbnQgbVJlcXVlc3RlZFZvbHVtZTsKLSAgICAvKiBDYWNoZWQgbmV3IHZvbHVtZSBpZiBoYXMgYSByZXF1ZXN0ZWQgdm9sdW1lIGluIHByb2dyZXNzICovCi0gICAgcHJpdmF0ZSBpbnQgbUNhY2hlZFZvbHVtZTsKLSAgICBwcml2YXRlIGludCBtQWJzVm9sUmV0cnlUaW1lczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFic1ZvbFNldEluUHJvZ3Jlc3M7Ci0KLSAgICAvKiBDdXJyZW50IHJlbW90ZSBtdXRlIHN0YXRlICovCi0gICAgcHJpdmF0ZSBpbnQgbU11dGVTdGF0ZTsKLSAgICAvKiBSZXF1ZXN0ZWQgbXV0ZSBzdGF0ZSBpbiBwcm9ncmVzcyBvZiBOYXRpdmUgTGF5ZXIgbXV0ZS91bk11dGUgKi8KLSAgICBwcml2YXRlIGludCBtUmVxdWVzdGVkTXV0ZVN0YXRlOwotICAgIC8qIENhY2hlZCBuZXcgbXV0ZSBzdGF0ZSBpZiBoYXMgYSByZXF1ZXN0ZWQgbXV0ZSBzdGF0ZSBpbiBwcm9ncmVzcyAqLwotICAgIHByaXZhdGUgaW50IG1DYWNoZWRNdXRlU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNoYW5nZU11dGVSZXRyeVRpbWVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTXV0ZUNoYW5nZUluUHJvZ3Jlc3M7Ci0KLSAgICBwcml2YXRlIGludCBtVm9sdW1lRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lQ29udHJvbEF1ZGlvVHlwZTsKLSAgICBwcml2YXRlIGludCBtQ2FjaGVkVm9sdW1lQ29udHJvbEF1ZGlvVHlwZTsKLQotICAgIFZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgVmNwQ29udHJvbGxlciBzdmMsIENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIFZjcENvbnRyb2xsZXJOYXRpdmVJbnRlcmZhY2UgbmF0aXZlSW50ZXJmYWNlLCBMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgIHN1cGVyKFRBRywgbG9vcGVyKTsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgbVZjcENvbnRyb2xsZXIgPSBzdmM7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbU5hdGl2ZUludGVyZmFjZSA9IG5hdGl2ZUludGVyZmFjZTsKLQotICAgICAgICBtRGlzY29ubmVjdGVkID0gbmV3IERpc2Nvbm5lY3RlZCgpOwotICAgICAgICBtQ29ubmVjdGluZyA9IG5ldyBDb25uZWN0aW5nKCk7Ci0gICAgICAgIG1EaXNjb25uZWN0aW5nID0gbmV3IERpc2Nvbm5lY3RpbmcoKTsKLSAgICAgICAgbUNvbm5lY3RlZCA9IG5ldyBDb25uZWN0ZWQoKTsKLQotICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmcpOwotICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGluZyk7Ci0gICAgICAgIGFkZFN0YXRlKG1Db25uZWN0ZWQpOwotCi0gICAgICAgIHNldEluaXRpYWxTdGF0ZShtRGlzY29ubmVjdGVkKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZSBtYWtlKEJsdWV0b290aERldmljZSBkZXZpY2UsIFZjcENvbnRyb2xsZXIgc3ZjLAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBWY3BDb250cm9sbGVyTmF0aXZlSW50ZXJmYWNlIG5hdGl2ZUludGVyZmFjZSwgTG9vcGVyIGxvb3BlcikgewotICAgICAgICBMb2cuaShUQUcsICJtYWtlIGZvciBkZXZpY2UgIiArIGRldmljZSk7Ci0gICAgICAgIFZjcENvbnRyb2xsZXJTdGF0ZU1hY2hpbmUgVmNwQ29udHJvbGxlclNtID0KLSAgICAgICAgICAgICAgICBuZXcgVmNwQ29udHJvbGxlclN0YXRlTWFjaGluZShkZXZpY2UsIHN2YywgY29udGV4dCwgbmF0aXZlSW50ZXJmYWNlLCBsb29wZXIpOwotICAgICAgICBWY3BDb250cm9sbGVyU20uc3RhcnQoKTsKLSAgICAgICAgcmV0dXJuIFZjcENvbnRyb2xsZXJTbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1F1aXQoKSB7Ci0gICAgICAgIGxvZygiZG9RdWl0IGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgICAgICBxdWl0Tm93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgbG9nKCJjbGVhbnVwIGZvciBkZXZpY2UgIiArIG1EZXZpY2UpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIERpc2Nvbm5lY3RlZCBleHRlbmRzIFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW50ZXIgRGlzY29ubmVjdGVkKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLQotICAgICAgICAgICAgcmVtb3ZlRGVmZXJyZWRNZXNzYWdlcyhESVNDT05ORUNUKTsKLSAgICAgICAgICAgIGlmIChtTGFzdENvbm5lY3Rpb25TdGF0ZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IGJyb2FkY2FzdCBkdXJpbmcgc3RhcnR1cAotICAgICAgICAgICAgICAgIGJyb2FkY2FzdENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2xlYW51cERldmljZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBsb2coIkV4aXQgRGlzY29ubmVjdGVkKCIgKyBtRGV2aWNlICsgIik6ICIgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgIG1MYXN0Q29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBsb2coIkRpc2Nvbm5lY3RlZCBwcm9jZXNzIG1lc3NhZ2UoIiArIG1EZXZpY2UgKyAiKTogIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCkpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IChCbHVldG9vdGhEZXZpY2UpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIkNvbm5lY3RpbmcgdG8gIiArIGRldmljZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDT05ORUNUIGZhaWxlZCwgZGV2aWNlPSIgKyBkZXZpY2UgKyAiLCBjdXJyZW50RGV2PSIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtTmF0aXZlSW50ZXJmYWNlLmNvbm5lY3RWY3AobURldmljZSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRpc2Nvbm5lY3RlZDogZXJyb3IgY29ubmVjdGluZyB0byAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY29ubmVjdGVkOiBESVNDT05ORUNUIGlnbm9yZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFDS19FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgVmNwU3RhY2tFdmVudCBldmVudCA9IChWY3BTdGFja0V2ZW50KSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGlzY29ubmVjdGVkOiBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGZTdGFjayhUQUcsICJEZXZpY2UoIiArIG1EZXZpY2UgKyAiKTogZXZlbnQgbWlzbWF0Y2g6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5FVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGV2ZW50LnZhbHVlSW50MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRpc2Nvbm5lY3RlZDogaWdub3Jpbmcgc3RhY2sgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBtc2cgIiArIG1lc3NhZ2VXaGF0VG9TdHJpbmcobWVzc2FnZS53aGF0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIERpc2Nvbm5lY3RlZCBzdGF0ZQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSBWQ1AgRElTQ09OTkVDVEVEIGV2ZW50OiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkluY29taW5nIFZDUCBDb25uZWN0aW5nIHJlcXVlc3QgYWNjZXB0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WY3BDb250cm9sbGVyLm9rVG9Db25uZWN0KG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmcpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVqZWN0IHRoZSBjb25uZWN0aW9uIGFuZCBzdGF5IGluIERpc2Nvbm5lY3RlZCBzdGF0ZSBpdHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkluY29taW5nIFZDUCBDb25uZWN0aW5nIHJlcXVlc3QgcmVqZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFZjcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlZDUCBDb25uZWN0ZWQgZnJvbSBEaXNjb25uZWN0ZWQgc3RhdGU6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WY3BDb250cm9sbGVyLm9rVG9Db25uZWN0KG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJJbmNvbWluZyBWQ1AgQ29ubmVjdGVkIHJlcXVlc3QgYWNjZXB0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc3RheSBpbiBEaXNjb25uZWN0ZWQgc3RhdGUgaXRzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbmNvbWluZyBWQ1AgQ29ubmVjdGVkIHJlcXVlc3QgcmVqZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFZjcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmUgVkNQIERJU0NPTk5FQ1RJTkcgZXZlbnQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW5jb3JyZWN0IHN0YXRlOiAiICsgc3RhdGUgKyAiIGRldmljZTogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIENvbm5lY3RpbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkVudGVyIENvbm5lY3RpbmcoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ09OTkVDVF9USU1FT1VULCBtRGV2aWNlLCBzQ29ubmVjdFRpbWVvdXRNcyk7Ci0gICAgICAgICAgICBicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HLCBtTGFzdENvbm5lY3Rpb25TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIGxvZygiRXhpdCBDb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotICAgICAgICAgICAgbUxhc3RDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDT05ORUNUX1RJTUVPVVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJDb25uZWN0aW5nIHByb2Nlc3MgbWVzc2FnZSgiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RpbmcgY29ubmVjdGlvbiB0aW1lb3V0OiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFZjcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgdGltZWQgb3V0IHRyeWluZyB0byBjb25uZWN0LCB0cmFuc2l0aW9uIHRvIERpc2Nvbm5lY3RlZCBzdGF0ZQotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gKEJsdWV0b290aERldmljZSkgbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBkZXZpY2UgdGltZW91dCAiICsgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNPTk5FQ1RfVElNRU9VVCIpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDb25uZWN0aW5nOiBjb25uZWN0aW9uIGNhbmNlbGVkIHRvICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0VmNwKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRToKLSAgICAgICAgICAgICAgICBjYXNlIE1VVEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBVTk1VVEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfQUJTX1ZPTF9USU1FT1VUOgotICAgICAgICAgICAgICAgIGNhc2UgQ0hBTkdFX01VVEVfVElNRU9VVDoKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQUNLX0VWRU5UOgotICAgICAgICAgICAgICAgICAgICBWY3BTdGFja0V2ZW50IGV2ZW50ID0gKFZjcFN0YWNrRXZlbnQpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIkNvbm5lY3Rpbmc6IHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGZTdGFjayhUQUcsICJEZXZpY2UoIiArIG1EZXZpY2UgKyAiKTogZXZlbnQgbWlzbWF0Y2g6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChldmVudC52YWx1ZUludDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb25uZWN0aW5nOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIENvbm5lY3Rpbmcgc3RhdGUKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBWY3BTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb25uZWN0aW5nIGRldmljZSBkaXNjb25uZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWY3BTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWY3BTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGluZyBpbnRlcnJ1cHRlZDogZGV2aWNlIGlzIGRpc2Nvbm5lY3Rpbmc6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW5jb3JyZWN0IHN0YXRlOiAiICsgc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIGNsYXNzIERpc2Nvbm5lY3RpbmcgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkVudGVyIERpc2Nvbm5lY3RpbmcoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcoZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KSk7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ09OTkVDVF9USU1FT1VULCBtRGV2aWNlLCBzQ29ubmVjdFRpbWVvdXRNcyk7Ci0gICAgICAgICAgICBicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HLCBtTGFzdENvbm5lY3Rpb25TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKLSAgICAgICAgICAgIGxvZygiRXhpdCBEaXNjb25uZWN0aW5nKCIgKyBtRGV2aWNlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlV2hhdFRvU3RyaW5nKGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCkpOwotICAgICAgICAgICAgbUxhc3RDb25uZWN0aW9uU3RhdGUgPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhDT05ORUNUX1RJTUVPVVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nIHByb2Nlc3MgbWVzc2FnZSgiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhtZXNzYWdlLndoYXQpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX1RJTUVPVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY29ubmVjdGluZyBjb25uZWN0aW9uIHRpbWVvdXQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0VmNwKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSB0aW1lZCBvdXQgdHJ5aW5nIHRvIGNvbm5lY3QsIHRyYW5zaXRpb24gdG8gRGlzY29ubmVjdGVkIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSAoQmx1ZXRvb3RoRGV2aWNlKSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIGRldmljZSB0aW1lb3V0ICIgKyBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDT05ORUNUX1RJTUVPVVQiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6Ci0gICAgICAgICAgICAgICAgY2FzZSBNVVRFOgotICAgICAgICAgICAgICAgIGNhc2UgVU5NVVRFOgotICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FCU19WT0xfVElNRU9VVDoKLSAgICAgICAgICAgICAgICBjYXNlIENIQU5HRV9NVVRFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFDS19FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgVmNwU3RhY2tFdmVudCBldmVudCA9IChWY3BTdGFja0V2ZW50KSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nOiBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhldmVudC5kZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cud3RmU3RhY2soVEFHLCAiRGV2aWNlKCIgKyBtRGV2aWNlICsgIik6IGV2ZW50IG1pc21hdGNoOiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWY3BTdGFja0V2ZW50LkVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb25uZWN0aW9uRXZlbnQoZXZlbnQudmFsdWVJbnQxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzY29ubmVjdGluZzogaWdub3Jpbmcgc3RhY2sgZXZlbnQ6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbiBEaXNjb25uZWN0aW5nIHN0YXRlCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29ubmVjdGlvbkV2ZW50KGludCBzdGF0ZSkgewotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGlzY29ubmVjdGVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWY3BTdGFja0V2ZW50LkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICBpZiAobVZjcENvbnRyb2xsZXIub2tUb0Nvbm5lY3QobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2Nvbm5lY3RpbmcgaW50ZXJydXB0ZWQ6IGRldmljZSBpcyBjb25uZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc3RheSBpbiBEaXNjb25uZWN0aW5nIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbmNvbWluZyBWQ1AgQ29ubmVjdGVkIHJlcXVlc3QgcmVqZWN0ZWQ6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFZjcChtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICBpZiAobVZjcENvbnRyb2xsZXIub2tUb0Nvbm5lY3QobURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RpbmcgaW50ZXJydXB0ZWQ6IHRyeSB0byByZWNvbm5lY3Q6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWplY3QgdGhlIGNvbm5lY3Rpb24gYW5kIHN0YXkgaW4gRGlzY29ubmVjdGluZyBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW5jb21pbmcgVkNQIENvbm5lY3RpbmcgcmVxdWVzdCByZWplY3RlZDogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUludGVyZmFjZS5kaXNjb25uZWN0VmNwKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkluY29ycmVjdCBzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBjbGFzcyBDb25uZWN0ZWQgZXh0ZW5kcyBTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkVudGVyIENvbm5lY3RlZCgiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgIHJlbW92ZURlZmVycmVkTWVzc2FnZXMoQ09OTkVDVCk7Ci0gICAgICAgICAgICBicm9hZGNhc3RDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsIG1MYXN0Q29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgewotICAgICAgICAgICAgbG9nKCJFeGl0IENvbm5lY3RlZCgiICsgbURldmljZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZVdoYXRUb1N0cmluZyhnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpKTsKLSAgICAgICAgICAgIG1MYXN0Q29ubmVjdGlvblN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBsb2coIkNvbm5lY3RlZCBwcm9jZXNzIG1lc3NhZ2UoIiArIG1EZXZpY2UgKyAiKTogIgotICAgICAgICAgICAgICAgICAgICArIG1lc3NhZ2VXaGF0VG9TdHJpbmcobWVzc2FnZS53aGF0KSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUOiB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3RlZDogQ09OTkVDVCBpZ25vcmVkOiAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXNjb25uZWN0aW5nIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1OYXRpdmVJbnRlcmZhY2UuZGlzY29ubmVjdFZjcChtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXJyb3IgaW4gdGhlIG5hdGl2ZSBzdGFjaywgdHJhbnNpdGlvbiBkaXJlY3RseSB0byBEaXNjb25uZWN0ZWQgc3RhdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb25uZWN0ZWQ6IGVycm9yIGRpc2Nvbm5lY3RpbmcgZnJvbSAiICsgbURldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSAoQmx1ZXRvb3RoRGV2aWNlKSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTRVRfVk9MVU1FIGZhaWxlZCAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY3VycmVudERldmljZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTZXQgdm9sdW1lIGZvciAiICsgZGV2aWNlKTsKLQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2V0QWJzVm9sdW1lKG1lc3NhZ2UuYXJnMSwgbWVzc2FnZS5hcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgTVVURTogewotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gKEJsdWV0b290aERldmljZSkgbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTXV0ZSBmYWlsZWQgIiArIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGN1cnJlbnREZXZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiTXV0ZSBmb3IgIiArIGRldmljZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NldE11dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgVU5NVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSAoQmx1ZXRvb3RoRGV2aWNlKSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbm11dGUgZmFpbGVkICIgKyBkZXZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBjdXJyZW50RGV2aWNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb2coIlVubXV0ZSBmb3IgIiArIGRldmljZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NldFVubXV0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfQUJTX1ZPTF9USU1FT1VUOiB7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSAoQmx1ZXRvb3RoRGV2aWNlKSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTZXQgYWJzIHZvbCB0aW1lb3V0IGZhaWxlZCAiICsgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY3VycmVudERldmljZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAobUFic1ZvbFJldHJ5VGltZXMgPj0gTUFYX0VSUk9SX1JFVFJZX1RJTUVTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTZXQgYWJzIHZvbCByZXRyeSBleGNlZWQgbWF4IHRpbWVzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVm9sdW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWJzVm9sUmV0cnlUaW1lcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BYnNWb2xSZXRyeVRpbWVzICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUludGVyZmFjZS5zZXRBYnNWb2x1bWUobVJlcXVlc3RlZFZvbHVtZSwgbURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoU0VUX0FCU19WT0xfVElNRU9VVCwgbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNRF9USU1FT1VUX0RFTEFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWJzVm9sUmV0cnlUaW1lcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2V0IGFic29sdXRlIHZvbHVtZSBmYWlsZWQgZm9yIGRldmljZTogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIENIQU5HRV9NVVRFX1RJTUVPVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IChCbHVldG9vdGhEZXZpY2UpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIk11dGUgdGltZW91dCBmYWlsZWQgIiArIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGN1cnJlbnREZXZpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbU11dGVDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbmdlTXV0ZVJldHJ5VGltZXMgPj0gTUFYX0VSUk9SX1JFVFJZX1RJTUVTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJNdXRlIHJldHJ5IGV4Y2VlZCBtYXggdGltZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VNdXRlUmV0cnlUaW1lcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkTXV0ZVN0YXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VNdXRlUmV0cnlUaW1lcyArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RlZE11dGVTdGF0ZSA9PSBNVVRFX1NUQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbU5hdGl2ZUludGVyZmFjZS5tdXRlKG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtTmF0aXZlSW50ZXJmYWNlLnVubXV0ZShtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChDSEFOR0VfTVVURV9USU1FT1VULCBtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EX1RJTUVPVVRfREVMQVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VNdXRlUmV0cnlUaW1lcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZE11dGVTdGF0ZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2hhbmdlIE11dGUgZmFpbGVkIGZvciBkZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFDS19FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgVmNwU3RhY2tFdmVudCBldmVudCA9IChWY3BTdGFja0V2ZW50KSBtZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDb25uZWN0ZWQ6IHN0YWNrIGV2ZW50OiAiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EZXZpY2UuZXF1YWxzKGV2ZW50LmRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53dGZTdGFjayhUQUcsICJEZXZpY2UoIiArIG1EZXZpY2UgKyAiKTogZXZlbnQgbWlzbWF0Y2g6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChldmVudC52YWx1ZUludDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWY3BTdGFja0V2ZW50LkVWRU5UX1RZUEVfVk9MVU1FX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWb2x1bWVTdGF0ZUV2ZW50KGV2ZW50LnZhbHVlSW50MSwgZXZlbnQudmFsdWVJbnQyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVmNwU3RhY2tFdmVudC5FVkVOVF9UWVBFX1ZPTFVNRV9GTEFHU19DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWb2x1bWVGbGFnc0NoYW5nZWQoZXZlbnQudmFsdWVJbnQxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29ubmVjdGVkOiBpZ25vcmluZyBzdGFjayBldmVudDogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSEFORExFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluIENvbm5lY3RlZCBzdGF0ZQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nvbm5lY3Rpb25FdmVudChpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RlZCBmcm9tICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZjcFN0YWNrRXZlbnQuQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJEaXNjb25uZWN0aW5nIGZyb20gIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb25uZWN0aW9uIFN0YXRlIERldmljZTogIiArIG1EZXZpY2UgKyAiIGJhZCBzdGF0ZTogIiArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NldEFic1ZvbHVtZShpbnQgdm9sdW1lLCBpbnQgYXVkaW9UeXBlKSB7Ci0gICAgICAgIGxvZygicHJvY2VzcyBzZXQgYWJzb2x1dGUgdm9sdW1lIik7Ci0KLSAgICAgICAgaWYgKG1BYnNWb2xTZXRJblByb2dyZXNzKSB7Ci0gICAgICAgICAgICBtQ2FjaGVkVm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgbUNhY2hlZFZvbHVtZUNvbnRyb2xBdWRpb1R5cGUgPSBhdWRpb1R5cGU7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJUaGVyZSBpcyBhbHJlYWR5IGEgdm9sdW1lIGNvbW1hbmQgaW4gcHJvZ3Jlc3MsIGNhY2hlIHZvbHVtZTogICIgKwotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkVm9sdW1lICsgIiBjYWNoZWQgYXVkaW8gdHlwZTogIiArIGF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVJlbW90ZVZvbHVtZSA9PSAtMSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAicmVtb3RlIG5vdCB0ZWxsIGluaXRpYWwgdm9sdW1lIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVJlbW90ZVZvbHVtZSA9PSB2b2x1bWUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSBzZXQgYWJzIHZvbHVtZSBhcyBjdXJyZW50IHZvbHVtZSBlcXVhbHMgdG8gcmVxdWVzdGVkIHZvbHVtZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoVEFHLCAic2V0IGFicyB2b2x1bWUgZm9yIGF1ZGlvIHR5cGU6ICIgKyBhdWRpb1R5cGUpOwotICAgICAgICBpZiAobU5hdGl2ZUludGVyZmFjZS5zZXRBYnNWb2x1bWUodm9sdW1lLCBtRGV2aWNlKSkgewotICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKFNFVF9BQlNfVk9MX1RJTUVPVVQsIG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTURfVElNRU9VVF9ERUxBWSk7Ci0gICAgICAgICAgICBtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICBtUmVxdWVzdGVkVm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xBdWRpb1R5cGUgPSBhdWRpb1R5cGU7Ci0gICAgICAgICAgICBtQ2FjaGVkVm9sdW1lID0gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJTZXQgYWJzb2x1dGUgdm9sdW1lIGZhaWxlZCBmb3IgZGV2aWNlOiAiICsgbURldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NldE11dGUoKSB7Ci0gICAgICAgIGxvZygicHJvY2VzcyBtdXRlIik7Ci0KLSAgICAgICAgaWYgKG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcykgewotICAgICAgICAgICAgbUNhY2hlZE11dGVTdGF0ZSA9IE1VVEVfU1RBVEU7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJUaGVyZSBpcyBhbHJlYWR5IGEgbXV0ZSBjaGFuZ2UgaW4gcHJvZ3Jlc3MsIGNhY2hlIG11dGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVtb3RlVm9sdW1lID09IC0xKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJyZW1vdGUgbm90IHRlbGwgaW5pdGlhbCB2b2x1bWUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXV0ZVN0YXRlID09IE1VVEVfU1RBVEUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSBtdXRlIHJlcXVlc3QgYXMgY3VycmVudCBzdGF0ZSBpcyBtdXRlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5hdGl2ZUludGVyZmFjZS5tdXRlKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ0hBTkdFX01VVEVfVElNRU9VVCwgbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNRF9USU1FT1VUX0RFTEFZKTsKLSAgICAgICAgICAgIG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICBtUmVxdWVzdGVkTXV0ZVN0YXRlID0gTVVURV9TVEFURTsKLSAgICAgICAgICAgIG1DYWNoZWRNdXRlU3RhdGUgPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIk11dGUgZmFpbGVkIGZvciBkZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2V0VW5tdXRlKCkgewotICAgICAgICBsb2coInByb2Nlc3MgdW5tdXRlIik7Ci0KLSAgICAgICAgaWYgKG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcykgewotICAgICAgICAgICAgbUNhY2hlZE11dGVTdGF0ZSA9IFVOTVVURV9TVEFURTsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlRoZXJlIGlzIGFscmVhZHkgYSBtdXRlIGNoYW5nZSBpbiBwcm9ncmVzcywgY2FjaGUgdW5tdXRlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVJlbW90ZVZvbHVtZSA9PSAtMSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAicmVtb3RlIG5vdCB0ZWxsIGluaXRpYWwgdm9sdW1lIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU11dGVTdGF0ZSA9PSBVTk1VVEVfU1RBVEUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSB1bm11dGUgcmVxdWVzdCBhcyBjdXJyZW50IHN0YXRlIGlzIHVubXV0ZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OYXRpdmVJbnRlcmZhY2UudW5tdXRlKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ0hBTkdFX01VVEVfVElNRU9VVCwgbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNRF9USU1FT1VUX0RFTEFZKTsKLSAgICAgICAgICAgIG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICBtUmVxdWVzdGVkTXV0ZVN0YXRlID0gVU5NVVRFX1NUQVRFOwotICAgICAgICAgICAgbUNhY2hlZE11dGVTdGF0ZSA9IC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5tdXRlIGZhaWxlZCBmb3IgZGV2aWNlOiAiICsgbURldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1ZvbHVtZVN0YXRlRXZlbnQoaW50IHZjcFZvbCwgaW50IG11dGUpIHsKLSAgICAgICAgbG9nKCJwcm9jZXNzIHZvbHVtZSBzdGF0ZSBldmVudCIpOwotCi0gICAgICAgIGlmIChtUmVtb3RlVm9sdW1lID09IC0xIHx8IG1NdXRlU3RhdGUgIT0gbXV0ZSB8fAotICAgICAgICAgICAgICAgIG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTXV0ZUNoYW5nZWQobXV0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVJlbW90ZVZvbHVtZSA9PSAtMSB8fCBtUmVtb3RlVm9sdW1lICE9IHZjcFZvbCB8fAotICAgICAgICAgICAgICAgIG1BYnNWb2xTZXRJblByb2dyZXNzID09IHRydWUpIHsKLSAgICAgICAgICAgIHByb2Nlc3NWb2x1bWVDaGFuZ2VkKHZjcFZvbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1ZvbHVtZUNoYW5nZWQoaW50IHZjcFZvbCkgewotICAgICAgICBsb2coInByb2Nlc3Mgdm9sdW1lIHNldHRpbmcgY2hhbmdlZCIpOwotCi0gICAgICAgIGlmIChtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoU0VUX0FCU19WT0xfVElNRU9VVCk7Ci0gICAgICAgICAgICBpZiAobVJlcXVlc3RlZFZvbHVtZSA9PSB2Y3BWb2wpIHsKLSAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVm9sdW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgbUFic1ZvbFJldHJ5VGltZXMgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKChtQ2FjaGVkVm9sdW1lICE9IC0xKSAmJiAobUNhY2hlZFZvbHVtZSAhPSB2Y3BWb2wpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLm5vdGlmeVZvbHVtZUNoYW5nZWQobURldmljZSwgdmNwVm9sLCBtVm9sdW1lQ29udHJvbEF1ZGlvVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sQXVkaW9UeXBlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNldCBjYWNoZWQgdm9sdW1lIHRvIHJlbW90ZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUludGVyZmFjZS5zZXRBYnNWb2x1bWUobUNhY2hlZFZvbHVtZSwgbURldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChTRVRfQUJTX1ZPTF9USU1FT1VULCBtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTURfVElNRU9VVF9ERUxBWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVm9sdW1lID0gbUNhY2hlZFZvbHVtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sQXVkaW9UeXBlID0gbUNhY2hlZFZvbHVtZUNvbnRyb2xBdWRpb1R5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkVm9sdW1lQ29udHJvbEF1ZGlvVHlwZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFZvbHVtZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2V0IGNhY2hlZCB2b2x1bWUgZmFpbGVkIGZvciBkZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZWRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVtb3RlIGNoYW5nZWQgdm9sdW1lIG5vdCBlcXVhbCB0byByZXF1ZXN0ZWQgdm9sdW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1BYnNWb2xSZXRyeVRpbWVzID49IE1BWF9FUlJPUl9SRVRSWV9USU1FUykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTZXQgYWJzIHZvbCByZXRyeSBleGNlZWQgbWF4IHRpbWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgbUFic1ZvbFJldHJ5VGltZXMgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BYnNWb2xSZXRyeVRpbWVzICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlSW50ZXJmYWNlLnNldEFic1ZvbHVtZShtUmVxdWVzdGVkVm9sdW1lLCBtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKFNFVF9BQlNfVk9MX1RJTUVPVVQsIG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNRF9USU1FT1VUX0RFTEFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BYnNWb2xTZXRJblByb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNldCBhYnNvbHV0ZSB2b2x1bWUgZmFpbGVkIGZvciBkZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BYnNWb2xSZXRyeVRpbWVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVtb3RlVm9sdW1lID09IC0xKSB7Ci0gICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2b2x1bWUgaWYgdm9sdW1lIGZsYWdzIGlzIG5vdCBwZXJzaXN0ZWQKLSAgICAgICAgICAgIGlmICgobVZvbHVtZUZsYWdzID09IFZPTFVNRV9TRVRUSU5HX05PVF9QRVJTSVNURUQpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluaXRpYWxWb2x1bWUgPSBWQ1BfREVGQVVMVF9WT0w7Ci0gICAgICAgICAgICAgICAgaWYgKHZjcFZvbCAhPSBpbml0aWFsVm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZW1vdGVWb2x1bWUgPSB2Y3BWb2w7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNldCBpbml0aWFsIHZvbHVtZSB0byByZW1vdGUgaWYgdm9sdW1lIHBlcnNpc3RlZCBmbGFnIGlzIGZhbHNlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlSW50ZXJmYWNlLnNldEFic1ZvbHVtZShpbml0aWFsVm9sdW1lLCBtRGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKFNFVF9BQlNfVk9MX1RJTUVPVVQsIG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTURfVElNRU9VVF9ERUxBWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWJzVm9sU2V0SW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVm9sdW1lID0gaW5pdGlhbFZvbHVtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLnNldEFic1ZvbHVtZVN1cHBvcnQobURldmljZSwgdHJ1ZSwgaW5pdGlhbFZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmNwQ29udHJvbGxlci51cGRhdGVDb25uU3RhdGUobURldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2V0IGFic29sdXRlIHZvbHVtZSBmYWlsZWQgZm9yIGRldmljZTogIiArIG1EZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2V0IGFicyB2b2x1bWUgc3VwcG9ydCBhbmQgdXBkYXRlIGluaXRpYWwgdm9sdW1lIHRvIEFDTSIpOwotICAgICAgICAgICAgbVJlbW90ZVZvbHVtZSA9IHZjcFZvbDsKLSAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLnNldEFic1ZvbHVtZVN1cHBvcnQobURldmljZSwgdHJ1ZSwgdmNwVm9sKTsKLSAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLnVwZGF0ZUNvbm5TdGF0ZShtRGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVJlbW90ZVZvbHVtZSAhPSB2Y3BWb2wpIHsKLSAgICAgICAgICAgIG1SZW1vdGVWb2x1bWUgPSB2Y3BWb2w7Ci0gICAgICAgICAgICBtVmNwQ29udHJvbGxlci5ub3RpZnlWb2x1bWVDaGFuZ2VkKG1EZXZpY2UsIHZjcFZvbCwgbVZvbHVtZUNvbnRyb2xBdWRpb1R5cGUpOwotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xBdWRpb1R5cGUgPSAtMTsKLSAgICAgICAgICAgIGxvbmcgcGVjZW50Vm9sQ2hhbmdlZCA9ICgobG9uZyl2Y3BWb2wgKiAxMDApIC8gMHhmZjsKLSAgICAgICAgICAgIExvZy53KFRBRywgInBlcmNlbnQgdm9sdW1lIGNoYW5nZWQ6ICIgKyBwZWNlbnRWb2xDaGFuZ2VkICsgIiUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTXV0ZUNoYW5nZWQoaW50IG11dGUpIHsKLSAgICAgICAgbG9nKCJwcm9jZXNzIG11dGUgY2hhbmdlZCIpOwotCi0gICAgICAgIGlmIChtTXV0ZUNoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotICAgICAgICAgICAgbU11dGVDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBtQ2hhbmdlTXV0ZVJldHJ5VGltZXMgPSAwOwotICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMoQ0hBTkdFX01VVEVfVElNRU9VVCk7Ci0KLSAgICAgICAgICAgIGlmICgobUNhY2hlZE11dGVTdGF0ZSAhPSAtMSkgJiYgKG1DYWNoZWRNdXRlU3RhdGUgIT0gbXV0ZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJTZXQgY2FjaGVkIG11dGUgc3RhdGUgdG8gcmVtb3RlIik7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1DYWNoZWRNdXRlU3RhdGUgPT0gTVVURV9TVEFURSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBtTmF0aXZlSW50ZXJmYWNlLm11dGUobURldmljZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gbU5hdGl2ZUludGVyZmFjZS51bm11dGUobURldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQoQ0hBTkdFX01VVEVfVElNRU9VVCwgbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTURfVElNRU9VVF9ERUxBWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NdXRlQ2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRNdXRlU3RhdGUgPSBtQ2FjaGVkTXV0ZVN0YXRlOwotICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkTXV0ZVN0YXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhY2hlZE11dGVTdGF0ZSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NdXRlU3RhdGUgIT0gbXV0ZSkgewotICAgICAgICAgICAgbU11dGVTdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICBib29sZWFuICBpc011dGUgPSAobU11dGVTdGF0ZSA9PSBNVVRFX1NUQVRFKSA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgICAgIG1WY3BDb250cm9sbGVyLm5vdGlmeU11dGVDaGFuZ2VkKG1EZXZpY2UsIGlzTXV0ZSk7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJNdXRlIHN0YXRlIGNoYW5nZWQgdG8gIiArIG1NdXRlU3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NWb2x1bWVGbGFnc0NoYW5nZWQoaW50IGZsYWdzKSB7Ci0gICAgICAgIGxvZygicHJvY2VzcyB2b2x1bWUgZmxhZ3MgY2hhbmdlZCIpOwotICAgICAgICBtVm9sdW1lRmxhZ3MgPSBmbGFnczsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICBTdHJpbmcgY3VycmVudFN0YXRlID0gZ2V0Q3VycmVudFN0YXRlKCkuZ2V0TmFtZSgpOwotICAgICAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAiRGlzY29ubmVjdGVkIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICBjYXNlICJDb25uZWN0aW5nIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgY2FzZSAiQ29ubmVjdGVkIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICBjYXNlICJEaXNjb25uZWN0aW5nIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJCYWQgY3VycmVudFN0YXRlOiAiICsgY3VycmVudFN0YXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICByZXR1cm4gbVJlbW90ZVZvbHVtZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzTXV0ZSgpIHsKLSAgICAgICAgaWYgKG1NdXRlU3RhdGUgPT0gTVVURV9TVEFURSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQmx1ZXRvb3RoRGV2aWNlIGdldERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJyZW50U3RhdGUoKSA9PSBtQ29ubmVjdGVkOwotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIGZvciBlcnJvciBjb25kaXRpb24gKG5ld1N0YXRlID09IHByZXZTdGF0ZSkKLSAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0Q29ubmVjdGlvblN0YXRlKGludCBuZXdTdGF0ZSwgaW50IHByZXZTdGF0ZSkgewotICAgICAgICBsb2coIkNvbm5lY3Rpb24gc3RhdGUgIiArIG1EZXZpY2UgKyAiOiAiICsgcHJvZmlsZVN0YXRlVG9TdHJpbmcocHJldlN0YXRlKQotICAgICAgICAgICAgICAgICAgICArICItPiIgKyBwcm9maWxlU3RhdGVUb1N0cmluZyhuZXdTdGF0ZSkpOwotICAgICAgICBtVmNwQ29udHJvbGxlci5vbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRGcm9tU3RhdGVNYWNoaW5lKG1EZXZpY2UsCi0gICAgICAgICAgICAgICAgbmV3U3RhdGUsIHByZXZTdGF0ZSk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoVmNwLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9QUkVWSU9VU19TVEFURSwgcHJldlN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIG5ld1N0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIG1EZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfQ09OTkVDVCwKLSAgICAgICAgICAgICBVdGlscy5nZXRUZW1wQWxsb3dsaXN0QnJvYWRjYXN0T3B0aW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xlYW51cERldmljZSgpIHsKLSAgICAgICAgbG9nKCJjbGVhbnVwIGRldmljZSAiICsgbURldmljZSk7Ci0gICAgICAgIG1SZW1vdGVWb2x1bWUgPSAtMTsKLSAgICAgICAgbVJlcXVlc3RlZFZvbHVtZSA9IC0xOwotICAgICAgICBtQ2FjaGVkVm9sdW1lID0gLTE7Ci0gICAgICAgIG1BYnNWb2xSZXRyeVRpbWVzID0gMDsKLSAgICAgICAgbUFic1ZvbFNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgICAgbU11dGVTdGF0ZSA9IC0xOwotICAgICAgICBtUmVxdWVzdGVkTXV0ZVN0YXRlID0gLTE7Ci0gICAgICAgIG1DYWNoZWRNdXRlU3RhdGUgPSAtMTsKLSAgICAgICAgbUNoYW5nZU11dGVSZXRyeVRpbWVzID0gMDsKLSAgICAgICAgbU11dGVDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1Wb2x1bWVGbGFncyA9IC0xOwotICAgICAgICBtVm9sdW1lQ29udHJvbEF1ZGlvVHlwZSA9IC0xOwotICAgICAgICBtQ2FjaGVkVm9sdW1lQ29udHJvbEF1ZGlvVHlwZSA9IC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlV2hhdFRvU3RyaW5nKGludCB3aGF0KSB7Ci0gICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgY2FzZSBDT05ORUNUOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVCI7Ci0gICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJESVNDT05ORUNUIjsKLSAgICAgICAgICAgIGNhc2UgU1RBQ0tfRVZFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTVEFDS19FVkVOVCI7Ci0gICAgICAgICAgICBjYXNlIENPTk5FQ1RfVElNRU9VVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RfVElNRU9VVCI7Ci0gICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTRVRfVk9MVU1FIjsKLSAgICAgICAgICAgIGNhc2UgTVVURToKLSAgICAgICAgICAgICAgICByZXR1cm4gIk1VVEUiOwotICAgICAgICAgICAgY2FzZSBVTk1VVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVTk1VVEUiOwotICAgICAgICAgICAgY2FzZSBTRVRfQUJTX1ZPTF9USU1FT1VUOgotICAgICAgICAgICAgICAgIHJldHVybiAiU0VUX0FCU19WT0xfVElNRU9VVCI7Ci0gICAgICAgICAgICBjYXNlIENIQU5HRV9NVVRFX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDSEFOR0VfTVVURV9USU1FT1VUIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOKCIgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb2ZpbGVTdGF0ZVRvU3RyaW5nKGludCBzdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiRElTQ09OTkVDVEVEIjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVElORyI7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVEVEIjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiRElTQ09OTkVDVElORyI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHN0YXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZ0J1aWxkZXIgc2IpIHsKLSAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIm1EZXZpY2U6ICIgKyBtRGV2aWNlKTsKLSAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIiAgU3RhdGVNYWNoaW5lOiAiICsgdGhpcyk7Ci0gICAgICAgIC8vIER1bXAgdGhlIHN0YXRlIG1hY2hpbmUgbG9ncwotICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotICAgICAgICBzdXBlci5kdW1wKG5ldyBGaWxlRGVzY3JpcHRvcigpLCBwcmludFdyaXRlciwgbmV3IFN0cmluZ1tde30pOwotICAgICAgICBwcmludFdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdHJpbmdXcml0ZXIuZmx1c2goKTsKLSAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIiAgU3RhdGVNYWNoaW5lTG9nOiIpOwotICAgICAgICBTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHdoaWxlIChzY2FubmVyLmhhc05leHRMaW5lKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gc2Nhbm5lci5uZXh0TGluZSgpOwotICAgICAgICAgICAgUHJvZmlsZVNlcnZpY2UucHJpbnRsbihzYiwgIiAgICAiICsgbGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2Nhbm5lci5jbG9zZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIHN1cGVyLmxvZyhtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC9WY3BTdGFja0V2ZW50LmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMvY29tL2FuZHJvaWQvYmx1ZXRvb3RoL3ZjcC9WY3BTdGFja0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3N2Y5NWQuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9CbHVldG9vdGgvc3JjL2NvbS9hbmRyb2lkL2JsdWV0b290aC92Y3AvVmNwU3RhY2tFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJsdWV0b290aC52Y3A7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci0KLS8qKgotICogU3RhY2sgZXZlbnQgc2VudCB2aWEgYSBjYWxsYmFjayBmcm9tIEpOSSB0byBKYXZhLCBvciBnZW5lcmF0ZWQKLSAqIGludGVybmFsbHkgYnkgdGhlIFZDUCBTdGF0ZSBNYWNoaW5lLgotICovCi1wdWJsaWMgY2xhc3MgVmNwU3RhY2tFdmVudCB7Ci0gICAgLy8gRXZlbnQgdHlwZXMgZm9yIFNUQUNLX0VWRU5UIG1lc3NhZ2UgKGNvbWluZyBmcm9tIG5hdGl2ZSkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9OT05FID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9WT0xVTUVfU1RBVEVfQ0hBTkdFRCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVFlQRV9WT0xVTUVfRkxBR1NfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHdpdGhvdXQgdXBkYXRpbmcgdGhlIEhBTCBidF92Y3AuaCBmaWxlcy4KLSAgICAvLyBNYXRjaCB1cCB3aXRoIGVudW0gY2xhc3MgQ29ubmVjdGlvblN0YXRlIG9mIGJ0X3ZjcF9jb250cm9sbGVyLmguCi0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQgPSAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HID0gMzsKLQotICAgIHB1YmxpYyBpbnQgdHlwZTsKLSAgICBwdWJsaWMgQmx1ZXRvb3RoRGV2aWNlIGRldmljZTsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50MTsKLSAgICBwdWJsaWMgaW50IHZhbHVlSW50MjsKLQotICAgIFZjcFN0YWNrRXZlbnQoaW50IHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyBldmVudCBkdW1wCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiVmNwU3RhY2tFdmVudCB7dHlwZToiICsgZXZlbnRUeXBlVG9TdHJpbmcodHlwZSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZToiICsgZGV2aWNlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTE6IiArIHZhbHVlSW50MSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdmFsdWUyOiIgKyB2YWx1ZUludDIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJ9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXZlbnRUeXBlVG9TdHJpbmcoaW50IHR5cGUpIHsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfTk9ORToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVWRU5UX1RZUEVfTk9ORSI7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiOwotICAgICAgICAgICAgY2FzZSBFVkVOVF9UWVBFX1ZPTFVNRV9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAiRVZFTlRfVFlQRV9WT0xVTUVfU1RBVEVfQ0hBTkdFRCI7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1RZUEVfVk9MVU1FX0ZMQUdTX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX1ZPTFVNRV9GTEFHU19DSEFOR0VEIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFVkVOVF9UWVBFX1VOS05PV046IiArIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3MvQW5kcm9pZC5icCBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3MvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYzBjNC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJzZXR0aW5ncy1ibHVldG9vdGgtYWR2YS1zcmNzIiwKLSAgICBzcmNzOiBbInNyYy8qKi8qLmphdmEiXSwKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CQURldmljZVByZWZlcmVuY2VDb250cm9sbGVyLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQkFEZXZpY2VQcmVmZXJlbmNlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc5NDY1Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CQURldmljZVByZWZlcmVuY2VDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3MuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotCi1pbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkeC5wcmVmZXJlbmNlLlByZWZlcmVuY2U7Ci1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXA7Ci1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkNhY2hlZEJsdWV0b290aERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlVXBkYXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGguU2F2ZWRCbHVldG9vdGhEZXZpY2VVcGRhdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvbm5lY3RlZGRldmljZS5kb2NrLkRvY2tVcGRhdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvbm5lY3RlZGRldmljZS5EZXZpY2VQcmVmZXJlbmNlQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuY29yZS5CYXNlUHJlZmVyZW5jZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuZGFzaGJvYXJkLkRhc2hib2FyZEZyYWdtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLm92ZXJsYXkuRmVhdHVyZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuY29yZS5saWZlY3ljbGUuTGlmZWN5Y2xlT2JzZXJ2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuY29yZS5saWZlY3ljbGUuTGlmZWN5Y2xlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmNvcmUubGlmZWN5Y2xlLmV2ZW50cy5PblN0YXJ0OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmNvcmUubGlmZWN5Y2xlLmV2ZW50cy5PblN0b3A7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLktlZXA7Ci0KLUBLZWVwCi1wdWJsaWMgY2xhc3MgQkFEZXZpY2VQcmVmZXJlbmNlQ29udHJvbGxlciBleHRlbmRzIEJhc2VQcmVmZXJlbmNlQ29udHJvbGxlcgotICAgICAgICBpbXBsZW1lbnRzIExpZmVjeWNsZU9ic2VydmVyLCBPblN0YXJ0LCBPblN0b3AsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCQURldmljZVByZWZlcmVuY2VDb250cm9sbGVyIjsKLSAgICAvL1VwIHRvIDMgRWxlbWVudHMgY2FuIGJlIHZpZXdlZCBoZXJlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ERVZJQ0VfTlVNID0gMzsKLQotICAgIHByaXZhdGUgUHJlZmVyZW5jZUdyb3VwIG1QcmVmZXJlbmNlR3JvdXA7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhCcm9hZGNhc3RTb3VyY2VJbmZvRW50cmllcyBtQmxlU291cmNlSW5mb1VwZGF0ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZWZlcmVuY2VTaXplOwotICAgIHByaXZhdGUgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIG1DYWNoZWREZXZpY2U7Ci0KLSAgICBwdWJsaWMgQkFEZXZpY2VQcmVmZXJlbmNlQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQsIExpZmVjeWNsZSBsaWZlY3ljbGUsIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHByZWZlcmVuY2VLZXkpOwotCi0gICAgICAgIGxpZmVjeWNsZS5hZGRPYnNlcnZlcih0aGlzKTsKLSAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJjb25zdHJ1Y3RvcjogS0VZIiArIHByZWZlcmVuY2VLZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0QXZhaWxhYmlsaXR5U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gKG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0JMVUVUT09USCkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgPyBBVkFJTEFCTEUKLSAgICAgICAgICAgICAgICA6IENPTkRJVElPTkFMTFlfVU5BVkFJTEFCTEU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmZXJlbmNlS2V5KCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZygiYWRkZWRfc291cmNlcyIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3BsYXlQcmVmZXJlbmNlKFByZWZlcmVuY2VTY3JlZW4gc2NyZWVuKSB7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiZGlzcGxheVByZWZlcmVuY2UiKTsKLSAgICAgICAgc3VwZXIuZGlzcGxheVByZWZlcmVuY2Uoc2NyZWVuKTsKLSAgICAgICAgbVByZWZlcmVuY2VHcm91cCA9IHNjcmVlbi5maW5kUHJlZmVyZW5jZShnZXRQcmVmZXJlbmNlS2V5KCkpOwotICAgICAgICBtUHJlZmVyZW5jZUdyb3VwLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgICAgIGlmIChpc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInJlZ2lzdGVyaW5nIHd0aCBCbGVTcmNJbmZvIHVwZGF0ZXJzIik7Ci0gICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBzY3JlZW4uZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG1CbGVTb3VyY2VJbmZvVXBkYXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJsZVNvdXJjZUluZm9VcGRhdGVyLnNldFByZWZDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgaWYgKG1CbGVTb3VyY2VJbmZvVXBkYXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQmxlU291cmNlSW5mb1VwZGF0ZXIucmVnaXN0ZXJDYWxsYmFjaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBpZiAobUJsZVNvdXJjZUluZm9VcGRhdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CbGVTb3VyY2VJbmZvVXBkYXRlci51bnJlZ2lzdGVyQ2FsbGJhY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoRGFzaGJvYXJkRnJhZ21lbnQgZnJhZ21lbnQsIENhY2hlZEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJJbml0Iik7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG1CbGVTb3VyY2VJbmZvVXBkYXRlciA9IG5ldyBCbHVldG9vdGhCcm9hZGNhc3RTb3VyY2VJbmZvRW50cmllcyhmcmFnbWVudC5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgZnJhZ21lbnQsIEJBRGV2aWNlUHJlZmVyZW5jZUNvbnRyb2xsZXIudGhpcywKLSAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgICAgICBtUHJlZmVyZW5jZVNpemUgPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnJvYWRjYXN0U291cmNlSW5mb0FkZGVkKFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIm9uQnJvYWRjYXN0U291cmNlSW5mb0FkZGVkIik7Ci0KLSAgICAgICAgaWYgKG1QcmVmZXJlbmNlU2l6ZSA8IE1BWF9ERVZJQ0VfTlVNKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJldCA9IG1QcmVmZXJlbmNlR3JvdXAuYWRkUHJlZmVyZW5jZShwcmVmZXJlbmNlKTsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiYWRkUHJlZmVyZW5jZSByZXR1cm5zIiArIHJldCk7Ci0gICAgICAgICAgICBtUHJlZmVyZW5jZVNpemUrKzsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQcmVmZXJlbmNlVmlzaWJsaXR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Ccm9hZGNhc3RTb3VyY2VJbmZvUmVtb3ZlZChQcmVmZXJlbmNlIHByZWZlcmVuY2UpIHsKLSAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAib25Ccm9hZGNhc3RTb3VyY2VJbmZvUmVtb3ZlZCIpOwotICAgICAgICBtUHJlZmVyZW5jZVNpemUtLTsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBtUHJlZmVyZW5jZUdyb3VwLnJlbW92ZVByZWZlcmVuY2UocHJlZmVyZW5jZSk7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAicmVtb3ZlUHJlZmVyZW5jZSByZXR1cm5zICIgKyByZXQpOwotICAgICAgICB1cGRhdGVQcmVmZXJlbmNlVmlzaWJsaXR5KCk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCBzZXRQcmVmZXJlbmNlR3JvdXAoUHJlZmVyZW5jZUdyb3VwIHByZWZlcmVuY2VHcm91cCkgewotICAgICAgICBtUHJlZmVyZW5jZUdyb3VwID0gcHJlZmVyZW5jZUdyb3VwOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgdXBkYXRlUHJlZmVyZW5jZVZpc2libGl0eSgpIHsKLSAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJ1cGRhdGVQcmVmZXJlbmNlVmlzaWJsaXR5OiIgICsgbVByZWZlcmVuY2VTaXplKTsKLSAgICAgICAgbVByZWZlcmVuY2VHcm91cC5zZXRWaXNpYmxlKG1QcmVmZXJlbmNlU2l6ZSA+IDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvRGV0YWlsc0NvbnRyb2xsZXIuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvRGV0YWlsc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3MGIyOWYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNldHRpbmdzLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5QcmVmZXJlbmNlOwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5OwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50Q29tcGF0OwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbjsKLWltcG9ydCBhbmRyb2lkeC5wcmVmZXJlbmNlLlN3aXRjaFByZWZlcmVuY2U7Ci1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5FZGl0VGV4dFByZWZlcmVuY2U7Ci1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLndpZGdldC5BY3Rpb25CdXR0b25zUHJlZmVyZW5jZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5BMmRwUHJvZmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5WZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguTG9jYWxCbHVldG9vdGhNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5NYXBQcm9maWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5QYW5Qcm9maWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5QYmFwU2VydmVyUHJvZmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5jb3JlLmxpZmVjeWNsZS5MaWZlY3ljbGU7Ci1pbXBvcnQgYW5kcm9pZHguYXBwY29tcGF0LmFwcC5BbGVydERpYWxvZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuSHRtbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5SOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBCcm9hZGNhc3QgU291cmNlIEluZm8gZGV0YWlscyBvZiB0aGUgZ2l2ZW4gU2NhbiBkZWxlZ2F0b3IKLSAqLwotcHVibGljIGNsYXNzIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzQ29udHJvbGxlciBleHRlbmRzIEJsdWV0b290aERldGFpbHNDb250cm9sbGVyCi0gICAgICAgIGltcGxlbWVudHMgUHJlZmVyZW5jZS5PblByZWZlcmVuY2VDbGlja0xpc3RlbmVyLAotICAgICAgICAgUHJlZmVyZW5jZS5PblByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciwgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzQ29udHJvbGxlciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfQkRfQUREUkVTUyA9ICIwMDowMDowMDowMDowMDowMCI7Ci0KLSAgICAvL0Rpc3BsYXkgY29udHJvbHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NPVVJDRV9JTkZPX0dST1VQID0gImJyb2FkY2FzdF9zb3VyY2VfZGV0YWlsc19jYXRlZ29yeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TT1VSQ0VfSUQgPSAiYnJvYWRjYXN0X3NpX3NvdXJjZUlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NPVVJDRV9ERVZJQ0UgPSAiYnJvYWRjYXN0X3NpX3NvdXJjZV9hZGRyZXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NPVVJDRV9FTkNfU1RBVFVTID0gImJyb2FkY2FzdF9zaV9lbmNyeXB0aW9uX3N0YXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NPVVJDRV9NRVRBREFUQSA9ICJicm9hZGNhc3Rfc2lfbWV0YWRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU09VUkNFX01FVEFEQVRBX1NUQVRFID0gImJyb2FkY2FzdF9zaV9tZXRhZGF0YV9zdGF0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TT1VSQ0VfQVVESU9fU1RBVEUgPSAiYnJvYWRjYXN0X3NpX2F1ZGlvX3N0YXRlIjsKLQotICAgIC8vSW5wdXQgQ29udHJvbHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NPVVJDRV9NRVRBREFUQV9TV0lUQ0ggPSAiYnJvYWRjYXN0X3NpX2VuYWJsZV9tZXRhZGF0YV9zeW5jIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NPVVJDRV9BVURJT1NZTkNfU1dJVENIID0gImJyb2FkY2FzdF9zaV9lbmFibGVfYXVkaW9fc3luYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VUERBVEVfQkNBU1RfQ09ERSA9ICJ1cGRhdGVfYnJvYWRjYXN0X2NvZGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVBEQVRFX1NPVVJDRV9JTkZPID0gImJjYXN0X3NpX3VwZGF0ZV9idXR0b24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVNT1ZFX1NPVVJDRV9JTkZPID0gImJjYXN0X3NpX3JlbW92ZV9idXR0b24iOwotCi0gICAgcHJpdmF0ZSBDYWNoZWRCbHVldG9vdGhEZXZpY2UgbUNhY2hlZERldmljZTsKLSAgICBwcml2YXRlIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZSBtVmVuZG9yQ2FjaGVkRGV2aWNlOwotICAgIHByaXZhdGUgUHJlZmVyZW5jZUNhdGVnb3J5IG1Tb3VyY2VJbmZvQ29udGFpbmVyOwotCi0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlIG1Tb3VyY2VJZFByZWY7Ci0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlIG1Tb3VyY2VEZXZpY2VQcmVmOwotICAgIHByaXZhdGUgUHJlZmVyZW5jZSBtU291cmNlRW5jU3RhdHVzUHJlZjsKLSAgICBwcml2YXRlIFByZWZlcmVuY2UgbVNvdXJjZU1ldGFkYXRhUHJlZjsKLSAgICBwcml2YXRlIFByZWZlcmVuY2UgbVNvdXJjZU1ldGFkYXRhU3luY1N0YXR1c1ByZWY7Ci0gICAgcHJpdmF0ZSBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIG1Tb3VyY2VBdWRpb1N5bmNTdGF0dXNQcmVmOwotICAgIHByaXZhdGUgU3dpdGNoUHJlZmVyZW5jZSBtU291cmNlTWV0YWRhdGFTeW5jU3dpdGNoUHJlZjsKLSAgICBwcml2YXRlIFN3aXRjaFByZWZlcmVuY2UgbVNvdXJjZUF1ZGlvU3luY1N3aXRjaFByZWY7Ci0gICAgcHJpdmF0ZSBFZGl0VGV4dFByZWZlcmVuY2UgbVNvdXJjZVVwZGF0ZUJjYXN0Q29kZVByZWY7Ci0gICAgcHJpdmF0ZSBBY3Rpb25CdXR0b25zUHJlZmVyZW5jZSBtU291cmNlVXBkYXRlU291cmNlSW5mb1ByZWY7Ci0gICAgcHJpdmF0ZSBBY3Rpb25CdXR0b25zUHJlZmVyZW5jZSBtU291cmNlUmVtb3ZlU291cmNlSW5mb1ByZWY7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1ZhbHVlQ2hhbmdlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBtQmxlQnJvYWRjYXN0U291cmNlSW5mbzsKLSAgICBwcml2YXRlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIgbVNjYW5Bc3Npc3RhbmNlTWdyOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jyb2FkY2FzdFBJTlVwZGF0ZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQnJvYWRjYXN0Q29kZTsKLSAgICBwcml2YXRlIGludCBtU291cmNlSW5mb0luZGV4OwotICAgIHByaXZhdGUgU3RyaW5nIEVNUFRZX0VOVFJZID0gIkVNUFRZIEVOVFJZIjsKLSAgICBwcml2YXRlIGludCBtTWV0YWRhdGFTeW5jU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUF1ZGlvU3luY1N0YXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNCdXR0b25SZWZyZXNoT25seSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtR3JvdXBPcCA9IGZhbHNlOwotICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVNjYW5Bc3Npc3RHcm91cE9wRGlhbG9nID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gbUJpc0luZGljaWVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUEFzeW5jQ3RybE5lZWRlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBQcmVmZXJlbmNlRnJhZ21lbnRDb21wYXQgZnJhZ21lbnQsCi0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIGJsZVNvdXJjZUluZm8sIENhY2hlZEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBpbnQgc291cmNlSW5mb0luZGV4LCBMaWZlY3ljbGUgbGlmZWN5Y2xlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGZyYWdtZW50LCBkZXZpY2UsIGxpZmVjeWNsZSk7Ci0gICAgICAgIENvbnRleHQgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQmxlQnJvYWRjYXN0U291cmNlSW5mbyA9IGJsZVNvdXJjZUluZm87Ci0gICAgICAgIG1DYWNoZWREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIExvY2FsQmx1ZXRvb3RoTWFuYWdlciBtZ3IgPSBVdGlscy5nZXRMb2NhbEJ0TWFuYWdlcihjb250ZXh0KTsKLSAgICAgICAgTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlciBwcm9maWxlTWFuYWdlciA9IG1nci5nZXRQcm9maWxlTWFuYWdlcigpOwotICAgICAgICBtVmVuZG9yQ2FjaGVkRGV2aWNlID0gVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlLmdldFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZShkZXZpY2UsIHByb2ZpbGVNYW5hZ2VyKTsKLSAgICAgICAgbVNjYW5Bc3Npc3RhbmNlTWdyID0gbVZlbmRvckNhY2hlZERldmljZS5nZXRTY2FuQXNzaXN0TWFuYWdlcigpOwotICAgICAgICBsaWZlY3ljbGUuYWRkT2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgIG1Tb3VyY2VJbmZvSW5kZXggPSBzb3VyY2VJbmZvSW5kZXg7Ci0gICAgICAgIGNsZWFySW5wdXRzKCk7Ci0gICAgICAgIG1QQXN5bmNDdHJsTmVlZGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFySW5wdXRzKCkKLSAgICB7ICAgIC8vS2VlcCB0aGUgIGRlZmF1bHQgc3RhdGUgb2YgTWV0YWRhdGEgYXMgT04gYWx3YXlzCi0gICAgICAgICBtTWV0YWRhdGFTeW5jU3RhdGUgPQotICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQzsKLSAgICAgICAgIG1BdWRpb1N5bmNTdGF0ZSA9Ci0gICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9JTlZBTElEOwotICAgICAgICAgbUJyb2FkY2FzdENvZGUgPSBudWxsOwotICAgICAgICAgaXNCcm9hZGNhc3RQSU5VcGRhdGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyaWdnZXJSZW1vdmVCcm9hZGNhc3RTb3VyY2UoKSB7Ci0gICAgICAgIGlmIChtU2NhbkFzc2lzdGFuY2VNZ3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNjYW5Bc3Npc3RhbmNlTWdyLnJlbW92ZUJyb2FkY2FzdFNvdXJjZSgKLSAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvLmdldFNvdXJjZUlkKCksIG1Hcm91cE9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvblJlbW92ZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVzc2VkKCkgewotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgbVNvdXJjZUluZm9JbmRleCAgKyAiOm9uUmVtb3ZlQnJvYWRjYXN0U291cmNlSW5mb1ByZXNzZWQ6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm8pOwotCi0gICAgICAgIC8vLypfQ1NJUAotICAgICAgICBpZiAobUNhY2hlZERldmljZS5pc0dyb3VwRGV2aWNlKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbUNhY2hlZERldmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmJsdWV0b290aF9kZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZ3JvdXBfcmVtb3ZlX3NvdXJjZV9tZXNzYWdlLCBuYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ncm91cF9yZW1vdmVfc291cmNlX3RpdGxlKTsKLQotICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciBncm91cE9wTGlzdGVuZXIgPSBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5Bc3Npc3RHcm91cE9wRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuQXNzaXN0R3JvdXBPcERpYWxvZy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUdyb3VwT3AgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVtb3ZlQnJvYWRjYXN0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgbm9uR3JvdXBPcExpc3RlbmVyID0gbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY2FuQXNzaXN0R3JvdXBPcERpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2NhbkFzc2lzdEdyb3VwT3BEaWFsb2cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbUdyb3VwT3AgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlbW92ZUJyb2FkY2FzdFNvdXJjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBtR3JvdXBPcCA9IGZhbHNlOwotICAgICAgICAgICAgbVNjYW5Bc3Npc3RHcm91cE9wRGlhbG9nID0gQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5zaG93QXNzaXN0YW5jZUdyb3VwT3B0aW9uc0RpYWxvZyhtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBtU2NhbkFzc2lzdEdyb3VwT3BEaWFsb2csIGdyb3VwT3BMaXN0ZW5lciwgbm9uR3JvdXBPcExpc3RlbmVyLCB0aXRsZSwgSHRtbC5mcm9tSHRtbChtZXNzYWdlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgICAgbUdyb3VwT3AgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyaWdnZXJSZW1vdmVCcm9hZGNhc3RTb3VyY2UoKTsKLSAgICAgICAgLy8vKl9DU0lQCi0gICAgICAgIH0KLSAgICAgICAgLy9fQ1NJUCovCi0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3luY1N0YXRlKGludCBtZXRhZGF0YVN5bmNTdGF0ZSwgaW50IGF1ZGlvU3luY1N0YXRlKSB7Ci0KLSAgICAgICAgaWYgKGF1ZGlvU3luY1N0YXRlID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRCAmJgotICAgICAgICAgICAgbWV0YWRhdGFTeW5jU3RhdGUgPT0gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQykgewotICAgICAgICAgICAgcmV0dXJuIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIuU1lOQ19NRVRBREFUQV9BVURJTzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhdWRpb1N5bmNTdGF0ZSA9PSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQgJiYKLSAgICAgICAgICAgIG1ldGFkYXRhU3luY1N0YXRlICE9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkMpIHsKLSAgICAgICAgICAgIHJldHVybiBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyLlNZTkNfQVVESU87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1ZGlvU3luY1N0YXRlICE9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRCAmJgotICAgICAgICAgICAgbWV0YWRhdGFTeW5jU3RhdGUgPT0gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQykgewotICAgICAgICAgICAgcmV0dXJuIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIuU1lOQ19NRVRBREFUQTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAgcHJpdmF0ZSB2b2lkIHRyaWdnZXJVcGRhdGVCcm9hZGNhc3RTb3VyY2UoKSB7Ci0gICAgICAgICBpZiAobVNjYW5Bc3Npc3RhbmNlTWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgaWYgKG1Jc1ZhbHVlQ2hhbmdlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICBpbnQgc3luY1N0YXRlID0gZ2V0U3luY1N0YXRlKG1NZXRhZGF0YVN5bmNTdGF0ZSwgbUF1ZGlvU3luY1N0YXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoc3luY1N0YXRlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInRyaWdnZXJVcGRhdGVCcm9hZGNhc3RTb3VyY2U6IEludmFsaWQgc3luYyBJbnB1dCwgSWdub3JlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBtU2NhbkFzc2lzdGFuY2VNZ3IudXBkYXRlQnJvYWRjYXN0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvLmdldFNvdXJjZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0U3luY1N0YXRlKG1NZXRhZGF0YVN5bmNTdGF0ZSwgbUF1ZGlvU3luY1N0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICBtQmlzSW5kaWNpZXMsIG1Hcm91cE9wKTsKLSAgICAgICAgICAgICAgICAgIG1Jc1ZhbHVlQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpc0Jyb2FkY2FzdFBJTlVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgIG1TY2FuQXNzaXN0YW5jZU1nci5zZXRCcm9hZGNhc3RDb2RlKAotICAgICAgICAgICAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvLmdldFNvdXJjZUlkKCksbUJyb2FkY2FzdENvZGUsIG1Hcm91cE9wKTsKLSAgICAgICAgICAgICAgICAgIGlzQnJvYWRjYXN0UElOVXBkYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNsZWFySW5wdXRzKCk7Ci0gICAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvblVwZGF0ZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVzc2VkKCkgewotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgbVNvdXJjZUluZm9JbmRleCAgKwotICAgICAgICAgICAgICAgIm9uVXBkYXRlQnJvYWRjYXN0U291cmNlSW5mb1ByZXNzZWQ6IiArIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvKTsKLQotICAgICAgICAvLy8qX0NTSVAKLSAgICAgICAgaWYgKG1DYWNoZWREZXZpY2UuaXNHcm91cERldmljZSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1DYWNoZWREZXZpY2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ibHVldG9vdGhfZGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmdyb3VwX3VwZGF0ZV9zb3VyY2VfbWVzc2FnZSwgbmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZ3JvdXBfdXBkYXRlX3NvdXJjZV90aXRsZSk7Ci0KLSAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgZ3JvdXBPcExpc3RlbmVyID0gbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdyb3VwT3AgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVXBkYXRlQnJvYWRjYXN0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgbm9uR3JvdXBPcExpc3RlbmVyID0gbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdyb3VwT3AgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZUJyb2FkY2FzdFNvdXJjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBtR3JvdXBPcCA9IGZhbHNlOwotICAgICAgICAgICAgbVNjYW5Bc3Npc3RHcm91cE9wRGlhbG9nID0gQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5zaG93QXNzaXN0YW5jZUdyb3VwT3B0aW9uc0RpYWxvZyhtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBtU2NhbkFzc2lzdEdyb3VwT3BEaWFsb2csIGdyb3VwT3BMaXN0ZW5lciwgbm9uR3JvdXBPcExpc3RlbmVyLCB0aXRsZSwgSHRtbC5mcm9tSHRtbChtZXNzYWdlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vX0NTSVAqLwotICAgICAgICAgICAgbUdyb3VwT3AgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyaWdnZXJVcGRhdGVCcm9hZGNhc3RTb3VyY2UoKTsKLSAgICAgICAgLy8vKl9DU0lQCi0gICAgICAgIH0KLSAgICAgICAgLy9fQ1NJUCovCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdChQcmVmZXJlbmNlU2NyZWVuIHNjcmVlbikgewotICAgICAgICBtU291cmNlSW5mb0NvbnRhaW5lciA9Ci0gICAgICAgICAgICAgICAgIChQcmVmZXJlbmNlQ2F0ZWdvcnkpc2NyZWVuLmZpbmRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VLZXkoKSk7Ci0gICAgICAgIG1Tb3VyY2VJZFByZWYgPSAoUHJlZmVyZW5jZSltU291cmNlSW5mb0NvbnRhaW5lci5maW5kUHJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfU09VUkNFX0lEKTsKLSAgICAgICAgbVNvdXJjZURldmljZVByZWYgPSAoUHJlZmVyZW5jZSltU291cmNlSW5mb0NvbnRhaW5lci5maW5kUHJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfU09VUkNFX0RFVklDRSk7Ci0gICAgICAgIG1Tb3VyY2VFbmNTdGF0dXNQcmVmID0gKFByZWZlcmVuY2UpbVNvdXJjZUluZm9Db250YWluZXIuZmluZFByZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1NPVVJDRV9FTkNfU1RBVFVTKTsKLSAgICAgICAgbVNvdXJjZU1ldGFkYXRhUHJlZiA9IChQcmVmZXJlbmNlKW1Tb3VyY2VJbmZvQ29udGFpbmVyLmZpbmRQcmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9TT1VSQ0VfTUVUQURBVEEpOwotICAgICAgICBtU291cmNlTWV0YWRhdGFTeW5jU3RhdHVzUHJlZiA9IChQcmVmZXJlbmNlKW1Tb3VyY2VJbmZvQ29udGFpbmVyLmZpbmRQcmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9TT1VSQ0VfTUVUQURBVEFfU1RBVEUpOwotICAgICAgICBpZiAobVBBc3luY0N0cmxOZWVkZWQpIHsKLSAgICAgICAgICAgIG1Tb3VyY2VNZXRhZGF0YVN5bmNTd2l0Y2hQcmVmID0gKFN3aXRjaFByZWZlcmVuY2UpbVNvdXJjZUluZm9Db250YWluZXIuZmluZFByZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1NPVVJDRV9NRVRBREFUQV9TV0lUQ0gpOwotCi0gICAgICAgICAgICBpZiAobVNvdXJjZU1ldGFkYXRhU3luY1N3aXRjaFByZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Tb3VyY2VNZXRhZGF0YVN5bmNTd2l0Y2hQcmVmLnNldE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVNvdXJjZUF1ZGlvU3luY1N0YXR1c1ByZWYgPSAoTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSltU291cmNlSW5mb0NvbnRhaW5lci5maW5kUHJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfU09VUkNFX0FVRElPX1NUQVRFKTsKLSAgICAgICAgaWYgKG1Tb3VyY2VBdWRpb1N5bmNTdGF0dXNQcmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2VBdWRpb1N5bmNTdGF0dXNQcmVmLnNldE9uUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNvdXJjZUF1ZGlvU3luY1N3aXRjaFByZWYgPSAoU3dpdGNoUHJlZmVyZW5jZSltU291cmNlSW5mb0NvbnRhaW5lci5maW5kUHJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfU09VUkNFX0FVRElPU1lOQ19TV0lUQ0gpOwotICAgICAgICBpZiAobVNvdXJjZUF1ZGlvU3luY1N3aXRjaFByZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNvdXJjZUF1ZGlvU3luY1N3aXRjaFByZWYuc2V0T25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtU291cmNlVXBkYXRlQmNhc3RDb2RlUHJlZiA9Ci0gICAgICAgICAgICAgICAgICAgICAoRWRpdFRleHRQcmVmZXJlbmNlKW1Tb3VyY2VJbmZvQ29udGFpbmVyLmZpbmRQcmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9VUERBVEVfQkNBU1RfQ09ERSk7Ci0gICAgICAgIGlmIChtU291cmNlVXBkYXRlQmNhc3RDb2RlUHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU291cmNlVXBkYXRlQmNhc3RDb2RlUHJlZi5zZXRPblByZWZlcmVuY2VDbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgbVNvdXJjZVVwZGF0ZUJjYXN0Q29kZVByZWYuc2V0T25QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNvdXJjZVVwZGF0ZVNvdXJjZUluZm9QcmVmID0KLSAgICAgICAgICAgICAgICAgICAgICgoQWN0aW9uQnV0dG9uc1ByZWZlcmVuY2UpbVNvdXJjZUluZm9Db250YWluZXIuZmluZFByZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1VQREFURV9TT1VSQ0VfSU5GTykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnNldEJ1dHRvbjFUZXh0KFIuc3RyaW5nLnVwZGF0ZV9zb3VyY2VpbmZvX2J0bl90eHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnNldEJ1dHRvbjFFbmFibGVkKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b24xT25DbGlja0xpc3RlbmVyKCh2aWV3KS0+b25VcGRhdGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlc3NlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b24yVGV4dChSLnN0cmluZy5yZW1vdmVfc291cmNlaW5mb19idG5fdHh0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b24ySWNvbihSLmRyYXdhYmxlLmljX3NldHRpbmdzX2Nsb3NlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b24yRW5hYmxlZChmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMk9uQ2xpY2tMaXN0ZW5lcigodmlldyktPm9uUmVtb3ZlQnJvYWRjYXN0U291cmNlSW5mb1ByZXNzZWQoKSk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldmljZUF0dHJpYnV0ZXNDaGFuZ2VkKCkgewotICAgICAgICAvL3VwZGF0ZSB0aGUgTG9jYWwgdmFyaWFibGUgSWYgdGhlIHJlY2VpdmVyU3RhdGUgaXMKLSAgICAgICAgLy91cGRhdGVkIHdpdGggc29tZSB2YWx1ZXMKLSAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+ICBzcmNJbmZvcyA9Ci0gICAgICAgICAgICAgICAgICAgIG1WZW5kb3JDYWNoZWREZXZpY2UuZ2V0QWxsQmxlQnJvYWRjYXN0cmVjZWl2ZXJTdGF0ZXMoKTsKLSAgICAgICAgaWYgKHNyY0luZm9zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBlbnRyeTogc3JjSW5mb3MuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgSW50ZWdlciBpbmRleCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzb3VyY2VJbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIFN0cmluZyB0b2FzdFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNvdXJjZUluZm9JbmRleCkgewotICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6bWF0Y2hpbmcgc291cmNlIEluZm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5mby5pc0VtcHR5RW50cnkoKSkgewotICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgbVNvdXJjZUluZm9JbmRleCAgKyAiOnNvdXJjZSBpbmZvIHNlZW0gdG8gYmUgcmVtb3ZlZCIpOwotICAgICAgICAgICAgICAgICAgICB0b2FzdFN0cmluZyA9ICJTb3VyY2UgSW5mbyBSZW1vdmFsIjsKLSAgICAgICAgICAgICAgICAgICAgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm8gPSBzb3VyY2VJbmZvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VJbmZvLmVxdWFscyhtQmxlQnJvYWRjYXN0U291cmNlSW5mbykgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAvL3RvYXN0IE1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm8gPSBzb3VyY2VJbmZvOwotICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgbVNvdXJjZUluZm9JbmRleCAgKyAiOlVwZGF0ZSBpbiBCcm9hZGNhc3QgU291cmNlIEluZm9ybWF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHRvYXN0U3RyaW5nID0gIlNvdXJjZSBJbmZvIFVwZGF0ZSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsIG1Tb3VyY2VJbmZvSW5kZXggICsgIjpObyBVcGRhdGUgdG8gU291cmNlIEluZm9ybWF0aW9uIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsIG1Tb3VyY2VJbmZvSW5kZXggICsgIjpJZ25vcmUgdGhpcyBjYXNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG9hc3RTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRvYXN0IHRvYXN0ID0gVG9hc3QubWFrZVRleHQobUNvbnRleHQsIHRvYXN0U3RyaW5nLCBUb2FzdC5MRU5HVEhfU0hPUlQpOwotICAgICAgICAgICAgICAgIHRvYXN0LnNob3coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlIHByZWZlcmVuY2UsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBTdHJpbmcga2V5ID0gcHJlZmVyZW5jZS5nZXRLZXkoKTsKLSAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsIG1Tb3VyY2VJbmZvSW5kZXggICsgIjpvblByZWZlcmVuY2VDaGFuZ2UiICsgbmV3VmFsdWUpOwotICAgICAgICBpZiAoa2V5LmVxdWFscyhLRVlfVVBEQVRFX0JDQVNUX0NPREUpKSB7Ci0gICAgICAgICAgICBFZGl0VGV4dFByZWZlcmVuY2UgcHJlZiA9IChFZGl0VGV4dFByZWZlcmVuY2UpcHJlZmVyZW5jZTsKLSAgICAgICAgICAgIFN0cmluZyBjb2RlID0gKFN0cmluZyluZXdWYWx1ZTsKLSAgICAgICAgICAgIC8vVXNlIGRpZmZlcmVudCBmbGFnIGZvciBCcm9hZGNhc3QgcGluCi0gICAgICAgICAgICBpc0Jyb2FkY2FzdFBJTlVwZGF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbUJyb2FkY2FzdENvZGUgPSAoU3RyaW5nKW5ld1ZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoS0VZX1NPVVJDRV9BVURJT19TVEFURSkpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiPj5DaGVja2VkOiIgK25ld1ZhbHVlKTsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGdldEVudHJpZXNTZXFlbmNlID0KLSAgICAgICAgICAgICAgICAoKE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UpcHJlZmVyZW5jZSkuZ2V0RW50cmllcygpOwotICAgICAgICAgICAgU2V0PFN0cmluZz4gdmFsdWVTZXQgPSAoKE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UpcHJlZmVyZW5jZSkuZ2V0VmFsdWVzKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkU3RyaW5ncyA9IG5ldyBTdHJpbmdbKChTZXQ8U3RyaW5nPikgbmV3VmFsdWUpLnNpemUoKV07Ci0KLSAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKLSAgICAgICAgICAgICBpbnQgaiA9MDsKLSAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IChTZXQ8U3RyaW5nPikgbmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTdHJpbmdzW2pdID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQmlzSW5kaWNpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMobUJpc0luZGljaWVzLmdldChpKS5nZXREZXNjcmlwdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJTZWxlY3RlZDogdmFsdWVbIisgaSArICJdLSAiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CaXNJbmRpY2llcy5nZXQoaSkuZ2V0U3RhdHVzKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXNJbmRpY2llcy5nZXQoaSkuc2V0U3RhdHVzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpc0luZGljaWVzLmdldChpKS5zZXRTdGF0dXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInZhbHVlWyIrIGorKyArICJdLSAiICsgdmFsdWUpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBtSXNWYWx1ZUNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0J1dHRvblJlZnJlc2hPbmx5ID0gdHJ1ZTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIFdoZW4gdGhlIHByZWYgZm9yIGEgYmxlIGJyb2FkY2FzdCBzb3VyY2UgaW5mbyBkZXRhaWxzIGlzIGNsaWNrZWQgb24sIG5lY2Vzc2FyeSBhY3Rpb24gd2lsbCBiZQotICAgICAqIHRha2VuIGFuZCB1cGRhdGVCcm9hZGNhc3RTb3VyY2VJbmZvIHdvdWxkIGJlIGNhbGxlZCBhcyBuZWVkZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VDbGljayhQcmVmZXJlbmNlIHByZWZlcmVuY2UpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHByZWZlcmVuY2UuZ2V0S2V5KCk7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6b25QcmVmZXJlbmNlQ2xpY2siKTsKLSAgICAgICAgbUlzVmFsdWVDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1QQXN5bmNDdHJsTmVlZGVkKSB7Ci0gICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhLRVlfU09VUkNFX01FVEFEQVRBX1NXSVRDSCkpIHsKLSAgICAgICAgICAgICAgICBTd2l0Y2hQcmVmZXJlbmNlIHByZWYgPSAoU3dpdGNoUHJlZmVyZW5jZSlwcmVmZXJlbmNlOwotICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6TWV0YSBkYXRhIHN5bmMgc3RhdGU6ICIgKyBwcmVmLmlzQ2hlY2tlZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZi5pc0NoZWNrZWQoKSkgbU1ldGFkYXRhU3luY1N0YXRlID0gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQzsKLSAgICAgICAgICAgICAgICBlbHNlIG1NZXRhZGF0YVN5bmNTdGF0ZSA9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lETEU7Ci0KLSAgICAgICAgICAgICAgICAvL1VwZGF0ZSB0aGUgYXVkaW8gc3luYyBzdGF0ZSBhcyB3ZWxsCi0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VBdWRpb1N5bmNTd2l0Y2hQcmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VBdWRpb1N5bmNTd2l0Y2hQcmVmLmlzQ2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TeW5jU3RhdGUgPSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TeW5jU3RhdGUgPSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9OT1RfU1lOQ0hST05JWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkuZXF1YWxzKEtFWV9TT1VSQ0VfQVVESU9TWU5DX1NXSVRDSCkpIHsKLSAgICAgICAgICAgIFN3aXRjaFByZWZlcmVuY2UgcHJlZiA9IChTd2l0Y2hQcmVmZXJlbmNlKXByZWZlcmVuY2U7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgbVNvdXJjZUluZm9JbmRleCAgKyAiOkF1ZGlvIHN5bmMgc3RhdGU6ICAiICsgcHJlZi5pc0NoZWNrZWQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChwcmVmLmlzQ2hlY2tlZCgpKSBtQXVkaW9TeW5jU3RhdGUgPSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQ7Ci0gICAgICAgICAgICBlbHNlIG1BdWRpb1N5bmNTdGF0ZSA9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX05PVF9TWU5DSFJPTklaRUQ7Ci0KLSAgICAgICAgICAgIGlmIChtUEFzeW5jQ3RybE5lZWRlZCkgewotICAgICAgICAgICAgICAgIC8vVXBkYXRlIHRoZSBtZXRhZGF0YSBzeW5jIHN0YXRlIGFzIHdlbGwKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZU1ldGFkYXRhU3luY1N3aXRjaFByZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNvdXJjZU1ldGFkYXRhU3luY1N3aXRjaFByZWYuaXNDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhZGF0YVN5bmNTdGF0ZSA9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhZGF0YVN5bmNTdGF0ZSA9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX05PVF9TWU5DSFJPTklaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscyhLRVlfVVBEQVRFX0JDQVNUX0NPREUpKSB7Ci0gICAgICAgICAgICBFZGl0VGV4dFByZWZlcmVuY2UgcHJlZiA9IChFZGl0VGV4dFByZWZlcmVuY2UpcHJlZmVyZW5jZTsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6Pj5QaW4gY29kZSB1cGRhdGVkOiAgIiArIHByZWYuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIC8vVXNlIGRpZmZlcmVudCBmbGFnIGZvciBCcm9hZGNhc3QgcGluCi0gICAgICAgICAgICBtSXNWYWx1ZUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlzQnJvYWRjYXN0UElOVXBkYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICBtQnJvYWRjYXN0Q29kZSA9IHByZWYuZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsIG1Tb3VyY2VJbmZvSW5kZXggICsgIjp1bmhhbmRsZWQgcHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgbUlzVmFsdWVDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsIG1Tb3VyY2VJbmZvSW5kZXggICsgIjpvblByZWZlcmVuY2VDbGljayIgKyBtQmxlQnJvYWRjYXN0U291cmNlSW5mbyk7Ci0gICAgICAgIG1Jc0J1dHRvblJlZnJlc2hPbmx5ID0gdHJ1ZTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UudW5yZWdpc3RlckNhbGxiYWNrKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtQ2FjaGVkRGV2aWNlLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldEVuY3J5cHRpb25TdGF0dXNTdHJpbmcoaW50IGVuY3J5cHRpb25TdGF0dXMpIHsKLQotICAgICAgICBzd2l0Y2goZW5jcnlwdGlvblN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX0lOVkFMSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJFTkNSWVBUSU9OIFNUQVRFIFVOS05PV04iOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX1VORU5DUllQVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiVU5FTkNSWVBURUQgU1RSRUFNSU5HIjsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9QSU5fTkVFREVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiUElOIFVQREFURSBORUVERUQiOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfRU5DX1NUQVRFX0RFQ1JZUFRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJERUNSWVBUSU5HIFNVQ0NFU1NGVUxMWSI7Ci0gICAgICAgICAgICBjYXNlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9FTkNfU1RBVEVfQkFEQ09ERToKLSAgICAgICAgICAgICAgICByZXR1cm4gIklOQ09SUkVDVCBCUk9BRENBU1QgUElOIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIkVOQ1JZUFRJT04gU1RBVEUgVU5LTk9XTiI7Ci0gICAgfQotCi0gICAgIFN0cmluZyBnZXRNZXRhZGF0YVN5bmNTdGF0dXNTdHJpbmcoaW50IG1ldGFkYXRhU3luY1N0YXR1cykgewotCi0gICAgICAgIHN3aXRjaChtZXRhZGF0YVN5bmNTdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIklETEUiOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JTlZBTElEOgotICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gICAgICAgICAgICBjYXNlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJTiBTWU5DIjsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfTk9fUEFTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIk5PIFBBU1QiOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9TWU5DSU5GT19SRVE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTWU5DSU5GTyBORUVERUQiOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9TWU5DX0ZBSUw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTWU5DIEZBSUwiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gICAgfQotCi0gICAgIFN0cmluZyBnZXRBdWRpb1N5bmNTdGF0dXNTdHJpbmcoaW50IGF1ZGlvU3luY1N0YXR1cykgewotCi0gICAgICAgIHN3aXRjaChhdWRpb1N5bmNTdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX0FVRElPX1NZTkNfU1RBVEVfSU5WQUxJRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9OT1RfU1lOQ0hST05JWkVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiTk9UIElOIFNZTkMiOwotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJTiBTWU5DIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIlVOS05PV04iOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BpblVwZGF0ZWROZWVkZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuaXNMb2NhbERldmljZShtQmxlQnJvYWRjYXN0U291cmNlSW5mby5nZXRTb3VyY2VEZXZpY2UoKSkpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiTG9jYWwgRGV2aWNlLCBEb250IGFsbG93IFVzZXIgdG8gdXBkYXRlIFBXRCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQmxlQnJvYWRjYXN0U291cmNlSW5mby5nZXRFbmNyeXB0aW9uU3RhdHVzKCkKLSAgICAgICAgICAgPT0gQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX0VOQ19TVEFURV9QSU5fTkVFREVEKSB7Ci0gICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJpc1BpblVwZGF0ZWROZWVkZWQgcmV0dXJuIiArIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmcmVzaGVzIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoZXMgZm9yIGFsbCBwcm9maWxlcywgcG9zc2libHkgYWRkaW5nIG9yIHJlbW92aW5nIHN3aXRjaGVzIGFzCi0gICAgICogbmVlZGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6cmVmcmVzaDogIiArIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvICsgIiBtU291cmNlSW5kZXgiICsgbVNvdXJjZUluZm9JbmRleCk7Ci0gICAgICAgIG1Tb3VyY2VJZFByZWYuc2V0U3VtbWFyeSgKLSAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YobUJsZUJyb2FkY2FzdFNvdXJjZUluZm8uZ2V0U291cmNlSWQoKSkpOwotCi0gICAgICAgIEJsdWV0b290aERldmljZSBkZXYgPSBtQmxlQnJvYWRjYXN0U291cmNlSW5mby5nZXRTb3VyY2VEZXZpY2UoKTsKLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBTdHJpbmcgcyA9IG51bGw7Ci0gICAgICAgIGlmIChkZXYgIT0gbnVsbCAmJiBhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyLmdldEFkZHJlc3MoKS5lcXVhbHMoZGV2LmdldEFkZHJlc3MoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzID0gYWRhcHRlci5nZXROYW1lKCkgKyAiKFNlbGYpIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBzID0gZGV2LmdldEFsaWFzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcyA9IFN0cmluZy52YWx1ZU9mKGRldi5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzID09IG51bGwgfHwgcy5lcXVhbHMoRU1QVFlfQkRfQUREUkVTUykpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6TlVMTCBzb3VyY2UgZGV2aWNlIik7Ci0gICAgICAgICAgICBzID0gIkVNUFRZX0VOVFJZIjsKLSAgICAgICAgfQotICAgICAgICBtU291cmNlRGV2aWNlUHJlZi5zZXRTdW1tYXJ5KHMpOwotICAgICAgICBtU291cmNlRW5jU3RhdHVzUHJlZi5zZXRTdW1tYXJ5KAotICAgICAgICAgICAgICAgIGdldEVuY3J5cHRpb25TdGF0dXNTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1CbGVCcm9hZGNhc3RTb3VyY2VJbmZvLmdldEVuY3J5cHRpb25TdGF0dXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBpZiAobUJsZUJyb2FkY2FzdFNvdXJjZUluZm8uaXNFbXB0eUVudHJ5KCkpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCBtU291cmNlSW5mb0luZGV4ICArICI6U291cmNlIEluZm9ybWF0aW9uIHNlZW0gdG8gYmUgRW1wdHkiKTsKLSAgICAgICAgICAgIGlmIChtUEFzeW5jQ3RybE5lZWRlZCkgewotICAgICAgICAgICAgICAgIG1Tb3VyY2VNZXRhZGF0YVN5bmNTd2l0Y2hQcmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNvdXJjZUF1ZGlvU3luY1N3aXRjaFByZWYuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtU291cmNlVXBkYXRlQmNhc3RDb2RlUHJlZi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIC8vRGlzYWJsZSAncmVtb3ZlIGFuZCB1cGRhdGUgc291cmNlIEluZm8nIGlmIEl0IGlzIGVtcHR5IGVudHJ5Ci0gICAgICAgICAgICBtU291cmNlVXBkYXRlU291cmNlSW5mb1ByZWYuc2V0QnV0dG9uMUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbVNvdXJjZVVwZGF0ZVNvdXJjZUluZm9QcmVmLnNldEJ1dHRvbjJFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1Tb3VyY2VBdWRpb1N5bmNTdGF0dXNQcmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbUlzVmFsdWVDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL2VuYWJsZSB0aGUgSW5wdXQgY29udHJvbHMKLSAgICAgICAgICAgIGlmIChtUEFzeW5jQ3RybE5lZWRlZCkgewotICAgICAgICAgICAgICAgIG1Tb3VyY2VNZXRhZGF0YVN5bmNTd2l0Y2hQcmVmLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU291cmNlQXVkaW9TeW5jU3dpdGNoUHJlZi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbVNvdXJjZVVwZGF0ZUJjYXN0Q29kZVByZWYuc2V0RW5hYmxlZChpc1BpblVwZGF0ZWROZWVkZWQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSXNCdXR0b25SZWZyZXNoT25seSAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZU1ldGFkYXRhU3luY1N0YXR1c1ByZWYuc2V0U3VtbWFyeSgKLSAgICAgICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhU3luY1N0YXR1c1N0cmluZyhtQmxlQnJvYWRjYXN0U291cmNlSW5mby5nZXRNZXRhZGF0YVN5bmNTdGF0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VBdWRpb1N5bmNTdGF0dXNQcmVmLnNldFN1bW1hcnkoCi0gICAgICAgICAgICAgICAgICAgICBnZXRBdWRpb1N5bmNTdGF0dXNTdHJpbmcobUJsZUJyb2FkY2FzdFNvdXJjZUluZm8uZ2V0QXVkaW9TeW5jU3RhdGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICBtQmlzSW5kaWNpZXMgPSBtQmxlQnJvYWRjYXN0U291cmNlSW5mby5nZXRCcm9hZGNhc3RDaGFubmVsc1N5bmNTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICBpZiAobUJpc0luZGljaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYmlzTmFtZXMgPSBuZXcgU3RyaW5nW21CaXNJbmRpY2llcy5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuW10gYmlzU3RhdHVzZXMgPSBuZXcgYm9vbGVhblttQmlzSW5kaWNpZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaGFzaFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1CaXNJbmRpY2llcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlzTmFtZXNbaV0gPSBtQmlzSW5kaWNpZXMuZ2V0KGkpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBiaXNTdGF0dXNlc1tpXSA9IG1CaXNJbmRpY2llcy5nZXQoaSkuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaGFzaFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChiaXNOYW1lcykpOwotICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlQXVkaW9TeW5jU3RhdHVzUHJlZi5zZXRFbnRyaWVzKGJpc05hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZUF1ZGlvU3luY1N0YXR1c1ByZWYuc2V0RW50cnlWYWx1ZXMoYmlzTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlQXVkaW9TeW5jU3RhdHVzUHJlZi5zZXRWYWx1ZXMoaGFzaFNldCk7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9SZWZsZWN0IHRoZSBjb250cm9scyBiYXNlZCBvbiB0aGUgc3RhdHVzCi0gICAgICAgICAgICAgICAgaWYgKG1QQXN5bmNDdHJsTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VNZXRhZGF0YVN5bmNTd2l0Y2hQcmVmLnNldENoZWNrZWQobUJsZUJyb2FkY2FzdFNvdXJjZUluZm8uZ2V0TWV0YWRhdGFTeW5jU3RhdGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mby5CUk9BRENBU1RfQVNTSVNUX1BBX1NZTkNfU1RBVEVfSU5fU1lOQyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Tb3VyY2VBdWRpb1N5bmNTd2l0Y2hQcmVmLnNldENoZWNrZWQobUJsZUJyb2FkY2FzdFNvdXJjZUluZm8uZ2V0QXVkaW9TeW5jU3RhdGUoKSA9PQotICAgICAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQpOwotCi0gICAgICAgICAgICAgICAgaW50IGdldEZpcnN0U3luY2VkQmlzSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAobUJpc0luZGljaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1CaXNJbmRpY2llcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CaXNJbmRpY2llcy5nZXQoaSkuZ2V0U3RhdHVzKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpcnN0U3luY2VkQmlzSW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBtZXRhZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEZpcnN0U3luY2VkQmlzSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBtQmlzSW5kaWNpZXMuZ2V0KGdldEZpcnN0U3luY2VkQmlzSW5kZXgpLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRhRGF0YVN0ciA9IG5ldyBTdHJpbmcobWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgbVNvdXJjZUluZm9JbmRleCAgKyAiOk1ldGFkYXRhOiIgKyBtZXRhRGF0YVN0cik7Ci0gICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VNZXRhZGF0YVByZWYuc2V0U3VtbWFyeShtZXRhRGF0YVN0cik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZU1ldGFkYXRhUHJlZi5zZXRTdW1tYXJ5KCJOT05FIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQmxlQnJvYWRjYXN0U291cmNlSW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIChtQmxlQnJvYWRjYXN0U291cmNlSW5mby5nZXRNZXRhZGF0YVN5bmNTdGF0ZSgpICE9IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9QQV9TWU5DX1NUQVRFX0lOX1NZTkMgJiYKLSAgICAgICAgICAgICAgICAgICAgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm8uZ2V0QXVkaW9TeW5jU3RhdGUoKSAhPSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfQVVESU9fU1lOQ19TVEFURV9TWU5DSFJPTklaRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHNvdXJjZSBJbmZvIGJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBtU291cmNlVXBkYXRlU291cmNlSW5mb1ByZWYuc2V0QnV0dG9uMkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVVwZGF0ZVNvdXJjZUluZm9QcmVmLnNldEJ1dHRvbjJFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1VzZXIgY2FuIHVwZGF0ZSBPUiByZW1vdmUgb25seSBpZiB0aGUgU291cmNlIGluZm8gaXMgbm90IGFuIEVtcHR5IEVudHJ5Ci0gICAgICAgICAgICBpZiAobUlzVmFsdWVDaGFuZ2VkIHx8IGlzQnJvYWRjYXN0UElOVXBkYXRlZCkgewotICAgICAgICAgICAgICAgIC8vVXNlciBjYW4gVXBkYXRlIG9ubHkgaWYgYW55IG9mIHRoZSBlbnRyaWVzIGFyZSBtb2RpZmllZCBieSB1c2VyIGFjdGlvbgotICAgICAgICAgICAgICAgIG1Tb3VyY2VVcGRhdGVTb3VyY2VJbmZvUHJlZi5zZXRCdXR0b24xRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZVVwZGF0ZVNvdXJjZUluZm9QcmVmLnNldEJ1dHRvbjFFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc0J1dHRvblJlZnJlc2hPbmx5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVuY2VLZXkoKSB7Ci0gICAgICAgIHJldHVybiBLRVlfU09VUkNFX0lORk9fR1JPVVA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzRnJhZ21lbnQuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvRGV0YWlsc0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMGQzYTUuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfQkxVRVRPT1RIOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuc2V0dGluZ3MuU2V0dGluZ3NFbnVtczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRldmljZUNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwotCi0KLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvcmUuU2V0dGluZ3NVSURldmljZUNvbmZpZzsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5kYXNoYm9hcmQuUmVzdHJpY3RlZERhc2hib2FyZEZyYWdtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLm92ZXJsYXkuRmVhdHVyZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3Muc2xpY2VzLkJsb2NraW5nU2xpY2VQcmVmQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuY29yZS5BYnN0cmFjdFByZWZlcmVuY2VDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmNvcmUubGlmZWN5Y2xlLkxpZmVjeWNsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvRGV0YWlsc0ZyYWdtZW50IGV4dGVuZHMgUmVzdHJpY3RlZERhc2hib2FyZEZyYWdtZW50IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVWSUNFX0FERFJFU1MgPSAiZGV2aWNlX2FkZHJlc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TT1VSQ0VfSU5GTyA9ICJicm9hZGNhc3Rfc291cmNlX2luZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TT1VSQ0VfSU5GT19JTkRFWCA9ICJicm9hZGNhc3Rfc291cmNlX2luZGV4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNvdXJjZUluZm9EZXRhaWxzRnJnIjsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBTdHJpbmcgbURldmljZUFkZHJlc3M7Ci0gICAgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIG1DYWNoZWREZXZpY2U7Ci0gICAgTG9jYWxCbHVldG9vdGhNYW5hZ2VyIG1NYW5hZ2VyOwotICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gbUJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci0gICAgSW50ZWdlciBtU291cmNlSW5mb0luZGV4ID0gLTE7Ci0KLSAgICBwdWJsaWMgQmxlQnJvYWRjYXN0U291cmNlSW5mb0RldGFpbHNGcmFnbWVudCgpIHsKLSAgICAgICAgc3VwZXIoRElTQUxMT1dfQ09ORklHX0JMVUVUT09USCk7Ci0gICAgfQotCi0gICAgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGdldENhY2hlZERldmljZShTdHJpbmcgZGV2aWNlQWRkcmVzcykgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgcmVtb3RlRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgbU1hbmFnZXIuZ2V0Qmx1ZXRvb3RoQWRhcHRlcigpLmdldFJlbW90ZURldmljZShkZXZpY2VBZGRyZXNzKTsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmdldENhY2hlZERldmljZU1hbmFnZXIoKS5maW5kRGV2aWNlKHJlbW90ZURldmljZSk7Ci0gICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmxlQnJvYWRjYXN0U291cmNlSW5mb0RldGFpbHNGcmFnbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgZGV2aWNlQWRkcmVzcykgewotICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoMSk7Ci0gICAgICAgIGFyZ3MucHV0U3RyaW5nKEtFWV9ERVZJQ0VfQUREUkVTUywgZGV2aWNlQWRkcmVzcyk7Ci0gICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgQmxlQnJvYWRjYXN0U291cmNlSW5mb0RldGFpbHNGcmFnbWVudCgpOwotICAgICAgICBmcmFnbWVudC5zZXRBcmd1bWVudHMoYXJncyk7Ci0gICAgICAgIHJldHVybiBmcmFnbWVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbURldmljZUFkZHJlc3MgPSBnZXRBcmd1bWVudHMoKS5nZXRTdHJpbmcoS0VZX0RFVklDRV9BRERSRVNTKTsKLSAgICAgICAgbU1hbmFnZXIgPSBVdGlscy5nZXRMb2NhbEJ0TWFuYWdlcihjb250ZXh0KTsKLSAgICAgICAgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm8gPSBnZXRBcmd1bWVudHMoKS5nZXRQYXJjZWxhYmxlKEtFWV9TT1VSQ0VfSU5GTyk7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UgPSBnZXRDYWNoZWREZXZpY2UobURldmljZUFkZHJlc3MpOwotICAgICAgICBtU291cmNlSW5mb0luZGV4ID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KEtFWV9TT1VSQ0VfSU5GT19JTkRFWCk7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoKGNvbnRleHQpOwotICAgICAgICBpZiAobUNhY2hlZERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB0aGlzIHBhZ2UgaWYgZGV2aWNlIGlzIG51bGwgd2l0aCBpbnZhbGlkIGRldmljZSBtYWMgYWRkcmVzcwotICAgICAgICAgICAgTG9nLncoVEFHLCAib25BdHRhY2goKSBDYWNoZWREZXZpY2UgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQmxlQnJvYWRjYXN0U291cmNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkF0dGFjaCgpICBtQmxlQnJvYWRjYXN0U291cmNlSW5mbyBudWxsISIpOwotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Tb3VyY2VJbmZvSW5kZXggPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25BdHRhY2goKSAgbVNvdXJjZUluZm9JbmRleCBudWxsISIpOwotICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE1ldHJpY3NDYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIFNldHRpbmdzRW51bXMuQkxVRVRPT1RIX0RFVklDRV9ERVRBSUxTOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9nVGFnKCkgewotICAgICAgICByZXR1cm4gVEFHOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZ2V0UHJlZmVyZW5jZVNjcmVlblJlc0lkKCkgewotICAgICAgICByZXR1cm4gUi54bWwuYmNhc3Rfc291cmNlX2luZm9fZGV0YWlsc19mcmFnbWVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTGlzdDxBYnN0cmFjdFByZWZlcmVuY2VDb250cm9sbGVyPiBjcmVhdGVQcmVmZXJlbmNlQ29udHJvbGxlcnMoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEFycmF5TGlzdDxBYnN0cmFjdFByZWZlcmVuY2VDb250cm9sbGVyPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIGlmIChtQ2FjaGVkRGV2aWNlICE9IG51bGwgJiYgbUJsZUJyb2FkY2FzdFNvdXJjZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgTGlmZWN5Y2xlIGxpZmVjeWNsZSA9IGdldFNldHRpbmdzTGlmZWN5Y2xlKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVycy5hZGQobmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzQ29udHJvbGxlcihjb250ZXh0LCB0aGlzLCBtQmxlQnJvYWRjYXN0U291cmNlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlZERldmljZSwgbVNvdXJjZUluZm9JbmRleCwgbGlmZWN5Y2xlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZS5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzQ2MzYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3MuYmx1ZXRvb3RoOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuVXNlck1hbmFnZXIuRElTQUxMT1dfQ09ORklHX0JMVUVUT09USDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLnNldHRpbmdzLlNldHRpbmdzRW51bXM7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuSHRtbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkeC5hcHBjb21wYXQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZTsKLWltcG9ydCBhbmRyb2lkeC5wcmVmZXJlbmNlLlByZWZlcmVuY2VWaWV3SG9sZGVyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5vdmVybGF5LkZlYXR1cmVGYWN0b3J5OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLndpZGdldC5HZWFyUHJlZmVyZW5jZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQmx1ZXRvb3RoVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkNhY2hlZEJsdWV0b290aERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5jb3JlLmluc3RydW1lbnRhdGlvbi5NZXRyaWNzRmVhdHVyZVByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuSW50ZWdlcjsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nOwotLyoqCi0gKiBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSBpcyB0aGUgcHJlZmVyZW5jZSB0eXBlIHVzZWQgdG8gZGlzcGxheSBlYWNoCi0gKiBCcm9hZGNhc3QgU291cmNlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgUmVtb3RlIFNjYW4gZGVsZWdhdG9yLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmxlQnJvYWRjYXN0U291cmNlSW5mb1ByZWZlcmVuY2UgZXh0ZW5kcyBHZWFyUHJlZmVyZW5jZSBpbXBsZW1lbnRzCi0gICAgICAgIENhY2hlZEJsdWV0b290aERldmljZS5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRU1QVFlfQkRfQUREUiA9ICIwMDowMDowMDowMDowMDowMCI7Ci0KLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgQEludERlZih7U29ydFR5cGUuVFlQRV9ERUZBVUxULAotICAgICAgICAgICAgU29ydFR5cGUuVFlQRV9GSUZPfSkKLSAgICBwdWJsaWMgQGludGVyZmFjZSBTb3J0VHlwZSB7Ci0gICAgICAgIGludCBUWVBFX0RFRkFVTFQgPSAxOwotICAgICAgICBpbnQgVFlQRV9GSUZPID0gMjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIENhY2hlZEJsdWV0b290aERldmljZSBtQ2FjaGVkRGV2aWNlOwotICAgIHByaXZhdGUgQmxlQnJvYWRjYXN0U291cmNlSW5mbyBtQmxlU291cmNlSW5mbzsKLSAgICBwcml2YXRlIGZpbmFsIEludGVnZXIgbUluZGV4OwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBtQ3VycmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVR5cGU7Ci0KLSAgICAvLy9wcml2YXRlIFN0cmluZyBjb250ZW50RGVzY3JpcHRpb24gPSBudWxsOwotICAgIC8vQFZpc2libGVGb3JUZXN0aW5nCi0gICAgLy9ib29sZWFuIG1OZWVkTm90aWZ5SGllcmFyY2h5Q2hhbmdlZCA9IGZhbHNlOwotICAgIC8qIFRhbGstYmFjayBkZXNjcmlwdGlvbnMgZm9yIHZhcmlvdXMgQlQgaWNvbnMgKi8KLSAgICBSZXNvdXJjZXMgbVJlc291cmNlczsKLQotICAgIHB1YmxpYyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIENhY2hlZEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNvdXJjZUluZm8sCi0gICAgICAgICAgICBJbnRlZ2VyIGluZGV4LCBAU29ydFR5cGUgaW50IHR5cGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgIG1JbmRleCA9IGluZGV4OwotCi0gICAgICAgIG1DYWNoZWREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG1CbGVTb3VyY2VJbmZvID0gc291cmNlSW5mbzsKLSAgICAgICAgbUNhY2hlZERldmljZS5yZWdpc3RlckNhbGxiYWNrKHRoaXMpOwotICAgICAgICBtQ3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVR5cGUgPSB0eXBlOwotCi0gICAgICAgIG9uRGV2aWNlQXR0cmlidXRlc0NoYW5nZWQoKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZEhpZGVTZWNvbmRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiAobUJsZVNvdXJjZUluZm8gPT0gbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRTZWNvbmRUYXJnZXRSZXNJZCgpIHsKLSAgICAgICAgcmV0dXJuIFIubGF5b3V0LnByZWZlcmVuY2Vfd2lkZ2V0X2dlYXI7Ci0gICAgfQotCi0gICAgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGdldENhY2hlZERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DYWNoZWREZXZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gZ2V0QmxlQnJvYWRjYXN0U291cmNlSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1CbGVTb3VyY2VJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJsZUJyb2FkY2FzdFNvdXJjZUluZm8oQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvKSB7Ci0gICAgICAgIG1CbGVTb3VyY2VJbmZvID0gc3JjSW5mbzsKLSAgICAgICAgLy9yZWZyZXNoCi0gICAgICAgIG9uRGV2aWNlQXR0cmlidXRlc0NoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBJbnRlZ2VyIGdldFNvdXJjZUluZm9JbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbmRleDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVGb3JSZW1vdmFsKCkgewotICAgICAgICBzdXBlci5vblByZXBhcmVGb3JSZW1vdmFsKCk7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UudW5yZWdpc3RlckNhbGxiYWNrKHRoaXMpOwotICAgIH0KLQotICAgIFN0cmluZyBmb3JtU3luY1N1bW1hcnlTdHJpbmcoQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvKSB7Ci0gICAgICAgIFN0cmluZyBtZXRhZGF0YVN0YXR1cyA9ICJNZXRhZGF0YSBTeW5jZWQiOwotICAgICAgICBTdHJpbmcgYXVkaW9TeW5jU3RhdHVzID0gIkF1ZGlvIFN5bmNlZCI7Ci0KLSAgICAgICAgaWYgKHNyY0luZm8uZ2V0TWV0YWRhdGFTeW5jU3RhdGUoKSA9PSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvLkJST0FEQ0FTVF9BU1NJU1RfUEFfU1lOQ19TVEFURV9JTl9TWU5DKSB7Ci0gICAgICAgICAgICBtZXRhZGF0YVN0YXR1cyA9ICJNZXRhZGF0YSBTeW5jZWQiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0YWRhdGFTdGF0dXMgPSAiTWV0YWRhdGEgbm90IHN5bmNlZCI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3JjSW5mby5nZXRBdWRpb1N5bmNTdGF0ZSgpID09IEJsZUJyb2FkY2FzdFNvdXJjZUluZm8uQlJPQURDQVNUX0FTU0lTVF9BVURJT19TWU5DX1NUQVRFX1NZTkNIUk9OSVpFRCkgewotICAgICAgICAgICAgYXVkaW9TeW5jU3RhdHVzID0gIkF1ZGlvIFN5bmNlZCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdWRpb1N5bmNTdGF0dXMgPSAiQXVkaW8gbm90IHN5bmNlZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGFkYXRhU3RhdHVzICsgIiwgIiArIGF1ZGlvU3luY1N0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRldmljZUF0dHJpYnV0ZXNDaGFuZ2VkKCkgewotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2ID0gbUJsZVNvdXJjZUluZm8uZ2V0U291cmNlRGV2aWNlKCk7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgU3RyaW5nIHMgPSBudWxsOwotICAgICAgICBpZiAoZGV2ICE9IG51bGwgJiYgYWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlci5nZXRBZGRyZXNzKCkuZXF1YWxzKGRldi5nZXRBZGRyZXNzKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcyA9IGFkYXB0ZXIuZ2V0TmFtZSgpICsgIihTZWxmKSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgcyA9IGRldi5nZXRBbGlhcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHMgPSBTdHJpbmcudmFsdWVPZihkZXYuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMuZXF1YWxzKEVNUFRZX0JEX0FERFIpKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInNlZW0gdG8gYmUgYW4gZW50cnkgc291cmNlIEluZm8iKTsKLSAgICAgICAgICAgIHMgPSAiRU1QVFkgRU5UUlkiOwotICAgICAgICB9Ci0gICAgICAgIHNldFRpdGxlKHMpOwotICAgICAgICBzZXRJY29uKFIuZHJhd2FibGUuaWNfbWVkaWFfc3RyZWFtKTsKLSAgICAgICAgaWYgKCFtQmxlU291cmNlSW5mby5pc0VtcHR5RW50cnkoKSkgewotICAgICAgICAgICAgLy9TaG93IHRoZSBzdGF0dXMgb25seSBJZiBpdCBpcyBub3QgYW4gRW1wdHkgRW50cnkKLSAgICAgICAgICAgIHNldFN1bW1hcnkoZm9ybVN5bmNTdW1tYXJ5U3RyaW5nKG1CbGVTb3VyY2VJbmZvKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRTdW1tYXJ5KCIiKTsKLSAgICAgICAgfQotICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIC8vIFRoaXMgY291bGQgYWZmZWN0IG9yZGVyaW5nLCBzbyBub3RpZnkgdGhhdAotICAgICAgICBub3RpZnlIaWVyYXJjaHlDaGFuZ2VkKCk7Ci0gICAgfQotCi0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAoKG8gPT0gbnVsbCkgfHwgIShvIGluc3RhbmNlb2YgQmxlQnJvYWRjYXN0U291cmNlSW5mb1ByZWZlcmVuY2UpKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIk5vdCBhbiBJbnN0YW5jZSBvZiBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZToiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIG90aGVyU3JjID0gKChCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSkgbykubUJsZVNvdXJjZUluZm87Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiQ29tcGFyaW5nOiAiICsgbUJsZVNvdXJjZUluZm8pOwotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIlRPOiAiICsgb3RoZXJTcmMpOwotICAgICAgICBib29sZWFuIHJldCA9IChtQmxlU291cmNlSW5mby5nZXRTb3VyY2VJZCgpID09IG90aGVyU3JjLmdldFNvdXJjZUlkKCkpOwotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgImVxdWFscyByZXR1cm5zOiAiICsgcmV0KTsKLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtQmxlU291cmNlSW5mby5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFByZWZlcmVuY2UgYW5vdGhlcikgewotICAgICAgICBpZiAoIShhbm90aGVyIGluc3RhbmNlb2YgQmxlQnJvYWRjYXN0U291cmNlSW5mb1ByZWZlcmVuY2UpKSB7Ci0gICAgICAgICAgICAvLyBSZWx5IG9uIGRlZmF1bHQgc29ydAotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVUbyhhbm90aGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU29ydFR5cGUuVFlQRV9ERUZBVUxUOgotICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiPj5jb21wYXJlVG8iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluZGV4ID4gKChCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSkgYW5vdGhlcikuZ2V0U291cmNlSW5mb0luZGV4KCkgPyAxIDogLTE7Ci0gICAgICAgICAgICBjYXNlIFNvcnRUeXBlLlRZUEVfRklGTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRUaW1lID4gKChCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSkgYW5vdGhlcikubUN1cnJlbnRUaW1lID8gMSA6IC0xOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGFyZVRvKGFub3RoZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNsaWNrZWQoKSB7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBmaW5hbCBNZXRyaWNzRmVhdHVyZVByb3ZpZGVyIG1ldHJpY3NGZWF0dXJlUHJvdmlkZXIgPQotICAgICAgICAgICAgICAgIEZlYXR1cmVGYWN0b3J5LmdldEZhY3RvcnkoY29udGV4dCkuZ2V0TWV0cmljc0ZlYXR1cmVQcm92aWRlcigpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2suamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWE0ZmIuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNldHRpbmdzLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZTsKLQotLyoqCi0gKiBDYWxsYmFjayB0byBhZGQgb3IgcmVtb3ZlIHtAbGluayBQcmVmZXJlbmNlfSBpbiBCbGUgYnJvYWRjYXN0IHNvdXJjZSBpbmZvCi0gKiBlbnRyaWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2sgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGEgQmxlIGJyb2FkY2FzdCBzb3VyYyBJbmZvcm1hdGlvbiBpcyBhZGRlZAotICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlIHByZXNlbnQgdGhlIGRldmljZQotICAgICAqLwotICAgIHZvaWQgb25Ccm9hZGNhc3RTb3VyY2VJbmZvQWRkZWQoUHJlZmVyZW5jZSBwcmVmZXJlbmNlKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGEgQmxlIGJyb2FkYXN0IHNvdXJjZSBJbmZvcm1hdGlvbiBpcyByZW1vdmVkCi0gICAgICogQHBhcmFtIHByZWZlcmVuY2UgcHJlc2VudCB0aGUgZGV2aWNlCi0gICAgICovCi0gICAgdm9pZCBvbkJyb2FkY2FzdFNvdXJjZUluZm9SZW1vdmVkKFByZWZlcmVuY2UgcHJlZmVyZW5jZSk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmxlQnJvYWRjYXN0U291cmNlSW5mb1VwZGF0ZXIuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFhMjBhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VJbmZvVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RTb3VyY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5QcmVmZXJlbmNlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5jb25uZWN0ZWRkZXZpY2UuRGV2aWNlUHJlZmVyZW5jZUNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvcmUuU3ViU2V0dGluZ0xhdW5jaGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmRhc2hib2FyZC5EYXNoYm9hcmRGcmFnbWVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy53aWRnZXQuR2VhclByZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkJsdWV0b290aENhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2VGaWx0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkNhY2hlZEJsdWV0b290aERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aFByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aE1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5JbnRlZ2VyOwotCi0vKioKLSAqIFVwZGF0ZSB0aGUgQmxlIGJyb2FkY2FzdCBzb3VyY2UgSW5mbyBwcmVmZXJlbmNlIGVudHJpZXMuIEl0IHJldHJpZXZlcyB0aGUgQmx1ZXRvb3RoIGJyb2FkY2FzdCBzb3VyY2UKLSAqIGluZm9ybWF0aW9uIHVzaW5nIENhY2hlZEJsdWV0b290aERldmljZSBvYmplY3QgZnJvbSBzZXR0aW5nIGxpYnJhcnkKLSAqIHtAbGluayBCbHVldG9vdGhDYWxsYmFja30uIEl0IG5vdGlmaWVzIHRoZSB1cHBlciBsZXZlbCB3aGV0aGVyIHRvIGFkZC9yZW1vdmUgdGhlIHByZWZlcmVuY2UKLSAqIHRocm91Z2gge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2t9Ci0gKgotICogSW4ge0BsaW5rIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9VcGRhdGVyfSwgaXQgdXNlcyB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlRmlsdGVyLkZpbHRlcn0gdG8gZGV0ZWN0Ci0gKiB3aGV0aGVyIHRoZSB7QGxpbmsgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlfSBpcyByZWxldmFudC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9VcGRhdGVyIGltcGxlbWVudHMgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlLkNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aENhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsZUJyb2FkY2FzdFNvdXJjZUluZm9VcGRhdGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2sgbUJsZVNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2s7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxJbnRlZ2VyLCBQcmVmZXJlbmNlPiBtUHJlZmVyZW5jZU1hcDsKLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBtUHJlZkNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIERhc2hib2FyZEZyYWdtZW50IG1GcmFnbWVudDsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIG1DYWNoZWREZXZpY2U7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZSBtVmVuZG9yQ2FjaGVkRGV2aWNlOwotICAgIHByaXZhdGUgTG9jYWxCbHVldG9vdGhNYW5hZ2VyIG1Mb2NhbE1hbmFnZXI7Ci0KLSAgICBmaW5hbCBHZWFyUHJlZmVyZW5jZS5PbkdlYXJDbGlja0xpc3RlbmVyIG1Tb3VyY2VJbmZvRW50cnlMaXN0ZW5lciA9IHByZWYgLT4gewotICAgICAgICBsYXVuY2hTb3VyY2VJbmZvRGV0YWlscyhwcmVmKTsKLSAgICB9OwotCi0gICAgcHVibGljIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9VcGRhdGVyKENvbnRleHQgY29udGV4dCwgRGFzaGJvYXJkRnJhZ21lbnQgZnJhZ21lbnQsCi0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZUNhbGxiYWNrIGFCbGVTb3VyY2VJbmZvUHJlZmVyZW5jZUNhbGxiYWNrLAotICAgICAgICAgICAgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICB0aGlzKGZyYWdtZW50LCBhQmxlU291cmNlSW5mb1ByZWZlcmVuY2VDYWxsYmFjayAsZGV2aWNlKTsKLSAgICB9Ci0KLSAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvVXBkYXRlcihEYXNoYm9hcmRGcmFnbWVudCBmcmFnbWVudCwKLSAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2sgYUJsZVNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2ssCi0gICAgICAgICAgICBDYWNoZWRCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIExvY2FsQmx1ZXRvb3RoTWFuYWdlciBtZ3IgPSBVdGlscy5nZXRMb2NhbEJ0TWFuYWdlcihtUHJlZkNvbnRleHQpOwotICAgICAgICBMb2NhbEJsdWV0b290aFByb2ZpbGVNYW5hZ2VyIHByb2ZpbGVNYW5hZ2VyID0gbWdyLmdldFByb2ZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgIG1WZW5kb3JDYWNoZWREZXZpY2UgPSBWZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UuZ2V0VmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlKGRldmljZSwgcHJvZmlsZU1hbmFnZXIpOwotICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKLSAgICAgICAgbUJsZVNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2sgPSBhQmxlU291cmNlSW5mb1ByZWZlcmVuY2VDYWxsYmFjazsKLSAgICAgICAgbVByZWZlcmVuY2VNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBQcmVmZXJlbmNlPigpOwotICAgICAgICBtTG9jYWxNYW5hZ2VyID0gVXRpbHMuZ2V0TG9jYWxCdE1hbmFnZXIobVByZWZDb250ZXh0KTsKLSAgICAgICAgbUxvY2FsTWFuYWdlci5nZXRFdmVudE1hbmFnZXIoKS5yZWdpc3RlckNhbGxiYWNrKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIHRoZSBibHVldG9vdGggZXZlbnQgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UucmVnaXN0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgZm9yY2VVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVyIHRoZSBibHVldG9vdGggZXZlbnQgY2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIG1DYWNoZWREZXZpY2UudW5yZWdpc3RlckNhbGxiYWNrKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2VkKGludCBibHVldG9vdGhTdGF0ZSkgewotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIm9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2VkIik7Ci0gICAgICAgIGlmIChibHVldG9vdGhTdGF0ZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRikgewotICAgICAgICAgICAgcmVtb3ZlQWxsQmxlQnJvYWRjYXN0U291cmNlSW5mb3NGcm9tUHJlZmVyZW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vZm9yY2VVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZSB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgYmx1ZXRvb3RoIGRldmljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb3JjZVVwZGF0ZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZWREZXZpY2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICBtVmVuZG9yQ2FjaGVkRGV2aWNlLmdldE51bWJlck9mQmxlQnJvYWRjYXN0UmVjZWl2ZXJTdGF0ZXMoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvPiBzcmNJbmZvcyA9Ci0gICAgICAgICAgICAgICAgICAgIG1WZW5kb3JDYWNoZWREZXZpY2UuZ2V0QWxsQmxlQnJvYWRjYXN0cmVjZWl2ZXJTdGF0ZXMoKTsKLSAgICAgICAgICAgIGlmIChzcmNJbmZvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3JjSW5mb3MgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+IGVudHJ5OiBzcmNJbmZvcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInJlbW92ZSBhbGwgdGhlIHByZWZlcmVuY2VzIGFzIHRoZXJlIGFyZSBubyByY3ZyIHN0YXRlcyIpOwotICAgICAgICAgIHJlbW92ZUFsbEJsZUJyb2FkY2FzdFNvdXJjZUluZm9zRnJvbVByZWZlcmVuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbEJsZUJyb2FkY2FzdFNvdXJjZUluZm9zRnJvbVByZWZlcmVuY2UoKSB7Ci0gICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBQcmVmZXJlbmNlPj4gZW50cmllcyA9IG1QcmVmZXJlbmNlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSAgewotICAgICAgICAvL2ZvciAoTWFwLkVudHJ5PEludGVnZXIsIFByZWZlcmVuY2U+IGVudHJ5OiBtUHJlZmVyZW5jZU1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnk8SW50ZWdlciwgUHJlZmVyZW5jZT4gZW50cnkgPSBlbnRyaWVzLm5leHQoKTsKLSAgICAgICAgICAgIC8vcmVtb3ZlUHJlZmVyZW5jZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICBtQmxlU291cmNlSW5mb1ByZWZlcmVuY2VDYWxsYmFjay5vbkJyb2FkY2FzdFNvdXJjZUluZm9SZW1vdmVkKGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmVmZXJlbmNlTWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgIEBPdmVycmlkZQotICAgICBwdWJsaWMgdm9pZCBvbkRldmljZUF0dHJpYnV0ZXNDaGFuZ2VkKCkgewotICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJvbkRldmljZUF0dHJpYnV0ZXNDaGFuZ2VkIik7Ci0gICAgICAgICBmb3JjZVVwZGF0ZSgpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbnRleHQgdG8gZ2VuZXJhdGUgdGhlIHtAbGluayBQcmVmZXJlbmNlfSwgc28gaXQgY291bGQgZ2V0IHRoZSBjb3JyZWN0IHRoZW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZWZDb250ZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtUHJlZkNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB3aGV0aGVyIHRvIHNob3cge0BsaW5rIENhY2hlZEJsdWV0b290aERldmljZX0gaW4gdGhlIGxpc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEludGVnZXIgaW5kZXgsIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc291cmNlSW5mbykgewotICAgICAgICBhZGRQcmVmZXJlbmNlKGluZGV4LCBzb3VyY2VJbmZvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIHtAbGluayBQcmVmZXJlbmNlfSB0aGF0IHJlcHJlc2VudHMgdGhlIHtAY29kZSBjYWNoZWREZXZpY2V9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJlZmVyZW5jZShJbnRlZ2VyIGluZGV4LCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNvdXJjZUluZm8pIHsKLSAgICAgICAgZmluYWwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IHNvdXJjZUluZm8uZ2V0U291cmNlRGV2aWNlKCk7Ci0gICAgICAgIGZpbmFsIGJ5dGUgc291cmNlSWQgPSBzb3VyY2VJbmZvLmdldFNvdXJjZUlkKCk7Ci0gICAgICAgIGlmIChtUHJlZmVyZW5jZU1hcC5jb250YWluc0tleShpbmRleCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAic291cmNlIGluZm8gYWRkaXRpb24iKTsKLSAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlIHNvdXJjZUluZm9QcmVmZXJlbmNlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlKG1QcmVmQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0U291cmNlSW5mb1ByZWZlcmVuY2UuU29ydFR5cGUuVFlQRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIHNvdXJjZUluZm9QcmVmZXJlbmNlLnNldE9uR2VhckNsaWNrTGlzdGVuZXIobVNvdXJjZUluZm9FbnRyeUxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJlZmVyZW5jZS5PblByZWZlcmVuY2VDbGlja0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlSW5mb1ByZWZlcmVuY2Uuc2V0T25QcmVmZXJlbmNlQ2xpY2tMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgIChQcmVmZXJlbmNlLk9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIpdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInNvdXJjZSBpbmZvIG5ld2x5IGFkZGVkOiAiICsgaW5kZXgpOwotICAgICAgICAgICAgbVByZWZlcmVuY2VNYXAucHV0KGluZGV4LCBzb3VyY2VJbmZvUHJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBtQmxlU291cmNlSW5mb1ByZWZlcmVuY2VDYWxsYmFjay5vbkJyb2FkY2FzdFNvdXJjZUluZm9BZGRlZChzb3VyY2VJbmZvUHJlZmVyZW5jZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSBwcmVmID0gKEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlKW1QcmVmZXJlbmNlTWFwLmdldChpbmRleCk7Ci0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIGN1cnJlbnRTaSA9IHByZWYuZ2V0QmxlQnJvYWRjYXN0U291cmNlSW5mbygpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRTaSAhPSBudWxsICYmIGN1cnJlbnRTaS5lcXVhbHMoc291cmNlSW5mbykpIHsKLSAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIk5vIGNoYW5nZSBpbiBTSSIgKyBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAic291cmNlIGluZm8gVXBkYXRlZDogIiArIGluZGV4KTsKLSAgICAgICAgICAgICAgICBwcmVmLnNldEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gKHNvdXJjZUluZm8pOwotCi0gICAgICAgICAgICAgICAgLyptQmxlU291cmNlSW5mb1ByZWZlcmVuY2VDYWxsYmFjay5vbkJyb2FkY2FzdFNvdXJjZUluZm9SZW1vdmVkKG1QcmVmZXJlbmNlTWFwLmdldChpbmRleCkpOwotICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFwLnJlbW92ZShpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZSBzb3VyY2VJbmZvUHJlZmVyZW5jZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZShtUHJlZkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlLlNvcnRUeXBlLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgc291cmNlSW5mb1ByZWZlcmVuY2Uuc2V0T25HZWFyQ2xpY2tMaXN0ZW5lcihtU291cmNlSW5mb0VudHJ5TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJlZmVyZW5jZS5PblByZWZlcmVuY2VDbGlja0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZm9QcmVmZXJlbmNlLnNldE9uUHJlZmVyZW5jZUNsaWNrTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAoUHJlZmVyZW5jZS5PblByZWZlcmVuY2VDbGlja0xpc3RlbmVyKXRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInNvdXJjZSBpbmZvIGFkZGVkIGFnYWluOiAiICsgaW5kZXgpOwotICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFwLnB1dChpbmRleCwgc291cmNlSW5mb1ByZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgIG1CbGVTb3VyY2VJbmZvUHJlZmVyZW5jZUNhbGxiYWNrLm9uQnJvYWRjYXN0U291cmNlSW5mb0FkZGVkKHNvdXJjZUluZm9QcmVmZXJlbmNlKTsqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCByZXByZXNlbnRzIHRoZSB7QGNvZGUgY2FjaGVkRGV2aWNlfQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVByZWZlcmVuY2UoaW50IGluZGV4LCBQcmVmZXJlbmNlIHByZWYpIHsKLSAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFwLmNvbnRhaW5zS2V5KGluZGV4KSkgewotICAgICAgICAgICAgbUJsZVNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2sub25Ccm9hZGNhc3RTb3VyY2VJbmZvUmVtb3ZlZChtUHJlZmVyZW5jZU1hcC5nZXQoaW5kZXgpKTsKLSAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFwLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQge0BsaW5rIENhY2hlZEJsdWV0b290aERldmljZX0gZnJvbSB7QGxpbmsgUHJlZmVyZW5jZX0gYW5kIGl0IGlzIHVzZWQgdG8gaW5pdAotICAgICAqIHtAbGluayBTdWJTZXR0aW5nTGF1bmNoZXJ9IHRvIGxhdW5jaCB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlRGV0YWlsc0ZyYWdtZW50fQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaFNvdXJjZUluZm9EZXRhaWxzKFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewotICAgICAgICBmaW5hbCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8gPQotICAgICAgICAgICAgICAgICgoQmxlQnJvYWRjYXN0U291cmNlSW5mb1ByZWZlcmVuY2UpIHByZWZlcmVuY2UpLmdldEJsZUJyb2FkY2FzdFNvdXJjZUluZm8oKTsKLSAgICAgICAgaWYgKHNyY0luZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9ICgoQmxlQnJvYWRjYXN0U291cmNlSW5mb1ByZWZlcmVuY2UpIHByZWZlcmVuY2UpLmdldFNvdXJjZUluZm9JbmRleCgpOwotICAgICAgICBmaW5hbCBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJncy5wdXRTdHJpbmcoQmxlQnJvYWRjYXN0U291cmNlSW5mb0RldGFpbHNGcmFnbWVudC5LRVlfREVWSUNFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgbUNhY2hlZERldmljZS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBhcmdzLnB1dFBhcmNlbGFibGUoQmxlQnJvYWRjYXN0U291cmNlSW5mb0RldGFpbHNGcmFnbWVudC5LRVlfU09VUkNFX0lORk8sCi0gICAgICAgICAgICAgICAgc3JjSW5mbyk7Ci0gICAgICAgIGFyZ3MucHV0SW50KEJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzRnJhZ21lbnQuS0VZX1NPVVJDRV9JTkZPX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQotICAgICAgICBuZXcgU3ViU2V0dGluZ0xhdW5jaGVyKG1GcmFnbWVudC5nZXRDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgLnNldERlc3RpbmF0aW9uKEJsZUJyb2FkY2FzdFNvdXJjZUluZm9EZXRhaWxzRnJhZ21lbnQuY2xhc3MuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIC5zZXRBcmd1bWVudHMoYXJncykKLSAgICAgICAgICAgICAgICAuc2V0VGl0bGVSZXMoUi5zdHJpbmcuc291cmNlX2luZm9fZGV0YWlsc190aXRsZSkKLSAgICAgICAgICAgICAgICAuc2V0U291cmNlTWV0cmljc0NhdGVnb3J5KG1GcmFnbWVudC5nZXRNZXRyaWNzQ2F0ZWdvcnkoKSkKLSAgICAgICAgICAgICAgICAubGF1bmNoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aEJyb2FkY2FzdEVuYWJsZUNvbnRyb2xsZXIuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbHVldG9vdGhCcm9hZGNhc3RFbmFibGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjU2NWMuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aEJyb2FkY2FzdEVuYWJsZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3MuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhCcm9hZGNhc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLQotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbjsKLWltcG9ydCBhbmRyb2lkeC5wcmVmZXJlbmNlLlN3aXRjaFByZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuUmVzdHJpY3RlZFN3aXRjaFByZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuY29yZS5Ub2dnbGVQcmVmZXJlbmNlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQmx1ZXRvb3RoQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkJsdWV0b290aFV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Ccm9hZGNhc3RQcm9maWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aFByb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuY29yZS5saWZlY3ljbGUuTGlmZWN5Y2xlT2JzZXJ2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuY29yZS5saWZlY3ljbGUuZXZlbnRzLk9uUGF1c2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuY29yZS5saWZlY3ljbGUuZXZlbnRzLk9uUmVzdW1lOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmNvcmUubGlmZWN5Y2xlLmV2ZW50cy5PbkRlc3Ryb3k7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuY29ubmVjdGVkZGV2aWNlLkJsdWV0b290aERhc2hib2FyZEZyYWdtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5LZWVwOwotCi1AS2VlcAotcHVibGljIGNsYXNzIEJsdWV0b290aEJyb2FkY2FzdEVuYWJsZUNvbnRyb2xsZXIgZXh0ZW5kcyBUb2dnbGVQcmVmZXJlbmNlQ29udHJvbGxlcgotICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlT2JzZXJ2ZXIsIE9uUmVzdW1lLCBPblBhdXNlLCBPbkRlc3Ryb3ksIEJsdWV0b290aENhbGxiYWNrIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhCcm9hZGNhc3RFbmFibGVDb250cm9sbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9BRENBU1RfQVVESU9fTUFTSyA9IDB4MDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX0xFX0FVRElPX01BU0tfUFJPUCA9ICJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmFkdl9hdWRpb19tYXNrIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQlJPQURDQVNUX0VOQUJMRSA9ICJibHVldG9vdGhfc2NyZWVuX2Jyb2FkY2FzdF9lbmFibGUiOwotICAgIHByaXZhdGUgUmVzdHJpY3RlZFN3aXRjaFByZWZlcmVuY2UgbVByZWZlcmVuY2UgPSBudWxsOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXRlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlc2V0X3BlbmRpbmcgPSBmYWxzZTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RQcm9maWxlIG1CYXBCcm9hZGNhc3RQcm9maWxlID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCbHVldG9vdGhMZUJyb2FkY2FzdEF1ZGlvU3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1DYWxsYmFja3NSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBMb2NhbEJsdWV0b290aE1hbmFnZXIgbU1hbmFnZXIgPSBudWxsOwotICAgIHB1YmxpYyBCbHVldG9vdGhCcm9hZGNhc3RFbmFibGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGtleSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBrZXkpOwotICAgICAgICBMb2cuZChUQUcsICJDb25zdHJ1Y3RvcigpIHdpdGgga2V5Iik7Ci0gICAgICAgIEluaXQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIEluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgaW50IGxlQXVkaW9NYXNrID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoQkxVRVRPT1RIX0xFX0FVRElPX01BU0tfUFJPUCwgMCk7Ci0gICAgICAgIGlzQmx1ZXRvb3RoTGVCcm9hZGNhc3RBdWRpb1N1cHBvcnRlZCA9ICgobGVBdWRpb01hc2sgJiBCUk9BRENBU1RfQVVESU9fTUFTSykgPT0gQlJPQURDQVNUX0FVRElPX01BU0spOwotICAgICAgICBpZihpc0JsdWV0b290aExlQnJvYWRjYXN0QXVkaW9TdXBwb3J0ZWQpewotICAgICAgICAgICBtTWFuYWdlciA9IFV0aWxzLmdldExvY2FsQnRNYW5hZ2VyKGNvbnRleHQpOwotICAgICAgICAgICBtQmFwQnJvYWRjYXN0UHJvZmlsZSA9IChCcm9hZGNhc3RQcm9maWxlKSBtTWFuYWdlci5nZXRQcm9maWxlTWFuYWdlcigpLmdldEJyb2FkY2FzdFByb2ZpbGUoKTsKLSAgICAgICAgICAgaWYgKCFtQ2FsbGJhY2tzUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVnaXN0ZXJpbmcgRXZlbnRNYW5hZ2VyIGNhbGxiYWNrcyIpOwotICAgICAgICAgICAgICAgbUNhbGxiYWNrc1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgbU1hbmFnZXIuZ2V0RXZlbnRNYW5hZ2VyKCkucmVnaXN0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExvZy5kKFRBRywgIkluaXQgZG9uZSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIG5ld1N0YXRlKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVN0YXRlIHJlcSAiICsgQm9vbGVhbi50b1N0cmluZyhuZXdTdGF0ZSkpOwotICAgICAgICBpZiAobmV3U3RhdGUgIT0gbVN0YXRlKSB7Ci0gICAgICAgICAgICAgaWYgKG1QcmVmZXJlbmNlICE9IG51bGwpIG1QcmVmZXJlbmNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVN0YXRlIHRvICIgKyBCb29sZWFuLnRvU3RyaW5nKG5ld1N0YXRlKSk7Ci0gICAgICAgICAgICAgbUJhcEJyb2FkY2FzdFByb2ZpbGUuc2V0QnJvYWRjYXN0TW9kZShuZXdTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25TdGF0ZUNoYW5nZWQoYm9vbGVhbiBuZXdTdGF0ZSkgewotICAgICAgICBMb2cuZChUQUcsICJvblN0YXRlQ2hhbmdlZCAiICsgQm9vbGVhbi50b1N0cmluZyhuZXdTdGF0ZSkpOwotICAgICAgICBtU3RhdGUgPSBuZXdTdGF0ZTsKLSAgICAgICAgaWYgKG1QcmVmZXJlbmNlICE9IG51bGwpIG1QcmVmZXJlbmNlLnNldENoZWNrZWQobVN0YXRlKTsKLSAgICAgICAgaWYgKG1TdGF0ZSA9PSBmYWxzZSAmJiByZXNldF9wZW5kaW5nID09IHRydWUpIHsKLSAgICAgICAgICAgIHJlc2V0X3BlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJCVCBzdGF0ZSwgbXNnID0gIiArIEludGVnZXIudG9TdHJpbmcobXNnLndoYXQpKTsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTjoKLSAgICAgICAgICAgICAgICBpZiAobVByZWZlcmVuY2UgIT0gbnVsbCkgbVByZWZlcmVuY2Uuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtQmFwQnJvYWRjYXN0UHJvZmlsZSA9IChCcm9hZGNhc3RQcm9maWxlKSBtTWFuYWdlci5nZXRQcm9maWxlTWFuYWdlcigpLmdldEJyb2FkY2FzdFByb2ZpbGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKLSAgICAgICAgICAgICAgICByZXNldF9wZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgb25TdGF0ZUNoYW5nZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG1CYXBCcm9hZGNhc3RQcm9maWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobVByZWZlcmVuY2UgIT0gbnVsbCkgbVByZWZlcmVuY2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25CbHVldG9vdGhTdGF0ZUNoYW5nZWQoaW50IG5ld0J0U3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25CbHVldG9vdGhTdGF0ZUNoYW5nZWQiICsgSW50ZWdlci50b1N0cmluZyhuZXdCdFN0YXRlKSk7Ci0KLSAgICAgICAgc3dpdGNoIChuZXdCdFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UobmV3QnRTdGF0ZSksIDIwMCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PTjoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PRkY6Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobUhhbmRsZXIub2J0YWluTWVzc2FnZShuZXdCdFN0YXRlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJyb2FkY2FzdFN0YXRlQ2hhbmdlZChpbnQgbmV3QmFwU3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25Ccm9hZGNhc3RTdGF0ZUNoYW5nZWQiICsgSW50ZWdlci50b1N0cmluZyhuZXdCYXBTdGF0ZSkpOwotCi0gICAgICAgIHN3aXRjaCAobmV3QmFwU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmVmZXJlbmNlICE9IG51bGwpIG1QcmVmZXJlbmNlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgb25TdGF0ZUNoYW5nZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEJyb2FkY2FzdC5TVEFURV9ESVNBQkxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVByZWZlcmVuY2UgIT0gbnVsbCkgbVByZWZlcmVuY2Uuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBvblN0YXRlQ2hhbmdlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJyb2FkY2FzdEtleUdlbmVyYXRlZCgpIHsKLSAgICAgICAgIExvZy5kKFRBRywgIm9uQnJvYWRjYXN0S2V5R2VuZXJhdGVkIik7Ci0gICAgICAgICAvLyBFbmNyeXB0aW9uIGtleSBnb3QgdXBkYXRlZC4gUmVzZXQgQkFQPwotICAgICAgICAgaWYgKG1TdGF0ZSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgcmVzZXRfcGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgdXBkYXRlU3RhdGUoZmFsc2UpOwotICAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZUtleSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZ2V0UHJlZmVyZW5jZUtleSIpOwotICAgICAgICByZXR1cm4gS0VZX0JST0FEQ0FTVF9FTkFCTEU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcGxheVByZWZlcmVuY2UoUHJlZmVyZW5jZVNjcmVlbiBzY3JlZW4pIHsKLSAgICAgICAgc3VwZXIuZGlzcGxheVByZWZlcmVuY2Uoc2NyZWVuKTsKLSAgICAgICAgTG9nLmQoVEFHLCAiZGlzcGxheVByZWZlcmVuY2UiKTsKLSAgICAgICAgbVByZWZlcmVuY2UgPSBzY3JlZW4uZmluZFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZUtleSgpKTsKLSAgICAgICAgaWYoaXNCbHVldG9vdGhMZUJyb2FkY2FzdEF1ZGlvU3VwcG9ydGVkKSB7Ci0gICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgICAgb25CbHVldG9vdGhTdGF0ZUNoYW5nZWQobUJsdWV0b290aEFkYXB0ZXIuZ2V0U3RhdGUoKSk7Ci0gICAgICAgICAgaWYgKChtQmx1ZXRvb3RoQWRhcHRlci5nZXRTdGF0ZSgpID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04pICYmCi0gICAgICAgICAgICAgIChtQmFwQnJvYWRjYXN0UHJvZmlsZS5pc1Byb2ZpbGVSZWFkeSgpKSkgewotICAgICAgICAgICAgaW50IGJhcFN0YXRlID0gbUJhcEJyb2FkY2FzdFByb2ZpbGUuZ2V0QnJvYWRjYXN0U3RhdHVzKCk7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJnZXQgc3RhdHVzIGRvbmUiKTsKLSAgICAgICAgICAgIGlmICgoYmFwU3RhdGUgPT0gQmx1ZXRvb3RoQnJvYWRjYXN0LlNUQVRFX0VOQUJMRUQpIHx8Ci0gICAgICAgICAgICAgICAgIChiYXBTdGF0ZSA9PSBCbHVldG9vdGhCcm9hZGNhc3QuU1RBVEVfU1RSRUFNSU5HKSkKLSAgICAgICAgICAgICAgICBvblN0YXRlQ2hhbmdlZCh0cnVlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvblN0YXRlQ2hhbmdlZChmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1QcmVmZXJlbmNlLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNldENoZWNrZWQoYm9vbGVhbiBpc0NoZWNrZWQpIHsKLSAgICAgICAgdXBkYXRlU3RhdGUoaXNDaGVja2VkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRBdmFpbGFiaWxpdHlTdGF0dXMoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImdldEF2YWlsYWJpbGl0eVN0YXR1cyIpOwotICAgICAgICBpZihpc0JsdWV0b290aExlQnJvYWRjYXN0QXVkaW9TdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBBVkFJTEFCTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5TVVBQT1JURURfT05fREVWSUNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXN5bmNVcGRhdGUoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImhhc0FzeW5jVXBkYXRlIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUHVibGljU2xpY2UoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImlzUHVibGljU2xpY2UiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uUmVzdW1lIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25QYXVzZSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25EZXN0b3J5Iik7Ci0gICAgICAgIG1DYWxsYmFja3NSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChtTWFuYWdlciAhPSBudWxsKQotICAgICAgICAgICAgbU1hbmFnZXIuZ2V0RXZlbnRNYW5hZ2VyKCkudW5yZWdpc3RlckNhbGxiYWNrKHRoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbHVldG9vdGhCcm9hZGNhc3RQaW5Db250cm9sbGVyLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoQnJvYWRjYXN0UGluQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDBkOTQxLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbHVldG9vdGhCcm9hZGNhc3RQaW5Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3MuYmx1ZXRvb3RoOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuc2V0dGluZ3MuU2V0dGluZ3NFbnVtczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhCcm9hZGNhc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkeC5wcmVmZXJlbmNlLlByZWZlcmVuY2U7Ci1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZHguZnJhZ21lbnQuYXBwLkZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5CbHVldG9vdGhDYWxsYmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQmx1ZXRvb3RoVXRpbHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkJyb2FkY2FzdFByb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5SZXN0cmljdGVkUHJlZmVyZW5jZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5jb3JlLkJhc2VQcmVmZXJlbmNlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5jb3JlLlByZWZlcmVuY2VDb250cm9sbGVyTWl4aW47Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3Mub3ZlcmxheS5GZWF0dXJlRmFjdG9yeTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5jb3JlLmluc3RydW1lbnRhdGlvbi5NZXRyaWNzRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmNvcmUubGlmZWN5Y2xlLmV2ZW50cy5PbkRlc3Ryb3k7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIud2lkZ2V0LkxheW91dFByZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvcmUuaW5zdHJ1bWVudGF0aW9uLkluc3RydW1lbnRlZERpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uS2VlcDsKLQotLyoqCi0gKiBDb250cm9sbGVyIHRoYXQgc2hvd3MgUGluIGZvciBCTEUgQnJvYWRjYXN0IEF1ZGlvCi0gKi8KLUBLZWVwCi1wdWJsaWMgY2xhc3MgQmx1ZXRvb3RoQnJvYWRjYXN0UGluQ29udHJvbGxlciBleHRlbmRzIEJhc2VQcmVmZXJlbmNlQ29udHJvbGxlcgotICAgIGltcGxlbWVudHMgT25EZXN0cm95LCBCbHVldG9vdGhDYWxsYmFjayB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEJyb2FkY2FzdFBpbkNvbnRyb2xsZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9BVURJT19NQVNLID0gMHgwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFVE9PVEhfTEVfQVVESU9fTUFTS19QUk9QID0gInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQuYWR2X2F1ZGlvX21hc2siOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9CUk9BRENBU1RfQVVESU9fUElOID0gImJsdWV0b290aF9zY3JlZW5fYnJvYWRjYXN0X3Bpbl9jb25maWd1cmUiOwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1CbHVldG9vdGhBZGFwdGVyOwotICAgIHByaXZhdGUgRnJhZ21lbnQgbUZyYWdtZW50ID0gbnVsbDsKLSAgICBwcml2YXRlIE1ldHJpY3NGZWF0dXJlUHJvdmlkZXIgbU1ldHJpY3NGZWF0dXJlUHJvdmlkZXI7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgUmVzdHJpY3RlZFByZWZlcmVuY2UgbVByZWZlcmVuY2U7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmx1ZXRvb3RoTGVCcm9hZGNhc3RBdWRpb1N1cHBvcnRlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FsbGJhY2tzUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgTG9jYWxCbHVldG9vdGhNYW5hZ2VyIG1NYW5hZ2VyID0gbnVsbDsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBvbkJyb2FkY2FzdEtleUdlbmVyYXRlZCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBCbHVldG9vdGhCcm9hZGNhc3RQaW5Db250cm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBLRVlfQlJPQURDQVNUX0FVRElPX1BJTik7Ci0gICAgICAgIGludCBsZUF1ZGlvTWFzayA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KEJMVUVUT09USF9MRV9BVURJT19NQVNLX1BST1AsIDApOwotICAgICAgICBpc0JsdWV0b290aExlQnJvYWRjYXN0QXVkaW9TdXBwb3J0ZWQgPSAoKGxlQXVkaW9NYXNrICYgQlJPQURDQVNUX0FVRElPX01BU0spID09IEJST0FEQ0FTVF9BVURJT19NQVNLKTsKLSAgICAgICAgTG9nLmQoVEFHLCAiQ29uc3RydWN0b3IoKSIpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIGlmKGlzQmx1ZXRvb3RoTGVCcm9hZGNhc3RBdWRpb1N1cHBvcnRlZCkgewotICAgICAgICAgIG1NYW5hZ2VyID0gVXRpbHMuZ2V0TG9jYWxCdE1hbmFnZXIoY29udGV4dCk7Ci0gICAgICAgICAgaWYgKCFtQ2FsbGJhY2tzUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWdpc3RlcmluZyBFdmVudE1hbmFnZXIgY2FsbGJhY2tzIik7Ci0gICAgICAgICAgICAgIG1DYWxsYmFja3NSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgbU1hbmFnZXIuZ2V0RXZlbnRNYW5hZ2VyKCkucmVnaXN0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQmx1ZXRvb3RoQnJvYWRjYXN0UGluQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQsIFByZWZlcmVuY2VGcmFnbWVudENvbXBhdCBmcmFnbWVudCwgU3RyaW5nIHByZWZLZXkpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgS0VZX0JST0FEQ0FTVF9BVURJT19QSU4pOwotICAgICAgICBMb2cuZChUQUcsICJQaW5Db250cm9sbGVyKCkiICsgcHJlZktleSk7Ci0gICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OwotICAgICAgICBtTWV0cmljc0ZlYXR1cmVQcm92aWRlciA9IEZlYXR1cmVGYWN0b3J5LmdldEZhY3RvcnkoY29udGV4dCkuZ2V0TWV0cmljc0ZlYXR1cmVQcm92aWRlcigpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KSB7Ci0gICAgICAgIExvZy5kKFRBRywgInNldEZyYWdtZW50Iik7Ci0gICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0QXZhaWxhYmlsaXR5U3RhdHVzKCkgewotICAgICAgICBMb2cuZChUQUcsICJnZXRBdmFpbGFiaWxpdHlTdGF0dXMiKTsKLSAgICAgICAgaWYoaXNCbHVldG9vdGhMZUJyb2FkY2FzdEF1ZGlvU3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVZBSUxBQkxFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFVOU1VQUE9SVEVEX09OX0RFVklDRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZUtleSgpIHsKLSAgICAgICAgcmV0dXJuIEtFWV9CUk9BRENBU1RfQVVESU9fUElOOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3BsYXlQcmVmZXJlbmNlKFByZWZlcmVuY2VTY3JlZW4gc2NyZWVuKSB7Ci0gICAgICAgIHN1cGVyLmRpc3BsYXlQcmVmZXJlbmNlKHNjcmVlbik7Ci0gICAgICAgIExvZy5kKFRBRywgImRpc3BsYXlQcmVmZXJlbmNlIik7Ci0gICAgICAgIG1QcmVmZXJlbmNlID0gc2NyZWVuLmZpbmRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VLZXkoKSk7Ci0gICAgICAgIGlmKGlzQmx1ZXRvb3RoTGVCcm9hZGNhc3RBdWRpb1N1cHBvcnRlZCkgewotICAgICAgICAgIG9uQnJvYWRjYXN0S2V5R2VuZXJhdGVkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbVByZWZlcmVuY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVQcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewotICAgICAgICBMb2cuZChUQUcsICJQaW5Db250cm9sbGVyOiBoYW5kbGVQcmVmZXJlbmNlVHJlZUNsaWNrIik7Ci0gICAgICAgIGlmIChLRVlfQlJPQURDQVNUX0FVRElPX1BJTi5lcXVhbHMocHJlZmVyZW5jZS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlBpbkNvbnRyb2xsZXI6IGhhbmRsZVByZWZlcmVuY2VUcmVlQ2xpY2sgdHJ1ZSIpOwotICAgICAgICAgICAgbmV3IEJsdWV0b290aEJyb2FkY2FzdFBpbkZyYWdtZW50KCkKLQkJLnNob3cobUZyYWdtZW50LmdldEZyYWdtZW50TWFuYWdlcigpLCAiUGluRnJhZ21lbnQiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2VkKGludCBuZXdCdFN0YXRlKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2VkIiArIEludGVnZXIudG9TdHJpbmcobmV3QnRTdGF0ZSkpOwotICAgICAgICBpbnQgZGVsYXkgPSAwOwotICAgICAgICBzd2l0Y2ggKG5ld0J0U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTjoKLSAgICAgICAgICAgICAgZGVsYXkgPSAyMDA7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGOgotICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtUnVubmFibGUsIGRlbGF5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydEJ5dGVzVG9TdHJpbmcoYnl0ZVtdIHBpbikgewotICAgICAgICBpZiAocGluLmxlbmd0aCAhPSAxNikgewotICAgICAgICAgICBMb2cuZSAoVEFHLCAiTm90IDE2IGJ5dGVzICsrKysrKysrKysrKyIpOwotICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVsxNl07Ci0gICAgICAgIGludCBpID0gMCwgaiA9IDA7Ci0gICAgICAgIC8vIFJldmVyc2UgdGhlIHBpbiBhbmQgZGlzY2FyZCB0aGUgcGFkZGluZwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgaWYgKHBpblsxNS1pXSA9PSAwKSBicmVhazsKLSAgICAgICAgICAgIHRlbXBbaisrXSA9IHBpblsxNS1pXTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgc3RyOwotICAgICAgICBpZiAoaiA9PSAwKQotICAgICAgICAgICBzdHIgPSBuZXcgU3RyaW5nKCIiKTsgLy8gdW5lbmNyeXB0ZWQKLSAgICAgICAgZWxzZQotICAgICAgICAgICBzdHIgPSBuZXcgU3RyaW5nKEFycmF5cy5jb3B5T2ZSYW5nZSh0ZW1wLDAsaiksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwotICAgICAgICBMb2cuZChUQUcsICJQaW46ICIgKyBzdHIpOwotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnJvYWRjYXN0S2V5R2VuZXJhdGVkKCkgewotICAgICAgICBMb2cuZChUQUcsICJvbkJyb2FkY2FzdEtleUdlbmVyYXRlZCIpOwotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9ICJCcm9hZGNhc3QgY29kZTogIjsKLSAgICAgICAgU3RyaW5nIGtleVN0ciA9ICJVbmF2YWlsYWJsZSI7Ci0KLSAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIExvY2FsQmx1ZXRvb3RoUHJvZmlsZU1hbmFnZXIgcHJvZmlsZU1hbmFnZXIgPSBtTWFuYWdlci5nZXRQcm9maWxlTWFuYWdlcigpOwotICAgICAgICBCcm9hZGNhc3RQcm9maWxlIGJhcFByb2ZpbGUgPSAoQnJvYWRjYXN0UHJvZmlsZSkgcHJvZmlsZU1hbmFnZXIuZ2V0QnJvYWRjYXN0UHJvZmlsZSgpOwotICAgICAgICBpZiAoKG1CbHVldG9vdGhBZGFwdGVyLmdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgJiYKLSAgICAgICAgICAgIChiYXBQcm9maWxlLmlzUHJvZmlsZVJlYWR5KCkpKSB7Ci0gICAgICAgICAgYnl0ZVtdIGtleSA9IGJhcFByb2ZpbGUuZ2V0RW5jcnlwdGlvbktleSgpOwotICAgICAgICAgIC8vIEtleSBjYW4gb25seSBiZSAxNiBieXRlIGxvbmcKLSAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PSAxNikgewotICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpPGtleS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicGluKCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGkpICsgIik6ICIgKyBTdHJpbmcuZm9ybWF0KCIlMDJYIiwga2V5W2ldKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAga2V5U3RyID0gY29udmVydEJ5dGVzVG9TdHJpbmcoa2V5KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGtleVN0ci5lcXVhbHMoIiIpKSBzdW1tYXJ5ID0gIk5vIEJyb2FkY2FzdCBjb2RlIjsKLSAgICAgICAgICBtUHJlZmVyZW5jZS5zZXRTdW1tYXJ5KHN1bW1hcnkgKyBrZXlTdHIpOwotICAgICAgICAgIG1QcmVmZXJlbmNlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgaWYgKGtleVN0ci5lcXVhbHMoIlVuYXZhaWxhYmxlIikpIHsKLSAgICAgICAgICAgIG1QcmVmZXJlbmNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJlZmVyZW5jZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtUHJlZmVyZW5jZS5zZXRTdW1tYXJ5KHN1bW1hcnkgKyBrZXlTdHIpOwotICAgICAgICAgIG1QcmVmZXJlbmNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICBMb2cuZChUQUcsICJvbkRlc3RvcnkiKTsKLSAgICAgICAgbUNhbGxiYWNrc1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1NYW5hZ2VyICE9IG51bGwpCi0gICAgICAgICAgICBtTWFuYWdlci5nZXRFdmVudE1hbmFnZXIoKS51bnJlZ2lzdGVyQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aEJyb2FkY2FzdFBpbkZyYWdtZW50LmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoQnJvYWRjYXN0UGluRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MDY4Yi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoQnJvYWRjYXN0UGluRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXA7Ci0KLWltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGFuZHJvaWR4LmFwcGNvbXBhdC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZHguZnJhZ21lbnQuYXBwLkZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWR4LmZyYWdtZW50LmFwcC5GcmFnbWVudEFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWR4LmZyYWdtZW50LmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZHguZnJhZ21lbnQuYXBwLkRpYWxvZ0ZyYWdtZW50OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuc2V0dGluZ3MuU2V0dGluZ3NFbnVtczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvcmUuaW5zdHJ1bWVudGF0aW9uLkluc3RydW1lbnRlZERpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmJsdWV0b290aC5CbHVldG9vdGhCcm9hZGNhc3RFbmFibGVDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5CbHVldG9vdGhVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQnJvYWRjYXN0UHJvZmlsZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguTG9jYWxCbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIERpYWxvZyBmcmFnbWVudCBmb3IgcmVuYW1pbmcgYSBCbHVldG9vdGggZGV2aWNlLgotICovCi1wdWJsaWMgY2xhc3MgQmx1ZXRvb3RoQnJvYWRjYXN0UGluRnJhZ21lbnQgZXh0ZW5kcyBJbnN0cnVtZW50ZWREaWFsb2dGcmFnbWVudAotICAgICAgICBpbXBsZW1lbnRzIFJhZGlvR3JvdXAuT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBCbHVldG9vdGhCcm9hZGNhc3RQaW5GcmFnbWVudCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAibmV3SW5zdGFuY2UiKTsKLSAgICAgICAgQmx1ZXRvb3RoQnJvYWRjYXN0UGluRnJhZ21lbnQgZnJhZyA9IG5ldyBCbHVldG9vdGhCcm9hZGNhc3RQaW5GcmFnbWVudCgpOwotICAgICAgICByZXR1cm4gZnJhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoQnJvYWRjYXN0UGluRnJhZ21lbnQiOwotCi0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIEFsZXJ0RGlhbG9nIG1BbGVydERpYWxvZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCdXR0b24gbU9rQnV0dG9uID0gbnVsbDsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1DdXJyZW50UGluVmlldzsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50UGluID0gIjQzMDgiOwotICAgIHByaXZhdGUgaW50IG1Vc2VyU2VsZWN0ZWRQaW5Db25maWd1cmF0aW9uID0gLTE7Ci0KLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVJhZGlvQnV0dG9uSWRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJhZGlvQnV0dG9uU3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RGlhbG9nVGl0bGUoKSB7Ci0gICAgICAgcmV0dXJuIFIuc3RyaW5nLmJsdWV0b290aF9icm9hZGNhc3RfcGluX2NvbmZpZ3VyZV9kaWFsb2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBpbkNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVBpbkNvbmZpZ3VyYXRpb24gd2l0aCAiICsgSW50ZWdlci50b1N0cmluZyhtVXNlclNlbGVjdGVkUGluQ29uZmlndXJhdGlvbikpOwotICAgICAgICBpZiAobVVzZXJTZWxlY3RlZFBpbkNvbmZpZ3VyYXRpb24gPT0gLTEpIHsKLSAgICAgICAgICBMb2cuZShUQUcsICJubyBwaW4gc2VsZWN0ZWQiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2FsbCBsb3dlciBsYXllciB0byBnZW5lcmF0ZSBuZXcgcGluCi0gICAgICAgIExvY2FsQmx1ZXRvb3RoTWFuYWdlciBtTWFuYWdlciA9IFV0aWxzLmdldExvY2FsQnRNYW5hZ2VyKG1Db250ZXh0KTsKLSAgICAgICAgTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlciBwcm9maWxlTWFuYWdlciA9IG1NYW5hZ2VyLmdldFByb2ZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgIEJyb2FkY2FzdFByb2ZpbGUgYmFwUHJvZmlsZSA9IChCcm9hZGNhc3RQcm9maWxlKSBwcm9maWxlTWFuYWdlci5nZXRCcm9hZGNhc3RQcm9maWxlKCk7Ci0gICAgICAgIGlmIChtVXNlclNlbGVjdGVkUGluQ29uZmlndXJhdGlvbiAhPSAwKQotICAgICAgICAgICBiYXBQcm9maWxlLnNldEVuY3J5cHRpb24odHJ1ZSwgbVVzZXJTZWxlY3RlZFBpbkNvbmZpZ3VyYXRpb24sIGZhbHNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBiYXBQcm9maWxlLnNldEVuY3J5cHRpb24oZmFsc2UsIG1Vc2VyU2VsZWN0ZWRQaW5Db25maWd1cmF0aW9uLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2goQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIExvZy5kKFRBRywgIm9uQXR0YWNoIik7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoKGNvbnRleHQpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBMb2cuZChUQUcsICJvbkNyZWF0ZSIpOwotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25BY3Rpdml0eUNyZWF0ZWQiKTsKLSAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgLy9EaWFsb2cgbURpYWxvZyA9IG9uQ3JlYXRlRGlhbG9nKG5ldyBCdW5kbGUoKSk7Ci0gICAgICAgIC8vdGhpcy5zaG93KHRoaXMuZ2V0QWN0aXZpdHkoKS5nZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCksICJQaW5GcmFnbWVudCIpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICAgICAgTG9nLmUoVEFHLCAic2hvdyIpOwotICAgICAgICB0aGlzLnNob3codGhpcy5nZXRBY3Rpdml0eSgpLmdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKSwgIlBpbkZyYWdtZW50Iik7Ci0gICAgfQotICAgICovCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgLy9TdHJpbmcgZGV2aWNlTmFtZSA9IGdldERldmljZU5hbWUoKTsKLSAgICAgICAgTG9nLmQoVEFHLCAib25DcmVhdGVEaWFsb2cgLSBlbnRlciIpOwotICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0QWN0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICAuc2V0VGl0bGUoZ2V0RGlhbG9nVGl0bGUoKSkKLSAgICAgICAgICAgICAgICAuc2V0VmlldyhjcmVhdGVEaWFsb2dWaWV3KCkpCi0gICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLm9rYXksIChkaWFsb2csIHdoaWNoKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2V0RGV2aWNlTmFtZShtRGV2aWNlTmFtZVZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGluQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgLnNldE5lZ2F0aXZlQnV0dG9uKGFuZHJvaWQuUi5zdHJpbmcuY2FuY2VsLCBudWxsKTsKLSAgICAgICAgbUFsZXJ0RGlhbG9nID0gYnVpbGRlci5jcmVhdGUoKTsKLSAgICAgICAgTG9nLmQoVEFHLCAib25DcmVhdGVEaWFsb2cgLSBleGl0Iik7Ci0gICAgICAgIHJldHVybiBtQWxlcnREaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNZXRyaWNzQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiBTZXR0aW5nc0VudW1zLkJMVUVUT09USF9GUkFHTUVOVDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewotICAgICAgICBMb2cuZChUQUcsICJvblNhdmVJbnN0YW5jZVN0YXRlIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UmFkaW9CdXR0b25Hcm91cElkKCkgewotICAgICAgICByZXR1cm4gUi5pZC5ibHVldG9vdGhfYnJvYWRjYXN0X3Bpbl9jb25maWdfcmFkaW9fZ3JvdXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRQaW4oU3RyaW5nIHBpbikgewotICAgICAgICBtQ3VycmVudFBpbiA9IHBpbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50UGluKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRQaW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DaGVja2VkQ2hhbmdlZChSYWRpb0dyb3VwIGdyb3VwLCBpbnQgY2hlY2tlZElkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgIkluZGV4IGNoYW5nZWQgdG8gIiArIGNoZWNrZWRJZCk7Ci0gICAgICAgIC8vIHJhZGlvQnV0dG9uID0gKFJhZGlvQnV0dG9uKSB2aWV3LmZpbmRWaWV3QnlJZChjaGVja2VkSWQpOwotICAgICAgICBpbnQgaW5kZXggPSBtUmFkaW9CdXR0b25JZHMuaW5kZXhPZihjaGVja2VkSWQpOwotICAgICAgICBMb2cuZChUQUcsICJpbmRleCIpOwotICAgICAgICBTdHJpbmdbXSBzdHJpbmdBcnJheVZhbHVlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICBSLmFycmF5LmJsdWV0b290aF9icm9hZGNhc3RfcGluX2NvbmZpZ192YWx1ZXMpOwotICAgICAgICBtVXNlclNlbGVjdGVkUGluQ29uZmlndXJhdGlvbiA9IEludGVnZXIucGFyc2VJbnQoc3RyaW5nQXJyYXlWYWx1ZXNbaW5kZXhdKTsKLSAgICAgICAgTG9nLmQoVEFHLCAiU2VsZWN0ZWQgUGluIENvbmZpZ3VyYXRpb24gIiArIEludGVnZXIudG9TdHJpbmcobVVzZXJTZWxlY3RlZFBpbkNvbmZpZ3VyYXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcgY3JlYXRlRGlhbG9nVmlldygpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25DcmVhdGVEaWFsb2dWaWV3IC0gZW50ZXIiKTsKLSAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0QWN0aXZpdHkoKQotICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgIFZpZXcgdmlldyA9IGxheW91dEluZmxhdGVyLmluZmxhdGUoUi54bWwuYmx1ZXRvb3RoX2Jyb2FkY2FzdF9waW5fY29uZmlnLCBudWxsKTsKLQotICAgICAgICBmaW5hbCBSYWRpb0dyb3VwIHJhZGlvR3JvdXAgPSAoUmFkaW9Hcm91cCkgdmlldy5maW5kVmlld0J5SWQoZ2V0UmFkaW9CdXR0b25Hcm91cElkKCkpOwotICAgICAgICBpZiAocmFkaW9Hcm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZSAoVEFHLCAiTm90IGFibGUgdG8gZmluZCBSYWRpb0dyb3VwIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByYWRpb0dyb3VwLmNsZWFyQ2hlY2soKTsKLSAgICAgICAgcmFkaW9Hcm91cC5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICAvLyBGaWxsIHVwIHRoZSBSYWRpbyBHcm91cAotICAgICAgICBtUmFkaW9CdXR0b25JZHMuYWRkKFIuaWQuYmx1ZXRvb3RoX2Jyb2FkY2FzdF9waW5fdW5lbmNyeXB0ZWQpOwotICAgICAgICBtUmFkaW9CdXR0b25JZHMuYWRkKFIuaWQuYmx1ZXRvb3RoX2Jyb2FkY2FzdF9waW5fNCk7Ci0gICAgICAgIG1SYWRpb0J1dHRvbklkcy5hZGQoUi5pZC5ibHVldG9vdGhfYnJvYWRjYXN0X3Bpbl8xNik7Ci0gICAgICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgIFIuYXJyYXkuYmx1ZXRvb3RoX2Jyb2FkY2FzdF9waW5fY29uZmlnX3RpdGxlcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1SYWRpb0J1dHRvblN0cmluZ3MuYWRkKHN0cmluZ0FycmF5W2ldKTsKLSAgICAgICAgfQotICAgICAgICBSYWRpb0J1dHRvbiByYWRpb0J1dHRvbjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUmFkaW9CdXR0b25TdHJpbmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICByYWRpb0J1dHRvbiA9IChSYWRpb0J1dHRvbikgdmlldy5maW5kVmlld0J5SWQobVJhZGlvQnV0dG9uSWRzLmdldChpKSk7Ci0gICAgICAgICAgICBpZiAocmFkaW9CdXR0b24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBzaG93IGRpYWxvZyBieSBubyByYWRpbyBidXR0b246IiArIG1SYWRpb0J1dHRvbklkcy5nZXQoaSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmFkaW9CdXR0b24uc2V0VGV4dChtUmFkaW9CdXR0b25TdHJpbmdzLmdldChpKSk7Ci0gICAgICAgICAgICByYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQaW5WaWV3ID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmJsdWV0b290aF9icm9hZGNhc3RfY3VycmVudF9waW4pOwotICAgICAgICAvL21DdXJyZW50UGluVmlldy5zZXRUZXh0KCJDdXJyZW50IFBpbiBpcyAiICsgZ2V0Q3VycmVudFBpbigpKTsKLSAgICAgICAgTG9nLmQoVEFHLCAib25DcmVhdGVEaWFsb2dWaWV3IC0gZXhpdCIpOwotICAgICAgICByZXR1cm4gdmlldzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7Ci0gICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOwotICAgICAgICBMb2cuZChUQUcsICJvbkRlc3Ryb3kiKTsKLSAgICAgICAgbUFsZXJ0RGlhbG9nID0gbnVsbDsKLSAgICAgICAgbU9rQnV0dG9uID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQaW5WaWV3ID0gbnVsbDsKLSAgICAgICAgbVJhZGlvQnV0dG9uSWRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1SYWRpb0J1dHRvblN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbVVzZXJTZWxlY3RlZFBpbkNvbmZpZ3VyYXRpb24gPSAtMTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgTG9nLmQoVEFHLCAib25SZXN1bWUiKTsKLSAgICAgICAgaWYgKG1Pa0J1dHRvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUFsZXJ0RGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtT2tCdXR0b24gPSBtQWxlcnREaWFsb2cuZ2V0QnV0dG9uKERpYWxvZ0ludGVyZmFjZS5CVVRUT05fUE9TSVRJVkUpOwotICAgICAgICAgICAgICAgIG1Pa0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblJlc3VtZTogbUFsZXJ0RGlhbG9nIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9CbHVldG9vdGhCcm9hZGNhc3RTb3VyY2VJbmZvRW50cmllcy5qYXZhIGIvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aEJyb2FkY2FzdFNvdXJjZUluZm9FbnRyaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGQ5YjcuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aEJyb2FkY2FzdFNvdXJjZUluZm9FbnRyaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICpDb3B5cmlnaHQgKGMpIDIwMTgsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZHgucHJlZmVyZW5jZS5QcmVmZXJlbmNlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuZGFzaGJvYXJkLkRhc2hib2FyZEZyYWdtZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5DYWNoZWRCbHVldG9vdGhEZXZpY2U7Ci0KLS8qKgotICogTWFpbnRhaW4gYW5kIHVwZGF0ZSBzYXZlZCBibHVldG9vdGggZGV2aWNlcyhib25kZWQgYnV0IG5vdCBjb25uZWN0ZWQpCi0gKi8KLXB1YmxpYyBjbGFzcyBCbHVldG9vdGhCcm9hZGNhc3RTb3VyY2VJbmZvRW50cmllcyBleHRlbmRzIEJsZUJyb2FkY2FzdFNvdXJjZUluZm9VcGRhdGVyCi0gICAgICAgIGltcGxlbWVudHMgUHJlZmVyZW5jZS5PblByZWZlcmVuY2VDbGlja0xpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEJyb2FkY2FzdFNvdXJjZUluZm9FbnRyaWVzIjsKLQotCi0gICAgcHVibGljIEJsdWV0b290aEJyb2FkY2FzdFNvdXJjZUluZm9FbnRyaWVzKENvbnRleHQgY29udGV4dCwgRGFzaGJvYXJkRnJhZ21lbnQgZnJhZ21lbnQsCi0gICAgICAgICAgICBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZUNhbGxiYWNrIGJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlQ2FsbGJhY2ssCi0gICAgICAgICAgICBDYWNoZWRCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGZyYWdtZW50LCBibGVCcm9hZGNhc3RTb3VyY2VJbmZvUHJlZmVyZW5jZUNhbGxiYWNrLCBkZXZpY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZUNsaWNrKFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewotICAgICAgICBmaW5hbCBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvIHNyY0luZm8gPSAoKEJsZUJyb2FkY2FzdFNvdXJjZUluZm9QcmVmZXJlbmNlKSBwcmVmZXJlbmNlKQotICAgICAgICAgICAgICAgIC5nZXRCbGVCcm9hZGNhc3RTb3VyY2VJbmZvKCk7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAib25QcmVmZXJlbmNlQ2xpY2s6ICIgKyBzcmNJbmZvKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aERldGFpbHNBZGRTb3VyY2VCdXR0b25Db250cm9sbGVyLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoRGV0YWlsc0FkZFNvdXJjZUJ1dHRvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2YmMxYi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoRGV0YWlsc0FkZFNvdXJjZUJ1dHRvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLQotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50Q29tcGF0OwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkNhY2hlZEJsdWV0b290aERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5jb3JlLmxpZmVjeWNsZS5MaWZlY3ljbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIud2lkZ2V0LkFjdGlvbkJ1dHRvbnNQcmVmZXJlbmNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5CQ1Byb2ZpbGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLmNvcmUuU3ViU2V0dGluZ0xhdW5jaGVyOwotaW1wb3J0IGFuZHJvaWQuYXBwLnNldHRpbmdzLlNldHRpbmdzRW51bXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLS8qKgotICogVGhpcyBjbGFzcyBhZGRzIHR3byBidXR0b25zOiBvbmUgdG8gY29ubmVjdC9kaXNjb25uZWN0IGZyb20gYSBkZXZpY2UgKGRlcGVuZGluZyBvbiB0aGUgY3VycmVudAotICogY29ubmVjdGVkIHN0YXRlKSwgYW5kIG9uZSB0byAiU2VhcmNoIGZvciBMRSBhdWRpbyBCcm9hZGNhc3Qgc291cmNlcyIgYXJvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgQmx1ZXRvb3RoRGV0YWlsc0FkZFNvdXJjZUJ1dHRvbkNvbnRyb2xsZXIgZXh0ZW5kcyBCbHVldG9vdGhEZXRhaWxzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBDYWNoZWRCbHVldG9vdGhEZXZpY2UuQ2FsbGJhY2sgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSU9OX0JVVFRPTlMgPSAic3luY19oZWxwZXJfYnV0dG9ucyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhEZXRhaWxzQWRkU291cmNlQnV0dG9uQ29udHJvbGxlciI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3RlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBBY3Rpb25CdXR0b25zUHJlZmVyZW5jZSBtQWN0aW9uQnV0dG9uczsKLSAgICBwcm90ZWN0ZWQgTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlciBtUHJvZmlsZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBMb2NhbEJsdWV0b290aE1hbmFnZXIgbUxvY2FsQmx1ZXRvb3RoTWFuYWdlcjsKLSAgICBwcml2YXRlICBCQ1Byb2ZpbGUgbUJDUHJvZmlsZSA9IG51bGw7Ci0KLQotICAgIHB1YmxpYyBCbHVldG9vdGhEZXRhaWxzQWRkU291cmNlQnV0dG9uQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQsIFByZWZlcmVuY2VGcmFnbWVudENvbXBhdCBmcmFnbWVudCwKLSAgICAgICAgICAgIENhY2hlZEJsdWV0b290aERldmljZSBkZXZpY2UsIExpZmVjeWNsZSBsaWZlY3ljbGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgZnJhZ21lbnQsIGRldmljZSwgbGlmZWN5Y2xlKTsKLSAgICAgICAgZGV2aWNlLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcyk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25BZGRMRVNvdXJjZVByZXNzZWQoKSB7Ci0gICAgICAgICBmaW5hbCBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgIGFyZ3MucHV0U3RyaW5nKEJsdWV0b290aFNBRGV0YWlsLktFWV9ERVZJQ0VfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgbUNhY2hlZERldmljZS5nZXREZXZpY2UoKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgYXJncy5wdXRTaG9ydChCbHVldG9vdGhTQURldGFpbC5LRVlfR1JPVVBfT1AsCi0gICAgICAgICAgICAgICAgIChzaG9ydCkwKTsKLQotICAgICAgICBuZXcgU3ViU2V0dGluZ0xhdW5jaGVyKG1Db250ZXh0KQotICAgICAgICAgICAgICAgIC5zZXREZXN0aW5hdGlvbihCbHVldG9vdGhTQURldGFpbC5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLnNldEFyZ3VtZW50cyhhcmdzKQotICAgICAgICAgICAgICAgIC5zZXRUaXRsZVJlcyhSLnN0cmluZy5ibHVldG9vdGhfc2VhcmNoX2Jyb2FkY2FzdGVycykKLSAgICAgICAgICAgICAgICAuc2V0U291cmNlTWV0cmljc0NhdGVnb3J5KFNldHRpbmdzRW51bXMuQkxVRVRPT1RIX0RFVklDRV9QSUNLRVIpCi0gICAgICAgICAgICAgICAgIC5sYXVuY2goKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldmljZUF0dHJpYnV0ZXNDaGFuZ2VkKCkgewotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdChQcmVmZXJlbmNlU2NyZWVuIHNjcmVlbikgewotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgImluaXQiKTsKLSAgICAgICAgbUxvY2FsQmx1ZXRvb3RoTWFuYWdlciA9IFV0aWxzLmdldExvY2FsQnRNYW5hZ2VyKG1Db250ZXh0KTsKLSAgICAgICAgbVByb2ZpbGVNYW5hZ2VyID0gbUxvY2FsQmx1ZXRvb3RoTWFuYWdlci5nZXRQcm9maWxlTWFuYWdlcigpOwotICAgICAgICBtQkNQcm9maWxlID0gKEJDUHJvZmlsZSltUHJvZmlsZU1hbmFnZXIuZ2V0QkNQcm9maWxlKCk7Ci0KLSAgICAgICAgbUFjdGlvbkJ1dHRvbnMgPSAoKEFjdGlvbkJ1dHRvbnNQcmVmZXJlbmNlKSBzY3JlZW4uZmluZFByZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgZ2V0UHJlZmVyZW5jZUtleSgpKSkKLSAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMVRleHQoUi5zdHJpbmcuYWRkX3NvdXJjZV9idXR0b25fdGV4dCkKLSAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMUljb24oUi5kcmF3YWJsZS5pY19hZGRfMjRkcCkKLSAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMU9uQ2xpY2tMaXN0ZW5lcigodmlldykgLT4gb25BZGRMRVNvdXJjZVByZXNzZWQoKSkKLSAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMUVuYWJsZWQoZmFsc2UpCi0gICAgICAgICAgICAgICAgOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAicmVmcmVzaCIpOwotICAgICAgICBpZiAobUJDUHJvZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSXNDb25uZWN0ZWQgPSBtQkNQcm9maWxlLmdldENvbm5lY3Rpb25TdGF0dXMobUNhY2hlZERldmljZS5nZXREZXZpY2UoKSkgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RlZCkgewotICAgICAgICAgICAgbUFjdGlvbkJ1dHRvbnMKLSAgICAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJCYXNzIGlzIG5vdCBjb25uZWN0ZWQgZm9yIHRoc2kgZGV2aWNlPj4iKTsKLSAgICAgICAgICAgICBtQWN0aW9uQnV0dG9ucwotICAgICAgICAgICAgICAgICAgICAuc2V0QnV0dG9uMUVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmZXJlbmNlS2V5KCkgewotICAgICAgICByZXR1cm4gS0VZX0FDVElPTl9CVVRUT05TOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0JsdWV0b290aFNBRGV0YWlsLmphdmEgYi9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoU0FEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0MzMyYy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9wYWNrYWdlcy9hcHBzL1NldHRpbmdzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5ncy9ibHVldG9vdGgvQmx1ZXRvb3RoU0FEZXRhaWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlci5ESVNBTExPV19DT05GSUdfQkxVRVRPT1RIOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuc2V0dGluZ3MuU2V0dGluZ3NFbnVtczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoTWFuYWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGgubGUuU2NhblJlY29yZDsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLQotaW1wb3J0IGFuZHJvaWR4LmFwcGNvbXBhdC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3MuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlRmlsdGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5DYWNoZWRCbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLlZlbmRvckNhY2hlZEJsdWV0b290aERldmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5ibHVldG9vdGguQkNQcm9maWxlOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbGVCcm9hZGNhc3RTb3VyY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5zZWFyY2guSW5kZXhhYmxlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLndpZGdldC5Gb290ZXJQcmVmZXJlbmNlOwotaW1wb3J0IGFuZHJvaWR4LnByZWZlcmVuY2UuUHJlZmVyZW5jZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLnRleHQuQmlkaUZvcm1hdHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tlZFRleHRWaWV3OwotCi0vKioKLSAqIEJsdWV0b290aFNBRGV0YWlsIGlzIGEgcGFnZSB0byBzY2FuIGJsdWV0b290aCBkZXZpY2VzIGFuZCBwYWlyIHRoZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBCbHVldG9vdGhTQURldGFpbCBleHRlbmRzIERldmljZUxpc3RQcmVmZXJlbmNlRnJhZ21lbnQgaW1wbGVtZW50cwotICAgICAgICBJbmRleGFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoU0FEZXRhaWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfQUREUkVTUyA9ICJkZXZpY2VfYWRkcmVzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dST1VQX09QID0gImdyb3VwX29wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVkFJTF9MRV9BVURJT19TT1VSQ0VTID0gImF2YWlsYWJsZV9hdWRpb19zb3VyY2VzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GT09URVJfUFJFRiA9ICJmb290ZXJfcHJlZmVyZW5jZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FOX0RFTF9OQU1FID0gIlNjYW4gRGVsZWdhdG9yIjsKLQotICAgIEJsdWV0b290aFByb2dyZXNzQ2F0ZWdvcnkgbUF2YWlsYWJsZURldmljZXNDYXRlZ29yeTsKLSAgICBGb290ZXJQcmVmZXJlbmNlIG1Gb290ZXJQcmVmZXJlbmNlOwotCi0gICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtU2NhbkFzc2lzdERldGFpbHNEaWFsb2c7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsU2NhblN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBDYWNoZWRCbHVldG9vdGhEZXZpY2UgbUNhY2hlZERldmljZTsKLSAgICBQcmVmZXJlbmNlIG1TY2FuRGVsZWdhdG9yTmFtZTsKLSAgICBTdHJpbmcgbVN5bmNTdGF0ZTsKLSAgICBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RNYW5hZ2VyIG1TY2FuQXNzaXN0TWFuYWdlcjsKLSAgICBwcm90ZWN0ZWQgTG9jYWxCbHVldG9vdGhQcm9maWxlTWFuYWdlciBtUHJvZmlsZU1hbmFnZXI7Ci0gICAgU3RyaW5nIG1Ccm9hZGNhc3RDb2RlOwotICAgIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGNsaWNrZWREZXZpY2UgPSBudWxsOwotICAgIFN0cmluZyBtQnJvYWRjYXN0UGluQ29kZSA9IG51bGw7Ci0gICAgYm9vbGVhbiBtU2Nhbm5pbmcgPSB0cnVlOwotICAgIGJvb2xlYW4gbUdyb3VwT3BlcmF0aW9uID0gZmFsc2U7Ci0gICAgQWxlcnREaWFsb2cgbUNvbW1vbk1zZ0RpYWxvZyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCbHVldG9vdGhOYW1lKEJsdWV0b290aERldmljZSBkZXYpIHsKLSAgICAgICAgU3RyaW5nIGFsaWFzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChkZXYgPT0gbnVsbCkgewotICAgICAgICAgICAgYWxpYXNOYW1lID0gU0NBTl9ERUxfTkFNRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFsaWFzTmFtZSA9IGRldi5nZXRBbGlhcygpOwotICAgICAgICAgICAgYWxpYXNOYW1lID0gVGV4dFV0aWxzLmlzRW1wdHkoYWxpYXNOYW1lKSA/IGRldi5nZXRBZGRyZXNzKCkgOiBhbGlhc05hbWU7Ci0gICAgICAgICAgICBpZiAoYWxpYXNOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbGlhc05hbWUgPSBTQ0FOX0RFTF9OQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiZ2V0Qmx1ZXRvb3RoTmFtZSByZXR1cm5zIiArIGFsaWFzTmFtZSk7Ci0gICAgICAgIHJldHVybiBhbGlhc05hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U291cmNlU2VsZWN0aW9uRXJyTWVzc2FnZShpbnQgc3RhdHVzKSB7Ci0gICAgICAgIGludCBlcnJvck1lc3NhZ2UgPSBSLnN0cmluZy5ibHVldG9vdGhfc291cmNlX3NlbGVjdGlvbl9lcnJvcl9tZXNzYWdlOwotICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19DT0xPQ0FURURfU1JDX1VOQVZBSUxBQkxFOgotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19TT1VSQ0VfVU5BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9zZWxlY3Rpb25fZXJyb3Jfc3JjX3VuYXZhaWxfbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfU0VMRUNURUQ6Ci0gICAgICAgICAgICBjYXNlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX0lOVkFMSURfU09VUkNFX0lEOgotICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFIuc3RyaW5nLmJsdWV0b290aF9zb3VyY2Vfc2VsZWN0aW9uX2Vycm9yX21lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX0RVUExJQ0FURV9BRERJVElPTiA6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9kdXBfYWRkaXRpb25fZXJyb3JfbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfTk9fRU1QVFlfU0xPVCA6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9ub19lbXB0eV9zbG90X2Vycm9yX21lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTb3VyY2VBZGRpdGlvbkVyck1lc3NhZ2UoaW50IHN0YXR1cykgewotICAgICAgICBpbnQgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9hZGRpdGlvbl9lcnJvcl9tZXNzYWdlOwotICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19EVVBMSUNBVEVfQURESVRJT04gOgotICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFIuc3RyaW5nLmJsdWV0b290aF9zb3VyY2VfZHVwX2FkZGl0aW9uX2Vycm9yX21lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX05PX0VNUFRZX1NMT1QgOgotICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFIuc3RyaW5nLmJsdWV0b290aF9zb3VyY2Vfbm9fZW1wdHlfc2xvdF9lcnJvcl9tZXNzYWdlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U291cmNlUmVtb3ZhbEVyck1lc3NhZ2UoaW50IHN0YXR1cykgewotICAgICAgICBpbnQgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9yZW1vdmFsX2Vycm9yX21lc3NhZ2U7Ci0gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX0ZBVEFMIDoKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBSLnN0cmluZy5ibHVldG9vdGhfc291cmNlX3JlbW92YWxfZXJyb3JfbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9HUk9VUF9PUCA6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9yZW1vdmVfaW52YWxpZF9ncm91cF9vcDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfSUQgOgotICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFIuc3RyaW5nLmJsdWV0b290aF9zb3VyY2VfcmVtb3ZlX2ludmFsaWRfc3JjX2lkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U291cmNlVXBkYXRlRXJyTWVzc2FnZShpbnQgc3RhdHVzKSB7Ci0gICAgICAgIGludCBlcnJvck1lc3NhZ2UgPSBSLnN0cmluZy5ibHVldG9vdGhfc291cmNlX3VwZGF0ZV9lcnJvcl9tZXNzYWdlOwotICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19GQVRBTCA6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV91cGRhdGVfZXJyb3JfbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9HUk9VUF9PUCA6Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV91cGRhdGVfaW52YWxpZF9ncm91cF9vcDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfSU5WQUxJRF9TT1VSQ0VfSUQgOgotICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFIuc3RyaW5nLmJsdWV0b290aF9zb3VyY2VfdXBkYXRlX2ludmFsaWRfc3JjX2lkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotCi0gICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgbVNjYW5Bc3Npc3RDYWxsYmFjayA9IG5ldyBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjaygpIHsKLSAgICAgICAgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciBjb21tb25NZXNzYWdlTGlzdGVuZXIgPSBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIj4+T0sgY2xpY2tlZCIpOwotICAgICAgICAgICAgICAgICBpZiAobUNvbW1vbk1zZ0RpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICBtQ29tbW9uTXNnRGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0U291cmNlRm91bmQoU2NhblJlc3VsdCByZXMpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAib25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZCIgKyByZXMuZ2V0RGV2aWNlKCkpOwotCi0gICAgICAgICAgICBDYWNoZWRCbHVldG9vdGhEZXZpY2UgY2FjaGVkRGV2aWNlID0gbUxvY2FsTWFuYWdlci5nZXRDYWNoZWREZXZpY2VNYW5hZ2VyKCkuZmluZERldmljZShyZXMuZ2V0RGV2aWNlKCkpOwotCi0gICAgICAgICAgICBpZiAoY2FjaGVkRGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgInNlZW1zIGxpa2UgQ2FjaGVkRGV2aWNlIGVudHJ5IGFscmVhZHkgcHJlc2VudCBmb3IgdGhpcyBkZXZpY2UiKTsKLSAgICAgICAgICAgIH0gZWxzZSAgICAgewotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgRGV2aWNlIGVudHJ5IGZvciB0aGlzLAotICAgICAgICAgICAgICAgIC8vSWYgdGhpcyBpcyByYW5kb24gQWRkcmVzcywgdGhlcmUgd291bGQgbmV3IENhY2hlZERldmljZSBFbnRyeSBmb3IgdGhpcyByYW5kb20gYWRkcmVzcyBJbnN0YW5jZQotICAgICAgICAgICAgICAgIC8vSG93ZXZlciB0aGlzIHdvbnQgaGF2ZSB0aGUgbmFtZQotICAgICAgICAgICAgICAgIGNhY2hlZERldmljZSAgPSBtTG9jYWxNYW5hZ2VyLmdldENhY2hlZERldmljZU1hbmFnZXIoKS5hZGREZXZpY2UocmVzLmdldERldmljZSgpKTsKLSAgICAgICAgICAgICAgICAvL3VkYXRlIHRoZSBOYW1lIGZvciB0aGlzIGRldmljZSBmcm9tIEFEVjogSEFDSwotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzLmdldERldmljZSgpLmdldEFkZHJlc3MoKS5lcXVhbHMoYWRhcHRlci5nZXRBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiU2VsZiBERVZJQ0U6Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU2NhblJlY29yZCByZWMgPSByZXMuZ2V0U2NhblJlY29yZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjICE9IG51bGwgJiYgcmVjLmdldERldmljZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgIHMgPSByZWMuZ2V0RGV2aWNlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsInNldHRpbmcgbmFtZSBhcyAiICsgcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWREZXZpY2Uuc2V0TmFtZShzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlUHJlZmVyZW5jZSBwcmVmID0gbURldmljZVByZWZlcmVuY2VNYXAuZ2V0KGNhY2hlZERldmljZSk7Ci0gICAgICAgICAgICBpZiAocHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9JZiB0aGUgUHJlZmVybmNlIGFscmVhZCBDcmVhdGVkLCBqdXN0IHVwZGF0ZSB0aGUKLSAgICAgICAgICAgICAgICAvL1NjYW4gUmVzdWx0Ci0gICAgICAgICAgICAgICAgLy9wcmVmLlNldFNjYW5SZXN1bHQocmVzKTsKLSAgICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJQcmVmZXJlbmNlIGlzIGFscmVhZHkgcHJlc2VudCIgKyByZXMuZ2V0RGV2aWNlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFByZXZlbnQgdXBkYXRlcyB3aGlsZSB0aGUgbGlzdCBzaG93cyBvbmUgb2YgdGhlIHN0YXRlIG1lc3NhZ2VzCi0gICAgICAgICAgICBpZiAobUJsdWV0b290aEFkYXB0ZXIuZ2V0U3RhdGUoKSAhPSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OKSByZXR1cm47Ci0gICAgICAgICAgICAvL2lmIChtRmlsdGVyLm1hdGNoZXMoY2FjaGVkRGV2aWNlLmdldERldmljZSgpKSkgewotICAgICAgICAgICAgICAgY3JlYXRlRGV2aWNlUHJlZmVyZW5jZShjYWNoZWREZXZpY2UpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgVmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIHZEZXYgPSBWZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UuZ2V0VmVuZG9yQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlKGNhY2hlZERldmljZSwgbVByb2ZpbGVNYW5hZ2VyKTsKLSAgICAgICAgICAgIHZEZXYuc2V0U2NhblJlc3VsdChyZXMpOwotICAgICAgICB9OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0U291cmNlU2VsZWN0ZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYnJvYWRjYXN0U291cmNlSW5kaWNpZXMpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAib25CbGVCcm9hZGNhc3RTb3VyY2VTZWxlY3RlZCIgKyBzdGF0dXMgKyAic2VsIGluZGljaWVzOiIgKyAgYnJvYWRjYXN0U291cmNlSW5kaWNpZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5CQVNTX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgbGF1bmNoU3luY0FuZEJyb2FkY2FzdEluZGV4T3B0aW9ucyhicm9hZGNhc3RTb3VyY2VJbmRpY2llcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBhbGlhc05hbWUgPSBnZXRCbHVldG9vdGhOYW1lKHJjdnIpOwotICAgICAgICAgICAgICAgIG1Db21tb25Nc2dEaWFsb2cgPSBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLnNob3dTY2FuQXNzaXN0RXJyb3IobUNvbnRleHQsIHJjdnIuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VTZWxlY3Rpb25FcnJNZXNzYWdlKHN0YXR1cyksIGNvbW1vbk1lc3NhZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotCi0gICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWQ6IHJjdnI6IiArIHJjdnIgKwotICAgICAgICAgICAgICAgICJzdGF0dXM6IiArIHN0YXR1cyArICJzcmNJZCIgKyBzcmNJZCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAvL1Nob3cgRGlhbG9nCi0gICAgICAgICAgICAgICAgaWYgKG1Hcm91cE9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXNOYW1lID0gZ2V0Qmx1ZXRvb3RoTmFtZShyY3ZyKTsKLSAgICAgICAgICAgICAgICAgICAgIG1Db21tb25Nc2dEaWFsb2cgPSBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLnNob3dTY2FuQXNzaXN0RXJyb3IobUNvbnRleHQsIGFsaWFzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmJsdWV0b290aF9zb3VyY2VfYWRkZWRfbWVzc2FnZSwgY29tbW9uTWVzc2FnZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYobUJyb2FkY2FzdFBpbkNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX1NVQ0NFU1MKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TY2FuQXNzaXN0TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2NhbkFzc2lzdE1hbmFnZXIuc2V0QnJvYWRjYXN0Q29kZShzcmNJZCxtQnJvYWRjYXN0UGluQ29kZSwgbUdyb3VwT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0UGluQ29kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXNOYW1lID0gZ2V0Qmx1ZXRvb3RoTmFtZShyY3ZyKTsKLSAgICAgICAgICAgICAgICBtQ29tbW9uTXNnRGlhbG9nID0gQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5zaG93U2NhbkFzc2lzdEVycm9yKG1Db250ZXh0LCBhbGlhc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUFkZGl0aW9uRXJyTWVzc2FnZShzdGF0dXMpLCBjb21tb25NZXNzYWdlTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VVcGRhdGVkKEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlVXBkYXRlZDogcmN2cjoiICsgcmN2ciArCi0gICAgICAgICAgICAgICAgInN0YXR1czoiICsgc3RhdHVzICsgInNyY0lkIiArIHNyY0lkKTsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIGFsaWFzTmFtZSA9IGdldEJsdWV0b290aE5hbWUocmN2cik7Ci0gICAgICAgICAgICAgICAgIG1Db21tb25Nc2dEaWFsb2cgPSBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLnNob3dTY2FuQXNzaXN0RXJyb3IobUNvbnRleHQsIGFsaWFzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlVXBkYXRlRXJyTWVzc2FnZShzdGF0dXMpLCBjb21tb25NZXNzYWdlTGlzdGVuZXIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQoQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNyY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotCi0gICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAib25CbGVCcm9hZGNhc3RQaW5VcGRhdGVkOiByY3ZyOiIgKyByY3ZyICsKLSAgICAgICAgICAgICAgICAic3RhdHVzOiIgKyBzdGF0dXMgKyAic3JjSWQiICsgc3JjSWQpOwotICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suQkFTU19TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgU3RyaW5nIGFsaWFzTmFtZSA9IGdldEJsdWV0b290aE5hbWUocmN2cik7Ci0gICAgICAgICAgICAgICAgIG1Db21tb25Nc2dEaWFsb2cgPSBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLnNob3dTY2FuQXNzaXN0RXJyb3IobUNvbnRleHQsIGFsaWFzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9zZXRwaW5fZXJyb3JfbWVzc2FnZSwgY29tbW9uTWVzc2FnZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VSZW1vdmVkKEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlUmVtb3ZlZDogcmN2cjoiICsgcmN2ciArCi0gICAgICAgICAgICAgICAgInN0YXR1czoiICsgc3RhdHVzICsgInNyY0lkIiArIHNyY0lkKTsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLkJBU1NfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBhbGlhc05hbWUgPSBnZXRCbHVldG9vdGhOYW1lKHJjdnIpOwotICAgICAgICAgICAgICAgICBtQ29tbW9uTXNnRGlhbG9nID0gQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5zaG93U2NhbkFzc2lzdEVycm9yKG1Db250ZXh0LCBhbGlhc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZVJlbW92YWxFcnJNZXNzYWdlKHN0YXR1cyksIGNvbW1vbk1lc3NhZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH07Ci0KLQotICAgIHB1YmxpYyBCbHVldG9vdGhTQURldGFpbCgpIHsKLSAgICAgICAgc3VwZXIoRElTQUxMT1dfQ09ORklHX0JMVUVUT09USCk7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVEZXZpY2VQcmVmZXJlbmNlKENhY2hlZEJsdWV0b290aERldmljZSBjYWNoZWREZXZpY2UpIHsKLSAgICAgICAgaWYgKG1EZXZpY2VMaXN0R3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVHJ5aW5nIHRvIGNyZWF0ZSBhIGRldmljZSBwcmVmZXJlbmNlIGJlZm9yZSB0aGUgbGlzdCBncm91cC9jYXRlZ29yeSAiCi0gICAgICAgICAgICAgICAgICAgICsgImV4aXN0cyEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBrZXkgPSBjYWNoZWREZXZpY2UuZ2V0RGV2aWNlKCkuZ2V0QWRkcmVzcygpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2VQcmVmZXJlbmNlIHByZWZlcmVuY2UgPSAoQmx1ZXRvb3RoRGV2aWNlUHJlZmVyZW5jZSkgZ2V0Q2FjaGVkUHJlZmVyZW5jZShrZXkpOwotCi0gICAgICAgIGlmIChwcmVmZXJlbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZlcmVuY2UgPSBuZXcgQmx1ZXRvb3RoRGV2aWNlUHJlZmVyZW5jZShnZXRQcmVmQ29udGV4dCgpLCBjYWNoZWREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIHRydWUvKm1TaG93RGV2aWNlc1dpdGhvdXROYW1lcyovLCBCbHVldG9vdGhEZXZpY2VQcmVmZXJlbmNlLlNvcnRUeXBlLlRZUEVfRklGTyk7Ci0gICAgICAgICAgICBwcmVmZXJlbmNlLnNldEtleShrZXkpOwotICAgICAgICAgICAgLy9TZXQgaGlkZVNlY29uZFRhcmdldCBpcyB0cnVlIGlmIGl0J3MgYm9uZGVkIGRldmljZS4KLSAgICAgICAgICAgIC8vcHJlZmVyZW5jZS5oaWRlU2Vjb25kVGFyZ2V0KHRydWUpOwotICAgICAgICAgICAgbURldmljZUxpc3RHcm91cC5hZGRQcmVmZXJlbmNlKHByZWZlcmVuY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdERldmljZVByZWZlcmVuY2UocHJlZmVyZW5jZSk7Ci0gICAgICAgIExvZy53KFRBRywgImFkZGluZyIgKyBjYWNoZWREZXZpY2UgKyAidG8gdGhlIFByZWYgbWFwIik7Ci0gICAgICAgIG1EZXZpY2VQcmVmZXJlbmNlTWFwLnB1dChjYWNoZWREZXZpY2UsIHByZWZlcmVuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbUluaXRpYWxTY2FuU3RhcnRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV2aWNlQWRkZWQoQ2FjaGVkQmx1ZXRvb3RoRGV2aWNlIGNhY2hlZERldmljZSkgewotICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgIk9uU3RhcnQgQ2FsbGVkIik7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAgICAgICAgaWYgKG1Mb2NhbE1hbmFnZXIgPT0gbnVsbCl7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJCbHVldG9vdGggaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUNvbnRlbnQobUJsdWV0b290aEFkYXB0ZXIuZ2V0U3RhdGUoKSk7Ci0gICAgICAgIG1BdmFpbGFibGVEZXZpY2VzQ2F0ZWdvcnkuc2V0UHJvZ3Jlc3MobUJsdWV0b290aEFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpKTsKLSAgICAgICAgaWYgKG1TY2FuQXNzaXN0TWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVByb2ZpbGVNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJvZmlsZU1hbmFnZXIgPSBtTG9jYWxNYW5hZ2VyLmdldFByb2ZpbGVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCQ1Byb2ZpbGUgYmNQcm9maWxlID0gKEJDUHJvZmlsZSltUHJvZmlsZU1hbmFnZXIuZ2V0QkNQcm9maWxlKCk7Ci0gICAgICAgICAgICBtU2NhbkFzc2lzdE1hbmFnZXIgPSBiY1Byb2ZpbGUuZ2V0QlNBTWFuYWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkRGV2aWNlLmdldERldmljZSgpLCBtU2NhbkFzc2lzdENhbGxiYWNrKTsKLSAgICAgICAgICAgIGlmIChtU2NhbkFzc2lzdE1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIk9uIFN0YXJ0OiBub3QgYWJsZSB0byBpbnN0YW50aWF0ZSBzY2FuQXNzaXN0TWFuYWdlciIpOwotICAgICAgICAgICAgICAgIC8vcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2goQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiT25BdHRhY2ggQ2FsbGVkIik7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoKGNvbnRleHQpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIFN0cmluZyBkZXZpY2VBZGRyZXNzID0gZ2V0QXJndW1lbnRzKCkuZ2V0U3RyaW5nKEtFWV9ERVZJQ0VfQUREUkVTUyk7Ci0gICAgICAgIG1Hcm91cE9wZXJhdGlvbiA9IGdldEFyZ3VtZW50cygpLmdldFNob3J0KEtFWV9HUk9VUF9PUCkgPT0gKHNob3J0KTE7Ci0gICAgICAgIEJsdWV0b290aERldmljZSByZW1vdGVEZXZpY2UgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCkuZ2V0UmVtb3RlRGV2aWNlKAotICAgICAgICAgICAgICAgIGRldmljZUFkZHJlc3MpOwotICAgICAgICBpZiAobUxvY2FsTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJMb2NhbCBtZ3IgaXMgTlVMTCIpOwotICAgICAgICAgICAgbUxvY2FsTWFuYWdlciA9IFV0aWxzLmdldExvY2FsQnRNYW5hZ2VyKGdldEFjdGl2aXR5KCkpOwotICAgICAgICAgICAgaWYgKG1Mb2NhbE1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQmx1ZXRvb3RoIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UiKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQ2FjaGVkRGV2aWNlID0gbUxvY2FsTWFuYWdlci5nZXRDYWNoZWREZXZpY2VNYW5hZ2VyKCkuZmluZERldmljZShyZW1vdGVEZXZpY2UpOwotICAgICAgICBpZiAobUNhY2hlZERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL2dvQmFjaygpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByb2ZpbGVNYW5hZ2VyID0gbUxvY2FsTWFuYWdlci5nZXRQcm9maWxlTWFuYWdlcigpOwotICAgICAgICAgICAgQkNQcm9maWxlIGJjUHJvZmlsZSA9IChCQ1Byb2ZpbGUpbVByb2ZpbGVNYW5hZ2VyLmdldEJDUHJvZmlsZSgpOwotICAgICAgICAgICAgbVNjYW5Bc3Npc3RNYW5hZ2VyID0gYmNQcm9maWxlLmdldEJTQU1hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZERldmljZS5nZXREZXZpY2UoKSwgbVNjYW5Bc3Npc3RDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAobVNjYW5Bc3Npc3RNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJub3QgYWJsZSB0byBpbnN0YW50aWF0ZSBzY2FuQXNzaXN0TWFuYWdlciIpOwotICAgICAgICAgICAgICAgIC8vcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICBpZiAobUxvY2FsTWFuYWdlciA9PSBudWxsKXsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkJsdWV0b290aCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTWFrZSB0aGUgZGV2aWNlIG9ubHkgdmlzaWJsZSB0byBjb25uZWN0ZWQgZGV2aWNlcy4KLSAgICAgICAgZGlzYWJsZVNjYW5uaW5nKCk7Ci0gICAgICAgIC8vY2xlYXIgdGhlIHByZWZlcmVuY2UgbWFwIG9uU3RvcAotICAgICAgICBtRGV2aWNlUHJlZmVyZW5jZU1hcC5jbGVhcigpOwotICAgICAgICBtU2NhbkFzc2lzdE1hbmFnZXIgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHZvaWQgaW5pdFByZWZlcmVuY2VzRnJvbVByZWZlcmVuY2VTY3JlZW4oKSB7Ci0gICAgICAgIG1TY2FuRGVsZWdhdG9yTmFtZSA9IGZpbmRQcmVmZXJlbmNlKCJidF9iY2FzdF9yY3ZyX2RldmljZSIpOwotICAgICAgICBtU2NhbkRlbGVnYXRvck5hbWUuc2V0U2VsZWN0YWJsZShmYWxzZSk7Ci0gICAgICAgIGlmIChtQ2FjaGVkRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TY2FuRGVsZWdhdG9yTmFtZS5zZXRTdW1tYXJ5KFNDQU5fREVMX05BTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNjYW5EZWxlZ2F0b3JOYW1lLnNldFN1bW1hcnkoZ2V0Qmx1ZXRvb3RoTmFtZShtQ2FjaGVkRGV2aWNlLmdldERldmljZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUF2YWlsYWJsZURldmljZXNDYXRlZ29yeSA9IChCbHVldG9vdGhQcm9ncmVzc0NhdGVnb3J5KSBmaW5kUHJlZmVyZW5jZShLRVlfQVZBSUxfTEVfQVVESU9fU09VUkNFUyk7Ci0gICAgICAgIG1Gb290ZXJQcmVmZXJlbmNlID0gKEZvb3RlclByZWZlcmVuY2UpIGZpbmRQcmVmZXJlbmNlKEtFWV9GT09URVJfUFJFRik7Ci0gICAgICAgIG1Gb290ZXJQcmVmZXJlbmNlLnNldFNlbGVjdGFibGUoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWV0cmljc0NhdGVnb3J5KCkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3NFbnVtcy5CTFVFVE9PVEhfUEFJUklORzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIGVuYWJsZVNjYW5uaW5nKCkgewotICAgICAgICAvLyBDbGVhciBhbGwgZGV2aWNlIHN0YXRlcyBiZWZvcmUgZmlyc3Qgc2NhbgotICAgICAgICBpZiAoIW1Jbml0aWFsU2NhblN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlRGV2aWNlc0NhdGVnb3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVBbGxEZXZpY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTG9jYWxNYW5hZ2VyLmdldENhY2hlZERldmljZU1hbmFnZXIoKS5jbGVhck5vbkJvbmRlZERldmljZXMoKTsKLSAgICAgICAgICAgIG1Jbml0aWFsU2NhblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vQ2FsbCB0byBTY2FuIGZvciBMRSBBdWRpbyBTb3VyY2VzCi0gICAgICAgIGlmIChtU2NhbkFzc2lzdE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICJjYWxsIHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMiKTsKLSAgICAgICAgICAgIG1TY2FuQXNzaXN0TWFuYWdlci5zZWFyY2hmb3JMZUF1ZGlvQnJvYWRjYXN0ZXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIGRpc2FibGVTY2FubmluZygpIHsKLSAgICAgICAgaWYgKG1TY2FuQXNzaXN0TWFuYWdlciAhPSBudWxsICYmIG1TY2FubmluZyA9PSB0cnVlKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgImNhbGwgc3RvcFNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMiKTsKLSAgICAgICAgICAgIG1TY2FuQXNzaXN0TWFuYWdlci5zdG9wU2VhcmNoZm9yTGVBdWRpb0Jyb2FkY2FzdGVycygpOwotICAgICAgICAgICAgbVNjYW5uaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTeW5jU3RhdGVGcm9tU2VsZWN0aW9uIChTdHJpbmcgcykgewotICAgICAgICBpbnQgcmV0ID0gLTE7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiZ2V0U3luY1N0YXRlRnJvbVNlbGVjdGlvbjpJbnZhbGlkIElucHV0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVN5bmNTdGF0ZS5lcXVhbHMoIlN5bmMgTWV0YWRhdGEiKSkgewotICAgICAgICAgICAgICAgIHJldCA9IEJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdE1hbmFnZXIuU1lOQ19NRVRBREFUQTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlci5TWU5DX01FVEFEQVRBX0FVRElPOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgdm9pZCBsYXVuY2hTeW5jQW5kQnJvYWRjYXN0SW5kZXhPcHRpb25zKExpc3Q8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYnJvYWRjYXN0U291cmNlSW5kaWNpZXMpIHsKLSAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICAgZmluYWwgVmlldyBkaWFsb2dWaWV3OwotICAgICAgICAgU3RyaW5nIHRpdGxlLCBtZXNzYWdlOwotICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICAgaWYgKGlzQWRkZWQoKSAmJiBhY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgZGlhbG9nVmlldyA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShSLmxheW91dC5zZWxlY3Rfc291cmNlX3Byb21wdCwgbnVsbCk7Ci0gICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgIGlmIChjbGlja2VkRGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgbmFtZSA9IGNsaWNrZWREZXZpY2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgbmFtZSA9IGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmJsdWV0b290aF9kZXZpY2UpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAobUdyb3VwT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ibHVldG9vdGhfZ3JwX3NvdXJjZV9zZWxlY3Rpb25fb3B0aW9uc19kZXRhaWwsIG5hbWUpOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5ibHVldG9vdGhfc291cmNlX3NlbGVjdGlvbl9vcHRpb25zX2RldGFpbCwgbmFtZSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHRpdGxlID0gY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuYmx1ZXRvb3RoX3NvdXJjZV9zZWxlY3Rpb25fb3B0aW9uc19kZXRhaWxfdGl0bGUpOwotCi0gICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAvL0JJUyBTZWxlY3Rpb24gY2hvaWNlCi0gICAgICAgICAgICAgTGlzdFZpZXcgYmlzU2VsZWN0aW9uTGlzdDsKLSAgICAgICAgICAgICBiaXNTZWxlY3Rpb25MaXN0ID0gZGlhbG9nVmlldy5maW5kVmlld0J5SWQoUi5pZC5sdik7Ci0gICAgICAgICAgICAgYmlzU2VsZWN0aW9uTGlzdC5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX01VTFRJUExFKTsKLSAgICAgICAgICAgICBBcnJheUFkYXB0ZXI8QmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbD4gYXJyYXlBZGFwdGVyID0KLSAgICAgICAgICAgICBuZXcgQXJyYXlBZGFwdGVyPEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWw+KGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV9tdWx0aXBsZV9jaG9pY2UgLCBicm9hZGNhc3RTb3VyY2VJbmRpY2llcyk7Ci0KLSAgICAgICAgICAgICBiaXNTZWxlY3Rpb25MaXN0LnNldEFkYXB0ZXIoYXJyYXlBZGFwdGVyKTsKLQotICAgICAgICAgICAgIGJpc1NlbGVjdGlvbkxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAib25JdGVtQ2xpY2s6ICIgK3Bvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgQ2hlY2tlZFRleHRWaWV3IHYgPSAoQ2hlY2tlZFRleHRWaWV3KSB2aWV3OwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGN1cnJlbnRDaGVjayA9IHYuaXNDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIEJsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwgYmlzSW5kZXggPSAoQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbCkgYmlzU2VsZWN0aW9uTGlzdC5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGJpc0luZGV4LnNldFN0YXR1cyhjdXJyZW50Q2hlY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIGNhbmNlbEFkZFNvdXJjZUxpc3RlbmVyID0gbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICI+PkNhbmNlbCBjbGlja2VkIik7Ci0gICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIGFkZFNvdXJjZUxpc3RlbmVyID0gbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgUmFkaW8gQnV0dG9ucwotICAgICAgICAgICAgICAgICBmaW5hbCBSYWRpb0dyb3VwIGdyb3VwID0gZGlhbG9nVmlldy5maW5kVmlld0J5SWQoUi5pZC5zeW5jU3RhdGVPcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgaW50IHNlbGVjdGVkSWQgPSBncm91cC5nZXRDaGVja2VkUmFkaW9CdXR0b25JZCgpOwotICAgICAgICAgICAgICAgICBSYWRpb0J1dHRvbiByYWRpb1NlbGVjdGVkQnV0dG9uID0gKFJhZGlvQnV0dG9uKSBkaWFsb2dWaWV3LmZpbmRWaWV3QnlJZChzZWxlY3RlZElkKTsKLSAgICAgICAgICAgICAgICAgbVN5bmNTdGF0ZSA9IHJhZGlvU2VsZWN0ZWRCdXR0b24uZ2V0VGV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAibVN5bmNTdGF0ZTogIiArICBtU3luY1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoY2xpY2tlZERldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yZSBhcyB0aGVyZSBpcyBubyBjbGlja2VkIGRldmljZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2xpY2tlZERldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKG1CbHVldG9vdGhBZGFwdGVyLmdldEFkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5kZWJ1ZyhUQUcsICI+PkxvY2FsIEFkYXB0ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFBpbkNvZGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IGJyb2FkY2FzdFBJTiA9IGRpYWxvZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuYnJvYWRjYXN0UElOY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RQaW5Db2RlID0gYnJvYWRjYXN0UElOLmdldFRleHQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgImJyb2FkY2FzdFBpbkNvZGU6ICIgKyBtQnJvYWRjYXN0UGluQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtQnJvYWRjYXN0UGluQ29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiRW1wdHkgYnJvYWNhc3QgUGluQ29kZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJyb2FkY2FzdFBpbkNvZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU2NhbkFzc2lzdE1hbmFnZXIgIT0gbnVsbCAmJiBjbGlja2VkRGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgIG1TY2FuQXNzaXN0TWFuYWdlci5hZGRCcm9hZGNhc3RTb3VyY2UoY2xpY2tlZERldmljZS5nZXREZXZpY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypnZXRTeW5jU3RhdGVGcm9tU2VsZWN0aW9uKG1TeW5jU3RhdGUpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0TWFuYWdlci5TWU5DX01FVEFEQVRBX0FVRElPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RTb3VyY2VJbmRpY2llcywgbUdyb3VwT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgRWRpdFRleHQgYnJvYWRjYXN0UElOID0gZGlhbG9nVmlldy5maW5kVmlld0J5SWQoUi5pZC5icm9hZGNhc3RQSU5jb2RlKTsKLSAgICAgICAgICAgICBpZiAoY2xpY2tlZERldmljZSAhPSBudWxsICYmIGNsaWNrZWREZXZpY2UuZ2V0QWRkcmVzcygpLmVxdWFscyhtQmx1ZXRvb3RoQWRhcHRlci5nZXRBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgIEJyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuZGVidWcoVEFHLCAiTG9jYWwgQWRhcHRlciIpOwotICAgICAgICAgICAgICAgICBtQnJvYWRjYXN0UGluQ29kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgIGJyb2FkY2FzdFBJTi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgaWYgKG1Hcm91cE9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmJsdWV0b290aF9jb2xfZ3JwX3NvdXJjZV9zZWxlY3Rpb25fb3B0aW9uc19kZXRhaWwsIG5hbWUpOwotICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmJsdWV0b290aF9jb2xfc291cmNlX3NlbGVjdGlvbl9vcHRpb25zX2RldGFpbCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgbVNjYW5Bc3Npc3REZXRhaWxzRGlhbG9nID0gQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscy5zaG93U2NhbkFzc2lzdERldGFpbHNEaWFsb2coY29udGV4dCwKLSAgICAgICAgICAgICAgICAgbVNjYW5Bc3Npc3REZXRhaWxzRGlhbG9nLCBhZGRTb3VyY2VMaXN0ZW5lciwgY2FuY2VsQWRkU291cmNlTGlzdGVuZXIsIHRpdGxlLAotICAgICAgICAgICAgICAgICBIdG1sLmZyb21IdG1sKG1lc3NhZ2UpLCBkaWFsb2dWaWV3KTsKLSAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIG9uRGV2aWNlUHJlZmVyZW5jZUNsaWNrKEJsdWV0b290aERldmljZVByZWZlcmVuY2UgYnRQcmVmZXJlbmNlKSB7Ci0gICAgICAgIGRpc2FibGVTY2FubmluZygpOwotICAgICAgICBjbGlja2VkRGV2aWNlID0gYnRQcmVmZXJlbmNlLmdldEJsdWV0b290aERldmljZSgpOwotCQlWZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UgdkRldmljZSA9IFZlbmRvckNhY2hlZEJsdWV0b290aERldmljZS5nZXRWZW5kb3JDYWNoZWRCbHVldG9vdGhEZXZpY2UoY2xpY2tlZERldmljZSwgbVByb2ZpbGVNYW5hZ2VyKTsKLSAgICAgICAgaWYgKG1TY2FuQXNzaXN0TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmRlYnVnKFRBRywgImNhbGxpbmcgc2VsZWN0QXVkaW9Tb3VyY2UiKTsKLSAgICAgICAgICAgIG1TY2FuQXNzaXN0TWFuYWdlci5zZWxlY3RCcm9hZGNhc3RTb3VyY2UodkRldmljZS5nZXRTY2FuUmVzdWx0KCksIG1Hcm91cE9wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCB1cGRhdGVDb250ZW50KGludCBibHVldG9vdGhTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKGJsdWV0b290aFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046Ci0gICAgICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAvL21CbHVldG9vdGhBZGFwdGVyLmVuYWJsZSgpOwotCi0gICAgICAgICAgICAgICAgYWRkRGV2aWNlQ2F0ZWdvcnkobUF2YWlsYWJsZURldmljZXNDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmJsdWV0b290aF9wcmVmZXJlbmNlX2ZvdW5kX21lZGlhX2RldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2VGaWx0ZXIuQUxMX0ZJTFRFUiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUZvb3RlclByZWZlcmVuY2UobUZvb3RlclByZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgIC8vbUFsd2F5c0Rpc2NvdmVyYWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIGVuYWJsZVNjYW5uaW5nKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY6Ci0gICAgICAgICAgICAgICAgZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIHVwZGF0ZUZvb3RlclByZWZlcmVuY2UoUHJlZmVyZW5jZSBteURldmljZVByZWZlcmVuY2UpIHsKLSAgICAgICAgZmluYWwgQmlkaUZvcm1hdHRlciBiaWRpRm9ybWF0dGVyID0gQmlkaUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBteURldmljZVByZWZlcmVuY2Uuc2V0VGl0bGUoZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIFIuc3RyaW5nLmJsdWV0b290aF9mb290ZXJfbWFjX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgYmlkaUZvcm1hdHRlci51bmljb2RlV3JhcChtQ2FjaGVkRGV2aWNlLmdldEFkZHJlc3MoKSkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJsdWV0b290aFN0YXRlQ2hhbmdlZChpbnQgYmx1ZXRvb3RoU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25CbHVldG9vdGhTdGF0ZUNoYW5nZWQoYmx1ZXRvb3RoU3RhdGUpOwotICAgICAgICB1cGRhdGVDb250ZW50KGJsdWV0b290aFN0YXRlKTsKLSAgICAgICAgaWYgKGJsdWV0b290aFN0YXRlID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04pIHsKLSAgICAgICAgICAgIHNob3dCbHVldG9vdGhUdXJuZWRPblRvYXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRIZWxwUmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBSLnN0cmluZy5oZWxwX3VybF9ibHVldG9vdGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dUYWcoKSB7Ci0gICAgICAgIHJldHVybiBUQUc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRQcmVmZXJlbmNlU2NyZWVuUmVzSWQoKSB7Ci0gICAgICAgIHJldHVybiBSLnhtbC5ibHVldG9vdGhfc2VhcmNoX2JjYXN0X3NvdXJjZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXREZXZpY2VMaXN0S2V5KCkgewotICAgICAgICByZXR1cm4gS0VZX0FWQUlMX0xFX0FVRElPX1NPVVJDRVM7Ci0gICAgfQotCi0gICAgdm9pZCBzaG93Qmx1ZXRvb3RoVHVybmVkT25Ub2FzdCgpIHsKLSAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCBSLnN0cmluZy5jb25uZWN0ZWRfZGV2aWNlX2JsdWV0b290aF90dXJuZWRfb25fdG9hc3QsCi0gICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0Jyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuamF2YSBiL2xlX2F1ZGlvL3BhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzL2JsdWV0b290aC9Ccm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODNlNzAuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vcGFja2FnZXMvYXBwcy9TZXR0aW5ncy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3MvYmx1ZXRvb3RoL0Jyb2FkY2FzdFNjYW5Bc3Npc3RhbmNlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5ncy5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5zZXR0aW5ncy5TZXR0aW5nc0VudW1zOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGFuZHJvaWR4LmFwcGNvbXBhdC5hcHAuQWxlcnREaWFsb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5ncy5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzLm92ZXJsYXkuRmVhdHVyZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkJsdWV0b290aFV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5CbHVldG9vdGhVdGlscy5FcnJvckxpc3RlbmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmJsdWV0b290aC5Mb2NhbEJsdWV0b290aE1hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuYmx1ZXRvb3RoLkxvY2FsQmx1ZXRvb3RoTWFuYWdlci5CbHVldG9vdGhNYW5hZ2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKLQotLyoqCi0gKiBCcm9hZGNhc3RTY2FuQXNzaXN0YW5jZVV0aWxzIGlzIGEgaGVscGVyIGNsYXNzIHRoYXQgY29udGFpbnMgY29uc3RhbnRzIGZvciB2YXJpb3VzCi0gKiBBbmRyb2lkIHJlc291cmNlIElEcywgZGVidWcgbG9nZ2luZyBmbGFncywgYW5kIHN0YXRpYyBtZXRob2RzCi0gKiBmb3IgY3JlYXRpbmcgQkFTUyBkaWFsb2dzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJyb2FkY2FzdFNjYW5Bc3NzaXRhbmNlQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscyI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQkFTU19EQkcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKLQotICAgIHByaXZhdGUgQnJvYWRjYXN0U2NhbkFzc2lzdGFuY2VVdGlscygpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgVEFHLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChCQVNTX0RCRykgewotICAgICAgICAgICBMb2cuZChUQUcsIG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsRGV2aWNlKEJsdWV0b290aERldmljZSBkZXYpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGRldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYnRBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICAgICAgICByZXQgPSBidEFkYXB0ZXIuZ2V0QWRkcmVzcygpLmVxdWFscyhkZXYuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJpc0xvY2FsQnJvYWRjYXN0U291cmNlIHJldHVybnMiICtyZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHN0YXRpYyBBbGVydERpYWxvZyBzaG93U2NhbkFzc2lzdEVycm9yKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIGludCBtZXNzYWdlUmVzSWQsCi0gICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIG9rTGlzdGVuZXIpIHsKLSAgICAgICAgcmV0dXJuIHNob3dTY2FuQXNzaXN0RXJyb3IoY29udGV4dCwgbmFtZSwgbWVzc2FnZVJlc0lkLCBVdGlscy5nZXRMb2NhbEJ0TWFuYWdlcihjb250ZXh0KSwgb2tMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWxlcnREaWFsb2cgc2hvd1NjYW5Bc3Npc3RFcnJvcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBpbnQgbWVzc2FnZVJlc0lkLAotICAgICAgICAgICAgTG9jYWxCbHVldG9vdGhNYW5hZ2VyIG1hbmFnZXIsIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgb2tMaXN0ZW5lcikgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGNvbnRleHQuZ2V0U3RyaW5nKG1lc3NhZ2VSZXNJZCwgbmFtZSk7Ci0gICAgICAgIENvbnRleHQgYWN0aXZpdHkgPSBtYW5hZ2VyLmdldEZvcmVncm91bmRBY3Rpdml0eSgpOwotICAgICAgICBBbGVydERpYWxvZyBkaWFsb2cgPSBudWxsOwotICAgICAgICBpZiAobWFuYWdlci5pc0ZvcmVncm91bmRBY3Rpdml0eSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgZGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoYWN0aXZpdHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoUi5zdHJpbmcuYmx1ZXRvb3RoX2Vycm9yX3RpdGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UobWVzc2FnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihhbmRyb2lkLlIuc3RyaW5nLm9rLCBva0xpc3RlbmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IHNob3cgZXJyb3IgZGlhbG9nLiIsIGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGNvbnRleHQsIG1lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwotICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBDcmVhdGUgKG9yIHJlY3ljbGUgZXhpc3RpbmcpIGFuZCBzaG93IGRpc2Nvbm5lY3QgZGlhbG9nLgotICAgIHN0YXRpYyBBbGVydERpYWxvZyBzaG93U2NhbkFzc2lzdERldGFpbHNEaWFsb2coQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgQWxlcnREaWFsb2cgZGlhbG9nLAotICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciBhZGRTb3VyY2VMaXN0ZW5lciwKLSAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgY2FuY2VsQWRkU291cmNlTGlzdGVuZXIsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBtZXNzYWdlLAotICAgICAgICAgICAgVmlldyBjdXN0b21WaWV3Ci0gICAgICAgICAgICApIHsKLSAgICAgICAgaWYgKGRpYWxvZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihjb250ZXh0KQotICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oYW5kcm9pZC5SLnN0cmluZy5vaywgYWRkU291cmNlTGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgICAgIC5zZXROZWdhdGl2ZUJ1dHRvbihhbmRyb2lkLlIuc3RyaW5nLmNhbmNlbCwgY2FuY2VsQWRkU291cmNlTGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWaWV3KGN1c3RvbVZpZXcpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkaWFsb2cuaXNTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gdXNlIGRpc2Nvbm5lY3RMaXN0ZW5lciBmb3IgdGhlIGNvcnJlY3QgcHJvZmlsZShzKQotICAgICAgICAgICAgLy9DaGFyU2VxdWVuY2Ugb2tUZXh0ID0gY29udGV4dC5nZXRUZXh0KGFuZHJvaWQuUi5zdHJpbmcub2spOwotICAgICAgICAgICAgLy9kaWFsb2cuc2V0QnV0dG9uKERpYWxvZ0ludGVyZmFjZS5CVVRUT05fUE9TSVRJVkUsCi0gICAgICAgICAgICAvLyAgICAgICAgb2tUZXh0LCBhZGRTb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZGlhbG9nLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIGRpYWxvZy5zaG93KCk7Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotCi0gICAgc3RhdGljIEFsZXJ0RGlhbG9nIHNob3dBc3Npc3RhbmNlR3JvdXBPcHRpb25zRGlhbG9nKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nIGRpYWxvZywKLSAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgZ3JvdXBPcExpc3RlbmVyLAotICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciBzaW5nbGVEZXZMaXN0ZW5lciwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgQ2hhclNlcXVlbmNlIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKGRpYWxvZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzaG93QXNzaXN0YW5jZUdyb3VwT3B0aW9uc0RpYWxvZyBjcmVhdGlvbiIpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoY29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLnllcywgZ3JvdXBPcExpc3RlbmVyKQotICAgICAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcubm8sIHNpbmdsZURldkxpc3RlbmVyKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHVzZSBkaXNjb25uZWN0TGlzdGVuZXIgZm9yIHRoZSBjb3JyZWN0IHByb2ZpbGUocykKLSAgICAgICAgICAgIC8vQ2hhclNlcXVlbmNlIG9rVGV4dCA9IGNvbnRleHQuZ2V0VGV4dChhbmRyb2lkLlIuc3RyaW5nLnllcyk7Ci0gICAgICAgICAgICAvL2RpYWxvZy5zZXRCdXR0b24oRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9QT1NJVElWRSwKLSAgICAgICAgICAgIC8vICAgICAgICBva1RleHQsIGdyb3VwT3BMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZGlhbG9nLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIGRpYWxvZy5zaG93KCk7Ci0gICAgICAgIHJldHVybiBkaWFsb2c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2JpbmRlci9BbmRyb2lkLmJwIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2JpbmRlci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQ0YjExLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9iaW5kZXIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIEFJREwgaW50ZXJmYWNlIGJldHdlZW4gbGliYmx1ZXRvb3RoLWJpbmRlciBhbmQgZnJhbWV3b3JrLmphcgotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RoLWJpbmRlci1haWRsLWFkdmEiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhTeW5jSGVscGVyLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEJyb2FkY2FzdC5haWRsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9CbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsLmFpZGwgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5NGY5NC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUNoYW5uZWwuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsOwotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0JsZUJyb2FkY2FzdFNvdXJjZUluZm8uYWlkbCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmxlQnJvYWRjYXN0U291cmNlSW5mby5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWIxNGRhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvQmxlQnJvYWRjYXN0U291cmNlSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbGVCcm9hZGNhc3RTb3VyY2VJbmZvOwotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5haWRsIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2suYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzZjgxMy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmxlQnJvYWRjYXN0U291cmNlQ2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5sZS5TY2FuUmVzdWx0OwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJQmxlQnJvYWRjYXN0QXVkaW9TY2FuQXNzaXN0Q2FsbGJhY2sgewotICAgIHZvaWQgb25CbGVCcm9hZGNhc3RTb3VyY2VGb3VuZChpbiBTY2FuUmVzdWx0IHNjYW5yZXMpOwotICAgIHZvaWQgb25CbGVCcm9hZGNhc3RBdWRpb1NvdXJjZVNlbGVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICBpbiBpbnQgc3RhdHVzLAotICAgICAgICAgICAgaW4gTGlzdDxCbGVCcm9hZGNhc3RTb3VyY2VDaGFubmVsPgotICAgICAgICAgICAgYnJvYWRjYXN0U291cmNlQ2hhbm5lbHMpOwotCi0gICAgdm9pZCBvbkJsZUJyb2FkY2FzdEF1ZGlvU291cmNlQWRkZWQoaW4gQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VVcGRhdGVkKGluIEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBzdGF0dXMpOwotCi0gICAgdm9pZCBvbkJsZUJyb2FkY2FzdFBpblVwZGF0ZWQoaW4gQmx1ZXRvb3RoRGV2aWNlIHJjdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgc3RhdHVzKTsKLSAgICB2b2lkIG9uQmxlQnJvYWRjYXN0QXVkaW9Tb3VyY2VSZW1vdmVkKGluIEJsdWV0b290aERldmljZSByY3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZSBzcmNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2JpbmRlci9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQnJvYWRjYXN0LmFpZGwgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhCcm9hZGNhc3QuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNTRlOS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhCcm9hZGNhc3QuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci0KLS8qKgotICogQVBJcyBmb3IgQmx1ZXRvb3RoIEJyb2FkY2FzdCBzZXJ2aWNlCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhCcm9hZGNhc3QgewotICAgIC8vIFB1YmxpYyBBUEkKLSAgICBib29sZWFuIFNldEJyb2FkY2FzdChpbiBib29sZWFuIGVuYWJsZSwgaW4gU3RyaW5nIHBhY2thZ2VOYW1lKTsKLSAgICBib29sZWFuIFNldEVuY3J5cHRpb24oaW4gYm9vbGVhbiBlbmFibGUsIGluIGludCBlbmNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIHVzZV9leGlzdGluZywgaW4gU3RyaW5nIHBhY2thZ2VOYW1lKTsKLSAgICBieXRlW10gR2V0RW5jcnlwdGlvbktleShpbiBTdHJpbmcgcGFja2FnZU5hbWUpOwotICAgIGludCBHZXRCcm9hZGNhc3RTdGF0dXMoaW4gU3RyaW5nIHBhY2thZ2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFN5bmNIZWxwZXIuYWlkbCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9iaW5kZXIvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aFN5bmNIZWxwZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1YzFmZi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYmluZGVyL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhTeW5jSGVscGVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsZUJyb2FkY2FzdFNvdXJjZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLmxlLlNjYW5SZXN1bHQ7Ci0KLS8qKgotICogQVBJcyBmb3IgQmx1ZXRvb3RoIEJsdWV0b290aCBTY2FuIG9mZmxvYWRlciBzZXJ2aWNlCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhTeW5jSGVscGVyIHsKLSAgICAvLyBQdWJsaWMgQVBJCi0gICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBMaXN0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpOwotICAgIExpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGluIGludFtdIHN0YXRlcyk7Ci0gICAgaW50IGdldENvbm5lY3Rpb25TdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBib29sZWFuIHNldENvbm5lY3Rpb25Qb2xpY3koaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IGNvbm5lY3Rpb25Qb2xpY3kpOwotICAgIGludCBnZXRDb25uZWN0aW9uUG9saWN5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIGJvb2xlYW4gc3RhcnRTY2FuT2ZmbG9hZCAoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gZ3JvdXBPcCk7Ci0gICAgYm9vbGVhbiBzdG9wU2Nhbk9mZmxvYWQgKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gZ3JvdXBPcCk7Ci0KLSAgICB2b2lkIHJlZ2lzdGVyQXBwQ2FsbGJhY2soaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gSUJsZUJyb2FkY2FzdEF1ZGlvU2NhbkFzc2lzdENhbGxiYWNrIGNiKTsKLSAgICB2b2lkIHVucmVnaXN0ZXJBcHBDYWxsYmFjayhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIElCbGVCcm9hZGNhc3RBdWRpb1NjYW5Bc3Npc3RDYWxsYmFjayBjYik7Ci0KLSAgICBib29sZWFuIHNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMgKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIGJvb2xlYW4gc3RvcFNlYXJjaGZvckxlQXVkaW9Ccm9hZGNhc3RlcnMoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0KLSAgICBib29sZWFuIGFkZEJyb2FkY2FzdFNvdXJjZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEJsZUJyb2FkY2FzdFNvdXJjZUluZm8gc3JjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIGdyb3VwT3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBib29sZWFuIHNlbGVjdEJyb2FkY2FzdFNvdXJjZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFNjYW5SZXN1bHQgc2NhblJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIGdyb3VwT3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIGJvb2xlYW4gdXBkYXRlQnJvYWRjYXN0U291cmNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gZ3JvdXBPcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgYm9vbGVhbiBzZXRCcm9hZGNhc3RDb2RlIChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQmxlQnJvYWRjYXN0U291cmNlSW5mbyBzcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYm9vbGVhbiBncm91cE9wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIGJvb2xlYW4gcmVtb3ZlQnJvYWRjYXN0U291cmNlIChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlIFNvdXJjZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIGdyb3VwT3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBMaXN0PEJsZUJyb2FkY2FzdFNvdXJjZUluZm8+IGdldEFsbEJyb2FkY2FzdFNvdXJjZUluZm9ybWF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL0FuZHJvaWQuYnAgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWNhODUuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJmbHVvcmlkZV9idGFfZGVmYXVsdHNfcXRpX2FkdmEiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0IiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvYnRhL2FnIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L3N0YWNrL2J0bSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvdWRydi9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC92bmQvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9ibHVldG9vdGhfZXh0L3N5c3RlbV9idF9leHQiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2V4dC92aGFsL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2V4dC9zeXN0ZW1fYnRfZXh0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9leHQvc3lzdGVtX2J0X2V4dC9idGlmL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMtaW50Zi9ibHVldG9vdGgvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvZGV2aWNlL2luY2x1ZGUiLAotICAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9idGlmL2luY2x1ZGUiLAotICAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9sZWEvc3lzdGVtL2J0IiwKLSAgICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9ibHVldG9vdGhfbGVhL3N5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2xlYS92aGFsL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2xlYS9zeXN0ZW0vYnQvYnRhL2JhcCIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9ibHVldG9vdGhfbGVhL3N5c3RlbS9idC9idGlmL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2NvbW1vbi8iCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICAgICAgIi1EQURWX0FVRElPX0ZFQVRVUkU9MSIsCi0gICAgXSwKLX0KLQotLy8gQlRBIHN0YXRpYyBsaWJyYXJ5IGZvciB0YXJnZXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0LWJ0YV9xdGlfYWR2YSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfYnRhX2RlZmF1bHRzX3F0aV9hZHZhIl0sCi0gICAgZW5hYmxlZDogZmFsc2UsCi0gICAgc3JjczogWwotICAgICAgICAiY3NpcC9idGFfY3NpcF9hY3QuY2MiLAotICAgICAgICAiY3NpcC9idGFfY3NpcF9hcGkuY2MiLAotICAgICAgICAiY3NpcC9idGFfY3NpcF9tYWluLmNjIiwKLSAgICAgICAgImNzaXAvYnRhX2NzaXBfdXRpbHMuY2MiLAotICAgICAgICAiYmFwL2FzY3NfY2xpZW50LmNjIiwKLSAgICAgICAgImJhcC9wYWNzX2NsaWVudC5jYyIsCi0gICAgICAgICJiYXAvZ2F0dGNfb3BzX3F1ZXVlLmNjIiwKLSAgICAgICAgImJhcC9nYXR0c19vcHNfcXVldWUuY2MiLAotICAgICAgICAiYmFwL3VjbGllbnRfbWFpbi5jYyIsCi0gICAgICAgICJiYXAvdWNsaWVudF9zdHJtX21nci5jYyIsCi0gICAgICAgICJiYXAvdWNsaWVudF9zdHJtX3RyYWNrZXIuY2MiLAotICAgICAgICAiYmFwL2Nvbm5lY3RlZF9pc28uY2MiLAotICAgICAgICAiYmFwL3VjbGllbnRfYWxhcm0uY2MiLAotICAgICAgICAidmNwL2J0YV92Y3BfY29udHJvbGxlci5jYyIsCi0gICAgICAgICJkbS9idGFfZG1fYWR2X2F1ZGlvLmNjIiwKLSAgICAgICAgIm1jcC9idGFfbWNwX21haW4uY2MiLAotICAgICAgICAiY2MvYnRhX2NjX21haW4uY2MiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9hc2NzX2NsaWVudC5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL2FzY3NfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmU1ZjdjLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL2FzY3NfY2xpZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTczMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2FzY3NfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImdhdHRjX29wc19xdWV1ZS5oIgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnQuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYmFwX2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIGFzY3MgewotCi11c2luZyBiYXNlOjpDbG9zdXJlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OkdhdHRPcHNRdWV1ZTsKLQotVXVpZCBBU0NTX1VVSUQgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjE4NEUiKTsKLVV1aWQgQVNDU19TSU5LX0FTRV9VVUlEICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQkM0Iik7Ci1VdWlkIEFTQ1NfU1JDX0FTRV9VVUlEICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkJDNSIpOwotVXVpZCBBU0NTX0FTRV9DUF9VVUlEICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCQzYiKTsKLQotY2xhc3MgQXNjc0NsaWVudEltcGw7Ci1Bc2NzQ2xpZW50SW1wbCogaW5zdGFuY2U7Ci0KLXR5cGVkZWYgdWludDhfdCBjb2RlY190eXBlX3RbNV07Ci0KLWVudW0gY2xhc3MgUHJvZmxlT1AgewotICBDT05ORUNULAotICBESVNDT05ORUNUCi19OwotCi1zdHJ1Y3QgUHJvZmlsZU9wZXJhdGlvbiB7Ci0gIHVpbnQxNl90IGNsaWVudF9pZDsKLSAgUHJvZmxlT1AgdHlwZTsKLX07Ci0KLWVudW0gY2xhc3MgRGV2U3RhdGUgewotICBJRExFID0gMCwKLSAgQ09OTkVDVElORywKLSAgQ09OTkVDVEVELAotICBESVNDT05ORUNUSU5HCi19OwotCi12b2lkIGFzY3NfZ2F0dGNfY2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSk7Ci12b2lkIGVuY3J5cHRpb25fY2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyosIHRHQVRUX1RSQU5TUE9SVCwgdm9pZCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMpOwotCi1zdGQ6Om1hcDx1aW50OF90LCBzdGQ6OnN0cmluZz4gcmVzcF9jb2RlcyA9IHsKLSAgezB4MDEsICAgIlVuIFN1cHBvcnRlZCBPcGNvZGUifSwKLSAgezB4MDIsICAgIkludmFsaWQgTGVuZ3RoIn0sCi0gIHsweDAzLCAgICJJbnZhbGlkIEFTRSBJRCJ9LAotICB7MHgwNCwgICAiSW52YWxpZCBBU0UgU00gVHJhbnNpdGlvbiJ9LAotICB7MHgwNSwgICAiSW52YWxpZCBBU0UgRGlyZWN0aW9uIn0sCi0gIHsweDA2LCAgICJVbiBTdXBwb3J0ZWQgQXVkaW8gQ2FwYWJpbGl0aWVzIn0sCi0gIHsweDA3LCAgICJVbiBTdXBwb3J0ZWQgQ29uZmlnIFBhcmFtIn0sCi0gIHsweDA4LCAgICJSZWplY3RlZCBDb25maWcgUGFyYW0ifSwKLSAgezB4MDksICAgIkludmFsaWQgQ29uZmlnIFBhcmFtIn0sCi0gIHsweDBBLCAgICJVbiBTdXBwb3J0ZWQgTWV0YWRhdGEifSwKLSAgezB4MEIsICAgIlJlamVjdGVkIE1ldGFkYXRhIn0sCi0gIHsweDBDLCAgICJJbnZhbGlkIE1ldGFkYXRhIn0sCi0gIHsweDBELCAgICJJblN1ZmZpY2llbnQgUmVzb3VyY2VzIn0sCi0gIHsweDBFLCAgICJVbnNwZWNpZmllZCBFcnJvciJ9LAotfTsKLQotc3RkOjptYXA8dWludDhfdCwgc3RkOjpzdHJpbmc+IHJlYXNvbl9jb2RlcyA9IHsKLSAgezB4MDEsICAgIkNvZGVjIElEIn0sCi0gIHsweDAyLCAgICJDb2RlYyBTcGVjaWZpYyBDb25maWcifSwKLSAgezB4MDMsICAgIlNEVSBJbnRlcnZhbCJ9LAotICB7MHgwNCwgICAiRnJhbWluZyJ9LAotICB7MHgwNSwgICAiUEhZIn0sCi0gIHsweDA2LCAgICJNYXhpbXVtIFNEVSBTaXplIn0sCi0gIHsweDA3LCAgICJSVE4ifSwKLSAgezB4MDgsICAgIk1UTCJ9LAotICB7MHgwOSwgICAiUEQifSwKLSAgezB4MEEsICAgIkludmFsaWQgQVNFIENJUyBNYXBwaW5nIn0sCi19OwotCi1zdGQ6OnZlY3RvcjxBc2VQYXJhbXM+IHNpbmtfYXNlX3ZhbHVlX2xpc3QsIHNyY19hc2VfdmFsdWVfbGlzdDsKLUFzZVBhcmFtcyBhc2U7Ci0KLXN0cnVjdCBBc2NzRGV2aWNlIHsKLSAgUmF3QWRkcmVzcyBhZGRyZXNzOwotICAvKiBUaGlzIGlzIHRydWUgb25seSBkdXJpbmcgZmlyc3QgY29ubmVjdGlvbiB0byBwcm9maWxlLCB1bnRpbCB3ZSBzdG9yZSB0aGUKLSAgICogZGV2aWNlICovCi0gIGJvb2wgZmlyc3RfY29ubmVjdGlvbjsKLSAgYm9vbCBzZXJ2aWNlX2NoYW5nZWRfcmN2ZDsKLQotICB1aW50MTZfdCBjb25uX2lkOwotICBzdGQ6OnZlY3RvcjxBc2U+IHNpbmtfYXNlX2xpc3Q7Ci0gIHN0ZDo6dmVjdG9yPEFzZT4gc3JjX2FzZV9saXN0OwotICB1aW50MTZfdCBhc2VfY3BfaGFuZGxlOwotICB1aW50MTZfdCBhc2VfY3BfY2NjX2hhbmRsZTsKLSAgdWludDE2X3Qgc3J2X2NoYW5nZWRfY2NjX2hhbmRsZTsKLSAgYm9vbCBkaXNjb3ZlcnlfY29tcGxldGVkOwotICB1aW50OF90IG51bV9hc2VzX3JlYWQ7Ci0gIGJvb2wgbm90aWZpY2F0aW9uc19lbmFibGVkOwotICBEZXZTdGF0ZSBzdGF0ZTsKLSAgYm9vbCBpc19jb25nZXN0ZWQ7Ci0gIHN0ZDo6dmVjdG9yPFByb2ZpbGVPcGVyYXRpb24+IHByb2ZpbGVfcXVldWU7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb25uZWN0ZWRfY2xpZW50X2xpc3Q7IC8vbGlzdCBjbGllbnQgcmVxdWVzdGVkIGZvciBjb25uZWN0aW9uCi0gIEFzY3NEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgOiBhZGRyZXNzKGFkZHJlc3MpIHt9Ci19OwotCi1jbGFzcyBBc2NzRGV2aWNlcyB7Ci0gcHVibGljOgotICB2b2lkIEFkZChBc2NzRGV2aWNlIGRldmljZSkgewotICAgIGlmIChGaW5kQnlBZGRyZXNzKGRldmljZS5hZGRyZXNzKSAhPSBudWxscHRyKSByZXR1cm47Ci0KLSAgICBkZXZpY2VzLnB1c2hfYmFjayhkZXZpY2UpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIGZvciAoYXV0byBpdCA9IGRldmljZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlcy5lbmQoKTspIHsKLSAgICAgIGlmIChpdC0+YWRkcmVzcyAhPSBhZGRyZXNzKSB7Ci0gICAgICAgICsraXQ7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpdCA9IGRldmljZXMuZXJhc2UoaXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIEFzY3NEZXZpY2UqIEZpbmRCeUFkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXZpY2VzLmJlZ2luKCksIGRldmljZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYWRkcmVzc10oY29uc3QgQXNjc0RldmljZSYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5hZGRyZXNzID09IGFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgcmV0dXJuIChpdGVyID09IGRldmljZXMuZW5kKCkpID8gbnVsbHB0ciA6ICYoKml0ZXIpOwotICB9Ci0KLSAgQXNjc0RldmljZSogRmluZEJ5Q29ubklkKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2aWNlcy5iZWdpbigpLCBkZXZpY2VzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNvbm5faWRdKGNvbnN0IEFzY3NEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuY29ubl9pZCA9PSBjb25uX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKGRldmljZXMuc2l6ZSgpKTsgfQotCi0gIHN0ZDo6dmVjdG9yPEFzY3NEZXZpY2U+IGRldmljZXM7Ci19OwotCi1jbGFzcyBBc2NzQ2xpZW50SW1wbCA6IHB1YmxpYyBBc2NzQ2xpZW50IHsKLSBwdWJsaWM6Ci0gIH5Bc2NzQ2xpZW50SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBBc2NzQ2xpZW50SW1wbCgpIDogZ2F0dF9jbGllbnRfaWQoQlRBX0dBVFRTX0lOVkFMSURfSUYpIHt9OwotCi0gIGJvb2wgUmVnaXN0ZXIoQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2spIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8IGNhbGxiYWNrOwotICAgIC8vIGxvb2tzIGZvciBjbGllbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkCi0gICAgYm9vbCBpc19jbGllbnRfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgIGZvciAoYXV0byBpdCA6IGNhbGxiYWNrcykgewotICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqcGFjX2NhbGxiYWNrID0gaXQuc2Vjb25kOwotICAgICAgaWYoY2FsbGJhY2sgPT0gcGFjX2NhbGxiYWNrKSB7Ci0gICAgICAgIGlzX2NsaWVudF9yZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDsKLQotICAgIGlmKGlzX2NsaWVudF9yZWdpc3RlcmVkKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICIgYWxyZWFkeSByZWdpc3RlcmVkIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZihnYXR0X2NsaWVudF9pZCA9PSBCVEFfR0FUVFNfSU5WQUxJRF9JRikgewotICAgICAgQlRBX0dBVFRDX0FwcFJlZ2lzdGVyKAotICAgICAgICBhc2NzX2dhdHRjX2NhbGxiYWNrLAotICAgICAgICBiYXNlOjpCaW5kKAotICAgICAgICAgIFtdKEFzY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrLCB1aW50OF90IGNsaWVudF9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbid0IHN0YXJ0IEFTQ1MgcHJvZmlsZSAtIG5vIGdhdHQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRzIGxlZnQhIjsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICIgQVNDUyBnYXR0X2NsaWVudF9pZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbnN0YW5jZS0+Z2F0dF9jbGllbnRfaWQ7Ci0gICAgICAgICAgICAgIGluc3RhbmNlLT5nYXR0X2NsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgICAgICAgICAgICAgaW5zdGFuY2UtPmNhbGxiYWNrcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsraW5zdGFuY2UtPmFzY3NfY2xpZW50X2lkLCBjYWxsYmFjaykpOwotICAgICAgICAgICAgICBjYWxsYmFjay0+T25Bc2NzSW5pdGlhbGl6ZWQoMCwgaW5zdGFuY2UtPmFzY3NfY2xpZW50X2lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9LAotICAgICAgICAgIGNhbGxiYWNrKSwgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluc3RhbmNlLT5jYWxsYmFja3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICArK2luc3RhbmNlLT5hc2NzX2NsaWVudF9pZCwgY2FsbGJhY2spKTsKLSAgICAgIGNhbGxiYWNrLT5PbkFzY3NJbml0aWFsaXplZCgwLCBpbnN0YW5jZS0+YXNjc19jbGllbnRfaWQpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgRGVyZWdpc3RlciAodWludDE2X3QgY2xpZW50X2lkKSB7Ci0gICAgYm9vbCBzdGF0dXMgPSBmYWxzZTsKLSAgICBhdXRvIGl0ID0gY2FsbGJhY2tzLmZpbmQoY2xpZW50X2lkKTsKLSAgICBpZiAoaXQgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICBjYWxsYmFja3MuZXJhc2UoaXQpOwotICAgICAgaWYoY2FsbGJhY2tzLmVtcHR5KCkpIHsKLSAgICAgICAvLyBkZXJlZ2lzdGVyIHdpdGggR0FUVAotICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIEdhdHQgZGUtcmVnaXN0ZXIgZnJvbSBhc2NzIjsKLSAgICAgICBCVEFfR0FUVENfQXBwRGVyZWdpc3RlcihnYXR0X2NsaWVudF9pZCk7Ci0gICAgICAgZ2F0dF9jbGllbnRfaWQgPSBCVEFfR0FUVFNfSU5WQUxJRF9JRjsKLSAgICAgIH0KLSAgICAgIHN0YXR1cyA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICB1aW50OF90IEdldENsaWVudENvdW50ICgpIHsKLSAgICByZXR1cm4gY2FsbGJhY2tzLnNpemUoKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QpIG92ZXJyaWRlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3M7Ci0gICAgQXNjc0RldmljZSAqZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBQcm9maWxlT3BlcmF0aW9uIG9wOwotICAgIG9wLmNsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgICBvcC50eXBlID0gUHJvZmxlT1A6OkNPTk5FQ1Q7Ci0KLSAgICBpZihkZXYgPT0gbnVsbHB0cikgewotICAgICAgQXNjc0RldmljZSBwYWNfZGV2KGFkZHJlc3MpOwotICAgICAgYXNjc0RldmljZXMuQWRkKHBhY19kZXYpOwotICAgICAgZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICB9Ci0gICAgaWYgKGRldiA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJkZXYgaXMgbnVsbCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoKGRldi0+c3RhdGUpIHsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OklETEU6IHsKLSAgICAgICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9jbGllbnRfaWQsIGFkZHJlc3MsIGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1RSQU5TUE9SVF9MRSwgZmFsc2UpOwotICAgICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OkNPTk5FQ1RJTkc7Ci0gICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5wdXNoX2JhY2sob3ApOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OkNPTk5FQ1RJTkc6IHsKLSAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLnB1c2hfYmFjayhvcCk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVEVEOiB7Ci0gICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2xpZW50X2lkXSh1aW50MTZfdCBpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZCA9PSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgIGlmKGl0ZXIgPT0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCkpCi0gICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QucHVzaF9iYWNrKGNsaWVudF9pZCk7Ci0KLSAgICAgICAgYXV0byBpdCA9IGNhbGxiYWNrcy5maW5kKGNsaWVudF9pZCk7Ci0gICAgICAgIGlmIChpdCAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICBBc2NzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgY2FsbGJhY2stPk9uQ29ubmVjdGlvblN0YXRlKGFkZHJlc3MsIEdhdHRTdGF0ZTo6Q09OTkVDVEVEKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OkRJU0NPTk5FQ1RJTkc6IHsKLSAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLnB1c2hfYmFjayhvcCk7Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3M7Ci0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFByb2ZpbGVPcGVyYXRpb24gb3A7Ci0gICAgb3AuY2xpZW50X2lkID0gY2xpZW50X2lkOwotICAgIG9wLnR5cGUgPSBQcm9mbGVPUDo6RElTQ09OTkVDVDsKLQotICAgIHN3aXRjaChkZXYtPnN0YXRlKSB7Ci0gICAgICBjYXNlIERldlN0YXRlOjpDT05ORUNUSU5HOiB7Ci0gICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZjbGllbnRfaWRdKCBQcm9maWxlT3BlcmF0aW9uIGVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoZW50cnkudHlwZSA9PSBQcm9mbGVPUDo6Q09OTkVDVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LmNsaWVudF9pZCA9PSBjbGllbnRfaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIC8vIElmIGl0IGlzIHRoZSBsYXN0IGNsaWVudCByZXF1ZXN0ZWQgZm9yIGRpc2Nvbm5lY3QKLSAgICAgICAgaWYoaXRlciAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCkgJiYKLSAgICAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgaWYgKGRldi0+Y29ubl9pZCkgewotICAgICAgICAgICAgLy8gUmVtb3ZlcyBhbGwgcmVnaXN0cmF0aW9ucyBmb3IgY29ubmVjdGlvbi4KLSAgICAgICAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKGRldi0+Y29ubl9pZCwgYWRkcmVzcywgZmFsc2UpOwotICAgICAgICAgICAgR2F0dE9wc1F1ZXVlOjpDbGVhbihkZXYtPmNvbm5faWQpOwotICAgICAgICAgICAgQlRBX0dBVFRDX0Nsb3NlKGRldi0+Y29ubl9pZCk7Ci0gICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUucHVzaF9iYWNrKG9wKTsKLSAgICAgICAgICAgIGRldi0+c3RhdGUgPSBEZXZTdGF0ZTo6RElTQ09OTkVDVElORzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGNvbm5lY3Rpb24gcXVldWUgYW5kCi0gICAgICAgICAgICAvLyBtb3ZlIHRoZSBzdGF0ZSB0byBESVNDT05ORUNUSU5HIHRvIGJldHRlciB0cmFjawotICAgICAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLmNsZWFyKCk7Ci0gICAgICAgICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OkRJU0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUucHVzaF9iYWNrKG9wKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY29ubmVjdGlvbiBlbnRyeSBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgIC8vIGFzIHRoZSBzYW1lIGNsaWVudCBoYXMgcmVxdWVzdGVkIGZvciBkaXNjb25uZWN0aW9uCi0gICAgICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5lcmFzZShpdGVyKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OkNPTk5FQ1RFRDogewotICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNsaWVudF9pZF0oIHVpbnQxNl90IHN0b3JlZF9jbGllbnRfaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmVkX2NsaWVudF9pZCA9PSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAvLyBpZiBpdCBpcyB0aGUgbGFzdCBjbGllbnQgcmVxdWVzdGVkIGZvciBkaXNjb25uZWN0aW9uCi0gICAgICAgIGlmKGl0ZXIgIT0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCkgJiYKLSAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3Quc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICBpZiAoZGV2LT5jb25uX2lkKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgICAgICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZGV2LT5jb25uX2lkLCBhZGRyZXNzLCBmYWxzZSk7Ci0gICAgICAgICAgICBHYXR0T3BzUXVldWU6OkNsZWFuKGRldi0+Y29ubl9pZCk7Ci0gICAgICAgICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2LT5jb25uX2lkKTsKLSAgICAgICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5wdXNoX2JhY2sob3ApOwotICAgICAgICAgICAgZGV2LT5zdGF0ZSA9IERldlN0YXRlOjpESVNDT05ORUNUSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyByZW1vdmUgdGhlIGNsaWVudCBmcm9tIGNvbm5lY3RlZF9jbGllbnRfbGlzdAotICAgICAgICAgIGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVyYXNlKGl0ZXIpOwotICAgICAgICAgIC8vIHJlbW92ZSB0aGUgIHBlbmRpbmcgZ2F0dCBvcHMoIG5vdCB0aGUgb25nb2luZyBvbmUgKQotICAgICAgICAgIC8vIGluaXRpYXRlZCBmcm9tIGNsaWVudCB3aGljaCByZXF1ZXN0ZWQgZGlzY29ubmVjdAotICAgICAgICAgIC8vIFRPRE8gYW5kIHNlbmQgY2FsbGJhY2sgYXMgZGlzY29ubmVjdGVkCi0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIERldlN0YXRlOjpESVNDT05ORUNUSU5HOiB7Ci0gICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5wdXNoX2JhY2sob3ApOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU3RhcnREaXNjb3ZlcnkodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3M7Ci0KLSAgICBzd2l0Y2goZGV2LT5zdGF0ZSkgewotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVEVEOiB7Ci0gICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2xpZW50X2lkXSggdWludDE2X3Qgc3RvcmVkX2NsaWVudF9pZCkgewotICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8IGNsaWVudF9pZCA8PCBzdG9yZWRfY2xpZW50X2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZWRfY2xpZW50X2lkID09IGNsaWVudF9pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGllbnQgcHJlc2VudCBpbiB0aGUgY29ubmVjdGVkIGNsaWVudCBsaXN0Ci0gICAgICAgIGlmKGl0ZXIgPT0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCkpIHsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGRpc2NvdmVyeSBpcyBhbHJlYWR5IGZpbmlzaGVkCi0gICAgICAgIC8vIHNlbmQgYmFjayB0aGUgc2FtZSByZXN1bHRzIHRvIHRoZSBvdGhlciBjbGllbnQKLSAgICAgICAgaWYoZGV2LT5kaXNjb3ZlcnlfY29tcGxldGVkICYmIGRldi0+bm90aWZpY2F0aW9uc19lbmFibGVkKSB7Ci0gICAgICAgICAgc2lua19hc2VfdmFsdWVfbGlzdC5jbGVhcigpOwotICAgICAgICAgIHNyY19hc2VfdmFsdWVfbGlzdC5jbGVhcigpOwotICAgICAgICAgIGF1dG8gaXRlciA9IGNhbGxiYWNrcy5maW5kKGNsaWVudF9pZCk7Ci0gICAgICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaXQgOiBkZXYtPnNpbmtfYXNlX2xpc3QpIHsKLSAgICAgICAgICAgICAgbWVtY3B5KCZhc2UsICh2b2lkICopICZpdC5hc2VfcGFyYW1zLCBzaXplb2YoYXNlKSk7Ci0gICAgICAgICAgICAgIHNpbmtfYXNlX3ZhbHVlX2xpc3QucHVzaF9iYWNrKGFzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaXQgOiBkZXYtPnNyY19hc2VfbGlzdCkgewotICAgICAgICAgICAgICBtZW1jcHkoJmFzZSwgKHZvaWQgKikgJml0LmFzZV9wYXJhbXMsIHNpemVvZihhc2UpKTsKLSAgICAgICAgICAgICAgc3JjX2FzZV92YWx1ZV9saXN0LnB1c2hfYmFjayhhc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBc2NzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgICAgIC8vIHNlbmQgb3V0IHRoZSBjYWxsYmFjayBhcyBzZXJ2aWNlIGRpc2NvdmVyeSBjb21wbGV0ZWQKLSAgICAgICAgICAgIGNhbGxiYWNrLT5PblNlYXJjaENvbXBsZXRlKDAsIGRldi0+YWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmtfYXNlX3ZhbHVlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYXNlX3ZhbHVlX2xpc3QpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyByZXNldCBpdAotICAgICAgICBkZXYtPm51bV9hc2VzX3JlYWQgPSAweDAwOwotICAgICAgICBkZXYtPmRpc2NvdmVyeV9jb21wbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgZGV2LT5ub3RpZmljYXRpb25zX2VuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gcXVldWUgdGhlIHJlcXVlc3QgdG8gR0FUVCBxdWV1ZSBtb2R1bGUKLSAgICAgICAgR2F0dE9wc1F1ZXVlOjpTZXJ2aWNlU2VhcmNoKGNsaWVudF9pZCwgZGV2LT5jb25uX2lkLCAmQVNDU19VVUlEKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENvZGVjQ29uZmlnKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZUNvZGVjQ29uZmlnT3A+IGNvZGVjX2NvbmZpZ3MpIHsKLSAgICBBc2NzRGV2aWNlKiBkZXYgPSBhc2NzRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY3RfdmFsOwotICAgIHVpbnQ4X3Qgb3Bjb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4gKEFzZU9wSWQ6OkNPREVDX0NPTkZJRyk7Ci0gICAgdWludDhfdCBudW1fYXNlcyA9IGNvZGVjX2NvbmZpZ3Muc2l6ZSgpOwotICAgIGlmICghZGV2IHx8IChkZXYtPnN0YXRlICE9IERldlN0YXRlOjpDT05ORUNURUQpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEJEIEFkZHIgOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogTnVtIEFTRXMgOiIgPDwgbG9naGV4KG51bV9hc2VzKTsKLQotICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJm9wY29kZSwgJm9wY29kZSArIDEpOwotICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJm51bV9hc2VzLCAmbnVtX2FzZXMgKyAxKTsKLQotICAgIGF1dG8gaXQgPSBjb2RlY19jb25maWdzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGNvZGVjX2NvbmZpZ3MuZW5kKCkpIHsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5hc2VfaWQsICZpdC0+YXNlX2lkICsgMSk7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+dGd0X2xhdGVuY3ksICZpdC0+dGd0X2xhdGVuY3kgKyAxKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT50Z3RfcGh5LCAmaXQtPnRndF9waHkgKyAxKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgaXQtPmNvZGVjX2lkLAotICAgICAgICAgICAgICAgICgodWludDhfdCAqKWl0LT5jb2RlY19pZCkgKyBzaXplb2YoY29kZWNfdHlwZV90KSk7Ci0KLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5jb2RlY19wYXJhbXNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPmNvZGVjX3BhcmFtc19sZW4gKyAxKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgaXQtPmNvZGVjX3BhcmFtcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+Y29kZWNfcGFyYW1zLmVuZCgpKTsKLQotICAgICAgTE9HKElORk8pIDw8ICI6IEFTRSBJZCA9ICIgPDwgbG9naGV4KGl0LT5hc2VfaWQpOwotICAgICAgTE9HKElORk8pIDw8ICI6IFRhcmdldCBMYXRlbmN5ID0gIiA8PCBsb2doZXgoaXQtPnRndF9sYXRlbmN5KTsKLSAgICAgIExPRyhJTkZPKSA8PCAiOiB0YXJnZXQgUGh5ID0gIiA8PCBsb2doZXgoaXQtPnRndF9waHkpOwotICAgICAgTE9HKElORk8pIDw8ICI6IENvZGVjIElEID0gIiA8PCBsb2doZXgoaXQtPmNvZGVjX2lkWzBdKTsKLSAgICAgIGl0Kys7Ci0gICAgfQotCi0gICAgR2F0dE9wc1F1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGNsaWVudF9pZCwgZGV2LT5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmFzZV9jcF9oYW5kbGUsIHZlY3RfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFLCBudWxscHRyLCBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgUW9zQ29uZmlnKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVFvc0NvbmZpZ09wPiBxb3NfY29uZmlncykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjdF92YWw7Ci0gICAgdWludDhfdCBvcGNvZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PiAoQXNlT3BJZDo6UU9TX0NPTkZJRyk7Ci0gICAgdWludDhfdCBudW1fYXNlcyA9IHFvc19jb25maWdzLnNpemUoKTsKLSAgICBpZiAoIWRldiB8fCAoZGV2LT5zdGF0ZSAhPSBEZXZTdGF0ZTo6Q09OTkVDVEVEKSkgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBOdW0gQVNFcyA6IiA8PCBsb2doZXgobnVtX2FzZXMpOwotCi0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmb3Bjb2RlLCAmb3Bjb2RlICsgMSk7Ci0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmbnVtX2FzZXMsICZudW1fYXNlcyArIDEpOwotCi0gICAgYXV0byBpdCA9IHFvc19jb25maWdzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IHFvc19jb25maWdzLmVuZCgpKSB7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+YXNlX2lkLCAmaXQtPmFzZV9pZCArIDEpOwotICAgICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmaXQtPmNpZ19pZCwgJml0LT5jaWdfaWQgKyAxKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5jaXNfaWQsICZpdC0+Y2lzX2lkICsgMSk7Ci0KLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgaXQtPnNkdV9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopaXQtPnNkdV9pbnRlcnZhbCArIHNpemVvZihzZHVfaW50ZXJ2YWxfdCkpOwotCi0gICAgICAvLyB0ZXN0IGNoYW5nZSBpdC0+ZnJhbWluZyA9IDB4RkY7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+ZnJhbWluZywgJml0LT5mcmFtaW5nICsgMSk7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+cGh5LCAmaXQtPnBoeSArIDEpOwotCi0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICh1aW50OF90ICopICZpdC0+bWF4X3NkdV9zaXplLAotICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopJml0LT5tYXhfc2R1X3NpemUgKyBzaXplb2YodWludDE2X3QpKTsKLQotICAgICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmaXQtPnJldHJhbnNfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPnJldHJhbnNfbnVtYmVyICsgMSk7Ci0KLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgKHVpbnQ4X3QgKikgJml0LT50cmFuc19sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopJml0LT50cmFuc19sYXRlbmN5ICsgc2l6ZW9mKHVpbnQxNl90KSk7Ci0KLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgaXQtPnByZXNlbnRfZGVsYXksCi0gICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilpdC0+cHJlc2VudF9kZWxheSArIHNpemVvZihwcmVzZW50YXRpb25fZGVsYXlfdCkpOwotCi0gICAgICBMT0coSU5GTykgPDwgIjogQVNFIElkID0gIiA8PCBsb2doZXgoaXQtPmFzZV9pZCk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogQ2lnIElkID0gIiA8PCBsb2doZXgoaXQtPmNpZ19pZCk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogQ2lzIElkID0gIiA8PCBsb2doZXgoaXQtPmNpc19pZCk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogU0RVIGludGVydmFsID0iCi0gICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChpdC0+c2R1X2ludGVydmFsWzBdKQotICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoaXQtPnNkdV9pbnRlcnZhbFsxXSkKLSAgICAgICAgICAgICAgICA8PCAiICIgPDwgbG9naGV4KGl0LT5zZHVfaW50ZXJ2YWxbMl0pOwotICAgICAgTE9HKElORk8pIDw8ICI6IEZyYW1pbmcgPSAiIDw8IGxvZ2hleChpdC0+ZnJhbWluZyk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogUGh5ID0gIiA8PCBsb2doZXgoaXQtPnBoeSk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogTWF4IFNEVSBzaXplID0gIiA8PCBsb2doZXgoaXQtPm1heF9zZHVfc2l6ZSk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogUlROID0gIiA8PCBsb2doZXgoaXQtPnJldHJhbnNfbnVtYmVyKTsKLSAgICAgIExPRyhJTkZPKSA8PCAiOiBNVEwgPSAiIDw8IGxvZ2hleChpdC0+dHJhbnNfbGF0ZW5jeSk7Ci0gICAgICBMT0coSU5GTykgPDwgIjogUEQgPSIKLSAgICAgICAgICAgICAgICA8PCAiICIgPDwgbG9naGV4KGl0LT5wcmVzZW50X2RlbGF5WzBdKQotICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoaXQtPnByZXNlbnRfZGVsYXlbMV0pCi0gICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChpdC0+cHJlc2VudF9kZWxheVsyXSk7Ci0gICAgICBpdCsrOwotICAgIH0KLQotICAgIEdhdHRPcHNRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjbGllbnRfaWQsIGRldi0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hc2VfY3BfaGFuZGxlLCB2ZWN0X3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gIH0KLQotICB2b2lkIEVuYWJsZSh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VFbmFibGVPcD4gZW5hYmxlX29wcykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjdF92YWw7Ci0gICAgdWludDhfdCBvcGNvZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PiAoQXNlT3BJZDo6RU5BQkxFKTsKLSAgICB1aW50OF90IG51bV9hc2VzID0gZW5hYmxlX29wcy5zaXplKCk7Ci0gICAgaWYgKCFkZXYgfHwgKGRldi0+c3RhdGUgIT0gRGV2U3RhdGU6OkNPTk5FQ1RFRCkpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiRGV2aWNlIG5vdCBjb25uZWN0ZWQgdG8gcHJvZmlsZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEJEIEFkZHIgOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogTnVtIEFTRXMgOiIgPDwgbG9naGV4KG51bV9hc2VzKTsKLQotICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJm9wY29kZSwgJm9wY29kZSArIDEpOwotICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJm51bV9hc2VzLCAmbnVtX2FzZXMgKyAxKTsKLQotICAgIGF1dG8gaXQgPSBlbmFibGVfb3BzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGVuYWJsZV9vcHMuZW5kKCkpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiOiBBU0UgSWQgPSAiIDw8IGxvZ2hleChpdC0+YXNlX2lkKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5hc2VfaWQsICZpdC0+YXNlX2lkICsgMSk7Ci0gICAgICAvLyB0ZXN0IGNoYW5nZSBpdC0+bWV0YV9kYXRhX2xlbiA9IDB4RkY7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+bWV0YV9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0LT5tZXRhX2RhdGFfbGVuICsgMSk7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksIGl0LT5tZXRhX2RhdGEuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm1ldGFfZGF0YS5lbmQoKSk7Ci0gICAgICBpdCsrOwotICAgIH0KLQotICAgIEdhdHRPcHNRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjbGllbnRfaWQsIGRldi0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hc2VfY3BfaGFuZGxlLCB2ZWN0X3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gIH0KLQotICB2b2lkIFN0YXJ0UmVhZHkodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlU3RhcnRSZWFkeU9wPiBzdGFydF9yZWFkeV9vcHMpIHsKLSAgICBBc2NzRGV2aWNlKiBkZXYgPSBhc2NzRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY3RfdmFsOwotICAgIHVpbnQ4X3Qgb3Bjb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4gKEFzZU9wSWQ6OlNUQVJUX1JFQURZKTsKLSAgICB1aW50OF90IG51bV9hc2VzID0gc3RhcnRfcmVhZHlfb3BzLnNpemUoKTsKLSAgICBpZiAoIWRldiB8fCAoZGV2LT5zdGF0ZSAhPSBEZXZTdGF0ZTo6Q09OTkVDVEVEKSkgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBOdW0gQVNFcyA6IiA8PCBsb2doZXgobnVtX2FzZXMpOwotCi0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmb3Bjb2RlLCAmb3Bjb2RlICsgMSk7Ci0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmbnVtX2FzZXMsICZudW1fYXNlcyArIDEpOwotCi0gICAgYXV0byBpdCA9IHN0YXJ0X3JlYWR5X29wcy5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBzdGFydF9yZWFkeV9vcHMuZW5kKCkpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiOiBBU0UgSWQgPSAiIDw8IGxvZ2hleChpdC0+YXNlX2lkKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5hc2VfaWQsICZpdC0+YXNlX2lkICsgMSk7Ci0gICAgICBpdCsrOwotICAgIH0KLQotICAgIEdhdHRPcHNRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjbGllbnRfaWQsIGRldi0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hc2VfY3BfaGFuZGxlLCB2ZWN0X3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gIH0KLQotICB2b2lkIERpc2FibGUodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlRGlzYWJsZU9wPiBkaXNhYmxlX29wcykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjdF92YWw7Ci0gICAgdWludDhfdCBvcGNvZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PiAoQXNlT3BJZDo6RElTQUJMRSk7Ci0gICAgdWludDhfdCBudW1fYXNlcyA9IGRpc2FibGVfb3BzLnNpemUoKTsKLSAgICBpZiAoIWRldiB8fCAoZGV2LT5zdGF0ZSAhPSBEZXZTdGF0ZTo6Q09OTkVDVEVEKSkgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBOdW0gQVNFcyA6IiA8PCBsb2doZXgobnVtX2FzZXMpOwotCi0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmb3Bjb2RlLCAmb3Bjb2RlICsgMSk7Ci0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmbnVtX2FzZXMsICZudW1fYXNlcyArIDEpOwotCi0gICAgYXV0byBpdCA9IGRpc2FibGVfb3BzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGRpc2FibGVfb3BzLmVuZCgpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIjogQVNFIElkID0gIiA8PCBsb2doZXgoaXQtPmFzZV9pZCk7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+YXNlX2lkLCAmaXQtPmFzZV9pZCArIDEpOwotICAgICAgaXQrKzsKLSAgICB9Ci0KLSAgICBHYXR0T3BzUXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMoY2xpZW50X2lkLCBkZXYtPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YXNlX2NwX2hhbmRsZSwgdmVjdF92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEUsIG51bGxwdHIsIG51bGxwdHIpOwotICB9Ci0KLSAgdm9pZCBTdG9wUmVhZHkodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlU3RvcFJlYWR5T3A+IHN0b3BfcmVhZHlfb3BzKSB7Ci0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWN0X3ZhbDsKLSAgICB1aW50OF90IG9wY29kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+IChBc2VPcElkOjpTVE9QX1JFQURZKTsKLSAgICB1aW50OF90IG51bV9hc2VzID0gc3RvcF9yZWFkeV9vcHMuc2l6ZSgpOwotICAgIGlmICghZGV2IHx8IChkZXYtPnN0YXRlICE9IERldlN0YXRlOjpDT05ORUNURUQpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBCRCBBZGRyIDogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IE51bSBBU0VzIDoiIDw8IGxvZ2hleChudW1fYXNlcyk7Ci0KLSAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZvcGNvZGUsICZvcGNvZGUgKyAxKTsKLSAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZudW1fYXNlcywgJm51bV9hc2VzICsgMSk7Ci0KLSAgICBhdXRvIGl0ID0gc3RvcF9yZWFkeV9vcHMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0gc3RvcF9yZWFkeV9vcHMuZW5kKCkpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiOiBBU0UgSWQgPSAiIDw8IGxvZ2hleChpdC0+YXNlX2lkKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5hc2VfaWQsICZpdC0+YXNlX2lkICsgMSk7Ci0gICAgICBpdCsrOwotICAgIH0KLQotICAgIEdhdHRPcHNRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjbGllbnRfaWQsIGRldi0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hc2VfY3BfaGFuZGxlLCB2ZWN0X3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gIH0KLQotICB2b2lkIFJlbGVhc2UodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUmVsZWFzZU9wPiByZWxlYXNlX29wcykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjdF92YWw7Ci0gICAgdWludDhfdCBvcGNvZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PiAoQXNlT3BJZDo6UkVMRUFTRSk7Ci0gICAgdWludDhfdCBudW1fYXNlcyA9IHJlbGVhc2Vfb3BzLnNpemUoKTsKLSAgICBpZiAoIWRldiB8fCAoZGV2LT5zdGF0ZSAhPSBEZXZTdGF0ZTo6Q09OTkVDVEVEKSkgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBOdW0gQVNFcyA6IiA8PCBsb2doZXgobnVtX2FzZXMpOwotCi0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmb3Bjb2RlLCAmb3Bjb2RlICsgMSk7Ci0gICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmbnVtX2FzZXMsICZudW1fYXNlcyArIDEpOwotCi0gICAgYXV0byBpdCA9IHJlbGVhc2Vfb3BzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IHJlbGVhc2Vfb3BzLmVuZCgpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIjogQVNFIElkID0gIiA8PCBsb2doZXgoaXQtPmFzZV9pZCk7Ci0gICAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZpdC0+YXNlX2lkLCAmaXQtPmFzZV9pZCArIDEpOwotICAgICAgaXQrKzsKLSAgICB9Ci0KLSAgICBHYXR0T3BzUXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMoY2xpZW50X2lkLCBkZXYtPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YXNlX2NwX2hhbmRsZSwgdmVjdF92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEUsIG51bGxwdHIsIG51bGxwdHIpOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVTdHJlYW0odWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VVcGRhdGVNZXRhZGF0YU9wPiBtZXRhZGF0YV9vcHMpIHsKLSAgICBBc2NzRGV2aWNlKiBkZXYgPSBhc2NzRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY3RfdmFsOwotICAgIHVpbnQ4X3Qgb3Bjb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4gKEFzZU9wSWQ6OlVQREFURV9NRVRBX0RBVEEpOwotICAgIHVpbnQ4X3QgbnVtX2FzZXMgPSBtZXRhZGF0YV9vcHMuc2l6ZSgpOwotICAgIGlmICghZGV2IHx8IChkZXYtPnN0YXRlICE9IERldlN0YXRlOjpDT05ORUNURUQpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBCRCBBZGRyIDogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IE51bSBBU0VzIDoiIDw8IGxvZ2hleChudW1fYXNlcyk7Ci0KLSAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZvcGNvZGUsICZvcGNvZGUgKyAxKTsKLSAgICB2ZWN0X3ZhbC5pbnNlcnQodmVjdF92YWwuZW5kKCksICZudW1fYXNlcywgJm51bV9hc2VzICsgMSk7Ci0KLSAgICBhdXRvIGl0ID0gbWV0YWRhdGFfb3BzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IG1ldGFkYXRhX29wcy5lbmQoKSkgewotICAgICAgTE9HKElORk8pIDw8ICI6IEFTRSBJZCA9ICIgPDwgbG9naGV4KGl0LT5hc2VfaWQpOwotICAgICAgdmVjdF92YWwuaW5zZXJ0KHZlY3RfdmFsLmVuZCgpLCAmaXQtPmFzZV9pZCwgJml0LT5hc2VfaWQgKyAxKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgJml0LT5tZXRhX2RhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPm1ldGFfZGF0YV9sZW4gKyAxKTsKLSAgICAgIHZlY3RfdmFsLmluc2VydCh2ZWN0X3ZhbC5lbmQoKSwgaXQtPm1ldGFfZGF0YS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bWV0YV9kYXRhLmVuZCgpKTsKLSAgICAgIGl0Kys7Ci0gICAgfQotCi0gICAgR2F0dE9wc1F1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGNsaWVudF9pZCwgZGV2LT5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmFzZV9jcF9oYW5kbGUsIHZlY3RfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFLCBudWxscHRyLCBudWxscHRyKTsKLSAgfQotCi0gIGJvb2wgR2V0QXNlUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3QgYXNlX2lkLAotICAgICAgICAgICAgICAgICAgICBBc2VQYXJhbXMgKmFzZV9wYXJhbXMpIHsKLSAgICBib29sIGFzZV9mb3VuZCA9IGZhbHNlOwotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiRGV2aWNlIG5vdCBjb25uZWN0ZWQgdG8gcHJvZmlsZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBmaXJzdCBsb29rIGZvciBzaW5rIEFTRXMKLSAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnNpbmtfYXNlX2xpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgICAgaXQgIT0gZGV2LT5zaW5rX2FzZV9saXN0LmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoaXQtPmFzZV9wYXJhbXMuYXNlX2lkID09IGFzZV9pZCkgewotICAgICAgICAqYXNlX3BhcmFtcyA9IGl0LT5hc2VfcGFyYW1zOwotICAgICAgICBhc2VfZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYoYXNlX2ZvdW5kKSByZXR1cm4gYXNlX2ZvdW5kOwotCi0gICAgZm9yIChhdXRvIGl0ID0gZGV2LT5zcmNfYXNlX2xpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgICAgaXQgIT0gZGV2LT5zcmNfYXNlX2xpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgIGlmIChpdC0+YXNlX3BhcmFtcy5hc2VfaWQgPT0gYXNlX2lkKSB7Ci0gICAgICAgICphc2VfcGFyYW1zID0gaXQtPmFzZV9wYXJhbXM7Ci0gICAgICAgIGFzZV9mb3VuZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXNlX2ZvdW5kOwotICB9Ci0KLSAgYm9vbCBHZXRBc2VIYW5kbGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBhc2VfaWQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICphc2VfaGFuZGxlKSB7Ci0gICAgYm9vbCBhc2VfZm91bmQgPSBmYWxzZTsKLSAgICBBc2NzRGV2aWNlKiBkZXYgPSBhc2NzRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gZmlyc3QgbG9vayBmb3Igc2luayBBU0VzCi0gICAgZm9yIChhdXRvIGl0ID0gZGV2LT5zaW5rX2FzZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGl0ICE9IGRldi0+c2lua19hc2VfbGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgaWYgKGl0LT5hc2VfcGFyYW1zLmFzZV9pZCA9PSBhc2VfaWQpIHsKLSAgICAgICAgKmFzZV9oYW5kbGUgPSBpdC0+YXNlX2hhbmRsZTsKLSAgICAgICAgYXNlX2ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmKGFzZV9mb3VuZCkgcmV0dXJuIGFzZV9mb3VuZDsKLQotICAgIGZvciAoYXV0byBpdCA9IGRldi0+c3JjX2FzZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGl0ICE9IGRldi0+c3JjX2FzZV9saXN0LmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoaXQtPmFzZV9wYXJhbXMuYXNlX2lkID09IGFzZV9pZCkgewotICAgICAgICAqYXNlX2hhbmRsZSA9IGl0LT5hc2VfaGFuZGxlOwotICAgICAgICBhc2VfZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFzZV9mb3VuZDsKLSAgfQotCi0gIHZvaWQgR2V0QXNlU3RhdGUodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXNlX2lkKSB7Ci0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3M7Ci0KLSAgICBzd2l0Y2goZGV2LT5zdGF0ZSkgewotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVEVEOiB7Ci0gICAgICAgIHVpbnQxNl90IGFzZV9oYW5kbGU7Ci0gICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2xpZW50X2lkXSggdWludDE2X3Qgc3RvcmVkX2NsaWVudF9pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZWRfY2xpZW50X2lkID09IGNsaWVudF9pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGllbnQgcHJlc2VudCBpbiB0aGUgY29ubmVjdGVkIGNsaWVudCBsaXN0Ci0gICAgICAgIGlmKGl0ZXIgPT0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCkpIHsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZGlzY292ZXJ5IGlzIGFscmVhZHkgZmluaXNoZWQKLSAgICAgICAgLy8gc2VuZCBiYWNrIHRoZSBzYW1lIHJlc3VsdHMgdG8gdGhlIG90aGVyIGNsaWVudAotICAgICAgICBpZihkZXYtPmRpc2NvdmVyeV9jb21wbGV0ZWQgJiYgZGV2LT5ub3RpZmljYXRpb25zX2VuYWJsZWQpIHsKLSAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChjbGllbnRfaWQpOwotICAgICAgICAgIEFzZVBhcmFtcyBhc2VfcGFyYW1zOwotICAgICAgICAgIGlmKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpICYmCi0gICAgICAgICAgICAgR2V0QXNlUGFyYW1zKGFkZHJlc3MsIGFzZV9pZCwgJmFzZV9wYXJhbXMpKSB7Ci0gICAgICAgICAgICBBc2NzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5PbkFzZVN0YXRlKGRldi0+YWRkcmVzcywgYXNlX3BhcmFtcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoR2V0QXNlSGFuZGxlKGFkZHJlc3MsIGFzZV9pZCwgJmFzZV9oYW5kbGUpKSB7Ci0gICAgICAgICAgLy8gcXVldWUgdGhlIHJlcXVlc3QgdG8gR0FUVCBxdWV1ZSBtb2R1bGUKLSAgICAgICAgICBHYXR0T3BzUXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyhjbGllbnRfaWQsIGRldi0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2VfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFzY3NDbGllbnRJbXBsOjpPblJlYWRBc2VTdGF0ZVN0YXRpYywgbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgInVuLWhhbmRsZWQgZXZlbnQiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uR2F0dENvbm5lY3RlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBjbGllbnRfaWYsIFJhd0FkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0LCB1aW50MTZfdCBtdHUpIHsKLQotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIC8qIFdoZW4gZGV2aWNlIGlzIHF1aWNrbHkgZGlzYWJsZWQgYW5kIGVuYWJsZWQgaW4gc2V0dGluZ3MsIHRoaXMgY2FzZQotICAgICAgICogbWlnaHQgaGFwcGVuICovCi0gICAgICBMT0coRVJST1IpIDw8ICJDbG9zaW5nIGNvbm5lY3Rpb24gdG8gbm9uIGFzY3MgZGV2aWNlLCBhZGRyZXNzPSIKLSAgICAgICAgICAgICAgICAgICA8PCBhZGRyZXNzOwotICAgICAgQlRBX0dBVFRDX0Nsb3NlKGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBTdGF0dXMgOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotCi0gICAgaWYoZGV2LT5zdGF0ZSA9PSBEZXZTdGF0ZTo6Q09OTkVDVElORykgewotICAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gQVNDUyBkZXZpY2UiOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICAgIGlmKGl0LT50eXBlID09IFByb2ZsZU9QOjpDT05ORUNUKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoaXQtPmNsaWVudF9pZCk7Ci0gICAgICAgICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICAgIGNhbGxiYWNrLT5PbkNvbm5lY3Rpb25TdGF0ZShhZGRyZXNzLCBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUuZXJhc2UoaXQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpdCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OklETEU7Ci0gICAgICAgIGFzY3NEZXZpY2VzLlJlbW92ZShhZGRyZXNzKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0gZWxzZSBpZihkZXYtPnN0YXRlID09IERldlN0YXRlOjpESVNDT05ORUNUSU5HKSB7Ci0gICAgICAvLyBUT0RPIHdpbGwgdGhpcyBoYXBwZW5zID8KLSAgICAgIC8vIGl0IGNvdWxkIGhhdmUgY2FsbGVkIHRoZSBjYW5jZWwgb3BlbiB0byBleHBlY3QgdGhlCi0gICAgICAvLyBvcGVuIGNhbmNlbGxlZCBldmVudAotICAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gQVNDUyBkZXZpY2UiOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICAgIGlmKGl0LT50eXBlID09IFByb2ZsZU9QOjpESVNDT05ORUNUKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoaXQtPmNsaWVudF9pZCk7Ci0gICAgICAgICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICAgIGNhbGxiYWNrLT5PbkNvbm5lY3Rpb25TdGF0ZShhZGRyZXNzLCBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUuZXJhc2UoaXQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpdCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OklETEU7Ci0gICAgICAgIGFzY3NEZXZpY2VzLlJlbW92ZShhZGRyZXNzKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZ2F0dCBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgIC8vIGlmIHRoZSBkaXNjb25uZWN0IGVudHJ5IGlzIGZvdW5kIHdlIG5lZWQgdG8gaW5pdGlhdGUgdGhlCi0gICAgICAgIC8vIGdhdHQgZGlzY29ubmVjdC4gbWF5IGJlIGEgcmFjZSBjb25kaXRpb24ganVzdCBhZnRlciBzZW5kaW5nCi0gICAgICAgIC8vIGNhbmNlbCBvcGVuIGdhdHQgY29ubmVjdGVkIGV2ZW50IHJlY2VpdmVkCi0gICAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+cHJvZmlsZV9xdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCk7KSB7Ci0gICAgICAgICAgaWYoaXQtPnR5cGUgPT0gUHJvZmxlT1A6OkRJU0NPTk5FQ1QpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChpdC0+Y2xpZW50X2lkKTsKLSAgICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgICAgICAgICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbihkZXYtPmNvbm5faWQsIGFkZHJlc3MsIGZhbHNlKTsKLSAgICAgICAgICAgICAgR2F0dE9wc1F1ZXVlOjpDbGVhbihkZXYtPmNvbm5faWQpOwotICAgICAgICAgICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2LT5jb25uX2lkKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGl0Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gcmV0dXJuIHVuY29uZGl0aW5hbGx5Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gc3VjY2VzcyBzY2VuYXJpbyBjb2RlCi0gICAgZGV2LT5jb25uX2lkID0gY29ubl9pZDsKLQotICAgIHRBQ0xfQ09OTiogcF9hY2wgPSBidG1fYmRhX3RvX2FjbChhZGRyZXNzLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgIGlmIChwX2FjbCAhPSBudWxscHRyICYmCi0gICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfMm1fcGh5KCkgJiYKLSAgICAgICAgSENJX0xFXzJNX1BIWV9TVVBQT1JURUQocF9hY2wtPnBlZXJfbGVfZmVhdHVyZXMpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgYWRkcmVzcyA8PCAiIHNldCBwcmVmZXJyZWQgUEhZIHRvIDJNIjsKLSAgICAgIEJUTV9CbGVTZXRQaHkoYWRkcmVzcywgUEhZX0xFXzJNLCBQSFlfTEVfMk0sIDApOwotICAgIH0KLQotICAgIC8qIHZlcmlmeSBib25kICovCi0gICAgdWludDhfdCBzZWNfZmxhZyA9IDA7Ci0gICAgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChhZGRyZXNzLCAmc2VjX2ZsYWcsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgICBpZiAoc2VjX2ZsYWcgJiBCVE1fU0VDX0ZMQUdfRU5DUllQVEVEKSB7Ci0gICAgICAvKiBpZiBsaW5rIGhhcyBiZWVuIGVuY3J5cHRlZCAqLwotICAgICAgT25FbmNyeXB0aW9uQ29tcGxldGUoYWRkcmVzcywgdHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHNlY19mbGFnICYgQlRNX1NFQ19GTEFHX0xLRVlfS05PV04pIHsKLSAgICAgIC8qIGlmIGJvbmRlZCBhbmQgbGluayBub3QgZW5jcnlwdGVkICovCi0gICAgICBzZWNfZmxhZyA9IEJUTV9CTEVfU0VDX0VOQ1JZUFQ7Ci0gICAgICBMT0coV0FSTklORykgPDwgInRyeWluZyB0byBlbmNyeXB0IG5vdyI7Ci0gICAgICBCVE1fU2V0RW5jcnlwdGlvbihhZGRyZXNzLCBCVEFfVFJBTlNQT1JUX0xFLCBlbmNyeXB0aW9uX2NhbGxiYWNrLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VjX2ZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG90aGVyd2lzZSBsZXQgaXQgZ28gdGhyb3VnaCAqLwotICAgIE9uRW5jcnlwdGlvbkNvbXBsZXRlKGFkZHJlc3MsIHRydWUpOwotICB9Ci0KLSAgdm9pZCBPbkdhdHREaXNjb25uZWN0ZWQodEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfSUYgY2xpZW50X2lmLCBSYXdBZGRyZXNzIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9SRUFTT04gcmVhc29uKSB7Ci0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhyZW1vdGVfYmRhKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UgZGlzY29ubmVjdCwgY29ubl9pZD0iCi0gICAgICAgICAgICAgICAgIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgcmVtb3RlX2JkYQotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBTdGF0dXMgOiAiIDw8IGxvZ2hleChzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0YXRlOiAiIDw8IHN0YXRpY19jYXN0PGludD4oZGV2LT5zdGF0ZSk7Ci0KLSAgICBzd2l0Y2goZGV2LT5zdGF0ZSkgewotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVElORzogewotICAgICAgICAvLyBzdWRkZW4gZGlzY29ubmVjdGlvbgotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICAgIGlmKGl0LT50eXBlID09IFByb2ZsZU9QOjpDT05ORUNUKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoaXQtPmNsaWVudF9pZCk7Ci0gICAgICAgICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICAgIGNhbGxiYWNrLT5PbkNvbm5lY3Rpb25TdGF0ZShyZW1vdGVfYmRhLCBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdCA9IGRldi0+cHJvZmlsZV9xdWV1ZS5lcmFzZShpdCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGl0Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVEVEOiB7Ci0gICAgICAgIC8vIHN1ZGRlbiBkaXNjb25uZWN0aW9uCi0gICAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVuZCgpOykgewotICAgICAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoKml0KTsKLSAgICAgICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICAgIEFzY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrID0gaXRlci0+c2Vjb25kOwotICAgICAgICAgICAgY2FsbGJhY2stPk9uQ29ubmVjdGlvblN0YXRlKHJlbW90ZV9iZGEsIEdhdHRTdGF0ZTo6RElTQ09OTkVDVEVEKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaXQgPSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5lcmFzZShpdCk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIERldlN0YXRlOjpESVNDT05ORUNUSU5HOiB7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+cHJvZmlsZV9xdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCk7KSB7Ci0gICAgICAgICAgaWYoaXQtPnR5cGUgPT0gUHJvZmxlT1A6OkRJU0NPTk5FQ1QpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChpdC0+Y2xpZW50X2lkKTsKLSAgICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgICBBc2NzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgICAgICAgY2FsbGJhY2stPk9uQ29ubmVjdGlvblN0YXRlKHJlbW90ZV9iZGEsIEdhdHRTdGF0ZTo6RElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ID0gZGV2LT5wcm9maWxlX3F1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5lbmQoKTspIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgIGl0ID0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIHF1ZXVlIGlzIG5vdCBlbXB0eQotICAgICAgICAvLyBpZiBub3QgaW5pdGlhdGUgdGhlIEdhdHQgY29ubmVjdGlvbgotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChkZXYtPmNvbm5faWQpIHsKLSAgICAgIEdhdHRPcHNRdWV1ZTo6Q2xlYW4oZGV2LT5jb25uX2lkKTsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShkZXYtPmNvbm5faWQpOwotICAgICAgZGV2LT5jb25uX2lkID0gMDsKLSAgICB9Ci0KLSAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OklETEU7Ci0gICAgYXNjc0RldmljZXMuUmVtb3ZlKHJlbW90ZV9iZGEpOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25VcGRhdGVDb21wbGV0ZSh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgICBBc2NzRGV2aWNlKiBkZXYgPSBhc2NzRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25FbmNyeXB0aW9uQ29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBzdWNjZXNzKSB7Ci0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoZGV2LT5zdGF0ZSAhPSBEZXZTdGF0ZTo6Q09OTkVDVElORykgewotICAgICAgTE9HKEVSUk9SKSA8PCAicmVjZWl2ZWQgaW4gd3Jvbmcgc3RhdGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEJEIEFkZHIgOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogU3RhdHVzIDogIiA8PCBsb2doZXgoc3VjY2Vzcyk7Ci0KLSAgICAvLyBlbmNyeXB0aW9uIGZhaWxlZAotICAgIGlmICghc3VjY2VzcykgewotICAgICAgZm9yIChhdXRvIGl0ID0gZGV2LT5wcm9maWxlX3F1ZXVlLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCk7KSB7Ci0gICAgICAgIGlmKGl0LT50eXBlID09IFByb2ZsZU9QOjpDT05ORUNUKSB7Ci0gICAgICAgICAgLy8gZ2V0IHRoZSBjYWxsYmFjayBhbmQgdXBkYXRlIHRoZSB1cHBlciBsYXllcnMKLSAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChpdC0+Y2xpZW50X2lkKTsKLSAgICAgICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICAgIEFzY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrID0gaXRlci0+c2Vjb25kOwotICAgICAgICAgICAgY2FsbGJhY2stPk9uQ29ubmVjdGlvblN0YXRlKGFkZHJlc3MsIEdhdHRTdGF0ZTo6RElTQ09OTkVDVEVEKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gY2hhbmdlIHRoZSB0eXBlIHRvIGRpc2Nvbm5lY3QKLSAgICAgICAgICBpdC0+dHlwZSA9IFByb2ZsZU9QOjpESVNDT05ORUNUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGl0Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGRldi0+c3RhdGUgPSBEZXZTdGF0ZTo6RElTQ09OTkVDVElORzsKLSAgICAgIC8vIFJlbW92ZXMgYWxsIHJlZ2lzdHJhdGlvbnMgZm9yIGNvbm5lY3Rpb24uCi0gICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbihkZXYtPmNvbm5faWQsIGFkZHJlc3MsIGZhbHNlKTsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShkZXYtPmNvbm5faWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGRldi0+cHJvZmlsZV9xdWV1ZS5lbmQoKTspIHsKLSAgICAgICAgaWYoaXQtPnR5cGUgPT0gUHJvZmxlT1A6OkNPTk5FQ1QpIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgIGF1dG8gaXRlciA9IGNhbGxiYWNrcy5maW5kKGl0LT5jbGllbnRfaWQpOwotICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QucHVzaF9iYWNrKGl0LT5jbGllbnRfaWQpOwotICAgICAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICBjYWxsYmFjay0+T25Db25uZWN0aW9uU3RhdGUoYWRkcmVzcywgR2F0dFN0YXRlOjpDT05ORUNURUQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGl0Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGRldi0+c3RhdGUgPSBEZXZTdGF0ZTo6Q09OTkVDVEVEOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlQ2hhbmdlRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYWRkcmVzcz0iIDw8IGFkZHJlc3M7Ci0gICAgZGV2LT5maXJzdF9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICBkZXYtPnNlcnZpY2VfY2hhbmdlZF9yY3ZkID0gdHJ1ZTsKLSAgICBHYXR0T3BzUXVldWU6OkNsZWFuKGRldi0+Y29ubl9pZCk7Ci0gIH0KLQotICB2b2lkIE9uU2VydmljZURpc2NEb25lRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZGV2LT5zZXJ2aWNlX2NoYW5nZWRfcmN2ZCkgewotICAgICAgLy8gcXVldWUgdGhlIHJlcXVlc3QgdG8gR0FUVCBxdWV1ZSBtb2R1bGUgd2l0aCBkdW1tdSBjbGllbnQgaWQKLSAgICAgIEdhdHRPcHNRdWV1ZTo6U2VydmljZVNlYXJjaCgwWEZGLCBkZXYtPmNvbm5faWQsICZBU0NTX1VVSUQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlU2VhcmNoQ29tcGxldGUodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEJEIEFkZHIgOiAiIDw8IGRldi0+YWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBTdGF0dXMgOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotCi0gICAgdWludDE2X3QgY2xpZW50X2lkID0gR2F0dE9wc1F1ZXVlOjpTZXJ2aWNlU2VhcmNoQ29tcGxldGUoY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoY2xpZW50X2lkKTsKLSAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgLyogY2xvc2UgY29ubmVjdGlvbiBhbmQgcmVwb3J0IHNlcnZpY2UgZGlzY292ZXJ5IGNvbXBsZXRlIHdpdGggZXJyb3IgKi8KLSAgICAgIExPRyhFUlJPUikgPDwgIlNlcnZpY2UgZGlzY292ZXJ5IGZhaWxlZCI7Ci0gICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEFzZVBhcmFtcz4gYXNlX3ZhbHVlX2xpc3Q7Ci0gICAgICAgIGNhbGxiYWNrLT5PblNlYXJjaENvbXBsZXRlKDB4RkYsIGRldi0+YWRkcmVzcywgYXNlX3ZhbHVlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZV92YWx1ZV9saXN0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxnYXR0OjpTZXJ2aWNlPiogc2VydmljZXMgPSBCVEFfR0FUVENfR2V0U2VydmljZXMoY29ubl9pZCk7Ci0KLSAgICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBzZXJ2aWNlID0gbnVsbHB0cjsKLSAgICBpZiAoc2VydmljZXMpIHsKLSAgICAgIGZvciAoY29uc3QgZ2F0dDo6U2VydmljZSYgdG1wIDogKnNlcnZpY2VzKSB7Ci0gICAgICAgIGlmICh0bXAudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBVVUlEX1NFUlZDTEFTU19HQVRUX1NFUlZFUiwgaGFuZGxlPSIKLSAgICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHRtcC5oYW5kbGUpOwotICAgICAgICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UqIHNlcnZpY2VfY2hhbmdlZF9zZXJ2aWNlID0gJnRtcDsKLSAgICAgICAgICBmaW5kX3NlcnZlcl9jaGFuZ2VkX2NjY19oYW5kbGUoY29ubl9pZCwgc2VydmljZV9jaGFuZ2VkX3NlcnZpY2UpOwotICAgICAgICB9IGVsc2UgaWYgKHRtcC51dWlkID09IEFTQ1NfVVVJRCkgewotICAgICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgQVNDUyBzZXJ2aWNlLCBoYW5kbGU9IiA8PCBsb2doZXgodG1wLmhhbmRsZSk7Ci0gICAgICAgICAgc2VydmljZSA9ICZ0bXA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAibm8gc2VydmljZXMgZm91bmQgZm9yIGNvbm5faWQ6ICIgPDwgY29ubl9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXNlcnZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIk5vIEFTQ1Mgc2VydmljZSBmb3VuZCI7Ci0gICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEFzZVBhcmFtcz4gYXNlX3ZhbHVlX2xpc3Q7Ci0gICAgICAgIGNhbGxiYWNrLT5PblNlYXJjaENvbXBsZXRlKDB4RkYsIGRldi0+YWRkcmVzcywgYXNlX3ZhbHVlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZV92YWx1ZV9saXN0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIGlmIChjaGFyYWMudXVpZCA9PSBBU0NTX1NJTktfQVNFX1VVSUQgfHwKLSAgICAgICAgICBjaGFyYWMudXVpZCA9PSBBU0NTX1NSQ19BU0VfVVVJRCkgewotICAgICAgICBBc2UgYXNlX2luZm87Ci0gICAgICAgIGFzZV9pbmZvLmFzZV9oYW5kbGUgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotICAgICAgICBHYXR0T3BzUXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICBBc2NzQ2xpZW50SW1wbDo6T25SZWFkT25seVByb3BlcnRpZXNSZWFkU3RhdGljLCBudWxscHRyKTsKLQotICAgICAgICBhc2VfaW5mby5hc2VfY2NjX2hhbmRsZSA9Ci0gICAgICAgICAgICBmaW5kX2NjY19oYW5kbGUoY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSk7Ci0KLSAgICAgICAgaWYoY2hhcmFjLnV1aWQgPT0gQVNDU19TSU5LX0FTRV9VVUlEKSB7Ci0gICAgICAgICAgZGV2LT5zaW5rX2FzZV9saXN0LnB1c2hfYmFjayhhc2VfaW5mbyk7Ci0gICAgICAgIH0gZWxzZSBpZihjaGFyYWMudXVpZCA9PSBBU0NTX1NSQ19BU0VfVVVJRCkgewotICAgICAgICAgIGRldi0+c3JjX2FzZV9saXN0LnB1c2hfYmFjayhhc2VfaW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYXNlX2luZm8uYXNlX2NjY19oYW5kbGUpIHsKLSAgICAgICAgICAvKiBSZWdpc3RlciBhbmQgZW5hYmxlIHRoZSBBdWRpbyBTdGF0dXMgTm90aWZpY2F0aW9uICovCi0gICAgICAgICAgdEdBVFRfU1RBVFVTIHJlZ2lzdGVyX3N0YXR1czsKLSAgICAgICAgICByZWdpc3Rlcl9zdGF0dXMgPSBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgICAgICBjb25uX2lkLCBkZXYtPmFkZHJlc3MsIGFzZV9pbmZvLmFzZV9oYW5kbGUpOwotICAgICAgICAgIGlmIChyZWdpc3Rlcl9zdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMgZmFpbGVkLCBzdGF0dXM9IgotICAgICAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgocmVnaXN0ZXJfc3RhdHVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUoMik7Ci0gICAgICAgICAgdWludDhfdCogcHRyID0gdmFsdWUuZGF0YSgpOwotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocHRyLCBHQVRUX0NIQVJfQ0xJRU5UX0NPTkZJR19OT1RJRklDQVRJT04pOwotICAgICAgICAgIEdhdHRPcHNRdWV1ZTo6V3JpdGVEZXNjcmlwdG9yKAotICAgICAgICAgICAgICBjbGllbnRfaWQsIGNvbm5faWQsIGFzZV9pbmZvLmFzZV9jY2NfaGFuZGxlLAotICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCBHQVRUX1dSSVRFLCBudWxscHRyLCBudWxscHRyKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PSBBU0NTX0FTRV9DUF9VVUlEKSB7Ci0gICAgICAgIGRldi0+YXNlX2NwX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0KLSAgICAgICAgZGV2LT5hc2VfY3BfY2NjX2hhbmRsZSA9Ci0gICAgICAgICAgICBmaW5kX2NjY19oYW5kbGUoY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSk7Ci0gICAgICAgIGlmKGRldi0+YXNlX2NwX2NjY19oYW5kbGUpIHsKLSAgICAgICAgICAvKiBSZWdpc3RlciBhbmQgZW5hYmxlIHRoZSBBdWRpbyBTdGF0dXMgTm90aWZpY2F0aW9uICovCi0gICAgICAgICAgdEdBVFRfU1RBVFVTIHJlZ2lzdGVyX3N0YXR1czsKLSAgICAgICAgICByZWdpc3Rlcl9zdGF0dXMgPSBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgICAgICBjb25uX2lkLCBkZXYtPmFkZHJlc3MsIGRldi0+YXNlX2NwX2hhbmRsZSk7Ci0gICAgICAgICAgaWYgKHJlZ2lzdGVyX3N0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyBmYWlsZWQsIHN0YXR1cz0iCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChyZWdpc3Rlcl9zdGF0dXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSgyKTsKLSAgICAgICAgICB1aW50OF90KiBwdHIgPSB2YWx1ZS5kYXRhKCk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwdHIsIEdBVFRfQ0hBUl9DTElFTlRfQ09ORklHX05PVElGSUNBVElPTik7Ci0gICAgICAgICAgR2F0dE9wc1F1ZXVlOjpXcml0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgIGNsaWVudF9pZCwgY29ubl9pZCwgZGV2LT5hc2VfY3BfY2NjX2hhbmRsZSwKLSAgICAgICAgICAgICAgc3RkOjptb3ZlKHZhbHVlKSwgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBMT0coV0FSTklORykgPDwgIlVua25vd24gY2hhcmFjdGVyaXN0aWMgZm91bmQ6IiA8PCBjaGFyYWMudXVpZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXYtPm5vdGlmaWNhdGlvbnNfZW5hYmxlZCA9IHRydWU7Ci0KLSAgICBpZiAoZGV2LT5zZXJ2aWNlX2NoYW5nZWRfcmN2ZCkgewotICAgICAgZGV2LT5zZXJ2aWNlX2NoYW5nZWRfcmN2ZCA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IGNoYXIqIEdldEFzZVN0YXRlKHVpbnQ4X3QgZXZlbnQpIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNFX1NUQVRFX0lETEUpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEFTRV9TVEFURV9FTkFCTElORykKLSAgICAgIENBU0VfUkVUVVJOX1NUUihBU0VfU1RBVEVfU1RSRUFNSU5HKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEFTRV9TVEFURV9ESVNBQkxJTkcpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNFX1NUQVRFX1JFTEVBU0lORykKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgcmV0dXJuICJVbmtub3duIFN0YXRlIjsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBjaGFyKiBHZXRBc2VEaXJlY3Rpb24odWludDhfdCBldmVudCkgewotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgIENBU0VfUkVUVVJOX1NUUihBU0VfRElSRUNUSU9OX1NJTkspCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNFX0RJUkVDVElPTl9TT1VSQ0UpCi0gICAgICBkZWZhdWx0OgotICAgICAgIHJldHVybiAiVW5rbm93biBEaXJlY3Rpb24iOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUGFyc2VBc2VQYXJhbXModWludDhfdCAqcCwgQXNlUGFyYW1zICphc2VfcGFyYW1zLCB1aW50OF90IGFzZV9kaXIpIHsKLSAgICBTVFJFQU1fVE9fVUlOVDgoYXNlX3BhcmFtcy0+YXNlX2lkLCBwKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoYXNlX3BhcmFtcy0+YXNlX3N0YXRlLCBwKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIjogQVNFIElkID0gIiA8PCBsb2doZXgoYXNlX3BhcmFtcy0+YXNlX2lkKQotICAgICAgICAgICAgICA8PCAiOiBBU0UgU3RhdGUgPSAiIDw8IEdldEFzZVN0YXRlKGFzZV9wYXJhbXMtPmFzZV9zdGF0ZSkKLSAgICAgICAgICAgICAgPDwgIjogQVNFIERpcmVjdGlvbiA9ICIgPDwgR2V0QXNlRGlyZWN0aW9uKGFzZV9kaXIpOwotICAgIHN3aXRjaChhc2VfcGFyYW1zLT5hc2Vfc3RhdGUpIHsKLSAgICAgIGNhc2UgQVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQ6IHsKLSAgICAgICAgQXNlQ29kZWNDb25maWdQYXJhbXMgKmNvZGVjX2NvbmZpZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgJmFzZV9wYXJhbXMtPmNvZGVjX2NvbmZpZ19wYXJhbXM7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChjb2RlY19jb25maWctPmZyYW1pbmcsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY29kZWNfY29uZmlnLT5wcmVmX3BoeSwgcCk7Ci0KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNvZGVjX2NvbmZpZy0+cHJlZl9ydG4sIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNvZGVjX2NvbmZpZy0+bXRsLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX0FSUkFZKCYoY29kZWNfY29uZmlnLT5wZF9taW4pLCBwLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+IChzaXplb2YocHJlc2VudGF0aW9uX2RlbGF5X3QpKSk7Ci0gICAgICAgIFNUUkVBTV9UT19BUlJBWSgmKGNvZGVjX2NvbmZpZy0+cGRfbWF4KSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKHByZXNlbnRhdGlvbl9kZWxheV90KSkpOwotICAgICAgICBTVFJFQU1fVE9fQVJSQVkoJihjb2RlY19jb25maWctPnByZWZfcGRfbWluKSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKHByZXNlbnRhdGlvbl9kZWxheV90KSkpOwotICAgICAgICBTVFJFQU1fVE9fQVJSQVkoJihjb2RlY19jb25maWctPnByZWZfcGRfbWF4KSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKHByZXNlbnRhdGlvbl9kZWxheV90KSkpOwotICAgICAgICBTVFJFQU1fVE9fQVJSQVkoJihjb2RlY19jb25maWctPmNvZGVjX2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKGNvZGVjX3R5cGVfdCkpKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNvZGVjX2NvbmZpZy0+Y29kZWNfcGFyYW1zX2xlbiwgcCk7Ci0gICAgICAgIGlmKGNvZGVjX2NvbmZpZy0+Y29kZWNfcGFyYW1zX2xlbikgewotICAgICAgICAgIGNvZGVjX2NvbmZpZy0+Y29kZWNfcGFyYW1zLnJlc2l6ZShjb2RlY19jb25maWctPmNvZGVjX3BhcmFtc19sZW4pOwotICAgICAgICAgIFNUUkVBTV9UT19BUlJBWShjb2RlY19jb25maWctPmNvZGVjX3BhcmFtcy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICBwLCBjb2RlY19jb25maWctPmNvZGVjX3BhcmFtc19sZW4pOwotICAgICAgICB9Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiOiBGcmFtaW5nID0gIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5mcmFtaW5nKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICI6IFByZWYgUGh5ID0gIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5wcmVmX3BoeSk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiOiBQcmVmIFJUTiA9ICIgPDwgbG9naGV4KGNvZGVjX2NvbmZpZy0+cHJlZl9ydG4pOwotICAgICAgICBMT0coSU5GTykgPDwgIjogTVRMID0gIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5tdGwpOwotICAgICAgICBMT0coSU5GTykgPDwgIjogUEQgTWluID0iCi0gICAgICAgICAgICAgICAgICA8PCAiICIgPDwgbG9naGV4KGNvZGVjX2NvbmZpZy0+cGRfbWluWzBdKQotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChjb2RlY19jb25maWctPnBkX21pblsxXSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5wZF9taW5bMl0pOwotICAgICAgICBMT0coSU5GTykgPDwgIjogUEQgTWF4ID0iCi0gICAgICAgICAgICAgICAgICA8PCAiICIgPDwgbG9naGV4KGNvZGVjX2NvbmZpZy0+cGRfbWF4WzBdKQotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChjb2RlY19jb25maWctPnBkX21heFsxXSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5wZF9tYXhbMl0pOwotICAgICAgICBMT0coSU5GTykgPDwgIjogUHJlZiBQRCBNaW4gPSIKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5wcmVmX3BkX21pblswXSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5wcmVmX3BkX21pblsxXSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgoY29kZWNfY29uZmlnLT5wcmVmX3BkX21pblsyXSk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiOiBQcmVmIFBEIE1heCA9IgotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChjb2RlY19jb25maWctPnByZWZfcGRfbWF4WzBdKQotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChjb2RlY19jb25maWctPnByZWZfcGRfbWF4WzFdKQotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChjb2RlY19jb25maWctPnByZWZfcGRfbWF4WzJdKTsKLQotICAgICAgICBMT0coSU5GTykgPDwgIjogQ29kZWMgSUQgPSAiIDw8IGxvZ2hleChjb2RlY19jb25maWctPmNvZGVjX2lkWzBdKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFTRV9TVEFURV9RT1NfQ09ORklHVVJFRDogewotICAgICAgICBBc2VRb3NDb25maWdQYXJhbXMgKnFvc19jb25maWcgPSAmYXNlX3BhcmFtcy0+cW9zX2NvbmZpZ19wYXJhbXM7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChxb3NfY29uZmlnLT5jaWdfaWQsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDgocW9zX2NvbmZpZy0+Y2lzX2lkLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX0FSUkFZKCYocW9zX2NvbmZpZy0+c2R1X2ludGVydmFsKSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKHNkdV9pbnRlcnZhbF90KSkpOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDgocW9zX2NvbmZpZy0+ZnJhbWluZywgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChxb3NfY29uZmlnLT5waHksIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHFvc19jb25maWctPm1heF9zZHVfc2l6ZSwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChxb3NfY29uZmlnLT5ydG4sIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHFvc19jb25maWctPm10bCwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19BUlJBWSgmKHFvc19jb25maWctPnBkKSwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKHByZXNlbnRhdGlvbl9kZWxheV90KSkpOwotCi0gICAgICAgIExPRyhJTkZPKSA8PCAiOiBDaWcgSWQgPSAiIDw8IGxvZ2hleChxb3NfY29uZmlnLT5jaWdfaWQpOwotICAgICAgICBMT0coSU5GTykgPDwgIjogQ2lzIElkID0gIiA8PCBsb2doZXgocW9zX2NvbmZpZy0+Y2lzX2lkKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICI6IFNEVSBpbnRlcnZhbCA9IgotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChxb3NfY29uZmlnLT5zZHVfaW50ZXJ2YWxbMF0pCi0gICAgICAgICAgICAgICAgICA8PCAiICIgPDwgbG9naGV4KHFvc19jb25maWctPnNkdV9pbnRlcnZhbFsxXSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgocW9zX2NvbmZpZy0+c2R1X2ludGVydmFsWzJdKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICI6IEZyYW1pbmcgPSAiIDw8IGxvZ2hleChxb3NfY29uZmlnLT5mcmFtaW5nKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICI6IFBoeSA9ICIgPDwgbG9naGV4KHFvc19jb25maWctPnBoeSk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiOiBNYXggU0RVIHNpemUgPSAiIDw8IGxvZ2hleChxb3NfY29uZmlnLT5tYXhfc2R1X3NpemUpOwotICAgICAgICBMT0coSU5GTykgPDwgIjogUlROID0gIiA8PCBsb2doZXgocW9zX2NvbmZpZy0+cnRuKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICI6IE1UTCA9ICIgPDwgbG9naGV4KHFvc19jb25maWctPm10bCk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiOiBQRCA9IgotICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGxvZ2hleChxb3NfY29uZmlnLT5wZFswXSkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBsb2doZXgocW9zX2NvbmZpZy0+cGRbMV0pCi0gICAgICAgICAgICAgICAgICA8PCAiICIgPDwgbG9naGV4KHFvc19jb25maWctPnBkWzJdKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFTRV9TVEFURV9FTkFCTElORzoKLSAgICAgIGNhc2UgQVNFX1NUQVRFX1NUUkVBTUlORzoKLSAgICAgIGNhc2UgQVNFX1NUQVRFX0RJU0FCTElORzogewotICAgICAgICBBc2VHZW5lcmljUGFyYW1zICpnZW5fcGFyYW1zID0gJmFzZV9wYXJhbXMtPmdlbmVyaWNfcGFyYW1zOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDgoZ2VuX3BhcmFtcy0+Y2lnX2lkLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGdlbl9wYXJhbXMtPmNpc19pZCwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChnZW5fcGFyYW1zLT5tZXRhX2RhdGFfbGVuLCBwKTsKLSAgICAgICAgaWYoZ2VuX3BhcmFtcy0+bWV0YV9kYXRhX2xlbikgewotICAgICAgICAgIGdlbl9wYXJhbXMtPm1ldGFfZGF0YS5yZXNpemUoZ2VuX3BhcmFtcy0+bWV0YV9kYXRhX2xlbik7Ci0gICAgICAgICAgU1RSRUFNX1RPX0FSUkFZKGdlbl9wYXJhbXMtPm1ldGFfZGF0YS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICBwLCBnZW5fcGFyYW1zLT5tZXRhX2RhdGFfbGVuKTsKLSAgICAgICAgfQotICAgICAgICBMT0coSU5GTykgPDwgIjogQ2lnIElkID0gIiA8PCBsb2doZXgoZ2VuX3BhcmFtcy0+Y2lnX2lkKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICI6IENpcyBJZCA9ICIgPDwgbG9naGV4KGdlbl9wYXJhbXMtPmNpc19pZCk7Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUGFyc2VBc2VOb3RpZmljYXRpb24odWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlICkgewotICAgIHVpbnQ4X3QgKnAgPSB2YWx1ZTsKLSAgICBib29sIGFzZV9mb3VuZCA9IGZhbHNlOwotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChhdXRvIGl0ID0gZGV2LT5zaW5rX2FzZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGl0ICE9IGRldi0+c2lua19hc2VfbGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgaWYgKGl0LT5hc2VfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQkQgQWRkciA6ICIgPDwgZGV2LT5hZGRyZXNzOwotICAgICAgICBQYXJzZUFzZVBhcmFtcyhwLCAmaXQtPmFzZV9wYXJhbXMsIEFTRV9ESVJFQ1RJT05fU0lOSyk7Ci0gICAgICAgIGZvciAoYXV0byBpdGVyIDogY2FsbGJhY2tzKSB7Ci0gICAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqYXNjc19jYWxsYmFjayA9IGl0ZXIuc2Vjb25kOwotICAgICAgICAgIGFzY3NfY2FsbGJhY2stPk9uQXNlU3RhdGUoZGV2LT5hZGRyZXNzLCBpdC0+YXNlX3BhcmFtcyk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNlX2ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmKCFhc2VfZm91bmQpIHsKLSAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+c3JjX2FzZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5zcmNfYXNlX2xpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgaWYgKGl0LT5hc2VfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBCRCBBZGRyIDogIiA8PCBkZXYtPmFkZHJlc3M7Ci0gICAgICAgICAgUGFyc2VBc2VQYXJhbXMocCwgJml0LT5hc2VfcGFyYW1zLEFTRV9ESVJFQ1RJT05fU09VUkNFKTsKLSAgICAgICAgICBmb3IgKGF1dG8gaXRlciA6IGNhbGxiYWNrcykgewotICAgICAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqYXNjc19jYWxsYmFjayA9IGl0ZXIuc2Vjb25kOwotICAgICAgICAgICAgYXNjc19jYWxsYmFjay0+T25Bc2VTdGF0ZShkZXYtPmFkZHJlc3MsIGl0LT5hc2VfcGFyYW1zKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXNlX2ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgT25Ob3RpZmljYXRpb25FdmVudCh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlKSB7Ci0gICAgdWludDhfdCogcCA9IHZhbHVlOwotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgaWYgdGhlIG5vdGlmaWNhdGlvbiBpcyBmb3IgQVNFcwotICAgIGlmKCBkZXYtPmFzZV9jcF9oYW5kbGUgPT0gaGFuZGxlKSB7IC8vIGNvbnRyb2wgcG9pbnQgbm90aWZpY2F0aW9uCi0gICAgICBBc2VDcE5vdGlmaWNhdGlvbiBjcF9ub3RpZmljYXRpb247Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoY3Bfbm90aWZpY2F0aW9uLmFzZV9vcGNvZGUsIHApOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNwX25vdGlmaWNhdGlvbi5udW1fYXNlcywgcCk7Ci0gICAgICB1aW50OF90IG51bV9hc2VzID0gY3Bfbm90aWZpY2F0aW9uLm51bV9hc2VzOwotICAgICAgc3RkOjp2ZWN0b3I8QXNlT3BTdGF0dXM+IGFzZV9jcF9ub3RpZnlfbGlzdDsKLSAgICAgIEFzZU9wU3RhdHVzIHN0YXR1czsKLSAgICAgIGJvb2wgbm90aWZ5ID0gZmFsc2U7Ci0KLSAgICAgIHdoaWxlKG51bV9hc2VzLS0pIHsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cy5hc2VfaWQsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLnJlc3BfY29kZSwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMucmVhc29uLCBwKTsKLSAgICAgICAgaWYoc3RhdHVzLnJlc3BfY29kZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEFTRSBJZCA9ICIgPDwgbG9naGV4KHN0YXR1cy5hc2VfaWQpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOiBSZXNwIGNvZGUgPSAiIDw8IHJlc3BfY29kZXNbc3RhdHVzLnJlc3BfY29kZV07Ci0gICAgICAgICAgaWYoc3RhdHVzLnJlYXNvbikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiOiBSZWFzb24gPSAiIDw8IHJlYXNvbl9jb2Rlc1tzdGF0dXMucmVhc29uXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzZV9jcF9ub3RpZnlfbGlzdC5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGlmKG5vdGlmeSkgewotICAgICAgICBmb3IgKGF1dG8gaXRlciA6IGNhbGxiYWNrcykgewotICAgICAgICAgIEFzY3NDbGllbnRDYWxsYmFja3MgKmFzY3NfY2FsbGJhY2sgPSBpdGVyLnNlY29uZDsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgQVNFIE9wZXJhdGlvbiBmYWlsZWQiOwotICAgICAgICAgIGFzY3NfY2FsbGJhY2stPk9uQXNlT3BGYWlsZWQoZGV2LT5hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFzZU9wSWQpIGNwX25vdGlmaWNhdGlvbi5hc2Vfb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlX2NwX25vdGlmeV9saXN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBQYXJzZUFzZU5vdGlmaWNhdGlvbihjb25uX2lkLCBoYW5kbGUsIGxlbiwgdmFsdWUpOwotICAgIH0KLSAgfQotCi0KLSAgdm9pZCBPbkNvbmdlc3Rpb25FdmVudCh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCkgewotICAgIEFzY3NEZXZpY2UqIGRldiA9IGFzY3NEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGNvbm5faWQ6IiA8PCBsb2doZXgoY29ubl9pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgY29uZ2VzdGVkOiAiIDw8IGNvbmdlc3RlZDsKLSAgICBkZXYtPmlzX2Nvbmdlc3RlZCA9IGNvbmdlc3RlZDsKLSAgICBHYXR0T3BzUXVldWU6OkNvbmdlc3Rpb25DYWxsYmFjayhjb25uX2lkLCBjb25nZXN0ZWQpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRBc2VTdGF0ZSh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotCi0gICAgQXNjc0RldmljZSogZGV2ID0gYXNjc0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJ1bmtub3duIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXzsKLQotICAgIC8vIGNoZWNrIGlmIHRoZSBub3RpZmljYXRpb24gaXMgZm9yIEFTRXMKLSAgICBQYXJzZUFzZU5vdGlmaWNhdGlvbihjb25uX2lkLCBoYW5kbGUsIGxlbiwgdmFsdWUpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRPbmx5UHJvcGVydGllc1JlYWQodWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgICBBc2NzRGV2aWNlKiBkZXYgPSBhc2NzRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgdWludDhfdCAqcCA9IHZhbHVlOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJ1bmtub3duIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChhdXRvIGl0ID0gZGV2LT5zaW5rX2FzZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGl0ICE9IGRldi0+c2lua19hc2VfbGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgaWYgKGl0LT5hc2VfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICBkZXYtPm51bV9hc2VzX3JlYWQrKzsKLSAgICAgICAgUGFyc2VBc2VQYXJhbXMocCwgJml0LT5hc2VfcGFyYW1zLCBBU0VfRElSRUNUSU9OX1NJTkspOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnNyY19hc2VfbGlzdC5iZWdpbigpOwotICAgICAgICAgICAgICBpdCAhPSBkZXYtPnNyY19hc2VfbGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgaWYgKGl0LT5hc2VfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICBkZXYtPm51bV9hc2VzX3JlYWQrKzsKLSAgICAgICAgUGFyc2VBc2VQYXJhbXMocCwgJml0LT5hc2VfcGFyYW1zLCBBU0VfRElSRUNUSU9OX1NPVVJDRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBudW1fYXNlc19yZWFkIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoZGV2LT5udW1fYXNlc19yZWFkKTsKLQotICAgIGlmKGRldi0+bnVtX2FzZXNfcmVhZCA9PSAoZGV2LT5zaW5rX2FzZV9saXN0LnNpemUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPnNyY19hc2VfbGlzdC5zaXplKCkpKSB7Ci0gICAgICBzaW5rX2FzZV92YWx1ZV9saXN0LmNsZWFyKCk7Ci0gICAgICBzcmNfYXNlX3ZhbHVlX2xpc3QuY2xlYXIoKTsKLSAgICAgIGRldi0+ZGlzY292ZXJ5X2NvbXBsZXRlZCA9IHRydWU7Ci0gICAgICAvLyBOb3cgdXBkYXRlIHVzaW5nIHNlcnZpY2UgZGlzY292ZXJ5IGNhbGxiYWNrCi0gICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChjbGllbnRfaWQpOwotICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgIGZvciAoYXV0byBpdCA6IGRldi0+c2lua19hc2VfbGlzdCkgewotICAgICAgICAgIG1lbWNweSgmYXNlLCAodm9pZCAqKSAmaXQuYXNlX3BhcmFtcywgc2l6ZW9mKGFzZSkpOwotICAgICAgICAgIHNpbmtfYXNlX3ZhbHVlX2xpc3QucHVzaF9iYWNrKGFzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChhdXRvIGl0IDogZGV2LT5zcmNfYXNlX2xpc3QpIHsKLSAgICAgICAgICBtZW1jcHkoJmFzZSwgKHZvaWQgKikgJml0LmFzZV9wYXJhbXMsIHNpemVvZihhc2UpKTsKLSAgICAgICAgICBzcmNfYXNlX3ZhbHVlX2xpc3QucHVzaF9iYWNrKGFzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXNjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgIC8vIGNoZWNrIGlmIGFsbCBhc2NzIGNoYXJhY3RlcmlzdGljcyBhcmUgcmVhZAotICAgICAgICAvLyBzZW5kIG91dCB0aGUgY2FsbGJhY2sgYXMgc2VydmljZSBkaXNjb3ZlcnkgY29tcGxldGVkCi0gICAgICAgIGNhbGxiYWNrLT5PblNlYXJjaENvbXBsZXRlKDAsIGRldi0+YWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua19hc2VfdmFsdWVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FzZV92YWx1ZV9saXN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBPblJlYWRPbmx5UHJvcGVydGllc1JlYWRTdGF0aWModWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgaWYgKGluc3RhbmNlKQotICAgICAgaW5zdGFuY2UtPk9uUmVhZE9ubHlQcm9wZXJ0aWVzUmVhZChjbGllbnRfaWQsIGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIHZhbHVlLCBkYXRhKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uUmVhZEFzZVN0YXRlU3RhdGljKHVpbnQxNl90IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgaWYgKGluc3RhbmNlKQotICAgICAgaW5zdGFuY2UtPk9uUmVhZEFzZVN0YXRlKGNsaWVudF9pZCwgY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCB2YWx1ZSwgZGF0YSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3QgZ2F0dF9jbGllbnRfaWQgPSBCVEFfR0FUVFNfSU5WQUxJRF9JRjsKLSAgdWludDE2X3QgYXNjc19jbGllbnRfaWQgPSAwOwotICBBc2NzRGV2aWNlcyBhc2NzRGV2aWNlczsKLSAgLy8gY2xpZW50IGlkIHRvIGNhbGxiYWNrcyBtYXBwaW5nCi0gIHN0ZDo6bWFwPHVpbnQxNl90LCBBc2NzQ2xpZW50Q2FsbGJhY2tzICo+IGNhbGxiYWNrczsKLQotICB2b2lkIGZpbmRfc2VydmVyX2NoYW5nZWRfY2NjX2hhbmRsZSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBzZXJ2aWNlKSB7Ci0gICAgQXNjc0RldmljZSogYXNjc0RldmljZSA9IGFzY3NEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWFzY3NEZXZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIGlmIChjaGFyYWMudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0dBVFRfU1JWX0NIR0QpKSB7Ci0gICAgICAgIGFzY3NEZXZpY2UtPnNydl9jaGFuZ2VkX2NjY19oYW5kbGUgPQotICAgICAgICAgICAgZmluZF9jY2NfaGFuZGxlKGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotICAgICAgICBpZiAoIWFzY3NEZXZpY2UtPnNydl9jaGFuZ2VkX2NjY19oYW5kbGUpIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOiBjYW5ub3QgZmluZCBzZXJ2aWNlIGNoYW5nZWQgQ0NDIGRlc2NyaXB0b3IiOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHNlcnZpY2VfY2hhbmdlZF9jY2M9IgotICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGFzY3NEZXZpY2UtPnNydl9jaGFuZ2VkX2NjY19oYW5kbGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBGaW5kIHRoZSBoYW5kbGUgZm9yIHRoZSBjbGllbnQgY2hhcmFjdGVyaXN0aWNzIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbgotICAvLyBjaGFyYWN0ZXJpc3RpY3MKLSAgdWludDE2X3QgZmluZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNoYXJfaGFuZGxlKSB7Ci0gICAgY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHBfY2hhciA9Ci0gICAgICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBjaGFyX2hhbmRsZSk7Ci0KLSAgICBpZiAoIXBfY2hhcikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IE5vIHN1Y2ggY2hhcmFjdGVyaXN0aWM6ICIgPDwgY2hhcl9oYW5kbGU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkRlc2NyaXB0b3ImIGRlc2MgOiBwX2NoYXItPmRlc2NyaXB0b3JzKSB7Ci0gICAgICBpZiAoZGVzYy51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSkKLSAgICAgICAgcmV0dXJuIGRlc2MuaGFuZGxlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci19OwotCi1jb25zdCBjaGFyKiBnZXRfZ2F0dF9ldmVudF9uYW1lKHVpbnQzMl90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0dBVFRDX0RFUkVHX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0dBVFRDX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfTk9USUZfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfRU5DX0NNUExfQ0JfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfQ09OTl9VUERBVEVfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfU1JWQ19DSEdfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfU1JWQ19ESVNDX0RPTkVfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfQ09OR0VTVF9FVlQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBFdmVudCI7Ci0gIH0KLX0KLQotdm9pZCBhc2NzX2dhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgaWYgKHBfZGF0YSA9PSBudWxscHRyIHx8ICFpbnN0YW5jZSkgcmV0dXJuOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBFdmVudCA6ICIgPDwgZ2V0X2dhdHRfZXZlbnRfbmFtZShldmVudCk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRDX0RFUkVHX0VWVDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfT1BFTl9FVlQ6IHsKLSAgICAgIHRCVEFfR0FUVENfT1BFTiYgbyA9IHBfZGF0YS0+b3BlbjsKLSAgICAgIGluc3RhbmNlLT5PbkdhdHRDb25uZWN0ZWQoby5zdGF0dXMsIG8uY29ubl9pZCwgby5jbGllbnRfaWYsIG8ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby50cmFuc3BvcnQsIG8ubXR1KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX0NMT1NFX0VWVDogewotICAgICAgdEJUQV9HQVRUQ19DTE9TRSYgYyA9IHBfZGF0YS0+Y2xvc2U7Ci0gICAgICBpbnN0YW5jZS0+T25HYXR0RGlzY29ubmVjdGVkKGMuc3RhdHVzLCBjLmNvbm5faWQsIGMuY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnJlbW90ZV9iZGEsIGMucmVhc29uKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUOgotICAgICAgaW5zdGFuY2UtPk9uU2VydmljZVNlYXJjaENvbXBsZXRlKHBfZGF0YS0+c2VhcmNoX2NtcGwuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX05PVElGX0VWVDoKLSAgICAgIGlmICghcF9kYXRhLT5ub3RpZnkuaXNfbm90aWZ5IHx8Ci0gICAgICAgICAgIHBfZGF0YS0+bm90aWZ5LmxlbiA+IEdBVFRfTUFYX0FUVFJfTEVOKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcmVqZWN0ZWQgQlRBX0dBVFRDX05PVElGX0VWVC4gaXNfbm90aWZ5PSIKLSAgICAgICAgICAgICAgICAgICA8PCBwX2RhdGEtPm5vdGlmeS5pc19ub3RpZnkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBsZW49IiA8PCBwX2RhdGEtPm5vdGlmeS5sZW47Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaW5zdGFuY2UtPk9uTm90aWZpY2F0aW9uRXZlbnQocF9kYXRhLT5ub3RpZnkuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bm90aWZ5LmhhbmRsZSwgcF9kYXRhLT5ub3RpZnkubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5ub3RpZnkudmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+T25FbmNyeXB0aW9uQ29tcGxldGUocF9kYXRhLT5lbmNfY21wbC5yZW1vdGVfYmRhLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfQ09OTl9VUERBVEVfRVZUOgotICAgICAgaW5zdGFuY2UtPk9uQ29ubmVjdGlvblVwZGF0ZUNvbXBsZXRlKHBfZGF0YS0+Y29ubl91cGRhdGUuY29ubl9pZCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU1JWQ19DSEdfRVZUOgotICAgICAgaW5zdGFuY2UtPk9uU2VydmljZUNoYW5nZUV2ZW50KHBfZGF0YS0+cmVtb3RlX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfRElTQ19ET05FX0VWVDoKLSAgICAgIGluc3RhbmNlLT5PblNlcnZpY2VEaXNjRG9uZUV2ZW50KHBfZGF0YS0+cmVtb3RlX2JkYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQV9HQVRUQ19DT05HRVNUX0VWVDoKLSAgICAgIGluc3RhbmNlLT5PbkNvbmdlc3Rpb25FdmVudChwX2RhdGEtPmNvbmdlc3QuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbmdlc3QuY29uZ2VzdGVkKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIGVuY3J5cHRpb25fY2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyogYWRkcmVzcywgdEdBVFRfVFJBTlNQT1JULCB2b2lkKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UtPk9uRW5jcnlwdGlvbkNvbXBsZXRlKCphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gQlRNX1NVQ0NFU1MgPyB0cnVlIDogZmFsc2UpOwotICB9Ci19Ci0KLXZvaWQgQXNjc0NsaWVudDo6SW5pdChBc2NzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UtPlJlZ2lzdGVyKGNhbGxiYWNrcyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW5zdGFuY2UgPSBuZXcgQXNjc0NsaWVudEltcGwoKTsKLSAgICBpbnN0YW5jZS0+UmVnaXN0ZXIoY2FsbGJhY2tzKTsKLSAgfQotfQotCi12b2lkIEFzY3NDbGllbnQ6OkNsZWFuVXAodWludDE2X3QgY2xpZW50X2lkKSB7Ci0gIGlmKGluc3RhbmNlLT5HZXRDbGllbnRDb3VudCgpKSB7Ci0gICAgaW5zdGFuY2UtPkRlcmVnaXN0ZXIoY2xpZW50X2lkKTsKLSAgICBpZighaW5zdGFuY2UtPkdldENsaWVudENvdW50KCkpIHsKLSAgICAgIGRlbGV0ZSBpbnN0YW5jZTsKLSAgICAgIGluc3RhbmNlID0gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLX0KLQotQXNjc0NsaWVudCogQXNjc0NsaWVudDo6R2V0KCkgewotICBDSEVDSyhpbnN0YW5jZSk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFzY3MKLX0gIC8vIG5hbWVzcGFjZSBiYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL2Nvbm5lY3RlZF9pc28uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9jb25uZWN0ZWRfaXNvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGRhZTdjLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL2Nvbm5lY3RlZF9pc28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImJ0YV9iYXBfdWNsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlICJzdGF0ZV9tYWNoaW5lLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIGNpcyB7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IGNpc19oYW5kbGU7Ci0gIHVpbnQ4X3QgcmVhc29uOwotfSB0QlRNX0JMRV9DSVNfRElTQ09OTkVDVEVEX0VWVF9QQVJBTTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgY29ubl9oYW5kbGU7Ci19IHRCVE1fQkxFX0NJU19EQVRBX1BBVEhfRVZUX1BBUkFNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci11aW50OF90IHN0YXR1czsKLXVpbnQ4X3QgY2lnX2lkOwotfSB0QlRNX0JMRV9TRVRfQ0lHX1JFTU9WRV9QQVJBTTsKLQotc3RydWN0IENJUzsKLWNsYXNzIENpc0ludGVyZmFjZUNhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpjaXM6OkNpc0ludGVyZmFjZUNhbGxiYWNrczsKLQotc3RydWN0IHRJc29TZXRVcERhdGFQYXRoIHsKLSAgdWludDE2X3QgY29ubl9oYW5kbGU7Ci0gIHVpbnQ4X3QgZGF0YV9wYXRoX2RpcmVjdGlvbjsKLSAgdWludDhfdCBkYXRhX3BhdGhfaWQ7Ci19OwotCi1zdHJ1Y3QgdElzb1JlbW92ZURhdGFQYXRoIHsKLSAgdWludDE2X3QgY29ubl9oYW5kbGU7Ci0gIHVpbnQ4X3QgZGF0YV9wYXRoX2RpcmVjdGlvbjsKLX07Ci0KLWVudW0gSXNvSGNpRXZlbnQgewotICBDSUdfQ09ORklHVVJFX1JFUSA9IDAsCi0gIENJR19DT05GSUdVUkVEX0VWVCwKLSAgQ0lTX0NSRUFURV9SRVEsCi0gIENJU19TVEFUVVNfRVZULAotICBDSVNfRVNUQUJMSVNIRURfRVZULAotICBDSVNfRElTQ09OTkVDVF9SRVEsCi0gIENJU19ESVNDT05ORUNURURfRVZULAotICBDSUdfUkVNT1ZFX1JFUSwKLSAgQ0lHX1JFTU9WRURfRVZULAotICBTRVRVUF9EQVRBX1BBVEhfUkVRLAotICBTRVRVUF9EQVRBX1BBVEhfRE9ORV9FVlQsCi0gIFJFTU9WRV9EQVRBX1BBVEhfUkVRLAotICBSRU1PVkVfREFUQV9QQVRIX0RPTkVfRVZULAotICBDSVNfQ1JFQVRFX1JFUV9EVU1NWQotfTsKLQotc3RydWN0IERhdGFQYXRoTm9kZSB7Ci0gIElzb0hjaUV2ZW50IHR5cGU7Ci0gIHVuaW9uIHsKLSAgICB0SXNvU2V0VXBEYXRhUGF0aCBzZXR1cF9kYXRhcGF0aDsKLSAgICB0SXNvUmVtb3ZlRGF0YVBhdGggcm12X2RhdGFwYXRoOwotICB9OwotfTsKLQotY2xhc3MgQ2lzU3RhdGVNYWNoaW5lIDogcHVibGljIGJsdWV0b290aDo6Y29tbW9uOjpTdGF0ZU1hY2hpbmUgewotIHB1YmxpYzoKLSAgZW51bSB7Ci0gICAga1N0YXRlSWRsZSwKLSAgICBrU3RhdGVTZXR0aW5nRGF0YVBhdGgsCi0gICAga1N0YXRlUmVhZHksCi0gICAga1N0YXRlRXN0YWJsaXNoaW5nLAotICAgIGtTdGF0ZURlc3Ryb3lpbmcsCi0gICAga1N0YXRlRXN0YWJsaXNoZWQsCi0gIH07Ci0KLSAgY2xhc3MgU3RhdGVJZGxlIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZUlkbGUoQ2lzU3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlSWRsZSksIGNpc18oc20uR2V0Q2lzKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJJZGxlIjsgfQotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIENJUyAmY2lzXzsKLSAgfTsKLQotICBjbGFzcyBTdGF0ZVNldHRpbmdEYXRhUGF0aCA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVTZXR0aW5nRGF0YVBhdGgoQ2lzU3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlU2V0dGluZ0RhdGFQYXRoKSwgY2lzXyhzbS5HZXRDaXMoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGNvbnN0IGNoYXIqIEdldFN0YXRlKCkgeyByZXR1cm4gIlNldHRpbmdEYXRhUGF0aCI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBDSVMgJmNpc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVSZWFkeSA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVSZWFkeShDaXNTdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVSZWFkeSksIGNpc18oc20uR2V0Q2lzKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJSZWFkeSI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBDSVMgJmNpc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVEZXN0cm95aW5nIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZURlc3Ryb3lpbmcoQ2lzU3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlRGVzdHJveWluZyksIGNpc18oc20uR2V0Q2lzKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJEZXN0cm95aW5nIjsgfQotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIENJUyAmY2lzXzsKLSAgfTsKLQotICBjbGFzcyBTdGF0ZUVzdGFibGlzaGluZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVFc3RhYmxpc2hpbmcoQ2lzU3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlRXN0YWJsaXNoaW5nKSwgY2lzXyhzbS5HZXRDaXMoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGNvbnN0IGNoYXIqIEdldFN0YXRlKCkgeyByZXR1cm4gIkVzdGFibGlzaGluZyI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBDSVMgJmNpc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVFc3RhYmxpc2hlZCA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVFc3RhYmxpc2hlZChDaXNTdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVFc3RhYmxpc2hlZCksIGNpc18oc20uR2V0Q2lzKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJFc3RhYmxpc2hlZCI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBDSVMgJmNpc187Ci0gIH07Ci0KLSAgQ2lzU3RhdGVNYWNoaW5lKENJUyAmY2lzKSA6Ci0gICAgICAgY2lzKGNpcykgewotICAgIHN0YXRlX2lkbGVfID0gbmV3IFN0YXRlSWRsZSgqdGhpcyk7Ci0gICAgc3RhdGVfc2V0dGluZ19kYXRhX3BhdGhfID0gbmV3IFN0YXRlU2V0dGluZ0RhdGFQYXRoKCp0aGlzKTsKLSAgICBzdGF0ZV9yZWFkeV8gPSBuZXcgU3RhdGVSZWFkeSgqdGhpcyk7Ci0gICAgc3RhdGVfZGVzdHJveWluZ18gPSBuZXcgU3RhdGVEZXN0cm95aW5nKCp0aGlzKTsKLSAgICBzdGF0ZV9lc3RhYmxpc2hpbmdfID0gbmV3IFN0YXRlRXN0YWJsaXNoaW5nKCp0aGlzKTsKLSAgICBzdGF0ZV9lc3RhYmxpc2hlZF8gPSBuZXcgU3RhdGVFc3RhYmxpc2hlZCgqdGhpcyk7Ci0KLSAgICBBZGRTdGF0ZShzdGF0ZV9pZGxlXyk7Ci0gICAgQWRkU3RhdGUoc3RhdGVfc2V0dGluZ19kYXRhX3BhdGhfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9yZWFkeV8pOwotICAgIEFkZFN0YXRlKHN0YXRlX2Rlc3Ryb3lpbmdfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9lc3RhYmxpc2hpbmdfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9lc3RhYmxpc2hlZF8pOwotCi0gICAgU2V0SW5pdGlhbFN0YXRlKHN0YXRlX2lkbGVfKTsKLSAgfQotCi0gIENJUyAgJkdldENpcygpIHsgcmV0dXJuIGNpczsgfQotCi0gIGNvbnN0IGNoYXIqIEdldEV2ZW50TmFtZSh1aW50MzJfdCBldmVudCkgewotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDSUdfQ09ORklHVVJFX1JFUSkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDSUdfQ09ORklHVVJFRF9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX0NSRUFURV9SRVEpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX1NUQVRVU19FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX0VTVEFCTElTSEVEX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDSVNfRElTQ09OTkVDVF9SRVEpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX0RJU0NPTk5FQ1RFRF9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lHX1JFTU9WRV9SRVEpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lHX1JFTU9WRURfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFNFVFVQX0RBVEFfUEFUSF9SRVEpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoU0VUVVBfREFUQV9QQVRIX0RPTkVfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFJFTU9WRV9EQVRBX1BBVEhfUkVRKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFJFTU9WRV9EQVRBX1BBVEhfRE9ORV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX0NSRUFURV9SRVFfRFVNTVkpCi0gICAgICBkZWZhdWx0OgotICAgICAgIHJldHVybiAiVW5rbm93biBFdmVudCI7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBDSVMgJmNpczsKLSAgU3RhdGVJZGxlICpzdGF0ZV9pZGxlXzsKLSAgU3RhdGVTZXR0aW5nRGF0YVBhdGggKnN0YXRlX3NldHRpbmdfZGF0YV9wYXRoXzsKLSAgU3RhdGVSZWFkeSAqc3RhdGVfcmVhZHlfOwotICBTdGF0ZURlc3Ryb3lpbmcgKnN0YXRlX2Rlc3Ryb3lpbmdfOwotICBTdGF0ZUVzdGFibGlzaGluZyAqc3RhdGVfZXN0YWJsaXNoaW5nXzsKLSAgU3RhdGVFc3RhYmxpc2hlZCAqc3RhdGVfZXN0YWJsaXNoZWRfOwotfTsKLQotc3RydWN0IENJUyB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50OF90IGNpc19pZDsKLSAgdWludDE2X3QgY2lzX2hhbmRsZTsKLSAgYm9vbCB0b19haXJfc2V0dXBfZG9uZTsKLSAgYm9vbCBmcm9tX2Fpcl9zZXR1cF9kb25lOwotICB1aW50OF90IGRhdGFwYXRoX3N0YXR1czsKLSAgdWludDhfdCBkaXNjX2RpcmVjdGlvbjsKLSAgdWludDhfdCBkaXJlY3Rpb247IC8vIGlucHV0IG9yIG91dHB1dCBvciBib3RoCi0gIENpc0ludGVyZmFjZUNhbGxiYWNrcyAqY2lzX2NhbGxiYWNrOwotICBSYXdBZGRyZXNzIHBlZXJfYmRhOwotICBDSVNDb25maWcgY2lzX2NvbmZpZzsKLSAgQ2lzU3RhdGVNYWNoaW5lIGNpc19zbTsKLSAgQ2lzU3RhdGUgY2lzX3N0YXRlOwotICBzdGQ6Omxpc3QgPERhdGFQYXRoTm9kZT4gZGF0YXBhdGhfcXVldWU7Ci0KLSAgQ0lTKHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCwgdWludDhfdCBkaXJlY3Rpb24sCi0gICAgICBDaXNJbnRlcmZhY2VDYWxsYmFja3MqIGNhbGxiYWNrKToKLSAgICAgIGNpZ19pZChjaWdfaWQpLCBjaXNfaWQoY2lzX2lkKSwgZGlyZWN0aW9uKGRpcmVjdGlvbiksCi0gICAgICBjaXNfY2FsbGJhY2soY2FsbGJhY2spLAotICAgICAgY2lzX3NtKCp0aGlzKSB7Ci0gICAgICB0b19haXJfc2V0dXBfZG9uZSA9IGZhbHNlOwotICAgICAgZnJvbV9haXJfc2V0dXBfZG9uZSA9IGZhbHNlOwotICB9Ci19OwotCi1zdHJ1Y3QgQ3JlYXRlQ2lzTm9kZSB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjaXNfaWRzOwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY2lzX2hhbmRsZXM7Ci0gIFJhd0FkZHJlc3MgcGVlcl9iZGE7Ci19OwotCi1zdHJ1Y3QgQ0lHIHsKLSAgQ0lHQ29uZmlnIGNpZ19jb25maWc7Ci0gIENpZ1N0YXRlIGNpZ19zdGF0ZTsKLSAgc3RkOjptYXA8UmF3QWRkcmVzcywgdWludDhfdD4gY2xpZW50c19saXN0OyAvLyBhZGRyZXNzIGFuZCBjb3VudAotICBzdGQ6Om1hcDx1aW50OF90LCBDSVMgKj4gY2lzX2xpc3Q7IC8vIGNpcyBpZCB0byBDSVMKLX07Ci0KLWNsYXNzIENpc0ludGVyZmFjZUltcGw7Ci1DaXNJbnRlcmZhY2VJbXBsICppbnN0YW5jZTsKLQotc3RhdGljIHZvaWQgaGNpX2NpZ19wYXJhbV9jYWxsYmFjayh0QlRNX0JMRV9TRVRfQ0lHX1JFVF9QQVJBTSAqcGFyYW0pOwotc3RhdGljIHZvaWQgaGNpX2NpZ19wYXJhbV90ZXN0X2NhbGxiYWNrKHRCVE1fQkxFX1NFVF9DSUdfUEFSQU1fVEVTVF9SRVQgKnBhcmFtKTsKLXN0YXRpYyB2b2lkIGhjaV9jaWdfcmVtb3ZlX3BhcmFtX2NhbGxiYWNrKHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IGNpZ19pZCk7Ci1zdGF0aWMgdm9pZCBoY2lfY2lzX2NyZWF0ZV9zdGF0dXNfY2FsbGJhY2soIHVpbnQ4X3Qgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGhjaV9jaXNfY3JlYXRlX2NhbGxiYWNrKHRCVE1fQkxFX0NJU19FU1RBQkxJU0hFRF9FVlRfUEFSQU0gKnBhcmFtKTsKLXN0YXRpYyB2b2lkIGhjaV9jaXNfc2V0dXBfZGF0YXBhdGhfY2FsbGJhY2soIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faGFuZGxlKTsKLXN0YXRpYyB2b2lkIGhjaV9jaXNfZGlzY29ubmVjdF9jYWxsYmFjayh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY2lzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWFzb24pOwotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVJZGxlOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQ0lTIFN0YXRlIDogIiA8PCBHZXRTdGF0ZSgpOwotfQotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVJZGxlOjpPbkV4aXQoKSB7Ci0KLX0KLQotYm9vbCBDaXNTdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQ0lTIFN0YXRlID0gIiA8PCBHZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IEV2ZW50ID0gIiA8PCBjaXNfLmNpc19zbS5HZXRFdmVudE5hbWUoZXZlbnQpOwotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBDSVMgSWQgPSAiIDw8IGxvZ2hleChjaXNfLmNpc19pZCk7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IENJUyBIYW5kbGUgPSAiIDw8IGxvZ2hleChjaXNfLmNpc19oYW5kbGUpOwotCi0gIGJvb2wgY2lzX3N0YXR1cyA9IHRydWU7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFNFVFVQX0RBVEFfUEFUSF9SRVE6IHsKLSAgICAgIHRJc29TZXRVcERhdGFQYXRoICpkYXRhX3BhdGhfaW5mbyA9ICh0SXNvU2V0VXBEYXRhUGF0aCAqKSBwX2RhdGE7Ci0gICAgICB0QlRNX0JMRV9TRVRfSVNPX0RBVEFfUEFUSF9QQVJBTSBwX3BhcmFtczsKLSAgICAgIHBfcGFyYW1zLmNvbm5faGFuZGxlID0gY2lzXy5jaXNfaGFuZGxlOwotICAgICAgcF9wYXJhbXMuZGF0YV9wYXRoX2RpciA9IGRhdGFfcGF0aF9pbmZvLT5kYXRhX3BhdGhfZGlyZWN0aW9uID4+IDE7Ci0gICAgICBwX3BhcmFtcy5kYXRhX3BhdGhfaWQgPSBkYXRhX3BhdGhfaW5mby0+ZGF0YV9wYXRoX2lkOwotICAgICAgcF9wYXJhbXMuY29kZWNfaWRbMF0gPSAweDA2OwotICAgICAgbWVtc2V0KCZwX3BhcmFtcy5jb2RlY19pZFsxXSwgMHgwMCwgc2l6ZW9mKHBfcGFyYW1zLmNvZGVjX2lkKSAtIDEpOwotICAgICAgbWVtc2V0KCZwX3BhcmFtcy5jb250X2RlbGF5LCAweDAwLCBzaXplb2YocF9wYXJhbXMuY29udF9kZWxheSkpOwotICAgICAgcF9wYXJhbXMuY29kZWNfY29uZmlnX2xlbmd0aCA9IDB4MDA7Ci0gICAgICBwX3BhcmFtcy5jb2RlY19jb25maWcgPSBudWxscHRyOwotICAgICAgcF9wYXJhbXMucF9jYiA9ICZoY2lfY2lzX3NldHVwX2RhdGFwYXRoX2NhbGxiYWNrOwotICAgICAgaWYoQlRNX0JsZVNldElzb0RhdGFQYXRoKCZwX3BhcmFtcykgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgY2lzXy5jaXNfc20uVHJhbnNpdGlvblRvKENpc1N0YXRlTWFjaGluZTo6a1N0YXRlU2V0dGluZ0RhdGFQYXRoKTsKLSAgICAgICAgRGF0YVBhdGhOb2RlIG5vZGUgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gU0VUVVBfREFUQV9QQVRIX1JFUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldHVwX2RhdGFwYXRoID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25uX2hhbmRsZSA9IGNpc18uY2lzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YV9wYXRoX2RpcmVjdGlvbiAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wYXRoX2luZm8tPmRhdGFfcGF0aF9kaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGFfcGF0aF9pZCA9IGRhdGFfcGF0aF9pbmZvLT5kYXRhX3BhdGhfaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBjaXNfLmRhdGFwYXRoX3F1ZXVlLnB1c2hfYmFjayhub2RlKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjaXNfc3RhdHVzID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gY2lzX3N0YXR1czsKLX0KLQotdm9pZCBDaXNTdGF0ZU1hY2hpbmU6OlN0YXRlU2V0dGluZ0RhdGFQYXRoOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQ0lTIFN0YXRlIDogIiA8PCBHZXRTdGF0ZSgpOwotfQotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVTZXR0aW5nRGF0YVBhdGg6Ok9uRXhpdCgpIHsKLQotfQotCi1ib29sIENpc1N0YXRlTWFjaGluZTo6U3RhdGVTZXR0aW5nRGF0YVBhdGg6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBDSVMgU3RhdGUgPSAiIDw8IEdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogRXZlbnQgPSAiIDw8IGNpc18uY2lzX3NtLkdldEV2ZW50TmFtZShldmVudCk7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IENJUyBJZCA9ICIgPDwgbG9naGV4KGNpc18uY2lzX2lkKTsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQ0lTIEhhbmRsZSA9ICIgPDwgbG9naGV4KGNpc18uY2lzX2hhbmRsZSk7Ci0KLSAgYm9vbCBjaXNfc3RhdHVzID0gdHJ1ZTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgU0VUVVBfREFUQV9QQVRIX1JFUTogewotICAgICAgLy8gYWRkIHRoZW0gdG8gdGhlIHF1ZXVlCi0gICAgICB0SXNvU2V0VXBEYXRhUGF0aCAqZGF0YV9wYXRoX2luZm8gPSAodElzb1NldFVwRGF0YVBhdGggKikgcF9kYXRhOwotCi0gICAgICBEYXRhUGF0aE5vZGUgbm9kZSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gU0VUVVBfREFUQV9QQVRIX1JFUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXR1cF9kYXRhcGF0aCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25uX2hhbmRsZSA9ICBjaXNfLmNpc19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YV9wYXRoX2RpcmVjdGlvbiAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3BhdGhfaW5mby0+ZGF0YV9wYXRoX2RpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YV9wYXRoX2lkID0gZGF0YV9wYXRoX2luZm8tPmRhdGFfcGF0aF9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICBjaXNfLmRhdGFwYXRoX3F1ZXVlLnB1c2hfYmFjayhub2RlKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgU0VUVVBfREFUQV9QQVRIX0RPTkVfRVZUOiB7Ci0gICAgICB0QlRNX0JMRV9DSVNfREFUQV9QQVRIX0VWVF9QQVJBTSAqcGFyYW0gPQotICAgICAgICAgICAgICAgICAgKHRCVE1fQkxFX0NJU19EQVRBX1BBVEhfRVZUX1BBUkFNICopIHBfZGF0YTsKLSAgICAgIGNpc18uZGF0YXBhdGhfc3RhdHVzID0gcGFyYW0tPnN0YXR1czsKLQotICAgICAgaWYoIWNpc18uZGF0YXBhdGhfcXVldWUuZW1wdHkoKSkgewotICAgICAgICBpZihjaXNfLmRhdGFwYXRoX3N0YXR1cyA9PSBJU09fSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgICBEYXRhUGF0aE5vZGUgbm9kZSA9IGNpc18uZGF0YXBhdGhfcXVldWUuZnJvbnQoKTsKLSAgICAgICAgICBpZihub2RlLnR5cGUgPT0gU0VUVVBfREFUQV9QQVRIX1JFUSkgewotICAgICAgICAgICAgdWludDhfdCBkaXJlY3Rpb24gPSBub2RlLnNldHVwX2RhdGFwYXRoLmRhdGFfcGF0aF9kaXJlY3Rpb247Ci0gICAgICAgICAgICBpZihkaXJlY3Rpb24gPT0gRElSX1RPX0FJUikgewotICAgICAgICAgICAgICBjaXNfLnRvX2Fpcl9zZXR1cF9kb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggZGlyZWN0aW9uID09IERJUl9GUk9NX0FJUikgewotICAgICAgICAgICAgICBjaXNfLmZyb21fYWlyX3NldHVwX2RvbmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyByZW1vdmUgdGhlIGVudHJ5IGFzIGl0IGlzIHByb2Nlc3NlZAotICAgICAgICBjaXNfLmRhdGFwYXRoX3F1ZXVlLnBvcF9mcm9udCgpOwotICAgICAgfQotCi0gICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IG1vcmUgZW50cmllcyBpbiBxdWV1ZSBub3cKLSAgICAgIC8vIGV4cGVjdCB0aGUgcXVldWUgZW50cnkgdG8gYmUgb2Ygc2V0dXAgZGF0YXBhdGggb25seQotICAgICAgaWYoIWNpc18uZGF0YXBhdGhfcXVldWUuZW1wdHkoKSkgewotICAgICAgICBEYXRhUGF0aE5vZGUgbm9kZSA9IGNpc18uZGF0YXBhdGhfcXVldWUuZnJvbnQoKTsKLSAgICAgICAgaWYobm9kZS50eXBlID09IFNFVFVQX0RBVEFfUEFUSF9SRVEpIHsKLSAgICAgICAgICB0QlRNX0JMRV9TRVRfSVNPX0RBVEFfUEFUSF9QQVJBTSBwX3BhcmFtczsKLSAgICAgICAgICBwX3BhcmFtcy5jb25uX2hhbmRsZSA9IG5vZGUuc2V0dXBfZGF0YXBhdGguY29ubl9oYW5kbGU7Ci0gICAgICAgICAgcF9wYXJhbXMuZGF0YV9wYXRoX2RpciA9IG5vZGUuc2V0dXBfZGF0YXBhdGguZGF0YV9wYXRoX2RpcmVjdGlvbiA+PiAxOwotICAgICAgICAgIHBfcGFyYW1zLmRhdGFfcGF0aF9pZCA9IG5vZGUuc2V0dXBfZGF0YXBhdGguZGF0YV9wYXRoX2lkOwotICAgICAgICAgIHBfcGFyYW1zLmNvZGVjX2lkWzBdID0gMHgwNjsKLSAgICAgICAgICBtZW1zZXQoJnBfcGFyYW1zLmNvZGVjX2lkWzFdLCAweDAwLCBzaXplb2YocF9wYXJhbXMuY29kZWNfaWQpIC0gMSk7Ci0gICAgICAgICAgbWVtc2V0KCZwX3BhcmFtcy5jb250X2RlbGF5LCAweDAwLCBzaXplb2YocF9wYXJhbXMuY29udF9kZWxheSkpOwotICAgICAgICAgIHBfcGFyYW1zLmNvZGVjX2NvbmZpZ19sZW5ndGggPSAweDAwOwotICAgICAgICAgIHBfcGFyYW1zLmNvZGVjX2NvbmZpZyA9IG51bGxwdHI7Ci0gICAgICAgICAgcF9wYXJhbXMucF9jYiA9ICZoY2lfY2lzX3NldHVwX2RhdGFwYXRoX2NhbGxiYWNrOwotICAgICAgICAgIGlmKEJUTV9CbGVTZXRJc29EYXRhUGF0aCgmcF9wYXJhbXMpICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTZXR1cCBEYXRhcGF0aCBGYWlsZWQiOwotICAgICAgICAgICAgY2lzXy5kYXRhcGF0aF9xdWV1ZS5wb3BfZnJvbnQoKTsKLSAgICAgICAgICAgIGNpc18uY2lzX3NtLlRyYW5zaXRpb25UbyhDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlYWR5KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCBlbnRyeSI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNpc18uY2lzX3NtLlRyYW5zaXRpb25UbyhDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlYWR5KTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjaXNfc3RhdHVzID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gY2lzX3N0YXR1czsKLX0KLQotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVSZWFkeTo6T25FbnRlcigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IENJUyBTdGF0ZSA6ICIgPDwgR2V0U3RhdGUoKTsKLSAgLy8gdXBkYXRlIHRoZSByZWFkeSBzdGF0ZSBpbmNhc2Ugb2YgdHJhbnNpdGlvbmVkIGZyb20gc3RhdGVzIGV4Y2VwdAotICAvLyBzZXR0aW5nIHVwIGRhdGFwYXRoIGFzIENJRyBzdGF0ZSBldmVudCBpcyBzdWZmaWNpZW50IGZvciB0cmFuc2l0aW9uCi0gIC8vIGZyb20gc2V0dGluZyB1cCBkYXRhIHBhdGggdG8gcmVhZHkuCi0gIGlmKGNpc18uY2lzX3NtLlByZXZpb3VzU3RhdGVJZCgpICE9IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlU2V0dGluZ0RhdGFQYXRoKSB7Ci0gICAgY2lzXy5jaXNfY2FsbGJhY2stPk9uQ2lzU3RhdGUoY2lzXy5jaWdfaWQsIGNpc18uY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpc18uZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpc1N0YXRlOjpSRUFEWSk7Ci0gIH0KLX0KLQotdm9pZCBDaXNTdGF0ZU1hY2hpbmU6OlN0YXRlUmVhZHk6Ok9uRXhpdCgpIHsKLQotfQotCi1ib29sIENpc1N0YXRlTWFjaGluZTo6U3RhdGVSZWFkeTo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQ0lTIFN0YXRlID0gIiA8PCBHZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IEV2ZW50ID0gIiA8PCBjaXNfLmNpc19zbS5HZXRFdmVudE5hbWUoZXZlbnQpOwotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBDSVMgSWQgPSAiIDw8IGxvZ2hleChjaXNfLmNpc19pZCk7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IENJUyBIYW5kbGUgPSAiIDw8IGxvZ2hleChjaXNfLmNpc19oYW5kbGUpOwotCi0gIGJvb2wgY2lzX3N0YXR1cyA9IHRydWU7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIENJU19DUkVBVEVfUkVROiB7Ci0gICAgICB0QlRNX0JMRV9JU09fQ1JFQVRFX0NJU19DTURfUEFSQU0gY21kX2RhdGE7Ci0gICAgICBDcmVhdGVDaXNOb2RlICpwTm9kZSA9IChDcmVhdGVDaXNOb2RlICopIHBfZGF0YTsKLSAgICAgIGNtZF9kYXRhLmNpc19jb3VudCA9IHBOb2RlLT5jaXNfaWRzLnNpemUoKTsKLSAgICAgIGNtZF9kYXRhLnBfY2IgPSAmaGNpX2Npc19jcmVhdGVfc3RhdHVzX2NhbGxiYWNrOwotICAgICAgY21kX2RhdGEucF9ldnRfY2IgPSAmaGNpX2Npc19jcmVhdGVfY2FsbGJhY2s7Ci0gICAgICB0QUNMX0NPTk4qIGFjbCA9IGJ0bV9iZGFfdG9fYWNsKHBOb2RlLT5wZWVyX2JkYSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgICAgIGlmKCFhY2wpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgY3JlYXRlX2NpcyByZXR1cm4gIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmb3IgKGF1dG8gaTogcE5vZGUtPmNpc19oYW5kbGVzKSB7Ci0KLSAgICAgICAgdEJUTV9CTEVfQ0hBTk5FTF9NQVAgbWFwID0geyAuY2lzX2Nvbm5faGFuZGxlID0gaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWNsX2Nvbm5faGFuZGxlID0gYWNsLT5oY2lfaGFuZGxlIH07Ci0gICAgICAgIGNtZF9kYXRhLmxpbmtfY29ubl9oYW5kbGVzLnB1c2hfYmFjayhtYXApOwotICAgICAgfQotICAgICAgaWYoQlRNX0JsZUNyZWF0ZUNpcygmY21kX2RhdGEsICZoY2lfY2lzX2Rpc2Nvbm5lY3RfY2FsbGJhY2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgID09IEhDSV9TVUNDRVNTKQotICAgICAgICBjaXNfLmNpc19zbS5UcmFuc2l0aW9uVG8oQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hpbmcpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBDSVNfQ1JFQVRFX1JFUV9EVU1NWTogewotICAgICAgY2lzXy5jaXNfc20uVHJhbnNpdGlvblRvKENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoaW5nKTsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjaXNfc3RhdHVzID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gY2lzX3N0YXR1czsKLX0KLQotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVEZXN0cm95aW5nOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQ0lTIFN0YXRlIDogIiA8PCBHZXRTdGF0ZSgpOwotICBjaXNfLmNpc19jYWxsYmFjay0+T25DaXNTdGF0ZShjaXNfLmNpZ19pZCwgY2lzXy5jaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpc18uZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXNTdGF0ZTo6REVTVFJPWUlORyk7Ci19Ci0KLXZvaWQgQ2lzU3RhdGVNYWNoaW5lOjpTdGF0ZURlc3Ryb3lpbmc6Ok9uRXhpdCgpIHsKLQotfQotCi1ib29sIENpc1N0YXRlTWFjaGluZTo6U3RhdGVEZXN0cm95aW5nOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKSB7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IENJUyBTdGF0ZSA9ICIgPDwgR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwiOiBFdmVudCA9ICIgPDwgY2lzXy5jaXNfc20uR2V0RXZlbnROYW1lKGV2ZW50KTsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQ0lTIElkID0gIiA8PCBsb2doZXgoY2lzXy5jaXNfaWQpOwotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBDSVMgSGFuZGxlID0gIiA8PCBsb2doZXgoY2lzXy5jaXNfaGFuZGxlKTsKLQotICBib29sIGNpc19zdGF0dXMgPSB0cnVlOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBDSVNfRElTQ09OTkVDVEVEX0VWVDogewotICAgICAgdEJUTV9CTEVfQ0lTX0RJU0NPTk5FQ1RFRF9FVlRfUEFSQU0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgKHRCVE1fQkxFX0NJU19ESVNDT05ORUNURURfRVZUX1BBUkFNICopIHBfZGF0YTsKLSAgICAgIGlmKHBhcmFtLT5zdGF0dXMgIT0gSVNPX0hDSV9TVUNDRVNTKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDxfX2Z1bmNfXyAgPDwgIiBjaXMgZGlzY29ubmVjdGlvbiBmYWlsZWQiOwotICAgICAgICBjaXNfLmNpc19zbS5UcmFuc2l0aW9uVG8oY2lzXy5jaXNfc20uUHJldmlvdXNTdGF0ZUlkKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2lzXy5jaXNfc20uVHJhbnNpdGlvblRvKENpc1N0YXRlTWFjaGluZTo6a1N0YXRlUmVhZHkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNpc19zdGF0dXMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBjaXNfc3RhdHVzOwotfQotCi0KLXZvaWQgQ2lzU3RhdGVNYWNoaW5lOjpTdGF0ZUVzdGFibGlzaGluZzo6T25FbnRlcigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IENJUyBTdGF0ZSA6ICIgPDwgR2V0U3RhdGUoKTsKLSAgY2lzXy5jaXNfY2FsbGJhY2stPk9uQ2lzU3RhdGUoY2lzXy5jaWdfaWQsIGNpc18uY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXNfLmRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lzU3RhdGU6OkVTVEFCTElTSElORyk7Ci19Ci0KLXZvaWQgQ2lzU3RhdGVNYWNoaW5lOjpTdGF0ZUVzdGFibGlzaGluZzo6T25FeGl0KCkgewotCi19Ci0KLWJvb2wgQ2lzU3RhdGVNYWNoaW5lOjpTdGF0ZUVzdGFibGlzaGluZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKSB7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IENJUyBTdGF0ZSA9ICIgPDwgR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwiOiBFdmVudCA9ICIgPDwgY2lzXy5jaXNfc20uR2V0RXZlbnROYW1lKGV2ZW50KTsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQ0lTIElkID0gIiA8PCBsb2doZXgoY2lzXy5jaXNfaWQpOwotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBDSVMgSGFuZGxlID0gIiA8PCBsb2doZXgoY2lzXy5jaXNfaGFuZGxlKTsKLQotICBib29sIGNpc19zdGF0dXMgPSB0cnVlOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBDSVNfU1RBVFVTX0VWVDogewotICAgICAgdWludDhfdCBzdGF0dXMgPSAqKCh1aW50OF90ICopKHBfZGF0YSkpOwotICAgICAgaWYoc3RhdHVzICE9IElTT19IQ0lfU1VDQ0VTUykgewotICAgICAgICBjaXNfLmNpc19zbS5UcmFuc2l0aW9uVG8oQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVSZWFkeSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIENJU19FU1RBQkxJU0hFRF9FVlQ6IHsKLSAgICAgIHRCVE1fQkxFX0NJU19FU1RBQkxJU0hFRF9FVlRfUEFSQU0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICh0QlRNX0JMRV9DSVNfRVNUQUJMSVNIRURfRVZUX1BBUkFNICopIHBfZGF0YTsKLSAgICAgIGlmKHBhcmFtLT5zdGF0dXMgIT0gSVNPX0hDSV9TVUNDRVNTKSB7Ci0gICAgICAgIGNpc18uY2lzX3NtLlRyYW5zaXRpb25UbyhDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlYWR5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNpc18uY2lzX3NtLlRyYW5zaXRpb25UbyhDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZUVzdGFibGlzaGVkKTsKLQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGNpc19zdGF0dXMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBjaXNfc3RhdHVzOwotfQotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVFc3RhYmxpc2hlZDo6T25FbnRlcigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IENJUyBTdGF0ZSA6ICIgPDwgR2V0U3RhdGUoKTsKLSAgY2lzXy5kaXNjX2RpcmVjdGlvbiA9IGNpc18uZGlyZWN0aW9uOwotICBjaXNfLmNpc19jYWxsYmFjay0+T25DaXNTdGF0ZShjaXNfLmNpZ19pZCwgY2lzXy5jaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpc18uZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXNTdGF0ZTo6RVNUQUJMSVNIRUQpOwotfQotCi12b2lkIENpc1N0YXRlTWFjaGluZTo6U3RhdGVFc3RhYmxpc2hlZDo6T25FeGl0KCkgewotCi19Ci0KLWJvb2wgQ2lzU3RhdGVNYWNoaW5lOjpTdGF0ZUVzdGFibGlzaGVkOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBDSVMgU3RhdGUgPSAiIDw8IEdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogRXZlbnQgPSAiIDw8IGNpc18uY2lzX3NtLkdldEV2ZW50TmFtZShldmVudCk7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IENJUyBJZCA9ICIgPDwgbG9naGV4KGNpc18uY2lzX2lkKTsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQ0lTIEhhbmRsZSA9ICIgPDwgbG9naGV4KGNpc18uY2lzX2hhbmRsZSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQ0lTX0RJU0NPTk5FQ1RfUkVROgotICAgICAgaWYoQlRNX0JsZUlzb0Npc0Rpc2Nvbm5lY3QoY2lzXy5jaXNfaGFuZGxlLCAweDEzICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoY2lfY2lzX2Rpc2Nvbm5lY3RfY2FsbGJhY2spID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfU1VDQ0VTUykgewotICAgICAgICBjaXNfLmNpc19zbS5UcmFuc2l0aW9uVG8oQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVEZXN0cm95aW5nKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0lTX0RJU0NPTk5FQ1RFRF9FVlQ6IHsKLSAgICAgIHRCVE1fQkxFX0NJU19ESVNDT05ORUNURURfRVZUX1BBUkFNICpwYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICh0QlRNX0JMRV9DSVNfRElTQ09OTkVDVEVEX0VWVF9QQVJBTSAqKSBwX2RhdGE7Ci0gICAgICBpZihwYXJhbS0+c3RhdHVzICE9IElTT19IQ0lfU1VDQ0VTUykgewotICAgICAgICBMT0coRVJST1IpIDw8X19mdW5jX18gIDw8ICIgY2lzIGRpc2Nvbm5lY3Rpb24gZmFpbGVkIjsKLSAgICAgICAgY2lzXy5jaXNfc20uVHJhbnNpdGlvblRvKGNpc18uY2lzX3NtLlByZXZpb3VzU3RhdGVJZCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNpc18uY2lzX3NtLlRyYW5zaXRpb25UbyhDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlYWR5KTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotY2xhc3MgQ2lzSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBDaXNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQ2lzSW50ZXJmYWNlSW1wbChDaXNJbnRlcmZhY2VDYWxsYmFja3MqIGNhbGxiYWNrKToKLSAgICAgY2FsbGJhY2tzKGNhbGxiYWNrKSAgeyB9Ci0KLSAgfkNpc0ludGVyZmFjZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBDbGVhblVwICgpIHsKLQotICB9Ci0KLSAgQ2lnU3RhdGUgR2V0Q2lnU3RhdGUoY29uc3QgdWludDhfdCAmY2lnX2lkKSBvdmVycmlkZSB7Ci0gICAgQ0lHICpjaWcgPSBHZXRDaWcoY2lnX2lkKTsKLSAgICBpZiAoY2lnICE9IG51bGxwdHIpIHsKLSAgICAgIHJldHVybiBjaWctPmNpZ19zdGF0ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIENpZ1N0YXRlOjpJRExFOwotICAgIH0KLSAgfQotCi0gIENpc1N0YXRlIEdldENpc1N0YXRlKGNvbnN0IHVpbnQ4X3QgJmNpZ19pZCwgdWludDhfdCBjaXNfaWQpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gQ2lzU3RhdGU6OlJFQURZOwotICB9Ci0KLSAgdWludDhfdCBHZXRDaXNDb3VudChjb25zdCB1aW50OF90ICZjaWdfaWQpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIElzb0hjaVN0YXR1cyBDcmVhdGVDaWcoUmF3QWRkcmVzcyBjbGllbnRfcGVlcl9iZGEsIGJvb2wgcmVjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0lHQ29uZmlnICZjaWdfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENJU0NvbmZpZz4gJmNpc19jb25maWdzKSBvdmVycmlkZSB7Ci0gICAgLy8gY2hlY2sgaWYgQ0lHIGFscmVhZHkgZXhpc3RzCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiIDogQ0lHIElkID0gIiA8PCBsb2doZXgoY2lnX2NvbmZpZy5jaWdfaWQpOwotICAgIENJRyAqY2lnID0gR2V0Q2lnKGNpZ19jb25maWcuY2lnX2lkKTsKLSAgICBpZiAoY2lnICE9IG51bGxwdHIpIHsKLSAgICAgIGF1dG8gaXQgPSBjaWctPmNsaWVudHNfbGlzdC5maW5kKGNsaWVudF9wZWVyX2JkYSk7Ci0gICAgICBpZiAoaXQgPT0gY2lnLT5jbGllbnRzX2xpc3QuZW5kKCkpIHsKLSAgICAgICAgY2lnLT5jbGllbnRzX2xpc3QuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNsaWVudF9wZWVyX2JkYSwgMHgwMSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIXJlY29uZmlnKSB7Ci0gICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBjb3VudAotICAgICAgICAgIGl0LT5zZWNvbmQrKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gY2hlY2sgaWYgcGFyYW1zIGFyZSBzYW1lIGZvciBncm91cCByZXF1ZXN0ZWQKLSAgICAgIC8vIGFuZCBmb3IgdGhlIGdyb3VwIGFscmVkeSBleGlzdHMKLSAgICAgIGlmKGNpZy0+Y2lnX3N0YXRlID09IENpZ1N0YXRlOjpDUkVBVElORykgewotICAgICAgICByZXR1cm4gSVNPX0hDSV9JTl9QUk9HUkVTUzsKLSAgICAgIH0gZWxzZSBpZihJc0NpZ1BhcmFtc1NhbWUoY2lnX2NvbmZpZywgY2lzX2NvbmZpZ3MpKSB7Ci0gICAgICAgIGlmKGNpZy0+Y2lnX3N0YXRlID09IENpZ1N0YXRlOjpDUkVBVEVEKSB7Ci0gICAgICAgICAgcmV0dXJuIElTT19IQ0lfU1VDQ0VTUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIGNoZWNrIGlmIHRoZSBDSVMgdmVjdG9yIGxlbmd0aCBpcyBzYW1lIGFzIGNpcyBjb3VudCBwYXNzZWQKLSAgICAvLyBpbiBDSUcgY29uZmlmdXJhdGlvbgotICAgIGlmKGNpZ19jb25maWcuY2lzX2NvdW50ICE9IGNpc19jb25maWdzLnNpemUoKSkgewotICAgICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICAgIH0KLQotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgICBib29sIGNyZWF0ZV9jaWcgPSBmYWxzZTsKLSAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QudmVuZG9yLmJ0c3RhY2suZ2V0X2NpZ190ZXN0X3BhcmFtIiwgdmFsdWUsICIiKTsKLSAgICB1aW50MTZfdCBmdF9tX3MsIGZ0X3NfbSwgaXNvX2ludCwgY2xrX2FjY3VyYWN5LCBuc2UsIHBkdV9tX3MsIHBkdV9zX20sIGJuX21fcywgYm5fc19tOwotICAgIGludCByZXMgPSBzc2NhbmYodmFsdWUsICIlaHUsJWh1LCVodSwlaHUsJWh1LCVodSwlaHUsJWh1LCVodSIsICZmdF9tX3MsICZmdF9zX20sICZpc29faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGtfYWNjdXJhY3ksICZuc2UsICZwZHVfbV9zLCAmcGR1X3NfbSwgJmJuX21fcywgJmJuX3NfbSk7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fPDwgIjogRlRfTV9TOiAiIDw8IGxvZ2hleChmdF9tX3MpIDw8ICIsIEZUX1NfTTogIiA8PCBsb2doZXgoZnRfc19tKQotICAgICAgICAgICAgICAgICA8PCAiLCBJU09fSW50ZXJ2YWw6ICIgPDwgbG9naGV4KGlzb19pbnQpIDw8ICIsIHNsYXZlX2Nsb2NrOiAiIDw8IGxvZ2hleChjbGtfYWNjdXJhY3kpCi0gICAgICAgICAgICAgICAgIDw8ICIsIE5TRTogIiA8PCBsb2doZXgobnNlKSA8PCAiLCBQRFVfTV9TOiIgPDwgbG9naGV4KHBkdV9tX3MpCi0gICAgICAgICAgICAgICAgIDw8ICIgUERVX1NfTToiIDw8IGxvZ2hleChwZHVfc19tKSA8PCAiLCBCTl9NX1M6ICIgPDwgbG9naGV4KGJuX21fcykKLSAgICAgICAgICAgICAgICAgPDwgIiwgQk5fU19NOiAiIDw8IGxvZ2hleChibl9zX20pOwotICAgIGlmIChyZXMgPT0gOSkgewotICAgICAgdEJUTV9CTEVfU0VUX0NJR19QQVJBTV9URVNUIHBfZGF0YV90ZXN0OwotICAgICAgcF9kYXRhX3Rlc3QuY2lnX2lkID0gY2lnX2NvbmZpZy5jaWdfaWQ7Ci0gICAgICBtZW1jcHkoJnBfZGF0YV90ZXN0LnNkdV9pbnRfc190b19tLCAmY2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfc190b19tLAotICAgICAgICAgICAgICBzaXplb2YocF9kYXRhX3Rlc3Quc2R1X2ludF9zX3RvX20pKTsKLQotICAgICAgbWVtY3B5KCZwX2RhdGFfdGVzdC5zZHVfaW50X21fdG9fcywgJmNpZ19jb25maWcuc2R1X2ludGVydmFsX21fdG9fcywKLSAgICAgICAgICAgICAgc2l6ZW9mKHBfZGF0YV90ZXN0LnNkdV9pbnRfbV90b19zKSk7Ci0KLSAgICAgIHBfZGF0YV90ZXN0LmZ0X21fdG9fcyA9IGZ0X21fczsKLSAgICAgIHBfZGF0YV90ZXN0LmZ0X3NfdG9fbSA9IGZ0X3NfbTsKLSAgICAgIHBfZGF0YV90ZXN0Lmlzb19pbnRlcnZhbCA9IGlzb19pbnQ7Ci0gICAgICBwX2RhdGFfdGVzdC5zbGF2ZV9jbG9ja19hY2N1cmFjeSA9IGNsa19hY2N1cmFjeTsKLSAgICAgIHBfZGF0YV90ZXN0LnBhY2tpbmcgPSBjaWdfY29uZmlnLnBhY2tpbmc7Ci0gICAgICBwX2RhdGFfdGVzdC5mcmFtaW5nID0gY2lnX2NvbmZpZy5mcmFtaW5nOwotICAgICAgcF9kYXRhX3Rlc3QuY2lzX2NvdW50ID0gY2lnX2NvbmZpZy5jaXNfY291bnQ7Ci0KLSAgICAgIGZvciAoYXV0byBpdCA9IGNpc19jb25maWdzLmJlZ2luKCk7IGl0ICE9IGNpc19jb25maWdzLmVuZCgpOykgewotICAgICAgICB0QlRNX0JMRV9DSVNfVEVTVF9DT05GSUcgY2lzX2NvbmZpZzsKLSAgICAgICAgY2lzX2NvbmZpZy5jaXNfaWQgPSBpdC0+Y2lzX2lkOwotICAgICAgICBjaXNfY29uZmlnLm5zZSA9IG5zZTsKLSAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X21fdG9fcyA9IGl0LT5tYXhfc2R1X21fdG9fczsKLSAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X3NfdG9fbSA9IGl0LT5tYXhfc2R1X3NfdG9fbTsKLSAgICAgICAgY2lzX2NvbmZpZy5tYXhfcGR1X21fdG9fcyA9IGl0LT5tYXhfc2R1X21fdG9fczsKLSAgICAgICAgY2lzX2NvbmZpZy5tYXhfcGR1X3NfdG9fbSA9IGl0LT5tYXhfc2R1X3NfdG9fbTsKLSAgICAgICAgY2lzX2NvbmZpZy5waHlfbV90b19zID0gaXQtPnBoeV9tX3RvX3M7Ci0gICAgICAgIGNpc19jb25maWcucGh5X3NfdG9fbSA9IGl0LT5waHlfc190b19tOwotICAgICAgICBjaXNfY29uZmlnLmJuX21fdG9fcyA9IGJuX21fczsKLSAgICAgICAgY2lzX2NvbmZpZy5ibl9zX3RvX20gPSAwOwotICAgICAgICBpZiAoY2lzX2NvbmZpZy5tYXhfc2R1X3NfdG9fbSA+IDApIHsKLSAgICAgICAgICBjaXNfY29uZmlnLmJuX3NfdG9fbSA9IGJuX3NfbTsKLSAgICAgICAgICBpZiAoY2lzX2NvbmZpZy5tYXhfc2R1X21fdG9fcyA+IDAgJiYgY2lzX2NvbmZpZy5uc2UgPiAxMykgewotICAgICAgICAgICAgY2lzX2NvbmZpZy5uc2UgPSAxMzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcF9kYXRhX3Rlc3QuY2lzX2NvbmZpZy5wdXNoX2JhY2soY2lzX2NvbmZpZyk7Ci0gICAgICAgIGl0Kys7Ci0gICAgICB9Ci0gICAgICBwX2RhdGFfdGVzdC5wX2NiID0gJmhjaV9jaWdfcGFyYW1fdGVzdF9jYWxsYmFjazsKLSAgICAgIGNyZWF0ZV9jaWcgPSAoQlRNX0JsZVNldENpZ1BhcmFtZXRlcnNUZXN0KCZwX2RhdGFfdGVzdCkgPT0gSENJX1NVQ0NFU1MpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0QlRNX0JMRV9JU09fU0VUX0NJR19DTURfUEFSQU0gcF9kYXRhOwotICAgICAgcF9kYXRhLmNpZ19pZCA9IGNpZ19jb25maWcuY2lnX2lkOwotICAgICAgbWVtY3B5KCZwX2RhdGEuc2R1X2ludF9zX3RvX20sICZjaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9zX3RvX20sCi0gICAgICAgICAgICAgIHNpemVvZihwX2RhdGEuc2R1X2ludF9zX3RvX20pKTsKLQotICAgICAgbWVtY3B5KCZwX2RhdGEuc2R1X2ludF9tX3RvX3MsICZjaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9tX3RvX3MsCi0gICAgICAgICAgICAgIHNpemVvZihwX2RhdGEuc2R1X2ludF9tX3RvX3MpKTsKLQotICAgICAgcF9kYXRhLnNsYXZlX2Nsb2NrX2FjY3VyYWN5ID0gMHgwMDsKLSAgICAgIHBfZGF0YS5wYWNraW5nID0gY2lnX2NvbmZpZy5wYWNraW5nOwotICAgICAgcF9kYXRhLmZyYW1pbmcgPSBjaWdfY29uZmlnLmZyYW1pbmc7Ci0gICAgICBwX2RhdGEubWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcyA9IGNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfbV90b19zOwotICAgICAgcF9kYXRhLm1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20gPSBjaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbTsKLSAgICAgIHBfZGF0YS5jaXNfY291bnQgPSBjaWdfY29uZmlnLmNpc19jb3VudDsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gY2lzX2NvbmZpZ3MuYmVnaW4oKTsgaXQgIT0gY2lzX2NvbmZpZ3MuZW5kKCk7KSB7Ci0gICAgICAgIHRCVE1fQkxFX0NJU19DT05GSUcgY2lzX2NvbmZpZzsKLSAgICAgICAgbWVtY3B5KCZjaXNfY29uZmlnLCAmKCppdCksIHNpemVvZih0QlRNX0JMRV9DSVNfQ09ORklHKSk7Ci0gICAgICAgIHBfZGF0YS5jaXNfY29uZmlnLnB1c2hfYmFjayhjaXNfY29uZmlnKTsKLSAgICAgICAgaXQrKzsKLSAgICAgIH0KLSAgICAgIHBfZGF0YS5wX2NiID0gJmhjaV9jaWdfcGFyYW1fY2FsbGJhY2s7Ci0gICAgICBjcmVhdGVfY2lnID0gKEJUTV9CbGVTZXRDaWdQYXJhbSgmcF9kYXRhKSA9PSBIQ0lfU1VDQ0VTUyk7Ci0gICAgfQotICAgIGlmKGNyZWF0ZV9jaWcpIHsKLSAgICAgIC8vIGNyZWF0ZSBuZXcgQ0lHIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgIGlmKGNpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgIENJRyAqY2lnID0gbmV3IChDSUcpOwotICAgICAgICBjaWdfbGlzdC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2lnX2NvbmZpZy5jaWdfaWQsIGNpZykpOwotICAgICAgICBjaWctPmNpZ19jb25maWcgPSBjaWdfY29uZmlnOwotICAgICAgICBjaWctPmNpZ19zdGF0ZSA9IENpZ1N0YXRlOjpDUkVBVElORzsKLQotICAgICAgICBmb3IodWludDhfdCBpID0gMDsgaSA8IGNpZ19jb25maWcuY2lzX2NvdW50OyBpKyspICB7Ci0gICAgICAgICAgdWludDhfdCBkaXJlY3Rpb24gPSAwOwotICAgICAgICAgIGlmKGNpc19jb25maWdzW2ldLm1heF9zZHVfbV90b19zKSBkaXJlY3Rpb24gfD0gRElSX1RPX0FJUjsKLSAgICAgICAgICBpZihjaXNfY29uZmlnc1tpXS5tYXhfc2R1X3NfdG9fbSkgZGlyZWN0aW9uIHw9IERJUl9GUk9NX0FJUjsKLQotICAgICAgICAgIENJUyAqY2lzID0gbmV3IENJUyhjaWdfY29uZmlnLmNpZ19pZCwgY2lzX2NvbmZpZ3NbaV0uY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwgY2FsbGJhY2tzKTsKLSAgICAgICAgICBjaXMtPmNpc19jb25maWcgPSBjaXNfY29uZmlnc1tpXTsKLSAgICAgICAgICBjaWctPmNpc19saXN0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihjaXNfY29uZmlnc1tpXS5jaXNfaWQsIGNpcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBpdCA9IGNpZy0+Y2xpZW50c19saXN0LmZpbmQoY2xpZW50X3BlZXJfYmRhKTsKLSAgICAgICAgaWYgKGl0ID09IGNpZy0+Y2xpZW50c19saXN0LmVuZCgpKSB7Ci0gICAgICAgICAgY2lnLT5jbGllbnRzX2xpc3QuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNsaWVudF9wZWVyX2JkYSwgMHgwMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgY291bnQKLSAgICAgICAgICBpdC0+c2Vjb25kKys7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiY291bnQgIiA8PCBsb2doZXgoaXQtPnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNpZy0+Y2lnX2NvbmZpZyA9IGNpZ19jb25maWc7Ci0gICAgICAgIGNpZy0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OkNSRUFUSU5HOwotCi0gICAgICAgIHVpbnQ4X3QgaSA9IDA7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IGNpZy0+Y2lzX2xpc3QuYmVnaW4oKTsgaXQgIT0gY2lnLT5jaXNfbGlzdC5lbmQoKTspIHsKLSAgICAgICAgICBDSVMgKmNpcyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgY2lzLT5jaXNfY29uZmlnID0gY2lzX2NvbmZpZ3NbaV07Ci0gICAgICAgICAgY2lzLT5jaXNfc20uVHJhbnNpdGlvblRvKENpc1N0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICAgICAgaXQrKzsgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBpdCA9IGNpZy0+Y2xpZW50c19saXN0LmZpbmQoY2xpZW50X3BlZXJfYmRhKTsKLSAgICAgICAgaWYgKGl0ID09IGNpZy0+Y2xpZW50c19saXN0LmVuZCgpKSB7Ci0gICAgICAgICAgY2lnLT5jbGllbnRzX2xpc3QuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNsaWVudF9wZWVyX2JkYSwgMHgwMSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gSVNPX0hDSV9JTl9QUk9HUkVTUzsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICAgIH0KLSAgfQotCi0gIElzb0hjaVN0YXR1cyBSZW1vdmVDaWcoUmF3QWRkcmVzcyBjbGllbnRfcGVlcl9iZGEsIHVpbnQ4X3QgY2lnX2lkKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8ICI6IENJRyBJZCA9ICIgPDwgbG9naGV4KGNpZ19pZCk7Ci0gICAgLy8gY2hlY2sgaWYgdGhlIENJRyBleGlzdHMKLSAgICBDSUcgKmNpZyA9IEdldENpZyhjaWdfaWQpOwotICAgIGlmIChjaWcgPT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICAgIH0KLQotICAgIGlmKGNpZy0+Y2lnX3N0YXRlID09IENpZ1N0YXRlOjpJRExFIHx8Ci0gICAgICAgY2lnLT5jaWdfc3RhdGUgPT0gQ2lnU3RhdGU6OkNSRUFUSU5HKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfSBlbHNlIGlmKGNpZy0+Y2lnX3N0YXRlID09IENpZ1N0YXRlOjpDUkVBVEVEKSB7Ci0KLSAgICAgIGF1dG8gaXQgPSBjaWctPmNsaWVudHNfbGlzdC5maW5kKGNsaWVudF9wZWVyX2JkYSk7Ci0gICAgICBpZiAoaXQgPT0gY2lnLT5jbGllbnRzX2xpc3QuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZGVjcmVtZW50IHRoZSBjb3VudAotICAgICAgICBpdC0+c2Vjb25kLS07Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogQ291bnQgOiAiIDw8IGxvZ2hleChpdC0+c2Vjb25kKTsKLSAgICAgIH0KLQotICAgICAgLy8gY2hlY2sgaWYgYWxsIGNsaWVudHMgaGF2ZSB2b3RlZCBvZmYgdGhlbiBnbyBmb3IgQ0lHIHJlbW92YWwKLSAgICAgIHVpbnQ4X3Qgdm90ZV9vbl9jb3VudCA9IDA7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSBjaWctPmNsaWVudHNfbGlzdC5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBjaWctPmNsaWVudHNfbGlzdC5lbmQoKTspIHsKLSAgICAgICAgdm90ZV9vbl9jb3VudCArPSBpdC0+c2Vjb25kOwotICAgICAgICBpdCsrOwotICAgICAgfQotCi0gICAgICBpZih2b3RlX29uX2NvdW50KSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiA6IFZvdGUgT24gQ291bnQgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHZvdGVfb25fY291bnQpOwotICAgICAgICByZXR1cm4gSVNPX0hDSV9TVUNDRVNTOwotICAgICAgfQotCi0gICAgICAvLyBjaGVjayBpZiBhbnkgb2YgdGhlIENJUyBhcmUgaW4gZXN0YWJsaXNoZWQvc3RyZWFtaW5nIHN0YXRlCi0gICAgICAvLyBpZiBzbyByZXR1cm4gZmFsc2UgYXMgaXQgaXMgbm90IGFsbG93ZWQKLSAgICAgIGlmKElzQ2lzQWN0aXZlKGNpZ19pZCwgMHhGRikpIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLQotICAgICAgaWYoQlRNX0JsZVJlbW92ZUNpZyhjaWdfaWQsICZoY2lfY2lnX3JlbW92ZV9wYXJhbV9jYWxsYmFjaykKLSAgICAgICAgICAgICAgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgY2lnLT5jaWdfc3RhdGUgPSBDaWdTdGF0ZTo6UkVNT1ZJTkc7Ci0gICAgICAgIHJldHVybiBJU09fSENJX0lOX1BST0dSRVNTOwotICAgICAgfSBlbHNlIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9Ci0gICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICB9Ci0KLSAgSXNvSGNpU3RhdHVzIENyZWF0ZUNpcyh1aW50OF90IGNpZ19pZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gY2lzX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzIHBlZXJfYmRhKSBvdmVycmlkZSAgewotICAgIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCAiOiBDSUcgSWQgPSAiIDw8IGxvZ2hleChjaWdfaWQpOwotICAgIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCAiOiBOby4gb2YgQ0lTZXMgPSAiIDw8IGxvZ2hleChjaXNfaWRzLnNpemUoKSk7Ci0KLSAgICBJc29IY2lTdGF0dXMgcmV0OwotICAgIHVpbnQzMl90IGN1cl9zdGF0ZTsKLSAgICAvLyBjaGVjayBpZiB0aGUgQ0lHIGV4aXN0cwotICAgIENJRyAqY2lnID0gR2V0Q2lnKGNpZ19pZCk7Ci0gICAgaWYgKGNpZyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoY2lnLT5jaWdfc3RhdGUgIT0gQ2lnU3RhdGU6OkNSRUFURUQpIHsKLSAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBib29sIGNpc19jcmVhdGVkID0gZmFsc2U7Ci0gICAgQ3JlYXRlQ2lzTm9kZSBwYXJhbTsKLSAgICBwYXJhbS5jaWdfaWQgPSBjaWdfaWQ7Ci0gICAgcGFyYW0uY2lzX2lkcyA9IGNpc19pZHM7Ci0gICAgcGFyYW0ucGVlcl9iZGEgPSBwZWVyX2JkYTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY2lzX2hhbmRsZXM7Ci0KLSAgICBmb3IgKGF1dG8gaTogY2lzX2lkcykgewotICAgICAgQ0lTICpjaXMgPSBHZXRDaXMoY2lnX2lkLCBpKTsKLSAgICAgIGlmIChjaXMgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgICB9Ci0gICAgICBjaXNfaGFuZGxlcy5wdXNoX2JhY2soY2lzLT5jaXNfaGFuZGxlKTsKLSAgICB9Ci0gICAgcGFyYW0uY2lzX2hhbmRsZXMgPSBjaXNfaGFuZGxlczsKLQotICAgIGZvciAoYXV0byBpOiBjaXNfaWRzKSB7Ci0gICAgICBMT0coSU5GTykgPDxfX2Z1bmNfXyA8PCAiOiBDSVMgSWQgPSAiIDw8IGxvZ2hleChpKTsKLSAgICAgIC8vIGNoZWNrIGlmIENJUyBJRCBtZW50aW9uZWQgaXMgcHJlc2VudCBhcyBwYXJ0IG9mIENJRwotICAgICAgQ0lTICpjaXMgPSBHZXRDaXMoY2lnX2lkLCBpKTsKLSAgICAgIGlmIChjaXMgPT0gbnVsbHB0cikgewotICAgICAgICByZXQgPSBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGN1cl9zdGF0ZSA9IGNpcy0+Y2lzX3NtLlN0YXRlSWQoKTsKLQotICAgICAgLy8gY2hlY2sgaWYgQ0lTIGlzIGFscmVhZHkgY3JlYXRlZCBvciBpbiBwcm9ncmVzcwotICAgICAgaWYoY3VyX3N0YXRlID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoaW5nKSB7Ci0gICAgICAgIHJldCA9IElTT19IQ0lfSU5fUFJPR1JFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmKGN1cl9zdGF0ZSA9PSBDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZUVzdGFibGlzaGVkKSB7Ci0gICAgICAgIHJldCA9IElTT19IQ0lfU1VDQ0VTUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYoY3VyX3N0YXRlID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRGVzdHJveWluZykgewotICAgICAgICByZXQgPSBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY2lzX2NyZWF0ZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgLy8gcXVldWUgaXQgaWYgdGhlcmUgaXMgcGVuZGluZyBjcmVhdGUgQ0lTCi0gICAgICAgIGlmIChjaXNfcXVldWUuc2l6ZSgpKSB7Ci0gICAgICAgICAgLy8gaGFuZCBpdCBvdmVyIHRvIHRoZSBDSVMgbW9kdWxlCi0gICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIG5ldyByZXF1ZXN0IGlzIGFscmVhZHkgZXhpc3RzCi0gICAgICAgICAgLy8gYXMgdGhlIGhlYWQgZW50cnkgaW4gdGhlIGxpc3QKLSAgICAgICAgICBDcmVhdGVDaXNOb2RlJiBoZWFkID0gY2lzX3F1ZXVlLmZyb250KCk7Ci0gICAgICAgICAgaWYoaGVhZC5jaWdfaWQgPT0gY2lnX2lkICYmIGhlYWQuY2lzX2lkcyA9PSBjaXNfaWRzICYmCi0gICAgICAgICAgICAgaGVhZC5wZWVyX2JkYSA9PSBwZWVyX2JkYSkgewotICAgICAgICAgICAgIGlmKGNpcy0+Y2lzX3NtLlByb2Nlc3NFdmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSXNvSGNpRXZlbnQ6OkNJU19DUkVBVEVfUkVRLCAmcGFyYW0pKSB7Ci0gICAgICAgICAgICAgICByZXQgPSBJU09fSENJX0lOX1BST0dSRVNTOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICByZXQgPSBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2lzX3F1ZXVlLnB1c2hfYmFjayhwYXJhbSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNpc19xdWV1ZS5wdXNoX2JhY2socGFyYW0pOwotICAgICAgICAgIGlmKGNpcy0+Y2lzX3NtLlByb2Nlc3NFdmVudChJc29IY2lFdmVudDo6Q0lTX0NSRUFURV9SRVEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW0pKSB7Ci0gICAgICAgICAgICByZXQgPSBJU09fSENJX0lOX1BST0dSRVNTOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaXNfY3JlYXRlZCA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZihjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19DUkVBVEVfUkVRX0RVTU1ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZWVyX2JkYSkpIHsKLSAgICAgICAgICByZXQgPSBJU09fSENJX0lOX1BST0dSRVNTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldCA9IElTT19IQ0lfRkFJTEVEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBJc29IY2lTdGF0dXMgRGlzY29ubmVjdENpcyh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlyZWN0aW9uKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8ICI6IENJRyBJZCA9ICIgPDwgbG9naGV4KGNpZ19pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogQ0lTIElkID0gIiA8PCBsb2doZXgoY2lzX2lkKTsKLQotICAgIHVpbnQzMl90IGN1cl9zdGF0ZTsKLSAgICAvLyBjaGVjayBpZiB0aGUgQ0lHIGV4aXN0cwotICAgIENJRyAqY2lnID0gR2V0Q2lnKGNpZ19pZCk7Ci0gICAgaWYgKGNpZyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoY2lnLT5jaWdfc3RhdGUgIT0gQ2lnU3RhdGU6OkNSRUFURUQpIHsKLSAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBpZiBDSVMgSUQgbWVudGlvbmVkIGlzIHByZXNlbnQgYXMgcGFydCBvZiBDSUcKLSAgICBDSVMgKmNpcyA9IEdldENpcyhjaWdfaWQsIGNpc19pZCk7Ci0gICAgaWYgKGNpcyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoY2lzLT5kaXNjX2RpcmVjdGlvbiAmIGRpcmVjdGlvbikgewotICAgICAgIC8vIHJlbW92ZSB0aGUgZGlyZWN0aW9uIGJpdCBmb3JtIGRpc2MgZGlyZWNpdG9uCi0gICAgICAgY2lzLT5kaXNjX2RpcmVjdGlvbiAmPSB+ZGlyZWN0aW9uOwotICAgIH0KLQotICAgIGlmKGNpcy0+ZGlzY19kaXJlY3Rpb24pIHJldHVybiBJU09fSENJX1NVQ0NFU1M7Ci0KLSAgICAvLyBpZiBhbGwgZGlyZWN0aW9ucyBhcmUgdm90ZWQgb2ZmIGdvIGZvciBDSVMgZGlzY29ubmVjaXRvbgotICAgIGN1cl9zdGF0ZSA9IGNpcy0+Y2lzX3NtLlN0YXRlSWQoKTsKLQotICAgIC8vIGNoZWNrIGlmIENJUyBpcyBub3QgY3JlYXRlZCBvciBpbiBwcm9ncmVzcwotICAgIGlmKGN1cl9zdGF0ZSA9PSBDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlYWR5KSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9TVUNDRVNTOwotICAgIH0gZWxzZSBpZihjdXJfc3RhdGUgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hpbmcpIHsKLSAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9IGVsc2UgaWYoY3VyX3N0YXRlID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRGVzdHJveWluZykgewotICAgICAgcmV0dXJuIElTT19IQ0lfSU5fUFJPR1JFU1M7Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8ICIgUmVxdWVzdCBpc3N1ZWQgdG8gQ0lTIFNNIjsKLSAgICAvLyBoYW5kIGl0IG92ZXIgdG8gdGhlIENJUyBtb2R1bGUKLSAgICBpZihjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoCi0gICAgICAgICAgICAgIElzb0hjaUV2ZW50OjpDSVNfRElTQ09OTkVDVF9SRVEsIG51bGxwdHIpKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9JTl9QUk9HUkVTUzsKLSAgICB9IGVsc2UgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICB9Ci0KLSAgSXNvSGNpU3RhdHVzIFNldHVwRGF0YVBhdGgodWludDhfdCBjaWdfaWQsIHVpbnQ4X3QgY2lzX2lkLAotICAgICAgICAgIHVpbnQ4X3QgZGF0YV9wYXRoX2RpcmVjdGlvbiwgdWludDhfdCBkYXRhX3BhdGhfaWQpICBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8ICI6IENJRyBJZCA9ICIgPDwgbG9naGV4KGNpZ19pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogQ0lTIElkID0gIiA8PCBsb2doZXgoY2lzX2lkKTsKLQotICAgIHVpbnQzMl90IGN1cl9zdGF0ZTsKLSAgICAvLyBjaGVjayBpZiB0aGUgQ0lHIGV4aXN0cwotICAgIENJRyAqY2lnID0gR2V0Q2lnKGNpZ19pZCk7Ci0gICAgaWYgKGNpZyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoY2lnLT5jaWdfc3RhdGUgIT0gQ2lnU3RhdGU6OkNSRUFURUQpIHsKLSAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBpZiBDSVMgSUQgbWVudGlvbmVkIGlzIHByZXNlbnQgYXMgcGFydCBvZiBDSUcKLSAgICBDSVMgKmNpcyA9IEdldENpcyhjaWdfaWQsIGNpc19pZCk7Ci0gICAgaWYgKGNpcyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgY3VyX3N0YXRlID0gY2lzLT5jaXNfc20uU3RhdGVJZCgpOwotCi0gICAgLy8gY2hlY2sgaWYgQ0lTIGlzIG5vdCBjcmVhdGVkIG9yIGluIHByb2dyZXNzCi0gICAgaWYoY3VyX3N0YXRlID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlUmVhZHkgfHwKLSAgICAgICBjdXJfc3RhdGUgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hpbmcgfHwKLSAgICAgICBjdXJfc3RhdGUgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVEZXN0cm95aW5nKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfSBlbHNlIGlmKGN1cl9zdGF0ZSA9PSBDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZUVzdGFibGlzaGVkKSB7Ci0gICAgICAvLyByZXR1cm4gc3VjY2VzcyBhcyBpdCBpcyBhbHJlYWR5IGNyZWF0ZWQKLSAgICAgIHJldHVybiBJU09fSENJX1NVQ0NFU1M7Ci0gICAgfQotCi0gICAgLy8gaGFuZCBpdCBvdmVyIHRvIHRoZSBDSVMgbW9kdWxlCi0gICAgdElzb1NldFVwRGF0YVBhdGggZGF0YV9wYXRoX2luZm87Ci0gICAgZGF0YV9wYXRoX2luZm8uZGF0YV9wYXRoX2RpcmVjdGlvbiA9IGRhdGFfcGF0aF9kaXJlY3Rpb247Ci0gICAgZGF0YV9wYXRoX2luZm8uZGF0YV9wYXRoX2lkID0gZGF0YV9wYXRoX2lkOwotCi0gICAgaWYoY2lzLT5jaXNfc20uUHJvY2Vzc0V2ZW50KAotICAgICAgICBJc29IY2lFdmVudDo6U0VUVVBfREFUQV9QQVRIX1JFUSwgJmRhdGFfcGF0aF9pbmZvKSkgewotICAgICAgcmV0dXJuIElTT19IQ0lfSU5fUFJPR1JFU1M7Ci0gICAgfSBlbHNlIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgfQotCi0gIElzb0hjaVN0YXR1cyBSZW1vdmVEYXRhUGF0aCh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhX3BhdGhfZGlyZWN0aW9uKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8ICI6IENJRyBJZCA9ICIgPDwgbG9naGV4KGNpZ19pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogQ0lTIElkID0gIiA8PCBsb2doZXgoY2lzX2lkKTsKLQotICAgIHVpbnQzMl90IGN1cl9zdGF0ZTsKLSAgICAvLyBjaGVjayBpZiB0aGUgQ0lHIGV4aXN0cwotICAgIENJRyAqY2lnID0gR2V0Q2lnKGNpZ19pZCk7Ci0gICAgaWYgKGNpZyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoY2lnLT5jaWdfc3RhdGUgIT0gQ2lnU3RhdGU6OkNSRUFURUQpIHsKLSAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBpZiBDSVMgSUQgbWVudGlvbmVkIGlzIHByZXNlbnQgYXMgcGFydCBvZiBDSUcKLSAgICBDSVMgKmNpcyA9IEdldENpcyhjaWdfaWQsIGNpc19pZCk7Ci0gICAgaWYgKGNpcyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gICAgfQotCi0gICAgY3VyX3N0YXRlID0gY2lzLT5jaXNfc20uU3RhdGVJZCgpOwotCi0gICAgLy8gY2hlY2sgaWYgQ0lTIGlzIG5vdCBjcmVhdGVkIG9yIGluIHByb2dyZXNzCi0gICAgaWYoY3VyX3N0YXRlID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlUmVhZHkgfHwKLSAgICAgICBjdXJfc3RhdGUgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hpbmcgfHwKLSAgICAgICBjdXJfc3RhdGUgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVEZXN0cm95aW5nIHx8Ci0gICAgICAgY3VyX3N0YXRlID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoZWQpIHsKLSAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvLyBoYW5kIGl0IG92ZXIgdG8gdGhlIENJUyBtb2R1bGUKLSAgICBpZihjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoCi0gICAgICAgICAgIElzb0hjaUV2ZW50OjpSRU1PVkVfREFUQV9QQVRIX1JFUSwgJmRhdGFfcGF0aF9kaXJlY3Rpb24pKSB7Ci0gICAgICByZXR1cm4gSVNPX0hDSV9TVUNDRVNTOwotICAgIH0gZWxzZSByZXR1cm4gSVNPX0hDSV9GQUlMRUQ7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBHZXRFdmVudE5hbWUodWludDMyX3QgZXZlbnQpIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lHX0NPTkZJR1VSRURfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENJU19TVEFUVVNfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENJU19FU1RBQkxJU0hFRF9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX0RJU0NPTk5FQ1RFRF9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lHX1JFTU9WRURfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFNFVFVQX0RBVEFfUEFUSF9ET05FX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihSRU1PVkVfREFUQV9QQVRIX0RPTkVfRVZUKQotICAgICAgZGVmYXVsdDoKLSAgICAgICByZXR1cm4gIlVua25vd24gRXZlbnQiOwotICAgIH0KLSAgfQotCi0gIElzb0hjaVN0YXR1cyBQcm9jZXNzRXZlbnQgKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgICBMT0coSU5GTykgPDxfX2Z1bmNfXyA8PCI6IEV2ZW50ID0gIiA8PCBHZXRFdmVudE5hbWUoZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgIGNhc2UgQ0lHX0NPTkZJR1VSRURfRVZUOiB7Ci0gICAgICAgIHRCVE1fQkxFX1NFVF9DSUdfUkVUX1BBUkFNICpwYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVE1fQkxFX1NFVF9DSUdfUkVUX1BBUkFNICopIHBfZGF0YTsKLSAgICAgICAgTE9HKElORk8pIDw8X19mdW5jX18gPDwiOiBDSUcgSWQgPSAiIDw8IGxvZ2hleChwYXJhbS0+Y2lnX2lkKQotICAgICAgICAgICAgICAgICAgPDwgIjogc3RhdHVzID0gIiA8PCBsb2doZXgocGFyYW0tPnN0YXR1cyk7Ci0KLSAgICAgICAgYXV0byBpdCA9IGNpZ19saXN0LmZpbmQocGFyYW0tPmNpZ19pZCk7Ci0gICAgICAgIGlmIChpdCA9PSBjaWdfbGlzdC5lbmQoKSkgewotICAgICAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCFwYXJhbS0+c3RhdHVzKSB7Ci0gICAgICAgICAgdWludDhfdCBpID0gMDsKLSAgICAgICAgICBDSUcgKmNpZyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgdElzb1NldFVwRGF0YVBhdGggZGF0YV9wYXRoX2luZm87Ci0KLSAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBjaWctPmNpc19saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ICE9IGNpZy0+Y2lzX2xpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIENJUyAqY2lzID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIGNpcy0+Y2lzX2hhbmRsZSA9ICoocGFyYW0tPmNvbm5faGFuZGxlICsgaSsrKTsKLSAgICAgICAgICAgIGNpcy0+Y2lzX3NtLlN0YXJ0KCk7Ci0gICAgICAgICAgICBpZihjaXMtPmRpcmVjdGlvbiAmIERJUl9UT19BSVIpIHsKLSAgICAgICAgICAgICAgZGF0YV9wYXRoX2luZm8uZGF0YV9wYXRoX2RpcmVjdGlvbiA9IERJUl9UT19BSVI7Ci0gICAgICAgICAgICAgIGRhdGFfcGF0aF9pbmZvLmRhdGFfcGF0aF9pZCA9IDB4MDE7Ci0gICAgICAgICAgICAgIGNpcy0+Y2lzX3NtLlByb2Nlc3NFdmVudChJc29IY2lFdmVudDo6U0VUVVBfREFUQV9QQVRIX1JFUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9wYXRoX2luZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY2lzLT5kaXJlY3Rpb24gJiBESVJfRlJPTV9BSVIpIHsKLSAgICAgICAgICAgICAgZGF0YV9wYXRoX2luZm8uZGF0YV9wYXRoX2RpcmVjdGlvbiA9IERJUl9GUk9NX0FJUjsKLSAgICAgICAgICAgICAgZGF0YV9wYXRoX2luZm8uZGF0YV9wYXRoX2lkID0gMHgwMTsKLSAgICAgICAgICAgICAgY2lzLT5jaXNfc20uUHJvY2Vzc0V2ZW50KElzb0hjaUV2ZW50OjpTRVRVUF9EQVRBX1BBVEhfUkVRLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX3BhdGhfaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGRlbGV0ZSBDSUcgYW5kIENJUwotICAgICAgICAgIENJRyAqY2lnID0gaXQtPnNlY29uZDsKLSAgICAgICAgICBjaWctPmNpZ19zdGF0ZSA9IENpZ1N0YXRlOjpJRExFOwotCi0gICAgICAgICAgd2hpbGUgKCFjaWctPmNpc19saXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBjaWctPmNpc19saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICBDSVMgKiBjaXMgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgY2lnLT5jaXNfbGlzdC5lcmFzZShpdCk7Ci0gICAgICAgICAgICBkZWxldGUgY2lzOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYWxsYmFja3MtPk9uQ2lnU3RhdGUocGFyYW0tPmNpZ19pZCwgQ2lnU3RhdGU6OklETEUpOwotICAgICAgICAgIGNpZ19saXN0LmVyYXNlKGl0KTsKLSAgICAgICAgICBkZWxldGUgY2lnOwotICAgICAgICB9Ci0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIENJR19SRU1PVkVEX0VWVDogewotICAgICAgICB0QlRNX0JMRV9TRVRfQ0lHX1JFTU9WRV9QQVJBTSAqcGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUTV9CTEVfU0VUX0NJR19SRU1PVkVfUEFSQU0gKikgcF9kYXRhOwotICAgICAgICBhdXRvIGl0ID0gY2lnX2xpc3QuZmluZChwYXJhbS0+Y2lnX2lkKTsKLSAgICAgICAgaWYgKGl0ID09IGNpZ19saXN0LmVuZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGRlbGV0ZSBDSUcgYW5kIENJUwotICAgICAgICAgIENJRyAqY2lnID0gaXQtPnNlY29uZDsKLSAgICAgICAgICB3aGlsZSAoIWNpZy0+Y2lzX2xpc3QuZW1wdHkoKSkgewotICAgICAgICAgICAgYXV0byBpdCA9IGNpZy0+Y2lzX2xpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgIENJUyAqIGNpcyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICBjaWctPmNpc19saXN0LmVyYXNlKGl0KTsKLSAgICAgICAgICAgIGRlbGV0ZSBjaXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNpZy0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OklETEU7Ci0gICAgICAgICAgY2lnX2xpc3QuZXJhc2UoaXQpOwotICAgICAgICAgIGNhbGxiYWNrcy0+T25DaWdTdGF0ZShwYXJhbS0+Y2lnX2lkLCBDaWdTdGF0ZTo6SURMRSk7Ci0gICAgICAgICAgZGVsZXRlIGNpZzsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQ0lTX1NUQVRVU19FVlQ6IHsKLSAgICAgICAgLy8gY2xlYXIgdGhlIGZpcnN0IGVudHJ5IGZyb20gY2lzIHF1ZXVlIGFuZCBzZW5kIHRoZSBuZXh0Ci0gICAgICAgIC8vIENJUyBjcmVhdGlvbiByZXF1ZXN0IHF1ZXVlIGl0IGlmIHRoZXJlIGlzIHBlbmRpbmcgY3JlYXRlIENJUwotICAgICAgICBDcmVhdGVDaXNOb2RlICZoZWFkID0gY2lzX3F1ZXVlLmZyb250KCk7Ci0gICAgICAgIGZvciAoYXV0byBpOiBoZWFkLmNpc19pZHMpIHsKLSAgICAgICAgICBDSVMgKmNpcyA9IEdldENpcyhoZWFkLmNpZ19pZCwgaSk7Ci0gICAgICAgICAgaWYoY2lzKSB7Ci0gICAgICAgICAgICBjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19TVEFUVVNfRVZULCBwX2RhdGEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQ0lTX0VTVEFCTElTSEVEX0VWVDogewotICAgICAgICB0QlRNX0JMRV9DSVNfRVNUQUJMSVNIRURfRVZUX1BBUkFNICpwYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICh0QlRNX0JMRV9DSVNfRVNUQUJMSVNIRURfRVZUX1BBUkFNICopIHBfZGF0YTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBDSVMgaGFuZGxlID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChwYXJhbS0+Y29ubmVjdGlvbl9oYW5kbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogU3RhdHVzID0gIiA8PCBsb2doZXgocGFyYW0tPnN0YXR1cyk7Ci0gICAgICAgIENJUyAqY2lzID0gR2V0Q2lzKHBhcmFtLT5jb25uZWN0aW9uX2hhbmRsZSk7Ci0gICAgICAgIGlmIChjaXMgPT0gbnVsbHB0cikgewotICAgICAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19FU1RBQkxJU0hFRF9FVlQsIHBfZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBjaXNfc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjaXNfcXVldWUuc2l6ZSgpKSB7Ci0gICAgICAgICAgY2lzX3F1ZXVlLnBvcF9mcm9udCgpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKGNpc19xdWV1ZS5zaXplKCkgJiYgIWNpc19zdGF0dXMpIHsKLSAgICAgICAgICBDcmVhdGVDaXNOb2RlICZoZWFkID0gY2lzX3F1ZXVlLmZyb250KCk7Ci0gICAgICAgICAgQ0lTICpjaXMgPSBHZXRDaXMoaGVhZC5jaWdfaWQsIGhlYWQuY2lzX2lkc1swXSk7Ci0gICAgICAgICAgaWYoY2lzID09IG51bGxwdHIgfHwKLSAgICAgICAgICAgICBjaXMtPmNpc19zbS5TdGF0ZUlkKCkgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hlZCkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBlbnRyeQotICAgICAgICAgICAgY2lzX3F1ZXVlLnBvcF9mcm9udCgpOwotICAgICAgICAgIH0gZWxzZSBpZihjaXMpIHsKLSAgICAgICAgICAgIElzb0hjaVN0YXR1cyBoY2lfc3RhdHVzID0gIENyZWF0ZUNpcyhoZWFkLmNpZ19pZCwgaGVhZC5jaXNfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQucGVlcl9iZGEpOwotICAgICAgICAgICAgaWYoaGNpX3N0YXR1cyA9PSBJU09fSENJX1NVQ0NFU1MgfHwKLSAgICAgICAgICAgICAgIGhjaV9zdGF0dXMgPT0gSVNPX0hDSV9JTl9QUk9HUkVTUykgewotICAgICAgICAgICAgICBjaXNfc3RhdHVzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZW50cnkKLSAgICAgICAgICAgICAgY2lzX3F1ZXVlLnBvcF9mcm9udCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQ0lTX0RJU0NPTk5FQ1RFRF9FVlQ6IHsKLSAgICAgICAgdEJUTV9CTEVfQ0lTX0RJU0NPTk5FQ1RFRF9FVlRfUEFSQU0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAodEJUTV9CTEVfQ0lTX0RJU0NPTk5FQ1RFRF9FVlRfUEFSQU0gKikgcF9kYXRhOwotICAgICAgICBDSVMgKmNpcyA9IEdldENpcyhwYXJhbS0+Y2lzX2hhbmRsZSk7Ci0gICAgICAgIGlmIChjaXMgPT0gbnVsbHB0cikgewotICAgICAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19ESVNDT05ORUNURURfRVZULCBwX2RhdGEpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBTRVRVUF9EQVRBX1BBVEhfRE9ORV9FVlQ6IHsKLSAgICAgICAgdEJUTV9CTEVfQ0lTX0RBVEFfUEFUSF9FVlRfUEFSQU0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAodEJUTV9CTEVfQ0lTX0RBVEFfUEFUSF9FVlRfUEFSQU0gKikgcF9kYXRhOwotCi0gICAgICAgIENJUyAqY2lzID0gR2V0Q2lzKHBhcmFtLT5jb25uX2hhbmRsZSk7Ci0gICAgICAgIENJRyAqY2lnID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKGNpcyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgcmV0dXJuIElTT19IQ0lfRkFJTEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNpcy0+Y2lzX3NtLlByb2Nlc3NFdmVudChJc29IY2lFdmVudDo6U0VUVVBfREFUQV9QQVRIX0RPTkVfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgY2lnX2lkID0gY2lzLT5jaWdfaWQ7Ci0KLSAgICAgICAgYXV0byBpdCA9IGNpZ19saXN0LmZpbmQoY2lnX2lkKTsKLSAgICAgICAgaWYgKGl0ID09IGNpZ19saXN0LmVuZCgpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gZGVsZXRlIENJRyBhbmQgQ0lTCi0gICAgICAgICAgY2lnID0gaXQtPnNlY29uZDsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QgbnVtX2Npc19pc19yZWFkeSA9IDA7Ci0gICAgICAgIGZvcihhdXRvIGl0ID0gY2lnLT5jaXNfbGlzdC5iZWdpbigpOyBpdCAhPSBjaWctPmNpc19saXN0LmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgQ0lTICpjaXMgPSBpdC0+c2Vjb25kOwotICAgICAgICAgIGlmKGNpcy0+Y2lzX3NtLlN0YXRlSWQoKSA9PSBDaXNTdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlYWR5KSB7Ci0gICAgICAgICAgICBudW1fY2lzX2lzX3JlYWR5Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgYWxsIHNldHVwIGRhdGEgcGF0aHMgYXJlIGNvbXBsZXRlZAotICAgICAgICBpZihudW1fY2lzX2lzX3JlYWR5ID09IGNpZy0+Y2lzX2xpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgY2lnLT5jaWdfc3RhdGUgPSBDaWdTdGF0ZTo6Q1JFQVRFRDsKLSAgICAgICAgICBjYWxsYmFja3MtPk9uQ2lnU3RhdGUoY2lnX2lkLCBDaWdTdGF0ZTo6Q1JFQVRFRCk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIFJFTU9WRV9EQVRBX1BBVEhfRE9ORV9FVlQ6IHsKLSAgICAgICAgdEJUTV9CTEVfQ0lTX0RBVEFfUEFUSF9FVlRfUEFSQU0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAodEJUTV9CTEVfQ0lTX0RBVEFfUEFUSF9FVlRfUEFSQU0gKikgcF9kYXRhOwotICAgICAgICBDSVMgKmNpcyA9IEdldENpcyhwYXJhbS0+Y29ubl9oYW5kbGUpOwotICAgICAgICBpZiAoY2lzID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBJU09fSENJX0ZBSUxFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaXMtPmNpc19zbS5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OlJFTU9WRV9EQVRBX1BBVEhfRE9ORV9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIElTT19IQ0lfU1VDQ0VTUzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjptYXA8dWludDhfdCwgQ0lHICo+IGNpZ19saXN0OyAvLyBjaWcgaWQgdG8gQ0lHIHN0cnVjdHVyZQotICBzdGQ6Omxpc3QgPENyZWF0ZUNpc05vZGU+IGNpc19xdWV1ZTsKLSAgQ2lzSW50ZXJmYWNlQ2FsbGJhY2tzICpjYWxsYmFja3M7Ci0gIC8vIDB4RkYgd2lsbCBiZSBwYXNzZWQgZm9yIGNpcyBpZCBpbiBjYXNlIHNlYXJjaCBpcyBmb3IgYW55IG9mIHRoZQotICAvLyBDSVMgcGFydCBvZiB0aGF0IGdyb3VwCi0gIGJvb2wgSXNDaXNBY3RpdmUodWludDhfdCBjaWdfaWQsIHVpbnQ4X3QgY2lzX2lkKSAgewotICAgIGJvb2wgaXNfY2lzX2FjdGl2ZSA9IGZhbHNlOwotICAgIGF1dG8gaXQgPSBjaWdfbGlzdC5maW5kKGNpZ19pZCk7Ci0gICAgaWYgKGl0ID09IGNpZ19saXN0LmVuZCgpKSB7Ci0gICAgICByZXR1cm4gaXNfY2lzX2FjdGl2ZTsKLSAgICB9IGVsc2UgewotICAgICAgQ0lHICpjaWcgPSBpdC0+c2Vjb25kOwotICAgICAgaWYoY2lzX2lkICE9IDBYRkYpIHsKLSAgICAgICAgYXV0byBpdCA9IGNpZy0+Y2lzX2xpc3QuZmluZChjaXNfaWQpOwotICAgICAgICBpZiAoaXQgIT0gY2lnLT5jaXNfbGlzdC5lbmQoKSkgewotICAgICAgICAgIENJUyAqY2lzID0gaXQtPnNlY29uZDsKLSAgICAgICAgICBpZihjaXMtPmNpc19zbS5TdGF0ZUlkKCkgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hlZCkgewotICAgICAgICAgICAgaXNfY2lzX2FjdGl2ZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8gaXQgOiBjaWctPmNpc19saXN0KSB7Ci0gICAgICAgICAgQ0lTICpjaXMgPSBpdC5zZWNvbmQ7Ci0gICAgICAgICAgaWYoY2lzLT5jaXNfc20uU3RhdGVJZCgpID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoZWQpIHsKLSAgICAgICAgICAgIGlzX2Npc19hY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc19jaXNfYWN0aXZlOwotICB9Ci0KLSAgYm9vbCBJc0NpZ1BhcmFtc1NhbWUoQ0lHQ29uZmlnICZjaWdfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDSVNDb25maWc+ICZjaXNfY29uZmlncykgIHsKLSAgICBDSUcgKmNpZyA9IEdldENpZyhjaWdfY29uZmlnLmNpZ19pZCk7Ci0gICAgYm9vbCBpc19wYXJhbXNfc2FtZSA9IHRydWU7Ci0gICAgdWludDhfdCBpID0gMDsKLQotICAgIGlmKGNpZyA9PSBudWxscHRyIHx8IChjaXNfY29uZmlncy5zaXplKCkgIT0gY2lnLT5jaWdfY29uZmlnLmNpc19jb3VudCkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogQ291bnQgaXMgZGlmZmVyZW50ICI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYoY2lnLT5jaWdfY29uZmlnLmNpZ19pZCAhPSBjaWdfY29uZmlnLmNpZ19pZCB8fAotICAgICAgIGNpZy0+Y2lnX2NvbmZpZy5jaXNfY291bnQgIT0gY2lnX2NvbmZpZy5jaXNfY291bnQgfHwKLSAgICAgICBjaWctPmNpZ19jb25maWcucGFja2luZyAhPSAgY2lnX2NvbmZpZy5wYWNraW5nIHx8Ci0gICAgICAgY2lnLT5jaWdfY29uZmlnLmZyYW1pbmcgIT0gY2lnX2NvbmZpZy5mcmFtaW5nIHx8Ci0gICAgICAgY2lnLT5jaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICBjaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyB8fAotICAgICAgIGNpZy0+Y2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSB8fAotICAgICAgIGNpZy0+Y2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfbV90b19zWzBdICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfbV90b19zWzBdIHx8Ci0gICAgICAgY2lnLT5jaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9tX3RvX3NbMV0gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9tX3RvX3NbMV0gfHwKLSAgICAgICBjaWctPmNpZ19jb25maWcuc2R1X2ludGVydmFsX21fdG9fc1syXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgIGNpZ19jb25maWcuc2R1X2ludGVydmFsX21fdG9fc1syXSB8fAotICAgICAgIGNpZy0+Y2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfc190b19tWzBdICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfc190b19tWzBdIHx8Ci0gICAgICAgY2lnLT5jaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9zX3RvX21bMV0gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9zX3RvX21bMV0gfHwKLSAgICAgICBjaWctPmNpZ19jb25maWcuc2R1X2ludGVydmFsX3NfdG9fbVsyXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgIGNpZ19jb25maWcuc2R1X2ludGVydmFsX3NfdG9fbVsyXSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIGNpZyBwYXJhbXMgYXJlIGRpZmZlcmVudCAiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byBpdCA9IGNpZy0+Y2lzX2xpc3QuYmVnaW4oKTsgaXQgIT0gY2lnLT5jaXNfbGlzdC5lbmQoKTspIHsKLSAgICAgIENJUyAqY2lzID0gaXQtPnNlY29uZDsKLSAgICAgIGlmKGNpcy0+Y2lzX2NvbmZpZy5jaXNfaWQgID09ICBjaXNfY29uZmlnc1tpXS5jaXNfaWQgJiYKLSAgICAgICAgIGNpcy0+Y2lzX2NvbmZpZy5tYXhfc2R1X21fdG9fcyA9PSBjaXNfY29uZmlnc1tpXS5tYXhfc2R1X21fdG9fcyAmJgotICAgICAgICAgY2lzLT5jaXNfY29uZmlnLm1heF9zZHVfc190b19tID09IGNpc19jb25maWdzW2ldLm1heF9zZHVfc190b19tICYmCi0gICAgICAgICBjaXMtPmNpc19jb25maWcucGh5X21fdG9fcyA9PSBjaXNfY29uZmlnc1tpXS5waHlfbV90b19zICAmJgotICAgICAgICAgY2lzLT5jaXNfY29uZmlnLnBoeV9zX3RvX20gPT0gY2lzX2NvbmZpZ3NbaV0ucGh5X3NfdG9fbSAgJiYKLSAgICAgICAgIGNpcy0+Y2lzX2NvbmZpZy5ydG5fbV90b19zID09IGNpc19jb25maWdzW2ldLnJ0bl9tX3RvX3MgICYmCi0gICAgICAgICBjaXMtPmNpc19jb25maWcucnRuX3NfdG9fbSA9PSBjaXNfY29uZmlnc1tpXS5ydG5fc190b19tKSB7Ci0gICAgICAgIGl0Kys7IGkrKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzX3BhcmFtc19zYW1lID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IGlzX3BhcmFtc19zYW1lIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGlzX3BhcmFtc19zYW1lKTsKLSAgICByZXR1cm4gaXNfcGFyYW1zX3NhbWU7Ci0gIH0KLQotICBib29sIElzQ2lzRXhpc3RzKHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCkgIHsKLSAgICBib29sIGlzX2Npc19leGlzdHMgPSBmYWxzZTsKLSAgICBhdXRvIGl0ID0gY2lnX2xpc3QuZmluZChjaWdfaWQpOwotICAgIGlmIChpdCAhPSBjaWdfbGlzdC5lbmQoKSkgewotICAgICAgQ0lHICpjaWcgPSBpdC0+c2Vjb25kOwotICAgICAgYXV0byBpdCA9IGNpZy0+Y2lzX2xpc3QuZmluZChjaXNfaWQpOwotICAgICAgaWYgKGl0ICE9IGNpZy0+Y2lzX2xpc3QuZW5kKCkpIHsKLSAgICAgICAgaXNfY2lzX2V4aXN0cyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc19jaXNfZXhpc3RzOwotICB9Ci0KLSAgQ0lTICpHZXRDaXModWludDhfdCBjaWdfaWQsIHVpbnQ4X3QgY2lzX2lkKSAgewotICAgIGF1dG8gaXQgPSBjaWdfbGlzdC5maW5kKGNpZ19pZCk7Ci0gICAgaWYgKGl0ICE9IGNpZ19saXN0LmVuZCgpKSB7Ci0gICAgICBDSUcgKmNpZyA9IGl0LT5zZWNvbmQ7Ci0gICAgICBhdXRvIGl0ID0gY2lnLT5jaXNfbGlzdC5maW5kKGNpc19pZCk7Ci0gICAgICBpZiAoaXQgIT0gY2lnLT5jaXNfbGlzdC5lbmQoKSkgewotICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBDSUcgKkdldENpZyh1aW50OF90IGNpZ19pZCkgIHsKLSAgICBhdXRvIGl0ID0gY2lnX2xpc3QuZmluZChjaWdfaWQpOwotICAgIGlmIChpdCAhPSBjaWdfbGlzdC5lbmQoKSkgewotICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgQ0lTICpHZXRDaXModWludDE2X3QgY2lzX2hhbmRsZSkgIHsKLSAgICBib29sIGNpc19mb3VuZCA9IGZhbHNlOwotICAgIENJUyAqY2lzID0gbnVsbHB0cjsKLSAgICBmb3IgKGF1dG8gaXQgOiBjaWdfbGlzdCkgewotICAgICAgQ0lHICpjaWcgPSBpdC5zZWNvbmQ7Ci0gICAgICBpZihjaWctPmNpZ19zdGF0ZSA9PSBDaWdTdGF0ZTo6Q1JFQVRFRCB8fAotICAgICAgICAgY2lnLT5jaWdfc3RhdGUgPT0gQ2lnU3RhdGU6OkNSRUFUSU5HKSB7Ci0gICAgICAgIGZvciAoYXV0byBpdCA6IGNpZy0+Y2lzX2xpc3QpIHsKLSAgICAgICAgICBjaXMgPSBpdC5zZWNvbmQ7Ci0gICAgICAgICAgaWYoY2lzLT5jaXNfaGFuZGxlID09IGNpc19oYW5kbGUpIHsKLSAgICAgICAgICAgIGNpc19mb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmKGNpc19mb3VuZCkgcmV0dXJuIGNpczsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICAvLyBUT0RPIHRvIHJlbW92ZSBpZiB0aGVyZSBpcyBubyBuZWVkCi0gIGJvb2wgSXNDaXNFc3RhYmxpc2hlZCh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQpIHsKLSAgICBib29sIGlzX2Npc19lc3RhYmxpc2hlZCA9IGZhbHNlOwotICAgIGF1dG8gaXQgPSBjaWdfbGlzdC5maW5kKGNpZ19pZCk7Ci0gICAgaWYgKGl0ID09IGNpZ19saXN0LmVuZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENJRyAqY2lnID0gaXQtPnNlY29uZDsKLSAgICAgIGlmKGNpc19pZCAhPSAwWEZGKSB7Ci0gICAgICAgIGF1dG8gaXQgPSBjaWctPmNpc19saXN0LmZpbmQoY2lzX2lkKTsKLSAgICAgICAgaWYgKGl0ICE9IGNpZy0+Y2lzX2xpc3QuZW5kKCkpIHsKLSAgICAgICAgICBDSVMgKmNpcyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgaWYoY2lzLT5jaXNfc20uU3RhdGVJZCgpID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoZWQpIHsKLSAgICAgICAgICAgIGlzX2Npc19lc3RhYmxpc2hlZCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8gaXQgOiBjaWctPmNpc19saXN0KSB7Ci0gICAgICAgICAgQ0lTICpjaXMgPSBpdC5zZWNvbmQ7Ci0gICAgICAgICAgaWYoY2lzLT5jaXNfc20uU3RhdGVJZCgpID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoZWQpIHsKLSAgICAgICAgICAgIGlzX2Npc19lc3RhYmxpc2hlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzX2Npc19lc3RhYmxpc2hlZDsKLSAgfQotCi0gIC8vIFRPRE8gdG8gcmVtb3ZlIGlmIHRoZXJlIGlzIG5vIG5lZWQKLSAgYm9vbCBJc0Npc1N0cmVhbWluZyh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQpICB7Ci0gICAgYm9vbCBpc19jaXNfc3RyZWFtaW5nID0gZmFsc2U7Ci0gICAgYXV0byBpdCA9IGNpZ19saXN0LmZpbmQoY2lnX2lkKTsKLSAgICBpZiAoaXQgPT0gY2lnX2xpc3QuZW5kKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgQ0lHICpjaWcgPSBpdC0+c2Vjb25kOwotICAgICAgaWYoY2lzX2lkICE9IDBYRkYpIHsKLSAgICAgICAgYXV0byBpdCA9IGNpZy0+Y2lzX2xpc3QuZmluZChjaXNfaWQpOwotICAgICAgICBpZiAoaXQgIT0gY2lnLT5jaXNfbGlzdC5lbmQoKSkgewotICAgICAgICAgIENJUyAqY2lzID0gaXQtPnNlY29uZDsKLSAgICAgICAgICBpZihjaXMtPmNpc19zbS5TdGF0ZUlkKCkgPT0gQ2lzU3RhdGVNYWNoaW5lOjprU3RhdGVFc3RhYmxpc2hlZCkgewotICAgICAgICAgICAgaXNfY2lzX3N0cmVhbWluZyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8gaXQgOiBjaWctPmNpc19saXN0KSB7Ci0gICAgICAgICAgQ0lTICpjaXMgPSBpdC5zZWNvbmQ7Ci0gICAgICAgICAgaWYoY2lzLT5jaXNfc20uU3RhdGVJZCgpID09IENpc1N0YXRlTWFjaGluZTo6a1N0YXRlRXN0YWJsaXNoZWQpIHsKLSAgICAgICAgICAgIGlzX2Npc19zdHJlYW1pbmcgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc19jaXNfc3RyZWFtaW5nOwotICB9Ci19OwotCi12b2lkIENpc0ludGVyZmFjZTo6SW5pdGlhbGl6ZSgKLSAgICAgICAgICAgICAgICAgICBDaXNJbnRlcmZhY2VDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICBpZiAoaW5zdGFuY2UpIHsKLSAgICBMT0coRVJST1IpIDw8ICJBbHJlYWR5IGluaXRpYWxpemVkISI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5zdGFuY2UgPSBuZXcgQ2lzSW50ZXJmYWNlSW1wbChjYWxsYmFja3MpOwotICB9Ci19Ci0KLXZvaWQgQ2lzSW50ZXJmYWNlOjpDbGVhblVwKCkgewotCi0gIENpc0ludGVyZmFjZUltcGwqIHB0ciA9IGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0gIHB0ci0+Q2xlYW5VcCgpOwotICBkZWxldGUgcHRyOwotfQotCi1DaXNJbnRlcmZhY2UqIENpc0ludGVyZmFjZTo6R2V0KCkgewotICBDSEVDSyhpbnN0YW5jZSk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLQotc3RhdGljIHZvaWQgaGNpX2NpZ19wYXJhbV9jYWxsYmFjayh0QlRNX0JMRV9TRVRfQ0lHX1JFVF9QQVJBTSAqcGFyYW0pIHsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UtPlByb2Nlc3NFdmVudChJc29IY2lFdmVudDo6Q0lHX0NPTkZJR1VSRURfRVZULCBwYXJhbSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaGNpX2NpZ19wYXJhbV90ZXN0X2NhbGxiYWNrKHRCVE1fQkxFX1NFVF9DSUdfUEFSQU1fVEVTVF9SRVQgKnBhcmFtKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJR19DT05GSUdVUkVEX0VWVCwgcGFyYW0pOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhjaV9jaWdfcmVtb3ZlX3BhcmFtX2NhbGxiYWNrKHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IGNpZ19pZCkgewotICB0QlRNX0JMRV9TRVRfQ0lHX1JFTU9WRV9QQVJBTSBwYXJhbSA9IHsgLnN0YXR1cyA9IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSBjaWdfaWQgfTsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UtPlByb2Nlc3NFdmVudChJc29IY2lFdmVudDo6Q0lHX1JFTU9WRURfRVZULCAmcGFyYW0pOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhjaV9jaXNfY3JlYXRlX3N0YXR1c19jYWxsYmFjayAoIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19TVEFUVVNfRVZULCAmc3RhdHVzKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoY2lfY2lzX2NyZWF0ZV9jYWxsYmFjayAoCi0gICAgICAgICAgICAgIHRCVE1fQkxFX0NJU19FU1RBQkxJU0hFRF9FVlRfUEFSQU0gKnBhcmFtKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19FU1RBQkxJU0hFRF9FVlQsIHBhcmFtKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoY2lfY2lzX3NldHVwX2RhdGFwYXRoX2NhbGxiYWNrICggdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9oYW5kbGUpIHsKLSAgdEJUTV9CTEVfQ0lTX0RBVEFfUEFUSF9FVlRfUEFSQU0gcGFyYW0gPSB7IC5zdGF0dXMgPSBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29ubl9oYW5kbGUgPSBjb25uX2hhbmRsZSB9OwotICBpZiAoaW5zdGFuY2UpIHsKLSAgICBpbnN0YW5jZS0+UHJvY2Vzc0V2ZW50KElzb0hjaUV2ZW50OjpTRVRVUF9EQVRBX1BBVEhfRE9ORV9FVlQsICZwYXJhbSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaGNpX2Npc19kaXNjb25uZWN0X2NhbGxiYWNrICggdWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNpc19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlYXNvbikgewotICB0QlRNX0JMRV9DSVNfRElTQ09OTkVDVEVEX0VWVF9QQVJBTSBwYXJhbSA9IHsgLnN0YXR1cyA9IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaGFuZGxlID0gY2lzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFzb24gPSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5Qcm9jZXNzRXZlbnQoSXNvSGNpRXZlbnQ6OkNJU19ESVNDT05ORUNURURfRVZULCAmcGFyYW0pOwotICB9Ci19Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZCBoY2lfY2lzX3JlbW92ZV9kYXRhcGF0aF9jYWxsYmFjayAoIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faGFuZGxlKSB7Ci0gIHRCVE1fQkxFX0NJU19EQVRBX1BBVEhfRVZUX1BBUkFNIHBhcmFtID0geyAuc3RhdHVzID0gc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbm5faGFuZGxlID0gY29ubl9oYW5kbGUgfTsKLSAgaWYgKGluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UtPlByb2Nlc3NFdmVudChJc29IY2lFdmVudDo6UkVNT1ZFX0RBVEFfUEFUSF9ET05FX0VWVCwgJnBhcmFtKTsKLSAgfQotfQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSB1Y2FzdAotfSAgLy8gbmFtZXNwYWNlIGJhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvZ2F0dGNfb3BzX3F1ZXVlLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvZ2F0dGNfb3BzX3F1ZXVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdiMTg3Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL2dhdHRjX29wc19xdWV1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZ2F0dGNfb3BzX3F1ZXVlLmgiCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmFwIHsKLQotdXNpbmcgZ2F0dF9vcGVyYXRpb24gPSBHYXR0T3BzUXVldWU6OmdhdHRfb3BlcmF0aW9uOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1jb25zdGV4cHIgdWludDhfdCBHQVRUX1JFQURfQ0hBUiA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBHQVRUX1JFQURfREVTQyA9IDI7Ci1jb25zdGV4cHIgdWludDhfdCBHQVRUX1dSSVRFX0NIQVIgPSAzOwotY29uc3RleHByIHVpbnQ4X3QgR0FUVF9XUklURV9ERVNDID0gNDsKLWNvbnN0ZXhwciB1aW50OF90IEdBVFRfU0VSVl9TRUFSQ0ggPSA1OwotCi1zdHJ1Y3QgZ2F0dF9yZWFkX29wX2RhdGEgewotICBCQVBfR0FUVF9SRUFEX09QX0NCIGNiOwotICB2b2lkKiBjYl9kYXRhOwotfTsKLQotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBzdGQ6Omxpc3Q8Z2F0dF9vcGVyYXRpb24+PgotICAgIEdhdHRPcHNRdWV1ZTo6Z2F0dF9vcF9xdWV1ZTsKLXN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MTZfdD4gR2F0dE9wc1F1ZXVlOjpnYXR0X29wX3F1ZXVlX2V4ZWN1dGluZzsKLQotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBib29sPiBHYXR0T3BzUXVldWU6OmNvbmdlc3Rpb25fcXVldWU7Ci0KLXZvaWQgR2F0dE9wc1F1ZXVlOjptYXJrX2FzX25vdF9leGVjdXRpbmcodWludDE2X3QgY29ubl9pZCkgewotICBnYXR0X29wX3F1ZXVlX2V4ZWN1dGluZy5lcmFzZShjb25uX2lkKTsKLX0KLQotdm9pZCBHYXR0T3BzUXVldWU6OmdhdHRfcmVhZF9vcF9maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgZ2F0dF9yZWFkX29wX2RhdGEqIHRtcCA9IChnYXR0X3JlYWRfb3BfZGF0YSopZGF0YTsKLSAgQkFQX0dBVFRfUkVBRF9PUF9DQiB0bXBfY2IgPSB0bXAtPmNiOwotICB2b2lkKiB0bXBfY2JfZGF0YSA9IHRtcC0+Y2JfZGF0YTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubl9pZD0weCV4IGhhbmRsZT0lZCBzdGF0dXM9JWQgbGVuPSVkIiwgX19mdW5jX18sCi0gICAgY29ubl9pZCwgaGFuZGxlLCBzdGF0dXMsIGxlbik7Ci0KLSAgb3NpX2ZyZWUoZGF0YSk7Ci0KLSAgYXV0byBtYXBfcHRyID0gZ2F0dF9vcF9xdWV1ZS5maW5kKGNvbm5faWQpOwotICBpZiAobWFwX3B0ciA9PSBnYXR0X29wX3F1ZXVlLmVuZCgpIHx8IG1hcF9wdHItPnNlY29uZC5lbXB0eSgpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG5vIG1vcmUgb3BlcmF0aW9ucyBxdWV1ZWQgZm9yIGNvbm5faWQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bGlzdDxnYXR0X29wZXJhdGlvbj4mIGdhdHRfb3BzID0gbWFwX3B0ci0+c2Vjb25kOwotICBnYXR0X29wZXJhdGlvbiBvcCA9IGdhdHRfb3BzLmZyb250KCk7Ci0gIGdhdHRfb3BzLnBvcF9mcm9udCgpOwotCi0gIG1hcmtfYXNfbm90X2V4ZWN1dGluZyhjb25uX2lkKTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci0KLSAgaWYgKHRtcF9jYikgewotICAgIHRtcF9jYihvcC5jbGllbnRfaWQsIGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBsZW4sIHZhbHVlLCB0bXBfY2JfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXN0cnVjdCBnYXR0X3dyaXRlX29wX2RhdGEgewotICBCQVBfR0FUVF9XUklURV9PUF9DQiBjYjsKLSAgdm9pZCogY2JfZGF0YTsKLX07Ci0KLXZvaWQgR2F0dE9wc1F1ZXVlOjpnYXR0X3dyaXRlX29wX2ZpbmlzaGVkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHZvaWQqIGRhdGEpIHsKLSAgZ2F0dF93cml0ZV9vcF9kYXRhKiB0bXAgPSAoZ2F0dF93cml0ZV9vcF9kYXRhKilkYXRhOwotICBCQVBfR0FUVF9XUklURV9PUF9DQiB0bXBfY2IgPSB0bXAtPmNiOwotICB2b2lkKiB0bXBfY2JfZGF0YSA9IHRtcC0+Y2JfZGF0YTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubl9pZD0weCV4IGhhbmRsZT0lZCBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgY29ubl9pZCwKLSAgICBoYW5kbGUsIHN0YXR1cyk7Ci0KLSAgb3NpX2ZyZWUoZGF0YSk7Ci0KLSAgYXV0byBtYXBfcHRyID0gZ2F0dF9vcF9xdWV1ZS5maW5kKGNvbm5faWQpOwotICBpZiAobWFwX3B0ciA9PSBnYXR0X29wX3F1ZXVlLmVuZCgpIHx8IG1hcF9wdHItPnNlY29uZC5lbXB0eSgpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG5vIG1vcmUgb3BlcmF0aW9ucyBxdWV1ZWQgZm9yIGNvbm5faWQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bGlzdDxnYXR0X29wZXJhdGlvbj4mIGdhdHRfb3BzID0gbWFwX3B0ci0+c2Vjb25kOwotICBnYXR0X29wZXJhdGlvbiBvcCA9IGdhdHRfb3BzLmZyb250KCk7Ci0gIGdhdHRfb3BzLnBvcF9mcm9udCgpOwotCi0gIG1hcmtfYXNfbm90X2V4ZWN1dGluZyhjb25uX2lkKTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci0KLSAgaWYgKHRtcF9jYikgewotICAgIHRtcF9jYihvcC5jbGllbnRfaWQsIGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCB0bXBfY2JfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgR2F0dE9wc1F1ZXVlOjpnYXR0X2V4ZWN1dGVfbmV4dF9vcCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb25uX2lkPTB4JXgiLCBfX2Z1bmNfXywgY29ubl9pZCk7Ci0gIGlmIChnYXR0X29wX3F1ZXVlLmVtcHR5KCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogb3AgcXVldWUgaXMgZW1wdHkiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBwdHIgPSBjb25nZXN0aW9uX3F1ZXVlLmZpbmQoY29ubl9pZCk7Ci0KLSAgaWYgKHB0ciAhPSBjb25nZXN0aW9uX3F1ZXVlLmVuZCgpKSB7Ci0gICAgYm9vbCBpc19jb25nZXN0ZWQgPSBwdHItPnNlY29uZDsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29uZ2VzdGlvbiBxdWV1ZSBleGlzdCwgY29ubl9pZDogJWQsIGlzX2Nvbmdlc3RlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29ubl9pZCwgaXNfY29uZ2VzdGVkKTsKLSAgICBpZihpc19jb25nZXN0ZWQpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBsb3dlciBsYXllciBpcyBjb25nZXN0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgYXV0byBtYXBfcHRyID0gZ2F0dF9vcF9xdWV1ZS5maW5kKGNvbm5faWQpOwotCi0gIGlmIChtYXBfcHRyID09IGdhdHRfb3BfcXVldWUuZW5kKCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogUXVldWUgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobWFwX3B0ci0+c2Vjb25kLmVtcHR5KCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcXVldWUgaXMgZW1wdHkgZm9yIGNvbm5faWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjb25uX2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZ2F0dF9vcF9xdWV1ZV9leGVjdXRpbmcuY291bnQoY29ubl9pZCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY2FuJ3QgZW5xdWV1ZSBuZXh0IG9wLCBhbHJlYWR5IGV4ZWN1dGluZyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBnYXR0X29wX3F1ZXVlX2V4ZWN1dGluZy5pbnNlcnQoY29ubl9pZCk7Ci0KLSAgc3RkOjpsaXN0PGdhdHRfb3BlcmF0aW9uPiYgZ2F0dF9vcHMgPSBtYXBfcHRyLT5zZWNvbmQ7Ci0KLSAgZ2F0dF9vcGVyYXRpb24mIG9wID0gZ2F0dF9vcHMuZnJvbnQoKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogb3AudHlwZT0lZCwgaGFuZGxlPSVkIiwgX19mdW5jX18sIG9wLnR5cGUsCi0gICAgb3AuaGFuZGxlKTsKLSAgaWYgKG9wLnR5cGUgPT0gR0FUVF9SRUFEX0NIQVIpIHsKLSAgICBnYXR0X3JlYWRfb3BfZGF0YSogZGF0YSA9Ci0gICAgICAgIChnYXR0X3JlYWRfb3BfZGF0YSopb3NpX21hbGxvYyhzaXplb2YoZ2F0dF9yZWFkX29wX2RhdGEpKTsKLSAgICBkYXRhLT5jYiA9IG9wLnJlYWRfY2I7Ci0gICAgZGF0YS0+Y2JfZGF0YSA9IG9wLnJlYWRfY2JfZGF0YTsKLSAgICBCVEFfR0FUVENfUmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIG9wLmhhbmRsZSwgR0FUVF9BVVRIX1JFUV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9yZWFkX29wX2ZpbmlzaGVkLCBkYXRhKTsKLQotICB9IGVsc2UgaWYgKG9wLnR5cGUgPT0gR0FUVF9SRUFEX0RFU0MpIHsKLSAgICBnYXR0X3JlYWRfb3BfZGF0YSogZGF0YSA9Ci0gICAgICAgIChnYXR0X3JlYWRfb3BfZGF0YSopb3NpX21hbGxvYyhzaXplb2YoZ2F0dF9yZWFkX29wX2RhdGEpKTsKLSAgICBkYXRhLT5jYiA9IG9wLnJlYWRfY2I7Ci0gICAgZGF0YS0+Y2JfZGF0YSA9IG9wLnJlYWRfY2JfZGF0YTsKLSAgICBCVEFfR0FUVENfUmVhZENoYXJEZXNjcihjb25uX2lkLCBvcC5oYW5kbGUsIEdBVFRfQVVUSF9SRVFfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXR0X3JlYWRfb3BfZmluaXNoZWQsIGRhdGEpOwotCi0gIH0gZWxzZSBpZiAob3AudHlwZSA9PSBHQVRUX1dSSVRFX0NIQVIpIHsKLSAgICBnYXR0X3dyaXRlX29wX2RhdGEqIGRhdGEgPQotICAgICAgICAoZ2F0dF93cml0ZV9vcF9kYXRhKilvc2lfbWFsbG9jKHNpemVvZihnYXR0X3dyaXRlX29wX2RhdGEpKTsKLSAgICBkYXRhLT5jYiA9IG9wLndyaXRlX2NiOwotICAgIGRhdGEtPmNiX2RhdGEgPSBvcC53cml0ZV9jYl9kYXRhOwotICAgIEJUQV9HQVRUQ19Xcml0ZUNoYXJWYWx1ZShjb25uX2lkLCBvcC5oYW5kbGUsIG9wLndyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcC52YWx1ZSksIEdBVFRfQVVUSF9SRVFfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF93cml0ZV9vcF9maW5pc2hlZCwgZGF0YSk7Ci0KLSAgfSBlbHNlIGlmIChvcC50eXBlID09IEdBVFRfV1JJVEVfREVTQykgewotICAgIGdhdHRfd3JpdGVfb3BfZGF0YSogZGF0YSA9Ci0gICAgICAgIChnYXR0X3dyaXRlX29wX2RhdGEqKW9zaV9tYWxsb2Moc2l6ZW9mKGdhdHRfd3JpdGVfb3BfZGF0YSkpOwotICAgIGRhdGEtPmNiID0gb3Aud3JpdGVfY2I7Ci0gICAgZGF0YS0+Y2JfZGF0YSA9IG9wLndyaXRlX2NiX2RhdGE7Ci0gICAgQlRBX0dBVFRDX1dyaXRlQ2hhckRlc2NyKGNvbm5faWQsIG9wLmhhbmRsZSwgc3RkOjptb3ZlKG9wLnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9BVVRIX1JFUV9OT05FLCBnYXR0X3dyaXRlX29wX2ZpbmlzaGVkLCBkYXRhKTsKLSAgfSBlbHNlIGlmIChvcC50eXBlID09IEdBVFRfU0VSVl9TRUFSQ0gpIHsKLSAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QoY29ubl9pZCwgb3AucF9zcnZjX3V1aWQpOwotICB9Ci19Ci0KLXZvaWQgR2F0dE9wc1F1ZXVlOjpDbGVhbih1aW50MTZfdCBjb25uX2lkKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBjb25uX2lkPTB4JXgiLCBfX2Z1bmNfXywgY29ubl9pZCk7Ci0KLSAgZ2F0dF9vcF9xdWV1ZS5lcmFzZShjb25uX2lkKTsKLSAgZ2F0dF9vcF9xdWV1ZV9leGVjdXRpbmcuZXJhc2UoY29ubl9pZCk7Ci19Ci0KLXZvaWQgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9HQVRUX1JFQURfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpIHsKLSAgZ2F0dF9vcF9xdWV1ZVtjb25uX2lkXS5wdXNoX2JhY2soey50eXBlID0gR0FUVF9SRUFEX0NIQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpZW50X2lkID0gY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkX2NiID0gY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZF9jYl9kYXRhID0gY2JfZGF0YX0pOwotICBnYXR0X2V4ZWN1dGVfbmV4dF9vcChjb25uX2lkKTsKLX0KLQotdm9pZCBHYXR0T3BzUXVldWU6OlJlYWREZXNjcmlwdG9yKHVpbnQxNl90IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFQX0dBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICBnYXR0X29wX3F1ZXVlW2Nvbm5faWRdLnB1c2hfYmFjayh7LnR5cGUgPSBHQVRUX1JFQURfREVTQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbGllbnRfaWQgPSBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFuZGxlID0gaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRfY2IgPSBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkX2NiX2RhdGEgPSBjYl9kYXRhfSk7Ci0gIGdhdHRfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotfQotCi12b2lkIEdhdHRPcHNRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9HQVRUX1dSSVRFX09QX0NCIGNiLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIGdhdHRfb3BfcXVldWVbY29ubl9pZF0ucHVzaF9iYWNrKHsudHlwZSA9IEdBVFRfV1JJVEVfQ0hBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbGllbnRfaWQgPSBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFuZGxlID0gaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlX3R5cGUgPSB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlX2NiID0gY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVfY2JfZGF0YSA9IGNiX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWUgPSBzdGQ6Om1vdmUodmFsdWUpfSk7Ci0gIGdhdHRfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotfQotCi12b2lkIEdhdHRPcHNRdWV1ZTo6V3JpdGVEZXNjcmlwdG9yKHVpbnQxNl90IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVBfR0FUVF9XUklURV9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSkgewotICBnYXR0X29wX3F1ZXVlW2Nvbm5faWRdLnB1c2hfYmFjayh7LnR5cGUgPSBHQVRUX1dSSVRFX0RFU0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpZW50X2lkID0gY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZV90eXBlID0gd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZV9jYiA9IGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlX2NiX2RhdGEgPSBjYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlID0gc3RkOjptb3ZlKHZhbHVlKX0pOwotICBnYXR0X2V4ZWN1dGVfbmV4dF9vcChjb25uX2lkKTsKLX0KLQotdm9pZCBHYXR0T3BzUXVldWU6OlNlcnZpY2VTZWFyY2godWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwgVXVpZCogc3J2Y191dWlkKSB7Ci0gIGdhdHRfb3BfcXVldWVbY29ubl9pZF0ucHVzaF9iYWNrKHsudHlwZSA9IEdBVFRfU0VSVl9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpZW50X2lkID0gY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBfc3J2Y191dWlkID0gc3J2Y191dWlkfSk7Ci0gIGdhdHRfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotfQotCi11aW50MTZfdCBHYXR0T3BzUXVldWU6OlNlcnZpY2VTZWFyY2hDb21wbGV0ZSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICBhdXRvIG1hcF9wdHIgPSBnYXR0X29wX3F1ZXVlLmZpbmQoY29ubl9pZCk7Ci0gIGlmIChtYXBfcHRyID09IGdhdHRfb3BfcXVldWUuZW5kKCkgfHwgbWFwX3B0ci0+c2Vjb25kLmVtcHR5KCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbm8gbW9yZSBvcGVyYXRpb25zIHF1ZXVlZCBmb3IgY29ubl9pZCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgY29ubl9pZCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdGQ6Omxpc3Q8Z2F0dF9vcGVyYXRpb24+JiBnYXR0X29wcyA9IG1hcF9wdHItPnNlY29uZDsKLQotICBnYXR0X29wZXJhdGlvbiBnYXR0X29wID0gZ2F0dF9vcHMuZnJvbnQoKTsKLSAgZ2F0dF9vcHMucG9wX2Zyb250KCk7Ci0gIG1hcmtfYXNfbm90X2V4ZWN1dGluZyhjb25uX2lkKTsKLSAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci0gIHJldHVybiBnYXR0X29wLmNsaWVudF9pZDsKLX0KLQotdm9pZCBHYXR0T3BzUXVldWU6OkNvbmdlc3Rpb25DYWxsYmFjayh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCkgewotICBjb25nZXN0aW9uX3F1ZXVlW2Nvbm5faWRdID0gY29uZ2VzdGVkOwotICBpZighY29uZ2VzdGVkKSB7Ci0gICAgZ2F0dF9leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvZ2F0dGNfb3BzX3F1ZXVlLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9nYXR0Y19vcHNfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkOTUyNS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9nYXR0Y19vcHNfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0KLXR5cGVkZWYgdm9pZCAoKkJBUF9HQVRUX1JFQURfT1BfQ0IpKHVpbnQxNl90IGNsaWVudF9pZCx1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpOwotCi10eXBlZGVmIHZvaWQgKCpCQVBfR0FUVF9XUklURV9PUF9DQikodWludDE2X3QgY2xpZW50X2lkLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdm9pZCogZGF0YSk7Ci0KLS8qIEJUQSBHQVRUQyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyBmb3IgbXVsdGlwbGUgY29tbWFuZHMgcXVldWluZy4gU28gb25lCi0gKiBjbGllbnQgbWFraW5nIGNhbGxzIHRvIEJUQV9HQVRUQ19SZWFkQ2hhcmFjdGVyaXN0aWMsIEJUQV9HQVRUQ19SZWFkQ2hhckRlc2NyLAotICogQlRBX0dBVFRDX1dyaXRlQ2hhclZhbHVlLCBCVEFfR0FUVENfV3JpdGVDaGFyRGVzY3IgbXVzdCB3YWl0IGZvciB0aGUgY2FsbGFja3MKLSAqIGJlZm9yZSBzY2hlZHVsaW5nIG5leHQgb3BlcmF0aW9uLgotICoKLSAqIE1ldGhvZHMgYmVsb3cgY2FuIGJlIHVzZWQgYXMgcmVwbGFjZW1lbnQgdG8gQlRBX0dBVFRDXyogaW4gQlRBIGFwcC4gVGhleSBkbwotICogcXVldWUgdGhlIGNvbW1hbmRzIGlmIGFub3RoZXIgY29tbWFuZCBpcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQuCi0gKgotICogSWYgeW91IGRlY2lkZSB0byB1c2UgdGhvc2UgbWV0aG9kcyBpbiB5b3VyIGFwcCwgbWFrZSBzdXJlIHRvIG5vdCBtaXggaXQgd2l0aAotICogZXhpc3RpbmcgQlRBX0dBVFRDXyogQVBJLgotICovCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci0KLWNsYXNzIEdhdHRPcHNRdWV1ZSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBDbGVhbih1aW50MTZfdCBjb25uX2lkKTsKLSAgc3RhdGljIHZvaWQgUmVhZENoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9HQVRUX1JFQURfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpOwotICBzdGF0aWMgdm9pZCBSZWFkRGVzY3JpcHRvcih1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQkFQX0dBVFRfUkVBRF9PUF9DQiBjYiwgdm9pZCogY2JfZGF0YSk7Ci0gIHN0YXRpYyB2b2lkIFdyaXRlQ2hhcmFjdGVyaXN0aWModWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9UWVBFIHdyaXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFQX0dBVFRfV1JJVEVfT1BfQ0IgY2IsIHZvaWQqIGNiX2RhdGEpOwotICBzdGF0aWMgdm9pZCBXcml0ZURlc2NyaXB0b3IodWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1RZUEUgd3JpdGVfdHlwZSwgQkFQX0dBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKTsKLSAgc3RhdGljIHZvaWQgU2VydmljZVNlYXJjaCh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwgVXVpZCogcF9zcnZjX3V1aWQpOwotCi0gIHN0YXRpYyB1aW50MTZfdCBTZXJ2aWNlU2VhcmNoQ29tcGxldGUodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci0KLSAgc3RhdGljIHZvaWQgQ29uZ2VzdGlvbkNhbGxiYWNrKHVpbnQxNl90IGNvbm5faWQsIGJvb2wgY29uZ2VzdGVkKTsKLQotCi0gIC8qIEhvbGRzIHBlbmRpbmcgR0FUVCBvcGVyYXRpb25zICovCi0gIHN0cnVjdCBnYXR0X29wZXJhdGlvbiB7Ci0gICAgdWludDhfdCB0eXBlOwotICAgIHVpbnQxNl90IGNsaWVudF9pZDsKLSAgICB1aW50MTZfdCBoYW5kbGU7Ci0gICAgQkFQX0dBVFRfUkVBRF9PUF9DQiByZWFkX2NiOwotICAgIHZvaWQqIHJlYWRfY2JfZGF0YTsKLSAgICBCQVBfR0FUVF9XUklURV9PUF9DQiB3cml0ZV9jYjsKLSAgICB2b2lkKiB3cml0ZV9jYl9kYXRhOwotCi0gICAgLyogd3JpdGUtc3BlY2lmaWMgZmllbGRzICovCi0gICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotCi0gICAgLyogZGlzY292ZXJ5IHNwZWNpZmljICovCi0gICAgVXVpZCogcF9zcnZjX3V1aWQ7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgYm9vbCBpc19jb25nZXN0ZWQ7Ci0KLSAgc3RhdGljIHZvaWQgbWFya19hc19ub3RfZXhlY3V0aW5nKHVpbnQxNl90IGNvbm5faWQpOwotICBzdGF0aWMgdm9pZCBnYXR0X2V4ZWN1dGVfbmV4dF9vcCh1aW50MTZfdCBjb25uX2lkKTsKLSAgc3RhdGljIHZvaWQgZ2F0dF9yZWFkX29wX2ZpbmlzaGVkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKTsKLSAgc3RhdGljIHZvaWQgZ2F0dF93cml0ZV9vcF9maW5pc2hlZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHZvaWQqIGRhdGEpOwotCi0gIC8vIG1hcHMgY29ubmVjdGlvbiBpZCB0byBvcGVyYXRpb25zIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbgotICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBzdGQ6Omxpc3Q8Z2F0dF9vcGVyYXRpb24+PiBnYXR0X29wX3F1ZXVlOwotCi0gIC8vIG1hcHMgY29ubmVjdGlvbiBpZCB0byBjb25nZXN0aW9uIHN0YXR1cyBvZiBlYWNoIGRldmljZQotICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBib29sPiBjb25nZXN0aW9uX3F1ZXVlOwotCi0gIC8vIGNvbnRhaW4gY29ubmVjdGlvbiBpZHMgdGhhdCBjdXJyZW50bHkgZXhlY3V0ZSBvcGVyYXRpb25zCi0gIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDE2X3Q+IGdhdHRfb3BfcXVldWVfZXhlY3V0aW5nOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvZ2F0dHNfb3BzX3F1ZXVlLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvZ2F0dHNfb3BzX3F1ZXVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODRmZTY1Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL2dhdHRzX29wc19xdWV1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZ2F0dHNfb3BzX3F1ZXVlLmgiCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmFwIHsKLQotdXNpbmcgZ2F0dHNfb3BlcmF0aW9uID0gR2F0dHNPcHNRdWV1ZTo6Z2F0dHNfb3BlcmF0aW9uOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1jb25zdGV4cHIgdWludDhfdCBHQVRUX05PVElGWSA9IDE7Ci0KLXN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgc3RkOjpsaXN0PGdhdHRzX29wZXJhdGlvbj4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYXR0c09wc1F1ZXVlOjpnYXR0c19vcF9xdWV1ZTsKLXN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MTZfdD4gR2F0dHNPcHNRdWV1ZTo6Z2F0dHNfb3BfcXVldWVfZXhlY3V0aW5nOwotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBib29sPiBHYXR0c09wc1F1ZXVlOjpjb25nZXN0aW9uX3F1ZXVlOwotCi12b2lkIEdhdHRzT3BzUXVldWU6Om1hcmtfYXNfbm90X2V4ZWN1dGluZyh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIGdhdHRzX29wX3F1ZXVlX2V4ZWN1dGluZy5lcmFzZShjb25uX2lkKTsKLX0KLQotdm9pZCBHYXR0c09wc1F1ZXVlOjpnYXR0c19leGVjdXRlX25leHRfb3AodWludDE2X3QgY29ubl9pZCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubl9pZD0weCV4IiwgX19mdW5jX18sIGNvbm5faWQpOwotCi0gIGlmIChnYXR0c19vcF9xdWV1ZS5lbXB0eSgpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IG9wIHF1ZXVlIGlzIGVtcHR5IiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gcHRyID0gY29uZ2VzdGlvbl9xdWV1ZS5maW5kKGNvbm5faWQpOwotCi0gIGlmIChwdHIgIT0gY29uZ2VzdGlvbl9xdWV1ZS5lbmQoKSkgewotICAgIGJvb2wgaXNfY29uZ2VzdGVkID0gcHRyLT5zZWNvbmQ7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvbmdlc3Rpb24gcXVldWUgZXhpc3QsIGNvbm5faWQ6ICVkLCBpc19jb25nZXN0ZWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5faWQsIGlzX2Nvbmdlc3RlZCk7Ci0gICAgaWYoaXNfY29uZ2VzdGVkKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogbG93ZXIgbGF5ZXIgaXMgY29uZ2VzdGVkIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIGF1dG8gbWFwX3B0ciA9IGdhdHRzX29wX3F1ZXVlLmZpbmQoY29ubl9pZCk7Ci0KLSAgaWYgKG1hcF9wdHIgPT0gZ2F0dHNfb3BfcXVldWUuZW5kKCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogUXVldWUgaXMgbnVsbCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobWFwX3B0ci0+c2Vjb25kLmVtcHR5KCkpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogcXVldWUgaXMgZW1wdHkgZm9yIGNvbm5faWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBjb25uX2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZ2F0dHNfb3BfcXVldWVfZXhlY3V0aW5nLmNvdW50KGNvbm5faWQpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNhbid0IGVucXVldWUgbmV4dCBvcCwgYWxyZWFkeSBleGVjdXRpbmciLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjpsaXN0PGdhdHRzX29wZXJhdGlvbj4mIGdhdHRzX29wcyA9IG1hcF9wdHItPnNlY29uZDsKLSAgZ2F0dHNfb3BlcmF0aW9uJiBvcCA9IGdhdHRzX29wcy5mcm9udCgpOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogb3AudHlwZT0lZCwgYXR0cl9pZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb3AudHlwZSwgb3AuYXR0cl9pZCk7Ci0KLSAgaWYob3AudHlwZSA9PSBHQVRUX05PVElGWSkgewotICAgIGlmKEdBVFRTX0NoZWNrU3RhdHVzRm9yQXBwKGNvbm5faWQsb3AubmVlZF9jb25maXJtKSA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIEJUQV9HQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24oY29ubl9pZCwgb3AuYXR0cl9pZCwgb3AudmFsdWUsIG9wLm5lZWRfY29uZmlybSk7Ci0gICAgICBnYXR0c19vcF9xdWV1ZV9leGVjdXRpbmcuaW5zZXJ0KGNvbm5faWQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEdhdHRzT3BzUXVldWU6OkNsZWFuKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IGNvbm5faWQ9MHgleCIsIF9fZnVuY19fLCBjb25uX2lkKTsKLQotICBnYXR0c19vcF9xdWV1ZS5lcmFzZShjb25uX2lkKTsKLSAgZ2F0dHNfb3BfcXVldWVfZXhlY3V0aW5nLmVyYXNlKGNvbm5faWQpOwotfQotCi12b2lkIEdhdHRzT3BzUXVldWU6OlNlbmROb3RpZmljYXRpb24odWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkX2NvbmZpcm0pIHsKLSAgZ2F0dHNfb3BfcXVldWVbY29ubl9pZF0ucHVzaF9iYWNrKHsudHlwZSA9IEdBVFRfTk9USUZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cl9pZCA9IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlID0gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZWVkX2NvbmZpcm0gPSBuZWVkX2NvbmZpcm19KTsKLSAgZ2F0dHNfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotfQotCi12b2lkIEdhdHRzT3BzUXVldWU6Ok5vdGlmaWNhdGlvbkNhbGxiYWNrKHVpbnQxNl90IGNvbm5faWQpewotICBhdXRvIG1hcF9wdHIgPSBnYXR0c19vcF9xdWV1ZS5maW5kKGNvbm5faWQpOwotICBpZiAobWFwX3B0ciA9PSBnYXR0c19vcF9xdWV1ZS5lbmQoKSB8fCBtYXBfcHRyLT5zZWNvbmQuZW1wdHkoKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBubyBtb3JlIG9wZXJhdGlvbnMgcXVldWVkIGZvciBjb25uX2lkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bGlzdDxnYXR0c19vcGVyYXRpb24+JiBnYXR0c19vcHMgPSBtYXBfcHRyLT5zZWNvbmQ7Ci0gIGdhdHRzX29wZXJhdGlvbiBvcCA9IGdhdHRzX29wcy5mcm9udCgpOwotICBnYXR0c19vcHMucG9wX2Zyb250KCk7Ci0gIG1hcmtfYXNfbm90X2V4ZWN1dGluZyhjb25uX2lkKTsKLSAgZ2F0dHNfZXhlY3V0ZV9uZXh0X29wKGNvbm5faWQpOwotfQotCi12b2lkIEdhdHRzT3BzUXVldWU6OkNvbmdlc3Rpb25DYWxsYmFjayh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogY29ubl9pZDogJWQsIGNvbmdlc3RlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29ubl9pZCxjb25nZXN0ZWQpOwotCi0gIGNvbmdlc3Rpb25fcXVldWVbY29ubl9pZF0gPSBjb25nZXN0ZWQ7Ci0gIGlmKCFjb25nZXN0ZWQpIHsKLSAgICBnYXR0c19leGVjdXRlX25leHRfb3AoY29ubl9pZCk7Ci0gIH0KLX0KLQotfQotfSAvLyBuYW1lc3BhY2UgZW5kcwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvZ2F0dHNfb3BzX3F1ZXVlLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9nYXR0c19vcHNfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwZDVhOC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9nYXR0c19vcHNfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci0KLWNsYXNzIEdhdHRzT3BzUXVldWUgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgQ2xlYW4odWludDE2X3QgY29ubl9pZCk7Ci0gIHN0YXRpYyB2b2lkIFNlbmROb3RpZmljYXRpb24odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwgYm9vbCBuZWVkX2NvbmZpcm0pOwotICBzdGF0aWMgdm9pZCBOb3RpZmljYXRpb25DYWxsYmFjayh1aW50MTZfdCBjb25uX2lkKTsKLSAgc3RhdGljIHZvaWQgQ29uZ2VzdGlvbkNhbGxiYWNrKHVpbnQxNl90IGNvbm5faWQsIGJvb2wgY29uZ2VzdGVkKTsKLQotICAvKiBIb2xkcyBwZW5kaW5nIEdBVFQgb3BlcmF0aW9ucyAqLwotICBzdHJ1Y3QgZ2F0dHNfb3BlcmF0aW9uIHsKLSAgICAgICAgdWludDhfdCB0eXBlOwotICAgICAgICB1aW50MTZfdCBhdHRyX2lkOwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICAgICAgYm9vbCBuZWVkX2NvbmZpcm07Ci0gIH07Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgYm9vbCBpc19jb25nZXN0ZWQ7Ci0gIHN0YXRpYyB2b2lkIG1hcmtfYXNfbm90X2V4ZWN1dGluZyh1aW50MTZfdCBjb25uX2lkKTsKLSAgc3RhdGljIHZvaWQgZ2F0dHNfZXhlY3V0ZV9uZXh0X29wKHVpbnQxNl90IGNvbm5faWQpOwotCi0gIC8vIG1hcHMgY29ubmVjdGlvbiBpZCB0byBvcGVyYXRpb25zIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbgotICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBzdGQ6Omxpc3Q8Z2F0dHNfb3BlcmF0aW9uPj4gZ2F0dHNfb3BfcXVldWU7Ci0KLSAgLy8gbWFwcyBjb25uZWN0aW9uIGlkIHRvIGNvbmdlc3Rpb24gc3RhdHVzIG9mIGVhY2ggZGV2aWNlCi0gIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QsIGJvb2w+IGNvbmdlc3Rpb25fcXVldWU7Ci0KLSAgLy8gY29udGFpbiBjb25uZWN0aW9uIGlkcyB0aGF0IGN1cnJlbnRseSBleGVjdXRlIG9wZXJhdGlvbnMKLSAgc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MTZfdD4gZ2F0dHNfb3BfcXVldWVfZXhlY3V0aW5nOwotCi19OyAvLyBDbGFzcyBHYXR0c09wc1F1ZXVlIGVuZHMKLQotfQotfSAvLyBuYW1lc3BhY2UgZW5kcwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvcGFjc19jbGllbnQuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9wYWNzX2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyM2RjZi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC9wYWNzX2NsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4NjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIgotI2luY2x1ZGUgImJ0YV9wYWNzX2NsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJnYXR0Y19vcHNfcXVldWUuaCIKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9iYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYmFwX3VjbGllbnQuaD4KLSNpbmNsdWRlICJidGlmX2JhcF9jb2RlY191dGlscy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIHBhY3MgewotCi0vL3VzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50Q2FsbGJhY2tzOwotdXNpbmcgYmFzZTo6Q2xvc3VyZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpHYXR0T3BzUXVldWU7Ci0KLVV1aWQgUEFDU19VVUlEICAgICAgICAgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIxODUwIik7Ci1VdWlkIFBBQ1NfU0lOS19QQUNfVVVJRCAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkJDOSIpOwotVXVpZCBQQUNTX1NJTktfTE9DX1VVSUQgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCQ0EiKTsKLVV1aWQgUEFDU19TUkNfUEFDX1VVSUQgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQkNCIik7Ci1VdWlkIFBBQ1NfU1JDX0xPQ19VVUlEICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkJDQyIpOwotVXVpZCBQQUNTX0FWQV9BVURJT19VVUlEICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCQ0QiKTsKLVV1aWQgUEFDU19TVVBfQVVESU9fVVVJRCAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQkNFIik7Ci0KLWNsYXNzIFBhY3NDbGllbnRJbXBsOwotUGFjc0NsaWVudEltcGwqIGluc3RhbmNlOwotCi10eXBlZGVmIHVpbnQ4X3QgY29kZWNfdHlwZV90WzVdOwotCi1jb25zdGV4cHIgdWludDhfdCBTSU5LX1BBQyAgICAgICAgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgU1JDX1BBQyAgICAgICAgID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IFNJTktfTE9DICAgICAgICA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCBTUkNfTE9DICAgICAgICAgPSAweDA4OwotY29uc3RleHByIHVpbnQ4X3QgQVZBSUxfQ09OVEVYVFMgID0gMHgxMDsKLWNvbnN0ZXhwciB1aW50OF90IFNVUFBfQ09OVEVYVFMgICA9IDB4MjA7Ci0KLWNvbnN0ZXhwciB1aW50OF90IExUVl9UWVBFX1NVUF9GUkVRUyAgICAgICAgICAgICAgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgTFRWX1RZUEVfU1VQX0ZSQU1FX0RVUiAgICAgICAgICA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBMVFZfVFlQRV9DSE5MX0NPVU5UUyAgICAgICAgICAgID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IExUVl9UWVBFX09DVFNfUEVSX0ZSQU1FICAgICAgICAgPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3QgTFRWX1RZUEVfTUFYX1NVUF9GUkFNRVNfUEVSX1NEVSA9IDB4MDU7Ci0KLWNvbnN0ZXhwciB1aW50OF90IExUVl9UWVBFX1BSRUZfQVVEX0NPTlRFWFQgICAgICAgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgTFRWX1RZUEVfVlNfTUVUQV9EQVRBICAgICAgICAgICA9IDB4RkY7Ly9UT0RPCi1jb25zdGV4cHIgdWludDE2X3QgUVRJX0lEICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDBBOwotCi1jb25zdGV4cHIgdWludDhfdCBMVFZfVFlQRV9WU19NRVRBX0RBVEFfTEMzUSAgICAgID0gMHgxMDsKLQotLy9jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfTk9ORSAgICAgICAgPSAweDA7Ci1jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfOEsgICAgICAgICAgPSAweDEgPDwgMDsKLS8vY29uc3RleHByIHVpbnQxNl90IFNBTVBMRV9SQVRFXzExSyAgICAgICAgID0gMHgxIDw8IDE7Ci1jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfMTZLICAgICAgICAgPSAweDEgPDwgMjsKLS8vY29uc3RleHByIHVpbnQxNl90IFNBTVBMRV9SQVRFXzIySyAgICAgICAgID0gMHgxIDw8IDM7Ci1jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfMjRLICAgICAgICAgPSAweDEgPDwgNDsKLWNvbnN0ZXhwciB1aW50MTZfdCBTQU1QTEVfUkFURV8zMksgICAgICAgICA9IDB4MSA8PCA1OwotY29uc3RleHByIHVpbnQxNl90IFNBTVBMRV9SQVRFXzQ0MUsgICAgICAgID0gMHgxIDw8IDY7Ci1jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfNDhLICAgICAgICAgPSAweDEgPDwgNzsKLWNvbnN0ZXhwciB1aW50MTZfdCBTQU1QTEVfUkFURV84ODJLICAgICAgICA9IDB4MSA8PCA4OwotY29uc3RleHByIHVpbnQxNl90IFNBTVBMRV9SQVRFXzk2SyAgICAgICAgID0gMHgxIDw8IDk7Ci1jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfMTc2SyAgICAgICAgPSAweDEgPDwgMTA7Ci1jb25zdGV4cHIgdWludDE2X3QgU0FNUExFX1JBVEVfMTkySyAgICAgICAgPSAweDEgPDwgMTE7Ci0vL2NvbnN0ZXhwciB1aW50MTZfdCBTQU1QTEVfUkFURV8zODRLICAgICAgICA9IDB4MSA8PCAxMjsKLQotY29uc3RleHByIHVpbnQ4X3QgQ09ERUNfSURfTEMzICAgICA9IDB4MDY7Ci1jb25zdGV4cHIgdWludDhfdCBESVNDT1ZFUl9TVUNDRVNTID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IERJU0NPVkVSX0ZBSUwgICAgPSAweEZGOwotCi1zdGQ6Om1hcDx1aW50OF90LCBDb2RlY1NhbXBsZVJhdGU+IGZyZXFfbWFwID0gewotICB7U0FNUExFX1JBVEVfOEssICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCAgfSwKLSAge1NBTVBMRV9SQVRFXzE2SywgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwIH0sCi0gIHtTQU1QTEVfUkFURV8yNEssICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8yNDAwMCB9LAotICB7U0FNUExFX1JBVEVfMzJLLCAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDAgfSwKLSAge1NBTVBMRV9SQVRFXzQ0MUssICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwIH0sCi0gIHtTQU1QTEVfUkFURV80OEssICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80ODAwMCB9LAotICB7U0FNUExFX1JBVEVfODgySywgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODgyMDAgfSwKLSAge1NBTVBMRV9SQVRFXzk2SywgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzk2MDAwIH0sCi0gIHtTQU1QTEVfUkFURV8xNzZLLCAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNzY0MDB9LAotICB7U0FNUExFX1JBVEVfMTkySywgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTkyMDAwfQotfTsKLQotLy8gbHR2IHR5cGUgdG8gbGVuZ3RoCi1zdGQ6Om1hcDx1aW50OF90LCB1aW50OF90PiBsdHZfaW5mbyA9IHsKLSAge0xUVl9UWVBFX1NVUF9GUkVRUywgICAgICAgICAgICAgIDB4MDN9LAotICB7TFRWX1RZUEVfU1VQX0ZSQU1FX0RVUiwgICAgICAgICAgMHgwMn0sCi0gIHtMVFZfVFlQRV9DSE5MX0NPVU5UUywgICAgICAgICAgICAweDAyfSwKLSAge0xUVl9UWVBFX09DVFNfUEVSX0ZSQU1FLCAgICAgICAgIDB4MDV9LAotICB7TFRWX1RZUEVfTUFYX1NVUF9GUkFNRVNfUEVSX1NEVSwgMHgwMn0sCi0gIHtMVFZfVFlQRV9QUkVGX0FVRF9DT05URVhULCAgICAgICAweDAzfQotfTsKLQotZW51bSBjbGFzcyBQcm9mbGVPUCB7Ci0gIENPTk5FQ1QsCi0gIERJU0NPTk5FQ1QKLX07Ci0KLXN0cnVjdCBQcm9maWxlT3BlcmF0aW9uIHsKLSAgdWludDE2X3QgY2xpZW50X2lkOwotICBQcm9mbGVPUCB0eXBlOwotfTsKLQotZW51bSBjbGFzcyBEZXZTdGF0ZSB7Ci0gIElETEUgPSAwLAotICBDT05ORUNUSU5HLAotICBDT05ORUNURUQsCi0gIERJU0NPTk5FQ1RJTkcKLX07Ci0KLXN0cnVjdCBTaW5rUGFjc0RhdGEgewotICB1aW50MTZfdCBzaW5rX3BhY19oYW5kbGU7Ci0gIHVpbnQxNl90IHNpbmtfcGFjX2NjY19oYW5kbGU7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBzaW5rX3BhY19yZWNvcmRzOwotICBib29sIHJlYWRfc2lua19wYWNfcmVjb3JkOwotfTsKLQotc3RydWN0IFNyY1BhY3NEYXRhIHsKLSAgdWludDE2X3Qgc3JjX3BhY19oYW5kbGU7Ci0gIHVpbnQxNl90IHNyY19wYWNfY2NjX2hhbmRsZTsKLSAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IHNyY19wYWNfcmVjb3JkczsKLSAgYm9vbCByZWFkX3NyY19wYWNfcmVjb3JkOwotfTsKLQotdm9pZCBwYWNzX2dhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpOwotdm9pZCBlbmNyeXB0aW9uX2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MqLCB0R0FUVF9UUkFOU1BPUlQsIHZvaWQqLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1RBVFVTKTsKLQotc3RydWN0IFBhY3NEZXZpY2UgewotICBSYXdBZGRyZXNzIGFkZHJlc3M7Ci0gIC8qIFRoaXMgaXMgdHJ1ZSBvbmx5IGR1cmluZyBmaXJzdCBjb25uZWN0aW9uIHRvIHByb2ZpbGUsIHVudGlsIHdlIHN0b3JlIHRoZQotICAgKiBkZXZpY2UgKi8KLSAgYm9vbCBmaXJzdF9jb25uZWN0aW9uOwotICBib29sIHNlcnZpY2VfY2hhbmdlZF9yY3ZkOwotCi0gIC8qIHdlIGFyZSBtYWtpbmcgYWN0aXZlIGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGlzIGRldmljZSwgJ2RpcmVjdCBjb25uZWN0Jy4KLSAgICogVGhpcyBpcyB0cnVlIG9ubHkgZHVyaW5nIGluaXRpYWwgcGhhc2Ugb2YgZmlyc3QgY29ubmVjdGlvbi4gKi8KLSAgYm9vbCBjb25uZWN0aW5nX2FjdGl2ZWx5OwotCi0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHN0ZDo6dmVjdG9yPFNpbmtQYWNzRGF0YT5zaW5rX2luZm87Ci0gIHN0ZDo6dmVjdG9yPFNyY1BhY3NEYXRhPnNyY19pbmZvOwotICB1aW50MTZfdCBzaW5rX2xvY19oYW5kbGU7Ci0gIHVpbnQxNl90IHNpbmtfbG9jX2NjY19oYW5kbGU7Ci0gIHVpbnQxNl90IHNyY19sb2NfaGFuZGxlOwotICB1aW50MTZfdCBzcmNfbG9jX2NjY19oYW5kbGU7Ci0gIHVpbnQxNl90IGF2YWlsX2NvbnRleHRzX2hhbmRsZTsKLSAgdWludDE2X3QgYXZhaWxfY29udGV4dHNfY2NjX2hhbmRsZTsKLSAgdWludDE2X3Qgc3VwcF9jb250ZXh0c19oYW5kbGU7Ci0gIHVpbnQxNl90IHN1cHBfY29udGV4dHNfY2NjX2hhbmRsZTsKLSAgdWludDE2X3Qgc3J2X2NoYW5nZWRfY2NjX2hhbmRsZTsKLSAgdWludDhfdCBjaGFyc19yZWFkOwotICB1aW50OF90IGNoYXJzX3RvX2JlX3JlYWQ7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBjb25zb2xpZGF0ZWRfc2lua19wYWNfcmVjb3JkczsKLSAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGNvbnNvbGlkYXRlZF9zcmNfcGFjX3JlY29yZHM7Ci0gIHVpbnQzMl90IHNpbmtfbG9jYXRpb25zOwotICB1aW50MzJfdCBzcmNfbG9jYXRpb25zOwotICB1aW50MzJfdCBhdmFpbGFibGVfY29udGV4dHM7Ci0gIHVpbnQzMl90IHN1cHBvcnRlZF9jb250ZXh0czsKLSAgYm9vbCBkaXNjb3ZlcnlfY29tcGxldGVkOwotICBib29sIG5vdGlmaWNhdGlvbnNfZW5hYmxlZDsKLSAgRGV2U3RhdGUgc3RhdGU7Ci0gIGJvb2wgaXNfY29uZ2VzdGVkOwotICBzdGQ6OnZlY3RvcjxQcm9maWxlT3BlcmF0aW9uPiBwcm9maWxlX3F1ZXVlOwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY29ubmVjdGVkX2NsaWVudF9saXN0OyAvL2xpc3QgY2xpZW50IHJlcXVlc3RlZCBmb3IgY29ubmVjdGlvbgotICBQYWNzRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIDogYWRkcmVzcyhhZGRyZXNzKSB7fQotICBQYWNzRGV2aWNlKCkgewotICAgIGZpcnN0X2Nvbm5lY3Rpb24gPSBmYWxzZTsKLSAgICBzZXJ2aWNlX2NoYW5nZWRfcmN2ZCA9IGZhbHNlOwotICAgIGNvbm5faWQgPSAwOwotICAgIHNpbmtfbG9jX2hhbmRsZSA9IDA7Ci0gICAgc2lua19sb2NfY2NjX2hhbmRsZSA9IDA7Ci0gICAgc3JjX2xvY19oYW5kbGUgPSAwOwotICAgIHNyY19sb2NfY2NjX2hhbmRsZSA9IDA7Ci0gICAgYXZhaWxfY29udGV4dHNfaGFuZGxlID0gMDsKLSAgICBhdmFpbF9jb250ZXh0c19jY2NfaGFuZGxlID0gMDsKLSAgICBzdXBwX2NvbnRleHRzX2hhbmRsZSA9IDA7Ci0gICAgc3VwcF9jb250ZXh0c19jY2NfaGFuZGxlID0gMDsKLSAgICBzcnZfY2hhbmdlZF9jY2NfaGFuZGxlID0gMDsKLSAgICBjaGFyc19yZWFkID0gMDsKLSAgICBzaW5rX2xvY2F0aW9ucyA9IDA7Ci0gICAgc3JjX2xvY2F0aW9ucyA9IDA7Ci0gICAgYXZhaWxhYmxlX2NvbnRleHRzID0gMDsKLSAgICBzdXBwb3J0ZWRfY29udGV4dHMgPSAwOwotICAgIGRpc2NvdmVyeV9jb21wbGV0ZWQgPSBmYWxzZTsKLSAgICBub3RpZmljYXRpb25zX2VuYWJsZWQgPSBmYWxzZTsKLSAgICBzdGF0ZSA9IHN0YXRpY19jYXN0PERldlN0YXRlPigwKTsKLSAgICBpc19jb25nZXN0ZWQgPSBmYWxzZTsKLSAgfQotfTsKLQotY2xhc3MgUGFjc0RldmljZXMgewotIHB1YmxpYzoKLSAgdm9pZCBBZGQoUGFjc0RldmljZSBkZXZpY2UpIHsKLSAgICBpZiAoRmluZEJ5QWRkcmVzcyhkZXZpY2UuYWRkcmVzcykgIT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgZGV2aWNlcy5wdXNoX2JhY2soZGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VzLmJlZ2luKCk7IGl0ICE9IGRldmljZXMuZW5kKCk7KSB7Ci0gICAgICBpZiAoaXQtPmFkZHJlc3MgIT0gYWRkcmVzcykgewotICAgICAgICArK2l0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaXQgPSBkZXZpY2VzLmVyYXNlKGl0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBQYWNzRGV2aWNlKiBGaW5kQnlBZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2aWNlcy5iZWdpbigpLCBkZXZpY2VzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmFkZHJlc3NdKGNvbnN0IFBhY3NEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuYWRkcmVzcyA9PSBhZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIFBhY3NEZXZpY2UqIEZpbmRCeUNvbm5JZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXMuYmVnaW4oKSwgZGV2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZjb25uX2lkXShjb25zdCBQYWNzRGV2aWNlJiBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmNvbm5faWQgPT0gY29ubl9pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gKGl0ZXIgPT0gZGV2aWNlcy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIChkZXZpY2VzLnNpemUoKSk7IH0KLQotICBzdGQ6OnZlY3RvcjxQYWNzRGV2aWNlPiBkZXZpY2VzOwotfTsKLQotY2xhc3MgUGFjc0NsaWVudEltcGwgOiBwdWJsaWMgUGFjc0NsaWVudCB7Ci0gcHVibGljOgotICB+UGFjc0NsaWVudEltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgUGFjc0NsaWVudEltcGwoKSA6IGdhdHRfY2xpZW50X2lkKEJUQV9HQVRUU19JTlZBTElEX0lGKSB7fTsKLQotICBib29sIFJlZ2lzdGVyKFBhY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrKSB7Ci0gICAgLy8gbG9va3MgZm9yIGNsaWVudCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKLSAgICBib29sIGlzX2NsaWVudF9yZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgZm9yIChhdXRvIGl0IDogY2FsbGJhY2tzKSB7Ci0gICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpwYWNfY2FsbGJhY2sgPSBpdC5zZWNvbmQ7Ci0gICAgICBpZiAoY2FsbGJhY2sgPT0gcGFjX2NhbGxiYWNrKSB7Ci0gICAgICAgIGlzX2NsaWVudF9yZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgaXNfY2xpZW50X3JlZ2lzdGVyZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXNfY2xpZW50X3JlZ2lzdGVyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZ2F0dF9jbGllbnRfaWQ6ICIgPDwgZ2F0dF9jbGllbnRfaWQ7Ci0gICAgaWYgKGlzX2NsaWVudF9yZWdpc3RlcmVkKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZ2F0dF9jbGllbnRfaWQgPT0gQlRBX0dBVFRTX0lOVkFMSURfSUYpIHsKLSAgICAgIEJUQV9HQVRUQ19BcHBSZWdpc3RlcigKLSAgICAgICAgcGFjc19nYXR0Y19jYWxsYmFjaywKLSAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICBbXShQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjaywgdWludDhfdCBjbGllbnRfaWQsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW4ndCBzdGFydCBQQUNTIHByb2ZpbGUgLSBubyBnYXR0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50cyBsZWZ0ISI7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiIFBBQ1MgZ2F0dF9jbGllbnRfaWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluc3RhbmNlLT5nYXR0X2NsaWVudF9pZDsKLSAgICAgICAgICAgICAgaW5zdGFuY2UtPmdhdHRfY2xpZW50X2lkID0gY2xpZW50X2lkOwotICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2FsbGJhY2tzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbnN0YW5jZS0+cGFjc19jbGllbnRfaWQsIGNhbGxiYWNrKSk7Ci0gICAgICAgICAgICAgIGNhbGxiYWNrLT5PbkluaXRpYWxpemVkKDAsIGluc3RhbmNlLT5wYWNzX2NsaWVudF9pZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBjYWxsYmFjayksIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbnN0YW5jZS0+Y2FsbGJhY2tzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgKytpbnN0YW5jZS0+cGFjc19jbGllbnRfaWQsIGNhbGxiYWNrKSk7Ci0gICAgICBjYWxsYmFjay0+T25Jbml0aWFsaXplZCgwLCBpbnN0YW5jZS0+cGFjc19jbGllbnRfaWQpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgRGVyZWdpc3RlciAodWludDE2X3QgY2xpZW50X2lkKSB7Ci0gICAgYm9vbCBzdGF0dXMgPSBmYWxzZTsKLSAgICBhdXRvIGl0ID0gY2FsbGJhY2tzLmZpbmQoY2xpZW50X2lkKTsKLSAgICBpZiAoaXQgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICBjYWxsYmFja3MuZXJhc2UoaXQpOwotICAgICAgaWYoY2FsbGJhY2tzLmVtcHR5KCkpIHsKLSAgICAgICAvLyBkZXJlZ2lzdGVyIHdpdGggR0FUVAotICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIEdhdHQgZGUtcmVnaXN0ZXIgZnJvbSBwYWNzIjsKLSAgICAgICBCVEFfR0FUVENfQXBwRGVyZWdpc3RlcihnYXR0X2NsaWVudF9pZCk7Ci0gICAgICAgZ2F0dF9jbGllbnRfaWQgPSBCVEFfR0FUVFNfSU5WQUxJRF9JRjsKLSAgICAgIH0KLSAgICAgIHN0YXR1cyA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICB1aW50OF90IEdldENsaWVudENvdW50ICgpIHsKLSAgICByZXR1cm4gY2FsbGJhY2tzLnNpemUoKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QpIG92ZXJyaWRlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgUGFjc0RldmljZSAqZGV2ID0gcGFjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBQcm9maWxlT3BlcmF0aW9uIG9wOwotICAgIG9wLmNsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgICBvcC50eXBlID0gUHJvZmxlT1A6OkNPTk5FQ1Q7Ci0KLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgIFBhY3NEZXZpY2UgcGFjX2RldihhZGRyZXNzKTsKLSAgICAgIHBhY3NEZXZpY2VzLkFkZChwYWNfZGV2KTsKLSAgICAgIGRldiA9IHBhY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgfQotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiZGV2IGlzIG51bGwiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZTogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGRldi0+c3RhdGUpOwotCi0gICAgc3dpdGNoKGRldi0+c3RhdGUpIHsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OklETEU6IHsKLSAgICAgICAgQlRBX0dBVFRDX09wZW4oZ2F0dF9jbGllbnRfaWQsIGFkZHJlc3MsIGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1RSQU5TUE9SVF9MRSwgZmFsc2UpOwotICAgICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OkNPTk5FQ1RJTkc7Ci0gICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5wdXNoX2JhY2sob3ApOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OkNPTk5FQ1RJTkc6IHsKLSAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLnB1c2hfYmFjayhvcCk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVEVEOiB7Ci0gICAgICAgIC8vIGFkZCBpdCB0byB0aGUgY2xpZW50IGlkIGxpc3QgaWYgbm90IGFscmVhZHkgZG9uZQotICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNsaWVudF9pZF0odWludDE2X3QgaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQgPT0gY2xpZW50X2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICBpZiAoaXRlciA9PSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5lbmQoKSkKLSAgICAgICAgICBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5wdXNoX2JhY2soY2xpZW50X2lkKTsKLQotICAgICAgICAvLyByZXNwb25kIGltbWVkaWF0ZWx5IGFzIGNvbm5lY3RlZAotCi0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBEZXZTdGF0ZTo6RElTQ09OTkVDVElORzogewotICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUucHVzaF9iYWNrKG9wKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIFBhY3NEZXZpY2UqIGRldiA9IHBhY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCI6IERldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGU6ICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBQcm9maWxlT3BlcmF0aW9uIG9wOwotICAgIG9wLmNsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgICBvcC50eXBlID0gUHJvZmxlT1A6OkRJU0NPTk5FQ1Q7Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogYWRkcmVzczogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0YXRlOiAiIDw8IHN0YXRpY19jYXN0PGludD4oZGV2LT5zdGF0ZSk7Ci0KLSAgICBzd2l0Y2goZGV2LT5zdGF0ZSkgewotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVElORzogewotICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2LT5wcm9maWxlX3F1ZXVlLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2xpZW50X2lkXSggUHJvZmlsZU9wZXJhdGlvbiBlbnRyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGVudHJ5LnR5cGUgPT0gUHJvZmxlT1A6OkNPTk5FQ1QpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnRyeS5jbGllbnRfaWQgPT0gY2xpZW50X2lkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAvLyBJZiBpdCBpcyB0aGUgbGFzdCBjbGllbnQgcmVxdWVzdGVkIGZvciBkaXNjb25uZWN0Ci0gICAgICAgIGlmIChpdGVyICE9IGRldi0+cHJvZmlsZV9xdWV1ZS5lbmQoKSAmJgotICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICBpZiAoZGV2LT5jb25uX2lkKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgICAgICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZGV2LT5jb25uX2lkLCBhZGRyZXNzLCBmYWxzZSk7Ci0gICAgICAgICAgICBHYXR0T3BzUXVldWU6OkNsZWFuKGRldi0+Y29ubl9pZCk7Ci0gICAgICAgICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2LT5jb25uX2lkKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGNvbm5lY3Rpb24gcXVldWUgYW5kCi0gICAgICAgICAgICAvLyBtb3ZlIHRoZSBzdGF0ZSB0byBESVNDT05ORUNUSU5HIHRvIGJldHRlciB0cmFjawotICAgICAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLmNsZWFyKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRldi0+c3RhdGUgPSBEZXZTdGF0ZTo6RElTQ09OTkVDVElORzsKLSAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUucHVzaF9iYWNrKG9wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjb25uZWN0aW9uIGVudHJ5IGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgLy8gYXMgdGhlIHNhbWUgY2xpZW50IGhhcyByZXF1ZXN0ZWQgZm9yIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLmVyYXNlKGl0ZXIpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVEVEOiB7Ci0gICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2xpZW50X2lkXSggdWludDE2X3Qgc3RvcmVkX2NsaWVudF9pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZWRfY2xpZW50X2lkID09IGNsaWVudF9pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIC8vIGlmIGl0IGlzIHRoZSBsYXN0IGNsaWVudCByZXF1ZXN0ZWQgZm9yIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgaWYgKGl0ZXIgIT0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCkgJiYKLSAgICAgICAgICAgZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3Quc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICBpZiAoZGV2LT5jb25uX2lkKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgICAgICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZGV2LT5jb25uX2lkLCBhZGRyZXNzLCBmYWxzZSk7Ci0gICAgICAgICAgICBHYXR0T3BzUXVldWU6OkNsZWFuKGRldi0+Y29ubl9pZCk7Ci0gICAgICAgICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2LT5jb25uX2lkKTsKLSAgICAgICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5wdXNoX2JhY2sob3ApOwotICAgICAgICAgICAgZGV2LT5zdGF0ZSA9IERldlN0YXRlOjpESVNDT05ORUNUSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyByZW1vdmUgdGhlIGNsaWVudCBmcm9tIGNvbm5lY3RlZF9jbGllbnRfbGlzdAotICAgICAgICAgIGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVyYXNlKGl0ZXIpOwotICAgICAgICAgIC8vIHJlbW92ZSB0aGUgIHBlbmRpbmcgZ2F0dCBvcHMoIG5vdCB0aGUgb25nb2luZyBvbmUgKQotICAgICAgICAgIC8vIGluaXRpYXRlZCBmcm9tIGNsaWVudCB3aGljaCByZXF1ZXN0ZWQgZGlzY29ubmVjdAotICAgICAgICAgIC8vIFRPRE8gYW5kIHNlbmQgY2FsbGJhY2sgYXMgZGlzY29ubmVjdGVkCi0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIERldlN0YXRlOjpESVNDT05ORUNUSU5HOiB7Ci0gICAgICAgIGRldi0+cHJvZmlsZV9xdWV1ZS5wdXNoX2JhY2sob3ApOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU3RhcnREaXNjb3ZlcnkodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgUGFjc0RldmljZSogZGV2ID0gcGFjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IERldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGU6ICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0YXRlOiAiIDw8IHN0YXRpY19jYXN0PGludD4oZGV2LT5zdGF0ZSk7Ci0gICAgc3dpdGNoKGRldi0+c3RhdGUpIHsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OkNPTk5FQ1RFRDogewotICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNsaWVudF9pZF0oIHVpbnQxNl90IHN0b3JlZF9jbGllbnRfaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBjbGllbnRfaWQ6ICIgPDwgY2xpZW50X2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdG9yZWRfY2xpZW50X2lkOiIgPDwgc3RvcmVkX2NsaWVudF9pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmVkX2NsaWVudF9pZCA9PSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xpZW50IHByZXNlbnQgaW4gdGhlIGNvbm5lY3RlZCBjbGllbnQgbGlzdAotICAgICAgICBpZiAoaXRlciA9PSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5lbmQoKSkgewotICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiLCBkaXNjb3ZlcnlfY29tcGxldGVkOiAiIDw8IGRldi0+ZGlzY292ZXJ5X2NvbXBsZXRlZAotICAgICAgICAgICAgICAgICA8PCAiLCBub3RpZmljYXRpb25zX2VuYWJsZWQ6ICIgPDwgZGV2LT5ub3RpZmljYXRpb25zX2VuYWJsZWQ7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGRpc2NvdmVyeSBpcyBhbHJlYWR5IGZpbmlzaGVkCi0gICAgICAgIC8vIHNlbmQgYmFjayB0aGUgc2FtZSByZXN1bHRzIHRvIHRoZSBvdGhlciBjbGllbnQKLSAgICAgICAgaWYgKGRldi0+ZGlzY292ZXJ5X2NvbXBsZXRlZCAmJiBkZXYtPm5vdGlmaWNhdGlvbnNfZW5hYmxlZCkgewotICAgICAgICAgIGF1dG8gaXRlciA9IGNhbGxiYWNrcy5maW5kKGNsaWVudF9pZCk7Ci0gICAgICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogT25TZWFyY2hDb21wbGV0ZSI7Ci0gICAgICAgICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5PblNlYXJjaENvbXBsZXRlKERJU0NPVkVSX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmNvbnNvbGlkYXRlZF9zaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5jb25zb2xpZGF0ZWRfc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zaW5rX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3JjX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zdXBwb3J0ZWRfY29udGV4dHMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlc2V0IGl0Ci0gICAgICAgIGRldi0+Y2hhcnNfcmVhZCA9IDB4MDA7Ci0gICAgICAgIGRldi0+Y2hhcnNfdG9fYmVfcmVhZCA9IDB4MDA7Ci0gICAgICAgIGRldi0+c2lua19pbmZvLmNsZWFyKCk7Ci0gICAgICAgIGRldi0+c3JjX2luZm8uY2xlYXIoKTsKLSAgICAgICAgZGV2LT5jb25zb2xpZGF0ZWRfc2lua19wYWNfcmVjb3Jkcy5jbGVhcigpOwotICAgICAgICBkZXYtPmNvbnNvbGlkYXRlZF9zcmNfcGFjX3JlY29yZHMuY2xlYXIoKTsKLSAgICAgICAgLy9UT0RPCi0gICAgICAgIC8vYnRpZl9iYXBfcmVtb3ZlX3JlY29yZCgpCi0KLSAgICAgICAgLy8gcXVldWUgdGhlIHJlcXVlc3QgdG8gR0FUVCBxdWV1ZSBtb2R1bGUKLSAgICAgICAgR2F0dE9wc1F1ZXVlOjpTZXJ2aWNlU2VhcmNoKGNsaWVudF9pZCwgZGV2LT5jb25uX2lkLCAmUEFDU19VVUlEKTsKLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgR2V0QXVkaW9BdmFpbGFiaWxpdHkodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgUGFjc0RldmljZSogZGV2ID0gcGFjc0RldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IERldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGU6ICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M6ICIgPDwgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0ZTogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGRldi0+c3RhdGUpOwotCi0gICAgc3dpdGNoKGRldi0+c3RhdGUpIHsKLSAgICAgIGNhc2UgRGV2U3RhdGU6OkNPTk5FQ1RFRDogewotICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+Y29ubmVjdGVkX2NsaWVudF9saXN0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNsaWVudF9pZF0oIHVpbnQxNl90IHN0b3JlZF9jbGllbnRfaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmVkX2NsaWVudF9pZCA9PSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xpZW50IHByZXNlbnQgaW4gdGhlIGNvbm5lY3RlZCBjbGllbnQgbGlzdAotICAgICAgICBpZiAoaXRlciA9PSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5lbmQoKSkgewotICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBmaW5pc2hlZAotICAgICAgICAvLyBzZW5kIGJhY2sgdGhlIHNhbWUgcmVzdWx0cyB0byB0aGUgb3RoZXIgY2xpZW50Ci0gICAgICAgIGlmIChkZXYtPmRpc2NvdmVyeV9jb21wbGV0ZWQgJiYgZGV2LT5ub3RpZmljYXRpb25zX2VuYWJsZWQpIHsKLSAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChjbGllbnRfaWQpOwotICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgUGFjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICBjYWxsYmFjay0+T25BdWRpb0NvbnRleHRBdmFpbGFibGUoZGV2LT5hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YXZhaWxhYmxlX2NvbnRleHRzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBxdWV1ZSB0aGUgcmVxdWVzdCB0byBHQVRUIHF1ZXVlIG1vZHVsZQotICAgICAgICBHYXR0T3BzUXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBkZXYtPmNvbm5faWQsIGRldi0+YXZhaWxfY29udGV4dHNfaGFuZGxlLAotICAgICAgICAgICAgICAgICBQYWNzQ2xpZW50SW1wbDo6T25SZWFkQXZhaWxhYmxlQXVkaW9TdGF0aWMsIG51bGxwdHIpOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIGRlZmF1bHQiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uR2F0dENvbm5lY3RlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBjbGllbnRfaWYsIFJhd0FkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9UUkFOU1BPUlQgdHJhbnNwb3J0LCB1aW50MTZfdCBtdHUpIHsKLQotICAgIFBhY3NEZXZpY2UqIGRldiA9IHBhY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIC8qIFdoZW4gZGV2aWNlIGlzIHF1aWNrbHkgZGlzYWJsZWQgYW5kIGVuYWJsZWQgaW4gc2V0dGluZ3MsIHRoaXMgY2FzZQotICAgICAgICogbWlnaHQgaGFwcGVuICovCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCJDbG9zaW5nIGNvbm5lY3Rpb24gdG8gbm9uIHBhY3MgZGV2aWNlLCBhZGRyZXNzOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgYWRkcmVzczsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgc3RhdGU6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihkZXYtPnN0YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzdGF0dXM6ICIgPDwgbG9naGV4KHN0YXR1cyk7Ci0KLSAgICBpZiAoZGV2LT5zdGF0ZSA9PSBEZXZTdGF0ZTo6Q09OTkVDVElORykgewotICAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAgIjogRmFpbGVkIHRvIGNvbm5lY3QgdG8gUEFDUyBkZXZpY2UiOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICAgIGlmKGl0LT50eXBlID09IFByb2ZsZU9QOjpDT05ORUNUKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoaXQtPmNsaWVudF9pZCk7Ci0gICAgICAgICAgICBpZiAoaXRlciAhPSBjYWxsYmFja3MuZW5kKCkpIHsKLSAgICAgICAgICAgICAgUGFjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICAgIGNhbGxiYWNrLT5PbkNvbm5lY3Rpb25TdGF0ZShhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGV2LT5zdGF0ZSA9IERldlN0YXRlOjpJRExFOwotICAgICAgICBwYWNzRGV2aWNlcy5SZW1vdmUoYWRkcmVzcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGRldi0+c3RhdGUgPT0gRGV2U3RhdGU6OkRJU0NPTk5FQ1RJTkcpIHsKLSAgICAgIC8vIFRPRE8gd2lsbCB0aGlzIGhhcHBlbnMgPwotICAgICAgLy8gaXQgY291bGQgaGF2ZSBjYWxsZWQgdGhlIGNhbmNlbCBvcGVuIHRvIGV4cGVjdCB0aGUKLSAgICAgIC8vIG9wZW4gY2FuY2VsbGVkIGV2ZW50Ci0gICAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY29ubmVjdCB0byBQQUNTIGRldmljZSI7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+cHJvZmlsZV9xdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCk7KSB7Ci0gICAgICAgICAgaWYoaXQtPnR5cGUgPT0gUHJvZmxlT1A6OkRJU0NPTk5FQ1QpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChpdC0+Y2xpZW50X2lkKTsKLSAgICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgICAgICAgY2FsbGJhY2stPk9uQ29ubmVjdGlvblN0YXRlKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXYtPnByb2ZpbGVfcXVldWUuZXJhc2UoaXQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpdCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OklETEU7Ci0gICAgICAgIHBhY3NEZXZpY2VzLlJlbW92ZShhZGRyZXNzKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZ2F0dCBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgIC8vIGlmIHRoZSBkaXNjb25uZWN0IGVudHJ5IGlzIGZvdW5kIHdlIG5lZWQgdG8gaW5pdGlhdGUgdGhlCi0gICAgICAgIC8vIGdhdHQgZGlzY29ubmVjdC4gbWF5IGJlIGEgcmFjZSBjb25kaXRpb24ganVzdCBhZnRlciBzZW5kaW5nCi0gICAgICAgIC8vIGNhbmNlbCBvcGVuIGdhdHQgY29ubmVjdGVkIGV2ZW50IHJlY2VpdmVkCi0gICAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+cHJvZmlsZV9xdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCk7KSB7Ci0gICAgICAgICAgaWYoaXQtPnR5cGUgPT0gUHJvZmxlT1A6OkRJU0NPTk5FQ1QpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChpdC0+Y2xpZW50X2lkKTsKLSAgICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgICAgICAgICAgICBCVEFfR0FUVENfQ2FuY2VsT3BlbihkZXYtPmNvbm5faWQsIGFkZHJlc3MsIGZhbHNlKTsKLSAgICAgICAgICAgICAgR2F0dE9wc1F1ZXVlOjpDbGVhbihkZXYtPmNvbm5faWQpOwotICAgICAgICAgICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2LT5jb25uX2lkKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGl0Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gcmV0dXJuIHVuY29uZGl0aW5hbGx5Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gc3VjY2VzcyBzY2VuYXJpbyBjb2RlCi0gICAgZGV2LT5jb25uX2lkID0gY29ubl9pZDsKLQotICAgIHRBQ0xfQ09OTiogcF9hY2wgPSBidG1fYmRhX3RvX2FjbChhZGRyZXNzLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgIGlmIChwX2FjbCAhPSBudWxscHRyICYmCi0gICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfMm1fcGh5KCkgJiYKLSAgICAgICAgSENJX0xFXzJNX1BIWV9TVVBQT1JURUQocF9hY2wtPnBlZXJfbGVfZmVhdHVyZXMpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgYWRkcmVzcyA8PCAiIHNldCBwcmVmZXJyZWQgUEhZIHRvIDJNIjsKLSAgICAgIEJUTV9CbGVTZXRQaHkoYWRkcmVzcywgUEhZX0xFXzJNLCBQSFlfTEVfMk0sIDApOwotICAgIH0KLQotICAgIC8qIHZlcmlmeSBib25kICovCi0gICAgdWludDhfdCBzZWNfZmxhZyA9IDA7Ci0gICAgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChhZGRyZXNzLCAmc2VjX2ZsYWcsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgICBpZiAoc2VjX2ZsYWcgJiBCVE1fU0VDX0ZMQUdfRU5DUllQVEVEKSB7Ci0gICAgICAvKiBpZiBsaW5rIGhhcyBiZWVuIGVuY3J5cHRlZCAqLwotICAgICAgT25FbmNyeXB0aW9uQ29tcGxldGUoYWRkcmVzcywgdHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHNlY19mbGFnICYgQlRNX1NFQ19GTEFHX0xLRVlfS05PV04pIHsKLSAgICAgIC8qIGlmIGJvbmRlZCBhbmQgbGluayBub3QgZW5jcnlwdGVkICovCi0gICAgICBzZWNfZmxhZyA9IEJUTV9CTEVfU0VDX0VOQ1JZUFQ7Ci0gICAgICBMT0coV0FSTklORykgPDwgInRyeWluZyB0byBlbmNyeXB0IG5vdyI7Ci0gICAgICBCVE1fU2V0RW5jcnlwdGlvbihhZGRyZXNzLCBCVEFfVFJBTlNQT1JUX0xFLCBlbmNyeXB0aW9uX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgc2VjX2ZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG90aGVyd2lzZSBsZXQgaXQgZ28gdGhyb3VnaCAqLwotICAgIE9uRW5jcnlwdGlvbkNvbXBsZXRlKGFkZHJlc3MsIHRydWUpOwotICB9Ci0KLSAgdm9pZCBPbkdhdHREaXNjb25uZWN0ZWQodEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfSUYgY2xpZW50X2lmLCBSYXdBZGRyZXNzIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9SRUFTT04gcmVhc29uKSB7Ci0gICAgUGFjc0RldmljZSogZGV2ID0gcGFjc0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coRVJST1IpICA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UgZGlzY29ubmVjdCwgY29ubl9pZD0iCi0gICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgcmVtb3RlX2JkYTogIiA8PCByZW1vdGVfYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHN0YXRlOiAiIDw8IHN0YXRpY19jYXN0PGludD4oZGV2LT5zdGF0ZSk7Ci0KLSAgICBzd2l0Y2goZGV2LT5zdGF0ZSkgewotICAgICAgY2FzZSBEZXZTdGF0ZTo6Q09OTkVDVElORzogewotICAgICAgICAvLyBzdWRkZW4gZGlzY29ubmVjdGlvbgotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICAgIGlmIChpdC0+dHlwZSA9PSBQcm9mbGVPUDo6Q09OTkVDVCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjYWxsYmFjayBhbmQgdXBkYXRlIHRoZSB1cHBlciBsYXllcnMKLSAgICAgICAgICAgIGF1dG8gaXRlciA9IGNhbGxiYWNrcy5maW5kKGl0LT5jbGllbnRfaWQpOwotICAgICAgICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgIFBhY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrID0gaXRlci0+c2Vjb25kOwotICAgICAgICAgICAgICBjYWxsYmFjay0+T25Db25uZWN0aW9uU3RhdGUocmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ID0gZGV2LT5wcm9maWxlX3F1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIERldlN0YXRlOjpDT05ORUNURUQ6IHsKLSAgICAgICAgLy8gc3VkZGVuIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgZm9yIChhdXRvIGl0ID0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZW5kKCk7KSB7Ci0gICAgICAgICAgLy8gZ2V0IHRoZSBjYWxsYmFjayBhbmQgdXBkYXRlIHRoZSB1cHBlciBsYXllcnMKLSAgICAgICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZCgqaXQpOwotICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgUGFjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICBjYWxsYmFjay0+T25Db25uZWN0aW9uU3RhdGUocmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGl0ID0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBEZXZTdGF0ZTo6RElTQ09OTkVDVElORzogewotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnByb2ZpbGVfcXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICAgIGlmIChpdC0+dHlwZSA9PSBQcm9mbGVPUDo6RElTQ09OTkVDVCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjYWxsYmFjayBhbmQgdXBkYXRlIHRoZSB1cHBlciBsYXllcnMKLSAgICAgICAgICAgIGF1dG8gaXRlciA9IGNhbGxiYWNrcy5maW5kKGl0LT5jbGllbnRfaWQpOwotICAgICAgICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgIFBhY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrID0gaXRlci0+c2Vjb25kOwotICAgICAgICAgICAgICBjYWxsYmFjay0+T25Db25uZWN0aW9uU3RhdGUocmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ID0gZGV2LT5wcm9maWxlX3F1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5lbmQoKTspIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgIGl0ID0gZGV2LT5jb25uZWN0ZWRfY2xpZW50X2xpc3QuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIHF1ZXVlIGlzIG5vdCBlbXB0eQotICAgICAgICAvLyBpZiBub3QgaW5pdGlhdGUgdGhlIEdhdHQgY29ubmVjdGlvbgotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChkZXYtPmNvbm5faWQpIHsKLSAgICAgIEdhdHRPcHNRdWV1ZTo6Q2xlYW4oZGV2LT5jb25uX2lkKTsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShkZXYtPmNvbm5faWQpOwotICAgICAgZGV2LT5jb25uX2lkID0gMDsKLSAgICB9Ci0KLSAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OklETEU7Ci0gICAgcGFjc0RldmljZXMuUmVtb3ZlKHJlbW90ZV9iZGEpOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25VcGRhdGVDb21wbGV0ZSh1aW50MTZfdCBjb25uX2lkLCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgICBQYWNzRGV2aWNlKiBkZXYgPSBwYWNzRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkVuY3J5cHRpb25Db21wbGV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBib29sIHN1Y2Nlc3MpIHsKLSAgICBQYWNzRGV2aWNlKiBkZXYgPSBwYWNzRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmKGRldi0+c3RhdGUgIT0gRGV2U3RhdGU6OkNPTk5FQ1RJTkcpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcmVjZWl2ZWQgaW4gd3Jvbmcgc3RhdGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzICA8PCBsb2doZXgoc3VjY2Vzcyk7Ci0gICAgLy8gZW5jcnlwdGlvbiBmYWlsZWQKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+cHJvZmlsZV9xdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5wcm9maWxlX3F1ZXVlLmVuZCgpOykgewotICAgICAgICBpZiAoaXQtPnR5cGUgPT0gUHJvZmxlT1A6OkNPTk5FQ1QpIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgICAgIGF1dG8gaXRlciA9IGNhbGxiYWNrcy5maW5kKGl0LT5jbGllbnRfaWQpOwotICAgICAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICAgICAgUGFjc0NsaWVudENhbGxiYWNrcyAqY2FsbGJhY2sgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICAgICAgICBjYWxsYmFjay0+T25Db25uZWN0aW9uU3RhdGUoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdHlwZSB0byBkaXNjb25uZWN0Ci0gICAgICAgICAgaXQtPnR5cGUgPSBQcm9mbGVPUDo6RElTQ09OTkVDVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpdCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OkRJU0NPTk5FQ1RJTkc7Ci0gICAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oZGV2LT5jb25uX2lkLCBhZGRyZXNzLCBmYWxzZSk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UoZGV2LT5jb25uX2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChhdXRvIGl0ID0gZGV2LT5wcm9maWxlX3F1ZXVlLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBkZXYtPnByb2ZpbGVfcXVldWUuZW5kKCk7KSB7Ci0gICAgICAgIGlmIChpdC0+dHlwZSA9PSBQcm9mbGVPUDo6Q09OTkVDVCkgewotICAgICAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoaXQtPmNsaWVudF9pZCk7Ci0gICAgICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICBkZXYtPmNvbm5lY3RlZF9jbGllbnRfbGlzdC5wdXNoX2JhY2soaXQtPmNsaWVudF9pZCk7Ci0gICAgICAgICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxpbmcgT25Db25uZWN0aW9uU3RhdGUiOwotICAgICAgICAgICAgY2FsbGJhY2stPk9uQ29ubmVjdGlvblN0YXRlKGFkZHJlc3MsIENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGV2LT5wcm9maWxlX3F1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpdCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXYtPnN0YXRlID0gRGV2U3RhdGU6OkNPTk5FQ1RFRDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uU2VydmljZUNoYW5nZUV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBQYWNzRGV2aWNlKiBkZXYgPSBwYWNzRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFNraXBwaW5nIHVua25vd24gZGV2aWNlOiAiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgZGV2LT5maXJzdF9jb25uZWN0aW9uID0gdHJ1ZTsKLSAgICBkZXYtPnNlcnZpY2VfY2hhbmdlZF9yY3ZkID0gdHJ1ZTsKLSAgICBHYXR0T3BzUXVldWU6OkNsZWFuKGRldi0+Y29ubl9pZCk7Ci0gIH0KLQotICB2b2lkIE9uU2VydmljZURpc2NEb25lRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIFBhY3NEZXZpY2UqIGRldiA9IHBhY3NEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2U6ICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBzZXJ2aWNlX2NoYW5nZWRfcmN2ZDogIgotICAgICAgICAgICAgICAgIDw8IGRldi0+c2VydmljZV9jaGFuZ2VkX3JjdmQ7Ci0gICAgaWYgKGRldi0+c2VydmljZV9jaGFuZ2VkX3JjdmQpIHsKLSAgICAgIC8vIHF1ZXVlIHRoZSByZXF1ZXN0IHRvIEdBVFQgcXVldWUgbW9kdWxlIHdpdGggZHVtbXUgY2xpZW50IGlkCi0gICAgICBHYXR0T3BzUXVldWU6OlNlcnZpY2VTZWFyY2goMFhGRiwgZGV2LT5jb25uX2lkLCAmUEFDU19VVUlEKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNzRGV2aWNlKiBkZXYsIHVpbnQxNl90IGNjY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gICAgaWYoaGFuZGxlICYmIGNjY19oYW5kbGUpIHsKLSAgICAgIC8qIFJlZ2lzdGVyIGFuZCBlbmFibGUgTm90aWZpY2F0aW9uICovCi0gICAgICB0R0FUVF9TVEFUVVMgcmVnaXN0ZXJfc3RhdHVzOwotICAgICAgcmVnaXN0ZXJfc3RhdHVzID0gQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKLSAgICAgICAgICBjb25uX2lkLCBkZXYtPmFkZHJlc3MsIGhhbmRsZSk7Ci0gICAgICBpZiAocmVnaXN0ZXJfc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogQlRBX0dBVFRDX1JlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyBmYWlsZWQsIHN0YXR1cz0iCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHJlZ2lzdGVyX3N0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSgyKTsKLSAgICAgIHVpbnQ4X3QqIHB0ciA9IHZhbHVlLmRhdGEoKTsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocHRyLCBHQVRUX0NIQVJfQ0xJRU5UX0NPTkZJR19OT1RJRklDQVRJT04pOwotICAgICAgR2F0dE9wc1F1ZXVlOjpXcml0ZURlc2NyaXB0b3IoCi0gICAgICAgICAgY2xpZW50X2lkLCBjb25uX2lkLCBjY2NfaGFuZGxlLAotICAgICAgICAgIHN0ZDo6bW92ZSh2YWx1ZSksIEdBVFRfV1JJVEUsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TZXJ2aWNlU2VhcmNoQ29tcGxldGUodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICAgIFBhY3NEZXZpY2UqIGRldiA9IHBhY3NEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLSAgICBpZiAoIWRldikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZCA9ICIKLSAgICAgICAgICAgICAgIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZCA9ICIgPDwgbG9naGV4KGNvbm5faWQpOwotCi0gICAgdWludDE2X3QgY2xpZW50X2lkID0gR2F0dE9wc1F1ZXVlOjpTZXJ2aWNlU2VhcmNoQ29tcGxldGUoY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGNsaWVudF9pZCA9ICIgPDwgbG9naGV4KGNsaWVudF9pZCk7Ci0gICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoY2xpZW50X2lkKTsKLSAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgLyogY2xvc2UgY29ubmVjdGlvbiBhbmQgcmVwb3J0IHNlcnZpY2UgZGlzY292ZXJ5IGNvbXBsZXRlIHdpdGggZXJyb3IgKi8KLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogU2VydmljZSBkaXNjb3ZlcnkgZmFpbGVkIjsKLSAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgY2FsbGJhY2stPk9uU2VhcmNoQ29tcGxldGUoRElTQ09WRVJfRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmNvbnNvbGlkYXRlZF9zaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmNvbnNvbGlkYXRlZF9zcmNfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c2lua19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3JjX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hdmFpbGFibGVfY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3VwcG9ydGVkX2NvbnRleHRzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxnYXR0OjpTZXJ2aWNlPiogc2VydmljZXMgPSBCVEFfR0FUVENfR2V0U2VydmljZXMoY29ubl9pZCk7Ci0KLSAgICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBzZXJ2aWNlID0gbnVsbHB0cjsKLSAgICBpZiAoc2VydmljZXMpIHsKLSAgICAgIGZvciAoY29uc3QgZ2F0dDo6U2VydmljZSYgdG1wIDogKnNlcnZpY2VzKSB7Ci0gICAgICAgIGlmICh0bXAudXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEZvdW5kIFVVSURfQ0xBU1NfR0FUVF9TRVJWRVIsIGhhbmRsZT0iCi0gICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleCh0bXAuaGFuZGxlKTsKLSAgICAgICAgICBjb25zdCBnYXR0OjpTZXJ2aWNlKiBzZXJ2aWNlX2NoYW5nZWRfc2VydmljZSA9ICZ0bXA7Ci0gICAgICAgICAgZmluZF9zZXJ2ZXJfY2hhbmdlZF9jY2NfaGFuZGxlKGNvbm5faWQsIHNlcnZpY2VfY2hhbmdlZF9zZXJ2aWNlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0bXAudXVpZCA9PSBQQUNTX1VVSUQpIHsKLSAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogRm91bmQgUEFDUyBzZXJ2aWNlLCBoYW5kbGU9IgotICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleCh0bXAuaGFuZGxlKTsKLSAgICAgICAgICBzZXJ2aWNlID0gJnRtcDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IG5vIHNlcnZpY2VzIGZvdW5kIGZvciBjb25uX2lkOiAiIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXNlcnZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm8gUEFDUyBzZXJ2aWNlIGZvdW5kIjsKLSAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgY2FsbGJhY2stPk9uU2VhcmNoQ29tcGxldGUoRElTQ09WRVJfRkFJTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmNvbnNvbGlkYXRlZF9zaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmNvbnNvbGlkYXRlZF9zcmNfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c2lua19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3JjX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hdmFpbGFibGVfY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3VwcG9ydGVkX2NvbnRleHRzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLT5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB1dWlkOiAiIDw8IGNoYXJhYy51dWlkOwotICAgICAgaWYgKGNoYXJhYy51dWlkID09IFBBQ1NfU0lOS19QQUNfVVVJRCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc2luayBwYWMgdXVpZCBmb3VuZC4gIjsKLQotICAgICAgICBTaW5rUGFjc0RhdGEgaW5mbzsKLSAgICAgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotICAgICAgICBpbmZvLnNpbmtfcGFjX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIGluZm8uc2lua19wYWNfY2NjX2hhbmRsZSA9IGZpbmRfY2NjX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgZGV2LT5zaW5rX2luZm8ucHVzaF9iYWNrKGluZm8pOwotICAgICAgICBkZXYtPmNoYXJzX3RvX2JlX3JlYWQgfD0gU0lOS19QQUM7Ci0gICAgICAgIEdhdHRPcHNRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgIFBhY3NDbGllbnRJbXBsOjpPblJlYWRPbmx5UHJvcGVydGllc1JlYWRTdGF0aWMsIG51bGxwdHIpOwotCi0gICAgICAgIGlmIChpbmZvLnNpbmtfcGFjX2NjY19oYW5kbGUpIHsKLSAgICAgICAgICBSZWdpc3RlckZvck5vdGlmaWNhdGlvbihjbGllbnRfaWQsIGNvbm5faWQsIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNpbmtfcGFjX2NjY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zaW5rX3BhY19oYW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSBpZiAoY2hhcmFjLnV1aWQgPT0gUEFDU19TSU5LX0xPQ19VVUlEKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzaW5rIGxvYyB1dWlkIGZvdW5kLiAiOwotICAgICAgICBkZXYtPnNpbmtfbG9jX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0KLSAgICAgICAgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICAgICAgIGNsaWVudF9pZCxjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlLAotICAgICAgICAgICAgICAgICBQYWNzQ2xpZW50SW1wbDo6T25SZWFkT25seVByb3BlcnRpZXNSZWFkU3RhdGljLCBudWxscHRyKTsKLQotICAgICAgICBkZXYtPnNpbmtfbG9jX2NjY19oYW5kbGUgPQotICAgICAgICAgICAgZmluZF9jY2NfaGFuZGxlKGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotCi0gICAgICAgIGRldi0+Y2hhcnNfdG9fYmVfcmVhZCB8PSBTSU5LX0xPQzsKLSAgICAgICAgaWYgKGRldi0+c2lua19sb2NfY2NjX2hhbmRsZSkgewotICAgICAgICAgIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uKGNsaWVudF9pZCwgY29ubl9pZCwgZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c2lua19sb2NfY2NjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPnNpbmtfbG9jX2hhbmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PSBQQUNTX1NSQ19QQUNfVVVJRCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3JjIHBhYyB1dWlkIGZvdW5kLiAiOwotCi0gICAgICAgIFNyY1BhY3NEYXRhIGluZm87Ci0gICAgICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgICAgICAgaW5mby5zcmNfcGFjX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0gICAgICAgIGluZm8uc3JjX3BhY19jY2NfaGFuZGxlID0gZmluZF9jY2NfaGFuZGxlKGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotICAgICAgICBkZXYtPnNyY19pbmZvLnB1c2hfYmFjayhpbmZvKTsKLSAgICAgICAgZGV2LT5jaGFyc190b19iZV9yZWFkIHw9IFNSQ19QQUM7Ci0gICAgICAgIEdhdHRPcHNRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgIFBhY3NDbGllbnRJbXBsOjpPblJlYWRPbmx5UHJvcGVydGllc1JlYWRTdGF0aWMsIG51bGxwdHIpOwotCi0gICAgICAgIGlmIChpbmZvLnNyY19wYWNfY2NjX2hhbmRsZSkgewotICAgICAgICAgIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uKGNsaWVudF9pZCwgY29ubl9pZCwgZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3JjX3BhY19jY2NfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3JjX3BhY19oYW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSBpZiAoY2hhcmFjLnV1aWQgPT0gUEFDU19TUkNfTE9DX1VVSUQpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNyYyBsb2MgdXVpZCBmb3VuZC4gIjsKLSAgICAgICAgZGV2LT5zcmNfbG9jX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0KLSAgICAgICAgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgUGFjc0NsaWVudEltcGw6Ok9uUmVhZE9ubHlQcm9wZXJ0aWVzUmVhZFN0YXRpYywgbnVsbHB0cik7Ci0KLSAgICAgICAgIGRldi0+c3JjX2xvY19jY2NfaGFuZGxlID0KLSAgICAgICAgICAgICBmaW5kX2NjY19oYW5kbGUoY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSk7Ci0gICAgICAgIGRldi0+Y2hhcnNfdG9fYmVfcmVhZCB8PSBTUkNfTE9DOwotICAgICAgICBpZiAoZGV2LT5zcmNfbG9jX2NjY19oYW5kbGUpIHsKLSAgICAgICAgICBSZWdpc3RlckZvck5vdGlmaWNhdGlvbihjbGllbnRfaWQsIGNvbm5faWQsIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPnNyY19sb2NfY2NjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPnNyY19sb2NfaGFuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICB9IGVsc2UgaWYgKGNoYXJhYy51dWlkID09IFBBQ1NfQVZBX0FVRElPX1VVSUQpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGF2YWxpYWJsZSBhdWRpbyB1dWlkIGZvdW5kLiAiOwotICAgICAgICBkZXYtPmF2YWlsX2NvbnRleHRzX2hhbmRsZSA9IGNoYXJhYy52YWx1ZV9oYW5kbGU7Ci0KLSAgICAgICAgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgUGFjc0NsaWVudEltcGw6Ok9uUmVhZE9ubHlQcm9wZXJ0aWVzUmVhZFN0YXRpYywgbnVsbHB0cik7Ci0KLSAgICAgICAgIGRldi0+YXZhaWxfY29udGV4dHNfY2NjX2hhbmRsZSA9Ci0gICAgICAgICAgICAgZmluZF9jY2NfaGFuZGxlKGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUpOwotICAgICAgICBkZXYtPmNoYXJzX3RvX2JlX3JlYWQgfD0gQVZBSUxfQ09OVEVYVFM7Ci0gICAgICAgIGlmIChkZXYtPmF2YWlsX2NvbnRleHRzX2NjY19oYW5kbGUpIHsKLSAgICAgICAgICBSZWdpc3RlckZvck5vdGlmaWNhdGlvbihjbGllbnRfaWQsIGNvbm5faWQsIGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmF2YWlsX2NvbnRleHRzX2NjY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hdmFpbF9jb250ZXh0c19oYW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSBpZiAoY2hhcmFjLnV1aWQgPT0gUEFDU19TVVBfQVVESU9fVVVJRCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3VwcG9ydGVkIGF1ZGlvIHV1aWQgZm91bmQuICI7Ci0gICAgICAgIGRldi0+c3VwcF9jb250ZXh0c19oYW5kbGUgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotCi0gICAgICAgIEdhdHRPcHNRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGNvbm5faWQsIGNoYXJhYy52YWx1ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgIFBhY3NDbGllbnRJbXBsOjpPblJlYWRPbmx5UHJvcGVydGllc1JlYWRTdGF0aWMsIG51bGxwdHIpOwotCi0gICAgICAgIGRldi0+c3VwcF9jb250ZXh0c19jY2NfaGFuZGxlID0KLSAgICAgICAgICAgIGZpbmRfY2NjX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgZGV2LT5jaGFyc190b19iZV9yZWFkIHw9IFNVUFBfQ09OVEVYVFM7Ci0gICAgICAgIGlmIChkZXYtPnN1cHBfY29udGV4dHNfY2NjX2hhbmRsZSkgewotICAgICAgICAgIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uKGNsaWVudF9pZCwgY29ubl9pZCwgZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3VwcF9jb250ZXh0c19jY2NfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3VwcF9jb250ZXh0c19oYW5kbGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmtub3duIGNoYXJhY3RlcmlzdGljIGZvdW5kOiIgPDwgY2hhcmFjLnV1aWQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZGV2LT5ub3RpZmljYXRpb25zX2VuYWJsZWQgPSB0cnVlOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgIDw8ICI6IHNlcnZpY2VfY2hhbmdlZF9yY3ZkOiAiIDw8IGRldi0+c2VydmljZV9jaGFuZ2VkX3JjdmQ7Ci0gICAgaWYgKGRldi0+c2VydmljZV9jaGFuZ2VkX3JjdmQpIHsKLSAgICAgIGRldi0+c2VydmljZV9jaGFuZ2VkX3JjdmQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uTm90aWZpY2F0aW9uRXZlbnQodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSkgewotCi0gICAgUGFjc0RldmljZSogZGV2ID0gcGFjc0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiOiBTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZDogIiA8PCBsb2doZXgoY29ubl9pZCk7Ci0KLSAgICBpZihkZXYtPmF2YWlsX2NvbnRleHRzX2hhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgIHVpbnQ4X3QqIHAgPSB2YWx1ZTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMzIoZGV2LT5hdmFpbGFibGVfY29udGV4dHMsIHApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25Db25nZXN0aW9uRXZlbnQodWludDE2X3QgY29ubl9pZCwgYm9vbCBjb25nZXN0ZWQpIHsKLSAgICBQYWNzRGV2aWNlKiBkZXYgPSBwYWNzRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgIDw8ICI6IFNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGNvbmdlc3RlZDogIiA8PCBjb25nZXN0ZWQ7Ci0gICAgZGV2LT5pc19jb25nZXN0ZWQgPSBjb25nZXN0ZWQ7Ci0gICAgR2F0dE9wc1F1ZXVlOjpDb25nZXN0aW9uQ2FsbGJhY2soY29ubl9pZCwgY29uZ2VzdGVkKTsKLSAgfQotCi0gIHZvaWQgT25SZWFkQXZhaWxhYmxlQXVkaW8odWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgICBQYWNzRGV2aWNlKiBkZXYgPSBwYWNzRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0gICAgaWYgKCFkZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5rbm93biBjb25uX2lkOiAiIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZDogIiA8PCBsb2doZXgoY29ubl9pZCk7Ci0KLSAgICBpZihkZXYtPmF2YWlsX2NvbnRleHRzX2hhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgIHVpbnQ4X3QqIHAgPSB2YWx1ZTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMzIoZGV2LT5hdmFpbGFibGVfY29udGV4dHMsIHApOwotICAgICAgLy8gY2hlY2sgaWYgYWxsIHBhY3MgY2hhcmFjdGVyaXN0aWNzIGFyZSByZWFkCi0gICAgICAvLyBzZW5kIG91dCB0aGUgY2FsbGJhY2sgYXMgc2VydmljZSBkaXNjb3ZlcnkgY29tcGxldGVkCi0gICAgICAvLyBnZXQgdGhlIGNhbGxiYWNrIGFuZCB1cGRhdGUgdGhlIHVwcGVyIGxheWVycwotICAgICAgYXV0byBpdGVyID0gY2FsbGJhY2tzLmZpbmQoY2xpZW50X2lkKTsKLSAgICAgIGlmIChpdGVyICE9IGNhbGxiYWNrcy5lbmQoKSkgewotICAgICAgICBQYWNzQ2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjayA9IGl0ZXItPnNlY29uZDsKLSAgICAgICAgY2FsbGJhY2stPk9uQXVkaW9Db250ZXh0QXZhaWxhYmxlKGRldi0+YWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YXZhaWxhYmxlX2NvbnRleHRzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBib29sIElzUmVjb3JkUmVhZGFibGUodWludDE2X3QgdG90YWxfbGVuLCB1aW50MTZfdCBwcm9jZXNzZWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVxX2xlbikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBwcm9jZXNzZWRfbGVuOiAiIDw8IGxvZ2hleChwcm9jZXNzZWRfbGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCByZXFfbGVuOiAiIDw8IGxvZ2hleChyZXFfbGVuKTsKLSAgICBpZigodG90YWxfbGVuID4gcHJvY2Vzc2VkX2xlbikgJiYKLSAgICAgICAoKHRvdGFsX2xlbiAtIHByb2Nlc3NlZF9sZW4pID49IHJlcV9sZW4pKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGJvb2wgSXNMdHZWYWxpZCh1aW50OF90IGx0dl90eXBlLCB1aW50MTZfdCBsdHZfbGVuKSB7Ci0gICAgYm9vbCB2YWxpZCA9IHRydWU7Ci0gICAgZm9yIChhdXRvIGl0IDogbHR2X2luZm8pIHsKLSAgICAgIGlmKGx0dl90eXBlID09IGl0LmZpcnN0ICYmCi0gICAgICAgICBsdHZfbGVuICE9IGl0LnNlY29uZCkgewotICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbGlkOwotICB9Ci0KLSAgdm9pZCBQYXJzZVBhY1JlY29yZCAoUGFjc0RldmljZSAqZGV2LCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHRvdGFsX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gcGFjX3JlY29yZHM7Ci0gICAgQ29kZWNJbmRleCBjb2RlY190eXBlOwotICAgIHVpbnQ4X3QgKnAgPSB2YWx1ZTsKLSAgICBjb2RlY190eXBlX3QgY29kZWNfaWQ7Ci0gICAgYm9vbCBzdG9wX3JlYWRpbmcgPSBmYWxzZTsKLSAgICB1aW50OF90IGNvZGVjX2NhcF9sZW47Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfY2FwczsKLSAgICB1aW50OF90IG1ldGFfZGF0YV9sZW47Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWV0YV9kYXRhOwotICAgIHVpbnQxNl90IHByb2Nlc3NlZF9sZW4gPSAwOwotICAgIHVpbnQ4X3QgbnVtX3BhY19yZWNzOwotICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZTsKLQotICAgIFNpbmtQYWNzRGF0YSogc2lua2luZm8gPSBGaW5kU2lua0J5SGFuZGxlKGRldiwgaGFuZGxlKTsKLSAgICBTcmNQYWNzRGF0YSogc3JjaW5mbyA9IEZpbmRTcmNCeUhhbmRsZShkZXYsIGhhbmRsZSk7Ci0KLSAgICAvLyBOdW1iZXJfb2ZfUEFDX3JlY29yZHMgaXMgMSBieXRlCi0gICAgaWYgKCF0b3RhbF9sZW4pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogemVybyBsZW4gcmVjb3JkLCB0b3RhbF9sZW46ICI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU1RSRUFNX1RPX1VJTlQ4KG51bV9wYWNfcmVjcywgcCk7Ci0gICAgcHJvY2Vzc2VkX2xlbiArKzsKLQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBudW1fcGFjX3JlY3M6ICIgPDwgbG9naGV4KG51bV9wYWNfcmVjcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgdG90YWxfbGVuOiAiIDw8IGxvZ2hleCh0b3RhbF9sZW4pOwotICAgIHdoaWxlICghc3RvcF9yZWFkaW5nICYmIG51bV9wYWNfcmVjcykgewotICAgICAgLy8gcmVzZXQgY29udGV4dCB0eXBlIGZvciBiZWZvcmUgcmVhZGluZyByZWNvcmQKLSAgICAgIGNvbnRleHRfdHlwZSA9IHVjYXN0OjpDT05URU5UX1RZUEVfVU5TUEVDSUZJRUQ7Ci0gICAgICAvLyByZWFkIHRoZSBjb21wbGV0ZSByZWNvcmQKLSAgICAgIC8vIGNvZGVjX2lkIGlzIG9mIDUgYnl0ZXMuCi0gICAgICBpZiAoIUlzUmVjb3JkUmVhZGFibGUodG90YWxfbGVuLCBwcm9jZXNzZWRfbGVuLCBzaXplb2YoY29kZWNfaWQpKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vdCB2YWxpZCBjb2RlYyBpZCwgQmFkIHBhY3MgcmVjb3JkLiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBTVFJFQU1fVE9fQVJSQVkoJmNvZGVjX2lkLCBwLCBzdGF0aWNfY2FzdDxpbnQ+IChzaXplb2YoY29kZWNfaWQpKSk7Ci0KLSAgICAgIHByb2Nlc3NlZF9sZW4gKz0gc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKGNvZGVjX2lkKSk7Ci0KLSAgICAgIGlmIChjb2RlY19pZFswXSA9PSBDT0RFQ19JRF9MQzMpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IExDMyBjb2RlYyAiOwotICAgICAgICBjb2RlY190eXBlID0gQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRPRE8gdG8gY2hlY2sgZm9yIHZlbmRvciBjb2RlY3MKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGNvZGVjX2NhcF9sZW4gaXMgb2YgMSBieXRlCi0gICAgICBpZiAoIUlzUmVjb3JkUmVhZGFibGUodG90YWxfbGVuLCBwcm9jZXNzZWRfbGVuLCAxKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vdCB2YWxpZCBjb2RlYyBpZCwgQmFkIHBhY3MgcmVjb3JkLiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBTVFJFQU1fVE9fVUlOVDgoY29kZWNfY2FwX2xlbiwgcCk7Ci0gICAgICBwcm9jZXNzZWRfbGVuICsrOwotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBjb2RlY19jYXBfbGVuOiAiIDw8IGxvZ2hleChjb2RlY19jYXBfbGVuKQotICAgICAgICAgICAgICAgICAgIDw8ICI6IHByb2Nlc3NlZF9sZW46ICIgPDwgIGxvZ2hleChwcm9jZXNzZWRfbGVuKTsKLQotICAgICAgaWYgKCFjb2RlY19jYXBfbGVuKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBJbnZhbGlkIGNvZGVjIGNhcCBsZW4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCFJc1JlY29yZFJlYWRhYmxlKHRvdGFsX2xlbiwgcHJvY2Vzc2VkX2xlbiwgY29kZWNfY2FwX2xlbikpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBub3QgZW5vdWdoIGRhdGEsIEJhZCBwYWNzIHJlY29yZC4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY29kZWNfY2Fwcy5yZXNpemUoY29kZWNfY2FwX2xlbik7Ci0gICAgICBTVFJFQU1fVE9fQVJSQVkoY29kZWNfY2Fwcy5kYXRhKCksIHAsIGNvZGVjX2NhcF9sZW4pOwotICAgICAgdWludDhfdCBsZW4gPSBjb2RlY19jYXBfbGVuOwotICAgICAgdWludDhfdCAqcHAgPSBjb2RlY19jYXBzLmRhdGEoKTsKLQotICAgICAgLy8gTm93IGxvb2sgZm9yIHN1cHBvcnRlZCBmcmVxIExUViBlbnRyeQotICAgICAgd2hpbGUgKGxlbikgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbGVuOiAiIDw8IGxvZ2hleChsZW4pOwotCi0gICAgICAgIGlmICghSXNSZWNvcmRSZWFkYWJsZSh0b3RhbF9sZW4sIHByb2Nlc3NlZF9sZW4sIDEpKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBub3QgZW5vdWdoIGRhdGEsIEJhZCBwYWNzIHJlY29yZC4iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgbHR2X2xlbiA9ICpwcCsrOwotICAgICAgICBsZW4tLTsKLSAgICAgICAgcHJvY2Vzc2VkX2xlbisrOwotCi0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBsdHZfbGVuOiAiIDw8IGxvZ2hleChsdHZfbGVuKTsKLSAgICAgICAgaWYgKCFsdHZfbGVuIHx8Ci0gICAgICAgICAgICAhSXNSZWNvcmRSZWFkYWJsZSh0b3RhbF9sZW4sIHByb2Nlc3NlZF9sZW4sIGx0dl9sZW4pKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBOb3QgdmFsaWQgbHR2IGxlbmd0aCI7Ci0gICAgICAgICAgc3RvcF9yZWFkaW5nID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NlZF9sZW4gKz0gbHR2X2xlbjsKLQotICAgICAgICAvLyBnZXQgdHlwZSBhbmQgdmFsdWUKLSAgICAgICAgdWludDhfdCBsdHZfdHlwZSA9ICpwcCsrOwotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbHR2X3R5cGU6ICIgPDwgbG9naGV4KGx0dl90eXBlKTsKLSAgICAgICAgaWYoIUlzTHR2VmFsaWQobHR2X3R5cGUsIGx0dl9sZW4pKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBObyBsdHYgdHlwZSB0byBsZW5ndGggbWF0Y2giOwotICAgICAgICAgIHN0b3BfcmVhZGluZyA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobHR2X3R5cGUgPT0gTFRWX1RZUEVfU1VQX0ZSRVFTKSB7Ci0gICAgICAgICAgdWludDE2X3Qgc3VwcF9mcmVxczsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHN1cHBfZnJlcXMsIHBwKTsKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3VwcF9mcmVxczogIiA8PCBzdXBwX2ZyZXFzOwotCi0gICAgICAgICAgZm9yIChhdXRvIGl0IDogZnJlcV9tYXApIHsKLSAgICAgICAgICAgIGlmKHN1cHBfZnJlcXMgJiBpdC5maXJzdCkgewotICAgICAgICAgICAgICBDb2RlY0NvbmZpZyBjb2RlY19jb25maWc7Ci0gICAgICAgICAgICAgIGNvZGVjX2NvbmZpZy5jb2RlY190eXBlID0gY29kZWNfdHlwZTsKLSAgICAgICAgICAgICAgY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gaXQuc2Vjb25kOwotICAgICAgICAgICAgICBwYWNfcmVjb3Jkcy5wdXNoX2JhY2soY29kZWNfY29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdWludDhfdCByZW1fbGVuID0gbHR2X2xlbiAtIDE7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHJlbV9sZW46ICIgPDwgbG9naGV4KHJlbV9sZW4pOwotICAgICAgICAgIHdoaWxlIChyZW1fbGVuLS0pIHsgcHArKzsgfTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW4gPj0gbHR2X2xlbikgewotICAgICAgICAgIGxlbiAtPSBsdHZfbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIndyb25nIGxlbiI7Ci0gICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RvcF9yZWFkaW5nOiAiIDw8IHN0b3BfcmVhZGluZzsKLSAgICAgIGlmIChzdG9wX3JlYWRpbmcpIGJyZWFrOwotCi0gICAgICAvLyBzZXQgdGhlIGRlZmF1bHQgY2hubCBjb3VudCB0byBtb25vIGFzIGl0IGlzIG9wdGlvbmFsCi0gICAgICBmb3IgKGF1dG8gaXQgPSBwYWNfcmVjb3Jkcy5iZWdpbigpOyBpdCAhPSBwYWNfcmVjb3Jkcy5lbmQoKTsgKytpdCkgewotICAgICAgICBpdC0+Y2hhbm5lbF9tb2RlID0gQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICB9Ci0KLSAgICAgIC8vIG5vdyBjaGVjayBmb3Igb3RoZXIgTFRWIHZhbHVlcwotICAgICAgbGVuID0gY29kZWNfY2FwX2xlbjsKLSAgICAgIHBwID0gY29kZWNfY2Fwcy5kYXRhKCk7Ci0gICAgICB3aGlsZSAobGVuKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgPDwgIjogY2hlY2tpbmcgb3RoZXIgTFRWIHZhbHVlcyxsZW46ICIgPDwgbG9naGV4KGxlbik7Ci0gICAgICAgIHVpbnQ4X3QgbHR2X2xlbiA9ICpwcCsrOwotICAgICAgICBsZW4tLTsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGx0dl9sZW46ICIgPDwgbG9naGV4KGx0dl9sZW4pOwotCi0gICAgICAgIC8vZ2V0IHR5cGUgYW5kIHZhbHVlCi0gICAgICAgIHVpbnQ4X3QgbHR2X3R5cGUgPSAqcHArKzsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGx0dl90eXBlOiAiIDw8IGxvZ2hleChsdHZfdHlwZSk7Ci0gICAgICAgIGlmKGx0dl90eXBlID09IExUVl9UWVBFX1NVUF9GUkFNRV9EVVIpIHsKLSAgICAgICAgICB1aW50OF90IHN1cHBfZnJhbWVzOwotICAgICAgICAgIFNUUkVBTV9UT19VSU5UOChzdXBwX2ZyYW1lcywgcHApOwotICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBwYWMgcmVjIGxlbjogIiA8PCBsb2doZXgocGFjX3JlY29yZHMuc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYWNfcmVjb3Jkcy5iZWdpbigpOyBpdCAhPSBwYWNfcmVjb3Jkcy5lbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0KSB7Ci0gICAgICAgICAgICBVcGRhdGVDYXBhU3VwRnJhbWVEdXJhdGlvbnMoJigqaXQpLCBzdXBwX2ZyYW1lcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGx0dl90eXBlID09IExUVl9UWVBFX0NITkxfQ09VTlRTKSB7Ci0gICAgICAgICAgdWludDhfdCBjaG5sX2FsbG9jYXRpb247Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNobmxfYWxsb2NhdGlvbiwgcHApOwotICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhY19yZWNvcmRzLmJlZ2luKCk7IGl0ICE9IHBhY19yZWNvcmRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBpdC0+Y2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNDaGFubmVsTW9kZT4gKGNobmxfYWxsb2NhdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGx0dl90eXBlID09IExUVl9UWVBFX09DVFNfUEVSX0ZSQU1FKSB7Ci0gICAgICAgICAgdWludDMyX3Qgb2N0c19wZXJfZnJhbWU7Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQzMihvY3RzX3Blcl9mcmFtZSwgcHApOwotICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhY19yZWNvcmRzLmJlZ2luKCk7IGl0ICE9IHBhY19yZWNvcmRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBVcGRhdGVDYXBhU3VwT2N0c1BlckZyYW1lKCYoKml0KSwgb2N0c19wZXJfZnJhbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsdHZfdHlwZSA9PSBMVFZfVFlQRV9NQVhfU1VQX0ZSQU1FU19QRVJfU0RVKSB7Ci0gICAgICAgICAgdWludDMyX3QgbWF4X3N1cF9mcmFtZXNfcGVyX3NkdTsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKG1heF9zdXBfZnJhbWVzX3Blcl9zZHUsIHBwKTsKLSAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYWNfcmVjb3Jkcy5iZWdpbigpOyBpdCAhPSBwYWNfcmVjb3Jkcy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgVXBkYXRlQ2FwYU1heFN1cExjM0ZyYW1lcygmKCppdCksIG1heF9zdXBfZnJhbWVzX3Blcl9zZHUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB1aW50OF90IHJlbV9sZW4gPSBsdHZfbGVuIC0gMTsKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogcmVtX2xlbjogIiA8PCBsb2doZXgocmVtX2xlbik7Ci0gICAgICAgICAgd2hpbGUgKHJlbV9sZW4tLSkgeyBwcCsrO307Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsZW4gPj0gbHR2X2xlbikgewotICAgICAgICAgIGxlbiAtPSBsdHZfbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogd3JvbmcgbGVuIjsKLSAgICAgICAgICBsZW4gPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vTWV0YSBkYXRhIGxlbmd0aCAxIGJ5dGUKLSAgICAgIGlmICghSXNSZWNvcmRSZWFkYWJsZSh0b3RhbF9sZW4sIHByb2Nlc3NlZF9sZW4sIDEpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm90IHZhbGlkIG1ldGEgZGF0YSBsZW4sIEJhZCBwYWNzIHJlY29yZC4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgU1RSRUFNX1RPX1VJTlQ4KG1ldGFfZGF0YV9sZW4sIHApOwotICAgICAgcHJvY2Vzc2VkX2xlbiArKzsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBtZXRhX2RhdGFfbGVuOiAiIDw8IGxvZ2hleChtZXRhX2RhdGFfbGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IHByb2Nlc3NlZF9sZW46ICIgPDwgbG9naGV4KHByb2Nlc3NlZF9sZW4pOwotCi0gICAgICBpZiAobWV0YV9kYXRhX2xlbikgewotICAgICAgICBpZiAoIUlzUmVjb3JkUmVhZGFibGUodG90YWxfbGVuLCBwcm9jZXNzZWRfbGVuLCBtZXRhX2RhdGFfbGVuKSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogbm90IGVub3VnaCBkYXRhLCBCYWQgcGFjcyByZWNvcmQuIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGFfZGF0YS5yZXNpemUobWV0YV9kYXRhX2xlbik7Ci0gICAgICAgIFNUUkVBTV9UT19BUlJBWShtZXRhX2RhdGEuZGF0YSgpLCBwLCBtZXRhX2RhdGFfbGVuKTsKLSAgICAgICAgdWludDhfdCBsZW4gPSBtZXRhX2RhdGFfbGVuOwotICAgICAgICB1aW50OF90ICpwcCA9IG1ldGFfZGF0YS5kYXRhKCk7Ci0KLSAgICAgICAgd2hpbGUgKGxlbikgewotICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBsZW46ICIgPDwgbG9naGV4KGxlbik7Ci0gICAgICAgICAgdWludDhfdCBsdHZfbGVuID0gKnBwKys7Ci0gICAgICAgICAgbGVuLS07Ci0gICAgICAgICAgcHJvY2Vzc2VkX2xlbisrOwotCi0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGx0dl9sZW46ICIgPDwgbG9naGV4KGx0dl9sZW4pOwotICAgICAgICAgIGlmICghbHR2X2xlbiB8fAotICAgICAgICAgICAgICAhSXNSZWNvcmRSZWFkYWJsZSh0b3RhbF9sZW4sIHByb2Nlc3NlZF9sZW4sIGx0dl9sZW4pKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vdCB2YWxpZCBsdHYgbGVuZ3RoIjsKLSAgICAgICAgICAgIHN0b3BfcmVhZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwcm9jZXNzZWRfbGVuICs9IGx0dl9sZW47Ci0KLSAgICAgICAgICAvLyBnZXQgdHlwZSBhbmQgdmFsdWUKLSAgICAgICAgICB1aW50OF90IGx0dl90eXBlID0gKnBwKys7Ci0KLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbHR2X3R5cGU6ICIgPDwgbG9naGV4KGx0dl90eXBlKTsKLQotICAgICAgICAgIGlmICghSXNMdHZWYWxpZChsdHZfdHlwZSwgbHR2X2xlbikpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm8gbHR2IHR5cGUgdG8gbGVuZ3RoIG1hdGNoIjsKLSAgICAgICAgICAgIHN0b3BfcmVhZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobHR2X3R5cGUgPT0gTFRWX1RZUEVfUFJFRl9BVURfQ09OVEVYVCkgewotICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjb250ZXh0X3R5cGUsIHBwKTsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IGx0dl9jb250ZXh0X3R5cGU6ICIgPDwgbG9naGV4KGNvbnRleHRfdHlwZSk7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhY19yZWNvcmRzLmJlZ2luKCk7IGl0ICE9IHBhY19yZWNvcmRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICBVcGRhdGVDYXBhUHJlZmVycmVkQ29udGV4dHMoJigqaXQpLCBjb250ZXh0X3R5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAobHR2X3R5cGUgPT0gTFRWX1RZUEVfVlNfTUVUQV9EQVRBKSB7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb21wYW55X2lkOwotICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjb21wYW55X2lkLCBwcCk7Ci0KLSAgICAgICAgICAgIC8vdG90YWwgdnMgbWV0YSBkYXRhIGxlbmd0aChtZXRhIGxlbmd0aCAtNCkgaW4gYnl0ZXMuCi0gICAgICAgICAgICB1aW50OF90IHRvdGFsX3ZlbmRvcl9sdHZfbGVuID0gbWV0YV9kYXRhX2xlbiAtIDQ7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiB0b3RhbF92ZW5kb3JfbHR2X2xlbjogIiA8PCBsb2doZXgodG90YWxfdmVuZG9yX2x0dl9sZW4pOwotCi0gICAgICAgICAgICBpZiAoY29tcGFueV9pZCA9PSBRVElfSUQpIHsKLSAgICAgICAgICAgICAgd2hpbGUgKHRvdGFsX3ZlbmRvcl9sdHZfbGVuKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCB2c19tZXRhX2RhdGFfbGVuID0gKnBwKys7Ci0gICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IHZzX21ldGFfZGF0YV9sZW46ICIgPDwgbG9naGV4KHZzX21ldGFfZGF0YV9sZW4pOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHR5cGUgYW5kIHZhbHVlCi0gICAgICAgICAgICAgICAgdWludDhfdCB2c19tZXRhX2RhdGFfdHlwZSA9ICpwcCsrOwotICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiB2c19tZXRhX2RhdGFfdHlwZTogIiA8PCBsb2doZXgodnNfbWV0YV9kYXRhX3R5cGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZzX21ldGFfZGF0YV90eXBlID09IExUVl9UWVBFX1ZTX01FVEFfREFUQV9MQzNRKSB7Ci0gICAgICAgICAgICAgICAgICB1aW50OF90IHZzX21ldGFfZGF0YV92YWx1ZVt2c19tZXRhX2RhdGFfbGVuIC0gMV07Ci0gICAgICAgICAgICAgICAgICBTVFJFQU1fVE9fQVJSQVkoJnZzX21ldGFfZGF0YV92YWx1ZSwgcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PiAoc2l6ZW9mKHZzX21ldGFfZGF0YV92YWx1ZSkpKTsKLQotICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFjX3JlY29yZHMuYmVnaW4oKTsgaXQgIT0gcGFjX3JlY29yZHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoJigqaXQpLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcigmKCppdCksIHZzX21ldGFfZGF0YV92YWx1ZVswXSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIC8vVE9ETyBjaGVjayBmb3Igb3RoZXIgbHR2cwotICAgICAgICAgICAgICAgICAgdWludDhfdCByZW1fbGVuID0gdnNfbWV0YV9kYXRhX2xlbiAtIDE7Ci0gICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogcmVtX2xlbjogIiA8PCBsb2doZXgocmVtX2xlbik7Ci0gICAgICAgICAgICAgICAgICB3aGlsZSAocmVtX2xlbi0tKSB7IHBwKys7fTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiA1Ynl0ZXMgKFZTIGxlbmd0aCBieXB0ZSArIE1ldGEgZGF0YXR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueSBJRCgyIGJ5dGVzKSArIExjM3EgbGVuZ3RoKSAqLwotICAgICAgICAgICAgICAgIGlmKHRvdGFsX3ZlbmRvcl9sdHZfbGVuID49ICh2c19tZXRhX2RhdGFfbGVuICsgNSkpIHsKLSAgICAgICAgICAgICAgICAgIHRvdGFsX3ZlbmRvcl9sdHZfbGVuIC09ICh2c19tZXRhX2RhdGFfbGVuICsgNSk7Ci0gICAgICAgICAgICAgICAgICBsZW4gPSB0b3RhbF92ZW5kb3JfbHR2X2xlbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB3cm9uZyBsZW4uIjsKLSAgICAgICAgICAgICAgICAgIHRvdGFsX3ZlbmRvcl9sdHZfbGVuID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIC8vVE9ETyBjaGVjayBmb3Igb3RoZXIgY29tYW55IElEcwotICAgICAgICAgICAgICB1aW50OF90IHJlbV9sZW4gPSB0b3RhbF92ZW5kb3JfbHR2X2xlbiAtIDE7Ci0gICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiByZW1fbGVuOiAiIDw8IGxvZ2hleChyZW1fbGVuKTsKLSAgICAgICAgICAgICAgd2hpbGUgKHJlbV9sZW4tLSkgeyBwcCsrO307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgcmVtX2xlbiA9IGx0dl9sZW4gLSAxOwotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHJlbV9sZW46ICIgPDwgbG9naGV4KHJlbV9sZW4pOwotICAgICAgICAgICAgd2hpbGUgKHJlbV9sZW4tLSkgeyBwcCsrO307Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGxlbiA+PSBsdHZfbGVuKSB7Ci0gICAgICAgICAgICBsZW4gLT0gbHR2X2xlbjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB3cm9uZyBsZW4iOwotICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHNpbmtpbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gTm93IHVwZGF0ZSBhbGwgcmVjb3JkcyB0byBjb25mIGZpbGUKLSAgICAgICAgd2hpbGUgKCFwYWNfcmVjb3Jkcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgQ29kZWNDb25maWcgcmVjb3JkID0gcGFjX3JlY29yZHMuYmFjaygpOwotICAgICAgICAgIHNpbmtpbmZvLT5zaW5rX3BhY19yZWNvcmRzLnB1c2hfYmFjayhyZWNvcmQpOwotICAgICAgICAgIHBhY19yZWNvcmRzLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgYnRpZl9iYXBfYWRkX3JlY29yZChkZXYtPmFkZHJlc3MsIFJFQ19UWVBFX0NBUEFCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3R5cGUsIENvZGVjRGlyZWN0aW9uOjpDT0RFQ19ESVJfU0lOSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNvcmQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHNyY2luZm8gIT0gbnVsbHB0cikgewotICAgICAgICAvLyBOb3cgdXBkYXRlIGFsbCByZWNvcmRzIHRvIGNvbmYgZmlsZQotICAgICAgICB3aGlsZSAoIXBhY19yZWNvcmRzLmVtcHR5KCkpIHsKLSAgICAgICAgICBDb2RlY0NvbmZpZyByZWNvcmQgPSBwYWNfcmVjb3Jkcy5iYWNrKCk7Ci0gICAgICAgICAgc3JjaW5mby0+c3JjX3BhY19yZWNvcmRzLnB1c2hfYmFjayhyZWNvcmQpOwotICAgICAgICAgIHBhY19yZWNvcmRzLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgYnRpZl9iYXBfYWRkX3JlY29yZChkZXYtPmFkZHJlc3MsIFJFQ19UWVBFX0NBUEFCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3R5cGUsIENvZGVjRGlyZWN0aW9uOjpDT0RFQ19ESVJfU1JDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY29yZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG51bV9wYWNfcmVjcy0tOwotICAgIH0KLQotICAgIGlmIChzaW5raW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICBzaW5raW5mby0+cmVhZF9zaW5rX3BhY19yZWNvcmQgPSB0cnVlOwotICAgICAgYm9vbCBhbGxfc2lua19wYWNzX3JlYWQgPSBmYWxzZTsKLSAgICAgIGZvciAoYXV0byBpdCA9IGRldi0+c2lua19pbmZvLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGRldi0+c2lua19pbmZvLmVuZCgpOyBpdCArKykgewotICAgICAgICBpZiAoaXQtPnJlYWRfc2lua19wYWNfcmVjb3JkID09IHRydWUpIHsKLSAgICAgICAgICBhbGxfc2lua19wYWNzX3JlYWQgPSB0cnVlOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFsbF9zaW5rX3BhY3NfcmVhZCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IGFsbF9zaW5rX3BhY3NfcmVhZDogIiA8PCBhbGxfc2lua19wYWNzX3JlYWQ7Ci0gICAgICBpZiAoYWxsX3NpbmtfcGFjc19yZWFkKQotICAgICAgICBkZXYtPmNoYXJzX3JlYWQgfD0gU0lOS19QQUM7Ci0KLSAgICB9IGVsc2UgaWYgKHNyY2luZm8gIT0gbnVsbHB0cikgewotICAgICAgc3JjaW5mby0+cmVhZF9zcmNfcGFjX3JlY29yZCA9IHRydWU7Ci0gICAgICBib29sIGFsbF9zb3VyY2VfcGFjc19yZWFkID0gZmFsc2U7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnNyY19pbmZvLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGRldi0+c3JjX2luZm8uZW5kKCk7IGl0ICsrKSB7Ci0gICAgICAgIGlmIChpdC0+cmVhZF9zcmNfcGFjX3JlY29yZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgYWxsX3NvdXJjZV9wYWNzX3JlYWQgPSB0cnVlOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFsbF9zb3VyY2VfcGFjc19yZWFkID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogYWxsX3NvdXJjZV9wYWNzX3JlYWQ6ICIgPDwgYWxsX3NvdXJjZV9wYWNzX3JlYWQ7Ci0gICAgICBpZiAoYWxsX3NvdXJjZV9wYWNzX3JlYWQpCi0gICAgICAgIGRldi0+Y2hhcnNfcmVhZCB8PSBTUkNfUEFDOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25SZWFkT25seVByb3BlcnRpZXNSZWFkKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QgKnZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgUGFjc0RldmljZSogZGV2ID0gcGFjc0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJ1bmtub3duIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFNpbmtQYWNzRGF0YSogc2lua2luZm8gPSBGaW5kU2lua0J5SGFuZGxlKGRldiwgaGFuZGxlKTsKLSAgICBTcmNQYWNzRGF0YSogc3JjaW5mbyA9IEZpbmRTcmNCeUhhbmRsZShkZXYsIGhhbmRsZSk7Ci0KLSAgICBpZiAoc2lua2luZm8gIT0gbnVsbHB0ciB8fCBzcmNpbmZvICE9IG51bGxwdHIpIHsKLSAgICAgIFBhcnNlUGFjUmVjb3JkKGRldiwgaGFuZGxlLCBsZW4sIHZhbHVlLCBkYXRhKTsKLQotICAgIH0gZWxzZSBpZiAoZGV2LT5zaW5rX2xvY19oYW5kbGUgPT0gaGFuZGxlKSB7Ci0gICAgICB1aW50OF90ICpwID0gdmFsdWU7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDMyKGRldi0+c2lua19sb2NhdGlvbnMsIHApOwotICAgICAgZGV2LT5jaGFyc19yZWFkIHw9IFNJTktfTE9DOwotICAgICAgYnRpZl9iYXBfYWRkX2F1ZGlvX2xvYyhkZXYtPmFkZHJlc3MsIENvZGVjRGlyZWN0aW9uOjpDT0RFQ19ESVJfU0lOSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zaW5rX2xvY2F0aW9ucyk7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IHNpbmsgbG9jOiAiIDw8IGxvZ2hleChkZXYtPnNpbmtfbG9jYXRpb25zKTsKLQotICAgIH0gZWxzZSBpZihkZXYtPnNyY19sb2NfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgdWludDhfdCAqcCA9IHZhbHVlOwotICAgICAgU1RSRUFNX1RPX1VJTlQzMihkZXYtPnNyY19sb2NhdGlvbnMsIHApOwotICAgICAgZGV2LT5jaGFyc19yZWFkIHw9IFNSQ19MT0M7Ci0gICAgICBidGlmX2JhcF9hZGRfYXVkaW9fbG9jKGRldi0+YWRkcmVzcywgQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3JjX2xvY2F0aW9ucyk7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IHNyYyBsb2M6ICIgPDwgbG9naGV4KGRldi0+c3JjX2xvY2F0aW9ucyk7Ci0KLSAgICB9IGVsc2UgaWYoZGV2LT5hdmFpbF9jb250ZXh0c19oYW5kbGUgPT0gaGFuZGxlKSB7Ci0gICAgICB1aW50OF90KiBwID0gdmFsdWU7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDMyKGRldi0+YXZhaWxhYmxlX2NvbnRleHRzLCBwKTsKLSAgICAgIGRldi0+Y2hhcnNfcmVhZCB8PSBBVkFJTF9DT05URVhUUzsKLQotICAgIH0gZWxzZSBpZihkZXYtPnN1cHBfY29udGV4dHNfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgdWludDhfdCogcCA9IHZhbHVlOwotICAgICAgU1RSRUFNX1RPX1VJTlQzMihkZXYtPnN1cHBvcnRlZF9jb250ZXh0cywgcCk7Ci0gICAgICBkZXYtPmNoYXJzX3JlYWQgfD0gU1VQUF9DT05URVhUUzsKLSAgICAgIGJ0aWZfYmFwX2FkZF9zdXBwX2NvbnRleHRzKGRldi0+YWRkcmVzcywgZGV2LT5zdXBwb3J0ZWRfY29udGV4dHMpOwotICAgIH0KLQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBjaGFyc19yZWFkOiAiIDw8IGxvZ2hleChkZXYtPmNoYXJzX3JlYWQpOwotCi0gICAgLy8gY2hlY2sgaWYgYWxsIHBhY3MgY2hhcmFjdGVyaXN0aWNzIGFyZSByZWFkCi0gICAgLy8gc2VuZCBvdXQgdGhlIGNhbGxiYWNrIGFzIHNlcnZpY2UgZGlzY292ZXJ5IGNvbXBsZXRlZAotICAgIGlmIChkZXYtPmNoYXJzX3JlYWQgPT0gZGV2LT5jaGFyc190b19iZV9yZWFkKSB7Ci0KLSAgICAgIFVwZGF0ZUNvbnNvbGlkYXRlZHNpbmtQYWNSZWNvcmRzKGRldik7Ci0gICAgICBVcGRhdGVDb25zb2xpZGF0ZWRzcmNQYWNSZWNvcmRzKGRldik7Ci0KLSAgICAgIC8vIGdldCB0aGUgY2FsbGJhY2sgYW5kIHVwZGF0ZSB0aGUgdXBwZXIgbGF5ZXJzCi0gICAgICBhdXRvIGl0ZXIgPSBjYWxsYmFja3MuZmluZChjbGllbnRfaWQpOwotICAgICAgaWYgKGl0ZXIgIT0gY2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgIGRldi0+ZGlzY292ZXJ5X2NvbXBsZXRlZCA9IHRydWU7Ci0gICAgICAgIFBhY3NDbGllbnRDYWxsYmFja3MgKmNhbGxiYWNrID0gaXRlci0+c2Vjb25kOwotICAgICAgICBjYWxsYmFjay0+T25TZWFyY2hDb21wbGV0ZShESVNDT1ZFUl9TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+Y29uc29saWRhdGVkX3NpbmtfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+Y29uc29saWRhdGVkX3NyY19wYWNfcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zaW5rX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmF2YWlsYWJsZV9jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zdXBwb3J0ZWRfY29udGV4dHMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uUmVhZE9ubHlQcm9wZXJ0aWVzUmVhZFN0YXRpYyh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgICBpZiAoaW5zdGFuY2UpCi0gICAgICBpbnN0YW5jZS0+T25SZWFkT25seVByb3BlcnRpZXNSZWFkKGNsaWVudF9pZCwgY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgdmFsdWUsIGRhdGEpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgT25SZWFkQXZhaWxhYmxlQXVkaW9TdGF0aWModWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgaWYgKGluc3RhbmNlKQotICAgICAgaW5zdGFuY2UtPk9uUmVhZEF2YWlsYWJsZUF1ZGlvKGNsaWVudF9pZCwgY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCB2YWx1ZSwgZGF0YSk7Ci0gIH0KLQotCi0gcHJpdmF0ZToKLSAgdWludDhfdCBnYXR0X2NsaWVudF9pZCA9IEJUQV9HQVRUU19JTlZBTElEX0lGOwotICB1aW50MTZfdCBwYWNzX2NsaWVudF9pZCA9IDA7Ci0gIFBhY3NEZXZpY2VzIHBhY3NEZXZpY2VzOwotICAvLyBjbGllbnQgaWQgdG8gY2FsbGJhY2tzIG1hcHBpbmcKLSAgc3RkOjptYXA8dWludDE2X3QsIFBhY3NDbGllbnRDYWxsYmFja3MgKj4gY2FsbGJhY2tzOwotCi0gIHZvaWQgZmluZF9zZXJ2ZXJfY2hhbmdlZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UqIHNlcnZpY2UpIHsKLSAgICBQYWNzRGV2aWNlKiBwYWNzRGV2aWNlID0gcGFjc0RldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghcGFjc0RldmljZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogU2tpcHBpbmcgdW5rbm93biBkZXZpY2UsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcykgewotICAgICAgaWYgKGNoYXJhYy51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfR0FUVF9TUlZfQ0hHRCkpIHsKLSAgICAgICAgcGFjc0RldmljZS0+c3J2X2NoYW5nZWRfY2NjX2hhbmRsZSA9Ci0gICAgICAgICAgICBmaW5kX2NjY19oYW5kbGUoY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSk7Ci0gICAgICAgIGlmICghcGFjc0RldmljZS0+c3J2X2NoYW5nZWRfY2NjX2hhbmRsZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IGNhbm5vdCBmaW5kIHNlcnZpY2UgY2hhbmdlZCBDQ0MgZGVzY3JpcHRvciI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlcnZpY2VfY2hhbmdlZF9jY2M9IgotICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHBhY3NEZXZpY2UtPnNydl9jaGFuZ2VkX2NjY19oYW5kbGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBGaW5kIHRoZSBoYW5kbGUgZm9yIHRoZSBjbGllbnQgY2hhcmFjdGVyaXN0aWNzIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbgotICAvLyBjaGFyYWN0ZXJpc3RpY3MKLSAgdWludDE2X3QgZmluZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNoYXJfaGFuZGxlKSB7Ci0gICAgY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIHBfY2hhciA9Ci0gICAgICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhjb25uX2lkLCBjaGFyX2hhbmRsZSk7Ci0KLSAgICBpZiAoIXBfY2hhcikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IE5vIHN1Y2ggY2hhcmFjdGVyaXN0aWM6ICIgPDwgY2hhcl9oYW5kbGU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGdhdHQ6OkRlc2NyaXB0b3ImIGRlc2MgOiBwX2NoYXItPmRlc2NyaXB0b3JzKSB7Ci0gICAgICBpZiAoZGVzYy51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSkKLSAgICAgICAgcmV0dXJuIGRlc2MuaGFuZGxlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgU2lua1BhY3NEYXRhICpGaW5kU2lua0J5SGFuZGxlKFBhY3NEZXZpY2UgKmRldiwgdWludDE2X3QgaGFuZGxlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGhhbmRsZToiIDw8IGxvZ2hleChoYW5kbGUpOwotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPnNpbmtfaW5mby5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPnNpbmtfaW5mby5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJmhhbmRsZV0oU2lua1BhY3NEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGF0YS5zaW5rX3BhY19oYW5kbGUgPT0gaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXYtPnNpbmtfaW5mby5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBTcmNQYWNzRGF0YSAqRmluZFNyY0J5SGFuZGxlKFBhY3NEZXZpY2UgKmRldiwgdWludDE2X3QgaGFuZGxlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGhhbmRsZToiIDw8IGxvZ2hleChoYW5kbGUpOwotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXYtPnNyY19pbmZvLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c3JjX2luZm8uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgWyZoYW5kbGVdKFNyY1BhY3NEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGF0YS5zcmNfcGFjX2hhbmRsZSA9PSBoYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgcmV0dXJuIChpdGVyID09IGRldi0+c3JjX2luZm8uZW5kKCkpID8gbnVsbHB0ciA6ICYoKml0ZXIpOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVDb25zb2xpZGF0ZWRzaW5rUGFjUmVjb3JkcyhQYWNzRGV2aWNlICpkZXYpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2LT5zaW5rX2luZm8uYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gZGV2LT5zaW5rX2luZm8uZW5kKCk7IGl0ICsrKSB7Ci0gICAgICBmb3IgKGF1dG8gaSA9IGl0LT5zaW5rX3BhY19yZWNvcmRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIGkgIT0gaXQtPnNpbmtfcGFjX3JlY29yZHMuZW5kKCk7IGkgKyspIHsKLSAgICAgICAgZGV2LT5jb25zb2xpZGF0ZWRfc2lua19wYWNfcmVjb3Jkcy4KLSAgICAgICAgICAgICBwdXNoX2JhY2soc3RhdGljX2Nhc3Q8Q29kZWNDb25maWc+KCppKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBVcGRhdGVDb25zb2xpZGF0ZWRzcmNQYWNSZWNvcmRzKFBhY3NEZXZpY2UgKmRldikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICBmb3IgKGF1dG8gaXQgPSBkZXYtPnNyY19pbmZvLmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGl0ICE9IGRldi0+c3JjX2luZm8uZW5kKCk7IGl0ICsrKSB7Ci0gICAgICBmb3IgKGF1dG8gaSA9IGl0LT5zcmNfcGFjX3JlY29yZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICBpICE9IGl0LT5zcmNfcGFjX3JlY29yZHMuZW5kKCk7IGkgKyspIHsKLSAgICAgICAgZGV2LT5jb25zb2xpZGF0ZWRfc3JjX3BhY19yZWNvcmRzLgotICAgICAgICAgICAgIHB1c2hfYmFjayhzdGF0aWNfY2FzdDxDb2RlY0NvbmZpZz4oKmkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IGNoYXIqIGdldF9nYXR0X2V2ZW50X25hbWUodWludDMyX3QgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfREVSRUdfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19TRUFSQ0hfQ01QTF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19OT1RJRl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19DT05OX1VQREFURV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19TUlZDX0NIR19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19TUlZDX0RJU0NfRE9ORV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19DT05HRVNUX0VWVCkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIEV2ZW50IjsKLSAgfQotfQotCi12b2lkIHBhY3NfZ2F0dGNfY2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICBpZiAocF9kYXRhID09IG51bGxwdHIgfHwgIWluc3RhbmNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwX2RhdGEgaXMgbnVsbCBvciBubyBpbnN0YW5jZSwgcmV0dXJuIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEV2ZW50IDogIiA8PCBnZXRfZ2F0dF9ldmVudF9uYW1lKGV2ZW50KTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfR0FUVENfREVSRUdfRVZUOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19PUEVOX0VWVDogewotICAgICAgdEJUQV9HQVRUQ19PUEVOJiBvID0gcF9kYXRhLT5vcGVuOwotICAgICAgaW5zdGFuY2UtPk9uR2F0dENvbm5lY3RlZChvLnN0YXR1cywgby5jb25uX2lkLCBvLmNsaWVudF9pZiwgby5yZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnRyYW5zcG9ydCwgby5tdHUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVENfQ0xPU0VfRVZUOiB7Ci0gICAgICB0QlRBX0dBVFRDX0NMT1NFJiBjID0gcF9kYXRhLT5jbG9zZTsKLSAgICAgIGluc3RhbmNlLT5PbkdhdHREaXNjb25uZWN0ZWQoYy5zdGF0dXMsIGMuY29ubl9pZCwgYy5jbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucmVtb3RlX2JkYSwgYy5yZWFzb24pOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TRUFSQ0hfQ01QTF9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+T25TZXJ2aWNlU2VhcmNoQ29tcGxldGUocF9kYXRhLT5zZWFyY2hfY21wbC5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+c2VhcmNoX2NtcGwuc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfTk9USUZfRVZUOgotICAgICAgaWYgKCFwX2RhdGEtPm5vdGlmeS5pc19ub3RpZnkgfHwgcF9kYXRhLT5ub3RpZnkubGVuID4gR0FUVF9NQVhfQVRUUl9MRU4pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiByZWplY3RlZCBCVEFfR0FUVENfTk9USUZfRVZULiBpc19ub3RpZnk9IgotICAgICAgICAgICAgICAgICAgIDw8IHBfZGF0YS0+bm90aWZ5LmlzX25vdGlmeQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGxlbj0iIDw8IHBfZGF0YS0+bm90aWZ5LmxlbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpbnN0YW5jZS0+T25Ob3RpZmljYXRpb25FdmVudChwX2RhdGEtPm5vdGlmeS5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5ub3RpZnkuaGFuZGxlLCBwX2RhdGEtPm5vdGlmeS5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm5vdGlmeS52YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0VOQ19DTVBMX0NCX0VWVDoKLSAgICAgIGluc3RhbmNlLT5PbkVuY3J5cHRpb25Db21wbGV0ZShwX2RhdGEtPmVuY19jbXBsLnJlbW90ZV9iZGEsIHRydWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19DT05OX1VQREFURV9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+T25Db25uZWN0aW9uVXBkYXRlQ29tcGxldGUocF9kYXRhLT5jb25uX3VwZGF0ZS5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfQ0hHX0VWVDoKLSAgICAgIGluc3RhbmNlLT5PblNlcnZpY2VDaGFuZ2VFdmVudChwX2RhdGEtPnJlbW90ZV9iZGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TUlZDX0RJU0NfRE9ORV9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+T25TZXJ2aWNlRGlzY0RvbmVFdmVudChwX2RhdGEtPnJlbW90ZV9iZGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFfR0FUVENfQ09OR0VTVF9FVlQ6Ci0gICAgICBpbnN0YW5jZS0+T25Db25nZXN0aW9uRXZlbnQocF9kYXRhLT5jb25nZXN0LmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5jb25nZXN0LmNvbmdlc3RlZCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBlbmNyeXB0aW9uX2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsIHRHQVRUX1RSQU5TUE9SVCwgdm9pZCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgc3RhdHVzKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5PbkVuY3J5cHRpb25Db21wbGV0ZSgqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IEJUTV9TVUNDRVNTID8gdHJ1ZSA6IGZhbHNlKTsKLSAgfQotfQotCi12b2lkIFBhY3NDbGllbnQ6OkluaXRpYWxpemUoUGFjc0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5SZWdpc3RlcihjYWxsYmFja3MpOwotICB9IGVsc2UgewotICAgIGluc3RhbmNlID0gbmV3IFBhY3NDbGllbnRJbXBsKCk7Ci0gICAgaW5zdGFuY2UtPlJlZ2lzdGVyKGNhbGxiYWNrcyk7Ci0gIH0KLX0KLQotdm9pZCBQYWNzQ2xpZW50OjpDbGVhblVwKHVpbnQxNl90IGNsaWVudF9pZCkgewotICBpZihpbnN0YW5jZS0+R2V0Q2xpZW50Q291bnQoKSkgewotICAgIGluc3RhbmNlLT5EZXJlZ2lzdGVyKGNsaWVudF9pZCk7Ci0gICAgaWYoIWluc3RhbmNlLT5HZXRDbGllbnRDb3VudCgpKSB7Ci0gICAgICBkZWxldGUgaW5zdGFuY2U7Ci0gICAgICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci19Ci0KLVBhY3NDbGllbnQqIFBhY3NDbGllbnQ6OkdldCgpIHsKLSAgQ0hFQ0soaW5zdGFuY2UpOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwYWNzCi19ICAvLyBuYW1lc3BhY2UgYmFwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2FzdF9jbGllbnRfaW50LmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2FzdF9jbGllbnRfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTM1ZmEuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvdWNhc3RfY2xpZW50X2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInN0YXRlX21hY2hpbmUuaCIKLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgImJ0YV9iYXBfdWNsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidGFfcGFjc19jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2FzY3NfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jaW5jbHVkZSAidWNsaWVudF9hbGFybS5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIHVjYXN0IHsKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkdhdHRTdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2NzQ2xpZW50OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZVBhcmFtczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VDb2RlY0NvbmZpZ1BhcmFtczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VDb2RlY0NvbmZpZ09wOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmNpczo6Q2lzSW50ZXJmYWNlOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6Y2lzOjpDaWdTdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpjaXM6OkNpc1N0YXRlOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6YWxhcm06OkJhcEFsYXJtOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFsYXJtOjpCYXBBbGFybUNhbGxiYWNrczsKLQotY2xhc3MgVXN0cmVhbU1hbmFnZXI7Ci1jbGFzcyBVc3RyZWFtTWFuYWdlcnM7Ci1zdHJ1Y3QgVWNhc3RBdWRpb1N0cmVhbTsKLWNsYXNzIFVjYXN0QXVkaW9TdHJlYW1zOwotY2xhc3MgU3RyZWFtQ29udGV4dHM7Ci1zdHJ1Y3QgU3RyZWFtQ29udGV4dDsKLWNsYXNzIFN0cmVhbVRyYWNrZXI7Ci0KLWVudW0gY2xhc3MgU3RyZWFtQXR0YWNoZWRTdGF0ZSB7Ci0gIElETEUgICAgICAgID0gMHgxIDw8IDAsCi0gIElETEVfVE9fUEhZID0gMHgxIDw8IDEsCi0gIFZJUlRVQUwgICAgID0gMHgxIDw8IDIsCi0gIFZJUl9UT19QSFkgID0gMHgxIDw8IDMsCi0gIFBIWVNJQ0FMICAgID0gMHgxIDw8IDQKLX07Ci0KLWVudW0gY2xhc3MgU3RyZWFtQ29udHJvbFR5cGUgewotICBOb25lICAgICAgICAgPSAweDAwLAotICBDb25uZWN0ICAgICAgPSAwWDAxLAotICBEaXNjb25uZWN0ICAgPSAweDAyLAotICBTdGFydCAgICAgICAgPSAweDA0LAotICBTdG9wICAgICAgICAgPSAweDA4LAotICBSZWNvbmZpZyAgICAgPSAweDEwLAotICBVcGRhdGVTdHJlYW0gPSAweDIwCi19OwotCi1lbnVtIGNsYXNzIERldmljZVR5cGUgewotICBOT05FICAgICAgICAgICAgICAgICAgPSAweDAwLAotICBFQVJCVUQgICAgICAgICAgICAgICAgPSAwWDAxLCAgLy8gZ3JvdXAgbWVtYmVyCi0gIEhFQURTRVRfU1RFUkVPICAgICAgICA9IDB4MDIsICAvLyBoZWFkc2V0IHdpdGggMSBDSVMKLSAgSEVBRFNFVF9TUExJVF9TVEVSRU8gID0gMHgwMyAgIC8vIGhlYWRzZXQgd2l0aCAyIENJUwotfTsKLQotZW51bSBjbGFzcyBJbnRDb25uZWN0U3RhdGUgewotICBJRExFICAgICAgICAgICAgID0gMHgwMCwKLSAgUEFDU19DT05ORUNUSU5HICA9IDB4MDEsCi0gIFBBQ1NfRElTQ09WRVJJTkcgPSAwWDAyLAotICBBU0NTX0NPTk5FQ1RJTkcgID0gMHgwMywKLSAgQVNDU19ESVNDT1ZFUklORyA9IDB4MDQsCi0gIEFTQ1NfRElTQ09WRVJFRCAgPSAweDA1LAotfTsKLQotZW51bSBjbGFzcyBBc2NzUGVuZGluZ0NtZCB7Ci0gIE5PTkUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwLAotICBDT0RFQ19DT05GSUdfSVNTVUVEICAgICAgID0gMHgwMSwKLSAgUU9TX0NPTkZJR19JU1NVRUQgICAgICAgICA9IDB4MDIsCi0gIEVOQUJMRV9JU1NVRUQgICAgICAgICAgICAgPSAweDAzLAotICBTVEFSVF9SRUFEWV9JU1NVRUQgICAgICAgID0gMHgwNCwKLSAgRElTQUJMRV9JU1NVRUQgICAgICAgICAgICA9IDB4MDUsCi0gIFNUT1BfUkVBRFlfSVNTVUVEICAgICAgICAgPSAweDA2LAotICBSRUxFQVNFX0lTU1VFRCAgICAgICAgICAgID0gMHgwNywKLSAgVVBEQVRFX01FVEFEQVRBX0lTU1VFRCAgICA9IDB4MDgKLX07Ci0KLWVudW0gY2xhc3MgQ2lzUGVuZGluZ0NtZCB7Ci0gIE5PTkUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwLAotICBDSUdfQ1JFQVRFX0lTU1VFRCAgICAgICAgID0gMHgwOCwKLSAgQ0lTX0NSRUFURV9JU1NVRUQgICAgICAgICA9IDB4MDksCi0gIENJU19TRVRVUF9EQVRBUEFUSF9JU1NVRUQgPSAweDEwLAotICBDSVNfUk1WX0RBVEFQQVRIX0lTU1VFRCAgID0gMHgxMSwKLSAgQ0lTX0RFU1RST1lfSVNTVUVEICAgICAgICA9IDB4MTIsCi0gIENJR19SRU1PVkVfSVNTVUVEICAgICAgICAgPSAweDEzCi19OwotCi1lbnVtIGNsYXNzIEdhdHRQZW5kaW5nQ21kIHsKLSAgTk9ORSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAsCi0gIEdBVFRfQ09OTl9QRU5ESU5HICAgICAgICAgPSAweDAxLAotICBHQVRUX0RJU0NfUEVORElORyAgICAgICAgID0gMHgwMgotfTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQkFQX0NPTk5FQ1RfUkVRX0VWVCA9IDBYMDAsCi0gIEJBUF9ESVNDT05ORUNUX1JFUV9FVlQsCi0gIEJBUF9TVEFSVF9SRVFfRVZULAotICBCQVBfU1RPUF9SRVFfRVZULAotICBCQVBfUkVDT05GSUdfUkVRX0VWVCwKLSAgQkFQX1NUUkVBTV9VUERBVEVfUkVRX0VWVCwKLSAgUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVCwKLSAgUEFDU19ESVNDT1ZFUllfUkVTX0VWVCwKLSAgUEFDU19BVURJT19DT05URVhUX1JFU19FVlQsCi0gIEFTQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQsCi0gIEFTQ1NfRElTQ09WRVJZX1JFU19FVlQsCi0gIEFTQ1NfQVNFX1NUQVRFX0VWVCwKLSAgQVNDU19BU0VfT1BfRkFJTEVEX0VWVCwKLSAgQ0lTX0dST1VQX1NUQVRFX0VWVCwKLSAgQ0lTX1NUQVRFX0VWVCwKLSAgQkFQX1RJTUVfT1VUX0VWVCwKLX0gQmFwRXZlbnQ7Ci0KLXN0cnVjdCBCYXBDb25uZWN0IHsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYmRfYWRkcjsKLSAgYm9vbCBpc19kaXJlY3Q7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+IHN0cmVhbXM7Ci19OwotCi1zdHJ1Y3QgQmFwRGlzY29ubmVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RyZWFtczsKLX07Ci0KLXN0cnVjdCBCYXBTdGFydCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RyZWFtczsKLX07Ci0KLXN0cnVjdCBCYXBTdG9wIHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zOwotfTsKLQotc3RydWN0IEJhcFJlY29uZmlnIHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gc3RyZWFtczsKLX07Ci0KLXN0cnVjdCBCYXBTdHJlYW1VcGRhdGUgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVVwZGF0ZT4gdXBkYXRlX3N0cmVhbXM7Ci19OwotCi1zdHJ1Y3QgUGFjc0Nvbm5lY3Rpb25TdGF0ZSB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgQ29ubmVjdGlvblN0YXRlIHN0YXRlOwotfTsKLQotc3RydWN0IEFzY3NDb25uZWN0aW9uU3RhdGUgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIEdhdHRTdGF0ZSBzdGF0ZTsKLX07Ci0KLXN0cnVjdCBBc2NzRGlzY292ZXJ5IHsKLSAgaW50IHN0YXR1czsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBzdGQ6OnZlY3RvcjxBc2VQYXJhbXM+IHNpbmtfYXNlc19saXN0OwotICBzdGQ6OnZlY3RvcjxBc2VQYXJhbXM+IHNyY19hc2VzX2xpc3Q7Ci19OwotCi1zdHJ1Y3QgQXNjc1N0YXRlIHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBBc2VQYXJhbXMgYXNlX3BhcmFtczsKLX07Ci0KLXN0cnVjdCBBc2NzT3BGYWlsZWQgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGFzY3M6OkFzZU9wSWQgYXNlX29wX2lkOwotICBzdGQ6OnZlY3Rvcjxhc2NzOjpBc2VPcFN0YXR1cz4gYXNlX2xpc3Q7Ci19OwotCi1zdHJ1Y3QgQ2lzR3JvdXBTdGF0ZSB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICBDaWdTdGF0ZSBzdGF0ZTsKLX07Ci0KLXN0cnVjdCBDaXNTdHJlYW1TdGF0ZSB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50OF90IGNpc19pZDsKLSAgdWludDhfdCBkaXJlY3Rpb247Ci0gIENpc1N0YXRlIHN0YXRlOwotfTsKLQotc3RydWN0IFBhY3NEaXNjb3ZlcnkgewotICBpbnQgc3RhdHVzOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBzaW5rX3BhY19yZWNvcmRzOwotICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gc3JjX3BhY19yZWNvcmRzOwotICB1aW50MzJfdCBzaW5rX2xvY2F0aW9uczsKLSAgdWludDMyX3Qgc3JjX2xvY2F0aW9uczsKLSAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzOwotICB1aW50MzJfdCBzdXBwb3J0ZWRfY29udGV4dHM7Ci19OwotCi1zdHJ1Y3QgUGFjc0F2YWlsYWJsZUNvbnRleHRzIHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB1aW50MzJfdCBhdmFpbGFibGVfY29udGV4dHM7Ci19OwotCi1zdHJ1Y3QgSW50U3RybVRyYWNrZXIgewotIEludFN0cm1UcmFja2VyKFN0cmVhbVR5cGUgc3RybV90eXBlLCB1aW50OF90IGFzZV9pZCwgdWludDhfdCBjaWdfaWQsCi0gICAgICAgICAgICAgICAgdWludDhfdCBjaXNfaWQsIENvZGVjQ29uZmlnICZjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgUW9zQ29uZmlnICZxb3NfY29uZmlnKQotICAgICA6IHN0cm1fdHlwZShzdHJtX3R5cGUpLCBhc2VfaWQoYXNlX2lkKSAsIGNpZ19pZChjaWdfaWQpICwKLSAgICAgICBjaXNfaWQoY2lzX2lkKSwgY29kZWNfY29uZmlnKGNvZGVjX2NvbmZpZyksCi0gICAgICAgcW9zX2NvbmZpZyhxb3NfY29uZmlnKSB7Ci0gICAgICAgIGF0dGFjaGVkX3N0YXRlID0gU3RyZWFtQXR0YWNoZWRTdGF0ZTo6SURMRTsKLSAgICAgICB9Ci0gIFN0cmVhbVR5cGUgc3RybV90eXBlOwotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotICBDb2RlY0NvbmZpZyBjb2RlY19jb25maWc7Ci0gIFFvc0NvbmZpZyBxb3NfY29uZmlnOwotICBTdHJlYW1BdHRhY2hlZFN0YXRlIGF0dGFjaGVkX3N0YXRlOwotfTsKLQotY2xhc3MgSW50U3RybVRyYWNrZXJzIHsKLSBwdWJsaWM6Ci0gIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IEZpbmRCeUNpZ0lkKHVpbnQ4X3QgY2lnX2lkKSB7Ci0gICAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gdHJhY2tlcnM7Ci0gICAgZm9yIChhdXRvIGkgPSBpbnRfc3RybV90cmFja2Vycy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gaW50X3N0cm1fdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICBpZigoKmkpLT5jaWdfaWQgID09IGNpZ19pZCkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiB0cmFja2VyIGZvdW5kIjsKLSAgICAgICAgdHJhY2tlcnMucHVzaF9iYWNrKCppKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRyYWNrZXJzOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gRmluZEJ5Q2lnSWRBbmREaXIodWludDhfdCBjaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlyZWN0aW9uKSB7Ci0gICAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gdHJhY2tlcnM7Ci0gICAgZm9yIChhdXRvIGkgPSBpbnRfc3RybV90cmFja2Vycy5iZWdpbigpOwotICAgICAgICAgICAgICBpICE9IGludF9zdHJtX3RyYWNrZXJzLmVuZCgpO2krKykgewotICAgICAgaWYoKCppKS0+Y2lnX2lkICA9PSBjaWdfaWQgJiYKLSAgICAgICAgICgqaSktPnN0cm1fdHlwZS5kaXJlY3Rpb24gID09IGRpcmVjdGlvbikgewotICAgICAgICB0cmFja2Vycy5wdXNoX2JhY2soKmkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJhY2tlcnM7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiBGaW5kQnlDaXNJZCh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQpIHsKLSAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiB0cmFja2VyczsKLSAgICBmb3IgKGF1dG8gaSA9IGludF9zdHJtX3RyYWNrZXJzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGkgIT0gaW50X3N0cm1fdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICBpZigoKmkpLT5jaWdfaWQgID09IGNpZ19pZCAmJiAoKmkpLT5jaXNfaWQgID09IGNpc19pZCkgewotICAgICAgICB0cmFja2Vycy5wdXNoX2JhY2soKmkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJhY2tlcnM7Ci0gIH0KLQotICBJbnRTdHJtVHJhY2tlciAqRmluZEJ5SW5kZXgodWludDhfdCBpKSB7Ci0gICAgSW50U3RybVRyYWNrZXIgKnRyYWNrZXIgPSBpbnRfc3RybV90cmFja2Vycy5hdChpKTsKLSAgICByZXR1cm4gdHJhY2tlcjsKLSAgfQotCi0gIEludFN0cm1UcmFja2VyICpGaW5kQnlBc2VJZCh1aW50OF90IGFzZV9pZCkgewotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihpbnRfc3RybV90cmFja2Vycy5iZWdpbigpLCBpbnRfc3RybV90cmFja2Vycy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJmFzZV9pZF0oSW50U3RybVRyYWNrZXIgKnRyYWNrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tlci0+YXNlX2lkID09IGFzZV9pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBpbnRfc3RybV90cmFja2Vycy5lbmQoKSkgPyBudWxscHRyIDogKCppdGVyKTsKLSAgfQotCi0gIEludFN0cm1UcmFja2VyICpGaW5kT3JBZGRCeXRyYWNrZXJUeXBlKFN0cmVhbVR5cGUgc3RybV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhc2VfaWQsIHVpbnQ4X3QgY2lnX2lkLCAgdWludDhfdCBjaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0NvbmZpZyAmY29kZWNfY29uZmlnLCBRb3NDb25maWcgJnFvc19jb25maWcpIHsKLQotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihpbnRfc3RybV90cmFja2Vycy5iZWdpbigpLCBpbnRfc3RybV90cmFja2Vycy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgIFsmc3RybV90eXBlLCAmY2lnX2lkLCAmY2lzX2lkXShJbnRTdHJtVHJhY2tlciAqdHJhY2tlcikgewotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgodHJhY2tlci0+c3RybV90eXBlLnR5cGUgPT0gc3RybV90eXBlLnR5cGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFja2VyLT5zdHJtX3R5cGUuZGlyZWN0aW9uID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtX3R5cGUuZGlyZWN0aW9uKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhY2tlci0+Y2lnX2lkID09IGNpZ19pZCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWNrZXItPmNpc19pZCA9PSBjaXNfaWQpKTsKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIGlmIChpdGVyID09IGludF9zdHJtX3RyYWNrZXJzLmVuZCgpKSB7Ci0gICAgICBJbnRTdHJtVHJhY2tlciAqdHJhY2tlciA9IG5ldyBJbnRTdHJtVHJhY2tlcihzdHJtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhc2VfaWQsIGNpZ19pZCwgY2lzX2lkLCBjb2RlY19jb25maWcsIHFvc19jb25maWcpOwotICAgICAgaW50X3N0cm1fdHJhY2tlcnMucHVzaF9iYWNrKHRyYWNrZXIpOwotICAgICAgcmV0dXJuIHRyYWNrZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoKml0ZXIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVtb3ZlKFN0cmVhbVR5cGUgc3RybV90eXBlLCB1aW50OF90IGNpZ19pZCwgIHVpbnQ4X3QgY2lzX2lkKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gaW50X3N0cm1fdHJhY2tlcnMuYmVnaW4oKTsgaXQgIT0gaW50X3N0cm1fdHJhY2tlcnMuZW5kKCk7KSB7Ci0gICAgICBpZiAoKCgqaXQpLT5zdHJtX3R5cGUudHlwZSA9IHN0cm1fdHlwZS50eXBlKSAmJgotICAgICAgICAgICgoKml0KS0+c3RybV90eXBlLmRpcmVjdGlvbiA9IHN0cm1fdHlwZS5kaXJlY3Rpb24pICYmCi0gICAgICAgICAgKCgqaXQpLT5jaWdfaWQgPSBjaWdfaWQpICYmICgoKml0KS0+Y2lzX2lkID0gY2lzX2lkKSkgewotICAgICAgICBkZWxldGUoKml0KTsKLSAgICAgICAgaXQgPSBpbnRfc3RybV90cmFja2Vycy5lcmFzZShpdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpdCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgUmVtb3ZlVmlydHVhbEF0dGFjaGVkVHJhY2tlcnMoKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fOwotICAgIGZvciAoYXV0byBpdCA9IGludF9zdHJtX3RyYWNrZXJzLmJlZ2luKCk7IGl0ICE9IGludF9zdHJtX3RyYWNrZXJzLmVuZCgpOykgewotICAgICAgaWYgKCgqaXQpLT5hdHRhY2hlZF9zdGF0ZSA9PSBTdHJlYW1BdHRhY2hlZFN0YXRlOjpWSVJUVUFMKSB7Ci0gICAgICAgIGRlbGV0ZSgqaXQpOwotICAgICAgICBpdCA9IGludF9zdHJtX3RyYWNrZXJzLmVyYXNlKGl0KTsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOiBSZW1vdmVkIHZpcnR1YWwgYXR0YWNoZWQgdHJhY2tlciI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpdCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKGludF9zdHJtX3RyYWNrZXJzLnNpemUoKSk7IH0KLQotICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiAqR2V0VHJhY2tlckxpc3QoKSB7Ci0gICAgcmV0dXJuICZpbnRfc3RybV90cmFja2VyczsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IEdldFRyYWNrZXJMaXN0QnlEaXIodWludDhfdCBkaXJlY3Rpb24pIHsKLSAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiB0cmFja2VyczsKLSAgICBmb3IgKGF1dG8gaSA9IGludF9zdHJtX3RyYWNrZXJzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGkgIT0gaW50X3N0cm1fdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICBpZigoKmkpLT5zdHJtX3R5cGUuZGlyZWN0aW9uID09IGRpcmVjdGlvbikgewotICAgICAgICB0cmFja2Vycy5wdXNoX2JhY2soKmkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJhY2tlcnM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IGludF9zdHJtX3RyYWNrZXJzOwotfTsKLQotdW5pb24gQmFwRXZlbnREYXRhIHsKLSAgQmFwQ29ubmVjdCBjb25uZWN0X3JlcTsKLSAgQmFwRGlzY29ubmVjdCBkaXNjX3JlcTsKLSAgQmFwU3RhcnQgc3RhcnRfcmVxOwotICBCYXBTdG9wIHN0b3BfcmVxOwotICBCYXBSZWNvbmZpZyByZWNvbmZpZ19yZXE7Ci0gIFBhY3NDb25uZWN0aW9uU3RhdGUgY29ubmVjdGlvbl9zdGF0ZV9yc3A7Ci0gIFBhY3NEaXNjb3ZlcnkgcGFjc19kaXNjb3ZlcnlfcnNwOwotICBQYWNzQXZhaWxhYmxlQ29udGV4dHMgcGFjc19hdWRpb19jb250ZXh0X3JzcDsKLX07Ci0KLWVudW0gY2xhc3MgVGltZW91dFZhbCB7IC8vaW4gbWlsbGkgc2Vjb25kcygxc2VjID0gMTAwMG1zKQotICBDb25uZWN0aW5nVGltZW91dCA9IDEwMDAwLAotICBTdGFydGluZ1RpbWVvdXQgPSAyMDAwLAotICBTdG9wcGluZ1RpbWVvdXQgPSAyMDAwLAotICBEaXNjb25uZWN0aW5nVGltZW91dCA9IDEwMDAsCi0gIFJlY29uZmlndXJpbmdUaW1lb3V0ID0gMjAwMCwKLSAgVXBkYXRpbmdUaW1lb3V0ID0gMTAwMAotfTsKLQotZW51bSBjbGFzcyBNYXhUaW1lb3V0VmFsIHsgLy9pbiBtaWxsaSBzZWNvbmRzKDFzZWMgPSAxMDAwbXMpCi0gIENvbm5lY3RpbmdUaW1lb3V0ID0gMTAwMDAsCi0gIFN0YXJ0aW5nVGltZW91dCA9IDQwMDAsCi0gIFN0b3BwaW5nVGltZW91dCA9IDQwMDAsCi0gIERpc2Nvbm5lY3RpbmdUaW1lb3V0ID0gNDAwMCwKLSAgUmVjb25maWd1cmluZ1RpbWVvdXQgPSA4MDAwLAotICBVcGRhdGluZ1RpbWVvdXQgPSA0MDAwCi19OwotCi1lbnVtIGNsYXNzIFRpbWVvdXRSZWFzb24gewotICBTVEFURV9UUkFOU0lUSU9OID0gMSwKLX07Ci0KLXN0cnVjdCBCYXBUaW1lb3V0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBTdHJlYW1UcmFja2VyKiB0cmFja2VyOwotICBUaW1lb3V0UmVhc29uIHJlYXNvbjsKLSAgaW50IHRyYW5zaXRpb25fc3RhdGU7Ci19OwotCi1jbGFzcyBTdHJlYW1UcmFja2VyIDogcHVibGljIGJsdWV0b290aDo6Y29tbW9uOjpTdGF0ZU1hY2hpbmUgewotIHB1YmxpYzoKLSAgZW51bSB7Ci0gICAga1N0YXRlSWRsZSwgICAgIC8vCi0gICAga1N0YXRlQ29ubmVjdGluZywgIC8vCi0gICAga1N0YXRlQ29ubmVjdGVkLCAgIC8vCi0gICAga1N0YXRlU3RhcnRpbmcsICAvLwotICAgIGtTdGF0ZVN0cmVhbWluZywgIC8vCi0gICAga1N0YXRlU3RvcHBpbmcsIC8vCi0gICAga1N0YXRlRGlzY29ubmVjdGluZywgLy8KLSAgICBrU3RhdGVSZWNvbmZpZ3VyaW5nLCAvLwotICAgIGtTdGF0ZVVwZGF0aW5nCi0gIH07Ci0KLSAgY2xhc3MgU3RhdGVJZGxlIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZUlkbGUoU3RyZWFtVHJhY2tlciYgc20pCi0gICAgICAgIDogU3RhdGUoc20sIGtTdGF0ZUlkbGUpLCB0cmFja2VyXyhzbSksCi0gICAgICAgICAgc3RybV9tZ3JfKHNtLkdldFN0cmVhbU1hbmFnZXIoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGNvbnN0IGNoYXIqIEdldFN0YXRlKCkgeyByZXR1cm4gIklkbGUiOyB9Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgU3RyZWFtVHJhY2tlciAmdHJhY2tlcl87Ci0gICAgVXN0cmVhbU1hbmFnZXIgKnN0cm1fbWdyXzsKLSAgfTsKLQotICBjbGFzcyBTdGF0ZUNvbm5lY3RpbmcgOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlQ29ubmVjdGluZyhTdHJlYW1UcmFja2VyJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlQ29ubmVjdGluZyksIHRyYWNrZXJfKHNtKSwKLSAgICAgICAgIHN0cm1fbWdyXyhzbS5HZXRTdHJlYW1NYW5hZ2VyKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJDb25uZWN0aW5nIjsgfQotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotICAgIHZvaWQgRGVyaXZlRGV2aWNlVHlwZShQYWNzRGlzY292ZXJ5ICpwYWNzX2Rpc2NvdmVyeSk7Ci0gICAgYm9vbCBBdHRhY2hTdHJlYW1zVG9Db250ZXh0KHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+ICphbGxfdHJhY2tlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gKnN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2lzX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VDb2RlY0NvbmZpZ09wPiAqYXNlX29wcyk7Ci0gICAgYWxhcm1fdCogc3RhdGVfdHJhbnNpdGlvbl90aW1lcjsKLSAgICBCYXBUaW1lb3V0IHRpbWVvdXQ7Ci0KLSAgIHByaXZhdGU6Ci0gICAgU3RyZWFtVHJhY2tlciAmdHJhY2tlcl87Ci0gICAgVXN0cmVhbU1hbmFnZXIgKnN0cm1fbWdyXzsKLSAgICBQYWNzRGlzY292ZXJ5IHBhY3NfZGlzY292ZXJ5XzsKLSAgICBBc2NzRGlzY292ZXJ5IGFzY3NfZGlzY292ZXJ5XzsKLSAgICBJbnRTdHJtVHJhY2tlcnMgaW50X3N0cm1fdHJhY2tlcnNfOwotICAgfTsKLQotICBjbGFzcyBTdGF0ZUNvbm5lY3RlZCA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVDb25uZWN0ZWQoU3RyZWFtVHJhY2tlciYgc20pCi0gICAgICAgIDogU3RhdGUoc20sIGtTdGF0ZUNvbm5lY3RlZCksIHRyYWNrZXJfKHNtKSwKLSAgICAgICAgICBzdHJtX21ncl8oc20uR2V0U3RyZWFtTWFuYWdlcigpKXt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJDb25uZWN0ZWQiOyB9Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgU3RyZWFtVHJhY2tlciAmdHJhY2tlcl87Ci0gICAgVXN0cmVhbU1hbmFnZXIgKnN0cm1fbWdyXzsKLSAgfTsKLQotICBjbGFzcyBTdGF0ZVN0YXJ0aW5nIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZVN0YXJ0aW5nKFN0cmVhbVRyYWNrZXImIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVTdGFydGluZyksIHRyYWNrZXJfKHNtKSwKLSAgICAgICAgICBzdHJtX21ncl8oc20uR2V0U3RyZWFtTWFuYWdlcigpKXt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBjb25zdCBjaGFyKiBHZXRTdGF0ZSgpIHsgcmV0dXJuICJTdGFydGluZyI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLSAgICBib29sIENoZWNrQW5kVXBkYXRlU3RyZWFtaW5nU3RhdGUoKTsKLSAgICBhbGFybV90KiBzdGF0ZV90cmFuc2l0aW9uX3RpbWVyOwotICAgIFBhY3NBdmFpbGFibGVDb250ZXh0cyBwYWNzX2NvbnRleHRzOwotICAgIEJhcFRpbWVvdXQgdGltZW91dDsKLQotICAgcHJpdmF0ZToKLSAgICBTdHJlYW1UcmFja2VyICZ0cmFja2VyXzsKLSAgICBVc3RyZWFtTWFuYWdlciAqc3RybV9tZ3JfOwotICAgIEludFN0cm1UcmFja2VycyBpbnRfc3RybV90cmFja2Vyc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVTdHJlYW1pbmcgOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlU3RyZWFtaW5nKFN0cmVhbVRyYWNrZXImIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVTdHJlYW1pbmcpLCB0cmFja2VyXyhzbSksCi0gICAgICAgICAgc3RybV9tZ3JfKHNtLkdldFN0cmVhbU1hbmFnZXIoKSl7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgY29uc3QgY2hhciogR2V0U3RhdGUoKSB7IHJldHVybiAiU3RyZWFtaW5nIjsgfQotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIFN0cmVhbVRyYWNrZXIgJnRyYWNrZXJfOwotICAgIFVzdHJlYW1NYW5hZ2VyICpzdHJtX21ncl87Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVTdG9wcGluZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVTdG9wcGluZyhTdHJlYW1UcmFja2VyJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlU3RvcHBpbmcpLCB0cmFja2VyXyhzbSksCi0gICAgICAgICAgc3RybV9tZ3JfKHNtLkdldFN0cmVhbU1hbmFnZXIoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGNvbnN0IGNoYXIqIEdldFN0YXRlKCkgeyByZXR1cm4gIlN0b3BwaW5nIjsgfQotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotICAgIGJvb2wgVGVybWluYXRlQ2lzQW5kQ2lnKFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSk7Ci0gICAgYm9vbCBDaGVja0FuZFVwZGF0ZVN0b3BwZWRTdGF0ZSgpOwotICAgIGFsYXJtX3QqIHN0YXRlX3RyYW5zaXRpb25fdGltZXI7Ci0gICAgQmFwVGltZW91dCB0aW1lb3V0OwotCi0gICBwcml2YXRlOgotICAgIFN0cmVhbVRyYWNrZXIgJnRyYWNrZXJfOwotICAgIFVzdHJlYW1NYW5hZ2VyICpzdHJtX21ncl87Ci0gICAgSW50U3RybVRyYWNrZXJzIGludF9zdHJtX3RyYWNrZXJzXzsKLSAgfTsKLQotICBjbGFzcyBTdGF0ZURpc2Nvbm5lY3RpbmcgOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlRGlzY29ubmVjdGluZyhTdHJlYW1UcmFja2VyJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlRGlzY29ubmVjdGluZyksIHRyYWNrZXJfKHNtKSwKLSAgICAgICAgICBzdHJtX21ncl8oc20uR2V0U3RyZWFtTWFuYWdlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgY29uc3QgY2hhciogR2V0U3RhdGUoKSB7IHJldHVybiAiRGlzY29ubmVjdGluZyI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLSAgICBib29sIFRlcm1pbmF0ZUdhdHRDb25uZWN0aW9uKCk7Ci0gICAgdm9pZCBDb250aW51ZURpc2Nvbm5lY3Rpb24oVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtKTsKLSAgICBib29sIENoZWNrQW5kVXBkYXRlRGlzY29ubmVjdGVkU3RhdGUoKTsKLSAgICBhbGFybV90KiBzdGF0ZV90cmFuc2l0aW9uX3RpbWVyOwotICAgIEJhcFRpbWVvdXQgdGltZW91dDsKLQotICAgcHJpdmF0ZToKLSAgICBTdHJlYW1UcmFja2VyICZ0cmFja2VyXzsKLSAgICBVc3RyZWFtTWFuYWdlciAqc3RybV9tZ3JfOwotICAgIEludFN0cm1UcmFja2VycyBpbnRfc3RybV90cmFja2Vyc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVSZWNvbmZpZ3VyaW5nOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlUmVjb25maWd1cmluZyhTdHJlYW1UcmFja2VyJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlUmVjb25maWd1cmluZyksIHRyYWNrZXJfKHNtKSwKLSAgICAgICAgICBzdHJtX21ncl8oc20uR2V0U3RyZWFtTWFuYWdlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgY29uc3QgY2hhciogR2V0U3RhdGUoKSB7IHJldHVybiAiUmVjb25maWd1cmluZyI7IH0KLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLSAgICBhbGFybV90KiBzdGF0ZV90cmFuc2l0aW9uX3RpbWVyOwotICAgIEJhcFRpbWVvdXQgdGltZW91dDsKLQotICAgcHJpdmF0ZToKLSAgICBTdHJlYW1UcmFja2VyICZ0cmFja2VyXzsKLSAgICBVc3RyZWFtTWFuYWdlciAqc3RybV9tZ3JfOwotICAgIEludFN0cm1UcmFja2VycyBpbnRfc3RybV90cmFja2Vyc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVVcGRhdGluZzogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZVVwZGF0aW5nKFN0cmVhbVRyYWNrZXImIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVVcGRhdGluZyksIHRyYWNrZXJfKHNtKSwKLSAgICAgICAgICBzdHJtX21ncl8oc20uR2V0U3RyZWFtTWFuYWdlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgY29uc3QgY2hhciogR2V0U3RhdGUoKSB7IHJldHVybiAiVXBkYXRpbmciOyB9Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0gICAgYWxhcm1fdCogc3RhdGVfdHJhbnNpdGlvbl90aW1lcjsKLSAgICBCYXBUaW1lb3V0IHRpbWVvdXQ7Ci0KLSAgIHByaXZhdGU6Ci0gICAgU3RyZWFtVHJhY2tlciAmdHJhY2tlcl87Ci0gICAgVXN0cmVhbU1hbmFnZXIgKnN0cm1fbWdyXzsKLSAgICBJbnRTdHJtVHJhY2tlcnMgaW50X3N0cm1fdHJhY2tlcnNfOwotICB9OwotCi0gIFN0cmVhbVRyYWNrZXIoaW50IGluaXRfc3RhdGVfaWQsIFVzdHJlYW1NYW5hZ2VyICpzdHJtX21nciwKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubmVjdF9zdHJlYW1zLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAqcmVjb25maWdfc3RyZWFtcywKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RyZWFtcywKLSAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZSBvcHNfdHlwZSk6Ci0gICAgICAgICAgICAgICAgICAgIGluaXRfc3RhdGVfaWRfKGluaXRfc3RhdGVfaWQpLAotICAgICAgICAgICAgICAgICAgICBzdHJtX21ncl8oc3RybV9tZ3IpIHsKLQotICAgIHN0YXRlX2lkbGVfID0gbmV3IFN0YXRlSWRsZSgqdGhpcyk7Ci0gICAgc3RhdGVfY29ubmVjdGluZ18gPSBuZXcgU3RhdGVDb25uZWN0aW5nKCp0aGlzKTsKLSAgICBzdGF0ZV9jb25uZWN0ZWRfID0gbmV3IFN0YXRlQ29ubmVjdGVkKCp0aGlzKTsKLSAgICBzdGF0ZV9zdGFydGluZ18gPSBuZXcgU3RhdGVTdGFydGluZygqdGhpcyk7Ci0gICAgc3RhdGVfc3RyZWFtaW5nXyA9IG5ldyBTdGF0ZVN0cmVhbWluZygqdGhpcyk7Ci0gICAgc3RhdGVfc3RvcHBpbmdfID0gbmV3IFN0YXRlU3RvcHBpbmcoKnRoaXMpOwotICAgIHN0YXRlX2Rpc2Nvbm5lY3RpbmdfID0gbmV3IFN0YXRlRGlzY29ubmVjdGluZygqdGhpcyk7Ci0gICAgc3RhdGVfcmVjb25maWd1cmluZ18gPSBuZXcgU3RhdGVSZWNvbmZpZ3VyaW5nKCp0aGlzKTsKLSAgICBzdGF0ZV91cGRhdGluZ18gPSBuZXcgU3RhdGVVcGRhdGluZygqdGhpcyk7Ci0gICAgcGFjc19kaXNjX3N1Y2NlZGVkXyA9IGZhbHNlOwotCi0gICAgQWRkU3RhdGUoc3RhdGVfaWRsZV8pOwotICAgIEFkZFN0YXRlKHN0YXRlX2Nvbm5lY3RpbmdfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9jb25uZWN0ZWRfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9zdGFydGluZ18pOwotICAgIEFkZFN0YXRlKHN0YXRlX3N0cmVhbWluZ18pOwotICAgIEFkZFN0YXRlKHN0YXRlX3N0b3BwaW5nXyk7Ci0gICAgQWRkU3RhdGUoc3RhdGVfZGlzY29ubmVjdGluZ18pOwotICAgIEFkZFN0YXRlKHN0YXRlX3JlY29uZmlndXJpbmdfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV91cGRhdGluZ18pOwotCi0gICAgc3dpdGNoKGluaXRfc3RhdGVfaWQpIHsKLSAgICAgIGNhc2Uga1N0YXRlSWRsZToKLSAgICAgICAgU2V0SW5pdGlhbFN0YXRlKHN0YXRlX2lkbGVfKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtTdGF0ZUNvbm5lY3RlZDoKLSAgICAgICAgU2V0SW5pdGlhbFN0YXRlKHN0YXRlX2Nvbm5lY3RlZF8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga1N0YXRlU3RyZWFtaW5nOgotICAgICAgICBTZXRJbml0aWFsU3RhdGUoc3RhdGVfc3RyZWFtaW5nXyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrU3RhdGVEaXNjb25uZWN0aW5nOgotICAgICAgICBTZXRJbml0aWFsU3RhdGUoc3RhdGVfZGlzY29ubmVjdGluZ18pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIFNldEluaXRpYWxTdGF0ZShzdGF0ZV9pZGxlXyk7Ci0gICAgfQotCi0gICAgc3RyX29wc190eXBlID0gb3BzX3R5cGU7Ci0KLSAgICBpZihvcHNfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6Q29ubmVjdCkgewotICAgICAgY29ubl9zdHJlYW1zID0gKmNvbm5lY3Rfc3RyZWFtczsKLSAgICB9IGVsc2UgaWYob3BzX3R5cGUgPT0gU3RyZWFtQ29udHJvbFR5cGU6OlJlY29uZmlnKSB7Ci0gICAgICByZWNvbmZfc3RyZWFtcyA9ICpyZWNvbmZpZ19zdHJlYW1zOwotICAgIH0gZWxzZSBpZihvcHNfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6VXBkYXRlU3RyZWFtKSB7Ci0gICAgICBvdGhlcl9zdHJlYW1zID0gKnN0cmVhbXM7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBQYXVzZVJlbW90ZURldkludGVyYWN0aW9uKGJvb2wgcGF1c2UpOwotICBib29sIGRlY291cGxlU3RyZWFtKFN0cmVhbVR5cGUgKnN0cmVhbV9pbmZvKTsKLQotICB1aW50OF90IENob29zZUJlc3RDb2RlYyhTdHJlYW1UeXBlIHN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNRb3NDb25maWc+ICpjb2RlY19xb3NfY29uZmlncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY3NEaXNjb3ZlcnkgKnBhY3NfZGlzY292ZXJ5KTsKLQotICBib29sIENob29zZUJlc3RRb3MoUW9zQ29uZmlnICpzcmNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgYXNjczo6QXNlQ29kZWNDb25maWdQYXJhbXMgKnJlbV9xb3NfcHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICBRb3NDb25maWcgKmRzdF9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3N0YXRlLCB1aW50OF90IHN0cmVhbV9kaXJlY3Rpb24pOwotCi0gIGJvb2wgSGFuZGxlUGFjc0Nvbm5lY3Rpb25FdmVudCh2b2lkICpwX2RhdGEpOwotCi0gIGJvb2wgSGFuZGxlUGFjc0F1ZGlvQ29udGV4dEV2ZW50KFBhY3NBdmFpbGFibGVDb250ZXh0cyAqcGFjc19jb250ZXh0cyk7Ci0KLSAgYm9vbCBIYW5kbGVDaXNFdmVudHNJblN0cmVhbWluZyh2b2lkKiBwX2RhdGEpOwotCi0gIGJvb2wgSGFuZGxlU3RyZWFtVXBkYXRlIChpbnQgY3VyX3N0YXRlKTsKLQotICBib29sIENoZWNrQW5kVXBkYXRlU3RyZWFtaW5nU3RhdGUoSW50U3RybVRyYWNrZXJzICppbnRfc3RybV90cmFja2Vycyk7Ci0KLSAgYm9vbCBIYW5kbGVBc2NzQ29ubmVjdGlvbkV2ZW50KHZvaWQgKnBfZGF0YSk7Ci0KLSAgdm9pZCBIYW5kbGVDaWdTdGF0ZUV2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkICpwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTdHJtVHJhY2tlcnMgKmludF9zdHJtX3RyYWNrZXJzKTsKLQotICB2b2lkIEhhbmRsZUFzZVN0YXRlRXZlbnQodm9pZCAqcF9kYXRhLCBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTdHJtVHJhY2tlcnMgKmludF9zdHJtX3RyYWNrZXJzKTsKLQotICB2b2lkIEhhbmRsZUFzZU9wRmFpbGVkRXZlbnQodm9pZCAqcF9kYXRhKTsKLQotICBib29sIFZhbGlkYXRlQXNlVXBkYXRlKHZvaWQqIHBfZGF0YSwgSW50U3RybVRyYWNrZXJzICppbnRfc3RybV90cmFja2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwX3N0cm1fc3RhdGUpOwotCi0gIGJvb2wgSGFuZGxlRGlzY29ubmVjdCh2b2lkKiBwX2RhdGEsIGludCBjdXJfc3RhdGUpOwotCi0gIGJvb2wgSGFuZGxlUmVtb3RlRGlzY29ubmVjdCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhLCBpbnQgY3VyX3N0YXRlKTsKLQotICBib29sIFN0cmVhbUNhbmJlRGlzY29ubmVjdGVkKFN0cmVhbUNvbnRleHQgKmN1cl9jb250ZXh0LCB1aW50OF90IGFzZV9pZCk7Ci0KLSAgYm9vbCBIYW5kbGVJbnRlcm5hbERpc2Nvbm5lY3QoYm9vbCByZWxlYXNlKTsKLQotICBib29sIEhhbmRsZVN0b3Aodm9pZCogcF9kYXRhLCBpbnQgY3VyX3N0YXRlKTsKLQotICBib29sIEhhbmRsZVJlbW90ZVN0b3AodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSwgaW50IGN1cl9zdGF0ZSk7Ci0KLSAgYm9vbCBIYW5kbGVSZW1vdGVSZWNvbmZpZyh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhLCBpbnQgY3VyX3N0YXRlKTsKLQotICBib29sIFByZXBhcmVDb2RlY0NvbmZpZ1BheWxvYWQoc3RkOjp2ZWN0b3I8QXNlQ29kZWNDb25maWdPcD4gKmFzZV9vcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0pOwotCi0gIHZvaWQgQ2hlY2tBbmRTZW5kUW9zQ29uZmlnKEludFN0cm1UcmFja2VycyAqaW50X3N0cm1fdHJhY2tlcnMpOwotCi0gIHZvaWQgQ2hlY2tBbmRTZW5kRW5hYmxlKEludFN0cm1UcmFja2VycyAqaW50X3N0cm1fdHJhY2tlcnMpOwotCi0gIGJvb2wgSGFuZGxlQWJydXB0U3RvcCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKTsKLQotICBhbGFybV90KiBTZXRUaW1lcihjb25zdCBjaGFyKiBhbGFybW5hbWUsIEJhcFRpbWVvdXQqIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dFJlYXNvbiByZWFzb24sIHVpbnQ2NF90IG1zKTsKLQotICB2b2lkIENsZWFyVGltZXIoYWxhcm1fdCogdGltZXIsIGNvbnN0IGNoYXIqIGFsYXJtbmFtZSk7Ci0KLSAgdm9pZCBPblRpbWVvdXQodm9pZCogZGF0YSk7Ci0KLSAgU3RyZWFtQ29udHJvbFR5cGUgR2V0Q29udHJvbFR5cGUoKSB7Ci0gICAgcmV0dXJuIHN0cl9vcHNfdHlwZTsKLSAgfQotCi0gIFVzdHJlYW1NYW5hZ2VyICpHZXRTdHJlYW1NYW5hZ2VyKCkgewotICAgIHJldHVybiBzdHJtX21ncl87Ci0gIH0KLQotICBib29sIFVwZGF0ZVBhY3NEaXNjb3ZlcnkoUGFjc0Rpc2NvdmVyeSBkaXNjX3JlcykgewotICAgIHBhY3NfZGlzY19zdWNjZWRlZF8gPSB0cnVlOwotICAgIHBhY3NfZGlzY292ZXJ5XyA9IGRpc2NfcmVzOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgUGFjc0Rpc2NvdmVyeSAqR2V0UGFjc0Rpc2NvdmVyeSgpIHsKLSAgICBpZihwYWNzX2Rpc2Nfc3VjY2VkZWRfKSB7Ci0gICAgICByZXR1cm4gJnBhY3NfZGlzY292ZXJ5XzsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBVcGRhdGVDb250cm9sVHlwZShTdHJlYW1Db250cm9sVHlwZSBvcHNfdHlwZSkgewotICAgIHN0cl9vcHNfdHlwZSA9IG9wc190eXBlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBVcGRhdGVTdHJlYW1zKHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdHJlYW1zKSB7Ci0gICAgb3RoZXJfc3RyZWFtcyA9ICpzdHJlYW1zOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBVcGRhdGVDb25uU3RyZWFtcygKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubmVjdF9zdHJlYW1zKSB7Ci0gICAgY29ubl9zdHJlYW1zID0gKmNvbm5lY3Rfc3RyZWFtczsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgVXBkYXRlUmVjb25mU3RyZWFtcygKLSAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAqcmVjb25maWdfc3RyZWFtcykgewotICAgIHJlY29uZl9zdHJlYW1zID0gKnJlY29uZmlnX3N0cmVhbXM7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIFVwZGF0ZU1ldGFVcGRhdGVTdHJlYW1zKAotICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVXBkYXRlPiAqbWV0YV9zdHJlYW1zKSB7Ci0gICAgbWV0YV91cGRhdGVfc3RyZWFtcyA9ICptZXRhX3N0cmVhbXM7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqR2V0U3RyZWFtcygpIHsKLSAgICByZXR1cm4gJm90aGVyX3N0cmVhbXM7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gKkdldENvbm5TdHJlYW1zKCkgewotICAgIHJldHVybiAmY29ubl9zdHJlYW1zOwotICB9Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAqR2V0UmVjb25mU3RyZWFtcygpIHsKLSAgICByZXR1cm4gJnJlY29uZl9zdHJlYW1zOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVXBkYXRlPiAqR2V0TWV0YVVwZGF0ZVN0cmVhbXMoKSB7Ci0gICAgcmV0dXJuICZtZXRhX3VwZGF0ZV9zdHJlYW1zOwotICB9Ci0KLSAgY29uc3QgY2hhciogR2V0RXZlbnROYW1lKHVpbnQzMl90IGV2ZW50KSB7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJBUF9DT05ORUNUX1JFUV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQkFQX0RJU0NPTk5FQ1RfUkVRX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihCQVBfU1RBUlRfUkVRX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihCQVBfU1RPUF9SRVFfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJBUF9SRUNPTkZJR19SRVFfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJBUF9TVFJFQU1fVVBEQVRFX1JFUV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihQQUNTX0RJU0NPVkVSWV9SRVNfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFBBQ1NfQVVESU9fQ09OVEVYVF9SRVNfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEFTQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNDU19ESVNDT1ZFUllfUkVTX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihBU0NTX0FTRV9TVEFURV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNDU19BU0VfT1BfRkFJTEVEX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDSVNfR1JPVVBfU1RBVEVfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENJU19TVEFURV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQkFQX1RJTUVfT1VUX0VWVCkKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgcmV0dXJuICJVbmtub3duIEV2ZW50IjsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCBpbml0X3N0YXRlX2lkXzsKLSAgVXN0cmVhbU1hbmFnZXIgKnN0cm1fbWdyXzsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gY29ubl9zdHJlYW1zOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBvdGhlcl9zdHJlYW1zOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gcmVjb25mX3N0cmVhbXM7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVVwZGF0ZT4gbWV0YV91cGRhdGVfc3RyZWFtczsKLSAgU3RyZWFtQ29udHJvbFR5cGUgc3RyX29wc190eXBlOwotICBib29sIHBhY3NfZGlzY19zdWNjZWRlZF87Ci0gIFBhY3NEaXNjb3ZlcnkgcGFjc19kaXNjb3ZlcnlfOwotICBTdGF0ZUlkbGUgKnN0YXRlX2lkbGVfOwotICBTdGF0ZUNvbm5lY3RpbmcgKnN0YXRlX2Nvbm5lY3RpbmdfOwotICBTdGF0ZUNvbm5lY3RlZCAqc3RhdGVfY29ubmVjdGVkXzsKLSAgU3RhdGVTdGFydGluZyAqc3RhdGVfc3RhcnRpbmdfOwotICBTdGF0ZVN0cmVhbWluZyAqc3RhdGVfc3RyZWFtaW5nXzsKLSAgU3RhdGVTdG9wcGluZyAqc3RhdGVfc3RvcHBpbmdfOwotICBTdGF0ZURpc2Nvbm5lY3RpbmcgKnN0YXRlX2Rpc2Nvbm5lY3RpbmdfOwotICBTdGF0ZVJlY29uZmlndXJpbmcgKnN0YXRlX3JlY29uZmlndXJpbmdfOwotICBTdGF0ZVVwZGF0aW5nICpzdGF0ZV91cGRhdGluZ187Ci19OwotCi1zdHJ1Y3QgU3RyZWFtT3BDb25uZWN0IHsKLSAgU3RyZWFtVHlwZSBzdHJlYW1fdHlwZTsKLSAgLy9zdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gY29kZWNfY29uZmlnczsKLSAgLy9zdGQ6OnZlY3RvcjxRb3NDb25maWc+IHFvc19jb25maWdzOwotfTsKLQotc3RydWN0IFN0cmVhbU9wUmVjb25maWcgewotICBTdHJlYW1UeXBlIHN0cmVhbV90eXBlOwotICAvL3N0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBjb2RlY19jb25maWdzOwotICAvL3N0ZDo6dmVjdG9yPFFvc0NvbmZpZz4gcW9zX2NvbmZpZ3M7Ci19OwotCi11bmlvbiBTdHJlYW1PcERhdGEgewotICBTdHJlYW1PcENvbm5lY3QgY29ubmVjdF9vcDsKLSAgU3RyZWFtVHlwZSBzdHJlYW1fdHlwZTsKLSAgU3RyZWFtT3BSZWNvbmZpZyByZWNvbmZpZ19vcDsKLX07Ci0KLXN0cnVjdCBTdHJlYW1PcE5vZGUgewotICBib29sIGJ1c3k7Ci0gIGJvb2wgaXNfY2xpZW50X29yaWdpbmF0ZWQ7Ci0gIFN0cmVhbUNvbnRyb2xUeXBlIG9wc190eXBlOwotICBTdHJlYW1PcERhdGEgb3BzX2RhdGE7Ci19OwotCi1zdHJ1Y3QgU3RyZWFtSWRUeXBlIHsKLSAgdWludDhfdCBhc2VfaWQ7Ci0gIHVpbnQ4X3QgYXNlX2RpcmVjdGlvbjsKLSAgYm9vbCB2aXJ0dWFsX2F0dGFjaDsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotfTsKLQotc3RydWN0IFN0cmVhbUNvbnRleHQgewotIFN0cmVhbUNvbnRleHQoU3RyZWFtVHlwZSBzdHJtX3R5cGUpCi0gICAgIDogc3RyZWFtX3R5cGUoc3RybV90eXBlKSB7Ci0gICAgICAgc3RyZWFtX3N0YXRlID0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRDsKLSAgICAgICBhdHRhY2hlZF9zdGF0ZSA9IFN0cmVhbUF0dGFjaGVkU3RhdGU6OklETEU7Ci0gICAgIH0KLSAgU3RyZWFtVHlwZSBzdHJlYW1fdHlwZTsKLSAgU3RyZWFtQXR0YWNoZWRTdGF0ZSBhdHRhY2hlZF9zdGF0ZTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtSWRUeXBlPiBzdHJlYW1faWRzOwotICBTdHJlYW1TdGF0ZSBzdHJlYW1fc3RhdGU7Ci0gIEludENvbm5lY3RTdGF0ZSBjb25uZWN0aW9uX3N0YXRlOwotICBDb2RlY0NvbmZpZyBjb2RlY19jb25maWc7Ci0gIFFvc0NvbmZpZyBxb3NfY29uZmlnOwotICBRb3NDb25maWcgcmVxX3Fvc19jb25maWc7Ci19OwotCi1jbGFzcyBTdHJlYW1Db250ZXh0cyB7Ci0gcHVibGljOgotCi0gIFN0cmVhbUNvbnRleHQgKkZpbmRCeVR5cGUoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSk7Ci0KLSAgU3RyZWFtQ29udGV4dCAqRmluZE9yQWRkQnlUeXBlKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpOwotCi0gIHZvaWQgUmVtb3ZlKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpOwotCi0gIGJvb2wgSXNBc2VBdHRhY2hlZChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKTsKLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1Db250ZXh0ICo+IEZpbmRCeUFzZUF0dGFjaGVkU3RhdGUodWludDE2X3QgYXNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQXR0YWNoZWRTdGF0ZSBzdGF0ZSk7Ci0KLQotICBTdHJlYW1Db250ZXh0KiBGaW5kQnlBc2VJZCh1aW50MTZfdCBhc2VfaWQpOwotCi0gIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbnRleHQgKj4gKkdldEFsbENvbnRleHRzKCkgewotICAgIHJldHVybiAmc3RybV9jb250ZXh0czsKLSAgfQotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKHN0cm1fY29udGV4dHMuc2l6ZSgpKTsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29udGV4dCAqPiBzdHJtX2NvbnRleHRzOwotfTsKLQotCi1jbGFzcyBTdHJlYW1PcHNRdWV1ZSB7Ci0gcHVibGljOgotICBib29sIEFkZChTdHJlYW1PcE5vZGUgb3Bfbm9kZSk7Ci0KLSAgYm9vbCBBZGRGaXJzdChTdHJlYW1PcE5vZGUgb3Bfbm9kZSk7Ci0KLSAgU3RyZWFtT3BOb2RlICpHZXROZXh0Tm9kZSgpOwotCi0gIGJvb2wgUmVtb3ZlKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpOwotCi0gIFN0cmVhbU9wTm9kZSogRmluZEJ5Q29udGV4dChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKTsKLQotICBib29sIENoYW5nZU9wVHlwZShTdHJlYW1UeXBlIHN0cmVhbV90eXBlLCBTdHJlYW1Db250cm9sVHlwZSBuZXdfb3BzX3R5cGUpOwotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKHF1ZXVlLnNpemUoKSk7IH0KLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1PcE5vZGU+IHF1ZXVlOwotfTsKLQotY2xhc3MgU3RyZWFtVHJhY2tlcnMgewotIHB1YmxpYzoKLSAgU3RyZWFtVHJhY2tlciAqRmluZE9yQWRkQnlUeXBlKGludCBpbml0X3N0YXRlX2lkLCBVc3RyZWFtTWFuYWdlciAqc3RybV9tZ3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubmVjdF9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZpZ19zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gKnN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZSBvcHNfdHlwZSk7Ci0KLSAgYm9vbCBSZW1vdmUoc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RyZWFtcywKLSAgICAgICAgICAgICAgU3RyZWFtQ29udHJvbFR5cGUgb3BzX3R5cGUpOwotCi0gIHZvaWQgUmVtb3ZlQnlTdGF0ZXMoc3RkOjp2ZWN0b3I8aW50PiBzdGF0ZV9pZHMpOwotCi0gIHN0ZDo6bWFwPFN0cmVhbVRyYWNrZXIgKiAsIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ID4gR2V0VHJhY2tlcnNCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gKnN0cmVhbXMpOwotCi0gIFN0cmVhbVRyYWNrZXIgKkZpbmRCeVN0cmVhbXNUeXBlKHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdHJlYW1zKTsKLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1UcmFja2VyICo+IEdldFRyYWNrZXJzQnlTdGF0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN0YXRlX2lkcyk7Ci0KLSAgYm9vbCBDaGFuZ2VPcFR5cGUoIFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZSBuZXdfb3BzX3R5cGUpOwotCi0gIGJvb2wgSXNTdHJlYW1UcmFja2VyVmFsaWQoU3RyZWFtVHJhY2tlciogVHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdGF0ZV9pZHMpOwotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKHN0cmVhbV90cmFja2Vycy5zaXplKCkpOyB9Ci0KLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVHJhY2tlciAqPiBzdHJlYW1fdHJhY2tlcnM7Ci19OwotCi1zdHJ1Y3QgVWNhc3RBdWRpb1N0cmVhbSB7Ci0gIFVjYXN0QXVkaW9TdHJlYW0odWludDhfdCBhc2VfaWQsIHVpbnQ4X3QgYXNlX3N0YXRlLCB1aW50OF90IGFzZV9kaXJlY3Rpb24pCi0gICAgIDogYXNlX2lkKGFzZV9pZCkgLCBhc2Vfc3RhdGUoYXNlX3N0YXRlKSB7Ci0gICAgYXNlX3N0YXRlID0gYXNjczo6QVNFX1NUQVRFX0lOVkFMSUQ7Ci0gICAgY2lnX3N0YXRlID0gQ2lnU3RhdGU6OklOVkFMSUQ7Ci0gICAgY2lzX3N0YXRlID0gQ2lzU3RhdGU6OklOVkFMSUQ7Ci0gICAgZGlyZWN0aW9uID0gYXNlX2RpcmVjdGlvbjsKLSAgICBjaWdfaWQgPSAwWEZGOwotICAgIGNpc19pZCA9IDB4RkY7Ci0gICAgY2lzX3JldHJ5X2NvdW50ID0gMDsKLSAgICBvdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICBhc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICBjaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpOT05FOwotICB9Ci0gIGJvb2wgaXNfYWN0aXZlOwotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCBhc2Vfc3RhdGU7Ci0gIEFzZVBhcmFtcyBhc2VfcGFyYW1zOwotICBBc2VDb2RlY0NvbmZpZ1BhcmFtcyBwcmVmX3Fvc19wYXJhbXM7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICBDaWdTdGF0ZSBjaWdfc3RhdGU7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotICBDaXNTdGF0ZSBjaXNfc3RhdGU7Ci0gIHVpbnQ4X3QgY2lzX3JldHJ5X2NvdW50OwotICBpbnQgb3ZlcmFsbF9zdGF0ZTsgLy8gc3RyZWFtIHRyYWNrZXIgc3RhdGUKLSAgU3RyZWFtQ29udHJvbFR5cGUgY29udHJvbF90eXBlOwotICBBc2NzUGVuZGluZ0NtZCAgYXNlX3BlbmRpbmdfY21kOwotICBDaXNQZW5kaW5nQ21kIGNpc19wZW5kaW5nX2NtZDsKLSAgdWludDE2X3QgYXVkaW9fY29udGV4dDsKLSAgdWludDhfdCBkaXJlY3Rpb247Ci0gIHVpbnQzMl90IGF1ZGlvX2xvY2F0aW9uOwotICBDb2RlY0NvbmZpZyBjb2RlY19jb25maWc7Ci0gIFFvc0NvbmZpZyBxb3NfY29uZmlnOwotICBRb3NDb25maWcgcmVxX3Fvc19jb25maWc7Ci19OwotCi1jbGFzcyBVY2FzdEF1ZGlvU3RyZWFtcyB7Ci0gcHVibGljOgotCi0gIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gRmluZEJ5Q2lnSWQodWludDhfdCBjaWdfaWQsIGludCBzdGF0ZSkgewotICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gc3RyZWFtczsKLSAgICBmb3IgKGF1dG8gaSA9IGF1ZGlvX3N0cmVhbXMuYmVnaW4oKTsgaSAhPSBhdWRpb19zdHJlYW1zLmVuZCgpO2krKykgewotICAgICAgaWYoKCppKS0+Y2lnX2lkICA9PSBjaWdfaWQgJiYKLSAgICAgICAgICgqaSktPm92ZXJhbGxfc3RhdGUgID09IHN0YXRlKSB7Ci0gICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKCppKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmVhbXM7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxVY2FzdEF1ZGlvU3RyZWFtICo+IEZpbmRCeUNpc0lkKHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCkgewotICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gc3RyZWFtczsKLSAgICBmb3IgKGF1dG8gaSA9IGF1ZGlvX3N0cmVhbXMuYmVnaW4oKTsgaSAhPSBhdWRpb19zdHJlYW1zLmVuZCgpO2krKykgewotICAgICAgaWYoKCppKS0+Y2lnX2lkICA9PSBjaWdfaWQgJiYgKCppKS0+Y2lzX2lkICA9PSBjaXNfaWQpIHsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soKmkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RyZWFtczsKLSAgfQotCi0gIFVjYXN0QXVkaW9TdHJlYW0gKkZpbmRCeVN0cmVhbVR5cGUodWludDE2X3QgYXVkaW9fY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbikgewotICAgIGF1dG8gaXQgPSBhdWRpb19zdHJlYW1zLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGF1ZGlvX3N0cmVhbXMuZW5kKCkpIHsKLSAgICAgIGlmKCgqaXQpLT5hdWRpb19jb250ZXh0ICA9PSBhdWRpb19jb250ZXh0ICYmCi0gICAgICAgICAoKml0KS0+ZGlyZWN0aW9uICYgZGlyZWN0aW9uKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaXQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIChpdCA9PSBhdWRpb19zdHJlYW1zLmVuZCgpKSA/IG51bGxwdHIgOiAoKml0KTsKLSAgfQotCi0gIFVjYXN0QXVkaW9TdHJlYW0gKkZpbmRCeUNpc0lkQW5kRGlyKHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaXIpIHsKLSAgICBhdXRvIGl0ID0gYXVkaW9fc3RyZWFtcy5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBhdWRpb19zdHJlYW1zLmVuZCgpKSB7Ci0gICAgICBpZigoKml0KS0+Y2lnX2lkICA9PSBjaWdfaWQgJiYgKCppdCktPmNpc19pZCAgPT0gY2lzX2lkICYmCi0gICAgICAgICAoKml0KS0+ZGlyZWN0aW9uICYgZGlyKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaXQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIChpdCA9PSBhdWRpb19zdHJlYW1zLmVuZCgpKSA/IG51bGxwdHIgOiAoKml0KTsKLSAgfQotCi0gIFVjYXN0QXVkaW9TdHJlYW0gKkZpbmRCeUFzZUlkKHVpbnQ4X3QgYXNlX2lkKSB7Ci0gICAgYXV0byBpdCA9IGF1ZGlvX3N0cmVhbXMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0gYXVkaW9fc3RyZWFtcy5lbmQoKSkgewotICAgICAgaWYoKCppdCktPmFzZV9pZCAgPT0gYXNlX2lkKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaXQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIChpdCA9PSBhdWRpb19zdHJlYW1zLmVuZCgpKSA/IG51bGxwdHIgOiAoKml0KTsKLSAgfQotCi0gIFVjYXN0QXVkaW9TdHJlYW0gKkZpbmRPckFkZEJ5QXNlSWQodWludDhfdCBhc2VfaWQsIHVpbnQ4X3QgYXNlX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXNlX2RpcmVjdGlvbikgewotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihhdWRpb19zdHJlYW1zLmJlZ2luKCksIGF1ZGlvX3N0cmVhbXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgWyZhc2VfaWQsICZhc2VfZGlyZWN0aW9uXShVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmVhbS0+YXNlX2lkID09IGFzZV9pZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5kaXJlY3Rpb24gPT0gYXNlX2RpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoaXRlciA9PSBhdWRpb19zdHJlYW1zLmVuZCgpKSB7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBuZXcgVWNhc3RBdWRpb1N0cmVhbShhc2VfaWQsIGFzZV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZV9kaXJlY3Rpb24pOwotICAgICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICAgIGF1ZGlvX3N0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7Ci0gICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKGF1ZGlvX3N0cmVhbXMuYmVnaW4oKSwgYXVkaW9fc3RyZWFtcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJmFzZV9pZCwgJmFzZV9kaXJlY3Rpb25dKFVjYXN0QXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RyZWFtLT5hc2VfaWQgPT0gYXNlX2lkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmRpcmVjdGlvbiA9PSBhc2VfZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgIHJldHVybiAoaXQgPT0gYXVkaW9fc3RyZWFtcy5lbmQoKSkgPyBudWxscHRyIDogKCppdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoKml0ZXIpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gR2V0U3RyZWFtc0J5U3RhdGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gc3RhdGVfaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlyZWN0aW9ucykgewotICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gc3RyZWFtczsKLSAgICBmb3IgKGF1dG8gaSA9IGF1ZGlvX3N0cmVhbXMuYmVnaW4oKTsgaSAhPSBhdWRpb19zdHJlYW1zLmVuZCgpO2krKykgewotICAgICAgZm9yIChhdXRvIGogPSBzdGF0ZV9pZHMuYmVnaW4oKTsgaiAhPSBzdGF0ZV9pZHMuZW5kKCk7aisrKSB7Ci0gICAgICAgIGlmKCgoKmkpLT5vdmVyYWxsX3N0YXRlID09ICpqKSAmJiAoKCppKS0+ZGlyZWN0aW9uICYgZGlyZWN0aW9ucykpIHsKLSAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjaygqaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmVhbXM7Ci0gIH0KLQotICB2b2lkIFJlbW92ZSh1aW50OF90IGFzZV9pZCkgewotICAgIGZvciAoYXV0byBpdCA9IGF1ZGlvX3N0cmVhbXMuYmVnaW4oKTsgaXQgIT0gYXVkaW9fc3RyZWFtcy5lbmQoKTspIHsKLSAgICAgIGlmICgoKml0KS0+YXNlX2lkID09IGFzZV9pZCkgIHsKLSAgICAgICAgZGVsZXRlKCppdCk7Ci0gICAgICAgIGl0ID0gYXVkaW9fc3RyZWFtcy5lcmFzZShpdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpdCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gKkdldEFsbFN0cmVhbXMoKSB7Ci0gICAgcmV0dXJuICZhdWRpb19zdHJlYW1zOwotICB9Ci0KLSAgc2l6ZV90IHNpemUoKSB7IHJldHVybiAoYXVkaW9fc3RyZWFtcy5zaXplKCkpOyB9Ci0gIC8vIFVjYXN0QXVkaW9TdHJlYW0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxVY2FzdEF1ZGlvU3RyZWFtICo+IGF1ZGlvX3N0cmVhbXM7Ci19OwotCi1zdHJ1Y3QgR2F0dFBlbmRpbmdEYXRhIHsKLSAgR2F0dFBlbmRpbmdEYXRhKCkgewotICAgICAgICBhc2NzX3BlbmRpbmdfY21kID0gR2F0dFBlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgIHBhY3NfcGVuZGluZ19jbWQgPSBHYXR0UGVuZGluZ0NtZDo6Tk9ORTsKLSAgfQotICBHYXR0UGVuZGluZ0NtZCBhc2NzX3BlbmRpbmdfY21kOwotICBHYXR0UGVuZGluZ0NtZCBwYWNzX3BlbmRpbmdfY21kOwotfTsKLQotY2xhc3MgVXN0cmVhbU1hbmFnZXIgewotIHB1YmxpYzoKLSAgIFVzdHJlYW1NYW5hZ2VyKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIFBhY3NDbGllbnQgKnBhY3NfY2xpZW50LAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCwgQ2lzSW50ZXJmYWNlICpjaXNfaW50ZiwKLSAgICAgICAgICAgICAgICAgIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICBCYXBBbGFybSAqYmFwX2FsYXJtKQotICAgICAgIDogYWRkcmVzcyhhZGRyZXNzKSAsIHBhY3NfY2xpZW50KHBhY3NfY2xpZW50KSwKLSAgICAgICAgIHBhY3NfY2xpZW50X2lkKHBhY3NfY2xpZW50X2lkKSwKLSAgICAgICAgIGFzY3NfY2xpZW50KGFzY3NfY2xpZW50KSwgY2lzX2ludGYoY2lzX2ludGYpLAotICAgICAgICAgdWNsX2NhbGxiYWNrcyhjYWxsYmFja3MpLCBiYXBfYWxhcm0oYmFwX2FsYXJtKSB7Ci0gICAgIHBhY3Nfc3RhdGUgPSBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRDsKLSAgICAgZ2F0dF9wZW5kaW5nX2RhdGEucGFjc19wZW5kaW5nX2NtZCA9IEdhdHRQZW5kaW5nQ21kOjpOT05FOwotICAgICBnYXR0X3BlbmRpbmdfZGF0YS5hc2NzX3BlbmRpbmdfY21kID0gR2F0dFBlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgIGFzY3Nfc3RhdGUgPSBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRDsKLSAgICAgZGV2X3R5cGUgPSBEZXZpY2VUeXBlOjpOT05FOwotICAgfQotCi0gICBib29sIFB1c2hFdmVudFRvVHJhY2tlcih1aW50MzJfdCBldmVudCwgdm9pZCAqcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3RhdGVfaWRzKTsKLQotICAgc3RkOjptYXA8aW50ICwgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gPiBTcGxpdENvbnRleHRPblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RyZWFtcyk7Ci0KLSAgIHZvaWQgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpOwotCi0gICB1aW50MTZfdCBHZXRDb25uSWQoKTsKLQotICAgc3RkOjpsaXN0PHVpbnQxNl90PiBHZXRDaWdJZCgpOwotCi0gICBzdGQ6Omxpc3Q8dWludDE2X3Q+IEdldENpc0lkKCk7Ci0KLSAgIHZvaWQgUmVwb3J0U3RyZWFtU3RhdGUgKHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RyZWFtX2luZm8pOwotCi0gICBSYXdBZGRyZXNzICZHZXRBZGRyZXNzKCkgeyByZXR1cm4gYWRkcmVzczsgfTsKLQotICAgUGFjc0NsaWVudCAqR2V0UGFjc0NsaWVudCgpIHsKLSAgICAgcmV0dXJuIHBhY3NfY2xpZW50OwotICAgfQotCi0gICB1aW50MTZfdCBHZXRQYWNzQ2xpZW50SWQoKSB7Ci0gICAgIHJldHVybiBwYWNzX2NsaWVudF9pZDsKLSAgIH0KLQotICAgR2F0dFBlbmRpbmdEYXRhICpHZXRHYXR0UGVuZGluZ0RhdGEoKSB7Ci0gICAgIHJldHVybiAmZ2F0dF9wZW5kaW5nX2RhdGE7Ci0gICB9Ci0KLSAgIGJvb2wgVXBkYXRlUGFjc1N0YXRlKENvbm5lY3Rpb25TdGF0ZSBzdGF0ZSkgewotICAgICBwYWNzX3N0YXRlID0gc3RhdGU7Ci0gICAgIHJldHVybiB0cnVlOwotICAgfQotCi0gICBib29sIFVwZGF0ZUFzY3NTdGF0ZShHYXR0U3RhdGUgc3RhdGUpIHsKLSAgICAgYXNjc19zdGF0ZSA9IHN0YXRlOwotICAgICByZXR1cm4gdHJ1ZTsKLSAgIH0KLQotICAgQ29ubmVjdGlvblN0YXRlIEdldFBhY3NTdGF0ZSgpIHsKLSAgICAgcmV0dXJuIHBhY3Nfc3RhdGU7Ci0gICB9Ci0KLSAgIEdhdHRTdGF0ZSBHZXRBc2NzU3RhdGUoKSB7Ci0gICAgIHJldHVybiBhc2NzX3N0YXRlOwotICAgfQotCi0gICBBc2NzQ2xpZW50ICpHZXRBc2NzQ2xpZW50KCkgewotICAgICByZXR1cm4gYXNjc19jbGllbnQ7Ci0gICB9Ci0KLSAgIENpc0ludGVyZmFjZSAqR2V0Q2lzSW50ZXJmYWNlKCkgewotICAgICByZXR1cm4gY2lzX2ludGY7Ci0gICB9Ci0KLSAgIEJhcEFsYXJtICpHZXRCYXBBbGFybSgpIHsKLSAgICAgcmV0dXJuIGJhcF9hbGFybTsKLSAgIH0KLQotICAgVWNhc3RBdWRpb1N0cmVhbXMgKkdldEF1ZGlvU3RyZWFtcygpIHsKLSAgICAgcmV0dXJuICAmYXVkaW9fc3RyZWFtczsKLSAgIH0KLQotICAgU3RyZWFtVHJhY2tlcnMgKkdldFN0cmVhbVRyYWNrZXJzKCkgewotICAgICByZXR1cm4gJnN0cmVhbV90cmFja2VyczsKLSAgIH0KLQotICAgU3RyZWFtQ29udGV4dHMgKkdldFN0cmVhbUNvbnRleHRzKCkgewotICAgICByZXR1cm4gJnN0cmVhbV9jb250ZXh0czsKLSAgIH0KLQotICAgVWNhc3RDbGllbnRDYWxsYmFja3MgKkdldFVjbGllbnRDYmFja3MoKSB7Ci0gICAgIHJldHVybiB1Y2xfY2FsbGJhY2tzOwotICAgfQotCi0gICB2b2lkIFVwZGF0ZURldlR5cGUoRGV2aWNlVHlwZSBkZXZpY2VfdHlwZSkgewotICAgICBkZXZfdHlwZSA9IGRldmljZV90eXBlOwotICAgfQotCi0gICBEZXZpY2VUeXBlIEdldERldlR5cGUoKSB7Ci0gICAgIHJldHVybiBkZXZfdHlwZTsKLSAgIH0KLQotICBjb25zdCBjaGFyKiBHZXRFdmVudE5hbWUodWludDMyX3QgZXZlbnQpIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBDQVNFX1JFVFVSTl9TVFIoQkFQX0NPTk5FQ1RfUkVRX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihCQVBfRElTQ09OTkVDVF9SRVFfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJBUF9TVEFSVF9SRVFfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEJBUF9TVE9QX1JFUV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQkFQX1JFQ09ORklHX1JFUV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQkFQX1NUUkVBTV9VUERBVEVfUkVRX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihQQUNTX0NPTk5FQ1RJT05fU1RBVEVfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFBBQ1NfRElTQ09WRVJZX1JFU19FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoUEFDU19BVURJT19DT05URVhUX1JFU19FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNDU19DT05ORUNUSU9OX1NUQVRFX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihBU0NTX0RJU0NPVkVSWV9SRVNfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEFTQ1NfQVNFX1NUQVRFX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihBU0NTX0FTRV9PUF9GQUlMRURfRVZUKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENJU19HUk9VUF9TVEFURV9FVlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0lTX1NUQVRFX0VWVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihCQVBfVElNRV9PVVRfRVZUKQotICAgICAgZGVmYXVsdDoKLSAgICAgICByZXR1cm4gIlVua25vd24gRXZlbnQiOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgIFJhd0FkZHJlc3MgYWRkcmVzczsKLSAgIFBhY3NDbGllbnQgKnBhY3NfY2xpZW50OwotICAgdWludDE2X3QgcGFjc19jbGllbnRfaWQ7Ci0gICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudDsKLSAgIENvbm5lY3Rpb25TdGF0ZSBwYWNzX3N0YXRlOwotICAgQ2lzSW50ZXJmYWNlICpjaXNfaW50ZjsKLSAgIEdhdHRTdGF0ZSBhc2NzX3N0YXRlOwotICAgU3RyZWFtT3BzUXVldWUgb3BzX3F1ZXVlOwotICAgVWNhc3RBdWRpb1N0cmVhbXMgYXVkaW9fc3RyZWFtczsKLSAgIFN0cmVhbVRyYWNrZXJzIHN0cmVhbV90cmFja2VyczsKLSAgIFN0cmVhbUNvbnRleHRzIHN0cmVhbV9jb250ZXh0czsKLSAgIEdhdHRQZW5kaW5nRGF0YSBnYXR0X3BlbmRpbmdfZGF0YTsKLSAgIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiB1Y2xfY2FsbGJhY2tzOwotICAgQmFwQWxhcm0gKmJhcF9hbGFybTsKLSAgIERldmljZVR5cGUgZGV2X3R5cGU7Ci19OwotCi1jbGFzcyBVc3RyZWFtTWFuYWdlcnMgewotIHB1YmxpYzoKLSAgVXN0cmVhbU1hbmFnZXIqIEZpbmRCeUFkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLSAgVXN0cmVhbU1hbmFnZXIqIEZpbmRvckFkZEJ5QWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgUGFjc0NsaWVudCAqcGFjc19jbGllbnQsIHVpbnQxNl90IHBhY3NfY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQsIENpc0ludGVyZmFjZSAqY2lzX2ludGYsCi0gICAgICAgICAgICAgICAgICBVY2FzdENsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzLCBCYXBBbGFybSogYmFwX2FsYXJtKTsKLQotCi0gIHN0ZDo6dmVjdG9yPFVzdHJlYW1NYW5hZ2VyICo+ICpHZXRBbGxNYW5hZ2VycygpOwotCi0gIHZvaWQgUmVtb3ZlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKHN0cm1fbWdycy5zaXplKCkpOyB9Ci0KLSAgc3RkOjp2ZWN0b3I8VXN0cmVhbU1hbmFnZXIgKj4gc3RybV9tZ3JzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHVjYXN0Ci19ICAvLyBuYW1lc3BhY2UgYmFwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X2FsYXJtLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvdWNsaWVudF9hbGFybS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhNmVmYS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X2FsYXJtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAidWNsaWVudF9hbGFybS5oIgotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jZGVmaW5lIExPR19UQUcgInVjbGllbnRfYWxhcm0iCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgYWxhcm0gewotCi1jbGFzcyBCYXBBbGFybUltcGw7Ci1CYXBBbGFybUltcGwgKmluc3RhbmNlOwotCi1zdGF0aWMgdm9pZCBhbGFybV9oYW5kbGVyKHZvaWQqIGRhdGEpOwotCi1jbGFzcyBCYXBBbGFybUltcGwgOiBwdWJsaWMgQmFwQWxhcm0gewotICBwdWJsaWM6Ci0gICAgQmFwQWxhcm1JbXBsKEJhcEFsYXJtQ2FsbGJhY2tzKiBjYWxsYmFjayk6Ci0gICAgICAgY2FsbGJhY2tzKGNhbGxiYWNrKSAgeyB9Ci0KLSAgICB+QmFwQWxhcm1JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gICAgdm9pZCBDbGVhblVwICgpIHsgfQotCi0gICAgYWxhcm1fdCogQ3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICAgIHJldHVybiBhbGFybV9uZXcobmFtZSk7Ci0gICAgfQotCi0gICAgdm9pZCBEZWxldGUoYWxhcm1fdCogYWxhcm0pIHsKLSAgICAgIGFsYXJtX2ZyZWUoYWxhcm0pOwotICAgIH0KLQotICAgIHZvaWQgU3RhcnQoYWxhcm1fdCogYWxhcm0sIHBlcmlvZF9tc190IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICAgICAgYWxhcm1fc2V0X29uX21sb29wKGFsYXJtLCBpbnRlcnZhbF9tcywgYWxhcm1faGFuZGxlciwgZGF0YSk7Ci0gICAgfQotCi0gICAgdm9pZCBTdG9wKGFsYXJtX3QqIGFsYXJtKSB7Ci0gICAgICBhbGFybV9jYW5jZWwoYWxhcm0pOwotICAgIH0KLQotICAgIGJvb2wgSXNTY2hlZHVsZWQoY29uc3QgYWxhcm1fdCogYWxhcm0pIHsKLSAgICAgIHJldHVybiBhbGFybV9pc19zY2hlZHVsZWQoYWxhcm0pOwotICAgIH0KLQotICAgIHZvaWQgVGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gICAgICBpZiAoY2FsbGJhY2tzKQotICAgICAgICBjYWxsYmFja3MtPk9uVGltZW91dChkYXRhKTsgLy8gQ2FsbCB1Y2xpZW50X21haW4KLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBCYXBBbGFybUNhbGxiYWNrcyAqY2FsbGJhY2tzOwotfTsKLQotdm9pZCBCYXBBbGFybTo6SW5pdGlhbGl6ZSgKLSAgICAgICAgICAgICAgICAgICBCYXBBbGFybUNhbGxiYWNrcyogY2FsbGJhY2tzKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIExPRyhFUlJPUikgPDwgIkFscmVhZHkgaW5pdGlhbGl6ZWQhIjsKLSAgfSBlbHNlIHsKLSAgICBpbnN0YW5jZSA9IG5ldyBCYXBBbGFybUltcGwoY2FsbGJhY2tzKTsKLSAgfQotfQotCi12b2lkIEJhcEFsYXJtOjpDbGVhblVwKCkgewotICBCYXBBbGFybUltcGwqIHB0ciA9IGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0gIHB0ci0+Q2xlYW5VcCgpOwotICBkZWxldGUgcHRyOwotfQotCi1CYXBBbGFybSogQmFwQWxhcm06OkdldCgpIHsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi1zdGF0aWMgdm9pZCBhbGFybV9oYW5kbGVyKHZvaWQqIGRhdGEpIHsKLSAgaWYgKGluc3RhbmNlKQotICAgIGluc3RhbmNlLT5UaW1lb3V0KGRhdGEpOwotfQotCi19IC8vYWxhcm0KLX0gLy9iYXAKLX0gLy9ibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL3VjbGllbnRfYWxhcm0uaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL3VjbGllbnRfYWxhcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwM2Q5NC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X2FsYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmFwIHsKLW5hbWVzcGFjZSBhbGFybSB7Ci0KLWNsYXNzIEJhcEFsYXJtQ2FsbGJhY2tzIHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgfkJhcEFsYXJtQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gICAgLyoqIENhbGxiYWNrIGZvciB0aW1lciB0aW1lb3V0ICovCi0gICAgdmlydHVhbCB2b2lkIE9uVGltZW91dCh2b2lkKiBkYXRhKSA9IDA7Ci19OwotCi1jbGFzcyBCYXBBbGFybSB7Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5CYXBBbGFybSgpID0gZGVmYXVsdDsKLQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoQmFwQWxhcm1DYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0gICAgc3RhdGljIHZvaWQgQ2xlYW5VcCgpOwotICAgIHN0YXRpYyBCYXBBbGFybSogR2V0KCk7Ci0KLSAgICB2aXJ0dWFsIGFsYXJtX3QqIENyZWF0ZShjb25zdCBjaGFyKiBuYW1lKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVsZXRlKGFsYXJtX3QqIGFsYXJtKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU3RhcnQoYWxhcm1fdCogYWxhcm0sIHBlcmlvZF9tc190IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIFN0b3AoYWxhcm1fdCogYWxhcm0pID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBJc1NjaGVkdWxlZChjb25zdCBhbGFybV90KiBhbGFybSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIFRpbWVvdXQodm9pZCogZGF0YSkgPSAwOwotfTsKLQotfSAvL2FsYXJtCi19IC8vYmFwCi19IC8vYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X21haW4uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjFjMzkuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvdWNsaWVudF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImJ0YV9iYXBfdWNsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJ1Y2FzdF9jbGllbnRfaW50LmgiCi0jaW5jbHVkZSAiYnRhX3BhY3NfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0YV9hc2NzX2NsaWVudF9hcGkuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9wYWNzX2NsaWVudC5oPgotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlICJidGFfY2xvc3VyZV9hcGkuaCIKLSNpbmNsdWRlICJidF90cmFjZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIHVjYXN0IHsKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBiYXNlOjpDbG9zdXJlOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudENhbGxiYWNrczsKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzY3NDbGllbnQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6R2F0dFN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzY3NDbGllbnRDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlT3BJZDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VPcFN0YXR1czsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VQYXJhbXM7Ci0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VXN0cmVhbU1hbmFnZXJzOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpVc3RyZWFtTWFuYWdlcjsKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpCYXBFdmVudERhdGE7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkJhcEV2ZW50OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpCYXBDb25uZWN0OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpCYXBEaXNjb25uZWN0OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpCYXBTdGFydDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6QmFwU3RvcDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6QmFwUmVjb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlBhY3NDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlBhY3NEaXNjb3Zlcnk7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlBhY3NBdmFpbGFibGVDb250ZXh0czsKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDaXNHcm91cFN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDaXNTdHJlYW1TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpjaXM6OkNpZ1N0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmNpczo6Q2lzU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6Y2lzOjpDaXNJbnRlcmZhY2U7Ci0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjphbGFybTo6QmFwQWxhcm07Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YWxhcm06OkJhcEFsYXJtQ2FsbGJhY2tzOwotCi1jbGFzcyBVY2FzdENsaWVudEltcGw7Ci1VY2FzdENsaWVudEltcGwqIGluc3RhbmNlID0gbnVsbHB0cjsKLQotY2xhc3MgQ2lzSW50ZXJmYWNlQ2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBDaXNJbnRlcmZhY2VDYWxsYmFja3MgewotICBwdWJsaWM6Ci0gICAgfkNpc0ludGVyZmFjZUNhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gICAgICAgIC8qKiBDYWxsYmFjayBmb3IgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UgKi8KLSAgICB2b2lkIE9uQ2lnU3RhdGUodWludDhfdCBjaWdfaWQsIENpZ1N0YXRlIHN0YXRlKSB7Ci0gICAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQ2lzSW50ZXJmYWNlQ2FsbGJhY2tzOjpPbkNpZ1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLCBjaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSkpOwotCi0gICAgfQotCi0gICAgdm9pZCBPbkNpc1N0YXRlKHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCwKLSAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbiwgQ2lzU3RhdGUgc3RhdGUpIHsKLSAgICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZDaXNJbnRlcmZhY2VDYWxsYmFja3M6Ok9uQ2lzU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFVjYXN0Q2xpZW50OjpHZXQoKSksIGNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpc19pZCwgZGlyZWN0aW9uLCBzdGF0ZSkpOwotICAgIH0KLX07Ci0KLWNsYXNzIFBhY3NDbGllbnRDYWxsYmFja3NJbXBsIDogcHVibGljIFBhY3NDbGllbnRDYWxsYmFja3MgewotICBwdWJsaWM6Ci0gICAgflBhY3NDbGllbnRDYWxsYmFja3NJbXBsKCkgPSBkZWZhdWx0OwotICAgIHZvaWQgT25Jbml0aWFsaXplZChpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RhdHVzID0iIDw8IGxvZ2hleChzdGF0dXMpOwotICAgICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlBhY3NDbGllbnRDYWxsYmFja3M6Ok9uSW5pdGlhbGl6ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFVjYXN0Q2xpZW50OjpHZXQoKSksIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCkpOwotICAgIH0KLQotICAgIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvbm5lY3Rpb25TdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzOwotICAgICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlBhY3NDbGllbnRDYWxsYmFja3M6Ok9uQ29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgc3RhdGUpKTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uQXVkaW9Db250ZXh0QXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF2YWlsYWJsZV9jb250ZXh0cykgb3ZlcnJpZGUgewotICAgICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJlBhY3NDbGllbnRDYWxsYmFja3M6Ok9uQXVkaW9Db250ZXh0QXZhaWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoVWNhc3RDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBhdmFpbGFibGVfY29udGV4dHMpKTsKLSAgICB9Ci0KLSAgICB2b2lkIE9uU2VhcmNoQ29tcGxldGUoaW50IHN0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IHNpbmtfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBzcmNfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdmFpbGFibGVfY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1cHBvcnRlZF9jb250ZXh0cykgb3ZlcnJpZGUgewotICAgICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlBhY3NDbGllbnRDYWxsYmFja3M6Ok9uU2VhcmNoQ29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFVjYXN0Q2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2NvbnRleHRzKSk7Ci0gICAgfQotfTsKLQotY2xhc3MgQXNjc0NsaWVudENhbGxiYWNrc0ltcGwgOiBwdWJsaWMgQXNjc0NsaWVudENhbGxiYWNrcyB7Ci0gIHB1YmxpYzoKLSAgICB+QXNjc0NsaWVudENhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gICAgdm9pZCBPbkFzY3NJbml0aWFsaXplZChpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudENhbGxiYWNrczo6T25Bc2NzSW5pdGlhbGl6ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFVjYXN0Q2xpZW50OjpHZXQoKSksIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCkpOwotICAgIH0KLQotICAgIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkdhdHRTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudENhbGxiYWNrczo6T25Db25uZWN0aW9uU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFVjYXN0Q2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBzdGF0ZSkpOwotICAgIH0KLQotICAgIHZvaWQgT25Bc2VPcEZhaWxlZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2VPcElkIGFzZV9vcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlT3BTdGF0dXM+IHN0YXR1cykgewotICAgICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJkFzY3NDbGllbnRDYWxsYmFja3M6Ok9uQXNlT3BGYWlsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGFzZV9vcF9pZCwgc3RhdHVzKSk7Ci0KLSAgICB9Ci0KLSAgICB2b2lkIE9uQXNlU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQXNlUGFyYW1zIGFzZSkgb3ZlcnJpZGUgewotICAgICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJpbmQoJkFzY3NDbGllbnRDYWxsYmFja3M6Ok9uQXNlU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGFzZSkpOwotICAgIH0KLQotICAgIHZvaWQgT25TZWFyY2hDb21wbGV0ZShpbnQgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VQYXJhbXM+IHNpbmtfYXNlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVBhcmFtcz4gc3JjX2FzZV9saXN0KSBvdmVycmlkZSB7Ci0gICAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudENhbGxiYWNrczo6T25TZWFyY2hDb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoVWNhc3RDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWRkcmVzcywgc2lua19hc2VfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hc2VfbGlzdCkpOwotICAgIH0KLX07Ci0KLWNsYXNzIEJhcEFsYXJtQ2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBCYXBBbGFybUNhbGxiYWNrcyB7Ci0gIHB1YmxpYzoKLSAgICB+QmFwQWxhcm1DYWxsYmFja3NJbXBsKCkgPSBkZWZhdWx0OwotICAgIC8qKiBDYWxsYmFjayBmb3IgdGltZXIgdGltZW91dCAqLwotICAgIHZvaWQgT25UaW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZCYXBBbGFybUNhbGxiYWNrczo6T25UaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLCBkYXRhKSk7Ci0gICAgfQotfTsKLQotY2xhc3MgVWNhc3RDbGllbnRJbXBsIDogcHVibGljIFVjYXN0Q2xpZW50IHsKLSBwdWJsaWM6Ci0gIH5VY2FzdENsaWVudEltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQVBJcyBleHBvc2VkIGZvciB1cHBlciBsYXllcnMKLSAgdm9pZCBDb25uZWN0KHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGFkZHJlc3MsIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gc3RyZWFtcykgb3ZlcnJpZGUgewotICAgIGlmKGFkZHJlc3Muc2l6ZSgpID09IDEpIHsKLSAgICAgIFVzdHJlYW1NYW5hZ2VyICptZ3IgPSBzdHJtX21ncnMuRmluZG9yQWRkQnlBZGRyZXNzKGFkZHJlc3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY3NfY2xpZW50LCBwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjc19jbGllbnQsIGNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotICAgICAgLy8gaGFuZCBvdmVyIHRoZSByZXF1ZXN0IHRvIHN0cmVhbSBtYW5hZ2VyCi0gICAgICBCYXBDb25uZWN0IGRhdGEgPSB7IC5iZF9hZGRyID0gYWRkcmVzcywgLmlzX2RpcmVjdCA9IGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbXMgPSBzdHJlYW1zfTsKLSAgICAgIG1nci0+UHJvY2Vzc0V2ZW50KEJBUF9DT05ORUNUX1JFUV9FVlQsICZkYXRhKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXMpIG92ZXJyaWRlIHsKLSAgICBVc3RyZWFtTWFuYWdlciAqbWdyID0gc3RybV9tZ3JzLkZpbmRvckFkZEJ5QWRkcmVzcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjc19jbGllbnQsIHBhY3NfY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjc19jbGllbnQsIGNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsX2NhbGxiYWNrcywgYmFwX2FsYXJtKTsKLQotICAgIC8vIGhhbmQgb3ZlciB0aGUgcmVxdWVzdCB0byBzdHJlYW0gbWFuYWdlcgotICAgIEJhcERpc2Nvbm5lY3QgZGF0YSA9IHsgLmJkX2FkZHIgPSBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtcyA9IHN0cmVhbXN9OwotICAgIG1nci0+UHJvY2Vzc0V2ZW50KEJBUF9ESVNDT05ORUNUX1JFUV9FVlQsICZkYXRhKTsKLSAgfQotCi0gIHZvaWQgU3RhcnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zKSBvdmVycmlkZSB7Ci0gICAgVXN0cmVhbU1hbmFnZXIgKm1nciA9IHN0cm1fbWdycy5GaW5kb3JBZGRCeUFkZHJlc3MoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY3NfY2xpZW50LCBwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3NfY2xpZW50LCBjaXNfaW50ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbF9jYWxsYmFja3MsIGJhcF9hbGFybSk7Ci0KLSAgICAvLyBoYW5kIG92ZXIgdGhlIHJlcXVlc3QgdG8gc3RyZWFtIG1hbmFnZXIKLSAgICBCYXBTdGFydCBkYXRhID0geyAuYmRfYWRkciA9IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbXMgPSBzdHJlYW1zfTsKLSAgICBtZ3ItPlByb2Nlc3NFdmVudChCQVBfU1RBUlRfUkVRX0VWVCwgJmRhdGEpOwotICB9Ci0KLSAgdm9pZCBTdG9wKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zKSBvdmVycmlkZSB7Ci0gICAgVXN0cmVhbU1hbmFnZXIgKm1nciA9IHN0cm1fbWdycy5GaW5kb3JBZGRCeUFkZHJlc3MoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY3NfY2xpZW50LCBwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3NfY2xpZW50LCBjaXNfaW50ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbF9jYWxsYmFja3MsIGJhcF9hbGFybSk7Ci0KLSAgICAvLyBoYW5kIG92ZXIgdGhlIHJlcXVlc3QgdG8gc3RyZWFtIG1hbmFnZXIKLSAgICBCYXBTdG9wIGRhdGEgPSB7IC5iZF9hZGRyID0gYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW1zID0gc3RyZWFtc307Ci0gICAgbWdyLT5Qcm9jZXNzRXZlbnQoQkFQX1NUT1BfUkVRX0VWVCwgJmRhdGEpOwotCi0gIH0KLQotICB2b2lkIFJlY29uZmlndXJlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+IHN0cmVhbXMpIG92ZXJyaWRlICB7Ci0gICAgVXN0cmVhbU1hbmFnZXIgKm1nciA9IHN0cm1fbWdycy5GaW5kb3JBZGRCeUFkZHJlc3MoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY3NfY2xpZW50LCBwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3NfY2xpZW50LCBjaXNfaW50ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbF9jYWxsYmFja3MsIGJhcF9hbGFybSk7Ci0KLSAgICAvLyBoYW5kIG92ZXIgdGhlIHJlcXVlc3QgdG8gc3RyZWFtIG1hbmFnZXIKLSAgICBCYXBSZWNvbmZpZyBkYXRhID0geyAuYmRfYWRkciA9IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbXMgPSBzdHJlYW1zfTsKLSAgICBtZ3ItPlByb2Nlc3NFdmVudChCQVBfUkVDT05GSUdfUkVRX0VWVCwgJmRhdGEpOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVTdHJlYW0oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1VcGRhdGU+IHVwZGF0ZV9zdHJlYW1zKSBvdmVycmlkZSAgewotICAgIFVzdHJlYW1NYW5hZ2VyICptZ3IgPSBzdHJtX21ncnMuRmluZG9yQWRkQnlBZGRyZXNzKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNzX2NsaWVudCwgcGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzX2NsaWVudCwgY2lzX2ludGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotCi0gICAgLy8gaGFuZCBvdmVyIHRoZSByZXF1ZXN0IHRvIHN0cmVhbSBtYW5hZ2VyCi0gICAgQmFwU3RyZWFtVXBkYXRlIGRhdGEgPSB7IC5iZF9hZGRyID0gYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlX3N0cmVhbXMgPSB1cGRhdGVfc3RyZWFtc307Ci0gICAgbWdyLT5Qcm9jZXNzRXZlbnQoQkFQX1NUUkVBTV9VUERBVEVfUkVRX0VWVCwgJmRhdGEpOwotICB9Ci0KLSAgLy8gVG8gYmUgY2FsbGVkIGZyb20gZGV2aWNlIHNwZWNpZmljIHN0cmVhbSBtYW5hZ2VyCi0gIGJvb2wgUmVwb3J0U3RyZWFtU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8vVE9ETyB0byBjaGVjawotICAgIHJldHVybiB0cnVlOwotCi0gIH0KLQotICAvLyBQQUNTIGNsaWVudCByZWxhdGVkIGNhbGxiYWNrcwotICAvLyB0byBiZSBmb3J3YXJkZWQgdG8gZGV2aWNlIHNwZWNpZmljIHN0cmVhbSBtYW5hZ2VyCi0gIHZvaWQgT25Jbml0aWFsaXplZChpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFjdHVhbCBjbGllbnRfaWQgPSAiIDw8IGxvZ2hleChjbGllbnRfaWQpOwotICAgIHBhY3NfY2xpZW50X2lkID0gY2xpZW50X2lkOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzPSIgPDwgYWRkcmVzczsKLSAgICBVc3RyZWFtTWFuYWdlciAqbWdyID0gc3RybV9tZ3JzLkZpbmRvckFkZEJ5QWRkcmVzcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjc19jbGllbnQsIHBhY3NfY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjc19jbGllbnQsIGNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsX2NhbGxiYWNrcywgYmFwX2FsYXJtKTsKLSAgICAvLyBoYW5kIG92ZXIgdGhlIHJlcXVlc3QgdG8gc3RyZWFtIG1hbmFnZXIKLSAgICBQYWNzQ29ubmVjdGlvblN0YXRlIGRhdGEgPSB7IC5iZF9hZGRyID0gYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0ZSA9IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBtZ3ItPlByb2Nlc3NFdmVudChQQUNTX0NPTk5FQ1RJT05fU1RBVEVfRVZULCAmZGF0YSk7Ci0gIH0KLQotICB2b2lkIE9uQXVkaW9Db250ZXh0QXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdmFpbGFibGVfY29udGV4dHMpIG92ZXJyaWRlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogYWRkcmVzcz0iIDw8IGFkZHJlc3M7Ci0gICAgVXN0cmVhbU1hbmFnZXIgKm1nciA9IHN0cm1fbWdycy5GaW5kb3JBZGRCeUFkZHJlc3MoYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY3NfY2xpZW50LCBwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3NfY2xpZW50LCBjaXNfaW50ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbF9jYWxsYmFja3MsIGJhcF9hbGFybSk7Ci0gICAgLy8gaGFuZCBvdmVyIHRoZSByZXF1ZXN0IHRvIHN0cmVhbSBtYW5hZ2VyCi0gICAgUGFjc0F2YWlsYWJsZUNvbnRleHRzIGRhdGEgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAuYmRfYWRkciA9IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuYXZhaWxhYmxlX2NvbnRleHRzID0gYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgbWdyLT5Qcm9jZXNzRXZlbnQoUEFDU19BVURJT19DT05URVhUX1JFU19FVlQsICZkYXRhKTsKLSAgfQotCi0gIHZvaWQgT25TZWFyY2hDb21wbGV0ZShpbnQgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IHNpbmtfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2lua19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VwcG9ydGVkX2NvbnRleHRzKSBvdmVycmlkZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzOwotICAgIFVzdHJlYW1NYW5hZ2VyICptZ3IgPSBzdHJtX21ncnMuRmluZG9yQWRkQnlBZGRyZXNzKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNzX2NsaWVudCwgcGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzX2NsaWVudCwgY2lzX2ludGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotICAgIC8vIGhhbmQgb3ZlciB0aGUgcmVxdWVzdCB0byBzdHJlYW0gbWFuYWdlcgotICAgIFBhY3NEaXNjb3ZlcnkgZGF0YSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgPSBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuYmRfYWRkciA9IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuc2lua19wYWNfcmVjb3JkcyA9IHNpbmtfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuc3JjX3BhY19yZWNvcmRzID0gc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpbmtfbG9jYXRpb25zID0gc2lua19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuc3JjX2xvY2F0aW9ucyA9IHNyY19sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuYXZhaWxhYmxlX2NvbnRleHRzID0gYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1cHBvcnRlZF9jb250ZXh0cyA9IHN1cHBvcnRlZF9jb250ZXh0cwotICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgbWdyLT5Qcm9jZXNzRXZlbnQoUEFDU19ESVNDT1ZFUllfUkVTX0VWVCwgJmRhdGEpOwotICB9Ci0KLSAgLy8gQVNDUyBjbGllbnQgcmVsYXRlZCBjYWxsYmFja3MKLSAgLy8gdG8gYmUgZm9yd2FyZGVkIHRvIGRldmljZSBzcGVjaWZpYyBzdHJlYW0gbWFuYWdlcgotICB2b2lkIE9uQXNjc0luaXRpYWxpemVkKGludCBzdGF0dXMsIGludCBjbGllbnRfaWQpIG92ZXJyaWRlIHsKLQotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkdhdHRTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRyZXNzPSIgPDwgYWRkcmVzczsKLSAgICBVc3RyZWFtTWFuYWdlciAqbWdyID0gc3RybV9tZ3JzLkZpbmRvckFkZEJ5QWRkcmVzcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjc19jbGllbnQsIHBhY3NfY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjc19jbGllbnQsIGNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsX2NhbGxiYWNrcywgYmFwX2FsYXJtKTsKLSAgICAvLyBoYW5kIG92ZXIgdGhlIHJlcXVlc3QgdG8gc3RyZWFtIG1hbmFnZXIKLSAgICBBc2NzQ29ubmVjdGlvblN0YXRlIGRhdGEgPSB7IC5iZF9hZGRyID0gYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0ZSA9IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBtZ3ItPlByb2Nlc3NFdmVudChBU0NTX0NPTk5FQ1RJT05fU1RBVEVfRVZULCAmZGF0YSk7Ci0gIH0KLQotICB2b2lkIE9uQXNlT3BGYWlsZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIEFzZU9wSWQgYXNlX29wX2lkLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlT3BTdGF0dXM+IHN0YXR1cykgewotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzOwotICAgIFVzdHJlYW1NYW5hZ2VyICptZ3IgPSBzdHJtX21ncnMuRmluZG9yQWRkQnlBZGRyZXNzKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNzX2NsaWVudCwgcGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzX2NsaWVudCwgY2lzX2ludGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotICAgIC8vIGhhbmQgb3ZlciB0aGUgcmVxdWVzdCB0byBzdHJlYW0gbWFuYWdlcgotICAgIEFzY3NPcEZhaWxlZCBkYXRhID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJkX2FkZHIgPSBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9vcF9pZCA9IGFzZV9vcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc2VfbGlzdCA9IHN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBtZ3ItPlByb2Nlc3NFdmVudChBU0NTX0FTRV9PUF9GQUlMRURfRVZULCAmZGF0YSk7Ci0gIH0KLQotICB2b2lkIE9uQXNlU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzZVBhcmFtcyBhc2VfcGFyYW1zKSBvdmVycmlkZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzOwotICAgIFVzdHJlYW1NYW5hZ2VyICptZ3IgPSBzdHJtX21ncnMuRmluZG9yQWRkQnlBZGRyZXNzKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNzX2NsaWVudCwgcGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzX2NsaWVudCwgY2lzX2ludGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotICAgIC8vIGhhbmQgb3ZlciB0aGUgcmVxdWVzdCB0byBzdHJlYW0gbWFuYWdlcgotICAgIEFzY3NTdGF0ZSBkYXRhID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJkX2FkZHIgPSBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9wYXJhbXMgPSBhc2VfcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICB9OwotICAgIG1nci0+UHJvY2Vzc0V2ZW50KEFTQ1NfQVNFX1NUQVRFX0VWVCwgJmRhdGEpOwotICB9Ci0KLSAgdm9pZCBPblNlYXJjaENvbXBsZXRlKGludCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVBhcmFtcz4gc2lua19hc2VfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUGFyYW1zPiBzcmNfYXNlX2xpc3QpIG92ZXJyaWRlIHsKLSAgICBVc3RyZWFtTWFuYWdlciAqbWdyID0gc3RybV9tZ3JzLkZpbmRvckFkZEJ5QWRkcmVzcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjc19jbGllbnQsIHBhY3NfY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjc19jbGllbnQsIGNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNsX2NhbGxiYWNrcywgYmFwX2FsYXJtKTsKLSAgICAvLyBoYW5kIG92ZXIgdGhlIHJlcXVlc3QgdG8gc3RyZWFtIG1hbmFnZXIKLSAgICBBc2NzRGlzY292ZXJ5IGRhdGEgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzID0gc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJkX2FkZHIgPSBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpbmtfYXNlc19saXN0ID0gc2lua19hc2VfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcmNfYXNlc19saXN0ID0gc3JjX2FzZV9saXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBtZ3ItPlByb2Nlc3NFdmVudChBU0NTX0RJU0NPVkVSWV9SRVNfRVZULCAmZGF0YSk7Ci0gIH0KLQotICAvLyBjaXMgY2FsbGJhY2tzCi0gIHZvaWQgT25DaWdTdGF0ZSh1aW50OF90IGNpZ19pZCwgQ2lnU3RhdGUgc3RhdGUpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3RvcjxVc3RyZWFtTWFuYWdlciAqPiAqbWdyc19saXN0ID0gIHN0cm1fbWdycy5HZXRBbGxNYW5hZ2VycygpOwotICAgIC8vIGhhbmQgb3ZlciB0aGUgcmVxdWVzdCB0byBzdHJlYW0gbWFuYWdlcgotICAgIENpc0dyb3VwU3RhdGUgZGF0YSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgIC5zdGF0ZSA9IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBtZ3JzX2xpc3QtPmJlZ2luKCk7IGl0ICE9IG1ncnNfbGlzdC0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICgqaXQpLT5Qcm9jZXNzRXZlbnQoQ0lTX0dST1VQX1NUQVRFX0VWVCwgJmRhdGEpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25DaXNTdGF0ZSh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQsIHVpbnQ4X3QgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXNTdGF0ZSBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIHN0ZDo6dmVjdG9yPFVzdHJlYW1NYW5hZ2VyICo+ICptZ3JzX2xpc3QgPSAgc3RybV9tZ3JzLkdldEFsbE1hbmFnZXJzKCk7Ci0gICAgLy8gaGFuZCBvdmVyIHRoZSByZXF1ZXN0IHRvIHN0cmVhbSBtYW5hZ2VyCi0gICAgQ2lzU3RyZWFtU3RhdGUgZGF0YSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSBjaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0ZSA9IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGZvciAoYXV0byBpdCA9IG1ncnNfbGlzdC0+YmVnaW4oKTsgaXQgIT0gbWdyc19saXN0LT5lbmQoKTsgaXQrKykgewotICAgICAgKCppdCktPlByb2Nlc3NFdmVudChDSVNfU1RBVEVfRVZULCAmZGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPblRpbWVvdXQodm9pZCogZGF0YSkgb3ZlcnJpZGUgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX187Ci0gICAgQmFwVGltZW91dCogZGF0YV8gPSAoQmFwVGltZW91dCAqKWRhdGE7Ci0gICAgVXN0cmVhbU1hbmFnZXIgKm1nciA9IHN0cm1fbWdycy5GaW5kb3JBZGRCeUFkZHJlc3MoZGF0YV8tPmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNzX2NsaWVudCwgcGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzX2NsaWVudCwgY2lzX2ludGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotICAgIC8vIGhhbmQgb3ZlciB0aGUgcmVxdWVzdCB0byBzdHJlYW0gbWFuYWdlcgotICAgIG1nci0+UHJvY2Vzc0V2ZW50KEJBUF9USU1FX09VVF9FVlQsIGRhdGEpOwotICB9Ci0KLSAgYm9vbCBJbml0KFVjYXN0Q2xpZW50Q2FsbGJhY2tzICpjYWxsYmFjaykgewotICAgIC8vIHJlZ2lzdGVyIGNhbGxiYWNrcyB3aXRoIENJUywgQVNDUyBjbGllbnQsIFBBQ1MgY2xpZW50Ci0gICAgcGFjc19jYWxsYmFja3MgPSBuZXcgUGFjc0NsaWVudENhbGxiYWNrc0ltcGw7Ci0gICAgUGFjc0NsaWVudDo6SW5pdGlhbGl6ZShwYWNzX2NhbGxiYWNrcyk7Ci0gICAgcGFjc19jbGllbnQgPSBQYWNzQ2xpZW50OjpHZXQoKTsKLQotICAgIGFzY3NfY2FsbGJhY2tzID0gbmV3IEFzY3NDbGllbnRDYWxsYmFja3NJbXBsOwotICAgIEFzY3NDbGllbnQ6OkluaXQoYXNjc19jYWxsYmFja3MpOwotICAgIGFzY3NfY2xpZW50ID0gQXNjc0NsaWVudDo6R2V0KCk7Ci0KLSAgICBjaXNfY2FsbGJhY2tzID0gbmV3IENpc0ludGVyZmFjZUNhbGxiYWNrc0ltcGw7Ci0gICAgQ2lzSW50ZXJmYWNlOjpJbml0aWFsaXplKGNpc19jYWxsYmFja3MpOwotICAgIGNpc19pbnRmID0gQ2lzSW50ZXJmYWNlOjpHZXQoKTsKLQotICAgIGJhcF9hbGFybV9jYiA9IG5ldyBCYXBBbGFybUNhbGxiYWNrc0ltcGw7Ci0gICAgQmFwQWxhcm06OkluaXRpYWxpemUoYmFwX2FsYXJtX2NiKTsKLSAgICBiYXBfYWxhcm0gPSBCYXBBbGFybTo6R2V0KCk7Ci0KLSAgICBwYWNzX2NsaWVudF9pZCA9IDA7Ci0gICAgaWYodWNsX2NhbGxiYWNrcyAhPSBudWxscHRyKSB7Ci0gICAgICAvLyBmbGFnIGFuIGVycm9yCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVjbF9jYWxsYmFja3MgPSBjYWxsYmFjazsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIGJvb2wgQ2xlYW5VcCgpIHsKLSAgICBpZih1Y2xfY2FsbGJhY2tzICE9IG51bGxwdHIpIHsKLSAgICAgIHVjbF9jYWxsYmFja3MgPSBudWxscHRyOwotICAgICAgLy9jYWxsIGNsZWFuIHVwcyBmb3IgZWFjaCBjbGllbnRzKGFzY3MsIHBhY3MsIGNpcyBhbmQgYmFwX2FsYXJtKQotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCI6IENsZWFuaW5nIHVwIHBhY3MsIGFzY3MgY2xpZW50cywgY2lzIGludGYgYW5kIGJhcF9hbGFybS4iOwotICAgICAgcGFjc19jbGllbnQtPkNsZWFuVXAocGFjc19jbGllbnRfaWQpOwotICAgICAgYXNjc19jbGllbnQtPkNsZWFuVXAoMHgwMSk7Ci0gICAgICBjaXNfaW50Zi0+Q2xlYW5VcCgpOwotICAgICAgYmFwX2FsYXJtLT5DbGVhblVwKCk7Ci0gICAgICBwYWNzX2NsaWVudCA9IG51bGxwdHI7Ci0gICAgICBhc2NzX2NsaWVudCA9IG51bGxwdHI7Ci0gICAgICBjaXNfaW50ZiA9IG51bGxwdHI7Ci0gICAgICBiYXBfYWxhcm0gPSBudWxscHRyOwotICAgICAgLy8gcmVtb3ZlIGFsbCBzdHJlYW0gbWFuYWdlcnMgYW5kIG90aGVyIGNsZWFuIHVwcwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiB1Y2xfY2FsbGJhY2tzOwotICBVc3RyZWFtTWFuYWdlcnMgc3RybV9tZ3JzOwotICBQYWNzQ2xpZW50ICpwYWNzX2NsaWVudDsKLSAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQ7Ci0gIFBhY3NDbGllbnRDYWxsYmFja3MgKnBhY3NfY2FsbGJhY2tzOwotICBBc2NzQ2xpZW50Q2FsbGJhY2tzICphc2NzX2NhbGxiYWNrczsKLSAgQ2lzSW50ZXJmYWNlICpjaXNfaW50ZjsKLSAgQ2lzSW50ZXJmYWNlQ2FsbGJhY2tzICpjaXNfY2FsbGJhY2tzOwotICB1aW50MTZfdCBwYWNzX2NsaWVudF9pZDsKLSAgQmFwQWxhcm0qIGJhcF9hbGFybTsKLSAgQmFwQWxhcm1DYWxsYmFja3MqIGJhcF9hbGFybV9jYjsKLX07Ci0KLXZvaWQgVWNhc3RDbGllbnQ6OkluaXRpYWxpemUoVWNhc3RDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgaW5zdGFuY2UgPSBuZXcgVWNhc3RDbGllbnRJbXBsKCk7Ci0gICAgaW5zdGFuY2UtPkluaXQoY2FsbGJhY2tzKTsKLSAgfSBlbHNlIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgMm5kIGNsaWVudCByZWdpc3RyYXRpb24gaWdub3JlZCI7Ci0gIH0KLX0KLQotdm9pZCBVY2FzdENsaWVudDo6Q2xlYW5VcCgpIHsKLSAgaWYoaW5zdGFuY2UgJiYgaW5zdGFuY2UtPkNsZWFuVXAoKSkgewotICAgIGRlbGV0ZSBpbnN0YW5jZTsKLSAgICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0gIH0KLX0KLQotVWNhc3RDbGllbnQqIFVjYXN0Q2xpZW50OjpHZXQoKSB7Ci0gIENIRUNLKGluc3RhbmNlKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdWNhc3QKLX0gIC8vIG5hbWVzcGFjZSBiYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL3VjbGllbnRfc3RybV9tZ3IuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X3N0cm1fbWdyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTA2OTM3Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvYmFwL3VjbGllbnRfc3RybV9tZ3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImJ0YV9iYXBfdWNsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJ1Y2FzdF9jbGllbnRfaW50LmgiCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmFwIHsKLW5hbWVzcGFjZSB1Y2FzdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlVzdHJlYW1NYW5hZ2VyczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VXN0cmVhbU1hbmFnZXI7Ci0KLXN0ZDo6bWFwPFN0cmVhbVN0YXRlLCBpbnQ+IHN0YXRlX21hcCA9IHsKLSAgIHtTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVELCAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZX0gLAotICAge1N0cmVhbVN0YXRlOjpDT05ORUNUSU5HLCAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0aW5nfSwKLSAgIHtTdHJlYW1TdGF0ZTo6Q09OTkVDVEVELCAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGVkfSwKLSAgIHtTdHJlYW1TdGF0ZTo6U1RBUlRJTkcsICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RhcnRpbmd9LAotICAge1N0cmVhbVN0YXRlOjpTVFJFQU1JTkcsICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVTdHJlYW1pbmd9LAotICAge1N0cmVhbVN0YXRlOjpTVE9QUElORywgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVTdG9wcGluZ30sCi0gICB7U3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcsIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZURpc2Nvbm5lY3Rpbmd9LAotICAge1N0cmVhbVN0YXRlOjpSRUNPTkZJR1VSSU5HLCBTdHJlYW1UcmFja2VyOjprU3RhdGVSZWNvbmZpZ3VyaW5nfQotfTsKLQotU3RyZWFtQ29udGV4dCAqU3RyZWFtQ29udGV4dHM6OkZpbmRCeVR5cGUoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoc3RybV9jb250ZXh0cy5iZWdpbigpLCBzdHJtX2NvbnRleHRzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICBbJnN0cmVhbV90eXBlXShTdHJlYW1Db250ZXh0ICpjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGNvbnRleHQtPnN0cmVhbV90eXBlLnR5cGUgPT0gc3RyZWFtX3R5cGUudHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29udGV4dC0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV90eXBlLmRpcmVjdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICBpZiAoaXRlciA9PSBzdHJtX2NvbnRleHRzLmVuZCgpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICgqaXRlcik7Ci0gIH0KLX0KLQotc3RkOjp2ZWN0b3I8U3RyZWFtQ29udGV4dCAqPiBTdHJlYW1Db250ZXh0czo6RmluZEJ5QXNlQXR0YWNoZWRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXNlX2lkLCBTdHJlYW1BdHRhY2hlZFN0YXRlIHN0YXRlKSB7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbnRleHQgKj4gY29udGV4dHNfbGlzdDsKLSAgZm9yKGF1dG8gaSA9IHN0cm1fY29udGV4dHMuYmVnaW4oKTsgaSAhPSBzdHJtX2NvbnRleHRzLmVuZCgpO2krKykgewotICAgIGlmKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCgqaSktPmF0dGFjaGVkX3N0YXRlKSAmCi0gICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3RhdGUpKSB7Ci0gICAgICBmb3IoYXV0byBqID0gKCppKS0+c3RyZWFtX2lkcy5iZWdpbigpOyBqICE9ICgqaSktPnN0cmVhbV9pZHMuZW5kKCk7aisrKSB7Ci0gICAgICAgIGlmKGotPmFzZV9pZCAgPT0gYXNlX2lkKSB7Ci0gICAgICAgICAgY29udGV4dHNfbGlzdC5wdXNoX2JhY2soKmkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb250ZXh0c19saXN0OwotfQotCi1TdHJlYW1Db250ZXh0ICpTdHJlYW1Db250ZXh0czo6RmluZE9yQWRkQnlUeXBlKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpIHsKLSAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKHN0cm1fY29udGV4dHMuYmVnaW4oKSwgc3RybV9jb250ZXh0cy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1fdHlwZV0oU3RyZWFtQ29udGV4dCAqY29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChjb250ZXh0LT5zdHJlYW1fdHlwZS50eXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV90eXBlLnR5cGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQtPnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZS5kaXJlY3Rpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgaWYgKGl0ZXIgPT0gc3RybV9jb250ZXh0cy5lbmQoKSkgewotICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBuZXcgU3RyZWFtQ29udGV4dChzdHJlYW1fdHlwZSk7Ci0gICAgc3RybV9jb250ZXh0cy5wdXNoX2JhY2soY29udGV4dCk7Ci0gICAgcmV0dXJuIGNvbnRleHQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICgqaXRlcik7Ci0gIH0KLX0KLQotdm9pZCBTdHJlYW1Db250ZXh0czo6UmVtb3ZlKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpIHsKLSAgZm9yIChhdXRvIGl0ID0gc3RybV9jb250ZXh0cy5iZWdpbigpOyBpdCAhPSBzdHJtX2NvbnRleHRzLmVuZCgpOykgewotICAgIGlmICgoKCppdCktPnN0cmVhbV90eXBlLnR5cGUgPSBzdHJlYW1fdHlwZS50eXBlKSAmJgotICAgICAgICAoKCppdCktPnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IHN0cmVhbV90eXBlLmRpcmVjdGlvbikpIHsKLSAgICAgIGRlbGV0ZSgqaXQpOwotICAgICAgaXQgPSBzdHJtX2NvbnRleHRzLmVyYXNlKGl0KTsKLSAgICB9IGVsc2UgewotICAgICAgaXQrKzsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBTdHJlYW1Db250ZXh0czo6SXNBc2VBdHRhY2hlZChTdHJlYW1UeXBlIHN0cmVhbV90eXBlKSB7Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi1TdHJlYW1Db250ZXh0KiBTdHJlYW1Db250ZXh0czo6RmluZEJ5QXNlSWQodWludDE2X3QgYXNlX2lkKSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihzdHJtX2NvbnRleHRzLmJlZ2luKCksIHN0cm1fY29udGV4dHMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIFsmYXNlX2lkXShTdHJlYW1Db250ZXh0ICpjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9ICBzdGQ6OmZpbmRfaWYoY29udGV4dC0+c3RyZWFtX2lkcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYXNlX2lkXShTdHJlYW1JZFR5cGUgaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpZC5hc2VfaWQgPT0gYXNlX2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgaWYgKGl0ZXIgPT0gc3RybV9jb250ZXh0cy5lbmQoKSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9IGVsc2UgewotICAgIHJldHVybiAoKml0ZXIpOwotICB9Ci19Ci0KLVN0cmVhbVRyYWNrZXIqIFN0cmVhbVRyYWNrZXJzOjpGaW5kT3JBZGRCeVR5cGUoaW50IGluaXRfc3RhdGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICBVc3RyZWFtTWFuYWdlciAqc3RybV9tZ3IsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubmVjdF9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZpZ19zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gKnN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZSBvcHNfdHlwZSkgewotICBib29sIGZvdW5kID0gZmFsc2U7Ci0gIGF1dG8gaXRlciA9IHN0cmVhbV90cmFja2Vycy5iZWdpbigpOwotICB3aGlsZSAoaXRlciAhPSBzdHJlYW1fdHJhY2tlcnMuZW5kKCkgJiYgIWZvdW5kKSB7Ci0gICAgaWYoKCppdGVyKS0+R2V0Q29udHJvbFR5cGUoKSAgPT0gb3BzX3R5cGUpIHsKLSAgICAgIGlmKG9wc190eXBlID09IFN0cmVhbUNvbnRyb2xUeXBlOjpDb25uZWN0KSB7Ci0gICAgICAgIC8vIGNvbXBhcmUgY29ubmVjdGlvbiBzdHJlYW1zCi0gICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+ICpjb25uX3N0cm1zID0gKCppdGVyKS0+R2V0Q29ublN0cmVhbXMoKTsKLSAgICAgICAgaWYoY29ubl9zdHJtcy0+c2l6ZSgpID09IGNvbm5lY3Rfc3RyZWFtcy0+c2l6ZSgpKSB7Ci0gICAgICAgICAgdWludDhfdCBsZW4gPSBjb25uZWN0X3N0cmVhbXMtPnNpemUoKTsKLSAgICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBsZW4gOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmVhbUNvbm5lY3Qgc3JjID0gY29ubl9zdHJtcy0+YXQoaSk7Ci0gICAgICAgICAgICBTdHJlYW1Db25uZWN0IGRzdCA9IGNvbm5lY3Rfc3RyZWFtcy0+YXQoaSk7Ci0gICAgICAgICAgICBpZigoc3JjLnN0cmVhbV90eXBlLnR5cGUgPT0gZHN0LnN0cmVhbV90eXBlLnR5cGUpICYmCi0gICAgICAgICAgICAgICAoc3JjLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBkc3Quc3RyZWFtX3R5cGUuZGlyZWN0aW9uKSkgewotICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBTdHJlYW1Db25uZWN0IGZvdW5kIjsKLSAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZihvcHNfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6UmVjb25maWcpIHsKLSAgICAgICAgLy8gY29tcGFyZSBjb25uZWN0aW9uIHN0cmVhbXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZfc3RybXMgPSAoKml0ZXIpLT5HZXRSZWNvbmZTdHJlYW1zKCk7Ci0gICAgICAgIGlmKHJlY29uZl9zdHJtcy0+c2l6ZSgpID09IHJlY29uZmlnX3N0cmVhbXMtPnNpemUoKSkgewotICAgICAgICAgIHVpbnQ4X3QgbGVuID0gcmVjb25maWdfc3RyZWFtcy0+c2l6ZSgpOwotICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGxlbiA7IGkrKykgewotICAgICAgICAgICAgU3RyZWFtUmVjb25maWcgc3JjID0gcmVjb25mX3N0cm1zLT5hdChpKTsKLSAgICAgICAgICAgIFN0cmVhbVJlY29uZmlnIGRzdCA9IHJlY29uZmlnX3N0cmVhbXMtPmF0KGkpOwotICAgICAgICAgICAgaWYoKHNyYy5zdHJlYW1fdHlwZS50eXBlID09IGRzdC5zdHJlYW1fdHlwZS50eXBlKSAmJgotICAgICAgICAgICAgICAgKHNyYy5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gZHN0LnN0cmVhbV90eXBlLmRpcmVjdGlvbikpIHsKLSAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgU3RyZWFtUmVjb25maWcgZm91bmQiOwotICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmKG9wc190eXBlICE9IFN0cmVhbUNvbnRyb2xUeXBlOjpOb25lICYmCi0gICAgICAgICAgICAgICAgb3BzX3R5cGUgIT0gU3RyZWFtQ29udHJvbFR5cGU6OlVwZGF0ZVN0cmVhbSkgewotICAgICAgICAvLyBjb21wYXJlIGNvbm5lY3Rpb24gc3RyZWFtcwotICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RybXMgPSAoKml0ZXIpLT5HZXRTdHJlYW1zKCk7Ci0gICAgICAgIGlmKHN0cm1zLT5zaXplKCkgPT0gc3RyZWFtcy0+c2l6ZSgpKSB7Ci0gICAgICAgICAgdWludDhfdCBsZW4gPSBzdHJlYW1zLT5zaXplKCk7Ci0gICAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbGVuIDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJlYW1UeXBlIHNyYyA9IHN0cm1zLT5hdChpKTsKLSAgICAgICAgICAgIFN0cmVhbVR5cGUgZHN0ID0gc3RyZWFtcy0+YXQoaSk7Ci0gICAgICAgICAgICBpZigoc3JjLnR5cGUgPT0gZHN0LnR5cGUpICYmCi0gICAgICAgICAgICAgICAoc3JjLmRpcmVjdGlvbiA9PSBkc3QuZGlyZWN0aW9uKSkgewotICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBTdHJlYW1UeXBlIGZvdW5kIjsKLSAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaXRlcisrOwotICB9Ci0KLSAgaWYgKGl0ZXIgPT0gc3RyZWFtX3RyYWNrZXJzLmVuZCgpKSB7Ci0gICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9ICBuZXcgU3RyZWFtVHJhY2tlcihpbml0X3N0YXRlX2lkLCBzdHJtX21nciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9zdHJlYW1zLCByZWNvbmZpZ19zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zLCBvcHNfdHlwZSk7Ci0gICAgc3RyZWFtX3RyYWNrZXJzLnB1c2hfYmFjayh0cmFja2VyKTsKLSAgICByZXR1cm4gdHJhY2tlcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKCppdGVyKTsKLSAgfQotfQotCi1ib29sIFN0cmVhbVRyYWNrZXJzOjpSZW1vdmUoc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RyZWFtcywKLSAgICAgICAgICAgIFN0cmVhbUNvbnRyb2xUeXBlIG9wc190eXBlKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGQ6OnZlY3RvcjxTdHJlYW1UcmFja2VyICo+IFN0cmVhbVRyYWNrZXJzOjpHZXRUcmFja2Vyc0J5U3RhdGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdGF0ZV9pZHMpIHsKLSAgdmVjdG9yPFN0cmVhbVRyYWNrZXIgKj4gdHJhY2tlcnM7Ci0gIGZvciAoYXV0byBpID0gc3RyZWFtX3RyYWNrZXJzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGkgIT0gc3RyZWFtX3RyYWNrZXJzLmVuZCgpO2krKykgewotICAgIGZvciAoYXV0byBqID0gc3RhdGVfaWRzLT5iZWdpbigpOyBqICE9IHN0YXRlX2lkcy0+ZW5kKCk7aisrKSB7Ci0gICAgICBpZigoKmkpLT5TdGF0ZUlkKCkgID09ICpqKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHRyYWNrZXIgZm91bmQiOwotICAgICAgICB0cmFja2Vycy5wdXNoX2JhY2soKmkpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJhY2tlcnM7Ci19Ci0KLXZvaWQgU3RyZWFtVHJhY2tlcnM6OlJlbW92ZUJ5U3RhdGVzKHN0ZDo6dmVjdG9yPGludD4gc3RhdGVfaWRzKSB7Ci0gIGZvciAoYXV0byBpID0gc3RyZWFtX3RyYWNrZXJzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGkgIT0gc3RyZWFtX3RyYWNrZXJzLmVuZCgpOykgewotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8gaiA9IHN0YXRlX2lkcy5iZWdpbigpOyBqICE9IHN0YXRlX2lkcy5lbmQoKTtqKyspIHsKLSAgICAgIGlmKCgqaSktPlN0YXRlSWQoKSAgPT0gKmopIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgdHJhY2tlciBmb3VuZCI7Ci0gICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmKGZvdW5kKSB7Ci0gICAgICBkZWxldGUoKmkpOwotICAgICAgaSA9IHN0cmVhbV90cmFja2Vycy5lcmFzZShpKTsKLSAgICB9IGVsc2UgewotICAgICAgaSsrOwotICAgIH0KLSAgfQotfQotCi0KLXN0ZDo6bWFwPFN0cmVhbVRyYWNrZXIgKiAsIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXJzOjpHZXRUcmFja2Vyc0J5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdHJlYW1zKSB7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHJlcV90eXBlcyA9ICpzdHJlYW1zOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBhbGxfdHlwZXM7Ci0gIHN0ZDo6bWFwPFN0cmVhbVRyYWNrZXIgKiAsIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ID4gdHJhY2tlcl9hbmRfdHlwZV9tYXA7Ci0gIGZvciAoYXV0byBpdGVyID0gc3RyZWFtX3RyYWNrZXJzLmJlZ2luKCk7IGl0ZXIgIT0gc3RyZWFtX3RyYWNrZXJzLmVuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyKyspIHsKLSAgICBhbGxfdHlwZXMuY2xlYXIoKTsKLSAgICBpZigoKml0ZXIpLT5HZXRDb250cm9sVHlwZSgpID09IFN0cmVhbUNvbnRyb2xUeXBlOjpDb25uZWN0KSB7Ci0gICAgICAvLyBjb21wYXJlIGNvbm5lY3Rpb24gc3RyZWFtcwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gKmNvbm5fc3RybXMgPSAoKml0ZXIpLT5HZXRDb25uU3RyZWFtcygpOwotICAgICAgdWludDhfdCBsZW4gPSBjb25uX3N0cm1zLT5zaXplKCk7Ci0gICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBsZW4gOyBpKyspIHsKLSAgICAgICAgU3RyZWFtQ29ubmVjdCBzcmMgPSBjb25uX3N0cm1zLT5hdChpKTsKLSAgICAgICAgYWxsX3R5cGVzLnB1c2hfYmFjayhzcmMuc3RyZWFtX3R5cGUpOwotICAgICAgfQotICAgIH0gZWxzZSBpZigoKml0ZXIpLT5HZXRDb250cm9sVHlwZSgpID09IFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZykgewotICAgICAgLy8gY29tcGFyZSBjb25uZWN0aW9uIHN0cmVhbXMKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAqcmVjb25mX3N0cm1zID0gKCppdGVyKS0+R2V0UmVjb25mU3RyZWFtcygpOwotICAgICAgdWludDhfdCBsZW4gPSByZWNvbmZfc3RybXMtPnNpemUoKTsKLSAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGxlbiA7IGkrKykgewotICAgICAgICBTdHJlYW1SZWNvbmZpZyBzcmMgPSByZWNvbmZfc3RybXMtPmF0KGkpOwotICAgICAgICBhbGxfdHlwZXMucHVzaF9iYWNrKHNyYy5zdHJlYW1fdHlwZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmKCgqaXRlciktPkdldENvbnRyb2xUeXBlKCkgPT0gU3RyZWFtQ29udHJvbFR5cGU6OlVwZGF0ZVN0cmVhbSkgewotICAgICAgLy8gY29tcGFyZSBjb25uZWN0aW9uIHN0cmVhbXMKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVVwZGF0ZT4gKnVwZGF0ZV9zdHJlYW1zID0gKCppdGVyKS0+R2V0TWV0YVVwZGF0ZVN0cmVhbXMoKTsKLSAgICAgIHVpbnQ4X3QgbGVuID0gdXBkYXRlX3N0cmVhbXMtPnNpemUoKTsKLSAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGxlbiA7IGkrKykgewotICAgICAgICBTdHJlYW1VcGRhdGUgc3JjID0gdXBkYXRlX3N0cmVhbXMtPmF0KGkpOwotICAgICAgICBhbGxfdHlwZXMucHVzaF9iYWNrKHNyYy5zdHJlYW1fdHlwZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmKCgqaXRlciktPkdldENvbnRyb2xUeXBlKCkgIT0gU3RyZWFtQ29udHJvbFR5cGU6Ok5vbmUpIHsKLSAgICAgIC8vIGNvbXBhcmUgY29ubmVjdGlvbiBzdHJlYW1zCi0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RybXMgPSAoKml0ZXIpLT5HZXRTdHJlYW1zKCk7Ci0gICAgICB1aW50OF90IGxlbiA9IHN0cm1zLT5zaXplKCk7Ci0gICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBsZW4gOyBpKyspIHsKLSAgICAgICAgU3RyZWFtVHlwZSBzcmMgPSBzdHJtcy0+YXQoaSk7Ci0gICAgICAgIGFsbF90eXBlcy5wdXNoX2JhY2soc3JjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdWludDhfdCBjb3VudCA9IDA7Ci0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZmlsdGVyZWRfdHlwZXM7Ci0gICAgaWYoYWxsX3R5cGVzLnNpemUoKSA8PSByZXFfdHlwZXMuc2l6ZSgpKSB7Ci0gICAgICBmaWx0ZXJlZF90eXBlcy5jbGVhcigpOwotICAgICAgZm9yIChhdXRvIGl0ID0gYWxsX3R5cGVzLmJlZ2luKCk7IGl0ICE9IGFsbF90eXBlcy5lbmQoKTsgaXQrKykgewotICAgICAgICBmb3IgKGF1dG8gaXRfMiA9IHJlcV90eXBlcy5iZWdpbigpOyBpdF8yICE9IHJlcV90eXBlcy5lbmQoKTspIHsKLSAgICAgICAgICBpZiAoKChpdF8yKS0+dHlwZSA9PSBpdC0+dHlwZSkgJiYKLSAgICAgICAgICAgICAgKChpdF8yKS0+ZGlyZWN0aW9uID09IGl0LT5kaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBmaWx0ZXJlZF90eXBlcy5wdXNoX2JhY2soKml0XzIpOwotICAgICAgICAgICAgdHJhY2tlcl9hbmRfdHlwZV9tYXBbKml0ZXJdID0gZmlsdGVyZWRfdHlwZXM7Ci0gICAgICAgICAgICBpdF8yID0gcmVxX3R5cGVzLmVyYXNlKGl0XzIpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXRfMisrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYoYWxsX3R5cGVzLnNpemUoKSAhPSBjb3VudCkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgaW52YWxpZCByZXF1ZXN0IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGludmFsaWQgcmVxdWVzdCI7Ci0gICAgfQotICB9Ci0gIGlmKHJlcV90eXBlcy5zaXplKCkpIHsKLSAgICB0cmFja2VyX2FuZF90eXBlX21hcFtudWxscHRyXSA9IHJlcV90eXBlczsKLSAgfQotICByZXR1cm4gdHJhY2tlcl9hbmRfdHlwZV9tYXA7Ci19Ci0KLQotU3RyZWFtVHJhY2tlciAqU3RyZWFtVHJhY2tlcnM6OkZpbmRCeVN0cmVhbXNUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdHJlYW1zKSB7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgYXV0byBpdGVyID0gc3RyZWFtX3RyYWNrZXJzLmJlZ2luKCk7Ci0gIHdoaWxlIChpdGVyICE9IHN0cmVhbV90cmFja2Vycy5lbmQoKSkgewotICAgIGlmKCgqaXRlciktPkdldENvbnRyb2xUeXBlKCkgPT0gU3RyZWFtQ29udHJvbFR5cGU6OkNvbm5lY3QpIHsKLSAgICAgIC8vIGNvbXBhcmUgY29ubmVjdGlvbiBzdHJlYW1zCi0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubl9zdHJtcyA9ICgqaXRlciktPkdldENvbm5TdHJlYW1zKCk7Ci0gICAgICBpZihjb25uX3N0cm1zLT5zaXplKCkgPT0gc3RyZWFtcy0+c2l6ZSgpKSB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuID0gc3RyZWFtcy0+c2l6ZSgpOwotICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBsZW4gOyBpKyspIHsKLSAgICAgICAgICBTdHJlYW1Db25uZWN0IHNyYyA9IGNvbm5fc3RybXMtPmF0KGkpOwotICAgICAgICAgIFN0cmVhbVR5cGUgZHN0ID0gc3RyZWFtcy0+YXQoaSk7Ci0gICAgICAgICAgaWYoKHNyYy5zdHJlYW1fdHlwZS50eXBlID09IGRzdC50eXBlKSAmJgotICAgICAgICAgICAgIChzcmMuc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IGRzdC5kaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBTdHJlYW1Db25uZWN0IGZvdW5kIjsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZigoKml0ZXIpLT5HZXRDb250cm9sVHlwZSgpID09IFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZykgewotICAgICAgLy8gY29tcGFyZSBjb25uZWN0aW9uIHN0cmVhbXMKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAqcmVjb25mX3N0cm1zID0gKCppdGVyKS0+R2V0UmVjb25mU3RyZWFtcygpOwotICAgICAgaWYocmVjb25mX3N0cm1zLT5zaXplKCkgPT0gc3RyZWFtcy0+c2l6ZSgpKSB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuID0gc3RyZWFtcy0+c2l6ZSgpOwotICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBsZW4gOyBpKyspIHsKLSAgICAgICAgICBTdHJlYW1SZWNvbmZpZyBzcmMgPSByZWNvbmZfc3RybXMtPmF0KGkpOwotICAgICAgICAgIFN0cmVhbVR5cGUgZHN0ID0gc3RyZWFtcy0+YXQoaSk7Ci0gICAgICAgICAgaWYoKHNyYy5zdHJlYW1fdHlwZS50eXBlID09IGRzdC50eXBlKSAmJgotICAgICAgICAgICAgIChzcmMuc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IGRzdC5kaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBTdHJlYW1SZWNvbmZpZyBmb3VuZCI7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYoKCppdGVyKS0+R2V0Q29udHJvbFR5cGUoKSA9PSBTdHJlYW1Db250cm9sVHlwZTo6VXBkYXRlU3RyZWFtKSB7Ci0gICAgICAvLyBjb21wYXJlIGNvbm5lY3Rpb24gc3RyZWFtcwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVXBkYXRlPiAqdXBkYXRlX3N0cm1zID0gKCppdGVyKS0+R2V0TWV0YVVwZGF0ZVN0cmVhbXMoKTsKLSAgICAgIGlmKHVwZGF0ZV9zdHJtcy0+c2l6ZSgpID09IHN0cmVhbXMtPnNpemUoKSkgewotICAgICAgICB1aW50OF90IGxlbiA9IHN0cmVhbXMtPnNpemUoKTsKLSAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbGVuIDsgaSsrKSB7Ci0gICAgICAgICAgU3RyZWFtVXBkYXRlIHNyYyA9IHVwZGF0ZV9zdHJtcy0+YXQoaSk7Ci0gICAgICAgICAgU3RyZWFtVHlwZSBkc3QgPSBzdHJlYW1zLT5hdChpKTsKLSAgICAgICAgICBpZigoc3JjLnN0cmVhbV90eXBlLnR5cGUgPT0gZHN0LnR5cGUpICYmCi0gICAgICAgICAgICAgKHNyYy5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gZHN0LmRpcmVjdGlvbikpIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIFN0cmVhbVVwZGF0ZSBmb3VuZCI7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYoKCppdGVyKS0+R2V0Q29udHJvbFR5cGUoKSAhPSBTdHJlYW1Db250cm9sVHlwZTo6Tm9uZSkgewotICAgICAgLy8gY29tcGFyZSBjb25uZWN0aW9uIHN0cmVhbXMKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdHJtcyA9ICgqaXRlciktPkdldFN0cmVhbXMoKTsKLSAgICAgIGlmKHN0cm1zLT5zaXplKCkgPT0gc3RyZWFtcy0+c2l6ZSgpKSB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuID0gc3RyZWFtcy0+c2l6ZSgpOwotICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBsZW4gOyBpKyspIHsKLSAgICAgICAgICBTdHJlYW1UeXBlIHNyYyA9IHN0cm1zLT5hdChpKTsKLSAgICAgICAgICBTdHJlYW1UeXBlIGRzdCA9IHN0cmVhbXMtPmF0KGkpOwotICAgICAgICAgIGlmKChzcmMudHlwZSA9PSBkc3QudHlwZSkgJiYKLSAgICAgICAgICAgICAoc3JjLmRpcmVjdGlvbiA9PSBkc3QuZGlyZWN0aW9uKSkgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgU3RyZWFtVHlwZSBmb3VuZCI7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYoZm91bmQpIGJyZWFrOwotICAgIGl0ZXIrKzsKLSAgfQotCi0gIGlmIChpdGVyID09IHN0cmVhbV90cmFja2Vycy5lbmQoKSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9IGVsc2UgewotICAgIHJldHVybiAoKml0ZXIpOwotICB9Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcnM6OkNoYW5nZU9wVHlwZSggU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZSBuZXdfb3BzX3R5cGUpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcnM6OklzU3RyZWFtVHJhY2tlclZhbGlkKFN0cmVhbVRyYWNrZXIqIHRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3RhdGVfaWRzKSB7Ci0gIHZlY3RvcjxTdHJlYW1UcmFja2VyICo+IHRyYWNrZXJzXyA9IEdldFRyYWNrZXJzQnlTdGF0ZXMoc3RhdGVfaWRzKTsKLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fOwotICBpZih0cmFja2Vyc18uZW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoYXV0byBpdCA9IHRyYWNrZXJzXy5iZWdpbigpOyBpdCAhPSB0cmFja2Vyc18uZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoKCppdCkgPT0gdHJhY2tlcikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8IjogQ2FjaGVkIFRyYWNrZXIgaXMgdmFsaWQiOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBVc3RyZWFtTWFuYWdlcjo6UHVzaEV2ZW50VG9UcmFja2VyKHVpbnQzMl90IGV2ZW50LCB2b2lkICpwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3RhdGVfaWRzKSB7Ci0gIHZlY3RvcjxTdHJlYW1UcmFja2VyICo+IHRyYWNrZXJzID0gc3RyZWFtX3RyYWNrZXJzLkdldFRyYWNrZXJzQnlTdGF0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfaWRzKTsKLSAgaWYodHJhY2tlcnMuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoYXV0byBpdCA9IHRyYWNrZXJzLmJlZ2luKCk7IGl0ICE9IHRyYWNrZXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgKCppdCktPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGQ6Om1hcDxpbnQgLCBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiA+IFVzdHJlYW1NYW5hZ2VyOjpTcGxpdENvbnRleHRPblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RyZWFtcykgewotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBHZXRTdHJlYW1Db250ZXh0cygpOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiByZXFfdHlwZXMgPSAqc3RyZWFtczsKLSAgc3RkOjptYXA8aW50ICwgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gPiBzdGF0ZV9hbmRfdHlwZV9tYXA7Ci0KLSAgZm9yIChhdXRvIGl0ID0gcmVxX3R5cGVzLmJlZ2luKCk7IGl0ICE9IHJlcV90eXBlcy5lbmQoKTspIHsKLSAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgqaXQpOwotICAgIGlmIChjb250ZXh0KSB7Ci0gICAgICBpbnQgc3RhdGUgPSBzdGF0ZV9tYXBbY29udGV4dC0+c3RyZWFtX3N0YXRlXTsKLSAgICAgIHN0YXRlX2FuZF90eXBlX21hcFtzdGF0ZV0ucHVzaF9iYWNrKCppdCk7Ci0gICAgICBpdCA9IHJlcV90eXBlcy5lcmFzZShpdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGl0Kys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdGF0ZV9hbmRfdHlwZV9tYXA7Ci19Ci0KLXZvaWQgVXN0cmVhbU1hbmFnZXI6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCAqcF9kYXRhKSB7Ci0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwiOiBFdmVudDogIiA8PCBHZXRFdmVudE5hbWUoZXZlbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwiLCBidF9hZGRyOiAiIDw8IEdldEFkZHJlc3MoKTsKLQotICBzdGQ6OnZlY3RvcjxpbnQ+IHN0YWJsZV9zdGF0ZV9pZHMgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0cmVhbWluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgc3RkOjp2ZWN0b3I8aW50PiB0cmFuc2llbnRfc3RhdGVfaWRzID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlUmVjb25maWd1cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVEaXNjb25uZWN0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0YXJ0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0b3BwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVVwZGF0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBHZXRTdHJlYW1Db250ZXh0cygpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLQotICAgIGNhc2UgQkFQX0NPTk5FQ1RfUkVRX0VWVDogewotICAgICAgQmFwQ29ubmVjdCAqZXZ0X2RhdGEgPSAoQmFwQ29ubmVjdCAqKSBwX2RhdGE7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiBjb25uX3N0cmVhbXMgPSBldnRfZGF0YS0+c3RyZWFtczsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogc2l6ZTogIiA8PCBjb25uX3N0cmVhbXMuc2l6ZSgpOwotCi0gICAgICBmb3IgKGF1dG8gaXQgPSBjb25uX3N0cmVhbXMuYmVnaW4oKTsgaXQgIT0gY29ubl9zdHJlYW1zLmVuZCgpOykgewotICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotICAgICAgICBpZihjb250ZXh0ICYmIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSAhPSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBTdHJlYW0gaXMgbm90IGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSI7Ci0gICAgICAgICAgaXQgPSBjb25uX3N0cmVhbXMuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGl0Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoIWNvbm5fc3RyZWFtcy5zaXplKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIjogQWxsIHN0cmVhbXMgYXJlIG5vdCBpbiBkaXNjb25uZWN0ZWQgc3RhdGUiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbWJpbmF0aW9ucyBtZWRpYSBUeCBvciB2b2ljZSBUWHxSWAotICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IHN0cmVhbV90cmFja2Vycy5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAmY29ubl9zdHJlYW1zLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnRyb2xUeXBlOjpDb25uZWN0KTsKLQotICAgICAgaWYodHJhY2tlcikgewotICAgICAgICB0cmFja2VyLT5TdGFydCgpOwotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQkFQX0RJU0NPTk5FQ1RfUkVRX0VWVDogewotICAgICAgQmFwRGlzY29ubmVjdCAqZXZ0X2RhdGEgPSAoQmFwRGlzY29ubmVjdCAqKSBwX2RhdGE7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBkaXNjX3N0cmVhbXMgPSBldnRfZGF0YS0+c3RyZWFtczsKLSAgICAgIEJhcERpc2Nvbm5lY3QgaW50X2V2dF9kYXRhOwotCi0gICAgICBmb3IgKGF1dG8gaXQgPSBkaXNjX3N0cmVhbXMuYmVnaW4oKTsgaXQgIT0gZGlzY19zdHJlYW1zLmVuZCgpOykgewotICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgqaXQpOwotICAgICAgICBpZighY29udGV4dCB8fCBjb250ZXh0LT5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBTdHJlYW0gaXMgYWxyZWFkeSBkaXNjb25uZWN0ZWQiOwotICAgICAgICAgIGl0ID0gZGlzY19zdHJlYW1zLmVyYXNlKGl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpdCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKCFkaXNjX3N0cmVhbXMuc2l6ZSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICIgQWxsIHN0cmVhbXMgYXJlIGFscmVhZHkgZGlzY29ubmVjdGVkIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBkaXNjIHN0cmVhbXMgc2l6ZSAiIDw8IGRpc2Nfc3RyZWFtcy5zaXplKCk7Ci0KLSAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb21iaW5hdGlvbnMgbWVkaWEgVHggb3Igdm9pY2UgVFh8UlgKLSAgICAgIHN0ZDo6bWFwPFN0cmVhbVRyYWNrZXIgKiAsIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ID4KLSAgICAgICAgIHRyYWNrZXJfYW5kX3R5cGVfbGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbV90cmFja2Vycy5HZXRUcmFja2Vyc0J5VHlwZSgmZGlzY19zdHJlYW1zKTsKLQotCi0gICAgICAvLyBjaGVjayBpZiBhbGwgc3RyZWFtcyBkaXNjb25uZWN0aW9uIG9yIHN1YnNldCBvZiBzdHJlYW1zCi0gICAgICAvLyBjcmVhdGUgdGhlIG5ldyB0cmFja2VyCi0gICAgICBmb3IgKGF1dG8gaXRyID0gdHJhY2tlcl9hbmRfdHlwZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgaXRyICE9IHRyYWNrZXJfYW5kX3R5cGVfbGlzdC5lbmQoKTsgaXRyKyspIHsKLSAgICAgICAgaWYoaXRyLT5maXJzdCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgc3RkOjptYXA8aW50ICwgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gPgotICAgICAgICAgICAgIGxpc3QgPSBTcGxpdENvbnRleHRPblN0YXRlKCZpdHItPnNlY29uZCk7Ci0gICAgICAgICAgZm9yIChhdXRvIGl0cl8yID0gbGlzdC5iZWdpbigpOyBpdHJfMiAhPSBsaXN0LmVuZCgpOyBpdHJfMisrKSB7Ci0gICAgICAgICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRyXzItPmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBudWxscHRyLCBudWxscHRyLCAmaXRyXzItPnNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29udHJvbFR5cGU6OkRpc2Nvbm5lY3QpOwotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIG5ldyB0cmFja2VyIHN0YXJ0ICI7Ci0gICAgICAgICAgICB0cmFja2VyLT5TdGFydCgpOwotICAgICAgICAgICAgaW50X2V2dF9kYXRhLnN0cmVhbXMgPSBpdHJfMi0+c2Vjb25kOwotICAgICAgICAgICAgdHJhY2tlci0+UHJvY2Vzc0V2ZW50KGV2ZW50LCAmaW50X2V2dF9kYXRhKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGV4aXN0aW5nIHRyYWNrZXIgc3RhcnQgIjsKLSAgICAgICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gaXRyLT5maXJzdDsKLSAgICAgICAgICBpbnRfZXZ0X2RhdGEuc3RyZWFtcyA9IGl0ci0+c2Vjb25kOwotICAgICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgJmludF9ldnRfZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCQVBfU1RBUlRfUkVRX0VWVDogewotICAgICAgQmFwU3RhcnQgKmV2dF9kYXRhID0gKEJhcFN0YXJ0ICopIHBfZGF0YTsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0YXJ0X3N0cmVhbXMgPSBldnRfZGF0YS0+c3RyZWFtczsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHN0YXJ0IHN0cmVhbXMgc2l6ZSAiIDw8IHN0YXJ0X3N0cmVhbXMuc2l6ZSgpOwotCi0gICAgICBmb3IgKGF1dG8gaXQgPSBzdGFydF9zdHJlYW1zLmJlZ2luKCk7IGl0ICE9IHN0YXJ0X3N0cmVhbXMuZW5kKCk7KSB7Ci0gICAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKCppdCk7Ci0gICAgICAgIGlmKCFjb250ZXh0IHx8IGNvbnRleHQtPnN0cmVhbV9zdGF0ZSAhPSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIFN0cmVhbSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIjsKLSAgICAgICAgICBpdCA9IHN0YXJ0X3N0cmVhbXMuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGl0Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoIXN0YXJ0X3N0cmVhbXMuc2l6ZSgpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBOb3QgZWxpZ2libGUgZm9yIHN0cmVhbSBzdGFydCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyB2YWxpZGF0ZSB0aGUgY29tYmluYXRpb25zIG1lZGlhIFR4IG9yIHZvaWNlIFRYfFJYCi0gICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRCeVN0cmVhbXNUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0X3N0cmVhbXMpOwotICAgICAgLy8gY3JlYXRlIG5ldyB0cmFja2VyCi0gICAgICBpZih0cmFja2VyID09IG51bGxwdHIpIHsKLSAgICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IHN0cmVhbV90cmFja2Vycy5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbnVsbHB0ciwgbnVsbHB0ciwgJnN0YXJ0X3N0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnRyb2xUeXBlOjpTdGFydCk7Ci0gICAgICAgIHRyYWNrZXItPlN0YXJ0KCk7Ci0gICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCQVBfU1RPUF9SRVFfRVZUOiB7Ci0gICAgICBCYXBTdG9wICpldnRfZGF0YSA9IChCYXBTdG9wICopIHBfZGF0YTsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0b3Bfc3RyZWFtcyA9IGV2dF9kYXRhLT5zdHJlYW1zOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIHN0b3Agc3RyZWFtcyBzaXplICIgPDwgc3RvcF9zdHJlYW1zLnNpemUoKTsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gc3RvcF9zdHJlYW1zLmJlZ2luKCk7IGl0ICE9IHN0b3Bfc3RyZWFtcy5lbmQoKTspIHsKLSAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLSAgICAgICAgaWYoIWNvbnRleHQgfHwgKGNvbnRleHQtPnN0cmVhbV9zdGF0ZSAhPSBTdHJlYW1TdGF0ZTo6U1RSRUFNSU5HICYmCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSAhPSBTdHJlYW1TdGF0ZTo6U1RBUlRJTkcpKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIFN0cmVhbSBpcyBub3QgaW4gc3RyZWFtaW5nIHN0YXRlIjsKLSAgICAgICAgICBpdCA9IHN0b3Bfc3RyZWFtcy5lcmFzZShpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaXQrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighc3RvcF9zdHJlYW1zLnNpemUoKSkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICIgTm90IGVsaWdpYmxlIGZvciBzdHJlYW0gc3RvcCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRCeVN0cmVhbXNUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3Bfc3RyZWFtcyk7Ci0gICAgICAvLyBjcmVhdGUgdGhlIG5ldyB0cmFja2VyCi0gICAgICBpZih0cmFja2VyID09IG51bGxwdHIpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbWJpbmF0aW9ucyBtZWRpYSBUeCBvciB2b2ljZSBUWHxSWAotICAgICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0cmVhbWluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG51bGxwdHIsIG51bGxwdHIsICZzdG9wX3N0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZTo6U3RvcCk7Ci0gICAgICAgIHRyYWNrZXItPlN0YXJ0KCk7Ci0gICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCQVBfU1RSRUFNX1VQREFURV9SRVFfRVZUOiB7Ci0gICAgICBCYXBTdHJlYW1VcGRhdGUgKmV2dF9kYXRhID0gKEJhcFN0cmVhbVVwZGF0ZSAqKSBwX2RhdGE7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1VcGRhdGU+IHVwZGF0ZV9zdHJlYW1zID0gZXZ0X2RhdGEtPnVwZGF0ZV9zdHJlYW1zOwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RyZWFtczsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gdXBkYXRlX3N0cmVhbXMuYmVnaW4oKTsgaXQgIT0gdXBkYXRlX3N0cmVhbXMuZW5kKCk7KSB7Ci0gICAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKGl0LT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgIGlmKCFjb250ZXh0IHx8IChjb250ZXh0LT5zdHJlYW1fc3RhdGUgIT0gU3RyZWFtU3RhdGU6OlNUUkVBTUlORyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+c3RyZWFtX3N0YXRlICE9IFN0cmVhbVN0YXRlOjpTVEFSVElORykpIHsKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICIgU3RyZWFtIGlzIG5vdCBpbiBwcm9wZXIgc3RhdGUiOwotICAgICAgICAgIGl0ID0gdXBkYXRlX3N0cmVhbXMuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGl0Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoIXVwZGF0ZV9zdHJlYW1zLnNpemUoKSkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICIgQWxsIHN0cmVhbXMgYXJlIG5vdCBpbiBwcm9wZXIgc3RhdGUiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZm9yIChhdXRvIGl0ID0gdXBkYXRlX3N0cmVhbXMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHVwZGF0ZV9zdHJlYW1zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IGl0LT5zdHJlYW1fdHlwZTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sodHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiB1cGRhdGUgc3RyZWFtcyBzaXplICIgPDwgc3RyZWFtcy5zaXplKCk7Ci0KLSAgICAgIFN0cmVhbVRyYWNrZXIgKnRyYWNrZXIgPSBzdHJlYW1fdHJhY2tlcnMuRmluZEJ5U3RyZWFtc1R5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1zKTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IHRyYWNrZXIKLSAgICAgIGlmKHRyYWNrZXIgPT0gbnVsbHB0cikgewotICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29tYmluYXRpb25zIG1lZGlhIFR4IG9yIHZvaWNlIFRYfFJYCi0gICAgICAgIFN0cmVhbVRyYWNrZXIgKnRyYWNrZXIgPSBzdHJlYW1fdHJhY2tlcnMuRmluZE9yQWRkQnlUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RyZWFtaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnRyb2xUeXBlOjpVcGRhdGVTdHJlYW0pOwotICAgICAgICB0cmFja2VyLT5TdGFydCgpOwotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQkFQX1JFQ09ORklHX1JFUV9FVlQ6IHsKLSAgICAgIEJhcFJlY29uZmlnICpldnRfZGF0YSA9IChCYXBSZWNvbmZpZyAqKSBwX2RhdGE7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gcmVjb25mX3N0cmVhbXMgPSBldnRfZGF0YS0+c3RyZWFtczsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXM7Ci0KLSAgICAgIGZvciAoYXV0byBpdCA9IHJlY29uZl9zdHJlYW1zLmJlZ2luKCk7IGl0ICE9IHJlY29uZl9zdHJlYW1zLmVuZCgpOykgewotICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotICAgICAgICBpZighY29udGV4dCB8fCBjb250ZXh0LT5zdHJlYW1fc3RhdGUgIT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBTdHJlYW0gaXMgbm90IGluIENvbm5lY3RlZCBzdGF0ZSI7Ci0gICAgICAgICAgaXQgPSByZWNvbmZfc3RyZWFtcy5lcmFzZShpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaXQrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighcmVjb25mX3N0cmVhbXMuc2l6ZSgpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBBbGwgc3RyZWFtcyBhcmUgbm90IGNvbm5lY3RlZCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBmb3IgKGF1dG8gaXQgPSByZWNvbmZfc3RyZWFtcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gcmVjb25mX3N0cmVhbXMuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaXQtPnN0cmVhbV90eXBlOwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlKTsKLSAgICAgIH0KLQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIHJlY29uZiBzdHJlYW1zIHNpemUgIiA8PCBzdHJlYW1zLnNpemUoKTsKLQotICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IHN0cmVhbV90cmFja2Vycy5GaW5kQnlTdHJlYW1zVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbXMpOwotICAgICAgLy8gY3JlYXRlIHRoZSBuZXcgdHJhY2tlcgotICAgICAgaWYodHJhY2tlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb21iaW5hdGlvbnMgbWVkaWEgVHggb3Igdm9pY2UgVFh8UlgKLSAgICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IHN0cmVhbV90cmFja2Vycy5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBudWxscHRyLCAmcmVjb25mX3N0cmVhbXMsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZTo6UmVjb25maWcpOwotICAgICAgICB0cmFja2VyLT5TdGFydCgpOwotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgUGFjc0Nvbm5lY3Rpb25TdGF0ZSAqcGFjc19zdGF0ZSA9ICAoUGFjc0Nvbm5lY3Rpb25TdGF0ZSAqKSBwX2RhdGE7Ci0gICAgICBVcGRhdGVQYWNzU3RhdGUocGFjc19zdGF0ZS0+c3RhdGUpOwotICAgICAgaW50IHN0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICAgIGlmIChwYWNzX3N0YXRlLT5zdGF0ZSAhPSBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICBpZihQdXNoRXZlbnRUb1RyYWNrZXIoZXZlbnQsIHBfZGF0YSwgJnRyYW5zaWVudF9zdGF0ZV9pZHMpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db250ZXh0ICo+ICpjb250ZXh0X2xpc3QgPSBjb250ZXh0cy0+R2V0QWxsQ29udGV4dHMoKTsKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zOwotCi0gICAgICAgICAgZm9yIChhdXRvIGl0ID0gY29udGV4dF9saXN0LT5iZWdpbigpOyBpdCAhPSBjb250ZXh0X2xpc3QtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgICAgaWYoKCppdCktPnN0cmVhbV9zdGF0ZSAhPSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKCgqaXQpLT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVfbWFwWygqaXQpLT5zdHJlYW1fc3RhdGVdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmVhbVRyYWNrZXIgKnRyYWNrZXIgPSBzdHJlYW1fdHJhY2tlcnMuRmluZEJ5U3RyZWFtc1R5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbXMpOwotICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IHRyYWNrZXIKLSAgICAgICAgICBpZih0cmFja2VyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb21iaW5hdGlvbnMgbWVkaWEgVHggb3Igdm9pY2UgVFh8UlgKLSAgICAgICAgICAgIFN0cmVhbVRyYWNrZXIgKnRyYWNrZXIgPSBzdHJlYW1fdHJhY2tlcnMuRmluZE9yQWRkQnlUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG51bGxwdHIsIG51bGxwdHIsICZzdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnRyb2xUeXBlOjpEaXNjb25uZWN0KTsKLSAgICAgICAgICAgIHRyYWNrZXItPlN0YXJ0KCk7Ci0gICAgICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29udGV4dCAqPiAqY29udGV4dF9saXN0ID0gY29udGV4dHMtPkdldEFsbENvbnRleHRzKCk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IGRpc2Nfc3RyZWFtczsKLQotICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb250ZXh0X2xpc3QtPmJlZ2luKCk7IGl0ICE9IGNvbnRleHRfbGlzdC0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgaWYoKCppdCktPnN0cmVhbV9zdGF0ZSAhPSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBkaXNjX3N0cmVhbXMucHVzaF9iYWNrKCgqaXQpLT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBzaXplOiAiIDw8IGRpc2Nfc3RyZWFtcy5zaXplKCk7Ci0KLSAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbWJpbmF0aW9ucyBtZWRpYSBUeCBvciB2b2ljZSBUWHxSWAotICAgICAgICBzdGQ6Om1hcDxTdHJlYW1UcmFja2VyICogLCBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiA+Ci0gICAgICAgICAgIHRyYWNrZXJfYW5kX3R5cGVfbGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3RyYWNrZXJzLkdldFRyYWNrZXJzQnlUeXBlKCZkaXNjX3N0cmVhbXMpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIGFsbCBzdHJlYW1zIGRpc2Nvbm5lY3Rpb24gb3Igc3Vic2V0IG9mIHN0cmVhbXMKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBuZXcgdHJhY2tlcgotICAgICAgICBmb3IgKGF1dG8gaXRyID0gdHJhY2tlcl9hbmRfdHlwZV9saXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICBpdHIgIT0gdHJhY2tlcl9hbmRfdHlwZV9saXN0LmVuZCgpOyBpdHIrKykgewotICAgICAgICAgIGlmKGl0ci0+Zmlyc3QgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgc3RkOjptYXA8aW50ICwgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gPgotICAgICAgICAgICAgICAgbGlzdCA9IFNwbGl0Q29udGV4dE9uU3RhdGUoJml0ci0+c2Vjb25kKTsKLSAgICAgICAgICAgIGZvciAoYXV0byBpdHJfMiA9IGxpc3QuYmVnaW4oKTsgaXRyXzIgIT0gbGlzdC5lbmQoKTsgaXRyXzIrKykgewotICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHJfMi0+Zmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbnVsbHB0ciwgbnVsbHB0ciwgJml0cl8yLT5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29udHJvbFR5cGU6OkRpc2Nvbm5lY3QpOwotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgbmV3IHRyYWNrZXIgc3RhcnQgIjsKLSAgICAgICAgICAgICAgdHJhY2tlci0+U3RhcnQoKTsKLSAgICAgICAgICAgICAgdHJhY2tlci0+UHJvY2Vzc0V2ZW50KGV2ZW50LCBwX2RhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgZXhpc3RpbmcgdHJhY2tlciBzdGFydCAiOwotICAgICAgICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IGl0ci0+Zmlyc3Q7Ci0gICAgICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgUEFDU19BVURJT19DT05URVhUX1JFU19FVlQ6IHsKLSAgICAgIC8vIHVwZGF0ZSB0aGUgc2FtZSBldmVudCB0byB1cHBlciBsYXllcnMgYWxzbwotICAgICAgUGFjc0F2YWlsYWJsZUNvbnRleHRzICpjb250ZXh0cyA9IChQYWNzQXZhaWxhYmxlQ29udGV4dHMgKikgcF9kYXRhOwotICAgICAgdWNsX2NhbGxiYWNrcy0+T25TdHJlYW1BdmFpbGFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0cy0+YXZhaWxhYmxlX2NvbnRleHRzID4+IDE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHRzLT5hdmFpbGFibGVfY29udGV4dHMgJiAweEZGRkYpKTsKLSAgICAgIHN0ZDo6dmVjdG9yPGludD4gc3RhdGVfaWRzID0geyBTdHJlYW1UcmFja2VyOjprU3RhdGVTdGFydGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVVcGRhdGluZ307Ci0gICAgICBQdXNoRXZlbnRUb1RyYWNrZXIoZXZlbnQsIHBfZGF0YSwgJnN0YXRlX2lkcyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgUEFDU19ESVNDT1ZFUllfUkVTX0VWVDoKLSAgICBjYXNlIEFTQ1NfRElTQ09WRVJZX1JFU19FVlQ6IHsKLSAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb21iaW5hdGlvbnMgbWVkaWEgVHggb3Igdm9pY2UgVFh8UlgKLSAgICAgIHN0ZDo6dmVjdG9yPGludD4gc3RhdGVfaWRzID0geyBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVJlY29uZmlndXJpbmcgfTsKLSAgICAgIFB1c2hFdmVudFRvVHJhY2tlcihldmVudCwgcF9kYXRhLCAmc3RhdGVfaWRzKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBU0NTX0NPTk5FQ1RJT05fU1RBVEVfRVZUOiB7Ci0gICAgICBBc2NzQ29ubmVjdGlvblN0YXRlICphc2NzX3N0YXRlID0gIChBc2NzQ29ubmVjdGlvblN0YXRlICopIHBfZGF0YTsKLSAgICAgIFVwZGF0ZUFzY3NTdGF0ZShhc2NzX3N0YXRlLT5zdGF0ZSk7Ci0gICAgICBQdXNoRXZlbnRUb1RyYWNrZXIoZXZlbnQsIHBfZGF0YSwgJnRyYW5zaWVudF9zdGF0ZV9pZHMpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFTQ1NfQVNFX09QX0ZBSUxFRF9FVlQ6IHsKLSAgICAgIGlmKFB1c2hFdmVudFRvVHJhY2tlcihldmVudCwgcF9kYXRhLCAmdHJhbnNpZW50X3N0YXRlX2lkcykpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVNDU19BU0VfU1RBVEVfRVZUOiB7Ci0gICAgICBpZihQdXNoRXZlbnRUb1RyYWNrZXIoZXZlbnQsIHBfZGF0YSwgJnRyYW5zaWVudF9zdGF0ZV9pZHMpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLy8gY3JlYXRlIHN0cm0gdHJhY2tlcnMgYmFzZWQgb24gYXNlIElEIGFuZCBwdXNoIGl0IHRvCi0gICAgICAvLyBuZXdseSBjcmVhdGVkIHRyYWNrZXIuCi0gICAgICAvLyBUT0RPIEhhbmRsZSBSZWxlYXNpbmcgLCBkaXNhYmxpbmcsIGNvZGVjIGNvbmZpZ3VyZWQgc3RhdGVzCi0gICAgICAvLyBpbml0aWF0ZWQgZnJvbSByZW1vdGUgZGV2aWNlCi0KLSAgICAgIEFzY3NTdGF0ZSAqYXNjcyA9ICAoKEFzY3NTdGF0ZSAqKSBwX2RhdGEpOwotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqYXVkaW9fc3RyZWFtID0gbnVsbHB0cjsKLSAgICAgIC8vIGZpbmQgb3V0IHRoZSBzdHJlYW0gZm9yIHRoZSBnaXZlbiBhc2UgaWQKLSAgICAgIHVpbnQ4X3QgYXNlX2lkID0gYXNjcy0+YXNlX3BhcmFtcy5hc2VfaWQ7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zOwotICAgICAgaW50IHN0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLQotICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gR2V0QXVkaW9TdHJlYW1zKCk7Ci0gICAgICBhdWRpb19zdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoYXNlX2lkKTsKLSAgICAgIGlmKGF1ZGlvX3N0cmVhbSkgewotICAgICAgICBTdHJlYW1UeXBlIHR5cGUgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IGF1ZGlvX3N0cmVhbS0+YXVkaW9fY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBhdWRpb19zdHJlYW0tPmRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlKTsKLSAgICAgICAgc3RhdGUgPSBhdWRpb19zdHJlYW0tPm92ZXJhbGxfc3RhdGU7Ci0gICAgICB9Ci0KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBzaXplICIgPDwgc3RyZWFtcy5zaXplKCk7Ci0KLSAgICAgIGlmIChhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUkVMRUFTSU5HKSB7Ci0KLSAgICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IHN0cmVhbV90cmFja2Vycy5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG51bGxwdHIsIG51bGxwdHIsICZzdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29udHJvbFR5cGU6OkRpc2Nvbm5lY3QpOwotICAgICAgICB0cmFja2VyLT5TdGFydCgpOwotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9IGVsc2UgaWYgKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9ESVNBQkxJTkcpIHsKLQotICAgICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbnVsbHB0ciwgbnVsbHB0ciwgJnN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZTo6U3RvcCk7Ci0gICAgICAgIHRyYWNrZXItPlN0YXJ0KCk7Ci0gICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgIH0gZWxzZSBpZiAoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjczo6QVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgLy8gVE9ETyByZWNvbmZpZyBmcm9tIHJlbW90ZSBkZXZpY2UKLSAgICAgIH0gIGVsc2UgaWYgKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3M6OkFTRV9TVEFURV9RT1NfQ09ORklHVVJFRCkgewotICAgICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBDSVMgaXMgbG9zdCBhbmQgZGV0ZWN0ZWQgb24gcmVtb3RlIHNpZGUKLSAgICAgICAgLy8gZmlyc3Qgc28gaXQgd2lsbCBpbW1lZGlhdGVseSB0cmFuc2l0aW9uIHRvIFFPUyBjb25maWd1cmVkLgotICAgICAgICBTdHJlYW1UcmFja2VyICp0cmFja2VyID0gc3RyZWFtX3RyYWNrZXJzLkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbnVsbHB0ciwgbnVsbHB0ciwgJnN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZTo6U3RvcCk7Ci0gICAgICAgIHRyYWNrZXItPlN0YXJ0KCk7Ci0gICAgICAgIHRyYWNrZXItPlByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBDSVNfR1JPVVBfU1RBVEVfRVZUOiB7Ci0gICAgICAvLyB2YWxpZGF0ZSB0aGUgY29tYmluYXRpb25zIG1lZGlhIFR4IG9yIHZvaWNlIFRYfFJYCi0gICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN0YXRlX2lkcyA9IHsgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RhcnRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RvcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlRGlzY29ubmVjdGluZyB9OwotICAgICAgUHVzaEV2ZW50VG9UcmFja2VyKGV2ZW50LCBwX2RhdGEsICZzdGF0ZV9pZHMpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIENJU19TVEFURV9FVlQ6IHsKLSAgICAgIENpc1N0cmVhbVN0YXRlICpkYXRhID0gKENpc1N0cmVhbVN0YXRlICopIHBfZGF0YTsKLQotICAgICAgaWYoUHVzaEV2ZW50VG9UcmFja2VyKGV2ZW50LCBwX2RhdGEsICZ0cmFuc2llbnRfc3RhdGVfaWRzKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gZmluZCBvdXQgdGhlIHN0cmVhbSBmb3IgdGhlIGdpdmVuIGFzZSBpZAotICAgICAgaW50IHN0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXM7Ci0KLSAgICAgIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IEdldEF1ZGlvU3RyZWFtcygpOwotICAgICAgc3RkOjp2ZWN0b3I8VWNhc3RBdWRpb1N0cmVhbSAqPiBjaXNfc3RyZWFtcyA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlDaXNJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5jaWdfaWQsIGRhdGEtPmNpc19pZCk7Ci0KLQotICAgICAgaWYoY2lzX3N0cmVhbXMuZW1wdHkoKSkgYnJlYWs7Ci0KLSAgICAgIGZvciAoYXV0byBpdCA9IGNpc19zdHJlYW1zLmJlZ2luKCk7IGl0ICE9IGNpc19zdHJlYW1zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gKCppdCktPmF1ZGlvX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gKCppdCktPmRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlKTsKLSAgICAgICAgc3RhdGUgPSAoKml0KS0+b3ZlcmFsbF9zdGF0ZTsKLSAgICAgIH0KLQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIHNpemUgIiA8PCBzdHJlYW1zLnNpemUoKTsKLQotICAgICAgLy8gY3JlYXRlIHN0cm0gdHJhY2tlcnMgYmFzZWQgb24gQ0lTIElEIGFuZCBwdXNoIGl0IHRvCi0gICAgICAvLyBuZXdseSBjcmVhdGVkIHRyYWNrZXIuCi0gICAgICAvLyBDSVMgZGlzY29ubmVjdGVkCi0gICAgICBpZihkYXRhLT5zdGF0ZSA9PSBDaXNTdGF0ZTo6UkVBRFkpIHsKLSAgICAgICAgU3RyZWFtVHJhY2tlciAqdHJhY2tlciA9IHN0cmVhbV90cmFja2Vycy5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG51bGxwdHIsIG51bGxwdHIsICZzdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29udHJvbFR5cGU6OlN0b3ApOwotICAgICAgICB0cmFja2VyLT5TdGFydCgpOwotICAgICAgICB0cmFja2VyLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQkFQX1RJTUVfT1VUX0VWVDogewotICAgICAgQmFwVGltZW91dCogZXZ0X2RhdGEgPSAoQmFwVGltZW91dCopIHBfZGF0YTsKLQotICAgICAgLy9HZXQgQ2FjaGVkIHRyYWNrZXIgYW5kIGNoZWNrIGlmIGl0IGlzIHZhbGlkCi0gICAgICBpZiAoc3RyZWFtX3RyYWNrZXJzLklzU3RyZWFtVHJhY2tlclZhbGlkKGV2dF9kYXRhLT50cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zaWVudF9zdGF0ZV9pZHMpKSB7Ci0gICAgICAgIFB1c2hFdmVudFRvVHJhY2tlcihldmVudCwgcF9kYXRhLCAmdHJhbnNpZW50X3N0YXRlX2lkcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IFRyYWNrZXIgaXMgbm90IHZhbGlkICI7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIGxvb2sgZm9yIGFsbCBzdHJlYW0gdHJhY2tlcnMgd2hpY2ggYXJlIG1vdmVkIHRvIHN0YWJsZSBzdGF0ZXMKLSAgLy8gbGlrZSBjb25uZWN0ZWQsIHN0cmVhbWluZywgaWRsZSwgYW5kIGRlc3Ryb3kgdGhvc2UgdHJhY2tlcnMgaGVyZQotICBzdHJlYW1fdHJhY2tlcnMuUmVtb3ZlQnlTdGF0ZXMoc3RhYmxlX3N0YXRlX2lkcyk7Ci19Ci0KLS8vIFRPRE8gdG8gaW50cm9kdWNlIGEgcXVldWUgZm9yIHNlcmlhbGl6aW5nIHRoZSBBdWRpbyBzdHJlYW0gZXN0YWJsaXNobWVudAotVXN0cmVhbU1hbmFnZXIqIFVzdHJlYW1NYW5hZ2Vyczo6RmluZEJ5QWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihzdHJtX21ncnMuYmVnaW4oKSwgc3RybV9tZ3JzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICBbJmFkZHJlc3NdKFVzdHJlYW1NYW5hZ2VyICpzdHJtX21ncikgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RybV9tZ3ItPkdldEFkZHJlc3MoKSA9PSBhZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICByZXR1cm4gKGl0ZXIgPT0gc3RybV9tZ3JzLmVuZCgpKSA/IG51bGxwdHIgOiAoKml0ZXIpOwotfQotCi1Vc3RyZWFtTWFuYWdlciogVXN0cmVhbU1hbmFnZXJzOjpGaW5kb3JBZGRCeUFkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhY3NDbGllbnQgKnBhY3NfY2xpZW50LCB1aW50MTZfdCBwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzY3NDbGllbnQgKmFzY3NfY2xpZW50LCBDaXNJbnRlcmZhY2UgKmNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgVWNhc3RDbGllbnRDYWxsYmFja3MqIHVjbF9jYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBCYXBBbGFybSAqYmFwX2FsYXJtKSAgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoc3RybV9tZ3JzLmJlZ2luKCksIHN0cm1fbWdycy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgWyZhZGRyZXNzXShVc3RyZWFtTWFuYWdlciAqc3RybV9tZ3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cm1fbWdyLT5HZXRBZGRyZXNzKCkgPT0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgaWYgKGl0ZXIgPT0gc3RybV9tZ3JzLmVuZCgpKSB7Ci0gICAgVXN0cmVhbU1hbmFnZXIgKnN0cm1fbWdyID0gbmV3IFVzdHJlYW1NYW5hZ2VyKGFkZHJlc3MsIHBhY3NfY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNzX2NsaWVudF9pZCwgYXNjc19jbGllbnQsIGNpc19pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2xfY2FsbGJhY2tzLCBiYXBfYWxhcm0pOwotICAgIHN0cm1fbWdycy5wdXNoX2JhY2soc3RybV9tZ3IpOwotICAgIHJldHVybiBzdHJtX21ncjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKCppdGVyKTsKLSAgfQotfQotCi1zdGQ6OnZlY3RvcjxVc3RyZWFtTWFuYWdlciAqPiAqVXN0cmVhbU1hbmFnZXJzOjpHZXRBbGxNYW5hZ2VycygpIHsKLSAgcmV0dXJuICZzdHJtX21ncnM7Ci0KLX0KLQotdm9pZCBVc3RyZWFtTWFuYWdlcnM6OlJlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGZvciAoYXV0byBpdCA9IHN0cm1fbWdycy5iZWdpbigpOyBpdCAhPSBzdHJtX21ncnMuZW5kKCk7KSB7Ci0gICAgaWYgKCgqaXQpLT5HZXRBZGRyZXNzKCkgPT0gYWRkcmVzcykgewotICAgICAgZGVsZXRlKCppdCk7Ci0gICAgICBpdCA9IHN0cm1fbWdycy5lcmFzZShpdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGl0Kys7Ci0gICAgfQotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1Y2FzdAotfSAgLy8gbmFtZXNwYWNlIGJhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9iYXAvdWNsaWVudF9zdHJtX3RyYWNrZXIuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X3N0cm1fdHJhY2tlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3MmU1Ni4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2JhcC91Y2xpZW50X3N0cm1fdHJhY2tlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYnRhX2JhcF91Y2xpZW50X2FwaS5oIgotI2luY2x1ZGUgInVjYXN0X2NsaWVudF9pbnQuaCIKLSNpbmNsdWRlICJidF90cmFjZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2JhcF9jb2RlY191dGlscy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJ1Y2xpZW50X2FsYXJtLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgdWNhc3QgewotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNJbmRleDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0JQUzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNTYW1wbGVSYXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ2hhbm5lbE1vZGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpjaXM6OkNpc0ludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VDb2RlY0NvbmZpZ09wOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZVFvc0NvbmZpZ09wOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZUVuYWJsZU9wOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZVN0YXJ0UmVhZHlPcDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VTdG9wUmVhZHlPcDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VEaXNhYmxlT3A7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlUmVsZWFzZU9wOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZVVwZGF0ZU1ldGFkYXRhT3A7Ci0KLXVzaW5nIGNpczo6SXNvSGNpU3RhdHVzOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFsYXJtOjpCYXBBbGFybTsKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfTUVESUE7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q09OVEVOVF9UWVBFX1VOU1BFQ0lGSUVEOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfR0FNRTsKLQotY29uc3RleHByIHVpbnQ4X3QgIExUVl9UWVBFX1NBTVBfRlJFUSAgICAgICAgICAgPSAwWDAxOwotY29uc3RleHByIHVpbnQ4X3QgIExUVl9UWVBFX0ZSQU1FX0RVUiAgICAgICAgICAgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3QgIExUVl9UWVBFX0NITkxfQUxMT0MgICAgICAgICAgPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3QgIExUVl9UWVBFX09DVFNfUEVSX0ZSQU1FICAgICAgPSAwWDA0OwotY29uc3RleHByIHVpbnQ4X3QgIExUVl9UWVBFX0ZSQU1FU19QRVJfU0RVICAgICAgPSAwWDA1OwotY29uc3RleHByIHVpbnQ4X3QgIExUVl9UWVBFX1NUUk1fQVVESU9fQ09OVEVYVFMgPSAweDAyOwotCi1jb25zdGV4cHIgdWludDhfdCAgTFRWX0xFTl9TQU1QX0ZSRVEgICAgICAgICAgICA9IDBYMDI7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX0xFTl9GUkFNRV9EVVIgICAgICAgICAgICA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX0xFTl9DSE5MX0FMTE9DICAgICAgICAgICA9IDB4MDU7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX0xFTl9PQ1RTX1BFUl9GUkFNRSAgICAgICA9IDBYMDM7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX0xFTl9GUkFNRVNfUEVSX1NEVSAgICAgICA9IDBYMDI7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX0xFTl9TVFJNX0FVRElPX0NPTlRFWFRTICA9IDB4MDM7Ci0KLWNvbnN0ZXhwciB1aW50OF90ICBMVFZfVkFMX1NBTVBfRlJFUV84SyAgICAgICAgID0gMFgwMTsKLS8vY29uc3RleHByIHVpbnQ4X3QgIExUVl9WQUxfU0FNUF9GUkVRXzExSyAgICAgICAgPSAwWDAyOwotY29uc3RleHByIHVpbnQ4X3QgIExUVl9WQUxfU0FNUF9GUkVRXzE2SyAgICAgICAgPSAwWDAzOwotLy9jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfMjJLICAgICAgICA9IDBYMDQ7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfMjRLICAgICAgICA9IDBYMDU7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfMzJLICAgICAgICA9IDBYMDY7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfNDQxSyAgICAgICA9IDBYMDc7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfNDhLICAgICAgICA9IDBYMDg7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfODgySyAgICAgICA9IDBYMDk7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfOTZLICAgICAgICA9IDBYMEE7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfMTc2SyAgICAgICA9IDBYMEI7Ci1jb25zdGV4cHIgdWludDhfdCAgTFRWX1ZBTF9TQU1QX0ZSRVFfMTkySyAgICAgICA9IDBYMEM7Ci0vL2NvbnN0ZXhwciB1aW50OF90ICBMVFZfVkFMX1NBTVBfRlJFUV8zODRLICAgICAgID0gMFgwRDsKLQotY29uc3RleHByIHVpbnQ4X3QgIExDM19DT0RFQ19JRCAgICAgICAgICA9IDB4MDY7Ci1jb25zdGV4cHIgdWludDhfdCAgQVNDU19DTElFTlRfSUQgICAgICAgID0gMHgwMTsKLQotY29uc3RleHByIHVpbnQ4X3QgIFRHVF9MT1dfTEFURU5DWSAgICAgICA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCAgVEdUX0JBTF9MQVRFTkNZICAgICAgID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90ICBUR1RfSElHSF9SRUxJQUJMRSAgICAgPSAweDAzOwotCi1zdGQ6Om1hcDxDb2RlY1NhbXBsZVJhdGUsIHVpbnQ4X3Q+IGZyZXFfdG9fbHR2X21hcCA9IHsKLSAge0NvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCwgICBMVFZfVkFMX1NBTVBfRlJFUV84SyAgIH0sCi0gIHtDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwLCAgTFRWX1ZBTF9TQU1QX0ZSRVFfMTZLICB9LAotICB7Q29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8yNDAwMCwgIExUVl9WQUxfU0FNUF9GUkVRXzI0SyAgfSwKLSAge0NvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDAsICBMVFZfVkFMX1NBTVBfRlJFUV8zMksgIH0sCi0gIHtDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwLCAgTFRWX1ZBTF9TQU1QX0ZSRVFfNDQxSyB9LAotICB7Q29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80ODAwMCwgIExUVl9WQUxfU0FNUF9GUkVRXzQ4SyAgfSwKLSAge0NvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODgyMDAsICBMVFZfVkFMX1NBTVBfRlJFUV84ODJLIH0sCi0gIHtDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzk2MDAwLCAgTFRWX1ZBTF9TQU1QX0ZSRVFfOTZLICB9LAotICB7Q29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNzY0MDAsIExUVl9WQUxfU0FNUF9GUkVRXzE3NksgfSwKLSAge0NvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTkyMDAwLCBMVFZfVkFMX1NBTVBfRlJFUV8xOTJLIH0KLX07Ci0KLXN0ZDo6bGlzdDx1aW50OF90PiBkaXJlY3Rpb25zID0gewotICBjaXM6OkRJUl9GUk9NX0FJUiwKLSAgY2lzOjpESVJfVE9fQUlSCi19OwotCi1zdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbG9jYXRpb25zID0gewotICBBVURJT19MT0NfTEVGVCwKLSAgQVVESU9fTE9DX1JJR0hUCi19OwotCi0vLyBjb21tb24gZnVuY3Rpb25zIHVzZWQgZnJvbSBTdHJlYW0gdHJhY2tlciBzdGF0ZSBIYW5kbGVycwotdWludDhfdCBTdHJlYW1UcmFja2VyOjpDaG9vc2VCZXN0Q29kZWMoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjUW9zQ29uZmlnPiAqY29kZWNfcW9zX2NvbmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNzRGlzY292ZXJ5ICpwYWNzX2Rpc2NvdmVyeSkgewotICBib29sIGNvZGVjX2ZvdW5kID0gZmFsc2U7Ci0gIHVpbnQ4X3QgaW5kZXggPSAwOwotICAvLyBjaGVjayB0aGUgc3RyZWFtIGRpcmVjdGlvbiwgYmFzZWQgb24gZGlyZWN0aW9uIGxvb2sgZm9yCi0gIC8vIG1hdGNoaW5nIHJlY29yZCBmcm9tIHByZWZlcnJlZCBsaXN0IG9mIHVwcGVyIGxheWVyIGFuZAotICAvLyByZW1vdGUgZGV2aWNlIHNpbmsgb3Igc3JjIHBhYyByZWNvcmRzCi0gIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiAqcGFjX3JlY29yZHMgPSBudWxscHRyOwotICBpZihzdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgcGFjX3JlY29yZHMgPSAmcGFjc19kaXNjb3ZlcnktPnNpbmtfcGFjX3JlY29yZHM7Ci0gIH0gZWxzZSBpZihzdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICBwYWNfcmVjb3JkcyA9ICZwYWNzX2Rpc2NvdmVyeS0+c3JjX3BhY19yZWNvcmRzOwotICB9Ci0KLSAgaWYgKCFwYWNfcmVjb3JkcykgewotICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJwYWNfcmVjb3JkcyBpcyBudWxsIjsKLSAgICAgcmV0dXJuIDB4RkY7Ci0gIH0KLSAgRGV2aWNlVHlwZSBkZXZfdHlwZSA9IHN0cm1fbWdyXy0+R2V0RGV2VHlwZSgpOwotICBmb3IgKGF1dG8gaSA9IGNvZGVjX3Fvc19jb25maWdzLT5iZWdpbigpOyBpICE9IGNvZGVjX3Fvc19jb25maWdzLT5lbmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBpKyssIGluZGV4KyspIHsKLSAgICBpZihkZXZfdHlwZSA9PSBEZXZpY2VUeXBlOjpFQVJCVUQgfHwKLSAgICAgICBkZXZfdHlwZSA9PSBEZXZpY2VUeXBlOjpIRUFEU0VUX1NURVJFTykgewotICAgICAgaWYoKCppKS5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5zaXplKCkgIT0gMSkgY29udGludWU7Ci0gICAgfSBlbHNlIGlmKGRldl90eXBlID09IERldmljZVR5cGU6OkhFQURTRVRfU1BMSVRfU1RFUkVPKSB7Ci0gICAgICBpZigoKmkpLnFvc19jb25maWcuYXNjc19jb25maWdzLnNpemUoKSAhPSAyKSBjb250aW51ZTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGogPSBwYWNfcmVjb3Jkcy0+YmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaiAhPSBwYWNfcmVjb3Jkcy0+ZW5kKCk7aisrKSB7Ci0gICAgICBDb2RlY0NvbmZpZyAqc3JjID0gJigoKmkpLmNvZGVjX2NvbmZpZyk7Ci0gICAgICBDb2RlY0NvbmZpZyAqZHN0ID0gJigqaik7Ci0gICAgICBpZiAoSXNDb2RlY0NvbmZpZ0VxdWFsKHNyYyxkc3QpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBDaGVja2luZyBmb3IgbWF0Y2hpbmcgQ29kZWMiOwotICAgICAgICBpZiAoR2V0TGMzUVByZWZlcmVuY2Uoc3JjKSAmJgotICAgICAgICAgICAgR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoZHN0KSkgewotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBNYXRjaGluZyBDb2RlYyBMQzNRIEZvdW5kICIKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBmb3IgZGlyZWN0aW9uOiAiIDw8IGxvZ2hleChzdHJlYW1fdHlwZS5kaXJlY3Rpb24pOwotICAgICAgICAgIHVpbnQ4X3QgbGMzcVZlciA9IEdldENhcGFWZW5kb3JNZXRhRGF0YUxjM1FWZXIoZHN0KTsKLSAgICAgICAgICBVcGRhdGVWZW5kb3JNZXRhRGF0YUxjM1FQcmVmKHNyYywgdHJ1ZSk7Ci0gICAgICAgICAgVXBkYXRlVmVuZG9yTWV0YURhdGFMYzNRVmVyKHNyYywgbGMzcVZlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IExDM1Egbm90IHByZWZlcmVkLCBnb2luZyB3aXRoIExDMyAiCi0gICAgICAgICAgICAgICAgICAgPDwgImZvciBkaXJlY3Rpb246ICIgPDwgbG9naGV4KHN0cmVhbV90eXBlLmRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY29kZWNfZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYoY29kZWNfZm91bmQpIGJyZWFrOwotICB9Ci0gIGlmKGNvZGVjX2ZvdW5kKSByZXR1cm4gaW5kZXg7Ci0gIGVsc2UgcmV0dXJuIDB4RkY7Ci19Ci0KLS8vIGZpbmUgdHVuaW5nIHRoZSBRT1MgcGFyYW1zIChSVE4sIE1UTCwgUEQpIGJhc2VkIG9uCi0vLyByZW1vdGUgZGV2aWNlIHByZWZlcmVuY2VzCi1ib29sIFN0cmVhbVRyYWNrZXI6OkNob29zZUJlc3RRb3MoUW9zQ29uZmlnICpzcmNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY3M6OkFzZUNvZGVjQ29uZmlnUGFyYW1zICpyZW1fcW9zX3ByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFvc0NvbmZpZyAqZHN0X2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RyZWFtX2RpcmVjdGlvbikgewotICB1aW50OF90IGZpbmFsX3J0biA9IDB4RkY7Ci0gIHVpbnQxNl90IGZpbmFsX210bCA9IDB4RkZGRjsKLSAgdWludDMyX3QgcmVxX3BkID0gKHNyY19jb25maWctPmFzY3NfY29uZmlnc1swXS5wcmVzZW50YXRpb25fZGVsYXlbMF0gfAotICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbmZpZy0+YXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsxXSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgIHNyY19jb25maWctPmFzY3NfY29uZmlnc1swXS5wcmVzZW50YXRpb25fZGVsYXlbMl0gPDwgMTYpOwotCi0gIHVpbnQzMl90IHJlbV9wZF9taW4gPSAocmVtX3Fvc19wcmVmcy0+cGRfbWluWzBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZW1fcW9zX3ByZWZzLT5wZF9taW5bMV0gPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVtX3Fvc19wcmVmcy0+cGRfbWluWzJdIDw8IDE2KTsKLQotICB1aW50MzJfdCByZW1fcGRfbWF4ID0gKHJlbV9xb3NfcHJlZnMtPnBkX21heFswXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVtX3Fvc19wcmVmcy0+cGRfbWF4WzFdIDw8IDggfAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlbV9xb3NfcHJlZnMtPnBkX21heFsyXSA8PCAxNik7Ci0KLSAgdWludDMyX3QgcmVtX3ByZWZfcGRfbWluID0gKHJlbV9xb3NfcHJlZnMtPnByZWZfcGRfbWluWzBdIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbV9xb3NfcHJlZnMtPnByZWZfcGRfbWluWzFdIDw8IDggfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtX3Fvc19wcmVmcy0+cHJlZl9wZF9taW5bMl0gPDwgMTYpOwotCi0gIHVpbnQzMl90IHJlbV9wcmVmX3BkX21heCA9IChyZW1fcW9zX3ByZWZzLT5wcmVmX3BkX21heFswXSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1fcW9zX3ByZWZzLT5wcmVmX3BkX21heFsxXSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbV9xb3NfcHJlZnMtPnByZWZfcGRfbWF4WzJdIDw8IDE2KTsKLQotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICBzdGQ6OnZlY3RvcjxVY2FzdEF1ZGlvU3RyZWFtICo+IHN0cmVhbXMgPSBhdWRpb19zdHJtcy0+RmluZEJ5Q2lnSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29uZmlnLT5hc2NzX2NvbmZpZ3NbMF0uY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3N0YXRlKTsKLQotICAvLyBjaGVjayBpZiB0aGUgUlROIGFuZCBNVEwgaXMgd2l0aCBpbiB0aGUgbGltaXRzCi0gIGlmKHN0cmVhbV9kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgaWYoc3JjX2NvbmZpZy0+Y2lzX2NvbmZpZ3NbMF0ucnRuX21fdG9fcyA+IHJlbV9xb3NfcHJlZnMtPnByZWZfcnRuKSB7Ci0gICAgICBmaW5hbF9ydG4gPSByZW1fcW9zX3ByZWZzLT5wcmVmX3J0bjsKLSAgICB9Ci0gICAgaWYoc3JjX2NvbmZpZy0+Y2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPiByZW1fcW9zX3ByZWZzLT5tdGwpIHsKLSAgICAgIGZpbmFsX210bCA9IHJlbV9xb3NfcHJlZnMtPm10bDsKLSAgICB9Ci0gIH0gZWxzZSBpZihzdHJlYW1fZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgaWYoc3JjX2NvbmZpZy0+Y2lzX2NvbmZpZ3NbMF0ucnRuX3NfdG9fbSA+IHJlbV9xb3NfcHJlZnMtPnByZWZfcnRuKSB7Ci0gICAgICBmaW5hbF9ydG4gPSByZW1fcW9zX3ByZWZzLT5wcmVmX3J0bjsKLSAgICB9Ci0gICAgaWYoc3JjX2NvbmZpZy0+Y2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPiByZW1fcW9zX3ByZWZzLT5tdGwpIHsKLSAgICAgIGZpbmFsX210bCA9IHJlbV9xb3NfcHJlZnMtPm10bDsKLSAgICB9Ci0gIH0KLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICIgcmVxX3BkOiAiIDw8IGxvZ2hleChyZXFfcGQpCi0gICAgICAgICAgICAgICA8PCAiIHJlbV9wZF9taW46ICIgPDwgbG9naGV4KHJlbV9wZF9taW4pCi0gICAgICAgICAgICAgICA8PCAiIHJlbV9wZF9tYXg6ICIgPDwgbG9naGV4KHJlbV9wZF9tYXgpCi0gICAgICAgICAgICAgICA8PCAiIHJlbV9wcmVmX3BkX21pbjogIiA8PCBsb2doZXgocmVtX3ByZWZfcGRfbWluKQotICAgICAgICAgICAgICAgPDwgIiByZW1fcHJlZl9wZF9tYXg6ICIgPDwgbG9naGV4KHJlbV9wcmVmX3BkX21heCk7Ci0KLSAgLy8gY2hlY2sgaWYgUEQgaXMgd2l0aGluIHRoZSBsaW1pdHMKLSAgaWYocmVtX3ByZWZfcGRfbWluICYmIHJlbV9wcmVmX3BkX21heCkgewotICAgIGlmKHJlcV9wZCA8IHJlbV9wcmVmX3BkX21pbikgewotICAgICAgbWVtY3B5KCZkc3RfY29uZmlnLT5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5LAotICAgICAgICAgICAgICZyZW1fcW9zX3ByZWZzLT5wcmVmX3BkX21pbiwKLSAgICAgICAgICAgICBzaXplb2YoZHN0X2NvbmZpZy0+YXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheSkpOwotICAgIH0gZWxzZSBpZihyZXFfcGQgPiByZW1fcHJlZl9wZF9tYXgpIHsKLSAgICAgIG1lbWNweSgmZHN0X2NvbmZpZy0+YXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheSwKLSAgICAgICAgICAgICAmcmVtX3Fvc19wcmVmcy0+cHJlZl9wZF9tYXgsCi0gICAgICAgICAgICAgc2l6ZW9mKGRzdF9jb25maWctPmFzY3NfY29uZmlnc1swXS5wcmVzZW50YXRpb25fZGVsYXkpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYocmVxX3BkICE9IHJlbV9wZF9taW4pIHsKLSAgICAgIG1lbWNweSgmZHN0X2NvbmZpZy0+YXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheSwKLSAgICAgICAgICAgICAmcmVtX3Fvc19wcmVmcy0+cGRfbWluLAotICAgICAgICAgICAgIHNpemVvZihkc3RfY29uZmlnLT5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5KSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gY2hlY2sgaWYgYW55dGhpbmcgdG8gYmUgdXBkYXRlZCBmb3IgYWxsIHN0cmVhbXMKLSAgaWYoZmluYWxfcnRuID09IDB4RkYgJiYgZmluYWxfbXRsID09IDBYRkZGRikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBObyBmaW5lIHR1bmluZyBmb3IgUU9TIHBhcmFtcyI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZihmaW5hbF9ydG4gIT0gMHhGRikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBVcGRhdGVkIFJUTiB0byAiIDw8IGxvZ2hleChmaW5hbF9ydG4pOwotICB9IGVsc2UgaWYoZmluYWxfbXRsICE9IDBYRkZGRikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBVcGRhdGVkIE1UTCB0byAiIDw8IGxvZ2hleChmaW5hbF9tdGwpOwotICB9Ci0KLSAgZm9yIChhdXRvIGkgPSBzdHJlYW1zLmJlZ2luKCk7IGkgIT0gc3RyZWFtcy5lbmQoKTtpKyspIHsKLSAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSAoKmkpOwotICAgIGlmKHN0cmVhbV9kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICBpZihmaW5hbF9tdGwgIT0gMHhGRkZGKSB7Ci0gICAgICAgIHN0cmVhbS0+cW9zX2NvbmZpZy5jaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9IGZpbmFsX210bDsKLSAgICAgIH0KLSAgICAgIGlmKGZpbmFsX3J0biAhPSAweEZGKSB7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IHN0cmVhbS0+cW9zX2NvbmZpZy5jaXNfY29uZmlncy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBzdHJlYW0tPnFvc19jb25maWcuY2lzX2NvbmZpZ3MuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAoKml0KS5ydG5fbV90b19zID0gZmluYWxfcnRuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmKHN0cmVhbV9kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgIGlmKGZpbmFsX210bCAhPSAweEZGRkYpIHsKLSAgICAgICAgc3RyZWFtLT5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gZmluYWxfbXRsOwotICAgICAgfQotICAgICAgaWYoZmluYWxfcnRuICE9IDB4RkYpIHsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gc3RyZWFtLT5xb3NfY29uZmlnLmNpc19jb25maWdzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHN0cmVhbS0+cW9zX2NvbmZpZy5jaXNfY29uZmlncy5lbmQoKTsgaXQrKykgewotICAgICAgICAgICgqaXQpLnJ0bl9zX3RvX20gPSBmaW5hbF9ydG47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6SGFuZGxlUGFjc0Nvbm5lY3Rpb25FdmVudCh2b2lkICpwX2RhdGEpIHsKLSAgUGFjc0Nvbm5lY3Rpb25TdGF0ZSAqcGFjc19zdGF0ZSA9ICAoUGFjc0Nvbm5lY3Rpb25TdGF0ZSAqKSBwX2RhdGE7Ci0gIGlmKHBhY3Nfc3RhdGUtPnN0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgUEFDUyBzZXJ2ZXIgY29ubmVjdGVkIjsKLSAgfSBlbHNlIGlmKHBhY3Nfc3RhdGUtPnN0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpIYW5kbGVQYWNzQXVkaW9Db250ZXh0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFjc0F2YWlsYWJsZUNvbnRleHRzICpwYWNzX2NvbnRleHRzKSB7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVVwZGF0ZT4gKnVwZGF0ZV9zdHJlYW1zID0gR2V0TWV0YVVwZGF0ZVN0cmVhbXMoKTsKLSAgdWludDhfdCBjb250ZXh0c19zdXBwb3J0ZWQgPSAwOwotCi0gIC8vIGNoZWNrIGlmIHN1cHBvcnRlZCBhdWRpbyBjb250ZXh0cyBoYXMgcmVxdWlyZWQgY29udGV4dHMKLSAgZm9yKGF1dG8gaXQgPSB1cGRhdGVfc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gdXBkYXRlX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgaWYoaXQtPnVwZGF0ZV90eXBlID09IFN0cmVhbVVwZGF0ZVR5cGU6OlNUUkVBTUlOR19DT05URVhUKSB7Ci0gICAgICBpZihpdC0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICBpZihpdC0+dXBkYXRlX3ZhbHVlICYgcGFjc19jb250ZXh0cy0+YXZhaWxhYmxlX2NvbnRleHRzKSB7Ci0gICAgICAgICAgY29udGV4dHNfc3VwcG9ydGVkKys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZihpdC0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgIGlmKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oaXQtPnVwZGF0ZV92YWx1ZSkgPDwgMTYpICYKLSAgICAgICAgICAgICBwYWNzX2NvbnRleHRzLT5hdmFpbGFibGVfY29udGV4dHMpIHsKLSAgICAgICAgICBjb250ZXh0c19zdXBwb3J0ZWQrKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmKGNvbnRleHRzX3N1cHBvcnRlZCAhPSB1cGRhdGVfc3RyZWFtcy0+c2l6ZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIjogTm8gTWF0Y2hpbmcgYXZhaWxhYmxlIENvbnRleHRzIGZvdW5kIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpIYW5kbGVDaXNFdmVudHNJblN0cmVhbWluZyh2b2lkKiBwX2RhdGEpIHsKLSAgQ2lzU3RyZWFtU3RhdGUgKmRhdGEgPSAoQ2lzU3RyZWFtU3RhdGUgKikgcF9kYXRhOwotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICBpZihkYXRhLT5zdGF0ZSA9PSBDaXNTdGF0ZTo6UkVBRFkpIHsKLSAgICBmb3IoYXV0byBpdCA9IGRpcmVjdGlvbnMuYmVnaW4oKTsgaXQgIT0gZGlyZWN0aW9ucy5lbmQoKTsgKytpdCkgewotICAgICAgaWYoZGF0YS0+ZGlyZWN0aW9uICYgKml0KSB7Ci0gICAgICAgIC8vIGZpbmQgb3V0IHRoZSBzdHJlYW0gaGVyZQotICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5Q2lzSWRBbmREaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmNpZ19pZCwgZGF0YS0+Y2lzX2lkLCAqaXQpOwotICAgICAgICBpZihzdHJlYW0pIHsKLSAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBUcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RvcHBpbmcpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OkhhbmRsZUFzY3NDb25uZWN0aW9uRXZlbnQodm9pZCAqcF9kYXRhKSB7Ci0gIEFzY3NDb25uZWN0aW9uU3RhdGUgKmFzY3Nfc3RhdGUgPSAgKEFzY3NDb25uZWN0aW9uU3RhdGUgKikgcF9kYXRhOwotICBpZihhc2NzX3N0YXRlLT5zdGF0ZSA9PSBHYXR0U3RhdGU6OkNPTk5FQ1RFRCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiQVNDUyBzZXJ2ZXIgY29ubmVjdGVkIjsKLSAgfSBlbHNlIGlmKGFzY3Nfc3RhdGUtPnN0YXRlID09IEdhdHRTdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgLy8gbWFrZSBhbGwgc3RyZWFtcyBBU0Ugc3RhdGUgb3QgaWRsZSBzbyB0aGF0IGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgIC8vIGNhbiBoYXBwZW4KLSAgICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gKnN0cm1zX2xpc3QgPSBhdWRpb19zdHJtcy0+R2V0QWxsU3RyZWFtcygpOwotCi0gICAgZm9yIChhdXRvIGl0ID0gc3RybXNfbGlzdC0+YmVnaW4oKTsgaXQgIT0gc3RybXNfbGlzdC0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICgqaXQpLT5hc2Vfc3RhdGUgPSBhc2NzOjpBU0VfU1RBVEVfSURMRTsKLSAgICAgICgqaXQpLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICgqaXQpLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICB9Ci0gICAgSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpWYWxpZGF0ZUFzZVVwZGF0ZSh2b2lkKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFN0cm1UcmFja2VycyAqaW50X3N0cm1fdHJhY2tlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBfc3RybV9zdGF0ZSkgewotICBBc2NzU3RhdGUgKmFzY3MgPSAgKChBc2NzU3RhdGUgKikgcF9kYXRhKTsKLQotICB1aW50OF90IGFzZV9pZCA9IGFzY3MtPmFzZV9wYXJhbXMuYXNlX2lkOwotCi0gIC8vIGNoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHRyYWNrZXIgaXMgaW50ZXJlc3RlZCBpbiB0aGlzIEFTRSB1cGRhdGUKLSAgaWYoaW50X3N0cm1fdHJhY2tlcnMtPkZpbmRCeUFzZUlkKGFzZV9pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gbnVsbHB0cikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyAgPDwgIk5vdCBpbnRlbmRlZCBmb3IgdGhpcyB0cmFja2VyIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBmaW5kIG91dCB0aGUgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gYXNlIGlkCi0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0KLSAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKGFzZV9pZCk7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBTdHJlYW1zIFNpemUgPSAiIDw8IGF1ZGlvX3N0cm1zLT5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBBU0UgSWQgPSAiIDw8IGxvZ2hleChhc2VfaWQpOwotCi0gIGlmIChzdHJlYW0gPT0gbnVsbHB0ciB8fCBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgIT0gZXhwX3N0cm1fc3RhdGUpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICJObyBBdWRpbyBTdHJlYW0gZm91bmQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0cmVhbS0+YXNlX3N0YXRlID0gYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGU7Ci0gIHN0cmVhbS0+YXNlX3BhcmFtcyA9IGFzY3MtPmFzZV9wYXJhbXM7Ci0gIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OkhhbmRsZVJlbW90ZURpc2Nvbm5lY3QodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhLCBpbnQgY3VyX3N0YXRlKSB7Ci0gIFVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpEaXNjb25uZWN0KTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RyZWFtczsKLQotICBzd2l0Y2goY3VyX3N0YXRlKSB7Ci0gICAgY2FzZSBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0aW5nOiB7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubl9zdHJlYW1zID0gR2V0Q29ublN0cmVhbXMoKTsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gY29ubl9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBjb25uX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IGl0LT5zdHJlYW1fdHlwZTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sodHlwZSk7Ci0gICAgICB9Ci0gICAgICBVcGRhdGVTdHJlYW1zKCZzdHJlYW1zKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgU3RyZWFtVHJhY2tlcjo6a1N0YXRlUmVjb25maWd1cmluZzogewotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZfc3RyZWFtcyA9IEdldFJlY29uZlN0cmVhbXMoKTsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSByZWNvbmZfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaXQtPnN0cmVhbV90eXBlOwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlKTsKLSAgICAgIH0KLSAgICAgIFVwZGF0ZVN0cmVhbXMoJnN0cmVhbXMpOwotICAgIH0gYnJlYWs7Ci0gIH0KLQotICAvLyB1cGRhdGUgdGhlIHN0YXRlIHRvIGRpc2Nvbm5lY3RpbmcKLSAgVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZURpc2Nvbm5lY3RpbmcpOwotICBQcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0cmVhbUNhbmJlRGlzY29ubmVjdGVkKFN0cmVhbUNvbnRleHQgKmN1cl9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFzZV9pZCkgewotICBib29sIGNhbl9iZV9kaXNjb25uZWN0ZWQgPSBmYWxzZTsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICBTdHJlYW1BdHRhY2hlZFN0YXRlIHN0YXRlID0gKFN0cmVhbUF0dGFjaGVkU3RhdGUpCi0gICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDhfdD4gKFN0cmVhbUF0dGFjaGVkU3RhdGU6OlBIWVNJQ0FMKSB8Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4gKFN0cmVhbUF0dGFjaGVkU3RhdGU6OklETEVfVE9fUEhZKSB8Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4gKFN0cmVhbUF0dGFjaGVkU3RhdGU6OlZJUl9UT19QSFkpKTsKLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1Db250ZXh0ICo+IGF0dGFjaGVkX2NvbnRleHRzID0KLSAgICAgICAgICAgICAgICAgY29udGV4dHMtPkZpbmRCeUFzZUF0dGFjaGVkU3RhdGUoYXNlX2lkLCBzdGF0ZSk7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8IjogYXR0YWNoZWRfY29udGV4dHM6IHNpemUgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBhdHRhY2hlZF9jb250ZXh0cy5zaXplKCk7Ci0gIGlmKGN1cl9jb250ZXh0LT5hdHRhY2hlZF9zdGF0ZSA9PSBTdHJlYW1BdHRhY2hlZFN0YXRlOjpQSFlTSUNBTCB8fAotICAgICBjdXJfY29udGV4dC0+YXR0YWNoZWRfc3RhdGUgPT0gU3RyZWFtQXR0YWNoZWRTdGF0ZTo6SURMRV9UT19QSFkgfHwKLSAgICAgY3VyX2NvbnRleHQtPmF0dGFjaGVkX3N0YXRlID09IFN0cmVhbUF0dGFjaGVkU3RhdGU6OlZJUl9UT19QSFkgKSB7Ci0gICAgY2FuX2JlX2Rpc2Nvbm5lY3RlZCA9IHRydWU7Ci0gIH0KLSAgcmV0dXJuIGNhbl9iZV9kaXNjb25uZWN0ZWQ7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6SGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGJvb2wgcmVsZWFzZSkgewotCi0gIFVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpEaXNjb25uZWN0KTsKLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zOwotCi0gIGludCBjdXJfc3RhdGUgPSBTdGF0ZUlkKCk7Ci0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCI6IGN1cl9zdGF0ZTogIiA8PCBjdXJfc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IiwgcmVsZWFzZTogIiA8PCByZWxlYXNlOwotICBzd2l0Y2goY3VyX3N0YXRlKSB7Ci0gICAgY2FzZSBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0aW5nOiB7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubl9zdHJlYW1zID0gR2V0Q29ublN0cmVhbXMoKTsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gY29ubl9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBjb25uX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IGl0LT5zdHJlYW1fdHlwZTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sodHlwZSk7Ci0gICAgICB9Ci0gICAgICBVcGRhdGVTdHJlYW1zKCZzdHJlYW1zKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgU3RyZWFtVHJhY2tlcjo6a1N0YXRlUmVjb25maWd1cmluZzogewotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZfc3RyZWFtcyA9IEdldFJlY29uZlN0cmVhbXMoKTsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSByZWNvbmZfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaXQtPnN0cmVhbV90eXBlOwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayh0eXBlKTsKLSAgICAgIH0KLSAgICAgIFVwZGF0ZVN0cmVhbXMoJnN0cmVhbXMpOwotICAgIH0gYnJlYWs7Ci0gIH0KLQotICBpZiAocmVsZWFzZSkgewotICAgIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotICAgIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gICAgc3RkOjp2ZWN0b3I8QXNlUmVsZWFzZU9wPiBhc2Vfb3BzOwotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpkaXNjX3N0cmVhbXMgPSBHZXRTdHJlYW1zKCk7Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkaXNjX3N0cmVhbXMtPmJlZ2luKCk7IGl0ICE9IGRpc2Nfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKCppdCk7Ci0KLSAgICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0KLSAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKGlkLT5hc2VfaWQpOwotICAgICAgICBib29sIGNhbl9iZV9kaXNjb25uZWN0ZWQgPSBTdHJlYW1DYW5iZURpc2Nvbm5lY3RlZChjb250ZXh0LCBpZC0+YXNlX2lkKTsKLSAgICAgICAgaWYgKGNhbl9iZV9kaXNjb25uZWN0ZWQgJiYKLSAgICAgICAgICAgIHN0cmVhbSAmJiBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPT0gY3VyX3N0YXRlICYmCi0gICAgICAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSAhPSBhc2NzOjpBU0VfU1RBVEVfSURMRSAmJgotICAgICAgICAgICAgc3RyZWFtLT5hc2Vfc3RhdGUgIT0gYXNjczo6QVNFX1NUQVRFX1JFTEVBU0lORyAmJgotICAgICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgIT0gQXNjc1BlbmRpbmdDbWQ6OlJFTEVBU0VfSVNTVUVEKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICA8PCI6IEFTRSBTdGF0ZSA6ICIgPDwgbG9naGV4KHN0cmVhbS0+YXNlX3N0YXRlKTsKLSAgICAgICAgICBBc2VSZWxlYXNlT3AgcmVsZWFzZV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IHN0cmVhbS0+YXNlX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGFzZV9vcHMucHVzaF9iYWNrKHJlbGVhc2Vfb3ApOwotICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6OlJFTEVBU0VfSVNTVUVEOwotICAgICAgICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmFsbCBzdGF0ZSB0byBEaXNjb25uZWN0aW5nCi0gICAgICAgICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlRGlzY29ubmVjdGluZzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIHNlbmQgY29uc29saWRhdGVkIHJlbGVhc2UgY29tbWFuZCB0byBBU0NTIGNsaWVudAotICAgIGlmKGFzZV9vcHMuc2l6ZSgpKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IEdvaW5nIEZvciBBU0NTIFJlbGVhc2Ugb3AiOwotICAgICAgYXNjc19jbGllbnQtPlJlbGVhc2UoQVNDU19DTElFTlRfSUQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBhc2Vfb3BzKTsKLSAgICB9Ci0gIH0KLSAgLy8gdXBkYXRlIHRoZSBzdGF0ZSB0byBkaXNjb25uZWN0aW5nCi0gIFRyYW5zaXRpb25UbyhTdHJlYW1UcmFja2VyOjprU3RhdGVEaXNjb25uZWN0aW5nKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6SGFuZGxlUmVtb3RlU3RvcCh1aW50MzJfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEsIGludCBjdXJfc3RhdGUpIHsKLSAgQXNjc1N0YXRlICphc2NzID0gICgoQXNjc1N0YXRlICopIHBfZGF0YSk7Ci0gIHVpbnQ4X3QgYXNlX2lkID0gYXNjcy0+YXNlX3BhcmFtcy5hc2VfaWQ7Ci0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChhc2VfaWQpOwotCi0gIGlmKCFzdHJlYW0pIHJldHVybiBmYWxzZTsKLQotICBpZihzdHJlYW0tPmRpcmVjdGlvbiAmIGNpczo6RElSX1RPX0FJUikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICI6IEludmFsaWQgU3RhdGUgdHJhbnNpdGlvbiB0byBEaXNhYmxpbmciCi0gICAgICAgICAgICAgICA8PCAiOiBBU0UgSWQgPSAiIDw8IGxvZ2hleChhc2VfaWQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpTdG9wKTsKLQotICBpZihjdXJfc3RhdGUgIT0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RhcnRpbmcgfHwKLSAgICAgY3VyX3N0YXRlICE9IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0cmVhbWluZykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyB1cGRhdGUgdGhlIHN0YXRlIHRvIHN0b3BwaW5nCi0gIFRyYW5zaXRpb25UbyhTdHJlYW1UcmFja2VyOjprU3RhdGVTdG9wcGluZyk7Ci0gIFByb2Nlc3NFdmVudChldmVudCwgcF9kYXRhKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6SGFuZGxlQWJydXB0U3RvcCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSB7Ci0gIEFzY3NTdGF0ZSAqYXNjcyA9ICAoKEFzY3NTdGF0ZSAqKSBwX2RhdGEpOwotICB1aW50OF90IGFzZV9pZCA9IGFzY3MtPmFzZV9wYXJhbXMuYXNlX2lkOwotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoYXNlX2lkKTsKLQotICBpZighc3RyZWFtKSByZXR1cm4gZmFsc2U7Ci0gIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0KLSAgVXBkYXRlQ29udHJvbFR5cGUoU3RyZWFtQ29udHJvbFR5cGU6OlN0b3ApOwotCi0gIC8vIHVwZGF0ZSB0aGUgc3RhdGUgdG8gc3RvcHBpbmcKLSAgVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0b3BwaW5nKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6SGFuZGxlUmVtb3RlUmVjb25maWcodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhLCBpbnQgY3VyX3N0YXRlKSB7Ci0gIFVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZyk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXM7Ci0KLSAgaWYoY3VyX3N0YXRlICE9IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyB1cGRhdGUgdGhlIHN0YXRlIHRvIFJlY29uZmlndXJpbmcKLSAgVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVJlY29uZmlndXJpbmcpOwotICBQcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OkhhbmRsZUFzZU9wRmFpbGVkRXZlbnQodm9pZCAqcF9kYXRhKSB7Ci0gIEFzY3NPcEZhaWxlZCAqYXNjc19vcCA9ICAoKEFzY3NPcEZhaWxlZCAqKSBwX2RhdGEpOwotICBzdGQ6OnZlY3Rvcjxhc2NzOjpBc2VPcFN0YXR1cz4gKmFzZV9saXN0ID0gJmFzY3Nfb3AtPmFzZV9saXN0OwotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotCi0gIGlmKGFzY3Nfb3AtPmFzZV9vcF9pZCA9PSBhc2NzOjpBc2VPcElkOjpDT0RFQ19DT05GSUcpIHsKLSAgICAvLyB0cmVhdCBpdCBsaWtlIGludGVybmFsIGZhaWx1cmUKLSAgICBmb3IgKGF1dG8gaSA9IGFzZV9saXN0LT5iZWdpbigpOyBpICE9IGFzZV9saXN0LT5lbmQoKTtpKyspIHsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoaSktPmFzZV9pZCk7Ci0gICAgICBpZihzdHJlYW0pIHsKLSAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBIYW5kbGVJbnRlcm5hbERpc2Nvbm5lY3QodHJ1ZSk7Ci0gIH0KLX0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpIYW5kbGVBc2VTdGF0ZUV2ZW50KHZvaWQgKnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50U3RybVRyYWNrZXJzICppbnRfc3RybV90cmFja2VycykgewotICAvLyBjaGVjayB0aGUgc3RhdGUgYW5kIGlmIHRoZSBzdGF0ZSBpcyBjb2RlYyBjb25maWd1cmVkIGZvciBhbGwgQVNFcwotICAvLyB0aGVuIHByb2NlZWQgd2l0aCBncm91cCBjcmVhdGlvbgotICBBc2NzU3RhdGUgKmFzY3MgPSAgcmVpbnRlcnByZXRfY2FzdDxBc2NzU3RhdGUgKj4gKHBfZGF0YSk7Ci0KLSAgdWludDhfdCBhc2VfaWQgPSBhc2NzLT5hc2VfcGFyYW1zLmFzZV9pZDsKLQotICAvLyBjaGVjayBpZiBjdXJyZW50IHN0cmVhbSB0cmFja2VyIGlzIGludGVyZXN0ZWQgaW4gdGhpcyBBU0UgdXBkYXRlCi0gIGlmKGludF9zdHJtX3RyYWNrZXJzLT5GaW5kQnlBc2VJZChhc2VfaWQpID09IG51bGxwdHIpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogTm90IGludGVuZGVkIGZvciB0aGlzIHRyYWNrZXIiOwotICAgIHJldHVybjsKLSAgfQotCi0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0KLSAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKGFzZV9pZCk7Ci0KLSAgaWYoc3RyZWFtID09IG51bGxwdHIpIHsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSB7Ci0gICAgc3RyZWFtLT5hc2Vfc3RhdGUgPSBhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZTsKLSAgICBzdHJlYW0tPmFzZV9wYXJhbXMgPSBhc2NzLT5hc2VfcGFyYW1zOwotICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gIH0KLQotICBpZihhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCkgewotICAgIHN0cmVhbS0+cHJlZl9xb3NfcGFyYW1zID0gYXNjcy0+YXNlX3BhcmFtcy5jb2RlY19jb25maWdfcGFyYW1zOwotICAgIC8vIGZpbmQgb3V0IHRoZSBzdHJlYW0gZm9yIHRoZSBnaXZlbiBhc2UgaWQKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICI6IFRvdGFsIE51bSBTdHJlYW1zID0gIiA8PCBhdWRpb19zdHJtcy0+c2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBBU0UgSWQgPSAiIDw8IGxvZ2hleChhc2VfaWQpOwotCi0gICAgLy8gZGVjaWRlIG9uIGJlc3QgUU9TIHBhcmFtcyBieSBjb21wYXJpbmcgdGhlIHVwcGVyIGxheWVyIHByZWZzCi0gICAgLy8gYW5kIHJlbW90ZSBkZXYncyBwcmVmZXJlbmNlcwotICAgIGludCBzdGF0ZSA9IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUlkbGU7Ci0KLSAgICBpZihjb250cm9sX3R5cGUgPT0gU3RyZWFtQ29udHJvbFR5cGU6OkNvbm5lY3QpIHsKLSAgICAgIHN0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGluZzsKLSAgICB9IGVsc2UgaWYoY29udHJvbF90eXBlID09IFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZykgewotICAgICAgc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVSZWNvbmZpZ3VyaW5nOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBhbGwgdHJhY2tlcnMgY29kZWMgaXMgY29uZmlndXJlZCBvciBub3QKLSAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiAqYWxsX3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzLT5HZXRUcmFja2VyTGlzdCgpOwotICAgIHVpbnQ4X3QgbnVtX2NvZGVjX2NvbmZpZ3VyZWQgPSAwOwotICAgIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICJzdHJlYW0gaXMgbnVsbCI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYoc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPT0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkUgJiYKLSAgICAgICAgIChzdHJlYW0tPmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCB8fAotICAgICAgICAgKGNvbnRyb2xfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6UmVjb25maWcgJiYKLSAgICAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpKSkgewotICAgICAgICBudW1fY29kZWNfY29uZmlndXJlZCsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmKGludF9zdHJtX3RyYWNrZXJzLT5zaXplKCkgIT0gbnVtX2NvZGVjX2NvbmZpZ3VyZWQpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBDb2RlYyBOb3QgQ29uZmlndXJlZCBGb3IgQWxsIFN0cmVhbXMiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBhbGwgc3RyZWFtcyB0b2dldGhlciBzbyB0aGF0IGZpbmFsIGdyb3VwIHBhcmFtcwotICAgIC8vIHdpbGwgYmUgZGVjaWRlZAotICAgIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgIGlmIChzdHJlYW0pIHsKLSAgICAgICAgQ2hvb3NlQmVzdFFvcygmc3RyZWFtLT5yZXFfcW9zX2NvbmZpZywgJnN0cmVhbS0+cHJlZl9xb3NfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLT5xb3NfY29uZmlnLCBzdGF0ZSwgc3RyZWFtLT5kaXJlY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgICBDaGVja0FuZFNlbmRRb3NDb25maWcoaW50X3N0cm1fdHJhY2tlcnMpOwotCi0gIH0gZWxzZSBpZihhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpIHsKLSAgICAvLyBUT0RPIHVwZGF0ZSB0aGUgc3RhdGUgYXMgY29ubmVjdGVkIHVzaW5nIGNhbGxiYWNrcwotICAgIC8vIG1ha2UgdGhlIHN0YXRlIHRyYW5zaXRpb24gdG8gY29ubmVjdGVkCi0KLSAgICAvLyBjaGVjayBmb3IgYWxsIHRyYWNrZXJzIFFPUyBpcyBjb25maWd1cmVkIG9yIG5vdAotICAgIC8vIGlmIHNvIHVwZGF0ZSBpdCBhcyBzdHJlYW1zIGFyZSBjb25uZWN0ZWQKLSAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiAqYWxsX3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzLT5HZXRUcmFja2VyTGlzdCgpOwotICAgIHVpbnQ4X3QgbnVtX3Fvc19jb25maWd1cmVkID0gMDsKLSAgICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgICBpZihzdHJlYW0gJiYgc3RyZWFtLT5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1FPU19DT05GSUdVUkVEICYmCi0gICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9PSBBc2NzUGVuZGluZ0NtZDo6Tk9ORSkgewotICAgICAgICBudW1fcW9zX2NvbmZpZ3VyZWQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihpbnRfc3RybV90cmFja2Vycy0+c2l6ZSgpICE9IG51bV9xb3NfY29uZmlndXJlZCkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIFFPUyBOb3QgQ29uZmlndXJlZCBGb3IgQWxsIFN0cmVhbXMiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICJzdHJlYW0gaXMgbnVsbCI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaSktPnN0cm1fdHlwZSk7Ci0gICAgICBpZihjb250ZXh0LT5hdHRhY2hlZF9zdGF0ZSA9PSBTdHJlYW1BdHRhY2hlZFN0YXRlOjpJRExFX1RPX1BIWSB8fAotICAgICAgICAgY29udGV4dC0+YXR0YWNoZWRfc3RhdGUgPT0gU3RyZWFtQXR0YWNoZWRTdGF0ZTo6VklSX1RPX1BIWSkgewotICAgICAgICBjb250ZXh0LT5hdHRhY2hlZF9zdGF0ZSA9IFN0cmVhbUF0dGFjaGVkU3RhdGU6OlBIWVNJQ0FMOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICIgQXR0YWNoZWQgc3RhdGUgbWFkZSBwaHlzaWNhbCI7Ci0gICAgICB9Ci0gICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBrU3RhdGVDb25uZWN0ZWQ7Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHRoZSBzdGF0ZSB0byBjb25uZWN0ZWQKLSAgICBUcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGVkKTsKLQotICB9IGVsc2UgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1JFTEVBU0lORykgewotICAgIEhhbmRsZVJlbW90ZURpc2Nvbm5lY3QoQVNDU19BU0VfU1RBVEVfRVZULCBwX2RhdGEsIFN0YXRlSWQoKSk7Ci0gIH0KLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpIYW5kbGVTdHJlYW1VcGRhdGUgKGludCBjdXJfc3RhdGUpIHsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotCi0gIHN0ZDo6dmVjdG9yPEFzZVVwZGF0ZU1ldGFkYXRhT3A+IGFzZV9tZXRhX29wczsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVXBkYXRlPiAqdXBkYXRlX3N0cmVhbXMgPSBHZXRNZXRhVXBkYXRlU3RyZWFtcygpOwotCi0gIGZvciAoYXV0byBpdCA9IHVwZGF0ZV9zdHJlYW1zLT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSB1cGRhdGVfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotCi0gICAgZm9yIChhdXRvIGlkID0gY29udGV4dC0+c3RyZWFtX2lkcy5iZWdpbigpOwotICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtZXRhX2RhdGE7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICBpZihzdHJlYW0gJiYgc3RyZWFtLT5hc2Vfc3RhdGUgIT0gYXNjczo6QVNFX1NUQVRFX0VOQUJMSU5HICYmCi0gICAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSAhPSBhc2NzOjpBU0VfU1RBVEVfU1RSRUFNSU5HKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYoaXQtPnVwZGF0ZV90eXBlID09IFN0cmVhbVVwZGF0ZVR5cGU6OlNUUkVBTUlOR19DT05URVhUKSB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuID0gTFRWX0xFTl9TVFJNX0FVRElPX0NPTlRFWFRTOwotICAgICAgICB1aW50OF90IHR5cGUgPSBMVFZfVFlQRV9TVFJNX0FVRElPX0NPTlRFWFRTOwotICAgICAgICB1aW50MTZfdCB2YWx1ZSA9IGl0LT51cGRhdGVfdmFsdWU7Ci0gICAgICAgIGlmKHN0cmVhbSkgc3RyZWFtLT5hdWRpb19jb250ZXh0ID0gdmFsdWU7Ci0gICAgICAgIG1ldGFfZGF0YS5pbnNlcnQobWV0YV9kYXRhLmVuZCgpLCAmbGVuLCAmbGVuICsgMSk7Ci0gICAgICAgIG1ldGFfZGF0YS5pbnNlcnQobWV0YV9kYXRhLmVuZCgpLCAmdHlwZSwgJnR5cGUgKyAxKTsKLSAgICAgICAgbWV0YV9kYXRhLmluc2VydChtZXRhX2RhdGEuZW5kKCksICgodWludDhfdCAqKSZ2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QgKikmdmFsdWUpICsgc2l6ZW9mKHVpbnQxNl90KSk7Ci0gICAgICB9Ci0KLSAgICAgIEFzZVVwZGF0ZU1ldGFkYXRhT3AgbWV0YV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNlX2lkID0gaWQtPmFzZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0YV9kYXRhX2xlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDx1aW50OF90PiAobWV0YV9kYXRhLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGFfZGF0YSA9IG1ldGFfZGF0YSAvLyBtZWRpYSBvciB2b2ljZQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgYXNlX21ldGFfb3BzLnB1c2hfYmFjayhtZXRhX29wKTsKLSAgICB9Ci0gIH0KLQotICAvLyBzZW5kIGNvbnNvbGlkYXRlZCB1cGRhdGUgbWV0YSBjb21tYW5kIHRvIEFTQ1MgY2xpZW50Ci0gIGlmKGFzZV9tZXRhX29wcy5zaXplKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IEdvaW5nIEZvciBBU0NTIFVwZGF0ZSBNZXRhRGF0YSBvcCI7Ci0gICAgYXNjc19jbGllbnQtPlVwZGF0ZVN0cmVhbShBU0NTX0NMSUVOVF9JRCwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2VfbWV0YV9vcHMpOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmKGN1cl9zdGF0ZSA9PSBTdHJlYW1UcmFja2VyOjprU3RhdGVVcGRhdGluZykgewotICAgIGZvciAoYXV0byBpdCA9IHVwZGF0ZV9zdHJlYW1zLT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHVwZGF0ZV9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoaXQtPnN0cmVhbV90eXBlKTsKLSAgICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWQgIT0gY29udGV4dC0+c3RyZWFtX2lkcy5lbmQoKTsgaWQrKykgewotICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICAgIC8vIGNoYW5nZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBkaXNhYmxlIGlzc3VlZAotICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6OlVQREFURV9NRVRBREFUQV9JU1NVRUQ7Ci0gICAgICAgICAgLy8gY2hhbmdlIHRoZSBvdmVyYWxsIHN0YXRlIHRvIFVwZGF0aW5nCi0gICAgICAgICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlVXBkYXRpbmc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6SGFuZGxlU3RvcCh2b2lkKiBwX2RhdGEsIGludCBjdXJfc3RhdGUpIHsKLSAgaWYocF9kYXRhICE9IG51bGxwdHIpIHsKLSAgICBCYXBTdG9wICpldnRfZGF0YSA9IChCYXBTdG9wICopIHBfZGF0YTsKLSAgICBVcGRhdGVTdHJlYW1zKCZldnRfZGF0YS0+c3RyZWFtcyk7Ci0gIH0KLSAgVXBkYXRlQ29udHJvbFR5cGUoU3RyZWFtQ29udHJvbFR5cGU6OlN0b3ApOwotCi0gIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldEFzY3NDbGllbnQoKTsKLSAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLQotICBzdGQ6OnZlY3RvcjxBc2VEaXNhYmxlT3A+IGFzZV9vcHM7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdG9wX3N0cmVhbXMgPSBHZXRTdHJlYW1zKCk7Ci0KLSAgZm9yIChhdXRvIGl0ID0gc3RvcF9zdHJlYW1zLT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBzdG9wX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLQotICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICBBc2VEaXNhYmxlT3AgZGlzYWJsZV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IGlkLT5hc2VfaWQKLSAgICAgIH07Ci0gICAgICBhc2Vfb3BzLnB1c2hfYmFjayhkaXNhYmxlX29wKTsKLSAgICB9Ci0gIH0KLQotICAvLyBzZW5kIGNvbnNvbGlkYXRlZCBkaXNhYmxlIGNvbW1hbmQgdG8gQVNDUyBjbGllbnQKLSAgaWYoYXNlX29wcy5zaXplKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IEdvaW5nIEZvciBBU0NTIERpc2FibGUgb3AiOwotICAgIGFzY3NfY2xpZW50LT5EaXNhYmxlKEFTQ1NfQ0xJRU5UX0lELCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgYXNlX29wcyk7Ci0gIH0KLQotICBmb3IgKGF1dG8gaXQgPSBzdG9wX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHN0b3Bfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgqaXQpOwotICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgIGlkICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCk7IGlkKyspIHsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChpZC0+YXNlX2lkKTsKLSAgICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0ciAmJiBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPT0gY3VyX3N0YXRlKSB7Ci0gICAgICAgIC8vIGNoYW5nZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBkaXNhYmxlIGlzc3VlZAotICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpESVNBQkxFX0lTU1VFRDsKLSAgICAgICAgLy8gY2hhbmdlIHRoZSBvdmVyYWxsIHN0YXRlIHRvIHN0b3BwaW5nCi0gICAgICAgIHN0cmVhbS0+b3ZlcmFsbF9zdGF0ZSA9IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0b3BwaW5nOwotICAgICAgfQotICAgIH0KLSAgfQotICBUcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RvcHBpbmcpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpIYW5kbGVEaXNjb25uZWN0KHZvaWQqIHBfZGF0YSwgaW50IGN1cl9zdGF0ZSkgewotICAvLyBleHBlY3QgdGhlIGRpc2Nvbm5lY3Rpb24gZm9yIHNhbWUgc2V0IG9mIHN0cmVhbXMgY29ubmVjdGlvbgotICAvLyBoYXMgaW5pdGlhdGVkIGV4OiBpZiBjb25uZWN0IGlzIGlzc3VlZCBmb3IgbWVkaWEgKHR4KSwgdm9pY2UodHggJiByeCkKLSAgLy8gdGhlbiBkaXNjb25uZWN0IGlzIGV4cGVjdGVkIGZvciBtZWRpYSAodHgpLCB2b2ljZSh0eCAmIHJ4KS4KLSAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLQotICBCYXBEaXNjb25uZWN0ICpldnRfZGF0YSA9IChCYXBEaXNjb25uZWN0ICopIHBfZGF0YTsKLQotICBVcGRhdGVDb250cm9sVHlwZShTdHJlYW1Db250cm9sVHlwZTo6RGlzY29ubmVjdCk7Ci0KLSAgVXBkYXRlU3RyZWFtcygmZXZ0X2RhdGEtPnN0cmVhbXMpOwotCi0gIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldEFzY3NDbGllbnQoKTsKLQotICBzdGQ6OnZlY3RvcjxBc2VSZWxlYXNlT3A+IGFzZV9vcHM7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpkaXNjX3N0cmVhbXMgPSBHZXRTdHJlYW1zKCk7Ci0KLSAgZm9yIChhdXRvIGl0ID0gZGlzY19zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBkaXNjX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLQotICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgIGlkICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCk7IGlkKyspIHsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChpZC0+YXNlX2lkKTsKLSAgICAgIGJvb2wgY2FuX2JlX2Rpc2Nvbm5lY3RlZCA9IFN0cmVhbUNhbmJlRGlzY29ubmVjdGVkKGNvbnRleHQsIGlkLT5hc2VfaWQpOwotICAgICAgaWYoY2FuX2JlX2Rpc2Nvbm5lY3RlZCAmJgotICAgICAgICAgc3RyZWFtICYmIHN0cmVhbS0+b3ZlcmFsbF9zdGF0ZSAhPSBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlICYmCi0gICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgIT0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlRGlzY29ubmVjdGluZyAmJgotICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgIT0gQXNjc1BlbmRpbmdDbWQ6OlJFTEVBU0VfSVNTVUVEKSB7Ci0gICAgICAgIEFzZVJlbGVhc2VPcCByZWxlYXNlX29wID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IGlkLT5hc2VfaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBhc2Vfb3BzLnB1c2hfYmFjayhyZWxlYXNlX29wKTsKLSAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6UkVMRUFTRV9JU1NVRUQ7Ci0gICAgICAgIC8vIGNoYW5nZSB0aGUgb3ZlcmFsbCBzdGF0ZSB0byBzdGFydGluZwotICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVEaXNjb25uZWN0aW5nOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIHNlbmQgY29uc29saWRhdGVkIHJlbGVhc2UgY29tbWFuZCB0byBBU0NTIGNsaWVudAotICBpZihhc2Vfb3BzLnNpemUoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIEFTQ1MgUmVsZWFzZSBvcCI7Ci0gICAgYXNjc19jbGllbnQtPlJlbGVhc2UoQVNDU19DTElFTlRfSUQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBhc2Vfb3BzKTsKLSAgfQotCi0gIFRyYW5zaXRpb25UbyhTdHJlYW1UcmFja2VyOjprU3RhdGVEaXNjb25uZWN0aW5nKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RyZWFtVHJhY2tlcjo6Q2hlY2tBbmRTZW5kUW9zQ29uZmlnKEludFN0cm1UcmFja2VycyAqaW50X3N0cm1fdHJhY2tlcnMpIHsKLQotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotICAvLyBjaGVjayBmb3IgYWxsIHRyYWNrZXJzIENJRyBpcyBjcmVhdGVkIG9yIG5vdAotICAvLyBpZiBzbyBwcm9jZWVkIHdpdGggUU9TIGNvbmZpZyBvcGVyYWl0b24KLSAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gKmFsbF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnMtPkdldFRyYWNrZXJMaXN0KCk7Ci0KLSAgc3RkOjp2ZWN0b3I8QXNlUW9zQ29uZmlnT3A+IGFzZV9vcHM7Ci0gIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgUW9zQ29uZmlnICpxb3NfY29uZmlnID0gJnN0cmVhbS0+cW9zX2NvbmZpZzsKLSAgICBpZighc3RyZWFtIHx8IHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kICE9IEFzY3NQZW5kaW5nQ21kOjpOT05FKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYoc3RyZWFtLT5kaXJlY3Rpb24gJiBjaXM6OkRJUl9UT19BSVIpIHsKLQotICAgICAgQXNlUW9zQ29uZmlnT3AgcW9zX2NvbmZpZ19vcCA9IHsKLSAgICAgICAuYXNlX2lkID0gKCppKS0+YXNlX2lkLAotICAgICAgIC5jaWdfaWQgPSBzdHJlYW0tPmNpZ19pZCwKLSAgICAgICAuY2lzX2lkID0gc3RyZWFtLT5jaXNfaWQsCi0gICAgICAgLnNkdV9pbnRlcnZhbCA9IHsgcW9zX2NvbmZpZy0+Y2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfbV90b19zWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgIHFvc19jb25maWctPmNpZ19jb25maWcuc2R1X2ludGVydmFsX21fdG9fc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBxb3NfY29uZmlnLT5jaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9tX3RvX3NbMl0gfSwKLSAgICAgICAuZnJhbWluZyA9IHFvc19jb25maWctPmNpZ19jb25maWcuZnJhbWluZywKLSAgICAgICAucGh5ID0gTEVfMk1fUEhZLAotICAgICAgIC5tYXhfc2R1X3NpemUgPSBxb3NfY29uZmlnLT5jaXNfY29uZmlnc1soKmkpLT5jaXNfaWRdLm1heF9zZHVfbV90b19zLAotICAgICAgIC5yZXRyYW5zX251bWJlciA9IHFvc19jb25maWctPmNpc19jb25maWdzWygqaSktPmNpc19pZF0ucnRuX21fdG9fcywKLSAgICAgICAudHJhbnNfbGF0ZW5jeSA9IHFvc19jb25maWctPmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgIC5wcmVzZW50X2RlbGF5ID0ge3Fvc19jb25maWctPmFzY3NfY29uZmlnc1swXS5wcmVzZW50YXRpb25fZGVsYXlbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcW9zX2NvbmZpZy0+YXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBxb3NfY29uZmlnLT5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzJdfQotICAgICAgfTsKLSAgICAgIGFzZV9vcHMucHVzaF9iYWNrKHFvc19jb25maWdfb3ApOwotCi0gICAgfSBlbHNlIGlmKHN0cmVhbS0+ZGlyZWN0aW9uICYgY2lzOjpESVJfRlJPTV9BSVIpIHsKLSAgICAgIEFzZVFvc0NvbmZpZ09wIHFvc19jb25maWdfb3AgPSB7Ci0gICAgICAgLmFzZV9pZCA9ICgqaSktPmFzZV9pZCwKLSAgICAgICAuY2lnX2lkID0gc3RyZWFtLT5jaWdfaWQsCi0gICAgICAgLmNpc19pZCA9IHN0cmVhbS0+Y2lzX2lkLAotICAgICAgIC5zZHVfaW50ZXJ2YWwgPSB7IHFvc19jb25maWctPmNpZ19jb25maWcuc2R1X2ludGVydmFsX3NfdG9fbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBxb3NfY29uZmlnLT5jaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9zX3RvX21bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcW9zX2NvbmZpZy0+Y2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfc190b19tWzJdIH0sCi0gICAgICAgLmZyYW1pbmcgPSBxb3NfY29uZmlnLT5jaWdfY29uZmlnLmZyYW1pbmcsCi0gICAgICAgLnBoeSA9IExFXzJNX1BIWSwKLSAgICAgICAubWF4X3NkdV9zaXplID0gcW9zX2NvbmZpZy0+Y2lzX2NvbmZpZ3NbKCppKS0+Y2lzX2lkXS5tYXhfc2R1X3NfdG9fbSwKLSAgICAgICAucmV0cmFuc19udW1iZXIgPSBxb3NfY29uZmlnLT5jaXNfY29uZmlnc1soKmkpLT5jaXNfaWRdLnJ0bl9zX3RvX20sCi0gICAgICAgLnRyYW5zX2xhdGVuY3kgPSBxb3NfY29uZmlnLT5jaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICAgICAucHJlc2VudF9kZWxheSA9IHtxb3NfY29uZmlnLT5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgIHFvc19jb25maWctPmFzY3NfY29uZmlnc1swXS5wcmVzZW50YXRpb25fZGVsYXlbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcW9zX2NvbmZpZy0+YXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsyXX0KLSAgICAgIH07Ci0gICAgICBhc2Vfb3BzLnB1c2hfYmFjayhxb3NfY29uZmlnX29wKTsKLSAgICB9Ci0gIH0KLQotICBpZihhc2Vfb3BzLnNpemUoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIEFTQ1MgUW9zQ29uZmlnIG9wIjsKLSAgICBhc2NzX2NsaWVudC0+UW9zQ29uZmlnKEFTQ1NfQ0xJRU5UX0lELCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgYXNlX29wcyk7Ci0KLSAgICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgICBpZihzdHJlYW0gJiYgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPT0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkUpCi0gICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6OlFPU19DT05GSUdfSVNTVUVEOwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgU3RyZWFtVHJhY2tlcjo6Q2hlY2tBbmRTZW5kRW5hYmxlKEludFN0cm1UcmFja2VycyAqaW50X3N0cm1fdHJhY2tlcnMpIHsKLQotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RhcnRfc3RyZWFtcyA9IEdldFN0cmVhbXMoKTsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICBzdGQ6OnZlY3RvcjxBc2VFbmFibGVPcD4gYXNlX29wczsKLSAgLy8gY2hlY2sgZm9yIGFsbCB0cmFja2VycyBDSUcgaXMgY3JlYXRlZCBvciBub3QKLSAgLy8gaWYgc28gcHJvY2VlZCB3aXRoIFFPUyBjb25maWcgb3BlcmFpdG9uCi0gIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+ICphbGxfdHJhY2tlcnMgPQotICAgICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzLT5HZXRUcmFja2VyTGlzdCgpOwotCi0gIHVpbnQ4X3QgbnVtX2NpZ19jcmVhdGVkID0gMDsKLQotICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgIGlmKHN0cmVhbSAmJiBzdHJlYW0tPmNpZ19zdGF0ZSA9PSBDaWdTdGF0ZTo6Q1JFQVRFRCkgewotICAgICAgbnVtX2NpZ19jcmVhdGVkKys7Ci0gICAgfQotICB9Ci0KLSAgaWYoaW50X3N0cm1fdHJhY2tlcnMtPnNpemUoKSAhPSBudW1fY2lnX2NyZWF0ZWQpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICIgQWxsIENJR3MgYXJlIG5vdCBjcmVhdGVkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IoYXV0byBpdCA9IHN0YXJ0X3N0cmVhbXMtPmJlZ2luKCk7IGl0ICE9IHN0YXJ0X3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLSAgICBmb3IgKGF1dG8gaWQgPSBjb250ZXh0LT5zdHJlYW1faWRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGlkICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCk7IGlkKyspIHsKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1ldGFfZGF0YTsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChpZC0+YXNlX2lkKTsKLSAgICAgIHVpbnQ4X3QgbGVuID0gTFRWX0xFTl9TVFJNX0FVRElPX0NPTlRFWFRTOwotICAgICAgdWludDhfdCB0eXBlID0gTFRWX1RZUEVfU1RSTV9BVURJT19DT05URVhUUzsKLSAgICAgIHVpbnQxNl90IHZhbHVlID0gKCppdCkuYXVkaW9fY29udGV4dDsKLSAgICAgIGlmKHN0cmVhbSkgc3RyZWFtLT5hdWRpb19jb250ZXh0ID0gdmFsdWU7Ci0gICAgICBtZXRhX2RhdGEuaW5zZXJ0KG1ldGFfZGF0YS5lbmQoKSwgJmxlbiwgJmxlbiArIDEpOwotICAgICAgbWV0YV9kYXRhLmluc2VydChtZXRhX2RhdGEuZW5kKCksICZ0eXBlLCAmdHlwZSArIDEpOwotICAgICAgbWV0YV9kYXRhLmluc2VydChtZXRhX2RhdGEuZW5kKCksICgodWludDhfdCAqKSZ2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QgKikmdmFsdWUpICsgc2l6ZW9mKHVpbnQxNl90KSk7Ci0KLSAgICAgIEFzZUVuYWJsZU9wIGVuYWJsZV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNlX2lkID0gaWQtPmFzZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0YV9kYXRhX2xlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDx1aW50OF90PiAobWV0YV9kYXRhLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGFfZGF0YSA9IG1ldGFfZGF0YSAvLyBtZWRpYSBvciB2b2ljZQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgYXNlX29wcy5wdXNoX2JhY2soZW5hYmxlX29wKTsKLSAgICB9Ci0gIH0KLQotICAvLyBzZW5kIGNvbnNvbGlkYXRlZCBlbmFibGUgY29tbWFuZCB0byBBU0NTIGNsaWVudAotICBpZihhc2Vfb3BzLnNpemUoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIEFTQ1MgRW5hYmxlIG9wIjsKLSAgICBhc2NzX2NsaWVudC0+RW5hYmxlKEFTQ1NfQ0xJRU5UX0lELCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgYXNlX29wcyk7Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBzdGFydF9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBzdGFydF9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLSAgICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChpZC0+YXNlX2lkKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyICYmIHN0cmVhbS0+b3ZlcmFsbF9zdGF0ZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCkgewotICAgICAgICAgIC8vIGNoYW5nZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBlbmFibGUgaXNzdWVkCi0gICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6RU5BQkxFX0lTU1VFRDsKLSAgICAgICAgICAvLyBjaGFuZ2UgdGhlIG92ZXJhbGwgc3RhdGUgdG8gc3RhcnRpbmcKLSAgICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVTdGFydGluZzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OkhhbmRsZUNpZ1N0YXRlRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQgKnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRTdHJtVHJhY2tlcnMgKmludF9zdHJtX3RyYWNrZXJzKSB7Ci0gIC8vIGNoZWNrIGlmIHRoZSBhc3NvY2lhdGVkIENJRyBzdGF0ZSBpcyBjcmVhdGVkCi0gIC8vIGlmIHNvIGdvIGZvciBFbmFibGUgT3BlcmF0aW9uCi0gIENpc0dyb3VwU3RhdGUgKmRhdGEgPSAoKENpc0dyb3VwU3RhdGUgKikgcF9kYXRhKTsKLQotICAvLyBjaGVjayBpZiBjdXJyZW50IHN0cmVhbSB0cmFja2VyIGlzIGludGVyZXN0ZWQgaW4gdGhpcyBDSUcgdXBkYXRlCi0gIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IGludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRfc3RybV90cmFja2Vycy0+RmluZEJ5Q2lnSWQoZGF0YS0+Y2lnX2lkKTsKLSAgaWYoaW50X3RyYWNrZXJzLmVtcHR5KCkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICIgTm90IGludGVuZGVkIGZvciB0aGlzIHRyYWNrZXIiOwotICAgIHJldHVybjsKLSAgfQotCi0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gIGlmKGRhdGEtPnN0YXRlID09IENpZ1N0YXRlOjpDUkVBVEVEKSB7Ci0gICAgZm9yIChhdXRvIGkgPSBpbnRfdHJhY2tlcnMuYmVnaW4oKTsgaSAhPSBpbnRfdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgIGlmKHN0cmVhbSkgewotICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgIHN0cmVhbS0+Y2lnX3N0YXRlID0gZGF0YS0+c3RhdGU7Ci0gICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gQ2lzU3RhdGU6OlJFQURZOwotICAgICAgfQotICAgIH0KLSAgICBDaGVja0FuZFNlbmRFbmFibGUoaW50X3N0cm1fdHJhY2tlcnMpOwotICB9IGVsc2UgaWYoZGF0YS0+c3RhdGUgPT0gQ2lnU3RhdGU6OklETEUpIHsKLSAgICAvLyBDSUcgc3RhdGUgaXMgaWRsZSBtZWFucyB0aGVyZSBpcyBzb21lIGZhaWx1cmUKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IENJRyBDcmVhdGlvbiBGYWlsZWQiOwotICAgIGZvciAoYXV0byBpID0gaW50X3RyYWNrZXJzLmJlZ2luKCk7IGkgIT0gaW50X3RyYWNrZXJzLmVuZCgpO2krKykgewotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgICBpZihzdHJlYW0pIHsKLSAgICAgICAgc3RyZWFtLT5jaWdfc3RhdGUgPSBDaWdTdGF0ZTo6SU5WQUxJRDsKLSAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6SU5WQUxJRDsKLSAgICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpOT05FOzsKLSAgICAgIH0KLSAgICB9Ci0gICAgSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpQcmVwYXJlQ29kZWNDb25maWdQYXlsb2FkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlQ29kZWNDb25maWdPcD4gKmFzZV9vcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0pIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfcGFyYW1zOwotICB1aW50OF90IHRndF9sYXRlbmN5ID0gVEdUX0hJR0hfUkVMSUFCTEU7Ci0gIC8vIGNoZWNrIGZvciBzYW1wbGluZyBmcmVxCi0gIGZvciAoYXV0byBpdCA6IGZyZXFfdG9fbHR2X21hcCkgewotICAgIGlmKHN0cmVhbS0+Y29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID09IGl0LmZpcnN0KSB7Ci0gICAgICB1aW50OF90IGxlbiA9IExUVl9MRU5fU0FNUF9GUkVROwotICAgICAgdWludDhfdCB0eXBlID0gTFRWX1RZUEVfU0FNUF9GUkVROwotICAgICAgdWludDhfdCByYXRlID0gaXQuc2Vjb25kOwotICAgICAgY29kZWNfcGFyYW1zLmluc2VydChjb2RlY19wYXJhbXMuZW5kKCksICZsZW4sICZsZW4gKyAxKTsKLSAgICAgIGNvZGVjX3BhcmFtcy5pbnNlcnQoY29kZWNfcGFyYW1zLmVuZCgpLCAmdHlwZSwgJnR5cGUgKyAxKTsKLSAgICAgIGNvZGVjX3BhcmFtcy5pbnNlcnQoY29kZWNfcGFyYW1zLmVuZCgpLCAmcmF0ZSwgJnJhdGUgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIGNoZWNrIGZvciBmcmFtZSBkdXJhdGlvbiBhbmQgZmV0Y2ggNXRoIGJ5dGUKLSAgdWludDhfdCBmcmFtZV9kdXJhdGlvbiA9IEdldEZyYW1lRHVyYXRpb24oJnN0cmVhbS0+Y29kZWNfY29uZmlnKTsKLSAgdWludDhfdCBsZW4gPSBMVFZfTEVOX0ZSQU1FX0RVUjsKLSAgdWludDhfdCB0eXBlID0gTFRWX1RZUEVfRlJBTUVfRFVSOwotICBjb2RlY19wYXJhbXMuaW5zZXJ0KGNvZGVjX3BhcmFtcy5lbmQoKSwgJmxlbiwgJmxlbiArIDEpOwotICBjb2RlY19wYXJhbXMuaW5zZXJ0KGNvZGVjX3BhcmFtcy5lbmQoKSwgJnR5cGUsICZ0eXBlICsgMSk7Ci0gIGNvZGVjX3BhcmFtcy5pbnNlcnQoY29kZWNfcGFyYW1zLmVuZCgpLCAmZnJhbWVfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVfZHVyYXRpb24gKyAxKTsKLQotICAvLyBhdWRpbyBjaG5sIGFsbGNhdGlvbgotICBpZihzdHJlYW0tPmF1ZGlvX2xvY2F0aW9uKSB7Ci0gICAgdWludDhfdCBsZW4gPSBMVFZfTEVOX0NITkxfQUxMT0M7Ci0gICAgdWludDhfdCB0eXBlID0gTFRWX1RZUEVfQ0hOTF9BTExPQzsKLSAgICB1aW50MzJfdCB2YWx1ZSA9IHN0cmVhbS0+YXVkaW9fbG9jYXRpb247Ci0gICAgY29kZWNfcGFyYW1zLmluc2VydChjb2RlY19wYXJhbXMuZW5kKCksICZsZW4sICZsZW4gKyAxKTsKLSAgICBjb2RlY19wYXJhbXMuaW5zZXJ0KGNvZGVjX3BhcmFtcy5lbmQoKSwgJnR5cGUsICZ0eXBlICsgMSk7Ci0gICAgY29kZWNfcGFyYW1zLmluc2VydChjb2RlY19wYXJhbXMuZW5kKCksICgodWludDhfdCAqKSZ2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QgKikmdmFsdWUpICsgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIH0KLQotICAvLyBvY3RldHMgcGVyIGZyYW1lCi0gIGxlbiA9IExUVl9MRU5fT0NUU19QRVJfRlJBTUU7Ci0gIHR5cGUgPSBMVFZfVFlQRV9PQ1RTX1BFUl9GUkFNRTsKLSAgdWludDE2X3Qgb2N0c19wZXJfZnJhbWUgPSBHZXRPY3RzUGVyRnJhbWUoJnN0cmVhbS0+Y29kZWNfY29uZmlnKTsKLSAgY29kZWNfcGFyYW1zLmluc2VydChjb2RlY19wYXJhbXMuZW5kKCksICZsZW4sICZsZW4gKyAxKTsKLSAgY29kZWNfcGFyYW1zLmluc2VydChjb2RlY19wYXJhbXMuZW5kKCksICZ0eXBlLCAmdHlwZSArIDEpOwotICBjb2RlY19wYXJhbXMuaW5zZXJ0KGNvZGVjX3BhcmFtcy5lbmQoKSwgKCh1aW50OF90ICopJm9jdHNfcGVyX2ZyYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCAqKSZvY3RzX3Blcl9mcmFtZSkgKyBzaXplb2YodWludDE2X3QpKTsKLQotICAvLyBibG9ja3MgcGVyIFNEVQotICBsZW4gPSBMVFZfTEVOX0ZSQU1FU19QRVJfU0RVOwotICB0eXBlID0gTFRWX1RZUEVfRlJBTUVTX1BFUl9TRFU7Ci0gIHVpbnQ4X3QgYmxvY2tzX3Blcl9zZHUgPSBHZXRMYzNCbG9ja3NQZXJTZHUoJnN0cmVhbS0+Y29kZWNfY29uZmlnKTsKLSAgLy8gaW5pdGlhbGl6ZSBpdCB0byAxIGlmIGl0IGRvZXNuJ3QgZXhpc3RzCi0gIGlmKCFibG9ja3NfcGVyX3NkdSkgewotICAgIGJsb2Nrc19wZXJfc2R1ID0gMTsKLSAgfQotICBjb2RlY19wYXJhbXMuaW5zZXJ0KGNvZGVjX3BhcmFtcy5lbmQoKSwgJmxlbiwgJmxlbiArIDEpOwotICBjb2RlY19wYXJhbXMuaW5zZXJ0KGNvZGVjX3BhcmFtcy5lbmQoKSwgJnR5cGUsICZ0eXBlICsgMSk7Ci0gIGNvZGVjX3BhcmFtcy5pbnNlcnQoY29kZWNfcGFyYW1zLmVuZCgpLCAmYmxvY2tzX3Blcl9zZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tzX3Blcl9zZHUgKyAxKTsKLQotICBpZihzdHJlYW0tPmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgdGd0X2xhdGVuY3kgPSBUR1RfSElHSF9SRUxJQUJMRTsKLSAgfSBlbHNlIGlmKHN0cmVhbS0+YXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICB0Z3RfbGF0ZW5jeSA9IFRHVF9CQUxfTEFURU5DWTsKLSAgfSBlbHNlIGlmKHN0cmVhbS0+YXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfR0FNRSkgewotICAgIHRndF9sYXRlbmN5ID0gVEdUX0xPV19MQVRFTkNZOwotICB9Ci0KLSAgQXNlQ29kZWNDb25maWdPcCBjb2RlY19jb25maWdfb3AgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IHN0cmVhbS0+YXNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50Z3RfbGF0ZW5jeSA9ICB0Z3RfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGd0X3BoeSA9IExFXzJNX1BIWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29kZWNfaWQgPSB7TEMzX0NPREVDX0lELCAwLCAwLCAwLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29kZWNfcGFyYW1zX2xlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDx1aW50OF90PiAoY29kZWNfcGFyYW1zLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvZGVjX3BhcmFtcyA9IGNvZGVjX3BhcmFtcwotICB9OwotICBhc2Vfb3BzLT5wdXNoX2JhY2soY29kZWNfY29uZmlnX29wKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWFsYXJtX3QqIFN0cmVhbVRyYWNrZXI6OlNldFRpbWVyKGNvbnN0IGNoYXIqIGFsYXJtbmFtZSwKLSAgICAgICAgICAgICAgICAgIEJhcFRpbWVvdXQqIHRpbWVvdXQsIFRpbWVvdXRSZWFzb24gcmVhc29uLCB1aW50NjRfdCBtcykgewotICBhbGFybV90KiB0aW1lciA9IG51bGxwdHI7Ci0KLSAgdGltZW91dC0+YmRfYWRkciA9IHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpOwotICB0aW1lb3V0LT50cmFja2VyID0gdGhpczsKLSAgdGltZW91dC0+cmVhc29uID0gcmVhc29uOwotICB0aW1lb3V0LT50cmFuc2l0aW9uX3N0YXRlID0gU3RhdGVJZCgpOwotCi0gIEJhcEFsYXJtKiBiYXBfYWxhcm0gPSBzdHJtX21ncl8tPkdldEJhcEFsYXJtKCk7Ci0gIGlmIChiYXBfYWxhcm0gIT0gbnVsbHB0cikgewotICAgIHRpbWVyID0gYmFwX2FsYXJtLT5DcmVhdGUoYWxhcm1uYW1lKTsKLSAgICBpZiAodGltZXIgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBOb3QgYWJsZSB0byBjcmVhdGUgYWxhcm0iOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGFydGluZyAiIDw8IGFsYXJtbmFtZTsKLSAgICBiYXBfYWxhcm0tPlN0YXJ0KHRpbWVyLCBtcywgdGltZW91dCk7Ci0gIH0KLSAgcmV0dXJuIHRpbWVyOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OkNsZWFyVGltZXIoYWxhcm1fdCogdGltZXIsIGNvbnN0IGNoYXIqIGFsYXJtbmFtZSkgewotICBCYXBBbGFybSogYmFwX2FsYXJtID0gc3RybV9tZ3JfLT5HZXRCYXBBbGFybSgpOwotCi0gIGlmIChiYXBfYWxhcm0gIT0gbnVsbHB0ciAmJiBiYXBfYWxhcm0tPklzU2NoZWR1bGVkKHRpbWVyKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBjbGVhciAiIDw8IGFsYXJtbmFtZTsKLSAgICBiYXBfYWxhcm0tPlN0b3AodGltZXIpOwotICB9Ci19Ci0KLXZvaWQgU3RyZWFtVHJhY2tlcjo6T25UaW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgQmFwVGltZW91dCogdGltZW91dCA9IChCYXBUaW1lb3V0ICopZGF0YTsKLSAgaWYgKHRpbWVvdXQgPT0gbnVsbHB0cikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB0aW1lb3V0IGRhdGEgbnVsbCwgcmV0dXJuICI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBpc1JlbGVhc2VOZWVkZWQgPSBmYWxzZTsKLSAgaW50IHN0cmVhbV90cmFja2VyX2lkID0gdGltZW91dC0+dHJhbnNpdGlvbl9zdGF0ZTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN0cmVhbV90cmFja2VyX0lEOiAiIDw8IHN0cmVhbV90cmFja2VyX2lkCi0gICAgICAgICAgICA8PCAiLCB0aW1lb3V0IHJlYXNvbjogIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KHRpbWVvdXQtPnJlYXNvbik7Ci0KLSAgaWYgKHRpbWVvdXQtPnJlYXNvbiA9PSBUaW1lb3V0UmVhc29uOjpTVEFURV9UUkFOU0lUSU9OKSB7Ci0gICAgaWYgKHN0cmVhbV90cmFja2VyX2lkID09IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RpbmcpIHsKLSAgICAgIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+ICpjb25uX3N0cmVhbXMgPSBHZXRDb25uU3RyZWFtcygpOwotICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGF1ZGlvX3N0cm1zOiAiIDw8IGF1ZGlvX3N0cm1zLT5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb25uX3N0cmVhbXM6ICIgPDwgY29ubl9zdHJlYW1zLT5zaXplKCk7Ci0KLSAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5fc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gY29ubl9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogY29ubmVjdGlvbl9zdGF0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50Pihjb250ZXh0LT5jb25uZWN0aW9uX3N0YXRlKTsKLQotICAgICAgICBpZihjb250ZXh0LT5jb25uZWN0aW9uX3N0YXRlID09IEludENvbm5lY3RTdGF0ZTo6QVNDU19ESVNDT1ZFUkVEKSB7Ci0gICAgICAgICAgZm9yIChhdXRvIGlkID0gY29udGV4dC0+c3RyZWFtX2lkcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbSkgewotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGFzZV9zdGF0ZTogIiA8PCBzdHJlYW0tPmFzZV9zdGF0ZTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0tPmFzZV9zdGF0ZSAhPSBhc2NzOjpBU0VfU1RBVEVfSURMRSAmJgotICAgICAgICAgICAgICAgc3RyZWFtLT5hc2Vfc3RhdGUgIT0gYXNjczo6QVNFX1NUQVRFX1JFTEVBU0lORykgewotICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IGFzY3Mgc3RhdGUgaXMgbmVpdGhlciBpZGxlIG5vciByZWxlYXNpbmciOwotICAgICAgICAgICAgICBpc1JlbGVhc2VOZWVkZWQgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBpc1JlbGVhc2VOZWVkZWQ6ICIgPDwgaXNSZWxlYXNlTmVlZGVkOwotICAgICAgSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGlzUmVsZWFzZU5lZWRlZCk7Ci0gICAgfSBlbHNlIGlmIChzdHJlYW1fdHJhY2tlcl9pZCAhPSBTdHJlYW1UcmFja2VyOjprU3RhdGVEaXNjb25uZWN0aW5nKSB7Ci0gICAgICAvL0FsbCBvdGhlciB0cmFuc2llbnQgc3RhdGVzCi0gICAgICBIYW5kbGVJbnRlcm5hbERpc2Nvbm5lY3QodHJ1ZSk7Ci0gICAgfQotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBFeGl0IjsKLX0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpTdGF0ZUlkbGU6Ok9uRW50ZXIoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBTdHJlYW1UcmFja2VyIFN0YXRlOiAiIDw8IEdldFN0YXRlKCk7Ci0KLSAgVWNhc3RDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcyA9IHN0cm1fbWdyXy0+R2V0VWNsaWVudENiYWNrcygpOwotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RybXM7Ci0gIFN0cmVhbUNvbnRyb2xUeXBlIGNvbnRyb2xfdHlwZSA9IHRyYWNrZXJfLkdldENvbnRyb2xUeXBlKCk7Ci0KLSAgaWYoY29udHJvbF90eXBlICE9IFN0cmVhbUNvbnRyb2xUeXBlOjpEaXNjb25uZWN0ICYmCi0gICAgIGNvbnRyb2xfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6Q29ubmVjdCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmKGNvbnRyb2xfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6RGlzY29ubmVjdCkgewotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpkaXNjX3N0cmVhbXMgPSB0cmFja2VyXy5HZXRTdHJlYW1zKCk7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IERpc2MgU3RyZWFtcyBTaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRpc2Nfc3RyZWFtcy0+c2l6ZSgpOwotICAgIGZvciAoYXV0byBpdCA9IGRpc2Nfc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gZGlzY19zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgU3RyZWFtU3RhdGVJbmZvIHN0YXRlOwotICAgICAgbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7Ci0gICAgICBzdGF0ZS5zdHJlYW1fdHlwZSA9ICppdDsKLSAgICAgIHN0YXRlLnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQ7Ci0gICAgICBzdHJtcy5wdXNoX2JhY2soc3RhdGUpOwotICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLSAgICAgIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQ7Ci0gICAgICBjb250ZXh0LT5hdHRhY2hlZF9zdGF0ZSA9IFN0cmVhbUF0dGFjaGVkU3RhdGU6OklETEU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICIgQXR0YWNoZWQgc3RhdGUgbWFkZSBpZGxlIjsKLSAgICAgIGNvbnRleHQtPnN0cmVhbV9pZHMuY2xlYXIoKTsKLSAgICB9Ci0gIH0gZWxzZSBpZihjb250cm9sX3R5cGUgPT0gU3RyZWFtQ29udHJvbFR5cGU6OkNvbm5lY3QpIHsKLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubl9zdHJlYW1zID0gdHJhY2tlcl8uR2V0Q29ublN0cmVhbXMoKTsKLSAgICB1aW50MzJfdCBwcmV2X3N0YXRlID0gdHJhY2tlcl8uUHJldmlvdXNTdGF0ZUlkKCk7Ci0gICAgZm9yIChhdXRvIGl0ID0gY29ubl9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBjb25uX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICBTdHJlYW1TdGF0ZUluZm8gc3RhdGU7Ci0gICAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLSAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKGl0LT5zdHJlYW1fdHlwZSk7Ci0gICAgICBjb250ZXh0LT5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEOwotICAgICAgY29udGV4dC0+YXR0YWNoZWRfc3RhdGUgPSBTdHJlYW1BdHRhY2hlZFN0YXRlOjpJRExFOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiIEF0dGFjaGVkIHN0YXRlIG1hZGUgaWRsZSI7Ci0gICAgICBjb250ZXh0LT5zdHJlYW1faWRzLmNsZWFyKCk7Ci0gICAgICBpZihwcmV2X3N0YXRlID09IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RpbmcpIHsKLSAgICAgICAgc3RhdGUuc3RyZWFtX3R5cGUgPSBpdC0+c3RyZWFtX3R5cGU7Ci0gICAgICAgIHN0YXRlLnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQ7Ci0gICAgICAgIHN0cm1zLnB1c2hfYmFjayhzdGF0ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGNhbGxiYWNrcy0+T25TdHJlYW1TdGF0ZShzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgc3RybXMpOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlSWRsZTo6T25FeGl0KCkgewotCi19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6U3RhdGVJZGxlOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBCRCBBZGRyID0gIiA8PCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwiOiBTdGF0ZSA9ICIgPDwgR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwiOiBFdmVudCA9ICIgPDwgdHJhY2tlcl8uR2V0RXZlbnROYW1lKGV2ZW50KTsKLQotICBHYXR0UGVuZGluZ0RhdGEgKmdhdHRfcGVuZGluZ19kYXRhID0gc3RybV9tZ3JfLT5HZXRHYXR0UGVuZGluZ0RhdGEoKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCQVBfQ09OTkVDVF9SRVFfRVZUOiB7Ci0gICAgICAgQmFwQ29ubmVjdCAqZXZ0X2RhdGEgPSAoQmFwQ29ubmVjdCAqKSBwX2RhdGE7Ci0gICAgICAvLyBjaGVjayBpZiB0aGUgUEFDUyBjbGllbnQgaXMgY29ubmVjdGVkIHRvIHJlbW90ZSBkZXZpY2UKLSAgICAgIFBhY3NDbGllbnQgKnBhY3NfY2xpZW50ID0gc3RybV9tZ3JfLT5HZXRQYWNzQ2xpZW50KCk7Ci0gICAgICB1aW50MTZfdCBwYWNzX2NsaWVudF9pZCA9IHN0cm1fbWdyXy0+R2V0UGFjc0NsaWVudElkKCk7Ci0gICAgICBDb25uZWN0aW9uU3RhdGUgcGFjc19zdGF0ZSA9IHN0cm1fbWdyXy0+R2V0UGFjc1N0YXRlKCk7Ci0gICAgICBpZihwYWNzX3N0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICBwYWNzX3N0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVElORyB8fAotICAgICAgICAgICAgcGFjc19zdGF0ZSA9PSBDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RJTkcpIHsKLSAgICAgICAgLy8gbW92ZSB0aGUgc3RhdGUgdG8gY29ubmVjdGluZyBhbmQgaW5pdGlhdGUgcGFjcyBjb25uZWN0aW9uCi0gICAgICAgIHBhY3NfY2xpZW50LT5Db25uZWN0KHBhY3NfY2xpZW50X2lkLCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0X2RhdGEtPmlzX2RpcmVjdCk7Ci0gICAgICAgIGlmKGdhdHRfcGVuZGluZ19kYXRhLT5wYWNzX3BlbmRpbmdfY21kID09IEdhdHRQZW5kaW5nQ21kOjpOT05FKSB7Ci0gICAgICAgICAgZ2F0dF9wZW5kaW5nX2RhdGEtPnBhY3NfcGVuZGluZ19jbWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2F0dFBlbmRpbmdDbWQ6OkdBVFRfQ09OTl9QRU5ESU5HOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrZXJfLlRyYW5zaXRpb25UbyhTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0aW5nKTsKLSAgICAgIH0gZWxzZSBpZihwYWNzX3N0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgIC8vIHBhY3MgaXMgYWxyZWFkeSBjb25uZWN0ZWQgc28gaW5pdGlhdGUKLSAgICAgICAgLy8gcGFjcyBzZXJ2aWNlIGRpc2NvdnJ5IG5vdyBhbmQgbW92ZSB0aGUgc3RhdGUgdG8gY29ubmVjdGluZwotICAgICAgICBwYWNzX2NsaWVudC0+U3RhcnREaXNjb3ZlcnkocGFjc19jbGllbnRfaWQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpKTsKLSAgICAgICAgdHJhY2tlcl8uVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RpbmcpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiVW5oYW5kbGVkIEV2ZW50IiA8PCBsb2doZXgoZXZlbnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RyZWFtVHJhY2tlcjo6U3RhdGVDb25uZWN0aW5nOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU3RyZWFtVHJhY2tlciBTdGF0ZTogIiA8PCBHZXRTdGF0ZSgpOwotCi0gIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MgPSBzdHJtX21ncl8tPkdldFVjbGllbnRDYmFja3MoKTsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1TdGF0ZUluZm8+IHN0cm1zOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiAqY29ubl9zdHJlYW1zID0gdHJhY2tlcl8uR2V0Q29ublN0cmVhbXMoKTsKLQotICBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUgPSB0cmFja2VyXy5HZXRDb250cm9sVHlwZSgpOwotCi0gIGlmKGNvbnRyb2xfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6Q29ubmVjdCkgcmV0dXJuOwotCi0gIENvbm5lY3Rpb25TdGF0ZSBwYWNzX3N0YXRlID0gc3RybV9tZ3JfLT5HZXRQYWNzU3RhdGUoKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICI6IENvbm4gU3RyZWFtcyBTaXplOiAiIDw8IGNvbm5fc3RyZWFtcy0+c2l6ZSgpOwotCi0gIGZvciAoYXV0byBpdCA9IGNvbm5fc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gY29ubl9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgIFN0cmVhbVN0YXRlSW5mbyBzdGF0ZTsKLSAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLSAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotICAgIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpDT05ORUNUSU5HOwotICAgIGlmKHBhY3Nfc3RhdGUgPT0gQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQgfHwKLSAgICAgICBwYWNzX3N0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVElORykgewotICAgICAgY29udGV4dC0+Y29ubmVjdGlvbl9zdGF0ZSA9IEludENvbm5lY3RTdGF0ZTo6UEFDU19DT05ORUNUSU5HOwotICAgIH0gZWxzZSBpZihwYWNzX3N0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICBjb250ZXh0LT5jb25uZWN0aW9uX3N0YXRlID0gSW50Q29ubmVjdFN0YXRlOjpQQUNTX0RJU0NPVkVSSU5HOwotICAgIH0KLSAgICBzdGF0ZS5zdHJlYW1fdHlwZSA9IGl0LT5zdHJlYW1fdHlwZTsKLSAgICBzdGF0ZS5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORzsKLSAgICBzdHJtcy5wdXNoX2JhY2soc3RhdGUpOwotICB9Ci0gIGNhbGxiYWNrcy0+T25TdHJlYW1TdGF0ZShzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgc3RybXMpOwotCi0gIFRpbWVvdXRSZWFzb24gcmVhc29uID0gVGltZW91dFJlYXNvbjo6U1RBVEVfVFJBTlNJVElPTjsKLSAgc3RhdGVfdHJhbnNpdGlvbl90aW1lciA9IHRyYWNrZXJfLlNldFRpbWVyKCJTdGF0ZUNvbm5lY3RpbmdUaW1lciIsCi0gICAgICAgICAgICAgICAgICAgICAgICZ0aW1lb3V0LCByZWFzb24sICgoY29ubl9zdHJlYW1zLT5zaXplKCkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihUaW1lb3V0VmFsOjpDb25uZWN0aW5nVGltZW91dCkpKSk7Ci0gIGlmIChzdGF0ZV90cmFuc2l0aW9uX3RpbWVyID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFN0YXRlQ29ubmVjdGluZzogQWxhcm0gbm90IGFsbG9jYXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlQ29ubmVjdGluZzo6T25FeGl0KCkgewotICB0cmFja2VyXy5DbGVhclRpbWVyKHN0YXRlX3RyYW5zaXRpb25fdGltZXIsICJTdGF0ZUNvbm5lY3RpbmdUaW1lciIpOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlQ29ubmVjdGluZzo6RGVyaXZlRGV2aWNlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNzRGlzY292ZXJ5ICpwYWNzX2Rpc2NvdmVyeSkgewotICAvLyBkZXJpdmUgdGhlIGRldmljZSB0eXBlIGJhc2VkIG9uIHNpbmsgcGFjIHJlY29yZHMKLSAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+ICpwYWNfcmVjb3JkcyA9ICZwYWNzX2Rpc2NvdmVyeS0+c2lua19wYWNfcmVjb3JkczsKLSAgdWludDhfdCBtYXhfY2hubF9jb3VudCA9IDA7Ci0KLSAgLy8gY2hubCBjb3VudCBBdWRpbyBsb2NhdGlvbiAgVHlwZSBvZiBkZXZpY2UgICAgICAgICAgIE5vIG9mIEFTRXMKLSAgLy8gMSAgICAgICAgICBMZWZ0IG9yIFJpZ2h0ICAgRWFyYnVkICAgICAgICAgICAgICAgICAgIDEgQVNFIHBlciBFYXJidWQKLSAgLy8gMSAgICAgICAgICBMZWZ0IGFuZCBSaWdodCAgU3RlcmVvIEhlYWRzZXQgKCAyIENJUykgIDIgQVNFcwotICAvLyAyICAgICAgICAgIExlZnQgYW5kIFJpZ2h0ICBTdGVyZW8gSGVhZHNldCAoIDEgQ0lTKSAgMSBBU0UKLSAgLy8gMiAgICAgICAgICBMZWZ0IG9yIFJpZ2h0ICAgRWFyYnVkICAgICAgICAgICAgICAgICAgIDEgQVNFIHBlciBFYXJidWQKLQotICBmb3IgKGF1dG8gaiA9IHBhY19yZWNvcmRzLT5iZWdpbigpOyBqICE9IHBhY19yZWNvcmRzLT5lbmQoKTtqKyspIHsKLSAgICBDb2RlY0NvbmZpZyAqZHN0ID0gJigqaik7Ci0gICAgaWYoc3RhdGljX2Nhc3Q8dWludDE2X3Q+IChkc3QtPmNoYW5uZWxfbW9kZSkgJgotICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTykpIHsKLSAgICAgIG1heF9jaG5sX2NvdW50ID0gMjsKLSAgICB9IGVsc2UgaWYoIW1heF9jaG5sX2NvdW50ICYmCi0gICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoZHN0LT5jaGFubmVsX21vZGUpICYKLSAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+IChDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfTU9OTykpIHsKLSAgICAgIG1heF9jaG5sX2NvdW50ID0gMTsKLSAgICB9Ci0gIH0KLQotICBpZihwYWNzX2Rpc2NvdmVyeS0+c2lua19sb2NhdGlvbnMgJiB1Y2FzdDo6QVVESU9fTE9DX0xFRlQgJiYKLSAgICAgcGFjc19kaXNjb3ZlcnktPnNpbmtfbG9jYXRpb25zICYgdWNhc3Q6OkFVRElPX0xPQ19SSUdIVCkgewotICAgIGlmKG1heF9jaG5sX2NvdW50ID09IDIpIHsKLSAgICAgIHN0cm1fbWdyXy0+VXBkYXRlRGV2VHlwZShEZXZpY2VUeXBlOjpIRUFEU0VUX1NURVJFTyk7Ci0gICAgfSBlbHNlIGlmIChtYXhfY2hubF9jb3VudCA9PSAxKSB7Ci0gICAgICBzdHJtX21ncl8tPlVwZGF0ZURldlR5cGUoRGV2aWNlVHlwZTo6SEVBRFNFVF9TUExJVF9TVEVSRU8pOwotICAgIH0KLSAgfSBlbHNlIGlmKHBhY3NfZGlzY292ZXJ5LT5zaW5rX2xvY2F0aW9ucyAmIHVjYXN0OjpBVURJT19MT0NfTEVGVCB8fAotICAgICAgICAgICAgcGFjc19kaXNjb3ZlcnktPnNpbmtfbG9jYXRpb25zICYgdWNhc3Q6OkFVRElPX0xPQ19SSUdIVCkgewotICAgIHN0cm1fbWdyXy0+VXBkYXRlRGV2VHlwZShEZXZpY2VUeXBlOjpFQVJCVUQpOwotICB9Ci19Ci0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpTdGF0ZUNvbm5lY3Rpbmc6OkF0dGFjaFN0cmVhbXNUb0NvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiAqYWxsX3RyYWNrZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VWNhc3RBdWRpb1N0cmVhbSAqPiAqc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2lzX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlQ29kZWNDb25maWdPcD4gKmFzZV9vcHMpIHsKLSAgUGFjc0Rpc2NvdmVyeSAqcGFjc19kaXNjb3ZlcnlfID0gdHJhY2tlcl8uR2V0UGFjc0Rpc2NvdmVyeSgpOwotICBpZiAoIXBhY3NfZGlzY292ZXJ5XykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gIGZvcih1aW50OF90IGkgPSAwOyBpIDwgYWxsX3RyYWNrZXJzLT5zaXplKCkvY2lzX2NvdW50IDsgaSsrKSB7Ci0gICAgZm9yKHVpbnQ4X3QgaiA9IDA7IGogPCBjaXNfY291bnQgOyBqKyspIHsKLSAgICAgIEludFN0cm1UcmFja2VyICp0cmFja2VyID0gYWxsX3RyYWNrZXJzLT5hdChpKmNpc19jb3VudCArIGopOwotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gc3RyZWFtcy0+YXQoKGkqY2lzX2NvdW50ICsgaiklIHN0cmVhbXMtPnNpemUoKSk7Ci0gICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+c3RybV90eXBlKTsKLSAgICAgIGlmKHN0cmVhbS0+b3ZlcmFsbF9zdGF0ZSA9PSBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlKSB7Ci0gICAgICAgIHN0cmVhbS0+YXVkaW9fY29udGV4dCA9IHRyYWNrZXItPnN0cm1fdHlwZS5hdWRpb19jb250ZXh0OwotICAgICAgICBzdHJlYW0tPmNvbnRyb2xfdHlwZSA9IFN0cmVhbUNvbnRyb2xUeXBlOjpDb25uZWN0OwotICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgIHN0cmVhbS0+Y29kZWNfY29uZmlnID0gdHJhY2tlci0+Y29kZWNfY29uZmlnOwotICAgICAgICBzdHJlYW0tPnJlcV9xb3NfY29uZmlnID0gdHJhY2tlci0+cW9zX2NvbmZpZzsKLSAgICAgICAgc3RyZWFtLT5xb3NfY29uZmlnID0gdHJhY2tlci0+cW9zX2NvbmZpZzsKLSAgICAgICAgc3RyZWFtLT5jaWdfaWQgPSB0cmFja2VyLT5jaWdfaWQ7Ci0gICAgICAgIHN0cmVhbS0+Y2lzX2lkID0gdHJhY2tlci0+Y2lzX2lkOwotCi0gICAgICAgIHN0cmVhbS0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OklOVkFMSUQ7Ci0gICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gQ2lzU3RhdGU6OklOVkFMSUQ7Ci0gICAgICAgIHN0cmVhbS0+b3ZlcmFsbF9zdGF0ZSA9IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3Rpbmc7Ci0KLSAgICAgICAgaWYgKHN0cmVhbS0+ZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgIGlmKGNpc19jb3VudCA+IDEpIHsKLSAgICAgICAgICAgIHN0cmVhbS0+YXVkaW9fbG9jYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBwYWNzX2Rpc2NvdmVyeV8tPnNpbmtfbG9jYXRpb25zICYgbG9jYXRpb25zLmF0KGopOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihwYWNzX2Rpc2NvdmVyeV8tPnNpbmtfbG9jYXRpb25zICYgdWNhc3Q6OkFVRElPX0xPQ19MRUZUICYmCi0gICAgICAgICAgICAgICBwYWNzX2Rpc2NvdmVyeV8tPnNpbmtfbG9jYXRpb25zICYgdWNhc3Q6OkFVRElPX0xPQ19SSUdIVCkgewotICAgICAgICAgICAgICBzdHJlYW0tPmF1ZGlvX2xvY2F0aW9uID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZihwYWNzX2Rpc2NvdmVyeV8tPnNpbmtfbG9jYXRpb25zICYgdWNhc3Q6OkFVRElPX0xPQ19MRUZUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgcGFjc19kaXNjb3ZlcnlfLT5zaW5rX2xvY2F0aW9ucyAmIHVjYXN0OjpBVURJT19MT0NfUklHSFQpIHsKLSAgICAgICAgICAgICAgc3RyZWFtLT5hdWRpb19sb2NhdGlvbiA9IHBhY3NfZGlzY292ZXJ5Xy0+c2lua19sb2NhdGlvbnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS0+ZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgaWYoY2lzX2NvdW50ID4gMSkgewotICAgICAgICAgICAgc3RyZWFtLT5hdWRpb19sb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIHBhY3NfZGlzY292ZXJ5Xy0+c3JjX2xvY2F0aW9ucyAmIGxvY2F0aW9ucy5hdChqKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYocGFjc19kaXNjb3ZlcnlfLT5zcmNfbG9jYXRpb25zICYgdWNhc3Q6OkFVRElPX0xPQ19MRUZUICYmCi0gICAgICAgICAgICAgICBwYWNzX2Rpc2NvdmVyeV8tPnNyY19sb2NhdGlvbnMgJiB1Y2FzdDo6QVVESU9fTE9DX1JJR0hUKSB7Ci0gICAgICAgICAgICAgIHN0cmVhbS0+YXVkaW9fbG9jYXRpb24gPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmKHBhY3NfZGlzY292ZXJ5Xy0+c3JjX2xvY2F0aW9ucyAmIHVjYXN0OjpBVURJT19MT0NfTEVGVCB8fAotICAgICAgICAgICAgICAgICAgICAgIHBhY3NfZGlzY292ZXJ5Xy0+c3JjX2xvY2F0aW9ucyAmIHVjYXN0OjpBVURJT19MT0NfUklHSFQpIHsKLSAgICAgICAgICAgICAgc3RyZWFtLT5hdWRpb19sb2NhdGlvbiA9IHBhY3NfZGlzY292ZXJ5Xy0+c3JjX2xvY2F0aW9uczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHJhY2tlcl8uUHJlcGFyZUNvZGVjQ29uZmlnUGF5bG9hZChhc2Vfb3BzLCBzdHJlYW0pOwotICAgICAgICB0cmFja2VyLT5hdHRhY2hlZF9zdGF0ZSA9IGNvbnRleHQtPmF0dGFjaGVkX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1BdHRhY2hlZFN0YXRlOjpJRExFX1RPX1BIWTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOiBQaHlzaWNhbGx5ICBhdHRhY2hlZCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IFZpcnR1YWxseSBhdHRhY2hlZCI7Ci0gICAgICAgIHRyYWNrZXItPmF0dGFjaGVkX3N0YXRlID0gY29udGV4dC0+YXR0YWNoZWRfc3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUF0dGFjaGVkU3RhdGU6OlZJUlRVQUw7Ci0gICAgICB9Ci0gICAgICB0cmFja2VyLT5hc2VfaWQgPSBzdHJlYW0tPmFzZV9pZDsKLQotICAgICAgU3RyZWFtSWRUeXBlIGlkID0gewotICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IHN0cmVhbS0+YXNlX2lkLAotICAgICAgICAgICAgICAgICAgLmFzZV9kaXJlY3Rpb24gPSBzdHJlYW0tPmRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgIC52aXJ0dWFsX2F0dGFjaCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IHRyYWNrZXItPmNpZ19pZCwKLSAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSB0cmFja2VyLT5jaXNfaWQKLSAgICAgIH07Ci0gICAgICBjb250ZXh0LT5zdHJlYW1faWRzLnB1c2hfYmFjayhpZCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0YXRlQ29ubmVjdGluZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQkQgQWRkciA9ICIgPDwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogU3RhdGUgPSAiIDw8IEdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogRXZlbnQgPSAiIDw8IHRyYWNrZXJfLkdldEV2ZW50TmFtZShldmVudCk7Ci0KLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gKmNvbm5fc3RyZWFtcyA9IHRyYWNrZXJfLkdldENvbm5TdHJlYW1zKCk7Ci0gIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgR2F0dFBlbmRpbmdEYXRhICpnYXR0X3BlbmRpbmdfZGF0YSA9IHN0cm1fbWdyXy0+R2V0R2F0dFBlbmRpbmdEYXRhKCk7Ci0KLSAgdWludDhfdCBudW1fY29ubl9zdHJlYW1zID0gMDsKLSAgaWYoY29ubl9zdHJlYW1zKSB7Ci0gICAgIG51bV9jb25uX3N0cmVhbXMgPSBjb25uX3N0cmVhbXMtPnNpemUoKTsKLSAgfQotICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJBUF9ESVNDT05ORUNUX1JFUV9FVlQ6IHsKLQotICAgICAgLy8gZXhwZWN0IHRoZSBkaXNjb25uZWN0aW9uIGZvciBzYW1lIHNldCBvZiBzdHJlYW1zIGNvbm5lY3Rpb24KLSAgICAgIC8vIGhhcyBpbml0aWF0ZWQgZXg6IGlmIGNvbm5lY3QgaXMgaXNzdWVkIGZvciBtZWRpYSAodHgpLCB2b2ljZSh0eCAmIHJ4KQotICAgICAgLy8gdGhlbiBkaXNjb25uZWN0IGlzIGV4cGVjdGVkIGZvciBtZWRpYSAodHgpLCB2b2ljZSh0eCAmIHJ4KS4KLQotICAgICAgLy8gYmFzZWQgb24gY29ubmVjdGlvbiBzdGF0ZSwgaXNzdWUgdGhlIHJlbGV2YW50IGNvbW1hbmRzIGFuZCBtb3ZlCi0gICAgICAvLyB0aGUgc3RhdGUgdG8gZGlzY29ubmVjdGluZwotICAgICAgLy8gaXNzdWUgdGhlIHJlbGVhc2Ugb3BlcnRpb24gaWYgZm9yIGFueSBzdHJlYW0gQVNFIG9wZXJhdGlvbiBpcwotICAgICAgLy8gaW5pdGlhdGVkCi0KLSAgICAgIC8vIHVwYXRlIHRoZSBjb250cm9sIHR5cGUgYW5kIHN0cmVhbXMgYWxzbwotICAgICAgQmFwRGlzY29ubmVjdCAqZXZ0X2RhdGEgPSAoQmFwRGlzY29ubmVjdCAqKSBwX2RhdGE7Ci0KLSAgICAgIHRyYWNrZXJfLlVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpEaXNjb25uZWN0KTsKLQotICAgICAgdHJhY2tlcl8uVXBkYXRlU3RyZWFtcygmZXZ0X2RhdGEtPnN0cmVhbXMpOwotCi0gICAgICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gICAgICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotCi0gICAgICBzdGQ6OnZlY3RvcjxBc2VSZWxlYXNlT3A+IGFzZV9vcHM7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqZGlzY19zdHJlYW1zID0gdHJhY2tlcl8uR2V0U3RyZWFtcygpOwotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IGRpc2Nfc3RyZWFtczogIiA8PCBkaXNjX3N0cmVhbXMtPnNpemUoKTsKLQotICAgICAgZm9yIChhdXRvIGl0ID0gZGlzY19zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBkaXNjX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKCppdCk7Ci0gICAgICAgIGlmKGNvbnRleHQtPmNvbm5lY3Rpb25fc3RhdGUgPT0gSW50Q29ubmVjdFN0YXRlOjpBU0NTX0RJU0NPVkVSRUQpIHsKLSAgICAgICAgICBmb3IgKGF1dG8gaWQgPSBjb250ZXh0LT5zdHJlYW1faWRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbSkgewotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgY2FuX2JlX2Rpc2Nvbm5lY3RlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJfLlN0cmVhbUNhbmJlRGlzY29ubmVjdGVkKGNvbnRleHQsIGlkLT5hc2VfaWQpOwotICAgICAgICAgICAgaWYoY2FuX2JlX2Rpc2Nvbm5lY3RlZCAmJgotICAgICAgICAgICAgICAgc3RyZWFtLT5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQgJiYKLSAgICAgICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kICE9IEFzY3NQZW5kaW5nQ21kOjpSRUxFQVNFX0lTU1VFRCkgewotICAgICAgICAgICAgICBBc2VSZWxlYXNlT3AgcmVsZWFzZV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IHN0cmVhbS0+YXNlX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgYXNlX29wcy5wdXNoX2JhY2socmVsZWFzZV9vcCk7Ci0gICAgICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6OlJFTEVBU0VfSVNTVUVEOwotICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIG92ZXJhbGwgc3RhdGUgdG8gc3RhcnRpbmcKLSAgICAgICAgICAgICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlRGlzY29ubmVjdGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBhc2Vfb3BzIHNpemU6ICIgPDwgYXNlX29wcy5zaXplKCk7Ci0KLSAgICAgIC8vIHNlbmQgY29uc29saWRhdGVkIHJlbGVhc2UgY29tbWFuZCB0byBBU0NTIGNsaWVudAotICAgICAgaWYoYXNlX29wcy5zaXplKCkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBHb2luZyBGb3IgQVNDUyBSZWxlYXNlIG9wIjsKLSAgICAgICAgYXNjc19jbGllbnQtPlJlbGVhc2UoQVNDU19DTElFTlRfSUQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBhc2Vfb3BzKTsKLSAgICAgIH0KLQotICAgICAgdHJhY2tlcl8uVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZURpc2Nvbm5lY3RpbmcpOwotCi0gICAgfSBicmVhazsKLSAgICBjYXNlIFBBQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIFBhY3NDb25uZWN0aW9uU3RhdGUgKnBhY3Nfc3RhdGUgPSAgKFBhY3NDb25uZWN0aW9uU3RhdGUgKikgcF9kYXRhOwotCi0gICAgICBQYWNzQ2xpZW50ICpwYWNzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0UGFjc0NsaWVudCgpOwotICAgICAgdWludDE2X3QgcGFjc19jbGllbnRfaWQgPSBzdHJtX21ncl8tPkdldFBhY3NDbGllbnRJZCgpOwotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCI6IHBhY3Nfc3RhdGU6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihwYWNzX3N0YXRlLT5zdGF0ZSk7Ci0gICAgICBpZihwYWNzX3N0YXRlLT5zdGF0ZSA9PSBDb25uZWN0aW9uU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAvLyBub3cgc2VuZCB0aGUgUEFDUyBkaXNjb3ZlcnkKLSAgICAgICAgZ2F0dF9wZW5kaW5nX2RhdGEtPnBhY3NfcGVuZGluZ19jbWQgPSBHYXR0UGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgcGFjc19jbGllbnQtPlN0YXJ0RGlzY292ZXJ5KHBhY3NfY2xpZW50X2lkLCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSk7Ci0gICAgICB9IGVsc2UgaWYocGFjc19zdGF0ZS0+c3RhdGUgPT0gQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgZ2F0dF9wZW5kaW5nX2RhdGEtPnBhY3NfcGVuZGluZ19jbWQgPSBHYXR0UGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgdHJhY2tlcl8uSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBudW1fY29ubl9zdHJlYW1zIDsgaSsrKSB7Ci0gICAgICAgIFN0cmVhbUNvbm5lY3QgY29ubl9zdHJlYW0gPSBjb25uX3N0cmVhbXMtPmF0KGkpOwotICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSk7Ci0gICAgICAgIGlmKHBhY3Nfc3RhdGUtPnN0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgY29udGV4dC0+Y29ubmVjdGlvbl9zdGF0ZSA9IEludENvbm5lY3RTdGF0ZTo6UEFDU19ESVNDT1ZFUklORzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIFBBQ1NfRElTQ09WRVJZX1JFU19FVlQ6IHsKLSAgICAgIFBhY3NEaXNjb3ZlcnkgcGFjc19kaXNjb3ZlcnlfID0gICooKFBhY3NEaXNjb3ZlcnkgKikgcF9kYXRhKTsKLSAgICAgIEdhdHRTdGF0ZSBhc2NzX3N0YXRlID0gc3RybV9tZ3JfLT5HZXRBc2NzU3RhdGUoKTsKLSAgICAgIEdhdHRQZW5kaW5nRGF0YSAqZ2F0dF9wZW5kaW5nX2RhdGEgPSBzdHJtX21ncl8tPkdldEdhdHRQZW5kaW5nRGF0YSgpOwotICAgICAgYm9vbCBwcm9jZXNzX3BhY3NfcmVzdWx0cyA9IGZhbHNlOwotCi0gICAgICAvLyBjaGVjayBpZiB0aGlzIHRyYWNrZXIgYWxyZWFkeSBwYXNzZWQgdGhlIHBhY3MgZGlzY292ZXJ5IHN0YWdlCi0gICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBudW1fY29ubl9zdHJlYW1zIDsgaSsrKSB7Ci0gICAgICAgIFN0cmVhbUNvbm5lY3QgY29ubl9zdHJlYW0gPSBjb25uX3N0cmVhbXMtPmF0KGkpOwotICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSk7Ci0gICAgICAgIGlmKGNvbnRleHQtPmNvbm5lY3Rpb25fc3RhdGUgPT0gSW50Q29ubmVjdFN0YXRlOjpQQUNTX0RJU0NPVkVSSU5HKSB7Ci0gICAgICAgICAgcHJvY2Vzc19wYWNzX3Jlc3VsdHMgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKCFwcm9jZXNzX3BhY3NfcmVzdWx0cykgYnJlYWs7Ci0KLSAgICAgIGJvb2wgY29udGV4dF9zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgIC8vIGNoZWNrIHRoZSBzdGF0dXMKLSAgICAgIGlmKHBhY3NfZGlzY292ZXJ5Xy5zdGF0dXMpIHsKLSAgICAgICAgdHJhY2tlcl8uSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIiBQQUNTIGRpc2NvdmVyeSBmYWlsZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHRyYWNrZXJfLlVwZGF0ZVBhY3NEaXNjb3ZlcnkocGFjc19kaXNjb3ZlcnlfKTsKLQotICAgICAgLy8gRGVyaXZlIHRoZSBkZXZpY2UgdHlwZSBiYXNlZCBvbiBwYWNzIGRpc2NvdmVyeSByZXN1bHRzCi0gICAgICBEZXJpdmVEZXZpY2VUeXBlKChQYWNzRGlzY292ZXJ5ICopIHBfZGF0YSk7Ci0KLSAgICAgIC8vIGNoZWNrIGlmIHN1cHBvcnRlZCBhdWRpbyBjb250ZXh0cyBoYXMgcmVxdWlyZWQgY29udGV4dHMKLSAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5fc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gY29ubl9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbSA9IGl0LT5zdHJlYW1fdHlwZTsKLSAgICAgICAgaWYoc3RyZWFtLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICBpZihzdHJlYW0uYXVkaW9fY29udGV4dCAmIHBhY3NfZGlzY292ZXJ5Xy5zdXBwb3J0ZWRfY29udGV4dHMpIHsKLSAgICAgICAgICAgIGNvbnRleHRfc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihzdHJlYW0uZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgaWYoKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdHJlYW0uYXVkaW9fY29udGV4dCkgPDwgMTYpICYKLSAgICAgICAgICAgICAgIHBhY3NfZGlzY292ZXJ5Xy5zdXBwb3J0ZWRfY29udGV4dHMpIHsKLSAgICAgICAgICAgIGNvbnRleHRfc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoIWNvbnRleHRfc3VwcG9ydGVkKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICIgTm8gTWF0Y2hpbmcgU3VwcG9ydGVkIENvbnRleHRzIGZvdW5kIjsKLSAgICAgICAgdHJhY2tlcl8uSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGlmIG5vdCBwcmVzZW50IHNlbmQgdGhlIEJBUCBjYWxsYmFjayBhcyBkaXNjb25uZWN0ZWQKLSAgICAgIC8vIGNvbXBhcmUgdGhlIGNvZGVjIGNvbmZpZ3MgZnJvbSB1cHBlciBsYXllciB0byByZW1vdGUgZGV2Ci0gICAgICAvLyBzaW5rIG9yIHNyYyBQQUNTIHJlY29yZHMvY2FwYWJpbGl0aWVzLgotCi0gICAgICAvLyBnbyBmb3IgQVNDUyBkaXNjb3Zlcnkgb25seSB3aGVuIGNvZGVjIGNvbmZpZ3MgYXJlIGRlY2lkZWQKLQotICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbnVtX2Nvbm5fc3RyZWFtcyA7IGkrKykgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fc3RyZWFtID0gY29ubl9zdHJlYW1zLT5hdChpKTsKLSAgICAgICAgLy8gVE9ETyBmb3Igbm93IHdpbGwgcGljayBkaXJlY3RseSBmaXJzdCBzZXQgb2YgQ29kZWMgYW5kIFFPUyBjb25maWdzCi0KLSAgICAgICAgdWludDhfdCBpbmRleCA9IHRyYWNrZXJfLkNob29zZUJlc3RDb2RlYyhjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uX3N0cmVhbS5jb2RlY19xb3NfY29uZmlnX3BhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFjc19kaXNjb3ZlcnlfKTsKLSAgICAgICAgaWYoaW5kZXggIT0gMFhGRikgewotICAgICAgICAgIENvZGVjUW9zQ29uZmlnIGVudHJ5ID0gY29ubl9zdHJlYW0uY29kZWNfcW9zX2NvbmZpZ19wYWlyLmF0KGluZGV4KTsKLSAgICAgICAgICBDb2RlY0NvbmZpZyBjb2RlY19jb25maWcgPSBlbnRyeS5jb2RlY19jb25maWc7Ci0gICAgICAgICAgUW9zQ29uZmlnIHFvc19jb25maWcgPSBlbnRyeS5xb3NfY29uZmlnOwotCi0gICAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgZm9yIChhdXRvIGFzY3NfY29uZmlnID0gcW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICBhc2NzX2NvbmZpZyAhPSBxb3NfY29uZmlnLmFzY3NfY29uZmlncy5lbmQoKTsgYXNjc19jb25maWcrKykgewotICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRPckFkZEJ5dHJhY2tlclR5cGUoY29ubl9zdHJlYW0uc3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgYXNjc19jb25maWctPmNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzX2NvbmZpZy0+Y2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2NvbmZpZywgcW9zX2NvbmZpZyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRleHQtPmNvZGVjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZzsKLSAgICAgICAgICBjb250ZXh0LT5yZXFfcW9zX2NvbmZpZyA9IHFvc19jb25maWc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIiBObyBNYXRjaGluZyBDb2RlYyBGb3VuZCBGb3IgU3RyZWFtIjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBjaGVjayBpZiBhbnkgbWF0Y2ggYmV0d2VlbiB1cHBlciBsYXllciBjb2RlYyBhbmQgcmVtb3RlIGRldidzCi0gICAgICAvLyBwYWNzIHJlY29yZHMKLSAgICAgIGlmKCFpbnRfc3RybV90cmFja2Vyc18uc2l6ZSgpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiTm8gTWF0Y2hpbmcgY29kZWMgZm91bmQgZm9yIGFsbCBzdHJlYW1zIjsKLSAgICAgICAgdHJhY2tlcl8uSGFuZGxlSW50ZXJuYWxEaXNjb25uZWN0KGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZihhc2NzX3N0YXRlID09IEdhdHRTdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIEFTQ1MgU2VydmljZSBEaXNjb3ZlcnkiOwotICAgICAgICAvLyBub3cgc2VuZCB0aGUgQVNDUyBkaXNjb3ZlcnkKLSAgICAgICAgYXNjc19jbGllbnQtPlN0YXJ0RGlzY292ZXJ5KEFTQ1NfQ0xJRU5UX0lELCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSk7Ci0gICAgICB9IGVsc2UgaWYoYXNjc19zdGF0ZSA9PSBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IEdvaW5nIEZvciBBU0NTIENvbm5lY2l0b24iOwotICAgICAgICBhc2NzX2NsaWVudC0+Q29ubmVjdChBU0NTX0NMSUVOVF9JRCwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksIGZhbHNlKTsKLSAgICAgICAgaWYoZ2F0dF9wZW5kaW5nX2RhdGEtPmFzY3NfcGVuZGluZ19jbWQgPT0gR2F0dFBlbmRpbmdDbWQ6Ok5PTkUpIHsKLSAgICAgICAgICBnYXR0X3BlbmRpbmdfZGF0YS0+YXNjc19wZW5kaW5nX2NtZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYXR0UGVuZGluZ0NtZDo6R0FUVF9DT05OX1BFTkRJTkc7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbnVtX2Nvbm5fc3RyZWFtcyA7IGkrKykgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fc3RyZWFtID0gY29ubl9zdHJlYW1zLT5hdChpKTsKLSAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSk7Ci0gICAgICAgIGlmKGFzY3Nfc3RhdGUgPT0gR2F0dFN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgICAgICBjb250ZXh0LT5jb25uZWN0aW9uX3N0YXRlID0gSW50Q29ubmVjdFN0YXRlOjpBU0NTX0RJU0NPVkVSSU5HOwotICAgICAgICB9IGVsc2UgaWYoYXNjc19zdGF0ZSA9PSBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgIGNvbnRleHQtPmNvbm5lY3Rpb25fc3RhdGUgPSBJbnRDb25uZWN0U3RhdGU6OkFTQ1NfQ09OTkVDVElORzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFTQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIEFzY3NDb25uZWN0aW9uU3RhdGUgKmFzY3Nfc3RhdGUgPSAgKEFzY3NDb25uZWN0aW9uU3RhdGUgKikgcF9kYXRhOwotICAgICAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldEFzY3NDbGllbnQoKTsKLQotICAgICAgaWYoYXNjc19zdGF0ZS0+c3RhdGUgPT0gR2F0dFN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQVNDUyBzZXJ2ZXIgY29ubmVjdGVkIjsKLSAgICAgICAgLy8gbm93IHNlbmQgdGhlIEFTQ1MgZGlzY292ZXJ5Ci0gICAgICAgIGdhdHRfcGVuZGluZ19kYXRhLT5hc2NzX3BlbmRpbmdfY21kID0gR2F0dFBlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgIGFzY3NfY2xpZW50LT5TdGFydERpc2NvdmVyeShBU0NTX0NMSUVOVF9JRCwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCkpOwotICAgICAgfSBlbHNlIGlmKGFzY3Nfc3RhdGUtPnN0YXRlID09IEdhdHRTdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEFTQ1Mgc2VydmVyIERpc2Nvbm5lY3RlZCI7Ci0gICAgICAgIGdhdHRfcGVuZGluZ19kYXRhLT5hc2NzX3BlbmRpbmdfY21kID0gR2F0dFBlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgIHRyYWNrZXJfLkhhbmRsZUludGVybmFsRGlzY29ubmVjdChmYWxzZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbnVtX2Nvbm5fc3RyZWFtcyA7IGkrKykgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fc3RyZWFtID0gY29ubl9zdHJlYW1zLT5hdChpKTsKLSAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSk7Ci0gICAgICAgIGlmKGFzY3Nfc3RhdGUtPnN0YXRlID09IEdhdHRTdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgY29udGV4dC0+Y29ubmVjdGlvbl9zdGF0ZSA9IEludENvbm5lY3RTdGF0ZTo6QVNDU19ESVNDT1ZFUklORzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBU0NTX0RJU0NPVkVSWV9SRVNfRVZUOiB7Ci0gICAgICBBc2NzRGlzY292ZXJ5IGFzY3NfZGlzY292ZXJ5XyA9ICAqKChBc2NzRGlzY292ZXJ5ICopIHBfZGF0YSk7Ci0gICAgICBzdGQ6OnZlY3RvcjxBc2VDb2RlY0NvbmZpZ09wPiBhc2Vfb3BzOwotICAgICAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldEFzY3NDbGllbnQoKTsKLSAgICAgIHN0ZDo6dmVjdG9yPEFzZVBhcmFtcz4gc2lua19hc2VfbGlzdCA9IGFzY3NfZGlzY292ZXJ5Xy5zaW5rX2FzZXNfbGlzdDsKLSAgICAgIHN0ZDo6dmVjdG9yPEFzZVBhcmFtcz4gc3JjX2FzZV9saXN0ID0gYXNjc19kaXNjb3ZlcnlfLnNyY19hc2VzX2xpc3Q7Ci0gICAgICAvLyBjaGVjayB0aGUgc3RhdHVzCi0gICAgICBpZihhc2NzX2Rpc2NvdmVyeV8uc3RhdHVzKSB7Ci0gICAgICAgIHRyYWNrZXJfLkhhbmRsZUludGVybmFsRGlzY29ubmVjdChmYWxzZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbnVtX2Nvbm5fc3RyZWFtcyA7IGkrKykgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fc3RyZWFtID0gY29ubl9zdHJlYW1zLT5hdChpKTsKLSAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0cmVhbS5zdHJlYW1fdHlwZSk7Ci0gICAgICAgIGNvbnRleHQtPmNvbm5lY3Rpb25fc3RhdGUgPSBJbnRDb25uZWN0U3RhdGU6OkFTQ1NfRElTQ09WRVJFRDsKLSAgICAgIH0KLQotICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgVWNhc3RBdWRpb1N0cmVhbSBmb3IgZWFjaCBBU0VzIChhc2UgaWQpCi0gICAgICAvLyBjaGVjayBpZiB0aGUgZW50cnkgaXMgcHJlc2VudCwgaWYgbm90IGNyZWF0ZSBhbmQgYWRkIGl0IHRvIGxpc3QKLSAgICAgIC8vIGZpbmQgb3V0IG51bWJlciBvZiBBU0VzIHdoaWNoIGFyZSBpbiBJRExFIHN0YXRlCi0gICAgICBmb3IgKGF1dG8gJiBhc2UgOiBzaW5rX2FzZV9saXN0KSB7Ci0gICAgICAgIGF1ZGlvX3N0cm1zLT5GaW5kT3JBZGRCeUFzZUlkKGFzZS5hc2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZS5hc2Vfc3RhdGUsIEFTRV9ESVJFQ1RJT05fU0lOSyk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoYXV0byAmIGFzZSA6IHNyY19hc2VfbGlzdCkgewotICAgICAgICBhdWRpb19zdHJtcy0+RmluZE9yQWRkQnlBc2VJZChhc2UuYXNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2UuYXNlX3N0YXRlLCBBU0VfRElSRUNUSU9OX1NSQyk7Ci0gICAgICB9Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB0b3RhbCBudW0gb2YgYXVkaW8gc3RybXM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhdWRpb19zdHJtcy0+c2l6ZSgpOwotCi0gICAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiBzaW5rX2ludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkdldFRyYWNrZXJMaXN0QnlEaXIoQVNFX0RJUkVDVElPTl9TSU5LKTsKLQotICAgICAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gc3JjX2ludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkdldFRyYWNrZXJMaXN0QnlEaXIoQVNFX0RJUkVDVElPTl9TUkMpOwotCi0gICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN0YXRlX2lkcyA9IHsgU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZSB9OwotCi0gICAgICBzdGQ6OnZlY3RvcjxVY2FzdEF1ZGlvU3RyZWFtICo+IGlkbGVfc2lua19zdHJlYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RybXMtPkdldFN0cmVhbXNCeVN0YXRlcyhzdGF0ZV9pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTRV9ESVJFQ1RJT05fU0lOSyk7Ci0gICAgICBzdGQ6OnZlY3RvcjxVY2FzdEF1ZGlvU3RyZWFtICo+IGlkbGVfc3JjX3N0cmVhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJtcy0+R2V0U3RyZWFtc0J5U3RhdGVzKHN0YXRlX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFX0RJUkVDVElPTl9TUkMpOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBOdW0gb2YgU2luayBJZGxlIFN0cmVhbXMgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICBpZGxlX3Npbmtfc3RyZWFtcy5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogTnVtIG9mIFNyYyBJZGxlIFN0cmVhbXMgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICBpZGxlX3NyY19zdHJlYW1zLnNpemUoKTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBOdW0gb2YgU2luayBJbnRlcm5hbCBUcmFja2VycyA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIHNpbmtfaW50X3RyYWNrZXJzLnNpemUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBOdW0gb2YgU3JjIEludGVybmFsIFRyYWNrZXJzID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAgc3JjX2ludF90cmFja2Vycy5zaXplKCk7Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyAgPDwgIjogTnVtIG9mIENvbm4gU3RyZWFtcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICBsb2doZXgobnVtX2Nvbm5fc3RyZWFtcyk7Ci0KLSAgICAgIC8vIGNoZWNrIGhvdyBtYW55IHN0cmVhbSBjb25uZWN0aW9ucyBhcmUgcmVxdWVzdGVkIGFuZAotICAgICAgLy8gaG93IG1hbnkgc3RyZWFtcyhBU0VzKSBhcmUgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nCi0gICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHN0cmVhbXMoQVNFcykgZm9yCi0gICAgICAvLyB0aGUgZ2l2ZW4gc2V0IG9mIGNvbm5lY3Rpb24gcmVxdWlyZW1lbnQKLSAgICAgIERldmljZVR5cGUgZGV2X3R5cGUgPSBzdHJtX21ncl8tPkdldERldlR5cGUoKTsKLSAgICAgIHVpbnQ4X3QgY2lzX2NvdW50ID0gMDsKLSAgICAgIGlmKGRldl90eXBlID09IERldmljZVR5cGU6OkVBUkJVRCB8fAotICAgICAgICAgZGV2X3R5cGUgPT0gRGV2aWNlVHlwZTo6SEVBRFNFVF9TVEVSRU8pIHsKLSAgICAgICAgY2lzX2NvdW50ID0gMTsKLSAgICAgIH0gZWxzZSBpZihkZXZfdHlwZSA9PSBEZXZpY2VUeXBlOjpIRUFEU0VUX1NQTElUX1NURVJFTykgewotICAgICAgICBjaXNfY291bnQgPSAyOwotICAgICAgfQotCi0gICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZhbGlkX3N0YXRlX2lkcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVTdHJlYW1pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVSZWNvbmZpZ3VyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlRGlzY29ubmVjdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0YXJ0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgIGlmKHNpbmtfaW50X3RyYWNrZXJzLnNpemUoKSkgewotICAgICAgICBpZihpZGxlX3Npbmtfc3RyZWFtcy5zaXplKCkgPj0gc2lua19pbnRfdHJhY2tlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgQXR0YWNoU3RyZWFtc1RvQ29udGV4dCgmc2lua19pbnRfdHJhY2tlcnMsICZpZGxlX3Npbmtfc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpc19jb3VudCwgJmFzZV9vcHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IHNpbmtfaW50X3RyYWNrZXJzXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua19pbnRfdHJhY2tlcnNfMjsKLSAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBzaW5rX2ludF90cmFja2VycyBpbnRvIDIgbGlzdHMgbm93LCBvbmUgbGlzdAotICAgICAgICAgICAgLy8gaXMgZXF1YWwgdG8gaWRsZV9zaW5rX3N0cmVhbXMgYXMgcGh5c2ljYWwgYW5kIG90aGVyCi0gICAgICAgICAgICAvLyBsaXN0IGFzIHZpcnR1YWxseSBhdHRhY2hlZAotICAgICAgICAgIGlmKGlkbGVfc2lua19zdHJlYW1zLnNpemUoKSkgeyAvLyBsZXNzIG51bSBvZiBmcmVlIEFTRXMKLSAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGlkbGVfc2lua19zdHJlYW1zLnNpemUoKSA7IGkrKykgewotICAgICAgICAgICAgICBJbnRTdHJtVHJhY2tlciAqdHJhY2tlciA9IHNpbmtfaW50X3RyYWNrZXJzLmF0KGkpOwotICAgICAgICAgICAgICBzaW5rX2ludF90cmFja2Vyc18xLnB1c2hfYmFjayh0cmFja2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF0dGFjaFN0cmVhbXNUb0NvbnRleHQoJnNpbmtfaW50X3RyYWNrZXJzXzEsICZpZGxlX3Npbmtfc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzX2NvdW50LCAmYXNlX29wcyk7Ci0gICAgICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IGlkbGVfc2lua19zdHJlYW1zLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgc2lua19pbnRfdHJhY2tlcnMuc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgICAgICAgIEludFN0cm1UcmFja2VyICp0cmFja2VyID0gc2lua19pbnRfdHJhY2tlcnMuYXQoaSk7Ci0gICAgICAgICAgICAgIHNpbmtfaW50X3RyYWNrZXJzXzIucHVzaF9iYWNrKHRyYWNrZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gYWxsX2FjdGl2ZV9zaW5rX3N0cmVhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJtcy0+R2V0U3RyZWFtc0J5U3RhdGVzKHZhbGlkX3N0YXRlX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFX0RJUkVDVElPTl9TSU5LKTsKLQotICAgICAgICAgIGlmKHNpbmtfaW50X3RyYWNrZXJzXzIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBdHRhY2hTdHJlYW1zVG9Db250ZXh0KCZzaW5rX2ludF90cmFja2Vyc18yLCAmYWxsX2FjdGl2ZV9zaW5rX3N0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXNfY291bnQsICZhc2Vfb3BzKTsKLSAgICAgICAgICB9IGVsc2UgaWYoc2lua19pbnRfdHJhY2tlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBdHRhY2hTdHJlYW1zVG9Db250ZXh0KCZzaW5rX2ludF90cmFja2VycywgJmFsbF9hY3RpdmVfc2lua19zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzX2NvdW50LCAmYXNlX29wcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIGRvIHRoZSBzYW1lIHByb2NlZHVyZSBmb3Igc3JjIHRyYWNrZXJzIGFzIHdlbGwKLSAgICAgIGlmKHNyY19pbnRfdHJhY2tlcnMuc2l6ZSgpKSB7Ci0gICAgICAgIGlmKGlkbGVfc3JjX3N0cmVhbXMuc2l6ZSgpID49IHNyY19pbnRfdHJhY2tlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgQXR0YWNoU3RyZWFtc1RvQ29udGV4dCgmc3JjX2ludF90cmFja2VycywgJmlkbGVfc3JjX3N0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXNfY291bnQsICZhc2Vfb3BzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiBzcmNfaW50X3RyYWNrZXJzXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2ludF90cmFja2Vyc18yOwotICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHNyY19pbnRfdHJhY2tlcnMgaW50byAyIGxpc3RzIG5vdywgb25lIGxpc3QKLSAgICAgICAgICAgIC8vIGlzIGVxdWFsIHRvIGlkbGVfc3JjX3N0cmVhbXMgYXMgcGh5c2ljYWwgYW5kIG90aGVyCi0gICAgICAgICAgICAvLyBsaXN0IGFzIHZpcnR1YWxseSBhdHRhY2hlZAotICAgICAgICAgIGlmKGlkbGVfc3JjX3N0cmVhbXMuc2l6ZSgpKSB7IC8vIGxlc3MgbnVtIG9mIGZyZWUgQVNFcwotICAgICAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgaWRsZV9zcmNfc3RyZWFtcy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICAgICAgSW50U3RybVRyYWNrZXIgKnRyYWNrZXIgPSBzcmNfaW50X3RyYWNrZXJzLmF0KGkpOwotICAgICAgICAgICAgICBzcmNfaW50X3RyYWNrZXJzXzEucHVzaF9iYWNrKHRyYWNrZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXR0YWNoU3RyZWFtc1RvQ29udGV4dCgmc3JjX2ludF90cmFja2Vyc18xLCAmaWRsZV9zcmNfc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpc19jb3VudCwgJmFzZV9vcHMpOwotICAgICAgICAgICAgZm9yICh1aW50OF90IGkgPSBpZGxlX3NyY19zdHJlYW1zLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgc3JjX2ludF90cmFja2Vycy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICAgICAgSW50U3RybVRyYWNrZXIgKnRyYWNrZXIgPSBzcmNfaW50X3RyYWNrZXJzLmF0KGkpOwotICAgICAgICAgICAgICBzcmNfaW50X3RyYWNrZXJzXzIucHVzaF9iYWNrKHRyYWNrZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gYWxsX2FjdGl2ZV9zcmNfc3RyZWFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJtcy0+R2V0U3RyZWFtc0J5U3RhdGVzKHZhbGlkX3N0YXRlX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTRV9ESVJFQ1RJT05fU1JDKTsKLQotICAgICAgICAgIGlmKHNyY19pbnRfdHJhY2tlcnNfMi5zaXplKCkpIHsKLSAgICAgICAgICAgIEF0dGFjaFN0cmVhbXNUb0NvbnRleHQoJnNyY19pbnRfdHJhY2tlcnNfMiwgJmFsbF9hY3RpdmVfc3JjX3N0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXNfY291bnQsICZhc2Vfb3BzKTsKLSAgICAgICAgICB9IGVsc2UgaWYoc3JjX2ludF90cmFja2Vycy5zaXplKCkpIHsKLSAgICAgICAgICAgIEF0dGFjaFN0cmVhbXNUb0NvbnRleHQoJnNyY19pbnRfdHJhY2tlcnMsICZhbGxfYWN0aXZlX3NyY19zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzX2NvdW50LCAmYXNlX29wcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlbW92ZSBhbGwgZHVwbGljYXRlIGludGVybmFsIHN0cmVhbSB0cmFja2VycwotICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLlJlbW92ZVZpcnR1YWxBdHRhY2hlZFRyYWNrZXJzKCk7Ci0KLSAgICAgIC8vIGlmIHRoZSBpbnQgc3RybSB0cmFja2VycyBzaXplIGlzIDAgdGhlbiByZXR1cm4gYXMKLSAgICAgIC8vIGNvbm5lY3RlZCBpbW1lZGlhdGVseQotICAgICAgaWYoIWludF9zdHJtX3RyYWNrZXJzXy5zaXplKCkpIHsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0ZSB0byBjb25uZWN0ZWQKLSAgICAgICAgVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZighYXNlX29wcy5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIEFTQ1MgQ29kZWNDb25maWcgb3AiOwotICAgICAgICBhc2NzX2NsaWVudC0+Q29kZWNDb25maWcoQVNDU19DTElFTlRfSUQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlX29wcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cmFja2VyXy5IYW5kbGVJbnRlcm5hbERpc2Nvbm5lY3QoZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVmcmVzaCB0aGUgc2luayBhbmQgc3JjIHRyYWNrZXJzCi0gICAgICBzaW5rX2ludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkdldFRyYWNrZXJMaXN0QnlEaXIoQVNFX0RJUkVDVElPTl9TSU5LKTsKLQotICAgICAgc3JjX2ludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkdldFRyYWNrZXJMaXN0QnlEaXIoQVNFX0RJUkVDVElPTl9TUkMpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICI6IE51bSBvZiBuZXcgU2luayBJbnRlcm5hbCBUcmFja2VycyA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIHNpbmtfaW50X3RyYWNrZXJzLnNpemUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBOdW0gb2YgbmV3IFNyYyBJbnRlcm5hbCBUcmFja2VycyA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIHNyY19pbnRfdHJhY2tlcnMuc2l6ZSgpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICI6IE51bSBvZiBuZXcgU2luayBJZGxlIFN0cmVhbXMgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICBpZGxlX3Npbmtfc3RyZWFtcy5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogTnVtIG9mIG5ldyBTcmMgSWRsZSBTdHJlYW1zID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAgaWRsZV9zcmNfc3RyZWFtcy5zaXplKCk7Ci0KLSAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGVzIHRvIGNvbm5lY3Rpbmcgb3Igb3RoZXIgaW50ZXJuYWwgc3RhdGVzCi0gICAgICBpZihzaW5rX2ludF90cmFja2Vycy5zaXplKCkpIHsKLSAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgc2lua19pbnRfdHJhY2tlcnMuc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gaWRsZV9zaW5rX3N0cmVhbXMuYXQoaSk7Ci0gICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6Q09ERUNfQ09ORklHX0lTU1VFRDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYoc3JjX2ludF90cmFja2Vycy5zaXplKCkpIHsKLSAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgc3JjX2ludF90cmFja2Vycy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBpZGxlX3NyY19zdHJlYW1zLmF0KGkpOwotICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6OkNPREVDX0NPTkZJR19JU1NVRUQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBU0NTX0FTRV9TVEFURV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZUFzZVN0YXRlRXZlbnQocF9kYXRhLCBTdHJlYW1Db250cm9sVHlwZTo6Q29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludF9zdHJtX3RyYWNrZXJzXyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVNDU19BU0VfT1BfRkFJTEVEX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlQXNlT3BGYWlsZWRFdmVudChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJBUF9USU1FX09VVF9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLk9uVGltZW91dChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFVuLWhhbmRsZWQgZXZlbnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0cmFja2VyXy5HZXRFdmVudE5hbWUoZXZlbnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpTdGF0ZUNvbm5lY3RlZDo6T25FbnRlcigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFN0cmVhbVRyYWNrZXIgU3RhdGU6ICIgPDwgR2V0U3RhdGUoKTsKLQotICBVY2FzdENsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzID0gc3RybV9tZ3JfLT5HZXRVY2xpZW50Q2JhY2tzKCk7Ci0gIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtU3RhdGVJbmZvPiBzdHJtczsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29uZmlnSW5mbz4gc3RyZWFtX2NvbmZpZ3M7Ci0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gIFBhY3NEaXNjb3ZlcnkgKnBhY3NfZGlzY292ZXJ5XyA9IHRyYWNrZXJfLkdldFBhY3NEaXNjb3ZlcnkoKTsKLSAgU3RyZWFtQ29udHJvbFR5cGUgY29udHJvbF90eXBlID0gdHJhY2tlcl8uR2V0Q29udHJvbFR5cGUoKTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gY29udl9zdHJlYW1zOwotCi0gIGlmKGNvbnRyb2xfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6Q29ubmVjdCAmJgotICAgICBjb250cm9sX3R5cGUgIT0gU3RyZWFtQ29udHJvbFR5cGU6OlN0b3AgJiYKLSAgICAgY29udHJvbF90eXBlICE9IFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZykgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmKGNvbnRyb2xfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6Q29ubmVjdCkgewotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+ICpjb25uX3N0cmVhbXMgPSB0cmFja2VyXy5HZXRDb25uU3RyZWFtcygpOwotICAgIGZvciAoYXV0byBpdCA9IGNvbm5fc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gY29ubl9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaXQtPnN0cmVhbV90eXBlOwotICAgICAgY29udl9zdHJlYW1zLnB1c2hfYmFjayh0eXBlKTsKLSAgICB9Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBDb25uIFN0cmVhbXMgU2l6ZSAiIDw8IGNvbm5fc3RyZWFtcy0+c2l6ZSgpOwotICB9IGVsc2UgaWYoY29udHJvbF90eXBlID09IFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZykgewotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAqcmVjb25mX3N0cmVhbXMgPSB0cmFja2VyXy5HZXRSZWNvbmZTdHJlYW1zKCk7Ci0gICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7IGl0ICE9IHJlY29uZl9zdHJlYW1zLT5lbmQoKTtpdCsrKSB7Ci0gICAgICBTdHJlYW1UeXBlIHR5cGUgPSBpdC0+c3RyZWFtX3R5cGU7Ci0gICAgICBjb252X3N0cmVhbXMucHVzaF9iYWNrKHR5cGUpOwotICAgIH0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IFJlY29uZmlnIFN0cmVhbXMgc2l6ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZWNvbmZfc3RyZWFtcy0+c2l6ZSgpOwotICB9IGVsc2UgewotICAgIGNvbnZfc3RyZWFtcyA9ICAqdHJhY2tlcl8uR2V0U3RyZWFtcygpOwotICB9Ci0KLSAgaWYoY29udHJvbF90eXBlID09IFN0cmVhbUNvbnRyb2xUeXBlOjpDb25uZWN0IHx8Ci0gICAgIGNvbnRyb2xfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6UmVjb25maWcpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBjb252X3N0cmVhbXMuYmVnaW4oKTsgaXQgIT0gY29udl9zdHJlYW1zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgqaXQpOwotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeVN0cmVhbVR5cGUoCi0gICAgICAgICAgICAgICAgKCppdCkudHlwZSwgKCppdCkuZGlyZWN0aW9uKTsKLSAgICAgIC8vIGF2b2lkIGR1cGxpY2F0ZSB1cGRhdGVzCi0gICAgICBpZihjb250ZXh0ICYmIHBhY3NfZGlzY292ZXJ5XyAmJgotICAgICAgICAgY29udGV4dC0+c3RyZWFtX3N0YXRlICE9IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgICAgU3RyZWFtQ29uZmlnSW5mbyBjb25maWc7Ci0gICAgICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7Ci0gICAgICAgIGNvbmZpZy5zdHJlYW1fdHlwZSA9ICppdDsKLSAgICAgICAgaWYoc3RyZWFtKSB7Ci0gICAgICAgICAgY29uZmlnLmNvZGVjX2NvbmZpZyA9IHN0cmVhbS0+Y29kZWNfY29uZmlnOwotICAgICAgICAgIGNvbmZpZy5xb3NfY29uZmlnID0gc3RyZWFtLT5xb3NfY29uZmlnOwotICAgICAgICAgIGNvbnRleHQtPnFvc19jb25maWcgPSBzdHJlYW0tPnFvc19jb25maWc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY29uZmlnLmNvZGVjX2NvbmZpZyA9IGNvbnRleHQtPmNvZGVjX2NvbmZpZzsKLSAgICAgICAgICBjb25maWcucW9zX2NvbmZpZyA9IGNvbnRleHQtPnJlcV9xb3NfY29uZmlnOwotICAgICAgICAgIGNvbnRleHQtPnFvc19jb25maWcgPSBjb250ZXh0LT5yZXFfcW9zX2NvbmZpZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vS2VlcGluZyBiaXRzX3Blcl9zYW1wbGUgYXMgMjQgYWx3YXlzIGZvciBMQzMKLSAgICAgICAgaWYgKGNvbmZpZy5jb2RlY19jb25maWcuY29kZWNfdHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzKSB7Ci0gICAgICAgICAgY29uZmlnLmNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0JQUzo6Q09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoY29uZmlnLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICBjb25maWcuYXVkaW9fbG9jYXRpb24gPSBwYWNzX2Rpc2NvdmVyeV8tPnNpbmtfbG9jYXRpb25zOwotICAgICAgICAgIGNvbmZpZy5jb2RlY3Nfc2VsZWN0YWJsZSA9IHBhY3NfZGlzY292ZXJ5Xy0+c2lua19wYWNfcmVjb3JkczsKLSAgICAgICAgfSBlbHNlIGlmKGNvbmZpZy5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICBjb25maWcuYXVkaW9fbG9jYXRpb24gPSBwYWNzX2Rpc2NvdmVyeV8tPnNyY19sb2NhdGlvbnM7Ci0gICAgICAgICAgY29uZmlnLmNvZGVjc19zZWxlY3RhYmxlID0gcGFjc19kaXNjb3ZlcnlfLT5zcmNfcGFjX3JlY29yZHM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtX2NvbmZpZ3MucHVzaF9iYWNrKGNvbmZpZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYoc3RyZWFtX2NvbmZpZ3Muc2l6ZSgpKSB7Ci0gICAgICBjYWxsYmFja3MtPk9uU3RyZWFtQ29uZmlnKHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBzdHJlYW1fY29uZmlncyk7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChhdXRvIGl0ID0gY29udl9zdHJlYW1zLmJlZ2luKCk7IGl0ICE9IGNvbnZfc3RyZWFtcy5lbmQoKTsgaXQrKykgewotICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKCppdCk7Ci0gICAgLy8gYXZvaWQgZHVwbGljYXRlIHVwZGF0ZXMKLSAgICBpZiggY29udGV4dC0+c3RyZWFtX3N0YXRlICE9IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgIFN0cmVhbVN0YXRlSW5mbyBzdGF0ZTsKLSAgICAgIG1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdGF0ZSkpOwotICAgICAgc3RhdGUuc3RyZWFtX3R5cGUgPSAqaXQ7Ci0gICAgICBzdGF0ZS5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEOwotICAgICAgY29udGV4dC0+c3RyZWFtX3N0YXRlID0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRDsKLSAgICAgIHN0cm1zLnB1c2hfYmFjayhzdGF0ZSk7Ci0gICAgfQotICB9Ci0KLSAgaWYoc3RybXMuc2l6ZSgpKSB7Ci0gICAgY2FsbGJhY2tzLT5PblN0cmVhbVN0YXRlKHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBzdHJtcyk7Ci0gIH0KLX0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpTdGF0ZUNvbm5lY3RlZDo6T25FeGl0KCkgewotCi19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6U3RhdGVDb25uZWN0ZWQ6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSB7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IEJEIEFkZHIgPSAiIDw8IHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IFN0YXRlID0gIiA8PCBHZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IEV2ZW50ID0gIiA8PCB0cmFja2VyXy5HZXRFdmVudE5hbWUoZXZlbnQpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJBUF9ESVNDT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZURpc2Nvbm5lY3QocF9kYXRhLCBTdHJlYW1UcmFja2VyOjprU3RhdGVDb25uZWN0ZWQpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJBUF9TVEFSVF9SRVFfRVZUOiB7Ci0gICAgICBQYWNzQ2xpZW50ICpwYWNzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0UGFjc0NsaWVudCgpOwotICAgICAgdWludDE2X3QgcGFjc19jbGllbnRfaWQgPSBzdHJtX21ncl8tPkdldFBhY3NDbGllbnRJZCgpOwotCi0gICAgICBCYXBTdGFydCAqZXZ0X2RhdGEgPSAoQmFwU3RhcnQgKikgcF9kYXRhOwotCi0gICAgICB0cmFja2VyXy5VcGRhdGVDb250cm9sVHlwZShTdHJlYW1Db250cm9sVHlwZTo6U3RhcnQpOwotCi0gICAgICB0cmFja2VyXy5VcGRhdGVTdHJlYW1zKCZldnRfZGF0YS0+c3RyZWFtcyk7Ci0KLSAgICAgIHBhY3NfY2xpZW50LT5HZXRBdWRpb0F2YWlsYWJpbGl0eShwYWNzX2NsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSk7Ci0KLSAgICAgIHRyYWNrZXJfLlRyYW5zaXRpb25UbyhTdHJlYW1UcmFja2VyOjprU3RhdGVTdGFydGluZyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQkFQX1JFQ09ORklHX1JFUV9FVlQ6IHsKLSAgICAgIEJhcFJlY29uZmlnICpldnRfZGF0YSA9IChCYXBSZWNvbmZpZyAqKSBwX2RhdGE7Ci0KLSAgICAgIHRyYWNrZXJfLlVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpSZWNvbmZpZyk7Ci0gICAgICB0cmFja2VyXy5VcGRhdGVSZWNvbmZTdHJlYW1zKCZldnRfZGF0YS0+c3RyZWFtcyk7Ci0KLSAgICAgIC8vIGNoZWNrIGlmIGNvZGVjIHJlY29uZmlndXJhdGlvbiBvciBxb3MgcmVjb25maWd1cmF0aW9uCi0gICAgICBQYWNzQ2xpZW50ICpwYWNzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0UGFjc0NsaWVudCgpOwotICAgICAgdWludDE2X3QgcGFjc19jbGllbnRfaWQgPSBzdHJtX21ncl8tPkdldFBhY3NDbGllbnRJZCgpOwotCi0gICAgICAvLyBwYWNzIGlzIGFscmVhZHkgY29ubmVjdGVkIHNvIGluaXRpYXRlCi0gICAgICAvLyBwYWNzIHNlcnZpY2UgZGlzY292cnkgbm93IGFuZCBtb3ZlIHRoZSBzdGF0ZSB0byByZWNvbmZpZ3VyaW5nCi0gICAgICBwYWNzX2NsaWVudC0+U3RhcnREaXNjb3ZlcnkocGFjc19jbGllbnRfaWQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpKTsKLQotICAgICAgdHJhY2tlcl8uVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVJlY29uZmlndXJpbmcpOwotCi0gICAgfSBicmVhazsKLSAgICBjYXNlIFBBQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZVBhY3NDb25uZWN0aW9uRXZlbnQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQVNDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlQXNjc0Nvbm5lY3Rpb25FdmVudChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBU0NTX0FTRV9TVEFURV9FVlQ6IHsKLSAgICAgIEFzY3NTdGF0ZSAqYXNjcyA9ICAoKEFzY3NTdGF0ZSAqKSBwX2RhdGEpOwotICAgICAgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1JFTEVBU0lORykgewotICAgICAgICB0cmFja2VyXy5IYW5kbGVSZW1vdGVEaXNjb25uZWN0KEFTQ1NfQVNFX1NUQVRFX0VWVCwgcF9kYXRhLCBTdGF0ZUlkKCkpOwotICAgICAgfSBlbHNlIGlmKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NzOjpBU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCkgewotICAgICAgICB0cmFja2VyXy5IYW5kbGVSZW1vdGVSZWNvbmZpZyhBU0NTX0FTRV9TVEFURV9FVlQsIHBfZGF0YSwgU3RhdGVJZCgpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogVW4taGFuZGxlZCBldmVudDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRyYWNrZXJfLkdldEV2ZW50TmFtZShldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlU3RhcnRpbmc6Ok9uRW50ZXIoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBTdHJlYW1UcmFja2VyIFN0YXRlOiAiIDw8IEdldFN0YXRlKCk7Ci0KLSAgVWNhc3RDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcyA9IHN0cm1fbWdyXy0+R2V0VWNsaWVudENiYWNrcygpOwotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RybXM7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpzdGFydF9zdHJlYW1zID0gdHJhY2tlcl8uR2V0U3RyZWFtcygpOwotICB1aW50OF90IG51bV9hc2VzID0gMDsKLQotICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IFN0YXJ0IFN0cmVhbXMgU2l6ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXJ0X3N0cmVhbXMtPnNpemUoKTsKLQotICBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUgPSB0cmFja2VyXy5HZXRDb250cm9sVHlwZSgpOwotCi0gIGlmKGNvbnRyb2xfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6U3RhcnQpIHJldHVybjsKLQotICBmb3IgKGF1dG8gaXQgPSBzdGFydF9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBzdGFydF9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgIFN0cmVhbVN0YXRlSW5mbyBzdGF0ZTsKLSAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLSAgICBzdGF0ZS5zdHJlYW1fdHlwZSA9ICppdDsKLSAgICBzdGF0ZS5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6U1RBUlRJTkc7Ci0gICAgc3RybXMucHVzaF9iYWNrKHN0YXRlKTsKLSAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgqaXQpOwotICAgIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpTVEFSVElORzsKLQotICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgaWQgIT0gY29udGV4dC0+c3RyZWFtX2lkcy5lbmQoKTsgaWQrKykgewotICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRPckFkZEJ5dHJhY2tlclR5cGUoKml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+YXNlX2lkLCBpZC0+Y2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+Y2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5jb2RlY19jb25maWcsIGNvbnRleHQtPnFvc19jb25maWcpOwotICAgIH0KLSAgICBudW1fYXNlcyArPSBjb250ZXh0LT5zdHJlYW1faWRzLnNpemUoKTsKLSAgfQotICBjYWxsYmFja3MtPk9uU3RyZWFtU3RhdGUoc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksIHN0cm1zKTsKLSAgdWludDY0X3QgdG91dCA9IG51bV9hc2VzICoKLSAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihUaW1lb3V0VmFsOjpTdGFydGluZ1RpbWVvdXQpKTsKLSAgaWYoIXRvdXQpIHsKLSAgICB0b3V0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE1heFRpbWVvdXRWYWw6OlN0YXJ0aW5nVGltZW91dCk7Ci0gIH0KLSAgVGltZW91dFJlYXNvbiByZWFzb24gPSBUaW1lb3V0UmVhc29uOjpTVEFURV9UUkFOU0lUSU9OOwotICBzdGF0ZV90cmFuc2l0aW9uX3RpbWVyID0gdHJhY2tlcl8uU2V0VGltZXIoIlN0YXRlU3RhcnRpbmdUaW1lciIsCi0gICAgICAgICZ0aW1lb3V0LCByZWFzb24sIHRvdXQpOwotICBpZiAoc3RhdGVfdHJhbnNpdGlvbl90aW1lciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIjogU3RhdGVTdGFydGluZzogQWxhcm0gbm90IGFsbG9jYXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlU3RhcnRpbmc6Ok9uRXhpdCgpIHsKLSAgdHJhY2tlcl8uQ2xlYXJUaW1lcihzdGF0ZV90cmFuc2l0aW9uX3RpbWVyLCAiU3RhdGVTdGFydGluZ1RpbWVyIik7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6Q2hlY2tBbmRVcGRhdGVTdHJlYW1pbmdTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSW50U3RybVRyYWNrZXJzICppbnRfc3RybV90cmFja2VycykgewotICAvLyAgdG8gY2hlY2sgZm9yIGFsbCBpbnRlcm5hbCB0cmFja2VycyBhcmUgbW92ZWQgdG8KLSAgLy8gc3RyZWFtaW5nIHN0YXRlIHRoZW4gdXBkYXRlIGl0IHVwcGVyIGxheWVycwotICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiAqYWxsX3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICBpbnRfc3RybV90cmFja2Vycy0+R2V0VHJhY2tlckxpc3QoKTsKLSAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgdWludDhfdCBudW1fc3RybXNfaW5fc3RyZWFtaW5nID0gMDsKLQotICBib29sIHBlbmRpbmdfY21kcyA9IGZhbHNlOwotCi0gIC8vIGNoZWNrIGlmIGFueSBwZW5kaW5nIGNvbW1hbmRzIGFyZSBwcmVzZW50Ci0gIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgaWYoc3RyZWFtICYmIChzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCAhPSBDaXNQZW5kaW5nQ21kOjpOT05FIHx8Ci0gICAgICAgICAgICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCAhPSBBc2NzUGVuZGluZ0NtZDo6Tk9ORSkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogY2lzX3BlbmRpbmdfY21kICIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoc3RhdGljX2Nhc3QgPHVpbnQ4X3Q+KHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kKSk7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IGFzZV9wZW5kaW5nX2NtZCAiCi0gICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0IDx1aW50OF90PihzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCkpOwotICAgICAgcGVuZGluZ19jbWRzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmKHBlbmRpbmdfY21kcykgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogQVNDUy9DSVMgUGVuZGluZyBjb21tYW5kcyBsZWZ0IjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmKHN0cmVhbS0+YXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9TVFJFQU1JTkcgJiYKLSAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9PSBDaXNTdGF0ZTo6RVNUQUJMSVNIRUQpIHsKLSAgICAgIG51bV9zdHJtc19pbl9zdHJlYW1pbmcrKzsKLSAgICB9Ci0gIH0KLQotICBpZihpbnRfc3RybV90cmFja2Vycy0+c2l6ZSgpICE9IG51bV9zdHJtc19pbl9zdHJlYW1pbmcpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IE5vdCBhbGwgc3RyZWFtcyBtb3ZlZCB0byBzdHJlYW1pbmciOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgaWYgKCFzdHJlYW0pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICJzdHJlYW0gaXMgbnVsbCI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RyZWFtaW5nOwotICB9Ci0KLSAgLy8gYWxsIHN0cmVhbXMgYXJlIG1vdmVkIHRvIHN0cmVhbWluZyBzdGF0ZQotICBUcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RyZWFtaW5nKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6U3RhdGVTdGFydGluZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQkQgQWRkciA9ICIgPDwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogU3RhdGUgPSAiIDw8IEdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogRXZlbnQgPSAiIDw8IHRyYWNrZXJfLkdldEV2ZW50TmFtZShldmVudCk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQkFQX0RJU0NPTk5FQ1RfUkVRX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlRGlzY29ubmVjdChwX2RhdGEsIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0YXJ0aW5nKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQkFQX1NUT1BfUkVRX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlU3RvcChwX2RhdGEsIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0YXJ0aW5nKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQkFQX1NUUkVBTV9VUERBVEVfUkVRX0VWVDogewotICAgICAgQmFwU3RyZWFtVXBkYXRlICpldnRfZGF0YSA9IChCYXBTdHJlYW1VcGRhdGUgKikgcF9kYXRhOwotICAgICAgdHJhY2tlcl8uVXBkYXRlTWV0YVVwZGF0ZVN0cmVhbXMoJmV2dF9kYXRhLT51cGRhdGVfc3RyZWFtcyk7Ci0gICAgICBpZih0cmFja2VyXy5IYW5kbGVQYWNzQXVkaW9Db250ZXh0RXZlbnQoJnBhY3NfY29udGV4dHMpKSB7Ci0gICAgICAgIHRyYWNrZXJfLkhhbmRsZVN0cmVhbVVwZGF0ZShTdHJlYW1UcmFja2VyOjprU3RhdGVTdGFydGluZyk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFBBQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZVBhY3NDb25uZWN0aW9uRXZlbnQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgUEFDU19BVURJT19DT05URVhUX1JFU19FVlQ6IHsKLSAgICAgIC8vIGNoZWNrIGZvciBhbGwgc3RyZWFtIHN0YXJ0IHJlcXVlc3RzLCBzdHJlYW0gY29udGV4dHMgYXJlCi0gICAgICAvLyBwYXJ0IG9mIGF2YWlsYWJsZSBjb250ZXh0cwotICAgICAgcGFjc19jb250ZXh0cyA9ICooKFBhY3NBdmFpbGFibGVDb250ZXh0cyAqKSBwX2RhdGEpOwotICAgICAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgICAgIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+ICphbGxfdHJhY2tlcnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzXy5HZXRUcmFja2VyTGlzdCgpOwotICAgICAgYm9vbCBpZ25vcmVfZXZlbnQgPSBmYWxzZTsKLQotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gKnN0YXJ0X3N0cmVhbXMgPSB0cmFja2VyXy5HZXRTdHJlYW1zKCk7Ci0gICAgICB1aW50OF90IGNvbnRleHRzX3N1cHBvcnRlZCA9IDA7Ci0KLSAgICAgIC8vIGNoZWNrIGlmIHN1cHBvcnRlZCBhdWRpbyBjb250ZXh0cyBoYXMgcmVxdWlyZWQgY29udGV4dHMKLSAgICAgIGZvcihhdXRvIGl0ID0gc3RhcnRfc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gc3RhcnRfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgaWYoaXQtPmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICBpZihpdC0+YXVkaW9fY29udGV4dCAmIHBhY3NfY29udGV4dHMuYXZhaWxhYmxlX2NvbnRleHRzKSB7Ci0gICAgICAgICAgICBjb250ZXh0c19zdXBwb3J0ZWQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihpdC0+ZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgaWYoKHN0YXRpY19jYXN0PHVpbnQ2NF90PihpdC0+YXVkaW9fY29udGV4dCkgPDwgMTYpICYKLSAgICAgICAgICAgICAgIHBhY3NfY29udGV4dHMuYXZhaWxhYmxlX2NvbnRleHRzKSB7Ci0gICAgICAgICAgICBjb250ZXh0c19zdXBwb3J0ZWQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoY29udGV4dHNfc3VwcG9ydGVkICE9IHN0YXJ0X3N0cmVhbXMtPnNpemUoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAiOiBObyBNYXRjaGluZyBhdmFpbGFibGUgQ29udGV4dHMgZm91bmQiOwotICAgICAgICB0cmFja2VyXy5UcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGVkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoYXV0byBpdCA9IHN0YXJ0X3N0cmVhbXMtPmJlZ2luKCk7IGl0ICE9IHN0YXJ0X3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKCppdCk7Ci0gICAgICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgIGlkICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCk7IGlkKyspIHsKLSAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyICYmIHN0cmVhbS0+b3ZlcmFsbF9zdGF0ZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RhcnRpbmcpIHsKLSAgICAgICAgICAgIGlnbm9yZV9ldmVudCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoaWdub3JlX2V2ZW50KSBicmVhazsKLQotICAgICAgLy8gTm93IGNyZWF0ZSB0aGUgZ3JvdXBzCi0gICAgICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgICAgaWYgKCFzdHJlYW0pIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFFvc0NvbmZpZyAqcW9zX2NvbmZpZyA9ICZzdHJlYW0tPnFvc19jb25maWc7Ci0gICAgICAgIENpc0ludGVyZmFjZSAqY2lzX2ludGYgPSBzdHJtX21ncl8tPkdldENpc0ludGVyZmFjZSgpOwotICAgICAgICBJc29IY2lTdGF0dXMgc3RhdHVzID0gIGNpc19pbnRmLT5DcmVhdGVDaWcoc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvc19jb25maWctPmNpZ19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxb3NfY29uZmlnLT5jaXNfY29uZmlncyk7Ci0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChzdGF0aWNfY2FzdDx1aW50OF90PihzdGF0dXMpKTsKLSAgICAgICAgaWYoIHN0YXR1cyA9PSBJc29IY2lTdGF0dXM6OklTT19IQ0lfU1VDQ0VTUykgewotICAgICAgICAgIHN0cmVhbS0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OkNSRUFURUQ7Ci0gICAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6UkVBRFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IElzb0hjaVN0YXR1czo6SVNPX0hDSV9JTl9QUk9HUkVTUykgewotICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Q0lHX0NSRUFURV9JU1NVRUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIiBDSUcgQ3JlYXRpb24gRmFpbGVkIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdHJhY2tlcl8uQ2hlY2tBbmRTZW5kRW5hYmxlKCZpbnRfc3RybV90cmFja2Vyc18pOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIENJU19HUk9VUF9TVEFURV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZUNpZ1N0YXRlRXZlbnQoZXZlbnQsIHBfZGF0YSwgJmludF9zdHJtX3RyYWNrZXJzXyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVNDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlQXNjc0Nvbm5lY3Rpb25FdmVudChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBU0NTX0FTRV9TVEFURV9FVlQ6IHsKLSAgICAgIC8vIHRvIGhhbmRsZSByZW1vdGUgZHJpdmVuIG9wZXJhdGlvbnMKLSAgICAgIC8vIGNoZWNrIHRoZSBzdGF0ZSBhbmQgaWYgdGhlIHN0YXRlIGlzIEVuYWJsaW5nCi0gICAgICAvLyBwcm9jZWVkIHdpdGggY2lzIGNyZWF0aW9uCi0gICAgICBBc2NzU3RhdGUgKmFzY3MgPSAgKChBc2NzU3RhdGUgKikgcF9kYXRhKTsKLQotICAgICAgaWYoIXRyYWNrZXJfLlZhbGlkYXRlQXNlVXBkYXRlKHBfZGF0YSwgJmludF9zdHJtX3RyYWNrZXJzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UcmFja2VyOjprU3RhdGVTdGFydGluZykpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0KLSAgICAgIGlmIChhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfRU5BQkxJTkcpIHsKLSAgICAgICAgLy8gY2hhbmdlIHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIEVOQUJMSU5HCi0gICAgICAgIENpc0ludGVyZmFjZSAqY2lzX2ludGYgPSBzdHJtX21ncl8tPkdldENpc0ludGVyZmFjZSgpOwotCi0gICAgICAgIC8vIGNoZWNrIGZvciBFbmFibGluZyBub3RpZmljYXRpb24gaXMgcmVjZWl2ZWQgZm9yIGFsbCBBU0VzCi0gICAgICAgIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+ICphbGxfdHJhY2tlcnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzXy5HZXRUcmFja2VyTGlzdCgpOwotCi0gICAgICAgIHVpbnQ4X3QgbnVtX2VuYWJsaW5nX25vdGlmeSA9IDA7Ci0KLSAgICAgICAgZm9yIChhdXRvIGkgPSBhbGxfdHJhY2tlcnMtPmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLT5lbmQoKTtpKyspIHsKLSAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgICAgICBpZiAoIXN0cmVhbSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgInN0cmVhbSBpcyBudWxsIjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZihzdHJlYW0tPmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfRU5BQkxJTkcpIHsKLSAgICAgICAgICAgIG51bV9lbmFibGluZ19ub3RpZnkrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbnRfc3RybV90cmFja2Vyc18uc2l6ZSgpICE9IG51bV9lbmFibGluZ19ub3RpZnkpIHsKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIkVuYWJsaW5nIG5vdGlmaWNhdGlvbiBpcyBub3QgcmVjZWl2ZWQgZm9yIGFsbCBzdHJtcyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcyBpdCBzaW5nbGUgZ3JvdXAgdXNlIGNhc2VzLCBhbHdheXMgc2luZ2xlIGdyb3VwIHN0YXJ0IHJlcXVlc3QKLSAgICAgICAgLy8gd2lsbCBjb21lIHRvIEJBUCBsYXllcgotICAgICAgICBJc29IY2lTdGF0dXMgc3RhdHVzOwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjaXNfaWRzOwotICAgICAgICB1aW50OF90IGNpZ0lkOwotICAgICAgICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgICAgICAgIGlmIChzdGQ6OmZpbmQoY2lzX2lkcy5iZWdpbigpLCBjaXNfaWRzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jaXNfaWQpID09IGNpc19pZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIGNpc19pZHMucHVzaF9iYWNrKHN0cmVhbS0+Y2lzX2lkKTsKLSAgICAgICAgICAgIGNpZ0lkID0gc3RyZWFtLT5jaWdfaWQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGNpc19pZHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEdvaW5nIEZvciBDSVMgQ3JlYXRpb24gIjsKLSAgICAgICAgICBzdGF0dXMgPSBjaXNfaW50Zi0+Q3JlYXRlQ2lzKGNpZ0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzX2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgICAgICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJzdHJlYW0gaXMgbnVsbCI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RyZWFtLT5jaXNfcmV0cnlfY291bnQgPSAwOwotICAgICAgICAgIGlmKCBzdGF0dXMgPT0gSXNvSGNpU3RhdHVzOjpJU09fSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gQ2lzU3RhdGU6OkVTVEFCTElTSEVEOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IElzb0hjaVN0YXR1czo6SVNPX0hDSV9JTl9QUk9HUkVTUykgewotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIENJUyBjcmVhdGUgaXNzdWVkCi0gICAgICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6OkNJU19DUkVBVEVfSVNTVUVEOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIkNJUyBjcmVhdGUgRmFpbGVkIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgICB0cmFja2VyXy5DaGVja0FuZFVwZGF0ZVN0cmVhbWluZ1N0YXRlKCZpbnRfc3RybV90cmFja2Vyc18pOwotCi0gICAgICB9IGVsc2UgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1JFTEVBU0lORykgewotICAgICAgICB0cmFja2VyXy5IYW5kbGVSZW1vdGVEaXNjb25uZWN0KEFTQ1NfQVNFX1NUQVRFX0VWVCwgcF9kYXRhLCBTdGF0ZUlkKCkpOwotCi0gICAgICB9IGVsc2UgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX0RJU0FCTElORykgewotICAgICAgICB0cmFja2VyXy5IYW5kbGVSZW1vdGVTdG9wKEFTQ1NfQVNFX1NUQVRFX0VWVCwgcF9kYXRhLCBTdGF0ZUlkKCkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFTQ1NfQVNFX09QX0ZBSUxFRF9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZUFzZU9wRmFpbGVkRXZlbnQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBDSVNfU1RBVEVfRVZUOiB7Ci0gICAgICBDaXNTdHJlYW1TdGF0ZSAqZGF0YSA9IChDaXNTdHJlYW1TdGF0ZSAqKSBwX2RhdGE7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICAgICAgLy8gY2hlY2sgaWYgY3VycmVudCBzdHJlYW0gdHJhY2tlciBpcyBpbnRlcmVzdGVkIGluIHRoaXMgQ0lHIHVwZGF0ZQotICAgICAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gaW50X3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICBpbnRfc3RybV90cmFja2Vyc18uRmluZEJ5Q2lzSWQoZGF0YS0+Y2lnX2lkLCBkYXRhLT5jaXNfaWQpOwotICAgICAgaWYoaW50X3RyYWNrZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBOb3QgaW50ZW5kZWQgZm9yIHRoaXMgdHJhY2tlciI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZihkYXRhLT5zdGF0ZSA9PSBDaXNTdGF0ZTo6RVNUQUJMSVNIRUQpIHsKLSAgICAgICAgLy8gZmluZCBvdXQgdGhlIENJUyBpcyBiaWRpcmVjdGlvbmFsIG9yIGZyb20gYWlyIGRpcmVjdGlvbgotICAgICAgICAvLyBjaXMsIHNlbmQgUmVjZWl2ZXIgc3RhcnQgcmVhZHkgYXMgc2V0IHVwIGRhdGEgcGF0aAotICAgICAgICAvLyBpcyBhbHJlYWR5IGNvbXBsZXRlZCBkdXJpbmcgQ0lHIGNyZWF0aW9uCi0gICAgICAgIGlmKGRhdGEtPmRpcmVjdGlvbiAmIGNpczo6RElSX0ZST01fQUlSKSB7Ci0gICAgICAgICAgLy8gc2V0dXAgdGhlIGRhdGFwYXRoIGZvciBSWAotICAgICAgICAgIC8vIGZpbmQgb3V0IHRoZSBzdHJlYW0gaGVyZQotICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlDaXNJZEFuZERpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLT5jaWdfaWQsIGRhdGEtPmNpc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzOjpESVJfRlJPTV9BSVIpOwotICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIiBESVJfRlJPTV9BSVIgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoc3RhdGljX2Nhc3QgPHVpbnQ4X3Q+IChjaXM6OkRJUl9GUk9NX0FJUikpOwotCi0gICAgICAgICAgaWYoc3RyZWFtICYmIGludF9zdHJtX3RyYWNrZXJzXy5GaW5kQnlBc2VJZChzdHJlYW0tPmFzZV9pZCkpIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyAgPDwgIjogU3RyZWFtIERpcmVjdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0IDx1aW50OF90PiAoc3RyZWFtLT5kaXJlY3Rpb24pKTsKLQotICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiOiBTdHJlYW0gQVNFIElkICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoc3RhdGljX2Nhc3QgPHVpbnQ4X3Q+IChzdHJlYW0tPmFzZV9pZCkpOwotCi0gICAgICAgICAgICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotICAgICAgICAgICAgQXNlU3RhcnRSZWFkeU9wIHN0YXJ0X3JlYWR5X29wID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc2VfaWQgPSBzdHJlYW0tPmFzZV9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVN0YXJ0UmVhZHlPcD4gYXNlX29wczsKLSAgICAgICAgICAgIGFzZV9vcHMucHVzaF9iYWNrKHN0YXJ0X3JlYWR5X29wKTsKLSAgICAgICAgICAgIGFzY3NfY2xpZW50LT5TdGFydFJlYWR5KEFTQ1NfQ0xJRU5UX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBhc2Vfb3BzKTsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gZGF0YS0+c3RhdGU7Ci0gICAgICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpTVEFSVF9SRUFEWV9JU1NVRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoZGF0YS0+ZGlyZWN0aW9uICYgY2lzOjpESVJfVE9fQUlSKSB7Ci0gICAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUNpc0lkQW5kRGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmNpZ19pZCwgZGF0YS0+Y2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXM6OkRJUl9UT19BSVIpOwotICAgICAgICAgIGlmKHN0cmVhbSkgewotICAgICAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBkYXRhLT5zdGF0ZTsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFja2VyXy5DaGVja0FuZFVwZGF0ZVN0cmVhbWluZ1N0YXRlKCZpbnRfc3RybV90cmFja2Vyc18pOwotCi0gICAgICB9IGVsc2UgaWYgKGRhdGEtPnN0YXRlID09IENpc1N0YXRlOjpSRUFEWSkgeyAvLyBDSVMgY3JlYXRpb24gZmFpbGVkCi0gICAgICAgIENpc0ludGVyZmFjZSAqY2lzX2ludGYgPSBzdHJtX21ncl8tPkdldENpc0ludGVyZmFjZSgpOwotICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5Q2lzSWRBbmREaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmNpZ19pZCwgZGF0YS0+Y2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+ZGlyZWN0aW9uKTsKLSAgICAgICAgaWYoc3RyZWFtICYmIHN0cmVhbS0+Y2lzX3JldHJ5X2NvdW50IDwgMikgewotICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNpc0lkcyA9IHtzdHJlYW0tPmNpc19pZH07Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBHb2luZyBGb3IgUmV0cmlhbCBvZiBDSVMgQ3JlYXRpb24gIjsKLSAgICAgICAgICBJc29IY2lTdGF0dXMgc3RhdHVzID0gIGNpc19pbnRmLT5DcmVhdGVDaXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lzSWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpKTsKLQotICAgICAgICAgIGlmKCBzdGF0dXMgPT0gSXNvSGNpU3RhdHVzOjpJU09fSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gQ2lzU3RhdGU6OkVTVEFCTElTSEVEOwotICAgICAgICAgICAgdHJhY2tlcl8uQ2hlY2tBbmRVcGRhdGVTdHJlYW1pbmdTdGF0ZSgmaW50X3N0cm1fdHJhY2tlcnNfKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBJc29IY2lTdGF0dXM6OklTT19IQ0lfSU5fUFJPR1JFU1MpIHsKLSAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBDSVMgY3JlYXRlIGlzc3VlZAotICAgICAgICAgICAgc3RyZWFtLT5jaXNfcmV0cnlfY291bnQrKzsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Q0lTX0NSRUFURV9JU1NVRUQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3JldHJ5X2NvdW50ID0gMDsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIkNJUyBjcmVhdGUgRmFpbGVkIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYoc3RyZWFtKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPmNpc19yZXRyeV9jb3VudCA9IDA7Ci0gICAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsgIC8vIHRyYW5zaWVudCBzdGF0ZXMKLSAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUNpc0lkQW5kRGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLT5jaWdfaWQsIGRhdGEtPmNpc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmRpcmVjdGlvbik7Ci0gICAgICAgIGlmKHN0cmVhbSkgc3RyZWFtLT5jaXNfc3RhdGUgPSBkYXRhLT5zdGF0ZTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCQVBfVElNRV9PVVRfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5PblRpbWVvdXQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbi1oYW5kbGVkIGV2ZW50OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdHJhY2tlcl8uR2V0RXZlbnROYW1lKGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlVXBkYXRpbmc6Ok9uRW50ZXIoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBTdHJlYW1UcmFja2VyIFN0YXRlOiAiIDw8IEdldFN0YXRlKCk7Ci0KLSAgVWNhc3RDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcyA9IHN0cm1fbWdyXy0+R2V0VWNsaWVudENiYWNrcygpOwotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RybXM7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVVwZGF0ZT4gKnVwZGF0ZV9zdHJlYW1zID0gdHJhY2tlcl8uR2V0TWV0YVVwZGF0ZVN0cmVhbXMoKTsKLSAgdWludDhfdCBudW1fYXNlcyA9IDA7Ci0KLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBTdGFydCBTdHJlYW1zIFNpemUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHVwZGF0ZV9zdHJlYW1zLT5zaXplKCk7Ci0KLSAgU3RyZWFtQ29udHJvbFR5cGUgY29udHJvbF90eXBlID0gdHJhY2tlcl8uR2V0Q29udHJvbFR5cGUoKTsKLQotICBpZihjb250cm9sX3R5cGUgIT0gU3RyZWFtQ29udHJvbFR5cGU6OlVwZGF0ZVN0cmVhbSkgcmV0dXJuOwotCi0gIGZvciAoYXV0byBpdCA9IHVwZGF0ZV9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSB1cGRhdGVfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICBTdHJlYW1TdGF0ZUluZm8gc3RhdGU7Ci0gICAgbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7Ci0gICAgc3RhdGUuc3RyZWFtX3R5cGUgPSBpdC0+c3RyZWFtX3R5cGU7Ci0gICAgc3RhdGUuc3RyZWFtX3N0YXRlID0gU3RyZWFtU3RhdGU6OlVQREFUSU5HOwotICAgIHN0cm1zLnB1c2hfYmFjayhzdGF0ZSk7Ci0gICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoaXQtPnN0cmVhbV90eXBlKTsKLSAgICBjb250ZXh0LT5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6VVBEQVRJTkc7Ci0gICAgZm9yIChhdXRvIGlkID0gY29udGV4dC0+c3RyZWFtX2lkcy5iZWdpbigpOwotICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICBpbnRfc3RybV90cmFja2Vyc18uRmluZE9yQWRkQnl0cmFja2VyVHlwZShpdC0+c3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLT5hc2VfaWQsIGlkLT5jaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLT5jaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmNvZGVjX2NvbmZpZywgY29udGV4dC0+cW9zX2NvbmZpZyk7Ci0gICAgfQotICAgIG51bV9hc2VzICs9IGNvbnRleHQtPnN0cmVhbV9pZHMuc2l6ZSgpOwotICB9Ci0gIGNhbGxiYWNrcy0+T25TdHJlYW1TdGF0ZShzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgc3RybXMpOwotCi0gIHVpbnQ2NF90IHRvdXQgPSBudW1fYXNlcyAqCi0gICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oVGltZW91dFZhbDo6VXBkYXRpbmdUaW1lb3V0KSk7Ci0gIGlmKCF0b3V0KSB7Ci0gICAgdG91dCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihNYXhUaW1lb3V0VmFsOjpVcGRhdGluZ1RpbWVvdXQpOwotICB9Ci0gIFRpbWVvdXRSZWFzb24gcmVhc29uID0gVGltZW91dFJlYXNvbjo6U1RBVEVfVFJBTlNJVElPTjsKLSAgc3RhdGVfdHJhbnNpdGlvbl90aW1lciA9IHRyYWNrZXJfLlNldFRpbWVyKCJTdGF0ZVVwZGF0aW5nVGltZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVvdXQsIHJlYXNvbiwgdG91dCk7Ci0gIGlmIChzdGF0ZV90cmFuc2l0aW9uX3RpbWVyID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAiOiBTdGF0ZVVwZGF0aW5nOiBBbGFybSBub3QgYWxsb2NhdGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgU3RyZWFtVHJhY2tlcjo6U3RhdGVVcGRhdGluZzo6T25FeGl0KCkgewotICB0cmFja2VyXy5DbGVhclRpbWVyKHN0YXRlX3RyYW5zaXRpb25fdGltZXIsICJTdGF0ZVVwZGF0aW5nVGltZXIiKTsKLX0KLQotYm9vbCBTdHJlYW1UcmFja2VyOjpTdGF0ZVVwZGF0aW5nOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICBMT0coSU5GTykgPDxfX2Z1bmNfXyAgPDwiOiBCRCBBZGRyID0gIiA8PCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwiOiBTdGF0ZSA9ICIgPDwgR2V0U3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwiOiBFdmVudCA9ICIgPDwgdHJhY2tlcl8uR2V0RXZlbnROYW1lKGV2ZW50KTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCQVBfRElTQ09OTkVDVF9SRVFfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVEaXNjb25uZWN0KHBfZGF0YSwgU3RyZWFtVHJhY2tlcjo6a1N0YXRlVXBkYXRpbmcpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCQVBfU1RPUF9SRVFfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVTdG9wKHBfZGF0YSwgU3RyZWFtVHJhY2tlcjo6a1N0YXRlVXBkYXRpbmcpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBQQUNTX0NPTk5FQ1RJT05fU1RBVEVfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVQYWNzQ29ubmVjdGlvbkV2ZW50KHBfZGF0YSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFTQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZUFzY3NDb25uZWN0aW9uRXZlbnQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgUEFDU19BVURJT19DT05URVhUX1JFU19FVlQ6IHsKLSAgICAgIC8vIGNoZWNrIGZvciBhbGwgc3RyZWFtIHN0YXJ0IHJlcXVlc3RzLCBzdHJlYW0gY29udGV4dHMgYXJlCi0gICAgICAvLyBwYXJ0IG9mIGF2YWlsYWJsZSBjb250ZXh0cwotICAgICAgUGFjc0F2YWlsYWJsZUNvbnRleHRzICpwYWNzX2NvbnRleHRzID0gKFBhY3NBdmFpbGFibGVDb250ZXh0cyAqKSBwX2RhdGE7Ci0gICAgICBpZighdHJhY2tlcl8uSGFuZGxlUGFjc0F1ZGlvQ29udGV4dEV2ZW50KHBhY3NfY29udGV4dHMpIHx8Ci0gICAgICAgICAhdHJhY2tlcl8uSGFuZGxlU3RyZWFtVXBkYXRlKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVVwZGF0aW5nKSkgewotICAgICAgICB0cmFja2VyXy5UcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RyZWFtaW5nKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQVNDU19BU0VfU1RBVEVfRVZUOiB7Ci0gICAgICBBc2NzU3RhdGUgKmFzY3MgPSAgKChBc2NzU3RhdGUgKikgcF9kYXRhKTsKLSAgICAgIGlmKCF0cmFja2VyXy5WYWxpZGF0ZUFzZVVwZGF0ZShwX2RhdGEsICZpbnRfc3RybV90cmFja2Vyc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlVXBkYXRpbmcpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1NUUkVBTUlORykgewotICAgICAgICB0cmFja2VyXy5DaGVja0FuZFVwZGF0ZVN0cmVhbWluZ1N0YXRlKCZpbnRfc3RybV90cmFja2Vyc18pOwotICAgICAgfSBlbHNlIGlmKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9SRUxFQVNJTkcpIHsKLSAgICAgICAgdHJhY2tlcl8uSGFuZGxlUmVtb3RlRGlzY29ubmVjdChBU0NTX0FTRV9TVEFURV9FVlQsIHBfZGF0YSwgU3RhdGVJZCgpKTsKLSAgICAgIH0gZWxzZSBpZihhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfRElTQUJMSU5HKSB7Ci0gICAgICAgIHRyYWNrZXJfLkhhbmRsZVJlbW90ZVN0b3AoQVNDU19BU0VfU1RBVEVfRVZULCBwX2RhdGEsIFN0YXRlSWQoKSk7Ci0gICAgICB9IGVsc2UgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKSB7Ci0gICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIENJUyBpcyBsb3N0IGFuZCBkZXRlY3RlZCBvbiByZW1vdGUgc2lkZQotICAgICAgICAvLyBmaXJzdCBzbyBpdCB3aWxsIGltbWVkaWF0ZWx5IHRyYW5zaXRpb24gdG8gUU9TIGNvbmZpZ3VyZWQuCi0gICAgICAgIHRyYWNrZXJfLkhhbmRsZUFicnVwdFN0b3AoQVNDU19BU0VfU1RBVEVfRVZULCBwX2RhdGEpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBDSVNfU1RBVEVfRVZUOiB7Ci0gICAgICAvLyBoYW5kbGUgc3VkZGVuIENJUyBEaXNjb25uZWN0aW9uCi0gICAgICB0cmFja2VyXy5IYW5kbGVDaXNFdmVudHNJblN0cmVhbWluZyhwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbi1oYW5kbGVkIGV2ZW50OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdHJhY2tlcl8uR2V0RXZlbnROYW1lKGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlU3RyZWFtaW5nOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU3RyZWFtVHJhY2tlciBTdGF0ZTogIiA8PCBHZXRTdGF0ZSgpOwotCi0gIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MgPSBzdHJtX21ncl8tPkdldFVjbGllbnRDYmFja3MoKTsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1TdGF0ZUluZm8+IHN0cm1zOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RhcnRfc3RyZWFtcyA9IHRyYWNrZXJfLkdldFN0cmVhbXMoKTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtVXBkYXRlPiAqdXBkYXRlX3N0cmVhbXMgPSB0cmFja2VyXy5HZXRNZXRhVXBkYXRlU3RyZWFtcygpOwotICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IFN0YXJ0IFN0cmVhbXMgU2l6ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhcnRfc3RyZWFtcy0+c2l6ZSgpOwotCi0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogVXBkYXRlIFN0cmVhbXMgU2l6ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdXBkYXRlX3N0cmVhbXMtPnNpemUoKTsKLQotICBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUgPSB0cmFja2VyXy5HZXRDb250cm9sVHlwZSgpOwotCi0gIGlmKGNvbnRyb2xfdHlwZSA9PSBTdHJlYW1Db250cm9sVHlwZTo6U3RhcnQpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBzdGFydF9zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBzdGFydF9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgU3RyZWFtU3RhdGVJbmZvIHN0YXRlOwotICAgICAgbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7Ci0gICAgICBzdGF0ZS5zdHJlYW1fdHlwZSA9ICppdDsKLSAgICAgIHN0YXRlLnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpTVFJFQU1JTkc7Ci0gICAgICBzdHJtcy5wdXNoX2JhY2soc3RhdGUpOwotICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLSAgICAgIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpTVFJFQU1JTkc7Ci0gICAgfQotICB9IGVsc2UgaWYoY29udHJvbF90eXBlID09IFN0cmVhbUNvbnRyb2xUeXBlOjpVcGRhdGVTdHJlYW0pIHsKLSAgICBmb3IgKGF1dG8gaXQgPSB1cGRhdGVfc3RyZWFtcy0+YmVnaW4oKTsgaXQgIT0gdXBkYXRlX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICBTdHJlYW1TdGF0ZUluZm8gc3RhdGU7Ci0gICAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLSAgICAgIHN0YXRlLnN0cmVhbV90eXBlID0gaXQtPnN0cmVhbV90eXBlOwotICAgICAgc3RhdGUuc3RyZWFtX3N0YXRlID0gU3RyZWFtU3RhdGU6OlNUUkVBTUlORzsKLSAgICAgIHN0cm1zLnB1c2hfYmFjayhzdGF0ZSk7Ci0gICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotICAgICAgY29udGV4dC0+c3RyZWFtX3N0YXRlID0gU3RyZWFtU3RhdGU6OlNUUkVBTUlORzsKLSAgICB9Ci0gIH0KLSAgaWYoc3RybXMuc2l6ZSgpKSB7Ci0gICAgY2FsbGJhY2tzLT5PblN0cmVhbVN0YXRlKHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBzdHJtcyk7Ci0gIH0KLX0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpTdGF0ZVN0cmVhbWluZzo6T25FeGl0KCkgewotCi19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6U3RhdGVTdHJlYW1pbmc6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSB7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IEJEIEFkZHIgPSAiIDw8IHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IFN0YXRlID0gIiA8PCBHZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IEV2ZW50ID0gIiA8PCB0cmFja2VyXy5HZXRFdmVudE5hbWUoZXZlbnQpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJBUF9ESVNDT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZURpc2Nvbm5lY3QocF9kYXRhLCBTdHJlYW1UcmFja2VyOjprU3RhdGVTdHJlYW1pbmcpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCQVBfU1RPUF9SRVFfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVTdG9wKHBfZGF0YSwgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RyZWFtaW5nKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQkFQX1NUUkVBTV9VUERBVEVfUkVRX0VWVDogewotICAgICAgUGFjc0NsaWVudCAqcGFjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldFBhY3NDbGllbnQoKTsKLSAgICAgIHVpbnQxNl90IHBhY3NfY2xpZW50X2lkID0gc3RybV9tZ3JfLT5HZXRQYWNzQ2xpZW50SWQoKTsKLSAgICAgIEJhcFN0cmVhbVVwZGF0ZSAqZXZ0X2RhdGEgPSAoQmFwU3RyZWFtVXBkYXRlICopIHBfZGF0YTsKLSAgICAgIHRyYWNrZXJfLlVwZGF0ZUNvbnRyb2xUeXBlKFN0cmVhbUNvbnRyb2xUeXBlOjpVcGRhdGVTdHJlYW0pOwotICAgICAgdHJhY2tlcl8uVXBkYXRlTWV0YVVwZGF0ZVN0cmVhbXMoJmV2dF9kYXRhLT51cGRhdGVfc3RyZWFtcyk7Ci0gICAgICBwYWNzX2NsaWVudC0+R2V0QXVkaW9BdmFpbGFiaWxpdHkocGFjc19jbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCkpOwotICAgICAgdHJhY2tlcl8uVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVVwZGF0aW5nKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlUGFjc0Nvbm5lY3Rpb25FdmVudChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBU0NTX0NPTk5FQ1RJT05fU1RBVEVfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVBc2NzQ29ubmVjdGlvbkV2ZW50KHBfZGF0YSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFTQ1NfQVNFX1NUQVRFX0VWVDogewotICAgICAgQXNjc1N0YXRlICphc2NzID0gICgoQXNjc1N0YXRlICopIHBfZGF0YSk7Ci0gICAgICB1aW50OF90IGFzZV9pZCA9IGFzY3MtPmFzZV9wYXJhbXMuYXNlX2lkOwotICAgICAgLy8gZmluZCBvdXQgdGhlIHN0cmVhbSBmb3IgdGhlIGdpdmVuIGFzZSBpZAotICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChhc2VfaWQpOwotICAgICAgaWYgKHN0cmVhbSkgewotICAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSA9IGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlOwotICAgICAgICBzdHJlYW0tPmFzZV9wYXJhbXMgPSBhc2NzLT5hc2VfcGFyYW1zOwotICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICBpZihhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUkVMRUFTSU5HKSB7Ci0gICAgICAgICAgdHJhY2tlcl8uSGFuZGxlUmVtb3RlRGlzY29ubmVjdChBU0NTX0FTRV9TVEFURV9FVlQsIHBfZGF0YSwgU3RhdGVJZCgpKTsKLSAgICAgICAgfSBlbHNlIGlmKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9ESVNBQkxJTkcpIHsKLSAgICAgICAgICB0cmFja2VyXy5IYW5kbGVSZW1vdGVTdG9wKEFTQ1NfQVNFX1NUQVRFX0VWVCwgcF9kYXRhLCBTdGF0ZUlkKCkpOwotICAgICAgICB9IGVsc2UgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX1FPU19DT05GSUdVUkVEKXsKLSAgICAgICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBDSVMgaXMgbG9zdCBhbmQgZGV0ZWN0ZWQgb24gcmVtb3RlIHNpZGUKLSAgICAgICAgICAvLyBmaXJzdCBzbyBpdCB3aWxsIGltbWVkaWF0ZWx5IHRyYW5zaXRpb24gdG8gUU9TIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgdHJhY2tlcl8uSGFuZGxlQWJydXB0U3RvcChBU0NTX0FTRV9TVEFURV9FVlQsIHBfZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQ0lTX1NUQVRFX0VWVDogewotICAgICAgLy8gaGFuZGxlIHN1ZGRlbiBDSVMgRGlzY29ubmVjdGlvbgotICAgICAgdHJhY2tlcl8uSGFuZGxlQ2lzRXZlbnRzSW5TdHJlYW1pbmcocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogVW4taGFuZGxlZCBldmVudDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRyYWNrZXJfLkdldEV2ZW50TmFtZShldmVudCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpTdGF0ZVN0b3BwaW5nOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU3RyZWFtVHJhY2tlciBTdGF0ZTogIiA8PCBHZXRTdGF0ZSgpOwotCi0gIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MgPSBzdHJtX21ncl8tPkdldFVjbGllbnRDYmFja3MoKTsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1TdGF0ZUluZm8+IHN0cm1zOwotICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAqc3RvcF9zdHJlYW1zID0gdHJhY2tlcl8uR2V0U3RyZWFtcygpOwotICB1aW50OF90IG51bV9hc2VzID0gMDsKLQotICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IFN0b3AgU3RyZWFtcyBTaXplIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0b3Bfc3RyZWFtcy0+c2l6ZSgpOwotICBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUgPSB0cmFja2VyXy5HZXRDb250cm9sVHlwZSgpOwotCi0gIGlmKGNvbnRyb2xfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6U3RvcCkgcmV0dXJuOwotCi0gIGZvciAoYXV0byBpdCA9IHN0b3Bfc3RyZWFtcy0+YmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gc3RvcF9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgIFN0cmVhbVN0YXRlSW5mbyBzdGF0ZTsKLSAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLSAgICBzdGF0ZS5zdHJlYW1fdHlwZSA9ICppdDsKLSAgICBzdGF0ZS5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6U1RPUFBJTkc7Ci0gICAgc3RybXMucHVzaF9iYWNrKHN0YXRlKTsKLSAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgqaXQpOwotICAgIGNvbnRleHQtPnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpTVE9QUElORzsKLQotICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgaWQgIT0gY29udGV4dC0+c3RyZWFtX2lkcy5lbmQoKTsgaWQrKykgewotICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRPckFkZEJ5dHJhY2tlclR5cGUoKml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+YXNlX2lkLCBpZC0+Y2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+Y2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5jb2RlY19jb25maWcsIGNvbnRleHQtPnFvc19jb25maWcpOwotICAgIH0KLSAgICBudW1fYXNlcyArPSBjb250ZXh0LT5zdHJlYW1faWRzLnNpemUoKTsKLSAgfQotICBjYWxsYmFja3MtPk9uU3RyZWFtU3RhdGUoc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksIHN0cm1zKTsKLQotICB1aW50NjRfdCB0b3V0ID0gbnVtX2FzZXMgKgotICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KFRpbWVvdXRWYWw6OlN0b3BwaW5nVGltZW91dCkpOwotICBpZighdG91dCkgewotICAgIHRvdXQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oTWF4VGltZW91dFZhbDo6U3RvcHBpbmdUaW1lb3V0KTsKLSAgfQotCi0gIFRpbWVvdXRSZWFzb24gcmVhc29uID0gVGltZW91dFJlYXNvbjo6U1RBVEVfVFJBTlNJVElPTjsKLSAgc3RhdGVfdHJhbnNpdGlvbl90aW1lciA9IHRyYWNrZXJfLlNldFRpbWVyKCJTdGF0ZVN0b3BwaW5nVGltZXIiLAotICAgICAgICAgICAgICAgICZ0aW1lb3V0LCByZWFzb24sIHRvdXQpOwotICBpZiAoc3RhdGVfdHJhbnNpdGlvbl90aW1lciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIjogU3RhdGVTdG9wcGluZzogQWxhcm0gbm90IGFsbG9jYXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlU3RvcHBpbmc6Ok9uRXhpdCgpIHsKLSAgdHJhY2tlcl8uQ2xlYXJUaW1lcihzdGF0ZV90cmFuc2l0aW9uX3RpbWVyLCAiU3RhdGVTdG9wcGluZ1RpbWVyIik7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6U3RhdGVTdG9wcGluZzo6VGVybWluYXRlQ2lzQW5kQ2lnKFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSkgewotCi0gIENpc0ludGVyZmFjZSAqY2lzX2ludGYgPSBzdHJtX21ncl8tPkdldENpc0ludGVyZmFjZSgpOwotICB1aW50OF90IG51bV9zdHJtc19pbl9xb3NfY29uZmlndXJlZCA9IDA7Ci0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gYWxsX3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICBpbnRfc3RybV90cmFja2Vyc18uRmluZEJ5Q2lnSWRBbmREaXIoc3RyZWFtLT5jaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+ZGlyZWN0aW9uKTsKLQotICBmb3IoYXV0byBpID0gYWxsX3RyYWNrZXJzLmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLmVuZCgpO2krKykgewotICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmKHN0cmVhbS0+YXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9RT1NfQ09ORklHVVJFRCkgewotICAgICAgbnVtX3N0cm1zX2luX3Fvc19jb25maWd1cmVkKys7Ci0gICAgfQotICB9Ci0KLSAgaWYoYWxsX3RyYWNrZXJzLnNpemUoKSAhPSBudW1fc3RybXNfaW5fcW9zX2NvbmZpZ3VyZWQpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICJOb3QgQWxsIFN0cmVhbXMgTW92ZWQgdG8gUU9TIENvbmZpZ3VyZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLmVuZCgpO2krKykgewotICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmKHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID09IENpc1BlbmRpbmdDbWQ6Ok5PTkUgJiYKLSAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9PSBDaXNTdGF0ZTo6RVNUQUJMSVNIRUQgJiYKLSAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIENJUyBEaXNjb25uZWN0ICI7Ci0gICAgICBJc29IY2lTdGF0dXMgc3RhdHVzID0gY2lzX2ludGYtPkRpc2Nvbm5lY3RDaXMoc3RyZWFtLT5jaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5kaXJlY3Rpb24pOwotICAgICAgaWYoc3RhdHVzID09IElzb0hjaVN0YXR1czo6SVNPX0hDSV9TVUNDRVNTKSB7Ci0gICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6UkVBRFk7Ci0gICAgICB9IGVsc2UgaWYoc3RhdHVzID09IElzb0hjaVN0YXR1czo6SVNPX0hDSV9JTl9QUk9HUkVTUykgewotICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6OkNJU19ERVNUUk9ZX0lTU1VFRDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogQ0lTIERpc2Nvbm5lY3QgRmFpbGVkIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihzdHJlYW0tPmNpc19zdGF0ZSA9PSBDaXNTdGF0ZTo6UkVBRFkpIHsKLSAgICAgIGlmKHN0cmVhbS0+Y2lnX3N0YXRlID09IENpZ1N0YXRlOjpDUkVBVEVEICYmCi0gICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9PSBDaXNQZW5kaW5nQ21kOjpOT05FKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIENJRyBSZW1vdmFsIjsKLSAgICAgICAgSXNvSGNpU3RhdHVzIHN0YXR1cyA9IGNpc19pbnRmLT5SZW1vdmVDaWcoc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2lnX2lkKTsKLSAgICAgICAgaWYoIHN0YXR1cyA9PSBJc29IY2lTdGF0dXM6OklTT19IQ0lfU1VDQ0VTUykgewotICAgICAgICAgIHN0cmVhbS0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OklOVkFMSUQ7Ci0gICAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6SU5WQUxJRDsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gSXNvSGNpU3RhdHVzOjpJU09fSENJX0lOX1BST0dSRVNTKSB7Ci0gICAgICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpDSUdfUkVNT1ZFX0lTU1VFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IENJRyByZW1vdmFsIEZhaWxlZCI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RyZWFtVHJhY2tlcjo6U3RhdGVTdG9wcGluZzo6Q2hlY2tBbmRVcGRhdGVTdG9wcGVkU3RhdGUoKSB7Ci0gIC8vICB0byBjaGVjayBmb3IgYWxsIGludGVybmFsIHRyYWNrZXJzIGFyZSBtb3ZlZCB0bwotICAvLyBjaXMgZGVzdHJveWVkIHN0YXRlIHRoZW4gdXBkYXRlIHRoZSBjYWxsYmFjawotICB1aW50OF90IG51bV9zdHJtc19pbl9zdG9wcGluZyA9IDA7Ci0gIGJvb2wgcGVuZGluZ19jbWRzID0gZmFsc2U7Ci0KLSAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gKmFsbF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkdldFRyYWNrZXJMaXN0KCk7Ci0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0KLSAgLy8gY2hlY2sgaWYgYW55IHBlbmRpbmcgY29tbWFuZHMgYXJlIHByZXNlbnQKLSAgZm9yIChhdXRvIGkgPSBhbGxfdHJhY2tlcnMtPmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLT5lbmQoKTtpKyspIHsKLSAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICBpZihzdHJlYW0gJiYgKHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kICE9IENpc1BlbmRpbmdDbWQ6Ok5PTkUgfHwKLSAgICAgICAgICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kICE9IEFzY3NQZW5kaW5nQ21kOjpOT05FKSkgewotICAgICAgcGVuZGluZ19jbWRzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmKHBlbmRpbmdfY21kcykgcmV0dXJuIGZhbHNlOwotCi0gIGZvcihhdXRvIGkgPSBhbGxfdHJhY2tlcnMtPmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLT5lbmQoKTtpKyspIHsKLSAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICBpZihzdHJlYW0gJiYgKHN0cmVhbS0+Y2lnX3N0YXRlID09IENpZ1N0YXRlOjpJRExFIHx8Ci0gICAgICAgc3RyZWFtLT5jaWdfc3RhdGUgPT0gQ2lnU3RhdGU6OklOVkFMSUQpICYmCi0gICAgICAgKHN0cmVhbS0+Y2lzX3N0YXRlID09IENpc1N0YXRlOjpSRUFEWSB8fAotICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9PSBDaXNTdGF0ZTo6SU5WQUxJRCkgJiYKLSAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUU9TX0NPTkZJR1VSRUQpIHsKLSAgICAgIG51bV9zdHJtc19pbl9zdG9wcGluZysrOwotICAgIH0KLSAgfQotCi0gIGlmKGludF9zdHJtX3RyYWNrZXJzXy5zaXplKCkgIT0gbnVtX3N0cm1zX2luX3N0b3BwaW5nKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiTm90IEFsbCBTdHJlYW1zIE1vdmVkIHRvIFN0b3BwZWQgU3RhdGUiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoYXV0byBpID0gYWxsX3RyYWNrZXJzLT5iZWdpbigpOyBpICE9IGFsbF90cmFja2Vycy0+ZW5kKCk7aSsrKSB7Ci0gICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgaWYgKCFzdHJlYW0pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICJzdHJlYW0gaXMgbnVsbCI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGVkOwotICB9Ci0KLSAgdHJhY2tlcl8uVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0YXRlU3RvcHBpbmc6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSB7Ci0gIExPRyhJTkZPKSA8PF9fZnVuY19fICA8PCI6IEJEIEFkZHIgPSAiIDw8IHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IFN0YXRlID0gIiA8PCBHZXRTdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCI6IEV2ZW50ID0gIiA8PCB0cmFja2VyXy5HZXRFdmVudE5hbWUoZXZlbnQpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJBUF9ESVNDT05ORUNUX1JFUV9FVlQ6ewotICAgICAgdHJhY2tlcl8uSGFuZGxlRGlzY29ubmVjdChwX2RhdGEsIFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVN0b3BwaW5nKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlUGFjc0Nvbm5lY3Rpb25FdmVudChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBU0NTX0NPTk5FQ1RJT05fU1RBVEVfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVBc2NzQ29ubmVjdGlvbkV2ZW50KHBfZGF0YSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFTQ1NfQVNFX1NUQVRFX0VWVDogewotICAgICAgLy8gdG8gaGFuZGxlIHJlbW90ZSBkcml2ZW4gb3BlcmF0aW9ucwotICAgICAgQXNjc1N0YXRlICphc2NzID0gICgoQXNjc1N0YXRlICopIHBfZGF0YSk7Ci0KLSAgICAgIGlmKCF0cmFja2VyXy5WYWxpZGF0ZUFzZVVwZGF0ZShwX2RhdGEsICZpbnRfc3RybV90cmFja2Vyc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlU3RvcHBpbmcpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBmaW5kIG91dCB0aGUgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gYXNlIGlkCi0gICAgICB1aW50OF90IGFzZV9pZCA9IGFzY3MtPmFzZV9wYXJhbXMuYXNlX2lkOwotICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLQotICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKGFzZV9pZCk7Ci0gICAgICBpZiAoIXN0cmVhbSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYoYXNjcy0+YXNlX3BhcmFtcy5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX0RJU0FCTElORykgewotICAgICAgICBpZihzdHJlYW0tPmRpcmVjdGlvbiAmIGNpczo6RElSX0ZST01fQUlSKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiIFNlbmRpbmcgU3RvcCBSZWFkeSAiOwotICAgICAgICAgIEFzY3NDbGllbnQgKmFzY3NfY2xpZW50ID0gc3RybV9tZ3JfLT5HZXRBc2NzQ2xpZW50KCk7Ci0gICAgICAgICAgQXNlU3RvcFJlYWR5T3Agc3RvcF9yZWFkeV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzZV9pZCA9IHN0cmVhbS0+YXNlX2lkCi0gICAgICAgICAgfTsKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VTdG9wUmVhZHlPcD4gYXNlX29wczsKLSAgICAgICAgICBhc2Vfb3BzLnB1c2hfYmFjayhzdG9wX3JlYWR5X29wKTsKLSAgICAgICAgICBhc2NzX2NsaWVudC0+U3RvcFJlYWR5KEFTQ1NfQ0xJRU5UX0lELAotICAgICAgICAgICAgICAgICAgICAgICBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgYXNlX29wcyk7Ci0gICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6U1RPUF9SRUFEWV9JU1NVRUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIjogSW52YWxpZCBTdGF0ZSB0cmFuc2l0aW9uIHRvIERpc2FibGluZyIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEFTRSBJZCA9ICIgPDwgbG9naGV4KGFzZV9pZCk7Ci0gICAgICAgIH0KLQotICAgICAgfSBlbHNlIGlmKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9RT1NfQ09ORklHVVJFRCkgewotCi0gICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgIC8vIHN0b3BwZWQgc3RhdGUgdGhlbiBpc3N1ZSBDSVMgZGlzY29ubmVjdAotICAgICAgICBUZXJtaW5hdGVDaXNBbmRDaWcoc3RyZWFtKTsKLSAgICAgICAgQ2hlY2tBbmRVcGRhdGVTdG9wcGVkU3RhdGUoKTsKLQotICAgICAgfSBlbHNlIGlmKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9SRUxFQVNJTkcpIHsKLSAgICAgICAgdHJhY2tlcl8uSGFuZGxlUmVtb3RlRGlzY29ubmVjdChBU0NTX0FTRV9TVEFURV9FVlQsIHBfZGF0YSwgU3RhdGVJZCgpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBU0NTX0FTRV9PUF9GQUlMRURfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVBc2VPcEZhaWxlZEV2ZW50KHBfZGF0YSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQ0lTX1NUQVRFX0VWVDogewotICAgICAgQ2lzU3RyZWFtU3RhdGUgKmRhdGEgPSAoQ2lzU3RyZWFtU3RhdGUgKikgcF9kYXRhOwotICAgICAgQ2lzSW50ZXJmYWNlICpjaXNfaW50ZiA9IHN0cm1fbWdyXy0+R2V0Q2lzSW50ZXJmYWNlKCk7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICAgICAgLy8gY2hlY2sgaWYgY3VycmVudCBzdHJlYW0gdHJhY2tlciBpcyBpbnRlcmVzdGVkIGluIHRoaXMgQ0lHIHVwZGF0ZQotICAgICAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gaW50X3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICBpbnRfc3RybV90cmFja2Vyc18uRmluZEJ5Q2lzSWQoZGF0YS0+Y2lnX2lkLCBkYXRhLT5jaXNfaWQpOwotICAgICAgaWYoaW50X3RyYWNrZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fICA8PCAiTm90IGludGVuZGVkIGZvciB0aGlzIHRyYWNrZXIiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmKGRhdGEtPnN0YXRlID09IENpc1N0YXRlOjpFU1RBQkxJU0hFRCkgewotICAgICAgICBmb3IoYXV0byBpdCA9IGRpcmVjdGlvbnMuYmVnaW4oKTsgaXQgIT0gZGlyZWN0aW9ucy5lbmQoKTsgKytpdCkgewotICAgICAgICAgIGlmKGRhdGEtPmRpcmVjdGlvbiAmICppdCkgewotICAgICAgICAgICAgLy8gZmluZCBvdXQgdGhlIHN0cmVhbSBoZXJlCi0gICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5Q2lzSWRBbmREaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLT5jaWdfaWQsIGRhdGEtPmNpc19pZCwgKml0KTsKLSAgICAgICAgICAgIGlmKHN0cmVhbSkgewotICAgICAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgICAgICAgIGlmKGludF9zdHJtX3RyYWNrZXJzXy5GaW5kQnlBc2VJZChzdHJlYW0tPmFzZV9pZCkpIHsKLSAgICAgICAgICAgICAgICBUZXJtaW5hdGVDaXNBbmRDaWcoc3RyZWFtKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDaGVja0FuZFVwZGF0ZVN0b3BwZWRTdGF0ZSgpOwotCi0gICAgICB9IGVsc2UgaWYoZGF0YS0+c3RhdGUgPT0gQ2lzU3RhdGU6OlJFQURZKSB7Ci0gICAgICAgIGZvcihhdXRvIGl0ID0gZGlyZWN0aW9ucy5iZWdpbigpOyBpdCAhPSBkaXJlY3Rpb25zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgaWYoZGF0YS0+ZGlyZWN0aW9uICYgKml0KSB7Ci0gICAgICAgICAgICAvLyBmaW5kIG91dCB0aGUgc3RyZWFtIGhlcmUKLSAgICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlDaXNJZEFuZERpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmNpZ19pZCwgZGF0YS0+Y2lzX2lkLCAqaXQpOwotICAgICAgICAgICAgaWYoc3RyZWFtKSB7Ci0gICAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gZGF0YS0+c3RhdGU7Ci0gICAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgICAgICAgaWYoc3RyZWFtLT5jaWdfc3RhdGUgPT0gQ2lnU3RhdGU6OkNSRUFURUQgJiYKLSAgICAgICAgICAgICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPT0gQ2lzUGVuZGluZ0NtZDo6Tk9ORSkgewotICAgICAgICAgICAgICAgIElzb0hjaVN0YXR1cyBzdGF0dXMgPSBjaXNfaW50Zi0+UmVtb3ZlQ2lnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2lnX2lkKTsKLSAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09IElzb0hjaVN0YXR1czo6SVNPX0hDSV9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICBzdHJlYW0tPmNpZ19zdGF0ZSA9IENpZ1N0YXRlOjpJTlZBTElEOwotICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6SU5WQUxJRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBJc29IY2lTdGF0dXM6OklTT19IQ0lfSU5fUFJPR1JFU1MpIHsKLSAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Q0lHX1JFTU9WRV9JU1NVRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogQ0lHIHJlbW92YWwgRmFpbGVkIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ2hlY2tBbmRVcGRhdGVTdG9wcGVkU3RhdGUoKTsKLSAgICAgIH0gZWxzZSB7ICAvLyB0cmFuc2llbnQgc3RhdGVzCi0gICAgICAgIGZvcihhdXRvIGl0ID0gZGlyZWN0aW9ucy5iZWdpbigpOyBpdCAhPSBkaXJlY3Rpb25zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgaWYoZGF0YS0+ZGlyZWN0aW9uICYgKml0KSB7Ci0gICAgICAgICAgICAvLyBmaW5kIG91dCB0aGUgc3RyZWFtIGhlcmUKLSAgICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlDaXNJZEFuZERpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmNpZ19pZCwgZGF0YS0+Y2lzX2lkLCAqaXQpOwotICAgICAgICAgICAgaWYoc3RyZWFtKSBzdHJlYW0tPmNpc19zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIENJU19HUk9VUF9TVEFURV9FVlQ6IHsKLSAgICAgIENpc0dyb3VwU3RhdGUgKmRhdGEgPSAoKENpc0dyb3VwU3RhdGUgKikgcF9kYXRhKTsKLSAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHRyYWNrZXIgaXMgaW50ZXJlc3RlZCBpbiB0aGlzIENJRyB1cGRhdGUKLSAgICAgIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IGludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRCeUNpZ0lkKGRhdGEtPmNpZ19pZCk7Ci0gICAgICBpZihpbnRfdHJhY2tlcnMuZW1wdHkoKSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICJOb3QgaW50ZW5kZWQgZm9yIHRoaXMgdHJhY2tlciI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICAgICAgaWYoZGF0YS0+c3RhdGUgPT0gQ2lnU3RhdGU6OkNSRUFURUQpIHsKLSAgICAgICAgZm9yIChhdXRvIGkgPSBpbnRfdHJhY2tlcnMuYmVnaW4oKTsgaSAhPSBpbnRfdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgICAgICAgaWYgKHN0cmVhbSkgewotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIENJRyBjcmVhdGVkIGV2ZW50IGR1ZSB0byBDSUcgY3JlYXRlCi0gICAgICAgICAgICAvLyBpc3N1ZWQgZHVyaW5nIHN0YXJ0aW5nIHN0YXRlCi0gICAgICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgICAgICBzdHJlYW0tPmNpZ19zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6UkVBRFk7Ci0gICAgICAgICAgICBUZXJtaW5hdGVDaXNBbmRDaWcoc3RyZWFtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ2hlY2tBbmRVcGRhdGVTdG9wcGVkU3RhdGUoKTsKLQotICAgICAgfSBlbHNlIGlmKGRhdGEtPnN0YXRlID09IENpZ1N0YXRlOjpJRExFKSB7Ci0gICAgICAgIGZvciAoYXV0byBpID0gaW50X3RyYWNrZXJzLmJlZ2luKCk7IGkgIT0gaW50X3RyYWNrZXJzLmVuZCgpO2krKykgewotICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgICAgICAgIGlmIChzdHJlYW0pIHsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OklOVkFMSUQ7Ci0gICAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IENpc1N0YXRlOjpJTlZBTElEOwotICAgICAgICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDaGVja0FuZFVwZGF0ZVN0b3BwZWRTdGF0ZSgpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCQVBfVElNRV9PVVRfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5PblRpbWVvdXQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbi1oYW5kbGVkIGV2ZW50OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdHJhY2tlcl8uR2V0RXZlbnROYW1lKGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0YXRlRGlzY29ubmVjdGluZzo6VGVybWluYXRlR2F0dENvbm5lY3Rpb24oKSB7Ci0gIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gIEdhdHRQZW5kaW5nRGF0YSAqZ2F0dF9wZW5kaW5nX2RhdGEgPSBzdHJtX21ncl8tPkdldEdhdHRQZW5kaW5nRGF0YSgpOwotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbnRleHQgKj4gKmFsbF9jb250ZXh0cyA9IGNvbnRleHRzLT5HZXRBbGxDb250ZXh0cygpOwotICBib29sIGFueV9jb250ZXh0X2FjdGl2ZSA9IGZhbHNlOwotICBib29sIGRpc2NfaXNzdWVkID0gZmFsc2U7Ci0gIHN0ZDo6dmVjdG9yPGludD4gaWRzID0geyBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlIH07Ci0gIHN0ZDo6dmVjdG9yPFVjYXN0QXVkaW9TdHJlYW0gKj4gaWRsZV9zdHJlYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJtcy0+R2V0U3RyZWFtc0J5U3RhdGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkcywgQVNFX0RJUkVDVElPTl9TSU5LIHwgQVNFX0RJUkVDVElPTl9TUkMpOwotCi0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCI6IFRvdGFsIFN0cmVhbXMgc2l6ZTogIiA8PCBhdWRpb19zdHJtcy0+c2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCI6IElkbGUgU3RyZWFtcyBzaXplOiAiIDw8IGlkbGVfc3RyZWFtcy5zaXplKCk7Ci0KLSAgLy8gY2hlY2sgaWYgYW55IG9mIHRoZSBjb250ZXh0cyBzdHJlYW0gc3RhdGUgaXMgY29ubmVjdGVkCi0gIGZvciAoYXV0byBpdCA9IGFsbF9jb250ZXh0cy0+YmVnaW4oKTsgaXQgIT0gYWxsX2NvbnRleHRzLT5lbmQoKTsgaXQrKykgewotICAgIGlmKCgqaXQpLT5zdHJlYW1fc3RhdGUgIT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcgJiYKLSAgICAgICAoKml0KS0+c3RyZWFtX3N0YXRlICE9IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCI6IE90aGVyIGNvbnRleHRzIGFyZSBhY3RpdmUsbm90IHRvIGRpc2MgR2F0dCI7Ci0gICAgICBhbnlfY29udGV4dF9hY3RpdmUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmKCFhbnlfY29udGV4dF9hY3RpdmUgJiYKLSAgICAgKCFhdWRpb19zdHJtcy0+c2l6ZSgpIHx8IGF1ZGlvX3N0cm1zLT5zaXplKCkgPT0gaWRsZV9zdHJlYW1zLnNpemUoKSkpIHsKLQotICAgIC8vIGNoZWNrIGlmIGdhdHQgY29ubmVjdGlvbiBjYW4gYmUgdGVhciBkb3duIGZvciBhc2NzICYgcGFjcyBjbGllbnRzCi0gICAgLy8gYWxsIHN0cmVhbXMgYXJlIGluIGlkbGUgc3RhdGUKLSAgICBBc2NzQ2xpZW50ICphc2NzX2NsaWVudCA9IHN0cm1fbWdyXy0+R2V0QXNjc0NsaWVudCgpOwotICAgIFBhY3NDbGllbnQgKnBhY3NfY2xpZW50ID0gc3RybV9tZ3JfLT5HZXRQYWNzQ2xpZW50KCk7Ci0gICAgdWludDE2X3QgcGFjc19jbGllbnRfaWQgPSBzdHJtX21ncl8tPkdldFBhY3NDbGllbnRJZCgpOwotCi0gICAgQ29ubmVjdGlvblN0YXRlIHBhY3Nfc3RhdGUgPSBzdHJtX21ncl8tPkdldFBhY3NTdGF0ZSgpOwotICAgIGlmKChwYWNzX3N0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEICYmCi0gICAgICAgIGdhdHRfcGVuZGluZ19kYXRhLT5wYWNzX3BlbmRpbmdfY21kID09IEdhdHRQZW5kaW5nQ21kOjpOT05FKSB8fAotICAgICAgIChnYXR0X3BlbmRpbmdfZGF0YS0+cGFjc19wZW5kaW5nX2NtZCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYXR0UGVuZGluZ0NtZDo6R0FUVF9DT05OX1BFTkRJTkcpKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICIgSXNzdWUgUEFDUyBzZXJ2ZXIgZGlzY29ubmVjdCAiOwotICAgICAgcGFjc19jbGllbnQtPkRpc2Nvbm5lY3QocGFjc19jbGllbnRfaWQsIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpKTsKLSAgICAgIGdhdHRfcGVuZGluZ19kYXRhLT5wYWNzX3BlbmRpbmdfY21kID0gR2F0dFBlbmRpbmdDbWQ6OkdBVFRfRElTQ19QRU5ESU5HOwotICAgICAgZGlzY19pc3N1ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIEdhdHRTdGF0ZSBhc2NzX3N0YXRlID0gc3RybV9tZ3JfLT5HZXRBc2NzU3RhdGUoKTsKLSAgICBpZigoYXNjc19zdGF0ZSA9PSBHYXR0U3RhdGU6OkNPTk5FQ1RFRCAmJgotICAgICAgICBnYXR0X3BlbmRpbmdfZGF0YS0+YXNjc19wZW5kaW5nX2NtZCA9PSBHYXR0UGVuZGluZ0NtZDo6Tk9ORSkgfHwKLSAgICAgICAoZ2F0dF9wZW5kaW5nX2RhdGEtPmFzY3NfcGVuZGluZ19jbWQgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2F0dFBlbmRpbmdDbWQ6OkdBVFRfQ09OTl9QRU5ESU5HKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIElzc3VlIEFTQ1Mgc2VydmVyIGRpc2Nvbm5lY3QgIjsKLSAgICAgIGFzY3NfY2xpZW50LT5EaXNjb25uZWN0KEFTQ1NfQ0xJRU5UX0lELCBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSk7Ci0gICAgICBnYXR0X3BlbmRpbmdfZGF0YS0+YXNjc19wZW5kaW5nX2NtZCA9IEdhdHRQZW5kaW5nQ21kOjpHQVRUX0RJU0NfUEVORElORzsKLSAgICAgIGRpc2NfaXNzdWVkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGRpc2NfaXNzdWVkOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlRGlzY29ubmVjdGluZzo6T25FbnRlcigpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFN0cmVhbVRyYWNrZXIgU3RhdGU6ICIgPDwgR2V0U3RhdGUoKTsKLQotICAvLyBjaGVjayB0aGUgcHJldmlvdXMgc3RhdGUgaS5lIGNvbm5lY3RpbmcsIHN0YXJ0aW5nLCBzdG9wcGluZwotICAvLyBvciByZWNvbmZpZ3VyaW5nCi0KLSAgVWNhc3RDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcyA9IHN0cm1fbWdyXy0+R2V0VWNsaWVudENiYWNrcygpOwotICBTdHJlYW1Db250ZXh0cyAqY29udGV4dHMgPSBzdHJtX21ncl8tPkdldFN0cmVhbUNvbnRleHRzKCk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RybXM7Ci0gIHVpbnQ4X3QgbnVtX2FzZXMgPSAwOwotCi0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+ICpkaXNjX3N0cmVhbXMgPSB0cmFja2VyXy5HZXRTdHJlYW1zKCk7Ci0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogRGlzY29uZWN0aW9uIFN0cmVhbXMgU2l6ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRpc2Nfc3RyZWFtcy0+c2l6ZSgpOwotCi0gIFN0cmVhbUNvbnRyb2xUeXBlIGNvbnRyb2xfdHlwZSA9IHRyYWNrZXJfLkdldENvbnRyb2xUeXBlKCk7Ci0KLSAgaWYoY29udHJvbF90eXBlICE9IFN0cmVhbUNvbnRyb2xUeXBlOjpEaXNjb25uZWN0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChhdXRvIGl0ID0gZGlzY19zdHJlYW1zLT5iZWdpbigpOyBpdCAhPSBkaXNjX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgU3RyZWFtU3RhdGVJbmZvIHN0YXRlOwotICAgIG1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdGF0ZSkpOwotICAgIHN0YXRlLnN0cmVhbV90eXBlID0gKml0OwotICAgIHN0YXRlLnN0cmVhbV9zdGF0ZSA9IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HOwotICAgIHN0cm1zLnB1c2hfYmFjayhzdGF0ZSk7Ci0gICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoKml0KTsKLSAgICBjb250ZXh0LT5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORzsKLSAgICBpZihjb250ZXh0LT5jb25uZWN0aW9uX3N0YXRlID09IEludENvbm5lY3RTdGF0ZTo6QVNDU19ESVNDT1ZFUkVEKSB7Ci0gICAgICBmb3IgKGF1dG8gaWQgPSBjb250ZXh0LT5zdHJlYW1faWRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgIGlkICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCk7IGlkKyspIHsKLSAgICAgICAgYm9vbCBjYW5fYmVfZGlzY29ubmVjdGVkID0gdHJhY2tlcl8uCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNhbmJlRGlzY29ubmVjdGVkKGNvbnRleHQsIGlkLT5hc2VfaWQpOwotICAgICAgICBpZihjYW5fYmVfZGlzY29ubmVjdGVkKSB7Ci0gICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRPckFkZEJ5dHJhY2tlclR5cGUoKml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+YXNlX2lkLCBpZC0+Y2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+Y2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5jb2RlY19jb25maWcsIGNvbnRleHQtPnFvc19jb25maWcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIG51bV9hc2VzICs9IGNvbnRleHQtPnN0cmVhbV9pZHMuc2l6ZSgpOwotICB9Ci0gIGNhbGxiYWNrcy0+T25TdHJlYW1TdGF0ZShzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgc3RybXMpOwotCi0gIHVpbnQ2NF90IHRvdXQgPSBudW1fYXNlcyAqCi0gICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oVGltZW91dFZhbDo6RGlzY29ubmVjdGluZ1RpbWVvdXQpKTsKLSAgaWYoIXRvdXQgfHx0b3V0ID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE1heFRpbWVvdXRWYWw6OkRpc2Nvbm5lY3RpbmdUaW1lb3V0KSkgewotICAgIHRvdXQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oTWF4VGltZW91dFZhbDo6RGlzY29ubmVjdGluZ1RpbWVvdXQpOwotICB9Ci0KLSAgVGltZW91dFJlYXNvbiByZWFzb24gPSBUaW1lb3V0UmVhc29uOjpTVEFURV9UUkFOU0lUSU9OOwotICBzdGF0ZV90cmFuc2l0aW9uX3RpbWVyID0gdHJhY2tlcl8uU2V0VGltZXIoIlN0YXRlRGlzY29ubmVjdGluZ1RpbWVyIiwKLSAgICAgICAgICAgICAgICAmdGltZW91dCwgcmVhc29uLCB0b3V0KTsKLSAgaWYgKHN0YXRlX3RyYW5zaXRpb25fdGltZXIgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICI6IFN0YXRlRGlzY29ubmVjdGluZzogQWxhcm0gbm90IGFsbG9jYXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgZ2F0dF9kaXNjX3BlbmRpbmcgPSBUZXJtaW5hdGVHYXR0Q29ubmVjdGlvbigpOwotICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgbm8gaW50ZXJuYWwgc3RyZWFtIHRyYWNrZXJzLCB0aGVuIHVwZGF0ZSB0bwotICAvLyB1cHBlciBsYXllciBhcyBjb21wbGV0ZWx5IGRpc2Nvbm5lY3RlZAotICBpZighaW50X3N0cm1fdHJhY2tlcnNfLnNpemUoKSAmJiAhZ2F0dF9kaXNjX3BlbmRpbmcpIHsKLSAgICB0cmFja2VyXy5UcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZSk7Ci0gIH0KLX0KLQotdm9pZCBTdHJlYW1UcmFja2VyOjpTdGF0ZURpc2Nvbm5lY3Rpbmc6OkNvbnRpbnVlRGlzY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtKSB7Ci0KLSAgLy8gY2hlY2sgYXNlIHN0YXRlLCByZXR1cm4gaWYgc3RhdGUgaXMgbm90IHJlbGVhc2luZyBvcgotICBpZihzdHJlYW0tPmFzZV9zdGF0ZSAhPSBhc2NzOjpBU0VfU1RBVEVfSURMRSAmJgotICAgICBzdHJlYW0tPmFzZV9zdGF0ZSAhPSBhc2NzOjpBU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCAmJgotICAgICBzdHJlYW0tPmFzZV9zdGF0ZSAhPSBhc2NzOjpBU0VfU1RBVEVfUkVMRUFTSU5HKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIFJldHVybiBhcyBBU0UgaXMgbm90IG1vdmVkIHRvIFJpZ2h0IHN0YXRlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDaXNJbnRlcmZhY2UgKmNpc19pbnRmID0gc3RybV9tZ3JfLT5HZXRDaXNJbnRlcmZhY2UoKTsKLQotICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIENJUyBjb21tYW5kIHRoZW4gaXNzdWUgcmVsZXZhbnQKLSAgLy8gQ0lTIGNvbW1hbmQgYmFzZWQgb24gQ0lTIHN0YXRlCi0gIGlmKHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kICE9IENpc1BlbmRpbmdDbWQ6Ok5PTkUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICI6IGNpc19wZW5kaW5nX2NtZCBpcyBub3QgTk9ORSAiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmKHN0cmVhbS0+Y2lzX3N0YXRlID09IENpc1N0YXRlOjpFU1RBQkxJU0hFRCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIjogR29pbmcgRm9yIENJUyBkaXNjb25uZWN0ICI7Ci0gICAgSXNvSGNpU3RhdHVzIHN0YXR1cyA9IGNpc19pbnRmLT5EaXNjb25uZWN0Q2lzKHN0cmVhbS0+Y2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmNpc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5kaXJlY3Rpb24pOwotICAgIGlmKHN0YXR1cyA9PSBJc29IY2lTdGF0dXM6OklTT19IQ0lfU1VDQ0VTUykgewotICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpOT05FOwotICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6UkVBRFk7Ci0gICAgfSBlbHNlIGlmKHN0YXR1cyA9PSBJc29IY2lTdGF0dXM6OklTT19IQ0lfSU5fUFJPR1JFU1MpIHsKLSAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Q0lTX0RFU1RST1lfSVNTVUVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IENJUyBEaXNjb25uZWN0IEZhaWxlZCI7Ci0gICAgfQotICB9Ci0KLSAgaWYoc3RyZWFtLT5jaXNfc3RhdGUgPT0gQ2lzU3RhdGU6OlJFQURZKSB7Ci0gICAgaWYoc3RyZWFtLT5jaWdfc3RhdGUgPT0gQ2lnU3RhdGU6OkNSRUFURUQgJiYKLSAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9PSBDaXNQZW5kaW5nQ21kOjpOT05FKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IEdvaW5nIEZvciBDSUcgUmVtb3ZhbCI7Ci0gICAgICBJc29IY2lTdGF0dXMgc3RhdHVzID0gY2lzX2ludGYtPlJlbW92ZUNpZyhzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2lnX2lkKTsKLSAgICAgIGlmKCBzdGF0dXMgPT0gSXNvSGNpU3RhdHVzOjpJU09fSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgc3RyZWFtLT5jaWdfc3RhdGUgPSBDaWdTdGF0ZTo6SU5WQUxJRDsKLSAgICAgICAgc3RyZWFtLT5jaXNfc3RhdGUgPSBDaXNTdGF0ZTo6SU5WQUxJRDsKLSAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IElzb0hjaVN0YXR1czo6SVNPX0hDSV9JTl9QUk9HUkVTUykgewotICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6OkNJR19SRU1PVkVfSVNTVUVEOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBDSUcgcmVtb3ZhbCBGYWlsZWQiOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0YXRlRGlzY29ubmVjdGluZzo6Q2hlY2tBbmRVcGRhdGVEaXNjb25uZWN0ZWRTdGF0ZSgpIHsKLSAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgYm9vbCBwZW5kaW5nX2NtZHMgPSBmYWxzZTsKLQotICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiAqYWxsX3RyYWNrZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICBpbnRfc3RybV90cmFja2Vyc18uR2V0VHJhY2tlckxpc3QoKTsKLQotICAvLyBjaGVjayBpZiBhbnkgcGVuZGluZyBjb21tYW5kcyBhcmUgcHJlc2VudAotICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgIGlmKHN0cmVhbSAmJiAoc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgIT0gQ2lzUGVuZGluZ0NtZDo6Tk9ORSB8fAotICAgICAgICAgICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgIT0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkUpKSB7Ci0gICAgICBwZW5kaW5nX2NtZHMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYocGVuZGluZ19jbWRzKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIFBlbmRpbmcgQVNDUy9DSVMgY21kcyBwcmVzZW50ICI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgVGVybWluYXRlR2F0dENvbm5lY3Rpb24oKTsKLQotICAvLyBjaGVjayBpdCBuZWVkcyB0byB3YWl0IGZvciBBU0NTICYgUEFDUyBkaXNjb25uZWN0aW9uIGFsc28KLSAgR2F0dFBlbmRpbmdEYXRhICpnYXR0X3BlbmRpbmdfZGF0YSA9IHN0cm1fbWdyXy0+R2V0R2F0dFBlbmRpbmdEYXRhKCk7Ci0gIGlmKGdhdHRfcGVuZGluZ19kYXRhLT5hc2NzX3BlbmRpbmdfY21kICE9IEdhdHRQZW5kaW5nQ21kOjpOT05FIHx8Ci0gICAgIGdhdHRfcGVuZGluZ19kYXRhLT5wYWNzX3BlbmRpbmdfY21kICE9IEdhdHRQZW5kaW5nQ21kOjpOT05FKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIFBlbmRpbmcgR2F0dCBkaXNjIHByZXNlbnQgIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBjaGVjayBmb3IgYWxsIHRyYWNrZXJzIG1vdmVkIHRvIGlkbGUgYW5kCi0gIC8vIENJRyBzdGF0ZSBpcyBpZGxlIGlmIHNvIHVwZGF0ZSBpdCBhcyBzdHJlYW1zIGFyZSBkaXNjb25uZWN0ZWQKLSAgdWludDhfdCBudW1fc3RybXNfZGlzY29ubmVjdGVkID0gMDsKLSAgZm9yIChhdXRvIGkgPSBhbGxfdHJhY2tlcnMtPmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLT5lbmQoKTtpKyspIHsKLSAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICBpZiAoIXN0cmVhbSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgInN0cmVhbSBpcyBudWxsIjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZigoc3RyZWFtLT5hc2Vfc3RhdGUgPT0gYXNjczo6QVNFX1NUQVRFX0lETEUgfHwKLSAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCkgJiYKLSAgICAgICAoc3RyZWFtLT5jaWdfc3RhdGUgPT0gQ2lnU3RhdGU6OklETEUgfHwKLSAgICAgICBzdHJlYW0tPmNpZ19zdGF0ZSA9PSBDaWdTdGF0ZTo6SU5WQUxJRCkgJiYKLSAgICAgICAoc3RyZWFtLT5jaXNfc3RhdGUgPT0gQ2lzU3RhdGU6OlJFQURZIHx8Ci0gICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID09IENpc1N0YXRlOjpJTlZBTElEKSkgewotICAgICAgbnVtX3N0cm1zX2Rpc2Nvbm5lY3RlZCsrOwotICAgIH0KLSAgfQotCi0gIGlmKGludF9zdHJtX3RyYWNrZXJzXy5zaXplKCkgIT0gbnVtX3N0cm1zX2Rpc2Nvbm5lY3RlZCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyAgPDwgIk5vdCBkaXNjb25uZWN0ZWQgZm9yIGFsbCBzdHJlYW1zIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIkRpc2Nvbm5lY3RlZCBmb3IgYWxsIHN0cmVhbXMiOwotICB9Ci0KLSAgZm9yIChhdXRvIGkgPSBhbGxfdHJhY2tlcnMtPmJlZ2luKCk7IGkgIT0gYWxsX3RyYWNrZXJzLT5lbmQoKTtpKyspIHsKLSAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICBpZiAoc3RyZWFtKSB7Ci0gICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlOwotICAgIH0KLSAgfQotCi0gIC8vIHVwZGF0ZSB0aGUgc3RhdGUgdG8gaWRsZQotICB0cmFja2VyXy5UcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlRGlzY29ubmVjdGluZzo6T25FeGl0KCkgewotICB0cmFja2VyXy5DbGVhclRpbWVyKHN0YXRlX3RyYW5zaXRpb25fdGltZXIsICJTdGF0ZURpc2Nvbm5lY3RpbmdUaW1lciIpOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0YXRlRGlzY29ubmVjdGluZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQkQgQWRkciA9ICIgPDwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogU3RhdGUgPSAiIDw8IEdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogRXZlbnQgPSAiIDw8IHRyYWNrZXJfLkdldEV2ZW50TmFtZShldmVudCk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgUGFjc0Nvbm5lY3Rpb25TdGF0ZSAqcGFjc19zdGF0ZSA9ICAoUGFjc0Nvbm5lY3Rpb25TdGF0ZSAqKSBwX2RhdGE7Ci0gICAgICBHYXR0UGVuZGluZ0RhdGEgKmdhdHRfcGVuZGluZ19kYXRhID0gc3RybV9tZ3JfLT5HZXRHYXR0UGVuZGluZ0RhdGEoKTsKLSAgICAgIGlmKHBhY3Nfc3RhdGUtPnN0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIGdhdHRfcGVuZGluZ19kYXRhLT5wYWNzX3BlbmRpbmdfY21kID0gR2F0dFBlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICB9Ci0gICAgICBDaGVja0FuZFVwZGF0ZURpc2Nvbm5lY3RlZFN0YXRlKCk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEFTQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIEFzY3NDb25uZWN0aW9uU3RhdGUgKmFzY3Nfc3RhdGUgPSAgKEFzY3NDb25uZWN0aW9uU3RhdGUgKikgcF9kYXRhOwotICAgICAgR2F0dFBlbmRpbmdEYXRhICpnYXR0X3BlbmRpbmdfZGF0YSA9IHN0cm1fbWdyXy0+R2V0R2F0dFBlbmRpbmdEYXRhKCk7Ci0gICAgICBpZihhc2NzX3N0YXRlLT5zdGF0ZSA9PSBHYXR0U3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAvLyBtYWtlIGFsbCBzdHJlYW1zIEFTRSBzdGF0ZSB0byBpZGxlIHNvIHRoYXQgZnVydGhlciBwcm9jZXNzaW5nCi0gICAgICAgIC8vIGNhbiBoYXBwZW4KLSAgICAgICAgZ2F0dF9wZW5kaW5nX2RhdGEtPmFzY3NfcGVuZGluZ19jbWQgPSBHYXR0UGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8VWNhc3RBdWRpb1N0cmVhbSAqPiAqc3RybXNfbGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJtcy0+R2V0QWxsU3RyZWFtcygpOwotCi0gICAgICAgIGZvciAoYXV0byBpdCA9IHN0cm1zX2xpc3QtPmJlZ2luKCk7IGl0ICE9IHN0cm1zX2xpc3QtPmVuZCgpOyBpdCsrKSB7Ci0KLSAgICAgICAgICAoKml0KS0+YXNlX3N0YXRlID0gYXNjczo6QVNFX1NUQVRFX0lETEU7Ci0gICAgICAgICAgKCppdCktPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICAgICgqaXQpLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICAgICAgICBDb250aW51ZURpc2Nvbm5lY3Rpb24oKml0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ2hlY2tBbmRVcGRhdGVEaXNjb25uZWN0ZWRTdGF0ZSgpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBU0NTX0FTRV9TVEFURV9FVlQ6IHsgIC8vIHRvIGhhbmRsZSByZW1vdGUgZHJpdmVuIG9wZXJhdGlvbnMKLQotICAgICAgLy8gY2hlY2sgZm9yIHN0YXRlIHJlbGVhc2luZwotICAgICAgLy8gYmFzZWQgb24gcHJldiBzdGF0ZSBkbyBhY2NvcmRpbmdseQotICAgICAgQXNjc1N0YXRlICphc2NzID0gICgoQXNjc1N0YXRlICopIHBfZGF0YSk7Ci0KLSAgICAgIHVpbnQ4X3QgYXNlX2lkID0gYXNjcy0+YXNlX3BhcmFtcy5hc2VfaWQ7Ci0KLSAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHRyYWNrZXIgaXMgaW50ZXJlc3RlZCBpbiB0aGlzIEFTRSB1cGRhdGUKLSAgICAgIGlmKGludF9zdHJtX3RyYWNrZXJzXy5GaW5kQnlBc2VJZChhc2VfaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyAgPDwgIk5vdCBpbnRlbmRlZCBmb3IgdGhpcyB0cmFja2VyIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoYXNlX2lkKTsKLQotICAgICAgaWYoc3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdHJlYW0tPmFzZV9zdGF0ZSA9IGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlOwotICAgICAgICBzdHJlYW0tPmFzZV9wYXJhbXMgPSBhc2NzLT5hc2VfcGFyYW1zOwotICAgICAgfQotCi0gICAgICBpZihhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PSBhc2NzOjpBU0VfU1RBVEVfUkVMRUFTSU5HKSB7Ci0gICAgICAgIC8vIGZpbmQgb3V0IHRoZSBzdHJlYW0gZm9yIHRoZSBnaXZlbiBhc2UgaWQKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiIEFTRSBJZCAiIDw8IGxvZ2hleChhc2VfaWQpOwotICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICBDb250aW51ZURpc2Nvbm5lY3Rpb24oc3RyZWFtKTsKLQotICAgICAgfSBlbHNlIGlmKCBhc2NzLT5hc2VfcGFyYW1zLmFzZV9zdGF0ZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjczo6QVNFX1NUQVRFX0NPREVDX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIGNvZGVjIGNvbmZpZyBub3RpZmljYXRpb24gZHVlIHRvIGNvZGVjIGNvbmZpZwotICAgICAgICAvLyBpc3N1ZWQgZHVyaW5nIGNvbm5lY3Rpbmcgc3RhdGUKLSAgICAgICAgaWYoKHRyYWNrZXJfLlByZXZpb3VzU3RhdGVJZCgpID09IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RpbmcgfHwKLSAgICAgICAgICAgIHRyYWNrZXJfLlByZXZpb3VzU3RhdGVJZCgpID09IFN0cmVhbVRyYWNrZXI6OmtTdGF0ZVJlY29uZmlndXJpbmcpICYmCi0gICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID09IEFzY3NQZW5kaW5nQ21kOjpDT0RFQ19DT05GSUdfSVNTVUVEICYmCi0gICAgICAgICAgIHN0cmVhbS0+YXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9DT0RFQ19DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgLy8gbWFyayBpbnQgY29ubiBzdGF0ZSBhcyBjb2RlYyBjb25maWd1cmVkIGFuZCBpc3N1ZSByZWxlYXNlIGNvbW1hbmQKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VSZWxlYXNlT3A+IGFzZV9vcHM7Ci0gICAgICAgICAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldEFzY3NDbGllbnQoKTsKLSAgICAgICAgICBBc2VSZWxlYXNlT3AgcmVsZWFzZV9vcCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc2VfaWQgPSBzdHJlYW0tPmFzZV9pZAotICAgICAgICAgIH07Ci0gICAgICAgICAgYXNlX29wcy5wdXNoX2JhY2socmVsZWFzZV9vcCk7Ci0gICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6UkVMRUFTRV9JU1NVRUQ7Ci0gICAgICAgICAgYXNjc19jbGllbnQtPlJlbGVhc2UoQVNDU19DTElFTlRfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cm1fbWdyXy0+R2V0QWRkcmVzcygpLCBhc2Vfb3BzKTsKLSAgICAgICAgICBicmVhazsgLy8gYnJlYWsgdGhlIHN3aXRjaCBjYXNlCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlOwotICAgICAgICAgIENvbnRpbnVlRGlzY29ubmVjdGlvbihzdHJlYW0pOwotICAgICAgICAgIENoZWNrQW5kVXBkYXRlRGlzY29ubmVjdGVkU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmKGFzY3MtPmFzZV9wYXJhbXMuYXNlX3N0YXRlID09IGFzY3M6OkFTRV9TVEFURV9JRExFKSB7Ci0gICAgICAgIC8vIGNoZWNrIGZvciBhbGwgdHJhY2tlcnMgbW92ZWQgdG8gaWRsZSBhbmQKLSAgICAgICAgLy8gQ0lHIHN0YXRlIGlzIGlkbGUgaWYgc28gdXBkYXRlIGl0IGFzIHN0cmVhbXMgYXJlIGRpc2Nvbm5lY3RlZAotICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlOwotICAgICAgICBDb250aW51ZURpc2Nvbm5lY3Rpb24oc3RyZWFtKTsKLSAgICAgICAgQ2hlY2tBbmRVcGRhdGVEaXNjb25uZWN0ZWRTdGF0ZSgpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFTQ1NfQVNFX09QX0ZBSUxFRF9FVlQ6IHsKLSAgICAgIEFzY3NPcEZhaWxlZCAqYXNjc19vcCA9ICAoKEFzY3NPcEZhaWxlZCAqKSBwX2RhdGEpOwotICAgICAgc3RkOjp2ZWN0b3I8YXNjczo6QXNlT3BTdGF0dXM+ICphc2VfbGlzdCA9ICZhc2NzX29wLT5hc2VfbGlzdDsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0KLSAgICAgIGlmKGFzY3Nfb3AtPmFzZV9vcF9pZCA9PSBhc2NzOjpBc2VPcElkOjpSRUxFQVNFKSB7Ci0gICAgICAgIC8vIHRyZWF0IGl0IGxpa2UgaW50ZXJuYWwgZmFpbHVyZQotICAgICAgICBmb3IgKGF1dG8gaSA9IGFzZV9saXN0LT5iZWdpbigpOyBpICE9IGFzZV9saXN0LT5lbmQoKTtpKyspIHsKLSAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKGkpLT5hc2VfaWQpOwotICAgICAgICAgIGlmKHN0cmVhbSkgewotICAgICAgICAgICAgc3RyZWFtLT5hc2Vfc3RhdGUgPSBhc2NzOjpBU0VfU1RBVEVfSURMRTsKLSAgICAgICAgICAgIHN0cmVhbS0+YXNlX3BlbmRpbmdfY21kID0gQXNjc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVJZGxlOwotICAgICAgICAgICAgQ29udGludWVEaXNjb25uZWN0aW9uKHN0cmVhbSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENoZWNrQW5kVXBkYXRlRGlzY29ubmVjdGVkU3RhdGUoKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBDSVNfR1JPVVBfU1RBVEVfRVZUOiB7Ci0gICAgICAvLyBjaGVjayBpZiB0aGUgYXNzb2NpYXRlZCBDSUcgc3RhdGUgaXMgY3JlYXRlZAotICAgICAgLy8gaWYgc28gZ28gZm9yIFFPUyBjb25maWcgb3BlcmF0aW9uCi0gICAgICBDaXNHcm91cFN0YXRlICpkYXRhID0gKChDaXNHcm91cFN0YXRlICopIHBfZGF0YSk7Ci0KLSAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHRyYWNrZXIgaXMgaW50ZXJlc3RlZCBpbiB0aGlzIENJRyB1cGRhdGUKLSAgICAgIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+IGludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRCeUNpZ0lkKGRhdGEtPmNpZ19pZCk7Ci0gICAgICBpZihpbnRfdHJhY2tlcnMuZW1wdHkoKSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICJOb3QgaW50ZW5kZWQgZm9yIHRoaXMgdHJhY2tlciI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBVY2FzdEF1ZGlvU3RyZWFtcyAqYXVkaW9fc3RybXMgPSBzdHJtX21ncl8tPkdldEF1ZGlvU3RyZWFtcygpOwotICAgICAgaWYoZGF0YS0+c3RhdGUgPT0gQ2lnU3RhdGU6OkNSRUFURUQpIHsKLSAgICAgICAgZm9yIChhdXRvIGkgPSBpbnRfdHJhY2tlcnMuYmVnaW4oKTsgaSAhPSBpbnRfdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgICAgICAgaWYgKHN0cmVhbSkgewotICAgICAgICAgICAgc3RyZWFtLT5jaXNfcGVuZGluZ19jbWQgPSBDaXNQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICAgICAgc3RyZWFtLT5jaWdfc3RhdGUgPSBkYXRhLT5zdGF0ZTsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gQ2lzU3RhdGU6OlJFQURZOwotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIENJRyBjcmVhdGVkIGV2ZW50IGR1ZSB0byBDSUcgY3JlYXRlCi0gICAgICAgICAgICAvLyBpc3N1ZWQgZHVyaW5nIHN0YXJ0aW5nIHN0YXRlCi0gICAgICAgICAgICBDb250aW51ZURpc2Nvbm5lY3Rpb24oc3RyZWFtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ2hlY2tBbmRVcGRhdGVEaXNjb25uZWN0ZWRTdGF0ZSgpOwotCi0gICAgICB9IGVsc2UgaWYoZGF0YS0+c3RhdGUgPT0gQ2lnU3RhdGU6OklETEUpIHsKLSAgICAgICAgZm9yIChhdXRvIGkgPSBpbnRfdHJhY2tlcnMuYmVnaW4oKTsgaSAhPSBpbnRfdHJhY2tlcnMuZW5kKCk7aSsrKSB7Ci0gICAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKCgqaSktPmFzZV9pZCk7Ci0gICAgICAgICAgaWYgKCFzdHJlYW0pIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICJzdHJlYW0gaXMgbnVsbCI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RyZWFtLT5jaWdfc3RhdGUgPSBDaWdTdGF0ZTo6SU5WQUxJRDsKLSAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IENpc1N0YXRlOjpJTlZBTElEOwotICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgfQotICAgICAgICBDaGVja0FuZFVwZGF0ZURpc2Nvbm5lY3RlZFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIENJU19TVEFURV9FVlQ6IHsKLSAgICAgIENpc1N0cmVhbVN0YXRlICpkYXRhID0gKENpc1N0cmVhbVN0YXRlICopIHBfZGF0YTsKLSAgICAgIFVjYXN0QXVkaW9TdHJlYW1zICphdWRpb19zdHJtcyA9IHN0cm1fbWdyXy0+R2V0QXVkaW9TdHJlYW1zKCk7Ci0gICAgICAvLyBjaGVjayBpZiBjdXJyZW50IHN0cmVhbSB0cmFja2VyIGlzIGludGVyZXN0ZWQgaW4gdGhpcyBDSUcgdXBkYXRlCi0gICAgICBzdGQ6OnZlY3RvcjxJbnRTdHJtVHJhY2tlciAqPiBpbnRfdHJhY2tlcnMgPQotICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzXy5GaW5kQnlDaXNJZChkYXRhLT5jaWdfaWQsIGRhdGEtPmNpc19pZCk7Ci0gICAgICBpZihpbnRfdHJhY2tlcnMuZW1wdHkoKSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICJOb3QgaW50ZW5kZWQgZm9yIHRoaXMgdHJhY2tlciI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBnbyBmb3IgQ0lTIGRlc3Ryb3kgb3IgQ0lHIHJlbW92YWwgYmFzZWQgb24gQ0lTIHN0YXRlCi0gICAgICBpZihkYXRhLT5zdGF0ZSA9PSBDaXNTdGF0ZTo6RVNUQUJMSVNIRUQpIHsKLSAgICAgICAgZm9yKGF1dG8gaXQgPSBkaXJlY3Rpb25zLmJlZ2luKCk7IGl0ICE9IGRpcmVjdGlvbnMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICBpZihkYXRhLT5kaXJlY3Rpb24gJiAqaXQpIHsKLSAgICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlDaXNJZEFuZERpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEtPmNpZ19pZCwgZGF0YS0+Y2lzX2lkLCAqaXQpOwotICAgICAgICAgICAgaWYoc3RyZWFtKSB7Ci0gICAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3N0YXRlID0gZGF0YS0+c3RhdGU7Ci0gICAgICAgICAgICAgIHN0cmVhbS0+Y2lzX3BlbmRpbmdfY21kID0gQ2lzUGVuZGluZ0NtZDo6Tk9ORTsKLSAgICAgICAgICAgICAgQ29udGludWVEaXNjb25uZWN0aW9uKHN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYoZGF0YS0+c3RhdGUgPT0gQ2lzU3RhdGU6OlJFQURZKSB7Ci0gICAgICAgIGZvcihhdXRvIGl0ID0gZGlyZWN0aW9ucy5iZWdpbigpOyBpdCAhPSBkaXJlY3Rpb25zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgaWYoZGF0YS0+ZGlyZWN0aW9uICYgKml0KSB7Ci0gICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5Q2lzSWRBbmREaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLT5jaWdfaWQsIGRhdGEtPmNpc19pZCwgKml0KTsKLSAgICAgICAgICAgIGlmKHN0cmVhbSkgewotICAgICAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgICAgICAgICBzdHJlYW0tPmNpc19wZW5kaW5nX2NtZCA9IENpc1BlbmRpbmdDbWQ6Ok5PTkU7Ci0gICAgICAgICAgICAgIENvbnRpbnVlRGlzY29ubmVjdGlvbihzdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDaGVja0FuZFVwZGF0ZURpc2Nvbm5lY3RlZFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQkFQX1RJTUVfT1VUX0VWVDogewotICAgICAgQmFwVGltZW91dCogdGltZW91dCA9IHN0YXRpY19jYXN0IDxCYXBUaW1lb3V0ICo+IChwX2RhdGEpOwotICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbHB0cikgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogdGltZW91dCBkYXRhIG51bGwsIHJldHVybiAiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaW50IHN0cmVhbV90cmFja2VyX2lkID0gdGltZW91dC0+dHJhbnNpdGlvbl9zdGF0ZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdHJlYW1fdHJhY2tlcl9JRDogIiA8PCBzdHJlYW1fdHJhY2tlcl9pZAotICAgICAgICAgICAgICAgIDw8ICIsIHRpbWVvdXQgcmVhc29uOiAiIDw8IHN0YXRpY19jYXN0PGludD4odGltZW91dC0+cmVhc29uKTsKLQotICAgICAgc3RkOjp2ZWN0b3I8SW50U3RybVRyYWNrZXIgKj4gKmludF90cmFja2VycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkdldFRyYWNrZXJMaXN0KCk7Ci0gICAgICBpZiAodGltZW91dC0+cmVhc29uID09IFRpbWVvdXRSZWFzb246OlNUQVRFX1RSQU5TSVRJT04pIHsKLSAgICAgICAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgICAgICAgZm9yIChhdXRvIGkgPSBpbnRfdHJhY2tlcnMtPmJlZ2luKCk7IGkgIT0gaW50X3RyYWNrZXJzLT5lbmQoKTtpKyspIHsKLSAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoKCppKS0+YXNlX2lkKTsKLSAgICAgICAgICBpZihzdHJlYW0pIHsKLSAgICAgICAgICAgIHN0cmVhbS0+YXNlX3N0YXRlID0gYXNjczo6QVNFX1NUQVRFX0lETEU7Ci0gICAgICAgICAgICBzdHJlYW0tPmFzZV9wZW5kaW5nX2NtZCA9IEFzY3NQZW5kaW5nQ21kOjpOT05FOwotICAgICAgICAgICAgc3RyZWFtLT5vdmVyYWxsX3N0YXRlID0gU3RyZWFtVHJhY2tlcjo6a1N0YXRlSWRsZTsKLSAgICAgICAgICAgIENvbnRpbnVlRGlzY29ubmVjdGlvbihzdHJlYW0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDaGVja0FuZFVwZGF0ZURpc2Nvbm5lY3RlZFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFVuLWhhbmRsZWQgZXZlbnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0cmFja2VyXy5HZXRFdmVudE5hbWUoZXZlbnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RyZWFtVHJhY2tlcjo6U3RhdGVSZWNvbmZpZ3VyaW5nOjpPbkVudGVyKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU3RyZWFtVHJhY2tlciBTdGF0ZTogIiA8PCBHZXRTdGF0ZSgpOwotICBVY2FzdENsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzID0gc3RybV9tZ3JfLT5HZXRVY2xpZW50Q2JhY2tzKCk7Ci0gIFN0cmVhbUNvbnRleHRzICpjb250ZXh0cyA9IHN0cm1fbWdyXy0+R2V0U3RyZWFtQ29udGV4dHMoKTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtU3RhdGVJbmZvPiBzdHJtczsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZpZ19zdHJlYW1zID0gdHJhY2tlcl8uR2V0UmVjb25mU3RyZWFtcygpOwotICB1aW50OF90IG51bV9hc2VzID0gMDsKLQotICBMT0coV0FSTklORykgPDwgX19mdW5jX18gIDw8ICI6IFJlY29uZmlnIFN0cmVhbXMgU2l6ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlY29uZmlnX3N0cmVhbXMtPnNpemUoKTsKLQotICBTdHJlYW1Db250cm9sVHlwZSBjb250cm9sX3R5cGUgPSB0cmFja2VyXy5HZXRDb250cm9sVHlwZSgpOwotCi0gIGlmKGNvbnRyb2xfdHlwZSAhPSBTdHJlYW1Db250cm9sVHlwZTo6UmVjb25maWcpIHJldHVybjsKLQotICBmb3IgKGF1dG8gaXQgPSByZWNvbmZpZ19zdHJlYW1zLT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSByZWNvbmZpZ19zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgIFN0cmVhbVN0YXRlSW5mbyBzdGF0ZTsKLSAgICBtZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLSAgICBzdGF0ZS5zdHJlYW1fdHlwZSA9IGl0LT5zdHJlYW1fdHlwZTsKLSAgICBzdGF0ZS5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6UkVDT05GSUdVUklORzsKLSAgICBzdHJtcy5wdXNoX2JhY2soc3RhdGUpOwotICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKGl0LT5zdHJlYW1fdHlwZSk7Ci0gICAgY29udGV4dC0+Y29ubmVjdGlvbl9zdGF0ZSA9IEludENvbm5lY3RTdGF0ZTo6UEFDU19ESVNDT1ZFUklORzsKLSAgICBjb250ZXh0LT5zdHJlYW1fc3RhdGUgPSBTdHJlYW1TdGF0ZTo6UkVDT05GSUdVUklORzsKLSAgICBudW1fYXNlcyArPSBjb250ZXh0LT5zdHJlYW1faWRzLnNpemUoKTsKLSAgfQotICBjYWxsYmFja3MtPk9uU3RyZWFtU3RhdGUoc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCksIHN0cm1zKTsKLQotICB1aW50NjRfdCB0b3V0ID0gbnVtX2FzZXMgKgotICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KFRpbWVvdXRWYWw6OlJlY29uZmlndXJpbmdUaW1lb3V0KSk7Ci0gIGlmKCF0b3V0IHx8dG91dCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90PihNYXhUaW1lb3V0VmFsOjpSZWNvbmZpZ3VyaW5nVGltZW91dCkpewotICAgIHRvdXQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oTWF4VGltZW91dFZhbDo6UmVjb25maWd1cmluZ1RpbWVvdXQpOwotICB9Ci0KLSAgVGltZW91dFJlYXNvbiByZWFzb24gPSBUaW1lb3V0UmVhc29uOjpTVEFURV9UUkFOU0lUSU9OOwotICBzdGF0ZV90cmFuc2l0aW9uX3RpbWVyID0gdHJhY2tlcl8uU2V0VGltZXIoIlN0YXRlUmVjb25maWd1cmluZ1RpbWVyIiwKLSAgICAgICAgICAgICZ0aW1lb3V0LCByZWFzb24sIHRvdXQpOwotICBpZiAoc3RhdGVfdHJhbnNpdGlvbl90aW1lciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIjogc3RhdGVfdHJhbnNpdGlvbl90aW1lcjogQWxhcm0gbm90IGFsbG9jYXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIFN0cmVhbVRyYWNrZXI6OlN0YXRlUmVjb25maWd1cmluZzo6T25FeGl0KCkgewotICB0cmFja2VyXy5DbGVhclRpbWVyKHN0YXRlX3RyYW5zaXRpb25fdGltZXIsICJTdGF0ZVJlY29uZmlndXJpbmdUaW1lciIpOwotfQotCi1ib29sIFN0cmVhbVRyYWNrZXI6OlN0YXRlUmVjb25maWd1cmluZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8X19mdW5jX18gIDw8IjogQkQgQWRkciA9ICIgPDwgc3RybV9tZ3JfLT5HZXRBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogU3RhdGUgPSAiIDw8IEdldFN0YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IjogRXZlbnQgPSAiIDw8IHRyYWNrZXJfLkdldEV2ZW50TmFtZShldmVudCk7Ci0KLSAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICpyZWNvbmZfc3RyZWFtcyA9IHRyYWNrZXJfLkdldFJlY29uZlN0cmVhbXMoKTsKLSAgU3RyZWFtQ29udGV4dHMgKmNvbnRleHRzID0gc3RybV9tZ3JfLT5HZXRTdHJlYW1Db250ZXh0cygpOwotICB1aW50OF90IG51bV9yZWNvbmZfc3RyZWFtcyA9IDA7Ci0gIGlmKHJlY29uZl9zdHJlYW1zKSB7Ci0gICAgIG51bV9yZWNvbmZfc3RyZWFtcyA9IHJlY29uZl9zdHJlYW1zLT5zaXplKCk7Ci0gIH0KLSAgVWNhc3RBdWRpb1N0cmVhbXMgKmF1ZGlvX3N0cm1zID0gc3RybV9tZ3JfLT5HZXRBdWRpb1N0cmVhbXMoKTsKLSAgQXNjc0NsaWVudCAqYXNjc19jbGllbnQgPSBzdHJtX21ncl8tPkdldEFzY3NDbGllbnQoKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCQVBfRElTQ09OTkVDVF9SRVFfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVEaXNjb25uZWN0KHBfZGF0YSwgU3RyZWFtVHJhY2tlcjo6a1N0YXRlUmVjb25maWd1cmluZyk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFBBQ1NfRElTQ09WRVJZX1JFU19FVlQ6IHsKLSAgICAgIFBhY3NEaXNjb3ZlcnkgcGFjc19kaXNjb3ZlcnlfID0gICooKFBhY3NEaXNjb3ZlcnkgKikgcF9kYXRhKTsKLSAgICAgIEdhdHRTdGF0ZSBhc2NzX3N0YXRlID0gc3RybV9tZ3JfLT5HZXRBc2NzU3RhdGUoKTsKLSAgICAgIHVpbnQ4X3QgcW9zX3JlY29uZmlncyA9IDA7Ci0KLSAgICAgIGJvb2wgcHJvY2Vzc19wYWNzX3Jlc3VsdHMgPSBmYWxzZTsKLQotICAgICAgLy8gY2hlY2sgaWYgdGhpcyB0cmFja2VyIGFscmVhZHkgcGFzc2VkIHRoZSBwYWNzIGRpc2NvdmVyeSBzdGFnZQotICAgICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSByZWNvbmZfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoaXQtPnN0cmVhbV90eXBlKTsKLSAgICAgICAgaWYgKGNvbnRleHQtPmNvbm5lY3Rpb25fc3RhdGUgPT0gSW50Q29ubmVjdFN0YXRlOjpQQUNTX0RJU0NPVkVSSU5HKSB7Ci0gICAgICAgICAgY29udGV4dC0+Y29ubmVjdGlvbl9zdGF0ZSA9IEludENvbm5lY3RTdGF0ZTo6QVNDU19ESVNDT1ZFUkVEOwotICAgICAgICAgIHByb2Nlc3NfcGFjc19yZXN1bHRzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighcHJvY2Vzc19wYWNzX3Jlc3VsdHMpIGJyZWFrOwotCi0gICAgICAvLyBjaGVjayB0aGUgc3RhdHVzCi0gICAgICBpZihwYWNzX2Rpc2NvdmVyeV8uc3RhdHVzKSB7Ci0gICAgICAgIC8vIHNlbmQgdGhlIEJBUCBjYWxsYmFjayBhcyBjb25uZWN0ZWQgYXMgZGlzY292ZXJ5IGZhaWxlZAotICAgICAgICAvLyBkdXJpbmcgcmVjb25maWd1cmluZwotICAgICAgICB0cmFja2VyXy5UcmFuc2l0aW9uVG8oU3RyZWFtVHJhY2tlcjo6a1N0YXRlQ29ubmVjdGVkKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICB0cmFja2VyXy5VcGRhdGVQYWNzRGlzY292ZXJ5KHBhY3NfZGlzY292ZXJ5Xyk7Ci0KLSAgICAgIC8vIGNoZWNrIGlmIHN1cHBvcnRlZCBhdWRpbyBjb250ZXh0cyBoYXMgcmVxdWlyZWQgY29udGV4dHMKLSAgICAgIGZvciAoYXV0byBpdCA9IHJlY29uZl9zdHJlYW1zLT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gcmVjb25mX3N0cmVhbXMtPmVuZCgpOykgewotICAgICAgICBib29sIGNvbnRleHRfc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gaXQtPnN0cmVhbV90eXBlOwotICAgICAgICBpZihzdHJlYW0uZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgIGlmKHN0cmVhbS5hdWRpb19jb250ZXh0ICYgcGFjc19kaXNjb3ZlcnlfLnN1cHBvcnRlZF9jb250ZXh0cykgewotICAgICAgICAgICAgY29udGV4dF9zdXBwb3J0ZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmKHN0cmVhbS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICBpZigoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0cmVhbS5hdWRpb19jb250ZXh0KSA8PCAxNikgJgotICAgICAgICAgICAgICAgcGFjc19kaXNjb3ZlcnlfLnN1cHBvcnRlZF9jb250ZXh0cykgewotICAgICAgICAgICAgY29udGV4dF9zdXBwb3J0ZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihjb250ZXh0X3N1cHBvcnRlZCkgewotICAgICAgICAgIGl0Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaXQgPSByZWNvbmZfc3RyZWFtcy0+ZXJhc2UoaXQpOwotICAgICAgICAgIC8vIFRPRE8gdG8gdXBkYXRlIHRoZSBkaXNjb25uZWN0ZWQgY2FsbGJhY2sKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZihyZWNvbmZfc3RyZWFtcy0+ZW1wdHkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAiIE5vIE1hdGNoaW5nIFN1cCBDb250ZXh0cyBmb3VuZCI7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICIgTW92aW5nIGJhY2sgdG8gQ29ubmVjdGVkIHN0YXRlIjsKLSAgICAgICAgdHJhY2tlcl8uVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBjaGVjayBwaHlzaWNhbCBhbGxvY2F0aW9uIGZvciBhbGwgcmVjb25maWcgcmVxdWVzdHMKLSAgICAgIHVpbnQ4X3QgbnVtX3BoeV9hdHRhY2hlZCA9IDA7Ci0gICAgICB1aW50OF90IG51bV9zYW1lX2NvbmZpZ19hcHBsaWVkID0gMDsKLSAgICAgIC8vIGlmIG5vdCBwcmVzZW50IHNlbmQgdGhlIEJBUCBjYWxsYmFjayBhcyBkaXNjb25uZWN0ZWQKLSAgICAgIC8vIGNvbXBhcmUgdGhlIGNvZGVjIGNvbmZpZ3MgZnJvbSB1cHBlciBsYXllciB0byByZW1vdGUgZGV2Ci0gICAgICAvLyBzaW5rIG9yIHNyYyBQQUNTIHJlY29yZHMvY2FwYWJpbGl0aWVzLgotICAgICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSByZWNvbmZfc3RyZWFtcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgdWludDhfdCBpbmRleCA9IHRyYWNrZXJfLkNob29zZUJlc3RDb2RlYyhpdC0+c3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPmNvZGVjX3Fvc19jb25maWdfcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWNzX2Rpc2NvdmVyeV8pOwotICAgICAgICBpZihpbmRleCAhPSAwWEZGKSB7Ci0gICAgICAgICAgQ29kZWNRb3NDb25maWcgZW50cnkgPSBpdC0+Y29kZWNfcW9zX2NvbmZpZ19wYWlyLmF0KGluZGV4KTsKLSAgICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgaWYoY29udGV4dC0+YXR0YWNoZWRfc3RhdGUgPT0gU3RyZWFtQXR0YWNoZWRTdGF0ZTo6UEhZU0lDQUwpIHsKLSAgICAgICAgICAgIG51bV9waHlfYXR0YWNoZWQrKzsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHNhbWUgY29uZmlnIGlzIGFscmVhZHkgYXBwbGllZAotICAgICAgICAgICAgaWYoSXNDb2RlY0NvbmZpZ0VxdWFsKCZjb250ZXh0LT5jb2RlY19jb25maWcsJmVudHJ5LmNvZGVjX2NvbmZpZykpIHsKLSAgICAgICAgICAgICAgbnVtX3NhbWVfY29uZmlnX2FwcGxpZWQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyAgPDwgIiBNYXRjaGluZyBDb2RlYyBub3QgZm91bmQiOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKHJlY29uZl9zdHJlYW1zLT5zaXplKCkgPT0gbnVtX3BoeV9hdHRhY2hlZCAmJgotICAgICAgICAgbnVtX3BoeV9hdHRhY2hlZCA9PSBudW1fc2FtZV9jb25maWdfYXBwbGllZCkgewotICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlIHRvIGNvbm5lY3RlZAotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gIDw8ICIgTWFraW5nIHN0YXRlIHRvIENvbm5lY3RlZCBhcyBOb3RoaW5nIHRvIGRvIjsKLSAgICAgICAgVHJhbnNpdGlvblRvKFN0cmVhbVRyYWNrZXI6OmtTdGF0ZUNvbm5lY3RlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZihhc2NzX3N0YXRlICE9IEdhdHRTdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBmb3IgKGF1dG8gaXQgPSByZWNvbmZfc3RyZWFtcy0+YmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHJlY29uZl9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgICB1aW50OF90IGluZGV4ID0gdHJhY2tlcl8uQ2hvb3NlQmVzdENvZGVjKGl0LT5zdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdC0+Y29kZWNfcW9zX2NvbmZpZ19wYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY3NfZGlzY292ZXJ5Xyk7Ci0gICAgICAgIGlmKGluZGV4ICE9IDBYRkYpIHsKLSAgICAgICAgICBDb2RlY1Fvc0NvbmZpZyBlbnRyeSA9IGl0LT5jb2RlY19xb3NfY29uZmlnX3BhaXIuYXQoaW5kZXgpOwotICAgICAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnN0cmVhbV90eXBlKTsKLSAgICAgICAgICBDb2RlY0NvbmZpZyBjb2RlY19jb25maWcgPSBlbnRyeS5jb2RlY19jb25maWc7Ci0gICAgICAgICAgUW9zQ29uZmlnIHFvc19jb25maWcgPSBlbnRyeS5xb3NfY29uZmlnOwotCi0gICAgICAgICAgaWYoY29udGV4dC0+YXR0YWNoZWRfc3RhdGUgPT0gU3RyZWFtQXR0YWNoZWRTdGF0ZTo6VklSVFVBTCkgewotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29udGV4dCAqPiBwaHlfYXR0YWNoZWRfY29udGV4dHM7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaWQgPSBjb250ZXh0LT5zdHJlYW1faWRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWQgIT0gY29udGV4dC0+c3RyZWFtX2lkcy5lbmQoKTsgaWQrKykgewotICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db250ZXh0ICo+IHBoeV9hdHRhY2hlZF9jb250ZXh0czsKLSAgICAgICAgICAgICAgcGh5X2F0dGFjaGVkX2NvbnRleHRzID0gY29udGV4dHMtPkZpbmRCeUFzZUF0dGFjaGVkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+YXNlX2lkLCBTdHJlYW1BdHRhY2hlZFN0YXRlOjpQSFlTSUNBTCk7Ci0gICAgICAgICAgICAgIGZvciAoYXV0byBjb250ZXh0X2lkID0gcGh5X2F0dGFjaGVkX2NvbnRleHRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2lkICE9IHBoeV9hdHRhY2hlZF9jb250ZXh0cy5lbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfaWQrKykgewotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOkF0dGFjaGVkIHN0YXRlIG1hZGUgdmlydHVhbCI7Ci0gICAgICAgICAgICAgICAgKCpjb250ZXh0X2lkKS0+YXR0YWNoZWRfc3RhdGUgPSBTdHJlYW1BdHRhY2hlZFN0YXRlOjpWSVJUVUFMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjpBdHRhY2hlZCBzdGF0ZSBtYWRlIHZpcnR1YWwgdG8gcGh5IjsKLSAgICAgICAgICAgIGNvbnRleHQtPmF0dGFjaGVkX3N0YXRlID0gU3RyZWFtQXR0YWNoZWRTdGF0ZTo6VklSX1RPX1BIWTsKLSAgICAgICAgICAgIGNvbnRleHQtPmNvZGVjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZzsKLSAgICAgICAgICAgIGNvbnRleHQtPnJlcV9xb3NfY29uZmlnID0gcW9zX2NvbmZpZzsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQtPmF0dGFjaGVkX3N0YXRlID09IFN0cmVhbUF0dGFjaGVkU3RhdGU6OlBIWVNJQ0FMKSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjpBdHRhY2hlZCBzdGF0ZSBpcyBwaHlzaWNhbCI7Ci0gICAgICAgICAgICAvLyBjaGVjayBpZiBzYW1lIGNvbmZpZyBpcyBhbHJlYWR5IGFwcGxpZWQKLSAgICAgICAgICAgIGlmKElzQ29kZWNDb25maWdFcXVhbCgmY29udGV4dC0+Y29kZWNfY29uZmlnLCZlbnRyeS5jb2RlY19jb25maWcpKSB7Ci0gICAgICAgICAgICAgIGlmKGl0LT5yZWNvbmZfdHlwZSA9PSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRykgewotICAgICAgICAgICAgICAgIGl0LT5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6UU9TX0NPTkZJRzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgY29udGV4dC0+Y29kZWNfY29uZmlnID0gY29kZWNfY29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC0+cmVxX3Fvc19jb25maWcgPSBxb3NfY29uZmlnOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHVpbnQ4X3QgYXNjc19jb25maWdfaW5kZXggPSAwOwotICAgICAgICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWQgIT0gY29udGV4dC0+c3RyZWFtX2lkcy5lbmQoKTsgaWQrKykgewotICAgICAgICAgICAgaW50X3N0cm1fdHJhY2tlcnNfLkZpbmRPckFkZEJ5dHJhY2tlclR5cGUoaXQtPnN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgaWQtPmFzZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHFvc19jb25maWcuYXNjc19jb25maWdzW2FzY3NfY29uZmlnX2luZGV4XS5jaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBxb3NfY29uZmlnLmFzY3NfY29uZmlnc1thc2NzX2NvbmZpZ19pbmRleF0uY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgcW9zX2NvbmZpZyk7Ci0gICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbSkgewotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmVhbS0+Y2lnX2lkID0gaWQtPmNpZ19pZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbYXNjc19jb25maWdfaW5kZXhdLmNpZ19pZDsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lzX2lkID0gaWQtPmNpc19pZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbYXNjc19jb25maWdfaW5kZXhdLmNpc19pZDsKLSAgICAgICAgICAgIHN0cmVhbS0+Y2lnX3N0YXRlID0gQ2lnU3RhdGU6OklOVkFMSUQ7Ci0gICAgICAgICAgICBzdHJlYW0tPmNpc19zdGF0ZSA9IENpc1N0YXRlOjpJTlZBTElEOwotICAgICAgICAgICAgc3RyZWFtLT5jb2RlY19jb25maWcgPSBjb2RlY19jb25maWc7Ci0gICAgICAgICAgICBzdHJlYW0tPnJlcV9xb3NfY29uZmlnID0gcW9zX2NvbmZpZzsKLSAgICAgICAgICAgIHN0cmVhbS0+cW9zX2NvbmZpZyA9IHFvc19jb25maWc7Ci0gICAgICAgICAgICBzdHJlYW0tPmF1ZGlvX2NvbnRleHQgPSBpdC0+c3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dDsKLSAgICAgICAgICAgIGFzY3NfY29uZmlnX2luZGV4Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICIgTWF0Y2hpbmcgQ29kZWMgbm90IGZvdW5kIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgaXQgIT0gcmVjb25mX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIGlmIChpdC0+cmVjb25mX3R5cGUgPT0gU3RyZWFtUmVjb25maWdUeXBlOjpRT1NfQ09ORklHKSB7Ci0gICAgICAgICAgcW9zX3JlY29uZmlncysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKHFvc19yZWNvbmZpZ3MgPT0gbnVtX3JlY29uZl9zdHJlYW1zKSB7Ci0gICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIGdyb3VwCi0gICAgICAgIHN0ZDo6dmVjdG9yPEludFN0cm1UcmFja2VyICo+ICphbGxfdHJhY2tlcnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9zdHJtX3RyYWNrZXJzXy5HZXRUcmFja2VyTGlzdCgpOwotICAgICAgICAvLyBjaGVjayBmb3IgYWxsIHN0cmVhbXMgdG9nZXRoZXIgc28gdGhhdCBmaW5hbCBncm91cCBwYXJhbXMKLSAgICAgICAgLy8gd2lsbCBiZSBkZWNpZGVkLgotICAgICAgICBmb3IgKGF1dG8gaSA9IGFsbF90cmFja2Vycy0+YmVnaW4oKTsgaSAhPSBhbGxfdHJhY2tlcnMtPmVuZCgpO2krKykgewotICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZCgoKmkpLT5hc2VfaWQpOwotICAgICAgICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fICA8PCAic3RyZWFtIGlzIG51bGwiOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyYWNrZXJfLkNob29zZUJlc3RRb3MoJnN0cmVhbS0+cmVxX3Fvc19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLT5wcmVmX3Fvc19wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLT5xb3NfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHJhY2tlcjo6a1N0YXRlUmVjb25maWd1cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+ZGlyZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICB0cmFja2VyXy5DaGVja0FuZFNlbmRRb3NDb25maWcoJmludF9zdHJtX3RyYWNrZXJzXyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBub3cgc2VuZCB0aGUgQVNDUyBjb2RlYyBjb25maWcKLSAgICAgICAgc3RkOjp2ZWN0b3I8QXNlQ29kZWNDb25maWdPcD4gYXNlX29wczsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gcmVjb25mX3N0cmVhbXMtPmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHJlY29uZl9zdHJlYW1zLT5lbmQoKTsgaXQrKykgewotICAgICAgICAgIGlmKGl0LT5yZWNvbmZfdHlwZSA9PSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRykgewotICAgICAgICAgICAgU3RyZWFtQ29udGV4dCAqY29udGV4dCA9IGNvbnRleHRzLT5GaW5kT3JBZGRCeVR5cGUoaXQtPnN0cmVhbV90eXBlKTsKLSAgICAgICAgICAgIGZvciAoYXV0byBpZCA9IGNvbnRleHQtPnN0cmVhbV9pZHMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICBpZCAhPSBjb250ZXh0LT5zdHJlYW1faWRzLmVuZCgpOyBpZCsrKSB7Ci0gICAgICAgICAgICAgIFVjYXN0QXVkaW9TdHJlYW0gKnN0cmVhbSA9IGF1ZGlvX3N0cm1zLT5GaW5kQnlBc2VJZChpZC0+YXNlX2lkKTsKLSAgICAgICAgICAgICAgaWYgKHN0cmVhbSkgewotICAgICAgICAgICAgICAgIHRyYWNrZXJfLlByZXBhcmVDb2RlY0NvbmZpZ1BheWxvYWQoJmFzZV9vcHMsIHN0cmVhbSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZighYXNlX29wcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fICA8PCAiOiBHb2luZyBGb3IgQVNDUyBDb2RlY0NvbmZpZyBvcCI7Ci0gICAgICAgICAgYXNjc19jbGllbnQtPkNvZGVjQ29uZmlnKEFTQ1NfQ0xJRU5UX0lELAotICAgICAgICAgICAgICAgICAgICAgICBzdHJtX21ncl8tPkdldEFkZHJlc3MoKSwgYXNlX29wcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlcyB0byBjb25uZWN0aW5nIG9yIG90aGVyIGludGVybmFsIHN0YXRlcwotICAgICAgICBmb3IgKGF1dG8gaXQgPSByZWNvbmZfc3RyZWFtcy0+YmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gcmVjb25mX3N0cmVhbXMtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgaWYoaXQtPnJlY29uZl90eXBlID09IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHKSB7Ci0gICAgICAgICAgICBTdHJlYW1Db250ZXh0ICpjb250ZXh0ID0gY29udGV4dHMtPkZpbmRPckFkZEJ5VHlwZShpdC0+c3RyZWFtX3R5cGUpOwotICAgICAgICAgICAgZm9yIChhdXRvIGlkID0gY29udGV4dC0+c3RyZWFtX2lkcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgIGlkICE9IGNvbnRleHQtPnN0cmVhbV9pZHMuZW5kKCk7IGlkKyspIHsKLSAgICAgICAgICAgICAgVWNhc3RBdWRpb1N0cmVhbSAqc3RyZWFtID0gYXVkaW9fc3RybXMtPkZpbmRCeUFzZUlkKGlkLT5hc2VfaWQpOwotICAgICAgICAgICAgICBpZiAoc3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLT5hc2VfcGVuZGluZ19jbWQgPSBBc2NzUGVuZGluZ0NtZDo6Q09ERUNfQ09ORklHX0lTU1VFRDsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVSZWNvbmZpZ3VyaW5nOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmVhbUNvbnRleHQgKmNvbnRleHQgPSBjb250ZXh0cy0+RmluZE9yQWRkQnlUeXBlKGl0LT5zdHJlYW1fdHlwZSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaWQgPSBjb250ZXh0LT5zdHJlYW1faWRzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWQgIT0gY29udGV4dC0+c3RyZWFtX2lkcy5lbmQoKTsgaWQrKykgewotICAgICAgICAgICAgICBVY2FzdEF1ZGlvU3RyZWFtICpzdHJlYW0gPSBhdWRpb19zdHJtcy0+RmluZEJ5QXNlSWQoaWQtPmFzZV9pZCk7Ci0gICAgICAgICAgICAgIGlmIChzdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPm92ZXJhbGxfc3RhdGUgPSBTdHJlYW1UcmFja2VyOjprU3RhdGVSZWNvbmZpZ3VyaW5nOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVNDU19BU0VfU1RBVEVfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVBc2VTdGF0ZUV2ZW50KHBfZGF0YSwgU3RyZWFtQ29udHJvbFR5cGU6OlJlY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50X3N0cm1fdHJhY2tlcnNfKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBU0NTX0FTRV9PUF9GQUlMRURfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5IYW5kbGVBc2VPcEZhaWxlZEV2ZW50KHBfZGF0YSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgUEFDU19DT05ORUNUSU9OX1NUQVRFX0VWVDogewotICAgICAgdHJhY2tlcl8uSGFuZGxlUGFjc0Nvbm5lY3Rpb25FdmVudChwX2RhdGEpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFTQ1NfQ09OTkVDVElPTl9TVEFURV9FVlQ6IHsKLSAgICAgIHRyYWNrZXJfLkhhbmRsZUFzY3NDb25uZWN0aW9uRXZlbnQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCQVBfVElNRV9PVVRfRVZUOiB7Ci0gICAgICB0cmFja2VyXy5PblRpbWVvdXQocF9kYXRhKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbi1oYW5kbGVkIGV2ZW50OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdHJhY2tlcl8uR2V0RXZlbnROYW1lKGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdWNhc3QKLX0gIC8vIG5hbWVzcGFjZSBiYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY2MvYnRhX2NjX21haW4uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2NjL2J0YV9jY19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRlYmNjLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY2MvYnRhX2NjX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpcyB0aGUgbWFpbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciB0aGUgQlRBICBMRSBhdWRpbyBjYWxsIEdhdGV3YXkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGFfY2NfYXBpLmgiCi0jaW5jbHVkZSAiZ2F0dHNfb3BzX3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRtX2ludC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgImJ0YV9zeXMuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWFwPgotCi0jZGVmaW5lIE1BWF9VUklfU0laRSA1MAotI2RlZmluZSBTVEFOREFSRF9CRUFSRVJfVUNJICJ1bjAwMCIKLSNkZWZpbmUgTVNfSU5fU0VDIDEwMDAKLSNkZWZpbmUgQ0NTX0RFRkFVTFRfSU5ERVhfVkFMIDAKLSNkZWZpbmUgREVGQVVMVF9JTkRJQ0lFU19DT1VOVCAxCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpHYXR0c09wc1F1ZXVlOwotY2xhc3MgQ2FsbENvbnRyb2xsZXJJbXBsOwotc3RhdGljIENhbGxDb250cm9sbGVySW1wbCAqY2NfaW5zdGFuY2U7Ci1zdGF0aWMgYm9vbCBnSXNUZXJtaW5hdGVkSW5pdGlhdGVkRnJvbUNsaWVudCA9IGZhbHNlOwotc3RhdGljIGludCBnVGVybWluYXRlSW50aWF0ZWRJbmRleCA9IDA7Ci1zdGF0aWMgYm9vbCBnSXNBY3RpdmVDQyA9IGZhbHNlOwotCi0vL0dUQlMgVVVJRCAoNEI6IFRCUywgNEM6IEdUQlMpCi1VdWlkIENBTExfQ09OVFJPTF9TRVJWRVJfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAxODRDLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotCi1VdWlkIEdUQlNfQ0FMTF9CRUFSRVJfTkFNRV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYjMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfQkVBUkVSX1VDSSA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYmI0LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotVXVpZCBHVEJTX0JFQVJFUl9URUNITk9MT0dZID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYjUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfQkVBUkVSX1VSSV9TQ0hFTUVTID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYjYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfU0lHTkFMX1NUUkVOR1RIID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYjctMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfU0lHTkFMX1NUUkVOR1RIX1JFUE9SVElOVEVSVkFMID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYjgtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfQkVBUkVSX0xJU1RfQ1VSUkVOVF9DQUxMUyA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYmI5LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotVXVpZCBHVEJTX0NPTlRFTlRfQ09OVFJPTElEID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYmEtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfQ0FMTF9TVEFUVVNfRkxBR1MgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMmJiYi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLVV1aWQgR1RCU19JTkNPTUlOR0NBTExfVEFSR0VUX1VSSSA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYmJjLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotVXVpZCBHVEJTX0NBTExfU1RBVEVfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyYmJkLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwotVXVpZCBHVEJTX0NBTExfQ09OVFJPTF9QT0lOVF9PUFMgPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMmJiZS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLVV1aWQgR1RCU19DQUxMX0NPTlRST0xfUE9JTlRfT1BUSU9OQUxfT1BTID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYmYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfQ0FMTF9URVJNSU5BVElPTl9SRUFTT04gPSBVdWlkOjpGcm9tU3RyaW5nKCIwMDAwMmJjMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKLVV1aWQgR1RCU19JTkNPTUlOR19DQUxMID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYzEtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci1VdWlkIEdUQlNfQ0FMTF9GUklFTkRMWV9OQU1FID0gVXVpZDo6RnJvbVN0cmluZygiMDAwMDJiYzItMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7Ci0KLQotVXVpZCBHVEJTX0RFU0NSSVBUT1JfVVVJRCA9IFV1aWQ6OkZyb21TdHJpbmcoIjAwMDAyOTAyLTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOwotCi0vL2dsb2JhbCB2YXJpYmFsZQotQ2NzQ29udHJvbFNlcnZpY2VJbmZvX3QgY2NzQ29udHJvbFNlcnZpY2VJbmZvOwotdENDU19DQUxMX1NUQVRFIENhbGxTdGF0ZUluZm87Ci1zdGQ6Om1hcDx1aW50OF90LCB0Q0NTX0NBTExfU1RBVEU+IENhbGxTdGF0ZWxpc3Q7Ci1zdGQ6Om1hcDx1aW50OF90LCB0Q0NTX0JFQVJFUl9MSVNUX0NVUlJFTlRfQ0FMTFM+IEJsY2NJbmZvbGlzdDsKLXRDQ1NfQ0FMTF9DT05UUk9MX1BPSU5UIENhbGxDb250cm9sbGVyT3BzOwotdENDU19DQUxMX0NPTlRST0xfUkVTUE9OU0UgQ2FsbENvbnRyb2xsZXJSZXNwOwotdENDU19CRUFSRVJfTElTVF9DVVJSRU5UX0NBTExTIEJsY2NJbmZvOwotdENDU19CRUFSRVJfUFJPVklERVJfSU5GTyAgQmVhcmVyUHJvdmlkZXJJbmZvOwotdENDU19DT05URU5UX0NPTlRST0xfSUQgQ2NpZEluZm87Ci10Q0NTX1NUQVRVU19GTEFHUyBTdGF0dXNGbGFnczsKLXRDQ1NfSU5DT01JTkdfQ0FMTCBJbmNvbWluZ0NhbGxJbmZvOwotdENDU19JTkNPTUlOR19DQUxMX1VSSSBJbmNvbWluZ0NhbGxUYXJnZXRVcmk7Ci10Q0NTX1RFUk1fUkVBU09OIFRlcm1pbmF0aW9uUmVhc29uOwotdENDU19GUklFTkRMWV9OQU1FIEZyaWVuZGx5TmFtZTsKLXRDQ1NfU1VQUF9PUFRJT05BTF9PUENPREVTIFN1cHBvcnRlZE9wdGlvbmFsT3Bjb2RlczsKLQotdm9pZCBCVENjQ2JhY2sodEJUQV9HQVRUU19FVlQgZXZlbnQsIHRCVEFfR0FUVFMqIHBhcmFtKTsKLXZvaWQgUmV2ZXJzZUJ5dGVPcmRlcih1bnNpZ25lZCBjaGFyIHNbXSwgaW50IGxlbmd0aCk7Ci0KLXR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IHN0YXR1cywgaW50IHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT25HdGJzU2VydmljZUFkZGVkOwotCi1zdGF0aWMgdm9pZCBPbkd0YnNTZXJ2aWNlQWRkZWRDYih1aW50OF90IHN0YXR1cywgaW50IHNlcnZlcklmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSk7Ci0KLWNvbnN0IGNoYXIqIGJ0YV9jY19ldmVudF9zdHIodWludDMyX3QgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX05PTkVfRVZFTlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0lOSVRfRVZFTlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0NMRUFOVVBfRVZFTlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0NBTExfU1RBVEVfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19CRUFSRVJfTkFNRV9VUERBVEUpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0JFQVJFUl9VQ0lfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19CRUFSRVJfVVJJX1NDSEVNRVNfU1VQUE9SVEVEKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19VUERBVEUpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX09QVF9PUENPREVTKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19CRUFSRVJfQ1VSUkVOVF9DQUxMX0xJU1RfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19CRUFSRVJfU0lHTkFMX1NUUkVOR1RIX1VQREFURSkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfU0lHTkFMX1NUUkVOR1RIX1JFUE9SVF9JTlRFUlZBTCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfU1RBVFVTX0ZMQUdTX1VQREFURSkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfSU5DT01JTkdfQ0FMTF9VUERBVEUpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0lOQ09NSU5HX1RBUkdFVF9VUklfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19URVJNSU5BVElPTl9SRUFTT05fVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19CRUFSRVJfVEVDSE5PTE9HWV9VUERBVEUpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0NDSURfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19BQ1RJVkVfREVWSUNFX1VQREFURSkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfQ0FMTF9DT05UUk9MX1JFU1BPTlNFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19OT1RJRllfQUxMKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19XUklURV9SU1ApCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX1JFQURfUlNQKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19ERVNDUklQVE9SX1dSSVRFX1JTUCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfREVTQ1JJUFRPUl9SRUFEX1JTUCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfQ09OTkVDVElPTikKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfRElTQ09OTkVDVElPTikKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfQ09OTkVDVElPTl9VUERBVEUpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ0NTX0NPTkdFU1RJT05fVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19QSFlfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19NVFVfVVBEQVRFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENDU19TRVRfQUNUSVZFX0RFVklDRSkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfQ09OTkVDVElPTl9DTE9TRV9FVkVOVCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDQ1NfQk9ORF9TVEFURV9DSEFOR0VfRVZFTlQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoY2hhciopIlVua25vd24gYnRhIGNjIGV2ZW50IjsKLSAgfQotfQotCi0KLWNsYXNzIENhbGxDb250cm9sbGVyRGV2aWNlcyB7Ci0gcHJpdmF0ZToKLSAgIENhbGxBY3RpdmVEZXZpY2UgYWN0aXZlRGV2aWNlOwotICAgLy9pbnQgbWF4X2Nvbm5lY3Rpb247Ci0gcHVibGljOgotICBib29sIEFkZChDYWxsQ29udHJvbGxlckRldmljZUxpc3QgZGV2aWNlKSB7Ci0gICAgaWYgKGRldmljZXMuc2l6ZSgpID09IE1BWF9DQ1NfQ09OTkVDVElPTikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoRmluZEJ5QWRkcmVzcyhkZXZpY2UucGVlcl9iZGEpICE9IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLQotICAgIGRldmljZS5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW0NDU19ESVNDT05ORUNURURdID0gRGV2aWNlU3RhdGVEaXNjb25uZWN0ZWRIYW5kbGVyOwotICAgIGRldmljZS5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW0NDU19DT05ORUNURURdID0gRGV2aWNlU3RhdGVDb25uZWN0aW9uSGFuZGxlcjsKLSAgICBkZXZpY2Uuc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbCA9IDA7Ci0gICAgc3RkOjpzdHJpbmcgYWxhcm1OYW1lID0gZGV2aWNlLnBlZXJfYmRhLlRvU3RyaW5nKCk7Ci0gICAgYWxhcm1OYW1lLmFwcGVuZCgiLUNDX1NTUmVwb3J0aW5nVGltZXIiKTsKLQotICAgIGRldmljZS5zaWduYWxfc3RyZW5ndGhfcmVwb3J0aW5nX3RpbWVyID0gYWxhcm1fbmV3X3BlcmlvZGljKGFsYXJtTmFtZS5jX3N0cigpKTsKLSAgICBkZXZpY2VzLnB1c2hfYmFjayhkZXZpY2UpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBSZW1vdmUoUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIGZvciAoYXV0byBpdCA9IGRldmljZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlcy5lbmQoKTspIHsKLSAgICAgIGlmIChpdC0+cGVlcl9iZGEgIT0gYWRkcmVzcykgewotICAgICAgICArK2l0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChpdCA9PSBkZXZpY2VzLmVuZCgpKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCJubyBtYXRjaGluZyBkZXZpY2UiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvL0NhbmNlbCBTU1JlcG9ydGluZyB0aW1lcgotICAgICAgaWYgKGl0LT5zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsICE9IDAgJiYKLSAgICAgICAgICBpdC0+c2lnbmFsX3N0cmVuZ3RoX3JlcG9ydGluZ190aW1lciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgYWxhcm1fY2FuY2VsKGl0LT5zaWduYWxfc3RyZW5ndGhfcmVwb3J0aW5nX3RpbWVyKTsKLSAgICAgICAgYWxhcm1fZnJlZShpdC0+c2lnbmFsX3N0cmVuZ3RoX3JlcG9ydGluZ190aW1lcik7Ci0gICAgICB9Ci0KLSAgICAgIGl0ID0gZGV2aWNlcy5lcmFzZShpdCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFJlbW92ZURldmljZXMoKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VzLmVuZCgpOykgewotICAgICAgIGl0ID0gZGV2aWNlcy5lcmFzZShpdCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCogRmluZEJ5QWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXMuYmVnaW4oKSwgZGV2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZhZGRyZXNzXShjb25zdCBDYWxsQ29udHJvbGxlckRldmljZUxpc3QmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UucGVlcl9iZGEgPT0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gKGl0ZXIgPT0gZGV2aWNlcy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QqIEZpbmRCeUNvbm5JZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXMuYmVnaW4oKSwgZGV2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZjb25uX2lkXShjb25zdCBDYWxsQ29udHJvbGxlckRldmljZUxpc3QmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuY29ubl9pZCA9PSBjb25uX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKGRldmljZXMuc2l6ZSgpKTsgfQotCi0gIHN0ZDo6dmVjdG9yPENhbGxDb250cm9sbGVyRGV2aWNlTGlzdD4gR2V0UmVtb3RlRGV2aWNlcygpIHsKLSAgICByZXR1cm4gZGV2aWNlczsKLSAgfQotICBzdGQ6OnZlY3RvcjxDYWxsQ29udHJvbGxlckRldmljZUxpc3Q+IEZpbmROb3RpZnlEZXZpY2VzKHVpbnQxNl90IGhhbmRsZSkgewotICAgIHN0ZDo6dmVjdG9yPENhbGxDb250cm9sbGVyRGV2aWNlTGlzdD4gbm90aWZ5X2RldmljZXM7Ci0gICAgZm9yIChzaXplX3QgaXQgPSAwOyBpdCAhPSBkZXZpY2VzLnNpemUoKTsgaXQrKyl7Ci0gICAgICBpZihjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3Byb3ZpZGVyX25hbWVfaGFuZGxlID09IGhhbmRsZSAmJgotICAgICAgICBkZXZpY2VzW2l0XS5iZWFyZXJfcHJvdmlkZXJfbmFtZV9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3RlY2hub2xvZ3lfaGFuZGxlID09IGhhbmRsZSAmJgotICAgICAgICBkZXZpY2VzW2l0XS5iZWFyZXJfdGVjaG5vbG9neV9jaGFuZ2VkX25vdGlmeSkgewotICAgICAgICBub3RpZnlfZGV2aWNlcy5wdXNoX2JhY2soZGV2aWNlc1tpdF0pOwotICAgICAgfSBlbHNlIGlmKGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX2hhbmRsZSA9PSBoYW5kbGUgJiYKLSAgICAgICAgZGV2aWNlc1tpdF0uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2hhbmRsZSA9PSBoYW5kbGUgJiYKLSAgICAgICAgZGV2aWNlc1tpdF0uYmVhcmVyX2N1cnJlbnRfY2FsbHNfbGlzdF9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9zdGF0dXNfZmxhZ3NfaGFuZGxlID09IGhhbmRsZSAmJgotICAgICAgICBkZXZpY2VzW2l0XS5zdGF0dXNfZmxhZ3Nfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYoY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfdGFyZ2V0X2JlYXJlcnVyaV9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLmluY29taW5nX2NhbGxfdGFyZ2V0X1VSSV9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9zdGF0ZV9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLmNhbGxfc3RhdGVfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYoY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfY29udHJvbF9wb2ludF9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLmNhbGxfY29udHJvbF9wb2ludF9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25faGFuZGxlID09IGhhbmRsZSAmJgotICAgICAgICBkZXZpY2VzW2l0XS5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihjY3NDb250cm9sU2VydmljZUluZm8uaW5jb21pbmdfY2FsbF9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLmluY29taW5nX2NhbGxfc3RhdGVfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYoY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfZnJpZW5kbHlfbmFtZV9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLmNhbGxfZnJpZW5kbHlfbmFtZV9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5vdGlmeV9kZXZpY2VzOwotICB9Ci0gIHZvaWQgQWRkU2V0QWN0aXZlRGV2aWNlKHRDQ1NfU0VUX0FDVElWRV9ERVZJQ0UgKmRldmljZSkgewotICAgIGlmIChkZXZpY2UtPnNldF9pZCA9PSBhY3RpdmVEZXZpY2Uuc2V0X2lkKSB7Ci0gICAgICBhY3RpdmVEZXZpY2UuYWRkcmVzcy5wdXNoX2JhY2soZGV2aWNlLT5hZGRyZXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgYWN0aXZlRGV2aWNlLmFkZHJlc3MuY2xlYXIoKTsKLSAgICAgIGFjdGl2ZURldmljZS5zZXRfaWQgPSBkZXZpY2UtPnNldF9pZDsKLSAgICAgIGFjdGl2ZURldmljZS5hZGRyZXNzLnB1c2hfYmFjayhkZXZpY2UtPmFkZHJlc3MpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgRmluZEFjdGl2ZURldmljZShDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKnJlbW90ZURldmljZSkgewotICAgIGJvb2wgZmxhZyA9IGZhbHNlOwotICAgIGZvciAoYXV0byYgaXQgOiBhY3RpdmVEZXZpY2UuYWRkcmVzcykgewotICAgICAgaWYocmVtb3RlRGV2aWNlLT5wZWVyX2JkYSA9PSBpdCkgewotICAgICAgICBmbGFnID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmbGFnOwotICB9Ci0gIHN0YXRpYyB2b2lkIFNTUmVwb3J0aW5nVGltZXJFeHBpcmVkKHZvaWQgKmRhdGEpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA7Ci0gICAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0KiBkZXYgPSAoQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0KilkYXRhOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJubyB2YWxpZCBkZXYgaGFuZGxlIjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vc2VuZCBOb3RpZmljYXRpb24gZm9yIFNpZ25hbCBTdHJlbmd0aAotICAgIHRjY19yZXNwX3QgKnJzcCA9IG5ldyB0Y2NfcmVzcF90KCk7Ci0gICAgaWYgKHJzcCA9PSBOVUxMKSB7Ci0gICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiQWxsb2NhdGlvbiBlcnJvciEiOwotICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gX2RhdGE7Ci0gICAgX2RhdGEuY2xlYXIoKTsKLSAgICByc3AtPnJlbW90ZURldmljZSA9IGRldjsKLSAgICByc3AtPmV2ZW50ID0gQ0NTX05PVElGWV9BTEw7Ci0gICAgcnNwLT5oYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9oYW5kbGU7Ci0gICAgX2RhdGEucHVzaF9iYWNrKEJlYXJlclByb3ZpZGVySW5mby5zaWduYWwpOwotICAgIHJzcC0+b3Blci5DYWxsQ29udHJvbGxlck9wLmRhdGEgPSBzdGQ6Om1vdmUoX2RhdGEpOwotICAgIC8vZm9yY2UgdGhlIE5vdGlmaWNhdGlvbiBvbiB0aW1lciBleHBpcnkKLSAgICByc3AtPmZvcmNlID0gdHJ1ZTsKLQotICAgIGlmIChkZXYtPmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfbm90aWZ5KSB7Ci0gICAgICAgTE9HKElORk8pIDw8ICJDYWxpbmcgZGV2aWNlIHN0YXRlIGhhbmRsZXIgZm9yIFNTUmVwb3J0aW5nIjsKLSAgICAgICBkZXYtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2LT5zdGF0ZV0oQ0NTX05PVElGWV9BTEwsIHJzcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBMT0coSU5GTykgPDwgIlNTUmVwb3J0aW5nIEludGVydmFsIHNldCB3aXRob3V0IERlc2Mgd3JpdGUgZm9yIFNTUiI7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHZvaWQgU2V0dXBTU1JlcG9ydGluZ0ludGVydmFsIChDYWxsQ29udHJvbGxlckRldmljZUxpc3QqIGRldikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA7Ci0gICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChkZXYtPnNpZ25hbF9zdHJlbmd0aF9yZXBvcnRpbmdfdGltZXIpKSB7Ci0gICAgICAgYWxhcm1fY2FuY2VsKGRldi0+c2lnbmFsX3N0cmVuZ3RoX3JlcG9ydGluZ190aW1lcik7Ci0gICAgfQotICAgIGlmIChkZXYtPnNpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWwgIT0gMCkgewotICAgICAgIGFsYXJtX3NldChkZXYtPnNpZ25hbF9zdHJlbmd0aF9yZXBvcnRpbmdfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIChwZXJpb2RfbXNfdClkZXYtPnNpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWwqTVNfSU5fU0VDLAotICAgICAgICAgICAgICAgICAgICAgICBTU1JlcG9ydGluZ1RpbWVyRXhwaXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWRldik7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBVcGRhdGVTU1JlcG9ydGluZ0ludGVydmFsKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgc3NySW50ZXJ2YWwpIHsKLSAgICAgIGJvb2wgcmV0ID0gZmFsc2U7Ci0gICAgICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKmRldiA9IEZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0KLSAgICAgIGlmIChkZXYgIT0gbnVsbHB0cikgewotICAgICAgICAgZGV2LT5zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsID0gc3NySW50ZXJ2YWw7Ci0gICAgICAgICBTZXR1cFNTUmVwb3J0aW5nSW50ZXJ2YWwoZGV2KTsKLSAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0PiBkZXZpY2VzOwotfTsKLQotCi1jbGFzcyBDYWxsQ29udHJvbGxlckltcGwgOiBwdWJsaWMgQ2FsbENvbnRyb2xsZXIgewotICBibHVldG9vdGg6OmNhbGxfY29udHJvbDo6Q2FsbENvbnRyb2xsZXJDYWxsYmFja3MqIGNhbGxiYWNrczsKLSAgVXVpZCBhcHBfdXVpZDsKLSAgaW50IG1heF9jbGllbnRzOwotICBib29sIGluYmFuZF9yaW5nX3N1cHBvcnQ7Ci0KLSAgcHVibGljOgotICAgICBDYWxsQ29udHJvbGxlckRldmljZXMgcmVtb3RlRGV2aWNlczsKLSAgICAgdmlydHVhbCB+Q2FsbENvbnRyb2xsZXJJbXBsKCkgPSBkZWZhdWx0OwotCi0KLSAgQ2FsbENvbnRyb2xsZXJJbXBsKGJsdWV0b290aDo6Y2FsbF9jb250cm9sOjpDYWxsQ29udHJvbGxlckNhbGxiYWNrcyogY2FsbGJhY2ssCi0gICAgICAgICAgICAgIFV1aWQgdXVpZCwgaW50IG1heF9jY3NfY2xpZW50cywgYm9vbCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKQotICAgICAgICA6Y2FsbGJhY2tzKGNhbGxiYWNrKSwKLSAgICAgYXBwX3V1aWQodXVpZCksCi0gICAgIG1heF9jbGllbnRzKG1heF9jY3NfY2xpZW50cyksCi0gICAgIGluYmFuZF9yaW5nX3N1cHBvcnQoaW5iYW5kX3JpbmdpbmdfZW5hYmxlZCkgIHsKLSAgICAvLyBIYW5kbGVDY3NFdmVudChDQ1NfSU5JVF9FVkVOVCwgJmFwcF91dWlkKTsKLSAgICBMT0coSU5GTykgPDwgIm1heF9jbGllbnRzICIgPDwgbWF4X2NsaWVudHM7Ci0gICAgIGlmIChpbmJhbmRfcmluZ19zdXBwb3J0KSB7Ci0gICAgICAgU3RhdHVzRmxhZ3Muc3VwcG9ydGVkX2ZsYWdzID0gIChTdGF0dXNGbGFncy5zdXBwb3J0ZWRfZmxhZ3MgJiAweDAwMDApIHwgSU5CQU5EX1JJTkdUT05FX0ZFQVRVUkVfQklUOwotICAgICB9IGVsc2UgewotICAgICAgIFN0YXR1c0ZsYWdzLnN1cHBvcnRlZF9mbGFncyA9IDB4MDAwMDsKLSAgICAgfQotICAgICBMT0coSU5GTykgPDwgIkNhbGxDb250cm9sbGVySW1wbCBnYXR0cyBhcHAgcmVnaXN0ZXIiOwotICAgICBCVEFfR0FUVFNfQXBwUmVnaXN0ZXIoYXBwX3V1aWQsIEJUQ2NDYmFjaywgdHJ1ZSk7Ci0KLSAgfQotCi0gdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgdENDU19DT05ORUNUSU9OX0NMT1NFIENvbm5lY3RDbG9zaW5nT3A7Ci0gICAgQ29ubmVjdENsb3NpbmdPcC5hZGRyID0gYmRfYWRkcjsKLSAgICBIYW5kbGVDY3NFdmVudChDQ1NfQ09OTkVDVElPTl9DTE9TRV9FVkVOVCwgJkNvbm5lY3RDbG9zaW5nT3ApOwotIH0KLQotIHZvaWQgU2V0QWN0aXZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBzZXRJZCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA7Ci0gICAgdENDU19TRVRfQUNUSVZFX0RFVklDRSBTZXRBY3RpdmVEZXZpY2VPcDsKLSAgICBTZXRBY3RpdmVEZXZpY2VPcC5zZXRfaWQgPSBzZXRJZDsKLSAgICBTZXRBY3RpdmVEZXZpY2VPcC5hZGRyZXNzID0gYWRkcmVzczsKLSAgICBIYW5kbGVDY3NFdmVudChDQ1NfQUNUSVZFX0RFVklDRV9VUERBVEUsICZTZXRBY3RpdmVEZXZpY2VPcCk7Ci0gIH0KLQotICB2b2lkIENhbGxTdGF0ZShpbnQgbGVuLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjYWxsX3N0YXRlX2xpc3QpIHsKLSAgICB0Q0NTX0NBTExfU1RBVEUgQ2FsbFN0YXRlT3A7Ci0gICAgZm9yIChpbnQgaz0wOyBrPGxlbjsgaysrKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgayA8PCIgOiBpbmRleDogIiA8PCAodW5zaWduZWQpY2FsbF9zdGF0ZV9saXN0WzMqayArIDBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc3RhdGU6ICIgPDwgKHVuc2lnbmVkKSBjYWxsX3N0YXRlX2xpc3RbMyprICsgMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmbGFnczogIiA8PCAodW5zaWduZWQpIGNhbGxfc3RhdGVfbGlzdFszKmsgKyAyXTsKLSAgICAgICAgQ2FsbFN0YXRlT3AuaW5kZXggPSBjYWxsX3N0YXRlX2xpc3RbMyprICsgMF07Ci0gICAgICAgIENhbGxTdGF0ZU9wLnN0YXRlID0gY2FsbF9zdGF0ZV9saXN0WzMqayArIDFdOwotICAgICAgICBDYWxsU3RhdGVPcC5mbGFncyA9IGNhbGxfc3RhdGVfbGlzdFszKmsgKyAyXTsKLQotICAgICAgICBCbGNjSW5mby5jYWxsX2ZsYWdzID0gQ2FsbFN0YXRlT3AuZmxhZ3M7Ci0gICAgICAgIEJsY2NJbmZvLmNhbGxfaW5kZXggPSBDYWxsU3RhdGVPcC5pbmRleDsKLSAgICAgICAgQmxjY0luZm8uY2FsbF9zdGF0ZSA9IENhbGxTdGF0ZU9wLnN0YXRlOwotCi0gICAgICAgIGlmIChDYWxsU3RhdGVPcC5zdGF0ZSA9PSBDQ1NfU1RBVEVfSU5DT01JTkcpIHsKLSAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKilJbmNvbWluZ0NhbGxJbmZvLmluY29taW5nX3VyaSk7Ci0gICAgICAgICAgICBtZW1jcHkoQmxjY0luZm8uY2FsbF91cmksIEluY29taW5nQ2FsbEluZm8uaW5jb21pbmdfdXJpLCBsZW4pOwotICAgICAgICAgICAgQmxjY0luZm8ubGlzdF9sZW5ndGggPSAzICsgbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQmxjY0luZm8ubGlzdF9sZW5ndGggPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKENhbGxTdGF0ZU9wLnN0YXRlID09IENDU19TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIC8vY2xlYXIgb2ZmIHRoZSBJbmNvbWluZyBjYWxsIHJlbGF0ZWQgdGhpbmdzIGFzIHdlbGwKLSAgICAgICAgICAgIGlmIChJbmNvbWluZ0NhbGxJbmZvLmluZGV4ID09IENhbGxTdGF0ZU9wLmluZGV4KSB7Ci0gICAgICAgICAgICAgICAgSW5jb21pbmdDYWxsSW5mby5pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KEluY29taW5nQ2FsbEluZm8uaW5jb21pbmdfdXJpLCAwLCBNQVhfVVJJX0xFTkdUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoSW5jb21pbmdDYWxsVGFyZ2V0VXJpLmluZGV4ID09IENhbGxTdGF0ZU9wLmluZGV4KSB7Ci0gICAgICAgICAgICAgICAgSW5jb21pbmdDYWxsVGFyZ2V0VXJpLmluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoSW5jb21pbmdDYWxsVGFyZ2V0VXJpLmluY29taW5nX3RhcmdldF91cmksIDAsIE1BWF9VUklfTEVOR1RIKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVGVybWluYXRpb25SZWFzb24uaW5kZXggPSBDYWxsU3RhdGVPcC5pbmRleDsKLSAgICAgICAgICAgIGlmIChnSXNUZXJtaW5hdGVkSW5pdGlhdGVkRnJvbUNsaWVudCAmJgotICAgICAgICAgICAgICAgICBDYWxsU3RhdGVPcC5pbmRleCA9PSBnSXNUZXJtaW5hdGVkSW5pdGlhdGVkRnJvbUNsaWVudCkgewotICAgICAgICAgICAgICAgIFRlcm1pbmF0aW9uUmVhc29uLnJlYXNvbiA9IENDX1RFUk1fRU5EX0ZST01fQ0xJRU5UOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUZXJtaW5hdGlvblJlYXNvbi5yZWFzb24gPSBDQ19URVJNX0VORF9GUk9NX1NFUlZFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdJc1Rlcm1pbmF0ZWRJbml0aWF0ZWRGcm9tQ2xpZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBnVGVybWluYXRlSW50aWF0ZWRJbmRleCA9IDA7Ci0gICAgICAgICAgICBIYW5kbGVDY3NFdmVudChDQ1NfSU5DT01JTkdfQ0FMTF9VUERBVEUsICZJbmNvbWluZ0NhbGxJbmZvKTsKLSAgICAgICAgICAgIEhhbmRsZUNjc0V2ZW50KENDU19JTkNPTUlOR19UQVJHRVRfVVJJX1VQREFURSwgJkluY29taW5nQ2FsbFRhcmdldFVyaSk7Ci0gICAgICAgICAgICBIYW5kbGVDY3NFdmVudChDQ1NfVEVSTUlOQVRJT05fUkVBU09OX1VQREFURSwgJlRlcm1pbmF0aW9uUmVhc29uKTsKLQotICAgICAgICAgICAgLy9lcmFzZSB0aGUgZGlzY29ubmVjdGVkIEluZGljaWVzCi0gICAgICAgICAgICBCbGNjSW5mb2xpc3QuZXJhc2UoQ2FsbFN0YXRlT3AuaW5kZXgpOwotICAgICAgICAgICAgQ2FsbFN0YXRlbGlzdC5lcmFzZShDYWxsU3RhdGVPcC5pbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL2tlZXAgYXBwZW5kaW5nIHRoZSBkYXRhCi0gICAgICAgICAgICBzdGQ6Om1hcDx1aW50OF90LCB0Q0NTX0JFQVJFUl9MSVNUX0NVUlJFTlRfQ0FMTFM+OjppdGVyYXRvciBpID0gQmxjY0luZm9saXN0LmZpbmQoQmxjY0luZm8uY2FsbF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoaSAhPSBCbGNjSW5mb2xpc3QuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB1cGRhdGUgZXhpc3RpbmcgQmxjYyI7Ci0gICAgICAgICAgICAgICAgaS0+c2Vjb25kID0gQmxjY0luZm87Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJsY2NJbmZvbGlzdC5pbnNlcnQoe0JsY2NJbmZvLmNhbGxfaW5kZXgsIEJsY2NJbmZvfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGQ6Om1hcDx1aW50OF90LCB0Q0NTX0NBTExfU1RBVEU+OjppdGVyYXRvciBqID0gQ2FsbFN0YXRlbGlzdC5maW5kKENhbGxTdGF0ZU9wLmluZGV4KTsKLSAgICAgICAgICAgIGlmIChqICE9IENhbGxTdGF0ZWxpc3QuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBqLT5zZWNvbmQgPSBDYWxsU3RhdGVPcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ2FsbFN0YXRlbGlzdC5pbnNlcnQoe0NhbGxTdGF0ZU9wLmluZGV4LCBDYWxsU3RhdGVPcH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9jbGVhciB0aGUgdGVybSByZWFzb24KLSAgICAgICAgICAgIGlmIChDYWxsU3RhdGVPcC5pbmRleCA9PSBUZXJtaW5hdGlvblJlYXNvbi5pbmRleCkgewotICAgICAgICAgICAgICAgIFRlcm1pbmF0aW9uUmVhc29uLmluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBUZXJtaW5hdGlvblJlYXNvbi5yZWFzb24gPSBDQ19URVJNX0lOVkFMSURfT1JJR19VUkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSGFuZGxlQ2NzRXZlbnQoQ0NTX0NBTExfU1RBVEVfVVBEQVRFLCAmQ2FsbFN0YXRlbGlzdCk7Ci0gICAgSGFuZGxlQ2NzRXZlbnQoQ0NTX0JFQVJFUl9DVVJSRU5UX0NBTExfTElTVF9VUERBVEUsICZCbGNjSW5mb2xpc3QpOwotIH0KLQotIHZvaWQgQmVhcmVySW5mb05hbWUodWludDhfdCogbmFtZSkgewotICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8IG5hbWU7Ci0gICB0Q0NTX0JFQVJFUl9QUk9WSURFUl9JTkZPIEJlYXJlclByb3ZpZGVyT3A7Ci0gICBCZWFyZXJQcm92aWRlck9wLmxlbmd0aCA9IHN0cmxlbigoY2hhciAqKW5hbWUpOwotICAgbWVtY3B5KEJlYXJlclByb3ZpZGVyT3AubmFtZSwgbmFtZSwgQmVhcmVyUHJvdmlkZXJPcC5sZW5ndGgrMSk7Ci0gICBIYW5kbGVDY3NFdmVudChDQ1NfQkVBUkVSX05BTUVfVVBEQVRFLCAmQmVhcmVyUHJvdmlkZXJPcCk7Ci0gfQotCi0gdm9pZCBVcGRhdGVCZWFyZXJUZWNobm9sb2d5KGludCB0ZWNoX3R5cGUpIHsKLSAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHRlY2ggdHlwZTogIiA8PHRlY2hfdHlwZTsKLSAgIHRDQ1NfQkVBUkVSX1BST1ZJREVSX0lORk8gYmVhcmVyUHJvdmlkZXJPcDsKLSAgIEJlYXJlclByb3ZpZGVySW5mby50ZWNobm9sb2d5X3R5cGUgPSB0ZWNoX3R5cGU7Ci0KLSAgIEhhbmRsZUNjc0V2ZW50KENDU19CRUFSRVJfVEVDSE5PTE9HWV9VUERBVEUsICZiZWFyZXJQcm92aWRlck9wKTsKLSB9Ci0gdm9pZCBVcGRhdGVCZWFyZXJTaWduYWxTdHJlbmd0aChpbnQgc2lnbmFsKSB7Ci0gICBMT0coSU5GTykgPDwgX19mdW5jX188PCAiIHNpZ25hbDogIiA8PCBzaWduYWw7Ci0gICB0Q0NTX0JFQVJFUl9QUk9WSURFUl9JTkZPIEJlYXJlclByb3ZpZGVyT3A7Ci0gICBCZWFyZXJQcm92aWRlck9wLnNpZ25hbCA9IHNpZ25hbDsKLSAgIEhhbmRsZUNjc0V2ZW50KENDU19CRUFSRVJfU0lHTkFMX1NUUkVOR1RIX1VQREFURSwgJkJlYXJlclByb3ZpZGVyT3ApOwotIH0KLQotIHZvaWQgVXBkYXRlU3RhdHVzRmxhZ3ModWludDhfdCBzdGF0dXNfZmxhZykgewotICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc3RhdHVzX2ZsYWc6ICIgPDxzdGF0dXNfZmxhZzsKLSAgIHRDQ1NfU1RBVFVTX0ZMQUdTIFN0YXR1c0ZsYWdzT3A7Ci0gICBTdGF0dXNGbGFnc09wLnN1cHBvcnRlZF9mbGFncyA9IHN0YXR1c19mbGFnOwotICAgSGFuZGxlQ2NzRXZlbnQoQ0NTX1NUQVRVU19GTEFHU19VUERBVEUsICZTdGF0dXNGbGFnc09wKTsKLSB9Ci0KLSB2b2lkIENhbGxDb250cm9sT3B0aW9uYWxPcFN1cHBvcnRlZChpbnQgZmVhdHVyZSkgewotICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZmVhdHVyZTogIiA8PCBmZWF0dXJlOwotICAgdENDU19TVVBQX09QVElPTkFMX09QQ09ERVMgb3BTdXBwb3J0ZWRGZWF0dXJlczsKLSAgIG9wU3VwcG9ydGVkRmVhdHVyZXMuc3VwcF9vcGNvZGUgPSAodWludDE2X3QpMHgwMEZGJmZlYXR1cmU7Ci0KLSAgIEhhbmRsZUNjc0V2ZW50KENDU19PUFRfT1BDT0RFUywgJm9wU3VwcG9ydGVkRmVhdHVyZXMpOwotIH0KLQotIHZvaWQgVXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdCh1aW50OF90KiBsaXN0KSB7Ci0gICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBsaXN0OiAiIDw8bGlzdDsKLSAgIHRDQ1NfQkVBUkVSX1BST1ZJREVSX0lORk8gQmVhcmVyUHJvdmlkZXJPcDsKLSAgIEJlYXJlclByb3ZpZGVyT3AuYmVhcmVyX2xpc3RfbGVuID0gc3RybGVuKChjaGFyICopbGlzdCk7Ci0gICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBsaXN0IGxlbjoiIDw8IEJlYXJlclByb3ZpZGVyT3AuYmVhcmVyX2xpc3RfbGVuOwotICAgbWVtY3B5KEJlYXJlclByb3ZpZGVyT3AuYmVhcmVyX3NjaGVtZXNfbGlzdCwgbGlzdCwgQmVhcmVyUHJvdmlkZXJPcC5iZWFyZXJfbGlzdF9sZW4rMSk7Ci0gICBIYW5kbGVDY3NFdmVudChDQ1NfQkVBUkVSX1VSSV9TQ0hFTUVTX1NVUFBPUlRFRCwgJkJlYXJlclByb3ZpZGVyT3ApOwotIH0KLQotIHZvaWQgVXBkYXRlSW5jb21pbmdDYWxsKGludCBpbmRleCwgdWludDhfdCogVXJpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgVXJpOiAiIDw8IFVyaTsKLSAgICBzdGQ6Om1hcDx1aW50OF90LCB0Q0NTX0JFQVJFUl9MSVNUX0NVUlJFTlRfQ0FMTFM+OjppdGVyYXRvciBpdDsKLSAgICB0Q0NTX0lOQ09NSU5HX0NBTEwgSW5jb21pbmdDYWxsOwotICAgIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKilVcmkpOwotICAgIG1lbWNweShJbmNvbWluZ0NhbGwuaW5jb21pbmdfdXJpLCBVcmksIGxlbisxKTsKLSAgICBJbmNvbWluZ0NhbGwuaW5kZXggPSBpbmRleDsKLSAgICBmb3IgKGl0ID0gQmxjY0luZm9saXN0LmJlZ2luKCk7IGl0ICE9IEJsY2NJbmZvbGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgICB0Q0NTX0JFQVJFUl9MSVNUX0NVUlJFTlRfQ0FMTFMgYmxjY09iaiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgaWYgKGJsY2NPYmouY2FsbF9pbmRleCA9PSBpbmRleCkgewotICAgICAgICAgIG1lbWNweShibGNjT2JqLmNhbGxfdXJpLCBVcmksIHN0cmxlbigoY2hhciAqKVVyaSkrMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLSAgICBIYW5kbGVDY3NFdmVudChDQ1NfSU5DT01JTkdfQ0FMTF9VUERBVEUsICZJbmNvbWluZ0NhbGwpOwotICAgIC8vdXBkYXRlIFRhcmdldCBVUkkgYXMgd2VsbCB3aXRoIHNhbWUgSW5mbwotICAgIFVwZGF0ZUluY29taW5nQ2FsbFRhcmdldFVyaShpbmRleCwgVXJpKTsKLSB9Ci0KLSB2b2lkIFVwZGF0ZUluY29taW5nQ2FsbFRhcmdldFVyaShpbnQgaW5kZXgsIHVpbnQ4X3QqIHRhcmdldF91cmkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0YXJnZXRfdXJpOiAiIDw8IHRhcmdldF91cmk7Ci0gICAgdENDU19JTkNPTUlOR19DQUxMX1VSSSBJbmNvbWluZ2NhbGxVcmk7Ci0gICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXRhcmdldF91cmkpOwotICAgIG1lbWNweShJbmNvbWluZ2NhbGxVcmkuaW5jb21pbmdfdGFyZ2V0X3VyaSwgdGFyZ2V0X3VyaSwgbGVuKzEpOwotICAgIEluY29taW5nY2FsbFVyaS5pbmRleCA9IGluZGV4OwotICAgIEhhbmRsZUNjc0V2ZW50KENDU19JTkNPTUlOR19UQVJHRVRfVVJJX1VQREFURSwgJkluY29taW5nY2FsbFVyaSk7Ci0gfQotCi0gdm9pZCBDb250ZW50Q29udHJvbElkKHVpbnQzMl90IGNjaWQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgdENDU19DT05URU5UX0NPTlRST0xfSUQgQ29udGVudENvbnRyb2xJZE9wOwotICAgIENvbnRlbnRDb250cm9sSWRPcC5jY2lkID0gY2NpZDsKLSAgICBIYW5kbGVDY3NFdmVudChDQ1NfQ0NJRF9VUERBVEUsICZDb250ZW50Q29udHJvbElkT3ApOwotIH0KLQotIGludCBHZXREaWFsaW5nQ2FsbEluZGV4KCkgewotICAgIGludCByZXRJbmRleCA9IDA7Ci0gICAgc3RkOjptYXA8dWludDhfdCwgdENDU19DQUxMX1NUQVRFPjo6aXRlcmF0b3IgaXQ7Ci0gICAgIGZvciAoaXQgPSBDYWxsU3RhdGVsaXN0LmJlZ2luKCk7IGl0ICE9IENhbGxTdGF0ZWxpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgdENDU19DQUxMX1NUQVRFIG9iaiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChvYmouc3RhdGUgPT0gQ0NTX1NUQVRFX0RJQUxJTkcgfHwgb2JqLnN0YXRlID09IENDU19TVEFURV9BTEVSVElORykgewotICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsIHN0YXRlIG1hdGNoOiAiIDw8IG9iai5pbmRleDsKLSAgICAgICAgICAgcmV0SW5kZXggPSBvYmouaW5kZXg7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0SW5kZXg7Ci0gfQotIHZvaWQgQ2FsbENvbnRyb2xSZXNwb25zZSh1aW50OF90IG9wLCB1aW50OF90IGluZGV4LCB1aW50MzJfdCBzdGF0dXMsICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICB0Q0NTX0NBTExfQ09OVFJPTF9SRVNQT05TRSBDYWxsQ29udHJvbFJlc3BvbnNlOwotICAgQ2FsbENvbnRyb2xsZXJSZXNwLm9wY29kZSA9IG9wOwotICAgQ2FsbENvbnRyb2xsZXJSZXNwLnJlc3BvbnNlX3N0YXR1cyA9IHN0YXR1czsKLSAgIENhbGxDb250cm9sbGVyUmVzcC5yZW1vdGVfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICBDYWxsQ29udHJvbGxlclJlc3AuaW5kZXggPSBpbmRleDsKLSAgIGlmIChzdGF0dXMgPT0gQ0NTX1NUQVRVU19TVUNDRVNTICYmIG9wID09IENBTExfT1JJR0lOQVRFKSB7Ci0gICAgICAgLy9nZXQgcHJvcGVyIGNhbGwgSW5kZXggZm9yIGNhbGwgb3JpZ25hdGUgc3RhdHVzCi0gICAgICAgQ2FsbENvbnRyb2xsZXJSZXNwLmluZGV4ID0gR2V0RGlhbGluZ0NhbGxJbmRleCgpOwotICAgfQotICAgSGFuZGxlQ2NzRXZlbnQoQ0NTX0NBTExfQ09OVFJPTF9SRVNQT05TRSwgJkNhbGxDb250cm9sUmVzcG9uc2UpOwotIH0KLQotIHZvaWQgQ2FsbENvbnRyb2xJbml0aWFsaXplZENhbGxiYWNrKHVpbnQ4X3Qgc3RhdGUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzdGF0ZSIgPDwgc3RhdGU7Ci0gICAgY2FsbGJhY2tzLT5DYWxsQ29udHJvbEluaXRpYWxpemVkQ2FsbGJhY2soc3RhdGUpOwotICAgIGlmIChzdGF0ZSA9PSAwKSB7Ci0gICAgICAgIC8vSW5pdGlhbGl6ZSBsb2NhbCBjaGFyIHZhbHVlcwotICAgICAgICBtZW1jcHkoQmVhcmVyUHJvdmlkZXJJbmZvLnVjaSwgU1RBTkRBUkRfQkVBUkVSX1VDSSwgc3RybGVuKFNUQU5EQVJEX0JFQVJFUl9VQ0kpKTsKLSAgICB9Ci0gfQotCi0gdm9pZCBDb25uZWN0aW9uU3RhdGVDYWxsYmFjayh1aW50OF90IHN0YXRlLCAgY29uc3QgUmF3QWRkcmVzcyYgIGFkZHJlc3MpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzdGF0ZTogIiA8PCBzdGF0ZTsKLSAgICBjYWxsYmFja3MtPkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKHN0YXRlLCBhZGRyZXNzKTsKLSB9Ci0KLSB2b2lkIENhbGxDb250cm9sUG9pbnRDaGFuZ2UodWludDhfdCBvcCwgdWludDhfdCogaW5kaWNlcywgaW50IGNvdW50LCBjaGFyKiB1cmksIGNvbnN0IFJhd0FkZHJlc3MmICBhZGRyZXNzKSB7Ci0gICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG9wOiAiIDw8b3AgPDwgIiBjb3VudCA6IiA8PCBjb3VudDsKLSAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdXJpX2RhdGE7Ci0gICAgIGlmICh1cmkgIT0gTlVMTCkgewotICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8IiB1cmk9IiA8PCB1cmk7Ci0gICAgICAgICB1cmlfZGF0YS5pbnNlcnQodXJpX2RhdGEuYmVnaW4oKSwgdXJpLCB1cmkgKyBzdHJsZW4odXJpKSk7Ci0gICAgIH0KLSAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2FsbF9pbmRpY2llczsKLSAgICAgZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKLSAgICAgICAgIGNhbGxfaW5kaWNpZXMucHVzaF9iYWNrKGluZGljZXNbaV0pOwotCi0gICAgIH0KLSAgICAgY2FsbGJhY2tzLT5DYWxsQ29udHJvbENhbGxiYWNrKG9wLCBjYWxsX2luZGljaWVzLCBjb3VudCwgdXJpX2RhdGEsIGFkZHJlc3MpOwotIH0KLX07Ci0KLXZvaWQgQ2FsbENvbnRyb2xsZXI6OkNsZWFuVXAoKSB7Ci0gIEhhbmRsZUNjc0V2ZW50KENDU19DTEVBTlVQX0VWRU5ULCBOVUxMKTsKLSAgZGVsZXRlIGNjX2luc3RhbmNlOwotICBjY19pbnN0YW5jZSA9IG51bGxwdHI7Ci0gfQotCi1DYWxsQ29udHJvbGxlciogQ2FsbENvbnRyb2xsZXI6OkdldCgpIHsKLSAgQ0hFQ0soY2NfaW5zdGFuY2UpOwotICByZXR1cm4gY2NfaW5zdGFuY2U7Ci19Ci0KLXZvaWQgIENhbGxDb250cm9sbGVyOjpJbml0aWFsaXplKGJsdWV0b290aDo6Y2FsbF9jb250cm9sOjpDYWxsQ29udHJvbGxlckNhbGxiYWNrcyogY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgVXVpZCB1dWlkLCBpbnQgbWF4X2Njc19jbGllbnRzLCBib29sIGluYmFuZF9yaW5naW5nX2VuYWJsZWQpIHsKLSAgaWYgKGNjX2luc3RhbmNlKSB7Ci0gIExPRyhFUlJPUikgPDwgIkFscmVhZHkgaW5pdGlhbGl6ZWQhIjsKLSAgfSBlbHNlIHsKLSAgICAgY2NfaW5zdGFuY2UgPSBuZXcgQ2FsbENvbnRyb2xsZXJJbXBsKGNhbGxiYWNrcywgdXVpZCwgbWF4X2Njc19jbGllbnRzLCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKTsKLSAgfQotICBjaGFyIGFjdGl2ZUNDW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiZmFsc2UiOwotICBpZihvc2lfcHJvcGVydHlfZ2V0KCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmFjdGl2ZUNDIiwgYWN0aXZlQ0MsICJmYWxzZSIpICYmCi0gICAgICAgICFzdHJjbXAoYWN0aXZlQ0MsICJ0cnVlIikpIHsKLSAgICBnSXNBY3RpdmVDQyA9IHRydWU7Ci0gIH0KLX0KLQotYm9vbCBDYWxsQ29udHJvbGxlcjo6SXNDY1NlcnZpY2VSdW5uaWcoKSB7IHJldHVybiBjY19pbnN0YW5jZTsgfQotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gQ2NBZGRTZXJ2aWNlKGludCBzZXJ2ZXJfaWYpIHsKLQotICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBjY3Nfc2VydmljZXM7Ci0gIGNjc19zZXJ2aWNlcy5jbGVhcigpOwotICAvL3NlcnZpY2UKLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBzZXJ2aWNlID0ge307Ci0gIHNlcnZpY2UudXVpZCA9IENBTExfQ09OVFJPTF9TRVJWRVJfVVVJRDsKLSAgc2VydmljZS50eXBlID0gQlRHQVRUX0RCX1BSSU1BUllfU0VSVklDRTsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhzZXJ2aWNlKTsKLSAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNjc19zZXJ2aWNlX3V1aWQgPSBzZXJ2aWNlLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBiZWFyZXJfcHJvdmlkZXJfbmFtZV9jaGFyID0ge307Ci0gIGJlYXJlcl9wcm92aWRlcl9uYW1lX2NoYXIudXVpZCA9IEdUQlNfQ0FMTF9CRUFSRVJfTkFNRV9VVUlEOwotICBiZWFyZXJfcHJvdmlkZXJfbmFtZV9jaGFyLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUM7Ci0gIGJlYXJlcl9wcm92aWRlcl9uYW1lX2NoYXIucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEfEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlk7Ci0gIGJlYXJlcl9wcm92aWRlcl9uYW1lX2NoYXIucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRDsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhiZWFyZXJfcHJvdmlkZXJfbmFtZV9jaGFyKTsKLSAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9wcm92aWRlcl9uYW1lX3V1aWQgPSBiZWFyZXJfcHJvdmlkZXJfbmFtZV9jaGFyLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBiZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjID0ge307Ci0gIGJlYXJlcl9wcm92aWRlcl9uYW1lX2Rlc2MudXVpZCA9IEdUQlNfREVTQ1JJUFRPUl9VVUlEOwotICBiZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUjsKLSAgYmVhcmVyX3Byb3ZpZGVyX25hbWVfZGVzYy5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURTsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhiZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjKTsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGJlYXJlcl90ZWNobm9sb2d5X2NoYXIgPSB7fTsKLSAgYmVhcmVyX3RlY2hub2xvZ3lfY2hhci51dWlkID0gR1RCU19CRUFSRVJfVEVDSE5PTE9HWTsKLSAgYmVhcmVyX3RlY2hub2xvZ3lfY2hhci50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotICBiZWFyZXJfdGVjaG5vbG9neV9jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRHxHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZOwotICBiZWFyZXJfdGVjaG5vbG9neV9jaGFyLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUQ7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soYmVhcmVyX3RlY2hub2xvZ3lfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdGVjaG5vbG9neV91dWlkID0gYmVhcmVyX3RlY2hub2xvZ3lfY2hhci51dWlkOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgYmVhcmVyX3RlY2hub2xvZ3lfZGVzYyA9IHt9OwotICBiZWFyZXJfdGVjaG5vbG9neV9kZXNjLnV1aWQgPSBHVEJTX0RFU0NSSVBUT1JfVVVJRDsKLSAgYmVhcmVyX3RlY2hub2xvZ3lfZGVzYy50eXBlID0gQlRHQVRUX0RCX0RFU0NSSVBUT1I7Ci0gIGJlYXJlcl90ZWNobm9sb2d5X2Rlc2MucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRHxHQVRUX1BFUk1fV1JJVEU7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soYmVhcmVyX3RlY2hub2xvZ3lfZGVzYyk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2NjX29wdGlvbmFsX29wY29kZV9jaGFyID0ge307Ci0gIGd0YnNfY2Nfb3B0aW9uYWxfb3Bjb2RlX2NoYXIudXVpZCA9IEdUQlNfQ0FMTF9DT05UUk9MX1BPSU5UX09QVElPTkFMX09QUzsKLSAgZ3Ric19jY19vcHRpb25hbF9vcGNvZGVfY2hhci50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotICBndGJzX2NjX29wdGlvbmFsX29wY29kZV9jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRDsKLSAgZ3Ric19jY19vcHRpb25hbF9vcGNvZGVfY2hhci5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfY2Nfb3B0aW9uYWxfb3Bjb2RlX2NoYXIpOwotICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfdXVpZCA9IGd0YnNfY2Nfb3B0aW9uYWxfb3Bjb2RlX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfY2FsbF9zdGF0ZV9jaGFyID0ge307Ci0gIGd0YnNfY2FsbF9zdGF0ZV9jaGFyLnV1aWQgPSBHVEJTX0NBTExfU1RBVEVfVVVJRDsKLSAgZ3Ric19jYWxsX3N0YXRlX2NoYXIudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLSAgZ3Ric19jYWxsX3N0YXRlX2NoYXIucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEfEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlk7Ci0gIGd0YnNfY2FsbF9zdGF0ZV9jaGFyLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUQ7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19jYWxsX3N0YXRlX2NoYXIpOwotICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9zdGF0ZV91dWlkID0gZ3Ric19jYWxsX3N0YXRlX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfY2FsbF9zdGF0ZV9kZXNjID0ge307Ci0gIGd0YnNfY2FsbF9zdGF0ZV9kZXNjLnV1aWQgPSBHVEJTX0RFU0NSSVBUT1JfVVVJRDsKLSAgZ3Ric19jYWxsX3N0YXRlX2Rlc2MudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SOwotICBndGJzX2NhbGxfc3RhdGVfZGVzYy5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURTsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhndGJzX2NhbGxfc3RhdGVfZGVzYyk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2NhbGxfY29udHJvbF9wb2ludF9jaGFyID0ge307Ci0gIGd0YnNfY2FsbF9jb250cm9sX3BvaW50X2NoYXIudXVpZCA9IEdUQlNfQ0FMTF9DT05UUk9MX1BPSU5UX09QUzsKLSAgZ3Ric19jYWxsX2NvbnRyb2xfcG9pbnRfY2hhci50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotICBndGJzX2NhbGxfY29udHJvbF9wb2ludF9jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEV8R0FUVF9DSEFSX1BST1BfQklUX05PVElGWXxHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEVfTlI7Ci0gIGd0YnNfY2FsbF9jb250cm9sX3BvaW50X2NoYXIucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fV1JJVEU7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19jYWxsX2NvbnRyb2xfcG9pbnRfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX2NvbnRyb2xfcG9pbnRfdXVpZCA9IGd0YnNfY2FsbF9jb250cm9sX3BvaW50X2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfY2FsbF9jb250cm9sX3BvaW50X2Rlc2MgPSB7fTsKLSAgZ3Ric19jYWxsX2NvbnRyb2xfcG9pbnRfZGVzYy51dWlkID0gR1RCU19ERVNDUklQVE9SX1VVSUQ7Ci0gIGd0YnNfY2FsbF9jb250cm9sX3BvaW50X2Rlc2MudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SOwotICBndGJzX2NhbGxfY29udHJvbF9wb2ludF9kZXNjLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfY2FsbF9jb250cm9sX3BvaW50X2Rlc2MpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19iZWFyZXJfdWNpX2NoYXIgPSB7fTsKLSAgZ3Ric19iZWFyZXJfdWNpX2NoYXIudXVpZCA9IEdUQlNfQkVBUkVSX1VDSTsKLSAgZ3Ric19iZWFyZXJfdWNpX2NoYXIudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLSAgZ3Ric19iZWFyZXJfdWNpX2NoYXIucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEOwotICBndGJzX2JlYXJlcl91Y2lfY2hhci5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfYmVhcmVyX3VjaV9jaGFyKTsKLSAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl91Y2lfdXVpZD0gZ3Ric19iZWFyZXJfdWNpX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfYmVhcmVyX1VSSV9zY2hlbWVzX2NoYXIgPSB7fTsKLSAgZ3Ric19iZWFyZXJfVVJJX3NjaGVtZXNfY2hhci51dWlkID0gR1RCU19CRUFSRVJfVVJJX1NDSEVNRVM7Ci0gIGd0YnNfYmVhcmVyX1VSSV9zY2hlbWVzX2NoYXIudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLSAgZ3Ric19iZWFyZXJfVVJJX3NjaGVtZXNfY2hhci5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8R0FUVF9DSEFSX1BST1BfQklUX05PVElGWTsKLSAgZ3Ric19iZWFyZXJfVVJJX3NjaGVtZXNfY2hhci5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEOwotCi0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19iZWFyZXJfVVJJX3NjaGVtZXNfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX3V1aWQgPSBndGJzX2JlYXJlcl9VUklfc2NoZW1lc19jaGFyLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2JlYXJlcl9VUklfc2NoZW1lc19kZXNjID0ge307Ci0gIGd0YnNfYmVhcmVyX1VSSV9zY2hlbWVzX2Rlc2MudXVpZCA9IEdUQlNfREVTQ1JJUFRPUl9VVUlEOwotICBndGJzX2JlYXJlcl9VUklfc2NoZW1lc19kZXNjLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUjsKLSAgZ3Ric19iZWFyZXJfVVJJX3NjaGVtZXNfZGVzYy5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURTsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhndGJzX2JlYXJlcl9VUklfc2NoZW1lc19kZXNjKTsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfc2lnbmFsX3N0cmVuZ3RoX2NoYXIgPSB7fTsKLSAgZ3Ric19zaWduYWxfc3RyZW5ndGhfY2hhci51dWlkID0gR1RCU19TSUdOQUxfU1RSRU5HVEg7Ci0gIGd0YnNfc2lnbmFsX3N0cmVuZ3RoX2NoYXIudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLSAgZ3Ric19zaWduYWxfc3RyZW5ndGhfY2hhci5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8R0FUVF9DSEFSX1BST1BfQklUX05PVElGWTsKLSAgZ3Ric19zaWduYWxfc3RyZW5ndGhfY2hhci5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEOwotCi0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19zaWduYWxfc3RyZW5ndGhfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX3V1aWQgPSBndGJzX3NpZ25hbF9zdHJlbmd0aF9jaGFyLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX3NpZ25hbF9zdHJlbmd0aF9kZXNjID0ge307Ci0gIGd0YnNfc2lnbmFsX3N0cmVuZ3RoX2Rlc2MudXVpZCA9IEdUQlNfREVTQ1JJUFRPUl9VVUlEOwotICBndGJzX3NpZ25hbF9zdHJlbmd0aF9kZXNjLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUjsKLSAgZ3Ric19zaWduYWxfc3RyZW5ndGhfZGVzYy5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURTsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhndGJzX3NpZ25hbF9zdHJlbmd0aF9kZXNjKTsKLQotIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2NoYXIgPSB7fTsKLSAgZ3Ric19zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2NoYXIudXVpZCA9IEdUQlNfU0lHTkFMX1NUUkVOR1RIX1JFUE9SVElOVEVSVkFMOwotICBndGJzX3NpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWxfY2hhci50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotICBndGJzX3NpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWxfY2hhci5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8R0FUVF9DSEFSX1BST1BfQklUX1dSSVRFfEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURV9OUjsKLSAgZ3Ric19zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2NoYXIucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRHxHQVRUX1BFUk1fV1JJVEU7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2NoYXIpOwotICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWxfdXVpZCA9IGd0YnNfc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbF9jaGFyLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2xpc3RfY3VycmVudF9jYWxsc19jaGFyID0ge307Ci0gIGd0YnNfbGlzdF9jdXJyZW50X2NhbGxzX2NoYXIudXVpZCA9IEdUQlNfQkVBUkVSX0xJU1RfQ1VSUkVOVF9DQUxMUzsKLSAgZ3Ric19saXN0X2N1cnJlbnRfY2FsbHNfY2hhci50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotICBndGJzX2xpc3RfY3VycmVudF9jYWxsc19jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRHxHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZOwotICBndGJzX2xpc3RfY3VycmVudF9jYWxsc19jaGFyLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUQ7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19saXN0X2N1cnJlbnRfY2FsbHNfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfbGlzdF9jdXJyZW50Y2FsbHNfdXVpZCA9IGd0YnNfbGlzdF9jdXJyZW50X2NhbGxzX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfbGlzdF9jdXJyZW50X2NhbGxzX2Rlc2MgPSB7fTsKLSAgZ3Ric19saXN0X2N1cnJlbnRfY2FsbHNfZGVzYy51dWlkID0gR1RCU19ERVNDUklQVE9SX1VVSUQ7Ci0gIGd0YnNfbGlzdF9jdXJyZW50X2NhbGxzX2Rlc2MudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SOwotICBndGJzX2xpc3RfY3VycmVudF9jYWxsc19kZXNjLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfbGlzdF9jdXJyZW50X2NhbGxzX2Rlc2MpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19jYWxsX3N0YXR1c19mbGFnc19jaGFyID0ge307Ci0gIGd0YnNfY2FsbF9zdGF0dXNfZmxhZ3NfY2hhci51dWlkID0gR1RCU19DQUxMX1NUQVRVU19GTEFHUzsKLSAgZ3Ric19jYWxsX3N0YXR1c19mbGFnc19jaGFyLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUM7Ci0gIGd0YnNfY2FsbF9zdGF0dXNfZmxhZ3NfY2hhci5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8R0FUVF9DSEFSX1BST1BfQklUX05PVElGWTsKLSAgZ3Ric19jYWxsX3N0YXR1c19mbGFnc19jaGFyLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUQ7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19jYWxsX3N0YXR1c19mbGFnc19jaGFyKTsKLSAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdHVzX2ZsYWdzX3V1aWQgPSBndGJzX2NhbGxfc3RhdHVzX2ZsYWdzX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfY2FsbF9zdGF0dXNfZmxhZ3NfZGVzYyA9IHt9OwotICBndGJzX2NhbGxfc3RhdHVzX2ZsYWdzX2Rlc2MudXVpZCA9IEdUQlNfREVTQ1JJUFRPUl9VVUlEOwotICBndGJzX2NhbGxfc3RhdHVzX2ZsYWdzX2Rlc2MudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SOwotICBndGJzX2NhbGxfc3RhdHVzX2ZsYWdzX2Rlc2MucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRHxHQVRUX1BFUk1fV1JJVEU7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19jYWxsX3N0YXR1c19mbGFnc19kZXNjKTsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfaW5jb21pbmdjYWxsX3RhcmdldF9iZWFyZXJfVVJJX2NoYXIgPSB7fTsKLSAgZ3Ric19pbmNvbWluZ2NhbGxfdGFyZ2V0X2JlYXJlcl9VUklfY2hhci51dWlkID0gR1RCU19JTkNPTUlOR0NBTExfVEFSR0VUX1VSSTsKLSAgZ3Ric19pbmNvbWluZ2NhbGxfdGFyZ2V0X2JlYXJlcl9VUklfY2hhci50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotICBndGJzX2luY29taW5nY2FsbF90YXJnZXRfYmVhcmVyX1VSSV9jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRHxHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZOwotICBndGJzX2luY29taW5nY2FsbF90YXJnZXRfYmVhcmVyX1VSSV9jaGFyLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUQ7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19pbmNvbWluZ2NhbGxfdGFyZ2V0X2JlYXJlcl9VUklfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX3RhcmdldF9iZWFyZXJ1cmlfdXVpZCA9IGd0YnNfaW5jb21pbmdjYWxsX3RhcmdldF9iZWFyZXJfVVJJX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IGd0YnNfaW5jb21pbmdjYWxsX3RhcmdldF9iZWFyZXJfVVJJX2Rlc2MgPSB7fTsKLSAgZ3Ric19pbmNvbWluZ2NhbGxfdGFyZ2V0X2JlYXJlcl9VUklfZGVzYy51dWlkID0gR1RCU19ERVNDUklQVE9SX1VVSUQ7Ci0gIGd0YnNfaW5jb21pbmdjYWxsX3RhcmdldF9iZWFyZXJfVVJJX2Rlc2MudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SOwotICBndGJzX2luY29taW5nY2FsbF90YXJnZXRfYmVhcmVyX1VSSV9kZXNjLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfaW5jb21pbmdjYWxsX3RhcmdldF9iZWFyZXJfVVJJX2Rlc2MpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19pbmNvbWluZ2NhbGxfY2hhciA9IHt9OwotICBndGJzX2luY29taW5nY2FsbF9jaGFyLnV1aWQgPSBHVEJTX0lOQ09NSU5HX0NBTEw7Ci0gIGd0YnNfaW5jb21pbmdjYWxsX2NoYXIudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLSAgZ3Ric19pbmNvbWluZ2NhbGxfY2hhci5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8R0FUVF9DSEFSX1BST1BfQklUX05PVElGWTsKLSAgZ3Ric19pbmNvbWluZ2NhbGxfY2hhci5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfaW5jb21pbmdjYWxsX2NoYXIpOwotICBjY3NDb250cm9sU2VydmljZUluZm8uaW5jb21pbmdfY2FsbF91dWlkID0gZ3Ric19pbmNvbWluZ2NhbGxfY2hhci51dWlkOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19pbmNvbWluZ2NhbGxfZGVzYyA9IHt9OwotICBndGJzX2luY29taW5nY2FsbF9kZXNjLnV1aWQgPSBHVEJTX0RFU0NSSVBUT1JfVVVJRDsKLSAgZ3Ric19pbmNvbWluZ2NhbGxfZGVzYy50eXBlID0gQlRHQVRUX0RCX0RFU0NSSVBUT1I7Ci0gIGd0YnNfaW5jb21pbmdjYWxsX2Rlc2MucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRHxHQVRUX1BFUk1fV1JJVEU7Ci0gIGNjc19zZXJ2aWNlcy5wdXNoX2JhY2soZ3Ric19pbmNvbWluZ2NhbGxfZGVzYyk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2NhbGxfdGVybWluYXRpb25fcmVhc29uX2NoYXIgPSB7fTsKLSAgZ3Ric19jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9jaGFyLnV1aWQgPSBHVEJTX0NBTExfVEVSTUlOQVRJT05fUkVBU09OOwotICBndGJzX2NhbGxfdGVybWluYXRpb25fcmVhc29uX2NoYXIudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLSAgZ3Ric19jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl91dWlkID0gZ3Ric19jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9jaGFyLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2NhbGxfdGVybWluYXRpb25fcmVhc29uX2Rlc2MgPSB7fTsKLSAgZ3Ric19jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjLnV1aWQgPSBHVEJTX0RFU0NSSVBUT1JfVVVJRDsKLSAgZ3Ric19jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUjsKLSAgZ3Ric19jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fZGVzYyk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBndGJzX2NhbGxfZnJpZW5kbHlfbmFtZV9jaGFyID0ge307Ci0gIGd0YnNfY2FsbF9mcmllbmRseV9uYW1lX2NoYXIudXVpZCA9IEdUQlNfQ0FMTF9GUklFTkRMWV9OQU1FOwotICBndGJzX2NhbGxfZnJpZW5kbHlfbmFtZV9jaGFyLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUM7Ci0gIGd0YnNfY2FsbF9mcmllbmRseV9uYW1lX2NoYXIucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEfEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlk7Ci0gIGd0YnNfY2FsbF9mcmllbmRseV9uYW1lX2NoYXIucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRDsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhndGJzX2NhbGxfZnJpZW5kbHlfbmFtZV9jaGFyKTsKLSAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfZnJpZW5kbHlfbmFtZV91dWlkID0gZ3Ric19jYWxsX2ZyaWVuZGx5X25hbWVfY2hhci51dWlkOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19jYWxsX2ZyaWVuZGx5X25hbWVfZGVzYyA9IHt9OwotICBndGJzX2NhbGxfZnJpZW5kbHlfbmFtZV9kZXNjLnV1aWQgPSBHVEJTX0RFU0NSSVBUT1JfVVVJRDsKLSAgZ3Ric19jYWxsX2ZyaWVuZGx5X25hbWVfZGVzYy50eXBlID0gQlRHQVRUX0RCX0RFU0NSSVBUT1I7Ci0gIGd0YnNfY2FsbF9mcmllbmRseV9uYW1lX2Rlc2MucGVybWlzc2lvbnMgPSAgR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFOwotICBjY3Nfc2VydmljZXMucHVzaF9iYWNrKGd0YnNfY2FsbF9mcmllbmRseV9uYW1lX2Rlc2MpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZ3Ric19jY2lkX2NoYXIgPSB7fTsKLSAgZ3Ric19jY2lkX2NoYXIudXVpZCA9IEdUQlNfQ09OVEVOVF9DT05UUk9MSUQ7Ci0gIGd0YnNfY2NpZF9jaGFyLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUM7Ci0gIGd0YnNfY2NpZF9jaGFyLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRDsKLSAgZ3Ric19jY2lkX2NoYXIucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRDsKLSAgY2NzX3NlcnZpY2VzLnB1c2hfYmFjayhndGJzX2NjaWRfY2hhcik7Ci0gIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5ndGJzX2NjaWRfdXVpZCA9IGd0YnNfY2NpZF9jaGFyLnV1aWQ7Ci0KLSAgcmV0dXJuIGNjc19zZXJ2aWNlczsKLX0KLQotc3RhdGljIHZvaWQgT25HdGJzU2VydmljZUFkZGVkQ2IodWludDhfdCBzdGF0dXMsIGludCBzZXJ2ZXJJZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSkgewotCi0gIGlmIChzZXJ2aWNlWzBdLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSKSB8fAotICAgICAgc2VydmljZVswXS51dWlkID09IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVBfU0VSVkVSKSkgewotICAgIExPRyhJTkZPKSA8PCAiJXM6IEF0dGVtcHQgdG8gcmVnaXN0ZXIgcmVzdHJpY3RlZCBzZXJ2aWNlIjw8IF9fZnVuY19fOwotICAgIHJldHVybjsKLSAgfQotCi0gICBmb3IoaW50IGk9MDsgaTwgKGludClzZXJ2aWNlLnNpemUoKTsgaSsrKSB7Ci0KLSAgICBpZiAoc2VydmljZVtpXS51dWlkID09IENBTExfQ09OVFJPTF9TRVJWRVJfVVVJRCkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgR1RCUyBzZXJ2aWNlIGFkZGVkIGF0dHIgaGFuZGxlOiAiIDw8IHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09ICBHVEJTX0NBTExfQkVBUkVSX05BTUVfVVVJRCkgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9wcm92aWRlcl9uYW1lX2hhbmRsZSA9IHNlcnZpY2VbaSsrXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9wcm92aWRlcl9uYW1lX2Rlc2MgID0gc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX3Byb3ZpZGVyX25hbWVfYXR0cjogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfcHJvdmlkZXJfbmFtZV9oYW5kbGUKLSAgICAgICAgICAgICAgICA8PCAiIGJlYXJlcl9wcm92aWRlcl9uYW1lX2Rlc2M6ICIKLSAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3Byb3ZpZGVyX25hbWVfZGVzYzsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfQkVBUkVSX1RFQ0hOT0xPR1kpIHsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdGVjaG5vbG9neV9oYW5kbGUgPSBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdGVjaG5vbG9neV9kZXNjID0gc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX3RlY2hub2xvZ3lfaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl90ZWNobm9sb2d5X2hhbmRsZQotICAgICAgICAgICAgICAgIDw8ICIgYmVhcmVyX3RlY2hub2xvZ3lfZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdGVjaG5vbG9neV9kZXNjOwotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR1RCU19DQUxMX0NPTlRST0xfUE9JTlRfT1BUSU9OQUxfT1BTKSB7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlID0KLSAgICAgICAgICBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGUgcmVnaXN0ZXI6ICIKLSAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlOwotICAgIH0gZWxzZSBpZiAoc2VydmljZVtpXS51dWlkID09IEdUQlNfQ0FMTF9TVEFURV9VVUlEKSB7Ci0KLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXRlX2hhbmRsZSA9IHNlcnZpY2VbaSsrXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdGVfZGVzYyA9IHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxfc3RhdGVfaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdGVfaGFuZGxlCi0gICAgICAgICAgICAgICAgPDwgIiBjYWxsX3N0YXRlX2hhbmRsZSBkZXNjOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdGVfZGVzYzsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfQ0FMTF9DT05UUk9MX1BPSU5UX09QUykgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfY29udHJvbF9wb2ludF9oYW5kbGUgPSBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX2NvbnRyb2xfcG9pbnRfZGVzYyA9ICBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF9jb250cm9sX3BvaW50X2hhbmRsZTogIgotICAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X2hhbmRsZQotICAgICAgICAgICAgICAgICA8PCAiIGNhbGxfY29udHJvbF9wb2ludF9kZXNjOiAiCi0gICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX2NvbnRyb2xfcG9pbnRfZGVzYzsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfQkVBUkVSX1VDSSkgIHsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdWNpX2hhbmRsZSA9IHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfdWNpX2hhbmRsZTogIgotICAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3VjaV9oYW5kbGU7Ci0KLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfQkVBUkVSX1VSSV9TQ0hFTUVTKSAgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl91cmlfc2NoZW1lc19zdXBwb3J0ZWRfaGFuZGxlID0KLSAgICAgICAgICAgc2VydmljZVtpKytdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3VyaV9zY2hlbWVzX3N1cHBvcnRlZF9kZXNjID0KLSAgICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX3VyaV9zY2hlbWVzX3N1cHBvcnRlZF9oYW5kbGU6ICIKLSAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3VyaV9zY2hlbWVzX3N1cHBvcnRlZF9oYW5kbGUKLSAgICAgICAgICAgICAgICA8PCAiIGJlYXJlcl91cmlfc2NoZW1lc19zdXBwb3J0ZWRfZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX2Rlc2M7Ci0KLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfU0lHTkFMX1NUUkVOR1RIKSAgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfaGFuZGxlID0KLSAgICAgICAgICAgc2VydmljZVtpKytdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9kZXNjID0KLSAgICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9oYW5kbGU6ICIKLSAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9oYW5kbGUKLSAgICAgICAgICAgICAgICA8PCAiIGJlYXJlcl9zaWduYWxfc3RyZW5ndGhfZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX2Rlc2M7Ci0KLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfU0lHTkFMX1NUUkVOR1RIX1JFUE9SVElOVEVSVkFMKSAgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2hhbmRsZSA9Ci0gICAgICAgICAgICAgIHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWxfaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2hhbmRsZTsKLQotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR1RCU19CRUFSRVJfTElTVF9DVVJSRU5UX0NBTExTKSAgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9saXN0X2N1cnJlbnRjYWxsc19oYW5kbGUgPQotICAgICAgICAgICAgc2VydmljZVtpKytdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2Rlc2MgPQotICAgICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2hhbmRsZTogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfbGlzdF9jdXJyZW50Y2FsbHNfaGFuZGxlCi0gICAgICAgICAgICAgICAgPDwgIiBiZWFyZXJfbGlzdF9jdXJyZW50Y2FsbHNfZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfbGlzdF9jdXJyZW50Y2FsbHNfZGVzYzsKLQotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR1RCU19DQUxMX1NUQVRVU19GTEFHUykgIHsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXR1c19mbGFnc19oYW5kbGUgPSBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXR1c19mbGFnc19kZXNjID0gc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF9zdGF0dXNfZmxhZ3NfaGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdHVzX2ZsYWdzX2hhbmRsZQotICAgICAgICAgICAgICAgIDw8ICIgY2FsbF9zdGF0dXNfZmxhZ3NfZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXR1c19mbGFnc19kZXNjOwotCi0gICAgfSBlbHNlIGlmKHNlcnZpY2VbaV0udXVpZCA9PSBHVEJTX0lOQ09NSU5HQ0FMTF9UQVJHRVRfVVJJKSAgewotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfdGFyZ2V0X2JlYXJlcnVyaV9oYW5kbGUgPQotICAgICAgICAgICBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX3RhcmdldF9iZWFyZXJVUklfZGVzYyA9Ci0gICAgICAgICAgIHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluY29taW5nX2NhbGxfdGFyZ2V0X2JlYXJlcnVyaV9oYW5kbGU6ICIKLSAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uaW5jb21pbmdfY2FsbF90YXJnZXRfYmVhcmVydXJpX2hhbmRsZQotICAgICAgICAgICAgICAgIDw8ICIgaW5jb21pbmdfY2FsbF90YXJnZXRfYmVhcmVyVVJJX2Rlc2M6ICIKLSAgICAgICAgICAgICAgICA8PCBjY3NDb250cm9sU2VydmljZUluZm8uaW5jb21pbmdfY2FsbF90YXJnZXRfYmVhcmVyVVJJX2Rlc2M7Ci0gICAgfSBlbHNlIGlmKHNlcnZpY2VbaV0udXVpZCA9PSBHVEJTX0lOQ09NSU5HX0NBTEwpICB7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uaW5jb21pbmdfY2FsbF9oYW5kbGUgPSBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX2Rlc2MgPSBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbmNvbWluZ19jYWxsX2hhbmRsZTogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX2hhbmRsZQotICAgICAgICAgICAgICAgIDw8ICIgaW5jb21pbmdfY2FsbF9kZXNjOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfZGVzYzsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdUQlNfQ09OVEVOVF9DT05UUk9MSUQpICB7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2NpZF9oYW5kbGUgPSBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjY2lkX2hhbmRsZTogIiA8PCBjY3NDb250cm9sU2VydmljZUluZm8uY2NpZF9oYW5kbGU7Ci0gICAgICAvL0RlY2xhcmUgdGhlIENDIEluaXRpYWxpemF0aW9uCi0gICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xJbml0aWFsaXplZENhbGxiYWNrKDApOwotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR1RCU19DQUxMX1RFUk1JTkFUSU9OX1JFQVNPTikgIHsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9oYW5kbGUgPQotICAgICAgICAgICBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjID0KLSAgICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25faGFuZGxlOiAiCi0gICAgICAgICAgICAgICAgPDwgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfdGVybWluYXRpb25fcmVhc29uX2hhbmRsZQotICAgICAgICAgICAgICAgIDw8ICIgY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjOwotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR1RCU19DQUxMX0ZSSUVORExZX05BTUUpICB7Ci0gICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9mcmllbmRseV9uYW1lX2hhbmRsZSA9IHNlcnZpY2VbaSsrXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfZnJpZW5kbHlfbmFtZV9kZXNjID0gc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF9mcmllbmRseV9uYW1lX2hhbmRsZTogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX2ZyaWVuZGx5X25hbWVfaGFuZGxlCi0gICAgICAgICAgICAgICAgPDwgIiBjYWxsX2ZyaWVuZGx5X25hbWVfZGVzYzogIgotICAgICAgICAgICAgICAgIDw8IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX2ZyaWVuZGx5X25hbWVfZGVzYzsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBQcmludERhdGEodWludDhfdCBkYXRhW10sIHVpbnQxNl90IGxlbikgewotICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkYXRhWyIgPDwgaSA8PCAiXSA9ICIgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IGRhdGFbaV0gPDwgc3RkOjplbmRsOwotICAgIH0KLX0KLQotdm9pZCBSZXZlcnNlQnl0ZU9yZGVyKHVuc2lnbmVkIGNoYXIgc1tdLCBpbnQgbGVuZ3RoKQotewotICAgIGNoYXIgcmV2Ynl0ZXNfZW5hYmxlZFtQUk9QRVJUWV9WQUxVRV9NQVhdID0gImZhbHNlIjsKLSAgICBvc2lfcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmJsdWV0b290aC5jY3BfcmV2IiwgcmV2Ynl0ZXNfZW5hYmxlZCwgImZhbHNlIik7Ci0gICAgYm9vbCByZXZOZWVkZWQgPSBzdHJuY21wKHJldmJ5dGVzX2VuYWJsZWQsICJ0cnVlIiwgNCkgPT0gMDs7Ci0gICAgaWYgKHJldk5lZWRlZCkgewotICAgICAgICBpbnQgdG1wLCBpLCBqOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGogPSBsZW5ndGgtMTsgaSA8IGo7IGkrKywgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBzW2ldOwotICAgICAgICAgICAgc1tpXSA9IHNbal07Ci0gICAgICAgICAgICBzW2pdID0gdG1wOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEhhbmRsZUNjc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBldmVudDogIiA8PCBidGFfY2NfZXZlbnRfc3RyKGV2ZW50KTsKLSAgdEJUQV9HQVRUUyogcF9kYXRhID0gTlVMTDsKLSAgdGNjX3Jlc3BfdCAqcnNwID0gbmV3IHRjY19yZXNwX3QoKTsKLSAgaWYgKHJzcCA9PSBOVUxMKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2NzIGhhbmRsZSByZXR1cm4gcnNwIG5vdCBhbGxvY2F0ZWQgIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gX2RhdGE7Ci0gIF9kYXRhLmNsZWFyKCk7Ci0gIHVpbnQ4X3Qgc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIHJzcC0+ZXZlbnQgPSBDQ1NfTk9ORV9FVkVOVDsKLSAgYm9vbCBpc0NhbGxDb250cm9sbGVyT3BVc2VkID0gZmFsc2U7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLQotICAgIGNhc2UgQ0NTX0lOSVRfRVZFTlQ6Ci0gICAgewotICAgICAgVXVpZCBhYXBfdXVpZCA9IGJsdWV0b290aDo6VXVpZDo6R2V0UmFuZG9tKCk7Ci0gICAgICBCVEFfR0FUVFNfQXBwUmVnaXN0ZXIoYWFwX3V1aWQsIEJUQ2NDYmFjaywgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19DTEVBTlVQX0VWRU5UOgotICAgIHsKLSAgICAgIC8vdW5yZWdpc3RlciBBUFAKLSAgICAgIEJUQV9HQVRUU19BcHBEZXJlZ2lzdGVyKGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5zZXJ2ZXJfaWYpOwotICAgICAgY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuUmVtb3ZlRGV2aWNlcygpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0dBVFRTX1JFR19FVlQ6Ci0gICAgewotICAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgICBpZiAocF9kYXRhLT5yZWdfb3Blci5zdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLnNlcnZlcl9pZiA9IHBfZGF0YS0+cmVnX29wZXIuc2VydmVyX2lmOwotICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZTsKLSAgICAgICAgIHNlcnZpY2UgPSBDY0FkZFNlcnZpY2UoY2NzQ29udHJvbFNlcnZpY2VJbmZvLnNlcnZlcl9pZik7Ci0gICAgICAgICBpZiAoc2VydmljZVswXS51dWlkID09IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVRUX1NFUlZFUikgfHwKLSAgICAgICAgICAgICAgICAgc2VydmljZVswXS51dWlkID09IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVBfU0VSVkVSKSkgewotICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzZXJ2aWNlIGFwcCByZWdpc3RlciB1dWlkIGlzIG5vdCB2YWxpZCI7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2VydmljZSBhcHAgcmVnaXN0ZXIiOwotICAgICAgICAgQlRBX0dBVFRTX0FkZFNlcnZpY2UoY2NzQ29udHJvbFNlcnZpY2VJbmZvLnNlcnZlcl9pZiwgc2VydmljZSwgYmFzZTo6QmluZCgmT25HdGJzU2VydmljZUFkZGVkQ2IpKTsKLSAgICAgICB9Ci0gICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfREVSRUdfRVZUOgotICAgIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTkZfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICB1aW50MTZfdCBjb25uX2lkID0gcF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkOwotICAgICAgdWludDhfdCBzdGF0dXMgPSBwX2RhdGEtPnJlcV9kYXRhLnN0YXR1czsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiY29ubl9pZCA6IiA8PCBjb25uX2lkIDw8ICJzdGF0dXM6IiA8PCBzdGF0dXM7Ci0gICAgICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJOb3RpZmljYXRpb24gY2FsbGJhY2sgZm9yIGNvbm5faWQgOiIgPDwgY29ubl9pZDsKLSAgICAgICAgICBHYXR0c09wc1F1ZXVlOjpOb3RpZmljYXRpb25DYWxsYmFjayhjb25uX2lkKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTkdFU1RfRVZUOgotICAgIHsKLSAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCAqcmVtb3RlRGV2aWNlOwotICAgICAgcmVtb3RlRGV2aWNlID0gY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+Y29uZ2VzdC5jb25uX2lkKTsKLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5lY3Rpb24gZW50cnkgbm90IGZvdW5kIGNvbm5faWQ6ICIKLSAgICAgICAgICA8PCBwX2RhdGEtPmNvbmdlc3QuY29ubl9pZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgIC8vIHJzcC0+Q29ubmdlc3Rpb25PcC5zdGF0dXMgPSBwX2RhdGEtPnJlcV9kYXRhLnN0YXR1czsKLSAgICAgIHJzcC0+cmVtb3RlRGV2aWNlID0gcmVtb3RlRGV2aWNlOwotICAgICAgcnNwLT5vcGVyLkNvbmdlc3Rpb25PcC5jb25nZXN0ZWQgPSBwX2RhdGEtPmNvbmdlc3QuY29uZ2VzdGVkOwotICAgICAgcnNwLT5ldmVudCA9IENDU19DT05HRVNUSU9OX1VQREFURTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9HQVRUU19NVFVfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0KLSAgICAgIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCAqcmVtb3RlRGV2aWNlOwotICAgICAgcmVtb3RlRGV2aWNlID0gY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+Y29uZ2VzdC5jb25uX2lkKTsKLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5lY3Rpb24gZW50cnkgbm90IGZvdW5kIGNvbm5faWQ6ICIKLSAgICAgICAgICA8PCBwX2RhdGEtPmNvbmdlc3QuY29ubl9pZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX01UVV9VUERBVEU7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIHJzcC0+b3Blci5NdHVPcC5tdHUgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+bXR1OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTk5FQ1RfRVZUOiB7Ci0KLSAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHJlbW90ZSBkZXZpY2VzIGNvbm5lY3RlZCI7Ci0gICAgICAvKgotICAgICAgI2lmICghZGVmaW5lZChCVEFfU0tJUF9CTEVfU1RBUlRfRU5DUllQVElPTikgfHwgQlRBX1NLSVBfQkxFX1NUQVJUX0VOQ1JZUFRJT04gPT0gRkFMU0UpCi0gICAgICAgIGJ0aWZfZ2F0dF9jaGVja19lbmNyeXB0ZWRfbGluayhwX2RhdGEtPmNvbm4ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm4udHJhbnNwb3J0KTsKLSAgICAgICNlbmRpZiovCi0gICAgICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgcmVtb3RlRGV2aWNlOwotICAgICAgbWVtc2V0KCZyZW1vdGVEZXZpY2UsIDAsIHNpemVvZihyZW1vdGVEZXZpY2UpKTsKLSAgICAgIGlmKGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUFkZHJlc3MocF9kYXRhLT5jb25uLnJlbW90ZV9iZGEpKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiByZW1vdGUgZGV2aWNlcyBhbHJlYWR5IHRoZXJlIGlzIGNvbm5lY3RlZCBsaXN0IjsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJlbW90ZURldmljZS5wZWVyX2JkYSA9IHBfZGF0YS0+Y29ubi5yZW1vdGVfYmRhOwotICAgICAgcmVtb3RlRGV2aWNlLmNvbm5faWQgPSBwX2RhdGEtPmNvbm4uY29ubl9pZDsKLSAgICAgIGlmKGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkFkZChyZW1vdGVEZXZpY2UpID09IGZhbHNlKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHJlbW90ZSBkZXZpY2UgaXMgbm90IGFkZGVkIDogbWF4IGNvbm5lY3Rpb24gcmVhY2hlZCI7Ci0gICAgICAgIC8vPFRCRD4gbmVlZCB0byBjaGVjayBkaXNjb25uZWN0aW9uIHJlcXVpcmVkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmVtb3RlRGV2aWNlLnN0YXRlID0gQ0NTX0RJU0NPTk5FQ1RFRDsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcmVtb3RlIGRldmljZXMgY29ubmVjdGVkIGNvbm5faWQ6ICI8PCByZW1vdGVEZXZpY2UuY29ubl9pZCA8PAotICAgICAgICAgImJkX2FkZHIgIiA8PCByZW1vdGVEZXZpY2UucGVlcl9iZGE7Ci0KLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfQ09OTkVDVElPTjsKLSAgICAgIHJzcC0+cmVtb3RlRGV2aWNlID0gY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5QWRkcmVzcyhwX2RhdGEtPmNvbm4ucmVtb3RlX2JkYSk7Ci0gICAgICBpZiAocnNwLT5yZW1vdGVEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICAgIExPRyhJTkZPKTw8X19mdW5jX18gPDwgIiByZW1vdGUgZGV2IGlzIG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX0RJU0NPTk5FQ1RfRVZUOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiByZW1vdGUgZGV2aWNlcyBkaXNjb25uZWN0ZWQiOwotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0ICpyZW1vdGVEZXZpY2U7Ci0gICAgICByZW1vdGVEZXZpY2UgPSBjY19pbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQocF9kYXRhLT5jb25uX3VwZGF0ZS5jb25uX2lkKTsKLSAgICAgIGlmKCghcmVtb3RlRGV2aWNlKSApIHsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByc3AtPnJlbW90ZURldmljZS0+cGVlcl9iZGEgPSByZW1vdGVEZXZpY2UtPnBlZXJfYmRhOwotICAgICAgcnNwLT5ldmVudCA9IENDU19ESVNDT05ORUNUSU9OOwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19TVE9QX0VWVDoKLSAgICAgIC8vRG8gbm90aGluZwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19ERUxFTFRFX0VWVDoKLSAgICAgIC8vRG8gbm90aGluZwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19SRUFEX0NIQVJBQ1RFUklTVElDX0VWVDogewotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKnJlbW90ZURldmljZSA9Ci0gICAgICAgICAgY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+cmVxX2RhdGEuY29ubl9pZCk7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjaGFyYXRlcmlzdGNzIHJlYWQgaGFuZGxlICIgPDwKLSAgICAgICAgICBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlIDw8IiB0cmFuc19pZCA6ICIgPDwKLSAgICAgICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLQotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgcmVhZCBvcGVyYXRpb24iOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIExPRyhJTkZPKSA8PCIgb2Zmc2V0OiAiIDw8IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5vZmZzZXQgPDwKLSAgICAgICAgICAiIGxvbmcgOiAiIDw8IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5pc19sb25nOwotCi0gICAgICB0R0FUVFNfUlNQIHJzcF9zdHJ1Y3Q7Ci0gICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUuYXV0aF9yZXEgID0gMDsKLSAgICAgIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5oYW5kbGUgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlOwotICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLm9mZnNldCA9IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5vZmZzZXQ7Ci0KLSAgICAgIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9zdGF0ZV9oYW5kbGUpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbG9jX2Rlc2NfdmFsdWU7Ci0gICAgICAgIHN0ZDo6bWFwPHVpbnQ4X3QsIHRDQ1NfQ0FMTF9TVEFURT46Oml0ZXJhdG9yIGl0OwotICAgICAgICBmb3IgKGl0ID0gQ2FsbFN0YXRlbGlzdC5iZWdpbigpOyBpdCAhPSBDYWxsU3RhdGVsaXN0LmVuZCgpOyBpdCsrKXsKLSAgICAgICAgICAgIHRDQ1NfQ0FMTF9TVEFURSBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgbG9jX2Rlc2NfdmFsdWUucHVzaF9iYWNrKG9iai5pbmRleCk7Ci0gICAgICAgICAgICBsb2NfZGVzY192YWx1ZS5wdXNoX2JhY2sob2JqLnN0YXRlKTsKLSAgICAgICAgICAgIGxvY19kZXNjX3ZhbHVlLnB1c2hfYmFjayhvYmouZmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IHN0ZDo6bWluKChzaXplX3QpR0FUVF9NQVhfQVRUUl9MRU4sIGxvY19kZXNjX3ZhbHVlLnNpemUoKSk7Ci0gICAgICAgIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4gPSBjb3VudDsKLSAgICAgICAgbWVtY3B5KHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS52YWx1ZSwgbG9jX2Rlc2NfdmFsdWUuZGF0YSgpLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLQotCi0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENhbGxTdGF0ZUluZm8gcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlKSB7Ci0KLSAgICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihTdXBwb3J0ZWRPcHRpb25hbE9wY29kZXMuc3VwcF9vcGNvZGUpOwotICAgICAgICBtZW1jcHkocnNwX3N0cnVjdC5hdHRyX3ZhbHVlLnZhbHVlLCAmU3VwcG9ydGVkT3B0aW9uYWxPcGNvZGVzLnN1cHBfb3Bjb2RlLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbGNvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3Byb3ZpZGVyX25hbWVfaGFuZGxlKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEJlYXJlclByb3ZpZGVySW5mbyBuYW1lIHJlYWQgIiA8PCBCZWFyZXJQcm92aWRlckluZm8ubmFtZTsKLSAgICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbiA9IHN0cmxlbigoY2hhciAqKUJlYXJlclByb3ZpZGVySW5mby5uYW1lKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQmVhcmVyUHJvdmlkZXJJbmZvIG5hbWUgbGVuOiAiIDw8cnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbjsKLSAgICAgICAgbWVtY3B5KHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS52YWx1ZSwgQmVhcmVyUHJvdmlkZXJJbmZvLm5hbWUsIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9saXN0X2N1cnJlbnRjYWxsc19oYW5kbGUpIHsKLQotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsb2NfZGVzY192YWx1ZTsKLSAgICAgICAgc3RkOjptYXA8dWludDhfdCwgdENDU19CRUFSRVJfTElTVF9DVVJSRU5UX0NBTExTPjo6aXRlcmF0b3IgaXQ7Ci0gICAgICAgIGZvciAoaXQgPSBCbGNjSW5mb2xpc3QuYmVnaW4oKTsgaXQgIT0gQmxjY0luZm9saXN0LmVuZCgpOyBpdCsrKXsKLSAgICAgICAgICAgIHRDQ1NfQkVBUkVSX0xJU1RfQ1VSUkVOVF9DQUxMUyBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgbG9jX2Rlc2NfdmFsdWUucHVzaF9iYWNrKG9iai5saXN0X2xlbmd0aCk7Ci0gICAgICAgICAgICBsb2NfZGVzY192YWx1ZS5wdXNoX2JhY2sob2JqLmNhbGxfaW5kZXgpOwotICAgICAgICAgICAgbG9jX2Rlc2NfdmFsdWUucHVzaF9iYWNrKG9iai5jYWxsX3N0YXRlKTsKLSAgICAgICAgICAgIGxvY19kZXNjX3ZhbHVlLnB1c2hfYmFjayhvYmouY2FsbF9mbGFncyk7Ci0KLSAgICAgICAgICAgIGxvY19kZXNjX3ZhbHVlLmluc2VydChsb2NfZGVzY192YWx1ZS5lbmQoKSwKLSAgICAgICAgICAgICAgICBvYmouY2FsbF91cmksIG9iai5jYWxsX3VyaSsob2JqLmxpc3RfbGVuZ3RoLTMpKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgY291bnQgPSBzdGQ6Om1pbigoc2l6ZV90KUdBVFRfTUFYX0FUVFJfTEVOLCBsb2NfZGVzY192YWx1ZS5zaXplKCkpOwotICAgICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuID0gY291bnQ7Ci0gICAgICAgIG1lbWNweShyc3Bfc3RydWN0LmF0dHJfdmFsdWUudmFsdWUsIGxvY19kZXNjX3ZhbHVlLmRhdGEoKSwgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbik7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEJsY2NJbmZvIHJlYWQiOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl90ZWNobm9sb2d5X2hhbmRsZSkgewotICAgICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKEJlYXJlclByb3ZpZGVySW5mby50ZWNobm9sb2d5X3R5cGUpOwotICAgICAgICBtZW1jcHkocnNwX3N0cnVjdC5hdHRyX3ZhbHVlLnZhbHVlLCAmQmVhcmVyUHJvdmlkZXJJbmZvLnRlY2hub2xvZ3lfdHlwZSwgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbik7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHRlY2hub2xvZ3lfdHlwZSByZWFkIjsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdWNpX2hhbmRsZSkgewotICAgICAgICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuID0gc3RybGVuKChjaGFyICopQmVhcmVyUHJvdmlkZXJJbmZvLnVjaSk7Ci0gICAgICAgICAgIG1lbWNweShyc3Bfc3RydWN0LmF0dHJfdmFsdWUudmFsdWUsIEJlYXJlclByb3ZpZGVySW5mby51Y2ksIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBCZWFyZXIgVUNJIHJlYWQiOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfaGFuZGxlKSB7Ci0gICAgICAgIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoQmVhcmVyUHJvdmlkZXJJbmZvLnNpZ25hbCk7Ci0gICAgICAgIG1lbWNweShyc3Bfc3RydWN0LmF0dHJfdmFsdWUudmFsdWUsICZCZWFyZXJQcm92aWRlckluZm8uc2lnbmFsLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2lnbmFsIHN0cmVuZ3RoIHJlYWQiOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2hhbmRsZSkgewotICAgICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKEJlYXJlclByb3ZpZGVySW5mby5zaWduYWxfcmVwb3J0X2ludGVydmFsKTsKLSAgICAgICAgbWVtY3B5KHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS52YWx1ZSwgJkJlYXJlclByb3ZpZGVySW5mby5zaWduYWxfcmVwb3J0X2ludGVydmFsLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2lnbmFsX3JlcG9ydF9pbnRlcnZhbCByZWFkIjsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX2hhbmRsZSkgewotICAgICAgICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbiA9IHN0cmxlbigoY29uc3QgY2hhciopQmVhcmVyUHJvdmlkZXJJbmZvLmJlYXJlcl9zY2hlbWVzX2xpc3QpOwotICAgICAgICAgICAgbWVtY3B5KHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS52YWx1ZSwgQmVhcmVyUHJvdmlkZXJJbmZvLmJlYXJlcl9zY2hlbWVzX2xpc3QsIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX3NjaGVtZXNfbGlzdCByZWFkIjsKLSAgICAgIH1lbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfaGFuZGxlKSB7Ci0gICAgICAgIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4gPSAxICsgc3RybGVuKChjaGFyKilJbmNvbWluZ0NhbGxJbmZvLmluY29taW5nX3VyaSk7Ci0gICAgICAgIG1lbWNweShyc3Bfc3RydWN0LmF0dHJfdmFsdWUudmFsdWUsICZJbmNvbWluZ0NhbGxJbmZvLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgSW5jb21pbmcgY2FsbCByZWFkIjsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX3RhcmdldF9iZWFyZXJ1cmlfaGFuZGxlKSB7Ci0gICAgICAgIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4gPSAxICsgc3RybGVuKChjaGFyKilJbmNvbWluZ0NhbGxUYXJnZXRVcmkuaW5jb21pbmdfdGFyZ2V0X3VyaSk7Ci0gICAgICAgIG1lbWNweShyc3Bfc3RydWN0LmF0dHJfdmFsdWUudmFsdWUsICZJbmNvbWluZ0NhbGxUYXJnZXRVcmksIHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBJbmNvbWluZyBDYWxsIHRhcmdldCBVUkkgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2NpZF9oYW5kbGUpIHsKLSAgICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihDY2lkSW5mbyk7Ci0gICAgICAgIG1lbWNweShyc3Bfc3RydWN0LmF0dHJfdmFsdWUudmFsdWUsICZDY2lkSW5mbywgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbik7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENvbnRlbnQgQ29udHJvbCByZWFkIjsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXR1c19mbGFnc19oYW5kbGUpIHsKLSAgICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihTdGF0dXNGbGFncy5zdXBwb3J0ZWRfZmxhZ3MpOwotICAgICAgICBtZW1jcHkocnNwX3N0cnVjdC5hdHRyX3ZhbHVlLnZhbHVlLCAmU3RhdHVzRmxhZ3Muc3VwcG9ydGVkX2ZsYWdzLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgU3RhdHVzIGZsYWdzIHJlYWQiOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfZnJpZW5kbHlfbmFtZV9oYW5kbGUpIHsKLSAgICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbiA9IDEgKyBzdHJsZW4oKGNoYXIqKUZyaWVuZGx5TmFtZS5uYW1lKTsKLSAgICAgICAgbWVtY3B5KHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS52YWx1ZSwgJkZyaWVuZGx5TmFtZSwgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmxlbik7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENhbGwgZnJpZW5kbHkgbmFtZSByZWFkIjsKLSAgICAgIH1lbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfdGVybWluYXRpb25fcmVhc29uX2hhbmRsZSkgewotICAgICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKFRlcm1pbmF0aW9uUmVhc29uKTsKLSAgICAgICAgbWVtY3B5KHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS52YWx1ZSwgJlRlcm1pbmF0aW9uUmVhc29uLCByc3Bfc3RydWN0LmF0dHJfdmFsdWUubGVuKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgVGVybWluYXRpb24gUmVhc29uIHJlYWQiOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHJlYWQgcmVxdWVzdCBmb3IgdW5rbm93IGhhbmRsZSAiIDw8IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGU7Ci0gICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHJlYWQgcmVxdWVzdCBoYW5kbGUgIiA8PCBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlIDw8Ci0gICAgICAgICJjb25uZWN0aW9uIGlkICIgPDwgcF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkOwotICAgICAgcnNwLT5vcGVyLlJlYWRPcC5jaGFyX2hhbmRsZSA9IHJzcF9zdHJ1Y3QuYXR0cl92YWx1ZS5oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuUmVhZE9wLnRyYW5zX2lkID0gcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLSAgICAgIHJzcC0+b3Blci5SZWFkT3Auc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX1JFQURfUlNQOwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0KLSAgICAgIG1lbWNweSgodm9pZCopJnJzcC0+cnNwX3ZhbHVlLCAmcnNwX3N0cnVjdCwgc2l6ZW9mKHJzcF9zdHJ1Y3QpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfREVTQ1JJUFRPUl9FVlQ6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHJlYWQgZGVzY3JpcHRvciI7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjaGFyYXRlcmlzdGNzIHJlYWQgZGVzYyBoYW5kbGUgIiA8PAotICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPDwgIiBvZmZzZXQgOiAiCi0gICAgICAgICAgPDwgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLm9mZnNldDsKLSAgICAgICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKnJlbW90ZURldmljZSA9Ci0gICAgICAgICAgY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+cmVxX2RhdGEuY29ubl9pZCk7Ci0gICAgICBpZihyZW1vdGVEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2Ugbm90IGZvdW5kIGlnbm9yZSB3cml0ZSI7Ci0gICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHVpbnQxNl90IGRhdGEgPSAweDAwOwotICAgICAgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXRlX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF9zdGF0ZV9kZXNjIHJlYWQiOwotICAgICAgICBkYXRhID0gcmVtb3RlRGV2aWNlLT5jYWxsX3N0YXRlX25vdGlmeTsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfY29udHJvbF9wb2ludF9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxjb250cm9sX3BvaW50X2Rlc2MgcmVhZCI7Ci0gICAgICAgIGRhdGEgPSByZW1vdGVEZXZpY2UtPmNhbGxfY29udHJvbF9wb2ludF9ub3RpZnk7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGJlYXJlcl9wcm92aWRlcl9uYW1lX2Rlc2MgcmVhZCI7Ci0gICAgICAgIGRhdGEgPSByZW1vdGVEZXZpY2UtPmJlYXJlcl9wcm92aWRlcl9uYW1lX25vdGlmeTsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfc2lnbmFsX3N0cmVuZ3RoIGRlc2MgcmVhZCI7Ci0gICAgICAgIGRhdGEgPSByZW1vdGVEZXZpY2UtPmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfbm90aWZ5OwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmVhcmVyX2xpc3RfY3VycmVudGNhbGwgcmVhZCI7Ci0gICAgICAgIGRhdGEgPSByZW1vdGVEZXZpY2UtPmJlYXJlcl9jdXJyZW50X2NhbGxzX2xpc3Rfbm90aWZ5OwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3RlY2hub2xvZ3lfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfdGVjaG5vbG9neV9kZXNjIHJlYWQiOwotICAgICAgICBkYXRhID0gcmVtb3RlRGV2aWNlLT5iZWFyZXJfdGVjaG5vbG9neV9jaGFuZ2VkX25vdGlmeTsKLSAgICAgIH0gZWxzZSBpZihwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl91Y2lfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfdWNpX2Rlc2MgcmVhZCI7Ci0gICAgICAgIGRhdGEgPSByZW1vdGVEZXZpY2UtPmJlYXJlcl91Y2lfbm90aWZ5OwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3VyaV9zY2hlbWVzX3N1cHBvcnRlZF9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGJlYXJlcl91cmlfc2NoZW1lc19zdXBwb3J0ZWRfZGVzYyByZWFkIjsKLSAgICAgICAgZGF0YSA9IHJlbW90ZURldmljZS0+YmVhcmVyX3VyaV9zY2hlbWVzX3N1cHBvcnRlZF9ub3RpZnk7Ci0gICAgICB9ICBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9mcmllbmRseV9uYW1lX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF9mcmllbmRseV9uYW1lX2Rlc2MgcmVhZCI7Ci0gICAgICAgIGRhdGEgPSByZW1vdGVEZXZpY2UtPmNhbGxfZnJpZW5kbHlfbmFtZV9ub3RpZnk7Ci0gICAgICB9ICBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9kZXNjIHJlYWQiOwotICAgICAgICBkYXRhID0gcmVtb3RlRGV2aWNlLT5jYWxsX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9ub3RpZnk7Ci0gICAgICB9ICBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjIHJlYWQiOwotICAgICAgICBkYXRhID0gcmVtb3RlRGV2aWNlLT5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9ub3RpZnk7Ci0gICAgICB9ICBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWxfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbF9kZXNjIHJlYWQiOwotICAgICAgICBkYXRhID0gcmVtb3RlRGV2aWNlLT5iZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbF9ub3RpZnk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiByZWFkIHJlcXVlc3QgZm9yIHVua25vd24gaGFuZGxlICIgPDwgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZTsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcnNwLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5hdXRoX3JlcSAgPSAwOwotICAgICAgcnNwLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5oYW5kbGUgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlOwotICAgICAgcnNwLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5vZmZzZXQgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEub2Zmc2V0OwotICAgICAgKih1aW50MTZfdCAqKXJzcC0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAodWludDE2X3QpZGF0YTsKLSAgICAgIHJzcC0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRhdGEpOwotICAgICAgLy9jYyByZXNwb25zZQotICAgICAgcnNwLT5vcGVyLlJlYWREZXNjT3AuZGVzY19oYW5kbGUgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlOwotICAgICAgcnNwLT5vcGVyLlJlYWREZXNjT3AudHJhbnNfaWQgPSBwX2RhdGEtPnJlcV9kYXRhLnRyYW5zX2lkOwotICAgICAgcnNwLT5vcGVyLlJlYWREZXNjT3Auc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX1dSSVRFX0NIQVJBQ1RFUklTVElDX0VWVDogewotCi0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICB0R0FUVF9XUklURV9SRVEgcmVxID0gcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPndyaXRlX3JlcTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHdyaXRlIGNoYXJhY3RlcmlzdGljcyBsZW46ICIgPDwgcmVxLmxlbjsKLSAgICAgIFByaW50RGF0YShyZXEudmFsdWUsIHJlcS5sZW4pOwotICAgICAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0ICpyZW1vdGVEZXZpY2UgPQotICAgICAgICAgIGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgd3JpdGUiOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoIHN0YXR1cyAhPSBCVF9TVEFUVVNfRkFJTCkgewotICAgICAgICByc3AtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZSA9IHJlcS5oYW5kbGU7Ci0gICAgICAgIHJzcC0+b3Blci5Xcml0ZU9wLnRyYW5zX2lkID0gcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLSAgICAgICAgcnNwLT5vcGVyLldyaXRlT3Auc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICAgIHJzcC0+cmVtb3RlRGV2aWNlID0gcmVtb3RlRGV2aWNlOwotICAgICAgICByc3AtPm9wZXIuV3JpdGVPcC5uZWVkX3JzcCA9IHJlcS5uZWVkX3JzcDsKLSAgICAgICAgcnNwLT5vcGVyLldyaXRlT3Aub2Zmc2V0ID0gcmVxLm9mZnNldDsKLSAgICAgICAgcnNwLT5vcGVyLldyaXRlT3AubGVuID0gcmVxLmxlbjsKLSAgICAgICAgcnNwLT5vcGVyLldyaXRlT3AuZGF0YSA9ICh1aW50OF90KikgbWFsbG9jKHNpemVvZih1aW50OF90KSpyZXEubGVuKTsKLSAgICAgICAgbWVtY3B5KHJzcC0+b3Blci5Xcml0ZU9wLmRhdGEsIHJlcS52YWx1ZSwgcmVxLmxlbik7Ci0gICAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfV1JJVEVfUlNQOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfV1JJVEVfREVTQ1JJUFRPUl9FVlQ6IHsKLQotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqIClwYXJhbTsKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHdyaXRlX2Rlc2NfdmFsdWU7Ci0gICAgICB3cml0ZV9kZXNjX3ZhbHVlLmNsZWFyKCk7Ci0gICAgICB1aW50MTZfdCBoYW5kbGUgPSAwOwotICAgICAgdWludDE2X3QgcmVxX3ZhbHVlID0gMDsKLSAgICAgIGNvbnN0IGF1dG8mIHJlcSA9IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT53cml0ZV9yZXE7Ci0gICAgICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKnJlbW90ZURldmljZSA9Ci0gICAgICAgICAgIGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgbm90aWZpY2F0aW9uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXFfdmFsdWUgPSAqKHVpbnQxNl90KiApcmVxLnZhbHVlOwotICAgICAgLy9uZWVkIHRvIGluaXRpYWxpemVkIHdpdGggcHJvcGVyIGVycm9yIGNvZGUKLSAgICAgIGludCBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHdyaXRlIGRlc2NyaXB0b3IgOiIgPDwgcmVxLmhhbmRsZSA8PAotICAgICAgICAgIiBpcyByZXNwOiAiIDw8IHJlcS5uZWVkX3JzcCA8PCAiaXMgcHJlcDogIiA8PCByZXEuaXNfcHJlcCA8PCAiIHZhbHVlICIgPDwgcmVxX3ZhbHVlOwotCi0gICAgICBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdGVfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsX3N0YXRlX2Rlc2MgZGVzY3JpcHRvciB3cml0ZSI7Ci0gICAgICAgIHJlbW90ZURldmljZS0+Y2FsbF9zdGF0ZV9ub3RpZnkgPSByZXFfdmFsdWU7Ci0gICAgICAgIHN0ZDo6bWFwPHVpbnQ4X3QsIHRDQ1NfQ0FMTF9TVEFURT46Oml0ZXJhdG9yIGl0OwotICAgICAgICBmb3IgKGl0ID0gQ2FsbFN0YXRlbGlzdC5iZWdpbigpOyBpdCAhPSBDYWxsU3RhdGVsaXN0LmVuZCgpOyBpdCsrKXsKLSAgICAgICAgICAgIHRDQ1NfQ0FMTF9TVEFURSBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgd3JpdGVfZGVzY192YWx1ZS5wdXNoX2JhY2sob2JqLmluZGV4KTsKLSAgICAgICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUucHVzaF9iYWNrKG9iai5zdGF0ZSk7Ci0gICAgICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhvYmouZmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXRlX2hhbmRsZTsKLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjKSB7Ci0gICAgICAgIHJlbW90ZURldmljZS0+YmVhcmVyX3Byb3ZpZGVyX25hbWVfbm90aWZ5ID0gcmVxX3ZhbHVlOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjIGRlc2NyaXB0b3Igd3JpdGUiOwotICAgICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLmFzc2lnbihCZWFyZXJQcm92aWRlckluZm8ubmFtZSwKLSAgICAgICAgICAgIEJlYXJlclByb3ZpZGVySW5mby5uYW1lICsgc3RybGVuKChjaGFyKilCZWFyZXJQcm92aWRlckluZm8ubmFtZSkpOwotICAgICAgICBoYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3Byb3ZpZGVyX25hbWVfaGFuZGxlOwotICAgICAgfSBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbGNvbnRyb2xfcG9pbnRfZGVzYyB3cml0ZSI7Ci0gICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUucHVzaF9iYWNrKENhbGxDb250cm9sbGVyUmVzcC5vcGNvZGUpOwotICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhDYWxsQ29udHJvbGxlclJlc3AuaW5kZXgpOwotICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhDYWxsQ29udHJvbGxlclJlc3AucmVzcG9uc2Vfc3RhdHVzKTsKLQotICAgICAgICByZW1vdGVEZXZpY2UtPmNhbGxfY29udHJvbF9wb2ludF9ub3RpZnkgPSByZXFfdmFsdWU7Ci0gICAgICAgIGhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX2NvbnRyb2xfcG9pbnRfaGFuZGxlOwotICAgICAgfSBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGJlYXJlcl9zaWduYWxfc3RyZW5ndGggZGVzYyB3cml0ZSI7Ci0gICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUucHVzaF9iYWNrKEJlYXJlclByb3ZpZGVySW5mby5zaWduYWwpOwotICAgICAgICByZW1vdGVEZXZpY2UtPmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfbm90aWZ5ID0gcmVxX3ZhbHVlOwotICAgICAgICBoYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9oYW5kbGU7Ci0gICAgICB9ICBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl91cmlfc2NoZW1lc19zdXBwb3J0ZWRfZGVzYykgewotICAgICAgICAgICAgcmVtb3RlRGV2aWNlLT5iZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX25vdGlmeSA9IHJlcV92YWx1ZTsKLSAgICAgICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUuYXNzaWduKEJlYXJlclByb3ZpZGVySW5mby5iZWFyZXJfc2NoZW1lc19saXN0LAotICAgICAgICAgICAgQmVhcmVyUHJvdmlkZXJJbmZvLmJlYXJlcl9zY2hlbWVzX2xpc3QgKyBzdHJsZW4oKGNoYXIqKUJlYXJlclByb3ZpZGVySW5mby5iZWFyZXJfc2NoZW1lc19saXN0KSk7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWFyZXJfc2NoZW1lc19saXN0IERlc2Mgd3JpdGUiOwotICAgICAgfSBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgICBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2Rlc2MpIHsKLSAgICAgICAgc3RkOjptYXA8dWludDhfdCwgdENDU19CRUFSRVJfTElTVF9DVVJSRU5UX0NBTExTPjo6aXRlcmF0b3IgaXQ7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGJlYXJlcl9saXN0X2N1cnJlbnRjYWxsIGRlc2Mgd3JpdGUiOwotICAgICAgICBmb3IgKGl0ID0gQmxjY0luZm9saXN0LmJlZ2luKCk7IGl0ICE9IEJsY2NJbmZvbGlzdC5lbmQoKTsgaXQrKyl7Ci0gICAgICAgICAgICB0Q0NTX0JFQVJFUl9MSVNUX0NVUlJFTlRfQ0FMTFMgb2JqID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUucHVzaF9iYWNrKG9iai5saXN0X2xlbmd0aCk7Ci0gICAgICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhvYmouY2FsbF9pbmRleCk7Ci0gICAgICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhvYmouY2FsbF9zdGF0ZSk7Ci0gICAgICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhvYmouY2FsbF9mbGFncyk7Ci0gICAgICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLmluc2VydCh3cml0ZV9kZXNjX3ZhbHVlLmVuZCgpLAotICAgICAgICAgICAgICAgIG9iai5jYWxsX3VyaSwgb2JqLmNhbGxfdXJpKyhvYmoubGlzdF9sZW5ndGgtMykpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW90ZURldmljZS0+YmVhcmVyX2N1cnJlbnRfY2FsbHNfbGlzdF9ub3RpZnkgPSByZXFfdmFsdWU7Ci0gICAgICAgIGhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfbGlzdF9jdXJyZW50Y2FsbHNfaGFuZGxlOwotCi0gICAgICB9IGVsc2UgaWYocmVxLmhhbmRsZSA9PQotICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdGVjaG5vbG9neV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGJlYXJlcl90ZWNobm9sb2d5X2Rlc2Mgd3JpdGUiOwotICAgICAgICByZW1vdGVEZXZpY2UtPmJlYXJlcl90ZWNobm9sb2d5X2NoYW5nZWRfbm90aWZ5ID0gcmVxX3ZhbHVlOwotICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhCZWFyZXJQcm92aWRlckluZm8udGVjaG5vbG9neV90eXBlKTsKLSAgICAgICAgaGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl90ZWNobm9sb2d5X2hhbmRsZTsKLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfZnJpZW5kbHlfbmFtZV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxfZnJpZW5kbHlfbmFtZV9kZXNjIHJlYWQiOwotICAgICAgICByZW1vdGVEZXZpY2UtPmNhbGxfZnJpZW5kbHlfbmFtZV9ub3RpZnkgPSByZXFfdmFsdWU7Ci0gICAgICAgIGludCBsZW4gPSAxICsgc3RybGVuKChjaGFyKilGcmllbmRseU5hbWUubmFtZSk7Ci0gICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUuYXNzaWduKCh1aW50OF90KikmRnJpZW5kbHlOYW1lLCAodWludDhfdCopJkZyaWVuZGx5TmFtZStsZW4pOwotICAgICAgICBoYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9mcmllbmRseV9uYW1lX2hhbmRsZTsKLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfdGVybWluYXRpb25fcmVhc29uX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fZGVzYyB3cml0ZSI7Ci0gICAgICAgIHJlbW90ZURldmljZS0+Y2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fbm90aWZ5ID0gcmVxX3ZhbHVlOwotICAgICAgICBoYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25faGFuZGxlOwotICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLnB1c2hfYmFjayhUZXJtaW5hdGlvblJlYXNvbi5pbmRleCk7Ci0gICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUucHVzaF9iYWNrKFRlcm1pbmF0aW9uUmVhc29uLnJlYXNvbik7Ci0KLSAgICAgICAgaGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfdGVybWluYXRpb25fcmVhc29uX2hhbmRsZTsKLSAgICB9IGVsc2UgaWYocmVxLmhhbmRsZSA9PQotICAgICAgICAgIGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXR1c19mbGFnc19kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFN0YXR1cyBGbGFncyBEZXNjIHdyaXRlIjsKLSAgICAgICAgcmVtb3RlRGV2aWNlLT5zdGF0dXNfZmxhZ3Nfbm90aWZ5PSByZXFfdmFsdWU7Ci0gICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUucHVzaF9iYWNrKFN0YXR1c0ZsYWdzLnN1cHBvcnRlZF9mbGFncyk7Ci0gICAgICAgIGhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXR1c19mbGFnc19oYW5kbGU7Ci0KLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfdGFyZ2V0X2JlYXJlclVSSV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEluY29taW5nIHRhcmdldCBiZWFyZXIgZGVzYyB3cml0ZSI7Ci0gICAgICAgIGludCBsZW4gPSAxICsgc3RybGVuKChjaGFyKilJbmNvbWluZ0NhbGxUYXJnZXRVcmkuaW5jb21pbmdfdGFyZ2V0X3VyaSk7Ci0gICAgICAgIHdyaXRlX2Rlc2NfdmFsdWUuYXNzaWduKCh1aW50OF90KikmSW5jb21pbmdDYWxsVGFyZ2V0VXJpLCAodWludDhfdCopJkluY29taW5nQ2FsbFRhcmdldFVyaStsZW4pOwotICAgICAgICByZW1vdGVEZXZpY2UtPmluY29taW5nX2NhbGxfdGFyZ2V0X1VSSV9ub3RpZnk9IHJlcV92YWx1ZTsKLSAgICAgICAgaGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfdGFyZ2V0X2JlYXJlcnVyaV9oYW5kbGU7Ci0KLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgICAgY2NzQ29udHJvbFNlcnZpY2VJbmZvLmluY29taW5nX2NhbGxfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBJbmNvbWluZyBDYWxsIGRlc2Mgd3JpdGUiOwotICAgICAgICByZW1vdGVEZXZpY2UtPmluY29taW5nX2NhbGxfc3RhdGVfbm90aWZ5ID0gcmVxX3ZhbHVlOwotICAgICAgICBpbnQgbGVuID0gMSArIHN0cmxlbigoY2hhciopSW5jb21pbmdDYWxsSW5mby5pbmNvbWluZ191cmkpOwotICAgICAgICB3cml0ZV9kZXNjX3ZhbHVlLmFzc2lnbigodWludDhfdCopJkluY29taW5nQ2FsbEluZm8sICh1aW50OF90KikmSW5jb21pbmdDYWxsSW5mbytsZW4pOwotCi0gICAgICAgIGhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX2hhbmRsZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRlc2NyaXB0b3Igd3JpdGUgbm90IG1hdGNoZWQiOwotICAgICAgICBzdGF0dXMgPSA0OyAvL2NoZWNrIGVycm9yIGNvZGUKLSAgICAgIH0KLSAgICAgIHJzcC0+b3Blci5Xcml0ZURlc2NPcC5kZXNjX2hhbmRsZSA9IHJlcS5oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVEZXNjT3AudHJhbnNfaWQgPSBwX2RhdGEtPnJlcV9kYXRhLnRyYW5zX2lkOwotICAgICAgcnNwLT5vcGVyLldyaXRlRGVzY09wLnN0YXR1cyA9IHN0YXR1czsKLSAgICAgIHJzcC0+b3Blci5Xcml0ZURlc2NPcC5uZWVkX3JzcCA9IHJlcS5uZWVkX3JzcDsKLSAgICAgIHJzcC0+b3Blci5Xcml0ZURlc2NPcC5ub3RpZmljYXRpb24gPSByZXFfdmFsdWU7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVEZXNjT3AudmFsdWUgPSBzdGQ6Om1vdmUod3JpdGVfZGVzY192YWx1ZSk7Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19FWEVDX1dSSVRFX0VWVDogewotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfQ0xPU0VfRVZUOiB7Ci0gICAgICAgLy9ub3QgcmVxdWlyZWQKLSAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19QSFlfVVBEQVRFX0VWVDogewotCi0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKnJlbW90ZURldmljZSA9Ci0gICAgICAgIGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnBoeV91cGRhdGUuY29ubl9pZCk7Ci0gICAgICBpZihyZW1vdGVEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2Ugbm90IGZvdW5kIGlnbm9yZSBwaHkgdXBkYXRlICIKLSAgICAgICAgICAgICA8PCBwX2RhdGEtPnBoeV91cGRhdGUuc3RhdHVzOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX1BIWV9VUERBVEU7Ci0gICAgICByc3AtPm9wZXIuUGh5T3AucnhfcGh5ID0gcF9kYXRhLT5waHlfdXBkYXRlLnJ4X3BoeTsKLSAgICAgIHJzcC0+b3Blci5QaHlPcC50eF9waHkgPSBwX2RhdGEtPnBoeV91cGRhdGUudHhfcGh5OwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19DT05OX1VQREFURV9FVlQ6IHsKLSAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCAqcmVtb3RlRGV2aWNlID0KLSAgICAgICAgY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+cGh5X3VwZGF0ZS5jb25uX2lkKTsKLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5lY3Rpb24gdXBkYXRlIGRldmljZSBub3QgZm91bmQiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5lY3Rpb24gdXBkYXRlIHN0YXR1cyAiIDw8IHBfZGF0YS0+cGh5X3VwZGF0ZS5zdGF0dXM7Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX0NPTk5FQ1RJT05fVVBEQVRFOwotICAgICAgcnNwLT5vcGVyLkNvbm5lY3Rpb25VcGRhdGVPcC5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICByc3AtPm9wZXIuQ29ubmVjdGlvblVwZGF0ZU9wLnJlbW90ZURldmljZS0+bGF0ZW5jeSA9IHBfZGF0YS0+Y29ubl91cGRhdGUubGF0ZW5jeTsKLSAgICAgIHJzcC0+b3Blci5Db25uZWN0aW9uVXBkYXRlT3AucmVtb3RlRGV2aWNlLT50aW1lb3V0ID0gcF9kYXRhLT5jb25uX3VwZGF0ZS50aW1lb3V0OwotICAgICAgcnNwLT5vcGVyLkNvbm5lY3Rpb25VcGRhdGVPcC5yZW1vdGVEZXZpY2UtPmludGVydmFsID0gcF9kYXRhLT5jb25uX3VwZGF0ZS5pbnRlcnZhbDsKLSAgICAgIHJzcC0+b3Blci5Db25uZWN0aW9uVXBkYXRlT3Auc3RhdHVzID0gcF9kYXRhLT5jb25uX3VwZGF0ZS5zdGF0dXM7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX0FDVElWRV9ERVZJQ0VfVVBEQVRFOgotICAgIHsKLSAgICAgIHRDQ1NfU0VUX0FDVElWRV9ERVZJQ0UgKmRhdGEgPSAodENDU19TRVRfQUNUSVZFX0RFVklDRSAqKXBhcmFtOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0NTX0FDVElWRV9ERVZJQ0VfVVBEQVRFIGFkZHJlc3MgIiA8PCBkYXRhLT5hZGRyZXNzOwotICAgICAgaWYgKGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUFkZHJlc3MoZGF0YS0+YWRkcmVzcykgIT0gTlVMTCkgewotICAgICAgICBjY19pbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5BZGRTZXRBY3RpdmVEZXZpY2UoZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBDQ1NfQUNUSVZFX0RFVklDRV9VUERBVEUgZmFpbGVkIGFzIGdpdmVuIHJlbW90ZSBpcyBub3QgcmVnaXN0ZXJlZCBmb3Igbm90aWYgIiA8PCBkYXRhLT5hZGRyZXNzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ0NTX0NPTk5FQ1RJT05fQ0xPU0VfRVZFTlQ6Ci0gICAgewotICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDQ1NfQ0FMTF9TVEFURV9VUERBVEU6Ci0gICAgewotICAgICAgc3RkOjptYXA8dWludDhfdCwgdENDU19DQUxMX1NUQVRFPjo6aXRlcmF0b3IgaXQ7Ci0gICAgICBmb3IgKGl0ID0gQ2FsbFN0YXRlbGlzdC5iZWdpbigpOyBpdCAhPSBDYWxsU3RhdGVsaXN0LmVuZCgpOyBpdCsrKXsKLSAgICAgICAgdENDU19DQUxMX1NUQVRFIG9iaiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIF9kYXRhLnB1c2hfYmFjayhvYmouaW5kZXgpOwotICAgICAgICBfZGF0YS5wdXNoX2JhY2sob2JqLnN0YXRlKTsKLSAgICAgICAgX2RhdGEucHVzaF9iYWNrKG9iai5mbGFncyk7Ci0gICAgICB9Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3N0YXRlX2hhbmRsZTsKLSAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ0NTX0JFQVJFUl9OQU1FX1VQREFURToKLSAgICB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDQ1NfQkVBUkVSX05BTUVfVVBEQVRFIjsKLSAgICAgIHRDQ1NfQkVBUkVSX1BST1ZJREVSX0lORk8gKmRhdGEgPSAodENDU19CRUFSRVJfUFJPVklERVJfSU5GTyopIHBhcmFtOwotICAgICAgdWludDE2X3QgbGVuID0gc3RybGVuKChjaGFyKilkYXRhLT5uYW1lKTsKLSAgICAgIFJldmVyc2VCeXRlT3JkZXIoZGF0YS0+bmFtZSwgbGVuKTsKLSAgICAgIG1lbWNweShCZWFyZXJQcm92aWRlckluZm8ubmFtZSwgZGF0YS0+bmFtZSwgbGVuKTsKLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9wcm92aWRlcl9uYW1lX2hhbmRsZTsKLSAgICAgIF9kYXRhLmFzc2lnbihCZWFyZXJQcm92aWRlckluZm8ubmFtZSwKLSAgICAgICAgICBCZWFyZXJQcm92aWRlckluZm8ubmFtZSArIGxlbik7Ci0gICAgICBpc0NhbGxDb250cm9sbGVyT3BVc2VkID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX09QVF9PUENPREVTOgotICAgIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENDU19PUFRfT1BDT0RFUyI7Ci0gICAgICB0Q0NTX1NVUFBfT1BUSU9OQUxfT1BDT0RFUyAqZGF0YSA9ICh0Q0NTX1NVUFBfT1BUSU9OQUxfT1BDT0RFUyopIHBhcmFtOwotICAgICAgU3VwcG9ydGVkT3B0aW9uYWxPcGNvZGVzLnN1cHBfb3Bjb2RlID0gZGF0YS0+c3VwcF9vcGNvZGU7Ci0KLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX2hhbmRsZTsKLQotICAgICAgX2RhdGEucHVzaF9iYWNrKFN1cHBvcnRlZE9wdGlvbmFsT3Bjb2Rlcy5zdXBwX29wY29kZSk7Ci0gICAgICBpc0NhbGxDb250cm9sbGVyT3BVc2VkID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX0JFQVJFUl9DVVJSRU5UX0NBTExfTElTVF9VUERBVEU6Ci0gICAgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0NTX0JFQVJFUl9DVVJSRU5UX0NBTExfTElTVF9VUERBVEUiOwotICAgICAgc3RkOjptYXA8dWludDhfdCwgdENDU19CRUFSRVJfTElTVF9DVVJSRU5UX0NBTExTPjo6aXRlcmF0b3IgaXQ7Ci0gICAgICBmb3IgKGl0ID0gQmxjY0luZm9saXN0LmJlZ2luKCk7IGl0ICE9IEJsY2NJbmZvbGlzdC5lbmQoKTsgaXQrKyl7Ci0gICAgICAgICAgdENDU19CRUFSRVJfTElTVF9DVVJSRU5UX0NBTExTIG9iaiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgX2RhdGEucHVzaF9iYWNrKG9iai5saXN0X2xlbmd0aCk7Ci0gICAgICAgICAgX2RhdGEucHVzaF9iYWNrKG9iai5jYWxsX2luZGV4KTsKLSAgICAgICAgICBfZGF0YS5wdXNoX2JhY2sob2JqLmNhbGxfc3RhdGUpOwotICAgICAgICAgIF9kYXRhLnB1c2hfYmFjayhvYmouY2FsbF9mbGFncyk7Ci0gICAgICAgICAgX2RhdGEuaW5zZXJ0KF9kYXRhLmVuZCgpLAotICAgICAgICAgICAgICBvYmouY2FsbF91cmksIG9iai5jYWxsX3VyaSsob2JqLmxpc3RfbGVuZ3RoLTMpKTsKLSAgICAgIH0KLQotICAgICAgcnNwLT5ldmVudCA9IENDU19OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2hhbmRsZTsKLSAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfQkVBUkVSX1NJR05BTF9TVFJFTkdUSF9VUERBVEU6Ci0gICAgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0NTX0JFQVJFUl9TSUdOQUxfU1RSRU5HVEhfVVBEQVRFIjsKLSAgICAgIHRDQ1NfQkVBUkVSX1BST1ZJREVSX0lORk8gKmRhdGEgPSAodENDU19CRUFSRVJfUFJPVklERVJfSU5GTyAqKSBwYXJhbTsKLSAgICAgIEJlYXJlclByb3ZpZGVySW5mby5zaWduYWwgPSBkYXRhLT5zaWduYWw7Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX2hhbmRsZTsKLSAgICAgIC8vY29udHJvbCB3aGV0aGVyIG5vdGlmaWNhdGlvbiBoYXMgdG8gaGFwcGVuIGJhc2VkCi0gICAgICAvL29uIHJlcG9ydGluZyBJbnRlcnZhbCB0aW1lIG9yIG5vdAotICAgICAgcnNwLT5mb3JjZSA9IGZhbHNlOwotICAgICAgX2RhdGEucHVzaF9iYWNrKEJlYXJlclByb3ZpZGVySW5mby5zaWduYWwpOwotICAgICAgaXNDYWxsQ29udHJvbGxlck9wVXNlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19CRUFSRVJfVEVDSE5PTE9HWV9VUERBVEU6Ci0gICAgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0NTX0JFQVJFUl9URUNITk9MT0dZX1VQREFURSI7Ci0gICAgICB0Q0NTX0JFQVJFUl9QUk9WSURFUl9JTkZPICpkYXRhID0gKHRDQ1NfQkVBUkVSX1BST1ZJREVSX0lORk8gKikgcGFyYW07Ci0gICAgICBCZWFyZXJQcm92aWRlckluZm8udGVjaG5vbG9neV90eXBlID0gZGF0YS0+dGVjaG5vbG9neV90eXBlOwotICAgICAgcnNwLT5ldmVudCA9IENDU19OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uYmVhcmVyX3RlY2hub2xvZ3lfaGFuZGxlOwotICAgICAgX2RhdGEucHVzaF9iYWNrKEJlYXJlclByb3ZpZGVySW5mby50ZWNobm9sb2d5X3R5cGUpOwotICAgICAgaXNDYWxsQ29udHJvbGxlck9wVXNlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19CRUFSRVJfVVJJX1NDSEVNRVNfU1VQUE9SVEVEOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDQ1NfQkVBUkVSX1VSSV9TQ0hFTUVTX1NVUFBPUlRFRCI7Ci0gICAgICB0Q0NTX0JFQVJFUl9QUk9WSURFUl9JTkZPICpkYXRhID0gKHRDQ1NfQkVBUkVSX1BST1ZJREVSX0lORk8qKSBwYXJhbTsKLSAgICAgIEJlYXJlclByb3ZpZGVySW5mby5iZWFyZXJfbGlzdF9sZW4gPSBkYXRhLT5iZWFyZXJfbGlzdF9sZW47Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDQ1NfQkVBUkVSX1VSSV9TQ0hFTUVTX1NVUFBPUlRFRDogbGVuICIgPDxCZWFyZXJQcm92aWRlckluZm8uYmVhcmVyX2xpc3RfbGVuOwotICAgICAgUmV2ZXJzZUJ5dGVPcmRlcihkYXRhLT5iZWFyZXJfc2NoZW1lc19saXN0LCBCZWFyZXJQcm92aWRlckluZm8uYmVhcmVyX2xpc3RfbGVuKTsKLSAgICAgIG1lbWNweShCZWFyZXJQcm92aWRlckluZm8uYmVhcmVyX3NjaGVtZXNfbGlzdCwgZGF0YS0+YmVhcmVyX3NjaGVtZXNfbGlzdCwgQmVhcmVyUHJvdmlkZXJJbmZvLmJlYXJlcl9saXN0X2xlbik7Ci0gICAgICByc3AtPmV2ZW50ID0gQ0NTX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX2hhbmRsZTsKLSAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgX2RhdGEuYXNzaWduKEJlYXJlclByb3ZpZGVySW5mby5iZWFyZXJfc2NoZW1lc19saXN0LAotICAgICAgICAgIEJlYXJlclByb3ZpZGVySW5mby5iZWFyZXJfc2NoZW1lc19saXN0ICsgQmVhcmVyUHJvdmlkZXJJbmZvLmJlYXJlcl9saXN0X2xlbik7Ci0gICAgICBpc0NhbGxDb250cm9sbGVyT3BVc2VkID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX0lOQ09NSU5HX0NBTExfVVBEQVRFOgotICAgIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENDU19JTkNPTUlOR19DQUxMX1VQREFURSI7Ci0gICAgICB0Q0NTX0lOQ09NSU5HX0NBTEwqIGRhdGEgPSAodENDU19JTkNPTUlOR19DQUxMICopIHBhcmFtOwotICAgICAgSW5jb21pbmdDYWxsSW5mby5pbmRleCA9IGRhdGEtPmluZGV4OwotICAgICAgdWludDE2X3QgbGVuID0gc3RybGVuKChjaGFyKilkYXRhLT5pbmNvbWluZ191cmkpOwotICAgICAgUmV2ZXJzZUJ5dGVPcmRlcihkYXRhLT5pbmNvbWluZ191cmksIGxlbik7Ci0gICAgICBtZW1jcHkoSW5jb21pbmdDYWxsSW5mby5pbmNvbWluZ191cmksIGRhdGEtPmluY29taW5nX3VyaSwgbGVuKTsKLQotICAgICAgcnNwLT5ldmVudCA9IENDU19OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBjY3NDb250cm9sU2VydmljZUluZm8uaW5jb21pbmdfY2FsbF9oYW5kbGU7Ci0gICAgICBfZGF0YS5wdXNoX2JhY2soSW5jb21pbmdDYWxsSW5mby5pbmRleCk7Ci0gICAgICBfZGF0YS5pbnNlcnQoX2RhdGEuZW5kKCksIEluY29taW5nQ2FsbEluZm8uaW5jb21pbmdfdXJpLAotICAgICAgICAgICAgICAgICAgIEluY29taW5nQ2FsbEluZm8uaW5jb21pbmdfdXJpICsgbGVuKTsKLSAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfSU5DT01JTkdfVEFSR0VUX1VSSV9VUERBVEU6Ci0gICAgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0NTX0lOQ09NSU5HX1RBUkdFVF9VUklfVVBEQVRFIjsKLSAgICAgIHRDQ1NfSU5DT01JTkdfQ0FMTF9VUkkqIGRhdGEgPSAodENDU19JTkNPTUlOR19DQUxMX1VSSSAqKSBwYXJhbTsKLSAgICAgIEluY29taW5nQ2FsbFRhcmdldFVyaS5pbmRleCA9IGRhdGEtPmluZGV4OwotICAgICAgdWludDE2X3QgbGVuID0gc3RybGVuKChjaGFyKilkYXRhLT5pbmNvbWluZ190YXJnZXRfdXJpKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENDU19JTkNPTUlOR19UQVJHRVRfVVJJX1VQREFURTogdXJpbGVuICIgPDwgbGVuOwotICAgICAgUmV2ZXJzZUJ5dGVPcmRlcihkYXRhLT5pbmNvbWluZ190YXJnZXRfdXJpLCBsZW4pOwotICAgICAgbWVtY3B5KEluY29taW5nQ2FsbFRhcmdldFVyaS5pbmNvbWluZ190YXJnZXRfdXJpLCBkYXRhLT5pbmNvbWluZ190YXJnZXRfdXJpLCBsZW4pOwotCi0gICAgICByc3AtPmV2ZW50ID0gQ0NTX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5pbmNvbWluZ19jYWxsX3RhcmdldF9iZWFyZXJ1cmlfaGFuZGxlOwotICAgICAgX2RhdGEucHVzaF9iYWNrKEluY29taW5nQ2FsbFRhcmdldFVyaS5pbmRleCk7Ci0gICAgICBfZGF0YS5pbnNlcnQoX2RhdGEuZW5kKCksIEluY29taW5nQ2FsbFRhcmdldFVyaS5pbmNvbWluZ190YXJnZXRfdXJpLAotICAgICAgICAgICAgICAgICAgIEluY29taW5nQ2FsbFRhcmdldFVyaS5pbmNvbWluZ190YXJnZXRfdXJpICsgbGVuKTsKLSAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfVEVSTUlOQVRJT05fUkVBU09OX1VQREFURToKLSAgICB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENDU19URVJNSU5BVElPTl9SRUFTT05fVVBEQVRFIjsKLSAgICAgICAgdENDU19URVJNX1JFQVNPTiogZGF0YSA9ICh0Q0NTX1RFUk1fUkVBU09OICopIHBhcmFtOwotICAgICAgICBUZXJtaW5hdGlvblJlYXNvbi5pbmRleCA9IGRhdGEtPmluZGV4OwotICAgICAgICBUZXJtaW5hdGlvblJlYXNvbi5yZWFzb24gPSBkYXRhLT5yZWFzb247Ci0KLSAgICAgICAgcnNwLT5ldmVudCA9IENDU19OT1RJRllfQUxMOwotICAgICAgICByc3AtPmhhbmRsZSA9IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5jYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9oYW5kbGU7Ci0gICAgICAgIF9kYXRhLnB1c2hfYmFjayhUZXJtaW5hdGlvblJlYXNvbi5pbmRleCk7Ci0gICAgICAgIF9kYXRhLnB1c2hfYmFjayhUZXJtaW5hdGlvblJlYXNvbi5yZWFzb24pOwotCi0gICAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19TVEFUVVNfRkxBR1NfVVBEQVRFOgotICAgIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENDU19TVEFUVVNfRkxBR1NfVVBEQVRFIjsKLSAgICAgIHRDQ1NfU1RBVFVTX0ZMQUdTICpkYXRhID0gKHRDQ1NfU1RBVFVTX0ZMQUdTKikgcGFyYW07Ci0KLSAgICAgIFJldmVyc2VCeXRlT3JkZXIoKHVuc2lnbmVkIGNoYXIqKSZkYXRhLT5zdXBwb3J0ZWRfZmxhZ3MsIHNpemVvZihkYXRhLT5zdXBwb3J0ZWRfZmxhZ3MpKTsKLSAgICAgIFN0YXR1c0ZsYWdzLnN1cHBvcnRlZF9mbGFncyA9IGRhdGEtPnN1cHBvcnRlZF9mbGFnczsKLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfc3RhdHVzX2ZsYWdzX2hhbmRsZTsKLSAgICAgIF9kYXRhLnB1c2hfYmFjayhTdGF0dXNGbGFncy5zdXBwb3J0ZWRfZmxhZ3MpOwotICAgICAgaXNDYWxsQ29udHJvbGxlck9wVXNlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19DQ0lEX1VQREFURToKLSAgICB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDQ1NfQ0NJRF9VUERBVEUiOwotICAgICAgdENDU19DT05URU5UX0NPTlRST0xfSUQgKmRhdGEgPSAodENDU19DT05URU5UX0NPTlRST0xfSUQgKikgcGFyYW07Ci0gICAgICBSZXZlcnNlQnl0ZU9yZGVyKCh1bnNpZ25lZCBjaGFyKikmZGF0YS0+Y2NpZCwgc2l6ZW9mKGRhdGEtPmNjaWQpKTsKLSAgICAgIENjaWRJbmZvLmNjaWQgPSAodWludDMyX3QpZGF0YS0+Y2NpZDsKLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNjaWRfaGFuZGxlOwotICAgICAgX2RhdGEucHVzaF9iYWNrKENjaWRJbmZvLmNjaWQpOwotICAgICAgaXNDYWxsQ29udHJvbGxlck9wVXNlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19DQUxMX0NPTlRST0xfUkVTUE9OU0U6Ci0gICAgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0NTX0NBTExfQ09OVFJPTF9SRVNQT05TRSI7Ci0KLSAgICAgIHJzcC0+ZXZlbnQgPSBDQ1NfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmNhbGxfY29udHJvbF9wb2ludF9oYW5kbGU7Ci0gICAgICBfZGF0YS5wdXNoX2JhY2soQ2FsbENvbnRyb2xsZXJSZXNwLm9wY29kZSk7Ci0gICAgICBfZGF0YS5wdXNoX2JhY2soQ2FsbENvbnRyb2xsZXJSZXNwLmluZGV4KTsKLSAgICAgIF9kYXRhLnB1c2hfYmFjayhDYWxsQ29udHJvbGxlclJlc3AucmVzcG9uc2Vfc3RhdHVzKTsKLSAgICAgIGlzQ2FsbENvbnRyb2xsZXJPcFVzZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBldmVudCBub3QgbWF0Y2hlZCAhISI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmKHJzcC0+ZXZlbnQgIT0gQ0NTX05PTkVfRVZFTlQpIHsKLSAgICBpZiAoaXNDYWxsQ29udHJvbGxlck9wVXNlZCA9PSB0cnVlKSB7Ci0gICAgICAgIHJzcC0+b3Blci5DYWxsQ29udHJvbGxlck9wLmRhdGEgPSBzdGQ6Om1vdmUoX2RhdGEpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBBZnRlciBNb3Zpbmcgc2l6ZSAiIDw8IHJzcC0+b3Blci5DYWxsQ29udHJvbGxlck9wLmRhdGEuc2l6ZSgpOwotICAgIH0KLSAgICBDQ1NIYW5kbGVyKHJzcC0+ZXZlbnQsIHJzcCk7Ci0gIH0KLSAgaWYocnNwKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJmcmVlIHJzcCBkYXRhIjsKLSAgICBmcmVlKHJzcCk7Ci0gIH0KLX0KLQotCi0KLXZvaWQgQlRDY0NiYWNrKHRCVEFfR0FUVFNfRVZUIGV2ZW50LCB0QlRBX0dBVFRTKiBwYXJhbSkgewotCi0gICBIYW5kbGVDY3NFdmVudCgodWludDMyX3QpZXZlbnQsIHBhcmFtKTsKLX0KLQotCi0gYm9vbCBEZXZpY2VTdGF0ZUNvbm5lY3Rpb25IYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2UgY29ubmVjdGVkIGhhbmRsZSAiIDw8IGV2ZW50OwotICB0Y2NfcmVzcF90ICpwX2RhdGEgPSAodGNjX3Jlc3BfdCAqKSBwYXJhbTsKLSAgc3dpdGNoIChldmVudCkgewotCi0gICAgY2FzZSBDQ1NfTk9USUZZX0FMTDogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdGlmeSBhbGwiOwotICAgICAgaWYgKHBfZGF0YS0+aGFuZGxlID09IGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5iZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX2hhbmRsZSkgewotICAgICAgICAgIGlmIChwX2RhdGEtPmZvcmNlID09IGZhbHNlICYmCi0gICAgICAgICAgICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+c2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbCAhPSAwKSB7Ci0gICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiTm90IGEgdGltZXIgZXhwaXJlZCBwdXNoLCBkb250IG5vdGlmeSB0byByZW1vdGUiOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBHYXR0c09wc1F1ZXVlOjpTZW5kTm90aWZpY2F0aW9uKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5vcGVyLkNhbGxDb250cm9sbGVyT3AuZGF0YSwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfUkVBRF9SU1A6Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZSBDQ1NfUkVBRF9SU1AgdXBkYXRlICIgPDwgZXZlbnQ7Ci0gICAgICBCVEFfR0FUVFNfU2VuZFJzcChwX2RhdGEtPnJlbW90ZURldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLlJlYWRPcC50cmFuc19pZCwKLSAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUywgJnBfZGF0YS0+cnNwX3ZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDQ1NfREVTQ1JJUFRPUl9SRUFEX1JTUDoKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIENDU19ERVNDUklQVE9SX1JFQURfUlNQIHVwZGF0ZSAiIDw8IGV2ZW50OwotICAgICAgQlRBX0dBVFRTX1NlbmRSc3AocF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbm5faWQsIHBfZGF0YS0+b3Blci5SZWFkRGVzY09wLnRyYW5zX2lkLAotICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTLCAmcF9kYXRhLT5yc3BfdmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENDU19ERVNDUklQVE9SX1dSSVRFX1JTUDoKLSAgICB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2UgQ0NTX0RFU0NSSVBUT1JfV1JJVEVfUlNQIHVwZGF0ZSByc3A6ICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLm5lZWRfcnNwOwotICAgICAgdEdBVFRTX1JTUCByc3Bfc3RydWN0OwotICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLmhhbmRsZSA9IHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUuaGFuZGxlOwotICAgICAgcnNwX3N0cnVjdC5hdHRyX3ZhbHVlLm9mZnNldCA9IHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUub2Zmc2V0OwotICAgICAgaWYgKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25nZXN0ZWQgPT0gZmFsc2UgJiYKLSAgICAgICAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5uZWVkX3JzcCkgewotICAgICAgICAvL3NlbmQgcnNwIHRvIHdyaXRlCi0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdldHQgc2VuZCByc3AiOwotICAgICAgICBCVEFfR0FUVFNfU2VuZFJzcChwX2RhdGEtPnJlbW90ZURldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLnRyYW5zX2lkLAotICAgICAgICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLnN0YXR1cywgJnJzcF9zdHJ1Y3QpOwotICAgICAgfQotICAgICAgaWYgKCFwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3Auc3RhdHVzICYmIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5ub3RpZmljYXRpb24pIHsKLSAgICAgICAgLy9ub3RpZnkgdXBkYXRlIHRvIHJlZ2lzdGVyIGRldmljZQotICAgICAgICBHYXR0c09wc1F1ZXVlOjpTZW5kTm90aWZpY2F0aW9uKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AudmFsdWUsIGZhbHNlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG5vdGlmaWNhdGlvbiBkaXNhYmxlICBoYW5kbGUgOiAiIDw8IHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX1dSSVRFX1JTUDogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIENDU19XUklURV9SU1AgdXBkYXRlICIgPDwgZXZlbnQ7Ci0gICAgICBib29sIG5lZWRfcnNwID0gcF9kYXRhLT5vcGVyLldyaXRlT3AubmVlZF9yc3A7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2UgQ0NTX1dSSVRFX1JTUCB1cGRhdGUgIiA8PCBldmVudCA8PCAiIG5lZWRfcnNwOiAiIDw8bmVlZF9yc3A7Ci0gICAgICBpZiAobmVlZF9yc3ApIHsKLSAgICAgICAgIEJUQV9HQVRUU19TZW5kUnNwKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuV3JpdGVPcC50cmFuc19pZCwKLSAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUywgJnBfZGF0YS0+cnNwX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX0NPTk5FQ1RJT05fVVBEQVRFOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2UgY2Nvbm5lY3Rpb24gdXBkYXRlICIgPDwgZXZlbnQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19QSFlfVVBEQVRFOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2UgQ0NTX1BIWV9VUERBVEUgdXBkYXRlICIgPDwgZXZlbnQ7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+cnhfcGh5ID0gcF9kYXRhLT5vcGVyLlBoeU9wLnJ4X3BoeTsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT50eF9waHkgPSBwX2RhdGEtPm9wZXIuUGh5T3AudHhfcGh5OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfTVRVX1VQREFURTogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIENDU19NVFVfVVBEQVRFIHVwZGF0ZSAiIDw8IGV2ZW50OwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPm10dSA9IHBfZGF0YS0+b3Blci5NdHVPcC5tdHU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19DT05HRVNUSU9OX1VQREFURTogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZSBDQ1NfQ09OR0VTVElPTl9VUERBVEUgdXBkYXRlOiAiIDw8IGV2ZW50OwotICAgICAgQ2NwQ29uZ2VzdGlvblVwZGF0ZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfRElTQ09OTkVDVElPTjogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIENDU19ESVNDT05ORUNUSU9OIHJlbW92ZSAiIDw8IGV2ZW50OwotICAgICAgY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuUmVtb3ZlKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5wZWVyX2JkYSk7Ci0gICAgICBjY19pbnN0YW5jZS0+Q29ubmVjdGlvblN0YXRlQ2FsbGJhY2soQ0NTX0RJU0NPTk5FQ1RFRCwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBlZXJfYmRhKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX0NPTk5FQ1RJT05fQ0xPU0VfRVZFTlQ6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZSBjb25uZWN0aW9uIGNsb3NpbmciOwotICAgICAgICAvLyBDbG9zZSBhY3RpdmUgY29ubmVjdGlvbgotICAgICAgaWYgKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkICE9IDApCi0gICAgICAgIEJUQV9HQVRUU19DbG9zZShwX2RhdGEtPnJlbW90ZURldmljZS0+Y29ubl9pZCk7Ci0gICAgICBlbHNlCi0gICAgICAgIEJUQV9HQVRUU19DYW5jZWxPcGVuKGNjc0NvbnRyb2xTZXJ2aWNlSW5mby5zZXJ2ZXJfaWYsIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5wZWVyX2JkYSwgdHJ1ZSk7Ci0gICAgICAgIC8vIENhbmNlbCBwZW5kaW5nIGJhY2tncm91bmQgY29ubmVjdGlvbnMKLSAgICAgICAgQlRBX0dBVFRTX0NhbmNlbE9wZW4oY2NzQ29udHJvbFNlcnZpY2VJbmZvLnNlcnZlcl9pZiwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBlZXJfYmRhLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19CT05EX1NUQVRFX0NIQU5HRV9FVkVOVDoKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEJvbmQgc3RhdGUgY2hhbmdlIjsKLSAgICAgIGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLlJlbW92ZShwX2RhdGEtPnJlbW90ZURldmljZS0+cGVlcl9iZGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZXZlbnQgbm90IG1hdGNoZWQiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotYm9vbCBEZXZpY2VTdGF0ZURpc2Nvbm5lY3RlZEhhbmRsZXIodWludDMyX3QgZXZlbnQsIHZvaWQqIHBhcmFtKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZSBkaXNjb25uZWN0ZWQgaGFuZGxlICIgPDwgZXZlbnQ7Ci0gIHRjY19yZXNwX3QgKnBfZGF0YSA9ICh0Y2NfcmVzcF90ICopIHBhcmFtOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBDQ1NfQ09OTkVDVElPTjoKLSAgICB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjb25uZWN0aW9uIHByb2Nlc3NpbmcgIiA8PCBldmVudDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5zdGF0ZSA9IENDU19DT05ORUNURUQ7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y2FsbF9zdGF0ZV9ub3RpZnkgPSAweDAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmJlYXJlcl9wcm92aWRlcl9uYW1lX25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y2FsbF9jb250cm9sX3BvaW50X25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+YmVhcmVyX3RlY2hub2xvZ3lfY2hhbmdlZF9ub3RpZnkgPSAweDAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmJlYXJlcl91Y2lfbm90aWZ5ID0gMHgwMDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5iZWFyZXJfY3VycmVudF9jYWxsc19saXN0X25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y2FsbF9mcmllbmRseV9uYW1lX25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fbm90aWZ5ID0gMHgwMDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25nZXN0ZWQgPSBmYWxzZTsKLSAgICAgIC8vIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkOwotCi0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+dGltZW91dCA9IDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+bGF0ZW5jeSA9IDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+aW50ZXJ2YWwgPSAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnJ4X3BoeSA9IDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+dHhfcGh5ID0gMDsKLSAgICAgIGNjX2luc3RhbmNlLT5Db25uZWN0aW9uU3RhdGVDYWxsYmFjayhDQ1NfQ09OTkVDVEVELCBwX2RhdGEtPnJlbW90ZURldmljZS0+cGVlcl9iZGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDQ1NfQ09OR0VTVElPTl9VUERBVEU6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2UgQ0NTX0NPTkdFU1RJT05fVVBEQVRFIHVwZGF0ZTogIiA8PCBldmVudDsKLSAgICAgIENjcENvbmdlc3Rpb25VcGRhdGUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX01UVV9VUERBVEU6Ci0gICAgY2FzZSBDQ1NfUEhZX1VQREFURToKLSAgICBjYXNlIENDU19ESVNDT05ORUNURUQ6Ci0gICAgY2FzZSBDQ1NfUkVBRF9SU1A6Ci0gICAgY2FzZSBDQ1NfREVTQ1JJUFRPUl9SRUFEX1JTUDoKLSAgICBjYXNlIENDU19XUklURV9SU1A6Ci0gICAgY2FzZSBDQ1NfREVTQ1JJUFRPUl9XUklURV9SU1A6Ci0gICAgY2FzZSBDQ1NfTk9USUZZX0FMTDoKLSAgICBjYXNlIENDU19ESVNDT05ORUNUSU9OOgotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8vaWdub3JlIGV2ZW50Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBJZ25vcmUgZXZlbnQgIiA8PCBldmVudDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYm9vbCBpc19kaWdpdHMoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikKLXsKLSAgICByZXR1cm4gc3RyLmZpbmRfZmlyc3Rfbm90X29mKCIwMTIzNDU2Nzg5KyIpID09IHN0ZDo6c3RyaW5nOjpucG9zOwotfQotCi1ib29sIElzVmFsaWRPcmlnaW5hdGVVcmkoc3RkOjpzdHJpbmcgdXJpKSB7Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0OwotICAgIGNoYXIgKnRva2VuOwotICAgIGNoYXIqIHJlc3QgPSBjb25zdF9jYXN0PGNoYXIqPih1cmkuY19zdHIoKSk7Ci0gICAgd2hpbGUgKCh0b2tlbiA9IHN0cnRva19yKHJlc3QsICI6IiwgJnJlc3QpKSkKLSAgICB7Ci0gICAgICAgIG91dC5wdXNoX2JhY2soc3RkOjpzdHJpbmcodG9rZW4pKTsKLSAgICB9Ci0gICAgaWYgKG91dC5zaXplKCkgPT0gMikgewotICAgICAgICBpZiAob3V0WzBdLmNvbXBhcmUoInRlbCIpID09IDAgJiYgaXNfZGlnaXRzKG91dFsxXSkpIHsKLSAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcmV0OiAiIDw8IHJldDsKLSAgICByZXR1cm4gcmV0OwotfQotCi1ib29sIENDU0FjdGl2ZVByb2ZpbGUoUmF3QWRkcmVzcyBhZGRyKSB7Ci0gICAgYm9vbCBpc0NDU0FjdGl2ZVByb2ZpbGUgPSBmYWxzZTsKLSAgICBpbnQzMl90IGFjdGl2ZVByb2ZpbGU7Ci0gICAgYWN0aXZlUHJvZmlsZSA9IG9zaV9wcm9wZXJ0eV9nZXRfaW50MzIoInBlcnNpc3QudmVuZG9yLnFjb20uYmx1ZXRvb3RoLmRlZmF1bHRfcHJvZmlsZXMiLDApOwotICAgIGlmICgoYWN0aXZlUHJvZmlsZSYweDIwMDApID09IDB4MjAwMCkgewotICAgICAgICBpc0NDU0FjdGl2ZVByb2ZpbGUgPSB0cnVlOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhY3RpdmVQcm9maWxlICI8PCBhY3RpdmVQcm9maWxlIDw8IiBmb3IiIDw8IGFkZHI7Ci0gICAgcmV0dXJuIGlzQ0NTQWN0aXZlUHJvZmlsZTsKLX0KLQotYm9vbCBDQ1NIYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSkgewotCi0gIHRjY19yZXNwX3QgKnBfZGF0YSA9ICh0Y2NfcmVzcF90ICopcGFyYW07Ci0KLSAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0ICpkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW5hY3RpdmUgY2NzIGhhbmRsZSBldmVudCAiPDwgYnRhX2NjX2V2ZW50X3N0cihldmVudCk7Ci0gIHN3aXRjaChwX2RhdGEtPmV2ZW50KSB7Ci0gICAgY2FzZSBDQ1NfTk9USUZZX0FMTDogewotCi0gICAgICBzdGQ6OnZlY3RvcjxDYWxsQ29udHJvbGxlckRldmljZUxpc3Q+bm90aWZ5RGV2aWNlcyA9IGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmROb3RpZnlEZXZpY2VzKHBfZGF0YS0+aGFuZGxlKTsKLSAgICAgIHN0ZDo6dmVjdG9yPENhbGxDb250cm9sbGVyRGV2aWNlTGlzdD46Oml0ZXJhdG9yIGl0OwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTm90aWZ5IGFsbCBoYW5kbGUgIjw8IHBfZGF0YS0+aGFuZGxlOwotICAgICAgaWYgKG5vdGlmeURldmljZXMuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vIGRldmljZSByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZm9yIChpdCA9IG5vdGlmeURldmljZXMuYmVnaW4oKTsgaXQgIT0gbm90aWZ5RGV2aWNlcy5lbmQoKTsgaXQrKyl7Ci0gICAgICAgIGlmIChDQ1NBY3RpdmVQcm9maWxlKGl0LT5wZWVyX2JkYSkpIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdGlmeSBhbGwgaGFuZGxlIGRldmljZSBpZCAiIDw8IGl0LT5jb25uX2lkOwotICAgICAgICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UgPSBjY19pbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQoaXQtPmNvbm5faWQpOwotICAgICAgICAgICAgaXQtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbaXQtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDQ1NfV1JJVEVfUlNQOiB7Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFB1c2ggV3JpdGUgcmVzcG9uc2UgZmlyc3Q6ICIgPDwgZGV2aWNlLT5zdGF0ZTsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSk7Ci0gICAgICAvL1Byb2Nlc3MgdGhlIHZhbHVlcyBub3cKLSAgICAgIHVpbnQ4X3QqIGRhdGEgPSBwX2RhdGEtPm9wZXIuV3JpdGVPcC5kYXRhOwotICAgICAgaW50IGxlbiA9IHBfZGF0YS0+b3Blci5Xcml0ZU9wLmxlbjsKLSAgICAgIFJhd0FkZHJlc3MgcGVlcl9iZGEgPSBwX2RhdGEtPnJlbW90ZURldmljZS0+cGVlcl9iZGE7Ci0gICAgICBzdGQ6Om1hcDx1aW50OF90LCB0Q0NTX0NBTExfU1RBVEU+OjppdGVyYXRvciBpdDsKLSAgICAgIGJvb2wgdmFsaWRfaW5kZXggPSBmYWxzZTsKLSAgICAgIHVpbnQ4X3QgaW5kaWNlc1sxMF07Ci0gICAgICBjaGFyIFVSSVtNQVhfVVJJX1NJWkVdOwotICAgICAgaW50IGk7Ci0gICAgICB1aW50MzJfdCBoYW5kbGUgPSBwX2RhdGEtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZTsKLSAgICAgIGlmKGhhbmRsZSA9PSBjY3NDb250cm9sU2VydmljZUluZm8uY2FsbF9jb250cm9sX3BvaW50X2hhbmRsZSkgewotICAgICAgICAgICBDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24gPSBkYXRhWzBdOwotICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBvcGVyYXRpb246ICIgPDwgc3RkOjpoZXggPDwgQ2FsbENvbnRyb2xsZXJPcHMub3BlcmF0aW9uOwotICAgICAgICAgICBpZiAoZ0lzQWN0aXZlQ0MgPT0gdHJ1ZSAmJiAhY2NfaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEFjdGl2ZURldmljZShwX2RhdGEtPnJlbW90ZURldmljZSkgJiYKLSAgICAgICAgICAgICAgIChDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24gPT0gQ0FMTF9URVJNSU5BVEUgfHwKLSAgICAgICAgICAgICAgIENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbiA9PSBDQUxMX0xPQ0FMX0hPTEQgfHwKLSAgICAgICAgICAgICAgIENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbiA9PSBDQUxMX0xPQ0FMX1JFVFJJRVZFKSkgewotICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIlRFUk18SE9MRHxSRVR8Sk9JTiB0cmlnZ2VyZWQgZnJvbSBub24tYWN0aXZlIERldmljZSI7Ci0gICAgICAgICAgICAgICAgY2NfaW5zdGFuY2UtPkNhbGxDb250cm9sUmVzcG9uc2UoQ2FsbENvbnRyb2xsZXJPcHMub3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU19ERUZBVUxUX0lOREVYX1ZBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfT1BDT0RFX1VOU1VDQ0VTU0ZVTCwgcGVlcl9iZGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHN3aXRjaChDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgQ0FMTF9BQ0NFUFQ6ewotICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gMikgewotICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBwYXJhbXMiOwotICAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGljZXNbMF0gPSBkYXRhWzFdOwotICAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MCxpdCA9IENhbGxTdGF0ZWxpc3QuYmVnaW4oKTsgaXQgIT0gQ2FsbFN0YXRlbGlzdC5lbmQoKTsgaXQrKywgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRDQ1NfQ0FMTF9TVEFURSBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5pbmRleCA9PSBpbmRpY2VzWzBdICYmIG9iai5zdGF0ZSA9PSBDQ1NfU1RBVEVfSU5DT01JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZhbGlkX2luZGV4ID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2NfaW5zdGFuY2UtPkNhbGxDb250cm9sUG9pbnRDaGFuZ2UoQ2FsbENvbnRyb2xsZXJPcHMub3BlcmF0aW9uLCBpbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9JTkRJQ0lFU19DT1VOVCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+cGVlcl9iZGEpOwotICAgICAgICAgICAgICAgICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xSZXNwb25zZShDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTX1NUQVRVU19TVUNDRVNTLCBwZWVyX2JkYSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICIgQUNDRVBUIGlnbm9yZWQgYXMgdGhlcmUgaXMgbm8gdmFsaWQgSW5kZXgiOwotICAgICAgICAgICAgICAgICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xSZXNwb25zZShDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfREVGQVVMVF9JTkRFWF9WQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfSU5WQUxJRF9JTkRFWCwgcGVlcl9iZGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ0FMTF9URVJNSU5BVEU6IHsKLSAgICAgICAgICAgICAgIGlmIChsZW4gIT0gMikgewotICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIHBhcmFtcyI7Ci0gICAgICAgICAgICAgICAgICAgdmFsaWRfaW5kZXggPSBmYWxzZTsKLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgaW5kaWNlc1swXSA9IGRhdGFbMV07Ci0gICAgICAgICAgICAgICAgICAgdmFsaWRfaW5kZXggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICBmb3IgKGk9MCxpdCA9IENhbGxTdGF0ZWxpc3QuYmVnaW4oKTsgaXQgIT0gQ2FsbFN0YXRlbGlzdC5lbmQoKTsgaXQrKywgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRDQ1NfQ0FMTF9TVEFURSBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLmluZGV4ID09IGluZGljZXNbMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGwgaW5kZXggbWF0Y2g6ICIgPDwgaW5kaWNlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX2luZGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmICh2YWxpZF9pbmRleCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNjX2luc3RhbmNlLT5DYWxsQ29udHJvbFBvaW50Q2hhbmdlKENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbiwgaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0lORElDSUVTX0NPVU5ULCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+cGVlcl9iZGEpOwotICAgICAgICAgICAgICAgICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xSZXNwb25zZShDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfU1RBVFVTX1NVQ0NFU1MsIHBlZXJfYmRhKTsKLSAgICAgICAgICAgICAgICAgICAgZ0lzVGVybWluYXRlZEluaXRpYXRlZEZyb21DbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBnVGVybWluYXRlSW50aWF0ZWRJbmRleCA9IGluZGljZXNbMF07Ci0gICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIiBURVJNSU5BVEUgaWdub3JlZCBhcyB0aGVyZSBpcyBubyB2YWxpZCBJbmRleCI7Ci0gICAgICAgICAgICAgICAgICAgIGNjX2luc3RhbmNlLT5DYWxsQ29udHJvbFJlc3BvbnNlKENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfREVGQVVMVF9JTkRFWF9WQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTX0lOVkFMSURfSU5ERVgsIHBlZXJfYmRhKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ0FMTF9MT0NBTF9IT0xEOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgcGFyYW1zIjsKLSAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGljZXNbMF09IGRhdGFbMV07Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkX2luZGV4ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wLGl0ID0gQ2FsbFN0YXRlbGlzdC5iZWdpbigpOyBpdCAhPSBDYWxsU3RhdGVsaXN0LmVuZCgpOyBpdCsrLCBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRDQ1NfQ0FMTF9TVEFURSBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5pbmRleCA9PSAgaW5kaWNlc1swXSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmouc3RhdGUgPT0gQ0NTX1NUQVRFX0lOQ09NSU5HIHx8IG9iai5zdGF0ZSA9PSBDQ1NfU1RBVEVfQUNUSVZFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGwgaW5kZXggbWF0Y2g6ICIgPDwgaW5kaWNlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZhbGlkX2luZGV4ID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgIGNjX2luc3RhbmNlLT5DYWxsQ29udHJvbFBvaW50Q2hhbmdlKENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbiwgaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfSU5ESUNJRVNfQ09VTlQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnBlZXJfYmRhKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIiBDQUxMX0xPQ0FMX0hPTEQgaWdub3JlZCBhcyB0aGVyZSBpcyBubyB2YWxpZCBJbmRleCI7Ci0gICAgICAgICAgICAgICAgICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xSZXNwb25zZShDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfREVGQVVMVF9JTkRFWF9WQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfSU5WQUxJRF9JTkRFWCwgcGVlcl9iZGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ0FMTF9MT0NBTF9SRVRSSUVWRTogewotICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gMikgewotICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBwYXJhbXMiOwotICAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGljZXNbMF09IGRhdGFbMV07Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkX2luZGV4ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wLGl0ID0gQ2FsbFN0YXRlbGlzdC5iZWdpbigpOyBpdCAhPSBDYWxsU3RhdGVsaXN0LmVuZCgpOyBpdCsrLCBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRDQ1NfQ0FMTF9TVEFURSBvYmogPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5pbmRleCA9PSAgaW5kaWNlc1swXSAmJiAob2JqLnN0YXRlID09IENDU19TVEFURV9MT0NBTF9IRUxEICkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsIGluZGV4IG1hdGNoOiAiIDw8IGluZGljZXNbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfaW5kZXggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWxpZF9pbmRleCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNjX2luc3RhbmNlLT5DYWxsQ29udHJvbFBvaW50Q2hhbmdlKCBDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sIGluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0lORElDSUVTX0NPVU5ULCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5wZWVyX2JkYSk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIiBDQUxMX0xPQ0FMX1JFVFJJRVZFIGlnbm9yZWQgYXMgdGhlcmUgaXMgbm8gdmFsaWQgSW5kZXgiOwotICAgICAgICAgICAgICAgICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xSZXNwb25zZShDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTX0RFRkFVTFRfSU5ERVhfVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDU19JTlZBTElEX0lOREVYLCBwZWVyX2JkYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDQUxMX09SSUdJTkFURTogewotICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ0FMTF9PUklHSU5BVEUgbWF0Y2g6IjsKLSAgICAgICAgICAgICAgICAgIG1lbXNldChVUkksICdcMCcsIHNpemVvZihjaGFyKSpNQVhfVVJJX1NJWkUpOwotICAgICAgICAgICAgICAgICAgc3RybGNweShVUkksIChjaGFyKikmZGF0YVsxXSwgbGVuKTsKLSAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE9SSUdJTkFURTogIiA8PCBVUkk7Ci0gICAgICAgICAgICAgICAgICBpZiAoSXNWYWxpZE9yaWdpbmF0ZVVyaShVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgY2NfaW5zdGFuY2UtPkNhbGxDb250cm9sUG9pbnRDaGFuZ2UoQ2FsbENvbnRyb2xsZXJPcHMub3BlcmF0aW9uLCAvKnVudXNlZCovMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvdW50Ki8wLCBVUkksIGRldmljZS0+cGVlcl9iZGEpOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2NfaW5zdGFuY2UtPkNhbGxDb250cm9sUmVzcG9uc2UoQ2FsbENvbnRyb2xsZXJPcHMub3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTX0RFRkFVTFRfSU5ERVhfVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTX0lOVkFMSURfT1VUR09JTkdfVVJJLCBwZWVyX2JkYSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ0FMTF9KT0lOOiB7Ci0gICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBsZW4tMTsKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnN0YXJ0X29mX2luZGljaWVzID0gJihkYXRhWzFdKTsKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5kaWNlc1tNQVhfQ0NTX0NPTk5FQ1RJT05dOwotICAgICAgICAgICAgICAgICAgdmFsaWRfaW5kZXggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgYm9vbCBhdGxlYXN0T25lSGVsZENhbGwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpXSA9IHN0YXJ0X29mX2luZGljaWVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEluZGljaWVzOiAiIDw8IGkgPDwgIjogIiA8PGluZGljZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dWludDhfdCwgdENDU19DQUxMX1NUQVRFPjo6aXRlcmF0b3IgaiA9IENhbGxTdGF0ZWxpc3QuZmluZChpbmRpY2VzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBDYWxsU3RhdGVsaXN0LmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9pbmRleCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqLT5zZWNvbmQuc3RhdGUgPT0gQ0NTX1NUQVRFX0xPQ0FMX0hFTEQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdGxlYXN0T25lSGVsZENhbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChDYWxsU3RhdGVsaXN0LnNpemUoKSA8IDIgfHwgYXRsZWFzdE9uZUhlbGRDYWxsID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgSm9pbiBpcyBub3QgdmFsaWQ6ICI7Ci0gICAgICAgICAgICAgICAgICAgICAgdmFsaWRfaW5kZXggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEgJiYgdmFsaWRfaW5kZXggPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgY2NfaW5zdGFuY2UtPkNhbGxDb250cm9sUG9pbnRDaGFuZ2UoQ2FsbENvbnRyb2xsZXJPcHMub3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZGV2aWNlLT5wZWVyX2JkYSk7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbm8gdmFsaWQgaW5kaWNlcyBmb3VuZCBmb3IgSk9JTiBvcGVyYXRpb24gIjsKLSAgICAgICAgICAgICAgICAgICAgIGNjX2luc3RhbmNlLT5DYWxsQ29udHJvbFJlc3BvbnNlKENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTX0RFRkFVTFRfSU5ERVhfVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfSU5WQUxJRF9JTkRFWCwgcGVlcl9iZGEpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgVW5oYW5kbGVkIEV2ZW50OiAiIDw8IENhbGxDb250cm9sbGVyT3BzLm9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBjY19pbnN0YW5jZS0+Q2FsbENvbnRyb2xSZXNwb25zZShDYWxsQ29udHJvbGxlck9wcy5vcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfREVGQVVMVF9JTkRFWF9WQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1NfT1BDT0RFX05PVF9TVVBQT1JURUQsIHBlZXJfYmRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChoYW5kbGUgPT0gY2NzQ29udHJvbFNlcnZpY2VJbmZvLmJlYXJlcl9zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2hhbmRsZSkgewotICAgICAgICAgICAgaWYgKGxlbiAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiIEludmFsaWQgaW5wdXQgZm9yIFNTUiBpbnRlcnZhbCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc2lnbmFsIHN0cmVuZ3RoIHJlcG8gSW50ZXJ2YWw6ICIgPDwgZGF0YVswXTsKLSAgICAgICAgICAgIEJlYXJlclByb3ZpZGVySW5mby5zaWduYWxfcmVwb3J0X2ludGVydmFsID0gZGF0YVswXTsKLSAgICAgICAgICAgIGNjX2luc3RhbmNlLT5yZW1vdGVEZXZpY2VzLlVwZGF0ZVNTUmVwb3J0aW5nSW50ZXJ2YWwoZGV2aWNlLT5wZWVyX2JkYSwgQmVhcmVyUHJvdmlkZXJJbmZvLnNpZ25hbF9yZXBvcnRfaW50ZXJ2YWwpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQ0NTX0NPTkdFU1RJT05fVVBEQVRFOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlIENDU19DT05HRVNUSU9OX1VQREFURSB1cGRhdGU6ICIgPDwgZXZlbnQ7Ci0gICAgICBDY3BDb25nZXN0aW9uVXBkYXRlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIENDU19SRUFEX1JTUDoKLSAgICBjYXNlIENDU19ERVNDUklQVE9SX1JFQURfUlNQOgotICAgIGNhc2UgQ0NTX0RFU0NSSVBUT1JfV1JJVEVfUlNQOgotICAgIGNhc2UgQ0NTX0NPTk5FQ1RJT05fVVBEQVRFOgotICAgIGNhc2UgQ0NTX1BIWV9VUERBVEU6Ci0gICAgY2FzZSBDQ1NfQ09OTkVDVElPTjoKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxpbmcgZGV2aWNlIHN0YXRlICIgPDwgZGV2aWNlLT5zdGF0ZTsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGV2ZW50IGlzIG5vdCBpbiBsaXN0IjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KLQotdm9pZCBDY3BDb25nZXN0aW9uVXBkYXRlKHRjY19yZXNwX3QqIHBfZGF0YSkgewotICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y29uZ2VzdGVkID0gcF9kYXRhLT5vcGVyLkNvbmdlc3Rpb25PcC5jb25nZXN0ZWQ7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkOiAiIDw8IHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb25nZXN0ZWQ6ICIgPDwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbmdlc3RlZDsKLQotICBHYXR0c09wc1F1ZXVlOjpDb25nZXN0aW9uQ2FsbGJhY2socF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y29uZ2VzdGVkKTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF9hY3QuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2NzaXAvYnRhX2NzaXBfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjgzMDgzLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF9hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0KLSogQ29weXJpZ2h0IDIwMDktMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotKgotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ1NJUCBDbGllbnQgYWN0aW9uIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJidGFfY3NpcF9pbnQuaCIKLSNpbmNsdWRlICJidGFfY3NpcF9hcGkuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiYnRhX2RtX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9kbV9hZHZfYXVkaW8uaCIKLQotLyogQ1NJUyBTZXJ2aWNlIFVVSUQgKi8KLVV1aWQgQ1NJU19TRVJWSUNFX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxODQ2Iik7Ci0vKiBDU0lTIENoYXJhY3RlcmlzdGljIFVVSUQncyAqLwotVXVpZCBDU0lTX1NFUlZJQ0VfU0lSS19VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMkI4NCIpOwotVXVpZCBDU0lTX1NFUlZJQ0VfU0laRV9VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMkI4NSIpOwotVXVpZCBDU0lTX1NFUlZJQ0VfTE9DS19VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMkI4NiIpOwotVXVpZCBDU0lTX1NFUlZJQ0VfUkFOS19VVUlEID0gVXVpZDo6RnJvbVN0cmluZygiMkI4NyIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfYXBpX2VuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMgdGFza3MgdG8gYmUgZG9uZSBvbiBCVCBPTgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcF9jYmFjayAtIGNhbGxiYWNrcyBmcm9tIGJ0aWYgbGF5ZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9hcGlfZW5hYmxlKHRCVEFfQ1NJUF9DQkFDSyAqcF9jYmFjaykgewotICAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRhX2NzaXBfY2IgPSB0QlRBX0NTSVBfQ0IoKTsKLSAgYnRhX2NzaXBfY2IucF9jYmFjayA9IHBfY2JhY2s7Ci0KLSAgLy8gcmVnaXN0ZXIgd2l0aCBHQVRUIENMaWVudCBpbnRlcmZhY2UKLSAgYnRhX2NzaXBfZ2F0dGNfcmVnaXN0ZXIoKTsKLQotICBidGFfY3NpcF9sb2FkX2Nvb3JkaW5hdGVkX3NldHNfZnJvbV9zdG9yYWdlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9hcGlfZGlzYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMgdGFza3MgdG8gYmUgZG9uZSBvbiBCVCBPRkYKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9hcGlfZGlzYWJsZSgpIHsKLSAgc3RkOjp2ZWN0b3I8dEJUQV9DU0lQX0RFVl9DQj4gJmRldl9jYiA9IGJ0YV9jc2lwX2NiLmRldl9jYjsKLQotICAvKiBjbG9zZSBhbGwgYWN0aXZlIEdBVFQgQ29ubmVjdGlvbnMgKi8KLSAgZm9yICh0QlRBX0NTSVBfREVWX0NCJiBwX2NiOiBkZXZfY2IpIHsKLSAgICBpZiAocF9jYi5zdGF0ZSA9PSBCVEFfQ1NJUF9DT05OX1NUKSB7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UocF9jYi5jb25uX2lkKTsKLSAgICB9Ci0gIH0KLQotICAvKiBEZXJlZ2lzdGVyIEdBVFQgSW50ZXJmYWNlICovCi0gIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyKGJ0YV9jc2lwX2NiLmdhdHRfaWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfYXBwX3JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBUEkgdXNlZCB0byByZWdpc3RlciBBcHAvTW9kdWxlIGZvciBDU0lQIGNhbGxiYWNrcy4KLSAqICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uCi0gKgotICogUGFyYW1ldGVyczogICAgICBhcHBfdXVpZCAtIEFwcGxpY2F0aW9uIFVVSUQuCi0gKiAgICAgICAgICAgICAgICAgIHBfY2JhY2sgLSBBcHBsaWNhdGlvbiBjYWxsYmFja3MuCi0gKiAgICAgICAgICAgICAgICAgIGNiIC0gY2FsbGJhY2sgYWZ0ZXIgcmVnaXN0cmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfYXBwX3JlZ2lzdGVyIChjb25zdCBVdWlkJiBhcHBfdXVpZCwgdEJUQV9DU0lQX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBCdGFDc2lwQXBwUmVnaXN0ZXJlZENiIGNiKSB7Ci0gIHVpbnQ4X3QgaTsKLSAgdEJUQV9DU0lQX1NUQVRVUyBzdGF0dXMgPSBCVEFfQ1NJUF9GQUlMVVJFOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVEFfQ1NJUF9NQVhfU1VQUE9SVEVEX0FQUFM7IGkrKykgewotICAgIGlmICghYnRhX2NzaXBfY2IuYXBwX3JjYltpXS5pbl91c2UpIHsKLSAgICAgIGJ0YV9jc2lwX2NiLmFwcF9yY2JbaV0uaW5fdXNlID0gdHJ1ZTsKLSAgICAgIGJ0YV9jc2lwX2NiLmFwcF9yY2JbaV0uYXBwX2lkID0gaTsKLSAgICAgIGJ0YV9jc2lwX2NiLmFwcF9yY2JbaV0ucF9jYmFjayA9IHBfY2JhY2s7Ci0gICAgICBzdGF0dXMgPSBCVEFfQ1NJUF9TVUNDRVNTOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBCVEFfQ1NJUF9TVUNDRVNTKSB7Ci0gICAgTE9HKElORk8pIDw8ICJDU0lQIEFwcCBSZWdpc3RlcmVkIFN1Y2Nlc2Z1bGx5LiBBcHAgSUQ6ICIgPDwgK2k7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ1NJUCBBcHAgUmVnaXN0cmF0aW9uIGZhaWxlZC4gQXBwIExpbWl0IHJlYWNoZWQiOwotICB9Ci0KLSAgLy8gR2l2ZSBjYWxsYmFjayB0byByZWdpc3RlcmluZyBBcHAvTW9kdWxlCi0gIGlmICghY2IuaXNfbnVsbCgpKSBjYi5SdW4oc3RhdHVzLCBpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2FwcF91bnJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBUEkgdXNlZCB0byB1bnJlZ2lzdGVyIEFwcC9Nb2R1bGUgZm9yIENTSVAgY2FsbGJhY2tzLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYXBwX2lkOiBJRCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgdW5yZWdpc3RlcmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2FwcF91bnJlZ2lzdGVyKHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIGlmIChhcHBfaWQgPj0gQlRBX0NTSVBfTUFYX1NVUFBPUlRFRF9BUFBTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEludmFsaWQgQXBwIElEOiAiIDw8ICthcHBfaWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2NzaXBfY2IuYXBwX3JjYlthcHBfaWRdLmluX3VzZSA9IGZhbHNlOwotICBidGFfY3NpcF9jYi5hcHBfcmNiW2FwcF9pZF0ucF9jYmFjayA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nYXR0Y19jYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBHQVRUIGNsaWVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGluIEJUQSBDU0lQLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgZXZlbnQgIC0gcmVjZWl2ZWQgZnJvbSBHQVRUCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidGFfY3NpcF9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyogcF9kYXRhKSB7Ci0gIHRCVEFfQ1NJUF9ERVZfQ0IqIHBfZGV2X2NiOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9jc2lwX2dhdHRjX2NhbGxiYWNrIGV2ZW50ID0gJWQiLCBldmVudCk7Ci0KLSAgaWYgKHBfZGF0YSA9PSBOVUxMKSByZXR1cm47Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOgotICAgICAgcF9kZXZfY2IgPSBidGFfY3NpcF9maW5kX2Rldl9jYl9ieV9iZGEocF9kYXRhLT5vcGVuLnJlbW90ZV9iZGEpOwotICAgICAgaWYgKHBfZGV2X2NiKSB7Ci0gICAgICAgIGJ0YV9jc2lwX3NtX2V4ZWN1dGUocF9kZXZfY2IsIEJUQV9DU0lQX0dBVFRfT1BFTl9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRBX0NTSVBfUkVRX0RBVEEqKSZwX2RhdGEtPm9wZW4pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19DTE9TRV9FVlQ6Ci0gICAgICBwX2Rldl9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYShwX2RhdGEtPmNsb3NlLnJlbW90ZV9iZGEpOwotICAgICAgaWYgKHBfZGV2X2NiKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIkJUQV9HQVRUQ19DTE9TRV9FVlQgc3RhdGUgPSAlZCIsIHBfZGV2X2NiLT5zdGF0ZSk7Ci0gICAgICAgIGJ0YV9jc2lwX3NtX2V4ZWN1dGUocF9kZXZfY2IsIEJUQV9DU0lQX0dBVFRfQ0xPU0VfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUQV9DU0lQX1JFUV9EQVRBKikmcF9kYXRhLT5jbG9zZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDogewotICAgICAgICB0QlRBX0dBVFRDX1NFQVJDSF9DTVBMKiBwX3NyY2hfZGF0YSA9ICZwX2RhdGEtPnNlYXJjaF9jbXBsOwotICAgICAgICB0QlRBX0NTSVBfRElTQ19TRVQgZGlzY19wYXJhbXMgPSB7LmNvbm5faWQgPSBwX3NyY2hfZGF0YS0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgPSBwX3NyY2hfZGF0YS0+c3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIHBfZGV2X2NiID0gYnRhX2NzaXBfZ2V0X2Rldl9jYl9ieV9jaWQocF9zcmNoX2RhdGEtPmNvbm5faWQpOwotICAgICAgICBpZiAocF9kZXZfY2IpIHsKLSAgICAgICAgICBkaXNjX3BhcmFtcy5hZGRyID0gcF9kZXZfY2ItPmFkZHI7Ci0gICAgICAgICAgcF9kZXZfY2ItPmlzX2Rpc2NfZXh0ZXJuYWwgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJ0YV9jc2lwX2dhdHRfZGlzY19jbXBsX2FjdCgmZGlzY19wYXJhbXMpOwotICAgICAgICBidGFfY3NpcF9zbV9leGVjdXRlKHBfZGV2X2NiLCBCVEFfQ1NJUF9PUEVOX0NNUExfRVZULCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfTk9USUZfRVZUOiB7Ci0gICAgICAgIGJ0YV9jc2lwX2hhbmRsZV9ub3RpZmljYXRpb24oJnBfZGF0YS0+bm90aWZ5KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nYXR0Y19yZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQVBJIHVzZWQgdG8gcmVnaXN0ZXIgR0FUVCBpbnRlcmZhY2UgZm9yIENTSVAgb3BlcmF0aW9ucy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9nYXR0Y19yZWdpc3RlcigpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgQlRBX0dBVFRDX0FwcFJlZ2lzdGVyKGJ0YV9jc2lwX2dhdHRjX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoW10odWludDhfdCBjbGllbnRfaWQsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0NTSVBfU1RBVFVTIGNzaXBfc3RhdHVzID0gQlRBX0NTSVBfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9jc2lwX2NiLmdhdHRfaWYgPSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNzaXBfc3RhdHVzID0gQlRBX0NTSVBfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9jc2lwX2NiLmdhdHRfaWYgPSBCVEFfR0FUVFNfSU5WQUxJRF9JRjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0dBVFRDX0FwcFJlZ2lzdGVyIGlzIGRvbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidGFfY3NpcF9jYi5wX2NiYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ1NJUCBHQVRUIElGIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgK2J0YV9jc2lwX2NiLmdhdHRfaWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfSksIHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfcHJvY2Vzc19zZXRfbG9ja19hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGxvY2svdW5sb2NrIHJlcXVlc3QuCi0gKgotICogUGFyYW1ldGVyczogICAgICBsb2NrX3BhcmFtOiBwYXJhbXMgdXNlZCBpbiBMT0NLL1VOTE9DSyByZXF1ZXN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX3Byb2Nlc3Nfc2V0X2xvY2tfYWN0KHRCVEFfU0VUX0xPQ0tfUEFSQU1TIGxvY2tfcGFyYW0pIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEFwcCBJRCA9ICIgPDwgK2xvY2tfcGFyYW0uYXBwX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBTZXQgSUQgPSAiIDw8ICtsb2NrX3BhcmFtLnNldF9pZAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgVmFsdWUgPSAiIDw8ICtsb2NrX3BhcmFtLmxvY2tfdmFsdWU7Ci0KLSAgdEJUQV9DU0VUX0NCKiBjc2V0X2NiID0gYnRhX2NzaXBfZ2V0X2NzZXRfY2JfYnlfaWQgKGxvY2tfcGFyYW0uc2V0X2lkKTsKLSAgaWYgKCFjc2V0X2NiIHx8ICFidGFfY3NpcF9pc192YWxpZF9sb2NrX3JlcXVlc3QoJmxvY2tfcGFyYW0pKSB7Ci0gICAgdEJUQV9MT0NLX1NUQVRVU19DSEFOR0VEIHJlcyA9IHsuYXBwX2lkID0gbG9ja19wYXJhbS5hcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0X2lkID0gbG9ja19wYXJhbS5zZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzID0gSU5WQUxJRF9SRVFVRVNUX1BBUkFNU307Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9jbXBsX2NiKHJlcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQWRkIHJlcXVlc3QgaW4gdGhlIHF1ZXVlIGlmIG9uZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzIGZvciB0aGlzIHNldAotICBpZiAoY3NldF9jYi0+cmVxdWVzdF9pbl9wcm9ncmVzcykgewotICAgIGNzZXRfY2ItPmxvY2tfcmVxX3F1ZXVlLnB1c2gobG9ja19wYXJhbSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcGVuZGluZyBsb2NrIHJlcXVlc3RzIGluIHF1ZXVlIGZvciBTZXQ6IgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCArbG9ja19wYXJhbS5zZXRfaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBQZW5kaW5nIFJlcXVlc3RzID0gIiA8PCArKGludCljc2V0X2NiLT5sb2NrX3JlcV9xdWV1ZS5zaXplKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRhX2NzaXBfZm9ybV9sb2NrX3JlcXVlc3QobG9ja19wYXJhbSwgY3NldF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9wcm9jZXNzX3NldF9sb2NrX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmb3JtcyByZXF1ZXN0IChMT0NLL1VOTE9DSyBhbmQgb3JkZXIgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHNldCBtZW1iZXJzKS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGxvY2tfcGFyYW06IHBhcmFtcyB1c2VkIGluIExPQ0svVU5MT0NLIHJlcXVlc3QuCi0gKiAgICAgICAgICAgICAgICAgIGNzZXRfY2I6IGN1cnJlbnQgc2V0IGNvbnRyb2wgYmxvY2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfZm9ybV9sb2NrX3JlcXVlc3QodEJUQV9TRVRfTE9DS19QQVJBTVMgbG9ja19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQ1NFVF9DQiogY3NldF9jYikgewotICBjc2V0X2NiLT5yZXF1ZXN0X2luX3Byb2dyZXNzID0gdHJ1ZTsKLQotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBvcmRlcmVkX21lbWJlcnM7Ci0KLSAgaWYgKGxvY2tfcGFyYW0ubG9ja192YWx1ZSA9PSBMT0NLX1ZBTFVFKSB7Ci0gICAgb3JkZXJlZF9tZW1iZXJzID0gYnRhX2NzaXBfYXJyYW5nZV9zZXRfbWVtYmVyc19ieV9vcmRlcihjc2V0X2NiLT5zZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgbG9ja19wYXJhbS5tZW1iZXJzX2FkZHIsIHRydWUpOwotICB9IGVsc2UgewotICAgIG9yZGVyZWRfbWVtYmVycyA9IGJ0YV9jc2lwX2FycmFuZ2Vfc2V0X21lbWJlcnNfYnlfb3JkZXIoY3NldF9jYi0+c2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgIGxvY2tfcGFyYW0ubWVtYmVyc19hZGRyLCBmYWxzZSk7Ci0gIH0KLQotICAvL2RlYnVnIGxvZwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpb3JkZXJlZF9tZW1iZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IE1lbWJlciAlZCA9ICVzIiwgX19mdW5jX18sIChpKzEpLAotICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF9tZW1iZXJzW2ldLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLQotICAvLyB1cGRhdGUgY3VycmVudCByZXF1ZXN0IGluIENCCi0gIGNzZXRfY2ItPmN1cl9sb2NrX3JlcSA9IHtsb2NrX3BhcmFtLmFwcF9pZCwgbG9ja19wYXJhbS5zZXRfaWQsIGxvY2tfcGFyYW0ubG9ja192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG9yZGVyZWRfbWVtYmVyc307Ci0KLSAgLy8gdXBkYXRlIGN1cnJlbnQgcmVzcG9uc2UgaW4gQ0IKLSAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzID0ge307Ci0gIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5hcHBfaWQgPSBsb2NrX3BhcmFtLmFwcF9pZDsKLSAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLnNldF9pZCA9IGxvY2tfcGFyYW0uc2V0X2lkOwotICBjc2V0X2NiLT5jdXJfbG9ja19yZXMudmFsdWUgPSBVTkxPQ0tfVkFMVUU7Ci0KLSAgLyogTE9DSyBSZXF1ZXN0ICovCi0gIGlmIChjc2V0X2NiLT5jdXJfbG9ja19yZXEudmFsdWUgPT0gTE9DS19WQUxVRSkgewotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5zdGF0dXMgPSBBTExfTE9DS1NfQUNRVUlSRUQ7Ci0gICAgLyogY2hlY2sgaWYgbG9jayByZXF1ZXN0IGZvciB0aGlzIHNldCB3YXMgZGVuaWVkIGVhcmxpZXIgKi8KLSAgICBpZiAoYnRhX2NzaXBfdmFsaWRhdGVfcmVxX2Zvcl9kZW5pZWRfc20oY3NldF9jYikpIHsKLSAgICAgIGJ0YV9jc2lwX2dldF9uZXh0X2xvY2tfcmVxdWVzdChjc2V0X2NiKTsKLQotICAgIC8qIHByb2NlZWQgd2l0aCByZXF1ZXN0IG90aGVyd2lzZSovCi0gICAgfSBlbHNlIHsKLSAgICAgIGJ0YV9jc2lwX3NlbmRfbG9ja19yZXFfYWN0KGNzZXRfY2IpOwotICAgIH0KLSAgLyogVU5MT0NLIFJlcXVlc3QqLwotICB9IGVsc2UgewotICAgIGJ0YV9jc2lwX3NlbmRfdW5sb2NrX3JlcV9hY3QoY3NldF9jYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX3ZhbGlkYXRlX3JlcV9mb3JfZGVuaWVkX3NtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyByZXF1ZXN0IGlmIHJlY2VpdmVkIGZvciBkZW5pZWQgc2V0Ci0gKiAgICAgICAgICAgICAgICAgIG1lbWJlcgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgY3NldF9jYjogY3VycmVudCBzZXQgY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfY3NpcF92YWxpZGF0ZV9yZXFfZm9yX2RlbmllZF9zbSAodEJUQV9DU0VUX0NCKiBjc2V0X2NiKSB7Ci0gIGJvb2wgaXNfZGVuaWVkID0gZmFsc2U7Ci0gIHRCVEFfTE9DS19SRVFVRVNUJiBsb2NrX3JlcSA9IGNzZXRfY2ItPmN1cl9sb2NrX3JlcTsKLQotICBmb3IgKFJhd0FkZHJlc3MmIGFkZHI6IGxvY2tfcmVxLm1lbWJlcnNfYWRkcikgewotICAgIHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IgPSBidGFfY3NpcF9maW5kX2Rldl9jYl9ieV9iZGEoYWRkcik7Ci0gICAgaWYgKCFwX2NiKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRGV2aWNlIENCIG5vdCBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9IGJ0YV9jc2lwX2dldF9jc2lzX2luc3RhbmNlKHBfY2IsIGxvY2tfcmVxLnNldF9pZCk7Ci0gICAgaWYgKCFzcnZjKSB7Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQ1NJUyBpbnN0YW5jZSBub3QgZm91bmQgZm9yICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICghc3J2Yy0+ZGVuaWVkX2FwcGxpc3QuZW1wdHkoKSkgewotICAgICAgaXNfZGVuaWVkID0gdHJ1ZTsKLSAgICAgIC8vIGFkZCB0aGlzIGFwcF9pZCBpbiB0aGUgZGVuaWVkX2FwcF9saXN0Ci0gICAgICBzcnZjLT5kZW5pZWRfYXBwbGlzdC5wdXNoX2JhY2sobG9ja19yZXEuYXBwX2lkKTsKLSAgICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5zdGF0dXMgPSBMT0NLX0RFTklFRDsKLSAgICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5hZGRyLnB1c2hfYmFjayhhZGRyKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoaXNfZGVuaWVkKSB7Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9jbXBsX2NiKGNzZXRfY2ItPmN1cl9sb2NrX3Jlcyk7Ci0gIH0KLQotICByZXR1cm4gaXNfZGVuaWVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfbG9ja19yZWxlYXNlX2J5X2RlbmlhbF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzZXQgbWVtYmVyIGlzIHVubG9ja2VkCi0gKiAgICAgICAgICAgICAgICAgIGFmdGVyIHVubG9jayByZXF1ZXN0IGlzIHNlbnQgcG9zdCBsb2NrIGRlbmlhbC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIEdBVFQgb3BlcmF0aW9uIGNhbGxiYWNrIHBhcmFtcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9sb2NrX3JlbGVhc2VfYnlfZGVuaWFsX2NiKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdm9pZCogZGF0YSkgewotICB0QlRBX0NTRVRfQ0IqIGNzZXRfY2IgPSAodEJUQV9DU0VUX0NCICopZGF0YTsKLSAgdEJUQV9DU0lQX0RFVl9DQiogZGV2X2NiID0gY3NldF9jYi0+Y3VyX2Rldl9jYjsKLSAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9Ci0gICAgICAgICAgYnRhX2NzaXBfZ2V0X2NzaXNfaW5zdGFuY2UoY3NldF9jYi0+Y3VyX2Rldl9jYiwgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLnNldF9pZCk7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgUmVsZWFzZWQgbG9jayBmb3IgZGV2aWNlOiAiIDw8IGRldl9jYi0+YWRkcgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgU2V0IElEOiAiIDw8ICtjc2V0X2NiLT5zZXRfaWQ7Ci0KLSAgaWYgKHNydmMgJiYgc3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgIHNydmMtPmxvY2sgPSBVTkxPQ0tfVkFMVUU7Ci0gICAgLy8gcmVtb3ZlIGFwcCBpZCBmcm9tIGFwcGxpc3QKLSAgICBzcnZjLT5sb2NrX2FwcGxpc3QuZXJhc2Uoc3RkOjpyZW1vdmUoc3J2Yy0+bG9ja19hcHBsaXN0LmJlZ2luKCksIHNydmMtPmxvY2tfYXBwbGlzdC5lbmQoKSwKLSAgICAgICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmFwcF9pZCksIHNydmMtPmxvY2tfYXBwbGlzdC5lbmQoKSk7Ci0gIH0KLQotICAvLyByZWxlYXNlIG5leHQgc2V0IG1lbWJlciB3aXRoIGxvd2VyIHJhbmsKLSAgYnRhX2NzaXBfaGFuZGxlX2xvY2tfZGVuaWFsKGNzZXRfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfaGFuZGxlX2xvY2tfZGVuaWFsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGxvY2sgaGFzIGJlZW4gZGVuaWVkIGJ5IG9uZSBvZgotICogICAgICAgICAgICAgICAgICB0aGUgc2V0IG1lbWJlcnMuCi0gKgotICogUGFyYW1ldGVyczogICAgICBjc2V0X2NiOiBjdXJyZW50IHNldCBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2hhbmRsZV9sb2NrX2RlbmlhbCh0QlRBX0NTRVRfQ0IqIGNzZXRfY2IpIHsKLSAgICAvLyBzdGFydCBsb2NrIHJlbGVhc2UgcHJvY2VkdXJlIGZvciBhY3F1aXJlZCBsb2NrcwotICAgIGludDhfdCBjdXJfaWR4ID0gY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmN1cl9pZHggLSAxOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4LS07Ci0KLSAgICBpZiAoY3VyX2lkeCA+PSAwKSB7Ci0gICAgICBSYXdBZGRyZXNzIGJkX2FkZHIgPSBjc2V0X2NiLT5jdXJfbG9ja19yZXEubWVtYmVyc19hZGRyW2N1cl9pZHhdOwotICAgICAgY3NldF9jYi0+Y3VyX2Rldl9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYShiZF9hZGRyKTsKLSAgICAgIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMgPQotICAgICAgICAgIGJ0YV9jc2lwX2dldF9jc2lzX2luc3RhbmNlKGNzZXRfY2ItPmN1cl9kZXZfY2IsIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5zZXRfaWQpOwotCi0gICAgICAvLyBjaGVjayBpZiBsb2NrZWQgYnkgb3RoZXIgYXBwCi0gICAgICBpZiAoIWNzZXRfY2ItPmN1cl9kZXZfY2IgfHwgIXNydmMgfHwKLSAgICAgICAgICBidGFfY3NpcF9pc19sb2NrZWRfYnlfb3RoZXJfYXBwcyhzcnZjLCBjc2V0X2NiLT5jdXJfbG9ja19yZXEuYXBwX2lkKSkgewotICAgICAgICBMT0coSU5GTykgPDwgIkludmFsaWQgZGV2aWNlIG9yIHNlcnZpY2UgQ0Igb3IiCi0gICAgICAgICAgICAgICAgICA8PCAiIG90aGVyIGFwcHMgaGF2ZSBsb2NrZWQgdGhpcyBzZXQgbWVtYmVyKCIgPDwgYmRfYWRkciA8PCAiKS4gU2tpcC4iOwotICAgICAgICBidGFfY3NpcF9oYW5kbGVfbG9ja19kZW5pYWwoY3NldF9jYik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gTG9jayB2YWx1ZSBpbiB2ZWN0b3IgZm9ybWF0IChvbmUgdWludDhfdCBzaXplIGVsZW1lbnQgd2l0aCApCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1bmxvY2tfdmFsdWUoMSwgVU5MT0NLX1ZBTFVFKTsKLSAgICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjc2V0X2NiLT5jdXJfZGV2X2NiLT5jb25uX2lkLAotICAgICAgc3J2Yy0+bG9ja19oYW5kbGUsIHVubG9ja192YWx1ZSwgR0FUVF9XUklURSwgYnRhX2NzaXBfbG9ja19yZWxlYXNlX2J5X2RlbmlhbF9jYiwgY3NldF9jYik7Ci0KLSAgICB9IGVsc2UgewotICAgICAgYnRhX2NzaXBfZ2V0X25leHRfbG9ja19yZXF1ZXN0KGNzZXRfY2IpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2xvY2tfcmVxX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHNldCBtZW1iZXIgaXMgbG9ja2VkCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHJlbW90ZSBkZXZpY2UgYWZ0ZXIgTE9DSyBSZXF1ZXN0Ci0gKgotICogUGFyYW1ldGVyczogICAgICBHQVRUIG9wZXJhdGlvbiBjYWxsYmFjayBwYXJhbXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfbG9ja19yZXFfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHN0YXR1cyA9ICIgPDwgK3N0YXR1czsKLSAgdEJUQV9DU0VUX0NCKiBjc2V0X2NiID0gKHRCVEFfQ1NFVF9DQiAqKWRhdGE7Ci0gIHRCVEFfQ1NJUF9ERVZfQ0IqIGRldl9jYiA9IGJ0YV9jc2lwX2dldF9kZXZfY2JfYnlfY2lkKGNvbm5faWQpOwotICB0QlRBX0NTSVNfU1JWQ19JTkZPKiBzcnZjID0KLSAgICAgIGJ0YV9jc2lwX2dldF9jc2lzX2luc3RhbmNlKGRldl9jYiwgY3NldF9jYi0+c2V0X2lkKTsKLQotICAvKiBEZXZpY2UgY29udHJvbCBibG9jayBvciBjb3JyZXNwb25kaW5nIENTSVMgc2VydmljZSBpbnN0YW5jZSBub3QgZm91bmQgKi8KLSAgaWYgKCFkZXZfY2IgfHwgIXNydmMpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRGV2aWNlIENCIG5vdCBmb3VuZCBmb3IgY29ubl9pZCA9ICVkIiwgX19mdW5jX18sIGNvbm5faWQpOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgYWxhcm1fY2FuY2VsKGNzZXRfY2ItPnVucmVzcF90aW1lcik7Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9hY3QoY3NldF9jYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLypjaGVjayBpZiB0aGlzIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdW5yZXNwb25zaXZlIHNldCBtZW1iZXIgKi8KLSAgaWYgKGRldl9jYi0+dW5yZXNwb25zaXZlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdW5yZXNwb25zaXZlIHJlbW90ZTogIiA8PCBkZXZfY2ItPmFkZHI7Ci0gICAgYnRhX2NzaXBfaGFuZGxlX3VucmVzcG9uc2l2ZV9zbV9yZXMoc3J2Yywgc3RhdHVzKTsKLSAgICBkZXZfY2ItPnVucmVzcG9uc2l2ZSA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotICAvLyBjYW5jZWwgYWxhcm0gKHVzZWQgZm9yIHVucmVzcG9uc2l2ZSBzZXQgbWVtYmVyKQotICBhbGFybV9jYW5jZWwoY3NldF9jYi0+dW5yZXNwX3RpbWVyKTsKLQotICBpZiAoc3RhdHVzID09IENTSVBfTE9DS19ERU5JRUQpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIExvY2tlZCBEZW5pZWQgYnkgIiA8PCBkZXZfY2ItPmFkZHI7Ci0gICAgICBzcnZjLT5sb2NrID0gVU5MT0NLX1ZBTFVFOwotICAgICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLnZhbHVlID0gVU5MT0NLX1ZBTFVFOwotICAgICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLnN0YXR1cyA9IExPQ0tfREVOSUVEOwotCi0gICAgICAvLyBhZGQgbWVtYmVyIHRvIHRoZSByZXNwb25zZSBsaXN0IGZvciB3aGljaCBsb2NrIGlzIGRlbmllZCBhbmQgY2xlYXIgb3RoZXJzCi0gICAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXMuYWRkci5jbGVhcigpOwotICAgICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLmFkZHIucHVzaF9iYWNrKGRldl9jYi0+YWRkcik7Ci0KLSAgICAgIC8vIGFkZCBhcHBfaWQgaW4gdGhlIGRlbmllZCBhcHBsaXN0Ci0gICAgICBzcnZjLT5kZW5pZWRfYXBwbGlzdC5wdXNoX2JhY2soY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmFwcF9pZCk7Ci0gICAgICAvLyBHaXZlIGNhbGxiYWNrIHRvIHVwcGVyIGxheWVyIHRoYXQgbG9jayBpcyBkZW5pZWQKLSAgICAgIGJ0YV9jc2lwX3NlbmRfbG9ja19yZXFfY21wbF9jYihjc2V0X2NiLT5jdXJfbG9ja19yZXMpOwotICAgICAgLy8gcmVsZWFzZSBhbGwgdGhlIGFjcXVpcmVkIGxvY2tzIHRpbGwgbm93Ci0gICAgICBidGFfY3NpcF9oYW5kbGVfbG9ja19kZW5pYWwoY3NldF9jYik7Ci0KLSAgLyogUFRTOiBSZW1vdGUgcmVzcG9uZGluZyB3aXRoIGludmFsaWQgdmFsdWUgKi8KLSAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQ1NJUF9JTlZBTElEX0xPQ0tfVkFMVUUpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgcmVtb3RlICIgPDwgZGV2X2NiLT5hZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVzcG9uZGVkIHdpdGggSU5WQUxJRCBWYWx1ZSI7Ci0gICAgLyogZm9yIFBUUyB0byBlbnN1cmUgc2V0IGNvb3JkaW5hdG9yIGlzIHdvcmtpbmcgZmluZSAqLwotICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGNzZXRfY2ItPmN1cl9kZXZfY2ItPmNvbm5faWQsCi0gICAgICAgIHNydmMtPmxvY2tfaGFuZGxlLCBOVUxMLCBOVUxMKTsKLQotICAgIC8qIFN0b3AgbG9ja2luZyByZW1haW5pbmcgc2V0IG1lbWJlcnMgYW5kIGluZm9ybSByZXF1ZXN0aW5nIGFwcCAqLwotICAgIGJ0YV9jc2lwX3NlbmRfbG9ja19yZXFfY21wbF9jYihjc2V0X2NiLT5jdXJfbG9ja19yZXMpOwotICAgIC8qIFByb2Nlc3MgbmV4dCBsb2NrIHJlcXVlc3QgZnJvbSBwZW5kaW5nIHF1ZXVlICovCi0gICAgYnRhX2NzaXBfZ2V0X25leHRfbG9ja19yZXF1ZXN0KGNzZXRfY2IpOwotICB9IGVsc2UgewotICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTIHx8IHN0YXR1cyA9PSBDU0lQX0xPQ0tfQUxSRUFEWV9HUkFOVEVEKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzdWNjZXNzZnVsbHkgbG9ja2VkICIgPDwgZGV2X2NiLT5hZGRyOwotICAgICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLmFkZHIucHVzaF9iYWNrKGRldl9jYi0+YWRkcik7Ci0gICAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXMudmFsdWUgPSBMT0NLX1ZBTFVFOwotICAgICAgc3J2Yy0+bG9jayA9IExPQ0tfVkFMVUU7Ci0gICAgICAvLyBhZGQgYXBwX2lkIGFnYWluc3QgdGhpcyBkZXZpY2UgZW50cnkKLSAgICAgIHNydmMtPmxvY2tfYXBwbGlzdC5wdXNoX2JhY2soY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmFwcF9pZCk7Ci0gICAgfQotCi0gICAgLy9wcm9jZWVkIHdpdGggbmV4dCBzZXQgbWVtYmVyCi0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmN1cl9pZHgrKzsKLSAgICBidGFfY3NpcF9zZW5kX2xvY2tfcmVxX2FjdChjc2V0X2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgaXMgdXNlZCB0byBzZW5kIExPQ0sgcmVxdWVzdCB0byBzZXQgbWVtYmVyLgotICogICAgICAgICAgICAgICAgICBJdCB2YWxpZGF0ZXMgaWYgaXQgaXMgcmVxdWlyZWQgdG8gc2VuZCBsb2NrIHJlcXVlc3QgYmFzZWQgb24KLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBzdGF0ZSBhbmQgY3VycmVudCBsb2NrIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgY3NldF9jYjogY3VycmVudCBzZXQgY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9zZW5kX2xvY2tfcmVxX2FjdCh0QlRBX0NTRVRfQ0IqIGNzZXRfY2IpIHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB1aW50OF90IGN1cl9pbmRleCA9IGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4OwotCi0gIGlmIChjdXJfaW5kZXggPT0gKHVpbnQ4X3QpY3NldF9jYi0+Y3VyX2xvY2tfcmVxLm1lbWJlcnNfYWRkci5zaXplKCkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBsb2NrIG9wZXJhdGlvbiBjb21wbGV0ZWQgZm9yIGFsbCBzZXQgbWVtYmVycyI7Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9jbXBsX2NiKGNzZXRfY2ItPmN1cl9sb2NrX3Jlcyk7Ci0gICAgYnRhX2NzaXBfZ2V0X25leHRfbG9ja19yZXF1ZXN0KGNzZXRfY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJkX2FkZHIgPSBjc2V0X2NiLT5jdXJfbG9ja19yZXEubWVtYmVyc19hZGRyW2N1cl9pbmRleF07Ci0KLSAgLy8gZ2V0IGRldmljZSBjb250cm9sIGJsb2NrIGFuZCBjb3JyZXNwb25kaW5nIGNzaXMgc2VydmljZSBkZXRhaWxzCi0gIGNzZXRfY2ItPmN1cl9kZXZfY2IgPSBidGFfY3NpcF9maW5kX2Rldl9jYl9ieV9iZGEoYmRfYWRkcik7Ci0gIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMgPQotICAgICAgYnRhX2NzaXBfZ2V0X2NzaXNfaW5zdGFuY2UoY3NldF9jYi0+Y3VyX2Rldl9jYiwgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLnNldF9pZCk7Ci0KLSAgLy8gU2tpcCBkZXZpY2UgaWYgaXQgaXMgbm90IGluIGNvbm5lY3RlZCBzdGF0ZQotICBpZiAoIWNzZXRfY2ItPmN1cl9kZXZfY2IgfHwgIXNydmMgfHwKLSAgICAgIGNzZXRfY2ItPmN1cl9kZXZfY2ItPnN0YXRlICE9IEJUQV9DU0lQX0NPTk5fU1QpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogU2V0IE1lbWJlciAoIiA8PCBiZF9hZGRyLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgPDwgIikgaXMgbm90IGNvbm5lY3RlZC4gU2tpcCB0aGlzIFNldCBtZW1iZXIiOwotCi0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmN1cl9pZHgrKzsKLSAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXMuc3RhdHVzID0gU09NRV9MT0NLU19BQ1FVSVJFRF9SRUFTT05fRElTQzsKLSAgICBidGFfY3NpcF9zZW5kX2xvY2tfcmVxX2FjdChjc2V0X2NiKTsKLQotICAvLyBjaGVjayBpZiBhbHJlYWR5IGxvY2tlZCAoc2tpcCBzZW5kaW5nIHdyaXRlIHJlcXVlc3QpCi0gIH0gZWxzZSBpZiAoc3J2Yy0+bG9jayA9PSBMT0NLX1ZBTFVFKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFNldCBNZW1iZXIgKCIgPDwgY3NldF9jYi0+Y3VyX2Rldl9jYi0+YWRkcgotICAgICAgICAgICAgICA8PCAiKSBpcyBhbHJlYWR5IGxvY2tlZC4gU2tpcCB0aGlzIFNldCBtZW1iZXIiOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy52YWx1ZSA9IExPQ0tfVkFMVUU7Ci0gICAgLy8gYWRkIGVsZW1lbnQgaW4gdGhlIGxpc3QKLSAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXMuYWRkci5wdXNoX2JhY2soYmRfYWRkcik7Ci0gICAgLy8gYWRkIGFwcGlkIGluIHRoZSBsaXN0IGlmIGxvY2tlZCBieSBkaWZmZXJlbnQgYXBwCi0gICAgaWYgKCFidGFfY3NpcF9pc19tZW1iZXJfbG9ja2VkX2J5X2FwcChjc2V0X2NiLT5jdXJfbG9ja19yZXEuYXBwX2lkLCBzcnZjKSkgewotICAgICAgc3J2Yy0+bG9ja19hcHBsaXN0LnB1c2hfYmFjayhjc2V0X2NiLT5jdXJfbG9ja19yZXEuYXBwX2lkKTsKLSAgICB9Ci0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmN1cl9pZHgrKzsKLSAgICAvLyBwcm9jZXNzIG5leHQgc2V0IG1lbWJlcgotICAgIGJ0YV9jc2lwX3NlbmRfbG9ja19yZXFfYWN0KGNzZXRfY2IpOwotCi0gIC8vIHNlbmQgdGhlIGxvY2sgcmVxdWVzdAotICB9IGVsc2UgewotICAgIC8vIExvY2sgdmFsdWUgaW4gdmVjdG9yIGZvcm1hdCAob25lIHVpbnQ4X3Qgc2l6ZSBlbGVtZW50IHdpdGggKQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFNlbmRpbmcgTG9jayBSZXF1ZXN0IHRvICI8PCBjc2V0X2NiLT5jdXJfZGV2X2NiLT5hZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQ29ubiBJZDogIiA8PCArY3NldF9jYi0+Y3VyX2Rldl9jYi0+Y29ubl9pZDsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsb2NrX3ZhbHVlID0gezJ9OwotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjc2V0X2NiLT5jdXJfZGV2X2NiLT5jb25uX2lkLAotICAgICAgICBzcnZjLT5sb2NrX2hhbmRsZSwgbG9ja192YWx1ZSwgR0FUVF9XUklURSwgYnRhX2NzaXBfbG9ja19yZXFfY2IsIGNzZXRfY2IpOwotCi0gICAgLy8gU3RhcnQgc2V0IG1lbWJlciByZXF1ZXN0IHRpbWVvdXQgYWxhcm0KLSAgICBjc2V0X2NiLT51bnJlc3BfdGltZXIgPSBhbGFybV9uZXcoImNzaXBfdW5yZXNwX3NtX3RpbWVyIik7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKGNzZXRfY2ItPnVucmVzcF90aW1lciwgY3NldF9jYi0+c2V0X21lbWJlcl90b3V0LAotICAgICAgICAgICAgICAgICAgICAgICBidGFfY3NpcF9zZXRfbWVtYmVyX2xvY2tfdGltZW91dCwgY3NldF9jYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX3VubG9ja19yZXFfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc2V0IG1lbWJlciBpcyB1bmxvY2tlZAotICogICAgICAgICAgICAgICAgICBieSByZW1vdGUgZGV2aWNlIGFmdGVyIFVOTE9DSyBSZXF1ZXN0Ci0gKgotICogUGFyYW1ldGVyczogICAgICBHQVRUIG9wZXJhdGlvbiBjYWxsYmFjayBwYXJhbXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfdW5sb2NrX3JlcV9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc3RhdHVzID0gIiA8PCArc3RhdHVzOwotICB0QlRBX0NTRVRfQ0IqIGNzZXRfY2IgPSAodEJUQV9DU0VUX0NCICopZGF0YTsKLSAgdEJUQV9DU0lQX0RFVl9DQiogZGV2X2NiID0gYnRhX2NzaXBfZ2V0X2Rldl9jYl9ieV9jaWQoY29ubl9pZCk7Ci0gIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMgPQotICAgICAgYnRhX2NzaXBfZ2V0X2NzaXNfaW5zdGFuY2UoZGV2X2NiLCBjc2V0X2NiLT5jdXJfbG9ja19yZXEuc2V0X2lkKTsKLQotICAvKiBEZXZpY2UgY29udHJvbCBibG9jayBvciBjb3JyZXNwb25kaW5nIENTSVMgc2VydmljZSBpbnN0YW5jZSBub3QgZm91bmQgKi8KLSAgaWYgKCFkZXZfY2IgfHwgIXNydmMpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogRGV2aWNlIENCIG5vdCBmb3VuZCBmb3IgY29ubl9pZCA9ICVkIiwgX19mdW5jX18sIGNvbm5faWQpOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgYWxhcm1fY2FuY2VsKGNzZXRfY2ItPnVucmVzcF90aW1lcik7Ci0gICAgYnRhX2NzaXBfc2VuZF91bmxvY2tfcmVxX2FjdChjc2V0X2NiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKmNoZWNrIGlmIHRoaXMgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgZnJvbSB1bnJlc3BvbnNpdmUgc2V0IG1lbWJlciAqLwotICBpZiAoZGV2X2NiLT51bnJlc3BvbnNpdmUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB1bnJlc3BvbnNpdmUgcmVtb3RlOiAiIDw8IGRldl9jYi0+YWRkcjsKLSAgICBzcnZjLT5sb2NrID0gVU5MT0NLX1ZBTFVFOwotICAgIHNydmMtPnVucnNwX2FwcGxpc3QuY2xlYXIoKTsKLSAgICBkZXZfY2ItPnVucmVzcG9uc2l2ZSA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNhbmNlbCBhbGFybSAodXNlZCBmb3IgdW5yZXNwb25zaXZlIHNldCBtZW1iZXIpCi0gIGFsYXJtX2NhbmNlbChjc2V0X2NiLT51bnJlc3BfdGltZXIpOwotCi0gIC8qIFBUUyBUZXN0IENhc2U6IHJlYWQgYW55IGNoYXJhY3RlcmlzdGljICovCi0gIGlmIChzdGF0dXMgPT0gQ1NJUF9MT0NLX1JFTEVBU0VfTk9UX0FMTE9XRUQgfHwKLSAgICAgIHN0YXR1cyA9PSBDU0lQX0lOVkFMSURfTE9DS19WQUxVRSkgewotICAgIC8qIGZvciBQVFMgdG8gZW5zdXJlIHNldCBjb29yZGluYXRvciBpcyB3b3JraW5nIGZpbmUgKi8KLSAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYyhjc2V0X2NiLT5jdXJfZGV2X2NiLT5jb25uX2lkLAotICAgICAgICBzcnZjLT5sb2NrX2hhbmRsZSwgTlVMTCwgTlVMTCk7Ci0KLSAgICAvKiBTdG9wIHVubG9ja2luZyByZW1haW5pbmcgc2V0IG1lbWJlcnMgYW5kIGluZm9ybSByZXF1ZXN0aW5nIGFwcCAqLwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9jbXBsX2NiKGNzZXRfY2ItPmN1cl9sb2NrX3Jlcyk7Ci0gICAgLyogUHJvY2VzcyBuZXh0IGxvY2sgcmVxdWVzdCBmcm9tIHBlbmRpbmcgcXVldWUgKi8KLSAgICBidGFfY3NpcF9nZXRfbmV4dF9sb2NrX3JlcXVlc3QoY3NldF9jYik7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIHNydmMtPmxvY2sgPSBVTkxPQ0tfVkFMVUU7Ci0gICAgICAvLyByZW1vdmUgYXBwIGlkIGZyb20gYXBwbGlzdAotICAgICAgc3J2Yy0+bG9ja19hcHBsaXN0LmVyYXNlKHN0ZDo6cmVtb3ZlKHNydmMtPmxvY2tfYXBwbGlzdC5iZWdpbigpLAotICAgICAgICAgIHNydmMtPmxvY2tfYXBwbGlzdC5lbmQoKSwgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmFwcF9pZCksCi0gICAgICAgICAgc3J2Yy0+bG9ja19hcHBsaXN0LmVuZCgpKTsKLSAgICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5hZGRyLnB1c2hfYmFjayhkZXZfY2ItPmFkZHIpOwotICAgIH0KLSAgICAvL3Byb2NlZWQgd2l0aCBuZXh0IHNldCBtZW1iZXIKLSAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXEuY3VyX2lkeCsrOwotICAgIGJ0YV9jc2lwX3NlbmRfdW5sb2NrX3JlcV9hY3QoY3NldF9jYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX3NlbmRfdW5sb2NrX3JlcV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgaXMgdXNlZCB0byBzZW5kIFVOTE9DSyByZXF1ZXN0IHRvIHNldCBtZW1iZXIuCi0gKiAgICAgICAgICAgICAgICAgIEl0IHZhbGlkYXRlcyBpZiBpdCBpcyByZXF1aXJlZCB0byBzZW5kIHVubG9jayByZXF1ZXN0IGJhc2VkIG9uCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gc3RhdGUgYW5kIGN1cnJlbnQgbG9jayB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGNzZXRfY2I6IGN1cnJlbnQgc2V0IGNvbnRyb2wgYmxvY2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfc2VuZF91bmxvY2tfcmVxX2FjdCh0QlRBX0NTRVRfQ0IqIGNzZXRfY2IpIHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB1aW50OF90IGN1cl9pbmRleCA9IGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4OwotCi0gIGlmIChjdXJfaW5kZXggPT0gKHVpbnQ4X3QpY3NldF9jYi0+Y3VyX2xvY2tfcmVxLm1lbWJlcnNfYWRkci5zaXplKCkpIHsKLSAgICBjc2V0X2NiLT5yZXF1ZXN0X2luX3Byb2dyZXNzID0gZmFsc2U7Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9jbXBsX2NiKGNzZXRfY2ItPmN1cl9sb2NrX3Jlcyk7Ci0gICAgYnRhX2NzaXBfZ2V0X25leHRfbG9ja19yZXF1ZXN0KGNzZXRfY2IpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFJlcXVlc3QgY29tcGxldGVkIGZvciBhbGwgc2V0IG1lbWJlcnMiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJkX2FkZHIgPSBjc2V0X2NiLT5jdXJfbG9ja19yZXEubWVtYmVyc19hZGRyW2N1cl9pbmRleF07Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFNldCBNZW1iZXIgYWRkcmVzczogIiA8PCBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0KLSAgLy8gZ2V0IGRldmljZSBjb250cm9sIGJsb2NrIGFuZCBjb3JyZXNwb25kaW5nIGNzaXMgc2VydmljZSBkZXRhaWxzCi0gIGNzZXRfY2ItPmN1cl9kZXZfY2IgPSBidGFfY3NpcF9maW5kX2Rldl9jYl9ieV9iZGEoYmRfYWRkcik7Ci0gIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMgPQotICAgICAgYnRhX2NzaXBfZ2V0X2NzaXNfaW5zdGFuY2UoY3NldF9jYi0+Y3VyX2Rldl9jYiwgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLnNldF9pZCk7Ci0KLSAgLyogRGV2aWNlIGNvbnRyb2wgYmxvY2sgb3IgY29ycmVzcG9uZGluZyBDU0lTIHNlcnZpY2UgaW5zdGFuY2Ugbm90IGZvdW5kICovCi0gIGlmICghY3NldF9jYi0+Y3VyX2Rldl9jYiB8fCAhc3J2YykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBEZXZpY2UgQ0Igbm90IGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmN1cl9pZHgrKzsKLSAgICBidGFfY3NpcF9zZW5kX3VubG9ja19yZXFfYWN0KGNzZXRfY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFNldCBtZW1iZXIgaXMgbm90IGxvY2tlZCBieSByZXF1ZXN0aW5nIGFwcCAqLwotICBpZiAoIWJ0YV9jc2lwX2lzX21lbWJlcl9sb2NrZWRfYnlfYXBwKGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5hcHBfaWQsIHNydmMpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQXBwICI8PCArY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmFwcF9pZAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhhcyBub3QgbG9ja2VkIHRoaXMgc2V0IG1lbWJlciAoIiA8PCBzcnZjLT5iZF9hZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiKS4gU2tpcCB0aGlzIHNldCBtZW1iZXIiOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgYnRhX2NzaXBfc2VuZF91bmxvY2tfcmVxX2FjdChjc2V0X2NiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTa2lwIGRldmljZSBpZiBpdCBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlCi0gIGlmIChjc2V0X2NiLT5jdXJfZGV2X2NiLT5zdGF0ZSAhPSBCVEFfQ1NJUF9DT05OX1NUKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFNldCBNZW1iZXIgKCIgPDwgYmRfYWRkci5Ub1N0cmluZygpCi0gICAgICAgICAgICAgIDw8ICIpIGlzIG5vdCBjb25uZWN0ZWQuIFNraXAgdGhpcyBTZXQgbWVtYmVyIjsKLQotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgLy8gcmVtb3ZlIGFwcCBpZCBmcm9tIGFwcGxpc3QKLSAgICBzcnZjLT5sb2NrX2FwcGxpc3QuZXJhc2Uoc3RkOjpyZW1vdmUoc3J2Yy0+bG9ja19hcHBsaXN0LmJlZ2luKCksIHNydmMtPmxvY2tfYXBwbGlzdC5lbmQoKSwKLSAgICAgICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLmFwcF9pZCksIHNydmMtPmxvY2tfYXBwbGlzdC5lbmQoKSk7Ci0gICAgYnRhX2NzaXBfc2VuZF91bmxvY2tfcmVxX2FjdChjc2V0X2NiKTsKLQotICAvLyBjaGVjayBpZiBhbHJlYWR5IHVubG9ja2VkIG9yIGxvY2tlZCBieSBtdWx0aXBsZSBhcHBzIChza2lwIHNlbmRpbmcgd3JpdGUgcmVxdWVzdCkKLSAgfSBlbHNlIGlmIChzcnZjLT5sb2NrID09IFVOTE9DS19WQUxVRSB8fAotICAgICAgICAgICAgIGJ0YV9jc2lwX2lzX2xvY2tlZF9ieV9vdGhlcl9hcHBzKHNydmMsIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5hcHBfaWQpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFNldCBNZW1iZXIgKCIgPDwgYmRfYWRkci5Ub1N0cmluZygpCi0gICAgICAgICAgICAgIDw8ICIpIGlzIGFscmVhZHkgdW5sb2NrZWQgb3IgbG9ja2VkIGJ5IG90aGVyIGFwcC4gU2tpcCB0aGlzIFNldCBtZW1iZXIiOwotICAgIC8vIHJlbW92ZSBhcHAgaWQgZnJvbSBhcHBsaXN0Ci0gICAgc3J2Yy0+bG9ja19hcHBsaXN0LmVyYXNlKHN0ZDo6cmVtb3ZlKHNydmMtPmxvY2tfYXBwbGlzdC5iZWdpbigpLCBzcnZjLT5sb2NrX2FwcGxpc3QuZW5kKCksCi0gICAgICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5hcHBfaWQpLCBzcnZjLT5sb2NrX2FwcGxpc3QuZW5kKCkpOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLmFkZHIucHVzaF9iYWNrKGNzZXRfY2ItPmN1cl9kZXZfY2ItPmFkZHIpOwotICAgIC8vIHByb2Nlc3MgbmV4dCBzZXQgbWVtYmVyCi0gICAgYnRhX2NzaXBfc2VuZF91bmxvY2tfcmVxX2FjdChjc2V0X2NiKTsKLQotICAvLyBzZW5kIHRoZSB1bmxvY2sgcmVxdWVzdAotICB9IGVsc2UgewotICAgIC8vIFVubG9jayB2YWx1ZSBpbiB2ZWN0b3IgZm9ybWF0IChvbmUgdWludDhfdCBzaXplIGVsZW1lbnQgd2l0aCB1bmxvY2sgdmFsdWUpCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbG9ja192YWx1ZSgxLCBVTkxPQ0tfVkFMVUUpOwotICAgIEJ0YUdhdHRRdWV1ZTo6V3JpdGVDaGFyYWN0ZXJpc3RpYyhjc2V0X2NiLT5jdXJfZGV2X2NiLT5jb25uX2lkLAotICAgICAgICBzcnZjLT5sb2NrX2hhbmRsZSwgbG9ja192YWx1ZSwgR0FUVF9XUklURSwgYnRhX2NzaXBfdW5sb2NrX3JlcV9jYiwgY3NldF9jYik7Ci0KLSAgICAvLyBTdGFydCBzZXQgbWVtYmVyIHJlcXVlc3QgdGltZW91dCBhbGFybQotICAgIGNzZXRfY2ItPnVucmVzcF90aW1lciA9IGFsYXJtX25ldygiY3NpcF91bnJlc3Bfc21fdGltZXIiKTsKLSAgICBhbGFybV9zZXRfb25fbWxvb3AoY3NldF9jYi0+dW5yZXNwX3RpbWVyLCBjc2V0X2NiLT5zZXRfbWVtYmVyX3RvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0YV9jc2lwX3NldF9tZW1iZXJfbG9ja190aW1lb3V0LCBjc2V0X2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfc2V0X21lbWJlcl9sb2NrX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgQVBJIGlzIGNhbGxlZCB3aGVuIFNldCBNZW1iZXIgaGFzIG5vdCByZXNwb25kZWQgd2l0aGluCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHNldCBtZW1iZXIgbG9jayB0aW1lb3V0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX3NldF9tZW1iZXJfbG9ja190aW1lb3V0KHZvaWQqIHBfZGF0YSkgewotICB0QlRBX0NTRVRfQ0IqIGNzZXRfY2IgPSAodEJUQV9DU0VUX0NCICopcF9kYXRhOwotICB0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IgPSBjc2V0X2NiLT5jdXJfZGV2X2NiOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICAvLyBEZXZpY2Ugbm90IGZvdW5kIG9yIGRpc2Nvbm5lY3RlZAotICBpZiAoIWRldl9jYiB8fCBkZXZfY2ItPnN0YXRlICE9IEJUQV9DU0lQX0NPTk5fU1QpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIGRpc2Nvbm5lY3RlZC4iOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3Jlcy5zdGF0dXMgPSBTT01FX0xPQ0tTX0FDUVVJUkVEX1JFQVNPTl9ESVNDOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgYnRhX2NzaXBfc2VuZF9sb2NrX3JlcV9hY3QoY3NldF9jYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9Ci0gICAgICBidGFfY3NpcF9nZXRfY3Npc19pbnN0YW5jZShjc2V0X2NiLT5jdXJfZGV2X2NiLCBjc2V0X2NiLT5jdXJfbG9ja19yZXEuc2V0X2lkKTsKLQotICBpZiAoIXNydmMpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogQ1NJUyBpbnN0YW5jZSBub3QgZm91bmQuIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRldl9jYi0+dW5yZXNwb25zaXZlID0gdHJ1ZTsKLSAgLy8gYWRkIGFwcF9pZCBpbiB1bnJlc3BvbnNpdmUgc2V0IG1lbWJlcnMgYXBwIGxpc3QKLSAgc3J2Yy0+dW5yc3BfYXBwbGlzdC5wdXNoX2JhY2soY3NldF9jYi0+Y3VyX2xvY2tfcmVzLmFwcF9pZCk7Ci0KLSAgaWYgKGNzZXRfY2ItPmN1cl9sb2NrX3JlcS52YWx1ZSA9PSBMT0NLX1ZBTFVFKSB7Ci0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVzLnN0YXR1cyA9IFNPTUVfTE9DS1NfQUNRVUlSRURfUkVBU09OX1RJTUVPVVQ7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFByb2Nlc3MgbmV4dCBkZXZpY2UgaW4gdGhlIGxvY2sgcmVxdWVzdCIsIF9fZnVuY19fKTsKLSAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXEuY3VyX2lkeCsrOwotICAgIGJ0YV9jc2lwX3NlbmRfbG9ja19yZXFfYWN0KGNzZXRfY2IpOwotICB9IGVsc2UgaWYgKGNzZXRfY2ItPmN1cl9sb2NrX3JlcS52YWx1ZSA9PSBVTkxPQ0tfVkFMVUUpIHsKLSAgICBjc2V0X2NiLT5jdXJfbG9ja19yZXMuYWRkci5wdXNoX2JhY2soCi0gICAgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLm1lbWJlcnNfYWRkcltjc2V0X2NiLT5jdXJfbG9ja19yZXEuY3VyX2lkeF0pOwotICAgIGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5jdXJfaWR4Kys7Ci0gICAgYnRhX2NzaXBfc2VuZF91bmxvY2tfcmVxX2FjdChjc2V0X2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfbGVfZW5jcnlwdF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgbGluayBlbmNyeXB0aW9uIGNvbXBsZXRlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2xlX2VuY3J5cHRfY2JhY2soY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEdBVFRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgcmVzdWx0KSB7Ci0gIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwotICB0QlRBX0NTSVBfREVWX0NCKiBwX2NiID0gYnRhX2NzaXBfZmluZF9kZXZfY2JfYnlfYmRhKCpiZF9hZGRyKTsKLQotICBpZiAoIXBfY2IpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCJ1bmV4cGVjdGVkIGVuY3J5cHRpb24gY2FsbGJhY2ssIGlnbm9yZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIGVuY3J5cHRpb24gZmFpbHMsIGRpc2Nvbm5lY3QgdGhlIGNvbm5lY3Rpb24gKi8KLSAgaWYgKHJlc3VsdCAhPSBCVE1fU1VDQ0VTUykgewotICAgIGJ0YV9jc2lwX2Nsb3NlX2NzaXBfY29ubihwX2NiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9jYi0+c3RhdGUgPT0gQlRBX0NTSVBfVzRfU0VDKSB7Ci0gICAgYnRhX2NzaXBfc21fZXhlY3V0ZShwX2NiLCBCVEFfQ1NJUF9FTkNfQ01QTF9FVlQsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9vcGVuX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQVBJIENhbGwgdG8gb3BlbiBDU0lQIEdhdHQgQ29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2FwaV9vcGVuX2FjdCAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IE9wZW4gR0FUVCBjb25uZWN0aW9uIGZvciBDU0lQIiwgX19mdW5jX18pOwotCi0gIHRCVEFfQ1NJUF9BUElfQ09OTiogcF9jb25uX3JlcSA9ICh0QlRBX0NTSVBfQVBJX0NPTk4gKikmcF9kYXRhLT5jb25uX3BhcmFtOwotCi0gIGlmICghYnRhX2NzaXBfaXNfYXBwX3JlZyhwX2Nvbm5fcmVxLT5hcHBfaWQpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZXF1ZXN0IGZyb20gSW52YWxpZC9VbnJlZ2lzdGVyZWQgQXBwOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCArcF9jb25uX3JlcS0+YXBwX2lkOwotICAgIGlmIChwX2NiICYmICh1aW50OF90KXBfY2ItPmNvbm5fYXBwbGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgcF9jYi0+c3RhdGUgPSBCVEFfQ1NJUF9JRExFX1NUOwotICAgIH0KLSAgICAvLyBObyBuZWVkIHRvIHNlbmQgY2FsbGJhY2sgdG8gaW52YWxpZC91bnJlZ2lzdGVyZWQgYXBwCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KHBfY2ItPmFkZHIpICYmICFidGFfY3NpcF9pc19jc2lzX3N1cHBvcnRlZChwX2NiKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBSZW1vdGUgKCVzKSBkb2VzbnQgY29udGFpbiBhbnkgY29vcmRpbmF0ZWQgc2V0IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2NiLT5hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IocF9jYiwgcF9jb25uX3JlcS0+YXBwX2lkLAotICAgICAgICBCVEFfQ1NJUF9ESVNDT05ORUNURUQsIEJUQV9DU0lQX0NPT1JESU5BVEVEX1NFVF9OT1RfU1VQUE9SVEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXBfY2IpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEluc3VmZmljaWVudCByZXNvdXJjZXMuIE1heCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3VwcG9ydGVkIFNldCBtZW1iZXJzIGhhdmUgcmVhY2hlZCAiOwotICAgIHRCVEFfQ1NJUF9ERVZfQ0IgaW52YWxpZF9jYiA9IHsKLSAgICAgICAgLmFkZHIgPSBwX2RhdGEtPmNvbm5fcGFyYW0uYmRfYWRkcgotICAgIH07Ci0gICAgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IoJmludmFsaWRfY2IsIHBfY29ubl9yZXEtPmFwcF9pZCwKLSAgICAgICAgQlRBX0NTSVBfRElTQ09OTkVDVEVELCBCVEFfQ1NJUF9DT05OX0VTVEFCTElTSE1FTlRfRkFJTEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjaGVjayBpZiBjb25uZWN0aW9uIHN0YXRlIGlzIGFscmVhZHkgY29ubmVjdGVkCi0gIGlmIChwX2NiLT5zdGF0ZSA9PSBCVEFfQ1NJUF9DT05OX1NUKSB7Ci0gICAgaWYgKCFidGFfY3NpcF9pc19hcHBfZnJvbV9hcHBsaXN0KHBfY2IsIHBfY29ubl9yZXEtPmFwcF9pZCkpIHsKLSAgICAgIGJ0YV9jc2lwX2FkZF9hcHBfdG9fYXBwbGlzdChwX2NiLCBwX2Nvbm5fcmVxLT5hcHBfaWQpOwotICAgIH0KLSAgICBidGFfY3NpcF9zZW5kX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYihwX2NiLCBwX2Nvbm5fcmVxLT5hcHBfaWQsCi0gICAgICAgIEJUQV9DU0lQX0NPTk5FQ1RFRCwgQlRBX0NTSVBfQ09OTl9FU1RBQkxJU0hFRCk7Ci0gICAgcmV0dXJuOwotCi0gIC8vIG90aGVyIGFwcCBoYXMgYWxyZWFkeSBzdGFydGVkIGNvbm5lY3Rpb24gcHJvY2VkdXJlCi0gIH0gZWxzZSBpZiAoIWJ0YV9jc2lwX2lzX2FwcF9mcm9tX2FwcGxpc3QocF9jYiwgcF9jb25uX3JlcS0+YXBwX2lkKQotICAgICAgICAgICAgICAgICYmICh1aW50OF90KXBfY2ItPmNvbm5fYXBwbGlzdC5zaXplKCkgPiAwCi0gICAgICAgICAgICAgICAgJiYgcF9jYi0+c3RhdGUgIT0gQlRBX0NTSVBfSURMRV9TVCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBPdGhlciBhcHAgaXMgZXN0YWJsaXNoaW5nIENTSVAgQ29ubmVjdGlvbi4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQ3VycmVudCBjb25uZWN0aW9uIHN0YXRlID0gIiA8PCArcF9jYi0+c3RhdGU7Ci0gICAgYnRhX2NzaXBfYWRkX2FwcF90b19hcHBsaXN0KHBfY2IsIHBfY29ubl9yZXEtPmFwcF9pZCk7Ci0gICAgLyogTm90ZTogQ2FsbGJhY2sgd2lsbCBnaXZlbiB0byBhbGwgYXBwcyBvbmNlIGNvbm5lY3Rpb24gcHJvY2VkdXJlIGlzIGNvbXBsZXRlZCAqLwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfY2ItPmFkZHIgPSBwX2RhdGEtPmNvbm5fcGFyYW0uYmRfYWRkcjsKLSAgYnRhX2NzaXBfYWRkX2FwcF90b19hcHBsaXN0KHBfY2IsIHBfY29ubl9yZXEtPmFwcF9pZCk7Ci0KLSAgQlRBX0dBVFRDX09wZW4oYnRhX2NzaXBfY2IuZ2F0dF9pZiwgcF9jYi0+YWRkciwgdHJ1ZSwgR0FUVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2FwaV9jbG9zZV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFQSSBDYWxsIHRvIGNsb3NlIENTSVAgR2F0dCBDb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfYXBpX2Nsb3NlX2FjdCAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpIHsKLSAgaWYgKCFwX2NiKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEFscmVhZHkgQ2xvc2VkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0NTSVBfQVBJX0NPTk4qIHBfcmVxID0gKHRCVEFfQ1NJUF9BUElfQ09OTiAqKSZwX2RhdGEtPmNvbm5fcGFyYW07Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgRGlzY29ubmVjdCBSZXF1ZXN0IGZyb20gQXBwOiAiIDw8ICtwX3JlcS0+YXBwX2lkOwotCi0gIGlmICghYnRhX2NzaXBfaXNfYXBwX3JlZyhwX3JlcS0+YXBwX2lkKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogUmVxdWVzdCBmcm9tIEludmFsaWQvVW5yZWdpc3RlcmVkIEFwcDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgK3BfcmVxLT5hcHBfaWQ7Ci0gICAgLy8gTm8gbmVlZCB0byBzZW5kIGNhbGxiYWNrIHRvIGludmFsaWQvdW5yZWdpc3RlcmVkIGFwcAotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmICghYnRhX2NzaXBfaXNfYXBwX2Zyb21fYXBwbGlzdChwX2NiLCBwX3JlcS0+YXBwX2lkKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBBcHAgKElEOiI8PCArcF9yZXEtPmFwcF9pZCA8PCIpIGhhcyBub3QgY29ubmVjdGVkIjsKLSAgICBidGFfY3NpcF9zZW5kX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYihwX2NiLCBwX3JlcS0+YXBwX2lkLAotICAgICAgICAgIEJUQV9DU0lQX0RJU0NPTk5FQ1RFRCwgQlRBX0NTSVBfRElTQ09OTkVDVF9XSVRIT1VUX0NPTk5FQ1QpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIENoZWNrIGlmIGl0cyBsYXN0IGRpc2Nvbm5lY3RpbmcgYXBwCi0gIGlmICgodWludDhfdClwX2NiLT5jb25uX2FwcGxpc3Quc2l6ZSgpID4gMSkgewotICAgIGJ0YV9jc2lwX3JlbW92ZV9hcHBfZnJvbV9jb25uX2xpc3QocF9jYiwgcF9yZXEtPmFwcF9pZCk7Ci0gICAgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IocF9jYiwgcF9yZXEtPmFwcF9pZCwKLSAgICAgICAgICBCVEFfQ1NJUF9ESVNDT05ORUNURUQsIEJUQV9DU0lQX0FQUF9ESVNDT05ORUNURUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0YV9jc2lwX2Nsb3NlX2NzaXBfY29ubihwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dhdHRfb3Blbl9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gR0FUVCBDb25uZWN0aW9uIGlzIGNyZWF0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfZ2F0dF9vcGVuX2FjdCAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19PUEVOKiBvcGVuX3BhcmFtID0gJnBfZGF0YS0+Z2F0dF9vcGVuX3BhcmFtOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBSZW1vdGUgPSAiIDw8IG9wZW5fcGFyYW0tPnJlbW90ZV9iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgU3RhdHVzID0gIiA8PCBvcGVuX3BhcmFtLT5zdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY29ubl9pZCA9ICIgPDwgb3Blbl9wYXJhbS0+Y29ubl9pZDsKLQotICBpZiAob3Blbl9wYXJhbS0+c3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgIHBfY2ItPmluX3VzZSA9IHRydWU7Ci0gICAgcF9jYi0+Y29ubl9pZCA9IG9wZW5fcGFyYW0tPmNvbm5faWQ7Ci0gICAgQnRhR2F0dFF1ZXVlOjpDbGVhbihwX2NiLT5jb25uX2lkKTsKLSAgICBidGFfY3NpcF9zbV9leGVjdXRlKHBfY2IsIEJUQV9DU0lQX1NUQVJUX0VOQ19FVlQsIE5VTEwpOwotICB9IGVsc2UgewotICAgIC8qIG9wZW4gZmFpbHVyZSAqLwotICAgIGJ0YV9jc2lwX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0NTSVBfT1BFTl9GQUlMX0VWVCwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2F0dF9jbG9zZV9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gR0FUVCBDb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9nYXR0X2Nsb3NlX2FjdCAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUQV9HQVRUQ19PUEVOKiBvcGVuX3BhcmFtID0gJnBfZGF0YS0+Z2F0dF9vcGVuX3BhcmFtOwotCi0gIC8vIEdpdmUgY2FsbGJhY2sgdG8gYWxsIGFwcHMgZnJvbSBjb25uZWN0aW9uIGFwcGxpc3QKLSAgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IocF9jYiwgQlRBX0NTSVBfRElTQ09OTkVDVEVELCBvcGVuX3BhcmFtLT5zdGF0dXMpOwotCi0gIC8vIENsZWFyIGFwcGxpc3QKLSAgcF9jYi0+Y29ubl9hcHBsaXN0LmNsZWFyKCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfU1VQUE9SVEVEX1NFVFNfUEVSX0RFVklDRTsgaSsrKSB7Ci0gICAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9ICZwX2NiLT5jc2lzX3NydmNbaV07Ci0gICAgaWYgKHNydmMtPmluX3VzZSkgewotICAgICAgc3J2Yy0+bG9jayA9IFVOTE9DS19WQUxVRTsKLSAgICB9Ci0gIH0KLQotICBwX2NiLT5jb25uX2lkID0gMDsKLSAgcF9jYi0+aW5fdXNlID0gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nYXR0X29wZW5fZmFpbF9hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gR0FUVCBDb25uZWN0aW9uIGZhaWxzIHRvIGJlIGNyZWF0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfZ2F0dF9vcGVuX2ZhaWxfYWN0ICh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKSB7Ci0gIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBGYWlsZWQgdG8gb3BlbiBHQVRUIENvbm5lY3Rpb24iOwotCi0gIHRCVEFfR0FUVENfT1BFTiogb3Blbl9wYXJhbSA9ICZwX2RhdGEtPmdhdHRfb3Blbl9wYXJhbTsKLQotICAvLyBHaXZlIGNhbGxiYWNrIHRvIGFsbCBhcHBzIGZyb20gY29ubmVjdGlvbiBhcHBsaXN0IHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24KLSAgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IocF9jYiwgQlRBX0NTSVBfRElTQ09OTkVDVEVELCBvcGVuX3BhcmFtLT5zdGF0dXMpOwotCi0gIC8vIENsZWFyIGFwcGxpc3QKLSAgcF9jYi0+Y29ubl9hcHBsaXN0LmNsZWFyKCk7Ci0gIHBfY2ItPmluX3VzZSA9IGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfb3Blbl9jbXBsX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGFza3MgbmVlZGVkIHRvIGJlIGRvbmUgd2hlbiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX29wZW5fY21wbF9hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghcF9jYikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIGRldmljZSBjb250cmwgYmxvY2siOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEdpdmUgY2FsbGJhY2sgdG8gYWxsIGFwcHMgZnJvbSBjb25uZWN0aW9uIGFwcGxpc3Qgd2FpdGluZyBmb3IgY29ubmVjdGlvbgotICBidGFfY3NpcF9zZW5kX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYihwX2NiLCBCVEFfQ1NJUF9DT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9DU0lQX0NPTk5fRVNUQUJMSVNIRUQpOwotCi0gIC8qIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2YgcmVxdWlyZWQgQ1NJUyBjaGFyYWN0ZXJpc3RpYyovCi0gIGludCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9TVVBQT1JURURfU0VUU19QRVJfREVWSUNFOyBpKyspIHsKLSAgICAgIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMgPSAmcF9jYi0+Y3Npc19zcnZjW2ldOwotICAgIGlmIChzcnZjLT5pbl91c2UpIHsKLSAgICAgIGJ0YV9jc2lwX3dyaXRlX2NjY2QocF9jYiwgc3J2Yy0+bG9ja19oYW5kbGUsIHNydmMtPmxvY2tfY2NkX2hhbmRsZSk7Ci0gICAgICBidGFfY3NpcF93cml0ZV9jY2NkKHBfY2IsIHNydmMtPnNpemVfaGFuZGxlLCBzcnZjLT5zaXplX2NjZF9oYW5kbGUpOwotICAgICAgYnRhX2NzaXBfd3JpdGVfY2NjZChwX2NiLCBzcnZjLT5zaXJrX2hhbmRsZSwgc3J2Yy0+c2lya19jY2RfaGFuZGxlKTsKLSAgICB9Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfc3RhcnRfc2VjX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGFza3MgbmVlZGVkIHRvIGJlIGRvbmUgdG8gY2hlY2sgb3IgZXN0YWJsaXNoIENTSVAgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgc2VjdXJpdHkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfc3RhcnRfc2VjX2FjdCAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgdWludDhfdCBzZWNfZmxhZyA9IDA7Ci0KLSAgLy8gR2V0IHNlY3VyaXR5IGZsYWdzIGZvciB0aGUgZGV2aWNlCi0gIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQocF9jYi0+YWRkciwgJnNlY19mbGFnLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIC8vIGxpbmsgaXMgYWxyZWFkeSBlbmNyeXB0ZWQsIHNlbmQgZW5jcnlwdGlvbiBjb21wbGV0ZSBjYWxsYmFjayB0byBjc2lwCi0gIGlmIChzZWNfZmxhZyAmIEJUTV9TRUNfRkxBR19FTkNSWVBURUQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBBbHJlYWR5IEVuY3J5cHRlZCI7Ci0gICAgYnRhX2NzaXBfc21fZXhlY3V0ZShwX2NiLCBCVEFfQ1NJUF9FTkNfQ01QTF9FVlQsIE5VTEwpOwotICB9Ci0gIC8vIGRldmljZSBpcyBib25kZWQgYnV0IGxpbmsgaXMgbm90IGVuY3J5cHRlZC4gU3RhcnQgZW5jcnlwdGlvbgotICBlbHNlIGlmIChzZWNfZmxhZyAmIEJUTV9TRUNfRkxBR19MS0VZX0tOT1dOKSB7Ci0gICAgc2VjX2ZsYWcgPSBCVE1fQkxFX1NFQ19FTkNSWVBUOwotICAgIEJUTV9TZXRFbmNyeXB0aW9uKHBfY2ItPmFkZHIsIEJUQV9UUkFOU1BPUlRfTEUsIGJ0YV9jc2lwX2xlX2VuY3J5cHRfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc2VjX2ZsYWcpOwotICB9Ci0gIC8vIHVuYm9uZGVkIGRldmljZS4gU2V0IE1JVE0gRW5jcnlwdGlvbgotICBlbHNlIGlmIChwX2NiLT5zZWNfbWFzayAhPSBCVEFfU0VDX05PTkUpIHsKLSAgICBzZWNfZmxhZyA9IEJUTV9CTEVfU0VDX0VOQ1JZUFRfTUlUTTsKLSAgICBCVE1fU2V0RW5jcnlwdGlvbihwX2NiLT5hZGRyLCBCVEFfVFJBTlNQT1JUX0xFLCBidGFfY3NpcF9sZV9lbmNyeXB0X2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNlY19mbGFnKTsKLSAgfQotICAvLyBsaW5rIGlzIGFscmVhZHkgZW5jcnlwdGVkCi0gIGVsc2UgewotICAgIGJ0YV9jc2lwX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0NTSVBfRU5DX0NNUExfRVZULCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfc3RhcnRfc2VjX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGFza3MgbmVlZGVkIHRvIGJlIGRvbmUgdG8gY2hlY2sgb3IgZXN0YWJsaXNoIENTSVAgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgc2VjdXJpdHkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfc2VjX2NtcGxfYWN0ICh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLCB0QlRBX0NTSVBfUkVRX0RBVEEqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBwX2NiLT5jc2lzX3NydmNbMF0uaW5fdXNlID0gJWQsIHBfY2ItPmNzaXNfc3J2Y1swXS5zaXJrX2hhbmRsZSA9ICVkIiwKLSAgICAgIF9fZnVuY19fLCBwX2NiLT5jc2lzX3NydmNbMF0uaW5fdXNlLCBwX2NiLT5jc2lzX3NydmNbMF0uc2lya19oYW5kbGUpOwotCi0gIGlmICghcF9jYi0+Y3Npc19zcnZjWzBdLmluX3VzZSB8fCAhcF9jYi0+Y3Npc19zcnZjWzBdLnNpcmtfaGFuZGxlKSB7Ci0gICAgLyogU2VydmljZSBkaXNjb3ZlcnkgaXMgdHJpZ2dlcmVkIGZyb20gdGhpcyBwYXRoIHdoZW4gY3NpcCBjb25uZWN0aW9uIGlzIG9wZW5lZAotICAgICAqIGZyb20gM3JkIHBhcnR5IGFwcGxpY2F0aW9uICovCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJTZXJ2aWNlIGRpc2NvdmVyeSBpcyBwZW5kaW5nIjsKLSAgICBVdWlkIHByaV9zcnZjID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0NTSVMpOwotICAgIEJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdChwX2NiLT5jb25uX2lkLCAmcHJpX3NydmMpOwotICB9IGVsc2UgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiU2VydmljZSBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBjb21wbGV0ZWQiOwotICAgIGJ0YV9jc2lwX3NtX2V4ZWN1dGUocF9jYiwgQlRBX0NTSVBfT1BFTl9DTVBMX0VWVCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2Nsb3NlX2NzaXBfY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQVBJIHRvIGNsb3NlIENTSVAgQ29ubmVjdGlvbiBhbmQgcmVtb3ZlIGRldmljZSBmcm9tIGJhY2tncm91bmQKLSAqICAgICAgICAgICAgICAgICAgbGlzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9jbG9zZV9jc2lwX2Nvbm4gKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICBpZiAocF9jYi0+Y29ubl9pZCAhPSBHQVRUX0lOVkFMSURfQ09OTl9JRCkgewotICAgIC8vIGNsZWFyIHBlbmRpbmcgR0FUVCBSZXF1ZXN0cwotICAgIEJ0YUdhdHRRdWV1ZTo6Q2xlYW4ocF9jYi0+Y29ubl9pZCk7Ci0gICAgcF9jYi0+c3RhdGUgPSBCVEFfQ1NJUF9ESVNDT05ORUNUSU5HX1NUOwotICAgIC8vIFNlbmQgQ2xvc2UgdG8gR0FUVCBMYXllcgotICAgIGlmIChwX2NiLT5zdGF0ZSA9PSBCVEFfQ1NJUF9DT05OX1NUIHx8IHBfY2ItPmNvbm5faWQpIHsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShwX2NiLT5jb25uX2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRBX0dBVFRDX0NhbmNlbE9wZW4oYnRhX2NzaXBfY2IuZ2F0dF9pZiwgcF9jYi0+YWRkciwgdHJ1ZSk7Ci0gICAgICB0QlRBX0dBVFRDX09QRU4gb3BlbiA9IHsuc3RhdHVzID0gR0FUVF9TVUNDRVNTfTsKLSAgICAgIGJ0YV9jc2lwX2dhdHRfY2xvc2VfYWN0KHBfY2IsKHRCVEFfQ1NJUF9SRVFfREFUQSAqKSZvcGVuKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2hhbmRsZV9ub3RpZmljYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gbm90aWZpY2F0aW9uIGlzIHJlY2VpdmVkIG9uIG9uZQotICogICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhcmFjdGVyaXN0aWMgcmVnaXN0ZXJlZCBmb3Igbm90aWZpY2F0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2hhbmRsZV9ub3RpZmljYXRpb24odEJUQV9HQVRUQ19OT1RJRlkqIG50ZikgewotICBpZiAoIW50Zi0+aXNfbm90aWZ5KSByZXR1cm47Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzw8ICIgU2V0IE1lbWJlcjogIiA8PCBudGYtPmJkYSA8PCAiLCBoYW5kbGU6ICIgPDwgbnRmLT5oYW5kbGU7Ci0KLSAgdEJUQV9DU0lQX0RFVl9DQiogcF9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYShudGYtPmJkYSk7Ci0gIGlmICghcF9jYikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBObyBDU0lQIEdBVFQgQ29ubmVjdGlvbiBmb3IgdGhpcyBkZXZpY2UiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljKiBwX2NoYXIgPQotICAgIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyhwX2NiLT5jb25uX2lkLCBudGYtPmhhbmRsZSk7Ci0gIGlmIChwX2NoYXIgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZvciBVbmtub3duIENoYXJhY3RlcmlzdGljLCBjb25uX2lkOiAiCi0gICAgICAgICIweCUwNHgsIGhhbmRsZTogMHglMDR4IiwKLSAgICAgICAgX19mdW5jX18sIHBfY2ItPmNvbm5faWQsIG50Zi0+aGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9jaGFyLT51dWlkID09IENTSVNfU0VSVklDRV9MT0NLX1VVSUQpIHsKLSAgICBidGFfY3NpcF9oYW5kbGVfbG9ja192YWx1ZV9ub3RpZihwX2NiLCBudGYtPmhhbmRsZSwgbnRmLT52YWx1ZVswXSk7Ci0gIH0gZWxzZSBpZiAocF9jaGFyLT51dWlkID09IENTSVNfU0VSVklDRV9TSVJLX1VVSUQpIHsKLSAgICAvL2J0YV9jc2lwX2hhbmRsZV9zaXJrX2NoYW5nZSgpOwotICB9IGVsc2UgaWYgKHBfY2hhci0+dXVpZCA9PSBDU0lTX1NFUlZJQ0VfU0laRV9VVUlEKSB7Ci0gICAgLy9idGFfY3NpcF9oYW5kbGVfc2l6ZV9jaGFuZ2UoKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfaGFuZGxlX2xvY2tfdmFsdWVfbm90aWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gbm90aWZpY2F0aW9uIGlzIHJlY2VpdmVkIGZvcgotICogICAgICAgICAgICAgICAgICBjaGFuZ2UgaW4gbG9jayB2YWx1ZSBvbiBzZXQgbWVtYmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2hhbmRsZV9sb2NrX3ZhbHVlX25vdGlmKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCB2YWx1ZSkgewotICB0QlRBX0NTSVNfU1JWQ19JTkZPKiBzcnZjID0gYnRhX2NzaXBfZmluZF9jc2lzX3NydmNfYnlfbG9ja19oYW5kbGUocF9jYiwgaGFuZGxlKTsKLSAgaWYgKCFzcnZjKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIENTSVMgU2VydmljZSBpbnN0YW5jZSBub3QgZm91bmQgZm9yIHRoaXMgaGFuZGxlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBMT0NLIGhhcyBiZWVuIHJlbGVhc2VkIGJ5IFNldCBtZW1iZXIgKGJ5IGxvY2sgdGltZW91dCkgKi8KLSAgaWYgKHZhbHVlID09IFVOTE9DS19WQUxVRSAmJiBzcnZjLT5sb2NrID09IExPQ0tfVkFMVUUpIHsKLSAgICBzcnZjLT5sb2NrID0gVU5MT0NLX1ZBTFVFOwotICAgIC8qIEdpdmUgbG9jayBzdGF0dXMgY2hhbmdlZCBub3RpZmljYXRpb24gdG8gYWxsIGFwcHMgaG9sZGluZwotICAgICAqIGxvY2sgZm9yIHRoaXMgc2V0IG1lbWJlciAqLwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIExvY2sgcmVsZWFzZWQgYnkgdGltZW91dCI7Ci0gICAgZm9yIChhdXRvIGk6IHNydmMtPmxvY2tfYXBwbGlzdCkgewotICAgICAgdEJUQV9DU0lQX1JDQiogcmNiID0gYnRhX2NzaXBfZ2V0X3JjYihpKTsKLSAgICAgIGlmIChyY2IgJiYgcmNiLT5wX2NiYWNrKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IHNtKDEsIHBfY2ItPmFkZHIpOwotICAgICAgICB0QlRBX0xPQ0tfU1RBVFVTX0NIQU5HRUQgcF9kYXRhID0ge2ksIHNydmMtPnNldF9pZCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DS19SRUxFQVNFRF9USU1FT1VULCBzbX07Ci0gICAgICAgICgqcmNiLT5wX2NiYWNrKSAoQlRBX0NTSVBfTE9DS19TVEFUVVNfQ0hBTkdFRF9FVlQsICh0QlRBX0NTSVBfREFUQSAqKSZwX2RhdGEpOwotICAgICAgfQotICAgIH0KLSAgICBzcnZjLT5sb2NrX2FwcGxpc3QuY2xlYXIoKTsKLSAgfQotICAvKiBMT0NLIGhlbGQgYnkgb3RoZXIgc2V0IGNvb3JkaW5hdG9yIGlzIHJlbGVhc2VkICovCi0gIGVsc2UgaWYgKHZhbHVlID09IFVOTE9DS19WQUxVRSAmJiBzcnZjLT5sb2NrID09IFVOTE9DS19WQUxVRSkgewotICAgIC8vIGNoZWNrIGlmIGxvY2sgd2FzIGRlbmllZCBmb3IgYW55IHByZXZpb3VzIHJlcXVlc3QKLSAgICBmb3IgKGF1dG8gaTogc3J2Yy0+ZGVuaWVkX2FwcGxpc3QpIHsKLSAgICAgIHRCVEFfQ1NJUF9SQ0IqIHJjYiA9IGJ0YV9jc2lwX2dldF9yY2IoaSk7Ci0gICAgICBpZiAocmNiICYmIHJjYi0+cF9jYmFjaykgewotICAgICAgICAgdEJUQV9MT0NLX0FWQUlMQUJMRSBwX2RhdGEgPSB7aSwgc3J2Yy0+c2V0X2lkLCBwX2NiLT5hZGRyfTsKLSAgICAgICAgKCpyY2ItPnBfY2JhY2spIChCVEFfQ1NJUF9MT0NLX0FWQUlMQUJMRV9FVlQsICh0QlRBX0NTSVBfREFUQSAqKSZwX2RhdGEpOwotICAgICAgfQotICAgIH0KLSAgICBzcnZjLT5kZW5pZWRfYXBwbGlzdC5jbGVhcigpOwotICB9Ci0gIC8qIE90aGVyIFNldCBDb29yZGluYXRvciBhY3F1aXJlZCB0aGUgbG9jayAqLwotICBlbHNlIGlmICh2YWx1ZSA9PSBMT0NLX1ZBTFVFICYmIHNydmMtPmxvY2sgPT0gVU5MT0NLX1ZBTFVFKSB7Ci0gICAgLy8gTm8gYWN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIHRha2VuCi0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2NzaXNfZGlzY19jb21wbGV0ZV9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5mb3JtYXMgQ1NJUyBzZXJ2aWNlIGRpc2NvdmVyeSBoYXMgYmVlbgotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgdG8gRE0gbGF5ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfY3Npc19kaXNjX2NvbXBsZXRlX2luZCAoUmF3QWRkcmVzcyYgYWRkcikgewotICAgdEJUQV9DU0lQX0RFVl9DQiogcF9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYShhZGRyKTsKLSAgIGlmIChwX2NiKSB7Ci0gICAgIHBfY2ItPnRvdGFsX2luc3RhbmNlX2Rpc2MrKzsKLSAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGlzY292ZXJlZCA9ICIgPDwgK3BfY2ItPnRvdGFsX2luc3RhbmNlX2Rpc2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgVG90YWwgPSAiIDw8ICtwX2NiLT5jc2lzX2luc3RhbmNlX2NvdW50OwotICAgICBpZiAocF9jYi0+dG90YWxfaW5zdGFuY2VfZGlzYyA9PSBwX2NiLT5jc2lzX2luc3RhbmNlX2NvdW50Ci0gICAgICAgICAmJiAhcF9jYi0+aXNfZGlzY19leHRlcm5hbCkgewotICAgICAgIGJ0YV9kbV9jc2lzX2Rpc2NfY29tcGxldGUoYWRkciwgdHJ1ZSk7Ci0gICAgICAgYnRhX2RtX2xlYV9kaXNjX2NvbXBsZXRlKGFkZHIpOwotICAgICB9Ci0gICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9naXZlX25ld19zZXRfZm91bmRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmUgbmV3IGNvb3JkaW5hdGUgc2V0IGZvdW5kIGNhbGxiYWNrIHRvIHVwcGVyIGxheWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX2dpdmVfbmV3X3NldF9mb3VuZF9jYiAodEJUQV9DU0lTX1NSVkNfSU5GTyAqc3J2YykgewotICAvKiBDaGVjayBpZiB0aGlzIHJlbW90ZSBjc2lzIGluc3RhbmNlIGlzIGluY2x1ZGVkIGluIGFub3RoZXIgc2VydmljZSAqLwotICBjb25zdCBzdGQ6OnZlY3RvcjxnYXR0OjpTZXJ2aWNlPiogc2VydmljZXMgPQotICAgICAgQlRBX0dBVFRDX0dldFNlcnZpY2VzKHNydmMtPmNvbm5faWQpOwotCi0gIGlmIChzZXJ2aWNlcykgewotICAgIGZvciAoY29uc3QgZ2F0dDo6U2VydmljZSYgc2VydmljZSA6ICpzZXJ2aWNlcykgewotICAgICAgaWYgKHNlcnZpY2UuaXNfcHJpbWFyeSkgewotICAgICAgICBmb3IgKGNvbnN0IGdhdHQ6OkluY2x1ZGVkU2VydmljZSAmaW5jbHVkZWRfc3J2YyA6IHNlcnZpY2UuaW5jbHVkZWRfc2VydmljZXMpIHsKLSAgICAgICAgICBpZiAoaW5jbHVkZWRfc3J2Yy51dWlkID09IENTSVNfU0VSVklDRV9VVUlECi0gICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlLmhhbmRsZSA9PSBzcnZjLT5zZXJ2aWNlX2hhbmRsZSkgewotICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNlcnZpY2UgVXVpZCBvZiBzZXJ2aWNlIGluY2x1ZGluZyBDU0lTIHNlcnZpY2UgOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2VydmljZS51dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICBzcnZjLT5pbmNsdWRpbmdfc3J2Y191dWlkID0gc2VydmljZS51dWlkOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEdpdmVuIE5ldyBTZXQgZm91bmQgY2FsbGJhY2sgdG8gdXBwZXIgbGF5ZXIKLSAgdEJUQV9DU0lQX05FV19TRVRfRk9VTkQgbmV3X3NldF9wYXJhbXM7Ci0gIG5ld19zZXRfcGFyYW1zLnNldF9pZCA9IHNydmMtPnNldF9pZDsKLSAgbWVtY3B5KG5ld19zZXRfcGFyYW1zLnNpcmssIHNydmMtPnNpcmssIFNJUktfU0laRSk7Ci0gIG5ld19zZXRfcGFyYW1zLnNpemUgPSBzcnZjLT5zaXplOwotICBuZXdfc2V0X3BhcmFtcy5pbmNsdWRpbmdfc3J2Y191dWlkID0gc3J2Yy0+aW5jbHVkaW5nX3NydmNfdXVpZDsKLSAgbmV3X3NldF9wYXJhbXMuYWRkciA9IHNydmMtPmJkX2FkZHI7Ci0gIG5ld19zZXRfcGFyYW1zLmxvY2tfc3VwcG9ydCA9IChzcnZjLT5sb2NrX2hhbmRsZSAhPSAwKT8gdHJ1ZSA6IGZhbHNlOwotCi0gICgqYnRhX2NzaXBfY2IucF9jYmFjaykoQlRBX0NTSVBfTkVXX1NFVF9GT1VORF9FVlQsICh0QlRBX0NTSVBfREFUQSAqKSZuZXdfc2V0X3BhcmFtcyk7Ci19Ci0KLWJvb2wgYnRhX2NzaXBfZGVjcnlwdF9zaXJrKHRCVEFfQ1NJU19TUlZDX0lORk8gKnNydmMsIHVpbnQ4X3QgKmVuY19zaXJrKSB7Ci0gIC8vIEdldCBLIGZyb20gTFRLIG9yIExpbmsgS2V5IGJhc2VkIG9uIHRyYW5zcG9ydAotICBPY3RldDE2IEsgPSB7fTsKLSAgdWludDhfdCBnYXR0X2lmLCB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfTEU7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyOwotICBHQVRUX0dldENvbm5lY3Rpb25JbmZvcihzcnZjLT5jb25uX2lkLCAmZ2F0dF9pZiwgYmRhZGRyLCAmdHJhbnNwb3J0KTsKLQotICBjaGFyIHNhbXBsZV9kYXRhX3Byb3BbNl07Ci0gIG9zaV9wcm9wZXJ0eV9nZXQoInZlbmRvci5idC5wdHMuc2FtcGxlX2NzaXNfZGF0YSIsIHNhbXBsZV9kYXRhX3Byb3AsICJmYWxzZSIpOwotCi0gIGlmICghc3RybmNtcCgidHJ1ZSIsIHNhbXBsZV9kYXRhX3Byb3AsIDQpKSB7IC8vIGNvbXBhcmluZyBwcm9wIHdpdGggInRydWUiCi0gICAgSyA9IHsweDY3LCAweDZlLCAweDFiLCAweDliLCAweGQ0LCAweDQ4LCAweDY5LCAweDZmLAotICAgICAgICAgMHgwNiwgMHgxZSwgMHhjNiwgMHgyMiwgMHgzYywgMHhlNSwgMHhjZSwgMHhkOX07Ci0gIH0gZWxzZSBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICBLID0gQlRNX1NlY0dldERldmljZUxpbmtLZXkoc3J2Yy0+YmRfYWRkcik7Ci0gIH0gZWxzZSBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIFJhd0FkZHJlc3MgcHNldWRvX2FkZHI7Ci0gICAgcHNldWRvX2FkZHIgPSBidGFfZ2V0X3BzZXVkb19hZGRyX3dpdGhfaWRfYWRkcihzcnZjLT5iZF9hZGRyKTsKLSAgICBPY3RldDE2IHJldl9LID0gQlRNX0JsZUdldExUSyhwc2V1ZG9fYWRkcik7Ci0gICAgc3RkOjpyZXZlcnNlX2NvcHkocmV2X0suYmVnaW4oKSwgcmV2X0suZW5kKCksIEsuYmVnaW4oKSk7Ci0gIH0KLQotICBpZihpc19rZXlfZW1wdHkoSykpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBJbnZhbGlkIEtleSByZWNlaXZlZCIsIF9fZnVuY19fKTsKLSAgICBzcnZjLT5kaXNjb3Zlcnlfc3RhdHVzID0gQlRBX0NTSVBfSU5WQUxJRF9LRVk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogY29tcHV0ZSBTQUxUICovCi0gIE9jdGV0MTYgc2FsdCA9IGJ0YV9jc2lwX2dldF9zYWx0KCk7Ci0KLSAgLy8gQ29tcHV0ZSBUCi0gIE9jdGV0MTYgVCA9IGJ0YV9jc2lwX2NvbXB1dGVfVChzYWx0LCBLKTsKLQotICAvLyBDb21wdXRlIGZpbmFsIHJlc3VsdCBrMQotICBPY3RldDE2IGsxID0gYnRhX2NzaXBfY29tcHV0ZV9rMShUKTsKLQotICAvLyBHZXQgZGVjcnlwdGVkIFNJUksKLSAgT2N0ZXQxNiByX2sxOwotICBzdGQ6OnJldmVyc2VfY29weShrMS5iZWdpbigpLCBrMS5lbmQoKSwgcl9rMS5iZWdpbigpKTsKLSAgYnRhX2NzaXBfZ2V0X2RlY3J5cHRlZF9zaXJrKHJfazEsIGVuY19zaXJrLCBzcnZjLT5zaXJrKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfc2lya19yZWFkX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsYmFjayByZWNlaXZlZCB3aGVuIHJlbW90ZSBkZXZpY2UgQ29vcmRpbmF0ZWQgU2V0cyBTSVJLCi0gKiAgICAgICAgICAgICAgICAgIGlzIHJlYWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3NpcmtfcmVhZF9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogU0lSSyBSZWFkIGZhaWxlZC4gY29ubl9pZCA9ICVkIHN0YXR1cyA9ICUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5faWQsIHN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9DU0lTX1NSVkNfSU5GTyAqc3J2YyA9ICh0QlRBX0NTSVNfU1JWQ19JTkZPICopZGF0YTsKLQotICB1aW50OF90IHR5cGUgPSAweEZGOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBTSVJLIGxlbiA9ICIgPDwgK2xlbjsKLQotICBpZiAobGVuICE9IChTSVJLX1NJWkUgKyAxKSkgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzIDogSW52YWxpZCBTSVJLIGxlbmd0aCIsIF9fZnVuY19fKTsKLSAgICBzcnZjLT5kaXNjb3Zlcnlfc3RhdHVzID0gQlRBX0NTSVBfSU5WQUxJRF9TSVJLX0ZPUk1BVDsKLSAgICBidGFfY3NpcF9jc2lzX2Rpc2NfY29tcGxldGVfaW5kKHNydmMtPmJkX2FkZHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOCh0eXBlLCB2YWx1ZSk7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIFR5cGUgRmllbGQgd2l0aCBTSVJLID0gJWQiLCBfX2Z1bmNfXywgdHlwZSk7Ci0gIGlmICh0eXBlICE9IEVOQ1JZUFRFRF9TSVJLICYmIHR5cGUgIT0gUExBSU5URVhUX1NJUkspIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlcyA6IEludmFsaWQgU0lSSyBUeXBlIiwgX19mdW5jX18pOwotICAgIHNydmMtPmRpc2NvdmVyeV9zdGF0dXMgPSBCVEFfQ1NJUF9JTlZBTElEX0tFWV9UWVBFOwotICAgIGJ0YV9jc2lwX2NzaXNfZGlzY19jb21wbGV0ZV9pbmQoc3J2Yy0+YmRfYWRkcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHR5cGUgPT0gRU5DUllQVEVEX1NJUkspIHsKLSAgICB1aW50OF90IGVuY19zaXJrW1NJUktfU0laRV0gPSB7fTsKLSAgICBTVFJFQU1fVE9fQVJSQVkoZW5jX3NpcmssIHZhbHVlLCBTSVJLX1NJWkUpOwotICAgIGlmICghYnRhX2NzaXBfZGVjcnlwdF9zaXJrKHNydmMsIGVuY19zaXJrKSkgewotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgOiBJbnZhbGlkIEVtcHR5IEtleSIsIF9fZnVuY19fKTsKLSAgICAgIHNydmMtPmRpc2NvdmVyeV9zdGF0dXMgPSBCVEFfQ1NJUF9JTlZBTElEX0tFWTsKLSAgICAgIGJ0YV9jc2lwX2NzaXNfZGlzY19jb21wbGV0ZV9pbmQoc3J2Yy0+YmRfYWRkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIFNUUkVBTV9UT19BUlJBWShzcnZjLT5zaXJrLCB2YWx1ZSwgU0lSS19TSVpFKTsKLSAgfQotICAvLyBjaGVjayBpZiB0aGlzIHNldCB3YXMgZm91bmQgZWFybGllcgotICB1aW50OF90IHNldF9pZCA9IGJ0YV9jc2lwX2ZpbmRfc2V0X2lkX2J5X3NpcmsgKHNydmMtPnNpcmspOwotICB0QlRBX0NTRVRfQ0IgKmNzZXRfY2IgPSBOVUxMOwotCi0gIC8qIE5ldyBDb29yZGluYXRlZCBTZXQgKi8KLSAgaWYgKHNldF9pZCA9PSBJTlZBTElEX1NFVF9JRCkgewotICAgIGNzZXRfY2IgPSBidGFfY3NpcF9nZXRfY3NldF9jYigpOwotICAgIGlmICghY3NldF9jYikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEluc3VmZmljaWVudCBzZXQgY29udHJvbCBibG9ja3MgYXZhaWxhYmxlLiI7Ci0gICAgICBzcnZjLT5kaXNjb3Zlcnlfc3RhdHVzID0gQlRBX0NTSVBfUlNSQ19FWEhBVVNURUQ7Ci0gICAgICBidGFfY3NpcF9jc2lzX2Rpc2NfY29tcGxldGVfaW5kKHNydmMtPmJkX2FkZHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtZW1jcHkoY3NldF9jYi0+c2lyaywgc3J2Yy0+c2lyaywgU0lSS19TSVpFKTsKLQotICAgIC8vIENyZWF0ZSBuZXcgY29vcmRpbmF0ZWQgc2V0IGFuZCB1cGRhdGUgaW4gZGF0YWJhc2UKLSAgICB0QlRBX0NTSVBfQ1NFVCBjc2V0ID0ge307Ci0gICAgY3NldC5zZXRfaWQgPSBjc2V0X2NiLT5zZXRfaWQ7Ci0gICAgY3NldC5zZXRfbWVtYmVycy5wdXNoX2JhY2soc3J2Yy0+YmRfYWRkcik7Ci0gICAgY3NldC50b3RhbF9kaXNjb3ZlcmVkKys7Ci0gICAgY3NldC5sb2NrX3N1cHBvcnQgPSAoc3J2Yy0+bG9ja19oYW5kbGUgIT0gMCA/IHRydWUgOiBmYWxzZSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJOZXcgU2V0LiBBZGRpbmcgZGV2aWNlICIgPDwgc3J2Yy0+YmRfYWRkci5Ub1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgU2V0IElEOiAiIDw8ICtjc2V0LnNldF9pZDsKLSAgICBidGFfY3NpcF9jYi5jc2V0cy5wdXNoX2JhY2soY3NldCk7Ci0KLSAgICAvLyBhc3NpZ24gc2V0IGlkIGluIHJlc3BlY3RpdmUgY29udHJvbCBibG9ja3MKLSAgICBzcnZjLT5zZXRfaWQgPSBjc2V0X2NiLT5zZXRfaWQ7Ci0KLSAgLyogRXhpc3RpbmcgY29vcmRpbmF0ZWQgU2V0ICovCi0gIH0gZWxzZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgRGV2aWNlIGZyb20gZXhpc3Rpbmcgc2V0IChzZXRfaWQ6ICIgPDwgK3NldF9pZCA8PCAiICkiOwotICAgIC8vYnRhX2NzaXBfY3Npc19kaXNjX2NvbXBsZXRlX2luZChzcnZjLT5iZF9hZGRyKTsKLSAgICBzcnZjLT5zZXRfaWQgPSBzZXRfaWQ7Ci0gICAgaWYgKCFidGFfY3NpcF91cGRhdGVfc2V0X21lbWJlcihzZXRfaWQsIHNydmMtPmJkX2FkZHIpKSB7Ci0gICAgICBzcnZjLT5kaXNjb3Zlcnlfc3RhdHVzID0gQlRBX0NTSVBfQUxMX01FTUJFUlNfRElTQ09WRVJFRDsKLSAgICAgIGJ0YV9jc2lwX2NzaXNfZGlzY19jb21wbGV0ZV9pbmQoc3J2Yy0+YmRfYWRkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gR2l2ZSBzZXQgbWVtYmVyIGZvdW5kIGNhbGxiYWNrCi0gICAgdEJUQV9TRVRfTUVNQkVSX0ZPVU5EIHNldF9tZW1iZXJfcGFyYW1zID0KLSAgICAgICAgeyAuc2V0X2lkID0gc2V0X2lkLAotICAgICAgICAgIC5hZGRyID0gc3J2Yy0+YmRfYWRkciwKLSAgICAgICAgfTsKLQotICAgIGJ0YV9jc2lwX2NiLnBfY2JhY2sgKEJUQV9DU0lQX1NFVF9NRU1CRVJfRk9VTkRfRVZULCAodEJUQV9DU0lQX0RBVEEgKikmc2V0X21lbWJlcl9wYXJhbXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIHNpemUgaXMgb3B0aW9uYWwsIGdpdmUgY2FsbGJhY2sgdG8gdXBwZXIgbGF5ZXIgKi8KLSAgaWYgKCFzcnZjLT5zaXplX2hhbmRsZSkgewotICAgIGJ0YV9jc2lwX2dpdmVfbmV3X3NldF9mb3VuZF9jYihzcnZjKTsKLSAgfQotCi0gIGlmICghc3J2Yy0+c2l6ZV9oYW5kbGUgJiYgIXNydmMtPnJhbmtfaGFuZGxlKSB7Ci0gICAgYnRhX2NzaXBfcHJlc2VydmVfY3NldChzcnZjKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3NpemVfcmVhZF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgcmVjZWl2ZWQgd2hlbiByZW1vdGUgZGV2aWNlIENvb3JkaW5hdGVkIFNldHMgU0laRQotICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYyBpcyByZWFkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9zaXplX3JlYWRfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLQotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBTSVpFIFJlYWQgZmFpbGVkLiBjb25uX2lkID0gJWQgc3RhdHVzID0gJTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29ubl9pZCwgc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0NTSVNfU1JWQ19JTkZPICpzcnZjID0gKHRCVEFfQ1NJU19TUlZDX0lORk8gKilkYXRhOwotCi0gIGlmIChzcnZjLT5kaXNjb3Zlcnlfc3RhdHVzICE9IEJUQV9DU0lQX0RJU0NfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBJZ25vcmUgcmVzcG9uc2UgKFJlYXNvbjogJWQpIiwgX19mdW5jX18sIHNydmMtPmRpc2NvdmVyeV9zdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNydmMtPnNpemUgPSAqdmFsdWU7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIHNpemUgPSAlZCIsIF9fZnVuY19fLCBzcnZjLT5zaXplKTsKLQotICB0QlRBX0NTSVBfQ1NFVCogY3NldCA9IGJ0YV9jc2lwX2dldF9vcl9jcmVhdGVfY3NldChzcnZjLT5zZXRfaWQsIHRydWUpOwotICBpZiAoY3NldCkgY3NldC0+c2l6ZSA9IHNydmMtPnNpemU7Ci0gIC8vIEdpdmUgY2FsbGJhY2sgb25seSB3aGVuIGl0cyBhIGZpcnN0IHNldCBtZW1iZXIKLSAgdWludDhfdCB0b3RhbERpc2NvdmVyZWQgPSBidGFfY3NpcF9nZXRfY29vcmRpbmF0ZWRfc2V0KHNydmMtPnNldF9pZCkuc2V0X21lbWJlcnMuc2l6ZSgpOwotICBpZiAodG90YWxEaXNjb3ZlcmVkID09IDEpIHsKLSAgICBidGFfY3NpcF9naXZlX25ld19zZXRfZm91bmRfY2Ioc3J2Yyk7Ci0gIH0KLQotICBpZiAoIXNydmMtPnJhbmtfaGFuZGxlKSB7Ci0gICAgYnRhX2NzaXBfcHJlc2VydmVfY3NldChzcnZjKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2xvY2tfcmVhZF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgcmVjZWl2ZWQgd2hlbiByZW1vdGUgZGV2aWNlIENvb3JkaW5hdGVkIFNldHMgTE9DSwotICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYyBpcyByZWFkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9sb2NrX3JlYWRfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogTE9DSyBSZWFkIGZhaWxlZC4gY29ubl9pZCA9ICVkIHN0YXR1cyA9ICUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbm5faWQsIHN0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgbG9jayB2YWx1ZSA9ICVkIiwgX19mdW5jX18sICp2YWx1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfcmFua19yZWFkX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsYmFjayByZWNlaXZlZCB3aGVuIHJlbW90ZSBkZXZpY2UgQ29vcmRpbmF0ZWQgU2V0cyBSQU5LCi0gKiAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljIGlzIHJlYWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX3JhbmtfcmVhZF9jYih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBSYW5rIFJlYWQgZmFpbGVkLiBjb25uX2lkID0gJWQgc3RhdHVzID0gJTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29ubl9pZCwgc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRBX0NTSVNfU1JWQ19JTkZPICpzcnZjID0gKHRCVEFfQ1NJU19TUlZDX0lORk8gKilkYXRhOwotICBpZiAoc3J2Yy0+ZGlzY292ZXJ5X3N0YXR1cyAhPSBCVEFfQ1NJUF9ESVNDX1NVQ0NFU1MpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIlczogSWdub3JlIHJlc3BvbnNlIChSZWFzb246ICVkKSIsIF9fZnVuY19fLCBzcnZjLT5kaXNjb3Zlcnlfc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcnZjLT5yYW5rID0gKnZhbHVlOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBkZXZpY2U6ICVzIFJhbmsgPSAlZCBzZXRfaWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgc3J2Yy0+YmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHNydmMtPnJhbmssIHNydmMtPnNldF9pZCk7Ci0KLSAgLy8gZ2V0IGNvb3JkaW5hdGVkIHNldCBjb250cm9sIGJsb2NrIGZyb20gc2V0X2lkCi0gIHRCVEFfQ1NFVF9DQiAqY3NldF9jYiA9IGJ0YV9jc2lwX2dldF9jc2V0X2NiX2J5X2lkKHNydmMtPnNldF9pZCk7Ci0gIGlmIChjc2V0X2NiKSB7Ci0gICAgY3NldF9jYi0+b3JkZXJlZF9tZW1iZXJzLmluc2VydCh7c3J2Yy0+cmFuaywgc3J2Yy0+YmRfYWRkcn0pOwotICB9Ci0KLSAgYnRhX2NzaXBfcHJlc2VydmVfY3NldChzcnZjKTsKLSAgYnRhX2NzaXBfY3Npc19kaXNjX2NvbXBsZXRlX2luZChzcnZjLT5iZF9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dhdHRfZGlzY19jbXBsX2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBBUElTIGlzIHVzZWQgdG8gc2VyYWNoIHByZXNlbmNlIG9mIGNzaXMgc2VydmljZSBvbgotICogICAgICAgICAgICAgICAgICByZW1vdGUgZGV2aWNlIGFuZCBpbml0aWFsaXplIENTSVMgaGFuZGxlcyBpbiBjc2lzIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9nYXR0X2Rpc2NfY21wbF9hY3QodEJUQV9DU0lQX0RJU0NfU0VUICpkaXNjX3BhcmFtcykgewotICB1aW50MTZfdCBjb25uX2lkID0gZGlzY19wYXJhbXMtPmNvbm5faWQ7Ci0gIHVpbnQ4X3Qgc3RhdHVzID0gZGlzY19wYXJhbXMtPnN0YXR1czsKLSAgUmF3QWRkcmVzcyBhZGRyID0gZGlzY19wYXJhbXMtPmFkZHI7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgY29ubl9pZCA9ICVkLCBzdGF0dXMgPSAlZCBhZGRyOiAlcyIsIF9fZnVuY19fLCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmIChzdGF0dXMpIHJldHVybjsKLQotICAvLyBGZXRjaCByZW1vdGUgZGV2aWNlIGdhdHQgc2VydmljZXMgZnJvbSBkYXRhYmFzZQotICBjb25zdCBzdGQ6OnZlY3RvcjxnYXR0OjpTZXJ2aWNlPiogc2VydmljZXMgPQotICAgICAgQlRBX0dBVFRDX0dldFNlcnZpY2VzKGNvbm5faWQpOwotCi0gIGlmICghc2VydmljZXMpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgTm8gU2VydmljZXMgZGlzY292ZXJlZC4iOwotICAgIGJ0YV9jc2lwX2NzaXNfZGlzY19jb21wbGV0ZV9pbmQoYWRkcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9DU0lQX0RFVl9DQiogZGV2X2NiID0gYnRhX2NzaXBfZmluZF9kZXZfY2JfYnlfYmRhKGFkZHIpOwotCi0gIGlmICghZGV2X2NiKSB7Ci0gICAgZGV2X2NiID0gYnRhX2NzaXBfY3JlYXRlX2Rldl9jYl9mb3JfYmRhKGFkZHIpOwotICB9Ci0KLSAgZGV2X2NiLT5jc2lzX2luc3RhbmNlX2NvdW50ID0gMDsKLQotICAvLyBTZWFyY2ggZm9yIENTSVMgc2VydmljZSBpbiB0aGUgZGF0YWJhc2UKLSAgZm9yIChjb25zdCBnYXR0OjpTZXJ2aWNlJiBzZXJ2aWNlIDogKnNlcnZpY2VzKSB7Ci0gICAgaWYgKHNlcnZpY2UudXVpZCA9PSBDU0lTX1NFUlZJQ0VfVVVJRCkgewotICAgICAgZGV2X2NiLT5jc2lzX2luc3RhbmNlX2NvdW50Kys7Ci0gICAgICAvLyBHZXQgc2VydmljZSBjb250cm9sIGJsb2NrIGZyb20gc2VydmljZSBoYW5kbGUgKHN1YnNlcXVlbnQgY29ubmVjdGlvbikKLSAgICAgIHRCVEFfQ1NJU19TUlZDX0lORk8gKnNydmMgPSBidGFfY3NpcF9nZXRfY3Npc19zZXJ2aWNlX2J5X2hhbmRsZShkZXZfY2IsIHNlcnZpY2UuaGFuZGxlKTsKLSAgICAgIGlmICghc3J2YykgewotICAgICAgICAvLyBjcmVhdGUgbmV3IHNlcnZpY2UgY2IgKGlmIGl0cyBhIGZpcnN0IHRpbWUgY29ubmVjdGlvbikKLSAgICAgICAgc3J2YyA9IGJ0YV9jc2lwX2dldF9jc2lzX3NlcnZpY2VfY2IoZGV2X2NiKTsKLSAgICAgICAgaWYgKCFzcnZjKSB7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXMgUmVzb3VyY2VzIG5vdCBhdmFpbGFibGUgZm9yIHN0b3JpbmcgQ1NJUyBTZXJ2aWNlLiIsIF9fZnVuY19fKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHNydmMtPmJkX2FkZHIgPSBhZGRyOwotICAgICAgc3J2Yy0+c2VydmljZV9oYW5kbGUgPSBzZXJ2aWNlLmhhbmRsZTsKLSAgICAgIHNydmMtPmNvbm5faWQgPSBjb25uX2lkOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IENTSVMgc2VydmljZSBmb3VuZCBVdWlkOiAlcyBzZXJ2aWNlX2hhbmRsZSA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UudXVpZC5Ub1N0cmluZygpLmNfc3RyKCksIHNydmMtPnNlcnZpY2VfaGFuZGxlKTsKLQotICAgICAgLy8gR2V0IENoYXJhY3RlcmlzdGljIGFuZCBDQ0NEIGhhbmRsZQotICAgICAgZm9yIChjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyYgY2hhcmFjIDogc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgICAgICBVdWlkIHV1aWQxID0gY2hhcmFjLnV1aWQ7Ci0gICAgICAgICAgaWYgKHV1aWQxID09IENTSVNfU0VSVklDRV9TSVJLX1VVSUQpIHsKLSAgICAgICAgICAgIHNydmMtPnNpcmtfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgICAgIHNydmMtPnNpcmtfY2NkX2hhbmRsZSA9IGJ0YV9jc2lwX2dldF9jY2NkX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHV1aWQxID09IENTSVNfU0VSVklDRV9TSVpFX1VVSUQpIHsKLSAgICAgICAgICAgIHNydmMtPnNpemVfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgICAgIHNydmMtPnNpemVfY2NkX2hhbmRsZSA9IGJ0YV9jc2lwX2dldF9jY2NkX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHV1aWQxID09IENTSVNfU0VSVklDRV9MT0NLX1VVSUQpIHsKLSAgICAgICAgICAgIHNydmMtPmxvY2tfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgICAgIHNydmMtPmxvY2tfY2NkX2hhbmRsZSA9IGJ0YV9jc2lwX2dldF9jY2NkX2hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHV1aWQxID09IENTSVNfU0VSVklDRV9SQU5LX1VVSUQpIHsKLSAgICAgICAgICAgIHNydmMtPnJhbmtfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNraXAgcmVhZGluZyBjaGFyYWN0ZXJpc3RpY3MgYW5kIFNldCBEaXNjb3ZlcnkgcHJvY2VkdXJlIGlmIGl0IHdhcyBkb25lIGVhcmxpZXIgKi8KLSAgICAgIGlmIChzcnZjLT5zZXRfaWQgPj0gMCAmJiBzcnZjLT5zZXRfaWQgPCBCVEFfTUFYX1NVUFBPUlRFRF9TRVRTKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENvb3JkaW5hdGVkIHNldCBkaXNjb3ZlcnkgcHJvY2VkdXJlIGFscmVhZHkgY29tcGxldGVkLiI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoc3J2Yy0+c2lya19oYW5kbGUpIHsKLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjb25uX2lkLCBzcnZjLT5zaXJrX2hhbmRsZSwgYnRhX3NpcmtfcmVhZF9jYiwgc3J2Yyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzcnZjLT5zaXplX2hhbmRsZSkgewotICAgICAgICBCdGFHYXR0UXVldWU6OlJlYWRDaGFyYWN0ZXJpc3RpYygKLSAgICAgICAgICAgIGNvbm5faWQsIHNydmMtPnNpemVfaGFuZGxlLCBidGFfc2l6ZV9yZWFkX2NiLCBzcnZjKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHNydmMtPmxvY2tfaGFuZGxlKSB7Ci0gICAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKAotICAgICAgICAgICAgY29ubl9pZCwgc3J2Yy0+bG9ja19oYW5kbGUsIGJ0YV9sb2NrX3JlYWRfY2IsIHNydmMpOwotICAgICAgfQotCi0gICAgICBpZiAoc3J2Yy0+cmFua19oYW5kbGUpIHsKLSAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgICBjb25uX2lkLCBzcnZjLT5yYW5rX2hhbmRsZSwgYnRhX3JhbmtfcmVhZF9jYiwgc3J2Yyk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF9hcGkuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2NzaXAvYnRhX2NzaXBfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2E5MDU0Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ1NJUCBBUEkgaW4gdGhlIHN1YnN5c3RlbSBvZiBCVEEuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfY3NpcCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvYmluZF9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGFfY3NpcF9hcGkuaCIKLSNpbmNsdWRlICJidGFfY3NpcF9pbnQuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IHRCVEFfU1lTX1JFRyBidGFfY3NpcF9yZWcgPSB7YnRhX2NzaXBfaGRsX2V2ZW50LCBCVEFfQ3NpcERpc2FibGV9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfUmVnaXN0ZXJDc2lwQXBwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3RlciBhcHBsaWNhdGlvbiBvciBtb2R1bGUgdG8KLSAqICAgICAgICAgICAgICAgICAgdG8gcmVnaXN0ZXIgd2l0aCBDU0lQIGZvciB1c2luZyBDU0lQIGZ1bmN0aW9uYWxpdGllcy4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfY3NpcF9jYjogY2FsbGJhY2sgdG8gYmUgcmVjZWl2ZWQgaW4gcmVnaXN0ZXJpbmcgYXBwIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBDU0lQIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuCi0gKiAgICAgICAgICAgICAgICAgIHJlZ19jYiAgIDogY2FsbGJhY2sgd2hlbiBhcHAvbW9kdWxlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDU0lQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9SZWdpc3RlckNzaXBBcHAodEJUQV9DU0lQX0NCQUNLKiBwX2NzaXBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdGFDc2lwQXBwUmVnaXN0ZXJlZENiIHJlZ19jYikgewotICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2NzaXBfYXBwX3JlZ2lzdGVyLCBVdWlkOjpHZXRSYW5kb20oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc2lwX2NiLCBzdGQ6Om1vdmUocmVnX2NiKSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfVW5yZWdpc3RlckNzaXBBcHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHVucmVnaXN0ZXIgYXBwbGljYXRpb24gb3IgbW9kdWxlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYXBwX2lkOiBpZCBvZiB0aGUgYXBwL21vZHVsZSB0aGF0IG5lZWRzIHRvIGJlIHVucmVnaXN0ZXJlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEJUQV9VbnJlZ2lzdGVyQ3NpcEFwcCh1aW50OF90IGFwcF9pZCkgewotICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRhX2NzaXBfYXBwX3VucmVnaXN0ZXIsIGFwcF9pZCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcFNldExvY2tWYWx1ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVxdWVzdCBvciByZWxlYXNlIGxvY2sgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBjb29yZGluYXRlZCBzZXQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBsb2NrX3BhcmFtOiBwYXJhbWV0ZXJzIHRvIGFjcXVpcmUgb3IgcmVsZWFzZSBsb2NrLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRBX1NFVF9MT0NLX1BBUkFNUykuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0NzaXBTZXRMb2NrVmFsdWUodEJUQV9TRVRfTE9DS19QQVJBTVMgbG9ja19wYXJhbXMpIHsKLSAgdEJUQV9DU0lQX0xPQ0tfUEFSQU1TKiBwX2J1ZiA9Ci0gICAgICAodEJUQV9DU0lQX0xPQ0tfUEFSQU1TKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0NTSVBfTE9DS19QQVJBTVMpKTsKLQotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0NTSVBfU0VUX0xPQ0tfVkFMVUVfRVZUOwotICBwX2J1Zi0+bG9ja19yZXEgPSBsb2NrX3BhcmFtczsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmZXRjaCBkZXRhaWxzIG9mIHRoZSBjb29yZGluYXRlZCBzZXQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBzZXRfaWQ6IGlkZW50aWZpZXIgb2YgdGhlIGNvb3JkaW5hdGVkIHNldCB3aG9zZSBkZXRhaWxzIGFyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGJlIGZldGNoZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0QlRBX0NTSVBfQ1NFVCAoY29udGFpbmluZyBkZXRhaWxzIG9mIGNvb3JkaW5hdGVkIHNldCkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQ1NJUF9DU0VUIEJUQV9Dc2lwR2V0Q29vcmRpbmF0ZWRTZXQodWludDhfdCBzZXRfaWQpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHNldF9pZCA9ICVkIiwgX19mdW5jX18sIHNldF9pZCk7Ci0gIHJldHVybiBidGFfY3NpcF9nZXRfY29vcmRpbmF0ZWRfc2V0KHNldF9pZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9Dc2lwU2V0TG9ja1ZhbHVlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXF1ZXN0IG9yIHJlbGVhc2UgbG9jayBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVkIHNldC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2ZWN0b3I8dEJUSUZfQ1NJUF9DU0VUPjogKGFsbCBkaXNjb3ZlcmVkIGNvb3JkaW5hdGVkIHNldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RkOjp2ZWN0b3I8dEJUQV9DU0lQX0NTRVQ+IEJUQV9Dc2lwR2V0RGlzY292ZXJlZFNldHMoKSB7Ci0gIHJldHVybiBidGFfY3NpcF9jYi5jc2V0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0NzaXBDb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlc3RhYmxpc2ggR0FUVCBDb25uZWN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciA6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Dc2lwQ29ubmVjdCAodWludDhfdCBhcHBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUQV9DU0lQX0FQSV9DT05OKiBwX2J1ZiA9Ci0gICAgKHRCVEFfQ1NJUF9BUElfQ09OTiopb3NpX2NhbGxvYyhzaXplb2YodEJUQV9DU0lQX0FQSV9DT05OKSk7Ci0gIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQ1NJUF9BUElfT1BFTl9FVlQ7Ci0gIHBfYnVmLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgcF9idWYtPmFwcF9pZCA9IGFwcF9pZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcENvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVzdGFibGlzaCBHQVRUIENvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyIDogQWRkcmVzcyBvZiB0aGUgcmVtb3RlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRBX0NzaXBEaXNjb25uZWN0ICh1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRBX0NTSVBfQVBJX0NPTk4qIHBfYnVmID0KLSAgICAodEJUQV9DU0lQX0FQSV9DT05OKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0NTSVBfQVBJX0NPTk4pKTsKLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9DU0lQX0FQSV9DTE9TRV9FVlQ7Ci0gIHBfYnVmLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgcF9idWYtPmFwcF9pZCA9IGFwcF9pZDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcEZpbmRDc2lzSW5zdGFuY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZpbmQgcHJlc2VuY2Ugb2YgQ1NJUyBzZXJ2aWNlIG9uCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb29uX2lkIDogQ29ubmVjdGlvbiBJRCBvZiB0aGUgR0FUVCBDb25uZWN0aW9uIGF0IERNIExheWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQ3NpcEZpbmRDc2lzSW5zdGFuY2UodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgIiwgX19mdW5jX18pOwotCi0gIHRCVEFfQ1NJUF9ESVNDX1NFVCogcF9idWYgPQotICAgICh0QlRBX0NTSVBfRElTQ19TRVQqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfQ1NJUF9ESVNDX1NFVCkpOwotICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0NTSVBfRElTQ19DTVBMX0VWVDsKLSAgcF9idWYtPmNvbm5faWQgPSBjb25uX2lkOwotICBwX2J1Zi0+c3RhdHVzID0gc3RhdHVzOwotICBwX2J1Zi0+YWRkciA9IGJkX2FkZHI7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0NzaXBJbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgdG8gaW5pdGlhbGl6ZSBDU0lQIGluIEJUQSBsYXllci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Dc2lwRW5hYmxlKHRCVEFfQ1NJUF9DQkFDSyAqcF9jYmFjaykgewotICB0QlRBX0NTSVBfRU5BQkxFKiBwX2J1ZiA9Ci0gICAgKHRCVEFfQ1NJUF9FTkFCTEUqKW9zaV9jYWxsb2Moc2l6ZW9mKHRCVEFfQ1NJUF9FTkFCTEUpKTsKLQotICAvKiByZWdpc3RlciB3aXRoIEJUQSBzeXN0ZW0gbWFuYWdlciAqLwotICBidGFfc3lzX3JlZ2lzdGVyKEJUQV9JRF9HUk9VUCwgJmJ0YV9jc2lwX3JlZyk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9DU0lQX0FQSV9FTkFCTEVfRVZUOwotICBwX2J1Zi0+cF9jYmFjayA9IHBfY2JhY2s7Ci0KLSAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0NzaXBEaXNhYmxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZGVpbml0aWFsaXphdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Dc2lwRGlzYWJsZSgpIHsKLSAgdEJUQV9DU0lQX0VOQUJMRSogcF9idWYgPQotICAgICh0QlRBX0NTSVBfRU5BQkxFKilvc2lfY2FsbG9jKHNpemVvZih0QlRBX0NTSVBfRU5BQkxFKSk7Ci0KLSAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9DU0lQX0FQSV9ESVNBQkxFX0VWVDsKLQotICBidGFfc3lzX3NlbmRtc2cocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcFJlbW92ZVVucGFpcmVkU2V0TWVtYmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZ2l2ZW4gc2V0IG1lbWJlciBpcyB1bnBhaXJlZC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGFkZHI6IEJEIEFkZHJlc3Mgb2YgdGhlIHNldCBtZW1iZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUQV9Dc2lwUmVtb3ZlVW5wYWlyZWRTZXRNZW1iZXIoUmF3QWRkcmVzcyBhZGRyKSB7Ci0gIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZidGFfY3NpcF9yZW1vdmVfc2V0X21lbWJlciwgYWRkcikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcEdldERldmljZVNldElkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIEFQSSBpcyB1c2VkIHRvIGdldCBzZXQgaWQgb2YgdGhlIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBhZGRyOiBCRCBBZGRyZXNzIG9mIHRoZSBzZXQgbWVtYmVyLgotICogICAgICAgICAgICAgICAgICB1dWlkOiBVVUlEIG9mIHRoZSBzZXJ2aWNlIHdoaWNoIGluY2x1ZGVzIENTSVMgc2VydmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQlRBX0NzaXBHZXREZXZpY2VTZXRJZChSYXdBZGRyZXNzIGFkZHIsIGJsdWV0b290aDo6VXVpZCB1dWlkKSB7Ci0gIGZvciAodEJUQV9DU0lQX0NTRVQgY3NldDogYnRhX2NzaXBfY2IuY3NldHMpIHsKLSAgICBmb3IgKFJhd0FkZHJlc3MgYmRfYWRkcjogY3NldC5zZXRfbWVtYmVycykgewotICAgICAgaWYgKGJkX2FkZHIgPT0gYWRkciAmJiAoY3NldC5wX3NydmNfdXVpZCA9PSB1dWlkKSkgewotICAgICAgICByZXR1cm4gY3NldC5zZXRfaWQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEJUQV9NQVhfU1VQUE9SVEVEX1NFVFM7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2NzaXAvYnRhX2NzaXBfaW50LmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2NzaXAvYnRhX2NzaXBfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDBiYmYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9jc2lwL2J0YV9jc2lwX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgQlRBIENTSVAgQ2xpZW50IGludGVybmFsIGRlZmluaXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVEFfQ1NJUF9JTlRfSAotI2RlZmluZSBCVEFfQ1NJUF9JTlRfSAotCi0jaW5jbHVkZSAiYnRhX2NzaXBfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX3N5cy5oIgotI2luY2x1ZGUgImJ0bV9ibGVfYXBpX3R5cGVzLmgiCi0KLS8qIE1heCBDU0lQIHN1cHBvcnRlZCBkZXZpY2VzIChjb250cm9sIGJsb2NrcykgKi8KLSNkZWZpbmUgQlRBX0NTSVBfTUFYX0RFVklDRSAzMgotCi0vKiBNYXggQ1NJUCBzdXBwb3J0ZWQgY29vcmRpbmF0ZWQgc2V0cyAqLwotI2RlZmluZSBCVEFfTUFYX1NVUFBPUlRFRF9TRVRTIDE2Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGFwcHMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIENTSVAqLwotI2RlZmluZSBCVEFfQ1NJUF9NQVhfU1VQUE9SVEVEX0FQUFMgMTYKLQotLyogTWF4IFN1cHBvcnRlZCBjb29yZGluYXRlZCBzZXRzIHBlciBkZXZpY2UqLwotI2RlZmluZSBNQVhfU1VQUE9SVEVEX1NFVFNfUEVSX0RFVklDRSA1Ci0KLS8qIFN0YXR1cyBvZiB0aGUgQ1NJUyBEaXNjb3ZlcnkqLwotI2RlZmluZSBCVEFfQ1NJUF9ESVNDX1NVQ0NFU1MgMAotI2RlZmluZSBCVEFfQ1NJUF9JTlZBTElEX1NJUktfRk9STUFUIDEKLSNkZWZpbmUgQlRBX0NTSVBfSU5WQUxJRF9LRVkgMgotI2RlZmluZSBCVEFfQ1NJUF9JTlZBTElEX0tFWV9UWVBFIDMKLSNkZWZpbmUgQlRBX0NTSVBfQUxMX01FTUJFUlNfRElTQ09WRVJFRCA0Ci0jZGVmaW5lIEJUQV9DU0lQX1JTUkNfRVhIQVVTVEVEIDUKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKiBzdGF0ZSBtYWNoaW5lIGV2ZW50cywgdGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lICovCi1lbnVtIHsKLSAgQlRBX0NTSVBfQVBJX09QRU5fRVZUID0gQlRBX1NZU19FVlRfU1RBUlQoQlRBX0lEX0dST1VQKSwKLSAgQlRBX0NTSVBfQVBJX0NMT1NFX0VWVCwKLSAgQlRBX0NTSVBfR0FUVF9PUEVOX0VWVCwKLSAgQlRBX0NTSVBfR0FUVF9DTE9TRV9FVlQsCi0gIEJUQV9DU0lQX09QRU5fRkFJTF9FVlQsCi0gIEJUQV9DU0lQX09QRU5fQ01QTF9FVlQsCi0gIEJUQV9DU0lQX1NUQVJUX0VOQ19FVlQsCi0gIEJUQV9DU0lQX0VOQ19DTVBMX0VWVCwKLSAgQlRBX0NTSVBfR0FUVF9FTkNfQ01QTF9FVlQsCi0KLSAgLyogY29tbW9uIGV2ZW50czogbm90IGhhbmRsZWQgYnkgZXhlY3V0ZSBzdGF0ZSBtYWNoaW5lICovCi0gIEJUQV9DU0lQX0FQSV9FTkFCTEVfRVZULAotICBCVEFfQ1NJUF9BUElfRElTQUJMRV9FVlQsCi0gIEJUQV9DU0lQX0RJU0NfQ01QTF9FVlQsCi0gIEJUQV9DU0lQX1NFVF9MT0NLX1ZBTFVFX0VWVCwKLX07Ci0KLS8qIENTSVAgZGV2aWNlIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCi1lbnVtIHsKLSAgQlRBX0NTSVBfSURMRV9TVCwKLSAgQlRBX0NTSVBfVzRfQ09OTl9TVCwKLSAgQlRBX0NTSVBfVzRfU0VDLAotICBCVEFfQ1NJUF9DT05OX1NULAotICBCVEFfQ1NJUF9ESVNDT05ORUNUSU5HX1NULAotfTsKLQotdHlwZWRlZiB1aW50OF90IHRCVEFfQ1NJUF9TVEFURTsKLQotCi0vKiBDU0lQIENvbW1hbmQgcmVxdWVzdCBwYXJhbWV0ZXJzIGluIEJUQSAqLwotCi0vKiBGaW5kIENvb3JkaW5hdGVkIHNldCBwYXJhbWV0ZXJzKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSIGhkcjsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgUmF3QWRkcmVzcyBhZGRyOwotfSB0QlRBX0NTSVBfRElTQ19TRVQ7Ci0KLS8qIENvbm5lY3Rpb24gUmVxdWVzdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUiBoZHI7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdWludDhfdCBhcHBfaWQ7Ci19IHRCVEFfQ1NJUF9BUElfQ09OTjsKLQotLyogTG9jayByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSIGhkcjsKLSAgdEJUQV9TRVRfTE9DS19QQVJBTVMgbG9ja19yZXE7Ci19IHRCVEFfQ1NJUF9MT0NLX1BBUkFNUzsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUiBoZHI7Ci0gIHRCVEFfQ1NJUF9DQkFDSyogcF9jc2lwX2NiOwotICB0QlRBX0NTSVBfQ0xUX1JFR19DQiogcmVnX2NiOwotfSB0QlRBX0NTSVBfQVBQX1JFR19QQVJBTVM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSIGhkcjsKLSAgdEJUQV9DU0lQX0NCQUNLICpwX2NiYWNrOwotfSB0QlRBX0NTSVBfRU5BQkxFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJUX0hEUiBoZHI7Ci19IHRCVEFfQ1NJUF9DTUQ7Ci0KLXR5cGVkZWYgdW5pb24gewotICBCVF9IRFIgaGRyOwotICB0QlRBX0NTSVBfQVBJX0NPTk4gY29ubl9wYXJhbTsKLSAgdEJUQV9DU0lQX0xPQ0tfUEFSQU1TIGxvY2tfcmVxOwotICB0QlRBX0NTSVBfQVBQX1JFR19QQVJBTVMgcmVnX3BhcmFtOwotICB0QlRBX0NTSVBfRU5BQkxFIGVuYWJsZV9wYXJhbTsKLSAgdEJUQV9HQVRUQ19PUEVOIGdhdHRfb3Blbl9wYXJhbTsKLSAgdEJUQV9HQVRUQ19DTE9TRSBnYXR0X2Nsb3NlX3BhcmFtOwotICB0QlRBX0NTSVBfQ01EIGNtZDsKLX0gdEJUQV9DU0lQX1JFUV9EQVRBOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaW5fdXNlOwotICB1aW50OF90IHNldF9pZCA9IEJUQV9NQVhfU1VQUE9SVEVEX1NFVFM7Ci0gIHVpbnQxNl90IGNvbm5faWQ7ICAgLyogR0FUVCBjb25uX2lkIHVzZWQgZm9yIHNlcnZpY2UgZGlzY292ZXJ5ICovCi0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLQotICB1aW50MTZfdCBzZXJ2aWNlX2hhbmRsZTsgIC8qIEhhbmRsZSBvZiB0aGlzIENTSVMgc2VydmljZSAqLwotICB1aW50MTZfdCBzaXJrX2hhbmRsZTsgICAgIC8qIFNJUksgY2hhcmFjdGVyaXN0aWMgdmFsdWUgaGFuZGxlICovCi0gIHVpbnQxNl90IHNpemVfaGFuZGxlOyAgICAgLyogc2l6ZSBjaGFyYWN0ZXJpc3RpYyB2YWx1ZSBoYW5kbGUgKi8KLSAgdWludDE2X3QgbG9ja19oYW5kbGU7ICAgICAvKiBsb2NrIGNoYXJhY3RlcmlzdGljIHZhbHVlIGhhbmRsZSAqLwotICB1aW50MTZfdCByYW5rX2hhbmRsZTsgICAgIC8qIHJhbmsgY2hhcmFjdGVyaXN0aWMgdmFsdWUgaGFuZGxlICovCi0KLSAgdWludDE2X3Qgc2lya19jY2RfaGFuZGxlOyAvKiBTSVJLIENDQ0QgaGFuZGxlKi8KLSAgdWludDE2X3Qgc2l6ZV9jY2RfaGFuZGxlOyAvKiBzaXplIENDQ0QgaGFuZGxlICovCi0gIHVpbnQxNl90IGxvY2tfY2NkX2hhbmRsZTsgLyogbG9jayBDQ0NEIGhhbmRsZSAqLwotCi0gIHVpbnQ4X3Qgc2lya1tTSVJLX1NJWkVdOyAgLyogQ29vcmRpbmF0ZWQgc2V0IFNJUksgKi8KLSAgdWludDhfdCBzaXplOyAgICAgICAgICAgICAvKiBzaXplIG9mIHRoZSBjb29yZGluYXRlZCBzZXQgKi8KLSAgdWludDhfdCBsb2NrOyAgICAgICAgICAgICAvKiBsb2NrIHN0YXR1cyBvZiB0aGUgc2V0IG1lbWJlciAqLwotICB1aW50OF90IHJhbms7ICAgICAgICAgICAgIC8qIHJhbmsgb2YgdGhlIHNldCBtZW1iZXIqLwotICB1aW50OF90IGRpc2NvdmVyeV9zdGF0dXMgPSBCVEFfQ1NJUF9ESVNDX1NVQ0NFU1M7IC8qIHN0YXR1cyBvZiB0aGUgQ1NJUyBkaXNjb3ZlcnkqLwotICBibHVldG9vdGg6OlV1aWQgaW5jbHVkaW5nX3NydmNfdXVpZDsgLyogdXVpZCBvZiB0aGUgc2VydmljZSB3aGljaCBpbmNsdWRlcyBDU0lTKi8KLQotICAvKiBMb2NrIG1hbWFuZ2VtZW50IGRldGFpbHMqLwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsb2NrX2FwcGxpc3Q7ICAgIC8qIEFwcHMgdGhvc2UgaGF2ZSBsb2NrZWQgdGhpcyBzZXQgKi8KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdW5yc3BfYXBwbGlzdDsgICAvKiBBcHBzIHRvIHdoaWNoIHVucmVzcG9uc2l2ZSByZXMgaXMgc2VudCAqLwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZW5pZWRfYXBwbGlzdDsgIC8qIEFwcHMgdG8gd2hpY2ggbG9jayB3YXMgZGVuaWVkICovCi19IHRCVEFfQ1NJU19TUlZDX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpbl91c2U7Ci0gIFJhd0FkZHJlc3MgYWRkcjsgICAgICAgICAgICAgICAgICAvKiBSZW1vdGUgZGV2aWNlIGFkZHJlc3MgKi8KLSAgdWludDE2X3QgY29ubl9pZDsgICAgICAgICAgICAgICAgIC8qIEdBVFQgQ29ubmVjdGlvbiBJRCAqLwotICB1aW50OF90IHNlY19tYXNrID0gKEJUTV9TRUNfSU5fRU5DUllQVCB8IEJUTV9TRUNfT1VUX0VOQ1JZUFQpOyAvKiBTZWN1cml0eSBNYXNrIGZvciBDU0lQKi8KLSAgYm9vbCBzZWN1cml0eV9wZW5kaW5nOwotICBib29sIGlzX2Rpc2NfZXh0ZXJuYWwgPSBmYWxzZTsgICAgLyogaWYgZGlzY292ZXJ5IGlzIHN0YXJ0ZWQgYnkgZXh0ZXJuYWwgQXBwKi8KLSAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5lY3Rpb24gc3RhdGUgKi8KLSAgdWludDhfdCBjc2lzX2luc3RhbmNlX2NvdW50OyAgICAgIC8qIG51bWJlciBvZiBDU0lTIGluc3RhbmNlcyBvbiByZW1vdGUgZGV2aWNlICovCi0gIHVpbnQ4X3QgdG90YWxfaW5zdGFuY2VfZGlzYzsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgaW5zdGFuY2VzIGRpc2NvdmVyZWQgKi8KLQotICAvKiBDU0lTIHNlcnZpY2VzIGZvdW5kIG9uIHJlbW90ZSBkZXZpY2UqLwotICB0QlRBX0NTSVNfU1JWQ19JTkZPIGNzaXNfc3J2Y1tNQVhfU1VQUE9SVEVEX1NFVFNfUEVSX0RFVklDRV07Ci0KLSAgLy8gbGlzdCBvZiBhcHBsaWNhdGlvbnMgd2hpY2ggaW5pdGlhdGVkIENTSVAgY29ubmVjdCBmb3IgdGhpcyBkZXZpY2UKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29ubl9hcHBsaXN0OyAvKiBMaXN0IG9mIEFwcHMgdGhhdCBzZW50IGNvbm5lY3Rpb24gcmVxdWVzdCovCi0gIHN0ZDo6c3RyaW5nIHNldF9pbmZvID0gIiI7Ci0gIGJvb2wgdW5yZXNwb25zaXZlOyAgICAgICAgICAgICAgICAgLyogaWYgcmVtb3RlIGlzIHVucmVzcG9uc2l2ZSB0byBHQVRUIHJlcXVlc3QgKi8KLX0gdEJUQV9DU0lQX0RFVl9DQjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGFwcF9pZDsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3QgdmFsdWU7Ci0gIGludDhfdCBjdXJfaWR4OwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBtZW1iZXJzX2FkZHI7Ci19IHRCVEFfTE9DS19SRVFVRVNUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaW5fdXNlOwotICB1aW50OF90IHNldF9pZCA9IEJUQV9NQVhfU1VQUE9SVEVEX1NFVFM7Ci0gIHVpbnQ4X3Qgc2lya1tTSVJLX1NJWkVdOwotICB1aW50MTZfdCBzZXRfbWVtYmVyX3RvdXQgPSA1MDA7Ci0gIGJvb2wgcmVxdWVzdF9pbl9wcm9ncmVzczsKLSAgdEJUQV9DU0lQX0RFVl9DQiogY3VyX2Rldl9jYjsKLSAgYWxhcm1fdCogdW5yZXNwX3RpbWVyOwotICB0QlRBX0xPQ0tfUkVRVUVTVCBjdXJfbG9ja19yZXE7Ci0gIHRCVEFfTE9DS19TVEFUVVNfQ0hBTkdFRCBjdXJfbG9ja19yZXM7Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QsIFJhd0FkZHJlc3M+IG9yZGVyZWRfbWVtYmVyczsKLSAgc3RkOjpxdWV1ZTx0QlRBX1NFVF9MT0NLX1BBUkFNUz4gbG9ja19yZXFfcXVldWU7Ci19IHRCVEFfQ1NFVF9DQjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGFwcF9pZDsKLSAgYm9vbCBpbl91c2U7Ci0gIHRCVEFfQ1NJUF9DQkFDSyogcF9jYmFjazsKLX0gdEJUQV9DU0lQX1JDQjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9JRiBnYXR0X2lmOwotICB0QlRBX0NTSVBfQ0JBQ0sqIHBfY2JhY2s7ICAgICAgICAgICAgICAgIC8qIGNhbGxiYWNrcyBmb3IgYnRpZiBsYXllciAqLwotICBzdGQ6OnZlY3Rvcjx0QlRBX0NTSVBfREVWX0NCPiBkZXZfY2I7ICAgIC8qIGRldmljZSBjb250cm9sIGJsb2NrICovCi0gIHRCVEFfQ1NJUF9SQ0IgYXBwX3JjYltCVEFfQ1NJUF9NQVhfU1VQUE9SVEVEX0FQUFNdOwotICBzdGQ6OnZlY3Rvcjx0QlRBX0NTSVBfQ1NFVD4gY3NldHM7Ci0gIHRCVEFfQ1NFVF9DQiBjc2V0c19jYltCVEFfTUFYX1NVUFBPUlRFRF9TRVRTXTsKLX0gdEJUQV9DU0lQX0NCOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENTSVAgY29udHJvbCBibG9jayAqLwotZXh0ZXJuIHRCVEFfQ1NJUF9DQiBidGFfY3NpcF9jYjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb24gcHJvdG90eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX3NtX2V4ZWN1dGUodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdWludDE2X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpOwotCi0KLS8vYWN0aW9uIGFwaSdzCi1leHRlcm4gYm9vbCBidGFfY3NpcF9oZGxfZXZlbnQoQlRfSERSKiBwX21zZyk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9hcGlfZW5hYmxlKHRCVEFfQ1NJUF9DQkFDSyAqcF9jYmFjayk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9hcGlfZGlzYWJsZSgpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfYXBwX3JlZ2lzdGVyIChjb25zdCBVdWlkJiBhcHBfdXVpZCwgdEJUQV9DU0lQX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdGFDc2lwQXBwUmVnaXN0ZXJlZENiIGNiKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX2dhdHRjX3JlZ2lzdGVyKCk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9hcHBfdW5yZWdpc3Rlcih1aW50OF90IGFwcF9pZCk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9nYXR0X2Rpc2NfY21wbF9hY3QodEJUQV9DU0lQX0RJU0NfU0VUICpkaXNjX3BhcmFtcyk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9hcGlfb3Blbl9hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX2FwaV9jbG9zZV9hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX2dhdHRfb3Blbl9hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX2dhdHRfY2xvc2VfYWN0ICh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLCB0QlRBX0NTSVBfUkVRX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9nYXR0X29wZW5fZmFpbF9hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX29wZW5fY21wbF9hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3N0YXJ0X3NlY19hY3QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3NlY19jbXBsX2FjdCAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdEJUQV9DU0lQX1JFUV9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfY2xvc2VfY3NpcF9jb25uICh0QlRBX0NTSVBfREVWX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3Byb2Nlc3Nfc2V0X2xvY2tfYWN0KHRCVEFfU0VUX0xPQ0tfUEFSQU1TIGxvY2tfcmVxKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3NlbmRfbG9ja19yZXFfYWN0KHRCVEFfQ1NFVF9DQiogY3NldF9jYik7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9oYW5kbGVfbG9ja19kZW5pYWwodEJUQV9DU0VUX0NCKiBjc2V0X2NiKTsKLWV4dGVybiBib29sIGJ0YV9jc2lwX3ZhbGlkYXRlX3JlcV9mb3JfZGVuaWVkX3NtICh0QlRBX0NTRVRfQ0IqIGNzZXRfY2IpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfZm9ybV9sb2NrX3JlcXVlc3QodEJUQV9TRVRfTE9DS19QQVJBTVMgbG9ja19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9DU0VUX0NCKiBjc2V0X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3NlbmRfdW5sb2NrX3JlcV9hY3QodEJUQV9DU0VUX0NCKiBjc2V0X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3NldF9tZW1iZXJfbG9ja190aW1lb3V0KHZvaWQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9sb2FkX2Nvb3JkaW5hdGVkX3NldHNfZnJvbV9zdG9yYWdlKCk7Ci0KLS8vIGJ0YV9jc2lwX3V0aWxzCi1leHRlcm4gdEJUQV9DU0lQX0RFVl9DQiogYnRhX2NzaXBfZmluZF9kZXZfY2JfYnlfYmRhKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci1leHRlcm4gdEJUQV9DU0lQX0RFVl9DQiogYnRhX2NzaXBfZ2V0X2Rldl9jYl9ieV9jaWQodWludDE2X3QgY29ubl9pZCk7Ci1leHRlcm4gdEJUQV9DU0lQX0RFVl9DQiogYnRhX2NzaXBfY3JlYXRlX2Rldl9jYl9mb3JfYmRhKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci1leHRlcm4gdEJUQV9DU0lTX1NSVkNfSU5GTyogYnRhX2NzaXBfZ2V0X2NzaXNfc2VydmljZV9jYih0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IpOwotZXh0ZXJuIGJvb2wgYnRhX2NzaXBfaXNfY3Npc19zdXBwb3J0ZWQodEJUQV9DU0lQX0RFVl9DQiogZGV2X2NiKTsKLWV4dGVybiB0QlRBX0NTSVNfU1JWQ19JTkZPKiBidGFfY3NpcF9nZXRfY3Npc19zZXJ2aWNlX2J5X2hhbmRsZSh0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV9oYW5kbGUpOwotZXh0ZXJuIHRCVEFfQ1NJU19TUlZDX0lORk8qIGJ0YV9jc2lwX2ZpbmRfY3Npc19zcnZjX2J5X2xvY2tfaGFuZGxlKHRCVEFfQ1NJUF9ERVZfQ0IqIGRldl9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsb2NrX2hhbmRsZSk7Ci1leHRlcm4gdEJUQV9DU0lQX0NTRVQqIGJ0YV9jc2lwX2dldF9vcl9jcmVhdGVfY3NldCAodWludDhfdCBzZXRfaWQsIGJvb2wgZXhpc3RpbmcpOwotZXh0ZXJuIGJvb2wgYnRhX2NzaXBfdmFsaWRhdGVfc2V0X3BhcmFtcyh0QlRBX1NFVF9MT0NLX1BBUkFNUyogbG9ja19yZXEpOwotZXh0ZXJuIGJvb2wgYnRhX2NzaXBfaXNfdmFsaWRfbG9ja19yZXF1ZXN0KHRCVEFfU0VUX0xPQ0tfUEFSQU1TKiBsb2NrX3JlcSk7Ci1leHRlcm4gc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYnRhX2NzaXBfYXJyYW5nZV9zZXRfbWVtYmVyc19ieV9vcmRlcigKLSAgICB1aW50OF90IHNldF9pZCwgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4mIHJlcV9zbSwgYm9vbCBhc2NlbmRpbmcpOwotZXh0ZXJuIHRCVEFfQ1NJUF9DU0VUIGJ0YV9jc2lwX2dldF9jb29yZGluYXRlZF9zZXQgKHVpbnQ4X3Qgc2V0X2lkKTsKLWV4dGVybiBib29sIGJ0YV9jc2lwX3VwZGF0ZV9zZXRfbWVtYmVyICh1aW50OF90IHNldF9pZCwgUmF3QWRkcmVzcyBhZGRyKTsKLWV4dGVybiB0QlRBX0NTRVRfQ0IqIGJ0YV9jc2lwX2dldF9jc2V0X2NiICgpOwotZXh0ZXJuIHRCVEFfQ1NFVF9DQiogYnRhX2NzaXBfZ2V0X2NzZXRfY2JfYnlfaWQgKHVpbnQ4X3Qgc2V0X2lkKTsKLWV4dGVybiB1aW50OF90IGJ0YV9jc2lwX2ZpbmRfc2V0X2lkX2J5X3NpcmsgKHVpbnQ4X3QqIHNpcmspOwotZXh0ZXJuIHRCVEFfQ1NJU19TUlZDX0lORk8qIGJ0YV9jc2lwX2dldF9jc2lzX2luc3RhbmNlKHRCVEFfQ1NJUF9ERVZfQ0IqIGRldl9jYiwgdWludDhfdCBzZXRfaWQpOwotZXh0ZXJuIGJvb2wgYnRhX2NzaXBfaXNfbG9ja2VkX2J5X290aGVyX2FwcHModEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YywgdWludDhfdCBhcHBfaWQpOwotZXh0ZXJuIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGJ0YV9jc2lwX2dldF9zZXRfbWVtYmVyX2J5X29yZGVyKHVpbnQ4X3Qgc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXNjZW5kaW5nKTsKLWV4dGVybiBib29sIGJ0YV9jc2lwX2lzX21lbWJlcl9sb2NrZWRfYnlfYXBwICh1aW50OF90IGFwcF9pZCwgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2Yyk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9nZXRfbmV4dF9sb2NrX3JlcXVlc3QodEJUQV9DU0VUX0NCKiBjc2V0X2NiKTsKLWV4dGVybiB1aW50MTZfdCBidGFfY3NpcF9nZXRfY2NjZF9oYW5kbGUgKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNoYXJfaGFuZGxlKTsKLWV4dGVybiBib29sIGJ0YV9jc2lwX2lzX2FwcF9yZWcodWludDhfdCBhcHBfaWQpOwotZXh0ZXJuIHRCVEFfQ1NJUF9SQ0IqIGJ0YV9jc2lwX2dldF9yY2IgKHVpbnQ4X3QgYXBwX2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3JlbW92ZV9zZXRfbWVtYmVyIChSYXdBZGRyZXNzIGFkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfaGFuZGxlX25vdGlmaWNhdGlvbih0QlRBX0dBVFRDX05PVElGWSogbnRmKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX2hhbmRsZV9sb2NrX3ZhbHVlX25vdGlmKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgdmFsdWUpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfYWRkX2FwcF90b19hcHBsaXN0KHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3QgYXBwX2lkKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX2hhbmRsZV91bnJlc3BvbnNpdmVfc21fcmVzKHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3JlbW92ZV9hcHBfZnJvbV9jb25uX2xpc3QodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdWludDhfdCBhcHBfaWQpOwotZXh0ZXJuIGJvb2wgYnRhX2NzaXBfaXNfYXBwX2Zyb21fYXBwbGlzdCh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLCB1aW50OF90IGFwcF9pZCk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9zZW5kX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYih0QlRBX0NTSVBfREVWX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0ZSwgdWludDhfdCBzdGF0dXMpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXRlLCB1aW50OF90IHN0YXR1cyk7Ci1leHRlcm4gdm9pZCBidGFfY3NpcF9zZW5kX2xvY2tfcmVxX2NtcGxfY2IgKHRCVEFfTE9DS19TVEFUVVNfQ0hBTkdFRCBjc2V0X2NiKTsKLWV4dGVybiB2b2lkIGJ0YV9jc2lwX3dyaXRlX2NjY2QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHVpbnQxNl90IGNoYXJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2NjZF9oYW5kbGUpOwotZXh0ZXJuIHZvaWQgYnRhX2NzaXBfcHJlc2VydmVfY3NldCAodEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2Yyk7Ci1leHRlcm4gT2N0ZXQxNiBidGFfY3NpcF9nZXRfc2FsdCgpOwotZXh0ZXJuIE9jdGV0MTYgYnRhX2NzaXBfY29tcHV0ZV9UKE9jdGV0MTYgc2FsdCwgT2N0ZXQxNiBLKTsKLWV4dGVybiBPY3RldDE2IGJ0YV9jc2lwX2NvbXB1dGVfazEoT2N0ZXQxNiBUKTsKLWV4dGVybiB2b2lkICBidGFfY3NpcF9nZXRfZGVjcnlwdGVkX3NpcmsoT2N0ZXQxNiBrMSwgdWludDhfdCAqZW5jX3NpcmssIHVpbnQ4X3QgKnNpcmspOwotZXh0ZXJuIE9jdGV0MTYgYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdChjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IE9jdGV0MTYmIG1lc3NhZ2UpOwotZXh0ZXJuIE9jdGV0MTYgYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdChjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IHVpbnQ4X3QqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgpOwotZXh0ZXJuIHZvaWQgaGV4X3N0cmluZ190b19ieXRlX2FycihjaGFyICpzdHIsIHVpbnQ4X3QqIGJ5dGVfYXJyLCB1aW50OF90IGxlbik7Ci1leHRlcm4gdm9pZCBieXRlX2Fycl90b19oZXhfc3RyaW5nKHVpbnQ4X3QqIGJ5dGVfYXJyLCBjaGFyKiBzdHIsIHVpbnQ4X3QgbGVuKTsKLWV4dGVybiBib29sIGlzX2tleV9lbXB0eShPY3RldDE2JiBrZXkpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2NzaXAvYnRhX2NzaXBfbWFpbi5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzExMWYxLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YV9jc2lwX2ludC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF9jb21tb24uaCIKLQotI2RlZmluZSBMT0dfVEFHICJidF9idGFfY3NpcCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdGF0aWMgbWV0aG9kcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgY2hhciogYnRhX2NzaXBfZXZ0X2NvZGUodWludDE2X3QgZXZ0X2NvZGUpOwotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9jc2lwX3N0YXRlX2NvZGUodEJUQV9DU0lQX1NUQVRFIGV2dF9jb2RlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0NTSVBfQ0IgYnRhX2NzaXBfY2I7Ci0KLWVudW0gewotICBCVEFfQ1NJUF9PUEVOX0FDVCwKLSAgQlRBX0NTSVBfQ0xPU0VfQUNULAotICBCVEFfQ1NJUF9HQVRUX09QRU5fQUNULAotICBCVEFfQ1NJUF9HQVRUX0NMT1NFX0FDVCwKLSAgQlRBX0NTSVBfR0FUVF9PUEVOX0ZBSUxfQUNULAotICBCVEFfQ1NJUF9PUEVOX0NNUExfQUNULAotICBCVEFfQ1NJUF9TVEFSVF9TRUNfQUNULAotICBCVEFfQ1NJUF9TRUNfQ01QTF9BQ1QsCi0gIEJUQV9DU0lQX0lHTk9SRSwKLX07Ci0KLS8qIHR5cGUgZm9yIGFjdGlvbiBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgdm9pZCAoKnRCVEFfQ1NJUF9BQ1RJT04pKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKTsKLQotLyogYWN0aW9uIGZ1bmN0aW9ucyAqLwotY29uc3QgdEJUQV9DU0lQX0FDVElPTiBidGFfY3NpcF9hY3Rpb25bXSA9IHsKLSAgYnRhX2NzaXBfYXBpX29wZW5fYWN0LAotICBidGFfY3NpcF9hcGlfY2xvc2VfYWN0LAotICBidGFfY3NpcF9nYXR0X29wZW5fYWN0LAotICBidGFfY3NpcF9nYXR0X2Nsb3NlX2FjdCwKLSAgYnRhX2NzaXBfZ2F0dF9vcGVuX2ZhaWxfYWN0LAotICBidGFfY3NpcF9vcGVuX2NtcGxfYWN0LAotICBidGFfY3NpcF9zdGFydF9zZWNfYWN0LAotICBidGFfY3NpcF9zZWNfY21wbF9hY3QsCi19OwotCi0vKiBzdGF0ZSB0YWJsZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBCVEFfQ1NJUF9BQ1RJT04gMCAgICAgLyogcG9zaXRpb24gb2YgYWN0aW9uICovCi0jZGVmaW5lIEJUQV9DU0lQX05FWFRfU1RBVEUgMSAvKiBwb3NpdGlvbiBvZiBuZXh0IHN0YXRlICovCi0jZGVmaW5lIEJUQV9DU0lQX05VTV9DT0xTIDIgICAvKiBudW1iZXIgb2YgY29sdW1ucyAqLwotCi0vKiBzdGF0ZSB0YWJsZSBpbiBpZGxlIHN0YXRlICovCi1jb25zdCB1aW50OF90IGJ0YV9jc2lwX3N0X2lkbGVbXVtCVEFfQ1NJUF9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBCVEFfQ1NJUF9BUElfT1BFTl9FVlQgICAgICAgICAgKi8ge0JUQV9DU0lQX09QRU5fQUNULCBCVEFfQ1NJUF9XNF9DT05OX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9BUElfQ0xPU0VfRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICBCVEFfQ1NJUF9JRExFX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9HQVRUX09QRU5fRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICBCVEFfQ1NJUF9JRExFX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9HQVRUX0NMT1NFX0VWVCAgICAgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICBCVEFfQ1NJUF9JRExFX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9HQVRUX09QRU5fRkFJTF9BQ1QgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICBCVEFfQ1NJUF9JRExFX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9PUEVOX0NNUExfRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX09QRU5fQ01QTF9BQ1QsIEJUQV9DU0lQX0NPTk5fU1R9LAotICAgIC8qIEJUQV9DU0lQX1NUQVJUX0VOQ19FVlQgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgIEJUQV9DU0lQX0lETEVfU1R9LAotICAgIC8qIEJUQV9DU0lQX0VOQ19DTVBMX0VWVCAgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgIEJUQV9DU0lQX0lETEVfU1R9LAotfTsKLQotLyogc3RhdGUgdGFibGUgaW4gd2FpdCBmb3Igc2VjdXJpdHkgc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYnRhX2NzaXBfc3RfdzRfY29ubltdW0JUQV9DU0lQX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEJUQV9DU0lQX0FQSV9PUEVOX0VWVCAgICAgICAgICAqLyB7QlRBX0NTSVBfT1BFTl9BQ1QsICAgICAgICAgICBCVEFfQ1NJUF9XNF9DT05OX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9BUElfQ0xPU0VfRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX0NMT1NFX0FDVCwgICAgICAgICAgQlRBX0NTSVBfVzRfQ09OTl9TVH0sCi0gICAgLyogQlRBX0NTSVBfR0FUVF9PUEVOX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9HQVRUX09QRU5fQUNULCAgICAgIEJUQV9DU0lQX1c0X0NPTk5fU1R9LAotICAgIC8qIEJUQV9DU0lQX0dBVFRfQ0xPU0VfRVZUICAgICAgICAqLyB7QlRBX0NTSVBfR0FUVF9DTE9TRV9BQ1QsICAgICBCVEFfQ1NJUF9JRExFX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9HQVRUX09QRU5fRkFJTF9BQ1QgICAgKi8ge0JUQV9DU0lQX0dBVFRfT1BFTl9GQUlMX0FDVCwgQlRBX0NTSVBfSURMRV9TVH0sCi0gICAgLyogQlRBX0NTSVBfT1BFTl9DTVBMX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9PUEVOX0NNUExfQUNULCAgICAgIEJUQV9DU0lQX0NPTk5fU1R9LAotICAgIC8qIEJUQV9DU0lQX1NUQVJUX0VOQ19FVlQgICAgICAgICAqLyB7QlRBX0NTSVBfU1RBUlRfU0VDX0FDVCwgICAgICBCVEFfQ1NJUF9XNF9TRUN9LAotICAgIC8qIEJUQV9DU0lQX0VOQ19DTVBMX0VWVCAgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgICAgICAgICAgICBCVEFfQ1NJUF9XNF9DT05OX1NUfSwKLX07Ci0KLS8qIHN0YXRlIHRhYmxlIGluIHdhaXQgZm9yIGNvbm5lY3Rpb24gc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYnRhX2NzaXBfc3RfdzRfc2VjW11bQlRBX0NTSVBfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogQlRBX0NTSVBfQVBJX09QRU5fRVZUICAgICAgICAgICovIHtCVEFfQ1NJUF9PUEVOX0FDVCwgICAgICAgICAgIEJUQV9DU0lQX1c0X1NFQ30sCi0gICAgLyogQlRBX0NTSVBfQVBJX0NMT1NFX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9DTE9TRV9BQ1QsICAgICAgICAgIEJUQV9DU0lQX1c0X1NFQ30sCi0gICAgLyogQlRBX0NTSVBfR0FUVF9PUEVOX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9JR05PUkUsICAgICAgICAgICAgIEJUQV9DU0lQX1c0X1NFQ30sCi0gICAgLyogQlRBX0NTSVBfR0FUVF9DTE9TRV9FVlQgICAgICAgICovIHtCVEFfQ1NJUF9HQVRUX0NMT1NFX0FDVCwgICAgIEJUQV9DU0lQX0lETEVfU1R9LAotICAgIC8qIEJUQV9DU0lQX0dBVFRfT1BFTl9GQUlMX0FDVCAgICAqLyB7QlRBX0NTSVBfR0FUVF9PUEVOX0ZBSUxfQUNULCBCVEFfQ1NJUF9JRExFX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9PUEVOX0NNUExfRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX09QRU5fQ01QTF9BQ1QsICAgICAgQlRBX0NTSVBfQ09OTl9TVH0sCi0gICAgLyogQlRBX0NTSVBfU1RBUlRfRU5DX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9JR05PUkUsICAgICAgICAgICAgIEJUQV9DU0lQX1c0X1NFQ30sCi0gICAgLyogQlRBX0NTSVBfRU5DX0NNUExfRVZUICAgICAgICAgICovIHtCVEFfQ1NJUF9TRUNfQ01QTF9BQ1QsICAgICAgIEJUQV9DU0lQX1c0X0NPTk5fU1R9LAotfTsKLQotLyogc3RhdGUgdGFibGUgaW4gY29ubmVjdGlvbiBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBidGFfY3NpcF9zdF9jb25uZWN0ZWRbXVtCVEFfQ1NJUF9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBCVEFfQ1NJUF9BUElfT1BFTl9FVlQgICAgICAgICAgKi8ge0JUQV9DU0lQX09QRU5fQUNULCAgICAgICAgICAgQlRBX0NTSVBfQ09OTl9TVH0sCi0gICAgLyogQlRBX0NTSVBfQVBJX0NMT1NFX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9DTE9TRV9BQ1QsICAgICAgICAgIEJUQV9DU0lQX0NPTk5fU1R9LAotICAgIC8qIEJUQV9DU0lQX0dBVFRfT1BFTl9FVlQgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgICAgICAgICAgICBCVEFfQ1NJUF9DT05OX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9HQVRUX0NMT1NFX0VWVCAgICAgICAgKi8ge0JUQV9DU0lQX0dBVFRfQ0xPU0VfQUNULCAgICAgQlRBX0NTSVBfSURMRV9TVH0sCi0gICAgLyogQlRBX0NTSVBfR0FUVF9PUEVOX0ZBSUxfQUNUICAgICovIHtCVEFfQ1NJUF9HQVRUX09QRU5fRkFJTF9BQ1QsIEJUQV9DU0lQX0lETEVfU1R9LAotICAgIC8qIEJUQV9DU0lQX09QRU5fQ01QTF9FVlQgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgICAgICAgICAgICBCVEFfQ1NJUF9DT05OX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9TVEFSVF9FTkNfRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICAgICAgICAgICAgQlRBX0NTSVBfQ09OTl9TVH0sCi0gICAgLyogQlRBX0NTSVBfRU5DX0NNUExfRVZUICAgICAgICAgICovIHtCVEFfQ1NJUF9JR05PUkUsICAgICAgICAgICAgIEJUQV9DU0lQX0NPTk5fU1R9LAotfTsKLQotLyogc3RhdGUgdGFibGUgaW4gZGlzY29ubmVjdGluZyBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBidGFfY3NpcF9zdF9kaXNjb25uZWN0aW5nW11bQlRBX0NTSVBfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogQlRBX0NTSVBfQVBJX09QRU5fRVZUICAgICAgICAgICovIHtCVEFfQ1NJUF9JR05PUkUsICAgICAgICAgIEJUQV9DU0lQX0RJU0NPTk5FQ1RJTkdfU1R9LAotICAgIC8qIEJUQV9DU0lQX0FQSV9DTE9TRV9FVlQgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgICAgICAgICBCVEFfQ1NJUF9ESVNDT05ORUNUSU5HX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9HQVRUX09QRU5fRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICAgICAgICAgQlRBX0NTSVBfRElTQ09OTkVDVElOR19TVH0sCi0gICAgLyogQlRBX0NTSVBfR0FUVF9DTE9TRV9FVlQgICAgICAgICovIHtCVEFfQ1NJUF9HQVRUX0NMT1NFX0FDVCwgIEJUQV9DU0lQX0lETEVfU1R9LAotICAgIC8qIEJUQV9DU0lQX0dBVFRfT1BFTl9GQUlMX0FDVCAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgICAgICAgICBCVEFfQ1NJUF9ESVNDT05ORUNUSU5HX1NUfSwKLSAgICAvKiBCVEFfQ1NJUF9PUEVOX0NNUExfRVZUICAgICAgICAgKi8ge0JUQV9DU0lQX0lHTk9SRSwgICAgICAgICAgQlRBX0NTSVBfRElTQ09OTkVDVElOR19TVH0sCi0gICAgLyogQlRBX0NTSVBfU1RBUlRfRU5DX0VWVCAgICAgICAgICovIHtCVEFfQ1NJUF9JR05PUkUsICAgICAgICAgIEJUQV9DU0lQX0RJU0NPTk5FQ1RJTkdfU1R9LAotICAgIC8qIEJUQV9DU0lQX0VOQ19DTVBMX0VWVCAgICAgICAgICAqLyB7QlRBX0NTSVBfSUdOT1JFLCAgICAgICAgICBCVEFfQ1NJUF9ESVNDT05ORUNUSU5HX1NUfSwKLX07Ci0KLS8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QlRBX0NTSVBfU1RfVEJMKVtCVEFfQ1NJUF9OVU1fQ09MU107Ci0KLS8qIHN0YXRlIHRhYmxlICovCi10QlRBX0NTSVBfU1RfVEJMIGJ0YV9jc2lwX3N0X3RibFtdID0ge2J0YV9jc2lwX3N0X2lkbGUsIGJ0YV9jc2lwX3N0X3c0X2Nvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2NzaXBfc3RfdzRfc2VjLCBidGFfY3NpcF9zdF9jb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2NzaXBfc3RfZGlzY29ubmVjdGluZ307Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9zbV9leGVjdXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBUEkgdG8gZXhlY3V0ZSBzdGF0ZSBvcGVyYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfc21fZXhlY3V0ZSh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQ1NJUF9SRVFfREFUQSogcF9kYXRhKSB7Ci0gIHRCVEFfQ1NJUF9TVF9UQkwgc3RhdGVfdGFibGU7Ci0gIHVpbnQ4X3QgYWN0aW9uOwotCi0gIGlmICghcF9jYikgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIiVzOiBEZXZpY2Ugbm90IGZvdW5kLiBSZXR1cm4uIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0YXRlX3RhYmxlID0gYnRhX2NzaXBfc3RfdGJsW3BfY2ItPnN0YXRlXTsKLQotICBldmVudCAmPSAweGZmOwotCi0gIHBfY2ItPnN0YXRlID0gc3RhdGVfdGFibGVbZXZlbnRdW0JUQV9DU0lQX05FWFRfU1RBVEVdOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogTmV4dCBTdGF0ZSA9ICVkKCVzKSBldmVudCA9ICUwNHgoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9jYi0+c3RhdGUsIGJ0YV9jc2lwX3N0YXRlX2NvZGUocF9jYi0+c3RhdGUpLCBldmVudCwKLSAgICAgICAgICAgICAgICAgICBidGFfY3NpcF9ldnRfY29kZShldmVudCkpOwotCi0gIGFjdGlvbiA9IHN0YXRlX3RhYmxlW2V2ZW50XVtCVEFfQ1NJUF9BQ1RJT05dOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlczogYWN0aW9uID0gJWQiLCBfX2Z1bmNfXywgYWN0aW9uKTsKLSAgaWYgKGFjdGlvbiAhPSBCVEFfQ1NJUF9JR05PUkUpIHsKLSAgICAoKmJ0YV9jc2lwX2FjdGlvblthY3Rpb25dKShwX2NiLCBwX2RhdGEpOwotICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2hkbF9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ1NJUCBjbGllbnQgbWFpbiBldmVudCBoYW5kbGluZyBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfY3NpcF9oZGxfZXZlbnQoQlRfSERSKiBwX21zZykgewotICB0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IgPSBOVUxMOwotCi0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBFdmVudDogJTA0eCIsIF9fZnVuY19fLCBwX21zZy0+ZXZlbnQpOwotCi0gIHN3aXRjaCAocF9tc2ctPmV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfQ1NJUF9BUElfRU5BQkxFX0VWVDoKLSAgICAgIGJ0YV9jc2lwX2FwaV9lbmFibGUoKCh0QlRBX0NTSVBfRU5BQkxFICopcF9tc2cpLT5wX2NiYWNrKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQ1NJUF9BUElfRElTQUJMRV9FVlQ6Ci0gICAgICBidGFfY3NpcF9hcGlfZGlzYWJsZSgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9DU0lQX0RJU0NfQ01QTF9FVlQ6Ci0gICAgICBidGFfY3NpcF9nYXR0X2Rpc2NfY21wbF9hY3QoKHRCVEFfQ1NJUF9ESVNDX1NFVCAqKXBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQ1NJUF9TRVRfTE9DS19WQUxVRV9FVlQ6Ci0gICAgICBidGFfY3NpcF9wcm9jZXNzX3NldF9sb2NrX2FjdCgoKHRCVEFfQ1NJUF9MT0NLX1BBUkFNUyopcF9tc2cpLT5sb2NrX3JlcSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocF9tc2ctPmV2ZW50ID09ICBCVEFfQ1NJUF9BUElfT1BFTl9FVlQpIHsKLSAgICAgICAgUmF3QWRkcmVzcyBiZF9hZGRyID0gKCh0QlRBX0NTSVBfQVBJX0NPTk4gKilwX21zZyktPmJkX2FkZHI7Ci0gICAgICAgIGRldl9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYShiZF9hZGRyKTsKLSAgICAgICAgaWYgKCFkZXZfY2IpIHsKLSAgICAgICAgICBkZXZfY2IgPSBidGFfY3NpcF9jcmVhdGVfZGV2X2NiX2Zvcl9iZGEoYmRfYWRkcik7Ci0gICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IENyZWF0ZWQgRGV2aWNlIENCIGZvciBkZXZpY2U6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9tc2ctPmV2ZW50ID09ICBCVEFfQ1NJUF9BUElfQ0xPU0VfRVZUKSB7Ci0gICAgICAgIGRldl9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYSgoKHRCVEFfQ1NJUF9BUElfQ09OTiAqKXBfbXNnKS0+YmRfYWRkcik7Ci0gICAgICB9Ci0KLSAgICAgIGJ0YV9jc2lwX3NtX2V4ZWN1dGUoZGV2X2NiLCBwX21zZy0+ZXZlbnQsICh0QlRBX0NTSVBfUkVRX0RBVEEqKXBfbXNnKTsKLSAgfQotCi0gIHJldHVybiAodHJ1ZSk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2V2dF9jb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICByZXR1cm5zIGV2ZW50IG5hbWUgaW4gc3RyaW5nIGZvcm1hdAotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGV2ZW50IGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9jc2lwX2V2dF9jb2RlKHVpbnQxNl90IGV2dF9jb2RlKSB7Ci0gIGV2dF9jb2RlID0gKEJUQV9JRF9HUk9VUCA8PCA4KSB8IGV2dF9jb2RlOwotICBzd2l0Y2ggKGV2dF9jb2RlKSB7Ci0gICAgY2FzZSBCVEFfQ1NJUF9BUElfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0FQSV9PUEVOX0VWVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9BUElfQ0xPU0VfRVZUOgotICAgICAgcmV0dXJuICJCVEFfQ1NJUF9BUElfQ0xPU0VfRVZUIjsKLSAgICBjYXNlIEJUQV9DU0lQX0dBVFRfT1BFTl9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0dBVFRfT1BFTl9FVlQiOwotICAgIGNhc2UgQlRBX0NTSVBfR0FUVF9DTE9TRV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0dBVFRfQ0xPU0VfRVZUIjsKLSAgICBjYXNlIEJUQV9DU0lQX09QRU5fRkFJTF9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX09QRU5fRkFJTF9FVlQiOwotICAgIGNhc2UgQlRBX0NTSVBfT1BFTl9DTVBMX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0NTSVBfT1BFTl9DTVBMX0VWVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9TVEFSVF9FTkNfRVZUOgotICAgICAgcmV0dXJuICJCVEFfQ1NJUF9TVEFSVF9FTkNfRVZUIjsKLSAgICBjYXNlIEJUQV9DU0lQX0VOQ19DTVBMX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0NTSVBfRU5DX0NNUExfRVZUIjsKLSAgICBjYXNlIEJUQV9DU0lQX0FQSV9FTkFCTEVfRVZUOgotICAgICAgcmV0dXJuICJCVEFfQ1NJUF9BUElfRU5BQkxFX0VWVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9BUElfRElTQUJMRV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0FQSV9ESVNBQkxFX0VWVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9TRVRfTE9DS19WQUxVRV9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX1NFVF9MT0NLX1ZBTFVFX0VWVCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBDU0lQIGV2ZW50IGNvZGUiOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9zdGF0ZV9jb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICByZXR1cm5zIHN0YXRlIG5hbWUgaW4gc3RyaW5nIGZvcm1hdAotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNvbm5lY3Rpb24gc3RhdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IGNoYXIqIGJ0YV9jc2lwX3N0YXRlX2NvZGUodEJUQV9DU0lQX1NUQVRFIHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBjYXNlIEJUQV9DU0lQX0lETEVfU1Q6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0lETEVfU1QiOwotICAgIGNhc2UgQlRBX0NTSVBfVzRfQ09OTl9TVDoKLSAgICAgIHJldHVybiAiQlRBX0NTSVBfVzRfQ09OTl9TVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9XNF9TRUM6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX1c0X1NFQyI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9DT05OX1NUOgotICAgICAgcmV0dXJuICJCVEFfQ1NJUF9DT05OX1NUIjsKLSAgICBjYXNlIEJUQV9DU0lQX0RJU0NPTk5FQ1RJTkdfU1Q6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0RJU0NPTk5FQ1RJTkdfU1QiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIkluY29ycmVjdCBTdGF0ZSI7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9jc2lwL2J0YV9jc2lwX3V0aWxzLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9jc2lwL2J0YV9jc2lwX3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTAwYzNhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvY3NpcC9idGFfY3NpcF91dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ1NJUCBDbGllbnQgc3VwcG9ydGluZyBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGFfY3NpcF9hcGkuaCIKLSNpbmNsdWRlICJidGFfY3NpcF9pbnQuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9xdWV1ZS5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLQotLyogQ1NJUyBDaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9ycyBoYW5kbGVzICovCi0jZGVmaW5lIENTSVBfQ0NDRF9VVUlEX1ZBTCAweDI5MDIKLVV1aWQgQ1NJUF9DQ0NEX1VVSUQgPSBVdWlkOjpGcm9tMTZCaXQoQ1NJUF9DQ0NEX1VVSURfVkFMKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX3ZhbGlkYXRlX3NldF9wYXJhbXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFZhbGlkYXRlcyBpZiBzZXQgaWQgYW5kIGl0cyBtZW1iZXJzIGFyZSB2YWxpZAotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbC4gdHJ1ZSAtIGlmIGRldGFpbHMgYXJlIHZhbGlkIG90aGVyd2lzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfY3NpcF92YWxpZGF0ZV9zZXRfcGFyYW1zKHRCVEFfU0VUX0xPQ0tfUEFSQU1TKiBsb2NrX3JlcSkgewotICBzdGQ6OnZlY3Rvcjx0QlRBX0NTSVBfQ1NFVD4gKmNzZXRzID0gJmJ0YV9jc2lwX2NiLmNzZXRzOwotICB0QlRBX0NTSVBfQ1NFVCBjc2V0OwotICBib29sIGlzX3ZhbGlkX3NldCA9IGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPHRCVEFfQ1NJUF9DU0VUPjo6aXRlcmF0b3IgaXRyOwotICBmb3IgKGl0ciA9IGNzZXRzLT5iZWdpbigpOyBpdHIgIT0gY3NldHMtPmVuZCgpOyArK2l0cikgewotICAgIGlmIChsb2NrX3JlcS0+c2V0X2lkID09IGl0ci0+c2V0X2lkKSB7Ci0gICAgICBjc2V0ID0gKml0cjsKLSAgICAgIGlzX3ZhbGlkX3NldCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWlzX3ZhbGlkX3NldCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogSW52YWxpZCBTZXQgSUQgPSAiIDw8ICtsb2NrX3JlcS0+c2V0X2lkOwotICAgIC8vVE9ETzogR2l2ZSBJbnZhbGlkIHBhcmFtZXRlcnMgY2FsbGJhY2sKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IHJlcV9tZW1iZXJzID0gbG9ja19yZXEtPm1lbWJlcnNfYWRkcjsKLSAgICAvLyBUT0RPOiBpZiByZXF1ZXN0ZWQgc2V0IG1lbWJlcnMgc2l6ZSA9IDAsIHJldHVybiB0cnVlCi0gIGlmICgoaW50KWxvY2tfcmVxLT5tZW1iZXJzX2FkZHIuc2l6ZSgpID09IDApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX188PCAiIExvY2sgb2YgQWxsIFNldCBNZW1lYmVycyBpcyByZXF1ZXN0ZWQiOwotICAgIHJldHVybiAodHJ1ZSk7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBzZXRfbWVtYmVycyA9IGNzZXQuc2V0X21lbWJlcnM7Ci0gIGludCBtZW1iZXJzX21hdGNoZWQgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcmVxX21lbWJlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IChpbnQpc2V0X21lbWJlcnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgIGlmIChyZXFfbWVtYmVyc1tpXSA9PSBzZXRfbWVtYmVyc1tqXSkgewotICAgICAgICBtZW1iZXJzX21hdGNoZWQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIExPRyhJTkZPKSA8PCAic2V0IG1lbWJlcnMgbWF0Y2hlZCBjb3VudCA9ICIgPDwgK21lbWJlcnNfbWF0Y2hlZDsgLy9kZWJ1ZwotICBpZiAobWVtYmVyc19tYXRjaGVkICE9IChpbnQpcmVxX21lbWJlcnMuc2l6ZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEluY29ycmVjdCBTZXQgbWVtYmVycyBwcm92aWRlZCI7Ci0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIH0KLQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfaXNfdmFsaWRfbG9ja19yZXF1ZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBWYWxpZGF0ZXMgbG9jayByZXF1ZXN0IHBhcmFtZXRlcnMgcmVjZWl2ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wuIHRydWUgLSBpZiBkZXRhaWxzIGFyZSB2YWxpZCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2NzaXBfaXNfdmFsaWRfbG9ja19yZXF1ZXN0KHRCVEFfU0VUX0xPQ0tfUEFSQU1TKiBsb2NrX3JlcSkgewotICAvLyB2YWxpZGF0ZSBpZiBjb3JyZWN0IGxvY2sgdmFsdWUgaXMgcHJvdmlkZWQKLSAgaWYgKGxvY2tfcmVxLT5sb2NrX3ZhbHVlICE9IFVOTE9DS19WQUxVRSAmJiBsb2NrX3JlcS0+bG9ja192YWx1ZSAhPSBMT0NLX1ZBTFVFKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBJbnZhbGlkIExvY2sgVmFsdWUuIjsKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQotCi0gIC8vIHZhbGlkYXRlIHNldCBpZAotICBpZiAoIWJ0YV9jc2lwX3ZhbGlkYXRlX3NldF9wYXJhbXMobG9ja19yZXEpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBwYXJhbXMiOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dldF9jc2V0X2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGaW5kcyBjb29yZGluYXRlZCBzZXQgY29udHJvbCBibG9jayBieSBzZXRfaWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRCVEFfQ1NFVF9DQi4gTlVMTCAtIGlmIHNldCBpcyBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQ1NFVF9DQiogYnRhX2NzaXBfZ2V0X2NzZXRfY2JfYnlfaWQgKHVpbnQ4X3Qgc2V0X2lkKSB7Ci0gIGludCBpOwotICB0QlRBX0NTRVRfQ0IqIGNzZXRfY2IgPSAmYnRhX2NzaXBfY2IuY3NldHNfY2JbMF07Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9NQVhfU1VQUE9SVEVEX1NFVFM7IGkrKywgY3NldF9jYisrKSB7Ci0gICAgaWYgKChjc2V0X2NiLT5pbl91c2UpICYmIChjc2V0X2NiLT5zZXRfaWQgPT0gc2V0X2lkKSkgewotICAgICAgcmV0dXJuIChjc2V0X2NiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBubyBtYXRjaCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X2NzZXRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENyZWF0ZXMgbmV3IGNvb3JkaW5hdGVkIHNldCBjb250cm9sIGJsb2NrIHdpdGggbmV4dCBhdmFpbGFibGUKLSAqICAgICAgICAgICAgICAgICAgc2V0IGlkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9DU0VUX0NCLiBOVUxMIC0gaWYgbm8gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgZm9yIHNldC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9DU0VUX0NCKiBidGFfY3NpcF9nZXRfY3NldF9jYiAoKSB7Ci0gIGludCBpOwotICB0QlRBX0NTRVRfQ0IqIGNzZXRfY2IgPSAmYnRhX2NzaXBfY2IuY3NldHNfY2JbMF07Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9NQVhfU1VQUE9SVEVEX1NFVFM7IGkrKywgY3NldF9jYisrKSB7Ci0gICAgaWYgKCFjc2V0X2NiLT5pbl91c2UpIHsKLSAgICAgIGNzZXRfY2ItPnNldF9pZCA9IGk7Ci0gICAgICBjc2V0X2NiLT5pbl91c2UgPSB0cnVlOwotICAgICAgcmV0dXJuIChjc2V0X2NiKTsKLSAgICB9Ci0gIH0KLQotICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgTm8gcmVzb3VyY2UgYXZhaWxhYmxlIGZvciBDb29yZGluYXRlZCBzZXQiOwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2lzX2FwcF9yZWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYXBwX2lkIGlzIHZhbGlkIGFuZCByZWdpc3RlcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSAtIGlmIHJlaXN0ZXJlZC4KLSAqICAgICAgICAgICAgICAgICAgZmFsc2UgLSBpZiBpbnZhbGlkIGFwcCBpZCBvciBpdHMgbm90IHJlZ2lzdGVyZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9jc2lwX2lzX2FwcF9yZWcodWludDhfdCBhcHBfaWQpIHsKLSAgaWYgKGFwcF9pZCA+PSBCVEFfQ1NJUF9NQVhfU1VQUE9SVEVEX0FQUFMpIHsKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQotCi0gIGlmIChidGFfY3NpcF9jYi5hcHBfcmNiW2FwcF9pZF0uaW5fdXNlKSB7Ci0gICAgcmV0dXJuICh0cnVlKTsKLSAgfQotCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dldF9yY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYXBwX2lkIGlzIHZhbGlkIGFuZCByZWdpc3RlcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcmVnaXN0cmF0aW9uIGNvbnRyb2wgYmxvY2suIE5VTEwgaWYgbm90IGluIHVzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQ1NJUF9SQ0IqIGJ0YV9jc2lwX2dldF9yY2IgKHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIGlmIChhcHBfaWQgPj0gQlRBX0NTSVBfTUFYX1NVUFBPUlRFRF9BUFBTKSB7Ci0gICAgcmV0dXJuIChOVUxMKTsKLSAgfQotCi0gIGlmIChidGFfY3NpcF9jYi5hcHBfcmNiW2FwcF9pZF0uaW5fdXNlKSB7Ci0gICAgcmV0dXJuICgmYnRhX2NzaXBfY2IuYXBwX3JjYlthcHBfaWRdKTsKLSAgfQotCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nZXRfY29vcmRpbmF0ZWRfc2V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGVzIG5ldyBjb29yZGluYXRlZCBzZXQgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9DU0lQX0NTRVQgZm9yIHZhbGlkIHNldF9pZC4KLSAqICAgICAgICAgICAgICAgICAgRW1wdHkgc2V0IHdpdGggSU5WQUxJRF9TRVRfSUQgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0NTSVBfQ1NFVCBidGFfY3NpcF9nZXRfY29vcmRpbmF0ZWRfc2V0ICh1aW50OF90IHNldF9pZCkgewotICBmb3IgKHRCVEFfQ1NJUF9DU0VUIGNzZXQ6IGJ0YV9jc2lwX2NiLmNzZXRzKSB7Ci0gICAgaWYgKGNzZXQuc2V0X2lkID09IHNldF9pZCkgewotICAgICAgcmV0dXJuIGNzZXQ7Ci0gICAgfQotICB9Ci0KLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiQ29vcmRpbmF0ZWQgc2V0IG5vdCBmb3VuZCBmb3Igc2V0X2lkOiAiIDw8ICtzZXRfaWQ7Ci0gIHRCVEFfQ1NJUF9DU0VUIGNzZXQgPSB7LnNldF9pZCA9IElOVkFMSURfU0VUX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gMAotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgcmV0dXJuIGNzZXQ7Ci0gfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF91cGRhdGVfc2V0X21lbWJlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlcyBzZXQgbWVtYmVyIGluIHRoZSBnaXZlbiBzZXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICh0cnVlLCBpZiBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSwgZmFsc2UuKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9jc2lwX3VwZGF0ZV9zZXRfbWVtYmVyICh1aW50OF90IHNldF9pZCwgUmF3QWRkcmVzcyBhZGRyKSB7Ci0gIGZvciAodEJUQV9DU0lQX0NTRVQmIGNzZXQ6IGJ0YV9jc2lwX2NiLmNzZXRzKSB7Ci0gICAgaWYgKGNzZXQuc2V0X2lkID09IHNldF9pZCkgewotICAgICAgaWYgKGNzZXQuc2V0X21lbWJlcnMuc2l6ZSgpID09IGNzZXQuc2l6ZSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgQWxsIFNldCBtZW1iZXJzIGFscmVhZHkgZGlzY292ZXJlZC4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjc2V0LnNldF9tZW1iZXJzLnB1c2hfYmFjayhhZGRyKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkNvb3JkaW5hdGVkIHNldCBub3QgZm91bmQgZm9yIHNldF9pZDogIiA8PCArc2V0X2lkOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9yZW1vdmVfc2V0X21lbWJlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlcyBzZXQgbWVtYmVyIGZyb20gZ2l2ZW4gY29vcmRpbmF0ZWQgc2V0IGFmdGVyIHVucGFpcmluZy4KLSAqICAgICAgICAgICAgICAgICAgSWYgaXRzIHRoZSBsYXN0IHNldCBtZW1iZXIgaW4gc2V0LCBjb29yZGluYXRlZCBzZXQgaXMgZGVsZXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9yZW1vdmVfc2V0X21lbWJlciAoUmF3QWRkcmVzcyBhZGRyKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIERldmljZSA9ICIgPDwgYWRkci5Ub1N0cmluZygpOwotICBib29sIGlzX2RldmljZV9mb3VuZCA9IGZhbHNlOwotCi0gIGJ0aWZfY29uZmlnX3JlbW92ZShhZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgIkRHcm91cCIpOwotICB0QlRBX0NTSVBfREVWX0NCKiBwX2NiID0gYnRhX2NzaXBfZmluZF9kZXZfY2JfYnlfYmRhKGFkZHIpOwotICBpZiAoIXBfY2IpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogU2V0IE1lbWJlciBub3QgZm91bmQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9ICZwX2NiLT5jc2lzX3NydmNbMF07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NVUFBPUlRFRF9TRVRTX1BFUl9ERVZJQ0UgJiYgIWlzX2RldmljZV9mb3VuZDsgaSsrLCBzcnZjKyspIHsKLSAgICBpZiAoIXNydmMtPmluX3VzZSkgY29udGludWU7Ci0gICAgZm9yICh0QlRBX0NTSVBfQ1NFVCYgY3NldDogYnRhX2NzaXBfY2IuY3NldHMpIHsKLSAgICAgIGlmIChjc2V0LnNldF9pZCA9PSBzcnZjLT5zZXRfaWQpIHsKLSAgICAgICAgLy9zdGQ6OnJlbW92ZShjc2V0LnNldF9tZW1iZXJzLmJlZ2luKCksIGNzZXQuc2V0X21lbWJlcnMuZW5kKCksIGFkZHIpOwotICAgICAgICBjc2V0LnNldF9tZW1iZXJzLmVyYXNlKAotICAgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKGNzZXQuc2V0X21lbWJlcnMuYmVnaW4oKSwgY3NldC5zZXRfbWVtYmVycy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oUmF3QWRkcmVzcyBjb25zdCAmIGJkYWRkcikgewotICAgICAgICAgICAgcmV0dXJuIGJkYWRkciA9PSBhZGRyOwotICAgICAgICB9KSwKLSAgICAgICAgY3NldC5zZXRfbWVtYmVycy5lbmQoKSk7Ci0gICAgICAgIGlzX2RldmljZV9mb3VuZCA9IHRydWU7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFNpemUgPSAiIDw8ICsoaW50KWNzZXQuc2V0X21lbWJlcnMuc2l6ZSgpOwotICAgICAgICBpZiAoY3NldC5zZXRfbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgdEJUQV9DU0VUX0NCKiBjc2V0X2NiID0gYnRhX2NzaXBfZ2V0X2NzZXRfY2JfYnlfaWQoY3NldC5zZXRfaWQpOwotICAgICAgICAgIGlmIChjc2V0X2NiKSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkYXRpbmcgc2V0LiBMYXN0IG1lbWJlciB1bnBhaXJlZC4iOwotICAgICAgICAgICAgY3NldF9jYi0+aW5fdXNlID0gZmFsc2U7Ci0gICAgICAgICAgICBjc2V0X2NiLT5zZXRfaWQgPSBJTlZBTElEX1NFVF9JRDsKLSAgICAgICAgICAgIGNzZXQuc2V0X21lbWJlcnMuY2xlYXIoKTsKLSAgICAgICAgICAgIGJ0YV9jc2lwX2NiLmNzZXRzLmVyYXNlKAotICAgICAgICAgICAgICBzdGQ6OnJlbW92ZV9pZihidGFfY3NpcF9jYi5jc2V0cy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgYnRhX2NzaXBfY2IuY3NldHMuZW5kKCksIFsmXSh0QlRBX0NTSVBfQ1NFVCYgY3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3Muc2V0X2lkID09IHNydmMtPnNldF9pZDsKLSAgICAgICAgICAgIH0pLAotICAgICAgICAgICAgYnRhX2NzaXBfY2IuY3NldHMuZW5kKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBidGFfY3NpcF9jYi5kZXZfY2IuZXJhc2UoCi0gICAgICAgIHN0ZDo6cmVtb3ZlX2lmKGJ0YV9jc2lwX2NiLmRldl9jYi5iZWdpbigpLCBidGFfY3NpcF9jYi5kZXZfY2IuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIFsmXSh0QlRBX0NTSVBfREVWX0NCIGNvbnN0ICZkZXZfY2IpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZfY2IuYWRkciA9PSBhZGRyOwotICAgICAgICB9KSwKLSAgICAgICAgYnRhX2NzaXBfY2IuZGV2X2NiLmVuZCgpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dldF9vcl9jcmVhdGVfY3NldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQVBJIHVzZWQgdG8gY3JlYXRlIENvb3JkaW5hdGVkIFNldCBDb250cm9sIGJsb2NrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0NTSVBfQ1NFVCogYnRhX2NzaXBfZ2V0X29yX2NyZWF0ZV9jc2V0ICh1aW50OF90IHNldF9pZCwgYm9vbCBleGlzdGluZykgewotICAvKnN0ZDo6ZmluZF9pZihidGFfY3NpcF9jYi5jc2V0cy5iZWdpbigpLCBidGFfY3NpcF9jYi5jc2V0cy5lbmQoKSwKLSAgICAgICAgICAgICAgIFsmc2V0X2lkXShjb25zdCB0QlRBX0NTSVBfQ1NFVCYgc2V0KSB7Ci0gICAgICAgICAgICAgICAgIHJldHVybiBzZXQuc2V0X2lkID09IHNldF9pZDsKLSAgICAgICAgICAgICAgIH0pOyovCi0KLSAgZm9yICh0QlRBX0NTSVBfQ1NFVCYgY3NldDogYnRhX2NzaXBfY2IuY3NldHMpIHsKLSAgICBpZiAoY3NldC5zZXRfaWQgPT0gc2V0X2lkKSB7Ci0gICAgICByZXR1cm4gJmNzZXQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGV4aXN0aW5nKSByZXR1cm4gTlVMTDsKLQotICAvKiBDcmVhdGUgYSBuZXcgc2V0IHdpdGggaW52YWxpZCBzZXRfaWQqLwotICB0QlRBX0NTSVBfQ1NFVCBjc2V0ID0gey5zZXRfaWQgPSBJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gIGJ0YV9jc2lwX2NiLmNzZXRzLnB1c2hfYmFjayhjc2V0KTsKLSAgcmV0dXJuICZidGFfY3NpcF9jYi5jc2V0cy5iYWNrKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9maW5kX3NldF9pZF9ieV9zaXJrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGaW5kcyBDb29yZGluYXRlZCBzZXQgY29udHJvbCBibG9jayBieSBzaXJrCi0gKgotICogUmV0dXJucyAgICAgICAgICBzZXRfaWQgaWYgU0lSSyBpcyBmb3VuZAotICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIElOVkFMSURfU0VUX0lECi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRhX2NzaXBfZmluZF9zZXRfaWRfYnlfc2lyayAodWludDhfdCogc2lyaykgewotICBpbnQgaSA9IDA7Ci0gIHRCVEFfQ1NFVF9DQiogY3NldHMgPSAmYnRhX2NzaXBfY2IuY3NldHNfY2JbMF07Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUQV9NQVhfU1VQUE9SVEVEX1NFVFM7IGkrKywgY3NldHMrKykgewotICAgIGlmIChjc2V0cy0+aW5fdXNlKSB7Ci0gICAgICAvLyBjb21wYXJlIFNJUksncwotICAgICAgaWYgKCFtZW1jbXAoc2lyaywgY3NldHMtPnNpcmssIFNJUktfU0laRSkpIHsKLSAgICAgICAgcmV0dXJuIGNzZXRzLT5zZXRfaWQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIElOVkFMSURfU0VUX0lEOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nZXRfY3NldF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZHMgY29vcmRpbmF0ZWQgc2V0IGNvbnRyb2wgYmxvY2sgYnkgc2V0X2lkCi0gKgotICogUmV0dXJucyAgICAgICAgICB0QlRBX0NTRVRfQ0IuIE5VTEwgLSBpZiBzZXQgaXMgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0NTSVNfU1JWQ19JTkZPKiBidGFfY3NpcF9nZXRfY3Npc19pbnN0YW5jZSh0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZXRfaWQpIHsKLSAgaW50IGkgPSAwOwotCi0gIGlmICghZGV2X2NiKSByZXR1cm4gTlVMTDsKLQotICB0QlRBX0NTSVNfU1JWQ19JTkZPKiBzcnZjID0gJmRldl9jYi0+Y3Npc19zcnZjWzBdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhfU1VQUE9SVEVEX1NFVFNfUEVSX0RFVklDRTsgaSsrLCBzcnZjKyspIHsKLSAgICBzcnZjID0gJmRldl9jYi0+Y3Npc19zcnZjW2ldOwotICAgIGlmICgoc3J2Yy0+aW5fdXNlKSAmJiAoc3J2Yy0+c2V0X2lkID09IHNldF9pZCkpIHsKLSAgICAgIHJldHVybiAoc3J2Yyk7Ci0gICAgfQotICB9Ci0KLSAgLyogbm8gbWF0Y2ggZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dldF9jc2lzX3NlcnZpY2VfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENyZWF0ZXMgbmV3IGNvb3JkaW5hdGVkIHNldCBjb250cm9sIGJsb2NrIGZvciBhIGdpdmVuIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9DU0VUX0NCLiBOVUxMIGlmIG5vIHJlc291cmNlcyBhdmFpbGFibGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfQ1NJU19TUlZDX0lORk8qIGJ0YV9jc2lwX2dldF9jc2lzX3NlcnZpY2VfY2IodEJUQV9DU0lQX0RFVl9DQiogZGV2X2NiKSB7Ci0gIGludCBpID0gMDsKLSAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9ICZkZXZfY2ItPmNzaXNfc3J2Y1swXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NVUFBPUlRFRF9TRVRTX1BFUl9ERVZJQ0U7IGkrKywgc3J2YysrKSB7Ci0gICAgaWYgKCFzcnZjLT5pbl91c2UpIHsKLSAgICAgIHNydmMtPmluX3VzZSA9IHRydWU7Ci0gICAgICByZXR1cm4gc3J2YzsKLSAgICB9Ci0gIH0KLQotICAvKiBubyBtYXRjaCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfaXNfY3Npc19zdXBwb3J0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrcyBpZiByZW1vdGUgZGV2aWNlIHN1cHBvcnRzIGNvb3JkaW5hdGVkIHNldAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfY3NpcF9pc19jc2lzX3N1cHBvcnRlZCh0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IpIHsKLSAgaW50IGkgPSAwOwotICB0QlRBX0NTSVNfU1JWQ19JTkZPKiBzcnZjID0gJmRldl9jYi0+Y3Npc19zcnZjWzBdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhfU1VQUE9SVEVEX1NFVFNfUEVSX0RFVklDRTsgaSsrLCBzcnZjKyspIHsKLSAgICBpZiAoc3J2Yy0+aW5fdXNlKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKiBubyBjc2lzIGluc3RhbmNlIGZvdW5kICovCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X2NzaXNfc2VydmljZV9ieV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVzIENTSVMgU2VydmljZSBDb250cm9sIGJsb2NrIGJ5IHNlcnZpY2UgaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQ1NJUyBTZXJ2aWNlIGNvbnRyb2wgYmxvY2suIE51bGwgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRBX0NTSVNfU1JWQ19JTkZPKiBidGFfY3NpcF9nZXRfY3Npc19zZXJ2aWNlX2J5X2hhbmRsZSgKLSAgICB0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IsIHVpbnQxNl90IHNlcnZpY2VfaGFuZGxlKSB7Ci0gIGludCBpID0gMDsKLSAgdEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YyA9ICZkZXZfY2ItPmNzaXNfc3J2Y1swXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NVUFBPUlRFRF9TRVRTX1BFUl9ERVZJQ0U7IGkrKywgc3J2YysrKSB7Ci0gICAgaWYgKHNydmMtPmluX3VzZSAmJiBzcnZjLT5zZXJ2aWNlX2hhbmRsZSA9PSBzZXJ2aWNlX2hhbmRsZSkgewotICAgICAgcmV0dXJuIHNydmM7Ci0gICAgfQotICB9Ci0KLSAgLyogbm8gbWF0Y2ggZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2ZpbmRfY3Npc19zcnZjX2J5X2xvY2tfaGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlcyBDU0lTIFNlcnZpY2UgQ29udHJvbCBibG9jayBieSBsb2NrIGhhbmRsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIENTSVMgU2VydmljZSBjb250cm9sIGJsb2NrLiBOdWxsIGlmIG5vdCBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9DU0lTX1NSVkNfSU5GTyogYnRhX2NzaXBfZmluZF9jc2lzX3NydmNfYnlfbG9ja19oYW5kbGUoCi0gICAgdEJUQV9DU0lQX0RFVl9DQiogZGV2X2NiLCB1aW50MTZfdCBsb2NrX2hhbmRsZSkgewotICBpbnQgaSA9IDA7Ci0gIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMgPSAmZGV2X2NiLT5jc2lzX3NydmNbMF07Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9TVVBQT1JURURfU0VUU19QRVJfREVWSUNFOyBpKyssIHNydmMrKykgewotICAgIGlmIChzcnZjLT5pbl91c2UgJiYgc3J2Yy0+bG9ja19oYW5kbGUgPT0gbG9ja19oYW5kbGUpIHsKLSAgICAgIHJldHVybiBzcnZjOwotICAgIH0KLSAgfQotCi0gIC8qIG5vIG1hdGNoIGZvdW5kICovCi0gIHJldHVybiAoTlVMTCk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2lzX2xvY2tlZF9ieV9vdGhlcl9hcHBzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVja3MgaWYgc2V0IGlzIGxvY2tlZCBieSBhcHAgb3RoZXIgdGhhbiBtZW50aW9uZWQgb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgbG9ja2VkIGJ5IG90aGVyIGFwcCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2NzaXBfaXNfbG9ja2VkX2J5X290aGVyX2FwcHModEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YywgdWludDhfdCBhcHBfaWQpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmxvY2tfYXBwbGlzdCA9IHNydmMtPmxvY2tfYXBwbGlzdDsKLQotICBmb3IgKGF1dG8mIGl0IDogbG9ja19hcHBsaXN0KSB7Ci0gICAgaWYgKGl0ICE9IGFwcF9pZCkgewotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2Zvcm1fc2V0X2xvY2tfb3JkZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZvcm1zIG9yZGVyIG9mIHNldCBtZW1iZXJzIGFzIHBlciByYW5rLgotICoKLSAqIFJldHVybnMgICAgICAgICAgT3JkZXJlZCBTZXQgbWVtYmVycy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYnRhX2NzaXBfZm9ybV9zZXRfbG9ja19vcmRlcih0QlRBX0NTRVRfQ0IqIGNzZXRfY2IpIHsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gb3JkZXJlZF9tZW1iZXJzOwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiByZXFfbWVtYmVycyA9IGNzZXRfY2ItPmN1cl9sb2NrX3JlcS5tZW1iZXJzX2FkZHI7Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QsIFJhd0FkZHJlc3M+IGxvY2tfb3JkZXJfbWFwOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClyZXFfbWVtYmVycy5zaXplKCk7IGkrKykgewotICAgIC8vIGdldCBkZXZpY2UgY29udHJvbCBibG9jayBhbmQgY29ycmVzcG9uZGluZyBjc2lzIHNlcnZpY2UgZGV0YWlscwotICAgIHRCVEFfQ1NJUF9ERVZfQ0IqIGRldl9jYiA9IGJ0YV9jc2lwX2ZpbmRfZGV2X2NiX2J5X2JkYShyZXFfbWVtYmVyc1tpXSk7Ci0gICAgLy8gbnVsbCBjaGVja3MgcmVxdWlyZWQKLSAgICB0QlRBX0NTSVNfU1JWQ19JTkZPKiBzcnZjID0KLSAgICAgIGJ0YV9jc2lwX2dldF9jc2lzX2luc3RhbmNlKGRldl9jYiwgY3NldF9jYi0+Y3VyX2xvY2tfcmVxLnNldF9pZCk7Ci0gICAgaWYgKHNydmMpIHsKLSAgICAgIGxvY2tfb3JkZXJfbWFwLmluc2VydCh7c3J2Yy0+cmFuaywgcmVxX21lbWJlcnNbaV19KTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGF1dG8gaXRyOiBsb2NrX29yZGVyX21hcCkgewotICAgIG9yZGVyZWRfbWVtYmVycy5wdXNoX2JhY2soaXRyLnNlY29uZCk7Ci0gIH0KLQotICByZXR1cm4gb3JkZXJlZF9tZW1iZXJzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfYXJyYW5nZV9zZXRfbWVtYmVyc19ieV9vcmRlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRm9ybXMgb3JkZXIgb2Ygc2V0IG1lbWJlcnMgZm9yIExPQ0svVU5MT0NLIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBPcmRlcmVkIHNldCBtZW1iZXJzIGluIHZlY3Rvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYnRhX2NzaXBfYXJyYW5nZV9zZXRfbWVtYmVyc19ieV9vcmRlcigKLSAgICB1aW50OF90IHNldF9pZCwgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4mIHJlcV9zbSwgYm9vbCBhc2NlbmRpbmcpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IG9yZGVyZWRfcmVxX3NtOwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBzZXRfbWVtYmVycyA9Ci0gICAgICAgICAgYnRhX2NzaXBfZ2V0X3NldF9tZW1iZXJfYnlfb3JkZXIoc2V0X2lkLCBhc2NlbmRpbmcpOwotCi0gIC8vIENoZWNrIGlmIGFsbCBzZXQgbWVtYmVycyBhcmUgcmVxdWVzdGVkCi0gIGlmICgodWludDhfdClyZXFfc20uc2l6ZSgpID09IDApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBvcmlnaW5hbCBzaXplID0gIiA8PCArc2V0X21lbWJlcnMuc2l6ZSgpOwotICAgIHJldHVybiBzZXRfbWVtYmVyczsKLSAgfQotCi0gIC8qIExPQ0sgUmVxdWVzdCBPcmRlciovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClzZXRfbWVtYmVycy5zaXplKCk7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgKGludClyZXFfc20uc2l6ZSgpOyBqKyspIHsKLSAgICAgIGlmIChzZXRfbWVtYmVyc1tpXSA9PSByZXFfc21bal0pIHsKLSAgICAgICAgb3JkZXJlZF9yZXFfc20ucHVzaF9iYWNrKHNldF9tZW1iZXJzW2ldKTsKLSAgICAgICAgaWYgKG9yZGVyZWRfcmVxX3NtLnNpemUoKSA9PSByZXFfc20uc2l6ZSgpKSB7Ci0gICAgICAgICAgcmV0dXJuIG9yZGVyZWRfcmVxX3NtOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHt9OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfYXJyYW5nZV9zZXRfbWVtYmVyc19ieV9vcmRlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRm9ybXMgb3JkZXIgb2Ygc2V0IG1lbWJlcnMgZm9yIExPQ0svVU5MT0NLIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBPcmRlcmVkIHNldCBtZW1iZXJzIGluIHZlY3Rvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYnRhX2NzaXBfZ2V0X3NldF9tZW1iZXJfYnlfb3JkZXIodWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc2NlbmRpbmcpIHsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gb3JkZXJlZF9tZW1iZXJzOwotCi0gIHRCVEFfQ1NFVF9DQiogY3NldF9jYiA9ICZidGFfY3NpcF9jYi5jc2V0c19jYltzZXRfaWRdOwotICBpZiAoIWNzZXRfY2ItPmluX3VzZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIFNldCBmb3IgZm9yIFNldCBJRDogIiA8PCArc2V0X2lkOwotICAgIHJldHVybiB7fTsKLSAgfQotCi0gIGlmIChhc2NlbmRpbmcpIHsKLSAgICBmb3IgKGF1dG8gaXRyOiBjc2V0X2NiLT5vcmRlcmVkX21lbWJlcnMpIHsKLSAgICAgICBvcmRlcmVkX21lbWJlcnMucHVzaF9iYWNrKGl0ci5zZWNvbmQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGF1dG8gaSA9IGNzZXRfY2ItPm9yZGVyZWRfbWVtYmVycy5yYmVnaW4oKTsKLSAgICAgICAgIGkgIT0gY3NldF9jYi0+b3JkZXJlZF9tZW1iZXJzLnJlbmQoKTsgKytpKSB7Ci0gICAgICBvcmRlcmVkX21lbWJlcnMucHVzaF9iYWNrKGktPnNlY29uZCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG9yZGVyZWRfbWVtYmVyczsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfaXNfbWVtYmVyX2xvY2tlZF9ieV9hcHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrcyBpZiBhcHBsaWNhdGlvbiAoYXBwX2lkKSBoYXMgbG9ja2VkIGdpdmVuIHNldC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGFfY3NpcF9pc19tZW1iZXJfbG9ja2VkX2J5X2FwcCAodWludDhfdCBhcHBfaWQsIHRCVEFfQ1NJU19TUlZDX0lORk8qIHNydmMpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGxvY2tfYXBwbGlzdCA9IHNydmMtPmxvY2tfYXBwbGlzdDsKLQotICBhdXRvIGl0ID0gc3RkOjpmaW5kKGxvY2tfYXBwbGlzdC5iZWdpbigpLCBsb2NrX2FwcGxpc3QuZW5kKCksIGFwcF9pZCk7Ci0gIGlmIChpdCAhPSBsb2NrX2FwcGxpc3QuZW5kKCkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBBcHAgSWQgZm91bmQgaW4gYXBwIGxpc3QiOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQXBwIElkIG5vdCBmb3VuZCBpbiBhcHAgbGlzdCI7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2hhbmRsZV91bnJlc3BvbnNpdmVfc21fcmVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kcyBsb2NrIHJlc3BvbnNlIHRvIGVhcmxpZXIgcmVxdWVzdGluZyBhcHAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfaGFuZGxlX3VucmVzcG9uc2l2ZV9zbV9yZXModEJUQV9DU0lTX1NSVkNfSU5GTyogc3J2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cykgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBSZXNwb25zZSBmcm9tIHVucmVzcG9uc2l2ZSByZW1vdGUgIiA8PCBzcnZjLT5iZF9hZGRyLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8ICtzdGF0dXM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB1bnJlc19hcHBsaXN0ID0gc3J2Yy0+dW5yc3BfYXBwbGlzdDsKLQotICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgIHNydmMtPmxvY2sgPSBMT0NLX1ZBTFVFOwotICAgIGZvciAoYXV0byYgaXQgOiB1bnJlc19hcHBsaXN0KSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBTZW5kaW5nIEdBVFRfU1VDQ0VTUyBjYWxsYmFjayB0byBhcHA6ICIgPDwgK2l0OwotICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gc20gPSB7c3J2Yy0+YmRfYWRkcn07Ci0gICAgICB0QlRBX0xPQ0tfU1RBVFVTX0NIQU5HRUQgcmVzID0gey5hcHBfaWQgPSBpdCwgLnNldF9pZCA9IHNydmMtPnNldF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlID0gMHgwMiwgLmFkZHIgPSBzbX07Ci0gICAgICBidGFfY3NpcF9zZW5kX2xvY2tfcmVxX2NtcGxfY2IocmVzKTsKLSAgICAgIC8vIEFkZCBhcHAgaWQgdG8gdGhlIGxvY2sgYXBwbGlzdAotICAgICAgc3J2Yy0+bG9ja19hcHBsaXN0LnB1c2hfYmFjayhpdCk7Ci0gICAgfQotICB9Ci0KLSAgdW5yZXNfYXBwbGlzdC5jbGVhcigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X25leHRfbG9ja19yZXF1ZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTY2hlZHVsZXMgbmV4dCBwZW5kaW5nIGxvY2sgcmVxdWVzdCBmb3IgdGhlIGdpdmVuIHNldC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9nZXRfbmV4dF9sb2NrX3JlcXVlc3QodEJUQV9DU0VUX0NCKiBjc2V0X2NiKSB7Ci0gIHRCVEFfU0VUX0xPQ0tfUEFSQU1TIGxvY2tfcmVxX3BhcmFtczsKLSAgc3RkOjpxdWV1ZTx0QlRBX1NFVF9MT0NLX1BBUkFNUz4mIGxvY2tfcmVxX3F1ZXVlID0gY3NldF9jYi0+bG9ja19yZXFfcXVldWU7Ci0KLSAgaWYgIChsb2NrX3JlcV9xdWV1ZS5lbXB0eSgpKSB7Ci0gICAgTE9HKElORk8pIDw8ICIgTm8gcGVuZGluZyBMb2NrIFJlcXVlc3QgZm9yIFNldDogIiA8PCArY3NldF9jYi0+c2V0X2lkOwotICAgIGNzZXRfY2ItPnJlcXVlc3RfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsb2NrX3JlcV9wYXJhbXMgPSBsb2NrX3JlcV9xdWV1ZS5mcm9udCgpOwotICBsb2NrX3JlcV9xdWV1ZS5wb3AoKTsKLQotICBidGFfY3NpcF9mb3JtX2xvY2tfcmVxdWVzdChsb2NrX3JlcV9wYXJhbXMsIGNzZXRfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZmluZF9kZXZfY2JfYnlfYmRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIGZpbmQgYSBkZXZpY2UgY29udHJvbCBibG9jayBieSBCRCBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9DU0lQX0RFVl9DQiAtIGRldmljZSBjb250cm9sIGJsb2NrIGZvciBhIGdpdmVuIHJlbW90ZS4KLSAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgaWYgZGV2aWNlIGNvbnRyb2wgYmxvY2sgaXMgbm90IHByZXNlbnQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9DU0lQX0RFVl9DQiogYnRhX2NzaXBfZmluZF9kZXZfY2JfYnlfYmRhKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICAvKmF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihidGFfY3NpcF9jYi5kZXZfY2IuYmVnaW4oKSwgYnRhX2NzaXBfY2IuZGV2X2NiLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZiZGFdKGNvbnN0IHRCVEFfQ1NJUF9ERVZfQ0ImIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmFkZHIgPT0gYmRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgcmV0dXJuIChpdGVyID09IGJ0YV9jc2lwX2NiLmRldl9jYi5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ki8KLSAgZm9yICh0QlRBX0NTSVBfREVWX0NCJiBwX2NiOiBidGFfY3NpcF9jYi5kZXZfY2IpIHsKLSAgICBpZiAocF9jYi5hZGRyID09IGJkYSkgewotICAgICAgcmV0dXJuICZwX2NiOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X2Rldl9jYl9ieV9jaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gZmluZCBhIGRldmljZSBjb250cm9sIGJsb2NrIGJ5IGdhdHQgY29ubiBpZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRCVEFfQ1NJUF9ERVZfQ0IgKGRldmljZSBjb250cm9sIGJsb2NrIGZvciBhIGdpdmVuIHJlbW90ZS4pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9DU0lQX0RFVl9DQiogYnRhX2NzaXBfZ2V0X2Rldl9jYl9ieV9jaWQodWludDE2X3QgY29ubl9pZCkgewotICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYnRhX2NzaXBfY2IuZGV2X2NiLmJlZ2luKCksIGJ0YV9jc2lwX2NiLmRldl9jYi5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY29ubl9pZF0oY29uc3QgdEJUQV9DU0lQX0RFVl9DQiYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuY29ubl9pZCA9PSBjb25uX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgcmV0dXJuIChpdGVyID09IGJ0YV9jc2lwX2NiLmRldl9jYi5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9jcmVhdGVfZGV2X2NiX2Zvcl9iZGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gZmluZCBhIGRldmljZSBjb250cm9sIGJsb2NrIGJ5IEJEIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0QlRBX0NTSVBfREVWX0NCIChkZXZpY2UgY29udHJvbCBibG9jayBmb3IgYSBnaXZlbiByZW1vdGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUQV9DU0lQX0RFVl9DQiogYnRhX2NzaXBfY3JlYXRlX2Rldl9jYl9mb3JfYmRhKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB0QlRBX0NTSVBfREVWX0NCIHBfZGV2X2NiID0ge307Ci0gIHBfZGV2X2NiLmFkZHIgPSBiZGE7Ci0gIHBfZGV2X2NiLmluX3VzZSA9IHRydWU7Ci0KLSAgYnRhX2NzaXBfY2IuZGV2X2NiLnB1c2hfYmFjayhwX2Rldl9jYik7Ci0KLSAgcmV0dXJuICZidGFfY3NpcF9jYi5kZXZfY2IuYmFjaygpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nZXRfY2NjZF9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmV0Y2ggY2NjZCBoYW5kbGUgb2YgYSBnaXZlbiBjaGFyYWN0ZXJpc3RpYy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGhhbmRsZSBvZiBjY2NkLiAwIGlmIG5vdCBmb3VuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBidGFfY3NpcF9nZXRfY2NjZF9oYW5kbGUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgY2hhcl9oYW5kbGUpIHsKLSAgICBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogcF9jaGFyID0KLSAgICAgICAgQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGNoYXJfaGFuZGxlKTsKLSAgICBpZiAoIXBfY2hhcikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IENoYXJhY3RlcmlzdGljIG5vdCBmb3VuZDogIiA8PCBjaGFyX2hhbmRsZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgZ2F0dDo6RGVzY3JpcHRvciYgZGVzYyA6IHBfY2hhci0+ZGVzY3JpcHRvcnMpIHsKLSAgICAgIGlmIChkZXNjLnV1aWQgPT0gQ1NJUF9DQ0NEX1VVSUQpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGVzYyBoYW5kbGUgPSAiIDw8ICtkZXNjLmhhbmRsZTsKLSAgICAgICAgcmV0dXJuIGRlc2MuaGFuZGxlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9hZGRfYXBwX3RvX2FwcGxpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gYWRkcyBhcHAgdG8gY29ubmVjdGlvbiBhcHBsaXN0IG9mIGEKLSAqICAgICAgICAgICAgICAgICAgZ2l2ZW4gZGV2aWNlIGNvbnRyb2wgYmxvY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9hZGRfYXBwX3RvX2FwcGxpc3QodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdWludDhfdCBhcHBfaWQpIHsKLSAgaWYgKHBfY2IgJiYgIWJ0YV9jc2lwX2lzX2FwcF9mcm9tX2FwcGxpc3QocF9jYiwgYXBwX2lkKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhZGRpbmcgYXBwKCIgPDwgK2FwcF9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0byBjb25uZWN0aW9uIGFwcGxpc3Qgb2YgIiA8PCBwX2NiLT5hZGRyOwotICAgIHBfY2ItPmNvbm5fYXBwbGlzdC5wdXNoX2JhY2soYXBwX2lkKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9pc19hcHBfZnJvbV9hcHBsaXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIGNoZWNrcyBpZiBhcHAgaXMgZnJvbSBjb25uZWN0aW9uIGFwcGxpc3Qgb2YgYQotICogICAgICAgICAgICAgICAgICBnaXZlbiBkZXZpY2UgY29udHJvbCBibG9jay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYXBwIGhhcyBhbHJlYWR5IHNlbnQgY29ubmVjdCByZXF1ZXN0IGZvciBDU0lQLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRhX2NzaXBfaXNfYXBwX2Zyb21fYXBwbGlzdCh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLCB1aW50OF90IGFwcF9pZCkgewotICBmb3IgKGF1dG8gaTogcF9jYi0+Y29ubl9hcHBsaXN0KSB7Ci0gICAgaWYgKGkgPT0gYXBwX2lkKSB7Ci0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9yZW1vdmVfYXBwX2Zyb21fY29ubl9saXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIHRvIHJlbW92ZSBhcHBsaWNhdGlvbiBmcm9tIGNvbm5lY3Rpb24gYXBwbGlzdCBvZgotICogICAgICAgICAgICAgICAgICBnaXZlbiBkZXZpY2UgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2NzaXBfcmVtb3ZlX2FwcF9mcm9tX2Nvbm5fbGlzdCh0QlRBX0NTSVBfREVWX0NCKiBwX2NiLCB1aW50OF90IGFwcF9pZCkgewotICBwX2NiLT5jb25uX2FwcGxpc3QuZXJhc2UoCi0gICAgICBzdGQ6OnJlbW92ZShwX2NiLT5jb25uX2FwcGxpc3QuYmVnaW4oKSwgcF9jYi0+Y29ubl9hcHBsaXN0LmVuZCgpLCBhcHBfaWQpLAotICAgICAgICAgICAgICAgICAgcF9jYi0+Y29ubl9hcHBsaXN0LmVuZCgpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfc2VuZF9jb25uX3N0YXRlX2NoYW5nZWRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQgdG8gYWxsCi0gKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gaW4gY29ubmVjdGlvbiBhcHAgbGlzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX3NlbmRfY29ubl9zdGF0ZV9jaGFuZ2VkX2NiKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGUsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIGlmICghcF9jYikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRGV2aWNlIENCIGZvciAiIDw8IHBfY2ItPmFkZHIgPDwgIiBub3QgZm91bmQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIHNlbmQgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UgdG8gYWxsIGFwcHMgaW4gY29ubl9hcHBsaXN0Ci0gIGZvciAoYXV0byBpOiBwX2NiLT5jb25uX2FwcGxpc3QpIHsKLSAgICB0QlRBX0NTSVBfQ09OTl9TVEFURV9DSEFOR0VEIGNvbm5fY2JfcGFyYW1zID0gewotICAgICAgICAuYXBwX2lkID0gaSwKLSAgICAgICAgLmFkZHIgPSBwX2NiLT5hZGRyLAotICAgICAgICAuc3RhdGUgPSBzdGF0ZSwKLSAgICAgICAgLnN0YXR1cyA9c3RhdHVzCi0gICAgfTsKLSAgICBpZiAoYnRhX2NzaXBfY2IuYXBwX3JjYltpXS5wX2NiYWNrKSB7Ci0gICAgICAoKmJ0YV9jc2lwX2NiLmFwcF9yY2JbaV0ucF9jYmFjaykKLSAgICAgICAgICAoQlRBX0NTSVBfQ09OTl9TVEFURV9DSEdfRVZULCAodEJUQV9DU0lQX0RBVEEgKikmY29ubl9jYl9wYXJhbXMpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9zZW5kX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZCB0byByZXF1ZXN0aW5nCi0gKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gZnJvbSBjb25uZWN0aW9uIGFwcGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9zZW5kX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYiAodEJUQV9DU0lQX0RFVl9DQiogcF9jYiwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXRlLCB1aW50OF90IHN0YXR1cykgewotCi0gIHRCVEFfQ1NJUF9DT05OX1NUQVRFX0NIQU5HRUQgY29ubl9jYl9wYXJhbXMgPSB7Ci0gICAgICAuYXBwX2lkID0gYXBwX2lkLAotICAgICAgLmFkZHIgPSBwX2NiLT5hZGRyLAotICAgICAgLnN0YXRlID0gc3RhdGUsCi0gICAgICAuc3RhdHVzID1zdGF0dXMKLSAgfTsKLQotICAvLyBzZW5kIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlIHRvIHRoZSByZXF1ZXN0ZWQgQXBwCi0gIGlmIChidGFfY3NpcF9jYi5hcHBfcmNiW2FwcF9pZF0ucF9jYmFjaykgewotICAgICgqYnRhX2NzaXBfY2IuYXBwX3JjYlthcHBfaWRdLnBfY2JhY2spCi0gICAgICAgIChCVEFfQ1NJUF9DT05OX1NUQVRFX0NIR19FVlQsICh0QlRBX0NTSVBfREFUQSAqKSZjb25uX2NiX3BhcmFtcyk7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9wcm9jZXNzX2NvbXBsZXRlZF9sb2NrX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIGxvY2sgc3RhdGUgY2hhbmdlZCB0byByZXF1ZXN0aW5nCi0gKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgYXBwbGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9zZW5kX2xvY2tfcmVxX2NtcGxfY2IgKHRCVEFfTE9DS19TVEFUVVNfQ0hBTkdFRCByZXNwb25zZSkgewotICBpZiAocmVzcG9uc2UuYXBwX2lkID49IEJUQV9DU0lQX01BWF9TVVBQT1JURURfQVBQUyB8fAotICAgICAgICAgICFidGFfY3NpcF9jYi5hcHBfcmNiW3Jlc3BvbnNlLmFwcF9pZF0uaW5fdXNlKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBvciB1bnJlZ2lzdGVyZWQgYXBwbGljYXRpb246ICIgPDwgK3Jlc3BvbnNlLmFwcF9pZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYnRhX2NzaXBfY2IuYXBwX3JjYltyZXNwb25zZS5hcHBfaWRdLnBfY2JhY2spIHsKLSAgICAoKmJ0YV9jc2lwX2NiLmFwcF9yY2JbcmVzcG9uc2UuYXBwX2lkXS5wX2NiYWNrKQotICAgICAgICAoQlRBX0NTSVBfTE9DS19TVEFUVVNfQ0hBTkdFRF9FVlQsICh0QlRBX0NTSVBfREFUQSAqKSZyZXNwb25zZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfd3JpdGVfY2NjZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQVBJIHVzZWQgdG8gd3JpdGUgcmVxdWlyZWQgY2hhcmFjdGVyaXN0aWMgZGVzY3JpcHRvci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9jc2lwX3dyaXRlX2NjY2QgKHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IsIHVpbnQxNl90IGNoYXJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjY2NkX2hhbmRsZSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgICAgLy8gUmVnaXN0ZXIgZm9yIExPQ0sKLSAgICAgIGlmIChCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgICAgICBidGFfY3NpcF9jYi5nYXR0X2lmLCBwX2NiLT5hZGRyLCBjaGFyX2hhbmRsZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIgTm90aWZpY2F0aW9uIFJlZ2lzdHJhdGlvbiBmYWlsZWQgZm9yIGNoYXIgaGFuZGxlOiAiIDw8ICtjaGFyX2hhbmRsZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBub3RpZmljYXRpb24gcmVnaXN0cmF0aW9uIHN1Y2Nlc3NmdWwuIGhhbmRsZTogIiA8PCArY2hhcl9oYW5kbGU7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSgyKTsKLSAgICAgIHVpbnQ4X3QqIHB0ciA9IHZhbHVlLmRhdGEoKTsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocHRyLCBHQVRUX0NIQVJfQ0xJRU5UX0NPTkZJR19OT1RJRklDQVRJT04pOwotICAgICAgQnRhR2F0dFF1ZXVlOjpXcml0ZURlc2NyaXB0b3IocF9jYi0+Y29ubl9pZCwgY2NjZF9oYW5kbGUsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURSwgbnVsbHB0ciwgbnVsbHB0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2xvYWRfY29vcmRpbmF0ZWRfc2V0c19mcm9tX3N0b3JhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFQSSB1c2VkIHRvIGxvYWQgY29vcmRpbmF0ZWQgc2V0cyBmcm9tIHN0b3JhZ2Ugb24gQlQgT04uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9sb2FkX2Nvb3JkaW5hdGVkX3NldHNfZnJvbV9zdG9yYWdlICgpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfRklMRV9QQVRIID0gIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mIjsKLSAgY29uZmlnX3QqIGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEVfUEFUSCk7Ci0gIGlmICghY29uZmlnKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZmlsZSAiPDwgQ09ORklHX0ZJTEVfUEFUSCA8PCAiIG5vdCBmb3VuZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgY29uZmlnX3NlY3Rpb25fbm9kZV90KiBzbm9kZSA9IGNvbmZpZ19zZWN0aW9uX2JlZ2luKGNvbmZpZyk7Ci0gIHdoaWxlIChzbm9kZSAhPSBjb25maWdfc2VjdGlvbl9lbmQoY29uZmlnKSkgewotCi0gICAgY29uc3QgY2hhciogbmFtZSA9IGNvbmZpZ19zZWN0aW9uX25hbWUoc25vZGUpOwotICAgIGlmICghUmF3QWRkcmVzczo6SXNWYWxpZEFkZHJlc3MobmFtZSkpIHsKLSAgICAgIHNub2RlID0gY29uZmlnX3NlY3Rpb25fbmV4dChzbm9kZSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyKiBrZXkgPSAiREdyb3VwIjsKLSAgICBjb25zdCBjaGFyKiBjb29yZGluYXRlZF9zZXRzID0gY29uZmlnX2dldF9zdHJpbmcoY29uZmlnLCBuYW1lLCBrZXksICIiKTsKLSAgICBpZiAoIXN0cmNtcChjb29yZGluYXRlZF9zZXRzLCAiIikpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRvZXNudCBzdXBwb3J0IGNvb2VkaW5hdGVkIHNldC4iOwotICAgICAgc25vZGUgPSBjb25maWdfc2VjdGlvbl9uZXh0KHNub2RlKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIFJhd0FkZHJlc3MgYmRhZGRyOwotICAgIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcobmFtZSwgYmRhZGRyKTsKLSAgICB0QlRBX0NTSVBfREVWX0NCKiBkZXZfY2IgPSBidGFfY3NpcF9maW5kX2Rldl9jYl9ieV9iZGEoYmRhZGRyKTsKLSAgICBpZiAoIWRldl9jYikgewotICAgICAgZGV2X2NiID0gYnRhX2NzaXBfY3JlYXRlX2Rldl9jYl9mb3JfYmRhKGJkYWRkcik7Ci0gICAgfQotCi0gICAgY2hhciAqbmV4dCA9IE5VTEw7Ci0gICAgY2hhciAqY3NldHMgPSBzdHJkdXAoY29vcmRpbmF0ZWRfc2V0cyk7Ci0gICAgLyogU2V0IExldmVsIHBhcnNpbmcqLwotICAgIGNoYXIgKnNldF9kZXRhaWxzID0gc3RydG9rX3IoY3NldHMsICIgIiwgJm5leHQpOwotCi0gICAgZG8gewotICAgICAgdEJUQV9DU0lQX0NTRVQgKmNzZXQgPSBOVUxMOwotICAgICAgdWludDhfdCBzZXRfaWQgPSBJTlZBTElEX1NFVF9JRCwgc2l6ZSA9IDAsIHJhbmsgPSAwOwotICAgICAgdWludDE2X3Qgc3J2Y19oYW5kbGUgPSAwOwotICAgICAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gICAgICB1aW50OF90IHNpcmtbU0lSS19TSVpFXSA9IHt9OwotICAgICAgYm9vbCBsb2NrX3N1cHBvcnQgPSBmYWxzZTsKLQotICAgICAgY2hhciAqcGFydDsKLSAgICAgIGNoYXIgKnBvc247Ci0gICAgICAvKiBzZXBhcmF0aW5nIHByb3BlcnRpZXMgb2Ygc2V0Ki8KLSAgICAgIHBhcnQgPSBzdHJ0b2tfcihzZXRfZGV0YWlscywgIn4iLCAmcG9zbik7Ci0KLSAgICAgIHdoaWxlIChwYXJ0ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAgY2hhciAqcHRyID0gTlVMTDsKLSAgICAgICAgICAvKiBEZWNvZGUgcHJvcGVydHkgdHlwZSBhbmQgaXRzIHZhbHVlKi8KLSAgICAgICAgICBjaGFyICpwcm9wX2RldGFpbHMgPSBzdHJ0b2tfcihwYXJ0LCAiOiIsICZwdHIpOwotCi0gICAgICAgICAgaWYgKHByb3BfZGV0YWlscyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjaGFyKiBwcm9wX3ZhbCA9IHN0cnRva19yKE5VTEwsICI6IiwgJnB0cik7Ci0gICAgICAgICAgICBpZiAocHJvcF92YWwpIHsKLSAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocHJvcF9kZXRhaWxzLCAiU0VUX0lEIikpIHsKLSAgICAgICAgICAgICAgICBzZXRfaWQgPSAodWludDhfdClhdG9pKHByb3BfdmFsKTsKLSAgICAgICAgICAgICAgICBjc2V0ID0gYnRhX2NzaXBfZ2V0X29yX2NyZWF0ZV9jc2V0KHNldF9pZCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjc2V0KSBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb3QgY3NldCBlbXB0eSI7Ci0gICAgICAgICAgICAgICAgZWxzZSBMT0coSU5GTykgPDwgInZhbGlkICIgPDwgK2NzZXQtPnNldF9pZDsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHByb3BfZGV0YWlscywgIlNJWkUiKSkgewotICAgICAgICAgICAgICAgIHNpemUgPSAodWludDhfdClhdG9pKHByb3BfdmFsKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHByb3BfZGV0YWlscywgIlNJUksiKSkgewotICAgICAgICAgICAgICAgIGhleF9zdHJpbmdfdG9fYnl0ZV9hcnIocHJvcF92YWwsIHNpcmssIFNJUktfU0laRSAqIDIpOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAocHJvcF9kZXRhaWxzLCAiSU5DTFVESU5HX1NSVkMiKSkgewotICAgICAgICAgICAgICAgIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKHByb3BfdmFsKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHByb3BfZGV0YWlscywgIkxPQ0tfU1VQUE9SVCIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAocHJvcF92YWwsICJ0cnVlIikpIGxvY2tfc3VwcG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChwcm9wX2RldGFpbHMsICJSQU5LIikpIHsKLSAgICAgICAgICAgICAgICByYW5rID0gKHVpbnQ4X3QpYXRvaShwcm9wX3ZhbCk7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChwcm9wX2RldGFpbHMsICJTUlZDX0hBTkRMRSIpKSB7Ci0gICAgICAgICAgICAgICAgc3J2Y19oYW5kbGUgPSAodWludDE2X3QpYXRvaShwcm9wX3ZhbCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwYXJ0ID0gc3RydG9rX3IoTlVMTCwgIn4iLCAmcG9zbik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzZXRfaWQgPCBCVEFfTUFYX1NVUFBPUlRFRF9TRVRTKSB7Ci0gICAgICAgIGlmICghY3NldCkgewotICAgICAgICAgIC8vIENyZWF0ZSBuZXcgY29vcmRpbmF0ZWQgc2V0IGluc2F0bmNlIGFuZCBkZXZpY2UgdG8gaXQKLSAgICAgICAgICBjc2V0ID0gYnRhX2NzaXBfZ2V0X29yX2NyZWF0ZV9jc2V0KHNldF9pZCwgZmFsc2UpOwotICAgICAgICAgIGNzZXQtPnNldF9pZCA9IHNldF9pZDsKLSAgICAgICAgICBjc2V0LT5zaXplID0gc2l6ZTsKLSAgICAgICAgICBjc2V0LT5wX3NydmNfdXVpZCA9IHV1aWQ7Ci0gICAgICAgICAgY3NldC0+dG90YWxfZGlzY292ZXJlZCA9IDE7Ci0gICAgICAgICAgY3NldC0+c2V0X21lbWJlcnMucHVzaF9iYWNrKGJkYWRkcik7Ci0KLSAgICAgICAgICAvLyBjcmVhdGUgY29vcmRpbmF0ZWQgc2V0IGNvbnRyb2wgYmxvY2sKLSAgICAgICAgICB0QlRBX0NTRVRfQ0IqIGNzZXRfY2IgPSAmYnRhX2NzaXBfY2IuY3NldHNfY2Jbc2V0X2lkXTsKLSAgICAgICAgICBjc2V0X2NiLT5zZXRfaWQgPSBzZXRfaWQ7Ci0gICAgICAgICAgY3NldF9jYi0+aW5fdXNlID0gdHJ1ZTsKLSAgICAgICAgICBtZW1jcHkoY3NldF9jYi0+c2lyaywgc2lyaywgU0lSS19TSVpFKTsKLSAgICAgICAgICBpZiAocmFuayAhPSAwKSB7Ci0gICAgICAgICAgICBjc2V0X2NiLT5vcmRlcmVkX21lbWJlcnMuaW5zZXJ0KHtyYW5rLCBiZGFkZHJ9KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvL0xPRyhJTkZPKSA8PCAiRXhpc3Rpbmcgc2V0ID0gIiA8PCArY3NldC0+c2V0X2lkOwotICAgICAgICAgIGNzZXQtPnRvdGFsX2Rpc2NvdmVyZWQrKzsKLSAgICAgICAgICBjc2V0LT5zZXRfbWVtYmVycy5wdXNoX2JhY2soYmRhZGRyKTsKLQotICAgICAgICAgIHRCVEFfQ1NFVF9DQiogY3NldF9jYiA9ICZidGFfY3NpcF9jYi5jc2V0c19jYltzZXRfaWRdOwotICAgICAgICAgIGlmIChyYW5rICE9IDApIHsKLSAgICAgICAgICAgIGNzZXRfY2ItPm9yZGVyZWRfbWVtYmVycy5pbnNlcnQoe3JhbmssIGJkYWRkcn0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFzc2lnbiBzZXJ2aWNlIHByb3BlcnRpZXMgLSBzZXRfaWQgYW5kIGJkX2FkZHIKLSAgICAgICAgdEJUQV9DU0lTX1NSVkNfSU5GTyAqc3J2YyA9IGJ0YV9jc2lwX2dldF9jc2lzX3NlcnZpY2VfY2IoZGV2X2NiKTsKLSAgICAgICAgaWYgKHNydmMpIHsKLSAgICAgICAgICBzcnZjLT5zZXRfaWQgPSBzZXRfaWQ7Ci0gICAgICAgICAgc3J2Yy0+YmRfYWRkciA9IGJkYWRkcjsKLSAgICAgICAgICBzcnZjLT5zaXplID0gc2l6ZTsKLSAgICAgICAgICBzcnZjLT5yYW5rID0gcmFuazsKLSAgICAgICAgICBzcnZjLT5zZXJ2aWNlX2hhbmRsZSA9IHNydmNfaGFuZGxlOwotICAgICAgICAgIG1lbWNweShzcnZjLT5zaXJrLCBzaXJrLCBTSVJLX1NJWkUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoKHNldF9kZXRhaWxzID0gc3RydG9rX3IoTlVMTCwgIiAiLCAmbmV4dCkpICE9IE5VTEwpOwotCi0gICAgc25vZGUgPSBjb25maWdfc2VjdGlvbl9uZXh0KHNub2RlKTsKLSAgfQotCi0gIC8qTE9HKElORk8pIDw8ICItLS0tLS0tLS0tLS0tLS0tLS1ERUJVRy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOwotICBMT0coSU5GTykgPDwgInByaW50aW5nIGFsbCBsb2FkZWQgY29vcmRpbmF0ZWQgc2V0cyI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClidGFfY3NpcF9jYi5jc2V0cy5zaXplKCk7IGkrKykgewotICAgIHRCVEFfQ1NJUF9DU0VUIHNldCA9IGJ0YV9jc2lwX2NiLmNzZXRzW2ldOwotICAgIExPRyhJTkZPKSA8PCAiIFNldCBJRCA9ICIgPDwgK3NldC5zZXRfaWQKLSAgICAgICAgICAgICAgPDwgIiBTaXplID0gIiA8PCArc2V0LnNpemUKLSAgICAgICAgICAgICAgPDwgIiB0b3RhbCBkaXNjb3ZlcmVkID0gIiA8PCArc2V0LnRvdGFsX2Rpc2NvdmVyZWQ7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KXNldC5zZXRfbWVtYmVycy5zaXplKCk7IGorKykgewotICAgICAgTE9HKElORk8pIDw8ICIgTWVtYmVyICgiIDw8ICsoaisxKSA8PCIpID0gIiA8PCBzZXQuc2V0X21lbWJlcnNbal0uVG9TdHJpbmcoKTsKLSAgICB9Ci0gIH0qLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9wcmVzZXJ2ZV9jc2V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBmdW5jdGlvbiB1c2VkIHRvIHByZXNlcnZlIGNvb3JkaW5hdGVkIHNldCBkZXRhaWxzIHRvIHN0b3JhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfY3NpcF9wcmVzZXJ2ZV9jc2V0ICh0QlRBX0NTSVNfU1JWQ19JTkZPKiBzcnZjKSB7Ci0gIHRCVEFfQ1NJUF9ERVZfQ0IqIHBfY2IgPSBidGFfY3NpcF9maW5kX2Rldl9jYl9ieV9iZGEoc3J2Yy0+YmRfYWRkcik7Ci0KLSAgaWYgKCFwX2NiKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiIERldmljZSBjYiByZWNvcmQgbm90IGZvdW5kIGZvciAiIDw8IHNydmMtPmJkX2FkZHI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcmIHNldF9pbmZvID0gcF9jYi0+c2V0X2luZm87Ci0gIGlmIChzZXRfaW5mby5zaXplKCkgPiAwKSB7Ci0gICAgc2V0X2luZm8gKz0gIiAiOwotICB9Ci0KLSAgc2V0X2luZm8gKz0gIlNFVF9JRDoiICsgc3RkOjp0b19zdHJpbmcoc3J2Yy0+c2V0X2lkKTsKLQotICBpZiAoc3J2Yy0+c2l6ZV9oYW5kbGUpIHsKLSAgICBzZXRfaW5mbyArPSAiflNJWkU6IiArIHN0ZDo6dG9fc3RyaW5nKHNydmMtPnNpemUpOwotICB9Ci0KLSAgY2hhciBzaXJrW1NJUktfU0laRSAqIDIgKyAxXSA9IHswfTsKLSAgYnl0ZV9hcnJfdG9faGV4X3N0cmluZyhzcnZjLT5zaXJrLCBzaXJrLCBTSVJLX1NJWkUpOwotICBzZXRfaW5mbyArPSAiflNJUks6IiArIHN0ZDo6c3RyaW5nKHNpcmspOwotCi0gIGlmICghc3J2Yy0+aW5jbHVkaW5nX3NydmNfdXVpZC5Jc0VtcHR5KCkpIHsKLSAgICBzZXRfaW5mbyArPSAifklOQ0xVRElOR19TUlZDOiIgKyBzcnZjLT5pbmNsdWRpbmdfc3J2Y191dWlkLlRvU3RyaW5nKCk7Ci0gIH0KLQotICBpZiAoc3J2Yy0+bG9ja19oYW5kbGUpIHsKLSAgICBzZXRfaW5mbyArPSAifkxPQ0tfU1VQUE9SVDoiICsgc3RkOjpzdHJpbmcoKHNydmMtPmxvY2tfaGFuZGxlID8gInRydWUiIDogImZhbHNlIikpOwotICB9Ci0KLSAgaWYgKHNydmMtPnJhbmtfaGFuZGxlKSB7Ci0gICAgc2V0X2luZm8gKz0gIn5SQU5LOiIgKyBzdGQ6OnRvX3N0cmluZyhzcnZjLT5yYW5rKTsKLSAgfQotCi0gIHNldF9pbmZvICs9ICJ+U1JWQ19IQU5ETEU6IiArIHN0ZDo6dG9fc3RyaW5nKHNydmMtPnNlcnZpY2VfaGFuZGxlKTsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IHNldF9pbmZvOwotCi0gIGJ0aWZfY29uZmlnX3NldF9zdHIocF9jYi0+YWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAiREdyb3VwIiwgc2V0X2luZm8uY19zdHIoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2dldF9zYWx0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBmdW5jdGlvbiBzMTogVXNlZCB0byBjb21wdXRlIFNBTFQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBPY3RldDE2IChjaXBoZXIgLSBTQUxUKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU9jdGV0MTYgYnRhX2NzaXBfZ2V0X3NhbHQoKSB7Ci0gIE9jdGV0MTYgc2FsdCA9IHt9OwotICBPY3RldDE2IHplcm8gPSB7fTsKLSAgdWludDhfdCBTSVJLZW5jW10gPSB7MHg1MywgMHg0OSwgMHg1MiwgMHg0QiwgMHg2NSwgMHg2RSwgMHg2M307Ci0KLSAgc2FsdCA9IGJ0YV9jc2lwX2dldF9hZXNfY21hY19yZXN1bHQoemVybywgU0lSS2VuYywgNyk7Ci0KLSAgcmV0dXJuIHNhbHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9jc2lwX2NvbXB1dGVfVAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmlyc3Qgc3RlcCBvZiBrMSBmdW5jdGlvbi4gVXNlZCB0byBjb21wdXRlIFQgZnJvbSBTQUxUIGFuZCBLLgotICoKLSAqIFJldHVybnMgICAgICAgICAgT2N0ZXQxNiAoY2lwaGVyIC0gVCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1PY3RldDE2IGJ0YV9jc2lwX2NvbXB1dGVfVChPY3RldDE2IHNhbHQsIE9jdGV0MTYgSykgewotICBPY3RldDE2IFQgPSB7fTsKLQotICBUID0gYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdChzYWx0LCBLKTsKLQotICByZXR1cm4gVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2Vjb25kIHN0ZXAgb2YgazEgZnVuY3Rpb24uIFVzZWQgdG8gY29tcHV0ZSBrMSBmcm9tIFQgYW5kICJjc2lzIi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE9jdGV0MTYgKGNpcGhlciAtIGsxKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU9jdGV0MTYgYnRhX2NzaXBfY29tcHV0ZV9rMShPY3RldDE2IFQpIHsKLSAgT2N0ZXQxNiBrMSA9IHt9OwotICB1aW50OF90IGNzaXNbXSA9IHsweDYzLDB4NzMsMHg2OSwweDczfTsKLQotICBrMSA9IGJ0YV9jc2lwX2dldF9hZXNfY21hY19yZXN1bHQoVCwgY3NpcywgNCk7Ci0KLSAgcmV0dXJuIGsxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfY3NpcF9nZXRfYWVzX2NtYWNfcmVzdWx0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBzZGYgZnVuY3Rpb24uIFVzZWQgdG8gY29tcHV0ZSBTSVJLIGZyb20gZW5jcnlwdGVkIFNJUksgYW5kIGsxLgotICoKLSAqIFJldHVybnMgICAgICAgICAgT2N0ZXQxNiAoU0lSSykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICBidGFfY3NpcF9nZXRfZGVjcnlwdGVkX3NpcmsoT2N0ZXQxNiBrMSwgdWludDhfdCAqZW5jX3NpcmssIHVpbnQ4X3QgKnNpcmspIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgc2lya1tpXSA9IGsxW2ldIF4gZW5jX3NpcmtbaV07Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXNlZCB0byBnZXQgYWVzLWNtYWMgcmVzdWx0IChmb3IgMTYgYnl0ZSBpbnB1dCBhbmQgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgIGluIExTQi0+TVNCIG9yZGVyKQotICoKLSAqIFJldHVybnMgICAgICAgICAgT2N0ZXQxNiAoY2lwaGVyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU9jdGV0MTYgYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdChjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IE9jdGV0MTYmIG1lc3NhZ2UpIHsKLSAgT2N0ZXQxNiByX2tleSwgcl9tZXNzYWdlLCByX3Jlc3VsdDsKLQotICAvLyByZXZlcnNlIGlucHV0cyBhcyByZXF1aXJlZCBieSBjcnlwdG9fdG9vbGJveDo6YWVzX2NtYWMKLSAgc3RkOjpyZXZlcnNlX2NvcHkoa2V5LmJlZ2luKCksIGtleS5lbmQoKSwgcl9rZXkuYmVnaW4oKSk7Ci0gIHN0ZDo6cmV2ZXJzZV9jb3B5KG1lc3NhZ2UuYmVnaW4oKSwgbWVzc2FnZS5lbmQoKSwgcl9tZXNzYWdlLmJlZ2luKCkpOwotCi0gIE9jdGV0MTYgcmVzdWx0ID0gY3J5cHRvX3Rvb2xib3g6OmFlc19jbWFjKHJfa2V5LCByX21lc3NhZ2UuZGF0YSgpLCByX21lc3NhZ2Uuc2l6ZSgpKTsKLQotICAvLyByZXZlcnNlIHRoZSByZXN1bHQgdG8gZ2V0IExTQi0+TVNCIG9yZGVyCi0gIHN0ZDo6cmV2ZXJzZV9jb3B5KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIHJfcmVzdWx0LmJlZ2luKCkpOwotCi0gIHJldHVybiByX3Jlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2NzaXBfZ2V0X2Flc19jbWFjX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXNlZCB0byBnZXQgYWVzLWNtYWMgcmVzdWx0IChmb3IgdmFyaWFibGUgaW5wdXQgYW5kIG91dHB1dAotICogICAgICAgICAgICAgICAgICBpbiBMU0ItPk1TQiBvcmRlcikKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE9jdGV0MTYgKGNpcGhlcikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1PY3RldDE2IGJ0YV9jc2lwX2dldF9hZXNfY21hY19yZXN1bHQoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCB1aW50OF90KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgpIHsKLSAgT2N0ZXQxNiByX2tleSwgcl9yZXN1bHQ7Ci0KLSAgLy8gcmV2ZXJzZSBpbnB1dHMgYXMgcmVxdWlyZWQgYnkgY3J5cHRvX3Rvb2xib3g6OmFlc19jbWFjCi0gIHN0ZDo6cmV2ZXJzZV9jb3B5KGtleS5iZWdpbigpLCBrZXkuZW5kKCksIHJfa2V5LmJlZ2luKCkpOwotICB1aW50OF90ICppbnB1dF9idWYgPSAodWludDhfdCAqKW9zaV9tYWxsb2MobGVuZ3RoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgIGlucHV0X2J1ZltpXSA9IGlucHV0W2xlbmd0aCAtIDEgLSBpXTsKLSAgfQotCi0gIE9jdGV0MTYgcmVzdWx0ID0gY3J5cHRvX3Rvb2xib3g6OmFlc19jbWFjKHJfa2V5LCBpbnB1dF9idWYsIGxlbmd0aCk7Ci0KLSAgLy8gcmV2ZXJzZSB0aGUgcmVzdWx0IHRvIGdldCBMU0ItPk1TQiBvcmRlcgotICBzdGQ6OnJldmVyc2VfY29weShyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCByX3Jlc3VsdC5iZWdpbigpKTsKLQotICByZXR1cm4gcl9yZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ5dGVfYXJyX3RvX2hleF9zdHJpbmcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZ1bmN0aW9uIHVzZWQgdG8gZ2V0IGhleCByZXByZXNlbnRhdGlvbiBpbiBzdHJpbmcgZm9ybWF0IGZvciBieXRlW10uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBieXRlX2Fycl90b19oZXhfc3RyaW5nKHVpbnQ4X3QqIGJ5dGVfYXJyLCBjaGFyKiBzdHIsIHVpbnQ4X3QgbGVuKSB7Ci0gIGludCBpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gaGV4IGZvcm1hdCBzdHJpbmciOwotCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgewotICAgICAgc25wcmludGYoc3RyICsgKGkgKiAyKSwgKGxlbiAqIDIgKyAxKSwgIiUwMlgiLCBieXRlX2FycltpXSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGV4X3N0cmluZ190b19ieXRlX2FycgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZnVuY3Rpb24gdXNlZCB0byBnZXQgYnl0ZSBhcnJheSBmcm9tIGhleCBmb3JtYXQgc3RyaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaGV4X3N0cmluZ190b19ieXRlX2FycihjaGFyICpzdHIsIHVpbnQ4X3QqIGJ5dGVfYXJyLCB1aW50OF90IGxlbikgewotICBmb3IgKGludCBsZW5ndGggPSAwOyAqc3RyOyBzdHIgKz0gMiwgbGVuZ3RoKyspCi0gICAgIHNzY2FuZihzdHIsICIlMDJoaHgiLCAmYnl0ZV9hcnJbbGVuZ3RoXSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGlzX2tleV9lbXB0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiBrZXkgaXMgMCBpbnRpYWxpemVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgYWxsIGVsZW1lbnRzIGFyZSAwLiBPdGhlcndpc2UsIGZhbHNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgaXNfa2V5X2VtcHR5KE9jdGV0MTYmIGtleSkgewotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGtleS5zaXplKCk7IGkrKykgewotICAgIGlmIChrZXlbaV0gIT0gMCkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9kbS9idGFfZG1fYWR2X2F1ZGlvLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9kbS9idGFfZG1fYWR2X2F1ZGlvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmYxZWE0Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvZG0vYnRhX2RtX2Fkdl9hdWRpby5jYworKysgL2Rldi9udWxsCkBAIC0xLDExODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0YV9kbV9hZHZfYXVkaW8iCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF9jb21tb24uaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF90eXBlcy5oIgotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGFfZG1fYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2RtX2NvLmgiCi0jaW5jbHVkZSAiYnRhL2RtL2J0YV9kbV9pbnQuaCIKLSNpbmNsdWRlICJidGFfY3NpcF9hcGkuaCIKLSNpbmNsdWRlICJidGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiZ2FwX2FwaS5oIiAvKiBGb3IgR0FQX0JsZVJlYWRQZWVyUHJlZkNvbm5QYXJhbXMgKi8KLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic2RwX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9zZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidXRsLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcF9jb25maWcuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9wcm9maWxlX2NvbmZpZy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJzdGFjay9zZHAvc2RwaW50LmgiCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9kZXZpY2VfaW90X2NvbmZpZy5oIgotI2luY2x1ZGUgPGJ0Y29tbW9uX2ludGVyZmFjZV9kZWZzLmg+Ci0jaW5jbHVkZSA8Y29udHJvbGxlci5oPgotI2luY2x1ZGUgImJ0YV9nYXR0X3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRhX2RtX2Fkdl9hdWRpby5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2RtX2Fkdl9hdWRpby5oIgotCi0jaWYgKEdBUF9JTkNMVURFRCA9PSBUUlVFKQotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNlbmRpZgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLSNkZWZpbmUgQURWX0FVRElPX1ZPSUNFX1JPTEVfQklUIDIKLSNkZWZpbmUgQURWX0FVRElPX01FRElBX1JPTEVfQklUIDgKLSNkZWZpbmUgQ09OTl9MRVNTX01FRElBX1NJTktfUk9MRV9CSVQgMzIKLSNkZWZpbmUgQ09OTl9MRVNTX0FTU0lTVF9ST0xFX0JJVCA2NAotI2RlZmluZSBDT05OX0xFU1NfREVMRUdBVEVfUk9MRV9CSVQgMTI4Ci0jZGVmaW5lIFBBQ1NfQ1RfU1VQUE9SVF9WQUxVRSAyCi0jZGVmaW5lIFBBQ1NfVU1SX1NVUFBPUlRfVkFMVUUgNAotI2RlZmluZSBQQUNTX0NPTlZFUlNBVElPTkFMX1JPTEVfVkFMVUUgMgotI2RlZmluZSBQQUNTX01FRElBX1JPTEVfVkFMVUUgNAotCi0jZGVmaW5lIEJUQV9ETV9BRFZfQVVESU9fR0FUVF9DTE9TRV9ERUxBWV9UT1VUIDUwMDAKLQotVXVpZCBVVUlEX1NFUlZDTEFTU19XTUNQID0gVXVpZDo6RnJvbVN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIjI1ODdkYjNjLWNlNzAtNGZjOS05MzVmLTc3N2FiNDE4OGZkNyIpOwotCi1zdGQ6OnZlY3RvcjxibHVldG9vdGg6OlV1aWQ+IHV1aWRfc3J2X2Rpc2Nfc2VhcmNoOwotdEJUQV9MRV9BVURJT19ERVZfQ0IgYnRhX2xlX2F1ZGlvX2Rldl9jYjsKLXRCVEFfTEVBX1BBSVJJTkdfREIgYnRhX2xlYV9wYWlyaW5nX2NiOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Byb2Nfb3Blbl9ldnQodEJUQV9HQVRUQ19PUEVOKiBwX2RhdGEpOwotYm9vbCBpc19hZHZfYXVkaW9fdW5pY2FzdF9zdXBwb3J0ZWQoUmF3QWRkcmVzcyByZW1fYmRhLCBpbnQgY29ubl9pZCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dldF9sZWFfY3RybF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0cyB0aGUgY29udHJvbCBibG9jayBvZiBMRSBhdWRpbyBkZXZpY2UKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHRCVEFfTEVfQVVESU9fREVWX0lORk8qCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXRCVEFfTEVfQVVESU9fREVWX0lORk8qIGJ0YV9nZXRfbGVhX2N0cmxfY2IoUmF3QWRkcmVzcyBwZWVyX2FkZHIpIHsKLSAgdEJUQV9MRV9BVURJT19ERVZfSU5GTyAqcF9sZWFfY2IgPSBOVUxMOwotICBwX2xlYV9jYiA9ICZidGFfbGVfYXVkaW9fZGV2X2NiLmJ0YV9sZWFfZGV2X2luZm9bMF07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTEVBX0RFVklDRVMgOyBpKyspIHsKLSAgICAgIGlmIChwX2xlYV9jYltpXS5pbl91c2UgJiYKLSAgICAgICAgKHBfbGVhX2NiW2ldLnBlZXJfYWRkcmVzcyA9PSBwZWVyX2FkZHIpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiAlcyBDb250cm9sIGJsb2NrIEZvdW5kIGZvciBhZGRyICVzIiwKLSAgICAgICAgICBfX2Z1bmNfXywgcGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAmcF9sZWFfY2JbaV07Ci0gICAgICB9Ci0gIH0KLSAgQVBQTF9UUkFDRV9ERUJVRygiICVzIENvbnRyb2wgYmxvY2sgTm90IEZvdW5kIGZvciBhZGRyICVzIiwKLSAgICAgICAgICBfX2Z1bmNfXywgcGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBDYWxsYmFjayByZWNlaXZlZCB3aGVuIHJlbW90ZSBkZXZpY2UgQ29vcmRpbmF0ZWQgU2V0cyBTSVJLIGlzIHJlYWQgKi8KLXZvaWQgYnRhX2dhcF9nYXR0X3JlYWRfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLQotICB0QlRBX0xFX0FVRElPX0RFVl9JTkZPICpwX2xlYV9jYiA9Ci0gICAgYnRhX2dldF9sZWFfY3RybF9jYihidGFfbGVfYXVkaW9fZGV2X2NiLmdhdHRfb3BfYWRkcik7Ci0gIHVpbnQzMl90IHJvbGUgPSAwOwotICB1aW50OF90ICpwX3ZhbCA9IHZhbHVlOwotCi0gIFNUUkVBTV9UT19BUlJBWSgmcm9sZSwgcF92YWwsIGxlbik7Ci0KLSAgaWYgKHBfbGVhX2NiKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgQWRkciAlcyAiLCBfX2Z1bmNfXywKLSAgICAgIHBfbGVhX2NiLT5wZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgICAgaWYgKHBfbGVhX2NiLT50X3JvbGVfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBSb2xlIGRlcml2ZWQgYnkgVF9BRFZfQVVESU8gIgotICAgICAgICAgIDw8ICtyb2xlOwotICAgICAgICBpZiAocm9sZSAhPSAwKSAgewotICAgICAgICAgIGlmIChyb2xlICYgQURWX0FVRElPX1ZPSUNFX1JPTEVfQklUKQotICAgICAgICAgICAgcF9sZWFfY2ItPnV1aWRzLnB1c2hfYmFjayhVdWlkOjpGcm9tMTZCaXQKLSAgICAgICAgICAgICAgICAoVVVJRF9TRVJWQ0xBU1NfVF9BRFZfQVVESU9fVk9JQ0UpKTsKLSAgICAgICAgICBpZiAocm9sZSAmIEFEVl9BVURJT19NRURJQV9ST0xFX0JJVCkKLSAgICAgICAgICAgIHBfbGVhX2NiLT51dWlkcy5wdXNoX2JhY2soVXVpZDo6RnJvbTE2Qml0Ci0gICAgICAgICAgICAgICAgKFVVSURfU0VSVkNMQVNTX1RfQURWX0FVRElPX01FRElBX1NJTkspKTsKLSAgICAgICAgICBpZiAocm9sZSAmIENPTk5fTEVTU19NRURJQV9TSU5LX1JPTEVfQklUKQotICAgICAgICAgICAgcF9sZWFfY2ItPnV1aWRzLnB1c2hfYmFjayhVdWlkOjpGcm9tMTZCaXQKLSAgICAgICAgICAgICAgICAoVVVJRF9TRVJWQ0xBU1NfVF9BRFZfQVVESU9fQ09OTl9MRVNTX01FRElBX1NJTkspKTsKLSAgICAgICAgICBpZiAocm9sZSAmIENPTk5fTEVTU19BU1NJU1RfUk9MRV9CSVQpCi0gICAgICAgICAgICBwX2xlYV9jYi0+dXVpZHMucHVzaF9iYWNrKFV1aWQ6OkZyb20xNkJpdAotICAgICAgICAgICAgICAgIChVVUlEX1NFUlZDTEFTU19UX0FEVl9BVURJT19BU1NJU1QpKTsKLSAgICAgICAgICBpZiAocm9sZSAmIENPTk5fTEVTU19ERUxFR0FURV9ST0xFX0JJVCkKLSAgICAgICAgICAgIHBfbGVhX2NiLT51dWlkcy5wdXNoX2JhY2soVXVpZDo6RnJvbTE2Qml0Ci0gICAgICAgICAgICAgICAgKFVVSURfU0VSVkNMQVNTX1RfQURWX0FVRElPX0RFTEVHQVRFKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9sZWFfY2ItPmRpc2NfcHJvZ3Jlc3MtLTsKLSAgICAgIH0gZWxzZSBpZihoYW5kbGUgPT0gcF9sZWFfY2ItPnBhY3NfY2hhcl9oYW5kbGUpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGVyaXZlZCBieSBQQUNTICIgPDwgK3JvbGU7Ci0gICAgICAgIGlmIChyb2xlID09IDApIHsKLSAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIEluZm9ybWF0aW9uICI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGlzX2Fkdl9hdWRpb191bmljYXN0X3N1cHBvcnRlZChidGFfbGVfYXVkaW9fZGV2X2NiLmdhdHRfb3BfYWRkciwgY29ubl9pZCkpIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEFTQ1MgU3VwcG9ydGVkIGJ5IHRoZSByZW1vdGUgIjsKLSAgICAgICAgICAgIGlmICgocm9sZSAmIFBBQ1NfQ09OVkVSU0FUSU9OQUxfUk9MRV9WQUxVRSkgPT0gUEFDU19DVF9TVVBQT1JUX1ZBTFVFKQotICAgICAgICAgICAgICBwX2xlYV9jYi0+dXVpZHMucHVzaF9iYWNrKFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19QQUNTX0NUX1NVUFBPUlQpKTsKLSAgICAgICAgICAgIGlmICgocm9sZSAmIFBBQ1NfTUVESUFfUk9MRV9WQUxVRSkgPT0gUEFDU19VTVJfU1VQUE9SVF9WQUxVRSkKLSAgICAgICAgICAgICAgcF9sZWFfY2ItPnV1aWRzLnB1c2hfYmFjayhVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfUEFDU19VTVJfU1VQUE9SVCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvL1RPRE8gTEVBX0RCRyBDYWxsIEFQSSB3aGljaCB3aWxsIGJlIHByb3ZpZGVkIGJ5IEJBUAotICAgICAgICB9Ci0gICAgICAgIHBfbGVhX2NiLT5kaXNjX3Byb2dyZXNzLS07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBJbnZhbGlkIEhhbmRsZSBmb3IgTEUgQVVESU8iOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwX2xlYV9jYi0+ZGlzY19wcm9ncmVzcy0tOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgR0FUVCBSRUFEIEZBSUxFRCIgOwotICAgIH0KLQotICAgIGlmIChwX2xlYV9jYi0+ZGlzY19wcm9ncmVzcyA8PSAwKSB7Ci0gICAgICBidGFfZG1fbGVhX2Rpc2NfY29tcGxldGUocF9sZWFfY2ItPnBlZXJfYWRkcmVzcyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIElOVkFMSUQgQ09OVFJPTCBCTE9DSyIgOwotICB9Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dldF9hZHZfYXVkaW9fcm9sZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBBUEkgZ2V0cyByb2xlIGZvciBMRSBBdWRpbyBEZXZpY2UgYWZ0ZXIgYWxsIHNlcnZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIGRpc2NvdmVyZWQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZ2V0X2Fkdl9hdWRpb19yb2xlKFJhd0FkZHJlc3MgcGVlcl9hZGRyZXNzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgdEJUQV9MRV9BVURJT19ERVZfSU5GTyAqcF9sZWFfY2IgPSBidGFfZ2V0X2xlYV9jdHJsX2NiKHBlZXJfYWRkcmVzcyk7Ci0KLSAgYnRhX2xlX2F1ZGlvX2Rldl9jYi5nYXR0X29wX2FkZHIgPSBwZWVyX2FkZHJlc3M7Ci0KLSAgaWYgKHBfbGVhX2NiID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0VSUk9SKCIgJXMgQ29udHJvbCBibG9jayBkaWRudCBmaW5kIGZvciBwZWVyIGFkZHJlc3MgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRmV0Y2ggcmVtb3RlIGRldmljZSBnYXR0IHNlcnZpY2VzIGZyb20gZGF0YWJhc2UKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8Z2F0dDo6U2VydmljZT4qIHNlcnZpY2VzID0gQlRBX0dBVFRDX0dldFNlcnZpY2VzKGNvbm5faWQpOwotCi0gIGlmIChzZXJ2aWNlcykgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiBidGFfZ2V0X2Fkdl9hdWRpb19yb2xlIFNJWkUgJWQgYWRkciAlcyBjb25uX2lkICVkIiwKLSAgICAgICgqc2VydmljZXMpLnNpemUoKSxidGFfbGVfYXVkaW9fZGV2X2NiLmdhdHRfb3BfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICBjb25uX2lkKTsKLQotICAgIC8vIFNlYXJjaCBmb3IgQ1NJUyBzZXJ2aWNlIGluIHRoZSBkYXRhYmFzZQotICAgIGZvciAoY29uc3QgZ2F0dDo6U2VydmljZSYgc2VydmljZSA6ICpzZXJ2aWNlcykgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFNFUlZJQ0VTIElOIFJFTU9URSBERVZJQ0UgJXMgIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHNlcnZpY2UudXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpCi0gICAgICBpZiAoaXNfbGVfYXVkaW9fc2VydmljZShzZXJ2aWNlLnV1aWQpKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBzZXJ2aWNlLnV1aWQuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKTsKLSAgICAgICAgdWludDE2X3QgdXVpZF92YWwgPSAwOwotICAgICAgICBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgICAgICAgdXVpZF92YWwgPSBzZXJ2aWNlLnV1aWQuQXMxNkJpdCgpOwotICAgICAgICB9IGVsc2UgaWYobGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgICAgIGlmIChzZXJ2aWNlLnV1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfV01DUCkgewotICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFdNQ1AgU2VydmljZSBVVUlkIGZvdW5kIiwgX19mdW5jX18pOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpVdWlkPjo6aXRlcmF0b3IgaXRyOwotICAgICAgICAgICAgaXRyID0gc3RkOjpmaW5kKHBfbGVhX2NiLT51dWlkcy5iZWdpbigpLCBwX2xlYV9jYi0+dXVpZHMuZW5kKCksCi0gICAgICAgICAgICAgICAgVVVJRF9TRVJWQ0xBU1NfV01DUCk7Ci0gICAgICAgICAgICBpZiAoaXRyID09IHBfbGVhX2NiLT51dWlkcy5lbmQoKSkgewotICAgICAgICAgICAgICBwX2xlYV9jYi0+dXVpZHMucHVzaF9iYWNrKFVVSURfU0VSVkNMQVNTX1dNQ1ApOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAodXVpZF92YWwpIHsKLSAgICAgICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0NTSVM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6Q1NJUyBzZXJ2aWNlIGZvdW5kIFV1aWQ6ICVzICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS51dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIHBfbGVhX2NiLT5pc19jc2lwX3N1cHBvcnQgPSB0cnVlOwotICAgICAgICAgICAgYnRhX2RtX2NzaXNfZGlzY19jb21wbGV0ZShidGFfZG1fc2VhcmNoX2NiLnBlZXJfYmRhZGRyLCBmYWxzZSk7Ci0gICAgICAgICAgICAvLyBHZXQgQ2hhcmFjdGVyaXN0aWMgYW5kIENDQ0QgaGFuZGxlCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcykgewotICAgICAgICAgICAgICBVdWlkIGxvY2tfdXVpZCA9IGNoYXJhYy51dWlkOwotICAgICAgICAgICAgICBpZiAobG9ja191dWlkLkFzMTZCaXQoKSA9PSBVVUlEX1NFUlZDTEFTU19DU0lTX0xPQ0spIHsKLSAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlczogQ1NJUyByYW5rIGZvdW5kIFV1aWQ6ICVzICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBsb2NrX3V1aWQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAocF9sZWFfY2IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgVXVpZCBjc2lwX2xvY2tfdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIjZBRDgiKTsKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6VXVpZD46Oml0ZXJhdG9yIGl0cjsKLSAgICAgICAgICAgICAgICAgIGl0ciA9IHN0ZDo6ZmluZChwX2xlYV9jYi0+dXVpZHMuYmVnaW4oKSwgcF9sZWFfY2ItPnV1aWRzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICBjc2lwX2xvY2tfdXVpZCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoaXRyID09IHBfbGVhX2NiLT51dWlkcy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBwX2xlYV9jYi0+dXVpZHMucHVzaF9iYWNrKGNzaXBfbG9ja191dWlkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiICVzIE5vIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfVF9BRFZfQVVESU86Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFwX2xlYV9jYi0+aXNfaGFzX2ZvdW5kKSB7Ci0gICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBUX0FEVl9BVURJTyBzZXJ2aWNlIGZvdW5kIFV1aWQ6ICVzICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIHNlcnZpY2UudXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OlV1aWQ+OjppdGVyYXRvciBpdHI7Ci0gICAgICAgICAgICAgIGl0ciA9IHN0ZDo6ZmluZChwX2xlYV9jYi0+dXVpZHMuYmVnaW4oKSwgcF9sZWFfY2ItPnV1aWRzLmVuZCgpLAotICAgICAgICAgICAgICAgIHNlcnZpY2UudXVpZCk7Ci0gICAgICAgICAgICAgIGlmIChpdHIgPT0gcF9sZWFfY2ItPnV1aWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgcF9sZWFfY2ItPnV1aWRzLnB1c2hfYmFjayhzZXJ2aWNlLnV1aWQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vIEdldCBDaGFyYWN0ZXJpc3RpYyBhbmQgQ0NDRCBoYW5kbGUKLSAgICAgICAgICAgICAgZm9yIChjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyYgY2hhcmFjIDogc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MpIHsKLSAgICAgICAgICAgICAgICBVdWlkIHJvbGVfdXVpZCA9IGNoYXJhYy51dWlkOwotICAgICAgICAgICAgICAgIGlmIChyb2xlX3V1aWQuQXMxNkJpdCgpID09IFVVSURfU0VSVkNMQVNTX1RfQURWX0FVRElPX1JPTEVfQ0hBUikgewotICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6VF9BRFZfQVVESU8gUk9MRSBDSEFSIGZvdW5kIFV1aWQ6ICVzICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIHJvbGVfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgaWYgKHBfbGVhX2NiICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcF9sZWFfY2ItPmlzX3RfYXVkaW9fc3J2Y19mb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHBfbGVhX2NiLT5kaXNjX3Byb2dyZXNzKys7Ci0gICAgICAgICAgICAgICAgICAgIHBfbGVhX2NiLT50X3JvbGVfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiAlcyBObyBDb250cm9sIEJsb2NrIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAocF9sZWFfY2ItPnRfcm9sZV9oYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyB0X3JvbGVfaGFuZGxlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2xlYV9jYi0+dF9yb2xlX2hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgQnRhR2F0dFF1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoY29ubl9pZCwgcF9sZWFfY2ItPnRfcm9sZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICBidGFfZ2FwX2dhdHRfcmVhZF9jYiwgTlVMTCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19IQVM6Ci0gICAgICAgICAgICBpZiAoIXBfbGVhX2NiLT5pc190X2F1ZGlvX3NydmNfZm91bmQpIHsKLSAgICAgICAgICAgICAgcF9sZWFfY2ItPmlzX2hhc19mb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBIQVMgc2VydmljZSBmb3VuZCBVdWlkOiAlcyAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnV1aWQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpVdWlkPjo6aXRlcmF0b3IgaXRyOwotICAgICAgICAgICAgICBpdHIgPSBzdGQ6OmZpbmQocF9sZWFfY2ItPnV1aWRzLmJlZ2luKCksIHBfbGVhX2NiLT51dWlkcy5lbmQoKSwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnV1aWQpOwotICAgICAgICAgICAgICBpZiAoaXRyID09IHBfbGVhX2NiLT51dWlkcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIHBfbGVhX2NiLT51dWlkcy5wdXNoX2JhY2soc2VydmljZS51dWlkKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19QQUNTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoIXBfbGVhX2NiLT5wYWNzX2NoYXJfaGFuZGxlKSAmJgotICAgICAgICAgICAgICAoKCFwX2xlYV9jYi0+aXNfdF9hdWRpb19zcnZjX2ZvdW5kKSkpIHsKLSAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6UEFDUyBzZXJ2aWNlIGZvdW5kIFV1aWQ6ICVzICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIHNlcnZpY2UudXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6VXVpZD46Oml0ZXJhdG9yIGl0cjsKLSAgICAgICAgICAgICAgaXRyID0gc3RkOjpmaW5kKHBfbGVhX2NiLT51dWlkcy5iZWdpbigpLCBwX2xlYV9jYi0+dXVpZHMuZW5kKCksCi0gICAgICAgICAgICAgICAgc2VydmljZS51dWlkKTsKLSAgICAgICAgICAgICAgaWYgKGl0ciA9PSBwX2xlYV9jYi0+dXVpZHMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBwX2xlYV9jYi0+dXVpZHMucHVzaF9iYWNrKHNlcnZpY2UudXVpZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLy8gR2V0IENoYXJhY3RlcmlzdGljIGFuZCBDQ0NEIGhhbmRsZQotICAgICAgICAgICAgICBmb3IgKGNvbnN0IGdhdHQ6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWMgOiBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcykgewotICAgICAgICAgICAgICAgIFV1aWQgcm9sZV91dWlkID0gY2hhcmFjLnV1aWQ7Ci0gICAgICAgICAgICAgICAgaWYgKHJvbGVfdXVpZC5BczE2Qml0KCkgPT0gVVVJRF9TRVJWQ0xBU1NfU09VUkNFX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBQQUNTIFNvdXJjZSBjb250ZXh0IENIQVIgZm91bmQgVXVpZDogJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJvbGVfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgaWYgKHBfbGVhX2NiICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcF9sZWFfY2ItPmRpc2NfcHJvZ3Jlc3MrKzsKLSAgICAgICAgICAgICAgICAgICAgcF9sZWFfY2ItPnBhY3NfY2hhcl9oYW5kbGUgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiICVzIE5vIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChwX2xlYV9jYi0+cGFjc19jaGFyX2hhbmRsZSkgewotICAgICAgICAgICAgICAgIEJ0YUdhdHRRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGNvbm5faWQsIHBfbGVhX2NiLT5wYWNzX2NoYXJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgYnRhX2dhcF9nYXR0X3JlYWRfY2IsIE5VTEwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIgTm90IGEgTEUgQVVESU8gU0VSVklDRS0tIElHTk9SRSAlcyAiLAotICAgICAgICAgICAgICBzZXJ2aWNlLnV1aWQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChwX2xlYV9jYi0+ZGlzY19wcm9ncmVzcyA9PSAwKSB7Ci0gICAgYnRhX2RtX2xlYV9kaXNjX2NvbXBsZXRlKHBlZXJfYWRkcmVzcyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fY3Npc19kaXNjX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIEFQSSB1cGRhdGVzIGNzaXMgZGlzY292ZXJ5IGNvbXBsZXRlIHN0YXR1cwotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fY3Npc19kaXNjX2NvbXBsZXRlKFJhd0FkZHJlc3MgcF9iZF9hZGRyLCBib29sIHN0YXR1cykgewotICB0QlRBX0xFX0FVRElPX0RFVl9JTkZPICpwX2xlYV9jYiA9IGJ0YV9nZXRfbGVhX2N0cmxfY2IocF9iZF9hZGRyKTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXMgJWQiLCBfX2Z1bmNfXywgcF9iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgIHN0YXR1cyk7Ci0KLSAgaWYgKHBfbGVhX2NiKSB7Ci0gICAgcF9sZWFfY2ItPmNzaXBfZGlzY19wcm9ncmVzcyA9IHN0YXR1czsKLSAgfSBlbHNlIHsKLSAgICBSYXdBZGRyZXNzIHBzZXVkb19hZGRyID0gYnRhX2dldF9wc2V1ZG9fYWRkcl93aXRoX2lkX2FkZHIocF9iZF9hZGRyKTsKLSAgICBpZiAocHNldWRvX2FkZHIgIT0gUmF3QWRkcmVzczo6a0VtcHR5KSB7Ci0gICAgICBwX2xlYV9jYiA9IGJ0YV9nZXRfbGVhX2N0cmxfY2IocHNldWRvX2FkZHIpOwotICAgICAgaWYgKHBfbGVhX2NiKSB7Ci0gICAgICAgIHBfbGVhX2NiLT5jc2lwX2Rpc2NfcHJvZ3Jlc3MgPSBzdGF0dXM7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiAlcyBQc2V1ZG8gYWRkciBkaXNjX3Byb2dyZXNzIHJlc2V0dGVkIiwgX19mdW5jX18pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQVBQTF9UUkFDRV9ERUJVRygiICVzIE5vIENvbnRyb2wgQmxvY2sgZm9yIHBzZXVkbyBhZGRyIiwgX19mdW5jX18pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIgJXMgTm8gQ29udHJvbCBCbG9jayIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fbGVhX2Rpc2NfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgQVBJIHNlbmRzIHRoZSBldmVudCB0byB1cHBlciBsYXllciB0aGF0IExFIGF1ZGlvCi0gKiAgICAgICAgICAgICAgICAgIGdhdHQgb3BlcmF0aW9ucyBhcmUgY29tcGxldGUuCi0gKgotICogUGFyYW1ldGVyczogICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9sZWFfZGlzY19jb21wbGV0ZShSYXdBZGRyZXNzIHBfYmRfYWRkcikgewotICB0QlRBX0RNX1NFQVJDSCByZXN1bHQ7Ci0gIHRCVEFfTEVfQVVESU9fREVWX0lORk8gKnBfbGVhX2NiID0gYnRhX2dldF9sZWFfY3RybF9jYihwX2JkX2FkZHIpOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlcyIsIF9fZnVuY19fLCBwX2JkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBpZiAocF9sZWFfY2IgPT0gTlVMTCkgewotICAgIFJhd0FkZHJlc3MgcHNldWRvX2FkZHIgPSBidGFfZ2V0X3BzZXVkb19hZGRyX3dpdGhfaWRfYWRkcihwX2JkX2FkZHIpOwotICAgIHBfbGVhX2NiID0gYnRhX2dldF9sZWFfY3RybF9jYihwc2V1ZG9fYWRkcik7Ci0gICAgcF9iZF9hZGRyID0gcHNldWRvX2FkZHI7Ci0gIH0KLQotICBpZiAocF9sZWFfY2IpIHsKLSAgQVBQTF9UUkFDRV9ERUJVRygiY3NpcF9kaXNjX3Byb2dyZXNzICVkIiwgcF9sZWFfY2ItPmNzaXBfZGlzY19wcm9ncmVzcyk7Ci0gICAgaWYgKChwX2xlYV9jYi0+ZGlzY19wcm9ncmVzcyA9PSAwKSAmJgotICAgICAgICAocF9sZWFfY2ItPmNzaXBfZGlzY19wcm9ncmVzcykpIHsgLy9BZGQgQ1NJUyBjaGVjayBhbHNvCi0gICAgICByZXN1bHQuYWR2X2F1ZGlvX2Rpc2NfY21wbC5udW1fdXVpZHMgPSAwOwotICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IHBfbGVhX2NiLT51dWlkcy5zaXplKCk7IGkrKykgewotICAgICAgICByZXN1bHQuYWR2X2F1ZGlvX2Rpc2NfY21wbC5hZHZfYXVkaW9fdXVpZHNbaV0gPSBwX2xlYV9jYi0+dXVpZHNbaV07Ci0gICAgICAgIHJlc3VsdC5hZHZfYXVkaW9fZGlzY19jbXBsLm51bV91dWlkcysrOwotICAgICAgfQotCi0gICAgICByZXN1bHQuYWR2X2F1ZGlvX2Rpc2NfY21wbC5iZF9hZGRyID0gcF9iZF9hZGRyOwotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiU2VuZGluZyBDYWxsIGJhY2sgd2l0aCAgbm8gb2YgdXVpZHMncyIKLSAgICAgICAgInBfbGVhX2NiLT51dWlkcy5zaXplKCkgJWQiLCBwX2xlYV9jYi0+dXVpZHMuc2l6ZSgpKTsKLSAgICAgIGJ0YV9kbV9zZWFyY2hfY2IucF9zZWFyY2hfY2JhY2soQlRBX0RNX0xFX0FVRElPX1NFQVJDSF9DTVBMX0VWVCwgJnJlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIERpc2NvdmVyeSBpbiBwcm9ncmVzcyIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiICVzIE5vIENvbnRyb2wgQmxvY2siLCBfX2Z1bmNfXyk7Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZGRfYWR2X2F1ZGlvX3V1aWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgR0FUVCBjbGllbnQgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBpbiBETS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZGRfYWR2X2F1ZGlvX3V1aWQoUmF3QWRkcmVzcyBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUX0lEIHNydmNfdXVpZCkgewotICBhdXRvIGl0ciA9IGZpbmQodXVpZF9zcnZfZGlzY19zZWFyY2guYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgIHV1aWRfc3J2X2Rpc2Nfc2VhcmNoLmVuZCgpLCBzcnZjX3V1aWQudXVpZCk7Ci0KLSAgaWYoaXRyICE9IHV1aWRfc3J2X2Rpc2Nfc2VhcmNoLmVuZCgpKSB7Ci0gICAgdEJUQV9MRV9BVURJT19ERVZfSU5GTyAqcF9sZWFfY2IgPSBidGFfZ2V0X2xlYV9jdHJsX2NiKHBlZXJfYWRkcmVzcyk7Ci0gICAgaWYgKHBfbGVhX2NiICE9IE5VTEwpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiAlcyBDb250cm9sIEJsb2NrIEZvdW5kIiwgX19mdW5jX18pOwotCi0gICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OlV1aWQ+OjppdGVyYXRvciBpdHI7Ci0gICAgICBpdHIgPSBzdGQ6OmZpbmQocF9sZWFfY2ItPnV1aWRzLmJlZ2luKCksIHBfbGVhX2NiLT51dWlkcy5lbmQoKSwgc3J2Y191dWlkLnV1aWQpOwotICAgICAgaWYgKGl0ciA9PSBwX2xlYV9jYi0+dXVpZHMuZW5kKCkpIHsKLSAgICAgICAgcF9sZWFfY2ItPnV1aWRzLnB1c2hfYmFjayhzcnZjX3V1aWQudXVpZCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiAlcyBObyBDb250cm9sIEJsb2NrIiwgX19mdW5jX18pOwotICAgIH0KLSAgfQotfQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3NldF9sZWFfY3RybF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBHQVRUIGNsaWVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGluIERNLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdEJUQV9MRV9BVURJT19ERVZfSU5GTyogYnRhX3NldF9sZWFfY3RybF9jYihSYXdBZGRyZXNzIHBlZXJfYWRkcikgewotICB0QlRBX0xFX0FVRElPX0RFVl9JTkZPICpwX2xlYV9jYiA9IE5VTEw7Ci0KLSAgcF9sZWFfY2IgPSBidGFfZ2V0X2xlYV9jdHJsX2NiKHBlZXJfYWRkcik7Ci0KLSAgaWYgKHBfbGVhX2NiID09IE5VTEwpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBDb250cm9sIGJsb2NrIGNyZWF0ZSAiLCBfX2Z1bmNfXyk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MRUFfREVWSUNFUyA7IGkrKykgewotICAgICAgaWYgKCFidGFfbGVfYXVkaW9fZGV2X2NiLmJ0YV9sZWFfZGV2X2luZm9baV0uaW5fdXNlKSB7Ci0gICAgICAgIGJ0YV9sZV9hdWRpb19kZXZfY2IuYnRhX2xlYV9kZXZfaW5mb1tpXS5wZWVyX2FkZHJlc3MgPSBwZWVyX2FkZHI7Ci0gICAgICAgIGJ0YV9sZV9hdWRpb19kZXZfY2IuYnRhX2xlYV9kZXZfaW5mb1tpXS5pbl91c2UgPSB0cnVlOwotICAgICAgICBidGFfbGVfYXVkaW9fZGV2X2NiLmJ0YV9sZWFfZGV2X2luZm9baV0uY3NpcF9kaXNjX3Byb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgYnRhX2xlX2F1ZGlvX2Rldl9jYi5idGFfbGVhX2Rldl9pbmZvW2ldLmlzX2NzaXBfc3VwcG9ydCA9IGZhbHNlOwotICAgICAgICBidGFfbGVfYXVkaW9fZGV2X2NiLmJ0YV9sZWFfZGV2X2luZm9baV0uZ2F0dF9kaXNjX3Byb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgYnRhX2xlX2F1ZGlvX2Rldl9jYi5udW1fbGVhX2RldmljZXMrKzsKLSAgICAgICAgcmV0dXJuICgmKGJ0YV9sZV9hdWRpb19kZXZfY2IuYnRhX2xlYV9kZXZfaW5mb1tpXSkpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcF9sZWFfY2I7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fcmVzZXRfYWR2X2F1ZGlvX2Rldl9pbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIEdBVFQgY2xpZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gRE0uCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fcmVzZXRfYWR2X2F1ZGlvX2Rldl9pbmZvKFJhd0FkZHJlc3MgcF9hZGRyKSB7Ci0gIHRCVEFfTEVfQVVESU9fREVWX0lORk8gKnBfbGVhX2NiID0gYnRhX2dldF9sZWFfY3RybF9jYihwX2FkZHIpOwotCi0gIGlmIChwX2xlYV9jYiAhPSBOVUxMKSB7Ci0gICAgcF9sZWFfY2ItPnBlZXJfYWRkcmVzcyA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgICBwX2xlYV9jYi0+ZGlzY19wcm9ncmVzcyA9IDA7Ci0gICAgcF9sZWFfY2ItPmNvbm5faWQgPSAwOwotICAgIHBfbGVhX2NiLT50cmFuc3BvcnQgPSAwOwotICAgIHBfbGVhX2NiLT5pbl91c2UgPSBmYWxzZTsKLSAgICBwX2xlYV9jYi0+dF9yb2xlX2hhbmRsZSA9IDA7Ci0gICAgcF9sZWFfY2ItPmlzX2hhc19mb3VuZCA9IGZhbHNlOwotICAgIHBfbGVhX2NiLT5pc190X2F1ZGlvX3NydmNfZm91bmQgPSBmYWxzZTsKLSAgICBwX2xlYV9jYi0+cGFjc19jaGFyX2hhbmRsZSA9IDA7Ci0gICAgcF9sZWFfY2ItPnVzaW5nX2JyZWRyX2JvbmRpbmcgPSAwOwotICAgIHBfbGVhX2NiLT5nYXR0X2Rpc2NfcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICBwX2xlYV9jYi0+dXVpZHMuY2xlYXIoKTsKLSAgICBidGFfbGVfYXVkaW9fZGV2X2NiLmdhdHRfb3BfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgICBidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICAgIGJ0YV9sZV9hdWRpb19kZXZfY2IubnVtX2xlYV9kZXZpY2VzLS07Ci0gICAgYnRhX2xlX2F1ZGlvX2Rldl9jYi5ib25kX3Byb2dyZXNzID0gZmFsc2U7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX2RtX3Jlc2V0X2Fkdl9hdWRpb19kZXZfaW5mbyAlcyAgdHJhbnNwb3J0ICVkICIsCi0gICAgICBwX2xlYV9jYi0+cGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9sZWFfY2ItPnRyYW5zcG9ydCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9zZXRfYWR2X2F1ZGlvX2Rldl9pbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIEdBVFQgY2xpZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gRE0uCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fc2V0X2Fkdl9hdWRpb19kZXZfaW5mbyh0QlRBX0dBVFRDX09QRU4qIHBfZGF0YSkgewotICB0QlRBX0xFX0FVRElPX0RFVl9JTkZPICpwX2xlYV9jYiA9IGJ0YV9zZXRfbGVhX2N0cmxfY2IocF9kYXRhLT5yZW1vdGVfYmRhKTsKLQotICBpZiAocF9sZWFfY2IgIT0gTlVMTCkgewotICAgIHBfbGVhX2NiLT5wZWVyX2FkZHJlc3MgPSBwX2RhdGEtPnJlbW90ZV9iZGE7Ci0gICAgcF9sZWFfY2ItPmRpc2NfcHJvZ3Jlc3MgPSAwOwotICAgIHBfbGVhX2NiLT5jb25uX2lkID0gcF9kYXRhLT5jb25uX2lkOwotICAgIHBfbGVhX2NiLT50cmFuc3BvcnQgPSBwX2RhdGEtPnRyYW5zcG9ydDsvL0JUTV9Vc2VMZUxpbmsocF9kYXRhLT5yZW1vdGVfYmRhKTsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fc2V0X2Fkdl9hdWRpb19kZXZfaW5mbyAlcyAgdHJhbnNwb3J0ICVkICIsCi0gICAgICBwX2xlYV9jYi0+cGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9sZWFfY2ItPnRyYW5zcG9ydCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGlzX2Fkdl9hdWRpb191bmljYXN0X3N1cHBvcnRlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB1bmljYXN0IHN1cHBvcnQgaXMgdGhlcmUgb3Igbm90IG9uCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBzaWRlCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib29sIGlzX2Fkdl9hdWRpb191bmljYXN0X3N1cHBvcnRlZChSYXdBZGRyZXNzIHJlbV9iZGEsIGludCBjb25uX2lkKSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPGdhdHQ6OlNlcnZpY2U+KiBzZXJ2aWNlcyA9IEJUQV9HQVRUQ19HZXRTZXJ2aWNlcyhjb25uX2lkKTsKLQotICBpZiAoc2VydmljZXMpIHsKLSAgICBmb3IgKGNvbnN0IGdhdHQ6OlNlcnZpY2UmIHNlcnZpY2UgOiAqc2VydmljZXMpIHsKLSAgICAgIHVpbnQxNl90IHV1aWRfdmFsID0gc2VydmljZS51dWlkLkFzMTZCaXQoKTsKLSAgICAgIGlmICh1dWlkX3ZhbCA9PSBVVUlEX1NFUlZDTEFTU19BU0NTKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBpc19hZHZfYXVkaW9fZ3JvdXBfc3VwcG9ydGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIGNzaXAgc3VwcG9ydCBpcyB0aGVyZSBvciBub3Qgb24KLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIHNpZGUKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgaXNfYWR2X2F1ZGlvX2dyb3VwX3N1cHBvcnRlZChSYXdBZGRyZXNzIHJlbV9iZGEsIGludCBjb25uX2lkKSB7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPGdhdHQ6OlNlcnZpY2U+KiBzZXJ2aWNlcyA9IEJUQV9HQVRUQ19HZXRTZXJ2aWNlcyhjb25uX2lkKTsKLQotICBpZiAoc2VydmljZXMpIHsKLSAgICBmb3IgKGNvbnN0IGdhdHQ6OlNlcnZpY2UmIHNlcnZpY2UgOiAqc2VydmljZXMpIHsKLSAgICAgIGlmIChpc19sZV9hdWRpb19zZXJ2aWNlKHNlcnZpY2UudXVpZCkpIHsKLSAgICAgICAgdWludDE2X3QgdXVpZF92YWwgPSBzZXJ2aWNlLnV1aWQuQXMxNkJpdCgpOwotICAgICAgICBpZiAodXVpZF92YWwgPT0gVVVJRF9TRVJWQ0xBU1NfQ1NJUykKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGFfZG1fbGVhX2dhdHRjX2NhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIEdBVFQgY2xpZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gRE0uCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJ0YV9kbV9sZWFfZ2F0dGNfY2FsbGJhY2sodEJUQV9HQVRUQ19FVlQgZXZlbnQsIHRCVEFfR0FUVEMqIHBfZGF0YSkgewotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fbGVhX2dhdHRjX2NhbGxiYWNrIGV2ZW50ID0gJWQiLCBldmVudCk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRDX09QRU5fRVZUOgotICAgICAgaWYgKHBfZGF0YS0+c3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICBidGlmX2RtX3JlbGVhc2VfYWN0aW9uX3V1aWQoYnRhX2xlX2F1ZGlvX2Rldl9jYi5wZW5kaW5nX3BlZXJfYWRkcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNfcmVtb3RlX3N1cHBvcnRfYWR2X2F1ZGlvKGJ0YV9sZV9hdWRpb19kZXZfY2IucGVuZGluZ19wZWVyX2FkZHIpKSB7Ci0gICAgICAgICAgYnRhX2RtX3NldF9hZHZfYXVkaW9fZGV2X2luZm8oJnBfZGF0YS0+b3Blbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnRhX2RtX3Byb2Nfb3Blbl9ldnQoJnBfZGF0YS0+b3Blbik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9SRVNfRVZUOgotICAgICAgaWYgKGlzX3JlbW90ZV9zdXBwb3J0X2Fkdl9hdWRpbyhidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyKSkgewotICAgICAgICBidGFfYWRkX2Fkdl9hdWRpb191dWlkKGJ0YV9sZV9hdWRpb19kZXZfY2IucGVuZGluZ19wZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNydmNfcmVzLnNlcnZpY2VfdXVpZCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NFQVJDSF9DTVBMX0VWVDoKLSAgICAgIGlmIChpc19yZW1vdGVfc3VwcG9ydF9hZHZfYXVkaW8oYnRhX2xlX2F1ZGlvX2Rldl9jYi5wZW5kaW5nX3BlZXJfYWRkcikpIHsKLSAgICAgICAgYnRhX2dldF9hZHZfYXVkaW9fcm9sZShidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyLAotICAgICAgICAgICAgcF9kYXRhLT5zZWFyY2hfY21wbC5jb25uX2lkLAotICAgICAgICAgICAgcF9kYXRhLT5zZWFyY2hfY21wbC5zdGF0dXMpOwotICAgICAgICBpZiAoaXNfYWR2X2F1ZGlvX2dyb3VwX3N1cHBvcnRlZChidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyLAotICAgICAgICAgICAgIHBfZGF0YS0+c2VhcmNoX2NtcGwuY29ubl9pZCkpIHsKLSAgICAgICAgICBSYXdBZGRyZXNzIHBfaWRfYWRkciA9Ci0gICAgICAgICAgICBidGFfZ2V0X3JlbV9kZXZfaWRfYWRkcihidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyKTsKLSAgICAgICAgICBpZiAocF9pZF9hZGRyICE9IFJhd0FkZHJlc3M6OmtFbXB0eSkgewotICAgICAgICAgICAgQlRBX0NzaXBGaW5kQ3Npc0luc3RhbmNlKHBfZGF0YS0+c2VhcmNoX2NtcGwuY29ubl9pZCwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLnN0YXR1cywKLSAgICAgICAgICAgICAgICBwX2lkX2FkZHIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCVEFfQ3NpcEZpbmRDc2lzSW5zdGFuY2UocF9kYXRhLT5zZWFyY2hfY21wbC5jb25uX2lkLAotICAgICAgICAgICAgICAgIHBfZGF0YS0+c2VhcmNoX2NtcGwuc3RhdHVzLAotICAgICAgICAgICAgICAgIGJ0YV9sZV9hdWRpb19kZXZfY2IucGVuZGluZ19wZWVyX2FkZHIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19DTE9TRV9FVlQ6Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCJCVEFfR0FUVENfQ0xPU0VfRVZUIHJlYXNvbiA9ICVkLCBkYXRhIGNvbm5faWQgJWQsIgotICAgICAgICAgICJzZWFyY2ggY29ubl9pZCAlZCIsIHBfZGF0YS0+Y2xvc2UucmVhc29uLCBwX2RhdGEtPmNsb3NlLmNvbm5faWQsCi0gICAgICAgICAgYnRhX2RtX3NlYXJjaF9jYi5jb25uX2lkKTsKLQotICAgICAgaWYgKGlzX3JlbW90ZV9zdXBwb3J0X2Fkdl9hdWRpbyhidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyKSkgewotICAgICAgICBidGFfZG1fcmVzZXRfYWR2X2F1ZGlvX2Rldl9pbmZvKGJ0YV9sZV9hdWRpb19kZXZfY2IucGVuZGluZ19wZWVyX2FkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2RtX2Fkdl9hdWRpb19nYXR0X2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgQVBJIG9wZW5zIHRoZSBnYXR0IGNvbm4gYWZ0ZXIgZmluZGluZyBzZHAgcmVjb3JkCi0gKiAgICAgICAgICAgICAgICAgIGR1cmluZyBCUkVEUiBEaXNjb3ZlcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fYWR2X2F1ZGlvX2dhdHRfY29ubihSYXdBZGRyZXNzIHBfYmRfYWRkcikgewotICBBUFBMX1RSQUNFX0RFQlVHKCJidGFfZG1fYWR2X2F1ZGlvX2dhdHRfY29ubiAiKTsKLQotICBidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyID0gcF9iZF9hZGRyOwotCi0gIHRCVEFfTEVfQVVESU9fREVWX0lORk8gKnRtcF9sZWFfY2IgPSBidGFfZ2V0X2xlYV9jdHJsX2NiKHBfYmRfYWRkcik7Ci0gIGlmICh0bXBfbGVhX2NiICYmIHRtcF9sZWFfY2ItPmluX3VzZSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9hZHZfYXVkaW9fZ2F0dF9jb25uIEFscmVhZHkgZXhpc3RzICVkIiwKLSAgICAgIHRtcF9sZWFfY2ItPmNvbm5faWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUQV9HQVRUQ19BcHBSZWdpc3RlcihidGFfZG1fbGVhX2dhdHRjX2NhbGxiYWNrLAotICAgICAgYmFzZTo6QmluZChbXSh1aW50OF90IGNsaWVudF9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgICB0QlRBX0xFX0FVRElPX0RFVl9JTkZPICpwX2xlYV9jYiA9Ci0gICAgICAgICAgICBidGFfc2V0X2xlYV9jdHJsX2NiKGJ0YV9sZV9hdWRpb19kZXZfY2IucGVuZGluZ19wZWVyX2FkZHIpOwotICAgICAgICAgICAgaWYgKHBfbGVhX2NiKSB7Ci0gICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9kbV9hZHZfYXVkaW9fZ2F0dF9jb25uIENsaWVudCBJZDogJWQiLAotICAgICAgICAgICAgICAgICAgY2xpZW50X2lkKTsKLSAgICAgICAgICAgICAgcF9sZWFfY2ItPmdhdHRfaWYgPSBjbGllbnRfaWQ7Ci0gICAgICAgICAgICAgIHBfbGVhX2NiLT51c2luZ19icmVkcl9ib25kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgQlRBX0dBVFRDX09wZW4oY2xpZW50X2lkLCBidGFfbGVfYXVkaW9fZGV2X2NiLnBlbmRpbmdfcGVlcl9hZGRyLAotICAgICAgICAgICAgICAgICAgdHJ1ZSwgR0FUVF9UUkFOU1BPUlRfTEUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB9KSwgZmFsc2UpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9hZHZfYXVkaW9fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgQVBJIGNsb3NlcyB0aGUgZ2F0dCBjb25uIHdpdGggd2FzIG9wZW5lZCBieSBkbSBsYXllcgotICogICAgICAgICAgICAgICAgICBmb3Igc2VydmljZSBkaXNjb3ZlcnkgKG9yKSBvcGVuZWQgYWZ0ZXIgZmluZGluZyBzZHAgcmVjb3JkCi0gKiAgICAgICAgICAgICAgICAgIGR1cmluZyBCUkVEUiBEaXNjb3ZlcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidGFfZG1fYWR2X2F1ZGlvX2Nsb3NlKFJhd0FkZHJlc3MgcF9iZF9hZGRyKSB7Ci0gIHRCVEFfTEVfQVVESU9fREVWX0lORk8gKnBfbGVhX2NiID0gYnRhX2dldF9sZWFfY3RybF9jYihwX2JkX2FkZHIpOwotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocF9sZWFfY2IpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAlZCIsIF9fZnVuY19fLCBwX2xlYV9jYi0+Z2F0dF9pZik7Ci0gICAgaWYgKHBfbGVhX2NiLT51c2luZ19icmVkcl9ib25kaW5nKSB7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBjbG9zaW5nIExFIGNvbm4gZXN0IGR1ZSB0byBicmVkciBib25kaW5nICAlZCIsIF9fZnVuY19fLAotICAgICAgICAgIHBfbGVhX2NiLT5nYXR0X2lmKTsKLSAgICAgIEJUQV9HQVRUQ19BcHBEZXJlZ2lzdGVyKHBfbGVhX2NiLT5nYXR0X2lmKTsKLSAgICB9IGVsc2UgewotICAgICAgYnRhX3N5c19zdGFydF90aW1lcihidGFfZG1fc2VhcmNoX2NiLmdhdHRfY2xvc2VfdGltZXIsCi0gICAgICAgICAgQlRBX0RNX0FEVl9BVURJT19HQVRUX0NMT1NFX0RFTEFZX1RPVVQsCi0gICAgICAgICAgQlRBX0RNX0RJU0NfQ0xPU0VfVE9VVF9FVlQsIDApOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dldF9sZWFfY3RybF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBBUEkgcmV0dXJucyBwYWlyaW5nIGNvbnRyb2wgYmxvY2sgb2YgTEUgQVVESU8gREVWSUNFCi0gKgotICogUGFyYW1ldGVyczogICAgICB0QlRBX0RFVl9QQUlSSU5HX0NCCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVEFfREVWX1BBSVJJTkdfQ0IqIGJ0YV9nZXRfbGVhX3BhaXJfY2IoUmF3QWRkcmVzcyBwZWVyX2FkZHIpIHsKLSAgdEJUQV9ERVZfUEFJUklOR19DQiAqcF9sZWFfcGFpcl9jYiA9IE5VTEw7Ci0gIHBfbGVhX3BhaXJfY2IgPSAmYnRhX2xlYV9wYWlyaW5nX2NiLmJ0YV9kZXZfcGFpcl9kYlswXTsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgJXMgIiwgX19mdW5jX18sIHBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0xFQV9ERVZJQ0VTOyBpKyspIHsKLSAgICAgIGlmICgocF9sZWFfcGFpcl9jYltpXS5pbl91c2UpICYmCi0gICAgICAgIChwX2xlYV9wYWlyX2NiW2ldLnBfYWRkciA9PSBwZWVyX2FkZHIpKSB7Ci0gICAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIEZvdW5kICVzIGluZGV4IGkgJWQgIiwgX19mdW5jX18sCi0gICAgICAgICAgcF9sZWFfcGFpcl9jYltpXS5wX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBpKTsKLSAgICAgICAgcmV0dXJuICZwX2xlYV9wYWlyX2NiW2ldOwotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX3NldF9sZWFfY3RybF9jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBHQVRUIGNsaWVudCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGluIERNLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdEJUQV9ERVZfUEFJUklOR19DQiogYnRhX3NldF9sZWFfcGFpcl9jYihSYXdBZGRyZXNzIHBlZXJfYWRkcikgewotICB0QlRBX0RFVl9QQUlSSU5HX0NCICpwX2xlYV9wYWlyX2NiID0gTlVMTDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiYnRhX3NldF9sZWFfY3RybF9jYiAlcyIsIHBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIHBfbGVhX3BhaXJfY2IgPSBidGFfZ2V0X2xlYV9wYWlyX2NiKHBlZXJfYWRkcik7Ci0KLSAgaWYgKHBfbGVhX3BhaXJfY2IgPT0gTlVMTCkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoImJ0YV9zZXRfbGVhX2N0cmxfY2IgQ29udHJvbCBibG9jayBjcmVhdGUgIik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MRUFfREVWSUNFUyA7IGkrKykgewotICAgICAgaWYgKCFidGFfbGVhX3BhaXJpbmdfY2IuYnRhX2Rldl9wYWlyX2RiW2ldLmluX3VzZSkgewotICAgICAgICBidGFfbGVhX3BhaXJpbmdfY2IuYnRhX2Rldl9wYWlyX2RiW2ldLnBfYWRkciA9IHBlZXJfYWRkcjsKLSAgICAgICAgYnRhX2xlYV9wYWlyaW5nX2NiLmJ0YV9kZXZfcGFpcl9kYltpXS5pbl91c2UgPSB0cnVlOwotICAgICAgICBidGFfbGVhX3BhaXJpbmdfY2IuaXNfcGFpcmluZ19wcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgIGJ0YV9sZWFfcGFpcmluZ19jYi5udW1fZGV2aWNlcysrOwotICAgICAgICByZXR1cm4gKCYoYnRhX2xlYV9wYWlyaW5nX2NiLmJ0YV9kZXZfcGFpcl9kYltpXSkpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcF9sZWFfcGFpcl9jYjsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9kbV9yZXNldF9hZHZfYXVkaW9fZGV2X2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgQVBJIHJlc2V0cyBhbGwgdGhlIHBhaXJpbmcgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBsZQotICogICAgICAgICAgICAgICAgICBhdWRpbyByZW1vdGUgZGV2aWNlLgotICogUGFyYW1ldGVyczogICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRhX2RtX3Jlc2V0X2xlYV9wYWlyaW5nX2luZm8oUmF3QWRkcmVzcyBwX2FkZHIpIHsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBBZGRyICVzIiwgX19mdW5jX18sIHBfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGF1dG8gaXRyID0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5maW5kKHBfYWRkcik7Ci0gIGlmIChpdHIgIT0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5lbmQoKSkgewotICAgIGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfYWRkcl9tYXAuZXJhc2UocF9hZGRyKTsKLSAgfQotCi0gIGl0ciA9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfcmFuZF9hZGRyX21hcC5maW5kKHBfYWRkcik7Ci0gIGlmIChpdHIgIT0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9yYW5kX2FkZHJfbWFwLmVuZCgpKSB7Ci0gICAgYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9yYW5kX2FkZHJfbWFwLmVyYXNlKHBfYWRkcik7Ci0gIH0KLQotICB0QlRBX0RFVl9QQUlSSU5HX0NCICpwX2xlYV9wYWlyX2NiID0gTlVMTDsKLSAgcF9sZWFfcGFpcl9jYiA9IGJ0YV9nZXRfbGVhX3BhaXJfY2IocF9hZGRyKTsKLSAgaWYgKHBfbGVhX3BhaXJfY2IpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBSRVNFVFRJTkcgVkFMVUVTIiwgX19mdW5jX18pOwotICAgIHBfbGVhX3BhaXJfY2ItPmluX3VzZSA9IGZhbHNlOwotICAgIHBfbGVhX3BhaXJfY2ItPmlzX2R1bW9fZGV2aWNlID0gZmFsc2U7Ci0gICAgcF9sZWFfcGFpcl9jYi0+aXNfbGVfcGFpcmluZyA9IGZhbHNlOwotICAgIHBfbGVhX3BhaXJfY2ItPmRldl90eXBlID0gMDsKLSAgICBpZiAocF9sZWFfcGFpcl9jYi0+cF9pZF9hZGRyICE9IFJhd0FkZHJlc3M6OmtFbXB0eSkgewotICAgICAgaXRyID0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5maW5kKHBfbGVhX3BhaXJfY2ItPnBfaWRfYWRkcik7Ci0gICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBSRVNFVFRJTkcgQWRkciAlcyIsIF9fZnVuY19fLAotICAgICAgICBwX2xlYV9wYWlyX2NiLT5wX2lkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGlmIChpdHIgIT0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5lbmQoKSkgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBDbGVhcmluZyBJTlNJREUgTEVBIEFERFIgREIgTUFQIiwKLSAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfYWRkcl9tYXAuZXJhc2UocF9sZWFfcGFpcl9jYi0+cF9pZF9hZGRyKTsKLSAgICAgIH0KLSAgICAgIHBfbGVhX3BhaXJfY2ItPnBfaWRfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgICAgIHBfbGVhX3BhaXJfY2ItPnRyYW5zcG9ydCA9IDA7Ci0gICAgICBwX2xlYV9wYWlyX2NiLT5wX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gICAgfQotICAgIGJ0YV9sZWFfcGFpcmluZ19jYi5pc19wYWlyaW5nX3Byb2dyZXNzID0gZmFsc2U7Ci0gICAgYnRhX2xlYV9wYWlyaW5nX2NiLm51bV9kZXZpY2VzLS07Ci0gICAgYnRhX2xlYV9wYWlyaW5nX2NiLmlzX3NkcF9kaXNjb3ZlciA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgSU5WQUxJRCBDT05UUk9MIEJMT0NLIiwgX19mdW5jX18pOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBidGFfZG1fYmxlX2Fkdl9hdWRpb19pZGFkZHJfbWFwCi0gKgotICogRGVzY3JpcHRpb24gICAgIHN0b3JpbmcgdGhlIGlkZW50aXR5IGFkZHJlc3MgaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZQotICogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2suIEl0IHdpbGwgdXNlZCBmb3IgRFVNTyBkZXZpY2VzCi0gKgotICogUmV0dXJucyAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9kbV9ibGVfYWR2X2F1ZGlvX2lkYWRkcl9tYXAoUmF3QWRkcmVzcyBwX2JkX2FkZHIsCi0gIFJhd0FkZHJlc3MgcF9pZF9hZGRyKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIHBfYmRfYWRkciAlcyBpZF9hZGRyICVzICIsIF9fZnVuY19fLAotICAgIHBfYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfaWRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBpZiAoaXNfcmVtb3RlX3N1cHBvcnRfYWR2X2F1ZGlvKHBfYmRfYWRkcikpIHsKLSAgICBidGFfbGVhX3BhaXJpbmdfY2IuZGV2X2FkZHJfbWFwW3BfaWRfYWRkcl0gPSBwX2JkX2FkZHI7Ci0gICAgYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9yYW5kX2FkZHJfbWFwW3BfYmRfYWRkcl0gPSBwX2lkX2FkZHI7Ci0KLSAgICB0QlRBX0RFVl9QQUlSSU5HX0NCICpwX2xlYV9wYWlyX2NiID0gTlVMTDsKLSAgICBwX2xlYV9wYWlyX2NiID0gYnRhX2dldF9sZWFfcGFpcl9jYihwX2JkX2FkZHIpOwotICAgIGlmIChwX2xlYV9wYWlyX2NiKSB7Ci0gICAgICBpZiAocF9pZF9hZGRyICE9IHBfYmRfYWRkcikgewotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBpc19kdW1vX2RldmljZSAlcyIsIF9fZnVuY19fLAotICAgICAgICAgIHBfaWRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBwX2xlYV9wYWlyX2NiLT5wX2lkX2FkZHIgPSBwX2lkX2FkZHI7Ci0gICAgICAgIHBfbGVhX3BhaXJfY2ItPmlzX2R1bW9fZGV2aWNlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBidGFfcmVtb3RlX2Rldl9pZGVudGl0eV9hZGRyX21hdGNoKFJhd0FkZHJlc3MgcF9hZGRyKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzICIsIF9fZnVuY19fKTsKLQotICBhdXRvIGl0ciA9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfYWRkcl9tYXAuZmluZChwX2FkZHIpOwotCi0gIGlmIChpdHIgIT0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5lbmQoKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIElkZW50aXR5IEJEX0FERFIgJXMiLCBfX2Z1bmNfXywKLSAgICAgIHBfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGJ0YV9pc19icmVkcl9wcmltYXJ5X3RyYW5zcG9ydChSYXdBZGRyZXNzIHBfYmRfYWRkcikgewotCi0gIHRCVEFfREVWX1BBSVJJTkdfQ0IgKnBfbGVhX3BhaXJfY2IgPSBOVUxMOwotCi0gIHBfbGVhX3BhaXJfY2IgPSBidGFfZ2V0X2xlYV9wYWlyX2NiKHBfYmRfYWRkcik7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzICIsIF9fZnVuY19fKTsKLSAgaWYgKHBfbGVhX3BhaXJfY2IpIHsKLSAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyBUcmFuc3BvcnQgJWQgIiwgX19mdW5jX18sIHBfbGVhX3BhaXJfY2ItPnRyYW5zcG9ydCk7Ci0gICAgaWYgKHBfbGVhX3BhaXJfY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgYnRhX3JlbW90ZV9kZXZpY2VfaXNfZHVtbyhSYXdBZGRyZXNzIHBfYmRfYWRkcikgewotCi0gIGF1dG8gaXRyID0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5maW5kKHBfYmRfYWRkcik7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzIEFkZHIgJXMiLCBfX2Z1bmNfXywgcF9iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKGl0ciAhPSBidGFfbGVhX3BhaXJpbmdfY2IuZGV2X2FkZHJfbWFwLmVuZCgpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgRFVNTyBERVZJQ0UgSWRlbnRpdHkgQkRfQUREUiAlcyIsIF9fZnVuY19fLAotICAgICAgcF9iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGF1dG8gaXRyMiA9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfcmFuZF9hZGRyX21hcC5maW5kKHBfYmRfYWRkcik7Ci0gIGlmIChpdHIyICE9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfcmFuZF9hZGRyX21hcC5lbmQoKSkgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIER1bW8gYWRkcmVzc2VkICVzICVzICIsIF9fZnVuY19fLAotICAgICAgaXRyMi0+Zmlyc3QuVG9TdHJpbmcoKS5jX3N0cigpLCBpdHIyLT5zZWNvbmQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJhd0FkZHJlc3MgYnRhX2dldF9yZW1fZGV2X2lkX2FkZHIoUmF3QWRkcmVzcyBwX2JkX2FkZHIpIHsKLSAgdEJUQV9ERVZfUEFJUklOR19DQiAqcF9sZWFfcGFpcl9jYiA9IE5VTEw7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzICIsIF9fZnVuY19fKTsKLQotICBwX2xlYV9wYWlyX2NiID0gYnRhX2dldF9sZWFfcGFpcl9jYihwX2JkX2FkZHIpOwotICBpZiAocF9sZWFfcGFpcl9jYikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzICVzIiwgX19mdW5jX18sCi0gICAgICBwX2xlYV9wYWlyX2NiLT5wX2lkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gcF9sZWFfcGFpcl9jYi0+cF9pZF9hZGRyOwotICB9Ci0gIHJldHVybiBSYXdBZGRyZXNzOjprRW1wdHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBidGFfYWR2X2F1ZGlvX3VwZGF0ZV9ib25kX2RiCi0gKgotICogRGVzY3JpcHRpb24gICAgIFVwZGF0ZXMgcGFpcmluZyBjb250cm9sIGJsb2NrIG9mIHRoZSBkZXZpY2UgYW5kIHRoZSBib25kaW5nCi0gKiAgICAgICAgICAgICAgICAgaXMgaW5pdGlhdGVkIHVzaW5nIExFIHRyYW5zcG9ydCBvciBub3QuCi0gKgotICogUmV0dXJucyAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0YV9hZHZfYXVkaW9fdXBkYXRlX2JvbmRfZGIoUmF3QWRkcmVzcyBwX2JkX2FkZHIsIHVpbnQ4X3QgdHJhbnNwb3J0KSB7Ci0gIHRCVEFfREVWX1BBSVJJTkdfQ0IgKnBfZGV2X3BhaXJfY2IgPSBidGFfc2V0X2xlYV9wYWlyX2NiKHBfYmRfYWRkcik7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX2Rldl9wYWlyX2NiKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgQWRkciAlcyBUcmFuc3BvcnQgJWQiLCBfX2Z1bmNfXywKLSAgICAgIHBfYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksICB0cmFuc3BvcnQpOwotICAgIHBfZGV2X3BhaXJfY2ItPnBfYWRkciA9IHBfYmRfYWRkcjsKLSAgICBwX2Rldl9wYWlyX2NiLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0gICAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIGlmIChpc19yZW1vdGVfc3VwcG9ydF9hZHZfYXVkaW8ocF9kZXZfcGFpcl9jYi0+cF9hZGRyKSkKLSAgICAgICAgcF9kZXZfcGFpcl9jYi0+aXNfbGVfcGFpcmluZyA9IHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHBfZGV2X3BhaXJfY2ItPmlzX2xlX3BhaXJpbmcgPSBmYWxzZTsKLSAgICB9IGVsc2UKLSAgICAgIHBfZGV2X3BhaXJfY2ItPmlzX2xlX3BhaXJpbmcgPSBmYWxzZTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgaXNfbGVfYXVkaW9fc2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICBJdCBjaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gc2VydmljZSBpcyByZWxhdGVkIHRvIHRoZSBMRQotICogICAgICAgICAgICAgICAgIEF1ZGlvIHNlcnZpY2Ugb3Igbm90LgotICoKLSAqIFJldHVybnMgICAgICAgICB0cnVlIGZvciBMRSBBdWRpbyBzZXJ2aWNlIHdoaWNoIGFyZSByZWdpc3RlcmVkLgotICAgICAgICAgICAgICAgICAgIGZhbHNlIGJ5IGRlZmF1bHQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGlzX2xlX2F1ZGlvX3NlcnZpY2UoVXVpZCB1dWlkKSB7Ci0KLSAgdWludDE2X3QgdXVpZF92YWwgPSAwOwotICBib29sIHN0YXR1cyA9IGZhbHNlOwotCi0gIHNpemVfdCBsZW4gPSB1dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0gIGlmIChsZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICB1dWlkX3ZhbCA9IHV1aWQuQXMxNkJpdCgpOwotICAgIEFQUExfVFJBQ0VfREVCVUcoImlzX2xlX2F1ZGlvX3NlcnZpY2UgOiAweCVYICAweCVYICIsIHV1aWQuQXMxNkJpdCgpLCB1dWlkX3ZhbCk7Ci0gICAgLy9UT0RPIGNoZWNrIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGFueSBMRSBBVURJTyBzZXJ2aWNlIG9yIG5vdAotICAgIHN3aXRjaCAodXVpZF92YWwpIHsKLSAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfQ1NJUzoKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0JBU1M6Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19UX0FEVl9BVURJTzoKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0FTQ1M6Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19CQUFTOgotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfUEFDUzoKLSAgICAgICAgewotICAgICAgICAgIGF1dG8gaXRyID0gZmluZCh1dWlkX3Nydl9kaXNjX3NlYXJjaC5iZWdpbigpLAotICAgICAgICAgICAgICB1dWlkX3Nydl9kaXNjX3NlYXJjaC5lbmQoKSwgdXVpZCk7Ci0gICAgICAgICAgaWYgKGl0ciAhPSB1dWlkX3Nydl9kaXNjX3NlYXJjaC5lbmQoKSkKLSAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBBUFBMX1RSQUNFX0RFQlVHKCIlcyA6IE5vdCBhIExFQSBzZXJ2aWNlICIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0gZWxzZSBpZihsZW4gPT0gVXVpZDo6a051bUJ5dGVzMTI4KSB7Ci0gICAgaWYgKHV1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfV01DUCkgewotICAgICAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IFdNQ1AgU2VydmljZSBVVUlkIGZvdW5kIiwgX19mdW5jX18pOwotICAgICAgYXV0byBpdHIgPSBmaW5kKHV1aWRfc3J2X2Rpc2Nfc2VhcmNoLmJlZ2luKCksCi0gICAgICAgICAgdXVpZF9zcnZfZGlzY19zZWFyY2guZW5kKCksIHV1aWQpOwotICAgICAgaWYgKGl0ciAhPSB1dWlkX3Nydl9kaXNjX3NlYXJjaC5lbmQoKSkKLSAgICAgICAgc3RhdHVzID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgYnRhX2lzX2Fkdl9hdWRpb192YWxpZF9iZGFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgVGhpcyBBUEkgaXMgdXNlZCBmb3IgRFVNTyBkZXZpY2UuIElmIHRoZSBkZXZpY2UgY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICB0d28gYWRkcmVzcyAocmFuZG9tIGFuZCBwdWJsaWMpLCBpdCBjaGVja3MgZm9yIHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgMCAtIGZvciByYW5kb20gYWRkcmVzcyBpbiBkdW1vIGRldmljZQotICogICAgICAgICAgICAgICAgIDEgLSBmb3IgcHVibGljIGFkZHJlc3MgaW4gZHVtbyBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBidGFfaXNfYWR2X2F1ZGlvX3ZhbGlkX2JkYWRkcihSYXdBZGRyZXNzIHBfYmRfYWRkcikgewotICB0QlRBX0RFVl9QQUlSSU5HX0NCICpwX2xlYV9wYWlyX2NiID0gTlVMTDsKLSAgcF9sZWFfcGFpcl9jYiA9IGJ0YV9nZXRfbGVhX3BhaXJfY2IocF9iZF9hZGRyKTsKLQotICBpZiAocF9sZWFfcGFpcl9jYikgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIHBfbGVhX3BhaXJfY2IgJXMiLCBfX2Z1bmNfXywKLSAgICAgIHBfbGVhX3BhaXJfY2ItPnBfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGF1dG8gaXRyID0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5maW5kKHBfYmRfYWRkcik7Ci0gICAgaWYgKGl0ciA9PSBidGFfbGVhX3BhaXJpbmdfY2IuZGV2X2FkZHJfbWFwLmVuZCgpICYmCi0gICAgICAgIChwX2xlYV9wYWlyX2NiLT5pc19kdW1vX2RldmljZSkpIHsKLSAgICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIElnbm9yZSBCRF9BRERSIGJlY2F1c2Ugb2YgSUQgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgcF9sZWFfcGFpcl9jYi0+cF9pZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgIGRldmNsYXNzMnVpbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgVGhpcyBBUEkgaXMgdG8gZGVyaXZlIHRoZSBjbGFzcyBvZiBkZXZpY2UgYmFzZWQgb2YgZGV2X2NsYXNzCi0gKgotICogUmV0dXJucyAgICAgICAgIHVpbnQzMl90IC0gY2xhc3Mgb2YgZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDMyX3QgZGV2Y2xhc3MydWludChERVZfQ0xBU1MgZGV2X2NsYXNzKSB7Ci0gIHVpbnQzMl90IGNvZCA9IDA7Ci0KLSAgaWYgKGRldl9jbGFzcyAhPSBOVUxMKSB7Ci0gICAgLyogaWYgQ09EIGlzIDAsIGlycmVzcGVjdGl2ZSBvZiB0aGUgZGV2aWNlIHR5cGUgc2V0IGl0IHRvIFVuY2xhc3NpZmllZAotICAgICAqIGRldmljZSAqLwotICAgIGNvZCA9IChkZXZfY2xhc3NbMl0pIHwgKGRldl9jbGFzc1sxXSA8PCA4KSB8IChkZXZfY2xhc3NbMF0gPDwgMTYpOwotICB9Ci0gIHJldHVybiBjb2Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBidGFfaXNfcmVtb3RlX3N1cHBvcnRfbGVhCi0gKgotICogRGVzY3JpcHRpb24gICAgIFRoaXMgQVBJIGlzIHRvIGNoZWNrIHRoZSByZW1vdGUgZGV2aWNlIGNvbnRhaW5zIExFQSBzZXJ2aWNlCi0gKiAgICAgICAgICAgICAgICAgb3Igbm90LiBJdCBjaGVja3MgaW4gSW5xdWlyeSBkYXRhYmFzZSBpbml0aWFsbHkuCi0gKiAgICAgICAgICAgICAgICAgSWYgdGhlIGFkZHJlc3MgaXMgUHVibGljIGlkZW50aXR5IGFkZHJlc3MgdGhlbiBpdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgY2hlY2sgaW4gdGhlIHBhaXJpbmcgZGF0YWJhc2Ugb2YgdGhhdCByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICB0cnVlIC0gaWYgcmVtb3RlIGRldmljZSBpbnF1aXJ5IGRiIGNvbnRhaW5zIExFQSBzZXJ2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0YV9pc19yZW1vdGVfc3VwcG9ydF9sZWEoUmF3QWRkcmVzcyBwX2FkZHIpIHsKLSAgdEJUTV9JTlFfSU5GTyogcF9pbnFfaW5mbzsKLQotICBwX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChwX2FkZHIpOwotICBpZiAocF9pbnFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgdWludDMyX3QgY29kID0gZGV2Y2xhc3MydWludChwX2lucV9pbmZvLT5yZXN1bHRzLmRldl9jbGFzcyk7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgY29kIGlzIDB4JTA2eCIsIF9fZnVuY19fLCBjb2QpOwotICAgIGlmICgoY29kICYgTUFKT1JfTEVfQVVESU9fVkVORE9SX0NPRCkKLSAgICAgICAgICA9PSBNQUpPUl9MRV9BVURJT19WRU5ET1JfQ09EKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKiBjaGVjayB0aGUgYWRkcmVzcyBpcyBwdWJsaWMgaWRlbnRpdHkgYWRkcmVzcyBhbmQgaXRzIHJlbGF0ZWQgdG8gcmFuZG9tCi0gICAqIGFkZHJlc3Mgd2hpY2ggc3VwcG9ydHMgdG8gTEVBIHRoZW4gdGhhdCBQdWJsaWMgSUQgYWRkcmVzcyBzaG91bGQgcmV0dXJuCi0gICAqIHRydWUuCi0gICAqLwotICBhdXRvIGl0ciA9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfYWRkcl9tYXAuZmluZChwX2FkZHIpOwotICBpZiAoaXRyICE9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfYWRkcl9tYXAuZW5kKCkpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlcyBJZGVuaXR5IGFkZHJlc3MgbWFwcGluZyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBidGFfZmluZF9hZHZfYXVkaW9fZ3JvdXBfaW5zdGFuY2UodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICBSYXdBZGRyZXNzIHBfYWRkcikgewotICBSYXdBZGRyZXNzIHBfaWRfYWRkciA9Ci0gICAgYnRhX2dldF9yZW1fZGV2X2lkX2FkZHIocF9hZGRyKTsKLSAgaWYgKHBfaWRfYWRkciAhPSBSYXdBZGRyZXNzOjprRW1wdHkpIHsKLSAgICBCVEFfQ3NpcEZpbmRDc2lzSW5zdGFuY2UoY29ubl9pZCwgc3RhdHVzLCBwX2lkX2FkZHIpOwotICB9IGVsc2UgewotICAgIEJUQV9Dc2lwRmluZENzaXNJbnN0YW5jZShjb25uX2lkLCBzdGF0dXMsIHBfYWRkcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGlzX2dhdHRfc3J2Y19kaXNjX3BlbmRpbmcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgZ2F0dF9zcnZjX2Rpc2MgaXMgcHJvY2Vzc2luZwotICogICAgICAgICAgICAgICAgICBvciBub3QKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGlzX2dhdHRfc3J2Y19kaXNjX3BlbmRpbmcoUmF3QWRkcmVzcyByZW1fYmRhKSB7Ci0gIHRCVEFfTEVfQVVESU9fREVWX0lORk8gKnBfbGVhX2NiID0gYnRhX2dldF9sZWFfY3RybF9jYihyZW1fYmRhKTsKLQotICBBUFBMX1RSQUNFX0RFQlVHKCIlcyAiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX2xlYV9jYiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfREVCVUcoIiVzIGdhdHRfZGlzY19wcm9ncmVzcyAlZCAiLCBfX2Z1bmNfXywKLSAgICAgICAgcF9sZWFfY2ItPmdhdHRfZGlzY19wcm9ncmVzcyk7Ci0gICAgcmV0dXJuIHBfbGVhX2NiLT5nYXR0X2Rpc2NfcHJvZ3Jlc3M7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRhX2dldF9wc2V1ZG9fYWRkcl93aXRoX2lkX2FkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWFwcGluZyBpZF9hZGRyKGlmIHByZXNlbnQpIHRvCi0gKiAgICAgICAgICAgICAgICAgIHBzZXVkbyBhZGRyCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1SYXdBZGRyZXNzIGJ0YV9nZXRfcHNldWRvX2FkZHJfd2l0aF9pZF9hZGRyKFJhd0FkZHJlc3MgcF9hZGRyKSB7Ci0gIGF1dG8gaXRyID0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5maW5kKHBfYWRkcik7Ci0KLSAgQVBQTF9UUkFDRV9ERUJVRygiJXMgcF9hZGRyICVzICIsIF9fZnVuY19fLCBwX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgaWYgKGl0ciAhPSBidGFfbGVhX3BhaXJpbmdfY2IuZGV2X2FkZHJfbWFwLmVuZCgpKSB7Ci0gICAgQVBQTF9UUkFDRV9ERUJVRygiJXMgYWRkciBpcyBtYXBwZWQgdG8gJXMgIiwgX19mdW5jX18sCi0gICAgICAgIGl0ci0+c2Vjb25kLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgaWYgKGl0ci0+c2Vjb25kICE9IFJhd0FkZHJlc3M6OmtFbXB0eSkgewotICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwotICAgIH0KLSAgfQotICByZXR1cm4gcF9hZGRyOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9hc2NzX2NsaWVudF9hcGkuaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfYXNjc19jbGllbnRfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2Y0OGUuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9hc2NzX2NsaWVudF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9hc2NzX2NsaWVudC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIGFzY3MgewotCi1jbGFzcyBBc2NzQ2xpZW50IHsKLSAgcHVibGljOgotICB2aXJ0dWFsIH5Bc2NzQ2xpZW50KCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyB2b2lkIEluaXQoYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzY3NDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0KLSAgc3RhdGljIHZvaWQgQ2xlYW5VcCh1aW50MTZfdCBjbGllbnRfaWQpOwotCi0gIHN0YXRpYyBBc2NzQ2xpZW50KiBHZXQoKTsKLQotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0KSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFN0YXJ0RGlzY292ZXJ5KHVpbnQxNl90IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgR2V0QXNlU3RhdGUodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhc2VfaWQpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgQ29kZWNDb25maWcodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlQ29kZWNDb25maWdPcD4gY29kZWNfY29uZmlncyk7Ci0KLSAgdmlydHVhbCB2b2lkIFFvc0NvbmZpZyh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VRb3NDb25maWdPcD4gcW9zX2NvbmZpZ3MpOwotCi0gIHZpcnR1YWwgdm9pZCBFbmFibGUodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlRW5hYmxlT3A+IGVuYWJsZV9vcHMpOwotCi0gIHZpcnR1YWwgdm9pZCBEaXNhYmxlKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZURpc2FibGVPcD4gZGlzYWJsZV9vcHMpOwotCi0gIHZpcnR1YWwgdm9pZCBTdGFydFJlYWR5KHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVN0YXJ0UmVhZHlPcD4gc3RhcnRfcmVhZHlfb3BzKTsKLQotICB2aXJ0dWFsIHZvaWQgU3RvcFJlYWR5KHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVN0b3BSZWFkeU9wPiBzdG9wX3JlYWR5X29wcyk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlbGVhc2UodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUmVsZWFzZU9wPiByZWxlYXNlX29wcyk7Ci0KLSAgdmlydHVhbCB2b2lkIFVwZGF0ZVN0cmVhbSh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VVcGRhdGVNZXRhZGF0YU9wPiBtZXRhZGF0YV9vcHMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFzY3MKLX0gIC8vIG5hbWVzcGFjZSBiYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfYmFwX3VjbGllbnRfYXBpLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX2JhcF91Y2xpZW50X2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2JkNTNiLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfYmFwX3VjbGllbnRfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImNvbm5lY3RlZF9pc29fYXBpLmgiCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYmFwX3VjbGllbnQuaD4KLSNpbmNsdWRlICJidGFfYXNjc19jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2JhcC91Y2xpZW50X2FsYXJtLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgdWNhc3QgewotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2NzQ2xpZW50Q2FsbGJhY2tzOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmNpczo6Q2lzSW50ZXJmYWNlQ2FsbGJhY2tzOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1Db25uZWN0OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFsYXJtOjpCYXBBbGFybUNhbGxiYWNrczsKLQotY2xhc3MgVWNhc3RDbGllbnQgOiBwdWJsaWMgUGFjc0NsaWVudENhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEFzY3NDbGllbnRDYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDaXNJbnRlcmZhY2VDYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBCYXBBbGFybUNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5VY2FzdENsaWVudCgpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MpOwotICBzdGF0aWMgdm9pZCBDbGVhblVwKCk7Ci0gIHN0YXRpYyBVY2FzdENsaWVudCogR2V0KCk7Ci0KLSAgLy8gQVBJcyBleHBvc2VkIHRvIHVwcGVyIGxheWVyCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGFkZHJlc3MsIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiBzdHJlYW1zKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdHJlYW1zKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlY29uZmlndXJlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gc3RyZWFtcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgVXBkYXRlU3RyZWFtKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1VcGRhdGU+IHVwZGF0ZV9zdHJlYW1zKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdWNhc3QKLX0gIC8vIG5hbWVzcGFjZSBiYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfY2NfYXBpLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX2NjX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2RiZDY5Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfY2NfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoX2NhbGxjb250cm9sX2NhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aF9jYWxsY29udHJvbF9pbnRlcmZhY2UuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgYmx1ZXRvb3RoOjpjYWxsX2NvbnRyb2w6OkNhbGxDb250cm9sbGVyQ2FsbGJhY2tzOwotI2RlZmluZSBNQVhfUkVTUE9OU0VfREFUQV9MRU4gMjU1Ci0jZGVmaW5lIE1BWF9DQ1NfQ09OTkVDVElPTiAgIDUKLSNkZWZpbmUgTUFYX0JFQVJFUl9OQU1FICAgICAgICAyNTUKLSNkZWZpbmUgTUFYX1VDSV9OQU1FICAgICAgICAgICAyNTUKLSNkZWZpbmUgTUFYX1VSSV9MRU5HVEggICAgICAgICAyNTUKLSNkZWZpbmUgTUFYX0JFQVJFUl9MSVNUX0xFTiAgICAyNTUKLSNkZWZpbmUgTUFYX0ZSSUVORExZX05BTUVfTEVOICAgICAgMjU1Ci0vL0F0bW9zdCB0aGVyZSBjb3VsZCBiZSBvbmx5IHR3byBJbmRpY2llcyAoZm9yIEpPSU4pCi0vL0tlZXBpbmcgdGhpcyBhcyBJbnRlcm5hbCBtYXggYXMgU1BlYyBkb24ndCBkZWZpbmUgYW55IHVwcGVyIGxpbWl0IG9uIHRoaXMKLSNkZWZpbmUgTUFYX05VTV9JTkRJQ0lFUyAxMAotCi0jZGVmaW5lIElOQkFORF9SSU5HVE9ORV9GRUFUVVJFX0JJVCAgMHgwMQotI2RlZmluZSBTSUxFTlRfTU9ERV9GRUFUVVJFX0JJVCAgMHgwMgotCi10eXBlZGVmIGVudW0gewotICBDQ1NfTk9ORV9FVkVOVCA9IDEyMCwKLSAgQ0NTX0lOSVRfRVZFTlQsCi0gIENDU19DTEVBTlVQX0VWRU5ULAotICBDQ1NfQ0FMTF9TVEFURV9VUERBVEUsCi0gIENDU19CRUFSRVJfTkFNRV9VUERBVEUsCi0gIENDU19CRUFSRVJfVUNJX1VQREFURSwKLSAgQ0NTX0JFQVJFUl9VUklfU0NIRU1FU19TVVBQT1JURUQsCi0gIENDU19VUERBVEUsCi0gIENDU19PUFRfT1BDT0RFUywKLSAgQ0NTX0JFQVJFUl9DVVJSRU5UX0NBTExfTElTVF9VUERBVEUsCi0gIENDU19CRUFSRVJfU0lHTkFMX1NUUkVOR1RIX1VQREFURSwKLSAgQ0NTX1NJR05BTF9TVFJFTkdUSF9SRVBPUlRfSU5URVJWQUwsCi0gIENDU19TVEFUVVNfRkxBR1NfVVBEQVRFLAotICBDQ1NfSU5DT01JTkdfQ0FMTF9VUERBVEUsCi0gIENDU19JTkNPTUlOR19UQVJHRVRfVVJJX1VQREFURSwKLSAgQ0NTX1RFUk1JTkFUSU9OX1JFQVNPTl9VUERBVEUsCi0gIENDU19CRUFSRVJfVEVDSE5PTE9HWV9VUERBVEUsCi0gIENDU19DQ0lEX1VQREFURSwKLSAgQ0NTX0FDVElWRV9ERVZJQ0VfVVBEQVRFLAotICBDQ1NfQ0FMTF9DT05UUk9MX1JFU1BPTlNFLAotICAvL2V2ZW50cyB0byBoYW5kbGUgaW4gQ0NTIHN0YXRlIG1hY2hpbmUKLSAgQ0NTX05PVElGWV9BTEwsCi0gIENDU19XUklURV9SU1AsCi0gIENDU19SRUFEX1JTUCwKLSAgQ0NTX0RFU0NSSVBUT1JfV1JJVEVfUlNQLAotICBDQ1NfREVTQ1JJUFRPUl9SRUFEX1JTUCwKLSAgQ0NTX0NPTk5FQ1RJT04sCi0gIENDU19ESVNDT05ORUNUSU9OLAotICBDQ1NfQ09OTkVDVElPTl9VUERBVEUsCi0gIENDU19DT05HRVNUSU9OX1VQREFURSwKLSAgQ0NTX1BIWV9VUERBVEUsCi0gIENDU19NVFVfVVBEQVRFLAotICBDQ1NfU0VUX0FDVElWRV9ERVZJQ0UsCi0gIENDU19DT05ORUNUSU9OX0NMT1NFX0VWRU5ULAotICBDQ1NfQk9ORF9TVEFURV9DSEFOR0VfRVZFTlQsCi19Y2NfZXZlbnRfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQ0NTX1NUQVRVU19TVUNDRVNTID0gMHgwMCwKLSAgQ0NTX09QQ09ERV9OT1RfU1VQUE9SVEVELAotICBDQ1NfT1BDT0RFX1VOU1VDQ0VTU0ZVTCwKLSAgQ0NTX0lOVkFMSURfSU5ERVgsCi0gIENDU19TVEFURV9NSVNNQVRDSCwKLSAgQ0NTX0xBQ0tfT0ZfUkVTT1VSQ0VTLAotICBDQ1NfSU5WQUxJRF9PVVRHT0lOR19VUkksCi0gIENDU19DQUxMX1NUQVRFX0lOQUNUSVZFLAotfWNjX2Vycm9yX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIENDU19ESVNDT05ORUNURUQgPSAweDAwLAotICBDQ1NfQ09OTkVDVEVELAotICBDQ1NfTUFYX0RFVklDRV9TVEFURQotfSBjYWxsX2Nvbm5lY3Rfc3RhdGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgQ0FMTF9BQ0NFUFQgPSAweDAwLAotICBDQUxMX1RFUk1JTkFURSwKLSAgQ0FMTF9MT0NBTF9IT0xELAotICBDQUxMX0xPQ0FMX1JFVFJJRVZFLAotICBDQUxMX09SSUdJTkFURSwKLSAgQ0FMTF9KT0lOLAotIH0gY2Nfb3Bjb2RlX3Q7Ci0KLSB0eXBlZGVmIGVudW0gewotICAgQ0NfVEVSTV9JTlZBTElEX09SSUdfVVJJID0gMHgwMCwKLSAgIENDX1RFUk1fRkFJTEVELAotICAgQ0NfVEVSTV9FTkRfRlJPTV9SRU1PVEUsCi0gICBDQ19URVJNX0VORF9GUk9NX1NFUlZFUiwKLSAgIENDX1RFUk1fTElORV9CVVNZLAotICAgQ0NfVEVSTV9OV19DT05HRVNUSU9OLAotICAgQ0NfVEVSTV9FTkRfRlJPTV9DTElFTlQsCi0gICBDQ19URVJNX05PX1NFUlZJQ0UsCi0gICBDQ19URVJNX05PX0FOU1dFUiwKLSAgfSBjY190ZXJtX3JlYXNvbl90OwotCi0gdHlwZWRlZiBlbnVtIHsKLSAgIENDU19TVEFURV9JTkNPTUlORyA9IDB4MDAsCi0gICBDQ1NfU1RBVEVfRElBTElORywKLSAgIENDU19TVEFURV9BTEVSVElORywKLSAgIENDU19TVEFURV9BQ1RJVkUsCi0gICBDQ1NfU1RBVEVfTE9DQUxfSEVMRCwKLSAgIENDU19TVEFURV9SRU1PVEVMWV9IRUxELAotICAgQ0NTX1NUQVRFX0xPQ0FMX1JFTU9URV9IRUxELAotICAgQ0NTX1NUQVRFX0RJU0NPTk5FQ1RFRCwKLSB9IGNjX3N0YXRlX3Q7Ci0KLSAvL2Nvbm5lY3Rpb24gc3RhdGUgbWFjaGluZQotIGJvb2wgRGV2aWNlU3RhdGVDb25uZWN0aW9uSGFuZGxlcih1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0pOwotIGJvb2wgRGV2aWNlU3RhdGVEaXNDb25uZWN0aW5nSGFuZGxlcih1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0pOwotIGJvb2wgRGV2aWNlU3RhdGVEaXNjb25uZWN0ZWRIYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHNlcnZlcl9pZjsKLSAgVXVpZCBjY3Nfc2VydmljZV91dWlkOwotICBVdWlkIGJlYXJlcl9wcm92aWRlcl9uYW1lX3V1aWQ7Ci0gIFV1aWQgY2FsbF9jb250cm9sX3BvaW50X3V1aWQ7Ci0gIFV1aWQgY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfdXVpZDsKLSAgVXVpZCBiZWFyZXJfdWNpX3V1aWQ7Ci0gIFV1aWQgYmVhcmVyX3RlY2hub2xvZ3lfdXVpZDsKLSAgVXVpZCBiZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX3V1aWQ7Ci0gIFV1aWQgYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF91dWlkOwotICBVdWlkIGJlYXJlcl9zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX3V1aWQ7Ci0gIFV1aWQgYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX3V1aWQ7Ci0gIFV1aWQgaW5jb21pbmdfY2FsbF90YXJnZXRfYmVhcmVydXJpX3V1aWQ7Ci0gIFV1aWQgY2FsbF9zdGF0dXNfZmxhZ3NfdXVpZDsKLSAgVXVpZCBjYWxsX3N0YXRlX3V1aWQ7Ci0gIFV1aWQgZ3Ric19jY2lkX3V1aWQ7Ci0gIFV1aWQgY2FsbF90ZXJtaW5hdGlvbl9yZWFzb25fdXVpZDsKLSAgVXVpZCBpbmNvbWluZ19jYWxsX3V1aWQ7Ci0gIFV1aWQgY2FsbF9mcmllbmRseV9uYW1lX3V1aWQ7Ci0gIC8vaGFuZGxlIGZvciBjaGFyYWN0ZXJpc3RpY3MKLSAgdWludDE2X3QgY2FsbF9zdGF0ZV9oYW5kbGU7Ci0gIHVpbnQxNl90IGJlYXJlcl9wcm92aWRlcl9uYW1lX2hhbmRsZTsKLSAgdWludDE2X3QgY2FsbF9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlOwotICB1aW50MTZfdCBjYWxsX2NvbnRyb2xfcG9pbnRfaGFuZGxlOwotICB1aW50MTZfdCBiZWFyZXJfdWNpX2hhbmRsZTsKLSAgdWludDE2X3QgYmVhcmVyX3RlY2hub2xvZ3lfaGFuZGxlOwotICB1aW50MTZfdCBiZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX2hhbmRsZTsKLSAgdWludDE2X3QgYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9oYW5kbGU7Ci0gIHVpbnQxNl90IGJlYXJlcl9zaWduYWxfc3RyZW5ndGhfcmVwb3J0X2ludGVydmFsX2hhbmRsZTsKLSAgdWludDE2X3QgYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2hhbmRsZTsKLSAgdWludDE2X3QgaW5jb21pbmdfY2FsbF90YXJnZXRfYmVhcmVydXJpX2hhbmRsZTsKLSAgdWludDE2X3QgY2FsbF9zdGF0dXNfZmxhZ3NfaGFuZGxlOwotICB1aW50MTZfdCBjYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9oYW5kbGU7Ci0gIHVpbnQxNl90IGluY29taW5nX2NhbGxfaGFuZGxlOwotICB1aW50MTZfdCBjYWxsX2ZyaWVuZGx5X25hbWVfaGFuZGxlOwotICB1aW50MTZfdCBjY2lkX2hhbmRsZTsKLSAgdWludDE2X3QgY2FsbF9zdGF0ZV9kZXNjOwotICB1aW50MTZfdCBiZWFyZXJfcHJvdmlkZXJfbmFtZV9kZXNjOwotICB1aW50MTZfdCBjYWxsX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9kZXNjOwotICB1aW50MTZfdCBjYWxsX2NvbnRyb2xfcG9pbnRfZGVzYzsKLSAgdWludDE2X3QgYmVhcmVyX3VjaV9kZXNjOwotICB1aW50MTZfdCBiZWFyZXJfdGVjaG5vbG9neV9kZXNjOwotICB1aW50MTZfdCBiZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX2Rlc2M7Ci0gIHVpbnQxNl90IGJlYXJlcl9zaWduYWxfc3RyZW5ndGhfZGVzYzsKLSAgdWludDE2X3QgYmVhcmVyX3NpZ25hbF9zdHJlbmd0aF9yZXBvcnRfaW50ZXJ2YWxfZGVzYzsKLSAgdWludDE2X3QgYmVhcmVyX2xpc3RfY3VycmVudGNhbGxzX2Rlc2M7Ci0gIHVpbnQxNl90IGluY29taW5nX2NhbGxfdGFyZ2V0X2JlYXJlclVSSV9kZXNjOwotICB1aW50MTZfdCBjYWxsX3N0YXR1c19mbGFnc19kZXNjOwotICB1aW50MTZfdCBjYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9kZXNjOwotICB1aW50MTZfdCBpbmNvbWluZ19jYWxsX2Rlc2M7Ci0gIHVpbnQxNl90IGNhbGxfZnJpZW5kbHlfbmFtZV9kZXNjOwotICB1aW50MTZfdCBjY2lkX2Rlc2M7Ci19Q2NzQ29udHJvbFNlcnZpY2VJbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2FsbF9jb25uZWN0X3N0YXRlX3Qgc3RhdGU7Ci0gIHVpbnQxNl90IGNhbGxfc3RhdGVfbm90aWZ5OwotICB1aW50MTZfdCBiZWFyZXJfcHJvdmlkZXJfbmFtZV9ub3RpZnk7Ci0gIHVpbnQxNl90IGNhbGxfY29udHJvbF9wb2ludF9ub3RpZnk7Ci0gIHVpbnQxNl90IGNhbGxfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX25vdGlmeTsKLSAgdWludDE2X3QgYmVhcmVyX3RlY2hub2xvZ3lfY2hhbmdlZF9ub3RpZnk7Ci0gIHVpbnQxNl90IGJlYXJlcl91Y2lfbm90aWZ5OwotICB1aW50MTZfdCBiZWFyZXJfdXJpX3NjaGVtZXNfc3VwcG9ydGVkX25vdGlmeTsKLSAgdWludDE2X3QgYmVhcmVyX2N1cnJlbnRfY2FsbHNfbGlzdF9ub3RpZnk7Ci0gIHVpbnQxNl90IGJlYXJlcl9zaWduYWxfc3RyZW5ndGhfbm90aWZ5OwotICB1aW50MTZfdCBiZWFyZXJfc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbF9ub3RpZnk7Ci0gIHVpbnQxNl90IGluY29taW5nX2NhbGxfc3RhdGVfbm90aWZ5OwotICB1aW50MTZfdCBpbmNvbWluZ19jYWxsX3RhcmdldF9VUklfbm90aWZ5OwotICB1aW50MTZfdCBzdGF0dXNfZmxhZ3Nfbm90aWZ5OwotICB1aW50MTZfdCBjYWxsX3Rlcm1pbmF0aW9uX3JlYXNvbl9ub3RpZnk7Ci0gIHVpbnQxNl90IGNhbGxfZnJpZW5kbHlfbmFtZV9ub3RpZnk7Ci0gIHVpbnQ4X3Qgc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydF9pbnRlcnZhbDsKLSAgYWxhcm1fdCogc2lnbmFsX3N0cmVuZ3RoX3JlcG9ydGluZ190aW1lcjsKLSAgYm9vbCBjb25nZXN0ZWQ7Ci0gIGludCBjb25uX2lkOwotICBpbnQgdHJhbnNfaWQ7Ci0gIGludCB0aW1lb3V0OwotICBpbnQgbGF0ZW5jeTsKLSAgaW50IGludGVydmFsOwotICBpbnQgcnhfcGh5OwotICBpbnQgdHhfcGh5OwotICBpbnQgbXR1OwotCi0gIFJhd0FkZHJlc3MgcGVlcl9iZGE7Ci0gIGJvb2wgKCpEZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyWzJdKSh1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0pOwotfUNhbGxDb250cm9sbGVyRGV2aWNlTGlzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBhZGRyZXNzOwotICBpbnQgc2V0X2lkOwotfUNhbGxBY3RpdmVEZXZpY2U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBpbmRleDsKLSAgdWludDhfdCBzdGF0ZTsKLSAgdWludDhfdCBmbGFnczsKLX10Q0NTX0NBTExfU1RBVEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSB1aW50OF90IGluZGV4OwotIHVpbnQ4X3QgaW5jb21pbmdfdGFyZ2V0X3VyaVtNQVhfVVJJX0xFTkdUSF07Ci19dENDU19JTkNPTUlOR19DQUxMX1VSSTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotIHVpbnQ4X3QgaW5kZXg7Ci0gdWludDhfdCBpbmNvbWluZ191cmlbTUFYX1VSSV9MRU5HVEhdOwotfXRDQ1NfSU5DT01JTkdfQ0FMTDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG9wZXJhdGlvbjsKLSAgdWludDhfdCAgaW5kZXhbTUFYX05VTV9JTkRJQ0lFU107Ci0gIHVpbnQ4X3Qgc3VwcG9ydGVkX2ZsYWdzOwotICBjaGFyKiB1cmk7Ci0gIHVpbnQzMl90IGNjaWQ7Ci19dENDU19DQUxMX0NPTlRST0xfUE9JTlQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSB1aW50OF90IG9wY29kZTsKLSB1aW50OF90IGluZGV4OwotIHVpbnQ4X3QgIHJlc3BvbnNlX3N0YXR1czsKLSBSYXdBZGRyZXNzIHJlbW90ZV9hZGRyZXNzOwotfXRDQ1NfQ0FMTF9DT05UUk9MX1JFU1BPTlNFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHN1cHBvcnRlZF9mbGFnczsKLX10Q0NTX1NUQVRVU19GTEFHUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBzdXBwX29wY29kZTsKLX10Q0NTX1NVUFBfT1BUSU9OQUxfT1BDT0RFUzsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDhfdCBpbmRleDsKLSAgICB1aW50OF90IHJlYXNvbjsKLX10Q0NTX1RFUk1fUkVBU09OOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDhfdCBpbmRleDsKLSAgICB1aW50OF90IG5hbWVbTUFYX0ZSSUVORExZX05BTUVfTEVOXTsKLX10Q0NTX0ZSSUVORExZX05BTUU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgY2NpZDsKLX10Q0NTX0NPTlRFTlRfQ09OVFJPTF9JRDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGFkZHI7Ci19dENDU19DT05ORUNUSU9OX0NMT1NFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgbGlzdF9sZW5ndGg7Ci0gIHVpbnQ4X3QgY2FsbF9pbmRleDsKLSAgdWludDhfdCBjYWxsX3N0YXRlOwotICB1aW50OF90IGNhbGxfZmxhZ3M7Ci0gIHVpbnQ4X3QgY2FsbF91cmlbTUFYX1VSSV9MRU5HVEhdOwotIH10Q0NTX0JFQVJFUl9MSVNUX0NVUlJFTlRfQ0FMTFM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBuYW1lW01BWF9CRUFSRVJfTkFNRV07Ci0gIHVpbnQ4X3QgIHVjaVtNQVhfVUNJX05BTUVdOwotICB1aW50OF90IGxlbmd0aDsKLSAgdWludDhfdCAgdGVjaG5vbG9neV90eXBlOwotICB1aW50OF90IHNpZ25hbDsKLSAgdWludDhfdCBzaWduYWxfcmVwb3J0X2ludGVydmFsOwotICBpbnQgYmVhcmVyX2xpc3RfbGVuOwotICB1aW50OF90IGJlYXJlcl9zY2hlbWVzX2xpc3RbTUFYX0JFQVJFUl9MSVNUX0xFTl07Ci19dENDU19CRUFSRVJfUFJPVklERVJfSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIHN0YXR1czsKLX10Q0NTX0JFQVJFUl9VUklfU0NIRU1FUzsKLQotLy9VbmlvbiBvcHMKLXN0cnVjdCB0Q0NTX0NIQVJfREVTQ19XUklURSB7Ci0gIHRDQ1NfQ0hBUl9ERVNDX1dSSVRFKCkge307Ci0gIH50Q0NTX0NIQVJfREVTQ19XUklURSgpIHt9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IG5vdGlmaWNhdGlvbjsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0gIHVpbnQzMl90IGRlc2NfaGFuZGxlOwotICB1aW50MzJfdCBjaGFyX2hhbmRsZTsKLSAgYm9vbCBuZWVkX3JzcDsKLSAgYm9vbCBwcmVwX3JzcDsKLSAgLy9pcyB0byBzZW5kIG5vdGlmaWNhdGlvbgotfTsKLQotc3RydWN0IHRDQ1NfQ0hBUl9ERVNDX1JFQUQgewotICB0Q0NTX0NIQVJfREVTQ19SRUFEKCkge307Ci0gIH50Q0NTX0NIQVJfREVTQ19SRUFEKCkge307Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MzJfdCB0cmFuc19pZDsKLSAgdWludDMyX3QgZGVzY19oYW5kbGU7Ci0gIHVpbnQzMl90IGNoYXJfaGFuZGxlOwotfTsKLQotc3RydWN0IHRDQ1NfQ0hBUl9HQVRUX1JFQUQgewotICB0Q0NTX0NIQVJfR0FUVF9SRUFEKCkge307Ci0gIH50Q0NTX0NIQVJfR0FUVF9SRUFEKCkge307Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MzJfdCB0cmFuc19pZDsKLSAgdWludDMyX3QgY2hhcl9oYW5kbGU7Ci19OwotCi1zdHJ1Y3QgdENDU19DSEFSX1dSSVRFIHsKLSAgdENDU19DSEFSX1dSSVRFKCkge307Ci0gIH50Q0NTX0NIQVJfV1JJVEUoKSB7fTsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIGJvb2wgbmVlZF9yc3A7Ci0gIGJvb2wgcHJlcF9yc3A7Ci0gIHVpbnQxNl90IG9mZnNldDsKLSAgdWludDE2X3QgdHJhbnNfaWQ7Ci0gIHVpbnQzMl90IGNoYXJfaGFuZGxlOwotICBpbnQgbGVuOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgdWludDhfdCAqZGF0YTsKLX07Ci0KLXN0cnVjdCB0Q0NTX0NPTk5FQ1RJT04gewotICB1aW50OF90IHN0YXR1czsKLSAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0IHJlbW90ZURldmljZTsKLX07Ci0KLXN0cnVjdCB0Q0NTX0NPTk5fVVBEQVRFIHsKLSAgdENDU19DT05OX1VQREFURSgpIHt9OwotICB+dENDU19DT05OX1VQREFURSgpIHt9OwotICB1aW50OF90IHN0YXR1czsKLSAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0ICpyZW1vdGVEZXZpY2U7Ci19OwotCi1zdHJ1Y3QgdENDU19ESVNDT05ORUNUSU9OIHsKLSAgdENDU19ESVNDT05ORUNUSU9OKCkge307Ci0gIH50Q0NTX0RJU0NPTk5FQ1RJT04oKSB7fTsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCAqcmVtb3RlRGV2aWNlOwotfTsKLQotc3RydWN0IHRDQ1NfQ09OR0VTVElPTiB7Ci0gIHRDQ1NfQ09OR0VTVElPTigpIHt9OwotICB+dENDU19DT05HRVNUSU9OKCkge307Ci0gIGJvb2wgY29uZ2VzdGVkOwotICBDYWxsQ29udHJvbGxlckRldmljZUxpc3QgKnJlbW90ZURldmljZTsKLX07Ci0KLXN0cnVjdCB0Q0NTX1BIWXsKLSAgdENDU19QSFkoKTsKLSAgfnRDQ1NfUEhZKCk7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50OF90IHR4X3BoeTsKLSAgdWludDhfdCByeF9waHk7Ci0gIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCAqcmVtb3RlRGV2aWNlOwotfTsKLQotc3RydWN0IHRDQ1NfTVRVIHsKLSAgdENDU19NVFUoKSB7fTsKLSAgfnRDQ1NfTVRVKCkge307Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MTZfdCBtdHU7Ci0gIENhbGxDb250cm9sbGVyRGV2aWNlTGlzdCAqcmVtb3RlRGV2aWNlOwotfTsKLQotc3RydWN0IHRDQ1NfU0VUX0FDVElWRV9ERVZJQ0UgewotICB0Q0NTX1NFVF9BQ1RJVkVfREVWSUNFKCkge307Ci0gIH50Q0NTX1NFVF9BQ1RJVkVfREVWSUNFKCkge307Ci0gIFJhd0FkZHJlc3MgYWRkcmVzczsKLSAgdWludDE2X3Qgc2V0X2lkOwotfTsKLQotc3RydWN0IHRDQUxMX0NPTlRST0xfVVBEQVRFIHsKLSAgdENBTExfQ09OVFJPTF9VUERBVEUoKSB7fTsKLSAgfnRDQUxMX0NPTlRST0xfVVBEQVRFKCkge307Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE7Ci19OwotCi11bmlvbiBDQUxMX0NPTlRST0xfT1BFUkFUSU9OewotICBDQUxMX0NPTlRST0xfT1BFUkFUSU9OKCkgOiBDYWxsQ29udHJvbGxlck9wKCkgewotICB9OwotICB+Q0FMTF9DT05UUk9MX09QRVJBVElPTigpIHt9OwotICB0Q0FMTF9DT05UUk9MX1VQREFURSBDYWxsQ29udHJvbGxlck9wOwotICB0Q0NTX1NFVF9BQ1RJVkVfREVWSUNFIFNldEFjdGl2ZURldmljZU9wOwotICB0Q0NTX0NIQVJfREVTQ19XUklURSBXcml0ZURlc2NPcDsKLSAgdENDU19DSEFSX0RFU0NfUkVBRCBSZWFkRGVzY09wOwotICB0Q0NTX0NIQVJfV1JJVEUgV3JpdGVPcDsKLSAgdENDU19DSEFSX0dBVFRfUkVBRCBSZWFkT3A7Ci0gIHRDQ1NfQ09OTkVDVElPTiBDb25uZWN0aW9uT3A7Ci0gIHRDQ1NfQ09OTl9VUERBVEUgQ29ubmVjdGlvblVwZGF0ZU9wOwotICB0Q0NTX0RJU0NPTk5FQ1RJT04gRGlzY29ubmVjdGlvbk9wOwotICB0Q0NTX0NPTkdFU1RJT04gQ29uZ2VzdGlvbk9wOwotICB0Q0NTX01UVSBNdHVPcDsKLSAgdENDU19QSFkgUGh5T3A7Ci19OwotCi10eXBlZGVmIHVuaW9uIENBTExfQ09OVFJPTF9PUEVSQVRJT04gdENDU19PUEVSQVRJT047Ci0KLXN0cnVjdCB0Y2NfcmVzcF90IHsKLSAgdGNjX3Jlc3BfdCgpICAgIHt9OwotICB+dGNjX3Jlc3BfdCgpICAgIHt9OwotICB1aW50MzJfdCBldmVudCA9IDA7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDA7Ci0gIHVpbnQxNl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgZm9yY2UgPSBmYWxzZTsKLSAgQ2FsbENvbnRyb2xsZXJEZXZpY2VMaXN0ICpyZW1vdGVEZXZpY2UgPSBudWxscHRyOwotICB0R0FUVFNfUlNQIHJzcF92YWx1ZTsKLSAgdENDU19PUEVSQVRJT04gb3BlcjsKLSB9OwotCi1jbGFzcyBDYWxsQ29udHJvbGxlciB7Ci0KLSAgcHVibGljOgotICB2aXJ0dWFsIH5DYWxsQ29udHJvbGxlcigpID0gZGVmYXVsdDsKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShibHVldG9vdGg6OmNhbGxfY29udHJvbDo6Q2FsbENvbnRyb2xsZXJDYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgIFV1aWQgYXBwX2lkLCBpbnQgbWF4X2Njc19jbGllbnRzLCBib29sIGluYmFuZF9yaW5naW5nX2VuYWJsZWQpOwotICBzdGF0aWMgdm9pZCBDbGVhblVwKCk7Ci0gIHN0YXRpYyBDYWxsQ29udHJvbGxlciogR2V0KCk7Ci0gIHN0YXRpYyBib29sIElzQ2NTZXJ2aWNlUnVubmlnKCk7Ci0KLSAgdmlydHVhbCB2b2lkIENhbGxTdGF0ZShpbnQgbGVuLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQmVhcmVySW5mb05hbWUodWludDhfdCogYmVhcmVyX25hbWUpID0gMDsKLSAgdmlydHVhbCB2b2lkIFVwZGF0ZUJlYXJlclRlY2hub2xvZ3koaW50IHRlY2hfdHlwZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgVXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdCh1aW50OF90KiBsaXN0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBVcGRhdGVJbmNvbWluZ0NhbGxUYXJnZXRVcmkoaW50IGluZGV4LCB1aW50OF90KiB0YXJnZXRfdXJpKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBVcGRhdGVJbmNvbWluZ0NhbGwoaW50IGluZGV4LCB1aW50OF90KiBVcmkpID0gMDsKLSAgdmlydHVhbCB2b2lkIFVwZGF0ZUJlYXJlclNpZ25hbFN0cmVuZ3RoKGludCBzaWduYWwpID0gMDsKLSAgdmlydHVhbCB2b2lkIFVwZGF0ZVN0YXR1c0ZsYWdzKHVpbnQ4X3Qgc3RhdHVzX2ZsYWcpID0gMDsKLSAgdmlydHVhbCB2b2lkIENhbGxDb250cm9sT3B0aW9uYWxPcFN1cHBvcnRlZChpbnQgZmVhdHVyZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ2FsbENvbnRyb2xSZXNwb25zZSh1aW50OF90IG9wLCB1aW50OF90IGluZGV4LCB1aW50MzJfdCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0QWN0aXZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBzZXRJZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ29udGVudENvbnRyb2xJZCh1aW50MzJfdCBjY2lkKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZCkgPSAwOwotfTsKLQotdm9pZCBIYW5kbGVDY3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0pOwotYm9vbCBDQ1NIYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSk7Ci12b2lkIENjcENvbmdlc3Rpb25VcGRhdGUodGNjX3Jlc3BfdCAqIHBfZGF0YSk7CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX2NzaXBfYXBpLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX2NzaXBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmI0MjIuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9jc2lwX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZpbGUgdG8gcHJvdmlkZSBDU0lQIEFQSSdzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRBX0NTSVBfQVBJX0gKLSNkZWZpbmUgQlRBX0NTSVBfQVBJX0gKLQotLy8jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotI2luY2x1ZGUgImJ0YV9nYXR0X2FwaS5oIiAvL3RlbXAKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2RlZmluZSBTSVJLX1NJWkUgMTYgICAgICAgIC8vIFNJUksgU2l6ZQotI2RlZmluZSBVTkxPQ0tfVkFMVUUgMHgwMSAgIC8vIFVOTE9DSyBWYWx1ZQotI2RlZmluZSBMT0NLX1ZBTFVFICAgMHgwMiAgIC8vIExPQ0sgVmFsdWUKLSNkZWZpbmUgRU5DUllQVEVEX1NJUksgMHgwMCAgICAgLy8gRW5jcnlwdGVkIFNJUksgVHlwZQotI2RlZmluZSBQTEFJTlRFWFRfU0lSSyAweDAxICAgICAvLyBQbGFpbiBUZXh0IFNJUksKLSNkZWZpbmUgSU5WQUxJRF9TRVRfSUQgMHgxMCAvLyBJbnZhbGlkIHNldCBpZAotCi0vKiBzdGF0dXMgZm9yIGFwcGxpY2F0aW9ucyBmb3IgTE9DSyBTdGF0dXMgY2hhbmdlZCBjYWxsYmFjayovCi1lbnVtIHsKLSAgTE9DS19SRUxFQVNFRCwgICAgICAgICAgICAgICAgICAgICAgLy8gKExPQ0sgUmVsZWFzZWQgc3VjY2Vzc2Z1bGx5KQotICBMT0NLX1JFTEVBU0VEX1RJTUVPVVQsICAgICAgICAgICAgICAvLyAoTE9DSyBSZWxlYXNlZCBieSB0aW1lb3V0KQotICBBTExfTE9DS1NfQUNRVUlSRUQsICAgICAgICAgICAgICAgICAvLyAoTE9DSyBBY3F1aXJlZCBmb3IgYWxsIHJlcXVlc3RlZCBzZXQgbWVtYmVycykKLSAgU09NRV9MT0NLU19BQ1FVSVJFRF9SRUFTT05fVElNRU9VVCwgLy8gKFJlcXVlc3QgdGltZW91dCBmb3Igc29tZSBzZXQgbWVtYmVycykKLSAgU09NRV9MT0NLU19BQ1FVSVJFRF9SRUFTT05fRElTQywgICAgLy8gKFNvbWUgb2YgdGhlIHNldCBtZW1iZXJzIHdlcmUgZGlzY29ubmVjdGVkKQotICBMT0NLX0RFTklFRCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAoRGVuaWVkIGJ5IG9uZSBvZiB0aGUgc2V0IG1lbWJlcnMpCi0gIElOVkFMSURfUkVRVUVTVF9QQVJBTVMsICAgICAgICAgICAgIC8vIChVcHBlciBsYXllciBwcm92aWRlZCBpbnZhbGlkIHBhcmFtZXRlcnMpCi0gIExPQ0tfUkVMRUFTRV9OT1RfQUxMT1dFRCwgICAgICAgICAgIC8vIChSZXNwb25zZSBmcm9tIHJlbW90ZSAoUFRTKSkKLSAgSU5WQUxJRF9WQUxVRSwgICAgICAgICAgICAgICAgICAgICAgLy8gKFJlc3BvbnNlIGZyb20gcmVtb3RlIChQVFMpKQotfTsKLQotLyogTE9DSyBSZXF1ZXN0IEVycm9yIENvZGVzIGZyb20gc2V0IG1lbWJlcnMgKi8KLSNkZWZpbmUgQ1NJUF9MT0NLX0RFTklFRCAweDgwCi0jZGVmaW5lIENTSVBfTE9DS19SRUxFQVNFX05PVF9BTExPV0VEIDB4ODEKLSNkZWZpbmUgQ1NJUF9JTlZBTElEX0xPQ0tfVkFMVUUgMHg4MgotI2RlZmluZSBDU0lQX0xPQ0tfQUxSRUFEWV9HUkFOVEVEIDB4ODQKLQotLyogRXZlbnRzIHdoZW4gQ1NJUCBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgQlRBX0NTSVBfTkVXX1NFVF9GT1VORF9FVlQgMQotI2RlZmluZSBCVEFfQ1NJUF9TRVRfTUVNQkVSX0ZPVU5EX0VWVCAyCi0jZGVmaW5lIEJUQV9DU0lQX0NPTk5fU1RBVEVfQ0hHX0VWVCAzCi0jZGVmaW5lIEJUQV9DU0lQX0xPQ0tfU1RBVFVTX0NIQU5HRURfRVZUIDQKLSNkZWZpbmUgQlRBX0NTSVBfTE9DS19BVkFJTEFCTEVfRVZUIDUKLSNkZWZpbmUgQlRBX0NTSVBfU0VUX1NJWkVfQ0hBTkdFRCA2Ci0jZGVmaW5lIEJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQgNwotCi0vKiBDU0lQIG9wZXJhdGlvbiBjb21wbGV0ZWQgZXZlbnQqLwotdHlwZWRlZiB1aW50OF90IHRCVEFfQ1NJUF9FVlQ7Ci0KLWVudW0gewotICBCVEFfQ1NJUF9TVUNDRVNTLAotICBCVEFfQ1NJUF9GQUlMVVJFLAotfTsKLQotLyogQ1NJUCBPcGVyYXRpb24gU3RhdHVzKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0NTSVBfU1RBVFVTOwotCi0vKiBDU0lQIEdBVFQgQ29ubmVjdGlvbiBTdGF0ZXMgKHRvIGJlIG5vdGlmaWVkIHRvIHVwcGVyIGxheWVyKSovCi0vKiBNYXBwaW5nIHRvIEJsdWV0b290aFByb2ZpbGUgQ29ubmVjdGlvbiBTdGF0ZXMqLwotZW51bSB7Ci0gIEJUQV9DU0lQX0RJU0NPTk5FQ1RFRCwKLSAgQlRBX0NTSVBfQ09OTkVDVEVEID0gMHgwMiwKLX07Ci0KLSAvKiBDU0lQIGRldmljZSBHQVRUIENvbm5lY3Rpb24gc3RhdGUgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRBX0NTSVBfQ09OTl9TVEFURTsKLQotZW51bSB7Ci0gIEJUQV9DU0lQX0NPTk5fRVNUQUJMSVNIRUQgPSAweDQwLCAvLyByZWFzb24gdmFsdWVzIHRvIGJlIGRlY2lkZWQKLSAgQlRBX0NTSVBfQ09OTl9FU1RBQkxJU0hNRU5UX0ZBSUxFRCwKLSAgQlRBX0NTSVBfQVBQX0FMUkVBRFlfQ09OTkVDVEVELAotICBCVEFfQ1NJUF9BUFBfQUxSRUFEWV9ESVNDT05ORUNURUQsCi0gIEJUQV9DU0lQX0FQUF9ESVNDT05ORUNURUQsCi0gIEJUQV9DU0lQX0RJU0NPTk5FQ1RfV0lUSE9VVF9DT05ORUNULAotICBCVEFfQ1NJUF9DT09SRElOQVRFRF9TRVRfTk9UX1NVUFBPUlRFRCwKLX07Ci0KLS8qIENTSVAgZGV2aWNlIEdBVFQgQ29ubmVjdGlvbiBzdGF0ZSAqLwotdHlwZWRlZiB1aW50OF90IHRCVEFfQ1NJUF9DT05OX1NUQVRVUzsKLQotLyogUGFyYW1zIGluIGNhbGxiYWNrIHRvIHJlcXVlc3RpbmcgYXBwIHdoZW4gbG9jayBzdGF0dXMgaGFzIGJlZW4gY2hhbmdlZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGFwcF9pZDsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3QgdmFsdWUgPSBVTkxPQ0tfVkFMVUU7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBhZGRyOwotfSB0QlRBX0xPQ0tfU1RBVFVTX0NIQU5HRUQ7Ci0KLS8qIFBhcmFtcyBpbiBjYWxsYmFjayB0byByZWdpc3RlcmVkIGFwcCB3aGVuIGNvb3JkaW5hdGVkIHNldCBtZW1iZXIgaXMgZGlzY292ZXJlZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHNldF9pZDsKLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLX0gdEJUQV9TRVRfTUVNQkVSX0ZPVU5EOwotCi0vKiBQYXJhbXMgaW4gY2FsbGJhY2sgdG8gcmVnaXN0ZXJlZCBhcHAgd2hlbiBkaXNjb3ZlcnkgZm9yIGNvb3JkaW5hdGVkIHNldCBpcyBjb21wbGV0ZWQgKi8KLS8qVE9ETzogbm90IHJlcXVpcmVkLCB0byBiZSByZW1vdmVkICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc2V0X2lkOwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYWRkcjsKLX0gdEJUQV9TRVRfRElTQ19DTVBMOwotCi0vKiBwYXJhbXMgaW4gY2FsbGJhY2sgdG8gYXBwIHdoZW4gbG9jayBpcyBhdmFpbGFibGUgb24gZWFybGllciBkZW5pZWQgbWVtYmVyKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBhcHBfaWQ7Ci0gIHVpbnQ4X3Qgc2V0X2lkOwotICBSYXdBZGRyZXNzIGFkZHI7Ci19IHRCVEFfTE9DS19BVkFJTEFCTEU7Ci0KLS8qIHBhcmFtcyBpbiBjYWxsYmFjayB0byBhcHAgc3BhY2Ugd2hlbiBuZXcgc2V0IGlzIGZvdW5kKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3Qgc2lya1tTSVJLX1NJWkVdOwotICB1aW50OF90IHNpemU7Ci0gIGJvb2wgbG9ja19zdXBwb3J0OwotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGJsdWV0b290aDo6VXVpZCBpbmNsdWRpbmdfc3J2Y191dWlkOwotfSB0QlRBX0NTSVBfTkVXX1NFVF9GT1VORDsKLQotLyogcGFyYW1zIGluIGNhbGxiYWNrIHRvIGFwcCB3aGVuIHNldCBzaXplIGlzIGNoYW5nZWQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3Qgc2l6ZTsKLSAgUmF3QWRkcmVzcyBhZGRyOwotfSB0QlRBX0NTSVBfU0VUX1NJWkVfQ0hBTkdFRDsKLQotLyogcGFyYW1zIGluIGNhbGxiYWNrIHRvIGFwcCB3aGVuIHNldCBzaXJrIGlzIGNoYW5nZWQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3QqIHNpcms7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLX0gdEJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQ7Ci0KLS8qIHBhcmFtcyBpbiBjYWxsYmFjayB0byBhcHAgd2hlbiBjb25uZWN0aW9uIHN0YXRlIGhhcyBiZWVuIGNoYW5nZWQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBhcHBfaWQ7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLSAgdEJUQV9DU0lQX0NPTk5fU1RBVEUgc3RhdGU7Ci0gIHRCVEFfQ1NJUF9DT05OX1NUQVRVUyBzdGF0dXM7Ci19IHRCVEFfQ1NJUF9DT05OX1NUQVRFX0NIQU5HRUQ7Ci0KLS8qIGNhbGxiYWNrcyBwYXJhbXMgb24gY29tcGxldGlvbiBvZiBDU0lQIG9wZXJhdGlvbnMgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QlRBX0xPQ0tfU1RBVFVTX0NIQU5HRUQgbG9ja19zdGF0dXNfcGFyYW07Ci0gIHRCVEFfQ1NJUF9DT05OX1NUQVRFX0NIQU5HRUQgY29ubl9wYXJhbXM7Ci0gIHRCVEFfU0VUX01FTUJFUl9GT1VORCBzZXRfbWVtYmVyX3BhcmFtOwotICB0QlRBX1NFVF9ESVNDX0NNUEwgc2V0X2Rpc2NfY21wbF9wYXJhbTsKLSAgdEJUQV9MT0NLX0FWQUlMQUJMRSBsb2NrX2F2YWlsYWJsZV9wYXJhbTsKLSAgdEJUQV9DU0lQX05FV19TRVRfRk9VTkQgbmV3X3NldF9wYXJhbXM7Ci0gIHRCVEFfQ1NJUF9DT05OX1NUQVRFX0NIQU5HRUQgY29ubl9jaGdfcGFyYW1zOwotICB0QlRBX0NTSVBfU0VUX1NJWkVfQ0hBTkdFRCBzaXplX2NoZ19wYXJhbXM7Ci0gIHRCVEFfQ1NJUF9TRVRfU0lSS19DSEFOR0VEIHNpcmtfY2hnX3BhcmFtczsKLX0gdEJUQV9DU0lQX0RBVEE7Ci0KLS8qIENTSVAgY2FsbGJhY2tzIHRvIGJlIGdpdmVuIHRvIHVwcGVyIGxheWVycyovCi0KLS8qIENhbGxiYWNrIGdpdmVuIHdoZW4gb25lIG9mIHRoZSBvcGVyYXRpb24gbWVudGlvbmVkIGluICovCi10eXBlZGVmIHZvaWQgKHRCVEFfQ1NJUF9DQkFDSykgKHRCVEFfQ1NJUF9FVlQgZXZlbnQsIHRCVEFfQ1NJUF9EQVRBKiBwX2RhdGEpOwotCi0vKiBDYWxsYmFjayB3aGVuIGFwcGxpY2F0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCBDU0lQICovCi10eXBlZGVmIHZvaWQgKHRCVEFfQ1NJUF9DTFRfUkVHX0NCKSAodEJUQV9DU0lQX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgYXBwX2lkKTsKLQotLyogcGFyYW1ldGVycyB1c2VkIGZvciBhcGkgQlRBX0NzaXBTZXRMb2NrVmFsdWUoKSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGFwcF9pZDsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3QgbG9ja192YWx1ZTsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gbWVtYmVyc19hZGRyOwotfSB0QlRBX1NFVF9MT0NLX1BBUkFNUzsKLQotLyogQ29vcmRpbmF0ZWQgc2V0IGRldGFpbHMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzZXRfaWQ7Ci0gIHVpbnQ4X3Qgc2l6ZTsKLSAgdWludDhfdCB0b3RhbF9kaXNjb3ZlcmVkOwotICBib29sIGxvY2tfc3VwcG9ydDsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gc2V0X21lbWJlcnM7Ci0gIGJsdWV0b290aDo6VXVpZCBwX3NydmNfdXVpZDsKLX0gdEJUQV9DU0lQX0NTRVQ7Ci0KLXVzaW5nIEJ0YUNzaXBBcHBSZWdpc3RlcmVkQ2IgPQotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8sIHVpbnQ4X3QgLyogYXBwX2lkICovKT47Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9SZWdpc3RlckNzaXBBcHAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGFwcGxpY2F0aW9uIG9yIG1vZHVsZSB0bwotICogICAgICAgICAgICAgICAgICB0byByZWdpc3RlciB3aXRoIENTSVAgZm9yIHVzaW5nIENTSVAgZnVuY3Rpb25hbGl0aWVzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9jc2lwX2NiOiBjYWxsYmFjayB0byBiZSByZWNlaXZlZCBpbiByZWdpc3RlcmluZyBhcHAgd2hlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIENTSVAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KLSAqICAgICAgICAgICAgICAgICAgcmVnX2NiICAgOiBjYWxsYmFjayB3aGVuIGFwcC9tb2R1bGUgaXMgcmVnaXN0ZXJlZCB3aXRoIENTSVAuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9SZWdpc3RlckNzaXBBcHAodEJUQV9DU0lQX0NCQUNLKiBwX2NzaXBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdGFDc2lwQXBwUmVnaXN0ZXJlZENiIHJlZ19jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9VbnJlZ2lzdGVyQ3NpcEFwcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYXBwbGljYXRpb24gb3IgbW9kdWxlIHRvCi0gKiAgICAgICAgICAgICAgICAgIHRvIHJlZ2lzdGVyIHdpdGggQ1NJUCBmb3IgdXNpbmcgQ1NJUCBmdW5jdGlvbmFsaXRpZXMuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBhcHBfaWQ6IElkZW50aWZpZXIgb2YgdGhlIGFwcCB0aGF0IG5lZWRzIHRvIGJlIHVucmVnaXN0ZXJlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX1VucmVnaXN0ZXJDc2lwQXBwKHVpbnQ4X3QgYXBwX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0NzaXBTZXRMb2NrVmFsdWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlcXVlc3Qgb3IgcmVsZWFzZSBsb2NrIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZWQgc2V0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgbG9ja19wYXJhbTogcGFyYW1ldGVycyB0byBhY3F1aXJlIG9yIHJlbGVhc2UgbG9jay4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUQV9TRVRfTE9DS19QQVJBTVMpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfQ3NpcFNldExvY2tWYWx1ZSh0QlRBX1NFVF9MT0NLX1BBUkFNUyBsb2NrX3BhcmFtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmV0Y2ggZGV0YWlscyBvZiB0aGUgY29vcmRpbmF0ZWQgc2V0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc2V0X2lkOiBpZGVudGlmaWVyIG9mIHRoZSBjb29yZGluYXRlZCBzZXQgd2hvc2UgZGV0YWlscyBhcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBiZSBmZXRjaGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEJUQV9DU0lQX0NTRVQgKGNvbnRhaW5pbmcgZGV0YWlscyBvZiBjb29yZGluYXRlZCBzZXQpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJUQV9DU0lQX0NTRVQgQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldCh1aW50OF90IHNldF9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9Dc2lwU2V0TG9ja1ZhbHVlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXF1ZXN0IG9yIHJlbGVhc2UgbG9jayBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVkIHNldC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2ZWN0b3I8dEJUSUZfQ1NJUF9DU0VUPjogKGFsbCBkaXNjb3ZlcmVkIGNvb3JkaW5hdGVkIHNldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHN0ZDo6dmVjdG9yPHRCVEFfQ1NJUF9DU0VUPiBCVEFfQ3NpcEdldERpc2NvdmVyZWRTZXRzKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9Dc2lwQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZXN0YWJsaXNoIEdBVFQgQ29ubmVjdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGJkX2FkZHIgOiBBZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKiBOb3RlICAgICAgICAgICAgIFRoaXMgc2hvdWxkbnQgYmUgdXNlZCBieSByZWdpc3RlcmVkIG1vZHVsZS4gQ1NJUCBQcm9maWxlCi0gKiAgICAgICAgICAgICAgICAgIGludGVybmFsbHkgbWFuYWdlcyBHQVRUIENvbm5lY3Rpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9Dc2lwQ29ubmVjdCAodWludDhfdCBhcHBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcENvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVzdGFibGlzaCBHQVRUIENvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyIDogQWRkcmVzcyBvZiB0aGUgcmVtb3RlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICogTm90ZSAgICAgICAgICAgICBUaGlzIHNob3VsZG50IGJlIHVzZWQgYnkgcmVnaXN0ZXJlZCBtb2R1bGUuIENTSVAgUHJvZmlsZQotICogICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5IG1hbmFnZXMgR0FUVCBDb25uZWN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVEFfQ3NpcERpc2Nvbm5lY3QgKHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcEVuYWJsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHRvIGluaXRpYWxpemUgQ1NJUCBpbiBCVEEgbGF5ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2NiYWNrOiBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIGJ0aWZfY3NpcCBtb2R1bGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqIE5vdGUgICAgICAgICAgICAgVGhpcyBBUEkgc2hvdWxkbid0IGJlIHVzZWQgYnkgb3RoZXIgQlQgbW9kdWxlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRBX0NzaXBFbmFibGUodEJUQV9DU0lQX0NCQUNLICpwX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRBX0NzaXBFbmFibGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB0byBkZWluaXRpYWxpemUgQ1NJUCBpbiBCVEEgbGF5ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKiBOb3RlICAgICAgICAgICAgIFRoaXMgQVBJIHNob3VsZG4ndCBiZSB1c2VkIGJ5IG90aGVyIEJUIG1vZHVsZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9Dc2lwRGlzYWJsZSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcEZpbmRDc2lzSW5zdGFuY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB0byBmaW5kIHByZXNlbmNlIG9mIENTSVMgc2VydmljZSBvbgotICogICAgICAgICAgICAgICAgICByZW1vdGUgZGV2aWNlIGFuZCBzdGFydCBjb29yZGluYXRlZCBzZXQgZGlzY292ZXJ5LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogR0FUVCBDb25uZWN0aW9uIElEIHVzZWQgZm9yIGdldHRpbmcgcmVtb3RlIHNlcnZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1cyA6IFN0YXR1cyBvZiB0aGUgZGlzY292ZXJ5IHByb2NlZHVyZQotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKiBOb3RlICAgICAgICAgICAgIFRoaXMgQVBJIHNob3VsZG4ndCBiZSB1c2VkIGJ5IG90aGVyIEJUIG1vZHVsZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUQV9Dc2lwRmluZENzaXNJbnN0YW5jZSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVEFfQ3NpcFJlbW92ZVVucGFpcmVkU2V0TWVtYmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZ2l2ZW4gc2V0IG1lbWJlciBpcyB1bnBhaXJlZC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGFkZHI6IEJEIEFkZHJlc3Mgb2YgdGhlIHNldCBtZW1iZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqIE5vdGUgICAgICAgICAgICAgVGhpcyBBUEkgc2hvdWxkbid0IGJlIHVzZWQgYnkgb3RoZXIgQlQgbW9kdWxlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVEFfQ3NpcFJlbW92ZVVucGFpcmVkU2V0TWVtYmVyKFJhd0FkZHJlc3MgYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9Dc2lwR2V0RGV2aWNlU2V0SWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgQVBJIGlzIHVzZWQgdG8gZ2V0IHNldCBpZCBvZiB0aGUgcmVtb3RlIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGFkZHI6IEJEIEFkZHJlc3Mgb2YgdGhlIHNldCBtZW1iZXIuCi0gKiAgICAgICAgICAgICAgICAgIHV1aWQ6IFVVSUQgb2YgdGhlIHNlcnZpY2Ugd2hpY2ggaW5jbHVkZXMgQ1NJUyBzZXJ2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVEFfQ3NpcEdldERldmljZVNldElkKFJhd0FkZHJlc3MgYWRkciwgYmx1ZXRvb3RoOjpVdWlkIHV1aWQpOwotCi0KLSNlbmRpZiAvKiBCVEFfQ1NJUF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9kbV9hZHZfYXVkaW8uaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfZG1fYWR2X2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZmU1ODguLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9kbV9hZHZfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUQV9ETV9BRFZfQVVESU9fSAotI2RlZmluZSBCVEFfRE1fQURWX0FVRElPX0gKLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJidGEvZG0vYnRhX2RtX2ludC5oIgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhX3N5cy5oIgotCi0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQ1NJUyAweDE4NDYgLyogQ29vcmRpbmF0ZWQgU2V0IElkZW50aWZpY2F0aW9uIFNlcnZpY2UgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfUEFDUyAweDE4NTAgLyogTEUgQVVESU8gUEFDUyAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19BU0NTIDB4MTg0RSAvKiBMRSBBVURJTyBBU0NTICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0JBU1MgMHgxODRGIC8qIExFIEFVRElPIEJBU1MgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQkFBUyAweDE4NTEgLyogTEUgQVVESU8gQkFBUyAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19CUkFTUyAweDE4NTIgLyogTEUgQVVESU8gQlJBU1MgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfVF9BRFZfQVVESU8gMHgxRkEwIC8qIExFIEFVRElPIFRfQURWX0FVRElPICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0NTSVNfTE9DSyAweDJCODYgLyogTEUgQVVESU8gQ1NJUyBMT0NLICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1RfQURWX0FVRElPX1JPTEVfQ0hBUiAweEZFMDAgLypMRSBBVURJTyBDU0lTIExPQ0sgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfVF9BRFZfQVVESU9fTUVESUFfU0lOSyAweDZBRDAKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfVF9BRFZfQVVESU9fVk9JQ0UgMHg2QUQ1Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1RfQURWX0FVRElPX0NPTk5fTEVTU19NRURJQV9TSU5LIDB4RkZBNgotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19UX0FEVl9BVURJT19BU1NJU1QgMHhGRkE3Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1RfQURWX0FVRElPX0RFTEVHQVRFIDB4RkZBOAotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19IQVMgMHg2QUQyCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1NPVVJDRV9DT05URVhUIDB4MkJDRQotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19QQUNTX0NUX1NVUFBPUlQgMHg2QUQ0Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1BBQ1NfVU1SX1NVUFBPUlQgMHg2QUQxCi0KLSNkZWZpbmUgQlRBX0RNX0xFX0FVRElPX1NFQVJDSF9DTVBMX0VWVCA3Ci0KLSNkZWZpbmUgQlRBX0RNX0dST1VQX0RBVEFfVFlQRSAweDJFCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHJlc3M7Ci0gIGJvb2wgaW5fdXNlID1mYWxzZTsKLSAgYm9vbCBpc190X2F1ZGlvX3NydmNfZm91bmQgPSBmYWxzZTsKLSAgYm9vbCBpc19oYXNfZm91bmQgPSBmYWxzZTsKLSAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpVdWlkPiB1dWlkczsKLSAgaW50IHRyYW5zcG9ydDsgLy9CVE1fVXNlTGVMaW5rKHJlbW90ZV9iZGEpOwotICBpbnQgY29ubl9pZCA9IDA7Ci0gIGludDhfdCBkaXNjX3Byb2dyZXNzID0gMDsKLSAgdWludDhfdCBnYXR0X2lmOwotICBib29sIHVzaW5nX2JyZWRyX2JvbmRpbmcgPSBmYWxzZTsKLSAgdWludDE2X3QgdF9yb2xlX2hhbmRsZSA9IDA7Ci0gIHVpbnQxNl90IHBhY3NfY2hhcl9oYW5kbGUgPSAwOwotICBib29sIGNzaXBfZGlzY19wcm9ncmVzcyA9IHRydWU7Ci0gIGJvb2wgaXNfY3NpcF9zdXBwb3J0ID0gZmFsc2U7Ci0gIGJvb2wgZ2F0dF9kaXNjX3Byb2dyZXNzID0gZmFsc2U7Ci19IHRCVEFfTEVfQVVESU9fREVWX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBwX2FkZHI7Ci0gIFJhd0FkZHJlc3MgcF9pZF9hZGRyOwotICBib29sIGlzX2xlX3BhaXJpbmcgPSBmYWxzZTsKLSAgYm9vbCBpbl91c2UgPSBmYWxzZTsKLSAgYm9vbCBpc19kdW1vX2RldmljZSA9IGZhbHNlOwotICB1aW50OF90IGRldl90eXBlOwotICB1aW50OF90IHRyYW5zcG9ydDsKLSAgYm9vbCBzZHBfZGlzY19zdGF0dXMgPSB0cnVlOwotfSB0QlRBX0RFVl9QQUlSSU5HX0NCOwotCi0jZGVmaW5lIE1BWF9MRUFfREVWSUNFUyAzCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVEFfREVWX1BBSVJJTkdfQ0IgYnRhX2Rldl9wYWlyX2RiW01BWF9MRUFfREVWSUNFU107Ci0gIHVpbnQ4X3QgbnVtX2RldmljZXM7Ci0gIGJvb2wgaXNfcGFpcmluZ19wcm9ncmVzcyA9IGZhbHNlOwotICBzdGQ6Om1hcCA8UmF3QWRkcmVzcywgUmF3QWRkcmVzcz4gZGV2X2FkZHJfbWFwOwotICBzdGQ6Om1hcCA8UmF3QWRkcmVzcywgUmF3QWRkcmVzcz4gZGV2X3JhbmRfYWRkcl9tYXA7Ci0gIFJhd0FkZHJlc3MgcGVuZGluZ19hZGRyZXNzOwotICBib29sIGlzX3NkcF9kaXNjb3ZlciA9IHRydWU7Ci19IHRCVEFfTEVBX1BBSVJJTkdfREI7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRBX0xFX0FVRElPX0RFVl9JTkZPIGJ0YV9sZWFfZGV2X2luZm9bTUFYX0xFQV9ERVZJQ0VTXTsKLSAgUmF3QWRkcmVzcyBwZW5kaW5nX3BlZXJfYWRkcjsKLSAgUmF3QWRkcmVzcyBnYXR0X29wX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIGludCBudW1fbGVhX2RldmljZXMgID0gMDsKLSAgYm9vbCBib25kX3Byb2dyZXNzID0gZmFsc2U7Ci19IHRCVEFfTEVfQVVESU9fREVWX0NCOwotCi1leHRlcm4gdEJUQV9MRV9BVURJT19ERVZfQ0IgYnRhX2xlX2F1ZGlvX2Rldl9jYjsKLWV4dGVybiBib29sIGlzX3JlbW90ZV9zdXBwb3J0X2Fkdl9hdWRpbyhjb25zdCBSYXdBZGRyZXNzIHJlbW90ZV9iZGFkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2Fkdl9hdWRpb191cGRhdGVfYm9uZF9kYihSYXdBZGRyZXNzIHBfYmRfYWRkciwgdWludDhfdCB0cmFuc3BvcnQpOwotZXh0ZXJuIGJvb2wgaXNfbGVfYXVkaW9fc2VydmljZShibHVldG9vdGg6OlV1aWQgdXVpZCk7Ci1leHRlcm4gaW50IGJ0YV9pc19hZHZfYXVkaW9fdmFsaWRfYmRhZGRyKFJhd0FkZHJlc3MgcF9iZF9hZGRyKTsKLWV4dGVybiBib29sIGJ0YV9pc19sZV9hdWRpb19zdXBwb3J0ZWQoUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRhX3JlbW90ZV9kZXZpY2VfaXNfZHVtbyhSYXdBZGRyZXNzIHBfYmRfYWRkcik7Ci1leHRlcm4gUmF3QWRkcmVzcyBidGFfZ2V0X3JlbV9kZXZfaWRfYWRkcihSYXdBZGRyZXNzIHBfYmRfYWRkcik7Ci1leHRlcm4gdEJUQV9ERVZfUEFJUklOR19DQiogYnRhX2dldF9sZWFfcGFpcl9jYihSYXdBZGRyZXNzIHBlZXJfYWRkcik7Ci1leHRlcm4gYm9vbCBidGFfbGVhX2FkZHJfbWF0Y2goUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Jlc2V0X2xlYV9wYWlyaW5nX2luZm8oUmF3QWRkcmVzcyBwX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRhX2lzX2JyZWRyX3ByaW1hcnlfdHJhbnNwb3J0KFJhd0FkZHJlc3MgcF9iZF9hZGRyKTsKLWV4dGVybiBib29sIGJ0YV9pc19yZW1vdGVfc3VwcG9ydF9sZWEoUmF3QWRkcmVzcyBwX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRhX3JlbW90ZV9kZXZfaWRlbnRpdHlfYWRkcl9tYXRjaChSYXdBZGRyZXNzIHBfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfZG1fbGVhX2Rpc2NfY29tcGxldGUoUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2NzaXNfZGlzY19jb21wbGV0ZShSYXdBZGRyZXNzIHBfYmRfYWRkciwgYm9vbCBzdGF0dXMpOwotZXh0ZXJuIHRCVEFfTEVfQVVESU9fREVWX0lORk8qIGJ0YV9nZXRfbGVhX2N0cmxfY2IoUmF3QWRkcmVzcyBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2dhcF9nYXR0X3JlYWRfY2IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpOwotZXh0ZXJuIHZvaWQgYnRhX2dldF9hZHZfYXVkaW9fcm9sZShSYXdBZGRyZXNzIHBlZXJfYWRkcmVzcywgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9jc2lzX2Rpc2NfY29tcGxldGUoUmF3QWRkcmVzcyBwX2JkX2FkZHIsIGJvb2wgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9sZWFfZGlzY19jb21wbGV0ZShSYXdBZGRyZXNzIHBfYmRfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfYWRkX2Fkdl9hdWRpb191dWlkKFJhd0FkZHJlc3MgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfR0FUVF9JRCBzcnZjX3V1aWQpOwotZXh0ZXJuIHRCVEFfTEVfQVVESU9fREVWX0lORk8qIGJ0YV9zZXRfbGVhX2N0cmxfY2IoUmF3QWRkcmVzcyBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Jlc2V0X2Fkdl9hdWRpb19kZXZfaW5mbyhSYXdBZGRyZXNzIHBfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfZG1fc2V0X2Fkdl9hdWRpb19kZXZfaW5mbyh0QlRBX0dBVFRDX09QRU4qIHBfZGF0YSk7Ci1leHRlcm4gYm9vbCBpc19hZHZfYXVkaW9fZ3JvdXBfc3VwcG9ydGVkKFJhd0FkZHJlc3MgcmVtX2JkYSwgaW50IGNvbm5faWQpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2xlYV9nYXR0Y19jYWxsYmFjayh0QlRBX0dBVFRDX0VWVCBldmVudCwgdEJUQV9HQVRUQyogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9hZHZfYXVkaW9fZ2F0dF9jb25uKFJhd0FkZHJlc3MgcF9iZF9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9hZHZfYXVkaW9fY2xvc2UoUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIHRCVEFfREVWX1BBSVJJTkdfQ0IqIGJ0YV9nZXRfbGVhX3BhaXJfY2IoUmF3QWRkcmVzcyBwZWVyX2FkZHIpOwotZXh0ZXJuIHRCVEFfREVWX1BBSVJJTkdfQ0IqIGJ0YV9zZXRfbGVhX3BhaXJfY2IoUmF3QWRkcmVzcyBwZWVyX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Jlc2V0X2xlYV9wYWlyaW5nX2luZm8oUmF3QWRkcmVzcyBwX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2JsZV9hZHZfYXVkaW9faWRhZGRyX21hcChSYXdBZGRyZXNzIHBfYmRfYWRkciwKLSAgICAgICAgICAgIFJhd0FkZHJlc3MgcF9pZF9hZGRyKTsKLWV4dGVybiBib29sIGJ0YV9yZW1vdGVfZGV2X2lkZW50aXR5X2FkZHJfbWF0Y2goUmF3QWRkcmVzcyBwX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRhX2xlYV9pc19sZV9wYWlyaW5nKFJhd0FkZHJlc3MgcF9iZF9hZGRyKTsKLWV4dGVybiBib29sIGJ0YV9yZW1vdGVfZGV2aWNlX2lzX2R1bW8oUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIFJhd0FkZHJlc3MgYnRhX2dldF9yZW1fZGV2X2lkX2FkZHIoUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2Fkdl9hdWRpb191cGRhdGVfYm9uZF9kYihSYXdBZGRyZXNzIHBfYmRfYWRkciwgdWludDhfdCB0cmFuc3BvcnQpOwotZXh0ZXJuIGludCBidGFfaXNfYWR2X2F1ZGlvX3ZhbGlkX2JkYWRkcihSYXdBZGRyZXNzIHBfYmRfYWRkcik7Ci1leHRlcm4gdm9pZCBidGFfZmluZF9hZHZfYXVkaW9fZ3JvdXBfaW5zdGFuY2UodWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICBSYXdBZGRyZXNzIHBfYWRkcik7Ci1leHRlcm4gYm9vbCBidGFfaXNfcmVtb3RlX3N1cHBvcnRfbGVhKFJhd0FkZHJlc3MgcF9hZGRyKTsKLWV4dGVybiBib29sIGlzX2dhdHRfc3J2Y19kaXNjX3BlbmRpbmcoUmF3QWRkcmVzcyByZW1fYmRhKTsKLWV4dGVybiBSYXdBZGRyZXNzIGJ0YV9nZXRfcHNldWRvX2FkZHJfd2l0aF9pZF9hZGRyKFJhd0FkZHJlc3MgcF9hZGRyKTsKLSNlbmRpZiAvKiBCVEFfRE1fQURWX0FVRElPX0gqLwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9tY3BfYXBpLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX21jcF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ZGZjNy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX21jcF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQlRBX01DUF9BUElfSAotI2RlZmluZSBCVEFfTUNQX0FQSV9ICi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfbWNwLmg+Ci0jaW5jbHVkZSAiYnRhX2dhdHRfYXBpLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIGJsdWV0b290aDo6bWNwX3NlcnZlcjo6TWNwU2VydmVyQ2FsbGJhY2tzOwotCi0KLSNkZWZpbmUgTUFYX1BMQVlFUl9OQU1FX1NJWkUgICAgR0FUVF9NQVhfQVRUUl9MRU4KLSNkZWZpbmUgTUFYX1RSQUNLX1RJVExFX1NJWkUgICAgR0FUVF9NQVhfQVRUUl9MRU4KLSNkZWZpbmUgTUFYX1JFU1BPTlNFX0RBVEFfTEVOICAgR0FUVF9NQVhfQVRUUl9MRU4KLSNkZWZpbmUgTUFYX01DUF9DT05ORUNUSU9OICAgICAgNQotCi0jZGVmaW5lIFRSQUNLX1BPU0lUSU9OX1VOQVZBSUxBQkxFIDB4RkZGRkZGRkYKLSNkZWZpbmUgVFJBQ0tfRFVSQVRJT05fVU5BVkFJTEFCTEUgMHhGRkZGRkZGRgotCi0vKiBNZWRpYSBDb250cm9sIFBvaW50IE9wY29kZXMgU3VwcG9ydGVkIGNoYXJhY3RlcmlzdGljcyBiaXQgdmFsdWVzICovCi0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9QTEFZICAgICAgICAgICAgICAgMTw8MAotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUEFVU0UgICAgICAgICAgICAgIDE8PDEKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfU1VQX0ZBU1RfUkVXSU5EICAgICAgICAxPDwyCi0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9GQVNUX0ZPUldBUkQgICAgICAgMTw8MwotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfU1RPUCAgICAgICAgICAgICAgIDE8PDQKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfU1VQX01PVkVfUkVMQVRJVkUgICAgICAxPDw1Ci0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9QUkVWSU9VU19TRUdNRU5UICAgMTw8NgotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfTkVYVF9TRUdNRU5UICAgICAgIDE8PDcKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfU1VQX0ZJUlNUX1NFR01FTlQgICAgICAxPDw4Ci0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9MQVNUX1NFR01FTlQgICAgICAgMTw8OQotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfR09UT19TRUdNRU5UICAgICAgIDE8PDEwCi0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9QUkVWSU9VU19UUkFDSyAgICAgMTw8MTEKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfU1VQX05FWFRfVFJBQ0sgICAgICAgICAxPDwxMgotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfRklSU1RfVFJBQ0sgICAgICAgIDE8PDEzCi0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9MQVNUX1RSQUNLICAgICAgICAgMTw8MTQKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfU1VQX0dPVE9fVFJBQ0sgICAgICAgICAxPDwxNQotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUFJFVklPVVNfR1JPVVAgICAgIDE8PDE2Ci0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9ORVhUX0dST1VQICAgICAgICAgMTw8MTcKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfU1VQX0ZJUlNUX0dST1VQICAgICAgICAxPDwxOAotI2RlZmluZSBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfTEFTVF9HUk9VUCAgICAgICAgIDE8PDE5Ci0jZGVmaW5lIE1DUF9NRURJQV9DT05UUk9MX1NVUF9HT1RPX0dST1VQICAgICAgICAgMTw8MjAKLQotLy9tZWRpYSBjb250cm9sIHBvaW50IG9wY29kZXMKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1BMQVkgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1BBVVNFICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX0ZBU1RfUkVXSU5EICAgICAgIDB4MDMKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX0ZBU1RfRk9SV0FSRCAgICAgIDB4MDQKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1NUT1AgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1BSRVZfVFJBQ0sgICAgICAgIDB4MzAKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX05FWFRfVFJBQ0sgICAgICAgIDB4MzEKLSNkZWZpbmUgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX01PVkVfUkVMQVRJVkUgICAgIDB4MTAKLQotLyogUGxheWluZyBPcmRlciBTdXBwb3J0ZWQgY2hhcmFjdGVyaXN0aWMgYml0IHZhbHVlcyAqLwotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9TSU5HTEVfT05DRSAgICAgICAgMTw8MAotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9TSU5HTEVfUkVQRUFUICAgICAgMTw8MQotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9JTl9PUkRFUl9PTkNFICAgICAgMTw8MgotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9JTl9PUkRFUl9SRVBFQVQgICAgMTw8MwotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9PTERFU1RfT05DRSAgICAgICAgMTw8NAotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9PTERFU1RfUkVQRUFUICAgICAgMTw8NQotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9ORVdFU1RfT05DRSAgICAgICAgMTw8NgotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9ORVdFU1RfUkVQRUFUICAgICAgMTw8NwotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9TSFVGRkxFX09OQ0UgICAgICAgMTw8OAotI2RlZmluZSBNQ1BfUExBWUlOR19PUkVEUl9TSFVGRkxFX1JFUEVBVCAgICAgMTw8OQotCi0jZGVmaW5lIE1DUF9ERUZBVUxUX01FRElBX0NUUkxfU1VQUF9GRUFUICBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUExBWXwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUF9NRURJQV9DT05UUk9MX1NVUF9QQVVTRXwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNQX01FRElBX0NPTlRST0xfU1VQX0ZBU1RfUkVXSU5EfCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfRkFTVF9GT1JXQVJEfCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUF9NRURJQV9DT05UUk9MX1NVUF9TVE9QfCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNQX01FRElBX0NPTlRST0xfU1VQX1BSRVZJT1VTX1RSQUNLfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfTkVYVF9UUkFDSwotCi10eXBlZGVmIGVudW0gewotICAvLyBUTy1ETzogTmFtaW5nIGluIHN1Y2ggYSB3YXkgdG8gZGlzdGluZ3Vpc2ggQlRJRiBhbmQgbG93ZXIgbGF5ZXIgZXZlbnRzCi0gIE1DUF9OT05FX0VWRU5UID0gNzAsCi0gIE1DUF9JTklUX0VWRU5ULAotICBNQ1BfQ0xFQU5VUF9FVkVOVCwKLSAgTUNQX01FRElBX1NUQVRFX1VQREFURSwKLSAgTUNQX01FRElBX1BMQVlFUl9OQU1FX1VQREFURSwKLSAgTUNQX01FRElBX1NVUFBPUlRFRF9PUENPREVfVVBEQVRFLAotICBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9VUERBVEUsCi0gIE1DUF9QTEFZSU5HX09SREVSX1NVUFBPUlRFRF9VUERBVEUsCi0gIE1DUF9QTEFZSU5HX09SREVSX1VQREFURSwKLSAgTUNQX1RSQUNLX0NIQU5HRURfVVBEQVRFLAotICBNQ1BfVFJBQ0tfUE9TSVRJT05fVVBEQVRFLAotICBNQ1BfVFJBQ0tfRFVSQVRJT05fVVBEQVRFLAotICBNQ1BfVFJBQ0tfVElUTEVfVVBEQVRFLAotICBNQ1BfQ0NJRF9VUERBVEUsCi0gIE1DUF9BQ1RJVkVfREVWSUNFX1VQREFURSwKLSAgTUNQX0FDVElWRV9QUk9GSUxFLAotCi0gIC8vbG9jYWwgZXZlbnQgdG8gaGFuZGxlIGluIG1jcCBzdGF0ZSBtYWNoaW5lLAotICBNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JURURfUkVBRCwKLSAgTUNQX1BMQVlJTkdfT1JERVJfUkVBRCwKLSAgTUNQX01FRElBX1NUQVRFX1JFQUQsCi0gIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX09QQ09ERV9TVVBQT1JURURfUkVBRCwKLSAgTUNQX01FRElBX1BMQVlFUl9OQU1FX1JFQUQsCi0gIE1DUF9UUkFDS19USVRMRV9SRUFELAotICBNQ1BfVFJBQ0tfUE9TSVRJT05fUkVBRCwKLSAgTUNQX1RSQUNLX0RVUkFUSU9OX1JFQUQsCi0gIE1DUF9DQ0lEX1JFQUQsCi0gIE1DUF9TRUVLSU5HX1NQRUVEX1JFQUQsCi0gIE1DUF9NRURJQV9TVEFURV9SRUFEX0RFU0NSSVBUT1IsCi0gIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1JFQURfREVTQ1JJUFRPUiwKLSAgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFX1NVUFBPUlRFRF9ERVNDUklQVE9SX1JFQUQsCi0gIE1DUF9NRURJQV9QTEFZRVJfTkFNRV9ERVNDUklQVE9SX1JFQUQsCi0gIE1DUF9UUkFDS19DSEFOR0VEX0RFU0NSSVBUT1JfUkVBRCwKLSAgTUNQX1RSQUNLX1RJVExFX0RFU0NSSVBUT1JfUkVBRCwKLSAgTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfUkVBRCwKLSAgTUNQX1RSQUNLX0RVUkFUSU9OX0RFU0NSSVBUT1JfUkVBRCwKLSAgTUNQX1BMQVlJTkdfT1JERVJfREVTQ1JJUFRPUl9SRUFELAotICBNQ1BfTUVESUFfU1RBVEVfREVTQ1JJUFRPUl9XUklURSwKLSAgTUNQX01FRElBX1BMQVlFUl9OQU1FX0RFU0NSSVBUT1JfV1JJVEUsCi0gIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX0RFU0NSSVBUT1JfV1JJVEUsCi0gIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1NVUFBPUlRFRF9ERVNDUklQVE9SX1dSSVRFLAotICBNQ1BfVFJBQ0tfQ0hBTkdFRF9ERVNDUklQVE9SX1dSSVRFLAotICBNQ1BfVFJBQ0tfVElUTEVfREVTQ1JJUFRPUl9XUklURSwKLSAgTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfV1JJVEUsCi0gIE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1dSSVRFLAotICBNQ1BfUExBWUlOR19PUkRFUl9ERVNDUklQVE9SX1dSSVRFLAotICBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9XUklURSwKLSAgTUNQX1BMQVlJTkdfT1JERVJfV1JJVEUsCi0gIE1DUF9UUkFDS19QT1NJVElPTl9XUklURSwKLS8vZGV2aWNlIHN0YXRlIGV2ZW50Ci0gIE1DUF9OT1RJRllfQUxMLAotICBNQ1BfV1JJVEVfUlNQLAotICBNQ1BfUkVBRF9SU1AsCi0gIE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUCwKLSAgTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1AsCi0gIE1DUF9DT05ORUNUSU9OLAotICBNQ1BfRElTQ09OTkVDVElPTiwKLSAgTUNQX0NPTk5FQ1RJT05fVVBEQVRFLAotICBNQ1BfQ09OR0VTVElPTl9VUERBVEUsCi0gIE1DUF9QSFlfVVBEQVRFLAotICBNQ1BfTVRVX1VQREFURSwKLSAgTUNQX1NFVF9BQ1RJVkVfREVWSUNFLAotICBNQ1BfQ09OTkVDVElPTl9DTE9TRV9FVkVOVCwKLSAgTUNQX0JPTkRfU1RBVEVfQ0hBTkdFX0VWRU5ULAotLy9tZWRpYSB3cml0ZSBvcCBjb2RlIGV2ZW50Ci0gIE1DUF9NRURJQV9DT05UUk9MX1BMQVlfUkVBRF9SRVEsCi0gIE1DUF9NRURJQV9DT05UUk9MX1BBVVNFX1JFUSwKLSAgTUNQX01FRElBX0NPTlRST0xfRkFTVF9GT1JXQVJEX1JFUSwKLSAgTUNQX01FRElBX0NPTlRST0xfRkFTVF9SRVdJTkRfUkVRLAotICBNQ1BfTUVESUFfQ09OVFJPTF9NT1ZFX1JFTEFUSVZFX1JFUSwKLSAgTUNQX01FRElBX0NPTlRST0xfU1RPUF9SRVEsCi0gIE1DUF9NRURJQV9DT05UUk9MX05FWFRfVFJBQ0tfUkVRLAotICBNQ1BfTUVESUFfQ09OVFJPTF9QUkVWSU9VU19UUkFDS19SRVEsCi0gIE1DUF9QTEFZSU5HX09SRURSX1NIVUZGTEVfUkVQRUFUX1JFUSwKLQotfW1jcF9ldmVudF90OwotCi0vL3N0YXRlIGhhbmRsZXIgZGVjbGFyYXRpb24KLXR5cGVkZWYgYm9vbCAoKm1jcF9oYW5kbGVyKSh1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0sIHVpbnQ4X3Qgc3RhdGUpOwotdHlwZWRlZiBlbnVtIHsKLSAgLy9tZWRpYSBjb25yb2wgcG9pbnQgc3VjY2VzcyBvciBlcnJvciBjb2RlCi0gIE1DUF9TVEFUVVNfU1VDQ0VTUyA9IDEsCi0gIE1DUF9PUENPREVfTk9UX1NVUFBPUlRFRCwKLSAgTUNQX01FRElBX1BMQVlFUl9JTkFDVElWRSwKLSAgTUNQX0NPTU1BTkRfQ0FOTk9UX0NPTVBMRVRFRCwKLQotICBCVF9TVEFUVVNfREVWSUNFX05PVF9DT05ORUNURUQsCi0gIEJUX1NUQVRVU19IQU5MREVfTk9UX01BVENIRUQsCi19bWNwX2Vycm9yX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIE1DUF9ESVNDT05ORUNURUQgPSAweDAwLAotICBNQ1BfQ09OTkVDVEVELAotICBNQ1BfTUFYX0RFVklDRV9TVEFURQotfSByZW1vdGVfZGV2aWNlX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIE1DUF9TVEFURV9JTkFDVElWRSA9IDB4MDAsCi0gIE1DUF9TVEFURV9QTEFZSU5HLAotICBNQ1BfU1RBVEVfUEFVU0UsCi0gIE1DUF9TVEFURV9TRUVLSU5HLAotICBNQ1BfTUFYX01FRElBX1NUQVRFCi19IG1jcF9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgbWVkaWFfc3RhdGU7Ci0gIHVpbnQxNl90IG1lZGlhX2N0cmxfcG9pbnQ7Ci0gIHVpbnQzMl90IG1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICB1aW50OF90IHBsYXllcl9uYW1lW01BWF9QTEFZRVJfTkFNRV9TSVpFXTsKLSAgdWludDE2X3QgcGxheWVyX25hbWVfbGVuOwotICB1aW50OF90IHRyYWNrX2NoYW5nZWQ7Ci0gIGludDMyX3QgZHVyYXRpb247Ci0gIGludDMyX3QgcG9zaXRpb247Ci0gIHVpbnQxNl90IHBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkOwotICB1aW50OF90IHBsYXlpbmdfb3JkZXJfdmFsdWU7Ci0gIHVpbnQ4X3QgdGl0bGVbTUFYX1RSQUNLX1RJVExFX1NJWkVdOwotICB1aW50MTZfdCB0cmFja190aXRsZV9sZW47Ci0gIHVpbnQ4X3QgY2NpZDsKLSAgdWludDhfdCBzZWVraW5nX3NwZWVkOwotICBtY3BfaGFuZGxlciBNZWRpYVN0YXRlSGFuZGxlclBvaW50ZXJbTUNQX01BWF9NRURJQV9TVEFURV07Ci19IE1lZGlhUGxheWVySW5mb190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBzZXJ2ZXJfaWY7Ci0gIFV1aWQgbWNzX3NlcnZpY2VfdXVpZDsKLSAgVXVpZCBtZWRpYV9zdGF0ZV91dWlkOwotICBVdWlkIG1lZGlhX3BsYXllcl9uYW1lX3V1aWQ7Ci0gIFV1aWQgbWVkaWFfY29udHJvbF9wb2ludF91dWlkOwotICBVdWlkIG1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF91dWlkOwotICBVdWlkIHRyYWNrX2NoYW5nZWRfdXVpZDsKLSAgVXVpZCB0cmFja190aXRsZV91dWlkOwotICBVdWlkIHRyYWNrX2R1cmF0aW9uX3V1aWQ7Ci0gIFV1aWQgdHJhY2tfcG9zaXRpb25fdXVpZDsKLSAgVXVpZCBwbGF5aW5nX29yZGVyX3N1cHBvcnRlZF91dWlkOwotICBVdWlkIHBsYXlpbmdfb3JkZXJfdXVpZDsKLSAgVXVpZCBjY2lkX3V1aWQ7Ci0gIFV1aWQgc2Vla2luZ19zcGVlZF91dWlkOwotICAvL2hhbmRsZSBmb3IgY2hhcmFjdGVyaXN0aWNzCi0gIHVpbnQxNl90IG1lZGlhX3N0YXRlX2hhbmRsZTsKLSAgdWludDE2X3QgbWVkaWFfcGxheWVyX25hbWVfaGFuZGxlOwotICB1aW50MTZfdCBtZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlOwotICB1aW50MTZfdCBtZWRpYV9jb250cm9sX3BvaW50X2hhbmRsZTsKLSAgdWludDE2X3QgdHJhY2tfY2hhbmdlZF9oYW5kbGU7Ci0gIHVpbnQxNl90IHRyYWNrX3RpdGxlX2hhbmRsZTsKLSAgdWludDE2X3QgdHJhY2tfZHVyYXRpb25faGFuZGxlOwotICB1aW50MTZfdCB0cmFja19wb3NpdGlvbl9oYW5kbGU7Ci0gIHVpbnQxNl90IHBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkX2hhbmRsZTsKLSAgdWludDE2X3QgcGxheWluZ19vcmRlcl9oYW5kbGU7Ci0gIHVpbnQxNl90IGNjaWRfaGFuZGxlOwotICB1aW50MTZfdCBzZWVraW5nX3NwZWVkX2hhbmRsZTsKLSAgdWludDE2X3QgbWVkaWFfc3RhdGVfZGVzYzsKLSAgdWludDE2X3QgbWVkaWFfcGxheWVyX25hbWVfZGVzYzsKLSAgdWludDE2X3QgbWVkaWFfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX2Rlc2M7Ci0gIHVpbnQxNl90IG1lZGlhX2NvbnRyb2xfcG9pbnRfZGVzYzsKLSAgdWludDE2X3QgdHJhY2tfY2hhbmdlZF9kZXNjOwotICB1aW50MTZfdCB0cmFja190aXRsZV9kZXNjOwotICB1aW50MTZfdCB0cmFja19kdXJhdGlvbl9kZXNjOwotICB1aW50MTZfdCB0cmFja19wb3NpdGlvbl9kZXNjOwotICB1aW50MTZfdCBwbGF5aW5nX29yZGVyX3N1cHBvcnRlZF9kZXNjOwotICB1aW50MTZfdCBwbGF5aW5nX29yZGVyX2Rlc2M7Ci0gIHVpbnQxNl90IGNjaWRfZGVzYzsKLSAgdWludDE2X3Qgc2Vla2luZ19zcGVlZF9kZXNjOwotfSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mb190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHJlbW90ZV9kZXZpY2Vfc3RhdGVfdCBzdGF0ZTsKLSAgdWludDhfdCBhY3RpdmVfcHJvZmlsZTsKLSAgdWludDE2X3QgbWVkaWFfc3RhdGVfbm90aWZ5OwotICB1aW50MTZfdCBtZWRpYV9wbGF5ZXJfbmFtZV9ub3RpZnk7Ci0gIHVpbnQxNl90IG1lZGlhX2NvbnRyb2xfcG9pbnRfbm90aWZ5OwotICB1aW50MTZfdCBtZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfbm90aWZ5OwotICB1aW50MTZfdCB0cmFja19jaGFuZ2VkX25vdGlmeTsKLSAgdWludDE2X3QgdHJhY2tfZHVyYXRpb25fbm90aWZ5OwotICB1aW50MTZfdCB0cmFja190aXRsZV9ub3RpZnk7Ci0gIHVpbnQxNl90IHRyYWNrX3Bvc2l0aW9uX25vdGlmeTsKLSAgdWludDE2X3QgcGxheWluZ19vcmRlcl9ub3RpZnk7Ci0gIHVpbnQxNl90IHNlZWtpbmdfc3BlZWRfbm90aWZ5OwotICBib29sIGNvbmdlc3RlZDsKLSAgaW50IGNvbm5faWQ7Ci0gIGludCB0cmFuc19pZDsKLSAgaW50IHRpbWVvdXQ7Ci0gIGludCBsYXRlbmN5OwotICBpbnQgaW50ZXJ2YWw7Ci0gIGludCByeF9waHk7Ci0gIGludCB0eF9waHk7Ci0gIGludCBtdHU7Ci0gIFJhd0FkZHJlc3MgcGVlcl9iZGE7Ci0gIG1jcF9oYW5kbGVyIERldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbTUNQX01BWF9ERVZJQ0VfU1RBVEVdOwotfVJlbW90ZURldmljZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBhZGRyZXNzOwotICBpbnQgc2V0X2lkOwotfUFjdGl2ZURldmljZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3Qgbm90aWZpY2F0aW9uOwotICB1aW50MzJfdCB0cmFuc19pZDsKLSAgdWludDMyX3QgZGVzY19oYW5kbGU7Ci0gIHVpbnQzMl90IGNoYXJfaGFuZGxlOwotICBib29sIG5lZWRfcnNwOwotICBib29sIHByZXBfcnNwOwotICAvL2lzIHRvIHNlbmQgbm90aWZpY2F0aW9uCi0gIHVpbnQ4X3QgKmRhdGE7Ci0gIHVpbnQxNl90IGxlbjsKLX10TUNQX0RFU0NfV1JJVEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQzMl90IHRyYW5zX2lkOwotICB1aW50MzJfdCBkZXNjX2hhbmRsZTsKLSAgdWludDMyX3QgY2hhcl9oYW5kbGU7Ci19dE1DUF9ERVNDX1JFQUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpc19sb25nOwotICB1aW50OF90IHN0YXR1czsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0gIHVpbnQzMl90IGNoYXJfaGFuZGxlOwotfXRNQ1BfUkVBRDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHN0YXR1czsKLSAgYm9vbCBuZWVkX3JzcDsKLSAgYm9vbCBwcmVwX3JzcDsKLSAgdWludDE2X3Qgb2Zmc2V0OwotICB1aW50MzJfdCB0cmFuc19pZDsKLSAgdWludDE2X3QgY2hhcl9oYW5kbGU7Ci0gIC8vaXMgdG8gc2VuZCBub3RpZmljYXRpb24KLSAgdWludDhfdCBkYXRhW0dBVFRfTUFYX0FUVFJfTEVOXTsKLX10TUNQX1dSSVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICBSZW1vdGVEZXZpY2UgcmVtb3RlRGV2aWNlOwotfXRNQ1BfQ09OTkVDVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHN0YXR1czsKLSAgaW50IHRpbWVvdXQ7Ci0gIGludCBsYXRlbmN5OwotICBpbnQgaW50ZXJ2YWw7Ci19dE1DUF9DT05OX1VQREFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHN0YXR1czsKLSAgUmVtb3RlRGV2aWNlICpyZW1vdGVEZXZpY2U7Ci19dE1DUF9ESVNDT05ORUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgY29uZ2VzdGVkOwotICBSZW1vdGVEZXZpY2UgKnJlbW90ZURldmljZTsKLX0gdE1DUF9DT05HRVNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50OF90IHR4X3BoeTsKLSAgdWludDhfdCByeF9waHk7Ci0gIFJlbW90ZURldmljZSAqcmVtb3RlRGV2aWNlOwotfSB0TUNQX1BIWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgbXR1OwotICBSZW1vdGVEZXZpY2UgKnJlbW90ZURldmljZTsKLX0gdE1DUF9NVFU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0ZTsKLX10TUNQX01FRElBX1NUQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHJlcV9vcGNvZGU7Ci0gIHVpbnQ4X3QgcmVzdWx0OwotfXRNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBzdXBwb3J0ZWQ7Ci19dE1DUF9NRURJQV9PUENPREVfU1VQUE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90ICpuYW1lOwotICB1aW50MTZfdCBsZW47Ci19dE1DUF9NRURJQV9QTEFZRVJfTkFNRTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIHN0YXR1czsKLX10TUNQX1RSQUNLX0NIQU5HRUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50MzJfdCBwb3NpdGlvbjsKLX10TUNQX1RSQUNLX1BPU1RJT047Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgZHVyYXRpb247Ci19dE1DUF9UUkFDS19EVVJBVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90ICp0aXRsZTsKLSAgdWludDE2X3QgbGVuOwotfXRNQ1BfVFJBQ0tfVElUTEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBjY2lkOwotfXRNQ1BfQ09OVEVOVF9DT05UUk9MX0lEOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc2Vla19zcGVlZDsKLX10TUNQX1NFRUtJTkdfU1BFRURfQ09OVFJPTF9JRDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGFkZHI7Ci19dE1DUF9DT05ORUNUSU9OX0NMT1NFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLSAgaW50IHN0YXRlOwotfXRNQ1BfQk9ORF9TVEFURV9DSEFOR0U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3Qgb3JkZXJfc3VwcG9ydGVkOwotfXRNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgb3JkZXI7Ci19dE1DUF9QTEFZSU5HX09SREVSOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYWRkcmVzczsKLSAgdWludDE2X3Qgc2V0X2lkOwotICB1aW50OF90IHByb2ZpbGU7Ci19dE1DUF9TRVRfQUNUSVZFX0RFVklDRTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90ICpkYXRhOwotICB1aW50MTZfdCBsZW47Ci19dE1DUF9NRURJQV9VUERBVEU7Ci0KLXVuaW9uIHRNQ1BfTUVESUFfT1BFUkFUSU9OewotICB0TUNQX01FRElBX1VQREFURSBNZWRpYVVwZGF0ZU9wOwotICB0TUNQX1NFVF9BQ1RJVkVfREVWSUNFIFNldEFjdGl2ZURldmljZU9wOwotICB0TUNQX0RFU0NfV1JJVEUgV3JpdGVEZXNjT3A7Ci0gIHRNQ1BfREVTQ19SRUFEIFJlYWREZXNjT3A7Ci0gIHRNQ1BfV1JJVEUgV3JpdGVPcDsKLSAgdE1DUF9SRUFEIFJlYWRPcDsKLSAgdE1DUF9DT05ORUNUSU9OIENvbm5lY3Rpb25PcDsKLSAgdE1DUF9DT05OX1VQREFURSBDb25uZWN0aW9uVXBkYXRlT3A7Ci0gIHRNQ1BfRElTQ09OTkVDVElPTiBEaXNjb25uZWN0aW9uT3A7Ci0gIHRNQ1BfQ09OR0VTVElPTiBDb25nZXN0aW9uT3A7Ci0gIHRNQ1BfTVRVIE10dU9wOwotICB0TUNQX1BIWSBQaHlPcDsKLX07Ci0KLXR5cGVkZWYgdW5pb24gdE1DUF9NRURJQV9PUEVSQVRJT04gdE1DUF9NRURJQV9PUEVSQVRJT047Ci0KLXN0cnVjdCBtY3BfcmVzcF90IHsKLSAgdWludDMyX3QgZXZlbnQ7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3Qgc3RhdHVzOwotICBSZW1vdGVEZXZpY2UgKnJlbW90ZURldmljZTsKLSAgdEdBVFRTX1JTUCByc3BfdmFsdWU7Ci0gIHRNQ1BfTUVESUFfT1BFUkFUSU9OIG9wZXI7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtY3BfcmVzcF90IG1jcF9yZXNwX3Q7Ci0KLWNsYXNzIE1jcFNlcnZlciB7Ci0gIHB1YmxpYzoKLSAgdmlydHVhbCB+TWNwU2VydmVyKCkgPSBkZWZhdWx0OwotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKGJsdWV0b290aDo6bWNwX3NlcnZlcjo6TWNwU2VydmVyQ2FsbGJhY2tzKiBjYWxsYmFja3MsIFV1aWQgYXBfaWQpOwotICBzdGF0aWMgdm9pZCBDbGVhblVwKCk7Ci0gIHN0YXRpYyBNY3BTZXJ2ZXIqIEdldCgpOwotICBzdGF0aWMgYm9vbCBpc01jcFNlcnZpY2VSdW5uaWcoKTsKLSAgdmlydHVhbCB2b2lkIE1lZGlhU3RhdGUodWludDhfdCBzdGF0ZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgTWVkaWFQbGF5ZXJOYW1lKHVpbnQ4X3QqIHBsYXllcl9uYW1lKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBNZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZCh1aW50MzJfdCBmZWF0dXJlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBNZWRpYUNvbnRyb2xQb2ludCh1aW50OF90IHZhbHVlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBUcmFja0NoYW5nZWQoYm9vbCBzdGF0dXMpID0gMDsKLSAgdmlydHVhbCB2b2lkIFRyYWNrRHVyYXRpb24oaW50MzJfdCBkdXJhdGlvbikgPSAwOwotICB2aXJ0dWFsIHZvaWQgVHJhY2tUaXRsZSh1aW50OF90KiB0aXRsZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgVHJhY2tQb3NpdGlvbihpbnQzMl90IHBvc2l0aW9uKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBQbGF5aW5nT3JkZXJTdXBwb3J0ZWQodWludDE2X3Qgb3JkZXIpID0gMDsKLSAgdmlydHVhbCB2b2lkIFBsYXlpbmdPcmRlcih1aW50OF90IHZhbHVlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRBY3RpdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHNldElkLCBpbnQgcHJvZmlsZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ29udGVudENvbnRyb2xJZCh1aW50OF90IGNjaWQpID0gMDsKLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3RNY3AoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgQm9uZFN0YXRlQ2hhbmdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBzdGF0ZSkgPSAwOwotfTsKLQotdm9pZCBNY3BDb25nZXN0aW9uVXBkYXRlKG1jcF9yZXNwX3QgKnBfZGF0YSk7Ci0KLSNlbmRpZiAvLyBCVEFfTUNQX0FQSV9ICmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX3BhY3NfY2xpZW50X2FwaS5oIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV9wYWNzX2NsaWVudF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNjRkOC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvYnRhX3BhY3NfY2xpZW50X2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgcGFjcyB7Ci0KLWNsYXNzIFBhY3NDbGllbnQgewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+UGFjc0NsaWVudCgpID0gZGVmYXVsdDsKLQotICAgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OlBhY3NDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0gICAgc3RhdGljIHZvaWQgQ2xlYW5VcCh1aW50MTZfdCBjbGllbnRfaWQpOwotICAgIHN0YXRpYyBQYWNzQ2xpZW50KiBHZXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBTdGFydERpc2NvdmVyeSh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBHZXRBdWRpb0F2YWlsYWJpbGl0eSh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFjcwotfSAgLy8gbmFtZXNwYWNlIGJhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV92Y3BfY29udHJvbGxlcl9hcGkuaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvaW5jbHVkZS9idGFfdmNwX2NvbnRyb2xsZXJfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTgyNjIuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2J0YV92Y3BfY29udHJvbGxlcl9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICpDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFja19mb3J3YXJkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfdmNwX2NvbnRyb2xsZXIuaD4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1lbnVtIHsKLSAgQlRBX1ZDUF9ESVNDT05ORUNURUQgPSAweDAsCi0gIEJUQV9WQ1BfQ09OTkVDVElORywKLSAgQlRBX1ZDUF9DT05ORUNURUQsCi0gIEJUQV9WQ1BfRElTQ09OTkVDVElORywKLX07Ci0KLWVudW0gewotICBWQ1NfVk9MVU1FX1NUQVRFX1JFQURfQ01QTF9FVlQgPSAweDAsCi0gIFZDU19WT0xVTUVfRkxBR1NfUkVBRF9DTVBMX0VWVCwKLSAgVkNTX1ZPTFVNRV9TVEFURV9DQ0NfV1JJVEVfQ01QTF9FVlQsCi0gIFZDU19WT0xVTUVfRkxBR1NfQ0NDX1dSSVRFX0NNUExfRVZULAotfTsKLQotZW51bSB7Ci0gIFZDU19DT05UUk9MX1BPSU5UX09QX1JFTF9WT0xVTUVfRE9XTiA9IDB4MCwKLSAgVkNTX0NPTlRST0xfUE9JTlRfT1BfUkVMX1ZPTFVNRV9VUCwKLSAgVkNTX0NPTlRST0xfUE9JTlRfT1BfVU5NVVRFX1JFTF9WT0xVTUVfRE9XTiwKLSAgVkNTX0NPTlRST0xfUE9JTlRfT1BfVU5NVVRFX1JFTF9WT0xVTUVfVVAsCi0gIFZDU19DT05UUk9MX1BPSU5UX09QX1NFVF9BQlNfVk9MLAotICBWQ1NfQ09OVFJPTF9QT0lOVF9PUF9VTk1VVEUsCi0gIFZDU19DT05UUk9MX1BPSU5UX09QX01VVEUsCi19OwotCi1lbnVtIHsKLSAgVkNTX1VOTVVURV9TVEFURSA9IDB4MCwKLSAgVkNTX01VVEVfU1RBVEUsCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgb3BfaWQ7Ci0gIHVpbnQ4X3QgY2hhbmdlX2NvdW50ZXI7Ci0gIHVpbnQ4X3Qgdm9sdW1lX3NldHRpbmc7Ci19IFNldEFic1ZvbHVtZU9wOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgb3BfaWQ7Ci0gIHVpbnQ4X3QgY2hhbmdlX2NvdW50ZXI7Ci19IE11dGVPcDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG9wX2lkOwotICB1aW50OF90IGNoYW5nZV9jb3VudGVyOwotfSBVbm11dGVPcDsKLQotc3RydWN0IFZvbHVtZVN0YXRlIHsKLSAgdWludDhfdCB2b2x1bWVfc2V0dGluZzsKLSAgdWludDhfdCBtdXRlOwotICB1aW50OF90IGNoYW5nZV9jb3VudGVyOwotCi0gIFZvbHVtZVN0YXRlKCkKLSAgICAgIDogdm9sdW1lX3NldHRpbmcoMCksCi0gICAgICAgIG11dGUoMCksCi0gICAgICAgIGNoYW5nZV9jb3VudGVyKDApIHt9Ci19OwotCi1zdHJ1Y3QgVm9sdW1lQ29udHJvbFNlcnZpY2UgewotICB1aW50MTZfdCB2b2x1bWVfc3RhdGVfaGFuZGxlOwotICB1aW50MTZfdCB2b2x1bWVfY29udHJvbF9wb2ludF9oYW5kbGU7Ci0gIHVpbnQxNl90IHZvbHVtZV9mbGFnc19oYW5kbGU7Ci0gIHVpbnQxNl90IHZvbHVtZV9zdGF0ZV9jY2NfaGFuZGxlOwotICB1aW50MTZfdCB2b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZTsKLQotICBWb2x1bWVTdGF0ZSB2b2x1bWVfc3RhdGU7Ci0gIHVpbnQ4X3Qgdm9sdW1lX2ZsYWdzOwotICB1aW50OF90IHBlbmRpbmdfdm9sdW1lX3NldHRpbmc7Ci0gIHVpbnQ4X3QgcGVuZGluZ19tdXRlX3NldHRpbmc7Ci0gIHVpbnQ4X3QgcmV0cnlfY21kOwotCi0gIFZvbHVtZUNvbnRyb2xTZXJ2aWNlKCkKLSAgICAgIDogdm9sdW1lX3N0YXRlX2hhbmRsZSgwKSwKLSAgICAgICAgdm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlKDApLAotICAgICAgICB2b2x1bWVfZmxhZ3NfaGFuZGxlKDApLAotICAgICAgICB2b2x1bWVfc3RhdGVfY2NjX2hhbmRsZSgwKSwKLSAgICAgICAgdm9sdW1lX2ZsYWdzX2NjY19oYW5kbGUoMCksCi0gICAgICAgIHZvbHVtZV9zdGF0ZSgpLAotICAgICAgICB2b2x1bWVfZmxhZ3MoMCksCi0gICAgICAgIHBlbmRpbmdfdm9sdW1lX3NldHRpbmcoMCksCi0gICAgICAgIHBlbmRpbmdfbXV0ZV9zZXR0aW5nKDApLAotICAgICAgICByZXRyeV9jbWQoMCkge30KLX07Ci0KLXN0cnVjdCBSZW5kZXJlckRldmljZSB7Ci0gIFJhd0FkZHJlc3MgYWRkcmVzczsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdWludDhfdCBzdGF0ZTsKLSAgYm9vbCBiZ19jb25uOwotICBib29sIHNlcnZpY2VfY2hhbmdlZF9yY3ZkOwotICBWb2x1bWVDb250cm9sU2VydmljZSB2Y3M7Ci0KLSAgUmVuZGVyZXJEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykKLSAgICAgIDogYWRkcmVzcyhhZGRyZXNzKSwKLSAgICAgICAgY29ubl9pZCgwKSwKLSAgICAgICAgc3RhdGUoQlRBX1ZDUF9ESVNDT05ORUNURUQpLAotICAgICAgICBiZ19jb25uKGZhbHNlKSwKLSAgICAgICAgc2VydmljZV9jaGFuZ2VkX3JjdmQoZmFsc2UpLAotICAgICAgICB2Y3MoKSB7fQotCi0gIFJlbmRlcmVyRGV2aWNlKCkgOiBSZW5kZXJlckRldmljZShSYXdBZGRyZXNzOjprRW1wdHkpIHt9Ci19OwotCi1jbGFzcyBWY3BDb250cm9sbGVyIHsKLSAgIHB1YmxpYzoKLSAgdmlydHVhbCB+VmNwQ29udHJvbGxlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OlZjcENvbnRyb2xsZXJDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLSAgc3RhdGljIFZjcENvbnRyb2xsZXIqIEdldCgpOwotICBzdGF0aWMgYm9vbCBJc1ZjcENvbnRyb2xsZXJSdW5uaW5nKCk7Ci0gIHN0YXRpYyBpbnQgR2V0RGV2aWNlQ291bnQoKTsKLQotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBib29sIGlzRGlyZWN0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldEFic1ZvbHVtZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHZvbHVtZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgTXV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBVbm11dGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotfTsKLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9pbmNsdWRlL2Nvbm5lY3RlZF9pc29fYXBpLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvY29ubmVjdGVkX2lzb19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlMTZjYy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUvY29ubmVjdGVkX2lzb19hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9iYXBfdWNsaWVudC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBiYXAgewotbmFtZXNwYWNlIGNpcyB7Ci0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q0lTQ29uZmlnOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDSUdDb25maWc7Ci0KLWNvbnN0ZXhwciB1aW50OF90ICBESVJfVE9fQUlSICAgID0gMHgxIDw8IDA7Ci1jb25zdGV4cHIgdWludDhfdCAgRElSX0ZST01fQUlSICA9IDB4MSA8PCAxOwotCi10eXBlZGVmIHVpbnQ4X3Qgc2R1X2ludGVydmFsX3RbM107Ci0KLWVudW0gY2xhc3MgQ2lzU3RhdGUgewotICBJTlZBTElEID0gMCwKLSAgUkVBRFksCi0gIERFU1RST1lJTkcsCi0gIEVTVEFCTElTSElORywKLSAgRVNUQUJMSVNIRUQKLX07Ci0KLWVudW0gY2xhc3MgQ2lnU3RhdGUgewotICBJTlZBTElEID0gMCwKLSAgSURMRSwKLSAgQ1JFQVRJTkcsCi0gIENSRUFURUQsCi0gIFJFTU9WSU5HCi19OwotCi1lbnVtIElzb0hjaVN0YXR1cyB7Ci0gIElTT19IQ0lfU1VDQ0VTUyA9IDAsCi0gIElTT19IQ0lfRkFJTEVELAotICBJU09fSENJX0lOX1BST0dSRVNTCi19OwotCi1jbGFzcyBDaXNJbnRlcmZhY2VDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q2lzSW50ZXJmYWNlQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UgKi8KLSAgdmlydHVhbCB2b2lkIE9uQ2lnU3RhdGUodWludDhfdCBjaWdfaWQsIENpZ1N0YXRlIHN0YXRlKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uQ2lzU3RhdGUodWludDhfdCBjaWdfaWQsIHVpbnQ4X3QgY2lzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbiwgQ2lzU3RhdGUgc3RhdGUpID0gMDsKLX07Ci0KLWNsYXNzIENpc0ludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5DaXNJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShDaXNJbnRlcmZhY2VDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLSAgc3RhdGljIENpc0ludGVyZmFjZSogR2V0KCk7Ci0KLSAgdmlydHVhbCBDaWdTdGF0ZSBHZXRDaWdTdGF0ZShjb25zdCB1aW50OF90ICZjaWdfaWQpOwotCi0gIHZpcnR1YWwgQ2lzU3RhdGUgR2V0Q2lzU3RhdGUoY29uc3QgdWludDhfdCAmY2lnX2lkLCB1aW50OF90IGNpc19pZCk7Ci0KLSAgdmlydHVhbCB1aW50OF90IEdldENpc0NvdW50KGNvbnN0IHVpbnQ4X3QgJmNpZ19pZCkgPSAwOwotCi0gIHZpcnR1YWwgSXNvSGNpU3RhdHVzIENyZWF0ZUNpZyhSYXdBZGRyZXNzIGNsaWVudF9wZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIENJR0NvbmZpZyAmY2lnX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDSVNDb25maWc+ICZjaXNfY29uZmlncykgPSAwOwotCi0gIHZpcnR1YWwgSXNvSGNpU3RhdHVzIFJlbW92ZUNpZyhSYXdBZGRyZXNzIHBlZXJfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaWdfaWQpID0gMDsKLQotICB2aXJ0dWFsIElzb0hjaVN0YXR1cyBDcmVhdGVDaXModWludDhfdCBjaWdfaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNpc19pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzIHBlZXJfYmRhKSA9IDA7Ci0KLSAgdmlydHVhbCBJc29IY2lTdGF0dXMgRGlzY29ubmVjdENpcyh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaXJlY3Rpb24pID0gMDsKLQotICB2aXJ0dWFsIElzb0hjaVN0YXR1cyBTZXR1cERhdGFQYXRoKHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhdGhfaWQpID0gMDsKLQotICB2aXJ0dWFsIElzb0hjaVN0YXR1cyBSZW1vdmVEYXRhUGF0aCh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbikgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHVjYXN0Ci19ICAvLyBuYW1lc3BhY2UgYmFwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL21jcC9idGFfbWNwX21haW4uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL21jcC9idGFfbWNwX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjBlYzIuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0YS9tY3AvYnRhX21jcF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzA4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgTUNQIHNlcnZlciBtYWluIGZ1bmN0aW9ucyBhbmQgc3RhdGUgbWFjaGluZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YV9tY3BfYXBpLmgiCi0jaW5jbHVkZSAiZ2F0dHNfb3BzX3F1ZXVlLmgiCi0jaW5jbHVkZSAiYnRtX2ludC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiYnRhX3N5cy5oIgotI2luY2x1ZGUgImJ0aWZfdXRpbC5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OkdhdHRzT3BzUXVldWU7Ci0KLWNsYXNzIE1jcFNlcnZlckltcGw7Ci1zdGF0aWMgTWNwU2VydmVySW1wbCAqaW5zdGFuY2U7Ci0KLS8vZ2xvYmFsIHZhcmlhYmxlcwotbWNzU2VydmVyU2VydmljZUluZm9fdCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mbzsKLU1lZGlhUGxheWVySW5mb190IG1lZGlhUGxheWVySW5mbzsKLQotdm9pZCBIYW5kbGVNY3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0pOwotCi10eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2UpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uTWNwU2VydmljZUFkZGVkOwotCi1zdGF0aWMgdm9pZCBPbk1jcFNlcnZpY2VBZGRlZENiKHVpbnQ4X3Qgc3RhdHVzLCBpbnQgc2VydmVySWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlKTsKLQotLyogTWVkaWEgc3RhdGUgaGFuZGxlcnMgKi8KLXN0YXRpYyBib29sIE1lZGlhU3RhdGVJbmFjdGl2ZUhhbmRsZXIodWludDMyX3QgZXZlbnQsIHZvaWQqIHBhcmFtLCB1aW50OF90IHN0YXRlKTsKLXN0YXRpYyBib29sIE1lZGlhU3RhdGVQYXVzZUhhbmRsZXIodWludDMyX3QgZXZlbnQsIHZvaWQqIHBhcmFtLCB1aW50OF90IHN0YXRlKTsKLXN0YXRpYyBib29sIE1lZGlhU3RhdGVQbGF5aW5nSGFuZGxlcih1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0sIHVpbnQ4X3Qgc3RhdGUpOwotc3RhdGljIGJvb2wgTWVkaWFTdGF0ZVNlZWtpbmdIYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSwgdWludDhfdCBzdGF0ZSk7Ci0KLS8qIENvbm5lY3Rpb24gc3RhdGUgbWFjaGluZSBoYW5kbGVycyAqLwotc3RhdGljIGJvb2wgRGV2aWNlU3RhdGVDb25uZWN0aW9uSGFuZGxlcih1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0sIHVpbnQ4X3Qgc3RhdGUpOwotc3RhdGljIGJvb2wgRGV2aWNlU3RhdGVEaXNjb25uZWN0ZWRIYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSwgdWludDhfdCBzdGF0ZSk7Ci0KLVV1aWQgTUNTX1VVSUQgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjE4NDgiKTsKLVV1aWQgR01DU19VVUlEICA9IFV1aWQ6OkZyb21TdHJpbmcoIjE4NDkiKTsKLQotVXVpZCBERVNDUklQVE9SX1VVSUQgPSBVdWlkOjpGcm9tU3RyaW5nKCIyOTAyIik7Ci0KLVV1aWQgR01DU19NRURJQV9TVEFURV9VVUlEICAgICAgICAgICAgICAgICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkJBMyIpOwotVXVpZCBHTUNTX01FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFX1NVUFBPUlRFRCAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQkE1Iik7Ci1VdWlkIEdNQ1NfTUVESUFfUExBWUVSX05BTUVfVVVJRCAgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCOTMiKTsKLVV1aWQgR01DU19NRURJQV9DT05UUk9MX1BPSU5UICAgICAgICAgICAgICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkJBNCIpOwotVXVpZCBHTUNTX1RSQUNLX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQjk2Iik7Ci1VdWlkIEdNQ1NfVFJBQ0tfVElUTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCOTciKTsKLVV1aWQgR01DU19UUkFDS19EVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkI5OCIpOwotVXVpZCBHTUNTX1RSQUNLX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQjk5Iik7Ci1VdWlkIEdNQ1NfUExBWUlOR19PUkRFUl9TVVBQT1JURUQgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCQTIiKTsKLVV1aWQgR01DU19QTEFZSU5HX09SREVSICAgICAgICAgICAgICAgICAgICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMkJBMSIpOwotVXVpZCBHTUNTX0NPTlRFTlRfQ09OVFJPTElEICAgICAgICAgICAgICAgICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQkJBIik7Ci1VdWlkIEdNQ1NfU0VFS0lOR19TUEVFRF9VVUlEICAgICAgICAgICAgICAgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCOUIiKTsKLQotCi0gIGJvb2wgaXNfcHRzX3J1bm5pbmcoKSB7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0geydcMCd9OwotICAgIGJvb2wgcHRzX3Rlc3RfZW5hYmxlZCA9IGZhbHNlOwotICAgIG9zaV9wcm9wZXJ0eV9nZXQoInBlcnNpc3QudmVuZG9yLnNlcnZpY2UuYnQubWNzLnB0cyIsIHZhbHVlLCAiZmFsc2UiKTsKLSAgICBwdHNfdGVzdF9lbmFibGVkID0gKHN0cmNtcCh2YWx1ZSwgInRydWUiKSA9PSAwKTsKLSAgICBMT0coSU5GTykgPDwgInB0cyB0ZXN0IGVuYWJsZWQgIiA8PCBwdHNfdGVzdF9lbmFibGVkOwotICAgIHJldHVybiBwdHNfdGVzdF9lbmFibGVkOwotICB9Ci0KLSAgaW50IHBsYXlpbmdfb3JkZXJfb3Bjb2RlKGludCBkYXRhKSB7Ci0gICAgaW50IGV2ZW50ID0gMDsKLSAgICBpZiAoZGF0YSAmIE1DUF9QTEFZSU5HX09SRURSX1NIVUZGTEVfUkVQRUFUKSB7Ci0gICAgICBldmVudCA9IE1DUF9QTEFZSU5HX09SRURSX1NIVUZGTEVfUkVQRUFUX1JFUTsKLSAgICB9IGVsc2UKLSAgICAgIExPRyhJTkZPKSA8PCAib3Bjb2RlIG5vdCBtYXRjaGVkIG9yIG5vdCBzdXBwb3J0ZWQiOwotICAgIHJldHVybiBldmVudDsKLSAgfQotCi0gIGJvb2wgaXNfb3Bjb2RlX3N1cHBvcnRlZChpbnQgZGF0YSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZGF0YSAiIDw8IGRhdGEgPDwgIm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlICIgPDwgbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICAgIHN3aXRjaCAoZGF0YSkgewotICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUExBWToKLSAgICAgICAgcmV0dXJuIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUgJiBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUExBWSk7Ci0gICAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9QQVVTRToKLSAgICAgICAgcmV0dXJuIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUgJiBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUEFVU0UpOwotICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfRkFTVF9SRVdJTkQ6Ci0gICAgICAgIHJldHVybiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlICYgTUNQX01FRElBX0NPTlRST0xfU1VQX0ZBU1RfUkVXSU5EKTsKLSAgICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX0ZBU1RfRk9SV0FSRDoKLSAgICAgICAgcmV0dXJuIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUgJiBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfRkFTVF9GT1JXQVJEKTsKLSAgICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1NUT1A6Ci0gICAgICAgIHJldHVybiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlICYgTUNQX01FRElBX0NPTlRST0xfU1VQX1NUT1ApOwotICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUFJFVl9UUkFDSzoKLSAgICAgICAgcmV0dXJuIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUgJiBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfUFJFVklPVVNfVFJBQ0spOwotICAgICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfTkVYVF9UUkFDSzoKLSAgICAgICAgcmV0dXJuIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUgJiBNQ1BfTUVESUFfQ09OVFJPTF9TVVBfTkVYVF9UUkFDSyk7Ci0gICAgCi0gICAgICAvLyBGYWxsdGhyb3VnaCBmb3IgYWxsIHVua25vd24ga2V5IG1hcHBpbmdzCi0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIm9wY29kZSBpcyBub3Qgc3VwcG9ydGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi1jb25zdCBjaGFyKiBnZXRfbWNwX2V2ZW50X25hbWUodWludDMyX3QgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfSU5JVF9FVkVOVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX0NMRUFOVVBfRVZFTlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9TVEFURV9VUERBVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9QTEFZRVJfTkFNRV9VUERBVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9TVVBQT1JURURfT1BDT0RFX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX0NPTlRST0xfUE9JTlRfVVBEQVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JURURfVVBEQVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfUExBWUlOR19PUkRFUl9VUERBVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9UUkFDS19DSEFOR0VEX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX1BPU0lUSU9OX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX0RVUkFUSU9OX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX1RJVExFX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX0NDSURfVVBEQVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfQUNUSVZFX0RFVklDRV9VUERBVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9BQ1RJVkVfUFJPRklMRSkKLQotICAgIC8vbG9jYWwgZXZlbnQgdG8gaGFuZGxlIGluIG1jcCBzdGF0ZSBtYWNoaW5lLAotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JURURfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1BMQVlJTkdfT1JERVJfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX1NUQVRFX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX09QQ09ERV9TVVBQT1JURURfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX1BMQVlFUl9OQU1FX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9UUkFDS19USVRMRV9SRUFEKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfVFJBQ0tfUE9TSVRJT05fUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX0RVUkFUSU9OX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9DQ0lEX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9TRUVLSU5HX1NQRUVEX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9TVEFURV9SRUFEX0RFU0NSSVBUT1IpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1JFQURfREVTQ1JJUFRPUikKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFX1NVUFBPUlRFRF9ERVNDUklQVE9SX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9QTEFZRVJfTkFNRV9ERVNDUklQVE9SX1JFQUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9UUkFDS19DSEFOR0VEX0RFU0NSSVBUT1JfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX1RJVExFX0RFU0NSSVBUT1JfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX0RVUkFUSU9OX0RFU0NSSVBUT1JfUkVBRCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1BMQVlJTkdfT1JERVJfREVTQ1JJUFRPUl9SRUFEKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfTUVESUFfU1RBVEVfREVTQ1JJUFRPUl9XUklURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX1BMQVlFUl9OQU1FX0RFU0NSSVBUT1JfV1JJVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX0RFU0NSSVBUT1JfV1JJVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1NVUFBPUlRFRF9ERVNDUklQVE9SX1dSSVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfVFJBQ0tfQ0hBTkdFRF9ERVNDUklQVE9SX1dSSVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfVFJBQ0tfVElUTEVfREVTQ1JJUFRPUl9XUklURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfV1JJVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1dSSVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfUExBWUlOR19PUkRFUl9ERVNDUklQVE9SX1dSSVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9XUklURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1BMQVlJTkdfT1JERVJfV1JJVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9UUkFDS19QT1NJVElPTl9XUklURSkKLQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfTk9USUZZX0FMTCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1dSSVRFX1JTUCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1JFQURfUlNQKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1ApCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9ERVNDUklQVE9SX1JFQURfUlNQKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfQ09OTkVDVElPTikKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX0RJU0NPTk5FQ1RJT04pCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9DT05ORUNUSU9OX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX0NPTkdFU1RJT05fVVBEQVRFKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfUEhZX1VQREFURSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01UVV9VUERBVEUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9TRVRfQUNUSVZFX0RFVklDRSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX0NPTk5FQ1RJT05fQ0xPU0VfRVZFTlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9CT05EX1NUQVRFX0NIQU5HRV9FVkVOVCkKLSAgICAvL21lZGlhIHdyaXRlIG9wIGNvZGUgZXZlbnQKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX0NPTlRST0xfUExBWV9SRUFEX1JFUSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX0NPTlRST0xfUEFVU0VfUkVRKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfTUVESUFfQ09OVFJPTF9GQVNUX0ZPUldBUkRfUkVRKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfTUVESUFfQ09OVFJPTF9GQVNUX1JFV0lORF9SRVEpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9DT05UUk9MX01PVkVfUkVMQVRJVkVfUkVRKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfTUVESUFfQ09OVFJPTF9TVE9QX1JFUSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX01FRElBX0NPTlRST0xfTkVYVF9UUkFDS19SRVEpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9NRURJQV9DT05UUk9MX1BSRVZJT1VTX1RSQUNLX1JFUSkKLSAgICBDQVNFX1JFVFVSTl9TVFIoTUNQX1BMQVlJTkdfT1JFRFJfU0hVRkZMRV9SRVBFQVRfUkVRKQotICBkZWZhdWx0OgotICAgIHJldHVybiAiVW5rbm93biBFdmVudCI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogZ2V0X21jcF9tZWRpYV9zdGF0ZV9uYW1lKHVpbnQ4X3QgbWVkaWFfc3RhdGUpIHsKLSAgc3dpdGNoIChtZWRpYV9zdGF0ZSkgewotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfU1RBVEVfSU5BQ1RJVkUpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9TVEFURV9QTEFZSU5HKQotICAgIENBU0VfUkVUVVJOX1NUUihNQ1BfU1RBVEVfUEFVU0UpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKE1DUF9TVEFURV9TRUVLSU5HKQotICBkZWZhdWx0OgotICAgIHJldHVybiAiVW5rbm93biBNZWRpYSBTdGF0ZSI7Ci0gIH0KLX0KLQotY2xhc3MgUmVtb3RlRGV2aWNlcyB7Ci0gcHJpdmF0ZToKLSAgIEFjdGl2ZURldmljZSBhY3RpdmVEZXZpY2U7Ci0gICAvL2ludCBtYXhfY29ubmVjdGlvbjsKLSBwdWJsaWM6Ci0gIGJvb2wgQWRkKFJlbW90ZURldmljZSBkZXZpY2UpIHsKLSAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gTUFYX01DUF9DT05ORUNUSU9OKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChGaW5kQnlBZGRyZXNzKGRldmljZS5wZWVyX2JkYSkgIT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAgICAgZGV2aWNlLkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbTUNQX0RJU0NPTk5FQ1RFRF0gPSBEZXZpY2VTdGF0ZURpc2Nvbm5lY3RlZEhhbmRsZXI7Ci0gICAgICBkZXZpY2UuRGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltNQ1BfQ09OTkVDVEVEXSA9IERldmljZVN0YXRlQ29ubmVjdGlvbkhhbmRsZXI7Ci0gICAgICBkZXZpY2VzLnB1c2hfYmFjayhkZXZpY2UpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIFJlbW92ZShSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VzLmVuZCgpOykgewotICAgICAgaWYgKGl0LT5wZWVyX2JkYSAhPSBhZGRyZXNzKSB7Ci0gICAgICAgICsraXQ7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpdCA9IGRldmljZXMuZXJhc2UoaXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIFJlbW90ZURldmljZSogRmluZEJ5QWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXMuYmVnaW4oKSwgZGV2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZhZGRyZXNzXShjb25zdCBSZW1vdGVEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UucGVlcl9iZGEgPT0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gKGl0ZXIgPT0gZGV2aWNlcy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBSZW1vdGVEZXZpY2UqIEZpbmRCeUNvbm5JZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGRldmljZXMuYmVnaW4oKSwgZGV2aWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZjb25uX2lkXShjb25zdCBSZW1vdGVEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuY29ubl9pZCA9PSBjb25uX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKGRldmljZXMuc2l6ZSgpKTsgfQotCi0gIHN0ZDo6dmVjdG9yPFJlbW90ZURldmljZT4gR2V0UmVtb3RlRGV2aWNlcygpIHsKLSAgICByZXR1cm4gZGV2aWNlczsKLSAgfQotICBzdGQ6OnZlY3RvcjxSZW1vdGVEZXZpY2U+IEZpbmROb3RpZnlEZXZpY2VzKHVpbnQxNl90IGhhbmRsZSkgewotICAgIHN0ZDo6dmVjdG9yPFJlbW90ZURldmljZT4gbm90aWZ5X2RldmljZXM7Ci0gICAgZm9yIChzaXplX3QgaXQgPSAwOyBpdCAhPSBkZXZpY2VzLnNpemUoKTsgaXQrKyl7Ci0gICAgICBpZihtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9zdGF0ZV9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLm1lZGlhX3N0YXRlX25vdGlmeSkgewotICAgICAgICBub3RpZnlfZGV2aWNlcy5wdXNoX2JhY2soZGV2aWNlc1tpdF0pOwotICAgICAgfSBlbHNlIGlmKG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3BsYXllcl9uYW1lX2hhbmRsZSA9PSBoYW5kbGUgJiYKLSAgICAgICAgZGV2aWNlc1tpdF0ubWVkaWFfcGxheWVyX25hbWVfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9ICBlbHNlIGlmIChtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlID09IGhhbmRsZSAmJgotICAgICAgICBkZXZpY2VzW2l0XS5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYobWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfY29udHJvbF9wb2ludF9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLm1lZGlhX2NvbnRyb2xfcG9pbnRfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYobWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfY2hhbmdlZF9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLnRyYWNrX2NoYW5nZWRfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYobWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfdGl0bGVfaGFuZGxlID09IGhhbmRsZSAmJgotICAgICAgICBkZXZpY2VzW2l0XS50cmFja190aXRsZV9ub3RpZnkpIHsKLSAgICAgICAgbm90aWZ5X2RldmljZXMucHVzaF9iYWNrKGRldmljZXNbaXRdKTsKLSAgICAgIH0gZWxzZSBpZihtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLnRyYWNrX2R1cmF0aW9uX25vdGlmeSkgewotICAgICAgICBub3RpZnlfZGV2aWNlcy5wdXNoX2JhY2soZGV2aWNlc1tpdF0pOwotICAgICAgfSBlbHNlIGlmKG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX3Bvc2l0aW9uX2hhbmRsZSA9PSBoYW5kbGUgJiYKLSAgICAgICAgZGV2aWNlc1tpdF0udHJhY2tfcG9zaXRpb25fbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9IGVsc2UgaWYobWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9oYW5kbGUgPT0gaGFuZGxlICYmCi0gICAgICAgIGRldmljZXNbaXRdLnBsYXlpbmdfb3JkZXJfbm90aWZ5KSB7Ci0gICAgICAgIG5vdGlmeV9kZXZpY2VzLnB1c2hfYmFjayhkZXZpY2VzW2l0XSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBub3RpZnlfZGV2aWNlczsKLSAgfQotICB2b2lkIEFkZFNldEFjdGl2ZURldmljZSh0TUNQX1NFVF9BQ1RJVkVfREVWSUNFICpkZXZpY2UpIHsKLSAgICBpZiAoZGV2aWNlLT5zZXRfaWQgPT0gYWN0aXZlRGV2aWNlLnNldF9pZCkgewotICAgICAgYWN0aXZlRGV2aWNlLmFkZHJlc3MucHVzaF9iYWNrKGRldmljZS0+YWRkcmVzcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFjdGl2ZURldmljZS5hZGRyZXNzLmNsZWFyKCk7Ci0gICAgICBhY3RpdmVEZXZpY2Uuc2V0X2lkID0gZGV2aWNlLT5zZXRfaWQ7Ci0gICAgICBhY3RpdmVEZXZpY2UuYWRkcmVzcy5wdXNoX2JhY2soZGV2aWNlLT5hZGRyZXNzKTsKLSAgICB9Ci0gIH0KLQotICBib29sIEZpbmRBY3RpdmVEZXZpY2UoUmVtb3RlRGV2aWNlICpyZW1vdGVEZXZpY2UpIHsKLSAgICBib29sIGZsYWcgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8mIGl0IDogYWN0aXZlRGV2aWNlLmFkZHJlc3MpIHsKLSAgICAgIGlmKHJlbW90ZURldmljZS0+cGVlcl9iZGEgPT0gaXQpIHsKLSAgICAgICAgZmxhZyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmxhZzsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFJlbW90ZURldmljZT4gZGV2aWNlczsKLX07Ci0KLQotY2xhc3MgTWNwU2VydmVySW1wbCA6IHB1YmxpYyBNY3BTZXJ2ZXIgewotICBibHVldG9vdGg6Om1jcF9zZXJ2ZXI6Ok1jcFNlcnZlckNhbGxiYWNrcyogY2FsbGJhY2tzOwotICBVdWlkIGFwcF91dWlkOwotCi0gIHB1YmxpYzoKLSAgICAgUmVtb3RlRGV2aWNlcyByZW1vdGVEZXZpY2VzOwotICAgICB2aXJ0dWFsIH5NY3BTZXJ2ZXJJbXBsKCkgPSBkZWZhdWx0OwotCi0KLSAgTWNwU2VydmVySW1wbChibHVldG9vdGg6Om1jcF9zZXJ2ZXI6Ok1jcFNlcnZlckNhbGxiYWNrcyogY2FsbGJhY2ssIFV1aWQgdXVpZCkKLSAgICAgICAgOmNhbGxiYWNrcyhjYWxsYmFjayksCi0gICAgIGFwcF91dWlkKHV1aWQpewotICAgIExPRyhJTkZPKSA8PCAiTWNwU2VydmVySW1wbCBnYXR0cyBhcHAgcmVnaXN0ZXIiOwotICAgIEhhbmRsZU1jc0V2ZW50KE1DUF9JTklUX0VWRU5ULCAmYXBwX3V1aWQpOwotCi0gIH0KLQotICB2b2lkIFNldEFjdGl2ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgc2V0SWQsIGludCBwcm9maWxlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDsKLSAgICB0TUNQX1NFVF9BQ1RJVkVfREVWSUNFIFNldEFjdGl2ZURldmljZU9wOwotICAgIFNldEFjdGl2ZURldmljZU9wLnNldF9pZCA9IHNldElkOwotICAgIFNldEFjdGl2ZURldmljZU9wLmFkZHJlc3MgPSBhZGRyZXNzOwotICAgIFNldEFjdGl2ZURldmljZU9wLnByb2ZpbGUgPSBwcm9maWxlOwotICAgIEhhbmRsZU1jc0V2ZW50KE1DUF9BQ1RJVkVfREVWSUNFX1VQREFURSwgJlNldEFjdGl2ZURldmljZU9wKTsKLSAgfQotCi0gIHZvaWQgTWVkaWFTdGF0ZSh1aW50OF90IHN0YXRlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc3RhdGU6ICIgPDwgdW5zaWduZWQoc3RhdGUpOwotICAgIHRNQ1BfTUVESUFfU1RBVEUgTWVkaWFTdGF0ZU9wOwotICAgIE1lZGlhU3RhdGVPcC5zdGF0ZSA9IHN0YXRlOwotICAgIEhhbmRsZU1jc0V2ZW50KE1DUF9NRURJQV9TVEFURV9VUERBVEUsICZNZWRpYVN0YXRlT3ApOwotICB9Ci0KLSAgdm9pZCBNZWRpYVBsYXllck5hbWUodWludDhfdCogcGxheWVyX25hbWUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgdE1DUF9NRURJQV9QTEFZRVJfTkFNRSBNZWRpYVBsYXllck5hbWVPcDsKLSAgICBNZWRpYVBsYXllck5hbWVPcC5uYW1lID0gcGxheWVyX25hbWU7Ci0gICAgTWVkaWFQbGF5ZXJOYW1lT3AubGVuID0gc3RybGVuKChjaGFyICopcGxheWVyX25hbWUpOwotICAgIGlmKE1lZGlhUGxheWVyTmFtZU9wLmxlbiAhPSAwKQotICAgICAgSGFuZGxlTWNzRXZlbnQoTUNQX01FRElBX1BMQVlFUl9OQU1FX1VQREFURSwgJk1lZGlhUGxheWVyTmFtZU9wKTsKLSAgfQotCi0gIHZvaWQgTWVkaWFDb250cm9sUG9pbnRPcGNvZGVTdXBwb3J0ZWQodWludDMyX3QgZmVhdHVyZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICB0TUNQX01FRElBX09QQ09ERV9TVVBQT1JUIE1lZGlhQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkT3A7Ci0gICAgTWVkaWFDb250cm9sUG9pbnRPcGNvZGVTdXBwb3J0ZWRPcC5zdXBwb3J0ZWQgPSBmZWF0dXJlOwotICAgIEhhbmRsZU1jc0V2ZW50KE1DUF9NRURJQV9TVVBQT1JURURfT1BDT0RFX1VQREFURSwgJk1lZGlhQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkT3ApOwotICB9Ci0KLSAgdm9pZCBNZWRpYUNvbnRyb2xQb2ludCh1aW50OF90IHZhbHVlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIHRNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVCBNZWRpYUNvbnRyb2xQb2ludDsKLSAgICBNZWRpYUNvbnRyb2xQb2ludC5yZXFfb3Bjb2RlID0gdmFsdWU7Ci0gICAgTWVkaWFDb250cm9sUG9pbnQucmVzdWx0ID0gTUNQX1NUQVRVU19TVUNDRVNTOyAvLyBzdWNjZXNzCi0gICAgSGFuZGxlTWNzRXZlbnQoTUNQX01FRElBX0NPTlRST0xfUE9JTlRfVVBEQVRFLCAmTWVkaWFDb250cm9sUG9pbnQpOwotICB9Ci0KLSAgdm9pZCBUcmFja0NoYW5nZWQoYm9vbCBzdGF0dXMpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gICAgdE1DUF9UUkFDS19DSEFOR0VEIFRyYWNrQ2hhbmdlZE9wOwotICAgIFRyYWNrQ2hhbmdlZE9wLnN0YXR1cyA9IHN0YXR1czsKLSAgICBIYW5kbGVNY3NFdmVudChNQ1BfVFJBQ0tfQ0hBTkdFRF9VUERBVEUsICZUcmFja0NoYW5nZWRPcCk7Ci0gIH0KLQotICB2b2lkIFRyYWNrVGl0bGUodWludDhfdCogdHJhY2tfbmFtZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICB0TUNQX1RSQUNLX1RJVExFIFRyYWNrVGl0bGVPcDsKLSAgICBUcmFja1RpdGxlT3AudGl0bGUgPSB0cmFja19uYW1lOwotICAgIFRyYWNrVGl0bGVPcC5sZW4gPSBzdHJsZW4oKGNoYXIgKil0cmFja19uYW1lKTsKLSAgICBpZiAoVHJhY2tUaXRsZU9wLmxlbiAhPSAwKQotICAgICAgSGFuZGxlTWNzRXZlbnQoTUNQX1RSQUNLX1RJVExFX1VQREFURSwgJlRyYWNrVGl0bGVPcCk7Ci0gIH0KLQotICB2b2lkIFRyYWNrRHVyYXRpb24oaW50MzJfdCBkdXJhdGlvbikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICB0TUNQX1RSQUNLX0RVUkFUSU9OIFRyYWNrRHVyYXRpb25PcDsKLSAgICBUcmFja0R1cmF0aW9uT3AuZHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICBIYW5kbGVNY3NFdmVudChNQ1BfVFJBQ0tfRFVSQVRJT05fVVBEQVRFLCAmVHJhY2tEdXJhdGlvbk9wKTsKLSAgfQotCi0gIHZvaWQgVHJhY2tQb3NpdGlvbihpbnQzMl90IHBvc2l0aW9uKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIHRNQ1BfVFJBQ0tfUE9TVElPTiBUcmFja1Bvc2l0aW9uT3A7Ci0gICAgVHJhY2tQb3NpdGlvbk9wLnBvc2l0aW9uID0gcG9zaXRpb247Ci0gICAgSGFuZGxlTWNzRXZlbnQoTUNQX1RSQUNLX1BPU0lUSU9OX1VQREFURSwgJlRyYWNrUG9zaXRpb25PcCk7Ci0gIH0KLQotICB2b2lkIFBsYXlpbmdPcmRlclN1cHBvcnRlZCh1aW50MTZfdCBvcmRlcikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICB0TUNQX1BMQVlJTkdfT1JERVJfU1VQUE9SVCBQbGF5aW5nT3JkZXJTdXBwb3J0ZWRPcDsKLSAgICBQbGF5aW5nT3JkZXJTdXBwb3J0ZWRPcC5vcmRlcl9zdXBwb3J0ZWQgPSBvcmRlcjsKLSAgICBIYW5kbGVNY3NFdmVudChNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JURURfVVBEQVRFLCAmUGxheWluZ09yZGVyU3VwcG9ydGVkT3ApOwotICB9Ci0KLSAgdm9pZCBQbGF5aW5nT3JkZXIodWludDhfdCB2YWx1ZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICB0TUNQX1BMQVlJTkdfT1JERVIgUGxheWluZ09yZGVyT3A7Ci0gICAgUGxheWluZ09yZGVyT3Aub3JkZXIgPSB2YWx1ZTsKLSAgICBIYW5kbGVNY3NFdmVudChNQ1BfUExBWUlOR19PUkRFUl9VUERBVEUsICZQbGF5aW5nT3JkZXJPcCk7Ci0gIH0KLQotICB2b2lkIENvbnRlbnRDb250cm9sSWQodWludDhfdCBjY2lkKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIHRNQ1BfQ09OVEVOVF9DT05UUk9MX0lEIENvbnRlbnRDb250cm9sSWRPcDsKLSAgICBDb250ZW50Q29udHJvbElkT3AuY2NpZCA9IGNjaWQ7Ci0gICAgSGFuZGxlTWNzRXZlbnQoTUNQX0NDSURfVVBEQVRFLCAmQ29udGVudENvbnRyb2xJZE9wKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdE1jcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIHRNQ1BfQ09OTkVDVElPTl9DTE9TRSBDb25uZWN0Q2xvc2luZ09wOwotICAgIENvbm5lY3RDbG9zaW5nT3AuYWRkciA9IGJkX2FkZHI7Ci0gICAgSGFuZGxlTWNzRXZlbnQoTUNQX0NPTk5FQ1RJT05fQ0xPU0VfRVZFTlQsICZDb25uZWN0Q2xvc2luZ09wKTsKLSAgfQotCi0gIHZvaWQgQm9uZFN0YXRlQ2hhbmdlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBzdGF0ZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICB0TUNQX0JPTkRfU1RBVEVfQ0hBTkdFIEJvbmRTdGF0ZUNoYW5nZU9QOwotICAgIEJvbmRTdGF0ZUNoYW5nZU9QLmFkZHIgPSBiZF9hZGRyOwotICAgIEJvbmRTdGF0ZUNoYW5nZU9QLnN0YXRlID0gc3RhdGU7Ci0gICAgSGFuZGxlTWNzRXZlbnQoTUNQX0JPTkRfU1RBVEVfQ0hBTkdFX0VWRU5ULCAmQm9uZFN0YXRlQ2hhbmdlT1ApOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZSh1aW50OF90IHN0YXRlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgICBidGEiOwotICAgIGNhbGxiYWNrcy0+T25Db25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGUsIGFkZHJlc3MpOwotICB9Ci0KLSAgdm9pZCBNZWRpYUNvbnRyb2xQb2ludENoYW5nZVJlcSh1aW50OF90IHN0YXRlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgY2FsbGJhY2tzLT5NZWRpYUNvbnRyb2xQb2ludENoYW5nZVJlcShzdGF0ZSwgYWRkcmVzcyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICB9Ci0KLSAgdm9pZCBUcmFja1Bvc2l0aW9uQ2hhbmdlUmVxKGludDMyX3QgcG9zaXRpb24pIHsKLSAgICBjYWxsYmFja3MtPlRyYWNrUG9zaXRpb25DaGFuZ2VSZXEocG9zaXRpb24pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgfQotCi0gIHZvaWQgUGxheWluZ09yZGVyQ2hhbmdlUmVxKHVpbnQxNl90IHBsYXlpbmdPcmRlcikgewotICAgIGNhbGxiYWNrcy0+UGxheWluZ09yZGVyQ2hhbmdlUmVxKHBsYXlpbmdPcmRlcik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICB9Ci0KLX07Ci0KLQotdm9pZCBNY3BTZXJ2ZXI6OkNsZWFuVXAoKSB7Ci0gIEhhbmRsZU1jc0V2ZW50KE1DUF9DTEVBTlVQX0VWRU5ULCBOVUxMKTsKLSAgZGVsZXRlIGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci19Ci0KLU1jcFNlcnZlciogTWNwU2VydmVyOjpHZXQoKSB7Ci0gIENIRUNLKGluc3RhbmNlKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi12b2lkICBNY3BTZXJ2ZXI6OkluaXRpYWxpemUoYmx1ZXRvb3RoOjptY3Bfc2VydmVyOjpNY3BTZXJ2ZXJDYWxsYmFja3MqIGNhbGxiYWNrcywgVXVpZCB1dWlkKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICBMT0coRVJST1IpIDw8ICJBbHJlYWR5IGluaXRpYWxpemVkISI7Ci0gIH0gZWxzZSB7Ci0gICAgIGluc3RhbmNlID0gbmV3IE1jcFNlcnZlckltcGwoY2FsbGJhY2tzLCB1dWlkKTsKLSAgfQotfQotCi1ib29sIE1jcFNlcnZlcjo6aXNNY3BTZXJ2aWNlUnVubmlnKCkgeyByZXR1cm4gaW5zdGFuY2U7IH0KLQotc3RhdGljIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IE1jcEFkZFNlcnZpY2UoaW50IHNlcnZlcl9pZikgewotCi0gIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IG1jc19zZXJ2aWNlczsKLSAgbWNzX3NlcnZpY2VzLmNsZWFyKCk7Ci0gIC8vc2VydmljZQotICBidGdhdHRfZGJfZWxlbWVudF90IHNlcnZpY2UgPSB7LnV1aWQgPSBHTUNTX1VVSUQsIC50eXBlID0gQlRHQVRUX0RCX1BSSU1BUllfU0VSVklDRSwgMH07Ci0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soc2VydmljZSk7Ci0gIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1jc19zZXJ2aWNlX3V1aWQgPSBzZXJ2aWNlLnV1aWQ7Ci0KLSAgLy9tZWRpYSBzdGF0ZSBzZXJ2aWNlCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgbWNzX21lZGlhX3N0YXRlX2NoYXIgPSB7LnV1aWQgPSBHTUNTX01FRElBX1NUQVRFX1VVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR9OwotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKG1jc19tZWRpYV9zdGF0ZV9jaGFyKTsKLSAgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfc3RhdGVfdXVpZCA9IG1jc19tZWRpYV9zdGF0ZV9jaGFyLnV1aWQ7Ci0KLSAgLy8xc3QgZGVzYwotICBidGdhdHRfZGJfZWxlbWVudF90IGRlc2MxID0gey51dWlkID0gREVTQ1JJUFRPUl9VVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX0RFU0NSSVBUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFfTsKLSAgbWNzX3NlcnZpY2VzLnB1c2hfYmFjayhkZXNjMSk7Ci0KLSAgLy9tZWRpYSBzdXBwb3J0ZWQgZmVhdHVyZQotICBidGdhdHRfZGJfZWxlbWVudF90IG1jc19tZWRpYV9vcGNvZGVfc3VwcG9ydGVkX2NoYXIgPSB7LnV1aWQgPSBHTUNTX01FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfTsKLQotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKG1jc19tZWRpYV9vcGNvZGVfc3VwcG9ydGVkX2NoYXIpOwotICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfdXVpZCA9Ci0gICAgbWNzX21lZGlhX29wY29kZV9zdXBwb3J0ZWRfY2hhci51dWlkOwotCi0gIC8vMm5kIGRlc2MKLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBkZXNjMiA9IHsudXVpZCA9IERFU0NSSVBUT1JfVVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURX07Ci0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soZGVzYzIpOwotCi0gIC8vLy9tZWRpYSBwbGF5ZXIgbmFtZQotICBidGdhdHRfZGJfZWxlbWVudF90IG1jc19tZWRpYV9wbGF5ZXJfbmFtZV9jaGFyID0gey51dWlkID0gR01DU19NRURJQV9QTEFZRVJfTkFNRV9VVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfTsKLSAgbWNzX3NlcnZpY2VzLnB1c2hfYmFjayhtY3NfbWVkaWFfcGxheWVyX25hbWVfY2hhcik7Ci0gIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3BsYXllcl9uYW1lX3V1aWQgPSBtY3NfbWVkaWFfcGxheWVyX25hbWVfY2hhci51dWlkOwotCi0gIC8vM3JkIGRlc2MKLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBkZXNjMyA9IHsudXVpZCA9IERFU0NSSVBUT1JfVVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURX07Ci0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soZGVzYzMpOwotCi0gIC8vbWVkaWEgY29udHJvbCBwb2ludAotICBidGdhdHRfZGJfZWxlbWVudF90IG1jc19tZWRpYV9jb250cm9sX3BvaW50X2NoYXIgPSB7LnV1aWQgPSBHTUNTX01FRElBX0NPTlRST0xfUE9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1dSSVRFX05SfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEV8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9OT1RJRlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fV1JJVEV9OwotCi0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2sobWNzX21lZGlhX2NvbnRyb2xfcG9pbnRfY2hhcik7Ci0KLSAgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfcGxheWVyX25hbWVfdXVpZCA9IG1jc19tZWRpYV9jb250cm9sX3BvaW50X2NoYXIudXVpZDsKLQotICAvLzR0aCBkZXNjCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZGVzYzQgPSB7LnV1aWQgPSBERVNDUklQVE9SX1VVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRHxHQVRUX1BFUk1fV1JJVEV9OwotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKGRlc2M0KTsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IHRyYWNrX2NoYW5nZWRfY2hhciA9IHsudXVpZCA9IEdNQ1NfVFJBQ0tfQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR9OwotCi0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2sodHJhY2tfY2hhbmdlZF9jaGFyKTsKLSAgbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfY2hhbmdlZF91dWlkID0gdHJhY2tfY2hhbmdlZF9jaGFyLnV1aWQ7Ci0KLSAgLy81dGggZGVzYwotICBidGdhdHRfZGJfZWxlbWVudF90IGRlc2M1ID0gey51dWlkID0gREVTQ1JJUFRPUl9VVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX0RFU0NSSVBUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFfTsKLSAgbWNzX3NlcnZpY2VzLnB1c2hfYmFjayhkZXNjNSk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCB0cmFja190aXRsZV9jaGFyID0gey51dWlkID0gR01DU19UUkFDS19USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfTsKLQotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKHRyYWNrX3RpdGxlX2NoYXIpOwotICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV91dWlkID0gdHJhY2tfdGl0bGVfY2hhci51dWlkOwotCi0gIC8vNnRoIGRlc2MKLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBkZXNjNiA9IHsudXVpZCA9IERFU0NSSVBUT1JfVVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURX07Ci0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soZGVzYzYpOwotCi0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCB0cmFja19kdXJhdGlvbl9jaGFyID0gey51dWlkID0gR01DU19UUkFDS19EVVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfTsKLQotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKHRyYWNrX2R1cmF0aW9uX2NoYXIpOwotICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl91dWlkID0gdHJhY2tfZHVyYXRpb25fY2hhci51dWlkOwotCi0gIC8vN3RoIGRlc2MKLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBkZXNjNyA9IHsudXVpZCA9IERFU0NSSVBUT1JfVVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURX07Ci0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soZGVzYzcpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgdHJhY2tfcG9zaXRpb25fY2hhciA9IHsudXVpZCA9IEdNQ1NfVFJBQ0tfUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUR8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURV9OUnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX1dSSVRFfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfTk9USUZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFfTsKLQotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKHRyYWNrX3Bvc2l0aW9uX2NoYXIpOwotICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl91dWlkID0gdHJhY2tfcG9zaXRpb25fY2hhci51dWlkOwotCi0gIC8vOHRoIGRlc2MKLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBkZXNjOCA9IHsudXVpZCA9IERFU0NSSVBUT1JfVVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfEdBVFRfUEVSTV9XUklURX07Ci0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soZGVzYzgpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgcGxheWluZ19vcmRlcl9zdXBwb3J0ZWRfY2hhciA9IHsudXVpZCA9IEdNQ1NfUExBWUlOR19PUkRFUl9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRH07Ci0KLSAgbWNzX3NlcnZpY2VzLnB1c2hfYmFjayhwbGF5aW5nX29yZGVyX3N1cHBvcnRlZF9jaGFyKTsKLSAgbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWRfdXVpZCA9IHBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkX2NoYXIudXVpZDsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IHBsYXlpbmdfb3JkZXJfY2hhciA9IHsudXVpZCA9IEdNQ1NfUExBWUlOR19PUkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEVfTlJ8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURXwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR8R0FUVF9QRVJNX1dSSVRFfTsKLQotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKHBsYXlpbmdfb3JkZXJfY2hhcik7Ci0gIG1jc1NlcnZlclNlcnZpY2VJbmZvLnBsYXlpbmdfb3JkZXJfdXVpZCA9IHBsYXlpbmdfb3JkZXJfY2hhci51dWlkOwotCi0gIC8vMTB0aCBkZXNjCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QgZGVzYzEwID0gey51dWlkID0gREVTQ1JJUFRPUl9VVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9ERVNDUklQVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRHxHQVRUX1BFUk1fV1JJVEV9OwotICBtY3Nfc2VydmljZXMucHVzaF9iYWNrKGRlc2MxMCk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBjY2lkX2NoYXIgPSB7LnV1aWQgPSBHTUNTX0NPTlRFTlRfQ09OVFJPTElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR9OwotCi0gIG1jc19zZXJ2aWNlcy5wdXNoX2JhY2soY2NpZF9jaGFyKTsKLSAgbWNzU2VydmVyU2VydmljZUluZm8uY2NpZF91dWlkID0gY2NpZF9jaGFyLnV1aWQ7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBzZWVrX3NwZWVkX2NoYXIgPSB7LnV1aWQgPSBHTUNTX1NFRUtJTkdfU1BFRURfVVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFEfTsKLSAgbWNzX3NlcnZpY2VzLnB1c2hfYmFjayhzZWVrX3NwZWVkX2NoYXIpOwotICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5zZWVraW5nX3NwZWVkX3V1aWQgPSBzZWVrX3NwZWVkX2NoYXIudXVpZDsKLQotICByZXR1cm4gbWNzX3NlcnZpY2VzOwotfQotCi0KLXN0YXRpYyB2b2lkIE9uTWNwU2VydmljZUFkZGVkQ2IodWludDhfdCBzdGF0dXMsIGludCBzZXJ2ZXJJZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSkgewotCi0gIGlmIChzZXJ2aWNlWzBdLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSKSB8fAotICAgICAgc2VydmljZVswXS51dWlkID09IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVBfU0VSVkVSKSkgewotICAgIExPRyhJTkZPKSA8PCAiJXM6IEF0dGVtcHQgdG8gcmVnaXN0ZXIgcmVzdHJpY3RlZCBzZXJ2aWNlIjw8IF9fZnVuY19fOwotICAgIHJldHVybjsKLSAgfQotICBmb3IoaW50IGkgPSAwOyBpIDwgKGludClzZXJ2aWNlLnNpemUoKTsgaSsrKSB7Ci0KLSAgICBpZiAoc2VydmljZVtpXS51dWlkID09IEdNQ1NfVVVJRCkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWNzIHNlcnZpY2UgYWRkZWQgYXR0ciBoYW5kbGUgIiA8PCBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgfSBlbHNlIGlmIChzZXJ2aWNlW2ldLnV1aWQgPT0gR01DU19NRURJQV9TVEFURV9VVUlEKSB7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9zdGF0ZV9oYW5kbGUgPSBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3N0YXRlX2Rlc2MgPSBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9zdGF0ZV9oYW5kbGUiIDw8Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9zdGF0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9zdGF0ZV9oYW5kbGUgZGVzYyIgPDwKLSAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3N0YXRlX2Rlc2M7Ci0gICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdNQ1NfTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVfU1VQUE9SVEVEKSB7Ci0gICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGUgPQotICAgICAgICAgc2VydmljZVtpKytdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGUgcmVnaXN0ZXIiIDw8Ci0gICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlOwotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX2Rlc2MgPQotICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlIGRlc2MgcmVnaXN0ZXIiIDw8Ci0gICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfZGVzYzsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdNQ1NfTUVESUFfUExBWUVSX05BTUVfVVVJRCkgewotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfcGxheWVyX25hbWVfaGFuZGxlID0KLSAgICAgICAgICBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX3BsYXllcl9uYW1lX2hhbmRsZSBHTUNTX01FRElBX1BMQVlFUl9OQU1FX1VVSUQgcmVnaXN0ZXIiCi0gICAgICAgICAgPDwgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfcGxheWVyX25hbWVfaGFuZGxlOwotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfcGxheWVyX25hbWVfZGVzYyA9Ci0gICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWVkaWFfcGxheWVyX25hbWVfaGFuZGxlIEdNQ1NfTUVESUFfUExBWUVSX05BTUVfVVVJRCBkZXNjIgotICAgICAgICAgIDw8IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3BsYXllcl9uYW1lX2Rlc2M7Ci0gICAgfSBlbHNlIGlmKHNlcnZpY2VbaV0udXVpZCA9PSBHTUNTX01FRElBX0NPTlRST0xfUE9JTlQpIHsKLSAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfaGFuZGxlID0KLSAgICAgICAgICBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX2NvbnRyb2xfcG9pbnRfaGFuZGxlIEdNQ1NfTUVESUFfQ09OVFJPTF9QT0lOVCByZWdpc3RlciIKLSAgICAgICAgICA8PCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X2hhbmRsZTsKLSAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfZGVzYyA9Ci0gICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWVkaWFfY29udHJvbF9wb2ludF9oYW5kbGUgR01DU19NRURJQV9DT05UUk9MX1BPSU5UIGRlc2MiCi0gICAgICAgICAgPDwgbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfY29udHJvbF9wb2ludF9kZXNjOwotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR01DU19UUkFDS19DSEFOR0VEKSB7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2hhbmRsZSA9Ci0gICAgICAgICAgc2VydmljZVtpKytdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgInRyYWNrX2NoYW5nZWRfaGFuZGxlIEdNQ1NfVFJBQ0tfQ0hBTkdFRCByZWdpc3RlciIKLSAgICAgICAgICA8PCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2hhbmRsZTsKLSAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX2NoYW5nZWRfZGVzYyA9Ci0gICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJ0cmFja19jaGFuZ2VkX2hhbmRsZSBHTUNTX1RSQUNLX0NIQU5HRUQgZGVzYyIKLSAgICAgICAgICA8PCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2Rlc2M7Ci0gICAgfSBlbHNlIGlmKHNlcnZpY2VbaV0udXVpZCA9PSBHTUNTX1RSQUNLX1RJVExFKSB7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9oYW5kbGUgPQotICAgICAgICAgIHNlcnZpY2VbaSsrXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJ0cmFja190aXRsZV9oYW5kbGUgR01DU19UUkFDS19USVRMRSByZWdpc3RlciIKLSAgICAgICAgICA8PCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9oYW5kbGU7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9kZXNjID0KLSAgICAgICAgICBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgInRyYWNrX3RpdGxlX2hhbmRsZSBHTUNTX1RSQUNLX1RJVExFIGRlc2MiCi0gICAgICAgICA8PCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9kZXNjOwotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR01DU19UUkFDS19EVVJBVElPTikgewotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfZHVyYXRpb25faGFuZGxlID0KLSAgICAgICAgICBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJ0cmFja19kdXJhdGlvbl9oYW5kbGUgR01DU19UUkFDS19EVVJBVElPTiByZWdpc3RlciIKLSAgICAgICAgPDwgbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfZHVyYXRpb25faGFuZGxlOwotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfZHVyYXRpb25fZGVzYyA9Ci0gICAgICAgIHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJ0cmFja19kdXJhdGlvbl9oYW5kbGUgR01DU19UUkFDS19EVVJBVElPTiBkZXNjIgotICAgICAgICA8PCBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl9kZXNjOwotCi0gICAgfSBlbHNlIGlmKHNlcnZpY2VbaV0udXVpZCA9PSBHTUNTX1RSQUNLX1BPU0lUSU9OKSB7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl9oYW5kbGUgPQotICAgICAgICBzZXJ2aWNlW2krK10uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAidHJhY2tfcG9zaXRpb25faGFuZGxlIEdNQ1NfVFJBQ0tfUE9TSVRJT04gcmVnaXN0ZXIiCi0gICAgICAgIDw8IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX3Bvc2l0aW9uX2hhbmRsZTsKLSAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX3Bvc2l0aW9uX2Rlc2MgPQotICAgICAgICBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgInRyYWNrX3Bvc2l0aW9uX2hhbmRsZSBHTUNTX1RSQUNLX1BPU0lUSU9OIGRlc2MiCi0gICAgICAgIDw8IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX3Bvc2l0aW9uX2hhbmRsZTsKLQotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR01DU19QTEFZSU5HX09SREVSX1NVUFBPUlRFRCkgewotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWRfaGFuZGxlID0KLSAgICAgICAgICBzZXJ2aWNlW2ldLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgInBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkX2hhbmRsZSBHTUNTX1BMQVlJTkdfT1JERVJfU1VQUE9SVEVEIHJlZ2lzdGVyIgotICAgICAgICAgIDw8IG1jc1NlcnZlclNlcnZpY2VJbmZvLnBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkX2hhbmRsZTsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdNQ1NfUExBWUlOR19PUkRFUikgewotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9oYW5kbGUgPQotICAgICAgICAgIHNlcnZpY2VbaSsrXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJwbGF5aW5nX29yZGVyX2hhbmRsZSBHTUNTX1BMQVlJTkdfT1JERVIgcmVnaXN0ZXIiCi0gICAgICAgICAgPDwgbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9oYW5kbGU7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5wbGF5aW5nX29yZGVyX2Rlc2MgPQotICAgICAgICAgIHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAicGxheWluZ19vcmRlcl9oYW5kbGUgR01DU19QTEFZSU5HX09SREVSIGRlc2MiCi0gICAgICAgICAgPDwgbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9kZXNjOwotICAgIH0gZWxzZSBpZihzZXJ2aWNlW2ldLnV1aWQgPT0gR01DU19DT05URU5UX0NPTlRST0xJRCkgewotICAgICAgbWNzU2VydmVyU2VydmljZUluZm8uY2NpZF9oYW5kbGUgPQotICAgICAgICAgIHNlcnZpY2VbaV0uYXR0cmlidXRlX2hhbmRsZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiY2NpZF9oYW5kbGUgR01DU19DT05URU5UX0NPTlRST0xJRCByZWdpc3RlciIgPDwKLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5jY2lkX2hhbmRsZTsKLSAgICB9IGVsc2UgaWYoc2VydmljZVtpXS51dWlkID09IEdNQ1NfU0VFS0lOR19TUEVFRF9VVUlEKSB7Ci0gICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5zZWVraW5nX3NwZWVkX2hhbmRsZSA9Ci0gICAgICAgICAgc2VydmljZVtpXS5hdHRyaWJ1dGVfaGFuZGxlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJjY2lkX2hhbmRsZSBHTUNTX1NFRUtJTkdfU1BFRURfSUQgcmVnaXN0ZXIiIDw8Ci0gICAgICAgICAgbWNzU2VydmVyU2VydmljZUluZm8uc2Vla2luZ19zcGVlZF9oYW5kbGU7Ci0gICAgfQotICB9IC8vZm9yCi19Ci0KLQotdm9pZCBCVE1jcENiYWNrKHRCVEFfR0FUVFNfRVZUIGV2ZW50LCB0QlRBX0dBVFRTKiBwYXJhbSkgewotICBIYW5kbGVNY3NFdmVudCgodWludDMyX3QpZXZlbnQsIHBhcmFtKTsKLX0KLQotLy9tY3MgaGFuZGxlIGV2ZW50Ci12b2lkIEhhbmRsZU1jc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAgIG1jcyBoYW5kbGUgZXZlbnQgIiA8PCBnZXRfbWNwX2V2ZW50X25hbWUoZXZlbnQpOwotICB0QlRBX0dBVFRTKiBwX2RhdGEgPSBOVUxMOwotICB1aW50MzJfdCBwcm9jX2V2ZW50OwotICBtY3BfcmVzcF90ICpyc3AgPSAobWNwX3Jlc3BfdCAqKW9zaV9tYWxsb2Moc2l6ZW9mKG1jcF9yZXNwX3QpKTsKLSAgaWYgKHJzcCA9PSBOVUxMKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWNzIGhhbmRsZSByZXR1cm4gcnNwIG5vdCBhbGxvY2F0ZWQgIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgcHJvY19ldmVudCA9IE1DUF9OT05FX0VWRU5UOwotICByc3AtPmV2ZW50ID0gTUNQX05PTkVfRVZFTlQ7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLQotICAgIGNhc2UgTUNQX0lOSVRfRVZFTlQ6Ci0gICAgewotICAgICAgIC8vIFV1aWQgYXBwX3V1aWQgPSAoVXVpZCkqcGFyYW07Ci0gICAgICBVdWlkIGFhcF91dWlkID0gVXVpZDo6RnJvbVN0cmluZygiMTg0OSIpOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlID0gTUNQX1NUQVRFX0lOQUNUSVZFOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLk1lZGlhU3RhdGVIYW5kbGVyUG9pbnRlcltNQ1BfU1RBVEVfSU5BQ1RJVkVdID0KLSAgICAgICAgICBNZWRpYVN0YXRlSW5hY3RpdmVIYW5kbGVyOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLk1lZGlhU3RhdGVIYW5kbGVyUG9pbnRlcltNQ1BfU1RBVEVfUEFVU0VdID0KLSAgICAgICAgICBNZWRpYVN0YXRlUGF1c2VIYW5kbGVyOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLk1lZGlhU3RhdGVIYW5kbGVyUG9pbnRlcltNQ1BfU1RBVEVfUExBWUlOR10gPQotICAgICAgICAgIE1lZGlhU3RhdGVQbGF5aW5nSGFuZGxlcjsKLSAgICAgIG1lZGlhUGxheWVySW5mby5NZWRpYVN0YXRlSGFuZGxlclBvaW50ZXJbTUNQX1NUQVRFX1NFRUtJTkddID0KLSAgICAgICAgICBNZWRpYVN0YXRlU2Vla2luZ0hhbmRsZXI7Ci0KLSAgICAgIG1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZSA9IE1DUF9ERUZBVUxUX01FRElBX0NUUkxfU1VQUF9GRUFUOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLmNjaWQgPSAwOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLnNlZWtpbmdfc3BlZWQgPSAwOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uID0gVFJBQ0tfUE9TSVRJT05fVU5BVkFJTEFCTEU7Ci0gICAgICBtZWRpYVBsYXllckluZm8ucG9zaXRpb24gPSBUUkFDS19EVVJBVElPTl9VTkFWQUlMQUJMRTsKLSAgICAgIG1lZGlhUGxheWVySW5mby50cmFja19jaGFuZ2VkID0gZmFsc2U7Ci0gICAgICBtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZSA9IDE7Ci0gICAgICBtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQgPSAxOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLnBsYXllcl9uYW1lX2xlbiA9IDA7Ci0gICAgICBtZWRpYVBsYXllckluZm8udHJhY2tfdGl0bGVfbGVuID0gMDsKLSAgICAgIG1lZGlhUGxheWVySW5mby5tZWRpYV9jdHJsX3BvaW50ID0gMDsKLSAgICAgIC8vYWRkaW5nIGFwcCB3aXRoIHJhbmRvbSB1dWlkCi0gICAgICBCVEFfR0FUVFNfQXBwUmVnaXN0ZXIoYWFwX3V1aWQsIEJUTWNwQ2JhY2ssIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ0xFQU5VUF9FVkVOVDoKLSAgICB7Ci0gICAgICAvL2luaXRpYXRlIGRpc2Nvbm5lY3Rpb24gdG8gYWxsIGNvbm5lY3RlZCBkZXZpY2UKLSAgICAgIC8vdW5yZWdpc3RlciBBUFAKLSAgICAgIEJUQV9HQVRUU19BcHBEZXJlZ2lzdGVyKG1jc1NlcnZlclNlcnZpY2VJbmZvLnNlcnZlcl9pZik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCVEFfR0FUVFNfUkVHX0VWVDoKLSAgICB7Ci0gICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgIGlmIChwX2RhdGEtPnJlZ19vcGVyLnN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5zZXJ2ZXJfaWYgPSBwX2RhdGEtPnJlZ19vcGVyLnNlcnZlcl9pZjsKLSAgICAgICAgIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2U7Ci0gICAgICAgICBzZXJ2aWNlID0gTWNwQWRkU2VydmljZShtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5zZXJ2ZXJfaWYpOwotICAgICAgICAgaWYgKHNlcnZpY2VbMF0udXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpIHx8Ci0gICAgICAgICAgICAgICAgIHNlcnZpY2VbMF0udXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FQX1NFUlZFUikpIHsKLSAgICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgICBzZXJ2aWNlIGFwcCByZWdpc3RlciB1dWlkIGlzIG5vdCB2YWxpZCI7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgICBzZXJ2aWNlIGFwcCByZWdpc3RlciI7Ci0gICAgICAgICBCVEFfR0FUVFNfQWRkU2VydmljZShtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5zZXJ2ZXJfaWYsIHNlcnZpY2UsIGJhc2U6OkJpbmQoJk9uTWNwU2VydmljZUFkZGVkQ2IpKTsKLSAgICAgICB9Ci0gICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfREVSRUdfRVZUOgotICAgIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTkZfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICB1aW50MTZfdCBjb25uX2lkID0gcF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkOwotICAgICAgdWludDhfdCBzdGF0dXMgPSBwX2RhdGEtPnJlcV9kYXRhLnN0YXR1czsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiY29ubl9pZCA6IiA8PCBjb25uX2lkIDw8ICJzdGF0dXM6IiA8PCBzdGF0dXM7Ci0gICAgICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJOb3RpZmljYXRpb24gY2FsbGJhY2sgZm9yIGNvbm5faWQgOiIgPDwgY29ubl9pZDsKLSAgICAgICAgICBHYXR0c09wc1F1ZXVlOjpOb3RpZmljYXRpb25DYWxsYmFjayhjb25uX2lkKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTkdFU1RfRVZUOgotICAgIHsKLSAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgIFJlbW90ZURldmljZSAqcmVtb3RlRGV2aWNlOwotICAgICAgcmVtb3RlRGV2aWNlID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+Y29uZ2VzdC5jb25uX2lkKTsKLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICAgY29ubmVjdGlvbiBlbnRyeSBub3QgZm91bmQgY29ubl9pZCA6IgotICAgICAgICAgIDw8IHBfZGF0YS0+Y29uZ2VzdC5jb25uX2lkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgLy8gcnNwLT5Db25uZ2VzdGlvbk9wLnN0YXR1cyA9IHBfZGF0YS0+cmVxX2RhdGEuc3RhdHVzOwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICByc3AtPm9wZXIuQ29uZ2VzdGlvbk9wLmNvbmdlc3RlZCA9IHBfZGF0YS0+Y29uZ2VzdC5jb25nZXN0ZWQ7Ci0gICAgICBwcm9jX2V2ZW50ID0gTUNQX0NPTkdFU1RJT05fVVBEQVRFOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9DT05HRVNUSU9OX1VQREFURTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUQV9HQVRUU19NVFVfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICBSZW1vdGVEZXZpY2UgKnJlbW90ZURldmljZTsKLSAgICAgIHJlbW90ZURldmljZSA9IGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+bXR1KTsKLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5lY3Rpb24gZW50cnkgbm90IGZvdW5kIGNvbm5faWQgOiIKLSAgICAgICAgICA8PCBwX2RhdGEtPmNvbmdlc3QuY29ubl9pZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjb25uX2lkIDoiPDwgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPm10dTsKLSAgICAgIExPRyhJTkZPKSA8PCJtdHUgIiA8PHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5tdHU7Ci0gICAgICBwcm9jX2V2ZW50ID0gTUNQX01UVV9VUERBVEU7Ci0gICAgICByc3AtPmV2ZW50ID0gTUNQX01UVV9VUERBVEU7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIHJzcC0+b3Blci5NdHVPcC5tdHUgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+bXR1OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTk5FQ1RfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAgIHJlbW90ZSBkZXZpY2VzIGNvbm5lY3RlZCI7Ci0gICAgICAvLzxUQkQ+IG5lZWQgdG8gZGlzY3VzcyBob3cgdG8gZ2V0IGVuY3J5cHRpb24gc3VwcG9ydAotICAgIC8qCi0gICAgI2lmICghZGVmaW5lZChCVEFfU0tJUF9CTEVfU1RBUlRfRU5DUllQVElPTikgfHwgQlRBX1NLSVBfQkxFX1NUQVJUX0VOQ1JZUFRJT04gPT0gRkFMU0UpCi0gICAgICAgIGJ0aWZfZ2F0dF9jaGVja19lbmNyeXB0ZWRfbGluayhwX2RhdGEtPmNvbm4ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmNvbm4udHJhbnNwb3J0KTsKLSAgICAjZW5kaWYqLwotICAgICAgUmVtb3RlRGV2aWNlIHJlbW90ZURldmljZTsKLSAgICAgIG1lbXNldCgmcmVtb3RlRGV2aWNlLCAwLCBzaXplb2YocmVtb3RlRGV2aWNlKSk7Ci0gICAgICBpZihpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlBZGRyZXNzKHBfZGF0YS0+Y29ubi5yZW1vdGVfYmRhKSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIHJlbW90ZSBkZXZpY2VzIGFscmVhZHkgdGhlcmUgaXMgY29ubmVjdGVkIGxpc3QiOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmVtb3RlRGV2aWNlLnBlZXJfYmRhID0gcF9kYXRhLT5jb25uLnJlbW90ZV9iZGE7Ci0gICAgICByZW1vdGVEZXZpY2UuY29ubl9pZCA9IHBfZGF0YS0+Y29ubi5jb25uX2lkOwotICAgICAgaWYoaW5zdGFuY2UtPnJlbW90ZURldmljZXMuQWRkKHJlbW90ZURldmljZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIHJlbW90ZSBkZXZpY2UgaXMgbm90IGFkZGVkIDogbWF4IGNvbm5lY3Rpb24gcmVhY2hlZCI7Ci0gICAgICAgIC8vPFRCRD4gbmVlZCB0byBjaGVjayBkaXNjb25uZWN0aW9uIHJlcXVpcmVkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmVtb3RlRGV2aWNlLnN0YXRlID0gTUNQX0RJU0NPTk5FQ1RFRDsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgICByZW1vdGUgZGV2aWNlcyBjb25uZWN0ZWQgY29ubl9pZDogIjw8IHJlbW90ZURldmljZS5jb25uX2lkIDw8Ci0gICAgICAgICAiYmRfYWRkciAiIDw8IHJlbW90ZURldmljZS5wZWVyX2JkYTsKLSAgICAgIHJzcC0+cmVtb3RlRGV2aWNlID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5QWRkcmVzcyhwX2RhdGEtPmNvbm4ucmVtb3RlX2JkYSk7Ci0gICAgICBpZiAoIHJzcC0+cmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwcm9jX2V2ZW50ID0gTUNQX0NPTk5FQ1RJT047Ci0gICAgICByc3AtPmV2ZW50ID0gTUNQX0NPTk5FQ1RJT047Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19DTE9TRV9FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVFNfRElTQ09OTkVDVF9FVlQ6IHsKLSAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICAgcmVtb3RlIGRldmljZXMgZGlzY29ubmVjdGVkIGNvbm5faWQgIiA8PCBwX2RhdGEtPmNvbm4uY29ubl9pZDsKLSAgICAgIFJlbW90ZURldmljZSAqcmVtb3RlRGV2aWNlOwotICAgICAgcmVtb3RlRGV2aWNlID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKHBfZGF0YS0+Y29ubi5jb25uX2lkKTsKLSAgICAgIGlmKCghcmVtb3RlRGV2aWNlKSApIHsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIHByb2NfZXZlbnQgPSBNQ1BfRElTQ09OTkVDVElPTjsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfRElTQ09OTkVDVElPTjsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICBkaXNjb25uZWN0ZWQgY29ubl9pZCAiIDw8IHBfZGF0YS0+Y29ubi5jb25uX2lkOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBCVEFfR0FUVFNfU1RPUF9FVlQ6Ci0gICAgICAvLzxUQkQ+IG5vdCByZXF1aXJlZAotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19ERUxFTFRFX0VWVDoKLSAgICAgIC8vPFRCRD4gbm90IHJlcXVpcmVkCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfQ0hBUkFDVEVSSVNUSUNfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyopcGFyYW07Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICAgIFJlbW90ZURldmljZSAqcmVtb3RlRGV2aWNlID0KLSAgICAgICAgICBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQocF9kYXRhLT5yZXFfZGF0YS5jb25uX2lkKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNoYXJhdGVyaXN0Y3MgcmVhZCBoYW5kbGUgIiA8PAotICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPDwiIHRyYW5zX2lkIDogIiA8PAotICAgICAgICAgIHBfZGF0YS0+cmVxX2RhdGEudHJhbnNfaWQ7Ci0KLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRldmljZSBub3QgZm91bmQgaWdub3JlIHJlYWQgb3BlcmF0aW9uIjsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBMT0coSU5GTykgPDwiICAgb2Zmc2V0OiAiIDw8IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5vZmZzZXQgPDwKLSAgICAgICAgICAiIGxvbmcgOiAiIDw8IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5pc19sb25nOwotCi0gICAgICByc3AtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmF1dGhfcmVxICA9IDA7Ci0gICAgICByc3AtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmhhbmRsZSA9IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGU7Ci0gICAgICByc3AtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLm9mZnNldCA9IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5vZmZzZXQ7Ci0KLSAgICAgIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9zdGF0ZV9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9NRURJQV9TVEFURV9SRUFEOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9zdGF0ZV9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlKSB7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVfU1VQUE9SVEVEX1JFQUQ7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9wbGF5ZXJfbmFtZV9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9NRURJQV9QTEFZRVJfTkFNRV9SRUFEOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9wbGF5ZXJfbmFtZV9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9UUkFDS19USVRMRV9SRUFEOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja190aXRsZV9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9UUkFDS19QT1NJVElPTl9SRUFEOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja19wb3NpdGlvbl9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9UUkFDS19EVVJBVElPTl9SRUFEOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja19kdXJhdGlvbl9oYW5kbGUgcmVhZCI7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5jY2lkX2hhbmRsZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjY2lkX2hhbmRsZSByZWFkIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9DQ0lEX1JFQUQ7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5zZWVraW5nX3NwZWVkX2hhbmRsZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBzZWVraW5nX3NwZWVkX2hhbmRsZSByZWFkIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9TRUVLSU5HX1NQRUVEX1JFQUQ7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5wbGF5aW5nX29yZGVyX3N1cHBvcnRlZF9oYW5kbGUpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcGxheWluZ19vcmRlcl9zdXBwb3J0ZWRfaGFuZGxlIHJlYWQiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX1BMQVlJTkdfT1JERVJfU1VQUE9SVEVEX1JFQUQ7Ci0gICAgICB9IGVsc2UgaWYocF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5wbGF5aW5nX29yZGVyX2hhbmRsZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBwbGF5aW5nX29yZGVyX2hhbmRsZSByZWFkIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9QTEFZSU5HX09SREVSX1JFQUQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiByZWFkIHJlcXVlc3QgZm9yIHVua25vd24gaGFuZGxlIiA8PCBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiByZWFkIHJlcXVlc3QgaGFuZGxlIiA8PCBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlIDw8Ci0gICAgICAgICJjb25uZWN0aW9uIGlkIiA8PCBwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQ7Ci0gICAgICByc3AtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgcnNwLT5vcGVyLlJlYWRPcC50cmFuc19pZCA9IHBfZGF0YS0+cmVxX2RhdGEudHJhbnNfaWQ7Ci0gICAgICByc3AtPm9wZXIuUmVhZE9wLmlzX2xvbmcgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaXNfbG9uZzsKLSAgICAgIHJzcC0+b3Blci5SZWFkT3Auc3RhdHVzID0gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX1JFQURfREVTQ1JJUFRPUl9FVlQ6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICByZWFkIGRlc2NyaXB0b3IiOwotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIGNoYXJhdGVyaXN0Y3MgcmVhZCBkZXNjIGhhbmRsZSAiIDw8Ci0gICAgICAgICAgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZSA8PCAiIG9mZnNldCA6ICIKLSAgICAgICAgICA8PCBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEub2Zmc2V0OwotICAgICAgUmVtb3RlRGV2aWNlICpyZW1vdGVEZXZpY2UgPQotICAgICAgICAgIGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgd3JpdGUiOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9zdGF0ZV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX3N0YXRlX2Rlc2MgcmVhZCI7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTUVESUFfU1RBVEVfUkVBRF9ERVNDUklQVE9SOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWVkaWFfY29udHJvbF9wb2ludF9kZXNjIHJlYWQiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX01FRElBX0NPTlRST0xfUE9JTlRfUkVBRF9ERVNDUklQVE9SOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfZGVzYykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfZGVzYyByZWFkIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX09QQ09ERV9TVVBQT1JURURfREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9wbGF5ZXJfbmFtZV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX3BsYXllcl9uYW1lX2Rlc2MgcmVhZCI7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTUVESUFfUExBWUVSX05BTUVfREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdHJhY2tfY2hhbmdlZF9kZXNjIHJlYWQiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX1RSQUNLX0NIQU5HRURfREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHRyYWNrX3RpdGxlX2Rlc2MgcmVhZCI7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfVFJBQ0tfVElUTEVfREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHRyYWNrX3Bvc2l0aW9uX2Rlc2MgcmVhZCI7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfVFJBQ0tfUE9TSVRJT05fREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl9kZXNjKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHRyYWNrX2R1cmF0aW9uX2Rlc2MgcmVhZCI7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfVFJBQ0tfRFVSQVRJT05fREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIGlmKHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT5yZWFkX3JlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5wbGF5aW5nX29yZGVyX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcGxheWluZ19vcmRlcl9kZXNjIHJlYWQiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX1BMQVlJTkdfT1JERVJfREVTQ1JJUFRPUl9SRUFEOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcmVhZCByZXF1ZXN0IGZvciB1bmtub3duIGhhbmRsZSIgPDwgcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZTsKLSAgICAgICAgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcnNwLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgcnNwLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5hdXRoX3JlcSAgPSAwOwotICAgICAgcnNwLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5oYW5kbGUgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEuaGFuZGxlOwotICAgICAgcnNwLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5vZmZzZXQgPSBwX2RhdGEtPnJlcV9kYXRhLnBfZGF0YS0+cmVhZF9yZXEub2Zmc2V0OwotICAgICAgLy9tY3AgcmVzcG9uc2UKLSAgICAgIHJzcC0+b3Blci5SZWFkRGVzY09wLmRlc2NfaGFuZGxlID0gcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPnJlYWRfcmVxLmhhbmRsZTsKLSAgICAgIHJzcC0+b3Blci5SZWFkRGVzY09wLnRyYW5zX2lkID0gcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLSAgICAgIHJzcC0+b3Blci5SZWFkRGVzY09wLnN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19XUklURV9DSEFSQUNURVJJU1RJQ19FVlQ6IHsKLSAgICAgIHBfZGF0YSA9ICh0QlRBX0dBVFRTKilwYXJhbTsKLSAgICAgICAgY29uc3QgYXV0byYgcmVxID0gcF9kYXRhLT5yZXFfZGF0YS5wX2RhdGEtPndyaXRlX3JlcTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHdyaXRlIGNoYXJhY3RlcmlzdGljcyBsZW4gOiAiIDw8IHJlcS5sZW4gPDwgIiB2YWx1ZSAiPDwgcmVxLnZhbHVlWzBdOwotICAgICAgUmVtb3RlRGV2aWNlICpyZW1vdGVEZXZpY2UgPQotICAgICAgICAgIGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgd3JpdGUiOwotICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfREVWSUNFX05PVF9DT05ORUNURUQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByc3AtPmV2ZW50ID0gTUNQX1dSSVRFX1JTUDsKLSAgICAgIHJzcC0+b3Blci5Xcml0ZU9wLnN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICAgICAgaWYgKHJlcS5oYW5kbGUgPT0gbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9QTEFZSU5HX09SREVSX1dSSVRFOwotICAgICAgfSBlbHNlIGlmIChyZXEuaGFuZGxlID09IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfaGFuZGxlKSB7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9XUklURTsKLSAgICAgIH0gZWxzZSBpZiAocmVxLmhhbmRsZSA9PSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl9oYW5kbGUpIHsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9UUkFDS19QT1NJVElPTl9XUklURTsKLSAgICAgIH0gZWxzZSAgewotICAgICAgICAvL2NoYXJhY3RlcmlzdGljcyBoYW5kbGUgbm90IG1hdGNoZWQuCi0gICAgICAgIC8vPFRCRD4KLSAgICAgICAgcnNwLT5vcGVyLldyaXRlT3Auc3RhdHVzID0gQlRfU1RBVFVTX0hBTkxERV9OT1RfTUFUQ0hFRDsKLSAgICAgIH0KLSAgICAgIHJzcC0+b3Blci5Xcml0ZU9wLmNoYXJfaGFuZGxlID0gcmVxLmhhbmRsZTsKLSAgICAgIHJzcC0+b3Blci5Xcml0ZU9wLnRyYW5zX2lkID0gcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLSAgICAgIHJzcC0+cmVtb3RlRGV2aWNlID0gcmVtb3RlRGV2aWNlOwotICAgICAgcnNwLT5vcGVyLldyaXRlT3AubmVlZF9yc3AgPSByZXEubmVlZF9yc3A7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVPcC5vZmZzZXQgPSByZXEub2Zmc2V0OyAvLzxUQkQ+IG5lZWQgdG8gY2hlY2sgcmVxdWlyZW1lbnQKLSAgICAgIG1lbWNweShyc3AtPm9wZXIuV3JpdGVPcC5kYXRhLCByZXEudmFsdWUsIHJlcS5sZW4pOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTG9jYWwgVHggSUQgIiA8PCByc3AtPm9wZXIuV3JpdGVPcC50cmFuc19pZCA8PCAiIEdhdHQgVHggSUQ6ICIgPDwgcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX1dSSVRFX0RFU0NSSVBUT1JfRVZUOiB7Ci0gICAgICBwX2RhdGEgPSAodEJUQV9HQVRUUyogKXBhcmFtOwotICAgICAgdWludDE2X3QgcmVxX3ZhbHVlID0gMDsKLSAgICAgIGNvbnN0IGF1dG8mIHJlcSA9IHBfZGF0YS0+cmVxX2RhdGEucF9kYXRhLT53cml0ZV9yZXE7Ci0gICAgICBSZW1vdGVEZXZpY2UgKnJlbW90ZURldmljZSA9Ci0gICAgICAgICAgIGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUNvbm5JZChwX2RhdGEtPnJlcV9kYXRhLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgbm90aWZpY2F0aW9uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXFfdmFsdWUgPSAqKHVpbnQxNl90KiApcmVxLnZhbHVlOwotICAgICAgLy9uZWVkIHRvIGluaXRpYWxpemVkIHdpdGggcHJvcGVyIGVycm9yIGNvZGUKLSAgICAgIGludCBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICAgd3JpdGUgZGVzY3JpcHRvciA6IiA8PCByZXEuaGFuZGxlIDw8Ci0gICAgICAgICAiaXMgcmVzcDogIiA8PCByZXEubmVlZF9yc3AgPDwgImlzIHByZXA6ICIgPDwgcmVxLmlzX3ByZXAgPDwgIiB2YWx1ZSAiIDw8IHJlcV92YWx1ZTsKLQotICAgICAgaWYocmVxLmhhbmRsZSA9PQotICAgICAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3N0YXRlX2Rlc2MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWVkaWFfc3RhdGVfZGVzYyBkZXNjcmlwdG9yIHdyaXRlIjsKLSAgICAgICAgcmVtb3RlRGV2aWNlLT5tZWRpYV9zdGF0ZV9ub3RpZnkgPSByZXFfdmFsdWU7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTUVESUFfU1RBVEVfREVTQ1JJUFRPUl9XUklURTsKLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3BsYXllcl9uYW1lX2Rlc2MpIHsKLSAgICAgICAgcmVtb3RlRGV2aWNlLT5tZWRpYV9wbGF5ZXJfbmFtZV9ub3RpZnkgPSByZXFfdmFsdWU7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhX3BsYXllcl9uYW1lX2Rlc2MgZGVzY3JpcHRvciB3cml0ZSI7Ci0gICAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTUVESUFfUExBWUVSX05BTUVfREVTQ1JJUFRPUl9XUklURTsKLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfZGVzYykgewotICAgICAgICAgICAgcmVtb3RlRGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X25vdGlmeSA9IHJlcV92YWx1ZTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgbWVkaWFfcGxheWVyX2NvbnRyb2xfcG9pbnRfZGVzYyBkZXNjcmlwdG9yIHdyaXRlIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX0RFU0NSSVBUT1JfV1JJVEU7Ci0gICAgICB9IGVsc2UgaWYocmVxLmhhbmRsZSA9PQotICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfZGVzYykgewotICAgICAgICAgICAgcmVtb3RlRGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfbm90aWZ5ID0gcmVxX3ZhbHVlOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfZGVzYyBkZXNjcmlwdG9yIHdyaXRlIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1NVUFBPUlRFRF9ERVNDUklQVE9SX1dSSVRFOwotICAgICAgfSBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2Rlc2MpIHsKLSAgICAgICAgcmVtb3RlRGV2aWNlLT50cmFja19jaGFuZ2VkX25vdGlmeSA9IHJlcV92YWx1ZTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdHJhY2tfY2hhbmdlZF9kZXNjIGRlc2NyaXB0b3Igd3JpdGUiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX1RSQUNLX0NIQU5HRURfREVTQ1JJUFRPUl9XUklURTsKLSAgICAgIH0gZWxzZSBpZihyZXEuaGFuZGxlID09Ci0gICAgICAgICAgbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfdGl0bGVfZGVzYykgewotICAgICAgICByZW1vdGVEZXZpY2UtPnRyYWNrX3RpdGxlX25vdGlmeSA9IHJlcV92YWx1ZTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdHJhY2tfdGl0bGVfZGVzYyBkZXNjcmlwdG9yIHdyaXRlIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9UUkFDS19USVRMRV9ERVNDUklQVE9SX1dSSVRFOwotICAgICAgfSBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfcG9zaXRpb25fZGVzYykgewotICAgICAgICByZW1vdGVEZXZpY2UtPnRyYWNrX3Bvc2l0aW9uX25vdGlmeSAgID0gcmVxX3ZhbHVlOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja19wb3NpdGlvbl9kZXNjIGRlc2NyaXB0b3Igd3JpdGUiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfV1JJVEU7Ci0gICAgICB9IGVsc2UgaWYocmVxLmhhbmRsZSA9PQotICAgICAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX2R1cmF0aW9uX2Rlc2MpIHsKLSAgICAgICAgcmVtb3RlRGV2aWNlLT50cmFja19kdXJhdGlvbl9ub3RpZnkgICA9IHJlcV92YWx1ZTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgdHJhY2tfZHVyYXRpb25fZGVzYyBkZXNjcmlwdG9yIHdyaXRlIjsKLSAgICAgICAgcHJvY19ldmVudCA9IE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1dSSVRFOwotICAgICAgfSBlbHNlIGlmKHJlcS5oYW5kbGUgPT0KLSAgICAgICAgICBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5wbGF5aW5nX29yZGVyX2Rlc2MpIHsKLSAgICAgICAgcmVtb3RlRGV2aWNlLT5wbGF5aW5nX29yZGVyX25vdGlmeSA9IHJlcV92YWx1ZTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcGxheWluZ19vcmRlcl9kZXNjIGRlc2NyaXB0b3Igd3JpdGUiOwotICAgICAgICBwcm9jX2V2ZW50ID0gTUNQX1BMQVlJTkdfT1JERVJfREVTQ1JJUFRPUl9XUklURTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICBkZXNjcmlwdG9yIHdyaXRlIG5vdCBtYXRjaGVkICI7Ci0gICAgICAgIHN0YXR1cyA9IDQ7IC8vPFRCRD5uZWVkIHRvIGNoZWNrIGVycm9yIGNvZGUKLSAgICAgIH0KLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVEZXNjT3AuZGVzY19oYW5kbGUgPSByZXEuaGFuZGxlOwotICAgICAgcnNwLT5vcGVyLldyaXRlRGVzY09wLnRyYW5zX2lkID0gcF9kYXRhLT5yZXFfZGF0YS50cmFuc19pZDsKLSAgICAgIHJzcC0+b3Blci5Xcml0ZURlc2NPcC5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVEZXNjT3AubmVlZF9yc3AgPSByZXEubmVlZF9yc3A7Ci0gICAgICByc3AtPm9wZXIuV3JpdGVEZXNjT3Aubm90aWZpY2F0aW9uID0gcmVxX3ZhbHVlOwotICAgICAgcnNwLT5yZW1vdGVEZXZpY2UgPSByZW1vdGVEZXZpY2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19FWEVDX1dSSVRFX0VWVDogewotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgLy88VEJEPiBuZWVkIHRvIGNoZWNrIHJlcXVpcmVtZW50Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEJUQV9HQVRUU19QSFlfVVBEQVRFX0VWVDogewotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgUmVtb3RlRGV2aWNlICpyZW1vdGVEZXZpY2UgPQotICAgICAgICBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQocF9kYXRhLT5waHlfdXBkYXRlLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlIG5vdCBmb3VuZCBpZ25vcmUgcGh5IHVwZGF0ZSIKLSAgICAgICAgICAgIDw8IHBfZGF0YS0+cGh5X3VwZGF0ZS5zdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHByb2NfZXZlbnQgPSBNQ1BfUEhZX1VQREFURTsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfUEhZX1VQREFURTsKLSAgICAgIHJzcC0+b3Blci5QaHlPcC5yeF9waHkgPSBwX2RhdGEtPnBoeV91cGRhdGUucnhfcGh5OwotICAgICAgcnNwLT5vcGVyLlBoeU9wLnR4X3BoeSA9IHBfZGF0YS0+cGh5X3VwZGF0ZS50eF9waHk7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRTX0NPTk5fVVBEQVRFX0VWVDogewotICAgICAgcF9kYXRhID0gKHRCVEFfR0FUVFMqKXBhcmFtOwotICAgICAgUmVtb3RlRGV2aWNlICpyZW1vdGVEZXZpY2UgPQotICAgICAgICBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQocF9kYXRhLT5waHlfdXBkYXRlLmNvbm5faWQpOwotICAgICAgaWYocmVtb3RlRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY29ubmVjdGlvbiB1cGRhdGUgZGV2aWNlIG5vdCBmb3VuZCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgY29ubmVjdGlvbiB1cGRhdGUgc3RhdHVzIiA8PCBwX2RhdGEtPnBoeV91cGRhdGUuc3RhdHVzOwotICAgICAgcHJvY19ldmVudCA9IE1DUF9DT05ORUNUSU9OX1VQREFURTsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfQ09OTkVDVElPTl9VUERBVEU7Ci0gICAgICByc3AtPm9wZXIuQ29ubmVjdGlvblVwZGF0ZU9wLmxhdGVuY3kgPSBwX2RhdGEtPmNvbm5fdXBkYXRlLmxhdGVuY3k7Ci0gICAgICByc3AtPm9wZXIuQ29ubmVjdGlvblVwZGF0ZU9wLnRpbWVvdXQgPSBwX2RhdGEtPmNvbm5fdXBkYXRlLnRpbWVvdXQ7Ci0gICAgICByc3AtPm9wZXIuQ29ubmVjdGlvblVwZGF0ZU9wLmludGVydmFsID0gcF9kYXRhLT5jb25uX3VwZGF0ZS5pbnRlcnZhbDsKLSAgICAgIHJzcC0+b3Blci5Db25uZWN0aW9uVXBkYXRlT3Auc3RhdHVzID0gcF9kYXRhLT5jb25uX3VwZGF0ZS5zdGF0dXM7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0FDVElWRV9ERVZJQ0VfVVBEQVRFOgotICAgIHsKLSAgICAgIHRNQ1BfU0VUX0FDVElWRV9ERVZJQ0UgKmRhdGEgPSAodE1DUF9TRVRfQUNUSVZFX0RFVklDRSAqKXBhcmFtOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzcyAiIDw8IGRhdGEtPmFkZHJlc3M7Ci0gICAgICBSZW1vdGVEZXZpY2UgKnJlbW90ZURldmljZSA9IGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUFkZHJlc3MoZGF0YS0+YWRkcmVzcyk7Ci0gICAgICBpZihyZW1vdGVEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhY3RpdmUgZGV2aWNlIHVwZGF0ZSBkZXZpY2UgYWRkcmVzcyBub3QgZm91bmQiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkFkZFNldEFjdGl2ZURldmljZShkYXRhKTsKLSAgICAgIHJzcC0+cmVtb3RlRGV2aWNlID0gcmVtb3RlRGV2aWNlOwotICAgICAgcnNwLT5vcGVyLlNldEFjdGl2ZURldmljZU9wLnByb2ZpbGUgPSBkYXRhLT5wcm9maWxlOwotICAgICAgcHJvY19ldmVudCA9IE1DUF9BQ1RJVkVfREVWSUNFX1VQREFURTsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfQUNUSVZFX0RFVklDRV9VUERBVEU7Ci0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfVVBEQVRFOgotICAgIHsKLSAgICAgIHRNQ1BfTUVESUFfU1RBVEUgKmRhdGEgPSAodE1DUF9NRURJQV9TVEFURSAqKSBwYXJhbTsKLSAgICAgIGlmIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3RhdGUgIT0gZGF0YS0+c3RhdGUpCi0gICAgICAgIG1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZSA9IGRhdGEtPnN0YXRlOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc3RhdGU6ICIgPDwgdW5zaWduZWQobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfc3RhdGVfaGFuZGxlOwotICAgICAgcnNwLT5vcGVyLk1lZGlhVXBkYXRlT3AuZGF0YSA9ICZtZWRpYVBsYXllckluZm8ubWVkaWFfc3RhdGU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX1VQREFURToKLSAgICB7Ci0gICAgICB0TUNQX01FRElBX1BMQVlFUl9OQU1FICpkYXRhID0gKHRNQ1BfTUVESUFfUExBWUVSX05BTUUgKikgcGFyYW07Ci0gICAgICBpZiAobWVtY21wKG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZSwgZGF0YS0+bmFtZSwgZGF0YS0+bGVuKSkgewotICAgICAgICBtZW1jcHkobWVkaWFQbGF5ZXJJbmZvLnBsYXllcl9uYW1lLCBkYXRhLCBkYXRhLT5sZW4pOwotICAgICAgICBtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWVfbGVuID0gZGF0YS0+bGVuOwotICAgICAgfQotICAgICAgcHJvY19ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9wbGF5ZXJfbmFtZV9oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5kYXRhID0gKHVpbnQ4X3QgKiltZWRpYVBsYXllckluZm8ucGxheWVyX25hbWU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5sZW4gPSBtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWVfbGVuOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfTUVESUFfU1VQUE9SVEVEX09QQ09ERV9VUERBVEU6Ci0gICAgewotICAgICAgdE1DUF9NRURJQV9PUENPREVfU1VQUE9SVCAqZGF0YSA9ICh0TUNQX01FRElBX09QQ09ERV9TVVBQT1JUICopcGFyYW07Ci0gICAgICBtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUgPSBkYXRhLT5zdXBwb3J0ZWQ7Ci0gICAgICBwcm9jX2V2ZW50ID0gTUNQX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmV2ZW50ID0gTUNQX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmhhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICAgICAgcnNwLT5vcGVyLk1lZGlhVXBkYXRlT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1VQREFURToKLSAgICB7Ci0gICAgICB0TUNQX01FRElBX0NPTlRST0xfUE9JTlQgKmRhdGEgPSAodE1DUF9NRURJQV9DT05UUk9MX1BPSU5UICopcGFyYW07Ci0gICAgICBtZWRpYVBsYXllckluZm8ubWVkaWFfY3RybF9wb2ludCA9IGRhdGEtPnJlcV9vcGNvZGUgfCAoZGF0YS0+cmVzdWx0IDw8IDgpOwotICAgICAgcHJvY19ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X2hhbmRsZTsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ubWVkaWFfY3RybF9wb2ludDsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ubWVkaWFfY3RybF9wb2ludCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JURURfVVBEQVRFOgotICAgIHsKLSAgICAgIHRNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JUICpkYXRhID0gKHRNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JUICopIHBhcmFtOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkID0gZGF0YS0+b3JkZXJfc3VwcG9ydGVkOwotICAgICAgcHJvY19ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPQotICAgICAgICAgIG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkOwotICAgICAgcnNwLT5vcGVyLk1lZGlhVXBkYXRlT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3N1cHBvcnRlZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1VQREFURToKLSAgICB7Ci0gICAgICB0TUNQX1BMQVlJTkdfT1JERVIgKmRhdGEgPSAodE1DUF9QTEFZSU5HX09SREVSICopIHBhcmFtOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWUgPSBkYXRhLT5vcmRlcjsKLSAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8ucGxheWluZ19vcmRlcl9oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfVFJBQ0tfQ0hBTkdFRF9VUERBVEU6Ci0gICAgewotICAgICAgdE1DUF9UUkFDS19DSEFOR0VEICpkYXRhID0gKHRNQ1BfVFJBQ0tfQ0hBTkdFRCAqKSBwYXJhbTsKLSAgICAgIG1lZGlhUGxheWVySW5mby50cmFja19jaGFuZ2VkID0gZGF0YS0+c3RhdHVzOwotICAgICAgcHJvY19ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2hhbmRsZTsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8udHJhY2tfY2hhbmdlZDsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8udHJhY2tfY2hhbmdlZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9VUERBVEU6Ci0gICAgewotICAgICAgdE1DUF9UUkFDS19QT1NUSU9OICpkYXRhID0gKHRNQ1BfVFJBQ0tfUE9TVElPTiopIHBhcmFtOwotICAgICAgaWYoZGF0YS0+cG9zaXRpb24gIT0gbWVkaWFQbGF5ZXJJbmZvLnBvc2l0aW9uKSB7Ci0gICAgICAgIG1lZGlhUGxheWVySW5mby5wb3NpdGlvbiA9IGRhdGEtPnBvc2l0aW9uOwotICAgICAgfQotICAgICAgcHJvY19ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl9oYW5kbGU7Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBvc2l0aW9uOwotICAgICAgcnNwLT5vcGVyLk1lZGlhVXBkYXRlT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wb3NpdGlvbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9VUERBVEU6Ci0gICAgewotICAgICAgdE1DUF9UUkFDS19EVVJBVElPTiogZGF0YSA9ICh0TUNQX1RSQUNLX0RVUkFUSU9OICopIHBhcmFtOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uID0gZGF0YS0+ZHVyYXRpb247Ci0gICAgICBwcm9jX2V2ZW50ID0gTUNQX05PVElGWV9BTEw7Ci0gICAgICByc3AtPmV2ZW50ID0gTUNQX05PVElGWV9BTEw7Ci0gICAgICByc3AtPnJzcF92YWx1ZS5oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl9oYW5kbGU7Ci0gICAgICByc3AtPmhhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX2R1cmF0aW9uX2hhbmRsZTsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICByc3AtPm9wZXIuTWVkaWFVcGRhdGVPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX1RJVExFX1VQREFURToKLSAgICB7Ci0gICAgICB0TUNQX1RSQUNLX1RJVExFICpkYXRhID0gKHRNQ1BfVFJBQ0tfVElUTEUqKSBwYXJhbTsKLSAgICAgIHByb2NfZXZlbnQgPSBNQ1BfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+ZXZlbnQgPSBNQ1BfTk9USUZZX0FMTDsKLSAgICAgIHJzcC0+aGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfdGl0bGVfaGFuZGxlOwotICAgICAgaWYgKG1lbWNtcChtZWRpYVBsYXllckluZm8udGl0bGUsIGRhdGEtPnRpdGxlLCBkYXRhLT5sZW4pKSB7Ci0gICAgICAgIG1lbWNweShtZWRpYVBsYXllckluZm8udGl0bGUsIGRhdGEtPnRpdGxlLCBkYXRhLT5sZW4pOwotICAgICAgICBtZWRpYVBsYXllckluZm8udHJhY2tfdGl0bGVfbGVuID0gZGF0YS0+bGVuOwotICAgICAgfQotICAgICAgcnNwLT5vcGVyLk1lZGlhVXBkYXRlT3AuZGF0YSA9ICh1aW50OF90ICopbWVkaWFQbGF5ZXJJbmZvLnRpdGxlOwotICAgICAgcnNwLT5vcGVyLk1lZGlhVXBkYXRlT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby50cmFja190aXRsZV9sZW4pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX0NDSURfVVBEQVRFOgotICAgIHsKLSAgICAgIHRNQ1BfQ09OVEVOVF9DT05UUk9MX0lEICpkYXRhID0gKHRNQ1BfQ09OVEVOVF9DT05UUk9MX0lEICopIHBhcmFtOwotICAgICAgbWVkaWFQbGF5ZXJJbmZvLmNjaWQgPSAodWludDhfdClkYXRhLT5jY2lkOwotICAgICAgcHJvY19ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5ldmVudCA9IE1DUF9OT1RJRllfQUxMOwotICAgICAgcnNwLT5oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5jY2lkX2hhbmRsZTsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8uY2NpZDsKLSAgICAgIHJzcC0+b3Blci5NZWRpYVVwZGF0ZU9wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uY2NpZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OX0NMT1NFX0VWRU5UOgotICAgIHsKLSAgICAgIHRNQ1BfQ09OTkVDVElPTl9DTE9TRSogcF9kYXRhID0gKHRNQ1BfQ09OTkVDVElPTl9DTE9TRSAqKXBhcmFtOwotICAgICAgUmVtb3RlRGV2aWNlKiByZW1vdGVEZXZpY2UgPSBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlBZGRyZXNzKHBfZGF0YS0+YWRkcik7Ci0gICAgICBpZihyZW1vdGVEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzIGlzIG5vdCBpbiBsaXN0IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwcm9jX2V2ZW50ID0gTUNQX0NPTk5FQ1RJT05fQ0xPU0VfRVZFTlQ7Ci0gICAgICByc3AtPnJlbW90ZURldmljZSA9IHJlbW90ZURldmljZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0JPTkRfU1RBVEVfQ0hBTkdFX0VWRU5UOgotICAgIHsKLSAgICAgIHRNQ1BfQk9ORF9TVEFURV9DSEFOR0UqIHBfZGF0YSA9ICh0TUNQX0JPTkRfU1RBVEVfQ0hBTkdFICopcGFyYW07Ci0gICAgICBSZW1vdGVEZXZpY2UqIHJlbW90ZURldmljZSA9IGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRCeUFkZHJlc3MocF9kYXRhLT5hZGRyKTsKLSAgICAgIGlmKHJlbW90ZURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3MgaXMgbm90IGluIGxpc3QiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLlJlbW92ZShwX2RhdGEtPmFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBldmVudCBub3QgbWF0Y2hlZCAhISI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmKHJzcC0+ZXZlbnQgIT0gTUNQX05PTkVfRVZFTlQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBldmVudCB0byBtZWRpYSBoYW5kbGVyICIgPDwgZ2V0X21jcF9ldmVudF9uYW1lKHJzcC0+ZXZlbnQpOwotICAgIG1lZGlhUGxheWVySW5mby5NZWRpYVN0YXRlSGFuZGxlclBvaW50ZXJbbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlXShwcm9jX2V2ZW50LCByc3AsIG1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZSk7Ci0gIH0KLSAgaWYocnNwKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJmcmVlIHJzcCBkYXRhIjsKLSAgICBvc2lfZnJlZShyc3ApOwotICB9Ci19Ci0KLQotYm9vbCBNZWRpYVN0YXRlSW5hY3RpdmVIYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSwgdWludDhfdCBzdGF0ZSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBoYW5kbGUgZXZlbnQgIiA8PCBnZXRfbWNwX2V2ZW50X25hbWUoZXZlbnQpCi0gICAgICAgICAgICA8PCAiIGluIHN0YXRlICIgPDwgZ2V0X21jcF9tZWRpYV9zdGF0ZV9uYW1lKHN0YXRlKTsKLQotICBtY3BfcmVzcF90ICpwX2RhdGEgPSAobWNwX3Jlc3BfdCAqKXBhcmFtOwotCi0gIFJlbW90ZURldmljZSAqZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluYWN0aXZlIG1jcyBoYW5kbGUgZXZlbnQgIjw8IGdldF9tY3BfZXZlbnRfbmFtZShwX2RhdGEtPmV2ZW50KTsKLSAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBNQ1BfTk9USUZZX0FMTDogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTm90aWZ5IGFsbCBoYW5kbGUgIjw8IHBfZGF0YS0+aGFuZGxlOwotICAgICAgc3RkOjp2ZWN0b3I8UmVtb3RlRGV2aWNlPm5vdGlmeURldmljZXMgPSBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kTm90aWZ5RGV2aWNlcyhwX2RhdGEtPmhhbmRsZSk7Ci0gICAgICBzdGQ6OnZlY3RvcjxSZW1vdGVEZXZpY2U+OjppdGVyYXRvciBpdDsKLSAgICAgIGlmIChub3RpZnlEZXZpY2VzLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vIGRldmljZSByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBmb3IgKGl0ID0gbm90aWZ5RGV2aWNlcy5iZWdpbigpOyBpdCAhPSBub3RpZnlEZXZpY2VzLmVuZCgpOyBpdCsrKXsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdGlmeSBhbGwgaGFuZGxlIGRldmljZSBpZCAiIDw8IGl0LT5jb25uX2lkOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UgPSBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQoaXQtPmNvbm5faWQpOwotICAgICAgICBpdC0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltpdC0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgaXQtPnN0YXRlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX1dSSVRFOgotICAgIGNhc2UgTUNQX1BMQVlJTkdfT1JERVJfV1JJVEU6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiSWdub3JlIG90aGVyIHJlcXVlc3QgYXMgcGxheWVyIGlzIG5vdCBhY3RpdmUiOwotICAgICAgLy9uZWVkIHRvIGlnbm9yZSB3cml0ZSByc3AgYmVjYXVzZSBubyBwbGF5ZXIgaXMgYWN0aXZlCi0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IDA7Ci0gICAgICB1aW50OF90IGRhdGEgPSAodWludDhfdCkoKnBfZGF0YS0+b3Blci5Xcml0ZU9wLmRhdGEpOwotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soZGF0YSk7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soMHgwMyk7IC8vIFRvLURvIGNoZWNrID8/PwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJobmRsICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGU7Ci0gICAgICBHYXR0c09wc1F1ZXVlOjpTZW5kTm90aWZpY2F0aW9uKGRldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGUsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1dSSVRFOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIklnbm9yZSBvdGhlciByZXF1ZXN0IGFzIHBsYXllciBpcyBub3QgYWN0aXZlIGN0cmwgcHQgd3JpdGUiOwotICAgICAgLy9uZWVkIHRvIGlnbm9yZSB3cml0ZSByc3AgYmVjYXVzZSBubyBwbGF5ZXIgaXMgYWN0aXZlCi0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IDA7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIHVpbnQ4X3QgZGF0YSA9ICh1aW50OF90KSgqcF9kYXRhLT5vcGVyLldyaXRlT3AuZGF0YSk7Ci0gICAgICB1aW50OF90IHN0YXR1cyA9IE1DUF9NRURJQV9QTEFZRVJfSU5BQ1RJVkU7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICAgIGJvb2wgb3Bjb2RlX3N1cHBvcnQgPSBpc19vcGNvZGVfc3VwcG9ydGVkKGRhdGEpOwotICAgICAgaWYgKCFvcGNvZGVfc3VwcG9ydCkgewotICAgICAgICBzdGF0dXMgPSBNQ1BfT1BDT0RFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiU2VuZGluZyBPUENvZGUgVW5zdXBwb3J0ZWQgaW5kaWNhdGlvbiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIlNlbmRpbmcgSU5BQ1RJVkUgaW5kaWNhdGlvbiI7Ci0gICAgICB9Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soZGF0YSk7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiaGFuZGxlICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGU7Ci0gICAgICBHYXR0c09wc1F1ZXVlOjpTZW5kTm90aWZpY2F0aW9uKGRldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGUsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgICoodWludDhfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAgKHVpbnQ4X3QpbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX1JFQUQ6IHsKLSAgICAgIHVpbnQxNl90IGxlbiA9IG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZV9sZW47Ci0gICAgICBpZiAoZGV2aWNlLT5tdHUgIT0gLTEgJiYgbGVuID49IGRldmljZS0+bXR1IC0gMykgLy90byBjaGVjayBwbGF5ZXIgbGVuIHNob3VsZCBub3QgZ3JlYXRlciB0aGFuIG10dQotICAgICAgICBsZW4gPSBkZXZpY2UtPm10dSAtIDM7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IGxlbjsKLSAgICAgIG1lbWNweShwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlLCBtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWUsCi0gICAgICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVfU1VQUE9SVEVEX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZSk7Ci0gICAgICAqKHVpbnQzMl90KilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0KLSAgICAgICAgICBNQ1BfREVGQVVMVF9NRURJQV9DVFJMX1NVUFBfRkVBVDsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX1RJVExFX1JFQUQ6IHsKLSAgICAgIHVpbnQxNl90IGxlbiA9IG1lZGlhUGxheWVySW5mby50cmFja190aXRsZV9sZW47Ci0gICAgICBpZiAoZGV2aWNlLT5tdHUgIT0gLTEgJiYgbGVuID49IGRldmljZS0+bXR1IC0gMykgLy90byBjaGVjayB0aXRsZSBsZW4gc2hvdWxkIG5vdCBncmVhdGVyIHRoYW4gbXR1Ci0gICAgICAgIGxlbiA9IGRldmljZS0+bXR1IC0gMzsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gbGVuOwotICAgICAgbWVtY3B5KHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUsIG1lZGlhUGxheWVySW5mby50aXRsZSwKLSAgICAgICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbik7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucG9zaXRpb24pOwotICAgICAgKihpbnQgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKGludCltZWRpYVBsYXllckluZm8ucG9zaXRpb247Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uZHVyYXRpb24pOwotICAgICAgKihpbnQgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKGludCltZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1NVUFBPUlRFRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQpOwotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPQotICAgICAgICAgICh1aW50MTZfdCltZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQ7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlKTsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQxNl90KW1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfQ0NJRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uY2NpZCk7Ci0gICAgICAqKHVpbnQzMl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICh1aW50OF90KW1lZGlhUGxheWVySW5mby5jY2lkOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfU0VFS0lOR19TUEVFRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uc2Vla2luZ19zcGVlZCk7Ci0gICAgICAqKHVpbnQ4X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQ4X3QpbWVkaWFQbGF5ZXJJbmZvLnNlZWtpbmdfc3BlZWQ7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9TVEFURV9SRUFEX0RFU0NSSVBUT1I6ewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAodWludDE2X3QpZGV2aWNlLT5tZWRpYV9zdGF0ZV9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPm1lZGlhX3N0YXRlX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfUkVBRF9ERVNDUklQVE9SOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICh1aW50MTZfdClkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFX1NVUFBPUlRFRF9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0KLSAgICAgICAgICh1aW50MTZfdClkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9QTEFZRVJfTkFNRV9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQxNl90KWRldmljZS0+bWVkaWFfcGxheWVyX25hbWVfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9wbGF5ZXJfbmFtZV9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19DSEFOR0VEX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAodWludDE2X3QpZGV2aWNlLT50cmFja19jaGFuZ2VkX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfY2hhbmdlZF9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19USVRMRV9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQxNl90KWRldmljZS0+dHJhY2tfdGl0bGVfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT50cmFja190aXRsZV9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQxNl90KWRldmljZS0+dHJhY2tfcG9zaXRpb25fbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT50cmFja19wb3NpdGlvbl9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQxNl90KWRldmljZS0+dHJhY2tfZHVyYXRpb25fbm90aWZ5OzsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfZHVyYXRpb25fbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQxNl90KWRldmljZS0+cGxheWluZ19vcmRlcl9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPnBsYXlpbmdfb3JkZXJfbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9NRURJQV9TVEFURV9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YgKG1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZSk7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9zdGF0ZV9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9QTEFZRVJfTkFNRV9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWVfbGVuOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfcGxheWVyX25hbWVfaGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5tZWRpYV9jdHJsX3BvaW50OwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX2N0cmxfcG9pbnQpOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfY29udHJvbF9wb2ludF9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1NVUFBPUlRFRF9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YgKG1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZSk7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfaGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfQ0hBTkdFRF9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby50cmFja19jaGFuZ2VkOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZiAobWVkaWFQbGF5ZXJJbmZvLnRyYWNrX2NoYW5nZWQpOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfY2hhbmdlZF9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19USVRMRV9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby50aXRsZTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBtZWRpYVBsYXllckluZm8udHJhY2tfdGl0bGVfbGVuOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfdGl0bGVfaGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5wb3NpdGlvbjsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBvc2l0aW9uKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX3Bvc2l0aW9uX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfVFJBQ0tfRFVSQVRJT05fREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5kdXJhdGlvbik7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19kdXJhdGlvbl9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1BMQVlJTkdfT1JERVJfREVTQ1JJUFRPUl9XUklURSA6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWU7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlKTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ09OR0VTVElPTl9VUERBVEU6IHsKLSAgICAgIE1jcENvbmdlc3Rpb25VcGRhdGUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0NPTk5FQ1RJT05fVVBEQVRFOgotICAgIGNhc2UgTUNQX0FDVElWRV9ERVZJQ0VfVVBEQVRFOgotICAgIGNhc2UgTUNQX1BIWV9VUERBVEU6Ci0gICAgY2FzZSBNQ1BfQ09OTkVDVElPTjoKLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OX0NMT1NFX0VWRU5UOgotICAgIGNhc2UgTUNQX0RJU0NPTk5FQ1RJT046Ci0gICAgY2FzZSBNQ1BfQk9ORF9TVEFURV9DSEFOR0VfRVZFTlQ6Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIGV2ZW50IGlzIG5vdCBpbiBsaXN0IjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotCi1ib29sIE1lZGlhU3RhdGVQbGF5aW5nSGFuZGxlcih1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0sIHVpbnQ4X3Qgc3RhdGUpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaGFuZGxlIGV2ZW50ICIgPDwgZ2V0X21jcF9ldmVudF9uYW1lKGV2ZW50KQotICAgICAgICAgICAgPDwgIiBpbiBzdGF0ZSAiIDw8IGdldF9tY3BfbWVkaWFfc3RhdGVfbmFtZShzdGF0ZSk7Ci0gIG1jcF9yZXNwX3QgKnBfZGF0YSA9IChtY3BfcmVzcF90ICopcGFyYW07Ci0gIFJlbW90ZURldmljZSAqZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgTUNQX05PVElGWV9BTEw6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdGlmeSBhbGwgaGFuZGxlICI8PCBwX2RhdGEtPmhhbmRsZTsKLSAgICAgIHN0ZDo6dmVjdG9yPFJlbW90ZURldmljZT5ub3RpZnlEZXZpY2VzID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZE5vdGlmeURldmljZXMocF9kYXRhLT5oYW5kbGUpOwotICAgICAgc3RkOjp2ZWN0b3I8UmVtb3RlRGV2aWNlPjo6aXRlcmF0b3IgaXQ7Ci0gICAgICBpZiAobm90aWZ5RGV2aWNlcy5zaXplKCkgPD0gMCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBObyBkZXZpY2UgcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiI7Ci0gICAgICB9Ci0gICAgICBmb3IgKGl0ID0gbm90aWZ5RGV2aWNlcy5iZWdpbigpOyBpdCAhPSBub3RpZnlEZXZpY2VzLmVuZCgpOyBpdCsrKXsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTm90aWZ5IGFsbCBoYW5kbGUgZGV2aWNlIGlkICIgPDwgaXQtPmNvbm5faWQ7Ci0gICAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKGl0LT5jb25uX2lkKTsKLSAgICAgICAgaXQtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbaXQtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGl0LT5zdGF0ZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9XUklURTogewotICAgICAgdWludDhfdCBkYXRhID0gKHVpbnQ4X3QpKCpwX2RhdGEtPm9wZXIuV3JpdGVPcC5kYXRhKTsKLSAgICAgIGlmIChtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQgJiBkYXRhKSB7Ci0gICAgICAgIGluc3RhbmNlLT5QbGF5aW5nT3JkZXJDaGFuZ2VSZXEoZGF0YSAmIG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGlnbm9yZSBwbGF5aW5nX29yZGVyX2hhbmRsZSB3cml0ZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gMDsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfV1JJVEU6IHsKLSAgICAgIHVpbnQ4X3QgZGF0YSA9ICh1aW50OF90KSgqcF9kYXRhLT5vcGVyLldyaXRlT3AuZGF0YSk7Ci0gICAgICB1aW50OF90IG9wY29kZV9zdXBwb3J0ID0gaXNfb3Bjb2RlX3N1cHBvcnRlZChkYXRhKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGRhdGEgIiA8PCBkYXRhIDw8ICIgVHggSUQ6ICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlT3AudHJhbnNfaWQ7Ci0gICAgICBpZiAoIW9wY29kZV9zdXBwb3J0KSB7Ci0gICAgICAgIHVpbnQ4X3Qgc3RhdHVzID0gTUNQX09QQ09ERV9OT1RfU1VQUE9SVEVEOwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICAgICAgdmFsdWUucHVzaF9iYWNrKGRhdGEpOwotICAgICAgICB2YWx1ZS5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJobmRsICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGU7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgIiA8PCBkYXRhOwotICAgICAgICBHYXR0c09wc1F1ZXVlOjpTZW5kTm90aWZpY2F0aW9uKGRldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGUsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZGF0YSAhPSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUExBWSkgewotICAgICAgICBpbnN0YW5jZS0+TWVkaWFDb250cm9sUG9pbnRDaGFuZ2VSZXEoKHVpbnQzMl90KWRhdGEsIGRldmljZS0+cGVlcl9iZGEpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIm1lZGlhX2NvbnRyb2xfcG9pbnRfaGFuZGxlIHdyaXRlICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpZ25vcmUgbWVkaWFfY29udHJvbF9wb2ludF9oYW5kbGUgd3JpdGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkL2FscmVhZHkgcGxheWluZyI7Ci0gICAgICB9Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IDA7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHBfZGF0YS0+ZXZlbnQgIjw8IHBfZGF0YS0+ZXZlbnQ7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9XUklURTogewotICAgICAgdWludDMyX3QgdHJhY2tfZHVyYXRpb24gPSBtZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICB1aW50MzJfdCB0cmFja19wb3NpdGlvbiA9IG1lZGlhUGxheWVySW5mby5wb3NpdGlvbjsKLSAgICAgIHVpbnQzMl90IGRhdGE7Ci0gICAgICB1aW50OF90ICp3X2RhdGEgPSBwX2RhdGEtPm9wZXIuV3JpdGVPcC5kYXRhOwotICAgICAgU1RSRUFNX1RPX1VJTlQzMihkYXRhLCB3X2RhdGEpOwotICAgICAgdWludDMyX3QgcG9zaXRpb24gPSB0cmFja19kdXJhdGlvbjsKLSAgICAgIGlmICgodHJhY2tfcG9zaXRpb24gPT0gKHVpbnQzMl90KWRhdGEpIHx8IChkYXRhIDwgMCkgfHwKLSAgICAgICAgICAodHJhY2tfZHVyYXRpb24gPT0gMHhGRkZGKSB8fCAodHJhY2tfZHVyYXRpb24gPiAwICYmIHRyYWNrX2R1cmF0aW9uIDwgZGF0YSkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaWdub3JlIHRyYWNrX3Bvc2l0aW9uX2hhbmRsZSB3cml0ZSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwb3NpdGlvbiA9IGRhdGE7Ci0gICAgICAgIGluc3RhbmNlLT5UcmFja1Bvc2l0aW9uQ2hhbmdlUmVxKGRhdGEpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja19wb3NpdGlvbl9oYW5kbGUgd3JpdGUiOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2socG9zaXRpb24gJiAweGZmKTsKLSAgICAgIHZhbHVlLnB1c2hfYmFjaygocG9zaXRpb24gPj4gOCkgICYgMHhmZik7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soKHBvc2l0aW9uID4+IDE2KSAmIDB4ZmYpOwotICAgICAgdmFsdWUucHVzaF9iYWNrKChwb3NpdGlvbiA+PiAyNCkgJiAweGZmKTsKLSAgICAgIEdhdHRzT3BzUXVldWU6OlNlbmROb3RpZmljYXRpb24oZGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZSwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgICoodWludDhfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAgKih1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX1JFQUQ6IHsKLSAgICAgIHVpbnQxNl90IGxlbiA9IG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZV9sZW47Ci0gICAgICBpZiAoZGV2aWNlLT5tdHUgIT0gLTEgJiYgbGVuID49IGRldmljZS0+bXR1IC0gMykgLy90byBjaGVjayBwbGF5ZXIgbGVuIHNob3VsZCBub3QgZ3JlYXRlciB0aGFuIG10dQotICAgICAgICBsZW4gPSBkZXZpY2UtPm10dSAtIDM7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IGxlbjsKLSAgICAgIG1lbWNweShwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlLCBtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWUsCi0gICAgICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVfU1VQUE9SVEVEX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZSk7Ci0gICAgICAqKHVpbnQzMl90KilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0KLSAgICAgICoodWludDMyX3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfVElUTEVfUkVBRDogewotICAgICAgdWludDE2X3QgbGVuID0gbWVkaWFQbGF5ZXJJbmZvLnRyYWNrX3RpdGxlX2xlbjsKLSAgICAgIGlmIChkZXZpY2UtPm10dSAhPSAtMSAmJiBsZW4gPj0gZGV2aWNlLT5tdHUgLSAzKSAvL3RvIGNoZWNrIHRpdGxlIGxlbiBzaG91bGQgbm90IGdyZWF0ZXIgdGhhbiBtdHUKLSAgICAgICAgbGVuID0gZGV2aWNlLT5tdHUgLSAzOwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBsZW47Ci0gICAgICBtZW1jcHkocF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSwgbWVkaWFQbGF5ZXJJbmZvLnRpdGxlLAotICAgICAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuKTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wb3NpdGlvbik7Ci0gICAgICAqKGludCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKGludCAqKSZtZWRpYVBsYXllckluZm8ucG9zaXRpb247Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uZHVyYXRpb24pOwotICAgICAgKihpbnQgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKihpbnQgKikmbWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1NVUFBPUlRFRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQpOwotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPQotICAgICAgICAgICoodWludDE2X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlKTsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ0NJRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uY2NpZCk7Ci0gICAgICAqKHVpbnQzMl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8uY2NpZDsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfU0VFS0lOR19TUEVFRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uc2Vla2luZ19zcGVlZCk7Ci0gICAgICAqKHVpbnQ4X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKHVpbnQ4X3QpbWVkaWFQbGF5ZXJJbmZvLnNlZWtpbmdfc3BlZWQ7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX01FRElBX1NUQVRFX1JFQURfREVTQ1JJUFRPUjp7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT5tZWRpYV9zdGF0ZV9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPm1lZGlhX3N0YXRlX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9SRUFEX0RFU0NSSVBUT1I6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVfU1VQUE9SVEVEX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPQotICAgICAgICAgKih1aW50MTZfdCAqKSZkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+bWVkaWFfcGxheWVyX25hbWVfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9wbGF5ZXJfbmFtZV9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX0NIQU5HRURfREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT50cmFja19jaGFuZ2VkX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfY2hhbmdlZF9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX1RJVExFX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+dHJhY2tfdGl0bGVfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT50cmFja190aXRsZV9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+dHJhY2tfcG9zaXRpb25fbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT50cmFja19wb3NpdGlvbl9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX0RVUkFUSU9OX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+dHJhY2tfZHVyYXRpb25fbm90aWZ5OzsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfZHVyYXRpb25fbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+cGxheWluZ19vcmRlcl9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPnBsYXlpbmdfb3JkZXJfbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxpbmcgZGV2aWNlIHN0YXRlIiA8PCBkZXZpY2UtPnN0YXRlOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX01FRElBX1NUQVRFX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3N0YXRlX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBsYXllcl9uYW1lOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZV9sZW47Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9wbGF5ZXJfbmFtZV9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX2N0cmxfcG9pbnQ7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mIChtZWRpYVBsYXllckluZm8ubWVkaWFfY3RybF9wb2ludCk7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfU1VQUE9SVEVEX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19DSEFOR0VEX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnRyYWNrX2NoYW5nZWQ7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mIChtZWRpYVBsYXllckluZm8udHJhY2tfY2hhbmdlZCk7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX1RJVExFX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnRpdGxlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IG1lZGlhUGxheWVySW5mby50cmFja190aXRsZV9sZW47Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBvc2l0aW9uOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucG9zaXRpb24pOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfcG9zaXRpb25faGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5kdXJhdGlvbjsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX2R1cmF0aW9uX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9ERVNDUklQVE9SX1dSSVRFIDogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWUpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9DT05HRVNUSU9OX1VQREFURTogewotICAgICAgTWNwQ29uZ2VzdGlvblVwZGF0ZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ09OTkVDVElPTl9VUERBVEU6Ci0gICAgY2FzZSBNQ1BfQUNUSVZFX0RFVklDRV9VUERBVEU6Ci0gICAgY2FzZSBNQ1BfUEhZX1VQREFURToKLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OOgotICAgIGNhc2UgTUNQX0RJU0NPTk5FQ1RJT046Ci0gICAgY2FzZSBNQ1BfQ09OTkVDVElPTl9DTE9TRV9FVkVOVDoKLSAgICBjYXNlIE1DUF9CT05EX1NUQVRFX0NIQU5HRV9FVkVOVDoKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYm9vbCBNZWRpYVN0YXRlU2Vla2luZ0hhbmRsZXIodWludDMyX3QgZXZlbnQsIHZvaWQqIHBhcmFtLCB1aW50OF90IHN0YXRlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGhhbmRsZSBldmVudCAiIDw8IGdldF9tY3BfZXZlbnRfbmFtZShldmVudCkKLSAgICAgICAgICAgIDw8ICIgaW4gc3RhdGUgIiA8PCBnZXRfbWNwX21lZGlhX3N0YXRlX25hbWUoc3RhdGUpOwotICBtY3BfcmVzcF90ICpwX2RhdGEgPSAobWNwX3Jlc3BfdCAqKXBhcmFtOwotICBSZW1vdGVEZXZpY2UgKmRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICBzd2l0Y2goZXZlbnQpIHsKLSAgICBjYXNlIE1DUF9OT1RJRllfQUxMOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBOb3RpZnkgYWxsIGhhbmRsZSAiPDwgcF9kYXRhLT5oYW5kbGU7Ci0gICAgICBzdGQ6OnZlY3RvcjxSZW1vdGVEZXZpY2U+bm90aWZ5RGV2aWNlcyA9Ci0gICAgICAgICAgaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZE5vdGlmeURldmljZXMocF9kYXRhLT5oYW5kbGUpOwotICAgICAgaWYgKG5vdGlmeURldmljZXMuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTm8gZGV2aWNlIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHN0ZDo6dmVjdG9yPFJlbW90ZURldmljZT46Oml0ZXJhdG9yIGl0OwotICAgICAgZm9yIChpdCA9IG5vdGlmeURldmljZXMuYmVnaW4oKTsgaXQgIT0gbm90aWZ5RGV2aWNlcy5lbmQoKTsgaXQrKyl7Ci0gICAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEJ5Q29ubklkKGl0LT5jb25uX2lkKTsKLSAgICAgICAgaXQtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbaXQtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGl0LT5zdGF0ZSk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdGlmeSBhbGwgaGFuZGxlIGRldmljZSBpZCAiIDw8IGl0LT5jb25uX2lkOwotICAgICAgfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1dSSVRFOiB7Ci0gICAgICB1aW50OF90IGRhdGEgPSAodWludDhfdCkoKnBfZGF0YS0+b3Blci5Xcml0ZU9wLmRhdGEpOwotICAgICAgaWYgKG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3N1cHBvcnRlZCAmIGRhdGEpIHsKLSAgICAgICAgaW5zdGFuY2UtPlBsYXlpbmdPcmRlckNoYW5nZVJlcShkYXRhICYgbWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaWdub3JlIHBsYXlpbmdfb3JkZXJfaGFuZGxlIHdyaXRlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSAwOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX1dSSVRFOiB7Ci0gICAgICB1aW50OF90IGRhdGEgPSAodWludDhfdCkoKnBfZGF0YS0+b3Blci5Xcml0ZU9wLmRhdGEpOwotICAgICAgdWludDhfdCBvcGNvZGVfc3VwcG9ydCA9IGlzX29wY29kZV9zdXBwb3J0ZWQoZGF0YSk7Ci0gICAgICBpZiAoIW9wY29kZV9zdXBwb3J0KSB7Ci0gICAgICAgIHVpbnQ4X3Qgc3RhdHVzID0gTUNQX09QQ09ERV9OT1RfU1VQUE9SVEVEOwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgICAgICAgdmFsdWUucHVzaF9iYWNrKGRhdGEpOwotICAgICAgICB2YWx1ZS5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJobmRsICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGU7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgIiA8PCBkYXRhOwotICAgICAgICBHYXR0c09wc1F1ZXVlOjpTZW5kTm90aWZpY2F0aW9uKGRldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLldyaXRlT3AuY2hhcl9oYW5kbGUsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKGRhdGEgPT0gTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX1BBVVNFKSB8fAotICAgICAgICAgIChkYXRhID09IE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9QTEFZKSkgJiYKLSAgICAgICAgICAoaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZEFjdGl2ZURldmljZShwX2RhdGEtPnJlbW90ZURldmljZSkpID09IGZhbHNlKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIG1lZGlhIGNvbnRyb2wgcG9pbnQgd3JpdGUgcmVjZWl2ZWQgZnJvbSBpbmFjdGl2ZSBkZXZpY2UiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoZGF0YSAhPSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfRkFTVF9GT1JXQVJEKSAmJiAoZGF0YSAhPSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfRkFTVF9SRVdJTkQpCi0gICAgICAgICAgJiYgKGRhdGEgIT0gTUNQX01FRElBX0NPTlRST0xfT1BDT0RFX01PVkVfUkVMQVRJVkUpKSB7Ci0gICAgICAgIGluc3RhbmNlLT5NZWRpYUNvbnRyb2xQb2ludENoYW5nZVJlcShkYXRhLCBkZXZpY2UtPnBlZXJfYmRhKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJtZWRpYV9jb250cm9sX3BvaW50X2hhbmRsZSB3cml0ZSAiOwotICAgICAgfQotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSAwOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9XUklURTogewotICAgICAgdWludDMyX3QgdHJhY2tfZHVyYXRpb24gPSBtZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICB1aW50MzJfdCB0cmFja19wb3NpdGlvbiA9IG1lZGlhUGxheWVySW5mby5wb3NpdGlvbjsKLSAgICAgIHVpbnQzMl90IGRhdGE7Ci0gICAgICB1aW50OF90ICp3X2RhdGEgPSBwX2RhdGEtPm9wZXIuV3JpdGVPcC5kYXRhOwotICAgICAgdWludDMyX3QgcG9zaXRpb24gPSB0cmFja19kdXJhdGlvbjsKLSAgICAgIFNUUkVBTV9UT19VSU5UMzIoZGF0YSwgd19kYXRhKTsKLSAgICAgIGlmICgodHJhY2tfcG9zaXRpb24gPT0gKHVpbnQzMl90KWRhdGEpIHx8IChkYXRhIDwgMCkgfHwKLSAgICAgICAgICAodHJhY2tfZHVyYXRpb24gPT0gMHhGRkZGKSB8fCAodHJhY2tfZHVyYXRpb24gPiAwICYmIHRyYWNrX2R1cmF0aW9uIDwgZGF0YSkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaWdub3JlIHRyYWNrX3Bvc2l0aW9uX2hhbmRsZSB3cml0ZSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwb3NpdGlvbiA9IGRhdGE7Ci0gICAgICAgIGluc3RhbmNlLT5UcmFja1Bvc2l0aW9uQ2hhbmdlUmVxKGRhdGEpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja19wb3NpdGlvbl9oYW5kbGUgd3JpdGUiOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2socG9zaXRpb24gJiAweGZmKTsKLSAgICAgIHZhbHVlLnB1c2hfYmFjaygocG9zaXRpb24gPj4gOCkgICYgMHhmZik7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soKHBvc2l0aW9uID4+IDE2KSAmIDB4ZmYpOwotICAgICAgdmFsdWUucHVzaF9iYWNrKChwb3NpdGlvbiA+PiAyNCkgJiAweGZmKTsKLSAgICAgIEdhdHRzT3BzUXVldWU6OlNlbmROb3RpZmljYXRpb24oZGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZSwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgICoodWludDhfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAgKih1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX1JFQUQ6IHsKLSAgICAgIHVpbnQxNl90IGxlbiA9IG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZV9sZW47Ci0gICAgICBpZiAoZGV2aWNlLT5tdHUgIT0gLTEgJiYgbGVuID49IGRldmljZS0+bXR1IC0gMykgLy90byBjaGVjayBwbGF5ZXIgbGVuIHNob3VsZCBub3QgZ3JlYXRlciB0aGFuIG10dQotICAgICAgICBsZW4gPSBkZXZpY2UtPm10dSAtIDM7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IGxlbjsKLSAgICAgIG1lbWNweShwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlLCBtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWUsCi0gICAgICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9PUENPREVfU1VQUE9SVEVEX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5tZWRpYV9zdXBwb3J0ZWRfZmVhdHVyZSk7Ci0gICAgICAqKHVpbnQzMl90KilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0KLSAgICAgICoodWludDMyX3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfVElUTEVfUkVBRDogewotICAgICAgdWludDE2X3QgbGVuID0gbWVkaWFQbGF5ZXJJbmZvLnRyYWNrX3RpdGxlX2xlbjsKLSAgICAgIGlmIChkZXZpY2UtPm10dSAhPSAtMSAmJiBsZW4gPj0gZGV2aWNlLT5tdHUgLSAzKSAvL3RvIGNoZWNrIHRpdGxlIGxlbiBzaG91bGQgbm90IGdyZWF0ZXIgdGhhbiBtdHUKLSAgICAgICAgbGVuID0gZGV2aWNlLT5tdHUgLSAzOwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBsZW47Ci0gICAgICBtZW1jcHkocF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSwgbWVkaWFQbGF5ZXJJbmZvLnRpdGxlLAotICAgICAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuKTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wb3NpdGlvbik7Ci0gICAgICAqKGludCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKGludCAqKSZtZWRpYVBsYXllckluZm8ucG9zaXRpb247Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uZHVyYXRpb24pOwotICAgICAgKihpbnQgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKihpbnQgKikmbWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9TVVBQT1JURURfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkKTsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0KLSAgICAgICAgICAqKHVpbnQxNl90ICopJm1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3N1cHBvcnRlZDsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1BMQVlJTkdfT1JERVJfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWUpOwotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJm1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfQ0NJRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uY2NpZCk7Ci0gICAgICAqKHVpbnQzMl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8uY2NpZDsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1NFRUtJTkdfU1BFRURfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnNlZWtpbmdfc3BlZWQpOwotICAgICAgKih1aW50OF90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICh1aW50OF90KW1lZGlhUGxheWVySW5mby5zZWVraW5nX3NwZWVkOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfUkVBRF9ERVNDUklQVE9SOnsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZkZXZpY2UtPm1lZGlhX3N0YXRlX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+bWVkaWFfc3RhdGVfbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9SRUFEX0RFU0NSSVBUT1I6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZkZXZpY2UtPm1lZGlhX2NvbnRyb2xfcG9pbnRfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfT1BDT0RFX1NVUFBPUlRFRF9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0KLSAgICAgICAgICoodWludDE2X3QgKikmZGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X29wY29kZV9zdXBwb3J0ZWRfbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfUExBWUVSX05BTUVfREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT5tZWRpYV9wbGF5ZXJfbmFtZV9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPm1lZGlhX3BsYXllcl9uYW1lX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX0NIQU5HRURfREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT50cmFja19jaGFuZ2VkX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfY2hhbmdlZF9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19USVRMRV9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZkZXZpY2UtPnRyYWNrX3RpdGxlX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfdGl0bGVfbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfUE9TSVRJT05fREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT50cmFja19wb3NpdGlvbl9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPnRyYWNrX3Bvc2l0aW9uX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX0RVUkFUSU9OX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+dHJhY2tfZHVyYXRpb25fbm90aWZ5OzsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+dHJhY2tfZHVyYXRpb25fbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZkZXZpY2UtPnBsYXlpbmdfb3JkZXJfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5wbGF5aW5nX29yZGVyX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ubWVkaWFfc3RhdGU7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3RhdGUpOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfc3RhdGVfaGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfUExBWUVSX05BTUVfREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ucGxheWVyX25hbWU7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gbWVkaWFQbGF5ZXJJbmZvLnBsYXllcl9uYW1lX2xlbjsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3BsYXllcl9uYW1lX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ubWVkaWFfY3RybF9wb2ludDsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YgKG1lZGlhUGxheWVySW5mby5tZWRpYV9jdHJsX3BvaW50KTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfaGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfQ09OVFJPTF9QT0lOVF9TVVBQT1JURURfREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmU7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mIChtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmUpOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8ubWVkaWFfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX0NIQU5HRURfREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8udHJhY2tfY2hhbmdlZDsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YgKG1lZGlhUGxheWVySW5mby50cmFja19jaGFuZ2VkKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX2NoYW5nZWRfaGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfVElUTEVfREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8udGl0bGU7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gbWVkaWFQbGF5ZXJJbmZvLnRyYWNrX3RpdGxlX2xlbjsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX3RpdGxlX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfVFJBQ0tfUE9TSVRJT05fREVTQ1JJUFRPUl9XUklURTogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ucG9zaXRpb247Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wb3NpdGlvbik7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19wb3NpdGlvbl9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX0RVUkFUSU9OX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8uZHVyYXRpb24pOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfZHVyYXRpb25faGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX0RFU0NSSVBUT1JfV1JJVEUgOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0NPTkdFU1RJT05fVVBEQVRFOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlIE1DUF9DT05HRVNUSU9OX1VQREFURSB1cGRhdGU6ICIgPDwgZXZlbnQ7Ci0gICAgICBNY3BDb25nZXN0aW9uVXBkYXRlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OX1VQREFURToKLSAgICBjYXNlIE1DUF9BQ1RJVkVfREVWSUNFX1VQREFURToKLSAgICBjYXNlIE1DUF9QSFlfVVBEQVRFOgotICAgIGNhc2UgTUNQX0NPTk5FQ1RJT046Ci0gICAgY2FzZSBNQ1BfRElTQ09OTkVDVElPTjoKLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OX0NMT1NFX0VWRU5UOgotICAgIGNhc2UgTUNQX0JPTkRfU1RBVEVfQ0hBTkdFX0VWRU5UOgotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1ib29sIE1lZGlhU3RhdGVQYXVzZUhhbmRsZXIodWludDMyX3QgZXZlbnQsIHZvaWQqIHBhcmFtLCB1aW50OF90IHN0YXRlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGhhbmRsZSBldmVudCAiIDw8IGdldF9tY3BfZXZlbnRfbmFtZShldmVudCkKLSAgICAgICAgICAgIDw8ICIgaW4gc3RhdGUgIiA8PCBnZXRfbWNwX21lZGlhX3N0YXRlX25hbWUoc3RhdGUpOwotCi0gIG1jcF9yZXNwX3QgKnBfZGF0YSA9IChtY3BfcmVzcF90ICopcGFyYW07Ci0gIFJlbW90ZURldmljZSAqZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgTUNQX05PVElGWV9BTEw6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIE5vdGlmeSBhbGwgaGFuZGxlICI8PCBwX2RhdGEtPmhhbmRsZTsKLSAgICAgIHN0ZDo6dmVjdG9yPFJlbW90ZURldmljZT5ub3RpZnlEZXZpY2VzID0gaW5zdGFuY2UtPnJlbW90ZURldmljZXMuRmluZE5vdGlmeURldmljZXMocF9kYXRhLT5oYW5kbGUpOwotICAgICAgc3RkOjp2ZWN0b3I8UmVtb3RlRGV2aWNlPjo6aXRlcmF0b3IgaXQ7Ci0gICAgICBpZiAobm90aWZ5RGV2aWNlcy5zaXplKCkgPD0gMCkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBObyBkZXZpY2UgcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiI7Ci0gICAgICB9Ci0gICAgICBmb3IgKGl0ID0gbm90aWZ5RGV2aWNlcy5iZWdpbigpOyBpdCAhPSBub3RpZnlEZXZpY2VzLmVuZCgpOyBpdCsrKXsKLSAgICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UgPSBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5GaW5kQnlDb25uSWQoaXQtPmNvbm5faWQpOwotICAgICAgICBpdC0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltpdC0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgaXQtPnN0YXRlKTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgTm90aWZ5IGFsbCBoYW5kbGUgZGV2aWNlIGlkICIgPDwgaXQtPmNvbm5faWQ7Ci0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1BMQVlJTkdfT1JERVJfV1JJVEU6IHsKLSAgICAgIHVpbnQ4X3QgZGF0YSA9ICh1aW50OF90KSgqcF9kYXRhLT5vcGVyLldyaXRlT3AuZGF0YSk7Ci0gICAgICBpZiAobWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfc3VwcG9ydGVkICYgZGF0YSkgewotICAgICAgICBpbnN0YW5jZS0+UGxheWluZ09yZGVyQ2hhbmdlUmVxKGRhdGEgJiBtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpZ25vcmUgcGxheWluZ19vcmRlcl9oYW5kbGUgd3JpdGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IDA7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfV1JJVEU6IHsKLSAgICAgIHVpbnQ4X3QgZGF0YSA9ICh1aW50OF90KSgqcF9kYXRhLT5vcGVyLldyaXRlT3AuZGF0YSk7Ci0gICAgICB1aW50OF90IG9wY29kZV9zdXBwb3J0ID0gaXNfb3Bjb2RlX3N1cHBvcnRlZChkYXRhKTsKLSAgICAgIGlmICghb3Bjb2RlX3N1cHBvcnQpIHsKLSAgICAgICAgdWludDhfdCBzdGF0dXMgPSBNQ1BfT1BDT0RFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgICAgICB2YWx1ZS5wdXNoX2JhY2soZGF0YSk7Ci0gICAgICAgIHZhbHVlLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImhuZGwgIiA8PCBwX2RhdGEtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZTsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJvcGNvZGUgbm90IHN1cHBvcnRlZCAiIDw8IGRhdGE7Ci0gICAgICAgIEdhdHRzT3BzUXVldWU6OlNlbmROb3RpZmljYXRpb24oZGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZSwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKChkYXRhICE9IE1DUF9NRURJQV9DT05UUk9MX09QQ09ERV9QTEFZKSAmJgotICAgICAgICAgKGluc3RhbmNlLT5yZW1vdGVEZXZpY2VzLkZpbmRBY3RpdmVEZXZpY2UocF9kYXRhLT5yZW1vdGVEZXZpY2UpID09IGZhbHNlKQotICAgICAgICAgJiYgaXNfcHRzX3J1bm5pbmcoKSA9PSBmYWxzZSkgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBtZWRpYSBjb250cm9sIHBvaW50IHdyaXRlIHJlY2VpdmVkIGZyb20gaW5hY3RpdmUgZGV2aWNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoZGF0YSAhPSBNQ1BfTUVESUFfQ09OVFJPTF9PUENPREVfUEFVU0UpIHsKLSAgICAgICAgLy88VEJEPiBNQ1BfTUVESUFfQ09OVFJPTF9TVE9QIG5lZWQgdG8gY2hlY2sgZm9yIHN0b3AKLSAgICAgICAgaW5zdGFuY2UtPk1lZGlhQ29udHJvbFBvaW50Q2hhbmdlUmVxKGRhdGEsIGRldmljZS0+cGVlcl9iZGEpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIm1lZGlhX2NvbnRyb2xfcG9pbnRfaGFuZGxlIHdyaXRlICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpZ25vcmUgbWVkaWFfY29udHJvbF9wb2ludF9oYW5kbGUgd3JpdGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIC8gYWxyZWFkeSBwYXVzZWQiOwotICAgICAgfQotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSAwOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19QT1NJVElPTl9XUklURTogewotICAgICAgdWludDMyX3QgdHJhY2tfZHVyYXRpb24gPSBtZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICB1aW50MzJfdCB0cmFja19wb3NpdGlvbiA9IG1lZGlhUGxheWVySW5mby5wb3NpdGlvbjsKLSAgICAgIHVpbnQzMl90IGRhdGE7Ci0gICAgICB1aW50OF90ICp3X2RhdGEgPSBwX2RhdGEtPm9wZXIuV3JpdGVPcC5kYXRhOwotICAgICAgU1RSRUFNX1RPX1VJTlQzMihkYXRhLCB3X2RhdGEpOwotICAgICAgdWludDMyX3QgcG9zaXRpb24gPSB0cmFja19kdXJhdGlvbjsKLSAgICAgIGlmICgodHJhY2tfcG9zaXRpb24gPT0gKHVpbnQzMl90KWRhdGEpIHx8IChkYXRhIDwgMCkgfHwKLSAgICAgICAgICAodHJhY2tfZHVyYXRpb24gPT0gMHhGRkZGKSB8fCAodHJhY2tfZHVyYXRpb24gPiAwICYmIHRyYWNrX2R1cmF0aW9uIDwgZGF0YSkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaWdub3JlIHRyYWNrX3Bvc2l0aW9uX2hhbmRsZSB3cml0ZSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwb3NpdGlvbiA9IGRhdGE7Ci0gICAgICAgIGluc3RhbmNlLT5UcmFja1Bvc2l0aW9uQ2hhbmdlUmVxKGRhdGEpOwotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiB0cmFja19wb3NpdGlvbl9oYW5kbGUgd3JpdGUiOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2socG9zaXRpb24gJiAweGZmKTsKLSAgICAgIHZhbHVlLnB1c2hfYmFjaygocG9zaXRpb24gPj4gOCkgICYgMHhmZik7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2soKHBvc2l0aW9uID4+IDE2KSAmIDB4ZmYpOwotICAgICAgdmFsdWUucHVzaF9iYWNrKChwb3NpdGlvbiA+PiAyNCkgJiAweGZmKTsKLSAgICAgIEdhdHRzT3BzUXVldWU6OlNlbmROb3RpZmljYXRpb24oZGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuV3JpdGVPcC5jaGFyX2hhbmRsZSwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfTUVESUFfU1RBVEVfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgICoodWludDhfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAgKih1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5tZWRpYV9zdGF0ZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX1JFQUQ6IHsKLSAgICAgIHVpbnQxNl90IGxlbiA9IG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZV9sZW47Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBiZWZvcmUgcGxheWVyIG5hbWUgbGVuOiAiIDw8IGxlbjsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGJlZm9yZSBwbGF5ZXIgbmFtZSBtdHU6ICIgPDwgZGV2aWNlLT5tdHU7Ci0gICAgICBpZiAoZGV2aWNlLT5tdHUgIT0gLTEgJiYgbGVuID49IGRldmljZS0+bXR1IC0gMykgLy90byBjaGVjayBwbGF5ZXIgbGVuIHNob3VsZCBub3QgZ3JlYXRlciB0aGFuIG10dQotICAgICAgICBsZW4gPSBkZXZpY2UtPm10dSAtIDM7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IGxlbjsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHBsYXllciBuYW1lIGxlbjogIiA8PCBsZW47Ci0gICAgICBtZW1jcHkocF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSwgbWVkaWFQbGF5ZXJJbmZvLnBsYXllcl9uYW1lLAotICAgICAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuKTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjYWxsaW5nIHBsYXllciBuYW1lIHJlYWQiOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX09QQ09ERV9TVVBQT1JURURfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlKTsKLSAgICAgICoodWludDMyX3QqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPQotICAgICAgKih1aW50MzJfdCAqKSZtZWRpYVBsYXllckluZm8ubWVkaWFfc3VwcG9ydGVkX2ZlYXR1cmU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19USVRMRV9SRUFEOiB7Ci0gICAgICB1aW50MTZfdCBsZW4gPSBtZWRpYVBsYXllckluZm8udHJhY2tfdGl0bGVfbGVuOwotICAgICAgaWYgKGRldmljZS0+bXR1ICE9IC0xICYmIGxlbiA+PSBkZXZpY2UtPm10dSAtIDMpIC8vdG8gY2hlY2sgdGl0bGUgbGVuIHNob3VsZCBub3QgZ3JlYXRlciB0aGFuIG10dQotICAgICAgICBsZW4gPSBkZXZpY2UtPm10dSAtIDM7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IGxlbjsKLSAgICAgIG1lbWNweShwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlLCBtZWRpYVBsYXllckluZm8udGl0bGUsCi0gICAgICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4pOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfUE9TSVRJT05fUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBvc2l0aW9uKTsKLSAgICAgICooaW50ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICooaW50ICopJm1lZGlhUGxheWVySW5mby5wb3NpdGlvbjsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX0RVUkFUSU9OX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5kdXJhdGlvbik7Ci0gICAgICAqKGludCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKGludCAqKSZtZWRpYVBsYXllckluZm8uZHVyYXRpb247Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1NVUFBPUlRFRF9SRUFEOiB7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQpOwotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPQotICAgICAgICAgICoodWludDE2X3QqKSZtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl9zdXBwb3J0ZWQ7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9QTEFZSU5HX09SREVSX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5wbGF5aW5nX29yZGVyX3ZhbHVlKTsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX0NDSURfUkVBRDogewotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLmNjaWQpOwotICAgICAgKih1aW50MzJfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLmNjaWQ7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9TRUVLSU5HX1NQRUVEX1JFQUQ6IHsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKG1lZGlhUGxheWVySW5mby5zZWVraW5nX3NwZWVkKTsKLSAgICAgICoodWludDhfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAodWludDhfdCltZWRpYVBsYXllckluZm8uc2Vla2luZ19zcGVlZDsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1NUQVRFX1JFQURfREVTQ1JJUFRPUjp7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT5tZWRpYV9zdGF0ZV9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPm1lZGlhX3N0YXRlX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfUkVBRF9ERVNDUklQVE9SOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+bWVkaWFfY29udHJvbF9wb2ludF9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX09QQ09ERV9TVVBQT1JURURfREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9Ci0gICAgICAgICAqKHVpbnQxNl90ICopJmRldmljZS0+bWVkaWFfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+bWVkaWFfY29udHJvbF9wb2ludF9vcGNvZGVfc3VwcG9ydGVkX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+bWVkaWFfcGxheWVyX25hbWVfbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT5tZWRpYV9wbGF5ZXJfbmFtZV9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19DSEFOR0VEX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+dHJhY2tfY2hhbmdlZF9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPnRyYWNrX2NoYW5nZWRfbm90aWZ5KTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfVFJBQ0tfVElUTEVfREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT50cmFja190aXRsZV9ub3RpZnk7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPnRyYWNrX3RpdGxlX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfUkVBRDogewotICAgICAgKih1aW50MTZfdCAqKXBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUudmFsdWUgPSAqKHVpbnQxNl90ICopJmRldmljZS0+dHJhY2tfcG9zaXRpb25fbm90aWZ5OwotICAgICAgcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5sZW4gPSBzaXplb2YoZGV2aWNlLT50cmFja19wb3NpdGlvbl9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1JFQUQ6IHsKLSAgICAgICoodWludDE2X3QgKilwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLnZhbHVlID0gKih1aW50MTZfdCAqKSZkZXZpY2UtPnRyYWNrX2R1cmF0aW9uX25vdGlmeTs7Ci0gICAgICBwX2RhdGEtPnJzcF92YWx1ZS5hdHRyX3ZhbHVlLmxlbiA9IHNpemVvZihkZXZpY2UtPnRyYWNrX2R1cmF0aW9uX25vdGlmeSk7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfUkVBRF9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1BMQVlJTkdfT1JERVJfREVTQ1JJUFRPUl9SRUFEOiB7Ci0gICAgICAqKHVpbnQxNl90ICopcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS52YWx1ZSA9ICoodWludDE2X3QgKikmZGV2aWNlLT5wbGF5aW5nX29yZGVyX25vdGlmeTsKLSAgICAgIHBfZGF0YS0+cnNwX3ZhbHVlLmF0dHJfdmFsdWUubGVuID0gc2l6ZW9mKGRldmljZS0+cGxheWluZ19vcmRlcl9ub3RpZnkpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1JFQURfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX01FRElBX1NUQVRFX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N0YXRlKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX3N0YXRlX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX1BMQVlFUl9OQU1FX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBsYXllcl9uYW1lOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IG1lZGlhUGxheWVySW5mby5wbGF5ZXJfbmFtZV9sZW47Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9wbGF5ZXJfbmFtZV9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9NRURJQV9DT05UUk9MX1BPSU5UX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX2N0cmxfcG9pbnQ7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mIChtZWRpYVBsYXllckluZm8ubWVkaWFfY3RybF9wb2ludCk7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby5tZWRpYV9jb250cm9sX3BvaW50X2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX01FRElBX0NPTlRST0xfUE9JTlRfU1VQUE9SVEVEX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZiAobWVkaWFQbGF5ZXJJbmZvLm1lZGlhX3N1cHBvcnRlZF9mZWF0dXJlKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLm1lZGlhX2NvbnRyb2xfcG9pbnRfb3Bjb2RlX3N1cHBvcnRlZF9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DUF9UUkFDS19DSEFOR0VEX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnRyYWNrX2NoYW5nZWQ7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubGVuID0gc2l6ZW9mIChtZWRpYVBsYXllckluZm8udHJhY2tfY2hhbmdlZCk7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja19jaGFuZ2VkX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTUNQX1RSQUNLX1RJVExFX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnRpdGxlOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IG1lZGlhUGxheWVySW5mby50cmFja190aXRsZV9sZW47Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuY2hhcl9oYW5kbGUgPSBtY3NTZXJ2ZXJTZXJ2aWNlSW5mby50cmFja190aXRsZV9oYW5kbGU7Ci0gICAgICBwX2RhdGEtPmV2ZW50ID0gTUNQX0RFU0NSSVBUT1JfV1JJVEVfUlNQOwotICAgICAgZGV2aWNlID0gcF9kYXRhLT5yZW1vdGVEZXZpY2U7Ci0gICAgICBkZXZpY2UtPkRldmljZVN0YXRlSGFuZGxlclBvaW50ZXJbZGV2aWNlLT5zdGF0ZV0ocF9kYXRhLT5ldmVudCwgcF9kYXRhLCBkZXZpY2UtPnN0YXRlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1RSQUNLX1BPU0lUSU9OX0RFU0NSSVBUT1JfV1JJVEU6IHsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5kYXRhID0gKHVpbnQ4X3QgKikmbWVkaWFQbGF5ZXJJbmZvLnBvc2l0aW9uOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmxlbiA9IHNpemVvZihtZWRpYVBsYXllckluZm8ucG9zaXRpb24pOwotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmNoYXJfaGFuZGxlID0gbWNzU2VydmVyU2VydmljZUluZm8udHJhY2tfcG9zaXRpb25faGFuZGxlOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9UUkFDS19EVVJBVElPTl9ERVNDUklQVE9SX1dSSVRFOiB7Ci0gICAgICBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AuZGF0YSA9ICh1aW50OF90ICopJm1lZGlhUGxheWVySW5mby5kdXJhdGlvbjsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLmR1cmF0aW9uKTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5jaGFyX2hhbmRsZSA9IG1jc1NlcnZlclNlcnZpY2VJbmZvLnRyYWNrX2R1cmF0aW9uX2hhbmRsZTsKLSAgICAgIHBfZGF0YS0+ZXZlbnQgPSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A7Ci0gICAgICBkZXZpY2UgPSBwX2RhdGEtPnJlbW90ZURldmljZTsKLSAgICAgIGRldmljZS0+RGV2aWNlU3RhdGVIYW5kbGVyUG9pbnRlcltkZXZpY2UtPnN0YXRlXShwX2RhdGEtPmV2ZW50LCBwX2RhdGEsIGRldmljZS0+c3RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfUExBWUlOR19PUkRFUl9ERVNDUklQVE9SX1dSSVRFIDogewotICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLmRhdGEgPSAodWludDhfdCAqKSZtZWRpYVBsYXllckluZm8ucGxheWluZ19vcmRlcl92YWx1ZTsKLSAgICAgIHBfZGF0YS0+b3Blci5Xcml0ZURlc2NPcC5sZW4gPSBzaXplb2YobWVkaWFQbGF5ZXJJbmZvLnBsYXlpbmdfb3JkZXJfdmFsdWUpOwotICAgICAgcF9kYXRhLT5ldmVudCA9IE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDsKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9DT05HRVNUSU9OX1VQREFURTogewotICAgICAgTWNwQ29uZ2VzdGlvblVwZGF0ZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ09OTkVDVElPTl9VUERBVEU6Ci0gICAgY2FzZSBNQ1BfQUNUSVZFX0RFVklDRV9VUERBVEU6Ci0gICAgY2FzZSBNQ1BfUEhZX1VQREFURToKLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OOgotICAgIGNhc2UgTUNQX0RJU0NPTk5FQ1RJT046Ci0gICAgY2FzZSBNQ1BfQ09OTkVDVElPTl9DTE9TRV9FVkVOVDoKLSAgICBjYXNlIE1DUF9CT05EX1NUQVRFX0NIQU5HRV9FVkVOVDoKLSAgICAgIGRldmljZSA9IHBfZGF0YS0+cmVtb3RlRGV2aWNlOwotICAgICAgZGV2aWNlLT5EZXZpY2VTdGF0ZUhhbmRsZXJQb2ludGVyW2RldmljZS0+c3RhdGVdKHBfZGF0YS0+ZXZlbnQsIHBfZGF0YSwgZGV2aWNlLT5zdGF0ZSk7Ci0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYm9vbCBEZXZpY2VTdGF0ZUNvbm5lY3Rpb25IYW5kbGVyKHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwYXJhbSwgdWludDhfdCBzdGF0ZSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAgZGV2aWNlIGNvbm5lY3RlZCBoYW5kbGUgIiA8PCBnZXRfbWNwX2V2ZW50X25hbWUoZXZlbnQpOwotICBtY3BfcmVzcF90ICpwX2RhdGEgPSAobWNwX3Jlc3BfdCAqKSBwYXJhbTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgTUNQX05PVElGWV9BTEw6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICBkZXZpY2Ugbm90aWZ5IGFsbCAiOwotICAgICAgaWYgKGlzX3B0c19ydW5uaW5nKCkgfHwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmFjdGl2ZV9wcm9maWxlID09IDB4MTApIHsvLyBuZWVkIHRvIGNoZWNrIHByb2ZpbGUgdmFsdWUKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgICAgIHRNQ1BfTUVESUFfVVBEQVRFICpub3RmaXlVcGRhdGUgPSAmcF9kYXRhLT5vcGVyLk1lZGlhVXBkYXRlT3A7Ci0gICAgICAgIHZhbHVlLmFzc2lnbihub3RmaXlVcGRhdGUtPmRhdGEsIG5vdGZpeVVwZGF0ZS0+ZGF0YSArIG5vdGZpeVVwZGF0ZS0+bGVuKTsKLSAgICAgICAgR2F0dHNPcHNRdWV1ZTo6U2VuZE5vdGlmaWNhdGlvbihwX2RhdGEtPnJlbW90ZURldmljZS0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmhhbmRsZSwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX1JFQURfUlNQOgotICAgICAgQlRBX0dBVFRTX1NlbmRSc3AocF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbm5faWQsIHBfZGF0YS0+b3Blci5SZWFkT3AudHJhbnNfaWQsCi0gICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MsICZwX2RhdGEtPnJzcF92YWx1ZSk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDoKLSAgICAgIEJUQV9HQVRUU19TZW5kUnNwKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuUmVhZERlc2NPcC50cmFuc19pZCwKLSAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUywgJnBfZGF0YS0+cnNwX3ZhbHVlKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1DUF9ERVNDUklQVE9SX1dSSVRFX1JTUDogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIGRldmljZSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1AgdXBkYXRlIHJzcCA6IiA8PCBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3AubmVlZF9yc3A7Ci0gICAgICB0R0FUVFNfUlNQIHJzcF9zdHJ1Y3Q7Ci0gICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUuaGFuZGxlID0gcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5oYW5kbGU7Ci0gICAgICByc3Bfc3RydWN0LmF0dHJfdmFsdWUub2Zmc2V0ID0gcF9kYXRhLT5yc3BfdmFsdWUuYXR0cl92YWx1ZS5vZmZzZXQ7Ci0gICAgICBpZiAocF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbmdlc3RlZCA9PSBmYWxzZSAmJgotICAgICAgICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLm5lZWRfcnNwKSB7Ci0gICAgICAvL3NlbmQgcnNwIHRvIHdyaXRlCi0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdhdHQgc2VuZCByc3Agc3RhdHVzIiA8PCBwX2RhdGEtPm9wZXIuV3JpdGVEZXNjT3Auc3RhdHVzOwotICAgICAgICBCVEFfR0FUVFNfU2VuZFJzcChwX2RhdGEtPnJlbW90ZURldmljZS0+Y29ubl9pZCwgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLnRyYW5zX2lkLAotICAgICAgICAgICAgcF9kYXRhLT5vcGVyLldyaXRlRGVzY09wLnN0YXR1cywgJnJzcF9zdHJ1Y3QpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfV1JJVEVfUlNQOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBkZXZpY2UgTUNQX1dSSVRFX1JTUCB1cGRhdGUgVHggSUQ6ICIgPDwgcF9kYXRhLT5vcGVyLldyaXRlT3AudHJhbnNfaWQ7Ci0gICAgICBib29sIG5lZWRfcnNwID0gcF9kYXRhLT5vcGVyLldyaXRlT3AubmVlZF9yc3A7Ci0gICAgICBpZiAobmVlZF9yc3ApIHsKLSAgICAgIEJUQV9HQVRUU19TZW5kUnNwKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkLCBwX2RhdGEtPm9wZXIuV3JpdGVPcC50cmFuc19pZCwKLSAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUywgJnBfZGF0YS0+cnNwX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0NPTk5FQ1RJT05fVVBEQVRFOiB7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+bGF0ZW5jeSA9IHBfZGF0YS0+b3Blci5Db25uZWN0aW9uVXBkYXRlT3AubGF0ZW5jeTsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT50aW1lb3V0ID0gcF9kYXRhLT5vcGVyLkNvbm5lY3Rpb25VcGRhdGVPcC50aW1lb3V0OwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmludGVydmFsID0gcF9kYXRhLT5vcGVyLkNvbm5lY3Rpb25VcGRhdGVPcC5pbnRlcnZhbDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5hY3RpdmVfcHJvZmlsZSA9IDB4MTA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9BQ1RJVkVfREVWSUNFX1VQREFURTogewotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmFjdGl2ZV9wcm9maWxlID0gcF9kYXRhLT5vcGVyLlNldEFjdGl2ZURldmljZU9wLnByb2ZpbGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ1BfUEhZX1VQREFURTogewotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnJ4X3BoeSA9IHBfZGF0YS0+b3Blci5QaHlPcC5yeF9waHk7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+dHhfcGh5ID0gcF9kYXRhLT5vcGVyLlBoeU9wLnR4X3BoeTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX01UVV9VUERBVEU6IHsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5tdHUgPSBwX2RhdGEtPm9wZXIuTXR1T3AubXR1OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ09OR0VTVElPTl9VUERBVEU6IHsKLSAgICAgIE1jcENvbmdlc3Rpb25VcGRhdGUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0RJU0NPTk5FQ1RJT046IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICBkZXZpY2UgZXZlbnQgTUNQX0RJU0NPTk5FQ1RJT04gcmVtb3ZlICI7Ci0gICAgICBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5SZW1vdmUocF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBlZXJfYmRhKTsKLSAgICAgIGluc3RhbmNlLT5PbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZShNQ1BfRElTQ09OTkVDVEVELCBwX2RhdGEtPnJlbW90ZURldmljZS0+cGVlcl9iZGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNQ1BfQ09OTkVDVElPTl9DTE9TRV9FVkVOVDogewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIGRldmljZSBjb25uZWN0aW9uIGNsb3NpbmciOwotICAgICAgICAvLyBDbG9zZSBhY3RpdmUgY29ubmVjdGlvbgotICAgICAgaWYgKHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkICE9IDApCi0gICAgICAgIEJUQV9HQVRUU19DbG9zZShwX2RhdGEtPnJlbW90ZURldmljZS0+Y29ubl9pZCk7Ci0gICAgICBlbHNlCi0gICAgICAgIEJUQV9HQVRUU19DYW5jZWxPcGVuKG1jc1NlcnZlclNlcnZpY2VJbmZvLnNlcnZlcl9pZiwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBlZXJfYmRhLCB0cnVlKTsKLQotICAgICAgLy8gQ2FuY2VsIHBlbmRpbmcgYmFja2dyb3VuZCBjb25uZWN0aW9ucwotICAgICAgQlRBX0dBVFRTX0NhbmNlbE9wZW4obWNzU2VydmVyU2VydmljZUluZm8uc2VydmVyX2lmLCBwX2RhdGEtPnJlbW90ZURldmljZS0+cGVlcl9iZGEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0JPTkRfU1RBVEVfQ0hBTkdFX0VWRU5UOgotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJCb25kIHN0YXRlIGNoYW5nZSA6ICI7Ci0gICAgICBpbnN0YW5jZS0+cmVtb3RlRGV2aWNlcy5SZW1vdmUocF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBlZXJfYmRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICBldmVudCBub3QgbWF0Y2hlZCI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1ib29sIERldmljZVN0YXRlRGlzY29ubmVjdGVkSGFuZGxlcih1aW50MzJfdCBldmVudCwgdm9pZCogcGFyYW0sIHVpbnQ4X3Qgc3RhdGUpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIGRldmljZSBkaXNjb25uZWN0ZWQgaGFuZGxlICIgPDwgZ2V0X21jcF9ldmVudF9uYW1lKGV2ZW50KTsKLSAgbWNwX3Jlc3BfdCAqcF9kYXRhID0gKG1jcF9yZXNwX3QgKikgcGFyYW07Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIE1DUF9DT05ORUNUSU9OOiB7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+c3RhdGUgPSBNQ1BfQ09OTkVDVEVEOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPm1lZGlhX3N0YXRlX25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+bWVkaWFfcGxheWVyX25hbWVfbm90aWZ5ID0gMHgwMDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5tZWRpYV9jb250cm9sX3BvaW50X25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+dHJhY2tfY2hhbmdlZF9ub3RpZnkgPSAweDAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnRyYWNrX2R1cmF0aW9uX25vdGlmeSA9IDB4MDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+dHJhY2tfdGl0bGVfbm90aWZ5ID0gMHgwMDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT50cmFja19wb3NpdGlvbl9ub3RpZnkgPSAweDAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBsYXlpbmdfb3JkZXJfbm90aWZ5ID0gMHgwMDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25nZXN0ZWQgPSBmYWxzZTsKLQotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnRpbWVvdXQgPSAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmxhdGVuY3kgPSAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmludGVydmFsID0gMDsKLSAgICAgIHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5yeF9waHkgPSAwOwotICAgICAgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnR4X3BoeSA9IDA7Ci0gICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+bXR1ID0gLTE7Ci0gICAgICBpbnN0YW5jZS0+T25Db25uZWN0aW9uU3RhdGVDaGFuZ2UoTUNQX0NPTk5FQ1RFRCwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPnBlZXJfYmRhKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTUNQX0NPTkdFU1RJT05fVVBEQVRFOiB7Ci0gICAgICBNY3BDb25nZXN0aW9uVXBkYXRlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1DUF9NVFVfVVBEQVRFOgotICAgIGNhc2UgTUNQX1BIWV9VUERBVEU6Ci0gICAgY2FzZSBNQ1BfUkVBRF9SU1A6Ci0gICAgY2FzZSBNQ1BfREVTQ1JJUFRPUl9SRUFEX1JTUDoKLSAgICBjYXNlIE1DUF9XUklURV9SU1A6Ci0gICAgY2FzZSBNQ1BfREVTQ1JJUFRPUl9XUklURV9SU1A6Ci0gICAgY2FzZSBNQ1BfTk9USUZZX0FMTDoKLSAgICBjYXNlIE1DUF9ESVNDT05ORUNUSU9OOgotICAgIGNhc2UgTUNQX0NPTk5FQ1RJT05fQ0xPU0VfRVZFTlQ6Ci0gICAgY2FzZSBNQ1BfQk9ORF9TVEFURV9DSEFOR0VfRVZFTlQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8vaWdub3JlIGV2ZW50Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAgSWdub3JlIGV2ZW50ICIgPDwgZ2V0X21jcF9ldmVudF9uYW1lKGV2ZW50KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotdm9pZCBNY3BDb25nZXN0aW9uVXBkYXRlKG1jcF9yZXNwX3QgKnBfZGF0YSkgewotICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y29uZ2VzdGVkID0gcF9kYXRhLT5vcGVyLkNvbmdlc3Rpb25PcC5jb25nZXN0ZWQ7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkOiAiIDw8IHBfZGF0YS0+cmVtb3RlRGV2aWNlLT5jb25uX2lkCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb25nZXN0ZWQ6ICIgPDwgcF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbmdlc3RlZDsKLQotICBHYXR0c09wc1F1ZXVlOjpDb25nZXN0aW9uQ2FsbGJhY2socF9kYXRhLT5yZW1vdGVEZXZpY2UtPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnJlbW90ZURldmljZS0+Y29uZ2VzdGVkKTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvdmNwL2J0YV92Y3BfY29udHJvbGxlci5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGEvdmNwL2J0YV92Y3BfY29udHJvbGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViN2Q2Yy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRhL3ZjcC9idGFfdmNwX2NvbnRyb2xsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA4ICswLDAgQEAKLS8qCi0gKkNvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YV92Y3BfY29udHJvbGxlcl9hcGkuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNpbmNsdWRlICJnYXR0X2FwaS5oIgotI2luY2x1ZGUgImdhdHRjX29wc19xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3ZjcF9jb250cm9sbGVyLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi11c2luZyBiYXNlOjpDbG9zdXJlOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OkdhdHRPcHNRdWV1ZTsKLXVzaW5nIGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OkNvbm5lY3Rpb25TdGF0ZTsKLQotLy8gQXNzaWduZWQgTnVtYmVycyBmb3IgVkNTCi1VdWlkIFZDU19VVUlEICAgICAgICAgID0gVXVpZDo6RnJvbVN0cmluZygiMTg0NCIpOwotVXVpZCBWQ1NfVk9MVU1FX1NUQVRFX1VVSUQgICAgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCN0QiKTsKLVV1aWQgVkNTX1ZPTFVNRV9DT05UUk9MX1BPSU5UX1VVSUQgICA9IFV1aWQ6OkZyb21TdHJpbmcoIjJCN0UiKTsKLVV1aWQgVkNTX1ZPTFVNRV9GTEFHU19VVUlEICAgICAgPSBVdWlkOjpGcm9tU3RyaW5nKCIyQjdGIik7Ci0KLSNkZWZpbmUgVkNTX1JFVFJZX1NFVF9BQlNfVk9MIDB4MDEKLSNkZWZpbmUgVkNTX1JFVFJZX1NFVF9NVVRFX1NUQVRFIDB4MDIKLQotLy8gVkNTIEFwcGxpY2F0aW9uIEVycm9yIENvZGUKLSNkZWZpbmUgVkNTX0lOVkFMSURfQ0hBTkdFX0NPVU5URVIgMHg4MAotI2RlZmluZSBWQ1NfT1BDT0RFX05PVF9TVVBQT1JURUQgMHg4MQotCi12b2lkIHZjcF9jb250cm9sbGVyX2dhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpOwotdm9pZCB2Y3BfY29udHJvbGxlcl9lbmNyeXB0aW9uX2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MqLCB0R0FUVF9UUkFOU1BPUlQsIHZvaWQqLCB0QlRNX1NUQVRVUyk7Ci1jb25zdCBjaGFyKiB2Y3BfY29udHJvbGxlcl9nYXR0X2NhbGxiYWNrX2V2dF9zdHIodWludDhfdCBldmVudCk7Ci1jb25zdCBjaGFyKiB2Y3BfY29udHJvbGxlcl9oYW5kbGVfdmNzX2V2dF9zdHIodWludDhfdCBldmVudCk7Ci0KLWNsYXNzIFZjcENvbnRyb2xsZXJJbXBsOwotc3RhdGljIFZjcENvbnRyb2xsZXJJbXBsKiBpbnN0YW5jZTsKLQotY2xhc3MgUmVuZGVyZXJEZXZpY2VzIHsKLSBwcml2YXRlOgotCi0gcHVibGljOgotICB2b2lkIEFkZChSZW5kZXJlckRldmljZSBkZXZpY2UpIHsKLSAgICBpZiAoRmluZEJ5QWRkcmVzcyhkZXZpY2UuYWRkcmVzcykgIT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGRldmljZXMucHVzaF9iYWNrKGRldmljZSk7Ci0gIH0KLQotICB2b2lkIFJlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VzLmVuZCgpOykgewotICAgICAgaWYgKGl0LT5hZGRyZXNzICE9IGFkZHJlc3MpIHsKLSAgICAgICAgKytpdDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGl0ID0gZGV2aWNlcy5lcmFzZShpdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgUmVuZGVyZXJEZXZpY2UqIEZpbmRCeUFkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXZpY2VzLmJlZ2luKCksIGRldmljZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYWRkcmVzc10oY29uc3QgUmVuZGVyZXJEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuYWRkcmVzcyA9PSBhZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIFJlbmRlcmVyRGV2aWNlKiBGaW5kQnlDb25uSWQodWludDE2X3QgY29ubl9pZCkgewotICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihkZXZpY2VzLmJlZ2luKCksIGRldmljZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY29ubl9pZF0oY29uc3QgUmVuZGVyZXJEZXZpY2UmIGRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuY29ubl9pZCA9PSBjb25uX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzLmVuZCgpKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIHNpemVfdCBzaXplKCkgeyByZXR1cm4gKGRldmljZXMuc2l6ZSgpKTsgfQotCi0gIHN0ZDo6dmVjdG9yPFJlbmRlcmVyRGV2aWNlPiBkZXZpY2VzOwotfTsKLQotY2xhc3MgVmNwQ29udHJvbGxlckltcGwgOiBwdWJsaWMgVmNwQ29udHJvbGxlciB7Ci0gcHJpdmF0ZToKLSAgdWludDhfdCBnYXR0X2lmOwotICBibHVldG9vdGg6OnZjcF9jb250cm9sbGVyOjpWY3BDb250cm9sbGVyQ2FsbGJhY2tzKiBjYWxsYmFja3M7Ci0gIFJlbmRlcmVyRGV2aWNlcyByZW5kZXJlckRldmljZXM7Ci0KLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflZjcENvbnRyb2xsZXJJbXBsKCkgPSBkZWZhdWx0OwotCi0gIFZjcENvbnRyb2xsZXJJbXBsKGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OlZjcENvbnRyb2xsZXJDYWxsYmFja3MqIGNhbGxiYWNrcykKLSAgICAgIDogZ2F0dF9pZigwKSwKLSAgICAgICAgY2FsbGJhY2tzKGNhbGxiYWNrcykgewotICAgIExPRyhJTkZPKSA8PCAiVmNwQ29udHJvbGxlckltcGwgZ2F0dGMgYXBwIHJlZ2lzdGVyIjsKLQotICAgIEJUQV9HQVRUQ19BcHBSZWdpc3RlcigKLSAgICAgICAgdmNwX2NvbnRyb2xsZXJfZ2F0dGNfY2FsbGJhY2ssCi0gICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICBbXSh1aW50OF90IGNsaWVudF9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW4ndCBzdGFydCBWY3AgcHJvZmlsZSAtIG5vIGdhdHQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudHMgbGVmdCEiOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpbnN0YW5jZS0+Z2F0dF9pZiA9IGNsaWVudF9pZDsKLSAgICAgICAgICAgIH0pLCB0cnVlKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBib29sIGlzRGlyZWN0KSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzIDw8ICIsIGlzRGlyZWN0ID0gIiA8PCBsb2dib29sKGlzRGlyZWN0KTsKLSAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLQotICAgIGlmIChyZW5kZXJlckRldmljZSkgewotICAgICAgTE9HKElORk8pIDw8ICJEZXZpY2UgYWxyZWFkeSBpbiBjb25uZWN0ZWQvY29ubmVjdGluZyBzdGF0ZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZW5kZXJlckRldmljZXMuQWRkKFJlbmRlcmVyRGV2aWNlKGFkZHJlc3MpKTsKLSAgICByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiRGV2aWNlIGFkZHJlc3MgY291bGQgbm90IGJlIGZvdW5kTCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlbmRlcmVyRGV2aWNlLT5zdGF0ZSA9IEJUQV9WQ1BfQ09OTkVDVElORzsKLSAgICBjYWxsYmFja3MtPk9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVElORywgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MpOwotCi0gICAgaWYgKCFpc0RpcmVjdCkgewotICAgICAgcmVuZGVyZXJEZXZpY2UtPmJnX2Nvbm4gPSB0cnVlOwotICAgIH0KLQotICAgIEJUQV9HQVRUQ19PcGVuKGdhdHRfaWYsIGFkZHJlc3MsIGlzRGlyZWN0LCBHQVRUX1RSQU5TUE9SVF9MRSwgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLQotICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiRGV2aWNlIG5vdCBjb25uZWN0ZWQgdG8gcHJvZmlsZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGFkZHJlc3M7Ci0gICAgcmVuZGVyZXJEZXZpY2UtPnN0YXRlID0gQlRBX1ZDUF9ESVNDT05ORUNUSU5HOwotICAgIGNhbGxiYWNrcy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNUSU5HLCByZW5kZXJlckRldmljZS0+YWRkcmVzcyk7Ci0gICAgVmNwR2F0dENsb3NlKHJlbmRlcmVyRGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgU2V0QWJzVm9sdW1lKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgdm9sdW1lKSB7Ci0gICAgUmVuZGVyZXJEZXZpY2UqIHJlbmRlcmVyRGV2aWNlID0gcmVuZGVyZXJEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0KLSAgICBpZiAoIXJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmVyRGV2aWNlLT5jb25uX2lkID09IDApIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEdBVFQgaXMgbm90IGNvbm5lY3RlZCwgc2tpcCBzZXQgYWJzb2x1dGUgdm9sdW1lIjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZW5kZXJlckRldmljZS0+c3RhdGUgIT0gQlRBX1ZDUF9DT05ORUNURUQpIHsKLSAgICAgIExPRyhJTkZPKQotICAgICAgICAgIDw8IF9fZnVuY19fIDw8ICI6IFZDUCBpcyBub3QgY29ubmVjdGVkLCBza2lwIHNldCBhYnNvbHV0ZSB2b2x1bWUsIHN0YXRlID0gIgotICAgICAgICAgIDw8IGxvZ2hleChyZW5kZXJlckRldmljZS0+c3RhdGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBTZW5kIHRoZSBkYXRhIHBhY2tldAotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBTZXQgYWJzIHZvbHVtZS4gZGV2aWNlPSIgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MKLSAgICAgICAgICAgICAgPDwgIiwgdm9sdW1lPSIgPDwgbG9naGV4KHZvbHVtZSk7Ci0KLSAgICByZW5kZXJlckRldmljZS0+dmNzLnBlbmRpbmdfdm9sdW1lX3NldHRpbmcgPSB2b2x1bWU7Ci0KLSAgICB1aW50OF90IHBfYnVmWzI1Nl07Ci0gICAgU2V0QWJzVm9sdW1lT3Agc2V0X2Fic192b2xfb3A7Ci0gICAgc2V0X2Fic192b2xfb3Aub3BfaWQgID0gVkNTX0NPTlRST0xfUE9JTlRfT1BfU0VUX0FCU19WT0w7Ci0gICAgc2V0X2Fic192b2xfb3AuY2hhbmdlX2NvdW50ZXIgPSByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZS5jaGFuZ2VfY291bnRlcjsKLSAgICBzZXRfYWJzX3ZvbF9vcC52b2x1bWVfc2V0dGluZyA9IHZvbHVtZTsKLQotICAgIG1lbWNweShwX2J1ZiwgJnNldF9hYnNfdm9sX29wICwgc2l6ZW9mKHNldF9hYnNfdm9sX29wKSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjdF92YWwocF9idWYsIHBfYnVmICsgc2l6ZW9mKHNldF9hYnNfdm9sX29wKSk7Ci0KLSAgICBHYXR0T3BzUXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMoZ2F0dF9pZiwKLSAgICAgICAgcmVuZGVyZXJEZXZpY2UtPmNvbm5faWQsIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlLCB2ZWN0X3ZhbCwKLSAgICAgICAgR0FUVF9XUklURSwgVmNwQ29udHJvbGxlckltcGw6Ok9uU2V0QWJzVm9sdW1lU3RhdGljLCBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgTXV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgUmVuZGVyZXJEZXZpY2UqIHJlbmRlcmVyRGV2aWNlID0gcmVuZGVyZXJEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0KLSAgICBpZiAoIXJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkRldmljZSBub3QgY29ubmVjdGVkIHRvIHByb2ZpbGUiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmVyRGV2aWNlLT5jb25uX2lkID09IDApIHsKLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IEdBVFQgaXMgbm90IGNvbm5lY3RlZCwgc2tpcCBtdXRlIjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZW5kZXJlckRldmljZS0+c3RhdGUgIT0gQlRBX1ZDUF9DT05ORUNURUQpIHsKLSAgICAgIExPRyhJTkZPKQotICAgICAgICAgIDw8IF9fZnVuY19fIDw8ICI6IFZDUCBpcyBub3QgY29ubmVjdGVkLCBza2lwIG11dGUsIHN0YXRlID0gIgotICAgICAgICAgIDw8IGxvZ2hleChyZW5kZXJlckRldmljZS0+c3RhdGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBTZW5kIHRoZSBkYXRhIHBhY2tldAotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBNdXRlIGRldmljZT0iIDw8IHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzOwotCi0gICAgcmVuZGVyZXJEZXZpY2UtPnZjcy5wZW5kaW5nX211dGVfc2V0dGluZyA9IFZDU19NVVRFX1NUQVRFOwotCi0gICAgdWludDhfdCBwX2J1ZlsyNTZdOwotICAgIE11dGVPcCBtdXRlX29wOwotICAgIG11dGVfb3Aub3BfaWQgID0gVkNTX0NPTlRST0xfUE9JTlRfT1BfTVVURTsKLSAgICBtdXRlX29wLmNoYW5nZV9jb3VudGVyID0gcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGUuY2hhbmdlX2NvdW50ZXI7Ci0KLSAgICBtZW1jcHkocF9idWYsICZtdXRlX29wICwgc2l6ZW9mKG11dGVfb3ApKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWN0X3ZhbChwX2J1ZiwgcF9idWYgKyBzaXplb2YobXV0ZV9vcCkpOwotCi0gICAgR2F0dE9wc1F1ZXVlOjpXcml0ZUNoYXJhY3RlcmlzdGljKGdhdHRfaWYsCi0gICAgICAgIHJlbmRlcmVyRGV2aWNlLT5jb25uX2lkLCByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9jb250cm9sX3BvaW50X2hhbmRsZSwgdmVjdF92YWwsCi0gICAgICAgIEdBVFRfV1JJVEUsIFZjcENvbnRyb2xsZXJJbXBsOjpPbk11dGVTdGF0aWMsIG51bGxwdHIpOwotICB9Ci0KLSAgdm9pZCBVbm11dGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgaWYgKCFyZW5kZXJlckRldmljZSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJEZXZpY2Ugbm90IGNvbm5lY3RlZCB0byBwcm9maWxlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZW5kZXJlckRldmljZS0+Y29ubl9pZCA9PSAwKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBHQVRUIGlzIG5vdCBjb25uZWN0ZWQsIHNraXAgdW5tdXRlLiI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmVuZGVyZXJEZXZpY2UtPnN0YXRlICE9IEJUQV9WQ1BfQ09OTkVDVEVEKSB7Ci0gICAgICBMT0coSU5GTykKLSAgICAgICAgICA8PCBfX2Z1bmNfXyA8PCAiOiBWQ1AgaXMgbm90IGNvbm5lY3RlZCwgc2tpcCB1bm11dGUsIHN0YXRlID0gIgotICAgICAgICAgIDw8IGxvZ2hleChyZW5kZXJlckRldmljZS0+c3RhdGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBTZW5kIHRoZSBkYXRhIHBhY2tldAotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bm11dGUgZGV2aWNlPSIgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3M7Ci0KLSAgICByZW5kZXJlckRldmljZS0+dmNzLnBlbmRpbmdfbXV0ZV9zZXR0aW5nID0gVkNTX1VOTVVURV9TVEFURTsKLQotICAgIHVpbnQ4X3QgcF9idWZbMjU2XTsKLSAgICBVbm11dGVPcCB1bm11dGVfb3A7Ci0gICAgdW5tdXRlX29wLm9wX2lkICA9IFZDU19DT05UUk9MX1BPSU5UX09QX1VOTVVURTsKLSAgICB1bm11dGVfb3AuY2hhbmdlX2NvdW50ZXIgPSByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZS5jaGFuZ2VfY291bnRlcjsKLQotICAgIG1lbWNweShwX2J1ZiwgJnVubXV0ZV9vcCAsIHNpemVvZih1bm11dGVfb3ApKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWN0X3ZhbChwX2J1ZiwgcF9idWYgKyBzaXplb2YodW5tdXRlX29wKSk7Ci0KLSAgICBHYXR0T3BzUXVldWU6OldyaXRlQ2hhcmFjdGVyaXN0aWMoZ2F0dF9pZiwKLSAgICAgICAgcmVuZGVyZXJEZXZpY2UtPmNvbm5faWQsIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlLCB2ZWN0X3ZhbCwKLSAgICAgICAgR0FUVF9XUklURSwgVmNwQ29udHJvbGxlckltcGw6Ok9uVW5tdXRlU3RhdGljLCBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgVmNwR2F0dENsb3NlKFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3M7Ci0KLSAgICAvLyBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uLgotICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKGdhdHRfaWYsIHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzLCBmYWxzZSk7Ci0gICAgcmVuZGVyZXJEZXZpY2UtPmJnX2Nvbm4gPSBmYWxzZTsKLQotICAgIGlmIChyZW5kZXJlckRldmljZS0+Y29ubl9pZCkgewotICAgICAgR2F0dE9wc1F1ZXVlOjpDbGVhbihyZW5kZXJlckRldmljZS0+Y29ubl9pZCk7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UocmVuZGVyZXJEZXZpY2UtPmNvbm5faWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgLy8gY2FuY2VsIHBlbmRpbmcgZGlyZWN0IGNvbm5lY3QKLSAgICAgIEJUQV9HQVRUQ19DYW5jZWxPcGVuKGdhdHRfaWYsIHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzLCB0cnVlKTsKLSAgICAgIFBvc3REaXNjb25uZWN0ZWQocmVuZGVyZXJEZXZpY2UpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25HYXR0Q29ubmVjdGVkKHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0lGIGNsaWVudF9pZiwgUmF3QWRkcmVzcyBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICB0QlRBX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHVpbnQxNl90IG10dSkgewotICAgIFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAgIjogYWRkcmVzcz0iIDw8IGFkZHJlc3MgPDwgIiwgY29ubl9pZD0iIDw8IGNvbm5faWQ7Ci0KLSAgICBpZiAoIXJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIkNsb3NpbmcgY29ubmVjdGlvbiB0byBub24gdm9sdW1lIHJlbmRlcmVyIGRldmljZSwgYWRkcmVzcz0iCi0gICAgICAgICAgICAgICAgICAgPDwgYWRkcmVzczsKLSAgICAgIEJUQV9HQVRUQ19DbG9zZShjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgaWYgKHJlbmRlcmVyRGV2aWNlLT5iZ19jb25uKSB7Ci0gICAgICAgIC8vIHdoaXRlbGlzdCBjb25uZWN0aW9uIGZhaWxlZCwgdGhhdCdzIG9rLgotICAgICAgICBMT0coSU5GTykgPDwgImJnIGNvbm4gZmFpbGVkLCByZXR1cm4gaW1tZWRpYXRlbHkiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIExPRyhJTkZPKSA8PCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdm9sdW1lIHJlbmRlcmVyIGRldmljZSI7Ci0gICAgICByZW5kZXJlckRldmljZXMuUmVtb3ZlKGFkZHJlc3MpOwotICAgICAgY2FsbGJhY2tzLT5PbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmVyRGV2aWNlLT5iZ19jb25uKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAgIjogYmFja2dvdW5kIGNvbm5lY3Rpb24gZnJvbTogYWRkcmVzcz0iIDw8IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgcmVuZGVyZXJEZXZpY2UtPmJnX2Nvbm4gPSBmYWxzZTsKLSAgICByZW5kZXJlckRldmljZS0+Y29ubl9pZCA9IGNvbm5faWQ7Ci0KLSAgICAvKiB2ZXJpZnkgYm9uZCAqLwotICAgIHVpbnQ4X3Qgc2VjX2ZsYWcgPSAwOwotICAgIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoYWRkcmVzcywgJnNlY19mbGFnLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICAiOiBzZWNfZmxhZyA9IiA8PCBsb2doZXgoc2VjX2ZsYWcpOwotICAgIGlmIChzZWNfZmxhZyAmIEJUTV9TRUNfRkxBR19FTkNSWVBURUQpIHsKLSAgICAgIC8qIGlmIGxpbmsgaGFzIGJlZW4gZW5jcnlwdGVkICovCi0gICAgICBPbkVuY3J5cHRpb25Db21wbGV0ZShhZGRyZXNzLCB0cnVlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc2VjX2ZsYWcgJiBCVE1fU0VDX0ZMQUdfTEtFWV9LTk9XTikgewotICAgICAgLyogaWYgYm9uZGVkIGFuZCBsaW5rIG5vdCBlbmNyeXB0ZWQgKi8KLSAgICAgIHNlY19mbGFnID0gQlRNX0JMRV9TRUNfRU5DUllQVDsKLSAgICAgIEJUTV9TZXRFbmNyeXB0aW9uKGFkZHJlc3MsIEJUQV9UUkFOU1BPUlRfTEUsIHZjcF9jb250cm9sbGVyX2VuY3J5cHRpb25fY2FsbGJhY2ssIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNfZmxhZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogb3RoZXJ3aXNlIGxldCBpdCBnbyB0aHJvdWdoICovCi0gICAgT25FbmNyeXB0aW9uQ29tcGxldGUoYWRkcmVzcywgdHJ1ZSk7Ci0gIH0KLQotICB2b2lkIE9uR2F0dERpc2Nvbm5lY3RlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBjbGllbnRfaWYsIFJhd0FkZHJlc3MgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9HQVRUX1JFQVNPTiByZWFzb24pIHsKLSAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotCi0gICAgaWYgKCFyZW5kZXJlckRldmljZSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSBkaXNjb25uZWN0LCBjb25uX2lkPSIKLSAgICAgICAgICAgICAgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgPDwgIiwgcmVhc29uPSIgPDwgbG9naGV4KHJlYXNvbikgPDwgIiwgcmVtb3RlX2JkYT0iIDw8IHJlbW90ZV9iZGE7Ci0KLSAgICBQb3N0RGlzY29ubmVjdGVkKHJlbmRlcmVyRGV2aWNlKTsKLSAgfQotCi0gIHZvaWQgUG9zdERpc2Nvbm5lY3RlZChSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzOwotICAgIHJlbmRlcmVyRGV2aWNlLT5zdGF0ZSA9IEJUQV9WQ1BfRElTQ09OTkVDVEVEOwotCi0gICAgaWYocmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGVfaGFuZGxlICE9IDB4RkZGRikgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogRGVyZWdpc3RlciBub3RpZmljYXRpb25zIiwgX19mdW5jX18pOwotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGVfaGFuZGxlKTsKLSAgICB9Ci0gICAgaWYocmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfaGFuZGxlICE9IDB4RkZGRikgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogRGVyZWdpc3RlciBub3RpZmljYXRpb25zIiwgX19mdW5jX18pOwotICAgICAgQlRBX0dBVFRDX0RlcmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfaGFuZGxlKTsKLSAgICB9Ci0KLSAgICBpZiAocmVuZGVyZXJEZXZpY2UtPmNvbm5faWQpIHsKLSAgICAgIEdhdHRPcHNRdWV1ZTo6Q2xlYW4ocmVuZGVyZXJEZXZpY2UtPmNvbm5faWQpOwotICAgICAgcmVuZGVyZXJEZXZpY2UtPmNvbm5faWQgPSAwOwotICAgIH0KLQotICAgIGNhbGxiYWNrcy0+T25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlOjpESVNDT05ORUNURUQsIHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzKTsKLSAgICByZW5kZXJlckRldmljZXMuUmVtb3ZlKHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzKTsKLSAgfQotCi0gIHZvaWQgT25FbmNyeXB0aW9uQ29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBzdWNjZXNzKSB7Ci0gICAgUmVuZGVyZXJEZXZpY2UqIHJlbmRlcmVyRGV2aWNlID0gcmVuZGVyZXJEZXZpY2VzLkZpbmRCeUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzOwotCi0gICAgaWYgKCFyZW5kZXJlckRldmljZSkgewotICAgICAgTE9HKFdBUk5JTkcpICA8PCAiU2tpcHBpbmcgdW5rbm93biBkZXZpY2UiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJlbmNyeXB0aW9uIGZhaWxlZCI7Ci0gICAgICBCVEFfR0FUVENfQ2xvc2UocmVuZGVyZXJEZXZpY2UtPmNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QocmVuZGVyZXJEZXZpY2UtPmNvbm5faWQsICZWQ1NfVVVJRCk7Ci0gIH0KLQotICB2b2lkIE9uU2VydmljZVNlYXJjaENvbXBsZXRlKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgIExPRyhXQVJOSU5HKSAgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAvKiBjbG9zZSBjb25uZWN0aW9uIGFuZCByZXBvcnQgc2VydmljZSBkaXNjb3ZlcnkgY29tcGxldGUgd2l0aCBlcnJvciAqLwotICAgICAgTE9HKEVSUk9SKSA8PCAiU2VydmljZSBkaXNjb3ZlcnkgZmFpbGVkIjsKLSAgICAgIFZjcEdhdHRDbG9zZShyZW5kZXJlckRldmljZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Z2F0dDo6U2VydmljZT4qIHNlcnZpY2VzID0gQlRBX0dBVFRDX0dldFNlcnZpY2VzKGNvbm5faWQpOwotCi0gICAgY29uc3QgZ2F0dDo6U2VydmljZSogc2VydmljZSA9IG51bGxwdHI7Ci0gICAgaWYgKHNlcnZpY2VzKSB7Ci0gICAgICBmb3IgKGNvbnN0IGdhdHQ6OlNlcnZpY2UmIHRtcCA6ICpzZXJ2aWNlcykgewotICAgICAgICBpZiAodG1wLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSKSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICBMT0coSU5GTykgPDwgIkZvdW5kIFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSLCBoYW5kbGU9IgotICAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgodG1wLmhhbmRsZSk7Ci0gICAgICAgICAgY29uc3QgZ2F0dDo6U2VydmljZSogc2VydmljZV9jaGFuZ2VkX3NlcnZpY2UgPSAmdG1wOwotICAgICAgICAgIEZpbmRTZXJ2ZXJDaGFuZ2VkQ0NDSGFuZGxlKGNvbm5faWQsIHNlcnZpY2VfY2hhbmdlZF9zZXJ2aWNlKTsKLSAgICAgICAgICAqLwotICAgICAgICB9IGVsc2UgaWYgKHRtcC51dWlkID09IFZDU19VVUlEKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8ICJGb3VuZCBWb2x1bWUgQ29udHJvbCBzZXJ2aWNlLCBoYW5kbGU9IiA8PCBsb2doZXgodG1wLmhhbmRsZSk7Ci0gICAgICAgICAgc2VydmljZSA9ICZ0bXA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAibm8gc2VydmljZXMgZm91bmQgZm9yIGNvbm5faWQ6ICIgPDwgY29ubl9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXNlcnZpY2UpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIk5vIFZDUyBmb3VuZCI7Ci0gICAgICBWY3BHYXR0Q2xvc2UocmVuZGVyZXJEZXZpY2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoYXJhYyA6IHNlcnZpY2UtPmNoYXJhY3RlcmlzdGljcykgewotICAgICAgaWYgKGNoYXJhYy51dWlkID09IFZDU19WT0xVTUVfU1RBVEVfVVVJRCkgewotICAgICAgICByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZV9oYW5kbGUgPSBjaGFyYWMudmFsdWVfaGFuZGxlOwotCi0gICAgICAgIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX3N0YXRlX2NjY19oYW5kbGUgPQotICAgICAgICAgICAgRmluZENjY0hhbmRsZShjb25uX2lkLCBjaGFyYWMudmFsdWVfaGFuZGxlKTsKLSAgICAgICAgaWYgKCFyZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZV9jY2NfaGFuZGxlKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYW5ub3QgZmluZCB2b2x1bWUgc3RhdGUgQ0NDIGRlc2NyaXB0b3IiOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICA8PCAiOiB2Y3Mgdm9sdW1lX3N0YXRlX2hhbmRsZT0iIDw8IGxvZ2hleChjaGFyYWMudmFsdWVfaGFuZGxlKQotICAgICAgICAgICAgICAgICAgPDwgIiwgY2NjPSIgPDwgbG9naGV4KHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX3N0YXRlX2NjY19oYW5kbGUpOwotICAgICAgfSBlbHNlIGlmIChjaGFyYWMudXVpZCA9PSBWQ1NfVk9MVU1FX0ZMQUdTX1VVSUQpIHsKLSAgICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLQotICAgICAgICByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9mbGFnc19jY2NfaGFuZGxlID0KLSAgICAgICAgICAgIEZpbmRDY2NIYW5kbGUoY29ubl9pZCwgY2hhcmFjLnZhbHVlX2hhbmRsZSk7Ci0gICAgICAgIGlmICghcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfY2NjX2hhbmRsZSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogY2Fubm90IGZpbmQgdm9sdW1lIGZsYWdzIENDQyBkZXNjcmlwdG9yIjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgPDwgIjogdmNzIHZvbHVtZV9mbGFnc19oYW5kbGU9IiA8PCBsb2doZXgoY2hhcmFjLnZhbHVlX2hhbmRsZSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsIGNjYz0iIDw8IGxvZ2hleChyZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9mbGFnc19jY2NfaGFuZGxlKTsKLSAgICAgIH0gZWxzZSBpZiAoY2hhcmFjLnV1aWQgPT0gVkNTX1ZPTFVNRV9DT05UUk9MX1BPSU5UX1VVSUQpIHsKLSAgICAgICAgLy8gc3RvcmUgdm9sdW1lIGNvbnRyb2wgcG9pbnQhCi0gICAgICAgIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX2NvbnRyb2xfcG9pbnRfaGFuZGxlID0gY2hhcmFjLnZhbHVlX2hhbmRsZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5rbm93biBjaGFyYWN0ZXJpc3RpYyBmb3VuZDoiIDw8IGNoYXJhYy51dWlkOwotICAgICAgfQotICAgIH0KLQotICAgIExPRyhXQVJOSU5HKSA8PCAicmVhZGluZyB2Y3Mgdm9sdW1lX3N0YXRlX2hhbmRsZSI7Ci0gICAgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoZ2F0dF9pZiwKLSAgICAgICAgY29ubl9pZCwgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGVfaGFuZGxlLAotICAgICAgICBWY3BDb250cm9sbGVySW1wbDo6T25Wb2x1bWVTdGF0ZVJlYWRTdGF0aWMsIG51bGxwdHIpOwotCi0gIH0KLQotICB2b2lkIE9uU2VydmljZUNoYW5nZUV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAoIXJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgICBWTE9HKDIpIDw8ICJTa2lwcGluZyB1bmtub3duIGRldmljZSIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M9IiA8PCBhZGRyZXNzOwotICAgIHJlbmRlcmVyRGV2aWNlLT5zZXJ2aWNlX2NoYW5nZWRfcmN2ZCA9IHRydWU7Ci0gICAgR2F0dE9wc1F1ZXVlOjpDbGVhbihyZW5kZXJlckRldmljZS0+Y29ubl9pZCk7Ci0gIH0KLQotICB2b2lkIE9uU2VydmljZURpc2NEb25lRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgIFZMT0coMikgPDwgIlNraXBwaW5nIHVua25vd24gZGV2aWNlIiA8PCBhZGRyZXNzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmVuZGVyZXJEZXZpY2UtPnNlcnZpY2VfY2hhbmdlZF9yY3ZkKSB7Ci0gICAgICBCVEFfR0FUVENfU2VydmljZVNlYXJjaFJlcXVlc3QocmVuZGVyZXJEZXZpY2UtPmNvbm5faWQsICZWQ1NfVVVJRCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPblZvbHVtZVN0YXRlUmVhZCh1aW50MTZfdCBjbGllbnRfaWQsIHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLCB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgIFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0KLSAgICBpZiAoIXJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgICBMT0coV0FSTklORykgIDw8ICJTa2lwcGluZyB1bmtub3duIHJlYWQgZXZlbnQsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzcyA8PCAiLCBzdGF0dXM6ICIgPDwgbG9naGV4KHN0YXR1cykKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHJlbmRlcmVyIGRldmljZSBzdGF0ZTogIiA8PCBsb2doZXgocmVuZGVyZXJEZXZpY2UtPnN0YXRlKTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIFZvbHVtZSBTdGF0ZSBmb3IgZGV2aWNlIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLSAgICB9IGVsc2UgewotICAgICAgdWludDhfdCogcCA9IHZhbHVlOwotICAgICAgdWludDhfdCB2b2x1bWVfc2V0dGluZzsKLSAgICAgIFNUUkVBTV9UT19VSU5UOCh2b2x1bWVfc2V0dGluZywgcCk7Ci0gICAgICByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZS52b2x1bWVfc2V0dGluZyA9IHZvbHVtZV9zZXR0aW5nOwotCi0gICAgICB1aW50OF90IG11dGU7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgobXV0ZSwgcCk7Ci0gICAgICByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZS5tdXRlID0gbXV0ZTsKLQotICAgICAgdWludDhfdCBjaGFuZ2VfY291bnRlcjsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChjaGFuZ2VfY291bnRlciwgcCk7Ci0gICAgICByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZS5jaGFuZ2VfY291bnRlciA9IGNoYW5nZV9jb3VudGVyOwotICAgIH0KLQotICAgIEhhbmRsZVZDU0V2ZW50KHJlbmRlcmVyRGV2aWNlLCBWQ1NfVk9MVU1FX1NUQVRFX1JFQURfQ01QTF9FVlQsIHN0YXR1cyk7Ci0gIH0KLQotICB2b2lkIE9uVm9sdW1lRmxhZ3NSZWFkKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHZhbHVlLCB2b2lkKiBkYXRhKSB7Ci0gICAgUmVuZGVyZXJEZXZpY2UqIHJlbmRlcmVyRGV2aWNlID0gcmVuZGVyZXJEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLQotICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgIExPRyhXQVJOSU5HKSAgPDwgIlNraXBwaW5nIHVua25vd24gcmVhZCBldmVudCwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzIDw8ICIsIHN0YXR1czogIiA8PCBsb2doZXgoc3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIFZvbHVtZSBGbGFncyBmb3IgZGV2aWNlIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLSAgICB9IGVsc2UgewotICAgICAgdWludDhfdCogcCA9IHZhbHVlOwotICAgICAgdWludDhfdCB2b2x1bWVfZmxhZ3M7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgodm9sdW1lX2ZsYWdzLCBwKTsKLSAgICAgIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX2ZsYWdzID0gdm9sdW1lX2ZsYWdzOwotICAgIH0KLQotICAgIEhhbmRsZVZDU0V2ZW50KHJlbmRlcmVyRGV2aWNlLCBWQ1NfVk9MVU1FX0ZMQUdTX1JFQURfQ01QTF9FVlQsIHN0YXR1cyk7Ci0gIH0KLQotICAgdm9pZCBPblZvbHVtZVN0YXRlQ0NDV3JpdGUodWludDE2X3QgY2xpZW50X2lkLCB1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB2b2lkKiBkYXRhKSB7Ci0gICAgIFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0KLSAgICAgaWYgKCFyZW5kZXJlckRldmljZSkgewotICAgICAgIExPRyhXQVJOSU5HKSAgPDwgIlNraXBwaW5nIHVua25vd24gcmVhZCBldmVudCwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzIDw8ICIsIHN0YXR1czogIiA8PCBsb2doZXgoc3RhdHVzKTsKLQotICAgICBIYW5kbGVWQ1NFdmVudChyZW5kZXJlckRldmljZSwgVkNTX1ZPTFVNRV9TVEFURV9DQ0NfV1JJVEVfQ01QTF9FVlQsIHN0YXR1cyk7Ci0gICB9Ci0KLSAgIHZvaWQgT25Wb2x1bWVGbGFnc0NDQ1dyaXRlKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdm9pZCogZGF0YSkgewotICAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotCi0gICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgICBMT0coV0FSTklORykgIDw8ICJTa2lwcGluZyB1bmtub3duIHJlYWQgZXZlbnQsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICAgcmV0dXJuOwotICAgICB9Ci0KLSAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzcyA8PCAiLCBzdGF0dXM6ICIgPDwgbG9naGV4KHN0YXR1cyk7Ci0KLSAgICAgSGFuZGxlVkNTRXZlbnQocmVuZGVyZXJEZXZpY2UsIFZDU19WT0xVTUVfRkxBR1NfQ0NDX1dSSVRFX0NNUExfRVZULCBzdGF0dXMpOwotICAgfQotCi0gICB2b2lkIE9uU2V0QWJzVm9sdW1lKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdm9pZCogZGF0YSkgewotICAgICBSZW5kZXJlckRldmljZSogcmVuZGVyZXJEZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotCi0gICAgIGlmICghcmVuZGVyZXJEZXZpY2UpIHsKLSAgICAgICBMT0coV0FSTklORykgPDwgIlNraXBwaW5nIHVua25vd24gcmVhZCBldmVudCwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzIDw8ICIsIHN0YXR1czogIiA8PCBsb2doZXgoc3RhdHVzKTsKLQotICAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgIC8vIENoZWNrIGZvciBWQ1MgSW52YWxpZCBDaGFuZ2UgQ291bnRlciBlcnJvciwgaXQgbWF5Ci0gICAgICAgLy8gY29uZmxpY3Qgd2l0aCBHQVRUX05PX1JFU09VUkNFUyBlcnJvci4KLSAgICAgICBpZiAoc3RhdHVzID09IFZDU19JTlZBTElEX0NIQU5HRV9DT1VOVEVSIHx8Ci0gICAgICAgICAgIHN0YXR1cyA9PSBWQ1NfT1BDT0RFX05PVF9TVVBQT1JURUQpIHsKLSAgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gIDw8ICI6IEVycm9yIGNvZGU6ICIgPDwgc3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkZXZpY2U6ICIgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFJlYWQgVm9sdW1lIFN0YXRlIHRvIHVwZGF0ZSBjaGFuZ2UgY291bnRlciI7Ci0KLSAgICAgICAgIHJlbmRlcmVyRGV2aWNlLT52Y3MucmV0cnlfY21kIHw9IFZDU19SRVRSWV9TRVRfQUJTX1ZPTDsKLSAgICAgICAgIEdhdHRPcHNRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGdhdHRfaWYsCi0gICAgICAgICAgICAgY29ubl9pZCwgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGVfaGFuZGxlLAotICAgICAgICAgICAgIFZjcENvbnRyb2xsZXJJbXBsOjpPblZvbHVtZVN0YXRlUmVhZFN0YXRpYywgbnVsbHB0cik7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgIExPRyhFUlJPUikgPDwgIF9fZnVuY19fIDw8ICI6IE90aGVyIGVycm9ycywgbm90IHJldHJ5IjsKLSAgICAgICB9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy5yZXRyeV9jbWQgJj0gflZDU19SRVRSWV9TRVRfQUJTX1ZPTDsKLSAgICAgICBMT0coSU5GTykgPDwgIlNldCBhYnMgdm9sdW1lIHN1Y2Nlc3MgIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLSAgICAgfQotICAgfQotCi0gICB2b2lkIE9uTXV0ZSh1aW50MTZfdCBjbGllbnRfaWQsIHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgUmVuZGVyZXJEZXZpY2UqIHJlbmRlcmVyRGV2aWNlID0gcmVuZGVyZXJEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLQotICAgICBpZiAoIXJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTa2lwcGluZyB1bmtub3duIHJlYWQgZXZlbnQsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgICAgcmV0dXJuOwotICAgICB9Ci0KLSAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzcyA8PCAiLCBzdGF0dXM6ICIgPDwgbG9naGV4KHN0YXR1cyk7Ci0KLSAgICAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICBMT0coRVJST1IpIDw8ICJWb2x1bWUgU3RhdGUgV3JpdGUgZmFpbGVkIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJSZWFkIFZvbHVtZSBTdGF0ZSI7Ci0KLSAgICAgICByZW5kZXJlckRldmljZS0+dmNzLnJldHJ5X2NtZCB8PSBWQ1NfUkVUUllfU0VUX01VVEVfU1RBVEU7Ci0gICAgICAgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoZ2F0dF9pZiwKLSAgICAgICAgICAgY29ubl9pZCwgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGVfaGFuZGxlLAotICAgICAgICAgICBWY3BDb250cm9sbGVySW1wbDo6T25Wb2x1bWVTdGF0ZVJlYWRTdGF0aWMsIG51bGxwdHIpOwotICAgICB9IGVsc2UgewotICAgICAgIExPRyhJTkZPKSA8PCAiTXV0ZSBzdWNjZXNzIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLSAgICAgfQotCi0gICB9Ci0KLSAgIHZvaWQgT25Vbm11dGUodWludDE2X3QgY2xpZW50X2lkLCB1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB2b2lkKiBkYXRhKSB7Ci0gICAgIFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSA9IHJlbmRlcmVyRGV2aWNlcy5GaW5kQnlDb25uSWQoY29ubl9pZCk7Ci0KLSAgICAgaWYgKCFyZW5kZXJlckRldmljZSkgewotICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2tpcHBpbmcgdW5rbm93biByZWFkIGV2ZW50LCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MgPDwgIiwgc3RhdHVzOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotCi0gICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgTE9HKEVSUk9SKSA8PCAiVm9sdW1lIFN0YXRlIFdyaXRlIGZhaWxlZCIgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiUmVhZCBWb2x1bWUgU3RhdGUiOwotCi0gICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy5yZXRyeV9jbWQgfD0gVkNTX1JFVFJZX1NFVF9NVVRFX1NUQVRFOwotICAgICAgIEdhdHRPcHNRdWV1ZTo6UmVhZENoYXJhY3RlcmlzdGljKGdhdHRfaWYsCi0gICAgICAgICAgIGNvbm5faWQsIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX3N0YXRlX2hhbmRsZSwKLSAgICAgICAgICAgVmNwQ29udHJvbGxlckltcGw6Ok9uVm9sdW1lU3RhdGVSZWFkU3RhdGljLCBudWxscHRyKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICBMT0coSU5GTykgPDwgIlVubXV0ZSBzdWNjZXNzIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLSAgICAgfQotICAgfQotCi0gIHZvaWQgUmV0cnlWb2x1bWVDb250cm9sT3AoUmVuZGVyZXJEZXZpY2UqIHJlbmRlcmVyRGV2aWNlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLQotICAgIGlmIChyZW5kZXJlckRldmljZS0+dmNzLnJldHJ5X2NtZCAmIFZDU19SRVRSWV9TRVRfQUJTX1ZPTCkgewotICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy5yZXRyeV9jbWQgJj0gflZDU19SRVRSWV9TRVRfQUJTX1ZPTDsKLSAgICAgIFNldEFic1ZvbHVtZShyZW5kZXJlckRldmljZS0+YWRkcmVzcywgcmVuZGVyZXJEZXZpY2UtPnZjcy5wZW5kaW5nX3ZvbHVtZV9zZXR0aW5nKTsKLSAgICB9Ci0KLSAgICBpZiAocmVuZGVyZXJEZXZpY2UtPnZjcy5yZXRyeV9jbWQgJiBWQ1NfUkVUUllfU0VUX01VVEVfU1RBVEUpIHsKLSAgICAgIHJlbmRlcmVyRGV2aWNlLT52Y3MucmV0cnlfY21kICY9IH5WQ1NfUkVUUllfU0VUX01VVEVfU1RBVEU7Ci0gICAgICBpZiAocmVuZGVyZXJEZXZpY2UtPnZjcy5wZW5kaW5nX211dGVfc2V0dGluZyA9PSBWQ1NfTVVURV9TVEFURSkgewotICAgICAgICBNdXRlKHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFVubXV0ZShyZW5kZXJlckRldmljZS0+YWRkcmVzcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHZvaWQgT25Wb2x1bWVTdGF0ZVJlYWRTdGF0aWModWludDE2X3QgY2xpZW50X2lkLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHZvaWQqIGRhdGEpIHsKLSAgICBpZiAoaW5zdGFuY2UpCi0gICAgICBpbnN0YW5jZS0+T25Wb2x1bWVTdGF0ZVJlYWQoY2xpZW50X2lkLCBjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgbGVuLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBPblZvbHVtZUZsYWdzUmVhZFN0YXRpYyh1aW50MTZfdCBjbGllbnRfaWQsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PblZvbHVtZUZsYWdzUmVhZChjbGllbnRfaWQsIGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBsZW4sIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uVm9sdW1lU3RhdGVDQ0NXcml0ZVN0YXRpYyh1aW50MTZfdCBjbGllbnRfaWQsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHZvaWQqIGRhdGEpIHsKLSAgICBpZiAoaW5zdGFuY2UpCi0gICAgICBpbnN0YW5jZS0+T25Wb2x1bWVTdGF0ZUNDQ1dyaXRlKGNsaWVudF9pZCwgY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGRhdGEpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgT25Wb2x1bWVGbGFnc0NDQ1dyaXRlU3RhdGljKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PblZvbHVtZUZsYWdzQ0NDV3JpdGUoY2xpZW50X2lkLCBjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgZGF0YSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBPblNldEFic1ZvbHVtZVN0YXRpYyh1aW50MTZfdCBjbGllbnRfaWQsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHZvaWQqIGRhdGEpIHsKLSAgICBpZiAoaW5zdGFuY2UpCi0gICAgICBpbnN0YW5jZS0+T25TZXRBYnNWb2x1bWUoY2xpZW50X2lkLCBjb25uX2lkLCBzdGF0dXMsIGhhbmRsZSwgZGF0YSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBPbk11dGVTdGF0aWModWludDE2X3QgY2xpZW50X2lkLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB2b2lkKiBkYXRhKSB7Ci0gICAgaWYgKGluc3RhbmNlKQotICAgICAgaW5zdGFuY2UtPk9uTXV0ZShjbGllbnRfaWQsIGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBkYXRhKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uVW5tdXRlU3RhdGljKHVpbnQxNl90IGNsaWVudF9pZCwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdm9pZCogZGF0YSkgewotICAgIGlmIChpbnN0YW5jZSkKLSAgICAgIGluc3RhbmNlLT5PblVubXV0ZShjbGllbnRfaWQsIGNvbm5faWQsIHN0YXR1cywgaGFuZGxlLCBkYXRhKTsKLSAgfQotCi0KLSAgdm9pZCBPbk5vdGlmaWNhdGlvbkV2ZW50KHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUpIHsKLSAgICBSZW5kZXJlckRldmljZSogZGV2aWNlID0gcmVuZGVyZXJEZXZpY2VzLkZpbmRCeUNvbm5JZChjb25uX2lkKTsKLQotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiOiBTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoaGFuZGxlID09IGRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZV9oYW5kbGUpIHsKLSAgICAgIGlmICggbGVuICE9IHNpemVvZihkZXZpY2UtPnZjcy52b2x1bWVfc3RhdGUpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRGF0YSBMZW5ndGggbWlzbWF0Y2gsIGxlbj0iIDw8IGxlbgotICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGluZyAiIDw8IHNpemVvZihkZXZpY2UtPnZjcy52b2x1bWVfc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgZGV2aWNlLT5hZGRyZXNzIDw8ICIgdm9sdW1lIHN0YXRlIG5vdGlmaWNhdGlvbiI7Ci0gICAgICBtZW1jcHkoJmRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZSwgdmFsdWUsIGxlbik7Ci0gICAgICBjYWxsYmFja3MtPk9uVm9sdW1lU3RhdGVDaGFuZ2UoZGV2aWNlLT52Y3Mudm9sdW1lX3N0YXRlLnZvbHVtZV9zZXR0aW5nLAotICAgICAgICAgICAgICBkZXZpY2UtPnZjcy52b2x1bWVfc3RhdGUubXV0ZSwgZGV2aWNlLT5hZGRyZXNzKTsKLSAgICB9IGVsc2UgaWYgKGhhbmRsZSA9PSBkZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfaGFuZGxlKSB7Ci0gICAgICBpZiAoIGxlbiAhPSBzaXplb2YoZGV2aWNlLT52Y3Mudm9sdW1lX2ZsYWdzKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IERhdGEgTGVuZ3RoIG1pc21hdGNoLCBsZW49IiA8PCBsZW4KLSAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3RpbmcgIiA8PCBzaXplb2YoZGV2aWNlLT52Y3Mudm9sdW1lX2ZsYWdzKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8IGRldmljZS0+YWRkcmVzcyA8PCAiIHZvbHVtZSBmbGFncyBub3RpZmljYXRpb24iOwotICAgICAgbWVtY3B5KCZkZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3MsIHZhbHVlLCBsZW4pOwotICAgICAgY2FsbGJhY2tzLT5PblZvbHVtZUZsYWdzQ2hhbmdlKGRldmljZS0+dmNzLnZvbHVtZV9mbGFncywgZGV2aWNlLT5hZGRyZXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IE1pc21hdGNoZWQgaGFuZGxlLCAiCi0gICAgICAgICAgICAgICAgPDwgbG9naGV4KGRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZV9oYW5kbGUpCi0gICAgICAgICAgICAgICAgPDwgIiBvciAiIDw8IGxvZ2hleChkZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfaGFuZGxlKQotICAgICAgICAgICAgICAgIDw8ICIhPSIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkNvbmdlc3Rpb25FdmVudCh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCkgewotICAgIFJlbmRlcmVyRGV2aWNlKiBkZXZpY2UgPSByZW5kZXJlckRldmljZXMuRmluZEJ5Q29ubklkKGNvbm5faWQpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiOiBTa2lwcGluZyB1bmtub3duIGRldmljZSwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogY29ubl9pZDoiIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb25nZXN0ZWQ6ICIgPDwgY29uZ2VzdGVkOwotICAgIEdhdHRPcHNRdWV1ZTo6Q29uZ2VzdGlvbkNhbGxiYWNrKGNvbm5faWQsIGNvbmdlc3RlZCk7Ci0gIH0KLQotICB2b2lkIEhhbmRsZVZDU0V2ZW50KFJlbmRlcmVyRGV2aWNlKiByZW5kZXJlckRldmljZSwgdWludDMyX3QgZXZlbnQsIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBldmVudCA9ICIgPDwgdmNwX2NvbnRyb2xsZXJfaGFuZGxlX3Zjc19ldnRfc3RyKGV2ZW50KTsKLQotICAgIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICBpZiAocmVuZGVyZXJEZXZpY2UtPnN0YXRlID09IEJUQV9WQ1BfQ09OTkVDVElORykgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEVycm9yIHN0YXR1cyB3aGlsZSBWQ1AgY29ubmVjdGluZywgQ2xvc2UgR0FUVCBmb3IgZGV2aWNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJlckRldmljZS0+YWRkcmVzczsKLSAgICAgICAgVmNwR2F0dENsb3NlKHJlbmRlcmVyRGV2aWNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmICAocmVuZGVyZXJEZXZpY2UtPnN0YXRlID09IEJUQV9WQ1BfQ09OTkVDVEVEKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRXJyb3Igc3RhdHVzIHdoaWxlIFZDUCBpcyBjb25uZWN0ZWQgZm9yIGRldmljZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3M7Ci0gICAgICAgIGlmIChyZW5kZXJlckRldmljZS0+dmNzLnJldHJ5X2NtZCAhPSAwKSB7Ci0gICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy5yZXRyeV9jbWQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRXJyb3Igc3RhdHVzIGluIGRpc2Nvbm5lY3RlZCBvciBkaXNjb25uZWN0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJJZ29yZSBoYW5kbGUgVkNTIEV2ZW50ICBmb3IgZGV2aWNlOiAiIDw8IHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgY2FzZSBWQ1NfVk9MVU1FX1NUQVRFX1JFQURfQ01QTF9FVlQ6IHsKLSAgICAgICAgIGlmIChyZW5kZXJlckRldmljZS0+c3RhdGUgPT0gQlRBX1ZDUF9DT05ORUNUSU5HKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTZXR1cCBWQ1AgY29ubmVjdGlvbiwgcmVhZGluZyB2Y3Mgdm9sdW1lX2ZsYWdzX2hhbmRsZSI7Ci0gICAgICAgICAgR2F0dE9wc1F1ZXVlOjpSZWFkQ2hhcmFjdGVyaXN0aWMoZ2F0dF9pZiwKLSAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPmNvbm5faWQsIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX2ZsYWdzX2hhbmRsZSwKLSAgICAgICAgICAgICAgVmNwQ29udHJvbGxlckltcGw6Ok9uVm9sdW1lRmxhZ3NSZWFkU3RhdGljLCBudWxscHRyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlckRldmljZS0+c3RhdGUgPT0gQlRBX1ZDUF9DT05ORUNURUQpIHsKLSAgICAgICAgICBpZiAocmVuZGVyZXJEZXZpY2UtPnZjcy5yZXRyeV9jbWQgIT0gMCkgewotICAgICAgICAgICAgUmV0cnlWb2x1bWVDb250cm9sT3AocmVuZGVyZXJEZXZpY2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBWQ1NfVk9MVU1FX0ZMQUdTX1JFQURfQ01QTF9FVlQ6IHsKLSAgICAgICAgaWYgKHJlbmRlcmVyRGV2aWNlLT5zdGF0ZSA9PSBCVEFfVkNQX0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAvKiBSZWdpc3RlciBhbmQgZW5hYmxlIHRoZSBWb2x1bWUgU3RhdGUgTm90aWZpY2F0aW9uICovCi0gICAgICAgICAgdEdBVFRfU1RBVFVTIHJlZ2lzdGVyX3N0YXR1czsKLSAgICAgICAgICByZWdpc3Rlcl9zdGF0dXMgPSBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgICAgICBnYXR0X2lmLCByZW5kZXJlckRldmljZS0+YWRkcmVzcywgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGVfaGFuZGxlKTsKLSAgICAgICAgICBpZiAocmVnaXN0ZXJfc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zIGZhaWxlZCwgc3RhdHVzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgbG9naGV4KHJlZ2lzdGVyX3N0YXR1cyk7Ci0gICAgICAgICAgICBWY3BHYXR0Q2xvc2UocmVuZGVyZXJEZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKDIpOwotICAgICAgICAgIHVpbnQ4X3QqIHB0ciA9IHZhbHVlLmRhdGEoKTsKLSAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHB0ciwgR0FUVF9DSEFSX0NMSUVOVF9DT05GSUdfTk9USUZJQ0FUSU9OKTsKLSAgICAgICAgICBHYXR0T3BzUXVldWU6OldyaXRlRGVzY3JpcHRvcihnYXR0X2lmLAotICAgICAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPmNvbm5faWQsIHJlbmRlcmVyRGV2aWNlLT52Y3Mudm9sdW1lX3N0YXRlX2NjY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCBHQVRUX1dSSVRFLCBWY3BDb250cm9sbGVySW1wbDo6T25Wb2x1bWVTdGF0ZUNDQ1dyaXRlU3RhdGljLAotICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgVkNTX1ZPTFVNRV9TVEFURV9DQ0NfV1JJVEVfQ01QTF9FVlQ6IHsKLSAgICAgICAgaWYgKHJlbmRlcmVyRGV2aWNlLT5zdGF0ZSA9PSBCVEFfVkNQX0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAvKiBSZWdpc3RlciBhbmQgZW5hYmxlIHRoZSBWb2x1bWUgU3RhdGUgTm90aWZpY2F0aW9uICovCi0gICAgICAgICAgdEdBVFRfU1RBVFVTIHJlZ2lzdGVyX3N0YXR1czsKLSAgICAgICAgICByZWdpc3Rlcl9zdGF0dXMgPSBCVEFfR0FUVENfUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAotICAgICAgICAgICAgICBnYXR0X2lmLCByZW5kZXJlckRldmljZS0+YWRkcmVzcywgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3NfaGFuZGxlKTsKLSAgICAgICAgICBpZiAocmVnaXN0ZXJfc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnMgZmFpbGVkLCBzdGF0dXM9IgotICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChyZWdpc3Rlcl9zdGF0dXMpOwotICAgICAgICAgICAgVmNwR2F0dENsb3NlKHJlbmRlcmVyRGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSgyKTsKLSAgICAgICAgICB1aW50OF90KiBwdHIgPSB2YWx1ZS5kYXRhKCk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwdHIsIEdBVFRfQ0hBUl9DTElFTlRfQ09ORklHX05PVElGSUNBVElPTik7Ci0gICAgICAgICAgR2F0dE9wc1F1ZXVlOjpXcml0ZURlc2NyaXB0b3IoZ2F0dF9pZiwKLSAgICAgICAgICAgICAgICAgIHJlbmRlcmVyRGV2aWNlLT5jb25uX2lkLCByZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9mbGFnc19jY2NfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHZhbHVlKSwgR0FUVF9XUklURSwgVmNwQ29udHJvbGxlckltcGw6Ok9uVm9sdW1lRmxhZ3NDQ0NXcml0ZVN0YXRpYywKLSAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFZDU19WT0xVTUVfRkxBR1NfQ0NDX1dSSVRFX0NNUExfRVZUOiB7Ci0gICAgICAgIGlmIChyZW5kZXJlckRldmljZS0+c3RhdGUgPT0gQlRBX1ZDUF9DT05ORUNUSU5HKSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogVkNQIENvbm5lY3Rpb24gU2V0dXAgY29tcGxldGUiOwotICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPnN0YXRlID0gQlRBX1ZDUF9DT05ORUNURUQ7Ci0gICAgICAgICAgICBjYWxsYmFja3MtPk9uQ29ubmVjdGlvblN0YXRlKENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVELCByZW5kZXJlckRldmljZS0+YWRkcmVzcyk7Ci0gICAgICAgICAgICBjYWxsYmFja3MtPk9uVm9sdW1lRmxhZ3NDaGFuZ2UocmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyRGV2aWNlLT5hZGRyZXNzKTsKLSAgICAgICAgICAgIGNhbGxiYWNrcy0+T25Wb2x1bWVTdGF0ZUNoYW5nZShyZW5kZXJlckRldmljZS0+dmNzLnZvbHVtZV9zdGF0ZS52b2x1bWVfc2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJEZXZpY2UtPnZjcy52b2x1bWVfc3RhdGUubXV0ZSwgcmVuZGVyZXJEZXZpY2UtPmFkZHJlc3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmV4cGVjdGVkIFZDUyBldmVudCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gICAgLy8gRmluZCB0aGUgaGFuZGxlIGZvciB0aGUgY2xpZW50IGNoYXJhY3RlcmlzdGljcyBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4KLSAgLy8gY2hhcmFjdGVyaXN0aWNzCi0gIHVpbnQxNl90IEZpbmRDY2NIYW5kbGUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgY2hhcl9oYW5kbGUpIHsKLSAgICBjb25zdCBnYXR0OjpDaGFyYWN0ZXJpc3RpYyogcF9jaGFyID0KLSAgICAgICAgQlRBX0dBVFRDX0dldENoYXJhY3RlcmlzdGljKGNvbm5faWQsIGNoYXJfaGFuZGxlKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiAiIDw8ICIsIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiLCBjaGFyX2hhbmRsZTogIiA8PCBjaGFyX2hhbmRsZTsKLQotICAgIGlmICghcF9jaGFyKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogTm8gc3VjaCBjaGFyYWN0ZXJpc3RpYzogIiA8PCBjaGFyX2hhbmRsZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgZ2F0dDo6RGVzY3JpcHRvciYgZGVzYyA6IHBfY2hhci0+ZGVzY3JpcHRvcnMpIHsKLSAgICAgIGlmIChkZXNjLnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpKQotICAgICAgICByZXR1cm4gZGVzYy5oYW5kbGU7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBDbGVhblVwKCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgICBCVEFfR0FUVENfQXBwRGVyZWdpc3RlcihnYXR0X2lmKTsKLSAgICBmb3IgKFJlbmRlcmVyRGV2aWNlJiBkZXZpY2UgOiByZW5kZXJlckRldmljZXMuZGV2aWNlcykgewotICAgICAgUG9zdERpc2Nvbm5lY3RlZCgmZGV2aWNlKTsKLSAgICB9Ci0KLSAgICByZW5kZXJlckRldmljZXMuZGV2aWNlcy5jbGVhcigpOwotICB9Ci19OwotCi12b2lkIHZjcF9jb250cm9sbGVyX2dhdHRjX2NhbGxiYWNrKHRCVEFfR0FUVENfRVZUIGV2ZW50LCB0QlRBX0dBVFRDKiBwX2RhdGEpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZXZlbnQgPSAiIDw8IHZjcF9jb250cm9sbGVyX2dhdHRfY2FsbGJhY2tfZXZ0X3N0cihldmVudCk7Ci0KLSAgaWYgKHBfZGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0dBVFRDX0RFUkVHX0VWVDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfT1BFTl9FVlQ6IHsKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIHRCVEFfR0FUVENfT1BFTiYgbyA9IHBfZGF0YS0+b3BlbjsKLSAgICAgIGluc3RhbmNlLT5PbkdhdHRDb25uZWN0ZWQoby5zdGF0dXMsIG8uY29ubl9pZCwgby5jbGllbnRfaWYsIG8ucmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby50cmFuc3BvcnQsIG8ubXR1KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQlRBX0dBVFRDX0NMT1NFX0VWVDogewotICAgICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotICAgICAgdEJUQV9HQVRUQ19DTE9TRSYgYyA9IHBfZGF0YS0+Y2xvc2U7Ci0gICAgICBpbnN0YW5jZS0+T25HYXR0RGlzY29ubmVjdGVkKGMuc3RhdHVzLCBjLmNvbm5faWQsIGMuY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnJlbW90ZV9iZGEsIGMucmVhc29uKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUOgotICAgICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotICAgICAgaW5zdGFuY2UtPk9uU2VydmljZVNlYXJjaENvbXBsZXRlKHBfZGF0YS0+c2VhcmNoX2NtcGwuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnNlYXJjaF9jbXBsLnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX05PVElGX0VWVDoKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIGlmICghcF9kYXRhLT5ub3RpZnkuaXNfbm90aWZ5IHx8IHBfZGF0YS0+bm90aWZ5LmxlbiA+IEdBVFRfTUFYX0FUVFJfTEVOKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcmVqZWN0ZWQgQlRBX0dBVFRDX05PVElGX0VWVC4gaXNfbm90aWZ5PSIKLSAgICAgICAgICAgICAgICAgICA8PCBwX2RhdGEtPm5vdGlmeS5pc19ub3RpZnkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBsZW49IiA8PCBwX2RhdGEtPm5vdGlmeS5sZW47Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaW5zdGFuY2UtPk9uTm90aWZpY2F0aW9uRXZlbnQocF9kYXRhLT5ub3RpZnkuY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bm90aWZ5LmhhbmRsZSwgcF9kYXRhLT5ub3RpZnkubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5ub3RpZnkudmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19FTkNfQ01QTF9DQl9FVlQ6Ci0gICAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47Ci0gICAgICBpbnN0YW5jZS0+T25FbmNyeXB0aW9uQ29tcGxldGUocF9kYXRhLT5lbmNfY21wbC5yZW1vdGVfYmRhLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfR0FUVENfU1JWQ19DSEdfRVZUOgotICAgICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotICAgICAgaW5zdGFuY2UtPk9uU2VydmljZUNoYW5nZUV2ZW50KHBfZGF0YS0+cmVtb3RlX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX1NSVkNfRElTQ19ET05FX0VWVDoKLSAgICAgIGlmICghaW5zdGFuY2UpIHJldHVybjsKLSAgICAgIGluc3RhbmNlLT5PblNlcnZpY2VEaXNjRG9uZUV2ZW50KHBfZGF0YS0+cmVtb3RlX2JkYSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0dBVFRDX0NPTkdFU1RfRVZUOgotICAgICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuOwotICAgICAgaW5zdGFuY2UtPk9uQ29uZ2VzdGlvbkV2ZW50KHBfZGF0YS0+Y29uZ2VzdC5jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+Y29uZ2VzdC5jb25nZXN0ZWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9HQVRUQ19TRUFSQ0hfUkVTX0VWVDoKLSAgICBjYXNlIEJUQV9HQVRUQ19DQU5DRUxfT1BFTl9FVlQ6Ci0gICAgY2FzZSBCVEFfR0FUVENfQ09OTl9VUERBVEVfRVZUOgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgdmNwX2NvbnRyb2xsZXJfZW5jcnlwdGlvbl9jYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRHQVRUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogZGF0YSwgdEJUTV9TVEFUVVMgc3RhdHVzKSB7Ci0gIGlmIChpbnN0YW5jZSkgewotICAgIGluc3RhbmNlLT5PbkVuY3J5cHRpb25Db21wbGV0ZSgqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IEJUTV9TVUNDRVNTID8gdHJ1ZSA6IGZhbHNlKTsKLSAgfQotfQotCi12b2lkIFZjcENvbnRyb2xsZXI6OkluaXRpYWxpemUoCi0gICAgICAgICAgICBibHVldG9vdGg6OnZjcF9jb250cm9sbGVyOjpWY3BDb250cm9sbGVyQ2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDsKLQotICBpZiAoaW5zdGFuY2UpIHsKLSAgICBMT0coRVJST1IpIDw8ICJBbHJlYWR5IGluaXRpYWxpemVkISI7Ci0gIH0KLQotICBpbnN0YW5jZSA9IG5ldyBWY3BDb250cm9sbGVySW1wbChjYWxsYmFja3MpOwotfQotCi1ib29sIFZjcENvbnRyb2xsZXI6OklzVmNwQ29udHJvbGxlclJ1bm5pbmcoKSB7IHJldHVybiBpbnN0YW5jZTsgfQotCi1WY3BDb250cm9sbGVyKiBWY3BDb250cm9sbGVyOjpHZXQoKSB7Ci0gIENIRUNLKGluc3RhbmNlKTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfTsKLQotaW50IFZjcENvbnRyb2xsZXI6OkdldERldmljZUNvdW50KCkgewotICBpZiAoIWluc3RhbmNlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IE5vdCBpbml0aWFsaXplZCB5ZXQiOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIChpbnN0YW5jZS0+R2V0RGV2aWNlQ291bnQoKSk7Ci19Ci0KLXZvaWQgVmNwQ29udHJvbGxlcjo6Q2xlYW5VcCgpIHsKLSAgVmNwQ29udHJvbGxlckltcGwqIHB0ciA9IGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci0KLSAgcHRyLT5DbGVhblVwKCk7Ci0KLSAgZGVsZXRlIHB0cjsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRGVidWdnaW5nIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fU1RSKGNvbnN0KSBcCi0gIGNhc2UgY29uc3Q6ICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29uc3Q7Ci0KLWNvbnN0IGNoYXIqIHZjcF9jb250cm9sbGVyX2dhdHRfY2FsbGJhY2tfZXZ0X3N0cih1aW50OF90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0dBVFRDX0RFUkVHX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0dBVFRDX09QRU5fRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfQ0xPU0VfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfU0VBUkNIX0NNUExfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfTk9USUZfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfRU5DX0NNUExfQ0JfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfR0FUVENfU0VBUkNIX1JFU19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19DQU5DRUxfT1BFTl9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19TUlZDX0NIR19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19DT05OX1VQREFURV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19TUlZDX0RJU0NfRE9ORV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9HQVRUQ19DT05HRVNUX0VWVCkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChjaGFyKikiVW5rbm93biBHQVRUIENhbGxiYWNrIEV2ZW50IjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiB2Y3BfY29udHJvbGxlcl9oYW5kbGVfdmNzX2V2dF9zdHIodWludDhfdCBldmVudCkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgQ0FTRV9SRVRVUk5fU1RSKFZDU19WT0xVTUVfU1RBVEVfUkVBRF9DTVBMX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoVkNTX1ZPTFVNRV9GTEFHU19SRUFEX0NNUExfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihWQ1NfVk9MVU1FX1NUQVRFX0NDQ19XUklURV9DTVBMX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoVkNTX1ZPTFVNRV9GTEFHU19DQ0NfV1JJVEVfQ01QTF9FVlQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoY2hhciopIlVua25vd24gaGFuZGxpbmcgVkNTIEV2ZW50IjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9BbmRyb2lkLmJwIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3YmQwMi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZmx1b3JpZGVfYnRpZl9kZWZhdWx0c19xdGlfYWR2YSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idCIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L2J0YS9hZyIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9zdGFjay9idG0iLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L3VkcnYvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9zeXN0ZW0vYnQvdm5kL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2V4dC9zeXN0ZW1fYnRfZXh0IiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9leHQvdmhhbC9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9leHQvc3lzdGVtX2J0X2V4dC9idGEvaW5jbHVkZSIsCi0gICAgICAgICJ2ZW5kb3IvcWNvbS9vcGVuc291cmNlL2NvbW1vbnN5cy9ibHVldG9vdGhfZXh0L3N5c3RlbV9idF9leHQvYnRpZi9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzLWludGYvYmx1ZXRvb3RoL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L2RldmljZS9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9idGlmL2luY2x1ZGUiLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvc3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL3N5c3RlbS9idC9idGEvc3lzIiwKLSAgICAgICAgInN5c3RlbS9idC9jb21tb24iLAotICAgICAgICAidmVuZG9yL3Fjb20vb3BlbnNvdXJjZS9jb21tb25zeXMvYmx1ZXRvb3RoX2xlYS9zeXN0ZW0vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9sZWEvc3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9sZWEvc3lzdGVtL2J0IiwKLSAgICAgICAgInZlbmRvci9xY29tL29wZW5zb3VyY2UvY29tbW9uc3lzL2JsdWV0b290aF9sZWEvdmhhbC9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgInZlbmRvci5xdGkuaGFyZHdhcmUuYmx1ZXRvb3RoX2F1ZGlvQDIuMCIsCi0gICAgICAgICJ2ZW5kb3IucXRpLmhhcmR3YXJlLmJsdWV0b290aF9hdWRpb0AyLjEiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYnhtbDIiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgICAgICAiLURBRFZfQVVESU9fRkVBVFVSRT0xIiwKLSAgICBdLAotICAgIHJlcXVpcmVkOiBbImxlYXVkaW9fY29uZmlncy54bWwiXSwKLX0KLQotLy8gQlRBIHN0YXRpYyBsaWJyYXJ5IGZvciB0YXJnZXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0LWJ0aWZfcXRpX2FkdmEiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2J0aWZfZGVmYXVsdHNfcXRpX2FkdmEiXSwKLSAgICBlbmFibGVkOiBmYWxzZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYmx1ZXRvb3RoX2Fkdl9hdWRpby5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9iYXBfYnJvYWRjYXN0LmNjIiwKLSAgICAgICAgInNyYy9idGlmX2NzaXAuY2MiLAotICAgICAgICAic3JjL2J0aWZfYWNtLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3BhY3NfY2xpZW50LmNjIiwKLSAgICAgICAgInNyYy9idGlmX2FzY3NfY2xpZW50LmNjIiwKLSAgICAgICAgInNyYy9idGlmX2JhcF9jb25maWcuY2MiLAotICAgICAgICAic3JjL2J0aWZfYmFwX3VjbGllbnQuY2MiLAotICAgICAgICAic3JjL2J0aWZfYmFwX2NvZGVjX3V0aWxzLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3ZtY3AuY2MiLAotICAgICAgICAic3JjL2J0aWZfYXBtLmNjIiwKLSAgICAgICAgInNyYy9idGlmX3ZjcF9jb250cm9sbGVyLmNjIiwKLSAgICAgICAgInNyYy9idGlmX2RtX2Fkdl9hdWRpby5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9hY21fc291cmNlLmNjIiwKLSAgICAgICAgInNyYy9idGlmX21jcC5jYyIsCi0gICAgICAgICJzcmMvYnRpZl9jYy5jYyIKLSAgICBdLAotfQotCi0vLyBCbHVldG9vdGggbGUgYXVkaW8gY29uZmlncyB4bWwKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJsZWF1ZGlvX2NvbmZpZ3MueG1sIiwKLSAgICBzcmM6ICJsZWF1ZGlvX2NvbmZpZ3MueG1sIiwKLSAgICBzdWJfZGlyOiAiYmx1ZXRvb3RoIiwKLSAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9ibHVldG9vdGhfYWR2X2F1ZGlvLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9pbmNsdWRlL2JsdWV0b290aF9hZHZfYXVkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjYzQxMC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9pbmNsdWRlL2JsdWV0b290aF9hZHZfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYmx1ZXRvb3RoX2Fkdl9hdWRpby5oCi0gKgotICogIERlc2NyaXB0aW9uOiAgIE1haW4gQVBJIGhlYWRlciBmaWxlIGZvciBMRUEgaW50ZXJmYWNpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUSW50ZXJmYWNlIEFQSXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IHZvaWQqIGdldF9hZHZfYXVkaW9fcHJvZmlsZV9pbnRlcmZhY2UoY29uc3QgY2hhciogcHJvZmlsZV9pZCk7Ci12b2lkIGluaXRfYWR2X2F1ZGlvX2ludGVyZmFjZXMoKTsKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9hY20uaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9hY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExZGNiNy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9pbmNsdWRlL2J0aWZfYWNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEJUSUZfQUNNX0gKLSNkZWZpbmUgQlRJRl9BQ01fSAotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyNpbmNsdWRlICJidGFfYWNtX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRhX2JhcF91Y2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0YV9wYWNzX2NsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidGFfYXNjc19jbGllbnRfYXBpLmgiCi0KLXR5cGVkZWYgdWludDhfdCB0QlRBX0FDTV9ITkRMOwotdHlwZWRlZiB1aW50OF90IHRCVElGX0FDTV9TVEFUVVM7Ci0KLSNkZWZpbmUgQlRBX0FDTV9NQVhfRVZUIDI2Ci0jZGVmaW5lIEJUQV9BQ01fTlVNX1NUUlMgNgotI2RlZmluZSBCVEFfQUNNX05VTV9DSUdTIDIzOQotLy9zdGFydGluZyBzZXRpZCBmcm9tIDE2IG9ud2FyZHMgYXMgMTYgaXMgaW5hdmxpZAotI2RlZmluZSBCVEFfQUNNX01JTl9OVU1fU0VUSUQgMTcKLSNkZWZpbmUgQlRBX0FDTV9NQVhfTlVNX1NFVElEIDI1NQotI2RlZmluZSBDT05URVhUX1RZUEVfVU5LTk9XTiAwCi0jZGVmaW5lIENPTlRFWFRfVFlQRV9NVVNJQyAxCi0jZGVmaW5lIENPTlRFWFRfVFlQRV9WT0lDRSAyCi0jZGVmaW5lIENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSAzCi0KLSNkZWZpbmUgQlRBX0FDTV9ESVNDT05ORUNUX0VWVCAwCi0jZGVmaW5lIEJUQV9BQ01fQ09OTkVDVF9FVlQgMQotI2RlZmluZSBCVEFfQUNNX1NUQVJUX0VWVCAyCi0jZGVmaW5lIEJUQV9BQ01fU1RPUF9FVlQgMwotI2RlZmluZSBCVEFfQUNNX1JFQ09ORklHX0VWVCA0Ci0jZGVmaW5lIEJUQV9BQ01fQ09ORklHX0VWVCA1Ci0jZGVmaW5lIEJUQV9BQ01fQ09OTl9VUERBVEVfVElNRU9VVF9FVlQgNgotCi0jZGVmaW5lIEJUQV9BQ01fSU5JVElBVE9SX1NFUlZJQ0VfSUQgMHhGRgotI2RlZmluZSBBQ01fVVVJRCAweEZGRkYKLSNkZWZpbmUgQUNNX1RTRVBfU05LIDEKLQotI2RlZmluZSBTUkMgMAotI2RlZmluZSBTTksgMQotCi1jb25zdGV4cHIgdWludDhfdCAgU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCAgICAgPSAweDAwOwotY29uc3RleHByIHVpbnQ4X3QgIFNUUkVBTV9TVEFURV9DT05ORUNUSU5HICAgICAgID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90ICBTVFJFQU1fU1RBVEVfQ09OTkVDVEVEICAgICAgICA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCAgU1RSRUFNX1NUQVRFX1NUQVJUSU5HICAgICAgICAgPSAweDAzOwotY29uc3RleHByIHVpbnQ4X3QgIFNUUkVBTV9TVEFURV9TVFJFQU1JTkcgICAgICAgID0gMHgwNDsKLWNvbnN0ZXhwciB1aW50OF90ICBTVFJFQU1fU1RBVEVfU1RPUFBJTkcgICAgICAgICA9IDB4MDU7Ci1jb25zdGV4cHIgdWludDhfdCAgU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RJTkcgICAgPSAweDA2OwotY29uc3RleHByIHVpbnQ4X3QgIFNUUkVBTV9TVEFURV9SRUNPTkZJR1VSSU5HICAgID0gMHgwNzsKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1TdGF0ZUluZm87Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbUNvbmZpZ0luZm87Ci0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtQ29ubmVjdDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtVHlwZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtUmVjb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbURpc2NSZWFzb247Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpRb3NDb25maWc7Ci0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIGludCBjb250ZXh0VHlwZTsKLSAgaW50IHByb2ZpbGVUeXBlOwotfXRCVElGX0FDTV9DT05OX0RJU0M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotfXRCVEFfQUNNX0NPTk5fVVBEQVRFX1RJTUVPVVRfSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIFN0cmVhbVR5cGUgc3RyZWFtX3R5cGU7Ci0gIENvZGVjQ29uZmlnIGNvZGVjX2NvbmZpZzsKLSAgdWludDMyX3QgYXVkaW9fbG9jYXRpb247Ci0gIFFvc0NvbmZpZyBxb3NfY29uZmlnOwotICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gY29kZWNzX3NlbGVjdGFibGU7Ci19dEJUQV9BQ01fQ09ORklHX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBTdHJlYW1UeXBlIHN0cmVhbV90eXBlOwotICBTdHJlYW1TdGF0ZSBzdHJlYW1fc3RhdGU7Ci0gIFN0cmVhbURpc2NSZWFzb24gcmVhc29uOwotfXRCVEFfQUNNX1NUQVRFX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBib29sIGlzX2RpcmVjdDsKLSAgU3RyZWFtU3RhdGVJbmZvIHN0cmVhbXNfaW5mbzsKLX10QlRJRl9BQ01fQ09OTkVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIFN0cmVhbVN0YXRlSW5mbyBzdHJlYW1zX2luZm87Ci19dEJUSUZfQUNNX0RJU0NPTk5FQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBTdHJlYW1TdGF0ZUluZm8gc3RyZWFtc19pbmZvOwotfXRCVElGX0FDTV9TVEFSVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIFN0cmVhbVN0YXRlSW5mbyBzdHJlYW1zX2luZm87Ci19dEJUSUZfQUNNX1NUT1A7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBTdHJlYW1SZWNvbmZpZyBzdHJlYW1zX2luZm87Ci19dEJUSUZfQUNNX1JFQ09ORklHOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUSUZfQUNNX0NPTk5fRElTQyBhY21fY29ubl9kaXNjOwotICB0QlRBX0FDTV9TVEFURV9JTkZPIHN0YXRlX2luZm87Ci0gIHRCVEFfQUNNX0NPTkZJR19JTkZPIGNvbmZpZ19pbmZvOwotICB0QlRJRl9BQ01fQ09OTkVDVCBhY21fY29ubmVjdDsKLSAgdEJUSUZfQUNNX0RJU0NPTk5FQ1QgYWNtX2Rpc2Nvbm5lY3Q7Ci0gIHRCVElGX0FDTV9TVEFSVCBhY21fc3RhcnQ7Ci0gIHRCVElGX0FDTV9TVE9QIGFjbV9zdG9wOwotICB0QlRJRl9BQ01fUkVDT05GSUcgYWNtX3JlY29uZmlnOwotfXRCVElGX0FDTTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgLyogUmV1c2UgQlRBX0FDTV9YWFhfRVZUIC0gTm8gbmVlZCB0byByZWRlZmluZSB0aGVtIGhlcmUgKi8KLSAgQlRJRl9BQ01fQ09OTkVDVF9SRVFfRVZUID0gQlRBX0FDTV9NQVhfRVZULAotICBCVElGX0FDTV9ESVNDT05ORUNUX1JFUV9FVlQsCi0gIEJUSUZfQUNNX1NUQVJUX1NUUkVBTV9SRVFfRVZULAotICBCVElGX0FDTV9TVE9QX1NUUkVBTV9SRVFfRVZULAotICBCVElGX0FDTV9TVVNQRU5EX1NUUkVBTV9SRVFfRVZULAotICBCVElGX0FDTV9SRUNPTkZJR19SRVFfRVZULAotfSBidGlmX2FjbV9zbV9ldmVudF90OwotCi10eXBlZGVmIGVudW0gewotICBCVEFfQ1NJUF9ORVdfU0VUX0ZPVU5EX0VWVCA9IDEsCi0gIEJUQV9DU0lQX1NFVF9NRU1CRVJfRk9VTkRfRVZULAotICBCVEFfQ1NJUF9DT05OX1NUQVRFX0NIR19FVlQsCi0gIEJUQV9DU0lQX0xPQ0tfU1RBVFVTX0NIQU5HRURfRVZULAotICBCVEFfQ1NJUF9MT0NLX0FWQUlMQUJMRV9FVlQsCi0gIEJUQV9DU0lQX1NFVF9TSVpFX0NIQU5HRUQsCi0gIEJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQsCi19IGJ0aWZfY3NpcF9zbV9ldmVudF90OwotCi0vKioKLSAqIFdoZW4gdGhlIGxvY2FsIGRldmljZSBpcyBBQ00gc291cmNlLCBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGFjdGl2ZSBwZWVyLgotICovCi1SYXdBZGRyZXNzIGJ0aWZfYWNtX3NvdXJjZV9hY3RpdmVfcGVlcih2b2lkKTsKLQotLyoqCi0gKiBXaGVuIHRoZSBsb2NhbCBkZXZpY2UgaXMgQUNNIHNpbmssIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYWN0aXZlIHBlZXIuCi0gKi8KLVJhd0FkZHJlc3MgYnRpZl9hY21fc2lua19hY3RpdmVfcGVlcih2b2lkKTsKLQotLyoqCi0gKiBTdGFydCBzdHJlYW1pbmcuCi0gKi8KLXZvaWQgYnRpZl9hY21fc3RyZWFtX3N0YXJ0KHZvaWQpOwotCi0vKioKLSAqIFN0b3Agc3RyZWFtaW5nLgotICoKLSAqIEBwYXJhbSBwZWVyX2FkZHJlc3MgdGhlIHBlZXIgYWRkcmVzcyBvciBSYXdBZGRyZXNzOjprRW1wdHkgdG8gc3RvcCBhbGwgcGVlcnMKLSAqLwotdm9pZCBidGlmX2FjbV9zdHJlYW1fc3RvcCh2b2lkKTsKLQotLyoqCi0gKiBTdXNwZW5kIHN0cmVhbWluZy4KLSAqLwotdm9pZCBidGlmX2FjbV9zdHJlYW1fc3VzcGVuZCh2b2lkKTsKLQotLyoqCi0gKiBTdGFydCBvZmZsb2FkIHN0cmVhbWluZy4KLSAqLwotdm9pZCBidGlmX2FjbV9zdHJlYW1fc3RhcnRfb2ZmbG9hZCh2b2lkKTsKLQotYm9vbCBidGlmX2FjbV9jaGVja19pZl9yZXF1ZXN0ZWRfZGV2aWNlc19zdG9wcGVkKHZvaWQpOwotCi0vKioKLSAqIEdldCB0aGUgU3RyZWFtIEVuZHBvaW50IFR5cGUgb2YgdGhlIEFjdGl2ZSBwZWVyLgotICoKLSAqIEByZXR1cm4gdGhlIHN0cmVhbSBlbmRwb2ludCB0eXBlOiBlaXRoZXIgQVZEVF9UU0VQX1NSQyBvciBBVkRUX1RTRVBfU05LCi0gKi8KLXVpbnQ4X3QgYnRpZl9hY21fZ2V0X3BlZXJfc2VwKHZvaWQpOwotCi0vKioKLQotICogUmVwb3J0IEFDTSBTb3VyY2UgQ29kZWMgU3RhdGUgZm9yIGEgcGVlci4KLSAqCi0gKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBwZWVyIHRvIHJlcG9ydAotICogQHBhcmFtIGNvZGVjX2NvbmZpZyB0aGUgY29kZWMgY29uZmlnIHRvIHJlcG9ydAotICogQHBhcmFtIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMgdGhlIGNvZGVjcyBsb2NhbCBjYXBhYmlsaXRpZXMgdG8gcmVwb3J0Ci0gKiBAcGFyYW0gY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzIHRoZSBjb2RlY3Mgc2VsZWN0YWJsZSBjYXBhYmlsaXRpZXMKLSAqIHRvIHJlcG9ydAotICovCi12b2lkIGJ0aWZfYWNtX3JlcG9ydF9zb3VyY2VfY29kZWNfc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgIGNvbnN0IENvZGVjQ29uZmlnJiBjb2RlY19jb25maWcsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+JiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiYKLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzLCBpbnQgY29udGV4dFR5cGUpOwotCi0vKioKLSAqIEluaXRpYWxpemUgLyBzaHV0IGRvd24gdGhlIEFDTSBJbml0aWF0b3Igc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gZW5hYmxlIHRydWUgdG8gZW5hYmxlIHRoZSBBQ00gU291cmNlIHNlcnZpY2UsIGZhbHNlIHRvIGRpc2FibGUgaXQKLSAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCi0gKi8KLWJ0X3N0YXR1c190IGJ0aWZfYWNtX2luaXRpYXRvcl9leGVjdXRlX3NlcnZpY2UoYm9vbCBlbmFibGUpOwotCi0vKioKLSAqIER1bXAgZGVidWctcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIEJUSUYgQUNNIG1vZHVsZS4KLSAqCi0gKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgZm9yIHdyaXRpbmcgdGhlIEFTQ0lJIGZvcm1hdHRlZAotICogaW5mb3JtYXRpb24KLSAqLwotdm9pZCBidGlmX2RlYnVnX2FjbV9kdW1wKGludCBmZCk7Ci0KLWJvb2wgYnRpZl9hY21faXNfYWN0aXZlKCk7Ci11aW50MTZfdCBidGlmX2FjbV9nZXRfc2FtcGxlX3JhdGUoKTsKLXVpbnQ4X3QgYnRpZl9hY21fZ2V0X2NoX21vZGUoKTsKLXVpbnQzMl90IGJ0aWZfYWNtX2dldF9iaXRyYXRlKCk7Ci11aW50MzJfdCBidGlmX2FjbV9nZXRfb2N0ZXRzKHVpbnQzMl90IGJpdF9yYXRlKTsKLXVpbnQxNl90IGJ0aWZfYWNtX2dldF9mcmFtZWxlbmd0aCgpOwotdWludDhfdCBidGlmX2FjbV9nZXRfY2hfY291bnQoKTsKLXVpbnQxNl90IGJ0aWZfYWNtX2dldF9jdXJyZW50X2FjdGl2ZV9wcm9maWxlKCk7Ci1ib29sIGJ0aWZfYWNtX2lzX2NvZGVjX3R5cGVfbGMzcSgpOwotdWludDhfdCBidGlmX2FjbV9sYzNxX3ZlcigpOwotYm9vbCBidGlmX2FjbV9pc19jYWxsX2FjdGl2ZSh2b2lkKTsKLQotI2VuZGlmIC8qIEJUSUZfQUNNX0ggKi8KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9hY21fc291cmNlLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9pbmNsdWRlL2J0aWZfYWNtX3NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAzYTY1Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9hY21fc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZiBBSElNX0VOQUJMRUQKLXZvaWQgYnRpZl9yZWdpc3Rlcl9jYigpOwotdm9pZCBidGlmX2FjbV9wcm9jZXNzX3JlcXVlc3QodEEyRFBfQ1RSTF9DTUQgY21kKTsKLXZvaWQgYnRpZl9hY21faGFuZGxlX2V2ZW50KHVpbnQxNl90IGV2ZW50LCBjaGFyKiBwX3BhcmFtKTsKLWJvb2wgYnRpZl9hY21fc291cmNlX3N0YXJ0X3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLWJvb2wgYnRpZl9hY21fc291cmNlX2VuZF9zZXNzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci1ib29sIGJ0aWZfYWNtX3NvdXJjZV9yZXN0YXJ0X3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgb2xkX3BlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbmV3X3BlZXJfYWRkcmVzcyk7Ci12b2lkIGJ0aWZfYWNtX3NvdXJjZV9jb21tYW5kX2Fjayh0QTJEUF9DVFJMX0NNRCBjbWQsIHRBMkRQX0NUUkxfQUNLIHN0YXR1cyk7Ci12b2lkIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdG9wcGVkKHRBMkRQX0NUUkxfQUNLIHN0YXR1cyk7Ci12b2lkIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQodEEyRFBfQ1RSTF9BQ0sgc3RhdHVzKTsKLWJvb2wgYnRpZl9hY21fb25fc3RhcnRlZCh0QTJEUF9DVFJMX0FDSyBzdGF0dXMpOwotYnRfc3RhdHVzX3QgYnRpZl9hY21fc291cmNlX3NldHVwX2NvZGVjKCk7Ci1ib29sIGJ0aWZfYWNtX3VwZGF0ZV9zaW5rX2xhdGVuY3lfY2hhbmdlKHVpbnQxNl90IHNpbmtfbGF0ZW5jeSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX2JhcF9icm9hZGNhc3QuaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9iYXBfYnJvYWRjYXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYmY5NmQuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX2JhcF9icm9hZGNhc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRpZl9iYXBfYnJvYWRjYXN0LmgKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgTWFpbiBBUEkgaGVhZGVyIGZpbGUgZm9yIGFsbCBCVElGIEJBUCBCcm9hZGNhc3QgZnVuY3Rpb25zCi0gKiAgICAgICAgICAgICAgICAgYWNjZXNzZWQgZnJvbSBpbnRlcm5hbCBzdGFjay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUSUZfQkFQX0JST0FEQ0FTVF9ICi0jZGVmaW5lIEJUSUZfQkFQX0JST0FEQ0FTVF9ICi0KLSNpbmNsdWRlICJidGFfYXZfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3NtLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIGRlZmluaXRpb25zIGZvciBjYWxsYmFjayBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIFJldXNlIEJUQV9BVl9YWFhfRVZUIC0gTm8gbmVlZCB0byByZWRlZmluZSB0aGVtIGhlcmUgKi8KLSAgQlRJRl9CQVBfQlJPQURDQVNUX0VOQUJMRV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9ESVNBQkxFX0VWVCwKLSAgQlRJRl9CQVBfQlJPQURDQVNUX1NUQVJUX1NUUkVBTV9SRVFfRVZULAotICBCVElGX0JBUF9CUk9BRENBU1RfU1RPUF9TVFJFQU1fUkVRX0VWVCwKLSAgQlRJRl9CQVBfQlJPQURDQVNUX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9TT1VSQ0VfQ09ORklHX1JFUV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9DTEVBTlVQX1JFUV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRfQUNUSVZFX1JFUV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9SRU1PVkVfQUNUSVZFX1JFUV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRVUF9JU09fREFUQVBBVEhfRVZULAotICBCVElGX0JBUF9CUk9BRENBU1RfUkVNT1ZFX0lTT19EQVRBUEFUSF9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9HRU5FUkFURV9FTkNfS0VZX0VWVCwKLSAgQlRJRl9CQVBfQlJPQURDQVNUX0JJU0VTX1NFVFVQX0VWVCwKLSAgQlRJRl9CQVBfQlJPQURDQVNUX0JJU0VTX1JFTU9WRV9FVlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9CSUdfU0VUVVBfRVZULAotICBCVElGX0JBUF9CUk9BRENBU1RfQklHX1JFTU9WRURfRVZULAotICBCVElGX0JBUF9CUk9BRENBU1RfU0VUVVBfTkVYVF9CSVNfRVZFTlQsCi0gIEJUSUZfQkFQX0JST0FEQ0FTVF9QUk9DRVNTX0hJRExfUkVRX0VWVCwKLX0gYnRpZl9iYXBfYnJvYWRjYXN0X3NtX2V2ZW50X3Q7Ci0KLWVudW0gewotICBCVEJBUF9DT0RFQ19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPID0gMHgwMSA8PCAyLAotICBCVEJBUF9DT0RFQ19DSEFOTkVMX01PREVfRFVBTF9NT05PID0gMHgxIDw8IDMKLX07Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEJUSUYgQVYgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidGlmX2JhcF9icm9hZGNhc3RfaXNfYWN0aXZlKCk7Ci0KLXVpbnQxNl90IGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfc2FtcGxlX3JhdGUoKTsKLXVpbnQ4X3QgYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9jaF9tb2RlKCk7Ci11aW50MTZfdCBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X2ZyYW1lbGVuZ3RoKCk7Ci11aW50MzJfdCBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X210dSh1aW50MzJfdCBiaXRyYXRlKTsKLXVpbnQzMl90IGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfYml0cmF0ZSgpOwotdWludDhfdCBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X2NoX2NvdW50KCk7Ci1ib29sIGJ0aWZfYmFwX2Jyb2FkY2FzdF9pc19zaW11bGNhc3RfZW5hYmxlZCgpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0aWZfZGlzcGF0Y2hfc21fZXZlbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgZXZlbnQgdG8gQVYgc3RhdGVtYWNoaW5lCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdXNlZCB0byBwYXNzIGV2ZW50cyB0byBBViBzdGF0ZW1hY2hpbmUgZnJvbSBvdGhlciB0YXNrcyAqLwotdm9pZCBidGlmX2JhcF9iYV9kaXNwYXRjaF9zbV9ldmVudChidGlmX2JhcF9icm9hZGNhc3Rfc21fZXZlbnRfdCBldmVudCwgdm9pZCAqcF9kYXRhLCBpbnQgbGVuKTsKLQotCi0jZW5kaWYgLyogQlRJRl9CQVBfQlJPQURDQVNUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX2JhcF9jb2RlY191dGlscy5oIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX2JhcF9jb2RlY191dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU3MjY4Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9iYXBfY29kZWNfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfcGFjc19jbGllbnQuaD4KLSNpbmNsdWRlICJidF90eXBlcy5oIgotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDb25maWc7Ci0KLWJvb2wgVXBkYXRlQ2FwYVN1cEZyYW1lRHVyYXRpb25zKENvZGVjQ29uZmlnICpjb25maWcgLCB1aW50OF90IHN1cF9mcmFtZSk7Ci0KLWJvb2wgVXBkYXRlQ2FwYU1heFN1cExjM0ZyYW1lcyhDb2RlY0NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9zdXBfbGMzX2ZyYW1lcyk7Ci0KLQotYm9vbCBVcGRhdGVDYXBhUHJlZmVycmVkQ29udGV4dHMoQ29kZWNDb25maWcgKmNvbmZpZywgdWludDE2X3QgY29udGV4dHMpOwotCi0KLWJvb2wgVXBkYXRlQ2FwYVN1cE9jdHNQZXJGcmFtZShDb2RlY0NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2N0c19wZXJfZnJhbWUpOwotCi1ib29sIFVwZGF0ZUNhcGFWZW5kb3JNZXRhRGF0YUxjM1FQcmVmKENvZGVjQ29uZmlnICpjb25maWcsIGJvb2wgbGMzcV9wcmVmKTsKLQotYm9vbCBVcGRhdGVDYXBhVmVuZG9yTWV0YURhdGFMYzNRVmVyKENvZGVjQ29uZmlnICpjb25maWcsIHVpbnQ4X3QgbGMzcV92ZXIpOwotCi11aW50OF90IEdldENhcGFTdXBGcmFtZUR1cmF0aW9ucyhDb2RlY0NvbmZpZyAqY29uZmlnKTsKLQotdWludDhfdCBHZXRDYXBhTWF4U3VwTGMzRnJhbWVzKENvZGVjQ29uZmlnICpjb25maWcpOwotCi11aW50MTZfdCBHZXRDYXBhUHJlZmVycmVkQ29udGV4dHMoQ29kZWNDb25maWcgKmNvbmZpZyk7Ci0KLXVpbnQzMl90IEdldENhcGFTdXBPY3RzUGVyRnJhbWUoQ29kZWNDb25maWcgKmNvbmZpZyk7Ci0KLWJvb2wgR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoQ29kZWNDb25maWcgKmNvbmZpZyk7Ci0KLXVpbnQ4X3QgR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcihDb2RlY0NvbmZpZyAqY29uZmlnKTsKLQotLy8gY29uZmlndXJhdGlvbnMKLWJvb2wgVXBkYXRlRnJhbWVEdXJhdGlvbihDb2RlY0NvbmZpZyAqY29uZmlnICwgdWludDhfdCBmcmFtZV9kdXIpOwotCi1ib29sIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdShDb2RlY0NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxjM19ibG9ja3NfcGVyX3NkdSkgOwotCi1ib29sIFVwZGF0ZU9jdHNQZXJGcmFtZShDb2RlY0NvbmZpZyAqY29uZmlnICwgdWludDE2X3Qgb2N0c19wZXJfZnJhbWUpOwotCi1ib29sIFVwZGF0ZUxjM1FQcmVmZXJlbmNlKENvZGVjQ29uZmlnICpjb25maWcgLCBib29sIGxjM3FfcHJlZik7Ci0KLWJvb2wgVXBkYXRlVmVuZG9yTWV0YURhdGFMYzNRUHJlZihDb2RlY0NvbmZpZyAqY29uZmlnLCBib29sIGxjM3FfcHJlZik7Ci0KLWJvb2wgVXBkYXRlVmVuZG9yTWV0YURhdGFMYzNRVmVyKENvZGVjQ29uZmlnICpjb25maWcsIHVpbnQ4X3QgbGMzcV92ZXIpOwotCi1ib29sIFVwZGF0ZVByZWZlcnJlZEF1ZGlvQ29udGV4dChDb2RlY0NvbmZpZyAqY29uZmlnICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByZWZfYXVkaW9fY29udGV4dCk7Ci0KLXVpbnQ4X3QgR2V0RnJhbWVEdXJhdGlvbihDb2RlY0NvbmZpZyAqY29uZmlnKTsKLQotdWludDhfdCBHZXRMYzNCbG9ja3NQZXJTZHUoQ29kZWNDb25maWcgKmNvbmZpZyk7Ci0KLXVpbnQxNl90IEdldE9jdHNQZXJGcmFtZShDb2RlY0NvbmZpZyAqY29uZmlnKTsKLQotdWludDhfdCBHZXRMYzNRUHJlZmVyZW5jZShDb2RlY0NvbmZpZyAqY29uZmlnKTsKLQotdWludDhfdCBHZXRWZW5kb3JNZXRhRGF0YUxjM1FQcmVmKENvZGVjQ29uZmlnICpjb25maWcpOwotCi11aW50OF90IEdldFZlbmRvck1ldGFEYXRhTGMzUVZlcihDb2RlY0NvbmZpZyAqY29uZmlnKTsKLQotdWludDE2X3QgR2V0UHJlZmVycmVkQXVkaW9Db250ZXh0KENvZGVjQ29uZmlnICpjb25maWcpOwotCi1ib29sIElzQ29kZWNDb25maWdFcXVhbChDb2RlY0NvbmZpZyAqc3JjX2NvbmZpZywgQ29kZWNDb25maWcgKmRzdF9jb25maWcpOwotCi0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9iYXBfY29uZmlnLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9pbmNsdWRlL2J0aWZfYmFwX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODNiOGU5Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9iYXBfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0jaW5jbHVkZSAiYnRfdHlwZXMuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ29uZmlnOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjRGlyZWN0aW9uOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjSW5kZXg7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFJFQ19UWVBFX0NBUEFCSUxJVFkgPSAweDAxLAotICBSRUNfVFlQRV9DT05GSUdVUkFUSU9OCi19IGJ0aWZfYmFwX3JlY29yZF90eXBlX3Q7Ci0KLWNvbnN0IGNoYXIgQlRJRl9CQVBfQ09ORklHX01PRFVMRVtdID0gImJ0aWZfYmFwX2NvbmZpZ19tb2R1bGUiOwotCi10eXBlZGVmIHN0cnVjdCBidGlmX2JhcF9jb25maWdfc2VjdGlvbl9pdGVyX3QgYnRpZl9iYXBfY29uZmlnX3NlY3Rpb25faXRlcl90OwotCi1ib29sIGJ0aWZfYmFwX2FkZF9yZWNvcmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2JhcF9yZWNvcmRfdHlwZV90IHJlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0RpcmVjdGlvbiBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDb25maWcgKnJlY29yZCk7Ci0KLWJvb2wgYnRpZl9iYXBfcmVtb3ZlX3JlY29yZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYmFwX3JlY29yZF90eXBlX3QgcmVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjRGlyZWN0aW9uIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0NvbmZpZyAqcmVjb3JkKTsKLQotYm9vbCBidGlmX2JhcF9yZW1vdmVfcmVjb3JkX2J5X2NvbnRleHQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYmFwX3JlY29yZF90eXBlX3QgcmVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0RpcmVjdGlvbiBkaXJlY3Rpb24pOwotCi1ib29sIGJ0aWZfYmFwX3JlbW92ZV9hbGxfcmVjb3Jkcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotYm9vbCBidGlmX2JhcF9nZXRfcmVjb3Jkcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2JhcF9yZWNvcmRfdHlwZV90IHJlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjRGlyZWN0aW9uIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+ICpwYWNfcmVjb3Jkcyk7Ci0KLWJvb2wgYnRpZl9iYXBfYWRkX2F1ZGlvX2xvYyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjRGlyZWN0aW9uIGRpcmVjdGlvbiwgdWludDMyX3QgYXVkaW9fbG9jKTsKLQotYm9vbCBidGlmX2JhcF9yZW1fYXVkaW9fbG9jKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNEaXJlY3Rpb24gZGlyZWN0aW9uKTsKLQotYm9vbCBidGlmX2JhcF9hZGRfc3VwcF9jb250ZXh0cyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1cHBfY29udGV4dHMpOwotCi1ib29sIGJ0aWZfYmFwX2dldF9zdXBwX2NvbnRleHRzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc3VwcF9jb250ZXh0cyk7Ci0KLWJvb2wgYnRpZl9iYXBfcmVtX3N1cHBfY29udGV4dHMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLWJvb2wgYnRpZl9iYXBfY29uZmlnX2NsZWFyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX2RtX2Fkdl9hdWRpby5oIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX2RtX2Fkdl9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjg4NjMzLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl9kbV9hZHZfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlRJRl9ETV9BRFZfQVVESU9fSAotI2RlZmluZSBCVElGX0RNX0FEVl9BVURJT19ICi0KLWV4dGVybiBzdGQ6OnVub3JkZXJlZF9tYXA8UmF3QWRkcmVzcywgdWludDMyX3Q+IGFkdl9hdWRpb19kZXZpY2VfZGI7Ci1leHRlcm4gdEJUQV9UUkFOU1BPUlQgYnRpZl9kbV9nZXRfYWR2X2F1ZGlvX3RyYW5zcG9ydChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0aWZfZG1fbGVhX3NlYXJjaF9zZXJ2aWNlc19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pOwotZXh0ZXJuIHZvaWQgYnRpZl9yZWdpc3Rlcl91dWlkX3NydmNfZGlzYyhibHVldG9vdGg6OlV1aWQgdXVpZCk7Ci1leHRlcm4gYm9vbCBjaGVja19hZHZfYXVkaW9fY29kKHVpbnQzMl90IGNvZCk7Ci1leHRlcm4gYm9vbCBpc19yZW1vdGVfc3VwcG9ydF9hZHZfYXVkaW8oY29uc3QgUmF3QWRkcmVzcyBwX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRlX2RtX2Fkdl9hdWRpb19zZWFyY2hfc2VydmljZXNfZXZ0KHRCVEFfRE1fU0VBUkNIX0VWVCBldmVudCwKLSAgICB0QlRBX0RNX1NFQVJDSCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJ0aWZfZG1fcmVsZWFzZV9hY3Rpb25fdXVpZChSYXdBZGRyZXNzIGJkX2FkZHIpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX3ZtY3AuaCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2luY2x1ZGUvYnRpZl92bWNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjcyYmYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvaW5jbHVkZS9idGlmX3ZtY3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9wYWNzX2NsaWVudC5oIgotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNTYW1wbGVSYXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjSW5kZXg7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNGcmFtZUR1cmF0aW9uOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ29uZmlnOwotCi0jZGVmaW5lIEJBUCAgICAgICAgMHgwMQotI2RlZmluZSBHQ1AgICAgICAgIDB4MDIKLSNkZWZpbmUgV01DUCAgICAgICAweDA0Ci0jZGVmaW5lIFZNQ1AgICAgICAgMHgwOAotI2RlZmluZSBCQVBfQ0FMTCAgIDB4MTAKLSNkZWZpbmUgR0NQX1RYX1JYICAweDIwCi0KLSNkZWZpbmUgRUJfQ09ORklHICAgICAgICAgICAxCi0jZGVmaW5lIFNURVJFT19IU19DT05GSUdfMSAgMgotI2RlZmluZSBTVEVSRU9fSFNfQ09ORklHXzIgIDMKLQotI2RlZmluZSBWT0lDRV9DT05URVhUICAgICAxCi0jZGVmaW5lIE1FRElBX0NPTlRFWFQgICAgIDIKLSNkZWZpbmUgTUVESUFfTExfQ09OVEVYVCAgMwotI2RlZmluZSBNRURJQV9IUl9DT05URVhUICA0Ci0KLSNkZWZpbmUgU0FNUExFX1JBVEVfODAwMCAgIDgwMDAKLSNkZWZpbmUgU0FNUExFX1JBVEVfMTYwMDAgMTYwMDAKLSNkZWZpbmUgU0FNUExFX1JBVEVfMjQwMDAgMjQwMDAKLSNkZWZpbmUgU0FNUExFX1JBVEVfMzIwMDAgMzIwMDAKLSNkZWZpbmUgU0FNUExFX1JBVEVfNDQxMDAgNDQxMDAKLSNkZWZpbmUgU0FNUExFX1JBVEVfNDgwMDAgNDgwMDAKLQotCi0jZGVmaW5lIEZSTV9EVVJBVElPTl83XzVfTVMgICA3LjUKLSNkZWZpbmUgRlJNX0RVUkFUSU9OXzEwX01TICAgICAxMAotCi0jZGVmaW5lIE9DVF9QRVJfQ09ERUNfRlJNXzI2ICAgICAyNgotI2RlZmluZSBPQ1RfUEVSX0NPREVDX0ZSTV8zMCAgICAgMzAKLSNkZWZpbmUgT0NUX1BFUl9DT0RFQ19GUk1fNjAgICAgIDYwCi0jZGVmaW5lIE9DVF9QRVJfQ09ERUNfRlJNXzc1ICAgICA3NQotI2RlZmluZSBPQ1RfUEVSX0NPREVDX0ZSTV84MCAgICAgODAKLSNkZWZpbmUgT0NUX1BFUl9DT0RFQ19GUk1fOTAgICAgIDkwCi0jZGVmaW5lIE9DVF9QRVJfQ09ERUNfRlJNXzk4ICAgICA5OAotI2RlZmluZSBPQ1RfUEVSX0NPREVDX0ZSTV8xMDAgICAxMDAKLSNkZWZpbmUgT0NUX1BFUl9DT0RFQ19GUk1fMTE3ICAgMTE3Ci0jZGVmaW5lIE9DVF9QRVJfQ09ERUNfRlJNXzEyMCAgIDEyMAotI2RlZmluZSBPQ1RfUEVSX0NPREVDX0ZSTV8xMzAgICAxMzAKLSNkZWZpbmUgT0NUX1BFUl9DT0RFQ19GUk1fMTUwICAgMTUwCi0jZGVmaW5lIE9DVF9QRVJfQ09ERUNfRlJNXzE1NSAgIDE1NQotCi0jZGVmaW5lIFVORlJBTUVEIDAKLSNkZWZpbmUgRlJBTUVEICAgMQotCi0jZGVmaW5lIFJFVFJBTlNfTk9fMiAgICAgMgotI2RlZmluZSBSRVRSQU5TX05PXzUgICAgIDUKLSNkZWZpbmUgUkVUUkFOU19OT183ICAgICA3Ci0jZGVmaW5lIFJFVFJBTlNfTk9fMTEgICAxMQotI2RlZmluZSBSRVRSQU5TX05PXzEzICAgMTMKLSNkZWZpbmUgUkVUUkFOU19OT18yMyAgIDIzCi0jZGVmaW5lIFJFVFJBTlNfTk9fMjkgICAyOQotI2RlZmluZSBSRVRSQU5TX05PXzM1ICAgMzUKLSNkZWZpbmUgUkVUUkFOU19OT180MSAgIDQxCi0jZGVmaW5lIFJFVFJBTlNfTk9fNDcgICA0NwotI2RlZmluZSBSRVRSQU5TX05PXzUzICAgNTMKLQotI2RlZmluZSBNQVhfVFJBTlNfTEFUX01TXzggICAgICA4Ci0jZGVmaW5lIE1BWF9UUkFOU19MQVRfTVNfMTAgICAgMTAKLSNkZWZpbmUgTUFYX1RSQU5TX0xBVF9NU18xNSAgICAxNQotI2RlZmluZSBNQVhfVFJBTlNfTEFUX01TXzIwICAgIDIwCi0jZGVmaW5lIE1BWF9UUkFOU19MQVRfTVNfMjQgICAgMjQKLSNkZWZpbmUgTUFYX1RSQU5TX0xBVF9NU18yNSAgICAyNQotI2RlZmluZSBNQVhfVFJBTlNfTEFUX01TXzMxICAgIDMxCi0jZGVmaW5lIE1BWF9UUkFOU19MQVRfTVNfMzMgICAgMzMKLSNkZWZpbmUgTUFYX1RSQU5TX0xBVF9NU180NSAgICA0NQotI2RlZmluZSBNQVhfVFJBTlNfTEFUX01TXzU0ICAgIDU0Ci0jZGVmaW5lIE1BWF9UUkFOU19MQVRfTVNfNjAgICAgNjAKLSNkZWZpbmUgTUFYX1RSQU5TX0xBVF9NU183MSAgICA3MQotI2RlZmluZSBNQVhfVFJBTlNfTEFUX01TXzk1ICAgIDk1Ci0KLSNkZWZpbmUgUFJFU19ERUxBWV8yMF9NUyAgICAyMAotI2RlZmluZSBQUkVTX0RFTEFZXzI1X01TICAgIDI1Ci0jZGVmaW5lIFBSRVNfREVMQVlfNDBfTVMgICAgNDAKLQotI2RlZmluZSBMRUFVRElPX0NPTkZJR19QQVRIICIvc3lzdGVtX2V4dC9ldGMvYmx1ZXRvb3RoL2xlYXVkaW9fY29uZmlncy54bWwiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vLyBmb3Igc3RvcmluZyBjb2RlYyBjb25maWcgYXMgaXQgaXMgcmVhZCBmcm9tIHhtbAotc3RydWN0IGNvZGVjX2NvbmZpZwotewotICAgIHVpbnQzMl90IGZyZXFfaW5faHo7Ci0gICAgZmxvYXQgZnJhbWVfZHVyX21zZWNzOwotICAgIHVpbnQ4X3Qgb2N0X3Blcl9jb2RlY19mcm07Ci0gICAgdWludDhfdCBtYW5kYXRvcnk7Ci19OwotCi0vLyBmb3Igc3RvcmluZyBRb1Mgc2V0dGluZ3MgYXMgaXQgaXMgcmVhZCBmcm9tIHhtbAotc3RydWN0IHFvc19jb25maWcKLXsKLSAgICB1aW50MzJfdCBmcmVxX2luX2h6OwotICAgIHVpbnQzMl90IHNkdV9pbnRfbWljcm9fc2VjczsKLSAgICB1aW50OF90IGZyYW1pbmc7Ci0gICAgdWludDhfdCBtYXhfc2R1X3NpemU7Ci0gICAgdWludDhfdCByZXRyYW5zX251bTsKLSAgICB1aW50OF90IG1heF90cmFuc19sYXQ7Ci0gICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2RlbGF5OwotICAgIHVpbnQ4X3QgbWFuZGF0b3J5OwotfTsKLQotCi0vLyBRb1MgY29uZmlndXJhdGlvbiBpbiB0aGUgc3RydWN0dXJlIG5lZWRlZCBieSBBQ00KLXN0cnVjdCBRb1NDb25maWcKLXsKLSAgICBDb2RlY1NhbXBsZVJhdGUgc2FtcGxlX3JhdGU7Ci0gICAgdWludDMyX3Qgc2R1X2ludF9taWNyb19zZWNzOwotICAgIHVpbnQ4X3QgZnJhbWluZzsKLSAgICB1aW50OF90IG1heF9zZHVfc2l6ZTsKLSAgICB1aW50OF90IHJldHJhbnNfbnVtOwotICAgIHVpbnQ4X3QgbWF4X3RyYW5zX2xhdDsKLSAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fZGVsYXk7Ci0gICAgdWludDhfdCBtYW5kYXRvcnk7Ci19Owotdm9pZCBidGlmX3ZtY3BfaW5pdCgpOwotCi12ZWN0b3I8Q29kZWNDb25maWc+IGdldF9hbGxfY29kZWNfY29uZmlncyh1aW50OF90IHByb2ZpbGUsIHVpbnQ4X3QgY29udGV4dCk7Ci12ZWN0b3I8Q29kZWNDb25maWc+IGdldF9wcmVmZXJyZWRfY29kZWNfY29uZmlncyh1aW50OF90IHByb2ZpbGUsIHVpbnQ4X3QgY29udGV4dCk7Ci0KLXZlY3RvcjxRb1NDb25maWc+IGdldF9hbGxfcW9zX3BhcmFtcyh1aW50OF90IHByb2ZpbGUsIHVpbnQ4X3QgY29udGV4dCk7Ci12ZWN0b3I8UW9TQ29uZmlnPiBnZXRfcW9zX3BhcmFtc19mb3JfY29kZWModWludDhfdCBwcm9maWxlLCB1aW50OF90IGNvbnRleHQsIENvZGVjU2FtcGxlUmF0ZSBmcmVxLCB1aW50OF90IGZyYW1lX2R1ciwgdWludDhfdCBvY3RldHMpOwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvbGVhdWRpb19jb25maWdzLnhtbCBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL2xlYXVkaW9fY29uZmlncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzFkNmYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvbGVhdWRpb19jb25maWdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi08IS0tCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS0tPgotPExFQXVkaW9Db25maWc+Ci08Vk1DUFJvbGVzPiA8L1ZNQ1BSb2xlcz4KLQotPFZNQ1A+Ci0JPENvZGVjQ2FwYWJpbGl0aWVzRm9yVm9pY2U+Ci0JCTxDb2RlY1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej44MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8RnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPjc1MDA8L0ZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4KLQkJCTxPY3RldHNQZXJDb2RlY0ZyYW1lPjI2PC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQkJPENvZGVjU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+MTAwMDA8L0ZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4KLQkJCTxPY3RldHNQZXJDb2RlY0ZyYW1lPjMwPC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQkJPENvZGVjU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8RnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPjc1MDA8L0ZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4KLQkJCTxPY3RldHNQZXJDb2RlY0ZyYW1lPjYwPC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQkJPENvZGVjU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8RnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPjEwMDAwPC9GcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+Ci0JCQk8T2N0ZXRzUGVyQ29kZWNGcmFtZT44MDwvT2N0ZXRzUGVyQ29kZWNGcmFtZT4KLQkJCTxNYW5kYXRvcnk+MTwvTWFuZGF0b3J5PgotCQk8L0NvZGVjU2V0dGluZ3M+Ci0JPC9Db2RlY0NhcGFiaWxpdGllc0ZvclZvaWNlPgotCi0JPENvZGVjQ2FwYWJpbGl0aWVzRm9yTWVkaWE+Ci0JCTxDb2RlY1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPEZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz43NTAwPC9GcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+Ci0JCQk8T2N0ZXRzUGVyQ29kZWNGcmFtZT43NTwvT2N0ZXRzUGVyQ29kZWNGcmFtZT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L0NvZGVjU2V0dGluZ3M+Ci0JCTxDb2RlY1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPEZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4xMDAwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+MTAwPC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4xPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQkJPENvZGVjU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8RnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPjc1MDA8L0ZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4KLQkJCTxPY3RldHNQZXJDb2RlY0ZyYW1lPjkwPC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQkJPENvZGVjU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8RnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPjEwMDAwPC9GcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+Ci0JCQk8T2N0ZXRzUGVyQ29kZWNGcmFtZT4xMjA8L09jdGV0c1BlckNvZGVjRnJhbWU+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Db2RlY1NldHRpbmdzPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+NzUwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+MTE3PC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQkJPENvZGVjU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8RnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPjEwMDAwPC9GcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+Ci0JCQk8T2N0ZXRzUGVyQ29kZWNGcmFtZT4xNTU8L09jdGV0c1BlckNvZGVjRnJhbWU+Ci0JCQk8TWFuZGF0b3J5PjE8L01hbmRhdG9yeT4KLQkJPC9Db2RlY1NldHRpbmdzPgotCTwvQ29kZWNDYXBhYmlsaXRpZXNGb3JNZWRpYT4KLQotCTxRb3NTZXR0aW5nc0Zvckxvd0xhdGVuY3lWb2ljZT4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej44MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjI2PC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjI8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+ODwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej44MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4zMDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4yPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjEwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjIwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjYwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjI8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+ODwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjE8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4zMjAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+ODA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4xMDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjE8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQk8L1Fvc1NldHRpbmdzRm9yTG93TGF0ZW5jeVZvaWNlPgotCTxRb3NTZXR0aW5nc0Zvckxvd0xhdGVuY3lNZWRpYT4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT43NTwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj41PC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjE1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjIwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xMDA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+NTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4yMDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjE8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT45MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj41PC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjE1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjIwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xMjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+NTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4yMDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xMTc8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+NTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4xNTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MTU1PC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjU8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+MjA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+MjAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JPC9Rb3NTZXR0aW5nc0Zvckxvd0xhdGVuY3lNZWRpYT4KLQk8UW9zU2V0dGluZ3NGb3JIaWdoUmVsaWFiaWxpdHlNZWRpYT4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT43NTwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4yMzwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT40NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yMDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MTAwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjIzPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjYwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjIwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MTwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjkwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjIzPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjQ1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjIwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xMjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NjA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+MjAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MTE3PC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjIzPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjQ1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjIwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xNTU8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NjA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+MjAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JPC9Rb3NTZXR0aW5nc0ZvckhpZ2hSZWxpYWJpbGl0eU1lZGlhPgotPC9WTUNQPgotCi08QkFQPgotCTxDb2RlY0NhcGFiaWxpdGllc0ZvclZvaWNlPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MzIwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+MTAwMDA8L0ZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4KLQkJCTxPY3RldHNQZXJDb2RlY0ZyYW1lPjgwPC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQk8L0NvZGVjQ2FwYWJpbGl0aWVzRm9yVm9pY2U+Ci0JPENvZGVjQ2FwYWJpbGl0aWVzRm9yTWVkaWE+Ci0JCTxDb2RlY1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPEZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4xMDAwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+MTAwPC9PY3RldHNQZXJDb2RlY0ZyYW1lPgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvQ29kZWNTZXR0aW5ncz4KLQk8L0NvZGVjQ2FwYWJpbGl0aWVzRm9yTWVkaWE+Ci0JPFFvc1NldHRpbmdzRm9yTG93TGF0ZW5jeVZvaWNlPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT44MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4yPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjEwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCTwvUW9zU2V0dGluZ3NGb3JMb3dMYXRlbmN5Vm9pY2U+Ci0JPFFvc1NldHRpbmdzRm9yTG93TGF0ZW5jeU1lZGlhPgotCSAgICA8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MjY8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT44PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjEwMDAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjMwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjI8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+MTA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MTYwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MzA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT44PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjE2MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT40MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4yPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjEwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjI0MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjQ1PC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjI8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+ODwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4yNDAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4xMDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT43NTwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj41PC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjE1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xMDA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MTU8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NzA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+OTA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+NTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4xNTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MTIwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjU8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+MjA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MzIwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT44PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT44MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4yPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjEwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjExNzwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj41PC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjE1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xNTU8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MTM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+MTAwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCTwvUW9zU2V0dGluZ3NGb3JMb3dMYXRlbmN5TWVkaWE+Ci0JPFFvc1NldHRpbmdzRm9ySGlnaFJlbGlhYmlsaXR5TWVkaWE+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4yNjwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj40MTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT40NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej44MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4zMDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj41MzwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT42MDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4xNjAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4zMDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj40MTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT40NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4xNjAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NDA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+NDc8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NjA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4xPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MjQwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NDU8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MzU8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NDU8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MjQwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjEwMDAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjYwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjQxPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjYwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjYwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjI5PC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjQ1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjMyMDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT44MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4zNTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT42MDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT43NTwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4yMzwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT40NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MTAwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjIzPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjYwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjkwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjIzPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjQ1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xMjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NjA8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+MTE3PC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjIzPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjQ1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjQ4MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4xNTU8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MTM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+MTAwPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjQwMDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCTwvUW9zU2V0dGluZ3NGb3JIaWdoUmVsaWFiaWxpdHlNZWRpYT4KLTwvQkFQPgotCi08R0NQPgotCTxDb2RlY0NhcGFiaWxpdGllc0ZvclZvaWNlPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MTYwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+NzUwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+NjA8L09jdGV0c1BlckNvZGVjRnJhbWU+Ci0JCQk8TWFuZGF0b3J5PjE8L01hbmRhdG9yeT4KLQkJPC9Db2RlY1NldHRpbmdzPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MTYwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+NzUwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+NjA8L09jdGV0c1BlckNvZGVjRnJhbWU+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Db2RlY1NldHRpbmdzPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MTYwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+NzUwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+MzA8L09jdGV0c1BlckNvZGVjRnJhbWU+Ci0JCQk8TWFuZGF0b3J5PjE8L01hbmRhdG9yeT4KLQkJPC9Db2RlY1NldHRpbmdzPgotCTwvQ29kZWNDYXBhYmlsaXRpZXNGb3JWb2ljZT4KLQotCTxDb2RlY0NhcGFiaWxpdGllc0Zvck1lZGlhPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+NzUwMDwvRnJhbWVEdXJhdGlvbkluTWljcm9TZWNzPgotCQkJPE9jdGV0c1BlckNvZGVjRnJhbWU+NzU8L09jdGV0c1BlckNvZGVjRnJhbWU+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Db2RlY1NldHRpbmdzPgotCTwvQ29kZWNDYXBhYmlsaXRpZXNGb3JNZWRpYT4KLQotCTxRb3NTZXR0aW5nc0Zvckxvd0xhdGVuY3lWb2ljZT4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4xNjAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTUwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MjwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT44PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjI1MDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MTwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjE2MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xNTAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT42MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj43PC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjI1PC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjI1MDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjE2MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz43NTAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjMwPC9NYXhTRFVTaXplPgotCQkJPFJldHJhbnNtaXNzaW9uTnVtYmVyPjExPC9SZXRyYW5zbWlzc2lvbk51bWJlcj4KLQkJCTxNYXhUcmFuc3BvcnRMYXRlbmN5PjMzPC9NYXhUcmFuc3BvcnRMYXRlbmN5PgotCQkJPFByZXNlbnRhdGlvbkRlbGF5PjI1MDAwPC9QcmVzZW50YXRpb25EZWxheT4KLQkJCTxNYW5kYXRvcnk+MTwvTWFuZGF0b3J5PgotCQk8L1FvU1NldHRpbmdzPgotCTwvUW9zU2V0dGluZ3NGb3JMb3dMYXRlbmN5Vm9pY2U+Ci0KLQk8UW9zU2V0dGluZ3NGb3JMb3dMYXRlbmN5TWVkaWE+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NzU8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+NTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT4xMjwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yNTAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQk8L1Fvc1NldHRpbmdzRm9yTG93TGF0ZW5jeU1lZGlhPgotPC9HQ1A+Ci0KLTxXTUNQPgotCTxDb2RlY0NhcGFiaWxpdGllc0Zvck1lZGlhPgotCQk8Q29kZWNTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxGcmFtZUR1cmF0aW9uSW5NaWNyb1NlY3M+MTAwMDA8L0ZyYW1lRHVyYXRpb25Jbk1pY3JvU2Vjcz4KLQkJCTxPY3RldHNQZXJDb2RlY0ZyYW1lPjEwMDwvT2N0ZXRzUGVyQ29kZWNGcmFtZT4KLQkJCTxNYW5kYXRvcnk+MDwvTWFuZGF0b3J5PgotCQk8L0NvZGVjU2V0dGluZ3M+Ci0JPC9Db2RlY0NhcGFiaWxpdGllc0Zvck1lZGlhPgotICAgIDxRb3NTZXR0aW5nc0ZvckhpZ2hSZWxpYWJpbGl0eU1lZGlhPgotCQk8UW9TU2V0dGluZ3M+Ci0JCQk8U2FtcGxpbmdGcmVxdWVuY3lJbkh6PjE2MDAwPC9TYW1wbGluZ0ZyZXF1ZW5jeUluSHo+Ci0JCQk8U0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4xMDAwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT40MDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4xMzwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT45NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4xNjAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT4zMDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4xMzwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT43NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej4zMjAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+MTAwMDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+ODA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MTM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+OTU8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+MzIwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjc1MDA8L1NEVUludGVydmFsSW5NaWNyb1NlY3M+Ci0JCQk8RnJhbWluZz4wPC9GcmFtaW5nPgotCQkJPE1heFNEVVNpemU+NjA8L01heFNEVVNpemU+Ci0JCQk8UmV0cmFuc21pc3Npb25OdW1iZXI+MTM8L1JldHJhbnNtaXNzaW9uTnVtYmVyPgotCQkJPE1heFRyYW5zcG9ydExhdGVuY3k+NzU8L01heFRyYW5zcG9ydExhdGVuY3k+Ci0JCQk8UHJlc2VudGF0aW9uRGVsYXk+NDAwMDA8L1ByZXNlbnRhdGlvbkRlbGF5PgotCQkJPE1hbmRhdG9yeT4wPC9NYW5kYXRvcnk+Ci0JCTwvUW9TU2V0dGluZ3M+Ci0JCTxRb1NTZXR0aW5ncz4KLQkJCTxTYW1wbGluZ0ZyZXF1ZW5jeUluSHo+NDgwMDA8L1NhbXBsaW5nRnJlcXVlbmN5SW5Iej4KLQkJCTxTRFVJbnRlcnZhbEluTWljcm9TZWNzPjEwMDAwPC9TRFVJbnRlcnZhbEluTWljcm9TZWNzPgotCQkJPEZyYW1pbmc+MDwvRnJhbWluZz4KLQkJCTxNYXhTRFVTaXplPjEwMDwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4xMTwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT40MDwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT4yNTAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQkJPFFvU1NldHRpbmdzPgotCQkJPFNhbXBsaW5nRnJlcXVlbmN5SW5Iej40ODAwMDwvU2FtcGxpbmdGcmVxdWVuY3lJbkh6PgotCQkJPFNEVUludGVydmFsSW5NaWNyb1NlY3M+NzUwMDwvU0RVSW50ZXJ2YWxJbk1pY3JvU2Vjcz4KLQkJCTxGcmFtaW5nPjA8L0ZyYW1pbmc+Ci0JCQk8TWF4U0RVU2l6ZT43NTwvTWF4U0RVU2l6ZT4KLQkJCTxSZXRyYW5zbWlzc2lvbk51bWJlcj4xMzwvUmV0cmFuc21pc3Npb25OdW1iZXI+Ci0JCQk8TWF4VHJhbnNwb3J0TGF0ZW5jeT43NTwvTWF4VHJhbnNwb3J0TGF0ZW5jeT4KLQkJCTxQcmVzZW50YXRpb25EZWxheT40MDAwMDwvUHJlc2VudGF0aW9uRGVsYXk+Ci0JCQk8TWFuZGF0b3J5PjA8L01hbmRhdG9yeT4KLQkJPC9Rb1NTZXR0aW5ncz4KLQk8L1Fvc1NldHRpbmdzRm9ySGlnaFJlbGlhYmlsaXR5TWVkaWE+Ci08L1dNQ1A+Ci0KLTwvTEVBdWRpb0NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2JsdWV0b290aF9hZHZfYXVkaW8uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYmx1ZXRvb3RoX2Fkdl9hdWRpby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxYjFhYy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYmx1ZXRvb3RoX2Fkdl9hdWRpby5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYmx1ZXRvb3RoX2Fkdl9hdWRpby5jYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBCbHVldG9vdGggTEVBIEhBTCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9hZHZfYXVkaW8iCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfY3NpcC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2FwbS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2FjbS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYXNjc19jbGllbnQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9iYXBfdWNsaWVudC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3ZjcF9jb250cm9sbGVyLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfbWNwLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoX2NhbGxjb250cm9sX2ludGVyZmFjZS5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgImJ0aWZfYmFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImJ0YV9jc2lwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL29zaV9tb2R1bGUuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9iYXBfYmEuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBsaXN0IGFsbCBleHRlbmRlZCBpbnRlcmZhY2VzIGhlcmUgKi8KLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzY3NDbGllbnRJbnRlcmZhY2U7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlVjYXN0Q2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjp2Y3BfY29udHJvbGxlcjo6VmNwQ29udHJvbGxlckludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6bWNwX3NlcnZlcjo6TWNwU2VydmVySW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpjYWxsX2NvbnRyb2w6OkNhbGxDb250cm9sbGVySW50ZXJmYWNlOwotZXh0ZXJuIFBhY3NDbGllbnRJbnRlcmZhY2UgKmJ0aWZfcGFjc19jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotZXh0ZXJuIEFzY3NDbGllbnRJbnRlcmZhY2UgKmJ0aWZfYXNjc19jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotZXh0ZXJuIFVjYXN0Q2xpZW50SW50ZXJmYWNlICpidGlmX2JhcF91Y2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLWV4dGVybiBidF9hcG1faW50ZXJmYWNlX3QgKmJ0aWZfYXBtX2dldF9pbnRlcmZhY2UoKTsKLWV4dGVybiBidGFjbV9pbml0aWF0b3JfaW50ZXJmYWNlX3QqIGJ0aWZfYWNtX2luaXRpYXRvcl9nZXRfaW50ZXJmYWNlKCk7Ci1leHRlcm4gYnRiYXBfYnJvYWRjYXN0X2ludGVyZmFjZV90ICogYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9pbnRlcmZhY2UoKTsKLS8qIENvb3JkaW5hdGVkIHNldCBpZGVudGlmaWNhdGlvbiBwcm9maWxlIC0gY2xpZW50ICovCi1leHRlcm4gYnRjc2lwX2ludGVyZmFjZV90KiBidGlmX2NzaXBfZ2V0X2ludGVyZmFjZSgpOwotLypWY3AgQ29udHJvbGxlciovCi1leHRlcm4gVmNwQ29udHJvbGxlckludGVyZmFjZSogYnRpZl92Y3BfZ2V0X2NvbnRyb2xsZXJfaW50ZXJmYWNlKCk7Ci0vKk1jcCBzZXJ2ZXIqLwotZXh0ZXJuIE1jcFNlcnZlckludGVyZmFjZSogYnRpZl9tY3Bfc2VydmVyX2dldF9pbnRlcmZhY2UoKTsKLWV4dGVybiBDYWxsQ29udHJvbGxlckludGVyZmFjZSogYnRpZl9jY19zZXJ2ZXJfZ2V0X2ludGVyZmFjZSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgaXNfcHJvZmlsZShjb25zdCBjaGFyKiBwMSwgY29uc3QgY2hhciogcDIpIHsKLSAgQ0hFQ0socDEpOwotICBDSEVDSyhwMik7Ci0gIHJldHVybiBzdHJsZW4ocDEpID09IHN0cmxlbihwMikgJiYgc3RybmNtcChwMSwgcDIsIHN0cmxlbihwMikpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgQkxVRVRPT1RIIExFQSBIQUwgSU5URVJGQUNFIEZVTkNUSU9OUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TdGFja0NhbGxiYWNrcyAqc3RhY2tfY2FsbGJhY2tzOwotCi1jb25zdCB2b2lkKiBnZXRfYWR2X2F1ZGlvX3Byb2ZpbGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIqIHByb2ZpbGVfaWQpIHsKLSAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBpZCA9ICVzIiwgX19mdW5jX18sIHByb2ZpbGVfaWQpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfUEFDU19DTElFTlRfSUQpKSB7Ci0gICAgcmV0dXJuIGJ0aWZfcGFjc19jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotICB9Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfQVBNX01PRFVMRV9JRCkpIHsKLSAgICByZXR1cm4gYnRpZl9hcG1fZ2V0X2ludGVyZmFjZSgpOwotICB9Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9BQ01fSUQpKSB7Ci0gICAgcmV0dXJuIGJ0aWZfYWNtX2luaXRpYXRvcl9nZXRfaW50ZXJmYWNlKCk7Ci0gIH0KLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0JBUF9CUk9BRENBU1RfSUQpKQotICAgIHJldHVybiBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfQ1NJUF9DTElFTlRfSUQpKSB7Ci0gICAgcmV0dXJuIGJ0aWZfY3NpcF9nZXRfaW50ZXJmYWNlKCk7Ci0gIH0KLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX1ZPTFVNRV9DT05UUk9MX0lEKSkgewotICAgIHJldHVybiBidGlmX3ZjcF9nZXRfY29udHJvbGxlcl9pbnRlcmZhY2UoKTsKLSAgfQotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfTUNQX0lEKSkgewotICAgIHJldHVybiBidGlmX21jcF9zZXJ2ZXJfZ2V0X2ludGVyZmFjZSgpOwotICB9Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9DQ19JRCkpIHsKLSAgICAgcmV0dXJuIGJ0aWZfY2Nfc2VydmVyX2dldF9pbnRlcmZhY2UoKTsKLSAgfQotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfQVNDU19DTElFTlRfSUQpKSB7Ci0gICAgcmV0dXJuIGJ0aWZfYXNjc19jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotICB9Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9CQVBfVUNMSUVOVF9JRCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpidGlmX2JhcF91Y2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotY2xhc3MgU3RhY2tDYWxsYmFja3NJbXBsIDogcHVibGljIFN0YWNrQ2FsbGJhY2tzIHsKLSAgcHVibGljOgotICAgIH5TdGFja0NhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gICAgdm9pZCBPbkRldlVuUGFpcmVkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICAgIEJUQV9Dc2lwUmVtb3ZlVW5wYWlyZWRTZXRNZW1iZXIoYWRkcmVzcyk7Ci0gICAgICBidGlmX2JhcF9yZW1vdmVfYWxsX3JlY29yZHMoYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgdm9pZCBPbkNvbmZpZ0NsZWFyZWQodm9pZCkgIG92ZXJyaWRlIHsKLSAgICAgIGJ0aWZfYmFwX2NvbmZpZ19jbGVhcigpOwotICAgIH0KLQotICAgIHZvaWQgT25TdGFja1N0YXRlKFN0YWNrU3RhdGUgc3RhdGUpIHsKLSAgICAgIHN3aXRjaChzdGF0ZSkgewotICAgICAgICBjYXNlIFN0YWNrU3RhdGU6OklOSVRJQUxJWklORzoKLSAgICAgICAgICBtb2R1bGVfaW5pdChnZXRfbW9kdWxlKEJUSUZfQkFQX0NPTkZJR19NT0RVTEUpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTdGFja1N0YXRlOjpUVVJOSU5HX09OOgotICAgICAgICAgIG1vZHVsZV9zdGFydF91cChnZXRfbW9kdWxlKEJUSUZfQkFQX0NPTkZJR19NT0RVTEUpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTdGFja1N0YXRlOjpUVVJOSU5HX09GRjoKLSAgICAgICAgICBtb2R1bGVfc2h1dF9kb3duKGdldF9tb2R1bGUoQlRJRl9CQVBfQ09ORklHX01PRFVMRSkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFN0YWNrU3RhdGU6OkNMRUFORF9VUDoKLSAgICAgICAgICBtb2R1bGVfY2xlYW5fdXAoZ2V0X21vZHVsZShCVElGX0JBUF9DT05GSUdfTU9EVUxFKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotfTsKLQotdm9pZCBpbml0X2Fkdl9hdWRpb19pbnRlcmZhY2VzKCkgewotICBzdGFja19jYWxsYmFja3MgPSBuZXcgU3RhY2tDYWxsYmFja3NJbXBsOwotICBTdGFja0ludGVyZmFjZTo6SW5pdGlhbGl6ZShzdGFja19jYWxsYmFja3MpOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYWNtLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYWNtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmMwMTI0Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2FjbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIExPR19UQUcgImJ0aWZfYWNtIgotI2luY2x1ZGUgImJ0aWZfYWNtLmgiCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9iaW5kX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgImJ0YV9jbG9zdXJlX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2FjbS5oPgotI2luY2x1ZGUgImF1ZGlvX2hhbF9pbnRlcmZhY2UvYTJkcF9lbmNvZGluZy5oIgotI2luY2x1ZGUgImJ0X2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2EyZHBfc291cmNlLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaCIKLSNpbmNsdWRlICJidGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiY29tbW9uL3N0YXRlX21hY2hpbmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYmFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImJ0YV9iYXBfdWNsaWVudF9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2JhcF9jb2RlY191dGlscy5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9jc2lwX2FwaS5oIgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZC5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfcGFjc19jbGllbnQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9iYXBfdWNsaWVudC5oPgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3ZtY3AuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hY21fc291cmNlLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgImJ0X3R5cGVzLmgiCi0jaW5jbHVkZSAiYnRtX2ludC5oIgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cyAmIE1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMRV9BVURJT19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgTEVfQVVESU9fTk9UX0FWQUlMQUJMRSAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIExFX0FVRElPX0FWQUlMQUJMRV9OT1RfTElDRU5TRUQgICAgMHgwMDAwMDIwMCAgLy9MQzMKLSNkZWZpbmUgTEVfQVVESU9fQVZBSUxBQkxFX0xJQ0VOU0VEICAgICAgICAweDAwMDAwMzAwICAvL0xDM1EKLSNkZWZpbmUgTEVfQVVESU9fQ1NfM18xU1RfQllURV9JTkRFWCAgICAgICAweDAwCi0jZGVmaW5lIExFX0FVRElPX0NTXzNfMk5EX0JZVEVfSU5ERVggICAgICAgMHgwMQotI2RlZmluZSBMRV9BVURJT19DU18zXzNSRF9CWVRFX0lOREVYICAgICAgIDB4MDIKLSNkZWZpbmUgTEVfQVVESU9fQ1NfM180VEhfQllURV9JTkRFWCAgICAgICAweDAzCi0jZGVmaW5lIExFX0FVRElPX0NTXzNfNVRIX0JZVEVfSU5ERVggICAgICAgMHgwNAotI2RlZmluZSBMRV9BVURJT19DU18zXzdUSF9CWVRFX0lOREVYICAgICAgIDB4MDYKLSNkZWZpbmUgTEVfQVVESU9fQ1NfM184VEhfQllURV9JTkRFWCAgICAgICAweDA3Ci0KLXN0YXRpYyBSYXdBZGRyZXNzIGFjdGl2ZV9iZGEgPSB7fTsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtEZWZhdWx0TWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzID0gNTsKLUNvZGVjQ29uZmlnIGN1cnJlbnRfYWN0aXZlX2NvbmZpZzsKLXN0YXRpYyBDb2RlY0NvbmZpZyBjdXJyZW50X21lZGlhX2NvbmZpZzsKLXN0YXRpYyBDb2RlY0NvbmZpZyBjdXJyZW50X3ZvaWNlX2NvbmZpZzsKLXN0YXRpYyBDb2RlY0NvbmZpZyBjdXJyZW50X3JlY29yZGluZ19jb25maWc7Ci11aW50MTZfdCBjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgPSAwOwotdWludDE2X3QgY3VycmVudF9hY3RpdmVfY29udGV4dF90eXBlOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlVjYXN0Q2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpVY2FzdENsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VWNhc3RDbGllbnQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1Db25uZWN0OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNJbmRleDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY1ByaW9yaXR5OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0JQUzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NoYW5uZWxNb2RlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjRnJhbWVEdXJhdGlvbjsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q29kZWNRb3NDb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVN0YXRlSW5mbzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtQ29uZmlnSW5mbzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtUmVjb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNJU0NvbmZpZzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0RpcmVjdGlvbjsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q09OVEVOVF9UWVBFX01FRElBOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9MSVZFOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfVU5TUEVDSUZJRUQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9JTlNUUlVDVElPTkFMOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfTk9USUZJQ0FUSU9OUzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q09OVEVOVF9UWVBFX0FMRVJUOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfTUFOX01BQ0hJTkU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9FTUVSR0VOQ1k7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9SSU5HVE9ORTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q09OVEVOVF9UWVBFX1NPVU5EX0VGRkVDVFM7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9HQU1FOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkFTRV9ESVJFQ1RJT05fU1JDOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpBU0VfRElSRUNUSU9OX1NJTks7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkFTQ1NDb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkxFXzJNX1BIWTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6TEVfUUhTX1BIWTsKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBiYXNlOjpJZ25vcmVSZXN1bHQ7Ci11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci1leHRlcm4gdm9pZCBkb19pbl9idGFfdGhyZWFkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHRhc2spOwotCi1ib29sIHJlY29uZmlnX2FjbV9pbml0aWF0b3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCBpbnQgcHJvZmlsZVR5cGUpOwotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2FjbV9zbV9ldmVudF90IGV2ZW50KTsKLXZvaWQgYnRpZl9hY21fdXBkYXRlX2xjM3FfcGFyYW1zKGludDY0X3QqIGNzMywgdEJUSUZfQUNNKiBwX2FjbV9kYXRhKTsKLQotdWludDE2X3QgYnRpZl9hY21fYmFwX3RvX2FjbV9jb250ZXh0KHVpbnQxNl90IGJhcF9jb250ZXh0KTsKLQotc3RkOjptdXRleCBhY21fc2Vzc2lvbl93YWl0X211dGV4XzsKLXN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGFjbV9zZXNzaW9uX3dhaXRfY3Y7Ci1ib29sIGFjbV9zZXNzaW9uX3dhaXQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTG9jYWwgdHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jbGFzcyBCdGlmQ3NpcEV2ZW50IHsKLSBwdWJsaWM6Ci0gIEJ0aWZDc2lwRXZlbnQodWludDMyX3QgZXZlbnQsIGNvbnN0IHZvaWQqIHBfZGF0YSwgc2l6ZV90IGRhdGFfbGVuZ3RoKTsKLSAgQnRpZkNzaXBFdmVudChjb25zdCBCdGlmQ3NpcEV2ZW50JiBvdGhlcik7Ci0gIEJ0aWZDc2lwRXZlbnQoKSA9IGRlbGV0ZTsKLSAgfkJ0aWZDc2lwRXZlbnQoKTsKLSAgQnRpZkNzaXBFdmVudCYgb3BlcmF0b3I9KGNvbnN0IEJ0aWZDc2lwRXZlbnQmIG90aGVyKTsKLQotICB1aW50MzJfdCBFdmVudCgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50XzsgfQotICB2b2lkKiBEYXRhKCkgY29uc3QgeyByZXR1cm4gZGF0YV87IH0KLSAgc2l6ZV90IERhdGFMZW5ndGgoKSBjb25zdCB7IHJldHVybiBkYXRhX2xlbmd0aF87IH0KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdDsKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEV2ZW50TmFtZSh1aW50MzJfdCBldmVudCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIERlZXBDb3B5KHVpbnQzMl90IGV2ZW50LCBjb25zdCB2b2lkKiBwX2RhdGEsIHNpemVfdCBkYXRhX2xlbmd0aCk7Ci0gIHZvaWQgRGVlcEZyZWUoKTsKLQotICB1aW50MzJfdCBldmVudF87Ci0gIHZvaWQqIGRhdGFfOwotICBzaXplX3QgZGF0YV9sZW5ndGhfOwotfTsKLQotY2xhc3MgQnRpZkFjbUV2ZW50IHsKLSBwdWJsaWM6Ci0gIEJ0aWZBY21FdmVudCh1aW50MzJfdCBldmVudCwgY29uc3Qgdm9pZCogcF9kYXRhLCBzaXplX3QgZGF0YV9sZW5ndGgpOwotICBCdGlmQWNtRXZlbnQoY29uc3QgQnRpZkFjbUV2ZW50JiBvdGhlcik7Ci0gIEJ0aWZBY21FdmVudCgpID0gZGVsZXRlOwotICB+QnRpZkFjbUV2ZW50KCk7Ci0gIEJ0aWZBY21FdmVudCYgb3BlcmF0b3I9KGNvbnN0IEJ0aWZBY21FdmVudCYgb3RoZXIpOwotCi0gIHVpbnQzMl90IEV2ZW50KCkgY29uc3QgeyByZXR1cm4gZXZlbnRfOyB9Ci0gIHZvaWQqIERhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQotICBzaXplX3QgRGF0YUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfbGVuZ3RoXzsgfQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXZlbnROYW1lKHVpbnQzMl90IGV2ZW50KTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRGVlcENvcHkodWludDMyX3QgZXZlbnQsIGNvbnN0IHZvaWQqIHBfZGF0YSwgc2l6ZV90IGRhdGFfbGVuZ3RoKTsKLSAgdm9pZCBEZWVwRnJlZSgpOwotCi0gIHVpbnQzMl90IGV2ZW50XzsKLSAgdm9pZCogZGF0YV87Ci0gIHNpemVfdCBkYXRhX2xlbmd0aF87Ci19OwotCi1jbGFzcyBCdGlmQWNtUGVlcjsKLQotY2xhc3MgQnRpZkFjbVN0YXRlTWFjaGluZSA6IHB1YmxpYyBibHVldG9vdGg6OmNvbW1vbjo6U3RhdGVNYWNoaW5lIHsKLSBwdWJsaWM6Ci0gIGVudW0gewotICAgIGtTdGF0ZUlkbGUsICAgICAgICAgICAgLy8gQUNNIHN0YXRlIGRpc2Nvbm5lY3RlZAotICAgIGtTdGF0ZU9wZW5pbmcsICAgICAgICAgLy8gQUNNIHN0YXRlIGNvbm5lY3RpbmcKLSAgICBrU3RhdGVPcGVuZWQsICAgICAgICAgIC8vIEFDTSBzdGF0ZSBjb25uZWN0ZWQKLSAgICBrU3RhdGVTdGFydGVkLCAgICAgICAgIC8vIEFDTSBzdGF0ZSBzdHJlYW1pbmcKLSAgICBrU3RhdGVSZWNvbmZpZ3VyaW5nLCAgIC8vIEFDTSBzdGF0ZSByZWNvbmZpZ3VyaW5nCi0gICAga1N0YXRlQ2xvc2luZywgICAgICAgICAvLyBBQ00gc3RhdGUgZGlzY29ubmVjdGluZwotICB9OwotCi0gIGNsYXNzIFN0YXRlSWRsZSA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVJZGxlKEJ0aWZBY21TdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVJZGxlKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkFjbVBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlT3BlbmluZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVPcGVuaW5nKEJ0aWZBY21TdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVPcGVuaW5nKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkFjbVBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlT3BlbmVkIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZU9wZW5lZChCdGlmQWNtU3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlT3BlbmVkKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkFjbVBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlU3RhcnRlZCA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVTdGFydGVkKEJ0aWZBY21TdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVTdGFydGVkKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkFjbVBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlUmVjb25maWd1cmluZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVSZWNvbmZpZ3VyaW5nKEJ0aWZBY21TdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVSZWNvbmZpZ3VyaW5nKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkFjbVBlZXImIHBlZXJfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlQ2xvc2luZyA6IHB1YmxpYyBTdGF0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgU3RhdGVDbG9zaW5nKEJ0aWZBY21TdGF0ZU1hY2hpbmUmIHNtKQotICAgICAgICA6IFN0YXRlKHNtLCBrU3RhdGVDbG9zaW5nKSwgcGVlcl8oc20uUGVlcigpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkFjbVBlZXImIHBlZXJfOwotICB9OwotCi0gIEJ0aWZBY21TdGF0ZU1hY2hpbmUoQnRpZkFjbVBlZXImIGJ0aWZfYWNtX3BlZXIpIDogcGVlcl8oYnRpZl9hY21fcGVlcikgewotICAgIHN0YXRlX2lkbGVfID0gbmV3IFN0YXRlSWRsZSgqdGhpcyk7Ci0gICAgc3RhdGVfb3BlbmluZ18gPSBuZXcgU3RhdGVPcGVuaW5nKCp0aGlzKTsKLSAgICBzdGF0ZV9vcGVuZWRfID0gbmV3IFN0YXRlT3BlbmVkKCp0aGlzKTsKLSAgICBzdGF0ZV9zdGFydGVkXyA9IG5ldyBTdGF0ZVN0YXJ0ZWQoKnRoaXMpOwotICAgIHN0YXRlX3JlY29uZmlndXJpbmdfID0gbmV3IFN0YXRlUmVjb25maWd1cmluZygqdGhpcyk7Ci0gICAgc3RhdGVfY2xvc2luZ18gPSBuZXcgU3RhdGVDbG9zaW5nKCp0aGlzKTsKLQotICAgIEFkZFN0YXRlKHN0YXRlX2lkbGVfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9vcGVuaW5nXyk7Ci0gICAgQWRkU3RhdGUoc3RhdGVfb3BlbmVkXyk7Ci0gICAgQWRkU3RhdGUoc3RhdGVfc3RhcnRlZF8pOwotICAgIEFkZFN0YXRlKHN0YXRlX3JlY29uZmlndXJpbmdfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9jbG9zaW5nXyk7Ci0gICAgU2V0SW5pdGlhbFN0YXRlKHN0YXRlX2lkbGVfKTsKLSAgfQotCi0gIEJ0aWZBY21QZWVyJiBQZWVyKCkgeyByZXR1cm4gcGVlcl87IH0KLQotIHByaXZhdGU6Ci0gIEJ0aWZBY21QZWVyJiBwZWVyXzsKLSAgU3RhdGVJZGxlKiBzdGF0ZV9pZGxlXzsKLSAgU3RhdGVPcGVuaW5nKiBzdGF0ZV9vcGVuaW5nXzsKLSAgU3RhdGVPcGVuZWQqIHN0YXRlX29wZW5lZF87Ci0gIFN0YXRlU3RhcnRlZCogc3RhdGVfc3RhcnRlZF87Ci0gIFN0YXRlUmVjb25maWd1cmluZyogc3RhdGVfcmVjb25maWd1cmluZ187Ci0gIFN0YXRlQ2xvc2luZyogc3RhdGVfY2xvc2luZ187Ci19OwotCi1jbGFzcyBCdGlmQWNtUGVlciB7Ci0gcHVibGljOgotICBlbnVtIHsKLSAgICBrRmxhZ1BlbmRpbmdMb2NhbFN1c3BlbmQgICAgICAgPSAweDAxLAotICAgIGtGbGFnUGVuZGluZ1JlY29uZmlndXJlICAgICAgICA9IDB4MDIsCi0gICAga0ZsYWdQZW5kaW5nU3RhcnQgICAgICAgICAgICAgID0gMHgwNCwKLSAgICBrRmxhZ1BlbmRpbmdTdG9wICAgICAgICAgICAgICAgPSAweDA4LAotICAgIGtGTGFnUGVuZGluZ1N0YXJ0QWZ0ZXJSZWNvbmZpZyA9IDB4MTAsCi0gIH07Ci0KLSAgZW51bSB7Ci0gICAga0ZsYWdBZ2dyZXNpdmVNb2RlICAgICAgICAgICAgID0gMHgwMSwKLSAgICBrRmxhZ1JlbGF4ZWRNb2RlICAgICAgICAgICAgICAgPSAweDAyLAotICB9OwotCi0gIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3QgIGtUaW1lb3V0TG9ja1JlbGVhc2VNcyA9IDUgKiAxMDAwOwotCi0gIEJ0aWZBY21QZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywgdWludDhfdCBwZWVyX3NlcCwKLSAgICAgICAgICAgICAgdWludDhfdCBzZXRfaWQsIHVpbnQ4X3QgY2lnX2lkLCB1aW50OF90IGNpc19pZCk7Ci0gIH5CdGlmQWNtUGVlcigpOwotCi0gIGJ0X3N0YXR1c190IEluaXQoKTsKLSAgdm9pZCBDbGVhbnVwKCk7Ci0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgdGhlIHBlZXIgY2FuIGJlIGRlbGV0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFpciBjYW4gYmUgZGVsZXRlZCwgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBib29sIENhbkJlRGVsZXRlZCgpIGNvbnN0OwotCi0gIGJvb2wgSXNQZWVyQWN0aXZlRm9yTXVzaWMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChTZXRJZCgpID09IE11c2ljQWN0aXZlU2V0SWQoKSk7Ci0gIH0KLSAgYm9vbCBJc1BlZXJBY3RpdmVGb3JWb2ljZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKFNldElkKCkgPT0gVm9pY2VBY3RpdmVTZXRJZCgpKTsKLSAgfQotCi0gIGJvb2wgSXNBY2NlcHRvcigpIGNvbnN0IHsgcmV0dXJuIChwZWVyX3NlcF8gPT0gQUNNX1RTRVBfU05LKTsgfQotCi0gIGNvbnN0IFJhd0FkZHJlc3MmIE11c2ljQWN0aXZlUGVlckFkZHJlc3MoKSBjb25zdDsKLSAgY29uc3QgUmF3QWRkcmVzcyYgVm9pY2VBY3RpdmVQZWVyQWRkcmVzcygpIGNvbnN0OwotICB1aW50OF90IE11c2ljQWN0aXZlU2V0SWQoKSBjb25zdDsKLSAgdWludDhfdCBWb2ljZUFjdGl2ZVNldElkKCkgY29uc3Q7Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyYgUGVlckFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBwZWVyX2FkZHJlc3NfOyB9Ci0KLSAgdm9pZCBTZXRDb250ZXh0VHlwZSh1aW50MTZfdCBjb250ZXh0VHlwZSkgeyBjb250ZXh0X3R5cGVfID0gY29udGV4dF90eXBlXyB8IGNvbnRleHRUeXBlOyB9Ci0gIHVpbnQxNl90IEdldENvbnRleHRUeXBlKCkgeyByZXR1cm4gY29udGV4dF90eXBlXzsgfQotICB2b2lkIFJlc2V0Q29udGV4dFR5cGUodWludDE2X3QgY29udGV4dFR5cGUpIHsgY29udGV4dF90eXBlXyAmPSB+Y29udGV4dFR5cGU7IH0KLQotCi0gIHZvaWQgU2V0UHJvZmlsZVR5cGUodWludDE2X3QgcHJvZmlsZVR5cGUpIHsgcHJvZmlsZV90eXBlXyA9IHByb2ZpbGVfdHlwZV8gfCBwcm9maWxlVHlwZTsgfQotICB1aW50MTZfdCBHZXRQcm9maWxlVHlwZSgpIHtyZXR1cm4gcHJvZmlsZV90eXBlXzt9Ci0gIHZvaWQgUmVzZXRQcm9maWxlVHlwZSh1aW50MTZfdCBwcm9maWxlVHlwZSkgeyBwcm9maWxlX3R5cGVfICY9IH5wcm9maWxlVHlwZTsgfQotCi0KLSAgdm9pZCBTZXRSY2ZnUHJvZmlsZVR5cGUodWludDE2X3QgcHJvZmlsZVR5cGUpIHsgcmNmZ19wcm9maWxlX3R5cGVfID0gcHJvZmlsZVR5cGU7IH0KLSAgdWludDE2X3QgR2V0UmNmZ1Byb2ZpbGVUeXBlKCkge3JldHVybiByY2ZnX3Byb2ZpbGVfdHlwZV87fQotCi0gIHZvaWQgU2V0UHJlZkNvbnRleHRUeXBlKHVpbnQxNl90IHByZWZlcnJlZENvbnRleHQpIHtwcmVmZXJyZWRfY29udGV4dF8gPSBwcmVmZXJyZWRDb250ZXh0O307Ci0gIHVpbnQxNl90IEdldFByZWZDb250ZXh0VHlwZSgpIHtyZXR1cm4gcHJlZmVycmVkX2NvbnRleHRfO30KLQotICB2b2lkIFNldFN0cmVhbUNvbnRleHRUeXBlKHVpbnQxNl90IGNvbnRleHRUeXBlKSB7IHN0cmVhbV9jb250ZXh0X3R5cGVfID0gY29udGV4dFR5cGU7IH0KLSAgdWludDE2X3QgR2V0U3RyZWFtQ29udGV4dFR5cGUoKSB7IHJldHVybiBzdHJlYW1fY29udGV4dF90eXBlXzsgfQotCi0gIHZvaWQgU2V0UGVlclZvaWNlUnhTdGF0ZShTdHJlYW1TdGF0ZSBzdGF0ZSkge3ZvaWNlX3J4X3N0YXRlID0gc3RhdGU7fQotICBTdHJlYW1TdGF0ZSBHZXRQZWVyVm9pY2VSeFN0YXRlKCkge3JldHVybiB2b2ljZV9yeF9zdGF0ZTt9Ci0KLSAgdm9pZCBTZXRQZWVyVm9pY2VUeFN0YXRlKFN0cmVhbVN0YXRlIHN0YXRlKSB7dm9pY2VfdHhfc3RhdGUgPSBzdGF0ZTt9Ci0gIFN0cmVhbVN0YXRlIEdldFBlZXJWb2ljZVR4U3RhdGUoKSB7cmV0dXJuIHZvaWNlX3R4X3N0YXRlO30KLQotICB2b2lkIFNldFBlZXJNdXNpY1R4U3RhdGUoU3RyZWFtU3RhdGUgc3RhdGUpIHttdXNpY190eF9zdGF0ZSA9IHN0YXRlO30KLSAgU3RyZWFtU3RhdGUgR2V0UGVlck11c2ljVHhTdGF0ZSgpIHtyZXR1cm4gbXVzaWNfdHhfc3RhdGU7fQotCi0gIHZvaWQgU2V0UGVlck11c2ljUnhTdGF0ZShTdHJlYW1TdGF0ZSBzdGF0ZSkge211c2ljX3J4X3N0YXRlID0gc3RhdGU7fQotICBTdHJlYW1TdGF0ZSBHZXRQZWVyTXVzaWNSeFN0YXRlKCkge3JldHVybiBtdXNpY19yeF9zdGF0ZTt9Ci0KLSAgdm9pZCBTZXRQZWVyTGF0ZW5jeSh1aW50MTZfdCBwZWVyTGF0ZW5jeSkgeyBwZWVyX2xhdGVuY3lfID0gcGVlckxhdGVuY3k7IH0KLSAgdWludDE2X3QgR2V0UGVlckxhdGVuY3koKSB7cmV0dXJuIHBlZXJfbGF0ZW5jeV87fQotCi0gIHZvaWQgU2V0SXNTdGVyZW9Ic1R5cGUoYm9vbCBzdGVyZW9Ic1R5cGUpIHsgaXNfc3RlcmVvaHNfdHlwZV89IHN0ZXJlb0hzVHlwZTsgfQotICBib29sIElzU3RlcmVvSHNUeXBlKCkge3JldHVybiBpc19zdGVyZW9oc190eXBlXzt9Ci0KLSAgdm9pZCBzZXRfcGVlcl9tZWRpYV9jb2RlY19jb25maWcoQ29kZWNDb25maWcgJmNvZGVjX2NvbmZpZykgewotICAgICAgcGVlcl9tZWRpYV9jb2RlY19jb25maWcgPSBjb2RlY19jb25maWc7Ci0gIH0KLSAgQ29kZWNDb25maWcgZ2V0X3BlZXJfbWVkaWFfY29kZWNfY29uZmlnKCkge3JldHVybiBwZWVyX21lZGlhX2NvZGVjX2NvbmZpZzt9Ci0KLSAgdm9pZCBzZXRfcGVlcl9tZWRpYV9xb3NfY29uZmlnKFFvc0NvbmZpZyAmcW9zX2NvbmZpZykge3BlZXJfbWVkaWFfcW9zX2NvbmZpZyA9IHFvc19jb25maWc7fQotICBRb3NDb25maWcgZ2V0X3BlZXJfbWVkaWFfcW9zX2NvbmZpZygpIHtyZXR1cm4gcGVlcl9tZWRpYV9xb3NfY29uZmlnO30KLQotICB2b2lkIHNldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoQ29kZWNRb3NDb25maWcgJmNvZGVjX3Fvc19jb25maWcpIHsKLSAgICAgIHBlZXJfbWVkaWFfY29kZWNfcW9zX2NvbmZpZyA9IGNvZGVjX3Fvc19jb25maWc7fQotICBDb2RlY1Fvc0NvbmZpZyBnZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCkge3JldHVybiBwZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWc7fQotCi0gIHZvaWQgc2V0X3BlZXJfdm9pY2VfcnhfY29kZWNfY29uZmlnKENvZGVjQ29uZmlnICZjb2RlY19jb25maWcpIHsKLSAgICAgIHBlZXJfdm9pY2VfcnhfY29kZWNfY29uZmlnID0gY29kZWNfY29uZmlnOwotICB9Ci0gIENvZGVjQ29uZmlnIGdldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX2NvbmZpZygpIHtyZXR1cm4gcGVlcl92b2ljZV9yeF9jb2RlY19jb25maWc7fQotCi0gIHZvaWQgc2V0X3BlZXJfdm9pY2VfcnhfcW9zX2NvbmZpZyhRb3NDb25maWcgJnFvc19jb25maWcpIHtwZWVyX3ZvaWNlX3J4X3Fvc19jb25maWcgPSBxb3NfY29uZmlnO30KLSAgUW9zQ29uZmlnIGdldF9wZWVyX3ZvaWNlX3J4X3Fvc19jb25maWcoKSB7cmV0dXJuIHBlZXJfdm9pY2VfcnhfcW9zX2NvbmZpZzt9Ci0KLSAgdm9pZCBzZXRfcGVlcl92b2ljZV9yeF9jb2RlY19xb3NfY29uZmlnKENvZGVjUW9zQ29uZmlnICZjb2RlY19xb3NfY29uZmlnKSB7Ci0gICAgICBwZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcgPSBjb2RlY19xb3NfY29uZmlnO30KLSAgQ29kZWNRb3NDb25maWcgZ2V0X3BlZXJfdm9pY2VfcnhfY29kZWNfcW9zX2NvbmZpZygpIHtyZXR1cm4gcGVlcl92b2ljZV9yeF9jb2RlY19xb3NfY29uZmlnO30KLQotICB2b2lkIHNldF9wZWVyX3ZvaWNlX3R4X2NvZGVjX2NvbmZpZyhDb2RlY0NvbmZpZyAmY29kZWNfY29uZmlnKSB7Ci0gICAgICBwZWVyX3ZvaWNlX3R4X2NvZGVjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZzsKLSAgfQotICBDb2RlY0NvbmZpZyBnZXRfcGVlcl92b2ljZV90eF9jb2RlY19jb25maWcoKSB7cmV0dXJuIHBlZXJfdm9pY2VfdHhfY29kZWNfY29uZmlnO30KLQotICB2b2lkIHNldF9wZWVyX3ZvaWNlX3R4X3Fvc19jb25maWcoUW9zQ29uZmlnICZxb3NfY29uZmlnKSB7cGVlcl92b2ljZV90eF9xb3NfY29uZmlnID0gcW9zX2NvbmZpZzt9Ci0gIFFvc0NvbmZpZyBnZXRfcGVlcl92b2ljZV90eF9xb3NfY29uZmlnKCkge3JldHVybiBwZWVyX3ZvaWNlX3R4X3Fvc19jb25maWc7fQotCi0gIHZvaWQgc2V0X3BlZXJfdm9pY2VfdHhfY29kZWNfcW9zX2NvbmZpZyhDb2RlY1Fvc0NvbmZpZyAmY29kZWNfcW9zX2NvbmZpZykgewotICAgICAgcGVlcl92b2ljZV90eF9jb2RlY19xb3NfY29uZmlnID0gY29kZWNfcW9zX2NvbmZpZzt9Ci0gIENvZGVjUW9zQ29uZmlnIGdldF9wZWVyX3ZvaWNlX3R4X2NvZGVjX3Fvc19jb25maWcoKSB7cmV0dXJuIHBlZXJfdm9pY2VfdHhfY29kZWNfcW9zX2NvbmZpZzt9Ci0KLSAgdWludDhfdCBTZXRJZCgpIGNvbnN0IHsgcmV0dXJuIHNldF9pZF87IH0KLSAgdWludDhfdCBDaWdJZCgpIGNvbnN0IHsgcmV0dXJuIGNpZ19pZF87IH0KLSAgdWludDhfdCBDaXNJZCgpIGNvbnN0IHsgcmV0dXJuIGNpc19pZF87IH0KLQotICBCdGlmQWNtU3RhdGVNYWNoaW5lJiBTdGF0ZU1hY2hpbmUoKSB7IHJldHVybiBzdGF0ZV9tYWNoaW5lXzsgfQotICBjb25zdCBCdGlmQWNtU3RhdGVNYWNoaW5lJiBTdGF0ZU1hY2hpbmUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV9tYWNoaW5lXzsgfQotCi0gIGJvb2wgSXNDb25uZWN0ZWQoKSBjb25zdDsKLSAgYm9vbCBJc1N0cmVhbWluZygpIGNvbnN0OwotCi0gIGJvb2wgQ2hlY2tDb25uVXBkYXRlTW9kZSh1aW50OF90IG1vZGUpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNvbm5fbW9kZV8gPT0gbW9kZSk7Ci0gIH0KLQotICB2b2lkIFNldENvbm5VcGRhdGVNb2RlKHVpbnQ4X3QgbW9kZSkgewotICAgIGlmKGNvbm5fbW9kZV8gPT0gbW9kZSkgcmV0dXJuOwotICAgIGlmKG1vZGUgPT0ga0ZsYWdBZ2dyZXNpdmVNb2RlKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcHVzaCBhZ2dyZXNzaXZlIGludGVydmFscyIsIF9fZnVuY19fKTsKLSAgICAgIEwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcyhwZWVyX2FkZHJlc3NfLCAxNiwgMzIsIDAsIDEwMDApOwotICAgIH0gZWxzZSBpZihtb2RlID09IGtGbGFnUmVsYXhlZE1vZGUpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwdXNoIHJlbGF4ZWQgaW50ZXJ2YWxzIiwgX19mdW5jX18pOwotICAgICAgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zKHBlZXJfYWRkcmVzc18sIDQwLCA1NiwgMCwgMTAwMCk7Ci0gICAgfQotICAgIGNvbm5fbW9kZV8gPSBtb2RlOwotICB9Ci0KLSAgdm9pZCBDbGVhckNvbm5VcGRhdGVNb2RlKCkgeyBjb25uX21vZGVfID0gMDsgfQotCi0gIGJvb2wgQ2hlY2tGbGFncyh1aW50OF90IGZsYWdzX21hc2spIGNvbnN0IHsKLSAgICByZXR1cm4gKChmbGFnc18gJiBmbGFnc19tYXNrKSAhPSAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgb25seSB0aGUgZmxhZ3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSBmbGFncyBtYXNrLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3NfbWFzayB0aGUgZmxhZ3MgdG8gc2V0Ci0gICAqLwotICB2b2lkIFNldEZsYWdzKHVpbnQ4X3QgZmxhZ3NfbWFzaykgeyBmbGFnc18gfD0gZmxhZ3NfbWFzazsgfQotCi0gIC8qKgotICAgKiBDbGVhciBvbmx5IHRoZSBmbGFncyBhcyBzcGVjaWZpZWQgYnkgdGhlIGZsYWdzIG1hc2suCi0gICAqCi0gICAqIEBwYXJhbSBmbGFnc19tYXNrIHRoZSBmbGFncyB0byBjbGVhcgotICAgKi8KLSAgdm9pZCBDbGVhckZsYWdzKHVpbnQ4X3QgZmxhZ3NfbWFzaykgeyBmbGFnc18gJj0gfmZsYWdzX21hc2s7IH0KLQotICAvKioKLSAgICogQ2xlYXIgYWxsIHRoZSBmbGFncy4KLSAgICovCi0gIHZvaWQgQ2xlYXJBbGxGbGFncygpIHsgZmxhZ3NfID0gMDsgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIGZvciB0aGUgZmxhZ3Mgc2V0LgotICAgKi8KLSAgc3RkOjpzdHJpbmcgRmxhZ3NUb1N0cmluZygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgUmF3QWRkcmVzcyBwZWVyX2FkZHJlc3NfOwotICBjb25zdCB1aW50OF90IHBlZXJfc2VwXzsvLyBTRVAgdHlwZSBvZiBwZWVyIGRldmljZQotICB1aW50OF90IHNldF9pZF8sIGNpZ19pZF8sIGNpc19pZF87Ci0gIEJ0aWZBY21TdGF0ZU1hY2hpbmUgc3RhdGVfbWFjaGluZV87Ci0gIHVpbnQ4X3QgZmxhZ3NfOwotICB1aW50OF90IGNvbm5fbW9kZV87Ci0gIGJvb2wgaXNfc3RlcmVvaHNfdHlwZV8gPSBmYWxzZTsKLSAgU3RyZWFtU3RhdGUgdm9pY2Vfcnhfc3RhdGUsIHZvaWNlX3R4X3N0YXRlLCBtdXNpY190eF9zdGF0ZSwgbXVzaWNfcnhfc3RhdGU7Ci0gIHVpbnQxNl90IHBlZXJfbGF0ZW5jeV87Ci0gIHVpbnQxNl90IGNvbnRleHRfdHlwZV8gPSAwOwotICB1aW50MTZfdCBwcm9maWxlX3R5cGVfID0gMDsKLSAgdWludDE2X3QgcmNmZ19wcm9maWxlX3R5cGVfID0gMDsKLSAgdWludDE2X3QgcHJlZmVycmVkX2NvbnRleHRfID0gMDsKLSAgdWludDE2X3Qgc3RyZWFtX2NvbnRleHRfdHlwZV8gPSAwOwotICBDb2RlY0NvbmZpZyBwZWVyX21lZGlhX2NvZGVjX2NvbmZpZywgcGVlcl92b2ljZV9yeF9jb2RlY19jb25maWcsIHBlZXJfdm9pY2VfdHhfY29kZWNfY29uZmlnOwotICBRb3NDb25maWcgcGVlcl9tZWRpYV9xb3NfY29uZmlnLCBwZWVyX3ZvaWNlX3J4X3Fvc19jb25maWcsIHBlZXJfdm9pY2VfdHhfcW9zX2NvbmZpZzsKLSAgQ29kZWNRb3NDb25maWcgcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnLCBwZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcsIHBlZXJfdm9pY2VfdHhfY29kZWNfcW9zX2NvbmZpZzsKLX07Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfbG9ja19yZWxlYXNlX3RpbWVyKHVpbnQ4X3Qgc2V0SWQpOwotYm9vbCBidGlmX2FjbV9yZXF1ZXN0X2NzaXBfdW5sb2NrKHVpbnQ4X3Qgc2V0SWQpOwotdm9pZCBidGlmX2FjbV9wcm9jZXNzX3JlcXVlc3QodEEyRFBfQ1RSTF9DTUQgY21kKTsKLQotdm9pZCBidGlmX2FjbV9zb3VyY2Vfb25fc3RvcHBlZCgpOwotdm9pZCBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKCk7Ci12b2lkIGJ0aWZfYWNtX29uX2lkbGUodm9pZCk7Ci1ib29sIGJ0aWZfYWNtX2NoZWNrX2lmX3JlcXVlc3RlZF9kZXZpY2VzX3N0b3BwZWQoKTsKLQotdm9pZCBidGlmX2FjbV9zb3VyY2VfY2xlYW51cCh2b2lkKTsKLQotYnRfc3RhdHVzX3QgYnRpZl9hY21fc291cmNlX3NldHVwX2NvZGVjKCk7Ci11aW50MTZfdCBidGlmX2FjbV9nZXRfYWN0aXZlX2RldmljZV9sYXRlbmN5KCk7Ci0KLWNsYXNzIEJ0aWZBY21Jbml0aWF0b3IgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDaWdJZE1pbiA9IDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ2lnSWRNYXggPSBCVEFfQUNNX05VTV9DSUdTOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1BlZXJNaW5TZXRJZCA9IEJUQV9BQ01fTUlOX05VTV9TRVRJRDsKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtQZWVyTWF4U2V0SWQgPSBCVEFfQUNNX01BWF9OVU1fU0VUSUQ7Ci0KLSAgZW51bSB7Ci0gICAga0ZsYWdTdGF0dXNVbmtub3duID0gMHgwLAotICAgIGtGbGFnU3RhdHVzVW5sb2NrZWQgPSAweDEsCi0gICAga0ZsYWdTdGF0dXNQZW5kaW5nTG9jayA9IDB4MiwKLSAgICBrRmxhZ1N0YXR1c1N1YnNldExvY2tlZCA9IDB4NCwKLSAgICBrRmxhZ1N0YXR1c0xvY2tlZCA9IDB4OCwKLSAgICBrRmxhZ1N0YXR1c1BlbmRpbmdVbmxvY2sgPSAweDEwLAotICB9OwotCi0gIC8vIGFjbSBncm91cCBwcm9jZWR1cmUgdGltZXIKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVGltZW91dEFjbUdyb3VwUHJvY2VkdXJlTXMgPSAxMCAqIDEwMDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1RpbWVvdXRDb25uSW50ZXJ2YWxNcyA9IDUgKiAxMDAwOwotCi0gIEJ0aWZBY21Jbml0aWF0b3IoKQotICAgICAgOiBjYWxsYmFja3NfKG51bGxwdHIpLAotICAgICAgICBlbmFibGVkXyhmYWxzZSksCi0gICAgICAgIG1heF9jb25uZWN0ZWRfcGVlcnNfKGtEZWZhdWx0TWF4Q29ubmVjdGVkQXVkaW9EZXZpY2VzKSwKLSAgICAgICAgbXVzaWNfYWN0aXZlX3NldGlkXyhJTlZBTElEX1NFVF9JRCksCi0gICAgICAgIHZvaWNlX2FjdGl2ZV9zZXRpZF8oSU5WQUxJRF9TRVRfSUQpLAotICAgICAgICBjc2lwX2FwcF9pZF8oMCksCi0gICAgICAgIGlzX2NzaXBfcmVnXyhmYWxzZSksCi0gICAgICAgIGxvY2tfZmxhZ3NfKDApLAotICAgICAgICBtdXNpY19zZXRfbG9ja19yZWxlYXNlX3RpbWVyXyhudWxscHRyKSwKLSAgICAgICAgdm9pY2Vfc2V0X2xvY2tfcmVsZWFzZV90aW1lcl8obnVsbHB0ciksCi0gICAgICAgIGFjbV9ncm91cF9wcm9jZWR1cmVfdGltZXJfKG51bGxwdHIpLAotICAgICAgICBhY21fY29ubl9pbnRlcnZhbF90aW1lcl8obnVsbHB0cil7fQotICB+QnRpZkFjbUluaXRpYXRvcigpOwotCi0gIGJ0X3N0YXR1c190IEluaXQoCi0gICAgICBidGFjbV9pbml0aWF0b3JfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywgaW50IG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiYgY29kZWNfcHJpb3JpdGllcyk7Ci0gIHZvaWQgQ2xlYW51cCgpOwotICBib29sIElzU2V0SWRsZSh1aW50OF90IHNldElkKSBjb25zdDsKLQotICBidGFjbV9pbml0aWF0b3JfY2FsbGJhY2tzX3QqIENhbGxiYWNrcygpIHsgcmV0dXJuIGNhbGxiYWNrc187IH0KLSAgYm9vbCBFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZW5hYmxlZF87IH0KLQotICBCdGlmQWNtUGVlciogRmluZFBlZXIoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLSAgdWludDhfdCBGaW5kUGVlclNldElkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0gIHVpbnQ4X3QgRmluZFBlZXJCeVNldElkKHVpbnQ4X3Qgc2V0X2lkKTsKLSAgdWludDhfdCBGaW5kUGVlckNpZ0lkKHVpbnQ4X3Qgc2V0X2lkKTsKLSAgdWludDhfdCBGaW5kUGVlckJ5Q2lnSWQodWludDhfdCBjaWdfaWQpOwotICB1aW50OF90IEZpbmRQZWVyQnlDaXNJZCh1aW50OF90IGNpZ19pZCwgdWludDhfdCBjaXNfaWQpOwotICBCdGlmQWNtUGVlciogRmluZE9yQ3JlYXRlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotICBCdGlmQWNtUGVlciogRmluZE11c2ljQWN0aXZlUGVlcigpOwotCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIGEgY29ubmVjdGlvbiB0byBhIHBlZXIgaXMgYWxsb3dlZC4KLSAgICogVGhlIGNoZWNrIGNvbnNpZGVycyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGVkIHBlZXJzLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MgdG8gY29ubmVjdCB0bwotICAgKiBAcmV0dXJuIHRydWUgaWYgY29ubmVjdGlvbiBpcyBhbGxvd2VkLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgQWxsb3dlZFRvQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIGNvbnN0OwotICBib29sIElzQWNtSWRsZSgpIGNvbnN0OwotCi0gIGJvb2wgSXNPdGhlclNldFBlZXJzSWRsZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQ4X3Qgc2V0SWQpIGNvbnN0OwotCi0gIGFsYXJtX3QqIE11c2ljU2V0TG9ja1JlbGVhc2VUaW1lcigpIHsgcmV0dXJuIG11c2ljX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfOyB9Ci0gIGFsYXJtX3QqIFZvaWNlU2V0TG9ja1JlbGVhc2VUaW1lcigpIHsgcmV0dXJuIHZvaWNlX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfOyB9Ci0gIGFsYXJtX3QqIEFjbUdyb3VwUHJvY2VkdXJlVGltZXIoKSB7IHJldHVybiBhY21fZ3JvdXBfcHJvY2VkdXJlX3RpbWVyXzsgfQotICBhbGFybV90KiBBY21Db25uSW50ZXJ2YWxUaW1lcigpIHsgcmV0dXJuIGFjbV9jb25uX2ludGVydmFsX3RpbWVyXzsgfQotCi0gIC8qKgotICAgKiBEZWxldGUgYSBwZWVyLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIG9mIHRoZSBwZWVyIHRvIGJlIGRlbGV0ZWQKLSAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSAgICovCi0gIGJvb2wgRGVsZXRlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBEZWxldGUgYWxsIHBlZXJzIHRoYXQgYXJlIGluIElkbGUgc3RhdGUgYW5kIGNhbiBiZSBkZWxldGVkLgotICAgKi8KLSAgdm9pZCBEZWxldGVJZGxlUGVlcnMoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBNdXNpYyBhY3RpdmUgcGVlci4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbXVzaWMgYWN0aXZlIHBlZXIKLSAgICovCi0gIGNvbnN0IFJhd0FkZHJlc3MmIE11c2ljQWN0aXZlUGVlcigpIGNvbnN0IHsgcmV0dXJuIG11c2ljX2FjdGl2ZV9wZWVyXzsgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFZvaWNlIGFjdGl2ZSBwZWVyLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB2b2ljZSBhY3RpdmUgcGVlcgotICAgKi8KLSAgY29uc3QgUmF3QWRkcmVzcyYgVm9pY2VBY3RpdmVQZWVyKCkgY29uc3QgeyByZXR1cm4gdm9pY2VfYWN0aXZlX3BlZXJfOyB9Ci0KLSAgdWludDhfdCBNdXNpY0FjdGl2ZUNTZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG11c2ljX2FjdGl2ZV9zZXRpZF87IH0KLSAgdWludDhfdCBWb2ljZUFjdGl2ZUNTZXRJZCgpIGNvbnN0IHsgcmV0dXJuIHZvaWNlX2FjdGl2ZV9zZXRpZF87IH0KLQotICB2b2lkIFNldENzaXBBcHBJZCh1aW50OF90IGNzaXBfYXBwX2lkKSB7IGNzaXBfYXBwX2lkXyA9IGNzaXBfYXBwX2lkOyB9Ci0gIHVpbnQ4X3QgR2V0Q3NpcEFwcElkKCkgY29uc3QgeyByZXR1cm4gY3NpcF9hcHBfaWRfOyB9Ci0KLSAgdm9pZCBTZXRDc2lwUmVnaXN0cmF0aW9uKGJvb2wgaXNfY3NpcF9yZWcpIHsgaXNfY3NpcF9yZWdfID0gaXNfY3NpcF9yZWc7IH0KLSAgYm9vbCBJc0NzaXBSZWdpc3RlcmVkKCkgY29uc3QgeyByZXR1cm4gaXNfY3NpcF9yZWdfO30KLQotICB2b2lkIFNldE11c2ljQWN0aXZlR3JvdXBTdGFydGVkKGJvb2wgZmxhZykgeyBpc19tdXNpY19hY3RpdmVfc2V0X3N0YXJ0ZWRfID0gZmxhZzsgfQotICBib29sIElzTXVzaWNBY3RpdmVHcm91cFN0YXJ0ZWQgKCkgeyByZXR1cm4gaXNfbXVzaWNfYWN0aXZlX3NldF9zdGFydGVkXzsgfQotCi0gIGJvb2wgSXNDb25uVXBkYXRlRW5hYmxlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGlzX2Nvbm5fdXBkYXRlX2VuYWJsZWRfID09IHRydWUpOwotICB9Ci0KLSAgdm9pZCBTZXRPclVwZGF0ZUdyb3VwTG9ja1N0YXR1cyh1aW50OF90IHNldF9pZCwgaW50IGxvY2tfc3RhdHVzKSB7Ci0gICAgc3RkOjptYXA8dWludDhfdCwgaW50Pjo6aXRlcmF0b3IgcCA9IHNldF9sb2NrX3N0YXR1c18uZmluZChzZXRfaWQpOwotICAgIGlmIChwID09IHNldF9sb2NrX3N0YXR1c18uZW5kKCkpIHsKLSAgICAgIHNldF9sb2NrX3N0YXR1c18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNldF9pZCwgbG9ja19zdGF0dXMpKTsKLSAgICB9IGVsc2UgewotICAgICAgc2V0X2xvY2tfc3RhdHVzXy5lcmFzZShzZXRfaWQpOwotICAgICAgc2V0X2xvY2tfc3RhdHVzXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2V0X2lkLCBsb2NrX3N0YXR1cykpOwotICAgIH0KLSAgfQotCi0gIGludCBHZXRHcm91cExvY2tTdGF0dXModWludDhfdCBzZXRfaWQpIHsKLSAgICBhdXRvIGl0ID0gc2V0X2xvY2tfc3RhdHVzXy5maW5kKHNldF9pZCk7Ci0gICAgaWYgKGl0ICE9IHNldF9sb2NrX3N0YXR1c18uZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kOwotICAgIHJldHVybiBrRmxhZ1N0YXR1c1Vua25vd247Ci0gIH0KLQotICBib29sIENoZWNrTG9ja0ZsYWdzKHVpbnQ4X3QgYml0bG9ja2ZsYWdzX21hc2spIGNvbnN0IHsKLSAgICByZXR1cm4gKChsb2NrX2ZsYWdzXyAmIGJpdGxvY2tmbGFnc19tYXNrKSAhPSAwKTsKLSAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IG9ubHkgdGhlIGZsYWdzIGFzIHNwZWNpZmllZCBieSB0aGUgYml0bG9ja2ZsYWdzX21hc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYml0bG9ja2ZsYWdzX21hc2sgdGhlIGxvY2sgZmxhZ3MgdG8gc2V0Ci0gICAgICovCi0gIHZvaWQgU2V0TG9ja0ZsYWdzKHVpbnQ4X3QgYml0bG9ja2ZsYWdzX21hc2spIHsgbG9ja19mbGFnc18gfD0gYml0bG9ja2ZsYWdzX21hc2s7fQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgb25seSB0aGUgZmxhZ3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSBiaXRsb2NrZmxhZ3NfbWFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiaXRsb2NrZmxhZ3NfbWFzayB0aGUgbG9jayBmbGFncyB0byBjbGVhcgotICAgICAqLwotICB2b2lkIENsZWFyTG9ja0ZsYWdzKHVpbnQ4X3QgYml0bG9ja2ZsYWdzX21hc2spIHsgbG9ja19mbGFnc18gJj0gfmJpdGxvY2tmbGFnc19tYXNrO30KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFsbCBsb2NrIGZsYWdzLgotICAgICAqLwotICB2b2lkIENsZWFyQWxsTG9ja0ZsYWdzKCkgeyBsb2NrX2ZsYWdzXyA9IDA7fQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGZvciBsb2NrIGZsYWdzLgotICAgICAqLwotICBzdGQ6OnN0cmluZyBMb2NrRmxhZ3NUb1N0cmluZygpIGNvbnN0OwotCi0gIGJvb2wgU2V0QWNtQWN0aXZlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQxNl90IGNvbnRleHRUeXBlLCB1aW50MTZfdCBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpIHsKLSAgICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBwZWVyOiAiIDw8IHBlZXJfYWRkcmVzcwotICAgICAgICAgICA8PCAiIG11c2ljX2FjdGl2ZV9wZWVyXzogIiA8PCBtdXNpY19hY3RpdmVfcGVlcl8gPDwgIiB2b2ljZV9hY3RpdmVfcGVlcl86ICIgPDwgdm9pY2VfYWN0aXZlX3BlZXJfOwotICAgIHVpbnQxNl90IHNpbmtfbGF0ZW5jeTsKLSAgICBhY3RpdmVfYmRhID0gcGVlcl9hZGRyZXNzOy8vIGZvciBzdGVyZW8gTEVBIGFjdGl2ZV9iZGEgPSBwZWVyX2FkZHJlc3MKLSAgICBCdGlmQWNtUGVlciogcGVlciA9IEZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgYWRkcmVzcyBieXRlIEJEQTolMDJ4IiwgX19mdW5jX18sYWN0aXZlX2JkYS5hZGRyZXNzWzVdKTsKLSAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICBpZiAobXVzaWNfYWN0aXZlX3BlZXJfID09IGFjdGl2ZV9iZGEpIHsKLSAgICAgICAgLy9TYW1lIGFjdGl2ZSBkZXZpY2UsIHByb2ZpbGVUeXBlIG1heSBoYXZlIGNoYW5nZWQuCi0gICAgICAgIGlmICgocGVlciAhPSBudWxscHRyKSAmJiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IDApICYmIChjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgIT0gcHJvZmlsZVR5cGUpKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICVkLCBwcm9maWxlVHlwZSAlZCBwZWVyLT5HZXRQcm9maWxlVHlwZSgpICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUsIHByb2ZpbGVUeXBlLCBwZWVyLT5HZXRQcm9maWxlVHlwZSgpKTsKLSAgICAgICAgICBpZiAoKHBlZXItPkdldFByb2ZpbGVUeXBlKCkgJiBwcm9maWxlVHlwZSkgPT0gMCkgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChhY21fc2Vzc2lvbl93YWl0X211dGV4Xyk7Ci0gICAgICAgICAgICBhY21fc2Vzc2lvbl93YWl0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocmVjb25maWdfYWNtX2luaXRpYXRvcihwZWVyX2FkZHJlc3MsIHByb2ZpbGVUeXBlKSkgewotICAgICAgICAgICAgICBhY21fc2Vzc2lvbl93YWl0X2N2LndhaXRfZm9yKGd1YXJkLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMwMDApLCBbXXtyZXR1cm4gYWNtX3Nlc3Npb25fd2FpdDt9KTsKLSAgICAgICAgICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IGRvbmUgd2l0aCBzaWduYWwiLF9fZnVuY19fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlID0gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IFdNQ1ApCi0gICAgICAgICAgICAgIGN1cnJlbnRfYWN0aXZlX2NvbmZpZyA9IGN1cnJlbnRfbWVkaWFfY29uZmlnOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBjdXJyZW50X2FjdGl2ZV9jb25maWcgPSBjdXJyZW50X3JlY29yZGluZ19jb25maWc7Ci0gICAgICAgICAgICBpZiAoIWJ0aWZfYWNtX3NvdXJjZV9yZXN0YXJ0X3Nlc3Npb24obXVzaWNfYWN0aXZlX3BlZXJfLCBhY3RpdmVfYmRhKSkgewotICAgICAgICAgICAgICAvLyBjYW5ub3Qgc2V0IHByb21pc2UgYnV0IG5lZWQgdG8gYmUgaGFuZGxlZCB3aXRoaW4gcmVzdGFydF9zZXNzaW9uCi0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgPT0gV01DUCkgewotICAgICAgICAgICAgICBzaW5rX2xhdGVuY3kgPSBidGlmX2FjbV9nZXRfYWN0aXZlX2RldmljZV9sYXRlbmN5KCk7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBzaW5rX2xhdGVuY3kgPSAlZG1zIiwgX19mdW5jX18sIHNpbmtfbGF0ZW5jeSk7Ci0gICAgICAgICAgICAgIGlmICgoc2lua19sYXRlbmN5ID4gMCkgJiYgIWJ0aWZfYWNtX3VwZGF0ZV9zaW5rX2xhdGVuY3lfY2hhbmdlKHNpbmtfbGF0ZW5jeSAqIDEwKSkgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiB1bmFibGUgdG8gdXBkYXRlIGxhdGVuY3kiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoYWN0aXZlX2JkYS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHNldCBhZGRyZXNzIGlzIGVtcHR5LCBzaHV0ZG93biB0aGUgQWNtIGluaXRpYXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2xvY2tfcmVsZWFzZV90aW1lcihtdXNpY19hY3RpdmVfc2V0aWRfKTsKLSAgICAgICAgaWYgKChHZXRHcm91cExvY2tTdGF0dXMobXVzaWNfYWN0aXZlX3NldGlkXykgPT0gQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNMb2NrZWQpIHx8Ci0gICAgICAgICAgICAoR2V0R3JvdXBMb2NrU3RhdHVzKG11c2ljX2FjdGl2ZV9zZXRpZF8pID09IEJ0aWZBY21Jbml0aWF0b3I6OmtGbGFnU3RhdHVzU3Vic2V0TG9ja2VkKSkgewotICAgICAgICAgIGlmICghYnRpZl9hY21fcmVxdWVzdF9jc2lwX3VubG9jayhtdXNpY19hY3RpdmVfc2V0aWRfKSkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGVycm9yIHVubG9ja2luZyIsIF9fZnVuY19fKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnRpZl9hY21fc291cmNlX2VuZF9zZXNzaW9uKG11c2ljX2FjdGl2ZV9wZWVyXyk7Ci0gICAgICAgIG11c2ljX2FjdGl2ZV9wZWVyXyA9IGFjdGl2ZV9iZGE7Ci0gICAgICAgIGN1cnJlbnRfYWN0aXZlX3Byb2ZpbGVfdHlwZSA9IDA7Ci0gICAgICAgIG1lbXNldCgmY3VycmVudF9hY3RpdmVfY29uZmlnLCAwLCBzaXplb2YoY3VycmVudF9hY3RpdmVfY29uZmlnKSk7Ci0gICAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfbG9ja19yZWxlYXNlX3RpbWVyKG11c2ljX2FjdGl2ZV9zZXRpZF8pOwotICAgICAgaWYgKChHZXRHcm91cExvY2tTdGF0dXMobXVzaWNfYWN0aXZlX3NldGlkXykgPT0gQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNMb2NrZWQpIHx8Ci0gICAgICAgICAgKEdldEdyb3VwTG9ja1N0YXR1cyhtdXNpY19hY3RpdmVfc2V0aWRfKSA9PSBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c1N1YnNldExvY2tlZCkpIHsKLSAgICAgICAgaWYgKCFidGlmX2FjbV9yZXF1ZXN0X2NzaXBfdW5sb2NrKG11c2ljX2FjdGl2ZV9zZXRpZF8pKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGVycm9yIHVubG9ja2luZyIsIF9fZnVuY19fKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKmNoZWNrIGlmIHByZXZpb3VzIGFjdGl2ZSBkZXZpY2UgaXMgc3RyZWFtaW5nLCB0aGVuIFNUT1AgaXQgZmlyc3QqLwotICAgICAgaWYgKCFtdXNpY19hY3RpdmVfcGVlcl8uSXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBzZXRpZCA9IG11c2ljX2FjdGl2ZV9zZXRpZF87Ci0gICAgICAgIGlmIChzZXRpZCA8IElOVkFMSURfU0VUX0lEKSB7Ci0gICAgICAgICAgdEJUQV9DU0lQX0NTRVQgY3NldF9pbmZvOwotICAgICAgICAgIG1lbXNldCgmY3NldF9pbmZvLCAwLCBzaXplb2YodEJUQV9DU0lQX0NTRVQpKTsKLSAgICAgICAgICBjc2V0X2luZm8gPSBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0KHNldGlkKTsKLSAgICAgICAgICBpZiAoY3NldF9pbmZvLnNpemUgIT0gMCkgewotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz46Oml0ZXJhdG9yIGl0cjsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzaXplIG9mIHNldCBtZW1iZXJzICVkIiwgX19mdW5jX18sIChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSk7Ci0gICAgICAgICAgICBpZiAoKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICBmb3IgKGl0ciA9KGNzZXRfaW5mby5zZXRfbWVtYmVycykuYmVnaW4oKTsgaXRyICE9IChjc2V0X2luZm8uc2V0X21lbWJlcnMpLmVuZCgpOyBpdHIrKykgewotICAgICAgICAgICAgICAgIEJ0aWZBY21QZWVyKiBncnBfcGVlciA9IEZpbmRQZWVyKCppdHIpOwotICAgICAgICAgICAgICAgIGlmIChncnBfcGVlciAhPSBudWxscHRyICYmIGdycF9wZWVyLT5Jc1N0cmVhbWluZygpKSB7Ci0gICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcGVlciBpcyBzdHJlYW1pbmcgJXMgIiwgX19mdW5jX18sIGdycF9wZWVyLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoKml0ciwgQlRJRl9BQ01fU1RPUF9TVFJFQU1fUkVRX0VWVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBtdXNpY19hY3RpdmVfcGVlcl8gaXMgdHdtIGRldmljZSAiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgQnRpZkFjbVBlZXIqIHR3bV9wZWVyID0gRmluZFBlZXIobXVzaWNfYWN0aXZlX3BlZXJfKTsKLSAgICAgICAgICBpZiAodHdtX3BlZXIgIT0gbnVsbHB0ciAmJiB0d21fcGVlci0+SXNTdHJlYW1pbmcoKSkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG11c2ljX2FjdGl2ZV9wZWVyXyAlcyBpcyBzdHJlYW1pbmcsIHNlbmQgc3RvcCAiLCBfX2Z1bmNfXywgdHdtX3BlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9kaXNwYXRjaF9zbV9ldmVudChtdXNpY19hY3RpdmVfcGVlcl8sIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoKHBlZXIgIT0gbnVsbHB0cikgJiYgKChwZWVyLT5HZXRQcm9maWxlVHlwZSgpICYgcHJvZmlsZVR5cGUpID09IDApKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIHBlZXIuR2V0UHJvZmlsZVR5cGUoKSAlZCwgcHJvZmlsZVR5cGUgJWQiLCBfX2Z1bmNfXywgcGVlci0+R2V0UHJvZmlsZVR5cGUoKSwgcHJvZmlsZVR5cGUpOwotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGFjbV9zZXNzaW9uX3dhaXRfbXV0ZXhfKTsKLSAgICAgICAgYWNtX3Nlc3Npb25fd2FpdCA9IGZhbHNlOwotICAgICAgICBpZiAocmVjb25maWdfYWNtX2luaXRpYXRvcihwZWVyX2FkZHJlc3MsIHByb2ZpbGVUeXBlKSkgewotICAgICAgICAgIGFjbV9zZXNzaW9uX3dhaXRfY3Yud2FpdF9mb3IoZ3VhcmQsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAwMCksIFtde3JldHVybiBhY21fc2Vzc2lvbl93YWl0O30pOwotICAgICAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBkb25lIHdpdGggc2lnbmFsIixfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGN1cnJlbnRfYWN0aXZlX3Byb2ZpbGVfdHlwZSA9IHByb2ZpbGVUeXBlOwotICAgICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IFdNQ1ApCi0gICAgICAgICAgY3VycmVudF9hY3RpdmVfY29uZmlnID0gY3VycmVudF9tZWRpYV9jb25maWc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjdXJyZW50X2FjdGl2ZV9jb25maWcgPSBjdXJyZW50X3JlY29yZGluZ19jb25maWc7Ci0gICAgICAgIGlmICghYnRpZl9hY21fc291cmNlX3Jlc3RhcnRfc2Vzc2lvbihtdXNpY19hY3RpdmVfcGVlcl8sIGFjdGl2ZV9iZGEpKSB7Ci0gICAgICAgICAgLy8gY2Fubm90IHNldCBwcm9taXNlIGJ1dCBuZWVkIHRvIGJlIGhhbmRsZWQgd2l0aGluIHJlc3RhcnRfc2Vzc2lvbgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbXVzaWNfYWN0aXZlX3BlZXJfID0gYWN0aXZlX2JkYTsKLSAgICAgIGlmIChhY3RpdmVfYmRhLmFkZHJlc3NbMF0gPT0gMHg5RSAmJiBhY3RpdmVfYmRhLmFkZHJlc3NbMV0gPT0gMHg4QiAmJiBhY3RpdmVfYmRhLmFkZHJlc3NbMl0gPT0gMHgwMCkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogZ2V0IHNldCBJRCBmcm9tIGdyb3VwIEJEIGFkZHJlc3MgIiwgX19mdW5jX18pOwotICAgICAgICBtdXNpY19hY3RpdmVfc2V0aWRfID0gYWN0aXZlX2JkYS5hZGRyZXNzWzVdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGdldCBzZXQgSUQgZnJvbSBwZWVyIGRhdGEgIiwgX19mdW5jX18pOwotICAgICAgICBpZiAocGVlciAhPSBudWxscHRyKQotICAgICAgICAgIG11c2ljX2FjdGl2ZV9zZXRpZF8gPSBwZWVyLT5TZXRJZCgpOwotICAgICAgfQotCi0gICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlID09IFdNQ1ApIHsKLSAgICAgICAgc2lua19sYXRlbmN5ID0gYnRpZl9hY21fZ2V0X2FjdGl2ZV9kZXZpY2VfbGF0ZW5jeSgpOwotICAgICAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogc2lua19sYXRlbmN5ID0gJWRtcyIsIF9fZnVuY19fLCBzaW5rX2xhdGVuY3kpOwotICAgICAgICBpZiAoKHNpbmtfbGF0ZW5jeSA+IDApICYmICFidGlmX2FjbV91cGRhdGVfc2lua19sYXRlbmN5X2NoYW5nZShzaW5rX2xhdGVuY3kgKiAxMCkpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogdW5hYmxlIHRvIHVwZGF0ZSBsYXRlbmN5IiwgX19mdW5jX18pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwZWVyX3JlYWR5X3Byb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgaWYgKHZvaWNlX2FjdGl2ZV9wZWVyXyA9PSBhY3RpdmVfYmRhKSB7Ci0gICAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoYWN0aXZlX2JkYS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHBlZXIgYWRkcmVzcyBpcyBlbXB0eSwgc2h1dGRvd24gdGhlIGFjbSBpbml0aWF0b3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgdm9pY2VfYWN0aXZlX3BlZXJfID0gYWN0aXZlX2JkYTsKLSAgICAgICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLypjaGVjayBpZiBwcmV2aW91cyBhY3RpdmUgZGV2aWNlIGlzIHN0cmVhbWluZywgdGhlbiBTVE9QIGl0IGZpcnN0Ki8KLSAgICAgIGlmICghdm9pY2VfYWN0aXZlX3BlZXJfLklzRW1wdHkoKSkgewotICAgICAgICBpbnQgc2V0aWQgPSB2b2ljZV9hY3RpdmVfc2V0aWRfOwotICAgICAgICBpZiAoc2V0aWQgPCBJTlZBTElEX1NFVF9JRCkgewotICAgICAgICAgIHRCVEFfQ1NJUF9DU0VUIGNzZXRfaW5mbzsKLSAgICAgICAgICBtZW1zZXQoJmNzZXRfaW5mbywgMCwgc2l6ZW9mKHRCVEFfQ1NJUF9DU0VUKSk7Ci0gICAgICAgICAgY3NldF9pbmZvID0gQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldChzZXRpZCk7Ci0gICAgICAgICAgaWYgKGNzZXRfaW5mby5zaXplICE9IDApIHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+OjppdGVyYXRvciBpdHI7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2l6ZSBvZiBzZXQgbWVtYmVycyAlZCIsIF9fZnVuY19fLCAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5zaXplKCkpOwotICAgICAgICAgICAgaWYgKChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgZm9yIChpdHIgPShjc2V0X2luZm8uc2V0X21lbWJlcnMpLmJlZ2luKCk7IGl0ciAhPSAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5lbmQoKTsgaXRyKyspIHsKLSAgICAgICAgICAgICAgICBCdGlmQWNtUGVlciogZ3JwX3BlZXIgPSBGaW5kUGVlcigqaXRyKTsKLSAgICAgICAgICAgICAgICBpZiAoZ3JwX3BlZXIgIT0gbnVsbHB0ciAmJiBncnBfcGVlci0+SXNTdHJlYW1pbmcoKSkgewotICAgICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHZvaWNlIHBlZXIgaXMgc3RyZWFtaW5nICVzICIsIF9fZnVuY19fLCBncnBfcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yX2Rpc3BhdGNoX3NtX2V2ZW50KCppdHIsIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogdm9pY2VfYWN0aXZlX3BlZXJfIGlzIHR3bSBkZXZpY2UgIiwgX19mdW5jX18pOwotICAgICAgICAgIEJ0aWZBY21QZWVyKiB0d21fcGVlciA9IEZpbmRQZWVyKHZvaWNlX2FjdGl2ZV9wZWVyXyk7Ci0gICAgICAgICAgaWYgKHR3bV9wZWVyICE9IG51bGxwdHIgJiYgdHdtX3BlZXItPklzU3RyZWFtaW5nKCkpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiB2b2ljZV9hY3RpdmVfcGVlcl8gJXMgaXMgc3RyZWFtaW5nLCBzZW5kIHN0b3AgIiwgX19mdW5jX18sIHR3bV9wZWVyLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQodm9pY2VfYWN0aXZlX3BlZXJfLCBCVElGX0FDTV9TVE9QX1NUUkVBTV9SRVFfRVZUKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdm9pY2VfYWN0aXZlX3BlZXJfID0gYWN0aXZlX2JkYTsKLSAgICAgIGlmIChhY3RpdmVfYmRhLmFkZHJlc3NbMF0gPT0gMHg5RSAmJiBhY3RpdmVfYmRhLmFkZHJlc3NbMV0gPT0gMHg4QiAmJiBhY3RpdmVfYmRhLmFkZHJlc3NbMl0gPT0gMHgwMCkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogZ2V0IHNldCBJRCBmcm9tIGdyb3VwIEJEIGFkZHJlc3MgIiwgX19mdW5jX18pOwotICAgICAgICB2b2ljZV9hY3RpdmVfc2V0aWRfID0gYWN0aXZlX2JkYS5hZGRyZXNzWzVdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGdldCBzZXQgSUQgZnJvbSBwZWVyIGRhdGEgIiwgX19mdW5jX18pOwotICAgICAgICBpZiAocGVlciAhPSBudWxscHRyKQotICAgICAgICAgIHZvaWNlX2FjdGl2ZV9zZXRpZF8gPSBwZWVyLT5TZXRJZCgpOwotICAgICAgfQotICAgICAgcGVlcl9yZWFkeV9wcm9taXNlLnNldF92YWx1ZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBlZXJfcmVhZHlfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYnRpZl9hY21faW5pdGlhdG9yX2VuY29kZXJfdXNlcl9jb25maWdfdXBkYXRlX3JlcSgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiYgY29kZWNfdXNlcl9wcmVmZXJlbmNlcywKLSAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpOwotCi0KLSAgdm9pZCBVcGRhdGVDb2RlY0NvbmZpZygKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiYgY29kZWNfcHJlZmVyZW5jZXMsCi0gICAgICBpbnQgY29udGV4dFR5cGUsCi0gICAgICBpbnQgcHJvZmlsZVR5cGUsCi0gICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlKSB7Ci0gICAgLy8gUmVzdGFydCB0aGUgc2Vzc2lvbiBpZiB0aGUgY29kZWMgZm9yIHRoZSBhY3RpdmUgcGVlciBpcyB1cGRhdGVkCi0gICAgaWYgKCFwZWVyX2FkZHJlc3MuSXNFbXB0eSgpICYmIG11c2ljX2FjdGl2ZV9wZWVyXyA9PSBwZWVyX2FkZHJlc3MpIHsKLSAgICAgIGJ0aWZfYWNtX3NvdXJjZV9lbmRfc2Vzc2lvbihtdXNpY19hY3RpdmVfcGVlcl8pOwotICAgIH0KLQotICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9lbmNvZGVyX3VzZXJfY29uZmlnX3VwZGF0ZV9yZXEoCi0gICAgICAgIHBlZXJfYWRkcmVzcywgY29kZWNfcHJlZmVyZW5jZXMsIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6bWFwPFJhd0FkZHJlc3MsIEJ0aWZBY21QZWVyKj4mIFBlZXJzKCkgY29uc3QgeyByZXR1cm4gcGVlcnNfOyB9Ci0gLy8gY29uc3Qgc3RkOjptYXA8dWludDhfdCwgQnRpZkFjbVBlZXIqPiYgU2V0UGVlcnMoKSBjb25zdCB7IHJldHVybiBzZXRfcGVlcnNfOyB9Ci0KLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gbG9ja2VkX2RldmljZXM7Ci0gcHJpdmF0ZToKLSAgdm9pZCBDbGVhbnVwQWxsUGVlcnMoKTsKLQotICBidGFjbV9pbml0aWF0b3JfY2FsbGJhY2tzX3QqIGNhbGxiYWNrc187Ci0gIGJvb2wgZW5hYmxlZF87Ci0gIGludCBtYXhfY29ubmVjdGVkX3BlZXJzXzsKLQotICBSYXdBZGRyZXNzIG11c2ljX2FjdGl2ZV9wZWVyXzsKLSAgUmF3QWRkcmVzcyB2b2ljZV9hY3RpdmVfcGVlcl87Ci0gIHVpbnQ4X3QgbXVzaWNfYWN0aXZlX3NldGlkXzsKLSAgdWludDhfdCB2b2ljZV9hY3RpdmVfc2V0aWRfOwotICB1aW50OF90IG11c2ljX2FjdGl2ZV9zZXRfbG9ja2VkX2Rldl9jb3VudF87Ci0gIHVpbnQ4X3Qgdm9pY2VfYWN0aXZlX3NldF9sb2NrZWRfZGV2X2NvdW50XzsKLSAgYm9vbCBpc19tdXNpY19hY3RpdmVfc2V0X3N0YXJ0ZWRfOwotICBib29sIGlzX3ZvaWNlX2FjdGl2ZV9zZXRfc3RhcnRlZF87Ci0gIGJvb2wgaXNfY29ubl91cGRhdGVfZW5hYmxlZF87Ci0KLSAgdWludDhfdCBjc2lwX2FwcF9pZF87Ci0gIGJvb2wgaXNfY3NpcF9yZWdfOwotICB1aW50OF90IGxvY2tfZmxhZ3NfOwotCi0gIGFsYXJtX3QqIG11c2ljX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfOwotICBhbGFybV90KiB2b2ljZV9zZXRfbG9ja19yZWxlYXNlX3RpbWVyXzsKLSAgYWxhcm1fdCogYWNtX2dyb3VwX3Byb2NlZHVyZV90aW1lcl87Ci0gIGFsYXJtX3QqIGFjbV9jb25uX2ludGVydmFsX3RpbWVyXzsKLQotCi0gIHN0ZDo6bWFwPFJhd0FkZHJlc3MsIEJ0aWZBY21QZWVyKj4gcGVlcnNfOwotICBzdGQ6Om1hcDxSYXdBZGRyZXNzLCB1aW50OF90PiBhZGRyX3NldGlkX3BhaXI7Ci0gIHN0ZDo6bWFwPHVpbnQ4X3QsIHVpbnQ4X3Q+IHNldF9jaWdfcGFpcjsvL3NldGlkIGFuZCBjaWcgaWQgcGFpcgotICBzdGQ6Om1hcDxSYXdBZGRyZXNzLCBzdGQ6Om1hcDx1aW50OF90LCB1aW50OF90PiA+IGNpZ19jaXNfcGFpcjsvL2NpZyBpZCBhbmQgY2lzIGlkIHBhaXIKLSAgc3RkOjptYXA8dWludDhfdCwgaW50PiBzZXRfbG9ja19zdGF0dXNfOwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgdmFyaWFibGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQnRpZkFjbUluaXRpYXRvciBidGlmX2FjbV9pbml0aWF0b3I7Ci1zdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gdW5pY2FzdF9jb2RlY3NfY2FwYWJpbGl0aWVzOwotc3RhdGljIENvZGVjQ29uZmlnIGFjbV9sb2NhbF9jYXBhYmlsaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0JQUzo6Q09ERUNfQklUU19QRVJfU0FNUExFXzI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU8sIDAsIDAsIDAsIDB9Owotc3RhdGljIENvZGVjQ29uZmlnIGRlZmF1bHRfY29uZmlnOwotc3RhdGljIGJvb2wgbWFuZGF0b3J5X2NvZGVjX3NlbGVjdGVkID0gZmFsc2U7Ci1zdGF0aWMgYnRfc3RhdHVzX3QgZGlzY29ubmVjdF9hY21faW5pdGlhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dFR5cGUpOwotCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc3RhcnRfc3RyZWFtX2FjbV9pbml0aWF0b3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlKTsKLXN0YXRpYyBidF9zdGF0dXNfdCBzdG9wX3N0cmVhbV9hY21faW5pdGlhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlKTsKLQotc3RhdGljIHZvaWQgYnRpZl9hY21faGFuZGxlX2NzaXBfc3RhdHVzX2xvY2tlZChzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBhZGRyLCB1aW50OF90IHNldElkKTsKLQotc3RhdGljIHZvaWQgYnRpZl9hY21faGFuZGxlX2V2dCh1aW50MTZfdCBldmVudCwgY2hhciogcF9wYXJhbSk7Ci1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhY21fY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlLCB1aW50MTZfdCBjb250ZXh0VHlwZSk7Ci1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9hdWRpb19zdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFjbV9hdWRpb19zdGF0ZV90IHN0YXRlLCB1aW50MTZfdCBjb250ZXh0VHlwZSk7Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9sb2NrX3JlbGVhc2VfdGltZXIodWludDhfdCBzZXRJZCk7Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2luaXRpYXRvcl9sb2NrX3JlbGVhc2VfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLQotc3RhdGljIHZvaWQgYnRpZl9hY21fY2hlY2tfYW5kX3N0YXJ0X2dyb3VwX3Byb2NlZHVyZV90aW1lcih1aW50OF90IHNldElkKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9jb25uX0ludGVydmFsX3RpbWVyKEJ0aWZBY21QZWVyKiBwZWVyKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2luaXRpYXRvcl9jb25uX0ludGVydmFsX3RpbWVyX3RpbWVvdXQodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2Nvbm5fSW50ZXJ2YWxfdGltZXIoKTsKLQotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2dyb3VwX3Byb2NlZHVyZV90aW1lcih1aW50OF90IHNldElkKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2luaXRpYXRvcl9ncm91cF9wcm9jZWR1cmVfdGltZXJfdGltZW91dCh2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIFNlbGVjdENvZGVjUW9zQ29uZmlnKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBwcm9maWxlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGV4dF90eXBlLCBpbnQgZGlyZWN0aW9uLCBpbnQgY29uZmlnX3R5cGUpOwotYm9vbCBjb21wYXJlX2NvZGVjX2NvbmZpZ18oQ29kZWNDb25maWcgJmZpcnN0LCBDb2RlY0NvbmZpZyAmc2Vjb25kKTsKLXZvaWQgcHJpbnRfY29kZWNfcGFyYW1ldGVycyhDb2RlY0NvbmZpZyBjb25maWcpOwotdm9pZCBwcmludF9xb3NfcGFyYW1ldGVycyhRb3NDb25maWcgcW9zX2NvbmZpZyk7Ci12b2lkIHNlbGVjdF9iZXN0X2NvZGVjX2NvbmZpZyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByb2ZpbGVfdHlwZSwgQ29kZWNDb25maWcgKmNvZGVjX2NvbmZpZywgaW50IGRpciwgaW50IGNvbmZpZ190eXBlKTsKLXN0YXRpYyBVY2FzdENsaWVudEludGVyZmFjZSogc1VjYXN0Q2xpZW50SW50ZXJmYWNlID0gbnVsbHB0cjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMb2NhbCBoZWxwZXIgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IGNoYXIqIGR1bXBfYWNtX3NtX2V2ZW50X25hbWUoYnRpZl9hY21fc21fZXZlbnRfdCBldmVudCkgewotICBzd2l0Y2ggKChpbnQpZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FDTV9ESVNDT05ORUNUX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FDTV9DT05ORUNUX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FDTV9TVEFSVF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BQ01fU1RPUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9BQ01fUkVDT05GSUdfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQUNNX0NPTkZJR19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQUNNX0NPTk5FQ1RfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BQ01fRElTQ09OTkVDVF9SRVFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0FDTV9TVEFSVF9TVFJFQU1fUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BQ01fU1RPUF9TVFJFQU1fUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9BQ01fUkVDT05GSUdfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0FDTV9DT05OX1VQREFURV9USU1FT1VUX0VWVCkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVTktOT1dOX0VWRU5UIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2NzaXBfZXZlbnRfbmFtZShidGlmX2NzaXBfc21fZXZlbnRfdCBldmVudCkgewotICBzd2l0Y2ggKChpbnQpZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRBX0NTSVBfTkVXX1NFVF9GT1VORF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9DU0lQX1NFVF9NRU1CRVJfRk9VTkRfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQ1NJUF9DT05OX1NUQVRFX0NIR19FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9DU0lQX0xPQ0tfU1RBVFVTX0NIQU5HRURfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVEFfQ1NJUF9MT0NLX0FWQUlMQUJMRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9DU0lQX1NFVF9TSVpFX0NIQU5HRUQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTl9FVkVOVCI7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2FjbV9zaWduYWxfc2Vzc2lvbl9yZWFkeSgpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChhY21fc2Vzc2lvbl93YWl0X211dGV4Xyk7Ci0gIGlmKCFhY21fc2Vzc2lvbl93YWl0KSB7Ci0gICAgYWNtX3Nlc3Npb25fd2FpdCA9IHRydWU7Ci0gICAgYWNtX3Nlc3Npb25fd2FpdF9jdi5ub3RpZnlfYWxsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogYWxyZWFkeSBzaWduYWxsZWQgIixfX2Z1bmNfXyk7Ci0gIH0KLX0KLQotdm9pZCBmZXRjaF9tZWRpYV90eF9jb2RlY19xb3NfY29uZmlnKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBwcm9maWxlX3R5cGUsIFN0cmVhbUNvbm5lY3QgKmNvbm5fbWVkaWEpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyAsIHByb2ZpbGVfdHlwZTogJWQiLCBfX2Z1bmNfXywgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGVfdHlwZSk7Ci0gICAgQ29kZWNRb3NDb25maWcgY29uZjsKLSAgICBCdGlmQWNtUGVlciogcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihiZF9hZGRyKTsKLSAgICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBwZWVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwZWVyLT5Jc1N0ZXJlb0hzVHlwZSgpKSB7Ci0gICAgICAvL1N0ZXJlbyBIUyBjb25maWcgMQotICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlci0+UGVlckFkZHJlc3MoKSwgcHJvZmlsZV90eXBlLCBNRURJQV9DT05URVhULCBTTkssIFNURVJFT19IU19DT05GSUdfMSk7Ci0gICAgICBjb25mID0gcGVlci0+Z2V0X3BlZXJfbWVkaWFfY29kZWNfcW9zX2NvbmZpZygpOwotICAgICAgcHJpbnRfY29kZWNfcGFyYW1ldGVycyhjb25mLmNvZGVjX2NvbmZpZyk7Ci0gICAgICBwcmludF9xb3NfcGFyYW1ldGVycyhjb25mLnFvc19jb25maWcpOwotICAgICAgY29ubl9tZWRpYS0+Y29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb25mKTsKLSAgICB9IGVsc2UgewotICAgICAgLy9FQiBjb25maWcKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXItPlBlZXJBZGRyZXNzKCksIHByb2ZpbGVfdHlwZSwgTUVESUFfQ09OVEVYVCwgU05LLCBFQl9DT05GSUcpOwotICAgICAgY29uZiA9IHBlZXItPmdldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgIHByaW50X2NvZGVjX3BhcmFtZXRlcnMoY29uZi5jb2RlY19jb25maWcpOwotICAgICAgcHJpbnRfcW9zX3BhcmFtZXRlcnMoY29uZi5xb3NfY29uZmlnKTsKLSAgICAgIGNvbm5fbWVkaWEtPmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29uZik7Ci0gICAgfQotICAgIGNvbm5fbWVkaWEtPnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgY29ubl9tZWRpYS0+c3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBjb25uX21lZGlhLT5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci19Ci0KLXZvaWQgZmV0Y2hfbWVkaWFfcnhfY29kZWNfcW9zX2NvbmZpZyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBpbnQgcHJvZmlsZV90eXBlLCBTdHJlYW1Db25uZWN0ICpjb25uX21lZGlhKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMgLCBwcm9maWxlX3R5cGU6ICVkIiwgX19mdW5jX18sIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBwcm9maWxlX3R5cGUpOwotICAgIENvZGVjUW9zQ29uZmlnIGNvbmY7Ci0gICAgQnRpZkFjbVBlZXIqIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIoYmRfYWRkcik7Ci0gICAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogcGVlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGVlci0+SXNTdGVyZW9Ic1R5cGUoKSkgewotICAgICAgLy9TdGVyZW8gSFMgY29uZmlnIDEKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXItPlBlZXJBZGRyZXNzKCksIFdNQ1AsIE1FRElBX0NPTlRFWFQsIFNSQywgU1RFUkVPX0hTX0NPTkZJR18xKTsKLSAgICAgIGNvbmYgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNvbmYuY29kZWNfY29uZmlnKTsKLSAgICAgIHByaW50X3Fvc19wYXJhbWV0ZXJzKGNvbmYucW9zX2NvbmZpZyk7Ci0gICAgICBjb25uX21lZGlhLT5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvbmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvL0VCIGNvbmZpZwotICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlci0+UGVlckFkZHJlc3MoKSwgV01DUCwgTUVESUFfQ09OVEVYVCwgU1JDLCBFQl9DT05GSUcpOwotICAgICAgY29uZiA9IHBlZXItPmdldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgIHByaW50X2NvZGVjX3BhcmFtZXRlcnMoY29uZi5jb2RlY19jb25maWcpOwotICAgICAgcHJpbnRfcW9zX3BhcmFtZXRlcnMoY29uZi5xb3NfY29uZmlnKTsKLSAgICAgIGNvbm5fbWVkaWEtPmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29uZik7Ci0gICAgfQotICAgIGNvbm5fbWVkaWEtPnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgY29ubl9tZWRpYS0+c3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFOyAvL0xpdmUgYXVkaW8gY29udGV4dAotICAgIGNvbm5fbWVkaWEtPnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotfQotCi12b2lkIGZldGNoX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgaW50IHByb2ZpbGVfdHlwZSwgU3RyZWFtQ29ubmVjdCAqY29ubl92b2ljZSkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzICwgcHJvZmlsZV90eXBlOiAlZCIsIF9fZnVuY19fLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgcHJvZmlsZV90eXBlKTsKLSAgICBDb2RlY1Fvc0NvbmZpZyBjb25mOwotICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGJkX2FkZHIpOwotICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHBlZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBlZXItPklzU3RlcmVvSHNUeXBlKCkpIHsKLSAgICAgIC8vU3RlcmVvIEhTIGNvbmZpZyAxCi0gICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyLT5QZWVyQWRkcmVzcygpLCBCQVAsIFZPSUNFX0NPTlRFWFQsIFNSQywgU1RFUkVPX0hTX0NPTkZJR18xKTsKLSAgICAgIGNvbmYgPSBwZWVyLT5nZXRfcGVlcl92b2ljZV9yeF9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNvbmYuY29kZWNfY29uZmlnKTsKLSAgICAgIHByaW50X3Fvc19wYXJhbWV0ZXJzKGNvbmYucW9zX2NvbmZpZyk7Ci0gICAgICBjb25uX3ZvaWNlLT5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvbmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBFQiBjb25maWcKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXItPlBlZXJBZGRyZXNzKCksIEJBUCwgVk9JQ0VfQ09OVEVYVCwgU1JDLCBFQl9DT05GSUcpOwotICAgICAgY29uZiA9IHBlZXItPmdldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgIHByaW50X2NvZGVjX3BhcmFtZXRlcnMoY29uZi5jb2RlY19jb25maWcpOwotICAgICAgcHJpbnRfcW9zX3BhcmFtZXRlcnMoY29uZi5xb3NfY29uZmlnKTsKLSAgICAgIGNvbm5fdm9pY2UtPmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29uZik7Ci0gICAgfQotICAgIGNvbm5fdm9pY2UtPnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgY29ubl92b2ljZS0+c3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX3ZvaWNlLT5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQzsKLX0KLQotdm9pZCBmZXRjaF92b2ljZV90eF9jb2RlY19xb3NfY29uZmlnKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBwcm9maWxlX3R5cGUsIFN0cmVhbUNvbm5lY3QgKmNvbm5fdm9pY2UpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyAsIHByb2ZpbGVfdHlwZTogJWQiLCBfX2Z1bmNfXywgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGVfdHlwZSk7Ci0gICAgQ29kZWNRb3NDb25maWcgY29uZjsKLSAgICBCdGlmQWNtUGVlciogcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihiZF9hZGRyKTsKLSAgICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBwZWVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwZWVyLT5Jc1N0ZXJlb0hzVHlwZSgpKSB7Ci0gICAgICAvL1N0ZXJlbyBIUyBjb25maWcgMQotICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlci0+UGVlckFkZHJlc3MoKSwgQkFQLCBWT0lDRV9DT05URVhULCBTTkssIFNURVJFT19IU19DT05GSUdfMSk7Ci0gICAgICBjb25mID0gcGVlci0+Z2V0X3BlZXJfdm9pY2VfdHhfY29kZWNfcW9zX2NvbmZpZygpOwotICAgICAgcHJpbnRfY29kZWNfcGFyYW1ldGVycyhjb25mLmNvZGVjX2NvbmZpZyk7Ci0gICAgICBwcmludF9xb3NfcGFyYW1ldGVycyhjb25mLnFvc19jb25maWcpOwotICAgICAgY29ubl92b2ljZS0+Y29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb25mKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gRUIgY29uZmlnCi0gICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyLT5QZWVyQWRkcmVzcygpLCBCQVAsIFZPSUNFX0NPTlRFWFQsIFNOSywgRUJfQ09ORklHKTsKLSAgICAgIGNvbmYgPSBwZWVyLT5nZXRfcGVlcl92b2ljZV90eF9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNvbmYuY29kZWNfY29uZmlnKTsKLSAgICAgIHByaW50X3Fvc19wYXJhbWV0ZXJzKGNvbmYucW9zX2NvbmZpZyk7Ci0gICAgICBjb25uX3ZvaWNlLT5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvbmYpOwotICAgIH0KLSAgICBjb25uX3ZvaWNlLT5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIGNvbm5fdm9pY2UtPnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgY29ubl92b2ljZS0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotfQotCi1CdGlmQWNtRXZlbnQ6OkJ0aWZBY21FdmVudCh1aW50MzJfdCBldmVudCwgY29uc3Qgdm9pZCogcF9kYXRhLCBzaXplX3QgZGF0YV9sZW5ndGgpCi0gICAgOiBldmVudF8oZXZlbnQpLCBkYXRhXyhudWxscHRyKSwgZGF0YV9sZW5ndGhfKDApIHsKLSAgRGVlcENvcHkoZXZlbnQsIHBfZGF0YSwgZGF0YV9sZW5ndGgpOwotfQotCi1CdGlmQWNtRXZlbnQ6OkJ0aWZBY21FdmVudChjb25zdCBCdGlmQWNtRXZlbnQmIG90aGVyKQotICAgIDogZXZlbnRfKDApLCBkYXRhXyhudWxscHRyKSwgZGF0YV9sZW5ndGhfKDApIHsKLSAgKnRoaXMgPSBvdGhlcjsKLX0KLQotQnRpZkFjbUV2ZW50JiBCdGlmQWNtRXZlbnQ6Om9wZXJhdG9yPShjb25zdCBCdGlmQWNtRXZlbnQmIG90aGVyKSB7Ci0gIERlZXBGcmVlKCk7Ci0gIERlZXBDb3B5KG90aGVyLkV2ZW50KCksIG90aGVyLkRhdGEoKSwgb3RoZXIuRGF0YUxlbmd0aCgpKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1CdGlmQWNtRXZlbnQ6On5CdGlmQWNtRXZlbnQoKSB7IERlZXBGcmVlKCk7IH0KLQotc3RkOjpzdHJpbmcgQnRpZkFjbUV2ZW50OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50Xyk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKHVpbnQzMl90IGV2ZW50KSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWUgPSBkdW1wX2FjbV9zbV9ldmVudF9uYW1lKChidGlmX2FjbV9zbV9ldmVudF90KWV2ZW50KTsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3NfdmFsdWU7Ci0gIHNzX3ZhbHVlIDw8ICIoMHgiIDw8IHN0ZDo6aGV4IDw8IGV2ZW50IDw8ICIpIjsKLSAgcmV0dXJuIG5hbWUgKyBzc192YWx1ZS5zdHIoKTsKLX0KLQotdm9pZCBCdGlmQWNtRXZlbnQ6OkRlZXBDb3B5KHVpbnQzMl90IGV2ZW50LCBjb25zdCB2b2lkKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9sZW5ndGgpIHsKLSAgZXZlbnRfID0gZXZlbnQ7Ci0gIGRhdGFfbGVuZ3RoXyA9IGRhdGFfbGVuZ3RoOwotICBpZiAoZGF0YV9sZW5ndGggPT0gMCkgewotICAgIGRhdGFfID0gbnVsbHB0cjsKLSAgfSBlbHNlIHsKLSAgICBkYXRhXyA9IG9zaV9tYWxsb2MoZGF0YV9sZW5ndGhfKTsKLSAgICBtZW1jcHkoZGF0YV8sIHBfZGF0YSwgZGF0YV9sZW5ndGgpOwotICB9Ci19Ci0KLXZvaWQgQnRpZkFjbUV2ZW50OjpEZWVwRnJlZSgpIHsKLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmRhdGFfKTsKLSAgZGF0YV9sZW5ndGhfID0gMDsKLX0KLQotQnRpZkNzaXBFdmVudDo6QnRpZkNzaXBFdmVudCh1aW50MzJfdCBldmVudCwgY29uc3Qgdm9pZCogcF9kYXRhLCBzaXplX3QgZGF0YV9sZW5ndGgpCi0gICAgOiBldmVudF8oZXZlbnQpLCBkYXRhXyhudWxscHRyKSwgZGF0YV9sZW5ndGhfKDApIHsKLSAgRGVlcENvcHkoZXZlbnQsIHBfZGF0YSwgZGF0YV9sZW5ndGgpOwotfQotCi1CdGlmQ3NpcEV2ZW50OjpCdGlmQ3NpcEV2ZW50KGNvbnN0IEJ0aWZDc2lwRXZlbnQmIG90aGVyKQotICAgIDogZXZlbnRfKDApLCBkYXRhXyhudWxscHRyKSwgZGF0YV9sZW5ndGhfKDApIHsKLSAgKnRoaXMgPSBvdGhlcjsKLX0KLQotQnRpZkNzaXBFdmVudCYgQnRpZkNzaXBFdmVudDo6b3BlcmF0b3I9KGNvbnN0IEJ0aWZDc2lwRXZlbnQmIG90aGVyKSB7Ci0gIERlZXBGcmVlKCk7Ci0gIERlZXBDb3B5KG90aGVyLkV2ZW50KCksIG90aGVyLkRhdGEoKSwgb3RoZXIuRGF0YUxlbmd0aCgpKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1CdGlmQ3NpcEV2ZW50Ojp+QnRpZkNzaXBFdmVudCgpIHsgRGVlcEZyZWUoKTsgfQotCi1zdGQ6OnN0cmluZyBCdGlmQ3NpcEV2ZW50OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIEJ0aWZDc2lwRXZlbnQ6OkV2ZW50TmFtZShldmVudF8pOwotfQotCi1zdGQ6OnN0cmluZyBCdGlmQ3NpcEV2ZW50OjpFdmVudE5hbWUodWludDMyX3QgZXZlbnQpIHsKLSAgc3RkOjpzdHJpbmcgbmFtZSA9IGR1bXBfY3NpcF9ldmVudF9uYW1lKChidGlmX2NzaXBfc21fZXZlbnRfdClldmVudCk7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzX3ZhbHVlOwotICBzc192YWx1ZSA8PCAiKDB4IiA8PCBzdGQ6OmhleCA8PCBldmVudCA8PCAiKSI7Ci0gIHJldHVybiBuYW1lICsgc3NfdmFsdWUuc3RyKCk7Ci19Ci0KLXZvaWQgQnRpZkNzaXBFdmVudDo6RGVlcENvcHkodWludDMyX3QgZXZlbnQsIGNvbnN0IHZvaWQqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX2xlbmd0aCkgewotICBldmVudF8gPSBldmVudDsKLSAgZGF0YV9sZW5ndGhfID0gZGF0YV9sZW5ndGg7Ci0gIGlmIChkYXRhX2xlbmd0aCA9PSAwKSB7Ci0gICAgZGF0YV8gPSBudWxscHRyOwotICB9IGVsc2UgewotICAgIGRhdGFfID0gb3NpX21hbGxvYyhkYXRhX2xlbmd0aF8pOwotICAgIG1lbWNweShkYXRhXywgcF9kYXRhLCBkYXRhX2xlbmd0aCk7Ci0gIH0KLX0KLQotdm9pZCBCdGlmQ3NpcEV2ZW50OjpEZWVwRnJlZSgpIHsKLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJmRhdGFfKTsKLSAgZGF0YV9sZW5ndGhfID0gMDsKLX0KLQotQnRpZkFjbVBlZXI6OkJ0aWZBY21QZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywgdWludDhfdCBwZWVyX3NlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNldF9pZCwgdWludDhfdCBjaWdfaWQsIHVpbnQ4X3QgY2lzX2lkKQotICAgIDogcGVlcl9hZGRyZXNzXyhwZWVyX2FkZHJlc3MpLAotICAgICAgcGVlcl9zZXBfKHBlZXJfc2VwKSwKLSAgICAgIHNldF9pZF8oc2V0X2lkKSwKLSAgICAgIGNpZ19pZF8oY2lnX2lkKSwKLSAgICAgIGNpc19pZF8oY2lzX2lkKSwKLSAgICAgIHN0YXRlX21hY2hpbmVfKCp0aGlzKSwKLSAgICAgIGZsYWdzXygwKSB7fQotCi1CdGlmQWNtUGVlcjo6fkJ0aWZBY21QZWVyKCkgeyAvKmFsYXJtX2ZyZWUoYXZfb3Blbl9vbl9yY190aW1lcl8pOyovIH0KLQotc3RkOjpzdHJpbmcgQnRpZkFjbVBlZXI6OkZsYWdzVG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLQotICBpZiAoZmxhZ3NfICYgQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCkgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICJMT0NBTF9TVVNQRU5EX1BFTkRJTkciOwotICB9Ci0gIGlmIChmbGFnc18gJiBCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nUmVjb25maWd1cmUpIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiUEVORElOR19SRUNPTkZJR1VSRSI7Ci0gIH0KLSAgaWYgKGZsYWdzXyAmIEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdTdGFydCkgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICJQRU5ESU5HX1NUQVJUIjsKLSAgfQotICBpZiAoZmxhZ3NfICYgQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1N0b3ApIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiUEVORElOR19TVE9QIjsKLSAgfQotICBpZiAoZmxhZ3NfICYgQnRpZkFjbVBlZXI6OmtGTGFnUGVuZGluZ1N0YXJ0QWZ0ZXJSZWNvbmZpZykgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICJQRU5ESU5HX1NUQVJUX0FGVEVSX1JFQ09ORklHIjsKLSAgfQotICBpZiAocmVzdWx0LmVtcHR5KCkpIHJlc3VsdCA9ICJOb25lIjsKLQotICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCIweCV4KCVzKSIsIGZsYWdzXywgcmVzdWx0LmNfc3RyKCkpOwotfQotCi1idF9zdGF0dXNfdCBCdGlmQWNtUGVlcjo6SW5pdCgpIHsKLSAgc3RhdGVfbWFjaGluZV8uU3RhcnQoKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIEJ0aWZBY21QZWVyOjpDbGVhbnVwKCkgewotICBzdGF0ZV9tYWNoaW5lXy5RdWl0KCk7Ci19Ci0KLWJvb2wgQnRpZkFjbVBlZXI6OkNhbkJlRGVsZXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuICgKLSAgICAgIChzdGF0ZV9tYWNoaW5lXy5TdGF0ZUlkKCkgPT0gQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSkgJiYKLSAgICAgIChzdGF0ZV9tYWNoaW5lXy5QcmV2aW91c1N0YXRlSWQoKSAhPSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJbnZhbGlkKSk7Ci19Ci0KLWNvbnN0IFJhd0FkZHJlc3MmIEJ0aWZBY21QZWVyOjpNdXNpY0FjdGl2ZVBlZXJBZGRyZXNzKCkgY29uc3QgewotICByZXR1cm4gYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlUGVlcigpOwotfQotY29uc3QgUmF3QWRkcmVzcyYgQnRpZkFjbVBlZXI6OlZvaWNlQWN0aXZlUGVlckFkZHJlc3MoKSBjb25zdCB7Ci0gIHJldHVybiBidGlmX2FjbV9pbml0aWF0b3IuVm9pY2VBY3RpdmVQZWVyKCk7Ci19Ci11aW50OF90IEJ0aWZBY21QZWVyOjpNdXNpY0FjdGl2ZVNldElkKCkgY29uc3QgewotICByZXR1cm4gYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCk7Ci19Ci11aW50OF90IEJ0aWZBY21QZWVyOjpWb2ljZUFjdGl2ZVNldElkKCkgY29uc3QgewotICByZXR1cm4gYnRpZl9hY21faW5pdGlhdG9yLlZvaWNlQWN0aXZlQ1NldElkKCk7Ci19Ci0KLWJvb2wgQnRpZkFjbVBlZXI6OklzQ29ubmVjdGVkKCkgY29uc3QgewotICBpbnQgc3RhdGUgPSBzdGF0ZV9tYWNoaW5lXy5TdGF0ZUlkKCk7Ci0gIHJldHVybiAoKHN0YXRlID09IEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZCkgfHwKLSAgICAgICAgICAoc3RhdGUgPT0gQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZCkpOwotfQotCi1ib29sIEJ0aWZBY21QZWVyOjpJc1N0cmVhbWluZygpIGNvbnN0IHsKLSAgaW50IHN0YXRlID0gc3RhdGVfbWFjaGluZV8uU3RhdGVJZCgpOwotICByZXR1cm4gKHN0YXRlID09IEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZVN0YXJ0ZWQpOwotfQotCi1CdGlmQWNtSW5pdGlhdG9yOjp+QnRpZkFjbUluaXRpYXRvcigpIHsKLSAgQ2xlYW51cEFsbFBlZXJzKCk7Ci19Ci0KLXZvaWQgaW5pdF9sb2NhbF9jYXBhYmlsaXRpZXMoKSB7Ci0gIHVuaWNhc3RfY29kZWNzX2NhcGFiaWxpdGllcy5wdXNoX2JhY2soYWNtX2xvY2FsX2NhcGFiaWxpdHkpOwotfQotCi12b2lkIEJ0aWZBY21Jbml0aWF0b3I6OkNsZWFudXAoKSB7Ci0gIExPR19JTkZPKExPR19UQUcsICIlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICBpZiAoIWVuYWJsZWRfKSByZXR1cm47Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2U7Ci0gIGJ0aWZfZGlzYWJsZV9zZXJ2aWNlKEJUQV9BQ01fSU5JVElBVE9SX1NFUlZJQ0VfSUQpOyAvLyBBQ00gZGVyZWdpc3RyYXRpb24gcmVxdWlyZWQ/Ci0gIENsZWFudXBBbGxQZWVycygpOwotICBhbGFybV9mcmVlKG11c2ljX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfKTsKLSAgbXVzaWNfc2V0X2xvY2tfcmVsZWFzZV90aW1lcl8gPSBudWxscHRyOwotICBhbGFybV9mcmVlKG11c2ljX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfKTsKLSAgbXVzaWNfc2V0X2xvY2tfcmVsZWFzZV90aW1lcl8gPSBudWxscHRyOwotICBhbGFybV9mcmVlKGFjbV9ncm91cF9wcm9jZWR1cmVfdGltZXJfKTsKLSAgYWNtX2dyb3VwX3Byb2NlZHVyZV90aW1lcl8gPSBudWxscHRyOwotICBhbGFybV9mcmVlKGFjbV9jb25uX2ludGVydmFsX3RpbWVyXyk7Ci0gIGFjbV9jb25uX2ludGVydmFsX3RpbWVyXyA9IG51bGxwdHI7Ci0gIGNhbGxiYWNrc18gPSBudWxscHRyOwotICBlbmFibGVkXyA9IGZhbHNlOwotICBpZiAoc1VjYXN0Q2xpZW50SW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNsZWFudXAoKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UgPSBudWxscHRyOwotICB9Ci19Ci0KLUJ0aWZBY21QZWVyKiBCdGlmQWNtSW5pdGlhdG9yOjpGaW5kUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgYXV0byBpdCA9IHBlZXJzXy5maW5kKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChpdCAhPSBwZWVyc18uZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdWludDhfdCBCdGlmQWNtSW5pdGlhdG9yOjogRmluZFBlZXJTZXRJZChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgICBhdXRvIGl0ID0gYWRkcl9zZXRpZF9wYWlyLmZpbmQocGVlcl9hZGRyZXNzKTsKLSAgICBpZiAoaXQgIT0gYWRkcl9zZXRpZF9wYWlyLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZDsKLSAgICByZXR1cm4gMHhmZjsKLX0KLQotdWludDhfdCBCdGlmQWNtSW5pdGlhdG9yOjogRmluZFBlZXJCeVNldElkKHVpbnQ4X3Qgc2V0aWQpIHsKLSAgZm9yIChhdXRvIGl0IDogYWRkcl9zZXRpZF9wYWlyKSB7Ci0gICAgaWYgKGl0LnNlY29uZCA9PSBzZXRpZCkgewotICAgICAgcmV0dXJuIHNldGlkOwotICAgIH0KLSAgfQotICByZXR1cm4gMHhmZjsKLX0KLQotdWludDhfdCBCdGlmQWNtSW5pdGlhdG9yOjogRmluZFBlZXJDaWdJZCh1aW50OF90IHNldGlkKSB7Ci0gICAgYXV0byBpdCA9IHNldF9jaWdfcGFpci5maW5kKHNldGlkKTsKLSAgICBpZiAoaXQgIT0gc2V0X2NpZ19wYWlyLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZDsKLSAgICByZXR1cm4gMHhmZjsKLX0KLQotdWludDhfdCBCdGlmQWNtSW5pdGlhdG9yOjogRmluZFBlZXJCeUNpZ0lkKHVpbnQ4X3QgY2lnaWQpIHsKLSAgZm9yIChhdXRvIGl0IDogc2V0X2NpZ19wYWlyKSB7Ci0gICAgaWYgKGl0LnNlY29uZCA9PSBjaWdpZCkgewotICAgICAgcmV0dXJuIGNpZ2lkOwotICAgIH0KLSAgfQotICByZXR1cm4gMHhmZjsKLX0KLQotdWludDhfdCBCdGlmQWNtSW5pdGlhdG9yOjogRmluZFBlZXJCeUNpc0lkKHVpbnQ4X3QgY2lnaWQsIHVpbnQ4X3QgY2lzaWQpIHsKLSAgZm9yIChhdXRvIGl0ciA9IGNpZ19jaXNfcGFpci5iZWdpbigpOyBpdHIgIT0gY2lnX2Npc19wYWlyLmVuZCgpOyBpdHIrKykgewotICAgIGZvciAoYXV0byBwdHIgPSBpdHItPnNlY29uZC5iZWdpbigpOyBwdHIgIT0gaXRyLT5zZWNvbmQuZW5kKCk7IHB0cisrKSB7Ci0gICAgICBpZiAocHRyLT5maXJzdCA9PSBjaWdpZCkgewotICAgICAgICBpZiAocHRyLT5zZWNvbmQgPT0gY2lzaWQpIHsKLSAgICAgICAgICByZXR1cm4gY2lzaWQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDB4ZmY7Ci19Ci0KLUJ0aWZBY21QZWVyKiBCdGlmQWNtSW5pdGlhdG9yOjpGaW5kT3JDcmVhdGVQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogcGVlcl9hZGRyZXNzPSVzICIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgQnRpZkFjbVBlZXIqIHBlZXIgPSBGaW5kUGVlcihwZWVyX2FkZHJlc3MpOwotICBpZiAocGVlciAhPSBudWxscHRyKSByZXR1cm4gcGVlcjsKLQotICB1aW50OF90IFNldElkLCBDaWdJZCwgQ2lzSWQ7Ci0gIC8vZ2V0IHRoZSBzZXQgaWQgZnJvbSBDU0lQLgotICAvL1RPRE86IG5lZWQgVVVJRCA/Ci0gIFV1aWQgdXVpZCA9IFV1aWQ6OmtFbXB0eTsKLSAgTE9HX0lORk8oTE9HX1RBRywgIiVzIEFDTSBVVUlEID0gJXMiLCBfX2Z1bmNfXywgdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBTZXRJZCA9IEJUQV9Dc2lwR2V0RGV2aWNlU2V0SWQocGVlcl9hZGRyZXNzLCB1dWlkKTsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHNldCBpZCBmcm9tIGNzaXAgOiAlZCIsIF9fZnVuY19fLCBTZXRJZCk7Ci0gIGlmIChTZXRJZCA9PSBJTlZBTElEX1NFVF9JRCkgewotICAgIFNldElkID0gRmluZFBlZXJTZXRJZChwZWVyX2FkZHJlc3MpOwotICAgIC8vIEZpbmQgbmV4dCBhdmFpbGFibGUgU0VUIElEIHRvIHVzZQotICAgIGlmIChTZXRJZCA9PSAweGZmKSB7Ci0gICAgICBmb3IgKFNldElkID0ga1BlZXJNaW5TZXRJZDsgU2V0SWQgPCBrUGVlck1heFNldElkOyBTZXRJZCsrKSB7Ci0gICAgICAgIGlmIChGaW5kUGVlckJ5U2V0SWQoU2V0SWQpID09IDB4ZmYpIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoU2V0SWQgPT0ga1BlZXJNYXhTZXRJZCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogQ2Fubm90IGNyZWF0ZSBwZWVyIGZvciBwZWVyX2FkZHJlc3M9JXMgOiAiCi0gICAgICAgICJjYW5ub3QgYWxsb2NhdGUgdW5pcXVlIFNFVCBJRCIsCi0gICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGFkZHJfc2V0aWRfcGFpci5pbnNlcnQoc3RkOjptYWtlX3BhaXIocGVlcl9hZGRyZXNzLCBTZXRJZCkpOwotCi0gIC8vRmluZCBuZXh0IGF2YWlsYWJsZSBDSUcgSUQgdG8gdXNlCi0gIENpZ0lkID0gRmluZFBlZXJDaWdJZChTZXRJZCk7Ci0gIGlmIChDaWdJZCA9PSAweGZmKSB7Ci0gICAgZm9yIChDaWdJZCA9IGtDaWdJZE1pbjsgQ2lnSWQgPCBrQ2lnSWRNYXg7ICkgewotICAgICAgaWYgKEZpbmRQZWVyQnlDaWdJZChDaWdJZCkgPT0gMHhmZikgYnJlYWs7Ci0gICAgICBDaWdJZCArPSA0OwotICAgIH0KLSAgfQotICBpZiAoQ2lnSWQgPT0ga0NpZ0lkTWF4KSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigKLSAgICAgICAgIiVzOiBjYW5ub3QgYWxsb2NhdGUgdW5pcXVlIENJRyBJRCB0byA9ICVzICIsCi0gICAgICAgIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBzZXRfY2lnX3BhaXIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFNldElkLCBDaWdJZCkpOwotCi0gIC8vRmluZCBuZXh0IGF2YWlsYWJsZSBDSVMgSUQgdG8gdXNlCi0gIGZvciAoQ2lzSWQgPSBrQ2lnSWRNaW47IENpc0lkIDwga0NpZ0lkTWF4OyBDaXNJZCsrKSB7Ci0gICAgaWYgKEZpbmRQZWVyQnlDaXNJZChDaWdJZCwgQ2lzSWQpID09IDB4ZmYpIGJyZWFrOwotICB9Ci0gIGlmIChDaXNJZCA9PSBrQ2lnSWRNYXgpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IGNhbm5vdCBhbGxvY2F0ZSB1bmlxdWUgQ0lTIElEIHRvID0gJXMgIiwKLSAgICAgICAgX19mdW5jX18sIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGNpZ19jaXNfcGFpci5pbnNlcnQoc3RkOjptYWtlX3BhaXIocGVlcl9hZGRyZXNzLCBtYXA8dWludDhfdCwgdWludDhfdD4oKSkpOwotICBjaWdfY2lzX3BhaXJbcGVlcl9hZGRyZXNzXS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoQ2lnSWQsIENpc0lkKSk7Ci0KLSAgTE9HX0lORk8oTE9HX1RBRywKLSAgICAgICAgICAgIiVzOiBDcmVhdGUgcGVlcjogcGVlcl9hZGRyZXNzPSVzLCBzZXRfaWQ9JWQsIGNpZ19pZD0lZCwgY2lzX2lkPSVkIiwKLSAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgU2V0SWQsIENpZ0lkLCBDaXNJZCk7Ci0gIHBlZXIgPSBuZXcgQnRpZkFjbVBlZXIocGVlcl9hZGRyZXNzLCBBQ01fVFNFUF9TTkssIFNldElkLCBDaWdJZCwgQ2lzSWQpOwotICBwZWVyLT5TZXRQZWVyVm9pY2VUeFN0YXRlKFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpOwotICBwZWVyLT5TZXRQZWVyVm9pY2VSeFN0YXRlKFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpOwotICBwZWVyLT5TZXRQZWVyTXVzaWNUeFN0YXRlKFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpOwotICBwZWVyLT5TZXRQZWVyTXVzaWNSeFN0YXRlKFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpOwotICBpZiAoU2V0SWQgPj0ga1BlZXJNaW5TZXRJZCAmJiBTZXRJZCA8IGtQZWVyTWF4U2V0SWQpIHsKLSAgICBMT0dfSU5GTyhMT0dfVEFHLAotICAgICAgICAgICAgICIlczogQ3JlYXRlZCBwZWVyIGlzIFRXTSBkZXZpY2UiLF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgIHBlZXItPlNldElzU3RlcmVvSHNUeXBlKHRydWUpOwotICB9Ci0gIHBlZXJzXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIocGVlcl9hZGRyZXNzLCBwZWVyKSk7Ci0gIHBlZXItPkluaXQoKTsKLSAgcmV0dXJuIHBlZXI7Ci19Ci0KLUJ0aWZBY21QZWVyKiBCdGlmQWNtSW5pdGlhdG9yOjpGaW5kTXVzaWNBY3RpdmVQZWVyKCkgewotICBmb3IgKGF1dG8gaXQgOiBwZWVyc18pIHsKLSAgICBCdGlmQWNtUGVlciogcGVlciA9IGl0LnNlY29uZDsKLSAgICBpZiAocGVlci0+SXNQZWVyQWN0aXZlRm9yTXVzaWMoKSkgewotICAgICAgcmV0dXJuIHBlZXI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1ib29sIEJ0aWZBY21Jbml0aWF0b3I6OkFsbG93ZWRUb0Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSBjb25zdCB7Ci0gIGludCBjb25uZWN0ZWQgPSAwOwotCi0gIC8vIENvdW50IHBlZXJzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3Rpbmcgb3IgYWxyZWFkeSBjb25uZWN0ZWQKLSAgZm9yIChhdXRvIGl0IDogcGVlcnNfKSB7Ci0gICAgY29uc3QgQnRpZkFjbVBlZXIqIHBlZXIgPSBpdC5zZWNvbmQ7Ci0gICAgc3dpdGNoIChwZWVyLT5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCkpIHsKLSAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmluZzoKLSAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkOgotICAgICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVTdGFydGVkOgotICAgICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVSZWNvbmZpZ3VyaW5nOgotICAgICAgICBpZiAocGVlci0+UGVlckFkZHJlc3MoKSA9PSBwZWVyX2FkZHJlc3MpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEFscmVhZHkgY29ubmVjdGVkIG9yIGFjY291bnRlZCBmb3IKLSAgICAgICAgfQotICAgICAgICBjb25uZWN0ZWQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChjb25uZWN0ZWQgPCBtYXhfY29ubmVjdGVkX3BlZXJzXyk7Ci19Ci0KLWJvb2wgQnRpZkFjbUluaXRpYXRvcjo6SXNBY21JZGxlKCkgY29uc3QgewotICBpbnQgY29ubmVjdGVkID0gMDsKLQotICAvLyBDb3VudCBwZWVycyB0aGF0IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIG9yIGFscmVhZHkgY29ubmVjdGVkCi0gIGZvciAoYXV0byBpdCA6IHBlZXJzXykgewotICAgIGNvbnN0IEJ0aWZBY21QZWVyKiBwZWVyID0gaXQuc2Vjb25kOwotICAgIHN3aXRjaCAocGVlci0+U3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpKSB7Ci0gICAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5pbmc6Ci0gICAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZDoKLSAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZDoKLSAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlUmVjb25maWd1cmluZzoKLSAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZzoKLSAgICAgICAgY29ubmVjdGVkKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoY29ubmVjdGVkID09IDApOwotfQotCi1ib29sIEJ0aWZBY21Jbml0aWF0b3I6OklzU2V0SWRsZSh1aW50OF90IHNldElkKSBjb25zdCB7Ci0gIGludCBjb25uZWN0ZWQgPSAwOwotICB0QlRBX0NTSVBfQ1NFVCBjc2V0X2luZm8gPSBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0KHNldElkKTsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz46Oml0ZXJhdG9yIGl0cjsKLSAgaWYgKChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKGl0ciA9IChjc2V0X2luZm8uc2V0X21lbWJlcnMpLmJlZ2luKCk7IGl0ciAhPSAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5lbmQoKTsgaXRyKyspIHsKLSAgICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKCppdHIpOwotICAgICAgc3dpdGNoIChwZWVyLT5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCkpIHsKLSAgICAgICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuaW5nOgotICAgICAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZDoKLSAgICAgICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVTdGFydGVkOgotICAgICAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlY29uZmlndXJpbmc6Ci0gICAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZzoKLSAgICAgICAgICBjb25uZWN0ZWQrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChjb25uZWN0ZWQgPT0gMCk7Ci19Ci0KLWJvb2wgQnRpZkFjbUluaXRpYXRvcjo6SXNPdGhlclNldFBlZXJzSWRsZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIHVpbnQ4X3Qgc2V0SWQpIGNvbnN0IHsKLSAgaW50IGNvbm5lY3RlZCA9IDA7Ci0gIHRCVEFfQ1NJUF9DU0VUIGNzZXRfaW5mbyA9IEJUQV9Dc2lwR2V0Q29vcmRpbmF0ZWRTZXQoc2V0SWQpOwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPjo6aXRlcmF0b3IgaXRyOwotICBpZiAoKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpID4gMCkgewotICAgIGZvciAoaXRyID0gKGNzZXRfaW5mby5zZXRfbWVtYmVycykuYmVnaW4oKTsgaXRyICE9IChjc2V0X2luZm8uc2V0X21lbWJlcnMpLmVuZCgpOyBpdHIrKykgewotICAgICAgaWYgKCppdHIgID09IHBlZXJfYWRkcmVzcykgY29udGludWU7Ci0gICAgICBCdGlmQWNtUGVlciogcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcigqaXRyKTsKLSAgICAgIGlmIChwZWVyID09IG51bGxwdHIpIGNvbnRpbnVlOwotICAgICAgc3dpdGNoIChwZWVyLT5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCkpIHsKLSAgICAgICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuaW5nOgotICAgICAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZDoKLSAgICAgICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVTdGFydGVkOgotICAgICAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlY29uZmlndXJpbmc6Ci0gICAgICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZzoKLSAgICAgICAgICBjb25uZWN0ZWQrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChjb25uZWN0ZWQgPT0gMCk7Ci19Ci0KLWJvb2wgQnRpZkFjbUluaXRpYXRvcjo6RGVsZXRlUGVlcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgYXV0byBpdCA9IHBlZXJzXy5maW5kKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChpdCA9PSBwZWVyc18uZW5kKCkpIHJldHVybiBmYWxzZTsKLSAgQnRpZkFjbVBlZXIqIHBlZXIgPSBpdC0+c2Vjb25kOwotICBmb3IgKGF1dG8gaXRyID0gYWRkcl9zZXRpZF9wYWlyLmJlZ2luKCk7IGl0ciAhPSBhZGRyX3NldGlkX3BhaXIuZW5kKCk7ICsraXRyKSB7Ci0gICAgaWYgKGl0ci0+c2Vjb25kID09IHBlZXItPlNldElkKCkpIHsKLSAgICAgIGFkZHJfc2V0aWRfcGFpci5lcmFzZShpdHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byBpdHIgPSBzZXRfY2lnX3BhaXIuYmVnaW4oKTsgaXRyICE9IHNldF9jaWdfcGFpci5lbmQoKTsgKytpdHIpIHsKLSAgICBpZiAoaXRyLT5zZWNvbmQgPT0gcGVlci0+U2V0SWQoKSkgewotICAgICAgc2V0X2NpZ19wYWlyLmVyYXNlKGl0cik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICBmb3IgKGF1dG8gaXRyID0gY2lnX2Npc19wYWlyLmJlZ2luKCk7IGl0ciAhPSBjaWdfY2lzX3BhaXIuZW5kKCk7IGl0cisrKSB7Ci0gICAgZm9yIChhdXRvIHB0ciA9IGl0ci0+c2Vjb25kLmJlZ2luKCk7IHB0ciAhPSBpdHItPnNlY29uZC5lbmQoKTsgcHRyKyspIHsKLSAgICAgIGlmIChwdHItPmZpcnN0ID09IHBlZXItPkNpZ0lkKCkpIHsKLSAgICAgICAgaWYgKHB0ci0+c2Vjb25kID09IHBlZXItPkNpc0lkKCkpIHsKLSAgICAgICAgICBjaWdfY2lzX3BhaXIuZXJhc2UoaXRyKTsKLSAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZvdW5kKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcGVlci0+Q2xlYW51cCgpOwotICBwZWVyc18uZXJhc2UoaXQpOwotICBkZWxldGUgcGVlcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRpZkFjbUluaXRpYXRvcjo6RGVsZXRlSWRsZVBlZXJzKCkgewotICBmb3IgKGF1dG8gaXQgPSBwZWVyc18uYmVnaW4oKTsgaXQgIT0gcGVlcnNfLmVuZCgpOykgewotICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gaXQtPnNlY29uZDsKLSAgICBhdXRvIHByZXZfaXQgPSBpdCsrOwotICAgIGlmICghcGVlci0+Q2FuQmVEZWxldGVkKCkpIGNvbnRpbnVlOwotICAgIExPR19JTkZPKExPR19UQUcsICIlczogRGVsZXRpbmcgaWRsZSBwZWVyOiAlcyAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICBwZWVyLT5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZm9yIChhdXRvIGl0ciA9IGFkZHJfc2V0aWRfcGFpci5iZWdpbigpOyBpdHIgIT0gYWRkcl9zZXRpZF9wYWlyLmVuZCgpOyArK2l0cikgewotICAgICAgaWYgKGl0ci0+c2Vjb25kID09IHBlZXItPlNldElkKCkpIHsKLSAgICAgICAgYWRkcl9zZXRpZF9wYWlyLmVyYXNlKGl0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8gaXRyID0gc2V0X2NpZ19wYWlyLmJlZ2luKCk7IGl0ciAhPSBzZXRfY2lnX3BhaXIuZW5kKCk7ICsraXRyKSB7Ci0gICAgICBpZiAoaXRyLT5zZWNvbmQgPT0gcGVlci0+U2V0SWQoKSkgewotICAgICAgICBzZXRfY2lnX3BhaXIuZXJhc2UoaXRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8gaXRyID0gY2lnX2Npc19wYWlyLmJlZ2luKCk7IGl0ciAhPSBjaWdfY2lzX3BhaXIuZW5kKCk7IGl0cisrKSB7Ci0gICAgICBmb3IgKGF1dG8gcHRyID0gaXRyLT5zZWNvbmQuYmVnaW4oKTsgcHRyICE9IGl0ci0+c2Vjb25kLmVuZCgpOyBwdHIrKykgewotICAgICAgICBpZiAocHRyLT5maXJzdCA9PSBwZWVyLT5DaWdJZCgpKSB7Ci0gICAgICAgICAgaWYgKHB0ci0+c2Vjb25kID09IHBlZXItPkNpc0lkKCkpIHsKLSAgICAgICAgICAgIGNpZ19jaXNfcGFpci5lcmFzZShpdHIpOwotICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZm91bmQpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwZWVyLT5DbGVhbnVwKCk7Ci0gICAgcGVlcnNfLmVyYXNlKHByZXZfaXQpOwotICAgIGRlbGV0ZSBwZWVyOwotICB9Ci19Ci0KLXZvaWQgQnRpZkFjbUluaXRpYXRvcjo6Q2xlYW51cEFsbFBlZXJzKCkgewotICB3aGlsZSAoIXBlZXJzXy5lbXB0eSgpKSB7Ci0gICAgYXV0byBpdCA9IHBlZXJzXy5iZWdpbigpOwotICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gaXQtPnNlY29uZDsKLSAgICBmb3IgKGF1dG8gaXRyID0gYWRkcl9zZXRpZF9wYWlyLmJlZ2luKCk7IGl0ciAhPSBhZGRyX3NldGlkX3BhaXIuZW5kKCk7ICsraXRyKSB7Ci0gICAgICBpZiAoaXRyLT5zZWNvbmQgPT0gcGVlci0+U2V0SWQoKSkgewotICAgICAgICBhZGRyX3NldGlkX3BhaXIuZXJhc2UoaXRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoYXV0byBpdHIgPSBzZXRfY2lnX3BhaXIuYmVnaW4oKTsgaXRyICE9IHNldF9jaWdfcGFpci5lbmQoKTsgKytpdHIpIHsKLSAgICAgIGlmIChpdHItPnNlY29uZCA9PSBwZWVyLT5TZXRJZCgpKSB7Ci0gICAgICAgIHNldF9jaWdfcGFpci5lcmFzZShpdHIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoYXV0byBpdHIgPSBjaWdfY2lzX3BhaXIuYmVnaW4oKTsgaXRyICE9IGNpZ19jaXNfcGFpci5lbmQoKTsgaXRyKyspIHsKLSAgICAgIGZvciAoYXV0byBwdHIgPSBpdHItPnNlY29uZC5iZWdpbigpOyBwdHIgIT0gaXRyLT5zZWNvbmQuZW5kKCk7IHB0cisrKSB7Ci0gICAgICAgIGlmIChwdHItPmZpcnN0ID09IHBlZXItPkNpZ0lkKCkpIHsKLSAgICAgICAgICBpZiAocHRyLT5zZWNvbmQgPT0gcGVlci0+Q2lzSWQoKSkgewotICAgICAgICAgICAgY2lnX2Npc19wYWlyLmVyYXNlKGl0cik7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmb3VuZCkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBlZXItPkNsZWFudXAoKTsKLSAgICBwZWVyc18uZXJhc2UoaXQpOwotICAgIGRlbGV0ZSBwZWVyOwotICB9Ci19Ci0KLWNsYXNzIFVjYXN0Q2xpZW50Q2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBVY2FzdENsaWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB+VWNhc3RDbGllbnRDYWxsYmFja3NJbXBsKCkgPSBkZWZhdWx0OwotICB2b2lkIE9uU3RyZWFtU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RyZWFtc19zdGF0ZV9pbmZvKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGFkZHJlc3MpOwotICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyIGlzIE5VTEwiLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGl0ID0gc3RyZWFtc19zdGF0ZV9pbmZvLmJlZ2luKCk7IGl0ICE9IHN0cmVhbXNfc3RhdGVfaW5mby5lbmQoKTsgKytpdCkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdHJlYW0gdHlwZTogICAgIgotICAgICAgICAgICAgICAgICAgIDw8IEdldFN0cmVhbVR5cGUoaXQtPnN0cmVhbV90eXBlLnR5cGUpOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHN0cmVhbSBjb250ZXh0OiAiCi0gICAgICAgICAgICAgICAgICAgPDwgR2V0U3RyZWFtVHlwZShpdC0+c3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCk7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RyZWFtIGRpcjogICAgICIKLSAgICAgICAgICAgICAgICAgICA8PCBHZXRTdHJlYW1EaXJlY3Rpb24oaXQtPnN0cmVhbV90eXBlLmRpcmVjdGlvbik7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc3RyZWFtIHN0YXRlOiAgICIKLSAgICAgICAgICAgICAgICAgICA8PCBHZXRTdHJlYW1TdGF0ZShzdGF0aWNfY2FzdDxpbnQ+IChpdC0+c3RyZWFtX3N0YXRlKSk7Ci0gICAgICBzd2l0Y2ggKGl0LT5zdHJlYW1fc3RhdGUpIHsKLSAgICAgICAgY2FzZSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEOgotICAgICAgICBjYXNlIFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HOiB7Ci0gICAgICAgICAgdEJUQV9BQ01fU1RBVEVfSU5GTyBkYXRhID0gey5iZF9hZGRyID0gYWRkcmVzcywgLnN0cmVhbV90eXBlID0gaXQtPnN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtX3N0YXRlID0gaXQtPnN0cmVhbV9zdGF0ZSwgLnJlYXNvbiA9IGl0LT5yZWFzb259OwotICAgICAgICAgIGJ0aWZfYWNtX2hhbmRsZV9ldnQoQlRBX0FDTV9ESVNDT05ORUNUX0VWVCwgKGNoYXIqKSZkYXRhKTsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFN0cmVhbVN0YXRlOjpDT05ORUNUSU5HOgotICAgICAgICBjYXNlIFN0cmVhbVN0YXRlOjpDT05ORUNURUQ6IHsKLSAgICAgICAgICB0QlRBX0FDTV9TVEFURV9JTkZPIGRhdGEgPSB7LmJkX2FkZHIgPSBhZGRyZXNzLCAuc3RyZWFtX3R5cGUgPSBpdC0+c3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW1fc3RhdGUgPSBpdC0+c3RyZWFtX3N0YXRlLCAucmVhc29uID0gaXQtPnJlYXNvbn07Ci0gICAgICAgICAgYnRpZl9hY21faGFuZGxlX2V2dChCVEFfQUNNX0NPTk5FQ1RfRVZULCAoY2hhciopJmRhdGEpOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU3RyZWFtU3RhdGU6OlNUQVJUSU5HOgotICAgICAgICBjYXNlIFN0cmVhbVN0YXRlOjpTVFJFQU1JTkc6IHsKLSAgICAgICAgICB0QlRBX0FDTV9TVEFURV9JTkZPIGRhdGEgPSB7LmJkX2FkZHIgPSBhZGRyZXNzLCAuc3RyZWFtX3R5cGUgPSBpdC0+c3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW1fc3RhdGUgPSBpdC0+c3RyZWFtX3N0YXRlLCAucmVhc29uID0gaXQtPnJlYXNvbn07Ci0gICAgICAgICAgYnRpZl9hY21faGFuZGxlX2V2dChCVEFfQUNNX1NUQVJUX0VWVCwgKGNoYXIqKSZkYXRhKTsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFN0cmVhbVN0YXRlOjpTVE9QUElORzogewotICAgICAgICAgIHRCVEFfQUNNX1NUQVRFX0lORk8gZGF0YSA9IHsuYmRfYWRkciA9IGFkZHJlc3MsIC5zdHJlYW1fdHlwZSA9IGl0LT5zdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbV9zdGF0ZSA9IGl0LT5zdHJlYW1fc3RhdGUsIC5yZWFzb24gPSBpdC0+cmVhc29ufTsKLSAgICAgICAgICBidGlmX2FjbV9oYW5kbGVfZXZ0KEJUQV9BQ01fU1RPUF9FVlQsIChjaGFyKikmZGF0YSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTdHJlYW1TdGF0ZTo6UkVDT05GSUdVUklORzogewotICAgICAgICAgIHRCVEFfQUNNX1NUQVRFX0lORk8gZGF0YSA9IHsuYmRfYWRkciA9IGFkZHJlc3MsIC5zdHJlYW1fdHlwZSA9IGl0LT5zdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbV9zdGF0ZSA9IGl0LT5zdHJlYW1fc3RhdGUsIC5yZWFzb24gPSBpdC0+cmVhc29ufTsKLSAgICAgICAgICBidGlmX2FjbV9oYW5kbGVfZXZ0KEJUQV9BQ01fUkVDT05GSUdfRVZULCAoY2hhciopJmRhdGEpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgT25TdHJlYW1Db25maWcoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25maWdJbmZvPiBzdHJlYW1zX2NvbmZpZ19pbmZvKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGFkZHJlc3MpOwotICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyIGlzIE5VTEwiLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGl0ID0gc3RyZWFtc19jb25maWdfaW5mby5iZWdpbigpOyBpdCAhPSBzdHJlYW1zX2NvbmZpZ19pbmZvLmVuZCgpOyArK2l0KSB7Ci0gICAgICB0QlRBX0FDTV9DT05GSUdfSU5GTyBkYXRhID0gey5iZF9hZGRyID0gYWRkcmVzcywgLnN0cmVhbV90eXBlID0gaXQtPnN0cmVhbV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29kZWNfY29uZmlnID0gaXQtPmNvZGVjX2NvbmZpZywgLmF1ZGlvX2xvY2F0aW9uID0gaXQtPmF1ZGlvX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucW9zX2NvbmZpZyA9IGl0LT5xb3NfY29uZmlnLCAuY29kZWNzX3NlbGVjdGFibGUgPSBpdC0+Y29kZWNzX3NlbGVjdGFibGV9OwotICAgICAgYnRpZl9hY21faGFuZGxlX2V2dChCVEFfQUNNX0NPTkZJR19FVlQsIChjaGFyKikmZGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPblN0cmVhbUF2YWlsYWJsZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBzcmNfYXVkaW9fY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNpbmtfYXVkaW9fY29udGV4dHMpIG92ZXJyaWRlIHsKLSAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgICAvL05lZWQgdG8gdXNlIGR1cmluZyBTVEFSVCBvZiBzcmMgYW5kIHNpbmsgYXVkaW8gY29udGV4dAotICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcywgc3JjX2F1ZGlvX2NvbnRleHQ6IDB4JXgsIHNpbmtfYXVkaW9fY29udGV4dHM6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBzcmNfYXVkaW9fY29udGV4dHMsIHNpbmtfYXVkaW9fY29udGV4dHMpOwotICB9Ci0KLSAgY29uc3QgY2hhciogR2V0U3RyZWFtVHlwZSh1aW50MTZfdCBzdHJlYW1fdHlwZSkgewotICAgIHN3aXRjaCAoc3RyZWFtX3R5cGUpIHsKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDT05URU5UX1RZUEVfVU5TUEVDSUZJRUQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENPTlRFTlRfVFlQRV9NRURJQSkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDT05URU5UX1RZUEVfSU5TVFJVQ1RJT05BTCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDT05URU5UX1RZUEVfTk9USUZJQ0FUSU9OUykKLSAgICAgIENBU0VfUkVUVVJOX1NUUihDT05URU5UX1RZUEVfQUxFUlQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ09OVEVOVF9UWVBFX01BTl9NQUNISU5FKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENPTlRFTlRfVFlQRV9FTUVSR0VOQ1kpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoQ09OVEVOVF9UWVBFX1JJTkdUT05FKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENPTlRFTlRfVFlQRV9TT1VORF9FRkZFQ1RTKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENPTlRFTlRfVFlQRV9MSVZFKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKENPTlRFTlRfVFlQRV9HQU1FKQotICAgICAgZGVmYXVsdDoKLSAgICAgICByZXR1cm4gIlVua25vd24gU3RyZWFtVHlwZSI7Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgY2hhciogR2V0U3RyZWFtRGlyZWN0aW9uKHVpbnQ4X3QgZXZlbnQpIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBDQVNFX1JFVFVSTl9TVFIoQVNFX0RJUkVDVElPTl9TSU5LKQotICAgICAgQ0FTRV9SRVRVUk5fU1RSKEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgZGVmYXVsdDoKLSAgICAgICByZXR1cm4gIlVua25vd24gU3RyZWFtRGlyZWN0aW9uIjsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBjaGFyKiBHZXRTdHJlYW1TdGF0ZSh1aW50OF90IGV2ZW50KSB7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgQ0FTRV9SRVRVUk5fU1RSKFNUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoU1RSRUFNX1NUQVRFX0NPTk5FQ1RJTkcpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoU1RSRUFNX1NUQVRFX0NPTk5FQ1RFRCkKLSAgICAgIENBU0VfUkVUVVJOX1NUUihTVFJFQU1fU1RBVEVfU1RBUlRJTkcpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoU1RSRUFNX1NUQVRFX1NUUkVBTUlORykKLSAgICAgIENBU0VfUkVUVVJOX1NUUihTVFJFQU1fU1RBVEVfU1RPUFBJTkcpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RJTkcpCi0gICAgICBDQVNFX1JFVFVSTl9TVFIoU1RSRUFNX1NUQVRFX1JFQ09ORklHVVJJTkcpCi0gICAgICBkZWZhdWx0OgotICAgICAgIHJldHVybiAiVW5rbm93biBTdHJlYW1TdGF0ZSI7Ci0gICAgfQotICB9Ci19OwotCi1zdGF0aWMgVWNhc3RDbGllbnRDYWxsYmFja3NJbXBsIHNVY2FzdENsaWVudENhbGxiYWNrczsKLQotYnRfc3RhdHVzX3QgQnRpZkFjbUluaXRpYXRvcjo6SW5pdCgKLSAgICBidGFjbV9pbml0aWF0b3JfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywgaW50IG1heF9jb25uZWN0ZWRfYWNjZXB0b3JzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiYgY29kZWNfcHJpb3JpdGllcykgewotICBMT0dfSU5GTyhMT0dfVEFHLCAiJXM6IG1heF9jb25uZWN0ZWRfYWNjZXB0b3JzPSVkIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgbWF4X2Nvbm5lY3RlZF9hY2NlcHRvcnMpOwotICBpZiAoZW5hYmxlZF8pIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgQ2xlYW51cEFsbFBlZXJzKCk7Ci0gIG1heF9jb25uZWN0ZWRfcGVlcnNfID0gbWF4X2Nvbm5lY3RlZF9hY2NlcHRvcnM7Ci0gIGFsYXJtX2ZyZWUobXVzaWNfc2V0X2xvY2tfcmVsZWFzZV90aW1lcl8pOwotICBhbGFybV9mcmVlKHZvaWNlX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfKTsKLSAgYWxhcm1fZnJlZShhY21fZ3JvdXBfcHJvY2VkdXJlX3RpbWVyXyk7Ci0gIGFsYXJtX2ZyZWUoYWNtX2Nvbm5faW50ZXJ2YWxfdGltZXJfKTsKLSAgbXVzaWNfc2V0X2xvY2tfcmVsZWFzZV90aW1lcl8gPSBhbGFybV9uZXcoImJ0aWZfYWNtX2luaXRpYXRvci5tdXNpY19zZXRfbG9ja19yZWxlYXNlX3RpbWVyIik7Ci0gIHZvaWNlX3NldF9sb2NrX3JlbGVhc2VfdGltZXJfID0gYWxhcm1fbmV3KCJidGlmX2FjbV9pbml0aWF0b3Iudm9pY2Vfc2V0X2xvY2tfcmVsZWFzZV90aW1lciIpOwotICBhY21fZ3JvdXBfcHJvY2VkdXJlX3RpbWVyXyA9IGFsYXJtX25ldygiYnRpZl9hY21faW5pdGlhdG9yLmFjbV9ncm91cF9wcm9jZWR1cmVfdGltZXIiKTsKLSAgYWNtX2Nvbm5faW50ZXJ2YWxfdGltZXJfID0gYWxhcm1fbmV3KCJidGlmX2FjbV9pbml0aWF0b3IuYWNtX2Nvbm5faW50ZXJ2YWxfdGltZXIiKTsKLQotICBjYWxsYmFja3NfID0gY2FsbGJhY2tzOwotICAvL2luaXQgbG9jYWwgY2FwYWJpbHRpZXMKLSAgaW5pdF9sb2NhbF9jYXBhYmlsaXRpZXMoKTsKLQotICAvLyByZWdpc3RlciBBQ00gd2l0aCBBSElNCi0gIGJ0aWZfcmVnaXN0ZXJfY2IoKTsKLQotICBidGlmX3ZtY3BfaW5pdCgpOwotICBidF9zdGF0dXNfdCBzdGF0dXMxID0gYnRpZl9hY21faW5pdGlhdG9yX2V4ZWN1dGVfc2VydmljZSh0cnVlKTsKLSAgaWYgKHN0YXR1czEgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogc3RhdHVzIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7Ci0gIH0KLSAgaWYgKHNVY2FzdENsaWVudEludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgTE9HX0lORk8oTE9HX1RBRywgIiVzIENsZWFuaW5nIHVwIEJBUCBjbGllbnQgSW50ZXJmYWNlIGJlZm9yZSBpbml0aWFsaXppbmcuLi4iLAotICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q2xlYW51cCgpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci0gIH0KLSAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlID0gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpidGlmX2JhcF91Y2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLQotCi0gIGlmIChzVWNhc3RDbGllbnRJbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgIExPR19FUlJPUihMT0dfVEFHLCAiJXMgRmFpbGVkIHRvIGdldCBCQVAgSW50ZXJmYWNlIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgaWYocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnZlbmRvci5zZXJ2aWNlLmJ0LmJhcC5jb25uX3VwZGF0ZSIsIHZhbHVlLCAiZmFsc2UiKQotICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNtcCh2YWx1ZSwgInRydWUiKSkgewotICAgIGlzX2Nvbm5fdXBkYXRlX2VuYWJsZWRfID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBpc19jb25uX3VwZGF0ZV9lbmFibGVkXyA9IGZhbHNlOwotICB9Ci0gIHNVY2FzdENsaWVudEludGVyZmFjZS0+SW5pdCgmc1VjYXN0Q2xpZW50Q2FsbGJhY2tzKTsKLSAgZW5hYmxlZF8gPSB0cnVlOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVJZGxlOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBpZihidGlmX2FjbV9pbml0aWF0b3IuSXNDb25uVXBkYXRlRW5hYmxlZCgpKSB7Ci0gICAgaWYgKChwZWVyXy5TdGF0ZU1hY2hpbmUoKS5QcmV2aW91c1N0YXRlSWQoKSA9PSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpIHx8Ci0gICAgICAgKHBlZXJfLlN0YXRlTWFjaGluZSgpLlByZXZpb3VzU3RhdGVJZCgpID09IEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZVN0YXJ0ZWQpKQotICAgIHsKLSAgICAgIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUNvbm5JbnRlcnZhbFRpbWVyKCkpKSB7Ci0gICAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfY29ubl9JbnRlcnZhbF90aW1lcigpOwotICAgICAgICBwZWVyXy5TZXRDb25uVXBkYXRlTW9kZShCdGlmQWNtUGVlcjo6a0ZsYWdSZWxheGVkTW9kZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgIExPR19FUlJPUihMT0dfVEFHLCAiJXMgQWxyZWFkeSBpbiByZWxheGVkIGludGVydmFscyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocGVlcl8uU3RhdGVNYWNoaW5lKCkuUHJldmlvdXNTdGF0ZUlkKCkgIT0gQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSW52YWxpZCkgewotICAgICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChidGlmX2FjbV9pbml0aWF0b3IuQWNtQ29ubkludGVydmFsVGltZXIoKSkpIHsKLSAgICAgICAgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9jb25uX0ludGVydmFsX3RpbWVyKCk7Ci0gICAgICB9Ci0gICAgICBwZWVyXy5TZXRDb25uVXBkYXRlTW9kZShCdGlmQWNtUGVlcjo6a0ZsYWdSZWxheGVkTW9kZSk7Ci0gICAgfQotICB9Ci0gIHBlZXJfLkNsZWFyQ29ublVwZGF0ZU1vZGUoKTsKLSAgcGVlcl8uQ2xlYXJBbGxGbGFncygpOwotICBwZWVyXy5TZXRQcm9maWxlVHlwZSgwKTsKLSAgcGVlcl8uU2V0UmNmZ1Byb2ZpbGVUeXBlKDApOwotICBtZW1zZXQoJmN1cnJlbnRfbWVkaWFfY29uZmlnLCAwLCBzaXplb2YoY3VycmVudF9tZWRpYV9jb25maWcpKTsKLQotICAvLyBEZWxldGUgcGVlcnMgdGhhdCBhcmUgcmUtZW50ZXJpbmcgdGhlIElkbGUgc3RhdGUKLSAgaWYgKHBlZXJfLklzQWNjZXB0b3IoKSkgewotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZCdGlmQWNtSW5pdGlhdG9yOjpEZWxldGVJZGxlUGVlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmJ0aWZfYWNtX2luaXRpYXRvcikpKTsKLSAgfQotfQotCi12b2lkIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6T25FeGl0KCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotfQotCi1ib29sIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBtdXNpY19hY3RpdmVfcGVlcj0lcyB2b2ljZV9hY3RpdmVfcGVlcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgbG9nYm9vbChwZWVyXy5Jc1BlZXJBY3RpdmVGb3JNdXNpYygpKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxvZ2Jvb2wocGVlcl8uSXNQZWVyQWN0aXZlRm9yVm9pY2UoKSkuY19zdHIoKSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRJRl9BQ01fU1RPUF9TVFJFQU1fUkVRX0VWVDoKLSAgICBjYXNlIEJUSUZfQUNNX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgICBicmVhazsKLSNpZiAwCi0gICAgY2FzZSBCVElGX0FDTV9ESVNDT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIHRCVElGX0FDTV9DT05OX0RJU0MqIHBfYnRhX2RhdGEgPSAodEJUSUZfQUNNX0NPTk5fRElTQyopcF9kYXRhOwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZGlzY29ubmVjdF9zdHJlYW1zOwotICAgICAgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMTsKLSAgICAgICAgaWYgKHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiAoQkFQfEdDUCkpIHsKLSAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiBXTUNQKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UpIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzIgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMyA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMik7Ci0gICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8zKTsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgIGlmIChwZWVyXy5HZXRQcm9maWxlVHlwZSgpICYgKEJBUHxHQ1ApKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGVlcl8uR2V0UHJvZmlsZVR5cGUoKSAmIFdNQ1ApIHsKLSAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0xJVkUsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgc2l6ZSBvZiBkaXNjb25uZWN0X3N0cmVhbXMgIiA8PCBkaXNjb25uZWN0X3N0cmVhbXMuc2l6ZSgpOwotICAgICAgaWYgKCFzVWNhc3RDbGllbnRJbnRlcmZhY2UpIGJyZWFrOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KHBlZXJfLlBlZXJBZGRyZXNzKCksIGRpc2Nvbm5lY3Rfc3RyZWFtcyk7Ci0KLSAgICAgIC8vIFJlLWVudGVyIElkbGUgc28gdGhlIHBlZXIgY2FuIGJlIGRlbGV0ZWQKLSAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgQlRJRl9BQ01fQ09OTkVDVF9SRVFfRVZUOiB7Ci0gICAgICB0QlRJRl9BQ01fQ09OTl9ESVNDKiBwX2J0YV9kYXRhID0gKHRCVElGX0FDTV9DT05OX0RJU0MqKXBfZGF0YTsKLSAgICAgIGJvb2wgY2FuX2Nvbm5lY3QgPSB0cnVlOwotICAgICAgLy8gQ2hlY2sgd2hldGhlciBjb25uZWN0aW9uIGlzIGFsbG93ZWQKLSAgICAgIGlmIChwZWVyXy5Jc0FjY2VwdG9yKCkpIHsKLSAgICAgICAgLy9UaGVyZSBpcyBubyBjaGFyIGluIGN1cnJlbnQgc3BlYy4gU2hvdWxkIHdlIGNoZWNrIFZNQ1Agcm9sZSBoZXJlPwotICAgICAgICAvLyBzaGFsbCB3ZSBhc3N1bWUgVk1DUCByb2xlIHdvdWxkIGhhdmUgYmVlbiBjaGVja2VkIGluIGFwcHMgYW5kIG5vIG5lZWQgdG8gY2hlY2sgaGVyZT8KLSAgICAgICAgY2FuX2Nvbm5lY3QgPSBidGlmX2FjbV9pbml0aWF0b3IuQWxsb3dlZFRvQ29ubmVjdChwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgICAgaWYgKCFjYW5fY29ubmVjdCkgZGlzY29ubmVjdF9hY21faW5pdGlhdG9yKHBlZXJfLlBlZXJBZGRyZXNzKCksIHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlKTsKLSAgICAgIH0KLSAgICAgIGlmICghY2FuX2Nvbm5lY3QpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICIlczogQ2Fubm90IGNvbm5lY3QgdG8gcGVlciAlczogdG9vIG1hbnkgY29ubmVjdGVkICIKLSAgICAgICAgICAgICJwZWVycyIsCi0gICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gc3RyZWFtczsKLSAgICAgIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgU3RyZWFtQ29ubmVjdCBjb25uX21lZGlhOwotICAgICAgICBpZiAocGVlcl8uR2V0UHJvZmlsZVR5cGUoKSAmIChCQVB8R0NQKSkgewotICAgICAgICAgIC8va2VlcGluZyBtZWRpYSB0eCBhcyBCQVAvR0NQIGNvbmZpZwotICAgICAgICAgIG1lbXNldCgmY29ubl9tZWRpYSwgMCwgc2l6ZW9mKGNvbm5fbWVkaWEpKTsKLSAgICAgICAgICBmZXRjaF9tZWRpYV90eF9jb2RlY19xb3NfY29uZmlnKHBlZXJfLlBlZXJBZGRyZXNzKCksIHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiAoQkFQfEdDUCksICZjb25uX21lZGlhKTsKLSAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhjb25uX21lZGlhKTsKLSNpZiAwCi0gICAgICAgICAgaWYgKGZhbHNlKSB7Ly9lbmFibGUgd2hlbiBHQ1Agc3VwcG9ydCBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXJfLlBlZXJBZGRyZXNzKCksIChwZWVyXy5HZXRQcm9maWxlVHlwZSgpICYgfldNQ1ApLCBWT0lDRV9DT05URVhULCBTUkMsIEVCX0NPTkZJRyk7Ci0gICAgICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fdm9pY2U7Ci0gICAgICAgICAgICBDb2RlY1Fvc0NvbmZpZyBjb25maWc7Ci0gICAgICAgICAgICBjb25uX3ZvaWNlLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgICAgICAgICBjb25uX3ZvaWNlLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgICAgICAgICBjb25maWcgPSBwZWVyXy5nZXRfcGVlcl92b2ljZV9yeF9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgICAgICAgICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNvbmZpZy5jb2RlY19jb25maWcpOwotICAgICAgICAgICAgcHJpbnRfcW9zX3BhcmFtZXRlcnMoY29uZmlnLnFvc19jb25maWcpOwotICAgICAgICAgICAgY29ubl92b2ljZS5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQzsKLSAgICAgICAgICAgIGNvbm5fdm9pY2UuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb25maWcpOwotICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl92b2ljZSk7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiBXTUNQKSB7Ci0gICAgICAgICAgLy9rZWVwaW5nIG1lZGlhIHJ4IGFzIFdNQ1AgY29uZmlnCi0gICAgICAgICAgbWVtc2V0KCZjb25uX21lZGlhLCAwLCBzaXplb2YoY29ubl9tZWRpYSkpOwotICAgICAgICAgIGZldGNoX21lZGlhX3J4X2NvZGVjX3Fvc19jb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgV01DUCwgJmNvbm5fbWVkaWEpOwotICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGNvbm5fbWVkaWEpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fbWVkaWEsIGNvbm5fdm9pY2U7Ci0gICAgICAgIC8va2VlcGluZyB2b2ljZSB0eCBhcyBCQVAgY29uZmlnCi0gICAgICAgIG1lbXNldCgmY29ubl92b2ljZSwgMCwgc2l6ZW9mKGNvbm5fdm9pY2UpKTsKLSAgICAgICAgZmV0Y2hfdm9pY2VfdHhfY29kZWNfcW9zX2NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBCQVAsICZjb25uX3ZvaWNlKTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl92b2ljZSk7Ci0gICAgICAgIC8va2VlcGluZyB2b2ljZSByeCBhcyBCQVAgY29uZmlnCi0gICAgICAgIG1lbXNldCgmY29ubl92b2ljZSwgMCwgc2l6ZW9mKGNvbm5fdm9pY2UpKTsKLSAgICAgICAgZmV0Y2hfdm9pY2VfcnhfY29kZWNfcW9zX2NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBCQVAsICZjb25uX3ZvaWNlKTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl92b2ljZSk7Ci0gICAgICAgIGlmIChwZWVyXy5HZXRQcm9maWxlVHlwZSgpICYgKEJBUHxHQ1ApKSB7Ci0gICAgICAgICAgLy9rZWVwaW5nIG1lZGlhIHR4IGFzIEJBUC9HQ1AgY29uZmlnCi0gICAgICAgICAgbWVtc2V0KCZjb25uX21lZGlhLCAwLCBzaXplb2YoY29ubl9tZWRpYSkpOwotICAgICAgICAgIGZldGNoX21lZGlhX3R4X2NvZGVjX3Fvc19jb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgcGVlcl8uR2V0UHJvZmlsZVR5cGUoKSAmIChCQVB8R0NQKSwgJmNvbm5fbWVkaWEpOwotICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGNvbm5fbWVkaWEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwZWVyXy5HZXRQcm9maWxlVHlwZSgpICYgV01DUCkgewotICAgICAgICAgIC8va2VlcGluZyBtZWRpYSByeCBhcyBXTUNQIGNvbmZpZwotICAgICAgICAgIG1lbXNldCgmY29ubl9tZWRpYSwgMCwgc2l6ZW9mKGNvbm5fbWVkaWEpKTsKLSAgICAgICAgICBmZXRjaF9tZWRpYV9yeF9jb2RlY19xb3NfY29uZmlnKHBlZXJfLlBlZXJBZGRyZXNzKCksIFdNQ1AsICZjb25uX21lZGlhKTsKLSAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhjb25uX21lZGlhKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgU3RyZWFtQ29ubmVjdCBjb25uX3ZvaWNlOwotICAgICAgICAvL2tlZXBpbmcgdm9pY2UgdHggYXMgQkFQIGNvbmZpZwotICAgICAgICBtZW1zZXQoJmNvbm5fdm9pY2UsIDAsIHNpemVvZihjb25uX3ZvaWNlKSk7Ci0gICAgICAgIGZldGNoX3ZvaWNlX3R4X2NvZGVjX3Fvc19jb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgQkFQLCAmY29ubl92b2ljZSk7Ci0gICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGNvbm5fdm9pY2UpOwotICAgICAgICAvL2tlZXBpbmcgdm9pY2UgcnggYXMgQkFQIGNvbmZpZwotICAgICAgICBtZW1zZXQoJmNvbm5fdm9pY2UsIDAsIHNpemVvZihjb25uX3ZvaWNlKSk7Ci0gICAgICAgIGZldGNoX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgQkFQLCAmY29ubl92b2ljZSk7Ci0gICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGNvbm5fdm9pY2UpOwotICAgICAgfQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgc2l6ZSBvZiBzdHJlYW1zICIgPDwgc3RyZWFtcy5zaXplKCk7Ci0gICAgICBpZiAoIXNVY2FzdENsaWVudEludGVyZmFjZSkgYnJlYWs7Ci0gICAgICAvLyBpbnRpYXRlIGJhY2tncm91bmQgY29ubmVjdGlvbgotICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4gYWRkcmVzczsKLSAgICAgIGFkZHJlc3MucHVzaF9iYWNrKHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KGFkZHJlc3MsIGZhbHNlLCBzdHJlYW1zKTsKLSAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuaW5nKTsKLSAgICB9IGJyZWFrOwotI2lmIDAKLSAgICBjYXNlIEJUQV9BQ01fRElTQ09OTkVDVF9FVlQ6IHsKLSAgICAgIHRCVElGX0FDTSogcF9hY20gPSAodEJUSUZfQUNNKilwX2RhdGE7Ci0gICAgICBpbnQgY29udGV4dF90eXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICBpZiAoY29udGV4dF90eXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNZWRpYSBSeCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAsIHNldCBzdGF0ZSAmIGlnbm9yZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1J4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIGRpc2Nvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAsIGlnbm9yZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCVEFfQUNNX0NPTk5fVVBEQVRFX1RJTUVPVVRfRVZUOgotICAgICAgcGVlcl8uU2V0Q29ublVwZGF0ZU1vZGUoQnRpZkFjbVBlZXI6OmtGbGFnUmVsYXhlZE1vZGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyA6IFVuaGFuZGxlZCBldmVudD0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQWNtRXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBCdGlmQWNtU3RhdGVNYWNoaW5lOjpTdGF0ZU9wZW5pbmc6Ok9uRW50ZXIoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYoYnRpZl9hY21faW5pdGlhdG9yLklzQ29ublVwZGF0ZUVuYWJsZWQoKSkgewotICAgIC8vQ2FuY2VsIHRoZSB0aW1lciBpZiBzdGFydCBzdHJlYW1uZyBjb21lcyBiZWZvcmUKLSAgICAvLyA1IHNlY29uZHMgd2hpbGUgbW92aW5nIHRoZSBpbnRlcnZhbCB0byByZWxheGVkIG1vZGUuCi0gICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChidGlmX2FjbV9pbml0aWF0b3IuQWNtQ29ubkludGVydmFsVGltZXIoKSkpIHsKLSAgICAgICBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2Nvbm5fSW50ZXJ2YWxfdGltZXIoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgcGVlcl8uU2V0Q29ublVwZGF0ZU1vZGUoQnRpZkFjbVBlZXI6OmtGbGFnQWdncmVzaXZlTW9kZSk7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBCdGlmQWNtU3RhdGVNYWNoaW5lOjpTdGF0ZU9wZW5pbmc6Ok9uRXhpdCgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotYm9vbCBCdGlmQWNtU3RhdGVNYWNoaW5lOjpTdGF0ZU9wZW5pbmc6OlByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMgbXVzaWNfYWN0aXZlX3BlZXI9JXMgdm9pY2VfYWN0aXZlX3BlZXI9JXMiLAotICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxvZ2Jvb2wocGVlcl8uSXNQZWVyQWN0aXZlRm9yTXVzaWMoKSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHBlZXJfLklzUGVlckFjdGl2ZUZvclZvaWNlKCkpLmNfc3RyKCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FDTV9TVVNQRU5EX1NUUkVBTV9SRVFfRVZUOgotICAgICAgYnJlYWs7ICAvLyBJZ25vcmUKLQotICAgIGNhc2UgQlRBX0FDTV9DT05ORUNUX0VWVDogewotICAgICAgdEJUSUZfQUNNKiBwX2J0YV9kYXRhID0gKHRCVElGX0FDTSopcF9kYXRhOwotICAgICAgYnRhY21fY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlOwotICAgICAgdWludDhfdCBzdGF0dXMgPSAodWludDhfdClwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZTsKLSAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlID0gcF9idGFfZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS50eXBlOwotCi0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICBMT0dfVEFHLCAiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBzdGF0dXM9JWQgY29udGV4dFR5cGU9JWQiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLCBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICBzdGF0dXMsIGNvbnRleHRUeXBlKTsKLSAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgICAgICBzdGF0ZSA9IEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgIC8vIFJlcG9ydCB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byB0aGUgYXBwbGljYXRpb24KLSAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHN0YXRlLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgIGlmIChwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1R4U3RhdGUocF9idGFfZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGNvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3IgbWVkaWFUeCwgbW92ZSBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciBtZWRpYVJ4LCBtb3ZlIGluIG9wZW5lZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gQ2hhbmdlIHN0YXRlIHRvIE9QRU5FRAotICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpDT05ORUNUSU5HKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGNvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAgZm9yIE1FRElBIFR4IG9yIFJ4LCBpZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1R4U3RhdGUocF9idGFfZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIGVsc2UgaWYgKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgIGlmIChwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgc3RhdGUgPSBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgICBpZiAocF9idGFfZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VUeFN0YXRlKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHN0YXRlLCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwgbW92ZSBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAocF9idGFfZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9idGFfZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgc3RhdGUsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCBtb3ZlIGluIG9wZW5lZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpDT05ORUNUSU5HKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGNvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAgZm9yIENPTlZFUlNBVElPTkFMIFR4IG9yIFJ4LCBpZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2J0YV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9ESVNDT05ORUNUX0VWVDogewotICAgICAgdEJUSUZfQUNNKiBwX2FjbSA9ICh0QlRJRl9BQ00qKXBfZGF0YTsKLSAgICAgIGludCBjb250ZXh0X3R5cGUgPSBwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS50eXBlOwotICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1R4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX01VU0lDKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgTWVkaWEgVHgvUnggZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIgotICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiBWb2ljZSBUeCtSeCAmIE1lZGlhIFJ4L1R4IHdhcyBkaXNjb25uZWN0ZWQsIG1vdmUgaW4gaWRsZSBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIFR4L1J4IGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gZWl0aGVyIFZvaWNlIFR4IG9yIFJ4IG9yIE1lZGlhIFJ4L1R4IGlzIGNvbm5lY3RpbmcsIHJlbWFpbiBpbiBvcGVuaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVR4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHgsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBSeCwgbXVzaWMgVHgrUnggYXJlIGRpc2Nvbm5lY3RlZCBtb3ZlIGluIGlkbGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORykgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFR4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgUnggaXMgZGlzY29ubmVjdGVkIGJ1dCBlaXRoZXIgbXVzaWMgVHggb3IgUnggc3RpbGwgY29ubmVjdGluZywiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbWFpbiBpbiBvcGVuaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgUngsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBUeCwgbXVzaWMgVHgrUnggYXJlIGRpc2Nvbm5lY3RlZCBtb3ZlIGluIGlkbGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORykgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgVHggaXMgZGlzY29ubmVjdGVkIGJ1dCBtdXNpYyBUeCBvciBSeCBzdGlsbCBjb25uZWN0aW5nLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVtYWluIGluIG9wZW5pbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgICAgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciBNRURJQSBUeCBvciBSeCwgaWdub3JlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCBmb3IgQ09OVkVSU0FUSU9OQUwgVHggb3IgUngsIGlnbm9yZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVR4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HLCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUSUZfQUNNX0RJU0NPTk5FQ1RfUkVRX0VWVDp7Ci0gICAgICB0QlRJRl9BQ01fQ09OTl9ESVNDKiBwX2J0YV9kYXRhID0gKHRCVElGX0FDTV9DT05OX0RJU0MqKXBfZGF0YTsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IGRpc2Nvbm5lY3Rfc3RyZWFtczsKLSAgICAgIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgIGlmIChwX2J0YV9kYXRhLT5wcm9maWxlVHlwZSAmIChCQVB8R0NQKSkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocF9idGFfZGF0YS0+cHJvZmlsZVR5cGUgJiBXTUNQKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UpIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzIgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMyA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMyk7Ci0gICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8yKTsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgIGlmIChwX2J0YV9kYXRhLT5wcm9maWxlVHlwZSAmIChCQVB8R0NQKSkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnByb2ZpbGVUeXBlICYgV01DUCkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRSwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMiA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZV8zID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8zKTsKLSAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzIpOwotICAgICAgfQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgc2l6ZSBvZiBkaXNjb25uZWN0X3N0cmVhbXMgIiA8PCBkaXNjb25uZWN0X3N0cmVhbXMuc2l6ZSgpOwotICAgICAgaWYgKCFzVWNhc3RDbGllbnRJbnRlcmZhY2UpIGJyZWFrOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KHBlZXJfLlBlZXJBZGRyZXNzKCksIGRpc2Nvbm5lY3Rfc3RyZWFtcyk7Ci0KLSAgICAgIGlmICgocF9idGFfZGF0YS0+Y29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSAmJiAoKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORykgfHwKLSAgICAgICAgICAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNUSU5HKSkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgdm9pY2UgY29ubmVjdGluZyByZW1haW4gaW4gb3BlbmluZyAiOwotICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgfSBlbHNlIGlmICgocF9idGFfZGF0YS0+Y29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSAmJiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNUSU5HIHx8Ci0gICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORykpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIE11c2ljIGNvbm5lY3RpbmcgcmVtYWluIGluIG9wZW5pbmcgIjsKLSAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIE1vdmUgaW4gaWRsZSBzdGF0ZSAiOwotICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UpOwotICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FDTV9DT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiJXM6IFBlZXIgJXMgOiBldmVudD0lcyA6IGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RpbmcsICIKLSAgICAgICAgICAiaWdub3JlIENvbm5lY3QgcmVxdWVzdCIsCi0gICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fQ09ORklHX0VWVDogewotICAgICAgIHRCVElGX0FDTSogcF9hY21fZGF0YSA9ICh0QlRJRl9BQ00qKXBfZGF0YTsKLSAgICAgICB1aW50MTZfdCBjb250ZXh0VHlwZSA9IHBfYWNtX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgICB1aW50MTZfdCBwZWVyX2xhdGVuY3lfbXMgPSAwOwotICAgICAgIHVpbnQzMl90IHByZXNlbl9kZWxheSA9IDA7Ci0gICAgICAgYm9vbCBpc191cGRhdGVfcmVxdWlyZSA9IGZhbHNlOwotICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgIGlmIChwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjb21wYXJlIHdpdGggY3VycmVudCBtZWRpYSBjb25maWciLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgICAgaXNfdXBkYXRlX3JlcXVpcmUgPSBjb21wYXJlX2NvZGVjX2NvbmZpZ18oY3VycmVudF9tZWRpYV9jb25maWcsIHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZyk7Ci0gICAgICAgICB9IGVsc2UgaWYgKHBfYWNtX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfTElWRSkgewotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY2FjaGUgY3VycmVudF9yZWNvcmRpbmdfY29uZmlnIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgIGN1cnJlbnRfcmVjb3JkaW5nX2NvbmZpZyA9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChtYW5kYXRvcnlfY29kZWNfc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IE1hbmRhdG9yeSBjb2RlYyBzZWxlY3RlZCwgZG8gbm90IHN0b3JlIGNvbmZpZyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHN0b3JlIGNvbmZpZ3VyYXRpb24iLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC8vQ2FjaGUgdGhlIHBlZXIgbGF0ZW5jeSBpbiBXTUNQIGNhc2UKLSAgICAgICAgIGlmIChwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX0xJVkUpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVswXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzBdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsxXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzFdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsyXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzJdKTsKLSAgICAgICAgICAgcHJlc2VuX2RlbGF5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVswXSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzFdIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsyXSA8PCAxNik7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwcmVzZW5fZGVsYXkgPSAlZHVzIiwgX19mdW5jX18sIHByZXNlbl9kZWxheSk7Ci0gICAgICAgICAgIHBlZXJfbGF0ZW5jeV9tcyA9IHByZXNlbl9kZWxheS8xMDAwOwotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc190b19tIGxhdGVuY3kgPSAlZG1zIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbV9kYXRhLT5jb25maWdfaW5mby5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tKTsKLSAgICAgICAgICAgcGVlcl9sYXRlbmN5X21zICs9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuY2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX207Ci0gICAgICAgICAgIHBlZXJfLlNldFBlZXJMYXRlbmN5KHBlZXJfbGF0ZW5jeV9tcyk7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYWNoZWQgcGVlciBMYXRlbmN5ID0gJWRtcyIsIF9fZnVuY19fLCBwZWVyXy5HZXRQZWVyTGF0ZW5jeSgpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChpc191cGRhdGVfcmVxdWlyZSkgewotICAgICAgICAgICBjdXJyZW50X21lZGlhX2NvbmZpZyA9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGN1cnJlbnRfbWVkaWFfY29uZmlnLmNvZGVjX3NwZWNpZmljXzM6ICUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQsIF9fZnVuY19fLCBjdXJyZW50X21lZGlhX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zKTsKLSAgICAgICAgICAgYnRpZl9hY21fdXBkYXRlX2xjM3FfcGFyYW1zKCZjdXJyZW50X21lZGlhX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zLCBwX2FjbV9kYXRhKTsKLSAgICAgICAgICAgYnRpZl9hY21fcmVwb3J0X3NvdXJjZV9jb2RlY19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBjdXJyZW50X21lZGlhX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY2FzdF9jb2RlY3NfY2FwYWJpbGl0aWVzLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgfQotICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMICYmCi0gICAgICAgICAgICAgICAgICBwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYWNoZSBjdXJyZW50X3ZvaWNlX2NvbmZpZyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICAgY3VycmVudF92b2ljZV9jb25maWcgPSBwX2FjbV9kYXRhLT5jb25maWdfaW5mby5jb2RlY19jb25maWc7Ci0gICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3VycmVudF92b2ljZV9jb25maWcuY29kZWNfc3BlY2lmaWNfMzogJSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQsIF9fZnVuY19fLCBjdXJyZW50X3ZvaWNlX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zKTsKLSAgICAgICAgIGJ0aWZfYWNtX3VwZGF0ZV9sYzNxX3BhcmFtcygmY3VycmVudF92b2ljZV9jb25maWcuY29kZWNfc3BlY2lmaWNfMywgcF9hY21fZGF0YSk7Ci0gICAgICAgICBidGlmX2FjbV9yZXBvcnRfc291cmNlX2NvZGVjX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIGN1cnJlbnRfdm9pY2VfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNhc3RfY29kZWNzX2NhcGFiaWxpdGllcywgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICB9Ci0gICAgICAvL0hhbmRsZSBCQVAgU1RBUlQgaWYgcmVjb25maWcgY29tZXMgaW4gbWlkIG9mIHN0cmVhbWluZwotICAgICAgLy9wZWVyXy5TZXRTdHJlYW1SZWNvbmZpZ0luZm8ocF9hY20tPmFjbV9yZWNvbmZpZyk7Ci0gICAgICAvL1RPRE86IGxvY2FsIGNhcGFiaWxpdGllcwotICAgICAgLy9Db2RlY0NvbmZpZyByZWNvcmQgPSBwX2J0YV9kYXRhLT5hY21fcmVjb25maWcuY29kZWNfY29uZmlnOwotICAgICAgLy9zYXZpbmcgY29kZWMgY29uZmlnIGFzIG5lZ290aWF0ZWQgcGFyYW1ldGVyIGFzIHRydWUKLSAgICAgIC8vYnRpZl9wYWNzX2FkZF9yZWNvcmQocGVlcl8uUGVlckFkZHJlc3MoKSwgdHJ1ZSwgQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TUkMsICZyZWNvcmQpOwotCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9DT05OX1VQREFURV9USU1FT1VUX0VWVDoKLSAgICAgIHBlZXJfLlNldENvbm5VcGRhdGVNb2RlKEJ0aWZBY21QZWVyOjprRmxhZ1JlbGF4ZWRNb2RlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IFBlZXIgJXMgOiBVbmhhbmRsZWQgZXZlbnQ9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfcGVlcl9kZXZpY2VfaXNfc3RyZWFtaW5nKHVpbnQ4X3QgSWQpIHsKLSAgICBib29sIGlzX3N0cmVhbWluZyA9IGZhbHNlOwotICAgIHRCVEFfQ1NJUF9DU0VUIGNzZXRfaW5mbzsKLSAgICBtZW1zZXQoJmNzZXRfaW5mbywgMCwgc2l6ZW9mKHRCVEFfQ1NJUF9DU0VUKSk7Ci0gICAgY3NldF9pbmZvID0gQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldChJZCk7Ci0gICAgaWYgKGNzZXRfaW5mby5zaXplID09IDApIHsKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBDU0VUIGluZm8gc2l6ZSBpcyB6ZXJvLCByZXR1cm4iLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+OjppdGVyYXRvciBpdHI7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNpemUgb2Ygc2V0IG1lbWJlcnMgJWQiLCBfX2Z1bmNfXywgKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpKTsKLSAgICBpZiAoKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpID4gMCkgewotICAgICAgZm9yIChpdHIgPShjc2V0X2luZm8uc2V0X21lbWJlcnMpLmJlZ2luKCk7IGl0ciAhPSAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5lbmQoKTsgaXRyKyspIHsKLSAgICAgICAgQnRpZkFjbVBlZXIqIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIoKml0cik7Ci0gICAgICAgIGlmIChwZWVyICE9IG51bGxwdHIgJiYgKHBlZXItPklzU3RyZWFtaW5nKCkgfHwgcGVlci0+Q2hlY2tGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpKSAmJgotICAgICAgICAgICAgIXBlZXItPkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCkpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogZmVsbG93IGRldmljZSBpcyBzdHJlYW1pbmcgJXMgIiwgX19mdW5jX18sIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICBpc19zdHJlYW1pbmcgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc19zdHJlYW1pbmc7Ci19Ci0KLWJvb2wgYnRpZl9wZWVyX2RldmljZV9pc19yZWNvbmZpZ3VyaW5nKHVpbnQ4X3QgSWQpIHsKLSAgICBib29sIGlzX3JlY29uZmlndXJlZCA9IGZhbHNlOwotICAgIGlmIChJZCA8IElOVkFMSURfU0VUX0lEKSB7Ci0gICAgICB0QlRBX0NTSVBfQ1NFVCBjc2V0X2luZm87Ci0gICAgICBtZW1zZXQoJmNzZXRfaW5mbywgMCwgc2l6ZW9mKHRCVEFfQ1NJUF9DU0VUKSk7Ci0gICAgICBjc2V0X2luZm8gPSBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0KElkKTsKLSAgICAgIGlmIChjc2V0X2luZm8uc2l6ZSA9PSAwKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBDU0VUIGluZm8gc2l6ZSBpcyB6ZXJvLCByZXR1cm4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+OjppdGVyYXRvciBpdHI7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2l6ZSBvZiBzZXQgbWVtYmVycyAlZCIsIF9fZnVuY19fLCAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5zaXplKCkpOwotICAgICAgaWYgKChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSA+IDApIHsKLSAgICAgICAgZm9yIChpdHIgPShjc2V0X2luZm8uc2V0X21lbWJlcnMpLmJlZ2luKCk7IGl0ciAhPSAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5lbmQoKTsgaXRyKyspIHsKLSAgICAgICAgICBCdGlmQWNtUGVlciogcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcigqaXRyKTsKLSAgICAgICAgICBpZiAocGVlciAhPSBudWxscHRyICYmIHBlZXItPkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1JlY29uZmlndXJlKSkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHBlZXIgaXMgcmVjb25maWd1cmluZyAlcyAiLCBfX2Z1bmNfXywgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgaXNfcmVjb25maWd1cmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpc19yZWNvbmZpZ3VyZWQgPSB0cnVlOwotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IHBlZXIgaXMgVFdNIGRldmljZSwgcmV0dXJuIGlzX3JlY29uZmlndXJlZCAlZCIsIF9fZnVuY19fLCBpc19yZWNvbmZpZ3VyZWQpOwotICAgIH0KLSAgICByZXR1cm4gaXNfcmVjb25maWd1cmVkOwotfQotCi12b2lkIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlT3BlbmVkOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcywgUGVlciBTZXRJZCA9ICVkLCBNdXNpY0FjdGl2ZVNldElkID0gJWQsIENvbnRleHRUeXBlID0gJWQiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLCBwZWVyXy5TZXRJZCgpLAotICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpLCBwZWVyXy5HZXRDb250ZXh0VHlwZSgpKTsKLQotICAvL1N0YXJ0aW5nIHRoZSB0aW1lciBmb3IgNSBzZWNvbmRzIGJlZm9yZSBtb3ZpbmcgdG8gcmVsYXhlZCBzdGF0ZSBhcwotICAvL3N0b3AgZXZlbnQgb3Igc3RhcnQgc3RyZWFtaW5nIGV2ZW50IG1vZ2h0IGltbWVkaWF0ZWx5IGNvbWUKLSAgLy93aGljaCByZXF1aXJlcyBhZ2dyZXNpdmUgaW50ZXJ2YWwKLSAgaWYoYnRpZl9hY21faW5pdGlhdG9yLklzQ29ublVwZGF0ZUVuYWJsZWQoKSkgewotICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9jb25uX0ludGVydmFsX3RpbWVyKCZwZWVyXyk7Ci0gIH0KLSAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nTG9jYWxTdXNwZW5kIHwKLSAgICAgICAgICAgICAgICAgICBCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQgfAotICAgICAgICAgICAgICAgICAgIEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdTdG9wKTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczoga0ZsYWdQZW5kaW5nUmVjb25maWd1cmUgJWQgYW5kIGtGTGFnUGVuZGluZ1N0YXJ0QWZ0ZXJSZWNvbmZpZyAlZCIsICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgIHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1JlY29uZmlndXJlKSwKLSAgICAgICAgICBwZWVyXy5DaGVja0ZsYWdzKEJ0aWZBY21QZWVyOjprRkxhZ1BlbmRpbmdTdGFydEFmdGVyUmVjb25maWcpKTsKLQotICBpZiAocGVlcl8uQ2hlY2tGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nUmVjb25maWd1cmUpKSB7Ci0gICAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nUmVjb25maWd1cmUpOwotICAgIGlmICgocGVlcl8uR2V0UmNmZ1Byb2ZpbGVUeXBlKCkgIT0gQkFQX0NBTEwpICYmCi0gICAgICAgICAgICAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IHBlZXJfLkdldFJjZmdQcm9maWxlVHlwZSgpKSkgewotICAgICAgY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlID0gcGVlcl8uR2V0UmNmZ1Byb2ZpbGVUeXBlKCk7Ci0gICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IFdNQ1ApCi0gICAgICAgIGN1cnJlbnRfYWN0aXZlX2NvbmZpZyA9IGN1cnJlbnRfbWVkaWFfY29uZmlnOwotICAgICAgZWxzZQotICAgICAgICBjdXJyZW50X2FjdGl2ZV9jb25maWcgPSBjdXJyZW50X3JlY29yZGluZ19jb25maWc7Ci0KLSAgICAgIGlmIChidGlmX3BlZXJfZGV2aWNlX2lzX3JlY29uZmlndXJpbmcocGVlcl8uU2V0SWQoKSkpCi0gICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9yZXN0YXJ0X3Nlc3Npb24oYWN0aXZlX2JkYSwgYWN0aXZlX2JkYSk7Ci0KLSAgICAgIGlmIChjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgPT0gV01DUCkgewotICAgICAgICB1aW50MTZfdCBzaW5rX2xhdGVuY3kgPSBidGlmX2FjbV9nZXRfYWN0aXZlX2RldmljZV9sYXRlbmN5KCk7Ci0gICAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBzaW5rX2xhdGVuY3kgPSAlZG1zIiwgX19mdW5jX18sIHNpbmtfbGF0ZW5jeSk7Ci0gICAgICAgIGlmICgoc2lua19sYXRlbmN5ID4gMCkgJiYgIWJ0aWZfYWNtX3VwZGF0ZV9zaW5rX2xhdGVuY3lfY2hhbmdlKHNpbmtfbGF0ZW5jeSAqIDEwKSkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogdW5hYmxlIHRvIHVwZGF0ZSBsYXRlbmN5IiwgX19mdW5jX18pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlID09IEJBUCkgewotICAgICAgICBwZWVyXy5SZXNldFByb2ZpbGVUeXBlKEdDUCk7Ci0gICAgICAgIHBlZXJfLlNldFByb2ZpbGVUeXBlKEJBUCk7Ci0gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfYWN0aXZlX3Byb2ZpbGVfdHlwZSA9PSBHQ1ApIHsKLSAgICAgICAgcGVlcl8uUmVzZXRQcm9maWxlVHlwZShCQVApOwotICAgICAgICBwZWVyXy5TZXRQcm9maWxlVHlwZShHQ1ApOwotICAgICAgfQotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGN1bW11bGF0aXZlX3Byb2ZpbGVfdHlwZSAlZCIsIF9fZnVuY19fLCBwZWVyXy5HZXRQcm9maWxlVHlwZSgpKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBSZWNvbmZpZyArIHJlc3RhcnQgc2Vzc2lvbiBjb21wbGV0ZWQgZm9yIG1lZGlhLCBzaWduYWwgc2Vzc2lvbiByZWFkeSIsIF9fZnVuY19fKTsKLSAgICAgIGJ0aWZfYWNtX3NpZ25hbF9zZXNzaW9uX3JlYWR5KCk7Ci0gICAgfSBlbHNlIGlmIChjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgPT0gcGVlcl8uR2V0UmNmZ1Byb2ZpbGVUeXBlKCkpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBSZWNvbmZpZyB0byByZW1vdGUgaXMgY29tcGxldGVkIGZvciBtZWRpYSwgcmVzdGFydCBzZXNzaW9uIHdhc24ndCBuZWVkZWQiLCBfX2Z1bmNfXyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBSZWNvbmZpZyBjb21wbGV0ZWQgZm9yIEJBUF9DQUxMIiwgX19mdW5jX18pOwotICAgIH0KLSAgfQotICAvL1N0YXJ0IHRoZSBsb2NrIHJlbGVhc2UgdGltZXIgaGVyZS4KLSAgLy9jaGVjayBpZiBwZWVyIGRldmljZSBpcyBpbiBzdGFydGVkIHN0YXRlCi0gIGlmIChidGlmX3BlZXJfZGV2aWNlX2lzX3N0cmVhbWluZyhwZWVyXy5TZXRJZCgpKSB8fAotICAgICAgcGVlcl8uQ2hlY2tGbGFncyhCdGlmQWNtUGVlcjo6a0ZMYWdQZW5kaW5nU3RhcnRBZnRlclJlY29uZmlnKSkgewotICAgIFN0cmVhbVR5cGUgdHlwZV8xLCB0eXBlXzI7Ci0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RhcnRfc3RyZWFtczsKLSAgICBpZiAocGVlcl8uR2V0UmNmZ1Byb2ZpbGVUeXBlKCkgIT0gQkFQX0NBTEwpIHsKLSAgICAgIGlmICgoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlID09IEJBUCB8fCBjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgPT0gR0NQKSAmJgotICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpKSB7Ci0gICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICB9OwotICAgICAgICBzdGFydF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgfSBlbHNlIGlmICgoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlID09IFdNQ1ApICYmCi0gICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkpIHsKLSAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRSwKLSAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICB9OwotICAgICAgICBzdGFydF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSAmJgotICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpKSB7Ci0gICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICB9OwotICAgICAgICB0eXBlXzIgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICB9OwotICAgICAgICBzdGFydF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICBzdGFydF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzIpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmKGJ0aWZfYWNtX2luaXRpYXRvci5Jc0Nvbm5VcGRhdGVFbmFibGVkKCkpIHsKLSAgICAgIC8vQ2FuY2VsIHRoZSB0aW1lciBpZiBzdGFydCBzdHJlYW1uZyBjb21lcyBiZWZvcmUKLSAgICAgIC8vIDUgc2Vjb25kcyB3aGlsZSBtb3ZpbmcgdGhlIGludGVydmFsIHRvIHJlbGF4ZWQgbW9kZS4KLSAgICAgIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUNvbm5JbnRlcnZhbFRpbWVyKCkpKSB7Ci0gICAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfY29ubl9JbnRlcnZhbF90aW1lcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGVlcl8uU2V0Q29ublVwZGF0ZU1vZGUoQnRpZkFjbVBlZXI6OmtGbGFnQWdncmVzaXZlTW9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQocGVlcl8uUGVlckFkZHJlc3MoKSwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0KTsKLSAgICBwZWVyXy5DbGVhckZsYWdzKEJ0aWZBY21QZWVyOjprRkxhZ1BlbmRpbmdTdGFydEFmdGVyUmVjb25maWcpOwotICB9Ci0gIHBlZXJfLlNldFJjZmdQcm9maWxlVHlwZSgwKTsKLQotICBpZiAocGVlcl8uU3RhdGVNYWNoaW5lKCkuUHJldmlvdXNTdGF0ZUlkKCkgPT0gQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBFbnRlcmluZyBPcGVuZWQgZnJvbSBTdGFydGVkIFN0YXRlIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgaWYgKChidGlmX2FjbV9pbml0aWF0b3IuR2V0R3JvdXBMb2NrU3RhdHVzKHBlZXJfLlNldElkKCkpICE9Ci0gICAgICAgICBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c1Vua25vd24pICYmCi0gICAgICAgICBhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUdyb3VwUHJvY2VkdXJlVGltZXIoKSkpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBBbGwgbG9ja2VkIGFuZCBzdG9wL3N1c3BlbmQgcmVxdWVzdGVkIGRldmljZSBoYXZlIHN0b3BwZWQsIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwKLSAgICAgICAgIHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgewotICAgICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgICAgYnRpZl9hY21fb25fc3RhcnRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0gICAgICBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfbG9ja19yZWxlYXNlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocGVlcl8uU3RhdGVNYWNoaW5lKCkuUHJldmlvdXNTdGF0ZUlkKCkgPT0gQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZCkgewotICAgIGlmICgoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkgPiAwKSAmJgotICAgICAgICAoYnRpZl9hY21faW5pdGlhdG9yLkdldEdyb3VwTG9ja1N0YXR1cyhidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKSkgPT0gQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNMb2NrZWQpKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9sb2NrX3JlbGVhc2VfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlT3BlbmVkOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpOwotfQotCi1ib29sIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlT3BlbmVkOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdEJUSUZfQUNNKiBwX2FjbSA9ICh0QlRJRl9BQ00qKXBfZGF0YTsKLQotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIG11c2ljX2FjdGl2ZV9wZWVyPSVzIHZvaWNlX2FjdGl2ZV9wZWVyPSVzIiwKLSAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBCdGlmQWNtRXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHBlZXJfLklzUGVlckFjdGl2ZUZvck11c2ljKCkpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgbG9nYm9vbChwZWVyXy5Jc1BlZXJBY3RpdmVGb3JWb2ljZSgpKS5jX3N0cigpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0FDTV9DT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgIHRCVElGX0FDTV9DT05OX0RJU0MqIHBfYnRhX2RhdGEgPSAodEJUSUZfQUNNX0NPTk5fRElTQyopcF9kYXRhOwotICAgICAgYm9vbCBjYW5fY29ubmVjdCA9IHRydWU7Ci0gICAgICAvLyBDaGVjayB3aGV0aGVyIGNvbm5lY3Rpb24gaXMgYWxsb3dlZAotICAgICAgaWYgKHBlZXJfLklzQWNjZXB0b3IoKSkgewotICAgICAgICAvL1RoZXJlIGlzIG5vIGNoYXIgaW4gY3VycmVudCBzcGVjLiBTaG91bGQgd2UgY2hlY2sgVk1DUCByb2xlIGhlcmU/Ci0gICAgICAgIC8vIHNoYWxsIHdlIGFzc3VtZSBWTUNQIHJvbGUgd291bGQgaGF2ZSBiZWVuIGNoZWNrZWQgaW4gYXBwcyBhbmQgbm8gbmVlZCB0byBjaGVjayBoZXJlPwotICAgICAgICBjYW5fY29ubmVjdCA9IGJ0aWZfYWNtX2luaXRpYXRvci5BbGxvd2VkVG9Db25uZWN0KHBlZXJfLlBlZXJBZGRyZXNzKCkpOwotICAgICAgICBpZiAoIWNhbl9jb25uZWN0KSBkaXNjb25uZWN0X2FjbV9pbml0aWF0b3IocGVlcl8uUGVlckFkZHJlc3MoKSwgcF9idGFfZGF0YS0+Y29udGV4dFR5cGUpOwotICAgICAgfQotICAgICAgaWYgKCFjYW5fY29ubmVjdCkgewotICAgICAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBDYW5ub3QgY29ubmVjdCB0byBwZWVyICVzOiB0b28gbWFueSBjb25uZWN0ZWQgIgotICAgICAgICAgICAgInBlZXJzIiwKLSAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiBzdHJlYW1zOwotICAgICAgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fbWVkaWE7Ci0gICAgICAgIGlmIChwZWVyXy5HZXRQcm9maWxlVHlwZSgpICYgKEJBUHxHQ1ApKSB7Ci0gICAgICAgICAgLy9rZWVwaW5nIG1lZGlhIHR4IGFzIEJBUC9HQ1AgY29uZmlnCi0gICAgICAgICAgbWVtc2V0KCZjb25uX21lZGlhLCAwLCBzaXplb2YoY29ubl9tZWRpYSkpOwotICAgICAgICAgIGZldGNoX21lZGlhX3R4X2NvZGVjX3Fvc19jb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgcGVlcl8uR2V0UHJvZmlsZVR5cGUoKSAmIChCQVB8R0NQKSwgJmNvbm5fbWVkaWEpOwotICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGNvbm5fbWVkaWEpOwotI2lmIDAKLSAgICAgICAgICBpZiAoZmFsc2UpIHsvL2VuYWJsZSB3aGVuIEdDUCBzdXBwb3J0IGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgKHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiB+V01DUCksIFZPSUNFX0NPTlRFWFQsIFNSQywgRUJfQ09ORklHKTsKLSAgICAgICAgICAgIFN0cmVhbUNvbm5lY3QgY29ubl92b2ljZTsKLSAgICAgICAgICAgIENvZGVjUW9zQ29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIGNvbm5fdm9pY2Uuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICAgICAgICAgIGNvbm5fdm9pY2Uuc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICAgICAgICAgIGNvbmZpZyA9IHBlZXJfLmdldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgICAgICAgIHByaW50X2NvZGVjX3BhcmFtZXRlcnMoY29uZmlnLmNvZGVjX2NvbmZpZyk7Ci0gICAgICAgICAgICBwcmludF9xb3NfcGFyYW1ldGVycyhjb25maWcucW9zX2NvbmZpZyk7Ci0gICAgICAgICAgICBjb25uX3ZvaWNlLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgICAgICAgICAgY29ubl92b2ljZS5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvbmZpZyk7Ci0gICAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhjb25uX3ZvaWNlKTsKLSAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBpZiAocGVlcl8uR2V0UHJvZmlsZVR5cGUoKSAmIFdNQ1ApIHsKLSAgICAgICAgICAvL2tlZXBpbmcgbWVkaWEgcnggYXMgV01DUCBjb25maWcKLSAgICAgICAgICBtZW1zZXQoJmNvbm5fbWVkaWEsIDAsIHNpemVvZihjb25uX21lZGlhKSk7Ci0gICAgICAgICAgZmV0Y2hfbWVkaWFfcnhfY29kZWNfcW9zX2NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBXTUNQLCAmY29ubl9tZWRpYSk7Ci0gICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl9tZWRpYSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9idGFfZGF0YS0+Y29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFKSB7Ci0JICAgIFN0cmVhbUNvbm5lY3QgY29ubl9tZWRpYSwgY29ubl92b2ljZTsKLSAgICAgICAgLy9rZWVwaW5nIHZvaWNlIHR4IGFzIEJBUCBjb25maWcKLSAgICAgICAgbWVtc2V0KCZjb25uX3ZvaWNlLCAwLCBzaXplb2YoY29ubl92b2ljZSkpOwotICAgICAgICBmZXRjaF92b2ljZV90eF9jb2RlY19xb3NfY29uZmlnKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJBUCwgJmNvbm5fdm9pY2UpOwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhjb25uX3ZvaWNlKTsKLSAgICAgICAgLy9rZWVwaW5nIHZvaWNlIHJ4IGFzIEJBUCBjb25maWcKLSAgICAgICAgbWVtc2V0KCZjb25uX3ZvaWNlLCAwLCBzaXplb2YoY29ubl92b2ljZSkpOwotICAgICAgICBmZXRjaF92b2ljZV9yeF9jb2RlY19xb3NfY29uZmlnKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJBUCwgJmNvbm5fdm9pY2UpOwotICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhjb25uX3ZvaWNlKTsKLSAgICAgICAgaWYgKHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiAoQkFQfEdDUCkpIHsKLSAgICAgICAgICAvL2tlZXBpbmcgbWVkaWEgdHggYXMgQkFQL0dDUCBjb25maWcKLSAgICAgICAgICBtZW1zZXQoJmNvbm5fbWVkaWEsIDAsIHNpemVvZihjb25uX21lZGlhKSk7Ci0gICAgICAgICAgZmV0Y2hfbWVkaWFfdHhfY29kZWNfcW9zX2NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBwZWVyXy5HZXRQcm9maWxlVHlwZSgpICYgKEJBUHxHQ1ApLCAmY29ubl9tZWRpYSk7Ci0gICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl9tZWRpYSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBlZXJfLkdldFByb2ZpbGVUeXBlKCkgJiBXTUNQKSB7Ci0gICAgICAgICAgLy9rZWVwaW5nIG1lZGlhIHJ4IGFzIFdNQ1AgY29uZmlnCi0gICAgICAgICAgbWVtc2V0KCZjb25uX21lZGlhLCAwLCBzaXplb2YoY29ubl9tZWRpYSkpOwotICAgICAgICAgIGZldGNoX21lZGlhX3J4X2NvZGVjX3Fvc19jb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgV01DUCwgJmNvbm5fbWVkaWEpOwotICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGNvbm5fbWVkaWEpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICBTdHJlYW1Db25uZWN0IGNvbm5fdm9pY2U7Ci0gICAgICAgIC8va2VlcGluZyB2b2ljZSB0eCBhcyBCQVAgY29uZmlnCi0gICAgICAgIG1lbXNldCgmY29ubl92b2ljZSwgMCwgc2l6ZW9mKGNvbm5fdm9pY2UpKTsKLSAgICAgICAgZmV0Y2hfdm9pY2VfdHhfY29kZWNfcW9zX2NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBCQVAsICZjb25uX3ZvaWNlKTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl92b2ljZSk7Ci0gICAgICAgIC8va2VlcGluZyB2b2ljZSByeCBhcyBCQVAgY29uZmlnCi0gICAgICAgIG1lbXNldCgmY29ubl92b2ljZSwgMCwgc2l6ZW9mKGNvbm5fdm9pY2UpKTsKLSAgICAgICAgZmV0Y2hfdm9pY2VfcnhfY29kZWNfcW9zX2NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBCQVAsICZjb25uX3ZvaWNlKTsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl92b2ljZSk7Ci0gICAgICB9Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBzaXplIG9mIHN0cmVhbXMgIiA8PCBzdHJlYW1zLnNpemUoKTsKLSAgICAgIGlmICghc1VjYXN0Q2xpZW50SW50ZXJmYWNlKSBicmVhazsKLSAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGFkZHJlc3M7Ci0gICAgICBhZGRyZXNzLnB1c2hfYmFjayhwZWVyXy5QZWVyQWRkcmVzcygpKTsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdChhZGRyZXNzLCBmYWxzZSwgc3RyZWFtcyk7Ci0gICAgICAvL3BlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuaW5nKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FDTV9TVE9QX1NUUkVBTV9SRVFfRVZUOgotICAgIGNhc2UgQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVDogewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEFscmVhZHkgaW4gT1BFTkVEIHN0YXRlLCBBQ0sgc3VjY2VzcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FDTV9TVEFSVF9TVFJFQU1fUkVRX0VWVDogewotICAgICAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGlmIChwZWVyXy5DaGVja0ZsYWdzKEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdTdGFydCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IElnbm9yZSBTdGFydCByZXEiLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jaWYgMAotICAgICAgLy9DYW4gYmUgZWl0aGVyIG11c2ljIG9yIHZvaWNlLCBwcmlvciB0byBjb21pbmcgaGVyZSwKLSAgICAgIC8vdGhpcyBtdXN0IGhhdmUgYmVlbiBldmFsdWF0ZWQgZm9yIGxvY2tpbmcgbG9naWMgKyBncnAgbG9naWMKLSAgICAgIFN0cmVhbVR5cGUgdHlwZV8xOwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RhcnRfc3RyZWFtczsKLSAgICAgIGlmIChjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgIT0gV01DUCkgewotICAgICAgICBpZiAocGVlcl8uR2V0U3RyZWFtQ29udGV4dFR5cGUoKSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIHN0YXJ0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGVlcl8uR2V0U3RyZWFtQ29udGV4dFR5cGUoKSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIFN0cmVhbVR5cGUgdHlwZV8yID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICBzdGFydF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICAgIHN0YXJ0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMik7Ci0gICAgICAgICAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBzZW5kaW5nIHN0YXJ0IGZvciB2b2ljZSMjIyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIHN0YXJ0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKGJ0aWZfYWNtX2luaXRpYXRvci5Jc0Nvbm5VcGRhdGVFbmFibGVkKCkpIHsKLSAgICAgICAgLy9DYW5jZWwgdGhlIHRpbWVyIGlmIHN0YXJ0IHN0cmVhbW5nIGNvbWVzIGJlZm9yZQotICAgICAgICAvLyA1IHNlY29uZHMgd2hpbGUgbW92aW5nIHRoZSBpbnRlcnZhbCB0byByZWxheGVkIG1vZGUuCi0gICAgICAgIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUNvbm5JbnRlcnZhbFRpbWVyKCkpKSB7Ci0gICAgICAgICAgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9jb25uX0ludGVydmFsX3RpbWVyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGVlcl8uU2V0Q29ublVwZGF0ZU1vZGUoQnRpZkFjbVBlZXI6OmtGbGFnQWdncmVzaXZlTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghc1VjYXN0Q2xpZW50SW50ZXJmYWNlKSBicmVhazsKLSAgICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydChwZWVyXy5QZWVyQWRkcmVzcygpLCBzdGFydF9zdHJlYW1zKTsKLSNlbmRpZgotI2lmIDEKLSAgICAgIGlmIChwZWVyXy5HZXRTdHJlYW1Db250ZXh0VHlwZSgpID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICByZWNvbmZpZ19hY21faW5pdGlhdG9yKHBlZXJfLlBlZXJBZGRyZXNzKCksIGN1cnJlbnRfYWN0aXZlX3Byb2ZpbGVfdHlwZSk7Ci0gICAgICB9IGVsc2UgaWYgKHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgIHJlY29uZmlnX2FjbV9pbml0aWF0b3IocGVlcl8uUGVlckFkZHJlc3MoKSwgQkFQX0NBTEwpOwotICAgICAgfQotICAgICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkFjbVBlZXI6OmtGTGFnUGVuZGluZ1N0YXJ0QWZ0ZXJSZWNvbmZpZyk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fU1RBUlRfRVZUOiB7Ci0gICAgICB0QlRJRl9BQ01fU1RBVFVTIHN0YXR1cyA9ICh1aW50OF90KXBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZTsKLSAgICAgIC8vaW50IGNvbnRleHRUeXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIExPR19JTkZPKExPR19UQUcsCi0gICAgICAgICAgICAgICAiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBzdGF0dXM9JWQgIiwKLSAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksc3RhdHVzKTsKLQotICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6U1RBUlRJTkcpIHsKLSAgICAgICAgLy9DaGVjayB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZQotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQkFQIHJldHVybmVkIGFzIHN0YXJ0aW5nLCBpZ25vcmUiLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6U1RSRUFNSU5HKXsKLSAgICAgICAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpOwotICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BQ01fRElTQ09OTkVDVF9SRVFfRVZUOnsKLSAgICAgIHRCVElGX0FDTV9DT05OX0RJU0MqIHBfYnRhX2RhdGEgPSAodEJUSUZfQUNNX0NPTk5fRElTQyopcF9kYXRhOwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZGlzY29ubmVjdF9zdHJlYW1zOwotICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0KSkgewotICAgICAgICBwZWVyXy5DbGVhckZsYWdzKEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdTdGFydCk7Ci0gICAgICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRElTQ09OTkVDVF9JTl9QUk9HUkVTUyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgIGlmIChwX2J0YV9kYXRhLT5wcm9maWxlVHlwZSAmIChCQVB8R0NQKSkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocF9idGFfZGF0YS0+cHJvZmlsZVR5cGUgJiBXTUNQKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUNfVk9JQ0UpIHsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzIgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMyA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMyk7Ci0gICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8yKTsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgIGlmIChwX2J0YV9kYXRhLT5wcm9maWxlVHlwZSAmIChCQVB8R0NQKSkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnByb2ZpbGVUeXBlICYgV01DUCkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRSwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkgewotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMiA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZV8zID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8zKTsKLSAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzIpOwotICAgICAgfQotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgc2l6ZSBvZiBkaXNjb25uZWN0X3N0cmVhbXMgIiA8PCBkaXNjb25uZWN0X3N0cmVhbXMuc2l6ZSgpOwotICAgICAgaWYgKCFzVWNhc3RDbGllbnRJbnRlcmZhY2UpIGJyZWFrOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KHBlZXJfLlBlZXJBZGRyZXNzKCksIGRpc2Nvbm5lY3Rfc3RyZWFtcyk7Ci0KLSAgICAgIGlmICgocF9idGFfZGF0YS0+Y29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSAmJiAoKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB8fAotICAgICAgICAgIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHZvaWNlIGNvbm5lY3RlZCByZW1haW4gaW4gb3BlbmVkICI7Ci0gICAgICB9IGVsc2UgaWYgKChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpICYmICgocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHx8Ci0gICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgTXVzaWMgY29ubmVjdGVkIHJlbWFpbiBpbiBvcGVuZWQgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIE1vdmUgaW4gY2xvc2luZyBzdGF0ZSAiOwotICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZyk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9TVE9QX0VWVDogeyAvL1N1bWl0OiB3aGF0IGlzIHRoaXMgY2FzZT8KLSAgICAgIGludCBjb250ZXh0VHlwZSA9IHBfYWNtLT5hY21fY29ubmVjdC5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIGJ0aWZfcmVwb3J0X2F1ZGlvX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0FVRElPX1NUQVRFX1NUT1BQRUQsIHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkpOwotICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkKLSAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fQ09OTkVDVF9FVlQ6IHsvLyBhYm92ZSBldm50IGNhbiBjb21lIGFuZCBoYW5kbGUgZm9yIHZvaWNlL21lZGlhIGNhc2UKLSAgICAgIHRCVElGX0FDTV9TVEFUVVMgc3RhdHVzID0gKHVpbnQ4X3QpcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlOwotICAgICAgaW50IGNvbnRleHRUeXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLQotICAgICAgTE9HX0lORk8oCi0gICAgICAgICAgTE9HX1RBRywgIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgc3RhdHVzPSVkIiwKLSAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICBCdGlmQWNtRXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSxzdGF0dXMpOwotICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCkpIHsKLSAgICAgICAgcGVlcl8uQ2xlYXJGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nTG9jYWxTdXNwZW5kKTsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHBlZXIgZGV2aWNlIGlzIHN1c3BlbmRlZCwgc2VuZCBNTSBhbnkgcGVuZGluZyBBQ0siLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICAgIGJ0aWZfYWNtX29uX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgICBpZiAoKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZVBlZXIoKSA9PSBwZWVyXy5QZWVyQWRkcmVzcygpKSAmJgotICAgICAgICAgICAgICAgICAgcGVlcl8uQ2hlY2tGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nUmVjb25maWd1cmUpKSB7IC8vcmVjaGVjawotICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIiA6IFBlZXIgIiA8PCBwZWVyXy5QZWVyQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICA8PCAiIDogUmVjb25maWcgZG9uZSAtIGNhbGxpbmcgc3RhcnRTZXNzaW9uKCkgdG8gYXVkaW8gSEFMIjsKLSAgICAgICAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2U7Ci0gICAgICAgICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBwZWVyX3JlYWR5X2Z1dHVyZSA9IHBlZXJfcmVhZHlfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgICAgICAgICAvL1RPRE86IGNhbm5vdCB1c2UgcGVlciBhZGRyIGhlcmUsIG11c3QgbmVlZCBncm91cCBhZGRyZXNzLgotICAgICAgICAgICAgYnRpZl9hY21fc291cmNlX3N0YXJ0X3Nlc3Npb24ocGVlcl8uUGVlckFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAvL1BlcmZvcm0gZ3JvdXAgb3BlcmF0aW9uIGhlcmUKLSAgICAgICAgICB9IGVsc2UgaWYgKCgocGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpKSAmJgotICAgICAgICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORykgJiYKLSAgICAgICAgICAgICAgICAgICAgIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG11c2ljIFR4IGNvbm5lY3RlZCB3aGVuIGVpdGhlciBWb2ljZSBUeC9SeCBvciBNdXNpYyBSeCB3YXMgY29ubmVjdGVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbWFpbiBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciBNdXNpYyBUWCwgdXBkYXRlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX01VU0lDKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RJTkcpICYmCi0gICAgICAgICAgICAgIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpKSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciBNdXNpYyBSWChyZWNvcmRpbmcpLCB1cGRhdGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVELCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgIH0KLSNpZiAwCi0gICAgICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0KSkgewotICAgICAgICAgICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIiA6IFBlZXIgIiA8PCBwZWVyXy5QZWVyQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiA6IFJlY29uZmlnIGRvbmUgLSBjYWxsaW5nIEJUQV9BdlN0YXJ0KCkiOwotICAgICAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IFdNQ1ApIHsKLSAgICAgICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBzdGFydF9zdHJlYW1zOwotICAgICAgICAgICAgc3RhcnRfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgICAgIGlmICghc1VjYXN0Q2xpZW50SW50ZXJmYWNlKSBicmVhazsKLSAgICAgICAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQocGVlcl8uUGVlckFkZHJlc3MoKSwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHZvaWNlIGNvbnRleHQgY29ubmVjdGVkLCByZW1haW4gaW4gb3BlbmVkIHN0YXRlIgotICAgICAgICAgICAgICAgICAgIiBwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgJWQgcGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCksIHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSk7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTksgJiYKLSAgICAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgIT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVR4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUWCwgdXBkYXRlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMgJiYKLSAgICAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgIT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSWCwgdXBkYXRlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORyl7Ci0gICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGNvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAgZm9yIE1FRElBIFR4IG9yIFJ4LCBpZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciBDT05WRVJTQVRJT05BTCBUeCBvciBSeCwgaWdub3JlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUNNX0RJU0NPTk5FQ1RfRVZUOiB7Ci0gICAgICBpbnQgY29udGV4dF90eXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICBpZiAoY29udGV4dF90eXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1J4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIFR4L1J4IGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gVm9pY2UgVHgrUnggJiBNZWRpYSBSeC9UeCB3YXMgZGlzY29ubmVjdGVkLCBtb3ZlIGluIGlkbGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNZWRpYSBUeC9SeCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAiCi0gICAgICAgICAgICAgICAgICAgICAgIiB3aGVuIGVpdGhlciBWb2ljZSBUeCBvciBSeCBvciBNZWRpYSBSeC9UeCBpcyBjb25uZWN0ZWQsIHJlbWFpbiBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4LCBNdXNpYyBUeCAmIFJ4IGFyZSBkaXNjb25uZWN0ZWQgbW92ZSBpbiBpZGxlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5lY3RlZCBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbWFpbiBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFR4LCBNdXNpYyBUeCAmIFJ4IGFyZSBkaXNjb25uZWN0ZWQgbW92ZSBpbiBpZGxlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5lY3RlZCBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbWFpbiBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1R4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgIGlmICgocGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpICYmCi0gICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpICYmCi0gICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpICYmCi0gICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNZWRpYSBUeC9SeCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiBWb2ljZSBUeCtSeCBhbmQgTWVkaWEgUngvVHggZGlzY29ubmVjdGVkL2luZywgbW92ZSBpbiBjbG9zaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIFR4L1J4IGRpc2Nvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGVuIGVpdGhlciBWb2ljZSBUeCBvciBSeCBvciBNZWRpYSBSeC9UeCBpcyBjb25uZWN0ZWQsIHJlbWFpbiBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HLCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBpZiAoKChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgfHwKLSAgICAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpKSAmJgotICAgICAgICAgICAgICAgICAgKChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgfHwKLSAgICAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpKSkgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4LCBtdXNpYyBUeCtSeCBhcmUgZGlzY29ubmVjdGVkL2luZyBtb3ZlIGluIGNsb3Npbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUNsb3NpbmcpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5jdGVkL2luZyBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZC9pbmcsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZW1haW4gaW4gb3BlbmVkIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcgfHwKLSAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORywgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgaWYgKCgocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHx8Ci0gICAgICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSkgJiYKLSAgICAgICAgICAgICAgICAgICgocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHx8Ci0gICAgICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSkpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgUngsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBUeCwgbXVzaWMgVHgrUnggYXJlIGRpc2Nvbm5lY3RlZC9pbmcgbW92ZSBpbiBjbG9zaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVDbG9zaW5nKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFR4IGlzIGRpc2Nvbm5jdGVkL2luZyBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZC9pbmcsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZW1haW4gaW4gb3BlbmVkIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVElGX0FDTV9SRUNPTkZJR19SRVFfRVZUOiB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiByZWNvbmZfc3RyZWFtczsKLSAgICAgICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2luZm87Ci0gICAgICAgIENvZGVjUW9zQ29uZmlnIGNmZzsKLSAgICAgICAgaWYgKHBfYWNtLT5hY21fcmVjb25maWcuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLnR5cGUgIT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IHBfYWNtLT5hY21fcmVjb25maWcuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLnR5cGU7Ci0gICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbS0+YWNtX3JlY29uZmlnLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0OwotICAgICAgICAgIHJlY29uZl9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IHBfYWNtLT5hY21fcmVjb25maWcuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbjsKLSAgICAgICAgICByZWNvbmZfaW5mby5yZWNvbmZfdHlwZSA9IHBfYWNtLT5hY21fcmVjb25maWcuc3RyZWFtc19pbmZvLnJlY29uZl90eXBlOwotICAgICAgICAgIGNmZyA9IHBlZXJfLmdldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgICAgICByZWNvbmZfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNmZyk7Ci0gICAgICAgICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9pbmZvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWNvbmZfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgICAgICAgIHJlY29uZl9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkM7Ci0gICAgICAgICAgcmVjb25mX2luZm8ucmVjb25mX3R5cGUgPSBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgICAgICAgIGlmIChwZWVyXy5Jc1N0ZXJlb0hzVHlwZSgpKSB7Ci0gICAgICAgICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBCQVAsIFZPSUNFX0NPTlRFWFQsIFNSQywgU1RFUkVPX0hTX0NPTkZJR18xKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgQkFQLCBWT0lDRV9DT05URVhULCBTUkMsIEVCX0NPTkZJRyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNmZyA9IHBlZXJfLmdldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgICAgICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNmZy5jb2RlY19jb25maWcpOwotICAgICAgICAgIHByaW50X3Fvc19wYXJhbWV0ZXJzKGNmZy5xb3NfY29uZmlnKTsKLSAgICAgICAgICByZWNvbmZfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNmZyk7Ci0gICAgICAgICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9pbmZvKTsKLQotICAgICAgICAgIHJlY29uZl9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICAgICAgICByZWNvbmZfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgICAgICAgcmVjb25mX2luZm8ucmVjb25mX3R5cGUgPSBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgICAgICAgIGlmIChwZWVyXy5Jc1N0ZXJlb0hzVHlwZSgpKSB7Ci0gICAgICAgICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyXy5QZWVyQWRkcmVzcygpLCBCQVAsIFZPSUNFX0NPTlRFWFQsIFNSQywgU1RFUkVPX0hTX0NPTkZJR18xKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlcl8uUGVlckFkZHJlc3MoKSwgQkFQLCBWT0lDRV9DT05URVhULCBTUkMsIEVCX0NPTkZJRyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNmZyA9IHBlZXJfLmdldF9wZWVyX3ZvaWNlX3R4X2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICAgICAgICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNmZy5jb2RlY19jb25maWcpOwotICAgICAgICAgIHByaW50X3Fvc19wYXJhbWV0ZXJzKGNmZy5xb3NfY29uZmlnKTsKLSAgICAgICAgICByZWNvbmZfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNmZyk7Ci0gICAgICAgICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9pbmZvKTsKLQotICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUoU3RyZWFtU3RhdGU6OlJFQ09ORklHVVJJTkcpOwotICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVR4U3RhdGUoU3RyZWFtU3RhdGU6OlJFQ09ORklHVVJJTkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc1VjYXN0Q2xpZW50SW50ZXJmYWNlKSBicmVhazsKLSAgICAgICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHJlY29uZl9zdHJlYW1zKTsKLSAgICAgICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1JlY29uZmlndXJlKTsKLSAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlY29uZmlndXJpbmcpOwotICAgIH0KLSAgICBicmVhazsKLSAgICBjYXNlIEJUQV9BQ01fQ09ORklHX0VWVDogewotICAgICAgIHRCVElGX0FDTSogcF9hY21fZGF0YSA9ICh0QlRJRl9BQ00qKXBfZGF0YTsKLSAgICAgICB1aW50MTZfdCBjb250ZXh0VHlwZSA9IHBfYWNtX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgICB1aW50MTZfdCBwZWVyX2xhdGVuY3lfbXMgPSAwOwotICAgICAgIHVpbnQzMl90IHByZXNlbl9kZWxheSA9IDA7Ci0gICAgICAgYm9vbCBpc191cGRhdGVfcmVxdWlyZSA9IGZhbHNlOwotICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgIGlmIChwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjb21wYXJlIHdpdGggY3VycmVudCBtZWRpYSBjb25maWciLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgICAgaXNfdXBkYXRlX3JlcXVpcmUgPSBjb21wYXJlX2NvZGVjX2NvbmZpZ18oY3VycmVudF9tZWRpYV9jb25maWcsIHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZyk7Ci0gICAgICAgICB9IGVsc2UgaWYgKHBfYWNtX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfTElWRSkgewotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY2FjaGUgY3VycmVudF9yZWNvcmRpbmdfY29uZmlnIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgIGN1cnJlbnRfcmVjb3JkaW5nX2NvbmZpZyA9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChtYW5kYXRvcnlfY29kZWNfc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IE1hbmRhdG9yeSBjb2RlYyBzZWxlY3RlZCwgZG8gbm90IHN0b3JlIGNvbmZpZyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHN0b3JlIGNvbmZpZ3VyYXRpb24iLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC8vQ2FjaGUgdGhlIHBlZXIgbGF0ZW5jeSBpbiBXTUNQIGNhc2UKLSAgICAgICAgIGlmIChwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX0xJVkUpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVswXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzBdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsxXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzFdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsyXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzJdKTsKLSAgICAgICAgICAgcHJlc2VuX2RlbGF5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVswXSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzFdIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsyXSA8PCAxNik7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwcmVzZW5fZGVsYXkgPSAlZHVzIiwgX19mdW5jX18sIHByZXNlbl9kZWxheSk7Ci0gICAgICAgICAgIHBlZXJfbGF0ZW5jeV9tcyA9IHByZXNlbl9kZWxheS8xMDAwOwotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc190b19tIGxhdGVuY3kgPSAlZG1zIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbV9kYXRhLT5jb25maWdfaW5mby5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tKTsKLSAgICAgICAgICAgcGVlcl9sYXRlbmN5X21zICs9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuY2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX207Ci0gICAgICAgICAgIHBlZXJfLlNldFBlZXJMYXRlbmN5KHBlZXJfbGF0ZW5jeV9tcyk7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYWNoZWQgcGVlciBMYXRlbmN5ID0gJWRtcyIsIF9fZnVuY19fLCBwZWVyXy5HZXRQZWVyTGF0ZW5jeSgpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChpc191cGRhdGVfcmVxdWlyZSkgewotICAgICAgICAgICBjdXJyZW50X21lZGlhX2NvbmZpZyA9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGN1cnJlbnRfbWVkaWFfY29uZmlnLmNvZGVjX3NwZWNpZmljXzM6ICUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQsIF9fZnVuY19fLCBjdXJyZW50X21lZGlhX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zKTsKLSAgICAgICAgICAgYnRpZl9hY21fdXBkYXRlX2xjM3FfcGFyYW1zKCZjdXJyZW50X21lZGlhX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zLCBwX2FjbV9kYXRhKTsKLSAgICAgICAgICAgYnRpZl9hY21fcmVwb3J0X3NvdXJjZV9jb2RlY19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBjdXJyZW50X21lZGlhX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY2FzdF9jb2RlY3NfY2FwYWJpbGl0aWVzLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgfQotICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMICYmCi0gICAgICAgICAgICAgICAgICBwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYWNoZSBjdXJyZW50X3ZvaWNlX2NvbmZpZyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICAgY3VycmVudF92b2ljZV9jb25maWcgPSBwX2FjbV9kYXRhLT5jb25maWdfaW5mby5jb2RlY19jb25maWc7Ci0gICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3VycmVudF92b2ljZV9jb25maWcuY29kZWNfc3BlY2lmaWNfMzogJSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQsIF9fZnVuY19fLCBjdXJyZW50X3ZvaWNlX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zKTsKLSAgICAgICAgIGJ0aWZfYWNtX3VwZGF0ZV9sYzNxX3BhcmFtcygmY3VycmVudF92b2ljZV9jb25maWcuY29kZWNfc3BlY2lmaWNfMywgcF9hY21fZGF0YSk7Ci0gICAgICAgICBidGlmX2FjbV9yZXBvcnRfc291cmNlX2NvZGVjX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIGN1cnJlbnRfdm9pY2VfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNhc3RfY29kZWNzX2NhcGFiaWxpdGllcywgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICB9Ci0gICAgICAvL0hhbmRsZSBCQVAgU1RBUlQgaWYgcmVjb25maWcgY29tZXMgaW4gbWlkIG9mIHN0cmVhbWluZwotICAgICAgLy9wZWVyXy5TZXRTdHJlYW1SZWNvbmZpZ0luZm8ocF9hY20tPmFjbV9yZWNvbmZpZyk7Ci0gICAgICAvL1RPRE86IGxvY2FsIGNhcGFiaWxpdGllcwotICAgICAgLy9Db2RlY0NvbmZpZyByZWNvcmQgPSBwX2J0YV9kYXRhLT5hY21fcmVjb25maWcuY29kZWNfY29uZmlnOwotICAgICAgLy9zYXZpbmcgY29kZWMgY29uZmlnIGFzIG5lZ290aWF0ZWQgcGFyYW1ldGVyIGFzIHRydWUKLSAgICAgIC8vYnRpZl9wYWNzX2FkZF9yZWNvcmQocGVlcl8uUGVlckFkZHJlc3MoKSwgdHJ1ZSwgQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TUkMsICZyZWNvcmQpOwotCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9DT05OX1VQREFURV9USU1FT1VUX0VWVDoKLSAgICAgIHBlZXJfLlNldENvbm5VcGRhdGVNb2RlKEJ0aWZBY21QZWVyOjprRmxhZ1JlbGF4ZWRNb2RlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IFBlZXIgJXMgOiBVbmhhbmRsZWQgZXZlbnQ9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYWNtX2NoZWNrX2lmX3JlcXVlc3RlZF9kZXZpY2VzX3N0YXJ0ZWQoKSB7Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+OjppdGVyYXRvciBpdHI7Ci0gIGlmICgoYnRpZl9hY21faW5pdGlhdG9yLmxvY2tlZF9kZXZpY2VzKS5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChpdHIgPSAoYnRpZl9hY21faW5pdGlhdG9yLmxvY2tlZF9kZXZpY2VzKS5iZWdpbigpOyBpdHIgIT0gKGJ0aWZfYWNtX2luaXRpYXRvci5sb2NrZWRfZGV2aWNlcykuZW5kKCk7IGl0cisrKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogYWRkcmVzcyA9JXMiLCBfX2Z1bmNfXywgKml0ci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKCppdHIpOwotICAgICAgaWYgKChwZWVyID09IG51bGxwdHIpIHx8IChwZWVyICE9IG51bGxwdHIgJiYgIXBlZXItPklzU3RyZWFtaW5nKCkpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaXRyID09IChidGlmX2FjbV9pbml0aWF0b3IubG9ja2VkX2RldmljZXMpLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGJ0aWZfYWNtX2NoZWNrX2lmX3JlcXVlc3RlZF9kZXZpY2VzX3N0b3BwZWQoKSB7Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+OjppdGVyYXRvciBpdHI7Ci0gIGlmICgoYnRpZl9hY21faW5pdGlhdG9yLmxvY2tlZF9kZXZpY2VzKS5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChpdHIgPSAoYnRpZl9hY21faW5pdGlhdG9yLmxvY2tlZF9kZXZpY2VzKS5iZWdpbigpOyBpdHIgIT0gKGJ0aWZfYWNtX2luaXRpYXRvci5sb2NrZWRfZGV2aWNlcykuZW5kKCk7IGl0cisrKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogYWRkcmVzcyA9JXMiLCBfX2Z1bmNfXywgKml0ci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKCppdHIpOwotICAgICAgaWYgKChwZWVyID09IG51bGxwdHIpIHx8IChwZWVyICE9IG51bGxwdHIgLyomJiAhcGVlci0+SXNTdXNwZW5kZWQoKSovKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGl0ciA9PSAoYnRpZl9hY21faW5pdGlhdG9yLmxvY2tlZF9kZXZpY2VzKS5lbmQoKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBCdGlmQWNtU3RhdGVNYWNoaW5lOjpTdGF0ZVN0YXJ0ZWQ6Ok9uRW50ZXIoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzLCBQZWVyIFNldElkID0gJWQsIE11c2ljQWN0aXZlU2V0SWQgPSAlZCwgQ29udGV4dFR5cGUgPSAlZCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uU2V0SWQoKSwgYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCksIHBlZXJfLkdldENvbnRleHRUeXBlKCkpOwotCi0gIGlmKGJ0aWZfYWNtX2luaXRpYXRvci5Jc0Nvbm5VcGRhdGVFbmFibGVkKCkpIHsKLSAgICAvL1N0YXJ0aW5nIHRoZSB0aW1lciBmb3IgNSBzZWNvbmRzIGJlZm9yZSBtb3ZpbmcgdG8gcmVsYXhlZCBzdGF0ZSBhcwotICAgIC8vc3RvcCBldmVudCBvciBzdGFydCBzdHJlYW1pbmcgZXZlbnQgbW9naHQgaW1tZWRpYXRlbHkgY29tZQotICAgIC8vd2hpY2ggcmVxdWlyZXMgYWdncmVzaXZlIGludGVydmFsCi0gICAgYnRpZl9hY21fY2hlY2tfYW5kX3N0YXJ0X2Nvbm5fSW50ZXJ2YWxfdGltZXIoJnBlZXJfKTsKLSAgfQotCi0gIC8vIFJlcG9ydCB0aGF0IHdlIGhhdmUgZW50ZXJlZCB0aGUgU3RyZWFtaW5nIHN0YWdlLiBVc3VhbGx5LCB0aGlzIHNob3VsZAotICAvLyBiZSBmb2xsb3dlZCBieSBmb2N1cyBncmFudC4gU2VlIHVwZGF0ZV9hdWRpb19mb2N1c19zdGF0ZSgpCi0gIGJ0aWZfcmVwb3J0X2F1ZGlvX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0FVRElPX1NUQVRFX1NUQVJURUQsIHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkpOwotICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKGJ0aWZfYWNtX2luaXRpYXRvci5BY21Hcm91cFByb2NlZHVyZVRpbWVyKCkpKSB7Ci0gICAgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9ncm91cF9wcm9jZWR1cmVfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczpubyBncm91cCBwcm9jZWR1cmUgdGltZXIgcnVubmluZyBBQ0sgcGVuZGluZyBjbWQiLCBfX2Z1bmNfXyk7Ci0gICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwKLSAgICAgICBwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQpIHsKLSAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgIGJ0aWZfYWNtX29uX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgfQotICB9Ci0jaWYgMAotICBpZiAoKGJ0aWZfYWNtX2luaXRpYXRvci5HZXRHcm91cExvY2tTdGF0dXMocGVlcl8uU2V0SWQoKSkgIT0gQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNVbmtub3duKSAmJgotICAgICAgIGFsYXJtX2lzX3NjaGVkdWxlZChidGlmX2FjbV9pbml0aWF0b3IuQWNtR3JvdXBQcm9jZWR1cmVUaW1lcigpKSkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBBbGwgbG9ja2VkIGFuZCBzdGFydCByZXF1ZXN0ZWQgZGV2aWNlIGhhdmUgc3RhcnRlZCwgYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgIC8vaW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNoYW5nZSBjaGFubmVsIG1vZGUgdG8gc3RlcmVvCi0gICAgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9ncm91cF9wcm9jZWR1cmVfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgIH0KLSAgICBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfbG9ja19yZWxlYXNlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgfQotCi0gIC8vU3RhcnQgdGhlIGxvY2sgcmVsZWFzZSB0aW1lciBoZXJlLgotICBpZiAoKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpICE9IElOVkFMSURfU0VUX0lEKSAmJgotICAgICAgKGJ0aWZfYWNtX2luaXRpYXRvci5HZXRHcm91cExvY2tTdGF0dXMoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpID09IEJ0aWZBY21Jbml0aWF0b3I6OmtGbGFnU3RhdHVzTG9ja2VkKSkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYnRpZl9hY21fY2hlY2tfYW5kX3N0YXJ0X2xvY2tfcmVsZWFzZV90aW1lcihidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKSk7Ci0gIH0KLSAgaWYgKCFidGlmX2FjbV9pbml0aWF0b3IuSXNNdXNpY0FjdGl2ZUdyb3VwU3RhcnRlZCgpKSB7Ci0gICAgaWYgKHBlZXJfLlNldElkKCkgPT0gYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpCi0gICAgICBidGlmX2FjbV9pbml0aWF0b3IuU2V0TXVzaWNBY3RpdmVHcm91cFN0YXJ0ZWQodHJ1ZSk7Ci0gIH0KLSNlbmRpZgotCi19Ci0KLXZvaWQgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVTdGFydGVkOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLWJvb2wgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVTdGFydGVkOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICB0QlRJRl9BQ00qIHBfYWNtID0gKHRCVElGX0FDTSopcF9kYXRhOwotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMgbXVzaWNfYWN0aXZlX3BlZXI9JXMgdm9pY2VfYWN0aXZlX3BlZXI9JXMiLAotICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxvZ2Jvb2wocGVlcl8uSXNQZWVyQWN0aXZlRm9yTXVzaWMoKSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHBlZXJfLklzUGVlckFjdGl2ZUZvclZvaWNlKCkpLmNfc3RyKCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgY2FzZSBCVElGX0FDTV9TVVNQRU5EX1NUUkVBTV9SRVFfRVZUOiB7Ci0gICAgICBMT0dfSU5GTyhMT0dfVEFHLCAiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLAotICAgICAgICAgICAgICAgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCk7Ci0KLSAgICAgIFN0cmVhbVR5cGUgdHlwZV8xOwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RvcF9zdHJlYW1zOwotICAgICAgaWYgKHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgICAgIGlmIChjdXJyZW50X2FjdGl2ZV9wcm9maWxlX3R5cGUgIT0gV01DUCkgewotICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIHN0b3Bfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0xJVkUsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgc3RvcF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZV8yOwotICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgdHlwZV8yID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgc3RvcF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzIpOwotICAgICAgICBzdG9wX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICB9Ci0gICAgICBpZihidGlmX2FjbV9pbml0aWF0b3IuSXNDb25uVXBkYXRlRW5hYmxlZCgpKSB7Ci0gICAgICAgIC8vQ2FuY2VsIHRoZSB0aW1lciBpZiBzdGFydCBzdHJlYW1uZyBjb21lcyBiZWZvcmUKLSAgICAgICAgLy8gNSBzZWNvbmRzIHdoaWxlIG1vdmluZyB0aGUgaW50ZXJ2YWwgdG8gcmVsYXhlZCBtb2RlLgotICAgICAgICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKGJ0aWZfYWNtX2luaXRpYXRvci5BY21Db25uSW50ZXJ2YWxUaW1lcigpKSkgewotICAgICAgICAgICBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2Nvbm5fSW50ZXJ2YWxfdGltZXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBwZWVyXy5TZXRDb25uVXBkYXRlTW9kZShCdGlmQWNtUGVlcjo6a0ZsYWdBZ2dyZXNpdmVNb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIXNVY2FzdENsaWVudEludGVyZmFjZSkgYnJlYWs7Ci0gICAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcChwZWVyXy5QZWVyQWRkcmVzcygpLCBzdG9wX3N0cmVhbXMpOwotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BQ01fRElTQ09OTkVDVF9SRVFfRVZUOiB7Ci0gICAgICBpbnQgY29udGV4dFR5cGUgPSBwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS50eXBlOwotICAgICAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMgY29udGV4dFR5cGU9JWQiLCBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBCdGlmQWNtRXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLCBjb250ZXh0VHlwZSk7Ci0KLSAgICAgIHRCVElGX0FDTV9DT05OX0RJU0MqIHBfYnRhX2RhdGEgPSAodEJUSUZfQUNNX0NPTk5fRElTQyopcF9kYXRhOwotICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZGlzY29ubmVjdF9zdHJlYW1zOwotICAgICAgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMTsKLSAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnByb2ZpbGVUeXBlICYgKEJBUHxHQ1ApKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwX2J0YV9kYXRhLT5wcm9maWxlVHlwZSAmIFdNQ1ApIHsKLSAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0xJVkUsCi0gICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQ19WT0lDRSkgewotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMiA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZV8zID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8zKTsKLSAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzIpOwotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMTsKLSAgICAgICAgaWYgKHBfYnRhX2RhdGEtPnByb2ZpbGVUeXBlICYgKEJBUHxHQ1ApKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgIGRpc2Nvbm5lY3Rfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV8xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocF9idGFfZGF0YS0+cHJvZmlsZVR5cGUgJiBXTUNQKSB7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9idGFfZGF0YS0+Y29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgIFN0cmVhbVR5cGUgdHlwZV8yID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzMgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzMpOwotICAgICAgICBkaXNjb25uZWN0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMik7Ci0gICAgICB9Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBzaXplIG9mIGRpc2Nvbm5lY3Rfc3RyZWFtcyAiIDw8IGRpc2Nvbm5lY3Rfc3RyZWFtcy5zaXplKCk7Ci0gICAgICBpZiAoIXNVY2FzdENsaWVudEludGVyZmFjZSkgYnJlYWs7Ci0gICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QocGVlcl8uUGVlckFkZHJlc3MoKSwgZGlzY29ubmVjdF9zdHJlYW1zKTsKLQotICAgICAgLy8gSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHdlIGFyZSBkaXNjb25uZWN0aW5nCi0gICAgICBpZiAoKHBfYnRhX2RhdGEtPmNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykgJiYgKChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgfHwKLSAgICAgICAgICAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpKSkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiB2b2ljZSBjb25uZWN0ZWQgbW92ZSBpbiBvcGVuZWQgc3RhdGUgIjsKLSAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5lZCk7Ci0gICAgICB9IGVsc2UgaWYgKChwX2J0YV9kYXRhLT5jb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpICYmICgocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHx8Ci0gICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgTXVzaWMgY29ubmVjdGVkIHJlbWFpbiBpbiBzdGFydGVkIHN0YXRlICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBNb3ZlIGluIGNsb3Npbmcgc3RhdGUgIjsKLSAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUNsb3NpbmcpOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9TVE9QX0VWVDogewotICAgICAgaW50IGNvbnRleHRUeXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIExPR19JTkZPKExPR19UQUcsICIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBTVE9QUElORyBldmVudCBjYW1lIGZyb20gQkFQIGZvciBNZWRpYSwgaWdub3JlIiwgX19mdW5jX18pOwotICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFNUT1BQSU5HIGV2ZW50IGNhbWUgZnJvbSBCQVAgZm9yIFZvaWNlLCBpZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUNNX0RJU0NPTk5FQ1RfRVZUOiB7Ci0gICAgICBpbnQgY29udGV4dF90eXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICBpZiAoY29udGV4dF90eXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1J4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIFR4L1J4IGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gVm9pY2UgVHgrUnggJiBNZWRpYSBSeC9UeCB3YXMgZGlzY29ubmVjdGVkLCBtb3ZlIGluIGlkbGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNZWRpYSBUeC9SeCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAiCi0gICAgICAgICAgICAgICAgICAgICAgIiB3aGVuIGVpdGhlciBWb2ljZSBUeCBvciBSeCBvciBNZWRpYSBSeC9UeCBpcyBjb25uZWN0ZWQsIHJlbWFpbiBpbiBzdGFydGVkIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVR4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHgsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBSeCwgTXVzaWMgVHggJiBSeCBhcmUgZGlzY29ubmVjdGVkIG1vdmUgaW4gaWRsZSBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHgsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBSeCBpcyBkaXNjb25uZWN0ZWQgYnV0IG11c2ljIFR4IG9yIFJ4IHN0aWxsIG5vdCBkaXNjb25uZWN0ZWQsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZW1haW4gaW4gc3RhcnRlZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgVHgsIE11c2ljIFR4ICYgUnggYXJlIGRpc2Nvbm5lY3RlZCBtb3ZlIGluIGlkbGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgUnggaXMgZGlzY29ubmVjdGVkIGJ1dCBtdXNpYyBUeCBvciBSeCBzdGlsbCBub3QgZGlzY29ubmVjdGVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVtYWluIGluIHN0YXJ0ZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1R4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSAmJgotICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSAmJgotICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSAmJgotICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSkgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgTWVkaWEgVHgvUnggZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gVm9pY2UgVHgrUnggYW5kIE1lZGlhIFJ4L1R4IGRpc2Nvbm5lY3RlZC9pbmcsIG1vdmUgaW4gY2xvc2luZyBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUNsb3NpbmcpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlmIChwZWVyXy5HZXRTdHJlYW1Db250ZXh0VHlwZSgpID09IENPTlRFWFRfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IGRpc2Nvbm5lY3Rfc3RyZWFtczsKLSAgICAgICAgICAgICAgICBidGlmX3JlcG9ydF9hdWRpb19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9BVURJT19TVEFURV9TVE9QUEVELCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNZWRpYSBUeC9SeCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIHdoaWxlIHN0cmVhbWluZyIKLSAgICAgICAgICAgICAgICAgICAgIiB3aGVuIGVpdGhlciBWb2ljZSBUeCBvciBSeCBvciBNZWRpYSBSeC9UeCBpcyBjb25uZWN0ZWQsIG1vdmUgdG8gb3BlbmVkIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFJlY2VpdmVkIGRpc2Nvbm5lY3RpbmcgZm9yIE11c2ljLVR4LCBpbml0aWF0ZSBmb3IgUnggYWxzbyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzE7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0xJVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNVY2FzdENsaWVudEludGVyZmFjZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdChwZWVyXy5QZWVyQWRkcmVzcygpLCBkaXNjb25uZWN0X3N0cmVhbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBSZWNlaXZlZCBkaXNjb25uZWN0aW5nIGZvciBNdXNpYy1SeCwgaW5pdGlhdGUgZm9yIFR4IGFsc28iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmVhbVR5cGUgdHlwZV8xOwotICAgICAgICAgICAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNVY2FzdENsaWVudEludGVyZmFjZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdChwZWVyXy5QZWVyQWRkcmVzcygpLCBkaXNjb25uZWN0X3N0cmVhbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgTWVkaWEgVHgvUnggZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgIiB3aGVuIGVpdGhlciBWb2ljZSBUeCBvciBSeCBvciBNZWRpYSBSeC9UeCBpcyBjb25uZWN0ZWQsIHJlbWFpbiBpbiBzdGFydGVkIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dF90eXBlID09IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HIHx8Ci0gICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgaWYgKCgocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHx8Ci0gICAgICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSkgJiYKLSAgICAgICAgICAgICAgICAgICgocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHx8Ci0gICAgICAgICAgICAgICAgICAocGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HKSkpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHgsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBSeCwgbXVzaWMgVHgrUnggYXJlIGRpc2Nvbm5lY3RlZC9pbmcgbW92ZSBpbiBjbG9zaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVDbG9zaW5nKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0U3RyZWFtQ29udGV4dFR5cGUoKSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICAgICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2F1ZGlvX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0FVRElPX1NUQVRFX1NUT1BQRUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHggd2hpbGUgc3RyZWFtaW5nLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBSeCBpcyBkaXNjb25uY3RlZC9pbmcgYnV0IG11c2ljIFR4IG9yIFJ4IHN0aWxsIG5vdCBkaXNjb25uZWN0ZWQvaW5nLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtb3ZlIHRvIG9wZW5lZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHgsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5jdGVkL2luZyBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZC9pbmcsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbWFpbiBpbiBzdGFydGVkIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORywgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGlmICgoKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB8fAotICAgICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykpICYmCi0gICAgICAgICAgICAgICAgICAoKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB8fAotICAgICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykpKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgVHgsIG11c2ljIFR4K1J4IGFyZSBkaXNjb25uZWN0ZWQvaW5nIG1vdmUgaW4gY2xvc2luZyBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZyk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgICAgICAgICBidGlmX3JlcG9ydF9hdWRpb19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9BVURJT19TVEFURV9TVE9QUEVELCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgUnggd2hpbGUgc3RyZWFtaW5nLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBUeCBpcyBkaXNjb25uY3RlZC9pbmcgYnV0IG11c2ljIFR4IG9yIFJ4IHN0aWxsIG5vdCBkaXNjb25uZWN0ZWQvaW5nLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtb3ZlIHRvIE9wZW5lZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgVHggaXMgZGlzY29ubmN0ZWQvaW5nIGJ1dCBtdXNpYyBUeCBvciBSeCBzdGlsbCBub3QgZGlzY29ubmVjdGVkL2luZywiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVtYWluIGluIHN0YXJ0ZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HLCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9DT05ORUNUX0VWVDogey8vIGFib3ZlIGV2bnQgY2FuIGNvbWUgYW5kIGhhbmRsZSBmb3Igdm9pY2UvbWVkaWEgY2FzZQotICAgICAgaW50IGNvbnRleHRUeXBlID0gcF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUudHlwZTsKLSAgICAgIExPR19JTkZPKAotICAgICAgICAgIExPR19UQUcsICIlczogUGVlciAlcyA6IGV2ZW50PSVzIGNvbnRleHQ9JWQiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpLCBjb250ZXh0VHlwZSk7Ci0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICBMT0dfVEFHLCAiJXM6IGNvbnRleHQ9JWQsIGNvbnZlcnRlZD0lZCwgU3RyZWFtaW5nIGNvbnRleHQ9JWQiLAotICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGNvbnRleHRUeXBlLCBidGlmX2FjbV9iYXBfdG9fYWNtX2NvbnRleHQoY29udGV4dFR5cGUpLCBwZWVyXy5HZXRTdHJlYW1Db250ZXh0VHlwZSgpKTsKLSAgICAgIGlmIChidGlmX2FjbV9iYXBfdG9fYWNtX2NvbnRleHQoY29udGV4dFR5cGUpICE9IHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkpIHsKLSAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciBNdXNpYyBSeCwgdXBkYXRlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVElORyl7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciBNdXNpYyBSeCwgaWdub3JlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGNvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3IgTXVzaWMgVHgsIHVwZGF0ZSBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RJTkcpewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCBmb3IgTXVzaWMgVHgsIGlnbm9yZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpCi0gICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVELCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlID09IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHZvaWNlIGNvbnRleHQgY29ubmVjdGVkLCByZW1haW4gaW4gc3RhcnRlZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVR4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGNvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgVHgsIHVwZGF0ZSBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwgdXBkYXRlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVELCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCBvciBSeCwgaWdub3JlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCkpIHsKLSAgICAgICAgICBwZWVyXy5DbGVhckZsYWdzKEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdMb2NhbFN1c3BlbmQpOwotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwZWVyIGRldmljZSBpcyBzdXNwZW5kZWQsIHNlbmQgTU0gYW55IHBlbmRpbmcgQUNLIiwgX19mdW5jX18pOwotICAgICAgICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICAgICAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgICAgICBwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQpIHsKLSAgICAgICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgICAgICAgIGJ0aWZfYWNtX29uX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZXBvcnQgU1RPUCB0byBhcHBzIGFuZCBtb3ZlIHRvIE9wZW5lZCIsIF9fZnVuY19fKTsKLSAgICAgICAgICBidGlmX3JlcG9ydF9hdWRpb19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9BVURJT19TVEFURV9TVE9QUEVELCBwZWVyXy5HZXRTdHJlYW1Db250ZXh0VHlwZSgpKTsKLSAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChidGlmX2FjbV9pbml0aWF0b3IuQWNtR3JvdXBQcm9jZWR1cmVUaW1lcigpKSkKLSAgICAgICAgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9ncm91cF9wcm9jZWR1cmVfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRJRl9BQ01fUkVDT05GSUdfUkVRX0VWVDogewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VuZGluZyBzdG9wIHRvIEJBUCBiZWZvcmUgcmVjb25maWd1cmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGJ0aWZfYTJkcF9zb3VyY2VfZW5kX3Nlc3Npb24oYWN0aXZlX2JkYSk7Ci0gICAgICAgIHBlZXJfLlNldEZsYWdzKEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdMb2NhbFN1c3BlbmQpOwotICAgICAgICBTdHJlYW1UeXBlIHR5cGVfMTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gc3RvcF9zdHJlYW1zOwotICAgICAgICBpZiAocGVlcl8uR2V0U3RyZWFtQ29udGV4dFR5cGUoKSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICBpZiAoY3VycmVudF9hY3RpdmVfcHJvZmlsZV90eXBlICE9IFdNQ1ApIHsKLSAgICAgICAgICAgIHR5cGVfMSA9IHsudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgc3RvcF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlXzEgPSB7LnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRSwKLSAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzdG9wX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBlZXJfLkdldFN0cmVhbUNvbnRleHRUeXBlKCkgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKSB7Ci0gICAgICAgICAgU3RyZWFtVHlwZSB0eXBlXzI7Ci0gICAgICAgICAgdHlwZV8xID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgdHlwZV8yID0gey50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICBzdG9wX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMik7Ci0gICAgICAgICAgc3RvcF9zdHJlYW1zLnB1c2hfYmFjayh0eXBlXzEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc1VjYXN0Q2xpZW50SW50ZXJmYWNlKSBicmVhazsKLSAgICAgICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AocGVlcl8uUGVlckFkZHJlc3MoKSwgc3RvcF9zdHJlYW1zKTsKLSAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZVJlY29uZmlndXJpbmcpOwotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9DT05GSUdfRVZUOiB7Ci0gICAgICAgdEJUSUZfQUNNKiBwX2FjbV9kYXRhID0gKHRCVElGX0FDTSopcF9kYXRhOwotICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlID0gcF9hY21fZGF0YS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS50eXBlOwotICAgICAgIHVpbnQxNl90IHBlZXJfbGF0ZW5jeV9tcyA9IDA7Ci0gICAgICAgdWludDMyX3QgcHJlc2VuX2RlbGF5ID0gMDsKLSAgICAgICBib29sIGlzX3VwZGF0ZV9yZXF1aXJlID0gZmFsc2U7Ci0gICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgaWYgKHBfYWNtX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGNvbXBhcmUgY3VycmVudF9tZWRpYV9jb25maWciLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgICAgaXNfdXBkYXRlX3JlcXVpcmUgPSBjb21wYXJlX2NvZGVjX2NvbmZpZ18oY3VycmVudF9tZWRpYV9jb25maWcsIHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZyk7Ci0gICAgICAgICB9IGVsc2UgaWYgKHBfYWNtX2RhdGEtPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfTElWRSkgewotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY2FjaGUgY3VycmVudF9yZWNvcmRpbmdfY29uZmlnIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgIGN1cnJlbnRfcmVjb3JkaW5nX2NvbmZpZyA9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChtYW5kYXRvcnlfY29kZWNfc2VsZWN0ZWQpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IE1hbmRhdG9yeSBjb2RlYyBzZWxlY3RlZCwgZG8gbm90IHN0b3JlIGNvbmZpZyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHN0b3JlIGNvbmZpZ3VyYXRpb24iLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLSAgICAgICAgIH0KLSAgICAgICAgIC8vQ2FjaGUgdGhlIHBlZXIgbGF0ZW5jeSBpbiBXTUNQIGNhc2UKLSAgICAgICAgIGlmIChwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX0xJVkUpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVswXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzBdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsxXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzFdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsyXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzJdKTsKLSAgICAgICAgICAgcHJlc2VuX2RlbGF5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVswXSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocF9hY21fZGF0YS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzFdIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsyXSA8PCAxNik7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwcmVzZW5fZGVsYXkgPSAlZHVzIiwgX19mdW5jX18sIHByZXNlbl9kZWxheSk7Ci0gICAgICAgICAgIHBlZXJfbGF0ZW5jeV9tcyA9IHByZXNlbl9kZWxheS8xMDAwOwotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc190b19tIGxhdGVuY3kgPSAlZG1zIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbV9kYXRhLT5jb25maWdfaW5mby5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tKTsKLSAgICAgICAgICAgcGVlcl9sYXRlbmN5X21zICs9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLnFvc19jb25maWcuY2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX207Ci0gICAgICAgICAgIHBlZXJfLlNldFBlZXJMYXRlbmN5KHBlZXJfbGF0ZW5jeV9tcyk7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYWNoZWQgcGVlciBMYXRlbmN5ID0gJWRtcyIsIF9fZnVuY19fLCBwZWVyXy5HZXRQZWVyTGF0ZW5jeSgpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChpc191cGRhdGVfcmVxdWlyZSkgewotICAgICAgICAgICBjdXJyZW50X21lZGlhX2NvbmZpZyA9IHBfYWNtX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGN1cnJlbnRfbWVkaWFfY29uZmlnLmNvZGVjX3NwZWNpZmljXzM6ICUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQsIF9fZnVuY19fLCBjdXJyZW50X21lZGlhX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zKTsKLSAgICAgICAgICAgYnRpZl9hY21fdXBkYXRlX2xjM3FfcGFyYW1zKCZjdXJyZW50X21lZGlhX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zLCBwX2FjbV9kYXRhKTsKLSAgICAgICAgICAgYnRpZl9hY21fcmVwb3J0X3NvdXJjZV9jb2RlY19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBjdXJyZW50X21lZGlhX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY2FzdF9jb2RlY3NfY2FwYWJpbGl0aWVzLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgfQotICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMICYmCi0gICAgICAgICAgICAgICAgICBwX2FjbV9kYXRhLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjYWNoZSBjdXJyZW50X3ZvaWNlX2NvbmZpZyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotICAgICAgICAgY3VycmVudF92b2ljZV9jb25maWcgPSBwX2FjbV9kYXRhLT5jb25maWdfaW5mby5jb2RlY19jb25maWc7Ci0gICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3VycmVudF92b2ljZV9jb25maWcuY29kZWNfc3BlY2lmaWNfMzogJSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQsIF9fZnVuY19fLCBjdXJyZW50X3ZvaWNlX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zKTsKLSAgICAgICAgIGJ0aWZfYWNtX3VwZGF0ZV9sYzNxX3BhcmFtcygmY3VycmVudF92b2ljZV9jb25maWcuY29kZWNfc3BlY2lmaWNfMywgcF9hY21fZGF0YSk7Ci0gICAgICAgICBidGlmX2FjbV9yZXBvcnRfc291cmNlX2NvZGVjX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIGN1cnJlbnRfdm9pY2VfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNhc3RfY29kZWNzX2NhcGFiaWxpdGllcywgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICB9Ci0gICAgICAvL0hhbmRsZSBCQVAgU1RBUlQgaWYgcmVjb25maWcgY29tZXMgaW4gbWlkIG9mIHN0cmVhbWluZwotICAgICAgLy9wZWVyXy5TZXRTdHJlYW1SZWNvbmZpZ0luZm8ocF9hY20tPmFjbV9yZWNvbmZpZyk7Ci0gICAgICAvL1RPRE86IGxvY2FsIGNhcGFiaWxpdGllcwotICAgICAgLy9Db2RlY0NvbmZpZyByZWNvcmQgPSBwX2J0YV9kYXRhLT5hY21fcmVjb25maWcuY29kZWNfY29uZmlnOwotICAgICAgLy9zYXZpbmcgY29kZWMgY29uZmlnIGFzIG5lZ290aWF0ZWQgcGFyYW1ldGVyIGFzIHRydWUKLSAgICAgIC8vYnRpZl9wYWNzX2FkZF9yZWNvcmQocGVlcl8uUGVlckFkZHJlc3MoKSwgdHJ1ZSwgQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TUkMsICZyZWNvcmQpOwotCi0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9DT05OX1VQREFURV9USU1FT1VUX0VWVDoKLSAgICAgIHBlZXJfLlNldENvbm5VcGRhdGVNb2RlKEJ0aWZBY21QZWVyOjprRmxhZ1JlbGF4ZWRNb2RlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IFBlZXIgJXMgOiBVbmhhbmRsZWQgZXZlbnQ9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVSZWNvbmZpZ3VyaW5nOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBpZihidGlmX2FjbV9pbml0aWF0b3IuSXNDb25uVXBkYXRlRW5hYmxlZCgpKSB7Ci0gICAgLy9DYW5jZWwgdGhlIHRpbWVyIGlmIHJ1bm5pbmcgaWYgIG5vdCwgbW92ZSB0byBhZ2dyZXNzaXZlIG1vZGUKLSAgICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKGJ0aWZfYWNtX2luaXRpYXRvci5BY21Db25uSW50ZXJ2YWxUaW1lcigpKSkgewotICAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfY29ubl9JbnRlcnZhbF90aW1lcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGNvbm4gdGltZXIgbm90IHJ1bm5pbmcsIHB1c2ggYWdncmVzc2l2ZSBpbnRlcnZhbHMiLCBfX2Z1bmNfXyk7Ci0gICAgICAgcGVlcl8uU2V0Q29ublVwZGF0ZU1vZGUoQnRpZkFjbVBlZXI6OmtGbGFnQWdncmVzaXZlTW9kZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVSZWNvbmZpZ3VyaW5nOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLWJvb2wgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVSZWNvbmZpZ3VyaW5nOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICB0QlRJRl9BQ00qIHBfYWNtID0gKHRCVElGX0FDTSopcF9kYXRhOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyA6IGV2ZW50PSVzIGZsYWdzPSVzIG11c2ljX2FjdGl2ZV9wZWVyPSVzIHZvaWNlX2FjdGl2ZV9wZWVyPSVzIiwKLSAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBCdGlmQWNtRXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwZWVyXy5GbGFnc1RvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsb2dib29sKHBlZXJfLklzUGVlckFjdGl2ZUZvck11c2ljKCkpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgbG9nYm9vbChwZWVyXy5Jc1BlZXJBY3RpdmVGb3JWb2ljZSgpKS5jX3N0cigpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0FDTV9TVVNQRU5EX1NUUkVBTV9SRVFfRVZUOgotCi0gICAgY2FzZSBCVEFfQUNNX1NUT1BfRVZUOiB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBTVE9QUElORyBldmVudCBmcm9tIEJBUCwgaWdub3JlIiwgX19mdW5jX18pOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fUkVDT05GSUdfRVZUOiB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCByZWNvbmZpZ3VyaW5nIHN0YXRlIGZyb20gQkFQLCBpZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9DT05GSUdfRVZUOiB7Ci0gICAgICAgdWludDE2X3QgY29udGV4dFR5cGUgPSBwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS50eXBlOwotICAgICAgIHVpbnQxNl90IHBlZXJfbGF0ZW5jeV9tcyA9IDA7Ci0gICAgICAgdWludDMyX3QgcHJlc2VuX2RlbGF5ID0gMDsKLSAgICAgICBib29sIGlzX3VwZGF0ZV9yZXF1aXJlID0gZmFsc2U7Ci0gICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjb21wYXJlIGN1cnJlbnRfbWVkaWFfY29uZmlnIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgIGlzX3VwZGF0ZV9yZXF1aXJlID0gY29tcGFyZV9jb2RlY19jb25maWdfKGN1cnJlbnRfbWVkaWFfY29uZmlnLCBwX2FjbS0+Y29uZmlnX2luZm8uY29kZWNfY29uZmlnKTsKLSAgICAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9PSBDT05URU5UX1RZUEVfTElWRSkgewotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY2FjaGUgY3VycmVudF9yZWNvcmRpbmdfY29uZmlnIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgIGN1cnJlbnRfcmVjb3JkaW5nX2NvbmZpZyA9IHBfYWNtLT5jb25maWdfaW5mby5jb2RlY19jb25maWc7Ci0gICAgICAgICB9Ci0gICAgICAgICAvL0NhY2hlIHRoZSBwZWVyIGxhdGVuY3kgaW4gV01DUCBjYXNlCi0gICAgICAgICBpZiAocGVlcl8uR2V0UmNmZ1Byb2ZpbGVUeXBlKCkgPT0gV01DUCkgewotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcHJlc2VudGF0aW9uIGRlbGF5WzBdID0gJXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzBdKTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbnRhdGlvbiBkZWxheVsxXSA9ICV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY20tPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsxXSk7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwcmVzZW50YXRpb24gZGVsYXlbMl0gPSAleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWNtLT5jb25maWdfaW5mby5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1swXS5wcmVzZW50YXRpb25fZGVsYXlbMl0pOwotICAgICAgICAgICBwcmVzZW5fZGVsYXkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocF9hY20tPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVswXSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocF9hY20tPmNvbmZpZ19pbmZvLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLnByZXNlbnRhdGlvbl9kZWxheVsxXSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihwX2FjbS0+Y29uZmlnX2luZm8ucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0ucHJlc2VudGF0aW9uX2RlbGF5WzJdIDw8IDE2KTsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByZXNlbl9kZWxheSA9ICVkdXMiLCBfX2Z1bmNfXywgcHJlc2VuX2RlbGF5KTsKLSAgICAgICAgICAgcGVlcl9sYXRlbmN5X21zID0gcHJlc2VuX2RlbGF5LzEwMDA7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzX3RvX20gbGF0ZW5jeSA9ICVkbXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWNtLT5jb25maWdfaW5mby5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tKTsKLSAgICAgICAgICAgcGVlcl9sYXRlbmN5X21zICs9IHBfYWNtLT5jb25maWdfaW5mby5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tOwotICAgICAgICAgICBwZWVyXy5TZXRQZWVyTGF0ZW5jeShwZWVyX2xhdGVuY3lfbXMpOwotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY2FjaGVkIHBlZXIgTGF0ZW5jeSA9ICVkbXMiLCBfX2Z1bmNfXywgcGVlcl8uR2V0UGVlckxhdGVuY3koKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoaXNfdXBkYXRlX3JlcXVpcmUpIHsKLSAgICAgICAgICAgY3VycmVudF9tZWRpYV9jb25maWcgPSBwX2FjbS0+Y29uZmlnX2luZm8uY29kZWNfY29uZmlnOwotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3VycmVudF9tZWRpYV9jb25maWcuY29kZWNfc3BlY2lmaWNfMzogJSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSWk2NCwgX19mdW5jX18sIGN1cnJlbnRfbWVkaWFfY29uZmlnLmNvZGVjX3NwZWNpZmljXzMpOwotICAgICAgICAgICBidGlmX2FjbV91cGRhdGVfbGMzcV9wYXJhbXMoJmN1cnJlbnRfbWVkaWFfY29uZmlnLmNvZGVjX3NwZWNpZmljXzMsIHBfYWNtKTsKLSAgICAgICAgICAgYnRpZl9hY21fcmVwb3J0X3NvdXJjZV9jb2RlY19zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBjdXJyZW50X21lZGlhX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY2FzdF9jb2RlY3NfY2FwYWJpbGl0aWVzLCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgfQotICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMKSB7Ci0gICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY2FjaGUgY3VycmVudF92b2ljZV9jb25maWciKTsKLSAgICAgICAgIGN1cnJlbnRfdm9pY2VfY29uZmlnID0gcF9hY20tPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZzsKLSAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjdXJyZW50X3ZvaWNlX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zOiAlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSWk2NCwgX19mdW5jX18sIGN1cnJlbnRfdm9pY2VfY29uZmlnLmNvZGVjX3NwZWNpZmljXzMpOwotICAgICAgICAgYnRpZl9hY21fdXBkYXRlX2xjM3FfcGFyYW1zKCZjdXJyZW50X3ZvaWNlX2NvbmZpZy5jb2RlY19zcGVjaWZpY18zLCBwX2FjbSk7Ci0gICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fQ09OTkVDVF9FVlQ6IHsKLSAgICAgICAgdWludDhfdCBzdGF0dXMgPSAodWludDhfdClwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGU7Ci0gICAgICAgIExPR19JTkZPKAotICAgICAgICAgICAgTE9HX1RBRywgIiVzOiBQZWVyICVzIDogZXZlbnQ9JXMgZmxhZ3M9JXMgc3RhdHVzPSVkIiwKLSAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksIHBlZXJfLkZsYWdzVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgaWYgKHBlZXJfLkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1JlY29uZmlndXJlKSkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBSZWNvbmZpZyBjb21wbGV0ZSwgbW92ZSBpbiBvcGVuZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUmVwb3J0IENhbGwgYXVkaW8gY29uZmlnIHRvIGFwcHM/IG1vdmUgdG8gb3BlbmVkIHdoZW4gYm90aCBWb2ljZSBUeCBhbmQgUnggZG9uZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFR4LCBtb3ZlIGluIG9wZW5lZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6Q09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUmVwb3J0IENhbGwgYXVkaW8gY29uZmlnIHRvIGFwcHM/IG1vdmUgdG8gb3BlbmVkIHdoZW4gYm90aCBWb2ljZSBUeCBhbmQgUnggZG9uZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCBtb3ZlIGluIG9wZW5lZCBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVPcGVuZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocGVlcl8uQ2hlY2tGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nTG9jYWxTdXNwZW5kKSkgewotICAgICAgICAgIHBlZXJfLkNsZWFyRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCk7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHBlZXIgZGV2aWNlIGlzIHN1c3BlbmRlZCwgc2VuZCBNTSBhbnkgcGVuZGluZyBBQ0siLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgICAgICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUdyb3VwUHJvY2VkdXJlVGltZXIoKSkpCi0gICAgICAgICAgICBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2dyb3VwX3Byb2NlZHVyZV90aW1lcihidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKSk7Ci0gICAgICAgICAgYnRpZl9yZXBvcnRfYXVkaW9fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQVVESU9fU1RBVEVfU1RPUFBFRCwgcGVlcl8uR2V0U3RyZWFtQ29udGV4dFR5cGUoKSk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+IHJlY29uZl9zdHJlYW1zOwotICAgICAgICAgIFN0cmVhbVJlY29uZmlnIHJlY29uZl9pbmZvOwotICAgICAgICAgIENvZGVjUW9zQ29uZmlnIGNmZzsKLSAgICAgICAgICByZWNvbmZfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgICAgICAgIC8vIFRPRE8gdG8gY2hhbmdlIGF1ZGlvIGNvbnRleHQgYmFzZWQgb24gdXNlIGNhc2UgKCBtZWRpYSBvciBnYW1pbmcgb3IgTGl2ZSBhdWRpbykKLSAgICAgICAgICBpZiAocGVlcl8uR2V0UmNmZ1Byb2ZpbGVUeXBlKCkgIT0gV01DUCkgewotICAgICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICAgICAgICAgIHJlY29uZl9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFOwotICAgICAgICAgICAgcmVjb25mX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlY29uZl9pbmZvLnJlY29uZl90eXBlID0gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICAgICAgICBjZmcgPSBwZWVyXy5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgICAgICAgcmVjb25mX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjZmcpOwotICAgICAgICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfaW5mbyk7Ci0gICAgICAgICAgcGVlcl8uU2V0RmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1JlY29uZmlndXJlKTsKLSAgICAgICAgICBpZiAoIXNVY2FzdENsaWVudEludGVyZmFjZSkgYnJlYWs7Ci0gICAgICAgICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKHBlZXJfLlBlZXJBZGRyZXNzKCksIHJlY29uZl9zdHJlYW1zKTsKLSAgICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fRElTQ09OTkVDVF9FVlQ6IHsKLSAgICAgIGludCBjb250ZXh0X3R5cGUgPSBwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS50eXBlOwotICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIGlmIChjb250ZXh0X3R5cGUgPT0gQ09OVEVOVF9UWVBFX01FRElBKSB7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJNdXNpY1R4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX01VU0lDKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgTWVkaWEgVHgvUnggZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIgotICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiBWb2ljZSBUeCtSeCAmIE1lZGlhIFJ4L1R4IHdhcyBkaXNjb25uZWN0ZWQsIG1vdmUgaW4gaWRsZSBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIFR4L1J4IGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gZWl0aGVyIFZvaWNlIFR4IG9yIFJ4IG9yIE1lZGlhIFJ4L1R4IGlzIGNvbm5lY3RlZCwgcmVtYWluIGluIHJlY29uZmlndXJpbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4LCBNdXNpYyBUeCAmIFJ4IGFyZSBkaXNjb25uZWN0ZWQgbW92ZSBpbiBpZGxlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5lY3RlZCBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbWFpbiBpbiByZWNvbmZpZ3VyaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKHBlZXJfLlBlZXJBZGRyZXNzKCksIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlck11c2ljVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgUngsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBUeCwgTXVzaWMgVHggJiBSeCBhcmUgZGlzY29ubmVjdGVkIG1vdmUgaW4gaWRsZSBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgUngsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBSeCBpcyBkaXNjb25uZWN0ZWQgYnV0IG11c2ljIFR4IG9yIFJ4IHN0aWxsIG5vdCBkaXNjb25uZWN0ZWQsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZW1haW4gaW4gcmVjb25maWd1cmluZyBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgICAgaWYgKChwZWVyXy5HZXRQZWVyVm9pY2VSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykgJiYKLSAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyVm9pY2VUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykgJiYKLSAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykgJiYKLSAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykpIHsKLSAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIE1lZGlhIFR4L1J4IGRpc2Nvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGVuIFZvaWNlIFR4K1J4IGFuZCBNZWRpYSBSeC9UeCBkaXNjb25uZWN0ZWQvaW5nLCBtb3ZlIGluIGNsb3Npbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVDbG9zaW5nKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgTWVkaWEgVHgvUnggZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoZW4gZWl0aGVyIFZvaWNlIFR4IG9yIFJ4IG9yIE1lZGlhIFJ4L1R4IGlzIGNvbm5lY3RlZCwgcmVtYWluIGluIHJlY29uZmlndXJpbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORyB8fAotICAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJWb2ljZVJ4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HLCBDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICBpZiAoKChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgfHwKLSAgICAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpKSAmJgotICAgICAgICAgICAgICAgICAgKChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgfHwKLSAgICAgICAgICAgICAgICAgIChwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RJTkcpKSkgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4LCBtdXNpYyBUeCtSeCBhcmUgZGlzY29ubmVjdGVkL2luZyBtb3ZlIGluIGNsb3Npbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUNsb3NpbmcpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBUeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5jdGVkL2luZyBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZC9pbmcsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZW1haW4gaW4gcmVjb25maWd1cmluZyBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNUSU5HIHx8Ci0gICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlclZvaWNlVHhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgIGlmICgoKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB8fAotICAgICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykpICYmCi0gICAgICAgICAgICAgICAgICAoKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB8fAotICAgICAgICAgICAgICAgICAgKHBlZXJfLkdldFBlZXJNdXNpY1J4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykpKSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3Rpbmcgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFJ4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgVHgsIG11c2ljIFR4K1J4IGFyZSBkaXNjb25uZWN0ZWQvaW5nIG1vdmUgaW4gY2xvc2luZyBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICBwZWVyXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlQ2xvc2luZyk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHJlY2VpdmVkIGRpc2Nvbm5lY3RlZCBzdGF0ZSBmcm9tIEJBUCBmb3Igdm9pY2UgUngsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2ljZSBUeCBpcyBkaXNjb25uY3RlZC9pbmcgYnV0IG11c2ljIFR4IG9yIFJ4IHN0aWxsIG5vdCBkaXNjb25uZWN0ZWQvaW5nLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVtYWluIGluIHJlY29uZmlndXJpbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUNNX0NPTk5fVVBEQVRFX1RJTUVPVVRfRVZUOgotICAgICAgcGVlcl8uU2V0Q29ublVwZGF0ZU1vZGUoQnRpZkFjbVBlZXI6OmtGbGFnUmVsYXhlZE1vZGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogUGVlciAlcyA6IFVuaGFuZGxlZCBldmVudD0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyXy5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQWNtRXZlbnQ6OkV2ZW50TmFtZShldmVudCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRpZkFjbVN0YXRlTWFjaGluZTo6U3RhdGVDbG9zaW5nOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBpZihidGlmX2FjbV9pbml0aWF0b3IuSXNDb25uVXBkYXRlRW5hYmxlZCgpKSB7Ci0gICAgLy9DYW5jZWwgdGhlIHRpbWVyIGlmIHJ1bm5pbmcgaWYgIG5vdCwgbW92ZSB0byBhZ2dyZXNzaXZlIG1vZGUKLSAgICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKGJ0aWZfYWNtX2luaXRpYXRvci5BY21Db25uSW50ZXJ2YWxUaW1lcigpKSkgewotICAgICAgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9jb25uX0ludGVydmFsX3RpbWVyKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGNvbm4gdGltZXIgbm90IHJ1bm5pbmcsIHB1c2ggYWdncmVzc2l2ZSBpbnRlcnZhbHMiLCBfX2Z1bmNfXyk7Ci0gICAgICBwZWVyXy5TZXRDb25uVXBkYXRlTW9kZShCdGlmQWNtUGVlcjo6a0ZsYWdBZ2dyZXNpdmVNb2RlKTsKLSAgICB9Ci0gIH0KLQotfQotCi12b2lkIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlQ2xvc2luZzo6T25FeGl0KCkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogUGVlciAlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotfQotCi1ib29sIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OlN0YXRlQ2xvc2luZzo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgdEJUSUZfQUNNKiBwX2FjbSA9ICh0QlRJRl9BQ00qKXBfZGF0YTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBlZXIgJXMgOiBldmVudD0lcyBmbGFncz0lcyBtdXNpY19hY3RpdmVfcGVlcj0lcyB2b2ljZV9hY3RpdmVfcGVlcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgcGVlcl8uUGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgQnRpZkFjbUV2ZW50OjpFdmVudE5hbWUoZXZlbnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcGVlcl8uRmxhZ3NUb1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgbG9nYm9vbChwZWVyXy5Jc1BlZXJBY3RpdmVGb3JNdXNpYygpKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIGxvZ2Jvb2wocGVlcl8uSXNQZWVyQWN0aXZlRm9yVm9pY2UoKSkuY19zdHIoKSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVDoKLSAgICBjYXNlIEJUSUZfQUNNX1NUQVJUX1NUUkVBTV9SRVFfRVZUOgotICAgIGNhc2UgQlRBX0FDTV9TVE9QX0VWVDoKLSAgICBjYXNlIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0FDTV9ESVNDT05ORUNUX0VWVDogewotICAgICAgaW50IGNvbnRleHRfdHlwZSA9IHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLnR5cGU7Ci0gICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfTUVESUEpIHsKLSAgICAgICAgICBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU0lOSykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljVHhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNSeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLAotICAgICAgICAgICAgICAgIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgIHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNZWRpYSBUeC9SeCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAiCi0gICAgICAgICAgICAgICAgICAgICAgIiB3aGVuIFZvaWNlIFR4K1J4ICYgTWVkaWEgUngvVHggd2FzIGRpc2Nvbm5lY3RlZCwgbW92ZSBpbiBpZGxlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgTWVkaWEgVHgvUnggZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIgotICAgICAgICAgICAgICAgICAgICAgICIgd2hlbiBlaXRoZXIgVm9pY2UgVHggb3IgUnggb3IgTWVkaWEgUngvVHggaXMgY29ubmVjdGVkLCByZW1haW4gaW4gY2xvc2luZyBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dF90eXBlID09IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCkgewotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgICBpZiAocGVlcl8uR2V0UGVlclZvaWNlUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgYnRpZl9yZXBvcnRfY29ubmVjdGlvbl9zdGF0ZShwZWVyXy5QZWVyQWRkcmVzcygpLCBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJNdXNpY1R4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEICYmCi0gICAgICAgICAgICAgICAgICBwZWVyXy5HZXRQZWVyTXVzaWNSeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFR4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgUngsIE11c2ljIFR4ICYgUnggYXJlIGRpc2Nvbm5lY3RlZCBtb3ZlIGluIGlkbGUgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcGVlcl8uU3RhdGVNYWNoaW5lKCkuVHJhbnNpdGlvblRvKEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUlkbGUpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBkaXNjb25uZWN0ZWQgc3RhdGUgZnJvbSBCQVAgZm9yIHZvaWNlIFR4LCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9pY2UgUnggaXMgZGlzY29ubmVjdGVkIGJ1dCBtdXNpYyBUeCBvciBSeCBzdGlsbCBub3QgZGlzY29ubmVjdGVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVtYWluIGluIGNsb3Npbmcgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NSQykgewotICAgICAgICAgICAgcGVlcl8uU2V0UGVlclZvaWNlUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICAgICAgaWYgKHBlZXJfLkdldFBlZXJWb2ljZVR4U3RhdGUoKSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVwb3J0X2Nvbm5lY3Rpb25fc3RhdGUocGVlcl8uUGVlckFkZHJlc3MoKSwgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTlRFWFRfVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgIGlmIChwZWVyXy5HZXRQZWVyTXVzaWNUeFN0YXRlKCkgPT0gU3RyZWFtU3RhdGU6OkRJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgcGVlcl8uR2V0UGVlck11c2ljUnhTdGF0ZSgpID09IFN0cmVhbVN0YXRlOjpESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFR4LCBNdXNpYyBUeCAmIFJ4IGFyZSBkaXNjb25uZWN0ZWQgbW92ZSBpbiBpZGxlIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgZGlzY29ubmVjdGVkIHN0YXRlIGZyb20gQkFQIGZvciB2b2ljZSBSeCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvaWNlIFJ4IGlzIGRpc2Nvbm5lY3RlZCBidXQgbXVzaWMgVHggb3IgUnggc3RpbGwgbm90IGRpc2Nvbm5lY3RlZCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbWFpbiBpbiBjbG9zaW5nIHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSA9PSBTdHJlYW1TdGF0ZTo6RElTQ09OTkVDVElORykgewotICAgICAgICBpZiAoY29udGV4dF90eXBlID09IENPTlRFTlRfVFlQRV9NRURJQSkgewotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiByZWNlaXZlZCBNdXNpYyBUeCBvciBSeCBkaXNjb25uZWN0aW5nIHN0YXRlIGZyb20gQkFQLCBpZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgaWYgKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9PSBBU0VfRElSRUNUSU9OX1NJTkspCi0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyTXVzaWNUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgZWxzZSBpZiAocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID09IEFTRV9ESVJFQ1RJT05fU1JDKQotICAgICAgICAgICAgcGVlcl8uU2V0UGVlck11c2ljUnhTdGF0ZShwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fc3RhdGUpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRfdHlwZSA9PSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcmVjZWl2ZWQgdm9pY2UgVHggb3IgUnggZGlzY29ubmVjdGluZyBzdGF0ZSBmcm9tIEJBUCwgaWdub3JlIiwgX19mdW5jX18pOwotICAgICAgICAgIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TSU5LKSB7Ci0gICAgICAgICAgICBwZWVyXy5TZXRQZWVyVm9pY2VUeFN0YXRlKHBfYWNtLT5zdGF0ZV9pbmZvLnN0cmVhbV9zdGF0ZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwX2FjbS0+c3RhdGVfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPT0gQVNFX0RJUkVDVElPTl9TUkMpIHsKLSAgICAgICAgICAgIHBlZXJfLlNldFBlZXJWb2ljZVJ4U3RhdGUocF9hY20tPnN0YXRlX2luZm8uc3RyZWFtX3N0YXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9BQ01fQ09OTl9VUERBVEVfVElNRU9VVF9FVlQ6Ci0gICAgICBwZWVyXy5TZXRDb25uVXBkYXRlTW9kZShCdGlmQWNtUGVlcjo6a0ZsYWdSZWxheGVkTW9kZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBQZWVyICVzIDogVW5oYW5kbGVkIGV2ZW50PSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfLlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJ0aWZBY21FdmVudDo6RXZlbnROYW1lKGV2ZW50KS5jX3N0cigpKTsKLSAgICAgIHBlZXJfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBidGlmX2FjbV91cGRhdGVfbGMzcV9wYXJhbXMoaW50NjRfdCogY3MzLCB0QlRJRl9BQ00qIHBfZGF0YSkgewotCi0gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgKiBDUzM6IFJlcyAgfExDM1EtbGVufCBRVEkgIHwgVk1UIHwgVk1MIHwgdmVyL0Zvcl9BbHMgfExDM1Etc3VwcG9ydAotICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICogICAgICAweDAwIHwwQiAgICAgIHwgMDAwQSB8IEZGICB8IDBGICB8IDAxLzAzICAgICAgIHwgMTAKLSAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAqIENTNDogICAgUmVzCi0gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgKiAgICAgMHgwMCwwMCwwMCwwMCwwMCwwMCwwMCwwMAotICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotICBpZiAoR2V0VmVuZG9yTWV0YURhdGFMYzNRUHJlZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAmcF9kYXRhLT5jb25maWdfaW5mby5jb2RlY19jb25maWcpKSB7Ci0gICAgKmNzMyAmPSB+KChpbnQ2NF90KTB4RkYgPDwgKExFX0FVRElPX0NTXzNfMVNUX0JZVEVfSU5ERVggKiA4KSk7Ci0gICAgKmNzMyB8PSAgKChpbnQ2NF90KTB4MTAgPDwgKExFX0FVRElPX0NTXzNfMVNUX0JZVEVfSU5ERVggKiA4KSk7Ci0KLSAgICB1aW50OF90IGxjM3FfdmVyID0gR2V0VmVuZG9yTWV0YURhdGFMYzNRVmVyKCZwX2RhdGEtPmNvbmZpZ19pbmZvLmNvZGVjX2NvbmZpZyk7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGxjM3FfdmVyOiAlZCIsIF9fZnVuY19fLCBsYzNxX3Zlcik7Ci0gICAgKmNzMyAmPSB+KChpbnQ2NF90KTB4RkYgPDwgKExFX0FVRElPX0NTXzNfMk5EX0JZVEVfSU5ERVggKiA4KSk7Ci0gICAgKmNzMyB8PSAgKChpbnQ2NF90KWxjM3FfdmVyIDw8IChMRV9BVURJT19DU18zXzJORF9CWVRFX0lOREVYICogOCkpOwotCi0gICAgLy8qY3MzICY9IH4oKGludDY0X3QpTEVfQVVESU9fTUFTSyk7Ci0gICAgKmNzMyB8PSAgKGludDY0X3QpTEVfQVVESU9fQVZBSUxBQkxFX0xJQ0VOU0VEOwotCi0gICAgKmNzMyAmPSB+KChpbnQ2NF90KTB4RkYgPDwgKExFX0FVRElPX0NTXzNfM1JEX0JZVEVfSU5ERVggKiA4KSk7Ci0gICAgKmNzMyB8PSAgKChpbnQ2NF90KTB4MEYgPDwgKExFX0FVRElPX0NTXzNfM1JEX0JZVEVfSU5ERVggKiA4KSk7Ci0KLSAgICAqY3MzICY9IH4oKGludDY0X3QpMHhGRiA8PCAoTEVfQVVESU9fQ1NfM180VEhfQllURV9JTkRFWCAqIDgpKTsKLSAgICAqY3MzIHw9ICAoKGludDY0X3QpMHhGRiA8PCAoTEVfQVVESU9fQ1NfM180VEhfQllURV9JTkRFWCAqIDgpKTsKLQotICAgICpjczMgJj0gfigoaW50NjRfdCkweEZGRkYgPDwgKExFX0FVRElPX0NTXzNfNVRIX0JZVEVfSU5ERVggKiA4KSk7Ci0gICAgKmNzMyB8PSAgKChpbnQ2NF90KTB4MDAwQSA8PCAoTEVfQVVESU9fQ1NfM181VEhfQllURV9JTkRFWCAqIDgpKTsKLQotICAgICpjczMgJj0gfigoaW50NjRfdCkweEZGIDw8IChMRV9BVURJT19DU18zXzdUSF9CWVRFX0lOREVYICogOCkpOwotICAgICpjczMgfD0gICgoaW50NjRfdCkweDBCIDw8IChMRV9BVURJT19DU18zXzdUSF9CWVRFX0lOREVYICogOCkpOwotCi0gICAgQ29kZWNDb25maWcgdGVtcCA9IHVuaWNhc3RfY29kZWNzX2NhcGFiaWxpdGllcy5iYWNrKCk7Ci0gICAgdW5pY2FzdF9jb2RlY3NfY2FwYWJpbGl0aWVzLnBvcF9iYWNrKCk7Ci0gICAgdGVtcC5jb2RlY19zcGVjaWZpY18zID0gKmNzMzsKLSAgICB1bmljYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMucHVzaF9iYWNrKHRlbXApOwotICB9Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjczM6ICUiIFBSSWk2NCwgX19mdW5jX18sICpjczMpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3MzPSAweCUiIFBSSXg2NCwgX19mdW5jX18sICpjczMpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9jb25uZWN0aW9uX3N0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhY21fY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlLCB1aW50MTZfdCBjb250ZXh0VHlwZSkgewotICBMT0dfSU5GTyhMT0dfVEFHLCAiJXM6IHBlZXJfYWRkcmVzcz0lcyBzdGF0ZT0lZCBjb250ZXh0VHlwZT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBzdGF0ZSwgY29udGV4dFR5cGUpOwotICBpZiAoYnRpZl9hY21faW5pdGlhdG9yLkVuYWJsZWQoKSkgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgQmluZChidGlmX2FjbV9pbml0aWF0b3IuQ2FsbGJhY2tzKCktPmNvbm5lY3Rpb25fc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcywgc3RhdGUsIGNvbnRleHRUeXBlKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfYXVkaW9fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhY21fYXVkaW9fc3RhdGVfdCBzdGF0ZSwgdWludDE2X3QgY29udGV4dFR5cGUpIHsKLSAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBwZWVyX2FkZHJlc3M9JXMgc3RhdGU9JWQgY29udGV4dFR5cGU9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwgc3RhdGUsIGNvbnRleHRUeXBlKTsKLSAgaWYgKGJ0aWZfYWNtX2luaXRpYXRvci5FbmFibGVkKCkpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIEJpbmQoYnRpZl9hY21faW5pdGlhdG9yLkNhbGxiYWNrcygpLT5hdWRpb19zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyZXNzLCBzdGF0ZSwgY29udGV4dFR5cGUpKTsKLSAgfQotfQotCi12b2lkIGJ0aWZfYWNtX3JlcG9ydF9zb3VyY2VfY29kZWNfc3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgIGNvbnN0IENvZGVjQ29uZmlnJiBjb2RlY19jb25maWcsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+JiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiYKLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzLCBpbnQgY29udGV4dFR5cGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHBlZXJfYWRkcmVzcz0lcyBjb250ZXh0VHlwZT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGNvbnRleHRUeXBlKTsKLSAgaWYgKGJ0aWZfYWNtX2luaXRpYXRvci5FbmFibGVkKCkpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIEJpbmQoYnRpZl9hY21faW5pdGlhdG9yLkNhbGxiYWNrcygpLT5hdWRpb19jb25maWdfY2IsIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfY29uZmlnLCBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMsIGNvbnRleHRUeXBlKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hY21faGFuZGxlX2V2dCh1aW50MTZfdCBldmVudCwgY2hhciogcF9wYXJhbSkgewotICBCdGlmQWNtUGVlciogcGVlciA9IG51bGxwdHI7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIkhhbmRsZSB0aGUgQUNNIGV2ZW50ID0gJWQgIiwgZXZlbnQpOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0FDTV9ESVNDT05ORUNUX1JFUV9FVlQ6IHsKLSAgICAgICAgaWYgKHBfcGFyYW0gPT0gTlVMTCkgewotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIHBfcGFyYW0sIGRyb3BwaW5nIGV2ZW50OiAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRCVElGX0FDTV9DT05OX0RJU0MqIHBfYWNtID0gKHRCVElGX0FDTV9DT05OX0RJU0MqKXBfcGFyYW07Ci0gICAgICAgIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZE9yQ3JlYXRlUGVlcihwX2FjbS0+YmRfYWRkcik7Ci0gICAgICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgICAiJXM6IENhbm5vdCBmaW5kIHBlZXIgZm9yIHBlZXJfYWRkcmVzcz0lcyIKLSAgICAgICAgICAgICAgIjogZXZlbnQgZHJvcHBlZDogJWQiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9hY20tPmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJUSUZfVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgICAgICIlczogQlRJRl9BQ01fRElTQ09OTkVDVF9SRVFfRVZUIHBlZXJfYWRkcmVzcz0lcyIKLSAgICAgICAgICAgICAgIjogY29udGV4dFR5cGU9JWQiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9hY20tPmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICBwX2FjbS0+Y29udGV4dFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEJUSUZfQUNNX1NUQVJUX1NUUkVBTV9SRVFfRVZUOgotICAgIGNhc2UgQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVDoKLSAgICBjYXNlIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQ6IHsKLSAgICAgICAgaWYgKHBfcGFyYW0gPT0gTlVMTCkgewotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIHBfcGFyYW0sIGRyb3BwaW5nIGV2ZW50OiAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRCVElGX0FDTV9DT05OX0RJU0MqIHBfYWNtID0gKHRCVElGX0FDTV9DT05OX0RJU0MqKXBfcGFyYW07Ci0gICAgICAgIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZE9yQ3JlYXRlUGVlcihwX2FjbS0+YmRfYWRkcik7Ci0gICAgICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IGZpbmQgcGVlciBmb3IgcGVlcl9hZGRyZXNzPSVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogZXZlbnQgZHJvcHBlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfYWNtLT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgZXZlbnQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVEFfQUNNX0RJU0NPTk5FQ1RfRVZUOgotICAgIGNhc2UgQlRBX0FDTV9DT05ORUNUX0VWVDoKLSAgICBjYXNlIEJUQV9BQ01fU1RBUlRfRVZUOgotICAgIGNhc2UgQlRBX0FDTV9TVE9QX0VWVDoKLSAgICBjYXNlIEJUQV9BQ01fUkVDT05GSUdfRVZUOiB7Ci0gICAgICAgIGlmIChwX3BhcmFtID09IE5VTEwpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBwX3BhcmFtLCBkcm9wcGluZyBldmVudDogJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0QlRBX0FDTV9TVEFURV9JTkZPKiBwX2FjbSA9ICh0QlRBX0FDTV9TVEFURV9JTkZPKilwX3BhcmFtOwotICAgICAgICBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRPckNyZWF0ZVBlZXIocF9hY20tPmJkX2FkZHIpOwotICAgICAgICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IENhbm5vdCBmaW5kIG9yIGNyZWF0ZSBwZWVyIGZvciBwZWVyX2FkZHJlc3M9JXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBldmVudCBkcm9wcGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9hY20tPmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBldmVudCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEJUQV9BQ01fQ09ORklHX0VWVDogewotICAgICAgICBpZiAocF9wYXJhbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgcF9wYXJhbSwgZHJvcHBpbmcgZXZlbnQ6ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdEJUQV9BQ01fQ09ORklHX0lORk8qIHBfYWNtID0gKHRCVEFfQUNNX0NPTkZJR19JTkZPKilwX3BhcmFtOwotICAgICAgICBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKHBfYWNtLT5iZF9hZGRyKTsKLSAgICAgICAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBDYW5ub3QgZmluZCBvciBjcmVhdGUgcGVlciBmb3IgcGVlcl9hZGRyZXNzPSVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogZXZlbnQgZHJvcHBlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfYWNtLT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgZXZlbnQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVElGX0FDTV9SRUNPTkZJR19SRVFfRVZUOiB7Ci0gICAgICAgIGlmIChwX3BhcmFtID09IE5VTEwpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBwX3BhcmFtLCBkcm9wcGluZyBldmVudDogJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0QlRJRl9BQ01fUkVDT05GSUcqIHBfYWNtID0gKHRCVElGX0FDTV9SRUNPTkZJRyopcF9wYXJhbTsKLSAgICAgICAgcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihwX2FjbS0+YmRfYWRkcik7Ci0gICAgICAgIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IGZpbmQgb3IgY3JlYXRlIHBlZXIgZm9yIHBlZXJfYWRkcmVzcz0lcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IGV2ZW50IGRyb3BwZWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2FjbS0+YmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGV2ZW50KTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQUNNX0NPTk5fVVBEQVRFX1RJTUVPVVRfRVZUOiB7Ci0gICAgICAgIGlmIChwX3BhcmFtID09IE5VTEwpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogSW52YWxpZCBwX3BhcmFtLCBkcm9wcGluZyBldmVudDogJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0QlRBX0FDTV9DT05OX1VQREFURV9USU1FT1VUX0lORk8gKiBwX2FjbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVEFfQUNNX0NPTk5fVVBEQVRFX1RJTUVPVVRfSU5GTyAqKXBfcGFyYW07Ci0gICAgICAgIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIocF9hY20tPmJkX2FkZHIpOwotICAgICAgICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IENhbm5vdCBmaW5kIG9yIGNyZWF0ZSBwZWVyIGZvciBwZWVyX2FkZHJlc3M9JXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBldmVudCBkcm9wcGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9hY20tPmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBldmVudCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCJVTkhhbmRsZWQgQUNNIGV2ZW50ID0gJWQgIiwgZXZlbnQpOwotICAgICAgICBicmVhazsKLSAgfQotICBwZWVyLT5TdGF0ZU1hY2hpbmUoKS5Qcm9jZXNzRXZlbnQoZXZlbnQsICh2b2lkKilwX3BhcmFtKTsKLX0KLQotLyoqCi0gKiBQcm9jZXNzIEJUQSBDU0lQIGV2ZW50cy4gVGhlIHByb2Nlc3NpbmcgaXMgZG9uZSBvbiB0aGUgSk5JCi0gKiB0aHJlYWQuCi0gKi8KLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2hhbmRsZV9idGFfY3NpcF9ldmVudCh1aW50MTZfdCBldnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgQnRpZkNzaXBFdmVudCBidGlmX2NzaXBfZXZlbnQoZXZ0LCBwX3BhcmFtLCBzaXplb2YodEJUQV9DU0lQX0RBVEEpKTsKLSAgdEJUQV9DU0lQX0VWVCBldmVudCA9IGJ0aWZfY3NpcF9ldmVudC5FdmVudCgpOwotICB0QlRBX0NTSVBfREFUQSogcF9kYXRhID0gKHRCVEFfQ1NJUF9EQVRBKilidGlmX2NzaXBfZXZlbnQuRGF0YSgpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogZXZlbnQ9JXMiLCBfX2Z1bmNfXywgYnRpZl9jc2lwX2V2ZW50LlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0NTSVBfTE9DS19TVEFUVVNfQ0hBTkdFRF9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfTE9DS19TVEFUVVNfQ0hBTkdFRCYgbG9ja19zdGF0dXNfcGFyYW0gPSBwX2RhdGEtPmxvY2tfc3RhdHVzX3BhcmFtOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGFwcF9pZD0lZCwgc2V0X2lkPSVkLCBzdGF0dXM9JWQgIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGxvY2tfc3RhdHVzX3BhcmFtLmFwcF9pZCwgbG9ja19zdGF0dXNfcGFyYW0uc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICBsb2NrX3N0YXR1c19wYXJhbS5zdGF0dXMpOwotCi0gICAgICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBzZXRfbWVtYmVycyA9bG9ja19zdGF0dXNfcGFyYW0uYWRkcjsKLQotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KXNldF9tZW1iZXJzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBhZGRyZXNzID0lcyIsIF9fZnVuY19fLCBzZXRfbWVtYmVyc1tqXS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgfQotCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogR2V0IGN1cnJlbnQgbG9jayBzdGF0dXM6ICVkICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLkdldEdyb3VwTG9ja1N0YXR1cyhsb2NrX3N0YXR1c19wYXJhbS5zZXRfaWQpKTsKLSAgICAgIGlmIChidGlmX2FjbV9pbml0aWF0b3IuR2V0R3JvdXBMb2NrU3RhdHVzKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCkgPT0gQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNQZW5kaW5nTG9jaykgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbG9jayB3YXMgYXdhaXRlZCBmb3IgdGhpcyBzZXQgIiwgX19mdW5jX18pOwotICAgICAgfQotCi0gICAgICBpZiAoYnRpZl9hY21faW5pdGlhdG9yLkdldEdyb3VwTG9ja1N0YXR1cyhsb2NrX3N0YXR1c19wYXJhbS5zZXRfaWQpID09IEJ0aWZBY21Jbml0aWF0b3I6OmtGbGFnU3RhdHVzUGVuZGluZ1VubG9jaykgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogVW5sb2NrIHdhcyBhd2FpdGVkIGZvciB0aGlzIHNldCAiLCBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0KLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBHZXQgQ1NJUCBhcHAgaWQ6ICVkICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLkdldENzaXBBcHBJZCgpKTsKLSAgICAgIGlmIChidGlmX2FjbV9pbml0aWF0b3IuR2V0Q3NpcEFwcElkKCkgIT0gbG9ja19zdGF0dXNfcGFyYW0uYXBwX2lkKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBhcHAgaWQgbWlzbWF0Y2ggRVJST1IhISEgIiwgX19mdW5jX18pOwotICAgICAgICB0QTJEUF9DVFJMX0NNRCBwZW5kaW5nX2NtZCA9IGJ0aWZfYWhpbV9nZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0gICAgICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwKLSAgICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgICAgYnRpZl9hY21fc291cmNlX29uX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgICAgICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBzd2l0Y2ggKGxvY2tfc3RhdHVzX3BhcmFtLnN0YXR1cykgewotICAgICAgICBjYXNlIExPQ0tfUkVMRUFTRUQ6Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogdW5sb2NrZWQgYXR0ZW1wdCBzdWNjZWVkZWQgIiwgX19mdW5jX18pOwotICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLlNldE9yVXBkYXRlR3JvdXBMb2NrU3RhdHVzKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCwgQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNVbmxvY2tlZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMT0NLX1JFTEVBU0VEX1RJTUVPVVQ6Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcGVlciB1bmxvY2tlZCBkdWUgdG8gdGltZW91dCAiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAvL2luIHRoaXMgY2FzZSBldmFsdWF0ZSB3aGljaCBkZXZpY2UgaGFzIHNlbnQgVE8gYW5kIGhvdyB0byB1c2UgaXQgPwotICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLlNldE9yVXBkYXRlR3JvdXBMb2NrU3RhdHVzKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCwgQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNVbmxvY2tlZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBTExfTE9DS1NfQUNRVUlSRUQ6Ci0gICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3IuU2V0T3JVcGRhdGVHcm91cExvY2tTdGF0dXMobG9ja19zdGF0dXNfcGFyYW0uc2V0X2lkLCBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c0xvY2tlZCk7Ci0gICAgICAgICAgICBidGlmX2FjbV9oYW5kbGVfY3NpcF9zdGF0dXNfbG9ja2VkKGxvY2tfc3RhdHVzX3BhcmFtLmFkZHIsIGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCk7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQWxsIGxvY2tzIGFjcXVpcmVkICIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNPTUVfTE9DS1NfQUNRVUlSRURfUkVBU09OX1RJTUVPVVQ6Ci0gICAgICAgICAgICAvL3Byb2NlZWQgdG8gY29udGludWUgdXNlIGNhc2U7Ci0gICAgICAgIC8qY2FzZSBTT01FX0xPQ0tTX0FDUVVJUkVEX1JFQVNPTl9ESVNDOgotICAgICAgICAgICAgLy9wcm9jZWVkIHRvIGNvbnRpbnVlIHVzZSBjYXNlOwotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGxvY2tlZCBhdHRlbXB0IHN1Y2NlZWRlZCB3aXRoIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIGxvY2tfc3RhdHVzX3BhcmFtLnN0YXR1cyk7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbG9ja2VkIHNldCBtZW1iZXIgY291bnQgPSAlZCwgc2V0c2l6ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIChsb2NrX3N0YXR1c19wYXJhbS5hZGRyKS5zaXplKCksIHNldFNpemUpOwotICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLm11c2ljX2FjdGl2ZV9zZXRfbG9ja2VkX2Rldl9jb3VudF8gKz0gKGxvY2tfc3RhdHVzX3BhcmFtLmFkZHIpLnNpemUoKTsKLSAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvci5sb2NrZWRfZGV2aWNlcy5pbnNlcnQoYnRpZl9hY21faW5pdGlhdG9yLmxvY2tlZF9kZXZpY2VzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja19zdGF0dXNfcGFyYW0uYWRkci5iZWdpbigpLCBsb2NrX3N0YXR1c19wYXJhbS5hZGRyLmVuZCgpKTsKLSAgICAgICAgICAgIGJ0aWZfYWNtX2hhbmRsZV9jc2lwX3N0YXR1c19sb2NrZWQobG9ja19zdGF0dXNfcGFyYW0uYWRkciwgbG9ja19zdGF0dXNfcGFyYW0uc2V0X2lkKTsKLSAgICAgICAgICAgIGlmIChidGlmX2FjbV9pbml0aWF0b3IubXVzaWNfYWN0aXZlX3NldF9sb2NrZWRfZGV2X2NvdW50XyA8IHNldFNpemUpIHsKLSAgICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLlNldE9yVXBkYXRlR3JvdXBMb2NrU3RhdHVzKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCwgQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNTdWJzZXRMb2NrZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgYnRpZl9hY21faW5pdGlhdG9yLlNldE9yVXBkYXRlR3JvdXBMb2NrU3RhdHVzKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCwgQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNMb2NrZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ki8KLSAgICAgICAgY2FzZSBMT0NLX0RFTklFRDogewotICAgICAgICAgICAgLy9wcm9jZWVkIHRvIGRpc2NvbnRpbnVlIHVzZSBjYXNlOwotICAgICAgICAgICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgICAgICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCk7Ci0gICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3IuU2V0T3JVcGRhdGVHcm91cExvY2tTdGF0dXMobG9ja19zdGF0dXNfcGFyYW0uc2V0X2lkLCBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c1VubG9ja2VkKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBJTlZBTElEX1JFUVVFU1RfUEFSQU1TOiB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogaW52YWxpZCBsb2NrIHJlcXVlc3QgIiwgX19mdW5jX18pOwotICAgICAgICAgICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgICAgICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKGxvY2tfc3RhdHVzX3BhcmFtLnNldF9pZCk7Ci0gICAgICAgICAgICBpZiAoYnRpZl9hY21faW5pdGlhdG9yLkdldEdyb3VwTG9ja1N0YXR1cyhsb2NrX3N0YXR1c19wYXJhbS5zZXRfaWQpID09IEJ0aWZBY21Jbml0aWF0b3I6OmtGbGFnU3RhdHVzUGVuZGluZ0xvY2spCi0gICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvci5TZXRPclVwZGF0ZUdyb3VwTG9ja1N0YXR1cyhsb2NrX3N0YXR1c19wYXJhbS5zZXRfaWQsIEJ0aWZBY21Jbml0aWF0b3I6OmtGbGFnU3RhdHVzVW5sb2NrZWQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3IuU2V0T3JVcGRhdGVHcm91cExvY2tTdGF0dXMobG9ja19zdGF0dXNfcGFyYW0uc2V0X2lkLCBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c0xvY2tlZCk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBCVEFfQ1NJUF9TRVRfTUVNQkVSX0ZPVU5EX0VWVDogewotICAgICAgY29uc3QgdEJUQV9TRVRfTUVNQkVSX0ZPVU5EJiBzZXRfbWVtYmVyX3BhcmFtID0gcF9kYXRhLT5zZXRfbWVtYmVyX3BhcmFtOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNldF9pZD0lZCwgdXVpZD0lZCAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHNldF9tZW1iZXJfcGFyYW0uc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgc2V0X21lbWJlcl9wYXJhbS51dWlkKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQ1NJUF9MT0NLX0FWQUlMQUJMRV9FVlQ6IHsKLSAgICAgIGNvbnN0IHRCVEFfTE9DS19BVkFJTEFCTEUmIGxvY2tfYXZhaWxhYmxlX3BhcmFtID0gcF9kYXRhLT5sb2NrX2F2YWlsYWJsZV9wYXJhbTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBhcHBfaWQ9JWQsIHNldF9pZD0lZCAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBsb2NrX2F2YWlsYWJsZV9wYXJhbS5hcHBfaWQsIGxvY2tfYXZhaWxhYmxlX3BhcmFtLnNldF9pZCk7Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9oYW5kbGVfY3NpcF9zdGF0dXNfbG9ja2VkKHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGFkZHIsIHVpbnQ4X3Qgc2V0SWQpIHsKLSAgaWYgKGFkZHIuZW1wdHkoKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiB2ZWN0b3Igc2l6ZSBpcyBlbXB0eSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQ7Ly8gPSBBMkRQX0NUUkxfQ01EX1NUQVJUOy8vVE9ETzogY2hhbmdlIHRvIE5vbmUKLSAgcGVuZGluZ19jbWQgPSAgYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz46Oml0ZXJhdG9yIGl0cjsKLSAgaW50IHJlcSA9IDA7Ci0gIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgcmVxID0gQlRJRl9BQ01fU1RBUlRfU1RSRUFNX1JFUV9FVlQ7Ci0gIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgcmVxID0gQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVDsKLSAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1ApIHsKLSAgICByZXEgPSBCVElGX0FDTV9TVE9QX1NUUkVBTV9SRVFfRVZUOwotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBObyBwZW5kaW5nIGNvbW1hbmQsIGNoZWNrIGlmIHRoaXMgbGlzdCBvZiBwZWVycyBiZWxvbmcgdG8gTXVzaWNBY3RpdmUgc3RyZWFtaW5nIHN0YXJ0ZWQgZ3JvdXAiLCBfX2Z1bmNfXyk7Ci0vL2lmIChidGlmX2FjbV9pbml0aWF0b3IuSXNNdXNpY0FjdGl2ZUdyb3VwU3RhcnRlZCgpICYmIChzZXRJZCA9PSBidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKSkpCi0vL3JlcSA9IEJUSUZfQUNNX1NUQVJUX1NUUkVBTV9SRVFfRVZUOwotICB9Ci0gIGlmIChyZXEpIHsKLSAgICBmb3IgKGl0ciA9IGFkZHIuYmVnaW4oKTsgaXRyICE9IGFkZHIuZW5kKCk7IGl0cisrKSB7Ci0gICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoKml0ciwgc3RhdGljX2Nhc3Q8YnRpZl9hY21fc21fZXZlbnRfdD4ocmVxKSk7Ci0gICAgfQotICB9Ci0vLyAgQnRpZkFjbVBlZXIqIHBlZXJfID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIC8qaWYgKChwZWVyXy5Jc1BlZXJBY3RpdmVGb3JNdXNpYygpIHx8ICFidGlmX2FjbV9zdHJlYW1fc3RhcnRlZF9yZWFkeSgpKSkgewotICAgIC8vIEltbWVkaWF0ZWx5IHN0b3AgdHJhbnNtaXNzaW9uIG9mIGZyYW1lcyB3aGlsZSBzdXNwZW5kIGlzIHBlbmRpbmcKLSAgICBpZiAocmVxID09IEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQpIHsKLSAgICAgIC8vYnRpZl9hY21fb25fc3RvcHBlZChudWxscHRyKTsKLSAgICB9IGVsc2UgaWYgKHJlcSA9PSBCVElGX0FDTV9TVVNQRU5EX1NUUkVBTV9SRVFfRVZUKSB7Ci0gICAgICAvLyBlbnN1cmUgdHggZnJhbWVzIGFyZSBpbW1lZGlhdGVseSBzdXNwZW5kZWQKLSAgICAgIC8vYnRpZl9hY21fc291cmNlX3NldF90eF9mbHVzaCh0cnVlKTsKLSAgICB9Ci0gIH0qLwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfY29ubl9JbnRlcnZhbF90aW1lcihCdGlmQWNtUGVlciogcGVlcikgewotCi0gIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfY29ubl9JbnRlcnZhbF90aW1lcigpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogIiwgX19mdW5jX18pOwotCi0gIGFsYXJtX3NldF9vbl9tbG9vcChidGlmX2FjbV9pbml0aWF0b3IuQWNtQ29ubkludGVydmFsVGltZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgIEJ0aWZBY21Jbml0aWF0b3I6OmtUaW1lb3V0Q29ubkludGVydmFsTXMsCi0gICAgICAgICAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfY29ubl9JbnRlcnZhbF90aW1lcl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwZWVyKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9jb25uX0ludGVydmFsX3RpbWVyKCkgewotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAiLCBfX2Z1bmNfXyk7Ci0gIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUNvbm5JbnRlcnZhbFRpbWVyKCkpKSB7Ci0gICAgYWxhcm1fY2FuY2VsKGJ0aWZfYWNtX2luaXRpYXRvci5BY21Db25uSW50ZXJ2YWxUaW1lcigpKTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2luaXRpYXRvcl9jb25uX0ludGVydmFsX3RpbWVyX3RpbWVvdXQodm9pZCAqZGF0YSkgewotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAiLCBfX2Z1bmNfXyk7Ci0gIEJ0aWZBY21QZWVyICpwZWVyID0gKEJ0aWZBY21QZWVyICopZGF0YTsKLSAgdEJUQV9BQ01fQ09OTl9VUERBVEVfVElNRU9VVF9JTkZPIHBfZGF0YTsKLSAgcF9kYXRhLmJkX2FkZHIgPSBwZWVyLT5QZWVyQWRkcmVzcygpOwotICBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9hY21faGFuZGxlX2V2dCwgQlRBX0FDTV9DT05OX1VQREFURV9USU1FT1VUX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikmcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRCVEFfQUNNX0NPTk5fVVBEQVRFX1RJTUVPVVRfSU5GTyksIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKHVpbnQ4X3Qgc2V0SWQpIHsKLSAgdWludDhfdCAqYXJnID0gTlVMTDsKLSAgYXJnID0gKHVpbnQ4X3QgKikgb3NpX21hbGxvYyhzaXplb2YodWludDhfdCkpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogIiwgX19mdW5jX18pOwotICBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2dyb3VwX3Byb2NlZHVyZV90aW1lcihzZXRJZCk7Ci0KLSAgKmFyZyA9IHNldElkOwotICBhbGFybV9zZXRfb25fbWxvb3AoYnRpZl9hY21faW5pdGlhdG9yLkFjbUdyb3VwUHJvY2VkdXJlVGltZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgIEJ0aWZBY21Jbml0aWF0b3I6OmtUaW1lb3V0QWNtR3JvdXBQcm9jZWR1cmVNcywKLSAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9ncm91cF9wcm9jZWR1cmVfdGltZXJfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgYXJnKTsKLQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2dyb3VwX3Byb2NlZHVyZV90aW1lcih1aW50OF90IHNldElkKSB7Ci0gIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRpZl9hY21faW5pdGlhdG9yLkFjbUdyb3VwUHJvY2VkdXJlVGltZXIoKSkpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogYWNtIGdyb3VwIHByb2NlZHVyZSBhbHJlYWR5IHJ1bm5pbmcgZm9yIHNldElkID0gJWQsIGNhbmNlbCIsIF9fZnVuY19fLCBzZXRJZCk7Ci0gICAgYWxhcm1fY2FuY2VsKGJ0aWZfYWNtX2luaXRpYXRvci5BY21Hcm91cFByb2NlZHVyZVRpbWVyKCkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYWNtX2luaXRpYXRvcl9ncm91cF9wcm9jZWR1cmVfdGltZXJfdGltZW91dCh2b2lkICpkYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiAiLCBfX2Z1bmNfXyk7Ci0gIHRCVEFfQ1NJUF9DU0VUIGNzZXRfaW5mbzsgLy8gbmVlZCB0byBkbyBtZW1zZXQgPwotICBtZW1zZXQoJmNzZXRfaW5mbywgMCwgc2l6ZW9mKHRCVEFfQ1NJUF9DU0VUKSk7Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IHN0cmVhbWluZ19kZXZpY2VzOwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBub25fc3RyZWFtaW5nX2RldmljZXM7Ci0gIHVpbnQ4X3QgKmFyZyA9ICh1aW50OF90KikgZGF0YTsKLSAgaWYgKCFhcmcpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogY29vcmRpbmF0ZSBhcmcgaXMgbnVsbCwgcmV0dXJuIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICB1aW50OF90IHNldElkID0gKmFyZzsKLSAgaWYgKHNldElkID09IElOVkFMSURfU0VUX0lEKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGNvb3JkaW5hdGUgU2V0SWQgaXMgaW52YWxpZCwgcmV0dXJuIiwgX19mdW5jX18pOwotICAgIGlmIChhcmcpIG9zaV9mcmVlKGFyZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY3NldF9pbmZvID0gQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldChzZXRJZCk7Ci0gIGlmIChjc2V0X2luZm8uc2l6ZSA9PSAwKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IENTRVQgaW5mbyBzaXplIGlzIHplcm8sIHJldHVybiIsIF9fZnVuY19fKTsKLSAgICBpZiAoYXJnKSBvc2lfZnJlZShhcmcpOwotICAgIHJldHVybjsKLSAgfQotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPjo6aXRlcmF0b3IgaXRyOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2l6ZSBvZiBzZXQgbWVtYmVycyAlZCIsIF9fZnVuY19fLCAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5zaXplKCkpOwotICBpZiAoKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpID4gMCkgewotICAgIGZvciAoaXRyID0oY3NldF9pbmZvLnNldF9tZW1iZXJzKS5iZWdpbigpOyBpdHIgIT0gKGNzZXRfaW5mby5zZXRfbWVtYmVycykuZW5kKCk7IGl0cisrKSB7Ci0gICAgICAvL0JUSUZfVFJBQ0VfREVCVUcoIiVzOiBhZGRyZXNzID0gJXMiLCBfX2Z1bmNfXywgaXRyLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgQnRpZkFjbVBlZXIqIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIoKml0cik7Ci0gICAgICBpZiAoKHBlZXIgPT0gbnVsbHB0cikgfHwgKHBlZXIgIT0gbnVsbHB0ciAmJiAhcGVlci0+SXNTdHJlYW1pbmcoKSkpIHsKLSAgICAgICAgbm9uX3N0cmVhbWluZ19kZXZpY2VzLnB1c2hfYmFjaygqaXRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmVhbWluZ19kZXZpY2VzLnB1c2hfYmFjaygqaXRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoc3RyZWFtaW5nX2RldmljZXMuc2l6ZSgpID4gMCkgewotICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgIH0KLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogR2V0IG11c2ljIGFjdGl2ZSBzZXRpZDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgICBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfbG9ja19yZWxlYXNlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgICBpZiAoc3RyZWFtaW5nX2RldmljZXMuc2l6ZSgpIDwgKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpKSB7Ci0gICAgICAvLyB0aGlzIGNhc2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggbW9ubyBtb2RlIHNpbmNlIGFsbCBzZXQgbWVtYmVycyBhcmUgbm90IHN0cmVhbWluZwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0QTJEUF9DVFJMX0NNRCBwZW5kaW5nX2NtZCA9IGJ0aWZfYWhpbV9nZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0gICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgIHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgewotICAgICAgYnRpZl9hY21fc291cmNlX29uX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgYnRpZl9hY21fb25fc3RhcnRlZChBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobm9uX3N0cmVhbWluZ19kZXZpY2VzLnNpemUoKSA+IDApIC8vZG8gd2UgbmVlZCB0byB1bmxvY2sgYW5kIHRoZW4gZGlzY29ubmVjdCA/PwotICAgLy8gbGVfQWNsX2Rpc2Nvbm5lY3QgKG5vbl9zdHJlYW1pbmdfZGV2aWNlcyk7Ci0KLSAgaWYgKGFyZykgb3NpX2ZyZWUoYXJnKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hY21fY2hlY2tfYW5kX3N0YXJ0X2xvY2tfcmVsZWFzZV90aW1lcih1aW50OF90IHNldElkKSB7Ci0gIHVpbnQ4X3QgKmFyZyA9IE5VTEw7Ci0gIGFyZyA9ICh1aW50OF90ICopIG9zaV9tYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpKTsKLQotICBidGlmX2FjbV9jaGVja19hbmRfY2FuY2VsX2xvY2tfcmVsZWFzZV90aW1lcihzZXRJZCk7Ci0KLSAgKmFyZyA9IHNldElkOwotICBhbGFybV9zZXRfb25fbWxvb3AoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljU2V0TG9ja1JlbGVhc2VUaW1lcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkFjbVBlZXI6OmtUaW1lb3V0TG9ja1JlbGVhc2VNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9sb2NrX3JlbGVhc2VfdGltZXJfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgYXJnKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hY21fY2hlY2tfYW5kX2NhbmNlbF9sb2NrX3JlbGVhc2VfdGltZXIodWludDhfdCBzZXRJZCkgewotICBpZiAoYWxhcm1faXNfc2NoZWR1bGVkKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY1NldExvY2tSZWxlYXNlVGltZXIoKSkpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogbG9jayByZWxlYXNlIGFscmVhZHkgcnVubmluZyBmb3Igc2V0SWQgPSAlZCwgY2FuY2VsICIsIF9fZnVuY19fLCBzZXRJZCk7Ci0gICAgYWxhcm1fY2FuY2VsKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY1NldExvY2tSZWxlYXNlVGltZXIoKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9hY21faW5pdGlhdG9yX2xvY2tfcmVsZWFzZV90aW1lcl90aW1lb3V0KHZvaWQgKmRhdGEpIHsKLSAgdWludDhfdCAqYXJnID0gKHVpbnQ4X3QqKSBkYXRhOwotICBpZiAoIWFyZykgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBjb29yZGluYXRlIGFyZyBpcyBudWxsLCByZXR1cm4iLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQ4X3Qgc2V0SWQgPSAqYXJnOwotICBpZiAoc2V0SWQgPT0gSU5WQUxJRF9TRVRfSUQpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogY29vcmRpbmF0ZSBTZXRJZCBpcyBpbnZhbGlkLCByZXR1cm4iLCBfX2Z1bmNfXyk7Ci0gICAgaWYgKGFyZykgb3NpX2ZyZWUoYXJnKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKChidGlmX2FjbV9pbml0aWF0b3IuR2V0R3JvdXBMb2NrU3RhdHVzKHNldElkKSAhPSBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c0xvY2tlZCkgfHwKLSAgICAgIChidGlmX2FjbV9pbml0aWF0b3IuR2V0R3JvdXBMb2NrU3RhdHVzKHNldElkKSAhPSBCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c1N1YnNldExvY2tlZCkpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogU2V0SWQgPSAlZCBMb2NrIFN0YXR1cyA9ICVkIHJldHVybmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHNldElkLCBidGlmX2FjbV9pbml0aWF0b3IuR2V0R3JvdXBMb2NrU3RhdHVzKHNldElkKSk7Ci0gICAgaWYgKGFyZykgb3NpX2ZyZWUoYXJnKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFidGlmX2FjbV9yZXF1ZXN0X2NzaXBfdW5sb2NrKHNldElkKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBlcnJvciB1bmxvY2tpbmciLCBfX2Z1bmNfXyk7Ci0gIH0KLSAgaWYgKGFyZykgb3NpX2ZyZWUoYXJnKTsKLX0KLQotc3RhdGljIHZvaWQgYnRhX2NzaXBfY2FsbGJhY2sodEJUQV9DU0lQX0VWVCBldmVudCwgdEJUQV9DU0lQX0RBVEEqIHBfZGF0YSkgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogZXZlbnQ6ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfYWNtX2hhbmRsZV9idGFfY3NpcF9ldmVudCwgZXZlbnQsIChjaGFyKilwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEJUQV9DU0lQX0RBVEEpLCBOVUxMKTsKLX0KLQotLy8gSW5pdGlhbGl6ZXMgdGhlIEFDTSBpbnRlcmZhY2UgZm9yIGluaXRpYXRvciBtb2RlCi1zdGF0aWMgYnRfc3RhdHVzX3QgaW5pdF9hY21faW5pdGlhdG9yKAotICAgIGJ0YWNtX2luaXRpYXRvcl9jYWxsYmFja3NfdCogY2FsbGJhY2tzLCBpbnQgbWF4X2Nvbm5lY3RlZF9hY2NlcHRvcnMsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+JiBjb2RlY19wcmlvcml0aWVzKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYnRpZl9hY21faW5pdGlhdG9yLkluaXQoY2FsbGJhY2tzLCBtYXhfY29ubmVjdGVkX2FjY2VwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3ByaW9yaXRpZXMpOwotfQotCi0vLyBFc3RhYmxpc2hlcyB0aGUgQkFQIGNvbm5lY3Rpb24gd2l0aCB0aGUgcmVtb3RlIGFjY2VwdG9yIGRldmljZQotc3RhdGljIHZvaWQgY29ubmVjdF9pbnQodWludDE2X3QgdXVpZCwgY2hhciogcF9wYXJhbSkgewotICAgIHRCVElGX0FDTV9DT05OX0RJU0MgY29ubmVjdGlvbjsKLSAgICBtZW1zZXQoJmNvbm5lY3Rpb24sIDAsIHNpemVvZih0QlRJRl9BQ01fQ09OTl9ESVNDKSk7Ci0gICAgbWVtY3B5KCZjb25uZWN0aW9uLCBwX3BhcmFtLCBzaXplb2YoY29ubmVjdGlvbikpOwotICAgIFJhd0FkZHJlc3MgcGVlcl9hZGRyZXNzID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gbnVsbHB0cjsKLSAgICBwZWVyX2FkZHJlc3MgPSBjb25uZWN0aW9uLmJkX2FkZHI7Ci0gICAgaWYgKHV1aWQgPT0gQUNNX1VVSUQpIHsKLSAgICAgIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZE9yQ3JlYXRlUGVlcihwZWVyX2FkZHJlc3MpOwotICAgIH0KLSAgICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcGVlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwZWVyLT5TZXRDb250ZXh0VHlwZShjb25uZWN0aW9uLmNvbnRleHRUeXBlKTsKLSAgICBwZWVyLT5TZXRQcm9maWxlVHlwZShjb25uZWN0aW9uLnByb2ZpbGVUeXBlKTsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3VtbXVsYXRpdmVfcHJvZmlsZV90eXBlICVkIiwgX19mdW5jX18sIHBlZXItPkdldFByb2ZpbGVUeXBlKCkpOwotICAgIC8vcGVlci0+U2V0UHJlZkNvbnRleHRUeXBlKHByZWZlcnJlZENvbnRleHQpOwotICAgIHBlZXItPlN0YXRlTWFjaGluZSgpLlByb2Nlc3NFdmVudChCVElGX0FDTV9DT05ORUNUX1JFUV9FVlQsICZjb25uZWN0aW9uKTsKLX0KLQotLy8gU2V0IHRoZSBhY3RpdmUgcGVlciBmb3IgY29udGV4dHR5cGUKLXN0YXRpYyB2b2lkIHNldF9hY21fYWN0aXZlX3BlZXJfaW50KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlLCB1aW50MTZfdCBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2UpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHBlZXJfYWRkcmVzcz0lcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgaWYgKHBlZXJfYWRkcmVzcy5Jc0VtcHR5KCkpIHsKLSAgICBpbnQgc2V0aWQgPSBJTlZBTElEX1NFVF9JRDsKLSAgICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKQotICAgICAgc2V0aWQgPSBidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKTsKLSAgICBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpCi0gICAgICBzZXRpZCA9IGJ0aWZfYWNtX2luaXRpYXRvci5Wb2ljZUFjdGl2ZUNTZXRJZCgpOwotCi0gICAgaWYgKHNldGlkIDwgSU5WQUxJRF9TRVRfSUQpIHsKLSAgICAgIHRCVEFfQ1NJUF9DU0VUIGNzZXRfaW5mbzsKLSAgICAgIG1lbXNldCgmY3NldF9pbmZvLCAwLCBzaXplb2YodEJUQV9DU0lQX0NTRVQpKTsKLSAgICAgIGNzZXRfaW5mbyA9IEJUQV9Dc2lwR2V0Q29vcmRpbmF0ZWRTZXQoc2V0aWQpOwotICAgICAgaWYgKGNzZXRfaW5mby5zaXplICE9IDApIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz46Oml0ZXJhdG9yIGl0cjsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNpemUgb2Ygc2V0IG1lbWJlcnMgJWQiLCBfX2Z1bmNfXywgKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpKTsKLSAgICAgICAgaWYgKChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICBmb3IgKGl0ciA9KGNzZXRfaW5mby5zZXRfbWVtYmVycykuYmVnaW4oKTsgaXRyICE9IChjc2V0X2luZm8uc2V0X21lbWJlcnMpLmVuZCgpOyBpdHIrKykgewotICAgICAgICAgICAgQnRpZkFjbVBlZXIqIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIoKml0cik7Ci0gICAgICAgICAgICBpZiAocGVlciAhPSBudWxscHRyICYmIHBlZXItPklzU3RyZWFtaW5nKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGNvbnRleHRUeXBlID09IHBlZXItPkdldFN0cmVhbUNvbnRleHRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwZWVyIGlzIHN0cmVhbWluZyAlcyAiLCBfX2Z1bmNfXywgcGVlci0+UGVlckFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoKml0ciwgQlRJRl9BQ01fU1RPUF9TVFJFQU1fUkVRX0VWVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZXQgYWN0aXZlIGZvciB0d20gZGV2aWNlICIsIF9fZnVuY19fKTsKLSAgICAgIEJ0aWZBY21QZWVyKiBwZWVyID0gbnVsbHB0cjsKLSAgICAgIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpCi0gICAgICAgIHBlZXIgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlUGVlcigpKTsKLSAgICAgIGVsc2UgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9WT0lDRSkKLSAgICAgICAgcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihidGlmX2FjbV9pbml0aWF0b3IuVm9pY2VBY3RpdmVQZWVyKCkpOwotICAgICAgaWYgKHBlZXIgIT0gbnVsbHB0ciAmJiBwZWVyLT5Jc1N0cmVhbWluZygpICYmCi0gICAgICAgICAgICAgIChjb250ZXh0VHlwZSA9PSBwZWVyLT5HZXRTdHJlYW1Db250ZXh0VHlwZSgpKSkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcGVlciBpcyBzdHJlYW1pbmcgJXMgIiwgX19mdW5jX18sIHBlZXItPlBlZXJBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IENPTlRFWFRfVFlQRV9NVVNJQykKLSAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlUGVlcigpLCBCVElGX0FDTV9TVE9QX1NUUkVBTV9SRVFfRVZUKTsKLSAgICAgICAgZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX1ZPSUNFKQotICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9kaXNwYXRjaF9zbV9ldmVudChidGlmX2FjbV9pbml0aWF0b3IuVm9pY2VBY3RpdmVQZWVyKCksIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoIWJ0aWZfYWNtX2luaXRpYXRvci5TZXRBY21BY3RpdmVQZWVyKHBlZXJfYWRkcmVzcywgY29udGV4dFR5cGUsIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKSkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBFcnJvciBzZXR0aW5nICVzIGFzIGFjdGl2ZSBwZWVyIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgY29ubmVjdF9hY21faW5pdGlhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dFR5cGUsIHVpbnQxNl90IHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcmVmZXJyZWRDb250ZXh0KSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBQZWVyICVzIGNvbnRleHRUeXBlPSVkIHByb2ZpbGVUeXBlPSVkIHByZWZlcnJlZENvbnRleHQ9JWQiLCBfX2Z1bmNfXywKLSAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBjb250ZXh0VHlwZSwgcHJvZmlsZVR5cGUsIHByZWZlcnJlZENvbnRleHQpOwotCi0gIGlmICghYnRpZl9hY21faW5pdGlhdG9yLkVuYWJsZWQoKSkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IEJUSUYgQUNNIEluaXRpYXRvciBpcyBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIHRCVElGX0FDTV9DT05OX0RJU0MgY29ubjsKLSAgY29ubi5jb250ZXh0VHlwZSA9IGNvbnRleHRUeXBlOwotICBjb25uLnByb2ZpbGVUeXBlID0gcHJvZmlsZVR5cGU7Ci0gIGNvbm4uYmRfYWRkciA9IHBlZXJfYWRkcmVzczsKLSAgcmV0dXJuIGJ0aWZfdHJhbnNmZXJfY29udGV4dChjb25uZWN0X2ludCwgQUNNX1VVSUQsIChjaGFyKikmY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodEJUSUZfQUNNX0NPTk5fRElTQyksIE5VTEwpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgZGlzY29ubmVjdF9hY21faW5pdGlhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dFR5cGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IFBlZXIgJXMgY29udGV4dFR5cGU9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGNvbnRleHRUeXBlKTsKLQotICBpZiAoIWJ0aWZfYWNtX2luaXRpYXRvci5FbmFibGVkKCkpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVElGIEFDTSBJbml0aWF0b3IgaXMgbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLQotICBCdGlmQWNtUGVlciogcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kT3JDcmVhdGVQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwZWVyID09IG51bGxwdHIpIHsKLSAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogcGVlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotCi0gIHRCVElGX0FDTV9DT05OX0RJU0MgZGlzYzsKLSAgcGVlci0+UmVzZXRDb250ZXh0VHlwZShjb250ZXh0VHlwZSk7Ci0gIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICBwZWVyLT5SZXNldFByb2ZpbGVUeXBlKEJBUHxHQ1B8V01DUCk7Ci0gICAgZGlzYy5wcm9maWxlVHlwZSA9IEJBUHxHQ1B8V01DUDsKLSAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICBwZWVyLT5SZXNldFByb2ZpbGVUeXBlKEJBUF9DQUxMKTsKLSAgICBkaXNjLnByb2ZpbGVUeXBlID0gQkFQX0NBTEw7Ci0gIH0gZWxzZSBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDX1ZPSUNFKSB7Ci0gICAgcGVlci0+UmVzZXRQcm9maWxlVHlwZShCQVB8R0NQfFdNQ1B8QkFQX0NBTEwpOwotICAgIGRpc2MucHJvZmlsZVR5cGUgPSBCQVB8R0NQfFdNQ1B8QkFQX0NBTEw7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGN1bW11bGF0aXZlX3Byb2ZpbGVfdHlwZSAlZCIsIF9fZnVuY19fLCBwZWVyLT5HZXRQcm9maWxlVHlwZSgpKTsKLQotICBkaXNjLmJkX2FkZHIgPSBwZWVyX2FkZHJlc3M7Ci0gIGRpc2MuY29udGV4dFR5cGUgPSBjb250ZXh0VHlwZTsKLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfYWNtX2hhbmRsZV9ldnQsIEJUSUZfQUNNX0RJU0NPTk5FQ1RfUkVRX0VWVCwgKGNoYXIqKSZkaXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRCVElGX0FDTV9DT05OX0RJU0MpLCBOVUxMKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2V0X2FjdGl2ZV9hY21faW5pdGlhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZmlsZVR5cGUpIHsKLSAgdWludDE2X3QgY29udGV4dFR5cGUgPSBDT05URVhUX1RZUEVfTVVTSUM7Ci0gIGlmIChwcm9maWxlVHlwZSA9PSBCQVAgfHwgcHJvZmlsZVR5cGUgPT0gR0NQIHx8IHByb2ZpbGVUeXBlID09IFdNQ1ApCi0gICAgY29udGV4dFR5cGUgPSBDT05URVhUX1RZUEVfTVVTSUM7Ci0gIGVsc2UgaWYgKHByb2ZpbGVUeXBlID09IEJBUF9DQUxMKQotICAgIGNvbnRleHRUeXBlID0gQ09OVEVYVF9UWVBFX1ZPSUNFOwotCi0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBQZWVyICVzIGNvbnRleHRUeXBlPSVkIHByb2ZpbGVUeXBlPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGNvbnRleHRUeXBlLCBwcm9maWxlVHlwZSk7Ci0gIGlmICghYnRpZl9hY21faW5pdGlhdG9yLkVuYWJsZWQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFDTSBJbml0aWF0b3IgaXMgbm90IGVuYWJsZWQiOwotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICB9Ci0KLSAgQnRpZkFjbVBlZXIqIHBlZXIgPSBudWxscHRyOwotICBpZiAoY29udGV4dFR5cGUgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVQZWVyKCkpOwotICAgIGlmICgocGVlciAhPSBudWxscHRyKSAmJiAocGVlci0+R2V0U3RyZWFtQ29udGV4dFR5cGUoKSA9PSBDT05URVhUX1RZUEVfTVVTSUMpICYmCi0gICAgICAgIChwZWVyLT5DaGVja0ZsYWdzKEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdTdGFydCB8IEJ0aWZBY21QZWVyOjprRmxhZ1BlbmRpbmdMb2NhbFN1c3BlbmQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nUmVjb25maWd1cmUpKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEFjdGl2ZSBtdXNpYyBkZXZpY2UgaXMgcGVuZGluZyBzdGFydCBvciBzdXNwZW5kIG9yIHJlY29uZmlnIjsKLSAgICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICAgIH0KLSAgfSBlbHNlIGlmIChjb250ZXh0VHlwZSA9PSBDT05URVhUX1RZUEVfVk9JQ0UpIHsKLSAgICBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGJ0aWZfYWNtX2luaXRpYXRvci5Wb2ljZUFjdGl2ZVBlZXIoKSk7Ci0gICAgaWYgKChwZWVyICE9IG51bGxwdHIpICYmIChwZWVyLT5HZXRTdHJlYW1Db250ZXh0VHlwZSgpID09IENPTlRFWFRfVFlQRV9WT0lDRSkgJiYKLSAgICAgICAgKHBlZXItPkNoZWNrRmxhZ3MoQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ1N0YXJ0IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQnRpZkFjbVBlZXI6OmtGbGFnUGVuZGluZ0xvY2FsU3VzcGVuZCkpKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQWN0aXZlIHZvaWNlIGRldmljZSBpcyBwZW5kaW5nIHN0YXJ0IG9yIHN1c3BlbmQiOwotICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gICAgfQotICB9Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwZWVyX3JlYWR5X3Byb21pc2U7Ci0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IHBlZXJfcmVhZHlfZnV0dXJlID0gcGVlcl9yZWFkeV9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgc2V0X2FjbV9hY3RpdmVfcGVlcl9pbnQocGVlcl9hZGRyZXNzLCBjb250ZXh0VHlwZSwgcHJvZmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZWVyX3JlYWR5X3Byb21pc2UpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc3RhcnRfc3RyZWFtX2FjbV9pbml0aWF0b3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlKSB7Ci0gIExPR19JTkZPKExPR19UQUcsICIlczogUGVlciAlcyIsIF9fZnVuY19fLCBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBpZiAoIWJ0aWZfYWNtX2luaXRpYXRvci5FbmFibGVkKCkpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBCVElGIEFDTSBJbml0aWF0b3IgaXMgbm90IGVuYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLSAgaW50IGlkID0gYnRpZl9hY21faW5pdGlhdG9yLlZvaWNlQWN0aXZlQ1NldElkKCk7Ci0gIGlmIChpZCA8IElOVkFMSURfU0VUX0lEKSB7Ci0gICAgdEJUQV9DU0lQX0NTRVQgY3NldF9pbmZvOwotICAgIG1lbXNldCgmY3NldF9pbmZvLCAwLCBzaXplb2YodEJUQV9DU0lQX0NTRVQpKTsKLSAgICBjc2V0X2luZm8gPSBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0KGlkKTsKLSAgICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPjo6aXRlcmF0b3IgaXRyOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzaXplIG9mIHNldCBtZW1iZXJzICVkIiwgX19mdW5jX18sIChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSk7Ci0gICAgaWYgKChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSA+IDApIHsKLSAgICAgIGZvciAoaXRyID0oY3NldF9pbmZvLnNldF9tZW1iZXJzKS5iZWdpbigpOyBpdHIgIT0gKGNzZXRfaW5mby5zZXRfbWVtYmVycykuZW5kKCk7IGl0cisrKSB7Ci0gICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogU2VuZGluZyBzdGFydCByZXF1ZXN0ICIsIF9fZnVuY19fKTsKLSAgICAgICAgIEJ0aWZBY21QZWVyKiBwID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKCppdHIpOwotICAgICAgICAgaWYgKHAgJiYgcC0+SXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICBwLT5TZXRTdHJlYW1Db250ZXh0VHlwZShjb250ZXh0VHlwZSk7Ci0gICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9kaXNwYXRjaF9zbV9ldmVudCgqaXRyLCBCVElGX0FDTV9TVEFSVF9TVFJFQU1fUkVRX0VWVCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9ncm91cF9wcm9jZWR1cmVfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLlZvaWNlQWN0aXZlQ1NldElkKCkpOwotICB9IGVsc2UgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBTZW5kaW5nIHN0YXJ0IHRvIHR3bSBkZXZpY2UgIiwgX19mdW5jX18pOwotICAgIEJ0aWZBY21QZWVyKiBwID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGJ0aWZfYWNtX2luaXRpYXRvci5Wb2ljZUFjdGl2ZVBlZXIoKSk7Ci0gICAgaWYgKHAgIT0gbnVsbHB0ciAmJiBwLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICBwLT5TZXRTdHJlYW1Db250ZXh0VHlwZShDT05URVhUX1RZUEVfVk9JQ0UpOwotICAgICAgYnRpZl9hY21faW5pdGlhdG9yX2Rpc3BhdGNoX3NtX2V2ZW50KGJ0aWZfYWNtX2luaXRpYXRvci5Wb2ljZUFjdGl2ZVBlZXIoKSwgQlRJRl9BQ01fU1RBUlRfU1RSRUFNX1JFUV9FVlQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogVW5hYmxlIHRvIHNlbmQgc3RhcnQgdG8gdHdtIGRldmljZSAiLCBfX2Z1bmNfXyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHN0b3Bfc3RyZWFtX2FjbV9pbml0aWF0b3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dFR5cGUpIHsKLSAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBQZWVyICVzIiwgX19mdW5jX18sIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmICghYnRpZl9hY21faW5pdGlhdG9yLkVuYWJsZWQoKSkgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IEJUSUYgQUNNIEluaXRpYXRvciBpcyBub3QgZW5hYmxlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGludCBpZCA9IGJ0aWZfYWNtX2luaXRpYXRvci5Wb2ljZUFjdGl2ZUNTZXRJZCgpOwotICBpZiAoaWQgPCBJTlZBTElEX1NFVF9JRCkgewotICAgIHRCVEFfQ1NJUF9DU0VUIGNzZXRfaW5mbzsKLSAgICBtZW1zZXQoJmNzZXRfaW5mbywgMCwgc2l6ZW9mKHRCVEFfQ1NJUF9DU0VUKSk7Ci0gICAgY3NldF9pbmZvID0gQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldChpZCk7Ci0gICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz46Oml0ZXJhdG9yIGl0cjsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2l6ZSBvZiBzZXQgbWVtYmVycyAlZCIsIF9fZnVuY19fLCAoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5zaXplKCkpOwotICAgIGlmICgoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5zaXplKCkgPiAwKSB7Ci0gICAgICBmb3IgKGl0ciA9KGNzZXRfaW5mby5zZXRfbWVtYmVycykuYmVnaW4oKTsgaXRyICE9IChjc2V0X2luZm8uc2V0X21lbWJlcnMpLmVuZCgpOyBpdHIrKykgewotICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFNlbmRpbmcgc3RvcCByZXF1ZXN0ICIsIF9fZnVuY19fKTsKLSAgICAgICAgIEJ0aWZBY21QZWVyKiBwID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKCppdHIpOwotICAgICAgICAgaWYgKHAgJiYgcC0+SXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICBwLT5TZXRTdHJlYW1Db250ZXh0VHlwZShjb250ZXh0VHlwZSk7Ci0gICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9kaXNwYXRjaF9zbV9ldmVudCgqaXRyLCBCVElGX0FDTV9TVE9QX1NUUkVBTV9SRVFfRVZUKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYnRpZl9hY21fY2hlY2tfYW5kX3N0YXJ0X2dyb3VwX3Byb2NlZHVyZV90aW1lcihidGlmX2FjbV9pbml0aWF0b3IuVm9pY2VBY3RpdmVDU2V0SWQoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFNlbmRpbmcgc3RvcCB0byB0d20gZGV2aWNlICIsIF9fZnVuY19fKTsKLSAgICBCdGlmQWNtUGVlciogcCA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihidGlmX2FjbV9pbml0aWF0b3IuVm9pY2VBY3RpdmVQZWVyKCkpOwotICAgIGlmIChwICE9IG51bGxwdHIgJiYgcC0+SXNDb25uZWN0ZWQoKSkgewotICAgICAgcC0+U2V0U3RyZWFtQ29udGV4dFR5cGUoQ09OVEVYVF9UWVBFX1ZPSUNFKTsKLSAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9kaXNwYXRjaF9zbV9ldmVudChidGlmX2FjbV9pbml0aWF0b3IuVm9pY2VBY3RpdmVQZWVyKCksIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogVW5hYmxlIHRvIHNlbmQgc3RvcCB0byB0d20gZGV2aWNlICIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgY29kZWNfY29uZmlnX2FjbV9pbml0aWF0b3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gY29kZWNfcHJlZmVyZW5jZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlLCB1aW50MTZfdCBwcm9maWxlVHlwZSkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoIWJ0aWZfYWNtX2luaXRpYXRvci5FbmFibGVkKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQlRJRiBBQ00gSW5pdGlhdG9yIGlzIG5vdCBlbmFibGVkIjsKLSAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgfQotCi0gIGlmIChwZWVyX2FkZHJlc3MuSXNFbXB0eSgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJUSUYgQUNNIEluaXRpYXRvciwgcGVlciBlbXB0eSI7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19QQVJNX0lOVkFMSUQ7Ci0gIH0KLQotICBzdGQ6OnByb21pc2U8dm9pZD4gcGVlcl9yZWFkeV9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBwZWVyX3JlYWR5X2Z1dHVyZSA9IHBlZXJfcmVhZHlfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTOwotICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgcGVlcl9yZWFkeV9mdXR1cmUud2FpdCgpOwotICB9IGVsc2UgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFDTSBJbml0aWF0b3IgZmFpbHMgdG8gY29uZmlnIGNvZGVjIjsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3QgY2hhbmdlX2NvZGVjX2NvbmZpZ19hY21faW5pdGlhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbXNnKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBjb2RlYyBjaGFuZ2Ugc3RyaW5nOiAlcyIsIF9fZnVuY19fLCBtc2cpOwotICB0QlRJRl9BQ01fUkVDT05GSUcgZGF0YTsKLSAgaWYgKCFidGlmX2FjbV9pbml0aWF0b3IuRW5hYmxlZCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJUSUYgQUNNIEluaXRpYXRvciBpcyBub3QgZW5hYmxlZCI7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0gIH0KLQotICBpZiAocGVlcl9hZGRyZXNzLklzRW1wdHkoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFDTSBJbml0aWF0b3IsIHBlZXIgZW1wdHkiOwotICAgIHJldHVybiBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOwotICB9Ci0gIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKHBlZXJfYWRkcmVzcyk7Ci0gIGlmIChwZWVyID09IG51bGxwdHIpCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFDTSBJbml0aWF0b3IsIHBlZXIgaXMgbnVsbCI7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jZmc7Ci0gIG1lbXNldCgmY29kZWNfcW9zX2NmZywgMCwgc2l6ZW9mKGNvZGVjX3Fvc19jZmcpKTsKLSAgaWYgKCFzdHJjbXAobXNnLCAiR0NQX1RYIikgJiYgcGVlci0+R2V0Q29udGV4dFR5cGUoKSA9PSBDT05URVhUX1RZUEVfTVVTSUMpIHsKLSAgICBkYXRhLmJkX2FkZHIgPSBwZWVyX2FkZHJlc3M7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5yZWNvbmZfdHlwZSA9IGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgaWYgKHBlZXItPklzU3RlcmVvSHNUeXBlKCkpIHsKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXJfYWRkcmVzcywgR0NQLCBNRURJQV9DT05URVhULCBTTkssIFNURVJFT19IU19DT05GSUdfMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXJfYWRkcmVzcywgR0NQLCBNRURJQV9DT05URVhULCBTTkssIEVCX0NPTkZJRyk7Ci0gICAgfQotICAgIGNvZGVjX3Fvc19jZmcgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY2ZnKTsKLSAgfSBlbHNlIGlmICghc3RyY21wKG1zZywgIkdDUF9UWF9SWCIpICYmIHBlZXItPkdldENvbnRleHRUeXBlKCkgPT0gQ09OVEVYVF9UWVBFX01VU0lDKSB7Ci0gICAgZGF0YS5iZF9hZGRyID0gcGVlcl9hZGRyZXNzOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnJlY29uZl90eXBlID0gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyX2FkZHJlc3MsIEdDUCwgTUVESUFfQ09OVEVYVCwgU05LLCBFQl9DT05GSUcpOwotICAgIGNvZGVjX3Fvc19jZmcgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgY29kZWNfcW9zX2NmZy5xb3NfY29uZmlnLmNpZ19jb25maWcuY2lnX2lkKys7Ci0gICAgY29kZWNfcW9zX2NmZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1swXS5jaWdfaWQrKzsKLSAgICBwZWVyLT5zZXRfcGVlcl9tZWRpYV9xb3NfY29uZmlnKGNvZGVjX3Fvc19jZmcucW9zX2NvbmZpZyk7Ci0gICAgcGVlci0+c2V0X3BlZXJfbWVkaWFfY29kZWNfcW9zX2NvbmZpZyhjb2RlY19xb3NfY2ZnKTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jZmcpOwotICB9IGVsc2UgaWYgKCFzdHJjbXAobXNnLCAiTUVESUFfVFgiKSkgewotICAgIGRhdGEuYmRfYWRkciA9IHBlZXJfYWRkcmVzczsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnJlY29uZl90eXBlID0gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgaWYgKHBlZXItPklzU3RlcmVvSHNUeXBlKCkpIHsKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXJfYWRkcmVzcywgQkFQLCBNRURJQV9DT05URVhULCBTTkssIFNURVJFT19IU19DT05GSUdfMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXJfYWRkcmVzcywgQkFQLCBNRURJQV9DT05URVhULCBTTkssIEVCX0NPTkZJRyk7Ci0gICAgfQotICAgIGNvZGVjX3Fvc19jZmcgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY2ZnKTsKLSAgfSBlbHNlIGlmICghc3RyY21wKG1zZywgIk1FRElBX1JYIikpIHsKLSAgICBkYXRhLmJkX2FkZHIgPSBwZWVyX2FkZHJlc3M7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0xJVkU7IC8vTGl2ZSBBdWRpbyBDb250ZXh0Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8ucmVjb25mX3R5cGUgPSBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIFNlbGVjdENvZGVjUW9zQ29uZmlnKHBlZXJfYWRkcmVzcywgV01DUCwgTUVESUFfQ09OVEVYVCwgU1JDLCBFQl9DT05GSUcpOwotICAgIGNvZGVjX3Fvc19jZmcgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY2ZnKTsKLSAgfQotICBwcmludF9jb2RlY19wYXJhbWV0ZXJzKGNvZGVjX3Fvc19jZmcuY29kZWNfY29uZmlnKTsKLSAgcHJpbnRfcW9zX3BhcmFtZXRlcnMoY29kZWNfcW9zX2NmZy5xb3NfY29uZmlnKTsKLSAgYnRpZl90cmFuc2Zlcl9jb250ZXh0KGJ0aWZfYWNtX2hhbmRsZV9ldnQsIEJUSUZfQUNNX1JFQ09ORklHX1JFUV9FVlQsIChjaGFyKikmZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0QlRJRl9BQ01fUkVDT05GSUcpLCBOVUxMKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1ib29sIHJlY29uZmlnX2FjbV9pbml0aWF0b3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCBpbnQgcHJvZmlsZVR5cGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHByb2ZpbGVUeXBlOiAlZCIsIF9fZnVuY19fLCBwcm9maWxlVHlwZSk7Ci0gIHRCVElGX0FDTV9SRUNPTkZJRyBkYXRhOwotICBpZiAoIWJ0aWZfYWNtX2luaXRpYXRvci5FbmFibGVkKCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQlRJRiBBQ00gSW5pdGlhdG9yIGlzIG5vdCBlbmFibGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocGVlcl9hZGRyZXNzLklzRW1wdHkoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFDTSBJbml0aWF0b3IsIHBlZXIgZW1wdHkiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBCdGlmQWNtUGVlciogcGVlciA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihwZWVyX2FkZHJlc3MpOwotICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVElGIEFDTSBJbml0aWF0b3IsIHBlZXIgaXMgbnVsbCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NmZzsKLSAgbWVtc2V0KCZjb2RlY19xb3NfY2ZnLCAwLCBzaXplb2YoY29kZWNfcW9zX2NmZykpOwotICBpZiAoKHByb2ZpbGVUeXBlID09IEdDUCkgJiYgKHBlZXItPkdldENvbnRleHRUeXBlKCkgJiBDT05URVhUX1RZUEVfTVVTSUMpKSB7Ci0gICAgZGF0YS5iZF9hZGRyID0gcGVlcl9hZGRyZXNzOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8ucmVjb25mX3R5cGUgPSBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIGlmIChwZWVyLT5Jc1N0ZXJlb0hzVHlwZSgpKSB7Ci0gICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyX2FkZHJlc3MsIEdDUCwgTUVESUFfQ09OVEVYVCwgU05LLCBTVEVSRU9fSFNfQ09ORklHXzEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyX2FkZHJlc3MsIEdDUCwgTUVESUFfQ09OVEVYVCwgU05LLCBFQl9DT05GSUcpOwotICAgIH0KLSAgICBjb2RlY19xb3NfY2ZnID0gcGVlci0+Z2V0X3BlZXJfbWVkaWFfY29kZWNfcW9zX2NvbmZpZygpOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NmZyk7Ci0gIH0gZWxzZSBpZiAoKHByb2ZpbGVUeXBlID09IEdDUF9UWF9SWCkgJiYgKHBlZXItPkdldENvbnRleHRUeXBlKCkgJiBDT05URVhUX1RZUEVfTVVTSUMpKSB7Ci0gICAgZGF0YS5iZF9hZGRyID0gcGVlcl9hZGRyZXNzOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnJlY29uZl90eXBlID0gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyX2FkZHJlc3MsIEdDUCwgTUVESUFfQ09OVEVYVCwgU05LLCBFQl9DT05GSUcpOwotICAgIGNvZGVjX3Fvc19jZmcgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgY29kZWNfcW9zX2NmZy5xb3NfY29uZmlnLmNpZ19jb25maWcuY2lnX2lkKys7Ci0gICAgY29kZWNfcW9zX2NmZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1swXS5jaWdfaWQrKzsKLSAgICBwZWVyLT5zZXRfcGVlcl9tZWRpYV9xb3NfY29uZmlnKGNvZGVjX3Fvc19jZmcucW9zX2NvbmZpZyk7Ci0gICAgcGVlci0+c2V0X3BlZXJfbWVkaWFfY29kZWNfcW9zX2NvbmZpZyhjb2RlY19xb3NfY2ZnKTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jZmcpOwotICB9IGVsc2UgaWYgKChwcm9maWxlVHlwZSA9PSBCQVApICYmIChwZWVyLT5HZXRDb250ZXh0VHlwZSgpICYgQ09OVEVYVF9UWVBFX01VU0lDKSkgewotICAgIGRhdGEuYmRfYWRkciA9IHBlZXJfYWRkcmVzczsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIGRhdGEuc3RyZWFtc19pbmZvLnJlY29uZl90eXBlID0gYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICBpZiAocGVlci0+SXNTdGVyZW9Ic1R5cGUoKSkgewotICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlcl9hZGRyZXNzLCBCQVAsIE1FRElBX0NPTlRFWFQsIFNOSywgU1RFUkVPX0hTX0NPTkZJR18xKTsKLSAgICB9IGVsc2UgewotICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlcl9hZGRyZXNzLCBCQVAsIE1FRElBX0NPTlRFWFQsIFNOSywgRUJfQ09ORklHKTsKLSAgICB9Ci0gICAgY29kZWNfcW9zX2NmZyA9IHBlZXItPmdldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoKTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jZmcpOwotICB9IGVsc2UgaWYgKChwcm9maWxlVHlwZSA9PSBXTUNQKSAmJiAocGVlci0+R2V0Q29udGV4dFR5cGUoKSAmIENPTlRFWFRfVFlQRV9NVVNJQykpIHsKLSAgICBkYXRhLmJkX2FkZHIgPSBwZWVyX2FkZHJlc3M7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0xJVkU7IC8vTGl2ZSBBdWRpbyBDb250ZXh0Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkM7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8ucmVjb25mX3R5cGUgPSBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIGlmIChwZWVyLT5Jc1N0ZXJlb0hzVHlwZSgpKSB7Ci0gICAgICBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhwZWVyX2FkZHJlc3MsIFdNQ1AsIE1FRElBX0NPTlRFWFQsIFNSQywgU1RFUkVPX0hTX0NPTkZJR18xKTsKLSAgICB9IGVsc2UgewotICAgICAgU2VsZWN0Q29kZWNRb3NDb25maWcocGVlcl9hZGRyZXNzLCBXTUNQLCBNRURJQV9DT05URVhULCBTUkMsIEVCX0NPTkZJRyk7Ci0gICAgfQotICAgIGNvZGVjX3Fvc19jZmcgPSBwZWVyLT5nZXRfcGVlcl9tZWRpYV9jb2RlY19xb3NfY29uZmlnKCk7Ci0gICAgZGF0YS5zdHJlYW1zX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY2ZnKTsKLSAgfSBlbHNlIGlmICgocHJvZmlsZVR5cGUgPT0gQkFQX0NBTEwpICYmIChwZWVyLT5HZXRDb250ZXh0VHlwZSgpICYgQ09OVEVYVF9UWVBFX1ZPSUNFKSkgewotICAgIGRhdGEuYmRfYWRkciA9IHBlZXJfYWRkcmVzczsKLSAgICBkYXRhLnN0cmVhbXNfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICB9Ci0KLSAgcGVlci0+U2V0UmNmZ1Byb2ZpbGVUeXBlKHByb2ZpbGVUeXBlKTsKLSAgaWYgKHByb2ZpbGVUeXBlICE9IEJBUF9DQUxMKSB7Ci0gICAgcHJpbnRfY29kZWNfcGFyYW1ldGVycyhjb2RlY19xb3NfY2ZnLmNvZGVjX2NvbmZpZyk7Ci0gICAgcHJpbnRfcW9zX3BhcmFtZXRlcnMoY29kZWNfcW9zX2NmZy5xb3NfY29uZmlnKTsKLSAgfQotICBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9hY21faGFuZGxlX2V2dCwgQlRJRl9BQ01fUkVDT05GSUdfUkVRX0VWVCwgKGNoYXIqKSZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRCVElGX0FDTV9SRUNPTkZJRyksIE5VTEwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9hY21faW5pdGlhdG9yKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZCdGlmQWNtSW5pdGlhdG9yOjpDbGVhbnVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZidGlmX2FjbV9pbml0aWF0b3IpKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBidGFjbV9pbml0aWF0b3JfaW50ZXJmYWNlX3QgYnRfYWNtX2luaXRpYXRvcl9pbnRlcmZhY2UgPSB7Ci0gICAgc2l6ZW9mKGJ0YWNtX2luaXRpYXRvcl9pbnRlcmZhY2VfdCksCi0gICAgaW5pdF9hY21faW5pdGlhdG9yLAotICAgIGNvbm5lY3RfYWNtX2luaXRpYXRvciwKLSAgICBkaXNjb25uZWN0X2FjbV9pbml0aWF0b3IsCi0gICAgc2V0X2FjdGl2ZV9hY21faW5pdGlhdG9yLAotICAgIHN0YXJ0X3N0cmVhbV9hY21faW5pdGlhdG9yLAotICAgIHN0b3Bfc3RyZWFtX2FjbV9pbml0aWF0b3IsCi0gICAgY29kZWNfY29uZmlnX2FjbV9pbml0aWF0b3IsCi0gICAgY2hhbmdlX2NvZGVjX2NvbmZpZ19hY21faW5pdGlhdG9yLAotICAgIGNsZWFudXBfYWNtX2luaXRpYXRvciwKLX07Ci0KLVJhd0FkZHJlc3MgYnRpZl9hY21faW5pdGlhdG9yX211c2ljX2FjdGl2ZV9wZWVyKHZvaWQpIHsKLSAgcmV0dXJuIGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZVBlZXIoKTsKLX0KLQotUmF3QWRkcmVzcyBidGlmX2FjbV9pbml0aWF0b3Jfdm9pY2VfYWN0aXZlX3BlZXIodm9pZCkgewotICByZXR1cm4gYnRpZl9hY21faW5pdGlhdG9yLlZvaWNlQWN0aXZlUGVlcigpOwotfQotCi1ib29sIGJ0aWZfYWNtX3JlcXVlc3RfY3NpcF9sb2NrKHVpbnQ4X3Qgc2V0SWQpIHsKLSAgTE9HX0lORk8oTE9HX1RBRywgIiVzIiwgX19mdW5jX18pOwotICB0QlRBX0NTSVBfQ1NFVCBjc2V0X2luZm87IC8vIG5lZWQgdG8gZG8gbWVtc2V0ID8KLSAgbWVtc2V0KCZjc2V0X2luZm8sIDAsIHNpemVvZih0QlRBX0NTSVBfQ1NFVCkpOwotICBjc2V0X2luZm8gPSBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0KHNldElkKTsKLSAgLyppZiAoY3NldF9pbmZvLnBfc3J2Y191dWlkICE9IEFDTV9VVUlEKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ki8KLSAgaWYgKGNzZXRfaW5mby5zaXplID4gY3NldF9pbmZvLnRvdGFsX2Rpc2NvdmVyZWQpIHsKLSAgICBMT0dfSU5GTyhMT0dfVEFHLCAiJXMgbm90IGNvbXBsZXRlIHNldCBkaXNjb3ZlcmVkIHlldC4gc2l6ZSA9ICVkIGRpc2NvdmVyZWQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjc2V0X2luZm8uc2l6ZSwgY3NldF9pbmZvLnRvdGFsX2Rpc2NvdmVyZWQpOwotICB9Ci0gIGlmIChzZXRJZCA9PSBjc2V0X2luZm8uc2V0X2lkKSB7Ci0gICAgTE9HX0lORk8oTE9HX1RBRywgIiVzIGNvcnJlY3Qgc2V0IGlkIiwgX19mdW5jX18pOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ0aWZfYWNtX2NoZWNrX2FuZF9jYW5jZWxfbG9ja19yZWxlYXNlX3RpbWVyKHNldElkKTsKLQotICAvL0FxdWlyZSBsb2NrIGZvciBlbnRpcmUgZ3JvdXAuCi0gIHRCVEFfU0VUX0xPQ0tfUEFSQU1TIGxvY2tfcGFyYW1zOyAvL25lZWQgdG8gZG8gbWVtc2V0ID8KLSAgbG9ja19wYXJhbXMuYXBwX2lkID0gYnRpZl9hY21faW5pdGlhdG9yLkdldENzaXBBcHBJZCgpOwotICBsb2NrX3BhcmFtcy5zZXRfaWQgPSBjc2V0X2luZm8uc2V0X2lkOwotICBsb2NrX3BhcmFtcy5sb2NrX3ZhbHVlID0gTE9DS19WQUxVRTsvL0ZvciBsb2NrCi0gIGxvY2tfcGFyYW1zLm1lbWJlcnNfYWRkciA9IGNzZXRfaW5mby5zZXRfbWVtYmVyczsKLSAgQlRBX0NzaXBTZXRMb2NrVmFsdWUgKGxvY2tfcGFyYW1zKTsKLSAgYnRpZl9hY21faW5pdGlhdG9yLlNldExvY2tGbGFncyhCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c1BlbmRpbmdMb2NrKTsKLSAgYnRpZl9hY21faW5pdGlhdG9yLlNldE9yVXBkYXRlR3JvdXBMb2NrU3RhdHVzKGNzZXRfaW5mby5zZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3IuQ2hlY2tMb2NrRmxhZ3MoQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNQZW5kaW5nTG9jaykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBidGlmX2FjbV9yZXF1ZXN0X2NzaXBfdW5sb2NrKHVpbnQ4X3Qgc2V0SWQpIHsKLSAgdEJUQV9DU0lQX0NTRVQgY3NldF9pbmZvOyAvLyBuZWVkIHRvIGRvIG1lbXNldCA/Ci0gIG1lbXNldCgmY3NldF9pbmZvLCAwLCBzaXplb2YodEJUQV9DU0lQX0NTRVQpKTsKLSAgY3NldF9pbmZvID0gQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldChzZXRJZCk7Ci0gIC8qaWYgKGNzZXRfaW5mby5wX3NydmNfdXVpZCAhPSBVdWlkOjpGcm9tU3RyaW5nKCIyQjg2IikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0qLwotICBpZiAoY3NldF9pbmZvLnNpemUgPiBjc2V0X2luZm8udG90YWxfZGlzY292ZXJlZCkgewotICAgIExPR19JTkZPKExPR19UQUcsICIlcyBub3QgY29tcGxldGUgc2V0IGRpc2NvdmVyZWQgeWV0LiBzaXplID0gJWQgZGlzY292ZXJlZCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNzZXRfaW5mby5zaXplLCBjc2V0X2luZm8udG90YWxfZGlzY292ZXJlZCk7Ci0gIH0KLSAgaWYgKHNldElkID09IGNzZXRfaW5mby5zZXRfaWQpIHsKLSAgICBMT0dfSU5GTyhMT0dfVEFHLCAiJXMgY29ycmVjdCBhcHAgaWQiLCBfX2Z1bmNfXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vQXF1aXJlIGxvY2sgZm9yIGVudGlyZSBncm91cC4KLSAgdEJUQV9TRVRfTE9DS19QQVJBTVMgbG9ja19wYXJhbXM7IC8vbmVlZCB0byBkbyBtZW1zZXQgPwotICBsb2NrX3BhcmFtcy5hcHBfaWQgPSBidGlmX2FjbV9pbml0aWF0b3IuR2V0Q3NpcEFwcElkKCk7Ci0gIGxvY2tfcGFyYW1zLnNldF9pZCA9IGNzZXRfaW5mby5zZXRfaWQ7Ci0gIGxvY2tfcGFyYW1zLmxvY2tfdmFsdWUgPSBVTkxPQ0tfVkFMVUU7Ly9Gb3IgVW5sb2NrCi0gIGxvY2tfcGFyYW1zLm1lbWJlcnNfYWRkciA9IGNzZXRfaW5mby5zZXRfbWVtYmVyczsKLSAgQlRBX0NzaXBTZXRMb2NrVmFsdWUgKGxvY2tfcGFyYW1zKTsKLSAgYnRpZl9hY21faW5pdGlhdG9yLlNldExvY2tGbGFncyhCdGlmQWNtSW5pdGlhdG9yOjprRmxhZ1N0YXR1c1BlbmRpbmdVbmxvY2spOwotICBidGlmX2FjbV9pbml0aWF0b3IuU2V0T3JVcGRhdGVHcm91cExvY2tTdGF0dXMoY3NldF9pbmZvLnNldF9pZCwKLSAgICAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3IuQ2hlY2tMb2NrRmxhZ3MoQnRpZkFjbUluaXRpYXRvcjo6a0ZsYWdTdGF0dXNQZW5kaW5nVW5sb2NrKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYWNtX2lzX2NhbGxfYWN0aXZlKHZvaWQpIHsKLSAgQnRpZkFjbVBlZXIqIHBlZXIgPSBudWxscHRyOwotICBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGJ0aWZfYWNtX2luaXRpYXRvci5Wb2ljZUFjdGl2ZVBlZXIoKSk7Ci0gIGlmIChwZWVyICE9IG51bGxwdHIgJiYgKHBlZXItPklzU3RyZWFtaW5nKCkgfHwgcGVlci0+Q2hlY2tGbGFncyhCdGlmQWNtUGVlcjo6a0ZsYWdQZW5kaW5nU3RhcnQpKSAmJgotICAgICAgICAgIChwZWVyLT5HZXRTdHJlYW1Db250ZXh0VHlwZSgpID09IENPTlRFWFRfVFlQRV9WT0lDRSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGJ0aWZfYWNtX3N0cmVhbV9zdGFydCh2b2lkKSB7Ci0gIExPR19JTkZPKExPR19UQUcsICIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKCFidGlmX2FjbV9pbml0aWF0b3IuRW5hYmxlZCgpKQotICAgIHJldHVybjsKLSAgYm9vbCByZXQgPSBmYWxzZTsKLSAgaWYgKGZhbHNlLypidGlmX2FjbV9pbml0aWF0b3IuSXNDc2lwUmVnaXN0ZXJlZCgpICYmIChidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKSAhPSBJTlZBTElEX1NFVF9JRCkqLykgewotICAgIHJldCA9IGJ0aWZfYWNtX3JlcXVlc3RfY3NpcF9sb2NrKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgICBpZiAocmV0ID09IGZhbHNlKSB7Ci0gICAgICB0QTJEUF9DVFJMX0NNRCBwZW5kaW5nX2NtZCA9IGJ0aWZfYWhpbV9nZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0gICAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy9jYWxsIGJlbG93IGluIGxvY2sgY2hhbmdlZCBzdWNjZXNzIENCCi0gICAgLy9zaG91bGQgYmUgZGlzcGF0Y2hlZCB0byBsaXN0IG9mIHBlZXJzIGluIGFjdGl2ZSBtdXNpYyBncm91cC4KLSAgICBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgaWQgPSBidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKTsKLSAgICBpZiAoaWQgPCBJTlZBTElEX1NFVF9JRCkgewotICAgICAgYm9vbCBzZW5kX25lZ19hY2sgPSB0cnVlOwotICAgICAgdEJUQV9DU0lQX0NTRVQgY3NldF9pbmZvOwotICAgICAgbWVtc2V0KCZjc2V0X2luZm8sIDAsIHNpemVvZih0QlRBX0NTSVBfQ1NFVCkpOwotICAgICAgY3NldF9pbmZvID0gQlRBX0NzaXBHZXRDb29yZGluYXRlZFNldChpZCk7Ci0gICAgICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPjo6aXRlcmF0b3IgaXRyOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNpemUgb2Ygc2V0IG1lbWJlcnMgJWQiLCBfX2Z1bmNfXywgKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpKTsKLSAgICAgIGlmICgoY3NldF9pbmZvLnNldF9tZW1iZXJzKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGZvciAoaXRyID0oY3NldF9pbmZvLnNldF9tZW1iZXJzKS5iZWdpbigpOyBpdHIgIT0gKGNzZXRfaW5mby5zZXRfbWVtYmVycykuZW5kKCk7IGl0cisrKSB7Ci0gICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBTZW5kaW5nIHN0YXJ0IHJlcXVlc3QgIiwgX19mdW5jX18pOwotICAgICAgICAgICBCdGlmQWNtUGVlciogcCA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcigqaXRyKTsKLSAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0ciAmJiBwLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgc2VuZF9uZWdfYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgcC0+U2V0U3RyZWFtQ29udGV4dFR5cGUoQ09OVEVYVF9UWVBFX01VU0lDKTsKLSAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoKml0ciwgQlRJRl9BQ01fU1RBUlRfU1RSRUFNX1JFUV9FVlQpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzZW5kX25lZ19hY2spIHsKLSAgICAgICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgICAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgICAgICBwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQpIHsKLSAgICAgICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfRElTQ09OTkVDVF9JTl9QUk9HUkVTUyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICAgIGJ0aWZfYWNtX29uX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFNlbmRpbmcgc3RhcnQgdG8gdHdtIGRldmljZSAiLCBfX2Z1bmNfXyk7Ci0gICAgICBCdGlmQWNtUGVlciogcCA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcihidGlmX2FjbV9pbml0aWF0b3JfbXVzaWNfYWN0aXZlX3BlZXIoKSk7Ci0KLSAgICAgIGlmIChwICE9IG51bGxwdHIgJiYgcC0+SXNTdHJlYW1pbmcoKSkgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQWxyZWFkeSBzdHJlYW1pbmcgb25nb2luZyIsIF9fZnVuY19fKTsKLSAgICAgICAgYnRpZl9hY21fb25fc3RhcnRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwICE9IG51bGxwdHIgJiYgcC0+SXNDb25uZWN0ZWQoKSkgewotICAgICAgICBwLT5TZXRTdHJlYW1Db250ZXh0VHlwZShDT05URVhUX1RZUEVfTVVTSUMpOwotICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoYnRpZl9hY21faW5pdGlhdG9yX211c2ljX2FjdGl2ZV9wZWVyKCksIEJUSUZfQUNNX1NUQVJUX1NUUkVBTV9SRVFfRVZUKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgICAgYnRpZl9hY21fc291cmNlX29uX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX0RJU0NPTk5FQ1RfSU5fUFJPR1JFU1MpOwotICAgICAgICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRElTQ09OTkVDVF9JTl9QUk9HUkVTUyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBidGlmX2FjbV9zdHJlYW1fc3RvcCh2b2lkKSB7Ci0gIExPR19JTkZPKExPR19UQUcsICIlcyAiLCBfX2Z1bmNfXyk7Ci0gIGJvb2wgcmV0ID0gZmFsc2U7Ci0gIGlmIChmYWxzZSAvKmJ0aWZfYWNtX2luaXRpYXRvci5Jc0NzaXBSZWdpc3RlcmVkKCkgJiYgKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpICE9IElOVkFMSURfU0VUX0lEKSovKSB7Ci0gICAgcmV0ID0gYnRpZl9hY21fcmVxdWVzdF9jc2lwX2xvY2soYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKLSAgICAgIHRBMkRQX0NUUkxfQ01EIHBlbmRpbmdfY21kID0gYnRpZl9haGltX2dldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSAgICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwKLSAgICAgICAgICBwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQpIHsKLSAgICAgICAgYnRpZl9hY21fc291cmNlX29uX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICAgIGJ0aWZfYWNtX29uX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19GQUlMVVJFKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBidGlmX2FjbV9jaGVja19hbmRfc3RhcnRfZ3JvdXBfcHJvY2VkdXJlX3RpbWVyKGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpKTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogU2VuZGluZyBzdG9wIHRvIHR3bSBkZXZpY2UgIiwgX19mdW5jX18pOwotICAgIEJ0aWZBY21QZWVyKiBwID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGJ0aWZfYWNtX2luaXRpYXRvcl9tdXNpY19hY3RpdmVfcGVlcigpKTsKLSAgICBpZiAocCAhPSBudWxscHRyICYmIHAtPklzQ29ubmVjdGVkKCkpIHsKLSAgICAgIHAtPlNldFN0cmVhbUNvbnRleHRUeXBlKENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoYnRpZl9hY21faW5pdGlhdG9yX211c2ljX2FjdGl2ZV9wZWVyKCksIEJUSUZfQUNNX1NUT1BfU1RSRUFNX1JFUV9FVlQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0QTJEUF9DVFJMX0NNRCBwZW5kaW5nX2NtZCA9IGJ0aWZfYWhpbV9nZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0gICAgICBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVE9QIHx8Ci0gICAgICAgICAgcGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVVNQRU5EKSB7Ci0gICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTKTsKLSAgICAgIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gQTJEUF9DVFJMX0NNRF9TVEFSVCkgewotICAgICAgICBidGlmX2FjbV9vbl9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfRElTQ09OTkVDVF9JTl9QUk9HUkVTUyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbm8gcGVuZGluZyBjb21tYW5kIHRvIGFjayBtbSBhdWRpbyIsIF9fZnVuY19fKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBidGlmX2FjbV9zdHJlYW1fc3VzcGVuZCh2b2lkKSB7Ci0gIExPR19JTkZPKExPR19UQUcsICIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKCFidGlmX2FjbV9pbml0aWF0b3IuRW5hYmxlZCgpKQotICAgIHJldHVybjsKLSAgYm9vbCByZXQgPSBmYWxzZTsKLSAgaWYgKGZhbHNlIC8qYnRpZl9hY21faW5pdGlhdG9yLklzQ3NpcFJlZ2lzdGVyZWQoKSAmJiAoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkgIT0gSU5WQUxJRF9TRVRfSUQpKi8pIHsKLSAgICByZXQgPSBidGlmX2FjbV9yZXF1ZXN0X2NzaXBfbG9jayhidGlmX2FjbV9pbml0aWF0b3IuTXVzaWNBY3RpdmVDU2V0SWQoKSk7Ci0gICAgLy9jYWxsIGJlbG93IGluIGxvY2sgY2hhbmdlZCBzdWNjZXNzIENCLgotICAgIC8vc2hvdWxkIGJlIGRpc3BhdGNoZWQgdG8gbGlzdCBvZiBwZWVycyBpbiBhY3RpdmUgbXVzaWMgZ3JvdXAuCi0gICAgaWYgKHJldCA9PSBmYWxzZSkgewotICAgICAgdEEyRFBfQ1RSTF9DTUQgcGVuZGluZ19jbWQgPSBidGlmX2FoaW1fZ2V0X3BlbmRpbmdfY29tbWFuZCgpOwotICAgICAgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RPUCB8fAotICAgICAgICAgIHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgewotICAgICAgICBidGlmX2FjbV9zb3VyY2Vfb25fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfRkFJTFVSRSk7Ci0gICAgICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1RBUlQpIHsKLSAgICAgICAgYnRpZl9hY21fb25fc3RhcnRlZChBMkRQX0NUUkxfQUNLX0ZBSUxVUkUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG5vIHBlbmRpbmcgY29tbWFuZCB0byBhY2sgbW0gYXVkaW8iLCBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9ncm91cF9wcm9jZWR1cmVfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotICB9IGVsc2UgewotICAgIGludCBpZCA9IGJ0aWZfYWNtX2luaXRpYXRvci5NdXNpY0FjdGl2ZUNTZXRJZCgpOwotICAgIGlmIChpZCA8IElOVkFMSURfU0VUX0lEKSB7Ci0gICAgICBib29sIHNlbmRfbmVnX2FjayA9IHRydWU7Ci0gICAgICB0QlRBX0NTSVBfQ1NFVCBjc2V0X2luZm87IC8vIG5lZWQgdG8gZG8gbWVtc2V0ID8KLSAgICAgIG1lbXNldCgmY3NldF9pbmZvLCAwLCBzaXplb2YodEJUQV9DU0lQX0NTRVQpKTsKLSAgICAgIGNzZXRfaW5mbyA9IEJUQV9Dc2lwR2V0Q29vcmRpbmF0ZWRTZXQoaWQpOwotICAgICAgc3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz46Oml0ZXJhdG9yIGl0cjsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzaXplIG9mIHNldCBtZW1iZXJzICVkIiwgX19mdW5jX18sIChjc2V0X2luZm8uc2V0X21lbWJlcnMpLnNpemUoKSk7Ci0gICAgICBpZiAoKGNzZXRfaW5mby5zZXRfbWVtYmVycykuc2l6ZSgpID4gMCkgewotICAgICAgICBmb3IgKGl0ciA9KGNzZXRfaW5mby5zZXRfbWVtYmVycykuYmVnaW4oKTsgaXRyICE9IChjc2V0X2luZm8uc2V0X21lbWJlcnMpLmVuZCgpOyBpdHIrKykgewotICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogU2VuZGluZyBzdXNwZW5kIHJlcXVlc3QgIiwgX19mdW5jX18pOwotICAgICAgICAgICBCdGlmQWNtUGVlciogcCA9IGJ0aWZfYWNtX2luaXRpYXRvci5GaW5kUGVlcigqaXRyKTsKLSAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0ciAmJiBwLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgc2VuZF9uZWdfYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgcC0+U2V0U3RyZWFtQ29udGV4dFR5cGUoQ09OVEVYVF9UWVBFX01VU0lDKTsKLSAgICAgICAgICAgICBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoKml0ciwgQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHNlbmRfbmVnX2FjaykgewotICAgICAgICB0QTJEUF9DVFJMX0NNRCBwZW5kaW5nX2NtZCA9IGJ0aWZfYWhpbV9nZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0gICAgICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwKLSAgICAgICAgICAgIHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgewotICAgICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTKTsKLSAgICAgICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICAgICAgYnRpZl9hY21fb25fc3RhcnRlZChBMkRQX0NUUkxfQUNLX0RJU0NPTk5FQ1RfSU5fUFJPR1JFU1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJ0aWZfYWNtX2NoZWNrX2FuZF9zdGFydF9ncm91cF9wcm9jZWR1cmVfdGltZXIoYnRpZl9hY21faW5pdGlhdG9yLk11c2ljQWN0aXZlQ1NldElkKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogU2VuZGluZyBzdXNwZW5kIHRvIHR3bSBkZXZpY2UgIiwgX19mdW5jX18pOwotICAgICAgQnRpZkFjbVBlZXIqIHAgPSBidGlmX2FjbV9pbml0aWF0b3IuRmluZFBlZXIoYnRpZl9hY21faW5pdGlhdG9yX211c2ljX2FjdGl2ZV9wZWVyKCkpOwotICAgICAgaWYgKHAgIT0gbnVsbHB0ciAmJiBwLT5Jc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgIHAtPlNldFN0cmVhbUNvbnRleHRUeXBlKENPTlRFWFRfVFlQRV9NVVNJQyk7Ci0gICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvcl9kaXNwYXRjaF9zbV9ldmVudChidGlmX2FjbV9pbml0aWF0b3JfbXVzaWNfYWN0aXZlX3BlZXIoKSwgQlRJRl9BQ01fU1VTUEVORF9TVFJFQU1fUkVRX0VWVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0QTJEUF9DVFJMX0NNRCBwZW5kaW5nX2NtZCA9IGJ0aWZfYWhpbV9nZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0gICAgICAgIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUT1AgfHwKLSAgICAgICAgICAgIHBlbmRpbmdfY21kID09IEEyRFBfQ1RSTF9DTURfU1VTUEVORCkgewotICAgICAgICAgIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTKTsKLSAgICAgICAgfSBlbHNlIGlmIChwZW5kaW5nX2NtZCA9PSBBMkRQX0NUUkxfQ01EX1NUQVJUKSB7Ci0gICAgICAgICAgYnRpZl9hY21fb25fc3RhcnRlZChBMkRQX0NUUkxfQUNLX0RJU0NPTk5FQ1RfSU5fUFJPR1JFU1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBubyBwZW5kaW5nIGNvbW1hbmQgdG8gYWNrIG1tIGF1ZGlvIiwgX19mdW5jX18pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgYnRpZl9hY21fZGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MsIGludCBjb250ZXh0X3R5cGUpIHsKLSAgTE9HX0lORk8oTE9HX1RBRywgIiVzOiBwZWVyICVzIiwgX19mdW5jX18sIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBkaXNjb25uZWN0X2FjbV9pbml0aWF0b3IocGVlcl9hZGRyZXNzLCBjb250ZXh0X3R5cGUpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2FjbV9pbml0aWF0b3JfZGlzcGF0Y2hfc21fZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX3NtX2V2ZW50X3QgZXZlbnQpIHsKLSAgQnRpZkFjbUV2ZW50IGJ0aWZfYWNtX2V2ZW50KGV2ZW50LCBudWxscHRyLCAwKTsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHBlZXJfYWRkcmVzcz0lcyBldmVudD0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgYnRpZl9hY21fZXZlbnQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9hY21faGFuZGxlX2V2dCwgZXZlbnQsIChjaGFyICopJnBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihSYXdBZGRyZXNzKSwgTlVMTCk7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0aWZfYWNtX2luaXRpYXRvcl9leGVjdXRlX3NlcnZpY2UoYm9vbCBlbmFibGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IHNlcnZpY2U6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgKGVuYWJsZSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLSAgaWYgKGVuYWJsZSkgewotICAgIEJUQV9SZWdpc3RlckNzaXBBcHAoYnRhX2NzaXBfY2FsbGJhY2ssIGJhc2U6OkJpbmQoW10odWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEJUQV9DU0lQX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbid0IHJlZ2lzdGVyIENTSVAgbW9kdWxlICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCJBcHAgSUQ6ICVkIiwgYXBwX2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvci5TZXRDc2lwQXBwSWQoYXBwX2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYWNtX2luaXRpYXRvci5TZXRDc2lwUmVnaXN0cmF0aW9uKHRydWUpO30gKSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9Ci0KLSAgLy8gRGlzYWJsZSB0aGUgc2VydmljZQotICAvL0JUQV9VbnJlZ2lzdGVyQ3NpcEFwcCgpOwotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLS8vIEdldCB0aGUgQUNNIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgQUNNIEluaXRpYXRvciBwcm9maWxlCi1jb25zdCBidGFjbV9pbml0aWF0b3JfaW50ZXJmYWNlX3QqIGJ0aWZfYWNtX2luaXRpYXRvcl9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRfYWNtX2luaXRpYXRvcl9pbnRlcmZhY2U7Ci19Ci0KLXVpbnQxNl90IGJ0aWZfYWNtX2dldF9hY3RpdmVfZGV2aWNlX2xhdGVuY3koKSB7Ci0gIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRNdXNpY0FjdGl2ZVBlZXIoKTsKLSAgaWYgKHBlZXIgPT0gbnVsbHB0cikgewotICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHBlZXIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcGVlci0+R2V0UGVlckxhdGVuY3koKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTZWxlY3RDb2RlY1Fvc0NvbmZpZyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGVfdHlwZSwgaW50IGNvbnRleHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sIGludCBjb25maWdfdHlwZSkgewotCi0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQZWVyICVzICwgY29udGV4dCB0eXBlOiAlZCwgcHJvZmlsZV90eXBlOiAlZCwiCi0gICAgICAgICAgICAgICAgICAgIiBkaXJlY3Rpb246ICVkIGNvbmZpZ190eXBlICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGNvbnRleHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICBwcm9maWxlX3R5cGUsIGRpcmVjdGlvbiwgY29uZmlnX3R5cGUpOwotCi0gIEJ0aWZBY21QZWVyKiBwZWVyID0gYnRpZl9hY21faW5pdGlhdG9yLkZpbmRQZWVyKGJkX2FkZHIpOwotICBpZiAocGVlciA9PSBudWxscHRyKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogcGVlciBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgQ2lnSWQgPSBwZWVyLT5DaWdJZCgpOwotICB1aW50OF90IHNldF9zaXplID0gMDsKLSAgdEJUQV9DU0lQX0NTRVQgY3NldF9pbmZvOwotICBtZW1zZXQoJmNzZXRfaW5mbywgMCwgc2l6ZW9mKGNzZXRfaW5mbykpOwotICBjc2V0X2luZm8gPSBCVEFfQ3NpcEdldENvb3JkaW5hdGVkU2V0KHBlZXItPlNldElkKCkpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogY3NldCBtZW1iZXJzIHNpemU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICh1aW50OF90KShjc2V0X2luZm8uc2l6ZSkpOwotCi0gIGlmIChjc2V0X2luZm8uc2l6ZSA9PSAwKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogdGhpcyBzaHVkIGJlIGNhc2UgZm9yIHN0ZXJlby1IUywgY29uZmlnX3R5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvbmZpZ190eXBlKTsKLSAgICBzZXRfc2l6ZSA9IChjb25maWdfdHlwZSA9PSBTVEVSRU9fSFNfQ09ORklHXzEpID8gMiA6IDE7Ci0gIH0gZWxzZSB7Ci0gICAgc2V0X3NpemUgPSBjc2V0X2luZm8uc2l6ZTsKLSAgfQotCi0gIENvZGVjQ29uZmlnIGNvZGVjX2NvbmZpZ187Ci0gIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWc7Ci0gIFFvc0NvbmZpZyBxb3NfY29uZmlnczsKLSAgQ0lTQ29uZmlnIGNpc19jb25maWc7Ci0gIHN0ZDo6dmVjdG9yPFFvU0NvbmZpZz4gdm1jcF9xb3NfY29uZmlnOwotICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBnb2luZyBmb3IgYmVzdCBjb25maWciLCBfX2Z1bmNfXyk7Ci0gIG1lbXNldCgmY29kZWNfY29uZmlnXywgMCwgc2l6ZW9mKGNvZGVjX2NvbmZpZ18pKTsKLSAgc2VsZWN0X2Jlc3RfY29kZWNfY29uZmlnKGJkX2FkZHIsIGNvbnRleHRfdHlwZSwgcHJvZmlsZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19jb25maWdfLCBkaXJlY3Rpb24sIGNvbmZpZ190eXBlKTsKLSAgY29kZWNfcW9zX2NvbmZpZy5jb2RlY19jb25maWcgPSBjb2RlY19jb25maWdfOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2FtcGxlIHJhdGUgOiAlZCwgZnJhbWVfZHVyYXRpb246ICVkLCBvY3RldHM6ICVkLCAiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSksCi0gICAgICAgICAgICAgICAgICAgR2V0RnJhbWVEdXJhdGlvbigmY29kZWNfY29uZmlnXyksCi0gICAgICAgICAgICAgICAgICAgR2V0T2N0c1BlckZyYW1lKCZjb2RlY19jb25maWdfKSk7Ci0KLSAgaWYgKGNvbnRleHRfdHlwZSA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgaWYgKHByb2ZpbGVfdHlwZSAhPSBXTUNQKSB7Ci0gICAgICB2bWNwX3Fvc19jb25maWcgPSBnZXRfcW9zX3BhcmFtc19mb3JfY29kZWMocHJvZmlsZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9MTF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGcmFtZUR1cmF0aW9uKCZjb2RlY19jb25maWdfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2N0c1BlckZyYW1lKCZjb2RlY19jb25maWdfKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtY3BfcW9zX2NvbmZpZyA9IGdldF9xb3NfcGFyYW1zX2Zvcl9jb2RlYyhwcm9maWxlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0hSX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZyYW1lRHVyYXRpb24oJmNvZGVjX2NvbmZpZ18pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRPY3RzUGVyRnJhbWUoJmNvZGVjX2NvbmZpZ18pKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY29udGV4dF90eXBlID09IFZPSUNFX0NPTlRFWFQpIHsKLSAgICB2bWNwX3Fvc19jb25maWcgPSBnZXRfcW9zX3BhcmFtc19mb3JfY29kZWMocHJvZmlsZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT0lDRV9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGcmFtZUR1cmF0aW9uKCZjb2RlY19jb25maWdfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2N0c1BlckZyYW1lKCZjb2RlY19jb25maWdfKSk7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHZtY3AgcW9zIHNpemU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAodWludDhfdCl2bWNwX3Fvc19jb25maWcuc2l6ZSgpKTsKLQotICBib29sIHFoc19lbmFibGUgPSBmYWxzZTsKLSAgY2hhciBxaHNfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9ICJmYWxzZSI7Ci0gIHByb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5xaHNfZW5hYmxlIiwgcWhzX3ZhbHVlLCAiZmFsc2UiKTsKLSAgaWYgKCFzdHJuY21wKCJ0cnVlIiwgcWhzX3ZhbHVlLCA0KSkgewotICAgIGlmIChidG1fYWNsX3Foc19waHlfc3VwcG9ydGVkKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSkpIHsKLSAgICAgIHFoc19lbmFibGUgPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBxaHNfZW5hYmxlID0gZmFsc2U7Ci0gIH0KLQotICAvL1RPRE86IGZpbGwgY2lnIGlkIGFuZCBjaXMgY291bnQgZnJvbQotICAvL0N1cnJlbnRseSBpdCBpcyBhIHNpbmdsZSBzaXplIHZlY3RvcgotICBmb3IgKHVpbnQ4X3QgaiA9IDA7IGogPCAodWludDhfdCl2bWNwX3Fvc19jb25maWcuc2l6ZSgpOyBqKyspIHsKLSAgICBpZiAodm1jcF9xb3NfY29uZmlnW2pdLm1hbmRhdG9yeSA9PSAwKSB7Ci0gICAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWwgPSB2bWNwX3Fvc19jb25maWdbal0uc2R1X2ludF9taWNyb19zZWNzOwotICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAuY2lnX2lkID0gQ2lnSWQsCi0gICAgICAgICAgICAgICAgICAuY2lzX2NvdW50ID0gc2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICB2bWNwX3Fvc19jb25maWdbal0uZnJhbWluZywgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSB2bWNwX3Fvc19jb25maWdbal0ubWF4X3RyYW5zX2xhdCwKLSAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSB2bWNwX3Fvc19jb25maWdbal0ubWF4X3RyYW5zX2xhdCwKLSAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzZHVfaW50ZXJ2YWwgJiAweEZGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHNkdV9pbnRlcnZhbCA+PiA4KSYgMHhGRiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChzZHVfaW50ZXJ2YWwgPj4gMTYpJiAweEZGKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfc190b19tID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzZHVfaW50ZXJ2YWwgJiAweEZGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHNkdV9pbnRlcnZhbCA+PiA4KSYgMHhGRiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChzZHVfaW50ZXJ2YWwgPj4gMTYpJiAweEZGKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBmcmFtaW5nOiAlZCwgdHJhbnNwb3J0IGxhdGVuY3k6ICVkIgotICAgICAgICAgICAgICAgICAgICAgICAiIHNkdV9pbnRlcnZhbDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZtY3BfcW9zX2NvbmZpZ1tqXS5mcmFtaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgdm1jcF9xb3NfY29uZmlnW2pdLm1heF90cmFuc19sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2bWNwX3Fvc19jb25maWdbal0uc2R1X2ludF9taWNyb19zZWNzKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBDSUc6IHBhY2tpbmc6ICVkLCB0cmFuc3BvcnQgbGF0ZW5jeSBtIHRvIHM6ICVkLCIKLSAgICAgICAgICAgICAgIiB0cmFuc3BvcnQgbGF0ZW5jeSBzIHRvIG06ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaWdfY29uZmlnLnBhY2tpbmcsCi0gICAgICAgICAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmNpZ19jb25maWcubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBGaWxsZWQgQ0lHIGNvbmZpZyAiLCBfX2Z1bmNfXyk7Ci0gICAgfQotICB9Ci0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgc2V0X3NpemU7IGkrKykgewotICAgIC8vQ3VycmVudGx5IGl0IGlzIGEgc2luZ2xlIHNpemUgdmVjdG9yCi0gICAgdWludDhfdCBjaGVja19tZW1zZXQgPSAwOwotICAgIGZvciAodWludDhfdCBqID0gMDsgaiA8ICh1aW50OF90KXZtY3BfcW9zX2NvbmZpZy5zaXplKCk7IGorKykgewotICAgICAgaWYgKHZtY3BfcW9zX2NvbmZpZ1tqXS5tYW5kYXRvcnkgPT0gMCkgewotICAgICAgICBtZW1zZXQoJmNpc19jb25maWcsIDAsIHNpemVvZihjaXNfY29uZmlnKSk7Ci0gICAgICAgIGlmICghY2hlY2tfbWVtc2V0KQotICAgICAgICAgIGNoZWNrX21lbXNldCA9IDE7Ci0gICAgICAgIGNpc19jb25maWcuY2lzX2lkID0gaTsKLSAgICAgICAgaWYgKHByb2ZpbGVfdHlwZSAhPSBXTUNQKQotICAgICAgICAgIGNpc19jb25maWcubWF4X3NkdV9tX3RvX3MgPSB2bWNwX3Fvc19jb25maWdbal0ubWF4X3NkdV9zaXplOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X21fdG9fcyA9IDA7Ci0gICAgICAgIGlmICgoY29udGV4dF90eXBlID09IFZPSUNFX0NPTlRFWFQpIHx8IChwcm9maWxlX3R5cGUgPT0gV01DUCkpCi0gICAgICAgICAgY2lzX2NvbmZpZy5tYXhfc2R1X3NfdG9fbSA9IHZtY3BfcW9zX2NvbmZpZ1tqXS5tYXhfc2R1X3NpemU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjaXNfY29uZmlnLm1heF9zZHVfc190b19tID0gMDsKLQotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogcWhzX2VuYWJsZTogJWQiLCBfX2Z1bmNfXywgcWhzX2VuYWJsZSk7Ci0KLSAgICAgICAgaWYgKHFoc19lbmFibGUpIHsKLSAgICAgICAgICBjaXNfY29uZmlnLnBoeV9tX3RvX3MgPSBMRV9RSFNfUEhZOwotICAgICAgICAgIGNpc19jb25maWcucGh5X3NfdG9fbSA9IExFX1FIU19QSFk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2lzX2NvbmZpZy5waHlfbV90b19zID0gTEVfMk1fUEhZOy8vMm1icHMKLSAgICAgICAgICBjaXNfY29uZmlnLnBoeV9zX3RvX20gPSBMRV8yTV9QSFk7Ci0gICAgICAgIH0KLSAgICAgICAgY2lzX2NvbmZpZy5ydG5fbV90b19zID0gdm1jcF9xb3NfY29uZmlnW2pdLnJldHJhbnNfbnVtOwotICAgICAgICBjaXNfY29uZmlnLnJ0bl9zX3RvX20gPSB2bWNwX3Fvc19jb25maWdbal0ucmV0cmFuc19udW07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghY2hlY2tfbWVtc2V0KQotICAgICAgbWVtc2V0KCZjaXNfY29uZmlnLCAwLCBzaXplb2YoY2lzX2NvbmZpZykpOwotICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZyk7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEZpbGxlZCBDSVMgY29uZmlnIGZvciAlZCIsIF9fZnVuY19fLCBpKTsKLSAgfQotCi0gIGZvciAodWludDhfdCBqID0gMDsgaiA8ICh1aW50OF90KXZtY3BfcW9zX2NvbmZpZy5zaXplKCk7IGorKykgewotICAgIGlmICh2bWNwX3Fvc19jb25maWdbal0ubWFuZGF0b3J5ID09IDApIHsKLSAgICAgIHVpbnQzMl90IHByZXNlbl9kZWxheSA9IHZtY3BfcW9zX2NvbmZpZ1tqXS5wcmVzZW50YXRpb25fZGVsYXk7Ci0gICAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnXzEgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IENpZ0lkLAotICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSBwZWVyLT5DaXNJZCgpLAotICAgICAgICAgICAgICAgICAgICAgIC50YXJnZXRfbGF0ZW5jeSA9IDB4MDMsLy9UYXJnZXQgaGlnaGVyIHJlbGlhYmlsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHtzdGF0aWNfY2FzdDx1aW50OF90PihwcmVzZW5fZGVsYXkgJiAweEZGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChwcmVzZW5fZGVsYXkgPj4gOCkmIDB4RkYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHByZXNlbl9kZWxheSA+PiAxNikmIDB4RkYpfQotICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ18xKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBwcmVzZW50YXRpb24gZGVsYXkgPSAlZCIsIF9fZnVuY19fLCBwcmVzZW5fZGVsYXkpOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IEZpbGxlZCBBU0NTIGNvbmZpZyBmb3IgJWQiLCBfX2Z1bmNfXywgYXNjc19jb25maWdfMS5jaXNfaWQpOwotICAgICAgaWYgKGNvbmZpZ190eXBlID09IFNURVJFT19IU19DT05GSUdfMSkgewotICAgICAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnXzIgPSBhc2NzX2NvbmZpZ18xOwotICAgICAgICBhc2NzX2NvbmZpZ18yLmNpc19pZCA9IHBlZXItPkNpc0lkKCkrMTsKLSAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5wdXNoX2JhY2soYXNjc19jb25maWdfMik7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBGaWxsZWQgQVNDUyBjb25maWcgZm9yICVkIiwgX19mdW5jX18sIGFzY3NfY29uZmlnXzIuY2lzX2lkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAocHJvZmlsZV90eXBlID09IEJBUCkgewotICAgIGlmIChjb250ZXh0X3R5cGUgPT0gVk9JQ0VfQ09OVEVYVCkgewotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTTkspIHsKLSAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmNpZ19jb25maWcuY2lnX2lkID0gQ2lnSWQgKyAyOwotICAgICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLmNpZ19pZCA9IENpZ0lkICsgMjsKLSAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1swXS50YXJnZXRfbGF0ZW5jeSA9IDB4MDE7Ci0gICAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0uYmlfZGlyZWN0aW9uYWwgPSB0cnVlOwotICAgICAgICBpZiAoY29uZmlnX3R5cGUgPT0gU1RFUkVPX0hTX0NPTkZJR18xKSB7Ci0gICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1sxXS5jaWdfaWQgPSBDaWdJZCArIDI7Ci0gICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1sxXS50YXJnZXRfbGF0ZW5jeSA9IDB4MDE7Ci0gICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1sxXS5iaV9kaXJlY3Rpb25hbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcGVlci0+c2V0X3BlZXJfdm9pY2VfdHhfY29kZWNfY29uZmlnKGNvZGVjX2NvbmZpZ18pOwotICAgICAgICBwZWVyLT5zZXRfcGVlcl92b2ljZV90eF9xb3NfY29uZmlnKGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZyk7Ci0gICAgICAgIHBlZXItPnNldF9wZWVyX3ZvaWNlX3R4X2NvZGVjX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZyk7Ci0gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTUkMpIHsKLSAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmNpZ19jb25maWcuY2lnX2lkID0gQ2lnSWQgKyAyOwotICAgICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLmNpZ19pZCA9IENpZ0lkICsgMjsKLSAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1swXS50YXJnZXRfbGF0ZW5jeSA9IDB4MDE7Ci0gICAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0uYmlfZGlyZWN0aW9uYWwgPSB0cnVlOwotICAgICAgICBpZiAoY29uZmlnX3R5cGUgPT0gU1RFUkVPX0hTX0NPTkZJR18xKSB7Ci0gICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1sxXS5jaWdfaWQgPSBDaWdJZCArIDI7Ci0gICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1sxXS50YXJnZXRfbGF0ZW5jeSA9IDB4MDE7Ci0gICAgICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1sxXS5iaV9kaXJlY3Rpb25hbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcGVlci0+c2V0X3BlZXJfdm9pY2VfcnhfY29kZWNfY29uZmlnKGNvZGVjX2NvbmZpZ18pOwotICAgICAgICBwZWVyLT5zZXRfcGVlcl92b2ljZV9yeF9xb3NfY29uZmlnKGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZyk7Ci0gICAgICAgIHBlZXItPnNldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBlZXItPnNldF9wZWVyX21lZGlhX2NvZGVjX2NvbmZpZyhjb2RlY19jb25maWdfKTsKLSAgICAgIHBlZXItPnNldF9wZWVyX21lZGlhX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnKTsKLSAgICAgIHBlZXItPnNldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZyk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHByb2ZpbGVfdHlwZSA9PSBHQ1ApIHsKLSAgICBpZiAoY29udGV4dF90eXBlID09IFZPSUNFX0NPTlRFWFQpIHsKLSAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaWdfY29uZmlnLmNpZ19pZCA9IENpZ0lkICsgMTsKLSAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0uY2lnX2lkID0gQ2lnSWQgKyAxOwotICAgICAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmFzY3NfY29uZmlnc1swXS50YXJnZXRfbGF0ZW5jeSA9IDB4MDE7Ci0gICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLmJpX2RpcmVjdGlvbmFsID0gdHJ1ZTsKLSAgICAgIHBlZXItPnNldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX2NvbmZpZyhjb2RlY19jb25maWdfKTsKLSAgICAgIHBlZXItPnNldF9wZWVyX3ZvaWNlX3J4X3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnKTsKLSAgICAgIHBlZXItPnNldF9wZWVyX3ZvaWNlX3J4X2NvZGVjX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBlZXItPnNldF9wZWVyX21lZGlhX2NvZGVjX2NvbmZpZyhjb2RlY19jb25maWdfKTsKLSAgICAgIHBlZXItPnNldF9wZWVyX21lZGlhX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnKTsKLSAgICAgIHBlZXItPnNldF9wZWVyX21lZGlhX2NvZGVjX3Fvc19jb25maWcoY29kZWNfcW9zX2NvbmZpZyk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHByb2ZpbGVfdHlwZSA9PSBXTUNQKSB7Ci0gICAgaWYgKGNvbnRleHRfdHlwZSA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuY2lnX2NvbmZpZy5jaWdfaWQgPSBDaWdJZCArIDM7Ci0gICAgICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzWzBdLmNpZ19pZCA9IENpZ0lkICsgMzsKLSAgICAgIGlmIChjb25maWdfdHlwZSA9PSBTVEVSRU9fSFNfQ09ORklHXzEpCi0gICAgICAgIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMV0uY2lnX2lkID0gQ2lnSWQgKyAzOwotICAgICAgcGVlci0+c2V0X3BlZXJfbWVkaWFfY29kZWNfY29uZmlnKGNvZGVjX2NvbmZpZ18pOwotICAgICAgcGVlci0+c2V0X3BlZXJfbWVkaWFfcW9zX2NvbmZpZyhjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcpOwotICAgICAgcGVlci0+c2V0X3BlZXJfbWVkaWFfY29kZWNfcW9zX2NvbmZpZyhjb2RlY19xb3NfY29uZmlnKTsKLSAgICB9Ci0gIH0KLSAgLy9wcmludF9jb2RlY19wYXJhbWV0ZXJzKGNvZGVjX2NvbmZpZ18pOwotICAvL3ByaW50X3Fvc19wYXJhbWV0ZXJzKGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZyk7Ci19Ci0KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKHVpbnQxNl90IHNhbXBfZnJlcSwgQ29kZWNDb25maWcgKnJlc3VsdF9jb25maWcpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNhbXBfZnJlcTogJWQiLCBfX2Z1bmNfXywgc2FtcF9mcmVxKTsKLSAgaWYgKHNhbXBfZnJlcSAmIHN0YXRpY19jYXN0PHVpbnQxNl90PihDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwKSkgewotICAgIHJlc3VsdF9jb25maWctPnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoc2FtcF9mcmVxICYgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDQxMDApKSB7Ci0gICAgcmVzdWx0X2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChzYW1wX2ZyZXEgJiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8zMjAwMCkpIHsKLSAgICByZXN1bHRfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHNhbXBfZnJlcSAmIHN0YXRpY19jYXN0PHVpbnQxNl90PihDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzI0MDAwKSkgewotICAgIHJlc3VsdF9jb25maWctPnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8yNDAwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoc2FtcF9mcmVxICYgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTYwMDApKSB7Ci0gICAgcmVzdWx0X2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChzYW1wX2ZyZXEgJiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV84MDAwKSkgewotICAgIHJlc3VsdF9jb25maWctPnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV84MDAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgc2VsZWN0X2Jlc3RfZnJhbWVfZHVyYSh1aW50OF90IGZyYW1lX2R1cmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ29uZmlnICpyZXN1bHRfY29uZmlnKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBmcmFtZV9kdXJhdGlvbjogJWQiLCBfX2Z1bmNfXywgZnJhbWVfZHVyYSk7Ci0gIGlmIChmcmFtZV9kdXJhICYgc3RhdGljX2Nhc3Q8dWludDhfdD4oQ29kZWNGcmFtZUR1cmF0aW9uOjpGUkFNRV9EVVJfMTApKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGluZyAxMG1zIGFzIGJlc3QgZnJhbWUgZHVyYXRpb24iLCBfX2Z1bmNfXyk7Ci0gICAgVXBkYXRlRnJhbWVEdXJhdGlvbihyZXN1bHRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAoKGZyYW1lX2R1cmEgJgotICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzdfNSkpID09IDApIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VsZWN0aW5nIDcuNW1zIGFzIGJlc3QgZnJhbWUgZHVyYXRpb24iLCBfX2Z1bmNfXyk7Ci0gICAgVXBkYXRlRnJhbWVEdXJhdGlvbihyZXN1bHRfY29uZmlnLAotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oQ29kZWNGcmFtZUR1cmF0aW9uOjpGUkFNRV9EVVJfN181KSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgc2VsZWN0X2Jlc3RfY29kZWNfY29uZmlnKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByb2ZpbGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ29uZmlnICpjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBpbnQgY29uZmlnX3R5cGUpIHsKLQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZWxlY3QgYmVzdCBjb2RlYyBjb25maWcgZm9yIGNvbnRleHQgdHlwZTogJWQsIgotICAgICAgICAgICAgICAgICAgICAgIiBwcm9maWxlIHR5cGUgJWQgY29uZmlnX3R5cGUgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfdHlwZSwgcHJvZmlsZV90eXBlLCBjb25maWdfdHlwZSk7Ci0KLSAgICBDb2RlY0NvbmZpZyByZXN1bHRfY29kZWNfY29uZmlnOwotICAgIHVpbnQxNl90IHZtY3Bfc2FtcF9mcmVxID0gMDsKLSAgICB1aW50OF90IHZtY3BfZnJhbV9kdXIgPSAwOwotICAgIHVpbnQzMl90IHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IDA7Ci0gICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IHBhY19yZWNvcmQ7Ci0gICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGxvY2FsX2NvZGVjX2NvbmZpZzsKLSAgICBtZW1zZXQoJnJlc3VsdF9jb2RlY19jb25maWcsIDAsIHNpemVvZihyZXN1bHRfY29kZWNfY29uZmlnKSk7Ci0gICAgYm9vbCBwYWNfZm91bmQgPSBmYWxzZTsKLSAgICB1aW50MTZfdCBhdWRpb19jb250ZXh0X3R5cGUgPSBDT05URU5UX1RZUEVfVU5TUEVDSUZJRUQ7Ci0KLSAgICBib29sIGlzX2xjM3Ffc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgY2hhciBsYzNxX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiZmFsc2UiOwotICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5pc19sYzNxX3N1cHBvcnRlZCIsIGxjM3FfdmFsdWUsICJmYWxzZSIpOwotICAgIGlmICghc3RybmNtcCgidHJ1ZSIsIGxjM3FfdmFsdWUsIDQpKSB7Ci0gICAgICBpc19sYzNxX3N1cHBvcnRlZCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlzX2xjM3Ffc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgfQotICAgIEJUSUZfVFJBQ0VfSU1QKCIlczogaXNfbGMzcV9zdXBwb3J0ZWQ6ICVkIiwgX19mdW5jX18sIGlzX2xjM3Ffc3VwcG9ydGVkKTsKLQotICAgIGlmIChjb250ZXh0X3R5cGUgPT0gTUVESUFfQ09OVEVYVCkgewotICAgICAgYXVkaW9fY29udGV4dF90eXBlIHw9Ci0gICAgICAgIChwcm9maWxlX3R5cGUgPT0gV01DUCkgPyBDT05URU5UX1RZUEVfTElWRSA6IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICB9IGVsc2UgaWYgKGNvbnRleHRfdHlwZSA9PSBWT0lDRV9DT05URVhUKSB7Ci0gICAgICBhdWRpb19jb250ZXh0X3R5cGUgfD0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIH0KLSAgICBCVElGX1RSQUNFX0lNUCgiJXM6IGF1ZGlvX2NvbnRleHRfdHlwZTogJWQiLCBfX2Z1bmNfXywgYXVkaW9fY29udGV4dF90eXBlKTsKLQotICAgIHBhY19mb3VuZCA9IGJ0aWZfYmFwX2dldF9yZWNvcmRzKGJkX2FkZHIsIFJFQ19UWVBFX0NBUEFCSUxJVFksIGF1ZGlvX2NvbnRleHRfdHlwZSwKLSAgICAgICAgKChkaXIgPT0gU1JDKSA/IENvZGVjRGlyZWN0aW9uOjpDT0RFQ19ESVJfU1JDIDogQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TSU5LKSwKLSAgICAgICAgJnBhY19yZWNvcmQpOwotCi0gICAgaWYgKHBhY19mb3VuZCkgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBBQyByZWNvcmQgZm91bmQsIHNlbGVjdCBiZXN0IGNvZGVjIGNvbmZpZyIsIF9fZnVuY19fKTsKLSAgICAgIHVpbnQxNl90IHBlZXJfc2FtcF9mcmVxID0gMDsKLSAgICAgIHVpbnQ4X3QgcGVlcl9jaGFubmVsX21vZGUgPSAwOwotICAgICAgdWludDhfdCBwZWVyX2ZyYW1fZHVyID0gMDsKLSAgICAgIHVpbnQxNl90IHBlZXJfbWluX29jdGV0c19wZXJfZnJhbWUgPSAwOwotICAgICAgdWludDE2X3QgcGVlcl9tYXhfb2N0ZXRzX3Blcl9mcmFtZSA9IDA7Ci0gICAgICB1aW50OF90IHBlZXJfbWF4X3N1cF9sYzNfZnJhbWVzID0gMDsKLSAgICAgIHVpbnQxNl90IHBlZXJfcHJlZmVycmVkX2NvbnRleHQgPSAwOwotICAgICAgYm9vbCBwZWVyX2xjM3FfcHJlZiA9IDA7Ci0gICAgICB1aW50OF90IHBlZXJfbGMzcV92ZXIgPSAwOwotCi0gICAgICAvL2N1cnJlbnRseSBkaWZmZXJlbnRpYXRpbmcgYmFzZWQgb24gZnJlcXVlbmN5IGxhdGVyIHdlIHdpbGwgZG8gb24gY29udGV4dCB0eXBlCi0gICAgICBmb3IgKGF1dG8gaXQgPSBwYWNfcmVjb3JkLmJlZ2luKCk7IGl0ICE9IHBhY19yZWNvcmQuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5jb2RlY190eXBlID09IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzMpIHsKLSAgICAgICAgICAvL3BlcmZvcm1pbmcgb25seSBmb3IgTVVTSUMgY29udGV4dCB0eXBlIGJhc2VkIG9uIDQ0LjFLSHogYW5kIDQ4S0h6Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHBhY19yZWNvcmQgc2FtcGxlX3JhdGU6ICVkIiwgX19mdW5jX18sIGl0LT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwKSB7Ci0gICAgICAgICAgICBwZWVyX3NhbXBfZnJlcSB8PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwKSB7Ci0gICAgICAgICAgICBwZWVyX3NhbXBfZnJlcSB8PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzMyMDAwKSB7Ci0gICAgICAgICAgICBwZWVyX3NhbXBfZnJlcSB8PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzI0MDAwKSB7Ci0gICAgICAgICAgICBwZWVyX3NhbXBfZnJlcSB8PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwKSB7Ci0gICAgICAgICAgICBwZWVyX3NhbXBfZnJlcSB8PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzgwMDApIHsKLSAgICAgICAgICAgIHBlZXJfc2FtcF9mcmVxIHw9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpdC0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBsb2NhbF9jb2RlY19jb25maWcgPSBnZXRfYWxsX2NvZGVjX2NvbmZpZ3MocHJvZmlsZV90eXBlLCBjb250ZXh0X3R5cGUpOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHZtY3AgY29kZWMgc2l6ZTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICh1aW50OF90KWxvY2FsX2NvZGVjX2NvbmZpZy5zaXplKCkpOwotICAgICAgZm9yIChhdXRvIGl0ID0gbG9jYWxfY29kZWNfY29uZmlnLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGxvY2FsX2NvZGVjX2NvbmZpZy5lbmQoKTsgKytpdCkgewotICAgICAgICBpZiAoaXQtPmNvZGVjX3R5cGUgPT0gQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMykgewotICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBsb2NhbF9jb2RlY19jb25maWcgc2FtcGxlX3JhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDApIHsKLSAgICAgICAgICAgIHZtY3Bfc2FtcF9mcmVxIHw9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpdC0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDQxMDApIHsKLSAgICAgICAgICAgIHZtY3Bfc2FtcF9mcmVxIHw9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpdC0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDApIHsKLSAgICAgICAgICAgIHZtY3Bfc2FtcF9mcmVxIHw9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpdC0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDApIHsKLSAgICAgICAgICAgIHZtY3Bfc2FtcF9mcmVxIHw9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpdC0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTYwMDApIHsKLSAgICAgICAgICAgIHZtY3Bfc2FtcF9mcmVxIHw9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpdC0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCkgewotICAgICAgICAgICAgdm1jcF9zYW1wX2ZyZXEgfD0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGl0LT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKHBlZXJfc2FtcF9mcmVxICYgdm1jcF9zYW1wX2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvZGVjX2NvbmZpZyk7Ci0gICAgICBmb3IgKGF1dG8gaXQgPSBwYWNfcmVjb3JkLmJlZ2luKCk7IGl0ICE9IHBhY19yZWNvcmQuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5jb2RlY190eXBlID09IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzMpIHsKLSAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHBhY19yZWNvcmQgc2FtcGxlX3JhdGU6ICVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXQtPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwICYmCi0gICAgICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwKSB7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZWxlY3RpbmcgNDhLSHogZm9yIGNvbmZpZyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl9jaGFubmVsX21vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihpdC0+Y2hhbm5lbF9tb2RlKTsKLSAgICAgICAgICAgICAgcGVlcl9mcmFtX2R1ciA9IEdldENhcGFTdXBGcmFtZUR1cmF0aW9ucygmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX21pbl9vY3RldHNfcGVyX2ZyYW1lID0gR2V0Q2FwYVN1cE9jdHNQZXJGcmFtZSgmKCppdCkpICYgMHhGRkZGOwotICAgICAgICAgICAgICBwZWVyX21heF9vY3RldHNfcGVyX2ZyYW1lID0gKEdldENhcGFTdXBPY3RzUGVyRnJhbWUoJigqaXQpKSAmIDB4RkZGRjAwMDApID4+IDE2OwotICAgICAgICAgICAgICBwZWVyX21heF9zdXBfbGMzX2ZyYW1lcyA9IEdldENhcGFNYXhTdXBMYzNGcmFtZXMoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9sYzNxX3ByZWYgPSBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRUHJlZigmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX2xjM3FfdmVyID0gR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcigmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX3ByZWZlcnJlZF9jb250ZXh0ID0gR2V0Q2FwYVByZWZlcnJlZENvbnRleHRzKCYoKml0KSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80NDEwMCAmJgotICAgICAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80NDEwMCkgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VsZWN0aW5nIDQ0LjFLSHogZm9yIGNvbmZpZyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl9jaGFubmVsX21vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihpdC0+Y2hhbm5lbF9tb2RlKTsKLSAgICAgICAgICAgICAgcGVlcl9mcmFtX2R1ciA9IEdldENhcGFTdXBGcmFtZUR1cmF0aW9ucygmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX21pbl9vY3RldHNfcGVyX2ZyYW1lID0gR2V0Q2FwYVN1cE9jdHNQZXJGcmFtZSgmKCppdCkpICYgMHhGRkZGOwotICAgICAgICAgICAgICBwZWVyX21heF9vY3RldHNfcGVyX2ZyYW1lID0gKEdldENhcGFTdXBPY3RzUGVyRnJhbWUoJigqaXQpKSAmIDB4RkZGRjAwMDApID4+IDE2OwotICAgICAgICAgICAgICBwZWVyX21heF9zdXBfbGMzX2ZyYW1lcyA9IEdldENhcGFNYXhTdXBMYzNGcmFtZXMoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9sYzNxX3ByZWYgPSBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRUHJlZigmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX2xjM3FfdmVyID0gR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcigmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX3ByZWZlcnJlZF9jb250ZXh0ID0gR2V0Q2FwYVByZWZlcnJlZENvbnRleHRzKCYoKml0KSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8zMjAwMCAmJgotICAgICAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8zMjAwMCkgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VsZWN0aW5nIDMyS0h6IGZvciBjb25maWciLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIHBlZXJfY2hhbm5lbF9tb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaXQtPmNoYW5uZWxfbW9kZSk7Ci0gICAgICAgICAgICAgIHBlZXJfZnJhbV9kdXIgPSBHZXRDYXBhU3VwRnJhbWVEdXJhdGlvbnMoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9taW5fb2N0ZXRzX3Blcl9mcmFtZSA9IEdldENhcGFTdXBPY3RzUGVyRnJhbWUoJigqaXQpKSAmIDB4RkZGRjsKLSAgICAgICAgICAgICAgcGVlcl9tYXhfb2N0ZXRzX3Blcl9mcmFtZSA9IChHZXRDYXBhU3VwT2N0c1BlckZyYW1lKCYoKml0KSkgJiAweEZGRkYwMDAwKSA+PiAxNjsKLSAgICAgICAgICAgICAgcGVlcl9tYXhfc3VwX2xjM19mcmFtZXMgPSBHZXRDYXBhTWF4U3VwTGMzRnJhbWVzKCYoKml0KSk7Ci0gICAgICAgICAgICAgIHBlZXJfbGMzcV9wcmVmID0gR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9sYzNxX3ZlciA9IEdldENhcGFWZW5kb3JNZXRhRGF0YUxjM1FWZXIoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9wcmVmZXJyZWRfY29udGV4dCA9IEdldENhcGFQcmVmZXJyZWRDb250ZXh0cygmKCppdCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDAgJiYKLSAgICAgICAgICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDApIHsKLSAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGluZyAyNEtIeiBmb3IgY29uZmlnIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBwZWVyX2NoYW5uZWxfbW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGl0LT5jaGFubmVsX21vZGUpOwotICAgICAgICAgICAgICBwZWVyX2ZyYW1fZHVyID0gR2V0Q2FwYVN1cEZyYW1lRHVyYXRpb25zKCYoKml0KSk7Ci0gICAgICAgICAgICAgIHBlZXJfbWluX29jdGV0c19wZXJfZnJhbWUgPSBHZXRDYXBhU3VwT2N0c1BlckZyYW1lKCYoKml0KSkgJiAweEZGRkY7Ci0gICAgICAgICAgICAgIHBlZXJfbWF4X29jdGV0c19wZXJfZnJhbWUgPSAoR2V0Q2FwYVN1cE9jdHNQZXJGcmFtZSgmKCppdCkpICYgMHhGRkZGMDAwMCkgPj4gMTY7Ci0gICAgICAgICAgICAgIHBlZXJfbWF4X3N1cF9sYzNfZnJhbWVzID0gR2V0Q2FwYU1heFN1cExjM0ZyYW1lcygmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX2xjM3FfcHJlZiA9IEdldENhcGFWZW5kb3JNZXRhRGF0YUxjM1FQcmVmKCYoKml0KSk7Ci0gICAgICAgICAgICAgIHBlZXJfbGMzcV92ZXIgPSBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRVmVyKCYoKml0KSk7Ci0gICAgICAgICAgICAgIHBlZXJfcHJlZmVycmVkX2NvbnRleHQgPSBHZXRDYXBhUHJlZmVycmVkQ29udGV4dHMoJigqaXQpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwICYmCi0gICAgICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwKSB7Ci0gICAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZWxlY3RpbmcgMTZLSHogZm9yIGNvbmZpZyIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgcGVlcl9jaGFubmVsX21vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihpdC0+Y2hhbm5lbF9tb2RlKTsKLSAgICAgICAgICAgICAgcGVlcl9mcmFtX2R1ciA9IEdldENhcGFTdXBGcmFtZUR1cmF0aW9ucygmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX21pbl9vY3RldHNfcGVyX2ZyYW1lID0gR2V0Q2FwYVN1cE9jdHNQZXJGcmFtZSgmKCppdCkpICYgMHhGRkZGOwotICAgICAgICAgICAgICBwZWVyX21heF9vY3RldHNfcGVyX2ZyYW1lID0gKEdldENhcGFTdXBPY3RzUGVyRnJhbWUoJigqaXQpKSAmIDB4RkZGRjAwMDApID4+IDE2OwotICAgICAgICAgICAgICBwZWVyX21heF9zdXBfbGMzX2ZyYW1lcyA9IEdldENhcGFNYXhTdXBMYzNGcmFtZXMoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9sYzNxX3ByZWYgPSBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRUHJlZigmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX2xjM3FfdmVyID0gR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcigmKCppdCkpOwotICAgICAgICAgICAgICBwZWVyX3ByZWZlcnJlZF9jb250ZXh0ID0gR2V0Q2FwYVByZWZlcnJlZENvbnRleHRzKCYoKml0KSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV84MDAwICYmCi0gICAgICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzgwMDApIHsKLSAgICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGluZyA4S0h6IGZvciBjb25maWciLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgIHBlZXJfY2hhbm5lbF9tb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaXQtPmNoYW5uZWxfbW9kZSk7Ci0gICAgICAgICAgICAgIHBlZXJfZnJhbV9kdXIgPSBHZXRDYXBhU3VwRnJhbWVEdXJhdGlvbnMoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9taW5fb2N0ZXRzX3Blcl9mcmFtZSA9IEdldENhcGFTdXBPY3RzUGVyRnJhbWUoJigqaXQpKSAmIDB4RkZGRjsKLSAgICAgICAgICAgICAgcGVlcl9tYXhfb2N0ZXRzX3Blcl9mcmFtZSA9IChHZXRDYXBhU3VwT2N0c1BlckZyYW1lKCYoKml0KSkgJiAweEZGRkYwMDAwKSA+PiAxNjsKLSAgICAgICAgICAgICAgcGVlcl9tYXhfc3VwX2xjM19mcmFtZXMgPSBHZXRDYXBhTWF4U3VwTGMzRnJhbWVzKCYoKml0KSk7Ci0gICAgICAgICAgICAgIHBlZXJfbGMzcV9wcmVmID0gR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9sYzNxX3ZlciA9IEdldENhcGFWZW5kb3JNZXRhRGF0YUxjM1FWZXIoJigqaXQpKTsKLSAgICAgICAgICAgICAgcGVlcl9wcmVmZXJyZWRfY29udGV4dCA9IEdldENhcGFQcmVmZXJyZWRDb250ZXh0cygmKCppdCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBBQyBwYXJhbWV0ZXJzLCBwZWVyIHN1cHBvcnRlZCBzYW1wbGVfZnJlcW5jaWVzPSVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBjaGFubmVsX21vZGU9JWQsIGZyYW1lX2R1cmE9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJfc2FtcF9mcmVxLCBwZWVyX2NoYW5uZWxfbW9kZSwgcGVlcl9mcmFtX2R1cik7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogUEFDIHBhcmFtZXRlcnMsIG1pbl9vY3RldHNfcGVyX2ZyYW1lPSVkLCIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBtYXhfb2N0ZXRzX3Blcl9mcmFtZT0lZCwgcGVlcl9tYXhfc3VwX2xjM19mcmFtZXM9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGVlcl9taW5fb2N0ZXRzX3Blcl9mcmFtZSwgcGVlcl9tYXhfb2N0ZXRzX3Blcl9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9tYXhfc3VwX2xjM19mcmFtZXMpOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBBQyBwYXJhbWV0ZXJzLCBwZWVyX3ByZWZlcnJlZF9jb250ZXh0PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBlZXJfcHJlZmVycmVkX2NvbnRleHQpOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFBBQyBwYXJhbWV0ZXJzLCBwZWVyX2xjM3FfcHJlZj0lZCwgcGVlcl9sYzNxX3Zlcj0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBlZXJfbGMzcV9wcmVmLCBwZWVyX2xjM3FfdmVyKTsKLQotICAgICAgbG9jYWxfY29kZWNfY29uZmlnID0gZ2V0X2FsbF9jb2RlY19jb25maWdzKHByb2ZpbGVfdHlwZSwgY29udGV4dF90eXBlKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiB2bWNwIGNvZGVjIHNpemU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAodWludDhfdClsb2NhbF9jb2RlY19jb25maWcuc2l6ZSgpKTsKLSAgICAgIGZvciAoYXV0byBpdCA9IGxvY2FsX2NvZGVjX2NvbmZpZy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBsb2NhbF9jb2RlY19jb25maWcuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5jb2RlY190eXBlID09IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzMpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogbG9jYWxfY29kZWNfY29uZmlnIHNhbXBsZV9yYXRlOiAlZCwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdC0+c2FtcGxlX3JhdGUsIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUpOwotICAgICAgICAgIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80ODAwMCAmJgotICAgICAgICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDApIHsKLSAgICAgICAgICAgIHZtY3BfZnJhbV9kdXIgfD0gR2V0RnJhbWVEdXJhdGlvbigmKCppdCkpOwotICAgICAgICAgICAgaWYgKHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA8IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpKQotICAgICAgICAgICAgICB2bWNwX29jdGV0c19wZXJfZnJhbWUgPSBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwICYmCi0gICAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80NDEwMCkgewotICAgICAgICAgICAgdm1jcF9mcmFtX2R1ciB8PSBHZXRGcmFtZUR1cmF0aW9uKCYoKml0KSk7Ci0gICAgICAgICAgICBpZiAodm1jcF9vY3RldHNfcGVyX2ZyYW1lIDwgR2V0T2N0c1BlckZyYW1lKCYoKml0KSkpCi0gICAgICAgICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDAgJiYKLSAgICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzMyMDAwKSB7Ci0gICAgICAgICAgICB2bWNwX2ZyYW1fZHVyIHw9IEdldEZyYW1lRHVyYXRpb24oJigqaXQpKTsKLSAgICAgICAgICAgIGlmICh2bWNwX29jdGV0c19wZXJfZnJhbWUgPCBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKSkKLSAgICAgICAgICAgICAgdm1jcF9vY3RldHNfcGVyX2ZyYW1lID0gR2V0T2N0c1BlckZyYW1lKCYoKml0KSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8yNDAwMCAmJgotICAgICAgICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDApIHsKLSAgICAgICAgICAgIHZtY3BfZnJhbV9kdXIgfD0gR2V0RnJhbWVEdXJhdGlvbigmKCppdCkpOwotICAgICAgICAgICAgaWYgKHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA8IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpKQotICAgICAgICAgICAgICB2bWNwX29jdGV0c19wZXJfZnJhbWUgPSBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwICYmCi0gICAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNjAwMCkgewotICAgICAgICAgICAgdm1jcF9mcmFtX2R1ciB8PSBHZXRGcmFtZUR1cmF0aW9uKCYoKml0KSk7Ci0gICAgICAgICAgICBpZiAodm1jcF9vY3RldHNfcGVyX2ZyYW1lIDwgR2V0T2N0c1BlckZyYW1lKCYoKml0KSkpCi0gICAgICAgICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCAmJgotICAgICAgICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCkgewotICAgICAgICAgICAgdm1jcF9mcmFtX2R1ciB8PSBHZXRGcmFtZUR1cmF0aW9uKCYoKml0KSk7Ci0gICAgICAgICAgICBpZiAodm1jcF9vY3RldHNfcGVyX2ZyYW1lIDwgR2V0T2N0c1BlckZyYW1lKCYoKml0KSkpCi0gICAgICAgICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY29uZmlnX3R5cGUgPT0gU1RFUkVPX0hTX0NPTkZJR18yKQotICAgICAgICB2bWNwX29jdGV0c19wZXJfZnJhbWUgPSB2bWNwX29jdGV0c19wZXJfZnJhbWUgKiAyOwotCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogVk1DUCBwYXJhbWV0ZXJzLCBzYW1wbGVfZnJlcT0lZCwiCi0gICAgICAgICAgICAgICAgICAgICAgICIgZnJhbWVfZHVyYXRpb249JWQsIG9jdGV0cz0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgdm1jcF9zYW1wX2ZyZXEsIHZtY3BfZnJhbV9kdXIsIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSk7Ci0KLSAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuY29kZWNfdHlwZSA9IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzM7Ci0gICAgICByZXN1bHRfY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0gQ29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLQotICAgICAgaWYgKGNvbmZpZ190eXBlID09IFNURVJFT19IU19DT05GSUdfMikgewotICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgfQotCi0gICAgICBzZWxlY3RfYmVzdF9mcmFtZV9kdXJhKChwZWVyX2ZyYW1fZHVyID4+IDEpICYgdm1jcF9mcmFtX2R1ciwgJnJlc3VsdF9jb2RlY19jb25maWcpOwotCi0gICAgICBpZiAodm1jcF9vY3RldHNfcGVyX2ZyYW1lIDwgcGVlcl9taW5fb2N0ZXRzX3Blcl9mcmFtZSB8fAotICAgICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA+IHBlZXJfbWF4X29jdGV0c19wZXJfZnJhbWUpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG9jdGV0cyBwZXIgZnJhbWUgaXMgb3V0IG9mIGJvdW5kOiAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdm1jcF9vY3RldHNfcGVyX2ZyYW1lKTsKLSAgICAgICAgVXBkYXRlT2N0c1BlckZyYW1lKCZyZXN1bHRfY29kZWNfY29uZmlnLCB2bWNwX29jdGV0c19wZXJfZnJhbWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IG9jdGV0cyBwZXIgZnJhbWUgaXMgaW4gbGltaXQgdXBkYXRlIDEwMCBvY3RldHM6ICVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdm1jcF9vY3RldHNfcGVyX2ZyYW1lKTsKLSAgICAgICAgVXBkYXRlT2N0c1BlckZyYW1lKCZyZXN1bHRfY29kZWNfY29uZmlnLCB2bWNwX29jdGV0c19wZXJfZnJhbWUpOy8vVE9ETzogbWFrZSB0aGlzIGFzIHBlZXIgb2N0ZXRzCi0gICAgICB9Ci0KLSAgICAgIGlmIChpc19sYzNxX3N1cHBvcnRlZCkgewotICAgICAgICBVcGRhdGVMYzNRUHJlZmVyZW5jZSgmcmVzdWx0X2NvZGVjX2NvbmZpZywgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBVcGRhdGVDYXBhTWF4U3VwTGMzRnJhbWVzKCZyZXN1bHRfY29kZWNfY29uZmlnLCBwZWVyX21heF9zdXBfbGMzX2ZyYW1lcyk7Ci0gICAgICBVcGRhdGVMYzNCbG9ja3NQZXJTZHUoJnJlc3VsdF9jb2RlY19jb25maWcsIDEpOwotICAgICAgVXBkYXRlUHJlZmVycmVkQXVkaW9Db250ZXh0KCZyZXN1bHRfY29kZWNfY29uZmlnLCBhdWRpb19jb250ZXh0X3R5cGUpOwotICAgICAgKmNvZGVjX2NvbmZpZyA9IHJlc3VsdF9jb2RlY19jb25maWc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBQQUMgcmVjb3JkIG5vdCBmb3VuZCwgc2VsZWN0IG1hbmRhdG9yeSBjb25maWciLCBfX2Z1bmNfXyk7Ci0gICAgICBtYW5kYXRvcnlfY29kZWNfc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGNvZGVjX3ByZWZfY29uZmlnOwotICAgICAgY29kZWNfcHJlZl9jb25maWcgPSBnZXRfYWxsX2NvZGVjX2NvbmZpZ3MocHJvZmlsZV90eXBlLCBjb250ZXh0X3R5cGUpOwotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHZtY3AgY29kZWMgc2l6ZSAlZCIsIF9fZnVuY19fLCAodWludDhfdCljb2RlY19wcmVmX2NvbmZpZy5zaXplKCkpOwotICAgICAgZm9yIChhdXRvIGl0ID0gY29kZWNfcHJlZl9jb25maWcuYmVnaW4oKTsgaXQgIT0gY29kZWNfcHJlZl9jb25maWcuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5jb2RlY190eXBlID09IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzMpIHsKLSAgICAgICAgICBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDApIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZWxlY3RpbmcgNDhLSHogZnJvbSBWTUNQIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgICB2bWNwX2ZyYW1fZHVyIHw9IEdldEZyYW1lRHVyYXRpb24oJigqaXQpKTsKLSAgICAgICAgICAgIGlmICh2bWNwX29jdGV0c19wZXJfZnJhbWUgPCBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKSkKLSAgICAgICAgICAgICAgdm1jcF9vY3RldHNfcGVyX2ZyYW1lID0gR2V0T2N0c1BlckZyYW1lKCYoKml0KSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80NDEwMCkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGluZyA0NC4xS0h6IGZyb20gVk1DUCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgICAgICAgICAgdm1jcF9mcmFtX2R1ciB8PSBHZXRGcmFtZUR1cmF0aW9uKCYoKml0KSk7Ci0gICAgICAgICAgICBpZiAodm1jcF9vY3RldHNfcGVyX2ZyYW1lIDwgR2V0T2N0c1BlckZyYW1lKCYoKml0KSkpCi0gICAgICAgICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDApIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZWxlY3RpbmcgMzJLSHogZnJvbSBWTUNQIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMzIwMDA7Ci0gICAgICAgICAgICB2bWNwX2ZyYW1fZHVyIHw9IEdldEZyYW1lRHVyYXRpb24oJigqaXQpKTsKLSAgICAgICAgICAgIGlmICh2bWNwX29jdGV0c19wZXJfZnJhbWUgPCBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKSkKLSAgICAgICAgICAgICAgdm1jcF9vY3RldHNfcGVyX2ZyYW1lID0gR2V0T2N0c1BlckZyYW1lKCYoKml0KSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2FtcGxlX3JhdGUgPT0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8yNDAwMCkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGluZyAyNEtIeiBmcm9tIFZNQ1AiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8yNDAwMDsKLSAgICAgICAgICAgIHZtY3BfZnJhbV9kdXIgfD0gR2V0RnJhbWVEdXJhdGlvbigmKCppdCkpOwotICAgICAgICAgICAgaWYgKHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA8IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpKQotICAgICAgICAgICAgICB2bWNwX29jdGV0c19wZXJfZnJhbWUgPSBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zYW1wbGVfcmF0ZSA9PSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwKSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc2VsZWN0aW5nIDE2S0h6IGZyb20gVk1DUCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwOwotICAgICAgICAgICAgdm1jcF9mcmFtX2R1ciB8PSBHZXRGcmFtZUR1cmF0aW9uKCYoKml0KSk7Ci0gICAgICAgICAgICBpZiAodm1jcF9vY3RldHNfcGVyX2ZyYW1lIDwgR2V0T2N0c1BlckZyYW1lKCYoKml0KSkpCi0gICAgICAgICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IEdldE9jdHNQZXJGcmFtZSgmKCppdCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNhbXBsZV9yYXRlID09IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGluZyA4S0h6IGZyb20gVk1DUCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzgwMDA7Ci0gICAgICAgICAgICB2bWNwX2ZyYW1fZHVyIHw9IEdldEZyYW1lRHVyYXRpb24oJigqaXQpKTsKLSAgICAgICAgICAgIGlmICh2bWNwX29jdGV0c19wZXJfZnJhbWUgPCBHZXRPY3RzUGVyRnJhbWUoJigqaXQpKSkKLSAgICAgICAgICAgICAgdm1jcF9vY3RldHNfcGVyX2ZyYW1lID0gR2V0T2N0c1BlckZyYW1lKCYoKml0KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb25maWdfdHlwZSA9PSBTVEVSRU9fSFNfQ09ORklHXzIpCi0gICAgICAgIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSA9IHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSAqIDI7Ci0KLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBWTUNQIHBhcmFtZXRlcnMsIGZyYW1lX2R1cmF0aW9uPSVkLCBvY3RldHM9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2bWNwX2ZyYW1fZHVyLCB2bWNwX29jdGV0c19wZXJfZnJhbWUpOwotCi0gICAgICByZXN1bHRfY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPSBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICAgICAgcmVzdWx0X2NvZGVjX2NvbmZpZy5jb2RlY19wcmlvcml0eSA9IENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgICBpZiAoY29uZmlnX3R5cGUgPT0gU1RFUkVPX0hTX0NPTkZJR18yKQotICAgICAgICByZXN1bHRfY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9IENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdF9jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0gQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICAvL3NlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKHBlZXJfc2FtcF9mcmVxICYgdm1jcF9zYW1wX2ZyZXEsICZyZXN1bHRfY29kZWNfY29uZmlnLCBjb250ZXh0X3R5cGUpOwotICAgICAgc2VsZWN0X2Jlc3RfZnJhbWVfZHVyYSh2bWNwX2ZyYW1fZHVyLCAmcmVzdWx0X2NvZGVjX2NvbmZpZyk7Ci0gICAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJnJlc3VsdF9jb2RlY19jb25maWcsIHZtY3Bfb2N0ZXRzX3Blcl9mcmFtZSk7Ci0gICAgICBpZiAoaXNfbGMzcV9zdXBwb3J0ZWQpIHsKLSAgICAgICAgVXBkYXRlTGMzUVByZWZlcmVuY2UoJnJlc3VsdF9jb2RlY19jb25maWcsIHRydWUpOwotICAgICAgfQotICAgICAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZyZXN1bHRfY29kZWNfY29uZmlnLCAxKTsvL2N1cnJlbnRseSBtYWtpbmcgaXQgZm9yIG1lZGlhIGNhc2UKLSAgICAgIFVwZGF0ZVByZWZlcnJlZEF1ZGlvQ29udGV4dCgmcmVzdWx0X2NvZGVjX2NvbmZpZywgYXVkaW9fY29udGV4dF90eXBlKTsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzYXZlZCBjb2RlYyBjb25maWciLCBfX2Z1bmNfXyk7Ci0gICAgICAqY29kZWNfY29uZmlnID0gcmVzdWx0X2NvZGVjX2NvbmZpZzsKLSAgICB9Ci19Ci0KLXVpbnQxNl90IGJ0aWZfYWNtX2dldF9zYW1wbGVfcmF0ZSgpIHsKLSAgaWYgKGN1cnJlbnRfYWN0aXZlX2NvbmZpZy5zYW1wbGVfcmF0ZSAhPQotICAgICAgICAgICAgICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfTk9ORSkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dOiVzOiBzYW1wbGVfcmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjdXJyZW50X2FjdGl2ZV9jb25maWcuc2FtcGxlX3JhdGUpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY3VycmVudF9hY3RpdmVfY29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCJbQUNNXTolczogZGVmYXVsdCBzYW1wbGVfcmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZWZhdWx0X2NvbmZpZy5zYW1wbGVfcmF0ZSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihkZWZhdWx0X2NvbmZpZy5zYW1wbGVfcmF0ZSk7Ci0gIH0KLX0KLQotdWludDhfdCBidGlmX2FjbV9nZXRfY2hfbW9kZSgpIHsKLSAgaWYgKGN1cnJlbnRfYWN0aXZlX2NvbmZpZy5jaGFubmVsX21vZGUgIT0KLSAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9OT05FKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiW0FDTV06JXM6IGNoYW5uZWwgbW9kZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgX19mdW5jX18sIGN1cnJlbnRfYWN0aXZlX2NvbmZpZy5jaGFubmVsX21vZGUpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihjdXJyZW50X2FjdGl2ZV9jb25maWcuY2hhbm5lbF9tb2RlKTsKLSAgfSBlbHNlIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCJbQUNNXTolczogY2hhbm5lbCBtb2RlID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZWZhdWx0X2NvbmZpZy5jaGFubmVsX21vZGUpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihkZWZhdWx0X2NvbmZpZy5jaGFubmVsX21vZGUpOwotICB9Ci19Ci0KLXVpbnQzMl90IGJ0aWZfYWNtX2dldF9iaXRyYXRlKCkgewotICAgIC8vYmFzZWQgb24gYml0cmF0ZSBzZXQgKDEwMCg4MGticHMpLCAxMjAgKDk2a2JwcyksIDE1NSAoMTI4a2JwcykpCi0gICAgdWludDMyX3QgYml0cmF0ZSA9IDA7Ci0gICAgdWludDE2X3Qgb2N0ZXRzID0gc3RhdGljX2Nhc3Q8aW50PihHZXRPY3RzUGVyRnJhbWUoJmN1cnJlbnRfYWN0aXZlX2NvbmZpZykpOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dOiVzOiBvY3RldHMgPSAlZCIsX19mdW5jX18sIG9jdGV0cyk7Ci0KLSAgICBzd2l0Y2ggKG9jdGV0cykgewotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgIGJpdHJhdGUgPSAyNzgwMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgIGlmIChidGlmX2FjbV9nZXRfc2FtcGxlX3JhdGUoKSA9PQotICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMCkpKSB7Ci0gICAgICAgICAgICBiaXRyYXRlID0gMjQwMDA7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJpdHJhdGUgPSAzMjAwMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICBiaXRyYXRlID0gMzIwMDA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICBiaXRyYXRlID0gNDgwMDA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICBpZiAoYnRpZl9hY21fZ2V0X3NhbXBsZV9yYXRlKCkgPT0KLSAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQxNl90PihDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzI0MDAwKSkpIHsKLSAgICAgICAgICAgIGJpdHJhdGUgPSA0ODAwMDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYml0cmF0ZSA9IDY0MDAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDgwOgotICAgICAgICAgIGJpdHJhdGUgPSA2NDAwMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDk4OgotICAgICAgICBjYXNlIDEzMDoKLSAgICAgICAgICBiaXRyYXRlID0gOTU1NTA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA3NToKLSAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgYml0cmF0ZSA9IDgwMDAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgIGNhc2UgMTIwOgotICAgICAgICAgIGJpdHJhdGUgPSA5NjAwMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgY2FzZSAxNTU6Ci0gICAgICAgICAgYml0cmF0ZSA9IDEyNDAwMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJpdHJhdGUgPSAxMjQwMDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dJXM6IGJpdHJhdGUgPSAlZCIsX19mdW5jX18sYml0cmF0ZSk7Ci0gICAgcmV0dXJuIGJpdHJhdGU7Ci19Ci0KLXVpbnQzMl90IGJ0aWZfYWNtX2dldF9vY3RldHModWludDMyX3QgYml0X3JhdGUpIHsKLSAgICB1aW50MzJfdCBvY3RldHMgPSAwOwotICAgIG9jdGV0cyA9IEdldE9jdHNQZXJGcmFtZSgmY3VycmVudF9hY3RpdmVfY29uZmlnKTsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCJbQUNNXSVzOiBvY3RldHMgPSAlZCIsX19mdW5jX18sb2N0ZXRzKTsKLSAgICByZXR1cm4gb2N0ZXRzOwotfQotCi11aW50MTZfdCBidGlmX2FjbV9nZXRfZnJhbWVsZW5ndGgoKSB7Ci0gIHVpbnQxNl90IGZyYW1lX2R1cmF0aW9uOwotICBzd2l0Y2ggKEdldEZyYW1lRHVyYXRpb24oJmN1cnJlbnRfYWN0aXZlX2NvbmZpZykpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgZnJhbWVfZHVyYXRpb24gPSA3NTAwOyAvLzcuNW1zZWMKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMToKLSAgICAgICAgZnJhbWVfZHVyYXRpb24gPSAxMDAwMDsgLy8xMG1zZWMKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZyYW1lX2R1cmF0aW9uID0gMTAwMDA7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiW0FDTV0lczogZnJhbWUgZHVyYXRpb24gPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyxmcmFtZV9kdXJhdGlvbik7Ci0gIHJldHVybiBmcmFtZV9kdXJhdGlvbjsKLX0KLQotdWludDE2X3QgYnRpZl9hY21fZ2V0X2N1cnJlbnRfYWN0aXZlX3Byb2ZpbGUoKSB7Ci0gICAgcmV0dXJuIGN1cnJlbnRfYWN0aXZlX3Byb2ZpbGVfdHlwZTsKLX0KLXVpbnQ4X3QgYnRpZl9hY21fZ2V0X2NoX2NvdW50KCkgey8vdXBkYXRlIGNoYW5uZWwgbW9kZSBiYXNlZCBvbiBkZXZpY2UgY29ubmVjdGlvbgotICAgIHVpbnQ4X3QgY2hfbW9kZSA9IDA7Ci0gICAgaWYgKGN1cnJlbnRfYWN0aXZlX2NvbmZpZy5jaGFubmVsX21vZGUgPT0KLSAgICAgICAgQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgICAgY2hfbW9kZSA9IDB4MDI7Ci0gICAgfSBlbHNlIGlmIChjdXJyZW50X2FjdGl2ZV9jb25maWcuY2hhbm5lbF9tb2RlID09Ci0gICAgICAgICAgICAgICBDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgICAgY2hfbW9kZSA9IDB4MDE7Ci0gICAgfQotICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dJXM6IGNoYW5uZWwgY291bnQgPSAlZCIsX19mdW5jX18sY2hfbW9kZSk7Ci0gICAgcmV0dXJuIGNoX21vZGU7Ci19Ci0KLWJvb2wgYnRpZl9hY21faXNfY29kZWNfdHlwZV9sYzNxKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJbQUNNXSVzIixfX2Z1bmNfXyk7Ci0gIHJldHVybiBHZXRWZW5kb3JNZXRhRGF0YUxjM1FQcmVmKCZjdXJyZW50X2FjdGl2ZV9jb25maWcpOwotfQotCi11aW50OF90IGJ0aWZfYWNtX2xjM3FfdmVyKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJbQUNNXSVzIixfX2Z1bmNfXyk7Ci0gIHJldHVybiBHZXRWZW5kb3JNZXRhRGF0YUxjM1FWZXIoJmN1cnJlbnRfYWN0aXZlX2NvbmZpZyk7Ci19Ci0KLXVpbnQxNl90IGJ0aWZfYWNtX2JhcF90b19hY21fY29udGV4dCh1aW50MTZfdCBiYXBfY29udGV4dCkgewotICBzd2l0Y2ggKGJhcF9jb250ZXh0KSB7Ci0gICAgY2FzZSBDT05URU5UX1RZUEVfTUVESUE6Ci0gICAgY2FzZSBDT05URU5UX1RZUEVfTElWRToKLSAgICAgIHJldHVybiBDT05URVhUX1RZUEVfTVVTSUM7Ci0KLSAgICBjYXNlIENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDoKLSAgICAgIHJldHVybiBDT05URVhUX1RZUEVfVk9JQ0U7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IFVua25vd24gYmFwIGNvbnRleHQiLF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBDT05URVhUX1RZUEVfVU5LTk9XTjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RlYnVnX2FjbV9wZWVyX2R1bXAoaW50IGZkLCBjb25zdCBCdGlmQWNtUGVlciYgcGVlcikgewotICBzdGQ6OnN0cmluZyBzdGF0ZV9zdHI7Ci0gIGludCBzdGF0ZSA9IHBlZXIuU3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpOwotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlOgotICAgICAgc3RhdGVfc3RyID0gIklkbGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZU9wZW5pbmc6Ci0gICAgICBzdGF0ZV9zdHIgPSAiT3BlbmluZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlT3BlbmVkOgotICAgICAgc3RhdGVfc3RyID0gIk9wZW5lZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQnRpZkFjbVN0YXRlTWFjaGluZTo6a1N0YXRlU3RhcnRlZDoKLSAgICAgIHN0YXRlX3N0ciA9ICJTdGFydGVkIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCdGlmQWNtU3RhdGVNYWNoaW5lOjprU3RhdGVSZWNvbmZpZ3VyaW5nOgotICAgICAgc3RhdGVfc3RyID0gIlJlY29uZmlndXJpbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJ0aWZBY21TdGF0ZU1hY2hpbmU6OmtTdGF0ZUNsb3Npbmc6Ci0gICAgICBzdGF0ZV9zdHIgPSAiQ2xvc2luZyI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGF0ZV9zdHIgPSAiVW5rbm93bigiICsgc3RkOjp0b19zdHJpbmcoc3RhdGUpICsgIikiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBkcHJpbnRmKGZkLCAiICBQZWVyOiAlc1xuIiwgcGVlci5QZWVyQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGRwcmludGYoZmQsICIgICAgQ29ubmVjdGVkOiAlc1xuIiwgcGVlci5Jc0Nvbm5lY3RlZCgpID8gInRydWUiIDogImZhbHNlIik7Ci0gIGRwcmludGYoZmQsICIgICAgU3RyZWFtaW5nOiAlc1xuIiwgcGVlci5Jc1N0cmVhbWluZygpID8gInRydWUiIDogImZhbHNlIik7Ci0gIGRwcmludGYoZmQsICIgICAgU3RhdGUgTWFjaGluZTogJXNcbiIsIHN0YXRlX3N0ci5jX3N0cigpKTsKLSAgZHByaW50ZihmZCwgIiAgICBGbGFnczogJXNcbiIsIHBlZXIuRmxhZ3NUb1N0cmluZygpLmNfc3RyKCkpOwotCi19Ci0KLWJvb2wgY29tcGFyZV9jb2RlY19jb25maWdfKENvZGVjQ29uZmlnICZmaXJzdCwgQ29kZWNDb25maWcgJnNlY29uZCkgewotICAgIGlmIChmaXJzdC5jb2RlY190eXBlICE9IHNlY29uZC5jb2RlY190eXBlKSB7Ci0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJbQUNNXSBDb2RlYyB0eXBlIG1pc21hdGNoICVzIixfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGZpcnN0LnNhbXBsZV9yYXRlICE9IHNlY29uZC5zYW1wbGVfcmF0ZSkgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiW0FDTV0gU2FtcGxlIHJhdGUgbWlzbWF0Y2ggJXMiLF9fZnVuY19fKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAoZmlyc3QuYml0c19wZXJfc2FtcGxlICE9IHNlY29uZC5iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dIEJpdHMgcGVyIHNhbXBsZSBtaXNtYXRjaCAlcyIsX19mdW5jX18pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChmaXJzdC5jaGFubmVsX21vZGUgIT0gc2Vjb25kLmNoYW5uZWxfbW9kZSkgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiW0FDTV0gQ2hhbm5lbCBtb2RlIG1pc21hdGNoICVzIixfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgdWludDhfdCBmcmFtZV9maXJzdCA9IEdldEZyYW1lRHVyYXRpb24oJmZpcnN0KTsKLSAgICAgIHVpbnQ4X3QgZnJhbWVfc2Vjb25kID0gR2V0RnJhbWVEdXJhdGlvbigmc2Vjb25kKTsKLSAgICAgIGlmIChmcmFtZV9maXJzdCAhPSBmcmFtZV9zZWNvbmQpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiW0FDTV0gZnJhbWUgZHVyYXRpb24gbWlzbWF0Y2ggJXMiLF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICB1aW50OF90IGxjM2Jsb2Nrc3BlcnNkdV9maXJzdCA9IEdldExjM0Jsb2Nrc1BlclNkdSgmZmlyc3QpOwotICAgICAgdWludDhfdCBsYzNibG9ja3NwZXJzZHVfc2Vjb25kID0gR2V0TGMzQmxvY2tzUGVyU2R1KCZzZWNvbmQpOwotICAgICAgaWYgKGxjM2Jsb2Nrc3BlcnNkdV9maXJzdCAhPSBsYzNibG9ja3NwZXJzZHVfc2Vjb25kKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dIExDM2Jsb2NrcyBwZXIgU0RVIG1pc21hdGNoICVzIixfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgdWludDE2X3Qgb2N0ZXRzX2ZpcnN0ID0gR2V0T2N0c1BlckZyYW1lKCZmaXJzdCk7Ci0gICAgICB1aW50MTZfdCBvY3RldHNfc2Vjb25kID0gR2V0T2N0c1BlckZyYW1lKCZzZWNvbmQpOwotICAgICAgaWYgKG9jdGV0c19maXJzdCAhPSBvY3RldHNfc2Vjb25kKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIltBQ01dIExDMyBvY3RldHMgbWlzbWF0Y2ggJXMiLF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIHByaW50X2NvZGVjX3BhcmFtZXRlcnMoQ29kZWNDb25maWcgY29uZmlnKSB7Ci0gIHVpbnQ4X3QgZnJhbWUgPSBHZXRGcmFtZUR1cmF0aW9uKCZjb25maWcpOwotICB1aW50OF90IGxjM2Jsb2Nrc3BlcnNkdSA9IEdldExjM0Jsb2Nrc1BlclNkdSgmY29uZmlnKTsKLSAgdWludDE2X3Qgb2N0ZXRzID0gR2V0T2N0c1BlckZyYW1lKCZjb25maWcpOwotICBib29sIHZlbmRvcm1ldGFkYXRhbGMzcXByZWYgPSBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRUHJlZigmY29uZmlnKTsKLSAgdWludDhfdCB2ZW5kb3JtZXRhZGF0YWxjM3F2ZXIgPSBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRVmVyKCZjb25maWcpOwotICBMT0dfREVCVUcoCi0gICAgTE9HX1RBRywKLSAgICAiY29kZWNfdHlwZT0lZCBjb2RlY19wcmlvcml0eT0lZCAiCi0gICAgInNhbXBsZV9yYXRlPTB4JXggYml0c19wZXJfc2FtcGxlPTB4JXggIgotICAgICJjaGFubmVsX21vZGU9MHgleCIsCi0gICAgY29uZmlnLmNvZGVjX3R5cGUsIGNvbmZpZy5jb2RlY19wcmlvcml0eSwKLSAgICBjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgY29uZmlnLmNoYW5uZWxfbW9kZSk7Ci0gIExPR19ERUJVRygKLSAgICBMT0dfVEFHLAotICAgICJmcmFtZV9kdXJhdGlvbj0lZCwgbGMzX2Jsb2Nrc19wZXJfU0RVPSVkLCIKLSAgICAiIG9jdGV0c19wZXJfZnJhbWU9JWQsIHZlbmRvcm1ldGFkYXRhbGMzcXByZWY9JWQsIgotICAgICIgdmVuZG9ybWV0YWRhdGFsYzNxdmVyPSVkICIsCi0gICAgZnJhbWUsIGxjM2Jsb2Nrc3BlcnNkdSwgb2N0ZXRzLAotICAgIHZlbmRvcm1ldGFkYXRhbGMzcXByZWYsIHZlbmRvcm1ldGFkYXRhbGMzcXZlcik7Ci19Ci0KLXZvaWQgcHJpbnRfcW9zX3BhcmFtZXRlcnMoUW9zQ29uZmlnIHFvcykgewotICAgIExPR19ERUJVRygKLSAgICBMT0dfVEFHLAotICAgICJDSUcgLS0+IGNpZ19pZD0lZCBjaXNfY291bnQ9JWQgIgotICAgICJwYWNraW5nPSVkIGZyYW1pbmc9JWQgIgotICAgICJtYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3M9JWQgIgotICAgICJtYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX209JWQgIgotICAgICJzZHVfaW50ZXJ2YWxfbV90b19zWzBdID0gJXggIgotICAgICJzZHVfaW50ZXJ2YWxfbV90b19zWzFdID0gJXggIgotICAgICJzZHVfaW50ZXJ2YWxfbV90b19zWzJdID0gJXggIiwKLSAgICBxb3MuY2lnX2NvbmZpZy5jaWdfaWQsIHFvcy5jaWdfY29uZmlnLmNpc19jb3VudCwKLSAgICBxb3MuY2lnX2NvbmZpZy5wYWNraW5nLCBxb3MuY2lnX2NvbmZpZy5mcmFtaW5nLAotICAgIHFvcy5jaWdfY29uZmlnLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICBxb3MuY2lnX2NvbmZpZy5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgcW9zLmNpZ19jb25maWcuc2R1X2ludGVydmFsX21fdG9fc1swXSwKLSAgICBxb3MuY2lnX2NvbmZpZy5zZHVfaW50ZXJ2YWxfbV90b19zWzFdLAotICAgIHFvcy5jaWdfY29uZmlnLnNkdV9pbnRlcnZhbF9tX3RvX3NbMl0pOwotICAgIGZvciAoYXV0byBpdCA9IHFvcy5jaXNfY29uZmlncy5iZWdpbigpOyBpdCAhPSBxb3MuY2lzX2NvbmZpZ3MuZW5kKCk7ICsraXQpIHsKLSAgICAgIExPR19ERUJVRygKLSAgICAgIExPR19UQUcsCi0gICAgICAiQ0lTIC0tPiBjaXNfaWQgPSAlZCBtYXhfc2R1X21fdG9fcyA9ICVkICIKLSAgICAgICJtYXhfc2R1X3NfdG9fbT0lZCAiCi0gICAgICAicGh5X21fdG9fcyA9ICVkICIKLSAgICAgICJwaHlfc190b19tID0gJWQgIgotICAgICAgInJ0bl9tX3RvX3MgPSAlZCAiCi0gICAgICAicnRuX3NfdG9fbSA9ICVkIiwKLSAgICAgIGl0LT5jaXNfaWQsIGl0LT5tYXhfc2R1X21fdG9fcywKLSAgICAgIGl0LT5tYXhfc2R1X3NfdG9fbSwKLSAgICAgIGl0LT5waHlfbV90b19zLCBpdC0+cGh5X3NfdG9fbSwKLSAgICAgIGl0LT5ydG5fbV90b19zLCBpdC0+cnRuX3NfdG9fbSk7Ci0gICAgfQotICAgIGZvciAoYXV0byBpdCA9IHFvcy5hc2NzX2NvbmZpZ3MuYmVnaW4oKTsgaXQgIT0gcW9zLmFzY3NfY29uZmlncy5lbmQoKTsgKytpdCkgewotICAgICAgTE9HX0RFQlVHKAotICAgICAgICBMT0dfVEFHLAotICAgICAgICAiQVNDUyAtLT4gY2lnX2lkID0gJWQgY2lzX2lkID0gJWQgIgotICAgICAgICAidGFyZ2V0X2xhdGVuY3k9JWQgIgotICAgICAgICAiYmlfZGlyZWN0aW9uYWwgPSAlZCAiCi0gICAgICAgICJwcmVzZW50YXRpb25fZGVsYXlbMF0gPSAleCAiCi0gICAgICAgICJwcmVzZW50YXRpb25fZGVsYXlbMV0gPSAleCAiCi0gICAgICAgICJwcmVzZW50YXRpb25fZGVsYXlbMl0gPSAleCAiLAotICAgICAgICBpdC0+Y2lnX2lkLAotICAgICAgICBpdC0+Y2lzX2lkLAotICAgICAgICBpdC0+dGFyZ2V0X2xhdGVuY3ksCi0gICAgICAgIGl0LT5iaV9kaXJlY3Rpb25hbCwKLSAgICAgICAgaXQtPnByZXNlbnRhdGlvbl9kZWxheVswXSwKLSAgICAgICAgaXQtPnByZXNlbnRhdGlvbl9kZWxheVsxXSwKLSAgICAgICAgaXQtPnByZXNlbnRhdGlvbl9kZWxheVsyXSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBidGlmX2RlYnVnX2FjbV9pbml0aWF0b3JfZHVtcChpbnQgZmQpIHsKLSAgYm9vbCBlbmFibGVkID0gYnRpZl9hY21faW5pdGlhdG9yLkVuYWJsZWQoKTsKLQotICBkcHJpbnRmKGZkLCAiXG5BMkRQIFNvdXJjZSBTdGF0ZTogJXNcbiIsIChlbmFibGVkKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICBpZiAoIWVuYWJsZWQpIHJldHVybjsKLSAgLy9kcHJpbnRmKGZkLCAiICBBY3RpdmUgcGVlcjogJXNcbiIsCi0gICAgLy8gICAgICBidGlmX2FjbV9pbml0aWF0b3IuQWN0aXZlUGVlcigpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGZvciAoYXV0byBpdCA6IGJ0aWZfYWNtX2luaXRpYXRvci5QZWVycygpKSB7Ci0gICAgY29uc3QgQnRpZkFjbVBlZXIqIHBlZXIgPSBpdC5zZWNvbmQ7Ci0gICAgYnRpZl9kZWJ1Z19hY21fcGVlcl9kdW1wKGZkLCAqcGVlcik7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2RlYnVnX2FjbV9kdW1wKGludCBmZCkgewotICBidGlmX2RlYnVnX2FjbV9pbml0aWF0b3JfZHVtcChmZCk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9hY21fc291cmNlLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYWNtX3NvdXJjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliOTliZi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9hY21fc291cmNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jaW5jbHVkZSAiYnRpZl9hY21fc291cmNlLmgiCi0jaW5jbHVkZSAiYnRpZl9haGltLmgiCi0jaW5jbHVkZSAiYnRpZl9hY20uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLQotZXh0ZXJuIHRocmVhZF90KiBnZXRfd29ya2VyX3RocmVhZCgpOwotCi0jaWYgQUhJTV9FTkFCTEVECi0KLQotdm9pZCBidGlmX2FjbV9wcm9jZXNzX3JlcXVlc3QodEEyRFBfQ1RSTF9DTUQgY21kKQotewotICB0QTJEUF9DVFJMX0FDSyBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX0ZBSUxVUkU7Ci0gIC8vIHVwZGF0ZSBwZW5kaW5nIGNvbW1hbmQKLSAgYnRpZl9haGltX3VwZGF0ZV9wZW5kaW5nX2NvbW1hbmQoY21kLCBBVURJT19HUk9VUF9NR1IpOwotCi0gIEJUSUZfVFJBQ0VfSU1QKCIlczogY21kICV1IiwgX19mdW5jX18sIGNtZCk7Ci0KLSAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIEEyRFBfQ1RSTF9DTURfU1RBUlQ6Ci0gICAgewotICAgICAgaWYgKGJ0aWZfYWNtX2lzX2NhbGxfYWN0aXZlKCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9JTVAoIiVzOiBjYWxsIGFjdGl2ZSwgcmV0dXJuIGluY2FsbF9mYWlsdXJlIiwgX19mdW5jX18pOwotICAgICAgICBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX0lOQ0FMTF9GQUlMVVJFOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQUNNIGlzIGluIHJpZ2h0IHN0YXRlCi0gICAgICAgIHN0YXR1cyA9IEEyRFBfQ1RSTF9BQ0tfUEVORElORzsKLSAgICAgICAgYnRpZl9hY21fc3RyZWFtX3N0YXJ0KCk7Ci0gICAgICB9Ci0gICAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdGFydGVkKHN0YXR1cywgQVVESU9fR1JPVVBfTUdSKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgQTJEUF9DVFJMX0NNRF9TVVNQRU5EOgotICAgIHsKLSAgICAgIGlmIChidGlmX2FjbV9pc19jYWxsX2FjdGl2ZSgpKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfSU1QKCIlczogY2FsbCBhY3RpdmUsIHJldHVybiBzdWNjZXNzIiwgX19mdW5jX18pOwotICAgICAgICBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX1NVQ0NFU1M7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX1BFTkRJTkc7Ci0gICAgICAgIGJ0aWZfYWNtX3N0cmVhbV9zdXNwZW5kKCk7Ci0gICAgICB9Ci0gICAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdXNwZW5kZWQoc3RhdHVzLCBBVURJT19HUk9VUF9NR1IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBBMkRQX0NUUkxfQ01EX1NUT1A6Ci0gICAgewotICAgICAgc3RhdHVzID0gQTJEUF9DVFJMX0FDS19TVUNDRVNTOwotICAgICAgaWYgKGJ0aWZfYWNtX2lzX2NhbGxfYWN0aXZlKCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9JTVAoIiVzOiBjYWxsIGFjdGl2ZSwgcmV0dXJuIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidGlmX2FjbV9zdHJlYW1fc3RvcCgpOwotICAgICAgfQotICAgICAgYnRpZl9haGltX2Fja19zdHJlYW1fc3VzcGVuZGVkKHN0YXR1cywgQVVESU9fR1JPVVBfTUdSKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgQVBQTF9UUkFDRV9FUlJPUigiJXM6IHVuc3VwcG9ydGVkIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywgY21kKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLQotdm9pZCBidGlmX2FjbV9oYW5kbGVfZXZlbnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pCi17Ci0KLSAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0FDTV9QUk9DRVNTX0hJRExfUkVRX0VWVDoKLSAgICAgIGJ0aWZfYWNtX3Byb2Nlc3NfcmVxdWVzdCgodEEyRFBfQ1RSTF9DTUQgKSAqcF9wYXJhbSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQlRJRl9UUkFDRV9JTVAoIiVzOiB1bmhhbmRsZWQgZXZlbnQiLCBfX2Z1bmNfXyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIHByb2Nlc3NfaGlkbF9yZXFfYWNtKHRBMkRQX0NUUkxfQ01EIGNtZCkKLXsKLSAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2FjbV9oYW5kbGVfZXZlbnQsIEJUSUZfQUNNX1BST0NFU1NfSElETF9SRVFfRVZULCAoY2hhciopJmNtZCwgc2l6ZW9mKGNtZCksIE5VTEwpOwotfQotCi1zdGF0aWMgYnRpZl9haGltX2NsaWVudF9jYWxsYmFja3NfdCBzQWhpbUFjbUNhbGxiYWNrcyA9IHsKLSAgMSwgLy8gbW9kZQotICBwcm9jZXNzX2hpZGxfcmVxX2FjbSwKLSAgYnRpZl9hY21fZ2V0X3NhbXBsZV9yYXRlLAotICBidGlmX2FjbV9nZXRfY2hfbW9kZSwKLSAgYnRpZl9hY21fZ2V0X2JpdHJhdGUsCi0gIGJ0aWZfYWNtX2dldF9vY3RldHMsCi0gIGJ0aWZfYWNtX2dldF9mcmFtZWxlbmd0aCwKLSAgYnRpZl9hY21fZ2V0X2NoX2NvdW50LAotICBudWxscHRyLAotICBidGlmX2FjbV9nZXRfY3VycmVudF9hY3RpdmVfcHJvZmlsZSwKLSAgYnRpZl9hY21faXNfY29kZWNfdHlwZV9sYzNxLAotICBidGlmX2FjbV9sYzNxX3ZlcgotfTsKLQotdm9pZCBidGlmX3JlZ2lzdGVyX2NiKCkKLXsKLSAgcmVnX2NiX3dpdGhfYWhpbShBVURJT19HUk9VUF9NR1IsICZzQWhpbUFjbUNhbGxiYWNrcyk7Ci19Ci0KLWJ0X3N0YXR1c190IGJ0aWZfYWNtX3NvdXJjZV9zZXR1cF9jb2RlYygpIHsKLSAgQVBQTF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gQlRfU1RBVFVTX0ZBSUw7Ci0KLQotICBBUFBMX1RSQUNFX0VWRU5UKCIlcyAjIyBzZXR1cF9jb2RlYyAjIyIsIF9fZnVuY19fKTsKLSAgYnRpZl9haGltX3NldHVwX2NvZGVjKEFVRElPX0dST1VQX01HUik7Ci0KLSAgLy8gVE9ETzogY2hlY2sgdGhlIHN0YXR1cwotICByZXR1cm4gc3RhdHVzOwotfQotCi1ib29sIGJ0aWZfYWNtX3NvdXJjZV9zdGFydF9zZXNzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBCVF9TVEFUVVNfRkFJTDsKLSAgQVBQTF9UUkFDRV9ERUJVRygiJXM6IHN0YXJ0aW5nIHNlc3Npb24gZm9yIEJEIGFkZHIgJXMiLF9fZnVuY19fLAotICAgICAgICBwZWVyX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvLyBpbml0aWFsaXplIGhhbC4KLSAgYnRpZl9haGltX2luaXRfaGFsKGdldF93b3JrZXJfdGhyZWFkKCksIEFVRElPX0dST1VQX01HUik7Ci0KLSAgc3RhdHVzID0gYnRpZl9hY21fc291cmNlX3NldHVwX2NvZGVjKCk7Ci0KLSAgYnRpZl9haGltX3N0YXJ0X3Nlc3Npb24oKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBidGlmX2FjbV9zb3VyY2VfZW5kX3Nlc3Npb24oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiBzdGFydGluZyBzZXNzaW9uIGZvciBCRCBhZGRyICVzIixfX2Z1bmNfXywKLSAgICAgICAgcGVlcl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgYnRpZl9haGltX2VuZF9zZXNzaW9uKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYnRpZl9hY21fc291cmNlX3Jlc3RhcnRfc2Vzc2lvbihjb25zdCBSYXdBZGRyZXNzJiBvbGRfcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBuZXdfcGVlcl9hZGRyZXNzKSB7Ci0gIGJvb2wgaXNfc3RyZWFtaW5nID0gYnRpZl9haGltX2lzX3N0cmVhbWluZygpOwotICBTZXNzaW9uVHlwZSBzZXNzaW9uX3R5cGUgPSBidGlmX2FoaW1fZ2V0X3Nlc3Npb25fdHlwZSgpOwotCi0gIEFQUExfVFJBQ0VfSU1QKCIlczogb2xkX3BlZXJfYWRkcmVzcz0lcywgbmV3X3BlZXJfYWRkcmVzcz0lcywgaXNfc3RyZWFtaW5nPSVkICIsCi0gICAgICBfX2Z1bmNfXywgb2xkX3BlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgbmV3X3BlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGlzX3N0cmVhbWluZyk7Ci0KLSAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIG5ldyBlbXB0eSBhZGRyZXNzCi0gIC8vQ0hFQ0soIW5ld19wZWVyX2FkZHJlc3MuSXNFbXB0eSgpKTsKLQotICAvLyBJZiB0aGUgb2xkIGFjdGl2ZSBwZWVyIHdhcyB2YWxpZCBvciBpZiBzZXNzaW9uIGlzIG5vdAotICAvLyB1bmtub3duLCBlbmQgdGhlIG9sZCBzZXNzaW9uLgotICBpZiAoIW9sZF9wZWVyX2FkZHJlc3MuSXNFbXB0eSgpIHx8Ci0gICAgc2Vzc2lvbl90eXBlICE9IFNlc3Npb25UeXBlOjpVTktOT1dOKSB7Ci0gICAgYnRpZl9hY21fc291cmNlX2VuZF9zZXNzaW9uKG9sZF9wZWVyX2FkZHJlc3MpOwotICB9Ci0KLSAgYnRpZl9hY21fc291cmNlX3N0YXJ0X3Nlc3Npb24obmV3X3BlZXJfYWRkcmVzcyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYnRpZl9hY21fdXBkYXRlX3NpbmtfbGF0ZW5jeV9jaGFuZ2UodWludDE2X3Qgc2lua19sYXRlbmN5KSB7Ci0gIEFQUExfVFJBQ0VfREVCVUcoIiVzOiB1cGRhdGVfc2lua19sYXRlbmN5ICVkIGZvciBhY3RpdmUgc2Vzc2lvbiAiLF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rX2xhdGVuY3kpOwotCi0gIGJ0aWZfYWhpbV9zZXRfcmVtb3RlX2RlbGF5KHNpbmtfbGF0ZW5jeSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgYnRpZl9hY21fc291cmNlX2NvbW1hbmRfYWNrKHRBMkRQX0NUUkxfQ01EIGNtZCwgdEEyRFBfQ1RSTF9BQ0sgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBBMkRQX0NUUkxfQ01EX1NUQVJUOgotICAgICAgYnRpZl9haGltX2Fja19zdHJlYW1fc3RhcnRlZChzdGF0dXMsIEFVRElPX0dST1VQX01HUik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfQ1RSTF9DTURfU1VTUEVORDoKLSAgICBjYXNlIEEyRFBfQ1RSTF9DTURfU1RPUDoKLSAgICAgIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N1c3BlbmRlZChzdGF0dXMsIEFVRElPX0dST1VQX01HUik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBidGlmX2FjbV9zb3VyY2Vfb25fc3RvcHBlZCh0QTJEUF9DVFJMX0FDSyBzdGF0dXMpIHsKLSAgQVBQTF9UUkFDRV9FVkVOVCgiJXM6IHN0YXR1cyAldSIsIF9fZnVuY19fLCBzdGF0dXMpOwotCi0gIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N1c3BlbmRlZChzdGF0dXMsIEFVRElPX0dST1VQX01HUik7Ci0KLSAgYnRpZl9haGltX3Jlc2V0X3BlbmRpbmdfY29tbWFuZChBVURJT19HUk9VUF9NR1IpOwotfQotCi12b2lkIGJ0aWZfYWNtX3NvdXJjZV9vbl9zdXNwZW5kZWQodEEyRFBfQ1RSTF9BQ0sgc3RhdHVzKSB7Ci0gIEFQUExfVFJBQ0VfRVZFTlQoIiVzOiBzdGF0dXMgJXUiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQotICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdXNwZW5kZWQoc3RhdHVzLCBBVURJT19HUk9VUF9NR1IpOwotCi0gIGJ0aWZfYWhpbV9yZXNldF9wZW5kaW5nX2NvbW1hbmQoQVVESU9fR1JPVVBfTUdSKTsKLX0KLQotYm9vbCBidGlmX2FjbV9vbl9zdGFydGVkKHRBMkRQX0NUUkxfQUNLIHN0YXR1cykgewotICBBUFBMX1RSQUNFX0VWRU5UKCIlczogc3RhdHVzICV1IiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gIGJvb2wgcmV0dmFsID0gZmFsc2U7Ci0KLSAgaWYoMC8qIFRPRE86IGNoZWNrIGlmIGNhbGwgaXMgaW4gcHJvZ3Jlc3MqLykgewotICAgIEFQUExfVFJBQ0VfV0FSTklORygiJXM6IGNhbGwgaW4gcHJvZ3Jlc3MsIHNlbmRpbmcgZmFpbHVyZSIsIF9fZnVuY19fKTsKLSAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfSU5DQUxMX0ZBSUxVUkUsIEFVRElPX0dST1VQX01HUik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYnRpZl9haGltX2Fja19zdHJlYW1fc3RhcnRlZChzdGF0dXMsIEFVRElPX0dST1VQX01HUik7Ci0gICAgcmV0dmFsID0gdHJ1ZTsKLSAgfQotCi0gIGJ0aWZfYWhpbV9yZXNldF9wZW5kaW5nX2NvbW1hbmQoQVVESU9fR1JPVVBfTUdSKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0jZW5kaWYgLy8gQUhJTV9FTkFCTEVECmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9hcG0uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9hcG0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjVhNmYuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYXBtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBMT0dfVEFHICJidGlmX2FwbSIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYXBtLmg+Ci0KLSNpbmNsdWRlICJidF9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfYWhpbS5oIgotCi0jZGVmaW5lIEEyRFBfUFJPRklMRSAweDAwMDEKLSNkZWZpbmUgQlJPQURDQVNUX0JSRURSIDB4MDQwMAotI2RlZmluZSBCUk9BRENBU1RfTEUgMHgwODAwCi0jZGVmaW5lIEFDVElWRV9WT0lDRV9QUk9GSUxFX0hGUCAweDAwMDIKLQotc3RkOjptdXRleCBhcG1fbXV0ZXg7Ci1idGFwbV9pbml0aWF0b3JfY2FsbGJhY2tzX3QqIGNhbGxiYWNrc187Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0KGJ0YXBtX2luaXRpYXRvcl9jYWxsYmFja3NfdCogY2FsbGJhY2tzKTsKLXN0YXRpYyB2b2lkIGNsZWFudXAoKTsKLXN0YXRpYyBidF9zdGF0dXNfdCB1cGRhdGVfYWN0aXZlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwcm9maWxlLCB1aW50MTZfdCBhdWRpb190eXBlKTsKLXN0YXRpYyBidF9zdGF0dXNfdCBzZXRfY29udGVudF9jb250cm9sX2lkKHVpbnQxNl90IGNvbnRlbnRfY29udHJvbF9pZCwgdWludDE2X3QgYXVkaW9fdHlwZSk7Ci1zdGF0aWMgYm9vbCBhcG1fZW5hYmxlZCA9IGZhbHNlOwotCi0KLSNkZWZpbmUgQ0hFQ0tfQlRBUE1fSU5JVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFhcG1fZW5hYmxlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogQlRBViBub3QgaW5pdGlhbGl6ZWQiLCBfX2Z1bmNfXyk7ICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi10eXBlZGVmIGVudW0gewotICBCVElGX0FQTV9BVURJT19UWVBFX1ZPSUNFID0gMHgwLAotICBCVElGX0FQTV9BVURJT19UWVBFX01FRElBLAotCi0gIEJUSUZfQVBNX0FVRElPX1RZUEVfU0laRQotfSBidGlmX2F2X3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBwZWVyX2JkYTsKLSAgaW50IHByb2ZpbGU7Ci19IGJ0aWZfYXBtX2RldmljZV9wcm9maWxlX2NvbWJvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBwZWVyX2JkYTsKLX0gYnRpZl9hcG1fZ2V0X2FjdGl2ZV9wcm9maWxlOwotCi1pbnQgYWN0aXZlX3Byb2ZpbGVfaW5mbzsKLQotc3RhdGljIGJ0aWZfYXBtX2RldmljZV9wcm9maWxlX2NvbWJvX3QgYWN0aXZlX2RldmljZV9wcm9maWxlW0JUSUZfQVBNX0FVRElPX1RZUEVfU0laRV07Ci1zdGF0aWMgdWludDE2X3QgY29udGVudF9jb250cm9sX2lkW0JUSUZfQVBNX0FVRElPX1RZUEVfU0laRV07Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfdXBkYXRlX2FjdGl2ZV9kZXZpY2UodWludDE2X3QgYXVkaW9fdHlwZSwgY2hhciogcGFyYW0pOwotdm9pZCBidGlmX2dldF9hY3RpdmVfZGV2aWNlKGJ0aWZfYXZfc3RhdGVfdCBhdWRpb190eXBlLCBSYXdBZGRyZXNzKiBwZWVyX2JkYSk7Ci1zdGF0aWMgdm9pZCBidGlmX3VwZGF0ZV9jb250ZW50X2NvbnRyb2wodWludDE2X3QgYXVkaW9fdHlwZSwgY2hhciogcGFyYW0pOwotdWludDE2X3QgYnRpZl9nZXRfY29udGVudF9jb250cm9sX2lkKGJ0aWZfYXZfc3RhdGVfdCBhdWRpb190eXBlKTsKLQotc3RhdGljIHZvaWQgYnRpZl91cGRhdGVfYWN0aXZlX2RldmljZSh1aW50MTZfdCBhdWRpb190eXBlLCBjaGFyKiBwYXJhbSkgewotICBidGlmX2FwbV9kZXZpY2VfcHJvZmlsZV9jb21ib190IG5ld19kZXZpY2VfcHJvZmlsZTsKLSAgaWYoYXVkaW9fdHlwZSAhPSBCVElGX0FQTV9BVURJT19UWVBFX01FRElBKQotICAgIHJldHVybjsKLQotICBtZW1jcHkoJm5ld19kZXZpY2VfcHJvZmlsZSwgcGFyYW0sIHNpemVvZihuZXdfZGV2aWNlX3Byb2ZpbGUpKTsKLSAgYWN0aXZlX2RldmljZV9wcm9maWxlW2F1ZGlvX3R5cGVdLnBlZXJfYmRhID0gbmV3X2RldmljZV9wcm9maWxlLnBlZXJfYmRhOwotICBhY3RpdmVfZGV2aWNlX3Byb2ZpbGVbYXVkaW9fdHlwZV0ucHJvZmlsZSA9IG5ld19kZXZpY2VfcHJvZmlsZS5wcm9maWxlOwotICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzKCkgTmV3IEFjdGl2ZSBEZXZpY2U6ICVzLCBQcm9maWxlOiAleFxuIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgYWN0aXZlX2RldmljZV9wcm9maWxlW2F1ZGlvX3R5cGVdLnBlZXJfYmRhLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICBhY3RpdmVfZGV2aWNlX3Byb2ZpbGVbYXVkaW9fdHlwZV0ucHJvZmlsZSk7Ci0gIGlmKGFjdGl2ZV9kZXZpY2VfcHJvZmlsZVthdWRpb190eXBlXS5wcm9maWxlID09IEEyRFBfUFJPRklMRSkgewotICAgIGJ0aWZfYWhpbV91cGRhdGVfY3VycmVudF9wcm9maWxlKEEyRFApOwotICB9IGVsc2UgaWYoYWN0aXZlX2RldmljZV9wcm9maWxlW2F1ZGlvX3R5cGVdLnByb2ZpbGUgPT0gQlJPQURDQVNUX0xFKSB7Ci0gICAgYnRpZl9haGltX3VwZGF0ZV9jdXJyZW50X3Byb2ZpbGUoQlJPQURDQVNUKTsKLSAgfSBlbHNlIHsKLSAgICBidGlmX2FoaW1fdXBkYXRlX2N1cnJlbnRfcHJvZmlsZShBVURJT19HUk9VUF9NR1IpOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9nZXRfYWN0aXZlX2RldmljZShidGlmX2F2X3N0YXRlX3QgYXVkaW9fdHlwZSwgUmF3QWRkcmVzcyogcGVlcl9iZGEpIHsKLSAgaWYoYXVkaW9fdHlwZSA+PSBCVElGX0FQTV9BVURJT19UWVBFX1NJWkUpCi0gICAgcmV0dXJuOwotICBwZWVyX2JkYSA9ICZhY3RpdmVfZGV2aWNlX3Byb2ZpbGVbYXVkaW9fdHlwZV0ucGVlcl9iZGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfdXBkYXRlX2NvbnRlbnRfY29udHJvbCh1aW50MTZfdCBhdWRpb190eXBlLCBjaGFyKiBwYXJhbSkgewotICBpZihhdWRpb190eXBlID49IEJUSUZfQVBNX0FVRElPX1RZUEVfU0laRSkKLSAgICByZXR1cm47Ci0gIHVpbnQxNl90IGNjX2lkID0gKHVpbnQxNl90KSgqcGFyYW0pOwotICBjb250ZW50X2NvbnRyb2xfaWRbYXVkaW9fdHlwZV0gPSBjY19pZDsKLSAgLypVcGRhdGUgQUNNIGhlcmUqLwotfQotCi11aW50MTZfdCBidGlmX2dldF9jb250ZW50X2NvbnRyb2xfaWQoYnRpZl9hdl9zdGF0ZV90IGF1ZGlvX3R5cGUpIHsKLSAgaWYoYXVkaW9fdHlwZSA+PSBCVElGX0FQTV9BVURJT19UWVBFX1NJWkUpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBjb250ZW50X2NvbnRyb2xfaWRbYXVkaW9fdHlwZV07Ci19Ci0KLXN0YXRpYyBjb25zdCBidF9hcG1faW50ZXJmYWNlX3QgYnRfYXBtX2ludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYnRfYXBtX2ludGVyZmFjZV90KSwKLSAgICBpbml0LAotICAgIHVwZGF0ZV9hY3RpdmVfZGV2aWNlLAotICAgIHNldF9jb250ZW50X2NvbnRyb2xfaWQsCi0gICAgY2xlYW51cCwKLX07Ci0KLWNvbnN0IGJ0X2FwbV9pbnRlcmZhY2VfdCogYnRpZl9hcG1fZ2V0X2ludGVyZmFjZSh2b2lkKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gJmJ0X2FwbV9pbnRlcmZhY2U7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCBpbml0KGJ0YXBtX2luaXRpYXRvcl9jYWxsYmFja3NfdCogY2FsbGJhY2tzKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotICBjYWxsYmFja3NfICA9IGNhbGxiYWNrczsKLSAgYXBtX2VuYWJsZWQgPSB0cnVlOwotICAKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwKCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLSAgYXBtX2VuYWJsZWQgPSBmYWxzZTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHVwZGF0ZV9hY3RpdmVfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHByb2ZpbGUsIHVpbnQxNl90IGF1ZGlvX3R5cGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLX0JUQVBNX0lOSVQoKTsKLSAgYnRpZl9hcG1fZGV2aWNlX3Byb2ZpbGVfY29tYm9fdCBuZXdfZGV2aWNlX3Byb2ZpbGU7Ci0gIG5ld19kZXZpY2VfcHJvZmlsZS5wZWVyX2JkYSA9IGJkX2FkZHI7Ci0gIG5ld19kZXZpY2VfcHJvZmlsZS5wcm9maWxlID0gcHJvZmlsZTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGFwbV9tdXRleCk7Ci0KLSAgcmV0dXJuIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX3VwZGF0ZV9hY3RpdmVfZGV2aWNlLCAodWludDhfdClhdWRpb190eXBlLAotICAgICAgICAgICAgKGNoYXIgKikmbmV3X2RldmljZV9wcm9maWxlLCBzaXplb2YoYnRpZl9hcG1fZGV2aWNlX3Byb2ZpbGVfY29tYm9fdCksIE5VTEwpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2V0X2NvbnRlbnRfY29udHJvbF9pZCh1aW50MTZfdCBjb250ZW50X2NvbnRyb2xfaWQsIHVpbnQxNl90IGF1ZGlvX3R5cGUpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLX0JUQVBNX0lOSVQoKTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGFwbV9tdXRleCk7Ci0KLSAgcmV0dXJuIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX3VwZGF0ZV9jb250ZW50X2NvbnRyb2wsCi0gICAgICh1aW50OF90KWF1ZGlvX3R5cGUsIChjaGFyICopJmNvbnRlbnRfY29udHJvbF9pZCwgc2l6ZW9mKGNvbnRlbnRfY29udHJvbF9pZCksIE5VTEwpOwotfQotCi12b2lkIGNhbGxfYWN0aXZlX3Byb2ZpbGVfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBhdWRpb190eXBlKSB7Ci0gIGlmIChhcG1fZW5hYmxlZCA9PSB0cnVlKSB7Ci0gICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXMiLCBfX2Z1bmNfXyk7Ci0gICAgIGFjdGl2ZV9wcm9maWxlX2luZm8gPSBjYWxsYmFja3NfLT5hY3RpdmVfcHJvZmlsZV9jYihiZF9hZGRyLCBhdWRpb190eXBlKTsKLSAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogcHJvZmlsZSBpbmZvIGlzICVkIiwgX19mdW5jX18sIGFjdGl2ZV9wcm9maWxlX2luZm8pOwotICB9Ci19Ci0KLWludCBnZXRfYWN0aXZlX3Byb2ZpbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgYXVkaW9fdHlwZSkgewotICBpZiAoYXBtX2VuYWJsZWQgPT0gdHJ1ZSkgewotICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBhY3RpdmUgcHJvZmlsZSBpcyAlZCAiLCBfX2Z1bmNfXywgYWN0aXZlX3Byb2ZpbGVfaW5mbyk7Ci0gICAgIHJldHVybiBhY3RpdmVfcHJvZmlsZV9pbmZvOwotICB9Ci0gIGVsc2UgewotICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBBUE0gaXMgbm90IGVuYWJsZWQsIHJldHVybmluZyBIRlAgYXMgYWN0aXZlIHByb2ZpbGUgJWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQUNUSVZFX1ZPSUNFX1BST0ZJTEVfSEZQKTsKLSAgICAgcmV0dXJuIEFDVElWRV9WT0lDRV9QUk9GSUxFX0hGUDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9hc2NzX2NsaWVudC5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2FzY3NfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg1M2U2Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2FzY3NfY2xpZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidGFfY2xvc3VyZV9hcGkuaCIKLSNpbmNsdWRlICJidGFfYXNjc19jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYXNjc19jbGllbnQuaD4KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNjc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpHYXR0U3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNjc0NsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2NzQ2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZU9wSWQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlT3BTdGF0dXM7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlUGFyYW1zOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZUNvZGVjQ29uZmlnT3A7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlUW9zQ29uZmlnT3A7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlRW5hYmxlT3A7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlRGlzYWJsZU9wOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OmFzY3M6OkFzZVN0YXJ0UmVhZHlPcDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VTdG9wUmVhZHlPcDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjphc2NzOjpBc2VSZWxlYXNlT3A7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6YXNjczo6QXNlVXBkYXRlTWV0YWRhdGFPcDsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgQXNjc0NsaWVudEludGVyZmFjZUltcGw7Ci1zdGQ6OnVuaXF1ZV9wdHI8QXNjc0NsaWVudEludGVyZmFjZT4gQXNjc0NsaWVudEluc3RhbmNlOwotCi1jbGFzcyBBc2NzQ2xpZW50SW50ZXJmYWNlSW1wbAotICAgIDogcHVibGljIEFzY3NDbGllbnRJbnRlcmZhY2UsCi0gICAgICBwdWJsaWMgQXNjc0NsaWVudENhbGxiYWNrcyB7Ci0gIH5Bc2NzQ2xpZW50SW50ZXJmYWNlSW1wbCgpID0gZGVmYXVsdDsKLQotICB2b2lkIEluaXQoQXNjc0NsaWVudENhbGxiYWNrcyogY2FsbGJhY2tzKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gICAgdGhpcy0+Y2FsbGJhY2tzID0gY2FsbGJhY2tzOwotCi0gICAgZG9faW5fYnRhX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBCaW5kKCZBc2NzQ2xpZW50OjpJbml0LCB0aGlzKSk7Ci0gIH0KLQotICB2b2lkIE9uQXNjc0luaXRpYWxpemVkKGludCBzdGF0dXMsIGludCBjbGllbnRfaWQpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudENhbGxiYWNrczo6T25Bc2NzSW5pdGlhbGl6ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkKSk7Ci0gIH0KLQotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2F0dFN0YXRlIHN0YXRlKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkFzY3NDbGllbnRDYWxsYmFja3M6Ok9uQ29ubmVjdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzKSwgYWRkcmVzcywgc3RhdGUpKTsKLSAgfQotCi0gIHZvaWQgT25Bc2VPcEZhaWxlZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBBc2VPcElkIGFzZV9vcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZU9wU3RhdHVzPiBzdGF0dXMpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIEJpbmQoJkFzY3NDbGllbnRDYWxsYmFja3M6Ok9uQXNlT3BGYWlsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgYXNlX29wX2lkLCBzdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgT25Bc2VTdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBBc2VQYXJhbXMgYXNlKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBCaW5kKCZBc2NzQ2xpZW50Q2FsbGJhY2tzOjpPbkFzZVN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIGFkZHJlc3MsIGFzZSkpOwotICB9Ci0KLSAgdm9pZCBPblNlYXJjaENvbXBsZXRlKGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUGFyYW1zPiBzaW5rX2FzZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUGFyYW1zPiBzcmNfYXNlX2xpc3QpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudENhbGxiYWNrczo6T25TZWFyY2hDb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua19hc2VfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYXNlX2xpc3QpKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6Q29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChBc2NzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcywgZmFsc2UpKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChBc2NzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBTdGFydERpc2NvdmVyeSh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6U3RhcnREaXNjb3ZlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoQXNjc0NsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgR2V0QXNlU3RhdGUodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXNlX2lkKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkFzY3NDbGllbnQ6OkdldEFzZVN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKEFzY3NDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBhZGRyZXNzLCBhc2VfaWQpKTsKLSAgfQotCi0gIHZvaWQgQ29kZWNDb25maWcodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZUNvZGVjQ29uZmlnT3A+IGNvZGVjX2NvbmZpZ3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6Q29kZWNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoQXNjc0NsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGFkZHJlc3MsIGNvZGVjX2NvbmZpZ3MpKTsKLSAgfQotCi0gIHZvaWQgUW9zQ29uZmlnKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUW9zQ29uZmlnT3A+IHFvc19jb25maWdzKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkFzY3NDbGllbnQ6OlFvc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChBc2NzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcywgcW9zX2NvbmZpZ3MpKTsKLSAgfQotCi0gIHZvaWQgRW5hYmxlKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlRW5hYmxlT3A+IGVuYWJsZV9vcHMpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKEFzY3NDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBhZGRyZXNzLCBlbmFibGVfb3BzKSk7Ci0gIH0KLQotICB2b2lkIERpc2FibGUodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlRGlzYWJsZU9wPiBkaXNhYmxlX29wcykgb3ZlcnJpZGUgewotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZBc2NzQ2xpZW50OjpEaXNhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKEFzY3NDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBhZGRyZXNzLCBkaXNhYmxlX29wcykpOwotICB9Ci0KLSAgdm9pZCBTdGFydFJlYWR5KHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVN0YXJ0UmVhZHlPcD4gc3RhcnRfcmVhZHlfb3BzKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkFzY3NDbGllbnQ6OlN0YXJ0UmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoQXNjc0NsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGFkZHJlc3MsIHN0YXJ0X3JlYWR5X29wcykpOwotICB9Ci0KLSAgdm9pZCBTdG9wUmVhZHkodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VTdG9wUmVhZHlPcD4gc3RvcF9yZWFkeV9vcHMpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6U3RvcFJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKEFzY3NDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBhZGRyZXNzLCBzdG9wX3JlYWR5X29wcykpOwotICB9Ci0KLSAgdm9pZCBSZWxlYXNlKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVJlbGVhc2VPcD4gcmVsZWFzZV9vcHMpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQXNjc0NsaWVudDo6UmVsZWFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChBc2NzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcywgcmVsZWFzZV9vcHMpKTsKLSAgfQotCi0gIHZvaWQgVXBkYXRlU3RyZWFtKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlVXBkYXRlTWV0YWRhdGFPcD4gbWV0YWRhdGFfb3BzKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkFzY3NDbGllbnQ6OlVwZGF0ZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChBc2NzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcywgbWV0YWRhdGFfb3BzKSk7Ci0gIH0KLQotICB2b2lkIENsZWFudXAodWludDE2X3QgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkFzY3NDbGllbnQ6OkNsZWFuVXAsIGNsaWVudF9pZCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBBc2NzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3M7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQXNjc0NsaWVudEludGVyZmFjZSogYnRpZl9hc2NzX2NsaWVudF9nZXRfaW50ZXJmYWNlKCkgewotICBpZiAoIUFzY3NDbGllbnRJbnN0YW5jZSkKLSAgICBBc2NzQ2xpZW50SW5zdGFuY2UucmVzZXQobmV3IEFzY3NDbGllbnRJbnRlcmZhY2VJbXBsKCkpOwotCi0gIHJldHVybiBBc2NzQ2xpZW50SW5zdGFuY2UuZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfYnJvYWRjYXN0LmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYmFwX2Jyb2FkY2FzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMzkzYy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfYnJvYWRjYXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0aWZfYmFwX2Jyb2FkY2FzdCIKLQotI2luY2x1ZGUgImJ0aWZfYmFwX2Jyb2FkY2FzdC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYXYuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9iYXBfYmEuaD4KLQotI2luY2x1ZGUgImJ0X2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZl9hMmRwLmgiCi0jaW5jbHVkZSAiYnRpZl9oZi5oIgotI2luY2x1ZGUgImJ0aWZfYTJkcF9jb250cm9sLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2EyZHBfc291cmNlLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJidGlmX2JhdC5oIgotI2luY2x1ZGUgImJ0aWZfYXYuaCIKLSNpbmNsdWRlICJoY2ltc2dzLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJhdWRpb19hMmRwX2h3L2luY2x1ZGUvYXVkaW9fYTJkcF9ody5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibGVfYWR2ZXJ0aXNlci5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9ibGVfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAiYmxlX2FkdmVydGlzZXIuaCIKLSNpZiAoT0ZGX1RBUkdFVF9URVNUX0VOQUJMRUQgPT0gRkFMU0UpCi0jaW5jbHVkZSAiYXVkaW9faGFsX2ludGVyZmFjZS9hMmRwX2VuY29kaW5nLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJjb250cm9sbGVyLmgiCi0jaWYgKE9GRl9UQVJHRVRfVEVTVF9FTkFCTEVEID09IFRSVUUpCi0jaW5jbHVkZSAibG9nL2xvZy5oIgotI2luY2x1ZGUgInNlcnZpY2UvYTJkcF9oYWxfc2ltL2F1ZGlvX2EyZHBfaGFsX3N0dWIuaCIKLSNlbmRpZgotI2luY2x1ZGUgInN0YXRlX21hY2hpbmUuaCIKLQotI2RlZmluZSBCSUdfQ09NUElMRSAxCi0KLSNkZWZpbmUgQlRJRl9CQVBfQkFfTlVNX0NCICAgICAgIDEKLSNkZWZpbmUga0RlZmF1bHRNYXhCcm9hZGNhc3RTdXBwb3J0ZWQgMQotI2RlZmluZSBCVElGX0JBUF9CQV9OVU1fQk1TIDEKLQotI2RlZmluZSBJTlBVVF9EQVRBUEFUSCAweDAxCi0jZGVmaW5lIE9VVFBVVF9EQVRBUEFUSCAweDAyCi0jZGVmaW5lIEJST0FEQ0FTVF9TUExJVF9TVEVSRU8gMgotI2RlZmluZSBCUk9BRENBU1RfTU9OT19KT0lOVCAxCi0jZGVmaW5lIEJST0FEQ0FTVF9NT0RFX0hSIDB4MTAwMAotI2RlZmluZSBCUk9BRENBU1RfTU9ERV9MTCAweDIwMDAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSB0eXBlZGVmIGVudW0gewotICAgQklHX1RFUk1JTkFURUQgPSAwLAotICAgQklHX0NSRUFUSU5HLAotICAgQklHX0NSRUFURUQsCi0gICBCSUdfUkVDT05GSUcsCi0gICBCSUdfVEVSTUlOQVRJTkcsCi0gICBCSUdfRElTQUJMSU5HLAotIH0gYnRpZl9iaWdfc3RhdGVfdDsKLQotc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBicm9hZGNhc3RfY29kZWNzX2NhcGFiaWxpdGllczsKLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGxjM19jb2RlY19pZCA9IChidGF2X2EyZHBfY29kZWNfaW5kZXhfdCk5Owotc3RhdGljIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBicm9hZGNhc3RfbG9jYWxfY2FwYWJpbGl0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB7bGMzX2NvZGVjX2lkLCBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCkoQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05PIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQkFQX0NPREVDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8pKSwgMCwgMCwgMCwgMH07Ci0KLXN0YXRpYyBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgZGVmYXVsdF9jb25maWc7Ci1zdGF0aWMgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGN1cnJlbnRfY29uZmlnOwotc3RhdGljIGludCBtQmlzTXVsdGlwbGllciA9IDA7Ci0vL3N0YXRpYyBib29sIGlzU3BsaXRFbmFibGVkID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBub3RpZnlfa2V5X2dlbmVyYXRlZCA9IGZhbHNlOwotT2N0ZXQxNiBlbmNyeXB0aW9uX2tleTsKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Ccm9hZGNhc3RJRCgzLDApOwotc3RydWN0IGtleUNhbGN1bGF0b3IgewotICBPY3RldDE2IHJhbmQ7Ci19OwotdWludDhfdCBlbmNfa2V5bGVuZ3RoID0gMTY7Ci1jaGFyIGxvY2FsX3BhcmFtWzNdOwotUmF3QWRkcmVzcyBtQmFwQkFEZXZpY2UgPSBSYXdBZGRyZXNzKHsweEZBLCAweENFLCAweEZBLCAweENFLCAweEZBLCAweENFfSk7Ci1zdGQ6Om11dGV4IHNlc3Npb25fd2FpdF87Ci1zdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBzZXNzaW9uX3dhaXRfY3ZfOwotYm9vbCBtU2Vzc2lvbl93YWl0OwotYm9vbCBtRW5jcnlwdGlvbkVuYWJsZWQgPSB0cnVlOwotYm9vbCByZXN0YXJ0X3Nlc3Npb24gPSBmYWxzZTsKLWV4dGVybiBpbnQgYnRpZl9tYXhfYXZfY2xpZW50czsKLWV4dGVybiBjb25zdCBidGdhdHRfaW50ZXJmYWNlX3QqIGJ0aWZfZ2F0dF9nZXRfaW50ZXJmYWNlKCk7Ci1leHRlcm4gaW50IGJ0aWZfYXZfZ2V0X2xhdGVzdF9kZXZpY2VfaWR4X3RvX3N0YXJ0KCk7Ci1leHRlcm4gdGhyZWFkX3QqIGdldF93b3JrZXJfdGhyZWFkKCk7Ci1pbnQgdG90YWxfYmlzZXMgPSAwOwotdHlwZWRlZiBlbnVtIHsKLSAgaXNvX3Vua25vd24gPSAwLAotICBzZXR1cF9pc28gPSAxLAotICByZW1vdmVfaXNvID0gMiwKLX10QkFQX0JBX0lTT19DTUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3Qgc2R1X2ludDsKLSAgdWludDE2X3QgbWF4X3NkdTsKLSAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICB1aW50OF90IHJ0bjsKLSAgdWludDhfdCBwaHk7Ci0gIHVpbnQ4X3QgcGFja2luZzsKLSAgdWludDhfdCBmcmFtaW5nOwotfSB0QkFQX0JBX0JJR19QQVJBTVM7Ci0KLXRCQVBfQkFfQklHX1BBUkFNUyBtQmlnUGFyYW1zID0gezEwMDAwLCAxMDAsIDEwLCAyLCAyLypMRSAyTSovLCAxLypJbnRlcmxlYXZlZCovLCAwLyp1bmZyYW1lZCovfTsKLSNkZWZpbmUgUEFUSF9JRCAxCi10QkFQX0JBX0lTT19DTUQgcGVuZGluZ19jbWQgPSBpc29fdW5rbm93bjsKLWludCBjdXJyZW50X2hhbmRsZSA9IC0xOwotaW50IGN1cnJlbnRfaXNvX2luZGV4ID0gMDsKLQotaW50IGNvbmZpZ19yZXFfaGFuZGxlID0gLTE7Ci0vKioKLSAqIExvY2FsIGZ1bmN0aW9ucwotICovCi1zdGF0aWMgdm9pZCBidGlmX2JhcF9iYV9nZW5lcmF0ZV9lbmNfa2V5X2xvY2FsKGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfY3JlYXRlX2JpZyhpbnQgYWR2X2lkKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2JhX3Rlcm1pbmF0ZV9iaWcoaW50IGFkdl9pZCwgaW50IGJpZ19oYW5kbGUpOwotc3RhdGljIGJvb2wgYnRpZl9iYXBfYmFfc2V0dXBfaXNvX2RhdGFwYXRoKGludCBiaWdfaGFuZGxlKTsKLXN0YXRpYyBib29sIGJ0aWZfYmFwX2JhX3JlbW92ZV9pc29fZGF0YXBhdGgoaW50IGJpZ19oYW5kbGUpOwotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfcHJvY2Vzc19pc29fc2V0dXAodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGJpc19oYW5kbGUpOwotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfdXBkYXRlX2JpZ19wYXJhbXMoKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2JhX2hhbmRsZV9ldmVudCh1aW50MzJfdCBldmVudCwgY2hhciogcF9wYXJhbSk7Ci1zdGF0aWMgdm9pZCBpbml0X2xvY2FsX2NhcGFiaWxpdGllcygpOwotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfYnJvYWRjYXN0X3N0YXRlKGludCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YmFwX2Jyb2FkY2FzdF9zdGF0ZV90IHN0YXRlKTsKLXN0YXRpYyB2b2lkIGJ0aWZfcmVwb3J0X2Jyb2FkY2FzdF9hdWRpb19zdGF0ZShpbnQgYWR2X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGJhcF9icm9hZGNhc3RfYXVkaW9fc3RhdGVfdCBzdGF0ZSk7Ci1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9hdWRpb19jb25maWcoaW50IGFkdl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWcpOwotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfc2V0dXBfYmlnKGludCBzZXR1cCwgaW50IGFkdl9pZCwgaW50IGJpZ19oYW5kbGUsIGludCBudW1fYmlzZXMpOwotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfYnJvYWRjYXN0X2lkKCk7Ci1zdGF0aWMgdm9pZCBidGlmX2JhcF9wcm9jZXNzX3JlcXVlc3QodEEyRFBfQ1RSTF9DTUQgY21kKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYnJvYWRjYXN0X3Byb2Nlc3NfaGlkbF9ldmVudCh0QTJEUF9DVFJMX0NNRCBjbWQpOwotc3RhdGljIHVpbnQxNl90IGJ0aWZfYmFwX2dldF90cmFuc3BvcnRfbGF0ZW5jeSgpOwotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfY29weV9icm9hZGNhc3RfaWQoKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2JhX2dlbmVyYXRlX2Jyb2FkY2FzdF9pZCgpOwotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfc2lnbmFsX3Nlc3Npb25fcmVhZHkoKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoc2Vzc2lvbl93YWl0Xyk7Ci0gIGlmKCFtU2Vzc2lvbl93YWl0KSB7Ci0gICAgbVNlc3Npb25fd2FpdCA9IHRydWU7Ci0gICAgc2Vzc2lvbl93YWl0X2N2Xy5ub3RpZnlfYWxsKCk7Ci0gIH0gZWxzZSB7Ci0gICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiBhbHJlYWR5IHNpZ25hbGxlZCAiLF9fZnVuY19fKTsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBkdW1wX2JhcF9iYV9zbV9ldmVudF9uYW1lKGJ0aWZfYmFwX2Jyb2FkY2FzdF9zbV9ldmVudF90IGV2ZW50KSB7Ci0gIHN3aXRjaCAoKGludClldmVudCkgewotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0JBUF9CUk9BRENBU1RfRU5BQkxFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX0RJU0FCTEVfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0JBUF9CUk9BRENBU1RfU1RBUlRfU1RSRUFNX1JFUV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQkFQX0JST0FEQ0FTVF9TVE9QX1NUUkVBTV9SRVFfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0JBUF9CUk9BRENBU1RfU1VTUEVORF9TVFJFQU1fUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX1NPVVJDRV9DT05GSUdfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX0NMRUFOVVBfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX1NFVF9BQ1RJVkVfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX1JFTU9WRV9BQ1RJVkVfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX1NFVFVQX0lTT19EQVRBUEFUSF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQkFQX0JST0FEQ0FTVF9SRU1PVkVfSVNPX0RBVEFQQVRIX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX0dFTkVSQVRFX0VOQ19LRVlfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0JBUF9CUk9BRENBU1RfQklTRVNfU0VUVVBfRVZUKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX0JBUF9CUk9BRENBU1RfQklTRVNfUkVNT1ZFX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX0JJR19TRVRVUF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQkFQX0JST0FEQ0FTVF9CSUdfUkVNT1ZFRF9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKEJUSUZfQkFQX0JST0FEQ0FTVF9QUk9DRVNTX0hJRExfUkVRX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9CQVBfQlJPQURDQVNUX1NFVFVQX05FWFRfQklTX0VWRU5UKQotICAgIENBU0VfUkVUVVJOX1NUUihCVElGX1NNX0VOVEVSX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoQlRJRl9TTV9FWElUX0VWVCkKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVTktOT1dOX0VWRU5UIjsKLSAgfQotfQotCi12b2lkIGJ0aWZfYmFwX2Jyb2FkY2FzdF91cGRhdGVfc291cmNlX2NvZGVjKHZvaWQgKnBfZGF0YSkgewotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgKiBjb2RlY19yZXEgPSAoYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KilwX2RhdGE7Ci0gIGlmIChjb2RlY19yZXEtPnNhbXBsZV9yYXRlICE9IGN1cnJlbnRfY29uZmlnLnNhbXBsZV9yYXRlIHx8Ci0gICAgY29kZWNfcmVxLT5jaGFubmVsX21vZGUgIT0gY3VycmVudF9jb25maWcuY2hhbm5lbF9tb2RlIHx8Ci0gICAgY29kZWNfcmVxLT5jb2RlY19zcGVjaWZpY18xICE9IGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzEgfHwKLSAgICBjb2RlY19yZXEtPmNvZGVjX3NwZWNpZmljXzIgIT0gY3VycmVudF9jb25maWcuY29kZWNfc3BlY2lmaWNfMikgewotICAgIHJlc3RhcnRfc2Vzc2lvbiA9IHRydWU7Ci0gIH0KLQotICBpZiAoY29kZWNfcmVxLT5jb2RlY19zcGVjaWZpY180ID4gMCkgewotICAgIGlmIChjdXJyZW50X2NvbmZpZy5jb2RlY19zcGVjaWZpY180ID09IEJST0FEQ0FTVF9NT0RFX0hSKSB7Ci0gICAgICBtQmlnUGFyYW1zLm1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IDYwOwotICAgIH0gZWxzZSBpZiAoY29kZWNfcmVxLT5jb2RlY19zcGVjaWZpY180ID09IEJST0FEQ0FTVF9NT0RFX0xMKSB7Ci0gICAgICBtQmlnUGFyYW1zLm1heF90cmFuc3BvcnRfbGF0ZW5jeSA9IDIwOwotICAgIH0KLSAgfQotICBtZW1jcHkoJmN1cnJlbnRfY29uZmlnLCBjb2RlY19yZXEsIHNpemVvZihidGF2X2EyZHBfY29kZWNfY29uZmlnX3QpKTsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF0lczpzYW1wbGUgcmF0ZTogJWQiLF9fZnVuY19fLCBjdXJyZW50X2NvbmZpZy5zYW1wbGVfcmF0ZSk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdJXM6Y2hhbm5lbCBtb2RlOiAlZCIsX19mdW5jX18sIGN1cnJlbnRfY29uZmlnLmNoYW5uZWxfbW9kZSk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdJXM6Y3MxOiAlZCIsX19mdW5jX18sIGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzEpOwotICBidGlmX2JhcF9iYV91cGRhdGVfYmlnX3BhcmFtcygpOwotfQotCi12b2lkIHJldmVyc2VDb2RlKHVpbnQ4X3QgKmFycmF5KSB7Ci0gIHVpbnQ4X3QgKnBfYXJyYXkgPSBhcnJheTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICB1aW50OF90IHRlbXAgPSBwX2FycmF5W2ldOwotICAgIHBfYXJyYXlbaV0gPSBwX2FycmF5WzE1LWldOwotICAgIHBfYXJyYXlbMTUtaV0gPSB0ZW1wOwotICB9Ci19Ci0KLWJvb2wgaXNVbmVuY3J5cHRlZCh1aW50OF90ICphcnJheSkgewotICB1aW50OF90ICpwX2FycmF5ID0gYXJyYXk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIGlmIChwX2FycmF5W2ldICE9IDB4MDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06IGlzVW5lbmNyeXB0ZWQgaXMgdHJ1ZSIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWNsYXNzIEJ0aWZCYXBCcm9hZGNhc3RlcjsKLQotY2xhc3MgQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZSA6IHB1YmxpYyBibHVldG9vdGg6OmNvbW1vbjo6U3RhdGVNYWNoaW5lewotIHB1YmxpYzoKLSAgZW51bSB7Ci0gICAga1N0YXRlSWRsZSwgICAgIC8vIEJyb2FkY2FzdCBpZGxlCi0gICAga1N0YXRlQ29uZmlndXJlZCwgIC8vIEJyb2FkY2FzdCBjb25maWd1cmVkCi0gICAga1N0YXRlU3RyZWFtaW5nLCAgIC8vIEJyb2FkY2FzdCBzdHJlYW1pbmcKLSAgfTsKLQotICBjbGFzcyBTdGF0ZUlkbGUgOiBwdWJsaWMgU3RhdGUgewotICAgcHVibGljOgotICAgIFN0YXRlSWRsZShCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlSWRsZSksIGJtc18oc20uQm1zKCkpIHt9Ci0gICAgdm9pZCBPbkVudGVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBPbkV4aXQoKSBvdmVycmlkZTsKLSAgICBib29sIFByb2Nlc3NFdmVudCh1aW50MzJfdCBldmVudCwgdm9pZCogcF9kYXRhKSBvdmVycmlkZTsKLQotICAgcHJpdmF0ZToKLSAgICBCdGlmQmFwQnJvYWRjYXN0ZXImIGJtc187Ci0gIH07Ci0KLSAgY2xhc3MgU3RhdGVDb25maWd1cmVkIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZUNvbmZpZ3VyZWQoQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZSYgc20pCi0gICAgICAgIDogU3RhdGUoc20sIGtTdGF0ZUNvbmZpZ3VyZWQpLCBibXNfKHNtLkJtcygpKSB7fQotICAgIHZvaWQgT25FbnRlcigpIG92ZXJyaWRlOwotICAgIHZvaWQgT25FeGl0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgQnRpZkJhcEJyb2FkY2FzdGVyJiBibXNfOwotICB9OwotCi0gIGNsYXNzIFN0YXRlU3RyZWFtaW5nIDogcHVibGljIFN0YXRlIHsKLSAgIHB1YmxpYzoKLSAgICBTdGF0ZVN0cmVhbWluZyhCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lJiBzbSkKLSAgICAgICAgOiBTdGF0ZShzbSwga1N0YXRlU3RyZWFtaW5nKSwgYm1zXyhzbS5CbXMoKSkge30KLSAgICB2b2lkIE9uRW50ZXIoKSBvdmVycmlkZTsKLSAgICB2b2lkIE9uRXhpdCgpIG92ZXJyaWRlOwotICAgIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIEJ0aWZCYXBCcm9hZGNhc3RlciYgYm1zXzsKLSAgfTsKLQotICBCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lKEJ0aWZCYXBCcm9hZGNhc3RlciYgYm1zKSA6IGJtc18oYm1zKSB7Ci0gICAgc3RhdGVfaWRsZV8gPSBuZXcgU3RhdGVJZGxlKCp0aGlzKTsKLSAgICBzdGF0ZV9jb25maWd1cmVkXyA9IG5ldyBTdGF0ZUNvbmZpZ3VyZWQoKnRoaXMpOwotICAgIHN0YXRlX3N0cmVhbWluZ18gPSBuZXcgU3RhdGVTdHJlYW1pbmcoKnRoaXMpOwotCi0gICAgQWRkU3RhdGUoc3RhdGVfaWRsZV8pOwotICAgIEFkZFN0YXRlKHN0YXRlX2NvbmZpZ3VyZWRfKTsKLSAgICBBZGRTdGF0ZShzdGF0ZV9zdHJlYW1pbmdfKTsKLSAgICBTZXRJbml0aWFsU3RhdGUoc3RhdGVfaWRsZV8pOwotICB9Ci0gIEJ0aWZCYXBCcm9hZGNhc3RlciYgQm1zKCkgeyByZXR1cm4gYm1zXzsgfQotICBwcml2YXRlOgotICBCdGlmQmFwQnJvYWRjYXN0ZXImIGJtc187Ci0gIFN0YXRlSWRsZSogc3RhdGVfaWRsZV87Ci0gIFN0YXRlQ29uZmlndXJlZCogc3RhdGVfY29uZmlndXJlZF87Ci0gIFN0YXRlU3RyZWFtaW5nKiBzdGF0ZV9zdHJlYW1pbmdfOwotfTsKLQotY2xhc3MgQnRpZkJhcEJyb2FkY2FzdGVyewotIHB1YmxpYzoKLSAgZW51bSB7Ci0gICAga0ZsYWdCSUdQZW5kaW5nID0gMHgxLAotICAgIGtGbGFnSVNPUGVuZGluZyA9IDB4MiwKLSAgICBrRmxhZ0lTT0Vycm9yID0gMHg0LAotICAgIEtGbGFnSVNPU2V0dXAgPSAweDgsCi0gIH07Ci0KLSAgQnRpZkJhcEJyb2FkY2FzdGVyKGludCBhZHZfaGFuZGxlLCBpbnQgYmlnX2hhbmRsZSkKLSAgOmFkdl9oYW5kbGVfKGFkdl9oYW5kbGUpLAotICAgYmlnX2hhbmRsZV8oYmlnX2hhbmRsZSksCi0gICBzdGF0ZV9tYWNoaW5lXygqdGhpcyksCi0gICBmbGFnc18oMCksCi0gICBiaWdfc3RhdGVfKEJJR19URVJNSU5BVEVEKXt9Ci0KLSAgfkJ0aWZCYXBCcm9hZGNhc3RlcigpOwotCi0gIGJ0X3N0YXR1c190IEluaXQoKTsKLSAgdm9pZCBDbGVhbnVwKCk7Ci0KLSAgYm9vbCBDYW5CZURlbGV0ZWQoKSB7cmV0dXJuICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlX21hY2hpbmVfLlN0YXRlSWQoKSA9PSBCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGVfbWFjaGluZV8uUHJldmlvdXNTdGF0ZUlkKCkgIT0gQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlSW52YWxpZCkpOyB9OwotCi0gIGludCBBZHZIYW5kbGUoKSBjb25zdCB7IHJldHVybiBhZHZfaGFuZGxlXzsgfQotICBpbnQgQklHSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gYmlnX2hhbmRsZV87IH0KLSAgdm9pZCBTZXRCSUdIYW5kbGUoaW50IGhhbmRsZSkgeyBiaWdfaGFuZGxlXyA9IGhhbmRsZTsgfQotICB2b2lkIFNldEFkdkhhbmRsZShpbnQgaGFuZGxlKSB7IGFkdl9oYW5kbGVfID0gaGFuZGxlOyB9Ci0gIEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmUmIFN0YXRlTWFjaGluZSgpIHsgcmV0dXJuIHN0YXRlX21hY2hpbmVfOyB9Ci0gIGNvbnN0IEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmUmIFN0YXRlTWFjaGluZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlX21hY2hpbmVfOyB9Ci0gIGJvb2wgQ2hlY2tGbGFncyh1aW50OF90IGJpdGZsYWdzX21hc2spIGNvbnN0IHsKLSAgICByZXR1cm4gKChmbGFnc18gJiBiaXRmbGFnc19tYXNrKSAhPSAwKTsKLSAgfQotCi0gIHZvaWQgQ2xlYXJGbGFnKHVpbnQ4X3QgYml0ZmxhZ3NfbWFzaykgeyBmbGFnc18gJj0gfmJpdGZsYWdzX21hc2s7fQotCi0gIHZvaWQgQ2xlYXJBbGxGbGFncygpIHsgZmxhZ3NfID0gMDsgfQotICAvKioKLSAgICogU2V0IG9ubHkgdGhlIGZsYWdzIGFzIHNwZWNpZmllZCBieSB0aGUgYml0ZmxhZ3MgbWFzay4KLSAgICoKLSAgICogQHBhcmFtIGJpdGZsYWdzX21hc2sgdGhlIGJpdGZsYWdzIHRvIHNldAotICAgKi8KLSAgdm9pZCBTZXRGbGFncyh1aW50OF90IGJpdGZsYWdzX21hc2spIHsgZmxhZ3NfIHw9IGJpdGZsYWdzX21hc2s7IH0KLQotICB2b2lkIFNldE51bUJpc2VzKHVpbnQ4X3QgbnVtX2Jpc2VzKSB7bnVtX2Jpc2VzXyA9IG51bV9iaXNlczsgfQotCi0gIHVpbnQ4X3QgTnVtQmlzZXMoKSBjb25zdCB7IHJldHVybiBudW1fYmlzZXNfOyB9Ci0KLSAgdm9pZCBTZXRCSUdTdGF0ZShidGlmX2JpZ19zdGF0ZV90IHN0YXRlKSB7IGJpZ19zdGF0ZV8gPSBzdGF0ZTsgfQotCi0gIGJ0aWZfYmlnX3N0YXRlX3QgQklHU3RhdGUoKSBjb25zdCB7IHJldHVybiBiaWdfc3RhdGVfOyB9Ci0KLSAgLyp2b2lkIFNldE1hbmRhdG9yeUNvZGVjUHJlZmVycmVkKGJvb2wgcHJlZmVycmVkKSB7Ci0gICAgbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF8gPSBwcmVmZXJyZWQ7Ci0gIH0KLSAgYm9vbCBJc01hbmRhdG9yeUNvZGVjUHJlZmVycmVkKCkgY29uc3QgeyByZXR1cm4gbWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF87IH0qLwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBHZXRCSVNIYW5kbGVzKCkgY29uc3QgeyByZXR1cm4gYmlzX2hhbmRsZV9saXN0Xzt9Ci0gIHZvaWQgU2V0QklTSGFuZGxlcyhzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gaGFuZGxlX2xpc3QpIHsgYmlzX2hhbmRsZV9saXN0XyA9IGhhbmRsZV9saXN0OyB9Ci0KLSBwcml2YXRlOgotICBpbnQgYWR2X2hhbmRsZV87Ci0gIGludCBiaWdfaGFuZGxlXzsgIC8vIFNFUCB0eXBlIG9mIHBlZXIgZGV2aWNlCi0gIHVpbnQ4X3QgbnVtX2Jpc2VzXzsKLSAgQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZSBzdGF0ZV9tYWNoaW5lXzsKLSAgdWludDhfdCBmbGFnc187Ci0gIGJ0aWZfYmlnX3N0YXRlX3QgYmlnX3N0YXRlXzsKLSAgLy9ib29sIG1hbmRhdG9yeV9jb2RlY19wcmVmZXJyZWRfID0gZmFsc2U7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBiaXNfaGFuZGxlX2xpc3RfOwotfTsKLS8vQnRpZkJhcEJyb2FkY2FzdGVyOjpCdGlmQmFwQnJvYWRjYXN0ZXIoaW50IGFkdl9oYW5kbGUsIGludCBiaWdfaGFuZGxlKQotLy8gIDphZHZfaGFuZGxlXyhhZHZfaGFuZGxlKSwgYmlnX2hhbmRsZV8oYmlnX2hhbmRsZSl7fQotCi1jbGFzcyBCdGlmQmFwQnJvYWRjYXN0U291cmNlewotIHB1YmxpYzoKLSAgLy8gVGhlIFBlZXJJZCBpcyB1c2VkIGFzIEFwcElkIGZvciBCVEFfQXZSZWdpc3RlcigpIHB1cnBvc2UKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtQZWVySWRNaW4gPSAwOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1BlZXJJZE1heCA9IEJUSUZfQkFQX0JBX05VTV9CTVM7Ci0gIHB1YmxpYzoKLSAgIGVudW0gewotICAgICBrRmxhZ0lkbGUgPSAweDEsCi0gICAgIGtGbGFnQ29uZmlndXJlZCA9IDB4MiwKLSAgICAga0ZsYWdTdHJlYW1pbmcgPSAweDQsCi0gICAgIEtGbGFnRGlzYWJsaW5nID0gMHg4LAotICAgfTsKLSAgQnRpZkJhcEJyb2FkY2FzdFNvdXJjZSgpCi0gICAgICA6IGNhbGxiYWNrc18obnVsbHB0ciksCi0gICAgICAgIGVuYWJsZWRfKGZhbHNlKSwKLSAgICAgICAgb2ZmbG9hZF9lbmFibGVkXyhmYWxzZSksCi0gICAgICAgIG1heF9icm9hZGNhc3RfKGtEZWZhdWx0TWF4QnJvYWRjYXN0U3VwcG9ydGVkKSB7fQotICB+QnRpZkJhcEJyb2FkY2FzdFNvdXJjZSgpOwotCi0gIGJ0X3N0YXR1c190IEluaXQoCi0gICAgICBidGJhcF9icm9hZGNhc3RfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywgaW50IG1heF9icm9hZGNhc3QsCi0gICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnLGludCBtb2RlKTsKLQotICBidF9zdGF0dXNfdCBFbmFibGVCcm9hZGNhc3QoYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZyk7Ci0gIGJ0X3N0YXR1c190IERpc2FibGVCcm9hZGNhc3QoaW50IGFkdl9oYW5kbGUpOwotICB2b2lkIENsZWFudXAoKTsKLSAgdm9pZCBDbGVhbnVwSWRsZUJtcygpOwotICBidGJhcF9icm9hZGNhc3RfY2FsbGJhY2tzX3QqIENhbGxiYWNrcygpIHsgcmV0dXJuIGNhbGxiYWNrc187IH0KLSAgdm9pZCBTZXRFbmFibGVkKGJvb2wgc3RhdGUpIHsgZW5hYmxlZF8gPSBzdGF0ZTsgfQotICBib29sIEVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBlbmFibGVkXzsgfQotICBib29sIEJhcEJyb2FkY2FzdE9mZmxvYWRFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gb2ZmbG9hZF9lbmFibGVkXzsgfQotCi0gIEJ0aWZCYXBCcm9hZGNhc3RlciogRmluZEJtc0Zyb21BZHZIYW5kbGUodWludDhfdCBhZHZfaGFuZGxlKTsKLS8vICBCdGlmQmFwQnJvYWRjYXN0ZXIqIEZpbmRFbXB0eUJtcygpOwotICBCdGlmQmFwQnJvYWRjYXN0ZXIqIEZpbmRCbXNGcm9tQklHSGFuZGxlKHVpbnQ4X3QgYmlnX2hhbmRsZSk7Ci0gIEJ0aWZCYXBCcm9hZGNhc3RlciogRmluZFN0cmVhbWluZ0JtcygpOwotICBCdGlmQmFwQnJvYWRjYXN0ZXIqIEZpbmRDb25maWd1cmVkQm1zKCk7Ci0gIEJ0aWZCYXBCcm9hZGNhc3RlciogQ3JlYXRlQk1TKGludCBhZHZfaGFuZGxlKTsKLSAgLy92b2lkIFNldERlZmF1bHRDb25maWcoYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZykgeyBkZWZhdWx0X2NvbmZpZ18gPSBjb25maWc7IH0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEdldERlZmF1bHRDb25maWcgKCkgY29uc3QgeyByZXR1cm4gZGVmYXVsdF9jb25maWdfOyB9Ci0gIC8vdm9pZCBTZXRDdXJyZW50Q29uZmlnIChidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnKSB7IGN1cnJlbnRfY29uZmlnXyA9IGNvbmZpZzsgfQotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgR2V0Q3VycmVudENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfY29uZmlnXzsgfQotICBidF9zdGF0dXNfdCBTZXRFbmNyeXB0aW9uKGludCBsZW5ndGgpOwotICBidF9zdGF0dXNfdCBTZXRCcm9hZGNhc3RBY3RpdmUoYm9vbCBzZXR1cCwgdWludDhfdCBhZHZfaWQpOwotICBib29sIEJyb2FkY2FzdEFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuICgoYnJvYWRjYXN0X3N0YXRlXyA9PSBrRmxhZ0NvbmZpZ3VyZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwoYnJvYWRjYXN0X3N0YXRlXyA9PSBrRmxhZ1N0cmVhbWluZykpOyB9Ci0gIHZvaWQgU2V0QnJvYWRjYXN0U3RhdGUodWludDhfdCBmbGFnKSB7IGJyb2FkY2FzdF9zdGF0ZV8gPSBmbGFnOyB9Ci0gIHVpbnQ4X3QgR2V0QnJvYWRjYXN0U3RhdGUoKSB7IHJldHVybiBicm9hZGNhc3Rfc3RhdGVfOyB9Ci0gIGJ0X3N0YXR1c190IFNldFVzZXJDb25maWcodWludDhfdCBhZHZfaGRsLCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnKTsKLQotICBjb25zdCBzdGQ6Om1hcDx1aW50OF90LyphZHZfaGFuZGxlKi8sIEJ0aWZCYXBCcm9hZGNhc3Rlcio+JiBCbXMoKSBjb25zdCB7IHJldHVybiBibXNfOyB9Ci0KLSBwcml2YXRlOgotICB2b2lkIENsZWFudXBBbGxCbXMoKTsKLQotICBidGJhcF9icm9hZGNhc3RfY2FsbGJhY2tzX3QqIGNhbGxiYWNrc187Ci0gIGJvb2wgZW5hYmxlZF87Ci0gIGJvb2wgb2ZmbG9hZF9lbmFibGVkXzsKLSAgaW50IG1heF9icm9hZGNhc3RfOwotICBzdGQ6Om1hcDx1aW50OF90LCBCdGlmQmFwQnJvYWRjYXN0ZXIqPiBibXNfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgZGVmYXVsdF9jb25maWdfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY3VycmVudF9jb25maWdfOwotICB1aW50OF90IGJyb2FkY2FzdF9zdGF0ZV87Ci19OwotCi1zdGF0aWMgQnRpZkJhcEJyb2FkY2FzdFNvdXJjZSBidGlmX2JhcF9ibXM7Ci0KLWJ0X3N0YXR1c190IEJ0aWZCYXBCcm9hZGNhc3Rlcjo6SW5pdCgpIHsKLSAgc3RhdGVfbWFjaGluZV8uU3RhcnQoKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIEJ0aWZCYXBCcm9hZGNhc3Rlcjo6Q2xlYW51cCgpIHsKLSAgc3RhdGVfbWFjaGluZV8uUXVpdCgpOwotfQotCi12b2lkIEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6T25FbnRlcigpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIiVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0KLSAgYm1zXy5DbGVhckFsbEZsYWdzKCk7Ci0gIGJtc18uU2V0QWR2SGFuZGxlKC0xKTsKLSAgYm1zXy5TZXRCSUdIYW5kbGUoLTEpOwotICBibXNfLlNldEJJR1N0YXRlKEJJR19URVJNSU5BVEVEKTsKLSAgYnRpZl9iYXBfYm1zLlNldEJyb2FkY2FzdFN0YXRlKEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OmtGbGFnSWRsZSk7Ci0gIGJ0aWZfYmFwX2Jtcy5TZXRFbmFibGVkKGZhbHNlKTsKLSAgYnRpZl9iYXBfYm1zLkNsZWFudXBJZGxlQm1zKCk7Ci19Ci0KLXZvaWQgQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6U3RhdGVJZGxlOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfSU1QKCIlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotfQotCi1ib29sIEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmU6OlN0YXRlSWRsZTo6UHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIltCYXBCcm9hZGNhc3RdOiVzOiBldmVudCA9ICVzIixfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBkdW1wX2JhcF9iYV9zbV9ldmVudF9uYW1lKChidGlmX2JhcF9icm9hZGNhc3Rfc21fZXZlbnRfdClldmVudCkpOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU0VUX0FDVElWRV9SRVFfRVZUOgotICAgICBibXNfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lOjprU3RhdGVDb25maWd1cmVkKTsKLSAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU09VUkNFX0NPTkZJR19SRVFfRVZUOgotICAgICAgLy9jb3B5IGNvbmZpZwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHVuaGFuZGxlZCBldmVudD0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2JhcF9iYV9zbV9ldmVudF9uYW1lKChidGlmX2JhcF9icm9hZGNhc3Rfc21fZXZlbnRfdClldmVudCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6U3RhdGVDb25maWd1cmVkOjpPbkVudGVyKCkgewotICBCVElGX1RSQUNFX0lNUCgiJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fKTsKLQotICAvLyBJbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHRoYXQgd2UgYXJlIGVudGVyaW5nIGNvbm5lY3Rpbmcgc3RhdGUKLSAgYnRpZl9iYXBfYm1zLlNldEJyb2FkY2FzdFN0YXRlKEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OmtGbGFnQ29uZmlndXJlZCk7Ci0gIGJ0aWZfYmFwX2Jtcy5TZXRFbmFibGVkKHRydWUpOwotICBpZiAoYm1zXy5CSUdTdGF0ZSgpID09IEJJR19URVJNSU5BVEVEKSB7Ci0jaWYgQUhJTV9FTkFCTEVECi0gICAgYnRpZl9haGltX2luaXRfaGFsKGdldF93b3JrZXJfdGhyZWFkKCksIEJST0FEQ0FTVCk7Ci0gICAgYnRpZl9haGltX3N0YXJ0X3Nlc3Npb24oKTsKLSNlbHNlCi0gICAgYnRpZl9hMmRwX3NvdXJjZV9yZXN0YXJ0X3Nlc3Npb24oUmF3QWRkcmVzczo6a0VtcHR5LCBtQmFwQkFEZXZpY2UpOwotI2VuZGlmCi0gICAgYnRpZl9iYXBfYmFfc2lnbmFsX3Nlc3Npb25fcmVhZHkoKTsKLSAgICBidGlmX2JhcF9iYV91cGRhdGVfYmlnX3BhcmFtcygpOwotICB9IGVsc2UgaWYgKGJtc18uQklHU3RhdGUoKSA9PSBCSUdfRElTQUJMSU5HKSB7Ci0gICAgUHJvY2Vzc0V2ZW50KEJUSUZfQkFQX0JST0FEQ0FTVF9ESVNBQkxFX0VWVCwgbnVsbHB0cik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJtc18uU2V0QklHU3RhdGUoQklHX1RFUk1JTkFURUQpOwotICBibXNfLkNsZWFyQWxsRmxhZ3MoKTsKLSAgYnRpZl9yZXBvcnRfYnJvYWRjYXN0X3N0YXRlKGJtc18uQWR2SGFuZGxlKCksIEJUQkFQX0JST0FEQ0FTVF9TVEFURV9DT05GSUdVUkVEKTsKLX0KLQotdm9pZCBCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lOjpTdGF0ZUNvbmZpZ3VyZWQ6Ok9uRXhpdCgpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIiVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci19Ci0KLWJvb2wgQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6U3RhdGVDb25maWd1cmVkOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKSB7Ci0gQlRJRl9UUkFDRV9JTVAoIltCYXBCcm9hZGNhc3RdOiVzOiBldmVudCA9ICVzIixfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2JhcF9iYV9zbV9ldmVudF9uYW1lKChidGlmX2JhcF9icm9hZGNhc3Rfc21fZXZlbnRfdClldmVudCkpOwotIHN3aXRjaCAoZXZlbnQpIHsKLQotICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfRElTQUJMRV9FVlQ6Ci0gICAgIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOkJUSUZfQkFQX0JST0FEQ0FTVF9ESVNBQkxFX0VWVCwgbW92aW5nIHRvIGlkbGUiKTsKLSAgICAgaWYgKGJtc18uQ2hlY2tGbGFncyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnQklHUGVuZGluZykgfHwKLSAgICAgICBibXNfLkNoZWNrRmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0lTT1BlbmRpbmcpKSB7Ci0jaWYgQUhJTV9FTkFCTEVECi0gICAgICAgYnRpZl9haGltX2Fja19zdHJlYW1fc3RhcnRlZChBMkRQX0NUUkxfQUNLX0RJU0NPTk5FQ1RfSU5fUFJPR1JFU1MsIEJST0FEQ0FTVCk7Ci0gICAgICAgYnRpZl9haGltX3Jlc2V0X3BlbmRpbmdfY29tbWFuZChCUk9BRENBU1QpOwotI2Vsc2UKLSAgICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTKTsKLSAgICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjpyZXNldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSNlbmRpZgotICAgICB9Ci0gICAgIGJtc18uU2V0QklHU3RhdGUoQklHX0RJU0FCTElORyk7Ci0gICAgIGJtc18uQ2xlYXJGbGFnKEJ0aWZCYXBCcm9hZGNhc3Rlcjo6a0ZsYWdJU09QZW5kaW5nKTsKLSAgICAgYnRpZl9yZXBvcnRfYnJvYWRjYXN0X3N0YXRlKGJtc18uQWR2SGFuZGxlKCksIEJUQkFQX0JST0FEQ0FTVF9TVEFURV9JRExFKTsKLSAgICAgYm1zXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgIGJyZWFrOwotICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU0VUX0FDVElWRV9SRVFfRVZUOgotICAgICBCVElGX1RSQUNFX0RFQlVHKCJOb3QgaGFuZGxlZCBpbiBjb25maWd1cmVkIHN0YXRlIik7Ci0gICAgIGJyZWFrOwotICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU1RBUlRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgIGlmIChibXNfLkNoZWNrRmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0JJR1BlbmRpbmcpIHx8Ci0gICAgICAgYm1zXy5DaGVja0ZsYWdzKEJ0aWZCYXBCcm9hZGNhc3Rlcjo6a0ZsYWdJU09QZW5kaW5nKSkgewotICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdJXM6IEJJRy9JU08gc2V0dXAgcGVuZGluZywgZHVwIHJlcSIsX19mdW5jX18pOwotI2lmIEFISU1fRU5BQkxFRAotICAgICAgIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19QRU5ESU5HLCBCUk9BRENBU1QpOwotI2Vsc2UKLSAgICAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfUEVORElORywgQlJPQURDQVNUKTsKLSNlbmRpZgotICAgICAgIGJyZWFrOwotICAgICB9Ci0gICAgIGJtc18uU2V0RmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0JJR1BlbmRpbmcpOwotICAgICBibXNfLlNldE51bUJpc2VzKGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfY2hfY291bnQoKSk7Ci0gICAgIGJtc18uU2V0QklHU3RhdGUoQklHX0NSRUFUSU5HKTsKLSAgICAgYnRpZl9iYXBfYmFfY3JlYXRlX2JpZyhibXNfLkFkdkhhbmRsZSgpKTsKLSAgICAgYnJlYWs7Ci0gICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRVUF9JU09fREFUQVBBVEhfRVZUOgotICAgICB7Ci0gICAgICAgaWYgKGJtc18uQ2hlY2tGbGFncyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnQklHUGVuZGluZykpCi0gICAgICAgICBibXNfLkNsZWFyRmxhZyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnQklHUGVuZGluZyk7Ci0gICAgICAgYm1zXy5TZXRGbGFncyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnSVNPUGVuZGluZyk7Ci0gICAgICAgdG90YWxfYmlzZXMgPSBibXNfLk51bUJpc2VzKCk7Ci0gICAgICAgY3VycmVudF9pc29faW5kZXggPSAwOwotICAgICAgIGN1cnJlbnRfaGFuZGxlID0gYm1zXy5CSUdIYW5kbGUoKTsKLSAgICAgICBidGlmX2JhcF9iYV9zZXR1cF9pc29fZGF0YXBhdGgoY3VycmVudF9oYW5kbGUpOwotICAgICB9Ci0gICAgIGJyZWFrOwotICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfUkVNT1ZFX0lTT19EQVRBUEFUSF9FVlQ6Ci0gICAgIHRvdGFsX2Jpc2VzID0gYm1zXy5OdW1CaXNlcygpOwotICAgICBjdXJyZW50X2lzb19pbmRleCA9IDA7Ci0gICAgIGN1cnJlbnRfaGFuZGxlID0gYm1zXy5CSUdIYW5kbGUoKTsKLSAgICAgYnRpZl9iYXBfYmFfcmVtb3ZlX2lzb19kYXRhcGF0aChjdXJyZW50X2hhbmRsZSk7Ci0gICAgIGJyZWFrOwotICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfQklTRVNfU0VUVVBfRVZUOgotICAgICB7Ci0gICAgICAgY2hhciAqcF9wID0gKGNoYXIgKikgcF9kYXRhOwotICAgICAgIHBfcCsrOwotICAgICAgIHVpbnQ4X3Qgc3RhdHVzID0gKnBfcDsKLSAgICAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTICYmCi0gICAgICAgICBibXNfLkNoZWNrRmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0lTT1BlbmRpbmcpKSB7Ci0gICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJbQmFwQnJvYWRjYXN0XSVzOiBzZXR1cCBpc28gZmFpbGVkIixfX2Z1bmNfXyk7Ci0gICAgICAgICBibXNfLkNsZWFyQWxsRmxhZ3MoKTsKLSAgICAgICAgIGJtc18uU2V0RmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0lTT0Vycm9yKTsKLSNpZiBBSElNX0VOQUJMRUQKLSAgICAgICAgIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19ESVNDT05ORUNUX0lOX1BST0dSRVNTLCBCUk9BRENBU1QpOwotICAgICAgICAgYnRpZl9haGltX3Jlc2V0X3BlbmRpbmdfY29tbWFuZChCUk9BRENBU1QpOwotI2Vsc2UKLSAgICAgICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmFja19zdHJlYW1fc3RhcnRlZChBMkRQX0NUUkxfQUNLX0RJU0NPTk5FQ1RfSU5fUFJPR1JFU1MpOwotICAgICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6cmVzZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0jZW5kaWYKLQotICAgICAgICAgYnRpZl9iYXBfYmFfdGVybWluYXRlX2JpZyhibXNfLkFkdkhhbmRsZSgpLCBibXNfLkJJR0hhbmRsZSgpKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICAgICBibXNfLkNsZWFyRmxhZyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnSVNPUGVuZGluZyk7Ci0gICAgICAgYm1zXy5TZXRGbGFncyhCdGlmQmFwQnJvYWRjYXN0ZXI6OktGbGFnSVNPU2V0dXApOwotI2lmIEFISU1fRU5BQkxFRAotICAgICAgIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTLCBCUk9BRENBU1QpOwotICAgICAgIGJ0aWZfYWhpbV9yZXNldF9wZW5kaW5nX2NvbW1hbmQoQlJPQURDQVNUKTsKLSNlbHNlCi0gICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6YWNrX3N0cmVhbV9zdGFydGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUyk7Ci0gICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6cmVzZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0jZW5kaWYKLSAgICAgICBidGlmX3JlcG9ydF9zZXR1cF9iaWcoMSwgYm1zXy5BZHZIYW5kbGUoKSwgYm1zXy5CSUdIYW5kbGUoKSwgYm1zXy5OdW1CaXNlcygpKTsKLSAgICAgICBidGlmX3JlcG9ydF9icm9hZGNhc3Rfc3RhdGUoYm1zXy5BZHZIYW5kbGUoKSwgQlRCQVBfQlJPQURDQVNUX1NUQVRFX1NUUkVBTUlORyk7Ci0gICAgICAgYm1zXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlU3RyZWFtaW5nKTsKLSAgICAgfQotICAgICBicmVhazsKLSAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX0JJU0VTX1JFTU9WRV9FVlQ6Ci0jaWYgQUhJTV9FTkFCTEVECi0gICAgIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTLCBCUk9BRENBU1QpOwotICAgICBidGlmX2FoaW1fcmVzZXRfcGVuZGluZ19jb21tYW5kKEJST0FEQ0FTVCk7Ci0jZWxzZQotICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N0YXJ0ZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTKTsKLSAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6cmVzZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0jZW5kaWYKLSAgICAgYnJlYWs7Ci0gICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9CSUdfU0VUVVBfRVZUOgotICAgICBicmVhazsKLSAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX0JJR19SRU1PVkVEX0VWVDoKLSAgICAgYnRpZl9yZXBvcnRfc2V0dXBfYmlnKDAsIGJtc18uQWR2SGFuZGxlKCksIC0xLCAwKTsKLSAgICAgaWYgKGJtc18uQ2hlY2tGbGFncyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnSVNPRXJyb3IpKSB7Ci0gICAgICAgYm1zXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlSWRsZSk7Ci0gICAgICAgYnRpZl9yZXBvcnRfYnJvYWRjYXN0X3N0YXRlKGJtc18uQWR2SGFuZGxlKCksQlRCQVBfQlJPQURDQVNUX1NUQVRFX0lETEUpOwotICAgICB9Ci0gICAgIGJyZWFrOwotICAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9TT1VSQ0VfQ09ORklHX1JFUV9FVlQ6Ci0gICAgICAgYnRpZl9iYXBfYnJvYWRjYXN0X3VwZGF0ZV9zb3VyY2VfY29kZWMocF9kYXRhKTsKLSAgICAgICBpZiAocmVzdGFydF9zZXNzaW9uKSB7Ci0jaWYgQUhJTV9FTkFCTEVECi0gICAgICAgICBidGlmX2FoaW1fZW5kX3Nlc3Npb24oKTsKLSAgICAgICAgIGJ0aWZfYWhpbV9pbml0X2hhbChnZXRfd29ya2VyX3RocmVhZCgpLCBCUk9BRENBU1QpOwotICAgICAgICAgYnRpZl9haGltX3N0YXJ0X3Nlc3Npb24oKTsKLSNlbHNlCi0gICAgICAgICBidGlmX2EyZHBfc291cmNlX3Jlc3RhcnRfc2Vzc2lvbihSYXdBZGRyZXNzOjprRW1wdHksIG1CYXBCQURldmljZSk7Ci0jZW5kaWYKLSAgICAgICAgIGJ0aWZfcmVwb3J0X2F1ZGlvX2NvbmZpZyhibXNfLkFkdkhhbmRsZSgpLCBjdXJyZW50X2NvbmZpZyk7Ci0gICAgICAgfQotICAgICAgIGJyZWFrOwotICAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9TVVNQRU5EX1NUUkVBTV9SRVFfRVZUOgotI2lmIEFISU1fRU5BQkxFRAotICAgICAgIGJ0aWZfYWhpbV9hY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MsIEJST0FEQ0FTVCk7Ci0gICAgICAgYnRpZl9haGltX3Jlc2V0X3BlbmRpbmdfY29tbWFuZChCUk9BRENBU1QpOwotI2Vsc2UKLSAgICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OnJlc2V0X3BlbmRpbmdfY29tbWFuZCgpOwotI2VuZGlmCi0gICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogU1VTUEVORF9TVEVBTV9SRVEgdW5oYW5kbGVkIGluIENvbmZpZ3VyZWQgc3RhdGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICBCVElGX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmhhbmRsZWQgZXZlbnQ9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfYmFwX2JhX3NtX2V2ZW50X25hbWUoKGJ0aWZfYmFwX2Jyb2FkY2FzdF9zbV9ldmVudF90KWV2ZW50KSk7Ci0gICAgIHJldHVybiBmYWxzZTsKLSB9Ci0gcmV0dXJuIHRydWU7Ci0KLX0KLQotdm9pZCBCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lOjpTdGF0ZVN0cmVhbWluZzo6T25FbnRlcigpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIiVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXyk7Ci0gIGJ0aWZfYmFwX2Jtcy5TZXRCcm9hZGNhc3RTdGF0ZShCdGlmQmFwQnJvYWRjYXN0U291cmNlOjprRmxhZ1N0cmVhbWluZyk7Ci0gIGJ0aWZfcmVwb3J0X2Jyb2FkY2FzdF9hdWRpb19zdGF0ZShibXNfLkFkdkhhbmRsZSgpLCBCVEJBUF9CUk9BRENBU1RfX0FVRElPX1NUQVRFX1NUQVJURUQpOwotfQotCi12b2lkIEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmU6OlN0YXRlU3RyZWFtaW5nOjpPbkV4aXQoKSB7Ci0gIEJUSUZfVFJBQ0VfSU1QKCIlcyIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pOwotfQotCi1ib29sIEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmU6OlN0YXRlU3RyZWFtaW5nOjpQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIltCYXBCcm9hZGNhc3RdOiVzOiBldmVudCA9ICVzIixfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2JhcF9iYV9zbV9ldmVudF9uYW1lKChidGlmX2JhcF9icm9hZGNhc3Rfc21fZXZlbnRfdClldmVudCkpOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfRElTQUJMRV9FVlQ6Ci0gICAgICBpZiAoYm1zXy5CSUdTdGF0ZSgpID09IEJJR19DUkVBVEVEKSB7Ci0gICAgICAgIGJtc18uU2V0QklHU3RhdGUoQklHX0RJU0FCTElORyk7Ci0gICAgICAgIGJ0aWZfYmFwX2Jtcy5TZXRCcm9hZGNhc3RTdGF0ZShCdGlmQmFwQnJvYWRjYXN0U291cmNlOjpLRmxhZ0Rpc2FibGluZyk7Ci0gICAgICAgIGlmIChibXNfLkNoZWNrRmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjpLRmxhZ0lTT1NldHVwKSkgewotICAgICAgICAgIGJ0aWZfYmFwX2JhX3Rlcm1pbmF0ZV9iaWcoYm1zXy5BZHZIYW5kbGUoKSwgYm1zXy5CSUdIYW5kbGUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJtc18uU2V0QklHU3RhdGUoQklHX0RJU0FCTElORyk7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiBCSUcgVGVybWluYXRlIHVuZGVyIHByb2Nlc3MiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgICBpZiAoYm1zXy5CSUdTdGF0ZSgpICE9IEJJR19DUkVBVEVEKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiW0JhcEJyb2FkY2FzdF06JXM6IEJJRyBpcyBnZXR0aW5nIHRlcm1pbmF0ZWQgYWxyZWFkeSIsX19mdW5jX18pOwotI2lmIEFISU1fRU5BQkxFRAotICAgICAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdXNwZW5kZWQoQTJEUF9DVFJMX0FDS19TVUNDRVNTLCBCUk9BRENBU1QpOwotICAgICAgICBidGlmX2FoaW1fcmVzZXRfcGVuZGluZ19jb21tYW5kKEJST0FEQ0FTVCk7Ci0jZWxzZQotICAgICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjpyZXNldF9wZW5kaW5nX2NvbW1hbmQoKTsKLSNlbmRpZgotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJtc18uU2V0RmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0lTT1BlbmRpbmcpOwotICAgICAgdG90YWxfYmlzZXMgPSBibXNfLk51bUJpc2VzKCk7Ci0gICAgICBjdXJyZW50X2lzb19pbmRleCA9IDA7Ci0gICAgICBjdXJyZW50X2hhbmRsZSA9IGJtc18uQklHSGFuZGxlKCk7Ci0gICAgICBidGlmX2JhcF9iYV9yZW1vdmVfaXNvX2RhdGFwYXRoKGN1cnJlbnRfaGFuZGxlKTsKLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU0VUVVBfSVNPX0RBVEFQQVRIX0VWVDoKLSAgICAgIHsKLSAgICAgICAgY2hhciAqcF9wID0gKGNoYXIgKilwX2RhdGE7Ci0gICAgICAgIGlmICgqcF9wKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolczogV2Ugc2hvdWxkbid0IGJlIGluIHN0cmVhbWluZyBzdGF0ZSBpZiBJU08gZGF0YXBhdGggaXMgbm90IHNldHVwIHlldCIsX19mdW5jX18pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChibXNfLkNoZWNrRmxhZ3MoQnRpZkJhcEJyb2FkY2FzdGVyOjpLRmxhZ0lTT1NldHVwKSkgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XSBXZSBzaG91bGRuJ3QgYmUgaGVyZSwgSVNPIERhdGFwYXRoIGlzIHJlbW92ZWQgZmlyc3QgYmVmb3JlIEJJRyIpOwotICAgICAgICAgICAgYnRpZl9iYXBfYmFfcmVtb3ZlX2lzb19kYXRhcGF0aChibXNfLkJJR0hhbmRsZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolczpJc29EYXRhcGFoIGlzIGFscmVhZHkgcmVtb3ZlZCIsX19mdW5jX18pOwotICAgICAgICAgICAgYm1zXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlQ29uZmlndXJlZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9SRU1PVkVfSVNPX0RBVEFQQVRIX0VWVDoKLSAgICAgIGJ0aWZfYmFwX2JhX3Rlcm1pbmF0ZV9iaWcoYm1zXy5BZHZIYW5kbGUoKSwgYm1zXy5CSUdIYW5kbGUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9CSVNFU19SRU1PVkVfRVZUOgotICAgICAgYm1zXy5DbGVhckZsYWcoQnRpZkJhcEJyb2FkY2FzdGVyOjprRmxhZ0lTT1BlbmRpbmcpOwotICAgICAgaWYgKGJtc18uQklHU3RhdGUoKSA9PSBCSUdfQ1JFQVRFRCkKLSAgICAgICAgYm1zXy5TZXRCSUdTdGF0ZShCSUdfVEVSTUlOQVRJTkcpOwotICAgICAgYnRpZl9iYXBfYmFfdGVybWluYXRlX2JpZyhibXNfLkFkdkhhbmRsZSgpLCBibXNfLkJJR0hhbmRsZSgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX0JJR19SRU1PVkVEX0VWVDoKLSAgICAgIGlmIChibXNfLkJJR1N0YXRlKCkgPT0gQklHX0RJU0FCTElORykgewotICAgICAgICBidGlmX3JlcG9ydF9icm9hZGNhc3Rfc3RhdGUoYm1zXy5BZHZIYW5kbGUoKSwgQlRCQVBfQlJPQURDQVNUX1NUQVRFX0lETEUpOwotICAgICAgICBibXNfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lOjprU3RhdGVJZGxlKTsKLSAgICAgIH0gZWxzZSBpZiAoYm1zXy5CSUdTdGF0ZSgpID09IEJJR19URVJNSU5BVElORykgewotICAgICAgICBibXNfLlN0YXRlTWFjaGluZSgpLlRyYW5zaXRpb25UbyhCdGlmQmFwQnJvYWRjYXN0U3RhdGVNYWNoaW5lOjprU3RhdGVDb25maWd1cmVkKTsKLSAgICAgIH0gZWxzZSBpZiAoYm1zXy5CSUdTdGF0ZSgpID09IEJJR19SRUNPTkZJRykgewotI2lmIEFISU1fRU5BQkxFRAotICAgICAgICBidGlmX2FoaW1fZW5kX3Nlc3Npb24oKTsKLSAgICAgICAgYnRpZl9haGltX2luaXRfaGFsKGdldF93b3JrZXJfdGhyZWFkKCksIEJST0FEQ0FTVCk7Ci0gICAgICAgIGJ0aWZfYWhpbV9zdGFydF9zZXNzaW9uKCk7Ci0jZWxzZQotICAgICAgICBidGlmX2EyZHBfc291cmNlX3Jlc3RhcnRfc2Vzc2lvbihSYXdBZGRyZXNzOjprRW1wdHksIG1CYXBCQURldmljZSk7Ci0jZW5kaWYKLSAgICAgICAgYnRpZl9yZXBvcnRfYXVkaW9fY29uZmlnKGJtc18uQWR2SGFuZGxlKCksIGN1cnJlbnRfY29uZmlnKTsKLSAgICAgICAgYm1zXy5TdGF0ZU1hY2hpbmUoKS5UcmFuc2l0aW9uVG8oQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlQ29uZmlndXJlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotI2lmIEFISU1fRU5BQkxFRAotICAgICAgYnRpZl9haGltX2Fja19zdHJlYW1fc3VzcGVuZGVkKEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUywgQlJPQURDQVNUKTsKLSAgICAgIGJ0aWZfYWhpbV9yZXNldF9wZW5kaW5nX2NvbW1hbmQoQlJPQURDQVNUKTsKLSNlbHNlCi0gICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N1c3BlbmRlZChBMkRQX0NUUkxfQUNLX1NVQ0NFU1MpOwotICAgICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6cmVzZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0jZW5kaWYKLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU09VUkNFX0NPTkZJR19SRVFfRVZUOgotICAgICAgYnRpZl9iYXBfYnJvYWRjYXN0X3VwZGF0ZV9zb3VyY2VfY29kZWMocF9kYXRhKTsKLSAgICAgIGlmIChyZXN0YXJ0X3Nlc3Npb24pIHsKLSAgICAgICAgYm1zXy5TZXRCSUdTdGF0ZShCSUdfUkVDT05GSUcpOwotICAgICAgICBidGlmX2JhcF9iYV90ZXJtaW5hdGVfYmlnKGJtc18uQWR2SGFuZGxlKCksIGJtc18uQklHSGFuZGxlKCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IHVuaGFuZGxlZCBldmVudD0lcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9iYXBfYmFfc21fZXZlbnRfbmFtZSgoYnRpZl9iYXBfYnJvYWRjYXN0X3NtX2V2ZW50X3QpZXZlbnQpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJ0aWZfYWhpbV9jbGllbnRfY2FsbGJhY2tzX3Qgc0FoaW1Ccm9hZGNhc3RDYWxsYmFja3MgPSB7Ci0gIDIsIC8vIG1vZGUKLSAgYnRpZl9icm9hZGNhc3RfcHJvY2Vzc19oaWRsX2V2ZW50LAotICBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X3NhbXBsZV9yYXRlLAotICBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X2NoX21vZGUsCi0gIGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfYml0cmF0ZSwKLSAgYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9tdHUsCi0gIGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfZnJhbWVsZW5ndGgsCi0gIGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfY2hfY291bnQsCi0gIGJ0aWZfYmFwX2Jyb2FkY2FzdF9pc19zaW11bGNhc3RfZW5hYmxlZCwKLSAgbnVsbHB0ciwKLSAgbnVsbHB0ciwKLSAgbnVsbHB0cgotfTsKLQotYnRfc3RhdHVzX3QgQnRpZkJhcEJyb2FkY2FzdFNvdXJjZTo6SW5pdChidGJhcF9icm9hZGNhc3RfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYnJvYWRjYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZyxpbnQgbW9kZSkgewotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolcyIsIF9fZnVuY19fKTsKLSAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0geydcMCd9OwotICBpZiAobW9kZSA9PSAxKSBvZmZsb2FkX2VuYWJsZWRfID0gdHJ1ZTsKLSAgY2FsbGJhY2tzXyA9IGNhbGxiYWNrczsKLSAgZGVmYXVsdF9jb25maWdfID0gY29kZWNfY29uZmlnOwotICBtZW1zZXQoZW5jcnlwdGlvbl9rZXkuZGF0YSgpLCAwLCBPQ1RFVDE2X0xFTik7Ci0gIGluaXRfbG9jYWxfY2FwYWJpbGl0aWVzKCk7Ci0gIG9zaV9wcm9wZXJ0eV9nZXQoInBlcnNpc3QudmVuZG9yLmJ0c3RhY2sucGFydGlhbF9zaW11bGNhc3QiLHZhbHVlLCJmYWxzZSIpOwotICBpZiAoc3RyY21wKHZhbHVlLCAidHJ1ZSIpID09IDApIHsKLSAgICAgIEJUSUZfVFJBQ0VfSU1QKCJbQmFwQnJvYWRjYXN0XSVzOlBhcnRpYWwgc2ltdWxjYXN0IGVuYWJsZWQiLF9fZnVuY19fKTsKLSAgICAgIG1CaXNNdWx0aXBsaWVyID0gMjsKLSAgfSBlbHNlICB7Ci0gICAgICBtQmlzTXVsdGlwbGllciA9IDE7Ci0gIH0KLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay50cmFuc3BvcnRfbGF0ZW5jeSIsdmFsdWUsIjAiKTsKLSAgbUJpZ1BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPSBhdG9pKHZhbHVlKTsKLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5iaXNfcnRuIix2YWx1ZSwiMiIpOwotICBtQmlnUGFyYW1zLnJ0biA9IGF0b2kodmFsdWUpOwotICBCVElGX1RSQUNFX0lNUCgiJXM6IHRyYW5zcG9ydF9sYXRlbmN5OiAlZCwgcnRuOiAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUJpZ1BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3ksIG1CaWdQYXJhbXMucnRuKTsKLSAgQlRJRl9UUkFDRV9JTVAoIiVzOiBGZXRjaCBicm9hZGNhc3QgZW5jcnlwdGlvbiBrZXkiLCBfX2Z1bmNfXyk7Ci0KLSAgc2l6ZV90IGxlbmd0aCA9IE9DVEVUMTZfTEVOOwotICBib29sIHJldCA9IGJ0aWZfY29uZmlnX2dldF9iaW4oIkFkYXB0ZXIiLCAiQkFQX0JBX0VOQ19LRVkiLCBlbmNyeXB0aW9uX2tleS5kYXRhKCksICZsZW5ndGgpOwotCi0gIGlmICghcmV0KSB7Ci0gICAgYnRpZl9iYXBfYmFfZ2VuZXJhdGVfZW5jX2tleV9sb2NhbChPQ1RFVDE2X0xFTik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV2ZXJzZUNvZGUoZW5jcnlwdGlvbl9rZXkuZGF0YSgpKTsKLSAgICBpZiAoaXNVbmVuY3J5cHRlZChlbmNyeXB0aW9uX2tleS5kYXRhKCkpKSB7Ci0gICAgICBtRW5jcnlwdGlvbkVuYWJsZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPQ1RFVDE2X0xFTjsgaSsrKSB7Ci0gICAgICBCVElGX1RSQUNFX0lNUCgiW2JhcGJyb2FkY2FzdF0lczogZW5jcnlwdGlvbl9rZXlbJWRdID0gJWQiLF9fZnVuY19fLGksZW5jcnlwdGlvbl9rZXlbaV0pOwotICAgIH0KLSAgfQotI2lmIEFISU1fRU5BQkxFRAotICByZWdfY2Jfd2l0aF9haGltKEJST0FEQ0FTVCwgJnNBaGltQnJvYWRjYXN0Q2FsbGJhY2tzKTsKLSNlbmRpZgotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OkVuYWJsZUJyb2FkY2FzdChidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzIiwgX19mdW5jX18pOwotICBjdXJyZW50X2NvbmZpZ18gPSBjb2RlY19jb25maWc7Ci0gIGJ0aWZfYmFwX2JhX2dlbmVyYXRlX2Jyb2FkY2FzdF9pZCgpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OkRpc2FibGVCcm9hZGNhc3QoaW50IGFkdl9oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXMiLCBfX2Z1bmNfXyk7Ci0gIGxvY2FsX3BhcmFtWzBdID0gYWR2X2hhbmRsZTsKLSAgZG9faW5fYnRhX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfQkFQX0JST0FEQ0FTVF9ESVNBQkxFX0VWVCwgbG9jYWxfcGFyYW0pKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBCdGlmQmFwQnJvYWRjYXN0U291cmNlOjpTZXRFbmNyeXB0aW9uKGludCBsZW5ndGgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXMiLCBfX2Z1bmNfXyk7Ci0gIGxvY2FsX3BhcmFtWzBdID0gbGVuZ3RoOwotICBkb19pbl9idGFfdGhyZWFkKAotICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBCVElGX0JBUF9CUk9BRENBU1RfR0VORVJBVEVfRU5DX0tFWV9FVlQsIGxvY2FsX3BhcmFtKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgQnRpZkJhcEJyb2FkY2FzdFNvdXJjZTo6U2V0QnJvYWRjYXN0QWN0aXZlKGJvb2wgc2V0dXAsIHVpbnQ4X3QgYWR2X2lkKSB7Ci0gIGlmIChidGlmX2EyZHBfc291cmNlX2lzX2hhbF92Ml9zdXBwb3J0ZWQoKSkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoc2Vzc2lvbl93YWl0Xyk7Ci0gICAgbVNlc3Npb25fd2FpdCA9IGZhbHNlOwotICAgIGlmIChzZXR1cCkgewotICAgICAgZG9faW5fYnRhX3RocmVhZCgKLSAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJmJ0aWZfYmFwX2JhX2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRJRl9CQVBfQlJPQURDQVNUX1NFVF9BQ1RJVkVfUkVRX0VWVCwgKGNoYXIgKikmYWR2X2lkKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgZG9faW5fYnRhX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUSUZfQkFQX0JST0FEQ0FTVF9SRU1PVkVfQUNUSVZFX1JFUV9FVlQsKGNoYXIgKikmYWR2X2lkKSk7Ci0gICAgfQotICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiB3YXRpbmcgZm9yIHNpZ25hbCIsX19mdW5jX18pOwotICAgIHNlc3Npb25fd2FpdF9jdl8ud2FpdF9mb3IoZ3VhcmQsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCksCi0gICAgICAgICAgICAgICAgICAgICBbXXtyZXR1cm4gbVNlc3Npb25fd2FpdDt9KTsKLSAgICBCVElGX1RSQUNFX0VWRU5UKCIlczogZG9uZSB3aXRoIHNpZ25hbCIsX19mdW5jX18pOwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci12b2lkIEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OkNsZWFudXAoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzIiwgX19mdW5jX18pOwotICAvL3doaWxlKCFibXNfLmVtcHR5KCkpIHsKLSAgZm9yIChhdXRvIGl0ID0gYm1zXy5iZWdpbigpO2l0ICE9IGJtc18uZW5kKCk7KXsKLSAgICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGl0LT5zZWNvbmQ7Ci0gICAgYXV0byBwcmV2X2l0ID0gaXQrKzsKLSAgICBibXMtPkNsZWFudXAoKTsKLSAgICBibXNfLmVyYXNlKHByZXZfaXQpOwotICAgIC8vZGVsZXRlIGJtczsKLSAgfQotfQotCi12b2lkIEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OkNsZWFudXBJZGxlQm1zKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolcyIsIF9fZnVuY19fKTsKLSAgZm9yIChhdXRvIGl0ID0gYm1zXy5iZWdpbigpO2l0ICE9IGJtc18uZW5kKCk7KXsKLSAgICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGl0LT5zZWNvbmQ7Ci0gICAgYXV0byBwcmV2X2l0ID0gaXQrKzsKLSAgICBpZiAoYm1zLT5DYW5CZURlbGV0ZWQoKSkgewotICAgICAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF0lczogQ2xlYW5pbmcgdXAgaWRsZSBibXMiLCBfX2Z1bmNfXyk7Ci0gICAgICBibXMtPkNsZWFudXAoKTsKLSAgICAgIGJtc18uZXJhc2UocHJldl9pdCk7Ci0gICAgICAvL2RlbGV0ZSBibXM7Ci0gICAgfQotICAgIC8vZGVsZXRlIGJtczsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XSVzOkV4aXQiLF9fZnVuY19fKTsKLX0KLQotYnRfc3RhdHVzX3QgQnRpZkJhcEJyb2FkY2FzdFNvdXJjZTo6U2V0VXNlckNvbmZpZyh1aW50OF90IGFkdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZykgewotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolcyIsIF9fZnVuY19fKTsKLSAgY29uZmlnX3JlcV9oYW5kbGUgPSAoaW50KSBhZHZfaGFuZGxlOwotICBkb19pbl9idGFfdGhyZWFkKAotICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBCVElGX0JBUF9CUk9BRENBU1RfU09VUkNFX0NPTkZJR19SRVFfRVZULCAoY2hhciAqKSZjb2RlY19jb25maWcpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotQnRpZkJhcEJyb2FkY2FzdGVyICogQnRpZkJhcEJyb2FkY2FzdFNvdXJjZTo6Q3JlYXRlQk1TKGludCBhZHZfaGFuZGxlKSB7Ci0gIEJ0aWZCYXBCcm9hZGNhc3RlciAqYm1zID0gbmV3IEJ0aWZCYXBCcm9hZGNhc3RlcihhZHZfaGFuZGxlLCAtMSk7Ci0vLyAgYm1zXy5pbnNlcnQoYm1zKTsKLSAgYm1zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWR2X2hhbmRsZSwgYm1zKSk7Ci0gIGJtcy0+SW5pdCgpOwotICByZXR1cm4gYm1zOwotfQotCi1CdGlmQmFwQnJvYWRjYXN0ZXIgKiBCdGlmQmFwQnJvYWRjYXN0U291cmNlOjpGaW5kQm1zRnJvbUFkdkhhbmRsZSh1aW50OF90IGFkdl9oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXM6IGFkdl9oYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBhZHZfaGFuZGxlKTsKLSAgZm9yKGF1dG8gaXQgOiBibXNfKSB7Ci0gICAgQnRpZkJhcEJyb2FkY2FzdGVyICpibXMgPSBpdC5zZWNvbmQ7Ci0gICAgaWYgKGJtcy0+QWR2SGFuZGxlKCkgPT0gYWR2X2hhbmRsZSkKLSAgICAgIHJldHVybiBibXM7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUJ0aWZCYXBCcm9hZGNhc3RlciAqIEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OkZpbmRCbXNGcm9tQklHSGFuZGxlKHVpbnQ4X3QgYmlnX2hhbmRsZSkgewotICBmb3IoYXV0byBpdCA6IGJtc18pIHsKLSAgICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGl0LnNlY29uZDsKLSAgICBpZiAoYm1zLT5CSUdIYW5kbGUoKSA9PSBiaWdfaGFuZGxlKQotICAgICAgcmV0dXJuIGJtczsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQnRpZkJhcEJyb2FkY2FzdGVyICogQnRpZkJhcEJyb2FkY2FzdFNvdXJjZTo6RmluZFN0cmVhbWluZ0JtcygpIHsKLSBmb3IoYXV0byBpdCA6IGJtc18pIHsKLSAgIEJ0aWZCYXBCcm9hZGNhc3RlciAqYm1zID0gaXQuc2Vjb25kOwotICAgaWYgKGJtcy0+U3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpID09IEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmU6OmtTdGF0ZVN0cmVhbWluZykKLSAgICAgcmV0dXJuIGJtczsKLSB9Ci0gcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUJ0aWZCYXBCcm9hZGNhc3RlciAqIEJ0aWZCYXBCcm9hZGNhc3RTb3VyY2U6OkZpbmRDb25maWd1cmVkQm1zKCkgewotIGZvcihhdXRvIGl0IDogYm1zXykgewotICAgQnRpZkJhcEJyb2FkY2FzdGVyICpibXMgPSBpdC5zZWNvbmQ7Ci0gICBpZiAoYm1zLT5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCkgPT0gQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlQ29uZmlndXJlZCkKLSAgICAgcmV0dXJuIGJtczsKLSB9Ci0gcmV0dXJuIG51bGxwdHI7Ci19Ci1CdGlmQmFwQnJvYWRjYXN0U291cmNlOjp+QnRpZkJhcEJyb2FkY2FzdFNvdXJjZSgpe30KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExvY2FsIGV2ZW50IGhhbmRsZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHByaW50X2NvbmZpZyhidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnKSB7Ci0gIEJUSUZfVFJBQ0VfV0FSTklORygiW0JhcEJyb2FkY2FzdF0lZDogU2FtcGxpbmcgcmF0ZSA9ICVkIiwgX19mdW5jX18sY29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XSVkOiBjaGFubmVsIG1vZGUgPSAlZCIsIF9fZnVuY19fLCBjb25maWcuY2hhbm5lbF9tb2RlKTsKLSAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XSVkOiBjb2RlY19zcGVjaWZpY18xID0gJWQiLCBfX2Z1bmNfXywgY29uZmlnLmNvZGVjX3NwZWNpZmljXzEpOwotICBCVElGX1RSQUNFX1dBUk5JTkcoIltCYXBCcm9hZGNhc3RdJWQ6IGNvZGVjX3NwZWNpZmljXzIgPSAlZCIsIF9fZnVuY19fLCBjb25maWcuY29kZWNfc3BlY2lmaWNfMik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfcmVwb3J0X2VuY3lwdGlvbl9rZXkoKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0aWZfYmFwX2Jtcy5DYWxsYmFja3MoKS0+ZW5jX2tleV9jYiwKLSAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGVuY3J5cHRpb25fa2V5LmRhdGEoKSksIE9DVEVUMTZfTEVOKSkpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9icm9hZGNhc3Rfc3RhdGUoaW50IGFkdl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRiYXBfYnJvYWRjYXN0X3N0YXRlX3Qgc3RhdGUpIHsKLSAgaWYgKGJ0aWZfYmFwX2Jtcy5FbmFibGVkKCkpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRpZl9iYXBfYm1zLkNhbGxiYWNrcygpLT5icm9hZGNhc3Rfc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2lkLCBzdGF0ZSkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfcmVwb3J0X2Jyb2FkY2FzdF9hdWRpb19zdGF0ZShpbnQgYWR2X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRiYXBfYnJvYWRjYXN0X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpIHsKLSAgaWYgKGJ0aWZfYmFwX2Jtcy5FbmFibGVkKCkpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRpZl9iYXBfYm1zLkNhbGxiYWNrcygpLT5hdWRpb19zdGF0ZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZfaWQsIHN0YXRlKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYnRpZl9yZXBvcnRfYXVkaW9fY29uZmlnKGludCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnKSB7Ci0gIGlmIChidGlmX2JhcF9ibXMuRW5hYmxlZCgpKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0aWZfYmFwX2Jtcy5DYWxsYmFja3MoKS0+YXVkaW9fY29uZmlnX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9pZCwgY29kZWNfY29uZmlnLCBicm9hZGNhc3RfY29kZWNzX2NhcGFiaWxpdGllcykpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfcmVwb3J0X3NldHVwX2JpZyhpbnQgc2V0dXAsIGludCBhZHZfaWQsIGludCBiaWdfaGFuZGxlLCBpbnQgbnVtX2Jpc2VzKSB7Ci0KLSAgQnRpZkJhcEJyb2FkY2FzdGVyICpibXMgPSBidGlmX2JhcF9ibXMuRmluZEJtc0Zyb21BZHZIYW5kbGUoYWR2X2lkKTsKLSAgaWYgKGJtcyA9PSBudWxscHRyKSByZXR1cm47Ci0gIGlmIChidGlmX2JhcF9ibXMuRW5hYmxlZCgpKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0aWZfYmFwX2Jtcy5DYWxsYmFja3MoKS0+Y3JlYXRlX2JpZ19jYiwgc2V0dXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2lkLCBiaWdfaGFuZGxlLCBudW1fYmlzZXMsIGJtcy0+R2V0QklTSGFuZGxlcygpKSk7Ci0gIH0KLQotfQotCi1zdGF0aWMgdm9pZCBidGlmX3JlcG9ydF9icm9hZGNhc3RfaWQoKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYnRpZl9iYXBfYm1zLkNhbGxiYWNrcygpLT5icm9hZGNhc3RfaWRfY2IsIG1Ccm9hZGNhc3RJRCkpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2JhcF9iYV9oYW5kbGVfZXZlbnQodWludDMyX3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgICBpbnQgYmlnX2hhbmRsZSwgYWR2X2lkOwotICAgIGJpZ19oYW5kbGUgPSBhZHZfaWQgPSAwOwotICAgIEJ0aWZCYXBCcm9hZGNhc3RlciAqYnJvYWRjYXN0ZXI7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXM6IGV2ZW50ICVzIiwKLSAgICAgICAgICAgX19mdW5jX18sIGR1bXBfYmFwX2JhX3NtX2V2ZW50X25hbWUoKGJ0aWZfYmFwX2Jyb2FkY2FzdF9zbV9ldmVudF90KWV2ZW50KSk7Ci0gICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9ESVNBQkxFX0VWVDoKLSAgICAgICAgYWR2X2lkID0gKGludCkqcF9wYXJhbTsKLSAgICAgICAgYnJvYWRjYXN0ZXIgPSBidGlmX2JhcF9ibXMuRmluZEJtc0Zyb21BZHZIYW5kbGUoYWR2X2lkKTsKLSAgICAgICAgaWYgKGJyb2FkY2FzdGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJbQmFwQnJvYWRjYXN0XTolczppbnZhbGlkIGluZGV4LCBCcm9hZGNhc3QgaXMgYWxyZWFkeSBkaXNhYmxlZCIsX19mdW5jX18pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX1NUQVJUX1NUUkVBTV9SRVFfRVZUOgotICAgICAgICBicm9hZGNhc3RlciA9IGJ0aWZfYmFwX2Jtcy5GaW5kQ29uZmlndXJlZEJtcygpOwotICAgICAgICBpZiAoYnJvYWRjYXN0ZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIltCYXBCcm9hZGNhc3RdOiVzOmNhbm5vdCBmaW5kIGVtcHR5IGluZGV4IixfX2Z1bmNfXyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU1RPUF9TVFJFQU1fUkVRX0VWVDoKLSAgICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX1NVU1BFTkRfU1RSRUFNX1JFUV9FVlQ6Ci0gICAgICAgIGJyb2FkY2FzdGVyID0gYnRpZl9iYXBfYm1zLkZpbmRTdHJlYW1pbmdCbXMoKTsKLSAgICAgICAgaWYgKGJyb2FkY2FzdGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJbQmFwQnJvYWRjYXN0XTolczpjYW5ub3QgZmluZCBlbXB0eSBpbmRleCIsX19mdW5jX18pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX1NPVVJDRV9DT05GSUdfUkVRX0VWVDoKLSAgICAgICAgYnJvYWRjYXN0ZXIgPSBidGlmX2JhcF9ibXMuRmluZEJtc0Zyb21BZHZIYW5kbGUoY29uZmlnX3JlcV9oYW5kbGUpOwotICAgICAgICBpZiAoYnJvYWRjYXN0ZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIltCYXBCcm9hZGNhc3RdOiVzOmNhbm5vdCBmaW5kIGVtcHR5IGluZGV4IixfX2Z1bmNfXyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfQ0xFQU5VUF9SRVFfRVZUOgotICAgICAgICBicm9hZGNhc3RlciA9IGJ0aWZfYmFwX2Jtcy5GaW5kU3RyZWFtaW5nQm1zKCk7IC8vVE9ETzphZGQgcHJvcGVyIGNoZWNrCi0gICAgICAgIGlmIChicm9hZGNhc3RlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXM6Y2Fubm90IGZpbmQgZW1wdHkgaW5kZXgiLF9fZnVuY19fKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRfQUNUSVZFX1JFUV9FVlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICpwX3AgPSBwX3BhcmFtOwotICAgICAgICAgIGludCBhZHZfaGFuZGxlID0gKGludCkqcF9wOwotICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIltCYXBCcm9hZGNhc3RdOiVzOmFkdl9oYW5kbGUgJWQiLF9fZnVuY19fLGFkdl9oYW5kbGUpOwotICAgICAgICAgIGJyb2FkY2FzdGVyID0gYnRpZl9iYXBfYm1zLkNyZWF0ZUJNUygoaW50KWFkdl9oYW5kbGUpOwotICAgICAgICAgIGlmIChicm9hZGNhc3RlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJbQmFwQnJvYWRjYXN0XTolczogY2Fubm90IGZpbmQgZW1wdHkgaW5kZXgiLF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJvYWRjYXN0ZXItPlNldEFkdkhhbmRsZShhZHZfaGFuZGxlKTsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJbQmFwQnJvYWRjYXN0XTolczphZHZfaWQgPSAlZCwgYmlnX2hhbmRsZSA9ICVkIixfX2Z1bmNfXywgYWR2X2hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9SRU1PVkVfQUNUSVZFX1JFUV9FVlQ6Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzOkVuZCBzZXNzaW9uIiwgX19mdW5jX18pOwotI2lmIEFISU1fRU5BQkxFRAotICAgICAgICBidGlmX2FoaW1fZW5kX3Nlc3Npb24oKTsKLSNlbHNlCi0gICAgICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmVuZF9zZXNzaW9uKCk7Ci0jZW5kaWYKLSAgICAgICAgYnRpZl9iYXBfYmFfc2lnbmFsX3Nlc3Npb25fcmVhZHkoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU0VUVVBfSVNPX0RBVEFQQVRIX0VWVDoKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKnBfcCA9IHBfcGFyYW07Ci0gICAgICAgICAgaW50IGFkdl9oYW5kbGUgPSAoaW50KSpwX3A7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXM6YWR2X2hhbmRsZSA9ICVkIixfX2Z1bmNfXyxhZHZfaGFuZGxlKTsKLSAgICAgICAgICBicm9hZGNhc3RlciA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUFkdkhhbmRsZShhZHZfaGFuZGxlKTsKLSAgICAgICAgICBpZiAoYnJvYWRjYXN0ZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXM6IGNhbm5vdCBmaW5kIGVtcHR5IGluZGV4IixfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfUkVNT1ZFX0lTT19EQVRBUEFUSF9FVlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICpwX3AgPSBwX3BhcmFtOwotICAgICAgICAgIGFkdl9pZCA9ICpwX3ArKzsKLSAgICAgICAgICBiaWdfaGFuZGxlID0gKnBfcDsKLSAgICAgICAgICBicm9hZGNhc3RlciA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUJJR0hhbmRsZShiaWdfaGFuZGxlKTsKLSAgICAgICAgICBpZiAoYnJvYWRjYXN0ZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXM6IGNhbm5vdCBmaW5kIGVtcHR5IGluZGV4IixfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfR0VORVJBVEVfRU5DX0tFWV9FVlQ6Ci0gICAgICAgIGVuY19rZXlsZW5ndGggPSAodWludDhfdCkoKnBfcGFyYW0pOwotICAgICAgICBub3RpZnlfa2V5X2dlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgIGJ0aWZfYmFwX2JhX2dlbmVyYXRlX2VuY19rZXlfbG9jYWwoZW5jX2tleWxlbmd0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX0JJU0VTX1NFVFVQX0VWVDoKLSAgICAgIGNhc2UgQlRJRl9CQVBfQlJPQURDQVNUX0JJU0VTX1JFTU9WRV9FVlQ6Ci0gICAgICAgIGJpZ19oYW5kbGUgPSAqcF9wYXJhbTsKLSAgICAgICAgYnJvYWRjYXN0ZXIgPSBidGlmX2JhcF9ibXMuRmluZEJtc0Zyb21CSUdIYW5kbGUoYmlnX2hhbmRsZSk7Ci0gICAgICAgIGlmIChicm9hZGNhc3RlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXM6IGNhbm5vdCBmaW5kIGVtcHR5IGluZGV4IixfX2Z1bmNfXyk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfQklHX1JFTU9WRURfRVZUOgotICAgICAgICBhZHZfaWQgPSAoaW50KSpwX3BhcmFtOwotICAgICAgICBidGlmX3JlcG9ydF9zZXR1cF9iaWcoMCwgYWR2X2lkLC0xLCAwKTsKLSAgICAgICAgYnJvYWRjYXN0ZXIgPSBidGlmX2JhcF9ibXMuRmluZEJtc0Zyb21BZHZIYW5kbGUoYWR2X2lkKTsKLSAgICAgICAgaWYgKGJyb2FkY2FzdGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCJbQmFwQnJvYWRjYXN0XTolczogY2Fubm90IGZpbmQgZW1wdHkgaW5kZXgiLF9fZnVuY19fKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUSUZfQkFQX0JST0FEQ0FTVF9QUk9DRVNTX0hJRExfUkVRX0VWVDoKLSAgICAgICAgYnRpZl9iYXBfcHJvY2Vzc19yZXF1ZXN0KCh0QTJEUF9DVFJMX0NNRCApICpwX3BhcmFtKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBCVElGX0JBUF9CUk9BRENBU1RfU0VUVVBfTkVYVF9CSVNfRVZFTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICpwID0gcF9wYXJhbTsKLSAgICAgICAgICB1aW50OF90IHN0YXR1cyA9ICpwKys7Ci0gICAgICAgICAgdWludDE2X3QgYmlzX2hhbmRsZSA9ICpwKys7Ci0gICAgICAgICAgYmlzX2hhbmRsZSA9IChiaXNfaGFuZGxlIHwgKCpwIDw8OCkpOwotICAgICAgICAgIGJ0aWZfYmFwX2JhX3Byb2Nlc3NfaXNvX3NldHVwKHN0YXR1cywgYmlzX2hhbmRsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXM6IGludmFsaWQgZXZlbnQgPSAlZCIsX19mdW5jX18sIGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYnJvYWRjYXN0ZXIgPT0gbnVsbHB0cikgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXM6SW52YWxpZCBicm9hZGNhc3RlciIsX19mdW5jX18pOwotICAgIH0KLSAgICBicm9hZGNhc3Rlci0+U3RhdGVNYWNoaW5lKCkuUHJvY2Vzc0V2ZW50KGV2ZW50LCAodm9pZCopcF9wYXJhbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX3Byb2Nlc3NfcmVxdWVzdCh0QTJEUF9DVFJMX0NNRCBjbWQpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXMiLF9fZnVuY19fKTsKLSAgdEEyRFBfQ1RSTF9BQ0sgc3RhdHVzID0gQTJEUF9DVFJMX0FDS19GQUlMVVJFOwotICAvL0J0aWZCYXBCcm9hZGNhc3RlciAqYnJvYWRjYXN0ZXI7Ci0gIHVpbnQzMl90IGV2ZW50ID0gMDsKLSNpZiBBSElNX0VOQUJMRUQKLSAgYnRpZl9haGltX3VwZGF0ZV9wZW5kaW5nX2NvbW1hbmQoY21kLCBCUk9BRENBU1QpOwotI2Vsc2UKLSAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6dXBkYXRlX3BlbmRpbmdfY29tbWFuZChjbWQpOwotI2VuZGlmCi0KLSAgc3dpdGNoKGNtZCkgewotICAgIGNhc2UgQTJEUF9DVFJMX0NNRF9TVEFSVDoKLSAgICAgIGlmICghYmx1ZXRvb3RoOjpoZWFkc2V0OjpidGlmX2hmX2lzX2NhbGxfdnJfaWRsZSgpKSB7Ci0gICAgICAgIHN0YXR1cyA9IEEyRFBfQ1RSTF9BQ0tfSU5DQUxMX0ZBSUxVUkU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGJ0aWZfYmFwX2Jtcy5GaW5kU3RyZWFtaW5nQm1zKCkgIT0gbnVsbHB0cikgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQnJvYWRjYXN0IGFscmVhZHkgc3RyZWFtaW5nLCBjcmFzaCByZWNvdmVyKD8pIixfX2Z1bmNfXyk7Ci0gICAgICAgIHN0YXR1cyA9IEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoYnRpZl9iYXBfYm1zLkZpbmRDb25maWd1cmVkQm1zKCkgPT0gbnVsbHB0cikgewotICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogQnJvYWRjYXN0IGlzIGRpc2FibGVkIixfX2Z1bmNfXyk7Ci0gICAgICAgIHN0YXR1cyA9IEEyRFBfQ1RSTF9BQ0tfRElTQ09OTkVDVF9JTl9QUk9HUkVTUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBidGlmX2JhcF9iYV9kaXNwYXRjaF9zbV9ldmVudChCVElGX0JBUF9CUk9BRENBU1RfU1RBUlRfU1RSRUFNX1JFUV9FVlQsIE5VTEwsIDApOwotICAgICAgZXZlbnQgPSBCVElGX0JBUF9CUk9BRENBU1RfU1RBUlRfU1RSRUFNX1JFUV9FVlQ7Ci0gICAgICAvL2Jyb2FkY2FzdGVyID0gYnRpZl9iYXBfYm1zLkZpbmRDb25maWd1cmVkQm1zKCk7Ci0gICAgICBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX1BFTkRJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfQ1RSTF9DTURfU1RPUDoKLSAgICAgIGJ0aWZfYmFwX2JhX2Rpc3BhdGNoX3NtX2V2ZW50KEJUSUZfQkFQX0JST0FEQ0FTVF9TVE9QX1NUUkVBTV9SRVFfRVZULCBOVUxMLCAwKTsKLSAgICAgIC8vYnJvYWRjYXN0ZXIgPSBidGlmX2JhcF9ibXMuRmluZFN0cmVhbWluZ0JtcygpOwotICAgICAgc3RhdHVzID0gQTJEUF9DVFJMX0FDS19TVUNDRVNTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQ6Ci0gICAgICBpZiAoYnRpZl9iYXBfYm1zLkZpbmRTdHJlYW1pbmdCbXMoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGJ0aWZfYmFwX2JhX2Rpc3BhdGNoX3NtX2V2ZW50KEJUSUZfQkFQX0JST0FEQ0FTVF9TVVNQRU5EX1NUUkVBTV9SRVFfRVZULCBOVUxMLCAwKTsKLSAgICAgICAgLy9icm9hZGNhc3RlciA9IGJ0aWZfYmFwX2Jtcy5GaW5kU3RyZWFtaW5nQm1zKCk7Ci0gICAgICAgIHN0YXR1cyA9IEEyRFBfQ1RSTF9BQ0tfUEVORElORzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IEEyRFBfQ1RSTF9BQ0tfU1VDQ0VTUzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBUFBMX1RSQUNFX0VSUk9SKCJVTlNVUFBPUlRFRCBDTUQgKCVkKSIsIGNtZCk7Ci0gICAgICBzdGF0dXMgPSBBMkRQX0NUUkxfQUNLX0ZBSUxVUkU7Ci0gICAgICBicmVhazsKLSAgfQotICAgIC8vIHNlbmQgdGhlIHJlc3BvbnNlIG5vdyBiYXNlZCBvbiBzdGF0dXMKLSAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIEEyRFBfQ1RSTF9DTURfU1RBUlQ6Ci0jaWYgQUhJTV9FTkFCTEVECi0gICAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdGFydGVkKHN0YXR1cywgQlJPQURDQVNUKTsKLSNlbHNlCi0gICAgICBibHVldG9vdGg6OmF1ZGlvOjphMmRwOjphY2tfc3RyZWFtX3N0YXJ0ZWQoc3RhdHVzKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX0NUUkxfQ01EX1NVU1BFTkQ6Ci0gICAgY2FzZSBBMkRQX0NUUkxfQ01EX1NUT1A6Ci0jaWYgQUhJTV9FTkFCTEVECi0gICAgICBidGlmX2FoaW1fYWNrX3N0cmVhbV9zdXNwZW5kZWQoc3RhdHVzLCBCUk9BRENBU1QpOwotI2Vsc2UKLSAgICAgIGJsdWV0b290aDo6YXVkaW86OmEyZHA6OmFja19zdHJlYW1fc3VzcGVuZGVkKHN0YXR1cyk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoc3RhdHVzICE9IEEyRFBfQ1RSTF9BQ0tfUEVORElORykgewotI2lmIEFISU1fRU5BQkxFRAotICAgIGJ0aWZfYWhpbV9yZXNldF9wZW5kaW5nX2NvbW1hbmQoQlJPQURDQVNUKTsKLSNlbHNlCi0gICAgYmx1ZXRvb3RoOjphdWRpbzo6YTJkcDo6cmVzZXRfcGVuZGluZ19jb21tYW5kKCk7Ci0jZW5kaWYKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBidGlmX2JhcF9pc19icm9hZGNhc3Rlcl92YWxpZCh1aW50OF90IGJpZ19oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2F0XSVzOiBoYW5kbGUgPSAlZCIsX19mdW5jX18sIGJpZ19oYW5kbGUpOwotICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUJJR0hhbmRsZShiaWdfaGFuZGxlKTsKLSAgaWYgKGJtcyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChwZW5kaW5nX2NtZCA9PSBzZXR1cF9pc28pIHsKLSAgICBpZiAoIWJtcy0+Q2hlY2tGbGFncyhCdGlmQmFwQnJvYWRjYXN0ZXI6OmtGbGFnSVNPUGVuZGluZykgfHwKLSAgICAgIGJtcy0+U3RhdGVNYWNoaW5lKCkuU3RhdGVJZCgpICE9IEJ0aWZCYXBCcm9hZGNhc3RTdGF0ZU1hY2hpbmU6OmtTdGF0ZUNvbmZpZ3VyZWQpIHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiW0JhcEJyb2FkY2FzdF06JXMgQnJvYWRjYXN0IGRpc2FibGVkIixfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChibXMtPkJJR1N0YXRlKCkgIT0gQklHX0NSRUFURUQpIHsKLSAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiW0JhcEJyb2FkY2FzdF06JXMgQnJvYWRjYXN0IGRpc2FibGVkIixfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2JhcF9iYV9wcm9jZXNzX2lzb19zZXR1cCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgYmlzX2hhbmRsZSkgewotICBCVElGX1RSQUNFX1dBUk5JTkcoIltCYXBCcm9hZGNhc3RdOiVzIixfX2Z1bmNfXyk7Ci0gIGlmICghYnRpZl9iYXBfaXNfYnJvYWRjYXN0ZXJfdmFsaWQoY3VycmVudF9oYW5kbGUpKSByZXR1cm47Ci0gIGlmIChwZW5kaW5nX2NtZCA9PSBzZXR1cF9pc28pIHsKLSAgICBsb2NhbF9wYXJhbVswXSA9IGN1cnJlbnRfaGFuZGxlOwotICAgIGxvY2FsX3BhcmFtWzFdID0gc3RhdHVzOwotICAgIGlmICghYnRpZl9iYXBfYmFfc2V0dXBfaXNvX2RhdGFwYXRoKGN1cnJlbnRfaGFuZGxlKSkgewotICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiW0JhcEJyb2FkY2FzdF06JXM6IG5vdGlmeSBiaXMgc2V0dXAiLF9fZnVuY19fKTsKLSAgICAgICBwZW5kaW5nX2NtZCA9IGlzb191bmtub3duOwotICAgICAgIGJ0aWZfYmFwX2JhX2hhbmRsZV9ldmVudChCVElGX0JBUF9CUk9BRENBU1RfQklTRVNfU0VUVVBfRVZULCAoY2hhciAqKWxvY2FsX3BhcmFtKTsKLSAgICAgfQotICB9IGVsc2UgaWYgKHBlbmRpbmdfY21kID09IHJlbW92ZV9pc28pIHsKLSAgICBpZiAoIWJ0aWZfYmFwX2JhX3JlbW92ZV9pc29fZGF0YXBhdGgoY3VycmVudF9oYW5kbGUpKSB7Ci0gICAgICBsb2NhbF9wYXJhbVswXSA9IGN1cnJlbnRfaGFuZGxlOwotICAgICAgbG9jYWxfcGFyYW1bMV0gPSBzdGF0dXM7Ci0gICAgICBwZW5kaW5nX2NtZCA9IGlzb191bmtub3duOwotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolczogbm90aWZ5IGJpcyByZW1vdmVkIixfX2Z1bmNfXyk7Ci0gICAgICBidGlmX2JhcF9iYV9oYW5kbGVfZXZlbnQoQlRJRl9CQVBfQlJPQURDQVNUX0JJU0VTX1JFTU9WRV9FVlQsIChjaGFyICopbG9jYWxfcGFyYW0pOwotICAgIH0KLSAgfQotfQotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfaXNvZGF0YXBhdGhfc2V0dXBfY2IodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGJpc19oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolcywgc3RhdHVzID0gJWQgZm9yIGhhbmRsZSA9ICVkIixfX2Z1bmNfXywgc3RhdHVzLCBiaXNfaGFuZGxlKTsKLSAgaWYgKCFidGlmX2JhcF9pc19icm9hZGNhc3Rlcl92YWxpZChjdXJyZW50X2hhbmRsZSkpIHJldHVybjsKLSAgaWYgKHBlbmRpbmdfY21kID09IHNldHVwX2lzbykgewotICAgIG1lbXNldChsb2NhbF9wYXJhbSwgMCwgMyk7Ci0gICAgbG9jYWxfcGFyYW1bMF0gPSBzdGF0dXM7Ci0gICAgbG9jYWxfcGFyYW1bMV0gPSBiaXNfaGFuZGxlICYgMHgwMEZGOwotICAgIGxvY2FsX3BhcmFtWzJdID0gKGJpc19oYW5kbGUgJiAweEZGMDApID4+IDg7Ci0gICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICB0b3RhbF9iaXNlcy0tOwotICAgICAgYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50KEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRVUF9ORVhUX0JJU19FVkVOVCwgKGNoYXIgKilsb2NhbF9wYXJhbSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxvY2FsX3BhcmFtWzBdID0gY3VycmVudF9oYW5kbGU7Ci0gICAgICBsb2NhbF9wYXJhbVsxXSA9IHN0YXR1czsKLSAgICAgIGJ0aWZfYmFwX2JhX2hhbmRsZV9ldmVudChCVElGX0JBUF9CUk9BRENBU1RfQklTRVNfU0VUVVBfRVZULCAoY2hhciAqKWxvY2FsX3BhcmFtKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocGVuZGluZ19jbWQgPT0gcmVtb3ZlX2lzbykgewotICAgIG1lbXNldChsb2NhbF9wYXJhbSwgMCwgMyk7Ci0gICAgbG9jYWxfcGFyYW1bMF0gPSBzdGF0dXM7Ci0gICAgbG9jYWxfcGFyYW1bMV0gPSBiaXNfaGFuZGxlICYgMHgwMEZGOwotICAgIGxvY2FsX3BhcmFtWzJdID0gKGJpc19oYW5kbGUgJiAweEZGMDApID4+IDg7Ci0gICAgYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50KEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRVUF9ORVhUX0JJU19FVkVOVCwgKGNoYXIqKWxvY2FsX3BhcmFtKTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBidGlmX2JhcF9iYV9zZXR1cF9pc29fZGF0YXBhdGgoaW50IGJpZ19oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolcyIsX19mdW5jX18pOwotICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUJJR0hhbmRsZShiaWdfaGFuZGxlKTsKLSAgaWYgKGJtcyA9PSBudWxscHRyKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolcyBibXMgaXMgbnVsbCIsX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWJ0aWZfYmFwX2lzX2Jyb2FkY2FzdGVyX3ZhbGlkKGJpZ19oYW5kbGUpKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChjdXJyZW50X2lzb19pbmRleCA9PSBibXMtPk51bUJpc2VzKCkpIHsKLSAgICBCVElGX1RSQUNFX1dBUk5JTkcoIltCYXBCcm9hZGNhc3RdOiVzIGNvbXBsZXRlZCIsX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwZW5kaW5nX2NtZCA9IHNldHVwX2lzbzsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEJpc0hhbmRsZXMgPSBibXMtPkdldEJJU0hhbmRsZXMoKTsKLSAgdEJUTV9CTEVfU0VUX0lTT19EQVRBX1BBVEhfUEFSQU0gKnBfcGFyYW0gPSBuZXcgdEJUTV9CTEVfU0VUX0lTT19EQVRBX1BBVEhfUEFSQU07Ci0gIHBfcGFyYW0tPmNvbm5faGFuZGxlID0gQmlzSGFuZGxlc1tjdXJyZW50X2lzb19pbmRleCsrXTsKLSAgcF9wYXJhbS0+ZGF0YV9wYXRoX2RpciA9IDA7Ci0gIHBfcGFyYW0tPmRhdGFfcGF0aF9pZCA9IFBBVEhfSUQ7Ly82OwotICBwX3BhcmFtLT5jb2RlY19pZFswXSA9IDY7Ci0gIHBfcGFyYW0tPmNvbnRfZGVsYXlbMF0gPSAwOwotICBwX3BhcmFtLT5jb250X2RlbGF5WzFdID0gMDsKLSAgcF9wYXJhbS0+Y29udF9kZWxheVsyXSA9IDA7Ci0gIHBfcGFyYW0tPmNvZGVjX2NvbmZpZ19sZW5ndGggPSAwOwotICAvL3BhcmFtLmNvZGVjX2NvbmZpZyA9IE5VTEw7Ci0gIHBfcGFyYW0tPnBfY2IgPSAodEJUTV9CTEVfU0VUVVBfSVNPX0RBVEFfUEFUSF9DTVBMX0NCKikmYnRpZl9iYXBfYmFfaXNvZGF0YXBhdGhfc2V0dXBfY2I7Ci0KLSAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolcyBmb3IgaGFuZGxlID0gJWQiLF9fZnVuY19fLCBwX3BhcmFtLT5jb25uX2hhbmRsZSk7Ci0gIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLGJhc2U6OkJpbmQoYmFzZTo6SWdub3JlUmVzdWx0KCZCVE1fQmxlU2V0SXNvRGF0YVBhdGgpLCBzdGQ6Om1vdmUocF9wYXJhbSkpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGJ0aWZfYmFwX2JhX3JlbW92ZV9pc29fZGF0YXBhdGgoaW50IGJpZ19oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XTolcyIsX19mdW5jX18pOwotICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUJJR0hhbmRsZShiaWdfaGFuZGxlKTsKLSAgaWYgKGJtcyA9PSBudWxscHRyKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XSVzOiBicm9hZGNhc3RlciBub3QgZm91bmQiLF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGN1cnJlbnRfaXNvX2luZGV4ID09IGJtcy0+TnVtQmlzZXMoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwZW5kaW5nX2NtZCA9IHJlbW92ZV9pc287Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBCaXNIYW5kbGVzID0gYm1zLT5HZXRCSVNIYW5kbGVzKCk7Ci0gIHVpbnQxNl90IGJpc19oYW5kbGUgPSBCaXNIYW5kbGVzW2N1cnJlbnRfaXNvX2luZGV4KytdOwotICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChiYXNlOjpJZ25vcmVSZXN1bHQoJkJUTV9CbGVSZW1vdmVJc29EYXRhUGF0aCksIGJpc19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOUFVUX0RBVEFQQVRILCZidGlmX2JhcF9iYV9pc29kYXRhcGF0aF9zZXR1cF9jYikpOwotICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgYnRpZl9iYXBfYmFfY3JlYXRfYmlnX2NiKHVpbnQ4X3QgYWR2X2lkLCB1aW50OF90IHN0YXR1cywgdWludDhfdCBiaWdfaGFuZGxlLAotICAgICAgICB1aW50MzJfdCBzeW5jX2RlbGF5LCB1aW50MzJfdCB0cmFuc3BvcnRfbGF0ZW5jeSwgdWludDhfdCBwaHksIHVpbnQ4X3QgbnNlLCB1aW50OF90IGJuLCB1aW50OF90IHB0bywKLSAgICAgICAgdWludDhfdCBpcmMsIHVpbnQxNl90IG1heF9wZHUsIHVpbnQxNl90IGlzb19pbnQsIHVpbnQ4X3QgbnVtX2Jpcywgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvbm5faGFuZGxlX2xpc3QpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIltCYXBCcm9hZGNhc3RdJXM6IGNhbGxiYWNrOiBzdGF0dXMgPSAlZCwgYWR2X2lkID0gJWQiLF9fZnVuY19fLCBzdGF0dXMsIGFkdl9pZCk7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUFkdkhhbmRsZShhZHZfaWQpOwotICAgIGlmIChibXMgPT0gbnVsbHB0cikgewotICAgICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGJyb2FkY2FzdGVyIG5vdCBmb3VuZCIsX19mdW5jX18pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYm1zLT5TdGF0ZU1hY2hpbmUoKS5TdGF0ZUlkKCkgIT0gQnRpZkJhcEJyb2FkY2FzdFN0YXRlTWFjaGluZTo6a1N0YXRlQ29uZmlndXJlZCB8fAotICAgICAgYm1zLT5CSUdTdGF0ZSgpICE9IEJJR19DUkVBVElORykgewotICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCJbQmFwQnJvYWRjYXN0XSVzOiBCcm9hZGNhc3QgaXMgZGlzYWJsaW5nIixfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJtcy0+U2V0QklHSGFuZGxlKGJpZ19oYW5kbGUpOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdJXM6IGNhbGxiYWNrOiBiaWdfaGFuZGxlID0gJWQiLF9fZnVuY19fLCBibXMtPkJJR0hhbmRsZSgpKTsKLSAgICBibXMtPlNldE51bUJpc2VzKG51bV9iaXMpOwotICAgIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdJXM6IGNhbGxiYWNrOiBudW1fYmlzID0gJWQiLF9fZnVuY19fLCBibXMtPk51bUJpc2VzKCkpOwotICAgIGJtcy0+U2V0QklTSGFuZGxlcyhjb25uX2hhbmRsZV9saXN0KTsKLSAgICBibXMtPlNldEJJR1N0YXRlKEJJR19DUkVBVEVEKTsKLSAgICBsb2NhbF9wYXJhbVswXSA9IGFkdl9pZDsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0aWZfYmFwX2JhX2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIEJUSUZfQkFQX0JST0FEQ0FTVF9TRVRVUF9JU09fREFUQVBBVEhfRVZULCBsb2NhbF9wYXJhbSkpOwotICB9IGVsc2UgewotICAgIGxvY2FsX3BhcmFtWzBdID0gYWR2X2lkOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgQlRJRl9CQVBfQlJPQURDQVNUX0RJU0FCTEVfRVZULCBsb2NhbF9wYXJhbSkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2JhX2NyZWF0ZV9iaWcoaW50IGFkdl9oYW5kbGUpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIltCYXBCcm9hZGNhc3RdOiVzIixfX2Z1bmNfXyk7Ci0gIC8vY2hhciBiYV9lbmNbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSNpZiBCSUdfQ09NUElMRQotICBCdGlmQmFwQnJvYWRjYXN0ZXIgKmJtcyA9IGJ0aWZfYmFwX2Jtcy5GaW5kQm1zRnJvbUFkdkhhbmRsZShhZHZfaGFuZGxlKTsKLSAgaWYgKGJtcyA9PSBudWxscHRyKSB7Ci0gICAgQlRJRl9UUkFDRV9FUlJPUigiJXM6IGJyb2FkY2FzdGVyIG5vdCBmb3VuZCIsX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBDcmVhdGVCSUdQYXJhbWV0ZXJzIHBhcmFtOwotICBwYXJhbS5hZHZfaGFuZGxlID0gYWR2X2hhbmRsZTsKLSAgcGFyYW0ubnVtX2JpcyA9IGJtcy0+TnVtQmlzZXMoKTsKLSAgcGFyYW0uc2R1X2ludCA9IG1CaWdQYXJhbXMuc2R1X2ludDsKLSAgcGFyYW0ubWF4X3NkdSA9IG1CaWdQYXJhbXMubWF4X3NkdTsKLSAgcGFyYW0ubWF4X3RyYW5zcG9ydF9sYXRlbmN5ID0gYnRpZl9iYXBfZ2V0X3RyYW5zcG9ydF9sYXRlbmN5KCk7Ci0gIHBhcmFtLnJ0biA9IG1CaWdQYXJhbXMucnRuOwotICBwYXJhbS5waHkgPSBtQmlnUGFyYW1zLnBoeTsKLSAgcGFyYW0ucGFja2luZyA9IG1CaWdQYXJhbXMucGFja2luZzs7Ly8wIDogc2VxdWVudGlhbCwgMTogaW50ZXJsZWF2ZWQKLSAgcGFyYW0uZnJhbWluZyA9IG1CaWdQYXJhbXMuZnJhbWluZzsKLSAgLy9vc2lfcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmJsdWV0b290aC5iYV9lbmNyeXB0aW9uIiwgYmFfZW5jLCAidHJ1ZSIpOwotICAvL2lmICghKHN0cm5jbXAoYmFfZW5jLCJ0cnVlIiw0KSkpIHsKLSAgaWYgKG1FbmNyeXB0aW9uRW5hYmxlZCkgewotICAgIC8vbUVuY3J5cHRpb25FbmFibGVkID0gdHJ1ZTsKLSAgICBwYXJhbS5lbmNyeXB0aW9uID0gMHgwMTsKLSAgfSBlbHNlIHsKLSAgICBtRW5jcnlwdGlvbkVuYWJsZWQgPSBmYWxzZTsKLSAgICBwYXJhbS5lbmNyeXB0aW9uID0gMHgwMDsKLSAgfQotICB1aW50OF90IGNvZGVbMTZdID0gezB9OwotICBpZiAobUVuY3J5cHRpb25FbmFibGVkKSB7Ci0gICAgICBtZW1jcHkoJmNvZGVbMF0sIGVuY3J5cHRpb25fa2V5LmRhdGEoKSxlbmNyeXB0aW9uX2tleS5zaXplKCkpOwotICB9Ci0gIGZvcihpbnQgaSA9MDsgaSA8IDE2OyBpKyspIHsKLSAgICBwYXJhbS5icm9hZGNhc3RfY29kZS5wdXNoX2JhY2soY29kZVsxNS1pXSk7Ci0gICAgQlRJRl9UUkFDRV9WRVJCT1NFKCJbQmFwQnJvYWRjYXN0XSVzOiBjb2RlWyVkXSA9ICV4LCBiY1slZF0gPSAlZCIsX19mdW5jX18saSxjb2RlW2ldLGkscGFyYW0uYnJvYWRjYXN0X2NvZGVbaV0pOwotICB9Ci0KLSAgYnRpZl9nYXR0X2dldF9pbnRlcmZhY2UoKS0+YWR2ZXJ0aXNlci0+Q3JlYXRlQklHKGFkdl9oYW5kbGUsIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0aWZfYmFwX2JhX2NyZWF0X2JpZ19jYikpOwotI2VuZGlmIC8qIEJJR19DT01QSUxFICovCi19Ci0KLSNpZiBCSUdfQ09NUElMRQotc3RhdGljIHZvaWQgYnRpZl9iYXBfYmFfdGVybWluYXRlX2JpZ19jYih1aW50OF90IHN0YXR1cywgdWludDhfdCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBCVElGX1RSQUNFX0lNUCgiW0JhcEJyb2FkY2FzdF06JXMiLF9fZnVuY19fKTsKLSAgbG9jYWxfcGFyYW1bMF0gPSBhZHZfaWQ7Ci0gIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0aWZfYmFwX2JhX2hhbmRsZV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICBCVElGX0JBUF9CUk9BRENBU1RfQklHX1JFTU9WRURfRVZULCAvKihjaGFyKikmYWR2X2lkKSovbG9jYWxfcGFyYW0pKTsKLQotfQotI2VuZGlmIC8qIEJJR19DT01QSUxFICovCi0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2JhX3Rlcm1pbmF0ZV9iaWcoaW50IGFkdl9oYW5kbGUsIGludCBiaWdfaGFuZGxlKSB7Ci0gIEJUSUZfVFJBQ0VfSU1QKCJbQmFwQnJvYWRjYXN0XTolcyIsX19mdW5jX18pOwotI2lmIEJJR19DT01QSUxFCi0gIGludCByZWFzb24gPSAweDE2OyAvL3VzZXIgdGVybWluYXRlZAotICBidGlmX2dhdHRfZ2V0X2ludGVyZmFjZSgpLT5hZHZlcnRpc2VyLT5UZXJtaW5hdGVCSUcoYWR2X2hhbmRsZSwgYmlnX2hhbmRsZSwgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfdGVybWluYXRlX2JpZ19jYikpOwotI2VuZGlmIC8qIEJJR19DT01QSUxFICovCi19Ci0KLXZvaWQgYnRpZl9iYXBfYmFfZGlzcGF0Y2hfc21fZXZlbnQoYnRpZl9iYXBfYnJvYWRjYXN0X3NtX2V2ZW50X3QgZXZlbnQsIHZvaWQqIHBfZGF0YSwgaW50IGxlbikgewotICBCVElGX1RSQUNFX0RFQlVHKCIlczogZXZlbnQ6ICVkLCBsZW46ICVkIiwgX19GVU5DVElPTl9fLCBldmVudCwgbGVuKTsKLSAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmYnRpZl9iYXBfYmFfaGFuZGxlX2V2ZW50LCBldmVudCwgKGNoYXIqKXBfZGF0YSkpOwotICBCVElGX1RSQUNFX0RFQlVHKCIlczogZXZlbnQgJWQgc2VudCIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOwotfQotCi12b2lkIGJ0aWZfYnJvYWRjYXN0X3Byb2Nlc3NfaGlkbF9ldmVudCh0QTJEUF9DVFJMX0NNRCBjbWQpIHsKLSAgYnRpZl9iYXBfYmFfZGlzcGF0Y2hfc21fZXZlbnQoQlRJRl9CQVBfQlJPQURDQVNUX1BST0NFU1NfSElETF9SRVFfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLWJvb2wgYnRpZl9iYXBfYnJvYWRjYXN0X2lzX2FjdGl2ZSgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXMiLF9fZnVuY19fKTsKLSAgaWYgKGJ0aWZfYmFwX2Jtcy5Ccm9hZGNhc3RBY3RpdmUoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBidGlmX2JhcF9iYV91cGRhdGVfYmlnX3BhcmFtcygpIHsKLSAgdWludDMyX3QgYml0cmF0ZSA9IGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfYml0cmF0ZSgpOwotICBtQmlnUGFyYW1zLm1heF9zZHUgPSBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X210dShiaXRyYXRlKTsKLSAgbUJpZ1BhcmFtcy5zZHVfaW50ID0gYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9mcmFtZWxlbmd0aCgpOwotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolczogbWF4X3NkdSA9ICVkLCBzZHVfaW50ID0gJWQiLF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBtQmlnUGFyYW1zLm1heF9zZHUsIG1CaWdQYXJhbXMuc2R1X2ludCk7Ci19Ci11aW50MTZfdCBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X3NhbXBsZV9yYXRlKCkgewotICBpZiAoY3VycmVudF9jb25maWcuc2FtcGxlX3JhdGUgIT0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUpIHsKLSAgICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolczogc2FtcGxlX3JhdGUgPSAlZCIsX19mdW5jX18sIGN1cnJlbnRfY29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgICByZXR1cm4gY3VycmVudF9jb25maWcuc2FtcGxlX3JhdGU7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXM6IGRlZmF1bHQgc2FtcGxlX3JhdGUgPSAlZCIsX19mdW5jX18sIGRlZmF1bHRfY29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgICByZXR1cm4gZGVmYXVsdF9jb25maWcuc2FtcGxlX3JhdGU7Ci0gIH0KLX0KLXVpbnQ4X3QgYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9jaF9tb2RlKCkgewotICBpZiAoY3VycmVudF9jb25maWcuY2hhbm5lbF9tb2RlICE9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkgewotICAgIHJldHVybiBjdXJyZW50X2NvbmZpZy5jaGFubmVsX21vZGU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRfY29uZmlnLmNoYW5uZWxfbW9kZTsKLSAgfQotfQotdWludDMyX3QgYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9tdHUodWludDMyX3QgYml0cmF0ZSkgewotICAvL2Jhc2VkIG9uIGJpdHJhdGUgc2V0ICgxMDAoODBrYnBzKSwgMTIwICg5NmticHMpLCAxNTUgKDEyOGticHMpKQotICB1aW50MzJfdCBtdHU7Ci0gIHN3aXRjaCAoYml0cmF0ZSkgewotICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgbXR1ID0gMzA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyNzczNDoKLSAgICAgICAgbXR1ID0gMjY7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0ODAwMDogey8vSEFQIEhRCi0gICAgICAgIGlmIChjdXJyZW50X2NvbmZpZy5jb2RlY19zcGVjaWZpY18yID09IDApCi0gICAgICAgICAgbXR1ID0gNDU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtdHUgPSA2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDMyMDAwOiB7Ci0gICAgICAgIGlmIChjdXJyZW50X2NvbmZpZy5jb2RlY19zcGVjaWZpY18yID09IDApCi0gICAgICAgICAgbXR1ID0gMzA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtdHUgPSA0MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDY0MDAwOiB7Ci0gICAgICAgIGlmIChjdXJyZW50X2NvbmZpZy5jb2RlY19zcGVjaWZpY18yID09IDApCi0gICAgICAgICAgbXR1ID0gNjA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtdHUgPSA4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDgwMDAwOiB7Ci0gICAgICAgIGlmIChjdXJyZW50X2NvbmZpZy5jb2RlY19zcGVjaWZpY18yID09IDApCi0gICAgICAgICAgbXR1ID0gNzU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtdHUgPSAxMDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA5NTA2MDoKLSAgICAgICAgbXR1ID0gOTc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5NTU1MDoKLSAgICAgICAgbXR1ID0gMTMwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgOTYwMDA6IHsKLSAgICAgICAgaWYgKGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzIgPT0gMCkKLSAgICAgICAgICBtdHUgPSA5MDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG10dSA9IDEyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDEyNDgwMDoKLSAgICAgICAgbXR1ID0gMTE3OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTI0MDAwOgotICAgICAgICBtdHUgPSAxNTU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBtdHUgPSAxMDA7Ci0gIH0KLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF0lczogbXR1ID0gJWQiLF9fZnVuY19fLG10dSk7Ci0gIHJldHVybiBtdHU7Ci19Ci0KLXVpbnQxNl90IGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfZnJhbWVsZW5ndGgoKSB7Ci0gIHVpbnQxNl90IGZyYW1lX2R1cmF0aW9uOwotICBzd2l0Y2ggKGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzIpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgZnJhbWVfZHVyYXRpb24gPSA3NTAwOyAvLzcuNW1zZWMKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGZyYW1lX2R1cmF0aW9uID0gMTAwMDA7IC8vMTBtc2VjCi0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZnJhbWVfZHVyYXRpb24gPSAxMDAwMDsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XSVzOiBiaXRyYXRlID0gJWQiLF9fZnVuY19fLGZyYW1lX2R1cmF0aW9uKTsKLSAgcmV0dXJuIGZyYW1lX2R1cmF0aW9uOwotfQotCi11aW50MzJfdCBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X2JpdHJhdGUoKSB7Ci0gIC8vYmFzZWQgb24gYml0cmF0ZSBzZXQgKDEwMCg4MGticHMpLCAxMjAgKDk2a2JwcyksIDE1NSAoMTI4a2JwcykpCi0gIHVpbnQzMl90IGJpdHJhdGUgPSAwOwotICBzd2l0Y2ggKGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzEpIHsKLSAgICAgIGNhc2UgMTAwMDogLy8zMmticHMKLSAgICAgICAgaWYgKGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzIgPT0gMCkgewotICAgICAgICAgIGJpdHJhdGUgPSAyNzczNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBiaXRyYXRlID0gMjQwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMDE6IC8vMzJrYnBzCi0gICAgICAgIGJpdHJhdGUgPSAzMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMDI6IC8vNDhrYnBzCi0gICAgICAgIGJpdHJhdGUgPSA0ODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMDM6IC8vNjRrYnBzCi0gICAgICAgIGJpdHJhdGUgPSA2NDAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMDQ6IC8vODBrYnBzCi0gICAgICAgIGJpdHJhdGUgPSA4MDAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMDU6IC8vOTU1LjU1a2JwcwotICAgICAgICBpZiAoY3VycmVudF9jb25maWcuY29kZWNfc3BlY2lmaWNfMiA9PSAwKSB7Ci0gICAgICAgICAgYml0cmF0ZSA9IDk1MDYwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJpdHJhdGUgPSA5NTU1MDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTAwNjogLy85NmticHMKLSAgICAgICAgYml0cmF0ZSA9IDk2MDAwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTAwNzogLy85NmticHMKLSAgICAgICAgaWYgKGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzIgPT0gMCkgewotICAgICAgICAgIGJpdHJhdGUgPSAxMjQ4MDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYml0cmF0ZSA9IDEyNDAwMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJpdHJhdGUgPSA4MDAwMDsKLSAgfQotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XSVzOiBiaXRyYXRlID0gJWQiLF9fZnVuY19fLGJpdHJhdGUpOwotICByZXR1cm4gYml0cmF0ZTsKLX0KLQotdWludDhfdCBidGlmX2JhcF9icm9hZGNhc3RfZ2V0X2NoX2NvdW50KCkgewotICBpZiAoY3VycmVudF9jb25maWcuY2hhbm5lbF9tb2RlID09IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgcmV0dXJuIEJST0FEQ0FTVF9TUExJVF9TVEVSRU8gKiBtQmlzTXVsdGlwbGllcjsKLSAgfSBlbHNlIGlmIChjdXJyZW50X2NvbmZpZy5jaGFubmVsX21vZGUgPT0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05PIHx8Ci0gICAgY3VycmVudF9jb25maWcuY2hhbm5lbF9tb2RlID09IEJUQkFQX0NPREVDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8pIHsKLSAgICByZXR1cm4gQlJPQURDQVNUX01PTk9fSk9JTlQgKiBtQmlzTXVsdGlwbGllcjsKLSAgfQotICByZXR1cm4gQlJPQURDQVNUX1NQTElUX1NURVJFTzsvL2RlZmF1bHQgc3BsaXQgc3RlcmVvCi19Ci0KLXN0YXRpYyB1aW50MTZfdCBidGlmX2JhcF9nZXRfdHJhbnNwb3J0X2xhdGVuY3koKSB7Ci0gIHVpbnQxNl90IGxhdGVuY3k7Ci0gIGlmIChtQmlnUGFyYW1zLm1heF90cmFuc3BvcnRfbGF0ZW5jeSAhPSAwKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF0lczogbGF0ZW5jeSBzZXQgYnkgcHJvcGVydHk6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUJpZ1BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3kpOwotICAgIHJldHVybiBtQmlnUGFyYW1zLm1heF90cmFuc3BvcnRfbGF0ZW5jeTsKLSAgfQotICBzd2l0Y2ggKGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzIpIHsKLSAgICBjYXNlIDA6Ci0gICAgICBsYXRlbmN5ID0gNDU7Ly80NW1zZWMgZm9yIDcuNW1zZWMgZnJhbWUgZHVyYXRpb24KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICBkZWZhdWx0OgotICAgICAgbGF0ZW5jeSA9IDYxOy8vNjFtc2VjIGZvciAxMG1zZWMgZnJhbWUgZHVyYXRpb24KLSAgICAgIGJyZWFrOwotICB9Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdJXM6IHRyYW5zcG9ydCBsYXRlbmN5ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGxhdGVuY3kpOwotICByZXR1cm4gbGF0ZW5jeTsKLX0KLQotYm9vbCBidGlmX2JhcF9icm9hZGNhc3RfaXNfc2ltdWxjYXN0X2VuYWJsZWQoKSB7Ci0gIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsnXDAnfTsKLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3IuYnRzdGFjay5wYXJ0aWFsX3NpbXVsY2FzdCIsdmFsdWUsImZhbHNlIik7Ci0gIGlmIChzdHJjbXAodmFsdWUsICJ0cnVlIikgPT0gMCkgewotICAgIEJUSUZfVFJBQ0VfSU1QKCJbQmFwQnJvYWRjYXN0XSVzOlBhcnRpYWwgc2ltdWxjYXN0IGVuYWJsZWQiLF9fZnVuY19fKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2JhX2NvcHlfYnJvYWRjYXN0X2lkKCkgewotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolcyIsX19mdW5jX18pOwotICBmb3IoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiQnJvYWRjYXN0X0lEWyVkXSA9ICVkIixqLCBtQnJvYWRjYXN0SURbal0pOwotICB9Ci0gIGJ0aWZfcmVwb3J0X2Jyb2FkY2FzdF9pZCgpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2JhcF9iYV9nZW5lcmF0ZV9icm9hZGNhc3RfaWQoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzIixfX2Z1bmNfXyk7Ci0gIGJ0c25kX2hjaWNfYmxlX3JhbmQoYmFzZTo6QmluZChbXShCVF9PQ1RFVDggcmFuZCkgewotICAgZm9yKGludCBhID0gMDsgYSA8IDM7IGErKykgewotICAgICB1aW50OF90IHZhbCA9IHJhbmRbYV07Ci0gICAgIEJUSUZfVFJBQ0VfREVCVUcoInZhbCA9ICVkIiwgdmFsKTsKLSAgICAgbUJyb2FkY2FzdElEW2FdID0gdmFsOwotICAgfQotICAgYnRpZl9iYXBfYmFfY29weV9icm9hZGNhc3RfaWQoKTsKLSAgfSkpOwotfQotCi1zdGF0aWMgdm9pZCBidGlmX2JhcF9iYV9nZW5lcmF0ZV9lbmNfa2V5X2xvY2FsKGludCBsZW5ndGgpIHsKLSAgQlRJRl9UUkFDRV9ERUJVRygiW0JhcEJyb2FkY2FzdF06JXMgbGVuZ3RoID0gJWQiLF9fZnVuY19fLCBsZW5ndGgpOwotICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgaW50IGkgPSAwOwotICB1aW50OF90IHJhbmRvbV9rZXlbT0NURVQxNl9MRU5dID0gezB9OwotICB3aGlsZSAoaSA8IGxlbmd0aCkgewotICAgIHVpbnQ4X3QgZ2VuID0gKHVpbnQ4X3QpKHJhbmQoKSAlIDI1Nik7Ci0gICAgdWludDhfdCByYW5nZSA9IChnZW4gJSA3NSkgKyA0ODsvL0FscGhhbnVtZXJpYyByYW5nZQotICAgIGlmICgocmFuZ2UgPiA1NyAmJiByYW5nZSA8IDY1KSB8fAotICAgICAgKHJhbmdlID4gOTAgJiYgcmFuZ2UgPCA5NykpIHsKLSAgICAgIC8vQXNjaWkgcmFuZ2UgNTggdG8gNjQKLSAgICAgIC8vOiw7LCA8LCA9LCA+LCA/LCBAXQotICAgICAgLy9yYW5nZSA5MSB0byA5NgotICAgICAgLy9bLCBcLCBdLCBeLCBfLCBgCi0gICAgICBCVElGX1RSQUNFX0RFQlVHKCJHZW5lcmF0ZSBrZXk6IEludmFsaWQgY2hhcmFjdGVyIik7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcmFuZG9tX2tleVtpXSA9IHJhbmdlOwotICAgIGkrKzsKLSAgfQotCi0gIG1lbXNldChlbmNyeXB0aW9uX2tleS5kYXRhKCksIDAsIE9DVEVUMTZfTEVOKTsKLSAgbWVtY3B5KGVuY3J5cHRpb25fa2V5LmRhdGEoKSxyYW5kb21fa2V5LCBPQ1RFVDE2X0xFTik7Ci0gIHJldmVyc2VDb2RlKHJhbmRvbV9rZXkpOwotICBCVElGX1RSQUNFX0RFQlVHKCJbQmFwQnJvYWRjYXN0XTolcyBzdG9yaW5nIG5ldyBleGNyeXB0aW9uIGtleSBvZiBsZW5ndGggJWQiLF9fZnVuY19fLCBPQ1RFVDE2X0xFTik7Ci0gIGlmIChidGlmX2NvbmZpZ19zZXRfYmluKCJBZGFwdGVyIiwgIkJBUF9CQV9FTkNfS0VZIiwgLyplbmNyeXB0aW9uX2tleS5kYXRhKCkqL3JhbmRvbV9rZXksIE9DVEVUMTZfTEVOKSkgewotICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogc3RvcmVkIG5ldyBrZXkiLCBfX2Z1bmNfXyk7Ci0gICAgIGJ0aWZfY29uZmlnX2ZsdXNoKCk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IGZhaWxlZCB0byBzdG9yZSBuZXcga2V5IiwgX19mdW5jX18pOzsKLSAgfQotICBpZiAobm90aWZ5X2tleV9nZW5lcmF0ZWQpIHsKLSAgICBub3RpZnlfa2V5X2dlbmVyYXRlZCA9IGZhbHNlOwotICAgIGJ0aWZfcmVwb3J0X2VuY3lwdGlvbl9rZXkoKTsKLSAgfQotfQotdm9pZCBpbml0X2xvY2FsX2NhcGFiaWxpdGllcygpIHsKLSAgYnJvYWRjYXN0X2NvZGVjc19jYXBhYmlsaXRpZXMucHVzaF9iYWNrKGJyb2FkY2FzdF9sb2NhbF9jYXBhYmlsaXR5KTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IGluaXRfYnJvYWRjYXN0KAotICAgIGJ0YmFwX2Jyb2FkY2FzdF9jYWxsYmFja3NfdCogY2FsbGJhY2tzLAotICAgIGludCBtYXhfYnJvYWRjYXN0LCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnLCBpbnQgbW9kZSkgewotICBpZihtYXhfYnJvYWRjYXN0ID4gQlRJRl9CQVBfQkFfTlVNX0NCKSB7Ci0gICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogQXBwIHNldHRpbmcgbWF4aW11bSBhbGxvd2FibGUgYnJvYWRjYXN0KCVkKSBcCi0gICAgICAgICAgICAgIHRvIG1vcmUgdGhhbiBsaW1pdCglZCkiLAotICAgICAgICAgICAgX19mdW5jX18sIG1heF9icm9hZGNhc3QsIEJUSUZfQkFQX0JBX05VTV9DQik7Ci0gICAgbWF4X2Jyb2FkY2FzdCA9IEJUSUZfQkFQX0JBX05VTV9DQjsKLSAgfQotICByZXR1cm4gYnRpZl9iYXBfYm1zLkluaXQoY2FsbGJhY2tzLCBtYXhfYnJvYWRjYXN0LCBjb2RlY19jb25maWcsIG1vZGUpOwotfQotc3RhdGljIGJ0X3N0YXR1c190IGVuYWJsZV9icm9hZGNhc3QoYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZykgewotICBCVElGX1RSQUNFX0lNUCgiW0JhcEJyb2FkY2FzdF06JXMiLCBfX2Z1bmNfXyk7Ci0gIGN1cnJlbnRfY29uZmlnID0gY29kZWNfY29uZmlnOwotICBwcmludF9jb25maWcoY3VycmVudF9jb25maWcpOwotICByZXR1cm4gYnRpZl9iYXBfYm1zLkVuYWJsZUJyb2FkY2FzdChjb2RlY19jb25maWcpOwotfQotc3RhdGljIGJ0X3N0YXR1c190IGRpc2FibGVfYnJvYWRjYXN0KGludCBhZHZfaWQpIHsKLSAgQlRJRl9UUkFDRV9JTVAoIltCYXBCcm9hZGNhc3RdOiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYnRpZl9iYXBfYm1zLkRpc2FibGVCcm9hZGNhc3QoYWR2X2lkKTsKLX0KLXN0YXRpYyBidF9zdGF0dXNfdCBzZXRfYnJvYWRjYXN0X2FjdGl2ZShib29sIHNldHVwLCB1aW50OF90IGFkdl9pZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCJbQmFwQnJvYWRjYXN0XTolcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGJ0aWZfYmFwX2Jtcy5TZXRCcm9hZGNhc3RBY3RpdmUoc2V0dXAsIGFkdl9pZCk7Ci19Ci1zdGF0aWMgYnRfc3RhdHVzX3QgY29uZmlnX2NvZGVjKHVpbnQ4X3QgYWR2X2hhbmRsZSwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZykgewotICBCVElGX1RSQUNFX0lNUCgiW0JhcEJyb2FkY2FzdF06JXMiLCBfX2Z1bmNfXyk7Ci0gIGJvb2wgY29uZmlnX2NoYW5nZWQgPSBmYWxzZTsKLSAgcHJpbnRfY29uZmlnKGNvZGVjX2NvbmZpZyk7Ci0gIGlmIChjb2RlY19jb25maWcuc2FtcGxlX3JhdGUgIT0gY3VycmVudF9jb25maWcuc2FtcGxlX3JhdGUgfHwKLSAgICBjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlICE9IGN1cnJlbnRfY29uZmlnLmNoYW5uZWxfbW9kZSB8fAotICAgIGNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY18xICE9IGN1cnJlbnRfY29uZmlnLmNvZGVjX3NwZWNpZmljXzEgfHwKLSAgICBjb2RlY19jb25maWcuY29kZWNfc3BlY2lmaWNfMiAhPSBjdXJyZW50X2NvbmZpZy5jb2RlY19zcGVjaWZpY18yIHx8Ci0gICAgY29kZWNfY29uZmlnLmNvZGVjX3NwZWNpZmljXzQgPiAwKSB7Ci0gICAgY29uZmlnX2NoYW5nZWQgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGNvbmZpZ19jaGFuZ2VkKSB7Ci0gICAgcmV0dXJuIGJ0aWZfYmFwX2Jtcy5TZXRVc2VyQ29uZmlnKGFkdl9oYW5kbGUsIGNvZGVjX2NvbmZpZyk7Ci0gIH0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotc3RhdGljIGJ0X3N0YXR1c190IHNldF9lbmNyeXB0aW9uKGJvb2wgZW5hYmxlZCwgdWludDhfdCBlbmNfbGVuZ3RoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzOiBsZW5ndGggJWQiLCBfX2Z1bmNfXywgZW5jX2xlbmd0aCk7Ci0gIG1FbmNyeXB0aW9uRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gIC8qaWYgKCFtRW5jcnlwdGlvbkVuYWJsZWQpIHsKLSAgICBidGlmX2NvbmZpZ19yZW1vdmUoIkFkYXB0ZXIiLCAiQkFQX0JBX0VOQ19LRVkiKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0qLwotICByZXR1cm4gYnRpZl9iYXBfYm1zLlNldEVuY3J5cHRpb24oZW5jX2xlbmd0aCk7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfZW5jcnlwdGlvbl9rZXkoKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZW5jcnlwdGlvbl9rZXkuZGF0YSgpKSwgT0NURVQxNl9MRU4pOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3Qgc2V0dXBfYXVkaW9fZGF0YV9wYXRoKGJvb2wgZW5hYmxlLCB1aW50OF90IGFkdl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaWdfaGFuZGxlLCBpbnQgbnVtX2Jpc2VzLCBpbnQgKmJpc19oYW5kbGVzKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIltCYXBCcm9hZGNhc3RdOiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1zdGF0aWMgdm9pZCBjbGVhbnVwX2Jyb2FkY2FzdCgpIHsKLSAgQlRJRl9UUkFDRV9FUlJPUigiW0JhcEJyb2FkY2FzdF06JXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0aWZfYmFwX2Jtcy5DbGVhbnVwKCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBidGJhcF9icm9hZGNhc3RfaW50ZXJmYWNlX3QgYnRfYmFwX2Jyb2FkY2FzdF9zcmNfaW50ZXJmYWNlID0gewotICAgIHNpemVvZihidGJhcF9icm9hZGNhc3RfaW50ZXJmYWNlX3QpLAotICAgIGluaXRfYnJvYWRjYXN0LAotICAgIGVuYWJsZV9icm9hZGNhc3QsCi0gICAgZGlzYWJsZV9icm9hZGNhc3QsCi0gICAgc2V0X2Jyb2FkY2FzdF9hY3RpdmUsCi0gICAgY29uZmlnX2NvZGVjLAotICAgIHNldHVwX2F1ZGlvX2RhdGFfcGF0aCwKLSAgICBnZXRfZW5jcnlwdGlvbl9rZXksCi0gICAgc2V0X2VuY3J5cHRpb24sCi0gICAgY2xlYW51cF9icm9hZGNhc3QsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9iYXBfYnJvYWRjYXN0X2dldF9pbnRlcmZhY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgQmFwIGJyb2FkY2FzdCBjYWxsYmFjayBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0YmFwX2Jyb2FkY2FzdF9pbnRlcmZhY2VfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBidGJhcF9icm9hZGNhc3RfaW50ZXJmYWNlX3QqIGJ0aWZfYmFwX2Jyb2FkY2FzdF9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAmYnRfYmFwX2Jyb2FkY2FzdF9zcmNfaW50ZXJmYWNlOwotfQotCi0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2JhcF9jb2RlY191dGlscy5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2JhcF9jb2RlY191dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3YzNmNi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfY29kZWNfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYnRhX2Nsb3N1cmVfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2JhcF91Y2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0KLS8vIENhcGFiaWxpdGllcyB0byBiZSBzdG9yZWQgb24gQ29kZWNDb25maWcgc3RydWN0dXJlIDoKLS8vIFN1cHBvcnRlZF9TYW1wbGluZ19GcmVxdWVuY2llc8KgICggY29kZWMgY29uZmlnIHNhbXBsaW5nIHJhdGUgKQotLy8gQXVkaW9fQ2hhbm5lbF9Db3VudHMgKCBjb2RlYyBjb25maWcgY2hhbm5lbCBtb2RlICkKLS8vIFN1cHBvcnRlZF9GcmFtZV9EdXJhdGlvbnMgKCAxc3QgYnl0ZSBvZiBjb2RlYyBzcGVjaWZpYyAxICnCoAotLy8gTWF4X1N1cHBvcnRlZF9MQzNfRnJhbWVzX1Blcl9TRFXCoCAoIDJuZCBieXRlIG9mIGNvZGVjIHNwZWNpZmljIDEpCi0vLyBQcmVmZXJyZWRfQXVkaW9fQ29udGV4dHMgKCAzJjQgYnl0ZXMgb2YgY29kZWMgc3BlY2lmaWMgMSApCi0vLyBTdXBwb3J0ZWRfT2N0ZXRzX1Blcl9Db2RlY19GcmFtZSAoIGZpcnN0IDQgYnl0ZXMgY29kZWMgc3BlY2lmaWMgMiApCi0vKiBWZW5kb3JfU3BlY2lmaWMgTWV0YWRhdGEgKCBmaXJzdCA0IGJ5dGVzIG9mIGNvZGVjIHNwZWNpZmljIDMpCi0gKiAgICAxc3QgYnl0ZSBjb252ZXlzIExDM1Egc3VwcG9ydCwKLSAqICAgIDJuZCBieXRlIGNvbnZleXMgTEMzUSB2ZXJzaW9uCi0gKi8KLQotLy8gQ29uZmlndXJhdGlvbnMgdG8gYmUgc3RvcmVkIGluIENvZGVjQ29uZmlnIHN0cnVjdHVyZSA6Ci0vLyBTYW1wbGluZ19GcmVxdWVuY3nCoCAoIGNvZGVjIGNvbmZpZyBzYW1wbGluZyByYXRlICkKLS8vIEF1ZGlvX0NoYW5uZWxfQWxsb2NhdGlvbiAoIGNvZGVjIGNvbmZpZyBjaGFubmVsIG1vZGUgKQotLy8gRnJhbWVfRHVyYXRpb27CoCAoIDV0aCBieWUgb2YgY29kZWMgc3BlY2lmaWMgMSApwqAKLS8vIExDM19CbG9ja3NfUGVyX1NEVSAoIDZ0aCBieXRlIG9mIGNvZGVjIHNwZWNpZmljIDEgKQotLy8gUHJlZmVycmVkX0F1ZGlvX0NvbnRleHRzICggNyY4IGJ5dGVzIG9mIGNvZGVjIHNwZWNpZmljIDEgKQotLy8gT2N0ZXRzX1Blcl9Db2RlY19GcmFtZSAoIDIgYnl0ZXPCoCApwqAgKCA1JjZ0aCBieXRlcyBvZiBjb2RlYyBzcGVjaWZpYyAyICkKLS8vIExDM1EgcHJlZmVycmVkICgxIGJ5dGUpICAoIDd0aCBieXRlIG9mIGNvZGVjIHNwZWNpZmljIDIgKQotLyogVmVuZG9yX1NwZWNpZmljIE1ldGFkYXRhICggZmlyc3QgNCBieXRlcyBvZiBjb2RlYyBzcGVjaWZpYyAzKQotICogICAgMXN0IGJ5dGUgY29udmV5cyBMQzNRIHN1cHBvcnQsCi0gKiAgICAybmQgYnl0ZSBjb252ZXlzIExDM1EgdmVyc2lvbgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9wYWNzX2NsaWVudC5oPgotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDaGFubmVsTW9kZTsKLQotY29uc3RleHByIHVpbnQ4X3QgIENBUEFfU1VQX0ZSQU1FX0RVUl9JTkRFWCAgICAgICAgICAgPSAweDAwOyAvLyBDUzEKLWNvbnN0ZXhwciB1aW50OF90ICBDQVBBX01BWF9TVVBfTEMzX0ZSQU1FU19JTkRFWCAgICAgID0gMHgwMTsgLy8gQ1MxCi1jb25zdGV4cHIgdWludDhfdCAgQ0FQQV9QUkVGX0FVRElPX0NPTlRfSU5ERVggICAgICAgICA9IDB4MDI7IC8vIENTMQotY29uc3RleHByIHVpbnQ4X3QgIENBUEFfU1VQX09DVFNfUEVSX0ZSQU1FX0lOREVYICAgICAgPSAweDAwOyAvLyBDUzIKLQotY29uc3RleHByIHVpbnQ4X3QgIENBUEFfVkVORE9SX01FVEFEQVRBX0xDM1FfUFJFRl9JTkRFWCA9IDB4MDA7IC8vIENTMwotY29uc3RleHByIHVpbnQ4X3QgIENBUEFfVkVORE9SX01FVEFEQVRBX0xDM1FfVkVSX0lOREVYICA9IDB4MDE7IC8vIENTMwotCi1jb25zdGV4cHIgdWludDhfdCAgQ09ORklHX0ZSQU1FX0RVUl9JTkRFWCAgICAgICAgICAgPSAweDA0OyAvLyBDUzEKLWNvbnN0ZXhwciB1aW50OF90ICBDT05GSUdfTEMzX0JMT0NLU19JTkRFWCAgICAgICAgICA9IDB4MDU7IC8vIENTMQotY29uc3RleHByIHVpbnQ4X3QgIENPTkZJR19QUkVGX0FVRElPX0NPTlRfSU5ERVggICAgID0gMHgwNjsgLy8gQ1MxCi1jb25zdGV4cHIgdWludDhfdCAgQ09ORklHX09DVFNfUEVSX0ZSQU1FX0lOREVYICAgICAgPSAweDA0OyAvLyBDUzIKLWNvbnN0ZXhwciB1aW50OF90ICBDT05GSUdfTEMzUV9QUkVGX0lOREVYICAgICAgICAgICA9IDB4MDY7IC8vIENTMgotY29uc3RleHByIHVpbnQ4X3QgIENPTkZJR19WRU5ET1JfTUVUQURBVEFfTEMzUV9QUkVGX0lOREVYID0gMHgwMDsgLy8gQ1MzCi1jb25zdGV4cHIgdWludDhfdCAgQ09ORklHX1ZFTkRPUl9NRVRBREFUQV9MQzNRX1ZFUl9JTkRFWCAgPSAweDAxOyAvLyBDUzMKLQotLy8gY2FwYWJpbGl0aWVzCi1ib29sIFVwZGF0ZUNhcGFTdXBGcmFtZUR1cmF0aW9ucyhDb2RlY0NvbmZpZyAqY29uZmlnICwgdWludDhfdCBzdXBfZnJhbWUpIHsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xICY9IH4oMHhGRiA8PCAoQ0FQQV9TVVBfRlJBTUVfRFVSX0lOREVYICogOCkpOwotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzEgfD0gc3VwX2ZyYW1lIDw8IChDQVBBX1NVUF9GUkFNRV9EVVJfSU5ERVggKiA4KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVXBkYXRlQ2FwYU1heFN1cExjM0ZyYW1lcyhDb2RlY0NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9zdXBfbGMzX2ZyYW1lcykgewotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzEgJj0gfigweEZGIDw8IChDQVBBX01BWF9TVVBfTEMzX0ZSQU1FU19JTkRFWCAqIDgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xIHw9IG1heF9zdXBfbGMzX2ZyYW1lcyA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDQVBBX01BWF9TVVBfTEMzX0ZSQU1FU19JTkRFWCAqIDgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBVcGRhdGVDYXBhUHJlZmVycmVkQ29udGV4dHMoQ29kZWNDb25maWcgKmNvbmZpZywgdWludDE2X3QgY29udGV4dHMpIHsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xICY9IH4oMHhGRkZGIDw8IChDQVBBX1BSRUZfQVVESU9fQ09OVF9JTkRFWCAqIDgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xIHw9IGNvbnRleHRzIDw8IChDQVBBX1BSRUZfQVVESU9fQ09OVF9JTkRFWCAqIDgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBVcGRhdGVDYXBhU3VwT2N0c1BlckZyYW1lKENvZGVjQ29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvY3RzX3Blcl9mcmFtZSkgewotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzIgJj0gfigweEZGRkZGRkZGIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChDQVBBX1NVUF9PQ1RTX1BFUl9GUkFNRV9JTkRFWCAqIDgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18yIHw9IG9jdHNfcGVyX2ZyYW1lIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0FQQV9TVVBfT0NUU19QRVJfRlJBTUVfSU5ERVggKiA4KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVXBkYXRlQ2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoQ29kZWNDb25maWcgKmNvbmZpZywgYm9vbCBsYzNxX3ByZWYpIHsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18zICY9IH4oMHhGRiA8PCAoQ0FQQV9WRU5ET1JfTUVUQURBVEFfTEMzUV9QUkVGX0lOREVYICogOCkpOwotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzMgfD0gbGMzcV9wcmVmIDw8IChDQVBBX1ZFTkRPUl9NRVRBREFUQV9MQzNRX1BSRUZfSU5ERVggKiA4KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVXBkYXRlQ2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcihDb2RlY0NvbmZpZyAqY29uZmlnLCB1aW50OF90IGxjM3FfdmVyKSB7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMyAmPSB+KDB4RkYgPDwgKENBUEFfVkVORE9SX01FVEFEQVRBX0xDM1FfVkVSX0lOREVYICogOCkpOwotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzMgfD0gbGMzcV92ZXIgPDwgKENBUEFfVkVORE9SX01FVEFEQVRBX0xDM1FfVkVSX0lOREVYICogOCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi11aW50OF90IEdldENhcGFTdXBGcmFtZUR1cmF0aW9ucyhDb2RlY0NvbmZpZyAqY29uZmlnKSB7Ci0gIHJldHVybiAoY29uZmlnLT5jb2RlY19zcGVjaWZpY18xID4+ICg4KkNBUEFfU1VQX0ZSQU1FX0RVUl9JTkRFWCkpICYgMHhmZjsKLX0KLQotdWludDhfdCBHZXRDYXBhTWF4U3VwTGMzRnJhbWVzKENvZGVjQ29uZmlnICpjb25maWcpIHsKLSAgaWYgKCgoY29uZmlnLT5jb2RlY19zcGVjaWZpY18xID4+Ci0gICAgICAgICAgICAgICAgKDgqQ0FQQV9NQVhfU1VQX0xDM19GUkFNRVNfSU5ERVgpKSAmIDB4ZmYpID09IDB4MCkgewotICAgIHVpbnQ4X3QgbWF4X2NobmxfY291bnQgPSAwOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IE1heCBTdXAgTEMzIGZyYW1lcyBpcyAwLCBkZXJpdmluZyBiYXNlZCBvbiBjaG5sIGNvdW50IjsKLSAgICBpZihzdGF0aWNfY2FzdDx1aW50MTZfdD4gKGNvbmZpZy0+Y2hhbm5lbF9tb2RlKSAmCi0gICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+IChDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPKSkgewotICAgICAgbWF4X2NobmxfY291bnQgPSAyOwotICAgIH0gZWxzZSBpZihzdGF0aWNfY2FzdDx1aW50MTZfdD4gKGNvbmZpZy0+Y2hhbm5lbF9tb2RlKSAmCi0gICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk8pKSB7Ci0gICAgICBtYXhfY2hubF9jb3VudCA9IDE7Ci0gICAgfQotICAgIHJldHVybiBtYXhfY2hubF9jb3VudDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSA+PgotICAgICAgICAgICAgICAgKDgqQ0FQQV9NQVhfU1VQX0xDM19GUkFNRVNfSU5ERVgpKSAmIDB4ZmY7Ci0gIH0KLX0KLQotdWludDE2X3QgR2V0Q2FwYVByZWZlcnJlZENvbnRleHRzKENvZGVjQ29uZmlnICpjb25maWcpIHsKLSAgcmV0dXJuIChjb25maWctPmNvZGVjX3NwZWNpZmljXzEgPj4KLSAgICAgICAgICAgICAgICAoOCpDQVBBX1BSRUZfQVVESU9fQ09OVF9JTkRFWCkpICYgMHhmZmZmOwotfQotCi11aW50MzJfdCBHZXRDYXBhU3VwT2N0c1BlckZyYW1lKENvZGVjQ29uZmlnICpjb25maWcpIHsKLSAgcmV0dXJuIChjb25maWctPmNvZGVjX3NwZWNpZmljXzIgPj4KLSAgICAgICAgICAgICAgICAoOCpDQVBBX1NVUF9PQ1RTX1BFUl9GUkFNRV9JTkRFWCkpICYgMHhmZmZmZmZmZjsKLX0KLQotYm9vbCBHZXRDYXBhVmVuZG9yTWV0YURhdGFMYzNRUHJlZihDb2RlY0NvbmZpZyAqY29uZmlnKSB7Ci0gIGlmICgoKGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMyA+PgotICAgICAgICAoOCpDQVBBX1ZFTkRPUl9NRVRBREFUQV9MQzNRX1BSRUZfSU5ERVgpKSAmIDB4ZmYpID09IDB4MCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQ4X3QgR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcihDb2RlY0NvbmZpZyAqY29uZmlnKSB7Ci0gIHJldHVybiAoY29uZmlnLT5jb2RlY19zcGVjaWZpY18zID4+Ci0gICAgICAgICAgICAgICAgKDgqQ0FQQV9WRU5ET1JfTUVUQURBVEFfTEMzUV9WRVJfSU5ERVgpKSAmIDB4ZmY7Ci19Ci0KLS8vIENvbmZpZ3VyYXRpb25zCi1ib29sIFVwZGF0ZUZyYW1lRHVyYXRpb24oQ29kZWNDb25maWcgKmNvbmZpZyAsIHVpbnQ4X3QgZnJhbWVfZHVyKSB7Ci0gIHVpbnQ2NF90IHZhbHVlID0gMHhGRjsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xICY9IH4odmFsdWUgPDwgKENPTkZJR19GUkFNRV9EVVJfSU5ERVgqOCkpOwotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzEgfD0gIHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZV9kdXIpICA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfRlJBTUVfRFVSX0lOREVYICogOCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdShDb2RlY0NvbmZpZyAqY29uZmlnLCB1aW50OF90IGxjM19ibG9ja3NfcGVyX3NkdSkgewotICB1aW50NjRfdCB2YWx1ZSA9IDB4RkY7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSAmPSB+KHZhbHVlIDw8IChDT05GSUdfTEMzX0JMT0NLU19JTkRFWCAqIDgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xIHw9ICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obGMzX2Jsb2Nrc19wZXJfc2R1KSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfTEMzX0JMT0NLU19JTkRFWCAqIDgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBVcGRhdGVQcmVmZXJyZWRBdWRpb0NvbnRleHQoQ29kZWNDb25maWcgKmNvbmZpZyAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcmVmX2F1ZGlvX2NvbnRleHQpIHsKLSAgdWludDY0X3QgdmFsdWUgPSAweEZGRkY7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSAmPSB+KHZhbHVlIDw8IChDT05GSUdfUFJFRl9BVURJT19DT05UX0lOREVYKjgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18xIHw9ICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocHJlZl9hdWRpb19jb250ZXh0KSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfUFJFRl9BVURJT19DT05UX0lOREVYICogOCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVwZGF0ZU9jdHNQZXJGcmFtZShDb2RlY0NvbmZpZyAqY29uZmlnICwgdWludDE2X3Qgb2N0c19wZXJfZnJhbWUpIHsKLSAgdWludDY0X3QgdmFsdWUgPSAweEZGRkY7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMiAmPSB+KHZhbHVlIDw8IChDT05GSUdfT0NUU19QRVJfRlJBTUVfSU5ERVggKiA4KSk7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMiB8PQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ob2N0c19wZXJfZnJhbWUpIDw8Ci0gICAgICAgICAgICAgICAgICAgIChDT05GSUdfT0NUU19QRVJfRlJBTUVfSU5ERVggKiA4KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVXBkYXRlTGMzUVByZWZlcmVuY2UoQ29kZWNDb25maWcgKmNvbmZpZyAsIGJvb2wgbGMzcV9wcmVmKSB7Ci0gIHVpbnQ2NF90IHZhbHVlID0gMHhGRjsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18yICY9IH4odmFsdWUgPDwgKENPTkZJR19MQzNRX1BSRUZfSU5ERVggKiA4KSk7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMiB8PQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obGMzcV9wcmVmKSA8PAotICAgICAgICAgICAgICAgICAgICAoQ09ORklHX0xDM1FfUFJFRl9JTkRFWCAqIDgpOwotICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IGxjM3FfcHJlZiBjczI6ICIgPDwgbG9naGV4KGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWJvb2wgVXBkYXRlVmVuZG9yTWV0YURhdGFMYzNRUHJlZihDb2RlY0NvbmZpZyAqY29uZmlnLCBib29sIGxjM3FfcHJlZikgewotICB1aW50NjRfdCB2YWx1ZSA9IDB4RkY7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMyAmPSB+KHZhbHVlIDw8IChDT05GSUdfVkVORE9SX01FVEFEQVRBX0xDM1FfUFJFRl9JTkRFWCAqIDgpKTsKLSAgY29uZmlnLT5jb2RlY19zcGVjaWZpY18zIHw9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihsYzNxX3ByZWYpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfVkVORE9SX01FVEFEQVRBX0xDM1FfUFJFRl9JTkRFWCAqIDgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBVcGRhdGVWZW5kb3JNZXRhRGF0YUxjM1FWZXIoQ29kZWNDb25maWcgKmNvbmZpZywgdWludDhfdCBsYzNxX3ZlcikgewotICB1aW50NjRfdCB2YWx1ZSA9IDB4RkY7Ci0gIGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMyAmPSB+KHZhbHVlIDw8IChDT05GSUdfVkVORE9SX01FVEFEQVRBX0xDM1FfVkVSX0lOREVYICogOCkpOwotICBjb25maWctPmNvZGVjX3NwZWNpZmljXzMgfD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxjM3FfdmVyKSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfVkVORE9SX01FVEFEQVRBX0xDM1FfVkVSX0lOREVYICogOCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi11aW50OF90IEdldEZyYW1lRHVyYXRpb24oQ29kZWNDb25maWcgKmNvbmZpZykgewotICByZXR1cm4gKGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSA+PiAoOCpDT05GSUdfRlJBTUVfRFVSX0lOREVYKSkgJiAweGZmOwotfQotCi11aW50OF90IEdldExjM0Jsb2Nrc1BlclNkdShDb2RlY0NvbmZpZyAqY29uZmlnKSB7Ci0gIHJldHVybiAoY29uZmlnLT5jb2RlY19zcGVjaWZpY18xID4+ICg4KkNPTkZJR19MQzNfQkxPQ0tTX0lOREVYKSkgJiAweGZmOwotfQotCi11aW50MTZfdCBHZXRQcmVmZXJyZWRBdWRpb0NvbnRleHQoQ29kZWNDb25maWcgKmNvbmZpZykgewotICByZXR1cm4gKGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMSA+PgotICAgICAgICAgICAgICAgICAgICAoOCpDT05GSUdfUFJFRl9BVURJT19DT05UX0lOREVYKSkgJiAweGZmZmY7Ci19Ci0KLXVpbnQxNl90IEdldE9jdHNQZXJGcmFtZShDb2RlY0NvbmZpZyAqY29uZmlnKSB7Ci0gIHJldHVybiAoY29uZmlnLT5jb2RlY19zcGVjaWZpY18yID4+ICg4KkNPTkZJR19PQ1RTX1BFUl9GUkFNRV9JTkRFWCkpICYgMHhmZmZmOwotfQotCi11aW50OF90IEdldExjM1FQcmVmZXJlbmNlKENvZGVjQ29uZmlnICpjb25maWcpIHsKLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGxjM3FfcHJlZiBjczI6ICIKLSAgICAgIDw8IGxvZ2hleCgoY29uZmlnLT5jb2RlY19zcGVjaWZpY18yID4+ICg4KkNPTkZJR19MQzNRX1BSRUZfSU5ERVgpKSAmIDB4ZmYpOwotICByZXR1cm4gKGNvbmZpZy0+Y29kZWNfc3BlY2lmaWNfMiA+PgotICAgICAgICAgICAgICAgICg4KkNPTkZJR19MQzNRX1BSRUZfSU5ERVgpKSAmIDB4ZmY7Ci19Ci0KLXVpbnQ4X3QgR2V0VmVuZG9yTWV0YURhdGFMYzNRUHJlZihDb2RlY0NvbmZpZyAqY29uZmlnKSB7Ci0gIHJldHVybiAoY29uZmlnLT5jb2RlY19zcGVjaWZpY18zID4+Ci0gICAgICAgICAgICAgICAgKDgqQ09ORklHX1ZFTkRPUl9NRVRBREFUQV9MQzNRX1BSRUZfSU5ERVgpKSAmIDB4ZmY7Ci19Ci0KLXVpbnQ4X3QgR2V0VmVuZG9yTWV0YURhdGFMYzNRVmVyKENvZGVjQ29uZmlnICpjb25maWcpIHsKLSAgcmV0dXJuIChjb25maWctPmNvZGVjX3NwZWNpZmljXzMgPj4KLSAgICAgICAgICAgICAgICAoOCpDT05GSUdfVkVORE9SX01FVEFEQVRBX0xDM1FfVkVSX0lOREVYKSkgJiAweGZmOwotfQotCi1ib29sIElzQ29kZWNDb25maWdFcXVhbChDb2RlY0NvbmZpZyAqc3JjX2NvbmZpZywgQ29kZWNDb25maWcgKmRzdF9jb25maWcpIHsKLSAgLy8gZmlyc3QgY2hlY2sgaWYgcGFzc2VkIGNvZGVjIGNvbmZpZ3MgYXJlIGNvbmZpZ3VyYXRpb25zIG9yCi0gIC8vIGNhcGFiaWxpdGllcyB1c2luZyBmaXJzdCBieXRlIG9mIGNvZGVjIHNwZWNpZmljIDEKLSAgaWYoc3JjX2NvbmZpZyA9PSBudWxscHRyIHx8IGRzdF9jb25maWcgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgaXNfc3JjX2NhcGFiaWxpdHkgPSBzcmNfY29uZmlnLT5jb2RlY19zcGVjaWZpY18xICYgMFhGRjsKLSAgYm9vbCBpc19kc3RfY2FwYWJpbGl0eSA9IGRzdF9jb25maWctPmNvZGVjX3NwZWNpZmljXzEgJiAwWEZGOwotCi0gIC8vIGNoZWNrIHRoZSBjb2RlYyB0eXBlCi0gIGlmKHNyY19jb25maWctPmNvZGVjX3R5cGUgIT0gZHN0X2NvbmZpZy0+Y29kZWNfdHlwZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm8gbWF0Y2ggZm9yIGNvZGVjIHR5cGUgIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBjaGVjayBzYW1wbGUgcmF0ZQotICBpZihzcmNfY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSBkc3RfY29uZmlnLT5zYW1wbGVfcmF0ZSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm8gbWF0Y2ggZm9yIHNhbXBsZSByYXRlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBjaGVjayBjaGFubmVsIG1vZGUKLSAgaWYoIShzdGF0aWNfY2FzdDxpbnQ+KHNyY19jb25maWctPmNoYW5uZWxfbW9kZSkgJgotICAgICAgIHN0YXRpY19jYXN0PGludD4oZHN0X2NvbmZpZy0+Y2hhbm5lbF9tb2RlKSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vIG1hdGNoIGZvciBjaGFubmVsIG1vZGUgIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IGlzX3NyY19jYXBhYmlsaXR5OiAiIDw8IGxvZ2hleChpc19zcmNfY2FwYWJpbGl0eSkKLSAgICAgICAgICAgICAgIDw8ICIsIGlzX2RzdF9jYXBhYmlsaXR5OiAiIDw8IGxvZ2hleChpc19kc3RfY2FwYWJpbGl0eSk7Ci0KLSAgaWYoaXNfc3JjX2NhcGFiaWxpdHkgJiYgaXNfZHN0X2NhcGFiaWxpdHkpIHsKLSAgICBpZihzcmNfY29uZmlnLT5jb2RlY19zcGVjaWZpY18xICE9IGRzdF9jb25maWctPmNvZGVjX3NwZWNpZmljXzEgfHwKLSAgICAgICBzcmNfY29uZmlnLT5jb2RlY19zcGVjaWZpY18yICE9IGRzdF9jb25maWctPmNvZGVjX3NwZWNpZmljXzIgfHwKLSAgICAgICBzcmNfY29uZmlnLT5jb2RlY19zcGVjaWZpY18zICE9IGRzdF9jb25maWctPmNvZGVjX3NwZWNpZmljXzMpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBObyBtYXRjaCBmb3IgQ1MgcGFyYW1zLiAiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIGlmICghaXNfc3JjX2NhcGFiaWxpdHkgJiYgIWlzX2RzdF9jYXBhYmlsaXR5KSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IENvbXBhcmlzb24gZm9yIGJvdGggY29uZmlncyAiOwotICAgIHVpbnQ4X3Qgc3JjX2ZyYW1lX2R1ciA9IEdldEZyYW1lRHVyYXRpb24oc3JjX2NvbmZpZyk7Ci0gICAgdWludDhfdCBzcmNfbGMzX2Jsb2Nrc19wZXJfc2R1ID0gR2V0TGMzQmxvY2tzUGVyU2R1KHNyY19jb25maWcpOwotICAgIHVpbnQxNl90IHNyY19vY3RzX3Blcl9mcmFtZSA9IEdldE9jdHNQZXJGcmFtZShzcmNfY29uZmlnKTsKLSAgICB1aW50OF90IHNyY19sYzNxX3ByZWYgPSBHZXRMYzNRUHJlZmVyZW5jZShzcmNfY29uZmlnKTsKLSAgICB1aW50MTZfdCBzcmNfcHJlZl9hdWRpb19jb250ZXh0ID0gR2V0UHJlZmVycmVkQXVkaW9Db250ZXh0KHNyY19jb25maWcpOwotCi0gICAgdWludDhfdCBkc3RfZnJhbWVfZHVyID0gR2V0RnJhbWVEdXJhdGlvbihkc3RfY29uZmlnKTsKLSAgICB1aW50OF90IGRzdF9sYzNfYmxvY2tzX3Blcl9zZHUgPSBHZXRMYzNCbG9ja3NQZXJTZHUoZHN0X2NvbmZpZyk7Ci0gICAgdWludDE2X3QgZHN0X29jdHNfcGVyX2ZyYW1lID0gR2V0T2N0c1BlckZyYW1lKGRzdF9jb25maWcpOwotICAgIHVpbnQ4X3QgZHN0X2xjM3FfcHJlZiA9IEdldExjM1FQcmVmZXJlbmNlKGRzdF9jb25maWcpOwotICAgIHVpbnQxNl90IGRzdF9wcmVmX2F1ZGlvX2NvbnRleHQgPSBHZXRQcmVmZXJyZWRBdWRpb0NvbnRleHQoZHN0X2NvbmZpZyk7Ci0KLSAgICBpZihzcmNfZnJhbWVfZHVyICE9IGRzdF9mcmFtZV9kdXIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogRnJhbWUgRHVyIG5vdCBtYXRjaCB3aXRoIGV4aXN0aW5nIGNvbmZpZyAiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmKHNyY19sYzNfYmxvY2tzX3Blcl9zZHUgIT0gZHN0X2xjM19ibG9ja3NfcGVyX3NkdSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBMYzMgYmxvY2tzIG5vdCBtYXRjaCB3aXRoIGV4aXN0aW5nIGNvbmZpZyAiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmKHNyY19vY3RzX3Blcl9mcmFtZSAhPSBkc3Rfb2N0c19wZXJfZnJhbWUpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogT2N0cyBwZXIgZnJhbWUgbm90IG1hdGNoIHdpdGggZXhpc3RpbmcgY29uZmlnICI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYoc3JjX2xjM3FfcHJlZiAhPSBkc3RfbGMzcV9wcmVmKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IExjM1EgcHJlZiBub3QgbWF0Y2ggd2l0aCBleGlzdGluZyBjb25maWcgIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIShzcmNfcHJlZl9hdWRpb19jb250ZXh0ICYgZHN0X3ByZWZfYXVkaW9fY29udGV4dCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcHJlZl9hdWRpb19jb250ZXh0IG5vdCBtYXRjaCB3aXRoIGV4aXN0aW5nIGNvbmZpZyAiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB9IGVsc2UgaWYoaXNfc3JjX2NhcGFiaWxpdHkgfHwgaXNfZHN0X2NhcGFiaWxpdHkpIHsKLSAgICBDb2RlY0NvbmZpZyAqY2FwYV9jb25maWcgPSBpc19zcmNfY2FwYWJpbGl0eSA/IHNyY19jb25maWc6ZHN0X2NvbmZpZzsKLSAgICBDb2RlY0NvbmZpZyAqb3RoX2NvbmZpZyA9IGlzX3NyY19jYXBhYmlsaXR5ID8gZHN0X2NvbmZpZzpzcmNfY29uZmlnOwotCi0gICAgdWludDhfdCBjYXBhX3N1cF9mcmFtZXMgPSBHZXRDYXBhU3VwRnJhbWVEdXJhdGlvbnMoY2FwYV9jb25maWcpOwotICAgIHVpbnQ4X3QgY2FwYV9tYXhfc3VwX2xjM19mcmFtZXMgPSBHZXRDYXBhTWF4U3VwTGMzRnJhbWVzKGNhcGFfY29uZmlnKTsKLSAgICB1aW50MTZfdCBjYXBhX21pbl9zdXBfb2N0cyA9IEdldENhcGFTdXBPY3RzUGVyRnJhbWUoY2FwYV9jb25maWcpICYgMHhGRkZGOwotICAgIHVpbnQxNl90IGNhcGFfbWF4X3N1cF9vY3RzID0gKEdldENhcGFTdXBPY3RzUGVyRnJhbWUoY2FwYV9jb25maWcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhGRkZGMDAwMCkgPj4gMTY7Ci0gICAgYm9vbCBjYXBhX2xjM3FfcHJlZiA9IEdldENhcGFWZW5kb3JNZXRhRGF0YUxjM1FQcmVmKGNhcGFfY29uZmlnKTsKLSAgICB1aW50MTZfdCBjYXBhX3ByZWZfYXVkaW9fY29udGV4dCA9IEdldENhcGFQcmVmZXJyZWRDb250ZXh0cyhjYXBhX2NvbmZpZyk7Ci0KLSAgICB1aW50OF90IGZyYW1lX2R1ciA9IEdldEZyYW1lRHVyYXRpb24ob3RoX2NvbmZpZyk7Ci0gICAgdWludDhfdCBsYzNfYmxvY2tzX3Blcl9zZHUgPSBHZXRMYzNCbG9ja3NQZXJTZHUob3RoX2NvbmZpZyk7Ci0gICAgdWludDE2X3Qgb2N0c19wZXJfZnJhbWUgPSBHZXRPY3RzUGVyRnJhbWUob3RoX2NvbmZpZyk7Ci0gICAgdWludDhfdCBsYzNxX3ByZWYgPSBHZXRMYzNRUHJlZmVyZW5jZShvdGhfY29uZmlnKTsKLSAgICB1aW50MTZfdCBkc3RfcHJlZl9hdWRpb19jb250ZXh0ID0gR2V0UHJlZmVycmVkQXVkaW9Db250ZXh0KG90aF9jb25maWcpOwotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IGNhcGFfc3VwX2ZyYW1lczogIiA8PCBsb2doZXgoY2FwYV9zdXBfZnJhbWVzKQotICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZV9kdXI6ICIgPDwgbG9naGV4KGZyYW1lX2R1cik7Ci0KLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogY2FwYV9sYzNxX3ByZWY6ICIgPDwgY2FwYV9sYzNxX3ByZWYKLSAgICAgICAgICAgICAgICAgPDwgIiwgbGMzcV9wcmVmOiAiIDw8IGxvZ2hleChsYzNxX3ByZWYpOwotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IGNhcGFfcHJlZl9hdWRpb19jb250ZXh0OiAiIDw8IGNhcGFfcHJlZl9hdWRpb19jb250ZXh0Ci0gICAgICAgICAgICAgICAgIDw8ICIsIGRzdF9wcmVmX2F1ZGlvX2NvbnRleHQ6ICIgPDwgZHN0X3ByZWZfYXVkaW9fY29udGV4dDsKLQotICAgIGlmKCEoY2FwYV9zdXBfZnJhbWVzICYgKDB4MDEgPDwgZnJhbWVfZHVyKSkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogTm8gbWF0Y2ggZm9yIGZyYW1lIGR1cmF0aW9uICI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYoY2FwYV9tYXhfc3VwX2xjM19mcmFtZXMgJiYgbGMzX2Jsb2Nrc19wZXJfc2R1KSB7Ci0gICAgICBpZihjYXBhX21heF9zdXBfbGMzX2ZyYW1lcyA8IGxjM19ibG9ja3NfcGVyX3NkdSAqCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4gKG90aF9jb25maWctPmNoYW5uZWxfbW9kZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBibG9ja3MgcGVyIHNkdSBleGNlZWRzIHRoZSBjYXBhY2l0eSAiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYoIG9jdHNfcGVyX2ZyYW1lIDwgY2FwYV9taW5fc3VwX29jdHMgfHwKLSAgICAgICAgb2N0c19wZXJfZnJhbWUgPiBjYXBhX21heF9zdXBfb2N0cykgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBvY3RzIHBlciBmcmFtZSBub3QgaW4gbGltaXRzICI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIShjYXBhX3ByZWZfYXVkaW9fY29udGV4dCAmIGRzdF9wcmVmX2F1ZGlvX2NvbnRleHQpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IE5vIE1hdGNoIGZvciBBdWRpbyBjb250ZXh0IjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2JhcF9jb25maWcuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfY29uZmlnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFlYjZhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX2JhcF9jb25maWcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2JhcF9jb25maWciCi0KLSNpbmNsdWRlICJidGlmX2JhcF9jb25maWcuaCIKLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3NwbGl0Lmg+Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb25maWcuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiYnRpZl9iYXBfY29kZWNfdXRpbHMuaCIKLQotI2RlZmluZSBCVF9DT05GSUdfU09VUkNFX1RBR19OVU0gMTAxMDAwMQotCi0jZGVmaW5lIElORk9fU0VDVElPTiAiSW5mbyIKLSNkZWZpbmUgRklMRV9USU1FU1RBTVAgIlRpbWVDcmVhdGVkIgotI2RlZmluZSBGSUxFX1NPVVJDRSAiRmlsZVNvdXJjZSIKLSNkZWZpbmUgVElNRV9TVFJJTkdfTEVOR1RIIHNpemVvZigiWVlZWS1NTS1ERCBISDpNTTpTUyIpCi0jZGVmaW5lIElOREVYX0ZSRUUgICAgICAoMHgwMCkKLSNkZWZpbmUgSU5ERVhfT0NDVVBJRUQgICgweDAxKQotI2RlZmluZSBNQVhfSU5ERVggICAgICAgKDI1NSkKLSNkZWZpbmUgTUFYX0lOREVYX0xFTiAgICgweDA0KQotI2RlZmluZSBNQVhfU0VDVElPTl9MRU4gICgyNTUpCi0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY1NhbXBsZVJhdGU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBUSU1FX1NUUklOR19GT1JNQVQgPSAiJVktJW0tJWQgJUg6JU06JVMiOwotCi0vLyBUT0RPKGFybWFuc2l0byk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gc2VhcmNoaW5nIGJ5IGEgaGFyZGNvZGVkIHBhdGguCi0jaWYgZGVmaW5lZChPU19HRU5FUklDKQotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19GSUxFX1BBVEggPSAiYmFwX2NvbmZpZy5jb25mIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfQkFDS1VQX1BBVEggPSAiYmFwX2NvbmZpZy5iYWsiOwotI2Vsc2UgICAvLyAhZGVmaW5lZChPU19HRU5FUklDKQotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19GSUxFX1BBVEggPSAiL2RhdGEvbWlzYy9ibHVlZHJvaWQvYmFwX2NvbmZpZy5jb25mIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfQkFDS1VQX1BBVEggPSAiL2RhdGEvbWlzYy9ibHVlZHJvaWQvYmFwX2NvbmZpZy5iYWsiOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX0dFTkVSSUMpCi1zdGF0aWMgY29uc3QgcGVyaW9kX21zX3QgQ09ORklHX1NFVFRMRV9QRVJJT0RfTVMgPSAzMDAwOwotCi1zdGF0aWMgdm9pZCB0aW1lcl9jb25maWdfc2F2ZV9jYih2b2lkKiBkYXRhKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2NvbmZpZ193cml0ZSh1aW50MTZfdCBldmVudCwgY2hhciogcF9wYXJhbSk7Ci1zdGF0aWMgYm9vbCBpc19mYWN0b3J5X3Jlc2V0KHZvaWQpOwotc3RhdGljIHZvaWQgZGVsZXRlX2NvbmZpZ19maWxlcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2NvbmZpZ19yZW1vdmVfcmVzdHJpY3RlZChjb25maWdfdCogY29uZmlnKTsKLXN0YXRpYyBjb25maWdfdCogYnRpZl9iYXBfY29uZmlnX29wZW4oY29uc3QgY2hhciogZmlsZW5hbWUpOwotCi1zdGF0aWMgZW51bSBDb25maWdTb3VyY2UgewotICBOT1RfTE9BREVELAotICBPUklHSU5BTCwKLSAgQkFDS1VQLAotICBORVdfRklMRSwKLSAgUkVTRVQKLX0gYnRpZl9iYXBfY29uZmlnX3NvdXJjZSA9IE5PVF9MT0FERUQ7Ci0KLS8vc3RhdGljIGludCBidGlmX2JhcF9jb25maWdfZGV2aWNlc19sb2FkZWQgPSAtMTsKLXN0YXRpYyBjaGFyIGJ0aWZfYmFwX2NvbmZpZ190aW1lX2NyZWF0ZWRbVElNRV9TVFJJTkdfTEVOR1RIXTsKLQotc3RhdGljIGNvbmZpZ190KiBjb25maWc7Ci1zdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggY29uZmlnX2xvY2s7ICAvLyBwcm90ZWN0cyBvcGVyYXRpb25zIG9uIHxjb25maWd8Lgotc3RhdGljIGFsYXJtX3QqIGNvbmZpZ190aW1lcjsKLQotI2RlZmluZSBCQVBfRElSRUNUSU9OX0tFWSAgICAgICAgICAgICAgIkRpcmVjdGlvbiIKLSNkZWZpbmUgQkFQX0NPREVDX1RZUEVfS0VZICAgICAgICAgICAgICJDb2RlY1R5cGUiCi0KLSNkZWZpbmUgQkFQX1JFQ09SRF9UWVBFX0tFWSAgICAgICAgICAgICJSZWNvcmRUeXBlIgotI2RlZmluZSBCQVBfUkVDT1JEX1RZUEVfQ0FQQSAgICAgICAgICAgICJDYXBhYmlsaXR5IgotI2RlZmluZSBCQVBfUkVDT1JEX1RZUEVfQ09ORiAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24iCi0KLSNkZWZpbmUgQkFQX1NBTVBfRlJFUVNfS0VZICAgICAgICAgICAgICJTYW1wbGluZ1JhdGUiCi0jZGVmaW5lIEJBUF9DT05URVhUX1RZUEVfS0VZICAgICAgICAgICAiQ29udGV4dFR5cGUiCi0KLSNkZWZpbmUgQkFQX1NVUFBfRlJNX0RVUkFUSU9OU19LRVkgICAgICJTdXBGcmFtZUR1cmF0aW9ucyIKLSNkZWZpbmUgQkFQX1NVUF9NSU5fT0NUU19QRVJfRlJBTUVfS0VZICJTdXBNaW5PY3RzUGVyRnJhbWUiCi0jZGVmaW5lIEJBUF9TVVBfTUFYX09DVFNfUEVSX0ZSQU1FX0tFWSAiU3VwTWF4T2N0c1BlckZyYW1lIgotI2RlZmluZSBCQVBfTUFYX1NVUF9DT0RFQ19GUkFNRVNfUEVSX1NEVSAiU3VwTWF4RnJhbWVzUGVyU0RVIgotI2RlZmluZSBCQVBfTEMzUV9TVVBfS0VZICAgICAgICAgICAgICAgIkxDM1FTdXBwb3J0IgotI2RlZmluZSBCQVBfTEMzUV9WRVJfS0VZICAgICAgICAgICAgICAgIkxDM1FWZXJzaW9uIgotCi0jZGVmaW5lIEJBUF9DT05GX0ZSQU1FX0RVUl9LRVkgICAgICAgICAiQ29uZmlndXJlZEZyYW1lRHVyIgotI2RlZmluZSBCQVBfQ09ORl9PQ1RTX1BFUl9GUkFNRV9LRVkgICAgIkNvbmZpZ3VyZWRPY3RzUGVyRnJhbWUiCi0jZGVmaW5lIEJBUF9MQzNfRlJBTUVTX1BFUl9TRFVfS0VZICAgICAiTGMzRnJhbWVzUGVyU0RVIgotI2RlZmluZSBCQVBfQ0hOTF9BTExPQ0FUSU9OX0tFWSAgICAgICAgIkNoYW5uZWxBbGxvY2F0aW9uIgotCi0jZGVmaW5lIEJBUF9TUkNfTE9DQVRJT05TX0tFWSAgICAgICAgICAiU3JjTG9jYXRpb24iCi0jZGVmaW5lIEJBUF9TSU5LX0xPQ0FUSU9OU19LRVkgICAgICAgICAiU2lua0xvY2F0aW9uIgotI2RlZmluZSBCQVBfU1VQX0FVRElPX0NPTlRFWFRTX0tFWSAgICAgIlN1cEF1ZGlvQ29udGV4dHMiCi0KLS8vIE1vZHVsZSBsaWZlY3ljbGUgZnVuY3Rpb25zCi1zdGF0aWMgZnV0dXJlX3QqIGluaXQodm9pZCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLQotICBpZiAoaXNfZmFjdG9yeV9yZXNldCgpKSBkZWxldGVfY29uZmlnX2ZpbGVzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgZmlsZV9zb3VyY2U7Ci0KLSAgY29uZmlnID0gYnRpZl9iYXBfY29uZmlnX29wZW4oQ09ORklHX0ZJTEVfUEFUSCk7Ci0gIGJ0aWZfYmFwX2NvbmZpZ19zb3VyY2UgPSBPUklHSU5BTDsKLSAgaWYgKCFjb25maWcpIHsKLSAgICBMT0dfV0FSTihMT0dfVEFHLCAiJXMgdW5hYmxlIHRvIGxvYWQgY29uZmlnIGZpbGU6ICVzOyB1c2luZyBiYWNrdXAuIiwKLSAgICAgICAgICAgICBfX2Z1bmNfXywgQ09ORklHX0ZJTEVfUEFUSCk7Ci0gICAgY29uZmlnID0gYnRpZl9iYXBfY29uZmlnX29wZW4oQ09ORklHX0JBQ0tVUF9QQVRIKTsKLSAgICBidGlmX2JhcF9jb25maWdfc291cmNlID0gQkFDS1VQOwotICAgIGZpbGVfc291cmNlID0gIkJhY2t1cCI7Ci0gIH0KLQotICBpZiAoIWNvbmZpZykgewotICAgIExPR19FUlJPUihMT0dfVEFHLAotICAgICAgICAgICAgICAiJXMgdW5hYmxlIHRvIHRyYW5zY29kZSBsZWdhY3kgZmlsZTsgY3JlYXRpbmcgZW1wdHkgY29uZmlnLiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBjb25maWcgPSBjb25maWdfbmV3X2VtcHR5KCk7Ci0gICAgYnRpZl9iYXBfY29uZmlnX3NvdXJjZSA9IE5FV19GSUxFOwotICAgIGZpbGVfc291cmNlID0gIkVtcHR5IjsKLSAgfQotCi0gIGlmICghY29uZmlnKSB7Ci0gICAgTE9HX0VSUk9SKExPR19UQUcsICIlcyB1bmFibGUgdG8gYWxsb2NhdGUgYSBjb25maWcgb2JqZWN0LiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgaWYgKCFmaWxlX3NvdXJjZS5lbXB0eSgpKQotICAgIGNvbmZpZ19zZXRfc3RyaW5nKGNvbmZpZywgSU5GT19TRUNUSU9OLCBGSUxFX1NPVVJDRSwgZmlsZV9zb3VyY2UuY19zdHIoKSk7Ci0KLSAgLy8gQ2xlYW51cCB0ZW1wb3JhcnkgcGFpcmluZ3MgaWYgd2UgaGF2ZSBsZWZ0IGd1ZXN0IG1vZGUKLSAgaWYgKCFpc19yZXN0cmljdGVkX21vZGUoKSkgYnRpZl9iYXBfY29uZmlnX3JlbW92ZV9yZXN0cmljdGVkKGNvbmZpZyk7Ci0KLSAgLy8gUmVhZCBvciBzZXQgY29uZmlnIGZpbGUgY3JlYXRpb24gdGltZXN0YW1wCi0gIGNvbnN0IGNoYXIqIHRpbWVfc3RyOwotICB0aW1lX3N0ciA9IGNvbmZpZ19nZXRfc3RyaW5nKGNvbmZpZywgSU5GT19TRUNUSU9OLCBGSUxFX1RJTUVTVEFNUCwgTlVMTCk7Ci0gIGlmICh0aW1lX3N0ciAhPSBOVUxMKSB7Ci0gICAgc3RybGNweShidGlmX2JhcF9jb25maWdfdGltZV9jcmVhdGVkLCB0aW1lX3N0ciwgVElNRV9TVFJJTkdfTEVOR1RIKTsKLSAgfSBlbHNlIHsKLSAgICB0aW1lX3QgY3VycmVudF90aW1lID0gdGltZShOVUxMKTsKLSAgICBzdHJ1Y3QgdG0qIHRpbWVfY3JlYXRlZCA9IGxvY2FsdGltZSgmY3VycmVudF90aW1lKTsKLSAgICBpZiAodGltZV9jcmVhdGVkKSB7Ci0gICAgICBpZiAoc3RyZnRpbWUoYnRpZl9iYXBfY29uZmlnX3RpbWVfY3JlYXRlZCwgVElNRV9TVFJJTkdfTEVOR1RILAotICAgICAgICAgICAgICAgICAgIFRJTUVfU1RSSU5HX0ZPUk1BVCwgdGltZV9jcmVhdGVkKSkgewotICAgICAgICBjb25maWdfc2V0X3N0cmluZyhjb25maWcsIElORk9fU0VDVElPTiwgRklMRV9USU1FU1RBTVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfYmFwX2NvbmZpZ190aW1lX2NyZWF0ZWQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBUT0RPKHNoYXJ2aWwpOiB1c2UgYSBub24td2FrZSBhbGFybSBmb3IgdGhpcyBvbmNlIHdlIGhhdmUKLSAgLy8gQVBJIHN1cHBvcnQgZm9yIGl0LiBUaGVyZSdzIG5vIG5lZWQgdG8gd2FrZSB0aGUgc3lzdGVtIHRvCi0gIC8vIHdyaXRlIGJhY2sgdG8gZGlzay4KLSAgY29uZmlnX3RpbWVyID0gYWxhcm1fbmV3KCJidGlmX2JhcC5jb25maWciKTsKLSAgaWYgKCFjb25maWdfdGltZXIpIHsKLSAgICBMT0dfRVJST1IoTE9HX1RBRywgIiVzIHVuYWJsZSB0byBjcmVhdGUgYWxhcm0uIiwgX19mdW5jX18pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBMT0dfRVZFTlRfSU5UKEJUX0NPTkZJR19TT1VSQ0VfVEFHX05VTSwgYnRpZl9iYXBfY29uZmlnX3NvdXJjZSk7Ci0KLSAgcmV0dXJuIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKEZVVFVSRV9TVUNDRVNTKTsKLQotZXJyb3I6Ci0gIGFsYXJtX2ZyZWUoY29uZmlnX3RpbWVyKTsKLSAgaWYgKGNvbmZpZyAhPSBOVUxMKQotICAgIGNvbmZpZ19mcmVlKGNvbmZpZyk7Ci0gIGNvbmZpZ190aW1lciA9IE5VTEw7Ci0gIGNvbmZpZyA9IE5VTEw7Ci0gIGJ0aWZfYmFwX2NvbmZpZ19zb3VyY2UgPSBOT1RfTE9BREVEOwotICByZXR1cm4gZnV0dXJlX25ld19pbW1lZGlhdGUoRlVUVVJFX0ZBSUwpOwotfQotCi1zdGF0aWMgY29uZmlnX3QqIGJ0aWZfYmFwX2NvbmZpZ19vcGVuKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIGNvbmZpZ190KiBjb25maWcgPSBjb25maWdfbmV3KGZpbGVuYW1lKTsKLSAgaWYgKCFjb25maWcpIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBjb25maWc7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2NvbmZpZ19zYXZlKHZvaWQpIHsKLSAgQ0hFQ0soY29uZmlnICE9IE5VTEwpOwotICBDSEVDSyhjb25maWdfdGltZXIgIT0gTlVMTCk7Ci0KLSAgaWYgKGNvbmZpZ190aW1lciA9PSBOVUxMKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICJjb25maWdfdGltZXIgaXMgbnVsbCI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFsYXJtX3NldChjb25maWdfdGltZXIsIENPTkZJR19TRVRUTEVfUEVSSU9EX01TLCB0aW1lcl9jb25maWdfc2F2ZV9jYiwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2NvbmZpZ19mbHVzaCh2b2lkKSB7Ci0gIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKLSAgQ0hFQ0soY29uZmlnX3RpbWVyICE9IE5VTEwpOwotCi0gIGFsYXJtX2NhbmNlbChjb25maWdfdGltZXIpOwotICBidGlmX2JhcF9jb25maWdfd3JpdGUoMCwgTlVMTCk7Ci19Ci0KLWJvb2wgYnRpZl9iYXBfY29uZmlnX2NsZWFyKHZvaWQpIHsKLSAgQ0hFQ0soY29uZmlnICE9IE5VTEwpOwotICBDSEVDSyhjb25maWdfdGltZXIgIT0gTlVMTCk7Ci0KLSAgYWxhcm1fY2FuY2VsKGNvbmZpZ190aW1lcik7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGlmIChjb25maWcgIT0gTlVMTCkKLSAgICBjb25maWdfZnJlZShjb25maWcpOwotCi0gIGNvbmZpZyA9IGNvbmZpZ19uZXdfZW1wdHkoKTsKLSAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgYm9vbCByZXQgPSBjb25maWdfc2F2ZShjb25maWcsIENPTkZJR19GSUxFX1BBVEgpOwotICBidGlmX2JhcF9jb25maWdfc291cmNlID0gUkVTRVQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBmdXR1cmVfdCogc2h1dF9kb3duKHZvaWQpIHsKLSAgYnRpZl9iYXBfY29uZmlnX2ZsdXNoKCk7Ci0gIHJldHVybiBmdXR1cmVfbmV3X2ltbWVkaWF0ZShGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyBmdXR1cmVfdCogY2xlYW5fdXAodm9pZCkgewotICBidGlmX2JhcF9jb25maWdfZmx1c2goKTsKLQotICBhbGFybV9mcmVlKGNvbmZpZ190aW1lcik7Ci0gIGNvbmZpZ190aW1lciA9IE5VTEw7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGNvbmZpZ19mcmVlKGNvbmZpZyk7Ci0gIGNvbmZpZyA9IE5VTEw7Ci0gIHJldHVybiBmdXR1cmVfbmV3X2ltbWVkaWF0ZShGVVRVUkVfU1VDQ0VTUyk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wgbW9kdWxlX3QgYnRpZl9iYXBfY29uZmlnX21vZHVsZSA9IHsubmFtZSA9IEJUSUZfQkFQX0NPTkZJR19NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdCA9IGluaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRfdXAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNodXRfZG93biA9IHNodXRfZG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbGVhbl91cCA9IGNsZWFuX3VwfTsKLQotc3RhdGljIHZvaWQgdGltZXJfY29uZmlnX3NhdmVfY2IoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICAvLyBNb3ZpbmcgZmlsZSBJL08gdG8gYnRpZiBjb250ZXh0IGluc3RlYWQgb2YgdGltZXIgY2FsbGJhY2sgYmVjYXVzZQotICAvLyBpdCB1c3VhbGx5IHRha2VzIGEgbG90IG9mIHRpbWUgdG8gYmUgY29tcGxldGVkLCBpbnRyb2R1Y2luZwotICAvLyBkZWxheXMgZHVyaW5nIEEyRFAgcGxheWJhY2sgY2F1c2luZyBibGlwcyBvciBjaG9wcGluZXNzLgotICBidGlmX3RyYW5zZmVyX2NvbnRleHQoYnRpZl9iYXBfY29uZmlnX3dyaXRlLCAwLCBOVUxMLCAwLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgYnRpZl9iYXBfY29uZmlnX3dyaXRlKFVOVVNFRF9BVFRSIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY2hhciogcF9wYXJhbSkgewotICBDSEVDSyhjb25maWcgIT0gTlVMTCk7Ci0gIENIRUNLKGNvbmZpZ190aW1lciAhPSBOVUxMKTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgcmVuYW1lKENPTkZJR19GSUxFX1BBVEgsIENPTkZJR19CQUNLVVBfUEFUSCk7Ci0gIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiY29uZmlnIGlzIG51bGwiOwotICAgIHJldHVybjsKLSAgfQotICBjb25maWdfdCogY29uZmlnX3BhaXJlZCA9IGNvbmZpZ19uZXdfY2xvbmUoY29uZmlnKTsKLQotICBpZiAoY29uZmlnX3BhaXJlZCAhPSBOVUxMKSB7Ci0gICAgLy9idGlmX2JhcF9jb25maWdfcmVtb3ZlX3VucGFpcmVkKGNvbmZpZ19wYWlyZWQpOwotICAgIGNvbmZpZ19zYXZlKGNvbmZpZ19wYWlyZWQsIENPTkZJR19GSUxFX1BBVEgpOwotICAgIGNvbmZpZ19mcmVlKGNvbmZpZ19wYWlyZWQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aWZfYmFwX2NvbmZpZ19yZW1vdmVfcmVzdHJpY3RlZChjb25maWdfdCogY29uZmlnKSB7Ci0gIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKLQotICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgImNvbmZpZyBpcyBudWxsIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgY29uZmlnX3NlY3Rpb25fbm9kZV90KiBzbm9kZSA9IGNvbmZpZ19zZWN0aW9uX2JlZ2luKGNvbmZpZyk7Ci0gIGZvcig7IHNub2RlICE9IGNvbmZpZ19zZWN0aW9uX2VuZChjb25maWcpOwotICAgICAgICAgICAgIHNub2RlID0gY29uZmlnX3NlY3Rpb25fbmV4dChzbm9kZSkpIHsKLSAgICBjb25zdCBjaGFyKiBzZWN0aW9uID0gY29uZmlnX3NlY3Rpb25fbmFtZShzbm9kZSk7Ci0gICAgLy8gZmlyc3QgY2hlY2sgdGhlIGFkZHJlc3MKLSAgICBpZiAoY29uZmlnX2hhc19rZXkoY29uZmlnLCBzZWN0aW9uLCAiUmVzdHJpY3RlZCIpKSB7Ci0gICAgICBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnLCBzZWN0aW9uKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgaXNfZmFjdG9yeV9yZXNldCh2b2lkKSB7Ci0gIGNoYXIgZmFjdG9yeV9yZXNldFtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OwotICBvc2lfcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmJsdWV0b290aC5mYWN0b3J5cmVzZXQiLCBmYWN0b3J5X3Jlc2V0LCAiZmFsc2UiKTsKLSAgcmV0dXJuIHN0cm5jbXAoZmFjdG9yeV9yZXNldCwgInRydWUiLCA0KSA9PSAwOwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVfY29uZmlnX2ZpbGVzKHZvaWQpIHsKLSAgcmVtb3ZlKENPTkZJR19GSUxFX1BBVEgpOwotICByZW1vdmUoQ09ORklHX0JBQ0tVUF9QQVRIKTsKLSAgb3NpX3Byb3BlcnR5X3NldCgicGVyc2lzdC5ibHVldG9vdGguZmFjdG9yeXJlc2V0IiwgImZhbHNlIik7Ci19Ci0KLXN0YXRpYyBib29sIGJ0aWZfYmFwX2dldF9zZWN0aW9uX2luZGV4KGNvbnN0IHN0ZDo6c3RyaW5nICZzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmluZGV4KSB7Ci0gIGNoYXIgKnRlbXAgPSBudWxscHRyOwotICBpZiAoc2VjdGlvbi5sZW5ndGgoKSAhPSAyMCkgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBieXRlX3Rva2VucyA9Ci0gICAgICAgICAgICAgIGJhc2U6OlNwbGl0U3RyaW5nKHNlY3Rpb24sICI6IiwgYmFzZTo6VFJJTV9XSElURVNQQUNFLAotICAgICAgICAgICAgICBiYXNlOjpTUExJVF9XQU5UX0FMTCk7Ci0KLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IExDIyBjb2RlYyAiOwotICBpZiAoYnl0ZV90b2tlbnMuc2l6ZSgpICE9IDcpIHJldHVybiBmYWxzZTsKLQotICAvLyBnZXQgdGhlIGxhc3QgbmliYmxlCi0gIGNvbnN0IGF1dG8mIHRva2VuID0gYnl0ZV90b2tlbnNbNl07Ci0KLSAgaWYgKHRva2VuLmxlbmd0aCgpICE9IDIpIHJldHVybiBmYWxzZTsKLQotICAqaW5kZXggPSBzdHJ0b2wodG9rZW4uY19zdHIoKSwgJnRlbXAsIDE2KTsKLQotICBpZiAoKnRlbXAgIT0gJ1wwJykgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBidGlmX2JhcF9nZXRfZnJlZV9zZWN0aW9uX2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY3Rpb24pIHsKLSAgdWludDE2X3QgaSA9IDA7Ci0gIHVpbnQ4X3QgaW5kZXhfc3RhdHVzW01BWF9JTkRFWF0gPSB7MH07Ci0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0gIGNvbnN0IGNoYXIqIGJkc3RyID0gYWRkcnN0ci5jX3N0cigpOwotCi0gIC8vIHJlc2VydmUgdGhlIGZpcnN0IGluZGV4IGZvciBzaW5rLCBzcmMsIGxvY2F0aW9ucwotICBpbmRleF9zdGF0dXNbMF0gPSBJTkRFWF9PQ0NVUElFRDsKLQotICBjb25zdCBjb25maWdfc2VjdGlvbl9ub2RlX3QqIHNub2RlID0gY29uZmlnX3NlY3Rpb25fYmVnaW4oY29uZmlnKTsKLSAgZm9yKDsgc25vZGUgIT0gY29uZmlnX3NlY3Rpb25fZW5kKGNvbmZpZyk7Ci0gICAgICAgICAgIHNub2RlID0gY29uZmlnX3NlY3Rpb25fbmV4dChzbm9kZSkpIHsKLSAgICBjb25zdCBjaGFyKiBzZWN0aW9uID0gY29uZmlnX3NlY3Rpb25fbmFtZShzbm9kZSk7Ci0gICAgdWludDE2X3QgaW5kZXg7Ci0KLSAgICAvLyBmaXJzdCBjaGVjayB0aGUgYWRkcmVzcwotICAgIGlmKCFzdHJjYXNlc3RyKHNlY3Rpb24sIGJkc3RyKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYoYnRpZl9iYXBfZ2V0X3NlY3Rpb25faW5kZXgoc2VjdGlvbiwgJmluZGV4KSkgewotICAgICAgaW5kZXhfc3RhdHVzW2luZGV4XSA9IElOREVYX09DQ1VQSUVEOwotICAgIH0KLSAgfQotCi0gIC8vIGZpbmQgdGhlIHVudXNlZCBpbmRleAotICBmb3IoaSA9IDA7IGkgPCBNQVhfSU5ERVg7IGkrKykgewotICAgIGlmKGluZGV4X3N0YXR1c1tpXSA9PSBJTkRFWF9GUkVFKSBicmVhazsKLSAgfQotCi0gIGlmKGkgIT0gTUFYX0lOREVYKSB7Ci0gICAgY2hhciBpbmRleF9zdHJbTUFYX0lOREVYX0xFTl07Ci0gICAgLy8gZm9ybSB0aGUgc2VjdGlvbiBlbnRyeSAoIGJkIGFkZHJlc3MgcGx1cyBpbmRleCkKLSAgICBzbnByaW50ZihpbmRleF9zdHIsIHNpemVvZihpbmRleF9zdHIpLCAiOiUwMngiLCBpKTsKLSAgICBzdHJsY3B5KHNlY3Rpb24sIGJkc3RyLCBNQVhfU0VDVElPTl9MRU4pOwotICAgIHN0cmxjYXQoc2VjdGlvbiwgaW5kZXhfc3RyLCBNQVhfU0VDVElPTl9MRU4pOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBidGlmX2JhcF9maW5kX3NlY3Rpb25zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9iYXBfcmVjb3JkX3R5cGVfdCByZWNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNEaXJlY3Rpb24gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ29uZmlnICpyZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhciAqPiAqc2VjdGlvbnMpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLSAgY29uc3QgY2hhciogYmRzdHIgPSBhZGRyc3RyLmNfc3RyKCk7Ci0gIGNvbnN0IGNvbmZpZ19zZWN0aW9uX25vZGVfdCogc25vZGUgPSBjb25maWdfc2VjdGlvbl9iZWdpbihjb25maWcpOwotICBmb3IoOyBzbm9kZSAhPSBjb25maWdfc2VjdGlvbl9lbmQoY29uZmlnKTsKLSAgICAgICAgICAgICBzbm9kZSA9IGNvbmZpZ19zZWN0aW9uX25leHQoc25vZGUpKSB7Ci0gICAgY29uc3QgY2hhciAqc2VjdGlvbiA9IGNvbmZpZ19zZWN0aW9uX25hbWUoc25vZGUpOwotICAgIC8vIGZpcnN0IGNoZWNrIHRoZSBhZGRyZXNzCi0gICAgaWYoIXN0cmNhc2VzdHIoc2VjdGlvbiwgYmRzdHIpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBuZXh0IGNoZWNrIHRoZSByZWNvcmQgdHlwZQotICAgIGNvbnN0IGNoYXIqIHZhbHVlX3N0ciA9IGNvbmZpZ19nZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9SRUNPUkRfVFlQRV9LRVksIE5VTEwpOwotICAgIGlmKHZhbHVlX3N0ciA9PSBudWxscHRyIHx8Ci0gICAgICAoKHJlY190eXBlID09IFJFQ19UWVBFX0NBUEFCSUxJVFkgJiYKLSAgICAgICBzdHJjYXNlY21wKHZhbHVlX3N0ciwgQkFQX1JFQ09SRF9UWVBFX0NBUEEpKSB8fAotICAgICAgIChyZWNfdHlwZSA9PSBSRUNfVFlQRV9DT05GSUdVUkFUSU9OICYmCi0gICAgICAgc3RyY2FzZWNtcCh2YWx1ZV9zdHIsIEJBUF9SRUNPUkRfVFlQRV9DT05GKSkpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBuZXh0IGNoZWNrIHRoZSByZWNvcmQgdHlwZQotICAgIHVpbnQxNl90IGNvbnRleHQgPSBjb25maWdfZ2V0X3VpbnQxNihjb25maWcsIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9DT05URVhUX1RZUEVfS0VZLCAwWEZGRkYpOwotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb250ZXh0ICIgPDwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBjb250ZXh0X3R5cGUgIiA8PCBjb250ZXh0X3R5cGU7Ci0gICAgaWYoY29udGV4dCAhPSBjb250ZXh0X3R5cGUpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIG5leHQgY2hlY2sgdGhlIGRpcmVjdGlvbgotICAgIHZhbHVlX3N0ciA9IGNvbmZpZ19nZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9ESVJFQ1RJT05fS0VZLCBOVUxMKTsKLSAgICBpZih2YWx1ZV9zdHIgPT0gbnVsbHB0ciB8fAotICAgICAgKChkaXJlY3Rpb24gPT0gQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TUkMgJiYKLSAgICAgICAgc3RyY2FzZWNtcCh2YWx1ZV9zdHIsICJTUkMiKSkgfHwKLSAgICAgICAoZGlyZWN0aW9uID09IENvZGVjRGlyZWN0aW9uOjpDT0RFQ19ESVJfU0lOSyAmJgotICAgICAgICBzdHJjYXNlY21wKHZhbHVlX3N0ciwgIlNJTksiKSkpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpZihyZWNvcmQgPT0gbnVsbHB0cikgewotICAgICAgc2VjdGlvbnMtPnB1c2hfYmFjaygoY2hhciopIHNlY3Rpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBuZXh0IGNoZWNrIGNvZGVjIHR5cGUKLSAgICAgIHZhbHVlX3N0ciA9IGNvbmZpZ19nZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9DT0RFQ19UWVBFX0tFWSwgTlVMTCk7Ci0KLSAgICAgIGlmKHZhbHVlX3N0ciA9PSBudWxscHRyIHx8Ci0gICAgICAgIChyZWNvcmQtPmNvZGVjX3R5cGUgPT0gQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMyAmJgotICAgICAgICAgc3RyY2FzZWNtcCh2YWx1ZV9zdHIsICJMQzMiKSkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG5leHQgY2hlY2sgdGhlIGZyZXFlbmN5Ci0gICAgICB1aW50MTZfdCB2YWx1ZSA9IGNvbmZpZ19nZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFQX1NBTVBfRlJFUVNfS0VZLCAwKTsKLSAgICAgIGlmKHZhbHVlID09IHN0YXRpY19jYXN0PHVpbnQxNl90PiAocmVjb3JkLT5zYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgc2VjdGlvbnMtPnB1c2hfYmFjaygoY2hhciopIHNlY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmKHNlY3Rpb25zLT5zaXplKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgYnRpZl9iYXBfdXBkYXRlX0xDM19jb2RlY19pbmZvKGNoYXIgKnNlY3Rpb24sIENvZGVjQ29uZmlnICpyZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRpZl9iYXBfcmVjb3JkX3R5cGVfdCByZWNfdHlwZSkgewotICBpZihzZWN0aW9uID09IG51bGxwdHIgfHwgcmVjb3JkID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZihyZWNfdHlwZSA9PSBSRUNfVFlQRV9DQVBBQklMSVRZKSB7Ci0KLSAgICBjb25maWdfc2V0X3N0cmluZyhjb25maWcsIHNlY3Rpb24sIEJBUF9SRUNPUkRfVFlQRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgQkFQX1JFQ09SRF9UWVBFX0NBUEEpOwotCi0gICAgaWYocmVjb3JkLT5jb2RlY190eXBlID09IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzMpIHsKLSAgICAgIGNvbmZpZ19zZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwgQkFQX0NPREVDX1RZUEVfS0VZLCAiTEMzIik7Ci0gICAgfQotICAgIC8vIHVwZGF0ZSBmcmVxcwotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgQkFQX1NBTVBfRlJFUVNfS0VZICwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWNvcmQtPnNhbXBsZV9yYXRlKSk7Ci0KLSAgICAvLyB1cGRhdGUgY2hubCBjb3VudAotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgQkFQX0NITkxfQUxMT0NBVElPTl9LRVksCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+IChyZWNvcmQtPmNoYW5uZWxfbW9kZSkpOwotCi0gICAgLy8gdXBkYXRlIHN1cHAgZnJhbWVzCi0gICAgY29uZmlnX3NldF91aW50MTYoY29uZmlnLCBzZWN0aW9uLCBCQVBfU1VQUF9GUk1fRFVSQVRJT05TX0tFWSAsCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoR2V0Q2FwYVN1cEZyYW1lRHVyYXRpb25zKHJlY29yZCkpKTsKLQotICAgIC8vIHVwZGF0ZSBjaG5sIHN1cHAgbWluIG9jdHMgcGVyIGZyYW1lCi0gICAgY29uZmlnX3NldF91aW50MTYoY29uZmlnLCBzZWN0aW9uLCBCQVBfU1VQX01JTl9PQ1RTX1BFUl9GUkFNRV9LRVkgLAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4gKEdldENhcGFTdXBPY3RzUGVyRnJhbWUocmVjb3JkKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGKSk7Ci0KLSAgICAvLyB1cGRhdGUgY2hubCBzdXBwIG1heCBvY3RzIHBlciBmcmFtZQotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgQkFQX1NVUF9NQVhfT0NUU19QRVJfRlJBTUVfS0VZLAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4gKChHZXRDYXBhU3VwT2N0c1BlckZyYW1lKHJlY29yZCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwKSA+PiAxNikpOwotCi0gICAgLy8gdXBkYXRlIG1heCBzdXBwIGNvZGVjIGZyYW1lcyBwZXIgc2R1Ci0gICAgY29uZmlnX3NldF91aW50MTYoY29uZmlnLCBzZWN0aW9uLCBCQVBfTUFYX1NVUF9DT0RFQ19GUkFNRVNfUEVSX1NEVSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+IChHZXRDYXBhTWF4U3VwTGMzRnJhbWVzKHJlY29yZCkpKTsKLQotICAgIC8vIHVwZGF0ZSBMQzNRIHN1cHBvcnQKLSAgICBpZiAoR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYocmVjb3JkKSkgewotICAgICAgY29uZmlnX3NldF9zdHJpbmcoY29uZmlnLCBzZWN0aW9uLCBCQVBfTEMzUV9TVVBfS0VZLCAidHJ1ZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25maWdfc2V0X3N0cmluZyhjb25maWcsIHNlY3Rpb24sIEJBUF9MQzNRX1NVUF9LRVksICJmYWxzZSIpOwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBMQzNRIFZlcnNpb24KLSAgICBjb25maWdfc2V0X3VpbnQxNihjb25maWcsIHNlY3Rpb24sIEJBUF9MQzNRX1ZFUl9LRVksCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoR2V0Q2FwYVZlbmRvck1ldGFEYXRhTGMzUVZlcihyZWNvcmQpKSk7Ci0gIH0gZWxzZSB7Ci0KLSAgICBjb25maWdfc2V0X3N0cmluZyhjb25maWcsIHNlY3Rpb24sIEJBUF9SRUNPUkRfVFlQRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9SRUNPUkRfVFlQRV9DT05GKTsKLQotICAgIGlmKHJlY29yZC0+Y29kZWNfdHlwZSA9PSBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzKSB7Ci0gICAgICBjb25maWdfc2V0X3N0cmluZyhjb25maWcsIHNlY3Rpb24sIEJBUF9DT0RFQ19UWVBFX0tFWSwgIkxDMyIpOwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBmcmVxcwotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgQkFQX1NBTVBfRlJFUVNfS0VZICwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWNvcmQtPnNhbXBsZV9yYXRlKSk7Ci0KLSAgICAvLyB1cGRhdGUgY2hubCBjb3VudAotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgQkFQX0NITkxfQUxMT0NBVElPTl9LRVksCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+IChyZWNvcmQtPmNoYW5uZWxfbW9kZSkpOwotCi0gICAgLy8gdXBkYXRlIGNvbmZpZ3VyZWQgZnJhbWUgZHVyYXRpb24KLSAgICBjb25maWdfc2V0X3VpbnQxNihjb25maWcsIHNlY3Rpb24sIEJBUF9DT05GX0ZSQU1FX0RVUl9LRVksCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoR2V0RnJhbWVEdXJhdGlvbihyZWNvcmQpKSk7Ci0KLSAgICAvLyB1cGRhdGUgY29uZmlndXJlZCBvY3RzIHBlciBmcmFtZQotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgQkFQX0NPTkZfT0NUU19QRVJfRlJBTUVfS0VZLAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4gKEdldE9jdHNQZXJGcmFtZShyZWNvcmQpKSk7Ci0KLSAgICAvLyB1cGRhdGUgTEMzIGZyYW1lcyBwZXIgU0RVCi0gICAgY29uZmlnX3NldF91aW50MTYoY29uZmlnLCBzZWN0aW9uLCBCQVBfTEMzX0ZSQU1FU19QRVJfU0RVX0tFWSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PiAoR2V0TGMzQmxvY2tzUGVyU2R1KHJlY29yZCkpKTsKLSAgfQotCi0gIGlmIChpc19yZXN0cmljdGVkX21vZGUoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiByZWNvcmRzIHdpbGwgYmUgcmVtb3ZlZCBpZiB1bnJlc3RyaWN0ZWQiOwotICAgIGNvbmZpZ19zZXRfdWludDE2KGNvbmZpZywgc2VjdGlvbiwgIlJlc3RyaWN0ZWQiLCAxKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYmFwX2FkZF9yZWNvcmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2JhcF9yZWNvcmRfdHlwZV90IHJlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0RpcmVjdGlvbiBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDb25maWcgKnJlY29yZCkgewotICAvLyBmaXJzdCBjaGVjayBpZiBzYW1lIHJlY29yZCBhbHJlYWR5IGV4aXN0cwotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgc3RkOjp2ZWN0b3I8Y2hhciAqPiBzZWN0aW9uczsKLQotICBpZihidGlmX2JhcF9maW5kX3NlY3Rpb25zKGJkX2FkZHIsIHJlY190eXBlLCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLCByZWNvcmQsICZzZWN0aW9ucykpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBzZWN0aW9ucy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHNlY3Rpb25zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBidGlmX2JhcF91cGRhdGVfTEMzX2NvZGVjX2luZm8oKCppdCksIHJlY29yZCAsIHJlY190eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHNlY3Rpb24gbm90IGZvdW5kIjsKLSAgICBjaGFyIHNlY3Rpb25bTUFYX1NFQ1RJT05fTEVOXTsKLSAgICBidGlmX2JhcF9nZXRfZnJlZV9zZWN0aW9uX2lkKGJkX2FkZHIsIHNlY3Rpb24pOwotCi0gICAgY29uZmlnX3NldF91aW50MTYoY29uZmlnLCBzZWN0aW9uLCBCQVBfQ09OVEVYVF9UWVBFX0tFWSwgY29udGV4dF90eXBlKTsKLQotICAgIGlmKGRpcmVjdGlvbiA9PSBDb2RlY0RpcmVjdGlvbjo6Q09ERUNfRElSX1NSQykgewotICAgICAgY29uZmlnX3NldF9zdHJpbmcoY29uZmlnLCBzZWN0aW9uLCBCQVBfRElSRUNUSU9OX0tFWSwgIlNSQyIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25maWdfc2V0X3N0cmluZyhjb25maWcsIHNlY3Rpb24sIEJBUF9ESVJFQ1RJT05fS0VZLCAiU0lOSyIpOwotICAgIH0KLSAgICBidGlmX2JhcF91cGRhdGVfTEMzX2NvZGVjX2luZm8oc2VjdGlvbiwgcmVjb3JkICwgcmVjX3R5cGUpOwotICB9Ci0gIGJ0aWZfYmFwX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYmFwX3JlbW92ZV9yZWNvcmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2JhcF9yZWNvcmRfdHlwZV90IHJlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0RpcmVjdGlvbiBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDb25maWcgKnJlY29yZCkgewotICAvLyBmaXJzdCBjaGVjayBpZiBzYW1lIHJlY29yZCBleGlzdHMKLSAgLy8gaWYgZXhpc3RzIHJlbW92ZSB0aGUgcmVjb3JkIGJ5IGNvbXBsZXRlIHNlY3Rpb24KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb25maWdfbG9jayk7Ci0gIGJvb2wgcmVjb3JkX3JlbW92ZWQgPSBmYWxzZTsKLSAgc3RkOjp2ZWN0b3I8Y2hhciAqPiBzZWN0aW9uczsKLQotICBpZihidGlmX2JhcF9maW5kX3NlY3Rpb25zKGJkX2FkZHIsIHJlY190eXBlLCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLCByZWNvcmQsICZzZWN0aW9ucykpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBzZWN0aW9ucy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHNlY3Rpb25zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnLCAoKml0KSk7Ci0gICAgfQotICAgIHJlY29yZF9yZW1vdmVkID0gdHJ1ZTsKLSAgICBidGlmX2JhcF9jb25maWdfZmx1c2goKTsKLSAgfQotICByZXR1cm4gcmVjb3JkX3JlbW92ZWQ7Ci19Ci0KLWJvb2wgYnRpZl9iYXBfcmVtb3ZlX3JlY29yZF9ieV9jb250ZXh0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2JhcF9yZWNvcmRfdHlwZV90IHJlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29udGV4dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0gIC8vIGZpcnN0IGNoZWNrIGlmIHNhbWUgcmVjb3JkIGV4aXN0cwotICAvLyBpZiBleGlzdHMgcmVtb3ZlIHRoZSByZWNvcmQgYnkgY29tcGxldGUgc2VjdGlvbgotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgYm9vbCByZWNvcmRfcmVtb3ZlZCA9IGZhbHNlOwotICBzdGQ6OnZlY3RvcjxjaGFyICo+IHNlY3Rpb25zOwotCi0gIGlmKGJ0aWZfYmFwX2ZpbmRfc2VjdGlvbnMoYmRfYWRkciwgcmVjX3R5cGUsIGNvbnRleHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sIG51bGxwdHIsICZzZWN0aW9ucykpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBzZWN0aW9ucy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHNlY3Rpb25zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnLCAoKml0KSk7Ci0gICAgfQotICAgIHJlY29yZF9yZW1vdmVkID0gdHJ1ZTsKLSAgICBidGlmX2JhcF9jb25maWdfZmx1c2goKTsKLSAgfQotICByZXR1cm4gcmVjb3JkX3JlbW92ZWQ7Ci19Ci0KLWJvb2wgYnRpZl9iYXBfcmVtb3ZlX2FsbF9yZWNvcmRzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gbG9vcCB0aHJvdWdoIHRoZSBmaWxlIGlmIGFueSByZWNvcmQgaXMgZm91bmQgZGVsZXRlIGl0Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29uZmlnX2xvY2spOwotICBzdGQ6OnN0cmluZyBhZGRyc3RyID0gYmRfYWRkci5Ub1N0cmluZygpOwotICBjb25zdCBjaGFyKiBiZHN0ciA9IGFkZHJzdHIuY19zdHIoKTsKLSAgYm9vbCByZWNvcmRfcmVtb3ZlZCA9IGZhbHNlOwotICBjb25zdCBjb25maWdfc2VjdGlvbl9ub2RlX3QqIHNub2RlID0gY29uZmlnX3NlY3Rpb25fYmVnaW4oY29uZmlnKTsKLSAgZm9yKDsgc25vZGUgIT0gY29uZmlnX3NlY3Rpb25fZW5kKGNvbmZpZyk7Ci0gICAgICAgICAgICAgc25vZGUgPSBjb25maWdfc2VjdGlvbl9uZXh0KHNub2RlKSkgewotICAgIGNvbnN0IGNoYXIqIHNlY3Rpb24gPSBjb25maWdfc2VjdGlvbl9uYW1lKHNub2RlKTsKLSAgICAvLyBmaXJzdCBjaGVjayB0aGUgYWRkcmVzcwotICAgIGlmKHN0cmNhc2VzdHIoc2VjdGlvbiwgYmRzdHIpKSB7Ci0gICAgICByZWNvcmRfcmVtb3ZlZCA9IHRydWU7Ci0gICAgICBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnLCBzZWN0aW9uKTsKLSAgICB9Ci0gIH0KLSAgYnRpZl9iYXBfY29uZmlnX2ZsdXNoKCk7Ci0gIHJldHVybiByZWNvcmRfcmVtb3ZlZDsKLX0KLQotYm9vbCBidGlmX2JhcF9nZXRfcmVjb3Jkcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX2JhcF9yZWNvcmRfdHlwZV90IHJlY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjRGlyZWN0aW9uIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+ICpwYWNfcmVjb3JkcykgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvbmZpZ19sb2NrKTsKLSAgc3RkOjp2ZWN0b3I8Y2hhciAqPiBzZWN0aW9uczsKLQotICBpZihidGlmX2JhcF9maW5kX3NlY3Rpb25zKGJkX2FkZHIsIHJlY190eXBlLCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLCBudWxscHRyLCAmc2VjdGlvbnMpKSB7Ci0gICAgZm9yIChhdXRvIGl0ID0gc2VjdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBzZWN0aW9ucy5lbmQoKTsgaXQrKykgewotICAgICAgQ29kZWNDb25maWcgcmVjb3JkOwotICAgICAgbWVtc2V0KCZyZWNvcmQsIDAsIHNpemVvZihyZWNvcmQpKTsKLQotICAgICAgaWYoY29uZmlnX2hhc19rZXkoY29uZmlnLCAoKml0KSwgQkFQX1NBTVBfRlJFUVNfS0VZKSkgewotICAgICAgICByZWNvcmQuc2FtcGxlX3JhdGUgPSBzdGF0aWNfY2FzdDxDb2RlY1NhbXBsZVJhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWdfZ2V0X3VpbnQxNihjb25maWcsICgqaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9TQU1QX0ZSRVFTX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb25maWdfaGFzX2tleShjb25maWcsICgqaXQpLCBCQVBfTEMzUV9TVVBfS0VZKSkgewotICAgICAgICBib29sIGxjM3Ffc3VwID0gZmFsc2U7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGlzX2xjM3Ffc3VwID0gY29uZmlnX2dldF9zdHJpbmcoY29uZmlnLCAoKml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9MQzNRX1NVUF9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7Ci0gICAgICAgIGlmKCFzdHJjbXAoaXNfbGMzcV9zdXAsICJ0cnVlIikpIHsKLSAgICAgICAgICAgbGMzcV9zdXAgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBsYzNxX3N1cDogIiA8PCBsYzNxX3N1cDsKLSAgICAgICAgaWYgKGxjM3Ffc3VwKSB7Ci0gICAgICAgICAgVXBkYXRlQ2FwYVZlbmRvck1ldGFEYXRhTGMzUVByZWYoJnJlY29yZCwgbGMzcV9zdXApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmKGNvbmZpZ19oYXNfa2V5KGNvbmZpZywgKCppdCksIEJBUF9MQzNRX1ZFUl9LRVkpKSB7Ci0gICAgICAgIHVpbnQxNl90IGxjM3FfdmVyID0gY29uZmlnX2dldF91aW50MTYoY29uZmlnLCAoKml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9MQzNRX1ZFUl9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwKTsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGxjM3FfdmVyOiAiIDw8IGxjM3FfdmVyOwotICAgICAgICBVcGRhdGVDYXBhVmVuZG9yTWV0YURhdGFMYzNRVmVyKCZyZWNvcmQsIGxjM3FfdmVyKTsKLSAgICAgIH0KLQotICAgICAgcmVjb3JkLmNvZGVjX3R5cGUgPSBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICAgICAgaWYocmVjX3R5cGUgPT0gUkVDX1RZUEVfQ0FQQUJJTElUWSkgewotCi0gICAgICAgIGlmKGNvbmZpZ19oYXNfa2V5KGNvbmZpZywgKCppdCksIEJBUF9TVVBQX0ZSTV9EVVJBVElPTlNfS0VZKSkgewotICAgICAgICAgIHVpbnQxNl90IHN1cHBfZnJhbWVzID0gY29uZmlnX2dldF91aW50MTYoY29uZmlnLCAoKml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9TVVBQX0ZSTV9EVVJBVElPTlNfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCk7Ci0gICAgICAgICAgVXBkYXRlQ2FwYVN1cEZyYW1lRHVyYXRpb25zKCZyZWNvcmQsIHN1cHBfZnJhbWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSBjaG5sIHN1cHAgb2N0cyBwZXIgZnJhbWUKLSAgICAgICAgaWYoY29uZmlnX2hhc19rZXkoY29uZmlnLCAoKml0KSwgQkFQX1NVUF9NSU5fT0NUU19QRVJfRlJBTUVfS0VZKSAmJgotICAgICAgICAgICBjb25maWdfaGFzX2tleShjb25maWcsICgqaXQpLCBCQVBfU1VQX01BWF9PQ1RTX1BFUl9GUkFNRV9LRVkpKSB7Ci0gICAgICAgICAgdWludDE2X3Qgc3VwX21pbl9vY3RzID0gY29uZmlnX2dldF91aW50MTYoY29uZmlnLCAoKml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVBfU1VQX01JTl9PQ1RTX1BFUl9GUkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCk7Ci0gICAgICAgICAgdWludDE2X3Qgc3VwX21heF9vY3RzID0gIGNvbmZpZ19nZXRfdWludDE2KGNvbmZpZywgKCppdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFQX1NVUF9NQVhfT0NUU19QRVJfRlJBTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDApOwotICAgICAgICAgIFVwZGF0ZUNhcGFTdXBPY3RzUGVyRnJhbWUoJnJlY29yZCwgc3VwX21pbl9vY3RzIHwgc3VwX21heF9vY3RzIDw8IDE2KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSBtYXggc3VwcCBjb2RlYyBmcmFtZXMgcGVyIHNkdQotICAgICAgICBpZihjb25maWdfaGFzX2tleShjb25maWcsICgqaXQpLCBCQVBfTUFYX1NVUF9DT0RFQ19GUkFNRVNfUEVSX1NEVSkpIHsKLSAgICAgICAgICB1aW50MTZfdCBtYXhfc3VwX2NvZGVjX2ZyYW1lc19wZXJfc2R1ID0gY29uZmlnX2dldF91aW50MTYoY29uZmlnLCAoKml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVBfTUFYX1NVUF9DT0RFQ19GUkFNRVNfUEVSX1NEVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwKTsKLSAgICAgICAgICBVcGRhdGVDYXBhTWF4U3VwTGMzRnJhbWVzKCZyZWNvcmQsIG1heF9zdXBfY29kZWNfZnJhbWVzX3Blcl9zZHUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXBkYXRlIHByZWZlcnJlZCBjb250ZXh0IHR5cGUuCi0gICAgICAgIGlmKGNvbmZpZ19oYXNfa2V5KGNvbmZpZywgKCppdCksIEJBUF9DT05URVhUX1RZUEVfS0VZKSkgewotICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZSA9IGNvbmZpZ19nZXRfdWludDE2KGNvbmZpZywgKCppdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFQX0NPTlRFWFRfVFlQRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCk7Ci0gICAgICAgICAgVXBkYXRlQ2FwYVByZWZlcnJlZENvbnRleHRzKCZyZWNvcmQsIGNvbnRleHRfdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgaWYoY29uZmlnX2hhc19rZXkoY29uZmlnLCAoKml0KSwgQkFQX0NPTkZfRlJBTUVfRFVSX0tFWSkpIHsKLSAgICAgICAgICB1aW50MTZfdCBjb25mX2ZyYW1lcyA9IGNvbmZpZ19nZXRfdWludDE2KGNvbmZpZywgKCppdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVBfQ09ORl9GUkFNRV9EVVJfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCk7Ci0gICAgICAgICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmcmVjb3JkLCBjb25mX2ZyYW1lcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihjb25maWdfaGFzX2tleShjb25maWcsICgqaXQpLCBCQVBfQ09ORl9PQ1RTX1BFUl9GUkFNRV9LRVkpKSB7Ci0gICAgICAgICAgdWludDE2X3QgY29uZl9vY3RzX3Blcl9mcmFtZSA9IGNvbmZpZ19nZXRfdWludDE2KGNvbmZpZywgKCppdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVBfQ09ORl9PQ1RTX1BFUl9GUkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwKTsKLSAgICAgICAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJnJlY29yZCwgY29uZl9vY3RzX3Blcl9mcmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihjb25maWdfaGFzX2tleShjb25maWcsICgqaXQpLCBCQVBfTEMzX0ZSQU1FU19QRVJfU0RVX0tFWSkpIHsKLSAgICAgICAgICB1aW50MTZfdCBsYzNfZnJtc19wZXJfc2R1ID0gY29uZmlnX2dldF91aW50MTYoY29uZmlnLCAoKml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBUF9MQzNfRlJBTUVTX1BFUl9TRFVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCk7Ci0gICAgICAgICAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZyZWNvcmQsIGxjM19mcm1zX3Blcl9zZHUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwYWNfcmVjb3Jkcy0+cHVzaF9iYWNrKHJlY29yZCk7Ci0gICAgfQotICB9Ci0KLSAgaWYocGFjX3JlY29yZHMtPnNpemUoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIGJ0aWZfYmFwX2FkZF9hdWRpb19sb2MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNEaXJlY3Rpb24gZGlyZWN0aW9uLCB1aW50MzJfdCBhdWRpb19sb2MpIHsKLSAgLy8gZmlyc3QgY2hlY2sgaWYgc2FtZSBhbHJlYWR5IGV4aXN0cwotICAvLyBpZiBleGlzdHMgdXBkYXRlIHRoZSBzYW1lIGVudHJ5Ci0gIC8vIGF1ZGlvIGxvY2F0aW9uIHdpbGwgYWx3YXlzIGJlIHN0b3JlZCBAIDB0aCBpbmRleAotICAvLyBmb3JtIHRoZSBzZWN0aW9uIGVudHJ5ICggYmQgYWRkcmVzcyBwbHVzIGluZGV4KQotICBzdGQ6OnN0cmluZyBhZGRyc3RyID0gYmRfYWRkci5Ub1N0cmluZygpOwotICBjb25zdCBjaGFyKiBiZHN0ciA9IGFkZHJzdHIuY19zdHIoKTsKLSAgY2hhciBzZWN0aW9uW01BWF9TRUNUSU9OX0xFTl07Ci0gIGNoYXIgaW5kZXhbTUFYX0lOREVYX0xFTl07Ci0gIHNucHJpbnRmKGluZGV4LCBzaXplb2YoaW5kZXgpLCAiOiUwMngiLCAwKTsKLSAgc3RybGNweShzZWN0aW9uLCBiZHN0ciwgc2l6ZW9mKHNlY3Rpb24pKTsKLSAgc3RybGNhdChzZWN0aW9uLCBpbmRleCwgc2l6ZW9mKHNlY3Rpb24pKTsKLSAgaWYoZGlyZWN0aW9uID09IENvZGVjRGlyZWN0aW9uOjpDT0RFQ19ESVJfU1JDKSB7Ci0gICAgY29uZmlnX3NldF9pbnQoY29uZmlnLCBzZWN0aW9uLCBCQVBfU1JDX0xPQ0FUSU9OU19LRVksIGF1ZGlvX2xvYyk7Ci0gIH0gZWxzZSB7Ci0gICAgY29uZmlnX3NldF9pbnQoY29uZmlnLCBzZWN0aW9uLCBCQVBfU0lOS19MT0NBVElPTlNfS0VZLCBhdWRpb19sb2MpOwotICB9Ci0gIGJ0aWZfYmFwX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYmFwX3JlbV9hdWRpb19sb2MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0gIC8vIGZpcnN0IGNoZWNrIGlmIHNhbWUgcmVjb3JkIGFscmVhZHkgZXhpc3RzCi0gIC8vIGlmIGV4aXN0cyByZW1vdmUgdGhlIHJlY29yZCBieSBjb21wbGV0ZSBzZWN0aW9uCi0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0gIGNvbnN0IGNoYXIqIGJkc3RyID0gYWRkcnN0ci5jX3N0cigpOwotICBjaGFyIHNlY3Rpb25bTUFYX1NFQ1RJT05fTEVOXTsKLSAgY2hhciBpbmRleFtNQVhfSU5ERVhfTEVOXTsKLSAgc25wcmludGYoaW5kZXgsIHNpemVvZihpbmRleCksICI6JTAyeCIsIDApOwotICBzdHJsY3B5KHNlY3Rpb24sIGJkc3RyLCBzaXplb2Yoc2VjdGlvbikpOwotICBzdHJsY2F0KHNlY3Rpb24sIGluZGV4LCBzaXplb2Yoc2VjdGlvbikpOwotICBpZihkaXJlY3Rpb24gPT0gQ29kZWNEaXJlY3Rpb246OkNPREVDX0RJUl9TUkMpIHsKLSAgICBjb25maWdfcmVtb3ZlX2tleShjb25maWcsIHNlY3Rpb24sICJCQVBfU1JDX0xPQ0FUSU9OU19LRVkiKTsKLSAgfSBlbHNlIHsKLSAgICBjb25maWdfcmVtb3ZlX2tleShjb25maWcsIHNlY3Rpb24sICJCQVBfU0lOS19MT0NBVElPTlNfS0VZIik7Ci0gIH0KLSAgYnRpZl9iYXBfY29uZmlnX2ZsdXNoKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYmFwX2FkZF9zdXBwX2NvbnRleHRzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VwcF9jb250ZXh0cykgewotICAvLyBmaXJzdCBjaGVjayBpZiBzYW1lIGFscmVhZHkgZXhpc3RzCi0gIC8vIGlmIGV4aXN0cyB1cGRhdGUgdGhlIHNhbWUgZW50cnkKLSAgLy8gc3VwcCBjb250ZXh0cyB3aWxsIGFsd2F5cyBiZSBzdG9yZWQgQCAwdGggaW5kZXgKLSAgLy8gZm9ybSB0aGUgc2VjdGlvbiBlbnRyeSAoIGJkIGFkZHJlc3MgcGx1cyBpbmRleCkKLSAgc3RkOjpzdHJpbmcgYWRkcnN0ciA9IGJkX2FkZHIuVG9TdHJpbmcoKTsKLSAgY29uc3QgY2hhciogYmRzdHIgPSBhZGRyc3RyLmNfc3RyKCk7Ci0gIGNoYXIgc2VjdGlvbltNQVhfU0VDVElPTl9MRU5dOwotICBjaGFyIGluZGV4W01BWF9JTkRFWF9MRU5dOwotICBzbnByaW50ZihpbmRleCwgc2l6ZW9mKGluZGV4KSwgIjolMDJ4IiwgMCk7Ci0gIHN0cmxjcHkoc2VjdGlvbiwgYmRzdHIsIHNpemVvZihzZWN0aW9uKSk7Ci0gIHN0cmxjYXQoc2VjdGlvbiwgaW5kZXgsIHNpemVvZihzZWN0aW9uKSk7Ci0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHN1cHBfY29udGV4dHMgIiAgPDwgc3VwcF9jb250ZXh0czsKLSAgY29uZmlnX3NldF91aW50NjQoY29uZmlnLCBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBCQVBfU1VQX0FVRElPX0NPTlRFWFRTX0tFWSwgc3VwcF9jb250ZXh0cyk7Ci0gIGJ0aWZfYmFwX2NvbmZpZ19zYXZlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0aWZfYmFwX2dldF9zdXBwX2NvbnRleHRzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc3VwcF9jb250ZXh0cykgewotICBzdGQ6OnN0cmluZyBhZGRyc3RyID0gYmRfYWRkci5Ub1N0cmluZygpOwotICBjb25zdCBjaGFyKiBiZHN0ciA9IGFkZHJzdHIuY19zdHIoKTsKLSAgY2hhciBzZWN0aW9uW01BWF9TRUNUSU9OX0xFTl07Ci0gIGNoYXIgaW5kZXhbTUFYX0lOREVYX0xFTl07Ci0gIHNucHJpbnRmKGluZGV4LCBzaXplb2YoaW5kZXgpLCAiOiUwMngiLCAwKTsKLSAgc3RybGNweShzZWN0aW9uLCBiZHN0ciwgc2l6ZW9mKHNlY3Rpb24pKTsKLSAgc3RybGNhdChzZWN0aW9uLCBpbmRleCwgc2l6ZW9mKHNlY3Rpb24pKTsKLSAgKnN1cHBfY29udGV4dHMgPSBjb25maWdfZ2V0X3VpbnQ2NChjb25maWcsIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFQX1NVUF9BVURJT19DT05URVhUU19LRVksIDApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBidGlmX2JhcF9yZW1fc3VwcF9jb250ZXh0cyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHN0ZDo6c3RyaW5nIGFkZHJzdHIgPSBiZF9hZGRyLlRvU3RyaW5nKCk7Ci0gIGNvbnN0IGNoYXIqIGJkc3RyID0gYWRkcnN0ci5jX3N0cigpOwotICBjaGFyIHNlY3Rpb25bTUFYX1NFQ1RJT05fTEVOXTsKLSAgY2hhciBpbmRleFtNQVhfSU5ERVhfTEVOXTsKLSAgc25wcmludGYoaW5kZXgsIHNpemVvZihpbmRleCksICI6JTAyeCIsIDApOwotICBzdHJsY3B5KHNlY3Rpb24sIGJkc3RyLCBzaXplb2Yoc2VjdGlvbikpOwotICBzdHJsY2F0KHNlY3Rpb24sIGluZGV4LCBzaXplb2Yoc2VjdGlvbikpOwotICBjb25maWdfcmVtb3ZlX2tleShjb25maWcsIHNlY3Rpb24sIEJBUF9TVVBfQVVESU9fQ09OVEVYVFNfS0VZKTsKLSAgYnRpZl9iYXBfY29uZmlnX2ZsdXNoKCk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYmFwX3VjbGllbnQuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfdWNsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwNDlhNS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfdWNsaWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRhX2Nsb3N1cmVfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2JhcF91Y2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0jaW5jbHVkZSAiYnRpZl9iYXBfY29kZWNfdXRpbHMuaCIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotZXh0ZXJuIHZvaWQgZG9faW5fYnRhX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB0YXNrKTsKLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYmFwX3VjbGllbnQuaD4KLSNpbmNsdWRlICJidGlmX2FwaS5oIgotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6VW5yZXRhaW5lZDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VWNhc3RDbGllbnQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29ubmVjdGlvblN0YXRlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpVY2FzdENsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VWNhc3RDbGllbnRJbnRlcmZhY2U7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbUNvbm5lY3Q7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVR5cGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVN0YXRlSW5mbzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtQ29uZmlnSW5mbzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6U3RyZWFtUmVjb25maWc7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgdWNhc3QgewotCi1jbGFzcyBVY2FzdENsaWVudEludGVyZmFjZUltcGw7Ci1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFVjYXN0Q2xpZW50SW50ZXJmYWNlPiBVY2FzdENsaWVudEluc3RhbmNlID0gbnVsbHB0cjsKLQotY2xhc3MgVWNhc3RDbGllbnRJbnRlcmZhY2VJbXBsCi0gICAgOiBwdWJsaWMgVWNhc3RDbGllbnRJbnRlcmZhY2UsCi0gICAgICBwdWJsaWMgVWNhc3RDbGllbnRDYWxsYmFja3MgewotICB+VWNhc3RDbGllbnRJbnRlcmZhY2VJbXBsKCkgPSBkZWZhdWx0OwotICB2b2lkIEluaXQoVWNhc3RDbGllbnRDYWxsYmFja3MqIGNsaWVudF9jYWxsYmFja3MpIG92ZXJyaWRlIHsKLSAgICBpZihpc19pbml0aWFsaXplZCkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgQWxyZWFkeSBpbml0aWFsaXplZCwgcmV0dXJuIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaXNfaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIGNhbGxiYWNrcyA9IGNsaWVudF9jYWxsYmFja3M7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmKHByb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5iYXAuZW5hYmxlX3VjYXN0IiwgdmFsdWUsICJmYWxzZSIpCi0gICAgICAgICAgICAgICAgICAgICYmICFzdHJjbXAodmFsdWUsICJ0cnVlIikpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFJlZ2lzdGVyaW5nIFBBQ1MgVVVJRCAiOwotICAgICAgYnRpZl9yZWdpc3Rlcl91dWlkX3NydmNfZGlzYyhVdWlkOjpGcm9tU3RyaW5nKCIxODUwIikpOwotICAgICAgYnRpZl9yZWdpc3Rlcl91dWlkX3NydmNfZGlzYyhVdWlkOjpGcm9tU3RyaW5nKCIxODRFIikpOwotICAgIH0KLSAgICBkb19pbl9idGFfdGhyZWFkKCBGUk9NX0hFUkUsIEJpbmQoJlVjYXN0Q2xpZW50OjpJbml0aWFsaXplLCB0aGlzKSk7Ci0gIH0KLQotICB2b2lkIE9uU3RyZWFtU3RhdGUoY29uc3QgUmF3QWRkcmVzcyAmYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1TdGF0ZUluZm8+IHN0cmVhbXNfc3RhdGVfaW5mbykgb3ZlcnJpZGUgewotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZVY2FzdENsaWVudENhbGxiYWNrczo6T25TdHJlYW1TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtc19zdGF0ZV9pbmZvKSk7Ci0gIH0KLQotICB2b2lkIE9uU3RyZWFtQ29uZmlnKGNvbnN0IFJhd0FkZHJlc3MgJmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29uZmlnSW5mbz4gc3RyZWFtc19jb25maWdfaW5mbykgb3ZlcnJpZGUgewotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZVY2FzdENsaWVudENhbGxiYWNrczo6T25TdHJlYW1Db25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIHN0cmVhbXNfY29uZmlnX2luZm8pKTsKLSAgfQotCi0gIHZvaWQgT25TdHJlYW1BdmFpbGFibGUoY29uc3QgUmF3QWRkcmVzcyAmYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcmNfYXVkaW9fY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2lua19hdWRpb19jb250ZXh0cykgb3ZlcnJpZGUgewotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgQmluZCgmVWNhc3RDbGllbnRDYWxsYmFja3M6Ok9uU3RyZWFtQXZhaWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIHNyY19hdWRpb19jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2lua19hdWRpb19jb250ZXh0cykpOwotICB9Ci0KLSAgdm9pZCBSZWNvbmZpZ3VyZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiAmc3RyZWFtc19pbmZvKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzOwotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZVY2FzdENsaWVudDo6UmVjb25maWd1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoVWNhc3RDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgc3RyZWFtc19pbmZvKSk7Ci0gIH0KLQotICB2b2lkIFN0YXJ0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gJnN0cmVhbXNfaW5mbykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYWRkcmVzczsKLSAgICBpZighaXNfaW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVWNhc3RDbGllbnQ6OlN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFVjYXN0Q2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIHN0cmVhbXNfaW5mbykpOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0KHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+ICZhZGRyZXNzLCBib29sIGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+ICZzdHJlYW1zX2luZm8pIG92ZXJyaWRlIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBhZGRyZXNzLmJlZ2luKCk7IGl0ICE9IGFkZHJlc3MuZW5kKCk7IGl0KyspIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgKCppdCk7Ci0gICAgfQotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZVY2FzdENsaWVudDo6Q29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBpc19kaXJlY3QsIHN0cmVhbXNfaW5mbykpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAmc3RyZWFtc19pbmZvKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBhZGRyZXNzOwotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZVY2FzdENsaWVudDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBzdHJlYW1zX2luZm8pKTsKLSAgfQotCi0gIHZvaWQgU3RvcChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gJnN0cmVhbXNfaW5mbykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYWRkcmVzczsKLSAgICBpZighaXNfaW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVWNhc3RDbGllbnQ6OlN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoVWNhc3RDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgc3RyZWFtc19pbmZvKSk7Ci0gIH0KLQotICB2b2lkIFVwZGF0ZVN0cmVhbShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1VcGRhdGU+ICZ1cGRhdGVfc3RyZWFtcykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYWRkcmVzczsKLSAgICBpZighaXNfaW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVWNhc3RDbGllbnQ6OlVwZGF0ZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChVY2FzdENsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCB1cGRhdGVfc3RyZWFtcykpOwotICB9Ci0KLSAgdm9pZCBDbGVhbnVwKCkgb3ZlcnJpZGUgewotICAgIGlmKCFpc19pbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZVY2FzdENsaWVudDo6Q2xlYW5VcCkpOwotICAgIGlzX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZTs7Ci0gIFVjYXN0Q2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3M7Ci19OwotCi1VY2FzdENsaWVudEludGVyZmFjZSogYnRpZl9iYXBfdWNsaWVudF9nZXRfaW50ZXJmYWNlKCkgewotICBpZiAoIVVjYXN0Q2xpZW50SW5zdGFuY2UpCi0gICAgVWNhc3RDbGllbnRJbnN0YW5jZS5yZXNldChuZXcgVWNhc3RDbGllbnRJbnRlcmZhY2VJbXBsKCkpOwotICByZXR1cm4gVWNhc3RDbGllbnRJbnN0YW5jZS5nZXQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHVjYXN0Ci19ICAvLyBuYW1lc3BhY2UgYmFwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfdWNsaWVudF90ZXN0LmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfYmFwX3VjbGllbnRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhMzc0NS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9iYXBfdWNsaWVudF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYnRhX2Nsb3N1cmVfYXBpLmgiCi0jaW5jbHVkZSAiYnRhX2JhcF91Y2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0jaW5jbHVkZSAiYnRpZl9iYXBfY29kZWNfdXRpbHMuaCIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLQotZXh0ZXJuIHZvaWQgZG9faW5fYnRhX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB0YXNrKTsKLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfYmFwX3VjbGllbnQuaD4KLSNpbmNsdWRlICJidGlmX2JhcF9jb25maWcuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlVjYXN0Q2xpZW50OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ29uZmlnOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6VWNhc3RDbGllbnRDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlVjYXN0Q2xpZW50SW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1Db25uZWN0OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1UeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1TdGF0ZUluZm87Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbUNvbmZpZ0luZm87Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OlN0cmVhbVJlY29uZmlnOwotCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNJbmRleDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY1ByaW9yaXR5OwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjU2FtcGxlUmF0ZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0ZyYW1lRHVyYXRpb247Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6Q29kZWNDaGFubmVsTW9kZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q29kZWNRb3NDb25maWc7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNJU0NvbmZpZzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q09OVEVOVF9UWVBFX01FRElBOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkNPTlRFTlRfVFlQRV9HQU1FOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpDT05URU5UX1RZUEVfTElWRTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6Q09OVEVOVF9UWVBFX1VOU1BFQ0lGSUVEOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpBU0VfRElSRUNUSU9OX1NSQzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6QVNFX0RJUkVDVElPTl9TSU5LOwotdXNpbmcgYmx1ZXRvb3RoOjpiYXA6OnVjYXN0OjpTdHJlYW1SZWNvbmZpZ1R5cGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6dWNhc3Q6OkFTQ1NDb25maWc7Ci0KLXN0YXRpYyB0aHJlYWRfdCAqdGVzdF90aHJlYWQ7Ci1zdGF0aWMgVWNhc3RDbGllbnRJbnRlcmZhY2UqIHNVY2FzdENsaWVudEludGVyZmFjZSA9IG51bGxwdHI7Ci1zdGF0aWMgUmF3QWRkcmVzcyBiYXBfYmRfYWRkcjsKLQotZXh0ZXJuIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50SW50ZXJmYWNlKiBidGlmX3BhY3NfY2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLQotY2xhc3MgVWNhc3RDbGllbnRDYWxsYmFja3NJbXBsIDogcHVibGljIFVjYXN0Q2xpZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIH5VY2FzdENsaWVudENhbGxiYWNrc0ltcGwoKSA9IGRlZmF1bHQ7Ci0gIHZvaWQgT25TdHJlYW1TdGF0ZShjb25zdCBSYXdBZGRyZXNzICZhZGRyZXNzLAotICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1TdGF0ZUluZm8+IHN0cmVhbXNfc3RhdGVfaW5mbykgb3ZlcnJpZGUgewotICAgIGZvciAoYXV0byBpdCA9IHN0cmVhbXNfc3RhdGVfaW5mby5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHN0cmVhbXNfc3RhdGVfaW5mby5lbmQoKTsgaXQrKykgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgc3RyZWFtIHR5cGUgIiA8PCAoaXQtPnN0cmVhbV90eXBlLnR5cGUpOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgc3RyZWFtIGRpciAiIDw8IGxvZ2hleChpdC0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uKTsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHN0cmVhbSBzdGF0ZSAiIDw8IHN0YXRpY19jYXN0PGludD4gKGl0LT5zdHJlYW1fc3RhdGUpOwotICAgIH0KLSAgfQotICB2b2lkIE9uU3RyZWFtQ29uZmlnKGNvbnN0IFJhd0FkZHJlc3MgJmFkZHJlc3MsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25maWdJbmZvPiBzdHJlYW1zX2NvbmZpZ19pbmZvKSBvdmVycmlkZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fOwotICAgIGZvciAoYXV0byBpdCA9IHN0cmVhbXNfY29uZmlnX2luZm8uYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBzdHJlYW1zX2NvbmZpZ19pbmZvLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBzdHJlYW0gdHlwZSAiIDw8IChpdC0+c3RyZWFtX3R5cGUudHlwZSk7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBzdHJlYW0gZGlyICIgPDwgbG9naGV4KGl0LT5zdHJlYW1fdHlwZS5kaXJlY3Rpb24pOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgbG9jYXRpb24gIiA8PCBzdGF0aWNfY2FzdDxpbnQ+IChpdC0+YXVkaW9fbG9jYXRpb24pOwotICAgICAgYnRpZl9iYXBfYWRkX3JlY29yZChhZGRyZXNzLCBSRUNfVFlQRV9DT05GSUdVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c3RyZWFtX3R5cGUudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNEaXJlY3Rpb24+IChpdC0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJml0LT5jb2RlY19jb25maWcpOwotCi0gICAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gYWNtX3BhY19yZWNvcmRzOwotCi0gICAgICBidGlmX2JhcF9nZXRfcmVjb3JkcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNfVFlQRV9DQVBBQklMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1RZUEVfTUVESUEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1RZUEVfVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENvZGVjRGlyZWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXQtPnN0cmVhbV90eXBlLmRpcmVjdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY21fcGFjX3JlY29yZHMpOwotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBhY20gbGVuICB0byBiZSAzIiA8PCAoYWNtX3BhY19yZWNvcmRzLnNpemUoKSk7Ci0KLSAgICAgIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBjb25maWdfcGFjX3JlY29yZHM7Ci0gICAgICBidGlmX2JhcF9nZXRfcmVjb3JkcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNfVFlQRV9DT05GSUdVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENvZGVjRGlyZWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXQtPnN0cmVhbV90eXBlLmRpcmVjdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWdfcGFjX3JlY29yZHMpOwotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBjb25maWdzIGxlbiB0byBiZSAxIiA8PCAoY29uZmlnX3BhY19yZWNvcmRzLnNpemUoKSk7Ci0KLSAgICAgIGJ0aWZfYmFwX3JlbW92ZV9yZWNvcmRfYnlfY29udGV4dCAoYWRkcmVzcywgUkVDX1RZUEVfQ09ORklHVVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnN0cmVhbV90eXBlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENvZGVjRGlyZWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0LT5zdHJlYW1fdHlwZS5kaXJlY3Rpb24pKTsKLQotICAgICAgY29uZmlnX3BhY19yZWNvcmRzLmNsZWFyKCk7Ci0gICAgICBidGlmX2JhcF9nZXRfcmVjb3JkcyhhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNfVFlQRV9DT05GSUdVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENvZGVjRGlyZWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXQtPnN0cmVhbV90eXBlLmRpcmVjdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWdfcGFjX3JlY29yZHMpOwotCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBjb25maWdzIGxlbiB0byBiZSAwIiA8PCAoY29uZmlnX3BhY19yZWNvcmRzLnNpemUoKSk7Ci0KLSNpZiAwCi0gICAgICBidGlmX2JhcF9yZW1vdmVfcmVjb3JkX2J5X2NvbnRleHQgKGFkZHJlc3MsIFJFQ19UWVBFX0NBUEFCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9NRURJQSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNEaXJlY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaXQtPnN0cmVhbV90eXBlLmRpcmVjdGlvbikpOwotCi0gICAgICBhY21fcGFjX3JlY29yZHMuY2xlYXIoKTsKLSAgICAgIGJ0aWZfYmFwX2dldF9yZWNvcmRzKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ19UWVBFX0NBUEFCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9NRURJQSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNEaXJlY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdC0+c3RyZWFtX3R5cGUuZGlyZWN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjbV9wYWNfcmVjb3Jkcyk7Ci0KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIGFjbSBsZW4gdG8gYmUgMCIgPDwgKGFjbV9wYWNfcmVjb3Jkcy5zaXplKCkpOwotI2VuZGlmCi0gICAgfQotICB9Ci0gIHZvaWQgT25TdHJlYW1BdmFpbGFibGUoY29uc3QgUmF3QWRkcmVzcyAmYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcmNfYXVkaW9fY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2lua19hdWRpb19jb250ZXh0cykgIG92ZXJyaWRlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX187Ci0gIH0KLX07Ci0KLXN0YXRpYyBVY2FzdENsaWVudENhbGxiYWNrc0ltcGwgc1VjYXN0Q2xpZW50Q2FsbGJhY2tzOwotCi1zdGF0aWMgdm9pZCBldmVudF90ZXN0X2JhcF91Y2xpZW50KFVOVVNFRF9BVFRSIHZvaWQqIGNvbnRleHQpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgc3RhcnQgIiA7Ci0gIHNVY2FzdENsaWVudEludGVyZmFjZSA9IGJsdWV0b290aDo6YmFwOjp1Y2FzdDo6YnRpZl9iYXBfdWNsaWVudF9nZXRfaW50ZXJmYWNlKCk7Ci0gIHNVY2FzdENsaWVudEludGVyZmFjZS0+SW5pdCgmc1VjYXN0Q2xpZW50Q2FsbGJhY2tzKTsKLSAgc2xlZXAoMSk7Ci0KLSAgU3RyZWFtQ29ubmVjdCBjb25uX2luZm87Ci0gIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWc7Ci0gIGNvZGVjX3Fvc19jb25maWcuY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPSBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICBjb2RlY19xb3NfY29uZmlnLmNvZGVjX2NvbmZpZy5jb2RlY19wcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLSAgY29kZWNfcW9zX2NvbmZpZy5jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gIGNvZGVjX3Fvc19jb25maWcuY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gIC8vRnJhbWVfRHVyYXRpb24KLSAgVXBkYXRlRnJhbWVEdXJhdGlvbigmY29kZWNfcW9zX2NvbmZpZy5jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAvLyBMQzNfQmxvY2tzX1Blcl9TRFUKLSAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZjb2RlY19xb3NfY29uZmlnLmNvZGVjX2NvbmZpZywgMSk7Ci0gIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZy5jb2RlY19jb25maWcsIDEwMCk7Ci0gIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaWdfY29uZmlnID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYWNraW5nID0gMHgwMSwgLy8gaW50ZXJsZWF2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gIENJU0NvbmZpZyBjaXNfY29uZmlnXzEgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICBDSVNDb25maWcgY2lzX2NvbmZpZ18yID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzEpOwotICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMik7Ci0KLSAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZyA9ICB7Ci0gICAgLmNpZ19pZCA9IDEsCi0gICAgLmNpc19pZCA9IDAsCi0gICAgLmJpX2RpcmVjdGlvbmFsID0gZmFsc2UsCi0gICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHsweDIwLCAweDRFLCAweDAwfQotICB9OwotICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZyk7Ci0gIGNvbm5faW5mby5zdHJlYW1fdHlwZS50eXBlID0gMHgwMDA0OyAvLyBtZWRpYQotICBjb25uX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICBjb25uX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVOVF9UWVBFX01FRElBOwotICBjb25uX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnKTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gc3RyZWFtczsKLSAgc3RyZWFtcy5wdXNoX2JhY2soY29ubl9pbmZvKTsKLQotICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnXzIgPSAgewotICAgIC5jaWdfaWQgPSAxLAotICAgIC5jaXNfaWQgPSAxLAotICAgIC5iaV9kaXJlY3Rpb25hbCA9IGZhbHNlLAotICAgIC5wcmVzZW50YXRpb25fZGVsYXkgPSB7MHgyMCwgMHg0RSwgMHgwMH0KLSAgfTsKLQotICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuYXNjc19jb25maWdzLmNsZWFyKCk7Ci0gIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnXzIpOwotICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb18yOwotICBjb25uX2luZm9fMi5zdHJlYW1fdHlwZS50eXBlID0gMHgwMDA0OyAvLyBtZWRpYQotICBjb25uX2luZm9fMi5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gIGNvbm5faW5mb18yLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9NRURJQTsKLSAgY29ubl9pbmZvXzIuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnKTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gc3RyZWFtc18yOwotICBzdHJlYW1zXzIucHVzaF9iYWNrKGNvbm5faW5mb18yKTsKLQotICAvLyByZWNvbmZpZyBpbmZvcm1hdGlvbgotICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gcmVjb25mX3N0cmVhbXM7Ci0gIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3NbMF0uY2lzX2lkID0gMTsKLSAgVXBkYXRlRnJhbWVEdXJhdGlvbigmY29kZWNfcW9zX2NvbmZpZy5jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzdfNSkpOwotCi0gIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaWdfY29uZmlnID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYWNraW5nID0gMHgwMSwgLy8gaW50ZXJsZWF2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHg0QywgMHgxRCwgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHg0QywgMHgxRCwgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgU3RyZWFtUmVjb25maWcgcmVjb25mX2luZm87Ci0gIHJlY29uZl9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSAweDAwMDQ7IC8vIG1lZGlhCi0gIHJlY29uZl9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gIHJlY29uZl9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgcmVjb25mX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnKTsKLSAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9pbmZvKTsKLQotICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gcmVjb25mX3Fvc19zdHJlYW1zOwotICBTdHJlYW1SZWNvbmZpZyByZWNvbmZfcW9zX2luZm87Ci0gIHJlY29uZl9xb3NfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gMHgwMDA0OyAvLyBtZWRpYQotICByZWNvbmZfcW9zX2luZm8ucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OlFPU19DT05GSUc7Ci0gIHJlY29uZl9xb3NfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gIGNvZGVjX3Fvc19jb25maWcucW9zX2NvbmZpZy5jaXNfY29uZmlncy5jbGVhcigpOwotCi0gIGNpc19jb25maWdfMS5ydG5fbV90b19zID0gMTsKLSAgY2lzX2NvbmZpZ18xLnJ0bl9zX3RvX20gPSAxOwotICBjaXNfY29uZmlnXzIucnRuX21fdG9fcyA9IDE7Ci0gIGNpc19jb25maWdfMi5ydG5fc190b19tID0gMTsKLSAgY29kZWNfcW9zX2NvbmZpZy5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzEpOwotICBjb2RlY19xb3NfY29uZmlnLnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMik7Ci0gIHJlY29uZl9xb3NfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWcpOwotICByZWNvbmZfcW9zX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9xb3NfaW5mbyk7Ci0KLSAgU3RyZWFtVHlwZSB0eXBlXzEgPSB7IC50eXBlID0gMHgwMDA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgUmF3QWRkcmVzcyBiYXBfYmRfYWRkcl8yOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMDowMjo1QjowMDpGRjowMSIsIGJhcF9iZF9hZGRyXzIpOwotCi0gIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0YXJ0X3N0cmVhbXM7Ci0gIHN0YXJ0X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfMSk7Ci0KLSAgY2hhciBiYXBfdGVzdFsxNTBdID0gImdlbmVyaWMiOwotCi0gIHByb3BlcnR5X2dldCgicGVyc2lzdC52ZW5kb3Iuc2VydmljZS5idC5iYXAudGVzdCIsIGJhcF90ZXN0LCAiZ2VuZXJpYyIpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBwcm9wZXJ0eSIgPDwgYmFwX3Rlc3Q7Ci0KLSAgaWYoIXN0cmNtcChiYXBfdGVzdCwgImdlbmVyaWMiKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBnZW5lcmljIHRlc3QgY2FzZSI7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIsIHRydWUsIHN0cmVhbXMpOwotCi0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkcl8yLCB0cnVlLCBzdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdGFydCAxICI7Ci0gICAgLy9zVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0YXJ0IDIiOwotICAgIC8vc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3Igc3RyZWFtIGRpc2Nvbm5lY3QgMiAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdCggYmFwX2JkX2FkZHJfMiwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJzdGVyZW9fcmVjb3JkaW5nX3N0ZXJlb19kdWFsX2NpcyIpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHJ4b25seSB0ZXN0IGNhc2UiOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IjsKLSAgICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmc7Ci0KLSAgICBDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzE7Ci0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8yOwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV9tZWRpYV9yeCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfbWVkaWFfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18xX21lZGlhX3J4XzIgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAyMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnXzEgPSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iaV9kaXJlY3Rpb25hbCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ18yID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHsweDIwLCAweDRFLCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5jb2RlY19jb25maWcuY29kZWNfdHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5jb2RlY19jb25maWcuY29kZWNfcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEuY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xLmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgLy9GcmFtZV9EdXJhdGlvbgotICAgIFVwZGF0ZUZyYW1lRHVyYXRpb24oJmNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSk7Ci0gICAgLy8gTEMzX0Jsb2Nrc19QZXJfU0RVCi0gICAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEuY29kZWNfY29uZmlnLCAxKTsKLSAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJmNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5jb2RlY19jb25maWcsIDEwMCk7Ci0KLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMiA9IGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMTsKLSAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJmNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMi5jb2RlY19jb25maWcsIDIwMCk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEucW9zX2NvbmZpZy5jaWdfY29uZmlnID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2NvdW50ID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYWNraW5nID0gMHgwMSwgLy8gaW50ZXJsZWF2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcmFtaW5nID0gIDB4MDAsIC8vIHVuZnJhbWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfbV90b19zID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfbWVkaWFfcngpOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzJfbWVkaWFfcngpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ18xKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnXzIpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8yLnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX21fdG9fcyA9IHsweDEwLCAweDI3LCAweDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfc190b19tID0gezB4MTAsIDB4MjcsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzIucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18xX21lZGlhX3J4XzIpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ18xKTsKLQotICAgIFN0cmVhbVR5cGUgdHlwZV9tZWRpYV9yeCA9IHsgLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9MSVZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmcuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBjb25uX2luZm9fbWVkaWFfcmVjb3JkaW5nLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRTsKLSAgICBjb25uX2luZm9fbWVkaWFfcmVjb3JkaW5nLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmcuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEpOwotICAgIGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmcuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzIpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gbWVkaWFfcnhfc3RyZWFtczsKLSAgICBtZWRpYV9yeF9zdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm9fbWVkaWFfcmVjb3JkaW5nKTsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHN0cmVhbXM7Ci0gICAgc3RyZWFtcy5wdXNoX2JhY2sodHlwZV9tZWRpYV9yeCk7Ci0KLQotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIsIHRydWUsIG1lZGlhX3J4X3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMTUpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdGFydCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIHN0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RyZWFtcyk7Ci0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJkdWFsX3N0cmVhbXNfbWVkaWFfdHhfdm9pY2VfcngiKSkgewotICAgIFN0cmVhbUNvbm5lY3QgY29ubl9pbmZvX21lZGlhOwotICAgIFN0cmVhbUNvbm5lY3QgY29ubl9pbmZvX2dhbWluZzsKLQotICAgIC8vIHJlY29uZmlnIGluZm9ybWF0aW9uCi0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xOwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4OwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4OwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV9tZWRpYV90eCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfbWVkaWFfdHggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDE1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18xX2dhbWluZ190eCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfZ2FtaW5nX3R4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV9nYW1pbmdfdHhfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMl9nYW1pbmdfdHhfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmVzZW50YXRpb25fZGVsYXkgPSB7MHgyMCwgMHg0RSwgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLmNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIC8vRnJhbWVfRHVyYXRpb24KLSAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLmNvZGVjX2NvbmZpZywgMSk7Ci0gICAgVXBkYXRlT2N0c1BlckZyYW1lKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLCAxNTUpOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhY2tpbmcgPSAweDAxLCAvLyBpbnRlcmxlYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAgMHgwMCwgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfbWVkaWFfdHgpOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzJfbWVkaWFfdHgpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZyk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5jb2RlY19jb25maWcuY29kZWNfcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIC8vRnJhbWVfRHVyYXRpb24KLSAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSk7Ci0gICAgLy8gTEMzX0Jsb2Nrc19QZXJfU0RVCi0gICAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5jb2RlY19jb25maWcsIDEpOwotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLCAxMDApOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4LnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9ICAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHsweDEwLCAweDI3LCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHgucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18xX2dhbWluZ190eCk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHgucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18yX2dhbWluZ190eCk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5wdXNoX2JhY2soYXNjc19jb25maWcpOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZy5jb2RlY190eXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzM7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTYwMDA7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAvL0ZyYW1lX0R1cmF0aW9uCi0gICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLCAxKTsKLSAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJmNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZywgNDApOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9ICAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHsweDEwLCAweDI3LCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcngucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18xX2dhbWluZ190eF9yeCk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcngucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18yX2dhbWluZ190eF9yeCk7Ci0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ19nYW1pbmcgPSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iaV9kaXJlY3Rpb25hbCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ19nYW1pbmcpOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgY29ubl9pbmZvX21lZGlhLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xKTsKLQotICAgIGNvbm5faW5mb19nYW1pbmcuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX2luZm9fZ2FtaW5nLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX2luZm9fZ2FtaW5nLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIGNvbm5faW5mb19nYW1pbmcuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiBkdWFsX3N0cmVhbXM7Ci0gICAgZHVhbF9zdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm9fbWVkaWEpOwotICAgIGR1YWxfc3RyZWFtcy5wdXNoX2JhY2soY29ubl9pbmZvX2dhbWluZyk7Ci0KLSAgICBTdHJlYW1UeXBlIHR5cGVfbWVkaWEgPSB7IC50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIFN0cmVhbVR5cGUgdHlwZV92b2ljZSA9IHsgLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBtZWRpYV9zdHJlYW1zOwotICAgIG1lZGlhX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfbWVkaWEpOwotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IHZvaWNlX3N0cmVhbXM7Ci0gICAgdm9pY2Vfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV92b2ljZSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgZ2VuZXJpYyB0ZXN0IGNhc2UiOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IHdpdGggbWVkaWEgdHggYW5kIGdhbWluZyByeCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgZHVhbF9zdHJlYW1zKTsKLQotICAgIC8vc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkcl8yLCB0cnVlLCBzdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+IHJlY29uZl9zdHJlYW1zOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ190eF9pbmZvOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOyAvLyBtZWRpYQotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOyAvLyBtZWRpYQotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHgpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOyAvLyBtZWRpYQotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOyAvLyBtZWRpYQotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcngpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX21lZGlhX2luZm87Ci0gICAgcmVjb25mX21lZGlhX2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsgLy8gbWVkaWEKLSAgICByZWNvbmZfbWVkaWFfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOyAvLyBtZWRpYQotICAgIHJlY29uZl9tZWRpYV9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX21lZGlhX2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIHJlY29uZl9tZWRpYV9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RhcnQgMSAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIC8vIHN3aXRjaCB0byBHYW1pbmcgdHgKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0b3AgMSAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfaW5mbyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIC8vIHN3aXRjaCB0byBtZWRpYSB0eAotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RvcCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICAvLyByZWNvbmZpZyB0aGUgZmlyc3Qgc3RyZWFtCi0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX21lZGlhX2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICAvLyBzd2l0Y2ggdG8gR2FtaW5nIHR4ICYgcngKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0b3AgMSAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgdm9pY2Vfc3RyZWFtcyk7Ci0KLSAgICAvLyBzd2l0Y2ggdG8gR2FtaW5nIHR4ICgybmQgdGltZSkgKDR0aCkKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0b3AgMSAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpRT1NfQ09ORklHOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfZ2FtaW5nX3R4X2luZm8pOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0KLQotICAgIC8vIHN3aXRjaCB0byBHYW1pbmcgdHggJiByeCAoMm5kIHRpbWUpICg1dGgpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIC8vIHJlY29uZmlnIHRoZSBmaXJzdCBzdHJlYW0KLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6UU9TX0NPTkZJRzsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9yeF9pbmZvKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSByZWNvbmZndXJlZCAuc3RhcnQgICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgIC8vIHN3aXRjaCB0byBtZWRpYSB0eCAoNnRoKQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RvcCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgdm9pY2Vfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICAvLyByZWNvbmZpZyB0aGUgZmlyc3Qgc3RyZWFtCi0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX21lZGlhX2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgdm9pY2Vfc3RyZWFtcyk7Ci0gICAgLy9MT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCAyICI7Ci0gICAgLy9zVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIHN0YXJ0X3N0cmVhbXMpOwotCi0gIH0gZWxzZSBpZighc3RyY21wKGJhcF90ZXN0LCAidHJpX3N0cmVhbXNfbWVkaWFfdHhfdm9pY2VfdHhfdm9pY2VfcngiKSkgewotICAgIFN0cmVhbUNvbm5lY3QgY29ubl9pbmZvX21lZGlhOwotICAgIFN0cmVhbUNvbm5lY3QgY29ubl9pbmZvX2dhbWluZzsKLSAgICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb192b2ljZV90eDsKLSAgICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb192b2ljZV9yeDsKLQotICAgIC8vIHJlY29uZmlnIGluZm9ybWF0aW9uCi0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xOwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4OwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4OwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3J4OwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcng7Ci0KLSAgICBDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzI7Ci0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMjsKLSAgICBDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeF8yOwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3J4XzI7Ci0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yOwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV9tZWRpYV90eCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfbWVkaWFfdHggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDE1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18xX2dhbWluZ190eCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfZ2FtaW5nX3R4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV9nYW1pbmdfdHhfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMl9nYW1pbmdfdHhfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18xX3ZvaWNlX3R4X3J4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMl92b2ljZV90eF9yeCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gNDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZyA9ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ19nYW1pbmcgPSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iaV9kaXJlY3Rpb25hbCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIEFTQ1NDb25maWcgYXNjc19jb25maWdfdm9pY2UgPSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iaV9kaXJlY3Rpb25hbCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIEFTQ1NDb25maWcgYXNjc19jb25maWdfMiA9ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ19nYW1pbmdfMiA9ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmVzZW50YXRpb25fZGVsYXkgPSB7MHgyMCwgMHg0RSwgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ192b2ljZV8yID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHsweDIwLCAweDRFLCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLmNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIC8vRnJhbWVfRHVyYXRpb24KLSAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLmNvZGVjX2NvbmZpZywgMSk7Ci0gICAgVXBkYXRlT2N0c1BlckZyYW1lKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLCAxNTUpOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhY2tpbmcgPSAweDAxLCAvLyBpbnRlcmxlYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAgMHgwMCwgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfbWVkaWFfdHgpOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzJfbWVkaWFfdHgpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZyk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzIgPSBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzE7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLmNsZWFyKCk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ18yKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4LmNvZGVjX2NvbmZpZy5jb2RlY190eXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzM7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAvL0ZyYW1lX0R1cmF0aW9uCi0gICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHguY29kZWNfY29uZmlnLCAxKTsKLSAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJmNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4LmNvZGVjX2NvbmZpZywgMTAwKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eC5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhY2tpbmcgPSAweDAxLCAvLyBpbnRlcmxlYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAgMHgwMCwgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4LnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMV9nYW1pbmdfdHgpOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4LnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMl9nYW1pbmdfdHgpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHgucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnKTsKLQotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMiA9IGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4OwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzIucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MuY2xlYXIoKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ18yKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZy5jb2RlY190eXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzM7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAvL0ZyYW1lX0R1cmF0aW9uCi0gICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnguY29kZWNfY29uZmlnLCAxKTsKLSAgICBVcGRhdGVPY3RzUGVyRnJhbWUoJmNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZywgMTAwKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeC5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhY2tpbmcgPSAweDAxLCAvLyBpbnRlcmxlYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAgMHgwMCwgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMV9nYW1pbmdfdHhfcngpOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMl9nYW1pbmdfdHhfcngpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcngucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX2dhbWluZyk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeF8yID0gY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcng7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnhfMi5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5jbGVhcigpOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4XzIucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX2dhbWluZ18yKTsKLQotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfcnguY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5jb2RlY19jb25maWcuY29kZWNfcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNjAwMDsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIC8vRnJhbWVfRHVyYXRpb24KLSAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSk7Ci0gICAgLy8gTEMzX0Jsb2Nrc19QZXJfU0RVCi0gICAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5jb2RlY19jb25maWcsIDEpOwotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfcnguY29kZWNfY29uZmlnLCA0MCk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfcngucW9zX2NvbmZpZy5jaWdfY29uZmlnID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2NvdW50ID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYWNraW5nID0gMHgwMSwgLy8gaW50ZXJsZWF2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcmFtaW5nID0gIDB4MDAsIC8vIHVuZnJhbWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfbV90b19zID0gIDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX21fdG9fcyA9IHsweDEwLCAweDI3LCAweDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfc190b19tID0gezB4MTAsIDB4MjcsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfZ2FtaW5nX3R4X3J4KTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeC5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzJfZ2FtaW5nX3R4X3J4KTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3J4LnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ19nYW1pbmcpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfcnhfMiA9IGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3J4OwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3J4XzIucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MuY2xlYXIoKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ19yeF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ19nYW1pbmdfMik7Ci0KLQotICAgIC8vIHZvaWNlIHR4IHJ4Ci0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcuY29kZWNfdHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcnguY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNjAwMDsKLSAgICBjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4LmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgLy9GcmFtZV9EdXJhdGlvbgotICAgIFVwZGF0ZUZyYW1lRHVyYXRpb24oJmNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcnguY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcsIDEpOwotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcsIDQwKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4LnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9ICAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHsweDEwLCAweDI3LCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfdm9pY2VfdHhfcngpOwotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18yX3ZvaWNlX3R4X3J4KTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX3ZvaWNlKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcnhfMiA9IGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcng7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLmNsZWFyKCk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ192b2ljZV8yKTsKLQotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgY29ubl9pbmZvX21lZGlhLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xKTsKLQotICAgIGNvbm5faW5mb19nYW1pbmcuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX2luZm9fZ2FtaW5nLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX2luZm9fZ2FtaW5nLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIGNvbm5faW5mb19nYW1pbmcuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeCk7Ci0KLSAgICBjb25uX2luZm9fdm9pY2VfdHguc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX2luZm9fdm9pY2VfdHguc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIGNvbm5faW5mb192b2ljZV90eC5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgY29ubl9pbmZvX3ZvaWNlX3R4LmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeCk7Ci0KLSAgICBjb25uX2luZm9fdm9pY2Vfcnguc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICBjb25uX2luZm9fdm9pY2Vfcnguc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIGNvbm5faW5mb192b2ljZV9yeC5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQzsKLSAgICBjb25uX2luZm9fdm9pY2VfcnguY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4KTsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+IHRyaV9zdHJlYW1zOwotICAgIHRyaV9zdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm9fbWVkaWEpOwotICAgIHRyaV9zdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm9fdm9pY2VfdHgpOwotICAgIHRyaV9zdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm9fdm9pY2VfcngpOwotCi0gICAgY29ubl9pbmZvX21lZGlhLmNvZGVjX3Fvc19jb25maWdfcGFpci5jbGVhcigpOwotICAgIGNvbm5faW5mb19tZWRpYS5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMik7Ci0KLSAgICBjb25uX2luZm9fdm9pY2VfdHguY29kZWNfcW9zX2NvbmZpZ19wYWlyLmNsZWFyKCk7Ci0gICAgY29ubl9pbmZvX3ZvaWNlX3R4LmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yKTsKLQotICAgIGNvbm5faW5mb192b2ljZV9yeC5jb2RlY19xb3NfY29uZmlnX3BhaXIuY2xlYXIoKTsKLSAgICBjb25uX2luZm9fdm9pY2VfcnguY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4XzIpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gdHJpX3N0cmVhbXNfMjsKLSAgICB0cmlfc3RyZWFtc18yLnB1c2hfYmFjayhjb25uX2luZm9fbWVkaWEpOwotICAgIHRyaV9zdHJlYW1zXzIucHVzaF9iYWNrKGNvbm5faW5mb192b2ljZV90eCk7Ci0gICAgdHJpX3N0cmVhbXNfMi5wdXNoX2JhY2soY29ubl9pbmZvX3ZvaWNlX3J4KTsKLQotICAgIFN0cmVhbVR5cGUgdHlwZV9tZWRpYSA9IHsgLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgU3RyZWFtVHlwZSB0eXBlX3ZvaWNlX3R4ID0geyAudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBTdHJlYW1UeXBlIHR5cGVfdm9pY2VfcnggPSB7IC50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBtZWRpYV9zdHJlYW1zOwotICAgIG1lZGlhX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfbWVkaWEpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZ2FtaW5nX3R4X3N0cmVhbXM7Ci0gICAgZ2FtaW5nX3R4X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfbWVkaWEpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZ2FtaW5nX3J4X3N0cmVhbXM7Ci0gICAgZ2FtaW5nX3J4X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfdm9pY2VfcngpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gdm9pY2Vfc3RyZWFtczsKLSAgICB2b2ljZV9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX3ZvaWNlX3R4KTsKLSAgICB2b2ljZV9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX3ZvaWNlX3J4KTsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IGFsbF90aHJlZV9zdHJlYW1zOwotICAgIGFsbF90aHJlZV9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX21lZGlhKTsKLSAgICBhbGxfdGhyZWVfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV92b2ljZV90eCk7Ci0gICAgYWxsX3RocmVlX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfdm9pY2VfcngpOwotCi0jaWYgMAotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBnZW5lcmljIHRlc3QgY2FzZSI7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3Qgd2l0aCBtZWRpYSB0eCBhbmQgdm9pY2UgdHgmIHJ4IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyLCB0cnVlLCB0cmlfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkcl8yLCB0cnVlLCB0cmlfc3RyZWFtc18yKTsKLSAgICBzbGVlcCgxNSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCBhbGwgMyBzdHJlYW1zICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgYWxsX3RocmVlX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdCggYmFwX2JkX2FkZHJfMiwgYWxsX3RocmVlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCBhbGwgMyBzdHJlYW1zIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyLCB0cnVlLCB0cmlfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkcl8yLCB0cnVlLCB0cmlfc3RyZWFtc18yKTsKLQotICAgIHNsZWVwKDE1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IGFsbCAzIHN0cmVhbXMgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBhbGxfdGhyZWVfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkcl8yLCBhbGxfdGhyZWVfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSNlbmRpZgotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QgYWxsIDMgc3RyZWFtcyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgdHJpX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHJfMiwgdHJ1ZSwgdHJpX3N0cmVhbXNfMik7Ci0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1SZWNvbmZpZz4gcmVjb25mX3N0cmVhbXM7Ci0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+IHJlY29uZl9zdHJlYW1zXzI7Ci0KLSAgICBTdHJlYW1SZWNvbmZpZyByZWNvbmZfZ2FtaW5nX3R4X2luZm87Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgICByZWNvbmZfZ2FtaW5nX3R4X2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHgpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ190eF9pbmZvXzI7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvXzIuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICByZWNvbmZfZ2FtaW5nX3R4X2luZm9fMi5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mb18yLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvXzIuc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mb18yLmNvZGVjX3Fvc19jb25maWdfcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzIpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcngpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvXzI7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvXzIuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICByZWNvbmZfZ2FtaW5nX3R4X3J4X2luZm9fMi5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mb18yLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvXzIuc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mb18yLmNvZGVjX3Fvc19jb25maWdfcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcnhfMik7Ci0KLSAgICBTdHJlYW1SZWNvbmZpZyByZWNvbmZfZ2FtaW5nX3J4X2luZm87Ci0gICAgcmVjb25mX2dhbWluZ19yeF9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgcmVjb25mX2dhbWluZ19yeF9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgcmVjb25mX2dhbWluZ19yeF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX2dhbWluZ19yeF9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIHJlY29uZl9nYW1pbmdfcnhfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfcngpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ19yeF9pbmZvXzI7Ci0gICAgcmVjb25mX2dhbWluZ19yeF9pbmZvXzIuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICByZWNvbmZfZ2FtaW5nX3J4X2luZm9fMi5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgcmVjb25mX2dhbWluZ19yeF9pbmZvXzIucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICByZWNvbmZfZ2FtaW5nX3J4X2luZm9fMi5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQzsKLSAgICByZWNvbmZfZ2FtaW5nX3J4X2luZm9fMi5jb2RlY19xb3NfY29uZmlnX3BhaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfcnhfMik7Ci0KLSAgICBTdHJlYW1SZWNvbmZpZyByZWNvbmZfbWVkaWFfaW5mbzsKLSAgICByZWNvbmZfbWVkaWFfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9tZWRpYV9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgcmVjb25mX21lZGlhX2luZm8ucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICByZWNvbmZfbWVkaWFfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX21lZGlhX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX21lZGlhX2luZm9fMjsKLSAgICByZWNvbmZfbWVkaWFfaW5mb18yLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgcmVjb25mX21lZGlhX2luZm9fMi5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9tZWRpYV9pbmZvXzIucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICByZWNvbmZfbWVkaWFfaW5mb18yLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgICByZWNvbmZfbWVkaWFfaW5mb18yLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yKTsKLQotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX3ZvaWNlX3R4X2luZm87Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICByZWNvbmZfdm9pY2VfdHhfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIHJlY29uZl92b2ljZV90eF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LOwotICAgIHJlY29uZl92b2ljZV90eF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4KTsKLQotICAgIFN0cmVhbVJlY29uZmlnIHJlY29uZl92b2ljZV90eF9pbmZvXzI7Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm9fMi5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIHJlY29uZl92b2ljZV90eF9pbmZvXzIuc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICByZWNvbmZfdm9pY2VfdHhfaW5mb18yLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm9fMi5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm9fMi5jb2RlY19xb3NfY29uZmlnX3BhaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yKTsKLQotICAgIFN0cmVhbVJlY29uZmlnIHJlY29uZl92b2ljZV9yeF9pbmZvOwotICAgIHJlY29uZl92b2ljZV9yeF9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgcmVjb25mX3ZvaWNlX3J4X2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICByZWNvbmZfdm9pY2VfcnhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl92b2ljZV9yeF9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIHJlY29uZl92b2ljZV9yeF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgcHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX3ZvaWNlX3J4X2luZm9fMjsKLSAgICByZWNvbmZfdm9pY2VfcnhfaW5mb18yLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgcmVjb25mX3ZvaWNlX3J4X2luZm9fMi5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIHJlY29uZl92b2ljZV9yeF9pbmZvXzIucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICByZWNvbmZfdm9pY2VfcnhfaW5mb18yLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIHJlY29uZl92b2ljZV9yeF9pbmZvXzIuY29kZWNfcW9zX2NvbmZpZ19wYWlyLgotICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yKTsKLQotICAgIHNsZWVwKDE1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0YXJ0IDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICAvLyBzd2l0Y2ggdG8gR2FtaW5nIHR4Ci0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfaW5mbyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLSAgICByZWNvbmZfc3RyZWFtc18yLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXNfMi5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9pbmZvXzIpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSByZWNvbmZndXJlZCAuc3RhcnQgICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgLy8gc3dpdGNoIHRvIG1lZGlhIHR4Ci0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgcmVjb25mX3N0cmVhbXNfMi5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvXzIpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zXzIpOwotCi0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICAvLyBzd2l0Y2ggdG8gR2FtaW5nIHR4ICYgcngKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0b3AgMSAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICAvLyByZWNvbmZpZyB0aGUgZmlyc3Qgc3RyZWFtCi0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9yeF9pbmZvKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ19yeF9pbmZvKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgcmVjb25mX3N0cmVhbXNfMi5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mb18yKTsKLSAgICByZWNvbmZfc3RyZWFtc18yLnB1c2hfYmFjayhyZWNvbmZfZ2FtaW5nX3J4X2luZm9fMik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXNfMik7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBnYW1pbmdfcnhfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ19yeF9zdHJlYW1zKTsKLQotICAgIC8vIHN3aXRjaCB0byBHYW1pbmcgdHggKDJuZCB0aW1lKSAoNHRoKQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RvcCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIGdhbWluZ19yeF9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ190eF9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ19yeF9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIC8vIHJlY29uZmlnIHRoZSBmaXJzdCBzdHJlYW0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6UU9TX0NPTkZJRzsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgcmVjb25mX3N0cmVhbXNfMi5jbGVhcigpOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mb18yLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpRT1NfQ09ORklHOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfaW5mb18yKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtc18yKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIC8vIHN3aXRjaCB0byBHYW1pbmcgdHggJiByeCAoMm5kIHRpbWUpICg1dGgpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpRT1NfQ09ORklHOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfZ2FtaW5nX3R4X3J4X2luZm8pOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfZ2FtaW5nX3J4X2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICByZWNvbmZfc3RyZWFtc18yLmNsZWFyKCk7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvXzIucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OlFPU19DT05GSUc7Ci0gICAgcmVjb25mX3N0cmVhbXNfMi5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9yeF9pbmZvXzIpOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfcnhfaW5mb18yKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtc18yKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBnYW1pbmdfdHhfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIGdhbWluZ19yeF9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCBnYW1pbmdfdHhfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3J4X3N0cmVhbXMpOwotCi0gICAgLy8gc3dpdGNoIHRvIG1lZGlhIHR4ICg2dGgpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBnYW1pbmdfdHhfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgZ2FtaW5nX3J4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3J4X3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgcmVjb25mX3N0cmVhbXNfMi5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvXzIpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSByZWNvbmZndXJlZCAuc3RhcnQgICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgLy8gc3dpdGNoIHRvIHZvaWNlIHR4ICYgUnggKDd0aCkKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0b3AgMSAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICAvLyByZWNvbmZpZyB0aGUgZmlyc3Qgc3RyZWFtCi0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3J4X2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICByZWNvbmZfc3RyZWFtc18yLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXNfMi5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3J4X2luZm9fMik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXNfMik7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgdm9pY2Vfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgdm9pY2Vfc3RyZWFtcyk7Ci0KLSAgICAvLyBzd2l0Y2ggdG8gZ2FtaW5nIHR4ICg4dGgpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCB2b2ljZV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfZ2FtaW5nX3R4X2luZm8ucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgcmVjb25mX3N0cmVhbXNfMi5jbGVhcigpOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mb18yLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX3N0cmVhbXNfMi5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9pbmZvXzIpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSByZWNvbmZndXJlZCAuc3RhcnQgICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIG1lZGlhX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0KLSAgICAvLyBzd2l0Y2ggdG8gdm9pY2UgdHggJiBSeCAoOXRoKQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RvcCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIC8vIHJlY29uZmlnIHRoZSBmaXJzdCBzdHJlYW0KLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfdm9pY2VfcnhfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHJlY29uZl9zdHJlYW1zXzIuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtc18yLnB1c2hfYmFjayhyZWNvbmZfdm9pY2VfcnhfaW5mb18yKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtc18yKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCB2b2ljZV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgICAvLyBzd2l0Y2ggdG8gR2FtaW5nIHR4ICYgcnggKDEwdGgpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCB2b2ljZV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX2dhbWluZ190eF9yeF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mbyk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfcnhfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHJlY29uZl9zdHJlYW1zXzIuY2xlYXIoKTsKLSAgICByZWNvbmZfZ2FtaW5nX3R4X3J4X2luZm9fMi5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfcnhfaW5mb18yKTsKLSAgICByZWNvbmZfc3RyZWFtc18yLnB1c2hfYmFjayhyZWNvbmZfZ2FtaW5nX3J4X2luZm9fMik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXNfMik7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHJlY29uZmd1cmVkIC5zdGFydCAgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBnYW1pbmdfcnhfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ19yeF9zdHJlYW1zKTsKLQotCi0gICAgLy8gc3dpdGNoIHRvIHZvaWNlIHR4ICYgUnggKDExdGgpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBnYW1pbmdfdHhfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgZ2FtaW5nX3J4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3J4X3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy8gcmVjb25maWcgdGhlIGZpcnN0IHN0cmVhbQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl92b2ljZV9yeF9pbmZvKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgcmVjb25mX3N0cmVhbXNfMi5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zXzIucHVzaF9iYWNrKHJlY29uZl92b2ljZV9yeF9pbmZvXzIpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSByZWNvbmZndXJlZCAuc3RhcnQgICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIHZvaWNlX3N0cmVhbXMpOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgLy8gc3dpdGNoIHRvIG1lZGlhIHR4ICgxMnRoKQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RvcCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgdm9pY2Vfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIC8vIHJlY29uZmlnIHRoZSBmaXJzdCBzdHJlYW0KLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfbWVkaWFfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHJlY29uZl9zdHJlYW1zXzIuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtc18yLnB1c2hfYmFjayhyZWNvbmZfbWVkaWFfaW5mb18yKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtc18yKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBtZWRpYV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIC8vIHN3aXRjaCB0byB2b2ljZSB0eCAmIFJ4ICgxM3RoKQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RvcCAxICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgbWVkaWFfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIC8vIHJlY29uZmlnIHRoZSBmaXJzdCBzdHJlYW0KLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfdm9pY2VfcnhfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHJlY29uZl9zdHJlYW1zXzIuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtc18yLnB1c2hfYmFjayhyZWNvbmZfdm9pY2VfcnhfaW5mb18yKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtc18yKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcmVjb25mZ3VyZWQgLnN0YXJ0ICAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCB2b2ljZV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IDEgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBhbGxfdGhyZWVfc3RyZWFtcyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkcl8yLCBhbGxfdGhyZWVfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IGFsbCAzIHN0cmVhbXMiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIsIHRydWUsIHRyaV9zdHJlYW1zKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIHRydWUsIHRyaV9zdHJlYW1zXzIpOwotCi0gICAgc2xlZXAoMTUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IGFsbCAzIHN0cmVhbXMgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBhbGxfdGhyZWVfc3RyZWFtcyk7Ci0KLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIGFsbF90aHJlZV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotCi0gIH0gZWxzZSBpZighc3RyY21wKGJhcF90ZXN0LCAic3RlcmVvX2hlYWRzZXRfZHVhbF9jaXMiKSkgewotICAgIFN0cmVhbUNvbm5lY3QgY29ubl9pbmZvX21lZGlhOwotICAgIFN0cmVhbUNvbm5lY3QgY29ubl9pbmZvX2dhbWluZzsKLSAgICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb192b2ljZV90eDsKLSAgICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb192b2ljZV9yeDsKLSAgICBTdHJlYW1Db25uZWN0IGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmc7Ci0KLSAgICAvLyByZWNvbmZpZyBpbmZvcm1hdGlvbgotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMTsKLSAgICBDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzI7Ci0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMTsKLSAgICBDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8yOwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4OwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcng7Ci0gICAgQ29kZWNRb3NDb25maWcgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeF8yOwotICAgIENvZGVjUW9zQ29uZmlnIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMTsKLSAgICBDb2RlY1Fvc0NvbmZpZyBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzI7Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18xX21lZGlhX3R4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSAxNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMl9tZWRpYV90eCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzFfbWVkaWFfdHhfMiA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMzEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV9nYW1pbmdfdHggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18yX2dhbWluZ190eCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzFfZ2FtaW5nX3R4XzIgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NfdG9fbSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzFfZ2FtaW5nX3R4X3J4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfZ2FtaW5nX3R4X3J4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQ0lTQ29uZmlnIGNpc19jb25maWdfMV92b2ljZV90eF9yeCA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfbV90b19zID0gODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSA4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waHlfc190b19tID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fbV90b19zID0gMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ydG5fc190b19tID0gMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzJfdm9pY2VfdHhfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIENJU0NvbmZpZyBjaXNfY29uZmlnXzFfbWVkaWFfcnggPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X21fdG9fcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGh5X3NfdG9fbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX21fdG9fcyA9IDB4MDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IDB4MDUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBDSVNDb25maWcgY2lzX2NvbmZpZ18yX21lZGlhX3J4ID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9tX3RvX3MgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc190b19tID0gMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9tX3RvX3MgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBoeV9zX3RvX20gPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9zX3RvX20gPSAweDA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgIEFTQ1NDb25maWcgYXNjc19jb25maWdfMSA9ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4MjAsIDB4NEUsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ18yID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmVzZW50YXRpb25fZGVsYXkgPSB7MHgyMCwgMHg0RSwgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnX2dhbWluZ18xID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHsweDIwLCAweDRFLCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnX2dhbWluZ18yID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHsweDIwLCAweDRFLCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBBU0NTQ29uZmlnIGFzY3NfY29uZmlnX3ZvaWNlXzEgPSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iaV9kaXJlY3Rpb25hbCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJlc2VudGF0aW9uX2RlbGF5ID0gezB4NDAsIDB4OUMsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIEFTQ1NDb25maWcgYXNjc19jb25maWdfdm9pY2VfMiA9ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmVzZW50YXRpb25fZGVsYXkgPSB7MHg0MCwgMHg5QywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgQVNDU0NvbmZpZyBhc2NzX2NvbmZpZ19tZWRpYV9yeF8xID0gIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmlfZGlyZWN0aW9uYWwgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXNlbnRhdGlvbl9kZWxheSA9IHsweDIwLCAweDRFLCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIEFTQ1NDb25maWcgYXNjc19jb25maWdfbWVkaWFfcnhfMiA9ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpX2RpcmVjdGlvbmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmVzZW50YXRpb25fZGVsYXkgPSB7MHgyMCwgMHg0RSwgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLmNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIC8vRnJhbWVfRHVyYXRpb24KLSAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLmNvZGVjX2NvbmZpZywgMSk7Ci0gICAgVXBkYXRlT2N0c1BlckZyYW1lKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEuY29kZWNfY29uZmlnLCAxNTUpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yID0gY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xOwotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yLmNvZGVjX2NvbmZpZywgMzEwKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhY2tpbmcgPSAweDAxLCAvLyBpbnRlcmxlYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAgMHgwMCwgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfbWVkaWFfdHgpOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzJfbWVkaWFfdHgpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ18xKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzEucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnXzIpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yLnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9ICAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHsweDEwLCAweDI3LCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8yLnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMV9tZWRpYV90eF8yKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMi5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5wdXNoX2JhY2soYXNjc19jb25maWdfMSk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xLmNvZGVjX2NvbmZpZy5jb2RlY190eXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzM7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMS5jb2RlY19jb25maWcuY29kZWNfcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNQcmlvcml0eTo6Q09ERUNfUFJJT1JJVFlfREVGQVVMVDsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xLmNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzEuY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0NoYW5uZWxNb2RlOjpDT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAvL0ZyYW1lX0R1cmF0aW9uCi0gICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMS5jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSk7Ci0gICAgLy8gTEMzX0Jsb2Nrc19QZXJfU0RVCi0gICAgVXBkYXRlTGMzQmxvY2tzUGVyU2R1KCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xLmNvZGVjX2NvbmZpZywgMSk7Ci0gICAgVXBkYXRlT2N0c1BlckZyYW1lKCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xLmNvZGVjX2NvbmZpZywgMTAwKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzIgPSBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xOwotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMi5jb2RlY19jb25maWcsIDIwMCk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xLnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9ICAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHsweDEwLCAweDI3LCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMS5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfZ2FtaW5nX3R4KTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8xLnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMl9nYW1pbmdfdHgpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMS5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5wdXNoX2JhY2soYXNjc19jb25maWdfZ2FtaW5nXzEpOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzEucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX2dhbWluZ18yKTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzIucW9zX2NvbmZpZy5jaWdfY29uZmlnID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lzX2NvdW50ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYWNraW5nID0gMHgwMSwgLy8gaW50ZXJsZWF2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcmFtaW5nID0gIDB4MDAsIC8vIHVuZnJhbWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfbV90b19zID0gIDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX21fdG9fcyA9IHsweDEwLCAweDI3LCAweDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfc190b19tID0gezB4MTAsIDB4MjcsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8yLnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMV9nYW1pbmdfdHhfMik7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF8yLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ19nYW1pbmdfMSk7Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeC5jb2RlY19jb25maWcuY29kZWNfdHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZy5jb2RlY19wcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1ByaW9yaXR5OjpDT0RFQ19QUklPUklUWV9ERUZBVUxUOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgLy9GcmFtZV9EdXJhdGlvbgotICAgIFVwZGF0ZUZyYW1lRHVyYXRpb24oJmNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oQ29kZWNGcmFtZUR1cmF0aW9uOjpGUkFNRV9EVVJfMTApKTsKLSAgICAvLyBMQzNfQmxvY2tzX1Blcl9TRFUKLSAgICBVcGRhdGVMYzNCbG9ja3NQZXJTZHUoJmNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LmNvZGVjX2NvbmZpZywgMSk7Ci0gICAgVXBkYXRlT2N0c1BlckZyYW1lKCZjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeC5jb2RlY19jb25maWcsIDQwKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX2dhbWluZ190eF9yeC5xb3NfY29uZmlnLmNpZ19jb25maWcgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2lnX2lkID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaXNfY291bnQgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhY2tpbmcgPSAweDAxLCAvLyBpbnRlcmxlYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyYW1pbmcgPSAgMHgwMCwgLy8gdW5mcmFtZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9tX3RvX3MgPSAgMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X3NfdG9fbSA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfbV90b19zID0gezB4MTAsIDB4MjcsIDB4MDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9zX3RvX20gPSB7MHgxMCwgMHgyNywgMHgwMH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMV9nYW1pbmdfdHhfcngpOwotICAgIGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4X3J4LnFvc19jb25maWcuY2lzX2NvbmZpZ3MucHVzaF9iYWNrKGNpc19jb25maWdfMl9nYW1pbmdfdHhfcngpOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfcngucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX2dhbWluZ18xKTsKLQotICAgIC8vIHZvaWNlIHR4IHJ4Ci0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcuY29kZWNfdHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY0luZGV4OjpDT0RFQ19JTkRFWF9TT1VSQ0VfTEMzOwotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcnguY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcuc2FtcGxlX3JhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8zMjAwMDsKLSAgICBjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4LmNvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNDaGFubmVsTW9kZTo6Q09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgLy9GcmFtZV9EdXJhdGlvbgotICAgIFVwZGF0ZUZyYW1lRHVyYXRpb24oJmNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcnguY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcsIDEpOwotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5jb2RlY19jb25maWcsIDgwKTsKLSAgICBjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4LnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9ICAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4X3Rwb3J0X2xhdGVuY3lfc190b19tID0gMHgwMDBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pbnRlcnZhbF9tX3RvX3MgPSB7MHgxMCwgMHgyNywgMHgwMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHsweDEwLCAweDI3LCAweDAwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeC5xb3NfY29uZmlnLmNpc19jb25maWdzLnB1c2hfYmFjayhjaXNfY29uZmlnXzFfdm9pY2VfdHhfcngpOwotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18yX3ZvaWNlX3R4X3J4KTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX3ZvaWNlXzEpOwotICAgIGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngucW9zX2NvbmZpZy5hc2NzX2NvbmZpZ3MucHVzaF9iYWNrKGFzY3NfY29uZmlnX3ZvaWNlXzIpOwotCi0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEuY29kZWNfY29uZmlnLmNvZGVjX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEuY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjUHJpb3JpdHk6OkNPREVDX1BSSU9SSVRZX0RFRkFVTFQ7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xLmNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5jb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjQ2hhbm5lbE1vZGU6OkNPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIC8vRnJhbWVfRHVyYXRpb24KLSAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEuY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl8xMCkpOwotICAgIC8vIExDM19CbG9ja3NfUGVyX1NEVQotICAgIFVwZGF0ZUxjM0Jsb2Nrc1BlclNkdSgmY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xLmNvZGVjX2NvbmZpZywgMSk7Ci0gICAgVXBkYXRlT2N0c1BlckZyYW1lKCZjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEuY29kZWNfY29uZmlnLCAxMDApOwotCi0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xLnFvc19jb25maWcuY2lnX2NvbmZpZyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaWdfaWQgPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNpc19jb3VudCA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFja2luZyA9IDB4MDEsIC8vIGludGVybGVhdmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWluZyA9ICAweDAwLCAvLyB1bmZyYW1lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heF90cG9ydF9sYXRlbmN5X21fdG9fcyA9IDB4MDAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX20gPSAweDAwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2R1X2ludGVydmFsX21fdG9fcyA9IHsweDEwLCAweDI3LCAweDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaW50ZXJ2YWxfc190b19tID0gezB4MTAsIDB4MjcsIDB4MDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18xX21lZGlhX3J4KTsKLSAgICBjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEucW9zX2NvbmZpZy5jaXNfY29uZmlncy5wdXNoX2JhY2soY2lzX2NvbmZpZ18yX21lZGlhX3J4KTsKLQotICAgIGNvZGVjX3Fvc19jb25maWdfbWVkaWFfcnhfMS5xb3NfY29uZmlnLmFzY3NfY29uZmlncy5wdXNoX2JhY2soYXNjc19jb25maWdfbWVkaWFfcnhfMSk7Ci0gICAgY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xLnFvc19jb25maWcuYXNjc19jb25maWdzLnB1c2hfYmFjayhhc2NzX2NvbmZpZ19tZWRpYV9yeF8yKTsKLQotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIGNvbm5faW5mb19tZWRpYS5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgY29ubl9pbmZvX21lZGlhLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19tZWRpYV90eF8xKTsKLSAgICBjb25uX2luZm9fbWVkaWEuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzIpOwotCi0gICAgY29ubl9pbmZvX2dhbWluZy5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIGNvbm5faW5mb19nYW1pbmcuc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9HQU1FOwotICAgIGNvbm5faW5mb19nYW1pbmcuc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkM7Ci0gICAgY29ubl9pbmZvX2dhbWluZy5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfZ2FtaW5nX3R4XzEpOwotCi0gICAgY29ubl9pbmZvX3ZvaWNlX3R4LnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgY29ubl9pbmZvX3ZvaWNlX3R4LnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgY29ubl9pbmZvX3ZvaWNlX3R4LnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgICBjb25uX2luZm9fdm9pY2VfdHguY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4KTsKLQotICAgIGNvbm5faW5mb192b2ljZV9yeC5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIGNvbm5faW5mb192b2ljZV9yeC5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIGNvbm5faW5mb192b2ljZV9yeC5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQzsKLSAgICBjb25uX2luZm9fdm9pY2VfcnguY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX3ZvaWNlX3R4X3J4KTsKLQotICAgIGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmcuc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICBjb25uX2luZm9fbWVkaWFfcmVjb3JkaW5nLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRTsKLSAgICBjb25uX2luZm9fbWVkaWFfcmVjb3JkaW5nLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmcuY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX21lZGlhX3J4XzEpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gZm91cl9zdHJlYW1zOwotICAgIGZvdXJfc3RyZWFtcy5wdXNoX2JhY2soY29ubl9pbmZvX21lZGlhKTsKLSAgICBmb3VyX3N0cmVhbXMucHVzaF9iYWNrKGNvbm5faW5mb19tZWRpYV9yZWNvcmRpbmcpOwotICAgIGZvdXJfc3RyZWFtcy5wdXNoX2JhY2soY29ubl9pbmZvX3ZvaWNlX3R4KTsKLSAgICBmb3VyX3N0cmVhbXMucHVzaF9iYWNrKGNvbm5faW5mb192b2ljZV9yeCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1Db25uZWN0PiB2b2ljZV9jb25uX3N0cmVhbXM7Ci0gICAgdm9pY2VfY29ubl9zdHJlYW1zLnB1c2hfYmFjayhjb25uX2luZm9fdm9pY2VfdHgpOwotICAgIHZvaWNlX2Nvbm5fc3RyZWFtcy5wdXNoX2JhY2soY29ubl9pbmZvX3ZvaWNlX3J4KTsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbm5lY3Q+IG1lZGlhX2Nvbm5fc3RyZWFtczsKLSAgICBtZWRpYV9jb25uX3N0cmVhbXMucHVzaF9iYWNrKGNvbm5faW5mb19tZWRpYSk7Ci0KLSAgICBTdHJlYW1UeXBlIHR5cGVfbWVkaWEgPSB7IC50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIFN0cmVhbVR5cGUgdHlwZV9nYW1pbmdfdHggPSB7IC50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0dBTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBTdHJlYW1UeXBlIHR5cGVfdm9pY2VfdHggPSB7IC50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgIFN0cmVhbVR5cGUgdHlwZV92b2ljZV9yeCA9IHsgLnR5cGUgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBTdHJlYW1UeXBlIHR5cGVfbWVkaWFfcnggPSB7IC50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiBtZWRpYV9zdHJlYW1zOwotICAgIG1lZGlhX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfbWVkaWEpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gZ2FtaW5nX3R4X3N0cmVhbXM7Ci0gICAgZ2FtaW5nX3R4X3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfZ2FtaW5nX3R4KTsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVR5cGU+IG1lZGlhX3J4X3N0cmVhbXM7Ci0gICAgbWVkaWFfcnhfc3RyZWFtcy5wdXNoX2JhY2sodHlwZV9tZWRpYV9yeCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiB2b2ljZV9zdHJlYW1zOwotICAgIHZvaWNlX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfdm9pY2VfdHgpOwotICAgIHZvaWNlX3N0cmVhbXMucHVzaF9iYWNrKHR5cGVfdm9pY2VfcngpOwotCi0gICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gYWxsX2ZvdXJfc3RyZWFtczsKLSAgICBhbGxfZm91cl9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX21lZGlhKTsKLSAgICBhbGxfZm91cl9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX3ZvaWNlX3R4KTsKLSAgICBhbGxfZm91cl9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX3ZvaWNlX3J4KTsKLSAgICBhbGxfZm91cl9zdHJlYW1zLnB1c2hfYmFjayh0eXBlX21lZGlhX3J4KTsKLQotICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVJlY29uZmlnPiByZWNvbmZfc3RyZWFtczsKLQotICAgIFN0cmVhbVJlY29uZmlnIHJlY29uZl9tZWRpYV9pbmZvOwotICAgIHJlY29uZl9tZWRpYV9pbmZvLnN0cmVhbV90eXBlLnR5cGUgPSBDT05URU5UX1RZUEVfTUVESUE7Ci0gICAgcmVjb25mX21lZGlhX2luZm8uc3RyZWFtX3R5cGUuYXVkaW9fY29udGV4dCA9IENPTlRFTlRfVFlQRV9NRURJQTsKLSAgICByZWNvbmZfbWVkaWFfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9tZWRpYV9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU0lOSzsKLSAgICByZWNvbmZfbWVkaWFfaW5mby5jb2RlY19xb3NfY29uZmlnX3BhaXIucHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfbWVkaWFfdHhfMSk7Ci0gICAgcmVjb25mX21lZGlhX2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLnB1c2hfYmFjayhjb2RlY19xb3NfY29uZmlnX21lZGlhX3R4XzIpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX2dhbWluZ190eF9pbmZvOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9nYW1pbmdfdHhfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMSk7Ci0gICAgcmVjb25mX2dhbWluZ190eF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19nYW1pbmdfdHhfMik7Ci0KLSAgICBTdHJlYW1SZWNvbmZpZyByZWNvbmZfdm9pY2VfdHhfaW5mbzsKLSAgICByZWNvbmZfdm9pY2VfdHhfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIHJlY29uZl92b2ljZV90eF9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUw7Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm8ucmVjb25mX3R5cGUgPSBTdHJlYW1SZWNvbmZpZ1R5cGU6OkNPREVDX0NPTkZJRzsKLSAgICByZWNvbmZfdm9pY2VfdHhfaW5mby5zdHJlYW1fdHlwZS5kaXJlY3Rpb24gPSBBU0VfRElSRUNUSU9OX1NJTks7Ci0gICAgcmVjb25mX3ZvaWNlX3R4X2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF9iYWNrKGNvZGVjX3Fvc19jb25maWdfdm9pY2VfdHhfcngpOwotCi0gICAgU3RyZWFtUmVjb25maWcgcmVjb25mX3ZvaWNlX3J4X2luZm87Ci0gICAgcmVjb25mX3ZvaWNlX3J4X2luZm8uc3RyZWFtX3R5cGUudHlwZSA9IENPTlRFTlRfVFlQRV9DT05WRVJTQVRJT05BTDsKLSAgICByZWNvbmZfdm9pY2VfcnhfaW5mby5zdHJlYW1fdHlwZS5hdWRpb19jb250ZXh0ID0gQ09OVEVOVF9UWVBFX0NPTlZFUlNBVElPTkFMOwotICAgIHJlY29uZl92b2ljZV9yeF9pbmZvLnJlY29uZl90eXBlID0gU3RyZWFtUmVjb25maWdUeXBlOjpDT0RFQ19DT05GSUc7Ci0gICAgcmVjb25mX3ZvaWNlX3J4X2luZm8uc3RyZWFtX3R5cGUuZGlyZWN0aW9uID0gQVNFX0RJUkVDVElPTl9TUkM7Ci0gICAgcmVjb25mX3ZvaWNlX3J4X2luZm8uY29kZWNfcW9zX2NvbmZpZ19wYWlyLgotICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ192b2ljZV90eF9yeCk7Ci0KLSAgICBTdHJlYW1SZWNvbmZpZyByZWNvbmZfbWVkaWFfcnhfaW5mbzsKLSAgICByZWNvbmZfbWVkaWFfcnhfaW5mby5zdHJlYW1fdHlwZS50eXBlID0gQ09OVEVOVF9UWVBFX01FRElBOwotICAgIHJlY29uZl9tZWRpYV9yeF9pbmZvLnN0cmVhbV90eXBlLmF1ZGlvX2NvbnRleHQgPSBDT05URU5UX1RZUEVfTElWRTsKLSAgICByZWNvbmZfbWVkaWFfcnhfaW5mby5yZWNvbmZfdHlwZSA9IFN0cmVhbVJlY29uZmlnVHlwZTo6Q09ERUNfQ09ORklHOwotICAgIHJlY29uZl9tZWRpYV9yeF9pbmZvLnN0cmVhbV90eXBlLmRpcmVjdGlvbiA9IEFTRV9ESVJFQ1RJT05fU1JDOwotICAgIHJlY29uZl9tZWRpYV9yeF9pbmZvLmNvZGVjX3Fvc19jb25maWdfcGFpci5wdXNoX2JhY2soY29kZWNfcW9zX2NvbmZpZ19tZWRpYV9yeF8xKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBnZW5lcmljIHRlc3QgY2FzZSI7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3Qgd2l0aCB2b2ljZSB0eCBhbmQgcngiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHJfMiwgdHJ1ZSwgZm91cl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDE1KTsKLQotI2lmIDAKLSAgICAvLyAgUmVjb3JkaW5nIHRvIG11c2ljIHN3aXRjaCAoMTIpCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX21lZGlhX2luZm8pOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG11c2ljICBzdHJlYW0gc3RhcnQgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotCi0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtdXNpYyAgc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtZWRpYSBzdHJlYW0gc3RvcCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICAvL3NsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IHZvaWNlIHN0cmVhbXMgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIGFsbF9mb3VyX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3Qgd2l0aCB2b2ljZSB0eCBhbmQgcngiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHJfMiwgdHJ1ZSwgZm91cl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDE1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtdXNpYyAgc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICAvL3NsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IHZvaWNlIHN0cmVhbXMgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIGFsbF9mb3VyX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCB3aXRoIHZvaWNlIHR4IGFuZCByeCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkcl8yLCB0cnVlLCBmb3VyX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMTUpOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl92b2ljZV90eF9pbmZvKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3J4X2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciB2b2ljZSBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0KLSAgICAgLy8gQ2FsbCBUeCBSeCB0byBHYW1pbmcgc3dpdGNoICg0KQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciB2b2ljZSBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0KLSAgICAgLy8gQ2FsbCBUeCBSeCB0byBHYW1pbmcgc3dpdGNoICg0KQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgIC8vc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3Igc3RyZWFtIGRpc2Nvbm5lY3Qgdm9pY2Ugc3RyZWFtcyAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdCggYmFwX2JkX2FkZHJfMiwgYWxsX2ZvdXJfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IHdpdGggdm9pY2UgdHggYW5kIHJ4IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIHRydWUsIGZvdXJfc3RyZWFtcyk7Ci0gICAgc2xlZXAoMTUpOwotCi0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3R4X2luZm8pOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfdm9pY2VfcnhfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3Igdm9pY2Ugc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgdm9pY2Vfc3RyZWFtcyk7Ci0KLSAgICAvL3NsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IHZvaWNlIHN0cmVhbXMgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyXzIsIGFsbF9mb3VyX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkcl8yLCB0cnVlLCBmb3VyX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCB2b2ljZSBzdHJlYW1zICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkcl8yLCBhbGxfZm91cl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHJfMiwgdHJ1ZSwgZm91cl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDE1KTsKLQotI2VuZGlmCi0jaWYgMQotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl92b2ljZV90eF9pbmZvKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3J4X2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciB2b2ljZSBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIC8vdXNsZWVwKDIwMDAwMCk7Ci0KLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0KLSAgICAgLy8gQ2FsbCBUeCBSeCB0byBHYW1pbmcgc3dpdGNoICg0KQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciB2b2ljZSBzdHJlYW0gc3RhcnQgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotCi0gICAgIC8vIENhbGwgVHggUnggdG8gR2FtaW5nIHN3aXRjaCAoNCkKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtZWRpYSBzdHJlYW0gc3RvcCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgdm9pY2Vfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgLy91c2xlZXAoMjAwMDAwKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCB2b2ljZSBzdHJlYW1zICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkcl8yLCBhbGxfZm91cl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHJfMiwgdHJ1ZSwgZm91cl9zdHJlYW1zKTsKLSNlbmRpZgotCi0gICAgc2xlZXAoMTUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLQotICAgIC8vIE11c2ljIHN0cmVhbWluZwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgLy8gbXVzaWMgdG8gZ2FtaW5nIFR4IHN3aXRjaCAgKDEpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBnYW1pbmcgc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotCi0gICAgLy8gR2FtaW5nIFR4IHRvIG11c2ljIHN3aXRjaCAgKDIpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ190eF9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBnYW1pbmcgc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICAgLy8gbXVzaWMgdG8gQ2FsbCBUeCBSeCBzd2l0Y2ggKDMpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3R4X2luZm8pOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfdm9pY2VfcnhfaW5mbyk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3Igdm9pY2Ugc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgdm9pY2Vfc3RyZWFtcyk7Ci0KLQotICAgICAvLyBDYWxsIFR4IFJ4IHRvIEdhbWluZyBzd2l0Y2ggKDQpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX2dhbWluZ190eF9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBnYW1pbmcgc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotCi0KLSAgICAgLy8gR2FtaW5nIHRvIENhbCBBdWRpbyBzd2l0Y2ggKDUpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ190eF9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl92b2ljZV90eF9pbmZvKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3J4X2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciB2b2ljZSBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0KLQotICAgICAvLyBDYWwgQXVkaW8gdG8gbXVzaWMgc3dpdGNoICg2KQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCB2b2ljZV9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9tZWRpYV9pbmZvKTsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkcl8yLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtdXNpYyAgc3RyZWFtIHN0YXJ0ICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLQotICAgICAvLyAgbXVzaWMgdG8gUmVjb3JkaW5nIHN3aXRjaCAoNykKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtZWRpYSBzdHJlYW0gc3RvcCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfbWVkaWFfcnhfaW5mbyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgcmVjb3JkaW5nIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3J4X3N0cmVhbXMpOwotCi0KLSAgICAgLy8gIFJlY29yZGluZyB0byBHYW1pbmcgc3dpdGNoICg4KQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9yeF9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl9nYW1pbmdfdHhfaW5mbyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZ2FtaW5nIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIGdhbWluZ190eF9zdHJlYW1zKTsKLQotCi0gICAgIC8vICBHYW1pbmcgdG8gUmVjb3JkaW5nIHN3aXRjaCAoOSkKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtZWRpYSBzdHJlYW0gc3RvcCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgZ2FtaW5nX3R4X3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX21lZGlhX3J4X2luZm8pOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHJlY29yZGluZyBzdHJlYW0gc3RhcnQgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9yeF9zdHJlYW1zKTsKLQotCi0gICAgIC8vICBSZWNvcmRpbmcgdG8gQ2FsbCBBdWRpbyBzd2l0Y2ggKDEwKQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIG1lZGlhIHN0cmVhbSBzdG9wICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9yeF9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIHJlY29uZl9zdHJlYW1zLmNsZWFyKCk7Ci0gICAgcmVjb25mX3N0cmVhbXMucHVzaF9iYWNrKHJlY29uZl92b2ljZV90eF9pbmZvKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX3ZvaWNlX3J4X2luZm8pOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciB2b2ljZSBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHZvaWNlIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0KLSAgICAgLy8gIENhbGwgQXVkaW8gdG8gUmVjb3JkaW5nIHN3aXRjaCAoMTEpCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIHZvaWNlX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBjb2RlYyByZWNvbmZpZyI7Ci0gICAgcmVjb25mX3N0cmVhbXMuY2xlYXIoKTsKLSAgICByZWNvbmZfc3RyZWFtcy5wdXNoX2JhY2socmVjb25mX21lZGlhX3J4X2luZm8pOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyXzIsIHJlY29uZl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHJlY29yZGluZyBzdHJlYW0gc3RhcnQgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkcl8yLCBtZWRpYV9yeF9zdHJlYW1zKTsKLQotCi0gICAgIC8vICBSZWNvcmRpbmcgdG8gbXVzaWMgc3dpdGNoICgxMikKLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBtZWRpYSBzdHJlYW0gc3RvcCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHJfMiwgbWVkaWFfcnhfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGNvZGVjIHJlY29uZmlnIjsKLSAgICByZWNvbmZfc3RyZWFtcy5jbGVhcigpOwotICAgIHJlY29uZl9zdHJlYW1zLnB1c2hfYmFjayhyZWNvbmZfbWVkaWFfaW5mbyk7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5SZWNvbmZpZ3VyZSggYmFwX2JkX2FkZHJfMiwgcmVjb25mX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbXVzaWMgIHN0cmVhbSBzdGFydCAiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgc2xlZXAoNSk7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgbWVkaWEgc3RyZWFtIHN0b3AgIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyXzIsIG1lZGlhX3N0cmVhbXMpOwotCi0gICAgLy9zbGVlcCg1KTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCB2b2ljZSBzdHJlYW1zICI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkcl8yLCBhbGxfZm91cl9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICB9IGVsc2UgaWYoIXN0cmNtcChiYXBfdGVzdCwgImNvbm5lY3QiKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IHRlc3QgY2FzZSI7Ci0KLSAgICBmb3IgKCB1aW50OF90IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpdGVyYXRpb24gIiA8PCBsb2doZXgoaSk7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCI7Ci0gICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyLCB0cnVlLCBzdHJlYW1zKTsKLSAgICAgIHVzbGVlcCggaSogMTAwMCAqIDEwMDApOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IjsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotICAgIH0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJyZWxlYXNlX2luX3N0cmVhbWluZyIpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHJlbGVhc2VfaW5fc3RyZWFtaW5nIHRlc3QgY2FzZSI7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0YXJ0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLQotICB9IGVsc2UgaWYoIXN0cmNtcChiYXBfdGVzdCwgInJlbGVhc2VfaW5fZW5hYmxpbmciKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciByZWxlYXNlX2luX2VuYWJsaW5nIHRlc3QgY2FzZSI7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0YXJ0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgICB1c2xlZXAoMTUwICoxMDAwKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLQotCi0gIH0gZWxzZSBpZighc3RyY21wKGJhcF90ZXN0LCAicmVsZWFzZV9pbl9kaXNhYmxpbmciKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciByZWxlYXNlX2luX2Rpc2FibGluZyB0ZXN0IGNhc2UiOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIsIHRydWUsIHN0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdGFydCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLQotICAgIHVzbGVlcCgxMDAgKiAxMDAwKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJkaXNhYmxlX2luX2VuYWJsaW5nIikpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgZGlzYWJsZV9pbl9lbmFibGluZyB0ZXN0IGNhc2UiOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIsIHRydWUsIHN0cmVhbXMpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdGFydCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotCi0gICAgdXNsZWVwKDIwMCAqIDEwMDApOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBzdG9wIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0b3AoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLQotICB9IGVsc2UgaWYoIXN0cmNtcChiYXBfdGVzdCwgImRpc2FibGVfaW5fc3RyZWFtaW5nIikpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgZGlzYWJsZV9pbl9zdHJlYW1pbmcgdGVzdCBjYXNlIjsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyLCB0cnVlLCBzdHJlYW1zKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RhcnQiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3Igc3RyZWFtIHN0b3AiOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotCi0gIH0gZWxzZSBpZighc3RyY21wKGJhcF90ZXN0LCAicmVsZWFzZV9pbl9jb2RlY19jb25maWd1cmVkIikpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgcmVsZWFzZV9pbl9jb2RlY19jb25maWd1cmVkIHRlc3QgY2FzZSI7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICB1c2xlZXAoMjYwMCAqIDEwMDApOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLQotICB9IGVsc2UgaWYoIXN0cmNtcChiYXBfdGVzdCwgInJlbGVhc2VfaW5fcW9zX2NvbmZpZ3VyZWQiKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciByZWxlYXNlX2luX3Fvc19jb25maWd1cmVkIHRlc3QgY2FzZSI7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCgxMCk7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJlbmFibGVfaW5fcW9zX2NvbmZpZ3VyZWQiKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBlbmFibGVfaW5fcW9zX2NvbmZpZ3VyZWQgdGVzdCBjYXNlIjsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyLCB0cnVlLCBzdHJlYW1zKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHN0cmVhbSBzdGFydCI7Ci0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotCi0gIH0gZWxzZSBpZighc3RyY21wKGJhcF90ZXN0LCAic3RhcnQiKSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdGFydCB0ZXN0IGNhc2UiOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0b3Agd2hpbGUgc3RhcnRpbmcgdGVzdCBjYXNlIjsKLQotCi0gICAgZm9yICggdWludDhfdCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaXRlcmF0aW9uICIgPDwgbG9naGV4KGkpOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QiOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICAgIHNsZWVwKDUpOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdGFydCI7Ci0gICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgICB1c2xlZXAoIGkqIDIwMCAqIDEwMDApOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIjsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotICAgICAgc2xlZXAoNSk7Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gZGlzY29ubmVjdCI7Ci0gICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgZGlzY29ubmVjdCB3aGlsZSBzdGFydGluZyB0ZXN0IGNhc2UiOwotCi0gICAgZm9yICggdWludDhfdCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaXRlcmF0aW9uICIgPDwgbG9naGV4KGkpOwotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QiOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICAgIHNsZWVwKDUpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0YXJ0IjsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnQoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLSAgICAgIHVzbGVlcCggaSogMjAwICogMTAwMCk7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGRpc2Nvbm5lY3QiOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgICBzbGVlcCg1KTsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJzdG9wIikpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RvcCB0ZXN0IGNhc2UiOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBjb25uZWN0IjsKLQotICAgIGZvciAoIHVpbnQ4X3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGl0ZXJhdGlvbiAiIDw8IGxvZ2hleChpKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBkaXNjb25uZWN0IHdoaWxlIHN0b3BwaW5nIjsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIsIHRydWUsIHN0cmVhbXMpOwotCi0gICAgICBzbGVlcCg1KTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdGFydCI7Ci0gICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0KLSAgICAgIHNsZWVwKDUpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIHN0b3AiOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdG9wKCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgICB1c2xlZXAoIGkqIDIwMCAqIDEwMDApOwotCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3Igc3RyZWFtIGRpc2Nvbm5lY3QiOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkciwgc3RhcnRfc3RyZWFtcyk7Ci0gICAgfQotCi0gIH0gZWxzZSBpZighc3RyY21wKGJhcF90ZXN0LCAic3RvcCIpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0b3AgdGVzdCBjYXNlIjsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgY29ubmVjdCI7Ci0KLSAgICBmb3IgKCB1aW50OF90IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpdGVyYXRpb24gIiA8PCBsb2doZXgoaSk7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBnb2luZyBmb3IgZGlzY29ubmVjdCB3aGlsZSBzdG9wcGluZyI7Ci0gICAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyLCB0cnVlLCBzdHJlYW1zKTsKLQotICAgICAgc2xlZXAoNSk7Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gc3RhcnQiOwotICAgICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5TdGFydCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotCi0gICAgICBzbGVlcCg1KTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBzdG9wIjsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RvcCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotICAgICAgdXNsZWVwKCBpKiAyMDAgKiAxMDAwKTsKLQotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IjsKLSAgICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdCggYmFwX2JkX2FkZHIsIHN0YXJ0X3N0cmVhbXMpOwotICAgIH0KLSAgfSBlbHNlIGlmKCFzdHJjbXAoYmFwX3Rlc3QsICJyZWNvbmZpZ3VyZSIpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHJlY29uZmlndXJlIHRlc3QgY2FzZSI7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIGNvbm5lY3QiOwotCi0gICAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Db25uZWN0KCBiYXBfYmRfYWRkciwgdHJ1ZSwgc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gY29kZWMgcmVjb25maWciOwotICAgIHNVY2FzdENsaWVudEludGVyZmFjZS0+UmVjb25maWd1cmUoIGJhcF9iZF9hZGRyLCByZWNvbmZfc3RyZWFtcyk7Ci0KLSAgICBzbGVlcCg1KTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdvaW5nIGZvciBzdHJlYW0gcW9zIHJlY29uZmlnIjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlJlY29uZmlndXJlKCBiYXBfYmRfYWRkciwgcmVjb25mX3Fvc19zdHJlYW1zKTsKLQotICAgIHNsZWVwKDUpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZ29pbmcgZm9yIHN0cmVhbSBkaXNjb25uZWN0IjsKLSAgICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyLCBzdGFydF9zdHJlYW1zKTsKLQotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgVGVzdCBjb21wbGV0ZWQiOwotI2lmIDAKLSAgc2xlZXAoMik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGNvbm5lY3QiOwotICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNvbm5lY3QoIGJhcF9iZF9hZGRyKTsKLSAgc2xlZXAoNyk7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGRpc2NvdmVyeSI7Ci0gIHNVY2FzdENsaWVudEludGVyZmFjZS0+U3RhcnREaXNjb3ZlcnkoIGJhcF9iZF9hZGRyKTsKLSAgc2xlZXAoMik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGdldEF1ZGlvY29udGV4dHMiOwotICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHMoIGJhcF9iZF9hZGRyKTsKLSAgc2xlZXAoMik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGRpc2Nvbm5lY3QiOwotICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkRpc2Nvbm5lY3QoIGJhcF9iZF9hZGRyKTsKLSAgc2xlZXAoMSk7Ci0gIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q2xlYW51cCgpOwotICBzbGVlcCgxKTsKLSAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5Jbml0KCZzVWNhc3RDbGllbnRDYWxsYmFja3MpOwotICBzbGVlcCgxKTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgY29ubmVjdCAyICI7Ci0gIHNVY2FzdENsaWVudEludGVyZmFjZS0+Q29ubmVjdCggYmFwX2JkX2FkZHIpOwotICBzbGVlcCg3KTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZGlzY292ZXJ5IDIiOwotICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPlN0YXJ0RGlzY292ZXJ5KCBiYXBfYmRfYWRkcik7Ci0gIHNsZWVwKDIpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBnZXRBdWRpb2NvbnRleHRzIDIiOwotICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHMoIGJhcF9iZF9hZGRyKTsKLSAgc2xlZXAoMik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZGlzY29ubmVjdCAyIjsKLSAgc1VjYXN0Q2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KCBiYXBfYmRfYWRkcik7Ci0gIHNsZWVwKDEpOwotICBzVWNhc3RDbGllbnRJbnRlcmZhY2UtPkNsZWFudXAoKTsKLSNlbmRpZgotfQotCi1ib29sIHRlc3RfYmFwX3VjbGllbnQgKCkgewotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMDowMjo1YjowMDpmZjowMCIsIGJhcF9iZF9hZGRyKTsKLSAgdGVzdF90aHJlYWQgPSB0aHJlYWRfbmV3KCJ0ZXN0X2JhcF91Y2xpZW50Iik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIHRlc3Qgc2V0dXAiOwotICB0aHJlYWRfcG9zdCh0ZXN0X3RocmVhZCwgZXZlbnRfdGVzdF9iYXBfdWNsaWVudCwgTlVMTCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBQQUNTIHJlbGF0ZWQgdGVzdCBjb2RlCi11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudEludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50Q2FsbGJhY2tzOwotCi1zdGF0aWMgUGFjc0NsaWVudEludGVyZmFjZSogc1BhY3NDbGllbnRJbnRlcmZhY2UgPSBudWxscHRyOwotc3RhdGljIHVpbnQxNl90IHBhY3NfY2xpZW50X2lkID0gMDsKLXN0YXRpYyBSYXdBZGRyZXNzIHBhY19iZF9hZGRyOwotCi1jbGFzcyBQYWNzQ2xpZW50Q2FsbGJhY2tzSW1wbCA6IHB1YmxpYyBQYWNzQ2xpZW50Q2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIH5QYWNzQ2xpZW50Q2FsbGJhY2tzSW1wbCgpID0gZGVmYXVsdDsKLSAgdm9pZCBPbkluaXRpYWxpemVkKGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8IGNsaWVudF9pZDsKLSAgICBwYWNzX2NsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgfQotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblN0YXRlIHN0YXRlKSBvdmVycmlkZSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fOwotICAgIGlmKHN0YXRlID09IENvbm5lY3Rpb25TdGF0ZTo6Q09OTkVDVEVEKSAgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICJjb25uZWN0ZWQiOwotICAgIH0gZWxzZSBpZihzdGF0ZSA9PSBDb25uZWN0aW9uU3RhdGU6OkRJU0NPTk5FQ1RFRCkgIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiRGlzY29ubmVjdGVkIjsKLSAgICB9Ci0KLSAgfQotICB2b2lkIE9uQXVkaW9Db250ZXh0QXZhaWxhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdmFpbGFibGVfY29udGV4dHMpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0gIH0KLSAgIHZvaWQgT25TZWFyY2hDb21wbGV0ZShpbnQgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ29uZmlnPiBzaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpiYXA6OnBhY3M6OkNvZGVjQ29uZmlnPiBzcmNfcGFjX3JlY29yZHMsCi0gICAgICAgICAgICB1aW50MzJfdCBzaW5rX2xvY2F0aW9ucywKLSAgICAgICAgICAgIHVpbnQzMl90IHNyY19sb2NhdGlvbnMsCi0gICAgICAgICAgICB1aW50MzJfdCBhdmFpbGFibGVfY29udGV4dHMsCi0gICAgICAgICAgICB1aW50MzJfdCBzdXBwb3J0ZWRfY29udGV4dHMpIG92ZXJyaWRlIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX187Ci0gIH0KLX07Ci0KLXN0YXRpYyBQYWNzQ2xpZW50Q2FsbGJhY2tzSW1wbCBzUGFjc0NsaWVudENhbGxiYWNrczsKLQotc3RhdGljIHZvaWQgZXZlbnRfdGVzdF9wYWNzKFVOVVNFRF9BVFRSIHZvaWQqIGNvbnRleHQpIHsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UgPSBidGlmX3BhY3NfY2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkluaXQoJnNQYWNzQ2xpZW50Q2FsbGJhY2tzKTsKLSAgc2xlZXAoMSk7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGNvbm5lY3QiOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+Q29ubmVjdChwYWNzX2NsaWVudF9pZCwgcGFjX2JkX2FkZHIpOwotICBzbGVlcCg3KTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZGlzY292ZXJ5IjsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPlN0YXJ0RGlzY292ZXJ5KHBhY3NfY2xpZW50X2lkLCBwYWNfYmRfYWRkcik7Ci0gIHNsZWVwKDIpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBnZXRBdWRpb2NvbnRleHRzIjsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHMocGFjc19jbGllbnRfaWQsIHBhY19iZF9hZGRyKTsKLSAgc2xlZXAoMik7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZGlzY29ubmVjdCI7Ci0gIHNQYWNzQ2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KHBhY3NfY2xpZW50X2lkLCBwYWNfYmRfYWRkcik7Ci0KLSAgc2xlZXAoMik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGNvbm5lY3QiOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+Q29ubmVjdChwYWNzX2NsaWVudF9pZCwgcGFjX2JkX2FkZHIpOwotICBzbGVlcCg3KTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZGlzY292ZXJ5IjsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPlN0YXJ0RGlzY292ZXJ5KHBhY3NfY2xpZW50X2lkLCBwYWNfYmRfYWRkcik7Ci0gIHNsZWVwKDIpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgImdvaW5nIGZvciBnZXRBdWRpb2NvbnRleHRzIjsKLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHMocGFjc19jbGllbnRfaWQsIHBhY19iZF9hZGRyKTsKLSAgc2xlZXAoMik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGRpc2Nvbm5lY3QiOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+RGlzY29ubmVjdChwYWNzX2NsaWVudF9pZCwgcGFjX2JkX2FkZHIpOwotCi0gIHNsZWVwKDEpOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+Q2xlYW51cChwYWNzX2NsaWVudF9pZCk7Ci0KLSAgc2xlZXAoMSk7Ci0KLSAgc1BhY3NDbGllbnRJbnRlcmZhY2UtPkluaXQoJnNQYWNzQ2xpZW50Q2FsbGJhY2tzKTsKLSAgc2xlZXAoMSk7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGNvbm5lY3QgMiAiOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+Q29ubmVjdChwYWNzX2NsaWVudF9pZCwgcGFjX2JkX2FkZHIpOwotICBzbGVlcCg3KTsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJnb2luZyBmb3IgZGlzY292ZXJ5IDIiOwotICBzUGFjc0NsaWVudEludGVyZmFjZS0+U3RhcnREaXNjb3ZlcnkocGFjc19jbGllbnRfaWQsIHBhY19iZF9hZGRyKTsKLSAgc2xlZXAoMik7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGdldEF1ZGlvY29udGV4dHMgMiI7Ci0gIHNQYWNzQ2xpZW50SW50ZXJmYWNlLT5HZXRBdmFpbGFibGVBdWRpb0NvbnRleHRzKHBhY3NfY2xpZW50X2lkLCBwYWNfYmRfYWRkcik7Ci0gIHNsZWVwKDIpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiZ29pbmcgZm9yIGRpc2Nvbm5lY3QgMiI7Ci0gIHNQYWNzQ2xpZW50SW50ZXJmYWNlLT5EaXNjb25uZWN0KHBhY3NfY2xpZW50X2lkLCBwYWNfYmRfYWRkcik7Ci0KLSAgc2xlZXAoMSk7Ci0gIHNQYWNzQ2xpZW50SW50ZXJmYWNlLT5DbGVhbnVwKHBhY3NfY2xpZW50X2lkKTsKLQotfQotCi1ib29sIHRlc3RfcGFjcyAoUmF3QWRkcmVzcyYgYmRfYWRkcikgewotCi0gIHRlc3RfdGhyZWFkID0gdGhyZWFkX25ldygidGVzdF9wYWNzIik7Ci0gIHBhY19iZF9hZGRyID0gYmRfYWRkcjsKLSAgdGhyZWFkX3Bvc3QodGVzdF90aHJlYWQsIGV2ZW50X3Rlc3RfcGFjcywgTlVMTCk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfY2MuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9jYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljMzU1ZC4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9jYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qIENDIEludGVyZmFjZSAqLwotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2NjIgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhX2Nsb3N1cmVfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJidGFfY2NfYXBpLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2F0X2V4aXQuaD4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoX2NhbGxjb250cm9sX2NhbGxiYWNrcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aF9jYWxsY29udHJvbF9pbnRlcmZhY2UuaD4KLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBiYXNlOjpPd25lZDsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi11c2luZyBiYXNlOjpVbnJldGFpbmVkOwotdXNpbmcgYmx1ZXRvb3RoOjpjYWxsX2NvbnRyb2w6OkNhbGxDb250cm9sbGVySW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpjYWxsX2NvbnRyb2w6OkNhbGxDb250cm9sbGVyQ2FsbGJhY2tzOwotCi1uYW1lc3BhY2UgewotY2xhc3MgQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2VJbXBsOwotc3RkOjp1bmlxdWVfcHRyPENhbGxDb250cm9sbGVySW50ZXJmYWNlPiBDYWxsQ29udHJvbGxlckluc3RhbmNlOwotCi1jbGFzcyBDYWxsQ29udHJvbGxlckludGVyZmFjZUltcGwKLSAgOiBwdWJsaWMgQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UsIHB1YmxpYyBDYWxsQ29udHJvbGxlckNhbGxiYWNrcyB7Ci0gIH5DYWxsQ29udHJvbGxlckludGVyZmFjZUltcGwoKSA9IGRlZmF1bHQ7Ci0KLSBidF9zdGF0dXNfdCBJbml0KENhbGxDb250cm9sbGVyQ2FsbGJhY2tzKiBjYWxsYmFja3MsIFV1aWQgdXVpZCwgaW50IG1heF9jY3NfY2xpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5iYW5kX3JpbmdpbmdfZW5hYmxlZCkgb3ZlcnJpZGUgewotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDsKLSAgICB0aGlzLT5jYWxsYmFja3MgPSBjYWxsYmFja3M7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsQmluZCgmQ2FsbENvbnRyb2xsZXI6OkluaXRpYWxpemUsCi0gICAgICAgICAgIHRoaXMsIHV1aWQsbWF4X2Njc19jbGllbnRzLCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKSk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotIH0KLQotIGJ0X3N0YXR1c190IFVwZGF0ZUJlYXJlck5hbWUodWludDhfdCogb3BlcmF0b3Jfc3RyKSB7Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYmVhcmVyIG5hbWUgIiA8PCBvcGVyYXRvcl9zdHI7Ci0gICAgdWludDhfdCogYk5hbWUgPSAodWludDhfdCopbWFsbG9jKHNpemVvZih1aW50OF90KSpzdHJsZW4oKGNoYXIqKW9wZXJhdG9yX3N0cikrMSk7Ci0gICAgaWYgKGJOYW1lICE9IE5VTEwpIHsKLSAgICAgIG1lbWNweShiTmFtZSwgb3BlcmF0b3Jfc3RyLCBzdHJsZW4oKGNoYXIqKW9wZXJhdG9yX3N0cikrMSk7Ci0gICAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSxCaW5kKCZDYWxsQ29udHJvbGxlcjo6QmVhcmVySW5mb05hbWUsCi0gICAgICAgICAgICAgIFVucmV0YWluZWQoQ2FsbENvbnRyb2xsZXI6OkdldCgpKSwgYk5hbWUpKTsKLSAgICAgIGZyZWUoYk5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gfQotCi0gdm9pZCBDbGVhbnVwKCkgewotICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDsKLSAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLEJpbmQoJkNhbGxDb250cm9sbGVyOjpDbGVhblVwKSk7Ci0gfQotCi1idF9zdGF0dXNfdCBVcGRhdGVCZWFyZXJUZWNobm9sb2d5KGludCBiZWFyZXJfdGVjaCkgewotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IGJlYXJlcl90ZWNoOwotICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSxCaW5kKCZDYWxsQ29udHJvbGxlcjo6VXBkYXRlQmVhcmVyVGVjaG5vbG9neSwKLSAgICAgICAgICAgICAgICBVbnJldGFpbmVkKENhbGxDb250cm9sbGVyOjpHZXQoKSksIGJlYXJlcl90ZWNoKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgIFVwZGF0ZVN1cHBvcnRlZEJlYXJlckxpc3QodWludDhfdCogc3VwcG9ydGVkYmVhcmVyX2xpc3QpIHsKLQotIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IHN1cHBvcnRlZGJlYXJlcl9saXN0OwotIHVpbnQ4X3QqIHNMaXN0ID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplb2YodWludDhfdCkqc3RybGVuKChjaGFyKilzdXBwb3J0ZWRiZWFyZXJfbGlzdCkrMSk7Ci0gaWYgKHNMaXN0ICE9IE5VTEwpIHsKLSAgIG1lbWNweShzTGlzdCwgc3VwcG9ydGVkYmVhcmVyX2xpc3QsIHN0cmxlbigoY2hhciopc3VwcG9ydGVkYmVhcmVyX2xpc3QpKzEpOwotICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsQmluZCgmQ2FsbENvbnRyb2xsZXI6OlVwZGF0ZVN1cHBvcnRlZEJlYXJlckxpc3QsCi0gICAgICAgIFVucmV0YWluZWQoQ2FsbENvbnRyb2xsZXI6OkdldCgpKSwgc0xpc3QpKTsKLSAgIGZyZWUoc0xpc3QpOwotIH0KLSByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KLWJ0X3N0YXR1c190IFVwZGF0ZVN0YXR1c0ZsYWdzKHVpbnQ4X3Qgc3RhdHVzX2ZsYWcpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgc3RhdHVzX2ZsYWc7Ci0gIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLEJpbmQoJkNhbGxDb250cm9sbGVyOjpVcGRhdGVTdGF0dXNGbGFncywKLSAgICAgICAgICAgIFVucmV0YWluZWQoQ2FsbENvbnRyb2xsZXI6OkdldCgpKSwgc3RhdHVzX2ZsYWcpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBVcGRhdGVTaWduYWxTdGF0dXMoaW50IHNpZ25hbCkgewotCi0gTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgc2lnbmFsOwotIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLEJpbmQoJkNhbGxDb250cm9sbGVyOjpVcGRhdGVCZWFyZXJTaWduYWxTdHJlbmd0aCwKLSAgICAgICAgICAgVW5yZXRhaW5lZChDYWxsQ29udHJvbGxlcjo6R2V0KCkpLCBzaWduYWwpKTsKLSByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KLQotYnRfc3RhdHVzX3QgQ2FsbENvbnRyb2xPcHRpb25hbE9wU3VwcG9ydGVkKGludCBmZWF0dXJlKSB7Ci0KLSBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogIiA8PCBmZWF0dXJlOwotIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLEJpbmQoJkNhbGxDb250cm9sbGVyOjpDYWxsQ29udHJvbE9wdGlvbmFsT3BTdXBwb3J0ZWQsCi0gICAgICAgICAgIFVucmV0YWluZWQoQ2FsbENvbnRyb2xsZXI6OkdldCgpKSwgZmVhdHVyZSkpOwotIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgQ2FsbFN0YXRlKGludCBsZW4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNhbGxfc3RhdGVfbGlzdCkgewotCi0gTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICI7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsQmluZCgmQ2FsbENvbnRyb2xsZXI6OkNhbGxTdGF0ZSwKLSAgICAgICAgICAgVW5yZXRhaW5lZChDYWxsQ29udHJvbGxlcjo6R2V0KCkpLCBsZW4sIHN0ZDo6bW92ZShjYWxsX3N0YXRlX2xpc3QpKSk7Ci0gcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotCi19Ci0KLXZvaWQgVXBkYXRlSW5jb21pbmdDYWxsKGludCBpbmRleCwgdWludDhfdCogVXJpKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8VXJpOwotICB1aW50OF90KiBjYWxsVXJpID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplb2YodWludDhfdCkqc3RybGVuKChjaGFyKilVcmkpKzEpOwotICBpZiAoY2FsbFVyaSAhPSBOVUxMKSB7Ci0gICAgbWVtY3B5KGNhbGxVcmksIFVyaSwgc3RybGVuKChjaGFyKilVcmkpKzEpOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLEJpbmQoJkNhbGxDb250cm9sbGVyOjpVcGRhdGVJbmNvbWluZ0NhbGwsCi0gICAgICAgICAgIFVucmV0YWluZWQoQ2FsbENvbnRyb2xsZXI6OkdldCgpKSwgaW5kZXgsIGNhbGxVcmkpKTsKLSAgICBmcmVlKGNhbGxVcmkpOwotICB9Ci19Ci0KLXZvaWQgSW5jb21pbmdDYWxsVGFyZ2V0VXJpKGludCBpbmRleCwgdWludDhfdCogdGFyZ2V0X3VyaSkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogIiA8PHRhcmdldF91cmk7Ci0gIHVpbnQ4X3QqIGNhbGxVcmkgPSAodWludDhfdCopbWFsbG9jKHNpemVvZih1aW50OF90KSpzdHJsZW4oKGNoYXIqKXRhcmdldF91cmkpKzEpOwotICBpZiAoY2FsbFVyaSAhPSBOVUxMKSB7Ci0gICAgbWVtY3B5KGNhbGxVcmksIHRhcmdldF91cmksIHN0cmxlbigoY2hhciopdGFyZ2V0X3VyaSkrMSk7Ci0KLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSxCaW5kKCZDYWxsQ29udHJvbGxlcjo6VXBkYXRlSW5jb21pbmdDYWxsVGFyZ2V0VXJpLAotICAgICAgICAgICBVbnJldGFpbmVkKENhbGxDb250cm9sbGVyOjpHZXQoKSksIGluZGV4LCBjYWxsVXJpKSk7Ci0gICAgZnJlZShjYWxsVXJpKTsKLSAgfQotfQotCi12b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotCi0gTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDxhZGRyZXNzOwotIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLEJpbmQoJkNhbGxDb250cm9sbGVyOjpEaXNjb25uZWN0LAotICAgICAgICAgICBVbnJldGFpbmVkKENhbGxDb250cm9sbGVyOjpHZXQoKSksIGFkZHJlc3MpKTsKLSByZXR1cm47Ci0KLX0KLQotdm9pZCBDb250ZW50Q29udHJvbElkKHVpbnQzMl90IGNjaWQpIHsKLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgY2NpZDsKLSAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgIEJpbmQoJkNhbGxDb250cm9sbGVyOjpDb250ZW50Q29udHJvbElkLCBVbnJldGFpbmVkKENhbGxDb250cm9sbGVyOjpHZXQoKSksIGNjaWQpKTsKLX0KLQotYnRfc3RhdHVzX3QgQ2FsbENvbnRyb2xSZXNwb25zZSh1aW50OF90IG9wLCB1aW50OF90IGluZGV4LCAgdWludDMyX3Qgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0KLSBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogIjsKLSBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSxCaW5kKCZDYWxsQ29udHJvbGxlcjo6Q2FsbENvbnRyb2xSZXNwb25zZSwKLSAgICAgICBVbnJldGFpbmVkKENhbGxDb250cm9sbGVyOjpHZXQoKSksIG9wLCBpbmRleCwgc3RhdHVzLCBhZGRyZXNzKSk7Ci0gcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIFNldEFjdGl2ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgc2V0X2lkKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNldF9pZCIgPDwgc2V0X2lkPDwgIjogZGV2aWNlIjw8IGFkZHJlc3M7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgQmluZCgmQ2FsbENvbnRyb2xsZXI6OlNldEFjdGl2ZURldmljZSwgVW5yZXRhaW5lZChDYWxsQ29udHJvbGxlcjo6R2V0KCkpLCBhZGRyZXNzLCBzZXRfaWQpKTsKLX0KLQotdm9pZCBDb25uZWN0aW9uU3RhdGVDYWxsYmFjayh1aW50OF90IHN0YXRlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0KLSBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgYWRkcmVzcyA8PCAiIHN0YXRlPSIgPDwgc3RhdGU7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJkNhbGxDb250cm9sbGVyQ2FsbGJhY2tzOjpDb25uZWN0aW9uU3RhdGVDYWxsYmFjaywKLSAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzKSwgc3RhdGUsIGFkZHJlc3MpKTsKLQotfQotCi12b2lkIENhbGxDb250cm9sQ2FsbGJhY2sodWludDhfdCBvcCwgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW5kaWNpZXMsIGludCBjb3VudCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdXJpX2RhdGEsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgYWRkcmVzcyA8PCAiIG9wZXJhdGlvbj0iIDw8IG9wOwotCi0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZDYWxsQ29udHJvbGxlckNhbGxiYWNrczo6Q2FsbENvbnRyb2xDYWxsYmFjaywKLSAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIG9wLCBzdGQ6Om1vdmUoaW5kaWNpZXMpLCBjb3VudCwgc3RkOjptb3ZlKHVyaV9kYXRhKSwgYWRkcmVzcykpOwotfQotCi0gdm9pZCBDYWxsQ29udHJvbEluaXRpYWxpemVkQ2FsbGJhY2sodWludDhfdCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHN0YXRlPSIgPDwgc3RhdGU7Ci0gICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmQ2FsbENvbnRyb2xsZXJDYWxsYmFja3M6OkNhbGxDb250cm9sSW5pdGlhbGl6ZWRDYWxsYmFjaywKLSAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBzdGF0ZSkpOwotIH0KLQotIHByaXZhdGU6Ci0gICBDYWxsQ29udHJvbGxlckNhbGxiYWNrcyogY2FsbGJhY2tzOwotICB9OwotfS8vbmFtZXNwYWNlCi0KLWNvbnN0IENhbGxDb250cm9sbGVySW50ZXJmYWNlKiBidGlmX2NjX3NlcnZlcl9nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgIGlmICghQ2FsbENvbnRyb2xsZXJJbnN0YW5jZSkKLSAgICAgQ2FsbENvbnRyb2xsZXJJbnN0YW5jZS5yZXNldChuZXcgQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2VJbXBsKCkpOwotICAgcmV0dXJuIENhbGxDb250cm9sbGVySW5zdGFuY2UuZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9jc2lwLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfY3NpcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwMGM4ZS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9jc2lwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0aWZfY3NpcC5jCi0gKgotICogIERlc2NyaXB0aW9uOiAgIENTSVAgY2xpZW50IGltcGxlbWVudGF0aW9uIChTZXQgQ29vcmRpbmF0b3IpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX2NzaXAiCi0KLSNpbmNsdWRlIDxiYXNlL2F0X2V4aXQuaD4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJidGFfY3NpcF9hcGkuaCIKLQotI2luY2x1ZGUgImJ0aWZfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3V0aWwuaCIKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2NzaXAuaD4KLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotc3RhdGljIGJ0Y3NpcF9jYWxsYmFja3NfdCogYnRfY3NpcF9jYWxsYmFja3MgPSBOVUxMOwotCi12b2lkIGJ0aWZfbmV3X3NldF9mb3VuZF9jYih0QlRBX0NTSVBfTkVXX1NFVF9GT1VORCBwYXJhbXMpIHsKLSAgSEFMX0NCQUNLKGJ0X2NzaXBfY2FsbGJhY2tzLCBuZXdfc2V0X2ZvdW5kX2NiLCBwYXJhbXMuc2V0X2lkLCBwYXJhbXMuYWRkciwKLSAgICAgICAgICAgIHBhcmFtcy5zaXplLCBwYXJhbXMuc2lyaywgcGFyYW1zLmluY2x1ZGluZ19zcnZjX3V1aWQsCi0gICAgICAgICAgICBwYXJhbXMubG9ja19zdXBwb3J0KTsKLX0KLQotdm9pZCBidGlmX2Nvbm5fc3RhdGVfY2hhbmdlZF9jYih0QlRBX0NTSVBfQ09OTl9TVEFURV9DSEFOR0VEIHBhcmFtcykgewotICBIQUxfQ0JBQ0soYnRfY3NpcF9jYWxsYmFja3MsIGNvbm5fc3RhdGVfY2IsIHBhcmFtcy5hcHBfaWQsIHBhcmFtcy5hZGRyLAotICAgICAgICAgICAgcGFyYW1zLnN0YXRlLCBwYXJhbXMuc3RhdHVzKTsKLX0KLQotdm9pZCBidGlmX25ld19zZXRfbWVtYmVyX2ZvdW5kX2NiKHRCVEFfU0VUX01FTUJFUl9GT1VORCBwYXJhbXMpIHsKLSAgSEFMX0NCQUNLKGJ0X2NzaXBfY2FsbGJhY2tzLCBuZXdfc2V0X21lbWJlcl9jYiwgcGFyYW1zLnNldF9pZCwgcGFyYW1zLmFkZHIpOwotfQotCi12b2lkIGJ0aWZfbG9ja19zdGF0dXNfY2hhbmdlZF9jYih0QlRBX0xPQ0tfU1RBVFVTX0NIQU5HRUQgcGFyYW1zKSB7Ci0gIEhBTF9DQkFDSyhidF9jc2lwX2NhbGxiYWNrcywgbG9ja19zdGF0dXNfY2IsIHBhcmFtcy5hcHBfaWQsIHBhcmFtcy5zZXRfaWQsCi0gICAgICAgICAgICBwYXJhbXMudmFsdWUsIHBhcmFtcy5zdGF0dXMsIHBhcmFtcy5hZGRyKTsKLX0KLQotdm9pZCBidGlmX2xvY2tfYXZhaWxhYmxlX2NiKHRCVEFfTE9DS19BVkFJTEFCTEUgcGFyYW1zKSB7Ci0gIEhBTF9DQkFDSyhidF9jc2lwX2NhbGxiYWNrcywgbG9ja19hdmFpbGFibGVfY2IsIHBhcmFtcy5hcHBfaWQsIHBhcmFtcy5zZXRfaWQsCi0gICAgICAgICAgICBwYXJhbXMuYWRkcik7Ci19Ci0KLXZvaWQgYnRpZl9zZXRfc2l6ZV9jaGFuZ2VkX2NiICh0QlRBX0NTSVBfU0VUX1NJWkVfQ0hBTkdFRCBwYXJhbXMpIHsKLSAgSEFMX0NCQUNLKGJ0X2NzaXBfY2FsbGJhY2tzLCBzaXplX2NoYW5nZWRfY2IsIHBhcmFtcy5zZXRfaWQsIHBhcmFtcy5zaXplLAotICAgICAgICAgICAgcGFyYW1zLmFkZHIpOwotfQotCi12b2lkIGJ0aWZfc2V0X3NpcmtfY2hhbmdlZF9jYiAodEJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQgcGFyYW1zKSB7Ci0gIEhBTF9DQkFDSyhidF9jc2lwX2NhbGxiYWNrcywgc2lya19jaGFuZ2VkX2NiLCBwYXJhbXMuc2V0X2lkLCBwYXJhbXMuc2lyaywKLSAgICAgICAgICAgIHBhcmFtcy5hZGRyKTsKLX0KLQotY29uc3QgY2hhciogYnRpZl9jc2lwX2dldF9ldmVudF9uYW1lKHRCVEFfQ1NJUF9FVlQgZXZlbnQpIHsKLSAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfQ1NJUF9MT0NLX1NUQVRVU19DSEFOR0VEX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0NTSVBfTE9DS19TVEFUVVNfQ0hBTkdFRF9FVlQiOwotICAgIGNhc2UgQlRBX0NTSVBfU0VUX01FTUJFUl9GT1VORF9FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX1NFVF9NRU1CRVJfRk9VTkRfRVZUIjsKLSAgICBjYXNlIEJUQV9DU0lQX0xPQ0tfQVZBSUxBQkxFX0VWVDoKLSAgICAgIHJldHVybiAiQlRBX0NTSVBfTE9DS19BVkFJTEFCTEVfRVZUIjsKLSAgICBjYXNlIEJUQV9DU0lQX05FV19TRVRfRk9VTkRfRVZUOgotICAgICAgcmV0dXJuICJCVEFfQ1NJUF9ORVdfU0VUX0ZPVU5EX0VWVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9DT05OX1NUQVRFX0NIR19FVlQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX0NPTk5fU1RBVEVfQ0hHX0VWVCI7Ci0gICAgY2FzZSBCVEFfQ1NJUF9TRVRfU0laRV9DSEFOR0VEOgotICAgICAgcmV0dXJuICJCVEFfQ1NJUF9TRVRfU0laRV9DSEFOR0VEIjsKLSAgICBjYXNlIEJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQ6Ci0gICAgICByZXR1cm4gIkJUQV9DU0lQX1NFVF9TSVJLX0NIQU5HRUQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV05fRVZFTlQiOwotICB9Ci19Ci0KLXZvaWQgYnRpZl9jc2lwX2V2dCAodEJUQV9DU0lQX0VWVCBldmVudCwgdEJUQV9DU0lQX0RBVEEqIHBfZGF0YSkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogRXZlbnQgPSAlMDJ4ICglcykiLCBfX2Z1bmNfXywgZXZlbnQsIGJ0aWZfY3NpcF9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEJUQV9DU0lQX0xPQ0tfU1RBVFVTX0NIQU5HRURfRVZUOiB7Ci0gICAgICAgIHRCVEFfTE9DS19TVEFUVVNfQ0hBTkdFRCBsb2NrX3N0YXR1c19wYXJhbXMgPSBwX2RhdGEtPmxvY2tfc3RhdHVzX3BhcmFtOwotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKEJpbmQoYnRpZl9sb2NrX3N0YXR1c19jaGFuZ2VkX2NiLCBsb2NrX3N0YXR1c19wYXJhbXMpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQ1NJUF9MT0NLX0FWQUlMQUJMRV9FVlQ6IHsKLSAgICAgICAgdEJUQV9MT0NLX0FWQUlMQUJMRSBsb2NrX2F2bF9wYXJhbSA9IHBfZGF0YS0+bG9ja19hdmFpbGFibGVfcGFyYW07Ci0gICAgICAgIGRvX2luX2puaV90aHJlYWQoQmluZChidGlmX2xvY2tfYXZhaWxhYmxlX2NiLCBsb2NrX2F2bF9wYXJhbSkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9DU0lQX05FV19TRVRfRk9VTkRfRVZUOiB7Ci0gICAgICAgIHRCVEFfQ1NJUF9ORVdfU0VUX0ZPVU5EIG5ld19zZXRfcGFyYW1zID0gcF9kYXRhLT5uZXdfc2V0X3BhcmFtczsKLSAgICAgICAgbWVtY3B5KG5ld19zZXRfcGFyYW1zLnNpcmssIHBfZGF0YS0+bmV3X3NldF9wYXJhbXMuc2lyaywgU0lSS19TSVpFKTsKLSAgICAgICAgZG9faW5fam5pX3RocmVhZChCaW5kKGJ0aWZfbmV3X3NldF9mb3VuZF9jYiwgbmV3X3NldF9wYXJhbXMpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfQ1NJUF9TRVRfTUVNQkVSX0ZPVU5EX0VWVDogewotICAgICAgICB0QlRBX1NFVF9NRU1CRVJfRk9VTkQgbmV3X21lbWJlcl9wYXJhbXMgPSBwX2RhdGEtPnNldF9tZW1iZXJfcGFyYW07Ci0gICAgICAgIGRvX2luX2puaV90aHJlYWQoQmluZChidGlmX25ld19zZXRfbWVtYmVyX2ZvdW5kX2NiLCBuZXdfbWVtYmVyX3BhcmFtcykpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9DU0lQX0NPTk5fU1RBVEVfQ0hHX0VWVDogewotICAgICAgICB0QlRBX0NTSVBfQ09OTl9TVEFURV9DSEFOR0VEIGNvbm5fcGFyYW1zID0gcF9kYXRhLT5jb25uX3BhcmFtczsKLSAgICAgICAgZG9faW5fam5pX3RocmVhZChCaW5kKGJ0aWZfY29ubl9zdGF0ZV9jaGFuZ2VkX2NiLCBjb25uX3BhcmFtcykpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgQlRBX0NTSVBfU0VUX1NJWkVfQ0hBTkdFRDogewotICAgICAgICB0QlRBX0NTSVBfU0VUX1NJWkVfQ0hBTkdFRCBzaXplX2NoZ19wYXJhbSA9IHBfZGF0YS0+c2l6ZV9jaGdfcGFyYW1zOwotICAgICAgICBkb19pbl9qbmlfdGhyZWFkKEJpbmQoYnRpZl9zZXRfc2l6ZV9jaGFuZ2VkX2NiLCBzaXplX2NoZ19wYXJhbSkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgQlRBX0NTSVBfU0VUX1NJUktfQ0hBTkdFRDogewotICAgICAgICAgIHRCVEFfQ1NJUF9TRVRfU0lSS19DSEFOR0VEIHNpcmtfY2hnX3BhcmFtID0gcF9kYXRhLT5zaXJrX2NoZ19wYXJhbXM7Ci0gICAgICAgICAgZG9faW5fam5pX3RocmVhZChCaW5kKGJ0aWZfc2V0X3NpcmtfY2hhbmdlZF9jYiwgc2lya19jaGdfcGFyYW0pKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBVbmtub3duIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgfQotfQotCi0vKiBJbml0aWFsaXphdGlvbiBvZiBDU0lQIG1vZHVsZSBvbiBCVCBPTiovCi1idF9zdGF0dXNfdCBidGlmX2NzaXBfaW5pdCggYnRjc2lwX2NhbGxiYWNrc190KiBjYWxsYmFja3MgKSB7Ci0gIGJ0X2NzaXBfY2FsbGJhY2tzID0gY2FsbGJhY2tzOwotCi0gIGRvX2luX2puaV90aHJlYWQoQmluZChCVEFfQ3NpcEVuYWJsZSwgYnRpZl9jc2lwX2V2dCkpOwotICBidGlmX3JlZ2lzdGVyX3V1aWRfc3J2Y19kaXNjKFV1aWQ6OkZyb21TdHJpbmcoIjE4NDYiKSk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKiBDb25uZWN0IGNhbGwgZnJvbSB1cHBlciBsYXllciBmb3IgR0FUVCBDb25uZWN0dGlvbiB0byBhIGdpdmVuIFNldCBNZW1iZXIgKi8KLWJ0X3N0YXR1c190IGJ0aWZfY3NpcF9jb25uZWN0ICh1aW50OF90IGFwcF9pZCwgUmF3QWRkcmVzcyAqYmRfYWRkcikgewotICBCVElGX1RSQUNFX0VWRU5UKCIlczogQWRkcmVzczogJXMiLCBfX2Z1bmNfXywgYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBkb19pbl9qbmlfdGhyZWFkKEJpbmQoQlRBX0NzaXBDb25uZWN0LCBhcHBfaWQsICpiZF9hZGRyKSk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKiBDYWxsIGZyb20gdXBwZXIgbGF5ZXIgdG8gZGlzY29ubmVjdCBHQVRUIENvbm5lY3Rpb24gZm9yIGdpdmVuIFNldCBNZW1iZXIgKi8KLWJ0X3N0YXR1c190IGJ0aWZfY3NpcF9kaXNjb25uZWN0ICh1aW50OF90IGFwcF9pZCwgUmF3QWRkcmVzcyAqYmRfYWRkciApIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgZG9faW5fam5pX3RocmVhZChCaW5kKEJUQV9Dc2lwRGlzY29ubmVjdCwgYXBwX2lkLCAqYmRfYWRkcikpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoqIHJlZ2lzdGVyIGFwcC9tb2R1bGUgd2l0aCBDU0lQIHByb2ZpbGUgKi8KLWJ0X3N0YXR1c190IGJ0aWZfY3NpcF9hcHBfcmVnaXN0ZXIgKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoQmluZCgKLSAgICBbXShjb25zdCBVdWlkJiB1dWlkKSB7Ci0gICAgICBCVEFfUmVnaXN0ZXJDc2lwQXBwKAotICAgICAgICAgIGJ0aWZfY3NpcF9ldnQsCi0gICAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgW10oY29uc3QgVXVpZCYgdXVpZCwgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gICAgICAgICAgICAgICAgZG9faW5fam5pX3RocmVhZChCaW5kKAotICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBVdWlkJiB1dWlkLCB1aW50OF90IHN0YXR1cywgdWludDhfdCBhcHBfaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfY3NpcF9jYWxsYmFja3MsIGFwcF9yZWdpc3RlcmVkX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFwcF9pZCwgdXVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIHV1aWQsIHN0YXR1cywgYXBwX2lkKSk7Ci0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgIHV1aWQpKTsKLSAgICB9LCB1dWlkKSk7Ci19Ci0KLS8qKiB1bnJlZ2lzdGVyIGNzaXAgQXBwL01vZHVsZSAqLwotYnRfc3RhdHVzX3QgYnRpZl9jc2lwX2FwcF91bnJlZ2lzdGVyICh1aW50OF90IGFwcF9pZCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoQmluZChCVEFfVW5yZWdpc3RlckNzaXBBcHAsIGFwcF9pZCkpOwotfQotCi0vKiogY2hhbmdlIGxvY2sgdmFsdWUgKi8KLWJ0X3N0YXR1c190IGJ0aWZfY3NpcF9zZXRfbG9ja192YWx1ZSAodWludDhfdCBhcHBfaWQsIHVpbnQ4X3Qgc2V0X2lkLCB1aW50OF90IGxvY2tfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBkZXZpY2VzKSB7Ci0gIEJUSUZfVFJBQ0VfRVZFTlQoIiVzIGFwcElkID0gJWQgc2V0SWQgPSAlZCBMb2NrIFZhbHVlID0gJTAyeCAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgYXBwX2lkLCBzZXRfaWQsIGxvY2tfdmFsdWUpOwotICB0QlRBX1NFVF9MT0NLX1BBUkFNUyBsb2NrX3BhcmFtcyA9IHthcHBfaWQsIHNldF9pZCwgbG9ja192YWx1ZSwgZGV2aWNlc307Ci0gIGRvX2luX2puaV90aHJlYWQoQmluZChCVEFfQ3NpcFNldExvY2tWYWx1ZSwgbG9ja19wYXJhbXMpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkICBidGlmX2NzaXBfY2xlYW51cCgpIHsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIGRvX2luX2puaV90aHJlYWQoQmluZChCVEFfQ3NpcERpc2FibGUpKTsKLX0KLQotY29uc3QgYnRjc2lwX2ludGVyZmFjZV90IGJ0Y3NpcEludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYnRjc2lwSW50ZXJmYWNlKSwKLSAgICBidGlmX2NzaXBfaW5pdCwKLSAgICBidGlmX2NzaXBfY29ubmVjdCwKLSAgICBidGlmX2NzaXBfZGlzY29ubmVjdCwKLSAgICBidGlmX2NzaXBfYXBwX3JlZ2lzdGVyLAotICAgIGJ0aWZfY3NpcF9hcHBfdW5yZWdpc3RlciwKLSAgICBidGlmX2NzaXBfc2V0X2xvY2tfdmFsdWUsCi0gICAgYnRpZl9jc2lwX2NsZWFudXAsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9jc2lwX2dldF9pbnRlcmZhY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgY3NpcCBjYWxsYmFjayBpbnRlcmZhY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJ0Y3NpcF9pbnRlcmZhY2VfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBidGNzaXBfaW50ZXJmYWNlX3QqIGJ0aWZfY3NpcF9nZXRfaW50ZXJmYWNlKCkgewotICBCVElGX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuICZidGNzaXBJbnRlcmZhY2U7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9kbV9hZHZfYXVkaW8uY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9kbV9hZHZfYXVkaW8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YzMyZjAuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfZG1fYWR2X2F1ZGlvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZl9kbSIKLQotI2luY2x1ZGUgImJ0aWZfZG0uaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3V1aWQuaD4KLSNpbmNsdWRlICJoYXJkd2FyZS92ZW5kb3IuaCIKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hlYXJpbmdfYWlkLmg+Ci0KLSNpbmNsdWRlICJhZHZlcnRpc2VfZGF0YV9wYXJzZXIuaCIKLSNpbmNsdWRlICJidF9jb21tb24uaCIKLSNpbmNsdWRlICJidGFfY2xvc3VyZV9hcGkuaCIKLSNpbmNsdWRlICJidGFfY3NpcF9hcGkuaCIKLSNpbmNsdWRlICJidGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfYnFyLmgiCi0jaW5jbHVkZSAiYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmX2RtLmgiCi0jaW5jbHVkZSAiYnRpZl9oaC5oIgotI2luY2x1ZGUgImJ0aWZfc2RwLmgiCi0jaW5jbHVkZSAiYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiYnRpZl91dGlsLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2RtX2FwaS5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWxfaW5jbHVkZS9zdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9tZXRyaWNzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50LmgiCi0jaW5jbHVkZSAic3RhY2tfY29uZmlnLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2luY2x1ZGUgImJ0aWZfdHdzX3BsdXMuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9kZXZpY2VfaW90X2NvbmZpZy5oIgotI2luY2x1ZGUgImJ0aWZfYmFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImJ0YV9kbV9hZHZfYXVkaW8uaCIKLSNpbmNsdWRlICJidGlmX2RtX2Fkdl9hdWRpby5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQlRJRl9ETV9HRVRfUkVNT1RFX1BST1AoYix0LHYsbCxwKSBcCi0gICAgICB7cC50eXBlPXQ7cC52YWw9djtwLmxlbj1sO2J0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShiLCZwKTt9Ci0KLWV4dGVybiBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OlV1aWQ+IHV1aWRfc3J2X2Rpc2Nfc2VhcmNoOwotc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIHVpbnQzMl90PiBhZHZfYXVkaW9fZGV2aWNlX2RiOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2Fkdl9hdWRpb19nYXR0X2Nvbm4oUmF3QWRkcmVzcyBwX2JkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX2Fkdl9hdWRpb19jbG9zZShSYXdBZGRyZXNzIHBfYmRfYWRkcik7Ci1leHRlcm4gYm9vbCBidGlmX2hhc19ibGVfa2V5cyhjb25zdCBjaGFyKiBiZHN0cik7Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoCi0gICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk7Ci1leHRlcm4gdEJUQV9MRUFfUEFJUklOR19EQiBidGFfbGVhX3BhaXJpbmdfY2I7Ci1leHRlcm4gdm9pZCBzZWFyY2hfc2VydmljZXNfY29weV9jYih1aW50MTZfdCBldmVudCwgY2hhciogcF9kZXN0LCBjaGFyKiBwX3NyYyk7Ci0KLWV4dGVybiB2b2lkIGJvbmRfc3RhdGVfY2hhbmdlZChidF9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlKTsKLQotI2RlZmluZSBCVElGX1NUT1JBR0VfR0VUX1JFTU9URV9QUk9QKGIsIHQsIHYsIGwsIHApICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS50eXBlID0gKHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLnZhbCA9ICh2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCkubGVuID0gKGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgoYiksICYocCkpOyBcCi0gICAgICAgIH0gd2hpbGUgKDApCi0KLWV4dGVybiBib29sIGNoZWNrX2Fkdl9hdWRpb19jb2QodWludDMyX3QgY29kKTsKLWV4dGVybiBib29sIGlzX3JlbW90ZV9zdXBwb3J0X2Fkdl9hdWRpbyhjb25zdCBSYXdBZGRyZXNzIHJlbW90ZV9iZGFkZHIpOwotZXh0ZXJuIGJvb2wgaXNfbGVfYXVkaW9fc2VydmljZShVdWlkIHV1aWQpOwotZXh0ZXJuIHZvaWQgYnRhX2Fkdl9hdWRpb191cGRhdGVfYm9uZF9kYihSYXdBZGRyZXNzIHBfYmRfYWRkciwgdWludDhfdCB0cmFuc3BvcnQpOwotCi0jZGVmaW5lIEJUSUZfRE1fTUFYX1NEUF9BVFRFTVBUU19BRlRFUl9QQUlSSU5HIDIKLQotCi10QlRBX1RSQU5TUE9SVCBidGlmX2RtX2dldF9hZHZfYXVkaW9fdHJhbnNwb3J0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUTV9JTlFfSU5GTyogcF9pbnFfaW5mbzsKLQotICBwX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChiZF9hZGRyKTsKLSAgaWYgKHBfaW5xX2luZm8gIT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzLCBpbnFfcmVzdWx0X3R5cGUgJXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9pbnFfaW5mby0+cmVzdWx0cy5pbnFfcmVzdWx0X3R5cGUpOwotICAgIGlmIChwX2lucV9pbmZvLT5yZXN1bHRzLmlucV9yZXN1bHRfdHlwZSAmIEJUTV9JTlFfUkVTVUxUX0JMRSkgewotICAgICAgcmV0dXJuIEJUX1RSQU5TUE9SVF9MRTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidGlmX3NldF9yZW1vdGVfZGV2aWNlX3V1aWRfcHJvcGVydHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0b3JlIHRoZSByZW1vdGUgTEVBIHNlcnZpY2VzIGluIGNvbmZpZyBmaWxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0aWZfc2V0X3JlbW90ZV9kZXZpY2VfdXVpZF9wcm9wZXJ0eShSYXdBZGRyZXNzIHBfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3V1aWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6VXVpZCAqbmV3X3V1aWRzKSB7Ci0KLSAgVXVpZCByZW1vdGVfdXVpZHNbQlRfTUFYX05VTV9VVUlEU107Ci0gIGJ0X3Byb3BlcnR5X3QgcHJvcDsKLQotICBmb3IgKGludCBqID0gMDsgaiA8IG51bV91dWlkczsgaisrKSB7Ci0gICAgcmVtb3RlX3V1aWRzW2pdID0gbmV3X3V1aWRzW2pdOwotICAgIEJUSUZfVFJBQ0VfRVZFTlQoIiVzOiBVVUlEICVzIGluZGV4ICVkICIsIF9fZnVuY19fLAotICAgICAgcmVtb3RlX3V1aWRzW2pdLlRvU3RyaW5nKCkuY19zdHIoKSwgaik7Ci0gIH0KLSAgcHJvcC50eXBlID0gKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9BRFZfQVVESU9fVVVJRFM7Ci0gIHByb3AudmFsID0gJnJlbW90ZV91dWlkc1swXTsKLSAgcHJvcC5sZW4gPSAobnVtX3V1aWRzKSAqIChVdWlkOjprTnVtQnl0ZXMxMjgpOwotICBVdWlkKiB0bXAgPSAoVXVpZCopKHByb3AudmFsKTsKLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6IENoZWNraW5nIGl0ICVzIiwgX19mdW5jX18sIHRtcC0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgaW50IHJldCA9IGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmcF9hZGRyLCAmcHJvcCk7Ci0gIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLCAic3RvcmluZyByZW1vdGUgc2VydmljZXMgZmFpbGVkIiwKLSAgICAgICAgICByZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9kbV9sZWFfc2VhcmNoX3NlcnZpY2VzX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXhlY3V0ZXMgc2VhcmNoIHNlcnZpY2VzIGV2ZW50IGluIGJ0aWYgY29udGV4dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfZG1fbGVhX3NlYXJjaF9zZXJ2aWNlc19ldnQodWludDE2X3QgZXZlbnQsIGNoYXIqIHBfcGFyYW0pIHsKLSAgdEJUQV9ETV9TRUFSQ0gqIHBfZGF0YSA9ICh0QlRBX0RNX1NFQVJDSCopcF9wYXJhbTsKLQotICBidF9ib25kX3N0YXRlX3QgcGFpcmluZ19zdGF0ZSA9IEJUX0JPTkRfU1RBVEVfTk9ORTsKLSAgdWludDhfdCBzZHBfYXR0ZW1wdHMgPSAwOwotICBSYXdBZGRyZXNzIHBhaXJpbmdfYmRfYWRkcjsKLSAgUmF3QWRkcmVzcyBzdGF0aWNfYmRfYWRkcjsKLSAgYnRpZl9nZXRfcGFpcmluZ19jYl9pbmZvKCZwYWlyaW5nX3N0YXRlLCAmc2RwX2F0dGVtcHRzLAotICAgICZwYWlyaW5nX2JkX2FkZHIsICZzdGF0aWNfYmRfYWRkcik7Ci0KLSAgQlRJRl9UUkFDRV9FVkVOVCgiJXM6ICBldmVudCA9ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQlRBX0RNX0RJU0NfUkVTX0VWVDogewotICAgICAgdWludDMyX3QgaSA9IDAsIGogPSAwOwotICAgICAgYnRfcHJvcGVydHlfdCBwcm9wWzJdOwotICAgICAgaW50IG51bV9wcm9wZXJ0aWVzID0gMDsKLSAgICAgIGJ0X3N0YXR1c190IHJldDsKLSAgICAgIFV1aWQgcmVtb3RlX3V1aWRzW0JUX01BWF9OVU1fVVVJRFNdOwotICAgICAgVXVpZCBtaXNzZWRfcmVtb3RlX3V1aWRzW0JUX01BWF9OVU1fVVVJRFNdOwotICAgICAgdWludDhfdCBtaXNzaW5nX3V1aWRzX2xlbiA9IDA7Ci0gICAgICBidF9wcm9wZXJ0eV90IHJlbW90ZV91dWlkX3Byb3A7Ci0KLSAgICAgIFJhd0FkZHJlc3MmIGJkX2FkZHIgPSBwX2RhdGEtPmRpc2NfcmVzLmJkX2FkZHI7Ci0KLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOihyZXN1bHQ9MHgleCwgc2VydmljZXMgMHgleCkiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5kaXNjX3Jlcy5yZXN1bHQsIHBfZGF0YS0+ZGlzY19yZXMuc2VydmljZXMpOwotCi0gICAgICAvKiByZXRyeSBzZHAgc2VydmljZSBzZWFyY2gsIGlmIHNkcCBmYWlscyBmb3IgcGFpcmluZyBiZCBhZGRyZXNzLAotICAgICAgKiogcmVwb3J0IHNkcCByZXN1bHRzIHRvIEFQUCBpbW1lZGlhdGVseSBmb3Igbm9uIHBhaXJpbmcgYWRkcmVzc2VzCi0gICAgICAqLwotICAgICAgaWYgKChwX2RhdGEtPmRpc2NfcmVzLnJlc3VsdCAhPSBCVEFfU1VDQ0VTUykgJiYKLSAgICAgICAgICAocGFpcmluZ19zdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCkgJiYKLSAgICAgICAgICAoKHBfZGF0YS0+ZGlzY19yZXMuYmRfYWRkciA9PSBwYWlyaW5nX2JkX2FkZHIpIHx8Ci0gICAgICAgICAgKHBfZGF0YS0+ZGlzY19yZXMuYmRfYWRkciA9PSBzdGF0aWNfYmRfYWRkcikpICYmCi0gICAgICAgICAgKHNkcF9hdHRlbXB0cyA+IDApKSB7Ci0gICAgICAgIGlmIChzZHBfYXR0ZW1wdHMgPCBCVElGX0RNX01BWF9TRFBfQVRURU1QVFNfQUZURVJfUEFJUklORykgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6U0RQIGZhaWxlZCBhZnRlciBib25kaW5nIHJlLWF0dGVtcHRpbmciLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYnRpZl9pbmNfc2RwX2F0dGVtcHRzKCk7Ci0gICAgICAgICAgYnRpZl9kbV9nZXRfcmVtb3RlX3NlcnZpY2VzX2J5X3RyYW5zcG9ydCgmYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICIlczogU0RQIHJlYWNoZWQgdG8gbWF4aW11bSBhdHRlbXB0cywgc2VuZGluZyBib25kIGZhaWwgdG8gdXBwZXIgbGF5ZXJzIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgICBidGlmX3Jlc2V0X3NkcF9hdHRlbXB0cygpOwotICAgICAgICAgIGlmIChidGFfcmVtb3RlX2RldmljZV9pc19kdW1vKGJkX2FkZHIpKSB7Ci0gICAgICAgICAgICBhdXRvIGl0ciA9IGJ0YV9sZWFfcGFpcmluZ19jYi5kZXZfYWRkcl9tYXAuZmluZChiZF9hZGRyKTsKLSAgICAgICAgICAgIGlmIChpdHIgIT0gYnRhX2xlYV9wYWlyaW5nX2NiLmRldl9hZGRyX21hcC5lbmQoKSkgewotICAgICAgICAgICAgICBpZiAoKGl0ci0+Zmlyc3QgIT0gaXRyLT5zZWNvbmQpKSB7Ci0gICAgICAgICAgICAgICAgYnRhX2xlYV9wYWlyaW5nX2NiLmlzX3NkcF9kaXNjb3ZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvbmRfc3RhdGVfY2hhbmdlZChCVF9TVEFUVVNfRkFJTCwKLSAgICAgICAgICAgICAgICAgIGJkX2FkZHIsIEJUX0JPTkRfU1RBVEVfTk9ORSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnRpZl9yZXNldF9wYWlyaW5nX2NiKCk7Ci0gICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HKCIlczogU2tpcHBpbmcgQk9ORF9OT05FIGZvciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SKCIlczogU0RQIHNob3VsZG50IG9uIHJhbmRvbSBhZGRyZXNzLiBXcm9uZyBwYXRoICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgIGJ0aWZfcmVzZXRfcGFpcmluZ19jYigpOwotICAgICAgICAgICAgICBib25kX3N0YXRlX2NoYW5nZWQoQlRfU1RBVFVTX0ZBSUwsCi0gICAgICAgICAgICAgICAgICBiZF9hZGRyLCBCVF9CT05EX1NUQVRFX05PTkUpOwotICAgICAgICAgICAgICBidGlmX3N0b3JhZ2VfcmVtb3ZlX2JvbmRlZF9kZXZpY2UoJmJkX2FkZHIpOwotICAgICAgICAgICAgICBCVEFfRG1SZW1vdmVEZXZpY2UoYmRfYWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfRVJST1IoIiVzOiBTRFAgc2hvdWxkbnQgY2FsbGVkLiBXcm9uZyBwYXRoICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHJvcFswXS50eXBlID0gQlRfUFJPUEVSVFlfVVVJRFM7Ci0gICAgICBwcm9wWzBdLmxlbiA9IDA7Ci0gICAgICBpZiAoKHBfZGF0YS0+ZGlzY19yZXMucmVzdWx0ID09IEJUQV9TVUNDRVNTKSAmJgotICAgICAgICAgIChwX2RhdGEtPmRpc2NfcmVzLm51bV91dWlkcyA+IDApKSB7Ci0gICAgICAgIHByb3BbMF0udmFsID0gcF9kYXRhLT5kaXNjX3Jlcy5wX3V1aWRfbGlzdDsKLSAgICAgICAgcHJvcFswXS5sZW4gPSBwX2RhdGEtPmRpc2NfcmVzLm51bV91dWlkcyAqIFV1aWQ6OmtOdW1CeXRlczEyODsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLT5kaXNjX3Jlcy5udW1fdXVpZHM7IGkrKykgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlbXAgPSAoKHBfZGF0YS0+ZGlzY19yZXMucF91dWlkX2xpc3QgKyBpKSktPlRvU3RyaW5nKCk7Ci0gICAgICAgICAgTE9HX0lORk8oTE9HX1RBRywgIiVzIGluZGV4OiVkIHV1aWQ6JXMiLCBfX2Z1bmNfXywgaSwgdGVtcC5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBvblV1aWRDaGFuZ2VkIHJlcXVpcmVzIGdldEJvbmRlZERldmljZXMgdG8gYmUgcG9wdWxhdGVkLgotICAgICAgKiogYm9uZF9zdGF0ZV9jaGFuZ2VkIG5lZWRzIHRvIGJlIHNlbnQgcHJpb3IgdG8gcmVtb3RlX2RldmljZV9wcm9wZXJ0eQotICAgICAgKi8KLSAgICAgIGlmICgocGFpcmluZ19zdGF0ZSA9PSBCVF9CT05EX1NUQVRFX0JPTkRFRCAmJiBzZHBfYXR0ZW1wdHMpICYmCi0gICAgICAgICAgKHBfZGF0YS0+ZGlzY19yZXMuYmRfYWRkciA9PSBwYWlyaW5nX2JkX2FkZHIgfHwKLSAgICAgICAgICAgcF9kYXRhLT5kaXNjX3Jlcy5iZF9hZGRyID09IHN0YXRpY19iZF9hZGRyKSkgewotICAgICAgICBMT0dfSU5GTyhMT0dfVEFHLCAiJXM6IFNEUCBzZWFyY2ggZG9uZSBmb3IgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBidGlmX3Jlc2V0X3NkcF9hdHRlbXB0cygpOwotICAgICAgICBCVEFfRG1SZXNldFBhaXJpbmdmbGFnKGJkX2FkZHIpOwotICAgICAgICBidGlmX3Jlc2V0X3BhaXJpbmdfY2IoKTsKLQotICAgICAgICAvLyBTZW5kIG9uZSBlbXB0eSBVVUlEIHRvIEphdmEgdG8gdW5ibG9jayBwYWlyaW5nIGludGVudCB3aGVuIFNEUCBmYWlsZWQKLSAgICAgICAgLy8gb3Igbm8gVVVJRCBpcyBkaXNjb3ZlcmVkCi0gICAgICAgIGlmIChwX2RhdGEtPmRpc2NfcmVzLnJlc3VsdCAhPSBCVEFfU1VDQ0VTUyB8fAotICAgICAgICAgICAgcF9kYXRhLT5kaXNjX3Jlcy5udW1fdXVpZHMgPT0gMCkgewotICAgICAgICAgIExPR19JTkZPKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgIiVzOiBTRFAgZmFpbGVkLCBzZW5kIGVtcHR5IFVVSUQgdG8gdW5ibG9jayBib25kaW5nICVzIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgIGJ0X3Byb3BlcnR5X3QgcHJvcDsKLQotICAgICAgICAgIFV1aWQgdXVpZCA9IHt9OwotICAgICAgICAgIC8vVXBkYXRpbmcgaW4gbGVhX3BhaXJpbmdfZGF0YWJhc2UKLSAgICAgICAgICBpZiAoYnRhX3JlbW90ZV9kZXZpY2VfaXNfZHVtbyhiZF9hZGRyKSkgewotICAgICAgICAgICAgdEJUQV9ERVZfUEFJUklOR19DQiAqcF9sZWFfcGFpcl9jYiA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHBfbGVhX3BhaXJfY2IgPSBidGFfZ2V0X2xlYV9wYWlyX2NiKGJkX2FkZHIpOwotICAgICAgICAgICAgaWYgKHBfbGVhX3BhaXJfY2IpIHsKLSAgICAgICAgICAgICAgcF9sZWFfcGFpcl9jYi0+c2RwX2Rpc2Nfc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGJ0aWZfZG1fZ2V0X2Fkdl9hdWRpb190cmFuc3BvcnQoYmRfYWRkcikgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wLnR5cGUgPSBCVF9QUk9QRVJUWV9VVUlEUzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcC50eXBlID0gKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9BRFZfQVVESU9fVVVJRFM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByb3AudmFsID0gJnV1aWQ7Ci0gICAgICAgICAgcHJvcC5sZW4gPSBVdWlkOjprTnVtQnl0ZXMxMjg7Ci0KLSAgICAgICAgICAvKiBTZW5kIHRoZSBldmVudCB0byB0aGUgQlRJRiAqLwotICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsCi0gICAgICAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTLCAmYmRfYWRkciwgMSwgJnByb3ApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHVwZGF0ZXMgZXh0cmEgdXVpZHMgd2hpY2ggYXJlIGRpc2NvdmVyZWQgZHVyaW5nCi0gICAgICAvLyBuZXcgc2RwIHNlYXJjaCB0byBleGlzdGluZyB1dWlkIGxpc3QgcHJlc2VudCBpbiBjb25mIGZpbGUuCi0gICAgICAvLyBJZiBjb25mIGZpbGUgaGFzIG1vcmUgVVVJRHMgdGhhbiB0aGUgc2RwIHNlYXJjaCwgaXQgd2lsbAotICAgICAgLy8gdXBkYXRlIHRoZSBjb25mIGZpbGUgVVVJRHMgYXMgdGhlIGZpbmFsIFVVSURzCi0gICAgICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmcmVtb3RlX3V1aWRfcHJvcCwgQlRfUFJPUEVSVFlfVVVJRFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX3V1aWRzKSwgcmVtb3RlX3V1aWRzKTsKLSAgICAgIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVtb3RlX3V1aWRfcHJvcCk7Ci0gICAgICBpZihyZW1vdGVfdXVpZF9wcm9wLmxlbiAmJiBwX2RhdGEtPmRpc2NfcmVzLnJlc3VsdCA9PSBCVEFfU1VDQ0VTUykgewotICAgICAgICAvLyBjb21wYXJlIG5vdwotICAgICAgICBib29sIHV1aWRfZm91bmQgPSBmYWxzZTsKLSAgICAgICAgdWludDhfdCB1dWlkX2xlbiA9IHJlbW90ZV91dWlkX3Byb3AubGVuIC8gc2l6ZW9mKFV1aWQpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLT5kaXNjX3Jlcy5udW1fdXVpZHM7IGkrKykgewotICAgICAgICAgIHV1aWRfZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICBVdWlkKiBkaXNjX3V1aWQgPSAgcmVpbnRlcnByZXRfY2FzdDxVdWlkKj4gKHBfZGF0YS0+ZGlzY19yZXMucF91dWlkX2xpc3QgKyBpKTsKLSAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdXVpZF9sZW47IGorKykgewotICAgICAgICAgICAgVXVpZCogYmFzZV91dWlkID0gIHJlaW50ZXJwcmV0X2Nhc3Q8VXVpZCo+IChyZW1vdGVfdXVpZF9wcm9wLnZhbCkgKyBqOwotICAgICAgICAgICAgaWYoKmRpc2NfdXVpZCA9PSAqYmFzZV91dWlkKSB7Ci0gICAgICAgICAgICAgIHV1aWRfZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYoIXV1aWRfZm91bmQpIHsKLSAgICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6bmV3IHV1aWQgZm91bmQgIiwgX19mdW5jX18pOwotICAgICAgICAgICAgbWVtY3B5KCZtaXNzZWRfcmVtb3RlX3V1aWRzW21pc3NpbmdfdXVpZHNfbGVuKytdLCBkaXNjX3V1aWQsIHNpemVvZihVdWlkKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBtaXNzaW5nIHV1aWRzIG5vdwotICAgICAgICBpZihtaXNzaW5nX3V1aWRzX2xlbikgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXMgOm1pc3NpbmdfdXVpZHNfbGVuID0gJWQgIiwgX19mdW5jX18sIG1pc3NpbmdfdXVpZHNfbGVuKTsKLSAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWlzc2luZ191dWlkc19sZW4gJiYKLSAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylyZW1vdGVfdXVpZF9wcm9wLmxlbiA8IEJUX01BWF9OVU1fVVVJRFMgKiBzaXplb2YoVXVpZCk7IGorKykgewotICAgICAgICAgICAgbWVtY3B5KCZyZW1vdGVfdXVpZHNbdXVpZF9sZW4gKyBqXSwgJm1pc3NlZF9yZW1vdGVfdXVpZHNbal0sIHNpemVvZihVdWlkKSk7Ci0gICAgICAgICAgICByZW1vdGVfdXVpZF9wcm9wLmxlbiArPSBzaXplb2YoVXVpZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcFswXS50eXBlID0gQlRfUFJPUEVSVFlfVVVJRFM7Ci0gICAgICAgIHByb3BbMF0udmFsID0gcmVtb3RlX3V1aWRzOwotICAgICAgICBwcm9wWzBdLmxlbiA9IHJlbW90ZV91dWlkX3Byb3AubGVuOwotICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkX2FkZHIsICZwcm9wWzBdKTsKLSAgICAgICAgQVNTRVJUQyhyZXQgPT0gQlRfU1RBVFVTX1NVQ0NFU1MsICJzdG9yaW5nIHJlbW90ZSBzZXJ2aWNlcyBmYWlsZWQiLAotICAgICAgICAgICAgICAgIHJldCk7Ci0gICAgICAgIC8vU2VuZCB0aGUgVVVJRCB2YWx1ZXMgdG8gdXBwZXIgbGF5ZXIgYXMgQlRfUFJPUEVSVFlfQURWX0FVRElPX1VVSURTCi0gICAgICAgIG51bV9wcm9wZXJ0aWVzKys7Ci0KLSAgICAgICAgaWYgKGJ0YV9pc19icmVkcl9wcmltYXJ5X3RyYW5zcG9ydChiZF9hZGRyKSkgewotICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORygiJXM6IEluaXRpYXRpbmcgTEUgY29ubmVjdGlvbiAiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYWR2X2F1ZGlvX2RldmljZV9kYltiZF9hZGRyXSA9IE1BSk9SX0xFX0FVRElPX1ZFTkRPUl9DT0Q7Ci0gICAgICAgICAgYnRhX2xlX2F1ZGlvX2Rldl9jYi5ib25kX3Byb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgICBidGFfZG1fYWR2X2F1ZGlvX2dhdHRfY29ubihiZF9hZGRyKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwX2RhdGEtPmRpc2NfcmVzLm51bV91dWlkcyAhPSAwKSB7Ci0gICAgICAgIC8qIEFsc28gd3JpdGUgdGhpcyB0byB0aGUgTlZSQU0gKi8KLSAgICAgICAgcmV0ID0gYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZiZF9hZGRyLCAmcHJvcFswXSk7Ci0gICAgICAgIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLCAic3RvcmluZyByZW1vdGUgc2VydmljZXMgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICByZXQpOwotICAgICAgICBudW1fcHJvcGVydGllcysrOwotICAgICAgfQotCi0gICAgICAvKiBSZW1vdGUgbmFtZSB1cGRhdGUgKi8KLSAgICAgIGlmIChzdHJsZW4oKGNvbnN0IGNoYXIgKikgcF9kYXRhLT5kaXNjX3Jlcy5iZF9uYW1lKSkgewotICAgICAgICBwcm9wWzFdLnR5cGUgPSBCVF9QUk9QRVJUWV9CRE5BTUU7Ci0gICAgICAgIHByb3BbMV0udmFsID0gcF9kYXRhLT5kaXNjX3Jlcy5iZF9uYW1lOwotICAgICAgICBwcm9wWzFdLmxlbiA9IHN0cmxlbigoY2hhciAqKXBfZGF0YS0+ZGlzY19yZXMuYmRfbmFtZSk7Ci0KLSAgICAgICAgcmV0ID0gYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZiZF9hZGRyLCAmcHJvcFsxXSk7Ci0gICAgICAgIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLCAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSBwcm9wZXJ0eSIsIHJldCk7Ci0gICAgICAgIG51bV9wcm9wZXJ0aWVzKys7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChudW1fcHJvcGVydGllcyA+IDApIHsKLSAgICAgICAgaWYgKGJ0aWZfZG1fZ2V0X2Fkdl9hdWRpb190cmFuc3BvcnQoYmRfYWRkcikgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikKLSAgICAgICAgewotICAgICAgICAgIHByb3BbMF0udHlwZSA9IEJUX1BST1BFUlRZX1VVSURTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByb3BbMF0udHlwZSA9IChidF9wcm9wZXJ0eV90eXBlX3QpQlRfUFJPUEVSVFlfQURWX0FVRElPX1VVSURTOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNlbmQgdGhlIGV2ZW50IHRvIHRoZSBCVElGICovCi0gICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsIEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgJmJkX2FkZHIsIG51bV9wcm9wZXJ0aWVzLCBwcm9wKTsKLSAgICAgIH0KLQotICAgICAgaW50IHZhbGlkQWRkciA9IDE7Ci0gICAgICBidF9wcm9wZXJ0eV90IHJlbV9wcm9wOwotICAgICAgQlRJRl9TVE9SQUdFX0dFVF9SRU1PVEVfUFJPUCgmYmRfYWRkciwgKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9SRU1fREVWaUNFX1ZBTElEX0FERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZEFkZHIsIHNpemVvZihpbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1fcHJvcCk7Ci0KLSAgICAgIGlmICh2YWxpZEFkZHIgIT0gMCkgewotICAgICAgICBidF9wcm9wZXJ0eV90IHByb3BfYWRkcjsKLSAgICAgICAgaW50IGlzX3ZhbGlkID0gYnRhX2lzX2Fkdl9hdWRpb192YWxpZF9iZGFkZHIoYmRfYWRkcik7Ci0gICAgICAgIHByb3BfYWRkci50eXBlID0gKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9SRU1fREVWaUNFX1ZBTElEX0FERFI7Ci0gICAgICAgIHByb3BfYWRkci52YWwgPSAodm9pZCAqKSZpc192YWxpZDsKLSAgICAgICAgcHJvcF9hZGRyLmxlbiA9IHNpemVvZihpbnQpOwotICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkX2FkZHIsICZwcm9wX2FkZHIpOwotICAgICAgICBBU1NFUlRDKHJldCA9PSBCVF9TVEFUVVNfU1VDQ0VTUywgImZhaWxlZCB0byBzYXZlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkiLCByZXQpOwotICAgICAgfQotCi0gICAgICBidF9kZXZpY2VfdHlwZV90IGRldl90eXBlOwotICAgICAgZGV2X3R5cGUgPSAoYnRfZGV2aWNlX3R5cGVfdClCVF9ERVZJQ0VfVFlQRV9EVU1POwotICAgICAgYnRfcHJvcGVydHlfdCBwcm9wX2RldjsKLSAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFLCBzaXplb2YoZGV2X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgJmRldl90eXBlKTsKLSAgICAgIHJldCA9IGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmYmRfYWRkciwgJnByb3BfZGV2KTsKLSAgICAgIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLCAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSB0eXBlIiwKLSAgICAgICAgcmV0KTsKLQotICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYiwgQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgJmJkX2FkZHIsIDEsICZwcm9wX2Rldik7Ci0KLSAgICAgIC8qIElmIGJlbG93IGNvbmRpdGlvbiBpcyB0cnVlLCBpdCBtZWFucyBMRSByYW5kb20gYWR2ZXJ0aXNpbmcKLSAgICAgICAqIGhhcyBubyBBRFYgYXVkaW8gdXVpZHMsIGJ1dCBpZGVudGl0eSBhZGRyZXNzIGNvbnRhaW5zIGFkdiBhdWRpbyBiaXQKLSAgICAgICAqIEFzIHBlciBjdXJyZW50IGRlc2lnbiwgaWYgcGFpcmluZyBpbml0aWF0ZWQgdGhyb3VnaCBub24gYWR2IGF1ZGlvCi0gICAgICAgKiBhZGRyZXNzIHRoZW4gd2UgZG9udCBuZWVkIHRvIGZldGNoIEFEViBhdWRpbyByb2xlIGFuZCBzZXJ2aWNlcwotICAgICAgICovCi0gICAgICBpZiAoKGJ0aWZfZ2V0X2lzX2Fkdl9hdWRpb19wYWlyX2luZm8oYmRfYWRkcikgPT0gMCkpIHsKLSAgICAgICAgcHJvcF9kZXYudHlwZSA9IChidF9wcm9wZXJ0eV90eXBlX3QpQlRfUFJPUEVSVFlfQURWX0FVRElPX0FDVElPTl9VVUlEOwotICAgICAgICBwcm9wX2Rldi52YWwgPSAodm9pZCAqKSZ2YWxpZEFkZHI7Ci0gICAgICAgIHByb3BfZGV2LmxlbiA9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYiwgQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAmYmRfYWRkciwgMSwgJnByb3BfZGV2KTsKLSAgICAgIH0KLQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEJUQV9ETV9ESVNDX0NNUExfRVZUOgotICAgICAgLyogZml4bWUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVEFfRE1fU0VBUkNIX0NBTkNFTF9DTVBMX0VWVDoKLSAgICAgIC8qIG5vLW9wICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRBX0RNX0RJU0NfQkxFX1JFU19FVlQ6IHsKLSAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBzZXJ2aWNlICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+ZGlzY19ibGVfcmVzLnNlcnZpY2UuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIGJ0X3Byb3BlcnR5X3QgcHJvcDsKLSAgICAgIGJ0X3N0YXR1c190IHJldDsKLSAgICAgIFJhd0FkZHJlc3MmIGJkX2FkZHIgPSBwX2RhdGEtPmRpc2NfYmxlX3Jlcy5iZF9hZGRyOwotICAgICAgICAvKiBSZW1vdGUgbmFtZSB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHN0cm5sZW4oKGNvbnN0IGNoYXIqKXBfZGF0YS0+ZGlzY19ibGVfcmVzLmJkX25hbWUsIEJEX05BTUVfTEVOKSkgewotICAgICAgICAgIHByb3AudHlwZSA9IEJUX1BST1BFUlRZX0JETkFNRTsKLSAgICAgICAgICBwcm9wLnZhbCA9IHBfZGF0YS0+ZGlzY19ibGVfcmVzLmJkX25hbWU7Ci0gICAgICAgICAgcHJvcC5sZW4gPQotICAgICAgICAgICAgICBzdHJubGVuKChjaGFyKilwX2RhdGEtPmRpc2NfYmxlX3Jlcy5iZF9uYW1lLCBCRF9OQU1FX0xFTik7Ci0KLSAgICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkX2FkZHIsICZwcm9wKTsKLSAgICAgICAgICBBU1NFUlRDKHJldCA9PSBCVF9TVEFUVVNfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2F2ZSByZW1vdGUgZGV2aWNlIHByb3BlcnR5IiwgcmV0KTsKLSAgICAgICAgICAvKiBTZW5kIHRoZSBldmVudCB0byB0aGUgQlRJRiAqLwotICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsIEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAmYmRfYWRkciwgMSwgJnByb3ApOwotICAgICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQlRBX0RNX0xFX0FVRElPX1NFQVJDSF9DTVBMX0VWVDoKLSAgICB7Ci0gICAgICB0QlRBX0RFVl9QQUlSSU5HX0NCICpwX2xlYV9wYWlyX2NiID0gTlVMTDsKLSAgICAgIHBfbGVhX3BhaXJfY2IgPSBidGFfZ2V0X2xlYV9wYWlyX2NiKHBfZGF0YS0+ZGlzY19ibGVfcmVzLmJkX2FkZHIpOwotICAgICAgaWYgKHBfbGVhX3BhaXJfY2IgIT0gTlVMTCkgewotICAgICAgICBidGlmX3Jlc2V0X3BhaXJpbmdfY2IoKTsKLSAgICAgICAgYnRfcHJvcGVydHlfdCBwcm9wWzVdLCBwcm9wX3RtcFsyXTsKLSAgICAgICAgUmF3QWRkcmVzcyYgYmRfYWRkciA9IHBfZGF0YS0+ZGlzY19ibGVfcmVzLmJkX2FkZHI7Ci0gICAgICAgIGludCBudW1fcHJvcGVydGllcyA9IDA7Ci0gICAgICAgIGJvb2wgaWRfYWRkcl9hY3Rpb25fdXVpZCA9IGZhbHNlOwotICAgICAgICBSYXdBZGRyZXNzIGlkX2FkZHIgPSBidGFfZ2V0X3JlbV9kZXZfaWRfYWRkcihiZF9hZGRyKTsKLQotICAgICAgICBwcm9wW251bV9wcm9wZXJ0aWVzXS50eXBlID0gKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9BRFZfQVVESU9fVVVJRFM7Ci0gICAgICAgIHByb3BbbnVtX3Byb3BlcnRpZXNdLnZhbCA9IHBfZGF0YS0+YWR2X2F1ZGlvX2Rpc2NfY21wbC5hZHZfYXVkaW9fdXVpZHM7Ci0gICAgICAgIHByb3BbbnVtX3Byb3BlcnRpZXNdLmxlbiA9IHBfZGF0YS0+YWR2X2F1ZGlvX2Rpc2NfY21wbC5udW1fdXVpZHMgKgotICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczEyODsKLSAgICAgICAgLyogQWxzbyB3cml0ZSB0aGlzIHRvIHRoZSBOVlJBTSAqLwotICAgICAgICBidF9wcm9wZXJ0eV90IGNvZF9wcm9wMTsKLSAgICAgICAgdWludDMyX3QgY29kX3A7Ci0KLSAgICAgICAgQlRJRl9TVE9SQUdFX0ZJTExfUFJPUEVSVFkoJmNvZF9wcm9wMSwKLSAgICAgICAgICAgIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRSwgc2l6ZW9mKGNvZF9wKSwgJmNvZF9wKTsKLSAgICAgICAgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZiZF9hZGRyLAotICAgICAgICAgICAgJmNvZF9wcm9wMSk7Ci0gICAgICAgIGludCByZXQ7Ci0gICAgICAgIGNvZF9wIHw9IE1BSk9SX0xFX0FVRElPX1ZFTkRPUl9DT0Q7Ci0gICAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZjb2RfcHJvcDEsCi0gICAgICAgICAgICBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UsIHNpemVvZihjb2RfcCksICZjb2RfcCk7Ci0gICAgICAgIHJldCA9IGJ0aWZfc3RvcmFnZV9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmYmRfYWRkciwgJmNvZF9wcm9wMSk7Ci0gICAgICAgIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgImZhaWxlZCB0byBzYXZlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkiLCByZXQpOwotCi0gICAgICAgIGlmIChidGFfcmVtb3RlX2RldmljZV9pc19kdW1vKGJkX2FkZHIpCi0gICAgICAgICAgICAmJiAoaWRfYWRkciAhPSBiZF9hZGRyKSAmJiAoYnRhX2xlYV9wYWlyaW5nX2NiLmlzX3NkcF9kaXNjb3ZlciA9PSB0cnVlKSkgewotICAgICAgICAgIGlmKGlkX2FkZHIgIT0gUmF3QWRkcmVzczo6a0VtcHR5KSB7Ci0gICAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogRm91bmQgQlRfUFJPUEVSVFlfQURWX0FVRElPX1VVSURTICVzIiwKLSAgICAgICAgICAgICAgICBwX2RhdGEtPmFkdl9hdWRpb19kaXNjX2NtcGwuYWR2X2F1ZGlvX3V1aWRzWzBdLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICBpZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QgY29kX3Byb3A7Ci0gICAgICAgICAgICB1aW50MzJfdCBjb2Q7Ci0KLSAgICAgICAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZjb2RfcHJvcCwKLSAgICAgICAgICAgICAgICBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UsIHNpemVvZihjb2QpLCAmY29kKTsKLSAgICAgICAgICAgIGJ0aWZfc3RvcmFnZV9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSgmaWRfYWRkciwKLSAgICAgICAgICAgICAgICAmY29kX3Byb3ApOwotICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXM6IENvZCBpcyAleCIsIF9fZnVuY19fLCBjb2QpOwotICAgICAgICAgICAgY29kIHw9IE1BSk9SX0xFX0FVRElPX1ZFTkRPUl9DT0Q7Ci0gICAgICAgICAgICBCVElGX1NUT1JBR0VfRklMTF9QUk9QRVJUWSgmY29kX3Byb3AsCi0gICAgICAgICAgICAgICAgQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFLCBzaXplb2YoY29kKSwgJmNvZCk7Ci0gICAgICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmlkX2FkZHIsICZjb2RfcHJvcCk7Ci0gICAgICAgICAgICBBU1NFUlRDKHJldCA9PSBCVF9TVEFUVVNfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSBwcm9wZXJ0eSIsIHJldCk7Ci0gICAgICAgICAgICBudW1fcHJvcGVydGllcysrOwotICAgICAgICAgICAgcHJvcFtudW1fcHJvcGVydGllc10udHlwZSA9IEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRTsKLSAgICAgICAgICAgIHByb3BbbnVtX3Byb3BlcnRpZXNdLnZhbCA9ICh2b2lkICopICZjb2Q7Ci0gICAgICAgICAgICBwcm9wW251bV9wcm9wZXJ0aWVzXS5sZW4gPSBzaXplb2YoY29kKTsKLQotICAgICAgICAgICAgbnVtX3Byb3BlcnRpZXMgKys7Ci0KLSAgICAgICAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wW251bV9wcm9wZXJ0aWVzXSwKLSAgICAgICAgICAgICAgICAoYnRfcHJvcGVydHlfdHlwZV90KUJUX1BST1BFUlRZX1JFTV9ERVZfSURFTlRfQkRfQUREUiwgc2l6ZW9mKFJhd0FkZHJlc3MpLCAmYmRfYWRkcik7Ci0gICAgICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmlkX2FkZHIsICZwcm9wW251bV9wcm9wZXJ0aWVzXSk7Ci0gICAgICAgICAgICBBU1NFUlRDKHJldCA9PSBCVF9TVEFUVVNfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNhdmUgcmVtb3RlIGRldmljZSBwcm9wZXJ0eSIsIHJldCk7Ci0KLSAgICAgICAgICAgIGlkX2FkZHJfYWN0aW9uX3V1aWQgPSB0cnVlOwotICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYiwgQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgJmlkX2FkZHIsIDMsICZwcm9wWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbnVtX3Byb3BlcnRpZXMgPSAxOwotCi0gICAgICAgIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZwcm9wW251bV9wcm9wZXJ0aWVzXSwKLSAgICAgICAgICAgIChidF9wcm9wZXJ0eV90eXBlX3QpQlRfUFJPUEVSVFlfUkVNX0RFVl9JREVOVF9CRF9BRERSLCBzaXplb2YoUmF3QWRkcmVzcyksICZpZF9hZGRyKTsKLQotICAgICAgICByZXQgPSBidGlmX3N0b3JhZ2Vfc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoJmJkX2FkZHIsICZwcm9wW251bV9wcm9wZXJ0aWVzXSk7Ci0gICAgICAgIEFTU0VSVEMocmV0ID09IEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgImZhaWxlZCB0byBzYXZlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkiLCByZXQpOwotCi0gICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsIEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgJmJkX2FkZHIsIDIsICZwcm9wWzBdKTsKLQotICAgICAgICBpbnQgdmFsaWRBZGRyID0gMTsKLSAgICAgICAgYnRfcHJvcGVydHlfdCByZW1fcHJvcDsKLSAgICAgICAgQlRJRl9TVE9SQUdFX0dFVF9SRU1PVEVfUFJPUCgmYmRfYWRkciwgKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9SRU1fREVWaUNFX1ZBTElEX0FERFIsCi0gICAgICAgICAgICAmdmFsaWRBZGRyLCBzaXplb2YoaW50KSwKLSAgICAgICAgICAgIHJlbV9wcm9wKTsKLSAgICAgICAgdmFsaWRBZGRyID0gYnRhX2lzX2Fkdl9hdWRpb192YWxpZF9iZGFkZHIoYmRfYWRkcik7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBpcyBWYWxpZCBBZGRyZXNzIENoZWNrIHZhbHVlICVkIGJkX2FkZHIgJXMiLCBfX2Z1bmNfXywgdmFsaWRBZGRyLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHByb3BfdG1wWzBdLnR5cGUgPSAoYnRfcHJvcGVydHlfdHlwZV90KUJUX1BST1BFUlRZX1JFTV9ERVZpQ0VfVkFMSURfQUREUjsKLSAgICAgICAgcHJvcF90bXBbMF0udmFsID0gKHZvaWQgKikmdmFsaWRBZGRyOwotICAgICAgICBwcm9wX3RtcFswXS5sZW4gPSBzaXplb2YoaW50KTsKLSAgICAgICAgcmV0ID0gYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZiZF9hZGRyLCAmcHJvcF90bXBbMF0pOwotICAgICAgICBBU1NFUlRDKHJldCA9PSBCVF9TVEFUVVNfU1VDQ0VTUywgImZhaWxlZCB0byBzYXZlIHJlbW90ZSBkZXZpY2UgcHJvcGVydHkiLCByZXQpOwotCi0gICAgICAgIHByb3BfdG1wWzFdLnR5cGUgPSAoYnRfcHJvcGVydHlfdHlwZV90KUJUX1BST1BFUlRZX0FEVl9BVURJT19BQ1RJT05fVVVJRDsKLSAgICAgICAgcHJvcF90bXBbMV0udmFsID0gKHZvaWQgKikmdmFsaWRBZGRyOwotICAgICAgICBwcm9wX3RtcFsxXS5sZW4gPSBzaXplb2YodWludDhfdCk7Ci0KLSAgICAgICAgaWYgKGlkX2FkZHJfYWN0aW9uX3V1aWQpIHsKLSAgICAgICAgICBCVElGX1RSQUNFX0RFQlVHKCIlczogSURFTlRJVFkgQUREUiBBQ1RJT04gVVVJRCAlcyAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgaWRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsIEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgICAmaWRfYWRkciwgMSwgJnByb3BfdG1wWzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsIEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAgICAgJmJkX2FkZHIsIDIsICZwcm9wX3RtcFswXSk7Ci0gICAgICAgIGlmIChpZF9hZGRyX2FjdGlvbl91dWlkKSB7Ci0gICAgICAgICAgYnRpZl9zZXRfcmVtb3RlX2RldmljZV91dWlkX3Byb3BlcnR5KGlkX2FkZHIsCi0gICAgICAgICAgICAgIHBfZGF0YS0+YWR2X2F1ZGlvX2Rpc2NfY21wbC5udW1fdXVpZHMsICZwX2RhdGEtPmFkdl9hdWRpb19kaXNjX2NtcGwuYWR2X2F1ZGlvX3V1aWRzWzBdKTsKLSAgICAgICAgfQotICAgICAgICBidGlmX3NldF9yZW1vdGVfZGV2aWNlX3V1aWRfcHJvcGVydHkoYmRfYWRkciwKLSAgICAgICAgICAgIHBfZGF0YS0+YWR2X2F1ZGlvX2Rpc2NfY21wbC5udW1fdXVpZHMsICZwX2RhdGEtPmFkdl9hdWRpb19kaXNjX2NtcGwuYWR2X2F1ZGlvX3V1aWRzWzBdKTsKLQotICAgICAgICBidGFfZG1fYWR2X2F1ZGlvX2Nsb3NlKGJkX2FkZHIpOwotICAgICAgICBidGFfZG1fcmVzZXRfbGVhX3BhaXJpbmdfaW5mbyhiZF9hZGRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzOiBPTkNFIEFHQUlOIFdSSVRJTkcgSURFTlRJVFkiLCBfX2Z1bmNfXyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IHsgQVNTRVJUQygwLCAidW5oYW5kbGVkIHNlYXJjaCBzZXJ2aWNlcyBldmVudCIsIGV2ZW50KTsgfSBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBidGlmX3JlZ2lzdGVyX3V1aWRfc3J2Y19kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgIEFkZCB0byBVVUlEIHRvIHRoZSBzZXJ2aWNlIHNlYXJjaCBxdWV1ZQotICoKLSAqIFJldHVybnMgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0aWZfcmVnaXN0ZXJfdXVpZF9zcnZjX2Rpc2MoYmx1ZXRvb3RoOjpVdWlkIHV1aWQpIHsKLQotICB1dWlkX3Nydl9kaXNjX3NlYXJjaC5wdXNoX2JhY2sodXVpZCk7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoImJ0aWZfcmVnaXN0ZXJfdXVpZF9zcnZjX2Rpc2MsIG5vIG9mIHV1aWRzICVkICVzIiwKLSAgdXVpZF9zcnZfZGlzY19zZWFyY2guc2l6ZSgpLCB1dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgYnRpZl9kbV9yZWxlYXNlX2FjdGlvbl91dWlkKFJhd0FkZHJlc3MgYmRfYWRkcikgewotCi0gIGJ0X3Byb3BlcnR5X3QgcHJvcF9kZXY7Ci0gIGludCBzdGF0dXMgPSAxOwotICBwcm9wX2Rldi50eXBlID0gKGJ0X3Byb3BlcnR5X3R5cGVfdClCVF9QUk9QRVJUWV9BRFZfQVVESU9fQUNUSU9OX1VVSUQ7Ci0gIHByb3BfZGV2LnZhbCA9ICh2b2lkICopJnN0YXR1czsKLSAgcHJvcF9kZXYubGVuID0gc2l6ZW9mKHVpbnQ4X3QpOwotICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NiLCBCVF9TVEFUVVNfU1VDQ0VTUywKLSAgICAgICZiZF9hZGRyLCAxLCAmcHJvcF9kZXYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICBjaGVja19hZHZfYXVkaW9fY29kCi0gKgotICogRGVzY3JpcHRpb24gICAgIFRoaXMgQVBJIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBDT0QgY29udGFpbnMgTEUgQXVkaW8KLSAqICAgICAgICAgICAgICAgICBDT0Qgb3Igbm90PwotICoKLSAqIFJldHVybnMgICAgICAgICBib29sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGNoZWNrX2Fkdl9hdWRpb19jb2QodWludDMyX3QgY29kKSB7Ci0KLSAgQlRJRl9UUkFDRV9ERUJVRygiY2hlY2tfYWR2X2F1ZGlvX2NvZCAiKTsKLQotICBpZiAoY29kICYgTUFKT1JfTEVfQVVESU9fVkVORE9SX0NPRCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgaXNfcmVtb3RlX3N1cHBvcnRfYWR2X2F1ZGlvCi0gKgotICogRGVzY3JpcHRpb24gICAgIGlzIHJlbW90ZSBkZXZpY2UgaXMgc3VwcG9ydGluZyBMRSBhdWRpbyBvciBub3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgYm9vbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgaXNfcmVtb3RlX3N1cHBvcnRfYWR2X2F1ZGlvKGNvbnN0IFJhd0FkZHJlc3MgcF9hZGRyKSB7Ci0gIGlmIChhZHZfYXVkaW9fZGV2aWNlX2RiLmZpbmQocF9hZGRyKQotICAgICAgICAgICE9IGFkdl9hdWRpb19kZXZpY2VfZGIuZW5kKCkpIHsKLSAgICAgICAgQlRJRl9UUkFDRV9ERUJVRygiJXMgICVzIExFIEFVRElPIFN1cHBvcnQgIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBzdGF0dXMgPSBidGFfaXNfcmVtb3RlX3N1cHBvcnRfbGVhKHBfYWRkcik7Ci0gIGlmIChzdGF0dXMpIHJldHVybiB0cnVlOwotCi0gIGJ0X3Byb3BlcnR5X3QgY29kX3Byb3A7Ci0gIHVpbnQzMl90IGNvZF9wOwotCi0gIEJUSUZfU1RPUkFHRV9GSUxMX1BST1BFUlRZKCZjb2RfcHJvcCwKLSAgICAgIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRSwgc2l6ZW9mKGNvZF9wKSwgJmNvZF9wKTsKLSAgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZwX2FkZHIsCi0gICAgICAmY29kX3Byb3ApOwotCi0gIGlmICgoY29kX3AgJiBNQUpPUl9MRV9BVURJT19WRU5ET1JfQ09EKQotICAgICAgPT0gTUFKT1JfTEVfQVVESU9fVkVORE9SX0NPRCkgewotICAgIEJUSUZfVFJBQ0VfREVCVUcoIiVzIEFEViBBVURJTyBDT0QgaXMgbWF0Y2hlZCAiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgYnRlX2RtX2Fkdl9hdWRpb19zZWFyY2hfc2VydmljZXNfZXZ0KHRCVEFfRE1fU0VBUkNIX0VWVCBldmVudCwKLSAgICB0QlRBX0RNX1NFQVJDSCogcF9kYXRhKSB7Ci0gIEJUSUZfVFJBQ0VfREVCVUcoIiAlcyAiLCBfX2Z1bmNfXyk7Ci0gIHVpbnQxNl90IHBhcmFtX2xlbiA9IDA7Ci0gIGlmIChwX2RhdGEpIHBhcmFtX2xlbiArPSBzaXplb2YodEJUQV9ETV9TRUFSQ0gpOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBCVEFfRE1fRElTQ19SRVNfRVZUOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocF9kYXRhICYmIHBfZGF0YS0+ZGlzY19yZXMucmVzdWx0ID09IEJUQV9TVUNDRVNTKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfZGF0YS0+ZGlzY19yZXMubnVtX3V1aWRzID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9sZW4gKz0gKHBfZGF0YS0+ZGlzY19yZXMubnVtX3V1aWRzICogVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKLSAgfQotICAvKiBUT0RPOiBUaGUgb25seSBvdGhlciBtZW1iZXIgdGhhdCBuZWVkcyBhIGRlZXAgY29weSBpcyB0aGUgcF9yYXdfZGF0YS4gQnV0Ci0gICAqICAgICogbm90IHN1cmUKLSAgICogICAgICAgKiBpZiByYXdfZGF0YSBpcyBuZWVkZWQuICovCi0gIGJ0aWZfdHJhbnNmZXJfY29udGV4dCgKLSAgICAgIGJ0aWZfZG1fbGVhX3NlYXJjaF9zZXJ2aWNlc19ldnQsIGV2ZW50LCAoY2hhciopcF9kYXRhLCBwYXJhbV9sZW4sCi0gICAgICAocGFyYW1fbGVuID4gc2l6ZW9mKHRCVEFfRE1fU0VBUkNIKSkgPyBzZWFyY2hfc2VydmljZXNfY29weV9jYiA6IE5VTEwpOwotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9tY3AuY2MgYi9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9tY3AuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjRlZTkuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfbWNwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogTUNQIEludGVyZmFjZSAqLwotI2RlZmluZSBMT0dfVEFHICJidF9idGlmX21jcCIKLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YV9jbG9zdXJlX2FwaS5oIgotI2luY2x1ZGUgImJ0YV9tY3BfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9tY3AuaD4KLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBiYXNlOjpPd25lZDsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci0KLXVzaW5nIGJsdWV0b290aDo6bWNwX3NlcnZlcjo6TWNwU2VydmVyQ2FsbGJhY2tzOwotdXNpbmcgYmx1ZXRvb3RoOjptY3Bfc2VydmVyOjpNY3BTZXJ2ZXJJbnRlcmZhY2U7Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBNY3BTZXJ2ZXJJbnRlcmZhY2VJbXBsOwotc3RkOjp1bmlxdWVfcHRyPE1jcFNlcnZlckludGVyZmFjZT4gTWNwU2VydmVySW5zdGFuY2U7Ci0KLWNsYXNzIE1jcFNlcnZlckludGVyZmFjZUltcGwKLSAgOiBwdWJsaWMgTWNwU2VydmVySW50ZXJmYWNlLCBwdWJsaWMgTWNwU2VydmVyQ2FsbGJhY2tzIHsKLSAgfk1jcFNlcnZlckludGVyZmFjZUltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBJbml0KE1jcFNlcnZlckNhbGxiYWNrcyogY2FsbGJhY2ssIFV1aWQgYnRfdXVpZCkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA7Ci0gICAgdGhpcy0+Y2FsbGJhY2tzID0gY2FsbGJhY2s7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgQmluZCgmTWNwU2VydmVyOjpJbml0aWFsaXplLCB0aGlzLCBidF91dWlkKSk7Ci0gIH0KLQotICB2b2lkIE1lZGlhU3RhdGUodWludDhfdCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGF0ZSAiIDw8IHN0YXRlOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgIEJpbmQoJk1jcFNlcnZlcjo6TWVkaWFTdGF0ZSwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgc3RhdGUpKTsKLSAgfQotCi0gIHZvaWQgTWVkaWFQbGF5ZXJOYW1lKHVpbnQ4X3QqIG5hbWUpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogbmFtZSIgPDwgbmFtZTsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6Ok1lZGlhUGxheWVyTmFtZSwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgbmFtZSkpOwotICB9Ci0KLSAgdm9pZCBNZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZCh1aW50MzJfdCBmZWF0dXJlKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGZlYXR1cmUiIDw8IGZlYXR1cmU7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgQmluZCgmTWNwU2VydmVyOjpNZWRpYUNvbnRyb2xQb2ludE9wY29kZVN1cHBvcnRlZCwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgZmVhdHVyZSkpOwotICB9Ci0KLSAgdm9pZCBNZWRpYUNvbnRyb2xQb2ludCh1aW50OF90IHZhbHVlKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHZhbHVlIiA8PCB2YWx1ZTsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6Ok1lZGlhQ29udHJvbFBvaW50LCBVbnJldGFpbmVkKE1jcFNlcnZlcjo6R2V0KCkpLCB2YWx1ZSkpOwotICB9Ci0KLSAgdm9pZCBUcmFja0NoYW5nZWQoYm9vbCBzdGF0dXMpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc3RhdHVzIiA8PCBzdGF0dXM7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgQmluZCgmTWNwU2VydmVyOjpUcmFja0NoYW5nZWQsIFVucmV0YWluZWQoTWNwU2VydmVyOjpHZXQoKSksIHN0YXR1cykpOwotICB9Ci0KLSAgdm9pZCBUcmFja1RpdGxlKHVpbnQ4X3QqIHRpdGxlKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHRpdGxlIiA8PCB0aXRsZTsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6OlRyYWNrVGl0bGUsIFVucmV0YWluZWQoTWNwU2VydmVyOjpHZXQoKSksIHRpdGxlKSk7Ci0gIH0KLQotICB2b2lkIFRyYWNrUG9zaXRpb24oaW50MzJfdCBwb3NpdGlvbikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBwb3NpdGlvbiIgPDwgcG9zaXRpb247Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgQmluZCgmTWNwU2VydmVyOjpUcmFja1Bvc2l0aW9uLCBVbnJldGFpbmVkKE1jcFNlcnZlcjo6R2V0KCkpLCBwb3NpdGlvbikpOwotICB9Ci0KLSAgdm9pZCBUcmFja0R1cmF0aW9uKGludDMyX3QgZHVyYXRpb24pIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZHVyYXRpb24iIDw8IGR1cmF0aW9uOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgIEJpbmQoJk1jcFNlcnZlcjo6VHJhY2tEdXJhdGlvbiwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgZHVyYXRpb24pKTsKLSAgfQotCi0gIHZvaWQgQ29udGVudENvbnRyb2xJZCh1aW50OF90IGNjaWQpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogY2NpZCIgPDwgY2NpZDsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6OkNvbnRlbnRDb250cm9sSWQsIFVucmV0YWluZWQoTWNwU2VydmVyOjpHZXQoKSksIGNjaWQpKTsKLSAgfQotCi0gIHZvaWQgUGxheWluZ09yZGVyU3VwcG9ydGVkKHVpbnQxNl90IG9yZGVyKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG9yZGVyIiA8PCBvcmRlcjsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6OlBsYXlpbmdPcmRlclN1cHBvcnRlZCwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgb3JkZXIpKTsKLSAgfQotCi0gIHZvaWQgUGxheWluZ09yZGVyKHVpbnQ4X3QgdmFsdWUpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogdmFsdWUiIDw8IHZhbHVlOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgIEJpbmQoJk1jcFNlcnZlcjo6UGxheWluZ09yZGVyLCBVbnJldGFpbmVkKE1jcFNlcnZlcjo6R2V0KCkpLCB2YWx1ZSkpOwotICB9Ci0KLSAgdm9pZCBTZXRBY3RpdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHNldF9pZCwgaW50IHByb2ZpbGUpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogc2V0X2lkIiA8PCBzZXRfaWQ8PCAiOiBkZXZpY2UiPDwgYWRkcmVzczsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6OlNldEFjdGl2ZURldmljZSwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgYWRkcmVzcywgc2V0X2lkLCBwcm9maWxlKSk7Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3RNY3AoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2UiPDwgYWRkcmVzczsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6OkRpc2Nvbm5lY3RNY3AsIFVucmV0YWluZWQoTWNwU2VydmVyOjpHZXQoKSksIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgQm9uZFN0YXRlQ2hhbmdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2UiPDwgYWRkcmVzcyA8PCAiIHN0YXRlIDogIiA8PCBzdGF0ZTsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICBCaW5kKCZNY3BTZXJ2ZXI6OkJvbmRTdGF0ZUNoYW5nZSwgVW5yZXRhaW5lZChNY3BTZXJ2ZXI6OkdldCgpKSwgYWRkcmVzcywgc3RhdGUpKTsKLSAgfQotCi0gIHZvaWQgQ2xlYW51cCh2b2lkKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZNY3BTZXJ2ZXI6OkNsZWFuVXApKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGVDaGFuZ2UoaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGFkZHJlc3MgPDwgIiBzdGF0ZT0iIDw8IChpbnQpc3RhdHVzOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZNY3BTZXJ2ZXJDYWxsYmFja3M6Ok9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlLAotICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBzdGF0dXMsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgTWVkaWFDb250cm9sUG9pbnRDaGFuZ2VSZXEodWludDhfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGFkZHJlc3MgPDwgIiBzdGF0ZT0iIDw8IChpbnQpc3RhdGU7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJk1jcFNlcnZlckNhbGxiYWNrczo6TWVkaWFDb250cm9sUG9pbnRDaGFuZ2VSZXEsCi0gICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIHN0YXRlLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIFRyYWNrUG9zaXRpb25DaGFuZ2VSZXEoaW50MzJfdCBwb3NpdGlvbikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHBvc2l0aW9uPSIgPDwgKGludClwb3NpdGlvbjsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmTWNwU2VydmVyQ2FsbGJhY2tzOjpUcmFja1Bvc2l0aW9uQ2hhbmdlUmVxLAotICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBwb3NpdGlvbikpOwotICB9Ci0KLSAgdm9pZCBQbGF5aW5nT3JkZXJDaGFuZ2VSZXEodWludDMyX3Qgb3JkZXIpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogb3JkZXI9IiA8PCBvcmRlcjsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmTWNwU2VydmVyQ2FsbGJhY2tzOjpQbGF5aW5nT3JkZXJDaGFuZ2VSZXEsCi0gICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIG9yZGVyKSk7Ci0gIH0KLQotICBwcml2YXRlOgotICAgIE1jcFNlcnZlckNhbGxiYWNrcyogY2FsbGJhY2tzOwotICB9OwotfS8vbmFtZXNwYWNlCi0KLWNvbnN0IE1jcFNlcnZlckludGVyZmFjZSogYnRpZl9tY3Bfc2VydmVyX2dldF9pbnRlcmZhY2Uodm9pZCkgewotICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgaWYgKCFNY3BTZXJ2ZXJJbnN0YW5jZSkKLSAgICAgTWNwU2VydmVySW5zdGFuY2UucmVzZXQobmV3IE1jcFNlcnZlckludGVyZmFjZUltcGwoKSk7Ci0gICByZXR1cm4gTWNwU2VydmVySW5zdGFuY2UuZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl9wYWNzX2NsaWVudC5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX3BhY3NfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA4NjdhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX3BhY3NfY2xpZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidGFfY2xvc3VyZV9hcGkuaCIKLSNpbmNsdWRlICJidGFfcGFjc19jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfcGFjc19jbGllbnQuaD4KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OlVucmV0YWluZWQ7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZzsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb25uZWN0aW9uU3RhdGU7Ci11c2luZyBibHVldG9vdGg6OmJhcDo6cGFjczo6UGFjc0NsaWVudENhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpQYWNzQ2xpZW50SW50ZXJmYWNlOwotCi0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFBhY3NDbGllbnRJbnRlcmZhY2VJbXBsOwotc3RkOjp1bmlxdWVfcHRyPFBhY3NDbGllbnRJbnRlcmZhY2U+IFBhY3NDbGllbnRJbnN0YW5jZTsKLQotY2xhc3MgUGFjc0NsaWVudEludGVyZmFjZUltcGwKLSAgICA6IHB1YmxpYyBQYWNzQ2xpZW50SW50ZXJmYWNlLAotICAgICAgcHVibGljIFBhY3NDbGllbnRDYWxsYmFja3MgewotICB+UGFjc0NsaWVudEludGVyZmFjZUltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBJbml0KFBhY3NDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcykgb3ZlcnJpZGUgewotICAgIERWTE9HKDIpIDw8IF9fZnVuY19fOwotICAgIHRoaXMtPmNhbGxiYWNrcyA9IGNhbGxiYWNrczsKLQotICAgIGRvX2luX2J0YV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgQmluZCgmUGFjc0NsaWVudDo6SW5pdGlhbGl6ZSwgdGhpcykpOwotICB9Ci0KLSAgdm9pZCBPbkluaXRpYWxpemVkKGludCBzdGF0dXMsIGludCBjbGllbnRfaWQpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmUGFjc0NsaWVudENhbGxiYWNrczo6T25Jbml0aWFsaXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQpKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uU3RhdGUgc3RhdGUpIG92ZXJyaWRlIHsKLSAgICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmUGFjc0NsaWVudENhbGxiYWNrczo6T25Db25uZWN0aW9uU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLCBhZGRyZXNzLCBzdGF0ZSkpOwotICB9Ci0KLSAgdm9pZCBPbkF1ZGlvQ29udGV4dEF2YWlsYWJsZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBCaW5kKCZQYWNzQ2xpZW50Q2FsbGJhY2tzOjpPbkF1ZGlvQ29udGV4dEF2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChjYWxsYmFja3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBhdmFpbGFibGVfY29udGV4dHMpKTsKLSAgfQotCi0gIHZvaWQgT25TZWFyY2hDb21wbGV0ZShpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBzaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IHNyY19wYWNfcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpbmtfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF2YWlsYWJsZV9jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1cHBvcnRlZF9jb250ZXh0cykgb3ZlcnJpZGUgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZQYWNzQ2xpZW50Q2FsbGJhY2tzOjpPblNlYXJjaENvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoY2FsbGJhY2tzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wYWNfcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfY29udGV4dHMpKTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmUGFjc0NsaWVudDo6Q29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChQYWNzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcywgZmFsc2UpKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmUGFjc0NsaWVudDo6RGlzY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChQYWNzQ2xpZW50OjpHZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBTdGFydERpc2NvdmVyeSh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmUGFjc0NsaWVudDo6U3RhcnREaXNjb3ZlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoUGFjc0NsaWVudDo6R2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQsIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgR2V0QXZhaWxhYmxlQXVkaW9Db250ZXh0cyh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlBhY3NDbGllbnQ6OkdldEF1ZGlvQXZhaWxhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFBhY3NDbGllbnQ6OkdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIENsZWFudXAodWludDE2X3QgY2xpZW50X2lkKSBvdmVycmlkZSB7Ci0gICAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlBhY3NDbGllbnQ6OkNsZWFuVXAsIGNsaWVudF9pZCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBQYWNzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3M7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotUGFjc0NsaWVudEludGVyZmFjZSogYnRpZl9wYWNzX2NsaWVudF9nZXRfaW50ZXJmYWNlKCkgewotICBpZiAoIVBhY3NDbGllbnRJbnN0YW5jZSkKLSAgICBQYWNzQ2xpZW50SW5zdGFuY2UucmVzZXQobmV3IFBhY3NDbGllbnRJbnRlcmZhY2VJbXBsKCkpOwotCi0gIHJldHVybiBQYWNzQ2xpZW50SW5zdGFuY2UuZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl92Y3BfY29udHJvbGxlci5jYyBiL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX3ZjcF9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJhMmFjLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3N5c3RlbS9idC9idGlmL3NyYy9idGlmX3ZjcF9jb250cm9sbGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKkNvcHlyaWdodCAoYykgMjAyMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVm9sdW1lIENvbnRyb2wgUHJvZmlsZSBJbnRlcmZhY2UgKi8KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YV9jbG9zdXJlX2FwaS5oIgotI2luY2x1ZGUgImJ0YV92Y3BfY29udHJvbGxlcl9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImJ0aWZfc3RvcmFnZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF92Y3BfY29udHJvbGxlci5oPgotCi11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgYmFzZTo6VW5yZXRhaW5lZDsKLXVzaW5nIGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OkNvbm5lY3Rpb25TdGF0ZTsKLXVzaW5nIGJsdWV0b290aDo6dmNwX2NvbnRyb2xsZXI6OlZjcENvbnRyb2xsZXJDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OnZjcF9jb250cm9sbGVyOjpWY3BDb250cm9sbGVySW50ZXJmYWNlOwotCi1uYW1lc3BhY2UgewotY2xhc3MgVmNwQ29udHJvbGxlckludGVyZmFjZUltcGw7Ci1zdGQ6OnVuaXF1ZV9wdHI8VmNwQ29udHJvbGxlckludGVyZmFjZT4gVmNwQ29udHJvbGxlckluc3RhbmNlOwotCi1jbGFzcyBWY3BDb250cm9sbGVySW50ZXJmYWNlSW1wbAotICAgIDogcHVibGljIFZjcENvbnRyb2xsZXJJbnRlcmZhY2UsIHB1YmxpYyBWY3BDb250cm9sbGVyQ2FsbGJhY2tzIHsKLSAgflZjcENvbnRyb2xsZXJJbnRlcmZhY2VJbXBsKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgSW5pdChWY3BDb250cm9sbGVyQ2FsbGJhY2tzKiBjYWxsYmFja3MpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gOwotICAgIHRoaXMtPmNhbGxiYWNrcyA9IGNhbGxiYWNrczsKLQotICAgIGRvX2luX2J0YV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgQmluZCgmVmNwQ29udHJvbGxlcjo6SW5pdGlhbGl6ZSwgdGhpcykpOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShDb25uZWN0aW9uU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9IiA8PCBhZGRyZXNzIDw8ICIgc3RhdGU9IiA8PCAoaW50KXN0YXRlOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZWY3BDb250cm9sbGVyQ2FsbGJhY2tzOjpPbkNvbm5lY3Rpb25TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIHN0YXRlLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIE9uVm9sdW1lU3RhdGVDaGFuZ2UodWludDhfdCB2b2x1bWUsIHVpbnQ4X3QgbXV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9IiA8PCBhZGRyZXNzIDw8ICIgdm9sdW1lPSIgPDwgbG9naGV4KHZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbXV0ZT0iIDw8IChpbnQpbXV0ZTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVmNwQ29udHJvbGxlckNhbGxiYWNrczo6T25Wb2x1bWVTdGF0ZUNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIHZvbHVtZSwgbXV0ZSwgYWRkcmVzcykpOwotICB9Ci0KLSAgdm9pZCBPblZvbHVtZUZsYWdzQ2hhbmdlKHVpbnQ4X3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgYWRkcmVzcyA8PCAiIGZsYWdzPSIgPDwgbG9naGV4KGZsYWdzKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVmNwQ29udHJvbGxlckNhbGxiYWNrczo6T25Wb2x1bWVGbGFnc0NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKGNhbGxiYWNrcyksIGZsYWdzLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIENvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgYm9vbCBpc0RpcmVjdCkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9IiA8PCBhZGRyZXNzOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZWY3BDb250cm9sbGVyOjpDb25uZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJldGFpbmVkKFZjcENvbnRyb2xsZXI6OkdldCgpKSwgYWRkcmVzcywgaXNEaXJlY3QpKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGRldmljZT0iIDw8IGFkZHJlc3M7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlZjcENvbnRyb2xsZXI6OkRpc2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucmV0YWluZWQoVmNwQ29udHJvbGxlcjo6R2V0KCkpLCBhZGRyZXNzKSk7Ci0gIH0KLQotICB2b2lkIFNldEFic1ZvbHVtZSh1aW50OF90IHZvbHVtZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkZXZpY2U9IiA8PCBhZGRyZXNzIDw8ICIgdm9sdW1lPSIgPDwgbG9naGV4KHZvbHVtZSk7Ci0gICAgZG9faW5fYnRhX3RocmVhZChGUk9NX0hFUkUsIEJpbmQoJlZjcENvbnRyb2xsZXI6OlNldEFic1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChWY3BDb250cm9sbGVyOjpHZXQoKSksIGFkZHJlc3MsIHZvbHVtZSkpOwotICB9Ci0KLSAgdm9pZCBNdXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVmNwQ29udHJvbGxlcjo6TXV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChWY3BDb250cm9sbGVyOjpHZXQoKSksIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgVW5tdXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGV2aWNlPSIgPDwgYWRkcmVzczsKLSAgICBkb19pbl9idGFfdGhyZWFkKEZST01fSEVSRSwgQmluZCgmVmNwQ29udHJvbGxlcjo6VW5tdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZXRhaW5lZChWY3BDb250cm9sbGVyOjpHZXQoKSksIGFkZHJlc3MpKTsKLSAgfQotCi0gIHZvaWQgQ2xlYW51cCh2b2lkKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fOwotICAgIGRvX2luX2J0YV90aHJlYWQoRlJPTV9IRVJFLCBCaW5kKCZWY3BDb250cm9sbGVyOjpDbGVhblVwKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFZjcENvbnRyb2xsZXJDYWxsYmFja3MqIGNhbGxiYWNrczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1WY3BDb250cm9sbGVySW50ZXJmYWNlKiBidGlmX3ZjcF9nZXRfY29udHJvbGxlcl9pbnRlcmZhY2UoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFWY3BDb250cm9sbGVySW5zdGFuY2UpCi0gICAgVmNwQ29udHJvbGxlckluc3RhbmNlLnJlc2V0KG5ldyBWY3BDb250cm9sbGVySW50ZXJmYWNlSW1wbCgpKTsKLQotICByZXR1cm4gVmNwQ29udHJvbGxlckluc3RhbmNlLmdldCgpOwotfQotCmRpZmYgLS1naXQgYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl92bWNwLmNjIGIvbGVfYXVkaW8vc3lzdGVtL2J0L2J0aWYvc3JjL2J0aWZfdm1jcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0YWM5Yi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvYnRpZi9zcmMvYnRpZl92bWNwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLSNpbmNsdWRlICJidF90eXBlcy5oIgotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0KLSNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+Ci0jaW5jbHVkZSAiYnRpZl9iYXBfY29kZWNfdXRpbHMuaCIKLSNpbmNsdWRlICJidGlmX3ZtY3AuaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXVuc2lnbmVkIGxvbmcgdm9pY2VfY29kZWNfY291bnQsIG1lZGlhX2NvZGVjX2NvdW50LCBxb3Nfc2V0dGluZ3NfY291bnQ7Ci0KLS8vIGhvbGRzIHRoZSB2YWx1ZSBvZiBjdXJyZW50IHByb2ZpbGUgYmVpbmcgcGFyc2VkIGZyb20geG1sCi11aW50OF90IGN1cnJlbnRfcHJvZmlsZSA9IDE7Ci0KLXN0ZDo6dmVjdG9yPGNvZGVjX2NvbmZpZz52bWNwX3ZvaWNlX2NvZGVjOwotc3RkOjp2ZWN0b3I8Y29kZWNfY29uZmlnPnZtY3BfbWVkaWFfY29kZWM7Ci1zdGQ6OnZlY3Rvcjxxb3NfY29uZmlnPnZtY3BfcW9zX2xvd19sYXRfdm9pY2U7Ci1zdGQ6OnZlY3Rvcjxxb3NfY29uZmlnPnZtY3BfcW9zX2xvd19sYXRfbWVkaWE7Ci1zdGQ6OnZlY3Rvcjxxb3NfY29uZmlnPnZtY3BfcW9zX2hpZ2hfcmVsX21lZGlhOwotCi1zdGQ6OnZlY3Rvcjxjb2RlY19jb25maWc+YmFwX3ZvaWNlX2NvZGVjOwotc3RkOjp2ZWN0b3I8Y29kZWNfY29uZmlnPmJhcF9tZWRpYV9jb2RlYzsKLXN0ZDo6dmVjdG9yPHFvc19jb25maWc+YmFwX3Fvc19sb3dfbGF0X3ZvaWNlOwotc3RkOjp2ZWN0b3I8cW9zX2NvbmZpZz5iYXBfcW9zX2xvd19sYXRfbWVkaWE7Ci1zdGQ6OnZlY3Rvcjxxb3NfY29uZmlnPmJhcF9xb3NfaGlnaF9yZWxfbWVkaWE7Ci0KLXN0ZDo6dmVjdG9yPGNvZGVjX2NvbmZpZz5nY3Bfdm9pY2VfY29kZWM7Ci1zdGQ6OnZlY3Rvcjxjb2RlY19jb25maWc+Z2NwX21lZGlhX2NvZGVjOwotc3RkOjp2ZWN0b3I8cW9zX2NvbmZpZz5nY3BfcW9zX2xvd19sYXRfdm9pY2U7Ci1zdGQ6OnZlY3Rvcjxxb3NfY29uZmlnPmdjcF9xb3NfbG93X2xhdF9tZWRpYTsKLQotc3RkOjp2ZWN0b3I8Y29kZWNfY29uZmlnPndtY3BfbWVkaWFfY29kZWM7Ci1zdGQ6OnZlY3Rvcjxxb3NfY29uZmlnPndtY3BfcW9zX2hpZ2hfcmVsX21lZGlhOwotCi12ZWN0b3I8Q29kZWNDb25maWc+IGdldF9hbGxfY29kZWNfY29uZmlncyh1aW50OF90IHByb2ZpbGUsIHVpbnQ4X3QgY29udGV4dCkKLXsKLSAgdmVjdG9yPENvZGVjQ29uZmlnPiByZXRfY29uZmlnOwotICBDb2RlY0NvbmZpZyB0ZW1wX2NvbmZpZzsKLSAgdmVjdG9yPGNvZGVjX2NvbmZpZz4gKnZwdHIgPSBOVUxMOwotCi0gIGlmIChwcm9maWxlID09IFZNQ1ApIHsKLSAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJnZtY3Bfdm9pY2VfY29kZWM7Ci0gICAgfQotICAgIGVsc2UgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJnZtY3BfbWVkaWFfY29kZWM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIG5vIHZhbGlkIGNvbnRleHQgaXMgcHJvdmlkZWQsIHVzZSB2b2ljZSBjb250ZXh0Ci0gICAgICB2cHRyID0gJnZtY3Bfdm9pY2VfY29kZWM7Ci0gICAgfQotICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQkFQKSB7Ci0gICAgaWYgKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCkgewotICAgICAgdnB0ciA9ICZiYXBfdm9pY2VfY29kZWM7Ci0gICAgfQotICAgIGVsc2UgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJmJhcF9tZWRpYV9jb2RlYzsKLSAgICB9IGVsc2UgewotICAgICAgLy8gaWYgbm8gdmFsaWQgY29udGV4dCBpcyBwcm92aWRlZCwgdXNlIHZvaWNlIGNvbnRleHQKLSAgICAgIHZwdHIgPSAmYmFwX3ZvaWNlX2NvZGVjOwotICAgIH0KLSAgfSBlbHNlIGlmIChwcm9maWxlID09IEdDUCkgewotICAgIGlmIChjb250ZXh0ID09IFZPSUNFX0NPTlRFWFQpIHsKLSAgICAgIHZwdHIgPSAmZ2NwX3ZvaWNlX2NvZGVjOwotICAgIH0KLSAgICBlbHNlIGlmKGNvbnRleHQgPT0gTUVESUFfQ09OVEVYVCkgewotICAgICAgdnB0ciA9ICZnY3BfbWVkaWFfY29kZWM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIG5vIHZhbGlkIGNvbnRleHQgaXMgcHJvdmlkZWQsIHVzZSBtZWRpYSBjb250ZXh0Ci0gICAgICB2cHRyID0gJmdjcF9tZWRpYV9jb2RlYzsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBXTUNQKSB7Ci0gICAgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJndtY3BfbWVkaWFfY29kZWM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIG5vIHZhbGlkIGNvbnRleHQgaXMgcHJvdmlkZWQsIHVzZSBtZWRpYSBjb250ZXh0Ci0gICAgICB2cHRyID0gJndtY3BfbWVkaWFfY29kZWM7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCF2cHRyKXsKLSAgICAgcmV0dXJuIHsgfTsKLSAgfQotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8ICh1aW50OF90KXZwdHItPnNpemUoKTsgaSsrKSB7Ci0gICAgbWVtc2V0KCZ0ZW1wX2NvbmZpZywgMCwgc2l6ZW9mKENvZGVjQ29uZmlnKSk7Ci0KLSAgICB0ZW1wX2NvbmZpZy5jb2RlY190eXBlID0gQ29kZWNJbmRleDo6Q09ERUNfSU5ERVhfU09VUkNFX0xDMzsKLQotICAgIHN3aXRjaCAodnB0ci0+YXQoaSkuZnJlcV9pbl9oeikKLSAgICB7Ci0gICAgICBjYXNlIFNBTVBMRV9SQVRFXzgwMDA6Ci0gICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV84MDAwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNBTVBMRV9SQVRFXzI0MDAwOgotICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQU1QTEVfUkFURV8zMjAwMDoKLSAgICAgICAgdGVtcF9jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzMyMDAwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0FNUExFX1JBVEVfNDQxMDA6Ci0gICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHZwdHItPmF0KGkpLmZyYW1lX2R1cl9tc2VjcyA9PSBGUk1fRFVSQVRJT05fN181X01TKQotICAgICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmdGVtcF9jb25maWcsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzdfNSkpOwotICAgIGVsc2UgaWYgKHZwdHItPmF0KGkpLmZyYW1lX2R1cl9tc2VjcyA9PSBGUk1fRFVSQVRJT05fMTBfTVMpCi0gICAgICBVcGRhdGVGcmFtZUR1cmF0aW9uKCZ0ZW1wX2NvbmZpZywgc3RhdGljX2Nhc3Q8dWludDhfdD4oQ29kZWNGcmFtZUR1cmF0aW9uOjpGUkFNRV9EVVJfMTApKTsKLQotICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmdGVtcF9jb25maWcsIHZwdHItPmF0KGkpLm9jdF9wZXJfY29kZWNfZnJtKTsKLQotICAgIHJldF9jb25maWcucHVzaF9iYWNrKHRlbXBfY29uZmlnKTsKLSAgfQotCi0gIHJldHVybiByZXRfY29uZmlnOwotfQotCi12ZWN0b3I8Q29kZWNDb25maWc+IGdldF9wcmVmZXJyZWRfY29kZWNfY29uZmlncyh1aW50OF90IHByb2ZpbGUsIHVpbnQ4X3QgY29udGV4dCkKLXsKLSAgdmVjdG9yPENvZGVjQ29uZmlnPiByZXRfY29uZmlnOwotICBDb2RlY0NvbmZpZyB0ZW1wX2NvbmZpZzsKLSAgdmVjdG9yPGNvZGVjX2NvbmZpZz4gKnZwdHIgPSBOVUxMOwotCi0gIGlmIChwcm9maWxlID09IFZNQ1ApIHsKLSAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJnZtY3Bfdm9pY2VfY29kZWM7Ci0gICAgfQotICAgIGVsc2UgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJnZtY3BfbWVkaWFfY29kZWM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIG5vIHZhbGlkIGNvbnRleHQgaXMgcHJvdmlkZWQsIHVzZSB2b2ljZSBjb250ZXh0Ci0gICAgICB2cHRyID0gJnZtY3Bfdm9pY2VfY29kZWM7Ci0gICAgfQotICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQkFQKSB7Ci0gICAgaWYgKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCkgewotICAgICAgdnB0ciA9ICZiYXBfdm9pY2VfY29kZWM7Ci0gICAgfQotICAgIGVsc2UgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJmJhcF9tZWRpYV9jb2RlYzsKLSAgICB9IGVsc2UgewotICAgICAgLy8gaWYgbm8gdmFsaWQgY29udGV4dCBpcyBwcm92aWRlZCwgdXNlIHZvaWNlIGNvbnRleHQKLSAgICAgIHZwdHIgPSAmYmFwX3ZvaWNlX2NvZGVjOwotICAgIH0KLSAgfSBlbHNlIGlmIChwcm9maWxlID09IEdDUCkgewotICAgIGlmIChjb250ZXh0ID09IFZPSUNFX0NPTlRFWFQpIHsKLSAgICAgIHZwdHIgPSAmZ2NwX3ZvaWNlX2NvZGVjOwotICAgIH0KLSAgICBlbHNlIGlmKGNvbnRleHQgPT0gTUVESUFfQ09OVEVYVCkgewotICAgICAgdnB0ciA9ICZnY3BfbWVkaWFfY29kZWM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIG5vIHZhbGlkIGNvbnRleHQgaXMgcHJvdmlkZWQsIHVzZSBtZWRpYSBjb250ZXh0Ci0gICAgICB2cHRyID0gJmdjcF9tZWRpYV9jb2RlYzsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBXTUNQKSB7Ci0gICAgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKSB7Ci0gICAgICB2cHRyID0gJndtY3BfbWVkaWFfY29kZWM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIG5vIHZhbGlkIGNvbnRleHQgaXMgcHJvdmlkZWQsIHVzZSBtZWRpYSBjb250ZXh0Ci0gICAgICB2cHRyID0gJndtY3BfbWVkaWFfY29kZWM7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCF2cHRyKSB7Ci0gICAgIHJldHVybiB7fTsKLSAgfQotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8ICh1aW50OF90KXZwdHItPnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHZwdHItPmF0KGkpLm1hbmRhdG9yeSA9PSAxKSB7Ci0gICAgICBtZW1zZXQoJnRlbXBfY29uZmlnLCAwLCBzaXplb2YoQ29kZWNDb25maWcpKTsKLQotICAgICAgdGVtcF9jb25maWcuY29kZWNfdHlwZSA9IENvZGVjSW5kZXg6OkNPREVDX0lOREVYX1NPVVJDRV9MQzM7Ci0KLSAgICAgIHN3aXRjaCAodnB0ci0+YXQoaSkuZnJlcV9pbl9oeikKLSAgICAgIHsKLSAgICAgICAgY2FzZSBTQU1QTEVfUkFURV84MDAwOgotICAgICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV84MDAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNBTVBMRV9SQVRFXzE2MDAwOgotICAgICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8xNjAwMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTQU1QTEVfUkFURV8yNDAwMDoKLSAgICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMjQwMDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0FNUExFX1JBVEVfMzIwMDA6Ci0gICAgICAgICAgdGVtcF9jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzMyMDAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTQU1QTEVfUkFURV80ODAwMDoKLSAgICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh2cHRyLT5hdChpKS5mcmFtZV9kdXJfbXNlY3MgPT0gRlJNX0RVUkFUSU9OXzdfNV9NUykKLSAgICAgICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmdGVtcF9jb25maWcsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzdfNSkpOwotICAgICAgZWxzZSBpZiAodnB0ci0+YXQoaSkuZnJhbWVfZHVyX21zZWNzID09IEZSTV9EVVJBVElPTl8xMF9NUykKLSAgICAgICAgVXBkYXRlRnJhbWVEdXJhdGlvbigmdGVtcF9jb25maWcsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSk7Ci0KLSAgICAgIFVwZGF0ZU9jdHNQZXJGcmFtZSgmdGVtcF9jb25maWcsIHZwdHItPmF0KGkpLm9jdF9wZXJfY29kZWNfZnJtKTsKLQotICAgICAgcmV0X2NvbmZpZy5wdXNoX2JhY2sodGVtcF9jb25maWcpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXRfY29uZmlnOwotfQotCi12ZWN0b3I8UW9TQ29uZmlnPiBnZXRfYWxsX3Fvc19wYXJhbXModWludDhfdCBwcm9maWxlLCB1aW50OF90IGNvbnRleHQpCi17Ci0gIHZlY3RvcjxRb1NDb25maWc+IHJldF9jb25maWc7Ci0gIFFvU0NvbmZpZyB0ZW1wX2NvbmZpZzsKLSAgdmVjdG9yPHFvc19jb25maWc+ICp2cHRyID0gTlVMTDsKLQotICBpZiAocHJvZmlsZSA9PSBWTUNQKSB7Ci0gICAgaWYgKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCkKLSAgICAgICB2cHRyID0gICZ2bWNwX3Fvc19sb3dfbGF0X3ZvaWNlOwotICAgIGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfTExfQ09OVEVYVCkKLSAgICAgICB2cHRyID0gJnZtY3BfcW9zX2xvd19sYXRfbWVkaWE7Ci0gICAgZWxzZSBpZiAoY29udGV4dCA9PSBNRURJQV9IUl9DT05URVhUKQotICAgICAgIHZwdHIgPSAmdm1jcF9xb3NfaGlnaF9yZWxfbWVkaWE7Ci0gIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBCQVApIHsKLSAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKQotICAgICAgIHZwdHIgPSAgJmJhcF9xb3NfbG93X2xhdF92b2ljZTsKLSAgICBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0xMX0NPTlRFWFQpCi0gICAgICAgdnB0ciA9ICZiYXBfcW9zX2xvd19sYXRfbWVkaWE7Ci0gICAgZWxzZSBpZiAoY29udGV4dCA9PSBNRURJQV9IUl9DT05URVhUKQotICAgICAgIHZwdHIgPSAmYmFwX3Fvc19oaWdoX3JlbF9tZWRpYTsKLSAgfSBlbHNlIGlmIChwcm9maWxlID09IEdDUCkgewotICAgIGlmIChjb250ZXh0ID09IFZPSUNFX0NPTlRFWFQpCi0gICAgICAgdnB0ciA9ICAmZ2NwX3Fvc19sb3dfbGF0X3ZvaWNlOwotICAgIGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfTExfQ09OVEVYVCkKLSAgICAgICB2cHRyID0gJmdjcF9xb3NfbG93X2xhdF9tZWRpYTsKLSAgfSBlbHNlIGlmIChwcm9maWxlID09IFdNQ1ApIHsKLSAgICBpZiAoY29udGV4dCA9PSBNRURJQV9IUl9DT05URVhUKQotICAgICAgIHZwdHIgPSAmd21jcF9xb3NfaGlnaF9yZWxfbWVkaWE7Ci0gIH0KLQotICBpZiAoIXZwdHIpIHsKLSAgICAgcmV0dXJuIHt9OwotICB9Ci0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKHVpbnQ4X3QpdnB0ci0+c2l6ZSgpOyBpKyspIHsKLSAgICBtZW1zZXQoJnRlbXBfY29uZmlnLCAwLCBzaXplb2YoUW9TQ29uZmlnKSk7Ci0KLSAgICBzd2l0Y2ggKHZwdHItPmF0KGkpLmZyZXFfaW5faHopCi0gICAgewotICAgICAgY2FzZSBTQU1QTEVfUkFURV84MDAwOgotICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNBTVBMRV9SQVRFXzE2MDAwOgotICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfMTYwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQU1QTEVfUkFURV8yNDAwMDoKLSAgICAgICAgdGVtcF9jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzI0MDAwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0FNUExFX1JBVEVfMzIwMDA6Ci0gICAgICAgIHRlbXBfY29uZmlnLnNhbXBsZV9yYXRlID0gQ29kZWNTYW1wbGVSYXRlOjpDT0RFQ19TQU1QTEVfUkFURV8zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQU1QTEVfUkFURV80ODAwMDoKLSAgICAgICAgdGVtcF9jb25maWcuc2FtcGxlX3JhdGUgPSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHRlbXBfY29uZmlnLnNkdV9pbnRfbWljcm9fc2VjcyA9IHZwdHItPmF0KGkpLnNkdV9pbnRfbWljcm9fc2VjczsKLSAgICB0ZW1wX2NvbmZpZy5mcmFtaW5nID0gdnB0ci0+YXQoaSkuZnJhbWluZzsKLSAgICB0ZW1wX2NvbmZpZy5tYXhfc2R1X3NpemUgPSB2cHRyLT5hdChpKS5tYXhfc2R1X3NpemU7Ci0gICAgdGVtcF9jb25maWcucmV0cmFuc19udW0gPSB2cHRyLT5hdChpKS5yZXRyYW5zX251bTsKLSAgICB0ZW1wX2NvbmZpZy5tYXhfdHJhbnNfbGF0ID0gdnB0ci0+YXQoaSkubWF4X3RyYW5zX2xhdDsKLSAgICB0ZW1wX2NvbmZpZy5wcmVzZW50YXRpb25fZGVsYXkgPSB2cHRyLT5hdChpKS5wcmVzZW50YXRpb25fZGVsYXk7Ci0gICAgdGVtcF9jb25maWcubWFuZGF0b3J5ID0gdnB0ci0+YXQoaSkubWFuZGF0b3J5OwotCi0gICAgcmV0X2NvbmZpZy5wdXNoX2JhY2sodGVtcF9jb25maWcpOwotICB9Ci0KLSAgcmV0dXJuIHJldF9jb25maWc7Ci19Ci0KLXZlY3RvcjxRb1NDb25maWc+IGdldF9xb3NfcGFyYW1zX2Zvcl9jb2RlYyh1aW50OF90IHByb2ZpbGUsIHVpbnQ4X3QgY29udGV4dCwgQ29kZWNTYW1wbGVSYXRlIGZyZXEsIHVpbnQ4X3QgZnJhbWVfZHVyLCB1aW50OF90IG9jdGV0cykKLXsKLSAgdmVjdG9yPFFvU0NvbmZpZz4gcmV0X2NvbmZpZzsKLSAgUW9TQ29uZmlnIHRlbXBfY29uZmlnOwotICB2ZWN0b3I8cW9zX2NvbmZpZz4gKnZwdHIgPSBOVUxMOwotICB1aW50MzJfdCBmcmFtZV9kdXJfbWljcm9fc2VjID0gMDsKLSAgdWludDMyX3QgbG9jYWxfZnJlcSA9IDA7Ci0KLSAgaWYgKGZyYW1lX2R1ciA9PSBzdGF0aWNfY2FzdDx1aW50OF90PihDb2RlY0ZyYW1lRHVyYXRpb246OkZSQU1FX0RVUl83XzUpKQotICAgIGZyYW1lX2R1cl9taWNyb19zZWMgPSBGUk1fRFVSQVRJT05fN181X01TICogMTAwMDsKLSAgZWxzZSBpZiAoZnJhbWVfZHVyID09IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KENvZGVjRnJhbWVEdXJhdGlvbjo6RlJBTUVfRFVSXzEwKSkKLSAgICBmcmFtZV9kdXJfbWljcm9fc2VjID0gRlJNX0RVUkFUSU9OXzEwX01TICogMTAwMDsKLQotICBzd2l0Y2ggKGZyZXEpCi0gIHsKLSAgICBjYXNlIENvZGVjU2FtcGxlUmF0ZTo6Q09ERUNfU0FNUExFX1JBVEVfODAwMDoKLSAgICAgIGxvY2FsX2ZyZXEgPSBTQU1QTEVfUkFURV84MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzE2MDAwOgotICAgICAgbG9jYWxfZnJlcSA9IFNBTVBMRV9SQVRFXzE2MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgICAgbG9jYWxfZnJlcSA9IFNBTVBMRV9SQVRFXzI0MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzMyMDAwOgotICAgICAgbG9jYWxfZnJlcSA9IFNBTVBMRV9SQVRFXzMyMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgbG9jYWxfZnJlcSA9IFNBTVBMRV9SQVRFXzQ0MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlY1NhbXBsZVJhdGU6OkNPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgbG9jYWxfZnJlcSA9IFNBTVBMRV9SQVRFXzQ4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKHByb2ZpbGUgPT0gVk1DUCkgewotICAgIGlmIChjb250ZXh0ID09IFZPSUNFX0NPTlRFWFQpCi0gICAgICAgdnB0ciA9ICAmdm1jcF9xb3NfbG93X2xhdF92b2ljZTsKLSAgICBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0xMX0NPTlRFWFQpCi0gICAgICAgdnB0ciA9ICZ2bWNwX3Fvc19sb3dfbGF0X21lZGlhOwotICAgIGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfSFJfQ09OVEVYVCkKLSAgICAgICB2cHRyID0gJnZtY3BfcW9zX2hpZ2hfcmVsX21lZGlhOwotICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQkFQKSB7Ci0gICAgaWYgKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCkKLSAgICAgICB2cHRyID0gICZiYXBfcW9zX2xvd19sYXRfdm9pY2U7Ci0gICAgZWxzZSBpZiAoY29udGV4dCA9PSBNRURJQV9MTF9DT05URVhUKSB7Ci0gICAgICAgQlRJRl9UUkFDRV9JTVAoIiVzOiBmaWxsaW5nIEJBUCBMTCB2cHRyIiwgX19mdW5jX18pOwotICAgICAgIHZwdHIgPSAmYmFwX3Fvc19sb3dfbGF0X21lZGlhOwotICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PSBNRURJQV9IUl9DT05URVhUKSB7Ci0gICAgICAgQlRJRl9UUkFDRV9JTVAoIiVzOiBmaWxsaW5nIEJBUCBIUiB2cHRyIiwgX19mdW5jX18pOwotICAgICAgIHZwdHIgPSAmYmFwX3Fvc19oaWdoX3JlbF9tZWRpYTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBHQ1ApIHsKLSAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKQotICAgICAgIHZwdHIgPSAgJmdjcF9xb3NfbG93X2xhdF92b2ljZTsKLSAgICBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0xMX0NPTlRFWFQpCi0gICAgICAgdnB0ciA9ICZnY3BfcW9zX2xvd19sYXRfbWVkaWE7Ci0gIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBXTUNQKSB7Ci0gICAgaWYgKGNvbnRleHQgPT0gTUVESUFfSFJfQ09OVEVYVCkgewotICAgICAgIEJUSUZfVFJBQ0VfSU1QKCIlczogZmlsbGluZyBXTUNQIEhSIHZwdHIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgdnB0ciA9ICZ3bWNwX3Fvc19oaWdoX3JlbF9tZWRpYTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXZwdHIpIHsKLSAgICAgcmV0dXJuIHsgfTsKLSAgfQotCi0gIEJUSUZfVFJBQ0VfSU1QKCIlczogdnB0ciBzaXplOiAlZCIsIF9fZnVuY19fLCAodWludDhfdCl2cHRyLT5zaXplKCkpOwotICBCVElGX1RSQUNFX0lNUCgiJXM6IGxvY2FsX2ZyZXE6ICVkLCBmcmFtZV9kdXJfbWljcm9fc2VjOiAlZCwgb2N0ZXRzOiAlZCIsCi0gICAgICAgX19mdW5jX18sIGxvY2FsX2ZyZXEsIGZyYW1lX2R1cl9taWNyb19zZWMsIG9jdGV0cyk7Ci0KLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKHVpbnQ4X3QpdnB0ci0+c2l6ZSgpOyBpKyspIHsKLSAgICBCVElGX1RSQUNFX0lNUCgiJXM6IGZyZXFfaW5faHo6ICVkLCBzZHVfaW50X21pY3JvX3NlY3M6ICVkLCBtYXhfc2R1X3NpemU6ICVkIiwKLSAgICAgICBfX2Z1bmNfXywgdnB0ci0+YXQoaSkuZnJlcV9pbl9oeiwgdnB0ci0+YXQoaSkuc2R1X2ludF9taWNyb19zZWNzLAotICAgICAgIHZwdHItPmF0KGkpLm1heF9zZHVfc2l6ZSk7Ci0gICAgaWYgKHZwdHItPmF0KGkpLmZyZXFfaW5faHogPT0gbG9jYWxfZnJlcSAmJgotICAgICAgICB2cHRyLT5hdChpKS5zZHVfaW50X21pY3JvX3NlY3MgPT0gZnJhbWVfZHVyX21pY3JvX3NlYyAmJgotICAgICAgICB2cHRyLT5hdChpKS5tYXhfc2R1X3NpemUgPT0gb2N0ZXRzKSB7Ci0gICAgICBCVElGX1RSQUNFX0lNUCgiJXM6IExvY2FsIGFuZCB2cHRyIG1hdGNoZWQuIiwgX19mdW5jX18pOwotICAgICAgbWVtc2V0KCZ0ZW1wX2NvbmZpZywgMCwgc2l6ZW9mKFFvU0NvbmZpZykpOwotCi0gICAgICB0ZW1wX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IGZyZXE7Ci0gICAgICB0ZW1wX2NvbmZpZy5zZHVfaW50X21pY3JvX3NlY3MgPSB2cHRyLT5hdChpKS5zZHVfaW50X21pY3JvX3NlY3M7Ci0gICAgICB0ZW1wX2NvbmZpZy5mcmFtaW5nID0gdnB0ci0+YXQoaSkuZnJhbWluZzsKLSAgICAgIHRlbXBfY29uZmlnLm1heF9zZHVfc2l6ZSA9IHZwdHItPmF0KGkpLm1heF9zZHVfc2l6ZTsKLSAgICAgIHRlbXBfY29uZmlnLnJldHJhbnNfbnVtID0gdnB0ci0+YXQoaSkucmV0cmFuc19udW07Ci0gICAgICB0ZW1wX2NvbmZpZy5tYXhfdHJhbnNfbGF0ID0gdnB0ci0+YXQoaSkubWF4X3RyYW5zX2xhdDsKLSAgICAgIHRlbXBfY29uZmlnLnByZXNlbnRhdGlvbl9kZWxheSA9IHZwdHItPmF0KGkpLnByZXNlbnRhdGlvbl9kZWxheTsKLSAgICAgIHRlbXBfY29uZmlnLm1hbmRhdG9yeSA9IHZwdHItPmF0KGkpLm1hbmRhdG9yeTsKLQotICAgICAgcmV0X2NvbmZpZy5wdXNoX2JhY2sodGVtcF9jb25maWcpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXRfY29uZmlnOwotfQotCi1ib29sIGlzX2xlYWYoeG1sTm9kZSAqbm9kZSkKLXsKLSAgeG1sTm9kZSAqY2hpbGQgPSBub2RlLT5jaGlsZHJlbjsKLSAgd2hpbGUoY2hpbGQpCi0gIHsKLSAgICBpZihjaGlsZC0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIHBhcnNlQ29kZWNDb25maWdzKHhtbE5vZGUgKmlucHV0X25vZGUsIGludCBjb250ZXh0KQotewotICAgc3RhY2s8eG1sTm9kZSo+IHByb2ZpbGVfbm9kZV9zdGFjazsKLSAgIHVuc2lnbmVkIGludCBUZW1wQ29kZWNDb3VudCA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgVGVtcEZpZWxkc0NvdW50ID0gMDsKLSAgIHhtbE5vZGUgKkZpcnN0Q2hpbGQgPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChpbnB1dF9ub2RlKTsKLSAgIHVuc2lnbmVkIGxvbmcgQ29kZWNGaWVsZHMgPSB4bWxDaGlsZEVsZW1lbnRDb3VudChGaXJzdENoaWxkKTsKLSAgIGNvZGVjX2NvbmZpZyB0ZW1wX2NvZGVjX2NvbmZpZzsKLSAgIG1lbXNldCgmdGVtcF9jb2RlY19jb25maWcsIDAsIHNpemVvZihjb2RlY19jb25maWcpKTsKLQotCi0gICBCVElGX1RSQUNFX0lNUCgiY29kZWMgRmllbGRzIGNvdW50IGlzICVsZCBcbiIsIENvZGVjRmllbGRzKTsKLSAgIGZvciAoeG1sTm9kZSAqbm9kZSA9IGlucHV0X25vZGUtPmNoaWxkcmVuOyBub2RlICE9IE5VTEwgfHwgIXByb2ZpbGVfbm9kZV9zdGFjay5lbXB0eSgpOyBub2RlID0gbm9kZS0+Y2hpbGRyZW4pCi0gICB7Ci0gICAgIGlmIChub2RlID09IE5VTEwpCi0gICAgIHsKLSAgICAgICBub2RlID0gcHJvZmlsZV9ub2RlX3N0YWNrLnRvcCgpOwotICAgICAgIHByb2ZpbGVfbm9kZV9zdGFjay5wb3AoKTsKLSAgICAgfQotCi0gICAgIGlmKG5vZGUpCi0gICAgIHsKLSAgICAgICBpZihub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpCi0gICAgICAgewotICAgICAgICAgaWYoKGlzX2xlYWYobm9kZSkpKQotICAgICAgICAgewotICAgICAgICAgICBzdHJpbmcgY29udGVudCA9IChjb25zdCBjaGFyKikoeG1sTm9kZUdldENvbnRlbnQobm9kZSkpOwotICAgICAgICAgICBpZiAoY29udGVudFswXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYoIXhtbFN0cmNtcChub2RlLT5uYW1lLChjb25zdCB4bWxDaGFyKikiU2FtcGxpbmdGcmVxdWVuY3lJbkh6IikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZW1wX2NvZGVjX2NvbmZpZy5mcmVxX2luX2h6ID0gYXRvaShjb250ZW50LmNfc3RyKCkpOwotICAgICAgICAgICAgIFRlbXBGaWVsZHNDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoIXhtbFN0cmNtcChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciopIkZyYW1lRHVyYXRpb25Jbk1pY3JvU2VjcyIpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVtcF9jb2RlY19jb25maWcuZnJhbWVfZHVyX21zZWNzID0gKGZsb2F0KWF0b2koY29udGVudC5jX3N0cigpKS8xMDAwOwotICAgICAgICAgICAgIFRlbXBGaWVsZHNDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoIXhtbFN0cmNtcChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciopIk9jdGV0c1BlckNvZGVjRnJhbWUiKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlbXBfY29kZWNfY29uZmlnLm9jdF9wZXJfY29kZWNfZnJtID0gYXRvaShjb250ZW50LmNfc3RyKCkpOwotICAgICAgICAgICAgIFRlbXBGaWVsZHNDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoIXhtbFN0cmNtcChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciopIk1hbmRhdG9yeSIpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVtcF9jb2RlY19jb25maWcubWFuZGF0b3J5ID0gYXRvaShjb250ZW50LmNfc3RyKCkpOwotICAgICAgICAgICAgIFRlbXBGaWVsZHNDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZihUZW1wRmllbGRzQ291bnQgPT0gQ29kZWNGaWVsZHMpCi0gICAgICAgICB7Ci0gICAgICAgICAgIGlmIChjdXJyZW50X3Byb2ZpbGUgPT0gVk1DUCkgewotICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IFZPSUNFX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgIHZtY3Bfdm9pY2VfY29kZWMucHVzaF9iYWNrKHRlbXBfY29kZWNfY29uZmlnKTsKLSAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfQ09OVEVYVCkgewotICAgICAgICAgICAgICAgdm1jcF9tZWRpYV9jb2RlYy5wdXNoX2JhY2sodGVtcF9jb2RlY19jb25maWcpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Byb2ZpbGUgPT0gQkFQKSB7Ci0gICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCkgewotICAgICAgICAgICAgICAgYmFwX3ZvaWNlX2NvZGVjLnB1c2hfYmFjayh0ZW1wX2NvZGVjX2NvbmZpZyk7Ci0gICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgIGJhcF9tZWRpYV9jb2RlYy5wdXNoX2JhY2sodGVtcF9jb2RlY19jb25maWcpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Byb2ZpbGUgPT0gR0NQKSB7Ci0gICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCkgewotICAgICAgICAgICAgICAgZ2NwX3ZvaWNlX2NvZGVjLnB1c2hfYmFjayh0ZW1wX2NvZGVjX2NvbmZpZyk7Ci0gICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgIGdjcF9tZWRpYV9jb2RlYy5wdXNoX2JhY2sodGVtcF9jb2RlY19jb25maWcpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Byb2ZpbGUgPT0gV01DUCkgewotICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IE1FRElBX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfSU1QKCIlczogcGFyc2VkIGNvZGVjIGNvbmZpZyBmb3Igd21jcCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgIHdtY3BfbWVkaWFfY29kZWMucHVzaF9iYWNrKHRlbXBfY29kZWNfY29uZmlnKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBUZW1wRmllbGRzQ291bnQgPSAwOwotICAgICAgICAgICBUZW1wQ29kZWNDb3VudCsrOwotICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgIGlmKG5vZGUtPm5leHQgIT0gTlVMTCkKLSAgICAgICB7Ci0gICAgICAgICBwcm9maWxlX25vZGVfc3RhY2sucHVzaChub2RlLT5uZXh0KTsKLSAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgIH0KLSAgICAgfSAvLyBlbmQgb2YgaWYgKG5vZGUpCi0gICB9IC8vIGVuZCBvZiBmb3IKLSAgIGlmKGNvbnRleHQgPT0gVk9JQ0VfQ09OVEVYVCAmJiBUZW1wQ29kZWNDb3VudCA9PSB2b2ljZV9jb2RlY19jb3VudCkKLSAgIHsKLSAgICAgaWYgKGN1cnJlbnRfcHJvZmlsZSA8IEdDUCkgewotICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJBbGwgJWxkIENHIGNvZGVjcyBhcmUgcGFyc2VkIHN1Y2Nlc3NmdWxseVxuIiwgdm9pY2VfY29kZWNfY291bnQpOwotICAgICB9IGVsc2UgewotICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJBbGwgJWxkIEdBVCBSeCBjb2RlY3MgYXJlIHBhcnNlZCBzdWNjZXNzZnVsbHlcbiIsIHZvaWNlX2NvZGVjX2NvdW50KTsKLSAgICAgfQotICAgfQotICAgZWxzZSBpZihjb250ZXh0ID09IE1FRElBX0NPTlRFWFQgJiYgVGVtcENvZGVjQ291bnQgPT0gbWVkaWFfY29kZWNfY291bnQpCi0gICB7Ci0gICAgIGlmIChjdXJyZW50X3Byb2ZpbGUgPCBHQ1ApIHsKLSAgICAgICBCVElGX1RSQUNFX0lNUCgiQWxsICVsZCBVTVMgY29kZWNzIGFyZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5XG4iLCBtZWRpYV9jb2RlY19jb3VudCk7Ci0gICAgIH0gZWxzZSBpZiAoY3VycmVudF9wcm9maWxlID09IEdDUCkgewotICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJBbGwgJWxkIEdBVCBUeCBjb2RlY3MgYXJlIHBhcnNlZCBzdWNjZXNzZnVsbHlcbiIsIG1lZGlhX2NvZGVjX2NvdW50KTsKLSAgICAgfSBlbHNlIGlmIChjdXJyZW50X3Byb2ZpbGUgPT0gV01DUCkgewotICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJBbGwgJWxkIFdNIFJ4IGNvZGVjcyBhcmUgcGFyc2VkIHN1Y2Nlc3NmdWxseVxuIiwgbWVkaWFfY29kZWNfY291bnQpOwotICAgICB9Ci0gICB9Ci19Ci0KLXZvaWQgcGFyc2VRb1NDb25maWdzKHhtbE5vZGUgKlFvU0lucHV0Tm9kZSwgaW50IGNvbnRleHQpCi17Ci0gICBzdGFjazx4bWxOb2RlKj4gUW9TX1N0YWNrOwotICAgdW5zaWduZWQgaW50IFRlbXBRb1NDb2RlY0NvdW50ID0gMDsKLSAgIHVuc2lnbmVkIGludCBUZW1wUW9TRmllbGRzQ291bnQgPSAwOwotICAgeG1sTm9kZSAqIEZpcnN0Q2hpbGQgPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChRb1NJbnB1dE5vZGUpOwotICAgdW5zaWduZWQgbG9uZyBRb1NDb2RlY0ZpZWxkcyA9IHhtbENoaWxkRWxlbWVudENvdW50KEZpcnN0Q2hpbGQpOwotICAgcW9zX2NvbmZpZyB0ZW1wX3Fvc19jb25maWcgOwotICAgbWVtc2V0KCZ0ZW1wX3Fvc19jb25maWcsIDAsIHNpemVvZihxb3NfY29uZmlnKSk7Ci0KLSAgIEJUSUZfVFJBQ0VfSU1QKCJRb1MgRmllbGRzIGNvdW50ICVsZCBcbiIsIFFvU0NvZGVjRmllbGRzKTsKLSAgIGZvciAoeG1sTm9kZSAqbm9kZSA9IFFvU0lucHV0Tm9kZS0+Y2hpbGRyZW47IG5vZGUgIT0gTlVMTCB8fCAhUW9TX1N0YWNrLmVtcHR5KCk7IG5vZGUgPSBub2RlLT5jaGlsZHJlbikKLSAgIHsKLSAgICAgaWYgKG5vZGUgPT0gTlVMTCkKLSAgICAgewotICAgICAgIG5vZGUgPSBRb1NfU3RhY2sudG9wKCk7Ci0gICAgICAgUW9TX1N0YWNrLnBvcCgpOwotICAgICB9Ci0gICAgIGlmKG5vZGUpCi0gICAgIHsKLSAgICAgICBpZihub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpCi0gICAgICAgewotICAgICAgICAgaWYoaXNfbGVhZihub2RlKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgc3RyaW5nIGNvbnRlbnQgPSAoY29uc3QgY2hhciopKHhtbE5vZGVHZXRDb250ZW50KG5vZGUpKTsKLSAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT0gJ1wwJykgewotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmKCF4bWxTdHJjbXAobm9kZS0+bmFtZSwoY29uc3QgeG1sQ2hhciopIlNhbXBsaW5nRnJlcXVlbmN5SW5IeiIpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVtcF9xb3NfY29uZmlnLmZyZXFfaW5faHogPSBhdG9pKGNvbnRlbnQuY19zdHIoKSk7Ci0gICAgICAgICAgICAgVGVtcFFvU0ZpZWxkc0NvdW50Kys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSBpZigheG1sU3RyY21wKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyKikiU0RVSW50ZXJ2YWxJbk1pY3JvU2VjcyIpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVtcF9xb3NfY29uZmlnLnNkdV9pbnRfbWljcm9fc2VjcyA9IGF0b2koY29udGVudC5jX3N0cigpKTsKLSAgICAgICAgICAgICBUZW1wUW9TRmllbGRzQ291bnQrKzsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmKCF4bWxTdHJjbXAobm9kZS0+bmFtZSwgKGNvbnN0IHhtbENoYXIqKSJGcmFtaW5nIikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZW1wX3Fvc19jb25maWcuZnJhbWluZyA9IGF0b2koY29udGVudC5jX3N0cigpKTsKLSAgICAgICAgICAgICBUZW1wUW9TRmllbGRzQ291bnQrKzsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmKCF4bWxTdHJjbXAobm9kZS0+bmFtZSwgKGNvbnN0IHhtbENoYXIqKSJNYXhTRFVTaXplIikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZW1wX3Fvc19jb25maWcubWF4X3NkdV9zaXplID0gYXRvaShjb250ZW50LmNfc3RyKCkpOwotICAgICAgICAgICAgIFRlbXBRb1NGaWVsZHNDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoIXhtbFN0cmNtcChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciopIlJldHJhbnNtaXNzaW9uTnVtYmVyIikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZW1wX3Fvc19jb25maWcucmV0cmFuc19udW0gPSBhdG9pKGNvbnRlbnQuY19zdHIoKSk7Ci0gICAgICAgICAgICAgVGVtcFFvU0ZpZWxkc0NvdW50Kys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSBpZigheG1sU3RyY21wKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyKikiTWF4VHJhbnNwb3J0TGF0ZW5jeSIpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVtcF9xb3NfY29uZmlnLm1heF90cmFuc19sYXQgPSBhdG9pKGNvbnRlbnQuY19zdHIoKSk7Ci0gICAgICAgICAgICAgVGVtcFFvU0ZpZWxkc0NvdW50Kys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSBpZigheG1sU3RyY21wKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyKikiUHJlc2VudGF0aW9uRGVsYXkiKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlbXBfcW9zX2NvbmZpZy5wcmVzZW50YXRpb25fZGVsYXkgPSBhdG9pKGNvbnRlbnQuY19zdHIoKSk7Ci0gICAgICAgICAgICAgVGVtcFFvU0ZpZWxkc0NvdW50Kys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSBpZigheG1sU3RyY21wKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyKikiTWFuZGF0b3J5IikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZW1wX3Fvc19jb25maWcubWFuZGF0b3J5ID0gYXRvaShjb250ZW50LmNfc3RyKCkpOwotICAgICAgICAgICAgIFRlbXBRb1NGaWVsZHNDb3VudCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmKFRlbXBRb1NGaWVsZHNDb3VudCA9PSBRb1NDb2RlY0ZpZWxkcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihjdXJyZW50X3Byb2ZpbGUgPT0gVk1DUCkgewotICAgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKSB7Ci0gICAgICAgICAgICAgICAgdm1jcF9xb3NfbG93X2xhdF92b2ljZS5wdXNoX2JhY2sodGVtcF9xb3NfY29uZmlnKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0xMX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgICB2bWNwX3Fvc19sb3dfbGF0X21lZGlhLnB1c2hfYmFjayh0ZW1wX3Fvc19jb25maWcpOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfSFJfQ09OVEVYVCkgewotICAgICAgICAgICAgICAgIHZtY3BfcW9zX2hpZ2hfcmVsX21lZGlhLnB1c2hfYmFjayh0ZW1wX3Fvc19jb25maWcpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYoY3VycmVudF9wcm9maWxlID09IEJBUCkgewotICAgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKSB7Ci0gICAgICAgICAgICAgICAgYmFwX3Fvc19sb3dfbGF0X3ZvaWNlLnB1c2hfYmFjayh0ZW1wX3Fvc19jb25maWcpOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfTExfQ09OVEVYVCkgewotICAgICAgICAgICAgICAgIGJhcF9xb3NfbG93X2xhdF9tZWRpYS5wdXNoX2JhY2sodGVtcF9xb3NfY29uZmlnKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ID09IE1FRElBX0hSX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgICBiYXBfcW9zX2hpZ2hfcmVsX21lZGlhLnB1c2hfYmFjayh0ZW1wX3Fvc19jb25maWcpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYoY3VycmVudF9wcm9maWxlID09IEdDUCkgewotICAgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBWT0lDRV9DT05URVhUKSB7Ci0gICAgICAgICAgICAgICAgZ2NwX3Fvc19sb3dfbGF0X3ZvaWNlLnB1c2hfYmFjayh0ZW1wX3Fvc19jb25maWcpOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT0gTUVESUFfTExfQ09OVEVYVCkgewotICAgICAgICAgICAgICAgIGdjcF9xb3NfbG93X2xhdF9tZWRpYS5wdXNoX2JhY2sodGVtcF9xb3NfY29uZmlnKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmKGN1cnJlbnRfcHJvZmlsZSA9PSBXTUNQKSB7Ci0gICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IE1FRElBX0hSX0NPTlRFWFQpIHsKLSAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0lNUCgiJXM6IHBhcnNlZCBxb3MgY29uZmlnIGZvciB3bWNwIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHdtY3BfcW9zX2hpZ2hfcmVsX21lZGlhLnB1c2hfYmFjayh0ZW1wX3Fvc19jb25maWcpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRlbXBRb1NGaWVsZHNDb3VudCA9IDA7Ci0gICAgICAgICAgICBUZW1wUW9TQ29kZWNDb3VudCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgIGlmKG5vZGUtPm5leHQgIT0gTlVMTCkKLSAgICAgICB7Ci0gICAgICAgICBRb1NfU3RhY2sucHVzaChub2RlLT5uZXh0KTsKLSAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgIH0KLQotICAgIH0KLSAgfQotICBpZihUZW1wUW9TQ29kZWNDb3VudCA9PSBxb3Nfc2V0dGluZ3NfY291bnQpCi0gIHsKLSAgICBpZihjb250ZXh0ID09IFZPSUNFX0NPTlRFWFQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfcHJvZmlsZSA8IEdDUCkgewotICAgICAgICBCVElGX1RSQUNFX0lNUCgiQWxsICVsZCBDRyBRb3MgQ29uZmlnIGFyZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5XG4iLCBxb3Nfc2V0dGluZ3NfY291bnQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRJRl9UUkFDRV9JTVAoIkFsbCAlbGQgR0FUIFJ4IFFvcyBDb25maWcgYXJlIHBhcnNlZCBzdWNjZXNzZnVsbHlcbiIsIHFvc19zZXR0aW5nc19jb3VudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoY29udGV4dCA9PSBNRURJQV9DT05URVhUKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X3Byb2ZpbGUgPCBHQ1ApIHsKLSAgICAgICAgQlRJRl9UUkFDRV9JTVAoIkFsbCAlbGQgVU1TIFFvcyBDb25maWcgYXJlIHBhcnNlZCBzdWNjZXNzZnVsbHlcbiIsIHFvc19zZXR0aW5nc19jb3VudCk7Ci0gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfcHJvZmlsZSA9PSBHQ1ApIHsKLSAgICAgICAgQlRJRl9UUkFDRV9JTVAoIkFsbCAlbGQgR0FUIFR4IFFvcyBDb25maWcgYXJlIHBhcnNlZCBzdWNjZXNzZnVsbHlcbiIsIHFvc19zZXR0aW5nc19jb3VudCk7Ci0gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfcHJvZmlsZSA9PSBXTUNQKSB7Ci0gICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJBbGwgJWxkIFdNIFJ4IFFvcyBDb25maWcgYXJlIHBhcnNlZCBzdWNjZXNzZnVsbHlcbiIsIHFvc19zZXR0aW5nc19jb3VudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgcGFyc2VfeG1sKHhtbE5vZGUgKmlucHV0Tm9kZSkKLXsKLSAgIHN0YWNrPHhtbE5vZGUqPiBTOwotICAgZm9yICh4bWxOb2RlICpub2RlID0gaW5wdXROb2RlOyBub2RlICE9IE5VTEwgfHwgIVMuZW1wdHkoKTsgbm9kZSA9IG5vZGUtPmNoaWxkcmVuKQotICAgewotICAgIGlmIChub2RlID09IE5VTEwpCi0gICAgewotICAgICAgIG5vZGUgPSBTLnRvcCgpOwotICAgICAgIFMucG9wKCk7Ci0gICAgfQotICAgIGlmIChub2RlKQotICAgIHsKLSAgICAgIGlmIChub2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGlmICghKGlzX2xlYWYobm9kZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nIGNvbnRlbnQgPSAoY29uc3QgY2hhciAqKSAoeG1sTm9kZUdldENvbnRlbnQgKG5vZGUpKTsKLSAgICAgICAgICBpZiAoY29udGVudFswXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCF4bWxTdHJjbXAgKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyICopICJWTUNQIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJWTUNQIGNvbmZpZ3MgYmVpbmcgcGFyc2VkXG4iKTsKLSAgICAgICAgICAgICBjdXJyZW50X3Byb2ZpbGUgPSBWTUNQOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIXhtbFN0cmNtcCAobm9kZS0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgIkJBUCIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBCVElGX1RSQUNFX0lNUCgiQkFQIGNvbmZpZ3MgYmVpbmcgcGFyc2VkXG4iKTsKLSAgICAgICAgICAgICBjdXJyZW50X3Byb2ZpbGUgPSBCQVA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgheG1sU3RyY21wIChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSAiR0NQIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJHQ1AgY29uZmlncyBiZWluZyBwYXJzZWRcbiIpOwotICAgICAgICAgICAgIGN1cnJlbnRfcHJvZmlsZSA9IEdDUDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCF4bWxTdHJjbXAgKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyICopICJXTUNQIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgIEJUSUZfVFJBQ0VfSU1QKCJXTUNQIGNvbmZpZ3MgYmVpbmcgcGFyc2VkXG4iKTsKLSAgICAgICAgICAgICBjdXJyZW50X3Byb2ZpbGUgPSBXTUNQOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICgheG1sU3RyY21wIChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSAiQ29kZWNDYXBhYmlsaXRpZXNGb3JWb2ljZSIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZvaWNlX2NvZGVjX2NvdW50ID0geG1sQ2hpbGRFbGVtZW50Q291bnQobm9kZSk7Ci0gICAgICAgICAgICBwYXJzZUNvZGVjQ29uZmlncyhub2RlLCBWT0lDRV9DT05URVhUKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIXhtbFN0cmNtcCAobm9kZS0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgIkNvZGVjQ2FwYWJpbGl0aWVzRm9yTWVkaWEiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZWRpYV9jb2RlY19jb3VudCA9IHhtbENoaWxkRWxlbWVudENvdW50KG5vZGUpOwotICAgICAgICAgICAgcGFyc2VDb2RlY0NvbmZpZ3Mobm9kZSwgTUVESUFfQ09OVEVYVCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCF4bWxTdHJjbXAgKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyICopICJRb3NTZXR0aW5nc0Zvckxvd0xhdGVuY3lWb2ljZSIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHFvc19zZXR0aW5nc19jb3VudCA9IHhtbENoaWxkRWxlbWVudENvdW50KG5vZGUpOwotICAgICAgICAgICAgcGFyc2VRb1NDb25maWdzKG5vZGUsIFZPSUNFX0NPTlRFWFQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgheG1sU3RyY21wIChub2RlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSAiUW9zU2V0dGluZ3NGb3JMb3dMYXRlbmN5TWVkaWEiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBxb3Nfc2V0dGluZ3NfY291bnQgPSB4bWxDaGlsZEVsZW1lbnRDb3VudChub2RlKTsKLSAgICAgICAgICAgIHBhcnNlUW9TQ29uZmlncyhub2RlLCBNRURJQV9MTF9DT05URVhUKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIXhtbFN0cmNtcCAobm9kZS0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgIlFvc1NldHRpbmdzRm9ySGlnaFJlbGlhYmlsaXR5TWVkaWEiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBxb3Nfc2V0dGluZ3NfY291bnQgPSB4bWxDaGlsZEVsZW1lbnRDb3VudChub2RlKTsKLSAgICAgICAgICAgIHBhcnNlUW9TQ29uZmlncyhub2RlLCBNRURJQV9IUl9DT05URVhUKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmKG5vZGUtPm5leHQgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgUy5wdXNoKG5vZGUgLT4gbmV4dCk7Ci0gICAgICB9Ci0gICAgfQotICAgfQotfQotCi12b2lkIGJ0aWZfdm1jcF9pbml0KCkgewotICB4bWxEb2MgKmRvYyA9IE5VTEw7Ci0gIHhtbE5vZGUgKnJvb3RfZWxlbWVudCA9IE5VTEw7Ci0KLSAgZG9jID0geG1sUmVhZEZpbGUoTEVBVURJT19DT05GSUdfUEFUSCwgTlVMTCwgMCk7Ci0gIGlmIChkb2MgPT0gTlVMTCkgewotICAgIEJUSUZfVFJBQ0VfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSB0aGUgWE1MIGZpbGUiKTsKLSAgfQotCi0gIHJvb3RfZWxlbWVudCA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gIHBhcnNlX3htbChyb290X2VsZW1lbnQpOwotICB4bWxGcmVlRG9jKGRvYyk7Ci0gIHhtbENsZWFudXBQYXJzZXIoKTsKLQotICAvL1JlZ2lzdGVyIEF1ZGlvIEdhbWluZyBTZXJ2aWNlIFVVSUQgKEdDUCkgd2l0aCBHYXR0YwotICBidGlmX3JlZ2lzdGVyX3V1aWRfc3J2Y19kaXNjKGJsdWV0b290aDo6VXVpZDo6RnJvbVN0cmluZygiMTI5OTRiN2UtNmQ0Ny00MjE1LThjOWUtYWFlOWExMDk1YmEzIikpOwotCi0gIC8vUmVnaXN0ZXIgV2lyZWxlc3MgTWljcm9waG9uZSBDb25maWd1cmF0aW9uIFNlcnZpY2UgVVVJRCAoV01DUCkgd2l0aCBHYXR0YwotICBidGlmX3JlZ2lzdGVyX3V1aWRfc3J2Y19kaXNjKGJsdWV0b290aDo6VXVpZDo6RnJvbVN0cmluZygiMjU4N2RiM2MtY2U3MC00ZmM5LTkzNWYtNzc3YWI0MTg4ZmQ3IikpOwotfQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vc3lzdGVtL2J0L2NvbW1vbi9zdGF0ZV9tYWNoaW5lLmggYi9sZV9hdWRpby9zeXN0ZW0vYnQvY29tbW9uL3N0YXRlX21hY2hpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkOTJkMi4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby9zeXN0ZW0vYnQvY29tbW9uL3N0YXRlX21hY2hpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgY29tbW9uIHsKLQotLyoqCi0gKiBTdGF0ZSBtYWNoaW5lIHVzZWQgYnkgQmx1ZXRvb3RoIG5hdGl2ZSBzdGFjay4KLSAqLwotY2xhc3MgU3RhdGVNYWNoaW5lIHsKLSBwdWJsaWM6Ci0gIGVudW0geyBrU3RhdGVJbnZhbGlkID0gLTEgfTsKLQotICAvKioKLSAgICogQSBjbGFzcyB0byByZXByZXNlbnQgdGhlIHN0YXRlIGluIHRoZSBTdGF0ZSBNYWNoaW5lLgotICAgKi8KLSAgY2xhc3MgU3RhdGUgewotICAgIGZyaWVuZCBjbGFzcyBTdGF0ZU1hY2hpbmU7Ci0KLSAgIHB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzbSB0aGUgU3RhdGUgTWFjaGluZSB0byB1c2UKLSAgICAgKiBAcGFyYW0gc3RhdGVfaWQgdGhlIHVuaXF1ZSBTdGF0ZSBJRC4gSXQgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4KLSAgICAgKi8KLSAgICBTdGF0ZShTdGF0ZU1hY2hpbmUmIHNtLCBpbnQgc3RhdGVfaWQpIDogc21fKHNtKSwgc3RhdGVfaWRfKHN0YXRlX2lkKSB7fQotCi0gICAgdmlydHVhbCB+U3RhdGUoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFuIGV2ZW50LgotICAgICAqIFRPRE86IFRoZSBhcmd1bWVudHMgYXJlIHdyb25nIC0gdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLSAgICAgKiBXaWxsIGJlIHJlcGxhY2VkIGxhdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0eXBlCi0gICAgICogQHBhcmFtIHBfZGF0YSB0aGUgZXZlbnQgZGF0YQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvY2Vzc2luZyB3YXMgY29tcGxldGVkLCBvdGhlcndpc2UgZmFsc2UKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgUHJvY2Vzc0V2ZW50KHVpbnQzMl90IGV2ZW50LCB2b2lkKiBwX2RhdGEpID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgU3RhdGUgSUQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBTdGF0ZSBJRAotICAgICAqLwotICAgIGludCBTdGF0ZUlkKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfaWRfOyB9Ci0KLSAgIHByb3RlY3RlZDoKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhIHN0YXRlIGlzIGVudGVyZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIE9uRW50ZXIoKSB7fQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYSBzdGF0ZSBpcyBleGl0ZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIE9uRXhpdCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2l0aW9uIHRoZSBTdGF0ZSBNYWNoaW5lIHRvIGEgbmV3IHN0YXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc3Rfc3RhdGVfaWQgdGhlIHN0YXRlIElEIHRvIHRyYW5zaXRpb24gdG8uIEl0IG11c3QgYmUgb25lCi0gICAgICogb2YgdGhlIHVuaXF1ZSBzdGF0ZSBJRHMgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZSB3YXMgY3JlYXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIFRyYW5zaXRpb25UbyhpbnQgZGVzdF9zdGF0ZV9pZCkgeyBzbV8uVHJhbnNpdGlvblRvKGRlc3Rfc3RhdGVfaWQpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2l0aW9uIHRoZSBTdGF0ZSBNYWNoaW5lIHRvIGEgbmV3IHN0YXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc3Rfc3RhdGUgdGhlIHN0YXRlIHRvIHRyYW5zaXRpb24gdG8uIEl0IGNhbm5vdCBiZSBudWxscHRyLgotICAgICAqLwotICAgIHZvaWQgVHJhbnNpdGlvblRvKFN0YXRlTWFjaGluZTo6U3RhdGUqIGRlc3Rfc3RhdGUpIHsKLSAgICAgIHNtXy5UcmFuc2l0aW9uVG8oZGVzdF9zdGF0ZSk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIFN0YXRlTWFjaGluZSYgc21fOwotICAgIGludCBzdGF0ZV9pZF87Ci0gIH07Ci0KLSAgU3RhdGVNYWNoaW5lKCkKLSAgICAgIDogaW5pdGlhbF9zdGF0ZV8obnVsbHB0ciksCi0gICAgICAgIHByZXZpb3VzX3N0YXRlXyhudWxscHRyKSwKLSAgICAgICAgY3VycmVudF9zdGF0ZV8obnVsbHB0cikge30KLSAgflN0YXRlTWFjaGluZSgpIHsKLSAgICBmb3IgKGF1dG8mIGt2IDogc3RhdGVzXykgZGVsZXRlIGt2LnNlY29uZDsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCB0aGUgU3RhdGUgTWFjaGluZSBvcGVyYXRpb24uCi0gICAqLwotICB2b2lkIFN0YXJ0KCkgeyBUcmFuc2l0aW9uVG8oaW5pdGlhbF9zdGF0ZV8pOyB9Ci0KLSAgLyoqCi0gICAqIFF1aXQgdGhlIFN0YXRlIE1hY2hpbmUgb3BlcmF0aW9uLgotICAgKi8KLSAgdm9pZCBRdWl0KCkgeyBwcmV2aW91c19zdGF0ZV8gPSBjdXJyZW50X3N0YXRlXyA9IG51bGxwdHI7IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IFN0YXRlIElELgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IFN0YXRlIElECi0gICAqLwotICBpbnQgU3RhdGVJZCgpIGNvbnN0IHsKLSAgICBpZiAoY3VycmVudF9zdGF0ZV8gIT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuIGN1cnJlbnRfc3RhdGVfLT5TdGF0ZUlkKCk7Ci0gICAgfQotICAgIHJldHVybiBrU3RhdGVJbnZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcHJldmlvdXMgY3VycmVudCBTdGF0ZSBJRC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgcHJldmlvdXMgU3RhdGUgSUQKLSAgICovCi0gIGludCBQcmV2aW91c1N0YXRlSWQoKSBjb25zdCB7Ci0gICAgaWYgKHByZXZpb3VzX3N0YXRlXyAhPSBudWxscHRyKSB7Ci0gICAgICByZXR1cm4gcHJldmlvdXNfc3RhdGVfLT5TdGF0ZUlkKCk7Ci0gICAgfQotICAgIHJldHVybiBrU3RhdGVJbnZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYW4gZXZlbnQuCi0gICAqIFRPRE86IFRoZSBhcmd1bWVudHMgYXJlIHdyb25nIC0gdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLSAgICogV2lsbCBiZSByZXBsYWNlZCBsYXRlci4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0eXBlCi0gICAqIEBwYXJhbSBwX2RhdGEgdGhlIGV2ZW50IGRhdGEKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9jZXNzaW5nIHdhcyBjb21wbGV0ZWQsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgYm9vbCBQcm9jZXNzRXZlbnQodWludDMyX3QgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICAgIGlmIChjdXJyZW50X3N0YXRlXyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGN1cnJlbnRfc3RhdGVfLT5Qcm9jZXNzRXZlbnQoZXZlbnQsIHBfZGF0YSk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNpdGlvbiB0aGUgU3RhdGUgTWFjaGluZSB0byBhIG5ldyBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGRlc3Rfc3RhdGVfaWQgdGhlIHN0YXRlIElEIHRvIHRyYW5zaXRpb24gdG8uIEl0IG11c3QgYmUgb25lCi0gICAqIG9mIHRoZSB1bmlxdWUgc3RhdGUgSURzIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGUgd2FzIGNyZWF0ZWQuCi0gICAqLwotICB2b2lkIFRyYW5zaXRpb25UbyhpbnQgZGVzdF9zdGF0ZV9pZCkgewotICAgIGF1dG8gaXQgPSBzdGF0ZXNfLmZpbmQoZGVzdF9zdGF0ZV9pZCk7Ci0KLSAgICBDSEVDSyhpdCAhPSBzdGF0ZXNfLmVuZCgpKSA8PCAiVW5rbm93biBTdGF0ZSBJRDogIiA8PCBkZXN0X3N0YXRlX2lkOwotICAgIFN0YXRlKiBkZXN0X3N0YXRlID0gaXQtPnNlY29uZDsKLSAgICBUcmFuc2l0aW9uVG8oZGVzdF9zdGF0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNpdGlvbiB0aGUgU3RhdGUgTWFjaGluZSB0byBhIG5ldyBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGRlc3Rfc3RhdGUgdGhlIHN0YXRlIHRvIHRyYW5zaXRpb24gdG8uIEl0IGNhbm5vdCBiZSBudWxscHRyLgotICAgKi8KLSAgdm9pZCBUcmFuc2l0aW9uVG8oU3RhdGVNYWNoaW5lOjpTdGF0ZSogZGVzdF9zdGF0ZSkgewotICAgIGlmIChjdXJyZW50X3N0YXRlXyAhPSBudWxscHRyKSB7Ci0gICAgICBjdXJyZW50X3N0YXRlXy0+T25FeGl0KCk7Ci0gICAgfQotICAgIHByZXZpb3VzX3N0YXRlXyA9IGN1cnJlbnRfc3RhdGVfOwotICAgIGN1cnJlbnRfc3RhdGVfID0gZGVzdF9zdGF0ZTsKLSAgICBjdXJyZW50X3N0YXRlXy0+T25FbnRlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHN0YXRlIHRvIHRoZSBTdGF0ZSBNYWNoaW5lLgotICAgKiBUaGUgc3RhdGUgbWFjaGluZSB0YWtlcyBvd25lcnNoaXAgb24gdGhlIHN0YXRlIC0gaS5lLiwgdGhlIHN0YXRlIHdpbGwKLSAgICogYmUgZGVsZXRlZCBieSB0aGUgU3RhdGUgTWFjaGluZSBpdHNlbGYuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgdG8gYWRkCi0gICAqLwotICB2b2lkIEFkZFN0YXRlKFN0YXRlKiBzdGF0ZSkgewotICAgIHN0YXRlc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0YXRlLT5TdGF0ZUlkKCksIHN0YXRlKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBTdGF0ZSBNYWNoaW5lLgotICAgKgotICAgKiBAcGFyYW0gaW5pdGlhbF9zdGF0ZSB0aGUgaW5pdGlhbCBzdGF0ZQotICAgKi8KLSAgdm9pZCBTZXRJbml0aWFsU3RhdGUoU3RhdGUqIGluaXRpYWxfc3RhdGUpIHsgaW5pdGlhbF9zdGF0ZV8gPSBpbml0aWFsX3N0YXRlOyB9Ci0KLSBwcml2YXRlOgotICBTdGF0ZSogaW5pdGlhbF9zdGF0ZV87Ci0gIFN0YXRlKiBwcmV2aW91c19zdGF0ZV87Ci0gIFN0YXRlKiBjdXJyZW50X3N0YXRlXzsKLSAgc3RkOjptYXA8aW50LCBTdGF0ZSo+IHN0YXRlc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfY2FsbGNvbnRyb2xfY2FsbGJhY2tzLmggYi9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoX2NhbGxjb250cm9sX2NhbGxiYWNrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM3ODY3Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfY2FsbGNvbnRyb2xfY2FsbGJhY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICpDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNhbGxfY29udHJvbCB7Ci0KLS8qKgotICogQ0NTL0dUQlMgcmVsYXRlZCBjYWxsYmFja3MgaW52b2tlZCBmcm9tIGZyb20gdGhlIEJsdWV0b290aCBuYXRpdmUgc3RhY2sKLSAqIEFsbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb24gdGhlIEpOSSB0aHJlYWQKLSAqLwotY2xhc3MgQ2FsbENvbnRyb2xsZXJDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q2FsbENvbnRyb2xsZXJDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIC8qKgotICAgKiBDYWxsYmFjayBmb3Igbm90aWZ5aW5nIHRoZSBDQ1MgaW5pdGlhbGl6YXRpb24gc3RhdHVzLgotICAgKgotICAgKiBAcGFyYW0gc3RhdGUgc3VjY2VzcyBpZiB6ZXJvLCBmYWlsdXJlIG90aGVyd2lzZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIENhbGxDb250cm9sSW5pdGlhbGl6ZWRDYWxsYmFjayh1aW50OF90IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7Ci0gIC8qKgotICAgKiBDYWxsYmFjayBmb3IgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIGJ0Y2NfY29ubmVjdGlvbl9zdGF0ZV90Ci0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIENvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKHVpbnQ4X3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotICAvKioKLSAgICogQ2FsbGJhY2sgZm9yIGNhbGwgY29udHJvbCBvcGVyYXRpb25zLgotICAgKgotICAgKiBAcGFyYW0gb3AgY2FsbCBjb250cm9sIG9wZXJhdGlvbiBpbml0aWF0ZWQgZnJvbSByZW1vdGUKLSAgICogQHBhcmFtIGluZGljaWVzIEluZGljaWVzIGZvciB0aGUgY2FsbCBjb250cm9sIG9wZXJhdGlvbnMKLSAgICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBJbmRpY2llcyBmb3IgdGhlIGNhbGwgY29udHJvbCBvcGVyYXRpb25zCi0gICAqIEB1cmkgdXJpIGZvciB0aGUgY2FsbCBjb250cm9sIG9wZXJhdGlvbgotICAgKiBAcGFyYW0gYmRfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3Mgd2hpY2ggaW5pdGlhdGVkIHRoZSBjYWxsIGNvbnRyb2wgb3AKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBDYWxsQ29udHJvbENhbGxiYWNrKHVpbnQ4X3Qgb3AsIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGluZGljaWVzLCBpbnQgY291bnQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHVyaV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2FsbGNvbnRyb2wKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfY2FsbGNvbnRyb2xfaW50ZXJmYWNlLmggYi9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoX2NhbGxjb250cm9sX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmI3ODQ5Li4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGhfY2FsbGNvbnRyb2xfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoX2NhbGxjb250cm9sX2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jZGVmaW5lIEJUX1BST0ZJTEVfQ0NfSUQgImNjX3NlcnZlciIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY2FsbF9jb250cm9sIHsKLQotLyoqCi0gKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UgZm9yIENDUy9HVEJTIHByb2ZpbGVzIGluIHRoZSBGbHVvcmlkZSBzdGFjawotICogVGhyZWFkLXNhZmUKLSAqLwotY2xhc3MgQ2FsbENvbnRyb2xsZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q2FsbENvbnRyb2xsZXJJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBDQ1MvR1RCUyBJbnRlcmZhY2UKLSAgICoKLSAgICogQHBhcmFtIGNhbGxiYWNrcyBjYWxsYmFja3MgZm9yIHRoZSB1c2VyIG9mIHRoZSBuYXRpdmUgc3RhY2sKLSAgICogQHBhcmFtIG1heF9jY3NfY2xpZW50cyBtYXhpbXVtIG51bWJlciBvZiBDQ1MvR1RCUyBjbGllbnRzCi0gICAqIEBwYXJhbSBpbmJhbmRfcmluZ2luZ19lbmFibGVkIHdoZXRoZXIgaW5iYW5kIHJpbmd0b25lIGlzIGVuYWJsZWQKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IEluaXQoQ2FsbENvbnRyb2xsZXJDYWxsYmFja3MqIGNhbGxiYWNrcywgVXVpZCB1dWlkLCBpbnQgbWF4X2Njc19jbGllbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmJhbmRfcmluZ2luZ19lbmFibGVkKSA9IDA7Ci0gIC8qKgotICAgKiBVcGRhdGVzIHRlbGVwaG9ueSBiZWFyZXIgbmFtZQotICAgKgotICAgKiBAcGFyYW0gb3BlcmF0b3Jfc3RyIGJlYXJlciBuYW1lIG9mIHByb3ZpZGVyCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCBidF9zdGF0dXNfdCBVcGRhdGVCZWFyZXJOYW1lKHVpbnQ4X3QqIG9wZXJhdG9yX3N0cikgPSAwOwotCi0gIC8qKgotICAgKiBVcGRhdGVzIHRoZSBiZWFyZXIgVGVjaG5vZ2x5IHR5cGUKLSAgICoKLSAgICogQHBhcmFtIGJlYXJlcl90ZWNoIGJlYXJlciB0ZWNobm9sb2d5IHR5cGUgb2YgcHJvdmlkZXIKLSAgICogQHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzCi0gICAqLwotICB2aXJ0dWFsIGJ0X3N0YXR1c190IFVwZGF0ZUJlYXJlclRlY2hub2xvZ3koaW50IGJlYXJlcl90ZWNoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZXMgdGVsZXBob255IG5ldHdvcmsgYmVhcmVycyBzdXBwb3J0ZWQKLSAgICoKLSAgICogQHBhcmFtIHN1cHBvcnRlZEJlYXJlcnMgc3VwcG9ydGVkIGJlYXJlcnMgbGlzdAotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgVXBkYXRlU3VwcG9ydGVkQmVhcmVyTGlzdCh1aW50OF90KiBzdXBwb3J0ZWRCZWFyZXJzKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZXMgb3B0aW9uYWwgQ2FsbCBjb250cm9sIG9wZXJhdGlvbnMgc3VwcG9ydGVkCi0gICAqCi0gICAqIEBwYXJhbSBmZWF0dXJlIGJpdG1hc2sgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvcHRpb25hbCBvcCBjb2RlIHN1cHBvcnRlZAotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgIENhbGxDb250cm9sT3B0aW9uYWxPcFN1cHBvcnRlZChpbnQgZmVhdHVyZSkgPSAwOwotCi0gIC8qKgotICAgKiBVcGRhdGUgbmV0d29yayBzaWduYWwgc3RyZW5ndGgKLSAgICoKLSAgICogQHBhcmFtIHNpZ25hbCBsZXZlbAotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgVXBkYXRlU2lnbmFsU3RhdHVzKGludCBzaWduYWwpID0gMDsKLQotICAvKioKLSAgICogVXBkYXRlIHN0YXR1cyBmbGFnIGZvciBHVEJTCi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHJlbW90ZSBkZXZpY2UgYWRkcmVzcwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgVXBkYXRlU3RhdHVzRmxhZ3ModWludDhfdCBzdGF0dXNfZmxhZykgPSAwOwotCi0gIC8qKgotICAgKiBVcGRhdGUgQ29udGVudCBjb250cm9sIGZvciBHVEJTL0NDUwotICAgKgotICAgKiBAcGFyYW0gY2NpZCBjb250ZW50IGNvbnRyb2wgSWQgZm9yIEdUQlMvQ0NTCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIENvbnRlbnRDb250cm9sSWQodWludDMyX3QgY2NpZCkgPSAwOwotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIENhbGwgU3RhdGUgb2YgQ0NTCi0gICAqCi0gICAqIEBwYXJhbSBsZW4gb2YgY2FsbCBzdGF0ZSBpbmZvcwotICAgKiBAcGFyYW0gY2FsbF9zdGF0ZV9saXN0IGFycmF5IG9mIGNhbGwgc3RhdGUgbGlzdCwgd2hlcmUgZWFjaCBjYWxsIHN0YXRlCi0gICAqICAgICAgICBjb21wcmlzZWQgb2YgaW5kZXgsIHN0YXRlLCBmbGFncwotICAgKiBAcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3MKLSAgICovCi0gIHZpcnR1YWwgYnRfc3RhdHVzX3QgQ2FsbFN0YXRlKGludCBsZW4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNhbGxfc3RhdGVfbGlzdCkgPSAwOwotCi0gIC8qKgotICAgKiBVcGRhdGUgSW5jb21pbmcgY2FsbCBVUkkgZm9yIHRoZSBnaXZlbiBDYWxsIEluZGV4Ci0gICAqCi0gICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgY2FsbAotICAgKiBAcGFyYW0gdXJpIHJlcHJlc2VudGluZyB0aGUgSW5jb21pbmcgY2FsbCwgd2lsbCBiZSBJbmNvbWluZyBjYWxsIG51bWJlciBmb3IgdGVsZXBob255Ci0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgVXBkYXRlSW5jb21pbmdDYWxsKGludCBpbmRleCwgdWludDhfdCogdXJpKSA9IDA7Ci0gIC8qKgotICAgKiBSZXNwb25zZSBmb3IgQ2FsbCBjb250cm9sIE9wZXJhdGlvbiBpbml0aWF0ZWQKLSAgICoKLSAgICogQHBhcmFtIG9wIE9wZXJhdGlvbiBmb3Igd2hpY2ggcmVzcG9uc2UgaXMgc2VudAotICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgY2FsbCBmb3Igb3BlcmF0aW9uCi0gICAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24gcGVyZm9ybWVkCi0gICAqIEByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcwotICAgKi8KLSAgdmlydHVhbCBidF9zdGF0dXNfdCBDYWxsQ29udHJvbFJlc3BvbnNlKHVpbnQ4X3Qgb3AsIHVpbnQ4X3QgaW5kZXgsIHVpbnQzMl90IHN0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGN1cnJlbnQgYWN0aXZlIGRldmljZSBmb3IgR1RCUy9DQ1MKLSAgICoKLSAgICogQHBhcmFtIGFjdGl2ZV9kZXZpY2VfYWRkciByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRBY3RpdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHNldF9pZCkgPSAwOwotCi0gIC8qKgotICAgKiBEaXNjb25uZWN0IEdUQlMvQ1RTIHByb2ZpbGUgZm9yIHJlbW90ZQotICAgKiBAcGFyYW0gYWRkcmVzcyByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgIC8qKgotICAgKiBDbG9zZXMgdGhlIEdUQlMvQ0NTIGludGVyZmFjZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhbnVwKCkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNhbGxfY29udHJvbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2FjbS5oIGIvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2FjbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJmYjkwLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9hY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9BQ01fSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQUNNX0gKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfcGFjc19jbGllbnQuaD4KLQotX19CRUdJTl9ERUNMUwotCi0jZGVmaW5lIEJUX1BST0ZJTEVfQUNNX0lEICJidF9hY21fcHJvZmxpZSIKLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZzsKLS8qIEJsdWV0b290aCBBQ00gY29ubmVjdGlvbiBzdGF0ZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUQUNNX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEID0gMCwKLSAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HLAotICBCVEFDTV9DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCwKLSAgQlRBQ01fQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HCi19IGJ0YWNtX2Nvbm5lY3Rpb25fc3RhdGVfdDsKLQotLyogQmx1ZXRvb3RoIEFDTSBkYXRhcGF0aCBzdGF0ZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEJUQUNNX0FVRElPX1NUQVRFX1JFTU9URV9TVVNQRU5EID0gMCwKLSAgQlRBQ01fQVVESU9fU1RBVEVfU1RPUFBFRCwKLSAgQlRBQ01fQVVESU9fU1RBVEVfU1RBUlRFRCwKLX0gYnRhY21fYXVkaW9fc3RhdGVfdDsKLQotLyoqIENhbGxiYWNrIGZvciBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZS4KLSAqICBzdGF0ZSB3aWxsIGhhdmUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBidGFjbV9jb25uZWN0aW9uX3N0YXRlX3QKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRhY21fY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjaykoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YWNtX2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlKTsKLQotLyoqIENhbGxiYWNrIGZvciBhdWRpb3BhdGggc3RhdGUgY2hhbmdlLgotICogIHN0YXRlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIGJ0YWNtX2F1ZGlvX3N0YXRlX3QKLSAqLwotdHlwZWRlZiB2b2lkICgqYnRhY21fYXVkaW9fc3RhdGVfY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YWNtX2F1ZGlvX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRUeXBlKTsKLQotLyoqIENhbGxiYWNrIGZvciBhdWRpbyBjb25maWd1cmF0aW9uIGNoYW5nZS4KLSAqICBVc2VkIG9ubHkgZm9yIHRoZSBBQ00gSW5pdGlhdG9yIGludGVyZmFjZS4KLSAqLwotdHlwZWRlZiB2b2lkICgqYnRhY21fYXVkaW9fY29uZmlnX2NhbGxiYWNrKSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBDb2RlY0NvbmZpZyBjb2RlY19jb25maWcsCi0gICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGNvZGVjc19sb2NhbF9hY21hYmlsaXRpZXMsCi0gICAgc3RkOjp2ZWN0b3I8Q29kZWNDb25maWc+IGNvZGVjc19zZWxlY3RhYmxlX2FjbWFiaWxpdGllcywKLSAgICB1aW50MTZfdCBjb250ZXh0VHlwZSk7Ci0KLS8qKiBCVC1BQ00gSW5pdGlhdG9yIGNhbGxiYWNrIHN0cnVjdHVyZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoYnRhY21faW5pdGlhdG9yX2NhbGxiYWNrc190KSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgYnRhY21fY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjayBjb25uZWN0aW9uX3N0YXRlX2NiOwotICBidGFjbV9hdWRpb19zdGF0ZV9jYWxsYmFjayBhdWRpb19zdGF0ZV9jYjsKLSAgYnRhY21fYXVkaW9fY29uZmlnX2NhbGxiYWNrIGF1ZGlvX2NvbmZpZ19jYjsKLX0gYnRhY21faW5pdGlhdG9yX2NhbGxiYWNrc190OwotCi0vKiogUmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQtQUNNIEluaXRpYXRvciBpbnRlcmZhY2UuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCB0byBzaXplb2YoYnRhY21fc291cmNlX2ludGVyZmFjZV90KSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBCdEFjbSBjYWxsYmFja3MuCi0gICAqLwotICBidF9zdGF0dXNfdCAoKmluaXQpKAotICAgICAgYnRhY21faW5pdGlhdG9yX2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGludCBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4mIGNvZGVjX3ByaW9yaXRpZXMpOwotCi0gIC8qKiBjb25uZWN0IHRvIGhlYWRzZXQgKi8KLSAgYnRfc3RhdHVzX3QgKCpjb25uZWN0KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjb250ZXh0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZmlsZV90eXBlLCB1aW50MTZfdCBwcmVmZXJyZWRfY29udGV4dCk7Ci0KLSAgLyoqIGRpcy1jb25uZWN0IGZyb20gaGVhZHNldCAqLwotICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3QpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNvbnRleHRfdHlwZSk7Ci0KLSAgLyoqIHNldHMgdGhlIGNvbm5lY3RlZCBkZXZpY2UgYXMgYWN0aXZlICovCi0gIGJ0X3N0YXR1c190ICgqc2V0X2FjdGl2ZV9kZXZpY2UpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZSk7Ci0KLSAgLyoqIHN0YXJ0IHN0cmVhbSAqLwotICBidF9zdGF0dXNfdCAoKnN0YXJ0X3N0cmVhbSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY29udGV4dF90eXBlKTsKLQotICAvKiogc3RvcCBzdHJlYW0gKi8KLSAgYnRfc3RhdHVzX3QgKCpzdG9wX3N0cmVhbSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY29udGV4dF90eXBlKTsKLQotICAvKiogY29uZmlndXJlIHRoZSBjb2RlY3Mgc2V0dGluZ3MgcHJlZmVyZW5jZXMgKi8KLSAgYnRfc3RhdHVzX3QgKCpjb25maWdfY29kZWMpKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBjb2RlY19wcmVmZXJlbmNlcywKLSAgICAgIHVpbnQxNl90IGNvbnRleHRfdHlwZSwgdWludDE2X3QgcHJlZmVycmVkX2NvbnRleHQpOwotCi0gIC8qKiBjb25maWd1cmUgdGhlIGNvZGVjIGJhc2VkIG9uIElEKi8KLSAgYnRfc3RhdHVzX3QgKCpjaGFuZ2VfY29uZmlnX2NvZGVjKSgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICBjaGFyKiBJZCk7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2b2lkICgqY2xlYW51cCkodm9pZCk7Ci0KLX0gYnRhY21faW5pdGlhdG9yX2ludGVyZmFjZV90OwotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX0FWX0ggKi8KZGlmZiAtLWdpdCBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9hcG0uaCBiL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9hcG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViOTVlMy4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfYXBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JUX0FQTV9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9BUE1fSAotCi0jZGVmaW5lIEJUX0FQTV9NT0RVTEVfSUQgImFwbSIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qIEJsdWV0b290aCBBUE0gQXVkaW8gVHlwZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgQlRBUE1fVk9JQ0VfQVVESU8gPSAwLAotICAgIEJUQVBNX01FRElBX0FVRElPLAotICAgIEJUQVBNX0JST0FEQ0FTVF9BVURJTwotfSBidGFwbV9hdWRpb190eXBlX3Q7Ci0KLXZvaWQgY2FsbF9hY3RpdmVfcHJvZmlsZV9pbmZvKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGF1ZGlvX3R5cGUpOwotaW50IGdldF9hY3RpdmVfcHJvZmlsZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBhdWRpb190eXBlKTsKLXR5cGVkZWYgaW50ICgqYnRhcG1fYWN0aXZlX3Byb2ZpbGVfY2FsbGJhY2spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGF1ZGlvX3R5cGUpOwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemU7Ci0gICAgICAgIGJ0YXBtX2FjdGl2ZV9wcm9maWxlX2NhbGxiYWNrIGFjdGl2ZV9wcm9maWxlX2NiOwotfWJ0YXBtX2luaXRpYXRvcl9jYWxsYmFja3NfdDsKLQotCi0KLS8qKiBBUE0gaW50ZXJmYWNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0X2FwbV9pbnRlcmZhY2VfdCkgKi8KLSAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciB0aGUgQnRBdiBjYWxsYmFja3MuCi0gICAgICovCi0gICAgYnRfc3RhdHVzX3QgKCppbml0KShidGFwbV9pbml0aWF0b3JfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7Ci0KLSAgICAvKiogdXBkYXRlcyBuZXcgYWN0aXZlIGRldmljZSB0byBzdGFjayAqLwotICAgIGJ0X3N0YXR1c190ICgqYWN0aXZlX2RldmljZV9jaGFuZ2UpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHByb2ZpbGUsIHVpbnQxNl90IGF1ZGlvX3R5cGUpOwotCi0gICAgLyoqIHNlbmQgY29udGVudCBjb250cm9sIGlkIHRvIHN0YWNrICovCi0gICAgYnRfc3RhdHVzX3QgKCpzZXRfY29udGVudF9jb250cm9sX2lkKSh1aW50MTZfdCBjb250ZW50X2NvbnRyb2xfaWQsIHVpbnQxNl90IGF1ZGlvX3R5cGUpOwotCi0gICAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICAgIHZvaWQgICgqY2xlYW51cCkoIHZvaWQgKTsKLQotfWJ0X2FwbV9pbnRlcmZhY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9BUE1fSCAqLwotCmRpZmYgLS1naXQgYS9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfYXNjc19jbGllbnQuaCBiL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9hc2NzX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkzNDFiLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9hc2NzX2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfQVNDU19DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQVNDU19DTElFTlRfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgYXNjcyB7Ci0KLSNkZWZpbmUgQlRfUFJPRklMRV9BU0NTX0NMSUVOVF9JRCAiYnRfYXNjc19jbGllbnQiCi0KLWNvbnN0ZXhwciB1aW50OF90IEFTRV9ESVJFQ1RJT05fU0lOSyAgID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IEFTRV9ESVJFQ1RJT05fU09VUkNFID0gMHgwMjsKLQotY29uc3RleHByIHVpbnQzMl90IENPTlRFWFRfVFlQRV9DT05WRVJTQVRJT05BTCAgPSAweDAwMDI7Ci1jb25zdGV4cHIgdWludDMyX3QgQ09OVEVYVF9UWVBFX01FRElBICAgICAgICAgICA9IDB4MDAwNDsKLQotY29uc3RleHByIHVpbnQ4X3QgIEFTRV9TVEFURV9JRExFICAgICAgICAgICAgICAgID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90ICBBU0VfU1RBVEVfQ09ERUNfQ09ORklHVVJFRCAgICA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCAgQVNFX1NUQVRFX1FPU19DT05GSUdVUkVEICAgICAgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3QgIEFTRV9TVEFURV9FTkFCTElORyAgICAgICAgICAgID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90ICBBU0VfU1RBVEVfU1RSRUFNSU5HICAgICAgICAgICA9IDB4MDQ7Ci1jb25zdGV4cHIgdWludDhfdCAgQVNFX1NUQVRFX0RJU0FCTElORyAgICAgICAgICAgPSAweDA1OwotY29uc3RleHByIHVpbnQ4X3QgIEFTRV9TVEFURV9SRUxFQVNJTkcgICAgICAgICAgID0gMHgwNjsKLWNvbnN0ZXhwciB1aW50OF90ICBBU0VfU1RBVEVfSU5WQUxJRCAgICAgICAgICAgICA9IDB4RkY7Ci0KLXR5cGVkZWYgdWludDhfdCBzZHVfaW50ZXJ2YWxfdFszXTsKLXR5cGVkZWYgdWludDhfdCBwcmVzZW50YXRpb25fZGVsYXlfdFszXTsKLXR5cGVkZWYgdWludDhfdCBjb2RlY190eXBlX3RbNV07Ci0KLQotZW51bSBjbGFzcyBBU0NTRXZlbnQgewotICBBU0NTX0RJU0NPVkVSWV9DTVBMX0VWVCA9IDAsCi0gIEFTQ1NfREVWX0NPTk5FQ1RFRCwKLSAgQVNDU19ERVZfRElTQ09OTkVDVEVELAotICBBU0NTX0FTRV9TVEFURSwKLX07Ci0KLXN0cnVjdCBBdWRpb0NvbnRleHQgewotICB1aW50OF90IGxlbmd0aDsKLSAgdWludDhfdCB0eXBlOwotICB1aW50MTZfdCB2YWx1ZTsKLX07Ci0KLWVudW0gY2xhc3MgQXNlU3RhdGUgewotICBJRExFID0gMCwKLSAgQ09ERUNfQ09ORklHVVJFRCwKLSAgUU9TX0NPTkZJR1VSRUQsCi0gIEVOQUJMSU5HLAotICBTVFJFQU1JTkcsCi0gIERJU0FCTElORywKLSAgUkVMRUFTSU5HLAotfTsKLQotZW51bSBjbGFzcyBBc2VPcElkIHsKLSAgQ09ERUNfQ09ORklHID0gMHgwMSwKLSAgUU9TX0NPTkZJRywKLSAgRU5BQkxFLAotICBTVEFSVF9SRUFEWSwKLSAgRElTQUJMRSwKLSAgU1RPUF9SRUFEWSwKLSAgVVBEQVRFX01FVEFfREFUQSwKLSAgUkVMRUFTRQotfTsKLQotZW51bSBjbGFzcyBHYXR0U3RhdGUgewotICBESVNDT05ORUNURUQgPSAwLAotICBDT05ORUNUSU5HLAotICBDT05ORUNURUQsCi0gIERJU0NPTk5FQ1RJTkcKLX07Ci0KLXN0cnVjdCBBc2VDb2RlY0NvbmZpZ09wIHsKLSAgdWludDhfdCBhc2VfaWQ7Ci0gIHVpbnQ4X3QgdGd0X2xhdGVuY3k7Ci0gIHVpbnQ4X3QgdGd0X3BoeTsKLSAgY29kZWNfdHlwZV90IGNvZGVjX2lkOwotICB1aW50OF90IGNvZGVjX3BhcmFtc19sZW47Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvZGVjX3BhcmFtczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCAgQXNlUW9zQ29uZmlnT3AgewotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotICBzZHVfaW50ZXJ2YWxfdCBzZHVfaW50ZXJ2YWw7Ci0gIHVpbnQ4X3QgZnJhbWluZzsKLSAgdWludDhfdCBwaHk7Ci0gIHVpbnQxNl90IG1heF9zZHVfc2l6ZTsKLSAgdWludDhfdCByZXRyYW5zX251bWJlcjsKLSAgdWludDE2X3QgdHJhbnNfbGF0ZW5jeTsKLSAgcHJlc2VudGF0aW9uX2RlbGF5X3QgcHJlc2VudF9kZWxheTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBc2VFbmFibGVPcCB7Ci0gIHVpbnQ4X3QgYXNlX2lkOwotICB1aW50OF90IG1ldGFfZGF0YV9sZW47Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1ldGFfZGF0YTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBc2VEaXNhYmxlT3AgewotICB1aW50OF90IGFzZV9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBc2VTdGFydFJlYWR5T3AgewotICB1aW50OF90IGFzZV9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBc2VTdG9wUmVhZHlPcCB7Ci0gIHVpbnQ4X3QgYXNlX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IEFzZVJlbGVhc2VPcCB7Ci0gIHVpbnQ4X3QgYXNlX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IEFzZVVwZGF0ZU1ldGFkYXRhT3AgewotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCBtZXRhX2RhdGFfbGVuOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtZXRhX2RhdGE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgQXNlQ29kZWNDb25maWdQYXJhbXMgewotICB1aW50OF90IGZyYW1pbmc7Ci0gIHVpbnQ4X3QgcHJlZl9waHk7Ci0gIHVpbnQ4X3QgcHJlZl9ydG47Ci0gIHVpbnQxNl90IG10bDsKLSAgcHJlc2VudGF0aW9uX2RlbGF5X3QgcGRfbWluOwotICBwcmVzZW50YXRpb25fZGVsYXlfdCBwZF9tYXg7Ci0gIHByZXNlbnRhdGlvbl9kZWxheV90IHByZWZfcGRfbWluOwotICBwcmVzZW50YXRpb25fZGVsYXlfdCBwcmVmX3BkX21heDsKLSAgY29kZWNfdHlwZV90IGNvZGVjX2lkOwotICB1aW50OF90IGNvZGVjX3BhcmFtc19sZW47Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvZGVjX3BhcmFtczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCAgQXNlUW9zQ29uZmlnUGFyYW1zIHsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2lkOwotICBzZHVfaW50ZXJ2YWxfdCBzZHVfaW50ZXJ2YWw7Ci0gIHVpbnQ4X3QgZnJhbWluZzsKLSAgdWludDhfdCBwaHk7Ci0gIHVpbnQxNl90IG1heF9zZHVfc2l6ZTsKLSAgdWludDhfdCBydG47Ci0gIHVpbnQxNl90IG10bDsKLSAgcHJlc2VudGF0aW9uX2RlbGF5X3QgcGQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgQXNlR2VuZXJpY1BhcmFtcyB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50OF90IGNpc19pZDsKLSAgdWludDhfdCBtZXRhX2RhdGFfbGVuOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtZXRhX2RhdGE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi11bmlvbiBBc2VPcCB7Ci0gIEFzZUNvZGVjQ29uZmlnT3AgY29kZWNfY29uZmlnX29wOwotICBBc2VRb3NDb25maWdPcCBxb3NfY29uZmlnX29wOwotICBBc2VFbmFibGVPcCBlbmFibGVfb3A7Ci0gIEFzZURpc2FibGVPcCBkaXNhYmxlX29wOwotICBBc2VTdGFydFJlYWR5T3Agc3RhcnRfcmVhZHlfb3A7Ci0gIEFzZVN0b3BSZWFkeU9wIHN0b3BfcmVhZHlfb3A7Ci0gIEFzZVJlbGVhc2VPcCByZWxlYXNlX29wOwotfTsKLQotc3RydWN0IEFzZU9wU3RhdHVzIHsKLSAgdWludDhfdCBhc2VfaWQ7Ci0gIHVpbnQ4X3QgcmVzcF9jb2RlOwotICB1aW50OF90IHJlYXNvbjsKLX07Ci0KLXN0cnVjdCBBc2VQYXJhbXMgewotICB1aW50OF90IGFzZV9pZDsKLSAgdWludDhfdCBhc2Vfc3RhdGU7Ci0gIEFzZUNvZGVjQ29uZmlnUGFyYW1zIGNvZGVjX2NvbmZpZ19wYXJhbXM7Ci0gIEFzZVFvc0NvbmZpZ1BhcmFtcyBxb3NfY29uZmlnX3BhcmFtczsKLSAgQXNlR2VuZXJpY1BhcmFtcyBnZW5lcmljX3BhcmFtczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBc2VDcE5vdGlmaWNhdGlvbiB7Ci0gIHVpbnQ4X3QgYXNlX29wY29kZTsKLSAgdWludDhfdCBudW1fYXNlczsKLSAgc3RkOjp2ZWN0b3I8QXNlT3BTdGF0dXM+IHN0YXR1czsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBBc2UgewotICB1aW50MTZfdCBhc2VfaGFuZGxlOwotICB1aW50MTZfdCBhc2VfY2NjX2hhbmRsZTsKLSAgQXNlUGFyYW1zIGFzZV9wYXJhbXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgQXNjc0Rpc2NvdmVyeURiIHsKLSAgc3RkOjp2ZWN0b3I8QXNlPiBhc2VfbGlzdDsKLSAgdWludDE2X3QgYXNlX2NwX2hhbmRsZTsKLSAgdWludDE2X3QgYXNlX2NwX2NjY19oYW5kbGU7Ci0gIGJvb2wgc2VydmljZV9jaGFuZ2VkX3JjdmQ7Ci0gIGJvb2wgYWN0aXZlOwotfTsKLQotY2xhc3MgQXNjc0NsaWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Bc2NzQ2xpZW50Q2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgYXNjcyBzZXJ2ZXIgcmVnaXN0cmF0aW9uIHN0YXR1cyAqLwotICB2aXJ0dWFsIHZvaWQgT25Bc2NzSW5pdGlhbGl6ZWQoaW50IHN0YXR1cywgaW50IGNsaWVudF9pZCkgPSAwOwotCi0gIC8qKiBDYWxsYmFjayBmb3IgYXNjcyBzZXJ2ZXIgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UgKi8KLSAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYXR0U3RhdGUgc3RhdGUpID0gMDsKLQotICAvKiogQ2FsbGJhY2sgZm9yIGFzY3Mgc2VydmVyIGNvbnRyb2wgb3AgZmFpbGVkIHN0YXR1cyAqLwotICB2aXJ0dWFsIHZvaWQgT25Bc2VPcEZhaWxlZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2VPcElkIGFzZV9vcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlT3BTdGF0dXM+IHN0YXR1cykgPSAwOwotCi0gIC8qKiBDYWxsYmFjayBmb3IgYXNjcyBhc2Ugc3RhdGUgY2hhbmdlICovCi0gIHZpcnR1YWwgdm9pZCBPbkFzZVN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFzZVBhcmFtcyBhc2UpID0gMDsKLQotICAvKiogQ2FsbGJhY2sgZm9yIGFzY3MgZGlzY292ZXJ5IHJlc3VsdHMgKi8KLSAgdmlydHVhbCB2b2lkIE9uU2VhcmNoQ29tcGxldGUoaW50IHN0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUGFyYW1zPiBzaW5rX2FzZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VQYXJhbXM+IHNyY19hc2VfbGlzdCkgPSAwOwotfTsKLQotY2xhc3MgQXNjc0NsaWVudEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Bc2NzQ2xpZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBSZWdpc3RlciB0aGUgQXNjcyBjbGllbnQgY2FsbGJhY2tzICovCi0gIHZpcnR1YWwgdm9pZCBJbml0KEFzY3NDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcykgPSAwOwotCi0gIC8qKiBDb25uZWN0IHRvIGFzY3Mgc2VydmVyICovCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKiBEaXNjb25uZWN0IGFzY3Mgc2VydmVyICovCi0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBTdGFydERpc2NvdmVyeSh1aW50MTZfdCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIEdldEFzZVN0YXRlKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXNlX2lkKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIENvZGVjQ29uZmlnKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZUNvZGVjQ29uZmlnT3A+IGNvZGVjX2NvbmZpZ3MpOwotCi0gIHZpcnR1YWwgdm9pZCBRb3NDb25maWcodWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlUW9zQ29uZmlnT3A+IHFvc19jb25maWdzKTsKLQotICB2aXJ0dWFsIHZvaWQgRW5hYmxlKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZUVuYWJsZU9wPiBlbmFibGVfb3BzKTsKLQotICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VEaXNhYmxlT3A+IGRpc2FibGVfb3BzKTsKLQotICB2aXJ0dWFsIHZvaWQgU3RhcnRSZWFkeSh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VTdGFydFJlYWR5T3A+IHN0YXJ0X3JlYWR5X29wcyk7Ci0KLSAgdmlydHVhbCB2b2lkIFN0b3BSZWFkeSh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBc2VTdG9wUmVhZHlPcD4gc3RvcF9yZWFkeV9vcHMpOwotCi0gIHZpcnR1YWwgdm9pZCBSZWxlYXNlKHVpbnQxNl90IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFzZVJlbGVhc2VPcD4gcmVsZWFzZV9vcHMpOwotCi0gIHZpcnR1YWwgdm9pZCBVcGRhdGVTdHJlYW0odWludDE2X3QgY2xpZW50X2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXNlVXBkYXRlTWV0YWRhdGFPcD4gbWV0YWRhdGFfb3BzKTsKLQotICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UuICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhbnVwKHVpbnQxNl90IGNsaWVudF9pZCkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFzY3MKLX0gIC8vIG5hbWVzcGFjZSBiYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9DTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2JhcF9iYS5oIGIvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2JhcF9iYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGM1ZmJkLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9iYXBfYmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9CQVBfQkFfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQkFQX0JBX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2F2LmgiCi0KLV9fQkVHSU5fREVDTFMKLQotI2RlZmluZSBCVF9QUk9GSUxFX0JBUF9CUk9BRENBU1RfSUQgImJhcF9icm9hZGNhc3QiCi0KLS8qIEJsdWV0b290aCBCQVAgQlJPQURDQVNUIHN0YXRlcyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBCVEJBUF9CUk9BRENBU1RfU1RBVEVfSURMRSA9IDAsIC8vSWRsZQotICAgIEJUQkFQX0JST0FEQ0FTVF9TVEFURV9DT05GSUdVUkVELCAvL0NvbmZpZ3VyZWQKLSAgICBCVEJBUF9CUk9BRENBU1RfU1RBVEVfU1RSRUFNSU5HLCAvL1N0cmVhbWluZwotfSBidGJhcF9icm9hZGNhc3Rfc3RhdGVfdDsKLQotLyogQmx1ZXRvb3RoIEJBUCBCUk9BRENBU1QgQXVkaW8gc3RhdGVzICovCi10eXBlZGVmIGVudW0gewotICAgIEJUQkFQX0JST0FEQ0FTVF9BVURJT19TVEFURV9TVE9QUEVEID0gMCwKLSAgICBCVEJBUF9CUk9BRENBU1RfX0FVRElPX1NUQVRFX1NUQVJURUQsCi19IGJ0YmFwX2Jyb2FkY2FzdF9hdWRpb19zdGF0ZV90OwotCi0vKiogQ2FsbGJhY2sgZm9yIGJyb2FkY2FzdCBzdGF0ZSBjaGFuZ2UuCi0gKiAgc3RhdGUgd2lsbCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gYnRiYXBfYnJvYWRjYXN0X3N0YXRlX3QKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJhcF9icm9hZGNhc3Rfc3RhdGVfY2FsbGJhY2spKGludCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRiYXBfYnJvYWRjYXN0X3N0YXRlX3Qgc3RhdGUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGF1ZGlvcGF0aCBzdGF0ZSBjaGFuZ2UuCi0gKiAgc3RhdGUgd2lsbCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gYnRiYXBfYnJvYWRjYXN0X2F1ZGlvX3N0YXRlX3QKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJhcF9icm9hZGNhc3RfYXVkaW9fc3RhdGVfY2FsbGJhY2spKGludCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRiYXBfYnJvYWRjYXN0X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGF1ZGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgotICovCi10eXBlZGVmIHZvaWQgKCogYmFwX2Jyb2FkY2FzdF9hdWRpb19jb25maWdfY2FsbGJhY2spKGludCBhZHZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjX2NhcGFiaWxpdGllcyk7Ci0KLS8qKiBDYWxsYmFjayBmb3IgSXNvIGRhdGFwYXRoIHNldHVwIG9yIHJlbW92ZWQuCi0gKi8KLS8vdHlwZWRlZiB2b2lkICgqIGJhcF9icm9hZGNhc3RfaXNvX2RhdGFwYXRoX2NhbGxiYWNrKSAoaW50IGJpZ19oYW5kbGUsIGludCBlbmFibGVkKTsKLQotLyoqIENhbGxiYWNrIGZvciBlbmNyeXB0aW9uIGtleSBnZW5lcmF0aW9uIG5vdGlmaWNhdGlvbgotICovCi10eXBlZGVmIHZvaWQgKCogYmFwX2Jyb2FkY2FzdF9lbmNrZXlfY2FsbGJhY2spIChzdGQ6OnN0cmluZyBrZXkpOwotCi0vKiogQ2FsbGJhY2sgdG8gY3JlYXRlL3Rlcm1pbmF0ZSBCSUcKLSAqLwotCi10eXBlZGVmIHZvaWQgKCogYmFwX2Jyb2FkY2FzdF9zZXR1cF9iaWdfY2FsbGJhY2spIChpbnQgZW5hYmxlLCBpbnQgYWR2X2lkLCBpbnQgYmlnX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Jpc2VzLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gYmlzX2hhbmRsZXMpOwotCi10eXBlZGVmIHZvaWQgKCogYmFwX2Jyb2FkY2FzdF9iaWRfY2FsbGJhY2spIChzdGQ6OnZlY3Rvcjx1aW50OF90PiBicm9hZGNhc3RfaWQpOwotCi0vKiogQlQtQkFQLUJST0FEQ0FTVCBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyoqIHNldCB0byBzaXplb2YoYnRiYXBfYnJvYWRjYXN0X2NhbGxiYWNrc190KSAqLwotICAgIHNpemVfdCAgICAgIHNpemU7Ci0gICAgYmFwX2Jyb2FkY2FzdF9zdGF0ZV9jYWxsYmFjayAgYnJvYWRjYXN0X3N0YXRlX2NiOwotICAgIGJhcF9icm9hZGNhc3RfYXVkaW9fc3RhdGVfY2FsbGJhY2sgYXVkaW9fc3RhdGVfY2I7Ci0gICAgYmFwX2Jyb2FkY2FzdF9hdWRpb19jb25maWdfY2FsbGJhY2sgYXVkaW9fY29uZmlnX2NiOwotICAgIC8vYmFwX2Jyb2FkY2FzdF9pc29fZGF0YXBhdGhfY2FsbGJhY2sgaXNvX2RhdGFwYXRoX2NiOwotICAgIGJhcF9icm9hZGNhc3RfZW5ja2V5X2NhbGxiYWNrIGVuY19rZXlfY2I7Ci0gICAgYmFwX2Jyb2FkY2FzdF9zZXR1cF9iaWdfY2FsbGJhY2sgY3JlYXRlX2JpZ19jYjsKLSAgICBiYXBfYnJvYWRjYXN0X2JpZF9jYWxsYmFjayBicm9hZGNhc3RfaWRfY2I7Ci19IGJ0YmFwX2Jyb2FkY2FzdF9jYWxsYmFja3NfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgLyoqIHNldCB0byBzaXplb2YoYnRhdl9zb3VyY2VfaW50ZXJmYWNlX3QpICovCi0gICAgc2l6ZV90ICAgICAgICAgIHNpemU7Ci0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgdGhlIGJ0YmFwX2Jyb2FkY2FzdCBjYWxsYmFja3MuCi0gICAgICovCi0gICAgYnRfc3RhdHVzX3QgKCppbml0KShidGJhcF9icm9hZGNhc3RfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICBpbnQgbWF4X2Jyb2FkY2FzdCwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZywgaW50IG1vZGUpOwotCi0gICAgLyoqIEVuYWJsZSBicm9hZGNhc3Qgd2l0aCBwcm92aWRlZCBjb2RlYyBjb25maWcgKi8KLSAgICBidF9zdGF0dXNfdCAoKmVuYWJsZV9icm9hZGNhc3QpKGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb25maWcpOwotCi0gICAgLyoqIGRpc2FibGUgYnJvYWRjYXN0IHRvIG1vdmUgdGhlIHN0YXRlIG1hY2hpbmUgdG8gaWRsZSBzdGF0ZSAqLwotICAgIGJ0X3N0YXR1c190ICgqZGlzYWJsZV9icm9hZGNhc3QpKGludCBhZHZfaWQpOwotCi0gICAgLyoqIHNldHMgYmFwIGJyb2FkY2FzdCBhcyBhY3RpdmUgc2Vzc2lvbiAqLwotICAgIGJ0X3N0YXR1c190ICgqc2V0X2Jyb2FkY2FzdF9hY3RpdmUpKGJvb2wgZW5hYmxlLCB1aW50OF90IGFkdl9pZCk7Ci0KLSAgICAvKiogY29uZmlndXJlIHRoZSBjb2RlY3Mgc2V0dGluZ3MgcHJlZmVyZW5jZXMgKi8KLSAgICBidF9zdGF0dXNfdCAoKmNvZGVjX2NvbmZpZ19jaGFuZ2UpKHVpbnQ4X3QgYWR2X2lkLCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnKTsKLQotICAgIC8qKiBEaXNhYmxlIElTTyBkYXRhcGF0aCAqLwotICAgIGJ0X3N0YXR1c190ICgqc2V0dXBfYXVkaW9wYXRoKShib29sIGVuYWJsZSwgdWludDhfdCBhZHZfaWQsIHVpbnQ4X3QgYmlnX2hhbmRsZSwgaW50IG51bV9iaXNlcywgaW50KiBiaXNfaGFuZGxlcyk7Ci0KLSAgICAvKiogR2V0IHN0b3JlZCBlbmNyeXB0aW9uIGtleSAqLwotICAgIHN0ZDo6c3RyaW5nICgqZ2V0X2VuY3J5cHRpb25fa2V5KSggdm9pZCApOwotCi0gICAgLyoqIFNldCBFbmNyeXB0aW9uIHdpdGggZW5jcnlwdGlvbiBsZW5naHQgcHJvdmlkZWQgKi8KLSAgICBidF9zdGF0dXNfdCAoKnNldF9lbmNyeXB0aW9uKSAoYm9vbCBlbmFibGVkLCB1aW50OF90IGtleV9sZW5ndGgpOwotCi0gICAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICAgIHZvaWQgICgqY2xlYW51cCkoIHZvaWQgKTsKLQotfSBidGJhcF9icm9hZGNhc3RfaW50ZXJmYWNlX3Q7Ci1fX0VORF9ERUNMUwotI2VuZGlmIC8qQU5EUk9JRF9JTkNMVURFX0JUX0JBUF9CQV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2JhcF91Y2xpZW50LmggYi9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfYmFwX3VjbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1YTQ4MS4uMDAwMDAwMAotLS0gYS9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfYmFwX3VjbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9CQVBfVUNMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9CQVBfVUNMSUVOVF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9hdi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3BhY3NfY2xpZW50Lmg+Ci0KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYmFwIHsKLW5hbWVzcGFjZSB1Y2FzdCB7Ci0KLSNkZWZpbmUgQlRfUFJPRklMRV9CQVBfVUNMSUVOVF9JRCAiYnRfYmFwX3VjbGllbnQiCi0KLXVzaW5nIGJsdWV0b290aDo6YmFwOjpwYWNzOjpDb2RlY0NvbmZpZzsKLQotY29uc3RleHByIHVpbnQ4X3QgQVNFX0RJUkVDVElPTl9TSU5LICAgICAgICAgICA9IDB4MDEgPDwgMDsKLWNvbnN0ZXhwciB1aW50OF90IEFTRV9ESVJFQ1RJT05fU1JDICAgICAgICAgICAgPSAweDAxIDw8IDE7Ci0KLWNvbnN0ZXhwciB1aW50OF90IExBVEVOQ1lfTE9XICAgICAgICAgICAgICAgICAgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3QgTEFURU5DWV9CQUxBTkNFRCAgICAgICAgICAgICA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBMQVRFTkNZX0hJR0ggICAgICAgICAgICAgICAgID0gMHgwMzsKLQotLy8gQ29udGVudCB0eXBlcwotY29uc3RleHByIHVpbnQxNl90IENPTlRFTlRfVFlQRV9VTlNQRUNJRklFRCAgICA9IDB4MDAwMTsgLy8gVW5zcGVjaWZpZWQKLWNvbnN0ZXhwciB1aW50MTZfdCBDT05URU5UX1RZUEVfQ09OVkVSU0FUSU9OQUwgPSAweDAwMDI7IC8vIENvbnZlcnNhdGlvbmFsCi0KLS8vIE1lZGlhKG11c2ljIHBsYXliYWNrLCByYWRpbywgcG9kY2FzdCBvciBtb3ZpZSBzb3VuZHRyYWNrLCBvciB0diBhdWRpbykKLWNvbnN0ZXhwciB1aW50MTZfdCBDT05URU5UX1RZUEVfTUVESUEgICAgICAgICAgPSAweDAwMDQ7Ci1jb25zdGV4cHIgdWludDE2X3QgQ09OVEVOVF9UWVBFX0dBTUUgICAgICAgICAgID0gMHgwMDA4OyAvLyBHYW1lIEF1ZGlvCi1jb25zdGV4cHIgdWludDE2X3QgQ09OVEVOVF9UWVBFX0lOU1RSVUNUSU9OQUwgID0gMHgwMDEwOyAvLyBJbnN0cnVjdGlvbmFsCi0KLS8vIE1hbk1hY2hpbmUod2l0aCB2b2ljZSByZWNvZ25pdGlvbiBvciB2aXJ0dWFsIGFzc2lzdGFudHMpCi1jb25zdGV4cHIgdWludDE2X3QgQ09OVEVOVF9UWVBFX01BTl9NQUNISU5FICAgID0gMHgwMDIwOwotY29uc3RleHByIHVpbnQxNl90IENPTlRFTlRfVFlQRV9MSVZFICAgICAgICAgICA9IDB4MDA0MDsgLy8gTGl2ZSBhdWRpbwotCi0vLyBTb3VuZCBFZmZlY3RzKGluY2x1ZGluZyBrZXlib2FyZCBhbmQgdG91Y2ggZmVlZGJhY2s7Ci0vLyBtZW51IGFuZCB1c2VyIGludGVyZmFjZSBzb3VuZHM7IGFuZCBvdGhlciBzeXN0ZW0gc291bmRzKQotY29uc3RleHByIHVpbnQxNl90IENPTlRFTlRfVFlQRV9TT1VORF9FRkZFQ1RTICA9IDB4MDA4MDsKLQotLy8gTm90aWZpY2F0aW9uIGFuZCByZW1pbmRlciBzb3VuZHM7IGF0dGVudGlvbi1zZWVraW5nIGF1ZGlvLAotLy9mb3IgZXhhbXBsZSwgaW4gYmVlcHMgc2lnbmFsaW5nIHRoZSBhcnJpdmFsIG9mIGEgbWVzc2FnZQotY29uc3RleHByIHVpbnQxNl90IENPTlRFTlRfVFlQRV9OT1RJRklDQVRJT05TICA9IDB4MDEwMDsKLWNvbnN0ZXhwciB1aW50MTZfdCBDT05URU5UX1RZUEVfUklOR1RPTkUgICAgICAgPSAweDAyMDA7IC8vIFJpbmd0b25lCi1jb25zdGV4cHIgdWludDE2X3QgQ09OVEVOVF9UWVBFX0FMRVJUICAgICAgICAgID0gMHgwNDAwOyAvLyBJbW1lZGlhdGVBbGVydAotY29uc3RleHByIHVpbnQxNl90IENPTlRFTlRfVFlQRV9FTUVSR0VOQ1kgICAgICA9IDB4MDgwMDsgLy8gRW1lcmdlbmN5QWxlcnQKLQotLy8gQXVkaW8gbG9jYXRpb25zCi1jb25zdGV4cHIgdWludDMyX3QgQVVESU9fTE9DX0xFRlQgICAgICAgICAgICAgID0gMHgwMDAxOwotY29uc3RleHByIHVpbnQzMl90IEFVRElPX0xPQ19SSUdIVCAgICAgICAgICAgICA9IDB4MDAwMjsKLWNvbnN0ZXhwciB1aW50MzJfdCBBVURJT19MT0NfQ0VOVEVSICAgICAgICAgICAgPSAweDAwMDQ7Ci0KLWNvbnN0ZXhwciB1aW50OF90ICBMRV8yTV9QSFkgICAgICAgICAgICAgPSAweDAyOwotY29uc3RleHByIHVpbnQ4X3QgIExFX1FIU19QSFkgICAgICAgICAgICA9IDB4ODA7Ci0KLXR5cGVkZWYgdWludDhfdCBzZHVfaW50ZXJ2YWxfdFszXTsKLXR5cGVkZWYgdWludDhfdCBwcmVzZW50YXRpb25fZGVsYXlfdFszXTsKLXR5cGVkZWYgdWludDhfdCBjb2RlY190eXBlX3RbNV07Ci10eXBlZGVmIHVpbnQ4X3QgY29kZWNfY29uZmlnWzI1NV07Ci0KLXN0cnVjdCBDSVNDb25maWcgewotICB1aW50OF90IGNpc19pZDsKLSAgdWludDE2X3QgbWF4X3NkdV9tX3RvX3M7Ci0gIHVpbnQxNl90IG1heF9zZHVfc190b19tOwotICB1aW50OF90IHBoeV9tX3RvX3M7Ci0gIHVpbnQ4X3QgcGh5X3NfdG9fbTsKLSAgdWludDhfdCBydG5fbV90b19zOwotICB1aW50OF90IHJ0bl9zX3RvX207Ci19OwotCi1zdHJ1Y3QgQ0lHQ29uZmlnIHsKLSAgdWludDhfdCBjaWdfaWQ7Ci0gIHVpbnQ4X3QgY2lzX2NvdW50OwotICB1aW50OF90IHBhY2tpbmc7Ci0gIHVpbnQ4X3QgZnJhbWluZzsKLSAgdWludDE2X3QgbWF4X3Rwb3J0X2xhdGVuY3lfbV90b19zOwotICB1aW50MTZfdCBtYXhfdHBvcnRfbGF0ZW5jeV9zX3RvX207Ci0gIHNkdV9pbnRlcnZhbF90IHNkdV9pbnRlcnZhbF9tX3RvX3M7Ci0gIHNkdV9pbnRlcnZhbF90IHNkdV9pbnRlcnZhbF9zX3RvX207Ci19OwotCi1zdHJ1Y3QgQVNDU0NvbmZpZyB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50OF90IGNpc19pZDsKLSAgdWludDhfdCB0YXJnZXRfbGF0ZW5jeTsKLSAgYm9vbCBiaV9kaXJlY3Rpb25hbDsKLSAgcHJlc2VudGF0aW9uX2RlbGF5X3QgcHJlc2VudGF0aW9uX2RlbGF5OwotfTsKLQotc3RydWN0IFFvc0NvbmZpZyB7Ci0gIENJR0NvbmZpZyBjaWdfY29uZmlnOwotICBzdGQ6OnZlY3RvcjxDSVNDb25maWc+IGNpc19jb25maWdzOyAvLyBpbmRpdmlkdWFsIENJUyBjb25maWdzCi0gIHN0ZDo6dmVjdG9yPEFTQ1NDb25maWc+IGFzY3NfY29uZmlnczsKLX07Ci0KLWVudW0gY2xhc3MgQXNlU3RhdGUgewotICBJRExFID0gMCwKLSAgQ09ERUNfQ09ORklHVVJFRCwKLSAgUU9TX0NPTkZJR1VSRUQsCi0gIEVOQUJMSU5HLAotICBTVFJFQU1JTkcsCi0gIERJU0FCTElORywKLSAgUkVMRUFTSU5HLAotfTsKLQotZW51bSBjbGFzcyBTdHJlYW1TdGF0ZSB7Ci0gIERJU0NPTk5FQ1RFRCA9IDAsCi0gIENPTk5FQ1RJTkcsCi0gIENPTk5FQ1RFRCwKLSAgU1RBUlRJTkcsCi0gIFNUUkVBTUlORywKLSAgU1RPUFBJTkcsCi0gIERJU0NPTk5FQ1RJTkcsCi0gIFJFQ09ORklHVVJJTkcsCi0gIFVQREFUSU5HCi19OwotCi1lbnVtIGNsYXNzIERldmljZVN0YXRlIHsKLSAgRElTQ09OTkVDVEVEID0gMCwKLSAgQ09OTkVDVElORywKLSAgQ09OTkVDVEVECi19OwotCi1lbnVtIGNsYXNzIFN0cmVhbURpc2NSZWFzb24gewotICBSRUFTT05fTk9ORSwKLSAgUkVBU09OX1VTRVJfRElTQwotfTsKLQotc3RydWN0IENvZGVjUW9zQ29uZmlnIHsKLSAgQ29kZWNDb25maWcgY29kZWNfY29uZmlnOwotICBRb3NDb25maWcgcW9zX2NvbmZpZzsKLX07Ci0KLXN0cnVjdCBTdHJlYW1UeXBlIHsKLSAgdWludDE2X3QgdHlwZTsKLSAgdWludDE2X3QgYXVkaW9fY29udGV4dDsKLSAgdWludDhfdCAgZGlyZWN0aW9uOwotfTsKLQotc3RydWN0IFN0cmVhbUNvbm5lY3QgewotICBTdHJlYW1UeXBlIHN0cmVhbV90eXBlOwotICAvL0NDSURfTGlzdCBjY2lkczsgLy9UT0RPCi0gIHN0ZDo6dmVjdG9yPENvZGVjUW9zQ29uZmlnPiBjb2RlY19xb3NfY29uZmlnX3BhaXI7Ci19OwotCi1lbnVtIGNsYXNzIFN0cmVhbVJlY29uZmlnVHlwZSB7Ci0gIENPREVDX0NPTkZJRywKLSAgUU9TX0NPTkZJRwotfTsKLQotc3RydWN0IFN0cmVhbVJlY29uZmlnIHsKLSAgU3RyZWFtVHlwZSBzdHJlYW1fdHlwZTsKLSAgU3RyZWFtUmVjb25maWdUeXBlIHJlY29uZl90eXBlOwotICBzdGQ6OnZlY3RvcjxDb2RlY1Fvc0NvbmZpZz4gY29kZWNfcW9zX2NvbmZpZ19wYWlyOwotfTsKLQotZW51bSBjbGFzcyBTdHJlYW1VcGRhdGVUeXBlIHsKLSAgU1RSRUFNSU5HX0NPTlRFWFQsCi19OwotCi1zdHJ1Y3QgU3RyZWFtVXBkYXRlIHsKLSAgU3RyZWFtVHlwZSBzdHJlYW1fdHlwZTsKLSAgU3RyZWFtVXBkYXRlVHlwZSB1cGRhdGVfdHlwZTsKLSAgdWludDE2X3QgdXBkYXRlX3ZhbHVlOwotfTsKLQotc3RydWN0IFN0cmVhbVN0YXRlSW5mbyB7Ci0gIFN0cmVhbVR5cGUgc3RyZWFtX3R5cGU7Ci0gIFN0cmVhbVN0YXRlIHN0cmVhbV9zdGF0ZTsKLSAgU3RyZWFtRGlzY1JlYXNvbiByZWFzb247Ci19OwotCi1zdHJ1Y3QgU3RyZWFtQ29uZmlnSW5mbyB7Ci0gIFN0cmVhbVR5cGUgc3RyZWFtX3R5cGU7Ci0gIENvZGVjQ29uZmlnIGNvZGVjX2NvbmZpZzsgLy8gY29kZWMKLSAgdWludDMyX3QgYXVkaW9fbG9jYXRpb247IC8vIGxvY2F0aW9uIGluZm8gb2YgcmVtb3RlIGRldiBmb3IgdGhlIHN0cmVhbQotICBRb3NDb25maWcgcW9zX2NvbmZpZzsgLy8gY3VycmVudCBDSUcsIENJU3MgY29uZmlndXJhdGlvbgotICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gY29kZWNzX3NlbGVjdGFibGU7IC8vIHBhY3MgY29kZWMgY2FwYWJpbGl0aWVzCi19OwotCi1jbGFzcyBVY2FzdENsaWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5VY2FzdENsaWVudENhbGxiYWNrcygpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIHZvaWQgT25TdHJlYW1TdGF0ZShjb25zdCBSYXdBZGRyZXNzICZhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVN0YXRlSW5mbz4gc3RyZWFtc19zdGF0ZV9pbmZvKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uU3RyZWFtQ29uZmlnKGNvbnN0IFJhd0FkZHJlc3MgJmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29uZmlnSW5mbz4gc3RyZWFtc19jb25maWdfaW5mbykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBPblN0cmVhbUF2YWlsYWJsZShjb25zdCBSYXdBZGRyZXNzICZhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNyY19hdWRpb19jb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzaW5rX2F1ZGlvX2NvbnRleHRzKSA9IDA7Ci19OwotCi1jbGFzcyBVY2FzdENsaWVudEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5VY2FzdENsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAvKiogUmVnaXN0ZXIgdGhlIHVjYXN0IGNsaWVudCBjYWxsYmFja3MgKi8KLSAgdmlydHVhbCB2b2lkIEluaXQoVWNhc3RDbGllbnRDYWxsYmFja3MqIGNhbGxiYWNrcykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+ICZhZGRyZXNzLCBib29sIGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtQ29ubmVjdD4gJnN0cmVhbXMpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAmc3RyZWFtcykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBTdGFydChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtVHlwZT4gJnN0cmVhbXMpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgU3RvcChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1UeXBlPiAmc3RyZWFtcykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBSZWNvbmZpZ3VyZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUmVjb25maWc+ICZzdHJlYW1zKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFVwZGF0ZVN0cmVhbShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbVVwZGF0ZT4gJnVwZGF0ZV9zdHJlYW1zKSA9IDA7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2aXJ0dWFsIHZvaWQgQ2xlYW51cCgpID0gMDsKLX07Ci0KLVVjYXN0Q2xpZW50SW50ZXJmYWNlKiBidGlmX2JhcF91Y2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLQotfSAgLy8gbmFtZXNwYWNlIHVjYXN0Ci19ICAvLyBuYW1lc3BhY2UgYmFwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQlRfQkFQX1VDTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2NzaXAuaCBiL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9jc2lwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZWVlZjEuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X2NzaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JUX0NTSVBfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQ1NJUF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotX19CRUdJTl9ERUNMUwotCi0jZGVmaW5lIEJUX1BST0ZJTEVfQ1NJUF9DTElFTlRfSUQgImNzaXBfY2xpZW50IgotCi0vKiogQ2FsbGJhY2sgd2hlbiBhcHAgaGFzIHJlZ2lzdGVyZWQgd2l0aCBDU0lQIENsaWVudCBtb2R1bGUKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJ0Y3NpcF9jc2lwX2FwcF9yZWdpc3RlcmVkX2NhbGxiYWNrKSh1aW50OF90IHN0YXR1cywgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgYXBwX3V1aWQpOwotCi0vKiogQ2FsbGJhY2sgd2hlbiBjb25uZWN0aW9uIHN0YXRlIGlzIGNoYW5nZWQgZm9yIENTSVAgUHJvZmlsZQotICovCi10eXBlZGVmIHZvaWQgKCogYnRjc2lwX2NzaXBfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjaykodWludDhfdCBhcHBfaWQsIFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0ZSwgdWludDhfdCBzdGF0dXMpOwotCi0vKiogQ2FsbGJhY2sgd2hlbiBuZXcgc2V0IGhhcyBiZWVuIGlkZW50aWZpZWQgb24gcmVtb3RlIGRldmljZQotICovCi10eXBlZGVmIHZvaWQgKCogYnRjc2lwX25ld19zZXRfZm91bmRfY2FsbGJhY2spICh1aW50OF90IHNldF9pZCwgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSwgdWludDhfdCogc2lyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgcF9zcnZjX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2tfc3VwcG9ydCk7Ci0KLS8qKiBDYWxsYmFjayB3aGVuIG5ldyBzZXQgbWVtYmVyIGhhcyBiZWVuIGlkZW50aWZpZWQKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJ0Y3NpcF9uZXdfc2V0X21lbWJlcl9mb3VuZF9jYWxsYmFjaykgKHVpbnQ4X3Qgc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogQ2FsbGJhY2sgZm9yIGxvY2sgc3RhdHVzIGNoYW5nZWQgZXZlbnQgdG8gcmVxdWVzdGluZyBjbGllbnQKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJ0Y3NpcF9sb2NrX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2spICh1aW50OF90IGFwcF9pZCwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBhZGRyKTsKLQotLyoqIENhbGxiYWNrIHdoZW4gbG9jayBpcyBhdmFpbGFibGUgb24gZWFybGllciBkZW55aW5nIHNldCBtZW1iZXIKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJ0Y3NpcF9sb2NrX2F2YWlsYWJsZV9jYWxsYmFjaykgKHVpbnQ4X3QgYXBwX2lkLCB1aW50OF90IHNldF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIENhbGxiYWNrIHdoZW4gc2l6ZSBvZiBjb29yZGluYXRlZCBzZXQgaGFzIGJlZW4gY2hhbmdlZAotICovCi10eXBlZGVmIHZvaWQgKCogYnRjc2lwX3NldF9zaXplX2NoYW5nZWRfY2FsbGJhY2spICh1aW50OF90IHNldF9pZCwgdWludDhfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKiBDYWxsYmFjayB3aGVuIFNJUksgb2YgY29vcmRpbmF0ZWQgc2V0IGhhcyBiZWVuIGNoYW5nZWQKLSAqLwotdHlwZWRlZiB2b2lkICgqIGJ0Y3NpcF9zZXRfc2lya19jaGFuZ2VkX2NhbGxiYWNrKSAodWludDhfdCBzZXRfaWQsIHVpbnQ4X3QqIHNpcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqIEJULUNTSVAgY2FsbGJhY2sgc3RydWN0dXJlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNpemVfdCBzaXplOwotICAgIGJ0Y3NpcF9jc2lwX2FwcF9yZWdpc3RlcmVkX2NhbGxiYWNrICAgYXBwX3JlZ2lzdGVyZWRfY2I7Ci0gICAgYnRjc2lwX2NzaXBfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjayBjb25uX3N0YXRlX2NiOwotICAgIGJ0Y3NpcF9uZXdfc2V0X2ZvdW5kX2NhbGxiYWNrICAgICAgICAgbmV3X3NldF9mb3VuZF9jYjsKLSAgICBidGNzaXBfbmV3X3NldF9tZW1iZXJfZm91bmRfY2FsbGJhY2sgIG5ld19zZXRfbWVtYmVyX2NiOwotICAgIGJ0Y3NpcF9sb2NrX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2sgICAgbG9ja19zdGF0dXNfY2I7Ci0gICAgYnRjc2lwX2xvY2tfYXZhaWxhYmxlX2NhbGxiYWNrICAgICAgICBsb2NrX2F2YWlsYWJsZV9jYjsKLSAgICBidGNzaXBfc2V0X3NpemVfY2hhbmdlZF9jYWxsYmFjayAgICAgIHNpemVfY2hhbmdlZF9jYjsKLSAgICBidGNzaXBfc2V0X3NpcmtfY2hhbmdlZF9jYWxsYmFjayAgICAgIHNpcmtfY2hhbmdlZF9jYjsKLX0gYnRjc2lwX2NhbGxiYWNrc190OwotCi0vKiogUmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQtQ1NJUCBpbnRlcmZhY2UuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAvKiogc2V0IHRvIHNpemVvZihCdENzaXBJbnRlcmZhY2UpICovCi0gICAgc2l6ZV90IHNpemU7Ci0KLSAgICAvKiogUmVnaXN0ZXIgdGhlIEJ0Q3NpcEludGVyZmFjZSBjYWxsYmFja3MKLSAgICAgKi8KLSAgICBidF9zdGF0dXNfdCAoKmluaXQpIChidGNzaXBfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7Ci0KLSAgICAvKiogQ1NJUCBvcHBvcnR1bmlzdGljIGdhdHQgY2xpZW50IGNvbm5lY3Rpb24qLwotICAgIGJ0X3N0YXR1c190ICgqY29ubmVjdCkgKHVpbnQ4X3QgYXBwX2lkLCBSYXdBZGRyZXNzICpiZF9hZGRyKTsKLQotICAgIC8qKiBkaXNjb25uZWN0IGNzaXAgZ2F0dCBjb25uZWN0aW9uICovCi0gICAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KSAodWludDhfdCBhcHBfaWQsIFJhd0FkZHJlc3MgKmJkX2FkZHIgKTsKLQotICAgIC8qKiByZWdpc3RlciBhcHAvbW9kdWxlIHdpdGggQ1NJUCBwcm9maWxlKi8KLSAgICBidF9zdGF0dXNfdCAoKnJlZ2lzdGVyX2NzaXBfYXBwKSAoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCk7Ci0KLSAgICAvKiogdW5yZWdpc3RlciBhcHAvbW9kdWxlIHdpdGggQ1NJUCBwcm9maWxlICovCi0gICAgYnRfc3RhdHVzX3QgKCp1bnJlZ2lzdGVyX2NzaXBfYXBwKSAodWludDhfdCBhcHBfaWQpOwotCi0gICAgLyoqIGNoYW5nZSBsb2NrIHZhbHVlICovCi0gICAgYnRfc3RhdHVzX3QgKCpzZXRfbG9ja192YWx1ZSkgKHVpbnQ4X3QgYXBwX2lkLCB1aW50OF90IHNldF9pZCwgdWludDhfdCBsb2NrX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGRldmljZXMpOwotCi0gICAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICAgIHZvaWQgICgqY2xlYW51cCkgKHZvaWQpOwotCi19IGJ0Y3NpcF9pbnRlcmZhY2VfdDsKLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQlRfQ1NJUF9IICovCmRpZmYgLS1naXQgYS9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfbWNwLmggYi9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfbWNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZGU1MmQuLjAwMDAwMDAKLS0tIGEvbGVfYXVkaW8vdmhhbC9pbmNsdWRlL2hhcmR3YXJlL2J0X21jcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9NQ1BfSAotI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfTUNQX0gKLQotCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNkZWZpbmUgQlRfUFJPRklMRV9NQ1BfSUQgIm1jc19zZXJ2ZXIiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG1jcF9zZXJ2ZXIgewotCi1jbGFzcyBNY3BTZXJ2ZXJDYWxsYmFja3MgewotICBwdWJsaWM6Ci0gIHZpcnR1YWwgfk1jcFNlcnZlckNhbGxiYWNrcygpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlKGludCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpID0gMDsKLSAgdmlydHVhbCB2b2lkIE1lZGlhQ29udHJvbFBvaW50Q2hhbmdlUmVxKHVpbnQ4X3Qgc3RhdGUsICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBUcmFja1Bvc2l0aW9uQ2hhbmdlUmVxKGludDMyX3QgcG9zaXRpb24pID0gMDsKLSAgdmlydHVhbCB2b2lkIFBsYXlpbmdPcmRlckNoYW5nZVJlcSh1aW50MzJfdCBvcmRlcikgPSAwOwotfTsKLQotCi1jbGFzcyBNY3BTZXJ2ZXJJbnRlcmZhY2UgewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+TWNwU2VydmVySW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotICAgIHZpcnR1YWwgdm9pZCBJbml0KE1jcFNlcnZlckNhbGxiYWNrcyogY2FsbGJhY2tzLCBVdWlkIHV1aWQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgTWVkaWFTdGF0ZSh1aW50OF90IHN0YXRlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE1lZGlhUGxheWVyTmFtZSh1aW50OF90ICpuYW1lKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE1lZGlhQ29udHJvbFBvaW50T3Bjb2RlU3VwcG9ydGVkKHVpbnQzMl90IGZlYXR1cmUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgTWVkaWFDb250cm9sUG9pbnQodWludDhfdCB2YWx1ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBUcmFja0NoYW5nZWQoYm9vbCBzdGF0dXMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgVHJhY2tUaXRsZSh1aW50OF90KiB0aXRsZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBUcmFja1Bvc2l0aW9uKGludDMyX3QgcG9zaXRpb24pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgVHJhY2tEdXJhdGlvbihpbnQzMl90IGR1cmF0aW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFBsYXlpbmdPcmRlclN1cHBvcnRlZCh1aW50MTZfdCBvcmRlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBQbGF5aW5nT3JkZXIodWludDhfdCB2YWx1ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBDb250ZW50Q29udHJvbElkKHVpbnQ4X3QgY2NpZCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBTZXRBY3RpdmVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHNldF9pZCwgaW50IHByb2ZpbGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdE1jcChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIEJvbmRTdGF0ZUNoYW5nZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgc3RhdGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgQ2xlYW51cCh2b2lkKSA9IDA7Ci19OwotCi19Ci19Ci0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX01DUF9IICovCmRpZmYgLS1naXQgYS9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfcGFjc19jbGllbnQuaCBiL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9wYWNzX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTc5YjcyLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF9wYWNzX2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JUX1BBQ1NfQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JUX1BBQ1NfQ0xJRU5UX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGJhcCB7Ci1uYW1lc3BhY2UgcGFjcyB7Ci0KLSNkZWZpbmUgQlRfUFJPRklMRV9QQUNTX0NMSUVOVF9JRCAiYnRfcGFjc19jbGllbnQiCi0KLWVudW0gY2xhc3MgQ29kZWNEaXJlY3Rpb24gewotICBDT0RFQ19ESVJfU0lOSyA9IDB4MSA8PCAwLAotICBDT0RFQ19ESVJfU1JDICA9IDB4MSA8PCAxCi19OwotCi1lbnVtIGNsYXNzIENvZGVjQ2FwRnJhbWVEdXJhdGlvbiB7Ci0gIEZSQU1FX0RVUl83XzUgICAgICAgICA9IDB4MSA8PCAwLAotICBGUkFNRV9EVVJfMTAgICAgICAgICAgPSAweDEgPDwgMSwKLSAgRlJBTUVfRFVSXzdfNV9QUkVGICAgID0gMHgxIDw8IDQsCi0gIEZSQU1FX0RVUl8xMF9QUkVGICAgICA9IDB4MSA8PCA1LAotfTsKLQotZW51bSBjbGFzcyBDb2RlY0ZyYW1lRHVyYXRpb24gewotICBGUkFNRV9EVVJfN181ICAgICAgICAgPSAweDAwLAotICBGUkFNRV9EVVJfMTAgICAgICAgICAgPSAweDAxLAotfTsKLQotZW51bSBjbGFzcyBDb2RlY0NhcENobmxDb3VudCB7Ci0gIENITkxfQ09VTlRfT05FICAgICAgICAgPSAweDEgPDwgMCwKLSAgQ0hOTF9DT1VOVF9UV08gICAgICAgICA9IDB4MSA8PCAxLAotICBDSE5MX0NPVU5UX1RIUkVFICAgICAgID0gMHgxIDw8IDIsCi0gIENITkxfQ09VTlRfRk9VUiAgICAgICAgPSAweDEgPDwgMywKLSAgQ0hOTF9DT1VOVF9GSVZFICAgICAgICA9IDB4MSA8PCA0LAotICBDSE5MX0NPVU5UX1NJWCAgICAgICAgID0gMHgxIDw8IDUsCi0gIENITkxfQ09VTlRfU0VWRU4gICAgICAgPSAweDEgPDwgNiwKLSAgQ0hOTF9DT1VOVF9FSUdIVCAgICAgICA9IDB4MSA8PCA3LAotfTsKLQotZW51bSBjbGFzcyBDb25uZWN0aW9uU3RhdGUgewotICBESVNDT05ORUNURUQgPSAwLAotICBDT05ORUNUSU5HLAotICBDT05ORUNURUQsCi0gIERJU0NPTk5FQ1RJTkcKLX07Ci0KLWVudW0gY2xhc3MgQ29kZWNJbmRleCB7Ci0gIENPREVDX0lOREVYX1NPVVJDRV9NSU4gPSAweDA5LAotCi0gIC8vIEFkZCBhbiBlbnRyeSBmb3IgZWFjaCBzb3VyY2UgY29kZWMgaGVyZS4KLSAgLy8gTk9URTogVGhlIHZhbHVlcyBzaG91bGQgYmUgc2FtZSBhcyB0aG9zZSBsaXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBmaWxlOgotICAvLyAgIEJsdWV0b290aENvZGVjQ29uZmlnLmphdmEKLSAgQ09ERUNfSU5ERVhfU09VUkNFX0xDMyA9IENPREVDX0lOREVYX1NPVVJDRV9NSU4sCi0gIENPREVDX0lOREVYX1NPVVJDRV9NQVgsCi0gIENPREVDX0lOREVYX01JTiA9IENPREVDX0lOREVYX1NPVVJDRV9NSU4sCi0gIENPREVDX0lOREVYX01BWCA9IENPREVDX0lOREVYX1NPVVJDRV9NQVgsCi19OwotCi1lbnVtIGNsYXNzIENvZGVjUHJpb3JpdHkgewotICAvLyBEaXNhYmxlIHRoZSBjb2RlYy4KLSAgQ09ERUNfUFJJT1JJVFlfRElTQUJMRUQgPSAtMSwKLQotICAvLyBSZXNldCB0aGUgY29kZWMgcHJpb3JpdHkgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gIENPREVDX1BSSU9SSVRZX0RFRkFVTFQgPSAwLAotCi0gIC8vIEhpZ2hlc3QgY29kZWMgcHJpb3JpdHkuCi0gIENPREVDX1BSSU9SSVRZX0hJR0hFU1QgPSAxMDAwICogMTAwMAotfTsKLQotZW51bSBjbGFzcyBDb2RlY1NhbXBsZVJhdGUgewotICBDT0RFQ19TQU1QTEVfUkFURV9OT05FICAgPSAweDAsCi0gIENPREVDX1NBTVBMRV9SQVRFXzQ0MTAwICA9IDB4MSA8PCAwLAotICBDT0RFQ19TQU1QTEVfUkFURV80ODAwMCAgPSAweDEgPDwgMSwKLSAgQ09ERUNfU0FNUExFX1JBVEVfODgyMDAgID0gMHgxIDw8IDIsCi0gIENPREVDX1NBTVBMRV9SQVRFXzk2MDAwICA9IDB4MSA8PCAzLAotICBDT0RFQ19TQU1QTEVfUkFURV8xNzY0MDAgPSAweDEgPDwgNCwKLSAgQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwID0gMHgxIDw8IDUsCi0gIENPREVDX1NBTVBMRV9SQVRFXzE2MDAwICA9IDB4MSA8PCA2LAotICBDT0RFQ19TQU1QTEVfUkFURV8yNDAwMCAgPSAweDEgPDwgNywKLSAgQ09ERUNfU0FNUExFX1JBVEVfMzIwMDAgID0gMHgxIDw8IDgsCi0gIENPREVDX1NBTVBMRV9SQVRFXzgwMDAgICA9IDB4MSA8PCA5Ci19OwotCi1lbnVtIGNsYXNzIENvZGVjQlBTIHsKLSAgQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUgPSAweDAsCi0gIENPREVDX0JJVFNfUEVSX1NBTVBMRV8xNiAgID0gMHgxIDw8IDAsCi0gIENPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCAgID0gMHgxIDw8IDEsCi0gIENPREVDX0JJVFNfUEVSX1NBTVBMRV8zMiAgID0gMHgxIDw8IDIKLX07Ci0KLWVudW0gY2xhc3MgQ29kZWNDaGFubmVsTW9kZSB7Ci0gIENPREVDX0NIQU5ORUxfTU9ERV9OT05FICAgPSAweDAsCi0gIENPREVDX0NIQU5ORUxfTU9ERV9NT05PICAgPSAweDEgPDwgMCwKLSAgQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTyA9IDB4MSA8PCAxCi19OwotCi1zdHJ1Y3QgQ29kZWNDb25maWcgewotICBDb2RlY0luZGV4IGNvZGVjX3R5cGU7Ci0gIENvZGVjUHJpb3JpdHkgY29kZWNfcHJpb3JpdHk7IC8vIENvZGVjIHNlbGVjdGlvbiBwcmlvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byBvdGhlciBjb2RlY3M6IGxhcmdlciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyBoaWdoZXIgcHJpb3JpdHkuIElmIDAsIHJlc2V0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQuCi0gIENvZGVjU2FtcGxlUmF0ZSBzYW1wbGVfcmF0ZTsKLSAgQ29kZWNCUFMgYml0c19wZXJfc2FtcGxlOwotICBDb2RlY0NoYW5uZWxNb2RlIGNoYW5uZWxfbW9kZTsKLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18xOyAgICAgLy8gQ29kZWMtc3BlY2lmaWMgdmFsdWUgMQotICBpbnQ2NF90IGNvZGVjX3NwZWNpZmljXzI7ICAgICAvLyBDb2RlYy1zcGVjaWZpYyB2YWx1ZSAyCi0gIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMzsgICAgIC8vIENvZGVjLXNwZWNpZmljIHZhbHVlIDMKLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY180OyAgICAgLy8gQ29kZWMtc3BlY2lmaWMgdmFsdWUgNAotfTsKLQotY2xhc3MgUGFjc0NsaWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5QYWNzQ2xpZW50Q2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgcGFjcyBzZXJ2ZXIgcmVnaXN0cmF0aW9uIHN0YXR1cyAqLwotICB2aXJ0dWFsIHZvaWQgT25Jbml0aWFsaXplZChpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkKSA9IDA7Ci0KLSAgLyoqIENhbGxiYWNrIGZvciBwYWNzIHNlcnZlciBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZSBzdGF0ZSkgPSAwOwotCi0gIC8qKiBDYWxsYmFjayBmb3IgYXVkaW8gKCBtZWRpYSBvciB2b2ljZSkgYmVpbmcgYXZhaWxhYmxlICovCi0gIHZpcnR1YWwgdm9pZCBPbkF1ZGlvQ29udGV4dEF2YWlsYWJsZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzKSA9IDA7Ci0KLSAgLyoqIENhbGxiYWNrIGZvciBwYWNzIGRpc2NvdmVyeSByZXN1bHRzICovCi0gIHZpcnR1YWwgdm9pZCBPblNlYXJjaENvbXBsZXRlKGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjQ29uZmlnPiBzaW5rX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0NvbmZpZz4gc3JjX3BhY19yZWNvcmRzLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaW5rX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX2xvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgYXZhaWxhYmxlX2NvbnRleHRzLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdXBwb3J0ZWRfY29udGV4dHMpID0gMDsKLX07Ci0KLWNsYXNzIFBhY3NDbGllbnRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFjc0NsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAvKiogUmVnaXN0ZXIgdGhlIFBhY3MgY2xpZW50IGNhbGxiYWNrcyAqLwotICB2aXJ0dWFsIHZvaWQgSW5pdChQYWNzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MpID0gMDsKLQotICAvKiogQ29ubmVjdCB0byBwYWNzIHNlcnZlciAqLwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICAvKiogRGlzY29ubmVjdCBwYWNzIHNlcnZlciAqLwotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdCh1aW50MTZfdCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICAvKiogc3RhcnQgcGFjcyBkaXNjb3ZlcnkgKi8KLSAgdmlydHVhbCB2b2lkIFN0YXJ0RGlzY292ZXJ5KHVpbnQxNl90IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKiBnZXQgYXZhaWxhYmxlIGF1ZGlvIGNvbnRleHQgKi8KLSAgdmlydHVhbCB2b2lkIEdldEF2YWlsYWJsZUF1ZGlvQ29udGV4dHModWludDE2X3QgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0gIC8qKiBDbG9zZXMgdGhlIGludGVyZmFjZS4gKi8KLSAgdmlydHVhbCB2b2lkIENsZWFudXAodWludDE2X3QgY2xpZW50X2lkKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcGFjcwotfSAgLy8gbmFtZXNwYWNlIGJhcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JUX0NMSUVOVF9IICovCmRpZmYgLS1naXQgYS9sZV9hdWRpby92aGFsL2luY2x1ZGUvaGFyZHdhcmUvYnRfdmNwX2NvbnRyb2xsZXIuaCBiL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF92Y3BfY29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTJlMzVhLi4wMDAwMDAwCi0tLSBhL2xlX2F1ZGlvL3ZoYWwvaW5jbHVkZS9oYXJkd2FyZS9idF92Y3BfY29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9WQ1BfQ09OVFJPTExFUl9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9WQ1BfQ09OVFJPTExFUl9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLQotI2RlZmluZSBCVF9QUk9GSUxFX1ZPTFVNRV9DT05UUk9MX0lEICJ2b2x1bWVfY29udHJvbCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdmNwX2NvbnRyb2xsZXIgewotCi1lbnVtIGNsYXNzIENvbm5lY3Rpb25TdGF0ZSB7Ci0gIERJU0NPTk5FQ1RFRCA9IDAsCi0gIENPTk5FQ1RJTkcsCi0gIENPTk5FQ1RFRCwKLSAgRElTQ09OTkVDVElORwotfTsKLQotY2xhc3MgVmNwQ29udHJvbGxlckNhbGxiYWNrcyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5WY3BDb250cm9sbGVyQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotCi0gIC8qKiBDYWxsYmFjayBmb3IgcHJvZmlsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZSAqLwotICB2aXJ0dWFsIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoQ29ubmVjdGlvblN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgT25Wb2x1bWVTdGF0ZUNoYW5nZSh1aW50OF90IHZvbHVtZSwgdWludDhfdCBtdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgT25Wb2x1bWVGbGFnc0NoYW5nZSh1aW50OF90IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLX07Ci0KLWNsYXNzIFZjcENvbnRyb2xsZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VmNwQ29udHJvbGxlckludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAvKiogUmVnaXN0ZXIgdGhlIFZvbHVtZSBDb250cm9sbGVyIGNhbGxiYWNrcyAqLwotICB2aXJ0dWFsIHZvaWQgSW5pdChWY3BDb250cm9sbGVyQ2FsbGJhY2tzKiBjYWxsYmFja3MpID0gMDsKLQotICAvKiogQ29ubmVjdCB0byBWb2x1bWUgUmVuZGVyZXIgZGV2aWNlICovCi0gIHZpcnR1YWwgdm9pZCBDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGJvb2wgaXNEaXJlY3QpID0gMDsKLQotICAvKiogRGlzY29ubmVjdCBmcm9tIFZvbHVtZSBSZW5kZXJlciBkZXZpY2UgKi8KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgPSAwOwotCi0gIC8qKiBTZXQgYWJzb2x1dGUgdm9sdW1lICovCi0gIHZpcnR1YWwgdm9pZCBTZXRBYnNWb2x1bWUodWludDhfdCB2b2x1bWUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgTXV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFVubXV0ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSA9IDA7Ci0KLSAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwotICB2aXJ0dWFsIHZvaWQgQ2xlYW51cCh2b2lkKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdmNwX2NvbnRyb2xsZXIKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9WQ1BfQ09OVFJPTExFUl9IICovCi0KLQpkaWZmIC0tZ2l0IGEvbGludXhfaW5jbHVkZS9sb2cvbG9nLmggYi9saW51eF9pbmNsdWRlL2xvZy9sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMmY3Ny4uMDAwMDAwMAotLS0gYS9saW51eF9pbmNsdWRlL2xvZy9sb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jcHJhZ21hIG9uY2UKLQotLyogVGhpcyBmaWxlIHByb3ZpZGVzIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWRfZXJyb3JXcml0ZUxvZywgd2hpY2ggaXMKLSAqIG5vdCByZXF1aXJlZCBvbiBsaW51eC4gSXQgc2hvdWxkIGJlIG9uIGluY2x1ZGUgcGF0aCBvbmx5IGZvciBsaW51eCBidWlsZC4gKi8KLQotI2lmIGRlZmluZWQoT1NfR0VORVJJQykKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLWlubGluZSBpbnQgYW5kcm9pZF9lcnJvcldyaXRlTG9nKGludCwgY29uc3QgY2hhciopIHsgcmV0dXJuIDA7IH07Ci1pbmxpbmUgaW50IGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKGludCB0YWcsIGNvbnN0IGNoYXIqIHN1YlRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQsIGNvbnN0IGNoYXIqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFMZW4pIHsKLSAgcmV0dXJuIDA7Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9tYWluL0FuZHJvaWQuYnAgYi9tYWluL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNGZmOTEuLjAwMDAwMDAKLS0tIGEvbWFpbi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8vIEJsdWV0b290aCBtYWluIEhXIG1vZHVsZSAvIHNoYXJlZCBsaWJyYXJ5IGZvciB0YXJnZXQKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIkxpYkJsdWV0b290aFNvdXJjZXMiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJ0ZV9jb25mLmNjIiwKLSAgICAgICAgImJ0ZV9pbml0X2NwcF9sb2dnaW5nLmNjIiwKLSAgICAgICAgImJ0ZV9sb2dtc2cuY2MiLAotICAgICAgICAiYnRlX21haW4uY2MiLAotICAgICAgICAic3RhY2tfY29uZmlnLmNjIiwKLSAgICBdCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnRlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpMaWJCbHVldG9vdGhTb3VyY2VzIiwKLSAgICAgICAgIjpMaWJCbHVldG9vdGhTaGltU291cmNlcyIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2dkL3J1c3Qvc2hpbSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9kbSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9hMmRwIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9idG0iLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2F2ZHQiLAotICAgICAgICAic3lzdGVtL2J0L3VkcnYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGlmL2NvIiwKLSAgICAgICAgInN5c3RlbS9idC9oY2kvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdm5kL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2VtYmRydi9zYmMvZW5jb2Rlci9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9lbWJkcnYvc2JjL2RlY29kZXIvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vc2VjdXJpdHkva2V5c3RvcmUvaW5jbHVkZSIsCi0gICAgICAgICJoYXJkd2FyZS9pbnRlcmZhY2VzL2tleW1hc3Rlci80LjAvc3VwcG9ydC9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRCdW5kbGVyU2NoZW1hX2hfYmZicyIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJidF9jYWxsYmFja3NfY3h4X2hlYWRlcnMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGgiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLSAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvc3lzIiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvZG0iLAotICAgICAgICAic3lzdGVtL2J0L2J0Y29yZS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9sMmNhcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svYTJkcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svYnRtIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9hdmR0IiwKLSAgICAgICAgInN5c3RlbS9idC91ZHJ2L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRpZi9jbyIsCi0gICAgICAgICJzeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3ZuZC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL3NlY3VyaXR5L2tleXN0b3JlL2luY2x1ZGUiLAotICAgICAgICAiaGFyZHdhcmUvaW50ZXJmYWNlcy9rZXltYXN0ZXIvNC4wL3N1cHBvcnQvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBsb2d0YWdzOiBbIi4uL0V2ZW50TG9nVGFncy5sb2d0YWdzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJmbGF0YnVmZmVycy1jcHAiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidGUiLAotICAgICAgICAibGliYnQtc2JjLWRlY29kZXIiLAotICAgICAgICAibGliYnQtc2JjLWVuY29kZXIiLAotICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCi0gICAgICAgICJsaWJnNzIyY29kZWMiLAotICAgICAgICAibGlibGMzY29kZWMiLAotICAgICAgICAibGlidWRydi11aXBjIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYmJsdWV0b290aF9nZCIsIC8vIEdhYmVsZG9yc2NoZQotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICAgICAibGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgXSwKLSAgICB3aG9sZV9zdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtYnRhIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidGRldmljZSIsCi0gICAgICAgICJsaWJidGlmIiwKLSAgICAgICAgImxpYmJ0LWhjaSIsCi0gICAgICAgICJsaWJidC1zdGFjayIsCi0gICAgICAgICJsaWJidC11dGlscyIsCi0gICAgICAgICJsaWJidGNvcmUiLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hMmRwQDEuMCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQuY29udHJvbC1WMS1uZGsiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLVYxLW5kayIsCi0gICAgICAgICAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAotICAgICAgICAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgICAgICAgICAgICAgImxpYnRpbnl4bWwyIiwKLSAgICAgICAgICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAgICAgICAgICJsaWJ6IiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICByZXF1aXJlZDogWwotICAgICAgICAgICAgICAgICJsaWJsZGFjQlRfZW5jIiwKLSAgICAgICAgICAgICAgICAibGlibGRhY0JUX2FiciIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgLy8gU2hhcmVkIGxpYnJhcnkgbGluayBvcHRpb25zLgotICAgIC8vIFJlZmVyZW5jZXMgdG8gZ2xvYmFsIHN5bWJvbHMgYW5kIGZ1bmN0aW9ucyBzaG91bGQgYmluZCB0byB0aGUgbGlicmFyeQotICAgIC8vIGl0c2VsZi4gVGhpcyBpcyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBzb21lIG9mIHRoZSB1bml0L3N5c3RlbSB0ZXN0cwotICAgIC8vIHRoYXQgbWlnaHQgbGluayBzdGF0aWNhbGx5IHdpdGggc29tZSBvZiB0aGUgY29kZSBpbiB0aGUgbGlicmFyeSwgYW5kCi0gICAgLy8gYWxzbyBkbG9wZW4oMykgdGhlIHNoYXJlZCBsaWJyYXJ5LgotICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMsLUJzeW1ib2xpYy1mdW5jdGlvbnMiXSwKLSAgICByZXF1aXJlZDogWwotICAgICAgICAiYnRfZGlkLmNvbmYiLAotICAgICAgICAiYnRfc3RhY2suY29uZiIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbmV2ZXI6IHRydWUsCi0gICAgfSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGgtZm9yLXRlc3RzIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotCi0gICAgc3JjczogWwotICAgICAgICAiOkxpYkJsdWV0b290aFNvdXJjZXMiLAotICAgICAgICAiOkxpYkJsdWV0b290aFNoaW1Tb3VyY2VzIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QvcnVzdC9zaGltIiwKLSAgICAgICAgInN5c3RlbS9idC9idGEvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZEJ1bmRsZXJTY2hlbWFfaF9iZmJzIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICBdLAotICAgIHdob2xlX3N0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfZ2QiLCAvLyBHYWJlbGRvcnNjaGUKLSAgICBdLAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfbWFpbl9zaGltIiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiOlRlc3RDb21tb25NYWluSGFuZGxlciIsCi0gICAgICAgICI6VGVzdE1vY2tCdGEiLAotICAgICAgICAiOlRlc3RNb2NrQnRpZiIsCi0gICAgICAgICI6VGVzdE1vY2tMZWdhY3lIY2lDb21tYW5kcyIsCi0gICAgICAgICI6VGVzdE1vY2tNYWluU2hpbUVudHJ5IiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrIiwKLSAgICAgICAgInNoaW0vYWNsX2FwaS5jYyIsCi0gICAgICAgICJzaGltL2FjbC5jYyIsCi0gICAgICAgICJzaGltL2FjbF9sZWdhY3lfaW50ZXJmYWNlLmNjIiwKLSAgICAgICAgInNoaW0vYnRtX2FwaS5jYyIsCi0gICAgICAgICJzaGltL2J0bS5jYyIsCi0gICAgICAgICJzaGltL2NvbmZpZy5jYyIsCi0gICAgICAgICJzaGltL2NvbnRyb2xsZXIuY2MiLAotICAgICAgICAic2hpbS9kdW1wc3lzLmNjIiwKLSAgICAgICAgInNoaW0vaGNpX2xheWVyLmNjIiwKLSAgICAgICAgInNoaW0vbDJjX2FwaS5jYyIsCi0gICAgICAgICJzaGltL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuY2MiLAotICAgICAgICAic2hpbS9sZV9zY2FubmluZ19tYW5hZ2VyLmNjIiwKLSAgICAgICAgInNoaW0vbGlua19wb2xpY3kuY2MiLAotICAgICAgICAic2hpbS9tZXRyaWNfaWRfYXBpLmNjIiwKLSAgICAgICAgInNoaW0vbWV0cmljc19hcGkuY2MiLAotICAgICAgICAic2hpbS9zaGltLmNjIiwKLSAgICAgICAgInNoaW0vc3RhY2suY2MiLAotICAgICAgICAidGVzdC9tYWluX3NoaW1fdGVzdC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGliYnRkZXZpY2UiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJmbGF0YnVmZmVycy1jcHAiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgYWxsX3VuZGVmaW5lZDogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAotICAgICAgICBzY3M6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIHVuZGVmaW5lZCA6IHRydWUKLSAgICAgICAgfSwKLSAgICB9LAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRCdW5kbGVyU2NoZW1hX2hfYmZicyIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21haW4vQlVJTEQuZ24gYi9tYWluL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjA0ZjU5Li4wMDAwMDAwCi0tLSBhL21haW4vQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWNvbmZpZygibGliYmx1ZXRvb3RoX2NvbmZpZyIpIHsKLSAgaW5jbHVkZV9kaXJzID0gWyAiLi4vaW5jbHVkZSIgXQotfQotCi0jIENvbXBsZXRlIHN0YXRpYyBsaWJyYXJ5IGZvciBsaW5raW5nIHdpdGggUnVzdAotc3RhdGljX2xpYnJhcnkoImJsdWV0b290aC1zdGF0aWMiKSB7Ci0gIGNvbXBsZXRlX3N0YXRpY19saWIgPSB0cnVlCi0KLSAgc291cmNlcyA9IFsKLSAgICAiLy9idC9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfaW50ZXJmYWNlLmNjIiwKLSAgICAiLy9idC9zZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5jYyIsCi0gIF0KLQotICBjb25maWdzICs9IFsKLSAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiCi0gIF0KLQotICBkZXBzID0gWwotICAgICI6Ymx1ZXRvb3RoIiwKLSAgXQotfQotCi0jIENvbmZpZ3VyZSBsaWJibHVldG9vdGggYXMgZWl0aGVyIGR5bmFtaWMgb3Igc3RhdGljIGxpYnJhcnkKLWlmIChkZWZpbmVkKHVzZS5idF9keW5saWIpICYmIHVzZS5idF9keW5saWIpIHsKLSAgbGliX3R5cGUgPSAic2hhcmVkX2xpYnJhcnkiCi19IGVsc2UgewotICBsaWJfdHlwZSA9ICJzdGF0aWNfbGlicmFyeSIKLX0KLQotdGFyZ2V0KGxpYl90eXBlLCAiYmx1ZXRvb3RoIikgewotCi0gICMgUGxhdGZvcm0gc3BlY2lmaWMKLSAgc291cmNlcyA9IFsKLSAgICAiYnRlX2NvbmYuY2MiLAotICAgICJidGVfaW5pdF9jcHBfbG9nZ2luZy5jYyIsCi0gICAgImJ0ZV9sb2dtc2cuY2MiLAotICAgICJidGVfbWFpbi5jYyIsCi0gICAgInN0YWNrX2NvbmZpZy5jYyIsCi0gIF0KLQotICBwdWJsaWNfY29uZmlncyA9IFsgIjpsaWJibHVldG9vdGhfY29uZmlnIiBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvL2J0LyIsCi0gICAgIi8vYnQvYnRhL2luY2x1ZGUiLAotICAgICIvL2J0L2J0YS9zeXMiLAotICAgICIvL2J0L2J0YS9kbSIsCi0gICAgIi8vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAiLy9idC9zdGFjay9hMmRwIiwKLSAgICAiLy9idC9zdGFjay9idG0iLAotICAgICIvL2J0L3N0YWNrL2F2ZHQiLAotICAgICIvL2J0L2hjaSIsCi0gICAgIi8vYnQvaGNpL2luY2x1ZGUiLAotICAgICIvL2J0L3VkcnYvaW5jbHVkZSIsCi0gICAgIi8vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAiLy9idC9idGlmL2NvIiwKLSAgICAiLy9idC9oY2kvaW5jbHVkIiwKLSAgICAiLy9idC92bmQvaW5jbHVkZSIsCi0gICAgIi8vYnQvYnJjbS9pbmNsdWRlIiwKLSAgICAiLy9idC9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZSIsCi0gICAgIi8vYnQvZW1iZHJ2L3NiYy9kZWNvZGVyL2luY2x1ZGUiLAotICAgICIvL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICIvL2J0L3Rlc3Qvc3VpdGUiLAotICBdCi0KLSAgZGVwcyA9IFsKLSAgICAiLy9idC9hdWRpb19oYWxfaW50ZXJmYWNlIiwKLSAgICAiLy9idC9idGEiLAotICAgICIvL2J0L2J0Y29yZSIsCi0gICAgIi8vYnQvYnRpZiIsCi0gICAgIi8vYnQvZGV2aWNlIiwKLSAgICAiLy9idC9lbWJkcnYvZzcyMiIsCi0gICAgIi8vYnQvZW1iZHJ2L3NiYyIsCi0gICAgIi8vYnQvZ2Q6bGliYmx1ZXRvb3RoX2dkIiwKLSAgICAiLy9idC9oY2kiLAotICAgICIvL2J0L21haW4vc2hpbTpMaWJCbHVldG9vdGhTaGltU291cmNlcyIsCi0gICAgIi8vYnQvb3NpIiwKLSAgICAiLy9idC9wYWNrZXQiLAotICAgICIvL2J0L3N0YWNrIiwKLSAgICAiLy9idC91ZHJ2IiwKLSAgICAiLy9idC91dGlscyIsCi0gIF0KLQotICBjb25maWdzICs9IFsKLSAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICAgICIvL2J0OmV4dGVybmFsX3Rpbnl4bWwyIiwKLSAgICAiLy9idDpleHRlcm5hbF9mbGF0YnVmZmVycyIsCi0gIF0KLQotICBjZmxhZ3NfYyA9IFsKLSAgICAiLUxvYmovb3NpIiwKLSAgICAiLWxvc2kiLAotICBdCi0KLSAgbGlicyA9IFsKLSAgICAiZGwiLAotICAgICJwdGhyZWFkIiwKLSAgICAicmVzb2x2IiwKLSAgICAicnQiLAotICAgICJ6IiwKLSAgICAiYnRfc2hpbV9mZmkiLAotICBdCi0KLSAgbGliX2RpcnMgPSBbICIke3Jvb3Rfb3V0X2Rpcn0vcnVzdCIgXQotfQpkaWZmIC0tZ2l0IGEvbWFpbi9idGVfY29uZi5jYyBiL21haW4vYnRlX2NvbmYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzRjY2UuLjAwMDAwMDAKLS0tIGEvbWFpbi9idGVfY29uZi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0ZV9jb25mIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0YV9hcGkuaCIKLSNpbmNsdWRlICJidGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotCi0vLyBQYXJzZXMgdGhlIHNwZWNpZmllZCBEZXZpY2UgSUQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZWdpc3RlcnMgdGhlCi0vLyBEZXZpY2UgSUQgcmVjb3JkcyB3aXRoIFNEUC4KLXZvaWQgYnRlX2xvYWRfZGlkX2NvbmYoY29uc3QgY2hhciogcF9wYXRoKSB7Ci0gIENIRUNLKHBfcGF0aCAhPSBOVUxMKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcocF9wYXRoKTsKLSAgaWYgKCFjb25maWcpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBsb2FkIERJRCBjb25maWcgJyVzJy4iLCBfX2Z1bmNfXywgcF9wYXRoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKGludCBpID0gMTsgaSA8PSBCVEFfRElfTlVNX01BWDsgKytpKSB7Ci0gICAgY2hhciBzZWN0aW9uX25hbWVbMTZdID0gezB9OwotICAgIHNucHJpbnRmKHNlY3Rpb25fbmFtZSwgc2l6ZW9mKHNlY3Rpb25fbmFtZSksICJESUQlZCIsIGkpOwotCi0gICAgaWYgKCFjb25maWdfaGFzX3NlY3Rpb24oKmNvbmZpZywgc2VjdGlvbl9uYW1lKSkgewotICAgICAgTE9HX0lORk8oIiVzIG5vIHNlY3Rpb24gbmFtZWQgJXMuIiwgX19mdW5jX18sIHNlY3Rpb25fbmFtZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB0U0RQX0RJX1JFQ09SRCByZWNvcmQ7Ci0gICAgcmVjb3JkLnZlbmRvciA9Ci0gICAgICAgIGNvbmZpZ19nZXRfaW50KCpjb25maWcsIHNlY3Rpb25fbmFtZSwgInZlbmRvcklkIiwgTE1QX0NPTVBJRF9HT09HTEUpOwotICAgIHJlY29yZC52ZW5kb3JfaWRfc291cmNlID0gY29uZmlnX2dldF9pbnQoCi0gICAgICAgICpjb25maWcsIHNlY3Rpb25fbmFtZSwgInZlbmRvcklkU291cmNlIiwgRElfVkVORE9SX0lEX1NPVVJDRV9CVFNJRyk7Ci0gICAgcmVjb3JkLnByb2R1Y3QgPSBjb25maWdfZ2V0X2ludCgqY29uZmlnLCBzZWN0aW9uX25hbWUsICJwcm9kdWN0SWQiLCAwKTsKLSAgICByZWNvcmQudmVyc2lvbiA9IGNvbmZpZ19nZXRfaW50KCpjb25maWcsIHNlY3Rpb25fbmFtZSwgInZlcnNpb24iLCAwKTsKLSAgICByZWNvcmQucHJpbWFyeV9yZWNvcmQgPQotICAgICAgICBjb25maWdfZ2V0X2Jvb2woKmNvbmZpZywgc2VjdGlvbl9uYW1lLCAicHJpbWFyeVJlY29yZCIsIGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBlbXB0eSA9ICIiOwotICAgIHN0cmxjcHkoCi0gICAgICAgIHJlY29yZC5jbGllbnRfZXhlY3V0YWJsZV91cmwsCi0gICAgICAgIGNvbmZpZ19nZXRfc3RyaW5nKCpjb25maWcsIHNlY3Rpb25fbmFtZSwgImNsaWVudEV4ZWN1dGFibGVVUkwiLCAmZW1wdHkpCi0gICAgICAgICAgICAtPmNfc3RyKCksCi0gICAgICAgIHNpemVvZihyZWNvcmQuY2xpZW50X2V4ZWN1dGFibGVfdXJsKSk7Ci0gICAgc3RybGNweSgKLSAgICAgICAgcmVjb3JkLnNlcnZpY2VfZGVzY3JpcHRpb24sCi0gICAgICAgIGNvbmZpZ19nZXRfc3RyaW5nKCpjb25maWcsIHNlY3Rpb25fbmFtZSwgInNlcnZpY2VEZXNjcmlwdGlvbiIsICZlbXB0eSkKLSAgICAgICAgICAgIC0+Y19zdHIoKSwKLSAgICAgICAgc2l6ZW9mKHJlY29yZC5zZXJ2aWNlX2Rlc2NyaXB0aW9uKSk7Ci0gICAgc3RybGNweShyZWNvcmQuZG9jdW1lbnRhdGlvbl91cmwsCi0gICAgICAgICAgICBjb25maWdfZ2V0X3N0cmluZygqY29uZmlnLCBzZWN0aW9uX25hbWUsICJkb2N1bWVudGF0aW9uVVJMIiwgJmVtcHR5KQotICAgICAgICAgICAgICAgIC0+Y19zdHIoKSwKLSAgICAgICAgICAgIHNpemVvZihyZWNvcmQuZG9jdW1lbnRhdGlvbl91cmwpKTsKLQotICAgIGlmIChyZWNvcmQudmVuZG9yX2lkX3NvdXJjZSAhPSBESV9WRU5ET1JfSURfU09VUkNFX0JUU0lHICYmCi0gICAgICAgIHJlY29yZC52ZW5kb3JfaWRfc291cmNlICE9IERJX1ZFTkRPUl9JRF9TT1VSQ0VfVVNCSUYpIHsKLSAgICAgIExPR19FUlJPUigiJXMgaW52YWxpZCB2ZW5kb3IgaWQgc291cmNlICVkOyBpZ25vcmluZyBESUQgcmVjb3JkICVkLiIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZC52ZW5kb3JfaWRfc291cmNlLCBpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIExPR19JTkZPKCJEZXZpY2UgSUQgcmVjb3JkICVkIDogJXMiLCBpLAotICAgICAgICAgICAgIChyZWNvcmQucHJpbWFyeV9yZWNvcmQgPyAicHJpbWFyeSIgOiAibm90IHByaW1hcnkiKSk7Ci0gICAgTE9HX0lORk8oIiAgdmVuZG9ySWQgICAgICAgICAgICA9ICUwNHgiLCByZWNvcmQudmVuZG9yKTsKLSAgICBMT0dfSU5GTygiICB2ZW5kb3JJZFNvdXJjZSAgICAgID0gJTA0eCIsIHJlY29yZC52ZW5kb3JfaWRfc291cmNlKTsKLSAgICBMT0dfSU5GTygiICBwcm9kdWN0ICAgICAgICAgICAgID0gJTA0eCIsIHJlY29yZC5wcm9kdWN0KTsKLSAgICBMT0dfSU5GTygiICB2ZXJzaW9uICAgICAgICAgICAgID0gJTA0eCIsIHJlY29yZC52ZXJzaW9uKTsKLSAgICBMT0dfSU5GTygiICBjbGllbnRFeGVjdXRhYmxlVVJMID0gJXMiLCByZWNvcmQuY2xpZW50X2V4ZWN1dGFibGVfdXJsKTsKLSAgICBMT0dfSU5GTygiICBzZXJ2aWNlRGVzY3JpcHRpb24gID0gJXMiLCByZWNvcmQuc2VydmljZV9kZXNjcmlwdGlvbik7Ci0gICAgTE9HX0lORk8oIiAgZG9jdW1lbnRhdGlvblVSTCAgICA9ICVzIiwgcmVjb3JkLmRvY3VtZW50YXRpb25fdXJsKTsKLQotICAgIHVpbnQzMl90IHJlY29yZF9oYW5kbGU7Ci0gICAgdEJUQV9TVEFUVVMgc3RhdHVzID0gQlRBX0RtU2V0TG9jYWxEaVJlY29yZCgmcmVjb3JkLCAmcmVjb3JkX2hhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBCVEFfU1VDQ0VTUykgewotICAgICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gc2V0IGRldmljZSBJRCByZWNvcmQgJWQ6IGVycm9yICVkLiIsIF9fZnVuY19fLCBpLAotICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYWluL2J0ZV9pbml0X2NwcF9sb2dnaW5nLmNjIGIvbWFpbi9idGVfaW5pdF9jcHBfbG9nZ2luZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3MmE3ZC4uMDAwMDAwMAotLS0gYS9tYWluL2J0ZV9pbml0X2NwcF9sb2dnaW5nLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGJhc2UvY29tbWFuZF9saW5lLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSAibWFpbl9pbnQuaCIKLQotdm9pZCBpbml0X2NwcF9sb2dnaW5nKGNvbmZpZ190KiBjb25maWcpIHsKLSAgLy8gQ29tbWFuZCBsaW5lIGFuZCBsb2cgbGV2ZWwgbWlnaHQgYmUgYWxzbyBjb25maWd1cmVkIGluIHNlcnZpY2UvbWFpbi5jcHAKLSAgLy8gd2hlbiBydW5uaW5nIHRoZSBibHVldG9vdGh0YmQgZGFlbW9uLiBJZiBpdCdzIGFscmVhZHkgY29uZmlndXJlZCwgc2tpcAotICAvLyBjb25maWd1cmluZy4KLSAgaWYgKGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0aWFsaXplZEZvckN1cnJlbnRQcm9jZXNzKCkpIHJldHVybjsKLQotICBjb25zdCBzdGQ6OnN0cmluZyogbG9nZ2luZ1YgPQotICAgICAgY29uZmlnX2dldF9zdHJpbmcoKmNvbmZpZywgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwgIkxvZ2dpbmdWIiwgTlVMTCk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nKiBsb2dnaW5nVk1vZHVsZSA9IGNvbmZpZ19nZXRfc3RyaW5nKAotICAgICAgKmNvbmZpZywgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwgIkxvZ2dpbmdWTW9kdWxlIiwgTlVMTCk7Ci0KLSAgaW50IGFyZ2MgPSAxOwotICBjb25zdCBjaGFyKiBhcmd2W10gPSB7ImJ0X3N0YWNrIiwgTlVMTCwgTlVMTH07Ci0KLSAgaWYgKGxvZ2dpbmdWICE9IE5VTEwpIHsKLSAgICBhcmd2W2FyZ2NdID0gbG9nZ2luZ1YtPmNfc3RyKCk7Ci0gICAgYXJnYysrOwotICB9Ci0KLSAgaWYgKGxvZ2dpbmdWTW9kdWxlICE9IE5VTEwpIHsKLSAgICBhcmd2W2FyZ2NdID0gbG9nZ2luZ1ZNb2R1bGUtPmNfc3RyKCk7Ci0gICAgYXJnYysrOwotICB9Ci0KLSAgLy8gSW5pdCBjb21tYW5kIGxpbmUgb2JqZWN0IHdpdGggbG9nZ2luZyBzd2l0Y2hlcwotICBiYXNlOjpDb21tYW5kTGluZTo6SW5pdChhcmdjLCBhcmd2KTsKLQotICBsb2dnaW5nOjpMb2dnaW5nU2V0dGluZ3MgbG9nX3NldHRpbmdzOwotICBpZiAoIWxvZ2dpbmc6OkluaXRMb2dnaW5nKGxvZ19zZXR0aW5ncykpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHVwIGxvZ2dpbmciOwotICB9Ci0KLSAgLy8gQW5kcm9pZCBhbHJlYWR5IGxvZ3MgdGhyZWFkX2lkLCBwcm9jX2lkLCB0aW1lc3RhbXAsIHNvIGRpc2FibGUgdGhvc2UuCi0gIGxvZ2dpbmc6OlNldExvZ0l0ZW1zKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLX0KZGlmZiAtLWdpdCBhL21haW4vYnRlX2xvZ21zZy5jYyBiL21haW4vYnRlX2xvZ21zZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkY2M0MS4uMDAwMDAwMAotLS0gYS9tYWluL2J0ZV9sb2dtc2cuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idGUiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiYXZyY19hcGkuaCIKLSNpbmNsdWRlICJidGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImJ0dS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInBvcnRfYXBpLmgiCi0jaW5jbHVkZSAic2RwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJhMmRwX2FwaS5oIgotI2lmIChCTkVQX0lOQ0xVREVEID09IFRSVUUpCi0jaW5jbHVkZSAiYm5lcF9hcGkuaCIKLSNlbmRpZgotI2lmIChQQU5fSU5DTFVERUQgPT0gVFJVRSkKLSNpbmNsdWRlICJwYW5fYXBpLmgiCi0jZW5kaWYKLSNpZiAoSElEX0hPU1RfSU5DTFVERUQgPT0gVFJVRSkKLSNpbmNsdWRlICJoaWRoX2FwaS5oIgotI2VuZGlmCi0jaWYgKEhJRF9ERVZfSU5DTFVERUQgPT0gVFJVRSkKLSNpbmNsdWRlICJoaWRkX2FwaS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJzbXBfYXBpLmgiCi0KLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotCi0jaWZuZGVmIERFRkFVTFRfQ09ORl9UUkFDRV9MRVZFTAotI2RlZmluZSBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUwgQlRfVFJBQ0VfTEVWRUxfV0FSTklORwotI2VuZGlmCi0KLSNpZm5kZWYgQlRFX0xPR19CVUZfU0laRQotI2RlZmluZSBCVEVfTE9HX0JVRl9TSVpFIDI1NgotI2VuZGlmCi0KLSNkZWZpbmUgQlRFX0xPR19NQVhfU0laRSAoQlRFX0xPR19CVUZfU0laRSAtIDEyKQotCi0jZGVmaW5lIE1TR19CVUZGRVJfT0ZGU0VUIDAKLQotLyogTGF5ZXJJRHMgZm9yIEJUQSwgY3VycmVudGx5IGV2ZXJ5dGhpbmcgbWFwcyBvbnRvIGFwcGxfdHJhY2VfbGV2ZWwgKi8KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBidF9sYXllcl90YWdzW10gPSB7Ci0gICAgImJ0X2J0aWYiLAotICAgICJidF91c2IiLAotICAgICJidF9zZXJpYWwiLAotICAgICJidF9zb2NrZXQiLAotICAgICJidF9yczIzMiIsCi0gICAgImJ0X2xjIiwKLSAgICAiYnRfbG0iLAotICAgICJidF9oY2kiLAotICAgICJidF9sMmNhcCIsCi0gICAgImJ0X3JmY29tbSIsCi0gICAgImJ0X3NkcCIsCi0gICAgImJ0X3RjcyIsCi0gICAgImJ0X29iZXgiLAotICAgICJidF9idG0iLAotICAgICJidF9nYXAiLAotICAgICJVTlVTRUQiLAotICAgICJVTlVTRUQiLAotICAgICJidF9pY3AiLAotICAgICJidF9oc3AyIiwKLSAgICAiYnRfc3BwIiwKLSAgICAiYnRfY3RwIiwKLSAgICAiYnRfYnBwIiwKLSAgICAiYnRfaGNycCIsCi0gICAgImJ0X2Z0cCIsCi0gICAgImJ0X29wcCIsCi0gICAgImJ0X2J0dSIsCi0gICAgImJ0X2draV9kZXByZWNhdGVkIiwKLSAgICAiYnRfYm5lcCIsCi0gICAgImJ0X3BhbiIsCi0gICAgImJ0X2hmcCIsCi0gICAgImJ0X2hpZCIsCi0gICAgImJ0X2JpcCIsCi0gICAgImJ0X2F2cCIsCi0gICAgImJ0X2EyZCIsCi0gICAgImJ0X3NhcCIsCi0gICAgImJ0X2FtcCIsCi0gICAgImJ0X21jYV9kZXByZWNhdGVkIiwKLSAgICAiYnRfYXR0IiwKLSAgICAiYnRfc21wIiwKLSAgICAiYnRfbmZjIiwKLSAgICAiYnRfbmNpIiwKLSAgICAiYnRfaWRlcCIsCi0gICAgImJ0X25kZXAiLAotICAgICJidF9sbGNwIiwKLSAgICAiYnRfcnciLAotICAgICJidF9jZSIsCi0gICAgImJ0X3NuZXAiLAotICAgICJidF9uZGVmIiwKLSAgICAiYnRfbmZhIiwKLX07Ci1zdGF0aWMgdWludDhfdCBCVEFQUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKTsKLXN0YXRpYyB1aW50OF90IEJUSUZfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci1zdGF0aWMgdWludDhfdCBCVFVfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci0KLS8qIG1ha2Ugc3VyZSBsaXN0IGlzIG9yZGVyIGJ5IGluY3JlYXNpbmcgbGF5ZXIgaWQhISEgKi8KLXN0YXRpYyB0QlRUUkNfRlVOQ19NQVAgYnR0cmNfc2V0X2xldmVsX21hcFtdID0gewotICAgIHtCVFRSQ19JRF9TVEtfQlRVLCBCVFRSQ19JRF9TVEtfSENJLCBCVFVfU2V0VHJhY2VMZXZlbCwgIlRSQ19IQ0kiLAotICAgICBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUx9LAotICAgIHtCVFRSQ19JRF9TVEtfTDJDQVAsIEJUVFJDX0lEX1NUS19MMkNBUCwgTDJDQV9TZXRUcmFjZUxldmVsLCAiVFJDX0wyQ0FQIiwKLSAgICAgREVGQVVMVF9DT05GX1RSQUNFX0xFVkVMfSwKLSAgICB7QlRUUkNfSURfU1RLX1JGQ09NTSwgQlRUUkNfSURfU1RLX1JGQ09NTV9EQVRBLCBQT1JUX1NldFRyYWNlTGV2ZWwsCi0gICAgICJUUkNfUkZDT01NIiwgREVGQVVMVF9DT05GX1RSQUNFX0xFVkVMfSwKLSAgICB7QlRUUkNfSURfU1RLX0FWRFQsIEJUVFJDX0lEX1NUS19BVkRULCBBVkRUX1NldFRyYWNlTGV2ZWwsICJUUkNfQVZEVCIsCi0gICAgIERFRkFVTFRfQ09ORl9UUkFDRV9MRVZFTH0sCi0gICAge0JUVFJDX0lEX1NUS19BVlJDLCBCVFRSQ19JRF9TVEtfQVZSQywgQVZSQ19TZXRUcmFjZUxldmVsLCAiVFJDX0FWUkMiLAotICAgICBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUx9LAotICAgIHtCVFRSQ19JRF9TVEtfQTJEUCwgQlRUUkNfSURfU1RLX0EyRFAsIEEyRFBfU2V0VHJhY2VMZXZlbCwgIlRSQ19BMkQiLAotICAgICBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUx9LAotI2lmIChCTkVQX0lOQ0xVREVEID09IFRSVUUpCi0gICAge0JUVFJDX0lEX1NUS19CTkVQLCBCVFRSQ19JRF9TVEtfQk5FUCwgQk5FUF9TZXRUcmFjZUxldmVsLCAiVFJDX0JORVAiLAotICAgICBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUx9LAotI2VuZGlmCi0gICAge0JUVFJDX0lEX1NUS19CVE1fQUNMLCBCVFRSQ19JRF9TVEtfQlRNX1NFQywgQlRNX1NldFRyYWNlTGV2ZWwsICJUUkNfQlRNIiwKLSAgICAgREVGQVVMVF9DT05GX1RSQUNFX0xFVkVMfSwKLSNpZiAoSElEX0hPU1RfSU5DTFVERUQgPT0gVFJVRSkKLSAgICB7QlRUUkNfSURfU1RLX0hJRCwgQlRUUkNfSURfU1RLX0hJRCwgSElEX0hvc3RTZXRUcmFjZUxldmVsLCAiVFJDX0hJRF9IT1NUIiwKLSAgICAgREVGQVVMVF9DT05GX1RSQUNFX0xFVkVMfSwKLSNlbmRpZgotI2lmIChQQU5fSU5DTFVERUQgPT0gVFJVRSkKLSAgICB7QlRUUkNfSURfU1RLX1BBTiwgQlRUUkNfSURfU1RLX1BBTiwgUEFOX1NldFRyYWNlTGV2ZWwsICJUUkNfUEFOIiwKLSAgICAgREVGQVVMVF9DT05GX1RSQUNFX0xFVkVMfSwKLSNlbmRpZgotICAgIHtCVFRSQ19JRF9TVEtfU0RQLCBCVFRSQ19JRF9TVEtfU0RQLCBTRFBfU2V0VHJhY2VMZXZlbCwgIlRSQ19TRFAiLAotICAgICBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUx9LAotICAgIHtCVFRSQ19JRF9TVEtfU01QLCBCVFRSQ19JRF9TVEtfU01QLCBTTVBfU2V0VHJhY2VMZXZlbCwgIlRSQ19TTVAiLAotICAgICBERUZBVUxUX0NPTkZfVFJBQ0VfTEVWRUx9LAotI2lmIChISURfREVWX0lOQ0xVREVEID09IFRSVUUpCi0gICAge0JUVFJDX0lEX1NUS19ISURELCBCVFRSQ19JRF9TVEtfSElERCwgSElEX0RldlNldFRyYWNlTGV2ZWwsICJUUkNfSElEX0RFViIsCi0gICAgIERFRkFVTFRfQ09ORl9UUkFDRV9MRVZFTH0sCi0jZW5kaWYKLQotICAgIC8qIExheWVySURzIGZvciBCVEEsIGN1cnJlbnRseSBldmVyeXRoaW5nIG1hcHMgb250byBhcHBsX3RyYWNlX2xldmVsLgotICAgICAqLwotICAgIHtCVFRSQ19JRF9CVEFfQUNDLCBCVFRSQ19JRF9CVEFQUCwgQlRBUFBfU2V0VHJhY2VMZXZlbCwgIlRSQ19CVEFQUCIsCi0gICAgIERFRkFVTFRfQ09ORl9UUkFDRV9MRVZFTH0sCi0gICAge0JUVFJDX0lEX0JUQV9BQ0MsIEJUVFJDX0lEX0JUQVBQLCBCVElGX1NldFRyYWNlTGV2ZWwsICJUUkNfQlRJRiIsCi0gICAgIERFRkFVTFRfQ09ORl9UUkFDRV9MRVZFTH0sCi0KLSAgICB7MCwgMCwgTlVMTCwgTlVMTCwgREVGQVVMVF9DT05GX1RSQUNFX0xFVkVMfX07Ci0KLXZvaWQgTG9nTXNnKHVpbnQzMl90IHRyYWNlX3NldF9tYXNrLCBjb25zdCBjaGFyKiBmbXRfc3RyLCAuLi4pIHsKLSAgY2hhciBidWZmZXJbQlRFX0xPR19CVUZfU0laRV07Ci0gIGludCB0cmFjZV9sYXllciA9IFRSQUNFX0dFVF9MQVlFUih0cmFjZV9zZXRfbWFzayk7Ci0gIGlmICh0cmFjZV9sYXllciA+PSBUUkFDRV9MQVlFUl9NQVhfTlVNKSB0cmFjZV9sYXllciA9IDA7Ci0KLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGZtdF9zdHIpOwotICB2c25wcmludGYoJmJ1ZmZlcltNU0dfQlVGRkVSX09GRlNFVF0sIEJURV9MT0dfTUFYX1NJWkUsIGZtdF9zdHIsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyBidF9sYXllcl90YWdzW3RyYWNlX2xheWVyXQotCi0gIHN3aXRjaCAoVFJBQ0VfR0VUX1RZUEUodHJhY2Vfc2V0X21hc2spKSB7Ci0gICAgY2FzZSBUUkFDRV9UWVBFX0VSUk9SOgotICAgICAgTE9HX0VSUk9SKCIlcyIsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRSQUNFX1RZUEVfV0FSTklORzoKLSAgICAgIExPR19XQVJOKCIlcyIsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRSQUNFX1RZUEVfQVBJOgotICAgIGNhc2UgVFJBQ0VfVFlQRV9FVkVOVDoKLSAgICAgIExPR19JTkZPKCIlcyIsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRSQUNFX1RZUEVfREVCVUc6Ci0gICAgICBMT0dfSU5GTygiJXMiLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHdlIHNob3VsZCBuZXZlciBnZXQgdGhpcyAqLwotICAgICAgTE9HX0VSUk9SKCIhQkFEIFRSQUNFIFRZUEUhICVzIiwgYnVmZmVyKTsKLSAgICAgIENIRUNLKFRSQUNFX0dFVF9UWVBFKHRyYWNlX3NldF9tYXNrKSA9PSBUUkFDRV9UWVBFX0VSUk9SKTsKLSAgICAgIGJyZWFrOwotICB9Ci0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJidF9idGUiCi19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGdvIGludG8gQlRBUFBfRE0gZm9yIGV4YW1wbGUgKi8KLXN0YXRpYyB1aW50OF90IEJUQVBQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBhcHBsX3RyYWNlX2xldmVsID0gbmV3X2xldmVsOwotCi0gIHJldHVybiBhcHBsX3RyYWNlX2xldmVsOwotfQotCi1zdGF0aWMgdWludDhfdCBCVElGX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBidGlmX3RyYWNlX2xldmVsID0gbmV3X2xldmVsOwotCi0gIHJldHVybiBidGlmX3RyYWNlX2xldmVsOwotfQotCi1zdGF0aWMgdWludDhfdCBCVFVfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBpZiAobmV3X2xldmVsICE9IDB4RkYpIGJ0dV90cmFjZV9sZXZlbCA9IG5ld19sZXZlbDsKLQotICByZXR1cm4gYnR1X3RyYWNlX2xldmVsOwotfQotCi1zdGF0aWMgdm9pZCBsb2FkX2xldmVsc19mcm9tX2NvbmZpZyhjb25zdCBjb25maWdfdCogY29uZmlnKSB7Ci0gIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKLQotICBmb3IgKHRCVFRSQ19GVU5DX01BUCogZnVuY3Rpb25zID0gJmJ0dHJjX3NldF9sZXZlbF9tYXBbMF07Ci0gICAgICAgZnVuY3Rpb25zLT50cmNfbmFtZTsgKytmdW5jdGlvbnMpIHsKLSAgICBpbnQgdmFsdWUgPSBjb25maWdfZ2V0X2ludCgqY29uZmlnLCBDT05GSUdfREVGQVVMVF9TRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy0+dHJjX25hbWUsIC0xKTsKLSAgICBpZiAodmFsdWUgIT0gLTEpIHsKLSAgICAgIGZ1bmN0aW9ucy0+dHJhY2VfbGV2ZWwgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M6OklzRGVidWdMb2dnaW5nRW5hYmxlZEZvckFsbCgpKSB7Ci0gICAgICBMT0dfSU5GTygiRW5hYmxlIGxvZ2dpbmcgZm9yICVzIGJlY2F1c2UgYWxsIGRlYnVnIGxvZ3MgYXJlIGVuYWJsZWQiLAotICAgICAgICAgICAgICAgZnVuY3Rpb25zLT50cmNfbmFtZSk7Ci0gICAgICBmdW5jdGlvbnMtPnRyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfVkVSQk9TRTsKLSAgICB9Ci0gICAgTE9HX0lORk8oIkJURV9Jbml0VHJhY2VMZXZlbHMgLS0gJXMgOiBMZXZlbCAlZCIsIGZ1bmN0aW9ucy0+dHJjX25hbWUsCi0gICAgICAgICAgICAgZnVuY3Rpb25zLT50cmFjZV9sZXZlbCk7Ci0gICAgaWYgKGZ1bmN0aW9ucy0+cF9mKSBmdW5jdGlvbnMtPnBfZihmdW5jdGlvbnMtPnRyYWNlX2xldmVsKTsKLSAgfQotfQotCi1zdGF0aWMgZnV0dXJlX3QqIGluaXQodm9pZCkgewotICBjb25zdCBzdGFja19jb25maWdfdCogc3RhY2tfY29uZmlnID0gc3RhY2tfY29uZmlnX2dldF9pbnRlcmZhY2UoKTsKLSAgaWYgKCFzdGFja19jb25maWctPmdldF90cmFjZV9jb25maWdfZW5hYmxlZCgpKSB7Ci0gICAgTE9HX0lORk8oInVzaW5nIGNvbXBpbGUgZGVmYXVsdCB0cmFjZSBzZXR0aW5ncyIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaW5pdF9jcHBfbG9nZ2luZyhzdGFja19jb25maWctPmdldF9hbGwoKSk7Ci0KLSAgbG9hZF9sZXZlbHNfZnJvbV9jb25maWcoc3RhY2tfY29uZmlnLT5nZXRfYWxsKCkpOwotICByZXR1cm4gTlVMTDsKLX0KLQotRVhQT1JUX1NZTUJPTCBleHRlcm4gY29uc3QgbW9kdWxlX3QgYnRlX2xvZ21zZ19tb2R1bGUgPSB7Ci0gICAgLm5hbWUgPSBCVEVfTE9HTVNHX01PRFVMRSwKLSAgICAuaW5pdCA9IGluaXQsCi0gICAgLnN0YXJ0X3VwID0gTlVMTCwKLSAgICAuc2h1dF9kb3duID0gTlVMTCwKLSAgICAuY2xlYW5fdXAgPSBOVUxMLAotICAgIC5kZXBlbmRlbmNpZXMgPSB7U1RBQ0tfQ09ORklHX01PRFVMRSwgTlVMTH19OwpkaWZmIC0tZ2l0IGEvbWFpbi9idGVfbWFpbi5jYyBiL21haW4vYnRlX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDQ1ZDAuLjAwMDAwMDAKLS0tIGEvbWFpbi9idGVfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGJ0ZV9tYWluLmNjCi0gKgotICogIERlc2NyaXB0aW9uOiAgIENvbnRhaW5zIEJURSBjb3JlIHN0YWNrIGluaXRpYWxpemF0aW9uIGFuZCBzaHV0ZG93biBjb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9tYWluIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidHUuaCIKLSNpbmNsdWRlICJoY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic2hpbS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJzaGltL3NoaW0uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrX2NvbmZpZy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyB2YXJpYWJsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgaGNpX3QqIGhjaTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgYnR1X2hjaV9tc2dfcHJvY2VzcyhCVF9IRFIqIHBfbXNnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwb3N0X3RvX2hjaV9tZXNzYWdlX2xvb3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFBvc3QgYW4gSENJIGV2ZW50IHRvIHRoZSBtYWluIHRocmVhZAotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHBvc3RfdG9fbWFpbl9tZXNzYWdlX2xvb3AoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX21zZykgewotICBpZiAoZG9faW5fbWFpbl90aHJlYWQoZnJvbV9oZXJlLCBiYXNlOjpCaW5kKCZidHVfaGNpX21zZ19wcm9jZXNzLCBwX21zZykpICE9Ci0gICAgICBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZG9faW5fbWFpbl90aHJlYWQgZmFpbGVkIGZyb20gIgotICAgICAgICAgICAgICAgPDwgZnJvbV9oZXJlLlRvU3RyaW5nKCk7Ci0gIH0KLX0KLQotdm9pZCBidGVfbWFpbl9pbml0KHZvaWQpIHsKLSAgaGNpID0gYmx1ZXRvb3RoOjpzaGltOjpoY2lfbGF5ZXJfZ2V0X2ludGVyZmFjZSgpOwotICBpZiAoIWhjaSkgewotICAgIExPR19FUlJPUigiJXMgY291bGQgbm90IGdldCBoY2kgbGF5ZXIgaW50ZXJmYWNlLiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBoY2ktPnNldF9kYXRhX2NiKGJhc2U6OkJpbmQoJnBvc3RfdG9fbWFpbl9tZXNzYWdlX2xvb3ApKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRlX21haW5faGNpX3NlbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJURSBNQUlOIEFQSSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB1cHBlciBzdGFjayB0bwotICogICAgICAgICAgICAgICAgICBzZW5kIGFuIEhDSSBtZXNzYWdlLiBUaGUgZnVuY3Rpb24gZGlzcGxheXMgYSBwcm90b2NvbCB0cmFjZQotICogICAgICAgICAgICAgICAgICBtZXNzYWdlIChpZiBlbmFibGVkKSwgYW5kIHRoZW4gY2FsbHMgdGhlICd0cmFuc21pdCcgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSENJIHRyYW5zcG9ydAotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRlX21haW5faGNpX3NlbmQoQlRfSERSKiBwX21zZywgdWludDE2X3QgZXZlbnQpIHsKLSAgdWludDE2X3Qgc3ViX2V2ZW50ID0gZXZlbnQgJiBCVF9TVUJfRVZUX01BU0s7IC8qIGxvY2FsIGNvbnRyb2xsZXIgSUQgKi8KLQotICBwX21zZy0+ZXZlbnQgPSBldmVudDsKLQotICBpZiAoKHN1Yl9ldmVudCA9PSBMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCkgfHwKLSAgICAgIChzdWJfZXZlbnQgPT0gTE9DQUxfQkxFX0NPTlRST0xMRVJfSUQpKSB7Ci0gICAgaGNpLT50cmFuc21pdF9kb3dud2FyZChldmVudCwgcF9tc2cpOwotICB9IGVsc2UgewotICAgIEFQUExfVFJBQ0VfRVJST1IoIkludmFsaWQgQ29udHJvbGxlciBJRC4gRGlzY2FyZGluZyBtZXNzYWdlLiIpOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWFpbi9tYWluX2ludC5oIGIvbWFpbi9tYWluX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTc4NzEzLi4wMDAwMDAwCi0tLSBhL21haW4vbWFpbl9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBNQUlOX0lOVF9ICi0jZGVmaW5lIE1BSU5fSU5UX0gKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotCi0vKiBJbml0aWF0ZXMgdGhlIGxvZ2dpbmcgZm9yIEMrKyAqLwotdm9pZCBpbml0X2NwcF9sb2dnaW5nKGNvbmZpZ190KiBjb25maWcpOwotCi0jZW5kaWYgIC8vIE1BSU5fSU5UX0gKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9BbmRyb2lkLmJwIGIvbWFpbi9zaGltL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWNhMzIuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJMaWJCbHVldG9vdGhTaGltU291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiYWNsLmNjIiwKLSAgICAgICAgImFjbF9hcGkuY2MiLAotICAgICAgICAiYWNsX2xlZ2FjeV9pbnRlcmZhY2UuY2MiLAotICAgICAgICAiYWN0aXZpdHlfYXR0cmlidXRpb24uY2MiLAotICAgICAgICAiYnRtLmNjIiwKLSAgICAgICAgImJ0bV9hcGkuY2MiLAotICAgICAgICAiY29uZmlnLmNjIiwKLSAgICAgICAgImNvbnRyb2xsZXIuY2MiLAotICAgICAgICAiZHVtcHN5cy5jYyIsCi0gICAgICAgICJlbnRyeS5jYyIsCi0gICAgICAgICJoY2lfbGF5ZXIuY2MiLAotICAgICAgICAibDJjX2FwaS5jYyIsCi0gICAgICAgICJsZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjIiwKLSAgICAgICAgImxlX3NjYW5uaW5nX21hbmFnZXIuY2MiLAotICAgICAgICAibGlua19wb2xpY3kuY2MiLAotICAgICAgICAibWV0cmljX2lkX2FwaS5jYyIsCi0gICAgICAgICJtZXRyaWNzX2FwaS5jYyIsCi0gICAgICAgICJzaGltLmNjIiwKLSAgICAgICAgInN0YWNrLmNjIiwKLSAgICBdCi19CmRpZmYgLS1naXQgYS9tYWluL3NoaW0vQlVJTEQuZ24gYi9tYWluL3NoaW0vQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjQ4NTguLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMjEgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXNvdXJjZV9zZXQoIkxpYkJsdWV0b290aFNoaW1Tb3VyY2VzIikgewotICBzb3VyY2VzID0gWwotICAgICJhY2wuY2MiLAotICAgICJhY2xfYXBpLmNjIiwKLSAgICAiYWNsX2xlZ2FjeV9pbnRlcmZhY2UuY2MiLAotICAgICJhY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYyIsCi0gICAgImJ0bS5jYyIsCi0gICAgImJ0bV9hcGkuY2MiLAotICAgICJjb25maWcuY2MiLAotICAgICJjb250cm9sbGVyLmNjIiwKLSAgICAiZHVtcHN5cy5jYyIsCi0gICAgImVudHJ5LmNjIiwKLSAgICAiaGNpX2xheWVyLmNjIiwKLSAgICAibDJjX2FwaS5jYyIsCi0gICAgImxlX2FkdmVydGlzaW5nX21hbmFnZXIuY2MiLAotICAgICJsZV9zY2FubmluZ19tYW5hZ2VyLmNjIiwKLSAgICAibGlua19wb2xpY3kuY2MiLAotICAgICJtZXRyaWNfaWRfYXBpLmNjIiwKLSAgICAibWV0cmljc19hcGkuY2MiLAotICAgICJzaGltLmNjIiwKLSAgICAic3RhY2suY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvL2J0IiwKLSAgICAiLy9idC9idGlmL2luY2x1ZGUiLAotICAgICIvL2J0L2dkIiwKLSAgICAiLy9idC9nZC9ydXN0L3NoaW0iLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICIvL2J0L3R5cGVzIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2Q6Qmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c0RhdGFTY2hlbWFfaCIsCi0gICAgIi8vYnQvZ2Q6Qmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICAiLy9idC9nZC9jb21tb246Qmx1ZXRvb3RoQ29tbW9uU291cmNlcyIsCi0gICAgIi8vYnQvZ2QvZHVtcHN5cy9idW5kbGVyOkJsdWV0b290aEdlbmVyYXRlZEJ1bmRsZXJTY2hlbWFfaF9iZmJzIiwKLSAgICAiLy9idC9nZC9oY2k6Qmx1ZXRvb3RoSGNpU291cmNlcyIsCi0gICAgIi8vYnQvZ2Qvb3M6Qmx1ZXRvb3RoT3NTb3VyY2VzX2xpbnV4X2dlbmVyaWMiLAotICAgICIvL2J0L2dkL3BhY2tldDpCbHVldG9vdGhQYWNrZXRTb3VyY2VzIiwKLSAgICAiLy9idC9nZC9ydXN0L3NoaW06bGliYmx1ZXRvb3RoX3J1c3RfaW50ZXJvcCIsCi0gICAgIi8vYnQvZ2QvcnVzdC90b3BzaGltOmxpYmJsdWV0b290aF90b3BzaGltIiwKLSAgICAiLy9idC9vc2kiLAotICAgICIvL2J0L3N0YWNrIiwKLSAgICAiLy9idC90eXBlcyIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiBdCi19CmRpZmYgLS1naXQgYS9tYWluL3NoaW0vYWNsLmNjIGIvbWFpbi9zaGltL2FjbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhOGY1OC4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vYWNsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfaGguaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2JpZGlfcXVldWUuaCIKLSNpbmNsdWRlICJnZC9jb21tb24vYmluZC5oIgotI2luY2x1ZGUgImdkL2NvbW1vbi9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyL2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyL2NsYXNzaWNfYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJnZC9oY2kvYWNsX21hbmFnZXIvY29ubmVjdGlvbl9tYW5hZ2VtZW50X2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgImdkL2hjaS9hY2xfbWFuYWdlci9sZV9hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImdkL2hjaS9hY2xfbWFuYWdlci9sZV9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2ltcGwuaCIKLSNpbmNsdWRlICJnZC9oY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImdkL2hjaS9jbGFzc19vZl9kZXZpY2UuaCIKLSNpbmNsdWRlICJnZC9oY2kvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImdkL29zL2hhbmRsZXIuaCIKLSNpbmNsdWRlICJnZC9vcy9xdWV1ZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9idG0uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9lbnRyeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9oZWxwZXJzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3N0YWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svYWNsL2FjbC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibGVfYWNsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wYW5fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZWNfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svbDJjYXAvbDJjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLWV4dGVybiB0QlRNX0NCIGJ0bV9jYjsKLQotYnRfc3RhdHVzX3QgZG9faW5fbWFpbl90aHJlYWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2spOwotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOwotCi1uYW1lc3BhY2UgewotCi11c2luZyBIY2lIYW5kbGUgPSB1aW50MTZfdDsKLXVzaW5nIFBhZ2VOdW1iZXIgPSB1aW50OF90OwotCi11c2luZyBDcmVhdGlvblRpbWUgPSBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrPjsKLXVzaW5nIFRlYXJkb3duVGltZSA9IHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+OwotCi1jb25zdGV4cHIgY2hhciBrQnRtTG9nVGFnW10gPSAiQUNMIjsKLQotdXNpbmcgU2VuZERhdGFVcHdhcmRzID0gdm9pZCAoKmNvbnN0KShCVF9IRFIqKTsKLXVzaW5nIE9uRGlzY29ubmVjdCA9IHN0ZDo6ZnVuY3Rpb248dm9pZChIY2lIYW5kbGUsIGhjaTo6RXJyb3JDb2RlIHJlYXNvbik+OwotCi1jb25zdGV4cHIgY2hhciBrQ29ubmVjdGlvbkRlc2NyaXB0b3JUaW1lRm9ybWF0W10gPSAiJVktJW0tJWQgJUg6JU06JVMiOwotCi1jbGFzcyBTaGFkb3dBY2NlcHRsaXN0IHsKLSBwdWJsaWM6Ci0gIFNoYWRvd0FjY2VwdGxpc3QodWludDhfdCBtYXhfYWNjZXB0bGlzdF9zaXplKQotICAgICAgOiBtYXhfYWNjZXB0bGlzdF9zaXplXyhtYXhfYWNjZXB0bGlzdF9zaXplKSB7fQotCi0gIGJvb2wgQWRkKGNvbnN0IGhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzX3dpdGhfdHlwZSkgewotICAgIGlmIChhY2NlcHRsaXN0X3NldF8uc2l6ZSgpID09IG1heF9hY2NlcHRsaXN0X3NpemVfKSB7Ci0gICAgICBMT0dfRVJST1IoIkFjY2VwdGxpc3QgaXMgZnVsbCBzaXplOiV6dSIsIGFjY2VwdGxpc3Rfc2V0Xy5zaXplKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWFjY2VwdGxpc3Rfc2V0Xy5pbnNlcnQoYWRkcmVzc193aXRoX3R5cGUpLnNlY29uZCkgewotICAgICAgTE9HX1dBUk4oIkF0dGVtcHRlZCB0byBhZGQgZHVwbGljYXRlIGxlIGFkZHJlc3MgdG8gYWNjZXB0bGlzdDolcyIsCi0gICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYWRkcmVzc193aXRoX3R5cGUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIFJlbW92ZShjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBhdXRvIGl0ZXIgPSBhY2NlcHRsaXN0X3NldF8uZmluZChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgaWYgKGl0ZXIgPT0gYWNjZXB0bGlzdF9zZXRfLmVuZCgpKSB7Ci0gICAgICBMT0dfV0FSTigiVW5rbm93biBkZXZpY2UgYmVpbmcgcmVtb3ZlZCBmcm9tIGFjY2VwdGxpc3Q6JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGFkZHJlc3Nfd2l0aF90eXBlKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGFjY2VwdGxpc3Rfc2V0Xy5lcmFzZShpdGVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0ZDo6dW5vcmRlcmVkX3NldDxoY2k6OkFkZHJlc3NXaXRoVHlwZT4gR2V0Q29weSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYWNjZXB0bGlzdF9zZXRfOwotICB9Ci0KLSAgYm9vbCBJc0Z1bGwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFjY2VwdGxpc3Rfc2V0Xy5zaXplKCkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhfYWNjZXB0bGlzdF9zaXplXyk7Ci0gIH0KLQotICB2b2lkIENsZWFyKCkgeyBhY2NlcHRsaXN0X3NldF8uY2xlYXIoKTsgfQotCi0gcHJpdmF0ZToKLSAgdWludDhfdCBtYXhfYWNjZXB0bGlzdF9zaXplX3swfTsKLSAgc3RkOjp1bm9yZGVyZWRfc2V0PGhjaTo6QWRkcmVzc1dpdGhUeXBlPiBhY2NlcHRsaXN0X3NldF87Ci19OwotCi1jbGFzcyBTaGFkb3dBZGRyZXNzUmVzb2x1dGlvbkxpc3QgewotIHB1YmxpYzoKLSAgU2hhZG93QWRkcmVzc1Jlc29sdXRpb25MaXN0KHVpbnQ4X3QgbWF4X2FkZHJlc3NfcmVzb2x1dGlvbl9zaXplKQotICAgICAgOiBtYXhfYWRkcmVzc19yZXNvbHV0aW9uX3NpemVfKG1heF9hZGRyZXNzX3Jlc29sdXRpb25fc2l6ZSkge30KLQotICBib29sIEFkZChjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBpZiAoYWRkcmVzc19yZXNvbHV0aW9uX3NldF8uc2l6ZSgpID09IG1heF9hZGRyZXNzX3Jlc29sdXRpb25fc2l6ZV8pIHsKLSAgICAgIExPR19FUlJPUigiQWRkcmVzcyBSZXNvbHV0aW9uIGlzIGZ1bGwgc2l6ZTolenUiLAotICAgICAgICAgICAgICAgIGFkZHJlc3NfcmVzb2x1dGlvbl9zZXRfLnNpemUoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghYWRkcmVzc19yZXNvbHV0aW9uX3NldF8uaW5zZXJ0KGFkZHJlc3Nfd2l0aF90eXBlKS5zZWNvbmQpIHsKLSAgICAgIExPR19XQVJOKCJBdHRlbXB0ZWQgdG8gYWRkIGR1cGxpY2F0ZSBsZSBhZGRyZXNzIHRvIGFkZHJlc3NfcmVzb2x1dGlvbjolcyIsCi0gICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYWRkcmVzc193aXRoX3R5cGUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIFJlbW92ZShjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBhdXRvIGl0ZXIgPSBhZGRyZXNzX3Jlc29sdXRpb25fc2V0Xy5maW5kKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgICBpZiAoaXRlciA9PSBhZGRyZXNzX3Jlc29sdXRpb25fc2V0Xy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIlVua25vd24gZGV2aWNlIGJlaW5nIHJlbW92ZWQgZnJvbSBhZGRyZXNzX3Jlc29sdXRpb246JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGFkZHJlc3Nfd2l0aF90eXBlKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGFkZHJlc3NfcmVzb2x1dGlvbl9zZXRfLmVyYXNlKGl0ZXIpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp1bm9yZGVyZWRfc2V0PGhjaTo6QWRkcmVzc1dpdGhUeXBlPiBHZXRDb3B5KCkgY29uc3QgewotICAgIHJldHVybiBhZGRyZXNzX3Jlc29sdXRpb25fc2V0XzsKLSAgfQotCi0gIGJvb2wgSXNGdWxsKCkgY29uc3QgewotICAgIHJldHVybiBhZGRyZXNzX3Jlc29sdXRpb25fc2V0Xy5zaXplKCkgPT0KLSAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhfYWRkcmVzc19yZXNvbHV0aW9uX3NpemVfKTsKLSAgfQotCi0gIHZvaWQgQ2xlYXIoKSB7IGFkZHJlc3NfcmVzb2x1dGlvbl9zZXRfLmNsZWFyKCk7IH0KLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3QgbWF4X2FkZHJlc3NfcmVzb2x1dGlvbl9zaXplX3swfTsKLSAgc3RkOjp1bm9yZGVyZWRfc2V0PGhjaTo6QWRkcmVzc1dpdGhUeXBlPiBhZGRyZXNzX3Jlc29sdXRpb25fc2V0XzsKLX07Ci0KLXN0cnVjdCBDb25uZWN0aW9uRGVzY3JpcHRvciB7Ci0gIENyZWF0aW9uVGltZSBjcmVhdGlvbl90aW1lXzsKLSAgVGVhcmRvd25UaW1lIHRlYXJkb3duX3RpbWVfOwotICB1aW50MTZfdCBoYW5kbGVfOwotICBib29sIGlzX2xvY2FsbHlfaW5pdGlhdGVkXzsKLSAgaGNpOjpFcnJvckNvZGUgZGlzY29ubmVjdF9yZWFzb25fOwotICBDb25uZWN0aW9uRGVzY3JpcHRvcihDcmVhdGlvblRpbWUgY3JlYXRpb25fdGltZSwgVGVhcmRvd25UaW1lIHRlYXJkb3duX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpc19sb2NhbGx5X2luaXRpYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpFcnJvckNvZGUgZGlzY29ubmVjdF9yZWFzb24pCi0gICAgICA6IGNyZWF0aW9uX3RpbWVfKGNyZWF0aW9uX3RpbWUpLAotICAgICAgICB0ZWFyZG93bl90aW1lXyh0ZWFyZG93bl90aW1lKSwKLSAgICAgICAgaGFuZGxlXyhoYW5kbGUpLAotICAgICAgICBpc19sb2NhbGx5X2luaXRpYXRlZF8oaXNfbG9jYWxseV9pbml0aWF0ZWQpLAotICAgICAgICBkaXNjb25uZWN0X3JlYXNvbl8oZGlzY29ubmVjdF9yZWFzb24pIHt9Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UHJpdmF0ZVJlbW90ZUFkZHJlc3MoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgfkNvbm5lY3Rpb25EZXNjcmlwdG9yKCkge30KLSAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgInBlZXI6JXMgaGFuZGxlOjB4JTA0eCBpc19sb2NhbGx5X2luaXRpYXRlZDolcyIKLSAgICAgICAgIiBjcmVhdGlvbl90aW1lOiVzIHRlYXJkb3duX3RpbWU6JXMgZGlzY29ubmVjdF9yZWFzb246JXMiLAotICAgICAgICBHZXRQcml2YXRlUmVtb3RlQWRkcmVzcygpLmNfc3RyKCksIGhhbmRsZV8sCi0gICAgICAgIGxvZ2Jvb2woaXNfbG9jYWxseV9pbml0aWF0ZWRfKS5jX3N0cigpLAotICAgICAgICBjb21tb246OlN0cmluZ0Zvcm1hdFRpbWVXaXRoTWlsbGlzZWNvbmRzKAotICAgICAgICAgICAga0Nvbm5lY3Rpb25EZXNjcmlwdG9yVGltZUZvcm1hdCwgY3JlYXRpb25fdGltZV8pCi0gICAgICAgICAgICAuY19zdHIoKSwKLSAgICAgICAgY29tbW9uOjpTdHJpbmdGb3JtYXRUaW1lV2l0aE1pbGxpc2Vjb25kcygKLSAgICAgICAgICAgIGtDb25uZWN0aW9uRGVzY3JpcHRvclRpbWVGb3JtYXQsIHRlYXJkb3duX3RpbWVfKQotICAgICAgICAgICAgLmNfc3RyKCksCi0gICAgICAgIGhjaTo6RXJyb3JDb2RlVGV4dChkaXNjb25uZWN0X3JlYXNvbl8pLmNfc3RyKCkpOwotICB9Ci19OwotCi1zdHJ1Y3QgQ2xhc3NpY0Nvbm5lY3Rpb25EZXNjcmlwdG9yIDogcHVibGljIENvbm5lY3Rpb25EZXNjcmlwdG9yIHsKLSAgY29uc3QgaGNpOjpBZGRyZXNzIHJlbW90ZV9hZGRyZXNzXzsKLSAgQ2xhc3NpY0Nvbm5lY3Rpb25EZXNjcmlwdG9yKGNvbnN0IGhjaTo6QWRkcmVzcyYgcmVtb3RlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblRpbWUgY3JlYXRpb25fdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYXJkb3duVGltZSB0ZWFyZG93bl90aW1lLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xvY2FsbHlfaW5pdGlhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpFcnJvckNvZGUgZGlzY29ubmVjdF9yZWFzb24pCi0gICAgICA6IENvbm5lY3Rpb25EZXNjcmlwdG9yKGNyZWF0aW9uX3RpbWUsIHRlYXJkb3duX3RpbWUsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbG9jYWxseV9pbml0aWF0ZWQsIGRpc2Nvbm5lY3RfcmVhc29uKSwKLSAgICAgICAgcmVtb3RlX2FkZHJlc3NfKHJlbW90ZV9hZGRyZXNzKSB7fQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFByaXZhdGVSZW1vdGVBZGRyZXNzKCkgY29uc3QgewotICAgIHJldHVybiBQUklWQVRFX0FERFJFU1MocmVtb3RlX2FkZHJlc3NfKTsKLSAgfQotfTsKLQotc3RydWN0IExlQ29ubmVjdGlvbkRlc2NyaXB0b3IgOiBwdWJsaWMgQ29ubmVjdGlvbkRlc2NyaXB0b3IgewotICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGVfYWRkcmVzc193aXRoX3R5cGVfOwotICBMZUNvbm5lY3Rpb25EZXNjcmlwdG9yKGhjaTo6QWRkcmVzc1dpdGhUeXBlJiByZW1vdGVfYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25UaW1lIGNyZWF0aW9uX3RpbWUsIFRlYXJkb3duVGltZSB0ZWFyZG93bl90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpc19sb2NhbGx5X2luaXRpYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkVycm9yQ29kZSBkaXNjb25uZWN0X3JlYXNvbikKLSAgICAgIDogQ29ubmVjdGlvbkRlc2NyaXB0b3IoY3JlYXRpb25fdGltZSwgdGVhcmRvd25fdGltZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sb2NhbGx5X2luaXRpYXRlZCwgZGlzY29ubmVjdF9yZWFzb24pLAotICAgICAgICByZW1vdGVfYWRkcmVzc193aXRoX3R5cGVfKHJlbW90ZV9hZGRyZXNzX3dpdGhfdHlwZSkge30KLSAgc3RkOjpzdHJpbmcgR2V0UHJpdmF0ZVJlbW90ZUFkZHJlc3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYWRkcmVzc193aXRoX3R5cGVfKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBGaXhlZFF1ZXVlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEZpeGVkUXVldWUoc2l6ZV90IG1heF9zaXplKSA6IG1heF9zaXplXyhtYXhfc2l6ZSkge30KLSAgdm9pZCBQdXNoKFQgZWxlbWVudCkgewotICAgIGlmIChxdWV1ZV8uc2l6ZSgpID09IG1heF9zaXplXykgewotICAgICAgcXVldWVfLnBvcF9mcm9udCgpOwotICAgIH0KLSAgICBxdWV1ZV8ucHVzaF9iYWNrKHN0ZDo6bW92ZShlbGVtZW50KSk7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gUmVhZEVsZW1lbnRzQXNTdHJpbmcoKSBjb25zdCB7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZlY3RvcjsKLSAgICBmb3IgKGF1dG8mIGVudHJ5IDogcXVldWVfKSB7Ci0gICAgICB2ZWN0b3IucHVzaF9iYWNrKGVudHJ5LT5Ub1N0cmluZygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHZlY3RvcjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc2l6ZV90IG1heF9zaXplX3sxfTsKLSAgc3RkOjpkZXF1ZTxUPiBxdWV1ZV87Ci19OwotCi1jb25zdGV4cHIgc2l6ZV90IGtDb25uZWN0aW9uSGlzdG9yeVNpemUgPSA0MDsKLQotaW5saW5lIHVpbnQ4X3QgTG93Qnl0ZSh1aW50MTZfdCB2YWwpIHsgcmV0dXJuIHZhbCAmIDB4ZmY7IH0KLWlubGluZSB1aW50OF90IEhpZ2hCeXRlKHVpbnQxNl90IHZhbCkgeyByZXR1cm4gdmFsID4+IDg7IH0KLQotdm9pZCBWYWxpZGF0ZUFjbEludGVyZmFjZShjb25zdCBzaGltOjpsZWdhY3k6OmFjbF9pbnRlcmZhY2VfdCYgYWNsX2ludGVyZmFjZSkgewotICBBU1NFUlRfTE9HKGFjbF9pbnRlcmZhY2Uub25fc2VuZF9kYXRhX3Vwd2FyZHMgIT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAiTXVzdCBwcm92aWRlIHRvIHJlY2VpdmUgZGF0YSBvbiBhY2wgbGlua3MiKTsKLSAgQVNTRVJUX0xPRyhhY2xfaW50ZXJmYWNlLm9uX3BhY2tldHNfY29tcGxldGVkICE9IG51bGxwdHIsCi0gICAgICAgICAgICAgIk11c3QgcHJvdmlkZSB0byByZWNlaXZlIGNvbXBsZXRlZCBwYWNrZXQgaW5kaWNhdGlvbiIpOwotCi0gIEFTU0VSVF9MT0coYWNsX2ludGVyZmFjZS5jb25uZWN0aW9uLmNsYXNzaWMub25fY29ubmVjdGVkICE9IG51bGxwdHIsCi0gICAgICAgICAgICAgIk11c3QgcHJvdmlkZSB0byByZXNwb25kIHRvIHN1Y2Nlc3NmdWwgY2xhc3NpYyBjb25uZWN0aW9ucyIpOwotICBBU1NFUlRfTE9HKGFjbF9pbnRlcmZhY2UuY29ubmVjdGlvbi5jbGFzc2ljLm9uX2ZhaWxlZCAhPSBudWxscHRyLAotICAgICAgICAgICAgICJNdXN0IHByb3ZpZGUgdG8gcmVzcG9uZCB3aGVuIGNsYXNzaWMgY29ubmVjdGlvbiBhdHRlbXB0cyBmYWlsIik7Ci0gIEFTU0VSVF9MT0coCi0gICAgICBhY2xfaW50ZXJmYWNlLmNvbm5lY3Rpb24uY2xhc3NpYy5vbl9kaXNjb25uZWN0ZWQgIT0gbnVsbHB0ciwKLSAgICAgICJNdXN0IHByb3ZpZGUgdG8gcmVzcG9uZCB3aGVuIGFjdGl2ZSBjbGFzc2ljIGNvbm5lY3Rpb24gZGlzY29ubmVjdHMiKTsKLQotICBBU1NFUlRfTE9HKGFjbF9pbnRlcmZhY2UuY29ubmVjdGlvbi5sZS5vbl9jb25uZWN0ZWQgIT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAiTXVzdCBwcm92aWRlIHRvIHJlc3BvbmQgdG8gc3VjY2Vzc2Z1bCBsZSBjb25uZWN0aW9ucyIpOwotICBBU1NFUlRfTE9HKGFjbF9pbnRlcmZhY2UuY29ubmVjdGlvbi5sZS5vbl9mYWlsZWQgIT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAiTXVzdCBwcm92aWRlIHRvIHJlc3BvbmQgd2hlbiBsZSBjb25uZWN0aW9uIGF0dGVtcHRzIGZhaWwiKTsKLSAgQVNTRVJUX0xPRyhhY2xfaW50ZXJmYWNlLmNvbm5lY3Rpb24ubGUub25fZGlzY29ubmVjdGVkICE9IG51bGxwdHIsCi0gICAgICAgICAgICAgIk11c3QgcHJvdmlkZSB0byByZXNwb25kIHdoZW4gYWN0aXZlIGxlIGNvbm5lY3Rpb24gZGlzY29ubmVjdHMiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLSNkZWZpbmUgVFJZX1BPU1RJTkdfT05fTUFJTihjYiwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjYiA9PSBudWxscHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPR19XQVJOKCJEcm9wcGluZyBBQ0wgZXZlbnQgd2l0aCBubyBjYWxsYmFjayIpOyAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCAjI19fVkFfQVJHU19fKSk7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLWNvbnN0ZXhwciBIY2lIYW5kbGUga0ludmFsaWRIY2lIYW5kbGUgPSAweGZmZmY7Ci0KLWNsYXNzIFNoaW1BY2xDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIFNoaW1BY2xDb25uZWN0aW9uKGNvbnN0IEhjaUhhbmRsZSBoYW5kbGUsIFNlbmREYXRhVXB3YXJkcyBzZW5kX2RhdGFfdXB3YXJkcywKLSAgICAgICAgICAgICAgICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIGhjaTo6YWNsX21hbmFnZXI6OkFjbENvbm5lY3Rpb246OlF1ZXVlVXBFbmQqIHF1ZXVlX3VwX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25UaW1lIGNyZWF0aW9uX3RpbWUpCi0gICAgICA6IGhhbmRsZV8oaGFuZGxlKSwKLSAgICAgICAgaGFuZGxlcl8oaGFuZGxlciksCi0gICAgICAgIHNlbmRfZGF0YV91cHdhcmRzXyhzZW5kX2RhdGFfdXB3YXJkcyksCi0gICAgICAgIHF1ZXVlX3VwX2VuZF8ocXVldWVfdXBfZW5kKSwKLSAgICAgICAgY3JlYXRpb25fdGltZV8oY3JlYXRpb25fdGltZSkgewotICAgIHF1ZXVlX3VwX2VuZF8tPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmU2hpbUFjbENvbm5lY3Rpb246OmRhdGFfcmVhZHlfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5TaGltQWNsQ29ubmVjdGlvbigpIHsKLSAgICBpZiAoIXF1ZXVlXy5lbXB0eSgpKQotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJBQ0wgY2xlYW5lZCB1cCB3aXRoIG5vbi1lbXB0eSBxdWV1ZSBoYW5kbGU6MHglMDR4IHN0cmFuZGVkX3BrdHM6JXp1IiwKLSAgICAgICAgICBoYW5kbGVfLCBxdWV1ZV8uc2l6ZSgpKTsKLSAgICBBU1NFUlRfTE9HKGlzX2Rpc2Nvbm5lY3RlZF8sCi0gICAgICAgICAgICAgICAiU2hpbSBBY2wgd2FzIG5vdCBwcm9wZXJseSBkaXNjb25uZWN0ZWQgaGFuZGxlOjB4JTA0eCIsIGhhbmRsZV8pOwotICB9Ci0KLSAgdm9pZCBFbnF1ZXVlUGFja2V0KHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OlJhd0J1aWxkZXI+IHBhY2tldCkgewotICAgIC8vIFRPRE8gSGFuZGxlIHF1ZXVlIHNpemUgZXhjZWVkcyBzb21lIHRocmVzaG9sZAotICAgIHF1ZXVlXy5wdXNoKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICBSZWdpc3RlckVucXVldWUoKTsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBoYW5kbGVfZW5xdWV1ZSgpIHsKLSAgICBhdXRvIHBhY2tldCA9IHN0ZDo6bW92ZShxdWV1ZV8uZnJvbnQoKSk7Ci0gICAgcXVldWVfLnBvcCgpOwotICAgIGlmIChxdWV1ZV8uZW1wdHkoKSkgewotICAgICAgVW5yZWdpc3RlckVucXVldWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2tldDsKLSAgfQotCi0gIHZvaWQgZGF0YV9yZWFkeV9jYWxsYmFjaygpIHsKLSAgICBhdXRvIHBhY2tldCA9IHF1ZXVlX3VwX2VuZF8tPlRyeURlcXVldWUoKTsKLSAgICB1aW50MTZfdCBsZW5ndGggPSBwYWNrZXQtPnNpemUoKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwcmVhbWJsZTsKLSAgICBwcmVhbWJsZS5wdXNoX2JhY2soTG93Qnl0ZShoYW5kbGVfKSk7Ci0gICAgcHJlYW1ibGUucHVzaF9iYWNrKEhpZ2hCeXRlKGhhbmRsZV8pKTsKLSAgICBwcmVhbWJsZS5wdXNoX2JhY2soTG93Qnl0ZShsZW5ndGgpKTsKLSAgICBwcmVhbWJsZS5wdXNoX2JhY2soSGlnaEJ5dGUobGVuZ3RoKSk7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IE1ha2VMZWdhY3lCdEhkclBhY2tldChzdGQ6Om1vdmUocGFja2V0KSwgcHJlYW1ibGUpOwotICAgIEFTU0VSVF9MT0cocF9idWYgIT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgQlRfSERSIGxlZ2FjeSBwYWNrZXQgaGFuZGxlOiUwNHgiLCBoYW5kbGVfKTsKLSAgICBpZiAoc2VuZF9kYXRhX3Vwd2FyZHNfID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJEcm9wcGluZyBBQ0wgZGF0YSB3aXRoIG5vIGNhbGxiYWNrIik7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgfSBlbHNlIGlmIChkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKHNlbmRfZGF0YV91cHdhcmRzXywgcF9idWYpKSAhPQotICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgSW5pdGlhdGVEaXNjb25uZWN0KGhjaTo6RGlzY29ubmVjdFJlYXNvbiByZWFzb24pID0gMDsKLSAgdmlydHVhbCBib29sIElzTG9jYWxseUluaXRpYXRlZCgpIGNvbnN0ID0gMDsKLQotICBDcmVhdGlvblRpbWUgR2V0Q3JlYXRpb25UaW1lKCkgY29uc3QgeyByZXR1cm4gY3JlYXRpb25fdGltZV87IH0KLSAgdWludDE2X3QgSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQotCi0gIHZvaWQgU2h1dGRvd24oKSB7Ci0gICAgRGlzY29ubmVjdCgpOwotICAgIExPR19JTkZPKCJTaHV0ZG93biBhbmQgZGlzY29ubmVjdCBBQ0wgY29ubmVjdGlvbiBoYW5kbGU6MHglMDR4IiwgaGFuZGxlXyk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgY29uc3QgdWludDE2X3QgaGFuZGxlX3trSW52YWxpZEhjaUhhbmRsZX07Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLQotICB2b2lkIFVucmVnaXN0ZXJFbnF1ZXVlKCkgewotICAgIGlmICghaXNfZW5xdWV1ZV9yZWdpc3RlcmVkXykgcmV0dXJuOwotICAgIGlzX2VucXVldWVfcmVnaXN0ZXJlZF8gPSBmYWxzZTsKLSAgICBxdWV1ZV91cF9lbmRfLT5VbnJlZ2lzdGVyRW5xdWV1ZSgpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KCkgewotICAgIEFTU0VSVF9MT0coIWlzX2Rpc2Nvbm5lY3RlZF8sCi0gICAgICAgICAgICAgICAiQ2Fubm90IGRpc2Nvbm5lY3QgQUNMIG11bHRpcGxlIHRpbWVzIGhhbmRsZTolMDR4IiwgaGFuZGxlXyk7Ci0gICAgaXNfZGlzY29ubmVjdGVkXyA9IHRydWU7Ci0gICAgVW5yZWdpc3RlckVucXVldWUoKTsKLSAgICBxdWV1ZV91cF9lbmRfLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIGlmICghcXVldWVfLmVtcHR5KCkpCi0gICAgICBMT0dfV0FSTigKLSAgICAgICAgICAiQUNMIGRpc2Nvbm5lY3Qgd2l0aCBub24tZW1wdHkgcXVldWUgaGFuZGxlOiUwNHggc3RyYW5kZWRfcGt0czo6JXp1IiwKLSAgICAgICAgICBoYW5kbGVfLCBxdWV1ZV8uc2l6ZSgpKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBSZWFkUmVtb3RlQ29udHJvbGxlckluZm9ybWF0aW9uKCkgPSAwOwotCi0gcHJpdmF0ZToKLSAgU2VuZERhdGFVcHdhcmRzIHNlbmRfZGF0YV91cHdhcmRzXzsKLSAgaGNpOjphY2xfbWFuYWdlcjo6QWNsQ29ubmVjdGlvbjo6UXVldWVVcEVuZCogcXVldWVfdXBfZW5kXzsKLQotICBzdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OlJhd0J1aWxkZXI+PiBxdWV1ZV87Ci0gIGJvb2wgaXNfZW5xdWV1ZV9yZWdpc3RlcmVkX3tmYWxzZX07Ci0gIGJvb2wgaXNfZGlzY29ubmVjdGVkX3tmYWxzZX07Ci0gIENyZWF0aW9uVGltZSBjcmVhdGlvbl90aW1lXzsKLQotICB2b2lkIFJlZ2lzdGVyRW5xdWV1ZSgpIHsKLSAgICBBU1NFUlRfTE9HKCFpc19kaXNjb25uZWN0ZWRfLAotICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZW5kIGRhdGEgb3ZlciBkaXNjb25uZWN0ZWQgY2hhbm5lbCBoYW5kbGU6JTA0eCIsCi0gICAgICAgICAgICAgICBoYW5kbGVfKTsKLSAgICBpZiAoaXNfZW5xdWV1ZV9yZWdpc3RlcmVkXykgcmV0dXJuOwotICAgIGlzX2VucXVldWVfcmVnaXN0ZXJlZF8gPSB0cnVlOwotICAgIHF1ZXVlX3VwX2VuZF8tPlJlZ2lzdGVyRW5xdWV1ZSgKLSAgICAgICAgaGFuZGxlcl8sIGNvbW1vbjo6QmluZCgmU2hpbUFjbENvbm5lY3Rpb246OmhhbmRsZV9lbnF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKCkgPSAwOwotfTsKLQotY2xhc3MgQ2xhc3NpY1NoaW1BY2xDb25uZWN0aW9uCi0gICAgOiBwdWJsaWMgU2hpbUFjbENvbm5lY3Rpb24sCi0gICAgICBwdWJsaWMgaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDYWxsYmFja3MgewotIHB1YmxpYzoKLSAgQ2xhc3NpY1NoaW1BY2xDb25uZWN0aW9uKAotICAgICAgU2VuZERhdGFVcHdhcmRzIHNlbmRfZGF0YV91cHdhcmRzLCBPbkRpc2Nvbm5lY3Qgb25fZGlzY29ubmVjdCwKLSAgICAgIGNvbnN0IHNoaW06OmxlZ2FjeTo6YWNsX2NsYXNzaWNfbGlua19pbnRlcmZhY2VfdCYgaW50ZXJmYWNlLAotICAgICAgb3M6OkhhbmRsZXIqIGhhbmRsZXIsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjphY2xfbWFuYWdlcjo6Q2xhc3NpY0FjbENvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCi0gICAgICBDcmVhdGlvblRpbWUgY3JlYXRpb25fdGltZSkKLSAgICAgIDogU2hpbUFjbENvbm5lY3Rpb24oY29ubmVjdGlvbi0+R2V0SGFuZGxlKCksIHNlbmRfZGF0YV91cHdhcmRzLCBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5HZXRBY2xRdWV1ZUVuZCgpLCBjcmVhdGlvbl90aW1lKSwKLSAgICAgICAgb25fZGlzY29ubmVjdF8ob25fZGlzY29ubmVjdCksCi0gICAgICAgIGludGVyZmFjZV8oaW50ZXJmYWNlKSwKLSAgICAgICAgY29ubmVjdGlvbl8oc3RkOjptb3ZlKGNvbm5lY3Rpb24pKSB7fQotCi0gIHZvaWQgUmVnaXN0ZXJDYWxsYmFja3MoKSBvdmVycmlkZSB7Ci0gICAgY29ubmVjdGlvbl8tPlJlZ2lzdGVyQ2FsbGJhY2tzKHRoaXMsIGhhbmRsZXJfKTsKLSAgfQotCi0gIHZvaWQgUmVhZFJlbW90ZUNvbnRyb2xsZXJJbmZvcm1hdGlvbigpIG92ZXJyaWRlIHsKLSAgICBjb25uZWN0aW9uXy0+UmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpOwotICAgIGNvbm5lY3Rpb25fLT5SZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoKTsKLSAgfQotCi0gIHZvaWQgT25Db25uZWN0aW9uUGFja2V0VHlwZUNoYW5nZWQodWludDE2X3QgcGFja2V0X3R5cGUpIG92ZXJyaWRlIHsKLSAgICBUUllfUE9TVElOR19PTl9NQUlOKGludGVyZmFjZV8ub25fcGFja2V0X3R5cGVfY2hhbmdlZCwgcGFja2V0X3R5cGUpOwotICB9Ci0KLSAgdm9pZCBPbkF1dGhlbnRpY2F0aW9uQ29tcGxldGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cykgb3ZlcnJpZGUgewotICAgIFRSWV9QT1NUSU5HX09OX01BSU4oaW50ZXJmYWNlXy5vbl9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZSwgaGFuZGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5SGNpRXJyb3JDb2RlKGhjaV9zdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgT25FbmNyeXB0aW9uQ2hhbmdlKGhjaTo6RW5jcnlwdGlvbkVuYWJsZWQgZW5hYmxlZCkgb3ZlcnJpZGUgewotICAgIGJvb2wgaXNfZW5hYmxlZCA9IChlbmFibGVkID09IGhjaTo6RW5jcnlwdGlvbkVuYWJsZWQ6Ok9OIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPT0gaGNpOjpFbmNyeXB0aW9uRW5hYmxlZDo6QlJfRURSX0FFU19DQ00pOwotICAgIFRSWV9QT1NUSU5HX09OX01BSU4oaW50ZXJmYWNlXy5vbl9lbmNyeXB0aW9uX2NoYW5nZSwgaXNfZW5hYmxlZCk7Ci0gIH0KLQotICB2b2lkIE9uQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlDb21wbGV0ZSgpIG92ZXJyaWRlIHsKLSAgICBUUllfUE9TVElOR19PTl9NQUlOKGludGVyZmFjZV8ub25fY2hhbmdlX2Nvbm5lY3Rpb25fbGlua19rZXlfY29tcGxldGUpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRDbG9ja09mZnNldENvbXBsZXRlKHVpbnQxNl90IGNsb2NrX29mZnNldCkgb3ZlcnJpZGUgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEIik7Ci0gIH0KLQotICB2b2lkIE9uTW9kZUNoYW5nZShoY2k6OkVycm9yQ29kZSBzdGF0dXMsIGhjaTo6TW9kZSBjdXJyZW50X21vZGUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsKSBvdmVycmlkZSB7Ci0gICAgVFJZX1BPU1RJTkdfT05fTUFJTihpbnRlcmZhY2VfLm9uX21vZGVfY2hhbmdlLCBUb0xlZ2FjeUhjaUVycm9yQ29kZShzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlXywgVG9MZWdhY3lIY2lNb2RlKGN1cnJlbnRfbW9kZSksIGludGVydmFsKTsKLSAgfQotCi0gIHZvaWQgT25TbmlmZlN1YnJhdGluZyhoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KSB7Ci0gICAgVFJZX1BPU1RJTkdfT05fTUFJTihpbnRlcmZhY2VfLm9uX3NuaWZmX3N1YnJhdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5SGNpRXJyb3JDb2RlKGhjaV9zdGF0dXMpLCBoYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsIG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci0gIH0KLQotICB2b2lkIE9uUW9zU2V0dXBDb21wbGV0ZShoY2k6OlNlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSwgdWludDMyX3QgdG9rZW5fcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbikgb3ZlcnJpZGUgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEIik7Ci0gIH0KLQotICB2b2lkIE9uRmxvd1NwZWNpZmljYXRpb25Db21wbGV0ZShoY2k6OkZsb3dEaXJlY3Rpb24gZmxvd19kaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6U2VydmljZVR5cGUgc2VydmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjY2Vzc19sYXRlbmN5KSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQiKTsKLSAgfQotCi0gIHZvaWQgT25GbHVzaE9jY3VycmVkKCkgb3ZlcnJpZGUgeyBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCIpOyB9Ci0KLSAgdm9pZCBPblJvbGVEaXNjb3ZlcnlDb21wbGV0ZShoY2k6OlJvbGUgY3VycmVudF9yb2xlKSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQiKTsKLSAgfQotCi0gIHZvaWQgT25SZWFkTGlua1BvbGljeVNldHRpbmdzQ29tcGxldGUoCi0gICAgICB1aW50MTZfdCBsaW5rX3BvbGljeV9zZXR0aW5ncykgb3ZlcnJpZGUgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEIik7Ci0gIH0KLQotICB2b2lkIE9uUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dENvbXBsZXRlKHVpbnQxNl90IGZsdXNoX3RpbWVvdXQpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCIpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRUcmFuc21pdFBvd2VyTGV2ZWxDb21wbGV0ZSh1aW50OF90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQiKTsKLSAgfQotCi0gIHZvaWQgT25SZWFkTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlKAotICAgICAgdWludDE2X3QgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQiKTsKLSAgfQotCi0gIHZvaWQgT25SZWFkRmFpbGVkQ29udGFjdENvdW50ZXJDb21wbGV0ZSgKLSAgICAgIHVpbnQxNl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCIpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRMaW5rUXVhbGl0eUNvbXBsZXRlKHVpbnQ4X3QgbGlua19xdWFsaXR5KSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQiKTsKLSAgfQotCi0gIHZvaWQgT25SZWFkQWZoQ2hhbm5lbE1hcENvbXBsZXRlKAotICAgICAgaGNpOjpBZmhNb2RlIGFmaF9tb2RlLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDEwPiBhZmhfY2hhbm5lbF9tYXApIG92ZXJyaWRlIHsKLSAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCIpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRSc3NpQ29tcGxldGUodWludDhfdCByc3NpKSBvdmVycmlkZSB7IExPR19JTkZPKCJVTklNUExFTUVOVEVEIik7IH0KLQotICB2b2lkIE9uUmVhZENsb2NrQ29tcGxldGUodWludDMyX3QgY2xvY2ssIHVpbnQxNl90IGFjY3VyYWN5KSBvdmVycmlkZSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQiKTsKLSAgfQotCi0gIHZvaWQgT25DZW50cmFsTGlua0tleUNvbXBsZXRlKGhjaTo6S2V5RmxhZyBrZXlfZmxhZykgb3ZlcnJpZGUgewotICAgIExPR19JTkZPKCIlcyBVTklNUExFTUVOVEVEIiwgX19mdW5jX18pOwotICB9Ci0KLSAgdm9pZCBPblJvbGVDaGFuZ2UoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgaGNpOjpSb2xlIG5ld19yb2xlKSBvdmVycmlkZSB7Ci0gICAgVFJZX1BPU1RJTkdfT05fTUFJTigKLSAgICAgICAgaW50ZXJmYWNlXy5vbl9yb2xlX2NoYW5nZSwgVG9MZWdhY3lIY2lFcnJvckNvZGUoaGNpX3N0YXR1cyksCi0gICAgICAgIFRvUmF3QWRkcmVzcyhjb25uZWN0aW9uXy0+R2V0QWRkcmVzcygpKSwgVG9MZWdhY3lSb2xlKG5ld19yb2xlKSk7Ci0gICAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgVG9SYXdBZGRyZXNzKGNvbm5lY3Rpb25fLT5HZXRBZGRyZXNzKCkpLAotICAgICAgICAgICAgICAgICAgICJSb2xlIGNoYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCJjbGFzc2ljICBzdGF0dXM6JXMgbmV3X3JvbGU6JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkVycm9yQ29kZVRleHQoaGNpX3N0YXR1cykuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpSb2xlVGV4dChuZXdfcm9sZSkuY19zdHIoKSkpOwotICB9Ci0KLSAgdm9pZCBPbkRpc2Nvbm5lY3Rpb24oaGNpOjpFcnJvckNvZGUgcmVhc29uKSBvdmVycmlkZSB7Ci0gICAgRGlzY29ubmVjdCgpOwotICAgIG9uX2Rpc2Nvbm5lY3RfKGhhbmRsZV8sIHJlYXNvbik7Ci0gIH0KLQotICB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdWJfdmVyc2lvbikgb3ZlcnJpZGUgewotICAgIFRSWV9QT1NUSU5HX09OX01BSU4oaW50ZXJmYWNlXy5vbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uX2NvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgVG9MZWdhY3lIY2lFcnJvckNvZGUoaGNpX3N0YXR1cyksIGhhbmRsZV8sIGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgfQotCi0gIHZvaWQgT25SZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXNDb21wbGV0ZSh1aW50NjRfdCBmZWF0dXJlcykgb3ZlcnJpZGUgewotICAgIFRSWV9QT1NUSU5HX09OX01BSU4oaW50ZXJmYWNlXy5vbl9yZWFkX3JlbW90ZV9zdXBwb3J0ZWRfZmVhdHVyZXNfY29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfLCBmZWF0dXJlcyk7Ci0KLSAgICBpZiAoZmVhdHVyZXMgJiAoKHVpbnQ2NF90KDEpIDw8IDYzKSkpIHsKLSAgICAgIGNvbm5lY3Rpb25fLT5SZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygxKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX0RFQlVHKCJEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBleHRlbmRlZCBmZWF0dXJlcyIpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzQ29tcGxldGUodWludDhfdCBwYWdlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfcGFnZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZlYXR1cmVzKSBvdmVycmlkZSB7Ci0gICAgVFJZX1BPU1RJTkdfT05fTUFJTihpbnRlcmZhY2VfLm9uX3JlYWRfcmVtb3RlX2V4dGVuZGVkX2ZlYXR1cmVzX2NvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlXywgcGFnZV9udW1iZXIsIG1heF9wYWdlX251bWJlciwgZmVhdHVyZXMpOwotCi0gICAgLy8gU3VwcG9ydGVkIGZlYXR1cmVzIGFsaWFzZXMgdG8gZXh0ZW5kZWQgZmVhdHVyZXMgcGFnZSAwCi0gICAgaWYgKHBhZ2VfbnVtYmVyID09IDAgJiYgIShmZWF0dXJlcyAmICgodWludDY0X3QoMSkgPDwgNjMpKSkpIHsKLSAgICAgIExPR19ERUJVRygiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5kZWQgZmVhdHVyZXMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGFnZV9udW1iZXIgIT0gbWF4X3BhZ2VfbnVtYmVyKQotICAgICAgY29ubmVjdGlvbl8tPlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKHBhZ2VfbnVtYmVyICsgMSk7Ci0gIH0KLQotICBoY2k6OkFkZHJlc3MgR2V0UmVtb3RlQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25fLT5HZXRBZGRyZXNzKCk7IH0KLQotICB2b2lkIEluaXRpYXRlRGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb24gcmVhc29uKSBvdmVycmlkZSB7Ci0gICAgY29ubmVjdGlvbl8tPkRpc2Nvbm5lY3QocmVhc29uKTsKLSAgfQotCi0gIHZvaWQgSG9sZE1vZGUodWludDE2X3QgbWF4X2ludGVydmFsLCB1aW50MTZfdCBtaW5faW50ZXJ2YWwpIHsKLSAgICBBU1NFUlQoY29ubmVjdGlvbl8tPkhvbGRNb2RlKG1heF9pbnRlcnZhbCwgbWluX2ludGVydmFsKSk7Ci0gIH0KLQotICB2b2lkIFNuaWZmTW9kZSh1aW50MTZfdCBtYXhfaW50ZXJ2YWwsIHVpbnQxNl90IG1pbl9pbnRlcnZhbCwgdWludDE2X3QgYXR0ZW1wdCwKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCkgewotICAgIEFTU0VSVCgKLSAgICAgICAgY29ubmVjdGlvbl8tPlNuaWZmTW9kZShtYXhfaW50ZXJ2YWwsIG1pbl9pbnRlcnZhbCwgYXR0ZW1wdCwgdGltZW91dCkpOwotICB9Ci0KLSAgdm9pZCBFeGl0U25pZmZNb2RlKCkgeyBBU1NFUlQoY29ubmVjdGlvbl8tPkV4aXRTbmlmZk1vZGUoKSk7IH0KLQotICB2b2lkIFNuaWZmU3VicmF0aW5nKHVpbnQxNl90IG1heGltdW1fbGF0ZW5jeSwgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIHsKLSAgICBBU1NFUlQoY29ubmVjdGlvbl8tPlNuaWZmU3VicmF0aW5nKG1heGltdW1fbGF0ZW5jeSwgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1fbG9jYWxfdGltZW91dCkpOwotICB9Ci0KLSAgdm9pZCBTZXRDb25uZWN0aW9uRW5jcnlwdGlvbihoY2k6OkVuYWJsZSBpc19lbmNyeXB0aW9uX2VuYWJsZWQpIHsKLSAgICBBU1NFUlQoY29ubmVjdGlvbl8tPlNldENvbm5lY3Rpb25FbmNyeXB0aW9uKGlzX2VuY3J5cHRpb25fZW5hYmxlZCkpOwotICB9Ci0KLSAgYm9vbCBJc0xvY2FsbHlJbml0aWF0ZWQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25fLT5sb2NhbGx5X2luaXRpYXRlZF87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE9uRGlzY29ubmVjdCBvbl9kaXNjb25uZWN0XzsKLSAgY29uc3Qgc2hpbTo6bGVnYWN5OjphY2xfY2xhc3NpY19saW5rX2ludGVyZmFjZV90IGludGVyZmFjZV87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpDbGFzc2ljQWNsQ29ubmVjdGlvbj4gY29ubmVjdGlvbl87Ci19OwotCi1jbGFzcyBMZVNoaW1BY2xDb25uZWN0aW9uCi0gICAgOiBwdWJsaWMgU2hpbUFjbENvbm5lY3Rpb24sCi0gICAgICBwdWJsaWMgaGNpOjphY2xfbWFuYWdlcjo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyB7Ci0gcHVibGljOgotICBMZVNoaW1BY2xDb25uZWN0aW9uKAotICAgICAgU2VuZERhdGFVcHdhcmRzIHNlbmRfZGF0YV91cHdhcmRzLCBPbkRpc2Nvbm5lY3Qgb25fZGlzY29ubmVjdCwKLSAgICAgIGNvbnN0IHNoaW06OmxlZ2FjeTo6YWNsX2xlX2xpbmtfaW50ZXJmYWNlX3QmIGludGVyZmFjZSwKLSAgICAgIG9zOjpIYW5kbGVyKiBoYW5kbGVyLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkxlQWNsQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKLSAgICAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IGNyZWF0aW9uX3RpbWUpCi0gICAgICA6IFNoaW1BY2xDb25uZWN0aW9uKGNvbm5lY3Rpb24tPkdldEhhbmRsZSgpLCBzZW5kX2RhdGFfdXB3YXJkcywgaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+R2V0QWNsUXVldWVFbmQoKSwgY3JlYXRpb25fdGltZSksCi0gICAgICAgIG9uX2Rpc2Nvbm5lY3RfKG9uX2Rpc2Nvbm5lY3QpLAotICAgICAgICBpbnRlcmZhY2VfKGludGVyZmFjZSksCi0gICAgICAgIGNvbm5lY3Rpb25fKHN0ZDo6bW92ZShjb25uZWN0aW9uKSkge30KLQotICB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKCkgb3ZlcnJpZGUgewotICAgIGNvbm5lY3Rpb25fLT5SZWdpc3RlckNhbGxiYWNrcyh0aGlzLCBoYW5kbGVyXyk7Ci0gIH0KLQotICB2b2lkIFJlYWRSZW1vdGVDb250cm9sbGVySW5mb3JtYXRpb24oKSBvdmVycmlkZSB7Ci0gICAgLy8gVE9ETyBJc3N1ZSBMZVJlYWRSZW1vdGVGZWF0dXJlcyBDb21tYW5kCi0gIH0KLQotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldExvY2FsQWRkcmVzc1dpdGhUeXBlKCkgewotICAgIHJldHVybiBjb25uZWN0aW9uXy0+R2V0TG9jYWxBZGRyZXNzKCk7Ci0gIH0KLQotICB2b2lkIE9uQ29ubmVjdGlvblVwZGF0ZShoY2k6OkVycm9yQ29kZSBoY2lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RpbWVvdXQpIHsKLSAgICBUUllfUE9TVElOR19PTl9NQUlOKAotICAgICAgICBpbnRlcmZhY2VfLm9uX2Nvbm5lY3Rpb25fdXBkYXRlLCBUb0xlZ2FjeUhjaUVycm9yQ29kZShoY2lfc3RhdHVzKSwKLSAgICAgICAgaGFuZGxlXywgY29ubmVjdGlvbl9pbnRlcnZhbCwgY29ubmVjdGlvbl9sYXRlbmN5LCBzdXBlcnZpc2lvbl90aW1lb3V0KTsKLSAgfQotICB2b2lkIE9uRGF0YUxlbmd0aENoYW5nZSh1aW50MTZfdCB0eF9vY3RldHMsIHVpbnQxNl90IHR4X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJ4X29jdGV0cywgdWludDE2X3QgcnhfdGltZSkgewotICAgIFRSWV9QT1NUSU5HX09OX01BSU4oaW50ZXJmYWNlXy5vbl9kYXRhX2xlbmd0aF9jaGFuZ2UsIHR4X29jdGV0cywgdHhfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ4X29jdGV0cywgcnhfdGltZSk7Ci0gIH0KLQotICB2b2lkIE9uUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdWJfdmVyc2lvbikgb3ZlcnJpZGUgewotICAgIFRSWV9QT1NUSU5HX09OX01BSU4oaW50ZXJmYWNlXy5vbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uX2NvbXBsZXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgVG9MZWdhY3lIY2lFcnJvckNvZGUoaGNpX3N0YXR1cyksIGhhbmRsZV8sIGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyX25hbWUsIHN1Yl92ZXJzaW9uKTsKLSAgfQotCi0gIHZvaWQgT25QaHlVcGRhdGUoaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywgdWludDhfdCB0eF9waHksCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCByeF9waHkpIG92ZXJyaWRlIHsKLSAgICBUUllfUE9TVElOR19PTl9NQUlOKGludGVyZmFjZV8ub25fcGh5X3VwZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5SGNpRXJyb3JDb2RlKGhjaV9zdGF0dXMpLCBoYW5kbGVfLCB0eF9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICByeF9waHkpOwotICB9Ci0KLSAgdm9pZCBPbkxvY2FsQWRkcmVzc1VwZGF0ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSkgb3ZlcnJpZGUgewotICAgIGNvbm5lY3Rpb25fLT5VcGRhdGVMb2NhbEFkZHJlc3MoYWRkcmVzc193aXRoX3R5cGUpOwotICB9Ci0KLSAgdm9pZCBPbkRpc2Nvbm5lY3Rpb24oaGNpOjpFcnJvckNvZGUgcmVhc29uKSB7Ci0gICAgRGlzY29ubmVjdCgpOwotICAgIG9uX2Rpc2Nvbm5lY3RfKGhhbmRsZV8sIHJlYXNvbik7Ci0gIH0KLQotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBHZXRSZW1vdGVBZGRyZXNzV2l0aFR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25fLT5HZXRSZW1vdGVBZGRyZXNzKCk7Ci0gIH0KLQotICB2b2lkIEluaXRpYXRlRGlzY29ubmVjdChoY2k6OkRpc2Nvbm5lY3RSZWFzb24gcmVhc29uKSBvdmVycmlkZSB7Ci0gICAgY29ubmVjdGlvbl8tPkRpc2Nvbm5lY3QocmVhc29uKTsKLSAgfQotCi0gIGJvb2wgSXNMb2NhbGx5SW5pdGlhdGVkKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBjb25uZWN0aW9uXy0+bG9jYWxseV9pbml0aWF0ZWRfOwotICB9Ci0KLSBwcml2YXRlOgotICBPbkRpc2Nvbm5lY3Qgb25fZGlzY29ubmVjdF87Ci0gIGNvbnN0IHNoaW06OmxlZ2FjeTo6YWNsX2xlX2xpbmtfaW50ZXJmYWNlX3QgaW50ZXJmYWNlXzsKLSAgc3RkOjp1bmlxdWVfcHRyPGhjaTo6YWNsX21hbmFnZXI6OkxlQWNsQ29ubmVjdGlvbj4gY29ubmVjdGlvbl87Ci19OwotCi1zdHJ1Y3Qgc2hpbTo6bGVnYWN5OjpBY2w6OmltcGwgewotICBpbXBsKHVpbnQ4X3QgbWF4X2FjY2VwdGxpc3Rfc2l6ZSwgdWludDhfdCBtYXhfYWRkcmVzc19yZXNvbHV0aW9uX3NpemUpCi0gICAgICA6IHNoYWRvd19hY2NlcHRsaXN0XyhTaGFkb3dBY2NlcHRsaXN0KG1heF9hY2NlcHRsaXN0X3NpemUpKSwKLSAgICAgICAgc2hhZG93X2FkZHJlc3NfcmVzb2x1dGlvbl9saXN0XygKLSAgICAgICAgICAgIFNoYWRvd0FkZHJlc3NSZXNvbHV0aW9uTGlzdChtYXhfYWRkcmVzc19yZXNvbHV0aW9uX3NpemUpKSB7fQotCi0gIHN0ZDo6bWFwPEhjaUhhbmRsZSwgc3RkOjp1bmlxdWVfcHRyPENsYXNzaWNTaGltQWNsQ29ubmVjdGlvbj4+Ci0gICAgICBoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF87Ci0gIHN0ZDo6bWFwPEhjaUhhbmRsZSwgc3RkOjp1bmlxdWVfcHRyPExlU2hpbUFjbENvbm5lY3Rpb24+PgotICAgICAgaGFuZGxlX3RvX2xlX2Nvbm5lY3Rpb25fbWFwXzsKLQotICBGaXhlZFF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxDb25uZWN0aW9uRGVzY3JpcHRvcj4+IGNvbm5lY3Rpb25faGlzdG9yeV8gPQotICAgICAgRml4ZWRRdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8Q29ubmVjdGlvbkRlc2NyaXB0b3I+PihrQ29ubmVjdGlvbkhpc3RvcnlTaXplKTsKLQotICBTaGFkb3dBY2NlcHRsaXN0IHNoYWRvd19hY2NlcHRsaXN0XzsKLSAgU2hhZG93QWRkcmVzc1Jlc29sdXRpb25MaXN0IHNoYWRvd19hZGRyZXNzX3Jlc29sdXRpb25fbGlzdF87Ci0KLSAgYm9vbCBJc0NsYXNzaWNBY2woSGNpSGFuZGxlIGhhbmRsZSkgewotICAgIHJldHVybiBoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF8uZmluZChoYW5kbGUpICE9Ci0gICAgICAgICAgIGhhbmRsZV90b19jbGFzc2ljX2Nvbm5lY3Rpb25fbWFwXy5lbmQoKTsKLSAgfQotCi0gIHZvaWQgRW5xdWV1ZUNsYXNzaWNQYWNrZXQoSGNpSGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBwYWNrZXQpIHsKLSAgICBBU1NFUlRfTE9HKElzQ2xhc3NpY0FjbChoYW5kbGUpLCAiaGFuZGxlICVkIGlzIG5vdCBhIGNsYXNzaWMgY29ubmVjdGlvbiIsCi0gICAgICAgICAgICAgICBoYW5kbGUpOwotICAgIGhhbmRsZV90b19jbGFzc2ljX2Nvbm5lY3Rpb25fbWFwX1toYW5kbGVdLT5FbnF1ZXVlUGFja2V0KHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotCi0gIGJvb2wgSXNMZUFjbChIY2lIYW5kbGUgaGFuZGxlKSB7Ci0gICAgcmV0dXJuIGhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF8uZmluZChoYW5kbGUpICE9Ci0gICAgICAgICAgIGhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF8uZW5kKCk7Ci0gIH0KLQotICB2b2lkIEVucXVldWVMZVBhY2tldChIY2lIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8cGFja2V0OjpSYXdCdWlsZGVyPiBwYWNrZXQpIHsKLSAgICBBU1NFUlRfTE9HKElzTGVBY2woaGFuZGxlKSwgImhhbmRsZSAlZCBpcyBub3QgYSBMRSBjb25uZWN0aW9uIiwgaGFuZGxlKTsKLSAgICBoYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfW2hhbmRsZV0tPkVucXVldWVQYWNrZXQoc3RkOjptb3ZlKHBhY2tldCkpOwotICB9Ci0KLSAgdm9pZCBTaHV0ZG93bkNsYXNzaWNDb25uZWN0aW9ucyhzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICAgIExPR19JTkZPKCJTaHV0ZG93biBnZCBhY2wgc2hpbSBjbGFzc2ljIGNvbm5lY3Rpb25zIik7Ci0gICAgZm9yIChhdXRvJiBjb25uZWN0aW9uIDogaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfKSB7Ci0gICAgICBjb25uZWN0aW9uLnNlY29uZC0+U2h1dGRvd24oKTsKLSAgICB9Ci0gICAgaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfLmNsZWFyKCk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgU2h1dGRvd25MZUNvbm5lY3Rpb25zKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKSB7Ci0gICAgTE9HX0lORk8oIlNodXRkb3duIGdkIGFjbCBzaGltIGxlIGNvbm5lY3Rpb25zIik7Ci0gICAgZm9yIChhdXRvJiBjb25uZWN0aW9uIDogaGFuZGxlX3RvX2xlX2Nvbm5lY3Rpb25fbWFwXykgewotICAgICAgY29ubmVjdGlvbi5zZWNvbmQtPlNodXRkb3duKCk7Ci0gICAgfQotICAgIGhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF8uY2xlYXIoKTsKLSAgICBwcm9taXNlLnNldF92YWx1ZSgpOwotICB9Ci0KLSAgdm9pZCBGaW5hbFNodXRkb3duKHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlKSB7Ci0gICAgaWYgKCFoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF8uZW1wdHkoKSkgewotICAgICAgZm9yIChhdXRvJiBjb25uZWN0aW9uIDogaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfKSB7Ci0gICAgICAgIGNvbm5lY3Rpb24uc2Vjb25kLT5TaHV0ZG93bigpOwotICAgICAgfQotICAgICAgaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfLmNsZWFyKCk7Ci0gICAgICBMT0dfSU5GTygiQ2xlYXJlZCBhbGwgY2xhc3NpYyBjb25uZWN0aW9ucyBjb3VudDolenUiLAotICAgICAgICAgICAgICAgaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfLnNpemUoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFoYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfLmVtcHR5KCkpIHsKLSAgICAgIGZvciAoYXV0byYgY29ubmVjdGlvbiA6IGhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF8pIHsKLSAgICAgICAgY29ubmVjdGlvbi5zZWNvbmQtPlNodXRkb3duKCk7Ci0gICAgICB9Ci0gICAgICBoYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfLmNsZWFyKCk7Ci0gICAgICBMT0dfSU5GTygiQ2xlYXJlZCBhbGwgbGUgY29ubmVjdGlvbnMgY291bnQ6JXp1IiwKLSAgICAgICAgICAgICAgIGhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF8uc2l6ZSgpKTsKLSAgICB9Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHZvaWQgSG9sZE1vZGUoSGNpSGFuZGxlIGhhbmRsZSwgdWludDE2X3QgbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9pbnRlcnZhbCkgewotICAgIEFTU0VSVF9MT0coSXNDbGFzc2ljQWNsKGhhbmRsZSksICJoYW5kbGUgJWQgaXMgbm90IGEgY2xhc3NpYyBjb25uZWN0aW9uIiwKLSAgICAgICAgICAgICAgIGhhbmRsZSk7Ci0gICAgaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfW2hhbmRsZV0tPkhvbGRNb2RlKG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2ludGVydmFsKTsKLSAgfQotCi0gIHZvaWQgRXhpdFNuaWZmTW9kZShIY2lIYW5kbGUgaGFuZGxlKSB7Ci0gICAgQVNTRVJUX0xPRyhJc0NsYXNzaWNBY2woaGFuZGxlKSwgImhhbmRsZSAlZCBpcyBub3QgYSBjbGFzc2ljIGNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICAgaGFuZGxlKTsKLSAgICBoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF9baGFuZGxlXS0+RXhpdFNuaWZmTW9kZSgpOwotICB9Ci0KLSAgdm9pZCBTbmlmZk1vZGUoSGNpSGFuZGxlIGhhbmRsZSwgdWludDE2X3QgbWF4X2ludGVydmFsLCB1aW50MTZfdCBtaW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dGVtcHQsIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgICBBU1NFUlRfTE9HKElzQ2xhc3NpY0FjbChoYW5kbGUpLCAiaGFuZGxlICVkIGlzIG5vdCBhIGNsYXNzaWMgY29ubmVjdGlvbiIsCi0gICAgICAgICAgICAgICBoYW5kbGUpOwotICAgIGhhbmRsZV90b19jbGFzc2ljX2Nvbm5lY3Rpb25fbWFwX1toYW5kbGVdLT5TbmlmZk1vZGUoCi0gICAgICAgIG1heF9pbnRlcnZhbCwgbWluX2ludGVydmFsLCBhdHRlbXB0LCB0aW1lb3V0KTsKLSAgfQotCi0gIHZvaWQgU25pZmZTdWJyYXRpbmcoSGNpSGFuZGxlIGhhbmRsZSwgdWludDE2X3QgbWF4aW11bV9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KSB7Ci0gICAgQVNTRVJUX0xPRyhJc0NsYXNzaWNBY2woaGFuZGxlKSwgImhhbmRsZSAlZCBpcyBub3QgYSBjbGFzc2ljIGNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICAgaGFuZGxlKTsKLSAgICBoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF9baGFuZGxlXS0+U25pZmZTdWJyYXRpbmcoCi0gICAgICAgIG1heGltdW1fbGF0ZW5jeSwgbWluaW11bV9yZW1vdGVfdGltZW91dCwgbWluaW11bV9sb2NhbF90aW1lb3V0KTsKLSAgfQotCi0gIHZvaWQgU2V0Q29ubmVjdGlvbkVuY3J5cHRpb24oSGNpSGFuZGxlIGhhbmRsZSwgaGNpOjpFbmFibGUgZW5hYmxlKSB7Ci0gICAgQVNTRVJUX0xPRyhJc0NsYXNzaWNBY2woaGFuZGxlKSwgImhhbmRsZSAlZCBpcyBub3QgYSBjbGFzc2ljIGNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICAgaGFuZGxlKTsKLSAgICBoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF9baGFuZGxlXS0+U2V0Q29ubmVjdGlvbkVuY3J5cHRpb24oZW5hYmxlKTsKLSAgfQotCi0gIHZvaWQgZGlzY29ubmVjdF9jbGFzc2ljKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKSB7Ci0gICAgYXV0byBjb25uZWN0aW9uID0gaGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfLmZpbmQoaGFuZGxlKTsKLSAgICBpZiAoY29ubmVjdGlvbiAhPSBoYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF8uZW5kKCkpIHsKLSAgICAgIGF1dG8gcmVtb3RlX2FkZHJlc3MgPSBjb25uZWN0aW9uLT5zZWNvbmQtPkdldFJlbW90ZUFkZHJlc3MoKTsKLSAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC0+SW5pdGlhdGVEaXNjb25uZWN0KAotICAgICAgICAgIFRvRGlzY29ubmVjdFJlYXNvbkZyb21MZWdhY3kocmVhc29uKSk7Ci0gICAgICBMT0dfREVCVUcoIkRpc2Nvbm5lY3Rpb24gaW5pdGlhdGVkIGNsYXNzaWMgcmVtb3RlOiVzIGhhbmRsZTolaHUiLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYWRkcmVzcyksIGhhbmRsZSk7Ci0gICAgICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBUb1Jhd0FkZHJlc3MocmVtb3RlX2FkZHJlc3MpLAotICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3Rpb24gaW5pdGlhdGVkIiwgImNsYXNzaWMiKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBkaXNjb25uZWN0IHVua25vd24gY2xhc3NpYyBjb25uZWN0aW9uIGhhbmRsZToweCUwNHgiLAotICAgICAgICAgICAgICAgaGFuZGxlKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGRpc2Nvbm5lY3RfbGUodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pIHsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBoYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfLmZpbmQoaGFuZGxlKTsKLSAgICBpZiAoY29ubmVjdGlvbiAhPSBoYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfLmVuZCgpKSB7Ci0gICAgICBhdXRvIHJlbW90ZV9hZGRyZXNzX3dpdGhfdHlwZSA9Ci0gICAgICAgICAgY29ubmVjdGlvbi0+c2Vjb25kLT5HZXRSZW1vdGVBZGRyZXNzV2l0aFR5cGUoKTsKLSAgICAgIGNvbm5lY3Rpb24tPnNlY29uZC0+SW5pdGlhdGVEaXNjb25uZWN0KAotICAgICAgICAgIFRvRGlzY29ubmVjdFJlYXNvbkZyb21MZWdhY3kocmVhc29uKSk7Ci0gICAgICBMT0dfREVCVUcoIkRpc2Nvbm5lY3Rpb24gaW5pdGlhdGVkIGxlIHJlbW90ZTolcyBoYW5kbGU6JWh1IiwKLSAgICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocmVtb3RlX2FkZHJlc3Nfd2l0aF90eXBlKSwgaGFuZGxlKTsKLSAgICAgIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsCi0gICAgICAgICAgICAgICAgICAgICBUb0xlZ2FjeUFkZHJlc3NXaXRoVHlwZShyZW1vdGVfYWRkcmVzc193aXRoX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3Rpb24gaW5pdGlhdGVkIiwgIkxlIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gZGlzY29ubmVjdCB1bmtub3duIGxlIGNvbm5lY3Rpb24gaGFuZGxlOjB4JTA0eCIsCi0gICAgICAgICAgICAgICBoYW5kbGUpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYWNjZXB0X2xlX2Nvbm5lY3Rpb25fZnJvbShjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgc3RkOjpwcm9taXNlPGJvb2w+IHByb21pc2UpIHsKLSAgICBpZiAoc2hhZG93X2FjY2VwdGxpc3RfLklzRnVsbCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIkFjY2VwdGxpc3QgaXMgZnVsbCBwcmV2ZW50aW5nIG5ldyBMZSBjb25uZWN0aW9uIik7Ci0gICAgICBwcm9taXNlLnNldF92YWx1ZShmYWxzZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHNoYWRvd19hY2NlcHRsaXN0Xy5BZGQoYWRkcmVzc193aXRoX3R5cGUpOwotICAgIHByb21pc2Uuc2V0X3ZhbHVlKHRydWUpOwotICAgIEdldEFjbE1hbmFnZXIoKS0+Q3JlYXRlTGVDb25uZWN0aW9uKGFkZHJlc3Nfd2l0aF90eXBlLCBpc19kaXJlY3QpOwotICAgIExPR19ERUJVRygiQWxsb3cgTGUgY29ubmVjdGlvbiBmcm9tIHJlbW90ZTolcyIsCi0gICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhhZGRyZXNzX3dpdGhfdHlwZSkpOwotICAgIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIFRvTGVnYWN5QWRkcmVzc1dpdGhUeXBlKGFkZHJlc3Nfd2l0aF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAiQWxsb3cgY29ubmVjdGlvbiBmcm9tIiwgIkxlIik7Ci0gIH0KLQotICB2b2lkIGlnbm9yZV9sZV9jb25uZWN0aW9uX2Zyb20oCi0gICAgICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICBzaGFkb3dfYWNjZXB0bGlzdF8uUmVtb3ZlKGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgICBHZXRBY2xNYW5hZ2VyKCktPkNhbmNlbExlQ29ubmVjdChhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgTE9HX0RFQlVHKCJJZ25vcmUgTGUgY29ubmVjdGlvbiBmcm9tIHJlbW90ZTolcyIsCi0gICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhhZGRyZXNzX3dpdGhfdHlwZSkpOwotICAgIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIFRvTGVnYWN5QWRkcmVzc1dpdGhUeXBlKGFkZHJlc3Nfd2l0aF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAiSWdub3JlIGNvbm5lY3Rpb24gZnJvbSIsICJMZSIpOwotICB9Ci0KLSAgdm9pZCBjbGVhcl9hY2NlcHRsaXN0KCkgewotICAgIGF1dG8gc2hhZG93X2FjY2VwdGxpc3QgPSBzaGFkb3dfYWNjZXB0bGlzdF8uR2V0Q29weSgpOwotICAgIHNpemVfdCBjb3VudCA9IHNoYWRvd19hY2NlcHRsaXN0LnNpemUoKTsKLSAgICBmb3IgKGF1dG8gYWRkcmVzc193aXRoX3R5cGUgOiBzaGFkb3dfYWNjZXB0bGlzdCkgewotICAgICAgaWdub3JlX2xlX2Nvbm5lY3Rpb25fZnJvbShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0gICAgfQotICAgIHNoYWRvd19hY2NlcHRsaXN0Xy5DbGVhcigpOwotICAgIExPR19ERUJVRygiQ2xlYXJlZCBlbnRpcmUgTGUgYWRkcmVzcyBhY2NlcHRsaXN0IGNvdW50OiV6dSIsIGNvdW50KTsKLSAgfQotCi0gIHZvaWQgQWRkVG9BZGRyZXNzUmVzb2x1dGlvbihjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgcGVlcl9pcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgbG9jYWxfaXJrKSB7Ci0gICAgaWYgKHNoYWRvd19hZGRyZXNzX3Jlc29sdXRpb25fbGlzdF8uSXNGdWxsKCkpIHsKLSAgICAgIExPR19XQVJOKCJMZSBBZGRyZXNzIFJlc29sdXRpb24gbGlzdCBpcyBmdWxsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgcmVhbGx5IGJlIGFkZGVkIHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uCi0gICAgc2hhZG93X2FkZHJlc3NfcmVzb2x1dGlvbl9saXN0Xy5BZGQoYWRkcmVzc193aXRoX3R5cGUpOwotICAgIEdldEFjbE1hbmFnZXIoKS0+QWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KGFkZHJlc3Nfd2l0aF90eXBlLCBwZWVyX2lyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9pcmspOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVGcm9tQWRkcmVzc1Jlc29sdXRpb24oCi0gICAgICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgICAvLyBUT0RPIFRoaXMgc2hvdWxkIHJlYWxseSBiZSByZW1vdmVkIHVwb24gc3VjY2Vzc2Z1bCByZW1vdmFsCi0gICAgaWYgKCFzaGFkb3dfYWRkcmVzc19yZXNvbHV0aW9uX2xpc3RfLlJlbW92ZShhZGRyZXNzX3dpdGhfdHlwZSkpIHsKLSAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gcmVtb3ZlIGZyb20gTGUgQWRkcmVzcyBSZXNvbHV0aW9uIGxpc3QgZGV2aWNlOiVzIiwKLSAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhhZGRyZXNzX3dpdGhfdHlwZSkpOwotICAgIH0KLSAgICBHZXRBY2xNYW5hZ2VyKCktPlJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KGFkZHJlc3Nfd2l0aF90eXBlKTsKLSAgfQotCi0gIHZvaWQgQ2xlYXJSZXNvbHZpbmdMaXN0KCkgewotICAgIEdldEFjbE1hbmFnZXIoKS0+Q2xlYXJSZXNvbHZpbmdMaXN0KCk7Ci0gICAgLy8gVE9ETyBUaGlzIHNob3VsZCByZWFsbHkgYmUgY2xlYXJlZCBhZnRlciBzdWNjZXNzZnVsIGNsZWFyIHN0YXR1cwotICAgIHNoYWRvd19hZGRyZXNzX3Jlc29sdXRpb25fbGlzdF8uQ2xlYXIoKTsKLSAgfQotCi0gIHZvaWQgRHVtcENvbm5lY3Rpb25IaXN0b3J5KCkgY29uc3QgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBoaXN0b3J5ID0KLSAgICAgICAgY29ubmVjdGlvbl9oaXN0b3J5Xy5SZWFkRWxlbWVudHNBc1N0cmluZygpOwotICAgIGZvciAoYXV0byYgZW50cnkgOiBoaXN0b3J5KSB7Ci0gICAgICBMT0dfREVCVUcoIiVzIiwgZW50cnkuY19zdHIoKSk7Ci0gICAgfQotICAgIGNvbnN0IGF1dG8gYWNjZXB0bGlzdCA9IHNoYWRvd19hY2NlcHRsaXN0Xy5HZXRDb3B5KCk7Ci0gICAgTE9HX0RFQlVHKCJTaGFkb3cgbGUgYWNjZXB0IGxpc3QgIHNpemU6JS0zenUgY29udHJvbGxlcl9tYXhfc2l6ZTolaGh1IiwKLSAgICAgICAgICAgICAgYWNjZXB0bGlzdC5zaXplKCksCi0gICAgICAgICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX2FjY2VwdGxpc3Rfc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8mIGVudHJ5IDogYWNjZXB0bGlzdCkgewotICAgICAgTE9HX0RFQlVHKCJhY2NlcHRsaXN0OiVzIiwgZW50cnkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotI2RlZmluZSBEVU1QU1lTX1RBRyAic2hpbTo6YWNsIgotICB2b2lkIER1bXBDb25uZWN0aW9uSGlzdG9yeShpbnQgZmQpIGNvbnN0IHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaGlzdG9yeSA9Ci0gICAgICAgIGNvbm5lY3Rpb25faGlzdG9yeV8uUmVhZEVsZW1lbnRzQXNTdHJpbmcoKTsKLSAgICBmb3IgKGF1dG8mIGVudHJ5IDogaGlzdG9yeSkgewotICAgICAgTE9HX0RVTVBTWVMoZmQsICIlcyIsIGVudHJ5LmNfc3RyKCkpOwotICAgIH0KLSAgICBhdXRvIGFjY2VwdGxpc3QgPSBzaGFkb3dfYWNjZXB0bGlzdF8uR2V0Q29weSgpOwotICAgIExPR19EVU1QU1lTKGZkLAotICAgICAgICAgICAgICAgICJTaGFkb3cgbGUgYWNjZXB0IGxpc3QgICAgICAgICAgICAgIHNpemU6JS0zenUgIgotICAgICAgICAgICAgICAgICJjb250cm9sbGVyX21heF9zaXplOiVoaHUiLAotICAgICAgICAgICAgICAgIGFjY2VwdGxpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX2FjY2VwdGxpc3Rfc2l6ZSgpKTsKLSAgICB1bnNpZ25lZCBjbnQgPSAwOwotICAgIGZvciAoYXV0byYgZW50cnkgOiBhY2NlcHRsaXN0KSB7Ci0gICAgICBMT0dfRFVNUFNZUyhmZCwgIiAgJTAzdSAlcyIsICsrY250LCBlbnRyeS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0KLSAgICBhdXRvIGFkZHJlc3NfcmVzb2x1dGlvbl9saXN0ID0gc2hhZG93X2FkZHJlc3NfcmVzb2x1dGlvbl9saXN0Xy5HZXRDb3B5KCk7Ci0gICAgTE9HX0RVTVBTWVMoZmQsCi0gICAgICAgICAgICAgICAgIlNoYWRvdyBsZSBhZGRyZXNzIHJlc29sdXRpb24gbGlzdCAgc2l6ZTolLTN6dSAiCi0gICAgICAgICAgICAgICAgImNvbnRyb2xsZXJfbWF4X3NpemU6JWhodSIsCi0gICAgICAgICAgICAgICAgYWRkcmVzc19yZXNvbHV0aW9uX2xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkpOwotICAgIGNudCA9IDA7Ci0gICAgZm9yIChhdXRvJiBlbnRyeSA6IGFkZHJlc3NfcmVzb2x1dGlvbl9saXN0KSB7Ci0gICAgICBMT0dfRFVNUFNZUyhmZCwgIiAgJTAzdSAlcyIsICsrY250LCBlbnRyeS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotI3VuZGVmIERVTVBTWVNfVEFHCi19OwotCi0jZGVmaW5lIERVTVBTWVNfVEFHICJzaGltOjpsZWdhY3k6OmwyY2FwIgotZXh0ZXJuIHRMMkNfQ0IgbDJjYjsKLXZvaWQgRHVtcHN5c0wyY2FwKGludCBmZCkgewotICBMT0dfRFVNUFNZU19USVRMRShmZCwgRFVNUFNZU19UQUcpOwotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MMkNBUF9MSU5LUzsgaSsrKSB7Ci0gICAgY29uc3QgdEwyQ19MQ0ImIGxjYiA9IGwyY2IubGNiX3Bvb2xbaV07Ci0gICAgaWYgKCFsY2IuaW5fdXNlKSBjb250aW51ZTsKLSAgICBMT0dfRFVNUFNZUyhmZCwgImxpbmtfc3RhdGU6JXMiLCBsaW5rX3N0YXRlX3RleHQobGNiLmxpbmtfc3RhdGUpLmNfc3RyKCkpOwotICAgIExPR19EVU1QU1lTKGZkLCAiaGFuZGxlOjB4JTA0eCIsIGxjYi5IYW5kbGUoKSk7Ci0KLSAgICBjb25zdCB0TDJDX0NDQiogY2NiID0gbGNiLmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsKLSAgICB3aGlsZSAoY2NiICE9IG51bGxwdHIpIHsKLSAgICAgIExPR19EVU1QU1lTKAotICAgICAgICAgIGZkLCAiICBhY3RpdmUgY2hhbm5lbCBsY2lkOjB4JTA0eCByY2lkOjB4JTA0eCBpc19lY29jOiVzIGluX3VzZTolcyIsCi0gICAgICAgICAgY2NiLT5sb2NhbF9jaWQsIGNjYi0+cmVtb3RlX2NpZCwgY29tbW9uOjpUb1N0cmluZyhjY2ItPmVjb2MpLmNfc3RyKCksCi0gICAgICAgICAgY29tbW9uOjpUb1N0cmluZyhjY2ItPmluX3VzZSkuY19zdHIoKSk7Ci0gICAgICBjY2IgPSBjY2ItPnBfbmV4dF9jY2I7Ci0gICAgfQotICB9Ci19Ci0KLSN1bmRlZiBEVU1QU1lTX1RBRwotI2RlZmluZSBEVU1QU1lTX1RBRyAic2hpbTo6bGVnYWN5OjphY2wiCi12b2lkIER1bXBzeXNBY2woaW50IGZkKSB7Ci0gIGNvbnN0IHRBQ0xfQ0ImIGFjbF9jYiA9IGJ0bV9jYi5hY2xfY2JfOwotCi0gIExPR19EVU1QU1lTX1RJVExFKGZkLCBEVU1QU1lTX1RBRyk7Ci0KLSAgc2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPkdldEFjbCgpLT5EdW1wQ29ubmVjdGlvbkhpc3RvcnkoZmQpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0wyQ0FQX0xJTktTOyBpKyspIHsKLSAgICBjb25zdCB0QUNMX0NPTk4mIGxpbmsgPSBhY2xfY2IuYWNsX2RiW2ldOwotICAgIGlmICghbGluay5pbl91c2UpIGNvbnRpbnVlOwotCi0gICAgTE9HX0RVTVBTWVMoZmQsICJyZW1vdGVfYWRkcjolcyBoYW5kbGU6MHglMDR4IHRyYW5zcG9ydDolcyIsCi0gICAgICAgICAgICAgICAgbGluay5yZW1vdGVfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGxpbmsuaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICBidF90cmFuc3BvcnRfdGV4dChsaW5rLnRyYW5zcG9ydCkuY19zdHIoKSk7Ci0gICAgTE9HX0RVTVBTWVMoZmQsICIgICAgbGlua191cF9pc3N1ZWQ6JTVzIiwKLSAgICAgICAgICAgICAgICAobGluay5saW5rX3VwX2lzc3VlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBMT0dfRFVNUFNZUyhmZCwgIiAgICBmbHVzaF90aW1lb3V0OjB4JTA0eCIsIGxpbmsuZmx1c2hfdGltZW91dF9pbl90aWNrcyk7Ci0gICAgTE9HX0RVTVBTWVMoZmQsICIgICAgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0OiUuM2Ygc2VjIiwKLSAgICAgICAgICAgICAgICB0aWNrc190b19zZWNvbmRzKGxpbmsubGlua19zdXBlcl90b3V0KSk7Ci0gICAgTE9HX0RVTVBTWVMoZmQsICIgICAgZGlzY29ubmVjdF9yZWFzb246MHglMDJ4IiwgbGluay5kaXNjb25uZWN0X3JlYXNvbik7Ci0KLSAgICBpZiAobGluay5pc190cmFuc3BvcnRfYnJfZWRyKCkpIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgSENJX0VYVF9GRUFUVVJFU19QQUdFX01BWCArIDE7IGorKykgewotICAgICAgICBMT0dfRFVNUFNZUyhmZCwgIiAgICBwZWVyX2xtcF9mZWF0dXJlc1slZF0gdmFsaWQ6JXMgZGF0YTolcyIsIGosCi0gICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VG9TdHJpbmcobGluay5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkW2pdKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICBiZF9mZWF0dXJlc190ZXh0KGxpbmsucGVlcl9sbXBfZmVhdHVyZV9wYWdlc1tqXSkuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBMT0dfRFVNUFNZUyhmZCwgIiAgICBbY2xhc3NpY10gbGlua19wb2xpY3k6JXMiLAotICAgICAgICAgICAgICAgICAgbGlua19wb2xpY3lfdGV4dChzdGF0aWNfY2FzdDx0TElOS19QT0xJQ1k+KGxpbmsubGlua19wb2xpY3kpKQotICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKLSAgICAgIExPR19EVU1QU1lTKGZkLCAiICAgIFtjbGFzc2ljXSBzbmlmZl9zdWJyYXRpbmc6JXMiLAotICAgICAgICAgICAgICAgICAgY29tbW9uOjpUb1N0cmluZyhIQ0lfU05JRkZfU1VCX1JBVEVfU1VQUE9SVEVEKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzWzBdKSkKLSAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7Ci0KLSAgICAgIExPR19EVU1QU1lTKGZkLCAiICAgIHBrdF90eXBlc19tYXNrOjB4JTA0eCIsIGxpbmsucGt0X3R5cGVzX21hc2spOwotICAgICAgTE9HX0RVTVBTWVMoZmQsICIgICAgcm9sZTolcyIsIFJvbGVUZXh0KGxpbmsubGlua19yb2xlKS5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKGxpbmsuaXNfdHJhbnNwb3J0X2JsZSgpKSB7Ci0gICAgICBMT0dfRFVNUFNZUyhmZCwgIiAgICBbbGVdIHBlZXJfZmVhdHVyZXMgdmFsaWQ6JXMgZGF0YTolcyIsCi0gICAgICAgICAgICAgICAgICBjb21tb246OlRvU3RyaW5nKGxpbmsucGVlcl9sZV9mZWF0dXJlc192YWxpZCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIGJkX2ZlYXR1cmVzX3RleHQobGluay5wZWVyX2xlX2ZlYXR1cmVzKS5jX3N0cigpKTsKLQotICAgICAgTE9HX0RVTVBTWVMoZmQsICIgICAgW2xlXSBhY3RpdmVfcmVtb3RlX2FkZHI6JXNbJXNdIiwKLSAgICAgICAgICAgICAgICAgIGxpbmsuYWN0aXZlX3JlbW90ZV9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIEFkZHJlc3NUeXBlVGV4dChsaW5rLmFjdGl2ZV9yZW1vdGVfYWRkcl90eXBlKS5jX3N0cigpKTsKLSAgICAgIExPR19EVU1QU1lTKGZkLCAiICAgIFtsZV0gY29ubl9hZGRyOiVzWyVzXSIsCi0gICAgICAgICAgICAgICAgICBsaW5rLmNvbm5fYWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICBBZGRyZXNzVHlwZVRleHQobGluay5jb25uX2FkZHJfdHlwZSkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0jdW5kZWYgRFVNUFNZU19UQUcKLQotdXNpbmcgUmVjb3JkID0gY29tbW9uOjpUaW1lc3RhbXBlZEVudHJ5PHN0ZDo6c3RyaW5nPjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtUaW1lRm9ybWF0KCIlWS0lbS0lZCAlSDolTTolUyIpOwotCi0jZGVmaW5lIERVTVBTWVNfVEFHICJzaGltOjpsZWdhY3k6OmhpZCIKLWV4dGVybiBidGlmX2hoX2NiX3QgYnRpZl9oaF9jYjsKLQotdm9pZCBEdW1wc3lzSGlkKGludCBmZCkgewotICBMT0dfRFVNUFNZU19USVRMRShmZCwgRFVNUFNZU19UQUcpOwotICBMT0dfRFVNUFNZUyhmZCwgInN0YXR1czolcyBudW1fZGV2aWNlczoldSIsCi0gICAgICAgICAgICAgIGJ0aWZfaGhfc3RhdHVzX3RleHQoYnRpZl9oaF9jYi5zdGF0dXMpLmNfc3RyKCksCi0gICAgICAgICAgICAgIGJ0aWZfaGhfY2IuZGV2aWNlX251bSk7Ci0gIExPR19EVU1QU1lTKGZkLCAic3RhdHVzOiVzIiwgYnRpZl9oaF9zdGF0dXNfdGV4dChidGlmX2hoX2NiLnN0YXR1cykuY19zdHIoKSk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCVElGX0hIX01BWF9ISUQ7IGkrKykgewotICAgIGNvbnN0IGJ0aWZfaGhfZGV2aWNlX3QqIHBfZGV2ID0gJmJ0aWZfaGhfY2IuZGV2aWNlc1tpXTsKLSAgICBpZiAocF9kZXYtPmJkX2FkZHIgIT0gUmF3QWRkcmVzczo6a0VtcHR5KSB7Ci0gICAgICBMT0dfRFVNUFNZUyhmZCwgIiAgJXU6IGFkZHI6JXMgZmQ6JWQgc3RhdGU6JXMgcmVhZHk6JXMgdGhyZWFkX2lkOiVkIiwgaSwKLSAgICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX2Rldi0+YmRfYWRkciksIHBfZGV2LT5mZCwKLSAgICAgICAgICAgICAgICAgIGJ0aGhfY29ubmVjdGlvbl9zdGF0ZV90ZXh0KHBfZGV2LT5kZXZfc3RhdHVzKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgKHBfZGV2LT5yZWFkeV9mb3JfZGF0YSkgPyAoIlQiKSA6ICgiRiIpLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihwX2Rldi0+aGhfcG9sbF90aHJlYWRfaWQpKTsKLSAgICB9Ci0gIH0KLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJUSUZfSEhfTUFYX0FEREVEX0RFVjsgaSsrKSB7Ci0gICAgY29uc3QgYnRpZl9oaF9hZGRlZF9kZXZpY2VfdCogcF9kZXYgPSAmYnRpZl9oaF9jYi5hZGRlZF9kZXZpY2VzW2ldOwotICAgIGlmIChwX2Rldi0+YmRfYWRkciAhPSBSYXdBZGRyZXNzOjprRW1wdHkpIHsKLSAgICAgIExPR19EVU1QU1lTKGZkLCAiICAldTogYWRkcjolcyIsIGksIFBSSVZBVEVfQUREUkVTUyhwX2Rldi0+YmRfYWRkcikpOwotICAgIH0KLSAgfQotfQotI3VuZGVmIERVTVBTWVNfVEFHCi0KLSNkZWZpbmUgRFVNUFNZU19UQUcgInNoaW06OmxlZ2FjeTo6YnRtIgotdm9pZCBEdW1wc3lzQnRtKGludCBmZCkgewotICBMT0dfRFVNUFNZU19USVRMRShmZCwgRFVNUFNZU19UQUcpOwotICBpZiAoYnRtX2NiLmhpc3RvcnlfICE9IG51bGxwdHIpIHsKLSAgICBzdGQ6OnZlY3RvcjxSZWNvcmQ+IGhpc3RvcnkgPSBidG1fY2IuaGlzdG9yeV8tPlB1bGwoKTsKLSAgICBmb3IgKGF1dG8mIHJlY29yZCA6IGhpc3RvcnkpIHsKLSAgICAgIHRpbWVfdCB0aGVuID0gcmVjb3JkLnRpbWVzdGFtcCAvIDEwMDA7Ci0gICAgICBzdHJ1Y3QgdG0gdG07Ci0gICAgICBsb2NhbHRpbWVfcigmdGhlbiwgJnRtKTsKLSAgICAgIGF1dG8gczIgPSBjb21tb246OlN0cmluZ0Zvcm1hdFRpbWUoa1RpbWVGb3JtYXQsIHRtKTsKLSAgICAgIExPR19EVU1QU1lTKGZkLCAiICVzLiUwM3UgJXMiLCBzMi5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyZWNvcmQudGltZXN0YW1wICUgMTAwMCksCi0gICAgICAgICAgICAgICAgICByZWNvcmQuZW50cnkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0jdW5kZWYgRFVNUFNZU19UQUcKLQotI2RlZmluZSBEVU1QU1lTX1RBRyAic2hpbTo6bGVnYWN5OjpyZWNvcmQiCi12b2lkIER1bXBzeXNSZWNvcmQoaW50IGZkKSB7Ci0gIExPR19EVU1QU1lTX1RJVExFKGZkLCBEVU1QU1lTX1RBRyk7Ci0KLSAgaWYgKGJ0bV9jYi5zZWNfZGV2X3JlYyA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0RVTVBTWVMoZmQsICJSZWNvcmQgaXMgZW1wdHkgLSBubyBkZXZpY2VzIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdW5zaWduZWQgY250ID0gMDsKLSAgbGlzdF9ub2RlX3QqIGVuZCA9IGxpc3RfZW5kKGJ0bV9jYi5zZWNfZGV2X3JlYyk7Ci0gIGZvciAobGlzdF9ub2RlX3QqIG5vZGUgPSBsaXN0X2JlZ2luKGJ0bV9jYi5zZWNfZGV2X3JlYyk7IG5vZGUgIT0gZW5kOwotICAgICAgIG5vZGUgPSBsaXN0X25leHQobm9kZSkpIHsKLSAgICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPQotICAgICAgICBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4obGlzdF9ub2RlKG5vZGUpKTsKLSAgICBMT0dfRFVNUFNZUyhmZCwgIiUwM3UgJXMiLCArK2NudCwgcF9kZXZfcmVjLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci19Ci0jdW5kZWYgRFVNUFNZU19UQUcKLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6RHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgUEFOX0R1bXBzeXMoZmQpOwotICBEdW1wc3lzSGlkKGZkKTsKLSAgRHVtcHN5c1JlY29yZChmZCk7Ci0gIER1bXBzeXNBY2woZmQpOwotICBEdW1wc3lzTDJjYXAoZmQpOwotICBEdW1wc3lzQnRtKGZkKTsKLX0KLQotc2hpbTo6bGVnYWN5OjpBY2w6OkFjbChvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNsX2ludGVyZmFjZV90JiBhY2xfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9hY2NlcHRsaXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X2FkZHJlc3NfcmVzb2x1dGlvbl9zaXplKQotICAgIDogaGFuZGxlcl8oaGFuZGxlciksIGFjbF9pbnRlcmZhY2VfKGFjbF9pbnRlcmZhY2UpIHsKLSAgQVNTRVJUKGhhbmRsZXJfICE9IG51bGxwdHIpOwotICBWYWxpZGF0ZUFjbEludGVyZmFjZShhY2xfaW50ZXJmYWNlXyk7Ci0gIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8QWNsOjppbXBsPihtYXhfYWNjZXB0bGlzdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfcmVzb2x1dGlvbl9zaXplKTsKLSAgR2V0QWNsTWFuYWdlcigpLT5SZWdpc3RlckNhbGxiYWNrcyh0aGlzLCBoYW5kbGVyXyk7Ci0gIEdldEFjbE1hbmFnZXIoKS0+UmVnaXN0ZXJMZUNhbGxiYWNrcyh0aGlzLCBoYW5kbGVyXyk7Ci0gIEdldENvbnRyb2xsZXIoKS0+UmVnaXN0ZXJDb21wbGV0ZWRNb25pdG9yQWNsUGFja2V0c0NhbGxiYWNrKAotICAgICAgaGFuZGxlci0+QmluZE9uKHRoaXMsICZBY2w6Om9uX2luY29taW5nX2FjbF9jcmVkaXRzKSk7Ci0gIHNoaW06OlJlZ2lzdGVyRHVtcHN5c0Z1bmN0aW9uKHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdKGludCBmZCkgeyBEdW1wKGZkKTsgfSk7Ci0KLSAgR2V0QWNsTWFuYWdlcigpLT5IQUNLX1NldE5vbkFjbERpc2Nvbm5lY3RDYWxsYmFjaygKLSAgICAgIFt0aGlzXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gICAgICAgIFRSWV9QT1NUSU5HX09OX01BSU4oYWNsX2ludGVyZmFjZV8uY29ubmVjdGlvbi5zY28ub25fZGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgc3RhdGljX2Nhc3Q8dEhDSV9SRUFTT04+KHJlYXNvbikpOwotCi0gICAgICAgIC8vIEhBQ0tDRVBUSU9OISBMRSBJU08gY29ubmVjdGlvbnMsIGp1c3QgbGlrZSBTQ08gYXJlIG5vdCByZWdpc3RlcmVkIGluCi0gICAgICAgIC8vIEdELCBzbyBJU08gY2FuIHVzZSBzYW1lIGhhY2sgdG8gZ2V0IG5vdGlmaWVkIGFib3V0IGRpc2Nvbm5lY3Rpb25zCi0gICAgICAgIFRSWV9QT1NUSU5HX09OX01BSU4oYWNsX2ludGVyZmFjZV8uY29ubmVjdGlvbi5sZS5vbl9pc29fZGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgc3RhdGljX2Nhc3Q8dEhDSV9SRUFTT04+KHJlYXNvbikpOwotICAgICAgfSk7Ci19Ci0KLXNoaW06OmxlZ2FjeTo6QWNsOjp+QWNsKCkgewotICBzaGltOjpVbnJlZ2lzdGVyRHVtcHN5c0Z1bmN0aW9uKHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSk7Ci0gIEdldENvbnRyb2xsZXIoKS0+VW5yZWdpc3RlckNvbXBsZXRlZE1vbml0b3JBY2xQYWNrZXRzQ2FsbGJhY2soKTsKLQotICBpZiAoQ2hlY2tGb3JPcnBoYW5lZEFjbENvbm5lY3Rpb25zKCkpIHsKLSAgICBwaW1wbF8tPkR1bXBDb25uZWN0aW9uSGlzdG9yeSgpOwotICB9Ci19Ci0KLWJvb2wgc2hpbTo6bGVnYWN5OjpBY2w6OkNoZWNrRm9yT3JwaGFuZWRBY2xDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgYm9vbCBvcnBoYW5lZF9hY2xfY29ubmVjdGlvbnMgPSBmYWxzZTsKLQotICBpZiAoIXBpbXBsXy0+aGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfLmVtcHR5KCkpIHsKLSAgICBMT0dfRVJST1IoIkFib3V0IHRvIGRlc3Ryb3kgY2xhc3NpYyBhY3RpdmUgQUNMIik7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjb25uZWN0aW9uIDogcGltcGxfLT5oYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF8pIHsKLSAgICAgIExPR19FUlJPUigiICBPcnBoYW5lZCBjbGFzc2ljIEFDTCBoYW5kbGU6MHglMDR4IGJkX2FkZHI6JXMgY3JlYXRlZDolcyIsCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZWNvbmQtPkhhbmRsZSgpLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhjb25uZWN0aW9uLnNlY29uZC0+R2V0UmVtb3RlQWRkcmVzcygpKSwKLSAgICAgICAgICAgICAgICBjb21tb246OlN0cmluZ0Zvcm1hdFRpbWVXaXRoTWlsbGlzZWNvbmRzKAotICAgICAgICAgICAgICAgICAgICBrQ29ubmVjdGlvbkRlc2NyaXB0b3JUaW1lRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlY29uZC0+R2V0Q3JlYXRpb25UaW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKLSAgICB9Ci0gICAgb3JwaGFuZWRfYWNsX2Nvbm5lY3Rpb25zID0gdHJ1ZTsKLSAgfQotCi0gIGlmICghcGltcGxfLT5oYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfLmVtcHR5KCkpIHsKLSAgICBMT0dfRVJST1IoIkFib3V0IHRvIGRlc3Ryb3kgbGUgYWN0aXZlIEFDTCIpOwotICAgIGZvciAoY29uc3QgYXV0byYgY29ubmVjdGlvbiA6IHBpbXBsXy0+aGFuZGxlX3RvX2xlX2Nvbm5lY3Rpb25fbWFwXykgewotICAgICAgTE9HX0VSUk9SKCIgIE9ycGhhbmVkIGxlIEFDTCBoYW5kbGU6MHglMDR4IGJkX2FkZHI6JXMgY3JlYXRlZDolcyIsCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZWNvbmQtPkhhbmRsZSgpLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhjb25uZWN0aW9uLnNlY29uZC0+R2V0UmVtb3RlQWRkcmVzc1dpdGhUeXBlKCkpLAotICAgICAgICAgICAgICAgIGNvbW1vbjo6U3RyaW5nRm9ybWF0VGltZVdpdGhNaWxsaXNlY29uZHMoCi0gICAgICAgICAgICAgICAgICAgIGtDb25uZWN0aW9uRGVzY3JpcHRvclRpbWVGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2Vjb25kLT5HZXRDcmVhdGlvblRpbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwotICAgIH0KLSAgICBvcnBoYW5lZF9hY2xfY29ubmVjdGlvbnMgPSB0cnVlOwotICB9Ci0gIHJldHVybiBvcnBoYW5lZF9hY2xfY29ubmVjdGlvbnM7Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6Om9uX2luY29taW5nX2FjbF9jcmVkaXRzKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNyZWRpdHMpIHsKLSAgVFJZX1BPU1RJTkdfT05fTUFJTihhY2xfaW50ZXJmYWNlXy5vbl9wYWNrZXRzX2NvbXBsZXRlZCwgaGFuZGxlLCBjcmVkaXRzKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6d3JpdGVfZGF0YV9zeW5jKAotICAgIEhjaUhhbmRsZSBoYW5kbGUsIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OlJhd0J1aWxkZXI+IHBhY2tldCkgewotICBpZiAocGltcGxfLT5Jc0NsYXNzaWNBY2woaGFuZGxlKSkgewotICAgIHBpbXBsXy0+RW5xdWV1ZUNsYXNzaWNQYWNrZXQoaGFuZGxlLCBzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIH0gZWxzZSBpZiAocGltcGxfLT5Jc0xlQWNsKGhhbmRsZSkpIHsKLSAgICBwaW1wbF8tPkVucXVldWVMZVBhY2tldChoYW5kbGUsIHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBmaW5kIGRlc3RpbmF0aW9uIHRvIHdyaXRlIGRhdGFcbiIpOwotICB9Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6OldyaXRlRGF0YShIY2lIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxwYWNrZXQ6OlJhd0J1aWxkZXI+IHBhY2tldCkgewotICBoYW5kbGVyXy0+UG9zdChjb21tb246OkJpbmRPbmNlKCZBY2w6OndyaXRlX2RhdGFfc3luYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246OlVucmV0YWluZWQodGhpcyksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGFja2V0KSkpOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpDcmVhdGVDbGFzc2ljQ29ubmVjdGlvbihjb25zdCBoY2k6OkFkZHJlc3MmIGFkZHJlc3MpIHsKLSAgR2V0QWNsTWFuYWdlcigpLT5DcmVhdGVDb25uZWN0aW9uKGFkZHJlc3MpOwotICBMT0dfREVCVUcoIkNvbm5lY3Rpb24gaW5pdGlhdGVkIGZvciBjbGFzc2ljIHRvIHJlbW90ZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYWRkcmVzcykpOwotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBUb1Jhd0FkZHJlc3MoYWRkcmVzcyksICJJbml0aWF0ZWQgY29ubmVjdGlvbiIsCi0gICAgICAgICAgICAgICAgICJjbGFzc2ljIik7Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6OkNhbmNlbENsYXNzaWNDb25uZWN0aW9uKGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcykgewotICBHZXRBY2xNYW5hZ2VyKCktPkNhbmNlbENvbm5lY3QoYWRkcmVzcyk7Ci0gIExPR19ERUJVRygiQ29ubmVjdGlvbiBjYW5jZWxsZWQgZm9yIGNsYXNzaWMgdG8gcmVtb3RlOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhhZGRyZXNzKSk7Ci0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIFRvUmF3QWRkcmVzcyhhZGRyZXNzKSwgIkNhbmNlbGxlZCBjb25uZWN0aW9uIiwKLSAgICAgICAgICAgICAgICAgImNsYXNzaWMiKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6QWNjZXB0TGVDb25uZWN0aW9uRnJvbSgKLSAgICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgaXNfZGlyZWN0LAotICAgIHN0ZDo6cHJvbWlzZTxib29sPiBwcm9taXNlKSB7Ci0gIGhhbmRsZXJfLT5DYWxsT24ocGltcGxfLmdldCgpLCAmQWNsOjppbXBsOjphY2NlcHRfbGVfY29ubmVjdGlvbl9mcm9tLAotICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLCBpc19kaXJlY3QsIHN0ZDo6bW92ZShwcm9taXNlKSk7Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6Oklnbm9yZUxlQ29ubmVjdGlvbkZyb20oCi0gICAgY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIGhhbmRsZXJfLT5DYWxsT24ocGltcGxfLmdldCgpLCAmQWNsOjppbXBsOjppZ25vcmVfbGVfY29ubmVjdGlvbl9mcm9tLAotICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6T25DbGFzc2ljTGlua0Rpc2Nvbm5lY3RlZChIY2lIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkVycm9yQ29kZSByZWFzb24pIHsKLSAgaGNpOjpBZGRyZXNzIHJlbW90ZV9hZGRyZXNzID0KLSAgICAgIHBpbXBsXy0+aGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfW2hhbmRsZV0tPkdldFJlbW90ZUFkZHJlc3MoKTsKLSAgQ3JlYXRpb25UaW1lIGNyZWF0aW9uX3RpbWUgPQotICAgICAgcGltcGxfLT5oYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF9baGFuZGxlXS0+R2V0Q3JlYXRpb25UaW1lKCk7Ci0gIGJvb2wgaXNfbG9jYWxseV9pbml0aWF0ZWQgPQotICAgICAgcGltcGxfLT5oYW5kbGVfdG9fY2xhc3NpY19jb25uZWN0aW9uX21hcF9baGFuZGxlXS0+SXNMb2NhbGx5SW5pdGlhdGVkKCk7Ci0KLSAgVGVhcmRvd25UaW1lIHRlYXJkb3duX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKLQotICBwaW1wbF8tPmhhbmRsZV90b19jbGFzc2ljX2Nvbm5lY3Rpb25fbWFwXy5lcmFzZShoYW5kbGUpOwotICBUUllfUE9TVElOR19PTl9NQUlOKGFjbF9pbnRlcmZhY2VfLmNvbm5lY3Rpb24uY2xhc3NpYy5vbl9kaXNjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgVG9MZWdhY3lIY2lFcnJvckNvZGUoaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgVG9MZWdhY3lIY2lFcnJvckNvZGUocmVhc29uKSk7Ci0gIExPR19ERUJVRygiRGlzY29ubmVjdGVkIGNsYXNzaWMgbGluayByZW1vdGU6JXMgaGFuZGxlOiVodSByZWFzb246JXMiLAotICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHJlbW90ZV9hZGRyZXNzKSwgaGFuZGxlLAotICAgICAgICAgICAgRXJyb3JDb2RlVGV4dChyZWFzb24pLmNfc3RyKCkpOwotICBCVE1fTG9nSGlzdG9yeSgKLSAgICAgIGtCdG1Mb2dUYWcsIFRvUmF3QWRkcmVzcyhyZW1vdGVfYWRkcmVzcyksICJEaXNjb25uZWN0ZWQiLAotICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCJjbGFzc2ljIHJlYXNvbjolcyIsIEVycm9yQ29kZVRleHQocmVhc29uKS5jX3N0cigpKSk7Ci0gIHBpbXBsXy0+Y29ubmVjdGlvbl9oaXN0b3J5Xy5QdXNoKAotICAgICAgc3RkOjptb3ZlKHN0ZDo6bWFrZV91bmlxdWU8Q2xhc3NpY0Nvbm5lY3Rpb25EZXNjcmlwdG9yPigKLSAgICAgICAgICByZW1vdGVfYWRkcmVzcywgY3JlYXRpb25fdGltZSwgdGVhcmRvd25fdGltZSwgaGFuZGxlLAotICAgICAgICAgIGlzX2xvY2FsbHlfaW5pdGlhdGVkLCByZWFzb24pKSk7Ci19Ci0KLWJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgc2hpbTo6bGVnYWN5OjpBY2w6OkdldENvbm5lY3Rpb25Mb2NhbEFkZHJlc3MoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlOwotICBhdXRvIHJlbW90ZV9hZGRyZXNzID0gVG9HZEFkZHJlc3MocmVtb3RlX2JkYSk7Ci0gIGZvciAoYXV0byYgW2hhbmRsZSwgY29ubmVjdGlvbl0gOiBwaW1wbF8tPmhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF8pIHsKLSAgICBpZiAoY29ubmVjdGlvbi0+R2V0UmVtb3RlQWRkcmVzc1dpdGhUeXBlKCkuR2V0QWRkcmVzcygpID09IHJlbW90ZV9hZGRyZXNzKSB7Ci0gICAgICByZXR1cm4gY29ubmVjdGlvbi0+R2V0TG9jYWxBZGRyZXNzV2l0aFR5cGUoKTsKLSAgICB9Ci0gIH0KLSAgTE9HX1dBUk4oImFkZHJlc3Mgbm90IGZvdW5kISIpOwotICByZXR1cm4gYWRkcmVzc193aXRoX3R5cGU7Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6Ok9uTGVMaW5rRGlzY29ubmVjdGVkKEhjaUhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkVycm9yQ29kZSByZWFzb24pIHsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlX2FkZHJlc3Nfd2l0aF90eXBlID0KLSAgICAgIHBpbXBsXy0+aGFuZGxlX3RvX2xlX2Nvbm5lY3Rpb25fbWFwX1toYW5kbGVdLT5HZXRSZW1vdGVBZGRyZXNzV2l0aFR5cGUoKTsKLSAgQ3JlYXRpb25UaW1lIGNyZWF0aW9uX3RpbWUgPQotICAgICAgcGltcGxfLT5oYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfW2hhbmRsZV0tPkdldENyZWF0aW9uVGltZSgpOwotICBib29sIGlzX2xvY2FsbHlfaW5pdGlhdGVkID0KLSAgICAgIHBpbXBsXy0+aGFuZGxlX3RvX2xlX2Nvbm5lY3Rpb25fbWFwX1toYW5kbGVdLT5Jc0xvY2FsbHlJbml0aWF0ZWQoKTsKLQotICBUZWFyZG93blRpbWUgdGVhcmRvd25fdGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwotCi0gIHBpbXBsXy0+aGFuZGxlX3RvX2xlX2Nvbm5lY3Rpb25fbWFwXy5lcmFzZShoYW5kbGUpOwotICBUUllfUE9TVElOR19PTl9NQUlOKGFjbF9pbnRlcmZhY2VfLmNvbm5lY3Rpb24ubGUub25fZGlzY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5SGNpRXJyb3JDb2RlKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5SGNpRXJyb3JDb2RlKHJlYXNvbikpOwotICBMT0dfREVCVUcoIkRpc2Nvbm5lY3RlZCBsZSBsaW5rIHJlbW90ZTolcyBoYW5kbGU6JWh1IHJlYXNvbjolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocmVtb3RlX2FkZHJlc3Nfd2l0aF90eXBlKSwgaGFuZGxlLAotICAgICAgICAgICAgRXJyb3JDb2RlVGV4dChyZWFzb24pLmNfc3RyKCkpOwotICBCVE1fTG9nSGlzdG9yeSgKLSAgICAgIGtCdG1Mb2dUYWcsIFRvTGVnYWN5QWRkcmVzc1dpdGhUeXBlKHJlbW90ZV9hZGRyZXNzX3dpdGhfdHlwZSksCi0gICAgICAiRGlzY29ubmVjdGVkIiwKLSAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiTGUgcmVhc29uOiVzIiwgRXJyb3JDb2RlVGV4dChyZWFzb24pLmNfc3RyKCkpKTsKLSAgcGltcGxfLT5jb25uZWN0aW9uX2hpc3RvcnlfLlB1c2goCi0gICAgICBzdGQ6Om1vdmUoc3RkOjptYWtlX3VuaXF1ZTxMZUNvbm5lY3Rpb25EZXNjcmlwdG9yPigKLSAgICAgICAgICByZW1vdGVfYWRkcmVzc193aXRoX3R5cGUsIGNyZWF0aW9uX3RpbWUsIHRlYXJkb3duX3RpbWUsIGhhbmRsZSwKLSAgICAgICAgICBpc19sb2NhbGx5X2luaXRpYXRlZCwgcmVhc29uKSkpOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpPbkNvbm5lY3RTdWNjZXNzKAotICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpDbGFzc2ljQWNsQ29ubmVjdGlvbj4gY29ubmVjdGlvbikgewotICBBU1NFUlQoY29ubmVjdGlvbiAhPSBudWxscHRyKTsKLSAgYXV0byBoYW5kbGUgPSBjb25uZWN0aW9uLT5HZXRIYW5kbGUoKTsKLSAgYm9vbCBsb2NhbGx5X2luaXRpYXRlZCA9IGNvbm5lY3Rpb24tPmxvY2FsbHlfaW5pdGlhdGVkXzsKLSAgY29uc3QgaGNpOjpBZGRyZXNzIHJlbW90ZV9hZGRyZXNzID0gY29ubmVjdGlvbi0+R2V0QWRkcmVzcygpOwotICBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIgPSBUb1Jhd0FkZHJlc3MocmVtb3RlX2FkZHJlc3MpOwotCi0gIHBpbXBsXy0+aGFuZGxlX3RvX2NsYXNzaWNfY29ubmVjdGlvbl9tYXBfLmVtcGxhY2UoCi0gICAgICBoYW5kbGUsIHN0ZDo6bWFrZV91bmlxdWU8Q2xhc3NpY1NoaW1BY2xDb25uZWN0aW9uPigKLSAgICAgICAgICAgICAgICAgIGFjbF9pbnRlcmZhY2VfLm9uX3NlbmRfZGF0YV91cHdhcmRzLAotICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZzaGltOjpsZWdhY3k6OkFjbDo6T25DbGFzc2ljTGlua0Rpc2Nvbm5lY3RlZCwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMiksCi0gICAgICAgICAgICAgICAgICBhY2xfaW50ZXJmYWNlXy5saW5rLmNsYXNzaWMsIGhhbmRsZXJfLCBzdGQ6Om1vdmUoY29ubmVjdGlvbiksCi0gICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSkpOwotICBwaW1wbF8tPmhhbmRsZV90b19jbGFzc2ljX2Nvbm5lY3Rpb25fbWFwX1toYW5kbGVdLT5SZWdpc3RlckNhbGxiYWNrcygpOwotICBwaW1wbF8tPmhhbmRsZV90b19jbGFzc2ljX2Nvbm5lY3Rpb25fbWFwX1toYW5kbGVdCi0gICAgICAtPlJlYWRSZW1vdGVDb250cm9sbGVySW5mb3JtYXRpb24oKTsKLQotICBUUllfUE9TVElOR19PTl9NQUlOKGFjbF9pbnRlcmZhY2VfLmNvbm5lY3Rpb24uY2xhc3NpYy5vbl9jb25uZWN0ZWQsIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBmYWxzZSk7Ci0gIExPR19ERUJVRygiQ29ubmVjdGlvbiBzdWNjZXNzZnVsIGNsYXNzaWMgcmVtb3RlOiVzIGhhbmRsZTolaHUgaW5pdGlhdG9yOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYWRkcmVzcyksIGhhbmRsZSwKLSAgICAgICAgICAgIChsb2NhbGx5X2luaXRpYXRlZCkgPyAibG9jYWwiIDogInJlbW90ZSIpOwotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBUb1Jhd0FkZHJlc3MocmVtb3RlX2FkZHJlc3MpLAotICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBzdWNjZXNzZnVsIiwKLSAgICAgICAgICAgICAgICAgKGxvY2FsbHlfaW5pdGlhdGVkKSA/ICJMb2NhbCBpbml0aWF0ZWQiIDogIlJlbW90ZSBpbml0aWF0ZWQiKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6T25Db25uZWN0RmFpbChoY2k6OkFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpFcnJvckNvZGUgcmVhc29uKSB7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciA9IFRvUmF3QWRkcmVzcyhhZGRyZXNzKTsKLSAgVFJZX1BPU1RJTkdfT05fTUFJTihhY2xfaW50ZXJmYWNlXy5jb25uZWN0aW9uLmNsYXNzaWMub25fZmFpbGVkLCBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5SGNpRXJyb3JDb2RlKHJlYXNvbikpOwotICBMT0dfV0FSTigiQ29ubmVjdGlvbiBmYWlsZWQgY2xhc3NpYyByZW1vdGU6JXMgcmVhc29uOiVzIiwKLSAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGFkZHJlc3MpLCBoY2k6OkVycm9yQ29kZVRleHQocmVhc29uKS5jX3N0cigpKTsKLSAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgVG9SYXdBZGRyZXNzKGFkZHJlc3MpLCAiQ29ubmVjdGlvbiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoImNsYXNzaWMgcmVhc29uOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6RXJyb3JDb2RlVGV4dChyZWFzb24pLmNfc3RyKCkpKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6SEFDS19PbkVzY29Db25uZWN0UmVxdWVzdChoY2k6OkFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpDbGFzc09mRGV2aWNlIGNvZCkgewotICBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIgPSBUb1Jhd0FkZHJlc3MoYWRkcmVzcyk7Ci0gIHR5cGVzOjpDbGFzc09mRGV2aWNlIGxlZ2FjeV9jb2Q7Ci0gIHR5cGVzOjpDbGFzc09mRGV2aWNlOjpGcm9tU3RyaW5nKGNvZC5Ub0xlZ2FjeUNvbmZpZ1N0cmluZygpLCBsZWdhY3lfY29kKTsKLQotICBUUllfUE9TVElOR19PTl9NQUlOKGFjbF9pbnRlcmZhY2VfLmNvbm5lY3Rpb24uc2NvLm9uX2VzY29fY29ubmVjdF9yZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIsIGxlZ2FjeV9jb2QpOwotICBMT0dfREVCVUcoIlJlY2VpdmVkIEVTQ08gY29ubmVjdCByZXF1ZXN0IHJlbW90ZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYWRkcmVzcykpOwotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBUb1Jhd0FkZHJlc3MoYWRkcmVzcyksICJFU0NPIENvbm5lY3Rpb24gcmVxdWVzdCIpOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpIQUNLX09uU2NvQ29ubmVjdFJlcXVlc3QoaGNpOjpBZGRyZXNzIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpDbGFzc09mRGV2aWNlIGNvZCkgewotICBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIgPSBUb1Jhd0FkZHJlc3MoYWRkcmVzcyk7Ci0gIHR5cGVzOjpDbGFzc09mRGV2aWNlIGxlZ2FjeV9jb2Q7Ci0gIHR5cGVzOjpDbGFzc09mRGV2aWNlOjpGcm9tU3RyaW5nKGNvZC5Ub0xlZ2FjeUNvbmZpZ1N0cmluZygpLCBsZWdhY3lfY29kKTsKLQotICBUUllfUE9TVElOR19PTl9NQUlOKGFjbF9pbnRlcmZhY2VfLmNvbm5lY3Rpb24uc2NvLm9uX3Njb19jb25uZWN0X3JlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgYmRfYWRkciwgbGVnYWN5X2NvZCk7Ci0gIExPR19ERUJVRygiUmVjZWl2ZWQgU0NPIGNvbm5lY3QgcmVxdWVzdCByZW1vdGU6JXMiLCBQUklWQVRFX0FERFJFU1MoYWRkcmVzcykpOwotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBUb1Jhd0FkZHJlc3MoYWRkcmVzcyksICJTQ08gQ29ubmVjdGlvbiByZXF1ZXN0Iik7Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6Ok9uTGVDb25uZWN0U3VjY2VzcygKLSAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjphY2xfbWFuYWdlcjo6TGVBY2xDb25uZWN0aW9uPiBjb25uZWN0aW9uKSB7Ci0gIEFTU0VSVChjb25uZWN0aW9uICE9IG51bGxwdHIpOwotICBhdXRvIGhhbmRsZSA9IGNvbm5lY3Rpb24tPkdldEhhbmRsZSgpOwotCi0gIGhjaTo6Um9sZSBjb25uZWN0aW9uX3JvbGUgPSBjb25uZWN0aW9uLT5HZXRSb2xlKCk7Ci0gIGJvb2wgbG9jYWxseV9pbml0aWF0ZWQgPSBjb25uZWN0aW9uLT5sb2NhbGx5X2luaXRpYXRlZF87Ci0KLSAgcGltcGxfLT5oYW5kbGVfdG9fbGVfY29ubmVjdGlvbl9tYXBfLmVtcGxhY2UoCi0gICAgICBoYW5kbGUsIHN0ZDo6bWFrZV91bmlxdWU8TGVTaGltQWNsQ29ubmVjdGlvbj4oCi0gICAgICAgICAgICAgICAgICBhY2xfaW50ZXJmYWNlXy5vbl9zZW5kX2RhdGFfdXB3YXJkcywKLSAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmc2hpbTo6bGVnYWN5OjpBY2w6Ok9uTGVMaW5rRGlzY29ubmVjdGVkLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yKSwKLSAgICAgICAgICAgICAgICAgIGFjbF9pbnRlcmZhY2VfLmxpbmsubGUsIGhhbmRsZXJfLCBzdGQ6Om1vdmUoY29ubmVjdGlvbiksCi0gICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSkpOwotICBwaW1wbF8tPmhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF9baGFuZGxlXS0+UmVnaXN0ZXJDYWxsYmFja3MoKTsKLQotICBwaW1wbF8tPmhhbmRsZV90b19sZV9jb25uZWN0aW9uX21hcF9baGFuZGxlXQotICAgICAgLT5SZWFkUmVtb3RlQ29udHJvbGxlckluZm9ybWF0aW9uKCk7Ci0KLSAgdEJMRV9CRF9BRERSIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZSA9Ci0gICAgICBUb0xlZ2FjeUFkZHJlc3NXaXRoVHlwZShhZGRyZXNzX3dpdGhfdHlwZSk7Ci0KLSAgdWludDE2X3QgY29ubl9pbnRlcnZhbCA9IDM2OyAvKiBUT0RPIERlZmF1bHQgdG8gNDUgbXNlYyovCi0gIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSA9IDA7ICAgLyogVE9ETyBEZWZhdWx0IHRvIHplcm8gZXZlbnRzICovCi0gIHVpbnQxNl90IGNvbm5fdGltZW91dCA9IDUwMDsgLyogVE9ETyBEZWZhdWx0IHRvIDVzICovCi0KLSAgUmF3QWRkcmVzcyBsb2NhbF9ycGEgPSBSYXdBZGRyZXNzOjprRW1wdHk7IC8qIFRPRE8gZW5oYW5jZWQgKi8KLSAgUmF3QWRkcmVzcyBwZWVyX3JwYSA9IFJhd0FkZHJlc3M6OmtFbXB0eTsgIC8qIFRPRE8gZW5oYW5jZWQgKi8KLSAgdWludDhfdCBwZWVyX2FkZHJfdHlwZSA9IDA7ICAgICAgICAgICAgICAgIC8qIFRPRE8gcHVibGljICovCi0KLSAgLy8gT25jZSBhbiBsZSBjb25uZWN0aW9uIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBlc3RhYmxpc2hlZAotICAvLyB0aGUgZGV2aWNlIGFkZHJlc3MgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjb250cm9sbGVyIGFjY2VwdCBsaXN0LgotICBwaW1wbF8tPnNoYWRvd19hY2NlcHRsaXN0Xy5SZW1vdmUoYWRkcmVzc193aXRoX3R5cGUpOwotCi0gIFRSWV9QT1NUSU5HX09OX01BSU4oCi0gICAgICBhY2xfaW50ZXJmYWNlXy5jb25uZWN0aW9uLmxlLm9uX2Nvbm5lY3RlZCwgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgaGFuZGxlLCBUb0xlZ2FjeVJvbGUoY29ubmVjdGlvbl9yb2xlKSwgY29ubl9pbnRlcnZhbCwgY29ubl9sYXRlbmN5LAotICAgICAgY29ubl90aW1lb3V0LCBsb2NhbF9ycGEsIHBlZXJfcnBhLCBwZWVyX2FkZHJfdHlwZSk7Ci0KLSAgTE9HX0RFQlVHKCJDb25uZWN0aW9uIHN1Y2Nlc3NmdWwgbGUgcmVtb3RlOiVzIGhhbmRsZTolaHUgaW5pdGlhdG9yOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhhZGRyZXNzX3dpdGhfdHlwZSksIGhhbmRsZSwKLSAgICAgICAgICAgIChsb2NhbGx5X2luaXRpYXRlZCkgPyAibG9jYWwiIDogInJlbW90ZSIpOwotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBUb0xlZ2FjeUFkZHJlc3NXaXRoVHlwZShhZGRyZXNzX3dpdGhfdHlwZSksCi0gICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHN1Y2Nlc3NmdWwiLCAiTGUiKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6T25MZUNvbm5lY3RGYWlsKGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaTo6RXJyb3JDb2RlIHJlYXNvbikgewotICB0QkxFX0JEX0FERFIgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlID0KLSAgICAgIFRvTGVnYWN5QWRkcmVzc1dpdGhUeXBlKGFkZHJlc3Nfd2l0aF90eXBlKTsKLQotICB1aW50MTZfdCBoYW5kbGUgPSAwOyAgLyogVE9ETyBVbm5lZWRlZCAqLwotICBib29sIGVuaGFuY2VkID0gdHJ1ZTsgLyogVE9ETyBsb2dnaW5nIG1ldHJpY3Mgb25seSAqLwotICB0SENJX1NUQVRVUyBzdGF0dXMgPSBUb0xlZ2FjeUhjaUVycm9yQ29kZShyZWFzb24pOwotCi0gIFRSWV9QT1NUSU5HX09OX01BSU4oYWNsX2ludGVyZmFjZV8uY29ubmVjdGlvbi5sZS5vbl9mYWlsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlLCBoYW5kbGUsIGVuaGFuY2VkLCBzdGF0dXMpOwotICBMT0dfV0FSTigiQ29ubmVjdGlvbiBmYWlsZWQgbGUgcmVtb3RlOiVzIiwKLSAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGFkZHJlc3Nfd2l0aF90eXBlKSk7Ci0gIEJUTV9Mb2dIaXN0b3J5KAotICAgICAga0J0bUxvZ1RhZywgVG9MZWdhY3lBZGRyZXNzV2l0aFR5cGUoYWRkcmVzc193aXRoX3R5cGUpLAotICAgICAgIkNvbm5lY3Rpb24gZmFpbGVkIiwKLSAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigibGUgcmVhc29uOiVzIiwgaGNpOjpFcnJvckNvZGVUZXh0KHJlYXNvbikuY19zdHIoKSkpOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpEaXNjb25uZWN0Q2xhc3NpYyh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbikgewotICBoYW5kbGVyXy0+Q2FsbE9uKHBpbXBsXy5nZXQoKSwgJkFjbDo6aW1wbDo6ZGlzY29ubmVjdF9jbGFzc2ljLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgcmVhc29uKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6RGlzY29ubmVjdExlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKSB7Ci0gIGhhbmRsZXJfLT5DYWxsT24ocGltcGxfLmdldCgpLCAmQWNsOjppbXBsOjpkaXNjb25uZWN0X2xlLCBoYW5kbGUsIHJlYXNvbik7Ci19Ci0KLWJvb2wgc2hpbTo6bGVnYWN5OjpBY2w6OkhvbGRNb2RlKHVpbnQxNl90IGhjaV9oYW5kbGUsIHVpbnQxNl90IG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9pbnRlcnZhbCkgewotICBoYW5kbGVyXy0+Q2FsbE9uKHBpbXBsXy5nZXQoKSwgJkFjbDo6aW1wbDo6SG9sZE1vZGUsIGhjaV9oYW5kbGUsIG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICBtaW5faW50ZXJ2YWwpOwotICByZXR1cm4gZmFsc2U7ICAvLyBUT0RPIHZvaWQKLX0KLQotYm9vbCBzaGltOjpsZWdhY3k6OkFjbDo6U25pZmZNb2RlKHVpbnQxNl90IGhjaV9oYW5kbGUsIHVpbnQxNl90IG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5faW50ZXJ2YWwsIHVpbnQxNl90IGF0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCkgewotICBoYW5kbGVyXy0+Q2FsbE9uKHBpbXBsXy5nZXQoKSwgJkFjbDo6aW1wbDo6U25pZmZNb2RlLCBoY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgIG1heF9pbnRlcnZhbCwgbWluX2ludGVydmFsLCBhdHRlbXB0LCB0aW1lb3V0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIHNoaW06OmxlZ2FjeTo6QWNsOjpFeGl0U25pZmZNb2RlKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgaGFuZGxlcl8tPkNhbGxPbihwaW1wbF8uZ2V0KCksICZBY2w6OmltcGw6OkV4aXRTbmlmZk1vZGUsIGhjaV9oYW5kbGUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgc2hpbTo6bGVnYWN5OjpBY2w6OlNuaWZmU3VicmF0aW5nKHVpbnQxNl90IGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KSB7Ci0gIGhhbmRsZXJfLT5DYWxsT24ocGltcGxfLmdldCgpLCAmQWNsOjppbXBsOjpTbmlmZlN1YnJhdGluZywgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICBtYXhpbXVtX2xhdGVuY3ksIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgbWluaW11bV9sb2NhbF90aW1lb3V0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpEdW1wQ29ubmVjdGlvbkhpc3RvcnkoaW50IGZkKSBjb25zdCB7Ci0gIHBpbXBsXy0+RHVtcENvbm5lY3Rpb25IaXN0b3J5KGZkKTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6U2h1dGRvd24oKSB7Ci0gIGlmIChDaGVja0Zvck9ycGhhbmVkQWNsQ29ubmVjdGlvbnMoKSkgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBzaHV0ZG93bl9wcm9taXNlOwotICAgIGF1dG8gc2h1dGRvd25fZnV0dXJlID0gc2h1dGRvd25fcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlcl8tPkNhbGxPbihwaW1wbF8uZ2V0KCksICZBY2w6OmltcGw6OlNodXRkb3duQ2xhc3NpY0Nvbm5lY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHNodXRkb3duX3Byb21pc2UpKTsKLSAgICBzaHV0ZG93bl9mdXR1cmUud2FpdCgpOwotCi0gICAgc2h1dGRvd25fcHJvbWlzZSA9IHN0ZDo6cHJvbWlzZTx2b2lkPigpOwotCi0gICAgc2h1dGRvd25fZnV0dXJlID0gc2h1dGRvd25fcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gICAgaGFuZGxlcl8tPkNhbGxPbihwaW1wbF8uZ2V0KCksICZBY2w6OmltcGw6OlNodXRkb3duTGVDb25uZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzaHV0ZG93bl9wcm9taXNlKSk7Ci0gICAgc2h1dGRvd25fZnV0dXJlLndhaXQoKTsKLSAgICBMT0dfV0FSTigiRmx1c2hlZCBvcGVuIEFDTCBjb25uZWN0aW9ucyIpOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJBbGwgQUNMIGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBwcmV2aW91c2x5IGNsb3NlZCIpOwotICB9Ci19Ci0KLXZvaWQgc2hpbTo6bGVnYWN5OjpBY2w6OkZpbmFsU2h1dGRvd24oKSB7Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBHZXRBY2xNYW5hZ2VyKCktPlVucmVnaXN0ZXJDYWxsYmFja3ModGhpcywgc3RkOjptb3ZlKHByb21pc2UpKTsKLSAgZnV0dXJlLndhaXQoKTsKLSAgTE9HX0RFQlVHKCJVbnJlZ2lzdGVyZWQgY2xhc3NpYyBjYWxsYmFja3MgZnJvbSBnZCBhY2wgbWFuYWdlciIpOwotCi0gIHByb21pc2UgPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIEdldEFjbE1hbmFnZXIoKS0+VW5yZWdpc3RlckxlQ2FsbGJhY2tzKHRoaXMsIHN0ZDo6bW92ZShwcm9taXNlKSk7Ci0gIGZ1dHVyZS53YWl0KCk7Ci0gIExPR19ERUJVRygiVW5yZWdpc3RlcmVkIGxlIGNhbGxiYWNrcyBmcm9tIGdkIGFjbCBtYW5hZ2VyIik7Ci0KLSAgcHJvbWlzZSA9IHN0ZDo6cHJvbWlzZTx2b2lkPigpOwotICBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgaGFuZGxlcl8tPkNhbGxPbihwaW1wbF8uZ2V0KCksICZBY2w6OmltcGw6OkZpbmFsU2h1dGRvd24sIHN0ZDo6bW92ZShwcm9taXNlKSk7Ci0gIGZ1dHVyZS53YWl0KCk7Ci0gIExPR19JTkZPKCJVbnJlZ2lzdGVyZWQgYW5kIGNsZWFyZWQgYW55IG9ycGhhbmVkIEFDTCBjb25uZWN0aW9ucyIpOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpDbGVhckFjY2VwdExpc3QoKSB7Ci0gIGhhbmRsZXJfLT5DYWxsT24ocGltcGxfLmdldCgpLCAmQWNsOjppbXBsOjpjbGVhcl9hY2NlcHRsaXN0KTsKLX0KLQotdm9pZCBzaGltOjpsZWdhY3k6OkFjbDo6QWRkVG9BZGRyZXNzUmVzb2x1dGlvbigKLSAgICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIHBlZXJfaXJrLAotICAgIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiBsb2NhbF9pcmspIHsKLSAgaGFuZGxlcl8tPkNhbGxPbihwaW1wbF8uZ2V0KCksICZBY2w6OmltcGw6OkFkZFRvQWRkcmVzc1Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGUsIHBlZXJfaXJrLCBsb2NhbF9pcmspOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpSZW1vdmVGcm9tQWRkcmVzc1Jlc29sdXRpb24oCi0gICAgY29uc3QgaGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIGhhbmRsZXJfLT5DYWxsT24ocGltcGxfLmdldCgpLCAmQWNsOjppbXBsOjpSZW1vdmVGcm9tQWRkcmVzc1Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGUpOwotfQotCi12b2lkIHNoaW06OmxlZ2FjeTo6QWNsOjpDbGVhckFkZHJlc3NSZXNvbHV0aW9uKCkgewotICBoYW5kbGVyXy0+Q2FsbE9uKHBpbXBsXy5nZXQoKSwgJkFjbDo6aW1wbDo6Q2xlYXJSZXNvbHZpbmdMaXN0KTsKLX0KZGlmZiAtLWdpdCBhL21haW4vc2hpbS9hY2wuaCBiL21haW4vc2hpbS9hY2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhOWU0MS4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vYWNsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyL2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJnZC9oY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJnZC9oY2kvY2xhc3Nfb2ZfZGV2aWNlLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvaGFuZGxlci5oIgotI2luY2x1ZGUgImdkL3BhY2tldC9yYXdfYnVpbGRlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfbGVnYWN5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9saW5rX2Nvbm5lY3Rpb25faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2xpbmtfcG9saWN5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLW5hbWVzcGFjZSBsZWdhY3kgewotCi1jbGFzcyBBY2wgOiBwdWJsaWMgaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrcywKLSAgICAgICAgICAgIHB1YmxpYyBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3MsCi0gICAgICAgICAgICBwdWJsaWMgTGlua0Nvbm5lY3Rpb25JbnRlcmZhY2UsCi0gICAgICAgICAgICBwdWJsaWMgTGlua1BvbGljeUludGVyZmFjZSB7Ci0gcHVibGljOgotICBBY2wob3M6OkhhbmRsZXIqIGhhbmRsZXIsIGNvbnN0IGFjbF9pbnRlcmZhY2VfdCYgYWNsX2ludGVyZmFjZSwKLSAgICAgIHVpbnQ4X3QgbWF4X2FjY2VwdGxpc3Rfc2l6ZSwgdWludDhfdCBtYXhfYWRkcmVzc19yZXNvbHV0aW9uX3NpemUpOwotICB+QWNsKCk7Ci0KLSAgLy8gaGNpOjphY2xfbWFuYWdlcjo6Q29ubmVjdGlvbkNhbGxiYWNrcwotICB2b2lkIE9uQ29ubmVjdFN1Y2Nlc3MoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8aGNpOjphY2xfbWFuYWdlcjo6Q2xhc3NpY0FjbENvbm5lY3Rpb24+KSBvdmVycmlkZTsKLSAgdm9pZCBPbkNvbm5lY3RGYWlsKGhjaTo6QWRkcmVzcywgaGNpOjpFcnJvckNvZGUgcmVhc29uKSBvdmVycmlkZTsKLQotICB2b2lkIEhBQ0tfT25Fc2NvQ29ubmVjdFJlcXVlc3QoaGNpOjpBZGRyZXNzLCBoY2k6OkNsYXNzT2ZEZXZpY2UpIG92ZXJyaWRlOwotICB2b2lkIEhBQ0tfT25TY29Db25uZWN0UmVxdWVzdChoY2k6OkFkZHJlc3MsIGhjaTo6Q2xhc3NPZkRldmljZSkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBPbkNsYXNzaWNMaW5rRGlzY29ubmVjdGVkKHVpbnQxNl90IGhhbmRsZSwgaGNpOjpFcnJvckNvZGUgcmVhc29uKTsKLQotICAvLyBoY2k6OmFjbF9tYW5hZ2VyOjpMZUNvbm5lY3Rpb25DYWxsYmFja3MKLSAgdm9pZCBPbkxlQ29ubmVjdFN1Y2Nlc3MoCi0gICAgICBoY2k6OkFkZHJlc3NXaXRoVHlwZSwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxoY2k6OmFjbF9tYW5hZ2VyOjpMZUFjbENvbm5lY3Rpb24+KSBvdmVycmlkZTsKLSAgdm9pZCBPbkxlQ29ubmVjdEZhaWwoaGNpOjpBZGRyZXNzV2l0aFR5cGUsIGhjaTo6RXJyb3JDb2RlIHJlYXNvbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25MZUxpbmtEaXNjb25uZWN0ZWQodWludDE2X3QgaGFuZGxlLCBoY2k6OkVycm9yQ29kZSByZWFzb24pOwotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldENvbm5lY3Rpb25Mb2NhbEFkZHJlc3MoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLQotICAvLyBMaW5rQ29ubmVjdGlvbkludGVyZmFjZQotICB2b2lkIENyZWF0ZUNsYXNzaWNDb25uZWN0aW9uKGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcykgb3ZlcnJpZGU7Ci0gIHZvaWQgQ2FuY2VsQ2xhc3NpY0Nvbm5lY3Rpb24oY29uc3QgaGNpOjpBZGRyZXNzJiBhZGRyZXNzKSBvdmVycmlkZTsKLSAgdm9pZCBBY2NlcHRMZUNvbm5lY3Rpb25Gcm9tKGNvbnN0IGhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwcm9taXNlPGJvb2w+IHByb21pc2UpIG92ZXJyaWRlOwotICB2b2lkIElnbm9yZUxlQ29ubmVjdGlvbkZyb20oCi0gICAgICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpIG92ZXJyaWRlOwotICB2b2lkIERpc2Nvbm5lY3RDbGFzc2ljKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uKSBvdmVycmlkZTsKLSAgdm9pZCBEaXNjb25uZWN0TGUodWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIG92ZXJyaWRlOwotCi0gIC8vIEFkZHJlc3MgUmVzb2x1dGlvbiBMaXN0Ci0gIHZvaWQgQWRkVG9BZGRyZXNzUmVzb2x1dGlvbihjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgcGVlcl9pcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgbG9jYWxfaXJrKTsKLSAgdm9pZCBSZW1vdmVGcm9tQWRkcmVzc1Jlc29sdXRpb24oCi0gICAgICBjb25zdCBoY2k6OkFkZHJlc3NXaXRoVHlwZSYgYWRkcmVzc193aXRoX3R5cGUpOwotICB2b2lkIENsZWFyQWRkcmVzc1Jlc29sdXRpb24oKTsKLQotICAvLyBMaW5rUG9saWN5SW50ZXJmYWNlCi0gIGJvb2wgSG9sZE1vZGUodWludDE2X3QgaGNpX2hhbmRsZSwgdWludDE2X3QgbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9pbnRlcnZhbCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU25pZmZNb2RlKHVpbnQxNl90IGhjaV9oYW5kbGUsIHVpbnQxNl90IG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2ludGVydmFsLCB1aW50MTZfdCBhdHRlbXB0LAotICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KSBvdmVycmlkZTsKLSAgYm9vbCBFeGl0U25pZmZNb2RlKHVpbnQxNl90IGhjaV9oYW5kbGUpIG92ZXJyaWRlOwotICBib29sIFNuaWZmU3VicmF0aW5nKHVpbnQxNl90IGhjaV9oYW5kbGUsIHVpbnQxNl90IG1heGltdW1fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBXcml0ZURhdGEodWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6UmF3QnVpbGRlcj4gcGFja2V0KTsKLQotICB2b2lkIER1bXAoaW50IGZkKSBjb25zdDsKLSAgdm9pZCBEdW1wQ29ubmVjdGlvbkhpc3RvcnkoaW50IGZkKSBjb25zdDsKLQotICB2b2lkIFNodXRkb3duKCk7Ci0gIHZvaWQgRmluYWxTaHV0ZG93bigpOwotCi0gIHZvaWQgQ2xlYXJBY2NlcHRMaXN0KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgb25faW5jb21pbmdfYWNsX2NyZWRpdHModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKTsKLSAgdm9pZCB3cml0ZV9kYXRhX3N5bmModWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHBhY2tldDo6UmF3QnVpbGRlcj4gcGFja2V0KTsKLQotIHByaXZhdGU6Ci0gIG9zOjpIYW5kbGVyKiBoYW5kbGVyXzsKLSAgY29uc3QgYWNsX2ludGVyZmFjZV90IGFjbF9pbnRlcmZhY2VfOwotCi0gIGJvb2wgQ2hlY2tGb3JPcnBoYW5lZEFjbENvbm5lY3Rpb25zKCkgY29uc3Q7Ci0KLSAgc3RydWN0IGltcGw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpbXBsPiBwaW1wbF87Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBY2wpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGxlZ2FjeQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9hY2xfYXBpLmNjIGIvbWFpbi9zaGltL2FjbF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjQ3ZmIuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2FjbF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfYXBpLmgiCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAiZ2QvaGNpL2FjbF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGVscGVycy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zdGFjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9DcmVhdGVDbGFzc2ljQ29ubmVjdGlvbigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgewotICBhdXRvIGFkZHJlc3MgPSBUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRBY2woKS0+Q3JlYXRlQ2xhc3NpY0Nvbm5lY3Rpb24oYWRkcmVzcyk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfQ2FuY2VsQ2xhc3NpY0Nvbm5lY3Rpb24oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgYXV0byBhZGRyZXNzID0gVG9HZEFkZHJlc3MocmF3X2FkZHJlc3MpOwotICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QWNsKCktPkNhbmNlbENsYXNzaWNDb25uZWN0aW9uKGFkZHJlc3MpOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6QUNMX0FjY2VwdExlQ29ubmVjdGlvbkZyb20oCi0gICAgY29uc3QgdEJMRV9CRF9BRERSJiBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgaXNfZGlyZWN0KSB7Ci0gIHN0ZDo6cHJvbWlzZTxib29sPiBwcm9taXNlOwotICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QWNsKCktPkFjY2VwdExlQ29ubmVjdGlvbkZyb20oCi0gICAgICBUb0FkZHJlc3NXaXRoVHlwZUZyb21MZWdhY3kobGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlKSwgaXNfZGlyZWN0LAotICAgICAgc3RkOjptb3ZlKHByb21pc2UpKTsKLSAgcmV0dXJuIGZ1dHVyZS5nZXQoKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9JZ25vcmVMZUNvbm5lY3Rpb25Gcm9tKAotICAgIGNvbnN0IHRCTEVfQkRfQUREUiYgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRBY2woKS0+SWdub3JlTGVDb25uZWN0aW9uRnJvbSgKLSAgICAgIFRvQWRkcmVzc1dpdGhUeXBlRnJvbUxlZ2FjeShsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUpKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9Xcml0ZURhdGEodWludDE2X3QgaGFuZGxlLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcGFja2V0ID0gTWFrZVVuaXF1ZVBhY2tldCgKLSAgICAgIHBfYnVmLT5kYXRhICsgcF9idWYtPm9mZnNldCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUsCi0gICAgICBwX2J1Zi0+bGVuIC0gSENJX0RBVEFfUFJFQU1CTEVfU0laRSwgSXNQYWNrZXRGbHVzaGFibGUocF9idWYpKTsKLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEFjbCgpLT5Xcml0ZURhdGEoaGFuZGxlLCBzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIG9zaV9mcmVlKHBfYnVmKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9Db25maWd1cmVMZVByaXZhY3koYm9vbCBpc19sZV9wcml2YWN5X2VuYWJsZWQpIHsKLSAgaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5IGFkZHJlc3NfcG9saWN5ID0KLSAgICAgIGlzX2xlX3ByaXZhY3lfZW5hYmxlZAotICAgICAgICAgID8gaGNpOjpMZUFkZHJlc3NNYW5hZ2VyOjpBZGRyZXNzUG9saWN5OjpVU0VfUkVTT0xWQUJMRV9BRERSRVNTCi0gICAgICAgICAgOiBoY2k6OkxlQWRkcmVzc01hbmFnZXI6OkFkZHJlc3NQb2xpY3k6OlVTRV9QVUJMSUNfQUREUkVTUzsKLSAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgZW1wdHlfYWRkcmVzc193aXRoX3R5cGUoCi0gICAgICBoY2k6OkFkZHJlc3N7fSwgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTKTsKLSAgLyogNyBtaW51dGVzIG1pbmltdW0sIDE1IG1pbnV0ZXMgbWF4aW11bSBmb3IgcmFuZG9tIGFkZHJlc3MgcmVmcmVzaGluZyAqLwotICBhdXRvIG1pbmltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaW51dGVzKDcpOwotICBhdXRvIG1heGltdW1fcm90YXRpb25fdGltZSA9IHN0ZDo6Y2hyb25vOjptaW51dGVzKDE1KTsKLQotICBTdGFjazo6R2V0SW5zdGFuY2UoKQotICAgICAgLT5HZXRTdGFja01hbmFnZXIoKQotICAgICAgLT5HZXRJbnN0YW5jZTxibHVldG9vdGg6OmhjaTo6QWNsTWFuYWdlcj4oKQotICAgICAgLT5TZXRQcml2YWN5UG9saWN5Rm9ySW5pdGlhdG9yQWRkcmVzcygKLSAgICAgICAgICBhZGRyZXNzX3BvbGljeSwgZW1wdHlfYWRkcmVzc193aXRoX3R5cGUsIG1pbmltdW1fcm90YXRpb25fdGltZSwKLSAgICAgICAgICBtYXhpbXVtX3JvdGF0aW9uX3RpbWUpOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QUNMX0Rpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCBib29sIGlzX2NsYXNzaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgcmVhc29uKSB7Ci0gIChpc19jbGFzc2ljKQotICAgICAgPyBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QWNsKCktPkRpc2Nvbm5lY3RDbGFzc2ljKGhhbmRsZSwgcmVhc29uKQotICAgICAgOiBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QWNsKCktPkRpc2Nvbm5lY3RMZShoYW5kbGUsIHJlYXNvbik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfU2h1dGRvd24oKSB7Ci0gIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRBY2woKS0+U2h1dGRvd24oKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9JZ25vcmVBbGxMZUNvbm5lY3Rpb25zKCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEFjbCgpLT5DbGVhckFjY2VwdExpc3QoKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9SZWFkQ29ubmVjdGlvbkFkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2FkZHJfdHlwZSkgewotICBhdXRvIGxvY2FsX2FkZHJlc3MgPQotICAgICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEFjbCgpLT5HZXRDb25uZWN0aW9uTG9jYWxBZGRyZXNzKHBzZXVkb19hZGRyKTsKLSAgY29ubl9hZGRyID0gVG9SYXdBZGRyZXNzKGxvY2FsX2FkZHJlc3MuR2V0QWRkcmVzcygpKTsKLSAgKnBfYWRkcl90eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obG9jYWxfYWRkcmVzcy5HZXRBZGRyZXNzVHlwZSgpKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9BZGRUb0FkZHJlc3NSZXNvbHV0aW9uKAotICAgIGNvbnN0IHRCTEVfQkRfQUREUiYgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlLCBjb25zdCBPY3RldDE2JiBwZWVyX2lyaywKLSAgICBjb25zdCBPY3RldDE2JiBsb2NhbF9pcmspIHsKLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEFjbCgpLT5BZGRUb0FkZHJlc3NSZXNvbHV0aW9uKAotICAgICAgVG9BZGRyZXNzV2l0aFR5cGUobGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlKSwKLSAgICAgIHBlZXJfaXJrLCBsb2NhbF9pcmspOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QUNMX1JlbW92ZUZyb21BZGRyZXNzUmVzb2x1dGlvbigKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZSkgewotICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QWNsKCktPlJlbW92ZUZyb21BZGRyZXNzUmVzb2x1dGlvbihUb0FkZHJlc3NXaXRoVHlwZSgKLSAgICAgIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEsIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlKSk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfQ2xlYXJBZGRyZXNzUmVzb2x1dGlvbigpIHsKLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEFjbCgpLT5DbGVhckFkZHJlc3NSZXNvbHV0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9tYWluL3NoaW0vYWNsX2FwaS5oIGIvbWFpbi9zaGltL2FjbF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5ZjNmNC4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vYWNsX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci0KLXZvaWQgQUNMX0NyZWF0ZUNsYXNzaWNDb25uZWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKTsKLXZvaWQgQUNMX0NhbmNlbENsYXNzaWNDb25uZWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKTsKLWJvb2wgQUNMX0FjY2VwdExlQ29ubmVjdGlvbkZyb20oY29uc3QgdEJMRV9CRF9BRERSJiBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0KTsKLXZvaWQgQUNMX0lnbm9yZUxlQ29ubmVjdGlvbkZyb20oY29uc3QgdEJMRV9CRF9BRERSJiBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUpOwotCi12b2lkIEFDTF9EaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpc19jbGFzc2ljLCB0SENJX1NUQVRVUyByZWFzb24pOwotdm9pZCBBQ0xfV3JpdGVEYXRhKHVpbnQxNl90IGhhbmRsZSwgQlRfSERSKiBwX2J1Zik7Ci12b2lkIEFDTF9Db25maWd1cmVMZVByaXZhY3koYm9vbCBpc19sZV9wcml2YWN5X2VuYWJsZWQpOwotdm9pZCBBQ0xfU2h1dGRvd24oKTsKLXZvaWQgQUNMX0lnbm9yZUFsbExlQ29ubmVjdGlvbnMoKTsKLQotdm9pZCBBQ0xfUmVhZENvbm5lY3Rpb25BZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwgdWludDhfdCogcF9hZGRyX3R5cGUpOwotCi12b2lkIEFDTF9BZGRUb0FkZHJlc3NSZXNvbHV0aW9uKGNvbnN0IHRCTEVfQkRfQUREUiYgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBwZWVyX2lyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgbG9jYWxfaXJrKTsKLXZvaWQgQUNMX1JlbW92ZUZyb21BZGRyZXNzUmVzb2x1dGlvbigKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZSk7Ci12b2lkIEFDTF9DbGVhckFkZHJlc3NSZXNvbHV0aW9uKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vYWNsX2xlZ2FjeV9pbnRlcmZhY2UuY2MgYi9tYWluL3NoaW0vYWNsX2xlZ2FjeV9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTMyMjguLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2FjbF9sZWdhY3lfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfbGVnYWN5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYmxlX2FjbF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3Njb19oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NlY19oY2lfbGlua19pbnRlcmZhY2UuaCIKLQotc3RydWN0IHRCVE1fRVNDT19EQVRBOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLW5hbWVzcGFjZSBsZWdhY3kgewotCi1jb25zdCBhY2xfaW50ZXJmYWNlX3QgR2V0QWNsSW50ZXJmYWNlKCkgewotICBhY2xfaW50ZXJmYWNlX3QgYWNsX2ludGVyZmFjZXsKLSAgICAgIC5vbl9zZW5kX2RhdGFfdXB3YXJkcyA9IGFjbF9yY3ZfYWNsX2RhdGEsCi0gICAgICAub25fcGFja2V0c19jb21wbGV0ZWQgPSBhY2xfcGFja2V0c19jb21wbGV0ZWQsCi0KLSAgICAgIC5jb25uZWN0aW9uLmNsYXNzaWMub25fY29ubmVjdGVkID0gb25fYWNsX2JyX2Vkcl9jb25uZWN0ZWQsCi0gICAgICAuY29ubmVjdGlvbi5jbGFzc2ljLm9uX2ZhaWxlZCA9IG9uX2FjbF9icl9lZHJfZmFpbGVkLAotICAgICAgLmNvbm5lY3Rpb24uY2xhc3NpYy5vbl9kaXNjb25uZWN0ZWQgPSBidG1fYWNsX2Rpc2Nvbm5lY3RlZCwKLQotICAgICAgLmNvbm5lY3Rpb24ubGUub25fY29ubmVjdGVkID0KLSAgICAgICAgICBhY2xfYmxlX2VuaGFuY2VkX2Nvbm5lY3Rpb25fY29tcGxldGVfZnJvbV9zaGltLAotICAgICAgLmNvbm5lY3Rpb24ubGUub25fZmFpbGVkID0gYWNsX2JsZV9jb25uZWN0aW9uX2ZhaWwsCi0gICAgICAuY29ubmVjdGlvbi5sZS5vbl9kaXNjb25uZWN0ZWQgPSBidG1fYWNsX2Rpc2Nvbm5lY3RlZCwKLSAgICAgIC5jb25uZWN0aW9uLmxlLm9uX2lzb19kaXNjb25uZWN0ZWQgPSBidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQsCi0KLSAgICAgIC5jb25uZWN0aW9uLnNjby5vbl9lc2NvX2Nvbm5lY3RfcmVxdWVzdCA9IGJ0bV9zY29fb25fZXNjb19jb25uZWN0X3JlcXVlc3QsCi0gICAgICAuY29ubmVjdGlvbi5zY28ub25fc2NvX2Nvbm5lY3RfcmVxdWVzdCA9IGJ0bV9zY29fb25fc2NvX2Nvbm5lY3RfcmVxdWVzdCwKLSAgICAgIC5jb25uZWN0aW9uLnNjby5vbl9kaXNjb25uZWN0ZWQgPSBidG1fc2NvX29uX2Rpc2Nvbm5lY3RlZCwKLQotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZSA9IGJ0bV9zZWNfYXV0aF9jb21wbGV0ZSwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fY2VudHJhbF9saW5rX2tleV9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX2NoYW5nZV9jb25uZWN0aW9uX2xpbmtfa2V5X2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fZW5jcnlwdGlvbl9jaGFuZ2UgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9mbG93X3NwZWNpZmljYXRpb25fY29tcGxldGUgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9mbHVzaF9vY2N1cnJlZCA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX21vZGVfY2hhbmdlID0gYnRtX3BtX29uX21vZGVfY2hhbmdlLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9wYWNrZXRfdHlwZV9jaGFuZ2VkID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcW9zX3NldHVwX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9hZmhfY2hhbm5lbF9tYXBfY29tcGxldGUgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fc25pZmZfc3VicmF0aW5nID0gYnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZywKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9jbG9ja19jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfY2xvY2tfb2Zmc2V0X2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9saW5rX3BvbGljeV9zZXR0aW5nc19jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfbGlua19xdWFsaXR5X2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXRfY29tcGxldGUgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uX2NvbXBsZXRlID0KLSAgICAgICAgICBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZSwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9yZW1vdGVfc3VwcG9ydGVkX2ZlYXR1cmVzX2NvbXBsZXRlID0KLSAgICAgICAgICBhY2xfcHJvY2Vzc19zdXBwb3J0ZWRfZmVhdHVyZXMsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfcmVtb3RlX2V4dGVuZGVkX2ZlYXR1cmVzX2NvbXBsZXRlID0KLSAgICAgICAgICBhY2xfcHJvY2Vzc19leHRlbmRlZF9mZWF0dXJlcywKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9yc3NpX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF90cmFuc21pdF9wb3dlcl9sZXZlbF9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JvbGVfY2hhbmdlID0gYnRtX2FjbF9yb2xlX2NoYW5nZWQsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JvbGVfZGlzY292ZXJ5X2NvbXBsZXRlID0gbnVsbHB0ciwKLQotICAgICAgLmxpbmsubGUub25fY29ubmVjdGlvbl91cGRhdGUgPSBhY2xfYmxlX3VwZGF0ZV9ldmVudF9yZWNlaXZlZCwKLSAgICAgIC5saW5rLmxlLm9uX2RhdGFfbGVuZ3RoX2NoYW5nZSA9IG51bGxwdHIsCi0gICAgICAubGluay5sZS5vbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uX2NvbXBsZXRlID0KLSAgICAgICAgICBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZSwKLSAgfTsKLSAgcmV0dXJuIGFjbF9pbnRlcmZhY2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBsZWdhY3kKLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vYWNsX2xlZ2FjeV9pbnRlcmZhY2UuaCBiL21haW4vc2hpbS9hY2xfbGVnYWN5X2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZiMDBlLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9hY2xfbGVnYWN5X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9tb2RlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLW5hbWVzcGFjZSBsZWdhY3kgewotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKCpvbl9jb25uZWN0ZWQpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuY19tb2RlKTsKLSAgdm9pZCAoKm9uX2ZhaWxlZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0SENJX1NUQVRVUyBzdGF0dXMpOwotICB2b2lkICgqb25fZGlzY29ubmVjdGVkKSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgcmVhc29uKTsKLX0gYWNsX2NsYXNzaWNfY29ubmVjdGlvbl9pbnRlcmZhY2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2b2lkICgqb25fY29ubmVjdGVkKShjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSByb2xlLCB1aW50MTZfdCBjb25uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IGNvbm5fdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX3JwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwZWVyX2FkZHJfdHlwZSk7Ci0gIHZvaWQgKCpvbl9mYWlsZWQpKGNvbnN0IHRCTEVfQkRfQUREUiYgYWRkcmVzc193aXRoX3R5cGUsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmhhbmNlZCwgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLSAgdm9pZCAoKm9uX2Rpc2Nvbm5lY3RlZCkodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHJlYXNvbik7Ci0gIHZvaWQgKCpvbl9pc29fZGlzY29ubmVjdGVkKSh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbik7Ci19IGFjbF9sZV9jb25uZWN0aW9uX2ludGVyZmFjZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKCpvbl9lc2NvX2Nvbm5lY3RfcmVxdWVzdCkoY29uc3QgUmF3QWRkcmVzcyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZXM6OkNsYXNzT2ZEZXZpY2UmKTsKLSAgdm9pZCAoKm9uX3Njb19jb25uZWN0X3JlcXVlc3QpKGNvbnN0IFJhd0FkZHJlc3MmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZXM6OkNsYXNzT2ZEZXZpY2UmKTsKLSAgdm9pZCAoKm9uX2Rpc2Nvbm5lY3RlZCkodWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pOwotfSBhY2xfc2NvX2Nvbm5lY3Rpb25faW50ZXJmYWNlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAoKm9uX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlKSh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci0gIHZvaWQgKCpvbl9jaGFuZ2VfY29ubmVjdGlvbl9saW5rX2tleV9jb21wbGV0ZSkoKTsKLSAgdm9pZCAoKm9uX2VuY3J5cHRpb25fY2hhbmdlKShib29sIGVuYWJsZWQpOwotICB2b2lkICgqb25fZmxvd19zcGVjaWZpY2F0aW9uX2NvbXBsZXRlKSh1aW50MTZfdCBmbG93X2RpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjY2Vzc19sYXRlbmN5KTsKLSAgdm9pZCAoKm9uX2ZsdXNoX29jY3VycmVkKSgpOwotICB2b2lkICgqb25fY2VudHJhbF9saW5rX2tleV9jb21wbGV0ZSkodWludDhfdCBrZXlfZmxhZyk7Ci0gIHZvaWQgKCpvbl9tb2RlX2NoYW5nZSkodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGN1cnJlbnRfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpOwotICB2b2lkICgqb25fc25pZmZfc3VicmF0aW5nKSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KTsKLSAgdm9pZCAoKm9uX3BhY2tldF90eXBlX2NoYW5nZWQpKHVpbnQxNl90IHBhY2tldF90eXBlKTsKLSAgdm9pZCAoKm9uX3Fvc19zZXR1cF9jb21wbGV0ZSkodWludDE2X3Qgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKTsKLSAgdm9pZCAoKm9uX3JlYWRfYWZoX2NoYW5uZWxfbWFwX2NvbXBsZXRlKSh1aW50OF90IGFmaF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWZoX2NoYW5uZWxfbWFwW10pOwotICB2b2lkICgqb25fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZSkodWludDE2X3QgZmx1c2hfdGltZW91dCk7Ci0gIHZvaWQgKCpvbl9yZWFkX2Nsb2NrX2NvbXBsZXRlKSh1aW50MzJfdCBjbG9jaywgdWludDE2X3QgYWNjdXJhY3kpOwotICB2b2lkICgqb25fcmVhZF9jbG9ja19vZmZzZXRfY29tcGxldGUpKHVpbnQxNl90IGNsb2NrX29mZnNldCk7Ci0gIHZvaWQgKCpvbl9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUpKAotICAgICAgdWludDE2X3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcik7Ci0gIHZvaWQgKCpvbl9yZWFkX2xpbmtfcG9saWN5X3NldHRpbmdzX2NvbXBsZXRlKSh1aW50MTZfdCBsaW5rX3BvbGljeV9zZXR0aW5ncyk7Ci0gIHZvaWQgKCpvbl9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSkodWludDhfdCBsaW5rX3F1YWxpdHkpOwotICB2b2lkICgqb25fcmVhZF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXRfY29tcGxldGUpKAotICAgICAgdWludDE2X3QgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KTsKLSAgdm9pZCAoKm9uX3JlYWRfcmVtb3RlX3N1cHBvcnRlZF9mZWF0dXJlc19jb21wbGV0ZSkodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmZWF0dXJlcyk7Ci0gIHZvaWQgKCpvbl9yZWFkX3JlbW90ZV9leHRlbmRlZF9mZWF0dXJlc19jb21wbGV0ZSkodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY3VycmVudF9wYWdlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9wYWdlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmZWF0dXJlcyk7Ci0gIHZvaWQgKCpvbl9yZWFkX3JlbW90ZV92ZXJzaW9uX2luZm9ybWF0aW9uX2NvbXBsZXRlKSgKLSAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsIHVpbnQxNl90IHN1Yl92ZXJzaW9uKTsKLSAgdm9pZCAoKm9uX3JlYWRfcnNzaV9jb21wbGV0ZSkodWludDhfdCByc3NpKTsKLSAgdm9pZCAoKm9uX3JlYWRfdHJhbnNtaXRfcG93ZXJfbGV2ZWxfY29tcGxldGUpKHVpbnQ4X3QgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpOwotICB2b2lkICgqb25fcm9sZV9jaGFuZ2UpKHRIQ0lfU1RBVFVTIHN0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbmV3X3JvbGUpOwotICB2b2lkICgqb25fcm9sZV9kaXNjb3ZlcnlfY29tcGxldGUpKHRIQ0lfUk9MRSBjdXJyZW50X3JvbGUpOwotfSBhY2xfY2xhc3NpY19saW5rX2ludGVyZmFjZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKCpvbl9jb25uZWN0aW9uX3VwZGF0ZSkodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCk7Ci0gIHZvaWQgKCpvbl9kYXRhX2xlbmd0aF9jaGFuZ2UpKHVpbnQxNl90IHR4X29jdGV0cywgdWludDE2X3QgdHhfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgcnhfb2N0ZXRzLCB1aW50MTZfdCByeF90aW1lKTsKLSAgdm9pZCAoKm9uX3JlYWRfcmVtb3RlX3ZlcnNpb25faW5mb3JtYXRpb25fY29tcGxldGUpKAotICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sCi0gICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwgdWludDE2X3Qgc3ViX3ZlcnNpb24pOwotICB2b2lkICgqb25fcGh5X3VwZGF0ZSkodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgdHhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByeF9waHkpOwotfSBhY2xfbGVfbGlua19pbnRlcmZhY2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBhY2xfY2xhc3NpY19jb25uZWN0aW9uX2ludGVyZmFjZV90IGNsYXNzaWM7Ci0gIGFjbF9sZV9jb25uZWN0aW9uX2ludGVyZmFjZV90IGxlOwotICBhY2xfc2NvX2Nvbm5lY3Rpb25faW50ZXJmYWNlX3Qgc2NvOwotfSBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBhY2xfY2xhc3NpY19saW5rX2ludGVyZmFjZV90IGNsYXNzaWM7Ci0gIGFjbF9sZV9saW5rX2ludGVyZmFjZV90IGxlOwotfSBhY2xfbGlua19pbnRlcmZhY2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2b2lkICgqb25fc2VuZF9kYXRhX3Vwd2FyZHMpKEJUX0hEUiopOwotICB2b2lkICgqb25fcGFja2V0c19jb21wbGV0ZWQpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX3BhY2tldHMpOwotICBhY2xfY29ubmVjdGlvbl9pbnRlcmZhY2VfdCBjb25uZWN0aW9uOwotICBhY2xfbGlua19pbnRlcmZhY2VfdCBsaW5rOwotfSBhY2xfaW50ZXJmYWNlX3Q7Ci0KLWNvbnN0IGFjbF9pbnRlcmZhY2VfdCBHZXRBY2xJbnRlcmZhY2UoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGxlZ2FjeQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYyBiL21haW4vc2hpbS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1MTIxYi4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vYWN0aXZpdHlfYXR0cmlidXRpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NoaW1fYWN0aXZpdHlfYXR0cmlidXRpb24iCi0jaW5jbHVkZSAiYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImdkL2J0YWEvYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJoZWxwZXJzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2VudHJ5LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotY2xhc3MgQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZUltcGwKLSAgICA6IHB1YmxpYyBBY3Rpdml0eUF0dHJpYnV0aW9uSW50ZXJmYWNlLAotICAgICAgcHVibGljIGJsdWV0b290aDo6YWN0aXZpdHlfYXR0cmlidXRpb246OkFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFjayB7Ci0gcHVibGljOgotICB+QWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIEFjdGl2aXR5QXR0cmlidXRpb25JbnRlcmZhY2VJbXBsKiBHZXRJbnN0YW5jZSgpIHsKLSAgICBzdGF0aWMgQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZUltcGwqIGluc3RhbmNlID0KLSAgICAgICAgbmV3IEFjdGl2aXR5QXR0cmlidXRpb25JbnRlcmZhY2VJbXBsKCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgdm9pZCBJbml0KCkgb3ZlcnJpZGUgewotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0QWN0aXZpdHlBdHRyaWJ1dGlvbigpCi0gICAgICAgIC0+UmVnaXN0ZXJBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2sodGhpcyk7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyQ2FsbGJhY2tzKEFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFja3MqIGNhbGxiYWNrcykgb3ZlcnJpZGUgewotICAgIHRoaXMtPmNhbGxiYWNrcyA9IGNhbGxiYWNrczsKLSAgfQotCi0gIHZvaWQgQ2xlYW51cCh2b2lkKSBvdmVycmlkZXt9OwotCi0gIHZvaWQgT25XYWtldXAoY29uc3QgQWN0aXZpdHkgYWN0aXZpdHksCi0gICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmIGFkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFja3M6Ok9uV2FrZXVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChjYWxsYmFja3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFja3M6OkFjdGl2aXR5KWFjdGl2aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoYWRkcmVzcykpKTsKLSAgfQotCi0gIHZvaWQgT25BY3Rpdml0eUxvZ3NSZWFkeSgKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJ0YWFBZ2dyZWdhdGlvbkVudHJ5PiBsb2dzKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp2ZWN0b3I8QWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrczo6QnRhYUFnZ3JlZ2F0aW9uRW50cnk+Ci0gICAgICAgIGNhbGxiYWNrX2xvZ3M7Ci0gICAgZm9yIChhdXRvJiBpdCA6IGxvZ3MpIHsKLSAgICAgIEFjdGl2aXR5QXR0cmlidXRpb25DYWxsYmFja3M6OkJ0YWFBZ2dyZWdhdGlvbkVudHJ5IGVudHJ5ewotICAgICAgICAgIGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKGl0LmFkZHJlc3MpLAotICAgICAgICAgIChBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2tzOjpBY3Rpdml0eSlpdC5hY3Rpdml0eSwgaXQud2FrZXVwX2NvdW50LAotICAgICAgICAgIGl0LmJ5dGVfY291bnQsIGl0Lndha2Vsb2NrX2R1cmF0aW9uX21zfTsKLSAgICAgIGNhbGxiYWNrX2xvZ3MucHVzaF9iYWNrKGVudHJ5KTsKLSAgICB9Ci0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZBY3Rpdml0eUF0dHJpYnV0aW9uQ2FsbGJhY2tzOjpPbkFjdGl2aXR5TG9nc1JlYWR5LAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoY2FsbGJhY2tzKSwgY2FsbGJhY2tfbG9ncykpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY29uc3RydWN0aW9uLgotICBBY3Rpdml0eUF0dHJpYnV0aW9uSW50ZXJmYWNlSW1wbCgpIHt9Ci0KLSAgQWN0aXZpdHlBdHRyaWJ1dGlvbkNhbGxiYWNrcyogY2FsbGJhY2tzOwotfTsKLQotQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZSoKLWJsdWV0b290aDo6c2hpbTo6Z2V0X2FjdGl2aXR5X2F0dHJpYnV0aW9uX2luc3RhbmNlKCkgewotICByZXR1cm4gQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZUltcGw6OkdldEluc3RhbmNlKCk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjppbml0X2FjdGl2aXR5X2F0dHJpYnV0aW9uKCkgewotICBibHVldG9vdGg6OnNoaW06OmdldF9hY3Rpdml0eV9hdHRyaWJ1dGlvbl9pbnN0YW5jZSgpLT5Jbml0KCk7Ci19CmRpZmYgLS1naXQgYS9tYWluL3NoaW0vYWN0aXZpdHlfYXR0cmlidXRpb24uaCBiL21haW4vc2hpbS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQ4MDk5Li4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHZCBzaGltIGxheWVyIHRvIGFjdGl2aXR5IGF0dHJpYnV0aW9uCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9idF9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjphY3Rpdml0eV9hdHRyaWJ1dGlvbjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci0KLUFjdGl2aXR5QXR0cmlidXRpb25JbnRlcmZhY2UqIGdldF9hY3Rpdml0eV9hdHRyaWJ1dGlvbl9pbnN0YW5jZSgpOwotCi12b2lkIGluaXRfYWN0aXZpdHlfYXR0cmlidXRpb24oKTsKLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9idG0uY2MgYi9tYWluL3NoaW0vYnRtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWZmN2Q1Li4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9idG0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9zaGltX2J0bSIKLQotI2luY2x1ZGUgIm1haW4vc2hpbS9idG0uaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL2Nvbm5lY3RhYmlsaXR5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvaW5xdWlyeS5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL25hbWUuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9wYWdlLmgiCi0jaW5jbHVkZSAiZ2Qvc2VjdXJpdHkvc2VjdXJpdHlfbW9kdWxlLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGVscGVycy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLXN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtSZW1vdGVEZXZpY2VOYW1lTGVuZ3RoID0gMjQ4OwotCi1zdGF0aWMgY29uc3RleHByIGJvb2wga0FjdGl2ZVNjYW5uaW5nID0gdHJ1ZTsKLXN0YXRpYyBjb25zdGV4cHIgYm9vbCBrUGFzc2l2ZVNjYW5uaW5nID0gZmFsc2U7Ci0KLXVzaW5nIEJ0bVJlbW90ZURldmljZU5hbWUgPSB0QlRNX1JFTU9URV9ERVZfTkFNRTsKLQotZXh0ZXJuIHZvaWQgYnRtX3Byb2Nlc3NfY2FuY2VsX2NvbXBsZXRlKHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IG1vZGUpOwotZXh0ZXJuIHZvaWQgYnRtX3Byb2Nlc3NfaW5xX2NvbXBsZXRlKHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IHJlc3VsdF90eXBlKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcHJvY2Vzc19hZHZfYWRkcihSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogYWRkcmVzc190eXBlKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0X2NvbnQoCi0gICAgdWludDE2X3QgZXZlbnRfdHlwZSwgdWludDhfdCBhZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgIHVpbnQ4X3QgcHJpbWFyeV9waHksIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsCi0gICAgaW50OF90IHR4X3Bvd2VyLCBpbnQ4X3QgcnNzaSwgdWludDE2X3QgcGVyaW9kaWNfYWR2X2ludCwgdWludDhfdCBkYXRhX2xlbiwKLSAgICB1aW50OF90KiBkYXRhKTsKLQotZXh0ZXJuIHZvaWQgYnRtX2FwaV9wcm9jZXNzX2lucXVpcnlfcmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZpY2VfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2xvY2tfb2Zmc2V0KTsKLQotZXh0ZXJuIHZvaWQgYnRtX2FwaV9wcm9jZXNzX2lucXVpcnlfcmVzdWx0X3dpdGhfcnNzaShSYXdBZGRyZXNzIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWX0NMQVNTIGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2xvY2tfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnNzaSk7Ci0KLWV4dGVybiB2b2lkIGJ0bV9hcGlfcHJvY2Vzc19leHRlbmRlZF9pbnF1aXJ5X3Jlc3VsdCgKLSAgICBSYXdBZGRyZXNzIHJhd19hZGRyZXNzLCB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwgREVWX0NMQVNTIGRldmljZV9jbGFzcywKLSAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQsIGludDhfdCByc3NpLCBjb25zdCB1aW50OF90KiBlaXJfZGF0YSwKLSAgICBzaXplX3QgZWlyX2xlbik7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2Ugc2hpbSB7Ci0KLWJvb2wgQnRtOjpSZWFkUmVtb3RlTmFtZTo6U3RhcnQoUmF3QWRkcmVzcyByYXdfYWRkcmVzcykgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgaWYgKGluX3Byb2dyZXNzXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByYXdfYWRkcmVzc18gPSByYXdfYWRkcmVzczsKLSAgaW5fcHJvZ3Jlc3NfID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQnRtOjpSZWFkUmVtb3RlTmFtZTo6U3RvcCgpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHJhd19hZGRyZXNzXyA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgaW5fcHJvZ3Jlc3NfID0gZmFsc2U7Ci19Ci0KLWJvb2wgQnRtOjpSZWFkUmVtb3RlTmFtZTo6SXNJblByb2dyZXNzKCkgY29uc3QgeyByZXR1cm4gaW5fcHJvZ3Jlc3NfOyB9Ci1zdGQ6OnN0cmluZyBCdG06OlJlYWRSZW1vdGVOYW1lOjpBZGRyZXNzU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gcmF3X2FkZHJlc3NfLlRvU3RyaW5nKCk7Ci19Ci0KLXZvaWQgQnRtOjpTY2FubmluZ0NhbGxiYWNrczo6T25TY2FubmVyUmVnaXN0ZXJlZCgKLSAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6VXVpZCBhcHBfdXVpZCwgYmx1ZXRvb3RoOjpoY2k6OlNjYW5uZXJJZCBzY2FubmVyX2lkLAotICAgIFNjYW5uaW5nU3RhdHVzIHN0YXR1cyl7fTsKLQotdm9pZCBCdG06OlNjYW5uaW5nQ2FsbGJhY2tzOjpPblNldFNjYW5uZXJQYXJhbWV0ZXJDb21wbGV0ZSgKLSAgICBibHVldG9vdGg6OmhjaTo6U2Nhbm5lcklkIHNjYW5uZXJfaWQsIFNjYW5uaW5nU3RhdHVzIHN0YXR1cyl7fTsKLQotdm9pZCBCdG06OlNjYW5uaW5nQ2FsbGJhY2tzOjpPblNjYW5SZXN1bHQoCi0gICAgdWludDE2X3QgZXZlbnRfdHlwZSwgdWludDhfdCBhZGRyZXNzX3R5cGUsIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIGFkZHJlc3MsCi0gICAgdWludDhfdCBwcmltYXJ5X3BoeSwgdWludDhfdCBzZWNvbmRhcnlfcGh5LCB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwKLSAgICBpbnQ4X3QgdHhfcG93ZXIsIGludDhfdCByc3NpLCB1aW50MTZfdCBwZXJpb2RpY19hZHZlcnRpc2luZ19pbnRlcnZhbCwKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2luZ19kYXRhKSB7Ci0gIHRCTEVfQUREUl9UWVBFIGJsZV9hZGRyZXNzX3R5cGUgPSBzdGF0aWNfY2FzdDx0QkxFX0FERFJfVFlQRT4oYWRkcmVzc190eXBlKTsKLSAgdWludDE2X3QgZXh0ZW5kZWRfZXZlbnRfdHlwZSA9IDA7Ci0KLSAgUmF3QWRkcmVzcyByYXdfYWRkcmVzczsKLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyhhZGRyZXNzLlRvU3RyaW5nKCksIHJhd19hZGRyZXNzKTsKLQotICBpZiAoYmxlX2FkZHJlc3NfdHlwZSAhPSBCTEVfQUREUl9BTk9OWU1PVVMpIHsKLSAgICBidG1fYmxlX3Byb2Nlc3NfYWR2X2FkZHIocmF3X2FkZHJlc3MsICZibGVfYWRkcmVzc190eXBlKTsKLSAgfQotCi0gIGJ0bV9ibGVfcHJvY2Vzc19hZHZfYWRkcihyYXdfYWRkcmVzcywgJmJsZV9hZGRyZXNzX3R5cGUpOwotICBidG1fYmxlX3Byb2Nlc3NfYWR2X3BrdF9jb250KGV4dGVuZGVkX2V2ZW50X3R5cGUsIGJsZV9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2FkZHJlc3MsIHByaW1hcnlfcGh5LCBzZWNvbmRhcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX3NpZCwgdHhfcG93ZXIsIHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YS5zaXplKCksICZhZHZlcnRpc2luZ19kYXRhWzBdKTsKLX0KLQotdm9pZCBCdG06OlNjYW5uaW5nQ2FsbGJhY2tzOjpPblRyYWNrQWR2Rm91bmRMb3N0KAotICAgIGJsdWV0b290aDo6aGNpOjpBZHZlcnRpc2luZ0ZpbHRlck9uRm91bmRPbkxvc3RJbmZvIG9uX2ZvdW5kX29uX2xvc3RfaW5mbyl7fTsKLXZvaWQgQnRtOjpTY2FubmluZ0NhbGxiYWNrczo6T25CYXRjaFNjYW5SZXBvcnRzKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVwb3J0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpe307Ci0KLXZvaWQgQnRtOjpTY2FubmluZ0NhbGxiYWNrczo6T25CYXRjaFNjYW5UaHJlc2hvbGRDcm9zc2VkKGludCBjbGllbnRfaWYpe307Ci12b2lkIEJ0bTo6U2Nhbm5pbmdDYWxsYmFja3M6Ok9uVGltZW91dCgpe307Ci12b2lkIEJ0bTo6U2Nhbm5pbmdDYWxsYmFja3M6Ok9uRmlsdGVyRW5hYmxlKGJsdWV0b290aDo6aGNpOjpFbmFibGUgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cyl7fTsKLXZvaWQgQnRtOjpTY2FubmluZ0NhbGxiYWNrczo6T25GaWx0ZXJQYXJhbVNldHVwKAotICAgIHVpbnQ4X3QgYXZhaWxhYmxlX3NwYWNlcywgYmx1ZXRvb3RoOjpoY2k6OkFwY2ZBY3Rpb24gYWN0aW9uLAotICAgIHVpbnQ4X3Qgc3RhdHVzKXt9Owotdm9pZCBCdG06OlNjYW5uaW5nQ2FsbGJhY2tzOjpPbkZpbHRlckNvbmZpZ0NhbGxiYWNrKAotICAgIGJsdWV0b290aDo6aGNpOjpBcGNmRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgdWludDhfdCBhdmFpbGFibGVfc3BhY2VzLAotICAgIGJsdWV0b290aDo6aGNpOjpBcGNmQWN0aW9uIGFjdGlvbiwgdWludDhfdCBzdGF0dXMpe307Ci0KLUJ0bTo6QnRtKG9zOjpIYW5kbGVyKiBoYW5kbGVyLCBuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZSogaW5xdWlyeSkKLSAgICA6IHNjYW5uaW5nX3RpbWVyXyhoYW5kbGVyKSwgb2JzZXJ2aW5nX3RpbWVyXyhoYW5kbGVyKSB7Ci0gIEFTU0VSVChoYW5kbGVyICE9IG51bGxwdHIpOwotICBBU1NFUlQoaW5xdWlyeSAhPSBudWxscHRyKTsKLSAgYmx1ZXRvb3RoOjpuZWlnaGJvcjo6SW5xdWlyeUNhbGxiYWNrcyBpbnF1aXJ5X2NhbGxiYWNrcyA9IHsKLSAgICAgIC5yZXN1bHQgPSBzdGQ6OmJpbmQoJkJ0bTo6T25JbnF1aXJ5UmVzdWx0LCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgLnJlc3VsdF93aXRoX3Jzc2kgPQotICAgICAgICAgIHN0ZDo6YmluZCgmQnRtOjpPbklucXVpcnlSZXN1bHRXaXRoUnNzaSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKLSAgICAgIC5leHRlbmRlZF9yZXN1bHQgPQotICAgICAgICAgIHN0ZDo6YmluZCgmQnRtOjpPbkV4dGVuZGVkSW5xdWlyeVJlc3VsdCwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKLSAgICAgIC5jb21wbGV0ZSA9Ci0gICAgICAgICAgc3RkOjpiaW5kKCZCdG06Ok9uSW5xdWlyeUNvbXBsZXRlLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpfTsKLSAgaW5xdWlyeS0+UmVnaXN0ZXJDYWxsYmFja3Moc3RkOjptb3ZlKGlucXVpcnlfY2FsbGJhY2tzKSk7Ci19Ci0KLXZvaWQgQnRtOjpPbklucXVpcnlSZXN1bHQoYmx1ZXRvb3RoOjpoY2k6OklucXVpcnlSZXN1bHRWaWV3IHZpZXcpIHsKLSAgZm9yIChhdXRvJiByZXNwb25zZSA6IHZpZXcuR2V0SW5xdWlyeVJlc3VsdHMoKSkgewotICAgIGJ0bV9hcGlfcHJvY2Vzc19pbnF1aXJ5X3Jlc3VsdCgKLSAgICAgICAgVG9SYXdBZGRyZXNzKHJlc3BvbnNlLmJkX2FkZHJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzcG9uc2UucGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZV8pLAotICAgICAgICByZXNwb25zZS5jbGFzc19vZl9kZXZpY2VfLmRhdGEoKSwgcmVzcG9uc2UuY2xvY2tfb2Zmc2V0Xyk7Ci0gIH0KLX0KLQotdm9pZCBCdG06Ok9uSW5xdWlyeVJlc3VsdFdpdGhSc3NpKAotICAgIGJsdWV0b290aDo6aGNpOjpJbnF1aXJ5UmVzdWx0V2l0aFJzc2lWaWV3IHZpZXcpIHsKLSAgZm9yIChhdXRvJiByZXNwb25zZSA6IHZpZXcuR2V0SW5xdWlyeVJlc3VsdHMoKSkgewotICAgIGJ0bV9hcGlfcHJvY2Vzc19pbnF1aXJ5X3Jlc3VsdF93aXRoX3Jzc2koCi0gICAgICAgIFRvUmF3QWRkcmVzcyhyZXNwb25zZS5hZGRyZXNzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3BvbnNlLnBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGVfKSwKLSAgICAgICAgcmVzcG9uc2UuY2xhc3Nfb2ZfZGV2aWNlXy5kYXRhKCksIHJlc3BvbnNlLmNsb2NrX29mZnNldF8sCi0gICAgICAgIHJlc3BvbnNlLnJzc2lfKTsKLSAgfQotfQotCi12b2lkIEJ0bTo6T25FeHRlbmRlZElucXVpcnlSZXN1bHQoCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkV4dGVuZGVkSW5xdWlyeVJlc3VsdFZpZXcgdmlldykgewotICBjb25zdGV4cHIgc2l6ZV90IGtNYXhFeHRlbmRlZElucXVpcnlSZXNwb25zZSA9IDI0MDsKLSAgdWludDhfdCBnYXBfZGF0YV9idWZmZXJba01heEV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlXTsKLSAgdWludDhfdCogZGF0YSA9IG51bGxwdHI7Ci0gIHNpemVfdCBkYXRhX2xlbiA9IDA7Ci0KLSAgaWYgKCF2aWV3LkdldEV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlKCkuZW1wdHkoKSkgewotICAgIGJ6ZXJvKGdhcF9kYXRhX2J1ZmZlciwgc2l6ZW9mKGdhcF9kYXRhX2J1ZmZlcikpOwotICAgIHVpbnQ4X3QqIHAgPSBnYXBfZGF0YV9idWZmZXI7Ci0gICAgZm9yIChhdXRvIGdhcF9kYXRhIDogdmlldy5HZXRFeHRlbmRlZElucXVpcnlSZXNwb25zZSgpKSB7Ci0gICAgICAqcCsrID0gZ2FwX2RhdGEuZGF0YV8uc2l6ZSgpICsgc2l6ZW9mKGdhcF9kYXRhLmRhdGFfdHlwZV8pOwotICAgICAgKnArKyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGdhcF9kYXRhLmRhdGFfdHlwZV8pOwotICAgICAgcCA9ICh1aW50OF90KiltZW1jcHkocCwgJmdhcF9kYXRhLmRhdGFfWzBdLCBnYXBfZGF0YS5kYXRhXy5zaXplKCkpICsKLSAgICAgICAgICBnYXBfZGF0YS5kYXRhXy5zaXplKCk7Ci0gICAgfQotICAgIGRhdGEgPSBnYXBfZGF0YV9idWZmZXI7Ci0gICAgZGF0YV9sZW4gPSBwIC0gZGF0YTsKLSAgfQotCi0gIGJ0bV9hcGlfcHJvY2Vzc19leHRlbmRlZF9pbnF1aXJ5X3Jlc3VsdCgKLSAgICAgIFRvUmF3QWRkcmVzcyh2aWV3LkdldEFkZHJlc3MoKSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pih2aWV3LkdldFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUoKSksCi0gICAgICB2aWV3LkdldENsYXNzT2ZEZXZpY2UoKS5kYXRhKCksIHZpZXcuR2V0Q2xvY2tPZmZzZXQoKSwgdmlldy5HZXRSc3NpKCksCi0gICAgICBkYXRhLCBkYXRhX2xlbik7Ci19Ci0KLXZvaWQgQnRtOjpPbklucXVpcnlDb21wbGV0ZShibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlIHN0YXR1cykgewotICBsaW1pdGVkX2lucXVpcnlfYWN0aXZlXyA9IGZhbHNlOwotICBnZW5lcmFsX2lucXVpcnlfYWN0aXZlXyA9IGZhbHNlOwotICBsZWdhY3lfaW5xdWlyeV9jb21wbGV0ZV9jYWxsYmFja18oKHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0dXMpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoQlRNX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoQlRNX0VSUl9QUk9DRVNTSU5HKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9pbnF1aXJ5X21vZGVfKTsKLQotICBhY3RpdmVfaW5xdWlyeV9tb2RlXyA9IGtJbnF1aXJ5TW9kZU9mZjsKLX0KLQotdm9pZCBCdG06OlNldFN0YW5kYXJkSW5xdWlyeVJlc3VsdE1vZGUoKSB7Ci0gIEdldElucXVpcnkoKS0+U2V0U3RhbmRhcmRJbnF1aXJ5UmVzdWx0TW9kZSgpOwotfQotCi12b2lkIEJ0bTo6U2V0SW5xdWlyeVdpdGhSc3NpUmVzdWx0TW9kZSgpIHsKLSAgR2V0SW5xdWlyeSgpLT5TZXRJbnF1aXJ5V2l0aFJzc2lSZXN1bHRNb2RlKCk7Ci19Ci0KLXZvaWQgQnRtOjpTZXRFeHRlbmRlZElucXVpcnlSZXN1bHRNb2RlKCkgewotICBHZXRJbnF1aXJ5KCktPlNldEV4dGVuZGVkSW5xdWlyeVJlc3VsdE1vZGUoKTsKLX0KLQotdm9pZCBCdG06OlNldEludGVybGFjZWRJbnF1aXJ5U2NhbigpIHsgR2V0SW5xdWlyeSgpLT5TZXRJbnRlcmxhY2VkU2NhbigpOyB9Ci0KLXZvaWQgQnRtOjpTZXRTdGFuZGFyZElucXVpcnlTY2FuKCkgeyBHZXRJbnF1aXJ5KCktPlNldFN0YW5kYXJkU2NhbigpOyB9Ci0KLWJvb2wgQnRtOjpJc0ludGVybGFjZWRTY2FuU3VwcG9ydGVkKCkgY29uc3QgewotICByZXR1cm4gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2ludGVybGFjZWRfaW5xdWlyeV9zY2FuKCk7Ci19Ci0KLS8qKgotICogT25lIHNob3QgaW5xdWlyeQotICovCi1ib29sIEJ0bTo6U3RhcnRJbnF1aXJ5KAotICAgIHVpbnQ4X3QgbW9kZSwgdWludDhfdCBkdXJhdGlvbiwgdWludDhfdCBtYXhfcmVzcG9uc2VzLAotICAgIExlZ2FjeUlucXVpcnlDb21wbGV0ZUNhbGxiYWNrIGxlZ2FjeV9pbnF1aXJ5X2NvbXBsZXRlX2NhbGxiYWNrKSB7Ci0gIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2Uga0lucXVpcnlNb2RlT2ZmOgotICAgICAgTE9HX0lORk8oIiVzIFN0b3BwaW5nIGlucXVpcnkgbW9kZSIsIF9fZnVuY19fKTsKLSAgICAgIGlmIChsaW1pdGVkX2lucXVpcnlfYWN0aXZlXyB8fCBnZW5lcmFsX2lucXVpcnlfYWN0aXZlXykgewotICAgICAgICBHZXRJbnF1aXJ5KCktPlN0b3BJbnF1aXJ5KCk7Ci0gICAgICAgIGxpbWl0ZWRfaW5xdWlyeV9hY3RpdmVfID0gZmFsc2U7Ci0gICAgICAgIGdlbmVyYWxfaW5xdWlyeV9hY3RpdmVfID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBhY3RpdmVfaW5xdWlyeV9tb2RlXyA9IGtJbnF1aXJ5TW9kZU9mZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBrTGltaXRlZElucXVpcnlNb2RlOgotICAgIGNhc2Uga0dlbmVyYWxJbnF1aXJ5TW9kZTogewotICAgICAgaWYgKG1vZGUgPT0ga0xpbWl0ZWRJbnF1aXJ5TW9kZSkgewotICAgICAgICBMT0dfSU5GTygKLQotICAgICAgICAgICAgIiVzIFN0YXJ0aW5nIGxpbWl0ZWQgaW5xdWlyeSBtb2RlIGR1cmF0aW9uOiVoaGQgbWF4IHJlc3BvbnNlczolaGhkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBkdXJhdGlvbiwgbWF4X3Jlc3BvbnNlcyk7Ci0gICAgICAgIGxpbWl0ZWRfaW5xdWlyeV9hY3RpdmVfID0gdHJ1ZTsKLSAgICAgICAgR2V0SW5xdWlyeSgpLT5TdGFydExpbWl0ZWRJbnF1aXJ5KGR1cmF0aW9uLCBtYXhfcmVzcG9uc2VzKTsKLSAgICAgICAgYWN0aXZlX2lucXVpcnlfbW9kZV8gPSBrTGltaXRlZElucXVpcnlNb2RlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0lORk8oCi0KLSAgICAgICAgICAgICIlcyBTdGFydGluZyBnZW5lcmFsIGlucXVpcnkgbW9kZSBkdXJhdGlvbjolaGhkIG1heCByZXNwb25zZXM6JWhoZCIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgZHVyYXRpb24sIG1heF9yZXNwb25zZXMpOwotICAgICAgICBnZW5lcmFsX2lucXVpcnlfYWN0aXZlXyA9IHRydWU7Ci0gICAgICAgIEdldElucXVpcnkoKS0+U3RhcnRHZW5lcmFsSW5xdWlyeShkdXJhdGlvbiwgbWF4X3Jlc3BvbnNlcyk7Ci0gICAgICAgIGxlZ2FjeV9pbnF1aXJ5X2NvbXBsZXRlX2NhbGxiYWNrXyA9IGxlZ2FjeV9pbnF1aXJ5X2NvbXBsZXRlX2NhbGxiYWNrOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIiVzIFVua25vd24gaW5xdWlyeSBtb2RlOiVkIiwgX19mdW5jX18sIG1vZGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJ0bTo6Q2FuY2VsSW5xdWlyeSgpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICBpZiAobGltaXRlZF9pbnF1aXJ5X2FjdGl2ZV8gfHwgZ2VuZXJhbF9pbnF1aXJ5X2FjdGl2ZV8pIHsKLSAgICBHZXRJbnF1aXJ5KCktPlN0b3BJbnF1aXJ5KCk7Ci0gICAgbGltaXRlZF9pbnF1aXJ5X2FjdGl2ZV8gPSBmYWxzZTsKLSAgICBnZW5lcmFsX2lucXVpcnlfYWN0aXZlXyA9IGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgQnRtOjpJc0lucXVpcnlBY3RpdmUoKSBjb25zdCB7Ci0gIHJldHVybiBJc0dlbmVyYWxJbnF1aXJ5QWN0aXZlKCkgfHwgSXNMaW1pdGVkSW5xdWlyeUFjdGl2ZSgpOwotfQotCi1ib29sIEJ0bTo6SXNHZW5lcmFsSW5xdWlyeUFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGdlbmVyYWxfaW5xdWlyeV9hY3RpdmVfOyB9Ci0KLWJvb2wgQnRtOjpJc0xpbWl0ZWRJbnF1aXJ5QWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbGltaXRlZF9pbnF1aXJ5X2FjdGl2ZV87IH0KLQotLyoqCi0gKiBQZXJpb2RpYwotICovCi1ib29sIEJ0bTo6U3RhcnRQZXJpb2RpY0lucXVpcnkodWludDhfdCBtb2RlLCB1aW50OF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3Jlc3BvbnNlcywgdWludDE2X3QgbWF4X2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9kZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IpIHsKLSAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBrSW5xdWlyeU1vZGVPZmY6Ci0gICAgICBsaW1pdGVkX3BlcmlvZGljX2lucXVpcnlfYWN0aXZlXyA9IGZhbHNlOwotICAgICAgZ2VuZXJhbF9wZXJpb2RpY19pbnF1aXJ5X2FjdGl2ZV8gPSBmYWxzZTsKLSAgICAgIEdldElucXVpcnkoKS0+U3RvcFBlcmlvZGljSW5xdWlyeSgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGtMaW1pdGVkSW5xdWlyeU1vZGU6Ci0gICAgY2FzZSBrR2VuZXJhbElucXVpcnlNb2RlOiB7Ci0gICAgICBpZiAobW9kZSA9PSBrTGltaXRlZElucXVpcnlNb2RlKSB7Ci0gICAgICAgIExPR19JTkZPKCIlcyBTdGFydGluZyBsaW1pdGVkIHBlcmlvZGljIGlucXVpcnkgbW9kZSIsIF9fZnVuY19fKTsKLSAgICAgICAgbGltaXRlZF9wZXJpb2RpY19pbnF1aXJ5X2FjdGl2ZV8gPSB0cnVlOwotICAgICAgICBHZXRJbnF1aXJ5KCktPlN0YXJ0TGltaXRlZFBlcmlvZGljSW5xdWlyeShkdXJhdGlvbiwgbWF4X3Jlc3BvbnNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlbGF5LCBtaW5fZGVsYXkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0lORk8oIiVzIFN0YXJ0aW5nIGdlbmVyYWwgcGVyaW9kaWMgaW5xdWlyeSBtb2RlIiwgX19mdW5jX18pOwotICAgICAgICBnZW5lcmFsX3BlcmlvZGljX2lucXVpcnlfYWN0aXZlXyA9IHRydWU7Ci0gICAgICAgIEdldElucXVpcnkoKS0+U3RhcnRHZW5lcmFsUGVyaW9kaWNJbnF1aXJ5KGR1cmF0aW9uLCBtYXhfcmVzcG9uc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVsYXksIG1pbl9kZWxheSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigiJXMgVW5rbm93biBpbnF1aXJ5IG1vZGU6JWQiLCBfX2Z1bmNfXywgbW9kZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQnRtOjpJc0dlbmVyYWxQZXJpb2RpY0lucXVpcnlBY3RpdmUoKSBjb25zdCB7Ci0gIHJldHVybiBnZW5lcmFsX3BlcmlvZGljX2lucXVpcnlfYWN0aXZlXzsKLX0KLQotYm9vbCBCdG06OklzTGltaXRlZFBlcmlvZGljSW5xdWlyeUFjdGl2ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxpbWl0ZWRfcGVyaW9kaWNfaW5xdWlyeV9hY3RpdmVfOwotfQotCi0vKioKLSAqIERpc2NvdmVyYWJpbGl0eQotICovCi0KLWJsdWV0b290aDo6bmVpZ2hib3I6OlNjYW5QYXJhbWV0ZXJzIHBhcmFtc197Ci0gICAgLmludGVydmFsID0gMCwKLSAgICAud2luZG93ID0gMCwKLX07Ci0KLXZvaWQgQnRtOjpTZXRDbGFzc2ljR2VuZXJhbERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCB3aW5kb3csIHVpbnQxNl90IGludGVydmFsKSB7Ci0gIHBhcmFtc18ud2luZG93ID0gd2luZG93OwotICBwYXJhbXNfLmludGVydmFsID0gaW50ZXJ2YWw7Ci0KLSAgR2V0SW5xdWlyeSgpLT5TZXRTY2FuQWN0aXZpdHkocGFyYW1zXyk7Ci0gIEdldERpc2NvdmVyYWJpbGl0eSgpLT5TdGFydEdlbmVyYWxEaXNjb3ZlcmFiaWxpdHkoKTsKLX0KLQotdm9pZCBCdG06OlNldENsYXNzaWNMaW1pdGVkRGlzY292ZXJhYmlsaXR5KHVpbnQxNl90IHdpbmRvdywgdWludDE2X3QgaW50ZXJ2YWwpIHsKLSAgcGFyYW1zXy53aW5kb3cgPSB3aW5kb3c7Ci0gIHBhcmFtc18uaW50ZXJ2YWwgPSBpbnRlcnZhbDsKLSAgR2V0SW5xdWlyeSgpLT5TZXRTY2FuQWN0aXZpdHkocGFyYW1zXyk7Ci0gIEdldERpc2NvdmVyYWJpbGl0eSgpLT5TdGFydExpbWl0ZWREaXNjb3ZlcmFiaWxpdHkoKTsKLX0KLQotdm9pZCBCdG06OlNldENsYXNzaWNEaXNjb3ZlcmFiaWxpdHlPZmYoKSB7Ci0gIEdldERpc2NvdmVyYWJpbGl0eSgpLT5TdG9wRGlzY292ZXJhYmlsaXR5KCk7Ci19Ci0KLURpc2NvdmVyYWJpbGl0eVN0YXRlIEJ0bTo6R2V0Q2xhc3NpY0Rpc2NvdmVyYWJpbGl0eVN0YXRlKCkgY29uc3QgewotICBEaXNjb3ZlcmFiaWxpdHlTdGF0ZSBzdGF0ZXsubW9kZSA9IEJUTV9OT05fRElTQ09WRVJBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50ZXJ2YWwgPSBwYXJhbXNfLmludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93ID0gcGFyYW1zXy53aW5kb3d9OwotCi0gIGlmIChHZXREaXNjb3ZlcmFiaWxpdHkoKS0+SXNHZW5lcmFsRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpKSB7Ci0gICAgc3RhdGUubW9kZSA9IEJUTV9HRU5FUkFMX0RJU0NPVkVSQUJMRTsKLSAgfSBlbHNlIGlmIChHZXREaXNjb3ZlcmFiaWxpdHkoKS0+SXNMaW1pdGVkRGlzY292ZXJhYmlsaXR5RW5hYmxlZCgpKSB7Ci0gICAgc3RhdGUubW9kZSA9IEJUTV9MSU1JVEVEX0RJU0NPVkVSQUJMRTsKLSAgfQotICByZXR1cm4gc3RhdGU7Ci19Ci0KLXZvaWQgQnRtOjpTZXRMZUdlbmVyYWxEaXNjb3ZlcmFiaWxpdHkoKSB7Ci0gIExPR19XQVJOKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIEJ0bTo6U2V0TGVMaW1pdGVkRGlzY292ZXJhYmlsaXR5KCkgewotICBMT0dfV0FSTigiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBCdG06OlNldExlRGlzY292ZXJhYmlsaXR5T2ZmKCkgeyBMT0dfV0FSTigiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsgfQotCi1EaXNjb3ZlcmFiaWxpdHlTdGF0ZSBCdG06OkdldExlRGlzY292ZXJhYmlsaXR5U3RhdGUoKSBjb25zdCB7Ci0gIERpc2NvdmVyYWJpbGl0eVN0YXRlIHN0YXRlewotICAgICAgLm1vZGUgPSBrRGlzY292ZXJhYmxlTW9kZU9mZiwKLSAgICAgIC5pbnRlcnZhbCA9IDAsCi0gICAgICAud2luZG93ID0gMCwKLSAgfTsKLSAgTE9HX1dBUk4oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBzdGF0ZTsKLX0KLQotLyoqCi0gKiBDb25uZWN0YWJpbGl0eQotICovCi12b2lkIEJ0bTo6U2V0Q2xhc3NpY0Nvbm5lY3RpYmxlT24oKSB7Ci0gIEdldENvbm5lY3RhYmlsaXR5KCktPlN0YXJ0Q29ubmVjdGFiaWxpdHkoKTsKLX0KLQotdm9pZCBCdG06OlNldENsYXNzaWNDb25uZWN0aWJsZU9mZigpIHsKLSAgR2V0Q29ubmVjdGFiaWxpdHkoKS0+U3RvcENvbm5lY3RhYmlsaXR5KCk7Ci19Ci0KLUNvbm5lY3RhYmlsaXR5U3RhdGUgQnRtOjpHZXRDbGFzc2ljQ29ubmVjdGFiaWxpdHlTdGF0ZSgpIGNvbnN0IHsKLSAgQ29ubmVjdGFiaWxpdHlTdGF0ZSBzdGF0ZXsuaW50ZXJ2YWwgPSBwYXJhbXNfLmludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3cgPSBwYXJhbXNfLndpbmRvd307Ci0KLSAgaWYgKEdldENvbm5lY3RhYmlsaXR5KCktPklzQ29ubmVjdGFibGUoKSkgewotICAgIHN0YXRlLm1vZGUgPSBCVE1fQ09OTkVDVEFCTEU7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdGUubW9kZSA9IEJUTV9OT05fQ09OTkVDVEFCTEU7Ci0gIH0KLSAgcmV0dXJuIHN0YXRlOwotfQotCi12b2lkIEJ0bTo6U2V0SW50ZXJsYWNlZFBhZ2VTY2FuKCkgeyBHZXRQYWdlKCktPlNldEludGVybGFjZWRTY2FuKCk7IH0KLQotdm9pZCBCdG06OlNldFN0YW5kYXJkUGFnZVNjYW4oKSB7IEdldFBhZ2UoKS0+U2V0U3RhbmRhcmRTY2FuKCk7IH0KLQotdm9pZCBCdG06OlNldExlQ29ubmVjdGlibGVPbigpIHsgTE9HX1dBUk4oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7IH0KLQotdm9pZCBCdG06OlNldExlQ29ubmVjdGlibGVPZmYoKSB7IExPR19XQVJOKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOyB9Ci0KLUNvbm5lY3RhYmlsaXR5U3RhdGUgQnRtOjpHZXRMZUNvbm5lY3RhYmlsaXR5U3RhdGUoKSBjb25zdCB7Ci0gIENvbm5lY3RhYmlsaXR5U3RhdGUgc3RhdGV7Ci0gICAgICAubW9kZSA9IGtDb25uZWN0aWJsZU1vZGVPZmYsCi0gICAgICAuaW50ZXJ2YWwgPSAwLAotICAgICAgLndpbmRvdyA9IDAsCi0gIH07Ci0gIExPR19XQVJOKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICByZXR1cm4gc3RhdGU7Ci19Ci0KLWJvb2wgQnRtOjpVc2VMZUxpbmsoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIGNvbnN0IHsKLSAgaWYgKEdldEFjbE1hbmFnZXIoKS0+SEFDS19HZXRIYW5kbGUoVG9HZEFkZHJlc3MocmF3X2FkZHJlc3MpKSAhPSAweEZGRkYpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKEdldEFjbE1hbmFnZXIoKS0+SEFDS19HZXRMZUhhbmRsZShUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcykpICE9IDB4RkZGRikgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIC8vIFRPRE8oaHN6KTogdXNlIGNvcnJlY3QgdHJhbnNwb3J0IGJ5IHVzaW5nIHN0b3JhZ2UgcmVjb3Jkcy4gIEZvciBub3cgYXNzdW1lCi0gIC8vIExFIGZvciBHQVRUIGFuZCBISUQuCi0gIHJldHVybiB0cnVlOwotfQotCi1CdG1TdGF0dXMgQnRtOjpSZWFkQ2xhc3NpY1JlbW90ZURldmljZU5hbWUoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBjYWxsYmFjaykgewotICBpZiAoIUNoZWNrQ2xhc3NpY0FjbExpbmsocmF3X2FkZHJlc3MpKSB7Ci0gICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gIH0KLQotICBpZiAoIWNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZV8uU3RhcnQocmF3X2FkZHJlc3MpKSB7Ci0gICAgTE9HX0lORk8oIiVzIFJlYWQgcmVtb3RlIG5hbWUgaXMgY3VycmVudGx5IGJ1c3kgYWRkcmVzczolcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgIHJhd19hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEJUTV9CVVNZOwotICB9Ci0KLSAgTE9HX0lORk8oIiVzIFN0YXJ0IHJlYWQgbmFtZSBmcm9tIGFkZHJlc3M6JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcmF3X2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgR2V0TmFtZSgpLT5SZWFkUmVtb3RlTmFtZVJlcXVlc3QoCi0gICAgICBUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyksIGhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZTo6UjEsCi0gICAgICAwIC8qIGNsb2NrX29mZnNldCAqLywgaGNpOjpDbG9ja09mZnNldFZhbGlkOjpJTlZBTElELAotCi0gICAgICBiYXNlOjpCaW5kKAotICAgICAgICAgIFtdKHRCVE1fQ01QTF9DQiogY2FsbGJhY2ssIFJlYWRSZW1vdGVOYW1lKiBjbGFzc2ljX3JlYWRfcmVtb3RlX25hbWUsCi0gICAgICAgICAgICAgaGNpOjpFcnJvckNvZGUgc3RhdHVzLCBoY2k6OkFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIGtSZW1vdGVEZXZpY2VOYW1lTGVuZ3RoPiByZW1vdGVfbmFtZSkgewotICAgICAgICAgICAgUmF3QWRkcmVzcyByYXdfYWRkcmVzcyA9IFRvUmF3QWRkcmVzcyhhZGRyZXNzKTsKLQotICAgICAgICAgICAgQnRtUmVtb3RlRGV2aWNlTmFtZSBuYW1lewotICAgICAgICAgICAgICAgIC5zdGF0dXMgPSAoc3RhdGljX2Nhc3Q8dWludDhfdD4oc3RhdHVzKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoQlRNX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChCVE1fQkFEX1ZBTFVFX1JFVCksCi0gICAgICAgICAgICAgICAgLmJkX2FkZHIgPSByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAubGVuZ3RoID0ga1JlbW90ZURldmljZU5hbWVMZW5ndGgsCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgc3RkOjpjb3B5KHJlbW90ZV9uYW1lLmJlZ2luKCksIHJlbW90ZV9uYW1lLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUucmVtb3RlX2JkX25hbWUpOwotICAgICAgICAgICAgTE9HX0lORk8oIiVzIEZpbmlzaCByZWFkIG5hbWUgZnJvbSBhZGRyZXNzOiVzIG5hbWU6JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCBuYW1lLnJlbW90ZV9iZF9uYW1lKTsKLSAgICAgICAgICAgIGNhbGxiYWNrKCZuYW1lKTsKLSAgICAgICAgICAgIGNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZS0+U3RvcCgpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgY2FsbGJhY2ssICZjbGFzc2ljX3JlYWRfcmVtb3RlX25hbWVfKSwKLSAgICAgIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci19Ci0KLUJ0bVN0YXR1cyBCdG06OlJlYWRMZVJlbW90ZURldmljZU5hbWUoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogY2FsbGJhY2spIHsKLSAgaWYgKCFDaGVja0xlQWNsTGluayhyYXdfYWRkcmVzcykpIHsKLSAgICByZXR1cm4gQlRNX1VOS05PV05fQUREUjsKLSAgfQotCi0gIGlmICghbGVfcmVhZF9yZW1vdGVfbmFtZV8uU3RhcnQocmF3X2FkZHJlc3MpKSB7Ci0gICAgcmV0dXJuIEJUTV9CVVNZOwotICB9Ci0KLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgbmVlZCBhY2Nlc3MgdG8gR0FUVCBtb2R1bGUiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBCVE1fVU5LTk9XTl9BRERSOwotfQotCi1CdG1TdGF0dXMgQnRtOjpDYW5jZWxBbGxSZWFkUmVtb3RlRGV2aWNlTmFtZSgpIHsKLSAgaWYgKGNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZV8uSXNJblByb2dyZXNzKCkgfHwKLSAgICAgIGxlX3JlYWRfcmVtb3RlX25hbWVfLklzSW5Qcm9ncmVzcygpKSB7Ci0gICAgaWYgKGNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZV8uSXNJblByb2dyZXNzKCkpIHsKLSAgICAgIGhjaTo6QWRkcmVzcyBhZGRyZXNzOwotICAgICAgaGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKGNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZV8uQWRkcmVzc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpOwotCi0gICAgICBHZXROYW1lKCktPkNhbmNlbFJlbW90ZU5hbWVSZXF1ZXN0KAotICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgY29tbW9uOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgW10oUmVhZFJlbW90ZU5hbWUqIGNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgaGNpOjpFcnJvckNvZGUgc3RhdHVzLAotICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3MgYWRkcmVzcykgeyBjbGFzc2ljX3JlYWRfcmVtb3RlX25hbWUtPlN0b3AoKTsgfSwKLSAgICAgICAgICAgICAgJmNsYXNzaWNfcmVhZF9yZW1vdGVfbmFtZV8pLAotICAgICAgICAgIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gICAgfQotICAgIGlmIChsZV9yZWFkX3JlbW90ZV9uYW1lXy5Jc0luUHJvZ3Jlc3MoKSkgewotICAgICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgbmVlZCBhY2Nlc3MgdG8gR0FUVCBtb2R1bGUiLCBfX2Z1bmNfXyk7Ci0gICAgfQotICAgIHJldHVybiBCVE1fVU5LTk9XTl9BRERSOwotICB9Ci0gIExPR19XQVJOKCIlcyBDYW5jZWxsaW5nIGNsYXNzaWMgcmVtb3RlIGRldmljZSBuYW1lIHdpdGhvdXQgb25lIGluIHByb2dyZXNzIiwKLSAgICAgICAgICAgX19mdW5jX18pOwotICByZXR1cm4gQlRNX1dST05HX01PREU7Ci19Ci0KLXZvaWQgQnRtOjpTdGFydEFkdmVydGlzaW5nKCkgewotICBpZiAoYWR2ZXJ0aXNlcl9pZF8gPT0gaGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlcjo6a0ludmFsaWRJZCkgewotICAgIExPR19XQVJOKCIlcyBBbHJlYWR5IGFkdmVydGlzaW5nOyBwbGVhc2Ugc3RvcCBwcmlvciB0byBzdGFydGluZyBhZ2FpbiIsCi0gICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGhjaTo6RXh0ZW5kZWRBZHZlcnRpc2luZ0NvbmZpZyBjb25maWcgPSB7fTsKLSAgYWR2ZXJ0aXNlcl9pZF8gPSBHZXRBZHZlcnRpc2luZygpLT5FeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIoCi0gICAgICAweDAwLCBjb25maWcsCi0gICAgICBjb21tb246OkJpbmQoW10oaGNpOjpBZGRyZXNzLCBoY2k6OkFkZHJlc3NUeXBlKSB7IC8qT25TY2FuKi8gfSksCi0gICAgICBjb21tb246OkJpbmQoW10oaGNpOjpFcnJvckNvZGUsIHVpbnQ4X3QsIHVpbnQ4X3QpIHsgLypPblRlcm1pbmF0ZWQqLyB9KSwKLSAgICAgIDAsIDAsIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gIGlmIChhZHZlcnRpc2VyX2lkXyA9PSBoY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkKSB7Ci0gICAgTE9HX1dBUk4oIiVzIFVuYWJsZSB0byBzdGFydCBhZHZlcnRpc2luZyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgTE9HX0lORk8oIiVzIFN0YXJ0ZWQgYWR2ZXJ0aXNpbmciLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgQnRtOjpTdG9wQWR2ZXJ0aXNpbmcoKSB7Ci0gIGlmIChhZHZlcnRpc2VyX2lkXyA9PSBoY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjprSW52YWxpZElkKSB7Ci0gICAgTE9HX1dBUk4oIiVzIE5vIGFjdGl2ZSBhZHZlcnRpc2luZyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgR2V0QWR2ZXJ0aXNpbmcoKS0+UmVtb3ZlQWR2ZXJ0aXNlcihhZHZlcnRpc2VyX2lkXyk7Ci0gIGFkdmVydGlzZXJfaWRfID0gaGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlcjo6a0ludmFsaWRJZDsKLSAgTE9HX0lORk8oIiVzIFN0b3BwZWQgYWR2ZXJ0aXNpbmciLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgQnRtOjpTdGFydENvbm5lY3RhYmlsaXR5KCkgeyBTdGFydEFkdmVydGlzaW5nKCk7IH0KLQotdm9pZCBCdG06OlN0b3BDb25uZWN0YWJpbGl0eSgpIHsgU3RvcEFkdmVydGlzaW5nKCk7IH0KLQotdm9pZCBCdG06OlN0YXJ0QWN0aXZlU2Nhbm5pbmcoKSB7IFN0YXJ0U2Nhbm5pbmcoa0FjdGl2ZVNjYW5uaW5nKTsgfQotCi12b2lkIEJ0bTo6U3RvcEFjdGl2ZVNjYW5uaW5nKCkgeyBHZXRTY2FubmluZygpLT5TY2FuKGZhbHNlKTsgfQotCi12b2lkIEJ0bTo6U2V0U2Nhbm5pbmdUaW1lcih1aW50NjRfdCBkdXJhdGlvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6T25jZUNhbGxiYWNrPHZvaWQoKT4gY2FsbGJhY2spIHsKLSAgc2Nhbm5pbmdfdGltZXJfLlNjaGVkdWxlKHN0ZDo6bW92ZShjYWxsYmFjayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGR1cmF0aW9uX21zKSk7Ci19Ci0KLXZvaWQgQnRtOjpDYW5jZWxTY2FubmluZ1RpbWVyKCkgeyBzY2FubmluZ190aW1lcl8uQ2FuY2VsKCk7IH0KLQotdm9pZCBCdG06OlN0YXJ0T2JzZXJ2aW5nKCkgeyBTdGFydFNjYW5uaW5nKGtQYXNzaXZlU2Nhbm5pbmcpOyB9Ci0KLXZvaWQgQnRtOjpTdG9wT2JzZXJ2aW5nKCkgeyBTdG9wQWN0aXZlU2Nhbm5pbmcoKTsgfQotCi12b2lkIEJ0bTo6U2V0T2JzZXJ2aW5nVGltZXIodWludDY0X3QgZHVyYXRpb25fbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpPbmNlQ2FsbGJhY2s8dm9pZCgpPiBjYWxsYmFjaykgewotICBvYnNlcnZpbmdfdGltZXJfLlNjaGVkdWxlKHN0ZDo6bW92ZShjYWxsYmFjayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkdXJhdGlvbl9tcykpOwotfQotCi12b2lkIEJ0bTo6Q2FuY2VsT2JzZXJ2aW5nVGltZXIoKSB7IG9ic2VydmluZ190aW1lcl8uQ2FuY2VsKCk7IH0KLQotdm9pZCBCdG06OlN0YXJ0U2Nhbm5pbmcoYm9vbCB1c2VfYWN0aXZlX3NjYW5uaW5nKSB7Ci0gIEdldFNjYW5uaW5nKCktPlJlZ2lzdGVyU2Nhbm5pbmdDYWxsYmFjaygmc2Nhbm5pbmdfY2FsbGJhY2tzXyk7Ci0gIEdldFNjYW5uaW5nKCktPlNjYW4odHJ1ZSk7Ci19Ci0KLXNpemVfdCBCdG06OkdldE51bWJlck9mQWR2ZXJ0aXNpbmdJbnN0YW5jZXMoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRBZHZlcnRpc2luZygpLT5HZXROdW1iZXJPZkFkdmVydGlzaW5nSW5zdGFuY2VzKCk7Ci19Ci0KLXRCVE1fU1RBVFVTIEJ0bTo6Q3JlYXRlQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGludCBkZXZpY2VfdHlwZSkgewotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9BVVRPKSB7Ci0gICAgaWYgKGRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSB7Ci0gICAgICB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfTEU7Ci0gICAgfSBlbHNlIGlmIChkZXZpY2VfdHlwZSAmIEJUX0RFVklDRV9UWVBFX0JSRURSKSB7Ci0gICAgICB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfQlJfRURSOwotICAgIH0KLSAgICBMT0dfSU5GTygiJXMgZ3Vlc3NpbmcgdHJhbnNwb3J0IGFzICUwMnggIiwgX19mdW5jX18sIHRyYW5zcG9ydCk7Ci0gIH0KLQotICBhdXRvIHNlY3VyaXR5X21hbmFnZXIgPSBHZXRTZWN1cml0eU1vZHVsZSgpLT5HZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgc3dpdGNoICh0cmFuc3BvcnQpIHsKLSAgICBjYXNlIEJUX1RSQU5TUE9SVF9CUl9FRFI6Ci0gICAgICBzZWN1cml0eV9tYW5hZ2VyLT5DcmVhdGVCb25kKFRvQWRkcmVzc1dpdGhUeXBlKGJkX2FkZHIsIEJMRV9BRERSX1BVQkxJQykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9UUkFOU1BPUlRfTEU6Ci0gICAgICBzZWN1cml0eV9tYW5hZ2VyLT5DcmVhdGVCb25kTGUoVG9BZGRyZXNzV2l0aFR5cGUoYmRfYWRkciwgYWRkcl90eXBlKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUTV9JTExFR0FMX1ZBTFVFOwotICB9Ci0gIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci19Ci0KLWJvb2wgQnRtOjpDYW5jZWxCb25kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgYXV0byBzZWN1cml0eV9tYW5hZ2VyID0gR2V0U2VjdXJpdHlNb2R1bGUoKS0+R2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gIHNlY3VyaXR5X21hbmFnZXItPkNhbmNlbEJvbmQoVG9BZGRyZXNzV2l0aFR5cGUoYmRfYWRkciwgQkxFX0FERFJfUFVCTElDKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJ0bTo6UmVtb3ZlQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIFRPRE8oY21hbnRvbikgQ2hlY2sgaWYgYWNsIGlzIGNvbm5lY3RlZAotICBhdXRvIHNlY3VyaXR5X21hbmFnZXIgPSBHZXRTZWN1cml0eU1vZHVsZSgpLT5HZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgc2VjdXJpdHlfbWFuYWdlci0+UmVtb3ZlQm9uZChUb0FkZHJlc3NXaXRoVHlwZShiZF9hZGRyLCBCTEVfQUREUl9QVUJMSUMpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQxNl90IEJ0bTo6R2V0QWNsSGFuZGxlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBhdXRvIGFjbF9tYW5hZ2VyID0gR2V0QWNsTWFuYWdlcigpOwotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICByZXR1cm4gYWNsX21hbmFnZXItPkhBQ0tfR2V0SGFuZGxlKFRvR2RBZGRyZXNzKHJlbW90ZV9iZGEpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gYWNsX21hbmFnZXItPkhBQ0tfR2V0TGVIYW5kbGUoVG9HZEFkZHJlc3MocmVtb3RlX2JkYSkpOwotICB9Ci19Ci0KLWhjaTo6QWRkcmVzc1dpdGhUeXBlIEJ0bTo6R2V0QWRkcmVzc0FuZFR5cGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX2Rldl9yZWMgIT0gTlVMTCAmJiBwX2Rldl9yZWMtPmRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSB7Ci0gICAgaWYgKCFwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEuSXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gVG9BZGRyZXNzV2l0aFR5cGUocF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLnR5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gVG9BZGRyZXNzV2l0aFR5cGUocF9kZXZfcmVjLT5ibGUucHNldWRvX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZSk7Ci0gICAgfQotICB9Ci0gIExPRyhFUlJPUikgPDwgIlVua25vd24gYmRfYWRkci4gVXNlIHB1YmxpYyBhZGRyZXNzIjsKLSAgcmV0dXJuIFRvQWRkcmVzc1dpdGhUeXBlKGJkX2FkZHIsIEJMRV9BRERSX1BVQkxJQyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9idG0uaCBiL21haW4vc2hpbS9idG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmYThiNS4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vYnRtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImdkL2NvbW1vbi9jYWxsYmFjay5oIgotI2luY2x1ZGUgImdkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2xlX3NjYW5uaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9pbnF1aXJ5LmgiCi0jaW5jbHVkZSAiZ2Qvb3MvYWxhcm0uaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vbmVpZ2hib3JfaW5xdWlyeS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8KLS8vIE5PVEU6IGxpbWl0ZWQgYW5kIGdlbmVyYWwgY29uc3RhbnRzIGZvciBpbnF1aXJ5IGFuZCBkaXNjb3ZlcmFibGUgYXJlIHN3YXBwZWQKLS8vCi0KLS8qIERpc2NvdmVyYWJsZSBtb2RlcyAqLwotc3RhdGljIGNvbnN0ZXhwciBpbnQga0Rpc2NvdmVyYWJsZU1vZGVPZmYgPSAwOyAgICAgIC8vIEJUTV9OT05fRElTQ09WRVJBQkxFCi1zdGF0aWMgY29uc3RleHByIGludCBrTGltaXRlZERpc2NvdmVyYWJsZU1vZGUgPSAxOyAgLy8gQlRNX0xJTUlURURfRElTQ09WRVJBQkxFCi1zdGF0aWMgY29uc3RleHByIGludCBrR2VuZXJhbERpc2NvdmVyYWJsZU1vZGUgPSAyOyAgLy8gQlRNX0dFTkVSQUxfRElTQ09WRVJBQkxFCi0KLS8qIElucXVpcnkgbW9kZXMgKi8KLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrSW5xdWlyeU1vZGVPZmYgPSAwOyAgICAgIC8vIEJUTV9JTlFVSVJZX05PTkUKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrR2VuZXJhbElucXVpcnlNb2RlID0gMTsgIC8vIEJUTV9HRU5FUkFMX0lOUVVJUlkKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTGltaXRlZElucXVpcnlNb2RlID0gMjsgIC8vIEJUTV9MSU1JVEVEX0lOUVVJUlkKLQotLyogQ29ubmVjdGFibGUgbW9kZXMgKi8KLXN0YXRpYyBjb25zdGV4cHIgaW50IGtDb25uZWN0aWJsZU1vZGVPZmYgPSAwOyAgLy8gQlRNX05PTl9DT05ORUNUQUJMRQotc3RhdGljIGNvbnN0ZXhwciBpbnQga0Nvbm5lY3RpYmxlTW9kZU9uID0gMTsgICAvLyBCVE1fQ09OTkVDVEFCTEUKLQotLyogSW5xdWlyeSBhbmQgcGFnZSBzY2FuIG1vZGVzICovCi1zdGF0aWMgY29uc3RleHByIGludCBrU3RhbmRhcmRTY2FuVHlwZSA9IDA7Ci1zdGF0aWMgY29uc3RleHByIGludCBrSW50ZXJsYWNlZFNjYW5UeXBlID0gMTsKLQotLyogSW5xdWlyeSByZXN1bHQgbW9kZXMgKi8KLXN0YXRpYyBjb25zdGV4cHIgaW50IGtTdGFuZGFyZElucXVpcnlSZXN1bHQgPSAwOwotc3RhdGljIGNvbnN0ZXhwciBpbnQga0lucXVpcnlSZXN1bHRXaXRoUnNzaSA9IDE7Ci1zdGF0aWMgY29uc3RleHByIGludCBrRXh0ZW5kZWRJbnF1aXJ5UmVzdWx0ID0gMjsKLQotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtQaHlDb25uZWN0aW9uTm9uZSA9IDB4MDA7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1BoeUNvbm5lY3Rpb25MZTFNID0gMHgwMTsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrUGh5Q29ubmVjdGlvbkxlMk0gPSAweDAyOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtQaHlDb25uZWN0aW9uTGVDb2RlZCA9IDB4MDM7Ci0KLXVzaW5nIExlZ2FjeUlucXVpcnlDb21wbGV0ZUNhbGxiYWNrID0KLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUTV9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlucXVpcnlfbW9kZSk+OwotCi11c2luZyBEaXNjb3ZlcmFiaWxpdHlTdGF0ZSA9IHN0cnVjdCB7Ci0gIGludCBtb2RlOwotICB1aW50MTZfdCBpbnRlcnZhbDsKLSAgdWludDE2X3Qgd2luZG93OwotfTsKLXVzaW5nIENvbm5lY3RhYmlsaXR5U3RhdGUgPSBEaXNjb3ZlcmFiaWxpdHlTdGF0ZTsKLQotdXNpbmcgSEFDS19Ob25BY2xEaXNjb25uZWN0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QsIHVpbnQ4X3QpPjsKLQotdXNpbmcgQnRtU3RhdHVzID0gdEJUTV9TVEFUVVM7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1jbGFzcyBCdG0gewotIHB1YmxpYzoKLSAgLy8gfGhhbmRsZXJ8IGlzIHVzZWQgdG8gcnVuIHRpbWVyIHRhc2tzIGFuZCBzY2FuIGNhbGxiYWNrcwotICBCdG0ob3M6OkhhbmRsZXIqIGhhbmRsZXIsIG5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlKiBpbnF1aXJ5KTsKLSAgfkJ0bSgpID0gZGVmYXVsdDsKLQotICAvLyBJbnF1aXJ5IHJlc3VsdCBjYWxsYmFja3MKLSAgdm9pZCBPbklucXVpcnlSZXN1bHQoYmx1ZXRvb3RoOjpoY2k6OklucXVpcnlSZXN1bHRWaWV3IHZpZXcpOwotICB2b2lkIE9uSW5xdWlyeVJlc3VsdFdpdGhSc3NpKGJsdWV0b290aDo6aGNpOjpJbnF1aXJ5UmVzdWx0V2l0aFJzc2lWaWV3IHZpZXcpOwotICB2b2lkIE9uRXh0ZW5kZWRJbnF1aXJ5UmVzdWx0KGJsdWV0b290aDo6aGNpOjpFeHRlbmRlZElucXVpcnlSZXN1bHRWaWV3IHZpZXcpOwotICB2b2lkIE9uSW5xdWlyeUNvbXBsZXRlKGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgc3RhdHVzKTsKLQotICB2b2lkIFNldFN0YW5kYXJkSW5xdWlyeVJlc3VsdE1vZGUoKTsKLSAgdm9pZCBTZXRJbnF1aXJ5V2l0aFJzc2lSZXN1bHRNb2RlKCk7Ci0gIHZvaWQgU2V0RXh0ZW5kZWRJbnF1aXJ5UmVzdWx0TW9kZSgpOwotCi0gIHZvaWQgU2V0SW50ZXJsYWNlZElucXVpcnlTY2FuKCk7Ci0gIHZvaWQgU2V0U3RhbmRhcmRJbnF1aXJ5U2NhbigpOwotICBib29sIElzSW50ZXJsYWNlZFNjYW5TdXBwb3J0ZWQoKSBjb25zdDsKLQotICBib29sIFN0YXJ0SW5xdWlyeSh1aW50OF90IG1vZGUsIHVpbnQ4X3QgZHVyYXRpb24sIHVpbnQ4X3QgbWF4X3Jlc3BvbnNlcywKLSAgICAgICAgICAgICAgICAgICAgTGVnYWN5SW5xdWlyeUNvbXBsZXRlQ2FsbGJhY2sgaW5xdWlyeV9jb21wbGV0ZV9jYWxsYmFjayk7Ci0gIHZvaWQgQ2FuY2VsSW5xdWlyeSgpOwotICBib29sIElzSW5xdWlyeUFjdGl2ZSgpIGNvbnN0OwotICBib29sIElzR2VuZXJhbElucXVpcnlBY3RpdmUoKSBjb25zdDsKLSAgYm9vbCBJc0xpbWl0ZWRJbnF1aXJ5QWN0aXZlKCkgY29uc3Q7Ci0KLSAgYm9vbCBTdGFydFBlcmlvZGljSW5xdWlyeSh1aW50OF90IG1vZGUsIHVpbnQ4X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfcmVzcG9uc2VzLCB1aW50MTZfdCBtYXhfZGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYik7Ci0gIHZvaWQgQ2FuY2VsUGVyaW9kaWNJbnF1aXJ5KCk7Ci0gIGJvb2wgSXNHZW5lcmFsUGVyaW9kaWNJbnF1aXJ5QWN0aXZlKCkgY29uc3Q7Ci0gIGJvb2wgSXNMaW1pdGVkUGVyaW9kaWNJbnF1aXJ5QWN0aXZlKCkgY29uc3Q7Ci0KLSAgLy8gRGlzY292ZXJhYmlsaXR5IEFQSQotICBib29sIGdlbmVyYWxfaW5xdWlyeV9hY3RpdmVfe2ZhbHNlfTsKLSAgYm9vbCBsaW1pdGVkX2lucXVpcnlfYWN0aXZlX3tmYWxzZX07Ci0gIGJvb2wgZ2VuZXJhbF9wZXJpb2RpY19pbnF1aXJ5X2FjdGl2ZV97ZmFsc2V9OwotICBib29sIGxpbWl0ZWRfcGVyaW9kaWNfaW5xdWlyeV9hY3RpdmVfe2ZhbHNlfTsKLSAgdm9pZCBTZXRDbGFzc2ljR2VuZXJhbERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCB3aW5kb3csIHVpbnQxNl90IGludGVydmFsKTsKLSAgdm9pZCBTZXRDbGFzc2ljTGltaXRlZERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCB3aW5kb3csIHVpbnQxNl90IGludGVydmFsKTsKLSAgdm9pZCBTZXRDbGFzc2ljRGlzY292ZXJhYmlsaXR5T2ZmKCk7Ci0gIERpc2NvdmVyYWJpbGl0eVN0YXRlIEdldENsYXNzaWNEaXNjb3ZlcmFiaWxpdHlTdGF0ZSgpIGNvbnN0OwotCi0gIHZvaWQgU2V0TGVHZW5lcmFsRGlzY292ZXJhYmlsaXR5KCk7Ci0gIHZvaWQgU2V0TGVMaW1pdGVkRGlzY292ZXJhYmlsaXR5KCk7Ci0gIHZvaWQgU2V0TGVEaXNjb3ZlcmFiaWxpdHlPZmYoKTsKLSAgRGlzY292ZXJhYmlsaXR5U3RhdGUgR2V0TGVEaXNjb3ZlcmFiaWxpdHlTdGF0ZSgpIGNvbnN0OwotCi0gIHZvaWQgU2V0Q2xhc3NpY0Nvbm5lY3RpYmxlT24oKTsKLSAgdm9pZCBTZXRDbGFzc2ljQ29ubmVjdGlibGVPZmYoKTsKLSAgQ29ubmVjdGFiaWxpdHlTdGF0ZSBHZXRDbGFzc2ljQ29ubmVjdGFiaWxpdHlTdGF0ZSgpIGNvbnN0OwotICB2b2lkIFNldEludGVybGFjZWRQYWdlU2NhbigpOwotICB2b2lkIFNldFN0YW5kYXJkUGFnZVNjYW4oKTsKLQotICB2b2lkIFNldExlQ29ubmVjdGlibGVPbigpOwotICB2b2lkIFNldExlQ29ubmVjdGlibGVPZmYoKTsKLSAgQ29ubmVjdGFiaWxpdHlTdGF0ZSBHZXRMZUNvbm5lY3RhYmlsaXR5U3RhdGUoKSBjb25zdDsKLQotICBib29sIFVzZUxlTGluayhjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgY29uc3Q7Ci0KLSAgLy8gUmVtb3RlIGRldmljZSBuYW1lIEFQSQotICBCdG1TdGF0dXMgUmVhZENsYXNzaWNSZW1vdGVEZXZpY2VOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogY2FsbGJhY2spOwotICBCdG1TdGF0dXMgUmVhZExlUmVtb3RlRGV2aWNlTmFtZShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBjYWxsYmFjayk7Ci0gIEJ0bVN0YXR1cyBDYW5jZWxBbGxSZWFkUmVtb3RlRGV2aWNlTmFtZSgpOwotCi0gIC8vIExlIG5laWdoYm9yIGludGVyYWN0aW9uIEFQSQotICBibHVldG9vdGg6OmhjaTo6QWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJfaWRfewotICAgICAgaGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlcjo6a0ludmFsaWRJZH07Ci0gIHZvaWQgU3RhcnRBZHZlcnRpc2luZygpOwotICB2b2lkIFN0b3BBZHZlcnRpc2luZygpOwotICB2b2lkIFN0YXJ0Q29ubmVjdGFiaWxpdHkoKTsKLSAgdm9pZCBTdG9wQ29ubmVjdGFiaWxpdHkoKTsKLQotICB2b2lkIFN0YXJ0QWN0aXZlU2Nhbm5pbmcoKTsKLSAgdm9pZCBTdG9wQWN0aXZlU2Nhbm5pbmcoKTsKLQotICB2b2lkIFN0YXJ0T2JzZXJ2aW5nKCk7Ci0gIHZvaWQgU3RvcE9ic2VydmluZygpOwotCi0gIHNpemVfdCBHZXROdW1iZXJPZkFkdmVydGlzaW5nSW5zdGFuY2VzKCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRPYnNlcnZpbmdUaW1lcih1aW50NjRfdCBkdXJhdGlvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKCk+IGNhbGxiYWNrKTsKLSAgdm9pZCBDYW5jZWxPYnNlcnZpbmdUaW1lcigpOwotICB2b2lkIFNldFNjYW5uaW5nVGltZXIodWludDY0X3QgZHVyYXRpb25fbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21tb246Ok9uY2VDYWxsYmFjazx2b2lkKCk+IGNhbGxiYWNrKTsKLSAgdm9pZCBDYW5jZWxTY2FubmluZ1RpbWVyKCk7Ci0KLSAgdEJUTV9TVEFUVVMgQ3JlYXRlQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGludCBkZXZpY2VfdHlwZSk7Ci0gIGJvb2wgQ2FuY2VsQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgYm9vbCBSZW1vdmVCb25kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIHVpbnQxNl90IEdldEFjbEhhbmRsZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLSAgc3RhdGljIGhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldEFkZHJlc3NBbmRUeXBlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gcHJpdmF0ZToKLSAgb3M6OkFsYXJtIHNjYW5uaW5nX3RpbWVyXzsKLSAgb3M6OkFsYXJtIG9ic2VydmluZ190aW1lcl87Ci0KLSAgTGVnYWN5SW5xdWlyeUNvbXBsZXRlQ2FsbGJhY2sgbGVnYWN5X2lucXVpcnlfY29tcGxldGVfY2FsbGJhY2tfe307Ci0gIHVpbnQ4X3QgYWN0aXZlX2lucXVpcnlfbW9kZV8gPSAwOwotCi0gIGNsYXNzIFJlYWRSZW1vdGVOYW1lIHsKLSAgIHB1YmxpYzoKLSAgICBSZWFkUmVtb3RlTmFtZSgpID0gZGVmYXVsdDsKLSAgICBib29sIFN0YXJ0KFJhd0FkZHJlc3MgcmF3X2FkZHJlc3MpOwotICAgIHZvaWQgU3RvcCgpOwotICAgIGJvb2wgSXNJblByb2dyZXNzKCkgY29uc3Q7Ci0gICAgc3RkOjpzdHJpbmcgQWRkcmVzc1N0cmluZygpIGNvbnN0OwotCi0gICBwcml2YXRlOgotICAgIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICAgIGJvb2wgaW5fcHJvZ3Jlc3NfID0gZmFsc2U7Ci0gICAgUmF3QWRkcmVzcyByYXdfYWRkcmVzc18gPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIH07Ci0gIFJlYWRSZW1vdGVOYW1lIGxlX3JlYWRfcmVtb3RlX25hbWVfOwotICBSZWFkUmVtb3RlTmFtZSBjbGFzc2ljX3JlYWRfcmVtb3RlX25hbWVfOwotCi0gIGNsYXNzIFNjYW5uaW5nQ2FsbGJhY2tzIDogcHVibGljIGhjaTo6U2Nhbm5pbmdDYWxsYmFjayB7Ci0gICAgdm9pZCBPblNjYW5uZXJSZWdpc3RlcmVkKGNvbnN0IGJsdWV0b290aDo6aGNpOjpVdWlkIGFwcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6U2Nhbm5lcklkIHNjYW5uZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5uaW5nU3RhdHVzIHN0YXR1cyk7Ci0gICAgdm9pZCBPblNldFNjYW5uZXJQYXJhbWV0ZXJDb21wbGV0ZShibHVldG9vdGg6OmhjaTo6U2Nhbm5lcklkIHNjYW5uZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FubmluZ1N0YXR1cyBzdGF0dXMpOwotICAgIHZvaWQgT25TY2FuUmVzdWx0KHVpbnQxNl90IGV2ZW50X3R5cGUsIHVpbnQ4X3QgYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIGFkZHJlc3MsIHVpbnQ4X3QgcHJpbWFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmRhcnlfcGh5LCB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgdHhfcG93ZXIsIGludDhfdCByc3NpLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEpOwotICAgIHZvaWQgT25UcmFja0FkdkZvdW5kTG9zdChibHVldG9vdGg6OmhjaTo6QWR2ZXJ0aXNpbmdGaWx0ZXJPbkZvdW5kT25Mb3N0SW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fZm91bmRfb25fbG9zdF9pbmZvKTsKLSAgICB2b2lkIE9uQmF0Y2hTY2FuUmVwb3J0cyhpbnQgY2xpZW50X2lmLCBpbnQgc3RhdHVzLCBpbnQgcmVwb3J0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3JlY29yZHMsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpOwotICAgIHZvaWQgT25CYXRjaFNjYW5UaHJlc2hvbGRDcm9zc2VkKGludCBjbGllbnRfaWYpOwotICAgIHZvaWQgT25UaW1lb3V0KCk7Ci0gICAgdm9pZCBPbkZpbHRlckVuYWJsZShibHVldG9vdGg6OmhjaTo6RW5hYmxlIGVuYWJsZSwgdWludDhfdCBzdGF0dXMpOwotICAgIHZvaWQgT25GaWx0ZXJQYXJhbVNldHVwKHVpbnQ4X3QgYXZhaWxhYmxlX3NwYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6QXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3Qgc3RhdHVzKTsKLSAgICB2b2lkIE9uRmlsdGVyQ29uZmlnQ2FsbGJhY2soYmx1ZXRvb3RoOjpoY2k6OkFwY2ZGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGF2YWlsYWJsZV9zcGFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBcGNmQWN0aW9uIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpOwotICB9OwotICBTY2FubmluZ0NhbGxiYWNrcyBzY2FubmluZ19jYWxsYmFja3NfOwotCi0gIC8vIFRPRE8oY21hbnRvbikgYWJvcnQgaWYgdGhlcmUgaXMgbm8gY2xhc3NpYyBhY2wgbGluayB1cAotICBib29sIENoZWNrQ2xhc3NpY0FjbExpbmsoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsgcmV0dXJuIHRydWU7IH0KLSAgYm9vbCBDaGVja0xlQWNsTGluayhjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgeyByZXR1cm4gdHJ1ZTsgfQotICB2b2lkIFN0YXJ0U2Nhbm5pbmcoYm9vbCB1c2VfYWN0aXZlX3NjYW5uaW5nKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vYnRtX2FwaS5jYyBiL21haW4vc2hpbS9idG1fYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZkZDZjLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9idG1fYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NoaW1fYnRtIgotCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY19pZF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJjb21tb24vdGltZV91dGlsLmgiCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvbmFtZS5oIgotI2luY2x1ZGUgImdkL29zL2xvZy5oIgotI2luY2x1ZGUgImdkL3NlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5oIgotI2luY2x1ZGUgImdkL3NlY3VyaXR5L3VpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbWV0cmljX2lkX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3N0YWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRBbGxvY2F0b3I7Ci0KLSNkZWZpbmUgQlRJRl9ETV9ERUZBVUxUX0lOUV9NQVhfUkVTVUxUUyAwCi0jZGVmaW5lIEJUSUZfRE1fREVGQVVMVF9JTlFfTUFYX0RVUkFUSU9OIDEwCi0KLS8qKgotICogTGVnYWN5IGJsdWV0b290aCBtb2R1bGUgZ2xvYmFsIGNvbnRyb2wgYmxvY2sgc3RhdGUKLSAqCi0gKiBNdXRleCBpcyB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyBmcm9tIHRoZSBzaGltCi0gKiBsYXllciBpbnRvIHRoZSBnbG9iYWwgY29udHJvbCBibG9jay4gIFRoaXMgaXMgdXNlZAotICogYnkgdGhlIHNoaW0gZGVzcGl0ZSBwb3RlbnRpYWxseSBhcmJpdHJhcnkKLSAqIHVuc3luY2hyb25pemVkIGFjY2VzcyBieSB0aGUgbGVnYWN5IHN0YWNrLgotICovCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci1zdGQ6Om11dGV4IGJ0bV9jYl9tdXRleF87Ci0KLWV4dGVybiBib29sIGJ0bV9pbnFfZmluZF9iZGFkZHIoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpOwotZXh0ZXJuIHRJTlFfREJfRU5UKiBidG1faW5xX2RiX2ZpbmQoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpOwotZXh0ZXJuIHRJTlFfREJfRU5UKiBidG1faW5xX2RiX25ldyhjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSk7Ci0KLS8qKgotICogTGVnYWN5IGJsdWV0b290aCBidG0gc3RhY2sgZW50cnkgcG9pbnRzCi0gKi8KLWV4dGVybiB2b2lkIGJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzKHVpbnQ4X3Qgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGJ0bV9jbGVhcl9hbGxfcGVuZGluZ19sZV9lbnRyeSh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQodm9pZCk7Ci1leHRlcm4gdm9pZCBidG1fc2V0X2Vpcl91dWlkKHVpbnQ4X3QqIHBfZWlyLCB0QlRNX0lOUV9SRVNVTFRTKiBwX3Jlc3VsdHMpOwotZXh0ZXJuIHZvaWQgYnRtX3NvcnRfaW5xX3Jlc3VsdCh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9wcm9jZXNzX2lucV9jb21wbGV0ZSh1aW50OF90IHN0YXR1cywgdWludDhfdCByZXN1bHRfdHlwZSk7Ci0KLXN0YXRpYyBib29sIGlzX2NsYXNzaWNfZGV2aWNlKHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICByZXR1cm4gZGV2aWNlX3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci19Ci0KLXN0YXRpYyBib29sIGhhc19jbGFzc2ljX2RldmljZSh0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGUpIHsKLSAgcmV0dXJuIGRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci19Ci0KLXZvaWQgYnRtX2FwaV9wcm9jZXNzX2lucXVpcnlfcmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYWdlX3NjYW5fcmVwX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfQ0xBU1MgZGV2aWNlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2xvY2tfb2Zmc2V0KSB7Ci0gIHRJTlFfREJfRU5UKiBwX2kgPSBidG1faW5xX2RiX2ZpbmQocmF3X2FkZHJlc3MpOwotCi0gIGlmIChwX2kgPT0gbnVsbHB0cikgewotICAgIHBfaSA9IGJ0bV9pbnFfZGJfbmV3KHJhd19hZGRyZXNzKTsKLSAgICBDSEVDSyhwX2kgIT0gbnVsbHB0cik7Ci0gIH0gZWxzZSBpZiAocF9pLT5pbnFfY291bnQgPT0gYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfY291bnRlciAmJgotICAgICAgICAgICAgIGlzX2NsYXNzaWNfZGV2aWNlKHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2ktPmlucV9pbmZvLnJlc3VsdHMucGFnZV9zY2FuX3JlcF9tb2RlID0gcGFnZV9zY2FuX3JlcF9tb2RlOwotICBwX2ktPmlucV9pbmZvLnJlc3VsdHMucGFnZV9zY2FuX3Blcl9tb2RlID0gMDsgIC8vIFJFU0VSVkVECi0gIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5wYWdlX3NjYW5fbW9kZSA9IDA7ICAgICAgLy8gUkVTRVJWRUQKLSAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldl9jbGFzc1swXSA9IGRldmljZV9jbGFzc1swXTsKLSAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldl9jbGFzc1sxXSA9IGRldmljZV9jbGFzc1sxXTsKLSAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldl9jbGFzc1syXSA9IGRldmljZV9jbGFzc1syXTsKLSAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmNsb2NrX29mZnNldCA9IGNsb2NrX29mZnNldCB8IEJUTV9DTE9DS19PRkZTRVRfVkFMSUQ7Ci0gIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5pbnFfcmVzdWx0X3R5cGUgPSBCVE1fSU5RX1JFU1VMVF9CUjsKLSAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLnJzc2kgPSBCVE1fSU5RX1JFU19JR05PUkVfUlNTSTsKLQotICBwX2ktPnRpbWVfb2ZfcmVzcCA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICBwX2ktPmlucV9jb3VudCA9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NvdW50ZXI7Ci0gIHBfaS0+aW5xX2luZm8uYXBwbF9rbm93c19yZW1fbmFtZSA9IGZhbHNlOwotCi0gIGlmIChwX2ktPmlucV9jb3VudCAhPSBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jb3VudGVyKSB7Ci0gICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldmljZV90eXBlID0gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci0gICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfY21wbF9pbmZvLm51bV9yZXNwKys7Ci0gICAgcF9pLT5zY2FuX3JzcCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSB8PSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgfQotCi0gIGlmIChidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX3Jlc3VsdHNfY2IgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsKLSAgfQotCi0gIChidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX3Jlc3VsdHNfY2IpKCZwX2ktPmlucV9pbmZvLnJlc3VsdHMsIG51bGxwdHIsIDApOwotfQotCi12b2lkIGJ0bV9hcGlfcHJvY2Vzc19pbnF1aXJ5X3Jlc3VsdF93aXRoX3Jzc2koUmF3QWRkcmVzcyByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfQ0xBU1MgZGV2aWNlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnNzaSkgewotICB0SU5RX0RCX0VOVCogcF9pID0gYnRtX2lucV9kYl9maW5kKHJhd19hZGRyZXNzKTsKLQotICBib29sIHVwZGF0ZSA9IGZhbHNlOwotICBpZiAoYnRtX2lucV9maW5kX2JkYWRkcihyYXdfYWRkcmVzcykpIHsKLSAgICBpZiAocF9pICE9IG51bGxwdHIgJiYKLSAgICAgICAgKHJzc2kgPiBwX2ktPmlucV9pbmZvLnJlc3VsdHMucnNzaSB8fCBwX2ktPmlucV9pbmZvLnJlc3VsdHMucnNzaSA9PSAwIHx8Ci0gICAgICAgICBoYXNfY2xhc3NpY19kZXZpY2UocF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldmljZV90eXBlKSkpIHsKLSAgICAgIHVwZGF0ZSA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBpc19uZXcgPSB0cnVlOwotICBpZiAocF9pID09IG51bGxwdHIpIHsKLSAgICBwX2kgPSBidG1faW5xX2RiX25ldyhyYXdfYWRkcmVzcyk7Ci0gICAgQ0hFQ0socF9pICE9IG51bGxwdHIpOwotICB9IGVsc2UgaWYgKHBfaS0+aW5xX2NvdW50ID09IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NvdW50ZXIgJiYKLSAgICAgICAgICAgICBpc19jbGFzc2ljX2RldmljZShwX2ktPmlucV9pbmZvLnJlc3VsdHMuZGV2aWNlX3R5cGUpKSB7Ci0gICAgaXNfbmV3ID0gZmFsc2U7Ci0gIH0KLQotICBwX2ktPmlucV9pbmZvLnJlc3VsdHMucnNzaSA9IHJzc2k7Ci0KLSAgaWYgKGlzX25ldykgewotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5wYWdlX3NjYW5fcmVwX21vZGUgPSBwYWdlX3NjYW5fcmVwX21vZGU7Ci0gICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLnBhZ2Vfc2Nhbl9wZXJfbW9kZSA9IDA7ICAvLyBSRVNFUlZFRAotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5wYWdlX3NjYW5fbW9kZSA9IDA7ICAgICAgLy8gUkVTRVJWRUQKLSAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMuZGV2X2NsYXNzWzBdID0gZGV2aWNlX2NsYXNzWzBdOwotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZfY2xhc3NbMV0gPSBkZXZpY2VfY2xhc3NbMV07Ci0gICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldl9jbGFzc1syXSA9IGRldmljZV9jbGFzc1syXTsKLSAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMuY2xvY2tfb2Zmc2V0ID0gY2xvY2tfb2Zmc2V0IHwgQlRNX0NMT0NLX09GRlNFVF9WQUxJRDsKLSAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMuaW5xX3Jlc3VsdF90eXBlID0gQlRNX0lOUV9SRVNVTFRfQlI7Ci0KLSAgICBwX2ktPnRpbWVfb2ZfcmVzcCA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICAgIHBfaS0+aW5xX2NvdW50ID0gYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfY291bnRlcjsKLSAgICBwX2ktPmlucV9pbmZvLmFwcGxfa25vd3NfcmVtX25hbWUgPSBmYWxzZTsKLQotICAgIGlmIChwX2ktPmlucV9jb3VudCAhPSBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jb3VudGVyKSB7Ci0gICAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMuZGV2aWNlX3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mby5udW1fcmVzcCsrOwotICAgICAgcF9pLT5zY2FuX3JzcCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMuZGV2aWNlX3R5cGUgfD0gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJ0bV9jYi5idG1faW5xX3ZhcnMucF9pbnFfcmVzdWx0c19jYiA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGlzX25ldyB8fCB1cGRhdGUpIHsKLSAgICAoYnRtX2NiLmJ0bV9pbnFfdmFycy5wX2lucV9yZXN1bHRzX2NiKSgmcF9pLT5pbnFfaW5mby5yZXN1bHRzLCBudWxscHRyLCAwKTsKLSAgfQotfQotdm9pZCBidG1fYXBpX3Byb2Nlc3NfZXh0ZW5kZWRfaW5xdWlyeV9yZXN1bHQoUmF3QWRkcmVzcyByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWX0NMQVNTIGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwgaW50OF90IHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBlaXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlaXJfbGVuKSB7Ci0gIHRJTlFfREJfRU5UKiBwX2kgPSBidG1faW5xX2RiX2ZpbmQocmF3X2FkZHJlc3MpOwotCi0gIGJvb2wgdXBkYXRlID0gZmFsc2U7Ci0gIGlmIChidG1faW5xX2ZpbmRfYmRhZGRyKHJhd19hZGRyZXNzKSAmJiBwX2kgIT0gbnVsbHB0cikgewotICAgIHVwZGF0ZSA9IHRydWU7Ci0gIH0KLQotICBib29sIGlzX25ldyA9IHRydWU7Ci0gIGlmIChwX2kgPT0gbnVsbHB0cikgewotICAgIHBfaSA9IGJ0bV9pbnFfZGJfbmV3KHJhd19hZGRyZXNzKTsKLSAgfSBlbHNlIGlmIChwX2ktPmlucV9jb3VudCA9PSBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jb3VudGVyICYmCi0gICAgICAgICAgICAgKHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSA9PSBCVF9ERVZJQ0VfVFlQRV9CUkVEUikpIHsKLSAgICBpc19uZXcgPSBmYWxzZTsKLSAgfQotCi0gIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5yc3NpID0gcnNzaTsKLQotICBpZiAoaXNfbmV3KSB7Ci0gICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLnBhZ2Vfc2Nhbl9yZXBfbW9kZSA9IHBhZ2Vfc2Nhbl9yZXBfbW9kZTsKLSAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMucGFnZV9zY2FuX3Blcl9tb2RlID0gMDsgIC8vIFJFU0VSVkVECi0gICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLnBhZ2Vfc2Nhbl9tb2RlID0gMDsgICAgICAvLyBSRVNFUlZFRAotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZfY2xhc3NbMF0gPSBkZXZpY2VfY2xhc3NbMF07Ci0gICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldl9jbGFzc1sxXSA9IGRldmljZV9jbGFzc1sxXTsKLSAgICBwX2ktPmlucV9pbmZvLnJlc3VsdHMuZGV2X2NsYXNzWzJdID0gZGV2aWNlX2NsYXNzWzJdOwotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5jbG9ja19vZmZzZXQgPSBjbG9ja19vZmZzZXQgfCBCVE1fQ0xPQ0tfT0ZGU0VUX1ZBTElEOwotICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5pbnFfcmVzdWx0X3R5cGUgPSBCVE1fSU5RX1JFU1VMVF9CUjsKLQotICAgIHBfaS0+dGltZV9vZl9yZXNwID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCk7Ci0gICAgcF9pLT5pbnFfY291bnQgPSBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jb3VudGVyOwotICAgIHBfaS0+aW5xX2luZm8uYXBwbF9rbm93c19yZW1fbmFtZSA9IGZhbHNlOwotCi0gICAgaWYgKHBfaS0+aW5xX2NvdW50ICE9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NvdW50ZXIpIHsKLSAgICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSA9IEJUX0RFVklDRV9UWVBFX0JSRURSOwotICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfY21wbF9pbmZvLm51bV9yZXNwKys7Ci0gICAgICBwX2ktPnNjYW5fcnNwID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSB8PSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgICB9Ci0gIH0KLQotICBpZiAoYnRtX2NiLmJ0bV9pbnFfdmFycy5wX2lucV9yZXN1bHRzX2NiID09IG51bGxwdHIpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoaXNfbmV3IHx8IHVwZGF0ZSkgewotICAgIG1lbXNldChwX2ktPmlucV9pbmZvLnJlc3VsdHMuZWlyX3V1aWQsIDAsCi0gICAgICAgICAgIEJUTV9FSVJfU0VSVklDRV9BUlJBWV9TSVpFICogKEJUTV9FSVJfQVJSQVlfQklUUyAvIDgpKTsKLSAgICBidG1fc2V0X2Vpcl91dWlkKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGVpcl9kYXRhKSwgJnBfaS0+aW5xX2luZm8ucmVzdWx0cyk7Ci0gICAgdWludDhfdCogcF9laXJfZGF0YSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGVpcl9kYXRhKTsKLSAgICAoYnRtX2NiLmJ0bV9pbnFfdmFycy5wX2lucV9yZXN1bHRzX2NiKSgmcF9pLT5pbnFfaW5mby5yZXN1bHRzLCBwX2Vpcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpcl9sZW4pOwotICB9Ci19Ci0KLW5hbWVzcGFjZSB7Ci1zdGQ6OnVub3JkZXJlZF9tYXA8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSwgYnRfYmRuYW1lX3Q+Ci0gICAgYWRkcmVzc19uYW1lX21hcF87Ci0KLXN0ZDo6dW5vcmRlcmVkX21hcDxibHVldG9vdGg6OmhjaTo6SW9DYXBhYmlsaXR5LCBpbnQ+IGdkX2xlZ2FjeV9pb19jYXBzX21hcF8gPSB7Ci0gICAge2JsdWV0b290aDo6aGNpOjpJb0NhcGFiaWxpdHk6OkRJU1BMQVlfT05MWSwgQlRNX0lPX0NBUF9PVVR9LAotICAgIHtibHVldG9vdGg6OmhjaTo6SW9DYXBhYmlsaXR5OjpESVNQTEFZX1lFU19OTywgQlRNX0lPX0NBUF9JT30sCi0gICAge2JsdWV0b290aDo6aGNpOjpJb0NhcGFiaWxpdHk6OktFWUJPQVJEX09OTFksIEJUTV9JT19DQVBfSU59LAotICAgIHtibHVldG9vdGg6OmhjaTo6SW9DYXBhYmlsaXR5OjpOT19JTlBVVF9OT19PVVRQVVQsIEJUTV9JT19DQVBfTk9ORX0sCi19OwotCi1zdGQ6OnVub3JkZXJlZF9tYXA8Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzLCBpbnQ+Ci0gICAgZ2RfbGVnYWN5X2F1dGhfcmVxc19tYXBfID0gewotICAgICAgICB7Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HLAotICAgICAgICAgQlRNX0FVVEhfU1BfTk99LAotICAgICAgICB7Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpOT19CT05ESU5HX01JVE1fUFJPVEVDVElPTiwKLSAgICAgICAgIEJUTV9BVVRIX1NQX1lFU30sCi0gICAgICAgIHtibHVldG9vdGg6OmhjaTo6QXV0aGVudGljYXRpb25SZXF1aXJlbWVudHM6OkRFRElDQVRFRF9CT05ESU5HLAotICAgICAgICAgQlRNX0FVVEhfQVBfTk99LAotICAgICAgICB7Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjoKLSAgICAgICAgICAgICBERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04sCi0gICAgICAgICBCVE1fQVVUSF9BUF9ZRVN9LAotICAgICAgICB7Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzOjpHRU5FUkFMX0JPTkRJTkcsCi0gICAgICAgICBCVE1fQVVUSF9TUEdCX05PfSwKLSAgICAgICAge2JsdWV0b290aDo6aGNpOjpBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50czo6Ci0gICAgICAgICAgICAgR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTiwKLSAgICAgICAgIEJUTV9BVVRIX1NQR0JfWUVTfSwKLX07Ci19Ci0KLWNsYXNzIFNoaW1VaSA6IHB1YmxpYyBibHVldG9vdGg6OnNlY3VyaXR5OjpVSSB7Ci0gcHVibGljOgotICBzdGF0aWMgU2hpbVVpKiBHZXRJbnN0YW5jZSgpIHsKLSAgICBzdGF0aWMgU2hpbVVpIGluc3RhbmNlOwotICAgIHJldHVybiAmaW5zdGFuY2U7Ci0gIH0KLQotICBTaGltVWkoY29uc3QgU2hpbVVpJikgPSBkZWxldGU7Ci0gIFNoaW1VaSYgb3BlcmF0b3I9KGNvbnN0IFNoaW1VaSYpID0gZGVsZXRlOwotCi0gIHZvaWQgU2V0QnRhQ2FsbGJhY2tzKGNvbnN0IHRCVE1fQVBQTF9JTkZPKiBidGFfY2FsbGJhY2tzKSB7Ci0gICAgYnRhX2NhbGxiYWNrc18gPSBidGFfY2FsbGJhY2tzOwotICAgIGlmIChidGFfY2FsbGJhY2tzLT5wX3Bpbl9jYWxsYmFjayA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBwaW5fY2FsbGJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgfQotCi0gICAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfbGlua19rZXlfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgbGlua19rZXlfY2FsbGJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgfQotCi0gICAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjayA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBhdXRoX2NvbXBsZXRlX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICAgIH0KLQotICAgIGlmIChidGFfY2FsbGJhY2tzLT5wX2JvbmRfY2FuY2VsX2NtcGxfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgYm9uZF9jYW5jZWxfY29tcGxldGVfY2FsbGJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgfQotCi0gICAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfbGVfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgbGVfY2FsbGJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgfQotCi0gICAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfbGVfa2V5X2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGxlX2tleV9jYWxsYmFjayIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIERpc3BsYXlQYWlyaW5nUHJvbXB0KGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHdhaXRpbmdfZm9yX3BhaXJpbmdfcHJvbXB0XyA9IHRydWU7Ci0gICAgYnRfYmRuYW1lX3QgbGVnYWN5X25hbWV7MH07Ci0gICAgbWVtY3B5KGxlZ2FjeV9uYW1lLm5hbWUsIG5hbWUuZGF0YSgpLCBuYW1lLmxlbmd0aCgpKTsKLSAgICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBIYW5kbGUgY2FsbGJhY2sgdG8gQlRBIGZvciBCTEUKLSAgfQotCi0gIHZvaWQgQ2FuY2VsKGNvbnN0IGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUmIGFkZHJlc3MpIHsKLSAgICBMT0coV0FSTklORykgPDwgIiDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqDilqAgIiA8PCBfX2Z1bmNfXzsKLSAgfQotCi0gIHZvaWQgSGFuZGxlQ29uZmlybShibHVldG9vdGg6OnNlY3VyaXR5OjpDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzID0gZGF0YS5HZXRBZGRyZXNzV2l0aFR5cGUoKTsKLSAgICB1aW50MzJfdCBudW1lcmljX3ZhbHVlID0gZGF0YS5HZXROdW1lcmljVmFsdWUoKTsKLSAgICBidF9iZG5hbWVfdCBsZWdhY3lfbmFtZXswfTsKLSAgICBtZW1jcHkobGVnYWN5X25hbWUubmFtZSwgZGF0YS5HZXROYW1lKCkuZGF0YSgpLCBkYXRhLkdldE5hbWUoKS5sZW5ndGgoKSk7Ci0KLSAgICBpZiAoYnRhX2NhbGxiYWNrc18tPnBfc3BfY2FsbGJhY2spIHsKLSAgICAgIC8vIENhbGwgc3BfY2JhY2sgZm9yIElPX1JFUQotICAgICAgdEJUTV9TUF9JT19SRVEgaW9fcmVxX2V2dF9kYXRhOwotICAgICAgaW9fcmVxX2V2dF9kYXRhLmJkX2FkZHIgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhhZGRyZXNzLkdldEFkZHJlc3MoKSk7Ci0gICAgICAvLyBMb2NhbCBJTyBDYXBzIChQaG9uZSBpcyBhbHdheXMgRGlzcGxheVllc05vKQotICAgICAgaW9fcmVxX2V2dF9kYXRhLmlvX2NhcCA9IEJUTV9JT19DQVBfSU87Ci0gICAgICAvLyBMb2NhbCBBdXRoIFJlcXMgKFBob25lIGlzIGFsd2F5cyBERURJQ0FURURfQk9ORElORykKLSAgICAgIGlvX3JlcV9ldnRfZGF0YS5hdXRoX3JlcSA9IEJUTV9BVVRIX0FQX05POwotICAgICAgaW9fcmVxX2V2dF9kYXRhLm9vYl9kYXRhID0gQlRNX09PQl9OT05FOwotICAgICAgKCpidGFfY2FsbGJhY2tzXy0+cF9zcF9jYWxsYmFjaykoQlRNX1NQX0lPX1JFUV9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUTV9TUF9FVlRfREFUQSopJmlvX3JlcV9ldnRfZGF0YSk7Ci0KLSAgICAgIC8vIENhbGwgc3BfY2JhY2sgZm9yIElPX1JTUAotICAgICAgdEJUTV9TUF9JT19SU1AgaW9fcnNwX2V2dF9kYXRhOwotICAgICAgaW9fcnNwX2V2dF9kYXRhLmJkX2FkZHIgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhhZGRyZXNzLkdldEFkZHJlc3MoKSk7Ci0gICAgICBpb19yc3BfZXZ0X2RhdGEuaW9fY2FwID0gZ2RfbGVnYWN5X2lvX2NhcHNfbWFwX1tkYXRhLkdldFJlbW90ZUlvQ2FwcygpXTsKLSAgICAgIGlvX3JzcF9ldnRfZGF0YS5hdXRoX3JlcSA9Ci0gICAgICAgICAgZ2RfbGVnYWN5X2F1dGhfcmVxc19tYXBfW2RhdGEuR2V0UmVtb3RlQXV0aFJlcXMoKV07Ci0gICAgICBpb19yc3BfZXZ0X2RhdGEuYXV0aF9yZXEgPSBCVE1fQVVUSF9BUF9ZRVM7Ci0gICAgICBpb19yc3BfZXZ0X2RhdGEub29iX2RhdGEgPSBCVE1fT09CX05PTkU7Ci0gICAgICAoKmJ0YV9jYWxsYmFja3NfLT5wX3NwX2NhbGxiYWNrKShCVE1fU1BfSU9fUlNQX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRNX1NQX0VWVF9EQVRBKikmaW9fcnNwX2V2dF9kYXRhKTsKLQotICAgICAgLy8gQ2FsbCBzcF9jYmFjayBmb3IgVVNFUl9DT05GSVJNQVRJT04KLSAgICAgIHRCVE1fU1BfRVZUX0RBVEEgdXNlcl9jZm1fcmVxX2V2dF9kYXRhOwotICAgICAgdXNlcl9jZm1fcmVxX2V2dF9kYXRhLmNmbV9yZXEuYmRfYWRkciA9Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoYWRkcmVzcy5HZXRBZGRyZXNzKCkpOwotICAgICAgdXNlcl9jZm1fcmVxX2V2dF9kYXRhLmNmbV9yZXEubnVtX3ZhbCA9IG51bWVyaWNfdmFsdWU7Ci0gICAgICAvLyBJZiB3ZSBwb3AgYSBkaWFsb2cgdGhlbiBpdCBpc24ndCBqdXN0X3dvcmtzCi0gICAgICB1c2VyX2NmbV9yZXFfZXZ0X2RhdGEuY2ZtX3JlcS5qdXN0X3dvcmtzID0gZGF0YS5Jc0p1c3RXb3JrcygpOwotCi0gICAgICBhZGRyZXNzX25hbWVfbWFwXy5lbXBsYWNlKGFkZHJlc3MsIGxlZ2FjeV9uYW1lKTsKLSAgICAgIG1lbWNweSgoY2hhciopdXNlcl9jZm1fcmVxX2V2dF9kYXRhLmNmbV9yZXEuYmRfbmFtZSwgbGVnYWN5X25hbWUubmFtZSwKLSAgICAgICAgICAgICBCRF9OQU1FX0xFTik7Ci0KLSAgICAgICgqYnRhX2NhbGxiYWNrc18tPnBfc3BfY2FsbGJhY2spKEJUTV9TUF9DRk1fUkVRX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyX2NmbV9yZXFfZXZ0X2RhdGEpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRGlzcGxheUNvbmZpcm1WYWx1ZShibHVldG9vdGg6OnNlY3VyaXR5OjpDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICB3YWl0aW5nX2Zvcl9wYWlyaW5nX3Byb21wdF8gPSBmYWxzZTsKLSAgICBkYXRhLlNldEp1c3RXb3JrcyhmYWxzZSk7Ci0gICAgSGFuZGxlQ29uZmlybShkYXRhKTsKLSAgfQotCi0gIHZvaWQgRGlzcGxheVllc05vRGlhbG9nKGJsdWV0b290aDo6c2VjdXJpdHk6OkNvbmZpcm1hdGlvbkRhdGEgZGF0YSkgewotICAgIHdhaXRpbmdfZm9yX3BhaXJpbmdfcHJvbXB0XyA9IGZhbHNlOwotICAgIGRhdGEuU2V0SnVzdFdvcmtzKHRydWUpOwotICAgIEhhbmRsZUNvbmZpcm0oZGF0YSk7Ci0gIH0KLQotICB2b2lkIERpc3BsYXlFbnRlclBhc3NrZXlEaWFsb2coYmx1ZXRvb3RoOjpzZWN1cml0eTo6Q29uZmlybWF0aW9uRGF0YSBkYXRhKSB7Ci0gICAgd2FpdGluZ19mb3JfcGFpcmluZ19wcm9tcHRfID0gZmFsc2U7Ci0gICAgTE9HX1dBUk4oIlVOSU1QTEVNRU5URUQsIFBhc3NrZXkgbm90IHN1cHBvcnRlZCBpbiBHRCIpOwotICB9Ci0KLSAgdm9pZCBEaXNwbGF5UGFzc2tleShibHVldG9vdGg6OnNlY3VyaXR5OjpDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICB3YWl0aW5nX2Zvcl9wYWlyaW5nX3Byb21wdF8gPSBmYWxzZTsKLSAgICBMT0dfV0FSTigiVU5JTVBMRU1FTlRFRCwgUGFzc2tleSBub3Qgc3VwcG9ydGVkIGluIEdEIik7Ci0gIH0KLQotICB2b2lkIERpc3BsYXlFbnRlclBpbkRpYWxvZyhibHVldG9vdGg6OnNlY3VyaXR5OjpDb25maXJtYXRpb25EYXRhIGRhdGEpIHsKLSAgICB3YWl0aW5nX2Zvcl9wYWlyaW5nX3Byb21wdF8gPSBmYWxzZTsKLSAgICBMT0dfV0FSTigiVU5JTVBMRU1FTlRFRCwgUElOIG5vdCBzdXBwb3J0ZWQgaW4gR0QiKTsKLSAgfQotCi0gIGJvb2wgd2FpdGluZ19mb3JfcGFpcmluZ19wcm9tcHRfID0gZmFsc2U7Ci0KLSBwcml2YXRlOgotICBTaGltVWkoKSA6IGJ0YV9jYWxsYmFja3NfKG51bGxwdHIpIHt9Ci0gIH5TaGltVWkoKSB7fQotICBjb25zdCB0QlRNX0FQUExfSU5GTyogYnRhX2NhbGxiYWNrc187Ci19OwotCi1TaGltVWkqIHNoaW1fdWlfID0gbnVsbHB0cjsKLQotY2xhc3MgU2hpbUJvbmRMaXN0ZW5lciA6IHB1YmxpYyBibHVldG9vdGg6OnNlY3VyaXR5OjpJU2VjdXJpdHlNYW5hZ2VyTGlzdGVuZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIFNoaW1Cb25kTGlzdGVuZXIqIEdldEluc3RhbmNlKCkgewotICAgIHN0YXRpYyBTaGltQm9uZExpc3RlbmVyIGluc3RhbmNlOwotICAgIHJldHVybiAmaW5zdGFuY2U7Ci0gIH0KLQotICBTaGltQm9uZExpc3RlbmVyKGNvbnN0IFNoaW1Cb25kTGlzdGVuZXImKSA9IGRlbGV0ZTsKLSAgU2hpbUJvbmRMaXN0ZW5lciYgb3BlcmF0b3I9KGNvbnN0IFNoaW1Cb25kTGlzdGVuZXImKSA9IGRlbGV0ZTsKLQotICB2b2lkIFNldEJ0YUNhbGxiYWNrcyhjb25zdCB0QlRNX0FQUExfSU5GTyogYnRhX2NhbGxiYWNrcykgewotICAgIGJ0YV9jYWxsYmFja3NfID0gYnRhX2NhbGxiYWNrczsKLSAgICBpZiAoYnRhX2NhbGxiYWNrcy0+cF9waW5fY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgcGluX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICAgIH0KLQotICAgIGlmIChidGFfY2FsbGJhY2tzLT5wX2xpbmtfa2V5X2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGxpbmtfa2V5X2NhbGxiYWNrIiwgX19mdW5jX18pOwotICAgIH0KLQotICAgIGlmIChidGFfY2FsbGJhY2tzLT5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgYXV0aF9jb21wbGV0ZV9jYWxsYmFjayIsIF9fZnVuY19fKTsKLSAgICB9Ci0KLSAgICBpZiAoYnRhX2NhbGxiYWNrcy0+cF9ib25kX2NhbmNlbF9jbXBsX2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGJvbmRfY2FuY2VsX2NvbXBsZXRlX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICAgIH0KLQotICAgIGlmIChidGFfY2FsbGJhY2tzLT5wX2xlX2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGxlX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICAgIH0KLQotICAgIGlmIChidGFfY2FsbGJhY2tzLT5wX2xlX2tleV9jYWxsYmFjayA9PSBudWxscHRyKSB7Ci0gICAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBsZV9rZXlfY2FsbGJhY2siLCBfX2Z1bmNfXyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPbkRldmljZUJvbmRlZChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgb3ZlcnJpZGUgewotICAgIC8vIENhbGwgc3BfY2JhY2sgZm9yIExJTktfS0VZX05PVElGSUNBVElPTgotICAgIC8vIENhbGwgQVVUSEVOVElDQVRJT05fQ09NUExFVEUgY2FsbGJhY2sKLSAgICBpZiAoZGV2aWNlLkdldEFkZHJlc3NUeXBlKCkgPT0KLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1MpIHsKLSAgICAgIGF1dG8gaXQgPSBhZGRyZXNzX25hbWVfbWFwXy5maW5kKGRldmljZSk7Ci0gICAgICBidF9iZG5hbWVfdCB0bXBfbmFtZTsKLSAgICAgIGlmIChpdCAhPSBhZGRyZXNzX25hbWVfbWFwXy5lbmQoKSkgewotICAgICAgICB0bXBfbmFtZSA9IGl0LT5zZWNvbmQ7Ci0gICAgICB9Ci0gICAgICBCRF9OQU1FIG5hbWU7Ci0gICAgICBtZW1jcHkoKGNoYXIqKW5hbWUsIHRtcF9uYW1lLm5hbWUsIEJEX05BTUVfTEVOKTsKLQotICAgICAgaWYgKCpidGFfY2FsbGJhY2tzXy0+cF9saW5rX2tleV9jYWxsYmFjaykgewotICAgICAgICBMaW5rS2V5IGtleTsgIC8vIE5ldmVyIHdhbnQgdG8gc2VuZCB0aGUga2V5IHRvIHRoZSBzdGFjawotICAgICAgICAoKmJ0YV9jYWxsYmFja3NfLT5wX2xpbmtfa2V5X2NhbGxiYWNrKSgKLSAgICAgICAgICAgIGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKGRldmljZS5HZXRBZGRyZXNzKCkpLCAwLCBuYW1lLCBrZXksCi0gICAgICAgICAgICBCVE1fTEtFWV9UWVBFX0NPTUJJTkFUSU9OKTsKLSAgICAgIH0KLSAgICAgIGlmICgqYnRhX2NhbGxiYWNrc18tPnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjaykgewotICAgICAgICAoKmJ0YV9jYWxsYmFja3NfLT5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2spKAotICAgICAgICAgICAgYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoZGV2aWNlLkdldEFkZHJlc3MoKSksIDAsIG5hbWUsIEhDSV9TVUNDRVNTKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBpc19nZF9lbmFibGVkID0gYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpOwotICAgIGlmIChpc19nZF9lbmFibGVkKSB7Ci0gICAgICBibHVldG9vdGg6OnNoaW06OkFsbG9jYXRlSWRGcm9tTWV0cmljSWRBbGxvY2F0b3IoCi0gICAgICAgICAgYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoZGV2aWNlLkdldEFkZHJlc3MoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKS5BbGxvY2F0ZUlkKAotICAgICAgICAgIGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKGRldmljZS5HZXRBZGRyZXNzKCkpKTsKLSAgICB9Ci0gICAgYm9vbCBpc19zYXZpbmdfc3VjY2Vzc2Z1bCA9Ci0gICAgICAgIGlzX2dkX2VuYWJsZWQgPyBibHVldG9vdGg6OnNoaW06OlNhdmVEZXZpY2VPbk1ldHJpY0lkQWxsb2NhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKGRldmljZS5HZXRBZGRyZXNzKCkpKQotICAgICAgICAgICAgICAgICAgICAgIDogTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuU2F2ZURldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhkZXZpY2UuR2V0QWRkcmVzcygpKSk7Ci0gICAgaWYgKCFpc19zYXZpbmdfc3VjY2Vzc2Z1bCkgewotICAgICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiOiBGYWlsIHRvIHNhdmUgbWV0cmljIGlkIGZvciBkZXZpY2UgIgotICAgICAgICAgICAgICAgICA8PCBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhkZXZpY2UuR2V0QWRkcmVzcygpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uRGV2aWNlVW5ib25kZWQoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBkZXZpY2UpIG92ZXJyaWRlIHsKLSAgICBpZiAoYnRhX2NhbGxiYWNrc18tPnBfYm9uZF9jYW5jZWxfY21wbF9jYWxsYmFjaykgewotICAgICAgKCpidGFfY2FsbGJhY2tzXy0+cF9ib25kX2NhbmNlbF9jbXBsX2NhbGxiYWNrKShCVE1fU1VDQ0VTUyk7Ci0gICAgfQotICAgIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6Rm9yZ2V0RGV2aWNlRnJvbU1ldHJpY0lkQWxsb2NhdG9yKAotICAgICAgICAgIGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKGRldmljZS5HZXRBZGRyZXNzKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgTWV0cmljSWRBbGxvY2F0b3I6OkdldEluc3RhbmNlKCkuRm9yZ2V0RGV2aWNlKAotICAgICAgICAgIGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKGRldmljZS5HZXRBZGRyZXNzKCkpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIE9uRGV2aWNlQm9uZEZhaWxlZChibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpzZWN1cml0eTo6UGFpcmluZ0ZhaWx1cmUgc3RhdHVzKSBvdmVycmlkZSB7Ci0gICAgYXV0byBpdCA9IGFkZHJlc3NfbmFtZV9tYXBfLmZpbmQoZGV2aWNlKTsKLSAgICBidF9iZG5hbWVfdCB0bXBfbmFtZTsKLSAgICBpZiAoaXQgIT0gYWRkcmVzc19uYW1lX21hcF8uZW5kKCkpIHsKLSAgICAgIHRtcF9uYW1lID0gaXQtPnNlY29uZDsKLSAgICB9Ci0gICAgQkRfTkFNRSBuYW1lOwotICAgIG1lbWNweSgoY2hhciopbmFtZSwgdG1wX25hbWUubmFtZSwgQkRfTkFNRV9MRU4pOwotCi0gICAgaWYgKGJ0YV9jYWxsYmFja3NfLT5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2spIHsKLSAgICAgICgqYnRhX2NhbGxiYWNrc18tPnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjaykoCi0gICAgICAgICAgYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoZGV2aWNlLkdldEFkZHJlc3MoKSksIDAsIG5hbWUsCi0gICAgICAgICAgSENJX0VSUl9BVVRIX0ZBSUxVUkUpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25FbmNyeXB0aW9uU3RhdGVDaGFuZ2VkKAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25DaGFuZ2VWaWV3IGVuY3J5cHRpb25fY2hhbmdlX3ZpZXcpIG92ZXJyaWRlIHsKLSAgICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBGaW5kIEJUQSBjYWxsYmFjayBmb3IgdGhpcyB0byBjYWxsCi0gIH0KLQotIHByaXZhdGU6Ci0gIFNoaW1Cb25kTGlzdGVuZXIoKSA6IGJ0YV9jYWxsYmFja3NfKG51bGxwdHIpIHt9Ci0gIH5TaGltQm9uZExpc3RlbmVyKCkge30KLSAgY29uc3QgdEJUTV9BUFBMX0lORk8qIGJ0YV9jYWxsYmFja3NfOwotfTsKLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU3RhcnRJbnF1aXJ5KHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY21wbF9jYikgewotICBDSEVDSyhwX3Jlc3VsdHNfY2IgIT0gbnVsbHB0cik7Ci0gIENIRUNLKHBfY21wbF9jYiAhPSBudWxscHRyKTsKLQotICB0QlRNX0lOUV9QQVJNUyBpbnFwYXJtcyA9IHt9OwotICBpbnFwYXJtcy5tb2RlID0gQlRNX0dFTkVSQUxfSU5RVUlSWSB8IEJUTV9CTEVfR0VORVJBTF9JTlFVSVJZOwotICBpbnFwYXJtcy5kdXJhdGlvbiA9IEJUSUZfRE1fREVGQVVMVF9JTlFfTUFYX0RVUkFUSU9OOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJ0bV9jYl9tdXRleF8pOwotCi0gIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mby5udW1fcmVzcCA9IDA7Ci0KLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TdGFydEFjdGl2ZVNjYW5uaW5nKCk7Ci0gIGlmIChpbnFwYXJtcy5kdXJhdGlvbiAhPSAwKSB7Ci0gICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TZXRTY2FubmluZ1RpbWVyKAotICAgICAgICBpbnFwYXJtcy5kdXJhdGlvbiAqIDEwMDAsIGNvbW1vbjo6QmluZE9uY2UoW10oKSB7Ci0gICAgICAgICAgTE9HX0lORk8oIiVzIHNjYW5uaW5nIHRpbWVvdXQgcG9wcGVkIiwgX19mdW5jX18pOwotICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJ0bV9jYl9tdXRleF8pOwotICAgICAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RvcEFjdGl2ZVNjYW5uaW5nKCk7Ci0gICAgICAgIH0pKTsKLSAgfQotCi0gIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RhcnRBY3RpdmVTY2FubmluZygpOwotCi0gIHVpbnQ4X3QgY2xhc3NpY19tb2RlID0gaW5xcGFybXMubW9kZSAmIDB4MGY7Ci0gIGlmICghU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TdGFydElucXVpcnkoCi0gICAgICAgICAgY2xhc3NpY19tb2RlLCBpbnFwYXJtcy5kdXJhdGlvbiwgMCwKLSAgICAgICAgICBbXSh0QlRNX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgaW5xdWlyeV9tb2RlKSB7Ci0gICAgICAgICAgICBMT0dfSU5GTygiJXMgSW5xdWlyeSBpcyBjb21wbGV0ZSBzdGF0dXM6JWhkIGlucXVpcnlfbW9kZTolaGhkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIGlucXVpcnlfbW9kZSk7Ci0gICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLmlucXBhcm1zLm1vZGUgJj0gfihpbnF1aXJ5X21vZGUpOwotCi0gICAgICAgICAgICBidG1fYWNsX3VwZGF0ZV9pbnF1aXJ5X3N0YXR1cyhCVE1fSU5RVUlSWV9DT01QTEVURSk7Ci0gICAgICAgICAgICBpZiAoYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlKSB7Ci0gICAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mby5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgICAgICAgIGJ0bV9jbGVhcl9hbGxfcGVuZGluZ19sZV9lbnRyeSgpOwotICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLnN0YXRlID0gQlRNX0lOUV9JTkFDVElWRV9TVEFURTsKLQotICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgc28gdGhlIHN0YXJ0IG9mIGEgbmV4dCBpbnF1aXJ5IGhhcyBhIG5ldyBjb3VudCAqLwotICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jb3VudGVyKys7Ci0KLSAgICAgICAgICAgICAgYnRtX2Nscl9pbnFfcmVzdWx0X2ZsdCgpOwotCi0gICAgICAgICAgICAgIGlmICgoc3RhdHVzID09IEJUTV9TVUNDRVNTKSAmJgotICAgICAgICAgICAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAtPnN1cHBvcnRzX3Jzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgIGJ0bV9zb3J0X2lucV9yZXN1bHQoKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2FjdGl2ZSA9IEJUTV9JTlFVSVJZX0lOQUNUSVZFOwotICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX3Jlc3VsdHNfY2IgPSBudWxscHRyOwotICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IgPSBudWxscHRyOwotCi0gICAgICAgICAgICAgIGlmIChidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIExPR19JTkZPKCIlcyBTZW5kaW5nIGlucXVpcnkgY29tcGxldGlvbiB0byB1cHBlciBsYXllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIChidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IpKAotICAgICAgICAgICAgICAgICAgICAodEJUTV9JTlFVSVJZX0NNUEwqKSZidG1fY2IuYnRtX2lucV92YXJzLmlucV9jbXBsX2luZm8pOwotICAgICAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMucF9pbnFfY21wbF9jYiA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KSkgewotICAgIExPR19XQVJOKCIlcyBVbmFibGUgdG8gc3RhcnQgaW5xdWlyeSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRNX0VSUl9QUk9DRVNTSU5HOwotICB9Ci0KLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5zdGF0ZSA9IEJUTV9JTlFfQUNUSVZFX1NUQVRFOwotICBidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IgPSBwX2NtcGxfY2I7Ci0gIGJ0bV9jYi5idG1faW5xX3ZhcnMucF9pbnFfcmVzdWx0c19jYiA9IHBfcmVzdWx0c19jYjsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlID0gaW5xcGFybXMubW9kZTsKLQotICBidG1fYWNsX3VwZGF0ZV9pbnF1aXJ5X3N0YXR1cyhCVE1fSU5RVUlSWV9TVEFSVEVEKTsKLQotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXREaXNjb3ZlcmFiaWxpdHkodWludDE2X3QgZGlzY292ZXJhYmxlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsKSB7Ci0gIHVpbnQxNl90IGNsYXNzaWNfZGlzY292ZXJhYmxlX21vZGUgPSBkaXNjb3ZlcmFibGVfbW9kZSAmIDB4ZmY7Ci0gIHVpbnQxNl90IGxlX2Rpc2NvdmVyYWJsZV9tb2RlID0gZGlzY292ZXJhYmxlX21vZGUgPj4gODsKLQotICBpZiAod2luZG93ID09IDApIHdpbmRvdyA9IEJUTV9ERUZBVUxUX0RJU0NfV0lORE9XOwotICBpZiAoaW50ZXJ2YWwgPT0gMCkgaW50ZXJ2YWwgPSBCVE1fREVGQVVMVF9ESVNDX0lOVEVSVkFMOwotCi0gIHN3aXRjaCAobGVfZGlzY292ZXJhYmxlX21vZGUpIHsKLSAgICBjYXNlIGtEaXNjb3ZlcmFibGVNb2RlT2ZmOgotICAgICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TdG9wQWR2ZXJ0aXNpbmcoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0xpbWl0ZWREaXNjb3ZlcmFibGVNb2RlOgotICAgIGNhc2Uga0dlbmVyYWxEaXNjb3ZlcmFibGVNb2RlOgotICAgICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TdGFydEFkdmVydGlzaW5nKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIiVzIFVuZXhwZWN0ZWQgbGUgZGlzY292ZXJhYmlsaXR5IG1vZGU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgIGxlX2Rpc2NvdmVyYWJsZV9tb2RlKTsKLSAgfQotCi0gIHN3aXRjaCAoY2xhc3NpY19kaXNjb3ZlcmFibGVfbW9kZSkgewotICAgIGNhc2Uga0Rpc2NvdmVyYWJsZU1vZGVPZmY6Ci0gICAgICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlNldENsYXNzaWNEaXNjb3ZlcmFiaWxpdHlPZmYoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0xpbWl0ZWREaXNjb3ZlcmFibGVNb2RlOgotICAgICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TZXRDbGFzc2ljTGltaXRlZERpc2NvdmVyYWJpbGl0eSgKLSAgICAgICAgICB3aW5kb3csIGludGVydmFsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0dlbmVyYWxEaXNjb3ZlcmFibGVNb2RlOgotICAgICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TZXRDbGFzc2ljR2VuZXJhbERpc2NvdmVyYWJpbGl0eSgKLSAgICAgICAgICB3aW5kb3csIGludGVydmFsKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigiJXMgVW5leHBlY3RlZCBjbGFzc2ljIGRpc2NvdmVyYWJpbGl0eSBtb2RlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICBjbGFzc2ljX2Rpc2NvdmVyYWJsZV9tb2RlKTsKLSAgfQotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fRW5hYmxlSW50ZXJsYWNlZElucXVpcnlTY2FuKCkgewotICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlNldEludGVybGFjZWRJbnF1aXJ5U2NhbigpOwotfQotCi10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVPYnNlcnZlKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb25fc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKSB7Ci0gIGlmIChzdGFydCkgewotICAgIENIRUNLKHBfcmVzdWx0c19jYiAhPSBudWxscHRyKTsKLSAgICBDSEVDSyhwX2NtcGxfY2IgIT0gbnVsbHB0cik7Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhidG1fY2JfbXV0ZXhfKTsKLQotICAgIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pc19ibGVfb2JzZXJ2ZV9hY3RpdmUoKSkgewotICAgICAgaWYgKGR1cmF0aW9uX3NlYyA9PSAwKSB7Ci0gICAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+Q2FuY2VsT2JzZXJ2aW5nVGltZXIoKTsKLSAgICAgICAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLSAgICAgIH0KLSAgICAgIExPR19XQVJOKCIlcyBPYnNlcnZpbmcgYWxyZWFkeSBhY3RpdmUiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gQlRNX1dST05HX01PREU7Ci0gICAgfQotCi0gICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vYnNfcmVzdWx0c19jYiA9IHBfcmVzdWx0c19jYjsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5wX29ic19jbXBsX2NiID0gcF9jbXBsX2NiOwotICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RhcnRPYnNlcnZpbmcoKTsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5zZXRfYmxlX29ic2VydmVfYWN0aXZlKCk7Ci0KLSAgICBpZiAoZHVyYXRpb25fc2VjICE9IDApIHsKLSAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U2V0T2JzZXJ2aW5nVGltZXIoCi0gICAgICAgICAgZHVyYXRpb25fc2VjICogMTAwMCwgY29tbW9uOjpCaW5kT25jZShbXSgpIHsKLSAgICAgICAgICAgIExPR19JTkZPKCIlcyBvYnNlcnZpbmcgdGltZW91dCBwb3BwZWQiLCBfX2Z1bmNfXyk7Ci0KLSAgICAgICAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+Q2FuY2VsT2JzZXJ2aW5nVGltZXIoKTsKLSAgICAgICAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RvcE9ic2VydmluZygpOwotCi0gICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhidG1fY2JfbXV0ZXhfKTsKLSAgICAgICAgICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnJlc2V0X2JsZV9vYnNlcnZlKCk7Ci0KLSAgICAgICAgICAgIGlmIChidG1fY2IuYmxlX2N0cl9jYi5wX29ic19jbXBsX2NiKSB7Ci0gICAgICAgICAgICAgIChidG1fY2IuYmxlX2N0cl9jYi5wX29ic19jbXBsX2NiKSgKLSAgICAgICAgICAgICAgICAgICZidG1fY2IuYnRtX2lucV92YXJzLmlucV9jbXBsX2luZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vYnNfcmVzdWx0c19jYiA9IG51bGxwdHI7Ci0gICAgICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5wX29ic19jbXBsX2NiID0gbnVsbHB0cjsKLQotICAgICAgICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFwYXJtcy5tb2RlICY9IH4oQlRNX0JMRV9JTlFVSVJZX01BU0spOwotCi0gICAgICAgICAgICBidG1fYWNsX3VwZGF0ZV9pbnF1aXJ5X3N0YXR1cyhCVE1fSU5RVUlSWV9DT01QTEVURSk7Ci0KLSAgICAgICAgICAgIGJ0bV9jbGVhcl9hbGxfcGVuZGluZ19sZV9lbnRyeSgpOwotICAgICAgICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5zdGF0ZSA9IEJUTV9JTlFfSU5BQ1RJVkVfU1RBVEU7Ci0KLSAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NvdW50ZXIrKzsKLSAgICAgICAgICAgIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQoKTsKLSAgICAgICAgICAgIGJ0bV9zb3J0X2lucV9yZXN1bHQoKTsKLQotICAgICAgICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlID0gQlRNX0lOUVVJUllfSU5BQ1RJVkU7Ci0gICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX3Jlc3VsdHNfY2IgPSBOVUxMOwotICAgICAgICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5wX2lucV9jbXBsX2NiID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKGJ0bV9jYi5idG1faW5xX3ZhcnMucF9pbnFfY21wbF9jYikgewotICAgICAgICAgICAgICAoYnRtX2NiLmJ0bV9pbnFfdmFycy5wX2lucV9jbXBsX2NiKSgKLSAgICAgICAgICAgICAgICAgICh0QlRNX0lOUVVJUllfQ01QTCopJmJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mbyk7Ci0gICAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMucF9pbnFfY21wbF9jYiA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhidG1fY2JfbXV0ZXhfKTsKLQotICAgIGlmICghYnRtX2NiLmJsZV9jdHJfY2IuaXNfYmxlX29ic2VydmVfYWN0aXZlKCkpIHsKLSAgICAgIExPR19XQVJOKCIlcyBPYnNlcnZpbmcgYWxyZWFkeSBpbmFjdGl2ZSIsIF9fZnVuY19fKTsKLSAgICB9Ci0gICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5DYW5jZWxPYnNlcnZpbmdUaW1lcigpOwotICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RvcE9ic2VydmluZygpOwotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnJlc2V0X2JsZV9vYnNlcnZlKCk7Ci0gICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TdG9wT2JzZXJ2aW5nKCk7Ci0gICAgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLnBfb2JzX2NtcGxfY2IpIHsKLSAgICAgIChidG1fY2IuYmxlX2N0cl9jYi5wX29ic19jbXBsX2NiKSgmYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfY21wbF9pbmZvKTsKLSAgICB9Ci0gICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vYnNfcmVzdWx0c19jYiA9IG51bGxwdHI7Ci0gICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vYnNfY21wbF9jYiA9IG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVPcHBvcnR1bmlzdGljT2JzZXJ2ZSgKLSAgICBib29sIGVuYWJsZSwgdEJUTV9JTlFfUkVTVUxUU19DQiogcF9yZXN1bHRzX2NiKSB7Ci0gIGlmIChlbmFibGUpIHsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5wX29wcG9ydHVuaXN0aWNfb2JzX3Jlc3VsdHNfY2IgPSBwX3Jlc3VsdHNfY2I7Ci0gIH0gZWxzZSB7Ci0gICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vcHBvcnR1bmlzdGljX29ic19yZXN1bHRzX2NiID0gbnVsbHB0cjsKLSAgfQotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0VuYWJsZUludGVybGFjZWRQYWdlU2NhbigpIHsKLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TZXRJbnRlcmxhY2VkUGFnZVNjYW4oKTsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0SW5xdWlyeU1vZGUodWludDhfdCBpbnF1aXJ5X21vZGUpIHsKLSAgc3dpdGNoIChpbnF1aXJ5X21vZGUpIHsKLSAgICBjYXNlIGtTdGFuZGFyZElucXVpcnlSZXN1bHQ6Ci0gICAgICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlNldFN0YW5kYXJkSW5xdWlyeVJlc3VsdE1vZGUoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0lucXVpcnlSZXN1bHRXaXRoUnNzaToKLSAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U2V0SW5xdWlyeVdpdGhSc3NpUmVzdWx0TW9kZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrRXh0ZW5kZWRJbnF1aXJ5UmVzdWx0OgotICAgICAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5TZXRFeHRlbmRlZElucXVpcnlSZXN1bHRNb2RlKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUTV9JTExFR0FMX1ZBTFVFOwotICB9Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0Q29ubmVjdGFiaWxpdHkodWludDE2X3QgcGFnZV9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwpIHsKLSAgdWludDE2X3QgY2xhc3NpY19jb25uZWN0aWJsZV9tb2RlID0gcGFnZV9tb2RlICYgMHhmZjsKLSAgdWludDE2X3QgbGVfY29ubmVjdGlibGVfbW9kZSA9IHBhZ2VfbW9kZSA+PiA4OwotCi0gIGlmICghd2luZG93KSB3aW5kb3cgPSBCVE1fREVGQVVMVF9DT05OX1dJTkRPVzsKLSAgaWYgKCFpbnRlcnZhbCkgaW50ZXJ2YWwgPSBCVE1fREVGQVVMVF9DT05OX0lOVEVSVkFMOwotCi0gIHN3aXRjaCAobGVfY29ubmVjdGlibGVfbW9kZSkgewotICAgIGNhc2Uga0Nvbm5lY3RpYmxlTW9kZU9mZjoKLSAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RvcENvbm5lY3RhYmlsaXR5KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtDb25uZWN0aWJsZU1vZGVPbjoKLSAgICAgIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RhcnRDb25uZWN0YWJpbGl0eSgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBCVE1fSUxMRUdBTF9WQUxVRTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc3dpdGNoIChjbGFzc2ljX2Nvbm5lY3RpYmxlX21vZGUpIHsKLSAgICBjYXNlIGtDb25uZWN0aWJsZU1vZGVPZmY6Ci0gICAgICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlNldENsYXNzaWNDb25uZWN0aWJsZU9mZigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ29ubmVjdGlibGVNb2RlT246Ci0gICAgICBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlNldENsYXNzaWNDb25uZWN0aWJsZU9uKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUTV9JTExFR0FMX1ZBTFVFOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi11aW50MTZfdCBibHVldG9vdGg6OnNoaW06OkJUTV9Jc0lucXVpcnlBY3RpdmUodm9pZCkgewotICBpZiAoU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5Jc0dlbmVyYWxJbnF1aXJ5QWN0aXZlKCkpIHsKLSAgICByZXR1cm4gQlRNX0dFTkVSQUxfSU5RVUlSWV9BQ1RJVkU7Ci0gIH0KLSAgcmV0dXJuIEJUTV9JTlFVSVJZX0lOQUNUSVZFOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0NhbmNlbElucXVpcnkodm9pZCkgewotICBMT0dfSU5GTygiJXMgQ2FuY2VsIGlucXVpcnkiLCBfX2Z1bmNfXyk7Ci0gIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+Q2FuY2VsSW5xdWlyeSgpOwotCi0gIGJ0bV9jYi5idG1faW5xX3ZhcnMuc3RhdGUgPSBCVE1fSU5RX0lOQUNUSVZFX1NUQVRFOwotICBidG1fY2xyX2lucV9yZXN1bHRfZmx0KCk7Ci0KLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5DYW5jZWxTY2FubmluZ1RpbWVyKCk7Ci0gIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+U3RvcEFjdGl2ZVNjYW5uaW5nKCk7Ci0KLSAgYnRtX2NiLmJsZV9jdHJfY2IucmVzZXRfYmxlX2lucXVpcnkoKTsKLQotICBidG1fY2IuYnRtX2lucV92YXJzLmlucXBhcm1zLm1vZGUgJj0KLSAgICAgIH4oYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFwYXJtcy5tb2RlICYgQlRNX0JMRV9JTlFVSVJZX01BU0spOwotCi0gIGJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzKEJUTV9JTlFVSVJZX0NPTVBMRVRFKTsKLSAgLyogSWdub3JlIGFueSBzdHJheSBvciBsYXRlIGNvbXBsZXRlIG1lc3NhZ2VzIGlmIHRoZSBpbnF1aXJ5IGlzIG5vdCBhY3RpdmUgKi8KLSAgaWYgKGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2FjdGl2ZSkgewotICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mby5zdGF0dXMgPSBCVE1fU1VDQ0VTUzsKLSAgICBidG1fY2xlYXJfYWxsX3BlbmRpbmdfbGVfZW50cnkoKTsKLQotICAgIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfcnNzaV93aXRoX2lucXVpcnlfcmVzdWx0cygpKSB7Ci0gICAgICBidG1fc29ydF9pbnFfcmVzdWx0KCk7Ci0gICAgfQotCi0gICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlID0gQlRNX0lOUVVJUllfSU5BQ1RJVkU7Ci0gICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5wX2lucV9yZXN1bHRzX2NiID0gbnVsbHB0cjsKLSAgICBidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IgPSBudWxscHRyOwotICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NvdW50ZXIrKzsKLQotICAgIGlmIChidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IgIT0gbnVsbHB0cikgewotICAgICAgTE9HX0lORk8oIiVzIFNlbmRpbmcgY2FuY2VsIGlucXVpcnkgY29tcGxldGlvbiB0byB1cHBlciBsYXllciIsIF9fZnVuY19fKTsKLSAgICAgIChidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IpKAotICAgICAgICAgICh0QlRNX0lOUVVJUllfQ01QTCopJmJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mbyk7Ci0gICAgICBidG1fY2IuYnRtX2lucV92YXJzLnBfaW5xX2NtcGxfY2IgPSBudWxscHRyOwotICAgIH0KLSAgfQotfQotCi10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdEJUTV9DTVBMX0NCKiBjYWxsYmFjaywKLSAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBDSEVDSyhjYWxsYmFjayAhPSBudWxscHRyKTsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX05PX1JFU09VUkNFUzsKLQotICBzd2l0Y2ggKHRyYW5zcG9ydCkgewotICAgIGNhc2UgQlRfVFJBTlNQT1JUX0xFOgotICAgICAgc3RhdHVzID0gU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5SZWFkTGVSZW1vdGVEZXZpY2VOYW1lKAotICAgICAgICAgIHJhd19hZGRyZXNzLCBjYWxsYmFjayk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1RSQU5TUE9SVF9CUl9FRFI6Ci0gICAgICBzdGF0dXMgPSBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlJlYWRDbGFzc2ljUmVtb3RlRGV2aWNlTmFtZSgKLSAgICAgICAgICByYXdfYWRkcmVzcywgY2FsbGJhY2spOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCIlcyBVbnNwZWNpZmllZCB0cmFuc3BvcnQ6JWQiLCBfX2Z1bmNfXywgdHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUodm9pZCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5DYW5jZWxBbGxSZWFkUmVtb3RlRGV2aWNlTmFtZSgpOwotfQotCi10QlRNX0lOUV9JTkZPKiBibHVldG9vdGg6OnNoaW06OkJUTV9JbnFEYlJlYWQoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi10QlRNX0lOUV9JTkZPKiBibHVldG9vdGg6OnNoaW06OkJUTV9JbnFEYkZpcnN0KHZvaWQpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi10QlRNX0lOUV9JTkZPKiBibHVldG9vdGg6OnNoaW06OkJUTV9JbnFEYk5leHQodEJUTV9JTlFfSU5GTyogcF9jdXIpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfY3VyICE9IG51bGxwdHIpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQ2xlYXJJbnFEYihjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSkgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgaWYgKHBfYmRhID09IG51bGxwdHIpIHsKLSAgICAvLyBjbGVhciBhbGwgZW50cmllcwotICB9IGVsc2UgewotICAgIC8vIGNsZWFyIHNwZWNpZmljIGVudHJ5Ci0gIH0KLSAgcmV0dXJuIEJUTV9OT19SRVNPVVJDRVM7Ci19Ci0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX1dyaXRlRUlSKEJUX0hEUiogcF9idWZmKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICBDSEVDSyhwX2J1ZmYgIT0gbnVsbHB0cik7Ci0gIG9zaV9mcmVlKHBfYnVmZik7Ci0gIHJldHVybiBCVE1fTk9fUkVTT1VSQ0VTOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX0hhc0VpclNlcnZpY2UoY29uc3QgdWludDMyX3QqIHBfZWlyX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdXVpZDE2KSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICBDSEVDSyhwX2Vpcl91dWlkICE9IG51bGxwdHIpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRCVE1fRUlSX1NFQVJDSF9SRVNVTFQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fSGFzSW5xdWlyeUVpclNlcnZpY2UoCi0gICAgdEJUTV9JTlFfUkVTVUxUUyogcF9yZXN1bHRzLCB1aW50MTZfdCB1dWlkMTYpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfcmVzdWx0cyAhPSBudWxscHRyKTsKLSAgcmV0dXJuIEJUTV9FSVJfVU5LTk9XTjsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9BZGRFaXJTZXJ2aWNlKHVpbnQzMl90KiBwX2Vpcl91dWlkLCB1aW50MTZfdCB1dWlkMTYpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfZWlyX3V1aWQgIT0gbnVsbHB0cik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVtb3ZlRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1dWlkMTYpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfZWlyX3V1aWQgIT0gbnVsbHB0cik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkQmxlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkQmxlS2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFIGtleV90eXBlKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICBDSEVDSyhwX2xlX2tleSAhPSBudWxscHRyKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVMb2FkTG9jYWxLZXlzKHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfTE9DQUxfS0VZUyogcF9rZXkpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfa2V5ICE9IG51bGxwdHIpOwotfQotCi1zdGF0aWMgT2N0ZXQxNiBib2d1c19yb290OwotCi0vKiogUmV0dXJucyBsb2NhbCBkZXZpY2UgZW5jcnlwdGlvbiByb290IChFUikgKi8KLWNvbnN0IE9jdGV0MTYmIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZUVuY1Jvb3QoKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYm9ndXNfcm9vdDsKLX0KLQotLyoqIFJldHVybnMgbG9jYWwgZGV2aWNlIGlkZW50aXR5IHJvb3QgKElSKS4gKi8KLWNvbnN0IE9jdGV0MTYmIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZUlEUm9vdCgpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBib2d1c19yb290OwotfQotCi0vKiogUmV0dXJuIGxvY2FsIGRldmljZSBESEsuICovCi1jb25zdCBPY3RldDE2JiBibHVldG9vdGg6OnNoaW06OkJUTV9HZXREZXZpY2VESEsoKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYm9ndXNfcm9vdDsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkQ29ubmVjdGlvbkFkZHIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGxvY2FsX2Nvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0socF9hZGRyX3R5cGUgIT0gbnVsbHB0cik7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICBDSEVDSyhwX2FkZHJfdHlwZSAhPSBudWxscHRyKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY3VyaXR5R3JhbnQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcykgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVPb2JEYXRhUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzLCB1aW50OF90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0socF9kYXRhICE9IG51bGxwdHIpOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNlY3VyZUNvbm5lY3Rpb25Pb2JEYXRhUmVwbHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCogcF9jLCB1aW50OF90KiBwX3IpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfYyAhPSBudWxscHRyKTsKLSAgQ0hFQ0socF9yICE9IG51bGxwdHIpOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNldENvbm5TY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYW5fd2luZG93KSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNldFByZWZDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVhZERldkluZm8oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFKiBwX2Rldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfZGV2X3R5cGUgIT0gbnVsbHB0cik7Ci0gIENIRUNLKHBfYWRkcl90eXBlICE9IG51bGxwdHIpOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzKAotICAgIFJhd0FkZHJlc3MqIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICBDSEVDSyhyZW1vdGVfYmRhICE9IG51bGxwdHIpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlUmVjZWl2ZXJUZXN0KHVpbnQ4X3QgcnhfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0socF9jbWRfY21wbF9jYmFjayAhPSBudWxscHRyKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVUcmFuc21pdHRlclRlc3QodWludDhfdCB0eF9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0ZXN0X2RhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYWNrZXRfcGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0socF9jbWRfY21wbF9jYmFjayAhPSBudWxscHRyKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVUZXN0RW5kKHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0socF9jbWRfY21wbF9jYmFjayAhPSBudWxscHRyKTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9Vc2VMZUxpbmsoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+VXNlTGVMaW5rKHJhd19hZGRyZXNzKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVSZWFkUGh5KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHksIHVpbnQ4X3Qgc3RhdHVzKT4gY2IpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlU2V0UGh5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgdHhfcGh5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5cywgdWludDE2X3QgcGh5X29wdGlvbnMpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlRGF0YVNpZ25hdHVyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfdGV4dCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMRV9TSUdOQVRVUkUgc2lnbmF0dXJlKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICBDSEVDSyhwX3RleHQgIT0gbnVsbHB0cik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVWZXJpZnlTaWduYXR1cmUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfb3JpZywgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfY29tcCkgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgQ0hFQ0socF9vcmlnICE9IG51bGxwdHIpOwotICBDSEVDSyhwX2NvbXAgIT0gbnVsbHB0cik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9HZXRMZVNlY3VyaXR5U3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbGVfZGV2X3NlY19mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbGVfa2V5X3NpemUpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIENIRUNLKHBfbGVfZGV2X3NlY19mbGFncyAhPSBudWxscHRyKTsKLSAgQ0hFQ0socF9sZV9rZXlfc2l6ZSAhPSBudWxscHRyKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNlY3VyaXR5UHJvY2VkdXJlSXNSdW5uaW5nKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdWludDhfdCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVHZXRTdXBwb3J0ZWRLZXlTaXplKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlKGFkZCxkZWxldGUgb3IgY2xlYXIpIHRoZSBhZHYgbG9jYWwgbmFtZSBmaWx0ZXJpbmcKLSAqIGNvbmRpdGlvbi4KLSAqLwotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9MRV9QRl9sb2NhbF9uYW1lKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0xFX1BGX3NydmNfZGF0YSh0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4KSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0xFX1BGX21hbnVfZGF0YSgKLSAgICB0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLCB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgdWludDE2X3QgY29tcGFueV9pZCwgdWludDE2X3QgY29tcGFueV9pZF9tYXNrLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfbWFzaywgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0xFX1BGX3NydmNfZGF0YV9wYXR0ZXJuKAotICAgIHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX21hc2ssCi0gICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0xFX1BGX2FkZHJfZmlsdGVyKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9CRF9BRERSIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9MRV9QRl91dWlkX2ZpbHRlcih0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NPTkRfVFlQRSBmaWx0ZXJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9MT0dJQ19UWVBFIGNvbmRfbG9naWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fTEVfUEZfc2V0KHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFwY2ZDb21tYW5kPiBjb21tYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9MRV9QRl9jbGVhcih0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwKAotICAgIHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8YnRnYXR0X2ZpbHRfcGFyYW1fc2V0dXBfdD4gcF9maWx0X3BhcmFtcywKLSAgICB0QlRNX0JMRV9QRl9QQVJBTV9DQiBjYikgewotICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVVcGRhdGVBZHZGaWx0ZXJQb2xpY3kodEJUTV9CTEVfQUZQIGFkdl9wb2xpY3kpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUoCi0gICAgdWludDhfdCBlbmFibGUsIHRCVE1fQkxFX1BGX1NUQVRVU19DQkFDSyBwX3N0YXRfY2JhY2spIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXVpbnQ4X3QgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5HZXROdW1iZXJPZkFkdmVydGlzaW5nSW5zdGFuY2VzKCk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlTG9jYWxQcml2YWN5RW5hYmxlZCh2b2lkKSB7Ci0gIHJldHVybiBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX3ByaXZhY3koKTsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGUpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRCdG0oKS0+Q3JlYXRlQm9uZChiZF9hZGRyLCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBkZXZpY2VfdHlwZSk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVnaXN0ZXIoY29uc3QgdEJUTV9BUFBMX0lORk8qIGJ0YV9jYWxsYmFja3MpIHsKLSAgQ0hFQ0soYnRhX2NhbGxiYWNrcyAhPSBudWxscHRyKTsKLSAgTE9HX0lORk8oIiVzIFJlZ2lzdGVyaW5nIHNlY3VyaXR5IGFwcGxpY2F0aW9uIiwgX19mdW5jX18pOwotCi0gIGlmIChidGFfY2FsbGJhY2tzLT5wX3Bpbl9jYWxsYmFjayA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgcGluX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICB9Ci0KLSAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfbGlua19rZXlfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGxpbmtfa2V5X2NhbGxiYWNrIiwgX19mdW5jX18pOwotICB9Ci0KLSAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjayA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgYXV0aF9jb21wbGV0ZV9jYWxsYmFjayIsIF9fZnVuY19fKTsKLSAgfQotCi0gIGlmIChidGFfY2FsbGJhY2tzLT5wX2JvbmRfY2FuY2VsX2NtcGxfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGJvbmRfY2FuY2VsX2NvbXBsZXRlX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICB9Ci0KLSAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfbGVfY2FsbGJhY2sgPT0gbnVsbHB0cikgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGxlX2NhbGxiYWNrIiwgX19mdW5jX18pOwotICB9Ci0KLSAgaWYgKGJ0YV9jYWxsYmFja3MtPnBfbGVfa2V5X2NhbGxiYWNrID09IG51bGxwdHIpIHsKLSAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyBsZV9rZXlfY2FsbGJhY2siLCBfX2Z1bmNfXyk7Ci0gIH0KLQotICBTaGltQm9uZExpc3RlbmVyOjpHZXRJbnN0YW5jZSgpLT5TZXRCdGFDYWxsYmFja3MoYnRhX2NhbGxiYWNrcyk7Ci0KLSAgYmx1ZXRvb3RoOjpzaGltOjpHZXRTZWN1cml0eU1vZHVsZSgpCi0gICAgICAtPkdldFNlY3VyaXR5TWFuYWdlcigpCi0gICAgICAtPlJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihTaGltQm9uZExpc3RlbmVyOjpHZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRHZFNoaW1IYW5kbGVyKCkpOwotCi0gIFNoaW1VaTo6R2V0SW5zdGFuY2UoKS0+U2V0QnRhQ2FsbGJhY2tzKGJ0YV9jYWxsYmFja3MpOwotCi0gIGJsdWV0b290aDo6c2hpbTo6R2V0U2VjdXJpdHlNb2R1bGUoKQotICAgICAgLT5HZXRTZWN1cml0eU1hbmFnZXIoKQotICAgICAgLT5TZXRVc2VySW50ZXJmYWNlSGFuZGxlcihTaGltVWk6OkdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6c2hpbTo6R2V0R2RTaGltSGFuZGxlcigpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQm9uZENhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGlmIChTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPkNhbmNlbEJvbmQoYmRfYWRkcikpIHsKLSAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gIH0KLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZfY2xhc3MsIEJEX05BTUUgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGZlYXR1cmVzLCBMaW5rS2V5KiBsaW5rX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsIHVpbnQ4X3QgcGluX2xlbmd0aCkgewotICAvLyBDaGVjayBpZiBHRCBoYXMgYSBzZWN1cml0eSByZWNvcmQgZm9yIHRoZSBkZXZpY2UKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0RlbGV0ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPlJlbW92ZUJvbmQoYmRfYWRkcik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQ29uZmlybVJlcVJlcGx5KHRCVE1fU1RBVFVTIHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gU2VuZCBmb3IgYm90aCBDbGFzc2ljIGFuZCBMRSB1bnRpbCB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSB0eXBlCi0gIGJvb2wgYWNjZXB0ID0gcmVzID09IEJUTV9TVUNDRVNTOwotICBoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzID0gVG9BZGRyZXNzV2l0aFR5cGUoYmRfYWRkciwgMCk7Ci0gIGhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MyID0gVG9BZGRyZXNzV2l0aFR5cGUoYmRfYWRkciwgMSk7Ci0gIGF1dG8gc2VjdXJpdHlfbWFuYWdlciA9Ci0gICAgICBibHVldG9vdGg6OnNoaW06OkdldFNlY3VyaXR5TW9kdWxlKCktPkdldFNlY3VyaXR5TWFuYWdlcigpOwotICBpZiAoU2hpbVVpOjpHZXRJbnN0YW5jZSgpLT53YWl0aW5nX2Zvcl9wYWlyaW5nX3Byb21wdF8pIHsKLSAgICBMT0coSU5GTykgPDwgImludGVycHJldGluZyBjb25maXJtYXRpb24gYXMgcGFpcmluZyBhY2NlcHQgIiA8PCBhZGRyZXNzOwotICAgIHNlY3VyaXR5X21hbmFnZXItPk9uUGFpcmluZ1Byb21wdEFjY2VwdGVkKGFkZHJlc3MsIGFjY2VwdCk7Ci0gICAgc2VjdXJpdHlfbWFuYWdlci0+T25QYWlyaW5nUHJvbXB0QWNjZXB0ZWQoYWRkcmVzczIsIGFjY2VwdCk7Ci0gICAgU2hpbVVpOjpHZXRJbnN0YW5jZSgpLT53YWl0aW5nX2Zvcl9wYWlyaW5nX3Byb21wdF8gPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBMT0coSU5GTykgPDwgImludGVycHJldGluZyBjb25maXJtYXRpb24gYXMgeWVzL25vIGNvbmZpcm1hdGlvbiAiIDw8IGFkZHJlc3M7Ci0gICAgc2VjdXJpdHlfbWFuYWdlci0+T25Db25maXJtWWVzTm8oYWRkcmVzcywgYWNjZXB0KTsKLSAgICBzZWN1cml0eV9tYW5hZ2VyLT5PbkNvbmZpcm1ZZXNObyhhZGRyZXNzMiwgYWNjZXB0KTsKLSAgfQotfQotCi11aW50MTZfdCBibHVldG9vdGg6OnNoaW06OkJUTV9HZXRIQ0lDb25uSGFuZGxlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0QnRtKCktPkdldEFjbEhhbmRsZShyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotfQotCi1zdGF0aWMgdm9pZCByZW1vdGVfbmFtZV9yZXF1ZXN0X2NvbXBsZXRlX25vb3Aodm9pZCogcF9uYW1lKXsKLSAgICAvLyBTaG91bGQgbm90aWZ5IEJUTV9TZWMsIGJ1dCB3ZSBzaG91bGQgdXNlIEdEIFNNUC4KLX07Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpTZW5kUmVtb3RlTmFtZVJlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgU3RhY2s6OkdldEluc3RhbmNlKCktPkdldEJ0bSgpLT5SZWFkQ2xhc3NpY1JlbW90ZURldmljZU5hbWUoCi0gICAgICByYXdfYWRkcmVzcywgcmVtb3RlX25hbWVfcmVxdWVzdF9jb21wbGV0ZV9ub29wKTsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlbWVudCwgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgdm9pZCogcF9yZWZfZGF0YSkgewotICAvLyBTZWN1cml0eSBoYXMgYWxyZWFkeSBiZWVuIGZ1bGZpbGxlZCBieSB0aGUgbDJjYXAgY29ubmVjdGlvbiwgc28gcmVwbHkgYmFjawotICAvLyB0aGF0IGV2ZXJ5dGhpbmcgaXMgdG90YWxseSBmaW5lIGFuZCBsZWdpdCBhbmQgZGVmaW5pdGVseSBub3QgdHdvIGtpZHMgaW4gYQotICAvLyB0cmVuY2hjb2F0Ci0KLSAgaWYgKHBfY2FsbGJhY2spIHsKLSAgICAoKnBfY2FsbGJhY2spKCZiZF9hZGRyLCBmYWxzZSwgcF9yZWZfZGF0YSwgQlRNX1NVQ0NFU1MpOwotICB9Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0RW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCkgewotICAvLyBXaGVuIHdlIGp1c3QgYm9uZCBhIGRldmljZSwgZW5jcnlwdGlvbiBpcyBhbHJlYWR5IGRvbmUKLSAgKCpwX2NhbGxiYWNrKSgmYmRfYWRkciwgdHJhbnNwb3J0LCBwX3JlZl9kYXRhLCBCVE1fU1VDQ0VTUyk7Ci0KLSAgLy8gVE9ETyhoc3opOiBSZS1lbmNyeXB0IHRoZSBsaW5rIGFmdGVyIGZpcnN0IGJvbmRlZAotCi0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBDYWxsIFJlbW92ZUJvbmQgb24gZGV2aWNlIGFkZHJlc3MKLX0KLQotY2hhciogYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVhZERldk5hbWUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBzdGF0aWMgY2hhciBuYW1lW10gPSAiVE9ETzogU2VlIGlmIHRoaXMgaXMgbmVlZGVkIjsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkUm10TmFtZU5vdGlmeUNhbGxiYWNrKAotICAgIHRCVE1fUk1UX05BTUVfQ0FMTEJBQ0sqIHBfY2FsbGJhY2spIHsKLSAgLy8gVE9ETyhvcHRlZG9ibGl2aW9uKToga2VlcCB0cmFjayBvZiBjYWxsYmFjawotICBMT0dfV0FSTigiVW5pbXBsZW1lbnRlZCIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNEZWxldGVSbXROYW1lTm90aWZ5Q2FsbGJhY2soCi0gICAgdEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjaykgewotICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBzdG9wIGtlZXBpbmcgdHJhY2sgb2YgY2FsbGJhY2sKLSAgTE9HX1dBUk4oIlVuaW1wbGVtZW50ZWQiKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUElOQ29kZVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NUQVRVUyByZXMsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcGluKSB7Ci0gIEFTU0VSVF9MT0coIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCksICJVbnJlYWNoYWJsZSBjb2RlIHBhdGgiKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9SZW1vdGVPb2JEYXRhUmVwbHkodEJUTV9TVEFUVVMgcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiByKSB7Ci0gIEFTU0VSVF9MT0coIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCksICJVbnJlYWNoYWJsZSBjb2RlIHBhdGgiKTsKLX0KLQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0RGV2aWNlQ2xhc3MoREVWX0NMQVNTIGRldl9jbGFzcykgewotICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBzZWUgaWYgd2UgbmVlZCB0aGlzLCBJIGRvbid0IHRoaW5rIHdlIGRvCi0gIExPR19XQVJOKCJVbmltcGxlbWVudGVkIik7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL21haW4vc2hpbS9idG1fYXBpLmggYi9tYWluL3NoaW0vYnRtX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc2ZDAxLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9idG1fYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvZXNjb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vbmVpZ2hib3JfaW5xdWlyeS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9ibGVfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1N0YXJ0SW5xdWlyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgYW4gaW5xdWlyeS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHBfaW5xcGFybXMgLSBwb2ludGVyIHRvIHRoZSBpbnF1aXJ5IGluZm9ybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICBtb2RlIC0gR0VORVJBTCBvciBMSU1JVEVEIGlucXVpcnkKLSAqICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIC0gbGVuZ3RoIGluIDEuMjggc2VjIGludGVydmFscyAoSWYgJzAnLCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5xdWlyeSBpcyBDQU5DRUxMRUQpCi0gKiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY29uZF90eXBlIC0gQlRNX0NMUl9JTlFVSVJZX0ZJTFRFUiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fRklMVEVSX0NPTkRfREVWSUNFX0NMQVNTLCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9GSUxURVJfQ09ORF9CRF9BRERSCi0gKiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY29uZCAtIHZhbHVlIGZvciB0aGUgZmlsdGVyIChiYXNlZCBvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2NvbmRfdHlwZSkKLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfcmVzdWx0c19jYiAgLSBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lIHdoaWNoIGdldHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgdXBvbiByZWNlaXB0IG9mIGFuIGlucXVpcnkgcmVzdWx0LiBJZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkLgotICoKLSAqICAgICAgICAgICAgICAgICAgcF9jbXBsX2NiICAgLSBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lIHdoaWNoIGdldHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLiAgSWYgdGhpcyBmaWVsZCBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHRoZSBhcHBsaWNhdGlvbiBpcyBub3Qgbm90aWZpZWQgd2hlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC4KLSAqIFJldHVybnMgICAgICAgICAgdEJUTV9TVEFUVVMKLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgYWxyZWFkeSBpbiBwcm9ncmVzcwotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiBwYXJhbWV0ZXIocykgYXJlIG91dCBvZiByYW5nZQotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIGNvdWxkIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgdG8gc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1N0YXJ0SW5xdWlyeSh0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXREaXNjb3ZlcmFiaWxpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgZGV2aWNlIGludG8gb3Igb3V0IG9mCi0gKiAgICAgICAgICAgICAgICAgIGRpc2NvdmVyYWJsZSBtb2RlLiBEaXNjb3ZlcmFibGUgbW9kZSBtZWFucyBpbnF1aXJ5Ci0gKiAgICAgICAgICAgICAgICAgIHNjYW5zIGFyZSBlbmFibGVkLiAgSWYgYSB2YWx1ZSBvZiAnMCcgaXMgZW50ZXJlZCBmb3Igd2luZG93Ci0gKiAgICAgICAgICAgICAgICAgIG9yIGludGVydmFsLCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIGEgc2V0dGluZyBvZiB0aGUgZmlsdGVyIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZG4ndCBnZXQgYSBtZW1vcnkgcG9vbCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgYSBiYWQgcGFyYW1ldGVyIHdhcyBkZXRlY3RlZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCBpbnFfbW9kZSwgdWludDE2X3Qgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlT2JzZXJ2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBwcm9jZWR1cmUga2VlcCB0aGUgZGV2aWNlIGxpc3RlbmluZyBmb3IgYWR2ZXJ0aXNpbmcKLSAqICAgICAgICAgICAgICAgICAgZXZlbnRzIGZyb20gYSBicm9hZGNhc3QgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc3RhcnQ6IHN0YXJ0IG9yIHN0b3Agb2JzZXJ2ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0JsZU9ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVPcHBvcnR1bmlzdGljT2JzZXJ2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXIvdW5yZWdpc3RlciBvcHBvcnR1bmlzdGljIHNjYW4gY2FsbGJhY2suIFRoaXMgbWV0aG9kCi0gKiAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHRyaWdnZXIgc2NhbiBzdGFydC9zdG9wLCBidXQgaWYgc2NhbiBpcyBldmVyIHN0YXJ0ZWQsCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgY2FsbGJhY2sgd291bGQgZ2V0IGNhbGxlZCB3aXRoIHNjYW4gcmVzdWx0cy4gQWRkaXRpb25hbGx5LAotICogICAgICAgICAgICAgICAgICB0aGlzIGNhbGxiYWNrIGlzIG5vdCByZXNldCBvbiBlYWNoIHNjYW4gc3RhcnQvc3RvcC4gSXQncwotICogICAgICAgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IExFIEF1ZGlvIHJlbGF0ZWQgcHJvZmlsZXMsIHRoYXQgd291bGQKLSAqICAgICAgICAgICAgICAgICAgZmluZCB5ZXQgdW5wYWlyZWQgbWVtYmVycyBvZiBDU0lTIHNldCwgb3IgYnJvYWRjYXN0cy4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGVuYWJsZTogZW5hYmxlL2Rpc2FibGUgb2JzZXJ2aW5nLgotICogICAgICAgICAgICAgICAgICBwX3Jlc3VsdHNfY2I6IGNhbGxiYWNrIGZvciByZXN1bHRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVPcHBvcnR1bmlzdGljT2JzZXJ2ZShib29sIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYik7Ci0KLXZvaWQgQlRNX0VuYWJsZUludGVybGFjZWRJbnF1aXJ5U2NhbigpOwotCi12b2lkIEJUTV9FbmFibGVJbnRlcmxhY2VkUGFnZVNjYW4oKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRJbnF1aXJ5TW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHN0YW5kYXJkLCB3aXRoIFJTU0kKLSAqICAgICAgICAgICAgICAgICAgbW9kZSBvciBleHRlbmRlZCBvZiB0aGUgaW5xdWlyeSBmb3IgbG9jYWwgZGV2aWNlLgotICoKLSAqIElucHV0IFBhcmFtczogICAgQlRNX0lOUV9SRVNVTFRfU1RBTkRBUkQsIEJUTV9JTlFfUkVTVUxUX1dJVEhfUlNTSSBvcgotICogICAgICAgICAgICAgICAgICBCVE1fSU5RX1JFU1VMVF9FWFRFTkRFRAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIGNvdWxkbid0IGdldCBhIG1lbW9yeSBwb29sIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiBhIGJhZCBwYXJhbWV0ZXIgd2FzIGRldGVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9XUk9OR19NT0RFIGlmIHRoZSBkZXZpY2UgaXMgbm90IHVwLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0SW5xdWlyeU1vZGUodWludDhfdCBtb2RlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRDb25uZWN0YWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHRoZSBkZXZpY2UgaW50byBvciBvdXQgb2YKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGFibGUgbW9kZS4gRGlzY292ZXJhYmxlIG1vZGUgbWVhbnMgcGFnZSBzY2FucyBhcmUKLSAqICAgICAgICAgICAgICAgICAgZW5hYmxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgYSBiYWQgcGFyYW1ldGVyIGlzIGRldGVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgY291bGQgbm90IGFsbG9jYXRlIGEgbWVzc2FnZSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUgaWYgdGhlIGRldmljZSBpcyBub3QgdXAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXRDb25uZWN0YWJpbGl0eSh1aW50MTZfdCBwYWdlX21vZGUsIHVpbnQxNl90IHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSXNJbnF1aXJ5QWN0aXZlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm4gYSBiaXQgbWFzayBvZiB0aGUgY3VycmVudCBpbnF1aXJ5IHN0YXRlCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fSU5RVUlSWV9JTkFDVElWRSBpZiBpbmFjdGl2ZSAoMCkKLSAqICAgICAgICAgICAgICAgICAgQlRNX0dFTkVSQUxfSU5RVUlSWV9BQ1RJVkUgaWYgYSBnZW5lcmFsIGlucXVpcnkgaXMgYWN0aXZlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUTV9Jc0lucXVpcnlBY3RpdmUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ2FuY2VsSW5xdWlyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYW5jZWxzIGFuIGlucXVpcnkgaWYgYWN0aXZlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0NhbmNlbElucXVpcnkodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZFJlbW90ZURldmljZU5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGEgcmVtb3RlIGRldmljZSBIQ0kgY29tbWFuZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbGxlciBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIHByb2Nlc3MgaGFzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC4KLSAqCi0gKiBJbnB1dCBQYXJhbXM6ICAgIHJlbW90ZV9iZGEgICAgICAtIGRldmljZSBhZGRyZXNzIG9mIG5hbWUgdG8gcmV0cmlldmUKLSAqICAgICAgICAgICAgICAgICAgcF9jYiAgICAgICAgICAgIC0gY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlzIHJldHVybmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdEJUTV9SRU1PVEVfREVWX05BTUUgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50IHRvIEhDSS4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgYWxyZWFkeSBpbiBwcm9ncmVzcwotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIGRldmljZSBhZGRyZXNzIGlzIGJhZAotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIHJlc291cmNlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdGhlIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUgaWYgdGhlIGRldmljZSBpcyBub3QgdXAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ2FuY2VsUmVtb3RlRGV2aWNlTmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgdGhlIGNhbmNlbCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBkZXZpY2UuCi0gKgotICogSW5wdXQgUGFyYW1zOiAgICBOb25lCi0gKgotICogUmV0dXJucwotICogICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaXMgcmV0dXJuZWQgaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudCB0byBIQ0kuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgcmVzb3VyY2VzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGVyZSBpcyBubyBhY3RpdmUgcmVtb3RlIG5hbWUgcmVxdWVzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSW5xRGJSZWFkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIHRocm91Z2ggdGhlIGlucXVpcnkgZGF0YWJhc2UgZm9yIGEgbWF0Y2gKLSAqICAgICAgICAgICAgICAgICAgYmFzZWQgb24gQmx1ZXRvb3RoIERldmljZSBBZGRyZXNzLiBUaGlzIGlzIHRoZSBhcHBsaWNhdGlvbidzCi0gKiAgICAgICAgICAgICAgICAgIGludGVyZmFjZSB0byBnZXQgdGhlIGlucXVpcnkgZGV0YWlscyBvZiBhIHNwZWNpZmljIEJECi0gKiAgICAgICAgICAgICAgICAgIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIGVudHJ5LCBvciBOVUxMIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX0lOUV9JTkZPKiBCVE1fSW5xRGJSZWFkKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9JbnFEYkZpcnN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIHRocm91Z2ggdGhlIGlucXVpcnkgZGF0YWJhc2UgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBmaXJzdCB1c2VkIGVudHJ5LCBhbmQgcmV0dXJucyB0aGF0LiBUaGlzIGlzIHVzZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCBCVE1fSW5xRGJOZXh0IGJ5IGFwcGxpY2F0aW9ucyBhcyBhIHdheSB0bwotICogICAgICAgICAgICAgICAgICB3YWxrIHRocm91Z2ggdGhlIGlucXVpcnkgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIGZpcnN0IGluLXVzZSBlbnRyeSwgb3IgTlVMTCBpZiBEQiBpcyBlbXB0eQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX0lOUV9JTkZPKiBCVE1fSW5xRGJGaXJzdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9JbnFEYk5leHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgaW5xdWlyeSBkYXRhYmFzZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIG5leHQgdXNlZCBlbnRyeSwgYW5kIHJldHVybnMgdGhhdC4gIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgaXMgTlVMTCwgdGhlIGZpcnN0IGVudHJ5IGlzIHJldHVybmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBuZXh0IGluLXVzZSBlbnRyeSwgb3IgTlVMTCBpZiBubyBtb3JlIGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX0lOUV9JTkZPKiBCVE1fSW5xRGJOZXh0KHRCVE1fSU5RX0lORk8qIHBfY3VyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9DbGVhcklucURiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhciBvdXQgYSBkZXZpY2Ugb3IgYWxsIGRldmljZXMKLSAqICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgaW5xdWlyeSBkYXRhYmFzZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfYmRhIC0gKGlucHV0KSBCRF9BRERSIC0+ICBBZGRyZXNzIG9mIGRldmljZSB0byBjbGVhcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTEwgY2xlYXJzIGFsbCBlbnRyaWVzKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0JVU1kgaWYgYW4gaW5xdWlyeSwgZ2V0IHJlbW90ZSBuYW1lLCBvciBldmVudCBmaWx0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhY3RpdmUsIG90aGVyd2lzZSBCVE1fU1VDQ0VTUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQ2xlYXJJbnFEYihjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fV3JpdGVFSVIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHdyaXRlIEVJUiBkYXRhIHRvIGNvbnRyb2xsZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2J1ZmYgLSBhbGxvY2F0ZWQgSENJIGNvbW1hbmQgYnVmZmVyIGluY2x1ZGluZyBleHRlbmRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnF1cmlyeSByZXNwb25zZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgIC0gaWYgc3VjY2Vzc2Z1bAotICogICAgICAgICAgICAgICAgICBCVE1fTU9ERV9VTlNVUFBPUlRFRCAtIGlmIGxvY2FsIGRldmljZSBjYW5ub3Qgc3VwcG9ydCBpdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fV3JpdGVFSVIoQlRfSERSKiBwX2J1ZmYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0hhc0VpclNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGtub3cgaWYgVVVJRCBpbiBiaXQgbWFwIG9mIFVVSUQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2Vpcl91dWlkIC0gYml0IG1hcCBvZiBVVUlEIGxpc3QKLSAqICAgICAgICAgICAgICAgICAgdXVpZDE2IC0gVVVJRCAxNi1iaXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgLSBpZiBmb3VuZAotICogICAgICAgICAgICAgICAgICBmYWxzZSAtIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9IYXNFaXJTZXJ2aWNlKGNvbnN0IHVpbnQzMl90KiBwX2Vpcl91dWlkLCB1aW50MTZfdCB1dWlkMTYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0hhc0lucXVpcnlFaXJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm4gaWYgYSBVVUlEIGlzIGluIHRoZSBiaXQgbWFwIG9mIGEgVVVJRCBsaXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9yZXN1bHRzIC0gaW5xdWlyeSByZXN1bHRzCi0gKiAgICAgICAgICAgICAgICAgIHV1aWQxNiAtIFVVSUQgMTYtYml0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fRUlSX0ZPVU5EIC0gaWYgZm91bmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0VJUl9OT1RfRk9VTkQgLSBpZiBub3QgZm91bmQgYW5kIGl0IGlzIGEgY29tcGxldGUgbGlzdAotICogICAgICAgICAgICAgICAgICBCVE1fRUlSX1VOS05PV04gLSBpZiBub3QgZm91bmQgYW5kIGl0IGlzIG5vdCBjb21wbGV0ZSBsaXN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fRUlSX1NFQVJDSF9SRVNVTFQgQlRNX0hhc0lucXVpcnlFaXJTZXJ2aWNlKHRCVE1fSU5RX1JFU1VMVFMqIHBfcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWQxNik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQWRkRWlyU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGEgc2VydmljZSBpbiB0aGUgYml0IG1hcCBVVUlECi0gKiAgICAgICAgICAgICAgICAgIGxpc3QuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2Vpcl91dWlkIC0gYml0IG1hc2sgb2YgVVVJRCBsaXN0IGZvciBFSVIKLSAqICAgICAgICAgICAgICAgICAgdXVpZDE2IC0gVVVJRCAxNi1iaXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQWRkRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDE2X3QgdXVpZDE2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZW1vdmVFaXJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZW1vdmUgYSBzZXJ2aWNlIGZyb20gdGhlIGJpdCBtYXAKLSAqICAgICAgICAgICAgICAgICAgVVVJRCBsaXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9laXJfdXVpZCAtIGJpdCBtYXNrIG9mIFVVSUQgbGlzdCBmb3IgRUlSCi0gKiAgICAgICAgICAgICAgICAgIHV1aWQxNiAtIFVVSUQgMTYtYml0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1JlbW92ZUVpclNlcnZpY2UodWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkQmxlRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IGRldmljZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBub3JtYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBmb3IgYSBMRSBkZXZpY2Ugc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldl90eXBlICAgICAgICAgLSBSZW1vdGUgZGV2aWNlJ3MgZGV2aWNlIHR5cGUuCi0gKiAgICAgICAgICAgICAgICAgIGFkZHJfdHlwZSAgICAgICAgLSBMRSBkZXZpY2UgYWRkcmVzcyB0eXBlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZWNBZGRCbGVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkQmxlS2V5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IExFIGRldmljZSBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZQotICogICAgICAgICAgICAgICAgICBub3JtYWxseSBjYWxsZWQgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgcF9sZV9rZXkgICAgICAgICAtIExFIGtleSB2YWx1ZXMuCi0gKiAgICAgICAgICAgICAgICAgIGtleV90eXBlICAgICAgICAgLSBMRSBTTVAga2V5IHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1NlY0FkZEJsZUtleShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRNX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlTG9hZExvY2FsS2V5cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9jYWwgbG9jYWwgaWRlbnRpdHkga2V5LCBlbmNyeXB0aW9uIHJvb3Qgb3Igc2lnbiBjb3VudGVyLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAga2V5X3R5cGU6IHR5cGUgb2Yga2V5LCBjYW4gYmUgQlRNX0JMRV9LRVlfVFlQRV9JRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfS0VZX1RZUEVfRVIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEJUTV9CTEVfS0VZX1RZUEVfQ09VTlRFUi4KLSAqICAgICAgICAgICAgICAgICAgcF9rZXk6IHBvaW50ZXIgdG8gdGhlIGtleS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbjIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZUxvYWRMb2NhbEtleXModWludDhfdCBrZXlfdHlwZSwgdEJUTV9CTEVfTE9DQUxfS0VZUyogcF9rZXkpOwotCi0vKiogUmV0dXJucyBsb2NhbCBkZXZpY2UgZW5jcnlwdGlvbiByb290IChFUikgKi8KLWNvbnN0IE9jdGV0MTYmIEJUTV9HZXREZXZpY2VFbmNSb290KCk7Ci0KLS8qKiBSZXR1cm5zIGxvY2FsIGRldmljZSBpZGVudGl0eSByb290IChJUikgKi8KLWNvbnN0IE9jdGV0MTYmIEJUTV9HZXREZXZpY2VJRFJvb3QoKTsKLQotLyoqIFJldHVybiBsb2NhbCBkZXZpY2UgREhLLiAqLwotY29uc3QgT2N0ZXQxNiYgQlRNX0dldERldmljZURISygpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRDb25uZWN0aW9uQWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgbG9jYWwgZGV2aWNlIHJhbmRvbSBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9SZWFkQ29ubmVjdGlvbkFkZHIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYWQgdGhlIHJlbW90ZSBkZXZpY2UgYWRkcmVzcyBjdXJyZW50bHkgdXNlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY3VyaXR5R3JhbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdyYW50IHNlY3VyaXR5IHByb2Nlc3MuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyIC0gcGVlciBkZXZpY2UgYmQgYWRkcmVzcy4KLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3MuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIEJUTV9SRVBFQVRFRF9BVFRFTVBUUyBpcyB0b28gbWFueQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1NlY3VyaXR5R3JhbnQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0xlT29iRGF0YVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm92aWRlIHRoZSBPT0IgZGF0YSBmb3IKLSAqICAgICAgICAgICAgICAgICAgU01QIGluIHJlc3BvbnNlIHRvIEJUTV9MRV9PT0JfUkVRX0VWVAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICByZXMgICAgICAgICAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIFNNUF9TVUNDRVNTIGlmIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgcF9kYXRhICAgICAgLSBzaW1wbGUgcGFpcmluZyBSYW5kb21pemVyICBDLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVPb2JEYXRhUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMsIHVpbnQ4X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBCVE1fTEVfT09CX1JFUV9FVlQgd2hlbiBzZWN1cmUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBkYXRhIGlzIGF2YWlsYWJsZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBwX2MgICAgICAgICAtIHBvaW50ZXIgdG8gQ29uZmlybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfciAgICAgICAgIC0gcG9pbnRlciB0byBSYW5kb21pemVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVTZWN1cmVDb25uZWN0aW9uT29iRGF0YVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYywgdWludDhfdCogcF9yKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVNldENvbm5TY2FuUGFyYW1zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgc2NhbiBwYXJhbWV0ZXJzIHVzZWQgaW4gQkxFIGNvbm5lY3Rpb24gcmVxdWVzdAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgc2Nhbl9pbnRlcnZhbCAgICAtIHNjYW4gaW50ZXJ2YWwKLSAqICAgICAgICAgICAgICAgICAgc2Nhbl93aW5kb3cgICAgICAtIHNjYW4gd2luZG93Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVNldENvbm5TY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2V0UHJlZkNvbm5QYXJhbXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCBhIHBlcmlwaGVyYWwncyBwcmVmZXJyZWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLiBXaGVuCi0gKiAgICAgICAgICAgICAgICAgIGFueSBvZiB0aGUgdmFsdWUgZG9lcyBub3Qgd2FudCB0byBiZSB1cGRhdGVkIHdoaWxlIG90aGVycwotICogICAgICAgICAgICAgICAgICBkbywgdXNlIEJUTV9CTEVfQ09OTl9QQVJBTV9VTkRFRiBmb3IgdGhlIG9uZXMgd2FudCB0bwotICogICAgICAgICAgICAgICAgICBsZWF2ZSB1bnRvdWNoZWQuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgICAgIC0gQkQgYWRkcmVzcyBvZiB0aGUgcGVyaXBoZXJhbAotICogICAgICAgICAgICAgICAgICBtaW5fY29ubl9pbnQgICAgIC0gbWluaW11bSBwcmVmZXJyZWQgY29ubmVjdGlvbiBpbnRlcnZhbAotICogICAgICAgICAgICAgICAgICBtYXhfY29ubl9pbnQgICAgIC0gbWF4aW11bSBwcmVmZXJyZWQgY29ubmVjdGlvbiBpbnRlcnZhbAotICogICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsX2xhdGVuY3kgICAgLSBwcmVmZXJyZWQgcGVyaXBoZXJhbCBsYXRlbmN5Ci0gKiAgICAgICAgICAgICAgICAgIHN1cGVydmlzaW9uX3RvdXQgLSBwcmVmZXJyZWQgc3VwZXJ2aXNpb24gdGltZW91dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVTZXRQcmVmQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5fY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkRGV2SW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgZGV2aWNlL2FkZHJlc3MgdHlwZQotICogICAgICAgICAgICAgICAgICBvZiBCRCBhZGRyZXNzLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcmVtb3RlX2JkYTogcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfZGV2X3R5cGU6IG91dHB1dCBwYXJhbWV0ZXIgdG8gcmVhZCB0aGUgZGV2aWNlIHR5cGUuCi0gKiAgICAgICAgICAgICAgICAgIHBfYWRkcl90eXBlOiBvdXRwdXQgcGFyYW1ldGVyIHRvIHJlYWQgdGhlIGFkZHJlc3MgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVhZERldkluZm8oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX0RFVklDRV9UWVBFKiBwX2Rldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkQ29ubmVjdGVkVHJhbnNwb3J0QWRkcmVzcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgcGFpcmVkIGRldmljZS9hZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3RoZXIgZGV2aWNlIHBhaXJlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBCRF9hZGRyZXNzCi0gKgotICogUGFyYW1ldGVyICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIGFkZHJlc3MsIGNhcnJ5IG91dCB0aGUgdHJhbnNwb3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0OiBhY3RpdmUgdHJhbnNwb3J0Ci0gKgotICogUmV0dXJuICAgICAgICAgICB0cnVlIGlmIGFuIGFjdGl2ZSBsaW5rIGlzIGlkZW50aWZpZWQ7IGZhbHNlIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9SZWFkQ29ubmVjdGVkVHJhbnNwb3J0QWRkcmVzcyhSYXdBZGRyZXNzKiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVJlY2VpdmVyVGVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgdGhlIExFIFJlY2VpdmVyIHRlc3QKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgcnhfZnJlcSAtIEZyZXF1ZW5jeSBSYW5nZQotICogICAgICAgICAgICAgICBwX2NtZF9jbXBsX2NiYWNrIC0gQ29tbWFuZCBDb21wbGV0ZSBjYWxsYmFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVSZWNlaXZlclRlc3QodWludDhfdCByeF9mcmVxLCB0QlRNX0NNUExfQ0IqIHBfY21kX2NtcGxfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVRyYW5zbWl0dGVyVGVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgdGhlIExFIFRyYW5zbWl0dGVyIHRlc3QKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgdHhfZnJlcSAtIEZyZXF1ZW5jeSBSYW5nZQotICogICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZGF0YV9sZW4gLSBMZW5ndGggaW4gYnl0ZXMgb2YgcGF5bG9hZCBkYXRhIGluIGVhY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3BheWxvYWQgLSBQYXR0ZXJuIHRvIHVzZSBpbiB0aGUgcGF5bG9hZAotICogICAgICAgICAgICAgICAgICAgICAgIHBfY21kX2NtcGxfY2JhY2sgLSBDb21tYW5kIENvbXBsZXRlIGNhbGxiYWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVRyYW5zbWl0dGVyVGVzdCh1aW50OF90IHR4X2ZyZXEsIHVpbnQ4X3QgdGVzdF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhY2tldF9wYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlVGVzdEVuZAotICoKLSAqIERlc2NyaXB0aW9uICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdG9wIHRoZSBpbi1wcm9ncmVzcyBUWCBvciBSWCB0ZXN0Ci0gKgotICogUGFyYW1ldGVyICAgICAgIHBfY21kX2NtcGxfY2JhY2sgLSBDb21tYW5kIGNvbXBsZXRlIGNhbGxiYWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVRlc3RFbmQodEJUTV9DTVBMX0NCKiBwX2NtZF9jbXBsX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Vc2VMZUxpbmsKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbGVjdCB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBsaW5rIHRvIHVzZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgdG8gdXNlIExFLCBmYWxzZSB1c2UgQlIvRURSLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9Vc2VMZUxpbmsoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlUmVhZFBoeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVG8gcmVhZCB0aGUgY3VycmVudCBQSFlzIGZvciBzcGVjaWZpZWQgTEUgY29ubmVjdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVJlYWRQaHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwgdWludDhfdCBzdGF0dXMpPiBjYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2V0UGh5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUbyBzZXQgUEhZIHByZWZlcmVuY2VzIGZvciBzcGVjaWZpZWQgTEUgY29ubmVjdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWlsZWQuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9NT0RFX1VOU1VQUE9SVEVEIGlmIGxvY2FsIGNvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0IExFCi0gKiAgICAgICAgICAgICAgICAgIDJNIG9yIExFIENvZGVkIFBIWSwKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgc3BlY2lmaWVkIHJlbW90ZSBkb2Vzbid0IHN1cHBvcnQgTEUgMk0KLSAqICAgICAgICAgICAgICAgICAgb3IgTEUgQ29kZWQgUEhZLAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiBEZXZpY2UgaW4gd3JvbmcgbW9kZSBmb3IgcmVxdWVzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlU2V0UGh5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgdHhfcGh5cywgdWludDhfdCByeF9waHlzLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9vcHRpb25zKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVEYXRhU2lnbmF0dXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzaWduIHRoZSBkYXRhIHVzaW5nIEFFUzEyOCBDTUFDCi0gKiAgICAgICAgICAgICAgICAgIGFsZ29yaXRoLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgYmRfYWRkcjogdGFyZ2V0IGRldmljZSB0aGUgZGF0YSB0byBiZSBzaWduZWQgZm9yLgotICogICAgICAgICAgICAgICAgICBwX3RleHQ6IHNpbmdpbmcgZGF0YQotICogICAgICAgICAgICAgICAgICBsZW46IGxlbmd0aCBvZiB0aGUgc2lnbmluZyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogb3V0cHV0IHBhcmFtZXRlciB3aGVyZSBkYXRhIHNpZ25hdHVyZSBpcyBnb2luZyB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc2lnbmluZyBzdWNlc3N1bCwgb3RoZXJ3aXNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9CbGVEYXRhU2lnbmF0dXJlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QqIHBfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBCTEVfU0lHTkFUVVJFIHNpZ25hdHVyZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlVmVyaWZ5U2lnbmF0dXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgdGhlIGRhdGEgc2lnbmF0dXJlCi0gKgotICogUGFyYW1ldGVyICAgICAgICBiZF9hZGRyOiB0YXJnZXQgZGV2aWNlIHRoZSBkYXRhIHRvIGJlIHNpZ25lZCBmb3IuCi0gKiAgICAgICAgICAgICAgICAgIHBfb3JpZzogIG9yaWdpbmFsIGRhdGEgYmVmb3JlIHNpZ25hdHVyZS4KLSAqICAgICAgICAgICAgICAgICAgbGVuOiBsZW5ndGggb2YgdGhlIHNpZ25pbmcgZGF0YQotICogICAgICAgICAgICAgICAgICBjb3VudGVyOiBjb3VudGVyIHVzZWQgd2hlbiBkb2luZyBkYXRhIHNpZ25pbmcKLSAqICAgICAgICAgICAgICAgICAgcF9jb21wOiBzaWduYXR1cmUgdG8gYmUgY29tcGFyZWQgYWdhaW5zdC4KLQotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHNpZ25hdHVyZSB2ZXJpZmllZCBjb3JyZWN0bHk7IG90aGVyd2lzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fQmxlVmVyaWZ5U2lnbmF0dXJlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QqIHBfb3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQzMl90IGNvdW50ZXIsIHVpbnQ4X3QqIHBfY29tcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0TGVTZWN1cml0eVN0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgc2VjdXJpdHkgbW9kZSAxIGZsYWdzIGFuZAotICogICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uIGtleSBzaXplIGZvciBMRSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICB0cnVlIGlmIExFIGRldmljZSBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9HZXRMZVNlY3VyaXR5U3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2xlX2Rldl9zZWNfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9sZV9rZXlfc2l6ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2VjdXJpdHlQcm9jZWR1cmVJc1J1bm5pbmcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIGlmIExFIHNlY3VyaXR5IHByb2NlZHVyZSBpcwotICogICAgICAgICAgICAgICAgICBjdXJyZW50bHkgcnVubmluZyB3aXRoIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCB0cnVlIGlmIHNlY3VyaXR5IHByb2NlZHVyZSBpcyBydW5uaW5nLCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0JsZVNlY3VyaXR5UHJvY2VkdXJlSXNSdW5uaW5nKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUdldFN1cHBvcnRlZEtleVNpemUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgbWF4aW11bSBlbmNyeXB0aW9uIGtleSBzaXplIGluIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBsb2NhbCBkZXZpY2UgY2FuIHN1cG9ydC4KLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIGtleSBzaXplIG9yIDAgaWYgdGhlIHNpemUgY2FuJ3QgYmUgcmV0cmlldmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9CbGVHZXRTdXBwb3J0ZWRLZXlTaXplKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi12b2lkIEJUTV9MRV9QRl9sb2NhbF9uYW1lKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmFtZSwgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKTsKLQotdm9pZCBCVE1fTEVfUEZfc3J2Y19kYXRhKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4KTsKLQotdm9pZCBCVE1fTEVfUEZfbWFudV9kYXRhKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LCB1aW50MTZfdCBjb21wYW55X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbXBhbnlfaWRfbWFzaywgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKTsKLQotdm9pZCBCVE1fTEVfUEZfc3J2Y19kYXRhX3BhdHRlcm4odEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpOwotCi12b2lkIEJUTV9MRV9QRl9hZGRyX2ZpbHRlcih0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LCB0QkxFX0JEX0FERFIgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYik7Ci0KLXZvaWQgQlRNX0xFX1BGX3V1aWRfZmlsdGVyKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DT05EX1RZUEUgZmlsdGVyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9MT0dJQ19UWVBFIGNvbmRfbG9naWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWRfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYik7Ci0KLXZvaWQgQlRNX0xFX1BGX3NldCh0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXBjZkNvbW1hbmQ+IGNvbW1hbmRzLCB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpOwotdm9pZCBCVE1fTEVfUEZfY2xlYXIodEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXR1cCB0aGUgYWR2IGRhdGEgcGF5bG9hZCBmaWx0ZXIKLSAqICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwKAotICAgIHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8YnRnYXR0X2ZpbHRfcGFyYW1fc2V0dXBfdD4gcF9maWx0X3BhcmFtcywKLSAgICB0QlRNX0JMRV9QRl9QQVJBTV9DQiBjYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlVXBkYXRlQWR2RmlsdGVyUG9saWN5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgZmlsdGVyIHBvbGljeSBvZiBhZHZlcnRpc2VyLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgYWR2X3BvbGljeTogYWR2ZXJ0aXNpbmcgZmlsdGVyIHBvbGljeQotICoKLSAqIFJldHVybiAgICAgICAgICAgdm9pZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVVwZGF0ZUFkdkZpbHRlclBvbGljeSh0QlRNX0JMRV9BRlAgYWR2X3BvbGljeSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUENGIGZlYXR1cmUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGVuYWJsZSAtIHRydWUgLSBlbmFibGVzIEFQQ0YsIGZhbHNlIC0gZGlzYWJsZXMgQVBDRgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVFbmFibGVEaXNhYmxlRmlsdGVyRmVhdHVyZSh1aW50OF90IGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX1NUQVRVU19DQkFDSyBwX3N0YXRfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgIEJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG11bHRpIGFkdiBpbnN0YW5jZXMgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjb250cm9sbGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTWF4IG11bHRpIGFkdiBpbnN0YW5jZSBjb3VudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQoKTsKLQotdm9pZCBCVE1fcmVzZXRfY29tcGxldGUoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Jc0RldmljZVVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHVwLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZXZpY2UgaXMgdXAsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fSXNEZXZpY2VVcCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRMb2NhbERldmljZU5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgbG9jYWwgZGV2aWNlIG5hbWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGFuIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXRMb2NhbERldmljZU5hbWUoY29uc3QgY2hhciogcF9uYW1lKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXREZXZpY2VDbGFzcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHRoZSBsb2NhbCBkZXZpY2UgY2xhc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhbiBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0RGV2aWNlQ2xhc3MoREVWX0NMQVNTIGRldl9jbGFzcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZExvY2FsRGV2aWNlTmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgbG9jYWwgZGV2aWNlIG5hbWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotICogICAgICAgICAgICAgICAgICBJZiBzdWNjZXNzLCBCVE1fU1VDQ0VTUyBpcyByZXR1cm5lZCBhbmQgcF9uYW1lIHBvaW50cyBzdG9yZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGV2aWNlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgSWYgQlRNIGRvZXNuJ3Qgc3RvcmUgbG9jYWwgZGV2aWNlIG5hbWUsIEJUTV9OT19SRVNPVVJDRVMgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQgYW5kIHBfbmFtZSBpcyBzZXQgdG8gTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUmVhZExvY2FsRGV2aWNlTmFtZShjaGFyKiogcF9uYW1lKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lRnJvbUNvbnRyb2xsZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCBsb2NhbCBkZXZpY2UgbmFtZSBmcm9tIGNvbnRyb2xsZXIuIERvIG5vdCB1c2UgY2FjaGVkCi0gKiAgICAgICAgICAgICAgICAgIG5hbWUgKHVzZWQgdG8gZ2V0IGNoaXAtaWQgcHJpb3IgdG8gYnRtIHJlc2V0IGNvbXBsZXRlKS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYW4gZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRMb2NhbERldmljZU5hbWVGcm9tQ29udHJvbGxlcigKLSAgICB0QlRNX0NNUExfQ0IqIHBfcmxuX2NtcGxfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWREZXZpY2VDbGFzcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgbG9jYWwgZGV2aWNlIGNsYXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkZXZpY2UgY2xhc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCogQlRNX1JlYWREZXZpY2VDbGFzcyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWdpc3RlckZvclZTRXZlbnRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3Rlci9kZXJlZ2lzdGVyIGZvciB2ZW5kb3IKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgSENJIGV2ZW50cy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElmIGlzX3JlZ2lzdGVyPXRydWUsIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgYmUgcmVnaXN0ZXJlZDsKLSAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGRlcmVnaXN0ZXJlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIG1heGltdW0gbnVtYmVyIG9mIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUmVnaXN0ZXJGb3JWU0V2ZW50cyh0QlRNX1ZTX0VWVF9DQiogcF9jYiwgYm9vbCBpc19yZWdpc3Rlcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fVmVuZG9yU3BlY2lmaWNDb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgdmVuZG9yIHNwZWNpZmljIEhDSSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3BhcmFtX2J1ZiwgdEJUTV9WU0NfQ01QTF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQWxsb2NhdGVTQ04KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgdGhyb3VnaCB0aGUgU2VydmVyIENoYW5uZWwgTnVtYmVycyBmb3IgYSBmcmVlIG9uZSB0byBiZQotICogICAgICAgICAgICAgICAgICB1c2VkIHdpdGggYW4gUkZDT01NIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBBbGxvY2F0ZWQgU0NOIG51bWJlciBvciAwIGlmIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQlRNX0FsbG9jYXRlU0NOKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1RyeUFsbG9jYXRlU0NOCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUcnkgdG8gYWxsb2NhdGUgYSBmaXhlZCBzZXJ2ZXIgY2hhbm5lbAotICoKLSAqIFJldHVybnMgICAgICAgICAgUmV0dXJucyB0cnVlIGlmIHNlcnZlciBjaGFubmVsIHdhcyBhdmFpbGFibGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fVHJ5QWxsb2NhdGVTQ04odWludDhfdCBzY24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0ZyZWVTQ04KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZyZWUgdGhlIHNwZWNpZmllZCBTQ04uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIFNDTiBpcyBub3QgaW4gdXNlIG9yIGludmFsaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fRnJlZVNDTih1aW50OF90IHNjbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgQlRNLiAgSWYgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiAweEZGLCBpdCBzaW1wbHkgcmV0dXJucyB0aGUgY3VycmVudCB0cmFjZSBsZXZlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBuZXcgb3IgY3VycmVudCB0cmFjZSBsZXZlbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Xcml0ZVBhZ2VUaW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIEhDSSBXaXRlIFBhZ2UgVGltZW91dC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fV3JpdGVQYWdlVGltZW91dCh1aW50MTZfdCB0aW1lb3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgSENJIFdyaXRlIFZvaWNlIFNldHRpbmdzIGNvbW1hbmQuCi0gKiAgICAgICAgICAgICAgICAgIFNlZSBoY2lkZWZzLmggZm9yIHNldHRpbmdzIGJpdG1hc2sgdmFsdWVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9Xcml0ZVZvaWNlU2V0dGluZ3ModWludDE2X3Qgc2V0dGluZ3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0VuYWJsZVRlc3RNb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIEhDSSB0aGUgZW5hYmxlIGRldmljZSB1bmRlciB0ZXN0IGNvbW1hbmQuCi0gKgotICogICAgICAgICAgICAgICAgICBOb3RlOiBDb250cm9sbGVyIGNhbiBvbmx5IGJlIHRha2VuIG91dCBvZiB0aGlzIG1vZGUgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgIHJlc2V0dGluZyB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBSZXR1cm5zCi0gKiAgICAgIEJUTV9TVUNDRVNTICAgICAgICAgQ29tbWFuZCBzZW50LgotICogICAgICBCVE1fTk9fUkVTT1VSQ0VTICAgIElmIG91dCBvZiByZXNvdXJjZXMgdG8gc2VuZCB0aGUgY29tbWFuZC4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9FbmFibGVUZXN0TW9kZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUmVtb3RlVmVyc2lvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIHJlbW90ZSBkZXZpY2UncyB2ZXJzaW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fUmVhZFJlbW90ZVZlcnNpb24oY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCogbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbWFudWZhY3R1cmVyLCB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUmVtb3RlRmVhdHVyZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYSByZW1vdGUgZGV2aWNlJ3MKLSAqICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGZlYXR1cmVzIG1hc2sgKGZlYXR1cmVzIG1hc2sgbG9jYXRlZCBhdCBwYWdlIDApCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSByZW1vdGUgc3VwcG9ydGVkIGZlYXR1cmVzIG1hc2sKLSAqICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgZGV2aWNlIGZlYXR1cmVzIG1hc2sgcGFnZSBpcwotICogICAgICAgICAgICAgICAgICBIQ0lfRkVBVFVSRV9CWVRFU19QRVJfUEFHRSBieXRlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCogQlRNX1JlYWRSZW1vdGVGZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQUNMIENIQU5ORUwgTUFOQUdFTUVOVCBGVU5DVElPTlMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fdW5ibG9ja19zbmlmZl9tb2RlX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotdm9pZCBCVE1fYmxvY2tfc25pZmZfbW9kZV9mb3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXZvaWQgQlRNX3VuYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci12b2lkIEJUTV9ibG9ja19yb2xlX3N3aXRjaF9mb3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLQotdm9pZCBCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoKCk7Ci12b2lkIEJUTV9kZWZhdWx0X2Jsb2NrX3JvbGVfc3dpdGNoKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0RGVmYXVsdExpbmtTdXBlclRvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgSENJICJXcml0ZSBMaW5rIFN1cGVydmlzaW9uCi0gKiAgICAgICAgICAgICAgICAgIFRpbWVvdXQiIGNvbW1hbmQgdG8gdXNlIHdoZW4gYW4gQUNMIGxpbmsgaXMgY3JlYXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fU2V0RGVmYXVsdExpbmtTdXBlclRvdXQodWludDE2X3QgdGltZW91dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0TGlua1N1cGVyVG91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGFuZCBzZW5kIEhDSSAiV3JpdGUgTGluayBTdXBlcnZpc2lvbiBUaW1lb3V0IiBjb21tYW5kCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCwgb3RoZXJ3aXNlIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXRMaW5rU3VwZXJUb3V0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0TGlua1N1cGVyVG91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgbGluayBzdXBlcnZpc2lvbiB0aW1lb3V0IHZhbHVlIG9mIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fR2V0TGlua1N1cGVyVG91dChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfdGltZW91dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSXNBY2xDb25uZWN0aW9uVXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGFuIEFDTCBjb25uZWN0aW9uIGV4aXN0cwotICogICAgICAgICAgICAgICAgICB0byBhIHNwZWNpZmljIHJlbW90ZSBCRCBBZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIHVwLCBlbHNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9Jc0FjbENvbm5lY3Rpb25VcChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldFJvbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgcm9sZSBvZiB0aGUgbG9jYWwgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgQUNMIGNvbm5lY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlbW90ZSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIGNvbm5lY3Rpb24gZXhpc3RzLgotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIG5vIGFjdGl2ZSBsaW5rIHdpdGggYmQgYWRkciBzcGVjaWZpZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0dldFJvbGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsIHRIQ0lfUk9MRSogcF9yb2xlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Td2l0Y2hSb2xlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzd2l0Y2ggcm9sZSBiZXR3ZWVuIGNlbnRyYWwgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuICBJZiByb2xlIGlzIGFscmVhZHkgc2V0IGl0IHdpbGwgZG8gbm90aGluZy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIGFscmVhZHkgaW4gc3BlY2lmaWVkIHJvbGUuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBjb21tYW5kIGlzc3VlZCB0byBjb250cm9sbGVyLgotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIG1lbW9yeSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQgdG8gaXNzdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIG5vIGFjdGl2ZSBsaW5rIHdpdGggYmQgYWRkciBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX01PREVfVU5TVVBQT1JURUQgaWYgdGhlIGxvY2FsIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgc3dpdGNoaW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9Td2l0Y2hSb2xlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyLCB1aW50OF90IG5ld19yb2xlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUlNTSQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgbGluayBwb2xpY3kgc2V0dGluZ3MuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhZGRyZXNzIG9mIGxpbmsgcG9saWN5IHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICBjYWxsYmFjay4gKHRCVE1fUlNTSV9SRVNVTFQpCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgY29tbWFuZCBpc3N1ZWQgdG8gY29udHJvbGxlci4KLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBtZW1vcnkgY291bGRuJ3QgYmUgYWxsb2NhdGVkIHRvIGlzc3VlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1VOS05PV05fQUREUiBpZiBubyBhY3RpdmUgbGluayB3aXRoIGJkIGFkZHIgc3BlY2lmaWVkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIGNvbW1hbmQgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUmVhZFJTU0koY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9DTVBMX0NCKiBwX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGZhaWxlZCBjb250YWN0IGNvdW50ZXIuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW4gdGhlIGNhbGxiYWNrLgotICogICAgICAgICAgICAgICAgICAodEJUTV9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX1JFU1VMVCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBjb21tYW5kIGlzc3VlZCB0byBjb250cm9sbGVyLgotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIG1lbW9yeSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQgdG8gaXNzdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIG5vIGFjdGl2ZSBsaW5rIHdpdGggYmQgYWRkciBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgY29tbWFuZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBhdXRvbWF0aWMgZmx1c2ggdGltZW91dC4KLSAqICAgICAgICAgICAgICAgICAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiB0aGUgY2FsbGJhY2suCi0gKiAgICAgICAgICAgICAgICAgICh0QlRNX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUX1JFU1VMVCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBjb21tYW5kIGlzc3VlZCB0byBjb250cm9sbGVyLgotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIG1lbW9yeSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQgdG8gaXNzdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIG5vIGFjdGl2ZSBsaW5rIHdpdGggYmQgYWRkciBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgY29tbWFuZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkQXV0b21hdGljRmx1c2hUaW1lb3V0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRUeFBvd2VyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgVFggcG93ZXIgb2YgdGhlIGNvbm5lY3Rpb24uIFRoZSBUWCBwb3dlciBsZXZlbCByZXN1bHRzCi0gKiAgICAgICAgICAgICAgICAgIGFyZSByZXR1cm5lZCBpbiB0aGUgY2FsbGJhY2suCi0gKiAgICAgICAgICAgICAgICAgICh0QlRNX1JTU0lfUkVTVUxUKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIGNvbW1hbmQgaXNzdWVkIHRvIGNvbnRyb2xsZXIuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgbWVtb3J5IGNvdWxkbid0IGJlIGFsbG9jYXRlZCB0byBpc3N1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgbm8gYWN0aXZlIGxpbmsgd2l0aCBiZCBhZGRyIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiBjb21tYW5kIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRUeFBvd2VyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVE1fQ01QTF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIChlKVNDTyBDSEFOTkVMIE1BTkFHRU1FTlQgRlVOQ1RJT05TCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ3JlYXRlU2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjcmVhdGUgYW4gU0NPIGNvbm5lY3Rpb24uIElmIHRoZQotICogICAgICAgICAgICAgICAgICAiaXNfb3JpZyIgZmxhZyBpcyB0cnVlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIG9yaWdpbmF0ZWQsCi0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBCVE0gd2lsbCB3YWl0IGZvciB0aGUgb3RoZXIgc2lkZSB0byBjb25uZWN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1VOS05PV05fQUREUiBpZiB0aGUgQUNMIGNvbm5lY3Rpb24gaXMgbm90IHVwCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZICAgICAgICAgaWYgYW5vdGhlciBTQ08gYmVpbmcgc2V0IHVwIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgQkQgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIHRoZSBtYXggU0NPIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEICBpZiB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IGlzIHN0YXJ0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCAiKnBfc2NvX2lueCIgaXMgZmlsbGVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc2NvIGluZGV4IHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQ3JlYXRlU2NvKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZGEsIGJvb2wgaXNfb3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGt0X3R5cGVzLCB1aW50MTZfdCogcF9zY29faW54LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NDT19DQiogcF9jb25uX2NiLCB0QlRNX1NDT19DQiogcF9kaXNjX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZW1vdmVTY28KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIHNwZWNpZmljIFNDTyBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQsIG90aGVyd2lzZSBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUmVtb3ZlU2NvKHVpbnQxNl90IHNjb19pbngpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRTY29CZEFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVhZCB0aGUgcmVtb3RlIEJEIEFkZHJlc3MgZm9yIGEgc3BlY2lmaWMKLSAqICAgICAgICAgICAgICAgICAgU0NPIGNvbm5lY3Rpb24sCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIEJEIGFkZHJlc3Mgb3IgTlVMTCBpZiBub3Qga25vd24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgUmF3QWRkcmVzcyogQlRNX1JlYWRTY29CZEFkZHIodWludDE2X3Qgc2NvX2lueCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0RVNjb01vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzIGZvciBTQ08gb3IKLSAqICAgICAgICAgICAgICAgICAgZVNDTywgYW5kIHNldHMgYXMgdGhlIGRlZmF1bHQgbW9kZSB1c2VkIGZvciBjYWxscyB0bwotICogICAgICAgICAgICAgICAgICBCVE1fQ3JlYXRlU2NvLiAgSXQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vCi0gKiAgICAgICAgICAgICAgICAgIGFjdGl2ZSAoZSlTQ08gbGlua3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiB0aGUgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGFjdGl2ZSAoZSlTQ08gbGlua3MuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXRFU2NvTW9kZShlbmhfZXNjb19wYXJhbXNfdCogcF9wYXJtcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVnRm9yRVNjb0V2dHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGEgU0NPIGV2ZW50IGNhbGxiYWNrIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbnN0YW5jZS4gIEl0IHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gaW5kaWNhdGlvbiBldmVudHMgYW5kIGNoYW5nZSBvZiBsaW5rIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICBldmVudHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiB0aGUgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgdGhlcmUgaXMgYW4gaWxsZWdhbCBzY29faW54Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWdGb3JFU2NvRXZ0cyh1aW50MTZfdCBzY29faW54LCB0QlRNX0VTQ09fQ0JBQ0sqIHBfZXNjb19jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fRVNjb0Nvbm5Sc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gcmVjZWlwdCBvZiBhbiAoZSlTQ08gY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICByZXF1ZXN0IGV2ZW50IChCVE1fRVNDT19DT05OX1JFUV9FVlQpIHRvIGFjY2VwdCBvciByZWplY3QKLSAqICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QuIFBhcmFtZXRlcnMgdXNlZCB0byBuZWdvdGlhdGUgZVNDTyBsaW5rcy4KLSAqICAgICAgICAgICAgICAgICAgSWYgcF9wYXJtcyBpcyBOVUxMLCB0aGVuIHZhbHVlcyBzZXQgdGhyb3VnaCBCVE1fU2V0RVNjb01vZGUKLSAqICAgICAgICAgICAgICAgICAgYXJlIHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBsaW5rIHR5cGUgb2YgdGhlIGluY29taW5nIHJlcXVlc3QgaXMgU0NPLCB0aGVuIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgdGhlIHR4X2J3LCBtYXhfbGF0ZW5jeSwgY29udGVudCBmb3JtYXQsIGFuZCBwYWNrZXRfdHlwZXMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIHZhbGlkLiAgVGhlIGhjaV9zdGF0dXMgcGFyYW1ldGVyIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAoWzB4MF0gdG8gYWNjZXB0LCBbMHgwZC4uMHgwZl0gdG8gcmVqZWN0KQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fRVNjb0Nvbm5Sc3AodWludDE2X3Qgc2NvX2lueCwgdWludDhfdCBoY2lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFybXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldE51bVNjb0xpbmtzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgU0NPIGxpbmtzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDhfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9HZXROdW1TY29MaW5rcyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU0VDVVJJVFkgTUFOQUdFTUVOVCBGVU5DVElPTlMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQXBwbGljYXRpb24gbWFuYWdlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGZvcgotICogICAgICAgICAgICAgICAgICBzZWN1cml0eSBzZXJ2aWNlcy4gIFRoZXJlIGNhbiBiZSBvbmUgYW5kIG9ubHkgb25lCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNhdmluZyBsaW5rIGtleXMuICBCVE0gYWxsb3dzIG9ubHkgZmlyc3QKLSAqICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NlY1JlZ2lzdGVyKGNvbnN0IHRCVE1fQVBQTF9JTkZPKiBwX2NiX2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0FkZFJtdE5hbWVOb3RpZnlDYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvZmlsZXMgY2FuIHJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmFtZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGRldmljZSBpcyByZXNvbHZlZCAodXAgdG8KLSAqICAgICAgICAgICAgICAgICAgQlRNX1NFQ19NQVhfUk1UX05BTUVfQ0FMTEJBQ0tTKS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVnaXN0ZXJlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNBZGRSbXROYW1lTm90aWZ5Q2FsbGJhY2sodEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBIHByb2ZpbGUgY2FuIGRlcmVnaXN0ZXIgbm90aWZpY2F0aW9uIHdoZW4gYSBuZXcgTGluayBLZXkKLSAqICAgICAgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIHBlciBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNEZWxldGVSbXROYW1lTm90aWZ5Q2FsbGJhY2sodEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgc2VjdXJpdHkgZmxhZ3MgZm9yIHRoZSBkZXZpY2Ugb24gYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydAotICoKLSAqIFBhcmFtZXRlcnMgICAgICBiZF9hZGRyOiBCRCBhZGRyZXNzIG9mIHJlbW90ZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcF9zZWNfZmxhZ3MgOiBPdXQgcGFyYW1ldGVyIHRvIGJlIGZpbGxlZCB3aXRoIHNlY3VyaXR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA6ICBQaHlzaWNhbCB0cmFuc3BvcnQgb2YgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUi9FRFIgb3IgTEUpCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICAgIHRydWUgb3IgZmFsc2UgaXMgZGV2aWNlIGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2VjX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRQaW5UeXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgUElOIHR5cGUgZm9yIHRoZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1NldFBpblR5cGUodWludDhfdCBwaW5fdHlwZSwgUElOX0NPREUgcGluX2NvZGUsIHVpbnQ4X3QgcGluX2NvZGVfbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRTZWN1cml0eUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlciBzZXJ2aWNlIHNlY3VyaXR5IGxldmVsIHdpdGggU2VjdXJpdHkgTWFuYWdlci4gIEVhY2gKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZSBtdXN0IHJlZ2lzdGVyIGl0cyByZXF1aXJlbWVudHMgcmVnYXJkbGVzcyBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgc2VjdXJpdHkgbGV2ZWwgdGhhdCBpcyB1c2VkLiAgVGhpcyBBUEkgaXMgY2FsbGVkIG9uY2UgZm9yCi0gKiAgICAgICAgICAgICAgICAgIG9yaWdpbmF0b3JzIGFuZCBhZ2FpbiBmb3IgYWNjZXB0b3JzIG9mIGNvbm5lY3Rpb25zLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NldFNlY3VyaXR5TGV2ZWwoYm9vbCBpc19vcmlnaW5hdG9yLCBjb25zdCBjaGFyKiBwX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZV9pZCwgdWludDE2X3Qgc2VjX2xldmVsLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG14X3Byb3RvX2lkLCB1aW50MzJfdCBteF9jaGFuX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNDbHJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmVzIHNwZWNpZmllZCBzZXJ2aWNlIHJlY29yZChzKSBmcm9tIHRoZSBzZWN1cml0eQotICogICAgICAgICAgICAgICAgICBkYXRhYmFzZS4gQWxsIHNlcnZpY2UgcmVjb3JkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhcmUKLSAqICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4gVHlwaWNhbGx5IHVzZWQgb25seSBieSBkZXZpY2VzIHdpdGggbGltaXRlZCBSQU0KLSAqICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBjYW4gcmV1c2UgYW4gb2xkIHNlY3VyaXR5IHNlcnZpY2UgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTnVtYmVyIG9mIHJlY29yZHMgdGhhdCB3ZXJlIGZyZWVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9TZWNDbHJTZXJ2aWNlKHVpbnQ4X3Qgc2VydmljZV9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IGRldmljZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBub3JtYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICogICAgICAgICAgICAgICAgICBkZXZfY2xhc3MsIGJkX25hbWUsIGxpbmtfa2V5LCBhbmQgZmVhdHVyZXMgYXJlIE5VTEwgaWYKLSAqICAgICAgICAgICAgICAgICAgdW5rbm93bgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsIHVpbnQ4X3QqIGZlYXR1cmVzLCBMaW5rS2V5KiBsaW5rX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV90eXBlLCB1aW50OF90IHBpbl9sZW5ndGgpOwotCi0vKiogRnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHxiZF9hZGRyfCBhZGRyZXNzLgotICoKLSAqICoqKiBXQVJOSU5HICoqKgotICogdEJUTV9TRUNfREVWX1JFQyBhc3NvY2lhdGVkIHdpdGggYmRfYWRkciBiZWNvbWVzIGludmFsaWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbgotICogaXMgY2FsbGVkLCBhbHNvIGFueSBvZiBpdCdzIGZpZWxkcy4gaS5lLiBpZiB5b3UgdXNlIHBfZGV2X3JlYy0+YmRfYWRkciwgaXQgaXMKLSAqIG5vIGxvbmdlciB2YWxpZCEKLSAqICoqKiBXQVJOSU5HICoqKgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiByZW1vdmVkIE9LLCBmYWxzZSBpZiBub3QgZm91bmQgb3IgQUNMIGxpbmsgaXMgYWN0aXZlLgotICovCi1ib29sIEJUTV9TZWNEZWxldGVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQ2xlYXJTZWN1cml0eUZsYWdzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXNldCB0aGUgc2VjdXJpdHkgZmxhZ3MgKG1hcmsgYXMgbm90LXBhaXJlZCkgZm9yIGEgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIGRldmljZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fU2VjQ2xlYXJTZWN1cml0eUZsYWdzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0dldERldmljZUxpbmtLZXlUeXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvYnRhaW4gbGluayBrZXkgdHlwZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgaXQgcmV0dXJucyBCVE1fU1VDQ0VTUyBpZiBsaW5rIGtleSBpcyBhdmFpbGFibGUsIG9yCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgU2VjdXJpdHkgTWFuYWdlciBkb2VzIG5vdCBrbm93IGFib3V0Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBkZXZpY2Ugb3IgZGV2aWNlIHJlY29yZCBkb2VzIG5vdCBjb250YWluIGxpbmsga2V5IGluZm8KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9MS0VZX1RZUEVfSUdOT1JFIGlmIGxpbmsga2V5IGlzIHVua25vd24sIGxpbmsgdHlwZQotICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fTElOS19LRVlfVFlQRSBCVE1fU2VjR2V0RGV2aWNlTGlua0tleVR5cGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUElOQ29kZVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBTZWN1cml0eSBNYW5hZ2VyIHN1Ym1pdHRlZAotICogICAgICAgICAgICAgICAgICBQSU4gY29kZSByZXF1ZXN0IHRvIHRoZSBVSS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3Igd2hpY2ggUElOIHdhcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcwotICogICAgICAgICAgICAgICAgICBwaW5fbGVuICAgICAgLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIFBJTiBDb2RlCi0gKiAgICAgICAgICAgICAgICAgIHBfcGluICAgICAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCB0aGUgUElOIENvZGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUElOQ29kZVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVE1fU1RBVFVTIHJlcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIHVpbnQ4X3QqIHBfcGluKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNCb25kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQZXJmb3JtIGJvbmRpbmcgYnkgZGVzaWduYXRlZCB0cmFuc3BvcnQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSB0byBib25kCi0gKiAgICAgICAgICAgICAgICAgIGFkZHJfdHlwZSAgICAtIGFkZHJlc3MgdHlwZSBmb3IgTEUgdHJhbnNwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIHBpbl9sZW4gICAgICAtIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgUElOIENvZGUKLSAqICAgICAgICAgICAgICAgICAgcF9waW4gICAgICAgIC0gcG9pbnRlciB0byBhcnJheSB3aXRoIHRoZSBQSU4gQ29kZQotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgOiAgUGh5c2ljYWwgdHJhbnNwb3J0IHRvIHVzZSBmb3IgYm9uZGluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJSL0VEUiBvciBMRSkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkLCBvdGhlcndpc2UgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NlY0JvbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQm9uZENhbmNlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2FuY2VsIG9uZ29pbmcgYm9uZGluZyBwcm9jZXNzCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggcGVlciBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCwgb3RoZXJ3aXNlIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZWNCb25kQ2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldEVuY3J5cHRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVuc3VyZSB0aGF0IGNvbm5lY3Rpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkLiAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uIGFuIG9wZW4gY29ubmVjdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IG9ubHkgbmVlZGVkIGZvciBjb25uZWN0aW9ucyB0aGF0IGZpcnN0IHdhbnQgdG8KLSAqICAgICAgICAgICAgICAgICAgYnJpbmcgdXAgdW5lbmNyeXB0ZWQgbGlua3MsIHRoZW4gbGF0ZXIgZW5jcnlwdCB0aGVtLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCAgICAgLSBMaW5rIHRyYW5zcG9ydAotICogICAgICAgICAgICAgICAgICBwX2NhbGxiYWNrICAgIC0gUG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBQRU5ESU5HIGFmdGVyIHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZWR1cmVzIGFyZSBjb21wbGV0ZWQuICBDYW4gYmUgc2V0IHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIHN0YXR1cyBpcyBub3QgZGVzaXJlZC4KLSAqICAgICAgICAgICAgICAgICAgcF9yZWZfZGF0YSAgICAtIHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGNhbGxlciB3aXNoZXMgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVwb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgc2V0IHRvIE5VTEwgaWYgbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgIHNlY19hY3QgICAgICAgLSBMRSBzZWN1cml0eSBhY3Rpb24sIHVudXNlZCBmb3IgQlIvRURSCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyAgIC0gYWxyZWFkeSBlbmNyeXB0ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1BFTkRJTkcgICAtIGNvbW1hbmQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUtIGNvbm5lY3Rpb24gbm90IHVwLgotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSAgICAgIC0gc2VjdXJpdHkgcHJvY2VkdXJlcyBhcmUgY3VycmVudGx5IGFjdGl2ZQotICogICAgICAgICAgICAgICAgICBCVE1fTU9ERV9VTlNVUFBPUlRFRCAtIGlmIHNlY3VyaXR5IG1hbmFnZXIgbm90IGxpbmtlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldEVuY3J5cHRpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0NvbmZpcm1SZXFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29uZmlybSB0aGUgbnVtZXJpYyB2YWx1ZSBmb3IKLSAqICAgICAgICAgICAgICAgICAgU2ltcGxlIFBhaXJpbmcgaW4gcmVzcG9uc2UgdG8gQlRNX1NQX0NGTV9SRVFfRVZUCi0gKgotICogUGFyYW1ldGVyczogICAgICByZXMgICAgICAgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0NvbmZpcm1SZXFSZXBseSh0QlRNX1NUQVRVUyByZXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1Bhc3NrZXlSZXFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgcGFzc2tleSBmb3IKLSAqICAgICAgICAgICAgICAgICAgU2ltcGxlIFBhaXJpbmcgaW4gcmVzcG9uc2UgdG8gQlRNX1NQX0tFWV9SRVFfRVZUCi0gKgotICogUGFyYW1ldGVyczogICAgICByZXMgICAgICAgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NrZXkgICAgICAgLSBudW1lcmljIHZhbHVlIGluIHRoZSByYW5nZSBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIDk5OTk5OSgweEY0MjNGKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUGFzc2tleVJlcVJlcGx5KHRCVE1fU1RBVFVTIHJlcywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNza2V5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Jb0NhcFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gQlRNX1NQX0lPX1JFUV9FVlQKLSAqICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgZXZlbnQgZGF0YSBpb19yZXEub29iX2RhdGEgaXMgc2V0IHRvCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9PT0JfVU5LTk9XTiBieSB0aGUgdEJUTV9TUF9DQUxMQkFDSyBpbXBsZW1lbnRhdGlvbiwgdGhpcwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgYWN0dWFsIHJlc3BvbnNlCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgaW9fY2FwICAtIFRoZSBJTyBjYXBhYmlsaXR5IG9mIGxvY2FsIGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgb29iICAgICAtIEJUTV9PT0JfTk9ORSBvciBCVE1fT09CX1BSRVNFTlQuCi0gKiAgICAgICAgICAgICAgICAgIGF1dGhfcmVxLSBNSVRNIHByb3RlY3Rpb24gcmVxdWlyZWQgb3Igbm90LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9Jb0NhcFJzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRNX0lPX0NBUCBpb19jYXAsCi0gICAgICAgICAgICAgICAgICB0QlRNX09PQl9EQVRBIG9vYiwgdEJUTV9BVVRIX1JFUSBhdXRoX3JlcSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZExvY2FsT29iRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgbG9jYWwgT09CIGRhdGEgZnJvbQotICogICAgICAgICAgICAgICAgICBMTQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9SZWFkTG9jYWxPb2JEYXRhKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlbW90ZU9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgcmVtb3RlIE9PQiBkYXRhIGZvcgotICogICAgICAgICAgICAgICAgICBTaW1wbGUgUGFpcmluZyBpbiByZXNwb25zZSB0byBCVE1fU1BfUk1UX09PQl9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgYyAgICAgICAgICAgLSBzaW1wbGUgcGFpcmluZyBIYXNoIEMuCi0gKiAgICAgICAgICAgICAgICAgIHIgICAgICAgICAgIC0gc2ltcGxlIHBhaXJpbmcgUmFuZG9taXplciAgQy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVtb3RlT29iRGF0YVJlcGx5KHRCVE1fU1RBVFVTIHJlcywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgYm90aCB0aGUgbG9jYWwgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcGVlciBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGJkX2FkZHIgc3VwcG9ydCBCUi9FRFIKLSAqICAgICAgICAgICAgICAgICAgU2VjdXJlIENvbm5lY3Rpb25zLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgQlIvRURSIFNlY3VyZSBDb25uZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGJvdGgKLSAqICAgICAgICAgICAgICAgICAgbG9jYWwgYW5kIHRoZSByZW1vdGUgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBlbHNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9QZWVyU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgdGhlIHBlZXIgc3VwcG9ydHMKLSAqICAgICAgICAgICAgICAgICAgQlIvRURSIFNlY3VyZSBDb25uZWN0aW9ucy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIEJSL0VEUiBTZWN1cmUgQ29ubmVjdGlvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcGVlciwKLSAqICAgICAgICAgICAgICAgICAgZWxzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fUGVlclN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0UGVlckRldmljZVR5cGVGcm9tRmVhdHVyZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBwZWVyIGRldmljZSB0eXBlCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHJlZmVyZW5jaW5nIHRoZSByZW1vdGUgZmVhdHVyZXMuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyIC0gYWRkcmVzcyBvZiB0aGUgcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfREVWSUNFX1RZUEVfRFVNTyBpZiBib3RoIEJSL0VEUiBhbmQgQkxFIHRyYW5zcG9ydHMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgcGVlciwKLSAqICAgICAgICAgICAgICAgICAgQlRfREVWSUNFX1RZUEVfQlJFRFIgaWYgb25seSBCUi9FRFIgdHJhbnNwb3J0IGlzIHN1cHBvcnRlZCwKLSAqICAgICAgICAgICAgICAgICAgQlRfREVWSUNFX1RZUEVfQkxFIGlmIG9ubHkgQkxFIHRyYW5zcG9ydCBpcyBzdXBwb3J0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVF9ERVZJQ0VfVFlQRSBCVE1fR2V0UGVlckRldmljZVR5cGVGcm9tRmVhdHVyZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjUmVhZERldk5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2tzIGZvciB0aGUgZGV2aWNlIG5hbWUgaW4gdGhlIHNlY3VyaXR5IGRhdGFiYXNlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIEJEIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuYW1lIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciogQlRNX1NlY1JlYWREZXZOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldEhDSUNvbm5IYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgaGFuZGxlIGZvciBhbiBBQ0wKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIHJlbW90ZSBCRCBBZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiwgb3IgMHhGRkZGIGlmIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUTV9HZXRIQ0lDb25uSGFuZGxlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fRGVsZXRlU3RvcmVkTGlua0tleQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVsZXRlIGxpbmsga2V5IGZvciB0aGUgc3BlY2lmaWVkCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZSBhZGRyZXNzZXMgZnJvbSB0aGUgTlZSQU0gc3RvcmFnZSBhdHRhY2hlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoIGNvbnRyb2xsZXIuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgLSBBZGRyZXNzZXMgb2YgdGhlIGRldmljZXMKLSAqICAgICAgICAgICAgICAgICAgcF9jYiAgICAgICAgIC0gQ2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byByZXR1cm4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0RlbGV0ZVN0b3JlZExpbmtLZXkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYik7Ci0KLXRCVE1fQ09OVFJMX1NUQVRFIEJUTV9QTV9SZWFkQ29udHJvbGxlclN0YXRlKHZvaWQpOwotCi0vKioKLSAqCi0gKiBCTEUgQVBJCi0gKi8KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgc2NhbiBwYXJhbWV0ZXJzLiB8Y2J8IGlzIGNhbGxlZCB3aXRoIG9wZXJhdGlvbgotICogc3RhdHVzCi0gKiovCi12b2lkIEJUTV9CbGVTZXRTY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX1NDQU5fTU9ERSBzY2FuX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCk+IGNiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVHZXRWZW5kb3JDYXBhYmlsaXRpZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgbG9jYWwgTEUgZmVhdHVyZXMKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfY21uX3ZzY19jYiA6IExvY2FsYSBMRSBjYXBhYmlsaXR5IHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVHZXRWZW5kb3JDYXBhYmlsaXRpZXModEJUTV9CTEVfVlNDX0NCKiBwX2Ntbl92c2NfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVNldFN0b3JhZ2VDb25maWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldHVwIHN0b3JhZ2UgY29uZmlndXJhdGlvbiBhbmQKLSAqICAgICAgICAgICAgICAgICAgc2V0dXAgY2FsbGJhY2tzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgdWludDhfdCBiYXRjaF9zY2FuX2Z1bGxfbWF4IC1CYXRjaCBzY2FuIGZ1bGwgbWF4aW11bQotICogICAgICAgICAgICAgICAgICB1aW50OF90IGJhdGNoX3NjYW5fdHJ1bmNfbWF4IC0gQmF0Y2ggc2NhbiB0cnVuY2F0ZWQgdmFsdWUKLSAqbWF4aW11bSB1aW50OF90IGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCAtIFRocmVzaG9sZCB2YWx1ZSBjYiAtIFNldHVwCi0gKmNhbGxiYWNrIHRCVE1fQkxFX1NDQU5fVEhSRVNIT0xEX0NCQUNLICpwX3RocmVzX2NiYWNrIC1UaHJlc2hvbGQgY2FsbGJhY2sgdm9pZAotICoqcF9yZWYgLSBSZWZlcmVuY2UgdmFsdWUKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVNldFN0b3JhZ2VDb25maWcodWludDhfdCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJhdGNoX3NjYW5fdHJ1bmNfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLyk+IGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TQ0FOX1RIUkVTSE9MRF9DQkFDSyogcF90aHJlc19jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVuYWJsZSBiYXRjaCBzY2FuICovCi12b2lkIEJUTV9CbGVFbmFibGVCYXRjaFNjYW4odEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFIHNjYW5fbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FuX2ludGVydmFsLCB1aW50MzJfdCBzY2FuX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9ESVNDQVJEX1JVTEUgZGlzY2FyZF9ydWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogc3RhdHVzICovKT4gY2IpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkaXNhYmxlIGJhdGNoIHNjYW5uaW5nICovCi12b2lkIEJUTV9CbGVEaXNhYmxlQmF0Y2hTY2FuKGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYik7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYmF0Y2ggc2NhbiByZXBvcnRzICovCi12b2lkIEJUTV9CbGVSZWFkU2NhblJlcG9ydHModEJMRV9TQ0FOX01PREUgc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NDQU5fUkVQX0NCQUNLIGNiKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0dXAgdGhlIGNhbGxiYWNrIGZvciB0cmFja2luZyAqLwotdm9pZCBCVE1fQmxlVHJhY2tBZHZlcnRpc2VyKHRCVE1fQkxFX1RSQUNLX0FEVl9DQkFDSyogcF90cmFja19jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYWRzIEJMRSBzcGVjaWZpYyBjb250cm9sbGVyIGZlYXR1cmVzCi0gKgotICogUGFyYW1ldGVyczogICAgICB0QlRNX0JMRV9DVFJMX0ZFQVRVUkVTX0NCQUNLIDogQ2FsbGJhY2sgdG8gbm90aWZ5IHdoZW4KLSAqICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgYXJlIHJlYWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlUmVhZENvbnRyb2xsZXJGZWF0dXJlcyh0QlRNX0JMRV9DVFJMX0ZFQVRVUkVTX0NCQUNLKiBwX3ZzY19jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fX0JMRVJlYWREaXNjb3ZlcmFiaWxpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGN1cnJlbnQgTEUKLSAqICAgICAgICAgICAgICAgICAgZGlzY292ZXJhYmlsaXR5IG1vZGUgb2YgdGhlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9CTEVfTk9OX0RJU0NPVkVSQUJMRSAsQlRNX0JMRV9MSU1JVEVEX0RJU0NPVkVSQUJMRSBvcgotICogICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX0dFTlJBTF9ESVNDT1ZFUkFCTEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQlRNX0JsZVJlYWREaXNjb3ZlcmFiaWxpdHkoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9fQkxFUmVhZENvbm5lY3RhYmlsaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBjdXJyZW50IExFCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3RpYmlsaXR5IG1vZGUgb2YgdGhlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9CTEVfTk9OX0NPTk5FQ1RBQkxFIG9yIEJUTV9CTEVfQ09OTkVDVEFCTEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQlRNX0JsZVJlYWRDb25uZWN0YWJpbGl0eSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUNvbmZpZ1ByaXZhY3kKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBwcml2YWN5IGluCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBsb2NhbCBkZXZpY2UuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBlbmFibGU6IHRydWUgdG8gZW5hYmxlIGl0OyBmYWxzZSB0byBkaXNhYmxlIGl0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICBwcml2YWN5IG1vZGUgc2V0IHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0JsZUNvbmZpZ1ByaXZhY3koYm9vbCBlbmFibGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUxvY2FsUHJpdmFjeUVuYWJsZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgICAgQ2hlY2tzIGlmIGxvY2FsIGRldmljZSBzdXBwb3J0cyBwcml2YXRlIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybiB0cnVlIGlmIGxvY2FsIHByaXZhY3kgaXMgZW5hYmxlZCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0JsZUxvY2FsUHJpdmFjeUVuYWJsZWQodm9pZCk7Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbnMgYXJlIGNhbGxlZCB0byBjb25maWd1cmUgdGhlIGFkdiBkYXRhIHBheWxvYWQgZmlsdGVyIGNvbmRpdGlvbgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUdldEVuZXJneUluZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gb2J0YWlucyB0aGUgZW5lcmd5IGluZm8KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZW5lcl9jYmFjayAtIENhbGxiYWNrIHBvaW50ZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQmxlR2V0RW5lcmd5SW5mbyh0QlRNX0JMRV9FTkVSR1lfSU5GT19DQkFDSyogcF9lbmVyX2NiYWNrKTsKLQotLyoqCi0gKiBTZW5kIHJlbW90ZSBuYW1lIHJlcXVlc3QgdG8gR0Qgc2hpbSBOYW1lIG1vZHVsZQotICovCi12b2lkIFNlbmRSZW1vdGVOYW1lUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcyk7Ci0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfbXhfYWNjZXNzX3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2NvbmZpZy5jYyBiL21haW4vc2hpbS9jb25maWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmQwMjIuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2NvbmZpZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NoaW1fc3RvcmFnZSIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiZ2Qvb3MvbG9nLmgiCi0jaW5jbHVkZSAiZ2Qvc3RvcmFnZS9jb25maWdfY2FjaGVfaGVscGVyLmgiCi0jaW5jbHVkZSAiZ2Qvc3RvcmFnZS9zdG9yYWdlX21vZHVsZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9jb25maWcuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLQotdXNpbmcgOjpibHVldG9vdGg6OnNoaW06OkdldFN0b3JhZ2U7Ci11c2luZyA6OmJsdWV0b290aDo6c3RvcmFnZTo6Q29uZmlnQ2FjaGVIZWxwZXI7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1ib29sIEJ0aWZDb25maWdJbnRlcmZhY2U6Okhhc1NlY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgcmV0dXJuIEdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKS0+SGFzU2VjdGlvbihzZWN0aW9uKTsKLX0KLQotYm9vbCBCdGlmQ29uZmlnSW50ZXJmYWNlOjpIYXNQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSB7Ci0gIHJldHVybiBHZXRTdG9yYWdlKCktPkdldENvbmZpZ0NhY2hlKCktPkhhc1Byb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5KTsKLX0KLQotYm9vbCBCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRJbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksIGludCogdmFsdWUpIHsKLSAgQVNTRVJUKHZhbHVlICE9IG51bGxwdHIpOwotICBhdXRvIHJldCA9IENvbmZpZ0NhY2hlSGVscGVyOjpGcm9tQ29uZmlnQ2FjaGUoKkdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKSkKLSAgICAgICAgICAgICAgICAgLkdldEludChzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gIGlmIChyZXQpIHsKLSAgICAqdmFsdWUgPSAqcmV0OwotICB9Ci0gIHJldHVybiByZXQuaGFzX3ZhbHVlKCk7Ci19Ci0KLWJvb2wgQnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0SW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LCBpbnQgdmFsdWUpIHsKLSAgQ29uZmlnQ2FjaGVIZWxwZXI6OkZyb21Db25maWdDYWNoZSgqR2V0U3RvcmFnZSgpLT5HZXRDb25maWdDYWNoZSgpKQotICAgICAgLlNldEludChzZWN0aW9uLCBwcm9wZXJ0eSwgdmFsdWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRVaW50NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogdmFsdWUpIHsKLSAgQVNTRVJUKHZhbHVlICE9IG51bGxwdHIpOwotICBhdXRvIHJldCA9IENvbmZpZ0NhY2hlSGVscGVyOjpGcm9tQ29uZmlnQ2FjaGUoKkdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKSkKLSAgICAgICAgICAgICAgICAgLkdldFVpbnQ2NChzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gIGlmIChyZXQpIHsKLSAgICAqdmFsdWUgPSAqcmV0OwotICB9Ci0gIHJldHVybiByZXQuaGFzX3ZhbHVlKCk7Ci19Ci0KLWJvb2wgQnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0VWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpIHsKLSAgQ29uZmlnQ2FjaGVIZWxwZXI6OkZyb21Db25maWdDYWNoZSgqR2V0U3RvcmFnZSgpLT5HZXRDb25maWdDYWNoZSgpKQotICAgICAgLlNldFVpbnQ2NChzZWN0aW9uLCBwcm9wZXJ0eSwgdmFsdWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRTdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksIGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzaXplX2J5dGVzKSB7Ci0gIEFTU0VSVCh2YWx1ZSAhPSBudWxscHRyKTsKLSAgQVNTRVJUKHNpemVfYnl0ZXMgIT0gbnVsbHB0cik7Ci0gIGF1dG8gc3RyID0gR2V0U3RvcmFnZSgpLT5HZXRDb25maWdDYWNoZSgpLT5HZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSk7Ci0gIGlmICghc3RyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICgqc2l6ZV9ieXRlcyA9PSAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgLy8gc3RkOjpzdHJpbmc6OmNvcHkgZG9lcyBub3QgbnVsbC10ZXJtaW5hdGUgcmVzdWx0YW50IHN0cmluZyBieSBkZWZhdWx0Ci0gIC8vIGF2b2lkZWQgdXNpbmcgc3RybGNweSB0byBwcmV2ZW50IGV4dHJhIGRlcGVuZGVuY3kKLSAgKnNpemVfYnl0ZXMgPSBzdHItPmNvcHkodmFsdWUsICgqc2l6ZV9ieXRlcyAtIDEpKTsKLSAgdmFsdWVbKnNpemVfYnl0ZXNdID0gJ1wwJzsKLSAgKnNpemVfYnl0ZXMgKz0gMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEJ0aWZDb25maWdJbnRlcmZhY2U6OkdldFN0cigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5KSB7Ci0gIHJldHVybiBHZXRTdG9yYWdlKCktPkdldENvbmZpZ0NhY2hlKCktPkdldFByb3BlcnR5KHNlY3Rpb24sIHByb3BlcnR5KTsKLX0KLQotYm9vbCBCdGlmQ29uZmlnSW50ZXJmYWNlOjpTZXRTdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgR2V0U3RvcmFnZSgpLT5HZXRDb25maWdDYWNoZSgpLT5TZXRQcm9wZXJ0eShzZWN0aW9uLCBwcm9wZXJ0eSwgdmFsdWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVE9ETzogaW1wbGVtZW50IGVuY3J5cHRlZCByZWFkCi1ib29sIEJ0aWZDb25maWdJbnRlcmZhY2U6OkdldEJpbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eSwgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGxlbmd0aCkgewotICBBU1NFUlQodmFsdWUgIT0gbnVsbHB0cik7Ci0gIEFTU0VSVChsZW5ndGggIT0gbnVsbHB0cik7Ci0gIGF1dG8gdmFsdWVfdmVjID0KLSAgICAgIENvbmZpZ0NhY2hlSGVscGVyOjpGcm9tQ29uZmlnQ2FjaGUoKkdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKSkKLSAgICAgICAgICAuR2V0QmluKHNlY3Rpb24sIHByb3BlcnR5KTsKLSAgaWYgKCF2YWx1ZV92ZWMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgKmxlbmd0aCA9IHN0ZDo6bWluKHZhbHVlX3ZlYy0+c2l6ZSgpLCAqbGVuZ3RoKTsKLSAgc3RkOjptZW1jcHkodmFsdWUsIHZhbHVlX3ZlYy0+ZGF0YSgpLCAqbGVuZ3RoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1zaXplX3QgQnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0QmluTGVuZ3RoKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgYXV0byB2YWx1ZV92ZWMgPQotICAgICAgQ29uZmlnQ2FjaGVIZWxwZXI6OkZyb21Db25maWdDYWNoZSgqR2V0U3RvcmFnZSgpLT5HZXRDb25maWdDYWNoZSgpKQotICAgICAgICAgIC5HZXRCaW4oc2VjdGlvbiwgcHJvcGVydHkpOwotICBpZiAoIXZhbHVlX3ZlYykgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB2YWx1ZV92ZWMtPnNpemUoKTsKLX0KLWJvb2wgQnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0QmluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpIHsKLSAgQVNTRVJUKHZhbHVlICE9IG51bGxwdHIpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZV92ZWModmFsdWUsIHZhbHVlICsgbGVuZ3RoKTsKLSAgQ29uZmlnQ2FjaGVIZWxwZXI6OkZyb21Db25maWdDYWNoZSgqR2V0U3RvcmFnZSgpLT5HZXRDb25maWdDYWNoZSgpKQotICAgICAgLlNldEJpbihzZWN0aW9uLCBwcm9wZXJ0eSwgdmFsdWVfdmVjKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIEJ0aWZDb25maWdJbnRlcmZhY2U6OlJlbW92ZVByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgcmV0dXJuIEdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKS0+UmVtb3ZlUHJvcGVydHkoc2VjdGlvbiwgcHJvcGVydHkpOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0UGVyc2lzdGVudERldmljZXMoKSB7Ci0gIHJldHVybiBHZXRTdG9yYWdlKCktPkdldENvbmZpZ0NhY2hlKCktPkdldFBlcnNpc3RlbnRTZWN0aW9ucygpOwotfQotCi12b2lkIEJ0aWZDb25maWdJbnRlcmZhY2U6OkNvbnZlcnRFbmNyeXB0T3JEZWNyeXB0S2V5SWZOZWVkZWQoKSB7Ci0gIEdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKS0+Q29udmVydEVuY3J5cHRPckRlY3J5cHRLZXlJZk5lZWRlZCgpOwotfQotCi12b2lkIEJ0aWZDb25maWdJbnRlcmZhY2U6OlNhdmUoKSB7IEdldFN0b3JhZ2UoKS0+U2F2ZURlbGF5ZWQoKTsgfQotCi12b2lkIEJ0aWZDb25maWdJbnRlcmZhY2U6OkZsdXNoKCkgeyBHZXRTdG9yYWdlKCktPlNhdmVJbW1lZGlhdGVseSgpOyB9Ci0KLXZvaWQgQnRpZkNvbmZpZ0ludGVyZmFjZTo6Q2xlYXIoKSB7IEdldFN0b3JhZ2UoKS0+R2V0Q29uZmlnQ2FjaGUoKS0+Q2xlYXIoKTsgfQotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2NvbmZpZy5oIGIvbWFpbi9zaGltL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmIyMjNjLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotY2xhc3MgQnRpZkNvbmZpZ0ludGVyZmFjZSB7Ci0gcHVibGljOgotICB+QnRpZkNvbmZpZ0ludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgc3RhdGljIGJvb2wgSGFzU2VjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbik7Ci0gIHN0YXRpYyBib29sIEhhc1Byb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpOwotICBzdGF0aWMgYm9vbCBHZXRJbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0SW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgR2V0VWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0VWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpOwotICBzdGF0aWMgYm9vbCBHZXRTdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICBjaGFyKiB2YWx1ZSwgaW50KiBzaXplX2J5dGVzKTsKLSAgc3RhdGljIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEdldFN0cihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KTsKLSAgc3RhdGljIGJvb2wgU2V0U3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgR2V0QmluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHNpemVfdCogbGVuZ3RoKTsKLSAgc3RhdGljIHNpemVfdCBHZXRCaW5MZW5ndGgoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOwotICBzdGF0aWMgYm9vbCBTZXRCaW4oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSwgc2l6ZV90IGxlbmd0aCk7Ci0gIHN0YXRpYyBib29sIFJlbW92ZVByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KTsKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRQZXJzaXN0ZW50RGV2aWNlcygpOwotICBzdGF0aWMgdm9pZCBDb252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCk7Ci0gIHN0YXRpYyB2b2lkIFNhdmUoKTsKLSAgc3RhdGljIHZvaWQgRmx1c2goKTsKLSAgc3RhdGljIHZvaWQgQ2xlYXIoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vY29udHJvbGxlci5jYyBiL21haW4vc2hpbS9jb250cm9sbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRjNDU2Li4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9jb250cm9sbGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfc2hpbV9jb250cm9sbGVyIgotCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotI2luY2x1ZGUgImdkL2NvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zdGFjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInNyYy9icmlkZ2UucnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyA6OmJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQ7Ci11c2luZyA6OmJsdWV0b290aDo6c2hpbTo6R2V0Q29udHJvbGxlcjsKLQotY29uc3RleHByIGludCBrTWF4U3VwcG9ydGVkQ29kZWNzID0gODsgIC8vIE1BWF9MT0NBTF9TVVBQT1JURURfQ09ERUNTX1NJWkUKLQotY29uc3RleHByIHVpbnQ4X3Qga1BoeUxlMU0gPSAweDAxOwotCi0vKioKLSAqIEludGVyZXN0aW5nIGNvbW1hbmRzIHN1cHBvcnRlZCBieSBjb250cm9sbGVyCi0gKi8KLWNvbnN0ZXhwciBpbnQga1JlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzID0gMHg0MWM7Ci1jb25zdGV4cHIgaW50IGtFbmhhbmNlZFNldHVwU3luY2hyb25vdXNDb25uZWN0aW9uID0gMHg0Mjg7Ci1jb25zdGV4cHIgaW50IGtFbmhhbmNlZEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvbiA9IDB4NDI5OwotY29uc3RleHByIGludCBrTGVTZXRQcml2YWN5TW9kZSA9IDB4MjA0ZTsKLQotY29uc3RleHByIGludCBrSGNpRGF0YVByZWFtYmxlU2l6ZSA9IDQ7ICAvLyAjZGVmaW5lIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgNAotCi0vLyBNb2R1bGUgbGlmZWN5Y2xlIGZ1bmN0aW9ucwotc3RhdGljIGZ1dHVyZV90KiBzdGFydF91cCh2b2lkKTsKLXN0YXRpYyBmdXR1cmVfdCogc2h1dF9kb3duKHZvaWQpOwotCi1FWFBPUlRfU1lNQk9MIGV4dGVybiBjb25zdCBtb2R1bGVfdCBnZF9jb250cm9sbGVyX21vZHVsZSA9IHsKLSAgICAubmFtZSA9IEdEX0NPTlRST0xMRVJfTU9EVUxFLAotICAgIC5pbml0ID0gbnVsbHB0ciwKLSAgICAuc3RhcnRfdXAgPSBzdGFydF91cCwKLSAgICAuc2h1dF9kb3duID0gc2h1dF9kb3duLAotICAgIC5jbGVhbl91cCA9IG51bGxwdHIsCi0gICAgLmRlcGVuZGVuY2llcyA9IHtHRF9TSElNX01PRFVMRSwgbnVsbHB0cn19OwotCi1zdHJ1Y3QgewotICBib29sIHJlYWR5OwotICBSYXdBZGRyZXNzIHJhd19hZGRyZXNzOwotICBidF92ZXJzaW9uX3QgYnRfdmVyc2lvbjsKLSAgdWludDhfdCBsb2NhbF9zdXBwb3J0ZWRfY29kZWNzW2tNYXhTdXBwb3J0ZWRDb2RlY3NdOwotICB1aW50OF90IG51bWJlcl9vZl9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzOwotICB1aW50NjRfdCBsZV9zdXBwb3J0ZWRfc3RhdGVzOwotICB1aW50OF90IHBoeTsKLX0gZGF0YV87Ci0KLXN0YXRpYyBmdXR1cmVfdCogc3RhcnRfdXAodm9pZCkgewotICBMT0dfSU5GTygiJXMgU3RhcnRpbmcgdXAiLCBfX2Z1bmNfXyk7Ci0gIGRhdGFfLnJlYWR5ID0gdHJ1ZTsKLQotICBpZiAoZ2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICBhdXRvIGNvbnRyb2xsZXIgPQotICAgICAgICBibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0Q29udHJvbGxlcigpOwotICAgIGF1dG8gcnVzdF9zdHJpbmdfYWRkcmVzcyA9Ci0gICAgICAgIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6Y29udHJvbGxlcl9nZXRfYWRkcmVzcygqKmNvbnRyb2xsZXIpOwotICAgIGF1dG8gc3RyaW5nX2FkZHJlc3MgPQotICAgICAgICBzdGQ6OnN0cmluZyhydXN0X3N0cmluZ19hZGRyZXNzLmRhdGEoKSwgcnVzdF9zdHJpbmdfYWRkcmVzcy5sZW5ndGgoKSk7Ci0gICAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyhzdHJpbmdfYWRkcmVzcywgZGF0YV8ucmF3X2FkZHJlc3MpOwotCi0gICAgZGF0YV8ubGVfc3VwcG9ydGVkX3N0YXRlcyA9Ci0gICAgICAgIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6Y29udHJvbGxlcl9nZXRfbGVfc3VwcG9ydGVkX3N0YXRlcygqKmNvbnRyb2xsZXIpOwotCi0gICAgTE9HX0lORk8oIk1hYyBhZGRyZXNzOiVzIiwgc3RyaW5nX2FkZHJlc3MuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpzdHJpbmcgc3RyaW5nX2FkZHJlc3MgPSBHZXRDb250cm9sbGVyKCktPkdldE1hY0FkZHJlc3MoKS5Ub1N0cmluZygpOwotICAgIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoc3RyaW5nX2FkZHJlc3MsIGRhdGFfLnJhd19hZGRyZXNzKTsKLQotICAgIGRhdGFfLmxlX3N1cHBvcnRlZF9zdGF0ZXMgPQotICAgICAgICBibHVldG9vdGg6OnNoaW06OkdldENvbnRyb2xsZXIoKS0+R2V0TGVTdXBwb3J0ZWRTdGF0ZXMoKTsKLQotICAgIGF1dG8gbG9jYWxfdmVyc2lvbl9pbmZvID0KLSAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRDb250cm9sbGVyKCktPkdldExvY2FsVmVyc2lvbkluZm9ybWF0aW9uKCk7Ci0gICAgZGF0YV8uYnRfdmVyc2lvbi5oY2lfdmVyc2lvbiA9Ci0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxvY2FsX3ZlcnNpb25faW5mby5oY2lfdmVyc2lvbl8pOwotICAgIGRhdGFfLmJ0X3ZlcnNpb24uaGNpX3JldmlzaW9uID0gbG9jYWxfdmVyc2lvbl9pbmZvLmhjaV9yZXZpc2lvbl87Ci0gICAgZGF0YV8uYnRfdmVyc2lvbi5sbXBfdmVyc2lvbiA9Ci0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxvY2FsX3ZlcnNpb25faW5mby5sbXBfdmVyc2lvbl8pOwotICAgIGRhdGFfLmJ0X3ZlcnNpb24ubG1wX3N1YnZlcnNpb24gPSBsb2NhbF92ZXJzaW9uX2luZm8ubG1wX3N1YnZlcnNpb25fOwotICAgIGRhdGFfLmJ0X3ZlcnNpb24ubWFudWZhY3R1cmVyID0gbG9jYWxfdmVyc2lvbl9pbmZvLm1hbnVmYWN0dXJlcl9uYW1lXzsKLQotICAgIExPR19JTkZPKCJNYWMgYWRkcmVzczolcyIsIHN0cmluZ19hZGRyZXNzLmNfc3RyKCkpOwotICB9Ci0KLSAgZGF0YV8ucGh5ID0ga1BoeUxlMU07Ci0KLSAgcmV0dXJuIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKEZVVFVSRV9TVUNDRVNTKTsKLX0KLQotc3RhdGljIGZ1dHVyZV90KiBzaHV0X2Rvd24odm9pZCkgewotICBkYXRhXy5yZWFkeSA9IGZhbHNlOwotICByZXR1cm4gZnV0dXJlX25ld19pbW1lZGlhdGUoRlVUVVJFX1NVQ0NFU1MpOwotfQotCi0vKioKLSAqIE1vZHVsZSBtZXRob2RzCi0gKi8KLQotc3RhdGljIGJvb2wgZ2V0X2lzX3JlYWR5KHZvaWQpIHsgcmV0dXJuIGRhdGFfLnJlYWR5OyB9Ci0KLXN0YXRpYyBjb25zdCBSYXdBZGRyZXNzKiBnZXRfYWRkcmVzcyh2b2lkKSB7IHJldHVybiAmZGF0YV8ucmF3X2FkZHJlc3M7IH0KLQotc3RhdGljIGNvbnN0IGJ0X3ZlcnNpb25fdCogZ2V0X2J0X3ZlcnNpb24odm9pZCkgeyByZXR1cm4gJmRhdGFfLmJ0X3ZlcnNpb247IH0KLQotc3RhdGljIHVpbnQ4X3QqIGdldF9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzKHVpbnQ4X3QqIG51bWJlcl9vZl9jb2RlY3MpIHsKLSAgQ0hFQ0sobnVtYmVyX29mX2NvZGVjcyAhPSBudWxscHRyKTsKLSAgaWYgKGRhdGFfLm51bWJlcl9vZl9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzICE9IDApIHsKLSAgICAqbnVtYmVyX29mX2NvZGVjcyA9IGRhdGFfLm51bWJlcl9vZl9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzOwotICAgIHJldHVybiBkYXRhXy5sb2NhbF9zdXBwb3J0ZWRfY29kZWNzOwotICB9Ci0gIHJldHVybiAodWludDhfdCopbnVsbHB0cjsKLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QqIGdldF9ibGVfc3VwcG9ydGVkX3N0YXRlcyh2b2lkKSB7Ci0gIHJldHVybiAoY29uc3QgdWludDhfdCopJmRhdGFfLmxlX3N1cHBvcnRlZF9zdGF0ZXM7Ci19Ci0KLSNkZWZpbmUgTUFQX1RPX0dEKGxlZ2FjeSwgZ2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIGxlZ2FjeSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChnZF9ydXN0X2lzX2VuYWJsZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OnJ1c3Q6OmNvbnRyb2xsZXJfIyNsZWdhY3koICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0Q29udHJvbGxlcigpKTsgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBHZXRDb250cm9sbGVyKCktPmdkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLU1BUF9UT19HRChzdXBwb3J0c19zaW1wbGVfcGFpcmluZywgU3VwcG9ydHNTaW1wbGVQYWlyaW5nKQotTUFQX1RPX0dEKHN1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucywgU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucykKLU1BUF9UT19HRChzdXBwb3J0c19zaW11bHRhbmVvdXNfbGVfYnJlZHIsIFN1cHBvcnRzU2ltdWx0YW5lb3VzTGVCckVkcikKLU1BUF9UT19HRChzdXBwb3J0c19pbnRlcmxhY2VkX2lucXVpcnlfc2NhbiwgU3VwcG9ydHNJbnRlcmxhY2VkSW5xdWlyeVNjYW4pCi1NQVBfVE9fR0Qoc3VwcG9ydHNfcnNzaV93aXRoX2lucXVpcnlfcmVzdWx0cywgU3VwcG9ydHNSc3NpV2l0aElucXVpcnlSZXN1bHRzKQotTUFQX1RPX0dEKHN1cHBvcnRzX2V4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2UsIFN1cHBvcnRzRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2UpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfdGhyZWVfc2xvdF9wYWNrZXRzLCBTdXBwb3J0czNTbG90UGFja2V0cykKLU1BUF9UT19HRChzdXBwb3J0c19maXZlX3Nsb3RfcGFja2V0cywgU3VwcG9ydHM1U2xvdFBhY2tldHMpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfY2xhc3NpY18ybV9waHksIFN1cHBvcnRzQ2xhc3NpYzJtUGh5KQotTUFQX1RPX0dEKHN1cHBvcnRzX2NsYXNzaWNfM21fcGh5LCBTdXBwb3J0c0NsYXNzaWMzbVBoeSkKLU1BUF9UT19HRChzdXBwb3J0c190aHJlZV9zbG90X2Vkcl9wYWNrZXRzLCBTdXBwb3J0czNTbG90RWRyUGFja2V0cykKLU1BUF9UT19HRChzdXBwb3J0c19maXZlX3Nsb3RfZWRyX3BhY2tldHMsIFN1cHBvcnRzNVNsb3RFZHJQYWNrZXRzKQotTUFQX1RPX0dEKHN1cHBvcnRzX3NjbywgU3VwcG9ydHNTY28pCi1NQVBfVE9fR0Qoc3VwcG9ydHNfaHYyX3BhY2tldHMsIFN1cHBvcnRzSHYyUGFja2V0cykKLU1BUF9UT19HRChzdXBwb3J0c19odjNfcGFja2V0cywgU3VwcG9ydHNIdjNQYWNrZXRzKQotTUFQX1RPX0dEKHN1cHBvcnRzX2V2M19wYWNrZXRzLCBTdXBwb3J0c0V2M1BhY2tldHMpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfZXY0X3BhY2tldHMsIFN1cHBvcnRzRXY0UGFja2V0cykKLU1BUF9UT19HRChzdXBwb3J0c19ldjVfcGFja2V0cywgU3VwcG9ydHNFdjVQYWNrZXRzKQotTUFQX1RPX0dEKHN1cHBvcnRzX2VzY29fMm1fcGh5LCBTdXBwb3J0c0VzY28ybVBoeSkKLU1BUF9UT19HRChzdXBwb3J0c19lc2NvXzNtX3BoeSwgU3VwcG9ydHNFc2NvM21QaHkpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfdGhyZWVfc2xvdF9lc2NvX2Vkcl9wYWNrZXRzLCBTdXBwb3J0czNTbG90RXNjb0VkclBhY2tldHMpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfcm9sZV9zd2l0Y2gsIFN1cHBvcnRzUm9sZVN3aXRjaCkKLU1BUF9UT19HRChzdXBwb3J0c19ob2xkX21vZGUsIFN1cHBvcnRzSG9sZE1vZGUpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfc25pZmZfbW9kZSwgU3VwcG9ydHNTbmlmZk1vZGUpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfcGFya19tb2RlLCBTdXBwb3J0c1BhcmtNb2RlKQotTUFQX1RPX0dEKHN1cHBvcnRzX25vbl9mbHVzaGFibGVfcGIsIFN1cHBvcnRzTm9uRmx1c2hhYmxlUGIpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nLCBTdXBwb3J0c1NuaWZmU3VicmF0aW5nKQotTUFQX1RPX0dEKHN1cHBvcnRzX2VuY3J5cHRpb25fcGF1c2UsIFN1cHBvcnRzRW5jcnlwdGlvblBhdXNlKQotCi1NQVBfVE9fR0Qoc3VwcG9ydHNfYmxlLCBTdXBwb3J0c0JsZSkKLU1BUF9UT19HRChzdXBwb3J0c19wcml2YWN5LCBTdXBwb3J0c0JsZVByaXZhY3kpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfcGFja2V0X2V4dGVuc2lvbiwgU3VwcG9ydHNCbGVEYXRhUGFja2V0TGVuZ3RoRXh0ZW5zaW9uKQotTUFQX1RPX0dEKHN1cHBvcnRzX2Nvbm5lY3Rpb25fcGFyYW1ldGVyc19yZXF1ZXN0LAotICAgICAgICAgIFN1cHBvcnRzQmxlQ29ubmVjdGlvblBhcmFtZXRlcnNSZXF1ZXN0KQotTUFQX1RPX0dEKHN1cHBvcnRzX2JsZV8ybV9waHksIFN1cHBvcnRzQmxlMm1QaHkpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfYmxlX2NvZGVkX3BoeSwgU3VwcG9ydHNCbGVDb2RlZFBoeSkKLU1BUF9UT19HRChzdXBwb3J0c19leHRlbmRlZF9hZHZlcnRpc2luZywgU3VwcG9ydHNCbGVFeHRlbmRlZEFkdmVydGlzaW5nKQotTUFQX1RPX0dEKHN1cHBvcnRzX3BlcmlvZGljX2FkdmVydGlzaW5nLCBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmcpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfcGVyaXBoZXJhbF9pbml0aWF0ZWRfZmVhdHVyZV9leGNoYW5nZSwKLSAgICAgICAgICBTdXBwb3J0c0JsZVBlcmlwaGVyYWxJbml0aWF0ZWRGZWF0dXJlc0V4Y2hhbmdlKQotTUFQX1RPX0dEKHN1cHBvcnRzX2Nvbm5lY3Rpb25fcGFyYW1ldGVyX3JlcXVlc3QsCi0gICAgICAgICAgU3VwcG9ydHNCbGVDb25uZWN0aW9uUGFyYW1ldGVyc1JlcXVlc3QpCi0KLU1BUF9UT19HRChzdXBwb3J0c19wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlciwKLSAgICAgICAgICBTdXBwb3J0c0JsZVBlcmlvZGljQWR2ZXJ0aXNpbmdTeW5jVHJhbnNmZXJTZW5kZXIpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9yZWNpcGllbnQsCi0gICAgICAgICAgU3VwcG9ydHNCbGVQZXJpb2RpY0FkdmVydGlzaW5nU3luY1RyYW5zZmVyUmVjaXBpZW50KQotTUFQX1RPX0dEKHN1cHBvcnRzX2Nvbm5lY3RlZF9pc29fc3RyZWFtX2NlbnRyYWwsCi0gICAgICAgICAgU3VwcG9ydHNCbGVDb25uZWN0ZWRJc29jaHJvbm91c1N0cmVhbUNlbnRyYWwpCi1NQVBfVE9fR0Qoc3VwcG9ydHNfY29ubmVjdGVkX2lzb19zdHJlYW1fcGVyaXBoZXJhbCwKLSAgICAgICAgICBTdXBwb3J0c0JsZUNvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtUGVyaXBoZXJhbCkKLU1BUF9UT19HRChzdXBwb3J0c19pc29fYnJvYWRjYXN0ZXIsIFN1cHBvcnRzQmxlSXNvY2hyb25vdXNCcm9hZGNhc3RlcikKLU1BUF9UT19HRChzdXBwb3J0c19zeW5jaHJvbml6ZWRfcmVjZWl2ZXIsIFN1cHBvcnRzQmxlU3luY2hyb25pemVkUmVjZWl2ZXIpCi0KLSNkZWZpbmUgRk9SV0FSRF9JRl9SVVNUKGxlZ2FjeSwgZ2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIGxlZ2FjeSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChnZF9ydXN0X2lzX2VuYWJsZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OnJ1c3Q6OmNvbnRyb2xsZXJfIyNsZWdhY3koICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0Q29udHJvbGxlcigpKTsgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBnZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLUZPUldBUkRfSUZfUlVTVChzdXBwb3J0c19yZWFkaW5nX3JlbW90ZV9leHRlbmRlZF9mZWF0dXJlcywKLSAgICAgICAgICAgICAgICBHZXRDb250cm9sbGVyKCktPklzU3VwcG9ydGVkKChibHVldG9vdGg6OmhjaTo6T3BDb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcykpCi1GT1JXQVJEX0lGX1JVU1Qoc3VwcG9ydHNfZW5oYW5jZWRfc2V0dXBfc3luY2hyb25vdXNfY29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICBHZXRDb250cm9sbGVyKCktPklzU3VwcG9ydGVkKCgKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZSlrRW5oYW5jZWRTZXR1cFN5bmNocm9ub3VzQ29ubmVjdGlvbikpCi1GT1JXQVJEX0lGX1JVU1QoCi0gICAgc3VwcG9ydHNfZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24sCi0gICAgR2V0Q29udHJvbGxlcigpLT5Jc1N1cHBvcnRlZCgoYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRW5oYW5jZWRBY2NlcHRTeW5jaHJvbm91c0Nvbm5lY3Rpb24pKQotRk9SV0FSRF9JRl9SVVNUKAotICAgIHN1cHBvcnRzX2JsZV9zZXRfcHJpdmFjeV9tb2RlLAotICAgIEdldENvbnRyb2xsZXIoKS0+SXNTdXBwb3J0ZWQoKGJsdWV0b290aDo6aGNpOjpPcENvZGUpa0xlU2V0UHJpdmFjeU1vZGUpKQotCi0jZGVmaW5lIEZPUldBUkRfR0VUVEVSX0lGX1JVU1QodHlwZSwgbGVnYWN5LCBnZCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdHlwZSBsZWdhY3kodm9pZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoZ2RfcnVzdF9pc19lbmFibGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpydXN0Ojpjb250cm9sbGVyXyMjbGVnYWN5KCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICoqYmx1ZXRvb3RoOjpzaGltOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdENvbnRyb2xsZXIoKSk7IFwKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZ2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKHVpbnQxNl90LCBnZXRfYWNsX2J1ZmZlcl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgIEdldENvbnRyb2xsZXIoKS0+R2V0QWNsUGFja2V0TGVuZ3RoKCkpCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKAotICAgIHVpbnQxNl90LCBnZXRfbGVfYnVmZmVyX2xlbmd0aCwKLSAgICBHZXRDb250cm9sbGVyKCktPkdldExlQnVmZmVyU2l6ZSgpLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8pCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKAotICAgIHVpbnQxNl90LCBnZXRfaXNvX2J1ZmZlcl9sZW5ndGgsCi0gICAgR2V0Q29udHJvbGxlcigpLT5HZXRDb250cm9sbGVySXNvQnVmZmVyU2l6ZSgpLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8pCi0KLXN0YXRpYyB1aW50MTZfdCBnZXRfYWNsX3BhY2tldF9zaXplX2NsYXNzaWModm9pZCkgewotICByZXR1cm4gZ2V0X2FjbF9idWZmZXJfbGVuZ3RoKCkgKyBrSGNpRGF0YVByZWFtYmxlU2l6ZTsKLX0KLQotc3RhdGljIHVpbnQxNl90IGdldF9hY2xfcGFja2V0X3NpemVfYmxlKHZvaWQpIHsKLSAgcmV0dXJuIGdldF9sZV9idWZmZXJfbGVuZ3RoKCkgKyBrSGNpRGF0YVByZWFtYmxlU2l6ZTsKLX0KLQotc3RhdGljIHVpbnQxNl90IGdldF9pc29fcGFja2V0X3NpemUodm9pZCkgewotICByZXR1cm4gZ2V0X2lzb19idWZmZXJfbGVuZ3RoKCkgKyBrSGNpRGF0YVByZWFtYmxlU2l6ZTsKLX0KLQotRk9SV0FSRF9HRVRURVJfSUZfUlVTVCh1aW50MTZfdCwgZ2V0X2xlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICBHZXRDb250cm9sbGVyKCktPkdldExlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGgoKSkKLQotc3RhdGljIHVpbnQxNl90IGdldF9sZV9tYXhpbXVtX3R4X2RhdGFfbGVuZ3RoKHZvaWQpIHsKLSAgaWYgKGdkX3J1c3RfaXNfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6Y29udHJvbGxlcl9nZXRfbGVfbWF4aW11bV90eF9kYXRhX2xlbmd0aCgKLSAgICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0Q29udHJvbGxlcigpKTsKLSAgfSBlbHNlIHsKLSAgICA6OmJsdWV0b290aDo6aGNpOjpMZU1heGltdW1EYXRhTGVuZ3RoIGxlX21heGltdW1fZGF0YV9sZW5ndGggPQotICAgICAgICBHZXRDb250cm9sbGVyKCktPkdldExlTWF4aW11bURhdGFMZW5ndGgoKTsKLSAgICByZXR1cm4gbGVfbWF4aW11bV9kYXRhX2xlbmd0aC5zdXBwb3J0ZWRfbWF4X3R4X29jdGV0c187Ci0gIH0KLX0KLQotc3RhdGljIHVpbnQxNl90IGdldF9sZV9tYXhpbXVtX3R4X3RpbWUodm9pZCkgewotICBpZiAoZ2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpydXN0Ojpjb250cm9sbGVyX2dldF9sZV9tYXhpbXVtX3R4X3RpbWUoCi0gICAgICAgICoqYmx1ZXRvb3RoOjpzaGltOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdENvbnRyb2xsZXIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgOjpibHVldG9vdGg6OmhjaTo6TGVNYXhpbXVtRGF0YUxlbmd0aCBsZV9tYXhpbXVtX2RhdGFfbGVuZ3RoID0KLSAgICAgICAgR2V0Q29udHJvbGxlcigpLT5HZXRMZU1heGltdW1EYXRhTGVuZ3RoKCk7Ci0gICAgcmV0dXJuIGxlX21heGltdW1fZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF90eF90aW1lXzsKLSAgfQotfQotCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKHVpbnQxNl90LCBnZXRfbGVfbWF4X2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICBHZXRDb250cm9sbGVyKCktPkdldExlTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aCgpKQotRk9SV0FSRF9HRVRURVJfSUZfUlVTVCh1aW50OF90LCBnZXRfbGVfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEdldENvbnRyb2xsZXIoKS0+R2V0TGVOdW1iZXJPZlN1cHBvcnRlZEFkdmVyaXNpbmdTZXRzKCkpCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKHVpbnQ4X3QsIGdldF9sZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29udHJvbGxlcigpLT5HZXRMZVBlcmlvZGljQWR2ZXJ0aXNlckxpc3RTaXplKCkpCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKHVpbnQxNl90LCBnZXRfYWNsX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIEdldENvbnRyb2xsZXIoKS0+R2V0TnVtQWNsUGFja2V0QnVmZmVycygpKQotRk9SV0FSRF9HRVRURVJfSUZfUlVTVCh1aW50OF90LCBnZXRfbGVfYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29udHJvbGxlcigpLT5HZXRMZUJ1ZmZlclNpemUoKS50b3RhbF9udW1fbGVfcGFja2V0c18pCi1GT1JXQVJEX0dFVFRFUl9JRl9SVVNUKAotICAgIHVpbnQ4X3QsIGdldF9pc29fYnVmZmVycywKLSAgICBHZXRDb250cm9sbGVyKCktPkdldENvbnRyb2xsZXJJc29CdWZmZXJTaXplKCkudG90YWxfbnVtX2xlX3BhY2tldHNfKQotRk9SV0FSRF9HRVRURVJfSUZfUlVTVCh1aW50OF90LCBnZXRfbGVfY29ubmVjdF9saXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIEdldENvbnRyb2xsZXIoKS0+R2V0TGVDb25uZWN0TGlzdFNpemUoKSkKLQotc3RhdGljIHVpbnQ4X3QgYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplID0gMDsKLQotc3RhdGljIHZvaWQgc2V0X2JsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZShpbnQgcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUpIHsKLSAgYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplID0gcmVzb2x2aW5nX2xpc3RfbWF4X3NpemU7Ci19Ci0KLXN0YXRpYyB1aW50OF90IGdldF9sZV9yZXNvbHZpbmdfbGlzdF9zaXplKHZvaWQpIHsKLSAgcmV0dXJuIGJsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZTsKLX0KLQotc3RhdGljIHVpbnQ4X3QgZ2V0X2xlX2FsbF9pbml0aWF0aW5nX3BoeXMoKSB7IHJldHVybiBkYXRhXy5waHk7IH0KLQotc3RhdGljIGNvbnN0IGNvbnRyb2xsZXJfdCBpbnRlcmZhY2UgPSB7Ci0gICAgZ2V0X2lzX3JlYWR5LAotCi0gICAgZ2V0X2FkZHJlc3MsCi0gICAgZ2V0X2J0X3ZlcnNpb24sCi0KLSAgICBnZXRfYmxlX3N1cHBvcnRlZF9zdGF0ZXMsCi0KLSAgICBzdXBwb3J0c19zaW1wbGVfcGFpcmluZywKLSAgICBzdXBwb3J0c19zZWN1cmVfY29ubmVjdGlvbnMsCi0gICAgc3VwcG9ydHNfc2ltdWx0YW5lb3VzX2xlX2JyZWRyLAotICAgIHN1cHBvcnRzX3JlYWRpbmdfcmVtb3RlX2V4dGVuZGVkX2ZlYXR1cmVzLAotICAgIHN1cHBvcnRzX2ludGVybGFjZWRfaW5xdWlyeV9zY2FuLAotICAgIHN1cHBvcnRzX3Jzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMsCi0gICAgc3VwcG9ydHNfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZSwKLSAgICBzdXBwb3J0c19yb2xlX3N3aXRjaCwKLSAgICBzdXBwb3J0c19lbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uLAotICAgIHN1cHBvcnRzX2VuaGFuY2VkX2FjY2VwdF9zeW5jaHJvbm91c19jb25uZWN0aW9uLAotICAgIHN1cHBvcnRzX3RocmVlX3Nsb3RfcGFja2V0cywKLSAgICBzdXBwb3J0c19maXZlX3Nsb3RfcGFja2V0cywKLSAgICBzdXBwb3J0c19jbGFzc2ljXzJtX3BoeSwKLSAgICBzdXBwb3J0c19jbGFzc2ljXzNtX3BoeSwKLSAgICBzdXBwb3J0c190aHJlZV9zbG90X2Vkcl9wYWNrZXRzLAotICAgIHN1cHBvcnRzX2ZpdmVfc2xvdF9lZHJfcGFja2V0cywKLSAgICBzdXBwb3J0c19zY28sCi0gICAgc3VwcG9ydHNfaHYyX3BhY2tldHMsCi0gICAgc3VwcG9ydHNfaHYzX3BhY2tldHMsCi0gICAgc3VwcG9ydHNfZXYzX3BhY2tldHMsCi0gICAgc3VwcG9ydHNfZXY0X3BhY2tldHMsCi0gICAgc3VwcG9ydHNfZXY1X3BhY2tldHMsCi0gICAgc3VwcG9ydHNfZXNjb18ybV9waHksCi0gICAgc3VwcG9ydHNfZXNjb18zbV9waHksCi0gICAgc3VwcG9ydHNfdGhyZWVfc2xvdF9lc2NvX2Vkcl9wYWNrZXRzLAotICAgIHN1cHBvcnRzX3JvbGVfc3dpdGNoLAotICAgIHN1cHBvcnRzX2hvbGRfbW9kZSwKLSAgICBzdXBwb3J0c19zbmlmZl9tb2RlLAotICAgIHN1cHBvcnRzX3BhcmtfbW9kZSwKLSAgICBzdXBwb3J0c19ub25fZmx1c2hhYmxlX3BiLAotICAgIHN1cHBvcnRzX3NuaWZmX3N1YnJhdGluZywKLSAgICBzdXBwb3J0c19lbmNyeXB0aW9uX3BhdXNlLAotCi0gICAgc3VwcG9ydHNfYmxlLAotICAgIHN1cHBvcnRzX3BhY2tldF9leHRlbnNpb24sCi0gICAgc3VwcG9ydHNfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QsCi0gICAgc3VwcG9ydHNfcHJpdmFjeSwKLSAgICBzdXBwb3J0c19ibGVfc2V0X3ByaXZhY3lfbW9kZSwKLSAgICBzdXBwb3J0c19ibGVfMm1fcGh5LAotICAgIHN1cHBvcnRzX2JsZV9jb2RlZF9waHksCi0gICAgc3VwcG9ydHNfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmcsCi0gICAgc3VwcG9ydHNfcGVyaW9kaWNfYWR2ZXJ0aXNpbmcsCi0gICAgc3VwcG9ydHNfcGVyaXBoZXJhbF9pbml0aWF0ZWRfZmVhdHVyZV9leGNoYW5nZSwKLSAgICBzdXBwb3J0c19jb25uZWN0aW9uX3BhcmFtZXRlcl9yZXF1ZXN0LAotICAgIHN1cHBvcnRzX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfc2VuZGVyLAotICAgIHN1cHBvcnRzX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcmVjaXBpZW50LAotICAgIHN1cHBvcnRzX2Nvbm5lY3RlZF9pc29fc3RyZWFtX2NlbnRyYWwsCi0gICAgc3VwcG9ydHNfY29ubmVjdGVkX2lzb19zdHJlYW1fcGVyaXBoZXJhbCwKLSAgICBzdXBwb3J0c19pc29fYnJvYWRjYXN0ZXIsCi0gICAgc3VwcG9ydHNfc3luY2hyb25pemVkX3JlY2VpdmVyLAotCi0gICAgZ2V0X2FjbF9idWZmZXJfbGVuZ3RoLAotICAgIGdldF9sZV9idWZmZXJfbGVuZ3RoLAotICAgIGdldF9pc29fYnVmZmVyX2xlbmd0aCwKLQotICAgIGdldF9hY2xfcGFja2V0X3NpemVfY2xhc3NpYywKLSAgICBnZXRfYWNsX3BhY2tldF9zaXplX2JsZSwKLSAgICBnZXRfaXNvX3BhY2tldF9zaXplLAotICAgIGdldF9sZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aCwKLSAgICBnZXRfbGVfbWF4aW11bV90eF9kYXRhX2xlbmd0aCwKLSAgICBnZXRfbGVfbWF4aW11bV90eF90aW1lLAotICAgIGdldF9sZV9tYXhfYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGgsCi0gICAgZ2V0X2xlX3N1cHBvcnRlZF9hZHZlcnRpc2luZ19zZXRzLAotICAgIGdldF9sZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZSwKLQotICAgIGdldF9hY2xfYnVmZmVycywKLSAgICBnZXRfbGVfYnVmZmVycywKLSAgICBnZXRfaXNvX2J1ZmZlcnMsCi0KLSAgICBnZXRfbGVfY29ubmVjdF9saXN0X3NpemUsCi0KLSAgICBnZXRfbGVfcmVzb2x2aW5nX2xpc3Rfc2l6ZSwKLSAgICBzZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplLAotICAgIGdldF9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzLAotICAgIGdldF9sZV9hbGxfaW5pdGlhdGluZ19waHlzfTsKLQotY29uc3QgY29udHJvbGxlcl90KiBibHVldG9vdGg6OnNoaW06OmNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpIHsKLSAgc3RhdGljIGJvb2wgbG9hZGVkID0gZmFsc2U7Ci0gIGlmICghbG9hZGVkKSB7Ci0gICAgbG9hZGVkID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gJmludGVyZmFjZTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OmNvbnRyb2xsZXJfY2xlYXJfZXZlbnRfbWFzaygpIHsKLSAgYmx1ZXRvb3RoOjpzaGltOjpHZXRDb250cm9sbGVyKCktPlNldEV2ZW50TWFzaygwKTsKLX0KZGlmZiAtLWdpdCBhL21haW4vc2hpbS9jb250cm9sbGVyLmggYi9tYWluL3NoaW0vY29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ1MTQxLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9jb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgR0RfQ09OVFJPTExFUl9NT0RVTEVbXSA9ICJnZF9jb250cm9sbGVyX21vZHVsZSI7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1jb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpOwotCi12b2lkIGNvbnRyb2xsZXJfY2xlYXJfZXZlbnRfbWFzaygpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2R1bXBzeXMuY2MgYi9tYWluL3NoaW0vZHVtcHN5cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1MWNhYS4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vZHVtcHN5cy5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfc2hpbV9zdG9yYWdlIgotCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotCi0jaW5jbHVkZSAic2hpbS9kdW1wc3lzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciBjaGFyIGtNb2R1bGVOYW1lW10gPSAic2hpbTo6bGVnYWN5OjpkdW1wc3lzIjsKLXN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3Qgdm9pZCosIGJsdWV0b290aDo6c2hpbTo6RHVtcHN5c0Z1bmN0aW9uPgotICAgIGR1bXBzeXNfZnVuY3Rpb25zXzsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpSZWdpc3RlckR1bXBzeXNGdW5jdGlvbihjb25zdCB2b2lkKiB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wc3lzRnVuY3Rpb24gZnVuYykgewotICBDSEVDSyhkdW1wc3lzX2Z1bmN0aW9uc18uZmluZCh0b2tlbikgPT0gZHVtcHN5c19mdW5jdGlvbnNfLmVuZCgpKTsKLSAgZHVtcHN5c19mdW5jdGlvbnNfLmluc2VydCh7dG9rZW4sIGZ1bmN9KTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OlVucmVnaXN0ZXJEdW1wc3lzRnVuY3Rpb24oY29uc3Qgdm9pZCogdG9rZW4pIHsKLSAgQ0hFQ0soZHVtcHN5c19mdW5jdGlvbnNfLmZpbmQodG9rZW4pICE9IGR1bXBzeXNfZnVuY3Rpb25zXy5lbmQoKSk7Ci0gIGR1bXBzeXNfZnVuY3Rpb25zXy5lcmFzZSh0b2tlbik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpEdW1wKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3MpIHsKLSAgaWYgKGR1bXBzeXNfZnVuY3Rpb25zXy5lbXB0eSgpKSB7Ci0gICAgZHByaW50ZihmZCwgIiVzIE5vIHJlZ2lzdGVyZWQgZHVtcHN5cyBzaGltIGxlZ2FjeSB0YXJnZXRzXG4iLCBrTW9kdWxlTmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZHByaW50ZihmZCwgIiVzIER1bXBpbmcgc2hpbSBsZWdhY3kgdGFyZ2V0czolemRcbiIsIGtNb2R1bGVOYW1lLAotICAgICAgICAgICAgZHVtcHN5c19mdW5jdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvJiBkdW1wc3lzIDogZHVtcHN5c19mdW5jdGlvbnNfKSB7Ci0gICAgICBkdW1wc3lzLnNlY29uZChmZCk7Ci0gICAgfQotICB9Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSkgewotICAgIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2R1bXBzeXNfbW9kdWxlX3N0YXJ0ZWQoKSkgewotICAgICAgYmx1ZXRvb3RoOjpzaGltOjpHZXREdW1wc3lzKCktPkR1bXAoZmQsIGFyZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkcHJpbnRmKGZkLCAiJXMgTk9URTogZ2QgZHVtcHN5cyBtb2R1bGUgbm90IGxvYWRlZCBvciBzdGFydGVkXG4iLAotICAgICAgICAgICAgICBrTW9kdWxlTmFtZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGRwcmludGYoZmQsICIlcyBnZCBzdGFjayBpcyBlbmFibGVkIGJ1dCBub3Qgc3RhcnRlZFxuIiwga01vZHVsZU5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYWluL3NoaW0vZHVtcHN5cy5oIGIvbWFpbi9zaGltL2R1bXBzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4ZTRmOC4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vZHVtcHN5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jZGVmaW5lIExPR19EVU1QU1lTKGZkLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZHByaW50ZihmZCwgIiVzICIgZm10ICJcbiIsIERVTVBTWVNfVEFHLCAjI2FyZ3MpOyBcCi0gIH0gd2hpbGUgKGZhbHNlKQotCi0jZGVmaW5lIExPR19EVU1QU1lTX1RJVExFKGZkLCB0aXRsZSkgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZHByaW50ZihmZCwgIiAtLS0tLSAlcyAtLS0tLVxuIiwgdGl0bGUpOyBcCi0gIH0gd2hpbGUgKGZhbHNlKQotCi1jb25zdGV4cHIgY2hhciBrUHJpdmF0ZUFkZHJlc3NQcmVmaXhbXSA9ICJ4eDp4eDp4eDp4eCI7Ci0jZGVmaW5lIFBSSVZBVEVfQUREUkVTUyhhZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoYWRkci5Ub1N0cmluZygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAucmVwbGFjZSgwLCBzdHJsZW4oa1ByaXZhdGVBZGRyZXNzUHJlZml4KSwga1ByaXZhdGVBZGRyZXNzUHJlZml4KSBcCi0gICAgICAgLmNfc3RyKCkpCi0KLSNkZWZpbmUgUFJJVkFURV9DRUxMKG51bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAucmVwbGFjZSgwLCAobnVtYmVyLnNpemUoKSA+IDIpID8gbnVtYmVyLnNpemUoKSAtIDIgOiAwLCAgIFwKLSAgICAgICAgICAgICAgICAobnVtYmVyLnNpemUoKSA+IDIpID8gbnVtYmVyLnNpemUoKSAtIDIgOiAwLCAnKicpIFwKLSAgICAgICAuY19zdHIoKSkKLQotI2RlZmluZSBQUklWQVRFX05BTUUobmFtZSkgKG5hbWUpCi0KLWlubGluZSBkb3VibGUgdGlja3NfdG9fc2Vjb25kcyh1aW50MTZfdCB0aWNrcykgewotICByZXR1cm4gKHN0YXRpY19jYXN0PGRvdWJsZT4odGlja3MpICogMC42MjUgKiAwLjAwMSk7Ci19Ci0KLWlubGluZSBkb3VibGUgc3VwZXJ2aXNpb25fdGltZW91dF90b19zZWNvbmRzKHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgcmV0dXJuIChzdGF0aWNfY2FzdDxkb3VibGU+KHRpbWVvdXQpICogMC4wMSk7Ci19Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi11c2luZyBEdW1wc3lzRnVuY3Rpb24gPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50IGZkKT47Ci0KLS8qKgotICogRW50cnlwb2ludCBmcm9tIGxlZ2FjeSBzdGFjayB0byBwcm92aWRlIGR1bXBzeXMgZnVuY3Rpb25hbGl0eQotICogZm9yIGJvdGggdGhlIGxlZ2FjeSBzaGltIGFuZCB0aGUgR2FiZWxkb3JzY2hlIHN0YWNrLgotICovCi12b2lkIER1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncyk7Ci0KLS8qKgotICogRHVtcHN5cyBhY2Nlc3MgZm9yIGxlZ2FjeSBzaGltIG1vZHVsZXMuCi0gKi8KLXZvaWQgUmVnaXN0ZXJEdW1wc3lzRnVuY3Rpb24oY29uc3Qgdm9pZCogdG9rZW4sIER1bXBzeXNGdW5jdGlvbiBmdW5jKTsKLXZvaWQgVW5yZWdpc3RlckR1bXBzeXNGdW5jdGlvbihjb25zdCB2b2lkKiB0b2tlbik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vZW50cnkuY2MgYi9tYWluL3NoaW0vZW50cnkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDA3ZTMuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2VudHJ5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJnZC9idGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJnZC9oY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgImdkL2hjaS92ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL2Nvbm5lY3RhYmlsaXR5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvaW5xdWlyeS5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL25hbWUuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9wYWdlLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvaGFuZGxlci5oIgotI2luY2x1ZGUgImdkL3NlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5oIgotI2luY2x1ZGUgImdkL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgImdkL3N0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci5oIgotCi0jaW5jbHVkZSAibWFpbi9zaGltL2VudHJ5LmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3N0YWNrLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1vczo6SGFuZGxlciogR2V0R2RTaGltSGFuZGxlcigpIHsgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRIYW5kbGVyKCk7IH0KLQotaGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlciogR2V0QWR2ZXJ0aXNpbmcoKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKQotICAgICAgLT5HZXRTdGFja01hbmFnZXIoKQotICAgICAgLT5HZXRJbnN0YW5jZTxoY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyPigpOwotfQotCi1oY2k6OkNvbnRyb2xsZXIqIEdldENvbnRyb2xsZXIoKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKQotICAgICAgLT5HZXRTdGFja01hbmFnZXIoKQotICAgICAgLT5HZXRJbnN0YW5jZTxoY2k6OkNvbnRyb2xsZXI+KCk7Ci19Ci0KLW5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZSogR2V0Q29ubmVjdGFiaWxpdHkoKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKQotICAgICAgLT5HZXRTdGFja01hbmFnZXIoKQotICAgICAgLT5HZXRJbnN0YW5jZTxuZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU+KCk7Ci19Ci0KLW5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGUqIEdldERpc2NvdmVyYWJpbGl0eSgpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpCi0gICAgICAtPkdldFN0YWNrTWFuYWdlcigpCi0gICAgICAtPkdldEluc3RhbmNlPG5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGU+KCk7Ci19Ci0KLUR1bXBzeXMqIEdldER1bXBzeXMoKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0U3RhY2tNYW5hZ2VyKCktPkdldEluc3RhbmNlPER1bXBzeXM+KCk7Ci19Ci0KLW5laWdoYm9yOjpJbnF1aXJ5TW9kdWxlKiBHZXRJbnF1aXJ5KCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCkKLSAgICAgIC0+R2V0U3RhY2tNYW5hZ2VyKCkKLSAgICAgIC0+R2V0SW5zdGFuY2U8bmVpZ2hib3I6OklucXVpcnlNb2R1bGU+KCk7Ci19Ci0KLWhjaTo6SGNpTGF5ZXIqIEdldEhjaUxheWVyKCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCktPkdldFN0YWNrTWFuYWdlcigpLT5HZXRJbnN0YW5jZTxoY2k6OkhjaUxheWVyPigpOwotfQotCi1sMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlKiBHZXRMMmNhcENsYXNzaWNNb2R1bGUoKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKQotICAgICAgLT5HZXRTdGFja01hbmFnZXIoKQotICAgICAgLT5HZXRJbnN0YW5jZTxibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGU+KCk7Ci19Ci0KLWJsdWV0b290aDo6bDJjYXA6OmxlOjpMMmNhcExlTW9kdWxlKiBHZXRMMmNhcExlTW9kdWxlKCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCkKLSAgICAgIC0+R2V0U3RhY2tNYW5hZ2VyKCkKLSAgICAgIC0+R2V0SW5zdGFuY2U8Ymx1ZXRvb3RoOjpsMmNhcDo6bGU6OkwyY2FwTGVNb2R1bGU+KCk7Ci19Ci0KLW5laWdoYm9yOjpOYW1lTW9kdWxlKiBHZXROYW1lKCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCkKLSAgICAgIC0+R2V0U3RhY2tNYW5hZ2VyKCkKLSAgICAgIC0+R2V0SW5zdGFuY2U8bmVpZ2hib3I6Ok5hbWVNb2R1bGU+KCk7Ci19Ci0KLW5laWdoYm9yOjpQYWdlTW9kdWxlKiBHZXRQYWdlKCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCkKLSAgICAgIC0+R2V0U3RhY2tNYW5hZ2VyKCkKLSAgICAgIC0+R2V0SW5zdGFuY2U8bmVpZ2hib3I6OlBhZ2VNb2R1bGU+KCk7Ci19Ci0KLWhjaTo6TGVTY2FubmluZ01hbmFnZXIqIEdldFNjYW5uaW5nKCkgewotICByZXR1cm4gU3RhY2s6OkdldEluc3RhbmNlKCkKLSAgICAgIC0+R2V0U3RhY2tNYW5hZ2VyKCkKLSAgICAgIC0+R2V0SW5zdGFuY2U8aGNpOjpMZVNjYW5uaW5nTWFuYWdlcj4oKTsKLX0KLQotc2VjdXJpdHk6OlNlY3VyaXR5TW9kdWxlKiBHZXRTZWN1cml0eU1vZHVsZSgpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpCi0gICAgICAtPkdldFN0YWNrTWFuYWdlcigpCi0gICAgICAtPkdldEluc3RhbmNlPHNlY3VyaXR5OjpTZWN1cml0eU1vZHVsZT4oKTsKLX0KLQotc3RvcmFnZTo6U3RvcmFnZU1vZHVsZSogR2V0U3RvcmFnZSgpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpCi0gICAgICAtPkdldFN0YWNrTWFuYWdlcigpCi0gICAgICAtPkdldEluc3RhbmNlPHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGU+KCk7Ci19Ci0KLWhjaTo6QWNsTWFuYWdlciogR2V0QWNsTWFuYWdlcigpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpCi0gICAgICAtPkdldFN0YWNrTWFuYWdlcigpCi0gICAgICAtPkdldEluc3RhbmNlPGhjaTo6QWNsTWFuYWdlcj4oKTsKLX0KLQotaGNpOjpWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlciogR2V0VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIoKSB7Ci0gIHJldHVybiBTdGFjazo6R2V0SW5zdGFuY2UoKQotICAgICAgLT5HZXRTdGFja01hbmFnZXIoKQotICAgICAgLT5HZXRJbnN0YW5jZTxoY2k6OlZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyPigpOwotfQotCi1hY3Rpdml0eV9hdHRyaWJ1dGlvbjo6QWN0aXZpdHlBdHRyaWJ1dGlvbiogR2V0QWN0aXZpdHlBdHRyaWJ1dGlvbigpIHsKLSAgcmV0dXJuIFN0YWNrOjpHZXRJbnN0YW5jZSgpCi0gICAgICAtPkdldFN0YWNrTWFuYWdlcigpCi0gICAgICAtPkdldEluc3RhbmNlPGFjdGl2aXR5X2F0dHJpYnV0aW9uOjpBY3Rpdml0eUF0dHJpYnV0aW9uPigpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2VudHJ5LmggYi9tYWluL3NoaW0vZW50cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0Yzk1Yy4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vZW50cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0vKioKLSAqIEVudHJ5cG9pbnRzIGNhbGxlZCBpbnRvIEdhYmVsZG9yc2NoZSBmcm9tIGxlZ2FjeSBzdGFjawotICoKLSAqIEFueSBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nLCBkYXRhIHRyYW5zZm9ybWF0aW9uIG9mIEFQSXMgdG8KLSAqIG9yIGZyb20gdGhlIEdhYmVsZG9yc2NoZSBzdGFjayBtYXkgYmUgcGxhY2VkIGhlcmUuCi0gKgotICogVGhlIGlkZWEgaXMgdG8gZWZmZWN0aXZlbHkgcHJvdmlkZSBhIGJpbmFyeSBpbnRlcmZhY2UgdG8gcHJldmVudCBjcm9zcwotICogY29udGFtaW5hdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMgYW5kIHRoZSBsaWtlIGJldHdlZW4gdGhlIHN0YWNrcy4KLSAqCi0gKiAqKkFCU09MVVRFTFkqKiBObyByZWZlcmVuY2UgdG8gR2FiZWxkb3JzY2hlIHN0YWNrIG90aGVyIHRoYW4gd2VsbCBkZWZpbmVkCi0gKiBpbnRlcmZhY2VzIG1heSBiZSBtYWRlIGhlcmUKLSAqLwotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZnV0dXJlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG9zIHsKLWNsYXNzIEhhbmRsZXI7Ci19Ci1uYW1lc3BhY2UgYWN0aXZpdHlfYXR0cmlidXRpb24gewotY2xhc3MgQWN0aXZpdHlBdHRyaWJ1dGlvbjsKLX0KLW5hbWVzcGFjZSBuZWlnaGJvciB7Ci1jbGFzcyBDb25uZWN0YWJpbGl0eU1vZHVsZTsKLWNsYXNzIERpc2NvdmVyYWJpbGl0eU1vZHVsZTsKLWNsYXNzIElucXVpcnlNb2R1bGU7Ci1jbGFzcyBOYW1lTW9kdWxlOwotY2xhc3MgUGFnZU1vZHVsZTsKLX0KLW5hbWVzcGFjZSBoY2kgewotY2xhc3MgQ29udHJvbGxlcjsKLWNsYXNzIEhjaUxheWVyOwotY2xhc3MgQWNsTWFuYWdlcjsKLWNsYXNzIExlQWR2ZXJ0aXNpbmdNYW5hZ2VyOwotY2xhc3MgTGVTY2FubmluZ01hbmFnZXI7Ci1jbGFzcyBWZW5kb3JTcGVjaWZpY0V2ZW50TWFuYWdlcjsKLX0KLQotbmFtZXNwYWNlIGwyY2FwIHsKLW5hbWVzcGFjZSBjbGFzc2ljIHsKLWNsYXNzIEwyY2FwQ2xhc3NpY01vZHVsZTsKLX0gIC8vIG5hbWVzcGFjZSBjbGFzc2ljCi1uYW1lc3BhY2UgbGUgewotY2xhc3MgTDJjYXBMZU1vZHVsZTsKLX0gIC8vIG5hbWVzcGFjZSBsZQotfSAgLy8gbmFtZXNwYWNlIGwyY2FwCi0KLW5hbWVzcGFjZSBzZWN1cml0eSB7Ci1jbGFzcyBTZWN1cml0eU1vZHVsZTsKLX0KLW5hbWVzcGFjZSBzdG9yYWdlIHsKLWNsYXNzIFN0b3JhZ2VNb2R1bGU7Ci19Ci0KLW5hbWVzcGFjZSBzaGltIHsKLWNsYXNzIER1bXBzeXM7Ci0KLS8qIFRoaXMgcmV0dXJucyBhIGhhbmRsZXIgdGhhdCBtaWdodCBiZSB1c2VkIGluIHNoaW0gdG8gcmVjZWl2ZSBjYWxsYmFja3MgZnJvbQotICogd2l0aGluIHRoZSBzdGFjay4gKi8KLW9zOjpIYW5kbGVyKiBHZXRHZFNoaW1IYW5kbGVyKCk7Ci1oY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyKiBHZXRBZHZlcnRpc2luZygpOwotYmx1ZXRvb3RoOjpoY2k6OkNvbnRyb2xsZXIqIEdldENvbnRyb2xsZXIoKTsKLW5laWdoYm9yOjpEaXNjb3ZlcmFiaWxpdHlNb2R1bGUqIEdldERpc2NvdmVyYWJpbGl0eSgpOwotbmVpZ2hib3I6OkNvbm5lY3RhYmlsaXR5TW9kdWxlKiBHZXRDb25uZWN0YWJpbGl0eSgpOwotRHVtcHN5cyogR2V0RHVtcHN5cygpOwotbmVpZ2hib3I6OklucXVpcnlNb2R1bGUqIEdldElucXVpcnkoKTsKLWhjaTo6SGNpTGF5ZXIqIEdldEhjaUxheWVyKCk7Ci1sMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlKiBHZXRMMmNhcENsYXNzaWNNb2R1bGUoKTsKLWwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZSogR2V0TDJjYXBMZU1vZHVsZSgpOwotbmVpZ2hib3I6Ok5hbWVNb2R1bGUqIEdldE5hbWUoKTsKLW5laWdoYm9yOjpQYWdlTW9kdWxlKiBHZXRQYWdlKCk7Ci1oY2k6OkxlU2Nhbm5pbmdNYW5hZ2VyKiBHZXRTY2FubmluZygpOwotYmx1ZXRvb3RoOjpzZWN1cml0eTo6U2VjdXJpdHlNb2R1bGUqIEdldFNlY3VyaXR5TW9kdWxlKCk7Ci1zdG9yYWdlOjpTdG9yYWdlTW9kdWxlKiBHZXRTdG9yYWdlKCk7Ci1oY2k6OkFjbE1hbmFnZXIqIEdldEFjbE1hbmFnZXIoKTsKLWhjaTo6VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIqIEdldFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyKCk7Ci1hY3Rpdml0eV9hdHRyaWJ1dGlvbjo6QWN0aXZpdHlBdHRyaWJ1dGlvbiogR2V0QWN0aXZpdHlBdHRyaWJ1dGlvbigpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2hjaV9sYXllci5jYyBiL21haW4vc2hpbS9oY2lfbGF5ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMThhZGUuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2hjaV9sYXllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NoaW1faGNpIgotCi0jaW5jbHVkZSAiaGNpL2hjaV9sYXllci5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImNhbGxiYWNrcy9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgImhjaS9pbmNsdWRlL3BhY2tldF9mcmFnbWVudGVyLmgiCi0jaW5jbHVkZSAiaGNpL2xlX2FjbF9jb25uZWN0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImhjaS92ZW5kb3Jfc3BlY2lmaWNfZXZlbnRfbWFuYWdlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zdGFjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotI2luY2x1ZGUgInBhY2tldC9yYXdfYnVpbGRlci5oIgotI2luY2x1ZGUgInNyYy9icmlkZ2UucnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotLyoqCi0gKiBDYWxsYmFjayBkYXRhIHdyYXBwZWQgYXMgb3BhcXVlIHRva2VuIGJ1bmRsZWQgd2l0aCB0aGUgY29tbWFuZAotICogdHJhbnNtaXQgcmVxdWVzdCB0byB0aGUgR2QgbGF5ZXIuCi0gKgotICogVXBvbiBjb21wbGV0aW9uIGEgdG9rZW4gZm9yIGEgY29ycmVzcG9uZGluZyBjb21tYW5kIHRyYW5zbWl0LgotICogcmVxdWVzdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBHZCBsYXllci4KLSAqLwotdXNpbmcgQ29tbWFuZENhbGxiYWNrRGF0YSA9IHN0cnVjdCB7IHZvaWQqIGNvbnRleHQ7IH07Ci0KLWNvbnN0ZXhwciBzaXplX3Qga0J0SGRyU2l6ZSA9IHNpemVvZihCVF9IRFIpOwotY29uc3RleHByIHNpemVfdCBrQ29tbWFuZExlbmd0aFNpemUgPSBzaXplb2YodWludDhfdCk7Ci1jb25zdGV4cHIgc2l6ZV90IGtDb21tYW5kT3Bjb2RlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7Ci0KLXN0YXRpYyBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiwgQlRfSERSKik+IHNlbmRfZGF0YV91cHdhcmRzOwotc3RhdGljIGNvbnN0IHBhY2tldF9mcmFnbWVudGVyX3QqIHBhY2tldF9mcmFnbWVudGVyOwotCi1uYW1lc3BhY2UgewotYm9vbCBpc192YWxpZF9ldmVudF9jb2RlKGJsdWV0b290aDo6aGNpOjpFdmVudENvZGUgZXZlbnRfY29kZSkgewotICBzd2l0Y2ggKGV2ZW50X2NvZGUpIHsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OklOUVVJUllfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpDT05ORUNUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpESVNDT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6QVVUSEVOVElDQVRJT05fQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpSRU1PVEVfTkFNRV9SRVFVRVNUX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6RU5DUllQVElPTl9DSEFOR0U6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpDSEFOR0VfQ09OTkVDVElPTl9MSU5LX0tFWV9DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkNFTlRSQUxfTElOS19LRVlfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVNfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UU9TX1NFVFVQX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6Q09NTUFORF9DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkNPTU1BTkRfU1RBVFVTOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6SEFSRFdBUkVfRVJST1I6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpGTFVTSF9PQ0NVUlJFRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OlJPTEVfQ0hBTkdFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6TlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6TU9ERV9DSEFOR0U6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpSRVRVUk5fTElOS19LRVlTOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkxJTktfS0VZX1JFUVVFU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpMSU5LX0tFWV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpMT09QQkFDS19DT01NQU5EOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6REFUQV9CVUZGRVJfT1ZFUkZMT1c6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpNQVhfU0xPVFNfQ0hBTkdFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UkVBRF9DTE9DS19PRkZTRVRfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpDT05ORUNUSU9OX1BBQ0tFVF9UWVBFX0NIQU5HRUQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpRT1NfVklPTEFUSU9OOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UEFHRV9TQ0FOX1JFUEVUSVRJT05fTU9ERV9DSEFOR0U6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpGTE9XX1NQRUNJRklDQVRJT05fQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVF9XSVRIX1JTU0k6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFU19DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OlNZTkNIUk9OT1VTX0NPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpTWU5DSFJPTk9VU19DT05ORUNUSU9OX0NIQU5HRUQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpTTklGRl9TVUJSQVRJTkc6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpFWFRFTkRFRF9JTlFVSVJZX1JFU1VMVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkVOQ1JZUFRJT05fS0VZX1JFRlJFU0hfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFUVVFU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OlVTRVJfUEFTU0tFWV9SRVFVRVNUOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX09PQl9EQVRBX1JFUVVFU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpTSU1QTEVfUEFJUklOR19DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkxJTktfU1VQRVJWSVNJT05fVElNRU9VVF9DSEFOR0VEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6RU5IQU5DRURfRkxVU0hfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpVU0VSX1BBU1NLRVlfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6S0VZUFJFU1NfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UkVNT1RFX0hPU1RfU1VQUE9SVEVEX0ZFQVRVUkVTX05PVElGSUNBVElPTjoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6Ok5VTUJFUl9PRl9DT01QTEVURURfREFUQV9CTE9DS1M6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OlZFTkRPUl9TUEVDSUZJQzoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkxFX01FVEFfRVZFTlQ6ICAvLyBQcml2YXRlIHRvIGhjaQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX07Ci0KLWJvb2wgaXNfdmFsaWRfc3ViZXZlbnRfY29kZShibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlIHN1YmV2ZW50X2NvZGUpIHsKLSAgc3dpdGNoIChzdWJldmVudF9jb2RlKSB7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q09OTkVDVElPTl9VUERBVEVfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpEQVRBX0xFTkdUSF9DSEFOR0U6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpFTkhBTkNFRF9DT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6UEhZX1VQREFURV9DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlJFQURfUkVNT1RFX0ZFQVRVUkVTX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6UkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpSRUFEX0xPQ0FMX1AyNTZfUFVCTElDX0tFWV9DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkdFTkVSQVRFX0RIS0VZX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6RElSRUNURURfQURWRVJUSVNJTkdfUkVQT1JUOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6RVhURU5ERURfQURWRVJUSVNJTkdfUkVQT1JUOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6UEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19FU1RBQkxJU0hFRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfTE9TVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlNDQU5fVElNRU9VVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkFEVkVSVElTSU5HX1NFVF9URVJNSU5BVEVEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6U0NBTl9SRVFVRVNUX1JFQ0VJVkVEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q0hBTk5FTF9TRUxFQ1RJT05fQUxHT1JJVEhNOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q09OTkVDVElPTkxFU1NfSVFfUkVQT1JUOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q09OTkVDVElPTl9JUV9SRVBPUlQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDVEVfUkVRVUVTVF9GQUlMRUQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjoKLSAgICAgICAgUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9SRUNFSVZFRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkNJU19FU1RBQkxJU0hFRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkNJU19SRVFVRVNUOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q1JFQVRFX0JJR19DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlRFUk1JTkFURV9CSUdfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpCSUdfU1lOQ19FU1RBQkxJU0hFRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkJJR19TWU5DX0xPU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpSRVFVRVNUX1BFRVJfU0NBX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6UEFUSF9MT1NTX1RIUkVTSE9MRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlRSQU5TTUlUX1BPV0VSX1JFUE9SVElORzoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkJJR19JTkZPX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkFEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkxPTkdfVEVSTV9LRVlfUkVRVUVTVDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2hjaV9sYXllcigKLSAgICBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlIGV2ZW50X2NvZGUpIHsKLSAgc3dpdGNoIChldmVudF9jb2RlKSB7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpDT01NQU5EX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6Q09NTUFORF9TVEFUVVM6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpQQUdFX1NDQU5fUkVQRVRJVElPTl9NT0RFX0NIQU5HRToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6Ok1BWF9TTE9UU19DSEFOR0U6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpESVNDT05ORUNUSU9OX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTo6UkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTl9DT01QTEVURToKLSAgICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkgfHwKLSAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGV2ZW50X2FscmVhZHlfcmVnaXN0ZXJlZF9pbl9jb250cm9sbGVyX2xheWVyKAotICAgIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGUgZXZlbnRfY29kZSkgewotICBzd2l0Y2ggKGV2ZW50X2NvZGUpIHsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6Ok5VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUzoKLSAgICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkgfHwKLSAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGV2ZW50X2FscmVhZHlfcmVnaXN0ZXJlZF9pbl9hY2xfbGF5ZXIoCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZSBldmVudF9jb2RlKSB7Ci0gIGZvciAoYXV0byBldmVudCA6IGJsdWV0b290aDo6aGNpOjpBY2xDb25uZWN0aW9uRXZlbnRzKSB7Ci0gICAgaWYgKGV2ZW50ID09IGV2ZW50X2NvZGUpIHsKLSAgICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkgfHwKLSAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBzdWJldmVudF9hbHJlYWR5X3JlZ2lzdGVyZWRfaW5fbGVfaGNpX2xheWVyKAotICAgIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGUgc3ViZXZlbnRfY29kZSkgewotICBzd2l0Y2ggKHN1YmV2ZW50X2NvZGUpIHsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX1VQREFURV9DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkRBVEFfTEVOR1RIX0NIQU5HRToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkVOSEFOQ0VEX0NPTk5FQ1RJT05fQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpQSFlfVVBEQVRFX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6UkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1Q6Ci0gICAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpIHx8Ci0gICAgICAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkgfHwKLSAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FkdmVydGlzaW5nX2VuYWJsZWQoKSB8fAotICAgICAgICAgICAgIGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2Nhbm5pbmdfZW5hYmxlZCgpOwotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6QURWRVJUSVNJTkdfU0VUX1RFUk1JTkFURUQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpTQ0FOX1JFUVVFU1RfUkVDRUlWRUQ6Ci0gICAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpIHx8Ci0gICAgICAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkgfHwKLSAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FkdmVydGlzaW5nX2VuYWJsZWQoKTsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlNDQU5fVElNRU9VVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkFEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkRJUkVDVEVEX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkVYVEVOREVEX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlBFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfRVNUQUJMSVNIRUQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpQRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX0xPU1Q6Ci0gICAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zY2FubmluZ19lbmFibGVkKCk7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpSRUFEX1JFTU9URV9GRUFUVVJFU19DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlJFQURfTE9DQUxfUDI1Nl9QVUJMSUNfS0VZX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6R0VORVJBVEVfREhLRVlfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDSEFOTkVMX1NFTEVDVElPTl9BTEdPUklUSE06Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OTEVTU19JUV9SRVBPUlQ6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX0lRX1JFUE9SVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkNURV9SRVFVRVNUX0ZBSUxFRDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OgotICAgICAgICBQRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1JFQ0VJVkVEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q0lTX0VTVEFCTElTSEVEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q0lTX1JFUVVFU1Q6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDUkVBVEVfQklHX0NPTVBMRVRFOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6VEVSTUlOQVRFX0JJR19DT01QTEVURToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkJJR19TWU5DX0VTVEFCTElTSEVEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6QklHX1NZTkNfTE9TVDoKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OlJFUVVFU1RfUEVFUl9TQ0FfQ09NUExFVEU6Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpQQVRIX0xPU1NfVEhSRVNIT0xEOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6VFJBTlNNSVRfUE9XRVJfUkVQT1JUSU5HOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6QklHX0lORk9fQURWRVJUSVNJTkdfUkVQT1JUOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6TE9OR19URVJNX0tFWV9SRVFVRVNUOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2xlX2FkdmVydGlzaW5nX21hbmFnZXIoCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZSBldmVudF9jb2RlKSB7Ci0gIGZvciAoYXV0byBldmVudCA6IGJsdWV0b290aDo6aGNpOjpBY2xDb25uZWN0aW9uRXZlbnRzKSB7Ci0gICAgaWYgKGV2ZW50ID09IGV2ZW50X2NvZGUpIHsKLSAgICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FkdmVydGlzaW5nX2VuYWJsZWQoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBldmVudF9hbHJlYWR5X3JlZ2lzdGVyZWRfaW5fbGVfc2Nhbm5pbmdfbWFuYWdlcigKLSAgICBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlIGV2ZW50X2NvZGUpIHsKLSAgZm9yIChhdXRvIGV2ZW50IDogYmx1ZXRvb3RoOjpoY2k6OkFjbENvbm5lY3Rpb25FdmVudHMpIHsKLSAgICBpZiAoZXZlbnQgPT0gZXZlbnRfY29kZSkgewotICAgICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2Nhbm5pbmdfZW5hYmxlZCgpOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY3BwIHsKLWJsdWV0b290aDo6Y29tbW9uOjpCaWRpUXVldWVFbmQ8Ymx1ZXRvb3RoOjpoY2k6OkFjbEJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBY2xWaWV3PiogaGNpX3F1ZXVlX2VuZCA9Ci0gICAgbnVsbHB0cjsKLWJsdWV0b290aDo6Y29tbW9uOjpCaWRpUXVldWVFbmQ8Ymx1ZXRvb3RoOjpoY2k6OlNjb0J1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpTY29WaWV3PiogaGNpX3Njb19xdWV1ZV9lbmQgPQotICAgIG51bGxwdHI7Ci1ibHVldG9vdGg6OmNvbW1vbjo6QmlkaVF1ZXVlRW5kPGJsdWV0b290aDo6aGNpOjpJc29CdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6SXNvVmlldz4qIGhjaV9pc29fcXVldWVfZW5kID0KLSAgICBudWxscHRyOwotc3RhdGljIGJsdWV0b290aDo6b3M6OkVucXVldWVCdWZmZXI8Ymx1ZXRvb3RoOjpoY2k6OkFjbEJ1aWxkZXI+KiBwZW5kaW5nX2RhdGEgPQotICAgIG51bGxwdHI7Ci1zdGF0aWMgYmx1ZXRvb3RoOjpvczo6RW5xdWV1ZUJ1ZmZlcjxibHVldG9vdGg6OmhjaTo6SXNvQnVpbGRlcj4qCi0gICAgcGVuZGluZ19pc29fZGF0YSA9IG51bGxwdHI7Ci1zdGF0aWMgYmx1ZXRvb3RoOjpvczo6RW5xdWV1ZUJ1ZmZlcjxibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcj4qCi0gICAgcGVuZGluZ19zY29fZGF0YSA9IG51bGxwdHI7Ci0KLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+IE1ha2VVbmlxdWVQYWNrZXQoCi0gICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikgewotICBibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlciBidWlsZGVyOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcyhkYXRhLCBkYXRhICsgbGVuKTsKLQotICBhdXRvIHBheWxvYWQgPSBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPigpOwotICBwYXlsb2FkLT5BZGRPY3RldHMoYnl0ZXMpOwotCi0gIHJldHVybiBwYXlsb2FkOwotfQotCi1zdGF0aWMgQlRfSERSKiBXcmFwUGFja2V0QW5kQ29weSgKLSAgICB1aW50MTZfdCBldmVudCwKLSAgICBibHVldG9vdGg6OmhjaTo6UGFja2V0VmlldzxibHVldG9vdGg6OmhjaTo6a0xpdHRsZUVuZGlhbj4qIGRhdGEpIHsKLSAgc2l6ZV90IHBhY2tldF9zaXplID0gZGF0YS0+c2l6ZSgpICsga0J0SGRyU2l6ZTsKLSAgQlRfSERSKiBwYWNrZXQgPSByZWludGVycHJldF9jYXN0PEJUX0hEUio+KG9zaV9tYWxsb2MocGFja2V0X3NpemUpKTsKLSAgcGFja2V0LT5vZmZzZXQgPSAwOwotICBwYWNrZXQtPmxlbiA9IGRhdGEtPnNpemUoKTsKLSAgcGFja2V0LT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0gIHBhY2tldC0+ZXZlbnQgPSBldmVudDsKLSAgc3RkOjpjb3B5KGRhdGEtPmJlZ2luKCksIGRhdGEtPmVuZCgpLCBwYWNrZXQtPmRhdGEpOwotICByZXR1cm4gcGFja2V0OwotfQotCi1zdGF0aWMgdm9pZCBldmVudF9jYWxsYmFjayhibHVldG9vdGg6OmhjaTo6RXZlbnRWaWV3IGV2ZW50X3BhY2tldF92aWV3KSB7Ci0gIGlmICghc2VuZF9kYXRhX3Vwd2FyZHMpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2VuZF9kYXRhX3Vwd2FyZHMuUnVuKEZST01fSEVSRSwgV3JhcFBhY2tldEFuZENvcHkoTVNHX0hDX1RPX1NUQUNLX0hDSV9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudF9wYWNrZXRfdmlldykpOwotfQotCi1zdGF0aWMgdm9pZCBzdWJldmVudF9jYWxsYmFjaygKLSAgICBibHVldG9vdGg6OmhjaTo6TGVNZXRhRXZlbnRWaWV3IGxlX21ldGFfZXZlbnRfdmlldykgewotICBpZiAoIXNlbmRfZGF0YV91cHdhcmRzKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNlbmRfZGF0YV91cHdhcmRzLlJ1bihGUk9NX0hFUkUsIFdyYXBQYWNrZXRBbmRDb3B5KE1TR19IQ19UT19TVEFDS19IQ0lfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVfbWV0YV9ldmVudF92aWV3KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZlbmRvcl9zcGVjaWZpY19ldmVudF9jYWxsYmFjaygKLSAgICBibHVldG9vdGg6OmhjaTo6VmVuZG9yU3BlY2lmaWNFdmVudFZpZXcgdmVuZG9yX3NwZWNpZmljX2V2ZW50X3ZpZXcpIHsKLSAgaWYgKCFzZW5kX2RhdGFfdXB3YXJkcykgewotICAgIHJldHVybjsKLSAgfQotICBzZW5kX2RhdGFfdXB3YXJkcy5SdW4oCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBXcmFwUGFja2V0QW5kQ29weShNU0dfSENfVE9fU1RBQ0tfSENJX0VWVCwgJnZlbmRvcl9zcGVjaWZpY19ldmVudF92aWV3KSk7Ci19Ci0KLXZvaWQgT25UcmFuc21pdFBhY2tldENvbW1hbmRDb21wbGV0ZShjb21tYW5kX2NvbXBsZXRlX2NiIGNvbXBsZXRlX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRDb21wbGV0ZVZpZXcgdmlldykgewotICBMT0dfREVCVUcoIlJlY2VpdmVkIGNtZCBjb21wbGV0ZSBmb3IgJXMiLAotICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZVRleHQodmlldy5HZXRDb21tYW5kT3BDb2RlKCkpLmNfc3RyKCkpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKHZpZXcuYmVnaW4oKSwgdmlldy5lbmQoKSk7Ci0gIEJUX0hEUiogcmVzcG9uc2UgPSBXcmFwUGFja2V0QW5kQ29weShNU0dfSENfVE9fU1RBQ0tfSENJX0VWVCwgJnZpZXcpOwotICBjb21wbGV0ZV9jYWxsYmFjayhyZXNwb25zZSwgY29udGV4dCk7Ci19Ci0KLXZvaWQgT25UcmFuc21pdFBhY2tldFN0YXR1cyhjb21tYW5kX3N0YXR1c19jYiBzdGF0dXNfY2FsbGJhY2ssIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE9zaU9iamVjdD4gY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6Q29tbWFuZFN0YXR1c1ZpZXcgdmlldykgewotICBMT0dfREVCVUcoIlJlY2VpdmVkIGNtZCBzdGF0dXMgJXMgZm9yICVzIiwKLSAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGVUZXh0KHZpZXcuR2V0U3RhdHVzKCkpLmNfc3RyKCksCi0gICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6T3BDb2RlVGV4dCh2aWV3LkdldENvbW1hbmRPcENvZGUoKSkuY19zdHIoKSk7Ci0gIHVpbnQ4X3Qgc3RhdHVzID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmlldy5HZXRTdGF0dXMoKSk7Ci0gIHN0YXR1c19jYWxsYmFjayhzdGF0dXMsIHN0YXRpY19jYXN0PEJUX0hEUio+KGNvbW1hbmQtPlJlbGVhc2UoKSksIGNvbnRleHQpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFuc21pdF9jb21tYW5kKGNvbnN0IEJUX0hEUiogY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9jb21wbGV0ZV9jYiBjb21wbGV0ZV9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9zdGF0dXNfY2Igc3RhdHVzX2NhbGxiYWNrLCB2b2lkKiBjb250ZXh0KSB7Ci0gIENIRUNLKGNvbW1hbmQgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjb21tYW5kLT5kYXRhICsgY29tbWFuZC0+b2Zmc2V0OwotICBzaXplX3QgbGVuID0gY29tbWFuZC0+bGVuOwotICBDSEVDSyhsZW4gPj0gKGtDb21tYW5kT3Bjb2RlU2l6ZSArIGtDb21tYW5kTGVuZ3RoU2l6ZSkpOwotCi0gIC8vIGxpdHRsZSBlbmRpYW4gY29tbWFuZCBvcGNvZGUKLSAgdWludDE2X3QgY29tbWFuZF9vcF9jb2RlID0gKGRhdGFbMV0gPDwgOCB8IGRhdGFbMF0pOwotICAvLyBHZCBzdGFjayBBUEkgcmVxdWlyZXMgb3Bjb2RlIHNwZWNpZmljYXRpb24gYW5kIGNhbGN1bGF0ZXMgbGVuZ3RoLCBzbwotICAvLyBubyBuZWVkIHRvIHByb3ZpZGUgb3Bjb2RlIG9yIGxlbmd0aCBoZXJlLgotICBkYXRhICs9IChrQ29tbWFuZE9wY29kZVNpemUgKyBrQ29tbWFuZExlbmd0aFNpemUpOwotICBsZW4gLT0gKGtDb21tYW5kT3Bjb2RlU2l6ZSArIGtDb21tYW5kTGVuZ3RoU2l6ZSk7Ci0KLSAgYXV0byBvcF9jb2RlID0gc3RhdGljX2Nhc3Q8Y29uc3QgYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZT4oY29tbWFuZF9vcF9jb2RlKTsKLQotICBhdXRvIHBheWxvYWQgPSBNYWtlVW5pcXVlUGFja2V0KGRhdGEsIGxlbik7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpDb21tYW5kQnVpbGRlcjo6Q3JlYXRlKG9wX2NvZGUsIHN0ZDo6bW92ZShwYXlsb2FkKSk7Ci0KLSAgTE9HX0RFQlVHKCJTZW5kaW5nIGNvbW1hbmQgJXMiLCBibHVldG9vdGg6OmhjaTo6T3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpKTsKLQotICBpZiAoYmx1ZXRvb3RoOjpoY2k6OkNoZWNrZXI6OklzQ29tbWFuZFN0YXR1c09wY29kZShvcF9jb2RlKSkgewotICAgIGF1dG8gY29tbWFuZF91bmlxdWUgPSBzdGQ6Om1ha2VfdW5pcXVlPE9zaU9iamVjdD4oY29tbWFuZCk7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRIY2lMYXllcigpLT5FbnF1ZXVlQ29tbWFuZCgKLSAgICAgICAgc3RkOjptb3ZlKHBhY2tldCksIGJsdWV0b290aDo6c2hpbTo6R2V0R2RTaGltSGFuZGxlcigpLT5CaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPblRyYW5zbWl0UGFja2V0U3RhdHVzLCBzdGF0dXNfY2FsbGJhY2ssIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNvbW1hbmRfdW5pcXVlKSkpOwotICB9IGVsc2UgewotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0SGNpTGF5ZXIoKS0+RW5xdWV1ZUNvbW1hbmQoCi0gICAgICAgIHN0ZDo6bW92ZShwYWNrZXQpLAotICAgICAgICBibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKS0+QmluZE9uY2UoCi0gICAgICAgICAgICBPblRyYW5zbWl0UGFja2V0Q29tbWFuZENvbXBsZXRlLCBjb21wbGV0ZV9jYWxsYmFjaywgY29udGV4dCkpOwotICAgIG9zaV9mcmVlKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihjb21tYW5kKSkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zbWl0X2ZyYWdtZW50KGNvbnN0IHVpbnQ4X3QqIHN0cmVhbSwgc2l6ZV90IGxlbmd0aCkgewotICB1aW50MTZfdCBoYW5kbGVfd2l0aF9mbGFnczsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGVfd2l0aF9mbGFncywgc3RyZWFtKTsKLSAgYXV0byBwYl9mbGFnID0gc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OlBhY2tldEJvdW5kYXJ5RmxhZz4oCi0gICAgICBoYW5kbGVfd2l0aF9mbGFncyA+PiAxMiAmIDBiMTEpOwotICBhdXRvIGJjX2ZsYWcgPQotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkJyb2FkY2FzdEZsYWc+KGhhbmRsZV93aXRoX2ZsYWdzID4+IDE0KTsKLSAgdWludDE2X3QgaGFuZGxlID0gaGFuZGxlX3dpdGhfZmxhZ3MgJiAweEZGRjsKLSAgQVNTRVJUX0xPRyhoYW5kbGUgPD0gMHhFRkYsICJSZXF1aXJlIGhhbmRsZSA8PSAweEVGRiwgYnV0IGlzIDB4JVgiLCBoYW5kbGUpOwotICBsZW5ndGggLT0gMjsKLSAgLy8gc2tpcCBkYXRhIHRvdGFsIGxlbmd0aAotICBzdHJlYW0gKz0gMjsKLSAgbGVuZ3RoIC09IDI7Ci0gIGF1dG8gcGF5bG9hZCA9IE1ha2VVbmlxdWVQYWNrZXQoc3RyZWFtLCBsZW5ndGgpOwotICBhdXRvIGFjbF9wYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6QWNsQnVpbGRlcjo6Q3JlYXRlKGhhbmRsZSwgcGJfZmxhZywgYmNfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGF5bG9hZCkpOwotICBwZW5kaW5nX2RhdGEtPkVucXVldWUoc3RkOjptb3ZlKGFjbF9wYWNrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRHZFNoaW1IYW5kbGVyKCkpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFuc21pdF9zY29fZnJhZ21lbnQoY29uc3QgdWludDhfdCogc3RyZWFtLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHVpbnQxNl90IGhhbmRsZV93aXRoX2ZsYWdzOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZV93aXRoX2ZsYWdzLCBzdHJlYW0pOwotICB1aW50MTZfdCBoYW5kbGUgPSBoYW5kbGVfd2l0aF9mbGFncyAmIDB4RkZGOwotICBBU1NFUlRfTE9HKGhhbmRsZSA8PSAweEVGRiwgIlJlcXVpcmUgaGFuZGxlIDw9IDB4RUZGLCBidXQgaXMgMHglWCIsIGhhbmRsZSk7Ci0gIGxlbmd0aCAtPSAyOwotICAvLyBza2lwIGRhdGEgdG90YWwgbGVuZ3RoCi0gIHN0cmVhbSArPSAxOwotICBsZW5ndGggLT0gMTsKLSAgYXV0byBwYXlsb2FkID0gc3RkOjp2ZWN0b3I8dWludDhfdD4oc3RyZWFtLCBzdHJlYW0gKyBsZW5ndGgpOwotICBhdXRvIHNjb19wYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgaGFuZGxlLCBibHVldG9vdGg6OmhjaTo6UGFja2V0U3RhdHVzRmxhZzo6Q09SUkVDVExZX1JFQ0VJVkVELAotICAgICAgc3RkOjptb3ZlKHBheWxvYWQpKTsKLQotICBwZW5kaW5nX3Njb19kYXRhLT5FbnF1ZXVlKHN0ZDo6bW92ZShzY29fcGFja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zbWl0X2lzb19mcmFnbWVudChjb25zdCB1aW50OF90KiBzdHJlYW0sIHNpemVfdCBsZW5ndGgpIHsKLSAgdWludDE2X3QgaGFuZGxlX3dpdGhfZmxhZ3M7Ci0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlX3dpdGhfZmxhZ3MsIHN0cmVhbSk7Ci0gIGF1dG8gcGJfZmxhZyA9IHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpJc29QYWNrZXRCb3VuZGFyeUZsYWc+KAotICAgICAgaGFuZGxlX3dpdGhfZmxhZ3MgPj4gMTIgJiAwYjExKTsKLSAgYXV0byB0c19mbGFnID0KLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpUaW1lU3RhbXBGbGFnPihoYW5kbGVfd2l0aF9mbGFncyA+PiAxNCk7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IGhhbmRsZV93aXRoX2ZsYWdzICYgMHhGRkY7Ci0gIEFTU0VSVF9MT0coaGFuZGxlIDw9IDB4RUZGLCAiUmVxdWlyZSBoYW5kbGUgPD0gMHhFRkYsIGJ1dCBpcyAweCVYIiwgaGFuZGxlKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIC8vIHNraXAgZGF0YSB0b3RhbCBsZW5ndGgKLSAgc3RyZWFtICs9IDI7Ci0gIGxlbmd0aCAtPSAyOwotICBhdXRvIHBheWxvYWQgPSBNYWtlVW5pcXVlUGFja2V0KHN0cmVhbSwgbGVuZ3RoKTsKLSAgYXV0byBpc29fcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6Oklzb0J1aWxkZXI6OkNyZWF0ZShoYW5kbGUsIHBiX2ZsYWcsIHRzX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBheWxvYWQpKTsKLQotICBwZW5kaW5nX2lzb19kYXRhLT5FbnF1ZXVlKHN0ZDo6bW92ZShpc29fcGFja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2V2ZW50KGJsdWV0b290aDo6aGNpOjpFdmVudENvZGUgZXZlbnRfY29kZSkgewotICBhdXRvIGhhbmRsZXIgPSBibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKTsKLSAgYmx1ZXRvb3RoOjpzaGltOjpHZXRIY2lMYXllcigpLT5SZWdpc3RlckV2ZW50SGFuZGxlcigKLSAgICAgIGV2ZW50X2NvZGUsIGhhbmRsZXItPkJpbmQoZXZlbnRfY2FsbGJhY2spKTsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfbGVfZXZlbnQoYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZSBzdWJldmVudF9jb2RlKSB7Ci0gIGF1dG8gaGFuZGxlciA9IGJsdWV0b290aDo6c2hpbTo6R2V0R2RTaGltSGFuZGxlcigpOwotICBibHVldG9vdGg6OnNoaW06OkdldEhjaUxheWVyKCktPlJlZ2lzdGVyTGVFdmVudEhhbmRsZXIoCi0gICAgICBzdWJldmVudF9jb2RlLCBoYW5kbGVyLT5CaW5kKHN1YmV2ZW50X2NhbGxiYWNrKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjbF9kYXRhX2NhbGxiYWNrKCkgewotICBpZiAoaGNpX3F1ZXVlX2VuZCA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gcGFja2V0ID0gaGNpX3F1ZXVlX2VuZC0+VHJ5RGVxdWV1ZSgpOwotICBBU1NFUlQocGFja2V0ICE9IG51bGxwdHIpOwotICBpZiAoIXBhY2tldC0+SXNWYWxpZCgpKSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nIGludmFsaWQgcGFja2V0IG9mIHNpemUgJXp1IiwgcGFja2V0LT5zaXplKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXNlbmRfZGF0YV91cHdhcmRzKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gZGF0YSA9IFdyYXBQYWNrZXRBbmRDb3B5KE1TR19IQ19UT19TVEFDS19IQ0lfQUNMLCBwYWNrZXQuZ2V0KCkpOwotICBwYWNrZXRfZnJhZ21lbnRlci0+cmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2goZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjb19kYXRhX2NhbGxiYWNrKCkgewotICBpZiAoaGNpX3Njb19xdWV1ZV9lbmQgPT0gbnVsbHB0cikgewotICAgIHJldHVybjsKLSAgfQotICBhdXRvIHBhY2tldCA9IGhjaV9zY29fcXVldWVfZW5kLT5UcnlEZXF1ZXVlKCk7Ci0gIEFTU0VSVChwYWNrZXQgIT0gbnVsbHB0cik7Ci0gIGlmICghcGFja2V0LT5Jc1ZhbGlkKCkpIHsKLSAgICBMT0dfSU5GTygiRHJvcHBpbmcgaW52YWxpZCBwYWNrZXQgb2Ygc2l6ZSAlenUiLCBwYWNrZXQtPnNpemUoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghc2VuZF9kYXRhX3Vwd2FyZHMpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBkYXRhID0gV3JhcFBhY2tldEFuZENvcHkoTVNHX0hDX1RPX1NUQUNLX0hDSV9TQ08sIHBhY2tldC5nZXQoKSk7Ci0gIHBhY2tldF9mcmFnbWVudGVyLT5yZWFzc2VtYmxlX2FuZF9kaXNwYXRjaChkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgaXNvX2RhdGFfY2FsbGJhY2soKSB7Ci0gIGlmIChoY2lfaXNvX3F1ZXVlX2VuZCA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gcGFja2V0ID0gaGNpX2lzb19xdWV1ZV9lbmQtPlRyeURlcXVldWUoKTsKLSAgQVNTRVJUKHBhY2tldCAhPSBudWxscHRyKTsKLSAgaWYgKCFwYWNrZXQtPklzVmFsaWQoKSkgewotICAgIExPR19JTkZPKCJEcm9wcGluZyBpbnZhbGlkIHBhY2tldCBvZiBzaXplICV6dSIsIHBhY2tldC0+c2l6ZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFzZW5kX2RhdGFfdXB3YXJkcykgewotICAgIHJldHVybjsKLSAgfQotICBhdXRvIGRhdGEgPSBXcmFwUGFja2V0QW5kQ29weShNU0dfSENfVE9fU1RBQ0tfSENJX0lTTywgcGFja2V0LmdldCgpKTsKLSAgcGFja2V0X2ZyYWdtZW50ZXItPnJlYXNzZW1ibGVfYW5kX2Rpc3BhdGNoKGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9mb3JfYWNsKCkgewotICBoY2lfcXVldWVfZW5kID0gYmx1ZXRvb3RoOjpzaGltOjpHZXRIY2lMYXllcigpLT5HZXRBY2xRdWV1ZUVuZCgpOwotCi0gIC8vIGlmIGdkIGFkdmVydGlzaW5nL3NjYW5uaW5nIGVuYWJsZWQsIGhjaV9xdWV1ZV9lbmQgd2lsbCBiZSByZWdpc3RlciBpbgotICAvLyBBY2xNYW5hZ2VyOjppbXBsOjpTdGFydAotICBpZiAoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWR2ZXJ0aXNpbmdfZW5hYmxlZCgpICYmCi0gICAgICAhYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zY2FubmluZ19lbmFibGVkKCkgJiYKLSAgICAgICFibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGhjaV9xdWV1ZV9lbmQtPlJlZ2lzdGVyRGVxdWV1ZShibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkJpbmQoYWNsX2RhdGFfY2FsbGJhY2spKTsKLSAgfQotCi0gIHBlbmRpbmdfZGF0YSA9IG5ldyBibHVldG9vdGg6Om9zOjpFbnF1ZXVlQnVmZmVyPGJsdWV0b290aDo6aGNpOjpBY2xCdWlsZGVyPigKLSAgICAgIGhjaV9xdWV1ZV9lbmQpOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9mb3Jfc2NvKCkgewotICBoY2lfc2NvX3F1ZXVlX2VuZCA9IGJsdWV0b290aDo6c2hpbTo6R2V0SGNpTGF5ZXIoKS0+R2V0U2NvUXVldWVFbmQoKTsKLSAgaGNpX3Njb19xdWV1ZV9lbmQtPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6R2V0R2RTaGltSGFuZGxlcigpLAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkJpbmQoc2NvX2RhdGFfY2FsbGJhY2spKTsKLSAgcGVuZGluZ19zY29fZGF0YSA9Ci0gICAgICBuZXcgYmx1ZXRvb3RoOjpvczo6RW5xdWV1ZUJ1ZmZlcjxibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcj4oCi0gICAgICAgICAgaGNpX3Njb19xdWV1ZV9lbmQpOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9mb3JfaXNvKCkgewotICBoY2lfaXNvX3F1ZXVlX2VuZCA9IGJsdWV0b290aDo6c2hpbTo6R2V0SGNpTGF5ZXIoKS0+R2V0SXNvUXVldWVFbmQoKTsKLSAgaGNpX2lzb19xdWV1ZV9lbmQtPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6R2V0R2RTaGltSGFuZGxlcigpLAotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkJpbmQoaXNvX2RhdGFfY2FsbGJhY2spKTsKLSAgcGVuZGluZ19pc29fZGF0YSA9Ci0gICAgICBuZXcgYmx1ZXRvb3RoOjpvczo6RW5xdWV1ZUJ1ZmZlcjxibHVldG9vdGg6OmhjaTo6SXNvQnVpbGRlcj4oCi0gICAgICAgICAgaGNpX2lzb19xdWV1ZV9lbmQpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9zaHV0dGluZ19kb3duKCkgewotICBpZiAocGVuZGluZ19kYXRhICE9IG51bGxwdHIpIHsKLSAgICBwZW5kaW5nX2RhdGEtPkNsZWFyKCk7Ci0gICAgZGVsZXRlIHBlbmRpbmdfZGF0YTsKLSAgICBwZW5kaW5nX2RhdGEgPSBudWxscHRyOwotICB9Ci0gIGlmIChwZW5kaW5nX3Njb19kYXRhICE9IG51bGxwdHIpIHsKLSAgICBwZW5kaW5nX3Njb19kYXRhLT5DbGVhcigpOwotICAgIGRlbGV0ZSBwZW5kaW5nX3Njb19kYXRhOwotICAgIHBlbmRpbmdfc2NvX2RhdGEgPSBudWxscHRyOwotICB9Ci0gIGlmIChwZW5kaW5nX2lzb19kYXRhICE9IG51bGxwdHIpIHsKLSAgICBwZW5kaW5nX2lzb19kYXRhLT5DbGVhcigpOwotICAgIGRlbGV0ZSBwZW5kaW5nX2lzb19kYXRhOwotICAgIHBlbmRpbmdfaXNvX2RhdGEgPSBudWxscHRyOwotICB9Ci0gIGlmIChoY2lfcXVldWVfZW5kICE9IG51bGxwdHIpIHsKLSAgICBpZiAoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWR2ZXJ0aXNpbmdfZW5hYmxlZCgpICYmCi0gICAgICAgICFibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgICAgaGNpX3F1ZXVlX2VuZC0+VW5yZWdpc3RlckRlcXVldWUoKTsKLSAgICB9Ci0gICAgZm9yICh1aW50MTZfdCBldmVudF9jb2RlX3JhdyA9IDA7IGV2ZW50X2NvZGVfcmF3IDwgMHgxMDA7Ci0gICAgICAgICBldmVudF9jb2RlX3JhdysrKSB7Ci0gICAgICBhdXRvIGV2ZW50X2NvZGUgPSBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlPihldmVudF9jb2RlX3Jhdyk7Ci0gICAgICBpZiAoIWlzX3ZhbGlkX2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2hjaV9sYXllcihldmVudF9jb2RlKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSBpZiAoZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2xlX2FkdmVydGlzaW5nX21hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICBldmVudF9jb2RlKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSBpZiAoZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2xlX3NjYW5uaW5nX21hbmFnZXIoZXZlbnRfY29kZSkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBibHVldG9vdGg6OnNoaW06OkdldEhjaUxheWVyKCktPlVucmVnaXN0ZXJFdmVudEhhbmRsZXIoZXZlbnRfY29kZSk7Ci0gICAgfQotICAgIGhjaV9xdWV1ZV9lbmQgPSBudWxscHRyOwotICB9Ci0gIGlmIChoY2lfc2NvX3F1ZXVlX2VuZCAhPSBudWxscHRyKSB7Ci0gICAgaGNpX3Njb19xdWV1ZV9lbmQtPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgaGNpX3Njb19xdWV1ZV9lbmQgPSBudWxscHRyOwotICB9Ci0gIGlmIChoY2lfaXNvX3F1ZXVlX2VuZCAhPSBudWxscHRyKSB7Ci0gICAgaGNpX2lzb19xdWV1ZV9lbmQtPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgaGNpX2lzb19xdWV1ZV9lbmQgPSBudWxscHRyOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkJpbmQ7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6QmluZE9uY2U7Ci11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6VW5yZXRhaW5lZDsKLQotbmFtZXNwYWNlIHJ1c3QgewotCi11c2luZyBibHVldG9vdGg6OnNoaW06OnJ1c3Q6OnU4U2xpY2VDYWxsYmFjazsKLXVzaW5nIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6dThTbGljZU9uY2VDYWxsYmFjazsKLQotc3RhdGljIEJUX0hEUiogV3JhcFJ1c3RQYWNrZXRBbmRDb3B5KHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4qIGRhdGEpIHsKLSAgc2l6ZV90IHBhY2tldF9zaXplID0gZGF0YS0+bGVuZ3RoKCkgKyBrQnRIZHJTaXplOwotICBCVF9IRFIqIHBhY2tldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QlRfSERSKj4ob3NpX21hbGxvYyhwYWNrZXRfc2l6ZSkpOwotICBwYWNrZXQtPm9mZnNldCA9IDA7Ci0gIHBhY2tldC0+bGVuID0gZGF0YS0+bGVuZ3RoKCk7Ci0gIHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotICBwYWNrZXQtPmV2ZW50ID0gZXZlbnQ7Ci0gIHN0ZDo6Y29weShkYXRhLT5kYXRhKCksIGRhdGEtPmRhdGEoKSArIGRhdGEtPmxlbmd0aCgpLCBwYWNrZXQtPmRhdGEpOwotICByZXR1cm4gcGFja2V0OwotfQotCi1zdGF0aWMgdm9pZCBvbl9hY2woOjpydXN0OjpTbGljZTxjb25zdCB1aW50OF90PiBkYXRhKSB7Ci0gIGlmICghc2VuZF9kYXRhX3Vwd2FyZHMpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBsZWdhY3lfZGF0YSA9IFdyYXBSdXN0UGFja2V0QW5kQ29weShNU0dfSENfVE9fU1RBQ0tfSENJX0FDTCwgJmRhdGEpOwotICBwYWNrZXRfZnJhZ21lbnRlci0+cmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2gobGVnYWN5X2RhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9zY28oOjpydXN0OjpTbGljZTxjb25zdCB1aW50OF90PiBkYXRhKSB7Ci0gIGlmICghc2VuZF9kYXRhX3Vwd2FyZHMpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBsZWdhY3lfZGF0YSA9IFdyYXBSdXN0UGFja2V0QW5kQ29weShNU0dfSENfVE9fU1RBQ0tfSENJX1NDTywgJmRhdGEpOwotICBwYWNrZXRfZnJhZ21lbnRlci0+cmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2gobGVnYWN5X2RhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9pc28oOjpydXN0OjpTbGljZTxjb25zdCB1aW50OF90PiBkYXRhKSB7Ci0gIGlmICghc2VuZF9kYXRhX3Vwd2FyZHMpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBsZWdhY3lfZGF0YSA9IFdyYXBSdXN0UGFja2V0QW5kQ29weShNU0dfSENfVE9fU1RBQ0tfSENJX0lTTywgJmRhdGEpOwotICBwYWNrZXRfZnJhZ21lbnRlci0+cmVhc3NlbWJsZV9hbmRfZGlzcGF0Y2gobGVnYWN5X2RhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9ldmVudCg6OnJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+IGRhdGEpIHsKLSAgaWYgKCFzZW5kX2RhdGFfdXB3YXJkcykgewotICAgIHJldHVybjsKLSAgfQotICBzZW5kX2RhdGFfdXB3YXJkcy5SdW4oRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgV3JhcFJ1c3RQYWNrZXRBbmRDb3B5KE1TR19IQ19UT19TVEFDS19IQ0lfRVZULCAmZGF0YSkpOwotfQotCi12b2lkIE9uUnVzdFRyYW5zbWl0UGFja2V0Q29tbWFuZENvbXBsZXRlKGNvbW1hbmRfY29tcGxldGVfY2IgY29tcGxldGVfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4gZGF0YSkgewotICBCVF9IRFIqIHJlc3BvbnNlID0gV3JhcFJ1c3RQYWNrZXRBbmRDb3B5KE1TR19IQ19UT19TVEFDS19IQ0lfRVZULCAmZGF0YSk7Ci0gIGNvbXBsZXRlX2NhbGxiYWNrKHJlc3BvbnNlLCBjb250ZXh0KTsKLX0KLQotdm9pZCBPblJ1c3RUcmFuc21pdFBhY2tldFN0YXR1cyhjb21tYW5kX3N0YXR1c19jYiBzdGF0dXNfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxPc2lPYmplY3Q+IGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4gZGF0YSkgewotICBBU1NFUlQoZGF0YS5sZW5ndGgoKSA+PSAzKTsKLSAgdWludDhfdCBzdGF0dXMgPSBkYXRhLmRhdGEoKVsyXTsKLSAgc3RhdHVzX2NhbGxiYWNrKHN0YXR1cywgc3RhdGljX2Nhc3Q8QlRfSERSKj4oY29tbWFuZC0+UmVsZWFzZSgpKSwgY29udGV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zbWl0X2NvbW1hbmQoY29uc3QgQlRfSERSKiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvbXBsZXRlX2NiIGNvbXBsZXRlX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX3N0YXR1c19jYiBzdGF0dXNfY2FsbGJhY2ssIHZvaWQqIGNvbnRleHQpIHsKLSAgQ0hFQ0soY29tbWFuZCAhPSBudWxscHRyKTsKLSAgY29uc3QgdWludDhfdCogZGF0YSA9IGNvbW1hbmQtPmRhdGEgKyBjb21tYW5kLT5vZmZzZXQ7Ci0gIHNpemVfdCBsZW4gPSBjb21tYW5kLT5sZW47Ci0gIENIRUNLKGxlbiA+PSAoa0NvbW1hbmRPcGNvZGVTaXplICsga0NvbW1hbmRMZW5ndGhTaXplKSk7Ci0KLSAgLy8gbGl0dGxlIGVuZGlhbiBjb21tYW5kIG9wY29kZQotICB1aW50MTZfdCBjb21tYW5kX29wX2NvZGUgPSAoZGF0YVsxXSA8PCA4IHwgZGF0YVswXSk7Ci0gIGF1dG8gb3BfY29kZSA9IHN0YXRpY19jYXN0PGNvbnN0IGJsdWV0b290aDo6aGNpOjpPcENvZGU+KGNvbW1hbmRfb3BfY29kZSk7Ci0KLSAgTE9HX0RFQlVHKCJTZW5kaW5nIGNvbW1hbmQgJXMiLCBibHVldG9vdGg6OmhjaTo6T3BDb2RlVGV4dChvcF9jb2RlKS5jX3N0cigpKTsKLQotICBpZiAoYmx1ZXRvb3RoOjpoY2k6OkNoZWNrZXI6OklzQ29tbWFuZFN0YXR1c09wY29kZShvcF9jb2RlKSkgewotICAgIGF1dG8gY29tbWFuZF91bmlxdWUgPSBzdGQ6Om1ha2VfdW5pcXVlPE9zaU9iamVjdD4oY29tbWFuZCk7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpydXN0OjpoY2lfc2VuZF9jb21tYW5kKAotICAgICAgICAqKmJsdWV0b290aDo6c2hpbTo6U3RhY2s6OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0SGNpKCksCi0gICAgICAgIDo6cnVzdDo6U2xpY2UoZGF0YSwgbGVuKSwKLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTx1OFNsaWNlT25jZUNhbGxiYWNrPigKLSAgICAgICAgICAgIEJpbmRPbmNlKE9uUnVzdFRyYW5zbWl0UGFja2V0U3RhdHVzLCBzdGF0dXNfY2FsbGJhY2ssIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY29tbWFuZF91bmlxdWUpKSkpOwotICB9IGVsc2UgewotICAgIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3NlbmRfY29tbWFuZCgKLSAgICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdEhjaSgpLAotICAgICAgICA6OnJ1c3Q6OlNsaWNlKGRhdGEsIGxlbiksCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8dThTbGljZU9uY2VDYWxsYmFjaz4oQmluZE9uY2UoCi0gICAgICAgICAgICBPblJ1c3RUcmFuc21pdFBhY2tldENvbW1hbmRDb21wbGV0ZSwgY29tcGxldGVfY2FsbGJhY2ssIGNvbnRleHQpKSk7Ci0gICAgb3NpX2ZyZWUoY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KGNvbW1hbmQpKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgdHJhbnNtaXRfZnJhZ21lbnQoY29uc3QgdWludDhfdCogc3RyZWFtLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3NlbmRfYWNsKAotICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdEhjaSgpLAotICAgICAgOjpydXN0OjpTbGljZShzdHJlYW0sIGxlbmd0aCkpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFuc21pdF9zY29fZnJhZ21lbnQoY29uc3QgdWludDhfdCogc3RyZWFtLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3NlbmRfc2NvKAotICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdEhjaSgpLAotICAgICAgOjpydXN0OjpTbGljZShzdHJlYW0sIGxlbmd0aCkpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFuc21pdF9pc29fZnJhZ21lbnQoY29uc3QgdWludDhfdCogc3RyZWFtLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3NlbmRfaXNvKAotICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdEhjaSgpLAotICAgICAgOjpydXN0OjpTbGljZShzdHJlYW0sIGxlbmd0aCkpOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ldmVudChibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlIGV2ZW50X2NvZGUpIHsKLSAgYmx1ZXRvb3RoOjpzaGltOjpydXN0OjpoY2lfcmVnaXN0ZXJfZXZlbnQoCi0gICAgICAqKmJsdWV0b290aDo6c2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPkdldFJ1c3RIY2koKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGV2ZW50X2NvZGUpKTsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfbGVfZXZlbnQoYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZSBzdWJldmVudF9jb2RlKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3JlZ2lzdGVyX2xlX2V2ZW50KAotICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdEhjaSgpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3ViZXZlbnRfY29kZSkpOwotfQotCi1zdGF0aWMgdm9pZCBoY2lfb25fcmVzZXRfY29tcGxldGUoKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3NldF9ldnRfY2FsbGJhY2soCi0gICAgICAqKmJsdWV0b290aDo6c2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPkdldFJ1c3RIY2koKSwKLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8dThTbGljZUNhbGxiYWNrPihCaW5kKHJ1c3Q6Om9uX2V2ZW50KSkpOwotICBibHVldG9vdGg6OnNoaW06OnJ1c3Q6OmhjaV9zZXRfbGVfZXZ0X2NhbGxiYWNrKAotICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0SGNpKCksCi0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPHU4U2xpY2VDYWxsYmFjaz4oQmluZChydXN0Ojpvbl9ldmVudCkpKTsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfZm9yX2FjbCgpIHsKLSAgYmx1ZXRvb3RoOjpzaGltOjpydXN0OjpoY2lfc2V0X2FjbF9jYWxsYmFjaygKLSAgICAgICoqYmx1ZXRvb3RoOjpzaGltOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+R2V0UnVzdEhjaSgpLAotICAgICAgc3RkOjptYWtlX3VuaXF1ZTx1OFNsaWNlQ2FsbGJhY2s+KEJpbmQocnVzdDo6b25fYWNsKSkpOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9mb3Jfc2NvKCkgewotICBibHVldG9vdGg6OnNoaW06OnJ1c3Q6OmhjaV9zZXRfc2NvX2NhbGxiYWNrKAotICAgICAgKipibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5HZXRSdXN0SGNpKCksCi0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPHU4U2xpY2VDYWxsYmFjaz4oQmluZChydXN0Ojpvbl9zY28pKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2Zvcl9pc28oKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6cnVzdDo6aGNpX3NldF9pc29fY2FsbGJhY2soCi0gICAgICAqKmJsdWV0b290aDo6c2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPkdldFJ1c3RIY2koKSwKLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8dThTbGljZUNhbGxiYWNrPihCaW5kKHJ1c3Q6Om9uX2lzbykpKTsKLX0KLQotc3RhdGljIHZvaWQgb25fc2h1dHRpbmdfZG93bigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBydXN0Ci0KLXN0YXRpYyB2b2lkIHNldF9kYXRhX2NiKAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgYmFzZTo6TG9jYXRpb24mLCBCVF9IRFIqKT4gc2VuZF9kYXRhX2NiKSB7Ci0gIHNlbmRfZGF0YV91cHdhcmRzID0gc3RkOjptb3ZlKHNlbmRfZGF0YV9jYik7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zbWl0X2NvbW1hbmQoY29uc3QgQlRfSERSKiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvbXBsZXRlX2NiIGNvbXBsZXRlX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX3N0YXR1c19jYiBzdGF0dXNfY2FsbGJhY2ssIHZvaWQqIGNvbnRleHQpIHsKLSAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgIHJ1c3Q6OnRyYW5zbWl0X2NvbW1hbmQoY29tbWFuZCwgY29tcGxldGVfY2FsbGJhY2ssIHN0YXR1c19jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICB9IGVsc2UgewotICAgIGNwcDo6dHJhbnNtaXRfY29tbWFuZChjb21tYW5kLCBjb21wbGV0ZV9jYWxsYmFjaywgc3RhdHVzX2NhbGxiYWNrLCBjb250ZXh0KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjb21tYW5kX2NvbXBsZXRlX2NhbGxiYWNrKEJUX0hEUiogcmVzcG9uc2UsIHZvaWQqIGNvbnRleHQpIHsKLSAgYXV0byBmdXR1cmUgPSBzdGF0aWNfY2FzdDxmdXR1cmVfdCo+KGNvbnRleHQpOwotICBmdXR1cmVfcmVhZHkoZnV0dXJlLCByZXNwb25zZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbW1hbmRfc3RhdHVzX2NhbGxiYWNrKHVpbnQ4X3Qgc3RhdHVzLCBCVF9IRFIqIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KSB7Ci0gIExPR19BTFdBWVNfRkFUQUwoCi0gICAgICAidHJhbnNtaXRfY29tbWFuZF9mdXR1cmVkIHNob3VsZCBvbmx5IHNlbmQgY29tbWFuZCBjb21wbGV0ZSBvcGNvZGUiKTsKLX0KLQotc3RhdGljIGZ1dHVyZV90KiB0cmFuc21pdF9jb21tYW5kX2Z1dHVyZWQoY29uc3QgQlRfSERSKiBjb21tYW5kKSB7Ci0gIGZ1dHVyZV90KiBmdXR1cmUgPSBmdXR1cmVfbmV3KCk7Ci0gIHRyYW5zbWl0X2NvbW1hbmQoY29tbWFuZCwgY29tbWFuZF9jb21wbGV0ZV9jYWxsYmFjaywgY29tbWFuZF9zdGF0dXNfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgZnV0dXJlKTsKLSAgcmV0dXJuIGZ1dHVyZTsKLX0KLQotc3RhdGljIHZvaWQgdHJhbnNtaXRfZnJhZ21lbnQoQlRfSERSKiBwYWNrZXQsIGJvb2wgc2VuZF90cmFuc21pdF9maW5pc2hlZCkgewotICB1aW50MTZfdCBldmVudCA9IHBhY2tldC0+ZXZlbnQgJiBNU0dfRVZUX01BU0s7Ci0KLSAgLy8gSENJIGNvbW1hbmQgcGFja2V0cyBhcmUgZnJlZWQgb24gYSBkaWZmZXJlbnQgdGhyZWFkIHdoZW4gdGhlIG1hdGNoaW5nCi0gIC8vIGV2ZW50IGlzIHJlY2VpdmVkLiBDaGVjayBwYWNrZXQtPmV2ZW50IGJlZm9yZSBzZW5kaW5nIHRvIGF2b2lkIGEgcmFjZS4KLSAgYm9vbCBmcmVlX2FmdGVyX3RyYW5zbWl0ID0KLSAgICAgIGV2ZW50ICE9IE1TR19TVEFDS19UT19IQ19IQ0lfQ01EICYmIHNlbmRfdHJhbnNtaXRfZmluaXNoZWQ7Ci0KLSAgaWYgKGV2ZW50ID09IE1TR19TVEFDS19UT19IQ19IQ0lfQUNMKSB7Ci0gICAgY29uc3QgdWludDhfdCogc3RyZWFtID0gcGFja2V0LT5kYXRhICsgcGFja2V0LT5vZmZzZXQ7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHBhY2tldC0+bGVuOwotICAgIGlmIChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICAgIHJ1c3Q6OnRyYW5zbWl0X2ZyYWdtZW50KHN0cmVhbSwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgY3BwOjp0cmFuc21pdF9mcmFnbWVudChzdHJlYW0sIGxlbmd0aCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGV2ZW50ID09IE1TR19TVEFDS19UT19IQ19IQ0lfU0NPKSB7Ci0gICAgY29uc3QgdWludDhfdCogc3RyZWFtID0gcGFja2V0LT5kYXRhICsgcGFja2V0LT5vZmZzZXQ7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHBhY2tldC0+bGVuOwotICAgIGlmIChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICAgIHJ1c3Q6OnRyYW5zbWl0X3Njb19mcmFnbWVudChzdHJlYW0sIGxlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNwcDo6dHJhbnNtaXRfc2NvX2ZyYWdtZW50KHN0cmVhbSwgbGVuZ3RoKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoZXZlbnQgPT0gTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08pIHsKLSAgICBjb25zdCB1aW50OF90KiBzdHJlYW0gPSBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsKLSAgICBzaXplX3QgbGVuZ3RoID0gcGFja2V0LT5sZW47Ci0gICAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgICAgcnVzdDo6dHJhbnNtaXRfaXNvX2ZyYWdtZW50KHN0cmVhbSwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgY3BwOjp0cmFuc21pdF9pc29fZnJhZ21lbnQoc3RyZWFtLCBsZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIGlmIChmcmVlX2FmdGVyX3RyYW5zbWl0KSB7Ci0gICAgb3NpX2ZyZWUocGFja2V0KTsKLSAgfQotfQotc3RhdGljIHZvaWQgZGlzcGF0Y2hfcmVhc3NlbWJsZWQoQlRfSERSKiBwYWNrZXQpIHsKLSAgLy8gRXZlbnRzIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBkaXNwYXRjaGVkIGJlZm9yZSB0aGlzIHBvaW50Ci0gIENIRUNLKChwYWNrZXQtPmV2ZW50ICYgTVNHX0VWVF9NQVNLKSAhPSBNU0dfSENfVE9fU1RBQ0tfSENJX0VWVCk7Ci0gIENIRUNLKCFzZW5kX2RhdGFfdXB3YXJkcy5pc19udWxsKCkpOwotICBzZW5kX2RhdGFfdXB3YXJkcy5SdW4oRlJPTV9IRVJFLCBwYWNrZXQpOwotfQotc3RhdGljIHZvaWQgZnJhZ21lbnRlcl90cmFuc21pdF9maW5pc2hlZChCVF9IRFIqIHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxfZnJhZ21lbnRzX3NlbnQpIHsKLSAgaWYgKGFsbF9mcmFnbWVudHNfc2VudCkgewotICAgIG9zaV9mcmVlKHBhY2tldCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhpcyBpcyBraW5kIG9mIGEgd2VpcmQgY2FzZSwgc2luY2Ugd2UncmUgZGlzcGF0Y2hpbmcgYSBwYXJ0aWFsbHkgc2VudAotICAgIC8vIHBhY2tldCB1cCB0byBhIGhpZ2hlciBsYXllci4KLSAgICAvLyBUT0RPKHphY2hvdmVyZmxvdyk6IHJld29yayB1cHBlciBsYXllciBzbyB0aGlzIGlzbid0IG5lY2Vzc2FyeS4KLSAgICBzZW5kX2RhdGFfdXB3YXJkcy5SdW4oRlJPTV9IRVJFLCBwYWNrZXQpOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBwYWNrZXRfZnJhZ21lbnRlcl9jYWxsYmFja3NfdCBwYWNrZXRfZnJhZ21lbnRlcl9jYWxsYmFja3MgPSB7Ci0gICAgdHJhbnNtaXRfZnJhZ21lbnQsIGRpc3BhdGNoX3JlYXNzZW1ibGVkLCBmcmFnbWVudGVyX3RyYW5zbWl0X2ZpbmlzaGVkfTsKLQotc3RhdGljIHZvaWQgdHJhbnNtaXRfZG93bndhcmQodWludDE2X3QgdHlwZSwgdm9pZCogcmF3X2RhdGEpIHsKLSAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgIHBhY2tldF9mcmFnbWVudGVyLT5mcmFnbWVudF9hbmRfZGlzcGF0Y2goc3RhdGljX2Nhc3Q8QlRfSERSKj4ocmF3X2RhdGEpKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKS0+Q2FsbCgKLSAgICAgICAgcGFja2V0X2ZyYWdtZW50ZXItPmZyYWdtZW50X2FuZF9kaXNwYXRjaCwKLSAgICAgICAgc3RhdGljX2Nhc3Q8QlRfSERSKj4ocmF3X2RhdGEpKTsKLSAgfQotfQotCi1zdGF0aWMgaGNpX3QgaW50ZXJmYWNlID0gey5zZXRfZGF0YV9jYiA9IHNldF9kYXRhX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNtaXRfY29tbWFuZCA9IHRyYW5zbWl0X2NvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc21pdF9jb21tYW5kX2Z1dHVyZWQgPSB0cmFuc21pdF9jb21tYW5kX2Z1dHVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc21pdF9kb3dud2FyZCA9IHRyYW5zbWl0X2Rvd253YXJkfTsKLQotY29uc3QgaGNpX3QqIGJsdWV0b290aDo6c2hpbTo6aGNpX2xheWVyX2dldF9pbnRlcmZhY2UoKSB7Ci0gIHBhY2tldF9mcmFnbWVudGVyID0gcGFja2V0X2ZyYWdtZW50ZXJfZ2V0X2ludGVyZmFjZSgpOwotICBwYWNrZXRfZnJhZ21lbnRlci0+aW5pdCgmcGFja2V0X2ZyYWdtZW50ZXJfY2FsbGJhY2tzKTsKLSAgcmV0dXJuICZpbnRlcmZhY2U7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpoY2lfb25fcmVzZXRfY29tcGxldGUoKSB7Ci0gIEFTU0VSVChzZW5kX2RhdGFfdXB3YXJkcyk7Ci0gIGlmIChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICA6OnJ1c3Q6OmhjaV9vbl9yZXNldF9jb21wbGV0ZSgpOwotICB9Ci0KLSAgZm9yICh1aW50MTZfdCBldmVudF9jb2RlX3JhdyA9IDA7IGV2ZW50X2NvZGVfcmF3IDwgMHgxMDA7IGV2ZW50X2NvZGVfcmF3KyspIHsKLSAgICBhdXRvIGV2ZW50X2NvZGUgPSBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlPihldmVudF9jb2RlX3Jhdyk7Ci0gICAgaWYgKCFpc192YWxpZF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGV2ZW50X2FscmVhZHlfcmVnaXN0ZXJlZF9pbl9hY2xfbGF5ZXIoZXZlbnRfY29kZSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSBpZiAoZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2NvbnRyb2xsZXJfbGF5ZXIoZXZlbnRfY29kZSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSBpZiAoZXZlbnRfYWxyZWFkeV9yZWdpc3RlcmVkX2luX2hjaV9sYXllcihldmVudF9jb2RlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIGlmIChldmVudF9hbHJlYWR5X3JlZ2lzdGVyZWRfaW5fbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlcihldmVudF9jb2RlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIGlmIChldmVudF9hbHJlYWR5X3JlZ2lzdGVyZWRfaW5fbGVfc2Nhbm5pbmdfbWFuYWdlcihldmVudF9jb2RlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgICAgOjpydXN0OjpyZWdpc3Rlcl9ldmVudChldmVudF9jb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgY3BwOjpyZWdpc3Rlcl9ldmVudChldmVudF9jb2RlKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKHVpbnQxNl90IHN1YmV2ZW50X2NvZGVfcmF3ID0gMDsgc3ViZXZlbnRfY29kZV9yYXcgPCAweDEwMDsKLSAgICAgICBzdWJldmVudF9jb2RlX3JhdysrKSB7Ci0gICAgYXV0byBzdWJldmVudF9jb2RlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZT4oc3ViZXZlbnRfY29kZV9yYXcpOwotICAgIGlmICghaXNfdmFsaWRfc3ViZXZlbnRfY29kZShzdWJldmVudF9jb2RlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzdWJldmVudF9hbHJlYWR5X3JlZ2lzdGVyZWRfaW5fbGVfaGNpX2xheWVyKHN1YmV2ZW50X2NvZGUpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpZiAoYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKSB7Ci0gICAgICA6OnJ1c3Q6OnJlZ2lzdGVyX2xlX2V2ZW50KHN1YmV2ZW50X2NvZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjcHA6OnJlZ2lzdGVyX2xlX2V2ZW50KHN1YmV2ZW50X2NvZGUpOwotICAgIH0KLSAgfQotCi0gIC8vIFRPRE8gaGFuZGxlIEJRUiBldmVudCBpbiBHRAotICBpZiAoIWJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgIGF1dG8gaGFuZGxlciA9IGJsdWV0b290aDo6c2hpbTo6R2V0R2RTaGltSGFuZGxlcigpOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIoKS0+UmVnaXN0ZXJFdmVudEhhbmRsZXIoCi0gICAgICAgIGJsdWV0b290aDo6aGNpOjpWc2VTdWJldmVudENvZGU6OkJRUl9FVkVOVCwKLSAgICAgICAgaGFuZGxlci0+QmluZChjcHA6OnZlbmRvcl9zcGVjaWZpY19ldmVudF9jYWxsYmFjaykpOwotICB9Ci0KLSAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgIDo6cnVzdDo6cmVnaXN0ZXJfZm9yX3NjbygpOwotICB9IGVsc2UgewotICAgIGNwcDo6cmVnaXN0ZXJfZm9yX3NjbygpOwotICB9Ci0KLSAgaWYgKGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgIDo6cnVzdDo6cmVnaXN0ZXJfZm9yX2lzbygpOwotICB9IGVsc2UgewotICAgIGNwcDo6cmVnaXN0ZXJfZm9yX2lzbygpOwotICB9Ci0KLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICA6OnJ1c3Q6OnJlZ2lzdGVyX2Zvcl9hY2woKTsKLSAgfSBlbHNlIHsKLSAgICBjcHA6OnJlZ2lzdGVyX2Zvcl9hY2woKTsKLSAgfQotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6aGNpX29uX3NodXR0aW5nX2Rvd24oKSB7Ci0gIGlmIChibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICA6OnJ1c3Q6Om9uX3NodXR0aW5nX2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICBjcHA6Om9uX3NodXR0aW5nX2Rvd24oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2hjaV9sYXllci5oIGIvbWFpbi9zaGltL2hjaV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWEyOWU5Li4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9oY2lfbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR2Qgc2hpbSBsYXllciB0byBsZWdhY3kgaGNpIGxheWVyIHN0YWNrCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvaGNpX2xheWVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1jb25zdCBoY2lfdCogaGNpX2xheWVyX2dldF9pbnRlcmZhY2UoKTsKLQotdm9pZCBoY2lfb25fcmVzZXRfY29tcGxldGUoKTsKLQotdm9pZCBoY2lfb25fc2h1dHRpbmdfZG93bigpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2hlbHBlcnMuaCBiL21haW4vc2hpbS9oZWxwZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTRiYzcuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2hlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImdkL3BhY2tldC9yYXdfYnVpbGRlci5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9tb2RlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotaW5saW5lIFJhd0FkZHJlc3MgVG9SYXdBZGRyZXNzKGNvbnN0IGhjaTo6QWRkcmVzcyYgYWRkcmVzcykgewotICBSYXdBZGRyZXNzIHJldDsKLSAgcmV0LmFkZHJlc3NbMF0gPSBhZGRyZXNzLmFkZHJlc3NbNV07Ci0gIHJldC5hZGRyZXNzWzFdID0gYWRkcmVzcy5hZGRyZXNzWzRdOwotICByZXQuYWRkcmVzc1syXSA9IGFkZHJlc3MuYWRkcmVzc1szXTsKLSAgcmV0LmFkZHJlc3NbM10gPSBhZGRyZXNzLmFkZHJlc3NbMl07Ci0gIHJldC5hZGRyZXNzWzRdID0gYWRkcmVzcy5hZGRyZXNzWzFdOwotICByZXQuYWRkcmVzc1s1XSA9IGFkZHJlc3MuYWRkcmVzc1swXTsKLSAgcmV0dXJuIHJldDsKLX0KLQotaW5saW5lIGhjaTo6QWRkcmVzcyBUb0dkQWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGhjaTo6QWRkcmVzcyByZXQ7Ci0gIHJldC5hZGRyZXNzWzBdID0gYWRkcmVzcy5hZGRyZXNzWzVdOwotICByZXQuYWRkcmVzc1sxXSA9IGFkZHJlc3MuYWRkcmVzc1s0XTsKLSAgcmV0LmFkZHJlc3NbMl0gPSBhZGRyZXNzLmFkZHJlc3NbM107Ci0gIHJldC5hZGRyZXNzWzNdID0gYWRkcmVzcy5hZGRyZXNzWzJdOwotICByZXQuYWRkcmVzc1s0XSA9IGFkZHJlc3MuYWRkcmVzc1sxXTsKLSAgcmV0LmFkZHJlc3NbNV0gPSBhZGRyZXNzLmFkZHJlc3NbMF07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWlubGluZSBoY2k6OkFkZHJlc3NXaXRoVHlwZSBUb0FkZHJlc3NXaXRoVHlwZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBsZWdhY3lfYWRkcmVzcywgY29uc3QgdEJMRV9BRERSX1RZUEUmIGxlZ2FjeV90eXBlKSB7Ci0gIGhjaTo6QWRkcmVzcyBhZGRyZXNzID0gVG9HZEFkZHJlc3MobGVnYWN5X2FkZHJlc3MpOwotCi0gIGhjaTo6QWRkcmVzc1R5cGUgdHlwZTsKLSAgaWYgKGxlZ2FjeV90eXBlID09IEJMRV9BRERSX1BVQkxJQykKLSAgICB0eXBlID0gaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTOwotICBlbHNlIGlmIChsZWdhY3lfdHlwZSA9PSBCTEVfQUREUl9SQU5ET00pCi0gICAgdHlwZSA9IGhjaTo6QWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUzsKLSAgZWxzZSBpZiAobGVnYWN5X3R5cGUgPT0gQkxFX0FERFJfUFVCTElDX0lEKQotICAgIHR5cGUgPSBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTUzsKLSAgZWxzZSBpZiAobGVnYWN5X3R5cGUgPT0gQkxFX0FERFJfUkFORE9NX0lEKQotICAgIHR5cGUgPSBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fSURFTlRJVFlfQUREUkVTUzsKLSAgZWxzZSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiQmFkIGFkZHJlc3MgdHlwZSAlMDJ4IiwgbGVnYWN5X3R5cGUpOwotICAgIHJldHVybiBoY2k6OkFkZHJlc3NXaXRoVHlwZXthZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9OwotICB9Ci0KLSAgcmV0dXJuIGhjaTo6QWRkcmVzc1dpdGhUeXBle2FkZHJlc3MsIHR5cGV9OwotfQotCi1pbmxpbmUgaGNpOjpBZGRyZXNzV2l0aFR5cGUgVG9BZGRyZXNzV2l0aFR5cGVGcm9tTGVnYWN5KAotICAgIGNvbnN0IHRCTEVfQkRfQUREUiYgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIHJldHVybiBUb0FkZHJlc3NXaXRoVHlwZShsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUuYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlLnR5cGUpOwotfQotCi1pbmxpbmUgdEJMRV9CRF9BRERSIFRvTGVnYWN5QWRkcmVzc1dpdGhUeXBlKAotICAgIGNvbnN0IGhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzX3dpdGhfdHlwZSkgewotICB0QkxFX0JEX0FERFIgbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlOwotICBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUuYmRhID0gVG9SYXdBZGRyZXNzKGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3MoKSk7Ci0KLSAgaWYgKGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCkgPT0KLSAgICAgIGhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUykgewotICAgIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlID0gQkxFX0FERFJfUFVCTElDOwotICB9IGVsc2UgaWYgKGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCkgPT0KLSAgICAgICAgICAgICBoY2k6OkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1MpIHsKLSAgICBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUudHlwZSA9IEJMRV9BRERSX1JBTkRPTTsKLSAgfSBlbHNlIGlmIChhZGRyZXNzX3dpdGhfdHlwZS5HZXRBZGRyZXNzVHlwZSgpID09Ci0gICAgICAgICAgICAgaGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0lERU5USVRZX0FERFJFU1MpIHsKLSAgICBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUudHlwZSA9IEJMRV9BRERSX1BVQkxJQ19JRDsKLSAgfSBlbHNlIGlmIChhZGRyZXNzX3dpdGhfdHlwZS5HZXRBZGRyZXNzVHlwZSgpID09Ci0gICAgICAgICAgICAgaGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0lERU5USVRZX0FERFJFU1MpIHsKLSAgICBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUudHlwZSA9IEJMRV9BRERSX1JBTkRPTV9JRDsKLSAgfSBlbHNlIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyBCYWQgYWRkcmVzcyB0eXBlICUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFkZHJlc3Nfd2l0aF90eXBlLkdldEFkZHJlc3NUeXBlKCkpKTsKLSAgICBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUudHlwZSA9IEJMRV9BRERSX1BVQkxJQzsKLSAgfQotICByZXR1cm4gbGVnYWN5X2FkZHJlc3Nfd2l0aF90eXBlOwotfQotCi1pbmxpbmUgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPiBNYWtlVW5pcXVlUGFja2V0KAotICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4sIGJvb2wgaXNfZmx1c2hhYmxlKSB7Ci0gIGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyIGJ1aWxkZXI7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzKGRhdGEsIGRhdGEgKyBsZW4pOwotICBhdXRvIHBheWxvYWQgPSBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPigpOwotICBwYXlsb2FkLT5BZGRPY3RldHMoYnl0ZXMpOwotICBwYXlsb2FkLT5TZXRGbHVzaGFibGUoaXNfZmx1c2hhYmxlKTsKLSAgcmV0dXJuIHBheWxvYWQ7Ci19Ci0KLWlubGluZSBCVF9IRFIqIE1ha2VMZWdhY3lCdEhkclBhY2tldCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpoY2k6OlBhY2tldFZpZXc8Ymx1ZXRvb3RoOjpoY2k6OmtMaXR0bGVFbmRpYW4+PgotICAgICAgICBwYWNrZXQsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHByZWFtYmxlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldF92ZWN0b3IocGFja2V0LT5iZWdpbigpLCBwYWNrZXQtPmVuZCgpKTsKLSAgQlRfSERSKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxCVF9IRFIqPigKLSAgICAgIG9zaV9jYWxsb2MocGFja2V0X3ZlY3Rvci5zaXplKCkgKyBwcmVhbWJsZS5zaXplKCkgKyBzaXplb2YoQlRfSERSKSkpOwotICBzdGQ6OmNvcHkocHJlYW1ibGUuYmVnaW4oKSwgcHJlYW1ibGUuZW5kKCksIGJ1ZmZlci0+ZGF0YSk7Ci0gIHN0ZDo6Y29weShwYWNrZXRfdmVjdG9yLmJlZ2luKCksIHBhY2tldF92ZWN0b3IuZW5kKCksCi0gICAgICAgICAgICBidWZmZXItPmRhdGEgKyBwcmVhbWJsZS5zaXplKCkpOwotICBidWZmZXItPmxlbiA9IHByZWFtYmxlLnNpemUoKSArIHBhY2tldF92ZWN0b3Iuc2l6ZSgpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1pbmxpbmUgdEhDSV9ST0xFIFRvTGVnYWN5Um9sZShoY2k6OlJvbGUgcm9sZSkgewotICByZXR1cm4gdG9faGNpX3JvbGUoc3RhdGljX2Nhc3Q8dWludDhfdD4ocm9sZSkpOwotfQotCi1pbmxpbmUgaGNpOjpSb2xlIFRvSGNpUm9sZShjb25zdCBoY2lfcm9sZV90JiByb2xlKSB7Ci0gIHN3aXRjaCAocm9sZSkgewotICAgIGNhc2UgSENJX1JPTEVfQ0VOVFJBTDoKLSAgICAgIHJldHVybiBoY2k6OlJvbGU6OkNFTlRSQUw7Ci0gICAgY2FzZSBIQ0lfUk9MRV9QRVJJUEhFUkFMOgotICAgICAgcmV0dXJuIGhjaTo6Um9sZTo6UEVSSVBIRVJBTDsKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUX0xPRyhmYWxzZSwgIlVuYWJsZSB0byBkZXRlcm1pbmUgbGVnYWN5IHJvbGU6JXUiLCByb2xlKTsKLSAgfQotfQotCi1pbmxpbmUgdEhDSV9TVEFUVVMgVG9MZWdhY3lIY2lFcnJvckNvZGUoY29uc3QgaGNpOjpFcnJvckNvZGUmIHJlYXNvbikgewotICBzd2l0Y2ggKHJlYXNvbikgewotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlNVQ0NFU1M6Ci0gICAgICByZXR1cm4gSENJX1NVQ0NFU1M7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6VU5LTk9XTl9IQ0lfQ09NTUFORDoKLSAgICAgIHJldHVybiBIQ0lfRVJSX0lMTEVHQUxfQ09NTUFORDsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT046Ci0gICAgICByZXR1cm4gSENJX0VSUl9OT19DT05ORUNUSU9OOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OkhBUkRXQVJFX0ZBSUxVUkU6Ci0gICAgICByZXR1cm4gSENJX0VSUl9IV19GQUlMVVJFOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlBBR0VfVElNRU9VVDoKLSAgICAgIHJldHVybiBIQ0lfRVJSX1BBR0VfVElNRU9VVDsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpBVVRIRU5USUNBVElPTl9GQUlMVVJFOgotICAgICAgcmV0dXJuIEhDSV9FUlJfQVVUSF9GQUlMVVJFOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlBJTl9PUl9LRVlfTUlTU0lORzoKLSAgICAgIHJldHVybiBIQ0lfRVJSX0tFWV9NSVNTSU5HOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6Ok1FTU9SWV9DQVBBQ0lUWV9FWENFRURFRDoKLSAgICAgIHJldHVybiBIQ0lfRVJSX01FTU9SWV9GVUxMOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OkNPTk5FQ1RJT05fVElNRU9VVDoKLSAgICAgIHJldHVybiBIQ0lfRVJSX0NPTk5FQ1RJT05fVE9VVDsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX0xJTUlUX0VYQ0VFREVEOgotICAgICAgcmV0dXJuIEhDSV9FUlJfTUFYX05VTV9PRl9DT05ORUNUSU9OUzsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpTWU5DSFJPTk9VU19DT05ORUNUSU9OX0xJTUlUX0VYQ0VFREVEOgotICAgICAgcmV0dXJuIEhDSV9FUlJfTUFYX05VTV9PRl9TQ09TOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OkNPTk5FQ1RJT05fQUxSRUFEWV9FWElTVFM6Ci0gICAgICByZXR1cm4gSENJX0VSUl9DT05ORUNUSU9OX0VYSVNUUzsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ6Ci0gICAgICByZXR1cm4gSENJX0VSUl9DT01NQU5EX0RJU0FMTE9XRUQ7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6Q09OTkVDVElPTl9SRUpFQ1RFRF9MSU1JVEVEX1JFU09VUkNFUzoKLSAgICAgIHJldHVybiBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUzsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1JFSkVDVEVEX1NFQ1VSSVRZX1JFQVNPTlM6Ci0gICAgICByZXR1cm4gSENJX0VSUl9IT1NUX1JFSkVDVF9TRUNVUklUWTsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpDT05ORUNUSU9OX1JFSkVDVEVEX1VOQUNDRVBUQUJMRV9CRF9BRERSOgotICAgICAgcmV0dXJuIEhDSV9FUlJfSE9TVF9SRUpFQ1RfREVWSUNFOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OkNPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQ6Ci0gICAgICByZXR1cm4gSENJX0VSUl9IT1NUX1RJTUVPVVQ7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6VU5TVVBPUlRFRF9GRUFUVVJFX09SX1BBUkFNRVRFUl9WQUxVRToKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oCi0gICAgICAgICAgaGNpOjpFcnJvckNvZGU6OlVOU1VQT1JURURfRkVBVFVSRV9PUl9QQVJBTUVURVJfVkFMVUUpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzoKLSAgICAgIHJldHVybiBIQ0lfRVJSX0lMTEVHQUxfUEFSQU1FVEVSX0ZNVDsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpSRU1PVEVfVVNFUl9URVJNSU5BVEVEX0NPTk5FQ1RJT046Ci0gICAgICByZXR1cm4gSENJX0VSUl9QRUVSX1VTRVI7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6UkVNT1RFX0RFVklDRV9URVJNSU5BVEVEX0NPTk5FQ1RJT05fTE9XX1JFU09VUkNFUzoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oCi0gICAgICAgICAgaGNpOjpFcnJvckNvZGU6OlJFTU9URV9ERVZJQ0VfVEVSTUlOQVRFRF9DT05ORUNUSU9OX0xPV19SRVNPVVJDRVMpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlJFTU9URV9ERVZJQ0VfVEVSTUlOQVRFRF9DT05ORUNUSU9OX1BPV0VSX09GRjoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oCi0gICAgICAgICAgaGNpOjpFcnJvckNvZGU6OlJFTU9URV9ERVZJQ0VfVEVSTUlOQVRFRF9DT05ORUNUSU9OX1BPV0VSX09GRik7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6Q09OTkVDVElPTl9URVJNSU5BVEVEX0JZX0xPQ0FMX0hPU1Q6Ci0gICAgICByZXR1cm4gSENJX0VSUl9DT05OX0NBVVNFX0xPQ0FMX0hPU1Q7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6UkVQRUFURURfQVRURU1QVFM6Ci0gICAgICByZXR1cm4gSENJX0VSUl9SRVBFQVRFRF9BVFRFTVBUUzsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpQQUlSSU5HX05PVF9BTExPV0VEOgotICAgICAgcmV0dXJuIEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRDsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpVTktOT1dOX0xNUF9QRFU6Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KGhjaTo6RXJyb3JDb2RlOjpVTktOT1dOX0xNUF9QRFUpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlVOU1VQUE9SVEVEX1JFTU9URV9PUl9MTVBfRkVBVFVSRToKLSAgICAgIHJldHVybiBIQ0lfRVJSX1VOU1VQUE9SVEVEX1JFTV9GRUFUVVJFOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlNDT19PRkZTRVRfUkVKRUNURUQ6Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KGhjaTo6RXJyb3JDb2RlOjpTQ09fT0ZGU0VUX1JFSkVDVEVEKTsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpTQ09fSU5URVJWQUxfUkVKRUNURUQ6Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KGhjaTo6RXJyb3JDb2RlOjpTQ09fSU5URVJWQUxfUkVKRUNURUQpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlNDT19BSVJfTU9ERV9SRUpFQ1RFRDoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oaGNpOjpFcnJvckNvZGU6OlNDT19BSVJfTU9ERV9SRUpFQ1RFRCk7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6SU5WQUxJRF9MTVBfT1JfTExfUEFSQU1FVEVSUzoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oCi0gICAgICAgICAgaGNpOjpFcnJvckNvZGU6OklOVkFMSURfTE1QX09SX0xMX1BBUkFNRVRFUlMpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlVOU1BFQ0lGSUVEX0VSUk9SOgotICAgICAgcmV0dXJuIEhDSV9FUlJfVU5TUEVDSUZJRUQ7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6VU5TVVBQT1JURURfTE1QX09SX0xMX1BBUkFNRVRFUjoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oCi0gICAgICAgICAgaGNpOjpFcnJvckNvZGU6OlVOU1VQUE9SVEVEX0xNUF9PUl9MTF9QQVJBTUVURVIpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OlJPTEVfQ0hBTkdFX05PVF9BTExPV0VEOgotICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihoY2k6OkVycm9yQ29kZTo6Uk9MRV9DSEFOR0VfTk9UX0FMTE9XRUQpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OkxJTktfTEFZRVJfQ09MTElTSU9OOgotICAgICAgcmV0dXJuIEhDSV9FUlJfTE1QX0VSUl9UUkFOU19DT0xMSVNJT047Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6RU5DUllQVElPTl9NT0RFX05PVF9BQ0NFUFRBQkxFOgotICAgICAgcmV0dXJuIEhDSV9FUlJfRU5DUllfTU9ERV9OT1RfQUNDRVBUQUJMRTsKLSAgICBjYXNlIGhjaTo6RXJyb3JDb2RlOjpST0xFX1NXSVRDSF9GQUlMRUQ6Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KGhjaTo6RXJyb3JDb2RlOjpST0xFX1NXSVRDSF9GQUlMRUQpOwotICAgIGNhc2UgaGNpOjpFcnJvckNvZGU6OkNPTlRST0xMRVJfQlVTWToKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oaGNpOjpFcnJvckNvZGU6OkNPTlRST0xMRVJfQlVTWSk7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6Q09OTkVDVElPTl9GQUlMRURfRVNUQUJMSVNITUVOVDoKLSAgICAgIHJldHVybiBIQ0lfRVJSX0NPTk5fRkFJTEVEX0VTVEFCTElTSE1FTlQ7Ci0gICAgY2FzZSBoY2k6OkVycm9yQ29kZTo6U1RBVFVTX1VOS05PV046Ci0gICAgICByZXR1cm4gSENJX0VSUl9VTkRFRklORUQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1JFQVNPTj4ocmVhc29uKTsKLSAgfQotfQotCi1pbmxpbmUgdEhDSV9NT0RFIFRvTGVnYWN5SGNpTW9kZShjb25zdCBoY2k6Ok1vZGUmIG1vZGUpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHRIQ0lfTU9ERT4obW9kZSk7Ci19Ci0KLWlubGluZSBoY2k6OkRpc2Nvbm5lY3RSZWFzb24gVG9EaXNjb25uZWN0UmVhc29uRnJvbUxlZ2FjeSgKLSAgICBjb25zdCB0SENJX1NUQVRVUyYgcmVhc29uKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxoY2k6OkRpc2Nvbm5lY3RSZWFzb24+KHJlYXNvbik7Ci19Ci0KLWlubGluZSBib29sIElzUGFja2V0Rmx1c2hhYmxlKGNvbnN0IEJUX0hEUiogcF9idWYpIHsKLSAgQVNTRVJUKHBfYnVmICE9IG51bGxwdHIpOwotICByZXR1cm4gVG9QYWNrZXREYXRhPGNvbnN0IEhjaURhdGFQcmVhbWJsZT4ocF9idWYpLT5Jc0ZsdXNoYWJsZSgpOwotfQotCi1uYW1lc3BhY2UgZGVidWcgewotCi1pbmxpbmUgdm9pZCBEdW1wQnRIZHIoY29uc3QgQlRfSERSKiBwX2J1ZiwgY29uc3QgY2hhciogdG9rZW4pIHsKLSAgdWludDE2X3QgbGVuID0gcF9idWYtPmxlbjsKLSAgY2hhciBidWZbMjU1XTsKLSAgY29uc3QgdWludDhfdCogZGF0YSA9IHBfYnVmLT5kYXRhICsgcF9idWYtPm9mZnNldDsKLSAgaW50IGNudCA9IDA7Ci0gIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotICAgIGNoYXIqIHBidWYgPSBidWY7Ci0gICAgcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJsZW46JTV1ICU1ZDogIiwgcF9idWYtPmxlbiwgY250KTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyBqKyssIC0tbGVuLCBkYXRhKyssIGNudCsrKSB7Ci0gICAgICBpZiAobGVuID09IDApIGJyZWFrOwotICAgICAgcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIweCUwMnggIiwgKmRhdGEpOwotICAgIH0KLSAgICBMT0dfREVCVUcoIiVzICVzIiwgdG9rZW4sIGJ1Zik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGRlYnVnCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vbDJjX2FwaS5jYyBiL21haW4vc2hpbS9sMmNfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJkODNhLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9sMmNfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NoaW1fbDJjYXAiCi0KLSNpbmNsdWRlICJtYWluL3NoaW0vbDJjX2FwaS5oIgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9kbV9hY2wuaCIKLSNpbmNsdWRlICJnZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmgiCi0jaW5jbHVkZSAiZ2QvbDJjYXAvbGUvbDJjYXBfbGVfbW9kdWxlLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvbG9nLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvcXVldWUuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYWNsX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9idG0uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGVscGVycy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zdGFjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibGVfYWNsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zY29faGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1leHRlcm4gdm9pZCBnYXR0X25vdGlmeV9jb25uX3VwZGF0ZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGUsIHVpbnQxNl90IGludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci1leHRlcm4gdm9pZCBnYXR0X25vdGlmeV9waHlfdXBkYXRlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHkpOwotCi12b2lkIHByb2Nlc3Nfc3NyX2V2ZW50KHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfdHhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfcnhfbGF0KTsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci0KLXVzaW5nIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGU7Ci11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjpsMmNhcDsKLQotLy8gQ2xhc3NpYyBEeW5hbWljIENoYW5uZWwgU2hpbSBIZWxwZXIKLQotbmFtZXNwYWNlIHsKLXVpbnQxNl90IGNsYXNzaWNfY2lkX3Rva2VuX2NvdW50ZXJfID0gMHg0MTsKLWNvbnN0ZXhwciB1aW50NjRfdCBrQnJFZHJOb3RTdXBwb3J0ZWRNYXNrID0gMHgwMDAwMDAyMDAwMDAwMDAwOyAgICAgIC8vIEJpdCAzNwotY29uc3RleHByIHVpbnQ2NF90IGtMZVN1cHBvcnRlZENvbnRyb2xsZXJNYXNrID0gMHgwMDAwMDA0MDAwMDAwMDAwOyAgLy8gQml0IDM4Ci1jb25zdGV4cHIgdWludDY0X3Qga0xlU3VwcG9ydGVkSG9zdE1hc2sgPSAweDAwMDAwMDAwMDAwMDAwMDI7ICAgICAgICAvLyBCaXQgMQotCi1zdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QgLyogdG9rZW4gKi8sIHVpbnQxNl90IC8qIHBzbSAqLz4KLSAgICBjbGFzc2ljX2NpZF90b2tlbl90b19jaGFubmVsX21hcF87Ci0KLXVpbnQxNl90IGFkZF9jbGFzc2ljX2NpZF90b2tlbl9lbnRyeSh1aW50MTZfdCBwc20pIHsKLSAgdWludDE2X3QgbmV3X3Rva2VuID0gY2xhc3NpY19jaWRfdG9rZW5fY291bnRlcl87Ci0gIGNsYXNzaWNfY2lkX3Rva2VuX3RvX2NoYW5uZWxfbWFwX1tuZXdfdG9rZW5dID0gcHNtOwotICBjbGFzc2ljX2NpZF90b2tlbl9jb3VudGVyXysrOwotICBpZiAoY2xhc3NpY19jaWRfdG9rZW5fY291bnRlcl8gPT0gMCkgY2xhc3NpY19jaWRfdG9rZW5fY291bnRlcl8gPSAweDQxOwotICByZXR1cm4gbmV3X3Rva2VuOwotfQotCi12b2lkIHJlbW92ZV9jbGFzc2ljX2NpZF90b2tlbl9lbnRyeSh1aW50MTZfdCBjaWRfdG9rZW4pIHsKLSAgY2xhc3NpY19jaWRfdG9rZW5fdG9fY2hhbm5lbF9tYXBfLmVyYXNlKGNpZF90b2tlbik7Ci19Ci0KLXZvaWQgcmVtb3ZlX2NsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcih1aW50MTZfdCBwc20pOwotCi1zdHJ1Y3QgQ2xhc3NpY0R5bmFtaWNDaGFubmVsSGVscGVyIHsKLSAgQ2xhc3NpY0R5bmFtaWNDaGFubmVsSGVscGVyKHVpbnQxNl90IHBzbSwgdEwyQ0FQX0FQUExfSU5GTyBhcHBsX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5KQotICAgICAgOiBwc21fKHBzbSksIGFwcGxfaW5mb18oYXBwbF9pbmZvKSwgY29uZmlnXyhjb25maWcpLCBwb2xpY3lfKHBvbGljeSkge30KLQotICB1aW50MTZfdCBwc21fOwotICB0TDJDQVBfQVBQTF9JTkZPIGFwcGxfaW5mb187Ci0gIGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWdfOwotICBjbGFzc2ljOjpTZWN1cml0eVBvbGljeSBwb2xpY3lfOwotCi0gIHZvaWQgUmVnaXN0ZXIoKSB7Ci0gICAgR2V0TDJjYXBDbGFzc2ljTW9kdWxlKCktPkdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpLT5SZWdpc3RlclNlcnZpY2UoCi0gICAgICAgIHBzbV8sIGNvbmZpZ18sIHBvbGljeV8sCi0gICAgICAgIEdldEdkU2hpbUhhbmRsZXIoKS0+QmluZE9uY2VPbigKLSAgICAgICAgICAgIHRoaXMsICZDbGFzc2ljRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSksCi0gICAgICAgIEdldEdkU2hpbUhhbmRsZXIoKS0+QmluZE9uKAotICAgICAgICAgICAgdGhpcywgJkNsYXNzaWNEeW5hbWljQ2hhbm5lbEhlbHBlcjo6b25fY2hhbm5lbF9vcGVuLCAwKSk7Ci0gIH0KLQotICB2b2lkIG9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSgKLSAgICAgIGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0IHJlc3VsdCwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2U+IHNlcnZpY2UpIHsKLSAgICBpZiAocmVzdWx0ICE9IGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJDaGFubmVsIGlzIG5vdCByZWdpc3RlcmVkLiBwc209IiA8PCArcHNtXyA8PCAoaW50KXJlc3VsdDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2hhbm5lbF9zZXJ2aWNlXyA9IHN0ZDo6bW92ZShzZXJ2aWNlKTsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbFNlcnZpY2U+IGNoYW5uZWxfc2VydmljZV8gPSBudWxscHRyOwotCi0gIHZvaWQgQ29ubmVjdCh1aW50MTZfdCBjaWRfdG9rZW4sIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgZGV2aWNlKSB7Ci0gICAgaWYgKGNoYW5uZWxfc2VydmljZV8gPT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbml0aWF0ZWRfYnlfdXNfW2NpZF90b2tlbl0gPSB0cnVlOwotICAgIEdldEwyY2FwQ2xhc3NpY01vZHVsZSgpLT5HZXREeW5hbWljQ2hhbm5lbE1hbmFnZXIoKS0+Q29ubmVjdENoYW5uZWwoCi0gICAgICAgIGRldmljZS5HZXRBZGRyZXNzKCksIGNvbmZpZ18sIHBzbV8sCi0gICAgICAgIEdldEdkU2hpbUhhbmRsZXIoKS0+QmluZE9uKAotICAgICAgICAgICAgdGhpcywgJkNsYXNzaWNEeW5hbWljQ2hhbm5lbEhlbHBlcjo6b25fY2hhbm5lbF9vcGVuLCBjaWRfdG9rZW4pLAotICAgICAgICBHZXRHZFNoaW1IYW5kbGVyKCktPkJpbmRPbmNlT24oCi0gICAgICAgICAgICB0aGlzLCAmQ2xhc3NpY0R5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9vdXRnb2luZ19jb25uZWN0aW9uX2ZhaWwpKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdCh1aW50MTZfdCBjaWRfdG9rZW4pIHsKLSAgICBpZiAoY2hhbm5lbF9zZXJ2aWNlXyA9PSBudWxscHRyKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChjaGFubmVsc18uY291bnQoY2lkX3Rva2VuKSA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYW5uZWxzX1tjaWRfdG9rZW5dLT5DbG9zZSgpOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyKCkgewotICAgIGlmIChjaGFubmVsX3NlcnZpY2VfICE9IG51bGxwdHIpIHsKLSAgICAgIGNoYW5uZWxfc2VydmljZV8tPlVucmVnaXN0ZXIoR2V0R2RTaGltSGFuZGxlcigpLT5CaW5kT25jZU9uKAotICAgICAgICAgIHRoaXMsICZDbGFzc2ljRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX3VucmVnaXN0ZXJlZCkpOwotICAgICAgY2hhbm5lbF9zZXJ2aWNlXyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvbl91bnJlZ2lzdGVyZWQoKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBjaGFubmVsc18pIHsKLSAgICAgIGRldmljZS5zZWNvbmQtPkNsb3NlKCk7Ci0gICAgfQotICAgIHJlbW92ZV9jbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXIocHNtXyk7Ci0gIH0KLQotICB2b2lkIG9uX2NoYW5uZWxfY2xvc2UodWludDE2X3QgY2lkX3Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkVycm9yQ29kZSBlcnJvcl9jb2RlKSB7Ci0gICAgY2hhbm5lbF9lbnF1ZXVlX2J1ZmZlcl9bY2lkX3Rva2VuXSA9IG51bGxwdHI7Ci0gICAgY2hhbm5lbF9lbnF1ZXVlX2J1ZmZlcl8uZXJhc2UoY2lkX3Rva2VuKTsKLSAgICBjaGFubmVsc19bY2lkX3Rva2VuXS0+R2V0UXVldWVVcEVuZCgpLT5VbnJlZ2lzdGVyRGVxdWV1ZSgpOwotICAgIGNoYW5uZWxzXy5lcmFzZShjaWRfdG9rZW4pOwotICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChhcHBsX2luZm9fLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZF90b2tlbiwgZmFsc2UpKTsKLQotICAgIHJlbW92ZV9jbGFzc2ljX2NpZF90b2tlbl9lbnRyeShjaWRfdG9rZW4pOwotICAgIGluaXRpYXRlZF9ieV91c18uZXJhc2UoY2lkX3Rva2VuKTsKLQotICAgIGlmIChjaGFubmVsX3NlcnZpY2VfID09IG51bGxwdHIgJiYgY2hhbm5lbHNfLmVtcHR5KCkpIHsKLSAgICAgIC8vIFRyeSBhZ2FpbgotICAgICAgTDJDQV9EZXJlZ2lzdGVyKHBzbV8pOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fY2hhbm5lbF9vcGVuKHVpbnQxNl90IGNpZF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsPiBjaGFubmVsKSB7Ci0gICAgYXV0byBkZXZpY2UgPSBjaGFubmVsLT5HZXREZXZpY2UoKTsKLSAgICBhdXRvIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhkZXZpY2UuR2V0QWRkcmVzcygpKTsKLSAgICBib29sIGluaXRpYXRvcl9sb2NhbCA9IChjaWRfdG9rZW4gIT0gMCk7Ci0gICAgaWYgKGNpZF90b2tlbiA9PSAwKSB7Ci0gICAgICBjaWRfdG9rZW4gPSBhZGRfY2xhc3NpY19jaWRfdG9rZW5fZW50cnkocHNtXyk7Ci0gICAgfQotCi0gICAgY2hhbm5lbC0+UmVnaXN0ZXJPbkNsb3NlQ2FsbGJhY2soR2V0R2RTaGltSGFuZGxlcigpLT5CaW5kT25jZU9uKAotICAgICAgICB0aGlzLCAmQ2xhc3NpY0R5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9jaGFubmVsX2Nsb3NlLCBjaWRfdG9rZW4pKTsKLQotICAgIGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfW2NpZF90b2tlbl0gPSBzdGQ6Om1ha2VfdW5pcXVlPAotICAgICAgICBibHVldG9vdGg6Om9zOjpFbnF1ZXVlQnVmZmVyPGJsdWV0b290aDo6cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+KAotICAgICAgICBjaGFubmVsLT5HZXRRdWV1ZVVwRW5kKCkpOwotCi0gICAgaWYgKGluaXRpYXRvcl9sb2NhbCkgewotICAgICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGFwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdENmbV9DYiwgY2lkX3Rva2VuLCAwKSk7Ci0KLSAgICAgIHRMMkNBUF9DRkdfSU5GTyBjZmdfaW5mb3t9OwotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGFwcGxfaW5mb18ucEwyQ0FfQ29uZmlnQ2ZtX0NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZF90b2tlbiwgTDJDQVBfSU5JVElBVE9SX0xPQ0FMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmNmZ19pbmZvKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoYXBwbF9pbmZvXy5wTDJDQV9Db25uZWN0SW5kX0NiID09IG51bGxwdHIpIHsKLSAgICAgICAgRGlzY29ubmVjdChjaWRfdG9rZW4pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYXBwbF9pbmZvXy5wTDJDQV9Db25uZWN0SW5kX0NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGNpZF90b2tlbiwgcHNtXywgMCkpOwotCi0gICAgICB0TDJDQVBfQ0ZHX0lORk8gY2ZnX2luZm97fTsKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChhcHBsX2luZm9fLnBMMkNBX0NvbmZpZ0NmbV9DYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRfdG9rZW4sIEwyQ0FQX0lOSVRJQVRPUl9MT0NBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZjZmdfaW5mbykpKTsKLSAgICB9Ci0KLSAgICBjaGFubmVsLT5HZXRRdWV1ZVVwRW5kKCktPlJlZ2lzdGVyRGVxdWV1ZSgKLSAgICAgICAgR2V0R2RTaGltSGFuZGxlcigpLAotICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6QmluZCgmQ2xhc3NpY0R5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9pbmNvbWluZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkX3Rva2VuKSk7Ci0KLSAgICBjaGFubmVsc19bY2lkX3Rva2VuXSA9IHN0ZDo6bW92ZShjaGFubmVsKTsKLSAgfQotCi0gIHZvaWQgb25faW5jb21pbmdfZGF0YSh1aW50MTZfdCBjaWRfdG9rZW4pIHsKLSAgICBhdXRvIGNoYW5uZWwgPSBjaGFubmVsc18uZmluZChjaWRfdG9rZW4pOwotICAgIGlmIChjaGFubmVsID09IGNoYW5uZWxzXy5lbmQoKSkgewotICAgICAgTE9HX0VSUk9SKCJDaGFubmVsIGlzIG5vdCBvcGVuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gcGFja2V0ID0gY2hhbm5lbC0+c2Vjb25kLT5HZXRRdWV1ZVVwRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfdmVjdG9yKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0gICAgQlRfSERSKiBidWZmZXIgPQotICAgICAgICBzdGF0aWNfY2FzdDxCVF9IRFIqPihvc2lfY2FsbG9jKHBhY2tldF92ZWN0b3Iuc2l6ZSgpICsgc2l6ZW9mKEJUX0hEUikpKTsKLSAgICBzdGQ6OmNvcHkocGFja2V0X3ZlY3Rvci5iZWdpbigpLCBwYWNrZXRfdmVjdG9yLmVuZCgpLCBidWZmZXItPmRhdGEpOwotICAgIGJ1ZmZlci0+bGVuID0gcGFja2V0X3ZlY3Rvci5zaXplKCk7Ci0gICAgaWYgKGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChhcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IsIGNpZF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGJ1ZmZlcikpKSAhPQotICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgb3NpX2ZyZWUoYnVmZmVyKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9uX291dGdvaW5nX2Nvbm5lY3Rpb25fZmFpbCgKLSAgICAgIGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsTWFuYWdlcjo6Q29ubmVjdGlvblJlc3VsdCByZXN1bHQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJPdXRnb2luZyBjb25uZWN0aW9uIGZhaWxlZDogIgotICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQuY29ubmVjdGlvbl9yZXN1bHRfY29kZSk7Ci0gIH0KLQotICBib29sIHNlbmQodWludDE2X3QgY2lkLAotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4gcGFja2V0KSB7Ci0gICAgYXV0byBidWZmZXIgPSBjaGFubmVsX2VucXVldWVfYnVmZmVyXy5maW5kKGNpZCk7Ci0gICAgaWYgKGJ1ZmZlciA9PSBjaGFubmVsX2VucXVldWVfYnVmZmVyXy5lbmQoKSB8fCBidWZmZXItPnNlY29uZCA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJDaGFubmVsIGlzIG5vdCBvcGVuIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYnVmZmVyLT5zZWNvbmQtPkVucXVldWUoc3RkOjptb3ZlKHBhY2tldCksIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB1aW50MTZfdCBHZXRSZW1vdGVDaWQodWludDE2X3QgY2lkKSB7Ci0gICAgYXV0byBjaGFubmVsID0gY2hhbm5lbHNfLmZpbmQoY2lkKTsKLSAgICBpZiAoY2hhbm5lbCA9PSBjaGFubmVsc18uZW5kKCkpIHsKLSAgICAgIExPR19FUlJPUigiQ2hhbm5lbCBpcyBub3Qgb3BlbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBjaGFubmVsLT5zZWNvbmQtPkhBQ0tfR2V0UmVtb3RlQ2lkKCk7Ci0gIH0KLQotICBib29sIFNldENoYW5uZWxUeFByaW9yaXR5KHVpbnQxNl90IGNpZCwgYm9vbCBoaWdoX3ByaW9yaXR5KSB7Ci0gICAgYXV0byBjaGFubmVsID0gY2hhbm5lbHNfLmZpbmQoY2lkKTsKLSAgICBpZiAoY2hhbm5lbCA9PSBjaGFubmVsc18uZW5kKCkpIHsKLSAgICAgIExPR19FUlJPUigiQ2hhbm5lbCBpcyBub3Qgb3BlbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjaGFubmVsLT5zZWNvbmQtPkhBQ0tfU2V0Q2hhbm5lbFR4UHJpb3JpdHkoaGlnaF9wcmlvcml0eSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIEZsdXNoQ2hhbm5lbCh1aW50MTZfdCBjaWQpIHsKLSAgICBhdXRvIGJ1ZmZlciA9IGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfLmZpbmQoY2lkKTsKLSAgICBpZiAoYnVmZmVyID09IGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfLmVuZCgpKSB7Ci0gICAgICBMT0dfRVJST1IoIkNoYW5uZWwgaXMgbm90IG9wZW4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYnVmZmVyLT5zZWNvbmQtPkNsZWFyKCk7Ci0gIH0KLQotICB1aW50MTZfdCBHZXROdW1CdWZmZXJlZFBhY2tldHModWludDE2X3QgY2lkKSB7Ci0gICAgYXV0byBidWZmZXIgPSBjaGFubmVsX2VucXVldWVfYnVmZmVyXy5maW5kKGNpZCk7Ci0gICAgaWYgKGJ1ZmZlciA9PSBjaGFubmVsX2VucXVldWVfYnVmZmVyXy5lbmQoKSkgewotICAgICAgTE9HX0VSUk9SKCJDaGFubmVsIGlzIG5vdCBvcGVuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlci0+c2Vjb25kLT5TaXplKCk7Ci0gIH0KLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QsIHN0ZDo6dW5pcXVlX3B0cjxjbGFzc2ljOjpEeW5hbWljQ2hhbm5lbD4+Ci0gICAgICBjaGFubmVsc187Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6b3M6OkVucXVldWVCdWZmZXI8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6cGFja2V0OjpCYXNlUGFja2V0QnVpbGRlcj4+PgotICAgICAgY2hhbm5lbF9lbnF1ZXVlX2J1ZmZlcl87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgYm9vbD4gaW5pdGlhdGVkX2J5X3VzXzsKLX07Ci0KLXN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgc3RkOjp1bmlxdWVfcHRyPENsYXNzaWNEeW5hbWljQ2hhbm5lbEhlbHBlcj4+Ci0gICAgY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF87Ci0KLXZvaWQgcmVtb3ZlX2NsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcih1aW50MTZfdCBwc20pIHsKLSAgaWYgKGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmNvdW50KHBzbSkgIT0gMCAmJgotICAgICAgY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF9bcHNtXS0+Y2hhbm5lbHNfLmVtcHR5KCkpIHsKLSAgICBjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5lcmFzZShwc20pOwotICB9Ci19Ci0KLS8vIEhlbHBlcjogTDJjYXAgc2VjdXJpdHkgZW5mb3JjZW1lbnQgc2hpbQotCi1zdGQ6OnVub3JkZXJlZF9tYXA8aW50cHRyX3QsCi0gICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChib29sKT4+Ci0gICAgc2VjdXJpdHlfZW5mb3JjZV9jYWxsYmFja19tYXAgPSB7fTsKLQotY2xhc3MgQ2xhc3NpY1NlY3VyaXR5RW5mb3JjZW1lbnRTaGltCi0gICAgOiBwdWJsaWMgYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBzZWN1cml0eV9lbmZvcmNlX3Jlc3VsdF9jYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYXNucG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgcmVzdWx0KSB7Ci0gICAgaW50cHRyX3QgY291bnRlciA9IChpbnRwdHJfdClwX3JlZl9kYXRhOwotICAgIGlmIChzZWN1cml0eV9lbmZvcmNlX2NhbGxiYWNrX21hcC5jb3VudChjb3VudGVyKSA9PSAwKSB7Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgY2FsbGJhY2siKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvJiBjYWxsYmFjayA9IHNlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfbWFwW2NvdW50ZXJdOwotICAgIHN0ZDo6bW92ZShjYWxsYmFjaykuSW52b2tlKHJlc3VsdCA9PSBCVE1fU1VDQ0VTUyk7Ci0gICAgc2VjdXJpdHlfZW5mb3JjZV9jYWxsYmFja19tYXAuZXJhc2UoY291bnRlcik7Ci0gIH0KLQotICB2b2lkIEVuZm9yY2UoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsCi0gICAgICAgICAgICAgICBibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeSBwb2xpY3ksCi0gICAgICAgICAgICAgICBSZXN1bHRDYWxsYmFjayByZXN1bHRfY2FsbGJhY2spIG92ZXJyaWRlIHsKLSAgICB1aW50MTZfdCBzZWNfbWFzayA9IDA7Ci0gICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3k6OgotICAgICAgICAgIF9TRFBfT05MWV9OT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0s6Ci0gICAgICAgIHJlc3VsdF9jYWxsYmFjay5JbnZva2UodHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3k6OkVOQ1JZUFRFRF9UUkFOU1BPUlQ6Ci0gICAgICAgIHNlY19tYXNrID0gQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUgfCBCVE1fU0VDX0lOX0VOQ1JZUFQgfAotICAgICAgICAgICAgICAgICAgIEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfT1VUX0VOQ1JZUFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpTZWN1cml0eVBvbGljeTo6QkVTVDoKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6U2VjdXJpdHlQb2xpY3k6OgotICAgICAgICAgIEFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgICAgc2VjX21hc2sgPSBCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfSU5fRU5DUllQVCB8Ci0gICAgICAgICAgICAgICAgICAgQlRNX1NFQ19JTl9NSVRNIHwgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwKLSAgICAgICAgICAgICAgICAgICBCVE1fU0VDX09VVF9FTkNSWVBUIHwgQlRNX1NFQ19PVVRfTUlUTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGF1dG8gYmRfYWRkciA9IGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKHJlbW90ZS5HZXRBZGRyZXNzKCkpOwotICAgIHNlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfbWFwW3NlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfY291bnRlcl9dID0KLSAgICAgICAgc3RkOjptb3ZlKHJlc3VsdF9jYWxsYmFjayk7Ci0gICAgYnRtX3NlY19sMmNhcF9hY2Nlc3NfcmVxX2J5X3JlcXVpcmVtZW50KAotICAgICAgICBiZF9hZGRyLCBzZWNfbWFzaywgdHJ1ZSwgc2VjdXJpdHlfZW5mb3JjZV9yZXN1bHRfY2FsbGJhY2ssCi0gICAgICAgICh2b2lkKilzZWN1cml0eV9lbmZvcmNlX2NhbGxiYWNrX2NvdW50ZXJfKTsKLSAgICBzZWN1cml0eV9lbmZvcmNlX2NhbGxiYWNrX2NvdW50ZXJfKys7Ci0gIH0KLQotICBpbnRwdHJfdCBzZWN1cml0eV9lbmZvcmNlX2NhbGxiYWNrX2NvdW50ZXJfID0gMTAwOwotfSBzZWN1cml0eV9lbmZvcmNlbWVudF9zaGltXzsKLQotc3RydWN0IFJlbW90ZUZlYXR1cmUgewotICB1aW50OF90IGxtcF92ZXJzaW9uID0gMDsKLSAgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUgPSAwOwotICB1aW50MTZfdCBzdWJfdmVyc2lvbiA9IDA7Ci0gIHVpbnQ4X3QgcmF3X3JlbW90ZV9mZWF0dXJlc1s4XTsKLSAgYm9vbCB2ZXJzaW9uX2luZm9fcmVjZWl2ZWQgPSBmYWxzZTsKLSAgYm9vbCByb2xlX3N3aXRjaF9zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgYm9vbCBicl9lZHJfc3VwcG9ydGVkID0gZmFsc2U7Ci0gIGJvb2wgbGVfc3VwcG9ydGVkX2NvbnRyb2xsZXIgPSBmYWxzZTsKLSAgYm9vbCBsZV9zdXBwb3J0ZWRfaG9zdCA9IGZhbHNlOwotICBib29sIHNzcF9zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgYm9vbCBzY19zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZF9wYWdlXzAgPSBmYWxzZTsKLSAgYm9vbCByZWNlaXZlZF9wYWdlXzEgPSBmYWxzZTsKLX07Ci0KLXN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBSZW1vdGVGZWF0dXJlPiByZW1vdGVfZmVhdHVyZV9tYXBfOwotCi1zdHJ1Y3QgTGlua1Byb3BlcnR5TGlzdGVuZXJTaGltCi0gICAgOiBwdWJsaWMgYmx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6TGlua1Byb3BlcnR5TGlzdGVuZXIgewotICBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzLCB1aW50MTZfdD4gYWRkcmVzc190b19oYW5kbGVfOwotCi0gIHZvaWQgT25MaW5rQ29ubmVjdGVkKGhjaTo6QWRkcmVzcyByZW1vdGUsIHVpbnQxNl90IGhhbmRsZSkgb3ZlcnJpZGUgewotICAgIGFkZHJlc3NfdG9faGFuZGxlX1tyZW1vdGVdID0gaGFuZGxlOwotICB9Ci0KLSAgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoaGNpOjpBZGRyZXNzIHJlbW90ZSkgb3ZlcnJpZGUgewotICAgIGFkZHJlc3NfdG9faGFuZGxlXy5lcmFzZShyZW1vdGUpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24oaGNpOjpFcnJvckNvZGUgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBZGRyZXNzIHJlbW90ZSwgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1Yl92ZXJzaW9uKSBvdmVycmlkZSB7Ci0gICAgYXV0byBiZGEgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhyZW1vdGUpOwotICAgIGF1dG8mIGVudHJ5ID0gcmVtb3RlX2ZlYXR1cmVfbWFwX1tiZGFdOwotICAgIGVudHJ5LmxtcF92ZXJzaW9uID0gbG1wX3ZlcnNpb247Ci0gICAgZW50cnkubWFudWZhY3R1cmVyX25hbWUgPSBtYW51ZmFjdHVyZXJfbmFtZTsKLSAgICBlbnRyeS5zdWJfdmVyc2lvbiA9IHN1Yl92ZXJzaW9uOwotICAgIGVudHJ5LnZlcnNpb25faW5mb19yZWNlaXZlZCA9IHRydWU7Ci0gIH0KLQotICB2b2lkIE9uUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXMoaGNpOjpBZGRyZXNzIHJlbW90ZSwgdWludDhfdCBwYWdlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZmVhdHVyZXMpIG92ZXJyaWRlIHsKLSAgICBhdXRvIGJkYSA9IGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKHJlbW90ZSk7Ci0gICAgYXV0byYgZW50cnkgPSByZW1vdGVfZmVhdHVyZV9tYXBfW2JkYV07Ci0gICAgaWYgKHBhZ2VfbnVtYmVyID09IDApIHsKLSAgICAgIGVudHJ5LnJlY2VpdmVkX3BhZ2VfMCA9IHRydWU7Ci0gICAgICBpZiAoZmVhdHVyZXMgJiAweDIwKSBlbnRyeS5yb2xlX3N3aXRjaF9zdXBwb3J0ZWQgPSB0cnVlOwotICAgICAgZW50cnkuYnJfZWRyX3N1cHBvcnRlZCA9ICEoZmVhdHVyZXMgJiBrQnJFZHJOb3RTdXBwb3J0ZWRNYXNrKTsKLSAgICAgIGVudHJ5LmxlX3N1cHBvcnRlZF9jb250cm9sbGVyID0gZmVhdHVyZXMgJiBrTGVTdXBwb3J0ZWRDb250cm9sbGVyTWFzazsKLSAgICAgIHN0ZDo6bWVtY3B5KGVudHJ5LnJhd19yZW1vdGVfZmVhdHVyZXMsICZmZWF0dXJlcywgOCk7Ci0gICAgfQotICAgIGlmIChwYWdlX251bWJlciA9PSAxKSB7Ci0gICAgICBlbnRyeS5yZWNlaXZlZF9wYWdlXzEgPSB0cnVlOwotICAgICAgaWYgKGZlYXR1cmVzICYgMHgwMSkgZW50cnkuc3NwX3N1cHBvcnRlZCA9IHRydWU7Ci0gICAgICBlbnRyeS5sZV9zdXBwb3J0ZWRfaG9zdCA9IGZlYXR1cmVzICYga0xlU3VwcG9ydGVkSG9zdE1hc2s7Ci0gICAgfQotICAgIGlmIChlbnRyeS5yZWNlaXZlZF9wYWdlXzAgJiYgZW50cnkucmVjZWl2ZWRfcGFnZV8xKSB7Ci0gICAgICBjb25zdCBib29sIGxlX3N1cHBvcnRlZCA9Ci0gICAgICAgICAgZW50cnkubGVfc3VwcG9ydGVkX2NvbnRyb2xsZXIgJiYgZW50cnkubGVfc3VwcG9ydGVkX2hvc3Q7Ci0gICAgICBidG1fc2VjX3NldF9wZWVyX3NlY19jYXBzKGFkZHJlc3NfdG9faGFuZGxlX1tyZW1vdGVdLCBlbnRyeS5zc3Bfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZW50cnkucm9sZV9zd2l0Y2hfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5icl9lZHJfc3VwcG9ydGVkLCBsZV9zdXBwb3J0ZWQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgT25Sb2xlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUsIGhjaTo6QWRkcmVzcyByZW1vdGUsCi0gICAgICAgICAgICAgICAgICAgIGhjaTo6Um9sZSByb2xlKSBvdmVycmlkZSB7Ci0gICAgYnRtX3JlamVjdGxpc3Rfcm9sZV9jaGFuZ2VfZGV2aWNlKFRvUmF3QWRkcmVzcyhyZW1vdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0xlZ2FjeUhjaUVycm9yQ29kZShlcnJvcl9jb2RlKSk7Ci0gICAgYnRtX2FjbF9yb2xlX2NoYW5nZWQoVG9MZWdhY3lIY2lFcnJvckNvZGUoZXJyb3JfY29kZSksIFRvUmF3QWRkcmVzcyhyZW1vdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRvTGVnYWN5Um9sZShyb2xlKSk7Ci0gIH0KLQotICB2b2lkIE9uUmVhZENsb2NrT2Zmc2V0KGhjaTo6QWRkcmVzcyByZW1vdGUsIHVpbnQxNl90IGNsb2NrX29mZnNldCkgb3ZlcnJpZGUgewotICAgIGJ0bV9zZWNfdXBkYXRlX2Nsb2NrX29mZnNldChhZGRyZXNzX3RvX2hhbmRsZV9bcmVtb3RlXSwgY2xvY2tfb2Zmc2V0KTsKLSAgfQotCi0gIHZvaWQgT25Nb2RlQ2hhbmdlKGhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUsIGhjaTo6QWRkcmVzcyByZW1vdGUsCi0gICAgICAgICAgICAgICAgICAgIGhjaTo6TW9kZSBtb2RlLCB1aW50MTZfdCBpbnRlcnZhbCkgb3ZlcnJpZGUgewotICAgIGJ0bV9zY29fY2hrX3BlbmRfdW5wYXJrKFRvTGVnYWN5SGNpRXJyb3JDb2RlKGVycm9yX2NvZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NfdG9faGFuZGxlX1tyZW1vdGVdKTsKLSAgICBidG1fcG1fcHJvY19tb2RlX2NoYW5nZShUb0xlZ2FjeUhjaUVycm9yQ29kZShlcnJvcl9jb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3RvX2hhbmRsZV9bcmVtb3RlXSwgVG9MZWdhY3lIY2lNb2RlKG1vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsKTsKLSAgfQotCi0gIHZvaWQgT25TbmlmZlN1YnJhdGluZyhoY2k6OkVycm9yQ29kZSBlcnJvcl9jb2RlLCBoY2k6OkFkZHJlc3MgcmVtb3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X3R4X2xhdCwgdWludDE2X3QgbWF4X3J4X2xhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9sb2NhbF90aW1lb3V0KSBvdmVycmlkZSB7Ci0gICAgcHJvY2Vzc19zc3JfZXZlbnQoVG9MZWdhY3lIY2lFcnJvckNvZGUoZXJyb3JfY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc190b19oYW5kbGVfW3JlbW90ZV0sIG1heF90eF9sYXQsIG1heF9yeF9sYXQpOwotICB9Ci0KLX0gbGlua19wcm9wZXJ0eV9saXN0ZW5lcl9zaGltXzsKLQotY2xhc3MgU2VjdXJpdHlMaXN0ZW5lclNoaW0KLSAgICA6IHB1YmxpYyBibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpMaW5rU2VjdXJpdHlJbnRlcmZhY2VMaXN0ZW5lciB7Ci0gcHVibGljOgotICB2b2lkIE9uTGlua0Nvbm5lY3RlZCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OmwyY2FwOjpjbGFzc2ljOjpMaW5rU2VjdXJpdHlJbnRlcmZhY2U+Ci0gICAgICAgICAgaW50ZXJmYWNlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBiZGEgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhpbnRlcmZhY2UtPkdldFJlbW90ZUFkZHJlc3MoKSk7Ci0KLSAgICB1aW50MTZfdCBoYW5kbGUgPSBpbnRlcmZhY2UtPkdldEFjbEhhbmRsZSgpOwotICAgIGFkZHJlc3NfdG9faGFuZGxlX1tiZGFdID0gaGFuZGxlOwotICAgIGJ0bV9zZWNfY29ubmVjdGVkKGJkYSwgaGFuZGxlLCBIQ0lfU1VDQ0VTUywgMCk7Ci0gICAgQlRNX1BNX09uQ29ubmVjdGVkKGhhbmRsZSwgYmRhKTsKLSAgICBCVEFfZG1fYWNsX3VwKGJkYSwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgYWRkcmVzc190b19pbnRlcmZhY2VfW2JkYV0gPSBzdGQ6Om1vdmUoaW50ZXJmYWNlKTsKLSAgfQotCi0gIHZvaWQgT25BdXRoZW50aWNhdGlvbkNvbXBsZXRlKGhjaTo6RXJyb3JDb2RlIGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIHJlbW90ZSkgb3ZlcnJpZGUgewotICAgIC8vIE5vdGU6IGlmIGdkIHNlY3VyaXR5IGlzIG5vdCBlbmFibGVkLCB3ZSBzaG91bGQgdXNlIGJ0dV9oY2lmLmNjIHBhdGgKLSAgICBhdXRvIGJkYSA9IGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKHJlbW90ZSk7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gYWRkcmVzc190b19oYW5kbGVfW2JkYV07Ci0gICAgYnRtX3NlY19hdXRoX2NvbXBsZXRlKGhhbmRsZSwgVG9MZWdhY3lIY2lFcnJvckNvZGUoaGNpX3N0YXR1cykpOwotICB9Ci0KLSAgdm9pZCBPbkxpbmtEaXNjb25uZWN0ZWQoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgcmVtb3RlKSBvdmVycmlkZSB7Ci0gICAgYXV0byBiZGEgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhyZW1vdGUpOwotICAgIHVpbnQxNl90IGhhbmRsZSA9IGFkZHJlc3NfdG9faGFuZGxlX1tiZGFdOwotICAgIGFkZHJlc3NfdG9faGFuZGxlXy5lcmFzZShiZGEpOwotICAgIGFkZHJlc3NfdG9faW50ZXJmYWNlXy5lcmFzZShiZGEpOwotICAgIGJ0bV9zZWNfZGlzY29ubmVjdGVkKGhhbmRsZSwgSENJX0VSUl9QRUVSX1VTRVIpOwotICAgIEJUQV9kbV9hY2xfZG93bihiZGEsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgIEJUTV9QTV9PbkRpc2Nvbm5lY3RlZChoYW5kbGUpOwotICB9Ci0KLSAgdm9pZCBPbkVuY3J5cHRpb25DaGFuZ2UoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgcmVtb3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuY3J5cHRlZCkgb3ZlcnJpZGUgewotICAgIC8vIE5vdGU6IGlmIGdkIHNlY3VyaXR5IGlzIG5vdCBlbmFibGVkLCB3ZSBzaG91bGQgdXNlIGJ0dV9oY2lmLmNjIHBhdGgKLSAgICBhdXRvIGJkYSA9IGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKHJlbW90ZSk7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gYWRkcmVzc190b19oYW5kbGVfW2JkYV07Ci0gICAgYnRtX3NlY19lbmNyeXB0X2NoYW5nZShoYW5kbGUsIEhDSV9TVUNDRVNTLCBlbmNyeXB0ZWQpOwotICB9Ci0KLSAgdm9pZCBVcGRhdGVMaW5rSG9sZEZvclNlY3VyaXR5KFJhd0FkZHJlc3MgcmVtb3RlLCBib29sIGlzX2JvbmRpbmcpIHsKLSAgICBpZiAoYWRkcmVzc190b19pbnRlcmZhY2VfLmNvdW50KHJlbW90ZSkgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoaXNfYm9uZGluZykgewotICAgICAgYWRkcmVzc190b19pbnRlcmZhY2VfW3JlbW90ZV0tPkhvbGQoKTsKLSAgICB9IGVsc2UgewotICAgICAgYWRkcmVzc190b19pbnRlcmZhY2VfW3JlbW90ZV0tPlJlbGVhc2UoKTsKLSAgICB9Ci0gIH0KLQotICBib29sIElzUm9sZUNlbnRyYWwoUmF3QWRkcmVzcyByZW1vdGUpIHsKLSAgICBpZiAoYWRkcmVzc190b19pbnRlcmZhY2VfLmNvdW50KHJlbW90ZSkgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gYWRkcmVzc190b19pbnRlcmZhY2VfW3JlbW90ZV0tPkdldFJvbGUoKSA9PQotICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6Um9sZTo6Q0VOVFJBTDsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdChSYXdBZGRyZXNzIHJlbW90ZSkgewotICAgIGlmIChhZGRyZXNzX3RvX2ludGVyZmFjZV8uY291bnQocmVtb3RlKSA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHJldHVybiBhZGRyZXNzX3RvX2ludGVyZmFjZV9bcmVtb3RlXS0+RGlzY29ubmVjdCgpOwotICB9Ci0KLSAgdWludDE2X3QgR2V0TnVtQWNsTGlua3MoKSB7IHJldHVybiBhZGRyZXNzX3RvX2hhbmRsZV8uc2l6ZSgpOyB9Ci0KLSAgYm9vbCBJc0xpbmtVcChSYXdBZGRyZXNzIHJlbW90ZSkgewotICAgIHJldHVybiBhZGRyZXNzX3RvX2ludGVyZmFjZV8uY291bnQocmVtb3RlKSAhPSAwOwotICB9Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIHVpbnQxNl90PiBhZGRyZXNzX3RvX2hhbmRsZV87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDwKLSAgICAgIFJhd0FkZHJlc3MsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpsMmNhcDo6Y2xhc3NpYzo6TGlua1NlY3VyaXR5SW50ZXJmYWNlPj4KLSAgICAgIGFkZHJlc3NfdG9faW50ZXJmYWNlXzsKLX0gc2VjdXJpdHlfbGlzdGVuZXJfc2hpbV87Ci0KLWJsdWV0b290aDo6bDJjYXA6OmNsYXNzaWM6OlNlY3VyaXR5SW50ZXJmYWNlKiBzZWN1cml0eV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLQotc3RydWN0IExlTGlua1Byb3BlcnR5TGlzdGVuZXJTaGltCi0gICAgOiBwdWJsaWMgYmx1ZXRvb3RoOjpsMmNhcDo6bGU6OkxpbmtQcm9wZXJ0eUxpc3RlbmVyIHsKLSAgc3RydWN0IENvbm5lY3Rpb25JbmZvIHsKLSAgICB1aW50MTZfdCBoYW5kbGU7Ci0gICAgaGNpOjpSb2xlIHJvbGU7Ci0gICAgQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3Nfd2l0aF90eXBlOwotICB9OwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aGNpOjpBZGRyZXNzLCBDb25uZWN0aW9uSW5mbz4gaW5mb187Ci0KLSAgdm9pZCBPbkxpbmtDb25uZWN0ZWQoQWRkcmVzc1dpdGhUeXBlIHJlbW90ZSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBoY2k6OlJvbGUgcm9sZSkgb3ZlcnJpZGUgewotICAgIGluZm9fW3JlbW90ZS5HZXRBZGRyZXNzKCldID0ge2hhbmRsZSwgcm9sZSwgcmVtb3RlfTsKLSAgICBidG1fYmxlX2Nvbm5lY3RlZChUb1Jhd0FkZHJlc3MocmVtb3RlLkdldEFkZHJlc3MoKSksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBIQ0lfRU5DUllQVF9NT0RFX0RJU0FCTEVELCBzdGF0aWNfY2FzdDx1aW50OF90Pihyb2xlKSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0QkxFX0FERFJfVFlQRT4ocmVtb3RlLkdldEFkZHJlc3NUeXBlKCkpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotCi0gIHZvaWQgT25MaW5rRGlzY29ubmVjdGVkKGhjaTo6QWRkcmVzc1dpdGhUeXBlIHJlbW90ZSkgb3ZlcnJpZGUgewotICAgIGluZm9fLmVyYXNlKHJlbW90ZS5HZXRBZGRyZXNzKCkpOwotICB9Ci0KLSAgdm9pZCBPblJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24oaGNpOjpFcnJvckNvZGUgaGNpX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3ViX3ZlcnNpb24pIG92ZXJyaWRlIHsKLSAgICBhdXRvIGJkYSA9IGJsdWV0b290aDo6VG9SYXdBZGRyZXNzKHJlbW90ZS5HZXRBZGRyZXNzKCkpOwotICAgIGF1dG8mIGVudHJ5ID0gcmVtb3RlX2ZlYXR1cmVfbWFwX1tiZGFdOwotICAgIGVudHJ5LmxtcF92ZXJzaW9uID0gbG1wX3ZlcnNpb247Ci0gICAgZW50cnkubWFudWZhY3R1cmVyX25hbWUgPSBtYW51ZmFjdHVyZXJfbmFtZTsKLSAgICBlbnRyeS5zdWJfdmVyc2lvbiA9IHN1Yl92ZXJzaW9uOwotICAgIGVudHJ5LnZlcnNpb25faW5mb19yZWNlaXZlZCA9IHRydWU7Ci0gIH0KLQotICB2b2lkIE9uQ29ubmVjdGlvblVwZGF0ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCkgb3ZlcnJpZGUgewotICAgIGFjbF9ibGVfdXBkYXRlX2V2ZW50X3JlY2VpdmVkKAotICAgICAgICBIQ0lfU1VDQ0VTUywgaW5mb19bcmVtb3RlLkdldEFkZHJlc3MoKV0uaGFuZGxlLCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICBjb25uZWN0aW9uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpOwotICB9Ci0KLSAgdm9pZCBPblBoeVVwZGF0ZShoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsIHVpbnQ4X3QgdHhfcGh5LAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5KSBvdmVycmlkZSB7Ci0gICAgZ2F0dF9ub3RpZnlfcGh5X3VwZGF0ZWQoR0FUVF9TVUNDRVNTLCBpbmZvX1tyZW1vdGUuR2V0QWRkcmVzcygpXS5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfcGh5LCByeF9waHkpOwotICB9Ci0KLSAgdm9pZCBPbkRhdGFMZW5ndGhDaGFuZ2UoaGNpOjpBZGRyZXNzV2l0aFR5cGUgcmVtb3RlLCB1aW50MTZfdCB0eF9vY3RldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR4X3RpbWUsIHVpbnQxNl90IHJ4X29jdGV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcnhfdGltZSkgb3ZlcnJpZGUgewotICAgIC8vIFVzZWQgYnkgTDJjYXAgaW50ZXJuYWwgb25seS4KLSAgfQotfSBsZV9saW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fOwotCi1zdGQ6OnVub3JkZXJlZF9tYXA8aW50cHRyX3QsCi0gICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkNvbnRleHR1YWxPbmNlQ2FsbGJhY2s8dm9pZChib29sKT4+Ci0gICAgbGVfc2VjdXJpdHlfZW5mb3JjZV9jYWxsYmFja19tYXAgPSB7fTsKLQotY2xhc3MgTGVTZWN1cml0eUVuZm9yY2VtZW50U2hpbQotICAgIDogcHVibGljIGJsdWV0b290aDo6bDJjYXA6OmxlOjpTZWN1cml0eUVuZm9yY2VtZW50SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIGxlX3NlY3VyaXR5X2VuZm9yY2VfcmVzdWx0X2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhc25wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NUQVRVUyByZXN1bHQpIHsKLSAgICBpbnRwdHJfdCBjb3VudGVyID0gKGludHB0cl90KXBfcmVmX2RhdGE7Ci0gICAgaWYgKGxlX3NlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfbWFwLmNvdW50KGNvdW50ZXIpID09IDApIHsKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgdW5leHBlY3RlZCBjYWxsYmFjayIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvJiBjYWxsYmFjayA9IGxlX3NlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfbWFwW2NvdW50ZXJdOwotICAgIHN0ZDo6bW92ZShjYWxsYmFjaykuSW52b2tlKHJlc3VsdCA9PSBCVE1fU1VDQ0VTUyk7Ci0gICAgbGVfc2VjdXJpdHlfZW5mb3JjZV9jYWxsYmFja19tYXAuZXJhc2UoY291bnRlcik7Ci0gIH0KLQotICB2b2lkIEVuZm9yY2UoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSByZW1vdGUsCi0gICAgICAgICAgICAgICBibHVldG9vdGg6OmwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3kgcG9saWN5LAotICAgICAgICAgICAgICAgUmVzdWx0Q2FsbGJhY2sgcmVzdWx0X2NhbGxiYWNrKSBvdmVycmlkZSB7Ci0gICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0ID0gQlRNX0JMRV9TRUNfTk9ORTsKLSAgICBzd2l0Y2ggKHBvbGljeSkgewotICAgICAgY2FzZSBibHVldG9vdGg6OmwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3k6OgotICAgICAgICAgIE5PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSzoKLSAgICAgICAgcmVzdWx0X2NhbGxiYWNrLkludm9rZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBibHVldG9vdGg6OmwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3k6OkVOQ1JZUFRFRF9UUkFOU1BPUlQ6Ci0gICAgICAgIHNlY19hY3QgPSBCVE1fQkxFX1NFQ19FTkNSWVBUOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpsMmNhcDo6bGU6OlNlY3VyaXR5UG9saWN5OjpCRVNUOgotICAgICAgY2FzZSBibHVldG9vdGg6OmwyY2FwOjpsZTo6U2VjdXJpdHlQb2xpY3k6OgotICAgICAgICAgIEFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVDoKLSAgICAgICAgc2VjX2FjdCA9IEJUTV9CTEVfU0VDX0VOQ1JZUFRfTUlUTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXN1bHRfY2FsbGJhY2suSW52b2tlKGZhbHNlKTsKLSAgICB9Ci0gICAgYXV0byBiZF9hZGRyID0gYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MocmVtb3RlLkdldEFkZHJlc3MoKSk7Ci0gICAgbGVfc2VjdXJpdHlfZW5mb3JjZV9jYWxsYmFja19tYXBbc2VjdXJpdHlfZW5mb3JjZV9jYWxsYmFja19jb3VudGVyX10gPQotICAgICAgICBzdGQ6Om1vdmUocmVzdWx0X2NhbGxiYWNrKTsKLSAgICBCVE1fU2V0RW5jcnlwdGlvbihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAgICAgICAgICAgICAgICAgbGVfc2VjdXJpdHlfZW5mb3JjZV9yZXN1bHRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKXNlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfY291bnRlcl8sIHNlY19hY3QpOwotICAgIHNlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfY291bnRlcl8rKzsKLSAgfQotCi0gIGludHB0cl90IHNlY3VyaXR5X2VuZm9yY2VfY2FsbGJhY2tfY291bnRlcl8gPSAxMDA7Ci19IGxlX3NlY3VyaXR5X2VuZm9yY2VtZW50X3NoaW1fOwotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgTDJDQV9SZWFkUmVtb3RlVmVyc2lvbihjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbWFudWZhY3R1cmVyLCB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKSB7Ci0gIGF1dG8mIGVudHJ5ID0gcmVtb3RlX2ZlYXR1cmVfbWFwX1thZGRyXTsKLSAgaWYgKCFlbnRyeS52ZXJzaW9uX2luZm9fcmVjZWl2ZWQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGxtcF92ZXJzaW9uICE9IG51bGxwdHIpICpsbXBfdmVyc2lvbiA9IGVudHJ5LmxtcF92ZXJzaW9uOwotICBpZiAobWFudWZhY3R1cmVyICE9IG51bGxwdHIpICptYW51ZmFjdHVyZXIgPSBlbnRyeS5tYW51ZmFjdHVyZXJfbmFtZTsKLSAgaWYgKGxtcF9zdWJfdmVyc2lvbiAhPSBudWxscHRyKSAqbG1wX3N1Yl92ZXJzaW9uID0gZW50cnkuc3ViX3ZlcnNpb247Ci0gIHJldHVybiB0cnVlOwotfQotCi11aW50OF90KiBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIGF1dG8mIGVudHJ5ID0gcmVtb3RlX2ZlYXR1cmVfbWFwX1thZGRyXTsKLSAgaWYgKCFlbnRyeS5yZWNlaXZlZF9wYWdlXzApIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gZW50cnkucmF3X3JlbW90ZV9mZWF0dXJlczsKLX0KLQotc3RhdGljIHZvaWQgb25fc2NvX2Rpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBHZXRHZFNoaW1IYW5kbGVyKCktPlBvc3QoYmFzZTo6QmluZE9uY2UoYmFzZTo6SWdub3JlUmVzdWx0KCZidG1fc2NvX3JlbW92ZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEhDSV9SRUFTT04+KHJlYXNvbikpKTsKLX0KLQotdm9pZCBMMkNBX1VzZUxlZ2FjeVNlY3VyaXR5TW9kdWxlKCkgewotICBMT0dfSU5GTygiR0QgTDJjYXAgaXMgdXNpbmcgbGVnYWN5IHNlY3VyaXR5IG1vZHVsZSIpOwotICBHZXRMMmNhcENsYXNzaWNNb2R1bGUoKS0+U2V0TGlua1Byb3BlcnR5TGlzdGVuZXIoCi0gICAgICBHZXRHZFNoaW1IYW5kbGVyKCksICZsaW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fKTsKLQotICBHZXRMMmNhcENsYXNzaWNNb2R1bGUoKS0+SW5qZWN0U2VjdXJpdHlFbmZvcmNlbWVudEludGVyZmFjZSgKLSAgICAgICZzZWN1cml0eV9lbmZvcmNlbWVudF9zaGltXyk7Ci0gIHNlY3VyaXR5X2ludGVyZmFjZV8gPSBHZXRMMmNhcENsYXNzaWNNb2R1bGUoKS0+R2V0U2VjdXJpdHlJbnRlcmZhY2UoCi0gICAgICBHZXRHZFNoaW1IYW5kbGVyKCksICZzZWN1cml0eV9saXN0ZW5lcl9zaGltXyk7Ci0KLSAgR2V0TDJjYXBMZU1vZHVsZSgpLT5TZXRMaW5rUHJvcGVydHlMaXN0ZW5lcihHZXRHZFNoaW1IYW5kbGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlX2xpbmtfcHJvcGVydHlfbGlzdGVuZXJfc2hpbV8pOwotICBHZXRMMmNhcExlTW9kdWxlKCktPkluamVjdFNlY3VyaXR5RW5mb3JjZW1lbnRJbnRlcmZhY2UoCi0gICAgICAmbGVfc2VjdXJpdHlfZW5mb3JjZW1lbnRfc2hpbV8pOwotCi0gIEdldEFjbE1hbmFnZXIoKS0+SEFDS19TZXROb25BY2xEaXNjb25uZWN0Q2FsbGJhY2sob25fc2NvX2Rpc2Nvbm5lY3QpOwotfQotCi0vKioKLSAqIENsYXNzaWMgU2VydmljZSBSZWdpc3RyYXRpb24gQVBJcwotICovCi11aW50MTZfdCBMMkNBX1JlZ2lzdGVyKHVpbnQxNl90IGNsaWVudF9wc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCkgewotICBpZiAoY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQoY2xpZW50X3BzbSkgIT0gMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkFscmVhZHkgcmVnaXN0ZXJlZCBwc206ICIgPDwgY2xpZW50X3BzbTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbiBjb25maWc7Ci0gIGNvbmZpZy5taW5pbWFsX3JlbW90ZV9tdHUgPSBzdGQ6Om1heDx1aW50MTZfdD4ocmVxdWlyZWRfcmVtb3RlX210dSwgNDgpOwotICBjb25maWcuaW5jb21pbmdfbXR1ID0gbXlfbXR1OwotICBjb25maWcuY2hhbm5lbF9tb2RlID0KLSAgICAgIChwX2VydG1faW5mbyAhPSBudWxscHRyICYmCi0gICAgICAgICAgICAgICBwX2VydG1faW5mby0+cHJlZmVycmVkX21vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERQotICAgICAgICAgICA/IGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6Ci0gICAgICAgICAgICAgICAgIFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlOjpFTkhBTkNFRF9SRVRSQU5TTUlTU0lPTgotICAgICAgICAgICA6IGNsYXNzaWM6OkR5bmFtaWNDaGFubmVsQ29uZmlndXJhdGlvbk9wdGlvbjo6Ci0gICAgICAgICAgICAgICAgIFJldHJhbnNtaXNzaW9uQW5kRmxvd0NvbnRyb2xNb2RlOjpMMkNBUF9CQVNJQyk7Ci0KLSAgY2xhc3NpYzo6U2VjdXJpdHlQb2xpY3kgcG9saWN5ID0KLSAgICAgIChjbGllbnRfcHNtID09IDEKLSAgICAgICAgICAgPyBjbGFzc2ljOjpTZWN1cml0eVBvbGljeTo6Ci0gICAgICAgICAgICAgICAgIF9TRFBfT05MWV9OT19TRUNVUklUWV9XSEFUU09FVkVSX1BMQUlOVEVYVF9UUkFOU1BPUlRfT0sKLSAgICAgICAgICAgOiBjbGFzc2ljOjpTZWN1cml0eVBvbGljeTo6RU5DUllQVEVEX1RSQU5TUE9SVCk7Ci0gIGlmIChzZWNfbGV2ZWwgJiAoQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUgfCBCVE1fU0VDX09VVF9BVVRIRU5USUNBVEUpKSB7Ci0gICAgcG9saWN5ID0gY2xhc3NpYzo6U2VjdXJpdHlQb2xpY3k6OkJFU1Q7Ci0gIH0KLQotICBjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1tjbGllbnRfcHNtXSA9Ci0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPENsYXNzaWNEeW5hbWljQ2hhbm5lbEhlbHBlcj4oY2xpZW50X3BzbSwgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgcG9saWN5KTsKLQotICBjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1tjbGllbnRfcHNtXS0+UmVnaXN0ZXIoKTsKLSAgcmV0dXJuIGNsaWVudF9wc207Ci19Ci0KLXZvaWQgTDJDQV9EZXJlZ2lzdGVyKHVpbnQxNl90IHBzbSkgewotICBpZiAoY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQocHNtKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm90IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF9bcHNtXS0+VW5yZWdpc3RlcigpOwotfQotCi0vKioKLSAqIENsYXNzaWMgQ29ubmVjdGlvbiBPcmllbnRlZCBDaGFubmVsIEFQSVMKLSAqLwotdWludDE2X3QgTDJDQV9Db25uZWN0UmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgaWYgKGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmNvdW50KHBzbSkgPT0gMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIk5vdCByZWdpc3RlcmVkIHBzbTogIiA8PCBwc207Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDE2X3QgY2lkX3Rva2VuID0gYWRkX2NsYXNzaWNfY2lkX3Rva2VuX2VudHJ5KHBzbSk7Ci0gIGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPkNvbm5lY3QoCi0gICAgICBjaWRfdG9rZW4sIFRvQWRkcmVzc1dpdGhUeXBlKHJhd19hZGRyZXNzLCBCTEVfQUREUl9QVUJMSUMpKTsKLSAgcmV0dXJuIGNpZF90b2tlbjsKLX0KLQotYm9vbCBMMkNBX0Rpc2Nvbm5lY3RSZXEodWludDE2X3QgY2lkKSB7Ci0gIGF1dG8gcHNtID0gY2xhc3NpY19jaWRfdG9rZW5fdG9fY2hhbm5lbF9tYXBfW2NpZF07Ci0gIGlmIChjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5jb3VudChwc20pID09IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJOb3QgcmVnaXN0ZXJlZCBwc206ICIgPDwgcHNtOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dLT5EaXNjb25uZWN0KGNpZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi11aW50OF90IEwyQ0FfRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgaWYgKGNsYXNzaWNfY2lkX3Rva2VuX3RvX2NoYW5uZWxfbWFwXy5jb3VudChjaWQpID09IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJJbnZhbGlkIGNpZDogIiA8PCBjaWQ7Ci0gICAgb3NpX2ZyZWUocF9kYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBhdXRvIHBzbSA9IGNsYXNzaWNfY2lkX3Rva2VuX3RvX2NoYW5uZWxfbWFwX1tjaWRdOwotICBpZiAoY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQocHNtKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm90IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGF1dG8gbGVuID0gcF9kYXRhLT5sZW47Ci0gIGF1dG8qIGRhdGEgPSBwX2RhdGEtPmRhdGEgKyBwX2RhdGEtPm9mZnNldDsKLSAgdWludDhfdCBzZW50X2xlbmd0aCA9Ci0gICAgICBjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dLT5zZW5kKAotICAgICAgICAgIGNpZCwgTWFrZVVuaXF1ZVBhY2tldChkYXRhLCBsZW4sIElzUGFja2V0Rmx1c2hhYmxlKHBfZGF0YSkpKSAqCi0gICAgICBsZW47Ci0gIG9zaV9mcmVlKHBfZGF0YSk7Ci0gIHJldHVybiBzZW50X2xlbmd0aDsKLX0KLQotYm9vbCBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIGFkZHI6ICVzIGNmZzolcCIsIF9fZnVuY19fLAotICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9jZmcpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQxNl90PiBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcSh1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgYWRkcjolcyIsIF9fZnVuY19fLCBwX2JkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHJlc3VsdDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMgYWRkcjolcyIsIF9fZnVuY19fLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBMaW5rIEFQSXMKLSAqLwotYm9vbCBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgIExPR19JTkZPKCJVTklNUExFTUVOVEVEICVzIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAodGltZW91dCA9PSAwIHx8IHRpbWVvdXQgPT0gR0FUVF9MSU5LX0lETEVfVElNRU9VVF9XSEVOX05PX0FQUCkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZW1vdmVGaXhlZENobmwoa0xlQXR0cmlidXRlQ2lkLCBiZF9hZGRyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiVU5JTVBMRU1FTlRFRCAlcyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBMMkNBX1NldEFjbFByaW9yaXR5KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBoaWdoX3ByaW9yaXR5KSB7Ci0gIEdldEFjbE1hbmFnZXIoKS0+SEFDS19TZXRBY2xUeFByaW9yaXR5KGhhbmRsZSwgaGlnaF9wcmlvcml0eSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEwyQ0FfU2V0QWNsUHJpb3JpdHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEwyQ0FQX1BSSU9SSVRZIHByaW9yaXR5KSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IHNlY3VyaXR5X2xpc3RlbmVyX3NoaW1fLmFkZHJlc3NfdG9faGFuZGxlX1tiZF9hZGRyXTsKLSAgcmV0dXJuIEwyQ0FfU2V0QWNsUHJpb3JpdHkoaGFuZGxlLCBwcmlvcml0eSA9PSBMMkNBUF9QUklPUklUWV9ISUdIKTsKLX0KLQotYm9vbCBMMkNBX0dldFBlZXJGZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCogcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrQXR0Q2lkID0gNDsKLQotc3RydWN0IExlRml4ZWRDaGFubmVsSGVscGVyIHsKLSAgTGVGaXhlZENoYW5uZWxIZWxwZXIodWludDE2X3QgY2lkKSA6IGNpZF8oY2lkKSB7fQotCi0gIHVpbnQxNl90IGNpZF87Ci0KLSAgdm9pZCBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUoCi0gICAgICBsZTo6Rml4ZWRDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0IHJlc3VsdCwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsZTo6Rml4ZWRDaGFubmVsU2VydmljZT4gc2VydmljZSkgewotICAgIGlmIChyZXN1bHQgIT0gbGU6OkZpeGVkQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiQ2hhbm5lbCBpcyBub3QgcmVnaXN0ZXJlZC4gY2lkPSIgPDwgK2NpZF87Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYW5uZWxfc2VydmljZV8gPSBzdGQ6Om1vdmUoc2VydmljZSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8bGU6OkZpeGVkQ2hhbm5lbFNlcnZpY2U+IGNoYW5uZWxfc2VydmljZV8gPSBudWxscHRyOwotCi0gIHZvaWQgb25fY2hhbm5lbF9jbG9zZShibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUpIHsKLSAgICBhdXRvIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhkZXZpY2UpOwotICAgIGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfW2RldmljZV0gPSBudWxscHRyOwotICAgIGNoYW5uZWxzX1tkZXZpY2VdLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgY2hhbm5lbHNfW2RldmljZV0gPSBudWxscHRyOwotICAgIGNvbm5fcGFyYW1ldGVyc18uZXJhc2UoZGV2aWNlKTsKLSAgICB1aW50OF90IGVycm9yID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZXJyb3JfY29kZSk7Ci0gICAgKGZyZWdfLnBMMkNBX0ZpeGVkQ29ubl9DYikoY2lkXywgYWRkcmVzcywgZmFsc2UsIGVycm9yLCBCVF9UUkFOU1BPUlRfTEUpOwotICB9Ci0KLSAgdm9pZCBvbl9jaGFubmVsX29wZW4oc3RkOjp1bmlxdWVfcHRyPGxlOjpGaXhlZENoYW5uZWw+IGNoYW5uZWwpIHsKLSAgICBhdXRvIHJlbW90ZSA9IGNoYW5uZWwtPkdldERldmljZSgpOwotICAgIGF1dG8gZGV2aWNlID0gcmVtb3RlLkdldEFkZHJlc3MoKTsKLSAgICBjaGFubmVsLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjaygKLSAgICAgICAgR2V0R2RTaGltSGFuZGxlcigpLCBibHVldG9vdGg6OmNvbW1vbjo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMZUZpeGVkQ2hhbm5lbEhlbHBlcjo6b25fY2hhbm5lbF9jbG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OlVucmV0YWluZWQodGhpcyksIGRldmljZSkpOwotICAgIGlmIChjaWRfID09IGtBdHRDaWQpIHsKLSAgICAgIGNoYW5uZWwtPkFjcXVpcmUoKTsKLSAgICB9Ci0gICAgY2hhbm5lbF9lbnF1ZXVlX2J1ZmZlcl9bZGV2aWNlXSA9IHN0ZDo6bWFrZV91bmlxdWU8Ci0gICAgICAgIGJsdWV0b290aDo6b3M6OkVucXVldWVCdWZmZXI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4oCi0gICAgICAgIGNoYW5uZWwtPkdldFF1ZXVlVXBFbmQoKSk7Ci0gICAgY2hhbm5lbC0+R2V0UXVldWVVcEVuZCgpLT5SZWdpc3RlckRlcXVldWUoCi0gICAgICAgIEdldEdkU2hpbUhhbmRsZXIoKSwKLSAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkJpbmQoJkxlRml4ZWRDaGFubmVsSGVscGVyOjpvbl9pbmNvbWluZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwgZGV2aWNlKSk7Ci0gICAgY2hhbm5lbHNfW2RldmljZV0gPSBzdGQ6Om1vdmUoY2hhbm5lbCk7Ci0gICAgY29ubl9wYXJhbWV0ZXJzX1tkZXZpY2VdID0ge307Ci0KLSAgICBhdXRvIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhkZXZpY2UpOwotCi0gICAgKGZyZWdfLnBMMkNBX0ZpeGVkQ29ubl9DYikoY2lkXywgYWRkcmVzcywgdHJ1ZSwgMCwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgfQotCi0gIHZvaWQgb25faW5jb21pbmdfZGF0YShibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBkZXZpY2UpIHsKLSAgICBhdXRvIGNoYW5uZWwgPSBjaGFubmVsc18uZmluZChkZXZpY2UpOwotICAgIGlmIChjaGFubmVsID09IGNoYW5uZWxzXy5lbmQoKSkgewotICAgICAgTE9HX0VSUk9SKCJDaGFubmVsIGlzIG5vdCBvcGVuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gcGFja2V0ID0gY2hhbm5lbC0+c2Vjb25kLT5HZXRRdWV1ZVVwRW5kKCktPlRyeURlcXVldWUoKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfdmVjdG9yKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0gICAgQlRfSERSKiBidWZmZXIgPQotICAgICAgICBzdGF0aWNfY2FzdDxCVF9IRFIqPihvc2lfY2FsbG9jKHBhY2tldF92ZWN0b3Iuc2l6ZSgpICsgc2l6ZW9mKEJUX0hEUikpKTsKLSAgICBzdGQ6OmNvcHkocGFja2V0X3ZlY3Rvci5iZWdpbigpLCBwYWNrZXRfdmVjdG9yLmVuZCgpLCBidWZmZXItPmRhdGEpOwotICAgIGJ1ZmZlci0+bGVuID0gcGFja2V0X3ZlY3Rvci5zaXplKCk7Ci0gICAgYXV0byBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoZGV2aWNlKTsKLSAgICBmcmVnXy5wTDJDQV9GaXhlZERhdGFfQ2IoY2lkXywgYWRkcmVzcywgYnVmZmVyKTsKLSAgfQotCi0gIHZvaWQgb25fb3V0Z29pbmdfY29ubmVjdGlvbl9mYWlsKAotICAgICAgUmF3QWRkcmVzcyByZW1vdGUsIGxlOjpGaXhlZENoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgewotICAgIExPRyhFUlJPUikgPDwgIk91dGdvaW5nIGNvbm5lY3Rpb24gZmFpbGVkIjsKLSAgICBmcmVnXy5wTDJDQV9GaXhlZENvbm5fQ2IoY2lkXywgcmVtb3RlLCB0cnVlLCAwLCBCVF9UUkFOU1BPUlRfTEUpOwotICB9Ci0KLSAgYm9vbCBzZW5kKGhjaTo6QWRkcmVzcyByZW1vdGUsCi0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgICBhdXRvIGJ1ZmZlciA9IGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfLmZpbmQocmVtb3RlKTsKLSAgICBpZiAoYnVmZmVyID09IGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfLmVuZCgpIHx8IGJ1ZmZlci0+c2Vjb25kID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkNoYW5uZWwgaXMgbm90IG9wZW4gZm9yIGNpZCAiIDw8IGNpZF87Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGJ1ZmZlci0+c2Vjb25kLT5FbnF1ZXVlKHN0ZDo6bW92ZShwYWNrZXQpLCBHZXRHZFNoaW1IYW5kbGVyKCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgc3RkOjp1bmlxdWVfcHRyPGxlOjpGaXhlZENoYW5uZWw+PiBjaGFubmVsc187Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxoY2k6OkFkZHJlc3MsIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6Om9zOjpFbnF1ZXVlQnVmZmVyPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4+Ci0gICAgICBjaGFubmVsX2VucXVldWVfYnVmZmVyXzsKLQotICBzdHJ1Y3QgQ29ubmVjdGlvblBhcmFtZXRlciB7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZXMgYXJlIGZyb20gR0QgSENJX0FDTCBsZV9pbXBsLgotICAgIHVpbnQxNl90IG1pbl9pbnQgPSAweDAwMTg7Ci0gICAgdWludDE2X3QgbWF4X2ludCA9IDB4MDAyODsKLSAgICB1aW50MTZfdCBsYXRlbmN5ID0gMHgwMDAwOwotICAgIHVpbnQxNl90IHRpbWVvdXQgPSAweDAwMWY0OwotICAgIHVpbnQxNl90IG1pbl9jZV9sZW4gPSAweDAwMDA7Ci0gICAgdWludDE2X3QgbWF4X2NlX2xlbiA9IDB4MDAwMDsKLSAgICBib29sIHVwZGF0ZV9hbGxvd2VkID0gdHJ1ZTsKLSAgfTsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGhjaTo6QWRkcmVzcywgQ29ubmVjdGlvblBhcmFtZXRlcj4gY29ubl9wYXJhbWV0ZXJzXzsKLSAgdEwyQ0FQX0ZJWEVEX0NITkxfUkVHIGZyZWdfOwotfTsKLQotc3RhdGljIExlRml4ZWRDaGFubmVsSGVscGVyIGF0dF9oZWxwZXJ7NH07Ci1zdGF0aWMgTGVGaXhlZENoYW5uZWxIZWxwZXIgc21wX2hlbHBlcns2fTsKLXN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QsIExlRml4ZWRDaGFubmVsSGVscGVyJj4KLSAgICBsZV9maXhlZF9jaGFubmVsX2hlbHBlcl97Ci0gICAgICAgIHs0LCBhdHRfaGVscGVyfSwKLSAgICAgICAgezYsIHNtcF9oZWxwZXJ9LAotICAgIH07Ci0KLS8qKgotICogRml4ZWQgQ2hhbm5lbCBBUElzLiBOb3RlOiBDbGFzc2ljIGZpeGVkIGNoYW5uZWwgKGNvbm5lY3Rpb25sZXNzIGFuZCBCUiBTTVApCi0gKiBpcyBub3Qgc3VwcG9ydGVkCi0gKi8KLWJvb2wgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbCh1aW50MTZfdCBjaWQsIHRMMkNBUF9GSVhFRF9DSE5MX1JFRyogcF9mcmVnKSB7Ci0gIGlmIChjaWQgIT0ga0F0dENpZCAmJiBjaWQgIT0ga1NtcENpZCkgewotICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgY2lkOiAiIDw8IGNpZDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byogaGVscGVyID0gJmxlX2ZpeGVkX2NoYW5uZWxfaGVscGVyXy5maW5kKGNpZCktPnNlY29uZDsKLSAgaWYgKGhlbHBlciA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2FuJ3QgcmVnaXN0ZXIgY2lkICIgPDwgY2lkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBHZXRMMmNhcExlTW9kdWxlKCktPkdldEZpeGVkQ2hhbm5lbE1hbmFnZXIoKS0+UmVnaXN0ZXJTZXJ2aWNlKAotICAgICAgY2lkLAotICAgICAgY29tbW9uOjpCaW5kT25jZSgmTGVGaXhlZENoYW5uZWxIZWxwZXI6Om9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uOjpVbnJldGFpbmVkKGhlbHBlcikpLAotICAgICAgY29tbW9uOjpCaW5kKCZMZUZpeGVkQ2hhbm5lbEhlbHBlcjo6b25fY2hhbm5lbF9vcGVuLAotICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChoZWxwZXIpKSwKLSAgICAgIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gIGhlbHBlci0+ZnJlZ18gPSAqcF9mcmVnOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBMMkNBX0Nvbm5lY3RGaXhlZENobmwodWludDE2X3QgY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7Ci0gIGlmIChjaWQgIT0ga0F0dENpZCAmJiBjaWQgIT0ga1NtcENpZCkgewotICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgY2lkICIgPDwgY2lkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGF1dG8qIGhlbHBlciA9ICZsZV9maXhlZF9jaGFubmVsX2hlbHBlcl8uZmluZChjaWQpLT5zZWNvbmQ7Ci0gIGF1dG8gcmVtb3RlID0gQnRtOjpHZXRBZGRyZXNzQW5kVHlwZShyZW1fYmRhKTsKLSAgYXV0byByZWNvcmQgPQotICAgICAgbGVfbGlua19wcm9wZXJ0eV9saXN0ZW5lcl9zaGltXy5pbmZvXy5maW5kKFRvR2RBZGRyZXNzKHJlbV9iZGEpKTsKLSAgaWYgKHJlY29yZCAhPSBsZV9saW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fLmluZm9fLmVuZCgpKSB7Ci0gICAgcmVtb3RlID0gcmVjb3JkLT5zZWNvbmQuYWRkcmVzc193aXRoX3R5cGU7Ci0gIH0KLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCByZW1vdGUuVG9TdHJpbmcoKTsKLSAgYXV0byBtYW5hZ2VyID0gR2V0TDJjYXBMZU1vZHVsZSgpLT5HZXRGaXhlZENoYW5uZWxNYW5hZ2VyKCk7Ci0gIG1hbmFnZXItPkNvbm5lY3RTZXJ2aWNlcygKLSAgICAgIHJlbW90ZSwKLSAgICAgIGNvbW1vbjo6QmluZE9uY2UoJkxlRml4ZWRDaGFubmVsSGVscGVyOjpvbl9vdXRnb2luZ19jb25uZWN0aW9uX2ZhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjo6VW5yZXRhaW5lZChoZWxwZXIpLCByZW1fYmRhKSwKLSAgICAgIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi11aW50MTZfdCBMMkNBX1NlbmRGaXhlZENobmxEYXRhKHVpbnQxNl90IGNpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZikgewotICBpZiAoY2lkICE9IGtBdHRDaWQgJiYgY2lkICE9IGtTbXBDaWQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGNpZCAiIDw8IGNpZDsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIEwyQ0FQX0RXX0ZBSUxFRDsKLSAgfQotICBhdXRvKiBoZWxwZXIgPSAmbGVfZml4ZWRfY2hhbm5lbF9oZWxwZXJfLmZpbmQoY2lkKS0+c2Vjb25kOwotICBhdXRvIGxlbiA9IHBfYnVmLT5sZW47Ci0gIGF1dG8qIGRhdGEgPSBwX2J1Zi0+ZGF0YSArIHBfYnVmLT5vZmZzZXQ7Ci0gIGJvb2wgc2VudCA9Ci0gICAgICBoZWxwZXItPnNlbmQoVG9HZEFkZHJlc3MocmVtX2JkYSksCi0gICAgICAgICAgICAgICAgICAgTWFrZVVuaXF1ZVBhY2tldChkYXRhLCBsZW4sIElzUGFja2V0Rmx1c2hhYmxlKHBfYnVmKSkpOwotICBvc2lfZnJlZShwX2J1Zik7Ci0gIHJldHVybiBzZW50ID8gTDJDQVBfRFdfU1VDQ0VTUyA6IEwyQ0FQX0RXX0ZBSUxFRDsKLX0KLQotYm9vbCBMMkNBX1JlbW92ZUZpeGVkQ2hubCh1aW50MTZfdCBjaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgaWYgKGNpZCAhPSBrQXR0Q2lkICYmIGNpZCAhPSBrU21wQ2lkKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBjaWQgIiA8PCBjaWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8qIGhlbHBlciA9ICZsZV9maXhlZF9jaGFubmVsX2hlbHBlcl8uZmluZChjaWQpLT5zZWNvbmQ7Ci0gIGF1dG8gY2hhbm5lbCA9IGhlbHBlci0+Y2hhbm5lbHNfLmZpbmQoVG9HZEFkZHJlc3MocmVtX2JkYSkpOwotICBpZiAoY2hhbm5lbCA9PSBoZWxwZXItPmNoYW5uZWxzXy5lbmQoKSB8fCBjaGFubmVsLT5zZWNvbmQgPT0gbnVsbHB0cikgewotICAgIExPRyhFUlJPUikgPDwgIkNoYW5uZWwgaXMgbm90IG9wZW4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjaGFubmVsLT5zZWNvbmQtPlJlbGVhc2UoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQxNl90IEwyQ0FfR2V0TGVIYW5kbGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSkgewotICBhdXRvIGFkZHIgPSBUb0dkQWRkcmVzcyhyZW1fYmRhKTsKLSAgaWYgKGxlX2xpbmtfcHJvcGVydHlfbGlzdGVuZXJfc2hpbV8uaW5mb18uY291bnQoYWRkcikgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBsZV9saW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fLmluZm9fW2FkZHJdLmhhbmRsZTsKLX0KLQotdm9pZCBMMkNBX0xlQ29ubmVjdGlvblVwZGF0ZShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfaW50LCB1aW50MTZfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIGF1dG8qIGhlbHBlciA9ICZsZV9maXhlZF9jaGFubmVsX2hlbHBlcl8uZmluZChrQXR0Q2lkKS0+c2Vjb25kOwotICBhdXRvIGNoYW5uZWwgPSBoZWxwZXItPmNoYW5uZWxzXy5maW5kKFRvR2RBZGRyZXNzKHJlbV9iZGEpKTsKLSAgaWYgKGNoYW5uZWwgPT0gaGVscGVyLT5jaGFubmVsc18uZW5kKCkgfHwgY2hhbm5lbC0+c2Vjb25kID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJDaGFubmVsIGlzIG5vdCBvcGVuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvJiBwYXJhbWV0ZXIgPSBoZWxwZXItPmNvbm5fcGFyYW1ldGVyc19bVG9HZEFkZHJlc3MocmVtX2JkYSldOwotCi0gIHBhcmFtZXRlci5taW5faW50ID0gbWluX2ludDsKLSAgcGFyYW1ldGVyLm1heF9pbnQgPSBtYXhfaW50OwotICBwYXJhbWV0ZXIubGF0ZW5jeSA9IGxhdGVuY3k7Ci0gIHBhcmFtZXRlci50aW1lb3V0ID0gdGltZW91dDsKLSAgcGFyYW1ldGVyLm1pbl9jZV9sZW4gPSBtaW5fY2VfbGVuOwotICBwYXJhbWV0ZXIubWF4X2NlX2xlbiA9IG1heF9jZV9sZW47Ci0KLSAgaWYgKHBhcmFtZXRlci51cGRhdGVfYWxsb3dlZCkgewotICAgIGNoYW5uZWwtPnNlY29uZC0+R2V0TGlua09wdGlvbnMoKS0+VXBkYXRlQ29ubmVjdGlvblBhcmFtZXRlcigKLSAgICAgICAgbWluX2ludCwgbWF4X2ludCwgbGF0ZW5jeSwgdGltZW91dCwgbWluX2NlX2xlbiwgbWF4X2NlX2xlbik7Ci0gIH0KLSAgLy8gSWYgdXBkYXRlIG5vdCBhbGxvd2VkLCBkb24ndCB1cGRhdGU7IGluc3RlYWQgY2FjaGUgdGhlIHZhbHVlLCBhbmQgdXBkYXRlCi0gIC8vIHdoZW4gdXBkYXRlIGlzIGFsbG93ZWQuCi19Ci0KLWJvb2wgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIGJvb2wgZW5hYmxlKSB7Ci0gIC8vIFdoZW4gZW5hYmxlIGlzIGZhbHNlLCB3ZSBkaXNhbGxvdyByZW1vdGUgY29ubmVjdGlvbiB1cGRhdGUgcmVxdWVzdCwgYW5kCi0gIC8vIHdlIHVzZSBkZWZhdWx0IHBhcmFtZXRlcnMgdGVtcG9yYXJpbHkuCi0gIGF1dG8qIGhlbHBlciA9ICZsZV9maXhlZF9jaGFubmVsX2hlbHBlcl8uZmluZChrQXR0Q2lkKS0+c2Vjb25kOwotICBhdXRvIGNoYW5uZWwgPSBoZWxwZXItPmNoYW5uZWxzXy5maW5kKFRvR2RBZGRyZXNzKHJlbV9iZGEpKTsKLSAgaWYgKGNoYW5uZWwgPT0gaGVscGVyLT5jaGFubmVsc18uZW5kKCkgfHwgY2hhbm5lbC0+c2Vjb25kID09IG51bGxwdHIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJDaGFubmVsIGlzIG5vdCBvcGVuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdXRvJiBwYXJhbWV0ZXIgPSBoZWxwZXItPmNvbm5fcGFyYW1ldGVyc19bVG9HZEFkZHJlc3MocmVtX2JkYSldOwotICBwYXJhbWV0ZXIudXBkYXRlX2FsbG93ZWQgPSBlbmFibGU7Ci0gIC8vIFRPRE8oaHN6KTogTm90aWZ5IEhDSV9BQ0wgTEUgdG8gYWxsb3cvZGlzYWxsb3cgcmVtb3RlIHJlcXVlc3QuCi0KLSAgaWYgKHBhcmFtZXRlci51cGRhdGVfYWxsb3dlZCkgewotICAgIC8vIFVzZSBjYWNoZWQgdmFsdWVzCi0gICAgdWludDE2X3QgbWluX2ludCA9IHBhcmFtZXRlci5taW5faW50OwotICAgIHVpbnQxNl90IG1heF9pbnQgPSBwYXJhbWV0ZXIubWF4X2ludDsKLSAgICB1aW50MTZfdCBsYXRlbmN5ID0gcGFyYW1ldGVyLmxhdGVuY3k7Ci0gICAgdWludDE2X3QgdGltZW91dCA9IHBhcmFtZXRlci50aW1lb3V0OwotICAgIHVpbnQxNl90IG1pbl9jZV9sZW4gPSBwYXJhbWV0ZXIubWluX2NlX2xlbjsKLSAgICB1aW50MTZfdCBtYXhfY2VfbGVuID0gcGFyYW1ldGVyLm1heF9jZV9sZW47Ci0gICAgY2hhbm5lbC0+c2Vjb25kLT5HZXRMaW5rT3B0aW9ucygpLT5VcGRhdGVDb25uZWN0aW9uUGFyYW1ldGVyKAotICAgICAgICBtaW5faW50LCBtYXhfaW50LCBsYXRlbmN5LCB0aW1lb3V0LCBtaW5fY2VfbGVuLCBtYXhfY2VfbGVuKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBVc2UgdGhlIHZhbHVlIGZyb20gbGVnYWN5IGwyY2JsZV9zdGFydF9jb25uX3VwZGF0ZQotICAgIHVpbnQxNl90IG1pbl9pbnQgPSBCVE1fQkxFX0NPTk5fSU5UX01JTjsKLSAgICB1aW50MTZfdCBtYXhfaW50ID0gQlRNX0JMRV9DT05OX0lOVF9NSU47Ci0gICAgTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzKCZtaW5faW50LCAmbWF4X2ludCwgQlRNX0JMRV9DT05OX0lOVF9NSU4pOwotICAgIHVpbnQxNl90IGxhdGVuY3kgPSBCVE1fQkxFX0NPTk5fUEVSSVBIRVJBTF9MQVRFTkNZX0RFRjsKLSAgICB1aW50MTZfdCB0aW1lb3V0ID0gQlRNX0JMRV9DT05OX1RJTUVPVVRfREVGOwotICAgIHVpbnQxNl90IG1pbl9jZV9sZW4gPSAweDAwMDA7Ci0gICAgdWludDE2X3QgbWF4X2NlX2xlbiA9IDB4MDAwMDsKLSAgICBjaGFubmVsLT5zZWNvbmQtPkdldExpbmtPcHRpb25zKCktPlVwZGF0ZUNvbm5lY3Rpb25QYXJhbWV0ZXIoCi0gICAgICAgIG1pbl9pbnQsIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIENoYW5uZWwgaHlnaWVuZSBBUElzCi0gKi8KLWJvb2wgTDJDQV9HZXRSZW1vdGVDaWQodWludDE2X3QgbGNpZCwgdWludDE2X3QqIHJjaWQpIHsKLSAgYXV0byBwc20gPSBjbGFzc2ljX2NpZF90b2tlbl90b19jaGFubmVsX21hcF9bbGNpZF07Ci0gIGlmIChjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5jb3VudChwc20pID09IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJOb3QgcmVnaXN0ZXJlZCBwc206ICIgPDwgcHNtOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqcmNpZCA9IGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPkdldFJlbW90ZUNpZChsY2lkKTsKLSAgcmV0dXJuICpyY2lkICE9IDA7Ci19Ci0KLWJvb2wgTDJDQV9TZXRUeFByaW9yaXR5KHVpbnQxNl90IGNpZCwgdEwyQ0FQX0NITkxfUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgYXV0byBwc20gPSBjbGFzc2ljX2NpZF90b2tlbl90b19jaGFubmVsX21hcF9bY2lkXTsKLSAgaWYgKGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmNvdW50KHBzbSkgPT0gMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIk5vdCByZWdpc3RlcmVkIHBzbTogIiA8PCBwc207Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgaGlnaF9wcmlvcml0eSA9IHByaW9yaXR5ID09IEwyQ0FQX0NITkxfUFJJT1JJVFlfSElHSDsKLSAgcmV0dXJuIGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPlNldENoYW5uZWxUeFByaW9yaXR5KAotICAgICAgY2lkLCBoaWdoX3ByaW9yaXR5KTsKLX0KLQotYm9vbCBMMkNBX1NldExlR2F0dFRpbWVvdXQoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDE2X3QgaWRsZV90b3V0KSB7Ci0gIGlmIChpZGxlX3RvdXQgPT0gMHhmZmZmKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Nvbm5lY3RGaXhlZENobmwoa0xlQXR0cmlidXRlQ2lkLCByZW1fYmRhKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVtb3ZlRml4ZWRDaG5sKGtMZUF0dHJpYnV0ZUNpZCwgcmVtX2JkYSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTDJDQV9TZXRDaG5sRmx1c2hhYmlsaXR5KHVpbnQxNl90IGNpZCwgYm9vbCBpc19mbHVzaGFibGUpIHsKLSAgTE9HX0lORk8oIlVOSU1QTEVNRU5URUQgJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdWludDE2X3QgTDJDQV9GbHVzaENoYW5uZWwodWludDE2X3QgbGNpZCwgdWludDE2X3QgbnVtX3RvX2ZsdXNoKSB7Ci0gIGF1dG8gcHNtID0gY2xhc3NpY19jaWRfdG9rZW5fdG9fY2hhbm5lbF9tYXBfW2xjaWRdOwotICBpZiAoY2xhc3NpY19keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQocHNtKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm90IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobnVtX3RvX2ZsdXNoID09IEwyQ0FQX0ZMVVNIX0NIQU5TX0dFVCkgewotICAgIHJldHVybiBjbGFzc2ljX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dLT5HZXROdW1CdWZmZXJlZFBhY2tldHMoCi0gICAgICAgIGxjaWQpOwotICB9IGVsc2UgewotICAgIGNsYXNzaWNfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPkZsdXNoQ2hhbm5lbChsY2lkKTsKLSAgICByZXR1cm4gMTsgIC8vIENsaWVudCBkb2Vzbid0IGNhcmUKLSAgfQotICAvLyBUT0RPOiBJbXBsZW1lbnQgTEUgcGFydAotfQotCi1ib29sIEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICByZXR1cm4gc2VjdXJpdHlfbGlzdGVuZXJfc2hpbV8uSXNMaW5rVXAoYmRfYWRkcik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRMZUhhbmRsZShiZF9hZGRyKSAhPSAwOwotICB9Ci19Ci0KLWJvb2wgTDJDQV9Jc0xlTGluayh1aW50MTZfdCBhY2xfaGFuZGxlKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBsZV9saW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fLmluZm9fKSB7Ci0gICAgaWYgKGVudHJ5LnNlY29uZC5oYW5kbGUgPT0gYWNsX2hhbmRsZSkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEwyQ0FfUmVhZENvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBjb25uX2FkZHIsIHVpbnQ4X3QqIHBfYWRkcl90eXBlKSB7Ci0gIGF1dG8qIGhlbHBlciA9ICZsZV9maXhlZF9jaGFubmVsX2hlbHBlcl8uZmluZChrU21wQ2lkKS0+c2Vjb25kOwotICBhdXRvIGNoYW5uZWwgPSBoZWxwZXItPmNoYW5uZWxzXy5maW5kKFRvR2RBZGRyZXNzKHBzZXVkb19hZGRyKSk7Ci0gIGlmIChjaGFubmVsID09IGhlbHBlci0+Y2hhbm5lbHNfLmVuZCgpIHx8IGNoYW5uZWwtPnNlY29uZCA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2hhbm5lbCBpcyBub3Qgb3BlbiEiOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvIGxvY2FsID0gY2hhbm5lbC0+c2Vjb25kLT5HZXRMaW5rT3B0aW9ucygpLT5HZXRMb2NhbEFkZHJlc3MoKTsKLSAgY29ubl9hZGRyID0gVG9SYXdBZGRyZXNzKGxvY2FsLkdldEFkZHJlc3MoKSk7Ci0gICpwX2FkZHJfdHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxvY2FsLkdldEFkZHJlc3NUeXBlKCkpOwotfQotCi1ib29sIEwyQ0FfUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYWRkcl90eXBlKSB7Ci0gIGF1dG8gcmVtb3RlID0gVG9HZEFkZHJlc3MocHNldWRvX2FkZHIpOwotICBpZiAobGVfbGlua19wcm9wZXJ0eV9saXN0ZW5lcl9zaGltXy5pbmZvXy5jb3VudChyZW1vdGUpID09IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IFVua25vd24gYWRkcmVzcyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8gaW5mbyA9IGxlX2xpbmtfcHJvcGVydHlfbGlzdGVuZXJfc2hpbV8uaW5mb19bcmVtb3RlXS5hZGRyZXNzX3dpdGhfdHlwZTsKLSAgY29ubl9hZGRyID0gVG9SYXdBZGRyZXNzKGluZm8uR2V0QWRkcmVzcygpKTsKLSAgKnBfYWRkcl90eXBlID0gc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KGluZm8uR2V0QWRkcmVzc1R5cGUoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1oY2lfcm9sZV90IEwyQ0FfR2V0QmxlQ29ublJvbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBhdXRvIHJlbW90ZSA9IFRvR2RBZGRyZXNzKGJkX2FkZHIpOwotICBpZiAobGVfbGlua19wcm9wZXJ0eV9saXN0ZW5lcl9zaGltXy5pbmZvXy5jb3VudChyZW1vdGUpID09IDApIHsKLSAgICByZXR1cm4gSENJX1JPTEVfVU5LTk9XTjsKLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8aGNpX3JvbGVfdD4oCi0gICAgICBsZV9saW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fLmluZm9fW3JlbW90ZV0ucm9sZSk7Ci19Ci0KLXZvaWQgTDJDQV9Db25uZWN0Rm9yU2VjdXJpdHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzZWN1cml0eV9pbnRlcmZhY2VfLT5Jbml0aWF0ZUNvbm5lY3Rpb25Gb3JTZWN1cml0eSgKLSAgICAgIGJsdWV0b290aDo6VG9HZEFkZHJlc3MoYmRfYWRkcikpOwotfQotCi12b2lkIEwyQ0FfU2V0Qm9uZGluZ1N0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfYm9uZGluZykgewotICBzZWN1cml0eV9saXN0ZW5lcl9zaGltXy5VcGRhdGVMaW5rSG9sZEZvclNlY3VyaXR5KGJkX2FkZHIsIGlzX2JvbmRpbmcpOwotfQotCi12b2lkIEwyQ0FfRGlzY29ubmVjdExpbmsoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlKSB7Ci0gIHNlY3VyaXR5X2xpc3RlbmVyX3NoaW1fLkRpc2Nvbm5lY3QocmVtb3RlKTsKLX0KLQotdWludDE2X3QgTDJDQV9HZXROdW1MaW5rcygpIHsgcmV0dXJuIHNlY3VyaXR5X2xpc3RlbmVyX3NoaW1fLkdldE51bUFjbExpbmtzKCk7IH0KLQotLy8gTEUgQ09DIFNoaW0gSGVscGVyCi0KLW5hbWVzcGFjZSB7Ci0KLXVpbnQxNl90IGxlX2NpZF90b2tlbl9jb3VudGVyXyA9IDB4NDE7Ci0KLXN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCAvKiB0b2tlbiAqLywgdWludDE2X3QgLyogcHNtICovPgotICAgIGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF87Ci0KLXVpbnQxNl90IGFkZF9sZV9jaWRfdG9rZW5fZW50cnkodWludDE2X3QgcHNtKSB7Ci0gIHVpbnQxNl90IG5ld190b2tlbiA9IGxlX2NpZF90b2tlbl9jb3VudGVyXzsKLSAgbGVfY2lkX3Rva2VuX3RvX2NoYW5uZWxfbWFwX1tuZXdfdG9rZW5dID0gcHNtOwotICBsZV9jaWRfdG9rZW5fY291bnRlcl8rKzsKLSAgaWYgKGxlX2NpZF90b2tlbl9jb3VudGVyXyA9PSAwKSBsZV9jaWRfdG9rZW5fY291bnRlcl8gPSAweDQxOwotICByZXR1cm4gbmV3X3Rva2VuOwotfQotCi12b2lkIHJlbW92ZV9sZV9jaWRfdG9rZW5fZW50cnkodWludDE2X3QgY2lkX3Rva2VuKSB7Ci0gIGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF8uZXJhc2UoY2lkX3Rva2VuKTsKLX0KLQotdm9pZCByZW1vdmVfbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcih1aW50MTZfdCBwc20pOwotCi1zdHJ1Y3QgTGVEeW5hbWljQ2hhbm5lbEhlbHBlciB7Ci0gIExlRHluYW1pY0NoYW5uZWxIZWxwZXIodWludDE2X3QgcHNtLCB0TDJDQVBfQVBQTF9JTkZPIGFwcGxfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZTo6RHluYW1pY0NoYW5uZWxDb25maWd1cmF0aW9uT3B0aW9uIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZTo6U2VjdXJpdHlQb2xpY3kgcG9saWN5KQotICAgICAgOiBwc21fKHBzbSksIGFwcGxfaW5mb18oYXBwbF9pbmZvKSwgY29uZmlnXyhjb25maWcpLCBwb2xpY3lfKHBvbGljeSkge30KLQotICB1aW50MTZfdCBwc21fOwotICB0TDJDQVBfQVBQTF9JTkZPIGFwcGxfaW5mb187Ci0gIGxlOjpEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gY29uZmlnXzsKLSAgbGU6OlNlY3VyaXR5UG9saWN5IHBvbGljeV87Ci0KLSAgdm9pZCBSZWdpc3RlcigpIHsKLSAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UuZ2V0X2Z1dHVyZSgpOwotICAgIEdldEwyY2FwTGVNb2R1bGUoKS0+R2V0RHluYW1pY0NoYW5uZWxNYW5hZ2VyKCktPlJlZ2lzdGVyU2VydmljZSgKLSAgICAgICAgcHNtXywgY29uZmlnXywgcG9saWN5XywKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJkxlRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX3JlZ2lzdHJhdGlvbl9jb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgc3RkOjptb3ZlKHByb21pc2UpKSwKLSAgICAgICAgYmFzZTo6QmluZCgmTGVEeW5hbWljQ2hhbm5lbEhlbHBlcjo6b25fY2hhbm5lbF9vcGVuLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIDApLAotICAgICAgICBHZXRHZFNoaW1IYW5kbGVyKCkpOwotICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMwMCkpOwotICB9Ci0KLSAgdm9pZCBvbl9yZWdpc3RyYXRpb25fY29tcGxldGUoCi0gICAgICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSwKLSAgICAgIGxlOjpEeW5hbWljQ2hhbm5lbE1hbmFnZXI6OlJlZ2lzdHJhdGlvblJlc3VsdCByZXN1bHQsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8bGU6OkR5bmFtaWNDaGFubmVsU2VydmljZT4gc2VydmljZSkgewotICAgIGlmIChyZXN1bHQgIT0gbGU6OkR5bmFtaWNDaGFubmVsTWFuYWdlcjo6UmVnaXN0cmF0aW9uUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJDaGFubmVsIGlzIG5vdCByZWdpc3RlcmVkLiBwc209IiA8PCArcHNtXyA8PCAoaW50KXJlc3VsdDsKLSAgICAgIHByb21pc2Uuc2V0X3ZhbHVlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYW5uZWxfc2VydmljZV8gPSBzdGQ6Om1vdmUoc2VydmljZSk7Ci0gICAgcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxsZTo6RHluYW1pY0NoYW5uZWxTZXJ2aWNlPiBjaGFubmVsX3NlcnZpY2VfID0gbnVsbHB0cjsKLQotICB2b2lkIENvbm5lY3QodWludDE2X3QgY2lkX3Rva2VuLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGRldmljZSkgewotICAgIGlmIChjaGFubmVsX3NlcnZpY2VfID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIk5vdCByZWdpc3RlcmVkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW5pdGlhdGVkX2J5X3VzX1tjaWRfdG9rZW5dID0gdHJ1ZTsKLSAgICBHZXRMMmNhcExlTW9kdWxlKCktPkdldER5bmFtaWNDaGFubmVsTWFuYWdlcigpLT5Db25uZWN0Q2hhbm5lbCgKLSAgICAgICAgZGV2aWNlLCBjb25maWdfLCBwc21fLAotICAgICAgICBiYXNlOjpCaW5kKCZMZUR5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9jaGFubmVsX29wZW4sCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2lkX3Rva2VuKSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJkxlRHluYW1pY0NoYW5uZWxIZWxwZXI6Om9uX291dGdvaW5nX2Nvbm5lY3Rpb25fZmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgIEdldEdkU2hpbUhhbmRsZXIoKSk7Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QodWludDE2X3QgY2lkX3Rva2VuKSB7Ci0gICAgaWYgKGNoYW5uZWxfc2VydmljZV8gPT0gbnVsbHB0cikgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY2hhbm5lbHNfLmNvdW50KGNpZF90b2tlbikgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjaGFubmVsc19bY2lkX3Rva2VuXS0+Q2xvc2UoKTsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3RlcigpIHsKLSAgICBpZiAoY2hhbm5lbF9zZXJ2aWNlXyAhPSBudWxscHRyKSB7Ci0gICAgICBjaGFubmVsX3NlcnZpY2VfLT5VbnJlZ2lzdGVyKAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZMZUR5bmFtaWNDaGFubmVsSGVscGVyOjpvbl91bnJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAgICAgR2V0R2RTaGltSGFuZGxlcigpKTsKLSAgICAgIGNoYW5uZWxfc2VydmljZV8gPSBudWxscHRyOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fdW5yZWdpc3RlcmVkKCkgewotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogY2hhbm5lbHNfKSB7Ci0gICAgICBkZXZpY2Uuc2Vjb25kLT5DbG9zZSgpOwotICAgIH0KLSAgICByZW1vdmVfbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcihwc21fKTsKLSAgfQotCi0gIHZvaWQgb25fY2hhbm5lbF9jbG9zZSh1aW50MTZfdCBjaWRfdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlIGVycm9yX2NvZGUpIHsKLSAgICBjaGFubmVsX2VucXVldWVfYnVmZmVyX1tjaWRfdG9rZW5dID0gbnVsbHB0cjsKLSAgICBjaGFubmVsX2VucXVldWVfYnVmZmVyXy5lcmFzZShjaWRfdG9rZW4pOwotICAgIGNoYW5uZWxzX1tjaWRfdG9rZW5dLT5HZXRRdWV1ZVVwRW5kKCktPlVucmVnaXN0ZXJEZXF1ZXVlKCk7Ci0gICAgY2hhbm5lbHNfLmVyYXNlKGNpZF90b2tlbik7Ci0gICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGFwcGxfaW5mb18ucEwyQ0FfRGlzY29ubmVjdEluZF9DYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkX3Rva2VuLCBmYWxzZSkpOwotCi0gICAgcmVtb3ZlX2xlX2NpZF90b2tlbl9lbnRyeShjaWRfdG9rZW4pOwotICAgIGluaXRpYXRlZF9ieV91c18uZXJhc2UoY2lkX3Rva2VuKTsKLQotICAgIGlmIChjaGFubmVsX3NlcnZpY2VfID09IG51bGxwdHIgJiYgY2hhbm5lbHNfLmVtcHR5KCkpIHsKLSAgICAgIC8vIFRyeSBhZ2FpbgotICAgICAgTDJDQV9EZXJlZ2lzdGVyKHBzbV8pOwotICAgIH0KLSAgfQotCi0gIHZvaWQgb25fY2hhbm5lbF9vcGVuKHVpbnQxNl90IGNpZF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGxlOjpEeW5hbWljQ2hhbm5lbD4gY2hhbm5lbCkgewotICAgIGF1dG8gZGV2aWNlID0gY2hhbm5lbC0+R2V0RGV2aWNlKCk7Ci0gICAgYXV0byBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3MoZGV2aWNlLkdldEFkZHJlc3MoKSk7Ci0gICAgYm9vbCBpbml0aWF0b3JfbG9jYWwgPSAoY2lkX3Rva2VuICE9IDApOwotICAgIGlmIChjaWRfdG9rZW4gPT0gMCkgewotICAgICAgY2lkX3Rva2VuID0gYWRkX2xlX2NpZF90b2tlbl9lbnRyeShwc21fKTsKLSAgICB9Ci0KLSAgICBjaGFubmVsLT5SZWdpc3Rlck9uQ2xvc2VDYWxsYmFjayhHZXRHZFNoaW1IYW5kbGVyKCktPkJpbmRPbmNlT24oCi0gICAgICAgIHRoaXMsICZMZUR5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9jaGFubmVsX2Nsb3NlLCBjaWRfdG9rZW4pKTsKLQotICAgIGNoYW5uZWwtPkdldFF1ZXVlVXBFbmQoKS0+UmVnaXN0ZXJEZXF1ZXVlKAotICAgICAgICBHZXRHZFNoaW1IYW5kbGVyKCksCi0gICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpCaW5kKCZMZUR5bmFtaWNDaGFubmVsSGVscGVyOjpvbl9pbmNvbWluZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6VW5yZXRhaW5lZCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkX3Rva2VuKSk7Ci0KLSAgICBjaGFubmVsX2VucXVldWVfYnVmZmVyX1tjaWRfdG9rZW5dID0gc3RkOjptYWtlX3VuaXF1ZTwKLSAgICAgICAgYmx1ZXRvb3RoOjpvczo6RW5xdWV1ZUJ1ZmZlcjxibHVldG9vdGg6OnBhY2tldDo6QmFzZVBhY2tldEJ1aWxkZXI+PigKLSAgICAgICAgY2hhbm5lbC0+R2V0UXVldWVVcEVuZCgpKTsKLQotICAgIGNoYW5uZWxzX1tjaWRfdG9rZW5dID0gc3RkOjptb3ZlKGNoYW5uZWwpOwotCi0gICAgaWYgKGluaXRpYXRvcl9sb2NhbCkgewotICAgICAgZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGFwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdENmbV9DYiwgY2lkX3Rva2VuLCAwKSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKGFwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdEluZF9DYiA9PSBudWxscHRyKSB7Ci0gICAgICAgIERpc2Nvbm5lY3QoY2lkX3Rva2VuKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGFwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdEluZF9DYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBjaWRfdG9rZW4sIHBzbV8sIDApKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIG9uX2luY29taW5nX2RhdGEodWludDE2X3QgY2lkX3Rva2VuKSB7Ci0gICAgYXV0byBjaGFubmVsID0gY2hhbm5lbHNfLmZpbmQoY2lkX3Rva2VuKTsKLSAgICBpZiAoY2hhbm5lbCA9PSBjaGFubmVsc18uZW5kKCkpIHsKLSAgICAgIExPR19FUlJPUigiQ2hhbm5lbCBpcyBub3Qgb3BlbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdXRvIHBhY2tldCA9IGNoYW5uZWwtPnNlY29uZC0+R2V0UXVldWVVcEVuZCgpLT5UcnlEZXF1ZXVlKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0X3ZlY3RvcihwYWNrZXQtPmJlZ2luKCksIHBhY2tldC0+ZW5kKCkpOwotICAgIEJUX0hEUiogYnVmZmVyID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8QlRfSERSKj4ob3NpX2NhbGxvYyhwYWNrZXRfdmVjdG9yLnNpemUoKSArIHNpemVvZihCVF9IRFIpKSk7Ci0gICAgc3RkOjpjb3B5KHBhY2tldF92ZWN0b3IuYmVnaW4oKSwgcGFja2V0X3ZlY3Rvci5lbmQoKSwgYnVmZmVyLT5kYXRhKTsKLSAgICBidWZmZXItPmxlbiA9IHBhY2tldF92ZWN0b3Iuc2l6ZSgpOwotICAgIGlmIChkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoYXBwbF9pbmZvXy5wTDJDQV9EYXRhSW5kX0NiLCBjaWRfdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChidWZmZXIpKSkgIT0KLSAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIG9zaV9mcmVlKGJ1ZmZlcik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBvbl9vdXRnb2luZ19jb25uZWN0aW9uX2ZhaWwoCi0gICAgICBsZTo6RHluYW1pY0NoYW5uZWxNYW5hZ2VyOjpDb25uZWN0aW9uUmVzdWx0IHJlc3VsdCkgewotICAgIExPRyhFUlJPUikgPDwgIk91dGdvaW5nIGNvbm5lY3Rpb24gZmFpbGVkIjsKLSAgfQotCi0gIGJvb2wgc2VuZCh1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgICBhdXRvIGJ1ZmZlciA9IGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfLmZpbmQoY2lkKTsKLSAgICBpZiAoYnVmZmVyID09IGNoYW5uZWxfZW5xdWV1ZV9idWZmZXJfLmVuZCgpIHx8IGJ1ZmZlci0+c2Vjb25kID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkNoYW5uZWwgaXMgbm90IG9wZW4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBidWZmZXItPnNlY29uZC0+RW5xdWV1ZShzdGQ6Om1vdmUocGFja2V0KSwgR2V0R2RTaGltSGFuZGxlcigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHVpbnQxNl90IEdldE10dSh1aW50MTZfdCBjaWRfdG9rZW4pIHsKLSAgICBpZiAoY2hhbm5lbHNfLmNvdW50KGNpZF90b2tlbikgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY2hhbm5lbHNfW2NpZF90b2tlbl0tPkdldE10dSgpKTsKLSAgfQotCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgc3RkOjp1bmlxdWVfcHRyPGxlOjpEeW5hbWljQ2hhbm5lbD4+IGNoYW5uZWxzXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpvczo6RW5xdWV1ZUJ1ZmZlcjwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJhc2VQYWNrZXRCdWlsZGVyPj4+Ci0gICAgICBjaGFubmVsX2VucXVldWVfYnVmZmVyXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBib29sPiBpbml0aWF0ZWRfYnlfdXNfOwotfTsKLQotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBzdGQ6OnVuaXF1ZV9wdHI8TGVEeW5hbWljQ2hhbm5lbEhlbHBlcj4+Ci0gICAgbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfOwotCi12b2lkIHJlbW92ZV9sZV9keW5hbWljX2NoYW5uZWxfaGVscGVyKHVpbnQxNl90IHBzbSkgewotICBpZiAobGVfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmNvdW50KHBzbSkgIT0gMCAmJgotICAgICAgbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPmNoYW5uZWxzXy5lbXB0eSgpKSB7Ci0gICAgbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfLmVyYXNlKHBzbSk7Ci0gIH0KLX0KLQotc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQxNl90PiBhc3NpZ25lZF9keW5hbWljX2xlX3BzbV87Ci11aW50MTZfdCBuZXh0X2Fzc2lnbmVkX2R5bmFtaWNfbGVfcHNtXyA9IDB4ODA7Ci19ICAvLyBuYW1lc3BhY2UKLQotLyoqCi0gKiBMZSBDb25uZWN0aW9uIE9yaWVudGVkIENoYW5uZWwgQVBJcwotICovCi0KLXVpbnQxNl90IEwyQ0FfQWxsb2NhdGVMZVBTTSgpIHsKLSAgaWYgKGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5zaXplKCkgPiAxMDApIHsKLSAgICBMT0dfRVJST1IoIldoeSBkbyB3ZSBuZWVkIG1vcmUgdGhhbiAxMDAgZHluYW1pYyBjaGFubmVsIFBTTXM/Iik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgd2hpbGUgKGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5jb3VudChuZXh0X2Fzc2lnbmVkX2R5bmFtaWNfbGVfcHNtXykpIHsKLSAgICBuZXh0X2Fzc2lnbmVkX2R5bmFtaWNfbGVfcHNtXysrOwotICAgIGlmIChuZXh0X2Fzc2lnbmVkX2R5bmFtaWNfbGVfcHNtXyA+IDB4ZmYpIHsKLSAgICAgIG5leHRfYXNzaWduZWRfZHluYW1pY19sZV9wc21fID0gMHg4MDsKLSAgICB9Ci0gIH0KLSAgYXNzaWduZWRfZHluYW1pY19sZV9wc21fLmVtcGxhY2UobmV4dF9hc3NpZ25lZF9keW5hbWljX2xlX3BzbV8pOwotICByZXR1cm4gbmV4dF9hc3NpZ25lZF9keW5hbWljX2xlX3BzbV87Ci19Ci0KLXZvaWQgTDJDQV9GcmVlTGVQU00odWludDE2X3QgcHNtKSB7IGFzc2lnbmVkX2R5bmFtaWNfbGVfcHNtXy5lcmFzZShwc20pOyB9Ci0KLXVpbnQxNl90IEwyQ0FfUmVnaXN0ZXJMRUNvYyh1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwsIHRMMkNBUF9MRV9DRkdfSU5GTyBjZmcpIHsKLSAgaWYgKGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5jb3VudChwc20pICE9IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJBbHJlYWR5IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGxlOjpEeW5hbWljQ2hhbm5lbENvbmZpZ3VyYXRpb25PcHRpb24gY29uZmlnOwotICBjb25maWcubXR1ID0gY2ZnLm10dTsKLSAgbGU6OlNlY3VyaXR5UG9saWN5IHBvbGljeSA9Ci0gICAgICBsZTo6U2VjdXJpdHlQb2xpY3k6Ok5PX1NFQ1VSSVRZX1dIQVRTT0VWRVJfUExBSU5URVhUX1RSQU5TUE9SVF9PSzsKLSAgaWYgKHNlY19sZXZlbCAmIChCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURSkpIHsKLSAgICBwb2xpY3kgPSBsZTo6U2VjdXJpdHlQb2xpY3k6OkFVVEhFTlRJQ0FURURfRU5DUllQVEVEX1RSQU5TUE9SVDsKLSAgfQotCi0gIGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8TGVEeW5hbWljQ2hhbm5lbEhlbHBlcj4ocHNtLCBjYWxsYmFja3MsIGNvbmZpZywgcG9saWN5KTsKLSAgbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPlJlZ2lzdGVyKCk7Ci0gIHJldHVybiBwc207Ci19Ci0KLXZvaWQgTDJDQV9EZXJlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtKSB7Ci0gIGlmIChsZV9keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQocHNtKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm90IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbGVfZHluYW1pY19jaGFubmVsX2hlbHBlcl9tYXBfW3BzbV0tPlVucmVnaXN0ZXIoKTsKLX0KLQotdWludDE2X3QgTDJDQV9Db25uZWN0TEVDb2NSZXEodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIGlmIChsZV9keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQocHNtKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm90IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICByZXR1cm4gMDsKLSAgfQotICB1aW50MTZfdCBjaWRfdG9rZW4gPSBhZGRfbGVfY2lkX3Rva2VuX2VudHJ5KHBzbSk7Ci0gIGF1dG8gcmVtb3RlID0gQnRtOjpHZXRBZGRyZXNzQW5kVHlwZShwX2JkX2FkZHIpOwotICBhdXRvIHJlY29yZCA9Ci0gICAgICBsZV9saW5rX3Byb3BlcnR5X2xpc3RlbmVyX3NoaW1fLmluZm9fLmZpbmQoVG9HZEFkZHJlc3MocF9iZF9hZGRyKSk7Ci0gIGlmIChyZWNvcmQgIT0gbGVfbGlua19wcm9wZXJ0eV9saXN0ZW5lcl9zaGltXy5pbmZvXy5lbmQoKSkgewotICAgIHJlbW90ZSA9IHJlY29yZC0+c2Vjb25kLmFkZHJlc3Nfd2l0aF90eXBlOwotICB9Ci0gIGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dLT5Db25uZWN0KGNpZF90b2tlbiwgcmVtb3RlKTsKLSAgcmV0dXJuIGNpZF90b2tlbjsKLX0KLQotYm9vbCBMMkNBX0dldFBlZXJMRUNvY0NvbmZpZyh1aW50MTZfdCBjaWQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpIHsKLSAgaWYgKGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF8uY291bnQoY2lkKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBjaWQ6ICIgPDwgY2lkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIHBzbSA9IGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF9bY2lkXTsKLSAgaWYgKGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5jb3VudChwc20pID09IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJOb3QgcmVnaXN0ZXJlZCBwc206ICIgPDwgcHNtOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIG10dSA9IGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwX1twc21dLT5HZXRNdHUoY2lkKTsKLSAgcGVlcl9jZmctPm10dSA9IG10dTsKLSAgcmV0dXJuIG10dTsKLX0KLQotYm9vbCBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcSh1aW50MTZfdCBjaWQpIHsKLSAgaWYgKGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF8uY291bnQoY2lkKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBjaWQ6ICIgPDwgY2lkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIHBzbSA9IGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF9bY2lkXTsKLSAgaWYgKGxlX2R5bmFtaWNfY2hhbm5lbF9oZWxwZXJfbWFwXy5jb3VudChwc20pID09IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJOb3QgcmVnaXN0ZXJlZCBwc206ICIgPDwgcHNtOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBsZV9keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF9bcHNtXS0+RGlzY29ubmVjdChjaWQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDhfdCBMMkNBX0xFQ29jRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgaWYgKGxlX2NpZF90b2tlbl90b19jaGFubmVsX21hcF8uY291bnQoY2lkKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBjaWQ6ICIgPDwgY2lkOwotICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgYXV0byBwc20gPSBsZV9jaWRfdG9rZW5fdG9fY2hhbm5lbF9tYXBfW2NpZF07Ci0gIGlmIChsZV9keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF8uY291bnQocHNtKSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiTm90IHJlZ2lzdGVyZWQgcHNtOiAiIDw8IHBzbTsKLSAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGF1dG8gbGVuID0gcF9kYXRhLT5sZW47Ci0gIGF1dG8qIGRhdGEgPSBwX2RhdGEtPmRhdGEgKyBwX2RhdGEtPm9mZnNldDsKLSAgdWludDhfdCBzZW50X2xlbmd0aCA9Ci0gICAgICBsZV9keW5hbWljX2NoYW5uZWxfaGVscGVyX21hcF9bcHNtXS0+c2VuZCgKLSAgICAgICAgICBjaWQsIE1ha2VVbmlxdWVQYWNrZXQoZGF0YSwgbGVuLCBJc1BhY2tldEZsdXNoYWJsZShwX2RhdGEpKSkgKgotICAgICAgbGVuOwotICBvc2lfZnJlZShwX2RhdGEpOwotICByZXR1cm4gc2VudF9sZW5ndGg7Ci19Ci0KLXZvaWQgTDJDQV9Td2l0Y2hSb2xlVG9DZW50cmFsKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgR2V0QWNsTWFuYWdlcigpLT5Td2l0Y2hSb2xlKFRvR2RBZGRyZXNzKGFkZHIpLCBibHVldG9vdGg6OmhjaTo6Um9sZTo6Q0VOVFJBTCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vbDJjX2FwaS5oIGIvbWFpbi9zaGltL2wyY19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMGNlYS4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vbDJjX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBmb3IgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQU00gdG8gdXNlIG9yIHplcm8gaWYgZXJyb3IuIFR5cGljYWxseSwgdGhlIFBTTSByZXR1cm5lZAotICogICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB3YXMgcGFzc2VkIGluLCBidXQgZm9yIGFuIG91dGdvaW5nLW9ubHkKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIGR5bmFtaWMgUFNNLCBhICJ2aXJ0dWFsIiBQU00gaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgYW5kIHNob3VsZCBiZSB1c2VkIGluIHRoZSBjYWxscyB0byBMMkNBX0Nvbm5lY3RSZXEoKSBhbmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwoKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9SZWdpc3Rlcih1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIHBfY2JfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE90aGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZGVyZWdpc3RlciBmb3IgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTDJDQV9EZXJlZ2lzdGVyKHVpbnQxNl90IHBzbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0FsbG9jYXRlTGVQU00KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE90aGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZmluZCBhbiB1bnVzZWQgTEUgUFNNIGZvcgotICogICAgICAgICAgICAgICAgICBMMkNBUCBzZXJ2aWNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIExFX1BTTSB0byB1c2UgaWYgc3VjY2Vzcy4gT3RoZXJ3aXNlIHJldHVybnMgMC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9BbGxvY2F0ZUxlUFNNKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9GcmVlTGVQU00KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZyZWUgYW4gYXNzaWduZWQgTEUgUFNNLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEwyQ0FfRnJlZUxlUFNNKHVpbnQxNl90IHBzbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0Nvbm5lY3RSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBMMkNBUAotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLgotICogICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGVzdGFibGlzaGVkIGF0IHRoaXMgdGltZSwKLSAqICAgICAgICAgICAgICAgICAgYnV0IGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBnZXRzIHN0YXJ0ZWQuIFRoZSBjYWxsYmFjawotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQgd2hlbiBjb25uZWN0aW9uIGVzdGFibGlzaGVzIG9yIGZhaWxzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIENJRCBvZiB0aGUgY29ubmVjdGlvbiwgb3IgMCBpZiBpdCBmYWlsZWQgdG8gc3RhcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9Db25uZWN0UmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfUmVnaXN0ZXJMRUNvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBmb3IgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBPcmllbnRlZCBDaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUFNNIHRvIHVzZSBvciB6ZXJvIGlmIGVycm9yLiBUeXBpY2FsbHksIHRoZSBQU00gcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgd2FzIHBhc3NlZCBpbiwgYnV0IGZvciBhbiBvdXRnb2luZy1vbmx5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBkeW5hbWljIFBTTSwgYSAidmlydHVhbCIgUFNNIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgY2FsbHMgdG8gTDJDQV9Db25uZWN0TEVDb2NSZXEoKQotICogICAgICAgICAgICAgICAgICBhbmQgQlRNX1NldFNlY3VyaXR5TGV2ZWwoKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9SZWdpc3RlckxFQ29jKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCwgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0RlcmVnaXN0ZXJMRUNvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBkZXJlZ2lzdGVyIGZvciBMMkNBUAotICogICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIE9yaWVudGVkIENoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTDJDQV9EZXJlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfQ29ubmVjdExFQ29jUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIaWdoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBjcmVhdGUgYW4gTDJDQVAgTEUgQ09DLgotICogICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGVzdGFibGlzaGVkIGF0IHRoaXMgdGltZSwKLSAqICAgICAgICAgICAgICAgICAgYnV0IGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBnZXRzIHN0YXJ0ZWQuIFRoZSBjYWxsYmFjawotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQgd2hlbiBjb25uZWN0aW9uIGVzdGFibGlzaGVzIG9yIGZhaWxzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIENJRCBvZiB0aGUgY29ubmVjdGlvbiwgb3IgMCBpZiBpdCBmYWlsZWQgdG8gc3RhcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9Db25uZWN0TEVDb2NSZXEodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgICBMMkNBX0dldFBlZXJMRUNvY0NvbmZpZwotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgIEdldCBwZWVycyBjb25maWd1cmF0aW9uIGZvciBMRSBDb25uZWN0aW9uIE9yaWVudGVkIENoYW5uZWwuCi0gKgotICogIFJldHVybiB2YWx1ZTogICAgdHJ1ZSBpZiBwZWVyIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnKHVpbnQxNl90IGxjaWQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgIEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxCi0gKgotICogIERlc2NyaXB0aW9uICAgICAgU3RhcnQgcmVjb25maWd1cmUgcHJvY2VkdXJlIG9uIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIE9yaWVudGVkCi0gKiAgICAgICAgICAgICAgICAgICBDaGFubmVscy4KLSAqCi0gKiAgUmV0dXJuIHZhbHVlOiAgICB0cnVlIGlmIHBlZXIgaXMgY29ubmVjdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYm9vbCBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgICBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcQotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgIFdpdGggdGhpcyBmdW5jdGlvbiBMMkNBUCB3aWxsIGluaXRpYXRlIHNldHVwIG9mIHVwIHRvIDUgY3JlZGl0Ci0gKiAgICAgICAgICAgICAgICAgICBiYXNlZCBjb25uZWN0aW9ucyBmb3IgZ2l2ZW4gcHNtIHVzaW5nIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgICBMMkNBUCB3aWxsIG5vdGlmeSB1c2VyIG9uIHRoZSBjb25uZWN0aW9uIHJlc3VsdCwgYnkgY2FsbGluZwotICogICAgICAgICAgICAgICAgICAgcEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0Q2ZtX0NiIGZvciBlYWNoIGNpZCB3aXRoIGEgcmVzdWx0LgotICoKLSAqICBSZXR1cm4gdmFsdWU6IHZlY3RvciBvZiBhbGxvY2F0ZWQgbG9jYWwgY2lkcyBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxKAotICAgIHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgICBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcAotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIGZvciB0aGUgcEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0SW5kX0NiIHdoaWNoIGlzIHRoZQotICogICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbiBmb3IgcGVlciByZXF1ZXN0aW5nIGNyZWRpdCBiYXNlZCBjb25uZWN0aW9uLgotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgIHRydWUgaWYgcGVlciBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gYm9vbCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRpc2Nvbm5lY3QgYSBjaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkaXNjb25uZWN0IHNlbnQsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX0Rpc2Nvbm5lY3RSZXEodWludDE2X3QgY2lkKTsKLQotYm9vbCBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcSh1aW50MTZfdCBjaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9EYXRhV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEuCi0gKgotICogUmV0dXJucyAgICAgICAgICBMMkNBUF9EV19TVUNDRVNTLCBpZiBkYXRhIGFjY2VwdGVkLCBlbHNlIGZhbHNlCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQX0RXX0NPTkdFU1RFRCwgaWYgZGF0YSBhY2NlcHRlZCBhbmQgdGhlIGNoYW5uZWwgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgTDJDQVBfRFdfRkFJTEVELCBpZiBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEwyQ0FfRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpOwotCi11aW50OF90IEwyQ0FfTEVDb2NEYXRhV3JpdGUodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSk7Ci0KLS8vIEdpdmVuIGEgbG9jYWwgY2hhbm5lbCBpZGVudGlmaWVyLCB8bGNpZHwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm91bmQKLS8vIHJlbW90ZSBjaGFubmVsIGlkZW50aWZpZXIsIHxyY2lkfC4gSWYKLS8vIHxsY2lkfCBpcyBub3Qga25vd24gb3IgaXMgaW52YWxpZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdAotLy8gbW9kaWZ5IHRoZSB2YWx1ZSBwb2ludGVkIGF0IGJ5IHxyY2lkfC4gfHJjaWR8IG1heSBiZSBOVUxMLgotYm9vbCBMMkNBX0dldFJlbW90ZUNpZCh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCogcmNpZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaWRsZSB0aW1lb3V0IGZvcgotICogICAgICAgICAgICAgICAgICBhIGNvbm5lY3Rpb24uIFRoZSAiaWRsZSB0aW1lb3V0IiBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdAotICogICAgICAgICAgICAgICAgICBhIGNvbm5lY3Rpb24gY2FuIHJlbWFpbiB1cCB3aXRoIG5vIEwyQ0FQIGNoYW5uZWxzIG9uIGl0LgotICogICAgICAgICAgICAgICAgICBBIHRpbWVvdXQgb2YgemVybyBtZWFucyB0aGF0IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgdG9ybgotICogICAgICAgICAgICAgICAgICBkb3duIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxhc3QgY2hhbm5lbCBpcyByZW1vdmVkLgotICogICAgICAgICAgICAgICAgICBBIHRpbWVvdXQgb2YgMHhGRkZGIG1lYW5zIG5vIHRpbWVvdXQuIFZhbHVlcyBhcmUgaW4gc2Vjb25kcy4KLSAqICAgICAgICAgICAgICAgICAgQSBiZF9hZGRyIGlzIHRoZSByZW1vdGUgQkQgYWRkcmVzcy4gSWYgYmRfYWRkciA9Ci0gKiAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3M6OmtBbnksIHRoZW4gdGhlIGlkbGUgdGltZW91dHMgZm9yIGFsbCBhY3RpdmUKLSAqICAgICAgICAgICAgICAgICAgbDJjYXAgbGlua3Mgd2lsbCBiZSBjaGFuZ2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb21tYW5kIHN1Y2NlZWRlZCwgZmFsc2UgaWYgZmFpbGVkCi0gKgotICogTk9URSAgICAgICAgICAgICBUaGlzIHRpbWVvdXQgYXBwbGllcyB0byBhbGwgbG9naWNhbCBjaGFubmVscyBhY3RpdmUgb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIEFDTCBsaW5rLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEwyQ0FQLiBJZiBjYWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDB4RkYsIGl0IHNpbXBseSByZWFkcyB0aGUgY3VycmVudCB0cmFjZSBsZXZlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBuZXcgKGN1cnJlbnQpIHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgTDJDQV9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgdHJhY2VfbGV2ZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBMMkNBX0ZsdXNoQ2hhbm5lbAotICoKLSAqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgbm9uZSwgc29tZSBvciBhbGwgYnVmZmVycyBxdWV1ZWQgdXAKLSAqICAgICAgICAgICAgICBmb3IgeG1pc3Npb24gZm9yIGEgcGFydGljdWxhciBDSUQuIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgTDJDQVBfRkxVU0hfQ0hBTlNfR0VUICgwKSwgaXQgc2ltcGx5IHJldHVybnMgdGhlIG51bWJlcgotICogICAgICAgICAgICAgIG9mIGJ1ZmZlcnMgcXVldWVkIGZvciB0aGF0IENJRCBMMkNBUF9GTFVTSF9DSEFOU19BTEwgKDB4ZmZmZikKLSAqICAgICAgICAgICAgICBmbHVzaGVzIGFsbCBidWZmZXJzLiAgQWxsIG90aGVyIHZhbHVlcyBzcGVjaWZpZXMgdGhlIG1heGltdW0KLSAqICAgICAgICAgICAgICBidWZmZXJzIHRvIGZsdXNoLgotICoKLSAqIFJldHVybnMgICAgICBOdW1iZXIgb2YgYnVmZmVycyBsZWZ0IHF1ZXVlZCBmb3IgdGhhdCBDSUQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9GbHVzaENoYW5uZWwodWludDE2X3QgbGNpZCwgdWludDE2X3QgbnVtX3RvX2ZsdXNoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0QWNsUHJpb3JpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgdGhlIHRyYW5zbWlzc2lvbiBwcmlvcml0eSBmb3IgYW4gQUNMIGNoYW5uZWwuCi0gKiAgICAgICAgICAgICAgICAgIChGb3IgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvbmx5IHR3byB2YWx1ZXMgYXJlIHZhbGlkLgotICogICAgICAgICAgICAgICAgICBMMkNBUF9QUklPUklUWV9OT1JNQUwgYW5kIEwyQ0FQX1BSSU9SSVRZX0hJR0gpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhIHZhbGlkIGNoYW5uZWwsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX1NldEFjbFByaW9yaXR5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX1NldFR4UHJpb3JpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgdGhlIHRyYW5zbWlzc2lvbiBwcmlvcml0eSBmb3IgYSBjaGFubmVsLiAoRkNSIE1vZGUpCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGEgdmFsaWQgY2hhbm5lbCwgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfU2V0VHhQcmlvcml0eSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IGEgY2hhbm5lbHMKLSAqICAgICAgICAgICAgICAgICAgZmx1c2hhYmlsaXR5IGZsYWdzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIENJRCBmb3VuZCwgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSh1aW50MTZfdCBjaWQsIGJvb2wgaXNfZmx1c2hhYmxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgICBMMkNBX0dldFBlZXJGZWF0dXJlcwotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgIEdldCBhIHBlZXJzIGZlYXR1cmVzIGFuZCBmaXhlZCBjaGFubmVsIG1hcAotICoKLSAqICBQYXJhbWV0ZXJzOiAgICAgIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgIFBvaW50ZXJzIHRvIGZlYXR1cmVzIGFuZCBjaGFubmVsIG1hc2sgc3RvcmFnZSBhcmVhCi0gKgotICogIFJldHVybiB2YWx1ZTogICAgdHJ1ZSBpZiBwZWVyIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfR2V0UGVlckZlYXR1cmVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NobmxfbWFzayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICBMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsCi0gKgotICogIERlc2NyaXB0aW9uICAgICBSZWdpc3RlciBhIGZpeGVkIGNoYW5uZWwuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICBGaXhlZCBDaGFubmVsICMKLSAqICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBDYWxsYmFja3MgYW5kIGNvbmZpZwotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbCh1aW50MTZfdCBmaXhlZF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0ZJWEVEX0NITkxfUkVHKiBwX2ZyZWcpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgTDJDQV9Db25uZWN0Rml4ZWRDaG5sCi0gKgotICogIERlc2NyaXB0aW9uICAgICBDb25uZWN0IGFuIGZpeGVkIHNpZ25hbGxpbmcgY2hhbm5lbCB0byBhIHJlbW90ZSBkZXZpY2UuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICBGaXhlZCBDSUQKLSAqICAgICAgICAgICAgICAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqCi0gKiAgUmV0dXJuIHZhbHVlOiAgIHRydWUgaWYgY29ubmVjdGlvbiBzdGFydGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9Db25uZWN0Rml4ZWRDaG5sKHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICBMMkNBX1NlbmRGaXhlZENobmxEYXRhCi0gKgotICogIERlc2NyaXB0aW9uICAgICBXcml0ZSBkYXRhIG9uIGEgZml4ZWQgc2lnbmFsbGluZyBjaGFubmVsLgotICoKLSAqICBQYXJhbWV0ZXJzOiAgICAgRml4ZWQgQ0lECi0gKiAgICAgICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVmZmVyIG9mIHR5cGUgQlRfSERSCi0gKgotICogUmV0dXJuIHZhbHVlICAgICBMMkNBUF9EV19TVUNDRVNTLCBpZiBkYXRhIGFjY2VwdGVkCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQX0RXX0ZBSUxFRCwgIGlmIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEodWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgIEwyQ0FfUmVtb3ZlRml4ZWRDaG5sCi0gKgotICogIERlc2NyaXB0aW9uICAgICBSZW1vdmUgYSBmaXhlZCBjaGFubmVsIHRvIGEgcmVtb3RlIGRldmljZS4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEZpeGVkIENJRAotICogICAgICAgICAgICAgICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICogICAgICAgICAgICAgICAgICBJZGxlIHRpbWVvdXQgdG8gdXNlIChvciAweEZGRkYgaWYgZG9uJ3QgY2FyZSkKLSAqCi0gKiAgUmV0dXJuIHZhbHVlOiAgIHRydWUgaWYgY2hhbm5lbCByZW1vdmVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9SZW1vdmVGaXhlZENobmwodWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKTsKLQotdWludDE2X3QgTDJDQV9HZXRMZUhhbmRsZShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKTsKLWhjaV9yb2xlX3QgTDJDQV9HZXRCbGVDb25uUm9sZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotdm9pZCBMMkNBX0xlQ29ubmVjdGlvblVwZGF0ZShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfaW50LCB1aW50MTZfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKTsKLQotLy8gV2hlbiBHQVRUIGRpc2NvdmVyeSBpcyBpbiBwcm9ncmVzcywgdXNlIHRoZSBtaW5pbWFsIGNvbm5lY3Rpb24gaW50ZXJ2YWwsIGFuZAotLy8gcmVqZWN0IHJlbW90ZSBjb25uZWN0aW9uIHVwZGF0ZXMsIHVudGlsIGRvbmUuCi1ib29sIEwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBib29sIGVuYWJsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX1NldExlR2F0dFRpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaWRsZSB0aW1lb3V0IGZvcgotICogICAgICAgICAgICAgICAgICBhIGZpeGVkIGNoYW5uZWwuIFRoZSAiaWRsZSB0aW1lb3V0IiBpcyB0aGUgYW1vdW50IG9mIHRpbWUKLSAqICAgICAgICAgICAgICAgICAgdGhhdCBhIGNvbm5lY3Rpb24gY2FuIHJlbWFpbiB1cCB3aXRoIG5vIEwyQ0FQIGNoYW5uZWxzIG9uCi0gKiAgICAgICAgICAgICAgICAgIGl0LiBBIHRpbWVvdXQgb2YgemVybyBtZWFucyB0aGF0IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgdG9ybgotICogICAgICAgICAgICAgICAgICBkb3duIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxhc3QgY2hhbm5lbCBpcyByZW1vdmVkLgotICogICAgICAgICAgICAgICAgICBBIHRpbWVvdXQgb2YgMHhGRkZGIG1lYW5zIG5vIHRpbWVvdXQuIFZhbHVlcyBhcmUgaW4gc2Vjb25kcy4KLSAqICAgICAgICAgICAgICAgICAgQSBiZF9hZGRyIGlzIHRoZSByZW1vdGUgQkQgYWRkcmVzcy4gSWYgYmRfYWRkciA9Ci0gKiAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3M6OmtBbnksIHRoZW4gdGhlIGlkbGUgdGltZW91dHMgZm9yIGFsbCBhY3RpdmUKLSAqICAgICAgICAgICAgICAgICAgbDJjYXAgbGlua3Mgd2lsbCBiZSBjaGFuZ2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb21tYW5kIHN1Y2NlZWRlZCwgZmFsc2UgaWYgZmFpbGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9TZXRMZUdhdHRUaW1lb3V0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IGlkbGVfdG91dCk7Ci0KLWJvb2wgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfaW50LCB1aW50MTZfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zCi0gKgotICogIERlc2NyaXB0aW9uICAgICBVcGRhdGUgQkxFIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIGVuYWJsZSBmbGFnCi0gKgotICogIFJldHVybiB2YWx1ZTogICB0cnVlIGlmIHVwZGF0ZSBzdGFydGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIGJvb2wgZW5hYmxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfR2V0QmxlQ29ublJvbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29ubmVjdGlvbiByb2xlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbGluayByb2xlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1oY2lfcm9sZV90IEwyQ0FfR2V0QmxlQ29ublJvbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciBhbiBBQ0wgb3IgTEUgbGluayB0byB0aGUgcmVtb3RlIGRldmljZSBpcyBlc3RhYmxpc2hlZAotICovCi1ib29sIEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi12b2lkIEwyQ0FfQ29ubmVjdEZvclNlY3VyaXR5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vLyBTZXQgYm9uZGluZyBzdGF0ZSB0byBhY3F1aXJlL3JlbGVhc2UgbGluayByZWZjb3VudAotdm9pZCBMMkNBX1NldEJvbmRpbmdTdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIGJvb2wgaXNfYm9uZGluZyk7Ci0KLS8vIEluZGljYXRlZCBieSBzaGltIHN0YWNrIG1hbmFnZXIgdGhhdCBHRCBMMmNhcCBpcyBlbmFibGVkIGJ1dCBTZWN1cml0eSBpcyBub3QKLXZvaWQgTDJDQV9Vc2VMZWdhY3lTZWN1cml0eU1vZHVsZSgpOwotCi12b2lkIEwyQ0FfU3dpdGNoUm9sZVRvQ2VudHJhbChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKTsKLQotYm9vbCBMMkNBX1JlYWRSZW1vdGVWZXJzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHVpbnQ4X3QqIGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYW51ZmFjdHVyZXIsIHVpbnQxNl90KiBsbXBfc3ViX3ZlcnNpb24pOwotCi11aW50OF90KiBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyKTsKLQotdm9pZCBMMkNBX0Rpc2Nvbm5lY3RMaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZSk7Ci0KLXVpbnQxNl90IEwyQ0FfR2V0TnVtTGlua3MoKTsKLQotYm9vbCBMMkNBX0lzTGVMaW5rKHVpbnQxNl90IGFjbF9oYW5kbGUpOwotCi12b2lkIEwyQ0FfUmVhZENvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBjb25uX2FkZHIsIHVpbnQ4X3QqIHBfYWRkcl90eXBlKTsKLQotYm9vbCBMMkNBX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcihjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgY29ubl9hZGRyLCB1aW50OF90KiBwX2FkZHJfdHlwZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5jYyBiL21haW4vc2hpbS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVmN2NjLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfc2hpbV9hZHZlcnRpc2VyIgotCi0jaW5jbHVkZSAibGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfZ2F0dC5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJnZC9oY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9oY2kvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImdkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiZ2QvcGFja2V0L3BhY2tldF92aWV3LmgiCi0jaW5jbHVkZSAiZ2Qvc3RvcmFnZS9zdG9yYWdlX21vZHVsZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9lbnRyeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9oZWxwZXJzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibGVfYWR2ZXJ0aXNlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkdhcERhdGE7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6T3duQWRkcmVzc1R5cGU7Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotY2xhc3MgQmxlQWR2ZXJ0aXNlckludGVyZmFjZUltcGwgOiBwdWJsaWMgQmxlQWR2ZXJ0aXNlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJsdWV0b290aDo6aGNpOjpBZHZlcnRpc2luZ0NhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIH5CbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbCgpIG92ZXJyaWRle307Ci0KLSAgdm9pZCBJbml0KCkgewotICAgIC8vIFJlZ2lzdGVyIGNhbGxiYWNrCi0gICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRBZHZlcnRpc2luZygpLT5SZWdpc3RlckFkdmVydGlzaW5nQ2FsbGJhY2sodGhpcyk7Ci0gIH0KLQotICAvLyBub2JvZHkgdXNlIHRoaXMgZnVuY3Rpb24KLSAgdm9pZCBSZWdpc3RlckFkdmVydGlzZXIoSWRTdGF0dXNDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICB9Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0QWR2ZXJ0aXNpbmcoKS0+UmVtb3ZlQWR2ZXJ0aXNlcihhZHZlcnRpc2VyX2lkKTsKLSAgfQotCi0gIHZvaWQgR2V0T3duQWRkcmVzcyh1aW50OF90IGFkdmVydGlzZXJfaWQsIEdldEFkZHJlc3NDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0QWR2ZXJ0aXNpbmcoKS0+R2V0T3duQWRkcmVzcyhhZHZlcnRpc2VyX2lkKTsKLSAgfQotCi0gIHZvaWQgU2V0UGFyYW1ldGVycyh1aW50OF90IGFkdmVydGlzZXJfaWQsIEFkdmVydGlzZVBhcmFtZXRlcnMgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0NhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlne307Ci0gICAgcGFyc2VfcGFyYW1ldGVyKGNvbmZpZywgcGFyYW1zKTsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldEFkdmVydGlzaW5nKCktPlNldFBhcmFtZXRlcnMoYWR2ZXJ0aXNlcl9pZCwgY29uZmlnKTsKLSAgfQotCi0gIHZvaWQgU2V0RGF0YShpbnQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBzZXRfc2Nhbl9yc3AsIHZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIHN0ZDo6dmVjdG9yPEdhcERhdGE+IGFkdmVydGlzaW5nX2RhdGEgPSB7fTsKLQotICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhLnNpemUoKSkgewotICAgICAgR2FwRGF0YSBnYXBfZGF0YTsKLSAgICAgIHVpbnQ4X3QgbGVuID0gZGF0YVtvZmZzZXRdOwotICAgICAgYXV0byBiZWdpbiA9IGRhdGEuYmVnaW4oKSArIG9mZnNldDsKLSAgICAgIGF1dG8gZW5kID0gYmVnaW4gKyBsZW4gKyAxOyAgLy8gMSBieXRlIGZvciBsZW4KLSAgICAgIGF1dG8gZGF0YV9jb3B5ID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oYmVnaW4sIGVuZCk7Ci0gICAgICBibHVldG9vdGg6OnBhY2tldDo6UGFja2V0VmlldzxibHVldG9vdGg6OnBhY2tldDo6a0xpdHRsZUVuZGlhbj4gcGFja2V0KAotICAgICAgICAgIGRhdGFfY29weSk7Ci0gICAgICBHYXBEYXRhOjpQYXJzZSgmZ2FwX2RhdGEsIHBhY2tldC5iZWdpbigpKTsKLSAgICAgIGFkdmVydGlzaW5nX2RhdGEucHVzaF9iYWNrKGdhcF9kYXRhKTsKLSAgICAgIG9mZnNldCArPSBsZW4gKyAxOyAgLy8gMSBieXRlIGZvciBsZW4KLSAgICB9Ci0KLSAgICBibHVldG9vdGg6OnNoaW06OkdldEFkdmVydGlzaW5nKCktPlNldERhdGEoYWR2ZXJ0aXNlcl9pZCwgc2V0X3NjYW5fcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19kYXRhKTsKLSAgfQotCi0gIHZvaWQgRW5hYmxlKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsIFN0YXR1c0NhbGxiYWNrIGNiLAotICAgICAgICAgICAgICB1aW50MTZfdCBkdXJhdGlvbiwgdWludDhfdCBtYXhFeHRBZHZFdmVudHMsCi0gICAgICAgICAgICAgIFN0YXR1c0NhbGxiYWNrIHRpbWVvdXRfY2IpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldEFkdmVydGlzaW5nKCktPkVuYWJsZUFkdmVydGlzZXIoCi0gICAgICAgIGFkdmVydGlzZXJfaWQsIGVuYWJsZSwgZHVyYXRpb24sIG1heEV4dEFkdkV2ZW50cyk7Ci0gIH0KLQotICAvLyBub2JvZHkgdXNlIHRoaXMgZnVuY3Rpb24KLSAgdm9pZCBTdGFydEFkdmVydGlzaW5nKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgU3RhdHVzQ2FsbGJhY2sgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBBZHZlcnRpc2VQYXJhbWV0ZXJzIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLCBpbnQgdGltZW91dF9zLAotICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlBZHZDYiB0aW1lb3V0X2NiKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0gIH0KLQotICB2b2lkIFN0YXJ0QWR2ZXJ0aXNpbmdTZXQoaW50IHJlZ19pZCwgSWRUeFBvd2VyU3RhdHVzQ2FsbGJhY2sgcmVnaXN0ZXJfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZlcnRpc2VQYXJhbWV0ZXJzIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGVyaW9kaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGR1cmF0aW9uLCB1aW50OF90IG1heEV4dEFkdkV2ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElkU3RhdHVzQ2FsbGJhY2sgdGltZW91dF9jYikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkV4dGVuZGVkQWR2ZXJ0aXNpbmdDb25maWcgY29uZmlne307Ci0gICAgcGFyc2VfcGFyYW1ldGVyKGNvbmZpZywgcGFyYW1zKTsKLSAgICBibHVldG9vdGg6OmhjaTo6UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfcGFyYW1ldGVyczsKLSAgICBwZXJpb2RpY19wYXJhbWV0ZXJzLm1heF9pbnRlcnZhbCA9IHBlcmlvZGljX3BhcmFtcy5tYXhfaW50ZXJ2YWw7Ci0gICAgcGVyaW9kaWNfcGFyYW1ldGVycy5taW5faW50ZXJ2YWwgPSBwZXJpb2RpY19wYXJhbXMubWluX2ludGVydmFsOwotICAgIHBlcmlvZGljX3BhcmFtZXRlcnMucHJvcGVydGllcyA9Ci0gICAgICAgIHBlcmlvZGljX3BhcmFtcy5wZXJpb2RpY19hZHZlcnRpc2luZ19wcm9wZXJ0aWVzOwotICAgIGNvbmZpZy5wZXJpb2RpY19hZHZlcnRpc2luZ19wYXJhbWV0ZXJzID0gcGVyaW9kaWNfcGFyYW1ldGVyczsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBhZHZlcnRpc2VfZGF0YS5zaXplKCkpIHsKLSAgICAgIEdhcERhdGEgZ2FwX2RhdGE7Ci0gICAgICB1aW50OF90IGxlbiA9IGFkdmVydGlzZV9kYXRhW29mZnNldF07Ci0gICAgICBhdXRvIGJlZ2luID0gYWR2ZXJ0aXNlX2RhdGEuYmVnaW4oKSArIG9mZnNldDsKLSAgICAgIGF1dG8gZW5kID0gYmVnaW4gKyBsZW4gKyAxOyAgLy8gMSBieXRlIGZvciBsZW4KLSAgICAgIGF1dG8gZGF0YV9jb3B5ID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oYmVnaW4sIGVuZCk7Ci0gICAgICBibHVldG9vdGg6OnBhY2tldDo6UGFja2V0VmlldzxibHVldG9vdGg6OnBhY2tldDo6a0xpdHRsZUVuZGlhbj4gcGFja2V0KAotICAgICAgICAgIGRhdGFfY29weSk7Ci0gICAgICBHYXBEYXRhOjpQYXJzZSgmZ2FwX2RhdGEsIHBhY2tldC5iZWdpbigpKTsKLSAgICAgIGNvbmZpZy5hZHZlcnRpc2VtZW50LnB1c2hfYmFjayhnYXBfZGF0YSk7Ci0gICAgICBvZmZzZXQgKz0gbGVuICsgMTsgIC8vIDEgYnl0ZSBmb3IgbGVuCi0gICAgfQotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2Nhbl9yZXNwb25zZV9kYXRhLnNpemUoKSkgewotICAgICAgR2FwRGF0YSBnYXBfZGF0YTsKLSAgICAgIHVpbnQ4X3QgbGVuID0gc2Nhbl9yZXNwb25zZV9kYXRhW29mZnNldF07Ci0gICAgICBhdXRvIGJlZ2luID0gc2Nhbl9yZXNwb25zZV9kYXRhLmJlZ2luKCkgKyBvZmZzZXQ7Ci0gICAgICBhdXRvIGVuZCA9IGJlZ2luICsgbGVuICsgMTsgIC8vIDEgYnl0ZSBmb3IgbGVuCi0gICAgICBhdXRvIGRhdGFfY29weSA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGJlZ2luLCBlbmQpOwotICAgICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc8Ymx1ZXRvb3RoOjpwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+IHBhY2tldCgKLSAgICAgICAgICBkYXRhX2NvcHkpOwotICAgICAgR2FwRGF0YTo6UGFyc2UoJmdhcF9kYXRhLCBwYWNrZXQuYmVnaW4oKSk7Ci0gICAgICBjb25maWcuc2Nhbl9yZXNwb25zZS5wdXNoX2JhY2soZ2FwX2RhdGEpOwotICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7ICAvLyAxIGJ5dGUgZm9yIGxlbgotICAgIH0KLQotICAgIG9mZnNldCA9IDA7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHBlcmlvZGljX2RhdGEuc2l6ZSgpKSB7Ci0gICAgICBHYXBEYXRhIGdhcF9kYXRhOwotICAgICAgdWludDhfdCBsZW4gPSBwZXJpb2RpY19kYXRhW29mZnNldF07Ci0gICAgICBhdXRvIGJlZ2luID0gcGVyaW9kaWNfZGF0YS5iZWdpbigpICsgb2Zmc2V0OwotICAgICAgYXV0byBlbmQgPSBiZWdpbiArIGxlbiArIDE7ICAvLyAxIGJ5dGUgZm9yIGxlbgotICAgICAgYXV0byBkYXRhX2NvcHkgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihiZWdpbiwgZW5kKTsKLSAgICAgIGJsdWV0b290aDo6cGFja2V0OjpQYWNrZXRWaWV3PGJsdWV0b290aDo6cGFja2V0OjprTGl0dGxlRW5kaWFuPiBwYWNrZXQoCi0gICAgICAgICAgZGF0YV9jb3B5KTsKLSAgICAgIEdhcERhdGE6OlBhcnNlKCZnYXBfZGF0YSwgcGFja2V0LmJlZ2luKCkpOwotICAgICAgY29uZmlnLnBlcmlvZGljX2RhdGEucHVzaF9iYWNrKGdhcF9kYXRhKTsKLSAgICAgIG9mZnNldCArPSBsZW4gKyAxOyAgLy8gMSBieXRlIGZvciBsZW4KLSAgICB9Ci0KLSAgICBibHVldG9vdGg6OmhjaTo6QWR2ZXJ0aXNlcklkIGlkID0KLSAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRBZHZlcnRpc2luZygpLT5FeHRlbmRlZENyZWF0ZUFkdmVydGlzZXIoCi0gICAgICAgICAgICByZWdfaWQsIGNvbmZpZywgc2Nhbl9jYWxsYmFjaywgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2ssIGR1cmF0aW9uLAotICAgICAgICAgICAgbWF4RXh0QWR2RXZlbnRzLCBibHVldG9vdGg6OnNoaW06OkdldEdkU2hpbUhhbmRsZXIoKSk7Ci0KLSAgICBMT0coSU5GTykgPDwgImNyZWF0ZSBhZHZlcnRpc2luZyBzZXQsIHJlZ19pZDoiIDw8IHJlZ19pZAotICAgICAgICAgICAgICA8PCAiLCBpZDoiIDw8ICh1aW50MTZfdClpZDsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMoCi0gICAgICBpbnQgYWR2ZXJ0aXNlcl9pZCwgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGVyaW9kaWNfcGFyYW1zLAotICAgICAgU3RhdHVzQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICBibHVldG9vdGg6OmhjaTo6UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMgcGFyYW1ldGVyczsKLSAgICBwYXJhbWV0ZXJzLm1heF9pbnRlcnZhbCA9IHBlcmlvZGljX3BhcmFtcy5tYXhfaW50ZXJ2YWw7Ci0gICAgcGFyYW1ldGVycy5taW5faW50ZXJ2YWwgPSBwZXJpb2RpY19wYXJhbXMubWluX2ludGVydmFsOwotICAgIHBhcmFtZXRlcnMucHJvcGVydGllcyA9IHBlcmlvZGljX3BhcmFtcy5wZXJpb2RpY19hZHZlcnRpc2luZ19wcm9wZXJ0aWVzOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0QWR2ZXJ0aXNpbmcoKS0+U2V0UGVyaW9kaWNQYXJhbWV0ZXJzKGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhKGludCBhZHZlcnRpc2VyX2lkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NhbGxiYWNrIGNiKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBzdGQ6OnZlY3RvcjxHYXBEYXRhPiBhZHZlcnRpc2luZ19kYXRhID0ge307Ci0KLSAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YS5zaXplKCkpIHsKLSAgICAgIEdhcERhdGEgZ2FwX2RhdGE7Ci0gICAgICB1aW50OF90IGxlbiA9IGRhdGFbb2Zmc2V0XTsKLSAgICAgIGF1dG8gYmVnaW4gPSBkYXRhLmJlZ2luKCkgKyBvZmZzZXQ7Ci0gICAgICBhdXRvIGVuZCA9IGJlZ2luICsgbGVuICsgMTsgIC8vIDEgYnl0ZSBmb3IgbGVuCi0gICAgICBhdXRvIGRhdGFfY29weSA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGJlZ2luLCBlbmQpOwotICAgICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc8Ymx1ZXRvb3RoOjpwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+IHBhY2tldCgKLSAgICAgICAgICBkYXRhX2NvcHkpOwotICAgICAgR2FwRGF0YTo6UGFyc2UoJmdhcF9kYXRhLCBwYWNrZXQuYmVnaW4oKSk7Ci0gICAgICBhZHZlcnRpc2luZ19kYXRhLnB1c2hfYmFjayhnYXBfZGF0YSk7Ci0gICAgICBvZmZzZXQgKz0gbGVuICsgMTsgIC8vIDEgYnl0ZSBmb3IgbGVuCi0gICAgfQotCi0gICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRBZHZlcnRpc2luZygpLT5TZXRQZXJpb2RpY0RhdGEoYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2luZ19kYXRhKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZShpbnQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0QWR2ZXJ0aXNpbmcoKS0+RW5hYmxlUGVyaW9kaWNBZHZlcnRpc2luZyhhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckNhbGxiYWNrcyhBZHZlcnRpc2luZ0NhbGxiYWNrcyogY2FsbGJhY2tzKSB7Ci0gICAgYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyA9IGNhbGxiYWNrczsKLSAgfQotCi0gIHZvaWQgb25fc2NhbihBZGRyZXNzIGFkZHJlc3MsIEFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICB9Ci0KLSAgdm9pZCBvbl9zZXRfdGVybWluYXRlZChFcnJvckNvZGUgZXJyb3JfY29kZSwgdWludDhfdCwgdWludDhfdCkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICB9Ci0KLSAgY29uc3QgYmx1ZXRvb3RoOjpjb21tb246OkNhbGxiYWNrPHZvaWQoQWRkcmVzcywgQWRkcmVzc1R5cGUpPiBzY2FuX2NhbGxiYWNrID0KLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpCaW5kKCZCbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbDo6b25fc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKTsKLQotICBjb25zdCBibHVldG9vdGg6OmNvbW1vbjo6Q2FsbGJhY2s8dm9pZChFcnJvckNvZGUsIHVpbnQ4X3QsIHVpbnQ4X3QpPgotICAgICAgc2V0X3Rlcm1pbmF0ZWRfY2FsbGJhY2sgPSBibHVldG9vdGg6OmNvbW1vbjo6QmluZCgKLSAgICAgICAgICAmQmxlQWR2ZXJ0aXNlckludGVyZmFjZUltcGw6Om9uX3NldF90ZXJtaW5hdGVkLAotICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpVbnJldGFpbmVkKHRoaXMpKTsKLQotICAvLyBBZHZlcnRpc2luZ0NhbGxiYWNrCi0gIHZvaWQgT25BZHZlcnRpc2luZ1NldFN0YXJ0ZWQoaW50IHJlZ19pZCwgdWludDhfdCBhZHZlcnRpc2VyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCB0eF9wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZlcnRpc2luZ1N0YXR1cyBzdGF0dXMpIG92ZXJyaWRlIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkFkdmVydGlzaW5nQ2FsbGJhY2tzOjpPbkFkdmVydGlzaW5nU2V0U3RhcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyksIHJlZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsIHR4X3Bvd2VyLCBzdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgT25BZHZlcnRpc2luZ0VuYWJsZWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCBib29sIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgewotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQWR2ZXJ0aXNpbmdDYWxsYmFja3M6Ok9uQWR2ZXJ0aXNpbmdFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGFkdmVydGlzaW5nX2NhbGxiYWNrc18pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBlbmFibGUsIHN0YXR1cykpOwotICB9Ci0KLSAgdm9pZCBPbkFkdmVydGlzaW5nRGF0YVNldCh1aW50OF90IGFkdmVydGlzZXJfaWQsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZBZHZlcnRpc2luZ0NhbGxiYWNrczo6T25BZHZlcnRpc2luZ0RhdGFTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsIHN0YXR1cykpOwotICB9Ci0gIHZvaWQgT25TY2FuUmVzcG9uc2VEYXRhU2V0KHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJkFkdmVydGlzaW5nQ2FsbGJhY2tzOjpPblNjYW5SZXNwb25zZURhdGFTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsIHN0YXR1cykpOwotICB9Ci0KLSAgdm9pZCBPbkFkdmVydGlzaW5nUGFyYW1ldGVyc1VwZGF0ZWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCBpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZBZHZlcnRpc2luZ0NhbGxiYWNrczo6T25BZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyksIGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgdHhfcG93ZXIsIHN0YXR1cykpOwotICB9Ci0KLSAgdm9pZCBPblBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzVXBkYXRlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAmQWR2ZXJ0aXNpbmdDYWxsYmFja3M6Ok9uUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnNVcGRhdGVkLAotICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChhZHZlcnRpc2luZ19jYWxsYmFja3NfKSwgYWR2ZXJ0aXNlcl9pZCwgc3RhdHVzKSk7Ci0gIH0KLQotICB2b2lkIE9uUGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFTZXQodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgewotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZCgmQWR2ZXJ0aXNpbmdDYWxsYmFja3M6Ok9uUGVyaW9kaWNBZHZlcnRpc2luZ0RhdGFTZXQsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChhZHZlcnRpc2luZ19jYWxsYmFja3NfKSwgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICBzdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgT25QZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIGJvb2wgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgIGJhc2U6OkJpbmQoJkFkdmVydGlzaW5nQ2FsbGJhY2tzOjpPblBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGVkLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXyksIGFkdmVydGlzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgZW5hYmxlLCBzdGF0dXMpKTsKLSAgfQotCi0gIHZvaWQgT25Pd25BZGRyZXNzUmVhZCh1aW50OF90IGFkdmVydGlzZXJfaWQsIHVpbnQ4X3QgYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcykgewotICAgIFJhd0FkZHJlc3MgcmF3X2FkZHJlc3MgPSBibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJkFkdmVydGlzaW5nQ2FsbGJhY2tzOjpPbk93bkFkZHJlc3NSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGFkdmVydGlzaW5nX2NhbGxiYWNrc18pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkLCBhZGRyZXNzX3R5cGUsIHJhd19hZGRyZXNzKSk7Ci0gIH0KLQotICBBZHZlcnRpc2luZ0NhbGxiYWNrcyogYWR2ZXJ0aXNpbmdfY2FsbGJhY2tzXzsKLQotIHByaXZhdGU6Ci0gIHZvaWQgcGFyc2VfcGFyYW1ldGVyKGJsdWV0b290aDo6aGNpOjpFeHRlbmRlZEFkdmVydGlzaW5nQ29uZmlnJiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgIEFkdmVydGlzZVBhcmFtZXRlcnMgcGFyYW1zKSB7Ci0gICAgY29uZmlnLmNvbm5lY3RhYmxlID0gcGFyYW1zLmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgJiAweDAxOwotICAgIGNvbmZpZy5zY2FubmFibGUgPSBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyAmIDB4MDI7Ci0gICAgY29uZmlnLmxlZ2FjeV9wZHVzID0gcGFyYW1zLmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgJiAweDEwOwotICAgIGNvbmZpZy5hbm9ueW1vdXMgPSBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyAmIDB4MjA7Ci0gICAgY29uZmlnLmluY2x1ZGVfdHhfcG93ZXIgPSBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyAmIDB4NDA7Ci0gICAgY29uZmlnLmludGVydmFsX21pbiA9IHBhcmFtcy5taW5faW50ZXJ2YWw7Ci0gICAgY29uZmlnLmludGVydmFsX21heCA9IHBhcmFtcy5tYXhfaW50ZXJ2YWw7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFwID0gcGFyYW1zLmNoYW5uZWxfbWFwOwotICAgIGNvbmZpZy50eF9wb3dlciA9IHBhcmFtcy50eF9wb3dlcjsKLSAgICBjb25maWcudXNlX2xlX2NvZGVkX3BoeSA9IHBhcmFtcy5wcmltYXJ5X2FkdmVydGlzaW5nX3BoeSA9PSAweDAzOwotICAgIGNvbmZpZy5zZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OlNlY29uZGFyeVBoeVR5cGU+KAotICAgICAgICAgICAgcGFyYW1zLnNlY29uZGFyeV9hZHZlcnRpc2luZ19waHkpOwotICAgIGNvbmZpZy5lbmFibGVfc2Nhbl9yZXF1ZXN0X25vdGlmaWNhdGlvbnMgPQotICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6RW5hYmxlPigKLSAgICAgICAgICAgIHBhcmFtcy5zY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uX2VuYWJsZSk7Ci0KLSAgICAvLyBUT0RPIHNldCBvd25fYWRkcmVzc190eXBlIGJhc2VkIG9uIGFkZHJlc3MgcG9saWN5Ci0gICAgY29uZmlnLm93bl9hZGRyZXNzX3R5cGUgPSBPd25BZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTOwotICB9Ci19OwotCi1CbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbCogYnRfbGVfYWR2ZXJ0aXNlcl9pbnN0YW5jZSA9IG51bGxwdHI7Ci0KLUJsZUFkdmVydGlzZXJJbnRlcmZhY2UqIGJsdWV0b290aDo6c2hpbTo6Z2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCkgewotICBpZiAoYnRfbGVfYWR2ZXJ0aXNlcl9pbnN0YW5jZSA9PSBudWxscHRyKSB7Ci0gICAgYnRfbGVfYWR2ZXJ0aXNlcl9pbnN0YW5jZSA9IG5ldyBCbGVBZHZlcnRpc2VySW50ZXJmYWNlSW1wbCgpOwotICB9Ci0gIHJldHVybiBidF9sZV9hZHZlcnRpc2VyX2luc3RhbmNlOwotfTsKLQotdm9pZCBibHVldG9vdGg6OnNoaW06OmluaXRfYWR2ZXJ0aXNpbmdfbWFuYWdlcigpIHsKLSAgYnRfbGVfYWR2ZXJ0aXNlcl9pbnN0YW5jZS0+SW5pdCgpOwotfQpkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaCBiL21haW4vc2hpbS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2M3OTUuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR2Qgc2hpbSBsYXllciB0byBsZWdhY3kgbGUgYWR2ZXJ0aXNlcgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJsZV9hZHZlcnRpc2VyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibGVfYWR2ZXJ0aXNlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotQmxlQWR2ZXJ0aXNlckludGVyZmFjZSogZ2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCk7Ci12b2lkIGluaXRfYWR2ZXJ0aXNpbmdfbWFuYWdlcigpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9sZV9zY2FubmluZ19tYW5hZ2VyLmNjIGIvbWFpbi9zaGltL2xlX3NjYW5uaW5nX21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMTI2MDIuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2xlX3NjYW5uaW5nX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9zaGltX3NjYW5uZXIiCi0KLSNpbmNsdWRlICJsZV9zY2FubmluZ19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgImFkdmVydGlzZV9kYXRhX3BhcnNlci5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgImdkL2hjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2xlX3NjYW5uaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9zdG9yYWdlL2RldmljZS5oIgotI2luY2x1ZGUgImdkL3N0b3JhZ2UvbGVfZGV2aWNlLmgiCi0jaW5jbHVkZSAiZ2Qvc3RvcmFnZS9zdG9yYWdlX21vZHVsZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9lbnRyeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9oZWxwZXJzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpUb1Jhd0FkZHJlc3M7Ci11c2luZyBibHVldG9vdGg6OlRvR2RBZGRyZXNzOwotCi1leHRlcm4gdm9pZCBidG1fYmxlX3Byb2Nlc3NfYWR2X3BrdF9jb250X2Zvcl9pbnF1aXJ5KAotICAgIHVpbnQxNl90IGV2ZW50X3R5cGUsIHVpbnQ4X3QgYWRkcmVzc190eXBlLCBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICB1aW50OF90IHByaW1hcnlfcGh5LCB1aW50OF90IHNlY29uZGFyeV9waHksIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLAotICAgIGludDhfdCB0eF9wb3dlciwgaW50OF90IHJzc2ksIHVpbnQxNl90IHBlcmlvZGljX2Fkdl9pbnQsCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGJ0aWZfZG1fdXBkYXRlX2JsZV9yZW1vdGVfcHJvcGVydGllcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpOwotCi1leHRlcm4gdm9pZCBidG1fYmxlX3Byb2Nlc3NfYWR2X2FkZHIoUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIGFkZHJlc3NfdHlwZSk7Ci0KLWNsYXNzIEJsZVNjYW5uZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEJsZVNjYW5uZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBibHVldG9vdGg6OmhjaTo6U2Nhbm5pbmdDYWxsYmFjayB7Ci0gcHVibGljOgotICB+QmxlU2Nhbm5lckludGVyZmFjZUltcGwoKSBvdmVycmlkZXt9OwotCi0gIHZvaWQgSW5pdCgpIHsKLSAgICBMT0dfSU5GTygiaW5pdCBCbGVTY2FubmVySW50ZXJmYWNlSW1wbCIpOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0U2Nhbm5pbmcoKS0+UmVnaXN0ZXJTY2FubmluZ0NhbGxiYWNrKHRoaXMpOwotICB9Ci0KLSAgLyoqIFJlZ2lzdGVycyBhIHNjYW5uZXIgd2l0aCB0aGUgc3RhY2sgKi8KLSAgdm9pZCBSZWdpc3RlclNjYW5uZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLCBSZWdpc3RlckNhbGxiYWNrKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0gICAgYXV0byBhcHBfdXVpZCA9IGJsdWV0b290aDo6aGNpOjpVdWlkOjpGcm9tMTI4Qml0QkUodXVpZC5UbzEyOEJpdEJFKCkpOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0U2Nhbm5pbmcoKS0+UmVnaXN0ZXJTY2FubmVyKGFwcF91dWlkKTsKLSAgfQotCi0gIC8qKiBVbnJlZ2lzdGVyIGEgc2Nhbm5lciBmcm9tIHRoZSBzdGFjayAqLwotICB2b2lkIFVucmVnaXN0ZXIoaW50IHNjYW5uZXJfaWQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyLCBzY2FubmVyX2lkOiIgPDwgc2Nhbm5lcl9pZDsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldFNjYW5uaW5nKCktPlVucmVnaXN0ZXIoc2Nhbm5lcl9pZCk7Ci0gIH0KLQotICAvKiogU3RhcnQgb3Igc3RvcCBMRSBkZXZpY2Ugc2Nhbm5pbmcgKi8KLSAgdm9pZCBTY2FuKGJvb2wgc3RhcnQpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldFNjYW5uaW5nKCktPlNjYW4oc3RhcnQpOwotICAgIGluaXRfYWRkcmVzc19jYWNoZSgpOwotICB9Ci0KLSAgLyoqIFNldHVwIHNjYW4gZmlsdGVyIHBhcmFtcyAqLwotICB2b2lkIFNjYW5GaWx0ZXJQYXJhbVNldHVwKAotICAgICAgdWludDhfdCBjbGllbnRfaWYsIHVpbnQ4X3QgYWN0aW9uLCB1aW50OF90IGZpbHRlcl9pbmRleCwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxidGdhdHRfZmlsdF9wYXJhbV9zZXR1cF90PiBmaWx0X3BhcmFtLAotICAgICAgRmlsdGVyUGFyYW1TZXR1cENhbGxiYWNrIGNiKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0KLSAgICBhdXRvIGFwY2ZfYWN0aW9uID0gc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkFwY2ZBY3Rpb24+KGFjdGlvbik7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nRmlsdGVyUGFyYW1ldGVyIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXI7Ci0KLSAgICBpZiAoZmlsdF9wYXJhbSAhPSBudWxscHRyKSB7Ci0gICAgICBpZiAoZmlsdF9wYXJhbSAmJiBmaWx0X3BhcmFtLT5kZWx5X21vZGUgPT0gMSkgewotICAgICAgICBibHVldG9vdGg6OnNoaW06OkdldFNjYW5uaW5nKCktPlRyYWNrQWR2ZXJ0aXNlcihjbGllbnRfaWYpOwotICAgICAgfQotICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5mZWF0dXJlX3NlbGVjdGlvbiA9IGZpbHRfcGFyYW0tPmZlYXRfc2VsbjsKLSAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIubGlzdF9sb2dpY190eXBlID0KLSAgICAgICAgICBmaWx0X3BhcmFtLT5saXN0X2xvZ2ljX3R5cGU7Ci0gICAgICBhZHZlcnRpc2luZ19maWx0ZXJfcGFyYW1ldGVyLmZpbHRlcl9sb2dpY190eXBlID0KLSAgICAgICAgICBmaWx0X3BhcmFtLT5maWx0X2xvZ2ljX3R5cGU7Ci0gICAgICBhZHZlcnRpc2luZ19maWx0ZXJfcGFyYW1ldGVyLnJzc2lfaGlnaF90aHJlc2ggPQotICAgICAgICAgIGZpbHRfcGFyYW0tPnJzc2lfaGlnaF90aHJlczsKLSAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIuZGVsaXZlcnlfbW9kZSA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkRlbGl2ZXJ5TW9kZT4oZmlsdF9wYXJhbS0+ZGVseV9tb2RlKTsKLSAgICAgIGlmIChmaWx0X3BhcmFtICYmIGZpbHRfcGFyYW0tPmRlbHlfbW9kZSA9PSAxKSB7Ci0gICAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIub25mb3VuZF90aW1lb3V0ID0KLSAgICAgICAgICAgIGZpbHRfcGFyYW0tPmZvdW5kX3RpbWVvdXQ7Ci0gICAgICAgIGFkdmVydGlzaW5nX2ZpbHRlcl9wYXJhbWV0ZXIub25mb3VuZF90aW1lb3V0X2NudCA9Ci0gICAgICAgICAgICBmaWx0X3BhcmFtLT5mb3VuZF90aW1lb3V0X2NudDsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5yc3NpX2xvd190aHJlcyA9Ci0gICAgICAgICAgICBmaWx0X3BhcmFtLT5yc3NpX2xvd190aHJlczsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5vbmxvc3RfdGltZW91dCA9IGZpbHRfcGFyYW0tPmxvc3RfdGltZW91dDsKLSAgICAgICAgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlci5udW1fb2ZfdHJhY2tpbmdfZW50cmllcyA9Ci0gICAgICAgICAgICBmaWx0X3BhcmFtLT5udW1fb2ZfdHJhY2tpbmdfZW50cmllczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBibHVldG9vdGg6OnNoaW06OkdldFNjYW5uaW5nKCktPlNjYW5GaWx0ZXJQYXJhbWV0ZXJTZXR1cCgKLSAgICAgICAgYXBjZl9hY3Rpb24sIGZpbHRlcl9pbmRleCwgYWR2ZXJ0aXNpbmdfZmlsdGVyX3BhcmFtZXRlcik7Ci0gICAgLy8gVE9ETyByZWZhY3RvciBjYWxsYmFjayBtZWNoYW5pc20KLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoY2IsIDAsIDAsIGJ0bV9zdGF0dXNfdmFsdWUoQlRNX1NVQ0NFU1MpKSk7Ci0gIH0KLQotICAvKiogQ29uZmlndXJlIGEgc2NhbiBmaWx0ZXIgY29uZGl0aW9uICAqLwotICB2b2lkIFNjYW5GaWx0ZXJBZGQoaW50IGZpbHRlcl9pbmRleCwgc3RkOjp2ZWN0b3I8QXBjZkNvbW1hbmQ+IGZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDb25maWdDYWxsYmFjayBjYikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6aGNpOjpBZHZlcnRpc2luZ1BhY2tldENvbnRlbnRGaWx0ZXJDb21tYW5kPgotICAgICAgICBuZXdfZmlsdGVycyA9IHt9OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nUGFja2V0Q29udGVudEZpbHRlckNvbW1hbmQgY29tbWFuZHt9OwotICAgICAgaWYgKCFwYXJzZV9maWx0ZXJfY29tbWFuZChjb21tYW5kLCBmaWx0ZXJzW2ldKSkgewotICAgICAgICBMT0dfRVJST1IoImludmFsaWQgYXBjZiBjb21tYW5kIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG5ld19maWx0ZXJzLnB1c2hfYmFjayhjb21tYW5kKTsKLSAgICB9Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpHZXRTY2FubmluZygpLT5TY2FuRmlsdGVyQWRkKGZpbHRlcl9pbmRleCwgbmV3X2ZpbHRlcnMpOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChjYiwgMCwgMCwgMCwgYnRtX3N0YXR1c192YWx1ZShCVE1fU1VDQ0VTUykpKTsKLSAgfQotCi0gIC8qKiBDbGVhciBhbGwgc2NhbiBmaWx0ZXIgY29uZGl0aW9ucyBmb3Igc3BlY2lmaWMgZmlsdGVyIGluZGV4Ki8KLSAgdm9pZCBTY2FuRmlsdGVyQ2xlYXIoaW50IGZpbHRlcl9pbmRleCwgRmlsdGVyQ29uZmlnQ2FsbGJhY2sgY2IpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlZCBpbiBqYXZhIGxheWVyCi0gIH0KLQotICAvKiogRW5hYmxlIC8gZGlzYWJsZSBzY2FuIGZpbHRlciBmZWF0dXJlKi8KLSAgdm9pZCBTY2FuRmlsdGVyRW5hYmxlKGJvb2wgZW5hYmxlLCBFbmFibGVDYWxsYmFjayBjYikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0U2Nhbm5pbmcoKS0+U2NhbkZpbHRlckVuYWJsZShlbmFibGUpOwotCi0gICAgdWludDhfdCBhY3Rpb24gPSBlbmFibGUgPyAxIDogMDsKLSAgICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoY2IsIGFjdGlvbiwgYnRtX3N0YXR1c192YWx1ZShCVE1fU1VDQ0VTUykpKTsKLSAgfQotCi0gIC8qKiBTZXRzIHRoZSBMRSBzY2FuIGludGVydmFsIGFuZCB3aW5kb3cgaW4gdW5pdHMgb2YgTiowLjYyNSBtc2VjICovCi0gIHZvaWQgU2V0U2NhblBhcmFtZXRlcnMoaW50IHNjYW5uZXJfaWQsIGludCBzY2FuX2ludGVydmFsLCBpbnQgc2Nhbl93aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgY2IpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICAvLyB1c2UgYWN0aXZlIHNjYW4KLSAgICBhdXRvIHNjYW5fdHlwZSA9IHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpMZVNjYW5UeXBlPigweDAxKTsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldFNjYW5uaW5nKCktPlNldFNjYW5QYXJhbWV0ZXJzKAotICAgICAgICBzY2FubmVyX2lkLCBzY2FuX3R5cGUsIHNjYW5faW50ZXJ2YWwsIHNjYW5fd2luZG93KTsKLSAgfQotCi0gIC8qIENvbmZpZ3VyZSB0aGUgYmF0Y2hzY2FuIHN0b3JhZ2UgKi8KLSAgdm9pZCBCYXRjaHNjYW5Db25maWdTdG9yYWdlKGludCBjbGllbnRfaWYsIGludCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhdGNoX3NjYW5fdHJ1bmNfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCwgQ2FsbGJhY2sgY2IpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICBibHVldG9vdGg6OnNoaW06OkdldFNjYW5uaW5nKCktPkJhdGNoU2NhbkNvbmlmZ1N0b3JhZ2UoCi0gICAgICAgIGJhdGNoX3NjYW5fZnVsbF9tYXgsIGJhdGNoX3NjYW5fdHJ1bmNfbWF4LCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQsCi0gICAgICAgIGNsaWVudF9pZik7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoY2IsIGJ0bV9zdGF0dXNfdmFsdWUoQlRNX1NVQ0NFU1MpKSk7Ci0gIH0KLQotICAvKiBFbmFibGUgYmF0Y2hzY2FuICovCi0gIHZpcnR1YWwgdm9pZCBCYXRjaHNjYW5FbmFibGUoaW50IHNjYW5fbW9kZSwgaW50IHNjYW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYW5fd2luZG93LCBpbnQgYWRkcl90eXBlLCBpbnQgZGlzY2FyZF9ydWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGNiKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0gICAgYXV0byBiYXRjaF9zY2FuX21vZGUgPQotICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6QmF0Y2hTY2FuTW9kZT4oc2Nhbl9tb2RlKTsKLSAgICBhdXRvIGJhdGNoX3NjYW5fZGlzY2FyZF9ydWxlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkJhdGNoU2NhbkRpc2NhcmRSdWxlPihkaXNjYXJkX3J1bGUpOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0U2Nhbm5pbmcoKS0+QmF0Y2hTY2FuRW5hYmxlKAotICAgICAgICBiYXRjaF9zY2FuX21vZGUsIHNjYW5fd2luZG93LCBzY2FuX2ludGVydmFsLCBiYXRjaF9zY2FuX2Rpc2NhcmRfcnVsZSk7Ci0gICAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoY2IsIGJ0bV9zdGF0dXNfdmFsdWUoQlRNX1NVQ0NFU1MpKSk7Ci0gIH0KLQotICAvKiBEaXNhYmxlIGJhdGNoc2NhbiAqLwotICB2aXJ0dWFsIHZvaWQgQmF0Y2hzY2FuRGlzYWJsZShDYWxsYmFjayBjYikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0U2Nhbm5pbmcoKS0+QmF0Y2hTY2FuRGlzYWJsZSgpOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBidG1fc3RhdHVzX3ZhbHVlKEJUTV9TVUNDRVNTKSkpOwotICB9Ci0KLSAgLyogUmVhZCBvdXQgYmF0Y2hzY2FuIHJlcG9ydHMgKi8KLSAgdm9pZCBCYXRjaHNjYW5SZWFkUmVwb3J0cyhpbnQgY2xpZW50X2lmLCBpbnQgc2Nhbl9tb2RlKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgaW4gc2hpbSBsYXllciI7Ci0gICAgYXV0byBiYXRjaF9zY2FuX21vZGUgPQotICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6QmF0Y2hTY2FuTW9kZT4oc2Nhbl9tb2RlKTsKLSAgICBhdXRvIHNjYW5uZXJfaWQgPSBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6U2Nhbm5lcklkPihjbGllbnRfaWYpOwotICAgIGJsdWV0b290aDo6c2hpbTo6R2V0U2Nhbm5pbmcoKS0+QmF0Y2hTY2FuUmVhZFJlcG9ydChzY2FubmVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zY2FuX21vZGUpOwotICB9Ci0KLSAgdm9pZCBTdGFydFN5bmModWludDhfdCBzaWQsIFJhd0FkZHJlc3MgYWRkcmVzcywgdWludDE2X3Qgc2tpcCwKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgU3RhcnRTeW5jQ2Igc3RhcnRfY2IsIFN5bmNSZXBvcnRDYiByZXBvcnRfY2IsCi0gICAgICAgICAgICAgICAgIFN5bmNMb3N0Q2IgbG9zdF9jYikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBpbXBsZW1lbnQgaW4gdGhlIG9sZCBzdGFjawotICB9Ci0KLSAgdm9pZCBTdG9wU3luYyh1aW50MTZfdCBoYW5kbGUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBpbiBzaGltIGxheWVyIjsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaW1wbGVtZW50IGluIHRoZSBvbGQgc3RhY2sKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJDYWxsYmFja3MoU2Nhbm5pbmdDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGluIHNoaW0gbGF5ZXIiOwotICAgIHNjYW5uaW5nX2NhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0gIH0KLQotICB2b2lkIE9uU2Nhbm5lclJlZ2lzdGVyZWQoY29uc3QgYmx1ZXRvb3RoOjpoY2k6OlV1aWQgYXBwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6U2Nhbm5lcklkIHNjYW5uZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FubmluZ1N0YXR1cyBzdGF0dXMpIHsKLSAgICBhdXRvIHV1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkZyb20xMjhCaXRCRShhcHBfdXVpZC5UbzEyOEJpdEJFKCkpOwotICAgIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmU2Nhbm5pbmdDYWxsYmFja3M6Ok9uU2Nhbm5lclJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoc2Nhbm5pbmdfY2FsbGJhY2tzXyksIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXJfaWQsIHN0YXR1cykpOwotICB9Ci0KLSAgdm9pZCBPblNldFNjYW5uZXJQYXJhbWV0ZXJDb21wbGV0ZShibHVldG9vdGg6OmhjaTo6U2Nhbm5lcklkIHNjYW5uZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nhbm5pbmdTdGF0dXMgc3RhdHVzKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kKCZTY2FubmluZ0NhbGxiYWNrczo6T25TZXRTY2FubmVyUGFyYW1ldGVyQ29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzY2FubmluZ19jYWxsYmFja3NfKSwgc2Nhbm5lcl9pZCwgc3RhdHVzKSk7Ci0gIH0KLQotICB2b2lkIE9uU2NhblJlc3VsdCh1aW50MTZfdCBldmVudF90eXBlLCB1aW50OF90IGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcywgdWludDhfdCBwcmltYXJ5X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmRhcnlfcGh5LCB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwKLSAgICAgICAgICAgICAgICAgICAgaW50OF90IHR4X3Bvd2VyLCBpbnQ4X3QgcnNzaSwKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEpIHsKLSAgICBSYXdBZGRyZXNzIHJhd19hZGRyZXNzID0gVG9SYXdBZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgaWYgKGFkZHJlc3NfdHlwZSAhPSBCTEVfQUREUl9BTk9OWU1PVVMpIHsKLSAgICAgIGJ0bV9ibGVfcHJvY2Vzc19hZHZfYWRkcihyYXdfYWRkcmVzcywgJmFkZHJlc3NfdHlwZSk7Ci0gICAgfQotCi0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmQmxlU2Nhbm5lckludGVyZmFjZUltcGw6OmhhbmRsZV9yZW1vdGVfcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgcmF3X2FkZHJlc3MsIGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YSkpOwotCi0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmU2Nhbm5pbmdDYWxsYmFja3M6Ok9uU2NhblJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzY2FubmluZ19jYWxsYmFja3NfKSwgZXZlbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc190eXBlLCByYXdfYWRkcmVzcywgcHJpbWFyeV9waHksIHNlY29uZGFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzaW5nX3NpZCwgdHhfcG93ZXIsIHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljX2FkdmVydGlzaW5nX2ludGVydmFsLCBhZHZlcnRpc2luZ19kYXRhKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgd2hlbiBTdGFydElucXVpcnkgaW4gR0QgcGFydCBpbXBsZW1lbnRlZAotICAgIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0X2NvbnRfZm9yX2lucXVpcnkoCi0gICAgICAgIGV2ZW50X3R5cGUsIGFkZHJlc3NfdHlwZSwgcmF3X2FkZHJlc3MsIHByaW1hcnlfcGh5LCBzZWNvbmRhcnlfcGh5LAotICAgICAgICBhZHZlcnRpc2luZ19zaWQsIHR4X3Bvd2VyLCByc3NpLCBwZXJpb2RpY19hZHZlcnRpc2luZ19pbnRlcnZhbCwKLSAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0gIH0KLQotICB2b2lkIE9uVHJhY2tBZHZGb3VuZExvc3QoYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nRmlsdGVyT25Gb3VuZE9uTG9zdEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8pIHsKLSAgICBBZHZlcnRpc2luZ1RyYWNrSW5mbyB0cmFja19pbmZvID0ge307Ci0gICAgUmF3QWRkcmVzcyByYXdfYWRkcmVzcyA9Ci0gICAgICAgIFRvUmF3QWRkcmVzcyhvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9hZGRyZXNzKTsKLSAgICB0cmFja19pbmZvLmFkdmVydGlzZXJfYWRkcmVzcyA9IHJhd19hZGRyZXNzOwotICAgIHRyYWNrX2luZm8uYWR2ZXJ0aXNlcl9hZGRyZXNzX3R5cGUgPQotICAgICAgICBvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9hZGRyZXNzX3R5cGU7Ci0gICAgdHJhY2tfaW5mby5zY2FubmVyX2lkID0gb25fZm91bmRfb25fbG9zdF9pbmZvLnNjYW5uZXJfaWQ7Ci0gICAgdHJhY2tfaW5mby5maWx0ZXJfaW5kZXggPSBvbl9mb3VuZF9vbl9sb3N0X2luZm8uZmlsdGVyX2luZGV4OwotICAgIHRyYWNrX2luZm8uYWR2ZXJ0aXNlcl9zdGF0ZSA9IG9uX2ZvdW5kX29uX2xvc3RfaW5mby5hZHZlcnRpc2VyX3N0YXRlOwotICAgIHRyYWNrX2luZm8uYWR2ZXJ0aXNlcl9pbmZvX3ByZXNlbnQgPQotICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9pbmZvX3ByZXNlbnQpOwotICAgIGlmIChvbl9mb3VuZF9vbl9sb3N0X2luZm8uYWR2ZXJ0aXNlcl9pbmZvX3ByZXNlbnQgPT0KLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkdnRJbmZvUHJlc2VudDo6QURWVF9JTkZPX1BSRVNFTlQpIHsKLSAgICAgIHRyYWNrX2luZm8udHhfcG93ZXIgPSBvbl9mb3VuZF9vbl9sb3N0X2luZm8udHhfcG93ZXI7Ci0gICAgICB0cmFja19pbmZvLnJzc2kgPSBvbl9mb3VuZF9vbl9sb3N0X2luZm8ucnNzaTsKLSAgICAgIHRyYWNrX2luZm8udGltZV9zdGFtcCA9IG9uX2ZvdW5kX29uX2xvc3RfaW5mby50aW1lX3N0YW1wOwotICAgICAgYXV0byBhZHZfZGF0YSA9IG9uX2ZvdW5kX29uX2xvc3RfaW5mby5hZHZfcGFja2V0OwotICAgICAgdHJhY2tfaW5mby5hZHZfcGFja2V0X2xlbiA9ICh1aW50OF90KWFkdl9kYXRhLnNpemUoKTsKLSAgICAgIHRyYWNrX2luZm8uYWR2X3BhY2tldC5yZXNlcnZlKGFkdl9kYXRhLnNpemUoKSk7Ci0gICAgICB0cmFja19pbmZvLmFkdl9wYWNrZXQuaW5zZXJ0KHRyYWNrX2luZm8uYWR2X3BhY2tldC5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2RhdGEuYmVnaW4oKSwgYWR2X2RhdGEuZW5kKCkpOwotICAgICAgYXV0byBzY2FuX3JzcF9kYXRhID0gb25fZm91bmRfb25fbG9zdF9pbmZvLnNjYW5fcmVzcG9uc2U7Ci0gICAgICB0cmFja19pbmZvLnNjYW5fcmVzcG9uc2VfbGVuID0gKHVpbnQ4X3Qpc2Nhbl9yc3BfZGF0YS5zaXplKCk7Ci0gICAgICB0cmFja19pbmZvLnNjYW5fcmVzcG9uc2UucmVzZXJ2ZShhZHZfZGF0YS5zaXplKCkpOwotICAgICAgdHJhY2tfaW5mby5zY2FuX3Jlc3BvbnNlLmluc2VydCh0cmFja19pbmZvLnNjYW5fcmVzcG9uc2UuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fcnNwX2RhdGEuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9yc3BfZGF0YS5lbmQoKSk7Ci0gICAgfQotICAgIGRvX2luX2puaV90aHJlYWQoCi0gICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJlNjYW5uaW5nQ2FsbGJhY2tzOjpPblRyYWNrQWR2Rm91bmRMb3N0LAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHNjYW5uaW5nX2NhbGxiYWNrc18pLCB0cmFja19pbmZvKSk7Ci0gIH0KLQotICB2b2lkIE9uQmF0Y2hTY2FuUmVwb3J0cyhpbnQgY2xpZW50X2lmLCBpbnQgc3RhdHVzLCBpbnQgcmVwb3J0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9yZWNvcmRzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmU2Nhbm5pbmdDYWxsYmFja3M6Ok9uQmF0Y2hTY2FuUmVwb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzY2FubmluZ19jYWxsYmFja3NfKSwgY2xpZW50X2lmLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9mb3JtYXQsIG51bV9yZWNvcmRzLCBkYXRhKSk7Ci0gIH0KLQotICB2b2lkIE9uQmF0Y2hTY2FuVGhyZXNob2xkQ3Jvc3NlZChpbnQgY2xpZW50X2lmKSB7Ci0gICAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmU2Nhbm5pbmdDYWxsYmFja3M6Ok9uQmF0Y2hTY2FuVGhyZXNob2xkQ3Jvc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChzY2FubmluZ19jYWxsYmFja3NfKSwgY2xpZW50X2lmKSk7Ci0gIH0KLQotICB2b2lkIE9uVGltZW91dCgpIHt9Ci0KLSAgdm9pZCBPbkZpbHRlckVuYWJsZShibHVldG9vdGg6OmhjaTo6RW5hYmxlIGVuYWJsZSwgdWludDhfdCBzdGF0dXMpe307Ci0KLSAgdm9pZCBPbkZpbHRlclBhcmFtU2V0dXAodWludDhfdCBhdmFpbGFibGVfc3BhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6QXBjZkFjdGlvbiBhY3Rpb24sIHVpbnQ4X3Qgc3RhdHVzKXt9OwotCi0gIHZvaWQgT25GaWx0ZXJDb25maWdDYWxsYmFjayhibHVldG9vdGg6OmhjaTo6QXBjZkZpbHRlclR5cGUgZmlsdGVyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGF2YWlsYWJsZV9zcGFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6QXBjZkFjdGlvbiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cyl7fTsKLQotICBTY2FubmluZ0NhbGxiYWNrcyogc2Nhbm5pbmdfY2FsbGJhY2tzXzsKLQotIHByaXZhdGU6Ci0gIGJvb2wgcGFyc2VfZmlsdGVyX2NvbW1hbmQoCi0gICAgICBibHVldG9vdGg6OmhjaTo6QWR2ZXJ0aXNpbmdQYWNrZXRDb250ZW50RmlsdGVyQ29tbWFuZCYKLSAgICAgICAgICBhZHZlcnRpc2luZ19wYWNrZXRfY29udGVudF9maWx0ZXJfY29tbWFuZCwKLSAgICAgIEFwY2ZDb21tYW5kIGFwY2ZfY29tbWFuZCkgewotICAgIGFkdmVydGlzaW5nX3BhY2tldF9jb250ZW50X2ZpbHRlcl9jb21tYW5kLmZpbHRlcl90eXBlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkFwY2ZGaWx0ZXJUeXBlPihhcGNmX2NvbW1hbmQudHlwZSk7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcmVzcyA9IFRvR2RBZGRyZXNzKGFwY2ZfY29tbWFuZC5hZGRyZXNzKTsKLSAgICBhZHZlcnRpc2luZ19wYWNrZXRfY29udGVudF9maWx0ZXJfY29tbWFuZC5hZGRyZXNzID0gYWRkcmVzczsKLSAgICBhZHZlcnRpc2luZ19wYWNrZXRfY29udGVudF9maWx0ZXJfY29tbWFuZC5hcHBsaWNhdGlvbl9hZGRyZXNzX3R5cGUgPQotICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6QXBjZkFwcGxpY2F0aW9uQWRkcmVzc1R5cGU+KAotICAgICAgICAgICAgYXBjZl9jb21tYW5kLmFkZHJfdHlwZSk7Ci0KLSAgICBpZiAoIWFwY2ZfY29tbWFuZC51dWlkLklzRW1wdHkoKSkgewotICAgICAgdWludDhfdCB1dWlkX2xlbiA9IGFwY2ZfY29tbWFuZC51dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0gICAgICBzd2l0Y2ggKHV1aWRfbGVuKSB7Ci0gICAgICAgIGNhc2UgYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMxNjogewotICAgICAgICAgIGFkdmVydGlzaW5nX3BhY2tldF9jb250ZW50X2ZpbHRlcl9jb21tYW5kLnV1aWQgPQotICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6VXVpZDo6RnJvbTE2Qml0KGFwY2ZfY29tbWFuZC51dWlkLkFzMTZCaXQoKSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMzMjogewotICAgICAgICAgIGFkdmVydGlzaW5nX3BhY2tldF9jb250ZW50X2ZpbHRlcl9jb21tYW5kLnV1aWQgPQotICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6VXVpZDo6RnJvbTMyQml0KGFwY2ZfY29tbWFuZC51dWlkLkFzMzJCaXQoKSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMxMjg6IHsKLSAgICAgICAgICBhZHZlcnRpc2luZ19wYWNrZXRfY29udGVudF9maWx0ZXJfY29tbWFuZC51dWlkID0KLSAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlV1aWQ6OkZyb20xMjhCaXRCRSgKLSAgICAgICAgICAgICAgICAgIGFwY2ZfY29tbWFuZC51dWlkLlRvMTI4Qml0QkUoKSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTE9HX1dBUk4oImlsbGVnYWwgVVVJRCBsZW5ndGggJWQiLCAodWludDE2X3QpdXVpZF9sZW4pOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWFwY2ZfY29tbWFuZC51dWlkX21hc2suSXNFbXB0eSgpKSB7Ci0gICAgICB1aW50OF90IHV1aWRfbGVuID0gYXBjZl9jb21tYW5kLnV1aWQuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKTsKLSAgICAgIHN3aXRjaCAodXVpZF9sZW4pIHsKLSAgICAgICAgY2FzZSBibHVldG9vdGg6OlV1aWQ6OmtOdW1CeXRlczE2OiB7Ci0gICAgICAgICAgYWR2ZXJ0aXNpbmdfcGFja2V0X2NvbnRlbnRfZmlsdGVyX2NvbW1hbmQudXVpZF9tYXNrID0KLSAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlV1aWQ6OkZyb20xNkJpdChhcGNmX2NvbW1hbmQudXVpZF9tYXNrLkFzMTZCaXQoKSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMzMjogewotICAgICAgICAgIGFkdmVydGlzaW5nX3BhY2tldF9jb250ZW50X2ZpbHRlcl9jb21tYW5kLnV1aWRfbWFzayA9Ci0gICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpVdWlkOjpGcm9tMzJCaXQoYXBjZl9jb21tYW5kLnV1aWRfbWFzay5BczMyQml0KCkpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIGJsdWV0b290aDo6VXVpZDo6a051bUJ5dGVzMTI4OiB7Ci0gICAgICAgICAgYWR2ZXJ0aXNpbmdfcGFja2V0X2NvbnRlbnRfZmlsdGVyX2NvbW1hbmQudXVpZF9tYXNrID0KLSAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlV1aWQ6OkZyb20xMjhCaXRCRSgKLSAgICAgICAgICAgICAgICAgIGFwY2ZfY29tbWFuZC51dWlkX21hc2suVG8xMjhCaXRCRSgpKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiaWxsZWdhbCBVVUlEIGxlbmd0aCAlZCIsICh1aW50MTZfdCl1dWlkX2xlbik7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGFkdmVydGlzaW5nX3BhY2tldF9jb250ZW50X2ZpbHRlcl9jb21tYW5kLm5hbWUuYXNzaWduKAotICAgICAgICBhcGNmX2NvbW1hbmQubmFtZS5iZWdpbigpLCBhcGNmX2NvbW1hbmQubmFtZS5lbmQoKSk7Ci0gICAgYWR2ZXJ0aXNpbmdfcGFja2V0X2NvbnRlbnRfZmlsdGVyX2NvbW1hbmQuY29tcGFueSA9IGFwY2ZfY29tbWFuZC5jb21wYW55OwotICAgIGFkdmVydGlzaW5nX3BhY2tldF9jb250ZW50X2ZpbHRlcl9jb21tYW5kLmNvbXBhbnlfbWFzayA9Ci0gICAgICAgIGFwY2ZfY29tbWFuZC5jb21wYW55X21hc2s7Ci0gICAgYWR2ZXJ0aXNpbmdfcGFja2V0X2NvbnRlbnRfZmlsdGVyX2NvbW1hbmQuZGF0YS5hc3NpZ24oCi0gICAgICAgIGFwY2ZfY29tbWFuZC5kYXRhLmJlZ2luKCksIGFwY2ZfY29tbWFuZC5kYXRhLmVuZCgpKTsKLSAgICBhZHZlcnRpc2luZ19wYWNrZXRfY29udGVudF9maWx0ZXJfY29tbWFuZC5kYXRhX21hc2suYXNzaWduKAotICAgICAgICBhcGNmX2NvbW1hbmQuZGF0YV9tYXNrLmJlZ2luKCksIGFwY2ZfY29tbWFuZC5kYXRhX21hc2suZW5kKCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfcmVtb3RlX3Byb3BlcnRpZXMoUmF3QWRkcmVzcyBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEpIHsKLSAgICAvLyBza2lwIGFub255bW91cyBhZHZlcnRpc21lbnQKLSAgICBpZiAoYWRkcl90eXBlID09IEJMRV9BRERSX0FOT05ZTU9VUykgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gZGV2aWNlX3R5cGUgPSBibHVldG9vdGg6OmhjaTo6RGV2aWNlVHlwZTo6TEU7Ci0gICAgdWludDhfdCBmbGFnX2xlbjsKLSAgICBjb25zdCB1aW50OF90KiBwX2ZsYWcgPSBBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZSgKLSAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YSwgQlRNX0JMRV9BRF9UWVBFX0ZMQUcsICZmbGFnX2xlbik7Ci0gICAgaWYgKHBfZmxhZyAhPSBOVUxMICYmIGZsYWdfbGVuICE9IDApIHsKLSAgICAgIGlmICgoQlRNX0JMRV9CUkVEUl9OT1RfU1BUICYgKnBfZmxhZykgPT0gMCkgewotICAgICAgICBkZXZpY2VfdHlwZSA9IGJsdWV0b290aDo6aGNpOjpEZXZpY2VUeXBlOjpEVUFMOwotICAgICAgfQotICAgIH0KLQotICAgIHVpbnQ4X3QgcmVtb3RlX25hbWVfbGVuOwotICAgIGNvbnN0IHVpbnQ4X3QqIHBfZWlyX3JlbW90ZV9uYW1lID0gQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6R2V0RmllbGRCeVR5cGUoCi0gICAgICAgIGFkdmVydGlzaW5nX2RhdGEsIEhDSV9FSVJfQ09NUExFVEVfTE9DQUxfTkFNRV9UWVBFLCAmcmVtb3RlX25hbWVfbGVuKTsKLQotICAgIGlmIChwX2Vpcl9yZW1vdGVfbmFtZSA9PSBOVUxMKSB7Ci0gICAgICBwX2Vpcl9yZW1vdGVfbmFtZSA9IEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKAotICAgICAgICAgIGFkdmVydGlzaW5nX2RhdGEsIEhDSV9FSVJfU0hPUlRFTkVEX0xPQ0FMX05BTUVfVFlQRSwKLSAgICAgICAgICAmcmVtb3RlX25hbWVfbGVuKTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUgZGV2aWNlIG5hbWUKLSAgICBpZiAoKGFkZHJfdHlwZSAhPSBCTEVfQUREUl9SQU5ET00pIHx8IChwX2Vpcl9yZW1vdGVfbmFtZSkpIHsKLSAgICAgIGlmICghZmluZF9hZGRyZXNzX2NhY2hlKGJkX2FkZHIpKSB7Ci0gICAgICAgIGFkZF9hZGRyZXNzX2NhY2hlKGJkX2FkZHIpOwotCi0gICAgICAgIGlmIChwX2Vpcl9yZW1vdGVfbmFtZSkgewotICAgICAgICAgIGlmIChyZW1vdGVfbmFtZV9sZW4gPiBCRF9OQU1FX0xFTiArIDEgfHwKLSAgICAgICAgICAgICAgKHJlbW90ZV9uYW1lX2xlbiA9PSBCRF9OQU1FX0xFTiArIDEgJiYKLSAgICAgICAgICAgICAgIHBfZWlyX3JlbW90ZV9uYW1lW0JEX05BTUVfTEVOXSAhPSAnXDAnKSkgewotICAgICAgICAgICAgTE9HX0lORk8oIiVzIGRyb3BwaW5nIGludmFsaWQgcGFja2V0IC0gZGV2aWNlIG5hbWUgdG9vIGxvbmc6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZW1vdGVfbmFtZV9sZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJ0X2JkbmFtZV90IGJkbmFtZTsKLSAgICAgICAgICBtZW1jcHkoYmRuYW1lLm5hbWUsIHBfZWlyX3JlbW90ZV9uYW1lLCByZW1vdGVfbmFtZV9sZW4pOwotICAgICAgICAgIGlmIChyZW1vdGVfbmFtZV9sZW4gPCBCRF9OQU1FX0xFTiArIDEpCi0gICAgICAgICAgICBiZG5hbWUubmFtZVtyZW1vdGVfbmFtZV9sZW5dID0gJ1wwJzsKLQotICAgICAgICAgIGJ0aWZfZG1fdXBkYXRlX2JsZV9yZW1vdGVfcHJvcGVydGllcyhiZF9hZGRyLCBiZG5hbWUubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkpIHsKLSAgICAgIExPR19XQVJOKCJHZCBzdGFjayBpcyBzdG9wcGVkLCByZXR1cm4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXV0byogc3RvcmFnZV9tb2R1bGUgPSBibHVldG9vdGg6OnNoaW06OkdldFN0b3JhZ2UoKTsKLSAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyZXNzID0gVG9HZEFkZHJlc3MoYmRfYWRkcik7Ci0KLSAgICAvLyB1cGRhdGUgZGV2aWNlIHR5cGUKLSAgICBhdXRvIG11dGF0aW9uID0gc3RvcmFnZV9tb2R1bGUtPk1vZGlmeSgpOwotICAgIGJsdWV0b290aDo6c3RvcmFnZTo6RGV2aWNlIGRldmljZSA9Ci0gICAgICAgIHN0b3JhZ2VfbW9kdWxlLT5HZXREZXZpY2VCeUxlZ2FjeUtleShhZGRyZXNzKTsKLSAgICBtdXRhdGlvbi5BZGQoZGV2aWNlLlNldERldmljZVR5cGUoZGV2aWNlX3R5cGUpKTsKLSAgICBtdXRhdGlvbi5Db21taXQoKTsKLQotICAgIC8vIHVwZGF0ZSBhZGRyZXNzIHR5cGUKLSAgICBhdXRvIG11dGF0aW9uMiA9IHN0b3JhZ2VfbW9kdWxlLT5Nb2RpZnkoKTsKLSAgICBibHVldG9vdGg6OnN0b3JhZ2U6OkxlRGV2aWNlIGxlX2RldmljZSA9IGRldmljZS5MZSgpOwotICAgIG11dGF0aW9uMi5BZGQoCi0gICAgICAgIGxlX2RldmljZS5TZXRBZGRyZXNzVHlwZSgoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlKWFkZHJfdHlwZSkpOwotICAgIG11dGF0aW9uMi5Db21taXQoKTsKLSAgfQotCi0gIHZvaWQgYWRkX2FkZHJlc3NfY2FjaGUoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgICAvLyBSZW1vdmUgdGhlIG9sZGVzdCBlbnRyaWVzCi0gICAgd2hpbGUgKHJlbW90ZV9iZGFkZHJfY2FjaGVfLnNpemUoKSA+PSByZW1vdGVfYmRhZGRyX2NhY2hlX21heF9zaXplXykgewotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MgPSByZW1vdGVfYmRhZGRyX2NhY2hlX29yZGVyZWRfLmZyb250KCk7Ci0gICAgICByZW1vdGVfYmRhZGRyX2NhY2hlXy5lcmFzZShyYXdfYWRkcmVzcyk7Ci0gICAgICByZW1vdGVfYmRhZGRyX2NhY2hlX29yZGVyZWRfLnBvcCgpOwotICAgIH0KLSAgICByZW1vdGVfYmRhZGRyX2NhY2hlXy5pbnNlcnQocF9iZGEpOwotICAgIHJlbW90ZV9iZGFkZHJfY2FjaGVfb3JkZXJlZF8ucHVzaChwX2JkYSk7Ci0gIH0KLQotICBib29sIGZpbmRfYWRkcmVzc19jYWNoZShjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSkgewotICAgIHJldHVybiAocmVtb3RlX2JkYWRkcl9jYWNoZV8uZmluZChwX2JkYSkgIT0gcmVtb3RlX2JkYWRkcl9jYWNoZV8uZW5kKCkpOwotICB9Ci0KLSAgdm9pZCBpbml0X2FkZHJlc3NfY2FjaGUodm9pZCkgewotICAgIHJlbW90ZV9iZGFkZHJfY2FjaGVfLmNsZWFyKCk7Ci0gICAgcmVtb3RlX2JkYWRkcl9jYWNoZV9vcmRlcmVkXyA9IHt9OwotICB9Ci0KLSAgLy8gYWxsIGFjY2VzcyB0byB0aGlzIHZhcmlhYmxlIHNob3VsZCBiZSBkb25lIG9uIHRoZSBqbmkgdGhyZWFkCi0gIHN0ZDo6c2V0PFJhd0FkZHJlc3M+IHJlbW90ZV9iZGFkZHJfY2FjaGVfOwotICBzdGQ6OnF1ZXVlPFJhd0FkZHJlc3M+IHJlbW90ZV9iZGFkZHJfY2FjaGVfb3JkZXJlZF87Ci0gIGNvbnN0IHNpemVfdCByZW1vdGVfYmRhZGRyX2NhY2hlX21heF9zaXplXyA9IDEwMjQ7Ci19OwotCi1CbGVTY2FubmVySW50ZXJmYWNlSW1wbCogYnRfbGVfc2Nhbm5lcl9pbnN0YW5jZSA9IG51bGxwdHI7Ci0KLUJsZVNjYW5uZXJJbnRlcmZhY2UqIGJsdWV0b290aDo6c2hpbTo6Z2V0X2JsZV9zY2FubmVyX2luc3RhbmNlKCkgewotICBpZiAoYnRfbGVfc2Nhbm5lcl9pbnN0YW5jZSA9PSBudWxscHRyKSB7Ci0gICAgYnRfbGVfc2Nhbm5lcl9pbnN0YW5jZSA9IG5ldyBCbGVTY2FubmVySW50ZXJmYWNlSW1wbCgpOwotICB9Ci0gIHJldHVybiBidF9sZV9zY2FubmVyX2luc3RhbmNlOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6aW5pdF9zY2FubmluZ19tYW5hZ2VyKCkgewotICBidF9sZV9zY2FubmVyX2luc3RhbmNlLT5Jbml0KCk7Ci19CmRpZmYgLS1naXQgYS9tYWluL3NoaW0vbGVfc2Nhbm5pbmdfbWFuYWdlci5oIGIvbWFpbi9zaGltL2xlX3NjYW5uaW5nX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzYjhkMi4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vbGVfc2Nhbm5pbmdfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHZCBzaGltIGxheWVyIHRvIGxlZ2FjeSBsZSBzY2FubmVyCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibGVfc2Nhbm5lci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotQmxlU2Nhbm5lckludGVyZmFjZSogZ2V0X2JsZV9zY2FubmVyX2luc3RhbmNlKCk7Ci12b2lkIGluaXRfc2Nhbm5pbmdfbWFuYWdlcigpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9saW5rX2Nvbm5lY3Rpb25faW50ZXJmYWNlLmggYi9tYWluL3NoaW0vbGlua19jb25uZWN0aW9uX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhmOWUyLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9saW5rX2Nvbm5lY3Rpb25faW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAiZ2QvaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJnZC9oY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi1jbGFzcyBMaW5rQ29ubmVjdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5MaW5rQ29ubmVjdGlvbkludGVyZmFjZSgpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIENyZWF0ZUNsYXNzaWNDb25uZWN0aW9uKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgdmlydHVhbCB2b2lkIENhbmNlbENsYXNzaWNDb25uZWN0aW9uKAotICAgICAgY29uc3QgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MmIGFkZHJlc3MpID0gMDsKLSAgdmlydHVhbCB2b2lkIEFjY2VwdExlQ29ubmVjdGlvbkZyb20oCi0gICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzX3dpdGhfdHlwZSwgYm9vbCBpc19kaXJlY3QsCi0gICAgICBzdGQ6OnByb21pc2U8Ym9vbD4pID0gMDsKLSAgdmlydHVhbCB2b2lkIElnbm9yZUxlQ29ubmVjdGlvbkZyb20oCi0gICAgICBjb25zdCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlJiBhZGRyZXNzX3dpdGhfdHlwZSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0Q2xhc3NpYyh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUkVBU09OIHJlYXNvbikgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGlzY29ubmVjdExlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2xpbmtfcG9saWN5LmNjIGIvbWFpbi9zaGltL2xpbmtfcG9saWN5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDY2MmYzLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9saW5rX3BvbGljeS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWFpbi9zaGltL2xpbmtfcG9saWN5LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAiaGNpL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3N0YWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1idF9zdGF0dXNfdCBkb19pbl9tYWluX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzayk7Ci0KLXZvaWQgYnRtX2NvbnRfcnN3aXRjaF9mcm9tX2hhbmRsZSh1aW50MTZfdCBoY2lfaGFuZGxlKTsKLXZvaWQgYnRtX3BtX3Byb2NfbW9kZV9jaGFuZ2UodEhDSV9TVEFUVVMgaGNpX3N0YXR1cywgdWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIG1vZGUsIHVpbnQxNl90IGludGVydmFsKTsKLXZvaWQgYnRtX3Njb19jaGtfcGVuZF91bnBhcmsodEhDSV9TVEFUVVMgaGNpX3N0YXR1cywgdWludDE2X3QgaGNpX2hhbmRsZSk7Ci12b2lkIGwyY19PbkhjaU1vZGVDaGFuZ2VTZW5kUGVuZGluZ1BhY2tldHMoUmF3QWRkcmVzcyByZW1vdGUpOwotdm9pZCBwcm9jZXNzX3Nzcl9ldmVudCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbWF4X3R4X2xhdCwgdWludDE2X3QgbWF4X3J4X2xhdCk7Ci10QUNMX0NPTk4qIGFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpOwotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLW5hbWVzcGFjZSB7Ci0KLXRCVE1fU1RBVFVTIHNldF9hY3RpdmVfbW9kZSh0QUNMX0NPTk4mIHBfYWNsKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPkxpbmtQb2xpY3koKS0+RXhpdFNuaWZmTW9kZSgKLSAgICAgIHBfYWNsLmhjaV9oYW5kbGUpOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci0KLXRCVE1fU1RBVFVTIHNldF9ob2xkX21vZGUodEFDTF9DT05OJiBwX2FjbCwgdWludDE2X3QgbWF4LCB1aW50MTZfdCBtaW4pIHsKLSAgYmx1ZXRvb3RoOjpzaGltOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+TGlua1BvbGljeSgpLT5Ib2xkTW9kZSgKLSAgICAgIHBfYWNsLmhjaV9oYW5kbGUsIG1heCwgbWluKTsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi10QlRNX1NUQVRVUyBzZXRfc25pZmZfbW9kZSh0QUNMX0NPTk4mIHBfYWNsLCB1aW50MTZfdCBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5faW50ZXJ2YWwsIHVpbnQxNl90IGF0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPkxpbmtQb2xpY3koKS0+U25pZmZNb2RlKAotICAgICAgcF9hY2wuaGNpX2hhbmRsZSwgbWF4X2ludGVydmFsLCBtaW5faW50ZXJ2YWwsIGF0dGVtcHQsIHRpbWVvdXQpOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgY29udHJvbGxlcl9zdXBwb3J0c19saW5rX3BvbGljeV9tb2RlKGNvbnN0IHRCVE1fUE1fTU9ERSYgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJvcF9jaGVjaykgewotICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEJUTV9QTV9NRF9BQ1RJVkU6ICAvLyBBY3RpdmUgbW9kZSBpcyBhbHdheXMgc3VwcG9ydGVkCi0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9QTV9NRF9QQVJLOiAgLy8gUGFyayBtb2RlIG5vIGxvbmdlciBzdXBwb3J0ZWQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEJUTV9QTV9NRF9TTklGRjoKLSAgICAgIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NuaWZmX21vZGUoKSB8fCBpbnRlcm9wX2NoZWNrKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9QTV9NRF9IT0xEOgotICAgICAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfaG9sZF9tb2RlKCkgfHwgaW50ZXJvcF9jaGVjaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiVW5rbm93biBtb2RlOiV1IiwgbW9kZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6UmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50KHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiKSB7Ci0gIGlmIChzdGQ6OmZpbmQoYnRtX2NiLmFjbF9jYl8ubGlua19wb2xpY3kuY2xpZW50cy5iZWdpbigpLAotICAgICAgICAgICAgICAgIGJ0bV9jYi5hY2xfY2JfLmxpbmtfcG9saWN5LmNsaWVudHMuZW5kKCksCi0gICAgICAgICAgICAgICAgcF9jYikgIT0gYnRtX2NiLmFjbF9jYl8ubGlua19wb2xpY3kuY2xpZW50cy5lbmQoKSkgewotICAgIExPR19FUlJPUigiTGluayBwb2xpY3kgY2xpZW50IGFscmVhZHkgcmVnaXN0ZXJlZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBidG1fY2IuYWNsX2NiXy5saW5rX3BvbGljeS5jbGllbnRzLnB1c2hfYmFjayhwX2NiKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpVbnJlZ2lzdGVyTGlua1BvbGljeUNsaWVudCh0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYikgewotICBhdXRvIGNiID0gc3RkOjpmaW5kKGJ0bV9jYi5hY2xfY2JfLmxpbmtfcG9saWN5LmNsaWVudHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICBidG1fY2IuYWNsX2NiXy5saW5rX3BvbGljeS5jbGllbnRzLmVuZCgpLCBwX2NiKTsKLSAgaWYgKGNiID09IGJ0bV9jYi5hY2xfY2JfLmxpbmtfcG9saWN5LmNsaWVudHMuZW5kKCkpIHsKLSAgICBMT0dfRVJST1IoIkxpbmsgcG9saWN5IGNsaWVudCBhbHJlYWR5IHVucmVnaXN0ZXJlZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBidG1fY2IuYWNsX2NiXy5saW5rX3BvbGljeS5jbGllbnRzLmVyYXNlKGNiKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX1NldFBvd2VyTW9kZSh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUTV9QTV9QV1JfTUQmIG5ld19tb2RlKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gQlRNX1VOS05PV05fQUREUjsKLSAgfQotCi0gIGlmICghY29udHJvbGxlcl9zdXBwb3J0c19saW5rX3BvbGljeV9tb2RlKAotICAgICAgICAgIG5ld19tb2RlLm1vZGUsCi0gICAgICAgICAgaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfRElTQUJMRV9TTklGRiwgJnBfYWNsLT5yZW1vdGVfYWRkcikpKSB7Ci0gICAgcmV0dXJuIEJUTV9NT0RFX1VOU1VQUE9SVEVEOwotICB9Ci0KLSAgaWYgKHBfYWNsLT5wb2xpY3kuTW9kZSgpID09IG5ld19tb2RlLm1vZGUpIHsKLSAgICBMT0dfSU5GTygiQ29udHJvbGxlciBhbHJlYWR5IGluIG1vZGU6JXNbMHglMDJ4XSIsCi0gICAgICAgICAgICAgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KHBfYWNsLT5wb2xpY3kuTW9kZSgpKS5jX3N0cigpLAotICAgICAgICAgICAgIHBfYWNsLT5wb2xpY3kuTW9kZSgpKTsKLSAgfQotCi0gIGlmIChwX2FjbC0+cG9saWN5Lm1vZGUuSXNQZW5kaW5nKCkpIHsKLSAgICBMT0dfSU5GTygiTGluayBwb2xpY3kgbW9kZSBpcyBwZW5kaW5nIik7Ci0gIH0KLQotICBMT0dfSU5GTygiU3dpdGNoaW5nIG1vZGUgZnJvbSAlcygweCV4KSB0byAlcygweCV4KSIsCi0gICAgICAgICAgIHBvd2VyX21vZGVfc3RhdGVfdGV4dChwX2FjbC0+cG9saWN5Lk1vZGUoKSkuY19zdHIoKSwKLSAgICAgICAgICAgcF9hY2wtPnBvbGljeS5Nb2RlKCksIHBvd2VyX21vZGVfc3RhdGVfdGV4dChuZXdfbW9kZS5tb2RlKS5jX3N0cigpLAotICAgICAgICAgICBuZXdfbW9kZS5tb2RlKTsKLQotICBwX2FjbC0+cG9saWN5Lm1vZGUucGVuZGluZ18gPSBuZXdfbW9kZS5tb2RlOwotICBzd2l0Y2ggKG5ld19tb2RlLm1vZGUpIHsKLSAgICBjYXNlIEJUTV9QTV9NRF9BQ1RJVkU6Ci0gICAgICBzZXRfYWN0aXZlX21vZGUoKnBfYWNsKTsKLSAgICAgIHJldHVybiBCVE1fU1VDQ0VTUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX1BNX01EX1NOSUZGOgotICAgICAgc2V0X3NuaWZmX21vZGUoKnBfYWNsLCBuZXdfbW9kZS5tYXgsIG5ld19tb2RlLm1pbiwgbmV3X21vZGUuYXR0ZW1wdCwKLSAgICAgICAgICAgICAgICAgICAgIG5ld19tb2RlLnRpbWVvdXQpOwotICAgICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fUE1fTURfSE9MRDoKLSAgICAgIHJldHVybiBzZXRfaG9sZF9tb2RlKCpwX2FjbCwgbmV3X21vZGUubWF4LCBuZXdfbW9kZS5taW4pOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIEJUTV9NT0RFX1VOU1VQUE9SVEVEOwotfQotCi1zdGF0aWMgYm9vbCBpc19lbmNyeXB0aW9uX3BhdXNlX3N1cHBvcnRlZChjb25zdCB0QUNMX0NPTk4mIHBfYWNsKSB7Ci0gIENIRUNLKHBfYWNsLnBlZXJfbG1wX2ZlYXR1cmVfdmFsaWRbMF0pCi0gICAgICA8PCAiQ2hlY2tlZCBiZWZvcmUgcmVtb3RlIGZlYXR1cmUgcmVhZCBoYXMgY29tcGxldGUiOwotICByZXR1cm4gSENJX0FUT01JQ19FTkNSWVBUX1NVUFBPUlRFRChwX2FjbC5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzWzBdKSAmJgotICAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2VuY3J5cHRpb25fcGF1c2UoKTsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OmJ0bV9wbV9vbl9tb2RlX2NoYW5nZSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGhjaV9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCkgewotICB0QlRNX1BNX01PREUgbmV3X21vZGUgPSBIQ0lfVE9fQlRNX1BPV0VSX01PREUoaGNpX21vZGUpOwotCi0gIExPR19ERUJVRygKLSAgICAgICJGb3Igbm93IHBvaW50aW5nIGJhY2sgYWdhaW4gdG8gbGVnYWN5IHN0YXR1czolcyBoYW5kbGU6MHglMDR4ICIKLSAgICAgICJuZXdfbW9kZToldSBpbnRlcnZhbDoldSIsCi0gICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXR1cykuY19zdHIoKSwgaGFuZGxlLCBuZXdfbW9kZSwgaW50ZXJ2YWwpOwotCi0gIHRBQ0xfQ09OTiogcF9hY2wgPSBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG1vZGUgY2hhbmdlIGZvciB1bmtub3duIGFjbCBoYW5kbGU6MHglMDR4IiwgaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRNX1BNX01PREUgcGVuZGluZyA9IHBfYWNsLT5wb2xpY3kubW9kZS5QZW5kaW5nKCk7Ci0gIHBfYWNsLT5wb2xpY3kubW9kZS5wZW5kaW5nXyA9IEJUTV9QTV9NRF9VTktOT1dOOwotCi0gIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBCVE1fTG9nSGlzdG9yeSgKLSAgICAgICAgIlBvd2VyIiwgcF9hY2wtPnJlbW90ZV9hZGRyLCAiTW9kZSBjaGFuZ2UiLAotICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVzWzB4JTAyeF0gPT0+ICVzWzB4JTAyeF0gcGVuZGluZzolcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlcl9tb2RlX3N0YXRlX3RleHQocF9hY2wtPnBvbGljeS5Nb2RlKCkpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbC0+cG9saWN5Lk1vZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyX21vZGVfc3RhdGVfdGV4dChuZXdfbW9kZSkuY19zdHIoKSwgbmV3X21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlcl9tb2RlX3N0YXRlX3RleHQocGVuZGluZykuY19zdHIoKSkpOwotICAgIExPR19JTkZPKCJQb3dlciBtb2RlIHN3aXRjaGVkIGZyb20gJXNbJWhodV0gdG8gJXNbJWhodV0gcGVuZGluZzolcyIsCi0gICAgICAgICAgICAgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KHBfYWNsLT5wb2xpY3kuTW9kZSgpKS5jX3N0cigpLAotICAgICAgICAgICAgIHBfYWNsLT5wb2xpY3kuTW9kZSgpLCBwb3dlcl9tb2RlX3N0YXRlX3RleHQobmV3X21vZGUpLmNfc3RyKCksCi0gICAgICAgICAgICAgbmV3X21vZGUsIHBvd2VyX21vZGVfc3RhdGVfdGV4dChwZW5kaW5nKS5jX3N0cigpKTsKLSAgICBwX2FjbC0+cG9saWN5Lm1vZGUubW9kZV8gPSBuZXdfbW9kZTsKLQotICAgIGlmIChuZXdfbW9kZSA9PSAoQlRNX1BNX1NUX0FDVElWRSkgfHwgbmV3X21vZGUgPT0gKEJUTV9QTV9TVF9TTklGRikpIHsKLSAgICAgIGwyY19PbkhjaU1vZGVDaGFuZ2VTZW5kUGVuZGluZ1BhY2tldHMocF9hY2wtPnJlbW90ZV9hZGRyKTsKLSAgICB9Ci0KLSAgICAvKmNoZWNrIGlmIHNjbyBkaXNjb25uZWN0ICBpcyB3YWl0aW5nIGZvciB0aGUgbW9kZSBjaGFuZ2UgKi8KLSAgICBidG1fc2NvX2Rpc2NfY2hrX3BlbmRfZm9yX21vZGVjaGFuZ2UoaGFuZGxlKTsKLQotICAgIGlmIChwX2FjbC0+aXNfc3dpdGNoX3JvbGVfbW9kZV9jaGFuZ2UoKSkgewotICAgICAgaWYgKHBfYWNsLT5pc19lbmNyeXB0ZWQgJiYgIWlzX2VuY3J5cHRpb25fcGF1c2Vfc3VwcG9ydGVkKCpwX2FjbCkpIHsKLSAgICAgICAgcF9hY2wtPnNldF9lbmNyeXB0aW9uX29mZigpOwotICAgICAgICBwX2FjbC0+c2V0X3N3aXRjaF9yb2xlX2VuY3J5cHRpb25fb2ZmKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX2FjbC0+c2V0X3N3aXRjaF9yb2xlX2luX3Byb2dyZXNzKCk7Ci0gICAgICAgIHBfYWNsLT5yc19kaXNjX3BlbmRpbmcgPSBCVE1fU0VDX1JTX1BFTkRJTkc7Ci0gICAgICAgIGJsdWV0b290aDo6bGVnYWN5OjpoY2k6OkdldEludGVyZmFjZSgpLlN0YXJ0Um9sZVN3aXRjaCgKLSAgICAgICAgICAgIHBfYWNsLT5yZW1vdGVfYWRkciwgSENJX1JPTEVfQ0VOVFJBTCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYnRtX3Njb19jaGtfcGVuZF91bnBhcmsoc3RhdHVzLCBoYW5kbGUpOwotICAvLyBidG1fcG1fcHJvY19tb2RlX2NoYW5nZShzdGF0dXMsIGhhbmRsZSwgbmV3X21vZGUsIGludGVydmFsKTsKLQotICBmb3IgKGF1dG8gY2xpZW50X2NhbGxiYWNrIDogYnRtX2NiLmFjbF9jYl8ubGlua19wb2xpY3kuY2xpZW50cykgewotICAgICgqY2xpZW50X2NhbGxiYWNrKShwX2FjbC0+cmVtb3RlX2FkZHIsIG5ld19tb2RlLCBpbnRlcnZhbCwgc3RhdHVzKTsKLSAgfQotCi0gIExPR19ERUJVRygKLSAgICAgICJOb3RpZmllZCBtb2RlIGNoYW5nZSByZWdpc3RlcmVkIGNsaWVudHMgY250OiV6dSBwZWVyOiVzICIKLSAgICAgICJzdGF0dXM6JXMiLAotICAgICAgYnRtX2NiLmFjbF9jYl8ubGlua19wb2xpY3kuY2xpZW50cy5zaXplKCksCi0gICAgICBQUklWQVRFX0FERFJFU1MocF9hY2wtPnJlbW90ZV9hZGRyKSwgaGNpX2Vycm9yX2NvZGVfdGV4dChzdGF0dXMpLmNfc3RyKCkpOwotfQotCi10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXRTc3JQYXJhbXModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2xvY190bykgewotICBMT0dfREVCVUcoIlNlbmRpbmcgZ2QgcG93ZXIgbW9kZSBTU1IgUGFyYW1zIik7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gQlRNX1VOS05PV05fQUREUjsKLSAgfQotCi0gIHBfYWNsLT5wb2xpY3kuc25pZmZfc3VicmF0aW5nLnBlbmRpbmdfID0gdHJ1ZTsKLSAgYmx1ZXRvb3RoOjpzaGltOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+TGlua1BvbGljeSgpLT5TbmlmZlN1YnJhdGluZygKLSAgICAgIGhhbmRsZSwgbWF4X2xhdCwgbWluX3JtdF90bywgbWluX2xvY190byk7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OmJ0bV9wbV9vbl9zbmlmZl9zdWJyYXRpbmcoCi0gICAgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LCB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIHsKLSAgTE9HX0RFQlVHKCJGb3Igbm93IHBvaW50aW5nIGJhY2sgYWdhaW4gdG8gbGVnYWN5Iik7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIlJlY2VpdmVkIG1vZGUgY2hhbmdlIGZvciB1bmtub3duIGFjbCBoYW5kbGU6MHglMDR4IiwgaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2FjbC0+cG9saWN5LnNuaWZmX3N1YnJhdGluZy5wZW5kaW5nXyA9IGZhbHNlOwotICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgQlRNX0xvZ0hpc3RvcnkoCi0gICAgICAgICJQb3dlciIsIHBfYWNsLT5yZW1vdGVfYWRkciwgIlNuaWZmIFN1YnJhdGluZyIsCi0gICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICJtYXhfeG1pdF9sYXRlbmN5OiUuMmZzIHJlbW90ZV90aW1lb3V0OiUuMmZzIGxvY2FsX3RpbWVvdXQ6JS4yZnMiLAotICAgICAgICAgICAgdGlja3NfdG9fc2Vjb25kcyhtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3kpLAotICAgICAgICAgICAgdGlja3NfdG9fc2Vjb25kcyhtaW5pbXVtX3JlbW90ZV90aW1lb3V0KSwKLSAgICAgICAgICAgIHRpY2tzX3RvX3NlY29uZHMobWluaW11bV9sb2NhbF90aW1lb3V0KSkpOwotICB9Ci0KLSAgY29uc3QgYm9vbCB1c2Vfc3NyID0KLSAgICAgIChwX2FjbC0+cG9saWN5Lm1vZGUuSW50ZXJ2YWwoKSAhPSBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSkgPyB0cnVlIDogZmFsc2U7Ci0KLSAgZm9yIChhdXRvIGNsaWVudF9jYWxsYmFjayA6IGJ0bV9jYi5hY2xfY2JfLmxpbmtfcG9saWN5LmNsaWVudHMpIHsKLSAgICAoKmNsaWVudF9jYWxsYmFjaykocF9hY2wtPnJlbW90ZV9hZGRyLCBCVE1fUE1fU1RTX1NTUiwgKHVzZV9zc3IpID8gMSA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gIH0KLQotICBMT0dfREVCVUcoCi0gICAgICAiTm90aWZpZWQgc25pZmYgc3VicmF0aW5nIHJlZ2lzdGVyZWQgY2xpZW50cyBjbnQ6JXp1IHBlZXI6JXMgdXNlX3NzcjolcyAiCi0gICAgICAic3RhdHVzOiVzIiwKLSAgICAgIGJ0bV9jYi5hY2xfY2JfLmxpbmtfcG9saWN5LmNsaWVudHMuc2l6ZSgpLAotICAgICAgUFJJVkFURV9BRERSRVNTKHBfYWNsLT5yZW1vdGVfYWRkciksIGxvZ2Jvb2wodXNlX3NzcikuY19zdHIoKSwKLSAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLX0KZGlmZiAtLWdpdCBhL21haW4vc2hpbS9saW5rX3BvbGljeS5oIGIvbWFpbi9zaGltL2xpbmtfcG9saWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NmZkMDcuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL2xpbmtfcG9saWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSAic3RhY2svYWNsL2FjbC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIiAgLy8gdEJUTV9QTV9QV1JfTUQKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotYm9vbCBSZWdpc3RlckxpbmtQb2xpY3lDbGllbnQodEJUTV9QTV9TVEFUVVNfQ0JBQ0sqIHBfY2IpOwotYm9vbCBVbnJlZ2lzdGVyTGlua1BvbGljeUNsaWVudCh0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYik7Ci0KLWJvb2wgU2V0SG9sZE1vZGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfaW50ZXJ2YWwsIHVpbnQxNl90IG1pbl9pbnRlcnZhbCk7Ci1ib29sIFNldFNuaWZmTW9kZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9pbnRlcnZhbCwgdWludDE2X3QgbWluX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0ZW1wdCwgdWludDE2X3QgdGltZW91dCk7Ci1ib29sIEV4aXRTbmlmZk1vZGUodWludDE2X3QgaGFuZGxlKTsKLWJvb2wgU2V0U25pZmZTdWJyYXRpbmcodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhpbXVtX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci0KLXRCVE1fU1RBVFVTIEJUTV9TZXRQb3dlck1vZGUodWludDE2X3QgaGFuZGxlLCBjb25zdCB0QlRNX1BNX1BXUl9NRCYgbW9kZSk7Ci12b2lkIGJ0bV9wbV9vbl9tb2RlX2NoYW5nZSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfTU9ERSBjdXJyZW50X21vZGUsIHVpbnQxNl90IGludGVydmFsKTsKLQotdEJUTV9TVEFUVVMgQlRNX1NldFNzclBhcmFtcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sIHVpbnQxNl90IG1pbl9sb2NfdG8pOwotdm9pZCBidG1fcG1fb25fc25pZmZfc3VicmF0aW5nKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL2xpbmtfcG9saWN5X2ludGVyZmFjZS5oIGIvbWFpbi9zaGltL2xpbmtfcG9saWN5X2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQyM2ExLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9saW5rX3BvbGljeV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci0KLWNsYXNzIExpbmtQb2xpY3lJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIEhvbGRNb2RlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2ludGVydmFsKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTbmlmZk1vZGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2ludGVydmFsLCB1aW50MTZfdCBhdHRlbXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpID0gMDsKLSAgdmlydHVhbCBib29sIEV4aXRTbmlmZk1vZGUodWludDE2X3QgaGFuZGxlKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTbmlmZlN1YnJhdGluZyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heGltdW1fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpID0gMDsKLSAgdmlydHVhbCB+TGlua1BvbGljeUludGVyZmFjZSgpID0gZGVmYXVsdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vbWV0cmljX2lkX2FwaS5jYyBiL21haW4vc2hpbS9tZXRyaWNfaWRfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkxMmJjLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9tZXRyaWNfaWRfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiZ2QvY29tbW9uL21ldHJpY19pZF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGVscGVycy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9tZXRyaWNfaWRfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWV0cmljSWRNYW5hZ2VyOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotdXNpbmcgQ2FsbGJhY2tHZCA9IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCBjb25zdCBpbnQgaWQpPjsKLQotYm9vbCBJbml0TWV0cmljSWRBbGxvY2F0b3IoCi0gICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4mIHBhaXJlZF9kZXZpY2VfbWFwLAotICAgIENhbGxiYWNrTGVnYWN5IHNhdmVfaWRfY2FsbGJhY2ssIENhbGxiYWNrTGVnYWN5IGZvcmdldF9kZXZpY2VfY2FsbGJhY2spIHsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPEFkZHJlc3MsIGludD4gcGFpcmVkX2RldmljZV9tYXBfZ2Q7Ci0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogcGFpcmVkX2RldmljZV9tYXApIHsKLSAgICBBZGRyZXNzIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvR2RBZGRyZXNzKGRldmljZS5maXJzdCk7Ci0gICAgcGFpcmVkX2RldmljZV9tYXBfZ2RbYWRkcmVzc10gPSBkZXZpY2Uuc2Vjb25kOwotICB9Ci0KLSAgQ2FsbGJhY2tHZCBzYXZlX2lkX2NhbGxiYWNrX2dkID0gW3NhdmVfaWRfY2FsbGJhY2tdKGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaWQpIHsKLSAgICByZXR1cm4gc2F2ZV9pZF9jYWxsYmFjayhibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhhZGRyZXNzKSwgaWQpOwotICB9OwotICBDYWxsYmFja0dkIGZvcmdldF9kZXZpY2VfY2FsbGJhY2tfZ2QgPQotICAgICAgW2ZvcmdldF9kZXZpY2VfY2FsbGJhY2tdKGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MsIGNvbnN0IGludCBpZCkgewotICAgICAgICByZXR1cm4gZm9yZ2V0X2RldmljZV9jYWxsYmFjayhibHVldG9vdGg6OlRvUmF3QWRkcmVzcyhhZGRyZXNzKSwgaWQpOwotICAgICAgfTsKLSAgcmV0dXJuIE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5Jbml0KAotICAgICAgcGFpcmVkX2RldmljZV9tYXBfZ2QsIHNhdmVfaWRfY2FsbGJhY2tfZ2QsIGZvcmdldF9kZXZpY2VfY2FsbGJhY2tfZ2QpOwotfQotCi1ib29sIENsb3NlTWV0cmljSWRBbGxvY2F0b3IoKSB7IHJldHVybiBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCkuQ2xvc2UoKTsgfQotCi1ib29sIElzRW1wdHlNZXRyaWNJZEFsbG9jYXRvcigpIHsKLSAgcmV0dXJuIE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5Jc0VtcHR5KCk7Ci19Ci0KLWludCBBbGxvY2F0ZUlkRnJvbU1ldHJpY0lkQWxsb2NhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKSB7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IGJsdWV0b290aDo6VG9HZEFkZHJlc3MocmF3X2FkZHJlc3MpOwotICByZXR1cm4gTWV0cmljSWRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLkFsbG9jYXRlSWQoYWRkcmVzcyk7Ci19Ci0KLWJvb2wgU2F2ZURldmljZU9uTWV0cmljSWRBbGxvY2F0b3IoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIHJldHVybiBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCkuU2F2ZURldmljZShhZGRyZXNzKTsKLX0KLQotdm9pZCBGb3JnZXREZXZpY2VGcm9tTWV0cmljSWRBbGxvY2F0b3IoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIHJldHVybiBNZXRyaWNJZE1hbmFnZXI6OkdldEluc3RhbmNlKCkuRm9yZ2V0RGV2aWNlKGFkZHJlc3MpOwotfQotCi1ib29sIElzVmFsaWRJZEZyb21NZXRyaWNJZEFsbG9jYXRvcihjb25zdCBpbnQgaWQpIHsKLSAgcmV0dXJuIE1ldHJpY0lkTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5Jc1ZhbGlkSWQoaWQpOwotfQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9tZXRyaWNfaWRfYXBpLmggYi9tYWluL3NoaW0vbWV0cmljX2lkX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODcyNmVhLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9tZXRyaWNfaWRfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLXVzaW5nIENhbGxiYWNrTGVnYWN5ID0KLSAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgY29uc3QgaW50IGlkKT47Ci0vKioKLSAqIEluaXRpYWxpemUgdGhlIGFsbG9jYXRvcgotICoKLSAqIEBwYXJhbSBwYWlyZWRfZGV2aWNlX21hcCBtYXAgZnJvbSBtYWNfYWRkcmVzcyB0byBpZCBhbHJlYWR5IHNhdmVkCi0gKiBpbiB0aGUgZGlzayBiZWZvcmUgaW5pdAotICogQHBhcmFtIHNhdmVfaWRfY2FsbGJhY2sgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWxseQotICogc2F2aW5nIGlkIGZvciBhIHBhaXJlZCBkZXZpY2UKLSAqIEBwYXJhbSBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCBhZnRlcgotICogc3VjY2Vzc2Z1bCBpZCBkZWxldGlvbiBmb3IgZm9yZ290dGVuIGRldmljZSwKLSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQKLSAqLwotYm9vbCBJbml0TWV0cmljSWRBbGxvY2F0b3IoCi0gICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4mIHBhaXJlZF9kZXZpY2VfbWFwLAotICAgIENhbGxiYWNrTGVnYWN5IHNhdmVfaWRfY2FsbGJhY2ssIENhbGxiYWNrTGVnYWN5IGZvcmdldF9kZXZpY2VfY2FsbGJhY2spOwotCi0vKioKLSAqIENsb3NlIHRoZSBhbGxvY2F0b3IuIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBCbHVldG9vdGggcHJvY2VzcyBpcyBraWxsZWQKLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGNsb3NlCi0gKi8KLWJvb2wgQ2xvc2VNZXRyaWNJZEFsbG9jYXRvcigpOwotCi0vKioKLSAqIENoZWNrIGlmIG5vIGlkIHNhdmVkIGluIG1lbW9yeQotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiBubyBpZCBpcyBzYXZlZAotICovCi1ib29sIElzRW1wdHlNZXRyaWNJZEFsbG9jYXRvcigpOwotCi0vKioKLSAqIEFsbG9jYXRlIGFuIGlkIGZvciBhIHNjYW5uZWQgZGV2aWNlLCBvciByZXR1cm4gdGhlIGlkIGlmIHRoZXJlIGlzIGFscmVhZHkKLSAqIG9uZQotICoKLSAqIEBwYXJhbSByYXdfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gKiBAcmV0dXJuIHRoZSBpZCBvZiBkZXZpY2UKLSAqLwotaW50IEFsbG9jYXRlSWRGcm9tTWV0cmljSWRBbGxvY2F0b3IoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpOwotCi0vKioKLSAqIFNhdmUgdGhlIGlkIGZvciBhIHBhaXJlZCBkZXZpY2UKLSAqCi0gKiBAcGFyYW0gcmF3X2FkZHJlc3MgbWFjIGFkZHJlc3Mgb2YgQmx1ZXRvb3RoIGRldmljZQotICogQHJldHVybiB0cnVlIGlmIHNhdmUgc3VjY2Vzc2Z1bGx5Ci0gKi8KLWJvb2wgU2F2ZURldmljZU9uTWV0cmljSWRBbGxvY2F0b3IoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpOwotCi0vKioKLSAqIERlbGV0ZSB0aGUgaWQgZm9yIGEgZGV2aWNlIHRvIGJlIGZvcmdvdHRlbgotICoKLSAqIEBwYXJhbSByYXdfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gKi8KLXZvaWQgRm9yZ2V0RGV2aWNlRnJvbU1ldHJpY0lkQWxsb2NhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKTsKLQotLyoqCi0gKiBDaGVjayBpZiBhbiBpZCBpcyB2YWxpZC4KLSAqIFRoZSBpZCBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGtNYXhJZCBhbmQgYmlnZ2VyIHRoYW4gb3IgZXF1YWwgdG8KLSAqIGtNaW5JZAotICoKLSAqIEBwYXJhbSBtYWNfYWRkcmVzcyBtYWMgYWRkcmVzcyBvZiBCbHVldG9vdGggZGV2aWNlCi0gKiBAcmV0dXJuIHRydWUgaWYgZGVsZXRlIHN1Y2Nlc3NmdWxseQotICovCi1ib29sIElzVmFsaWRJZEZyb21NZXRyaWNJZEFsbG9jYXRvcihjb25zdCBpbnQgaWQpOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL21ldHJpY3NfYXBpLmNjIGIvbWFpbi9zaGltL21ldHJpY3NfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYwZTIzLi4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9tZXRyaWNzX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibWFpbi9zaGltL21ldHJpY3NfYXBpLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJnZC9vcy9tZXRyaWNzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2hlbHBlcnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2hpbSB7Ci12b2lkIExvZ01ldHJpY0xpbmtMYXllckNvbm5lY3Rpb25FdmVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiByYXdfYWRkcmVzcywgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwgdWludDE2X3QgbGlua190eXBlLAotICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSkgewotICBBZGRyZXNzIGFkZHJlc3MgPSBBZGRyZXNzOjprRW1wdHk7Ci0gIGlmIChyYXdfYWRkcmVzcyAhPSBudWxscHRyKSB7Ci0gICAgYWRkcmVzcyA9IGJsdWV0b290aDo6VG9HZEFkZHJlc3MoKnJhd19hZGRyZXNzKTsKLSAgfQotICBibHVldG9vdGg6Om9zOjpMb2dNZXRyaWNMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQoCi0gICAgICByYXdfYWRkcmVzcyA9PSBudWxscHRyID8gbnVsbHB0ciA6ICZhZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSwgZGlyZWN0aW9uLAotICAgICAgbGlua190eXBlLCBoY2lfY21kLCBoY2lfZXZlbnQsIGhjaV9ibGVfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlKTsKLX0KLQotdm9pZCBMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX21pc3NpbmdfcGNtX2J5dGVzKSB7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IGJsdWV0b290aDo6VG9HZEFkZHJlc3MocmF3X2FkZHJlc3MpOwotICBibHVldG9vdGg6Om9zOjpMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KAotICAgICAgYWRkcmVzcywgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBudW1fbWlzc2luZ19wY21fYnl0ZXMpOwotfQotCi12b2lkIExvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMpIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudCgKLSAgICAgIGFkZHJlc3MsIGVuY29kaW5nX2ludGVydmFsX21pbGxpcywgbnVtX2Ryb3BwZWRfYnVmZmVycywKLSAgICAgIG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKTsKLX0KLQotdm9pZCBMb2dNZXRyaWNBMmRwUGxheWJhY2tFdmVudChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrX3N0YXRlLCBpbnQgYXVkaW9fY29kaW5nX21vZGUpIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY0EyZHBQbGF5YmFja0V2ZW50KGFkZHJlc3MsIHBsYXliYWNrX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb2RpbmdfbW9kZSk7Ci19Ci0KLXZvaWQgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywgaW50OF90IHJzc2kpIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY1JlYWRSc3NpUmVzdWx0KGFkZHJlc3MsIGhhbmRsZSwgY21kX3N0YXR1cywgcnNzaSk7Ci19Ci0KLXZvaWQgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcikgewotICBBZGRyZXNzIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvR2RBZGRyZXNzKHJhd19hZGRyZXNzKTsKLSAgYmx1ZXRvb3RoOjpvczo6TG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KAotICAgICAgYWRkcmVzcywgaGFuZGxlLCBjbWRfc3RhdHVzLCBmYWlsZWRfY29udGFjdF9jb3VudGVyKTsKLX0KLQotdm9pZCBMb2dNZXRyaWNSZWFkVHhQb3dlckxldmVsUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IGJsdWV0b290aDo6VG9HZEFkZHJlc3MocmF3X2FkZHJlc3MpOwotICBibHVldG9vdGg6Om9zOjpMb2dNZXRyaWNSZWFkVHhQb3dlckxldmVsUmVzdWx0KGFkZHJlc3MsIGhhbmRsZSwgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci19Ci0KLXZvaWQgTG9nTWV0cmljU21wUGFpcmluZ0V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY1NtcFBhaXJpbmdFdmVudChhZGRyZXNzLCBzbXBfY21kLCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXBfZmFpbF9yZWFzb24pOwotfQotCi12b2lkIExvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBoY2lfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZWFzb25fY29kZSwgaW50NjRfdCBldmVudF92YWx1ZSkgewotICBBZGRyZXNzIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvR2RBZGRyZXNzKHJhd19hZGRyZXNzKTsKLSAgYmx1ZXRvb3RoOjpvczo6TG9nTWV0cmljQ2xhc3NpY1BhaXJpbmdFdmVudChhZGRyZXNzLCBoYW5kbGUsIGhjaV9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpX2V2ZW50LCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbl9jb2RlLCBldmVudF92YWx1ZSk7Ci19Ci0KLXZvaWQgTG9nTWV0cmljU2RwQXR0cmlidXRlKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwgdWludDE2X3QgYXR0cmlidXRlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLCBjb25zdCBjaGFyKiBhdHRyaWJ1dGVfdmFsdWUpIHsKLSAgQWRkcmVzcyBhZGRyZXNzID0gYmx1ZXRvb3RoOjpUb0dkQWRkcmVzcyhyYXdfYWRkcmVzcyk7Ci0gIGJsdWV0b290aDo6b3M6OkxvZ01ldHJpY1NkcEF0dHJpYnV0ZShhZGRyZXNzLCBwcm90b2NvbF91dWlkLCBhdHRyaWJ1dGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfc2l6ZSwgYXR0cmlidXRlX3ZhbHVlKTsKLX0KLQotdm9pZCBMb2dNZXRyaWNTb2NrZXRDb25uZWN0aW9uU3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIGludCBwb3J0LCBpbnQgdHlwZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW0gY29ubmVjdGlvbl9zdGF0ZSwKLSAgICBpbnQ2NF90IHR4X2J5dGVzLCBpbnQ2NF90IHJ4X2J5dGVzLCBpbnQgdWlkLCBpbnQgc2VydmVyX3BvcnQsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRSb2xlRW51bSBzb2NrZXRfcm9sZSkgewotICBBZGRyZXNzIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvR2RBZGRyZXNzKHJhd19hZGRyZXNzKTsKLSAgYmx1ZXRvb3RoOjpvczo6TG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlKAotICAgICAgYWRkcmVzcywgcG9ydCwgdHlwZSwgY29ubmVjdGlvbl9zdGF0ZSwgdHhfYnl0ZXMsIHJ4X2J5dGVzLCB1aWQsCi0gICAgICBzZXJ2ZXJfcG9ydCwgc29ja2V0X3JvbGUpOwotfQotCi12b2lkIExvZ01ldHJpY01hbnVmYWN0dXJlckluZm8oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEZXZpY2VJbmZvU3JjRW51bSBzb3VyY2VfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLCBjb25zdCBzdGQ6OnN0cmluZyYgaGFyZHdhcmVfdmVyc2lvbiwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbikgewotICBBZGRyZXNzIGFkZHJlc3MgPSBibHVldG9vdGg6OlRvR2RBZGRyZXNzKHJhd19hZGRyZXNzKTsKLSAgYmx1ZXRvb3RoOjpvczo6TG9nTWV0cmljTWFudWZhY3R1cmVySW5mbyhhZGRyZXNzLCBzb3VyY2VfdHlwZSwgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyLCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZV92ZXJzaW9uLCBzb2Z0d2FyZV92ZXJzaW9uKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL21ldHJpY3NfYXBpLmggYi9tYWluL3NoaW0vbWV0cmljc19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4Y2ZlOS4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vbWV0cmljc19hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvZW51bXMucGIuaD4KLSNpbmNsdWRlIDxmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoL2hjaS9lbnVtcy5wYi5oPgotCi0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotLyoqCi0gKiBMb2cgbGluayBsYXllciBjb25uZWN0aW9uIGV2ZW50Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgU3RhY2sgd2lkZSBjb25zaXN0ZW50IEJsdWV0b290aCBhZGRyZXNzIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVua25vd24KLSAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZSBjb25uZWN0aW9uIGhhbmRsZSBvZiB0aGlzIGV2ZW50LAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBkaXJlY3Rpb24gZGlyZWN0aW9uIG9mIHRoaXMgY29ubmVjdGlvbgotICogQHBhcmFtIGxpbmtfdHlwZSB0eXBlIG9mIHRoZSBsaW5rCi0gKiBAcGFyYW0gaGNpX2NtZCBIQ0kgY29tbWFuZCBvcGVjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSBoY2lfZXZlbnQgSENJIGV2ZW50IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQsIGlmIGFueQotICogQHBhcmFtIGhjaV9ibGVfZXZlbnQgSENJIEJMRSBldmVudCBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSBjbWRfc3RhdHVzIENvbW1hbmQgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LCBpZiBhbnkKLSAqIEBwYXJhbSByZWFzb25fY29kZSBSZWFzb24gY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCwgaWYgYW55Ci0gKi8KLXZvaWQgTG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sIHVpbnQxNl90IGxpbmtfdHlwZSwKLSAgICB1aW50MzJfdCBoY2lfY21kLCB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsCi0gICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUpOwotCi0vKioKLSAqIExvZyBBMkRQIGF1ZGlvIGJ1ZmZlciB1bmRlcnJ1biBldmVudAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIEEyRFAgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzIGVuY29kaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcwotICogQHBhcmFtIG51bV9taXNzaW5nX3BjbV9ieXRlcyBudW1iZXIgb2YgUENNIGJ5dGVzIHRoYXQgY2Fubm90IGJlIHJlYWQgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlCi0gKi8KLXZvaWQgTG9nTWV0cmljQTJkcEF1ZGlvVW5kZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX21pc3NpbmdfcGNtX2J5dGVzKTsKLQotLyoqCi0gKiBMb2cgQTJEUCBhdWRpbyBidWZmZXIgb3ZlcnJ1biBldmVudAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIEEyRFAgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzIGVuY29kaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcwotICogQHBhcmFtIG51bV9kcm9wcGVkX2J1ZmZlcnMgbnVtYmVyIG9mIGVuY29kZWQgYnVmZmVycyBkcm9wcGVkIGZyb20gVHggcXVldWUKLSAqIEBwYXJhbSBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcyBudW1iZXIgb2YgZW5jb2RlZCBmcmFtZXMgZHJvcHBlZCBmcm9tIFR4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUKLSAqIEBwYXJhbSBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzIG51bWJlciBvZiBlbmNvZGVkIGJ5dGVzIGRyb3BwZWQgZnJvbSBUeAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUKLSAqLwotdm9pZCBMb2dNZXRyaWNBMmRwQXVkaW9PdmVycnVuRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMpOwotCi0vKioKLSAqIExvZyBBMkRQIGF1ZGlvIHBsYXliYWNrIHN0YXRlIGNoYW5nZWQgZXZlbnQKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBBMkRQIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIHBsYXliYWNrX3N0YXRlIEEyRFAgYXVkaW8gcGxheWJhY2sgc3RhdGUsIG9uL29mZgotICogQHBhcmFtIGF1ZGlvX2NvZGluZ19tb2RlIEEyRFAgYXVkaW8gY29kZWMgZW5jb2RpbmcgbW9kZSwgaHcvc3cKLSAqLwotdm9pZCBMb2dNZXRyaWNBMmRwUGxheWJhY2tFdmVudChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrX3N0YXRlLCBpbnQgYXVkaW9fY29kaW5nX21vZGUpOwotCi0vKioKLSAqIExvZyByZWFkIFJTU0kgcmVzdWx0Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBjbWRfc3RhdHVzIGNvbW1hbmQgc3RhdHVzIGZyb20gcmVhZCBSU1NJIGNvbW1hbmQKLSAqIEBwYXJhbSByc3NpIHJzc2kgdmFsdWUgaW4gZEJtCi0gKi8KLXZvaWQgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSk7Ci0KLS8qKgotICogTG9nIGZhaWxlZCBjb250YWN0IGNvdW50ZXIgcmVwb3J0Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gaGFuZGxlIGNvbm5lY3Rpb24gaGFuZGxlIG9mIHRoaXMgZXZlbnQsCi0gKiAgICAgICAgICAgICAgIHtAbGluayBrVW5rbm93bkNvbm5lY3Rpb25IYW5kbGV9IGlmIHVua25vd24KLSAqIEBwYXJhbSBjbWRfc3RhdHVzIGNvbW1hbmQgc3RhdHVzIGZyb20gcmVhZCBmYWlsZWQgY29udGFjdCBjb3VudGVyIGNvbW1hbmQKLSAqIEBwYXJhbSBmYWlsZWRfY29udGFjdF9jb3VudGVyIE51bWJlciBvZiBjb25zZWN1dGl2ZSBmYWlsZWQgY29udGFjdHMgZm9yIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgSGFuZGxlCi0gKi8KLXZvaWQgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKTsKLQotLyoqCi0gKiBMb2cgdHJhbnNtaXQgcG93ZXIgbGV2ZWwgZm9yIGEgcGFydGljdWxhciBkZXZpY2UgYWZ0ZXIgcmVhZAotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGhhbmRsZSBjb25uZWN0aW9uIGhhbmRsZSBvZiB0aGlzIGV2ZW50LAotICogICAgICAgICAgICAgICB7QGxpbmsga1Vua25vd25Db25uZWN0aW9uSGFuZGxlfSBpZiB1bmtub3duCi0gKiBAcGFyYW0gY21kX3N0YXR1cyBjb21tYW5kIHN0YXR1cyBmcm9tIHJlYWQgZmFpbGVkIGNvbnRhY3QgY291bnRlciBjb21tYW5kCi0gKiBAcGFyYW0gdHJhbnNtaXRfcG93ZXJfbGV2ZWwgdHJhbnNtaXQgcG93ZXIgbGV2ZWwgZm9yIGNvbm5lY3Rpb24gdG8gdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZQotICovCi12b2lkIExvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci0KLS8qKgotICogTG9ncyB3aGVuIHRoZXJlIGlzIGFuIGV2ZW50IHJlbGF0ZWQgdG8gQmx1ZXRvb3RoIFNlY3VyaXR5IE1hbmFnZXIgUHJvdG9jb2wKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIGFzc29jaWF0ZWQgZGV2aWNlCi0gKiBAcGFyYW0gc21wX2NtZCBTTVAgY29tbWFuZCBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gZGlyZWN0aW9uIGRpcmVjdGlvbiBvZiB0aGlzIFNNUCBjb21tYW5kCi0gKiBAcGFyYW0gc21wX2ZhaWxfcmVhc29uIFNNUCBwYWlyaW5nIGZhaWx1cmUgcmVhc29uIGNvZGUgZnJvbSBTTVAgc3BlYwotICovCi12b2lkIExvZ01ldHJpY1NtcFBhaXJpbmdFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pOwotCi0vKioKLSAqIExvZ3MgdGhlcmUgaXMgYW4gZXZlbnQgcmVsYXRlZCBCbHVldG9vdGggY2xhc3NpYyBwYWlyaW5nCi0gKgotICogQHBhcmFtIGFkZHJlc3MgYWRkcmVzcyBvZiBhc3NvY2lhdGVkIGRldmljZQotICogQHBhcmFtIGhhbmRsZSBjb25uZWN0aW9uIGhhbmRsZSBvZiB0aGlzIGV2ZW50LAotICogICAgICAgICAgICAgICB7QGxpbmsga1Vua25vd25Db25uZWN0aW9uSGFuZGxlfSBpZiB1bmtub3duCi0gKiBAcGFyYW0gaGNpX2NtZCBIQ0kgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudAotICogQHBhcmFtIGhjaV9ldmVudCBIQ0kgZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBjbWRfc3RhdHVzIENvbW1hbmQgc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50Ci0gKiBAcGFyYW0gcmVhc29uX2NvZGUgUmVhc29uIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQKLSAqIEBwYXJhbSBldmVudF92YWx1ZSBBIHN0YXR1cyB2YWx1ZSByZWxhdGVkIHRvIHRoaXMgc3BlY2lmaWMgZXZlbnQKLSAqLwotdm9pZCBMb2dNZXRyaWNDbGFzc2ljUGFpcmluZ0V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoY2lfY21kLCB1aW50MTZfdCBoY2lfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBldmVudF92YWx1ZSk7Ci0KLS8qKgotICogTG9ncyB3aGVuIGNlcnRhaW4gQmx1ZXRvb3RoIFNEUCBhdHRyaWJ1dGVzIGFyZSBkaXNjb3ZlcmVkCi0gKgotICogQHBhcmFtIGFkZHJlc3MgYWRkcmVzcyBvZiBhc3NvY2lhdGVkIGRldmljZQotICogQHBhcmFtIHByb3RvY29sX3V1aWQgMTYgYml0IHByb3RvY29sIFVVSUQgZnJvbSBCbHVldG9vdGggQXNzaWduZWQgTnVtYmVycwotICogQHBhcmFtIGF0dHJpYnV0ZV9pZCAxNiBiaXQgYXR0cmlidXRlIElEIGZyb20gQmx1ZXRvb3RoIEFzc2lnbmVkIE51bWJlcnMKLSAqIEBwYXJhbSBhdHRyaWJ1dGVfc2l6ZSBzaXplIG9mIHRoaXMgYXR0cmlidXRlCi0gKiBAcGFyYW0gYXR0cmlidXRlX3ZhbHVlIHBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZSBkYXRhLCBtdXN0IGJlIGxhcmdlciB0aGFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9zaXplCi0gKi8KLXZvaWQgTG9nTWV0cmljU2RwQXR0cmlidXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSk7Ci0KLS8qKgotICogTG9ncyB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIEJsdWV0b290aCBzb2NrZXQgY29ubmVjdGlvbiBzdGF0ZQotICoKLSAqIEBwYXJhbSBhZGRyZXNzIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBkZXZpY2UsIGVtcHR5IGlmIHRoaXMgaXMgYSBzZXJ2ZXIgcG9ydAotICogQHBhcmFtIHBvcnQgcG9ydCBvZiB0aGlzIHNvY2tldCBjb25uZWN0aW9uCi0gKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHNvY2tldAotICogQHBhcmFtIGNvbm5lY3Rpb25fc3RhdGUgc29ja2V0IGNvbm5lY3Rpb24gc3RhdGUKLSAqIEBwYXJhbSB0eF9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQKLSAqIEBwYXJhbSByeF9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQKLSAqIEBwYXJhbSBzZXJ2ZXJfcG9ydCBzZXJ2ZXIgcG9ydCBvZiB0aGlzIHNvY2tldCwgaWYgYW55LiBXaGVuIGJvdGgKLSAqICAgICAgICB8c2VydmVyX3BvcnR8IGFuZCB8cG9ydHwgZmllbGRzIGFyZSBwb3B1bGF0ZWQsIHxwb3J0fCBtdXN0IGJlIHNwYXduZWQKLSAqICAgICAgICBieSB8c2VydmVyX3BvcnR8Ci0gKiBAcGFyYW0gc29ja2V0X3JvbGUgcm9sZSBvZiB0aGlzIHNvY2tldCwgc2VydmVyIG9yIGNvbm5lY3Rpb24KLSAqIEBwYXJhbSB1aWQgc29ja2V0IG93bmVyJ3MgdWlkCi0gKi8KLXZvaWQgTG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGludCBwb3J0LCBpbnQgdHlwZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldENvbm5lY3Rpb25zdGF0ZUVudW0gY29ubmVjdGlvbl9zdGF0ZSwKLSAgICBpbnQ2NF90IHR4X2J5dGVzLCBpbnQ2NF90IHJ4X2J5dGVzLCBpbnQgdWlkLCBpbnQgc2VydmVyX3BvcnQsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRSb2xlRW51bSBzb2NrZXRfcm9sZSk7Ci0KLS8qKgotICogTG9ncyB3aGVuIGEgQmx1ZXRvb3RoIGRldmljZSdzIG1hbnVmYWN0dXJlciBpbmZvcm1hdGlvbiBpcyBsZWFybnQKLSAqCi0gKiBAcGFyYW0gYWRkcmVzcyBhZGRyZXNzIG9mIGFzc29jaWF0ZWQgZGV2aWNlCi0gKiBAcGFyYW0gc291cmNlX3R5cGUgd2hlcmUgaXMgdGhpcyBkZXZpY2UgaW5mbyBvYnRhaW5lZCBmcm9tCi0gKiBAcGFyYW0gc291cmNlX25hbWUgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UsIGludGVybmFsIG9yIGV4dGVybmFsCi0gKiBAcGFyYW0gbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIG1hbnVmYWN0dXJlciBvZiB0aGlzIGRldmljZQotICogQHBhcmFtIG1vZGVsIG1vZGVsIG9mIHRoaXMgZGV2aWNlCi0gKiBAcGFyYW0gaGFyZHdhcmVfdmVyc2lvbiBoYXJkd2FyZSB2ZXJzaW9uIG9mIHRoaXMgZGV2aWNlCi0gKiBAcGFyYW0gc29mdHdhcmVfdmVyc2lvbiBzb2Z0d2FyZSB2ZXJzaW9uIG9mIHRoaXMgZGV2aWNlCi0gKi8KLXZvaWQgTG9nTWV0cmljTWFudWZhY3R1cmVySW5mbygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24pOwotCi19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL3NoaW0uY2MgYi9tYWluL3NoaW0vc2hpbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4MzY5YjI5Li4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9zaGltLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9zaGltIgotCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc3RhY2suaCIKLQotI2luY2x1ZGUgImdkL2NvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvbG9nLmgiCi0KLWZ1dHVyZV90KiBJZGxlTW9kdWxlU3RhcnRVcCgpIHsKLSAgYmx1ZXRvb3RoOjpzaGltOjpTdGFjazo6R2V0SW5zdGFuY2UoKS0+U3RhcnRJZGxlTW9kZSgpOwotICByZXR1cm4ga1JldHVybkltbWVkaWF0ZTsKLX0KLQotZnV0dXJlX3QqIFNoaW1Nb2R1bGVTdGFydFVwKCkgewotICBibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5TdGFydEV2ZXJ5dGhpbmcoKTsKLSAgcmV0dXJuIGtSZXR1cm5JbW1lZGlhdGU7Ci19Ci0KLWZ1dHVyZV90KiBHZW5lcmFsU2h1dERvd24oKSB7Ci0gIGJsdWV0b290aDo6c2hpbTo6U3RhY2s6OkdldEluc3RhbmNlKCktPlN0b3AoKTsKLSAgcmV0dXJuIGtSZXR1cm5JbW1lZGlhdGU7Ci19Ci0KLUVYUE9SVF9TWU1CT0wgZXh0ZXJuIGNvbnN0IG1vZHVsZV90IGdkX2lkbGVfbW9kdWxlID0gewotICAgIC5uYW1lID0gR0RfSURMRV9NT0RVTEUsCi0gICAgLmluaXQgPSBrVW51c2VkTW9kdWxlQXBpLAotICAgIC5zdGFydF91cCA9IElkbGVNb2R1bGVTdGFydFVwLAotICAgIC5zaHV0X2Rvd24gPSBHZW5lcmFsU2h1dERvd24sCi0gICAgLmNsZWFuX3VwID0ga1VudXNlZE1vZHVsZUFwaSwKLSAgICAuZGVwZW5kZW5jaWVzID0ge2tVbnVzZWRNb2R1bGVEZXBlbmRlbmNpZXN9fTsKLQotRVhQT1JUX1NZTUJPTCBleHRlcm4gY29uc3QgbW9kdWxlX3QgZ2Rfc2hpbV9tb2R1bGUgPSB7Ci0gICAgLm5hbWUgPSBHRF9TSElNX01PRFVMRSwKLSAgICAuaW5pdCA9IGtVbnVzZWRNb2R1bGVBcGksCi0gICAgLnN0YXJ0X3VwID0gU2hpbU1vZHVsZVN0YXJ0VXAsCi0gICAgLnNodXRfZG93biA9IEdlbmVyYWxTaHV0RG93biwKLSAgICAuY2xlYW5fdXAgPSBrVW51c2VkTW9kdWxlQXBpLAotICAgIC5kZXBlbmRlbmNpZXMgPSB7a1VudXNlZE1vZHVsZURlcGVuZGVuY2llc319OwotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWR2ZXJ0aXNpbmdfZW5hYmxlZCgpIHsKLSAgcmV0dXJuIGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9hZHZlcnRpc2luZ19pc19lbmFibGVkKCk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zY2FubmluZ19lbmFibGVkKCkgewotICByZXR1cm4gYmx1ZXRvb3RoOjpjb21tb246OmluaXRfZmxhZ3M6OmdkX3NjYW5uaW5nX2lzX2VuYWJsZWQoKTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2Rfc2VjdXJpdHlfaXNfZW5hYmxlZCgpOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfYWNsX2lzX2VuYWJsZWQoKTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX2xpbmtfcG9saWN5X2VuYWJsZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfbGlua19wb2xpY3lfaXNfZW5hYmxlZCgpOwotfQotCi1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpIHsKLSAgcmV0dXJuIGJsdWV0b290aDo6Y29tbW9uOjppbml0X2ZsYWdzOjpnZF9sMmNhcF9pc19lbmFibGVkKCk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfY29yZV9pc19lbmFibGVkKCk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpIHsgcmV0dXJuIHRydWU7IH0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5Jc1J1bm5pbmcoKTsKLX0KLQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX2R1bXBzeXNfbW9kdWxlX3N0YXJ0ZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OnNoaW06OlN0YWNrOjpHZXRJbnN0YW5jZSgpLT5Jc0R1bXBzeXNNb2R1bGVTdGFydGVkKCk7Ci19Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9idGFhX2VuYWJsZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6YnRhYV9oY2lfaXNfZW5hYmxlZCgpOwotfQpkaWZmIC0tZ2l0IGEvbWFpbi9zaGltL3NoaW0uaCBiL21haW4vc2hpbS9zaGltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDhkODUuLjAwMDAwMDAKLS0tIGEvbWFpbi9zaGltL3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0vKioKLSAqIEdhYmVsZG9yc2NoZSByZWxhdGVkIGxlZ2FjeS1vbmx5LXN0YWNrLXNpZGUgZXhwYW5zaW9uIGFuZCBzdXBwb3J0IGNvZGUuCi0gKi8KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgR0RfSURMRV9NT0RVTEVbXSA9ICJnZF9pZGxlX21vZHVsZSI7Ci1zdGF0aWMgY29uc3QgY2hhciBHRF9TSElNX01PRFVMRVtdID0gImdkX3NoaW1fbW9kdWxlIjsKLQotY29uc3RleHByIGZ1dHVyZV90KiBrUmV0dXJuSW1tZWRpYXRlID0gbnVsbHB0cjsKLWNvbnN0ZXhwciBtb2R1bGVfbGlmZWN5Y2xlX2ZuIGtVbnVzZWRNb2R1bGVBcGkgPSBudWxscHRyOwotY29uc3RleHByIGNoYXIqIGtVbnVzZWRNb2R1bGVEZXBlbmRlbmNpZXMgPSBudWxscHRyOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotLyoqCi0gKiBDaGVja3MgaWYgdGhlIGJsdWV0b290aCBzdGFjayBpcyBydW5uaW5nIGluIGxlZ2FjeSBvciBnZCBtb2RlLgotICoKLSAqIFRoaXMgY2hlY2sgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBsZWdhY3kgc3RhY2sgdG8gZGV0ZXJtaW5lIHdoaWNoCi0gKiBtZXRob2RzLCBjbGFzc2VzIG9yIGZ1bmN0aW9ucyB0byBpbnZva2UuICBUaGUgZGVmYXVsdCAoZmFsc2UpIG1vZGUKLSAqIGlzIHRoZSBsZWdhY3kgbW9kZSB3aGljaCBydW5zIHRoZSBvcmlnaW5hbCBsZWdhY3kgYmx1ZXRvb3RoIHN0YWNrLgotICogV2hlbiBlbmFibGVkICh0cnVlKSB0aGUgY29yZSBwb3J0aW9uIG9mIHRoZSBnZCBzdGFjayBpcyBpbnZva2VkCi0gKiBhdCBrZXkgcG9pbnRzIHRvIGV4ZWN1dGUgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5IHVzaW5nIHRoZQotICogZ2QgY29yZSBjb21wb25lbnRzLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB1c2luZyBnZCBzaGltIGNvcmUsIGZhbHNlIGlmIHVzaW5nIGxlZ2FjeS4KLSAqLwotYm9vbCBpc19nZF9hZHZlcnRpc2luZ19lbmFibGVkKCk7Ci1ib29sIGlzX2dkX3NjYW5uaW5nX2VuYWJsZWQoKTsKLWJvb2wgaXNfZ2Rfc2VjdXJpdHlfZW5hYmxlZCgpOwotYm9vbCBpc19nZF9hY2xfZW5hYmxlZCgpOwotYm9vbCBpc19nZF9saW5rX3BvbGljeV9lbmFibGVkKCk7Ci1ib29sIGlzX2dkX2wyY2FwX2VuYWJsZWQoKTsKLWJvb2wgaXNfZ2Rfc2hpbV9lbmFibGVkKCk7Ci1ib29sIGlzX2dkX2J0YWFfZW5hYmxlZCgpOwotYm9vbCBpc19hbnlfZ2RfZW5hYmxlZCgpOwotCi0vKioKLSAqIENoZWNrcyBpZiB0aGUgYmx1ZXRvb3RoIGdkIHN0YWNrIGhhcyBiZWVuIHN0YXJ0ZWQgdXAuCi0gKgotICogQHJldHVybiB0cnVlIGlmIGJsdWV0b290aCBnZCBzdGFjayBpcyBzdGFydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLWJvb2wgaXNfZ2Rfc3RhY2tfc3RhcnRlZF91cCgpOwotCi0vKioKLSAqIENoZWNrcyBpZiB0aGUgZHVtcHN5cyBtb2R1bGUgaGFzIGJlZW4gc3RhcnRlZC4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgc3BlY2lmaWVkIG1vZHVsZSBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1ib29sIGlzX2dkX2R1bXBzeXNfbW9kdWxlX3N0YXJ0ZWQoKTsKLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc2hpbS9zdGFjay5jYyBiL21haW4vc2hpbS9zdGFjay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmYjgyNi4uMDAwMDAwMAotLS0gYS9tYWluL3NoaW0vc3RhY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9nZF9zaGltIgotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImdkL2F0dC9hdHRfbW9kdWxlLmgiCi0jaW5jbHVkZSAiZ2QvYnRhYS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIgotI2luY2x1ZGUgImdkL2NvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAiZ2QvY29tbW9uL3N0cmluZ3MuaCIKLSNpbmNsdWRlICJnZC9oYWwvaGNpX2hhbC5oIgotI2luY2x1ZGUgImdkL2hjaS9hY2xfbWFuYWdlci5oIgotI2luY2x1ZGUgImdkL2hjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2hjaV9sYXllci5oIgotI2luY2x1ZGUgImdkL2hjaS9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2xlX3NjYW5uaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9oY2kvdmVuZG9yX3NwZWNpZmljX2V2ZW50X21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9sMmNhcC9jbGFzc2ljL2wyY2FwX2NsYXNzaWNfbW9kdWxlLmgiCi0jaW5jbHVkZSAiZ2QvbDJjYXAvbGUvbDJjYXBfbGVfbW9kdWxlLmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvY29ubmVjdGFiaWxpdHkuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9kaXNjb3ZlcmFiaWxpdHkuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9pbnF1aXJ5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvbmFtZS5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL25hbWVfZGIuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9wYWdlLmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3Ivc2Nhbi5oIgotI2luY2x1ZGUgImdkL29zL2xvZy5oIgotI2luY2x1ZGUgImdkL3NlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5oIgotI2luY2x1ZGUgImdkL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgImdkL3N0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLQotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfbGVnYWN5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGVscGVycy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbGVfc2Nhbm5pbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3N0YWNrLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotCi11c2luZyA6OmJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M7Ci11c2luZyA6OmJsdWV0b290aDo6Y29tbW9uOjpTdHJpbmdGb3JtYXQ7Ci0KLW5hbWVzcGFjZSB7Ci0vLyBQSUQgZmlsZSBmb3JtYXQKLWNvbnN0ZXhwciBjaGFyIHBpZF9maWxlX2Zvcm1hdFtdID0gIi92YXIvcnVuL2JsdWV0b290aC9ibHVldG9vdGglZC5waWQiOwotCi12b2lkIENyZWF0ZVBpZEZpbGUoKSB7Ci0gIHN0ZDo6c3RyaW5nIHBpZF9maWxlID0KLSAgICAgIFN0cmluZ0Zvcm1hdChwaWRfZmlsZV9mb3JtYXQsIEluaXRGbGFnczo6R2V0QWRhcHRlckluZGV4KCkpOwotICBpbnQgcGlkX2ZkXyA9IG9wZW4ocGlkX2ZpbGUuY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFULCAwNjQ0KTsKLSAgaWYgKCFwaWRfZmRfKSByZXR1cm47Ci0KLSAgcGlkX3QgbXlfcGlkID0gZ2V0cGlkKCk7Ci0gIGRwcmludGYocGlkX2ZkXywgIiVkXG4iLCBteV9waWQpOwotICBjbG9zZShwaWRfZmRfKTsKLQotICBMT0dfSU5GTygiJXMgLSBDcmVhdGVkIHBpZCBmaWxlICVzIiwgX19mdW5jX18sIHBpZF9maWxlLmNfc3RyKCkpOwotfQotCi12b2lkIFJlbW92ZVBpZEZpbGUoKSB7Ci0gIHN0ZDo6c3RyaW5nIHBpZF9maWxlID0KLSAgICAgIFN0cmluZ0Zvcm1hdChwaWRfZmlsZV9mb3JtYXQsIEluaXRGbGFnczo6R2V0QWRhcHRlckluZGV4KCkpOwotICB1bmxpbmsocGlkX2ZpbGUuY19zdHIoKSk7Ci0gIExPR19JTkZPKCIlcyAtIERlbGV0ZWQgcGlkIGZpbGUgJXMiLCBfX2Z1bmNfXywgcGlkX2ZpbGUuY19zdHIoKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotU3RhY2sqIFN0YWNrOjpHZXRJbnN0YW5jZSgpIHsKLSAgc3RhdGljIFN0YWNrIGluc3RhbmNlOwotICByZXR1cm4gJmluc3RhbmNlOwotfQotCi12b2lkIFN0YWNrOjpTdGFydElkbGVNb2RlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgQVNTRVJUX0xPRyghaXNfcnVubmluZ18sICIlcyBHZCBzdGFjayBhbHJlYWR5IHJ1bm5pbmciLCBfX2Z1bmNfXyk7Ci0gIExPR19JTkZPKCIlcyBTdGFydGluZyBHZCBzdGFjayIsIF9fZnVuY19fKTsKLSAgTW9kdWxlTGlzdCBtb2R1bGVzOwotICBtb2R1bGVzLmFkZDxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpOwotICBTdGFydCgmbW9kdWxlcyk7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgbGVhZiBtb2R1bGVzIGFyZSBzdGFydGVkCi0gIEFTU0VSVChzdGFja19tYW5hZ2VyXy5HZXRJbnN0YW5jZTxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpICE9IG51bGxwdHIpOwotICBpc19ydW5uaW5nXyA9IHRydWU7Ci19Ci0KLXZvaWQgU3RhY2s6OlN0YXJ0RXZlcnl0aGluZygpIHsKLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICBpZiAocnVzdF9zdGFja18gPT0gbnVsbHB0cikgewotICAgICAgcnVzdF9zdGFja18gPSBuZXcgOjpydXN0OjpCb3g8cnVzdDo6U3RhY2s+KHJ1c3Q6OnN0YWNrX2NyZWF0ZSgpKTsKLSAgICB9Ci0gICAgcnVzdDo6c3RhY2tfc3RhcnQoKipydXN0X3N0YWNrXyk7Ci0KLSAgICBydXN0X2hjaV8gPSBuZXcgOjpydXN0OjpCb3g8cnVzdDo6SGNpPihydXN0OjpnZXRfaGNpKCoqcnVzdF9zdGFja18pKTsKLSAgICBydXN0X2NvbnRyb2xsZXJfID0KLSAgICAgICAgbmV3IDo6cnVzdDo6Qm94PHJ1c3Q6OkNvbnRyb2xsZXI+KHJ1c3Q6OmdldF9jb250cm9sbGVyKCoqcnVzdF9zdGFja18pKTsKLSAgICBibHVldG9vdGg6OnNoaW06OmhjaV9vbl9yZXNldF9jb21wbGV0ZSgpOwotCi0gICAgLy8gQ3JlYXRlIHBpZCBzaW5jZSB3ZSdyZSB1cCBhbmQgcnVubmluZwotICAgIENyZWF0ZVBpZEZpbGUoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgQVNTRVJUX0xPRyghaXNfcnVubmluZ18sICIlcyBHZCBzdGFjayBhbHJlYWR5IHJ1bm5pbmciLCBfX2Z1bmNfXyk7Ci0gIExPR19JTkZPKCIlcyBTdGFydGluZyBHZCBzdGFjayIsIF9fZnVuY19fKTsKLSAgTW9kdWxlTGlzdCBtb2R1bGVzOwotCi0gIG1vZHVsZXMuYWRkPGhhbDo6SGNpSGFsPigpOwotICBtb2R1bGVzLmFkZDxoY2k6OkhjaUxheWVyPigpOwotICBtb2R1bGVzLmFkZDxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpOwotICBtb2R1bGVzLmFkZDxzaGltOjpEdW1wc3lzPigpOwotICBtb2R1bGVzLmFkZDxoY2k6OlZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyPigpOwotCi0gIG1vZHVsZXMuYWRkPGhjaTo6Q29udHJvbGxlcj4oKTsKLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfYWNsX2lzX2VuYWJsZWQoKSkgewotICAgIG1vZHVsZXMuYWRkPGhjaTo6QWNsTWFuYWdlcj4oKTsKLSAgfQotICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpnZF9sMmNhcF9pc19lbmFibGVkKCkpIHsKLSAgICBtb2R1bGVzLmFkZDxsMmNhcDo6Y2xhc3NpYzo6TDJjYXBDbGFzc2ljTW9kdWxlPigpOwotICAgIG1vZHVsZXMuYWRkPGwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZT4oKTsKLSAgICBtb2R1bGVzLmFkZDxoY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyPigpOwotICB9Ci0gIGlmIChjb21tb246OmluaXRfZmxhZ3M6OmdkX3NlY3VyaXR5X2lzX2VuYWJsZWQoKSkgewotICAgIG1vZHVsZXMuYWRkPHNlY3VyaXR5OjpTZWN1cml0eU1vZHVsZT4oKTsKLSAgfQotICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpnZF9hZHZlcnRpc2luZ19pc19lbmFibGVkKCkpIHsKLSAgICBtb2R1bGVzLmFkZDxoY2k6OkxlQWR2ZXJ0aXNpbmdNYW5hZ2VyPigpOwotICB9Ci0gIGlmIChjb21tb246OmluaXRfZmxhZ3M6OmdkX3NjYW5uaW5nX2lzX2VuYWJsZWQoKSkgewotICAgIG1vZHVsZXMuYWRkPGhjaTo6TGVTY2FubmluZ01hbmFnZXI+KCk7Ci0gIH0KLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6YnRhYV9oY2lfaXNfZW5hYmxlZCgpKSB7Ci0gICAgbW9kdWxlcy5hZGQ8YWN0aXZpdHlfYXR0cmlidXRpb246OkFjdGl2aXR5QXR0cmlidXRpb24+KCk7Ci0gIH0KLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfY29yZV9pc19lbmFibGVkKCkpIHsKLSAgICBtb2R1bGVzLmFkZDxhdHQ6OkF0dE1vZHVsZT4oKTsKLSAgICBtb2R1bGVzLmFkZDxuZWlnaGJvcjo6Q29ubmVjdGFiaWxpdHlNb2R1bGU+KCk7Ci0gICAgbW9kdWxlcy5hZGQ8bmVpZ2hib3I6OkRpc2NvdmVyYWJpbGl0eU1vZHVsZT4oKTsKLSAgICBtb2R1bGVzLmFkZDxuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZT4oKTsKLSAgICBtb2R1bGVzLmFkZDxuZWlnaGJvcjo6TmFtZU1vZHVsZT4oKTsKLSAgICBtb2R1bGVzLmFkZDxuZWlnaGJvcjo6TmFtZURiTW9kdWxlPigpOwotICAgIG1vZHVsZXMuYWRkPG5laWdoYm9yOjpQYWdlTW9kdWxlPigpOwotICAgIG1vZHVsZXMuYWRkPG5laWdoYm9yOjpTY2FuTW9kdWxlPigpOwotICAgIG1vZHVsZXMuYWRkPHN0b3JhZ2U6OlN0b3JhZ2VNb2R1bGU+KCk7Ci0gIH0KLSAgU3RhcnQoJm1vZHVsZXMpOwotICBpc19ydW5uaW5nXyA9IHRydWU7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgbGVhZiBtb2R1bGVzIGFyZSBzdGFydGVkCi0gIEFTU0VSVChzdGFja19tYW5hZ2VyXy5HZXRJbnN0YW5jZTxzdG9yYWdlOjpTdG9yYWdlTW9kdWxlPigpICE9IG51bGxwdHIpOwotICBBU1NFUlQoc3RhY2tfbWFuYWdlcl8uR2V0SW5zdGFuY2U8c2hpbTo6RHVtcHN5cz4oKSAhPSBudWxscHRyKTsKLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfY29yZV9pc19lbmFibGVkKCkpIHsKLSAgICBidG1fID0gbmV3IEJ0bShzdGFja19oYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICBzdGFja19tYW5hZ2VyXy5HZXRJbnN0YW5jZTxuZWlnaGJvcjo6SW5xdWlyeU1vZHVsZT4oKSk7Ci0gIH0KLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfYWNsX2lzX2VuYWJsZWQoKSkgewotICAgIGlmICghY29tbW9uOjppbml0X2ZsYWdzOjpnZF9jb3JlX2lzX2VuYWJsZWQoKSkgewotICAgICAgYWNsXyA9IG5ldyBsZWdhY3k6OkFjbCgKLSAgICAgICAgICBzdGFja19oYW5kbGVyXywgbGVnYWN5OjpHZXRBY2xJbnRlcmZhY2UoKSwKLSAgICAgICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9hY2NlcHRsaXN0X3NpemUoKSwKLSAgICAgICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZSgpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFjb21tb246OmluaXRfZmxhZ3M6OmdkX2NvcmVfaXNfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpoY2lfb25fcmVzZXRfY29tcGxldGUoKTsKLSAgfQotCi0gIGlmIChjb21tb246OmluaXRfZmxhZ3M6OmdkX2FkdmVydGlzaW5nX2lzX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6aW5pdF9hZHZlcnRpc2luZ19tYW5hZ2VyKCk7Ci0gIH0KLSAgaWYgKGNvbW1vbjo6aW5pdF9mbGFnczo6Z2Rfc2Nhbm5pbmdfaXNfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjppbml0X3NjYW5uaW5nX21hbmFnZXIoKTsKLSAgfQotICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpnZF9sMmNhcF9pc19lbmFibGVkKCkgJiYKLSAgICAgICFjb21tb246OmluaXRfZmxhZ3M6OmdkX2NvcmVfaXNfZW5hYmxlZCgpKSB7Ci0gICAgTDJDQV9Vc2VMZWdhY3lTZWN1cml0eU1vZHVsZSgpOwotICB9Ci0gIGlmIChjb21tb246OmluaXRfZmxhZ3M6OmJ0YWFfaGNpX2lzX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6aW5pdF9hY3Rpdml0eV9hdHRyaWJ1dGlvbigpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHBpZCBzaW5jZSB3ZSdyZSB1cCBhbmQgcnVubmluZwotICBDcmVhdGVQaWRGaWxlKCk7Ci19Ci0KLXZvaWQgU3RhY2s6OlN0YXJ0KE1vZHVsZUxpc3QqIG1vZHVsZXMpIHsKLSAgQVNTRVJUX0xPRyghaXNfcnVubmluZ18sICIlcyBHZCBzdGFjayBhbHJlYWR5IHJ1bm5pbmciLCBfX2Z1bmNfXyk7Ci0gIExPR19JTkZPKCIlcyBTdGFydGluZyBHZCBzdGFjayIsIF9fZnVuY19fKTsKLQotICBzdGFja190aHJlYWRfID0KLSAgICAgIG5ldyBvczo6VGhyZWFkKCJnZF9zdGFja190aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgc3RhY2tfbWFuYWdlcl8uU3RhcnRVcChtb2R1bGVzLCBzdGFja190aHJlYWRfKTsKLQotICBzdGFja19oYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcihzdGFja190aHJlYWRfKTsKLQotICBMT0dfSU5GTygiJXMgU3VjY2Vzc2Z1bGx5IHRvZ2dsZWQgR2Qgc3RhY2siLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgU3RhY2s6OlN0b3AoKSB7Ci0gIC8vIEZpcnN0IHJlbW92ZSBwaWQgZmlsZSBzbyBjbGllbnRzIG5vIHN0YWNrIGlzIGdvaW5nIGRvd24KLSAgUmVtb3ZlUGlkRmlsZSgpOwotCi0gIGlmIChjb21tb246OmluaXRfZmxhZ3M6OmdkX3J1c3RfaXNfZW5hYmxlZCgpKSB7Ci0gICAgaWYgKHJ1c3Rfc3RhY2tfICE9IG51bGxwdHIpIHsKLSAgICAgIHJ1c3Q6OnN0YWNrX3N0b3AoKipydXN0X3N0YWNrXyk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICBpZiAoIWNvbW1vbjo6aW5pdF9mbGFnczo6Z2RfY29yZV9pc19lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OmhjaV9vbl9zaHV0dGluZ19kb3duKCk7Ci0gIH0KLQotICAvLyBNYWtlIHN1cmUgZ2QgYWNsIGZsYWcgaXMgZW5hYmxlZCBhbmQgd2Ugc3RhcnRlZCBpdCB1cAotICBpZiAoY29tbW9uOjppbml0X2ZsYWdzOjpnZF9hY2xfaXNfZW5hYmxlZCgpICYmIGFjbF8gIT0gbnVsbHB0cikgewotICAgIGFjbF8tPkZpbmFsU2h1dGRvd24oKTsKLSAgICBkZWxldGUgYWNsXzsKLSAgICBhY2xfID0gbnVsbHB0cjsKLSAgfQotCi0gIEFTU0VSVF9MT0coaXNfcnVubmluZ18sICIlcyBHZCBzdGFjayBub3QgcnVubmluZyIsIF9fZnVuY19fKTsKLSAgaXNfcnVubmluZ18gPSBmYWxzZTsKLQotICBkZWxldGUgYnRtXzsKLSAgYnRtXyA9IG51bGxwdHI7Ci0KLSAgc3RhY2tfaGFuZGxlcl8tPkNsZWFyKCk7Ci0KLSAgc3RhY2tfbWFuYWdlcl8uU2h1dERvd24oKTsKLQotICBkZWxldGUgc3RhY2tfaGFuZGxlcl87Ci0gIHN0YWNrX2hhbmRsZXJfID0gbnVsbHB0cjsKLQotICBzdGFja190aHJlYWRfLT5TdG9wKCk7Ci0gIGRlbGV0ZSBzdGFja190aHJlYWRfOwotICBzdGFja190aHJlYWRfID0gbnVsbHB0cjsKLQotICBMT0dfSU5GTygiJXMgU3VjY2Vzc2Z1bGx5IHNodXQgZG93biBHZCBzdGFjayIsIF9fZnVuY19fKTsKLX0KLQotYm9vbCBTdGFjazo6SXNSdW5uaW5nKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIGlzX3J1bm5pbmdfOwotfQotCi1TdGFja01hbmFnZXIqIFN0YWNrOjpHZXRTdGFja01hbmFnZXIoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICBBU1NFUlQoaXNfcnVubmluZ18pOwotICByZXR1cm4gJnN0YWNrX21hbmFnZXJfOwotfQotCi1jb25zdCBTdGFja01hbmFnZXIqIFN0YWNrOjpHZXRTdGFja01hbmFnZXIoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtdXRleF8pOwotICBBU1NFUlQoaXNfcnVubmluZ18pOwotICByZXR1cm4gJnN0YWNrX21hbmFnZXJfOwotfQotCi1sZWdhY3k6OkFjbCogU3RhY2s6OkdldEFjbCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIEFTU0VSVChpc19ydW5uaW5nXyk7Ci0gIEFTU0VSVF9MT0coYWNsXyAhPSBudWxscHRyLCAiQWNsIHNoaW0gbGF5ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQiKTsKLSAgcmV0dXJuIGFjbF87Ci19Ci0KLUxpbmtQb2xpY3lJbnRlcmZhY2UqIFN0YWNrOjpMaW5rUG9saWN5KCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgQVNTRVJUKGlzX3J1bm5pbmdfKTsKLSAgQVNTRVJUX0xPRyhhY2xfICE9IG51bGxwdHIsICJBY2wgc2hpbSBsYXllciBoYXMgbm90IGJlZW4gY3JlYXRlZCIpOwotICByZXR1cm4gYWNsXzsKLX0KLQotQnRtKiBTdGFjazo6R2V0QnRtKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgQVNTRVJUKGlzX3J1bm5pbmdfKTsKLSAgcmV0dXJuIGJ0bV87Ci19Ci0KLW9zOjpIYW5kbGVyKiBTdGFjazo6R2V0SGFuZGxlcigpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIEFTU0VSVChpc19ydW5uaW5nXyk7Ci0gIHJldHVybiBzdGFja19oYW5kbGVyXzsKLX0KLQotYm9vbCBTdGFjazo6SXNEdW1wc3lzTW9kdWxlU3RhcnRlZCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHJldHVybiBHZXRTdGFja01hbmFnZXIoKS0+SXNTdGFydGVkPER1bXBzeXM+KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaGltCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9tYWluL3NoaW0vc3RhY2suaCBiL21haW4vc2hpbS9zdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA1ODY2Li4wMDAwMDAwCi0tLSBhL21haW4vc2hpbS9zdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2wuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYnRtLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2xpbmtfcG9saWN5X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiZ2QvbW9kdWxlLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvaGFuZGxlci5oIgotI2luY2x1ZGUgImdkL29zL3RocmVhZC5oIgotI2luY2x1ZGUgImdkL29zL3V0aWxzLmgiCi0jaW5jbHVkZSAiZ2Qvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgInNyYy9icmlkZ2UucnMuaCIKLQotLy8gVGhlIHNoaW0gbGF5ZXIgaW1wbGVtZW50YXRpb24gb24gdGhlIEdkIHN0YWNrIHNpZGUuCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotLy8gR0Qgc2hpbSBzdGFjaywgaGF2aW5nIG1vZGVzIGNvcnJlc3BvbmRpbmcgdG8gbGVnYWN5IHN0YWNrCi1jbGFzcyBTdGFjayB7Ci0gcHVibGljOgotICBzdGF0aWMgU3RhY2sqIEdldEluc3RhbmNlKCk7Ci0KLSAgU3RhY2soKSA9IGRlZmF1bHQ7Ci0gIH5TdGFjaygpID0gZGVmYXVsdDsKLQotICAvLyBJZGxlIG1vZGUsIGNvbmZpZyBpcyBsb2FkZWQsIGJ1dCBjb250cm9sbGVyIGlzIG5vdCBlbmFibGVkCi0gIHZvaWQgU3RhcnRJZGxlTW9kZSgpOwotICAvLyBSdW5uaW5nIG1vZGUsIGV2ZXJ5dGhpbmcgaXMgdXAKLSAgdm9pZCBTdGFydEV2ZXJ5dGhpbmcoKTsKLQotICB2b2lkIFN0b3AoKTsKLSAgYm9vbCBJc1J1bm5pbmcoKTsKLSAgYm9vbCBJc0R1bXBzeXNNb2R1bGVTdGFydGVkKCkgY29uc3Q7Ci0KLSAgU3RhY2tNYW5hZ2VyKiBHZXRTdGFja01hbmFnZXIoKTsKLSAgY29uc3QgU3RhY2tNYW5hZ2VyKiBHZXRTdGFja01hbmFnZXIoKSBjb25zdDsKLQotICBsZWdhY3k6OkFjbCogR2V0QWNsKCk7Ci0gIExpbmtQb2xpY3lJbnRlcmZhY2UqIExpbmtQb2xpY3koKTsKLQotICBCdG0qIEdldEJ0bSgpOwotICBvczo6SGFuZGxlciogR2V0SGFuZGxlcigpOwotCi0gIDo6cnVzdDo6Qm94PHJ1c3Q6OkhjaT4qIEdldFJ1c3RIY2koKSB7IHJldHVybiBydXN0X2hjaV87IH0KLSAgOjpydXN0OjpCb3g8cnVzdDo6Q29udHJvbGxlcj4qIEdldFJ1c3RDb250cm9sbGVyKCkgewotICAgIHJldHVybiBydXN0X2NvbnRyb2xsZXJfOwotICB9Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0YWNrKTsKLQotIHByaXZhdGU6Ci0gIG11dGFibGUgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbXV0ZXhfOwotICBTdGFja01hbmFnZXIgc3RhY2tfbWFuYWdlcl87Ci0gIGJvb2wgaXNfcnVubmluZ18gPSBmYWxzZTsKLSAgb3M6OlRocmVhZCogc3RhY2tfdGhyZWFkXyA9IG51bGxwdHI7Ci0gIG9zOjpIYW5kbGVyKiBzdGFja19oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIGxlZ2FjeTo6QWNsKiBhY2xfID0gbnVsbHB0cjsKLSAgQnRtKiBidG1fID0gbnVsbHB0cjsKLSAgOjpydXN0OjpCb3g8cnVzdDo6U3RhY2s+KiBydXN0X3N0YWNrXyA9IG51bGxwdHI7Ci0gIDo6cnVzdDo6Qm94PHJ1c3Q6OkhjaT4qIHJ1c3RfaGNpXyA9IG51bGxwdHI7Ci0gIDo6cnVzdDo6Qm94PHJ1c3Q6OkNvbnRyb2xsZXI+KiBydXN0X2NvbnRyb2xsZXJfID0gbnVsbHB0cjsKLQotICB2b2lkIFN0YXJ0KE1vZHVsZUxpc3QqIG1vZHVsZXMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL21haW4vc3RhY2tfY29uZmlnLmNjIGIvbWFpbi9zdGFja19jb25maWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDBjZGYuLjAwMDAwMDAKLS0tIGEvbWFpbi9zdGFja19jb25maWcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3N0YWNrX2NvbmZpZyIKLQotI2luY2x1ZGUgInN0YWNrX2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotbmFtZXNwYWNlIHsKLWNvbnN0IGNoYXIqIFRSQUNFX0NPTkZJR19FTkFCTEVEX0tFWSA9ICJUcmFjZUNvbmYiOwotY29uc3QgY2hhciogUFRTX0FWUkNQX1RFU1QgPSAiUFRTX0F2cmNwVGVzdCI7Ci1jb25zdCBjaGFyKiBQVFNfU0VDVVJFX09OTFlfTU9ERSA9ICJQVFNfU2VjdXJlUGFpck9ubHkiOwotY29uc3QgY2hhciogUFRTX0xFX0NPTk5fVVBEQVRFRF9ESVNBQkxFRCA9ICJQVFNfRGlzYWJsZUNvbm5VcGRhdGVzIjsKLWNvbnN0IGNoYXIqIFBUU19ESVNBQkxFX1NEUF9MRV9QQUlSID0gIlBUU19EaXNhYmxlU0RQT25MRVBhaXIiOwotY29uc3QgY2hhciogUFRTX1NNUF9QQUlSSU5HX09QVElPTlNfS0VZID0gIlBUU19TbXBPcHRpb25zIjsKLWNvbnN0IGNoYXIqIFBUU19TTVBfRkFJTFVSRV9DQVNFX0tFWSA9ICJQVFNfU21wRmFpbHVyZUNhc2UiOwotCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWc7Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gTW9kdWxlIGxpZmVjeWNsZSBmdW5jdGlvbnMKLQotc3RhdGljIGZ1dHVyZV90KiBpbml0KCkgewotLy8gVE9ETyhhcm1hbnNpdG8pOiBGaW5kIGEgYmV0dGVyIHdheSB0aGFuIHNlYXJjaGluZyBieSBhIGhhcmRjb2RlZCBwYXRoLgotI2lmIGRlZmluZWQoVEFSR0VUX0ZMT1NTKQotICBjb25zdCBjaGFyKiBwYXRoID0gIi92YXIvbGliL2JsdWV0b290aC9idF9zdGFjay5jb25mIjsKLSNlbGlmIGRlZmluZWQoT1NfR0VORVJJQykKLSAgY29uc3QgY2hhciogcGF0aCA9ICJidF9zdGFjay5jb25mIjsKLSNlbHNlICAvLyAhZGVmaW5lZChPU19HRU5FUklDKQotICBjb25zdCBjaGFyKiBwYXRoID0gIi9ldGMvYmx1ZXRvb3RoL2J0X3N0YWNrLmNvbmYiOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX0dFTkVSSUMpCi0gIENIRUNLKHBhdGggIT0gTlVMTCk7Ci0KLSAgTE9HX0lORk8oIiVzIGF0dGVtcHQgdG8gbG9hZCBzdGFjayBjb25mIGZyb20gJXMiLCBfX2Z1bmNfXywgcGF0aCk7Ci0KLSAgY29uZmlnID0gY29uZmlnX25ldyhwYXRoKTsKLSAgaWYgKCFjb25maWcpIHsKLSAgICBMT0dfSU5GTygiJXMgZmlsZSA+JXM8IG5vdCBmb3VuZCIsIF9fZnVuY19fLCBwYXRoKTsKLSAgICBjb25maWcgPSBjb25maWdfbmV3X2VtcHR5KCk7Ci0gIH0KLQotICByZXR1cm4gZnV0dXJlX25ld19pbW1lZGlhdGUoRlVUVVJFX1NVQ0NFU1MpOwotfQotCi1zdGF0aWMgZnV0dXJlX3QqIGNsZWFuX3VwKCkgewotICBjb25maWcucmVzZXQoKTsKLSAgcmV0dXJuIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKEZVVFVSRV9TVUNDRVNTKTsKLX0KLQotRVhQT1JUX1NZTUJPTCBleHRlcm4gY29uc3QgbW9kdWxlX3Qgc3RhY2tfY29uZmlnX21vZHVsZSA9IHsKLSAgICAubmFtZSA9IFNUQUNLX0NPTkZJR19NT0RVTEUsCi0gICAgLmluaXQgPSBpbml0LAotICAgIC5zdGFydF91cCA9IE5VTEwsCi0gICAgLnNodXRfZG93biA9IE5VTEwsCi0gICAgLmNsZWFuX3VwID0gY2xlYW5fdXAsCi0gICAgLmRlcGVuZGVuY2llcyA9IHtOVUxMfX07Ci0KLS8vIEludGVyZmFjZSBmdW5jdGlvbnMKLXN0YXRpYyBib29sIGdldF90cmFjZV9jb25maWdfZW5hYmxlZCh2b2lkKSB7Ci0gIHJldHVybiBjb25maWdfZ2V0X2Jvb2woKmNvbmZpZywgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9DT05GSUdfRU5BQkxFRF9LRVksIGZhbHNlKTsKLX0KLQotc3RhdGljIGJvb2wgZ2V0X3B0c19hdnJjcF90ZXN0KHZvaWQpIHsKLSAgcmV0dXJuIGNvbmZpZ19nZXRfYm9vbCgqY29uZmlnLCBDT05GSUdfREVGQVVMVF9TRUNUSU9OLCBQVFNfQVZSQ1BfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBib29sIGdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSh2b2lkKSB7Ci0gIHJldHVybiBjb25maWdfZ2V0X2Jvb2woKmNvbmZpZywgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwgUFRTX1NFQ1VSRV9PTkxZX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBnZXRfcHRzX2Nvbm5fdXBkYXRlc19kaXNhYmxlZCh2b2lkKSB7Ci0gIHJldHVybiBjb25maWdfZ2V0X2Jvb2woKmNvbmZpZywgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQVFNfTEVfQ09OTl9VUERBVEVEX0RJU0FCTEVELCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBib29sIGdldF9wdHNfY3Jvc3NrZXlfc2RwX2Rpc2FibGUodm9pZCkgewotICByZXR1cm4gY29uZmlnX2dldF9ib29sKCpjb25maWcsIENPTkZJR19ERUZBVUxUX1NFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFRTX0RJU0FCTEVfU0RQX0xFX1BBSVIsIGZhbHNlKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nKiBnZXRfcHRzX3NtcF9vcHRpb25zKHZvaWQpIHsKLSAgcmV0dXJuIGNvbmZpZ19nZXRfc3RyaW5nKCpjb25maWcsIENPTkZJR19ERUZBVUxUX1NFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQVFNfU01QX1BBSVJJTkdfT1BUSU9OU19LRVksIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGdldF9wdHNfc21wX2ZhaWx1cmVfY2FzZSh2b2lkKSB7Ci0gIHJldHVybiBjb25maWdfZ2V0X2ludCgqY29uZmlnLCBDT05GSUdfREVGQVVMVF9TRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgUFRTX1NNUF9GQUlMVVJFX0NBU0VfS0VZLCAwKTsKLX0KLQotc3RhdGljIGNvbmZpZ190KiBnZXRfYWxsKHZvaWQpIHsgcmV0dXJuIGNvbmZpZy5nZXQoKTsgfQotCi1jb25zdCBzdGFja19jb25maWdfdCBpbnRlcmZhY2UgPSB7Ci0gICAgZ2V0X3RyYWNlX2NvbmZpZ19lbmFibGVkLCAgICAgZ2V0X3B0c19hdnJjcF90ZXN0LAotICAgIGdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSwgICAgIGdldF9wdHNfY29ubl91cGRhdGVzX2Rpc2FibGVkLAotICAgIGdldF9wdHNfY3Jvc3NrZXlfc2RwX2Rpc2FibGUsIGdldF9wdHNfc21wX29wdGlvbnMsCi0gICAgZ2V0X3B0c19zbXBfZmFpbHVyZV9jYXNlLCAgICAgZ2V0X2FsbH07Ci0KLWNvbnN0IHN0YWNrX2NvbmZpZ190KiBzdGFja19jb25maWdfZ2V0X2ludGVyZmFjZSh2b2lkKSB7IHJldHVybiAmaW50ZXJmYWNlOyB9CmRpZmYgLS1naXQgYS9tYWluL3Rlc3QvbWFpbl9zaGltX3Rlc3QuY2MgYi9tYWluL3Rlc3QvbWFpbl9zaGltX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMjA2ZTEuLjAwMDAwMDAKLS0tIGEvbWFpbi90ZXN0L21haW5fc2hpbV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9oaC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJnZC9idGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0jaW5jbHVkZSAiZ2QvaGFsL2hjaV9oYWwuaCIKLSNpbmNsdWRlICJnZC9oY2kvYWNsX21hbmFnZXJfbW9jay5oIgotI2luY2x1ZGUgImdkL2hjaS9jb250cm9sbGVyX21vY2suaCIKLSNpbmNsdWRlICJnZC9tb2R1bGUuaCIKLSNpbmNsdWRlICJnZC9vcy9tb2NrX3F1ZXVlLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvcXVldWUuaCIKLSNpbmNsdWRlICJnZC9wYWNrZXQvcGFja2V0X3ZpZXcuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIuaCIKLSNpbmNsdWRlICJoY2kvYWNsX21hbmFnZXIvY2xhc3NpY19hY2xfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgImhjaS9hY2xfbWFuYWdlci9jb25uZWN0aW9uX21hbmFnZW1lbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2FjbF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAiaGNpL2FjbF9tYW5hZ2VyL2xlX2Nvbm5lY3Rpb25fbWFuYWdlbWVudF9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfcGFja2V0X2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfcGFja2V0X3BhcnNlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYnRfYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYWNsLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbF9sZWdhY3lfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2hlbHBlcnMuaCIKLSNpbmNsdWRlICJvcy9oYW5kbGVyLmgiCi0jaW5jbHVkZSAib3MvdGhyZWFkLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2wyY2FwL2wyY19pbnQuaCIKLSNpbmNsdWRlICJ0ZXN0L2NvbW1vbi9tYWluX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19tYWluX3NoaW1fZW50cnkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOwotdXNpbmcgbmFtZXNwYWNlIHRlc3Rpbmc7Ci0KLW5hbWVzcGFjZSB0ZXN0ID0gYmx1ZXRvb3RoOjpoY2k6OnRlc3Rpbmc7Ci0KLWNvbnN0IHVpbnQ4X3Qga01heExlQWNjZXB0bGlzdFNpemUgPSAxNjsKLWNvbnN0IHVpbnQ4X3Qga01heEFkZHJlc3NSZXNvbHV0aW9uU2l6ZSA9IGtNYXhMZUFjY2VwdGxpc3RTaXplOwotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLXRMMkNfQ0IgbDJjYjsKLXRCVE1fQ0IgYnRtX2NiOwotYnRpZl9oaF9jYl90IGJ0aWZfaGhfY2I7Ci0KLW5hbWVzcGFjZSB7Ci1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwcm9taXNlPHVpbnQxNl90Pj4gbW9ja19mdW5jdGlvbl9oYW5kbGVfcHJvbWlzZV9tYXA7Ci19Ci0KLXVpbnQ4X3QgbW9ja19nZXRfYmxlX2FjY2VwdGxpc3Rfc2l6ZSgpIHsgcmV0dXJuIDEyMzsgfQotCi1zdHJ1Y3QgY29udHJvbGxlcl90IG1vY2tfY29udHJvbGxlciB7Ci0gIC5nZXRfYmxlX2FjY2VwdGxpc3Rfc2l6ZSA9IG1vY2tfZ2V0X2JsZV9hY2NlcHRsaXN0X3NpemUsCi19OwotCi1jb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpIHsgcmV0dXJuICZtb2NrX2NvbnRyb2xsZXI7IH0KLQotdm9pZCBtb2NrX29uX3NlbmRfZGF0YV91cHdhcmRzKEJUX0hEUiopIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLQotdm9pZCBtb2NrX29uX3BhY2tldHNfY29tcGxldGVkKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX3BhY2tldHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLXZvaWQgbW9ja19jb25uZWN0aW9uX2NsYXNzaWNfb25fY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBlbmNfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotdm9pZCBtb2NrX2Nvbm5lY3Rpb25fY2xhc3NpY19vbl9mYWlsZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi12b2lkIG1vY2tfY29ubmVjdGlvbl9jbGFzc2ljX29uX2Rpc2Nvbm5lY3RlZCh0SENJX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyByZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIEFTU0VSVF9UUlVFKG1vY2tfZnVuY3Rpb25faGFuZGxlX3Byb21pc2VfbWFwLmZpbmQoX19mdW5jX18pICE9Ci0gICAgICAgICAgICAgIG1vY2tfZnVuY3Rpb25faGFuZGxlX3Byb21pc2VfbWFwLmVuZCgpKTsKLSAgbW9ja19mdW5jdGlvbl9oYW5kbGVfcHJvbWlzZV9tYXBbX19mdW5jX19dLnNldF92YWx1ZShoYW5kbGUpOwotfQotdm9pZCBtb2NrX2Nvbm5lY3Rpb25fbGVfb25fY29ubmVjdGVkKAotICAgIGNvbnN0IHRCTEVfQkRfQUREUiYgYWRkcmVzc193aXRoX3R5cGUsIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9ST0xFIHJvbGUsCi0gICAgdWludDE2X3QgY29ubl9pbnRlcnZhbCwgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQsCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX3JwYSwKLSAgICB1aW50OF90IHBlZXJfYWRkcl90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBtb2NrX2Nvbm5lY3Rpb25fbGVfb25fZmFpbGVkKGNvbnN0IHRCTEVfQkRfQUREUiYgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCBib29sIGVuaGFuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbW9ja19jb25uZWN0aW9uX2xlX29uX2Rpc2Nvbm5lY3RlZCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyByZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLWNvbnN0IHNoaW06OmxlZ2FjeTo6YWNsX2ludGVyZmFjZV90IEdldE1vY2tBY2xJbnRlcmZhY2UoKSB7Ci0gIHNoaW06OmxlZ2FjeTo6YWNsX2ludGVyZmFjZV90IGFjbF9pbnRlcmZhY2V7Ci0gICAgICAub25fc2VuZF9kYXRhX3Vwd2FyZHMgPSBtb2NrX29uX3NlbmRfZGF0YV91cHdhcmRzLAotICAgICAgLm9uX3BhY2tldHNfY29tcGxldGVkID0gbW9ja19vbl9wYWNrZXRzX2NvbXBsZXRlZCwKLQotICAgICAgLmNvbm5lY3Rpb24uY2xhc3NpYy5vbl9jb25uZWN0ZWQgPSBtb2NrX2Nvbm5lY3Rpb25fY2xhc3NpY19vbl9jb25uZWN0ZWQsCi0gICAgICAuY29ubmVjdGlvbi5jbGFzc2ljLm9uX2ZhaWxlZCA9IG1vY2tfY29ubmVjdGlvbl9jbGFzc2ljX29uX2ZhaWxlZCwKLSAgICAgIC5jb25uZWN0aW9uLmNsYXNzaWMub25fZGlzY29ubmVjdGVkID0KLSAgICAgICAgICBtb2NrX2Nvbm5lY3Rpb25fY2xhc3NpY19vbl9kaXNjb25uZWN0ZWQsCi0KLSAgICAgIC5jb25uZWN0aW9uLmxlLm9uX2Nvbm5lY3RlZCA9IG1vY2tfY29ubmVjdGlvbl9sZV9vbl9jb25uZWN0ZWQsCi0gICAgICAuY29ubmVjdGlvbi5sZS5vbl9mYWlsZWQgPSBtb2NrX2Nvbm5lY3Rpb25fbGVfb25fZmFpbGVkLAotICAgICAgLmNvbm5lY3Rpb24ubGUub25fZGlzY29ubmVjdGVkID0gbW9ja19jb25uZWN0aW9uX2xlX29uX2Rpc2Nvbm5lY3RlZCwKLQotICAgICAgLmNvbm5lY3Rpb24uc2NvLm9uX2VzY29fY29ubmVjdF9yZXF1ZXN0ID0gbnVsbHB0ciwKLSAgICAgIC5jb25uZWN0aW9uLnNjby5vbl9zY29fY29ubmVjdF9yZXF1ZXN0ID0gbnVsbHB0ciwKLSAgICAgIC5jb25uZWN0aW9uLnNjby5vbl9kaXNjb25uZWN0ZWQgPSBudWxscHRyLAotCi0gICAgICAubGluay5jbGFzc2ljLm9uX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fY2VudHJhbF9saW5rX2tleV9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX2NoYW5nZV9jb25uZWN0aW9uX2xpbmtfa2V5X2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fZW5jcnlwdGlvbl9jaGFuZ2UgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9mbG93X3NwZWNpZmljYXRpb25fY29tcGxldGUgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9mbHVzaF9vY2N1cnJlZCA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX21vZGVfY2hhbmdlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcGFja2V0X3R5cGVfY2hhbmdlZCA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3Fvc19zZXR1cF9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfYWZoX2NoYW5uZWxfbWFwX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3NuaWZmX3N1YnJhdGluZyA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfY2xvY2tfY29tcGxldGUgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9yZWFkX2Nsb2NrX29mZnNldF9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfbGlua19wb2xpY3lfc2V0dGluZ3NfY29tcGxldGUgPSBudWxscHRyLAotICAgICAgLmxpbmsuY2xhc3NpYy5vbl9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0X2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9yZW1vdGVfdmVyc2lvbl9pbmZvcm1hdGlvbl9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JlYWRfcmVtb3RlX2V4dGVuZGVkX2ZlYXR1cmVzX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF9yc3NpX2NvbXBsZXRlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcmVhZF90cmFuc21pdF9wb3dlcl9sZXZlbF9jb21wbGV0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5jbGFzc2ljLm9uX3JvbGVfY2hhbmdlID0gbnVsbHB0ciwKLSAgICAgIC5saW5rLmNsYXNzaWMub25fcm9sZV9kaXNjb3ZlcnlfY29tcGxldGUgPSBudWxscHRyLAotCi0gICAgICAubGluay5sZS5vbl9jb25uZWN0aW9uX3VwZGF0ZSA9IG51bGxwdHIsCi0gICAgICAubGluay5sZS5vbl9kYXRhX2xlbmd0aF9jaGFuZ2UgPSBudWxscHRyLAotICAgICAgLmxpbmsubGUub25fcmVhZF9yZW1vdGVfdmVyc2lvbl9pbmZvcm1hdGlvbl9jb21wbGV0ZSA9IG51bGxwdHIsCi0gIH07Ci0gIHJldHVybiBhY2xfaW50ZXJmYWNlOwotfQotCi1jb25zdCBoY2lfcGFja2V0X3BhcnNlcl90KiBoY2lfcGFja2V0X3BhcnNlcl9nZXRfaW50ZXJmYWNlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotY29uc3QgaGNpX3QqIGhjaV9sYXllcl9nZXRfaW50ZXJmYWNlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotY29uc3QgcGFja2V0X2ZyYWdtZW50ZXJfdCogcGFja2V0X2ZyYWdtZW50ZXJfZ2V0X2ludGVyZmFjZSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLXZvaWQgTG9nTXNnKHVpbnQzMl90IHRyYWNlX3NldF9tYXNrLCBjb25zdCBjaGFyKiBmbXRfc3RyLCAuLi4pIHt9Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTW9ja0VuUXVldWUgOiBwdWJsaWMgb3M6OklRdWV1ZUVucXVldWU8VD4gewotICB1c2luZyBFbnF1ZXVlQ2FsbGJhY2sgPSBiYXNlOjpDYWxsYmFjazxzdGQ6OnVuaXF1ZV9wdHI8VD4oKT47Ci0KLSAgdm9pZCBSZWdpc3RlckVucXVldWUob3M6OkhhbmRsZXIqIGhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEVucXVldWVDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGUge30KLSAgdm9pZCBVbnJlZ2lzdGVyRW5xdWV1ZSgpIG92ZXJyaWRlIHt9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1vY2tEZVF1ZXVlIDogcHVibGljIG9zOjpJUXVldWVEZXF1ZXVlPFQ+IHsKLSAgdXNpbmcgRGVxdWV1ZUNhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCgpPjsKLQotICB2b2lkIFJlZ2lzdGVyRGVxdWV1ZShvczo6SGFuZGxlciogaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRGVxdWV1ZUNhbGxiYWNrIGNhbGxiYWNrKSBvdmVycmlkZSB7fQotICB2b2lkIFVucmVnaXN0ZXJEZXF1ZXVlKCkgb3ZlcnJpZGUge30KLSAgc3RkOjp1bmlxdWVfcHRyPFQ+IFRyeURlcXVldWUoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9Ci19OwotCi1jbGFzcyBNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24KLSAgICA6IHB1YmxpYyBibHVldG9vdGg6OmhjaTo6YWNsX21hbmFnZXI6OkNsYXNzaWNBY2xDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIE1vY2tDbGFzc2ljQWNsQ29ubmVjdGlvbihjb25zdCBoY2k6OkFkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSkgewotICAgIGFkZHJlc3NfID0gYWRkcmVzczsgIC8vIENsYXNzaWNBY2xDb25uZWN0aW9uCi0gICAgaGFuZGxlXyA9IGhhbmRsZTsgICAgLy8gQWNsQ29ubmVjdGlvbgotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckNhbGxiYWNrcygKLSAgICAgIGhjaTo6YWNsX21hbmFnZXI6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICBvczo6SGFuZGxlciogaGFuZGxlcikgb3ZlcnJpZGUgewotICAgIGNhbGxiYWNrc18gPSBjYWxsYmFja3M7Ci0gICAgaGFuZGxlcl8gPSBoYW5kbGVyOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgYmlkaSBxdWV1ZSBmb3IgdGhpcyBtb2NrIGNvbm5lY3Rpb24KLSAgQWNsQ29ubmVjdGlvbjo6UXVldWVVcEVuZCogR2V0QWNsUXVldWVFbmQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICZtb2NrX2FjbF9xdWV1ZV87Ci0gIH0KLQotICBtdXRhYmxlIGNvbW1vbjo6QmlkaVF1ZXVlRW5kPGhjaTo6QmFzZVBhY2tldEJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0OjpQYWNrZXRWaWV3PGhjaTo6a0xpdHRsZUVuZGlhbj4+Ci0gICAgICBtb2NrX2FjbF9xdWV1ZV97JnR4XywgJnJ4X307Ci0KLSAgTW9ja0VuUXVldWU8aGNpOjpCYXNlUGFja2V0QnVpbGRlcj4gdHhfOwotICBNb2NrRGVRdWV1ZTxwYWNrZXQ6OlBhY2tldFZpZXc8aGNpOjprTGl0dGxlRW5kaWFuPj4gcnhfOwotCi0gIGJvb2wgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgYm9vbCBSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgYm9vbCBEaXNjb25uZWN0KGhjaTo6RGlzY29ubmVjdFJlYXNvbiByZWFzb24pIG92ZXJyaWRlIHsKLSAgICBkaXNjb25uZWN0X2NudF8rKzsKLSAgICBkaXNjb25uZWN0X3Byb21pc2VfLnNldF92YWx1ZShoYW5kbGVfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0ZDo6cHJvbWlzZTx1aW50MTZfdD4gZGlzY29ubmVjdF9wcm9taXNlXzsKLQotICBoY2k6OmFjbF9tYW5hZ2VyOjpDb25uZWN0aW9uTWFuYWdlbWVudENhbGxiYWNrcyogY2FsbGJhY2tzX3tudWxscHRyfTsKLSAgb3M6OkhhbmRsZXIqIGhhbmRsZXJfe251bGxwdHJ9OwotCi0gIGludCBkaXNjb25uZWN0X2NudF97MH07Ci19OwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLXZvaWQgaW5pdF9hY3Rpdml0eV9hdHRyaWJ1dGlvbigpIHt9Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLWV4dGVybiBvczo6SGFuZGxlciogbW9ja19oYW5kbGVyXzsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBzaGltCi0KLW5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbiB7Ci1BY3Rpdml0eUF0dHJpYnV0aW9uSW50ZXJmYWNlKiBnZXRfYWN0aXZpdHlfYXR0cmlidXRpb25faW5zdGFuY2UoKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1jb25zdCBNb2R1bGVGYWN0b3J5IEFjdGl2aXR5QXR0cmlidXRpb246OkZhY3RvcnkgPQotICAgIE1vZHVsZUZhY3RvcnkoW10oKSB7IHJldHVybiBudWxscHRyOyB9KTsKLX0gIC8vIG5hbWVzcGFjZSBhY3Rpdml0eV9hdHRyaWJ1dGlvbgotCi1uYW1lc3BhY2UgaGFsIHsKLWNvbnN0IE1vZHVsZUZhY3RvcnkgSGNpSGFsOjpGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG51bGxwdHI7IH0pOwotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLWNsYXNzIE1haW5TaGltVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1haW5fdGhyZWFkX3N0YXJ0X3VwKCk7Ci0KLSAgICB0aHJlYWRfID0gbmV3IG9zOjpUaHJlYWQoImFjbF90aHJlYWQiLCBvczo6VGhyZWFkOjpQcmlvcml0eTo6Tk9STUFMKTsKLSAgICBoYW5kbGVyXyA9IG5ldyBvczo6SGFuZGxlcih0aHJlYWRfKTsKLQotICAgIC8qIGV4dGVybiAqLyB0ZXN0Ojptb2NrX2NvbnRyb2xsZXJfID0KLSAgICAgICAgbmV3IGJsdWV0b290aDo6aGNpOjp0ZXN0aW5nOjpNb2NrQ29udHJvbGxlcigpOwotICAgIC8qIGV4dGVybiAqLyB0ZXN0Ojptb2NrX2FjbF9tYW5hZ2VyXyA9Ci0gICAgICAgIG5ldyBibHVldG9vdGg6OmhjaTo6dGVzdGluZzo6TW9ja0FjbE1hbmFnZXIoKTsKLSAgfQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSB0ZXN0Ojptb2NrX2NvbnRyb2xsZXJfOwotICAgIHRlc3Q6Om1vY2tfY29udHJvbGxlcl8gPSBudWxscHRyOwotICAgIGRlbGV0ZSB0ZXN0Ojptb2NrX2FjbF9tYW5hZ2VyXzsKLSAgICB0ZXN0Ojptb2NrX2FjbF9tYW5hZ2VyXyA9IG51bGxwdHI7Ci0KLSAgICBoYW5kbGVyXy0+Q2xlYXIoKTsKLSAgICBkZWxldGUgaGFuZGxlcl87Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0KLSAgICBtYWluX3RocmVhZF9zaHV0X2Rvd24oKTsKLSAgfQotICBvczo6VGhyZWFkKiB0aHJlYWRfe251bGxwdHJ9OwotICBvczo6SGFuZGxlciogaGFuZGxlcl97bnVsbHB0cn07Ci0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBBQ0wgb2JqZWN0cwotICBzdGQ6OnVuaXF1ZV9wdHI8c2hpbTo6bGVnYWN5OjpBY2w+IE1ha2VBY2woKSB7Ci0gICAgRVhQRUNUX0NBTEwoKnRlc3Q6Om1vY2tfYWNsX21hbmFnZXJfLCBSZWdpc3RlckNhbGxiYWNrcyhfLCBfKSkuVGltZXMoMSk7Ci0gICAgRVhQRUNUX0NBTEwoKnRlc3Q6Om1vY2tfYWNsX21hbmFnZXJfLCBSZWdpc3RlckxlQ2FsbGJhY2tzKF8sIF8pKS5UaW1lcygxKTsKLSAgICBFWFBFQ1RfQ0FMTCgqdGVzdDo6bW9ja19jb250cm9sbGVyXywKLSAgICAgICAgICAgICAgICBSZWdpc3RlckNvbXBsZXRlZE1vbml0b3JBY2xQYWNrZXRzQ2FsbGJhY2soXykpCi0gICAgICAgIC5UaW1lcygxKTsKLSAgICBFWFBFQ1RfQ0FMTCgqdGVzdDo6bW9ja19hY2xfbWFuYWdlcl8sIEhBQ0tfU2V0Tm9uQWNsRGlzY29ubmVjdENhbGxiYWNrKF8pKQotICAgICAgICAuVGltZXMoMSk7Ci0gICAgRVhQRUNUX0NBTEwoKnRlc3Q6Om1vY2tfY29udHJvbGxlcl8sCi0gICAgICAgICAgICAgICAgVW5yZWdpc3RlckNvbXBsZXRlZE1vbml0b3JBY2xQYWNrZXRzQ2FsbGJhY2spCi0gICAgICAgIC5UaW1lcygxKTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxzaGltOjpsZWdhY3k6OkFjbD4oaGFuZGxlcl8sIEdldE1vY2tBY2xJbnRlcmZhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heExlQWNjZXB0bGlzdFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhBZGRyZXNzUmVzb2x1dGlvblNpemUpOwotICB9Ci19OwotCi1URVNUX0YoTWFpblNoaW1UZXN0LCBOb3ApIHt9Ci0KLVRFU1RfRihNYWluU2hpbVRlc3QsIEFjbF9MaWZlY3ljbGUpIHsKLSAgYXV0byBhY2wgPSBNYWtlQWNsKCk7Ci0gIGFjbC5yZXNldCgpOwotICBhY2wgPSBNYWtlQWNsKCk7Ci19Ci0KLVRFU1RfRihNYWluU2hpbVRlc3QsIGhlbHBlcnMpIHsKLSAgdWludDhfdCByZWFzb24gPSAwOwotICBkbyB7Ci0gICAgaGNpOjpFcnJvckNvZGUgZ2RfZXJyb3JfY29kZSA9IHN0YXRpY19jYXN0PGhjaTo6RXJyb3JDb2RlPihyZWFzb24pOwotICAgIHRIQ0lfU1RBVFVTIGxlZ2FjeV9jb2RlID0gVG9MZWdhY3lIY2lFcnJvckNvZGUoZ2RfZXJyb3JfY29kZSk7Ci0gICAgQVNTRVJUX0VRKHJlYXNvbiwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oVG9MZWdhY3lIY2lFcnJvckNvZGUoZ2RfZXJyb3JfY29kZSkpKTsKLSAgICBBU1NFUlRfRVEocmVhc29uLCBzdGF0aWNfY2FzdDx1aW50OF90PihsZWdhY3lfY29kZSkpOwotICB9IHdoaWxlICgrK3JlYXNvbiAhPSAwKTsKLX0KLQotVEVTVF9GKE1haW5TaGltVGVzdCwgY29ubmVjdF9hbmRfZGlzY29ubmVjdCkgewotICBoY2k6OkFkZHJlc3MgYWRkcmVzcyh7MHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2Nn0pOwotCi0gIGF1dG8gYWNsID0gTWFrZUFjbCgpOwotCi0gIC8vIENyZWF0ZSBjb25uZWN0aW9uCi0gIEVYUEVDVF9DQUxMKCp0ZXN0Ojptb2NrX2FjbF9tYW5hZ2VyXywgQ3JlYXRlQ29ubmVjdGlvbihfKSkuVGltZXMoMSk7Ci0gIGFjbC0+Q3JlYXRlQ2xhc3NpY0Nvbm5lY3Rpb24oYWRkcmVzcyk7Ci0KLSAgLy8gUmVzcG9uZCB3aXRoIGEgbW9jayBjb25uZWN0aW9uIGNyZWF0ZWQKLSAgYXV0byBjb25uZWN0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrQ2xhc3NpY0FjbENvbm5lY3Rpb24+KGFkZHJlc3MsIDEyMyk7Ci0gIEFTU0VSVF9FUSgxMjMsIGNvbm5lY3Rpb24tPkdldEhhbmRsZSgpKTsKLSAgQVNTRVJUX0VRKGhjaTo6QWRkcmVzcyh7MHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2Nn0pLAotICAgICAgICAgICAgY29ubmVjdGlvbi0+R2V0QWRkcmVzcygpKTsKLSAgTW9ja0NsYXNzaWNBY2xDb25uZWN0aW9uKiByYXdfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uZ2V0KCk7Ci0KLSAgYWNsLT5PbkNvbm5lY3RTdWNjZXNzKHN0ZDo6bW92ZShjb25uZWN0aW9uKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBjb25uZWN0aW9uKTsKLQotICAvLyBTcGVjaWZ5IGxvY2FsIGRpc2Nvbm5lY3QgcmVxdWVzdAotICBhdXRvIHR4X2Rpc2Nvbm5lY3RfZnV0dXJlID0gcmF3X2Nvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfcHJvbWlzZV8uZ2V0X2Z1dHVyZSgpOwotICBhY2wtPkRpc2Nvbm5lY3RDbGFzc2ljKDEyMywgSENJX1NVQ0NFU1MpOwotCi0gIC8vIFdhaXQgZm9yIGRpc2Nvbm5lY3QgdG8gYmUgcmVjZWl2ZWQKLSAgdWludDE2X3QgcmVzdWx0ID0gdHhfZGlzY29ubmVjdF9mdXR1cmUuZ2V0KCk7Ci0gIEFTU0VSVF9FUSgxMjMsIHJlc3VsdCk7Ci0KLSAgLy8gTm93IGVtdWxhdGUgdGhlIHJlbW90ZSBkaXNjb25uZWN0IHJlc3BvbnNlCi0gIGF1dG8gaGFuZGxlX3Byb21pc2UgPSBzdGQ6OnByb21pc2U8dWludDE2X3Q+KCk7Ci0gIGF1dG8gcnhfZGlzY29ubmVjdF9mdXR1cmUgPSBoYW5kbGVfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIG1vY2tfZnVuY3Rpb25faGFuZGxlX3Byb21pc2VfbWFwWyJtb2NrX2Nvbm5lY3Rpb25fY2xhc3NpY19vbl9kaXNjb25uZWN0ZWQiXSA9Ci0gICAgICBzdGQ6Om1vdmUoaGFuZGxlX3Byb21pc2UpOwotICByYXdfY29ubmVjdGlvbi0+Y2FsbGJhY2tzXy0+T25EaXNjb25uZWN0aW9uKGhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKTsKLQotICByZXN1bHQgPSByeF9kaXNjb25uZWN0X2Z1dHVyZS5nZXQoKTsKLSAgQVNTRVJUX0VRKDEyMywgcmVzdWx0KTsKLQotICAvLyAqT3VyKiB0YXNrIGNvbXBsZXRpbmcgaW5kaWNhdGVzIHJlYWN0b3IgaXMgZG9uZQotICBzdGQ6OnByb21pc2U8dm9pZD4gZG9uZTsKLSAgYXV0byBmdXR1cmUgPSBkb25lLmdldF9mdXR1cmUoKTsKLSAgaGFuZGxlcl8tPkNhbGwoW10oc3RkOjpwcm9taXNlPHZvaWQ+IGRvbmUpIHsgZG9uZS5zZXRfdmFsdWUoKTsgfSwKLSAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRvbmUpKTsKLSAgZnV0dXJlLndhaXQoKTsKLX0KLQotVEVTVF9GKE1haW5TaGltVGVzdCwgaXNfZmx1c2hhYmxlKSB7Ci0gIHsKLSAgICBCVF9IRFIqIGJ0X2hkciA9Ci0gICAgICAgIChCVF9IRFIqKWNhbGxvYygxLCBzaXplb2YoQlRfSERSKSArIHNpemVvZihIY2lEYXRhUHJlYW1ibGUpKTsKLQotICAgIEFTU0VSVF9UUlVFKCFJc1BhY2tldEZsdXNoYWJsZShidF9oZHIpKTsKLSAgICBIY2lEYXRhUHJlYW1ibGUqIGhjaSA9IFRvUGFja2V0RGF0YTxIY2lEYXRhUHJlYW1ibGU+KGJ0X2hkcik7Ci0gICAgaGNpLT5TZXRGbHVzaGFibGUoKTsKLSAgICBBU1NFUlRfVFJVRShJc1BhY2tldEZsdXNoYWJsZShidF9oZHIpKTsKLQotICAgIGZyZWUoYnRfaGRyKTsKLSAgfQotCi0gIHsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMTAyNDsKLSAgICBCVF9IRFIqIGJ0X2hkciA9Ci0gICAgICAgIChCVF9IRFIqKWNhbGxvYygxLCBzaXplb2YoQlRfSERSKSArIHNpemVvZihIY2lEYXRhUHJlYW1ibGUpICsgb2Zmc2V0KTsKLSAgICBidF9oZHItPm9mZnNldCA9IG9mZnNldDsKLQotICAgIEFTU0VSVF9UUlVFKCFJc1BhY2tldEZsdXNoYWJsZShidF9oZHIpKTsKLSAgICBIY2lEYXRhUHJlYW1ibGUqIGhjaSA9IFRvUGFja2V0RGF0YTxIY2lEYXRhUHJlYW1ibGU+KGJ0X2hkcik7Ci0gICAgaGNpLT5TZXRGbHVzaGFibGUoKTsKLSAgICBBU1NFUlRfVFJVRShJc1BhY2tldEZsdXNoYWJsZShidF9oZHIpKTsKLQotICAgIGZyZWUoYnRfaGRyKTsKLSAgfQotCi0gIHsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMTAyNDsKLSAgICBCVF9IRFIqIGJ0X2hkciA9Ci0gICAgICAgIChCVF9IRFIqKWNhbGxvYygxLCBzaXplb2YoQlRfSERSKSArIHNpemVvZihIY2lEYXRhUHJlYW1ibGUpICsgb2Zmc2V0KTsKLQotICAgIHVpbnQ4X3QqIHAgPSBUb1BhY2tldERhdGE8dWludDhfdD4oYnRfaGRyLCBMMkNBUF9TRU5EX0NNRF9PRkZTRVQpOwotICAgIFVJTlQxNl9UT19TVFJFQU0oCi0gICAgICAgIHAsIDB4MTIzIHwgKEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKSk7Ci0gICAgQVNTRVJUX1RSVUUoIUlzUGFja2V0Rmx1c2hhYmxlKGJ0X2hkcikpOwotCi0gICAgcCA9IFRvUGFja2V0RGF0YTx1aW50OF90PihidF9oZHIsIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCAweDEyMyB8IChMMkNBUF9QS1RfU1RBUlQgPDwgTDJDQVBfUEtUX1RZUEVfU0hJRlQpKTsKLSAgICBBU1NFUlRfVFJVRShJc1BhY2tldEZsdXNoYWJsZShidF9oZHIpKTsKLQotICAgIGZyZWUoYnRfaGRyKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvb3NpL0FuZHJvaWQuYnAgYi9vc2kvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhNTA3ZC4uMDAwMDAwMAotLS0gYS9vc2kvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZmx1b3JpZGVfb3NpX2RlZmF1bHRzIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLX0KLQotLy8gU3RhdGljIGxpYnJhcmllcyByZXF1aXJlZCBieSBvdGhlciBtb2R1bGVzCi1jY190ZXN0X2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJvc2ktQWxsb2NhdGlvblRlc3RIYXJuZXNzIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9vc2lfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5jYyIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzaGFyZWQ6IHsKLSAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgfSwKLX0KLQotY2NfdGVzdF9saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlib3NpLUFsYXJtVGVzdEhhcm5lc3MiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX29zaV9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3QvQWxhcm1UZXN0SGFybmVzcy5jYyIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzaGFyZWQ6IHsKLSAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgfSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIk9zaUNvbXBhdFNvdXJjZXMiLAotICBzcmNzOiBbCi0gICAgInNyYy9jb21wYXQuY2MiLAotICBdLAotfQotCi0vLyBsaWJvc2kgc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJvc2kiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX29zaV9kZWZhdWx0cyJdLAotICAgIC8vIFRPRE8obWNjaG91KTogUmVtb3ZlIHNvY2tldF91dGlscyBzb3VyY2VzIGFmdGVyIHBsYXRmb3JtIHNwZWNpZmljCi0gICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBhYnN0cmFjdGVkLgotICAgIHNyY3M6IFsKLSAgICAgICAgIjpPc2lDb21wYXRTb3VyY2VzIiwKLSAgICAgICAgInNyYy9hbGFybS5jYyIsCi0gICAgICAgICJzcmMvYWxsb2NhdGlvbl90cmFja2VyLmNjIiwKLSAgICAgICAgInNyYy9hbGxvY2F0b3IuY2MiLAotICAgICAgICAic3JjL2FycmF5LmNjIiwKLSAgICAgICAgInNyYy9idWZmZXIuY2MiLAotICAgICAgICAic3JjL2NvbmZpZy5jYyIsCi0gICAgICAgICJzcmMvZml4ZWRfcXVldWUuY2MiLAotICAgICAgICAic3JjL2Z1dHVyZS5jYyIsCi0gICAgICAgICJzcmMvaGFzaF9tYXBfdXRpbHMuY2MiLAotICAgICAgICAic3JjL2xpc3QuY2MiLAotICAgICAgICAic3JjL211dGV4LmNjIiwKLSAgICAgICAgInNyYy9vc2kuY2MiLAotICAgICAgICAic3JjL3Byb3BlcnRpZXMuY2MiLAotICAgICAgICAic3JjL3JlYWN0b3IuY2MiLAotICAgICAgICAic3JjL3JpbmdidWZmZXIuY2MiLAotICAgICAgICAic3JjL3NlbWFwaG9yZS5jYyIsCi0gICAgICAgICJzcmMvc29ja2V0LmNjIiwKLSAgICAgICAgInNyYy9zb2NrZXRfdXRpbHMvc29ja2V0X2xvY2FsX2NsaWVudC5jYyIsCi0gICAgICAgICJzcmMvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbF9zZXJ2ZXIuY2MiLAotICAgICAgICAic3JjL3RocmVhZC5jYyIsCi0gICAgICAgICJzcmMvdGhyZWFkX3NjaGVkdWxlci5jYyIsCi0gICAgICAgICJzcmMvd2FrZWxvY2suY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWyJsaWJidC1wcm90b3MtbGl0ZSJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIC8vIFRPRE8oYXJtYW5zaXRvKTogU2V0dGluZyBfR05VX1NPVVJDRSBpc24ndCB2ZXJ5IHBsYXRmb3JtLWluZGVwZW5kZW50IGJ1dAotICAgIC8vIHNob3VsZCBiZSBjb21wYXRpYmxlIGZvciBhIExpbnV4IGhvc3QgT1MuIFdlIHNob3VsZCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yCi0gICAgLy8gYSBub24tTGludXggaG9zdCBPUy4KLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgbGludXhfZ2xpYmM6IHsKLSAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICItRF9HTlVfU09VUkNFIiwKLSAgICAgICAgICAgICAgICAiLURPU19HRU5FUklDIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotLy8gbGlib3NpIHVuaXQgdGVzdHMgZm9yIHRhcmdldCBhbmQgaG9zdAotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X29zaSIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfb3NpX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9BbGFybVRlc3RIYXJuZXNzLmNjIiwKLSAgICAgICAgInRlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmNjIiwKLSAgICAgICAgInRlc3QvYWxhcm1fdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0L2FsbG9jYXRpb25fdHJhY2tlcl90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvYWxsb2NhdG9yX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9hcnJheV90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvY29uZmlnX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9maXhlZF9xdWV1ZV90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvZnV0dXJlX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9oYXNoX21hcF91dGlsc190ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvbGlzdF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvcHJvcGVydGllc190ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvcmFuZF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvcmVhY3Rvcl90ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvcmluZ2J1ZmZlcl90ZXN0LmNjIiwKLSAgICAgICAgInRlc3Qvc2VtYXBob3JlX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC90aHJlYWRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0L3dha2Vsb2NrX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYmMrK2ZzIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBsaW51eF9nbGliYzogewotICAgICAgICAgICAgY2ZsYWdzOiBbIi1ET1NfR0VORVJJQyJdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiBmYWxzZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvb3NpL0JVSUxELmduIGIvb3NpL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ3MGI2Li4wMDAwMDAwCi0tLSBhL29zaS9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc3RhdGljX2xpYnJhcnkoIm9zaSIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAic3JjL2FsYXJtLmNjIiwKLSAgICAic3JjL2FsbG9jYXRpb25fdHJhY2tlci5jYyIsCi0gICAgInNyYy9hbGxvY2F0b3IuY2MiLAotICAgICJzcmMvYXJyYXkuY2MiLAotICAgICJzcmMvYnVmZmVyLmNjIiwKLSAgICAic3JjL2NvbXBhdC5jYyIsCi0gICAgInNyYy9jb25maWcuY2MiLAotICAgICJzcmMvZml4ZWRfcXVldWUuY2MiLAotICAgICJzcmMvZnV0dXJlLmNjIiwKLSAgICAic3JjL2hhc2hfbWFwX3V0aWxzLmNjIiwKLSAgICAic3JjL2xpc3QuY2MiLAotICAgICJzcmMvbXV0ZXguY2MiLAotICAgICJzcmMvb3NpLmNjIiwKLSAgICAic3JjL3Byb3BlcnRpZXMuY2MiLAotICAgICJzcmMvcmVhY3Rvci5jYyIsCi0gICAgInNyYy9yaW5nYnVmZmVyLmNjIiwKLSAgICAic3JjL3NlbWFwaG9yZS5jYyIsCi0gICAgInNyYy9zb2NrZXQuY2MiLAotCi0gICAgIyBUT0RPKG1jY2hvdSk6IFJlbW92ZSB0aGVzZSBzb3VyY2VzIGFmdGVyIHBsYXRmb3JtIHNwZWNpZmljCi0gICAgIyBkZXBlbmRlbmNpZXMgYXJlIGFic3RyYWN0ZWQuCi0gICAgInNyYy9zb2NrZXRfdXRpbHMvc29ja2V0X2xvY2FsX2NsaWVudC5jYyIsCi0gICAgInNyYy9zb2NrZXRfdXRpbHMvc29ja2V0X2xvY2FsX3NlcnZlci5jYyIsCi0gICAgInNyYy90aHJlYWQuY2MiLAotICAgICJzcmMvd2FrZWxvY2suY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvL2J0LyIsCi0gICAgIi8vYnQvbGludXhfaW5jbHVkZSIsCi0gICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgIi8vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgIi8vYnQvc3RhY2svaW5jbHVkZSIsCi0gIF0KLQotICBkZXBzID0gWwotICAgICIvL2J0L2NvbW1vbiIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gIF0KLQotICBjb25maWdzICs9IFsKLSAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICBdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBleGVjdXRhYmxlKCJuZXRfdGVzdF9vc2kiKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICJ0ZXN0L0FsYXJtVGVzdEhhcm5lc3MuY2MiLAotICAgICAgInRlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmNjIiwKLSAgICAgICJ0ZXN0L2FsYXJtX3Rlc3QuY2MiLAotICAgICAgInRlc3QvYWxsb2NhdGlvbl90cmFja2VyX3Rlc3QuY2MiLAotICAgICAgInRlc3QvYWxsb2NhdG9yX3Rlc3QuY2MiLAotICAgICAgInRlc3QvYXJyYXlfdGVzdC5jYyIsCi0gICAgICAidGVzdC9jb25maWdfdGVzdC5jYyIsCi0gICAgICAidGVzdC9mdXR1cmVfdGVzdC5jYyIsCi0gICAgICAidGVzdC9oYXNoX21hcF91dGlsc190ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L2xpc3RfdGVzdC5jYyIsCi0gICAgICAidGVzdC9wcm9wZXJ0aWVzX3Rlc3QuY2MiLAotICAgICAgInRlc3QvcmFuZF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L3JlYWN0b3JfdGVzdC5jYyIsCi0gICAgICAidGVzdC9yaW5nYnVmZmVyX3Rlc3QuY2MiLAotICAgICAgInRlc3QvdGhyZWFkX3Rlc3QuY2MiLAotICAgIF0KLQotICAgIGluY2x1ZGVfZGlycyA9IFsKLSAgICAgICIvL2J0LyIsCi0gICAgICAiLy9idC9vc2kvdGVzdCIsCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICIvL2J0L29zaSIsCi0gICAgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9ndGVzdF9tYWluIiwKLSAgICAgICIvL2J0OmV4dGVybmFsX2dtb2NrX21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0KLSAgICBsaWJzID0gWwotICAgICAgInB0aHJlYWQiLAotICAgICAgInJ0IiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL2FsYXJtLmggYi9vc2kvaW5jbHVkZS9hbGFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIyMjhiLi4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL2FsYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgYWxhcm1fdCBhbGFybV90OwotdHlwZWRlZiBzdHJ1Y3QgZml4ZWRfcXVldWVfdCBmaXhlZF9xdWV1ZV90OwotdHlwZWRlZiBzdHJ1Y3QgdGhyZWFkX3QgdGhyZWFkX3Q7Ci0KLS8vIFByb3RvdHlwZSBmb3IgdGhlIGFsYXJtIGNhbGxiYWNrIGZ1bmN0aW9uLgotdHlwZWRlZiB2b2lkICgqYWxhcm1fY2FsbGJhY2tfdCkodm9pZCogZGF0YSk7Ci0KLS8vIENyZWF0ZXMgYSBuZXcgb25lLXRpbWUgb2ZmIGFsYXJtIG9iamVjdCB3aXRoIHVzZXItYXNzaWduZWQKLS8vIHxuYW1lfC4gfG5hbWV8IG1heSBub3QgYmUgTlVMTCwgYW5kIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpbGwKLS8vIGJlIHN0b3JlZCBpbnRlcm5hbGx5LiBUaGUgdmFsdWUgb2YgfG5hbWV8IGhhcyBubyBzZW1hbnRpYwotLy8gbWVhbmluZy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgbmFtZSBpcyB1bmlxdWUgKGZvcgotLy8gYmV0dGVyIGRlYnVnZ2FiaWxpdHkpLCBidXQgdGhhdCBpcyBub3QgZW5mb3JjZWQuIFRoZSByZXR1cm5lZAotLy8gb2JqZWN0IG11c3QgYmUgZnJlZWQgYnkgY2FsbGluZyB8YWxhcm1fZnJlZXwuIFJldHVybnMgTlVMTCBvbgotLy8gZmFpbHVyZS4KLWFsYXJtX3QqIGFsYXJtX25ldyhjb25zdCBjaGFyKiBuYW1lKTsKLQotLy8gQ3JlYXRlcyBhIG5ldyBwZXJpb2RpYyBhbGFybSBvYmplY3Qgd2l0aCB1c2VyLWFzc2lnbmVkIHxuYW1lfC4KLS8vIHxuYW1lfCBtYXkgbm90IGJlIE5VTEwsIGFuZCBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aWxsIGJlCi0vLyBzdG9yZWQgaW50ZXJuYWxseS4gVGhlIHZhbHVlIG9mIHxuYW1lfCBoYXMgbm8gc2VtYW50aWMKLS8vIG1lYW5pbmcuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIG5hbWUgaXMgdW5pcXVlIChmb3IgYmV0dGVyCi0vLyBkZWJ1Z2dhYmlsaXR5KSwgYnV0IHRoYXQgaXMgbm90IGVuZm9yY2VkLiBUaGUgcmV0dXJuZWQgb2JqZWN0Ci0vLyBtdXN0IGJlIGZyZWVkIGJ5IGNhbGxpbmcgfGFsYXJtX2ZyZWV8LiBSZXR1cm5zIE5VTEwgb24KLS8vIGZhaWx1cmUuCi1hbGFybV90KiBhbGFybV9uZXdfcGVyaW9kaWMoY29uc3QgY2hhciogbmFtZSk7Ci0KLS8vIEZyZWVzIGFuIHxhbGFybXwgb2JqZWN0IGNyZWF0ZWQgYnkgfGFsYXJtX25ld3wgb3IKLS8vIHxhbGFybV9uZXdfcGVyaW9kaWN8LiB8YWxhcm18IG1heSBiZSBOVUxMLiBJZiB0aGUgYWxhcm0gaXMKLS8vIHBlbmRpbmcsIGl0IHdpbGwgYmUgY2FuY2VsbGVkIGZpcnN0LiBJdCBpcyBub3Qgc2FmZSB0byBjYWxsCi0vLyB8YWxhcm1fZnJlZXwgZnJvbSBpbnNpZGUgdGhlIGNhbGxiYWNrIG9mIHxhbGFybXwuCi12b2lkIGFsYXJtX2ZyZWUoYWxhcm1fdCogYWxhcm0pOwotCi0vLyBTZXRzIGFuIHxhbGFybXwgdG8gZXhlY3V0ZSBhIGNhbGxiYWNrIGluIHRoZSBmdXR1cmUuIFRoZSB8Y2J8Ci0vLyBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGdpdmVuIHxpbnRlcnZhbF9tc3wsIHdoZXJlCi0vLyB8aW50ZXJ2YWxfbXN8IGlzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHJlbGF0aXZlIHRvIHRoZQotLy8gY3VycmVudCB0aW1lLiBJZiB8YWxhcm18IHdhcyBjcmVhdGVkIHdpdGgKLS8vIHxhbGFybV9uZXdfcGVyaW9kaWN8LCB0aGUgYWxhcm0gaXMgc2NoZWR1bGVkIHRvIGZpcmUKLS8vIHBlcmlvZGljYWxseSBldmVyeSB8aW50ZXJ2YWxfbXN8LCBvdGhlcndpc2UgaXQgaXMgYSBvbmUgdGltZQotLy8gb25seSBhbGFybS4gQSBwZXJpb2RpYyBhbGFybSByZXBlYXRzIGV2ZXJ5IHxpbnRlcnZhbF9tc3wgdW50aWwKLS8vIGl0IGlzIGNhbmNlbGxlZCBvciBmcmVlZC4gV2hlbiB0aGUgYWxhcm0gZmlyZXMsIHRoZSB8Y2J8Ci0vLyBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgY29udGV4dCBhcmd1bWVudCB8ZGF0YXw6Ci0vLwotLy8gICAgICB2b2lkIGNiKHZvaWQgKmRhdGEpIHsuLi59Ci0vLwotLy8gVGhlIHxkYXRhfCBhcmd1bWVudCBtYXkgYmUgTlVMTCwgYnV0IHRoZSB8Y2J8IGNhbGxiYWNrIG1heSBub3QKLS8vIGJlIE5VTEwuIEFsbCB8Y2J8IGNhbGxiYWNrcyBzY2hlZHVsZWQgdGhyb3VnaCB0aGlzIGNhbGwgYXJlCi0vLyBjYWxsZWQgd2l0aGluIGEgc2luZ2xlIChpbnRlcm5hbGx5IGNyZWF0ZWQpIHRocmVhZC4gVGhhdAotLy8gdGhyZWFkIGlzIG5vdCBzYW1lIGFzIHRoZSBjYWxsZXLigJlzIHRocmVhZC4gSWYgdHdvIChvciBtb3JlKQotLy8gYWxhcm1zIGFyZSBzZXQgYmFjay10by1iYWNrIHdpdGggdGhlIHNhbWUgfGludGVydmFsX21zfCwgdGhlCi0vLyBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoZSBhbGFybXMgYXJlIHNldC4KLXZvaWQgYWxhcm1fc2V0KGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwKLSAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpOwotCi0vLyBTZXRzIGFuIHxhbGFybXwgdG8gZXhlY3V0ZSBhIGNhbGxiYWNrIGluIHRoZSBtYWluIG1lc3NhZ2UgbG9vcC4gVGhpcyBmdW5jdGlvbgotLy8gaXMgc2FtZSBhcyB8YWxhcm1fc2V0fCBleGNlcHQgdGhhdCB0aGUgfGNifCBjYWxsYmFjayBpcyBzY2hlZHVsZWQgZm9yCi0vLyBleGVjdXRpb24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIG1haW4gbWVzc2FnZSBsb29wLgotdm9pZCBhbGFybV9zZXRfb25fbWxvb3AoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YSk7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gY2FuY2VscyB0aGUgfGFsYXJtfCBpZiBpdCB3YXMgcHJldmlvdXNseSBzZXQuCi0vLyBXaGVuIHRoaXMgY2FsbCByZXR1cm5zLCB0aGUgY2FsbGVyIGhhcyBhIGd1YXJhbnRlZSB0aGF0IHRoZQotLy8gY2FsbGJhY2sgaXMgbm90IGluIHByb2dyZXNzIGFuZCB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgaXQKLS8vIGhhc24ndCBhbHJlYWR5IGJlZW4gY2FsbGVkLiBUaGlzIGZ1bmN0aW9uIGlzIGlkZW1wb3RlbnQuCi0vLyB8YWxhcm18IG1heSBub3QgYmUgTlVMTC4KLXZvaWQgYWxhcm1fY2FuY2VsKGFsYXJtX3QqIGFsYXJtKTsKLQotLy8gVGVzdHMgd2hldGhlciB0aGUgfGFsYXJtfCBpcyBzY2hlZHVsZWQuCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgfGFsYXJtfCBpcyBzY2hlZHVsZWQgb3IgTlVMTCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBhbGFybV9pc19zY2hlZHVsZWQoY29uc3QgYWxhcm1fdCogYWxhcm0pOwotCi0vLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHRpbWUgdW50aWwgbmV4dCBleHBpcmF0aW9uLgotLy8gUmV0dXJucyAwIGlmIG5vdCBhcm1lZC4gfGFsYXJtfCBtYXkgbm90IGJlIE5VTEwuCi0vLyBUT0RPOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIFBNIHRpbWVycyBjYW4gYmUgcmUtZmFjdG9yZWQKLXVpbnQ2NF90IGFsYXJtX2dldF9yZW1haW5pbmdfbXMoY29uc3QgYWxhcm1fdCogYWxhcm0pOwotCi0vLyBDbGVhbnVwIHRoZSBhbGFybSBpbnRlcm5hbCBzdGF0ZS4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgT1NJIG1vZHVsZSBjbGVhbnVwIGR1cmluZwotLy8gZ3JhY2VmdWwgc2h1dGRvd24uCi12b2lkIGFsYXJtX2NsZWFudXAodm9pZCk7Ci0KLS8vIER1bXAgYWxhcm0tcmVsYXRlZCBzdGF0aXN0aWNzIGFuZCBkZWJ1ZyBpbmZvIHRvIHRoZSB8ZmR8IGZpbGUgZGVzY3JpcHRvci4KLS8vIFRoZSBpbmZvcm1hdGlvbiBpcyBpbiB1c2VyLXJlYWRhYmxlIHRleHQgZm9ybWF0LiBUaGUgfGZkfCBtdXN0IGJlIHZhbGlkLgotdm9pZCBhbGFybV9kZWJ1Z19kdW1wKGludCBmZCk7CmRpZmYgLS1naXQgYS9vc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCBiL29zaS9pbmNsdWRlL2FsbG9jYXRpb25fdHJhY2tlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE5NjkzLi4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL2FsbG9jYXRpb25fdHJhY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX3QgYWxsb2NhdGlvbl90cmFja2VyX3Q7Ci10eXBlZGVmIHVpbnQ4X3QgYWxsb2NhdG9yX2lkX3Q7Ci0KLS8vIEluaXRpYWxpemUgdGhlIGFsbG9jYXRpb24gdHJhY2tlci4gSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sCi0vLyB0aGUgYWxsb2NhdGlvbiB0cmFja2VyIGZ1bmN0aW9ucyBkbyBub3RoaW5nIGJ1dCBhcmUgc3RpbGwgc2FmZSB0byBjYWxsLgotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdCh2b2lkKTsKLQotLy8gUmVzZXQgdGhlIGFsbG9jYXRpb24gdHJhY2tlci4gRG9uJ3QgY2FsbCB0aGlzIGluIHRoZSBub3JtYWwgY291cnNlIG9mCi0vLyBvcGVyYXRpb25zLiBVc2VmdWwgbW9zdGx5IGZvciB0ZXN0aW5nLgotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzZXQodm9pZCk7Ci0KLS8vIEV4cGVjdHMgdGhhdCB0aGVyZSBhcmUgbm8gYWxsb2NhdGlvbnMgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsLiBEdW1wcwotLy8gaW5mb3JtYXRpb24gYWJvdXQgdW5mcmVlZCBhbGxvY2F0aW9ucyB0byB0aGUgbG9nLiBSZXR1cm5zIHRoZSBhbW91bnQgb2YKLS8vIHVuYWxsb2NhdGVkIG1lbW9yeS4KLXNpemVfdCBhbGxvY2F0aW9uX3RyYWNrZXJfZXhwZWN0X25vX2FsbG9jYXRpb25zKHZvaWQpOwotCi0vLyBOb3RpZnkgdGhlIHRyYWNrZXIgb2YgYSBuZXcgYWxsb2NhdGlvbiBiZWxvbmdpbmcgdG8gfGFsbG9jYXRvcl9pZHwuCi0vLyBJZiB8cHRyfCBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4gfHJlcXVlc3RlZF9zaXplfCBpcyB0aGUKLS8vIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBhbnkgY2FuYXJpZXMuIFRoZSBjYWxsZXIgbXVzdCBhbGxvY2F0ZQotLy8gZW5vdWdoIG1lbW9yeSBmb3IgY2FuYXJpZXM7IHRoZSB0b3RhbCBhbGxvY2F0aW9uIHNpemUgY2FuIGJlIGRldGVybWluZWQKLS8vIGJ5IGNhbGxpbmcgfGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeXwuIFJldHVybnMgfHB0cnwgb2Zmc2V0Ci0vLyB0byB0aGUgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jYW5hcmllZCByZWdpb24uCi12b2lkKiBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jYXRvcl9pZF90IGFsbG9jYXRvcl9pZCwgdm9pZCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVxdWVzdGVkX3NpemUpOwotCi0vLyBOb3RpZnkgdGhlIHRyYWNrZXIgb2YgYW4gYWxsb2NhdGlvbiB0aGF0IGlzIGJlaW5nIGZyZWVkLiB8cHRyfCBtdXN0IGJlIGEKLS8vIHBvaW50ZXIgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIHxhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jfCB3aXRoIHRoZQotLy8gc2FtZSB8YWxsb2NhdG9yX2lkfC4gSWYgfHB0cnwgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuIFJldHVybnMKLS8vIHxwdHJ8IG9mZnNldCB0byB0aGUgcmVhbCBiZWdpbm5pbmcgb2YgdGhlIGFsbG9jYXRpb24gaW5jbHVkaW5nIGFueSBjYW5hcnkKLS8vIHNwYWNlLgotdm9pZCogYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlKGFsbG9jYXRvcl9pZF90IGFsbG9jYXRvcl9pZCwgdm9pZCogcHRyKTsKLQotLy8gR2V0IHRoZSBmdWxsIHNpemUgZm9yIGFuIGFsbG9jYXRpb24sIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHNpemUgb2YKLS8vIGNhbmFyaWVzLgotc2l6ZV90IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9vc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCBiL29zaS9pbmNsdWRlL2FsbG9jYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdlNWVlLi4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL2FsbG9jYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi10eXBlZGVmIHZvaWQqICgqYWxsb2NfZm4pKHNpemVfdCBzaXplKTsKLXR5cGVkZWYgdm9pZCAoKmZyZWVfZm4pKHZvaWQqIHB0cik7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYWxsb2NfZm4gYWxsb2M7Ci0gIGZyZWVfZm4gZnJlZTsKLX0gYWxsb2NhdG9yX3Q7Ci0KLS8vIGFsbG9jYXRvcl90IGFic3RyYWN0aW9ucyBmb3IgdGhlIG9zaV8qYWxsb2MgYW5kIG9zaV9mcmVlIGZ1bmN0aW9ucwotZXh0ZXJuIGNvbnN0IGFsbG9jYXRvcl90IGFsbG9jYXRvcl9tYWxsb2M7Ci1leHRlcm4gY29uc3QgYWxsb2NhdG9yX3QgYWxsb2NhdG9yX2NhbGxvYzsKLQotY2hhciogb3NpX3N0cmR1cChjb25zdCBjaGFyKiBzdHIpOwotY2hhciogb3NpX3N0cm5kdXAoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuKTsKLQotdm9pZCogb3NpX21hbGxvYyhzaXplX3Qgc2l6ZSk7Ci12b2lkKiBvc2lfY2FsbG9jKHNpemVfdCBzaXplKTsKLXZvaWQgb3NpX2ZyZWUodm9pZCogcHRyKTsKLQotLy8gRnJlZSBhIGJ1ZmZlciB0aGF0IHdhcyBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIGZ1bmN0aW9uIHxvc2lfbWFsbG9jfAotLy8gb3IgfG9zaV9jYWxsb2N8IGFuZCByZXNldCB0aGUgcG9pbnRlciB0byB0aGF0IGJ1ZmZlciB0byBOVUxMLgotLy8gfHBfcHRyfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBwb2ludGVyIHRvIGJlIHJlc2V0LgotLy8gfHBfcHRyfCBjYW5ub3QgYmUgTlVMTC4KLXZvaWQgb3NpX2ZyZWVfYW5kX3Jlc2V0KHZvaWQqKiBwX3B0cik7Ci0KLS8vIER1bXAgYWxsb2NhdGlvbi1yZWxhdGVkIHN0YXRpc3RpY3MgYW5kIGRlYnVnIGluZm8gdG8gdGhlIHxmZHwgZmlsZQotLy8gZGVzY3JpcHRvci4KLS8vIFRoZSBpbmZvcm1hdGlvbiBpcyBpbiB1c2VyLXJlYWRhYmxlIHRleHQgZm9ybWF0LiBUaGUgfGZkfCBtdXN0IGJlIHZhbGlkLgotdm9pZCBvc2lfYWxsb2NhdG9yX2RlYnVnX2R1bXAoaW50IGZkKTsKLQotY2xhc3MgT3NpT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIE9zaU9iamVjdCh2b2lkKiBwdHIpOwotICBPc2lPYmplY3QoY29uc3Qgdm9pZCogcHRyKTsKLSAgfk9zaU9iamVjdCgpOwotICB2b2lkKiBSZWxlYXNlKCk7Ci0KLSBwcml2YXRlOgotICB2b2lkKiBwdHJfOwotfTsKZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL2FycmF5LmggYi9vc2kvaW5jbHVkZS9hcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ5NjgxLi4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL2FycmF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi10eXBlZGVmIHN0cnVjdCBhcnJheV90IGFycmF5X3Q7Ci0KLS8vIFJldHVybnMgYSBuZXcgYXJyYXkgb2JqZWN0IHRoYXQgc3RvcmVzIGVsZW1lbnRzIG9mIHNpemUgfGVsZW1lbnRfc2l6ZXwuIFRoZQotLy8gcmV0dXJuZWQgb2JqZWN0IG11c3QgYmUgZnJlZWQgd2l0aCB8YXJyYXlfZnJlZXwuIHxlbGVtZW50X3NpemV8IG11c3QgYmUKLS8vIGdyZWF0ZXIgdGhhbiAwLiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KLWFycmF5X3QqIGFycmF5X25ldyhzaXplX3QgZWxlbWVudF9zaXplKTsKLQotLy8gRnJlZXMgYW4gYXJyYXkgdGhhdCB3YXMgYWxsb2NhdGVkIHdpdGggfGFycmF5X25ld3wuIHxhcnJheXwgbWF5IGJlIE5VTEwuCi12b2lkIGFycmF5X2ZyZWUoYXJyYXlfdCogYXJyYXkpOwotCi0vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgc3RvcmVkIGVsZW1lbnQgaW4gfGFycmF5fC4gfGFycmF5fCBtdXN0IG5vdCBiZQotLy8gTlVMTC4KLXZvaWQqIGFycmF5X3B0cihjb25zdCBhcnJheV90KiBhcnJheSk7Ci0KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB8aW5kZXh8dGggZWxlbWVudCBvZiB8YXJyYXl8LiB8aW5kZXh8IG11c3QgYmUgbGVzcwotLy8gdGhhbiB0aGUgYXJyYXkncyBsZW5ndGguIHxhcnJheXwgbXVzdCBub3QgYmUgTlVMTC4KLXZvaWQqIGFycmF5X2F0KGNvbnN0IGFycmF5X3QqIGFycmF5LCBzaXplX3QgaW5kZXgpOwotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIGluIHxhcnJheXwuIHxhcnJheXwgbXVzdCBub3QgYmUgTlVMTC4KLXNpemVfdCBhcnJheV9sZW5ndGgoY29uc3QgYXJyYXlfdCogYXJyYXkpOwotCi0vLyBJbnNlcnRzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB8YXJyYXl8IGJ5IHZhbHVlLiBGb3IgZXhhbXBsZSwgYSBjYWxsZXIKLS8vIG1heSBzaW1wbHkgY2FsbCBhcnJheV9hcHBlbmRfdmFsdWUoYXJyYXksIDUpIGluc3RlYWQgb2Ygc3RvcmluZyA1IGludG8gYQotLy8gdmFyaWFibGUgYW5kIHRoZW4gaW5zZXJ0aW5nIGJ5IHBvaW50ZXIuIEFsdGhvdWdoIHx2YWx1ZXwgaXMgYSB1aW50MzJfdCwKLS8vIG9ubHkgdGhlIGxvd2VzdCB8ZWxlbWVudF9zaXplfCBieXRlcyB3aWxsIGJlIHN0b3JlZC4gfGFycmF5fCBtdXN0IG5vdCBiZQotLy8gTlVMTC4gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGNvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGFycmF5LCBmYWxzZQotLy8gb24gZXJyb3IuCi1ib29sIGFycmF5X2FwcGVuZF92YWx1ZShhcnJheV90KiBhcnJheSwgdWludDMyX3QgdmFsdWUpOwotCi0vLyBJbnNlcnRzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB8YXJyYXl8LiBUaGUgdmFsdWUgcG9pbnRlZCB0byBieSB8ZGF0YXwgbXVzdAotLy8gYmUgYXQgbGVhc3QgfGVsZW1lbnRfc2l6ZXwgYnl0ZXMgbG9uZyBhbmQgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgYXJyYXkuCi0vLyBOZWl0aGVyIHxhcnJheXwgbm9yIHxkYXRhfCBtYXkgYmUgTlVMTC4gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IGNvdWxkIGJlCi0vLyBpbnNlcnRlZCBpbnRvIHRoZSBhcnJheSwgZmFsc2Ugb24gZXJyb3IuCi1ib29sIGFycmF5X2FwcGVuZF9wdHIoYXJyYXlfdCogYXJyYXksIHZvaWQqIGRhdGEpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvYnVmZmVyLmggYi9vc2kvaW5jbHVkZS9idWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiM2I1Ny4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlcl90IGJ1ZmZlcl90OwotCi0vLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiB8c2l6ZXwgYnl0ZXMuIFJldHVybnMgTlVMTCBpZiBhIGJ1ZmZlciBjb3VsZCBub3QgYmUKLS8vIGFsbG9jYXRlZC4gfHNpemV8IG11c3QgYmUgbm9uLXplcm8uIFRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoaXMgYnVmZmVyIHdpdGgKLS8vIHxidWZmZXJfZnJlZXwuCi1idWZmZXJfdCogYnVmZmVyX25ldyhzaXplX3Qgc2l6ZSk7Ci0KLS8vIENyZWF0ZXMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgfGJ1ZnwuIEEgcmVmZXJlbmNlIGlzIGluZGlzdGluZ3Vpc2hhYmxlCi0vLyBmcm9tIHRoZSBvcmlnaW5hbDogd3JpdGVzIHRvIHRoZSBvcmlnaW5hbCB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgcmVmZXJlbmNlCi0vLyBhbmQgdmljZSB2ZXJzYS4gSW4gb3RoZXIgd29yZHMsIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBhbGlhcyB0byB8YnVmfC4gVGhlCi0vLyBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZXR1cm5lZCBidWZmZXIgd2l0aCB8YnVmZmVyX2ZyZWV8LiBOb3RlIHRoYXQKLS8vIHJlbGVhc2luZyB0aGUgcmV0dXJuZWQgYnVmZmVyIGRvZXMgbm90IHJlbGVhc2UgfGJ1ZnwuIHxidWZ8IG11c3Qgbm90IGJlIE5VTEwuCi1idWZmZXJfdCogYnVmZmVyX25ld19yZWYoY29uc3QgYnVmZmVyX3QqIGJ1Zik7Ci0KLS8vIENyZWF0ZXMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IHxzbGljZV9zaXplfCBieXRlcyBvZiB8YnVmfC4gU2VlCi0vLyB8YnVmZmVyX25ld19yZWZ8IGZvciBhIGRlc2NyaXB0aW9uIG9mIHJlZmVyZW5jZXMuIHxzbGljZV9zaXplfCBtdXN0IGJlCi0vLyBncmVhdGVyIHRoYW4gMCBhbmQgbWF5IGJlIGF0IG1vc3QgfGJ1ZmZlcl9sZW5ndGh8Ci0vLyAoMCA8IHNsaWNlX3NpemUgPD0gYnVmZmVyX2xlbmd0aCkuIHxidWZ8IG11c3Qgbm90IGJlIE5VTEwuCi1idWZmZXJfdCogYnVmZmVyX25ld19zbGljZShjb25zdCBidWZmZXJfdCogYnVmLCBzaXplX3Qgc2xpY2Vfc2l6ZSk7Ci0KLS8vIEZyZWVzIGEgYnVmZmVyIG9iamVjdC4gfGJ1ZnwgbWF5IGJlIE5VTEwuCi12b2lkIGJ1ZmZlcl9mcmVlKGJ1ZmZlcl90KiBidWYpOwotCi0vLyBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHdyaXRlYWJsZSBtZW1vcnkgcmVnaW9uIGZvciB8YnVmfC4gQWxsIHJlZmVyZW5jZXMKLS8vIGFuZCBzbGljZXMgdGhhdCBzaGFyZSBvdmVybGFwcGluZyBieXRlcyB3aWxsIGFsc28gYmUgd3JpdHRlbiB0byB3aGVuCi0vLyB3cml0aW5nIHRvIHRoZSByZXR1cm5lZCBwb2ludGVyLiBUaGUgY2FsbGVyIG1heSBzYWZlbHkgd3JpdGUgdXAgdG8KLS8vIHxidWZmZXJfbGVuZ3RofCBjb25zZWN1dGl2ZSBieXRlcyBzdGFydGluZyBhdCB0aGUgYWRkcmVzcyByZXR1cm5lZCBieQotLy8gdGhpcyBmdW5jdGlvbi4gfGJ1ZnwgbXVzdCBub3QgYmUgTlVMTC4KLXZvaWQqIGJ1ZmZlcl9wdHIoY29uc3QgYnVmZmVyX3QqIGJ1Zik7Ci0KLS8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgd3JpdGVhYmxlIG1lbW9yeSByZWdpb24gcmVmZXJyZWQgdG8gYnkgfGJ1ZnwuCi0vLyB8YnVmfCBtdXN0IG5vdCBiZSBOVUxMLgotc2l6ZV90IGJ1ZmZlcl9sZW5ndGgoY29uc3QgYnVmZmVyX3QqIGJ1Zik7CmRpZmYgLS1naXQgYS9vc2kvaW5jbHVkZS9jb21wYXQuaCBiL29zaS9pbmNsdWRlL2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDE5YTU5Li4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBfX0dMSUJDX18KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBHZXQgdGhyZWFkIGlkZW50aWZpY2F0aW9uLiAqLwotcGlkX3QgZ2V0dGlkKHZvaWQpIHRocm93KCk7Ci0KLS8qIENvcHkgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXouICovCi1zaXplX3Qgc3RybGNweShjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNpeik7Ci0KLS8qIEFwcGVuZHMgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXouICovCi1zaXplX3Qgc3RybGNhdChjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNpeik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvY29uZmlnLmggYi9vc2kvaW5jbHVkZS9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0MzE0ZC4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotLy8gVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIGNvbmZpZ3VyYXRpb24gcGFyc2VyLiBDbGllbnRzIGNhbiBxdWVyeSB0aGUKLS8vIGNvbnRlbnRzIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlIHRocm91Z2ggdGhlIGludGVyZmFjZSBwcm92aWRlZCBoZXJlLgotLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgcmVhZC1vbmx5OyBtdXRhdGlvbnMgYXJlIG9ubHkga2VwdCBpbgotLy8gbWVtb3J5LiBUaGlzIHBhcnNlciBzdXBwb3J0cyB0aGUgSU5JIGZpbGUgZm9ybWF0LgotCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKLS8vIC0gS2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIG5vdCB3aXRoaW4gYSBzZWN0aW9uIGFyZSBhc3N1bWVkIHRvIGJlIHVuZGVyCi0vLyAgIHRoZSB8Q09ORklHX0RFRkFVTFRfU0VDVElPTnwgc2VjdGlvbi4KLS8vIC0gTXVsdGlwbGUgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHdpbGwgYmUgbWVyZ2VkIGFzIGlmIHRoZXkgd2VyZSBpbgotLy8gICBhIHNpbmdsZSBzZWN0aW9uLgotLy8gLSBFbXB0eSBzZWN0aW9ucyB3aXRoIG5vIGtleS92YWx1ZSBwYWlycyB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgdGhleSBkbwotLy8gICBub3QgZXhpc3QuIEluIG90aGVyIHdvcmRzLCB8Y29uZmlnX2hhc19zZWN0aW9ufCB3aWxsIHJldHVybiBmYWxzZSBmb3IKLS8vICAgZW1wdHkgc2VjdGlvbnMuCi0vLyAtIER1cGxpY2F0ZSBrZXlzIGluIGEgc2VjdGlvbiB3aWxsIG92ZXJ3cml0ZSBwcmV2aW91cyB2YWx1ZXMuCi0vLyAtIEFsbCBzdHJpbmdzIGFyZSBjYXNlIHNlbnNpdGl2ZS4KLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8vIFRoZSBkZWZhdWx0IHNlY3Rpb24gbmFtZSB0byB1c2UgaWYgYSBrZXkvdmFsdWUgcGFpciBpcyBub3QgZGVmaW5lZCB3aXRoaW4KLS8vIGEgc2VjdGlvbi4KLSNkZWZpbmUgQ09ORklHX0RFRkFVTFRfU0VDVElPTiAiR2xvYmFsIgotCi1zdHJ1Y3QgZW50cnlfdCB7Ci0gIHN0ZDo6c3RyaW5nIGtleTsKLSAgc3RkOjpzdHJpbmcgdmFsdWU7Ci19OwotCi1zdHJ1Y3Qgc2VjdGlvbl90IHsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgc3RkOjpsaXN0PGVudHJ5X3Q+IGVudHJpZXM7Ci0gIHZvaWQgU2V0KHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpOwotICBzdGQ6Omxpc3Q8ZW50cnlfdD46Oml0ZXJhdG9yIEZpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0gIGJvb2wgSGFzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOwotfTsKLQotc3RydWN0IGNvbmZpZ190IHsKLSAgc3RkOjpsaXN0PHNlY3Rpb25fdD4gc2VjdGlvbnM7Ci0gIHN0ZDo6bGlzdDxzZWN0aW9uX3Q+OjppdGVyYXRvciBGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKTsKLSAgYm9vbCBIYXMoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pOwotfTsKLQotLy8gQ3JlYXRlcyBhIG5ldyBjb25maWcgb2JqZWN0IHdpdGggbm8gZW50cmllcyAoaS5lLiBub3QgYmFja2VkIGJ5IGEgZmlsZSkuCi0vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciB0byBjb25maWcgb2JqZWN0Lgotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3X2VtcHR5KHZvaWQpOwotCi0vLyBMb2FkcyB0aGUgc3BlY2lmaWVkIGZpbGUgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGNvbmZpZyBmaWxlLiBJZiB0aGVyZQotLy8gd2FzIGEgcHJvYmxlbSBsb2FkaW5nIHRoZSBmaWxlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLS8vIE5VTEwuIHxmaWxlbmFtZXwgbXVzdCBub3QgYmUgTlVMTCBhbmQgbXVzdCBwb2ludCB0byBhIHJlYWRhYmxlCi0vLyBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLgotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3KGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotLy8gUmVhZCB0aGUgY2hlY2tzdW0gZnJvbSB0aGUgfGZpbGVuYW1lfAotc3RkOjpzdHJpbmcgY2hlY2tzdW1fcmVhZChjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ci0KLS8vIENsb25lcyB8c3JjfCwgaW5jbHVkaW5nIGFsbCBvZiBpdCdzIHNlY3Rpb25zLCBrZXlzLCBhbmQgdmFsdWVzLgotLy8gUmV0dXJucyBhIG5ldyBjb25maWcgd2hpY2ggaXMgYSBjb3B5IGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWw7Ci0vLyBjaGFuZ2VzIHRvIHRoZSBuZXcgY29uZmlnIGFyZSBub3QgcmVmbGVjdGVkIGluIGFueSB3YXkgaW4gdGhlIG9yaWdpbmFsLgotLy8KLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcmV0dXJuIE5VTEwuCi1zdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZ19uZXdfY2xvbmUoY29uc3QgY29uZmlnX3QmIHNyYyk7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZmlnIGZpbGUgY29udGFpbnMgYSBzZWN0aW9uIG5hbWVkIHxzZWN0aW9ufC4gSWYKLS8vIHRoZSBzZWN0aW9uIGhhcyBubyBrZXkvdmFsdWUgcGFpcnMgaW4gaXQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UuCi1ib29sIGNvbmZpZ19oYXNfc2VjdGlvbihjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbik7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29uZmlnIGZpbGUgaGFzIGEga2V5IG5hbWVkIHxrZXl8IHVuZGVyIHxzZWN0aW9ufC4KLS8vIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgotYm9vbCBjb25maWdfaGFzX2tleShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0KLS8vIFJldHVybnMgdGhlIGludGVncmFsIHZhbHVlIGZvciBhIGdpdmVuIHxrZXl8IGluIHxzZWN0aW9ufC4gSWYgfHNlY3Rpb258Ci0vLyBvciB8a2V5fCBkbyBub3QgZXhpc3QsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZnVsbHkgY29udmVydGVkIHRvIGFuIGludGVnZXIsCi0vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgfGRlZl92YWx1ZXwuCi1pbnQgY29uZmlnX2dldF9pbnQoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IGRlZl92YWx1ZSk7Ci0KLS8vIFJldHVybnMgdGhlIHVpbnQ2NF90IHZhbHVlIGZvciBhIGdpdmVuIHxrZXl8IGluIHxzZWN0aW9ufC4gSWYgfHNlY3Rpb258Ci0vLyBvciB8a2V5fCBkbyBub3QgZXhpc3QsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZnVsbHkgY29udmVydGVkIHRvIGFuIGludGVnZXIsCi0vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgfGRlZl92YWx1ZXwuCi11aW50NjRfdCBjb25maWdfZ2V0X3VpbnQ2NChjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHVpbnQ2NF90IGRlZl92YWx1ZSk7Ci0KLS8vIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgZm9yIGEgZ2l2ZW4gfGtleXwgaW4gfHNlY3Rpb258LiBJZiB8c2VjdGlvbnwKLS8vIG9yIHxrZXl8IGRvIG5vdCBleGlzdCwgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLCB0aGlzCi0vLyBmdW5jdGlvbiByZXR1cm5zIHxkZWZfdmFsdWV8LgotYm9vbCBjb25maWdfZ2V0X2Jvb2woY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBib29sIGRlZl92YWx1ZSk7Ci0KLS8vIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgYSBnaXZlbiB8a2V5fCBpbiB8c2VjdGlvbnwuIElmIHxzZWN0aW9ufCBvcgotLy8gfGtleXwgZG8gbm90IGV4aXN0LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgfGRlZl92YWx1ZXwuIFRoZSByZXR1cm5lZCBzdHJpbmcKLS8vIGlzIG93bmVkIGJ5IHRoZSBjb25maWcgbW9kdWxlIGFuZCBtdXN0IG5vdCBiZSBmcmVlZCBvciBtb2RpZmllZC4gfGRlZl92YWx1ZXwKLS8vIG1heSBiZSBOVUxMLgotY29uc3Qgc3RkOjpzdHJpbmcqIGNvbmZpZ19nZXRfc3RyaW5nKGNvbnN0IGNvbmZpZ190JiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyogZGVmX3ZhbHVlKTsKLQotLy8gU2V0cyBhbiBpbnRlZ3JhbCB2YWx1ZSBmb3IgdGhlIHxrZXl8IGluIHxzZWN0aW9ufC4gSWYgfGtleXwgb3IgfHNlY3Rpb258IGRvCi0vLyBub3QgYWxyZWFkeSBleGlzdCwgdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZW0uIHxjb25maWd8IG11c3Qgbm90IGJlIE5VTEwuCi12b2lkIGNvbmZpZ19zZXRfaW50KGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpOwotCi0vLyBTZXRzIGEgdWludDY0X3QgdmFsdWUgZm9yIHRoZSB8a2V5fCBpbiB8c2VjdGlvbnwuIElmIHxrZXl8IG9yIHxzZWN0aW9ufCBkbwotLy8gbm90IGFscmVhZHkgZXhpc3QsIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGVtLiB8Y29uZmlnfCBtdXN0IG5vdCBiZSBOVUxMLgotdm9pZCBjb25maWdfc2V0X3VpbnQ2NChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgdmFsdWUpOwotCi0vLyBTZXRzIGEgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIHxrZXl8IGluIHxzZWN0aW9ufC4gSWYgfGtleXwgb3IgfHNlY3Rpb258IGRvCi0vLyBub3QgYWxyZWFkeSBleGlzdCwgdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZW0uIHxjb25maWd8IG11c3Qgbm90IGJlIE5VTEwuCi12b2lkIGNvbmZpZ19zZXRfYm9vbChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgdmFsdWUpOwotCi0vLyBTZXRzIGEgc3RyaW5nIHZhbHVlIGZvciB0aGUgfGtleXwgaW4gfHNlY3Rpb258LiBJZiB8a2V5fCBvciB8c2VjdGlvbnwgZG8KLS8vIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlbS4gfGNvbmZpZ3wgbXVzdCBub3QgYmUgTlVMTC4KLXZvaWQgY29uZmlnX3NldF9zdHJpbmcoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0KLS8vIFJlbW92ZXMgfHNlY3Rpb258IGZyb20gdGhlIHxjb25maWd8IChhbmQsIGFzIGEgcmVzdWx0LCBhbGwga2V5cyBpbiB0aGUKLS8vIHNlY3Rpb24pLgotLy8gUmV0dXJucyB0cnVlIGlmIHxzZWN0aW9ufCB3YXMgZm91bmQgYW5kIHJlbW92ZWQgZnJvbSB8Y29uZmlnfCwgZmFsc2UKLS8vIG90aGVyd2lzZS4KLS8vIHxjb25maWd8IG1heSBiZSBOVUxMLgotYm9vbCBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pOwotCi0vLyBSZW1vdmVzIG9uZSBzcGVjaWZpYyB8a2V5fCByZXNpZGluZyBpbiB8c2VjdGlvbnwgb2YgdGhlIHxjb25maWd8LiBSZXR1cm5zCi0vLyB0cnVlCi0vLyBpZiB0aGUgc2VjdGlvbiBhbmQga2V5IHdlcmUgZm91bmQgYW5kIHRoZSBrZXkgd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS4KLS8vIHxjb25maWd8bWF5IG5vdCBiZSBOVUxMLgotYm9vbCBjb25maWdfcmVtb3ZlX2tleShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7Ci0KLS8vIFNhdmVzIHxjb25maWd8IHRvIGEgZmlsZSBnaXZlbiBieSB8ZmlsZW5hbWV8LiBOb3RlIHRoYXQgdGhpcyBjb3VsZCBiZSBhCi0vLyBkZXN0cnVjdGl2ZSBvcGVyYXRpb246IGlmIHxmaWxlbmFtZXwgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCi0vLyBUaGUgY29uZmlnIG1vZHVsZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjb21tZW50cyBvciBmb3JtYXR0aW5nIHNvIGlmIGEgY29uZmlnCi0vLyBmaWxlIHdhcyBvcGVuZWQgd2l0aCB8Y29uZmlnX25ld3wgYW5kIHN1YnNlcXVlbnRseSBvdmVyd3JpdHRlbiB3aXRoCi0vLyB8Y29uZmlnX3NhdmV8LCBhbGwgY29tbWVudHMgYW5kIHNwZWNpYWwgZm9ybWF0dGluZyBpbiB0aGUgb3JpZ2luYWwgZmlsZSB3aWxsCi0vLyBiZSBsb3N0LiBOZWl0aGVyIHxjb25maWd8IG5vciB8ZmlsZW5hbWV8IG1heSBiZSBOVUxMLgotYm9vbCBjb25maWdfc2F2ZShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOwotCi0vLyBTYXZlcyB0aGUgZW5jcnlwdGVkIHxjaGVja3N1bXwgb2YgY29uZmlnIGZpbGUgdG8gYSBnaXZlbiB8ZmlsZW5hbWV8IE5vdGUKLS8vIHRoYXQgdGhpcyBjb3VsZCBiZSBhIGRlc3RydWN0aXZlIG9wZXJhdGlvbjogaWYgfGZpbGVuYW1lfCBhbHJlYWR5IGV4aXN0cywKLS8vIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCi1ib29sIGNoZWNrc3VtX3NhdmUoY29uc3Qgc3RkOjpzdHJpbmcmIGNoZWNrc3VtLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCBiL29zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYmM1YmUuLjAwMDAwMDAKLS0tIGEvb3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbGlzdC5oIgotCi1zdHJ1Y3QgZml4ZWRfcXVldWVfdDsKLXR5cGVkZWYgc3RydWN0IGZpeGVkX3F1ZXVlX3QgZml4ZWRfcXVldWVfdDsKLXR5cGVkZWYgc3RydWN0IHJlYWN0b3JfdCByZWFjdG9yX3Q7Ci0KLXR5cGVkZWYgdm9pZCAoKmZpeGVkX3F1ZXVlX2ZyZWVfY2IpKHZvaWQqIGRhdGEpOwotdHlwZWRlZiB2b2lkICgqZml4ZWRfcXVldWVfY2IpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCB2b2lkKiBjb250ZXh0KTsKLQotLy8gQ3JlYXRlcyBhIG5ldyBmaXhlZCBxdWV1ZSB3aXRoIHRoZSBnaXZlbiB8Y2FwYWNpdHl8LiBJZiBtb3JlIGVsZW1lbnRzIHRoYW4KLS8vIHxjYXBhY2l0eXwgYXJlIGFkZGVkIHRvIHRoZSBxdWV1ZSwgdGhlIGNhbGxlciBpcyBibG9ja2VkIHVudGlsIHNwYWNlIGlzCi0vLyBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgcXVldWUuIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiBUaGUgY2FsbGVyIG11c3QgZnJlZQotLy8gdGhlIHJldHVybmVkIHF1ZXVlIHdpdGggfGZpeGVkX3F1ZXVlX2ZyZWV8LgotZml4ZWRfcXVldWVfdCogZml4ZWRfcXVldWVfbmV3KHNpemVfdCBjYXBhY2l0eSk7Ci0KLS8vIEZyZWVzIGEgcXVldWUgYW5kIChvcHRpb25hbGx5KSB0aGUgZW5xdWV1ZWQgZWxlbWVudHMuCi0vLyB8cXVldWV8IGlzIHRoZSBxdWV1ZSB0byBmcmVlLiBJZiB0aGUgfGZyZWVfY2J8IGNhbGxiYWNrIGlzIG5vdCBudWxsLAotLy8gaXQgaXMgY2FsbGVkIG9uIGVhY2ggcXVldWUgZWxlbWVudCB0byBmcmVlIGl0LgotLy8gRnJlZWluZyBhIHF1ZXVlIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZSAoaS5lLiBoYXMgd2FpdGVycwotLy8gYmxvY2tlZCBvbiBpdCkgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLgotdm9pZCBmaXhlZF9xdWV1ZV9mcmVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBmaXhlZF9xdWV1ZV9mcmVlX2NiIGZyZWVfY2IpOwotCi0vLyBGbHVzaGVzIGEgcXVldWUgYW5kIChvcHRpb25hbGx5KSBmcmVlcyB0aGUgZW5xdWV1ZWQgZWxlbWVudHMuCi0vLyB8cXVldWV8IGlzIHRoZSBxdWV1ZSB0byBmbHVzaC4gSWYgdGhlIHxmcmVlX2NifCBjYWxsYmFjayBpcyBub3QgbnVsbCwKLS8vIGl0IGlzIGNhbGxlZCBvbiBlYWNoIHF1ZXVlIGVsZW1lbnQgdG8gZnJlZSBpdC4KLXZvaWQgZml4ZWRfcXVldWVfZmx1c2goZml4ZWRfcXVldWVfdCogcXVldWUsIGZpeGVkX3F1ZXVlX2ZyZWVfY2IgZnJlZV9jYik7Ci0KLS8vIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIHxxdWV1ZXwgaXMgZW1wdHkuIElmIHxxdWV1ZXwKLS8vIGlzIE5VTEwsIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZS4KLWJvb2wgZml4ZWRfcXVldWVfaXNfZW1wdHkoZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHxxdWV1ZXwuIElmIHxxdWV1ZXwgaXMgTlVMTCwgdGhlIHJldHVybiB2YWx1ZQotLy8gaXMgMC4KLXNpemVfdCBmaXhlZF9xdWV1ZV9sZW5ndGgoZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGlzIHF1ZXVlIG1heSBob2xkLiB8cXVldWV8IG1heQotLy8gbm90IGJlIE5VTEwuCi1zaXplX3QgZml4ZWRfcXVldWVfY2FwYWNpdHkoZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBFbnF1ZXVlcyB0aGUgZ2l2ZW4gfGRhdGF8IGludG8gdGhlIHxxdWV1ZXwuIFRoZSBjYWxsZXIgd2lsbCBiZSBibG9ja2VkCi0vLyBpZiBubyBtb3JlIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcXVldWUuIE5laXRoZXIgfHF1ZXVlfCBub3IgfGRhdGF8Ci0vLyBtYXkgYmUgTlVMTC4KLXZvaWQgZml4ZWRfcXVldWVfZW5xdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSk7Ci0KLS8vIERlcXVldWVzIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB8cXVldWV8LiBJZiB0aGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LAotLy8gdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHRoZSBjYWxsZXIgdW50aWwgYW4gaXRlbSBpcyBlbnF1ZXVlZC4gVGhpcwotLy8gZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gTlVMTC4gfHF1ZXVlfCBtYXkgbm90IGJlIE5VTEwuCi12b2lkKiBmaXhlZF9xdWV1ZV9kZXF1ZXVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKTsKLQotLy8gVHJpZXMgdG8gZW5xdWV1ZSB8ZGF0YXwgaW50byB0aGUgfHF1ZXVlfC4gVGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIGJsb2NrCi0vLyB0aGUgY2FsbGVyLiBJZiB0aGUgcXVldWUgY2FwYWNpdHkgd291bGQgYmUgZXhjZWVkZWQgYnkgYWRkaW5nIG9uZSBtb3JlCi0vLyBlbGVtZW50LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbgotLy8gcmV0dXJucyB0cnVlLiBOZWl0aGVyIHxxdWV1ZXwgbm9yIHxkYXRhfCBtYXkgYmUgTlVMTC4KLWJvb2wgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpOwotCi0vLyBUcmllcyB0byBkZXF1ZXVlIGFuIGVsZW1lbnQgZnJvbSB8cXVldWV8LiBUaGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmxvY2sKLS8vIHRoZSBjYWxsZXIuIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTAotLy8gaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgcXVldWUgaXMgcmV0dXJuZWQuCi12b2lkKiBmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSk7Ci0KLS8vIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB8cXVldWV8LCBpZiBwcmVzZW50LCB3aXRob3V0IGRlcXVldWluZyBpdC4KLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciBibG9jayB0aGUgY2FsbGVyLiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vCi0vLyBlbGVtZW50cyBpbiB0aGUgcXVldWUgb3IgfHF1ZXVlfCBpcyBOVUxMLgotdm9pZCogZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QoZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB8cXVldWV8LCBpZiBwcmVzZW50LCB3aXRob3V0IGRlcXVldWluZyBpdC4KLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciBibG9jayB0aGUgY2FsbGVyLiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vCi0vLyBlbGVtZW50cyBpbiB0aGUgcXVldWUgb3IgfHF1ZXVlfCBpcyBOVUxMLgotdm9pZCogZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChmaXhlZF9xdWV1ZV90KiBxdWV1ZSk7Ci0KLS8vIFRyaWVzIHRvIHJlbW92ZSBhIHxkYXRhfCBlbGVtZW50IGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgfHF1ZXVlfC4gVGhpcwotLy8gZnVuY3Rpb24gd2lsbCBuZXZlciBibG9jayB0aGUgY2FsbGVyLiBJZiB0aGUgcXVldWUgaXMgZW1wdHkgb3IgTlVMTCwgdGhpcwotLy8gZnVuY3Rpb24gcmV0dXJucyBOVUxMIGltbWVkaWF0ZWx5LiB8ZGF0YXwgbWF5IG5vdCBiZSBOVUxMLiBJZiB0aGUgfGRhdGF8Ci0vLyBlbGVtZW50IGlzIGZvdW5kIGluIHRoZSBxdWV1ZSwgYSBwb2ludGVyIHRvIHRoZSByZW1vdmVkIGRhdGEgaXMgcmV0dXJuZWQsCi0vLyBvdGhlcndpc2UgTlVMTC4KLXZvaWQqIGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSk7Ci0KLS8vIFJldHVybnMgdGhlIGl0ZXJhdGVhYmxlIGxpc3Qgd2l0aCBhbGwgZW50cmllcyBpbiB0aGUgfHF1ZXVlfC4gVGhpcyBmdW5jdGlvbgotLy8gd2lsbCBuZXZlciBibG9jayB0aGUgY2FsbGVyLiB8cXVldWV8IG1heSBub3QgYmUgTlVMTC4KLS8vCi0vLyBOT1RFOiBUaGUgcmV0dXJuIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZTogdGhlIGxpc3QgY291bGQKLS8vIGJlIG1vZGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkLCBhbmQgdGhlIHJlc3VsdCB3b3VsZCBiZSB1bnByZWRpY3RhYmxlLgotLy8gVE9ETzogVGhlIHVzYWdlIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZmFjdG9yZWQsIGFuZCB0aGUgZnVuY3Rpb24KLS8vIGl0c2VsZiBzaG91bGQgYmUgcmVtb3ZlZC4KLWxpc3RfdCogZml4ZWRfcXVldWVfZ2V0X2xpc3QoZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuIENhbGxlcnMgbWF5IHBlcmZvcm0gb25lCi0vLyBvcGVyYXRpb24gb24gdGhlIGZkOiBzZWxlY3QoMikuIElmIHxzZWxlY3R8IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlCi0vLyBkZXNjcmlwdG9yIGlzIHJlYWRhYmxlLCB0aGUgY2FsbGVyIG1heSBjYWxsIHxmaXhlZF9xdWV1ZV9lbnF1ZXVlfCB3aXRob3V0Ci0vLyBibG9ja2luZy4gVGhlIGNhbGxlciBtdXN0IG5vdCBjbG9zZSB0aGUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9yLiB8cXVldWV8Ci0vLyBtYXkgbm90IGJlIE5VTEwuCi1pbnQgZml4ZWRfcXVldWVfZ2V0X2VucXVldWVfZmQoY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuIENhbGxlcnMgbWF5IHBlcmZvcm0gb25lCi0vLyBvcGVyYXRpb24gb24gdGhlIGZkOiBzZWxlY3QoMikuIElmIHxzZWxlY3R8IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlCi0vLyBkZXNjcmlwdG9yIGlzIHJlYWRhYmxlLCB0aGUgY2FsbGVyIG1heSBjYWxsIHxmaXhlZF9xdWV1ZV9kZXF1ZXVlfCB3aXRob3V0Ci0vLyBibG9ja2luZy4gVGhlIGNhbGxlciBtdXN0IG5vdCBjbG9zZSB0aGUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9yLiB8cXVldWV8Ci0vLyBtYXkgbm90IGJlIE5VTEwuCi1pbnQgZml4ZWRfcXVldWVfZ2V0X2RlcXVldWVfZmQoY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUpOwotCi0vLyBSZWdpc3RlcnMgfHF1ZXVlfCB3aXRoIHxyZWFjdG9yfCBmb3IgZGVxdWV1ZSBvcGVyYXRpb25zLiBXaGVuIHRoZXJlIGlzIGFuCi0vLyBlbGVtZW50IGluIHRoZSBxdWV1ZSwgcmVhZHlfY2Igd2lsbCBiZSBjYWxsZWQuIFRoZSB8Y29udGV4dHwgcGFyYW1ldGVyIGlzCi0vLyBwYXNzZWQsIHVudG91Y2hlZCwgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUuIE5laXRoZXIgfHF1ZXVlfCwgbm9yIHxyZWFjdG9yfCwKLS8vIG5vciB8cmVhZF9jYnwgbWF5IGJlIE5VTEwuIHxjb250ZXh0fCBtYXkgYmUgTlVMTC4KLXZvaWQgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgcmVhY3Rvcl90KiByZWFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3F1ZXVlX2NiIHJlYWR5X2NiLCB2b2lkKiBjb250ZXh0KTsKLQotLy8gVW5yZWdpc3RlcnMgdGhlIGRlcXVldWUgcmVhZHkgY2FsbGJhY2sgZm9yIHxxdWV1ZXwgZnJvbSB3aGljaGV2ZXIgcmVhY3RvcgotLy8gaXQgaXMgcmVnaXN0ZXJlZCB3aXRoLCBpZiBhbnkuIFRoaXMgZnVuY3Rpb24gaXMgaWRlbXBvdGVudC4KLXZvaWQgZml4ZWRfcXVldWVfdW5yZWdpc3Rlcl9kZXF1ZXVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKTsKZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL2Z1dHVyZS5oIGIvb3NpL2luY2x1ZGUvZnV0dXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzQzZTYuLjAwMDAwMDAKLS0tIGEvb3NpL2luY2x1ZGUvZnV0dXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi10eXBlZGVmIHN0cnVjdCBmdXR1cmVfdCBmdXR1cmVfdDsKLQotI2RlZmluZSBGVVRVUkVfU1VDQ0VTUyAoKHZvaWQqKTEpCi0jZGVmaW5lIEZVVFVSRV9GQUlMICgodm9pZCopMCkKLQotLy8gQ29uc3RydWN0cyBhIG5ldyBmdXR1cmVfdCBvYmplY3QuIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgotZnV0dXJlX3QqIGZ1dHVyZV9uZXcodm9pZCk7Ci0KLS8vIENvbnN0cnVjdHMgYSBuZXcgZnV0dXJlX3Qgb2JqZWN0IHdpdGggYW4gaW1tZWRpYXRlIHx2YWx1ZXwuIE5vIHdhaXRpbmcgd2lsbAotLy8gb2NjdXIgaW4gdGhlIGNhbGwgdG8gfGZ1dHVyZV9hd2FpdHwgYmVjYXVzZSB0aGUgdmFsdWUgaXMgYWxyZWFkeSBwcmVzZW50LgotLy8gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCi1mdXR1cmVfdCogZnV0dXJlX25ld19pbW1lZGlhdGUodm9pZCogdmFsdWUpOwotCi0vLyBTaWduYWxzIHRoYXQgdGhlIHxmdXR1cmV8IGlzIHJlYWR5LCBwYXNzaW5nIHx2YWx1ZXwgYmFjayB0byB0aGUgY29udGV4dAotLy8gd2FpdGluZyBmb3IgdGhlIHJlc3VsdC4gTXVzdCBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBldmVyeSBmdXR1cmUuCi0vLyB8ZnV0dXJlfCBtYXkgbm90IGJlIE5VTEwuCi12b2lkIGZ1dHVyZV9yZWFkeShmdXR1cmVfdCogZnV0dXJlLCB2b2lkKiB2YWx1ZSk7Ci0KLS8vIFdhaXRzIGZvciB0aGUgfGZ1dHVyZXwgdG8gYmUgcmVhZHkuIFJldHVybnMgdGhlIHZhbHVlIHNldCBpbiB8ZnV0dXJlX3JlYWR5fC4KLS8vIEZyZWVzIHRoZSBmdXR1cmUgYmVmb3JlIHJldHVybi4gfGZ1dHVyZXwgbWF5IG5vdCBiZSBOVUxMLgotdm9pZCogZnV0dXJlX2F3YWl0KGZ1dHVyZV90KiBhc3luY19yZXN1bHQpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvaGFzaF9tYXBfdXRpbHMuaCBiL29zaS9pbmNsdWRlL2hhc2hfbWFwX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NWQ2NzAuLjAwMDAwMDAKLS0tIGEvb3NpL2luY2x1ZGUvaGFzaF9tYXBfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotLy8gQ3JlYXRlcyBhIGhhc2ggbWFwIGJhc2VkIG9uIHRoZSB8cGFyYW1zfCBzdHJpbmcgY29udGFpbmluZyBrZXkgYW5kIHZhbHVlCi0vLyBwYWlycy4gIFBhaXJzIGFyZSBleHBlY3RlZCBpbiB0aGUgZm9ybSAia2V5PXZhbHVlIiBzZXBhcmF0ZWQgYnkgdGhlICc7JwotLy8gY2hhcmFjdGVyLiAgQm90aCAnOycgYW5kICc9JyBjaGFyYWN0ZXJzIGFyZSBpbnZhbGlkIGluIGtleXMgb3IgdmFsdWVzLgotLy8gfHBhcmFtc3wgY2Fubm90IGJlIE5VTEwsIGlzIG5vdCBtb2RpZmllZCBhbmQgaXMgb3duZWQgYnkgdGhlIGNhbGxlci4KLS8vIEV4YW1wbGVzOgotLy8gICAia2V5MD12YWx1ZTEwO2tleTE9dmFsdWUxOyIgLT4gbWFwOiBba2V5MF09InZhbHVlMCIgW2tleTFdPSJ2YWx1ZTEiCi0vLyAgICJrZXkwPTtrZXkxPXZhbHVlMTsiICAgICAgICAtPiBtYXA6IFtrZXkwXT0iIiBba2V5MV09InZhbHVlMSIKLS8vICAgIj12YWx1ZTA7a2V5MT12YWx1ZTE7IiAgICAgIC0+IG1hcDogW2tleTFdPSJ2YWx1ZTEiCi0vLyBBIG5ldyBoYXNoIG1hcCBvciBOVUxMIGlzIHJldHVybmVkIGFuZCBpcyBvd25lZCBieSB0aGUgY2FsbGVyLgotc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4KLWhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMoY29uc3QgY2hhciogcGFyYW1zKTsKZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL2xpc3QuaCBiL29zaS9pbmNsdWRlL2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3MzhmNS4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotc3RydWN0IGxpc3Rfbm9kZV90OwotdHlwZWRlZiBzdHJ1Y3QgbGlzdF9ub2RlX3QgbGlzdF9ub2RlX3Q7Ci0KLXN0cnVjdCBsaXN0X3Q7Ci10eXBlZGVmIHN0cnVjdCBsaXN0X3QgbGlzdF90OwotCi10eXBlZGVmIHZvaWQgKCpsaXN0X2ZyZWVfY2IpKHZvaWQqIGRhdGEpOwotCi0vLyBJdGVyYXRvciBjYWxsYmFjayBwcm90b3R5cGUgdXNlZCBmb3IgfGxpc3RfZm9yZWFjaHwuCi0vLyB8ZGF0YXwgcmVwcmVzZW50cyB0aGUgbGlzdCBpdGVtIGN1cnJlbnRseSBiZWluZyBpdGVyYXRlZCwgfGNvbnRleHR8IGlzIGEKLS8vIHVzZXIgZGVmaW5lZCB2YWx1ZSBwYXNzZWQgaW50byB8bGlzdF9mb3JlYWNofC4KLS8vIENhbGxiYWNrIG11c3QgcmV0dXJuIHRydWUgdG8gY29udGludWUgaXRlcmF0aW5nIG9yIGZhbHNlIHRvIHN0b3AgaXRlcmF0aW5nLgotdHlwZWRlZiBib29sICgqbGlzdF9pdGVyX2NiKSh2b2lkKiBkYXRhLCB2b2lkKiBjb250ZXh0KTsKLQotLy8gUmV0dXJucyBhIG5ldywgZW1wdHkgbGlzdC4gUmV0dXJucyBOVUxMIGlmIG5vdCBlbm91Z2ggbWVtb3J5IGNvdWxkIGJlCi0vLyBhbGxvY2F0ZWQgZm9yIHRoZSBsaXN0IHN0cnVjdHVyZS4gVGhlIHJldHVybmVkIGxpc3QgbXVzdCBiZSBmcmVlZCB3aXRoCi0vLyB8bGlzdF9mcmVlfC4gVGhlIHxjYWxsYmFja3wgc3BlY2lmaWVzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEKLS8vIGxpc3QgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuIEl0IGNhbiBiZSB1c2VkIHRvIHJlbGVhc2UgcmVzb3VyY2VzCi0vLyBoZWxkIGJ5IHRoZSBsaXN0IGVsZW1lbnQsIGUuZy4gbWVtb3J5IG9yIGZpbGUgZGVzY3JpcHRvci4gfGNhbGxiYWNrfCBtYXkKLS8vIGJlIE5VTEwgaWYgbm8gY2xlYW51cCBpcyBuZWNlc3Nhcnkgb24gZWxlbWVudCByZW1vdmFsLgotbGlzdF90KiBsaXN0X25ldyhsaXN0X2ZyZWVfY2IgY2FsbGJhY2spOwotCi0vLyBGcmVlcyB0aGUgbGlzdC4gVGhpcyBmdW5jdGlvbiBhY2NlcHRzIE5VTEwgYXMgYW4gYXJndW1lbnQsIGluIHdoaWNoIGNhc2UgaXQKLS8vIGJlaGF2ZXMgbGlrZSBhIG5vLW9wLgotdm9pZCBsaXN0X2ZyZWUobGlzdF90KiBsaXN0KTsKLQotLy8gUmV0dXJucyB0cnVlIGlmIHxsaXN0fCBpcyBlbXB0eSAoaGFzIG5vIGVsZW1lbnRzKSwgZmFsc2Ugb3RoZXJ3aXNlLgotLy8gfGxpc3R8IG1heSBub3QgYmUgTlVMTC4KLWJvb2wgbGlzdF9pc19lbXB0eShjb25zdCBsaXN0X3QqIGxpc3QpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxpc3QgY29udGFpbnMgfGRhdGF8LCBmYWxzZSBvdGhlcndpc2UuCi0vLyB8bGlzdHwgbWF5IG5vdCBiZSBOVUxMLgotYm9vbCBsaXN0X2NvbnRhaW5zKGNvbnN0IGxpc3RfdCogbGlzdCwgY29uc3Qgdm9pZCogZGF0YSk7Ci0KLS8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgfGxpc3R8LiB8bGlzdHwgbWF5IG5vdCBiZSBOVUxMLgotc2l6ZV90IGxpc3RfbGVuZ3RoKGNvbnN0IGxpc3RfdCogbGlzdCk7Ci0KLS8vIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpc3Qgd2l0aG91dCByZW1vdmluZyBpdC4gfGxpc3R8IG1heSBub3QKLS8vIGJlIE5VTEwgb3IgZW1wdHkuCi12b2lkKiBsaXN0X2Zyb250KGNvbnN0IGxpc3RfdCogbGlzdCk7Ci0KLS8vIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgbGlzdCB3aXRob3V0IHJlbW92aW5nIGl0LiB8bGlzdHwgbWF5IG5vdAotLy8gYmUgTlVMTCBvciBlbXB0eS4KLXZvaWQqIGxpc3RfYmFjayhjb25zdCBsaXN0X3QqIGxpc3QpOwotCi0vLyBSZXR1cm5zIHRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpc3Qgd2l0aG91dCByZW1vdmluZyBpdC4gfGxpc3R8IG1heSBub3QKLS8vIGJlIE5VTEwgb3IgZW1wdHkuCi1saXN0X25vZGVfdCogbGlzdF9iYWNrX25vZGUoY29uc3QgbGlzdF90KiBsaXN0KTsKLQotLy8gSW5zZXJ0cyB8ZGF0YXwgYWZ0ZXIgfHByZXZfbm9kZXwgaW4gfGxpc3R8LiB8ZGF0YXwsIHxsaXN0fCwgYW5kIHxwcmV2X25vZGV8Ci0vLyBtYXkgbm90IGJlIE5VTEwuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbWFrZSBhIGNvcHkgb2YgfGRhdGF8IHNvIHRoZSBwb2ludGVyCi0vLyBtdXN0IHJlbWFpbiB2YWxpZCBhdCBsZWFzdCB1bnRpbCB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb3IgdGhlCi0vLyBsaXN0IGlzIGZyZWVkLiBSZXR1cm5zIHRydWUgaWYgfGRhdGF8IGNvdWxkIGJlIGluc2VydGVkLCBmYWxzZSBvdGhlcndpc2UKLS8vIChlLmcuIG91dCBvZiBtZW1vcnkpLgotYm9vbCBsaXN0X2luc2VydF9hZnRlcihsaXN0X3QqIGxpc3QsIGxpc3Rfbm9kZV90KiBwcmV2X25vZGUsIHZvaWQqIGRhdGEpOwotCi0vLyBJbnNlcnRzIHxkYXRhfCBhdCB0aGUgYmVnaW5uaW5nIG9mIHxsaXN0fC4gTmVpdGhlciB8ZGF0YXwgbm9yIHxsaXN0fCBtYXkgYmUKLS8vIE5VTEwuCi0vLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1ha2UgYSBjb3B5IG9mIHxkYXRhfCBzbyB0aGUgcG9pbnRlciBtdXN0IHJlbWFpbiB2YWxpZAotLy8gYXQgbGVhc3QgdW50aWwgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9yIHRoZSBsaXN0IGlzIGZyZWVkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxkYXRhfCBjb3VsZCBiZSBpbnNlcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlIChlLmcuIG91dCBvZgotLy8gbWVtb3J5KS4KLWJvb2wgbGlzdF9wcmVwZW5kKGxpc3RfdCogbGlzdCwgdm9pZCogZGF0YSk7Ci0KLS8vIEluc2VydHMgfGRhdGF8IGF0IHRoZSBlbmQgb2YgfGxpc3R8LiBOZWl0aGVyIHxkYXRhfCBub3IgfGxpc3R8IG1heSBiZSBOVUxMLgotLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBtYWtlIGEgY29weSBvZiB8ZGF0YXwgc28gdGhlIHBvaW50ZXIgbXVzdCByZW1haW4gdmFsaWQKLS8vIGF0IGxlYXN0IHVudGlsIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvciB0aGUgbGlzdCBpcyBmcmVlZC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB8ZGF0YXwgY291bGQgYmUgaW5zZXJ0ZWQsIGZhbHNlIG90aGVyd2lzZSAoZS5nLiBvdXQgb2YKLS8vIG1lbW9yeSkuCi1ib29sIGxpc3RfYXBwZW5kKGxpc3RfdCogbGlzdCwgdm9pZCogZGF0YSk7Ci0KLS8vIFJlbW92ZXMgfGRhdGF8IGZyb20gdGhlIGxpc3QuIE5laXRoZXIgfGxpc3R8IG5vciB8ZGF0YXwgbWF5IGJlIE5VTEwuIElmCi0vLyB8ZGF0YXwKLS8vIGlzIGluc2VydGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBsaXN0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSByZW1vdmUgdGhlCi0vLyBmaXJzdCBpbnN0YW5jZS4gSWYgYSBmcmVlIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQgaW4gfGxpc3RfbmV3fCwgaXQgd2lsbCBiZQotLy8gY2FsbGVkIGJhY2sgd2l0aCB8ZGF0YXwuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHxkYXRhfCB3YXMgZm91bmQgaW4KLS8vIHRoZSBsaXN0IGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UuCi1ib29sIGxpc3RfcmVtb3ZlKGxpc3RfdCogbGlzdCwgdm9pZCogZGF0YSk7Ci0KLS8vIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0LiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGxpc3QKLS8vIHRvIHRoZQotLy8gc2FtZSBzdGF0ZSBpdCB3YXMgaW4gYWZ0ZXIgfGxpc3RfbmV3fC4gfGxpc3R8IG1heSBub3QgYmUgTlVMTC4KLXZvaWQgbGlzdF9jbGVhcihsaXN0X3QqIGxpc3QpOwotCi0vLyBJdGVyYXRlcyB0aHJvdWdoIHRoZSB8bGlzdHwgYW5kIGNhbGxzIHxjYWxsYmFja3wgZm9yIGVhY2ggZGF0YSBlbGVtZW50LgotLy8gSXRlcmF0aW9uIGNvbnRpbnVlcyB1bnRpbCB8Y2FsbGJhY2t8IHJldHVybnMgZmFsc2UuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZQotLy8gcG9pbnRlciB0byBsYXN0IHByb2Nlc3NlZCBlbGVtZW50LCBvciBOVUxMIGlmIHRoZSBsaXN0IGlzIGVtcHR5LCBvciBhbGwgY2FsbHMKLS8vIHRvIHxjYWxsYmFja3wgcmV0dXJuZWQgdHJ1ZS4gfGNvbnRleHR8IGlzIHBhc3NlZCB0byB8Y2FsbGJhY2t8IG9uIGVhY2gKLS8vIGl0ZXJhdGlvbi4KLS8vIElmIHRoZSBsaXN0IGlzIGVtcHR5LCB8Y2FsbGJhY2t8IHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiBJdCBpcyBzYWZlIHRvIG11dGF0ZQotLy8gdGhlIGxpc3QgaW5zaWRlIHRoZSBjYWxsYmFjay4gSWYgYW4gZWxlbWVudCBpcyBhZGRlZCBiZWZvcmUgdGhlIG5vZGUgYmVpbmcKLS8vIHZpc2l0ZWQsIHRoZXJlIHdpbGwgYmUgbm8gY2FsbGJhY2sgZm9yIHRoZSBuZXdseS1pbnNlcnRlZCBub2RlLiBOZWl0aGVyCi0vLyB8bGlzdHwgbm9yIHxjYWxsYmFja3wgbWF5IGJlIE5VTEwuCi1saXN0X25vZGVfdCogbGlzdF9mb3JlYWNoKGNvbnN0IGxpc3RfdCogbGlzdCwgbGlzdF9pdGVyX2NiIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KTsKLQotLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB8bGlzdHwuIHxsaXN0fCBtYXkgbm90IGJlIE5VTEwuCi0vLyBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgaXMgdmFsaWQgYXMgbG9uZyBhcyBpdCBkb2VzIG5vdCBlcXVhbCB0aGUgdmFsdWUKLS8vIHJldHVybmVkIGJ5IHxsaXN0X2VuZHwuCi1saXN0X25vZGVfdCogbGlzdF9iZWdpbihjb25zdCBsaXN0X3QqIGxpc3QpOwotCi0vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGlzdC4gSW4gb3RoZXIgd29yZHMsCi0vLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIGFuIGludmFsaWQgaXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBsaXN0LgotLy8gV2hlbiBhbiBpdGVyYXRvciBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgd2hhdCdzIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24sIHlvdQotLy8gbWF5IG5vIGxvbmdlciBjYWxsIHxsaXN0X25leHR8IHdpdGggdGhlIGl0ZXJhdG9yLiB8bGlzdHwgbWF5IG5vdCBiZSBOVUxMLgotbGlzdF9ub2RlX3QqIGxpc3RfZW5kKGNvbnN0IGxpc3RfdCogbGlzdCk7Ci0KLS8vIEdpdmVuIGEgdmFsaWQgaXRlcmF0b3IgfG5vZGV8LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5leHQgdmFsdWUgZm9yIHRoZQotLy8gaXRlcmF0b3IuIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBlcXVhbHMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHxsaXN0X2VuZHwsIHRoZQotLy8gaXRlcmF0b3IgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgbWF5IG5vIGxvbmdlciBiZSB1c2VkIGZvciBhbnkKLS8vIHB1cnBvc2UuCi1saXN0X25vZGVfdCogbGlzdF9uZXh0KGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlKTsKLQotLy8gUmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBpdGVyYXRvciB8bm9kZXwuCi0vLyB8bm9kZXwgbXVzdCBub3QgZXF1YWwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHxsaXN0X2VuZHwuCi12b2lkKiBsaXN0X25vZGUoY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvbG9nLmggYi9vc2kvaW5jbHVkZS9sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlYjMxNi4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9sb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotCi0jaWZuZGVmIE9TSV9JTkNMVURFX0xPR19ICi0jZGVmaW5lIE9TSV9JTkNMVURFX0xPR19ICi0jZW5kaWYKLQotI2luY2x1ZGUgImdkL29zL2xvZy5oIgotCi0jdW5kZWYgT1NJX0lOQ0xVREVfTE9HX0gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vc2kvaW5jbHVkZS9tdXRleC5oIGIvb3NpL2luY2x1ZGUvbXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5ZmUxMC4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9tdXRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vLyBMb2NrIHRoZSBnbG9iYWwgbXV0ZXgKLXZvaWQgbXV0ZXhfZ2xvYmFsX2xvY2sodm9pZCk7Ci0KLS8vIFVubG9jayB0aGUgZ2xvYmFsIG11dGV4Ci12b2lkIG11dGV4X2dsb2JhbF91bmxvY2sodm9pZCk7CmRpZmYgLS1naXQgYS9vc2kvaW5jbHVkZS9vc2kuaCBiL29zaS9pbmNsdWRlL29zaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWEyMWRlLi4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL29zaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBVTlVTRURfQVRUUiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQotI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKLSNkZWZpbmUgSU5WQUxJRF9GRCAoLTEpCi0KLSNkZWZpbmUgQ09OQ0FUKGEsIGIpIGEjI2IKLQotLy8gVXNlIGR1cmluZyBjb21waWxlIHRpbWUgdG8gY2hlY2sgY29uZGl0aW9uYWwgdmFsdWVzCi0vLyBOT1RFOiBUaGUgdGhlIGZhaWx1cmVzIHdpbGwgcHJlc2VudCBhcyBhIGdlbmVyaWMgZXJyb3IKLS8vICJlcnJvcjogaW5pdGlhbGl6YXRpb24gbWFrZXMgcG9pbnRlciBmcm9tIGludGVnZXIgd2l0aG91dCBhIGNhc3QiCi0vLyBidXQgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIHdpbGwgcHJlc2VudCB0aGUgY29uZGl0aW9uIHRoYXQKLS8vIGZhaWxlZC4KLSNkZWZpbmUgRFVNTVlfQ09VTlRFUihjKSBDT05DQVQoX19vc2lfZHVtbXlfLCBjKQotI2RlZmluZSBEVU1NWV9QVFIgRFVNTVlfQ09VTlRFUihfX0NPVU5URVJfXykKLQotLy8gTWFjcm9zIGZvciBzYWZlIGludGVnZXIgdG8gcG9pbnRlciBjb252ZXJzaW9uLiBJbiB0aGUgQyBsYW5ndWFnZSwgZGF0YSBpcwotLy8gY29tbW9ubHkgY2FzdCB0byBvcGFxdWUgcG9pbnRlciBjb250YWluZXJzIGFuZCBiYWNrIGZvciBnZW5lcmljIHBhcmFtZXRlcgotLy8gcGFzc2luZyBpbiBjYWxsYmFja3MuIFRoZXNlIG1hY3JvcyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkgaW4gbmV3IGNvZGUKLS8vIChuZXZlciBpbiBDKysgY29kZSkuIFdoZW5ldmVyIGludGVnZXJzIG5lZWQgdG8gYmUgcGFzc2VkIGFzIGEgcG9pbnRlciwgdXNlCi0vLyB0aGVzZSBtYWNyb3MuCi0jZGVmaW5lIFBUUl9UT19VSU5UKHApICgodW5zaWduZWQgaW50KSgodWludHB0cl90KShwKSkpCi0jZGVmaW5lIFVJTlRfVE9fUFRSKHUpICgodm9pZCopKCh1aW50cHRyX3QpKHUpKSkKLQotI2RlZmluZSBQVFJfVE9fSU5UKHApICgoaW50KSgoaW50cHRyX3QpKHApKSkKLSNkZWZpbmUgSU5UX1RPX1BUUihpKSAoKHZvaWQqKSgoaW50cHRyX3QpKGkpKSkKLQotLy8gT2J0YWluIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIElOVF9NQVggaW5jbHVzaXZlLgotLy8gVGFrZW4gZnJvbSBhIHN5c3RlbSByYW5kb20gc291cmNlIHN1Y2ggYXMgL2Rldi9yYW5kb20uCi0vLyBObyBndWFyYW50ZWVzIG9mIGRpc3RyaWJ1dGlvbiBhcmUgbWFkZS4KLS8vIEVmZm9ydCBpcyBtYWRlIGZvciB0aGlzIHRvIGNvbWUgZnJvbSBhIHJlYWwgcmFuZG9tIHNvdXJjZS4KLWludCBvc2lfcmFuZCh2b2lkKTsKLQotLy8gUmUtcnVuIHxmbnwgc3lzdGVtIGNhbGwgdW50aWwgdGhlIHN5c3RlbSBjYWxsIGRvZXNuJ3QgY2F1c2UgRUlOVFIuCi0jZGVmaW5lIE9TSV9OT19JTlRSKGZuKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKChmbikgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0KLSNpZm5kZWYgRkFMTFRIUk9VR0hfSU5URU5ERUQKLSNkZWZpbmUgRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXSAgLy8gTk9MSU5UCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCBiL29zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxNzYxMi4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2lmbmRlZiBQUk9QRVJUWV9WQUxVRV9NQVgKLSNkZWZpbmUgUFJPUEVSVFlfVkFMVUVfTUFYIDkyCi0jZW5kaWYgIC8vIFBST1BFUlRZX1ZBTFVFX01BWAotCi0jZGVmaW5lIEJVSUxEX1NBTklUWV9QUk9QRVJUWV9WQUxVRV9NQVggOTIKLQotLy8gR2V0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBrZXkgfGtleXwgaW50byB8dmFsdWV8LgotLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSB3aGljaCB3aWxsIG5ldmVyIGJlIGdyZWF0ZXIgdGhhbgotLy8gUFJPUEVSVFlfVkFMVUVfTUFYIC0gMSBhbmQgd2lsbCBhbHdheXMgYmUgemVybyB0ZXJtaW5hdGVkLgotLy8gKHRoZSBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgemVybykuCi0vLyBJZiB0aGUgcHJvcGVydHkgcmVhZCBmYWlscyBvciByZXR1cm5zIGFuIGVtcHR5IHZhbHVlLCB0aGUgfGRlZmF1bHRfdmFsdWV8Ci0vLyBpcyB1c2VkIChpZiBub25udWxsKS4gIElmIHRoZSB8ZGVmYXVsdF92YWx1ZXwgaXMgbnVsbCwgemVybyBpcyByZXR1cm5lZC4KLWludCBvc2lfcHJvcGVydHlfZ2V0KGNvbnN0IGNoYXIqIGtleSwgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpOwotCi0vLyBXcml0ZSB2YWx1ZSBvZiBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGgga2V5IHxrZXl8IHRvIHx2YWx1ZXwuCi0vLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgPCAwIG9uIGZhaWx1cmUKLWludCBvc2lfcHJvcGVydHlfc2V0KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOwotCi0vLyBBZGFwdGVyIGZ1bmN0aW9uIGZvciBwcm9wZXJ0eV9nZXRfaW50MzIgaW4KLS8vIGxpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgKLS8vCi0vLyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB8a2V5fCB0cnVuY2F0ZWQgYW5kIGNvZXJjZWQgaW50byBhbgotLy8gaW50MzJfdC4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQsIHRoZW4gdGhlIHxkZWZhdWx0X3ZhbHVlfCBpcyB1c2VkLgotaW50MzJfdCBvc2lfcHJvcGVydHlfZ2V0X2ludDMyKGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCBkZWZhdWx0X3ZhbHVlKTsKLQotLy8gQWRhcHRlciBmdW5jdGlvbiBmb3IgcHJvcGVydHlfZ2V0X2Jvb2wgaW4KLS8vIGxpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgKLS8vCi0vLyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB8a2V5fCBjb2VyY2VkIGludG8gYSBib29sLiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCwKLS8vIHRoZW4gdGhlIHxkZWZhdWx0X3ZhbHVlfCBpcyB1c2VkLgotYm9vbCBvc2lfcHJvcGVydHlfZ2V0X2Jvb2woY29uc3QgY2hhcioga2V5LCBib29sIGRlZmF1bHRfdmFsdWUpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL3JlYWN0b3IuaCBiL29zaS9pbmNsdWRlL3JlYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExY2RkOC4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9yZWFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLS8vIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJlYWN0b3IgcGF0dGVybi4KLS8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlYWN0b3JfcGF0dGVybiBmb3IgZGV0YWlscy4KLQotdHlwZWRlZiBzdHJ1Y3QgcmVhY3Rvcl90IHJlYWN0b3JfdDsKLXR5cGVkZWYgc3RydWN0IHJlYWN0b3Jfb2JqZWN0X3QgcmVhY3Rvcl9vYmplY3RfdDsKLQotLy8gRW51bWVyYXRlcyB0aGUgcmVhc29ucyBhIHJlYWN0b3IgaGFzIHN0b3BwZWQuCi10eXBlZGVmIGVudW0gewotICBSRUFDVE9SX1NUQVRVU19TVE9QLCAgIC8vIHxyZWFjdG9yX3N0b3B8IHdhcyBjYWxsZWQuCi0gIFJFQUNUT1JfU1RBVFVTX0VSUk9SLCAgLy8gdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgb3BlcmF0aW9uLgotICBSRUFDVE9SX1NUQVRVU19ET05FLCAgIC8vIHRoZSByZWFjdG9yIGNvbXBsZXRlZCBpdHMgd29yayAoZm9yIHRoZSBfcnVuX29uY2UqCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWFudHMpLgotfSByZWFjdG9yX3N0YXR1c190OwotCi0vLyBDcmVhdGVzIGEgbmV3IHJlYWN0b3Igb2JqZWN0LiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4gVGhlIHJldHVybmVkIG9iamVjdAotLy8gbXVzdCBiZSBmcmVlZCBieSBjYWxsaW5nIHxyZWFjdG9yX2ZyZWV8LgotcmVhY3Rvcl90KiByZWFjdG9yX25ldyh2b2lkKTsKLQotLy8gRnJlZXMgYSByZWFjdG9yIG9iamVjdCBjcmVhdGVkIHdpdGggfHJlYWN0b3JfbmV3fC4gfHJlYWN0b3J8IG1heSBiZSBOVUxMLgotdm9pZCByZWFjdG9yX2ZyZWUocmVhY3Rvcl90KiByZWFjdG9yKTsKLQotLy8gU3RhcnRzIHRoZSByZWFjdG9yLiBUaGlzIGZ1bmN0aW9uIGJsb2NrcyB0aGUgY2FsbGVyIHVudGlsIHxyZWFjdG9yX3N0b3B8IGlzCi0vLyBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZCBvciBpbiBhIGNhbGxiYWNrLiB8cmVhY3RvcnwgbWF5IG5vdCBiZSBOVUxMLgotcmVhY3Rvcl9zdGF0dXNfdCByZWFjdG9yX3N0YXJ0KHJlYWN0b3JfdCogcmVhY3Rvcik7Ci0KLS8vIFJ1bnMgb25lIGl0ZXJhdGlvbiBvZiB0aGUgcmVhY3Rvci4gVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgYXQgbGVhc3Qgb25lCi0vLyByZWdpc3RlcmVkIG9iamVjdCBiZWNvbWVzIHJlYWR5LiB8cmVhY3RvcnwgbWF5IG5vdCBiZSBOVUxMLgotcmVhY3Rvcl9zdGF0dXNfdCByZWFjdG9yX3J1bl9vbmNlKHJlYWN0b3JfdCogcmVhY3Rvcik7Ci0KLS8vIEltbWVkaWF0ZWx5IHVuYmxvY2tzIHRoZSByZWFjdG9yLiBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGFueQotLy8gdGhyZWFkLgotLy8gfHJlYWN0b3J8IG1heSBub3QgYmUgTlVMTC4KLXZvaWQgcmVhY3Rvcl9zdG9wKHJlYWN0b3JfdCogcmVhY3Rvcik7Ci0KLS8vIFJlZ2lzdGVycyBhIGZpbGUgZGVzY3JpcHRvciB3aXRoIHRoZSByZWFjdG9yLiBUaGUgZmlsZSBkZXNjcmlwdG9yLCB8ZmR8LCBtdXN0Ci0vLyBiZSB2YWxpZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFuZCBpdHMgb3duZXJzaGlwIGlzIG5vdCB0cmFuc2ZlcnJlZAotLy8gdG8gdGhlIHJlYWN0b3IuIFRoZSB8Y29udGV4dHwgdmFyaWFibGUgaXMgYSB1c2VyLWRlZmluZWQgb3BhcXVlIGhhbmRsZSB0aGF0Ci0vLyBpcyBwYXNzZWQgYmFjayB0byB0aGUgfHJlYWRfcmVhZHl8IGFuZCB8d3JpdGVfcmVhZHl8IGZ1bmN0aW9ucy4gSXQgaXMgbm90Ci0vLyBjb3BpZWQgb3IgZXZlbiBkZXJlZmVyZW5jZWQgYnkgdGhlIHJlYWN0b3Igc28gaXQgbWF5IGNvbnRhaW4gYW55IHZhbHVlCi0vLyBpbmNsdWRpbmcgTlVMTC4gVGhlIHxyZWFkX3JlYWR5fCBhbmQgfHdyaXRlX3JlYWR5fCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIGFuZAotLy8gbWF5IGJlIE5VTEwuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBvcGFxdWUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZQotLy8gZGVzY3JpcHRvcidzIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSByZWFjdG9yLiBXaGVuIHRoZSBjYWxsZXIgaXMgbm8gbG9uZ2VyCi0vLyBpbnRlcmVzdGVkIGluIGV2ZW50cyBvbiB0aGUgfGZkfCwgaXQgbXVzdCBmcmVlIHRoZSByZXR1cm5lZCBvYmplY3QgYnkgY2FsbGluZwotLy8gfHJlYWN0b3JfdW5yZWdpc3RlcnwuCi1yZWFjdG9yX29iamVjdF90KiByZWFjdG9yX3JlZ2lzdGVyKHJlYWN0b3JfdCogcmVhY3RvciwgaW50IGZkLCB2b2lkKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVhZF9yZWFkeSkodm9pZCogY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp3cml0ZV9yZWFkeSkodm9pZCogY29udGV4dCkpOwotCi0vLyBDaGFuZ2VzIHRoZSBzdWJzY3JpcHRpb24gbW9kZSBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRlZCBieQotLy8gfG9iamVjdHwuIElmIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZCBhIGZpbGUgZGVzY3JpcHRvciB3aXRoIGEKLS8vIHJlYWN0b3IsIGhhcyBhIHZhbGlkIHxvYmplY3R8LCBhbmQgZGVjaWRlcyB0byBjaGFuZ2UgdGhlIHxyZWFkX3JlYWR5fCBhbmQvb3IKLS8vIHx3cml0ZV9yZWFkeXwgY2FsbGJhY2sgcm91dGluZXMsIHRoZXkgY2FuIGNhbGwgdGhpcyByb3V0aW5lLiBSZXR1cm5zIHRydWUgaWYKLS8vIHRoZSBzdWJzY3JpcHRpb24gd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS4KLS8vIHxvYmplY3R8IG1heSBub3QgYmUgTlVMTCwgfHJlYWRfcmVhZHl8IGFuZCB8d3JpdGVfcmVhZHl8IG1heSBiZSBOVUxMLgotYm9vbCByZWFjdG9yX2NoYW5nZV9yZWdpc3RyYXRpb24ocmVhY3Rvcl9vYmplY3RfdCogb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlYWRfcmVhZHkpKHZvaWQqIGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKndyaXRlX3JlYWR5KSh2b2lkKiBjb250ZXh0KSk7Ci0KLS8vIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGZpbGUgZGVzY3JpcHRvciB3aXRoIGl0cyByZWFjdG9yLiB8b2JqfAotLy8gbWF5IG5vdCBiZSBOVUxMLiB8b2JqfCBpcyBpbnZhbGlkIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBzbyB0aGUgY2FsbGVyCi0vLyBtdXN0IGRyb3AgYWxsIHJlZmVyZW5jZXMgdG8gaXQuCi12b2lkIHJlYWN0b3JfdW5yZWdpc3RlcihyZWFjdG9yX29iamVjdF90KiBvYmopOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvcmluZ2J1ZmZlci5oIGIvb3NpL2luY2x1ZGUvcmluZ2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBkNjc0Li4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL3JpbmdidWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi10eXBlZGVmIHN0cnVjdCByaW5nYnVmZmVyX3QgcmluZ2J1ZmZlcl90OwotCi0vLyBOT1RFOgotLy8gTm9uZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGFyZSB0aHJlYWQgc2FmZSB3aGVuIGl0IGNvbWVzIHRvIGFjY2Vzc2luZyB0aGUKLS8vICpyYiBwb2ludGVyLiBJdCBpcyAqTk9UKiBwb3NzaWJsZSB0byBpbnNlcnQgYW5kIHBvcC9kZWxldGUgYXQgdGhlIHNhbWUgdGltZS4KLS8vIENhbGxlcnMgbXVzdCBwcm90ZWN0IHRoZSAqcmIgcG9pbnRlciBzZXBhcmF0ZWx5LgotCi0vLyBDcmVhdGUgYSByaW5nYnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBzaXplCi0vLyBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBSZXN1bHRpbmcgcG9pbnRlciBtdXN0IGJlIGZyZWVkCi0vLyB1c2luZyB8cmluZ2J1ZmZlcl9mcmVlfC4KLXJpbmdidWZmZXJfdCogcmluZ2J1ZmZlcl9pbml0KGNvbnN0IHNpemVfdCBzaXplKTsKLQotLy8gRnJlZXMgdGhlIHJpbmdidWZmZXIgc3RydWN0dXJlIGFuZCBidWZmZXIKLS8vIFNhdmUgdG8gY2FsbCB3aXRoIE5VTEwuCi12b2lkIHJpbmdidWZmZXJfZnJlZShyaW5nYnVmZmVyX3QqIHJiKTsKLQotLy8gUmV0dXJucyByZW1haW5pbmcgYnVmZmVyIHNpemUKLXNpemVfdCByaW5nYnVmZmVyX2F2YWlsYWJsZShjb25zdCByaW5nYnVmZmVyX3QqIHJiKTsKLQotLy8gUmV0dXJucyBzaXplIG9mIGRhdGEgaW4gYnVmZmVyCi1zaXplX3QgcmluZ2J1ZmZlcl9zaXplKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpOwotCi0vLyBBdHRlbXB0cyB0byBpbnNlcnQgdXAgdG8gfGxlbmd0aHwgYnl0ZXMgb2YgZGF0YSBhdCB8cHwgaW50byB0aGUgYnVmZmVyCi0vLyBSZXR1cm4gYWN0dWFsIG51bWJlciBvZiBieXRlcyBhZGRlZC4gQ2FuIGJlIGxlc3MgdGhhbiB8bGVuZ3RofCBpZiBidWZmZXIKLS8vIGlzIGZ1bGwuCi1zaXplX3QgcmluZ2J1ZmZlcl9pbnNlcnQocmluZ2J1ZmZlcl90KiByYiwgY29uc3QgdWludDhfdCogcCwgc2l6ZV90IGxlbmd0aCk7Ci0KLS8vIFBlZWsgfGxlbmd0aHwgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHJpbmdidWZmZXIsIHN0YXJ0aW5nIGF0IHxvZmZzZXR8LAotLy8gaW50byB0aGUgYnVmZmVyIHxwfC4gUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHBlZWtlZC4gQ2FuIGJlIGxlc3MKLS8vIHRoYW4gfGxlbmd0aHwgaWYgdGhlcmUgaXMgbGVzcyB0aGFuIHxsZW5ndGh8IGRhdGEgYXZhaWxhYmxlLiB8b2Zmc2V0fCBtdXN0Ci0vLyBiZSBub24tbmVnYXRpdmUuCi1zaXplX3QgcmluZ2J1ZmZlcl9wZWVrKGNvbnN0IHJpbmdidWZmZXJfdCogcmIsIG9mZl90IG9mZnNldCwgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci0KLS8vIERvZXMgdGhlIHNhbWUgYXMgfHJpbmdidWZmZXJfcGVla3wsIGJ1dCBhbHNvIGFkdmFuY2VzIHRoZSByaW5nIGJ1ZmZlciBoZWFkCi1zaXplX3QgcmluZ2J1ZmZlcl9wb3AocmluZ2J1ZmZlcl90KiByYiwgdWludDhfdCogcCwgc2l6ZV90IGxlbmd0aCk7Ci0KLS8vIERlbGV0ZXMgfGxlbmd0aHwgYnl0ZXMgZnJvbSB0aGUgcmluZ2J1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBoZWFkCi0vLyBSZXR1cm4gYWN0dWFsIG51bWJlciBvZiBieXRlcyBkZWxldGVkLgotc2l6ZV90IHJpbmdidWZmZXJfZGVsZXRlKHJpbmdidWZmZXJfdCogcmIsIHNpemVfdCBsZW5ndGgpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvc2VtYXBob3JlLmggYi9vc2kvaW5jbHVkZS9zZW1hcGhvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlNWUwZi4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9zZW1hcGhvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLXN0cnVjdCBzZW1hcGhvcmVfdDsKLXR5cGVkZWYgc3RydWN0IHNlbWFwaG9yZV90IHNlbWFwaG9yZV90OwotCi0vLyBDcmVhdGVzIGEgbmV3IHNlbWFwaG9yZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgfHZhbHVlfC4KLS8vIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiBUaGUgcmV0dXJuZWQgb2JqZWN0IG11c3QgYmUgcmVsZWFzZWQKLS8vIHdpdGggfHNlbWFwaG9yZV9mcmVlfC4KLXNlbWFwaG9yZV90KiBzZW1hcGhvcmVfbmV3KHVuc2lnbmVkIGludCB2YWx1ZSk7Ci0KLS8vIEZyZWVzIGEgc2VtYXBob3JlIGFsbG9jYXRlZCB3aXRoIHxzZW1hcGhvcmVfbmV3fC4gfHNlbWFwaG9yZXwgbWF5Ci0vLyBiZSBOVUxMLgotdm9pZCBzZW1hcGhvcmVfZnJlZShzZW1hcGhvcmVfdCogc2VtYXBob3JlKTsKLQotLy8gRGVjcmVtZW50cyB0aGUgdmFsdWUgb2YgfHNlbWFwaG9yZXwuIElmIGl0IGlzIDAsIHRoaXMgY2FsbCBibG9ja3MgdW50aWwKLS8vIGl0IGJlY29tZXMgbm9uLXplcm8uIHxzZW1hcGhvcmV8IG1heSBub3QgYmUgTlVMTC4KLXZvaWQgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSk7Ci0KLS8vIFRyaWVzIHRvIGRlY3JlbWVudCB0aGUgdmFsdWUgb2YgfHNlbWFwaG9yZXwuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzCi0vLyBkZWNyZW1lbnRlZCwgZmFsc2UgaWYgdGhlIHZhbHVlIHdhcyAwLiBUaGlzIGZ1bmN0aW9uIG5ldmVyIGJsb2Nrcy4KLS8vIHxzZW1hcGhvcmV8IG1heSBub3QgYmUgTlVMTC4KLWJvb2wgc2VtYXBob3JlX3RyeV93YWl0KHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpOwotCi0vLyBJbmNyZW1lbnRzIHRoZSB2YWx1ZSBvZiB8c2VtYXBob3JlfC4gfHNlbWFwaG9yZXwgbWF5IG5vdCBiZSBOVUxMLgotdm9pZCBzZW1hcGhvcmVfcG9zdChzZW1hcGhvcmVfdCogc2VtYXBob3JlKTsKLQotLy8gUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhpcyBzZW1hcGhvcmUuIFRoZSBjYWxsZXIgbWF5Ci0vLyBvbmx5IHBlcmZvcm0gb25lIG9wZXJhdGlvbiBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yOiBzZWxlY3QoMikuIElmIHxzZWxlY3R8Ci0vLyBpbmRpY2F0ZXMgdGhlIGZkIGlzIHJlYWRhYmxlLCB0aGUgY2FsbGVyIG1heSBjYWxsIHxzZW1hcGhvcmVfd2FpdHwKLS8vIHdpdGhvdXQgYmxvY2tpbmcuIElmIHNlbGVjdCBpbmRpY2F0ZXMgdGhlIGZkIGlzIHdyaXRhYmxlLCB0aGUgY2FsbGVyIG1heQotLy8gY2FsbCB8c2VtYXBob3JlX3Bvc3R8IHdpdGhvdXQgYmxvY2tpbmcuIE5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgYSByYWNlCi0vLyBjb25kaXRpb24gYmV0d2VlbiBjYWxsaW5nIHxzZWxlY3R8IGFuZCB8c2VtYXBob3JlX3dhaXR8IG9yIHxzZW1hcGhvcmVfcG9zdHwKLS8vIHdoaWNoIHJlc3VsdHMgaW4gYmxvY2tpbmcgYmVoYXZpb3VyLgotLy8KLS8vIFRoZSBjYWxsZXIgbXVzdCBub3QgY2xvc2UgdGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvci4gfHNlbWFwaG9yZXwgbWF5IG5vdAotLy8gYmUgTlVMTC4KLWludCBzZW1hcGhvcmVfZ2V0X2ZkKGNvbnN0IHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvc29ja2V0LmggYi9vc2kvaW5jbHVkZS9zb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhNGYyZC4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS9zb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi10eXBlZGVmIHN0cnVjdCByZWFjdG9yX3QgcmVhY3Rvcl90OwotdHlwZWRlZiBzdHJ1Y3Qgc29ja2V0X3Qgc29ja2V0X3Q7Ci10eXBlZGVmIHVpbnQxNl90IHBvcnRfdDsKLQotdHlwZWRlZiB2b2lkICgqc29ja2V0X2NiKShzb2NrZXRfdCogc29ja2V0LCB2b2lkKiBjb250ZXh0KTsKLQotLy8gUmV0dXJucyBhIG5ldyBzb2NrZXQgb2JqZWN0LiBUaGUgc29ja2V0IGlzIGluIGFuIGlkbGUsIGRpc2Nvbm5lY3RlZCBzdGF0ZQotLy8gd2hlbiBpdCBpcyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLiBUaGUgcmV0dXJuZWQgb2JqZWN0IG11c3QgYmUgZnJlZWQgYnkKLS8vIGNhbGxpbmcgfHNvY2tldF9mcmVlfC4gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCi1zb2NrZXRfdCogc29ja2V0X25ldyh2b2lkKTsKLQotLy8gUmV0dXJucyBhIG5ldyBzb2NrZXQgb2JqZWN0IGJhY2tlZCBieSB8ZmR8LiBUaGUgc29ja2V0IG9iamVjdCBpcyBpbiB3aGljaGV2ZXIKLS8vIHN0YXRlIHxmZHwgaXMgaW4gd2hlbiBpdCB3YXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSByZXR1cm5lZCBvYmplY3QKLS8vIG11c3QgYmUgZnJlZWQgYnkgY2FsbGluZyB8c29ja2V0X2ZyZWV8LiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4gSWYgdGhpcwotLy8gZnVuY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgb3duZXJzaGlwIG9mIHxmZHwgaXMgdHJhbnNmZXJyZWQgYW5kIHRoZSBjYWxsZXIgbXVzdAotLy8gbm90IGNsb3NlIGl0Lgotc29ja2V0X3QqIHNvY2tldF9uZXdfZnJvbV9mZChpbnQgZmQpOwotCi0vLyBGcmVlcyBhIHNvY2tldCBvYmplY3QgY3JlYXRlZCBieSB8c29ja2V0X25ld3wgb3IgfHNvY2tldF9hY2NlcHR8LiB8c29ja2V0fAotLy8gbWF5IGJlIE5VTEwuIElmIHRoZSBzb2NrZXQgd2FzIGNvbm5lY3RlZCwgaXQgd2lsbCBiZSBkaXNjb25uZWN0ZWQuCi12b2lkIHNvY2tldF9mcmVlKHNvY2tldF90KiBzb2NrZXQpOwotCi0vLyBQdXRzIHxzb2NrZXR8IGluIGxpc3RlbmluZyBtb2RlIGZvciBpbmNvbWluZyBUQ1AgY29ubmVjdGlvbnMgb24gdGhlIHNwZWNpZmllZAotLy8gfHBvcnR8IGFuZCB0aGUgbG9vcGJhY2sgSVB2NCBhZGRyZXNzLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24KLS8vIGZhaWx1cmUgKGUuZy4gfHBvcnR8IGlzIGJvdW5kIGJ5IGFub3RoZXIgc29ja2V0KS4gfHNvY2tldHwgbWF5IG5vdCBiZSBOVUxMLgotYm9vbCBzb2NrZXRfbGlzdGVuKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIHBvcnRfdCBwb3J0KTsKLQotLy8gQmxvY2tzIG9uIGEgbGlzdGVuaW5nIHNvY2tldCwgfHNvY2tldHwsIHVudGlsIGEgY2xpZW50IGNvbm5lY3RzIHRvIGl0LgotLy8gUmV0dXJucyBhIGNvbm5lY3RlZCBzb2NrZXQgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiBUaGUgcmV0dXJuZWQgb2JqZWN0Ci0vLyBtdXN0IGJlIGZyZWVkIGJ5IGNhbGxpbmcgfHNvY2tldF9mcmVlfC4gfHNvY2tldHwgbWF5IG5vdCBiZSBOVUxMLgotc29ja2V0X3QqIHNvY2tldF9hY2NlcHQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCk7Ci0KLS8vIFJlYWRzIHVwIHRvIHxjb3VudHwgYnl0ZXMgZnJvbSB8c29ja2V0fCBpbnRvIHxidWZ8LiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90Ci0vLyBibG9jay4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlcgotLy8gb2YgYnl0ZXMgY29waWVkIGludG8gfGJ1Znwgb24gc3VjY2VzcywgMCBpZiB0aGUgc29ja2V0IGhhcyBkaXNjb25uZWN0ZWQsCi0vLyBhbmQgLTEgb24gZXJyb3IuIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBhIHZhbHVlIGxlc3MgdGhhbiB8Y291bnR8IGlmIG5vdAotLy8gZW5vdWdoIGRhdGEgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xLCBlcnJubyB3aWxsCi0vLyBhbHNvIGJlIHNldCAoc2VlIHJlY3YoMikgZm9yIHBvc3NpYmxlIGVycm5vIHZhbHVlcykuIEhvd2V2ZXIsIGlmIHRoZSByZWFkaW5nCi0vLyBzeXN0ZW0gY2FsbCB3YXMgaW50ZXJydXB0ZWQgd2l0aCBlcnJubyBvZiBFSU5UUiwgdGhlIHJlYWQgb3BlcmF0aW9uIGlzCi0vLyByZXN0YXJ0ZWQgaW50ZXJuYWxseSB3aXRob3V0IHByb3BhZ2F0aW5nIEVJTlRSIGJhY2sgdG8gdGhlIGNhbGxlci4gSWYgdGhlcmUKLS8vIHdlcmUgbm8gYnl0ZXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMSBhbmQgc2V0cyBlcnJubwotLy8gdG8gRVdPVUxEQkxPQ0suIE5laXRoZXIgfHNvY2tldHwgbm9yIHxidWZ8IG1heSBiZSBOVUxMLgotc3NpemVfdCBzb2NrZXRfcmVhZChjb25zdCBzb2NrZXRfdCogc29ja2V0LCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCk7Ci0KLS8vIFdyaXRlcyB1cCB0byB8Y291bnR8IGJ5dGVzIGZyb20gfGJ1ZnwgaW50byB8c29ja2V0fC4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdAotLy8gYmxvY2suIFJldHVybnMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KLS8vIHRvIHxzb2NrZXR8IG9uIHN1Y2Nlc3MsIDAgaWYgdGhlIHNvY2tldCBoYXMgZGlzY29ubmVjdGVkLCBhbmQgLTEgb24gZXJyb3IuCi0vLyBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYSB2YWx1ZSBsZXNzIHRoYW4gfGNvdW50fCBpZiB3cml0aW5nIG1vcmUgYnl0ZXMKLS8vIHdvdWxkIHJlc3VsdCBpbiBibG9ja2luZy4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xLCBlcnJubyB3aWxsIGFsc28gYmUKLS8vIHNldCAoc2VlIHNlbmQoMikgZm9yIHBvc3NpYmxlIGVycm5vIHZhbHVlcykuIEhvd2V2ZXIsIGlmIHRoZSB3cml0aW5nIHN5c3RlbQotLy8gY2FsbCB3YXMgaW50ZXJydXB0ZWQgd2l0aCBlcnJubyBvZiBFSU5UUiwgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyByZXN0YXJ0ZWQKLS8vIGludGVybmFsbHkgd2l0aG91dCBwcm9wYWdhdGluZyBFSU5UUiBiYWNrIHRvIHRoZSBjYWxsZXIuIElmIG5vIGJ5dGVzIGNvdWxkCi0vLyBiZSB3cml0dGVuIHdpdGhvdXQgYmxvY2tpbmcsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgYW5kIHNldCBlcnJubyB0bwotLy8gRVdPVUxEQkxPQ0suIE5laXRoZXIgfHNvY2tldHwgbm9yIHxidWZ8IG1heSBiZSBOVUxMLgotc3NpemVfdCBzb2NrZXRfd3JpdGUoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBzYW1lIHdyaXRlIG9wZXJhdGlvbiBhcyB8c29ja2V0X3dyaXRlfCBhbmQgYWxzbwotLy8gc2VuZHMgdGhlIGZpbGUgZGVzY3JpcHRvciB8ZmR8IG92ZXIgdGhlIHNvY2tldCB0byBhIHJlbW90ZSBwcm9jZXNzLiBPd25lcnNoaXAKLS8vIG9mIHxmZHwgdHJhbnNmZXJzIHRvIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBkZXNjcmlwdG9yIG11c3Qgbm90IGJlIHVzZWQgYW55Ci0vLyBsb25nZXIuIElmIHxmZHwgaXMgSU5WQUxJRF9GRCwgdGhpcyBmdW5jdGlvbiBiZWhhdmVzIHRoZSBzYW1lIGFzCi0vLyB8c29ja2V0X3dyaXRlfC4KLXNzaXplX3Qgc29ja2V0X3dyaXRlX2FuZF90cmFuc2Zlcl9mZChjb25zdCBzb2NrZXRfdCogc29ja2V0LCBjb25zdCB2b2lkKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBpbnQgZmQpOwotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHxzb2NrZXR8IHdpdGhvdXQgYmxvY2tpbmcuCi0vLyBPbiBlcnJvciwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xLiB8c29ja2V0fCBtYXkgbm90IGJlIE5VTEwuCi0vLwotLy8gTm90ZTogdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHBhcnQgb2YgdGhlIHNvY2tldCBpbnRlcmZhY2UuIEl0IGlzIG9ubHkKLS8vICAgICAgIHByb3ZpZGVkIGFzIGEgc3RvcC1nYXAgdW50aWwgd2UgY2FuIHJlZmFjdG9yIGF3YXkgY29kZSB0aGF0IGRlcGVuZHMgb24KLS8vICAgICAgIGEgcHJpb3JpIGtub3dsZWRnZSBvZiB0aGUgYnl0ZSBjb3VudC4gRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHVubGVzcwotLy8gICAgICAgeW91IG5lZWQgaXQgd2hpbGUgcmVmYWN0b3JpbmcgbGVnYWN5IGJsdWVkcm9pZCBjb2RlLgotc3NpemVfdCBzb2NrZXRfYnl0ZXNfYXZhaWxhYmxlKGNvbnN0IHNvY2tldF90KiBzb2NrZXQpOwotCi0vLyBSZWdpc3RlcnMgfHNvY2tldHwgd2l0aCB0aGUgfHJlYWN0b3J8LiBXaGVuIHRoZSBzb2NrZXQgYmVjb21lcyByZWFkYWJsZSwKLS8vIHxyZWFkX2NifCB3aWxsIGJlIGNhbGxlZC4gV2hlbiB0aGUgc29ja2V0IGJlY29tZXMgd3JpdGVhYmxlLCB8d3JpdGVfY2J8IHdpbGwKLS8vIGJlIGNhbGxlZC4gVGhlIHxjb250ZXh0fCBwYXJhbWV0ZXIgaXMgcGFzc2VkLCB1bnRvdWNoZWQsIHRvIGVhY2ggb2YgdGhlCi0vLyBjYWxsYmFjayByb3V0aW5lcy4gTmVpdGhlciB8c29ja2V0fCBub3IgfHJlYWN0b3J8IG1heSBiZSBOVUxMLiB8cmVhZF9jYnwsCi0vLyB8d3JpdGVfY2J8LCBhbmQgfGNvbnRleHR8IG1heSBiZSBOVUxMLgotdm9pZCBzb2NrZXRfcmVnaXN0ZXIoc29ja2V0X3QqIHNvY2tldCwgcmVhY3Rvcl90KiByZWFjdG9yLCB2b2lkKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2NiIHJlYWRfY2IsIHNvY2tldF9jYiB3cml0ZV9jYik7Ci0KLS8vIFVucmVnaXN0ZXJzIHxzb2NrZXR8IGZyb20gd2hpY2hldmVyIHJlYWN0b3IgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoLCBpZiBhbnkuCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGlkZW1wb3RlbnQuCi12b2lkIHNvY2tldF91bnJlZ2lzdGVyKHNvY2tldF90KiBzb2NrZXQpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbC5oIGIvb3NpL2luY2x1ZGUvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNiOWQ1Li4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL3NvY2tldF91dGlscy9zb2NrZXRfbG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jZGVmaW5lIEZJTEVTWVNURU1fU09DS0VUX1BSRUZJWCAiL3RtcC8iCi0jZGVmaW5lIEFORFJPSURfUkVTRVJWRURfU09DS0VUX1BSRUZJWCAiL2Rldi9zb2NrZXQvIgotCi0vKgotICogU2V0IHVwIGEgZ2l2ZW4gc29ja2FkZHJfdW4sIHRvIGhhdmUgaXQgcmVmZXIgdG8gdGhlIGdpdmVuCi0gKiBuYW1lIGluIHRoZSBnaXZlbiBuYW1lc3BhY2UuIFRoZSBuYW1lc3BhY2UgbXVzdCBiZSBvbmUKLSAqIG9mIDxjb2RlPkFORFJPSURfU09DS0VUX05BTUVTUEFDRV9BQlNUUkFDVDwvY29kZT4sCi0gKiA8Y29kZT5BTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfUkVTRVJWRUQ8L2NvZGU+LCBvcgotICogPGNvZGU+QU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX0ZJTEVTWVNURU08L2NvZGU+LiBVcG9uIHN1Y2Nlc3MsCi0gKiB0aGUgcG9pbnRlZCBhdCBzb2NrYWRkcl91biBpcyBmaWxsZWQgaW4gYW5kIHRoZSBwb2ludGVkIGF0Ci0gKiBzb2NrbGVuX3QgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBmaW5hbCBsZW5ndGguIFRoaXMgZnVuY3Rpb24KLSAqIHdpbGwgZmFpbCBpZiB0aGUgbmFtZXNwYWNlIGlzIGludmFsaWQgKG5vdCBvbmUgb2YgdGhlIGluZGljYXRlZAotICogY29uc3RhbnRzKSBvciBpZiB0aGUgbmFtZSBpcyB0b28gbG9uZy4KLSAqCi0gKiBAcmV0dXJuIDAgb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlCi0gKi8KLWludCBvc2lfc29ja2V0X21ha2Vfc29ja2FkZHJfdW4oY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVzcGFjZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4qIHBfYWRkciwgc29ja2xlbl90KiBhbGVuKTsKZGlmZiAtLWdpdCBhL29zaS9pbmNsdWRlL3NvY2tldF91dGlscy9zb2NrZXRzLmggYi9vc2kvaW5jbHVkZS9zb2NrZXRfdXRpbHMvc29ja2V0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmEwNWQzLi4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL3NvY2tldF91dGlscy9zb2NrZXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jZGVmaW5lIEFORFJPSURfU09DS0VUX0VOVl9QUkVGSVggIkFORFJPSURfU09DS0VUXyIKLSNkZWZpbmUgQU5EUk9JRF9TT0NLRVRfRElSICIvZGV2L3NvY2tldCIKLQotLyoKLSAqIG9zaV9hbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCAtIHNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlCi0gKiBkZXNjcmlwdG9yIG9mIG91ciBpbml0LW1hbmFnZWQgVW5peCBkb21haW4gc29ja2V0LiBgbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlCi0gKiBzb2NrZXQsIGFzIGdpdmVuIGluIGluaXQucmMuIFJldHVybnMgLTEgb24gZXJyb3IuCi0gKgotICogVGhpcyBpcyBpbmxpbmUgYW5kIG5vdCBpbiBsaWJjdXRpbHMgcHJvcGVyIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhpcyBpbgotICogdGhpcmQtcGFydHkgZGFlbW9ucyB3aXRoIG1pbmltYWwgbW9kaWZpY2F0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIGludCBvc2lfYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQoY29uc3QgY2hhciogbmFtZSkgewotICBjaGFyIGtleVs2NF07Ci0gIHNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksIEFORFJPSURfU09DS0VUX0VOVl9QUkVGSVggIiVzIiwgbmFtZSk7Ci0KLSAgY29uc3QgY2hhciogdmFsID0gZ2V0ZW52KGtleSk7Ci0gIGlmICghdmFsKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgZXJybm8gPSAwOwotICBpbnQgZmQgPSBzdHJ0b2wodmFsLCBOVUxMLCAxMCk7Ci0gIGlmIChlcnJubykgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBmZDsKLX0KLQotLyoKLSAqIFNlZSBhbHNvIGFuZHJvaWQub3MuTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZQotICovCi0vLyBMaW51eCAiYWJzdHJhY3QiIChub24tZmlsZXN5c3RlbSkgbmFtZXNwYWNlCi0jZGVmaW5lIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9BQlNUUkFDVCAwCi0vLyBBbmRyb2lkICJyZXNlcnZlZCIgKC9kZXYvc29ja2V0KSBuYW1lc3BhY2UKLSNkZWZpbmUgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX1JFU0VSVkVEIDEKLS8vIE5vcm1hbCBmaWxlc3lzdGVtIG5hbWVzcGFjZQotI2RlZmluZSBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfRklMRVNZU1RFTSAyCi0KLWV4dGVybiBpbnQgb3NpX3NvY2tldF9sb2NhbF9zZXJ2ZXIoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVzcGFjZUlkLCBpbnQgdHlwZSk7Ci1leHRlcm4gaW50IG9zaV9zb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQoaW50IHMsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hbWVzcGFjZUlkKTsKLWV4dGVybiBpbnQgb3NpX3NvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdChpbnQgZmQsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hbWVzcGFjZUlkLCBpbnQgdHlwZSk7Ci1leHRlcm4gaW50IG9zaV9zb2NrZXRfbG9jYWxfY2xpZW50KGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lc3BhY2VJZCwgaW50IHR5cGUpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvdGhyZWFkLmggYi9vc2kvaW5jbHVkZS90aHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5ZmEzNC4uMDAwMDAwMAotLS0gYS9vc2kvaW5jbHVkZS90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNkZWZpbmUgVEhSRUFEX05BTUVfTUFYIDE2Ci0KLXR5cGVkZWYgc3RydWN0IHJlYWN0b3JfdCByZWFjdG9yX3Q7Ci10eXBlZGVmIHN0cnVjdCB0aHJlYWRfdCB0aHJlYWRfdDsKLQotdHlwZWRlZiB2b2lkICgqdGhyZWFkX2ZuKSh2b2lkKiBjb250ZXh0KTsKLQotLy8gQ3JlYXRlcyBhbmQgc3RhcnRzIGEgbmV3IHRocmVhZCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBPbmx5IFRIUkVBRF9OQU1FX01BWAotLy8gYnl0ZXMgZnJvbSB8bmFtZXwgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgbmV3bHktY3JlYXRlZCB0aHJlYWQuIFJldHVybnMgYQotLy8gdGhyZWFkIG9iamVjdCBpZiB0aGUgdGhyZWFkIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZCwgTlVMTCBvdGhlcndpc2UuIFRoZQotLy8gcmV0dXJuZWQgdGhyZWFkIG9iamVjdCBtdXN0IGJlIGZyZWVkIHdpdGggfHRocmVhZF9mcmVlfC4gfG5hbWV8IG1heSBub3QKLS8vIGJlIE5VTEwuCi10aHJlYWRfdCogdGhyZWFkX25ldyhjb25zdCBjaGFyKiBuYW1lKTsKLQotLy8gU2ltaWxhciB0byB8dGhyZWFkX25ld3wgYnV0IGNyZWF0ZXMgd2l0aCBhIGdpdmVuIHF1ZXVlIHxzaXplfC4KLXRocmVhZF90KiB0aHJlYWRfbmV3X3NpemVkKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBzaXplKTsKLQotLy8gRnJlZXMgdGhlIGdpdmVuIHx0aHJlYWR8LiBJZiB0aGUgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcsIGl0IGlzIHN0b3BwZWQKLS8vIGFuZCB0aGUgY2FsbGluZyB0aHJlYWQgd2lsbCBibG9jayB1bnRpbCB8dGhyZWFkfCB0ZXJtaW5hdGVzLiB8dGhyZWFkfAotLy8gbWF5IGJlIE5VTEwuCi12b2lkIHRocmVhZF9mcmVlKHRocmVhZF90KiB0aHJlYWQpOwotCi0vLyBXYWl0cyBmb3IgfHRocmVhZF9zdG9wfC4gVXBvbiByZXR1cm5pbmcsIHRoZSBvbmx5IG90aGVyIG9wZXJhdGlvbnMgYSBjYWxsZXIKLS8vIG1heSBwZXJmb3JtIG9uIHx0aHJlYWR8IGFyZSB8dGhyZWFkX2ZyZWV8IGFuZCB8dGhyZWFkX2pvaW58LiB8dGhyZWFkX2pvaW58Ci0vLyBpcyBpZGVtcG90ZW50IGFuZCBtYXkgYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4gfHRocmVhZHwgbWF5IG5vdCBiZSBOVUxMLgotdm9pZCB0aHJlYWRfam9pbih0aHJlYWRfdCogdGhyZWFkKTsKLQotLy8gQ2FsbCB8ZnVuY3wgd2l0aCB0aGUgYXJndW1lbnQgfGNvbnRleHR8IG9uIHx0aHJlYWR8LiBUaGlzIGZ1bmN0aW9uIHR5cGljYWxseQotLy8gZG9lcyBub3QgYmxvY2sgdW5sZXNzIHRoZXJlIGFyZSBhbiBleGNlc3NpdmUgbnVtYmVyIG9mIGZ1bmN0aW9ucyBwb3N0ZWQgdG8KLS8vIHx0aHJlYWR8IHRoYXQgaGF2ZSBub3QgYmVlbiBkaXNwYXRjaGVkIHlldC4gTmVpdGhlciB8dGhyZWFkfCBub3IgfGZ1bmN8IG1heQotLy8gYmUgTlVMTC4gfGNvbnRleHR8IG1heSBiZSBOVUxMLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCB0aHJlYWRfcG9zdCh0aHJlYWRfdCogdGhyZWFkLCB0aHJlYWRfZm4gZnVuYywgdm9pZCogY29udGV4dCk7Ci0KLS8vIFJlcXVlc3RzIHx0aHJlYWR8IHRvIHN0b3AuIE9ubHkgfHRocmVhZF9mcmVlfCBhbmQgfHRocmVhZF9uYW1lfCBtYXkgYmUgY2FsbGVkCi0vLyBhZnRlciBjYWxsaW5nIHx0aHJlYWRfc3RvcHwuIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBub3QgYmxvY2suCi0vLyB8dGhyZWFkfCBtYXkgbm90IGJlIE5VTEwuCi12b2lkIHRocmVhZF9zdG9wKHRocmVhZF90KiB0aHJlYWQpOwotCi0vLyBBdHRlbXB0cyB0byBzZXRzIHRoZSB8cHJpb3JpdHl8IG9mIGEgZ2l2ZW4gfHRocmVhZHwuCi0vLyBUaGUgfHRocmVhZHwgaGFzIHRvIGJlIHJ1bm5pbmcgZm9yIHRoaXMgY2FsbCB0byBzdWNjZWVkLgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCi1ib29sIHRocmVhZF9zZXRfcHJpb3JpdHkodGhyZWFkX3QqIHRocmVhZCwgaW50IHByaW9yaXR5KTsKLQotLy8gQXR0ZW1wdHMgdG8gc2V0IHx0aHJlYWR8IHRvIHRoZSByZWFsLXRpbWUgU0NIRURfRklGTyB8cHJpb3JpdHl8LgotLy8gVGhlIHx0aHJlYWR8IGhhcyB0byBiZSBydW5uaW5nIGZvciB0aGlzIGNhbGwgdG8gc3VjY2VlZC4KLS8vIFByaW9yaXR5IHZhbHVlcyBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIHNjaGVkX2dldF9wcmlvcml0eV9tYXgoU0NIRURfRklGTykKLS8vIHRvIHNjaGVkX2dldF9wcmlvcml0eV9taW4oU0NIRURfRklGTykuICBMYXJnZXIgdmFsdWVzIGFyZSBoaWdoZXIgcHJpb3JpdHkuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KLWJvb2wgdGhyZWFkX3NldF9ydF9wcmlvcml0eSh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmVwcmVzZW50ZWQgYnkKLS8vIHx0aHJlYWR8LgotLy8gfHRocmVhZHwgbWF5IG5vdCBiZSBOVUxMLgotYm9vbCB0aHJlYWRfaXNfc2VsZihjb25zdCB0aHJlYWRfdCogdGhyZWFkKTsKLQotLy8gUmV0dXJucyB0aGUgcmVhY3RvciBmb3IgdGhlIGdpdmVuIHx0aHJlYWR8LiB8dGhyZWFkfCBtYXkgbm90IGJlIE5VTEwuCi1yZWFjdG9yX3QqIHRocmVhZF9nZXRfcmVhY3Rvcihjb25zdCB0aHJlYWRfdCogdGhyZWFkKTsKLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gfHRocmVhZHwuIHx0aHJlYWR8IG1heSBub3QgYmUgTlVMTC4KLWNvbnN0IGNoYXIqIHRocmVhZF9uYW1lKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvdGhyZWFkX3NjaGVkdWxlci5oIGIvb3NpL2luY2x1ZGUvdGhyZWFkX3NjaGVkdWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzc3MjY4Li4wMDAwMDAwCi0tLSBhL29zaS9pbmNsdWRlL3RocmVhZF9zY2hlZHVsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1ib29sIHRocmVhZF9zY2hlZHVsZXJfZW5hYmxlX3JlYWxfdGltZShwaWRfdCBwaWQpOwotYm9vbCB0aHJlYWRfc2NoZWR1bGVyX2dldF9wcmlvcml0eV9yYW5nZShpbnQmIG1pbiwgaW50JiBtYXgpOwpkaWZmIC0tZ2l0IGEvb3NpL2luY2x1ZGUvd2FrZWxvY2suaCBiL29zaS9pbmNsdWRlL3dha2Vsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDc1Y2UuLjAwMDAwMDAKLS0tIGEvb3NpL2luY2x1ZGUvd2FrZWxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLS8vIFNldCB0aGUgQmx1ZXRvb3RoIE9TIGNhbGxvdXRzIHRvIHxjYWxsb3V0c3wuCi0vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBuYXRpdmUga2VybmVsIHdha2Vsb2NrcyBhcmUgbm90IHVzZWQKLS8vIGRpcmVjdGx5LiBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQsIG9yIHxjYWxsb3V0c3wgaXMgTlVMTCwgdGhlbiBuYXRpdmUKLS8vIGtlcm5lbCB3YWtlbG9ja3Mgd2lsbCBiZSB1c2VkLgotdm9pZCB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHMoYnRfb3NfY2FsbG91dHNfdCogY2FsbG91dHMpOwotCi0vLyBBY3F1aXJlIHRoZSBCbHVldG9vdGggd2FrZWxvY2suCi0vLyBUaGUgZnVuY3Rpb24gaXMgdGhyZWFkIHNhZmUuCi0vLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIHdha2Vsb2NrX2FjcXVpcmUodm9pZCk7Ci0KLS8vIFJlbGVhc2UgdGhlIEJsdWV0b290aCB3YWtlbG9jay4KLS8vIFRoZSBmdW5jdGlvbiBpcyB0aHJlYWQgc2FmZS4KLS8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgd2FrZWxvY2tfcmVsZWFzZSh2b2lkKTsKLQotLy8gQ2xlYW51cCB0aGUgd2FrZWxvY2sgaW50ZXJuYWwgc3RhdGUuCi0vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIE9TSSBtb2R1bGUgY2xlYW51cCBkdXJpbmcKLS8vIGdyYWNlZnVsIHNodXRkb3duLgotdm9pZCB3YWtlbG9ja19jbGVhbnVwKHZvaWQpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgbmVlZCB0byBiZSBjYWxsZWQgbm9ybWFsbHkuCi0vLyAvc3lzL3Bvd2VyL3dha2Vfe3x1bn1sb2NrIGFyZSB1c2VkIGJ5IGRlZmF1bHQuCi0vLyBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGhhdmUgYW55IGVmZmVjdCBhZnRlciBhbiBhbGFybSBoYXMgYmVlbgotLy8gc2V0IHdpdGggYWxhcm1fc2V0LgotLy8gSWYgfGxvY2tfcGF0aHwgb3IgfHVubG9ja19wYXRofCBhcmUgTlVMTCwgdGhhdCBwYXRoIGlzIG5vdCBjaGFuZ2VkLgotdm9pZCB3YWtlbG9ja19zZXRfcGF0aHMoY29uc3QgY2hhciogbG9ja19wYXRoLCBjb25zdCBjaGFyKiB1bmxvY2tfcGF0aCk7Ci0KLS8vIER1bXAgd2FrZWxvY2stcmVsYXRlZCBkZWJ1ZyBpbmZvIHRvIHRoZSB8ZmR8IGZpbGUgZGVzY3JpcHRvci4KLS8vIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHxmZHwuCi12b2lkIHdha2Vsb2NrX2RlYnVnX2R1bXAoaW50IGZkKTsKZGlmZiAtLWdpdCBhL29zaS9zcmMvYWxhcm0uY2MgYi9vc2kvc3JjL2FsYXJtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg1M2FiLi4wMDAwMDAwCi0tLSBhL29zaS9zcmMvYWxhcm0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaW50ZXJuYWxfaW5jbHVkZS9idF90YXJnZXQuaCIKLQotI2RlZmluZSBMT0dfVEFHICJidF9vc2lfYWxhcm0iCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotCi0jaW5jbHVkZSA8YmFzZS9jYW5jZWxhYmxlX2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbGlzdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLQotdXNpbmcgYmFzZTo6QmluZDsKLXVzaW5nIGJhc2U6OkNhbmNlbGFibGVDbG9zdXJlOwotCi0vLyBDYWxsYmFjayBhbmQgdGltZXIgdGhyZWFkcyBzaG91bGQgcnVuIGF0IFJUIHByaW9yaXR5IGluIG9yZGVyIHRvIGVuc3VyZSB0aGV5Ci0vLyBtZWV0IGF1ZGlvIGRlYWRsaW5lcy4gIFVzZSB0aGlzIHByaW9yaXR5IGZvciBhbGwgYXVkaW8vdGltZXIgcmVsYXRlZCB0aHJlYWQuCi1zdGF0aWMgY29uc3QgaW50IFRIUkVBRF9SVF9QUklPUklUWSA9IDE7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc2l6ZV90IGNvdW50OwotICB1aW50NjRfdCB0b3RhbF9tczsKLSAgdWludDY0X3QgbWF4X21zOwotfSBzdGF0X3Q7Ci0KLS8vIEFsYXJtLXJlbGF0ZWQgaW5mb3JtYXRpb24gYW5kIHN0YXRpc3RpY3MKLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgc2l6ZV90IHNjaGVkdWxlZF9jb3VudDsKLSAgc2l6ZV90IGNhbmNlbGVkX2NvdW50OwotICBzaXplX3QgcmVzY2hlZHVsZWRfY291bnQ7Ci0gIHNpemVfdCB0b3RhbF91cGRhdGVzOwotICB1aW50NjRfdCBsYXN0X3VwZGF0ZV9tczsKLSAgc3RhdF90IG92ZXJkdWVfc2NoZWR1bGluZzsKLSAgc3RhdF90IHByZW1hdHVyZV9zY2hlZHVsaW5nOwotfSBhbGFybV9zdGF0c190OwotCi0vKiBXcmFwcGVyIGFyb3VuZCBDYW5jZWxsYWJsZUNsb3N1cmUgdGhhdCBsZXQgaXQgYmUgZW1iZWRkZWQgaW4gc3RydWN0cywgd2l0aG91dAotICogbmVlZCB0byBkZWZpbmUgY29weSBvcGVyYXRvci4gKi8KLXN0cnVjdCBDYW5jZWxhYmxlQ2xvc3VyZUluU3RydWN0IHsKLSAgYmFzZTo6Q2FuY2VsYWJsZUNsb3N1cmUgaTsKLQotICBDYW5jZWxhYmxlQ2xvc3VyZUluU3RydWN0JiBvcGVyYXRvcj0oY29uc3QgQ2FuY2VsYWJsZUNsb3N1cmVJblN0cnVjdCYgaW4pIHsKLSAgICBpZiAoIWluLmkuY2FsbGJhY2soKS5pc19udWxsKCkpIGkuUmVzZXQoaW4uaS5jYWxsYmFjaygpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLX07Ci0KLXN0cnVjdCBhbGFybV90IHsKLSAgLy8gVGhlIG11dGV4IGlzIGhlbGQgd2hpbGUgdGhlIGNhbGxiYWNrIGZvciB0aGlzIGFsYXJtIGlzIGJlaW5nIGV4ZWN1dGVkLgotICAvLyBJdCBhbGxvd3MgdXMgdG8gcmVsZWFzZSB0aGUgY29hcnNlLWdyYWluZWQgbW9uaXRvciBsb2NrIHdoaWxlIGEKLSAgLy8gcG90ZW50aWFsbHkgbG9uZy1ydW5uaW5nIGNhbGxiYWNrIGlzIGV4ZWN1dGluZy4gfGFsYXJtX2NhbmNlbHwgdXNlcyB0aGlzCi0gIC8vIG11dGV4IHRvIHByb3ZpZGUgYSBndWFyYW50ZWUgdG8gaXRzIGNhbGxlciB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZQotICAvLyBpbiBwcm9ncmVzcyB3aGVuIGl0IHJldHVybnMuCi0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gY2FsbGJhY2tfbXV0ZXg7Ci0gIHVpbnQ2NF90IGNyZWF0aW9uX3RpbWVfbXM7Ci0gIHVpbnQ2NF90IHBlcmlvZF9tczsKLSAgdWludDY0X3QgZGVhZGxpbmVfbXM7Ci0gIHVpbnQ2NF90IHByZXZfZGVhZGxpbmVfbXM7ICAvLyBQcmV2aW91cyBkZWFkbGluZSAtIHVzZWQgZm9yIGFjY291bnRpbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmlvZGljIHRpbWVycwotICBib29sIGlzX3BlcmlvZGljOwotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZTsgIC8vIFRoZSBwcm9jZXNzaW5nIHF1ZXVlIHRvIGFkZCB0aGlzIGFsYXJtIHRvCi0gIGFsYXJtX2NhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gIHZvaWQqIGRhdGE7Ci0gIGFsYXJtX3N0YXRzX3Qgc3RhdHM7Ci0KLSAgYm9vbCBmb3JfbXNnX2xvb3A7ICAvLyBUcnVlLCBpZiB0aGUgYWxhcm0gc2hvdWxkIGJlIHByb2Nlc3NlZCBvbiBtZXNzYWdlIGxvb3AKLSAgQ2FuY2VsYWJsZUNsb3N1cmVJblN0cnVjdCBjbG9zdXJlOyAgLy8gcG9zdGVkIHRvIG1lc3NhZ2UgbG9vcCBmb3IgcHJvY2Vzc2luZwotfTsKLQotLy8gSWYgdGhlIG5leHQgd2FrZXVwIHRpbWUgaXMgbGVzcyB0aGFuIHRoaXMgdGhyZXNob2xkLCB3ZSBzaG91bGQgYWNxdWlyZQotLy8gYSB3YWtlbG9jayBpbnN0ZWFkIG9mIHNldHRpbmcgYSB3YWtlIGFsYXJtIHNvIHdlJ3JlIG5vdCBib3VuY2luZyBpbgotLy8gYW5kIG91dCBvZiBzdXNwZW5kIGZyZXF1ZW50bHkuIFRoaXMgdmFsdWUgaXMgZXh0ZXJuYWxseSB2aXNpYmxlIHRvIGFsbG93Ci0vLyB1bml0IHRlc3RzIHRvIHJ1biBmYXN0ZXIuIEl0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYnkgcHJvZHVjdGlvbiBjb2RlLgotaW50NjRfdCBUSU1FUl9JTlRFUlZBTF9GT1JfV0FLRUxPQ0tfSU5fTVMgPSAzMDAwOwotc3RhdGljIGNvbnN0IGNsb2NraWRfdCBDTE9DS19JRCA9IENMT0NLX0JPT1RUSU1FOwotCi0vLyBUaGlzIG11dGV4IGVuc3VyZXMgdGhhdCB0aGUgfGFsYXJtX3NldHwsIHxhbGFybV9jYW5jZWx8LCBhbmQgYWxhcm0gY2FsbGJhY2sKLS8vIGZ1bmN0aW9ucyBleGVjdXRlIHNlcmlhbGx5IGFuZCBub3QgY29uY3VycmVudGx5LiBBcyBhIHJlc3VsdCwgdGhpcyBtdXRleAotLy8gYWxzbyBwcm90ZWN0cyB0aGUgfGFsYXJtc3wgbGlzdC4KLXN0YXRpYyBzdGQ6Om11dGV4IGFsYXJtc19tdXRleDsKLXN0YXRpYyBsaXN0X3QqIGFsYXJtczsKLXN0YXRpYyB0aW1lcl90IHRpbWVyOwotc3RhdGljIHRpbWVyX3Qgd2FrZXVwX3RpbWVyOwotc3RhdGljIGJvb2wgdGltZXJfc2V0OwotCi0vLyBBbGwgYWxhcm0gY2FsbGJhY2tzIGFyZSBkaXNwYXRjaGVkIGZyb20gfGRpc3BhdGNoZXJfdGhyZWFkfAotc3RhdGljIHRocmVhZF90KiBkaXNwYXRjaGVyX3RocmVhZDsKLXN0YXRpYyBib29sIGRpc3BhdGNoZXJfdGhyZWFkX2FjdGl2ZTsKLXN0YXRpYyBzZW1hcGhvcmVfdCogYWxhcm1fZXhwaXJlZDsKLQotLy8gRGVmYXVsdCBhbGFybSBjYWxsYmFjayB0aHJlYWQgYW5kIHF1ZXVlCi1zdGF0aWMgdGhyZWFkX3QqIGRlZmF1bHRfY2FsbGJhY2tfdGhyZWFkOwotc3RhdGljIGZpeGVkX3F1ZXVlX3QqIGRlZmF1bHRfY2FsbGJhY2tfcXVldWU7Ci0KLXN0YXRpYyBhbGFybV90KiBhbGFybV9uZXdfaW50ZXJuYWwoY29uc3QgY2hhciogbmFtZSwgYm9vbCBpc19wZXJpb2RpYyk7Ci1zdGF0aWMgYm9vbCBsYXp5X2luaXRpYWxpemUodm9pZCk7Ci1zdGF0aWMgdWludDY0X3Qgbm93X21zKHZvaWQpOwotc3RhdGljIHZvaWQgYWxhcm1fc2V0X2ludGVybmFsKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBwZXJpb2RfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgYm9vbCBmb3JfbXNnX2xvb3ApOwotc3RhdGljIHZvaWQgYWxhcm1fY2FuY2VsX2ludGVybmFsKGFsYXJtX3QqIGFsYXJtKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9wZW5kaW5nX2FsYXJtKGFsYXJtX3QqIGFsYXJtKTsKLXN0YXRpYyB2b2lkIHNjaGVkdWxlX25leHRfaW5zdGFuY2UoYWxhcm1fdCogYWxhcm0pOwotc3RhdGljIHZvaWQgcmVzY2hlZHVsZV9yb290X2FsYXJtKHZvaWQpOwotc3RhdGljIHZvaWQgYWxhcm1fcXVldWVfcmVhZHkoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGNvbnRleHQpOwotc3RhdGljIHZvaWQgdGltZXJfY2FsbGJhY2sodm9pZCogZGF0YSk7Ci1zdGF0aWMgdm9pZCBjYWxsYmFja19kaXNwYXRjaCh2b2lkKiBjb250ZXh0KTsKLXN0YXRpYyBib29sIHRpbWVyX2NyZWF0ZV9pbnRlcm5hbChjb25zdCBjbG9ja2lkX3QgY2xvY2tfaWQsIHRpbWVyX3QqIHRpbWVyKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zY2hlZHVsaW5nX3N0YXRzKGFsYXJtX3N0YXRzX3QqIHN0YXRzLCB1aW50NjRfdCBub3dfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkZWFkbGluZV9tcyk7Ci0vLyBSZWdpc3RlcnMgfHF1ZXVlfCBmb3IgcHJvY2Vzc2luZyBhbGFybSBjYWxsYmFja3Mgb24gfHRocmVhZHwuCi0vLyB8cXVldWV8IG1heSBub3QgYmUgTlVMTC4gfHRocmVhZHwgbWF5IG5vdCBiZSBOVUxMLgotc3RhdGljIHZvaWQgYWxhcm1fcmVnaXN0ZXJfcHJvY2Vzc2luZ19xdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3QqIHRocmVhZCk7Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0KHN0YXRfdCogc3RhdCwgdWludDY0X3QgZGVsdGFfbXMpIHsKLSAgaWYgKHN0YXQtPm1heF9tcyA8IGRlbHRhX21zKSBzdGF0LT5tYXhfbXMgPSBkZWx0YV9tczsKLSAgc3RhdC0+dG90YWxfbXMgKz0gZGVsdGFfbXM7Ci0gIHN0YXQtPmNvdW50Kys7Ci19Ci0KLWFsYXJtX3QqIGFsYXJtX25ldyhjb25zdCBjaGFyKiBuYW1lKSB7IHJldHVybiBhbGFybV9uZXdfaW50ZXJuYWwobmFtZSwgZmFsc2UpOyB9Ci0KLWFsYXJtX3QqIGFsYXJtX25ld19wZXJpb2RpYyhjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHJldHVybiBhbGFybV9uZXdfaW50ZXJuYWwobmFtZSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBhbGFybV90KiBhbGFybV9uZXdfaW50ZXJuYWwoY29uc3QgY2hhciogbmFtZSwgYm9vbCBpc19wZXJpb2RpYykgewotICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGxpc3Qgd2UgY2FuIGluc2VydCBhbGFybXMgaW50by4KLSAgaWYgKCFhbGFybXMgJiYgIWxhenlfaW5pdGlhbGl6ZSgpKSB7Ci0gICAgQ0hFQ0soZmFsc2UpOyAgLy8gaWYgaW5pdGlhbGl6YXRpb24gZmFpbGVkLCB3ZSBzaG91bGQgbm90IGNvbnRpbnVlCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBhbGFybV90KiByZXQgPSBzdGF0aWNfY2FzdDxhbGFybV90Kj4ob3NpX2NhbGxvYyhzaXplb2YoYWxhcm1fdCkpKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IHB0cihuZXcgc3RkOjpyZWN1cnNpdmVfbXV0ZXgoKSk7Ci0gIHJldC0+Y2FsbGJhY2tfbXV0ZXggPSBwdHI7Ci0gIHJldC0+aXNfcGVyaW9kaWMgPSBpc19wZXJpb2RpYzsKLSAgcmV0LT5zdGF0cy5uYW1lID0gb3NpX3N0cmR1cChuYW1lKTsKLQotICByZXQtPmZvcl9tc2dfbG9vcCA9IGZhbHNlOwotICAvLyBwbGFjZW1lbnQgbmV3Ci0gIG5ldyAoJnJldC0+Y2xvc3VyZSkgQ2FuY2VsYWJsZUNsb3N1cmVJblN0cnVjdCgpOwotCi0gIC8vIE5PVEU6IFRoZSBzdGF0cyB3ZXJlIHJlc2V0IGJ5IG9zaV9jYWxsb2MoKSBhYm92ZQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgYWxhcm1fZnJlZShhbGFybV90KiBhbGFybSkgewotICBpZiAoIWFsYXJtKSByZXR1cm47Ci0KLSAgYWxhcm1fY2FuY2VsKGFsYXJtKTsKLQotICBvc2lfZnJlZSgodm9pZCopYWxhcm0tPnN0YXRzLm5hbWUpOwotICBhbGFybS0+Y2xvc3VyZS5+Q2FuY2VsYWJsZUNsb3N1cmVJblN0cnVjdCgpOwotICBhbGFybS0+Y2FsbGJhY2tfbXV0ZXgucmVzZXQoKTsKLSAgb3NpX2ZyZWUoYWxhcm0pOwotfQotCi11aW50NjRfdCBhbGFybV9nZXRfcmVtYWluaW5nX21zKGNvbnN0IGFsYXJtX3QqIGFsYXJtKSB7Ci0gIENIRUNLKGFsYXJtICE9IE5VTEwpOwotICB1aW50NjRfdCByZW1haW5pbmdfbXMgPSAwOwotICB1aW50NjRfdCBqdXN0X25vd19tcyA9IG5vd19tcygpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFsYXJtc19tdXRleCk7Ci0gIGlmIChhbGFybS0+ZGVhZGxpbmVfbXMgPiBqdXN0X25vd19tcykKLSAgICByZW1haW5pbmdfbXMgPSBhbGFybS0+ZGVhZGxpbmVfbXMgLSBqdXN0X25vd19tczsKLQotICByZXR1cm4gcmVtYWluaW5nX21zOwotfQotCi12b2lkIGFsYXJtX3NldChhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIGFsYXJtX2NhbGxiYWNrX3QgY2IsCi0gICAgICAgICAgICAgICB2b2lkKiBkYXRhKSB7Ci0gIGFsYXJtX3NldF9pbnRlcm5hbChhbGFybSwgaW50ZXJ2YWxfbXMsIGNiLCBkYXRhLCBkZWZhdWx0X2NhbGxiYWNrX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi12b2lkIGFsYXJtX3NldF9vbl9tbG9vcChhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9jYWxsYmFja190IGNiLCB2b2lkKiBkYXRhKSB7Ci0gIGFsYXJtX3NldF9pbnRlcm5hbChhbGFybSwgaW50ZXJ2YWxfbXMsIGNiLCBkYXRhLCBOVUxMLCB0cnVlKTsKLX0KLQotLy8gUnVucyBpbiBleGNsdXNpb24gd2l0aCBhbGFybV9jYW5jZWwgYW5kIHRpbWVyX2NhbGxiYWNrLgotc3RhdGljIHZvaWQgYWxhcm1fc2V0X2ludGVybmFsKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBwZXJpb2RfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgYm9vbCBmb3JfbXNnX2xvb3ApIHsKLSAgQ0hFQ0soYWxhcm1zICE9IE5VTEwpOwotICBDSEVDSyhhbGFybSAhPSBOVUxMKTsKLSAgQ0hFQ0soY2IgIT0gTlVMTCk7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYWxhcm1zX211dGV4KTsKLQotICBhbGFybS0+Y3JlYXRpb25fdGltZV9tcyA9IG5vd19tcygpOwotICBhbGFybS0+cGVyaW9kX21zID0gcGVyaW9kX21zOwotICBhbGFybS0+cXVldWUgPSBxdWV1ZTsKLSAgYWxhcm0tPmNhbGxiYWNrID0gY2I7Ci0gIGFsYXJtLT5kYXRhID0gZGF0YTsKLSAgYWxhcm0tPmZvcl9tc2dfbG9vcCA9IGZvcl9tc2dfbG9vcDsKLQotICBzY2hlZHVsZV9uZXh0X2luc3RhbmNlKGFsYXJtKTsKLSAgYWxhcm0tPnN0YXRzLnNjaGVkdWxlZF9jb3VudCsrOwotfQotCi12b2lkIGFsYXJtX2NhbmNlbChhbGFybV90KiBhbGFybSkgewotICBDSEVDSyhhbGFybXMgIT0gTlVMTCk7Ci0gIGlmICghYWxhcm0pIHJldHVybjsKLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2FsX211dGV4X3JlZjsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFsYXJtc19tdXRleCk7Ci0gICAgbG9jYWxfbXV0ZXhfcmVmID0gYWxhcm0tPmNhbGxiYWNrX211dGV4OwotICAgIGFsYXJtX2NhbmNlbF9pbnRlcm5hbChhbGFybSk7Ci0gIH0KLQotICAvLyBJZiB0aGUgY2FsbGJhY2sgZm9yIHxhbGFybXwgaXMgaW4gcHJvZ3Jlc3MsIHdhaXQgaGVyZSB1bnRpbCBpdCBjb21wbGV0ZXMuCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jaygqbG9jYWxfbXV0ZXhfcmVmKTsKLX0KLQotLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgY2FuY2VsaW5nIGFuIGFsYXJtLgotLy8gVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHxhbGFybXNfbXV0ZXh8Ci1zdGF0aWMgdm9pZCBhbGFybV9jYW5jZWxfaW50ZXJuYWwoYWxhcm1fdCogYWxhcm0pIHsKLSAgYm9vbCBuZWVkc19yZXNjaGVkdWxlID0KLSAgICAgICghbGlzdF9pc19lbXB0eShhbGFybXMpICYmIGxpc3RfZnJvbnQoYWxhcm1zKSA9PSBhbGFybSk7Ci0KLSAgcmVtb3ZlX3BlbmRpbmdfYWxhcm0oYWxhcm0pOwotCi0gIGFsYXJtLT5kZWFkbGluZV9tcyA9IDA7Ci0gIGFsYXJtLT5wcmV2X2RlYWRsaW5lX21zID0gMDsKLSAgYWxhcm0tPmNhbGxiYWNrID0gTlVMTDsKLSAgYWxhcm0tPmRhdGEgPSBOVUxMOwotICBhbGFybS0+c3RhdHMuY2FuY2VsZWRfY291bnQrKzsKLSAgYWxhcm0tPnF1ZXVlID0gTlVMTDsKLQotICBpZiAobmVlZHNfcmVzY2hlZHVsZSkgcmVzY2hlZHVsZV9yb290X2FsYXJtKCk7Ci19Ci0KLWJvb2wgYWxhcm1faXNfc2NoZWR1bGVkKGNvbnN0IGFsYXJtX3QqIGFsYXJtKSB7Ci0gIGlmICgoYWxhcm1zID09IE5VTEwpIHx8IChhbGFybSA9PSBOVUxMKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gKGFsYXJtLT5jYWxsYmFjayAhPSBOVUxMKTsKLX0KLQotdm9pZCBhbGFybV9jbGVhbnVwKHZvaWQpIHsKLSAgLy8gSWYgbGF6eV9pbml0aWFsaXplIG5ldmVyIHJhbiB0aGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8KLSAgaWYgKCFhbGFybXMpIHJldHVybjsKLQotICBkaXNwYXRjaGVyX3RocmVhZF9hY3RpdmUgPSBmYWxzZTsKLSAgc2VtYXBob3JlX3Bvc3QoYWxhcm1fZXhwaXJlZCk7Ci0gIHRocmVhZF9mcmVlKGRpc3BhdGNoZXJfdGhyZWFkKTsKLSAgZGlzcGF0Y2hlcl90aHJlYWQgPSBOVUxMOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGFsYXJtc19tdXRleCk7Ci0KLSAgZml4ZWRfcXVldWVfZnJlZShkZWZhdWx0X2NhbGxiYWNrX3F1ZXVlLCBOVUxMKTsKLSAgZGVmYXVsdF9jYWxsYmFja19xdWV1ZSA9IE5VTEw7Ci0gIHRocmVhZF9mcmVlKGRlZmF1bHRfY2FsbGJhY2tfdGhyZWFkKTsKLSAgZGVmYXVsdF9jYWxsYmFja190aHJlYWQgPSBOVUxMOwotCi0gIHRpbWVyX2RlbGV0ZSh3YWtldXBfdGltZXIpOwotICB0aW1lcl9kZWxldGUodGltZXIpOwotICBzZW1hcGhvcmVfZnJlZShhbGFybV9leHBpcmVkKTsKLSAgYWxhcm1fZXhwaXJlZCA9IE5VTEw7Ci0KLSAgbGlzdF9mcmVlKGFsYXJtcyk7Ci0gIGFsYXJtcyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sIGxhenlfaW5pdGlhbGl6ZSh2b2lkKSB7Ci0gIENIRUNLKGFsYXJtcyA9PSBOVUxMKTsKLQotICAvLyB0aW1lcl90IGRvZXNuJ3QgaGF2ZSBhbiBpbnZhbGlkIHZhbHVlIHNvIHdlIG11c3QgdHJhY2sgd2hldGhlcgotICAvLyB0aGUgfHRpbWVyfCB2YXJpYWJsZSBpcyB2YWxpZCBvdXJzZWx2ZXMuCi0gIGJvb2wgdGltZXJfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgYm9vbCB3YWtldXBfdGltZXJfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhbGFybXNfbXV0ZXgpOwotCi0gIGFsYXJtcyA9IGxpc3RfbmV3KE5VTEwpOwotICBpZiAoIWFsYXJtcykgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGFsbG9jYXRlIGFsYXJtIGxpc3QuIiwgX19mdW5jX18pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBpZiAoIXRpbWVyX2NyZWF0ZV9pbnRlcm5hbChDTE9DS19JRCwgJnRpbWVyKSkgZ290byBlcnJvcjsKLSAgdGltZXJfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gIGlmICghdGltZXJfY3JlYXRlX2ludGVybmFsKENMT0NLX0JPT1RUSU1FX0FMQVJNLCAmd2FrZXVwX3RpbWVyKSkgewotICAgIGlmICghdGltZXJfY3JlYXRlX2ludGVybmFsKENMT0NLX0JPT1RUSU1FLCAmd2FrZXVwX3RpbWVyKSkgewotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gIH0KLSAgd2FrZXVwX3RpbWVyX2luaXRpYWxpemVkID0gdHJ1ZTsKLQotICBhbGFybV9leHBpcmVkID0gc2VtYXBob3JlX25ldygwKTsKLSAgaWYgKCFhbGFybV9leHBpcmVkKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gY3JlYXRlIGFsYXJtIGV4cGlyZWQgc2VtYXBob3JlIiwgX19mdW5jX18pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBkZWZhdWx0X2NhbGxiYWNrX3RocmVhZCA9Ci0gICAgICB0aHJlYWRfbmV3X3NpemVkKCJhbGFybV9kZWZhdWx0X2NhbGxiYWNrcyIsIFNJWkVfTUFYKTsKLSAgaWYgKGRlZmF1bHRfY2FsbGJhY2tfdGhyZWFkID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBjcmVhdGUgZGVmYXVsdCBhbGFybSBjYWxsYmFja3MgdGhyZWFkLiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIHRocmVhZF9zZXRfcnRfcHJpb3JpdHkoZGVmYXVsdF9jYWxsYmFja190aHJlYWQsIFRIUkVBRF9SVF9QUklPUklUWSk7Ci0gIGRlZmF1bHRfY2FsbGJhY2tfcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotICBpZiAoZGVmYXVsdF9jYWxsYmFja19xdWV1ZSA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgYWxhcm0gY2FsbGJhY2tzIHF1ZXVlLiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIGFsYXJtX3JlZ2lzdGVyX3Byb2Nlc3NpbmdfcXVldWUoZGVmYXVsdF9jYWxsYmFja19xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2NhbGxiYWNrX3RocmVhZCk7Ci0KLSAgZGlzcGF0Y2hlcl90aHJlYWRfYWN0aXZlID0gdHJ1ZTsKLSAgZGlzcGF0Y2hlcl90aHJlYWQgPSB0aHJlYWRfbmV3KCJhbGFybV9kaXNwYXRjaGVyIik7Ci0gIGlmICghZGlzcGF0Y2hlcl90aHJlYWQpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBjcmVhdGUgYWxhcm0gY2FsbGJhY2sgdGhyZWFkLiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIHRocmVhZF9zZXRfcnRfcHJpb3JpdHkoZGlzcGF0Y2hlcl90aHJlYWQsIFRIUkVBRF9SVF9QUklPUklUWSk7Ci0gIHRocmVhZF9wb3N0KGRpc3BhdGNoZXJfdGhyZWFkLCBjYWxsYmFja19kaXNwYXRjaCwgTlVMTCk7Ci0gIHJldHVybiB0cnVlOwotCi1lcnJvcjoKLSAgZml4ZWRfcXVldWVfZnJlZShkZWZhdWx0X2NhbGxiYWNrX3F1ZXVlLCBOVUxMKTsKLSAgZGVmYXVsdF9jYWxsYmFja19xdWV1ZSA9IE5VTEw7Ci0gIHRocmVhZF9mcmVlKGRlZmF1bHRfY2FsbGJhY2tfdGhyZWFkKTsKLSAgZGVmYXVsdF9jYWxsYmFja190aHJlYWQgPSBOVUxMOwotCi0gIHRocmVhZF9mcmVlKGRpc3BhdGNoZXJfdGhyZWFkKTsKLSAgZGlzcGF0Y2hlcl90aHJlYWQgPSBOVUxMOwotCi0gIGRpc3BhdGNoZXJfdGhyZWFkX2FjdGl2ZSA9IGZhbHNlOwotCi0gIHNlbWFwaG9yZV9mcmVlKGFsYXJtX2V4cGlyZWQpOwotICBhbGFybV9leHBpcmVkID0gTlVMTDsKLQotICBpZiAod2FrZXVwX3RpbWVyX2luaXRpYWxpemVkKSB0aW1lcl9kZWxldGUod2FrZXVwX3RpbWVyKTsKLQotICBpZiAodGltZXJfaW5pdGlhbGl6ZWQpIHRpbWVyX2RlbGV0ZSh0aW1lcik7Ci0KLSAgbGlzdF9mcmVlKGFsYXJtcyk7Ci0gIGFsYXJtcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdWludDY0X3Qgbm93X21zKHZvaWQpIHsKLSAgQ0hFQ0soYWxhcm1zICE9IE5VTEwpOwotCi0gIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfSUQsICZ0cykgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBnZXQgY3VycmVudCB0aW1lOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuICh0cy50dl9zZWMgKiAxMDAwTEwpICsgKHRzLnR2X25zZWMgLyAxMDAwMDAwTEwpOwotfQotCi0vLyBSZW1vdmUgYWxhcm0gZnJvbSBpbnRlcm5hbCBhbGFybSBsaXN0IGFuZCB0aGUgcHJvY2Vzc2luZyBxdWV1ZQotLy8gVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHxhbGFybXNfbXV0ZXh8Ci1zdGF0aWMgdm9pZCByZW1vdmVfcGVuZGluZ19hbGFybShhbGFybV90KiBhbGFybSkgewotICBsaXN0X3JlbW92ZShhbGFybXMsIGFsYXJtKTsKLQotICBpZiAoYWxhcm0tPmZvcl9tc2dfbG9vcCkgewotICAgIGFsYXJtLT5jbG9zdXJlLmkuQ2FuY2VsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUgKGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZShhbGFybS0+cXVldWUsIGFsYXJtKSAhPSBOVUxMKSB7Ci0gICAgICAvLyBSZW1vdmUgYWxsIHJlcGVhdGVkIGFsYXJtIGluc3RhbmNlcyBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgIC8vIE5PVEU6IFdlIGFyZSBkZWZlbnNpdmUgaGVyZSAtIHdlIHNob3VsZG4ndCBoYXZlIHJlcGVhdGVkIGFsYXJtCi0gICAgICAvLyBpbnN0YW5jZXMKLSAgICB9Ci0gIH0KLX0KLQotLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCB8YWxhcm1zX211dGV4fCBoZWxkCi1zdGF0aWMgdm9pZCBzY2hlZHVsZV9uZXh0X2luc3RhbmNlKGFsYXJtX3QqIGFsYXJtKSB7Ci0gIC8vIElmIHRoZSBhbGFybSBpcyBjdXJyZW50bHkgc2V0IGFuZCBpdCdzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdCwKLSAgLy8gd2UnbGwgbmVlZCB0byByZS1zY2hlZHVsZSBzaW5jZSB3ZSd2ZSBhZGp1c3RlZCB0aGUgZWFybGllc3QgZGVhZGxpbmUuCi0gIGJvb2wgbmVlZHNfcmVzY2hlZHVsZSA9Ci0gICAgICAoIWxpc3RfaXNfZW1wdHkoYWxhcm1zKSAmJiBsaXN0X2Zyb250KGFsYXJtcykgPT0gYWxhcm0pOwotICBpZiAoYWxhcm0tPmNhbGxiYWNrKSByZW1vdmVfcGVuZGluZ19hbGFybShhbGFybSk7Ci0KLSAgLy8gQ2FsY3VsYXRlIHRoZSBuZXh0IGRlYWRsaW5lIGZvciB0aGlzIGFsYXJtCi0gIHVpbnQ2NF90IGp1c3Rfbm93X21zID0gbm93X21zKCk7Ci0gIHVpbnQ2NF90IG1zX2ludG9fcGVyaW9kID0gMDsKLSAgaWYgKChhbGFybS0+aXNfcGVyaW9kaWMpICYmIChhbGFybS0+cGVyaW9kX21zICE9IDApKQotICAgIG1zX2ludG9fcGVyaW9kID0KLSAgICAgICAgKChqdXN0X25vd19tcyAtIGFsYXJtLT5jcmVhdGlvbl90aW1lX21zKSAlIGFsYXJtLT5wZXJpb2RfbXMpOwotICBhbGFybS0+ZGVhZGxpbmVfbXMgPSBqdXN0X25vd19tcyArIChhbGFybS0+cGVyaW9kX21zIC0gbXNfaW50b19wZXJpb2QpOwotCi0gIC8vIEFkZCBpdCBpbnRvIHRoZSB0aW1lciBsaXN0IHNvcnRlZCBieSBkZWFkbGluZSAoZWFybGllc3QgZGVhZGxpbmUgZmlyc3QpLgotICBpZiAobGlzdF9pc19lbXB0eShhbGFybXMpIHx8Ci0gICAgICAoKGFsYXJtX3QqKWxpc3RfZnJvbnQoYWxhcm1zKSktPmRlYWRsaW5lX21zID4gYWxhcm0tPmRlYWRsaW5lX21zKSB7Ci0gICAgbGlzdF9wcmVwZW5kKGFsYXJtcywgYWxhcm0pOwotICB9IGVsc2UgewotICAgIGZvciAobGlzdF9ub2RlX3QqIG5vZGUgPSBsaXN0X2JlZ2luKGFsYXJtcyk7IG5vZGUgIT0gbGlzdF9lbmQoYWxhcm1zKTsKLSAgICAgICAgIG5vZGUgPSBsaXN0X25leHQobm9kZSkpIHsKLSAgICAgIGxpc3Rfbm9kZV90KiBuZXh0ID0gbGlzdF9uZXh0KG5vZGUpOwotICAgICAgaWYgKG5leHQgPT0gbGlzdF9lbmQoYWxhcm1zKSB8fAotICAgICAgICAgICgoYWxhcm1fdCopbGlzdF9ub2RlKG5leHQpKS0+ZGVhZGxpbmVfbXMgPiBhbGFybS0+ZGVhZGxpbmVfbXMpIHsKLSAgICAgICAgbGlzdF9pbnNlcnRfYWZ0ZXIoYWxhcm1zLCBub2RlLCBhbGFybSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBuZXcgYWxhcm0gaGFzIHRoZSBlYXJsaWVzdCBkZWFkbGluZSwgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBvdXIKLSAgLy8gc2NoZWR1bGUuCi0gIGlmIChuZWVkc19yZXNjaGVkdWxlIHx8Ci0gICAgICAoIWxpc3RfaXNfZW1wdHkoYWxhcm1zKSAmJiBsaXN0X2Zyb250KGFsYXJtcykgPT0gYWxhcm0pKSB7Ci0gICAgcmVzY2hlZHVsZV9yb290X2FsYXJtKCk7Ci0gIH0KLX0KLQotLy8gTk9URTogbXVzdCBiZSBjYWxsZWQgd2l0aCB8YWxhcm1zX211dGV4fCBoZWxkCi1zdGF0aWMgdm9pZCByZXNjaGVkdWxlX3Jvb3RfYWxhcm0odm9pZCkgewotICBDSEVDSyhhbGFybXMgIT0gTlVMTCk7Ci0KLSAgY29uc3QgYm9vbCB0aW1lcl93YXNfc2V0ID0gdGltZXJfc2V0OwotICBhbGFybV90KiBuZXh0OwotICBpbnQ2NF90IG5leHRfZXhwaXJhdGlvbjsKLQotICAvLyBJZiB1c2VkIGluIGEgemVyb2VkIHN0YXRlLCBkaXNhcm1zIHRoZSB0aW1lci4KLSAgc3RydWN0IGl0aW1lcnNwZWMgdGltZXJfdGltZTsKLSAgbWVtc2V0KCZ0aW1lcl90aW1lLCAwLCBzaXplb2YodGltZXJfdGltZSkpOwotCi0gIGlmIChsaXN0X2lzX2VtcHR5KGFsYXJtcykpIGdvdG8gZG9uZTsKLQotICBuZXh0ID0gc3RhdGljX2Nhc3Q8YWxhcm1fdCo+KGxpc3RfZnJvbnQoYWxhcm1zKSk7Ci0gIG5leHRfZXhwaXJhdGlvbiA9IG5leHQtPmRlYWRsaW5lX21zIC0gbm93X21zKCk7Ci0gIGlmIChuZXh0X2V4cGlyYXRpb24gPCBUSU1FUl9JTlRFUlZBTF9GT1JfV0FLRUxPQ0tfSU5fTVMpIHsKLSAgICBpZiAoIXRpbWVyX3NldCkgewotICAgICAgaWYgKCF3YWtlbG9ja19hY3F1aXJlKCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYWNxdWlyZSB3YWtlIGxvY2siLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0aW1lcl90aW1lLml0X3ZhbHVlLnR2X3NlYyA9IChuZXh0LT5kZWFkbGluZV9tcyAvIDEwMDApOwotICAgIHRpbWVyX3RpbWUuaXRfdmFsdWUudHZfbnNlYyA9IChuZXh0LT5kZWFkbGluZV9tcyAlIDEwMDApICogMTAwMDAwMExMOwotCi0gICAgLy8gSXQgaXMgZW50aXJlbHkgdW5zYWZlIHRvIGNhbGwgdGltZXJfc2V0dGltZSgyKSB3aXRoIGEgemVyb2VkIHRpbWVyc3BlYwotICAgIC8vIGZvciB0aW1lcnMgd2l0aCAqX0FMQVJNIGNsb2NrIElEcy4gQWx0aG91Z2ggdGhlIG1hbiBwYWdlIHN0YXRlcyB0aGF0IHRoZQotICAgIC8vIHRpbWVyIHdvdWxkIGJlIGNhbmNlbGVkLCB0aGUgY3VycmVudCBiZWhhdmlvciAoYXMgb2YgTGludXgga2VybmVsIDMuMTcpCi0gICAgLy8gaXMgdGhhdCB0aGUgY2FsbGJhY2sgaXMgaXNzdWVkIGltbWVkaWF0ZWx5LiBUaGUgb25seSB3YXkgdG8gY2FuY2VsIGFuCi0gICAgLy8gKl9BTEFSTSB0aW1lciBpcyB0byBkZWxldGUgdGhlIHRpbWVyLiBCdXQgdW5mb3J0dW5hdGVseSwgZGVsZXRpbmcgYW5kCi0gICAgLy8gcmUtY3JlYXRpbmcgYSB0aW1lciBpcyByYXRoZXIgZXhwZW5zaXZlOyBldmVyeSB0aW1lcl9jcmVhdGUoMikgc3Bhd25zIGEKLSAgICAvLyBuZXcgdGhyZWFkLiBTbyB3ZSBzaW1wbHkgc2V0IHRoZSB0aW1lciB0byBmaXJlIGF0IHRoZSBsYXJnZXN0IHBvc3NpYmxlCi0gICAgLy8gdGltZS4KLSAgICAvLwotICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgdGhpcyBjb2RlIHBhdGgsIHdlJ3JlIGdvaW5nIHRvIGdyYWIgYSB3YWtlIGxvY2sgYW5kCi0gICAgLy8gd2FpdCBmb3IgdGhlIG5leHQgdGltZXIgdG8gZmlyZS4gSW4gdGhhdCBjYXNlLCB0aGVyZSdzIG5vIHJlYXNvbiB0bwotICAgIC8vIGhhdmUgYSBwZW5kaW5nIHdha2V1cCB0aW1lciBzbyB3ZSBzaW1wbHkgY2FuY2VsIGl0LgotICAgIHN0cnVjdCBpdGltZXJzcGVjIGVuZF9vZl90aW1lOwotICAgIG1lbXNldCgmZW5kX29mX3RpbWUsIDAsIHNpemVvZihlbmRfb2ZfdGltZSkpOwotICAgIGVuZF9vZl90aW1lLml0X3ZhbHVlLnR2X3NlYyA9ICh0aW1lX3QpKDFMTCA8PCAoc2l6ZW9mKHRpbWVfdCkgKiA4IC0gMikpOwotICAgIHRpbWVyX3NldHRpbWUod2FrZXVwX3RpbWVyLCBUSU1FUl9BQlNUSU1FLCAmZW5kX29mX3RpbWUsIE5VTEwpOwotICB9IGVsc2UgewotICAgIC8vIFdBUk5JTkc6IGRvIG5vdCBhdHRlbXB0IHRvIHVzZSByZWxhdGl2ZSB0aW1lcnMgd2l0aCAqX0FMQVJNIGNsb2NrIElEcwotICAgIC8vIGluIGtlcm5lbHMgYmVmb3JlIDMuMTcgdW5sZXNzIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgcGF0Y2g6Ci0gICAgLy8gaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTQvNy83LzU3NgotICAgIHN0cnVjdCBpdGltZXJzcGVjIHdha2V1cF90aW1lOwotICAgIG1lbXNldCgmd2FrZXVwX3RpbWUsIDAsIHNpemVvZih3YWtldXBfdGltZSkpOwotCi0gICAgd2FrZXVwX3RpbWUuaXRfdmFsdWUudHZfc2VjID0gKG5leHQtPmRlYWRsaW5lX21zIC8gMTAwMCk7Ci0gICAgd2FrZXVwX3RpbWUuaXRfdmFsdWUudHZfbnNlYyA9IChuZXh0LT5kZWFkbGluZV9tcyAlIDEwMDApICogMTAwMDAwMExMOwotICAgIGlmICh0aW1lcl9zZXR0aW1lKHdha2V1cF90aW1lciwgVElNRVJfQUJTVElNRSwgJndha2V1cF90aW1lLCBOVUxMKSA9PSAtMSkKLSAgICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIHNldCB3YWtldXAgdGltZXI6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLQotZG9uZToKLSAgdGltZXJfc2V0ID0KLSAgICAgIHRpbWVyX3RpbWUuaXRfdmFsdWUudHZfc2VjICE9IDAgfHwgdGltZXJfdGltZS5pdF92YWx1ZS50dl9uc2VjICE9IDA7Ci0gIGlmICh0aW1lcl93YXNfc2V0ICYmICF0aW1lcl9zZXQpIHsKLSAgICB3YWtlbG9ja19yZWxlYXNlKCk7Ci0gIH0KLQotICBpZiAodGltZXJfc2V0dGltZSh0aW1lciwgVElNRVJfQUJTVElNRSwgJnRpbWVyX3RpbWUsIE5VTEwpID09IC0xKQotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIHNldCB0aW1lcjogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLQotICAvLyBJZiBuZXh0IGV4cGlyYXRpb24gd2FzIGluIHRoZSBwYXN0IChlLmcuIHNob3J0IHRpbWVyIHRoYXQgZ290IGNvbnRleHQKLSAgLy8gc3dpdGNoZWQpIHRoZW4gdGhlIHRpbWVyIG1pZ2h0IGhhdmUgZGlhcm1lZCBpdHNlbGYuIERldGVjdCB0aGlzIGNhc2UgYW5kCi0gIC8vIHdvcmsgYXJvdW5kIGl0IGJ5IG1hbnVhbGx5IHNpZ25hbGxpbmcgdGhlIHxhbGFybV9leHBpcmVkfCBzZW1hcGhvcmUuCi0gIC8vCi0gIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRpbWVyIHdhcyBhY3R1YWxseSBzdXBlciBzaG9ydCAoYSBmZXcKLSAgLy8gbWlsbGlzZWNvbmRzKSBhbmQgdGhlIHRpbWVyIGV4cGlyZWQgbm9ybWFsbHkgYmVmb3JlIHdlIGNhbGxlZAotICAvLyB8dGltZXJfZ2V0dGltZXwuIFdvcnN0IGNhc2UsIHxhbGFybV9leHBpcmVkfCBpcyBzaWduYWxlZCB0d2ljZSBmb3IgdGhhdAotICAvLyBhbGFybS4gTm90aGluZyBiYWQgc2hvdWxkIGhhcHBlbiBpbiB0aGF0IGNhc2UgdGhvdWdoIHNpbmNlIHRoZSBjYWxsYmFjawotICAvLyBkaXNwYXRjaCBmdW5jdGlvbiBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSB0aW1lciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdAotICAvLyBhY3R1YWxseSBleHBpcmVkLgotICBpZiAodGltZXJfc2V0KSB7Ci0gICAgc3RydWN0IGl0aW1lcnNwZWMgdGltZV90b19leHBpcmU7Ci0gICAgdGltZXJfZ2V0dGltZSh0aW1lciwgJnRpbWVfdG9fZXhwaXJlKTsKLSAgICBpZiAodGltZV90b19leHBpcmUuaXRfdmFsdWUudHZfc2VjID09IDAgJiYKLSAgICAgICAgdGltZV90b19leHBpcmUuaXRfdmFsdWUudHZfbnNlYyA9PSAwKSB7Ci0gICAgICBMT0dfSU5GTygKLQotICAgICAgICAgICIlcyBhbGFybSBleHBpcmF0aW9uIHRvbyBjbG9zZSBmb3IgcG9zaXggdGltZXJzLCBzd2l0Y2hpbmcgdG8gZ3VucyIsCi0gICAgICAgICAgX19mdW5jX18pOwotICAgICAgc2VtYXBob3JlX3Bvc3QoYWxhcm1fZXhwaXJlZCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYXJtX3JlZ2lzdGVyX3Byb2Nlc3NpbmdfcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF90KiB0aHJlYWQpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0gIENIRUNLKHRocmVhZCAhPSBOVUxMKTsKLQotICBmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlKHF1ZXVlLCB0aHJlYWRfZ2V0X3JlYWN0b3IodGhyZWFkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9xdWV1ZV9yZWFkeSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYXJtX3JlYWR5X2dlbmVyaWMoYWxhcm1fdCogYWxhcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4mIGxvY2spIHsKLSAgaWYgKGFsYXJtID09IE5VTEwpIHsKLSAgICByZXR1cm47ICAvLyBUaGUgYWxhcm0gd2FzIHByb2JhYmx5IGNhbmNlbGVkCi0gIH0KLQotICAvLwotICAvLyBJZiB0aGUgYWxhcm0gaXMgbm90IHBlcmlvZGljLCB3ZSd2ZSBmdWxseSBzZXJ2aWNlZCBpdCBub3csIGFuZCBjYW4gcmVzZXQKLSAgLy8gc29tZSBvZiBpdHMgaW50ZXJuYWwgc3RhdGUuIFRoaXMgaXMgdXNlZnVsIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZXhwaXJlZAotICAvLyBhbGFybXMgYW5kIGFjdGl2ZSBvbmVzLgotICAvLwotICBpZiAoIWFsYXJtLT5jYWxsYmFjaykgewotICAgIExPRyhGQVRBTCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IHRpbWVyIGNhbGxiYWNrIGlzIE5VTEwhIE5hbWU9IiA8PCBhbGFybS0+c3RhdHMubmFtZTsKLSAgfQotICBhbGFybV9jYWxsYmFja190IGNhbGxiYWNrID0gYWxhcm0tPmNhbGxiYWNrOwotICB2b2lkKiBkYXRhID0gYWxhcm0tPmRhdGE7Ci0gIHVpbnQ2NF90IGRlYWRsaW5lX21zID0gYWxhcm0tPmRlYWRsaW5lX21zOwotICBpZiAoYWxhcm0tPmlzX3BlcmlvZGljKSB7Ci0gICAgLy8gVGhlIHBlcmlvZGljIGFsYXJtIGhhcyBiZWVuIHJlc2NoZWR1bGVkIGFuZCBhbGFybS0+ZGVhZGxpbmUgaGFzIGJlZW4KLSAgICAvLyB1cGRhdGVkLCBoZW5jZSB3ZSBuZWVkIHRvIHVzZSB0aGUgcHJldmlvdXMgZGVhZGxpbmUuCi0gICAgZGVhZGxpbmVfbXMgPSBhbGFybS0+cHJldl9kZWFkbGluZV9tczsKLSAgfSBlbHNlIHsKLSAgICBhbGFybS0+ZGVhZGxpbmVfbXMgPSAwOwotICAgIGFsYXJtLT5jYWxsYmFjayA9IE5VTEw7Ci0gICAgYWxhcm0tPmRhdGEgPSBOVUxMOwotICAgIGFsYXJtLT5xdWV1ZSA9IE5VTEw7Ci0gIH0KLQotICAvLyBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgbXV0ZXggc28gaXQgZG9lc24ndCBnZXQgZnJlZWQKLSAgLy8gYmVmb3JlIHRoZSBjYWxsYmFjayBnZXRzIGZpbmlzaGVkIGV4ZWN1dGluZy4KLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NhbF9tdXRleF9yZWYgPSBhbGFybS0+Y2FsbGJhY2tfbXV0ZXg7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gY2JfbG9jaygqbG9jYWxfbXV0ZXhfcmVmKTsKLSAgbG9jay51bmxvY2soKTsKLQotICAvLyBVcGRhdGUgdGhlIHN0YXRpc3RpY3MKLSAgdXBkYXRlX3NjaGVkdWxpbmdfc3RhdHMoJmFsYXJtLT5zdGF0cywgbm93X21zKCksIGRlYWRsaW5lX21zKTsKLQotICAvLyBOT1RFOiBEbyBOT1QgYWNjZXNzICJhbGFybSIgYWZ0ZXIgdGhlIGNhbGxiYWNrLCBhcyBhIHNhZmV0eSBwcmVjYXV0aW9uCi0gIC8vIGluIGNhc2UgdGhlIGNhbGxiYWNrIGl0c2VsZiBkZWxldGVkIHRoZSBhbGFybS4KLSAgY2FsbGJhY2soZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYXJtX3JlYWR5X21sb29wKGFsYXJtX3QqIGFsYXJtKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhhbGFybXNfbXV0ZXgpOwotICBhbGFybV9yZWFkeV9nZW5lcmljKGFsYXJtLCBsb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYWxhcm1fcXVldWVfcmVhZHkoZml4ZWRfcXVldWVfdCogcXVldWUsIFVOVVNFRF9BVFRSIHZvaWQqIGNvbnRleHQpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGFsYXJtc19tdXRleCk7Ci0gIGFsYXJtX3QqIGFsYXJtID0gKGFsYXJtX3QqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHF1ZXVlKTsKLSAgYWxhcm1fcmVhZHlfZ2VuZXJpYyhhbGFybSwgbG9jayk7Ci19Ci0KLS8vIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB3YWtlIGFsYXJtcyBhbmQgb3VyIHBvc2l4IHRpbWVyCi1zdGF0aWMgdm9pZCB0aW1lcl9jYWxsYmFjayhVTlVTRURfQVRUUiB2b2lkKiBwdHIpIHsKLSAgc2VtYXBob3JlX3Bvc3QoYWxhcm1fZXhwaXJlZCk7Ci19Ci0KLS8vIEZ1bmN0aW9uIHJ1bm5pbmcgb24gfGRpc3BhdGNoZXJfdGhyZWFkfCB0aGF0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmc6Ci0vLyAgICgxKSBSZWNlaXZlcyBhIHNpZ25hbCB1c2luZyB8YWxhcm1fZXhpcmVkfCB0aGF0IHRoZSBhbGFybSBoYXMgZXhwaXJlZAotLy8gICAoMikgRGlzcGF0Y2hlcyB0aGUgYWxhcm0gY2FsbGJhY2sgZm9yIHByb2Nlc3NpbmcgYnkgdGhlIGNvcnJlc3BvbmRpbmcKLS8vIHRocmVhZCBmb3IgdGhhdCBhbGFybS4KLXN0YXRpYyB2b2lkIGNhbGxiYWNrX2Rpc3BhdGNoKFVOVVNFRF9BVFRSIHZvaWQqIGNvbnRleHQpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzZW1hcGhvcmVfd2FpdChhbGFybV9leHBpcmVkKTsKLSAgICBpZiAoIWRpc3BhdGNoZXJfdGhyZWFkX2FjdGl2ZSkgYnJlYWs7Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhbGFybXNfbXV0ZXgpOwotICAgIGFsYXJtX3QqIGFsYXJtOwotCi0gICAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgYWxhcm0gbWF5IGdldCBjYW5jZWxsZWQgYmVmb3JlIHdlIGdldCB0byBpdC4KLSAgICAvLyBXZSdyZSBkb25lIGhlcmUgaWYgdGhlcmUgYXJlIG5vIGFsYXJtcyBvciB0aGUgYWxhcm0gYXQgdGhlIGZyb250IGlzIGluCi0gICAgLy8gdGhlIGZ1dHVyZS4gRXhpdCByaWdodCBhd2F5IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvLgotICAgIGlmIChsaXN0X2lzX2VtcHR5KGFsYXJtcykgfHwKLSAgICAgICAgKGFsYXJtID0gc3RhdGljX2Nhc3Q8YWxhcm1fdCo+KGxpc3RfZnJvbnQoYWxhcm1zKSkpLT5kZWFkbGluZV9tcyA+Ci0gICAgICAgICAgICBub3dfbXMoKSkgewotICAgICAgcmVzY2hlZHVsZV9yb290X2FsYXJtKCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBsaXN0X3JlbW92ZShhbGFybXMsIGFsYXJtKTsKLQotICAgIGlmIChhbGFybS0+aXNfcGVyaW9kaWMpIHsKLSAgICAgIGFsYXJtLT5wcmV2X2RlYWRsaW5lX21zID0gYWxhcm0tPmRlYWRsaW5lX21zOwotICAgICAgc2NoZWR1bGVfbmV4dF9pbnN0YW5jZShhbGFybSk7Ci0gICAgICBhbGFybS0+c3RhdHMucmVzY2hlZHVsZWRfY291bnQrKzsKLSAgICB9Ci0gICAgcmVzY2hlZHVsZV9yb290X2FsYXJtKCk7Ci0KLSAgICAvLyBFbnF1ZXVlIHRoZSBhbGFybSBmb3IgcHJvY2Vzc2luZwotICAgIGlmIChhbGFybS0+Zm9yX21zZ19sb29wKSB7Ci0gICAgICBpZiAoIWdldF9tYWluX3RocmVhZCgpKSB7Ci0gICAgICAgIExPR19FUlJPUigiJXM6IG1lc3NhZ2UgbG9vcCBhbHJlYWR5IE5VTEwuIEFsYXJtOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgYWxhcm0tPnN0YXRzLm5hbWUpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgYWxhcm0tPmNsb3N1cmUuaS5SZXNldChCaW5kKGFsYXJtX3JlYWR5X21sb29wLCBhbGFybSkpOwotICAgICAgZ2V0X21haW5fdGhyZWFkKCktPkRvSW5UaHJlYWQoRlJPTV9IRVJFLCBhbGFybS0+Y2xvc3VyZS5pLmNhbGxiYWNrKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGFsYXJtLT5xdWV1ZSwgYWxhcm0pOwotICAgIH0KLSAgfQotCi0gIExPR19JTkZPKCIlcyBDYWxsYmFjayB0aHJlYWQgZXhpdGVkIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgYm9vbCB0aW1lcl9jcmVhdGVfaW50ZXJuYWwoY29uc3QgY2xvY2tpZF90IGNsb2NrX2lkLCB0aW1lcl90KiB0aW1lcikgewotICBDSEVDSyh0aW1lciAhPSBOVUxMKTsKLQotICBzdHJ1Y3Qgc2lnZXZlbnQgc2lnZXZlbnQ7Ci0gIC8vIGNyZWF0ZSB0aW1lciB3aXRoIFJUIHByaW9yaXR5IHRocmVhZAotICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKLSAgcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKLSAgcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KCZ0aHJlYWRfYXR0ciwgU0NIRURfRklGTyk7Ci0gIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKLSAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBUSFJFQURfUlRfUFJJT1JJVFk7Ci0gIHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnBhcmFtKTsKLQotICBtZW1zZXQoJnNpZ2V2ZW50LCAwLCBzaXplb2Yoc2lnZXZlbnQpKTsKLSAgc2lnZXZlbnQuc2lnZXZfbm90aWZ5ID0gU0lHRVZfVEhSRUFEOwotICBzaWdldmVudC5zaWdldl9ub3RpZnlfZnVuY3Rpb24gPSAodm9pZCAoKikodW5pb24gc2lndmFsKSl0aW1lcl9jYWxsYmFjazsKLSAgc2lnZXZlbnQuc2lnZXZfbm90aWZ5X2F0dHJpYnV0ZXMgPSAmdGhyZWFkX2F0dHI7Ci0gIGlmICh0aW1lcl9jcmVhdGUoY2xvY2tfaWQsICZzaWdldmVudCwgdGltZXIpID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gY3JlYXRlIHRpbWVyIHdpdGggY2xvY2sgJWQ6ICVzIiwgX19mdW5jX18sIGNsb2NrX2lkLAotICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIGlmIChjbG9ja19pZCA9PSBDTE9DS19CT09UVElNRV9BTEFSTSkgewotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJUaGUga2VybmVsIG1pZ2h0IG5vdCBoYXZlIHN1cHBvcnQgZm9yICIKLSAgICAgICAgICAidGltZXJfY3JlYXRlKENMT0NLX0JPT1RUSU1FX0FMQVJNKTogIgotICAgICAgICAgICJodHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvNDI5OTI1LyIpOwotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJTZWUgZm9sbG93aW5nIHBhdGNoZXM6ICIKLSAgICAgICAgICAiaHR0cHM6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvIgotICAgICAgICAgICJsaW51eC5naXQvbG9nLz9xdD1ncmVwJnE9Q0xPQ0tfQk9PVFRJTUVfQUxBUk0iKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9zY2hlZHVsaW5nX3N0YXRzKGFsYXJtX3N0YXRzX3QqIHN0YXRzLCB1aW50NjRfdCBub3dfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkZWFkbGluZV9tcykgewotICBzdGF0cy0+dG90YWxfdXBkYXRlcysrOwotICBzdGF0cy0+bGFzdF91cGRhdGVfbXMgPSBub3dfbXM7Ci0KLSAgaWYgKGRlYWRsaW5lX21zIDwgbm93X21zKSB7Ci0gICAgLy8gT3ZlcmR1ZSBzY2hlZHVsaW5nCi0gICAgdWludDY0X3QgZGVsdGFfbXMgPSBub3dfbXMgLSBkZWFkbGluZV9tczsKLSAgICB1cGRhdGVfc3RhdCgmc3RhdHMtPm92ZXJkdWVfc2NoZWR1bGluZywgZGVsdGFfbXMpOwotICB9IGVsc2UgaWYgKGRlYWRsaW5lX21zID4gbm93X21zKSB7Ci0gICAgLy8gUHJlbWF0dXJlIHNjaGVkdWxpbmcKLSAgICB1aW50NjRfdCBkZWx0YV9tcyA9IGRlYWRsaW5lX21zIC0gbm93X21zOwotICAgIHVwZGF0ZV9zdGF0KCZzdGF0cy0+cHJlbWF0dXJlX3NjaGVkdWxpbmcsIGRlbHRhX21zKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBkdW1wX3N0YXQoaW50IGZkLCBzdGF0X3QqIHN0YXQsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gIHVpbnQ2NF90IGF2ZXJhZ2VfdGltZV9tcyA9IDA7Ci0gIGlmIChzdGF0LT5jb3VudCAhPSAwKSBhdmVyYWdlX3RpbWVfbXMgPSBzdGF0LT50b3RhbF9tcyAvIHN0YXQtPmNvdW50OwotCi0gIGRwcmludGYoZmQsICIlLTUxczogJWxsdSAvICVsbHUgLyAlbGx1XG4iLCBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXQtPnRvdGFsX21zLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXQtPm1heF9tcywKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWF2ZXJhZ2VfdGltZV9tcyk7Ci19Ci0KLXZvaWQgYWxhcm1fZGVidWdfZHVtcChpbnQgZmQpIHsKLSAgZHByaW50ZihmZCwgIlxuQmx1ZXRvb3RoIEFsYXJtcyBTdGF0aXN0aWNzOlxuIik7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYWxhcm1zX211dGV4KTsKLQotICBpZiAoYWxhcm1zID09IE5VTEwpIHsKLSAgICBkcHJpbnRmKGZkLCAiICBOb25lXG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50NjRfdCBqdXN0X25vd19tcyA9IG5vd19tcygpOwotCi0gIGRwcmludGYoZmQsICIgIFRvdGFsIEFsYXJtczogJXp1XG5cbiIsIGxpc3RfbGVuZ3RoKGFsYXJtcykpOwotCi0gIC8vIER1bXAgaW5mbyBmb3IgZWFjaCBhbGFybQotICBmb3IgKGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihhbGFybXMpOyBub2RlICE9IGxpc3RfZW5kKGFsYXJtcyk7Ci0gICAgICAgbm9kZSA9IGxpc3RfbmV4dChub2RlKSkgewotICAgIGFsYXJtX3QqIGFsYXJtID0gKGFsYXJtX3QqKWxpc3Rfbm9kZShub2RlKTsKLSAgICBhbGFybV9zdGF0c190KiBzdGF0cyA9ICZhbGFybS0+c3RhdHM7Ci0KLSAgICBkcHJpbnRmKGZkLCAiICBBbGFybSA6ICVzICglcylcbiIsIHN0YXRzLT5uYW1lLAotICAgICAgICAgICAgKGFsYXJtLT5pc19wZXJpb2RpYykgPyAiUEVSSU9ESUMiIDogIlNJTkdMRSIpOwotCi0gICAgZHByaW50ZihmZCwgIiUtNTFzOiAlenUgLyAlenUgLyAlenUgLyAlenVcbiIsCi0gICAgICAgICAgICAiICAgIEFjdGlvbiBjb3VudHMgKHNjaGVkL3Jlc2NoZWQvZXhlYy9jYW5jZWwpIiwKLSAgICAgICAgICAgIHN0YXRzLT5zY2hlZHVsZWRfY291bnQsIHN0YXRzLT5yZXNjaGVkdWxlZF9jb3VudCwKLSAgICAgICAgICAgIHN0YXRzLT50b3RhbF91cGRhdGVzLCBzdGF0cy0+Y2FuY2VsZWRfY291bnQpOwotCi0gICAgZHByaW50ZihmZCwgIiUtNTFzOiAlenUgLyAlenVcbiIsCi0gICAgICAgICAgICAiICAgIERldmlhdGlvbiBjb3VudHMgKG92ZXJkdWUvcHJlbWF0dXJlKSIsCi0gICAgICAgICAgICBzdGF0cy0+b3ZlcmR1ZV9zY2hlZHVsaW5nLmNvdW50LCBzdGF0cy0+cHJlbWF0dXJlX3NjaGVkdWxpbmcuY291bnQpOwotCi0gICAgZHByaW50ZihmZCwgIiUtNTFzOiAlbGx1IC8gJWxsdSAvICVsbGRcbiIsCi0gICAgICAgICAgICAiICAgIFRpbWUgaW4gbXMgKHNpbmNlIGNyZWF0aW9uL2ludGVydmFsL3JlbWFpbmluZykiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoanVzdF9ub3dfbXMgLSBhbGFybS0+Y3JlYXRpb25fdGltZV9tcyksCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFsYXJtLT5wZXJpb2RfbXMsCi0gICAgICAgICAgICAobG9uZyBsb25nKShhbGFybS0+ZGVhZGxpbmVfbXMgLSBqdXN0X25vd19tcykpOwotCi0gICAgZHVtcF9zdGF0KGZkLCAmc3RhdHMtPm92ZXJkdWVfc2NoZWR1bGluZywKLSAgICAgICAgICAgICAgIiAgICBPdmVyZHVlIHNjaGVkdWxpbmcgdGltZSBpbiBtcyAodG90YWwvbWF4L2F2ZykiKTsKLQotICAgIGR1bXBfc3RhdChmZCwgJnN0YXRzLT5wcmVtYXR1cmVfc2NoZWR1bGluZywKLSAgICAgICAgICAgICAgIiAgICBQcmVtYXR1cmUgc2NoZWR1bGluZyB0aW1lIGluIG1zICh0b3RhbC9tYXgvYXZnKSIpOwotCi0gICAgZHByaW50ZihmZCwgIlxuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvYWxsb2NhdGlvbl90cmFja2VyLmNjIGIvb3NpL3NyYy9hbGxvY2F0aW9uX3RyYWNrZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzcxMGMuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9hbGxvY2F0aW9uX3RyYWNrZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X29zaV9hbGxvY2F0aW9uX3RyYWNrZXIiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYWxsb2NhdG9yX2lkOwotICB2b2lkKiBwdHI7Ci0gIHNpemVfdCBzaXplOwotICBib29sIGZyZWVkOwotfSBhbGxvY2F0aW9uX3Q7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgY2FuYXJ5X3NpemUgPSA4Owotc3RhdGljIGNoYXIgY2FuYXJ5W2NhbmFyeV9zaXplXTsKLXN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCosIGFsbG9jYXRpb25fdCo+IGFsbG9jYXRpb25zOwotc3RhdGljIHN0ZDo6bXV0ZXggdHJhY2tlcl9sb2NrOwotc3RhdGljIGJvb2wgZW5hYmxlZCA9IGZhbHNlOwotCi0vLyBNZW1vcnkgYWxsb2NhdGlvbiBzdGF0aXN0aWNzCi1zdGF0aWMgc2l6ZV90IGFsbG9jX2NvdW50ZXIgPSAwOwotc3RhdGljIHNpemVfdCBmcmVlX2NvdW50ZXIgPSAwOwotc3RhdGljIHNpemVfdCBhbGxvY190b3RhbF9zaXplID0gMDsKLXN0YXRpYyBzaXplX3QgZnJlZV90b3RhbF9zaXplID0gMDsKLQotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdCh2b2lkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayh0cmFja2VyX2xvY2spOwotICBpZiAoZW5hYmxlZCkgcmV0dXJuOwotCi0gIC8vIHJhbmRvbWl6ZSB0aGUgY2FuYXJ5IGNvbnRlbnRzCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FuYXJ5X3NpemU7IGkrKykgY2FuYXJ5W2ldID0gKGNoYXIpb3NpX3JhbmQoKTsKLQotICBMT0dfSU5GTygiY2FuYXJ5IGluaXRpYWxpemVkIik7Ci0KLSAgZW5hYmxlZCA9IHRydWU7Ci19Ci0KLS8vIFRlc3QgZnVuY3Rpb24gb25seS4gRG8gbm90IGNhbGwgaW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2Ygb3BlcmF0aW9ucy4KLXZvaWQgYWxsb2NhdGlvbl90cmFja2VyX3VuaW5pdCh2b2lkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayh0cmFja2VyX2xvY2spOwotICBpZiAoIWVuYWJsZWQpIHJldHVybjsKLQotICBhbGxvY2F0aW9ucy5jbGVhcigpOwotICBlbmFibGVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2V0KHZvaWQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHRyYWNrZXJfbG9jayk7Ci0gIGlmICghZW5hYmxlZCkgcmV0dXJuOwotCi0gIGFsbG9jYXRpb25zLmNsZWFyKCk7Ci19Ci0KLXNpemVfdCBhbGxvY2F0aW9uX3RyYWNrZXJfZXhwZWN0X25vX2FsbG9jYXRpb25zKHZvaWQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHRyYWNrZXJfbG9jayk7Ci0gIGlmICghZW5hYmxlZCkgcmV0dXJuIDA7Ci0KLSAgc2l6ZV90IHVuZnJlZWRfbWVtb3J5X3NpemUgPSAwOwotCi0gIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBhbGxvY2F0aW9ucykgewotICAgIGFsbG9jYXRpb25fdCogYWxsb2NhdGlvbiA9IGVudHJ5LnNlY29uZDsKLSAgICBpZiAoIWFsbG9jYXRpb24tPmZyZWVkKSB7Ci0gICAgICB1bmZyZWVkX21lbW9yeV9zaXplICs9Ci0gICAgICAgICAgYWxsb2NhdGlvbi0+c2l6ZTsgIC8vIFJlcG9ydCBiYWNrIHRoZSB1bmZyZWVkIGJ5dGUgY291bnQKLSAgICAgIExPR19FUlJPUigiJXMgZm91bmQgdW5mcmVlZCBhbGxvY2F0aW9uLiBhZGRyZXNzOiAweCV6eCBzaXplOiAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCAodWludHB0cl90KWFsbG9jYXRpb24tPnB0ciwgYWxsb2NhdGlvbi0+c2l6ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHVuZnJlZWRfbWVtb3J5X3NpemU7Ci19Ci0KLXZvaWQqIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfYWxsb2ModWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlcXVlc3RlZF9zaXplKSB7Ci0gIGNoYXIqIHJldHVybl9wdHI7Ci0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sodHJhY2tlcl9sb2NrKTsKLSAgICBpZiAoIWVuYWJsZWQgfHwgIXB0cikgcmV0dXJuIHB0cjsKLQotICAgIC8vIEtlZXAgc3RhdGlzdGljcwotICAgIGFsbG9jX2NvdW50ZXIrKzsKLSAgICBhbGxvY190b3RhbF9zaXplICs9IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShyZXF1ZXN0ZWRfc2l6ZSk7Ci0KLSAgICByZXR1cm5fcHRyID0gKChjaGFyKilwdHIpICsgY2FuYXJ5X3NpemU7Ci0KLSAgICBhdXRvIG1hcF9lbnRyeSA9IGFsbG9jYXRpb25zLmZpbmQocmV0dXJuX3B0cik7Ci0gICAgYWxsb2NhdGlvbl90KiBhbGxvY2F0aW9uOwotICAgIGlmIChtYXBfZW50cnkgIT0gYWxsb2NhdGlvbnMuZW5kKCkpIHsKLSAgICAgIGFsbG9jYXRpb24gPSBtYXBfZW50cnktPnNlY29uZDsKLSAgICAgIENIRUNLKGFsbG9jYXRpb24tPmZyZWVkKTsgIC8vIE11c3QgaGF2ZSBiZWVuIGZyZWVkIGJlZm9yZQotICAgIH0gZWxzZSB7Ci0gICAgICBhbGxvY2F0aW9uID0gKGFsbG9jYXRpb25fdCopY2FsbG9jKDEsIHNpemVvZihhbGxvY2F0aW9uX3QpKTsKLSAgICAgIGFsbG9jYXRpb25zW3JldHVybl9wdHJdID0gYWxsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBhbGxvY2F0aW9uLT5hbGxvY2F0b3JfaWQgPSBhbGxvY2F0b3JfaWQ7Ci0gICAgYWxsb2NhdGlvbi0+ZnJlZWQgPSBmYWxzZTsKLSAgICBhbGxvY2F0aW9uLT5zaXplID0gcmVxdWVzdGVkX3NpemU7Ci0gICAgYWxsb2NhdGlvbi0+cHRyID0gcmV0dXJuX3B0cjsKLSAgfQotCi0gIC8vIEFkZCB0aGUgY2FuYXJ5IG9uIGJvdGggc2lkZXMKLSAgbWVtY3B5KHJldHVybl9wdHIgLSBjYW5hcnlfc2l6ZSwgY2FuYXJ5LCBjYW5hcnlfc2l6ZSk7Ci0gIG1lbWNweShyZXR1cm5fcHRyICsgcmVxdWVzdGVkX3NpemUsIGNhbmFyeSwgY2FuYXJ5X3NpemUpOwotCi0gIHJldHVybiByZXR1cm5fcHRyOwotfQotCi12b2lkKiBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2ZyZWUoVU5VU0VEX0FUVFIgdWludDhfdCBhbGxvY2F0b3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayh0cmFja2VyX2xvY2spOwotCi0gIGlmICghZW5hYmxlZCB8fCAhcHRyKSByZXR1cm4gcHRyOwotCi0gIGF1dG8gbWFwX2VudHJ5ID0gYWxsb2NhdGlvbnMuZmluZChwdHIpOwotICBDSEVDSyhtYXBfZW50cnkgIT0gYWxsb2NhdGlvbnMuZW5kKCkpOwotICBhbGxvY2F0aW9uX3QqIGFsbG9jYXRpb24gPSBtYXBfZW50cnktPnNlY29uZDsKLSAgQ0hFQ0soYWxsb2NhdGlvbik7ICAgICAgICAgIC8vIE11c3QgaGF2ZSBiZWVuIHRyYWNrZWQgYmVmb3JlCi0gIENIRUNLKCFhbGxvY2F0aW9uLT5mcmVlZCk7ICAvLyBNdXN0IG5vdCBiZSBhIGRvdWJsZSBmcmVlCi0gIENIRUNLKGFsbG9jYXRpb24tPmFsbG9jYXRvcl9pZCA9PQotICAgICAgICBhbGxvY2F0b3JfaWQpOyAgLy8gTXVzdCBiZSBmcm9tIHRoZSBzYW1lIGFsbG9jYXRvcgotCi0gIC8vIEtlZXAgc3RhdGlzdGljcwotICBmcmVlX2NvdW50ZXIrKzsKLSAgZnJlZV90b3RhbF9zaXplICs9IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShhbGxvY2F0aW9uLT5zaXplKTsKLQotICBhbGxvY2F0aW9uLT5mcmVlZCA9IHRydWU7Ci0KLSAgVU5VU0VEX0FUVFIgY29uc3QgY2hhciogYmVnaW5uaW5nX2NhbmFyeSA9ICgoY2hhciopcHRyKSAtIGNhbmFyeV9zaXplOwotICBVTlVTRURfQVRUUiBjb25zdCBjaGFyKiBlbmRfY2FuYXJ5ID0gKChjaGFyKilwdHIpICsgYWxsb2NhdGlvbi0+c2l6ZTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbmFyeV9zaXplOyBpKyspIHsKLSAgICBDSEVDSyhiZWdpbm5pbmdfY2FuYXJ5W2ldID09IGNhbmFyeVtpXSk7Ci0gICAgQ0hFQ0soZW5kX2NhbmFyeVtpXSA9PSBjYW5hcnlbaV0pOwotICB9Ci0KLSAgLy8gRnJlZSB0aGUgaGFzaCBtYXAgZW50cnkgdG8gYXZvaWQgdW5saW1pdGVkIG1lbW9yeSB1c2FnZSBncm93dGguCi0gIC8vIERvdWJsZS1mcmVlIG9mIG1lbW9yeSBpcyBkZXRlY3RlZCB3aXRoICJhc3NlcnQoYWxsb2NhdGlvbikiIGFib3ZlCi0gIC8vIGFzIHRoZSBhbGxvY2F0aW9uIGVudHJ5IHdpbGwgbm90IGJlIHByZXNlbnQuCi0gIGFsbG9jYXRpb25zLmVyYXNlKHB0cik7Ci0gIGZyZWUoYWxsb2NhdGlvbik7Ci0KLSAgcmV0dXJuICgoY2hhciopcHRyKSAtIGNhbmFyeV9zaXplOwotfQotCi1zaXplX3QgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2l6ZV9mb3JfY2FuYXJ5KHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiAoIWVuYWJsZWQpID8gc2l6ZSA6IHNpemUgKyAoMiAqIGNhbmFyeV9zaXplKTsKLX0KLQotdm9pZCBvc2lfYWxsb2NhdG9yX2RlYnVnX2R1bXAoaW50IGZkKSB7Ci0gIGRwcmludGYoZmQsICJcbkJsdWV0b290aCBNZW1vcnkgQWxsb2NhdGlvbiBTdGF0aXN0aWNzOlxuIik7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHRyYWNrZXJfbG9jayk7Ci0KLSAgZHByaW50ZihmZCwgIiAgVG90YWwgYWxsb2NhdGVkL2ZyZWUvdXNlZCBjb3VudHMgOiAlenUgLyAlenUgLyAlenVcbiIsCi0gICAgICAgICAgYWxsb2NfY291bnRlciwgZnJlZV9jb3VudGVyLCBhbGxvY19jb3VudGVyIC0gZnJlZV9jb3VudGVyKTsKLSAgZHByaW50ZihmZCwgIiAgVG90YWwgYWxsb2NhdGVkL2ZyZWUvdXNlZCBvY3RldHMgOiAlenUgLyAlenUgLyAlenVcbiIsCi0gICAgICAgICAgYWxsb2NfdG90YWxfc2l6ZSwgZnJlZV90b3RhbF9zaXplLAotICAgICAgICAgIGFsbG9jX3RvdGFsX3NpemUgLSBmcmVlX3RvdGFsX3NpemUpOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy9hbGxvY2F0b3IuY2MgYi9vc2kvc3JjL2FsbG9jYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkZDlkNC4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL2FsbG9jYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRpb25fdHJhY2tlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotCi1zdGF0aWMgY29uc3QgYWxsb2NhdG9yX2lkX3QgYWxsb2NfYWxsb2NhdG9yX2lkID0gNDI7Ci0KLWNoYXIqIG9zaV9zdHJkdXAoY29uc3QgY2hhciogc3RyKSB7Ci0gIHNpemVfdCBzaXplID0gc3RybGVuKHN0cikgKyAxOyAgLy8gKyAxIGZvciB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gIHNpemVfdCByZWFsX3NpemUgPSBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzaXplX2Zvcl9jYW5hcnkoc2l6ZSk7Ci0gIHZvaWQqIHB0ciA9IG1hbGxvYyhyZWFsX3NpemUpOwotICBDSEVDSyhwdHIpOwotCi0gIGNoYXIqIG5ld19zdHJpbmcgPSBzdGF0aWNfY2FzdDxjaGFyKj4oCi0gICAgICBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jX2FsbG9jYXRvcl9pZCwgcHRyLCBzaXplKSk7Ci0gIGlmICghbmV3X3N0cmluZykgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5KG5ld19zdHJpbmcsIHN0ciwgc2l6ZSk7Ci0gIHJldHVybiBuZXdfc3RyaW5nOwotfQotCi1jaGFyKiBvc2lfc3RybmR1cChjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4pIHsKLSAgc2l6ZV90IHNpemUgPSBzdHJsZW4oc3RyKTsKLSAgaWYgKGxlbiA8IHNpemUpIHNpemUgPSBsZW47Ci0KLSAgc2l6ZV90IHJlYWxfc2l6ZSA9IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShzaXplICsgMSk7Ci0gIHZvaWQqIHB0ciA9IG1hbGxvYyhyZWFsX3NpemUpOwotICBDSEVDSyhwdHIpOwotCi0gIGNoYXIqIG5ld19zdHJpbmcgPSBzdGF0aWNfY2FzdDxjaGFyKj4oCi0gICAgICBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jX2FsbG9jYXRvcl9pZCwgcHRyLCBzaXplICsgMSkpOwotICBpZiAoIW5ld19zdHJpbmcpIHJldHVybiBOVUxMOwotCi0gIG1lbWNweShuZXdfc3RyaW5nLCBzdHIsIHNpemUpOwotICBuZXdfc3RyaW5nW3NpemVdID0gJ1wwJzsKLSAgcmV0dXJuIG5ld19zdHJpbmc7Ci19Ci0KLXZvaWQqIG9zaV9tYWxsb2Moc2l6ZV90IHNpemUpIHsKLSAgc2l6ZV90IHJlYWxfc2l6ZSA9IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShzaXplKTsKLSAgdm9pZCogcHRyID0gbWFsbG9jKHJlYWxfc2l6ZSk7Ci0gIENIRUNLKHB0cik7Ci0gIHJldHVybiBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jX2FsbG9jYXRvcl9pZCwgcHRyLCBzaXplKTsKLX0KLQotdm9pZCogb3NpX2NhbGxvYyhzaXplX3Qgc2l6ZSkgewotICBzaXplX3QgcmVhbF9zaXplID0gYWxsb2NhdGlvbl90cmFja2VyX3Jlc2l6ZV9mb3JfY2FuYXJ5KHNpemUpOwotICB2b2lkKiBwdHIgPSBjYWxsb2MoMSwgcmVhbF9zaXplKTsKLSAgQ0hFQ0socHRyKTsKLSAgcmV0dXJuIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfYWxsb2MoYWxsb2NfYWxsb2NhdG9yX2lkLCBwdHIsIHNpemUpOwotfQotCi12b2lkIG9zaV9mcmVlKHZvaWQqIHB0cikgewotICBmcmVlKGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfZnJlZShhbGxvY19hbGxvY2F0b3JfaWQsIHB0cikpOwotfQotCi12b2lkIG9zaV9mcmVlX2FuZF9yZXNldCh2b2lkKiogcF9wdHIpIHsKLSAgQ0hFQ0socF9wdHIgIT0gTlVMTCk7Ci0gIG9zaV9mcmVlKCpwX3B0cik7Ci0gICpwX3B0ciA9IE5VTEw7Ci19Ci0KLWNvbnN0IGFsbG9jYXRvcl90IGFsbG9jYXRvcl9jYWxsb2MgPSB7b3NpX2NhbGxvYywgb3NpX2ZyZWV9OwotCi1jb25zdCBhbGxvY2F0b3JfdCBhbGxvY2F0b3JfbWFsbG9jID0ge29zaV9tYWxsb2MsIG9zaV9mcmVlfTsKLQotT3NpT2JqZWN0OjpPc2lPYmplY3Qodm9pZCogcHRyKSA6IHB0cl8ocHRyKSB7fQotCi1Pc2lPYmplY3Q6Ok9zaU9iamVjdChjb25zdCB2b2lkKiBwdHIpIDogcHRyXyhjb25zdF9jYXN0PHZvaWQqPihwdHIpKSB7fQotCi1Pc2lPYmplY3Q6On5Pc2lPYmplY3QoKSB7Ci0gIGlmIChwdHJfICE9IG51bGxwdHIpIHsKLSAgICBvc2lfZnJlZShwdHJfKTsKLSAgfQotfQotCi12b2lkKiBPc2lPYmplY3Q6OlJlbGVhc2UoKSB7Ci0gIHZvaWQqIHB0ciA9IHB0cl87Ci0gIHB0cl8gPSBudWxscHRyOwotICByZXR1cm4gcHRyOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy9hcnJheS5jYyBiL29zaS9zcmMvYXJyYXkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjhiN2MuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9hcnJheS5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX2FycmF5IgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYXJyYXkuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotc3RydWN0IGFycmF5X3QgewotICBzaXplX3QgZWxlbWVudF9zaXplOwotICBzaXplX3QgbGVuZ3RoOwotICBzaXplX3QgY2FwYWNpdHk7Ci0gIHVpbnQ4X3QqIGRhdGE7Ci0gIHVpbnQ4X3QgaW50ZXJuYWxfc3RvcmFnZVtdOwotfTsKLQotc3RhdGljIGJvb2wgZ3JvdyhhcnJheV90KiBhcnJheSk7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgSU5URVJOQUxfRUxFTUVOVFMgPSAxNjsKLQotYXJyYXlfdCogYXJyYXlfbmV3KHNpemVfdCBlbGVtZW50X3NpemUpIHsKLSAgQ0hFQ0soZWxlbWVudF9zaXplID4gMCk7Ci0KLSAgYXJyYXlfdCogYXJyYXkgPSBzdGF0aWNfY2FzdDxhcnJheV90Kj4oCi0gICAgICBvc2lfY2FsbG9jKHNpemVvZihhcnJheV90KSArIGVsZW1lbnRfc2l6ZSAqIElOVEVSTkFMX0VMRU1FTlRTKSk7Ci0KLSAgYXJyYXktPmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLSAgYXJyYXktPmNhcGFjaXR5ID0gSU5URVJOQUxfRUxFTUVOVFM7Ci0gIGFycmF5LT5kYXRhID0gYXJyYXktPmludGVybmFsX3N0b3JhZ2U7Ci0gIHJldHVybiBhcnJheTsKLX0KLQotdm9pZCBhcnJheV9mcmVlKGFycmF5X3QqIGFycmF5KSB7Ci0gIGlmICghYXJyYXkpIHJldHVybjsKLQotICBpZiAoYXJyYXktPmRhdGEgIT0gYXJyYXktPmludGVybmFsX3N0b3JhZ2UpIGZyZWUoYXJyYXktPmRhdGEpOwotCi0gIG9zaV9mcmVlKGFycmF5KTsKLX0KLQotdm9pZCogYXJyYXlfcHRyKGNvbnN0IGFycmF5X3QqIGFycmF5KSB7IHJldHVybiBhcnJheV9hdChhcnJheSwgMCk7IH0KLQotdm9pZCogYXJyYXlfYXQoY29uc3QgYXJyYXlfdCogYXJyYXksIHNpemVfdCBpbmRleCkgewotICBDSEVDSyhhcnJheSAhPSBOVUxMKTsKLSAgQ0hFQ0soaW5kZXggPCBhcnJheS0+bGVuZ3RoKTsKLSAgcmV0dXJuIGFycmF5LT5kYXRhICsgKGluZGV4ICogYXJyYXktPmVsZW1lbnRfc2l6ZSk7Ci19Ci0KLXNpemVfdCBhcnJheV9sZW5ndGgoY29uc3QgYXJyYXlfdCogYXJyYXkpIHsKLSAgQ0hFQ0soYXJyYXkgIT0gTlVMTCk7Ci0gIHJldHVybiBhcnJheS0+bGVuZ3RoOwotfQotCi1ib29sIGFycmF5X2FwcGVuZF92YWx1ZShhcnJheV90KiBhcnJheSwgdWludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIGFycmF5X2FwcGVuZF9wdHIoYXJyYXksICZ2YWx1ZSk7Ci19Ci0KLWJvb2wgYXJyYXlfYXBwZW5kX3B0cihhcnJheV90KiBhcnJheSwgdm9pZCogZGF0YSkgewotICBDSEVDSyhhcnJheSAhPSBOVUxMKTsKLSAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLQotICBpZiAoYXJyYXktPmxlbmd0aCA9PSBhcnJheS0+Y2FwYWNpdHkgJiYgIWdyb3coYXJyYXkpKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXMgdW5hYmxlIHRvIGdyb3cgYXJyYXkgcGFzdCBjdXJyZW50IGNhcGFjaXR5IG9mICV6dSBlbGVtZW50cyAiCi0gICAgICAgICJvZiBzaXplICV6dS4iLAotICAgICAgICBfX2Z1bmNfXywgYXJyYXktPmNhcGFjaXR5LCBhcnJheS0+ZWxlbWVudF9zaXplKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICArK2FycmF5LT5sZW5ndGg7Ci0gIG1lbWNweShhcnJheV9hdChhcnJheSwgYXJyYXktPmxlbmd0aCAtIDEpLCBkYXRhLCBhcnJheS0+ZWxlbWVudF9zaXplKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGdyb3coYXJyYXlfdCogYXJyYXkpIHsKLSAgY29uc3Qgc2l6ZV90IG5ld19jYXBhY2l0eSA9IGFycmF5LT5jYXBhY2l0eSArIChhcnJheS0+Y2FwYWNpdHkgLyAyKTsKLSAgY29uc3QgYm9vbCBpc19tb3ZpbmcgPSAoYXJyYXktPmRhdGEgPT0gYXJyYXktPmludGVybmFsX3N0b3JhZ2UpOwotCi0gIHZvaWQqIG5ld19kYXRhID0gcmVhbGxvYyhpc19tb3ZpbmcgPyBOVUxMIDogYXJyYXktPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY2FwYWNpdHkgKiBhcnJheS0+ZWxlbWVudF9zaXplKTsKLSAgaWYgKCFuZXdfZGF0YSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpc19tb3ZpbmcpCi0gICAgbWVtY3B5KG5ld19kYXRhLCBhcnJheS0+aW50ZXJuYWxfc3RvcmFnZSwKLSAgICAgICAgICAgYXJyYXktPmxlbmd0aCAqIGFycmF5LT5lbGVtZW50X3NpemUpOwotCi0gIGFycmF5LT5kYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KG5ld19kYXRhKTsKLSAgYXJyYXktPmNhcGFjaXR5ID0gbmV3X2NhcGFjaXR5OwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvYnVmZmVyLmNjIGIvb3NpL3NyYy9idWZmZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmViZmEuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9idWZmZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX2J1ZmZlciIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2J1ZmZlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotCi1zdHJ1Y3QgYnVmZmVyX3QgewotICBidWZmZXJfdCogcm9vdDsKLSAgc2l6ZV90IHJlZmNvdW50OwotICBzaXplX3QgbGVuZ3RoOwotICB1aW50OF90IGRhdGFbXTsKLX07Ci0KLWJ1ZmZlcl90KiBidWZmZXJfbmV3KHNpemVfdCBzaXplKSB7Ci0gIENIRUNLKHNpemUgPiAwKTsKLQotICBidWZmZXJfdCogYnVmZmVyID0KLSAgICAgIHN0YXRpY19jYXN0PGJ1ZmZlcl90Kj4ob3NpX2NhbGxvYyhzaXplb2YoYnVmZmVyX3QpICsgc2l6ZSkpOwotCi0gIGJ1ZmZlci0+cm9vdCA9IGJ1ZmZlcjsKLSAgYnVmZmVyLT5yZWZjb3VudCA9IDE7Ci0gIGJ1ZmZlci0+bGVuZ3RoID0gc2l6ZTsKLQotICByZXR1cm4gYnVmZmVyOwotfQotCi1idWZmZXJfdCogYnVmZmVyX25ld19yZWYoY29uc3QgYnVmZmVyX3QqIGJ1ZikgewotICBDSEVDSyhidWYgIT0gTlVMTCk7Ci0gIHJldHVybiBidWZmZXJfbmV3X3NsaWNlKGJ1ZiwgYnVmLT5sZW5ndGgpOwotfQotCi1idWZmZXJfdCogYnVmZmVyX25ld19zbGljZShjb25zdCBidWZmZXJfdCogYnVmLCBzaXplX3Qgc2xpY2Vfc2l6ZSkgewotICBDSEVDSyhidWYgIT0gTlVMTCk7Ci0gIENIRUNLKHNsaWNlX3NpemUgPiAwKTsKLSAgQ0hFQ0soc2xpY2Vfc2l6ZSA8PSBidWYtPmxlbmd0aCk7Ci0KLSAgYnVmZmVyX3QqIHJldCA9IHN0YXRpY19jYXN0PGJ1ZmZlcl90Kj4ob3NpX2NhbGxvYyhzaXplb2YoYnVmZmVyX3QpKSk7Ci0KLSAgcmV0LT5yb290ID0gYnVmLT5yb290OwotICByZXQtPnJlZmNvdW50ID0gU0laRV9NQVg7Ci0gIHJldC0+bGVuZ3RoID0gc2xpY2Vfc2l6ZTsKLQotICArK2J1Zi0+cm9vdC0+cmVmY291bnQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBidWZmZXJfZnJlZShidWZmZXJfdCogYnVmZmVyKSB7Ci0gIGlmICghYnVmZmVyKSByZXR1cm47Ci0KLSAgaWYgKGJ1ZmZlci0+cm9vdCAhPSBidWZmZXIpIHsKLSAgICAvLyBXZSdyZSBhIGxlYWYgbm9kZS4gRGVsZXRlIHRoZSByb290IG5vZGUgaWYgd2UncmUgdGhlIGxhc3QgcmVmZXJlbnQuCi0gICAgaWYgKC0tYnVmZmVyLT5yb290LT5yZWZjb3VudCA9PSAwKSBvc2lfZnJlZShidWZmZXItPnJvb3QpOwotICAgIG9zaV9mcmVlKGJ1ZmZlcik7Ci0gIH0gZWxzZSBpZiAoLS1idWZmZXItPnJlZmNvdW50ID09IDApIHsKLSAgICAvLyBXZSdyZSBhIHJvb3Qgbm9kZS4gUm9vdHMgYXJlIG9ubHkgZGVsZXRlZCB3aGVuIHRoZWlyIHJlZmNvdW50IGdvZXMgdG8gMC4KLSAgICBvc2lfZnJlZShidWZmZXIpOwotICB9Ci19Ci0KLXZvaWQqIGJ1ZmZlcl9wdHIoY29uc3QgYnVmZmVyX3QqIGJ1ZikgewotICBDSEVDSyhidWYgIT0gTlVMTCk7Ci0gIHJldHVybiBidWYtPnJvb3QtPmRhdGEgKyBidWYtPnJvb3QtPmxlbmd0aCAtIGJ1Zi0+bGVuZ3RoOwotfQotCi1zaXplX3QgYnVmZmVyX2xlbmd0aChjb25zdCBidWZmZXJfdCogYnVmKSB7Ci0gIENIRUNLKGJ1ZiAhPSBOVUxMKTsKLSAgcmV0dXJuIGJ1Zi0+bGVuZ3RoOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy9jb21wYXQuY2MgYi9vc2kvc3JjL2NvbXBhdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDFhNS4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL2NvbXBhdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIGNvbXBhdC5jYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBDb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyBmb3Igbm9uLWJpb25pYyBDIGxpYnJhcmllcwotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLSNpZiBfX0dMSUJDX18KLXBpZF90IGdldHRpZCh2b2lkKSB0aHJvdygpIHsgcmV0dXJuIHN5c2NhbGwoU1lTX2dldHRpZCk7IH0KLSNlbmRpZgotCi0vKiBUaGVzZSBmdW5jdGlvbnMgZnJvbSBiaW9uaWMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTggVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmIF9fR0xJQkNfXwotLyoKLSAqIENvcHkgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXouICBBdCBtb3N0IHNpei0xIGNoYXJhY3RlcnMKLSAqIHdpbGwgYmUgY29waWVkLiAgQWx3YXlzIE5VTCB0ZXJtaW5hdGVzICh1bmxlc3Mgc2l6ID09IDApLgotICogUmV0dXJucyBzdHJsZW4oc3JjKTsgaWYgcmV0dmFsID49IHNpeiwgdHJ1bmNhdGlvbiBvY2N1cnJlZC4KLSAqLwotc2l6ZV90IHN0cmxjcHkoY2hhciogZHN0LCBjb25zdCBjaGFyKiBzcmMsIHNpemVfdCBzaXopIHsKLSAgY2hhciogZCA9IGRzdDsKLSAgY29uc3QgY2hhciogcyA9IHNyYzsKLSAgc2l6ZV90IG4gPSBzaXo7Ci0KLSAgLyogQ29weSBhcyBtYW55IGJ5dGVzIGFzIHdpbGwgZml0ICovCi0gIGlmIChuICE9IDApIHsKLSAgICB3aGlsZSAoLS1uICE9IDApIHsKLSAgICAgIGlmICgoKmQrKyA9ICpzKyspID09ICdcMCcpIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8qIE5vdCBlbm91Z2ggcm9vbSBpbiBkc3QsIGFkZCBOVUwgYW5kIHRyYXZlcnNlIHJlc3Qgb2Ygc3JjICovCi0gIGlmIChuID09IDApIHsKLSAgICBpZiAoc2l6ICE9IDApICpkID0gJ1wwJzsgLyogTlVMLXRlcm1pbmF0ZSBkc3QgKi8KLSAgICB3aGlsZSAoKnMrKykKLSAgICAgIDsKLSAgfQotCi0gIHJldHVybiAocyAtIHNyYyAtIDEpOyAvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLwotfQotI2VuZGlmCi0KLSNpZiBfX0dMSUJDX18KLS8qCi0gKiBBcHBlbmRzIHNyYyB0byBzdHJpbmcgZHN0IG9mIHNpemUgc2l6ICh1bmxpa2Ugc3RybmNhdCwgc2l6IGlzIHRoZQotICogZnVsbCBzaXplIG9mIGRzdCwgbm90IHNwYWNlIGxlZnQpLiAgQXQgbW9zdCBzaXotMSBjaGFyYWN0ZXJzCi0gKiB3aWxsIGJlIGNvcGllZC4gIEFsd2F5cyBOVUwgdGVybWluYXRlcyAodW5sZXNzIHNpeiA8PSBzdHJsZW4oZHN0KSkuCi0gKiBSZXR1cm5zIHN0cmxlbihzcmMpICsgTUlOKHNpeiwgc3RybGVuKGluaXRpYWwgZHN0KSkuCi0gKiBJZiByZXR2YWwgPj0gc2l6LCB0cnVuY2F0aW9uIG9jY3VycmVkLgotICovCi1zaXplX3Qgc3RybGNhdChjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNpeikgewotICBjaGFyKiBkID0gZHN0OwotICBjb25zdCBjaGFyKiBzID0gc3JjOwotICBzaXplX3QgbiA9IHNpejsKLSAgc2l6ZV90IGRsZW47Ci0KLSAgLyogRmluZCB0aGUgZW5kIG9mIGRzdCBhbmQgYWRqdXN0IGJ5dGVzIGxlZnQgYnV0IGRvbid0IGdvIHBhc3QgZW5kICovCi0gIHdoaWxlIChuLS0gIT0gMCAmJiAqZCAhPSAnXDAnKSBkKys7Ci0gIGRsZW4gPSBkIC0gZHN0OwotICBuID0gc2l6IC0gZGxlbjsKLQotICBpZiAobiA9PSAwKSByZXR1cm4gKGRsZW4gKyBzdHJsZW4ocykpOwotCi0gIHdoaWxlICgqcyAhPSAnXDAnKSB7Ci0gICAgaWYgKG4gIT0gMSkgewotICAgICAgKmQrKyA9ICpzOwotICAgICAgbi0tOwotICAgIH0KLQotICAgIHMrKzsKLSAgfQotCi0gICpkID0gJ1wwJzsKLQotICByZXR1cm4gKGRsZW4gKyAocyAtIHNyYykpOyAvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9vc2kvc3JjL2NvbmZpZy5jYyBiL29zaS9zcmMvY29uZmlnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM2OTVjLi4wMDAwMDAwCi0tLSBhL29zaS9zcmMvY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb25maWcuaCIKLQotI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZ2VuLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotCi12b2lkIHNlY3Rpb25fdDo6U2V0KHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpIHsKLSAgZm9yIChlbnRyeV90JiBlbnRyeSA6IGVudHJpZXMpIHsKLSAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgLy8gYWRkIGEgbmV3IGtleSB0byB0aGUgc2VjdGlvbgotICBlbnRyaWVzLmVtcGxhY2VfYmFjaygKLSAgICAgIGVudHJ5X3R7LmtleSA9IHN0ZDo6bW92ZShrZXkpLCAudmFsdWUgPSBzdGQ6Om1vdmUodmFsdWUpfSk7Ci19Ci0KLXN0ZDo6bGlzdDxlbnRyeV90Pjo6aXRlcmF0b3Igc2VjdGlvbl90OjpGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgcmV0dXJuIHN0ZDo6ZmluZF9pZigKLSAgICAgIGVudHJpZXMuYmVnaW4oKSwgZW50cmllcy5lbmQoKSwKLSAgICAgIFsma2V5XShjb25zdCBlbnRyeV90JiBlbnRyeSkgeyByZXR1cm4gZW50cnkua2V5ID09IGtleTsgfSk7Ci19Ci0KLWJvb2wgc2VjdGlvbl90OjpIYXMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICByZXR1cm4gRmluZChrZXkpICE9IGVudHJpZXMuZW5kKCk7Ci19Ci0KLXN0ZDo6bGlzdDxzZWN0aW9uX3Q+OjppdGVyYXRvciBjb25maWdfdDo6RmluZChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICByZXR1cm4gc3RkOjpmaW5kX2lmKAotICAgICAgc2VjdGlvbnMuYmVnaW4oKSwgc2VjdGlvbnMuZW5kKCksCi0gICAgICBbJnNlY3Rpb25dKGNvbnN0IHNlY3Rpb25fdCYgc2VjKSB7IHJldHVybiBzZWMubmFtZSA9PSBzZWN0aW9uOyB9KTsKLX0KLQotYm9vbCBjb25maWdfdDo6SGFzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgcmV0dXJuIEZpbmQoa2V5KSAhPSBzZWN0aW9ucy5lbmQoKTsKLX0KLQotc3RhdGljIGJvb2wgY29uZmlnX3BhcnNlKEZJTEUqIGZwLCBjb25maWdfdCogY29uZmlnKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsCi0gICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8Ci0gICAgICAgICAgICAgIGNvbmZpZ190LCB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxUPjo6dHlwZT46OnZhbHVlPj4KLXN0YXRpYyBhdXRvIHNlY3Rpb25fZmluZChUJiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSB7Ci0gIHJldHVybiBzdGQ6OmZpbmRfaWYoCi0gICAgICBjb25maWcuc2VjdGlvbnMuYmVnaW4oKSwgY29uZmlnLnNlY3Rpb25zLmVuZCgpLAotICAgICAgWyZzZWN0aW9uXShjb25zdCBzZWN0aW9uX3QmIHNlYykgeyByZXR1cm4gc2VjLm5hbWUgPT0gc2VjdGlvbjsgfSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBlbnRyeV90KiBlbnRyeV9maW5kKGNvbnN0IGNvbmZpZ190JiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgYXV0byBzZWMgPSBzZWN0aW9uX2ZpbmQoY29uZmlnLCBzZWN0aW9uKTsKLSAgaWYgKHNlYyA9PSBjb25maWcuc2VjdGlvbnMuZW5kKCkpIHJldHVybiBudWxscHRyOwotCi0gIGZvciAoY29uc3QgZW50cnlfdCYgZW50cnkgOiBzZWMtPmVudHJpZXMpIHsKLSAgICBpZiAoZW50cnkua2V5ID09IGtleSkgcmV0dXJuICZlbnRyeTsKLSAgfQotCi0gIHJldHVybiBudWxscHRyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZ19uZXdfZW1wdHkodm9pZCkgewotICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxjb25maWdfdD4oKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3KGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIENIRUNLKGZpbGVuYW1lICE9IG51bGxwdHIpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnID0gY29uZmlnX25ld19lbXB0eSgpOwotCi0gIEZJTEUqIGZwID0gZm9wZW4oZmlsZW5hbWUsICJydCIpOwotICBpZiAoIWZwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gb3BlbiBmaWxlICciIDw8IGZpbGVuYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoIWNvbmZpZ19wYXJzZShmcCwgY29uZmlnLmdldCgpKSkgewotICAgIGNvbmZpZy5yZXNldCgpOwotICB9Ci0KLSAgZmNsb3NlKGZwKTsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLQotc3RkOjpzdHJpbmcgY2hlY2tzdW1fcmVhZChjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICBiYXNlOjpGaWxlUGF0aCBwYXRoKGZpbGVuYW1lKTsKLSAgaWYgKCFiYXNlOjpQYXRoRXhpc3RzKHBhdGgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gbG9jYXRlIGZpbGUgJyIgPDwgZmlsZW5hbWUgPDwgIiciOwotICAgIHJldHVybiAiIjsKLSAgfQotICBzdGQ6OnN0cmluZyBlbmNyeXB0ZWRfaGFzaDsKLSAgaWYgKCFiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZlbmNyeXB0ZWRfaGFzaCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byByZWFkIGZpbGUgJyIgPDwgZmlsZW5hbWUgPDwgIiciOwotICB9Ci0gIHJldHVybiBlbmNyeXB0ZWRfaGFzaDsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3X2Nsb25lKGNvbnN0IGNvbmZpZ190JiBzcmMpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiByZXQgPSBjb25maWdfbmV3X2VtcHR5KCk7Ci0KLSAgZm9yIChjb25zdCBzZWN0aW9uX3QmIHNlYyA6IHNyYy5zZWN0aW9ucykgewotICAgIGZvciAoY29uc3QgZW50cnlfdCYgZW50cnkgOiBzZWMuZW50cmllcykgewotICAgICAgY29uZmlnX3NldF9zdHJpbmcocmV0LmdldCgpLCBzZWMubmFtZSwgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotYm9vbCBjb25maWdfaGFzX3NlY3Rpb24oY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgcmV0dXJuIChzZWN0aW9uX2ZpbmQoY29uZmlnLCBzZWN0aW9uKSAhPSBjb25maWcuc2VjdGlvbnMuZW5kKCkpOwotfQotCi1ib29sIGNvbmZpZ19oYXNfa2V5KGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIHJldHVybiAoZW50cnlfZmluZChjb25maWcsIHNlY3Rpb24sIGtleSkgIT0gbnVsbHB0cik7Ci19Ci0KLWludCBjb25maWdfZ2V0X2ludChjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgZGVmX3ZhbHVlKSB7Ci0gIGNvbnN0IGVudHJ5X3QqIGVudHJ5ID0gZW50cnlfZmluZChjb25maWcsIHNlY3Rpb24sIGtleSk7Ci0gIGlmICghZW50cnkpIHJldHVybiBkZWZfdmFsdWU7Ci0KLSAgY2hhciogZW5kcHRyOwotICBpbnQgcmV0ID0gc3RydG9sKGVudHJ5LT52YWx1ZS5jX3N0cigpLCAmZW5kcHRyLCAwKTsKLSAgcmV0dXJuICgqZW5kcHRyID09ICdcMCcpID8gcmV0IDogZGVmX3ZhbHVlOwotfQotCi11aW50NjRfdCBjb25maWdfZ2V0X3VpbnQ2NChjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHVpbnQ2NF90IGRlZl92YWx1ZSkgewotICBjb25zdCBlbnRyeV90KiBlbnRyeSA9IGVudHJ5X2ZpbmQoY29uZmlnLCBzZWN0aW9uLCBrZXkpOwotICBpZiAoIWVudHJ5KSByZXR1cm4gZGVmX3ZhbHVlOwotCi0gIGNoYXIqIGVuZHB0cjsKLSAgdWludDY0X3QgcmV0ID0gc3RydG91bGwoZW50cnktPnZhbHVlLmNfc3RyKCksICZlbmRwdHIsIDApOwotICByZXR1cm4gKCplbmRwdHIgPT0gJ1wwJykgPyByZXQgOiBkZWZfdmFsdWU7Ci19Ci0KLWJvb2wgY29uZmlnX2dldF9ib29sKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgYm9vbCBkZWZfdmFsdWUpIHsKLSAgY29uc3QgZW50cnlfdCogZW50cnkgPSBlbnRyeV9maW5kKGNvbmZpZywgc2VjdGlvbiwga2V5KTsKLSAgaWYgKCFlbnRyeSkgcmV0dXJuIGRlZl92YWx1ZTsKLQotICBpZiAoZW50cnktPnZhbHVlID09ICJ0cnVlIikgcmV0dXJuIHRydWU7Ci0gIGlmIChlbnRyeS0+dmFsdWUgPT0gImZhbHNlIikgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBkZWZfdmFsdWU7Ci19Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nKiBjb25maWdfZ2V0X3N0cmluZyhjb25zdCBjb25maWdfdCYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcqIGRlZl92YWx1ZSkgewotICBjb25zdCBlbnRyeV90KiBlbnRyeSA9IGVudHJ5X2ZpbmQoY29uZmlnLCBzZWN0aW9uLCBrZXkpOwotICBpZiAoIWVudHJ5KSByZXR1cm4gZGVmX3ZhbHVlOwotCi0gIHJldHVybiAmZW50cnktPnZhbHVlOwotfQotCi12b2lkIGNvbmZpZ19zZXRfaW50KGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsKLSAgY29uZmlnX3NldF9zdHJpbmcoY29uZmlnLCBzZWN0aW9uLCBrZXksIHN0ZDo6dG9fc3RyaW5nKHZhbHVlKSk7Ci19Ci0KLXZvaWQgY29uZmlnX3NldF91aW50NjQoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHVpbnQ2NF90IHZhbHVlKSB7Ci0gIGNvbmZpZ19zZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwga2V5LCBzdGQ6OnRvX3N0cmluZyh2YWx1ZSkpOwotfQotCi12b2lkIGNvbmZpZ19zZXRfYm9vbChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgdmFsdWUpIHsKLSAgY29uZmlnX3NldF9zdHJpbmcoY29uZmlnLCBzZWN0aW9uLCBrZXksIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci19Ci0KLXZvaWQgY29uZmlnX3NldF9zdHJpbmcoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBDSEVDSyhjb25maWcpOwotCi0gIGF1dG8gc2VjID0gc2VjdGlvbl9maW5kKCpjb25maWcsIHNlY3Rpb24pOwotICBpZiAoc2VjID09IGNvbmZpZy0+c2VjdGlvbnMuZW5kKCkpIHsKLSAgICBjb25maWctPnNlY3Rpb25zLmVtcGxhY2VfYmFjayhzZWN0aW9uX3R7Lm5hbWUgPSBzZWN0aW9ufSk7Ci0gICAgc2VjID0gc3RkOjpwcmV2KGNvbmZpZy0+c2VjdGlvbnMuZW5kKCkpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdmFsdWVfbm9fbmV3bGluZTsKLSAgc2l6ZV90IG5ld2xpbmVfcG9zaXRpb24gPSB2YWx1ZS5maW5kKCdcbicpOwotICBpZiAobmV3bGluZV9wb3NpdGlvbiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA4MDgyNzMiKTsKLSAgICB2YWx1ZV9ub19uZXdsaW5lID0gdmFsdWUuc3Vic3RyKDAsIG5ld2xpbmVfcG9zaXRpb24pOwotICB9IGVsc2UgewotICAgIHZhbHVlX25vX25ld2xpbmUgPSB2YWx1ZTsKLSAgfQotCi0gIGZvciAoZW50cnlfdCYgZW50cnkgOiBzZWMtPmVudHJpZXMpIHsKLSAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZV9ub19uZXdsaW5lOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHNlYy0+ZW50cmllcy5lbXBsYWNlX2JhY2soZW50cnlfdHsua2V5ID0ga2V5LCAudmFsdWUgPSB2YWx1ZV9ub19uZXdsaW5lfSk7Ci19Ci0KLWJvb2wgY29uZmlnX3JlbW92ZV9zZWN0aW9uKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSB7Ci0gIENIRUNLKGNvbmZpZyk7Ci0KLSAgYXV0byBzZWMgPSBzZWN0aW9uX2ZpbmQoKmNvbmZpZywgc2VjdGlvbik7Ci0gIGlmIChzZWMgPT0gY29uZmlnLT5zZWN0aW9ucy5lbmQoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGNvbmZpZy0+c2VjdGlvbnMuZXJhc2Uoc2VjKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgY29uZmlnX3JlbW92ZV9rZXkoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgQ0hFQ0soY29uZmlnKTsKLSAgYXV0byBzZWMgPSBzZWN0aW9uX2ZpbmQoKmNvbmZpZywgc2VjdGlvbik7Ci0gIGlmIChzZWMgPT0gY29uZmlnLT5zZWN0aW9ucy5lbmQoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoYXV0byBlbnRyeSA9IHNlYy0+ZW50cmllcy5iZWdpbigpOyBlbnRyeSAhPSBzZWMtPmVudHJpZXMuZW5kKCk7Ci0gICAgICAgKytlbnRyeSkgewotICAgIGlmIChlbnRyeS0+a2V5ID09IGtleSkgewotICAgICAgc2VjLT5lbnRyaWVzLmVyYXNlKGVudHJ5KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBjb25maWdfc2F2ZShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKLSAgQ0hFQ0soIWZpbGVuYW1lLmVtcHR5KCkpOwotCi0gIC8vIFN0ZXBzIHRvIGVuc3VyZSBjb250ZW50IG9mIGNvbmZpZyBmaWxlIGdldHMgdG8gZGlzazoKLSAgLy8KLSAgLy8gMSkgT3BlbiBhbmQgd3JpdGUgdG8gdGVtcCBmaWxlIChlLmcuIGJ0X2NvbmZpZy5jb25mLm5ldykuCi0gIC8vIDIpIEZsdXNoIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHRoZSB0ZW1wIGZpbGUuCi0gIC8vIDMpIFN5bmMgdGhlIHRlbXAgZmlsZSB0byBkaXNrIHdpdGggZnN5bmMoKS4KLSAgLy8gNCkgUmVuYW1lIHRlbXAgZmlsZSB0byBhY3R1YWwgY29uZmlnIGZpbGUgKGUuZy4gYnRfY29uZmlnLmNvbmYpLgotICAvLyAgICBUaGlzIGVuc3VyZXMgYXRvbWljIHVwZGF0ZS4KLSAgLy8gNSkgU3luYyBkaXJlY3RvcnkgdGhhdCBoYXMgdGhlIGNvbmYgZmlsZSB3aXRoIGZzeW5jKCkuCi0gIC8vICAgIFRoaXMgZW5zdXJlcyBkaXJlY3RvcnkgZW50cmllcyBhcmUgdXAtdG8tZGF0ZS4KLSAgaW50IGRpcl9mZCA9IC0xOwotICBGSUxFKiBmcCA9IG51bGxwdHI7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNlcmlhbGl6ZWQ7Ci0KLSAgLy8gQnVpbGQgdGVtcCBjb25maWcgZmlsZSBiYXNlZCBvbiBjb25maWcgZmlsZSAoZS5nLiBidF9jb25maWcuY29uZi5uZXcpLgotICBjb25zdCBzdGQ6OnN0cmluZyB0ZW1wX2ZpbGVuYW1lID0gZmlsZW5hbWUgKyAiLm5ldyI7Ci0KLSAgLy8gRXh0cmFjdCBkaXJlY3RvcnkgZnJvbSBmaWxlIHBhdGggKGUuZy4gL2RhdGEvbWlzYy9ibHVlZHJvaWQpLgotICBjb25zdCBzdGQ6OnN0cmluZyBkaXJlY3RvcnluYW1lID0gYmFzZTo6RmlsZVBhdGgoZmlsZW5hbWUpLkRpck5hbWUoKS52YWx1ZSgpOwotICBpZiAoZGlyZWN0b3J5bmFtZS5lbXB0eSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBlcnJvciBleHRyYWN0aW5nIGRpcmVjdG9yeSBmcm9tICciIDw8IGZpbGVuYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIGRpcl9mZCA9IG9wZW4oZGlyZWN0b3J5bmFtZS5jX3N0cigpLCBPX1JET05MWSk7Ci0gIGlmIChkaXJfZmQgPCAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gb3BlbiBkaXIgJyIgPDwgZGlyZWN0b3J5bmFtZQotICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBmcCA9IGZvcGVuKHRlbXBfZmlsZW5hbWUuY19zdHIoKSwgInd0Iik7Ci0gIGlmICghZnApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byB3cml0ZSB0byBmaWxlICciIDw8IHRlbXBfZmlsZW5hbWUKLSAgICAgICAgICAgICAgIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgZm9yIChjb25zdCBzZWN0aW9uX3QmIHNlY3Rpb24gOiBjb25maWcuc2VjdGlvbnMpIHsKLSAgICBzZXJpYWxpemVkIDw8ICJbIiA8PCBzZWN0aW9uLm5hbWUgPDwgIl0iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGZvciAoY29uc3QgZW50cnlfdCYgZW50cnkgOiBzZWN0aW9uLmVudHJpZXMpCi0gICAgICBzZXJpYWxpemVkIDw8IGVudHJ5LmtleSA8PCAiID0gIiA8PCBlbnRyeS52YWx1ZSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBzZXJpYWxpemVkIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0gIGlmIChmcHJpbnRmKGZwLCAiJXMiLCBzZXJpYWxpemVkLnN0cigpLmNfc3RyKCkpIDwgMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJyIgPDwgdGVtcF9maWxlbmFtZQotICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgc3RyZWFtIGJ1ZmZlciB0byB0aGUgdGVtcCBmaWxlLgotICBpZiAoZmZsdXNoKGZwKSA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byB3cml0ZSBmbHVzaCBidWZmZXIgdG8gZmlsZSAnIgotICAgICAgICAgICAgICAgPDwgdGVtcF9maWxlbmFtZSA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIC8vIFN5bmMgd3JpdHRlbiB0ZW1wIGZpbGUgb3V0IHRvIGRpc2suIGZzeW5jKCkgaXMgYmxvY2tpbmcgdW50aWwgZGF0YSBtYWtlcyBpdAotICAvLyB0byBkaXNrLgotICBpZiAoZnN5bmMoZmlsZW5vKGZwKSkgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBmc3luYyBmaWxlICciIDw8IHRlbXBfZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICB9Ci0KLSAgaWYgKGZjbG9zZShmcCkgPT0gRU9GKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gY2xvc2UgZmlsZSAnIiA8PCB0ZW1wX2ZpbGVuYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBmcCA9IG51bGxwdHI7Ci0KLSAgLy8gQ2hhbmdlIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgdG8gUmVhZC9Xcml0ZSBieSBVc2VyIGFuZCBHcm91cAotICBpZiAoY2htb2QodGVtcF9maWxlbmFtZS5jX3N0cigpLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQKSA9PQotICAgICAgLTEpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBjaGFuZ2UgZmlsZSBwZXJtaXNzaW9ucyAnIgotICAgICAgICAgICAgICAgPDwgZmlsZW5hbWUgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICAvLyBSZW5hbWUgd3JpdHRlbiB0ZW1wIGZpbGUgdG8gdGhlIGFjdHVhbCBjb25maWcgZmlsZS4KLSAgaWYgKHJlbmFtZSh0ZW1wX2ZpbGVuYW1lLmNfc3RyKCksIGZpbGVuYW1lLmNfc3RyKCkpID09IC0xKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gY29tbWl0IGZpbGUgJyIgPDwgZmlsZW5hbWUKLSAgICAgICAgICAgICAgIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgLy8gVGhpcyBzaG91bGQgZW5zdXJlIHRoZSBkaXJlY3RvcnkgaXMgdXBkYXRlZCBhcyB3ZWxsLgotICBpZiAoZnN5bmMoZGlyX2ZkKSA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIGZzeW5jIGRpciAnIiA8PCBkaXJlY3RvcnluYW1lCi0gICAgICAgICAgICAgICAgIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfQotCi0gIGlmIChjbG9zZShkaXJfZmQpIDwgMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIGNsb3NlIGRpciAnIiA8PCBkaXJlY3RvcnluYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcjoKLSAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlcmUgaXMgYSB3cml0ZSBpc3N1ZS4gIFVubGluayBhcyBwYXJ0aWFsIGRhdGEgaXMgbm90Ci0gIC8vIGFjY2VwdGFibGUuCi0gIHVubGluayh0ZW1wX2ZpbGVuYW1lLmNfc3RyKCkpOwotICBpZiAoZnApIGZjbG9zZShmcCk7Ci0gIGlmIChkaXJfZmQgIT0gLTEpIGNsb3NlKGRpcl9mZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBjaGVja3N1bV9zYXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGVja3N1bSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIENIRUNLKCFjaGVja3N1bS5lbXB0eSgpKSA8PCBfX2Z1bmNfXyA8PCAiOiBjaGVja3N1bSBjYW5ub3QgYmUgZW1wdHkiOwotICBDSEVDSyghZmlsZW5hbWUuZW1wdHkoKSkgPDwgX19mdW5jX18gPDwgIjogZmlsZW5hbWUgY2Fubm90IGJlIGVtcHR5IjsKLQotICAvLyBTdGVwcyB0byBlbnN1cmUgY29udGVudCBvZiBjb25maWcgY2hlY2tzdW0gZmlsZSBnZXRzIHRvIGRpc2s6Ci0gIC8vCi0gIC8vIDEpIE9wZW4gYW5kIHdyaXRlIHRvIHRlbXAgZmlsZSAoZS5nLgotICAvLyBidF9jb25maWcuY29uZi5lbmNyeXB0ZWQtY2hlY2tzdW0ubmV3KS4gMikgU3luYyB0aGUgdGVtcCBmaWxlIHRvIGRpc2sgd2l0aAotICAvLyBmc3luYygpLiAzKSBSZW5hbWUgdGVtcCBmaWxlIHRvIGFjdHVhbCBjb25maWcgY2hlY2tzdW0gZmlsZSAoZS5nLgotICAvLyBidF9jb25maWcuY29uZi5lbmNyeXB0ZWQtY2hlY2tzdW0pLgotICAvLyAgICBUaGlzIGVuc3VyZXMgYXRvbWljIHVwZGF0ZS4KLSAgLy8gNCkgU3luYyBkaXJlY3RvcnkgdGhhdCBoYXMgdGhlIGNvbmYgZmlsZSB3aXRoIGZzeW5jKCkuCi0gIC8vICAgIFRoaXMgZW5zdXJlcyBkaXJlY3RvcnkgZW50cmllcyBhcmUgdXAtdG8tZGF0ZS4KLSAgRklMRSogZnAgPSBudWxscHRyOwotICBpbnQgZGlyX2ZkID0gLTE7Ci0KLSAgLy8gQnVpbGQgdGVtcCBjb25maWcgY2hlY2tzdW0gZmlsZSBiYXNlZCBvbiBjb25maWcgY2hlY2tzdW0gZmlsZSAoZS5nLgotICAvLyBidF9jb25maWcuY29uZi5lbmNyeXB0ZWQtY2hlY2tzdW0ubmV3KS4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgdGVtcF9maWxlbmFtZSA9IGZpbGVuYW1lICsgIi5uZXciOwotICBiYXNlOjpGaWxlUGF0aCBwYXRoKHRlbXBfZmlsZW5hbWUpOwotCi0gIC8vIEV4dHJhY3QgZGlyZWN0b3J5IGZyb20gZmlsZSBwYXRoIChlLmcuIC9kYXRhL21pc2MvYmx1ZWRyb2lkKS4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZGlyZWN0b3J5bmFtZSA9IGJhc2U6OkZpbGVQYXRoKGZpbGVuYW1lKS5EaXJOYW1lKCkudmFsdWUoKTsKLSAgaWYgKGRpcmVjdG9yeW5hbWUuZW1wdHkoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZXJyb3IgZXh0cmFjdGluZyBkaXJlY3RvcnkgZnJvbSAnIiA8PCBmaWxlbmFtZQotICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIGdvdG8gZXJyb3IyOwotICB9Ci0KLSAgZGlyX2ZkID0gb3BlbihkaXJlY3RvcnluYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKLSAgaWYgKGRpcl9mZCA8IDApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBvcGVuIGRpciAnIiA8PCBkaXJlY3RvcnluYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjI7Ci0gIH0KLQotICBpZiAoYmFzZTo6V3JpdGVGaWxlKHBhdGgsIGNoZWNrc3VtLmRhdGEoKSwgY2hlY2tzdW0uc2l6ZSgpKSAhPQotICAgICAgKGludCljaGVja3N1bS5zaXplKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byB3cml0ZSBmaWxlICciIDw8IGZpbGVuYW1lLmNfc3RyKCk7Ci0gICAgZ290byBlcnJvcjI7Ci0gIH0KLQotICBmcCA9IGZvcGVuKHRlbXBfZmlsZW5hbWUuY19zdHIoKSwgInJiIik7Ci0gIGlmICghZnApIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byB3cml0ZSB0byBmaWxlICciIDw8IHRlbXBfZmlsZW5hbWUKLSAgICAgICAgICAgICAgIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICBnb3RvIGVycm9yMjsKLSAgfQotCi0gIC8vIFN5bmMgd3JpdHRlbiB0ZW1wIGZpbGUgb3V0IHRvIGRpc2suIGZzeW5jKCkgaXMgYmxvY2tpbmcgdW50aWwgZGF0YSBtYWtlcyBpdAotICAvLyB0byBkaXNrLgotICBpZiAoZnN5bmMoZmlsZW5vKGZwKSkgPCAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBmc3luYyBmaWxlICciIDw8IHRlbXBfZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICB9Ci0KLSAgaWYgKGZjbG9zZShmcCkgPT0gRU9GKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gY2xvc2UgZmlsZSAnIiA8PCB0ZW1wX2ZpbGVuYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjI7Ci0gIH0KLSAgZnAgPSBudWxscHRyOwotCi0gIC8vIENoYW5nZSB0aGUgZmlsZSdzIHBlcm1pc3Npb25zIHRvIFJlYWQvV3JpdGUgYnkgVXNlciBhbmQgR3JvdXAKLSAgaWYgKGNobW9kKHRlbXBfZmlsZW5hbWUuY19zdHIoKSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCkgPT0KLSAgICAgIC0xKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gY2hhbmdlIGZpbGUgcGVybWlzc2lvbnMgJyIKLSAgICAgICAgICAgICAgIDw8IGZpbGVuYW1lIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICBnb3RvIGVycm9yMjsKLSAgfQotCi0gIC8vIFJlbmFtZSB3cml0dGVuIHRlbXAgZmlsZSB0byB0aGUgYWN0dWFsIGNvbmZpZyBmaWxlLgotICBpZiAocmVuYW1lKHRlbXBfZmlsZW5hbWUuY19zdHIoKSwgZmlsZW5hbWUuY19zdHIoKSkgPT0gLTEpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBjb21taXQgZmlsZSAnIiA8PCBmaWxlbmFtZQotICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIGdvdG8gZXJyb3IyOwotICB9Ci0KLSAgLy8gVGhpcyBzaG91bGQgZW5zdXJlIHRoZSBkaXJlY3RvcnkgaXMgdXBkYXRlZCBhcyB3ZWxsLgotICBpZiAoZnN5bmMoZGlyX2ZkKSA8IDApIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIGZzeW5jIGRpciAnIiA8PCBkaXJlY3RvcnluYW1lCi0gICAgICAgICAgICAgICAgIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfQotCi0gIGlmIChjbG9zZShkaXJfZmQpIDwgMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIGNsb3NlIGRpciAnIiA8PCBkaXJlY3RvcnluYW1lCi0gICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgZ290byBlcnJvcjI7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3IyOgotICAvLyBUaGlzIGluZGljYXRlcyB0aGVyZSBpcyBhIHdyaXRlIGlzc3VlLiAgVW5saW5rIGFzIHBhcnRpYWwgZGF0YSBpcyBub3QKLSAgLy8gYWNjZXB0YWJsZS4KLSAgdW5saW5rKHRlbXBfZmlsZW5hbWUuY19zdHIoKSk7Ci0gIGlmIChmcCkgZmNsb3NlKGZwKTsKLSAgaWYgKGRpcl9mZCAhPSAtMSkgY2xvc2UoZGlyX2ZkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgY2hhciogdHJpbShjaGFyKiBzdHIpIHsKLSAgd2hpbGUgKGlzc3BhY2UoKnN0cikpICsrc3RyOwotCi0gIGlmICghKnN0cikgcmV0dXJuIHN0cjsKLQotICBjaGFyKiBlbmRfc3RyID0gc3RyICsgc3RybGVuKHN0cikgLSAxOwotICB3aGlsZSAoZW5kX3N0ciA+IHN0ciAmJiBpc3NwYWNlKCplbmRfc3RyKSkgLS1lbmRfc3RyOwotCi0gIGVuZF9zdHJbMV0gPSAnXDAnOwotICByZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgYm9vbCBjb25maWdfcGFyc2UoRklMRSogZnAsIGNvbmZpZ190KiBjb25maWcpIHsKLSAgQ0hFQ0soZnAgIT0gbnVsbHB0cik7Ci0gIENIRUNLKGNvbmZpZyAhPSBudWxscHRyKTsKLQotICBpbnQgbGluZV9udW0gPSAwOwotICBjaGFyIGxpbmVbMTAyNF07Ci0gIGNoYXIgc2VjdGlvblsxMDI0XTsKLSAgc3RyY3B5KHNlY3Rpb24sIENPTkZJR19ERUZBVUxUX1NFQ1RJT04pOwotCi0gIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewotICAgIGNoYXIqIGxpbmVfcHRyID0gdHJpbShsaW5lKTsKLSAgICArK2xpbmVfbnVtOwotCi0gICAgLy8gU2tpcCBibGFuayBhbmQgY29tbWVudCBsaW5lcy4KLSAgICBpZiAoKmxpbmVfcHRyID09ICdcMCcgfHwgKmxpbmVfcHRyID09ICcjJykgY29udGludWU7Ci0KLSAgICBpZiAoKmxpbmVfcHRyID09ICdbJykgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihsaW5lX3B0cik7Ci0gICAgICBpZiAobGluZV9wdHJbbGVuIC0gMV0gIT0gJ10nKSB7Ci0gICAgICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogdW50ZXJtaW5hdGVkIHNlY3Rpb24gbmFtZSBvbiBsaW5lICIKLSAgICAgICAgICAgICAgICA8PCBsaW5lX251bTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgc3RybmNweShzZWN0aW9uLCBsaW5lX3B0ciArIDEsIGxlbiAtIDIpOyAgLy8gTk9MSU5UIChsZW4gPCAxMDI0KQotICAgICAgc2VjdGlvbltsZW4gLSAyXSA9ICdcMCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNoYXIqIHNwbGl0ID0gc3RyY2hyKGxpbmVfcHRyLCAnPScpOwotICAgICAgaWYgKCFzcGxpdCkgewotICAgICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IG5vIGtleS92YWx1ZSBzZXBhcmF0b3IgZm91bmQgb24gbGluZSAiCi0gICAgICAgICAgICAgICAgPDwgbGluZV9udW07Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgKnNwbGl0ID0gJ1wwJzsKLSAgICAgIGNvbmZpZ19zZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwgdHJpbShsaW5lX3B0ciksIHRyaW0oc3BsaXQgKyAxKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy9maXhlZF9xdWV1ZS5jYyBiL29zaS9zcmMvZml4ZWRfcXVldWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODZmZDkuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9maXhlZF9xdWV1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xpc3QuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9yZWFjdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc2VtYXBob3JlLmgiCi0KLXR5cGVkZWYgc3RydWN0IGZpeGVkX3F1ZXVlX3QgewotICBsaXN0X3QqIGxpc3Q7Ci0gIHNlbWFwaG9yZV90KiBlbnF1ZXVlX3NlbTsKLSAgc2VtYXBob3JlX3QqIGRlcXVldWVfc2VtOwotICBzdGQ6Om11dGV4KiBtdXRleDsKLSAgc2l6ZV90IGNhcGFjaXR5OwotCi0gIHJlYWN0b3Jfb2JqZWN0X3QqIGRlcXVldWVfb2JqZWN0OwotICBmaXhlZF9xdWV1ZV9jYiBkZXF1ZXVlX3JlYWR5OwotICB2b2lkKiBkZXF1ZXVlX2NvbnRleHQ7Ci19IGZpeGVkX3F1ZXVlX3Q7Ci0KLXN0YXRpYyB2b2lkIGludGVybmFsX2RlcXVldWVfcmVhZHkodm9pZCogY29udGV4dCk7Ci0KLWZpeGVkX3F1ZXVlX3QqIGZpeGVkX3F1ZXVlX25ldyhzaXplX3QgY2FwYWNpdHkpIHsKLSAgZml4ZWRfcXVldWVfdCogcmV0ID0KLSAgICAgIHN0YXRpY19jYXN0PGZpeGVkX3F1ZXVlX3QqPihvc2lfY2FsbG9jKHNpemVvZihmaXhlZF9xdWV1ZV90KSkpOwotCi0gIHJldC0+bXV0ZXggPSBuZXcgc3RkOjptdXRleDsKLSAgcmV0LT5jYXBhY2l0eSA9IGNhcGFjaXR5OwotCi0gIHJldC0+bGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotICBpZiAoIXJldC0+bGlzdCkgZ290byBlcnJvcjsKLQotICByZXQtPmVucXVldWVfc2VtID0gc2VtYXBob3JlX25ldyhjYXBhY2l0eSk7Ci0gIGlmICghcmV0LT5lbnF1ZXVlX3NlbSkgZ290byBlcnJvcjsKLQotICByZXQtPmRlcXVldWVfc2VtID0gc2VtYXBob3JlX25ldygwKTsKLSAgaWYgKCFyZXQtPmRlcXVldWVfc2VtKSBnb3RvIGVycm9yOwotCi0gIHJldHVybiByZXQ7Ci0KLWVycm9yOgotICBmaXhlZF9xdWV1ZV9mcmVlKHJldCwgTlVMTCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIGZpeGVkX3F1ZXVlX2ZyZWUoZml4ZWRfcXVldWVfdCogcXVldWUsIGZpeGVkX3F1ZXVlX2ZyZWVfY2IgZnJlZV9jYikgewotICBpZiAoIXF1ZXVlKSByZXR1cm47Ci0KLSAgZml4ZWRfcXVldWVfdW5yZWdpc3Rlcl9kZXF1ZXVlKHF1ZXVlKTsKLQotICBpZiAoZnJlZV9jYikKLSAgICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihxdWV1ZS0+bGlzdCk7Ci0gICAgICAgICBub2RlICE9IGxpc3RfZW5kKHF1ZXVlLT5saXN0KTsgbm9kZSA9IGxpc3RfbmV4dChub2RlKSkKLSAgICAgIGZyZWVfY2IobGlzdF9ub2RlKG5vZGUpKTsKLQotICBsaXN0X2ZyZWUocXVldWUtPmxpc3QpOwotICBzZW1hcGhvcmVfZnJlZShxdWV1ZS0+ZW5xdWV1ZV9zZW0pOwotICBzZW1hcGhvcmVfZnJlZShxdWV1ZS0+ZGVxdWV1ZV9zZW0pOwotICBkZWxldGUgcXVldWUtPm11dGV4OwotICBvc2lfZnJlZShxdWV1ZSk7Ci19Ci0KLXZvaWQgZml4ZWRfcXVldWVfZmx1c2goZml4ZWRfcXVldWVfdCogcXVldWUsIGZpeGVkX3F1ZXVlX2ZyZWVfY2IgZnJlZV9jYikgewotICBpZiAoIXF1ZXVlKSByZXR1cm47Ci0KLSAgd2hpbGUgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShxdWV1ZSkpIHsKLSAgICB2b2lkKiBkYXRhID0gZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUocXVldWUpOwotICAgIGlmIChmcmVlX2NiICE9IE5VTEwpIHsKLSAgICAgIGZyZWVfY2IoZGF0YSk7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgZml4ZWRfcXVldWVfaXNfZW1wdHkoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgaWYgKHF1ZXVlID09IE5VTEwpIHJldHVybiB0cnVlOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpxdWV1ZS0+bXV0ZXgpOwotICByZXR1cm4gbGlzdF9pc19lbXB0eShxdWV1ZS0+bGlzdCk7Ci19Ci0KLXNpemVfdCBmaXhlZF9xdWV1ZV9sZW5ndGgoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgaWYgKHF1ZXVlID09IE5VTEwpIHJldHVybiAwOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpxdWV1ZS0+bXV0ZXgpOwotICByZXR1cm4gbGlzdF9sZW5ndGgocXVldWUtPmxpc3QpOwotfQotCi1zaXplX3QgZml4ZWRfcXVldWVfY2FwYWNpdHkoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIHF1ZXVlLT5jYXBhY2l0eTsKLX0KLQotdm9pZCBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCB2b2lkKiBkYXRhKSB7Ci0gIENIRUNLKHF1ZXVlICE9IE5VTEwpOwotICBDSEVDSyhkYXRhICE9IE5VTEwpOwotCi0gIHNlbWFwaG9yZV93YWl0KHF1ZXVlLT5lbnF1ZXVlX3NlbSk7Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpxdWV1ZS0+bXV0ZXgpOwotICAgIGxpc3RfYXBwZW5kKHF1ZXVlLT5saXN0LCBkYXRhKTsKLSAgfQotCi0gIHNlbWFwaG9yZV9wb3N0KHF1ZXVlLT5kZXF1ZXVlX3NlbSk7Ci19Ci0KLXZvaWQqIGZpeGVkX3F1ZXVlX2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0KLSAgc2VtYXBob3JlX3dhaXQocXVldWUtPmRlcXVldWVfc2VtKTsKLQotICB2b2lkKiByZXQgPSBOVUxMOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKnF1ZXVlLT5tdXRleCk7Ci0gICAgcmV0ID0gbGlzdF9mcm9udChxdWV1ZS0+bGlzdCk7Ci0gICAgbGlzdF9yZW1vdmUocXVldWUtPmxpc3QsIHJldCk7Ci0gIH0KLQotICBzZW1hcGhvcmVfcG9zdChxdWV1ZS0+ZW5xdWV1ZV9zZW0pOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLWJvb2wgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0gIENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0KLSAgaWYgKCFzZW1hcGhvcmVfdHJ5X3dhaXQocXVldWUtPmVucXVldWVfc2VtKSkgcmV0dXJuIGZhbHNlOwotCi0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqcXVldWUtPm11dGV4KTsKLSAgICBsaXN0X2FwcGVuZChxdWV1ZS0+bGlzdCwgZGF0YSk7Ci0gIH0KLQotICBzZW1hcGhvcmVfcG9zdChxdWV1ZS0+ZGVxdWV1ZV9zZW0pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgaWYgKHF1ZXVlID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gIGlmICghc2VtYXBob3JlX3RyeV93YWl0KHF1ZXVlLT5kZXF1ZXVlX3NlbSkpIHJldHVybiBOVUxMOwotCi0gIHZvaWQqIHJldCA9IE5VTEw7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqcXVldWUtPm11dGV4KTsKLSAgICByZXQgPSBsaXN0X2Zyb250KHF1ZXVlLT5saXN0KTsKLSAgICBsaXN0X3JlbW92ZShxdWV1ZS0+bGlzdCwgcmV0KTsKLSAgfQotCi0gIHNlbWFwaG9yZV9wb3N0KHF1ZXVlLT5lbnF1ZXVlX3NlbSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgaWYgKHF1ZXVlID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpxdWV1ZS0+bXV0ZXgpOwotICByZXR1cm4gbGlzdF9pc19lbXB0eShxdWV1ZS0+bGlzdCkgPyBOVUxMIDogbGlzdF9mcm9udChxdWV1ZS0+bGlzdCk7Ci19Ci0KLXZvaWQqIGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2xhc3QoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgaWYgKHF1ZXVlID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpxdWV1ZS0+bXV0ZXgpOwotICByZXR1cm4gbGlzdF9pc19lbXB0eShxdWV1ZS0+bGlzdCkgPyBOVUxMIDogbGlzdF9iYWNrKHF1ZXVlLT5saXN0KTsKLX0KLQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X3JlbW92ZV9mcm9tX3F1ZXVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCB2b2lkKiBkYXRhKSB7Ci0gIGlmIChxdWV1ZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICBib29sIHJlbW92ZWQgPSBmYWxzZTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpxdWV1ZS0+bXV0ZXgpOwotICAgIGlmIChsaXN0X2NvbnRhaW5zKHF1ZXVlLT5saXN0LCBkYXRhKSAmJgotICAgICAgICBzZW1hcGhvcmVfdHJ5X3dhaXQocXVldWUtPmRlcXVldWVfc2VtKSkgewotICAgICAgcmVtb3ZlZCA9IGxpc3RfcmVtb3ZlKHF1ZXVlLT5saXN0LCBkYXRhKTsKLSAgICAgIENIRUNLKHJlbW92ZWQpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZW1vdmVkKSB7Ci0gICAgc2VtYXBob3JlX3Bvc3QocXVldWUtPmVucXVldWVfc2VtKTsKLSAgICByZXR1cm4gZGF0YTsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotbGlzdF90KiBmaXhlZF9xdWV1ZV9nZXRfbGlzdChmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBDSEVDSyhxdWV1ZSAhPSBOVUxMKTsKLQotICAvLyBOT1RFOiBVc2luZyB0aGUgbGlzdCBpbiB0aGlzIHdheSBpcyBub3QgdGhyZWFkLXNhZmUuCi0gIC8vIFVzaW5nIHRoaXMgbGlzdCBpbiBhbnkgY29udGV4dCB3aGVyZSB0aHJlYWRzIGNhbiBjYWxsIG90aGVyIGZ1bmN0aW9ucwotICAvLyB0byB0aGUgcXVldWUgY2FuIGJyZWFrIG91ciBhc3N1bXB0aW9ucyBhbmQgdGhlIHF1ZXVlIGluIGdlbmVyYWwuCi0gIHJldHVybiBxdWV1ZS0+bGlzdDsKLX0KLQotaW50IGZpeGVkX3F1ZXVlX2dldF9kZXF1ZXVlX2ZkKGNvbnN0IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7Ci0gIENIRUNLKHF1ZXVlICE9IE5VTEwpOwotICByZXR1cm4gc2VtYXBob3JlX2dldF9mZChxdWV1ZS0+ZGVxdWV1ZV9zZW0pOwotfQotCi1pbnQgZml4ZWRfcXVldWVfZ2V0X2VucXVldWVfZmQoY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0gIHJldHVybiBzZW1hcGhvcmVfZ2V0X2ZkKHF1ZXVlLT5lbnF1ZXVlX3NlbSk7Ci19Ci0KLXZvaWQgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgcmVhY3Rvcl90KiByZWFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3F1ZXVlX2NiIHJlYWR5X2NiLCB2b2lkKiBjb250ZXh0KSB7Ci0gIENIRUNLKHF1ZXVlICE9IE5VTEwpOwotICBDSEVDSyhyZWFjdG9yICE9IE5VTEwpOwotICBDSEVDSyhyZWFkeV9jYiAhPSBOVUxMKTsKLQotICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgcmVnaXN0ZXJlZAotICBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUocXVldWUpOwotCi0gIHF1ZXVlLT5kZXF1ZXVlX3JlYWR5ID0gcmVhZHlfY2I7Ci0gIHF1ZXVlLT5kZXF1ZXVlX2NvbnRleHQgPSBjb250ZXh0OwotICBxdWV1ZS0+ZGVxdWV1ZV9vYmplY3QgPQotICAgICAgcmVhY3Rvcl9yZWdpc3RlcihyZWFjdG9yLCBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZChxdWV1ZSksIHF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9kZXF1ZXVlX3JlYWR5LCBOVUxMKTsKLX0KLQotdm9pZCBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgQ0hFQ0socXVldWUgIT0gTlVMTCk7Ci0KLSAgaWYgKHF1ZXVlLT5kZXF1ZXVlX29iamVjdCkgewotICAgIHJlYWN0b3JfdW5yZWdpc3RlcihxdWV1ZS0+ZGVxdWV1ZV9vYmplY3QpOwotICAgIHF1ZXVlLT5kZXF1ZXVlX29iamVjdCA9IE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaW50ZXJuYWxfZGVxdWV1ZV9yZWFkeSh2b2lkKiBjb250ZXh0KSB7Ci0gIENIRUNLKGNvbnRleHQgIT0gTlVMTCk7Ci0KLSAgZml4ZWRfcXVldWVfdCogcXVldWUgPSBzdGF0aWNfY2FzdDxmaXhlZF9xdWV1ZV90Kj4oY29udGV4dCk7Ci0gIHF1ZXVlLT5kZXF1ZXVlX3JlYWR5KHF1ZXVlLCBxdWV1ZS0+ZGVxdWV1ZV9jb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvZnV0dXJlLmNjIGIvb3NpL3NyYy9mdXR1cmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGI1YWQuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9mdXR1cmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX2Z1dHVyZSIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotCi1zdHJ1Y3QgZnV0dXJlX3QgewotICBib29sIHJlYWR5X2Nhbl9iZV9jYWxsZWQ7Ci0gIHNlbWFwaG9yZV90KiBzZW1hcGhvcmU7ICAvLyBOVUxMIHNlbWFwaG9yZSBtZWFucyBpbW1lZGlhdGUgZnV0dXJlCi0gIHZvaWQqIHJlc3VsdDsKLX07Ci0KLXN0YXRpYyB2b2lkIGZ1dHVyZV9mcmVlKGZ1dHVyZV90KiBmdXR1cmUpOwotCi1mdXR1cmVfdCogZnV0dXJlX25ldyh2b2lkKSB7Ci0gIGZ1dHVyZV90KiByZXQgPSBzdGF0aWNfY2FzdDxmdXR1cmVfdCo+KG9zaV9jYWxsb2Moc2l6ZW9mKGZ1dHVyZV90KSkpOwotCi0gIHJldC0+c2VtYXBob3JlID0gc2VtYXBob3JlX25ldygwKTsKLSAgaWYgKCFyZXQtPnNlbWFwaG9yZSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlbWFwaG9yZS4iLCBfX2Z1bmNfXyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHJldC0+cmVhZHlfY2FuX2JlX2NhbGxlZCA9IHRydWU7Ci0gIHJldHVybiByZXQ7Ci1lcnJvcjo7Ci0gIGZ1dHVyZV9mcmVlKHJldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1mdXR1cmVfdCogZnV0dXJlX25ld19pbW1lZGlhdGUodm9pZCogdmFsdWUpIHsKLSAgZnV0dXJlX3QqIHJldCA9IHN0YXRpY19jYXN0PGZ1dHVyZV90Kj4ob3NpX2NhbGxvYyhzaXplb2YoZnV0dXJlX3QpKSk7Ci0KLSAgcmV0LT5yZXN1bHQgPSB2YWx1ZTsKLSAgcmV0LT5yZWFkeV9jYW5fYmVfY2FsbGVkID0gZmFsc2U7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZnV0dXJlX3JlYWR5KGZ1dHVyZV90KiBmdXR1cmUsIHZvaWQqIHZhbHVlKSB7Ci0gIENIRUNLKGZ1dHVyZSAhPSBOVUxMKTsKLSAgQ0hFQ0soZnV0dXJlLT5yZWFkeV9jYW5fYmVfY2FsbGVkKTsKLQotICBmdXR1cmUtPnJlYWR5X2Nhbl9iZV9jYWxsZWQgPSBmYWxzZTsKLSAgZnV0dXJlLT5yZXN1bHQgPSB2YWx1ZTsKLSAgc2VtYXBob3JlX3Bvc3QoZnV0dXJlLT5zZW1hcGhvcmUpOwotfQotCi12b2lkKiBmdXR1cmVfYXdhaXQoZnV0dXJlX3QqIGZ1dHVyZSkgewotICBDSEVDSyhmdXR1cmUgIT0gTlVMTCk7Ci0KLSAgLy8gSWYgdGhlIGZ1dHVyZSBpcyBpbW1lZGlhdGUsIGl0IHdpbGwgbm90IGhhdmUgYSBzZW1hcGhvcmUKLSAgaWYgKGZ1dHVyZS0+c2VtYXBob3JlKSBzZW1hcGhvcmVfd2FpdChmdXR1cmUtPnNlbWFwaG9yZSk7Ci0KLSAgdm9pZCogcmVzdWx0ID0gZnV0dXJlLT5yZXN1bHQ7Ci0gIGZ1dHVyZV9mcmVlKGZ1dHVyZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ1dHVyZV9mcmVlKGZ1dHVyZV90KiBmdXR1cmUpIHsKLSAgaWYgKCFmdXR1cmUpIHJldHVybjsKLQotICBzZW1hcGhvcmVfZnJlZShmdXR1cmUtPnNlbWFwaG9yZSk7Ci0gIG9zaV9mcmVlKGZ1dHVyZSk7Ci19CmRpZmYgLS1naXQgYS9vc2kvc3JjL2hhc2hfbWFwX3V0aWxzLmNjIGIvb3NpL3NyYy9oYXNoX21hcF91dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxYjFhNC4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL2hhc2hfbWFwX3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvaGFzaF9tYXBfdXRpbHMuaCIKLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4gIC8vIENIRUNLKCkKLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4KLWhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMoY29uc3QgY2hhciogcGFyYW1zKSB7Ci0gIENIRUNLKHBhcmFtcyAhPSBOVUxMKTsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXA7Ci0KLSAgY2hhciogc3RyID0gb3NpX3N0cmR1cChwYXJhbXMpOwotICBpZiAoIXN0cikgcmV0dXJuIG1hcDsKLQotICAvLyBQYXJzZSB8c3RyfCBhbmQgYWRkIGV4dHJhY3RlZCBrZXktYW5kLXZhbHVlIHBhaXIocykgaW4gfG1hcHwuCi0gIGludCBpdGVtcyA9IDA7Ci0gIGNoYXIqIHRtcHN0cjsKLSAgY2hhcioga3ZwYWlyID0gc3RydG9rX3Ioc3RyLCAiOyIsICZ0bXBzdHIpOwotICB3aGlsZSAoa3ZwYWlyICYmICprdnBhaXIpIHsKLSAgICBjaGFyKiBlcSA9IHN0cmNocihrdnBhaXIsICc9Jyk7Ci0KLSAgICBpZiAoZXEgPT0ga3ZwYWlyKSBnb3RvIG5leHRfcGFpcjsKLQotICAgIGNoYXIqIGtleTsKLSAgICBjaGFyKiB2YWx1ZTsKLSAgICBpZiAoZXEpIHsKLSAgICAgIGtleSA9IG9zaV9zdHJuZHVwKGt2cGFpciwgZXEgLSBrdnBhaXIpOwotCi0gICAgICAvLyBUaGUgaW5jcmVtZW50IG9mIHxlcXwgbW92ZXMgfGVxfCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2YWx1ZS4KLSAgICAgICsrZXE7Ci0gICAgICB2YWx1ZSA9ICgqZXEgIT0gJ1wwJykgPyBvc2lfc3RyZHVwKGVxKSA6IG9zaV9zdHJkdXAoIiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBrZXkgPSBvc2lfc3RyZHVwKGt2cGFpcik7Ci0gICAgICB2YWx1ZSA9IG9zaV9zdHJkdXAoIiIpOwotICAgIH0KLQotICAgIG1hcFtrZXldID0gdmFsdWU7Ci0KLSAgICBvc2lfZnJlZShrZXkpOwotICAgIG9zaV9mcmVlKHZhbHVlKTsKLQotICAgIGl0ZW1zKys7Ci0gIG5leHRfcGFpcjoKLSAgICBrdnBhaXIgPSBzdHJ0b2tfcihOVUxMLCAiOyIsICZ0bXBzdHIpOwotICB9Ci0KLSAgb3NpX2ZyZWUoc3RyKTsKLSAgcmV0dXJuIG1hcDsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvbGlzdC5jYyBiL29zaS9zcmMvbGlzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3MTU3Yy4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL2xpc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9saXN0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLXN0cnVjdCBsaXN0X25vZGVfdCB7Ci0gIHN0cnVjdCBsaXN0X25vZGVfdCogbmV4dDsKLSAgdm9pZCogZGF0YTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxpc3RfdCB7Ci0gIGxpc3Rfbm9kZV90KiBoZWFkOwotICBsaXN0X25vZGVfdCogdGFpbDsKLSAgc2l6ZV90IGxlbmd0aDsKLSAgbGlzdF9mcmVlX2NiIGZyZWVfY2I7Ci0gIGNvbnN0IGFsbG9jYXRvcl90KiBhbGxvY2F0b3I7Ci19IGxpc3RfdDsKLQotc3RhdGljIGxpc3Rfbm9kZV90KiBsaXN0X2ZyZWVfbm9kZV8obGlzdF90KiBsaXN0LCBsaXN0X25vZGVfdCogbm9kZSk7Ci0KLS8vIEhpZGRlbiBjb25zdHJ1Y3Rvciwgb25seSB0byBiZSB1c2VkIGJ5IHRoZSBoYXNoIG1hcCBmb3IgdGhlIGFsbG9jYXRpb24KLS8vIHRyYWNrZXIuCi0vLyBCZWhhdmVzIHRoZSBzYW1lIGFzIHxsaXN0X25ld3wsIGV4Y2VwdCB5b3UgZ2V0IHRvIHNwZWNpZnkgdGhlIGFsbG9jYXRvci4KLWxpc3RfdCogbGlzdF9uZXdfaW50ZXJuYWwobGlzdF9mcmVlX2NiIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdCogemVyb2VkX2FsbG9jYXRvcikgewotICBsaXN0X3QqIGxpc3QgPSAobGlzdF90Kil6ZXJvZWRfYWxsb2NhdG9yLT5hbGxvYyhzaXplb2YobGlzdF90KSk7Ci0gIGlmICghbGlzdCkgcmV0dXJuIE5VTEw7Ci0KLSAgbGlzdC0+ZnJlZV9jYiA9IGNhbGxiYWNrOwotICBsaXN0LT5hbGxvY2F0b3IgPSB6ZXJvZWRfYWxsb2NhdG9yOwotICByZXR1cm4gbGlzdDsKLX0KLQotbGlzdF90KiBsaXN0X25ldyhsaXN0X2ZyZWVfY2IgY2FsbGJhY2spIHsKLSAgcmV0dXJuIGxpc3RfbmV3X2ludGVybmFsKGNhbGxiYWNrLCAmYWxsb2NhdG9yX2NhbGxvYyk7Ci19Ci0KLXZvaWQgbGlzdF9mcmVlKGxpc3RfdCogbGlzdCkgewotICBpZiAoIWxpc3QpIHJldHVybjsKLQotICBsaXN0X2NsZWFyKGxpc3QpOwotICBsaXN0LT5hbGxvY2F0b3ItPmZyZWUobGlzdCk7Ci19Ci0KLWJvb2wgbGlzdF9pc19lbXB0eShjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgcmV0dXJuIChsaXN0LT5sZW5ndGggPT0gMCk7Ci19Ci0KLWJvb2wgbGlzdF9jb250YWlucyhjb25zdCBsaXN0X3QqIGxpc3QsIGNvbnN0IHZvaWQqIGRhdGEpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLQotICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihsaXN0KTsgbm9kZSAhPSBsaXN0X2VuZChsaXN0KTsKLSAgICAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpKSB7Ci0gICAgaWYgKGxpc3Rfbm9kZShub2RlKSA9PSBkYXRhKSByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc2l6ZV90IGxpc3RfbGVuZ3RoKGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBDSEVDSyhsaXN0ICE9IE5VTEwpOwotICByZXR1cm4gbGlzdC0+bGVuZ3RoOwotfQotCi12b2lkKiBsaXN0X2Zyb250KGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBDSEVDSyhsaXN0ICE9IE5VTEwpOwotICBDSEVDSyghbGlzdF9pc19lbXB0eShsaXN0KSk7Ci0KLSAgcmV0dXJuIGxpc3QtPmhlYWQtPmRhdGE7Ci19Ci0KLXZvaWQqIGxpc3RfYmFjayhjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgQ0hFQ0soIWxpc3RfaXNfZW1wdHkobGlzdCkpOwotCi0gIHJldHVybiBsaXN0LT50YWlsLT5kYXRhOwotfQotCi1saXN0X25vZGVfdCogbGlzdF9iYWNrX25vZGUoY29uc3QgbGlzdF90KiBsaXN0KSB7Ci0gIENIRUNLKGxpc3QgIT0gTlVMTCk7Ci0gIENIRUNLKCFsaXN0X2lzX2VtcHR5KGxpc3QpKTsKLQotICByZXR1cm4gbGlzdC0+dGFpbDsKLX0KLQotYm9vbCBsaXN0X2luc2VydF9hZnRlcihsaXN0X3QqIGxpc3QsIGxpc3Rfbm9kZV90KiBwcmV2X25vZGUsIHZvaWQqIGRhdGEpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgQ0hFQ0socHJldl9ub2RlICE9IE5VTEwpOwotICBDSEVDSyhkYXRhICE9IE5VTEwpOwotCi0gIGxpc3Rfbm9kZV90KiBub2RlID0gKGxpc3Rfbm9kZV90KilsaXN0LT5hbGxvY2F0b3ItPmFsbG9jKHNpemVvZihsaXN0X25vZGVfdCkpOwotICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTsKLQotICBub2RlLT5uZXh0ID0gcHJldl9ub2RlLT5uZXh0OwotICBub2RlLT5kYXRhID0gZGF0YTsKLSAgcHJldl9ub2RlLT5uZXh0ID0gbm9kZTsKLSAgaWYgKGxpc3QtPnRhaWwgPT0gcHJldl9ub2RlKSBsaXN0LT50YWlsID0gbm9kZTsKLSAgKytsaXN0LT5sZW5ndGg7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGxpc3RfcHJlcGVuZChsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLQotICBsaXN0X25vZGVfdCogbm9kZSA9IChsaXN0X25vZGVfdCopbGlzdC0+YWxsb2NhdG9yLT5hbGxvYyhzaXplb2YobGlzdF9ub2RlX3QpKTsKLSAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7Ci0gIG5vZGUtPm5leHQgPSBsaXN0LT5oZWFkOwotICBub2RlLT5kYXRhID0gZGF0YTsKLSAgbGlzdC0+aGVhZCA9IG5vZGU7Ci0gIGlmIChsaXN0LT50YWlsID09IE5VTEwpIGxpc3QtPnRhaWwgPSBsaXN0LT5oZWFkOwotICArK2xpc3QtPmxlbmd0aDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgbGlzdF9hcHBlbmQobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKSB7Ci0gIENIRUNLKGxpc3QgIT0gTlVMTCk7Ci0gIENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0KLSAgbGlzdF9ub2RlX3QqIG5vZGUgPSAobGlzdF9ub2RlX3QqKWxpc3QtPmFsbG9jYXRvci0+YWxsb2Moc2l6ZW9mKGxpc3Rfbm9kZV90KSk7Ci0gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlOwotICBub2RlLT5uZXh0ID0gTlVMTDsKLSAgbm9kZS0+ZGF0YSA9IGRhdGE7Ci0gIGlmIChsaXN0LT50YWlsID09IE5VTEwpIHsKLSAgICBsaXN0LT5oZWFkID0gbm9kZTsKLSAgICBsaXN0LT50YWlsID0gbm9kZTsKLSAgfSBlbHNlIHsKLSAgICBsaXN0LT50YWlsLT5uZXh0ID0gbm9kZTsKLSAgICBsaXN0LT50YWlsID0gbm9kZTsKLSAgfQotICArK2xpc3QtPmxlbmd0aDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgbGlzdF9yZW1vdmUobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKSB7Ci0gIENIRUNLKGxpc3QgIT0gTlVMTCk7Ci0gIENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0KLSAgaWYgKGxpc3RfaXNfZW1wdHkobGlzdCkpIHJldHVybiBmYWxzZTsKLQotICBpZiAobGlzdC0+aGVhZC0+ZGF0YSA9PSBkYXRhKSB7Ci0gICAgbGlzdF9ub2RlX3QqIG5leHQgPSBsaXN0X2ZyZWVfbm9kZV8obGlzdCwgbGlzdC0+aGVhZCk7Ci0gICAgaWYgKGxpc3QtPnRhaWwgPT0gbGlzdC0+aGVhZCkgbGlzdC0+dGFpbCA9IG5leHQ7Ci0gICAgbGlzdC0+aGVhZCA9IG5leHQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBmb3IgKGxpc3Rfbm9kZV90ICpwcmV2ID0gbGlzdC0+aGVhZCwgKm5vZGUgPSBsaXN0LT5oZWFkLT5uZXh0OyBub2RlOwotICAgICAgIHByZXYgPSBub2RlLCBub2RlID0gbm9kZS0+bmV4dCkKLSAgICBpZiAobm9kZS0+ZGF0YSA9PSBkYXRhKSB7Ci0gICAgICBwcmV2LT5uZXh0ID0gbGlzdF9mcmVlX25vZGVfKGxpc3QsIG5vZGUpOwotICAgICAgaWYgKGxpc3QtPnRhaWwgPT0gbm9kZSkgbGlzdC0+dGFpbCA9IHByZXY7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGxpc3RfY2xlYXIobGlzdF90KiBsaXN0KSB7Ci0gIENIRUNLKGxpc3QgIT0gTlVMTCk7Ci0gIGZvciAobGlzdF9ub2RlX3QqIG5vZGUgPSBsaXN0LT5oZWFkOyBub2RlOykKLSAgICBub2RlID0gbGlzdF9mcmVlX25vZGVfKGxpc3QsIG5vZGUpOwotICBsaXN0LT5oZWFkID0gTlVMTDsKLSAgbGlzdC0+dGFpbCA9IE5VTEw7Ci0gIGxpc3QtPmxlbmd0aCA9IDA7Ci19Ci0KLWxpc3Rfbm9kZV90KiBsaXN0X2ZvcmVhY2goY29uc3QgbGlzdF90KiBsaXN0LCBsaXN0X2l0ZXJfY2IgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgQ0hFQ0soY2FsbGJhY2sgIT0gTlVMTCk7Ci0KLSAgZm9yIChsaXN0X25vZGVfdCogbm9kZSA9IGxpc3QtPmhlYWQ7IG5vZGU7KSB7Ci0gICAgbGlzdF9ub2RlX3QqIG5leHQgPSBub2RlLT5uZXh0OwotICAgIGlmICghY2FsbGJhY2sobm9kZS0+ZGF0YSwgY29udGV4dCkpIHJldHVybiBub2RlOwotICAgIG5vZGUgPSBuZXh0OwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1saXN0X25vZGVfdCogbGlzdF9iZWdpbihjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgcmV0dXJuIGxpc3QtPmhlYWQ7Ci19Ci0KLWxpc3Rfbm9kZV90KiBsaXN0X2VuZChVTlVTRURfQVRUUiBjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgQ0hFQ0sobGlzdCAhPSBOVUxMKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWxpc3Rfbm9kZV90KiBsaXN0X25leHQoY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUpIHsKLSAgQ0hFQ0sobm9kZSAhPSBOVUxMKTsKLSAgcmV0dXJuIG5vZGUtPm5leHQ7Ci19Ci0KLXZvaWQqIGxpc3Rfbm9kZShjb25zdCBsaXN0X25vZGVfdCogbm9kZSkgewotICBDSEVDSyhub2RlICE9IE5VTEwpOwotICByZXR1cm4gbm9kZS0+ZGF0YTsKLX0KLQotc3RhdGljIGxpc3Rfbm9kZV90KiBsaXN0X2ZyZWVfbm9kZV8obGlzdF90KiBsaXN0LCBsaXN0X25vZGVfdCogbm9kZSkgewotICBDSEVDSyhsaXN0ICE9IE5VTEwpOwotICBDSEVDSyhub2RlICE9IE5VTEwpOwotCi0gIGxpc3Rfbm9kZV90KiBuZXh0ID0gbm9kZS0+bmV4dDsKLQotICBpZiAobGlzdC0+ZnJlZV9jYikgbGlzdC0+ZnJlZV9jYihub2RlLT5kYXRhKTsKLSAgbGlzdC0+YWxsb2NhdG9yLT5mcmVlKG5vZGUpOwotICAtLWxpc3QtPmxlbmd0aDsKLQotICByZXR1cm4gbmV4dDsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvbXV0ZXguY2MgYi9vc2kvc3JjL211dGV4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM0ZjA5Li4wMDAwMDAwCi0tLSBhL29zaS9zcmMvbXV0ZXguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX211dGV4IgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9tdXRleC5oIgotCi1zdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggZ2xvYmFsX211dGV4OwotCi12b2lkIG11dGV4X2dsb2JhbF9sb2NrKHZvaWQpIHsgZ2xvYmFsX211dGV4LmxvY2soKTsgfQotCi12b2lkIG11dGV4X2dsb2JhbF91bmxvY2sodm9pZCkgeyBnbG9iYWxfbXV0ZXgudW5sb2NrKCk7IH0KZGlmZiAtLWdpdCBhL29zaS9zcmMvb3NpLmNjIGIvb3NpL3NyYy9vc2kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGYzYTIuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9vc2kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX3JhbmQiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotI2RlZmluZSBSQU5ET01fUEFUSCAiL2Rldi91cmFuZG9tIgotCi1pbnQgb3NpX3JhbmQodm9pZCkgewotICBpbnQgcmFuZDsKLSAgaW50IHJhbmRfZmQgPSBvcGVuKFJBTkRPTV9QQVRILCBPX1JET05MWSk7Ci0KLSAgaWYgKHJhbmRfZmQgPT0gSU5WQUxJRF9GRCkgewotICAgIExPR19FUlJPUigiJXMgY2FuJ3Qgb3BlbiByYW5kIGZkICVzOiAlcyAiLCBfX2Z1bmNfXywgUkFORE9NX1BBVEgsCi0gICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgQ0hFQ0socmFuZF9mZCAhPSBJTlZBTElEX0ZEKTsKLSAgfQotCi0gIHNzaXplX3QgcmVhZF9ieXRlcyA9IHJlYWQocmFuZF9mZCwgJnJhbmQsIHNpemVvZihyYW5kKSk7Ci0gIGNsb3NlKHJhbmRfZmQpOwotCi0gIENIRUNLKHJlYWRfYnl0ZXMgPT0gc2l6ZW9mKHJhbmQpKTsKLQotICBpZiAocmFuZCA8IDApIHJhbmQgPSAtcmFuZDsKLQotICByZXR1cm4gcmFuZDsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvcHJvcGVydGllcy5jYyBiL29zaS9zcmMvcHJvcGVydGllcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwMjQ3OWExLi4wMDAwMDAwCi0tLSBhL29zaS9zcmMvcHJvcGVydGllcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotCi0jaWYgIWRlZmluZWQoT1NfR0VORVJJQykKLSN1bmRlZiBQUk9QRVJUWV9WQUxVRV9NQVgKLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2lmIEJVSUxEX1NBTklUWV9QUk9QRVJUWV9WQUxVRV9NQVggIT0gUFJPUEVSVFlfVkFMVUVfTUFYCi0jZXJyb3IgIlBST1BFUlRZX1ZBTFVFX01BWCBmcm9tIG9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCAhPSB0aGUgQW5kcm9pZCB2YWx1ZSIKLSNlbmRpZiAgLy8gR0VORVJJQ19QUk9QRVJUWV9WQUxVRV9NQVggIT0gUFJPUEVSVFlfVkFMVUVfTUFYCi0jZW5kaWYgIC8vICFkZWZpbmVkKE9TX0dFTkVSSUMpCi0KLWludCBvc2lfcHJvcGVydHlfZ2V0KGNvbnN0IGNoYXIqIGtleSwgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIHsKLSNpZiBkZWZpbmVkKE9TX0dFTkVSSUMpCi0gIC8qIEZvciBsaW51eCByaWdodCBub3cganVzdCByZXR1cm4gZGVmYXVsdCB2YWx1ZSwgaWYgcHJlc2VudCAqLwotICBpbnQgbGVuID0gMDsKLSAgaWYgKCFkZWZhdWx0X3ZhbHVlKSByZXR1cm4gbGVuOwotCi0gIGxlbiA9IHN0cmxlbihkZWZhdWx0X3ZhbHVlKTsKLSAgaWYgKGxlbiA+PSBQUk9QRVJUWV9WQUxVRV9NQVgpIGxlbiA9IFBST1BFUlRZX1ZBTFVFX01BWCAtIDE7Ci0KLSAgbWVtY3B5KHZhbHVlLCBkZWZhdWx0X3ZhbHVlLCBsZW4pOwotICB2YWx1ZVtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIGxlbjsKLSNlbHNlCi0gIHJldHVybiBwcm9wZXJ0eV9nZXQoa2V5LCB2YWx1ZSwgZGVmYXVsdF92YWx1ZSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoT1NfR0VORVJJQykKLX0KLQotaW50IG9zaV9wcm9wZXJ0eV9zZXQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotI2lmIGRlZmluZWQoT1NfR0VORVJJQykKLSAgcmV0dXJuIC0xOwotI2Vsc2UKLSAgcmV0dXJuIHByb3BlcnR5X3NldChrZXksIHZhbHVlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19HRU5FUklDKQotfQotCi1pbnQzMl90IG9zaV9wcm9wZXJ0eV9nZXRfaW50MzIoY29uc3QgY2hhcioga2V5LCBpbnQzMl90IGRlZmF1bHRfdmFsdWUpIHsKLSNpZiBkZWZpbmVkKE9TX0dFTkVSSUMpCi0gIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotI2Vsc2UKLSAgcmV0dXJuIHByb3BlcnR5X2dldF9pbnQzMihrZXksIGRlZmF1bHRfdmFsdWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX0dFTkVSSUMpCi19Ci0KLWJvb2wgb3NpX3Byb3BlcnR5X2dldF9ib29sKGNvbnN0IGNoYXIqIGtleSwgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7Ci0jaWYgZGVmaW5lZChPU19HRU5FUklDKQotICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSNlbHNlCi0gIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbChrZXksIGRlZmF1bHRfdmFsdWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKE9TX0dFTkVSSUMpCi19CmRpZmYgLS1naXQgYS9vc2kvc3JjL3JlYWN0b3IuY2MgYi9vc2kvc3JjL3JlYWN0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjMzZDIuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9yZWFjdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9vc2lfcmVhY3RvciIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JlYWN0b3IuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbGlzdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotCi0jaWYgIWRlZmluZWQoRUZEX1NFTUFQSE9SRSkKLSNkZWZpbmUgRUZEX1NFTUFQSE9SRSAoMSA8PCAwKQotI2VuZGlmCi0KLXN0cnVjdCByZWFjdG9yX3QgewotICBpbnQgZXBvbGxfZmQ7Ci0gIGludCBldmVudF9mZDsKLSAgc3RkOjptdXRleCogbGlzdF9tdXRleDsKLSAgbGlzdF90KiBpbnZhbGlkYXRpb25fbGlzdDsgIC8vIHJlYWN0b3Igb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiB1bnJlZ2lzdGVyZWQuCi0gIHB0aHJlYWRfdCBydW5fdGhyZWFkOyAgICAgICAvLyB0aGUgcHRocmVhZCBvbiB3aGljaCByZWFjdG9yX3J1biBpcyBleGVjdXRpbmcuCi0gIGJvb2wgaXNfcnVubmluZzsgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB8cnVuX3RocmVhZHwgaXMgdmFsaWQuCi0gIGJvb2wgb2JqZWN0X3JlbW92ZWQ7Ci19OwotCi1zdHJ1Y3QgcmVhY3Rvcl9vYmplY3RfdCB7Ci0gIGludCBmZDsgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gbW9uaXRvciBmb3IgZXZlbnRzLgotICB2b2lkKiBjb250ZXh0OyAgICAgICAvLyBhIGNvbnRleHQgdGhhdCdzIHBhc3NlZCBiYWNrIHRvIHRoZSAqX3JlYWR5IGZ1bmN0aW9ucy4KLSAgcmVhY3Rvcl90KiByZWFjdG9yOyAgLy8gdGhlIHJlYWN0b3IgaW5zdGFuY2UgdGhpcyBvYmplY3QgaXMgcmVnaXN0ZXJlZCB3aXRoLgotICBzdGQ6Om11dGV4KiBtdXRleDsgIC8vIHByb3RlY3RzIHRoZSBsaWZldGltZSBvZiB0aGlzIG9iamVjdCBhbmQgYWxsIHZhcmlhYmxlcy4KLQotICB2b2lkICgqcmVhZF9yZWFkeSkodm9pZCogY29udGV4dCk7ICAgLy8gZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGJlY29tZXMgcmVhZGFibGUuCi0gIHZvaWQgKCp3cml0ZV9yZWFkeSkodm9pZCogY29udGV4dCk7ICAvLyBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgYmVjb21lcyB3cml0ZWFibGUuCi19OwotCi1zdGF0aWMgcmVhY3Rvcl9zdGF0dXNfdCBydW5fcmVhY3RvcihyZWFjdG9yX3QqIHJlYWN0b3IsIGludCBpdGVyYXRpb25zKTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBNQVhfRVZFTlRTID0gNjQ7Ci1zdGF0aWMgY29uc3QgZXZlbnRmZF90IEVWRU5UX1JFQUNUT1JfU1RPUCA9IDE7Ci0KLXJlYWN0b3JfdCogcmVhY3Rvcl9uZXcodm9pZCkgewotICByZWFjdG9yX3QqIHJldCA9IChyZWFjdG9yX3QqKW9zaV9jYWxsb2Moc2l6ZW9mKHJlYWN0b3JfdCkpOwotCi0gIHJldC0+ZXBvbGxfZmQgPSBJTlZBTElEX0ZEOwotICByZXQtPmV2ZW50X2ZkID0gSU5WQUxJRF9GRDsKLQotICByZXQtPmVwb2xsX2ZkID0gZXBvbGxfY3JlYXRlMShFUE9MTF9DTE9FWEVDKTsKLSAgaWYgKHJldC0+ZXBvbGxfZmQgPT0gSU5WQUxJRF9GRCkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGNyZWF0ZSBlcG9sbCBpbnN0YW5jZTogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgcmV0LT5ldmVudF9mZCA9IGV2ZW50ZmQoMCwgMCk7Ci0gIGlmIChyZXQtPmV2ZW50X2ZkID09IElOVkFMSURfRkQpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBjcmVhdGUgZXZlbnRmZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgcmV0LT5saXN0X211dGV4ID0gbmV3IHN0ZDo6bXV0ZXg7Ci0gIHJldC0+aW52YWxpZGF0aW9uX2xpc3QgPSBsaXN0X25ldyhOVUxMKTsKLSAgaWYgKCFyZXQtPmludmFsaWRhdGlvbl9saXN0KSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYWxsb2NhdGUgb2JqZWN0IGludmFsaWRhdGlvbiBsaXN0LiIsIF9fZnVuY19fKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50OwotICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLSAgZXZlbnQuZXZlbnRzID0gRVBPTExJTjsKLSAgZXZlbnQuZGF0YS5wdHIgPSBOVUxMOwotICBpZiAoZXBvbGxfY3RsKHJldC0+ZXBvbGxfZmQsIEVQT0xMX0NUTF9BREQsIHJldC0+ZXZlbnRfZmQsICZldmVudCkgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byByZWdpc3RlciBldmVudGZkIHdpdGggZXBvbGwgc2V0OiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotCi1lcnJvcjo7Ci0gIHJlYWN0b3JfZnJlZShyZXQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCByZWFjdG9yX2ZyZWUocmVhY3Rvcl90KiByZWFjdG9yKSB7Ci0gIGlmICghcmVhY3RvcikgcmV0dXJuOwotCi0gIGxpc3RfZnJlZShyZWFjdG9yLT5pbnZhbGlkYXRpb25fbGlzdCk7Ci0gIGNsb3NlKHJlYWN0b3ItPmV2ZW50X2ZkKTsKLSAgY2xvc2UocmVhY3Rvci0+ZXBvbGxfZmQpOwotICBvc2lfZnJlZShyZWFjdG9yKTsKLX0KLQotcmVhY3Rvcl9zdGF0dXNfdCByZWFjdG9yX3N0YXJ0KHJlYWN0b3JfdCogcmVhY3RvcikgewotICBDSEVDSyhyZWFjdG9yICE9IE5VTEwpOwotICByZXR1cm4gcnVuX3JlYWN0b3IocmVhY3RvciwgMCk7Ci19Ci0KLXJlYWN0b3Jfc3RhdHVzX3QgcmVhY3Rvcl9ydW5fb25jZShyZWFjdG9yX3QqIHJlYWN0b3IpIHsKLSAgQ0hFQ0socmVhY3RvciAhPSBOVUxMKTsKLSAgcmV0dXJuIHJ1bl9yZWFjdG9yKHJlYWN0b3IsIDEpOwotfQotCi12b2lkIHJlYWN0b3Jfc3RvcChyZWFjdG9yX3QqIHJlYWN0b3IpIHsKLSAgQ0hFQ0socmVhY3RvciAhPSBOVUxMKTsKLQotICBldmVudGZkX3dyaXRlKHJlYWN0b3ItPmV2ZW50X2ZkLCBFVkVOVF9SRUFDVE9SX1NUT1ApOwotfQotCi1yZWFjdG9yX29iamVjdF90KiByZWFjdG9yX3JlZ2lzdGVyKHJlYWN0b3JfdCogcmVhY3RvciwgaW50IGZkLCB2b2lkKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVhZF9yZWFkeSkodm9pZCogY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp3cml0ZV9yZWFkeSkodm9pZCogY29udGV4dCkpIHsKLSAgQ0hFQ0socmVhY3RvciAhPSBOVUxMKTsKLSAgQ0hFQ0soZmQgIT0gSU5WQUxJRF9GRCk7Ci0KLSAgcmVhY3Rvcl9vYmplY3RfdCogb2JqZWN0ID0KLSAgICAgIChyZWFjdG9yX29iamVjdF90Kilvc2lfY2FsbG9jKHNpemVvZihyZWFjdG9yX29iamVjdF90KSk7Ci0KLSAgb2JqZWN0LT5yZWFjdG9yID0gcmVhY3RvcjsKLSAgb2JqZWN0LT5mZCA9IGZkOwotICBvYmplY3QtPmNvbnRleHQgPSBjb250ZXh0OwotICBvYmplY3QtPnJlYWRfcmVhZHkgPSByZWFkX3JlYWR5OwotICBvYmplY3QtPndyaXRlX3JlYWR5ID0gd3JpdGVfcmVhZHk7Ci0gIG9iamVjdC0+bXV0ZXggPSBuZXcgc3RkOjptdXRleDsKLQotICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnQ7Ci0gIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwotICBpZiAocmVhZF9yZWFkeSkgZXZlbnQuZXZlbnRzIHw9IChFUE9MTElOIHwgRVBPTExSREhVUCk7Ci0gIGlmICh3cml0ZV9yZWFkeSkgZXZlbnQuZXZlbnRzIHw9IEVQT0xMT1VUOwotICBldmVudC5kYXRhLnB0ciA9IG9iamVjdDsKLQotICBpZiAoZXBvbGxfY3RsKHJlYWN0b3ItPmVwb2xsX2ZkLCBFUE9MTF9DVExfQURELCBmZCwgJmV2ZW50KSA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIHJlZ2lzdGVyIGZkICVkIHRvIGVwb2xsIHNldDogJXMiLCBfX2Z1bmNfXywgZmQsCi0gICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgZGVsZXRlIG9iamVjdC0+bXV0ZXg7Ci0gICAgb3NpX2ZyZWUob2JqZWN0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBvYmplY3Q7Ci19Ci0KLWJvb2wgcmVhY3Rvcl9jaGFuZ2VfcmVnaXN0cmF0aW9uKHJlYWN0b3Jfb2JqZWN0X3QqIG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWFkX3JlYWR5KSh2b2lkKiBjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp3cml0ZV9yZWFkeSkodm9pZCogY29udGV4dCkpIHsKLSAgQ0hFQ0sob2JqZWN0ICE9IE5VTEwpOwotCi0gIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudDsKLSAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7Ci0gIGlmIChyZWFkX3JlYWR5KSBldmVudC5ldmVudHMgfD0gKEVQT0xMSU4gfCBFUE9MTFJESFVQKTsKLSAgaWYgKHdyaXRlX3JlYWR5KSBldmVudC5ldmVudHMgfD0gRVBPTExPVVQ7Ci0gIGV2ZW50LmRhdGEucHRyID0gb2JqZWN0OwotCi0gIGlmIChlcG9sbF9jdGwob2JqZWN0LT5yZWFjdG9yLT5lcG9sbF9mZCwgRVBPTExfQ1RMX01PRCwgb2JqZWN0LT5mZCwgJmV2ZW50KSA9PQotICAgICAgLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBtb2RpZnkgaW50ZXJlc3Qgc2V0IGZvciBmZCAlZDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgb2JqZWN0LT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqb2JqZWN0LT5tdXRleCk7Ci0gIG9iamVjdC0+cmVhZF9yZWFkeSA9IHJlYWRfcmVhZHk7Ci0gIG9iamVjdC0+d3JpdGVfcmVhZHkgPSB3cml0ZV9yZWFkeTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCByZWFjdG9yX3VucmVnaXN0ZXIocmVhY3Rvcl9vYmplY3RfdCogb2JqKSB7Ci0gIENIRUNLKG9iaiAhPSBOVUxMKTsKLQotICByZWFjdG9yX3QqIHJlYWN0b3IgPSBvYmotPnJlYWN0b3I7Ci0KLSAgaWYgKGVwb2xsX2N0bChyZWFjdG9yLT5lcG9sbF9mZCwgRVBPTExfQ1RMX0RFTCwgb2JqLT5mZCwgTlVMTCkgPT0gLTEpCi0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gdW5yZWdpc3RlciBmZCAlZCBmcm9tIGVwb2xsIHNldDogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgb2JqLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKLQotICBpZiAocmVhY3Rvci0+aXNfcnVubmluZyAmJgotICAgICAgcHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgcmVhY3Rvci0+cnVuX3RocmVhZCkpIHsKLSAgICByZWFjdG9yLT5vYmplY3RfcmVtb3ZlZCA9IHRydWU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jaygqcmVhY3Rvci0+bGlzdF9tdXRleCk7Ci0gICAgbGlzdF9hcHBlbmQocmVhY3Rvci0+aW52YWxpZGF0aW9uX2xpc3QsIG9iaik7Ci0gIH0KLQotICAvLyBUYWtpbmcgdGhlIG9iamVjdCBsb2NrIGhlcmUgbWFrZXMgc3VyZSBhIGNhbGxiYWNrIGZvciB8b2JqfCBpc24ndAotICAvLyBjdXJyZW50bHkgZXhlY3V0aW5nLiBUaGUgcmVhY3RvciB0aHJlYWQgbXVzdCB0aGVuIGVpdGhlciBiZSBiZWZvcmUKLSAgLy8gdGhlIGNhbGxiYWNrcyBvciBhZnRlci4gSWYgYWZ0ZXIsIHdlIGtub3cgdGhhdCB0aGUgb2JqZWN0IHdvbid0IGJlCi0gIC8vIHJlZmVyZW5jZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiB0YWtlbiBvdXQgb2YgdGhlIGVwb2xsIHNldC4gSWYgYmVmb3JlLAotICAvLyBpdCB3b24ndCBiZSByZWZlcmVuY2VkIGJlY2F1c2UgdGhlIHJlYWN0b3IgdGhyZWFkIHdpbGwgY2hlY2sgdGhlCi0gIC8vIGludmFsaWRhdGlvbl9saXN0IGFuZCBmaW5kIGl0IGluIHRoZXJlLiBTbyBieSB0YWtpbmcgdGhpcyBsb2NrLCB3ZQotICAvLyBhcmUgd2FpdGluZyB1bnRpbCB0aGUgcmVhY3RvciB0aHJlYWQgZHJvcHMgYWxsIHJlZmVyZW5jZXMgdG8gfG9ianwuCi0gIC8vIE9uZSB0aGUgd2FpdCBjb21wbGV0ZXMsIHdlIGNhbiB1bmxvY2sgYW5kIGRlc3Ryb3kgfG9ianwgc2FmZWx5LgotICBvYmotPm11dGV4LT5sb2NrKCk7Ci0gIG9iai0+bXV0ZXgtPnVubG9jaygpOwotICBkZWxldGUgb2JqLT5tdXRleDsKLSAgb3NpX2ZyZWUob2JqKTsKLX0KLQotLy8gUnVucyB0aGUgcmVhY3RvciBsb29wIGZvciBhIG1heGltdW0gb2YgfGl0ZXJhdGlvbnN8LgotLy8gMCB8aXRlcmF0aW9uc3wgbWVhbnMgbG9vcCBmb3JldmVyLgotLy8gfHJlYWN0b3J8IG1heSBub3QgYmUgTlVMTC4KLXN0YXRpYyByZWFjdG9yX3N0YXR1c190IHJ1bl9yZWFjdG9yKHJlYWN0b3JfdCogcmVhY3RvciwgaW50IGl0ZXJhdGlvbnMpIHsKLSAgQ0hFQ0socmVhY3RvciAhPSBOVUxMKTsKLQotICByZWFjdG9yLT5ydW5fdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Ci0gIHJlYWN0b3ItPmlzX3J1bm5pbmcgPSB0cnVlOwotCi0gIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudHNbTUFYX0VWRU5UU107Ci0gIGZvciAoaW50IGkgPSAwOyBpdGVyYXRpb25zID09IDAgfHwgaSA8IGl0ZXJhdGlvbnM7ICsraSkgewotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCpyZWFjdG9yLT5saXN0X211dGV4KTsKLSAgICAgIGxpc3RfY2xlYXIocmVhY3Rvci0+aW52YWxpZGF0aW9uX2xpc3QpOwotICAgIH0KLQotICAgIGludCByZXQ7Ci0gICAgT1NJX05PX0lOVFIocmV0ID0gZXBvbGxfd2FpdChyZWFjdG9yLT5lcG9sbF9mZCwgZXZlbnRzLCBNQVhfRVZFTlRTLCAtMSkpOwotICAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICAgIExPR19FUlJPUigiJXMgZXJyb3IgaW4gZXBvbGxfd2FpdDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIHJlYWN0b3ItPmlzX3J1bm5pbmcgPSBmYWxzZTsKLSAgICAgIHJldHVybiBSRUFDVE9SX1NUQVRVU19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHJldDsgKytqKSB7Ci0gICAgICAvLyBUaGUgZXZlbnQgZmlsZSBkZXNjcmlwdG9yIGlzIHRoZSBvbmx5IG9uZSB0aGF0IHJlZ2lzdGVycyB3aXRoCi0gICAgICAvLyBhIE5VTEwgZGF0YSBwb2ludGVyLiBXZSB1c2UgdGhlIE5VTEwgdG8gaWRlbnRpZnkgaXQgYW5kIGJyZWFrCi0gICAgICAvLyBvdXQgb2YgdGhlIHJlYWN0b3IgbG9vcC4KLSAgICAgIGlmIChldmVudHNbal0uZGF0YS5wdHIgPT0gTlVMTCkgewotICAgICAgICBldmVudGZkX3QgdmFsdWU7Ci0gICAgICAgIGV2ZW50ZmRfcmVhZChyZWFjdG9yLT5ldmVudF9mZCwgJnZhbHVlKTsKLSAgICAgICAgcmVhY3Rvci0+aXNfcnVubmluZyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gUkVBQ1RPUl9TVEFUVVNfU1RPUDsKLSAgICAgIH0KLQotICAgICAgcmVhY3Rvcl9vYmplY3RfdCogb2JqZWN0ID0gKHJlYWN0b3Jfb2JqZWN0X3QqKWV2ZW50c1tqXS5kYXRhLnB0cjsKLQotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKCpyZWFjdG9yLT5saXN0X211dGV4KTsKLSAgICAgIGlmIChsaXN0X2NvbnRhaW5zKHJlYWN0b3ItPmludmFsaWRhdGlvbl9saXN0LCBvYmplY3QpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyBEb3duZ3JhZGUgdGhlIGxpc3QgbG9jayB0byBhbiBvYmplY3QgbG9jay4KLSAgICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IG9ial9sb2NrKCpvYmplY3QtPm11dGV4KTsKLSAgICAgICAgbG9jay51bmxvY2soKTsKLQotICAgICAgICByZWFjdG9yLT5vYmplY3RfcmVtb3ZlZCA9IGZhbHNlOwotICAgICAgICBpZiAoZXZlbnRzW2pdLmV2ZW50cyAmIChFUE9MTElOIHwgRVBPTExIVVAgfCBFUE9MTFJESFVQIHwgRVBPTExFUlIpICYmCi0gICAgICAgICAgICBvYmplY3QtPnJlYWRfcmVhZHkpCi0gICAgICAgICAgb2JqZWN0LT5yZWFkX3JlYWR5KG9iamVjdC0+Y29udGV4dCk7Ci0gICAgICAgIGlmICghcmVhY3Rvci0+b2JqZWN0X3JlbW92ZWQgJiYgZXZlbnRzW2pdLmV2ZW50cyAmIEVQT0xMT1VUICYmCi0gICAgICAgICAgICBvYmplY3QtPndyaXRlX3JlYWR5KQotICAgICAgICAgIG9iamVjdC0+d3JpdGVfcmVhZHkob2JqZWN0LT5jb250ZXh0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlYWN0b3ItPm9iamVjdF9yZW1vdmVkKSB7Ci0gICAgICAgIGRlbGV0ZSBvYmplY3QtPm11dGV4OwotICAgICAgICBvc2lfZnJlZShvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJlYWN0b3ItPmlzX3J1bm5pbmcgPSBmYWxzZTsKLSAgcmV0dXJuIFJFQUNUT1JfU1RBVFVTX0RPTkU7Ci19CmRpZmYgLS1naXQgYS9vc2kvc3JjL3JpbmdidWZmZXIuY2MgYi9vc2kvc3JjL3JpbmdidWZmZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTNhNjQuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9yaW5nYnVmZmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JpbmdidWZmZXIuaCIKLQotc3RydWN0IHJpbmdidWZmZXJfdCB7Ci0gIHNpemVfdCB0b3RhbDsKLSAgc2l6ZV90IGF2YWlsYWJsZTsKLSAgdWludDhfdCogYmFzZTsKLSAgdWludDhfdCogaGVhZDsKLSAgdWludDhfdCogdGFpbDsKLX07Ci0KLXJpbmdidWZmZXJfdCogcmluZ2J1ZmZlcl9pbml0KGNvbnN0IHNpemVfdCBzaXplKSB7Ci0gIHJpbmdidWZmZXJfdCogcCA9Ci0gICAgICBzdGF0aWNfY2FzdDxyaW5nYnVmZmVyX3QqPihvc2lfY2FsbG9jKHNpemVvZihyaW5nYnVmZmVyX3QpKSk7Ci0KLSAgcC0+YmFzZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihvc2lfY2FsbG9jKHNpemUpKTsKLSAgcC0+aGVhZCA9IHAtPnRhaWwgPSBwLT5iYXNlOwotICBwLT50b3RhbCA9IHAtPmF2YWlsYWJsZSA9IHNpemU7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgcmluZ2J1ZmZlcl9mcmVlKHJpbmdidWZmZXJfdCogcmIpIHsKLSAgaWYgKHJiICE9IE5VTEwpIG9zaV9mcmVlKHJiLT5iYXNlKTsKLSAgb3NpX2ZyZWUocmIpOwotfQotCi1zaXplX3QgcmluZ2J1ZmZlcl9hdmFpbGFibGUoY29uc3QgcmluZ2J1ZmZlcl90KiByYikgewotICBDSEVDSyhyYik7Ci0gIHJldHVybiByYi0+YXZhaWxhYmxlOwotfQotCi1zaXplX3QgcmluZ2J1ZmZlcl9zaXplKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpIHsKLSAgQ0hFQ0socmIpOwotICByZXR1cm4gcmItPnRvdGFsIC0gcmItPmF2YWlsYWJsZTsKLX0KLQotc2l6ZV90IHJpbmdidWZmZXJfaW5zZXJ0KHJpbmdidWZmZXJfdCogcmIsIGNvbnN0IHVpbnQ4X3QqIHAsIHNpemVfdCBsZW5ndGgpIHsKLSAgQ0hFQ0socmIpOwotICBDSEVDSyhwKTsKLQotICBpZiAobGVuZ3RoID4gcmluZ2J1ZmZlcl9hdmFpbGFibGUocmIpKSBsZW5ndGggPSByaW5nYnVmZmVyX2F2YWlsYWJsZShyYik7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsKLSAgICAqcmItPnRhaWwrKyA9ICpwKys7Ci0gICAgaWYgKHJiLT50YWlsID49IChyYi0+YmFzZSArIHJiLT50b3RhbCkpIHJiLT50YWlsID0gcmItPmJhc2U7Ci0gIH0KLQotICByYi0+YXZhaWxhYmxlIC09IGxlbmd0aDsKLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotc2l6ZV90IHJpbmdidWZmZXJfZGVsZXRlKHJpbmdidWZmZXJfdCogcmIsIHNpemVfdCBsZW5ndGgpIHsKLSAgQ0hFQ0socmIpOwotCi0gIGlmIChsZW5ndGggPiByaW5nYnVmZmVyX3NpemUocmIpKSBsZW5ndGggPSByaW5nYnVmZmVyX3NpemUocmIpOwotCi0gIHJiLT5oZWFkICs9IGxlbmd0aDsKLSAgaWYgKHJiLT5oZWFkID49IChyYi0+YmFzZSArIHJiLT50b3RhbCkpIHJiLT5oZWFkIC09IHJiLT50b3RhbDsKLQotICByYi0+YXZhaWxhYmxlICs9IGxlbmd0aDsKLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotc2l6ZV90IHJpbmdidWZmZXJfcGVlayhjb25zdCByaW5nYnVmZmVyX3QqIHJiLCBvZmZfdCBvZmZzZXQsIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgQ0hFQ0socmIpOwotICBDSEVDSyhwKTsKLSAgQ0hFQ0sob2Zmc2V0ID49IDApOwotICBDSEVDSygoc2l6ZV90KW9mZnNldCA8PSByaW5nYnVmZmVyX3NpemUocmIpKTsKLQotICB1aW50OF90KiBiID0gKChyYi0+aGVhZCAtIHJiLT5iYXNlICsgb2Zmc2V0KSAlIHJiLT50b3RhbCkgKyByYi0+YmFzZTsKLSAgY29uc3Qgc2l6ZV90IGJ5dGVzX3RvX2NvcHkgPSAob2Zmc2V0ICsgbGVuZ3RoID4gcmluZ2J1ZmZlcl9zaXplKHJiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByaW5nYnVmZmVyX3NpemUocmIpIC0gb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoOwotCi0gIGZvciAoc2l6ZV90IGNvcGllZCA9IDA7IGNvcGllZCA8IGJ5dGVzX3RvX2NvcHk7ICsrY29waWVkKSB7Ci0gICAgKnArKyA9ICpiKys7Ci0gICAgaWYgKGIgPj0gKHJiLT5iYXNlICsgcmItPnRvdGFsKSkgYiA9IHJiLT5iYXNlOwotICB9Ci0KLSAgcmV0dXJuIGJ5dGVzX3RvX2NvcHk7Ci19Ci0KLXNpemVfdCByaW5nYnVmZmVyX3BvcChyaW5nYnVmZmVyX3QqIHJiLCB1aW50OF90KiBwLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIENIRUNLKHJiKTsKLSAgQ0hFQ0socCk7Ci0KLSAgY29uc3Qgc2l6ZV90IGNvcGllZCA9IHJpbmdidWZmZXJfcGVlayhyYiwgMCwgcCwgbGVuZ3RoKTsKLSAgcmItPmhlYWQgKz0gY29waWVkOwotICBpZiAocmItPmhlYWQgPj0gKHJiLT5iYXNlICsgcmItPnRvdGFsKSkgcmItPmhlYWQgLT0gcmItPnRvdGFsOwotCi0gIHJiLT5hdmFpbGFibGUgKz0gY29waWVkOwotICByZXR1cm4gY29waWVkOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy9zZW1hcGhvcmUuY2MgYi9vc2kvc3JjL3NlbWFwaG9yZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwOWQ3Mi4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL3NlbWFwaG9yZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX3NlbWFwaG9yZSIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi0jaWYgIWRlZmluZWQoRUZEX1NFTUFQSE9SRSkKLSNkZWZpbmUgRUZEX1NFTUFQSE9SRSAoMSA8PCAwKQotI2VuZGlmCi0KLXN0cnVjdCBzZW1hcGhvcmVfdCB7Ci0gIGludCBmZDsKLX07Ci0KLXNlbWFwaG9yZV90KiBzZW1hcGhvcmVfbmV3KHVuc2lnbmVkIGludCB2YWx1ZSkgewotICBzZW1hcGhvcmVfdCogcmV0ID0gc3RhdGljX2Nhc3Q8c2VtYXBob3JlX3QqPihvc2lfbWFsbG9jKHNpemVvZihzZW1hcGhvcmVfdCkpKTsKLSAgcmV0LT5mZCA9IGV2ZW50ZmQodmFsdWUsIEVGRF9TRU1BUEhPUkUpOwotICBpZiAocmV0LT5mZCA9PSBJTlZBTElEX0ZEKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYWxsb2NhdGUgc2VtYXBob3JlOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIG9zaV9mcmVlKHJldCk7Ci0gICAgcmV0ID0gTlVMTDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi12b2lkIHNlbWFwaG9yZV9mcmVlKHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpIHsKLSAgaWYgKCFzZW1hcGhvcmUpIHJldHVybjsKLQotICBpZiAoc2VtYXBob3JlLT5mZCAhPSBJTlZBTElEX0ZEKSBjbG9zZShzZW1hcGhvcmUtPmZkKTsKLSAgb3NpX2ZyZWUoc2VtYXBob3JlKTsKLX0KLQotdm9pZCBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7Ci0gIENIRUNLKHNlbWFwaG9yZSAhPSBOVUxMKTsKLSAgQ0hFQ0soc2VtYXBob3JlLT5mZCAhPSBJTlZBTElEX0ZEKTsKLQotICBldmVudGZkX3QgdmFsdWU7Ci0gIGlmIChldmVudGZkX3JlYWQoc2VtYXBob3JlLT5mZCwgJnZhbHVlKSA9PSAtMSkKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byB3YWl0IG9uIHNlbWFwaG9yZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLX0KLQotYm9vbCBzZW1hcGhvcmVfdHJ5X3dhaXQoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBDSEVDSyhzZW1hcGhvcmUgIT0gTlVMTCk7Ci0gIENIRUNLKHNlbWFwaG9yZS0+ZmQgIT0gSU5WQUxJRF9GRCk7Ci0KLSAgaW50IGZsYWdzID0gZmNudGwoc2VtYXBob3JlLT5mZCwgRl9HRVRGTCk7Ci0gIGlmIChmbGFncyA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGdldCBmbGFncyBmb3Igc2VtYXBob3JlIGZkOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZmNudGwoc2VtYXBob3JlLT5mZCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIHNldCBPX05PTkJMT0NLIGZvciBzZW1hcGhvcmUgZmQ6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCByYyA9IHRydWU7Ci0gIGV2ZW50ZmRfdCB2YWx1ZTsKLSAgaWYgKGV2ZW50ZmRfcmVhZChzZW1hcGhvcmUtPmZkLCAmdmFsdWUpID09IC0xKSByYyA9IGZhbHNlOwotCi0gIGlmIChmY250bChzZW1hcGhvcmUtPmZkLCBGX1NFVEZMLCBmbGFncykgPT0gLTEpCi0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gcmVzdG9yZSBmbGFncyBmb3Igc2VtYXBob3JlIGZkOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICByZXR1cm4gcmM7Ci19Ci0KLXZvaWQgc2VtYXBob3JlX3Bvc3Qoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBDSEVDSyhzZW1hcGhvcmUgIT0gTlVMTCk7Ci0gIENIRUNLKHNlbWFwaG9yZS0+ZmQgIT0gSU5WQUxJRF9GRCk7Ci0KLSAgaWYgKGV2ZW50ZmRfd3JpdGUoc2VtYXBob3JlLT5mZCwgMVVMTCkgPT0gLTEpCi0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gcG9zdCB0byBzZW1hcGhvcmU6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLWludCBzZW1hcGhvcmVfZ2V0X2ZkKGNvbnN0IHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpIHsKLSAgQ0hFQ0soc2VtYXBob3JlICE9IE5VTEwpOwotICBDSEVDSyhzZW1hcGhvcmUtPmZkICE9IElOVkFMSURfRkQpOwotICByZXR1cm4gc2VtYXBob3JlLT5mZDsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvc29ja2V0LmNjIGIvb3NpL3NyYy9zb2NrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzQ4MzUuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9zb2NrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X29zaV9zb2NrZXQiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zb2NrZXQuaCIKLQotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JlYWN0b3IuaCIKLQotLy8gVGhlIElQdjQgbG9vcGJhY2sgYWRkcmVzczogMTI3LjAuMC4xCi1zdGF0aWMgY29uc3QgaW5fYWRkcl90IExPQ0FMSE9TVF8gPSAweDdmMDAwMDAxOwotCi1zdHJ1Y3Qgc29ja2V0X3QgewotICBpbnQgZmQ7Ci0gIHJlYWN0b3Jfb2JqZWN0X3QqIHJlYWN0b3Jfb2JqZWN0OwotICBzb2NrZXRfY2IgcmVhZF9yZWFkeTsKLSAgc29ja2V0X2NiIHdyaXRlX3JlYWR5OwotICB2b2lkKiBjb250ZXh0OyAgLy8gTm90IG93bmVkLCBkbyBub3QgZnJlZS4KLX07Ci0KLXN0YXRpYyB2b2lkIGludGVybmFsX3JlYWRfcmVhZHkodm9pZCogY29udGV4dCk7Ci1zdGF0aWMgdm9pZCBpbnRlcm5hbF93cml0ZV9yZWFkeSh2b2lkKiBjb250ZXh0KTsKLQotc29ja2V0X3QqIHNvY2tldF9uZXcodm9pZCkgewotICBzb2NrZXRfdCogcmV0ID0gKHNvY2tldF90Kilvc2lfY2FsbG9jKHNpemVvZihzb2NrZXRfdCkpOwotICBpbnQgZW5hYmxlID0gMTsKLQotICByZXQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7Ci0gIGlmIChyZXQtPmZkID09IElOVkFMSURfRkQpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBjcmVhdGUgc29ja2V0OiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBpZiAoc2V0c29ja29wdChyZXQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZlbmFibGUsIHNpemVvZihlbmFibGUpKSA9PQotICAgICAgLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotCi1lcnJvcjo7Ci0gIGlmIChyZXQpIGNsb3NlKHJldC0+ZmQpOwotICBvc2lfZnJlZShyZXQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotc29ja2V0X3QqIHNvY2tldF9uZXdfZnJvbV9mZChpbnQgZmQpIHsKLSAgQ0hFQ0soZmQgIT0gSU5WQUxJRF9GRCk7Ci0KLSAgc29ja2V0X3QqIHJldCA9IChzb2NrZXRfdCopb3NpX2NhbGxvYyhzaXplb2Yoc29ja2V0X3QpKTsKLQotICByZXQtPmZkID0gZmQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgc29ja2V0X2ZyZWUoc29ja2V0X3QqIHNvY2tldCkgewotICBpZiAoIXNvY2tldCkgcmV0dXJuOwotCi0gIHNvY2tldF91bnJlZ2lzdGVyKHNvY2tldCk7Ci0gIGNsb3NlKHNvY2tldC0+ZmQpOwotICBvc2lfZnJlZShzb2NrZXQpOwotfQotCi1ib29sIHNvY2tldF9saXN0ZW4oY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgcG9ydF90IHBvcnQpIHsKLSAgQ0hFQ0soc29ja2V0ICE9IE5VTEwpOwotCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKExPQ0FMSE9TVF8pOwotICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gIGlmIChiaW5kKHNvY2tldC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYmluZCBzb2NrZXQgdG8gcG9ydCAldTogJXMiLCBfX2Z1bmNfXywgcG9ydCwKLSAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobGlzdGVuKHNvY2tldC0+ZmQsIDEwKSA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIGxpc3RlbiBvbiBwb3J0ICV1OiAlcyIsIF9fZnVuY19fLCBwb3J0LAotICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zb2NrZXRfdCogc29ja2V0X2FjY2VwdChjb25zdCBzb2NrZXRfdCogc29ja2V0KSB7Ci0gIENIRUNLKHNvY2tldCAhPSBOVUxMKTsKLQotICBpbnQgZmQ7Ci0gIE9TSV9OT19JTlRSKGZkID0gYWNjZXB0KHNvY2tldC0+ZmQsIE5VTEwsIE5VTEwpKTsKLSAgaWYgKGZkID09IElOVkFMSURfRkQpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBhY2NlcHQgc29ja2V0OiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc29ja2V0X3QqIHJldCA9IChzb2NrZXRfdCopb3NpX2NhbGxvYyhzaXplb2Yoc29ja2V0X3QpKTsKLQotICByZXQtPmZkID0gZmQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3Qgc29ja2V0X3JlYWQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgdm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKLSAgQ0hFQ0soc29ja2V0ICE9IE5VTEwpOwotICBDSEVDSyhidWYgIT0gTlVMTCk7Ci0KLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHJlY3Yoc29ja2V0LT5mZCwgYnVmLCBjb3VudCwgTVNHX0RPTlRXQUlUKSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3NpemVfdCBzb2NrZXRfd3JpdGUoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKLSAgQ0hFQ0soc29ja2V0ICE9IE5VTEwpOwotICBDSEVDSyhidWYgIT0gTlVMTCk7Ci0KLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHNlbmQoc29ja2V0LT5mZCwgYnVmLCBjb3VudCwgTVNHX0RPTlRXQUlUKSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3NpemVfdCBzb2NrZXRfd3JpdGVfYW5kX3RyYW5zZmVyX2ZkKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGludCBmZCkgewotICBDSEVDSyhzb2NrZXQgIT0gTlVMTCk7Ci0gIENIRUNLKGJ1ZiAhPSBOVUxMKTsKLQotICBpZiAoZmQgPT0gSU5WQUxJRF9GRCkgcmV0dXJuIHNvY2tldF93cml0ZShzb2NrZXQsIGJ1ZiwgY291bnQpOwotCi0gIHN0cnVjdCBtc2doZHIgbXNnOwotICBzdHJ1Y3QgaW92ZWMgaW92OwotICBjaGFyIGNvbnRyb2xfYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKLQotICBpb3YuaW92X2Jhc2UgPSAodm9pZCopYnVmOwotICBpb3YuaW92X2xlbiA9IGNvdW50OwotCi0gIG1zZy5tc2dfaW92ID0gJmlvdjsKLSAgbXNnLm1zZ19pb3ZsZW4gPSAxOwotICBtc2cubXNnX2NvbnRyb2wgPSBjb250cm9sX2J1ZjsKLSAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNvbnRyb2xfYnVmKTsKLSAgbXNnLm1zZ19uYW1lID0gTlVMTDsKLSAgbXNnLm1zZ19uYW1lbGVuID0gMDsKLQotICBzdHJ1Y3QgY21zZ2hkciogaGVhZGVyID0gQ01TR19GSVJTVEhEUigmbXNnKTsKLSAgaGVhZGVyLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKLSAgaGVhZGVyLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOwotICBoZWFkZXItPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOwotICAqKGludCopQ01TR19EQVRBKGhlYWRlcikgPSBmZDsKLQotICBzc2l6ZV90IHJldDsKLSAgT1NJX05PX0lOVFIocmV0ID0gc2VuZG1zZyhzb2NrZXQtPmZkLCAmbXNnLCBNU0dfRE9OVFdBSVQpKTsKLQotICBjbG9zZShmZCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3Qgc29ja2V0X2J5dGVzX2F2YWlsYWJsZShjb25zdCBzb2NrZXRfdCogc29ja2V0KSB7Ci0gIENIRUNLKHNvY2tldCAhPSBOVUxMKTsKLQotICBpbnQgc2l6ZSA9IDA7Ci0gIGlmIChpb2N0bChzb2NrZXQtPmZkLCBGSU9OUkVBRCwgJnNpemUpID09IC0xKSByZXR1cm4gLTE7Ci0gIHJldHVybiBzaXplOwotfQotCi12b2lkIHNvY2tldF9yZWdpc3Rlcihzb2NrZXRfdCogc29ja2V0LCByZWFjdG9yX3QqIHJlYWN0b3IsIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBzb2NrZXRfY2IgcmVhZF9jYiwgc29ja2V0X2NiIHdyaXRlX2NiKSB7Ci0gIENIRUNLKHNvY2tldCAhPSBOVUxMKTsKLQotICAvLyBNYWtlIHN1cmUgdGhlIHNvY2tldCBpc24ndCBjdXJyZW50bHkgcmVnaXN0ZXJlZC4KLSAgc29ja2V0X3VucmVnaXN0ZXIoc29ja2V0KTsKLQotICBzb2NrZXQtPnJlYWRfcmVhZHkgPSByZWFkX2NiOwotICBzb2NrZXQtPndyaXRlX3JlYWR5ID0gd3JpdGVfY2I7Ci0gIHNvY2tldC0+Y29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgdm9pZCAoKnJlYWRfZm4pKHZvaWQqKSA9IChyZWFkX2NiICE9IE5VTEwpID8gaW50ZXJuYWxfcmVhZF9yZWFkeSA6IE5VTEw7Ci0gIHZvaWQgKCp3cml0ZV9mbikodm9pZCopID0gKHdyaXRlX2NiICE9IE5VTEwpID8gaW50ZXJuYWxfd3JpdGVfcmVhZHkgOiBOVUxMOwotCi0gIHNvY2tldC0+cmVhY3Rvcl9vYmplY3QgPQotICAgICAgcmVhY3Rvcl9yZWdpc3RlcihyZWFjdG9yLCBzb2NrZXQtPmZkLCBzb2NrZXQsIHJlYWRfZm4sIHdyaXRlX2ZuKTsKLX0KLQotdm9pZCBzb2NrZXRfdW5yZWdpc3Rlcihzb2NrZXRfdCogc29ja2V0KSB7Ci0gIENIRUNLKHNvY2tldCAhPSBOVUxMKTsKLQotICBpZiAoc29ja2V0LT5yZWFjdG9yX29iamVjdCkgcmVhY3Rvcl91bnJlZ2lzdGVyKHNvY2tldC0+cmVhY3Rvcl9vYmplY3QpOwotICBzb2NrZXQtPnJlYWN0b3Jfb2JqZWN0ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaW50ZXJuYWxfcmVhZF9yZWFkeSh2b2lkKiBjb250ZXh0KSB7Ci0gIENIRUNLKGNvbnRleHQgIT0gTlVMTCk7Ci0KLSAgc29ja2V0X3QqIHNvY2tldCA9IHN0YXRpY19jYXN0PHNvY2tldF90Kj4oY29udGV4dCk7Ci0gIHNvY2tldC0+cmVhZF9yZWFkeShzb2NrZXQsIHNvY2tldC0+Y29udGV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVybmFsX3dyaXRlX3JlYWR5KHZvaWQqIGNvbnRleHQpIHsKLSAgQ0hFQ0soY29udGV4dCAhPSBOVUxMKTsKLQotICBzb2NrZXRfdCogc29ja2V0ID0gc3RhdGljX2Nhc3Q8c29ja2V0X3QqPihjb250ZXh0KTsKLSAgc29ja2V0LT53cml0ZV9yZWFkeShzb2NrZXQsIHNvY2tldC0+Y29udGV4dCk7Ci19CmRpZmYgLS1naXQgYS9vc2kvc3JjL3NvY2tldF91dGlscy9SRUFETUUgYi9vc2kvc3JjL3NvY2tldF91dGlscy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzQ0ZmQuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy9zb2NrZXRfdXRpbHMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotVGhlIHNvdXJjZXMgaW4gdGhpcyBmb2xkZXIgcmUgLQotICAgIGltcGxlbWVudCBzb21lIG9mIHRoZSBzb3VyY2VzIGluIGxpYmN1dGlscyAvIHNvY2tldHMgdG8gcHJvdmlkZSBhIHNob3J0IC0KLSAgICB0ZXJtIHNvbHV0aW9uIGVsaW1pbmF0aW5nIGxpYmN1dGlscyBkZXBlbmRlbmN5IGZyb20gc3lzdGVtIC8KLSAgICAgICAgYnQuT25jZSBhIGxvbmcgLQotICAgIHRlcm0gcGxhdGZvcm0gLSBpbmRlcGVuZGVudCBhYnN0cmFjdGlvbiBpcyBwcmVzZW50ZWQsCi0gICAgdGhlc2Ugc291cmNlcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaGVhZGVycyBzaG91bGQgYmUgcmVtb3ZlZC4KLQotICAgICAgICBOb3RlIHRoYXQgb25seSBhIHBhcnQgb2YgdGhlIHNvdXJjZSBmaWxlcyBhcmUgcHVsbGVkIGZyb20gbGliY3V0aWxzIC8KLSAgICAgICAgc29ja2V0cywKLSAgICBhbmQib3NpXyIgcHJlZml4IGlzIGFkZGVkIHRvIGFsbCBmdW5jdGlvbnMKLSAgICAgICAgICAgIC5UaGUgZGV2ZWxvcGVycyB3aG8gd2FudCB0byBwdWxsIHNvY2tldHMgc291cmNlcyBvdGhlciB0aGFuIHRoZQotICAgICAgICAgICAgICAgIGV4aXN0aW5nIG9uZXMgbXVzdCBwdXQgdGhlIHNvdXJjZXMgaW4gdGhpcyBmb2xkZXIgYW5kIHJlZmFjdG9yCi0gICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbnMgYXMgd2VsbC4KLQotICAgICAgICBUaGUgY3VycmVudCBzb3VyY2VzIGluY2x1ZGUgOgotCi0gICAgICAgIFtIZWFkZXJzXSAtCi0gICAgICAgIG9zaSAvIGluY2x1ZGUgLyBzb2NrZXRfdXRpbHMgLyBzb2NrZXRzLmggLQotICAgICAgICBvc2kgLyBpbmNsdWRlIC8gc29ja2V0X3V0aWxzIC8gc29ja2V0X2xvY2FsLmhbU291cmNlIGZpbGVzXSAtCi0gICAgICAgIG9zaSAvIHNyYyAvIHNvY2tldF91dGlscyAvIHNvY2tldF9sb2NhbF9jbGllbnQuY2MgLQotICAgICAgICBvc2kgLyBzcmMgLyBzb2NrZXRfdXRpbHMgLwotICAgICAgICAgICAgc29ja2V0X2xvY2FsX3NlcnZlcgotICAgICAgICAgICAgICAgIC5jYwotCi0gICAgICAgICAgICAgICAgICAgIFBsZWFzZSB1cGRhdGUgdGhlIGFib3ZlIGxpc3QgaWYgYWRkaW5nIG1vcmUgc291cmNlcy4KZGlmZiAtLWdpdCBhL29zaS9zcmMvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbF9jbGllbnQuY2MgYi9vc2kvc3JjL3NvY2tldF91dGlscy9zb2NrZXRfbG9jYWxfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGY4YjgzLi4wMDAwMDAwCi0tLSBhL29zaS9zcmMvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbF9jbGllbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NvY2tldF91dGlscy9zb2NrZXRfbG9jYWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zb2NrZXRfdXRpbHMvc29ja2V0cy5oIgotCi0jZGVmaW5lIExJU1RFTl9CQUNLTE9HIDQKLQotLyogRG9jdW1lbnRlZCBpbiBoZWFkZXIgZmlsZS4gKi8KLWludCBvc2lfc29ja2V0X21ha2Vfc29ja2FkZHJfdW4oY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVzcGFjZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4qIHBfYWRkciwgc29ja2xlbl90KiBhbGVuKSB7Ci0gIG1lbXNldChwX2FkZHIsIDAsIHNpemVvZigqcF9hZGRyKSk7Ci0gIHNpemVfdCBuYW1lbGVuOwotCi0gIHN3aXRjaCAobmFtZXNwYWNlSWQpIHsKLSAgICBjYXNlIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9BQlNUUkFDVDoKLSNpZiBkZWZpbmVkKF9fbGludXhfXykKLSAgICAgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0KLSAgICAgIC8vIFRlc3Qgd2l0aCBsZW5ndGggKzEgZm9yIHRoZSAqaW5pdGlhbCogJ1wwJy4KLSAgICAgIGlmICgobmFtZWxlbiArIDEpID4gc2l6ZW9mKHBfYWRkci0+c3VuX3BhdGgpKSB7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBOb3RlOiBUaGUgcGF0aCBpbiB0aGlzIGNhc2UgaXMgKm5vdCogc3VwcG9zZWQgdG8gYmUKLSAgICAgICAqICdcMCctdGVybWluYXRlZC4gKCJtYW4gNyB1bml4IiBmb3IgdGhlIGdvcnkgZGV0YWlscy4pCi0gICAgICAgKi8KLQotICAgICAgcF9hZGRyLT5zdW5fcGF0aFswXSA9IDA7Ci0gICAgICBtZW1jcHkocF9hZGRyLT5zdW5fcGF0aCArIDEsIG5hbWUsIG5hbWVsZW4pOwotI2Vsc2UKLSAgICAgIC8qIHRoaXMgT1MgZG9lc24ndCBoYXZlIHRoZSBMaW51eCBhYnN0cmFjdCBuYW1lc3BhY2UgKi8KLQotICAgICAgbmFtZWxlbiA9IHN0cmxlbihuYW1lKSArIHN0cmxlbihGSUxFU1lTVEVNX1NPQ0tFVF9QUkVGSVgpOwotICAgICAgLyogdW5peF9wYXRoX21heCBhcHBlYXJzIHRvIGJlIG1pc3Npbmcgb24gbGludXggKi8KLSAgICAgIGlmIChuYW1lbGVuID4KLSAgICAgICAgICBzaXplb2YoKnBfYWRkcikgLSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSAtIDEpIHsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICAgIH0KLQotICAgICAgc3RyY3B5KHBfYWRkci0+c3VuX3BhdGgsIEZJTEVTWVNURU1fU09DS0VUX1BSRUZJWCk7Ci0gICAgICBzdHJjYXQocF9hZGRyLT5zdW5fcGF0aCwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfUkVTRVJWRUQ6Ci0gICAgICBuYW1lbGVuID0gc3RybGVuKG5hbWUpICsgc3RybGVuKEFORFJPSURfUkVTRVJWRURfU09DS0VUX1BSRUZJWCk7Ci0gICAgICAvKiB1bml4X3BhdGhfbWF4IGFwcGVhcnMgdG8gYmUgbWlzc2luZyBvbiBsaW51eCAqLwotICAgICAgaWYgKG5hbWVsZW4gPgotICAgICAgICAgIHNpemVvZigqcF9hZGRyKSAtIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpIC0gMSkgewotICAgICAgICBnb3RvIGVycm9yOwotICAgICAgfQotCi0gICAgICBzdHJjcHkocF9hZGRyLT5zdW5fcGF0aCwgQU5EUk9JRF9SRVNFUlZFRF9TT0NLRVRfUFJFRklYKTsKLSAgICAgIHN0cmNhdChwX2FkZHItPnN1bl9wYXRoLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfRklMRVNZU1RFTToKLSAgICAgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0gICAgICAvKiB1bml4X3BhdGhfbWF4IGFwcGVhcnMgdG8gYmUgbWlzc2luZyBvbiBsaW51eCAqLwotICAgICAgaWYgKG5hbWVsZW4gPgotICAgICAgICAgIHNpemVvZigqcF9hZGRyKSAtIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpIC0gMSkgewotICAgICAgICBnb3RvIGVycm9yOwotICAgICAgfQotCi0gICAgICBzdHJjcHkocF9hZGRyLT5zdW5fcGF0aCwgbmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLy8gaW52YWxpZCBuYW1lc3BhY2UgaWQKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHBfYWRkci0+c3VuX2ZhbWlseSA9IEFGX0xPQ0FMOwotICAqYWxlbiA9IG5hbWVsZW4gKyBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfdW4sIHN1bl9wYXRoKSArIDE7Ci0gIHJldHVybiAwOwotZXJyb3I6Ci0gIHJldHVybiAtMTsKLX0KLQotLyoqCi0gKiBjb25uZWN0IHRvIHBlZXIgbmFtZWQgIm5hbWUiIG9uIGZkCi0gKiByZXR1cm5zIHNhbWUgZmQgb3IgLTEgb24gZXJyb3IuCi0gKiBmZCBpcyBub3QgY2xvc2VkIG9uIGVycm9yLiB0aGF0J3MgeW91ciBqb2IuCi0gKgotICogVXNlZCBieSBBbmRyb2lkU29ja2V0SW1wbAotICovCi1pbnQgb3NpX3NvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdChpbnQgZmQsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lc3BhY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlIFVOVVNFRF9BVFRSKSB7Ci0gIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOwotICBzb2NrbGVuX3QgYWxlbjsKLSAgaW50IGVycjsKLQotICBlcnIgPSBvc2lfc29ja2V0X21ha2Vfc29ja2FkZHJfdW4obmFtZSwgbmFtZXNwYWNlSWQsICZhZGRyLCAmYWxlbik7Ci0KLSAgaWYgKGVyciA8IDApIHsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgT1NJX05PX0lOVFIoZXJyID0gY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIGFsZW4pKTsKLSAgaWYgKGVyciA8IDApIHsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgcmV0dXJuIGZkOwotCi1lcnJvcjoKLSAgcmV0dXJuIC0xOwotfQotCi0vKioKLSAqIGNvbm5lY3QgdG8gcGVlciBuYW1lZCAibmFtZSIKLSAqIHJldHVybnMgZmQgb3IgLTEgb24gZXJyb3IKLSAqLwotaW50IG9zaV9zb2NrZXRfbG9jYWxfY2xpZW50KGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lc3BhY2VJZCwgaW50IHR5cGUpIHsKLSAgaW50IHM7Ci0KLSAgcyA9IHNvY2tldChBRl9MT0NBTCwgdHlwZSwgMCk7Ci0gIGlmIChzIDwgMCkgcmV0dXJuIC0xOwotCi0gIGlmICgwID4gb3NpX3NvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdChzLCBuYW1lLCBuYW1lc3BhY2VJZCwgdHlwZSkpIHsKLSAgICBjbG9zZShzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gczsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbF9zZXJ2ZXIuY2MgYi9vc2kvc3JjL3NvY2tldF91dGlscy9zb2NrZXRfbG9jYWxfc2VydmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzEwYWIyLi4wMDAwMDAwCi0tLSBhL29zaS9zcmMvc29ja2V0X3V0aWxzL3NvY2tldF9sb2NhbF9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zb2NrZXRfdXRpbHMvc29ja2V0X2xvY2FsLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc29ja2V0X3V0aWxzL3NvY2tldHMuaCIKLQotI2RlZmluZSBMSVNURU5fQkFDS0xPRyA0Ci0KLS8qIE9ubHkgdGhlIGJvdHRvbSBiaXRzIGFyZSByZWFsbHkgdGhlIHNvY2tldCB0eXBlOyB0aGVyZSBhcmUgZmxhZ3MgdG9vLiAqLwotI2RlZmluZSBTT0NLX1RZUEVfTUFTSyAweGYKLQotLyoqCi0gKiBCaW5kcyBhIHByZS1jcmVhdGVkIHNvY2tldChBRl9MT0NBTCkgJ3MnIHRvICduYW1lJwotICogcmV0dXJucyAncycgb24gc3VjY2VzcywgLTEgb24gZmFpbAotICoKLSAqIERvZXMgbm90IGNhbGwgbGlzdGVuKCkKLSAqLwotaW50IG9zaV9zb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQoaW50IHMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lc3BhY2VJZCkgewotICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKLSAgc29ja2xlbl90IGFsZW47Ci0gIGludCBuOwotICBpbnQgZXJyOwotCi0gIGVyciA9IG9zaV9zb2NrZXRfbWFrZV9zb2NrYWRkcl91bihuYW1lLCBuYW1lc3BhY2VJZCwgJmFkZHIsICZhbGVuKTsKLQotICBpZiAoZXJyIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0vKiBiYXNpY2FsbHk6IGlmIHRoaXMgaXMgYSBmaWxlc3lzdGVtIHBhdGgsIHVubGluayBmaXJzdCAqLwotI2lmICFkZWZpbmVkKF9fbGludXhfXykKLSAgaWYgKDEpIHsKLSNlbHNlCi0gIGlmIChuYW1lc3BhY2VJZCA9PSBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfUkVTRVJWRUQgfHwKLSAgICAgIG5hbWVzcGFjZUlkID09IEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9GSUxFU1lTVEVNKSB7Ci0jZW5kaWYKLSAgICAvKmlnbm9yZSBFTk9FTlQqLwotICAgIHVubGluayhhZGRyLnN1bl9wYXRoKTsKLSAgfQotCi0gIG4gPSAxOwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm4sIHNpemVvZihuKSk7Ci0KLSAgaWYgKGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIGFsZW4pIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBzOwotfQotCi0vKiogT3BlbiBhIHNlcnZlci1zaWRlIFVOSVggZG9tYWluIGRhdGFncmFtIHNvY2tldCBpbiB0aGUgTGludXggbm9uLWZpbGVzeXN0ZW0KLSAqICBuYW1lc3BhY2UKLSAqCi0gKiAgUmV0dXJucyBmZCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsCi0gKi8KLWludCBvc2lfc29ja2V0X2xvY2FsX3NlcnZlcihjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZXNwYWNlSWQsIGludCB0eXBlKSB7Ci0gIGludCBlcnI7Ci0gIGludCBzOwotCi0gIHMgPSBzb2NrZXQoQUZfTE9DQUwsIHR5cGUsIDApOwotICBpZiAocyA8IDApIHJldHVybiAtMTsKLQotICBlcnIgPSBvc2lfc29ja2V0X2xvY2FsX3NlcnZlcl9iaW5kKHMsIG5hbWUsIG5hbWVzcGFjZUlkKTsKLQotICBpZiAoZXJyIDwgMCkgewotICAgIGNsb3NlKHMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmICgodHlwZSAmIFNPQ0tfVFlQRV9NQVNLKSA9PSBTT0NLX1NUUkVBTSkgewotICAgIGludCByZXQ7Ci0KLSAgICByZXQgPSBsaXN0ZW4ocywgTElTVEVOX0JBQ0tMT0cpOwotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgIGNsb3NlKHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBzOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy90aHJlYWQuY2MgYi9vc2kvc3JjL3RocmVhZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYzVhZC4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL3RocmVhZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX3RocmVhZCIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcmVhY3Rvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotCi1zdHJ1Y3QgdGhyZWFkX3QgewotICBzdGQ6OmF0b21pY19ib29sIGlzX2pvaW5lZHtmYWxzZX07Ci0gIHB0aHJlYWRfdCBwdGhyZWFkOwotICBwaWRfdCB0aWQ7Ci0gIGNoYXIgbmFtZVtUSFJFQURfTkFNRV9NQVggKyAxXTsKLSAgcmVhY3Rvcl90KiByZWFjdG9yOwotICBmaXhlZF9xdWV1ZV90KiB3b3JrX3F1ZXVlOwotfTsKLQotc3RydWN0IHN0YXJ0X2FyZyB7Ci0gIHRocmVhZF90KiB0aHJlYWQ7Ci0gIHNlbWFwaG9yZV90KiBzdGFydF9zZW07Ci0gIGludCBlcnJvcjsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdGhyZWFkX2ZuIGZ1bmM7Ci0gIHZvaWQqIGNvbnRleHQ7Ci19IHdvcmtfaXRlbV90OwotCi1zdGF0aWMgdm9pZCogcnVuX3RocmVhZCh2b2lkKiBzdGFydF9hcmcpOwotc3RhdGljIHZvaWQgd29ya19xdWV1ZV9yZWFkX2NiKHZvaWQqIGNvbnRleHQpOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IERFRkFVTFRfV09SS19RVUVVRV9DQVBBQ0lUWSA9IDEyODsKLQotdGhyZWFkX3QqIHRocmVhZF9uZXdfc2l6ZWQoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHdvcmtfcXVldWVfY2FwYWNpdHkpIHsKLSAgQ0hFQ0sobmFtZSAhPSBOVUxMKTsKLSAgQ0hFQ0sod29ya19xdWV1ZV9jYXBhY2l0eSAhPSAwKTsKLQotICB0aHJlYWRfdCogcmV0ID0gc3RhdGljX2Nhc3Q8dGhyZWFkX3QqPihvc2lfY2FsbG9jKHNpemVvZih0aHJlYWRfdCkpKTsKLQotICByZXQtPnJlYWN0b3IgPSByZWFjdG9yX25ldygpOwotICBpZiAoIXJldC0+cmVhY3RvcikgZ290byBlcnJvcjsKLQotICByZXQtPndvcmtfcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcod29ya19xdWV1ZV9jYXBhY2l0eSk7Ci0gIGlmICghcmV0LT53b3JrX3F1ZXVlKSBnb3RvIGVycm9yOwotCi0gIC8vIFN0YXJ0IGlzIG9uIHRoZSBzdGFjaywgYnV0IHdlIHVzZSBhIHNlbWFwaG9yZSwgc28gaXQncyBzYWZlCi0gIHN0cnVjdCBzdGFydF9hcmcgc3RhcnQ7Ci0gIHN0YXJ0LnN0YXJ0X3NlbSA9IHNlbWFwaG9yZV9uZXcoMCk7Ci0gIGlmICghc3RhcnQuc3RhcnRfc2VtKSBnb3RvIGVycm9yOwotCi0gIHN0cm5jcHkocmV0LT5uYW1lLCBuYW1lLCBUSFJFQURfTkFNRV9NQVgpOwotICBzdGFydC50aHJlYWQgPSByZXQ7Ci0gIHN0YXJ0LmVycm9yID0gMDsKLSAgcHRocmVhZF9jcmVhdGUoJnJldC0+cHRocmVhZCwgTlVMTCwgcnVuX3RocmVhZCwgJnN0YXJ0KTsKLSAgc2VtYXBob3JlX3dhaXQoc3RhcnQuc3RhcnRfc2VtKTsKLSAgc2VtYXBob3JlX2ZyZWUoc3RhcnQuc3RhcnRfc2VtKTsKLQotICBpZiAoc3RhcnQuZXJyb3IpIGdvdG8gZXJyb3I7Ci0KLSAgcmV0dXJuIHJldDsKLQotZXJyb3I6OwotICBpZiAocmV0KSB7Ci0gICAgZml4ZWRfcXVldWVfZnJlZShyZXQtPndvcmtfcXVldWUsIG9zaV9mcmVlKTsKLSAgICByZWFjdG9yX2ZyZWUocmV0LT5yZWFjdG9yKTsKLSAgfQotICBvc2lfZnJlZShyZXQpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdGhyZWFkX3QqIHRocmVhZF9uZXcoY29uc3QgY2hhciogbmFtZSkgewotICByZXR1cm4gdGhyZWFkX25ld19zaXplZChuYW1lLCBERUZBVUxUX1dPUktfUVVFVUVfQ0FQQUNJVFkpOwotfQotCi12b2lkIHRocmVhZF9mcmVlKHRocmVhZF90KiB0aHJlYWQpIHsKLSAgaWYgKCF0aHJlYWQpIHJldHVybjsKLQotICB0aHJlYWRfc3RvcCh0aHJlYWQpOwotICB0aHJlYWRfam9pbih0aHJlYWQpOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUodGhyZWFkLT53b3JrX3F1ZXVlLCBvc2lfZnJlZSk7Ci0gIHJlYWN0b3JfZnJlZSh0aHJlYWQtPnJlYWN0b3IpOwotICBvc2lfZnJlZSh0aHJlYWQpOwotfQotCi12b2lkIHRocmVhZF9qb2luKHRocmVhZF90KiB0aHJlYWQpIHsKLSAgQ0hFQ0sodGhyZWFkICE9IE5VTEwpOwotCi0gIGlmICghc3RkOjphdG9taWNfZXhjaGFuZ2UoJnRocmVhZC0+aXNfam9pbmVkLCB0cnVlKSkKLSAgICBwdGhyZWFkX2pvaW4odGhyZWFkLT5wdGhyZWFkLCBOVUxMKTsKLX0KLQotYm9vbCB0aHJlYWRfcG9zdCh0aHJlYWRfdCogdGhyZWFkLCB0aHJlYWRfZm4gZnVuYywgdm9pZCogY29udGV4dCkgewotICBDSEVDSyh0aHJlYWQgIT0gTlVMTCk7Ci0gIENIRUNLKGZ1bmMgIT0gTlVMTCk7Ci0KLSAgLy8gVE9ETyhzaGFydmlsKTogaWYgdGhlIGN1cnJlbnQgdGhyZWFkID09IHx0aHJlYWR8IGFuZCB3ZSd2ZSBydW4gb3V0Ci0gIC8vIG9mIHF1ZXVlIHNwYWNlLCB3ZSBzaG91bGQgYWJvcnQgdGhpcyBvcGVyYXRpb24sIG90aGVyd2lzZSB3ZSdsbAotICAvLyBkZWFkbG9jay4KLQotICAvLyBRdWV1ZSBpdGVtIGlzIGZyZWVkIGVpdGhlciB3aGVuIHRoZSBxdWV1ZSBpdHNlbGYgaXMgZGVzdHJveWVkCi0gIC8vIG9yIHdoZW4gdGhlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBmb3IgZGlzcGF0Y2guCi0gIHdvcmtfaXRlbV90KiBpdGVtID0gKHdvcmtfaXRlbV90Kilvc2lfbWFsbG9jKHNpemVvZih3b3JrX2l0ZW1fdCkpOwotICBpdGVtLT5mdW5jID0gZnVuYzsKLSAgaXRlbS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0gIGZpeGVkX3F1ZXVlX2VucXVldWUodGhyZWFkLT53b3JrX3F1ZXVlLCBpdGVtKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgdGhyZWFkX3N0b3AodGhyZWFkX3QqIHRocmVhZCkgewotICBDSEVDSyh0aHJlYWQgIT0gTlVMTCk7Ci0gIHJlYWN0b3Jfc3RvcCh0aHJlYWQtPnJlYWN0b3IpOwotfQotCi1ib29sIHRocmVhZF9zZXRfcHJpb3JpdHkodGhyZWFkX3QqIHRocmVhZCwgaW50IHByaW9yaXR5KSB7Ci0gIGlmICghdGhyZWFkKSByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3QgaW50IHJjID0gc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCB0aHJlYWQtPnRpZCwgcHJpb3JpdHkpOwotICBpZiAocmMgPCAwKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gc2V0IHRocmVhZCBwcmlvcml0eSAlZCBmb3IgdGlkICVkLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBwcmlvcml0eSwgdGhyZWFkLT50aWQsIHJjKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB0aHJlYWRfc2V0X3J0X3ByaW9yaXR5KHRocmVhZF90KiB0aHJlYWQsIGludCBwcmlvcml0eSkgewotICBpZiAoIXRocmVhZCkgcmV0dXJuIGZhbHNlOwotCi0gIHN0cnVjdCBzY2hlZF9wYXJhbSBydF9wYXJhbXM7Ci0gIHJ0X3BhcmFtcy5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OwotCi0gIGNvbnN0IGludCByYyA9IHNjaGVkX3NldHNjaGVkdWxlcih0aHJlYWQtPnRpZCwgU0NIRURfRklGTywgJnJ0X3BhcmFtcyk7Ci0gIGlmIChyYyAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gc2V0IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgZm9yIHRpZCAlZCwgZXJyb3IgJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgcHJpb3JpdHksIHRocmVhZC0+dGlkLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHRocmVhZF9pc19zZWxmKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpIHsKLSAgQ0hFQ0sodGhyZWFkICE9IE5VTEwpOwotICByZXR1cm4gISFwdGhyZWFkX2VxdWFsKHB0aHJlYWRfc2VsZigpLCB0aHJlYWQtPnB0aHJlYWQpOwotfQotCi1yZWFjdG9yX3QqIHRocmVhZF9nZXRfcmVhY3Rvcihjb25zdCB0aHJlYWRfdCogdGhyZWFkKSB7Ci0gIENIRUNLKHRocmVhZCAhPSBOVUxMKTsKLSAgcmV0dXJuIHRocmVhZC0+cmVhY3RvcjsKLX0KLQotY29uc3QgY2hhciogdGhyZWFkX25hbWUoY29uc3QgdGhyZWFkX3QqIHRocmVhZCkgewotICBDSEVDSyh0aHJlYWQgIT0gTlVMTCk7Ci0gIHJldHVybiB0aHJlYWQtPm5hbWU7Ci19Ci0KLXN0YXRpYyB2b2lkKiBydW5fdGhyZWFkKHZvaWQqIHN0YXJ0X2FyZykgewotICBDSEVDSyhzdGFydF9hcmcgIT0gTlVMTCk7Ci0KLSAgc3RydWN0IHN0YXJ0X2FyZyogc3RhcnQgPSBzdGF0aWNfY2FzdDxzdHJ1Y3Qgc3RhcnRfYXJnKj4oc3RhcnRfYXJnKTsKLSAgdGhyZWFkX3QqIHRocmVhZCA9IHN0YXJ0LT50aHJlYWQ7Ci0KLSAgQ0hFQ0sodGhyZWFkICE9IE5VTEwpOwotCi0gIGlmIChwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpdGhyZWFkLT5uYW1lKSA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgdW5hYmxlIHRvIHNldCB0aHJlYWQgbmFtZTogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBzdGFydC0+ZXJyb3IgPSBlcnJubzsKLSAgICBzZW1hcGhvcmVfcG9zdChzdGFydC0+c3RhcnRfc2VtKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICB0aHJlYWQtPnRpZCA9IGdldHRpZCgpOwotCi0gIExPR19JTkZPKCIlczogdGhyZWFkIGlkICVkLCB0aHJlYWQgbmFtZSAlcyBzdGFydGVkIiwgX19mdW5jX18sIHRocmVhZC0+dGlkLAotICAgICAgICAgICB0aHJlYWQtPm5hbWUpOwotCi0gIHNlbWFwaG9yZV9wb3N0KHN0YXJ0LT5zdGFydF9zZW0pOwotCi0gIGludCBmZCA9IGZpeGVkX3F1ZXVlX2dldF9kZXF1ZXVlX2ZkKHRocmVhZC0+d29ya19xdWV1ZSk7Ci0gIHZvaWQqIGNvbnRleHQgPSB0aHJlYWQtPndvcmtfcXVldWU7Ci0KLSAgcmVhY3Rvcl9vYmplY3RfdCogd29ya19xdWV1ZV9vYmplY3QgPQotICAgICAgcmVhY3Rvcl9yZWdpc3Rlcih0aHJlYWQtPnJlYWN0b3IsIGZkLCBjb250ZXh0LCB3b3JrX3F1ZXVlX3JlYWRfY2IsIE5VTEwpOwotICByZWFjdG9yX3N0YXJ0KHRocmVhZC0+cmVhY3Rvcik7Ci0gIHJlYWN0b3JfdW5yZWdpc3Rlcih3b3JrX3F1ZXVlX29iamVjdCk7Ci0KLSAgLy8gTWFrZSBzdXJlIHdlIGRpc3BhdGNoIGFsbCBxdWV1ZWQgd29yayBpdGVtcyBiZWZvcmUgZXhpdGluZyB0aGUgdGhyZWFkLgotICAvLyBUaGlzIGFsbG93cyBhIGNhbGxlciB0byBzYWZlbHkgdGVhciBkb3duIGJ5IGVucXVldWluZyBhIHRlYXJkb3duCi0gIC8vIHdvcmsgaXRlbSBhbmQgdGhlbiBqb2luaW5nIHRoZSB0aHJlYWQuCi0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdvcmtfaXRlbV90KiBpdGVtID0KLSAgICAgIHN0YXRpY19jYXN0PHdvcmtfaXRlbV90Kj4oZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUodGhyZWFkLT53b3JrX3F1ZXVlKSk7Ci0gIHdoaWxlIChpdGVtICYmIGNvdW50IDw9IGZpeGVkX3F1ZXVlX2NhcGFjaXR5KHRocmVhZC0+d29ya19xdWV1ZSkpIHsKLSAgICBpdGVtLT5mdW5jKGl0ZW0tPmNvbnRleHQpOwotICAgIG9zaV9mcmVlKGl0ZW0pOwotICAgIGl0ZW0gPQotICAgICAgICBzdGF0aWNfY2FzdDx3b3JrX2l0ZW1fdCo+KGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHRocmVhZC0+d29ya19xdWV1ZSkpOwotICAgICsrY291bnQ7Ci0gIH0KLQotICBpZiAoY291bnQgPiBmaXhlZF9xdWV1ZV9jYXBhY2l0eSh0aHJlYWQtPndvcmtfcXVldWUpKQotICAgIExPR19JTkZPKCIlcyBncm93aW5nIGV2ZW50IHF1ZXVlIG9uIHNodXRkb3duLiIsIF9fZnVuY19fKTsKLQotICBMT0dfV0FSTigiJXM6IHRocmVhZCBpZCAlZCwgdGhyZWFkIG5hbWUgJXMgZXhpdGVkIiwgX19mdW5jX18sIHRocmVhZC0+dGlkLAotICAgICAgICAgICB0aHJlYWQtPm5hbWUpOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgd29ya19xdWV1ZV9yZWFkX2NiKHZvaWQqIGNvbnRleHQpIHsKLSAgQ0hFQ0soY29udGV4dCAhPSBOVUxMKTsKLQotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSA9IChmaXhlZF9xdWV1ZV90Kiljb250ZXh0OwotICB3b3JrX2l0ZW1fdCogaXRlbSA9IHN0YXRpY19jYXN0PHdvcmtfaXRlbV90Kj4oZml4ZWRfcXVldWVfZGVxdWV1ZShxdWV1ZSkpOwotICBpdGVtLT5mdW5jKGl0ZW0tPmNvbnRleHQpOwotICBvc2lfZnJlZShpdGVtKTsKLX0KZGlmZiAtLWdpdCBhL29zaS9zcmMvdGhyZWFkX3NjaGVkdWxlci5jYyBiL29zaS9zcmMvdGhyZWFkX3NjaGVkdWxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMWMyYy4uMDAwMDAwMAotLS0gYS9vc2kvc3JjL3RocmVhZF9zY2hlZHVsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBpbnQga1JlYWxUaW1lRmlmb1NjaGVkdWxpbmdQcmlvcml0eSA9IDE7Ci19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCB0aHJlYWRfc2NoZWR1bGVyX2VuYWJsZV9yZWFsX3RpbWUocGlkX3QgbGludXhfdGlkKSB7Ci0gIHN0cnVjdCBzY2hlZF9wYXJhbSBydF9wYXJhbXMgPSB7LnNjaGVkX3ByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JlYWxUaW1lRmlmb1NjaGVkdWxpbmdQcmlvcml0eX07Ci0gIHJldHVybiBzY2hlZF9zZXRzY2hlZHVsZXIobGludXhfdGlkLCBTQ0hFRF9GSUZPLCAmcnRfcGFyYW1zKSA9PSAwOwotfQotCi1ib29sIHRocmVhZF9zY2hlZHVsZXJfZ2V0X3ByaW9yaXR5X3JhbmdlKGludCYgbWluLCBpbnQmIG1heCkgewotICBtaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKFNDSEVEX0ZJRk8pOwotICBtYXggPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KFNDSEVEX0ZJRk8pOwotICByZXR1cm4gKG1pbiAhPSAtMSAmJiBtYXggIT0gLTEpID8gdHJ1ZSA6IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3NyYy93YWtlbG9jay5jYyBiL29zaS9zcmMvd2FrZWxvY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTcwNzcuLjAwMDAwMDAKLS0tIGEvb3NpL3NyYy93YWtlbG9jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfb3NpX3dha2Vsb2NrIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvd2FrZWxvY2suaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246OkJsdWV0b290aE1ldHJpY3NMb2dnZXI7Ci0KLXN0YXRpYyBidF9vc19jYWxsb3V0c190KiB3YWtlbG9ja19vc19jYWxsb3V0cyA9IE5VTEw7Ci1zdGF0aWMgYm9vbCBpc19uYXRpdmUgPSB0cnVlOwotCi1zdGF0aWMgY29uc3QgY2xvY2tpZF90IENMT0NLX0lEID0gQ0xPQ0tfQk9PVFRJTUU7Ci1zdGF0aWMgY29uc3QgY2hhciogV0FLRV9MT0NLX0lEID0gImJsdWV0b290aF90aW1lciI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgREVGQVVMVF9XQUtFX0xPQ0tfUEFUSCA9ICIvc3lzL3Bvd2VyL3dha2VfbG9jayI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgREVGQVVMVF9XQUtFX1VOTE9DS19QQVRIID0gIi9zeXMvcG93ZXIvd2FrZV91bmxvY2siOwotc3RhdGljIHN0ZDo6c3RyaW5nIHdha2VfbG9ja19wYXRoOwotc3RhdGljIHN0ZDo6c3RyaW5nIHdha2VfdW5sb2NrX3BhdGg7Ci1zdGF0aWMgc3NpemVfdCBsb2NrZWRfaWRfbGVuID0gLTE7Ci1zdGF0aWMgcHRocmVhZF9vbmNlX3QgaW5pdGlhbGl6ZWQgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLXN0YXRpYyBpbnQgd2FrZV9sb2NrX2ZkID0gSU5WQUxJRF9GRDsKLXN0YXRpYyBpbnQgd2FrZV91bmxvY2tfZmQgPSBJTlZBTElEX0ZEOwotCi0vLyBXYWtlbG9jayBzdGF0aXN0aWNzIGZvciB0aGUgImJsdWV0b290aF90aW1lciIKLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpc19hY3F1aXJlZDsKLSAgc2l6ZV90IGFjcXVpcmVkX2NvdW50OwotICBzaXplX3QgcmVsZWFzZWRfY291bnQ7Ci0gIHNpemVfdCBhY3F1aXJlZF9lcnJvcnM7Ci0gIHNpemVfdCByZWxlYXNlZF9lcnJvcnM7Ci0gIHVpbnQ2NF90IG1pbl9hY3F1aXJlZF9pbnRlcnZhbF9tczsKLSAgdWludDY0X3QgbWF4X2FjcXVpcmVkX2ludGVydmFsX21zOwotICB1aW50NjRfdCBsYXN0X2FjcXVpcmVkX2ludGVydmFsX21zOwotICB1aW50NjRfdCB0b3RhbF9hY3F1aXJlZF9pbnRlcnZhbF9tczsKLSAgdWludDY0X3QgbGFzdF9hY3F1aXJlZF90aW1lc3RhbXBfbXM7Ci0gIHVpbnQ2NF90IGxhc3RfcmVsZWFzZWRfdGltZXN0YW1wX21zOwotICB1aW50NjRfdCBsYXN0X3Jlc2V0X3RpbWVzdGFtcF9tczsKLSAgaW50IGxhc3RfYWNxdWlyZWRfZXJyb3I7Ci0gIGludCBsYXN0X3JlbGVhc2VkX2Vycm9yOwotfSB3YWtlbG9ja19zdGF0c190OwotCi1zdGF0aWMgd2FrZWxvY2tfc3RhdHNfdCB3YWtlbG9ja19zdGF0czsKLQotLy8gVGhpcyBtdXRleCBlbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9ucyB0aGF0IHVwZGF0ZSBhbmQgZHVtcCB0aGUgc3RhdGlzdGljcwotLy8gYXJlIGV4ZWN1dGVkIHNlcmlhbGx5Lgotc3RhdGljIHN0ZDo6bXV0ZXggc3RhdHNfbXV0ZXg7Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCB3YWtlbG9ja19hY3F1aXJlX2NhbGxvdXQodm9pZCk7Ci1zdGF0aWMgYnRfc3RhdHVzX3Qgd2FrZWxvY2tfYWNxdWlyZV9uYXRpdmUodm9pZCk7Ci1zdGF0aWMgYnRfc3RhdHVzX3Qgd2FrZWxvY2tfcmVsZWFzZV9jYWxsb3V0KHZvaWQpOwotc3RhdGljIGJ0X3N0YXR1c190IHdha2Vsb2NrX3JlbGVhc2VfbmF0aXZlKHZvaWQpOwotc3RhdGljIHZvaWQgd2FrZWxvY2tfaW5pdGlhbGl6ZSh2b2lkKTsKLXN0YXRpYyB2b2lkIHdha2Vsb2NrX2luaXRpYWxpemVfbmF0aXZlKHZvaWQpOwotc3RhdGljIHZvaWQgcmVzZXRfd2FrZWxvY2tfc3RhdHModm9pZCk7Ci1zdGF0aWMgdm9pZCB1cGRhdGVfd2FrZWxvY2tfYWNxdWlyZWRfc3RhdHMoYnRfc3RhdHVzX3QgYWNxdWlyZWRfc3RhdHVzKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV93YWtlbG9ja19yZWxlYXNlZF9zdGF0cyhidF9zdGF0dXNfdCByZWxlYXNlZF9zdGF0dXMpOwotCi12b2lkIHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cyhidF9vc19jYWxsb3V0c190KiBjYWxsb3V0cykgewotICB3YWtlbG9ja19vc19jYWxsb3V0cyA9IGNhbGxvdXRzOwotICBpc19uYXRpdmUgPSAod2FrZWxvY2tfb3NfY2FsbG91dHMgPT0gTlVMTCk7Ci0gIExPR19JTkZPKCIlcyBzZXQgdG8gJXMiLCBfX2Z1bmNfXywgKGlzX25hdGl2ZSkgPyAibmF0aXZlIiA6ICJub24tbmF0aXZlIik7Ci19Ci0KLWJvb2wgd2FrZWxvY2tfYWNxdWlyZSh2b2lkKSB7Ci0gIHB0aHJlYWRfb25jZSgmaW5pdGlhbGl6ZWQsIHdha2Vsb2NrX2luaXRpYWxpemUpOwotCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotCi0gIGlmIChpc19uYXRpdmUpCi0gICAgc3RhdHVzID0gd2FrZWxvY2tfYWNxdWlyZV9uYXRpdmUoKTsKLSAgZWxzZQotICAgIHN0YXR1cyA9IHdha2Vsb2NrX2FjcXVpcmVfY2FsbG91dCgpOwotCi0gIHVwZGF0ZV93YWtlbG9ja19hY3F1aXJlZF9zdGF0cyhzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpCi0gICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gYWNxdWlyZSB3YWtlIGxvY2s6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0KLSAgcmV0dXJuIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi1zdGF0aWMgYnRfc3RhdHVzX3Qgd2FrZWxvY2tfYWNxdWlyZV9jYWxsb3V0KHZvaWQpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGJ0X3N0YXR1c190PigKLSAgICAgIHdha2Vsb2NrX29zX2NhbGxvdXRzLT5hY3F1aXJlX3dha2VfbG9jayhXQUtFX0xPQ0tfSUQpKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHdha2Vsb2NrX2FjcXVpcmVfbmF0aXZlKHZvaWQpIHsKLSAgaWYgKHdha2VfbG9ja19mZCA9PSBJTlZBTElEX0ZEKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBsb2NrIG5vdCBhY3F1aXJlZCwgaW52YWxpZCBmZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1BBUk1fSU5WQUxJRDsKLSAgfQotCi0gIGlmICh3YWtlX3VubG9ja19mZCA9PSBJTlZBTElEX0ZEKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBub3QgYWNxdWlyaW5nIGxvY2s6IGNhbid0IHJlbGVhc2UgbG9jayIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1BBUk1fSU5WQUxJRDsKLSAgfQotCi0gIGxvbmcgbG9ja19uYW1lX2xlbiA9IHN0cmxlbihXQUtFX0xPQ0tfSUQpOwotICBsb2NrZWRfaWRfbGVuID0gd3JpdGUod2FrZV9sb2NrX2ZkLCBXQUtFX0xPQ0tfSUQsIGxvY2tfbmFtZV9sZW4pOwotICBpZiAobG9ja2VkX2lkX2xlbiA9PSAtMSkgewotICAgIExPR19FUlJPUigiJXMgd2FrZSBsb2NrIG5vdCBhY3F1aXJlZDogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0gIH0gZWxzZSBpZiAobG9ja2VkX2lkX2xlbiA8IGxvY2tfbmFtZV9sZW4pIHsKLSAgICAvLyBUT0RPIChqYW11cmFhKTogdGhpcyBpcyB3ZWlyZC4gbWF5YmUgd2Ugc2hvdWxkIHJlbGVhc2UgYW5kIHJldHJ5LgotICAgIExPR19XQVJOKCIlcyB3YWtlIGxvY2sgdHJ1bmNhdGVkIHRvICV6ZCBjaGFycyIsIF9fZnVuY19fLCBsb2NrZWRfaWRfbGVuKTsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgd2FrZWxvY2tfcmVsZWFzZSh2b2lkKSB7Ci0gIHB0aHJlYWRfb25jZSgmaW5pdGlhbGl6ZWQsIHdha2Vsb2NrX2luaXRpYWxpemUpOwotCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9IEJUX1NUQVRVU19GQUlMOwotCi0gIGlmIChpc19uYXRpdmUpCi0gICAgc3RhdHVzID0gd2FrZWxvY2tfcmVsZWFzZV9uYXRpdmUoKTsKLSAgZWxzZQotICAgIHN0YXR1cyA9IHdha2Vsb2NrX3JlbGVhc2VfY2FsbG91dCgpOwotCi0gIHVwZGF0ZV93YWtlbG9ja19yZWxlYXNlZF9zdGF0cyhzdGF0dXMpOwotCi0gIHJldHVybiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotc3RhdGljIGJ0X3N0YXR1c190IHdha2Vsb2NrX3JlbGVhc2VfY2FsbG91dCh2b2lkKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxidF9zdGF0dXNfdD4oCi0gICAgICB3YWtlbG9ja19vc19jYWxsb3V0cy0+cmVsZWFzZV93YWtlX2xvY2soV0FLRV9MT0NLX0lEKSk7Ci19Ci0KLXN0YXRpYyBidF9zdGF0dXNfdCB3YWtlbG9ja19yZWxlYXNlX25hdGl2ZSh2b2lkKSB7Ci0gIGlmICh3YWtlX3VubG9ja19mZCA9PSBJTlZBTElEX0ZEKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBsb2NrIG5vdCByZWxlYXNlZCwgaW52YWxpZCBmZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1BBUk1fSU5WQUxJRDsKLSAgfQotCi0gIHNzaXplX3Qgd3JvdGVfbmFtZV9sZW4gPSB3cml0ZSh3YWtlX3VubG9ja19mZCwgV0FLRV9MT0NLX0lELCBsb2NrZWRfaWRfbGVuKTsKLSAgaWYgKHdyb3RlX25hbWVfbGVuID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyBjYW4ndCByZWxlYXNlIHdha2UgbG9jazogJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgfSBlbHNlIGlmICh3cm90ZV9uYW1lX2xlbiA8IGxvY2tlZF9pZF9sZW4pIHsKLSAgICBMT0dfRVJST1IoIiVzIGxvY2sgcmVsZWFzZSBvbmx5IHdyb3RlICV6ZCwgYXNzdW1pbmcgcmVsZWFzZWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgd3JvdGVfbmFtZV9sZW4pOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgd2FrZWxvY2tfaW5pdGlhbGl6ZSh2b2lkKSB7Ci0gIHJlc2V0X3dha2Vsb2NrX3N0YXRzKCk7Ci0KLSAgaWYgKGlzX25hdGl2ZSkgd2FrZWxvY2tfaW5pdGlhbGl6ZV9uYXRpdmUoKTsKLX0KLQotc3RhdGljIHZvaWQgd2FrZWxvY2tfaW5pdGlhbGl6ZV9uYXRpdmUodm9pZCkgewotICBMT0dfSU5GTygiJXMgb3BlbmluZyB3YWtlIGxvY2tzIiwgX19mdW5jX18pOwotCi0gIGlmICh3YWtlX2xvY2tfcGF0aC5lbXB0eSgpKSB3YWtlX2xvY2tfcGF0aCA9IERFRkFVTFRfV0FLRV9MT0NLX1BBVEg7Ci0KLSAgd2FrZV9sb2NrX2ZkID0gb3Blbih3YWtlX2xvY2tfcGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpOwotICBpZiAod2FrZV9sb2NrX2ZkID09IElOVkFMSURfRkQpIHsKLSAgICBMT0dfRVJST1IoIiVzIGNhbid0IG9wZW4gd2FrZSBsb2NrICVzOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICB3YWtlX2xvY2tfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci0KLSAgaWYgKHdha2VfdW5sb2NrX3BhdGguZW1wdHkoKSkgd2FrZV91bmxvY2tfcGF0aCA9IERFRkFVTFRfV0FLRV9VTkxPQ0tfUEFUSDsKLQotICB3YWtlX3VubG9ja19mZCA9IG9wZW4od2FrZV91bmxvY2tfcGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpOwotICBpZiAod2FrZV91bmxvY2tfZmQgPT0gSU5WQUxJRF9GRCkgewotICAgIExPR19FUlJPUigiJXMgY2FuJ3Qgb3BlbiB3YWtlIHVubG9jayAlczogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgd2FrZV91bmxvY2tfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICB9Ci19Ci0KLXZvaWQgd2FrZWxvY2tfY2xlYW51cCh2b2lkKSB7Ci0gIGlmICh3YWtlbG9ja19zdGF0cy5pc19hY3F1aXJlZCkgewotICAgIExPR19FUlJPUigiJXMgcmVsZWFzaW5nIHdha2UgbG9jayBhcyBwYXJ0IG9mIGNsZWFudXAiLCBfX2Z1bmNfXyk7Ci0gICAgd2FrZWxvY2tfcmVsZWFzZSgpOwotICB9Ci0gIHdha2VfbG9ja19wYXRoLmNsZWFyKCk7Ci0gIHdha2VfdW5sb2NrX3BhdGguY2xlYXIoKTsKLSAgaW5pdGlhbGl6ZWQgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLX0KLQotdm9pZCB3YWtlbG9ja19zZXRfcGF0aHMoY29uc3QgY2hhciogbG9ja19wYXRoLCBjb25zdCBjaGFyKiB1bmxvY2tfcGF0aCkgewotICBpZiAobG9ja19wYXRoKSB3YWtlX2xvY2tfcGF0aCA9IGxvY2tfcGF0aDsKLQotICBpZiAodW5sb2NrX3BhdGgpIHdha2VfdW5sb2NrX3BhdGggPSB1bmxvY2tfcGF0aDsKLX0KLQotc3RhdGljIHVpbnQ2NF90IG5vd19tcyh2b2lkKSB7Ci0gIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfSUQsICZ0cykgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIiVzIHVuYWJsZSB0byBnZXQgY3VycmVudCB0aW1lOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuICh0cy50dl9zZWMgKiAxMDAwTEwpICsgKHRzLnR2X25zZWMgLyAxMDAwMDAwTEwpOwotfQotCi0vLyBSZXNldCB0aGUgQmx1ZXRvb3RoIHdha2Vsb2NrIHN0YXRpc3RpY3MuCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLgotc3RhdGljIHZvaWQgcmVzZXRfd2FrZWxvY2tfc3RhdHModm9pZCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzdGF0c19tdXRleCk7Ci0KLSAgd2FrZWxvY2tfc3RhdHMuaXNfYWNxdWlyZWQgPSBmYWxzZTsKLSAgd2FrZWxvY2tfc3RhdHMuYWNxdWlyZWRfY291bnQgPSAwOwotICB3YWtlbG9ja19zdGF0cy5yZWxlYXNlZF9jb3VudCA9IDA7Ci0gIHdha2Vsb2NrX3N0YXRzLmFjcXVpcmVkX2Vycm9ycyA9IDA7Ci0gIHdha2Vsb2NrX3N0YXRzLnJlbGVhc2VkX2Vycm9ycyA9IDA7Ci0gIHdha2Vsb2NrX3N0YXRzLm1pbl9hY3F1aXJlZF9pbnRlcnZhbF9tcyA9IDA7Ci0gIHdha2Vsb2NrX3N0YXRzLm1heF9hY3F1aXJlZF9pbnRlcnZhbF9tcyA9IDA7Ci0gIHdha2Vsb2NrX3N0YXRzLmxhc3RfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSAwOwotICB3YWtlbG9ja19zdGF0cy50b3RhbF9hY3F1aXJlZF9pbnRlcnZhbF9tcyA9IDA7Ci0gIHdha2Vsb2NrX3N0YXRzLmxhc3RfYWNxdWlyZWRfdGltZXN0YW1wX21zID0gMDsKLSAgd2FrZWxvY2tfc3RhdHMubGFzdF9yZWxlYXNlZF90aW1lc3RhbXBfbXMgPSAwOwotICB3YWtlbG9ja19zdGF0cy5sYXN0X3Jlc2V0X3RpbWVzdGFtcF9tcyA9IG5vd19tcygpOwotfQotCi0vLwotLy8gVXBkYXRlIHRoZSBCbHVldG9vdGggYWNxdWlyZSB3YWtlbG9jayBzdGF0aXN0aWNzLgotLy8KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdoZW4gdGhlIHdha2Vsb2NrIGlzIGFjcXVpcmVkLgotLy8gfGFjcXVpcmVkX3N0YXR1c3wgaXMgdGhlIHN0YXR1cyBjb2RlIHRoYXQgd2FzIHJldHVybiB3aGVuIHRoZSB3YWtlbG9jayB3YXMKLS8vIGFjcXVpcmVkLgotLy8gVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZS4KLS8vCi1zdGF0aWMgdm9pZCB1cGRhdGVfd2FrZWxvY2tfYWNxdWlyZWRfc3RhdHMoYnRfc3RhdHVzX3QgYWNxdWlyZWRfc3RhdHVzKSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGp1c3Rfbm93X21zID0gbm93X21zKCk7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc3RhdHNfbXV0ZXgpOwotCi0gIGlmIChhY3F1aXJlZF9zdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICB3YWtlbG9ja19zdGF0cy5hY3F1aXJlZF9lcnJvcnMrKzsKLSAgICB3YWtlbG9ja19zdGF0cy5sYXN0X2FjcXVpcmVkX2Vycm9yID0gYWNxdWlyZWRfc3RhdHVzOwotICB9Ci0KLSAgaWYgKHdha2Vsb2NrX3N0YXRzLmlzX2FjcXVpcmVkKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgd2FrZWxvY2tfc3RhdHMuaXNfYWNxdWlyZWQgPSB0cnVlOwotICB3YWtlbG9ja19zdGF0cy5hY3F1aXJlZF9jb3VudCsrOwotICB3YWtlbG9ja19zdGF0cy5sYXN0X2FjcXVpcmVkX3RpbWVzdGFtcF9tcyA9IGp1c3Rfbm93X21zOwotCi0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ1dha2VFdmVudCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpXQUtFX0VWRU5UX0FDUVVJUkVELCAiIiwgIiIsIGp1c3Rfbm93X21zKTsKLX0KLQotLy8KLS8vIFVwZGF0ZSB0aGUgQmx1ZXRvb3RoIHJlbGVhc2Ugd2FrZWxvY2sgc3RhdGlzdGljcy4KLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB3aGVuIHRoZSB3YWtlbG9jayBpcyByZWxlYXNlZC4KLS8vIHxyZWxlYXNlZF9zdGF0dXN8IGlzIHRoZSBzdGF0dXMgY29kZSB0aGF0IHdhcyByZXR1cm4gd2hlbiB0aGUgd2FrZWxvY2sgd2FzCi0vLyByZWxlYXNlZC4KLS8vIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUuCi0vLwotc3RhdGljIHZvaWQgdXBkYXRlX3dha2Vsb2NrX3JlbGVhc2VkX3N0YXRzKGJ0X3N0YXR1c190IHJlbGVhc2VkX3N0YXR1cykgewotICBjb25zdCB1aW50NjRfdCBqdXN0X25vd19tcyA9IG5vd19tcygpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHN0YXRzX211dGV4KTsKLQotICBpZiAocmVsZWFzZWRfc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgd2FrZWxvY2tfc3RhdHMucmVsZWFzZWRfZXJyb3JzKys7Ci0gICAgd2FrZWxvY2tfc3RhdHMubGFzdF9yZWxlYXNlZF9lcnJvciA9IHJlbGVhc2VkX3N0YXR1czsKLSAgfQotCi0gIGlmICghd2FrZWxvY2tfc3RhdHMuaXNfYWNxdWlyZWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB3YWtlbG9ja19zdGF0cy5pc19hY3F1aXJlZCA9IGZhbHNlOwotICB3YWtlbG9ja19zdGF0cy5yZWxlYXNlZF9jb3VudCsrOwotICB3YWtlbG9ja19zdGF0cy5sYXN0X3JlbGVhc2VkX3RpbWVzdGFtcF9tcyA9IGp1c3Rfbm93X21zOwotCi0gIC8vIENvbXB1dGUgdGhlIGFjcXVpcmVkIGludGVydmFsIGFuZCB1cGRhdGUgdGhlIHN0YXRpc3RpY3MKLSAgdWludDY0X3QgZGVsdGFfbXMgPSBqdXN0X25vd19tcyAtIHdha2Vsb2NrX3N0YXRzLmxhc3RfYWNxdWlyZWRfdGltZXN0YW1wX21zOwotICBpZiAoZGVsdGFfbXMgPCB3YWtlbG9ja19zdGF0cy5taW5fYWNxdWlyZWRfaW50ZXJ2YWxfbXMgfHwKLSAgICAgIHdha2Vsb2NrX3N0YXRzLnJlbGVhc2VkX2NvdW50ID09IDEpIHsKLSAgICB3YWtlbG9ja19zdGF0cy5taW5fYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgfQotICBpZiAoZGVsdGFfbXMgPiB3YWtlbG9ja19zdGF0cy5tYXhfYWNxdWlyZWRfaW50ZXJ2YWxfbXMpIHsKLSAgICB3YWtlbG9ja19zdGF0cy5tYXhfYWNxdWlyZWRfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgfQotICB3YWtlbG9ja19zdGF0cy5sYXN0X2FjcXVpcmVkX2ludGVydmFsX21zID0gZGVsdGFfbXM7Ci0gIHdha2Vsb2NrX3N0YXRzLnRvdGFsX2FjcXVpcmVkX2ludGVydmFsX21zICs9IGRlbHRhX21zOwotCi0gIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkdldEluc3RhbmNlKCktPkxvZ1dha2VFdmVudCgKLSAgICAgIGJsdWV0b290aDo6Y29tbW9uOjpXQUtFX0VWRU5UX1JFTEVBU0VELCAiIiwgIiIsIGp1c3Rfbm93X21zKTsKLX0KLQotdm9pZCB3YWtlbG9ja19kZWJ1Z19kdW1wKGludCBmZCkgewotICBjb25zdCB1aW50NjRfdCBqdXN0X25vd19tcyA9IG5vd19tcygpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHN0YXRzX211dGV4KTsKLQotICAvLyBDb21wdXRlIHRoZSBsYXN0IGFjcXVpcmVkIGludGVydmFsIGlmIHRoZSB3YWtlbG9jayBpcyBzdGlsbCBhY3F1aXJlZAotICB1aW50NjRfdCBkZWx0YV9tcyA9IDA7Ci0gIHVpbnQ2NF90IGxhc3RfaW50ZXJ2YWxfbXMgPSB3YWtlbG9ja19zdGF0cy5sYXN0X2FjcXVpcmVkX2ludGVydmFsX21zOwotICB1aW50NjRfdCBtaW5faW50ZXJ2YWxfbXMgPSB3YWtlbG9ja19zdGF0cy5taW5fYWNxdWlyZWRfaW50ZXJ2YWxfbXM7Ci0gIHVpbnQ2NF90IG1heF9pbnRlcnZhbF9tcyA9IHdha2Vsb2NrX3N0YXRzLm1heF9hY3F1aXJlZF9pbnRlcnZhbF9tczsKLSAgdWludDY0X3QgYXZnX2ludGVydmFsX21zID0gMDsKLQotICBpZiAod2FrZWxvY2tfc3RhdHMuaXNfYWNxdWlyZWQpIHsKLSAgICBkZWx0YV9tcyA9IGp1c3Rfbm93X21zIC0gd2FrZWxvY2tfc3RhdHMubGFzdF9hY3F1aXJlZF90aW1lc3RhbXBfbXM7Ci0gICAgaWYgKGRlbHRhX21zID4gbWF4X2ludGVydmFsX21zKSBtYXhfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgICBpZiAoZGVsdGFfbXMgPCBtaW5faW50ZXJ2YWxfbXMpIG1pbl9pbnRlcnZhbF9tcyA9IGRlbHRhX21zOwotICAgIGxhc3RfaW50ZXJ2YWxfbXMgPSBkZWx0YV9tczsKLSAgfQotICB1aW50NjRfdCB0b3RhbF9pbnRlcnZhbF9tcyA9Ci0gICAgICB3YWtlbG9ja19zdGF0cy50b3RhbF9hY3F1aXJlZF9pbnRlcnZhbF9tcyArIGRlbHRhX21zOwotCi0gIGlmICh3YWtlbG9ja19zdGF0cy5hY3F1aXJlZF9jb3VudCA+IDApCi0gICAgYXZnX2ludGVydmFsX21zID0gdG90YWxfaW50ZXJ2YWxfbXMgLyB3YWtlbG9ja19zdGF0cy5hY3F1aXJlZF9jb3VudDsKLQotICBkcHJpbnRmKGZkLCAiXG5CbHVldG9vdGggV2FrZWxvY2sgU3RhdGlzdGljczpcbiIpOwotICBkcHJpbnRmKGZkLCAiICBJcyBhY3F1aXJlZCAgICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKLSAgICAgICAgICB3YWtlbG9ja19zdGF0cy5pc19hY3F1aXJlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICBkcHJpbnRmKGZkLCAiICBBY3F1aXJlZC9yZWxlYXNlZCBjb3VudCAgICAgICAgOiAlenUgLyAlenVcbiIsCi0gICAgICAgICAgd2FrZWxvY2tfc3RhdHMuYWNxdWlyZWRfY291bnQsIHdha2Vsb2NrX3N0YXRzLnJlbGVhc2VkX2NvdW50KTsKLSAgZHByaW50ZihmZCwgIiAgQWNxdWlyZWQvcmVsZWFzZWQgZXJyb3IgY291bnQgIDogJXp1IC8gJXp1XG4iLAotICAgICAgICAgIHdha2Vsb2NrX3N0YXRzLmFjcXVpcmVkX2Vycm9ycywgd2FrZWxvY2tfc3RhdHMucmVsZWFzZWRfZXJyb3JzKTsKLSAgZHByaW50ZihmZCwgIiAgTGFzdCBhY3F1aXJlL3JlbGVhc2UgZXJyb3IgY29kZTogJWQgLyAlZFxuIiwKLSAgICAgICAgICB3YWtlbG9ja19zdGF0cy5sYXN0X2FjcXVpcmVkX2Vycm9yLAotICAgICAgICAgIHdha2Vsb2NrX3N0YXRzLmxhc3RfcmVsZWFzZWRfZXJyb3IpOwotICBkcHJpbnRmKGZkLCAiICBMYXN0IGFjcXVpcmVkIHRpbWUgKG1zKSAgICAgICAgOiAlbGx1XG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9pbnRlcnZhbF9tcyk7Ci0gIGRwcmludGYoZmQsICIgIEFjcXVpcmVkIHRpbWUgbWluL21heC9hdmcgKG1zKSA6ICVsbHUgLyAlbGx1IC8gJWxsdVxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1pbl9pbnRlcnZhbF9tcywKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1heF9pbnRlcnZhbF9tcywKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWF2Z19pbnRlcnZhbF9tcyk7Ci0gIGRwcmludGYoZmQsICIgIFRvdGFsIGFjcXVpcmVkIHRpbWUgKG1zKSAgICAgICA6ICVsbHVcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9pbnRlcnZhbF9tcyk7Ci0gIGRwcmludGYoZmQsICIgIFRvdGFsIHJ1biB0aW1lIChtcykgICAgICAgICAgICA6ICVsbHVcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoanVzdF9ub3dfbXMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2Vsb2NrX3N0YXRzLmxhc3RfcmVzZXRfdGltZXN0YW1wX21zKSk7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9BbGFybVRlc3RIYXJuZXNzLmNjIGIvb3NpL3Rlc3QvQWxhcm1UZXN0SGFybmVzcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4OTBjNC4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9BbGFybVRlc3RIYXJuZXNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiQWxhcm1UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0KLXN0YXRpYyBib29sIGlzX3dha2VfbG9ja19hY3F1aXJlZCA9IGZhbHNlOwotCi1zdGF0aWMgaW50IGFjcXVpcmVfd2FrZV9sb2NrX2NiKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSkgewotICBpc193YWtlX2xvY2tfYWNxdWlyZWQgPSB0cnVlOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV93YWtlX2xvY2tfY2IoY29uc3QgY2hhciogbG9ja19uYW1lKSB7Ci0gIGlzX3dha2VfbG9ja19hY3F1aXJlZCA9IGZhbHNlOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBidF9vc19jYWxsb3V0c190IGJ0X3dha2Vsb2NrX2NhbGxvdXRzID0gewotICAgIHNpemVvZihidF9vc19jYWxsb3V0c190KSwgTlVMTCwgYWNxdWlyZV93YWtlX2xvY2tfY2IsIHJlbGVhc2Vfd2FrZV9sb2NrX2NifTsKLQotdm9pZCBBbGFybVRlc3RIYXJuZXNzOjpTZXRVcCgpIHsKLSAgQWxsb2NhdGlvblRlc3RIYXJuZXNzOjpTZXRVcCgpOwotCi0gIFRJTUVSX0lOVEVSVkFMX0ZPUl9XQUtFTE9DS19JTl9NUyA9IDUwMDsKLQotICB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHMoJmJ0X3dha2Vsb2NrX2NhbGxvdXRzKTsKLX0KLQotdm9pZCBBbGFybVRlc3RIYXJuZXNzOjpUZWFyRG93bigpIHsKLSAgYWxhcm1fY2xlYW51cCgpOwotICB3YWtlbG9ja19jbGVhbnVwKCk7Ci0gIHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cyhOVUxMKTsKLQotICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7Ci19Ci0KLWJvb2wgQWxhcm1UZXN0SGFybmVzczo6V2FrZUxvY2tIZWxkKCkgeyByZXR1cm4gaXNfd2FrZV9sb2NrX2FjcXVpcmVkOyB9CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9BbGFybVRlc3RIYXJuZXNzLmggYi9vc2kvdGVzdC9BbGFybVRlc3RIYXJuZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmU5NTkuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvQWxhcm1UZXN0SGFybmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi1leHRlcm4gaW50NjRfdCBUSU1FUl9JTlRFUlZBTF9GT1JfV0FLRUxPQ0tfSU5fTVM7Ci0KLWNsYXNzIEFsYXJtVGVzdEhhcm5lc3MgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLQotIHB1YmxpYzoKLSAgLy8gUmV0dXJucyB0cnVlIGlmIGEgd2FrZSBsb2NrIGlzIGhlbGQuCi0gIGJvb2wgV2FrZUxvY2tIZWxkKCk7Ci19OwpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmNjIGIvb3NpL3Rlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODU4MjQyNC4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9BbGxvY2F0aW9uVGVzdEhhcm5lc3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAib3NpL3Rlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCIKLQotdm9pZCBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlNldFVwKCkgewotICBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdCgpOwotICBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzZXQoKTsKLX0KLQotdm9pZCBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCkgewotICBFWFBFQ1RfRVEoMFUsIGFsbG9jYXRpb25fdHJhY2tlcl9leHBlY3Rfbm9fYWxsb2NhdGlvbnMoKSkKLSAgICAgIDw8ICJub3QgYWxsIG1lbW9yeSBmcmVlZCI7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9BbGxvY2F0aW9uVGVzdEhhcm5lc3MuaCBiL29zaS90ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZiOThlLi4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L0FsbG9jYXRpb25UZXN0SGFybmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLWNsYXNzIEFsbG9jYXRpb25UZXN0SGFybmVzcyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOwotfTsKZGlmZiAtLWdpdCBhL29zaS90ZXN0L2FsYXJtX21vY2suaCBiL29zaS90ZXN0L2FsYXJtX21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMWM5ZS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9hbGFybV9tb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLXN0cnVjdCBhbGFybV90OwotCi1jbGFzcyBBbGFybU1vY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QxKEFsYXJtTmV3LCBhbGFybV90Kihjb25zdCBjaGFyKikpOwotICBNT0NLX01FVEhPRDEoQWxhcm1GcmVlLCB2b2lkKGFsYXJtX3QqKSk7Ci0gIE1PQ0tfTUVUSE9EMShBbGFybUNhbmNlbCwgdm9pZChhbGFybV90KikpOwotICBNT0NLX01FVEhPRDQoQWxhcm1TZXRPbk1sb29wLCB2b2lkKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9jYWxsYmFja190IGNiLCB2b2lkKiBkYXRhKSk7Ci0KLSAgYWxhcm1fdCogQWxhcm1OZXdJbXBsKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBBbGFybU5ldyhuYW1lKTsKLSAgICAvLyBXZSBtdXN0IHJldHVybiBzb21ldGhpbmcgZnJvbSBhbGFybV9uZXcgaW4gdGVzdHMsIGlmIHdlIGp1c3QgcmV0dXJuIG51bGwsCi0gICAgLy8gdW5pcXVlX3B0ciB3aWxsIG1pc2JlaGF2ZS4gSnVzdCByZXNlcnZlIGZldyBiaXRzIHRoZXkgd2lsbCBiZSBmcmVlZCBpbgotICAgIC8vIEFsYXJtRnJlZUltcGwKLSAgICByZXR1cm4gKGFsYXJtX3QqKW5ldyB1aW50OF90WzMwXTsKLSAgfQotCi0gIHZvaWQgQWxhcm1GcmVlSW1wbChhbGFybV90KiBhbGFybSkgewotICAgIHVpbnQ4X3QqIHB0ciA9ICh1aW50OF90KilhbGFybTsKLSAgICBkZWxldGVbXSBwdHI7Ci0gICAgcmV0dXJuIEFsYXJtRnJlZShhbGFybSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIEFsYXJtTW9jayogR2V0KCkgewotICAgIGlmICghbG9jYWxBbGFybU1vY2spIHsKLSAgICAgIGxvY2FsQWxhcm1Nb2NrID0gc3RkOjptYWtlX3VuaXF1ZTxBbGFybU1vY2s+KCk7Ci0gICAgfQotICAgIHJldHVybiBsb2NhbEFsYXJtTW9jay5nZXQoKTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBSZXNldCgpIHsgbG9jYWxBbGFybU1vY2sgPSBzdGQ6Om1ha2VfdW5pcXVlPEFsYXJtTW9jaz4oKTsgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBbGFybU1vY2s+IGxvY2FsQWxhcm1Nb2NrOwotfTsKLQotc3RkOjp1bmlxdWVfcHRyPEFsYXJtTW9jaz4gQWxhcm1Nb2NrOjpsb2NhbEFsYXJtTW9jazsKLQotYWxhcm1fdCogYWxhcm1fbmV3KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgcmV0dXJuIEFsYXJtTW9jazo6R2V0KCktPkFsYXJtTmV3SW1wbChuYW1lKTsKLX0KLQotdm9pZCBhbGFybV9mcmVlKGFsYXJtX3QqIGFsYXJtKSB7IEFsYXJtTW9jazo6R2V0KCktPkFsYXJtRnJlZUltcGwoYWxhcm0pOyB9Ci0KLXZvaWQgYWxhcm1fc2V0X29uX21sb29wKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsYXJtX2NhbGxiYWNrX3QgY2IsIHZvaWQqIGRhdGEpIHsKLSAgQWxhcm1Nb2NrOjpHZXQoKS0+QWxhcm1TZXRPbk1sb29wKGFsYXJtLCBpbnRlcnZhbF9tcywgY2IsIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvYWxhcm1fdGVzdC5jYyBiL29zaS90ZXN0L2FsYXJtX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzBiZjMuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvYWxhcm1fdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL3J1bl9sb29wLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIkFsYXJtVGVzdEhhcm5lc3MuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotCi11c2luZyBiYXNlOjpDbG9zdXJlOwotdXNpbmcgYmFzZTo6VGltZURlbHRhOwotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotCi1zdGF0aWMgc2VtYXBob3JlX3QqIHNlbWFwaG9yZTsKLXN0YXRpYyBpbnQgY2JfY291bnRlcjsKLXN0YXRpYyBpbnQgY2JfbWlzb3JkZXJlZF9jb3VudGVyOwotCi1zdGF0aWMgY29uc3QgdWludDY0X3QgRVBTSUxPTl9NUyA9IDUwOwotCi1zdGF0aWMgdm9pZCBtc2xlZXAodWludDY0X3QgbXMpIHsgdXNsZWVwKG1zICogMTAwMCk7IH0KLQotc3RhdGljIE1lc3NhZ2VMb29wVGhyZWFkKiB0aHJlYWRfOwotCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuIHRocmVhZF87IH0KLQotY2xhc3MgQWxhcm1UZXN0IDogcHVibGljIEFsYXJtVGVzdEhhcm5lc3MgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBbGFybVRlc3RIYXJuZXNzOjpTZXRVcCgpOwotICAgIGNiX2NvdW50ZXIgPSAwOwotICAgIGNiX21pc29yZGVyZWRfY291bnRlciA9IDA7Ci0KLSAgICBzZW1hcGhvcmUgPSBzZW1hcGhvcmVfbmV3KDApOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBzZW1hcGhvcmVfZnJlZShzZW1hcGhvcmUpOwotICAgIEFsYXJtVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7Ci0gIH0KLX07Ci0KLXN0YXRpYyB2b2lkIGNiKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsKLSAgKytjYl9jb3VudGVyOwotICBzZW1hcGhvcmVfcG9zdChzZW1hcGhvcmUpOwotfQotCi1zdGF0aWMgdm9pZCBvcmRlcmVkX2NiKHZvaWQqIGRhdGEpIHsKLSAgaW50IGkgPSBQVFJfVE9fSU5UKGRhdGEpOwotICBpZiAoaSAhPSBjYl9jb3VudGVyKSBjYl9taXNvcmRlcmVkX2NvdW50ZXIrKzsKLSAgKytjYl9jb3VudGVyOwotICBzZW1hcGhvcmVfcG9zdChzZW1hcGhvcmUpOwotfQotCi1URVNUX0YoQWxhcm1UZXN0LCB0ZXN0X25ld19mcmVlX3NpbXBsZSkgewotICBhbGFybV90KiBhbGFybSA9IGFsYXJtX25ldygiYWxhcm1fdGVzdC50ZXN0X25ld19mcmVlX3NpbXBsZSIpOwotICBBU1NFUlRfVFJVRShhbGFybSAhPSBOVUxMKTsKLSAgYWxhcm1fZnJlZShhbGFybSk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIHRlc3RfZnJlZV9udWxsKSB7IGFsYXJtX2ZyZWUoTlVMTCk7IH0KLQotVEVTVF9GKEFsYXJtVGVzdCwgdGVzdF9zaW1wbGVfY2FuY2VsKSB7Ci0gIGFsYXJtX3QqIGFsYXJtID0gYWxhcm1fbmV3KCJhbGFybV90ZXN0LnRlc3Rfc2ltcGxlX2NhbmNlbCIpOwotICBhbGFybV9jYW5jZWwoYWxhcm0pOwotICBhbGFybV9mcmVlKGFsYXJtKTsKLX0KLQotVEVTVF9GKEFsYXJtVGVzdCwgdGVzdF9jYW5jZWwpIHsKLSAgYWxhcm1fdCogYWxhcm0gPSBhbGFybV9uZXcoImFsYXJtX3Rlc3QudGVzdF9jYW5jZWwiKTsKLSAgYWxhcm1fc2V0KGFsYXJtLCAxMCwgY2IsIE5VTEwpOwotICBhbGFybV9jYW5jZWwoYWxhcm0pOwotCi0gIG1zbGVlcCgxMCArIEVQU0lMT05fTVMpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAwKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLSAgYWxhcm1fZnJlZShhbGFybSk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIHRlc3RfY2FuY2VsX2lkZW1wb3RlbnQpIHsKLSAgYWxhcm1fdCogYWxhcm0gPSBhbGFybV9uZXcoImFsYXJtX3Rlc3QudGVzdF9jYW5jZWxfaWRlbXBvdGVudCIpOwotICBhbGFybV9zZXQoYWxhcm0sIDEwLCBjYiwgTlVMTCk7Ci0gIGFsYXJtX2NhbmNlbChhbGFybSk7Ci0gIGFsYXJtX2NhbmNlbChhbGFybSk7Ci0gIGFsYXJtX2NhbmNlbChhbGFybSk7Ci0gIGFsYXJtX2ZyZWUoYWxhcm0pOwotfQotCi1URVNUX0YoQWxhcm1UZXN0LCB0ZXN0X3NldF9zaG9ydCkgewotICBhbGFybV90KiBhbGFybSA9IGFsYXJtX25ldygiYWxhcm1fdGVzdC50ZXN0X3NldF9zaG9ydCIpOwotCi0gIGFsYXJtX3NldChhbGFybSwgMTAsIGNiLCBOVUxMKTsKLQotICBFWFBFQ1RfRVEoY2JfY291bnRlciwgMCk7Ci0gIEVYUEVDVF9UUlVFKFdha2VMb2NrSGVsZCgpKTsKLQotICBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmUpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAxKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBhbGFybV9mcmVlKGFsYXJtKTsKLX0KLQotVEVTVF9GKEFsYXJtVGVzdCwgdGVzdF9zZXRfc2hvcnRfcGVyaW9kaWMpIHsKLSAgYWxhcm1fdCogYWxhcm0gPSBhbGFybV9uZXdfcGVyaW9kaWMoImFsYXJtX3Rlc3QudGVzdF9zZXRfc2hvcnRfcGVyaW9kaWMiKTsKLQotICBhbGFybV9zZXQoYWxhcm0sIDEwLCBjYiwgTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKGNiX2NvdW50ZXIsIDApOwotICBFWFBFQ1RfVFJVRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTA7IGkrKykgewotICAgIHNlbWFwaG9yZV93YWl0KHNlbWFwaG9yZSk7Ci0KLSAgICBFWFBFQ1RfR0UoY2JfY291bnRlciwgaSk7Ci0gICAgRVhQRUNUX1RSVUUoV2FrZUxvY2tIZWxkKCkpOwotICB9Ci0gIGFsYXJtX2NhbmNlbChhbGFybSk7Ci0gIEVYUEVDVF9GQUxTRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgYWxhcm1fZnJlZShhbGFybSk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIHRlc3Rfc2V0X3plcm9fcGVyaW9kaWMpIHsKLSAgYWxhcm1fdCogYWxhcm0gPSBhbGFybV9uZXdfcGVyaW9kaWMoImFsYXJtX3Rlc3QudGVzdF9zZXRfemVyb19wZXJpb2RpYyIpOwotCi0gIGFsYXJtX3NldChhbGFybSwgMCwgY2IsIE5VTEwpOwotCi0gIEVYUEVDVF9UUlVFKFdha2VMb2NrSGVsZCgpKTsKLQotICBmb3IgKGludCBpID0gMTsgaSA8PSAxMDsgaSsrKSB7Ci0gICAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLQotICAgIEVYUEVDVF9HRShjYl9jb3VudGVyLCBpKTsKLSAgICBFWFBFQ1RfVFJVRShXYWtlTG9ja0hlbGQoKSk7Ci0gIH0KLSAgYWxhcm1fY2FuY2VsKGFsYXJtKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBhbGFybV9mcmVlKGFsYXJtKTsKLX0KLQotVEVTVF9GKEFsYXJtVGVzdCwgdGVzdF9zZXRfbG9uZykgewotICBhbGFybV90KiBhbGFybSA9IGFsYXJtX25ldygiYWxhcm1fdGVzdC50ZXN0X3NldF9sb25nIik7Ci0gIGFsYXJtX3NldChhbGFybSwgVElNRVJfSU5URVJWQUxfRk9SX1dBS0VMT0NLX0lOX01TICsgRVBTSUxPTl9NUywgY2IsIE5VTEwpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAwKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmUpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAxKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBhbGFybV9mcmVlKGFsYXJtKTsKLX0KLQotVEVTVF9GKEFsYXJtVGVzdCwgdGVzdF9zZXRfc2hvcnRfc2hvcnQpIHsKLSAgYWxhcm1fdCogYWxhcm1bMl0gPSB7YWxhcm1fbmV3KCJhbGFybV90ZXN0LnRlc3Rfc2V0X3Nob3J0X3Nob3J0XzAiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fbmV3KCJhbGFybV90ZXN0LnRlc3Rfc2V0X3Nob3J0X3Nob3J0XzEiKX07Ci0KLSAgYWxhcm1fc2V0KGFsYXJtWzBdLCAxMCwgY2IsIE5VTEwpOwotICBhbGFybV9zZXQoYWxhcm1bMV0sIDIwLCBjYiwgTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKGNiX2NvdW50ZXIsIDApOwotICBFWFBFQ1RfVFJVRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLQotICBFWFBFQ1RfRVEoY2JfY291bnRlciwgMSk7Ci0gIEVYUEVDVF9UUlVFKFdha2VMb2NrSGVsZCgpKTsKLQotICBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmUpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAyKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBhbGFybV9mcmVlKGFsYXJtWzBdKTsKLSAgYWxhcm1fZnJlZShhbGFybVsxXSk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIHRlc3Rfc2V0X3Nob3J0X2xvbmcpIHsKLSAgYWxhcm1fdCogYWxhcm1bMl0gPSB7YWxhcm1fbmV3KCJhbGFybV90ZXN0LnRlc3Rfc2V0X3Nob3J0X2xvbmdfMCIpLAotICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9uZXcoImFsYXJtX3Rlc3QudGVzdF9zZXRfc2hvcnRfbG9uZ18xIil9OwotCi0gIGFsYXJtX3NldChhbGFybVswXSwgMTAsIGNiLCBOVUxMKTsKLSAgYWxhcm1fc2V0KGFsYXJtWzFdLCAxMCArIFRJTUVSX0lOVEVSVkFMX0ZPUl9XQUtFTE9DS19JTl9NUyArIEVQU0lMT05fTVMsIGNiLAotICAgICAgICAgICAgTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKGNiX2NvdW50ZXIsIDApOwotICBFWFBFQ1RfVFJVRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLQotICBFWFBFQ1RfRVEoY2JfY291bnRlciwgMSk7Ci0gIEVYUEVDVF9GQUxTRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLQotICBFWFBFQ1RfRVEoY2JfY291bnRlciwgMik7Ci0gIEVYUEVDVF9GQUxTRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgYWxhcm1fZnJlZShhbGFybVswXSk7Ci0gIGFsYXJtX2ZyZWUoYWxhcm1bMV0pOwotfQotCi1URVNUX0YoQWxhcm1UZXN0LCB0ZXN0X3NldF9sb25nX2xvbmcpIHsKLSAgYWxhcm1fdCogYWxhcm1bMl0gPSB7YWxhcm1fbmV3KCJhbGFybV90ZXN0LnRlc3Rfc2V0X2xvbmdfbG9uZ18wIiksCi0gICAgICAgICAgICAgICAgICAgICAgIGFsYXJtX25ldygiYWxhcm1fdGVzdC50ZXN0X3NldF9sb25nX2xvbmdfMSIpfTsKLQotICBhbGFybV9zZXQoYWxhcm1bMF0sIFRJTUVSX0lOVEVSVkFMX0ZPUl9XQUtFTE9DS19JTl9NUyArIEVQU0lMT05fTVMsIGNiLCBOVUxMKTsKLSAgYWxhcm1fc2V0KGFsYXJtWzFdLCAyICogKFRJTUVSX0lOVEVSVkFMX0ZPUl9XQUtFTE9DS19JTl9NUyArIEVQU0lMT05fTVMpLCBjYiwKLSAgICAgICAgICAgIE5VTEwpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAwKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmUpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAxKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmUpOwotCi0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAyKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBhbGFybV9mcmVlKGFsYXJtWzBdKTsKLSAgYWxhcm1fZnJlZShhbGFybVsxXSk7Ci19Ci0KLVRFU1RfRihBbGFybVRlc3QsIHRlc3RfaXNfc2NoZWR1bGVkKSB7Ci0gIGFsYXJtX3QqIGFsYXJtID0gYWxhcm1fbmV3KCJhbGFybV90ZXN0LnRlc3RfaXNfc2NoZWR1bGVkIik7Ci0KLSAgRVhQRUNUX0ZBTFNFKGFsYXJtX2lzX3NjaGVkdWxlZCgoYWxhcm1fdCopTlVMTCkpOwotICBFWFBFQ1RfRkFMU0UoYWxhcm1faXNfc2NoZWR1bGVkKGFsYXJtKSk7Ci0gIGFsYXJtX3NldChhbGFybSwgVElNRVJfSU5URVJWQUxfRk9SX1dBS0VMT0NLX0lOX01TICsgRVBTSUxPTl9NUywgY2IsIE5VTEwpOwotICBFWFBFQ1RfVFJVRShhbGFybV9pc19zY2hlZHVsZWQoYWxhcm0pKTsKLQotICBFWFBFQ1RfRVEoY2JfY291bnRlciwgMCk7Ci0gIEVYUEVDVF9GQUxTRShXYWtlTG9ja0hlbGQoKSk7Ci0KLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLQotICBFWFBFQ1RfRkFMU0UoYWxhcm1faXNfc2NoZWR1bGVkKGFsYXJtKSk7Ci0gIEVYUEVDVF9FUShjYl9jb3VudGVyLCAxKTsKLSAgRVhQRUNUX0ZBTFNFKFdha2VMb2NrSGVsZCgpKTsKLQotICBhbGFybV9mcmVlKGFsYXJtKTsKLX0KLQotLy8gVGVzdCB3aGV0aGVyIHRoZSBjYWxsYmFja3MgYXJlIGludm9rZWQgaW4gdGhlIGV4cGVjdGVkIG9yZGVyCi1URVNUX0YoQWxhcm1UZXN0LCB0ZXN0X2NhbGxiYWNrX29yZGVyaW5nKSB7Ci0gIGFsYXJtX3QqIGFsYXJtc1sxMDBdOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhbGFybV9uYW1lID0KLSAgICAgICAgImFsYXJtX3Rlc3QudGVzdF9jYWxsYmFja19vcmRlcmluZ1siICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXSI7Ci0gICAgYWxhcm1zW2ldID0gYWxhcm1fbmV3KGFsYXJtX25hbWUuY19zdHIoKSk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgYWxhcm1fc2V0KGFsYXJtc1tpXSwgMTAwLCBvcmRlcmVkX2NiLCBJTlRfVE9fUFRSKGkpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAxOyBpIDw9IDEwMDsgaSsrKSB7Ci0gICAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLSAgICBFWFBFQ1RfR0UoY2JfY291bnRlciwgaSk7Ci0gIH0KLSAgRVhQRUNUX0VRKGNiX2NvdW50ZXIsIDEwMCk7Ci0gIEVYUEVDVF9FUShjYl9taXNvcmRlcmVkX2NvdW50ZXIsIDApOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGFsYXJtX2ZyZWUoYWxhcm1zW2ldKTsKLQotICBFWFBFQ1RfRkFMU0UoV2FrZUxvY2tIZWxkKCkpOwotfQotCi0vLyBUZXN0IHdoZXRoZXIgdGhlIGNhbGxiYWNrcyBhcmUgaW52b2xlZCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIgb24gYQotLy8gbWVzc2FnZSBsb29wLgotVEVTVF9GKEFsYXJtVGVzdCwgdGVzdF9jYWxsYmFja19vcmRlcmluZ19vbl9tbG9vcCkgewotICBhbGFybV90KiBhbGFybXNbMTAwXTsKLQotICAvLyBJbml0aWFsaXplIE1lc2FnZUxvb3AsIGFuZCB3YWl0IHRpbGwgaXQncyBpbml0aWFsaXplZC4KLSAgTWVzc2FnZUxvb3BUaHJlYWQgbWVzc2FnZV9sb29wX3RocmVhZCgiYnR1IG1lc3NhZ2UgbG9vcCIpOwotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlN0YXJ0VXAoKTsKLSAgaWYgKCFtZXNzYWdlX2xvb3BfdGhyZWFkLklzUnVubmluZygpKSB7Ci0gICAgRkFJTCgpIDw8ICJ1bmFibGUgdG8gY3JlYXRlIGJ0dSBtZXNzYWdlIGxvb3AgdGhyZWFkLiI7Ci0gIH0KLSAgdGhyZWFkXyA9ICZtZXNzYWdlX2xvb3BfdGhyZWFkOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhbGFybV9uYW1lID0KLSAgICAgICAgImFsYXJtX3Rlc3QudGVzdF9jYWxsYmFja19vcmRlcmluZ19vbl9tbG9vcFsiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXSI7Ci0gICAgYWxhcm1zW2ldID0gYWxhcm1fbmV3KGFsYXJtX25hbWUuY19zdHIoKSk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKGFsYXJtc1tpXSwgMTAwLCBvcmRlcmVkX2NiLCBJTlRfVE9fUFRSKGkpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAxOyBpIDw9IDEwMDsgaSsrKSB7Ci0gICAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLSAgICBFWFBFQ1RfR0UoY2JfY291bnRlciwgaSk7Ci0gIH0KLSAgRVhQRUNUX0VRKGNiX2NvdW50ZXIsIDEwMCk7Ci0gIEVYUEVDVF9FUShjYl9taXNvcmRlcmVkX2NvdW50ZXIsIDApOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGFsYXJtX2ZyZWUoYWxhcm1zW2ldKTsKLQotICBtZXNzYWdlX2xvb3BfdGhyZWFkLlNodXREb3duKCk7Ci0gIEVYUEVDVF9GQUxTRShXYWtlTG9ja0hlbGQoKSk7Ci19Ci0KLS8vIFRyeSB0byBjYXRjaCBhbnkgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gdGhlIHRpbWVyIGNhbGxiYWNrIGFuZCB8YWxhcm1fZnJlZXwuCi1URVNUX0YoQWxhcm1UZXN0LCB0ZXN0X2NhbGxiYWNrX2ZyZWVfcmFjZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgewotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFsYXJtX25hbWUgPQotICAgICAgICAiYWxhcm1fdGVzdC50ZXN0X2NhbGxiYWNrX2ZyZWVfcmFjZVsiICsgc3RkOjp0b19zdHJpbmcoaSkgKyAiXSI7Ci0gICAgYWxhcm1fdCogYWxhcm0gPSBhbGFybV9uZXcoYWxhcm1fbmFtZS5jX3N0cigpKTsKLSAgICBhbGFybV9zZXQoYWxhcm0sIDAsIGNiLCBOVUxMKTsKLSAgICBhbGFybV9mcmVlKGFsYXJtKTsKLSAgfQotICBhbGFybV9jbGVhbnVwKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9jYih2b2lkKiBkYXRhKSB7Ci0gIGFsYXJtX2ZyZWUoKGFsYXJtX3QqKWRhdGEpOwotICBzZW1hcGhvcmVfcG9zdChzZW1hcGhvcmUpOwotfQotCi1URVNUX0YoQWxhcm1UZXN0LCB0ZXN0X2RlbGV0ZV9kdXJpbmdfY2FsbGJhY2spIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKLSAgICBhbGFybV90KiBhbGFybSA9IGFsYXJtX25ldygiYWxhcm1fdGVzdC50ZXN0X2RlbGV0ZV9kdXJpbmdfY2FsbGJhY2siKTsKLSAgICBhbGFybV9zZXQoYWxhcm0sIDAsIHJlbW92ZV9jYiwgYWxhcm0pOwotICAgIHNlbWFwaG9yZV93YWl0KHNlbWFwaG9yZSk7Ci0gIH0KLSAgYWxhcm1fY2xlYW51cCgpOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvYWxsb2NhdGlvbl90cmFja2VyX3Rlc3QuY2MgYi9vc2kvdGVzdC9hbGxvY2F0aW9uX3RyYWNrZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlMGU2OS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9hbGxvY2F0aW9uX3RyYWNrZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCIKLQotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KHZvaWQpOwotCi1zdGF0aWMgY29uc3QgYWxsb2NhdG9yX2lkX3QgYWxsb2NhdG9yX2lkID0gNTsKLQotVEVTVChBbGxvY2F0aW9uVHJhY2tlclRlc3QsIHRlc3RfdW5pbml0X25vX2JhZF9lZmZlY3RzKSB7Ci0gIHZvaWQqIGR1bW15X2FsbG9jYXRpb24gPSBtYWxsb2MoNCk7Ci0KLSAgLy8gRW5zdXJlIHVuaW5pdGlhbGl6ZWQgc3RhdGUgKHByZXZpb3VzIHRlc3RzIG1heSBoYXZlIGNhbGxlZCBpbml0KQotICBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KCk7Ci0KLSAgRVhQRUNUX0VRKDRVLCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzaXplX2Zvcl9jYW5hcnkoNCkpOwotICBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jYXRvcl9pZCwgZHVtbXlfYWxsb2NhdGlvbiwgNCk7Ci0gIEVYUEVDVF9FUSgwVSwgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9ucygpKTsgIC8vIHNob3VsZCBub3QgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlcmVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24KLSAgYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlKGFsbG9jYXRvcl9pZCwgZHVtbXlfYWxsb2NhdGlvbik7Ci0gIEVYUEVDVF9FUSgwVSwgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9ucygpKTsKLQotICBmcmVlKGR1bW15X2FsbG9jYXRpb24pOwotfQotCi1URVNUKEFsbG9jYXRpb25UcmFja2VyVGVzdCwgdGVzdF9jYW5hcmllc19vbikgewotICBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KCk7Ci0gIGFsbG9jYXRpb25fdHJhY2tlcl9pbml0KCk7Ci0KLSAgc2l6ZV90IHdpdGhfY2FuYXJ5X3NpemUgPSBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzaXplX2Zvcl9jYW5hcnkoNCk7Ci0gIEVYUEVDVF9UUlVFKHdpdGhfY2FuYXJ5X3NpemUgPiA0KTsKLQotICB2b2lkKiBkdW1teV9hbGxvY2F0aW9uID0gbWFsbG9jKHdpdGhfY2FuYXJ5X3NpemUpOwotICB2b2lkKiB1c2VhYmxlX3B0ciA9Ci0gICAgICBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jYXRvcl9pZCwgZHVtbXlfYWxsb2NhdGlvbiwgNCk7Ci0gIEVYUEVDVF9UUlVFKHVzZWFibGVfcHRyID4gZHVtbXlfYWxsb2NhdGlvbik7Ci0gIEVYUEVDVF9FUSg0VSwgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9ucygpKTsgIC8vIHNob3VsZCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24KLSAgdm9pZCogZnJlZWFibGVfcHRyID0KLSAgICAgIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfZnJlZShhbGxvY2F0b3JfaWQsIHVzZWFibGVfcHRyKTsKLSAgRVhQRUNUX0VRKGR1bW15X2FsbG9jYXRpb24sIGZyZWVhYmxlX3B0cik7Ci0gIEVYUEVDVF9FUSgwVSwgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9ucygpKTsKLQotICBmcmVlKGR1bW15X2FsbG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvYWxsb2NhdG9yX3Rlc3QuY2MgYi9vc2kvdGVzdC9hbGxvY2F0b3JfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwOWY3MS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9hbGxvY2F0b3JfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLQotY2xhc3MgQWxsb2NhdG9yVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3Mge307Ci0KLVRFU1RfRihBbGxvY2F0b3JUZXN0LCB0ZXN0X29zaV9zdHJuZHVwKSB7Ci0gIGNoYXIgc3RyW10gPSAiSWxvdmVCbHVldG9vdGgiOwotICBzaXplX3QgbGVuID0gc3RybGVuKHN0cik7Ci0gIGNoYXIqIGNvcHlfc3RyID0gTlVMTDsKLQotICAvLyBsZW4gPT0gMAotICBjb3B5X3N0ciA9IG9zaV9zdHJuZHVwKHN0ciwgMCk7Ci0gIEVYUEVDVF9FUSgwLCBzdHJjbXAoY29weV9zdHIsICIiKSk7Ci0gIG9zaV9mcmVlKGNvcHlfc3RyKTsKLQotICAvLyBsZW4gPT0gc3RybGVuKHN0cikKLSAgY29weV9zdHIgPSBvc2lfc3RybmR1cChzdHIsIGxlbik7Ci0gIEVYUEVDVF9FUSgwLCBzdHJjbXAoc3RyLCBjb3B5X3N0cikpOwotICBvc2lfZnJlZShjb3B5X3N0cik7Ci0KLSAgLy8gbGVuIDwgc3RybGVuKHN0cikKLSAgY29weV9zdHIgPSBvc2lfc3RybmR1cChzdHIsIGxlbiAtIDUpOwotICBFWFBFQ1RfRVEoMCwgc3RyY21wKCJJbG92ZUJsdWUiLCBjb3B5X3N0cikpOwotICBvc2lfZnJlZShjb3B5X3N0cik7Ci0KLSAgLy8gbGVuID4gc3RybGVuKHN0cikKLSAgY29weV9zdHIgPSBvc2lfc3RybmR1cChzdHIsIGxlbiArIDUpOwotICBFWFBFQ1RfRVEoMCwgc3RyY21wKHN0ciwgY29weV9zdHIpKTsKLSAgb3NpX2ZyZWUoY29weV9zdHIpOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvYXJyYXlfdGVzdC5jYyBiL29zaS90ZXN0L2FycmF5X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWQ1MWIuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvYXJyYXlfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hcnJheS5oIgotCi1jbGFzcyBBcnJheVRlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHt9OwotCi1URVNUX0YoQXJyYXlUZXN0LCB0ZXN0X25ld19mcmVlX3NpbXBsZSkgewotICBhcnJheV90KiBhcnJheSA9IGFycmF5X25ldyg0KTsKLSAgQVNTRVJUX1RSVUUoYXJyYXkgIT0gTlVMTCk7Ci0gIGFycmF5X2ZyZWUoYXJyYXkpOwotfQotCi1URVNUX0YoQXJyYXlUZXN0LCB0ZXN0X2ZyZWVfbnVsbCkgeyBhcnJheV9mcmVlKE5VTEwpOyB9Ci0KLVRFU1RfRihBcnJheVRlc3QsIHRlc3RfaW52YWxpZF9wdHIpIHsKLSAgOjp0ZXN0aW5nOjpGTEFHU19ndGVzdF9kZWF0aF90ZXN0X3N0eWxlID0gInRocmVhZHNhZmUiOwotICBhcnJheV90KiBhcnJheSA9IGFycmF5X25ldyg0KTsKLSAgRVhQRUNUX0RFQVRIKGFycmF5X3B0cihhcnJheSksICIiKTsKLSAgYXJyYXlfZnJlZShhcnJheSk7Ci19Ci0KLVRFU1RfRihBcnJheVRlc3QsIHRlc3RfaW52YWxpZF9hdCkgewotICA6OnRlc3Rpbmc6OkZMQUdTX2d0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgPSAidGhyZWFkc2FmZSI7Ci0gIGFycmF5X3QqIGFycmF5ID0gYXJyYXlfbmV3KDQpOwotICBFWFBFQ1RfREVBVEgoYXJyYXlfYXQoYXJyYXksIDEpLCAiIik7Ci0gIGFycmF5X2ZyZWUoYXJyYXkpOwotfQotCi1URVNUX0YoQXJyYXlUZXN0LCB0ZXN0X2FwcGVuZF92YWx1ZSkgewotICBhcnJheV90KiBhcnJheSA9IGFycmF5X25ldyhzaXplb2YoaW50KSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBhcnJheV9hcHBlbmRfdmFsdWUoYXJyYXksIGkgKiBpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgRVhQRUNUX0VRKCooaW50KilhcnJheV9hdChhcnJheSwgaSksIGkgKiBpKTsKLSAgfQotICBhcnJheV9mcmVlKGFycmF5KTsKLX0KLQotVEVTVF9GKEFycmF5VGVzdCwgdGVzdF9hcHBlbmRfcHRyKSB7Ci0gIGludCBpdGVtc1sxMDBdOwotICBhcnJheV90KiBhcnJheSA9IGFycmF5X25ldyhzaXplb2YoaW50KSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBpdGVtc1tpXSA9IGkgKiBpOwotICAgIGFycmF5X2FwcGVuZF9wdHIoYXJyYXksICZpdGVtc1tpXSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIEVYUEVDVF9FUSgqKGludCopYXJyYXlfYXQoYXJyYXksIGkpLCBpICogaSk7Ci0gIH0KLSAgYXJyYXlfZnJlZShhcnJheSk7Ci19Ci0KLVRFU1RfRihBcnJheVRlc3QsIHRlc3RfbGFyZ2VfZWxlbWVudCkgewotICBjaGFyIHN0cmluZ3NbXVsxMjhdID0gewotICAgICAgInN0cmluZyAxIiwgInN0cmluZyAyIiwgInN0cmluZyAzIiwgInN0cmluZyA0IiwKLSAgICAgICJzdHJpbmcgNSIsICJzdHJpbmcgNiIsICJzdHJpbmcgNyIsICJzdHJpbmcgOCIsCi0gIH07Ci0KLSAgYXJyYXlfdCogYXJyYXkgPSBhcnJheV9uZXcoMTI4KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIGFycmF5X2FwcGVuZF9wdHIoYXJyYXksIHN0cmluZ3NbaSAlIDhdKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgRVhQRUNUX1RSVUUoIW1lbWNtcChhcnJheV9hdChhcnJheSwgaSksIHN0cmluZ3NbaSAlIDhdLCAxMjgpKTsKLSAgfQotICBhcnJheV9mcmVlKGFycmF5KTsKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2NvbmZpZ190ZXN0LmNjIGIvb3NpL3Rlc3QvY29uZmlnX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmNkOGEuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvY29uZmlnX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbmZpZy5oIgotCi0jaW5jbHVkZSA8YmFzZS9maWxlcy9maWxlX3V0aWwuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8ZmlsZXN5c3RlbT4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi1zdGF0aWMgY29uc3Qgc3RkOjpmaWxlc3lzdGVtOjpwYXRoIGtDb25maWdGaWxlID0KLSAgICBzdGQ6OmZpbGVzeXN0ZW06OnRlbXBfZGlyZWN0b3J5X3BhdGgoKSAvICJjb25maWdfdGVzdC5jb25mIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBDT05GSUdfRklMRSA9IGtDb25maWdGaWxlLmNfc3RyKCk7Ci1zdGF0aWMgY29uc3QgY2hhciBDT05GSUdfRklMRV9DT05URU5UW10gPQotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotZmlyc3Rfa2V5PXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBEZXZpY2UgSUQgKERJRCkgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotW0RJRF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBSZWNvcmQgTnVtYmVyOiAxLCAyIG9yIDMgLSBtYXhpbXVtIG9mIDMgcmVjb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotcmVjb3JkTnVtYmVyID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBQcmltYXJ5IFJlY29yZCAtIHRydWUgb3IgZmFsc2UgKGRlZmF1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBUaGVyZSBjYW4gYmUgb25seSBvbmUgcHJpbWFyeSByZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotcHJpbWFyeVJlY29yZCA9IHRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBWZW5kb3IgSUQgJzB4RkZGRicgaW5kaWNhdGVzIG5vIERldmljZSBJRCBTZXJ2aWNlIFJlY29yZCBpcyBwcmVzZW50IGluIHRoZSBkZXZpY2UgIFxuXAotIyAweDAwMEYgPSBCcm9hZGNvbSBDb3Jwb3JhdGlvbiAoZGVmYXVsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI3ZlbmRvcklkID0gMHgwMDBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBWZW5kb3IgSUQgU291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyAweDAwMDEgPSBCbHVldG9vdGggU0lHIGFzc2lnbmVkIERldmljZSBJRCBWZW5kb3IgSUQgdmFsdWUgKGRlZmF1bHQpICAgICAgICAgICAgICAgIFxuXAotIyAweDAwMDIgPSBVU0IgSW1wbGVtZW50ZXIncyBGb3J1bSBhc3NpZ25lZCBEZXZpY2UgSUQgVmVuZG9yIElEIHZhbHVlICAgICAgICAgICAgICAgIFxuXAotI3ZlbmRvcklkU291cmNlID0gMHgwMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBQcm9kdWN0IElEICYgUHJvZHVjdCBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBQZXIgc3BlYyBESUQgdjEuMyAweEpKTU4gZm9yIHZlcnNpb24gaXMgaW50ZXJwcmV0ZWQgYXMgSkouTS5OICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBKSjogbWFqb3IgdmVyc2lvbiBudW1iZXIsIE06IG1pbm9yIHZlcnNpb24gbnVtYmVyLCBOOiBzdWItbWlub3IgdmVyc2lvbiBudW1iZXIgICAgIFxuXAotIyBGb3IgZXhhbXBsZTogMTIwMCwgdjE0LjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotcHJvZHVjdElkID0gMHgxMjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotdmVyc2lvbiA9IDB4MTExMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBPcHRpb25hbCBhdHRyaWJ1dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI2NsaWVudEV4ZWN1dGFibGVVUkwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI3NlcnZpY2VEZXNjcmlwdGlvbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotI2RvY3VtZW50YXRpb25VUkwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIyBBZGRpdGlvbmFsIG9wdGlvbmFsIERJRCByZWNvcmRzLiBCbHVlZHJvaWQgc3VwcG9ydHMgdXAgdG8gMyByZWNvcmRzLiAgICAgICAgICAgICAgIFxuXAotW0RJRF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotW0RJRF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotdmVyc2lvbiA9IDB4MTQzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotSGlTeW5jSWQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotSGlTeW5jSWQyID0gMTUwMDE5MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAotIjsKLQotY2xhc3MgQ29uZmlnVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3MgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlNldFVwKCk7Ci0gICAgRklMRSogZnAgPSBmb3BlbihDT05GSUdfRklMRSwgInd0Iik7Ci0gICAgQVNTRVJUX05FKGZwLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRVEoZndyaXRlKENPTkZJR19GSUxFX0NPTlRFTlQsIDEsIHNpemVvZihDT05GSUdfRklMRV9DT05URU5UKSwgZnApLAotICAgICAgICAgICAgICBzaXplb2YoQ09ORklHX0ZJTEVfQ09OVEVOVCkpOwotICAgIEFTU0VSVF9FUShmY2xvc2UoZnApLCAwKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpyZW1vdmUoa0NvbmZpZ0ZpbGUpKTsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7Ci0gIH0KLX07Ci0KLVRFU1RfRihDb25maWdUZXN0LCBjb25maWdfZmluZCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBBU1NFUlRfTkUoY29uZmlnLCBudWxscHRyKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnLT5IYXMoIkRJRCIpKTsKLSAgYXV0byBzZWN0aW9uX2l0ZXIgPSBjb25maWctPkZpbmQoIkRJRCIpOwotICBBU1NFUlRfTkUoc2VjdGlvbl9pdGVyLCBjb25maWctPnNlY3Rpb25zLmVuZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbmZpZy0+SGFzKCJyYW5kb20iKSk7Ci0gIEVYUEVDVF9FUShjb25maWctPkZpbmQoInJhbmRvbSIpLCBjb25maWctPnNlY3Rpb25zLmVuZCgpKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIHNlY3Rpb25fZmluZCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBBU1NFUlRfTkUoY29uZmlnLCBudWxscHRyKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnLT5IYXMoIkRJRCIpKTsKLSAgYXV0byBzZWN0aW9uX2l0ZXIgPSBjb25maWctPkZpbmQoIkRJRCIpOwotICBBU1NFUlRfTkUoc2VjdGlvbl9pdGVyLCBjb25maWctPnNlY3Rpb25zLmVuZCgpKTsKLSAgRVhQRUNUX0VRKHNlY3Rpb25faXRlci0+bmFtZSwgIkRJRCIpOwotICBFWFBFQ1RfVFJVRShzZWN0aW9uX2l0ZXItPkhhcygidmVyc2lvbiIpKTsKLSAgYXV0byBlbnRyeV9pdGVyID0gc2VjdGlvbl9pdGVyLT5GaW5kKCJ2ZXJzaW9uIik7Ci0gIEFTU0VSVF9ORShlbnRyeV9pdGVyLCBzZWN0aW9uX2l0ZXItPmVudHJpZXMuZW5kKCkpOwotICBFWFBFQ1RfRVEoZW50cnlfaXRlci0+a2V5LCAidmVyc2lvbiIpOwotICBFWFBFQ1RfRVEoZW50cnlfaXRlci0+dmFsdWUsICIweDE0MzYiKTsKLSAgRVhQRUNUX0VRKHNlY3Rpb25faXRlci0+RmluZCgicmFuZG9tIiksIHNlY3Rpb25faXRlci0+ZW50cmllcy5lbmQoKSk7Ci0gIEVYUEVDVF9GQUxTRShzZWN0aW9uX2l0ZXItPkhhcygicmFuZG9tIikpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgc2VjdGlvbl9zZXQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3KENPTkZJR19GSUxFKTsKLSAgQVNTRVJUX05FKGNvbmZpZywgbnVsbHB0cik7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZy0+SGFzKCJESUQiKSk7Ci0gIGF1dG8gc2VjdGlvbl9pdGVyID0gY29uZmlnLT5GaW5kKCJESUQiKTsKLSAgQVNTRVJUX05FKHNlY3Rpb25faXRlciwgY29uZmlnLT5zZWN0aW9ucy5lbmQoKSk7Ci0gIEVYUEVDVF9FUShzZWN0aW9uX2l0ZXItPm5hbWUsICJESUQiKTsKLSAgRVhQRUNUX0ZBTFNFKHNlY3Rpb25faXRlci0+SGFzKCJyYW5kb20iKSk7Ci0gIHNlY3Rpb25faXRlci0+U2V0KCJyYW5kb20iLCAiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKHNlY3Rpb25faXRlci0+SGFzKCJyYW5kb20iKSk7Ci0gIGF1dG8gZW50cnlfaXRlciA9IHNlY3Rpb25faXRlci0+RmluZCgicmFuZG9tIik7Ci0gIEFTU0VSVF9ORShlbnRyeV9pdGVyLCBzZWN0aW9uX2l0ZXItPmVudHJpZXMuZW5kKCkpOwotICBFWFBFQ1RfRVEoZW50cnlfaXRlci0+a2V5LCAicmFuZG9tIik7Ci0gIEVYUEVDVF9FUShlbnRyeV9pdGVyLT52YWx1ZSwgImZvbyIpOwotICBzZWN0aW9uX2l0ZXItPlNldCgicmFuZG9tIiwgImJhciIpOwotICBFWFBFQ1RfRVEoZW50cnlfaXRlci0+dmFsdWUsICJiYXIiKTsKLSAgZW50cnlfaXRlciA9IHNlY3Rpb25faXRlci0+RmluZCgicmFuZG9tIik7Ci0gIEFTU0VSVF9ORShlbnRyeV9pdGVyLCBzZWN0aW9uX2l0ZXItPmVudHJpZXMuZW5kKCkpOwotICBFWFBFQ1RfRVEoZW50cnlfaXRlci0+dmFsdWUsICJiYXIiKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19uZXdfZW1wdHkpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3X2VtcHR5KCk7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZy5nZXQoKSAhPSBOVUxMKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19uZXdfbm9fZmlsZSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoIi9tZW93Iik7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZy5nZXQoKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19uZXcpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3KENPTkZJR19GSUxFKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnLmdldCgpICE9IE5VTEwpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX25ld19jbG9uZSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNsb25lID0gY29uZmlnX25ld19jbG9uZSgqY29uZmlnKTsKLQotICBjb25maWdfc2V0X3N0cmluZyhjbG9uZS5nZXQoKSwgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwgImZpcnN0X2tleSIsCi0gICAgICAgICAgICAgICAgICAgICJub3RfdmFsdWUiKTsKLQotICBzdGQ6OnN0cmluZyBvbmUgPSBzdGQ6OnN0cmluZygib25lIik7Ci0gIEVYUEVDVF9TVFJORSgKLSAgICAgIGNvbmZpZ19nZXRfc3RyaW5nKCpjb25maWcsIENPTkZJR19ERUZBVUxUX1NFQ1RJT04sICJmaXJzdF9rZXkiLCAmb25lKQotICAgICAgICAgIC0+Y19zdHIoKSwKLSAgICAgIGNvbmZpZ19nZXRfc3RyaW5nKCpjbG9uZSwgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwgImZpcnN0X2tleSIsICZvbmUpCi0gICAgICAgICAgLT5jX3N0cigpKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19oYXNfc2VjdGlvbikgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBFWFBFQ1RfVFJVRShjb25maWdfaGFzX3NlY3Rpb24oKmNvbmZpZywgIkRJRCIpKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19oYXNfa2V5X2luX2RlZmF1bHRfc2VjdGlvbikgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBFWFBFQ1RfVFJVRShjb25maWdfaGFzX2tleSgqY29uZmlnLCBDT05GSUdfREVGQVVMVF9TRUNUSU9OLCAiZmlyc3Rfa2V5IikpOwotICBFWFBFQ1RfU1RSRVEoCi0gICAgICBjb25maWdfZ2V0X3N0cmluZygqY29uZmlnLCBDT05GSUdfREVGQVVMVF9TRUNUSU9OLCAiZmlyc3Rfa2V5IiwgbnVsbHB0cikKLSAgICAgICAgICAtPmNfc3RyKCksCi0gICAgICAidmFsdWUiKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19oYXNfa2V5cykgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBFWFBFQ1RfVFJVRShjb25maWdfaGFzX2tleSgqY29uZmlnLCAiRElEIiwgInJlY29yZE51bWJlciIpKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnX2hhc19rZXkoKmNvbmZpZywgIkRJRCIsICJwcmltYXJ5UmVjb3JkIikpOwotICBFWFBFQ1RfVFJVRShjb25maWdfaGFzX2tleSgqY29uZmlnLCAiRElEIiwgInByb2R1Y3RJZCIpKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnX2hhc19rZXkoKmNvbmZpZywgIkRJRCIsICJ2ZXJzaW9uIikpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX25vX2JhZF9rZXlzKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnID0gY29uZmlnX25ldyhDT05GSUdfRklMRSk7Ci0gIEVYUEVDVF9GQUxTRShjb25maWdfaGFzX2tleSgqY29uZmlnLCAiRElEX0JBRCIsICJwcmltYXJ5UmVjb3JkIikpOwotICBFWFBFQ1RfRkFMU0UoY29uZmlnX2hhc19rZXkoKmNvbmZpZywgIkRJRCIsICJwcmltYXJ5UmVjb3JkX0JBRCIpKTsKLSAgRVhQRUNUX0ZBTFNFKAotICAgICAgY29uZmlnX2hhc19rZXkoKmNvbmZpZywgQ09ORklHX0RFRkFVTFRfU0VDVElPTiwgInByaW1hcnlSZWNvcmQiKSk7Ci19Ci0KLVRFU1RfRihDb25maWdUZXN0LCBjb25maWdfZ2V0X2ludF92ZXJzaW9uKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnID0gY29uZmlnX25ldyhDT05GSUdfRklMRSk7Ci0gIEVYUEVDVF9FUShjb25maWdfZ2V0X2ludCgqY29uZmlnLCAiRElEIiwgInZlcnNpb24iLCAwKSwgMHgxNDM2KTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNvbmZpZ19nZXRfaW50X2RlZmF1bHQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3KENPTkZJR19GSUxFKTsKLSAgRVhQRUNUX0VRKGNvbmZpZ19nZXRfaW50KCpjb25maWcsICJESUQiLCAicHJpbWFyeVJlY29yZCIsIDEyMyksIDEyMyk7Ci19Ci0KLVRFU1RfRihDb25maWdUZXN0LCBjb25maWdfZ2V0X3VpbnQ2NCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBFWFBFQ1RfRVEoY29uZmlnX2dldF91aW50NjQoKmNvbmZpZywgIkRJRCIsICJIaVN5bmNJZCIsIDApLAotICAgICAgICAgICAgMHhGRkZGRkZGRkZGRkZGRkZGKTsKLSAgRVhQRUNUX0VRKGNvbmZpZ19nZXRfdWludDY0KCpjb25maWcsICJESUQiLCAiSGlTeW5jSWQyIiwgMCksCi0gICAgICAgICAgICB1aW50NjRfdCgxNTAwMTkwMCkpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX2dldF91aW50NjRfZGVmYXVsdCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBFWFBFQ1RfRVEoY29uZmlnX2dldF91aW50NjQoKmNvbmZpZywgIkRJRCIsICJwcmltYXJ5UmVjb3JkIiwgMTIzKSwKLSAgICAgICAgICAgIHVpbnQ2NF90KDEyMykpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX3JlbW92ZV9zZWN0aW9uKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnID0gY29uZmlnX25ldyhDT05GSUdfRklMRSk7Ci0gIEVYUEVDVF9UUlVFKGNvbmZpZ19yZW1vdmVfc2VjdGlvbihjb25maWcuZ2V0KCksICJESUQiKSk7Ci0gIEVYUEVDVF9GQUxTRShjb25maWdfaGFzX3NlY3Rpb24oKmNvbmZpZywgIkRJRCIpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbmZpZ19oYXNfa2V5KCpjb25maWcsICJESUQiLCAicHJvZHVjdElkIikpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX3JlbW92ZV9zZWN0aW9uX21pc3NpbmcpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3KENPTkZJR19GSUxFKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbmZpZ19yZW1vdmVfc2VjdGlvbihjb25maWcuZ2V0KCksICJub3QgYSBzZWN0aW9uIikpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX3JlbW92ZV9rZXkpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3KENPTkZJR19GSUxFKTsKLSAgRVhQRUNUX0VRKGNvbmZpZ19nZXRfaW50KCpjb25maWcsICJESUQiLCAicHJvZHVjdElkIiwgOTk5KSwgMHgxMjAwKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnX3JlbW92ZV9rZXkoY29uZmlnLmdldCgpLCAiRElEIiwgInByb2R1Y3RJZCIpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvbmZpZ19oYXNfa2V5KCpjb25maWcsICJESUQiLCAicHJvZHVjdElkIikpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX3JlbW92ZV9rZXlfbWlzc2luZykgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZyA9IGNvbmZpZ19uZXcoQ09ORklHX0ZJTEUpOwotICBFWFBFQ1RfRVEoY29uZmlnX2dldF9pbnQoKmNvbmZpZywgIkRJRCIsICJwcm9kdWN0SWQiLCA5OTkpLCAweDEyMDApOwotICBFWFBFQ1RfVFJVRShjb25maWdfcmVtb3ZlX2tleShjb25maWcuZ2V0KCksICJESUQiLCAicHJvZHVjdElkIikpOwotICBFWFBFQ1RfRVEoY29uZmlnX2dldF9pbnQoKmNvbmZpZywgIkRJRCIsICJwcm9kdWN0SWQiLCA5OTkpLCA5OTkpOwotfQotCi1URVNUX0YoQ29uZmlnVGVzdCwgY29uZmlnX3NhdmVfYmFzaWMpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWcgPSBjb25maWdfbmV3KENPTkZJR19GSUxFKTsKLSAgRVhQRUNUX1RSVUUoY29uZmlnX3NhdmUoKmNvbmZpZywgQ09ORklHX0ZJTEUpKTsKLX0KLQotVEVTVF9GKENvbmZpZ1Rlc3QsIGNoZWNrc3VtX3JlYWQpIHsKLSAgYXV0byB0bXBfZGlyID0gc3RkOjpmaWxlc3lzdGVtOjp0ZW1wX2RpcmVjdG9yeV9wYXRoKCk7Ci0gIGF1dG8gZmlsZW5hbWUgPSB0bXBfZGlyIC8gInRlc3QuY2hlY2tzdW0iOwotICBzdGQ6OnN0cmluZyBjaGVja3N1bSA9ICIweDEyMzQiOwotICBiYXNlOjpGaWxlUGF0aCBmaWxlX3BhdGgoZmlsZW5hbWUuc3RyaW5nKCkpOwotCi0gIEVYUEVDVF9FUShiYXNlOjpXcml0ZUZpbGUoZmlsZV9wYXRoLCBjaGVja3N1bS5kYXRhKCksIGNoZWNrc3VtLnNpemUoKSksCi0gICAgICAgICAgICAoaW50KWNoZWNrc3VtLnNpemUoKSk7Ci0KLSAgRVhQRUNUX0VRKGNoZWNrc3VtX3JlYWQoZmlsZW5hbWUuY19zdHIoKSksIGNoZWNrc3VtLmNfc3RyKCkpOwotCi0gIEVYUEVDVF9UUlVFKHN0ZDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKGZpbGVuYW1lKSk7Ci19Ci0KLVRFU1RfRihDb25maWdUZXN0LCBjaGVja3N1bV9zYXZlKSB7Ci0gIGF1dG8gdG1wX2RpciA9IHN0ZDo6ZmlsZXN5c3RlbTo6dGVtcF9kaXJlY3RvcnlfcGF0aCgpOwotICBhdXRvIGZpbGVuYW1lID0gdG1wX2RpciAvICJ0ZXN0LmNoZWNrc3VtIjsKLSAgc3RkOjpzdHJpbmcgY2hlY2tzdW0gPSAiMHgxMjM0IjsKLSAgYmFzZTo6RmlsZVBhdGggZmlsZV9wYXRoKGZpbGVuYW1lLnN0cmluZygpKTsKLQotICBFWFBFQ1RfVFJVRShjaGVja3N1bV9zYXZlKGNoZWNrc3VtLCBmaWxlbmFtZSkpOwotCi0gIEVYUEVDVF9UUlVFKGJhc2U6OlBhdGhFeGlzdHMoZmlsZV9wYXRoKSk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RkOjpmaWxlc3lzdGVtOjpyZW1vdmUoZmlsZW5hbWUpKTsKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2ZpeGVkX3F1ZXVlX3Rlc3QuY2MgYi9vc2kvdGVzdC9maXhlZF9xdWV1ZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkxN2VmLi4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L2ZpeGVkX3F1ZXVlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxjbGltaXRzPgotCi0jaW5jbHVkZSAiQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IFRFU1RfUVVFVUVfU0laRSA9IDEwOwotc3RhdGljIGNvbnN0IGNoYXIqIERVTU1ZX0RBVEFfU1RSSU5HID0gIkR1bW15IGRhdGEgc3RyaW5nIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBEVU1NWV9EQVRBX1NUUklORzEgPSAiRHVtbXkgZGF0YSBzdHJpbmcxIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBEVU1NWV9EQVRBX1NUUklORzIgPSAiRHVtbXkgZGF0YSBzdHJpbmcyIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBEVU1NWV9EQVRBX1NUUklORzMgPSAiRHVtbXkgZGF0YSBzdHJpbmczIjsKLXN0YXRpYyBmdXR1cmVfdCogcmVjZWl2ZWRfbWVzc2FnZV9mdXR1cmUgPSBOVUxMOwotCi1zdGF0aWMgaW50IHRlc3RfcXVldWVfZW50cnlfZnJlZV9jb3VudGVyID0gMDsKLQotLy8gVGVzdCB3aGV0aGVyIGEgZmlsZSBkZXNjcmlwdG9yIHxmZHwgaXMgcmVhZGFibGUuCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIHJlYWRhYmxlLCBvdGhlcndpc2UgZmFsc2UuCi1zdGF0aWMgYm9vbCBpc19mZF9yZWFkYWJsZShpbnQgZmQpIHsKLSAgZmRfc2V0IHJmZHM7Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OwotCi0gIEZEX1pFUk8oJnJmZHMpOwotICB0di50dl9zZWMgPSAwOwotICB0di50dl91c2VjID0gMDsKLSAgRkRfU0VUKGZkLCAmcmZkcyk7Ci0gIC8vIE9ubHkgdGhlIGVucXVldWVfZmQgc2hvdWxkIGJlIHJlYWRhYmxlCi0gIGludCByZXN1bHQgPSBzZWxlY3QoRkRfU0VUU0laRSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdCA+PSAwKTsKLQotICByZXR1cm4gRkRfSVNTRVQoZmQsICZyZmRzKTsKLX0KLQotLy8gRnVuY3Rpb24gZm9yIHBlcmZvcm1pbmcgZGVxdWV1ZSBvcGVyYXRpb25zIGZyb20gdGhlIHF1ZXVlIHdoZW4gaXMgcmVhZHkKLXN0YXRpYyB2b2lkIGZpeGVkX3F1ZXVlX3JlYWR5KGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBVTlVTRURfQVRUUiB2b2lkKiBjb250ZXh0KSB7Ci0gIHZvaWQqIG1zZyA9IGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHF1ZXVlKTsKLSAgRVhQRUNUX1RSVUUobXNnICE9IE5VTEwpOwotICBmdXR1cmVfcmVhZHkocmVjZWl2ZWRfbWVzc2FnZV9mdXR1cmUsIG1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRlc3RfcXVldWVfZW50cnlfZnJlZV9jYih2b2lkKiBkYXRhKSB7Ci0gIC8vIERvbid0IGZyZWUgdGhlIGRhdGEsIGJlY2F1c2Ugd2UgYXJlIHRlc3Rpbmcgb25seSB3aGV0aGVyIHRoZSBjYWxsYmFjawotICAvLyBpcyBjYWxsZWQuCi0gIHRlc3RfcXVldWVfZW50cnlfZnJlZV9jb3VudGVyKys7Ci19Ci0KLWNsYXNzIEZpeGVkUXVldWVUZXN0IDogcHVibGljIEFsbG9jYXRpb25UZXN0SGFybmVzcyB7fTsKLQotVEVTVF9GKEZpeGVkUXVldWVUZXN0LCB0ZXN0X2ZpeGVkX3F1ZXVlX25ld19mcmVlKSB7Ci0gIGZpeGVkX3F1ZXVlX3QqIHF1ZXVlOwotCi0gIC8vIFRlc3QgYSBjb3JuZXIgY2FzZTogcXVldWUgb2Ygc2l6ZSAwCi0gIHF1ZXVlID0gZml4ZWRfcXVldWVfbmV3KDApOwotICBFWFBFQ1RfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLSAgZml4ZWRfcXVldWVfZnJlZShxdWV1ZSwgTlVMTCk7Ci0KLSAgLy8gVGVzdCBhIGNvcm5lciBjYXNlOiBxdWV1ZSBvZiBzaXplIDEKLSAgcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoMSk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlICE9IE5VTEwpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBOVUxMKTsKLQotICAvLyBUZXN0IGEgY29ybmVyIGNhc2U6IHF1ZXVlIG9mIG1heGltdW0gc2l6ZQotICBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldygoc2l6ZV90KS0xKTsKLSAgRVhQRUNUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIE5VTEwpOwotCi0gIC8vIFRlc3QgYSBxdWV1ZSBvZiBzb21lIHNpemUKLSAgcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoVEVTVF9RVUVVRV9TSVpFKTsKLSAgRVhQRUNUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIE5VTEwpOwotCi0gIC8vIFRlc3QgZnJlZS1pbmcgYSBOVUxMIHF1ZXVlCi0gIGZpeGVkX3F1ZXVlX2ZyZWUoTlVMTCwgTlVMTCk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUoTlVMTCwgb3NpX2ZyZWUpOwotfQotCi1URVNUX0YoRml4ZWRRdWV1ZVRlc3QsIHRlc3RfZml4ZWRfcXVldWVfZmx1c2gpIHsKLSAgZml4ZWRfcXVldWVfdCogcXVldWU7Ci0KLSAgLy8gVGVzdCBhIGNvcm5lciBjYXNlOiBxdWV1ZSBvZiBzaXplIDAgYW5kIG5vIGNhbGxiYWNrIHRvIGZyZWUgZW50cmllcwotICBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldygwKTsKLSAgRVhQRUNUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIGZpeGVkX3F1ZXVlX2ZsdXNoKHF1ZXVlLCBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZml4ZWRfcXVldWVfaXNfZW1wdHkocXVldWUpKTsKLSAgZml4ZWRfcXVldWVfZnJlZShxdWV1ZSwgb3NpX2ZyZWUpOwotCi0gIC8vIFRlc3QgYSBjb3JuZXIgY2FzZTogcXVldWUgb2Ygc2l6ZSAwIGFuZCBhIGNhbGxiYWNrIHRvIGZyZWUgZW50cmllcwotICBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldygwKTsKLSAgRVhQRUNUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIGZpeGVkX3F1ZXVlX2ZsdXNoKHF1ZXVlLCBvc2lfZnJlZSk7Ci0gIEVYUEVDVF9UUlVFKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHF1ZXVlKSk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIG9zaV9mcmVlKTsKLQotICAvLyBUZXN0IGEgcXVldWUgb2Ygc29tZSBzaXplIGFuZCBubyBjYWxsYmFjayB0byBmcmVlIGVudHJpZXMKLSAgcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoVEVTVF9RVUVVRV9TSVpFKTsKLSAgRVhQRUNUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcxKTsKLSAgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORzIpOwotICBmaXhlZF9xdWV1ZV90cnlfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HMyk7Ci0gIEVYUEVDVF9GQUxTRShmaXhlZF9xdWV1ZV9pc19lbXB0eShxdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mbHVzaChxdWV1ZSwgTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHF1ZXVlKSk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIG9zaV9mcmVlKTsKLQotICAvLyBUZXN0IGEgcXVldWUgb2Ygc29tZSBzaXplIGFuZCBhIGNhbGxiYWNrIHRvIGZyZWUgZW50cmllcwotICB0ZXN0X3F1ZXVlX2VudHJ5X2ZyZWVfY291bnRlciA9IDA7Ci0gIHF1ZXVlID0gZml4ZWRfcXVldWVfbmV3KFRFU1RfUVVFVUVfU0laRSk7Ci0gIEVYUEVDVF9UUlVFKHF1ZXVlICE9IE5VTEwpOwotICBmaXhlZF9xdWV1ZV90cnlfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HMSk7Ci0gIGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcyKTsKLSAgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORzMpOwotICBFWFBFQ1RfRkFMU0UoZml4ZWRfcXVldWVfaXNfZW1wdHkocXVldWUpKTsKLSAgZml4ZWRfcXVldWVfZmx1c2gocXVldWUsIHRlc3RfcXVldWVfZW50cnlfZnJlZV9jYik7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfcXVldWVfZW50cnlfZnJlZV9jb3VudGVyID09IDMpOwotICBFWFBFQ1RfVFJVRShmaXhlZF9xdWV1ZV9pc19lbXB0eShxdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBvc2lfZnJlZSk7Ci19Ci0KLVRFU1RfRihGaXhlZFF1ZXVlVGVzdCwgdGVzdF9maXhlZF9xdWV1ZV9pc19lbXB0eSkgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZTsKLQotICAvLyBUZXN0IGEgTlVMTCBxdWV1ZQotICBFWFBFQ1RfVFJVRShmaXhlZF9xdWV1ZV9pc19lbXB0eShOVUxMKSk7Ci0KLSAgLy8gVGVzdCBhbiBlbXB0eSBxdWV1ZQotICBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhURVNUX1FVRVVFX1NJWkUpOwotICBBU1NFUlRfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZml4ZWRfcXVldWVfaXNfZW1wdHkocXVldWUpKTsKLQotICAvLyBUZXN0IGEgbm9uLWVtcHR5IHF1ZXVlCi0gIGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcpOwotICBFWFBFQ1RfRkFMU0UoZml4ZWRfcXVldWVfaXNfZW1wdHkocXVldWUpKTsKLQotICAvLyBUZXN0IGFuIGVtcHR5IGRlcXVldWVkIHF1ZXVlCi0gIEFTU0VSVF9FUShEVU1NWV9EQVRBX1NUUklORywgZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUocXVldWUpKTsKLSAgRVhQRUNUX1RSVUUoZml4ZWRfcXVldWVfaXNfZW1wdHkocXVldWUpKTsKLQotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBOVUxMKTsKLX0KLQotVEVTVF9GKEZpeGVkUXVldWVUZXN0LCB0ZXN0X2ZpeGVkX3F1ZXVlX2xlbmd0aCkgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZTsKLQotICAvLyBUZXN0IGEgTlVMTCBxdWV1ZQotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCBmaXhlZF9xdWV1ZV9sZW5ndGgoTlVMTCkpOwotCi0gIC8vIFRlc3QgYW4gZW1wdHkgcXVldWUKLSAgcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoVEVTVF9RVUVVRV9TSVpFKTsKLSAgQVNTRVJUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTAsIGZpeGVkX3F1ZXVlX2xlbmd0aChxdWV1ZSkpOwotCi0gIC8vIFRlc3QgYSBub24tZW1wdHkgcXVldWUKLSAgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORyk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTEsIGZpeGVkX3F1ZXVlX2xlbmd0aChxdWV1ZSkpOwotCi0gIC8vIFRlc3QgYW4gZW1wdHkgZGVxdWV1ZWQgcXVldWUKLSAgQVNTRVJUX0VRKERVTU1ZX0RBVEFfU1RSSU5HLCBmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShxdWV1ZSkpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCBmaXhlZF9xdWV1ZV9sZW5ndGgocXVldWUpKTsKLQotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBOVUxMKTsKLX0KLQotVEVTVF9GKEZpeGVkUXVldWVUZXN0LCB0ZXN0X2ZpeGVkX3F1ZXVlX2NhcGFjaXR5KSB7Ci0gIGZpeGVkX3F1ZXVlX3QqIHF1ZXVlOwotCi0gIC8vIFRlc3QgYSBjb3JuZXIgY2FzZTogcXVldWUgb2Ygc2l6ZSAwCi0gIHF1ZXVlID0gZml4ZWRfcXVldWVfbmV3KDApOwotICBBU1NFUlRfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMCwgZml4ZWRfcXVldWVfY2FwYWNpdHkocXVldWUpKTsKLSAgZml4ZWRfcXVldWVfZnJlZShxdWV1ZSwgTlVMTCk7Ci0KLSAgLy8gVGVzdCBhIGNvcm5lciBjYXNlOiBxdWV1ZSBvZiBzaXplIDEKLSAgcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoMSk7Ci0gIEFTU0VSVF9UUlVFKHF1ZXVlICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkxLCBmaXhlZF9xdWV1ZV9jYXBhY2l0eShxdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBOVUxMKTsKLQotICAvLyBUZXN0IGEgY29ybmVyIGNhc2U6IHF1ZXVlIG9mIG1heGltdW0gc2l6ZQotICBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldygoc2l6ZV90KS0xKTsKLSAgQVNTRVJUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KS0xLCBmaXhlZF9xdWV1ZV9jYXBhY2l0eShxdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBOVUxMKTsKLQotICAvLyBUZXN0IGEgcXVldWUgb2Ygc29tZSBzaXplCi0gIHF1ZXVlID0gZml4ZWRfcXVldWVfbmV3KFRFU1RfUVVFVUVfU0laRSk7Ci0gIEFTU0VSVF9UUlVFKHF1ZXVlICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoVEVTVF9RVUVVRV9TSVpFLCBmaXhlZF9xdWV1ZV9jYXBhY2l0eShxdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHF1ZXVlLCBOVUxMKTsKLX0KLQotVEVTVF9GKEZpeGVkUXVldWVUZXN0LCB0ZXN0X2ZpeGVkX3F1ZXVlX2VucXVldWVfZGVxdWV1ZSkgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhURVNUX1FVRVVFX1NJWkUpOwotICBBU1NFUlRfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLQotICAvLyBUZXN0IGJsb2NraW5nIGVucXVldWUgYW5kIGJsb2NraW5nIGRlcXVldWUKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMSwgZml4ZWRfcXVldWVfbGVuZ3RoKHF1ZXVlKSk7Ci0gIEVYUEVDVF9FUShEVU1NWV9EQVRBX1NUUklORywgZml4ZWRfcXVldWVfZGVxdWV1ZShxdWV1ZSkpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCBmaXhlZF9xdWV1ZV9sZW5ndGgocXVldWUpKTsKLQotICAvLyBUZXN0IG5vbi1ibG9ja2luZyBlbnF1ZXVlIGFuZCBub24tYmxvY2tpbmcgZGVxdWV1ZQotICBFWFBFQ1RfVFJVRShmaXhlZF9xdWV1ZV90cnlfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTEsIGZpeGVkX3F1ZXVlX2xlbmd0aChxdWV1ZSkpOwotICBFWFBFQ1RfRVEoRFVNTVlfREFUQV9TVFJJTkcsIGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHF1ZXVlKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTAsIGZpeGVkX3F1ZXVlX2xlbmd0aChxdWV1ZSkpOwotCi0gIC8vIFRlc3Qgbm9uLWJsb2NraW5nIGVucXVldWUgYmV5b25kIHF1ZXVlIGNhcGFjaXR5Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgVEVTVF9RVUVVRV9TSVpFOyBpKyspIHsKLSAgICBFWFBFQ1RfVFJVRShmaXhlZF9xdWV1ZV90cnlfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HKSk7Ci0gIH0KLSAgLy8gVGhlIG5leHQgZW5xdWV1ZSBvcGVyYXRpb24gaXMgYmV5b25kIHRoZSBxdWV1ZSBjYXBhY2l0eSwgc28gaXQgc2hvdWxkIGZhaWwKLSAgRVhQRUNUX0ZBTFNFKGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcpKTsKLQotICAvLyBUZXN0IG5vbi1ibG9ja2luZyBkZXF1ZXVlIGZyb20gYSBxdWV1ZSB0aGF0IGlzIGZ1bGwgdG8gbWF4IGNhcGFjaXR5Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgVEVTVF9RVUVVRV9TSVpFOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoRFVNTVlfREFUQV9TVFJJTkcsIGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHF1ZXVlKSk7Ci0gIH0KLQotICAvLyBUZXN0IG5vbi1ibG9ja2luZyBkZXF1ZXVlIGZyb20gYW4gZW1wdHkgcXVldWUKLSAgRVhQRUNUX0VRKE5VTEwsIGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHF1ZXVlKSk7Ci0KLSAgLy8gVGVzdCBub24tYmxvY2tpbmcgZGVxdWV1ZSBmcm9tIGEgTlVMTCBxdWV1ZQotICBFWFBFQ1RfRVEoTlVMTCwgZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoTlVMTCkpOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIE5VTEwpOwotfQotCi1URVNUX0YoRml4ZWRRdWV1ZVRlc3QsIHRlc3RfZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3RfbGFzdCkgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhURVNUX1FVRVVFX1NJWkUpOwotICBBU1NFUlRfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLQotICAvLyBUZXN0IHBlZWsgZmlyc3QvbGFzdCBmcm9tIGEgTlVMTCBxdWV1ZQotICBFWFBFQ1RfRVEoTlVMTCwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QoTlVMTCkpOwotICBFWFBFQ1RfRVEoTlVMTCwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChOVUxMKSk7Ci0KLSAgLy8gVGVzdCBwZWVrIGZpcnN0L2xhc3QgZnJvbSBhbiBlbXB0eSBxdWV1ZQotICBFWFBFQ1RfRVEoTlVMTCwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QocXVldWUpKTsKLSAgRVhQRUNUX0VRKE5VTEwsIGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2xhc3QocXVldWUpKTsKLQotICAvLyBUZXN0IHBlZWsgZmlyc3QvbGFzdCBmcm9tIGEgcXVldWUgd2l0aCBvbmUgZWxlbWVudAotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcxKTsKLSAgRVhQRUNUX0VRKERVTU1ZX0RBVEFfU1RSSU5HMSwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QocXVldWUpKTsKLSAgRVhQRUNUX0VRKERVTU1ZX0RBVEFfU1RSSU5HMSwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChxdWV1ZSkpOwotCi0gIC8vIFRlc3QgcGVlayBmaXJzdC9sYXN0IGZyb20gYSBxdWV1ZSB3aXRoIHR3byBlbGVtZW50cwotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcyKTsKLSAgRVhQRUNUX0VRKERVTU1ZX0RBVEFfU1RSSU5HMSwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QocXVldWUpKTsKLSAgRVhQRUNUX0VRKERVTU1ZX0RBVEFfU1RSSU5HMiwgZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChxdWV1ZSkpOwotCi0gIC8vIFRlc3QgcGVlayBmaXJzdC9sYXN0IGZyb20gYSBxdWV1ZSB3aXRoIHRocmVlIGVsZW1lbnRzCi0gIGZpeGVkX3F1ZXVlX2VucXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORzMpOwotICBFWFBFQ1RfRVEoRFVNTVlfREFUQV9TVFJJTkcxLCBmaXhlZF9xdWV1ZV90cnlfcGVla19maXJzdChxdWV1ZSkpOwotICBFWFBFQ1RfRVEoRFVNTVlfREFUQV9TVFJJTkczLCBmaXhlZF9xdWV1ZV90cnlfcGVla19sYXN0KHF1ZXVlKSk7Ci0KLSAgZml4ZWRfcXVldWVfZnJlZShxdWV1ZSwgTlVMTCk7Ci19Ci0KLVRFU1RfRihGaXhlZFF1ZXVlVGVzdCwgdGVzdF9maXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUpIHsKLSAgZml4ZWRfcXVldWVfdCogcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoVEVTVF9RVUVVRV9TSVpFKTsKLSAgQVNTRVJUX1RSVUUocXVldWUgIT0gTlVMTCk7Ci0KLSAgLy8gVGVzdCByZW1vdmluZyBmcm9tIGEgTlVMTCBxdWV1ZQotICBFWFBFQ1RfRVEoTlVMTCwKLSAgICAgICAgICAgIGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZShOVUxMLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcpKTsKLQotICAvLyBUZXN0IHJlbW92aW5nIGZyb20gYW4gZW1wdHkgcXVldWUKLSAgRVhQRUNUX0VRKE5VTEwsCi0gICAgICAgICAgICBmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORykpOwotCi0gIC8vIFRlc3QgcmVtb3ZpbmcgYSBxdWV1ZWQgc3RyaW5nIGZyb20gYSBxdWV1ZQotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHF1ZXVlLCAodm9pZCopRFVNTVlfREFUQV9TVFJJTkcxKTsKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HMik7Ci0gIGZpeGVkX3F1ZXVlX2VucXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORzMpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkzLCBmaXhlZF9xdWV1ZV9sZW5ndGgocXVldWUpKTsKLSAgRVhQRUNUX0VRKERVTU1ZX0RBVEFfU1RSSU5HMiwgZml4ZWRfcXVldWVfdHJ5X3JlbW92ZV9mcm9tX3F1ZXVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORzIpKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMiwgZml4ZWRfcXVldWVfbGVuZ3RoKHF1ZXVlKSk7Ci0gIC8vIFJlbW92aW5nIGFnYWluIHNob3VsZCBmYWlsCi0gIEVYUEVDVF9FUShOVUxMLCBmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUocXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HMikpOwotCi0gIC8vIFRlc3QgcmVtb3ZpbmcgYSBub24tcXVldWVkIHN0cmluZyBmcm9tIGEgcXVldWUKLSAgRVhQRUNUX0VRKE5VTEwsCi0gICAgICAgICAgICBmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUocXVldWUsICh2b2lkKilEVU1NWV9EQVRBX1NUUklORykpOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIE5VTEwpOwotfQotCi1URVNUX0YoRml4ZWRRdWV1ZVRlc3QsIHRlc3RfZml4ZWRfcXVldWVfZ2V0X2VucXVldWVfZGVxdWV1ZV9mZCkgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhURVNUX1FVRVVFX1NJWkUpOwotICBBU1NFUlRfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLQotICAvLyBUZXN0IHZhbGlkaXR5IG9mIGVucXVldWUgYW5kIGRlcXVldWUgZmlsZSBkZXNjcmlwdG9ycwotICBpbnQgZW5xdWV1ZV9mZCA9IGZpeGVkX3F1ZXVlX2dldF9lbnF1ZXVlX2ZkKHF1ZXVlKTsKLSAgaW50IGRlcXVldWVfZmQgPSBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZChxdWV1ZSk7Ci0gIEVYUEVDVF9UUlVFKGVucXVldWVfZmQgPj0gMCk7Ci0gIEVYUEVDVF9UUlVFKGRlcXVldWVfZmQgPj0gMCk7Ci0gIEVYUEVDVF9UUlVFKGVucXVldWVfZmQgPCBGRF9TRVRTSVpFKTsKLSAgRVhQRUNUX1RSVUUoZGVxdWV1ZV9mZCA8IEZEX1NFVFNJWkUpOwotCi0gIC8vIFRlc3QgdGhlIGZpbGUgZGVzY3JpcHRvcnMgb2YgYW4gZW1wdHkgcXVldWUKLSAgLy8gT25seSB0aGUgZW5xdWV1ZV9mZCBzaG91bGQgYmUgcmVhZGFibGUKLSAgRVhQRUNUX1RSVUUoaXNfZmRfcmVhZGFibGUoZW5xdWV1ZV9mZCkpOwotICBFWFBFQ1RfRkFMU0UoaXNfZmRfcmVhZGFibGUoZGVxdWV1ZV9mZCkpOwotCi0gIC8vIFRlc3QgdGhlIGZpbGUgZGVzY3JpcHRvcnMgb2YgYSBub24tZW1wdHkgcXVldWUKLSAgLy8gQm90aCB0aGUgZW5xdWV1ZV9mZCBhbmQgZGVxdWV1ZV9mZCBzaG91bGQgYmUgcmVhZGFibGUKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HKTsKLSAgRVhQRUNUX1RSVUUoaXNfZmRfcmVhZGFibGUoZW5xdWV1ZV9mZCkpOwotICBFWFBFQ1RfVFJVRShpc19mZF9yZWFkYWJsZShkZXF1ZXVlX2ZkKSk7Ci0gIGZpeGVkX3F1ZXVlX2RlcXVldWUocXVldWUpOwotCi0gIC8vIFRlc3QgdGhlIGZpbGUgZGVzY3JpcHRvcnMgb2YgYSBmdWxsIHF1ZXVlCi0gIC8vIE9ubHkgdGhlIGRlcXVldWVfZmQgc2hvdWxkIGJlIHJlYWRhYmxlCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgVEVTVF9RVUVVRV9TSVpFOyBpKyspIHsKLSAgICBFWFBFQ1RfVFJVRShmaXhlZF9xdWV1ZV90cnlfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HKSk7Ci0gIH0KLSAgRVhQRUNUX0ZBTFNFKGlzX2ZkX3JlYWRhYmxlKGVucXVldWVfZmQpKTsKLSAgRVhQRUNUX1RSVUUoaXNfZmRfcmVhZGFibGUoZGVxdWV1ZV9mZCkpOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUocXVldWUsIE5VTEwpOwotfQotCi1URVNUX0YoRml4ZWRRdWV1ZVRlc3QsIHRlc3RfZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZSkgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhURVNUX1FVRVVFX1NJWkUpOwotICBBU1NFUlRfVFJVRShxdWV1ZSAhPSBOVUxMKTsKLQotICByZWNlaXZlZF9tZXNzYWdlX2Z1dHVyZSA9IGZ1dHVyZV9uZXcoKTsKLSAgQVNTRVJUX1RSVUUocmVjZWl2ZWRfbWVzc2FnZV9mdXR1cmUgIT0gTlVMTCk7Ci0KLSAgdGhyZWFkX3QqIHdvcmtlcl90aHJlYWQgPSB0aHJlYWRfbmV3KCJ0ZXN0X2ZpeGVkX3F1ZXVlX3dvcmtlcl90aHJlYWQiKTsKLSAgQVNTRVJUX1RSVUUod29ya2VyX3RocmVhZCAhPSBOVUxMKTsKLQotICBmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlKHF1ZXVlLCB0aHJlYWRfZ2V0X3JlYWN0b3Iod29ya2VyX3RocmVhZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfcXVldWVfcmVhZHksIE5VTEwpOwotCi0gIC8vIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIHF1ZXVlLCBhbmQgZXhwZWN0IHRvIHJlY2VpdmUgaXQKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShxdWV1ZSwgKHZvaWQqKURVTU1ZX0RBVEFfU1RSSU5HKTsKLSAgY29uc3QgY2hhciogbXNnID0gKGNvbnN0IGNoYXIqKWZ1dHVyZV9hd2FpdChyZWNlaXZlZF9tZXNzYWdlX2Z1dHVyZSk7Ci0gIEVYUEVDVF9FUShEVU1NWV9EQVRBX1NUUklORywgbXNnKTsKLQotICBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUocXVldWUpOwotICB0aHJlYWRfZnJlZSh3b3JrZXJfdGhyZWFkKTsKLSAgZml4ZWRfcXVldWVfZnJlZShxdWV1ZSwgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXR1cmVfdGVzdC5jYyBiL29zaS90ZXN0L2Z1dHVyZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc4NzM5Li4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L2Z1dHVyZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotCi1zdGF0aWMgY29uc3QgY2hhciogcGFzc19iYWNrX2RhdGEwID0gImZhbmN5IGEgc2FuZHdpY2g/IGl0J3MgYSBmYW5jeSBzYW5kd2ljaCI7Ci1zdGF0aWMgY29uc3QgY2hhciogcGFzc19iYWNrX2RhdGExID0KLSAgICAid2hhdCBraW5kIG9mIGljZSBjcmVhbSB0cnVjayBwbGF5cyB0aGUgd29yc3QgY2hyaXN0bWFzIHNvbmcgb2YgYWxsIHRpbWU/IjsKLQotY2xhc3MgRnV0dXJlVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3Mge307Ci0KLXN0YXRpYyB2b2lkIHBvc3RfdG9fZnV0dXJlKHZvaWQqIGNvbnRleHQpIHsKLSAgZnV0dXJlX3JlYWR5KChmdXR1cmVfdCopY29udGV4dCwgKHZvaWQqKXBhc3NfYmFja19kYXRhMCk7Ci19Ci0KLVRFU1RfRihGdXR1cmVUZXN0LCB0ZXN0X2Z1dHVyZV9ub25faW1tZWRpYXRlKSB7Ci0gIGZ1dHVyZV90KiBmdXR1cmUgPSBmdXR1cmVfbmV3KCk7Ci0gIEFTU0VSVF9UUlVFKGZ1dHVyZSAhPSBOVUxMKTsKLQotICBNZXNzYWdlTG9vcFRocmVhZCB3b3JrZXJfdGhyZWFkKCJ3b3JrZXJfdGhyZWFkIik7Ci0gIHdvcmtlcl90aHJlYWQuU3RhcnRVcCgpOwotICB3b3JrZXJfdGhyZWFkLkRvSW5UaHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKHBvc3RfdG9fZnV0dXJlLCBmdXR1cmUpKTsKLQotICBFWFBFQ1RfRVEocGFzc19iYWNrX2RhdGEwLCBmdXR1cmVfYXdhaXQoZnV0dXJlKSk7Ci0KLSAgd29ya2VyX3RocmVhZC5TaHV0RG93bigpOwotfQotCi1URVNUX0YoRnV0dXJlVGVzdCwgdGVzdF9mdXR1cmVfaW1tZWRpYXRlKSB7Ci0gIGZ1dHVyZV90KiBmdXR1cmUgPSBmdXR1cmVfbmV3X2ltbWVkaWF0ZSgodm9pZCopcGFzc19iYWNrX2RhdGExKTsKLSAgQVNTRVJUX1RSVUUoZnV0dXJlICE9IE5VTEwpOwotICBFWFBFQ1RfRVEocGFzc19iYWNrX2RhdGExLCBmdXR1cmVfYXdhaXQoZnV0dXJlKSk7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9vc2kvdGVzdC9mdXp6ZXJzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjdmODIuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJvc2lfZnV6el9kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfb3NpX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvYWxhcm0vQW5kcm9pZC5icCBiL29zaS90ZXN0L2Z1enplcnMvYWxhcm0vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMjgyNC4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2FsYXJtL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAibGlib3NpX2Z1enpfYWxhcm0iLAotICAgIGRlZmF1bHRzOiBbImxpYm9zaV9mdXp6X2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZ1enpfYWxhcm0uY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotICAgIGNmbGFnczogWyAiLVduby11bnVzZWQtZnVuY3Rpb24iIF0sCi19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2FsYXJtL2Z1enpfYWxhcm0uY2MgYi9vc2kvdGVzdC9mdXp6ZXJzL2FsYXJtL2Z1enpfYWxhcm0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzJmOGMuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9hbGFybS9mdXp6X2FsYXJtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLQotdXNpbmcgYmFzZTo6Q2xvc3VyZTsKLXVzaW5nIGJhc2U6OlRpbWVEZWx0YTsKLXVzaW5nIGJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZDsKLQotI2RlZmluZSBNQVhfQ09OQ1VSUkVOVF9BTEFSTVMgMjUKLSNkZWZpbmUgTUFYX0JVRkZFUl9MRU4gNDA5NgotI2RlZmluZSBNQVhfQUxBUk1fRFVSQVRJT04gMjUKLQotc3RhdGljIHNlbWFwaG9yZV90KiBzZW1hcGhvcmU7Ci1zdGF0aWMgaW50IGNiX2NvdW50ZXI7Ci1zdGF0aWMgTWVzc2FnZUxvb3BUaHJlYWQqIHRocmVhZCA9IG5ldyBNZXNzYWdlTG9vcFRocmVhZCgiZmFrZSBtYWluIHRocmVhZCIpOwotCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuIHRocmVhZDsgfQotCi1zdGF0aWMgdm9pZCBjYih2b2lkKiBkYXRhKSB7Ci0gICsrY2JfY291bnRlcjsKLSAgc2VtYXBob3JlX3Bvc3Qoc2VtYXBob3JlKTsKLX0KLQotdm9pZCBzZXR1cCgpIHsKLSAgY2JfY291bnRlciA9IDA7Ci0gIHNlbWFwaG9yZSA9IHNlbWFwaG9yZV9uZXcoMCk7Ci19Ci12b2lkIHRlYXJkb3duKCkgeyBzZW1hcGhvcmVfZnJlZShzZW1hcGhvcmUpOyB9Ci0KLWFsYXJtX3QqIGZ1enpfaW5pdF9hbGFybShGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlcikgewotICBzaXplX3QgbmFtZV9sZW4gPQotICAgICAgZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX0JVRkZFUl9MRU4pOwotICBzdGQ6OnZlY3RvcjxjaGFyPiBhbGFybV9uYW1lX3ZlY3QgPQotICAgICAgZGF0YVByb3ZpZGVyLT5Db25zdW1lQnl0ZXNXaXRoVGVybWluYXRvcjxjaGFyPihuYW1lX2xlbiwgJ1wwJyk7Ci0gIGNoYXIqIGFsYXJtX25hbWUgPSBhbGFybV9uYW1lX3ZlY3QuZGF0YSgpOwotCi0gIC8vIERldGVybWluZSBpZiBvdXIgYWxhcm0gd2lsbCBiZSBwZXJpb2RpYwotICBpZiAoZGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpKSB7Ci0gICAgcmV0dXJuIGFsYXJtX25ld19wZXJpb2RpYyhhbGFybV9uYW1lKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gYWxhcm1fbmV3KGFsYXJtX25hbWUpOwotICB9Ci19Ci0KLWJvb2wgZnV6el9zZXRfYWxhcm0oYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsLCBhbGFybV9jYWxsYmFja190IGNiLAotICAgICAgICAgICAgICAgICAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlcikgewotICAvLyBHZW5lcmF0ZSBhIHJhbmRvbSBidWZmZXIgKG9yIG51bGwpCi0gIHZvaWQqIGRhdGFfYnVmZmVyID0gbnVsbHB0cjsKLSAgc2l6ZV90IGJ1ZmZfbGVuID0KLSAgICAgIGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDEsIE1BWF9CVUZGRVJfTEVOKTsKLSAgaWYgKGJ1ZmZfbGVuID09IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBhbGxvY2F0ZSBvdXIgc3BhY2UKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV92ZWN0b3IgPQotICAgICAgZGF0YVByb3ZpZGVyLT5Db25zdW1lQnl0ZXM8dWludDhfdD4oYnVmZl9sZW4pOwotICBkYXRhX2J1ZmZlciA9IGRhdGFfdmVjdG9yLmRhdGEoKTsKLQotICAvLyBNYWtlIHN1cmUgYWxhcm0gaXMgbm9uLW51bGwKLSAgaWYgKGFsYXJtKSB7Ci0gICAgLy8gU2hvdWxkIHRoaXMgYWxhcm0gYmUgcmVndWxhciBvciBvbiBtbG9vcD8KLSAgICBpZiAoZGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpKSB7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AoYWxhcm0sIGludGVydmFsLCBjYiwgZGF0YV9idWZmZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhbGFybV9zZXQoYWxhcm0sIGludGVydmFsLCBjYiwgZGF0YV9idWZmZXIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIERhdGEsIHNpemVfdCBTaXplKSB7Ci0gIC8vIEluaXQgb3VyIHdyYXBwZXIKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlcihEYXRhLCBTaXplKTsKLQotICAvLyBQZXJmb3JtIHNldHVwCi0gIHNldHVwKCk7Ci0KLSAgYWxhcm1fdCogYWxhcm0gPSBudWxscHRyOwotICAvLyBTaG91bGQgb3VyIGFsYXJtIGJlIHZhbGlkIG9yIG51bGw/Ci0gIGlmIChkYXRhUHJvdmlkZXIuQ29uc3VtZUJvb2woKSkgewotICAgIC8vIEluaXQgb3VyIGFsYXJtCi0gICAgYWxhcm0gPSBmdXp6X2luaXRfYWxhcm0oJmRhdGFQcm92aWRlcik7Ci0gIH0KLQotICAvLyBTZXQgdXAgdGhlIGFsYXJtICYgY2FuY2VsCi0gIC8vIEFsYXJtIG11c3QgYmUgbm9uLW51bGwsIG9yIHNldCgpIHdpbGwgdHJpZ2dlciBhc3NlcnQKLSAgaWYgKGFsYXJtKSB7Ci0gICAgaWYgKCFmdXp6X3NldF9hbGFybShhbGFybSwgTUFYX0FMQVJNX0RVUkFUSU9OLCBjYiwgJmRhdGFQcm92aWRlcikpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBhbGFybV9jYW5jZWwoYWxhcm0pOwotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgc2NoZWR1bGVkCi0gIGFsYXJtX2lzX3NjaGVkdWxlZChhbGFybSk7Ci0KLSAgaWYgKGFsYXJtKSB7Ci0gICAgLy8gU2V0IHVwIGFub3RoZXIgc2V0IG9mIGFsYXJtcyAmIGxldCB0aGVzZSBvbmVzIHJ1bgotICAgIGludCBudW1fYWxhcm1zID0KLSAgICAgICAgZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgTUFYX0NPTkNVUlJFTlRfQUxBUk1TKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hbGFybXM7IGkrKykgewotICAgICAgdWludDY0X3QgaW50ZXJ2YWwgPQotICAgICAgICAgIGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ2NF90PigwLCBNQVhfQUxBUk1fRFVSQVRJT04pOwotICAgICAgaWYgKGZ1enpfc2V0X2FsYXJtKGFsYXJtLCBpbnRlcnZhbCwgY2IsICZkYXRhUHJvdmlkZXIpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgYWxhcm1fZ2V0X3JlbWFpbmluZ19tcyhhbGFybSk7Ci0gICAgfQotCi0gICAgLy8gV2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZQotICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG51bV9hbGFybXM7IGkrKykgewotICAgICAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLSAgICB9Ci0gIH0KLQotICAvLyBGcmVlIHRoZSBhbGFybSBvYmplY3QKLSAgYWxhcm1fZnJlZShhbGFybSk7Ci0KLSAgLy8gZHVtcCBkZWJ1ZyBkYXRhIHRvIC9kZXYvbnVsbAotICBpbnQgZGVidWdfZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOwotICBhbGFybV9kZWJ1Z19kdW1wKGRlYnVnX2ZkKTsKLQotICAvLyBDbGVhbnVwCi0gIGFsYXJtX2NsZWFudXAoKTsKLQotICAvLyBQZXJmb3JtIHRlYXJkb3duCi0gIHRlYXJkb3duKCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2FsbG9jYXRpb25fdHJhY2tlci9BbmRyb2lkLmJwIGIvb3NpL3Rlc3QvZnV6emVycy9hbGxvY2F0aW9uX3RyYWNrZXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3YWY1NS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2FsbG9jYXRpb25fdHJhY2tlci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYm9zaV9mdXp6X2FsbG9jYXRpb25fdHJhY2tlciIsCi0gICAgZGVmYXVsdHM6IFsibGlib3NpX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6X2FsbG9jYXRpb25fdHJhY2tlci5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgY29ycHVzOiBbCi0gICAgICAgICJjb3JwdXMvY2hlY2tmYWlsLXJlZ3Jlc3Npb24tMTU2ODA1NTgwIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9hbGxvY2F0aW9uX3RyYWNrZXIvY29ycHVzL2NoZWNrZmFpbC1yZWdyZXNzaW9uLTE1NjgwNTU4MCBiL29zaS90ZXN0L2Z1enplcnMvYWxsb2NhdGlvbl90cmFja2VyL2NvcnB1cy9jaGVja2ZhaWwtcmVncmVzc2lvbi0xNTY4MDU1ODAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGM1YjAuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9hbGxvY2F0aW9uX3RyYWNrZXIvY29ycHVzL2NoZWNrZmFpbC1yZWdyZXNzaW9uLTE1NjgwNTU4MAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLf7/Af///7gKZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvYWxsb2NhdGlvbl90cmFja2VyL2Z1enpfYWxsb2NhdGlvbl90cmFja2VyLmNjIGIvb3NpL3Rlc3QvZnV6emVycy9hbGxvY2F0aW9uX3RyYWNrZXIvZnV6el9hbGxvY2F0aW9uX3RyYWNrZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NmU4N2MuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9hbGxvY2F0aW9uX3RyYWNrZXIvZnV6el9hbGxvY2F0aW9uX3RyYWNrZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCIKLQotI2RlZmluZSBNQVhfTlVNX0ZVTkNUSU9OUyA1MTIKLSNkZWZpbmUgTUFYX0JVRl9TSVpFIDI1NgotCi0vLyBBZGQgYSB0cmFja2VyX2luaXRpYWxpemVkIGJvb2wgdG8gdHJhY2sgaWYgd2UgaW5pdGlhbGl6ZWQgb3Igbm90Ci0vLyAoVGhpcyBpcyB0byBoYW5kbGUgYSBjYWxsIHRvIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfYWxsb2MgaW1tZWRpYXRlbHkKLS8vIHJldHVybmluZyB0aGUgcHJvdmlkZWQgcG9pbnRlciBpZiB0aGUgYWxsb2NhdG9yIGlzIG5vdCByZWFkeSwgYW5kCi0vLyBub3RpZnlfZnJlZSBvbiB0aGUgc2FtZSBwdHIgZmFpbGluZyBhcyB0aGUgYWxsb2NhdG9yIGRpZCBub3QKLS8vIHRyYWNrIHRoYXQgYWxsb2NhdGlvbikKLWJvb2wgdHJhY2tlcl9pbml0aWFsaXplZCA9IGZhbHNlOwotCi1zdHJ1Y3QgYWxsb2Nfc3RydWN0IHsKLSAgYWxsb2NhdG9yX2lkX3QgYWxsb2NfaWQ7Ci0gIHZvaWQqIHB0cjsKLX07Ci0KLXZvaWQgZnJlZUFsbG9jYXRpb25WZWN0b3Ioc3RkOjp2ZWN0b3I8YWxsb2Nfc3RydWN0PiogYWxsb2NfdmVjdG9yKSB7Ci0gIC8vIEZyZWUgb3VyIGFsbG9jYXRlZCBidWZmZXJzCi0gIGZvciAoY29uc3QgYXV0byYgYWxsb2MgOiAqYWxsb2NfdmVjdG9yKSB7Ci0gICAgdm9pZCogcmVhbF9wdHIgPSBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2ZyZWUoYWxsb2MuYWxsb2NfaWQsIGFsbG9jLnB0cik7Ci0gICAgaWYgKHJlYWxfcHRyKSB7Ci0gICAgICBmcmVlKHJlYWxfcHRyKTsKLSAgICB9Ci0gIH0KLSAgYWxsb2NfdmVjdG9yLT5jbGVhcigpOwotfQotCi12b2lkIGNhbGxBcmJpdHJhcnlGdW5jdGlvbihzdGQ6OnZlY3RvcjxhbGxvY19zdHJ1Y3Q+KiBhbGxvY192ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlcikgewotICAvLyBHZXQgb3VyIGZ1bmN0aW9uIGlkZW50aWZpZXIKLSAgc3dpdGNoIChkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8Y2hhcj4oMCwgNikpIHsKLSAgICAvLyBMZXQgMCBiZSBhIE5PLU9QLCBhcyBDb25zdW1lSW50ZWdyYWwgd2lsbCByZXR1cm4gMCBvbiBhbiBlbXB0eSBidWZmZXIKLSAgICAvLyAoVGhpcyB3aWxsIGxpa2VseSBiaWFzIHdoYXRldmVyIGFjdGlvbiBpcyBoZXJlIHRvIHJ1biBtb3JlIG9mdGVuKQotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybjsKLSAgICAvLyBJbml0Ci0gICAgY2FzZSAxOgotICAgICAgYWxsb2NhdGlvbl90cmFja2VyX2luaXQoKTsKLSAgICAgIHRyYWNrZXJfaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgMjoKLSAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBwcmludCB0byBzdGRlcnIgaWYgYWxsb2NhdGlvbnMgZXhpc3QuIE1heSBjbHV0dGVyIGxvZ3MKLSAgICAgIGFsbG9jYXRpb25fdHJhY2tlcl9leHBlY3Rfbm9fYWxsb2NhdGlvbnMoKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDM6IHsKLSAgICAgIGFsbG9jX3N0cnVjdCBhbGxvYzsKLSAgICAgIC8vIERldGVybWluZSBhbGxvY2F0b3IgSUQgJiBidWZmZXIgc2l6ZSAod2l0aG91dCBjYW5hcmllcykKLSAgICAgIGFsbG9jLmFsbG9jX2lkID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8YWxsb2NhdG9yX2lkX3Q+KCk7Ci0gICAgICBzaXplX3Qgc2l6ZSA9Ci0gICAgICAgICAgZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMSwgTUFYX0JVRl9TSVpFKTsKLSAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgLy8gR2V0IG91ciBzaXplIHdpdGggY2FuYXJpZXMgJiBhbGxvY2F0ZQotICAgICAgc2l6ZV90IHJlYWxfc2l6ZSA9IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShzaXplKTsKLSAgICAgIHZvaWQqIHRtcF9wdHIgPSBtYWxsb2MocmVhbF9zaXplKTsKLSAgICAgIGlmICh0bXBfcHRyID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYWxsb2MucHRyID0KLSAgICAgICAgICBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jKGFsbG9jLmFsbG9jX2lkLCB0bXBfcHRyLCBzaXplKTsKLSAgICAgIC8vIFB1dCBvdXIgaWQvcHRyIHBhaXIgaW4gb3VyIHRyYWNraW5nIHZlY3RvciB0byBiZSBmcmVlZCBsYXRlcgotICAgICAgaWYgKHRyYWNrZXJfaW5pdGlhbGl6ZWQgJiYgYWxsb2MucHRyKSB7Ci0gICAgICAgIGFsbG9jX3ZlY3Rvci0+cHVzaF9iYWNrKGFsbG9jKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZWUodG1wX3B0cik7Ci0gICAgICB9Ci0gICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgNDogewotICAgICAgLy8gR3JhYiBhIHB0ciBmcm9tIG91ciB0cmFja2luZyB2ZWN0b3IgJiBmcmVlIGl0Ci0gICAgICBpZiAoIWFsbG9jX3ZlY3Rvci0+ZW1wdHkoKSkgewotICAgICAgICBzaXplX3QgaW5kZXggPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKLSAgICAgICAgICAgIDAsIGFsbG9jX3ZlY3Rvci0+c2l6ZSgpIC0gMSk7Ci0gICAgICAgIGFsbG9jX3N0cnVjdCBhbGxvYyA9IGFsbG9jX3ZlY3Rvci0+YXQoaW5kZXgpOwotICAgICAgICB2b2lkKiByZWFsX3B0ciA9Ci0gICAgICAgICAgICBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2ZyZWUoYWxsb2MuYWxsb2NfaWQsIGFsbG9jLnB0cik7Ci0gICAgICAgIGlmIChyZWFsX3B0cikgewotICAgICAgICAgIGZyZWUocmVhbF9wdHIpOwotICAgICAgICB9Ci0gICAgICAgIGFsbG9jX3ZlY3Rvci0+ZXJhc2UoYWxsb2NfdmVjdG9yLT5iZWdpbigpICsgaW5kZXgpOwotICAgICAgfQotICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDU6IHsKLSAgICAgIHNpemVfdCBzaXplID0KLSAgICAgICAgICBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfQlVGX1NJWkUpOwotICAgICAgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2l6ZV9mb3JfY2FuYXJ5KHNpemUpOwotICAgIH0KLSAgICAgIHJldHVybjsKLSAgICAvLyBSZXNldAotICAgIC8vIE5PVEU6IFNob3VsZCB0aGlzIGJlIGV4ZW1wdGVkIGZyb20gZnV6emluZz8gSGVhZGVyIHNheXMgdG8gbm90IGNhbGwgdGhpcywKLSAgICAvLyAgICAgICBidXQgaXQncyBzdGlsbCBleHBvc2VkLiBJdCBhbHNvIGRvZXNuJ3QgcGVyZm9ybSBhIGZ1bGwgcmVzZXQuCi0gICAgY2FzZSA2OgotICAgICAgLy8gSGF2ZSB0byBhY3R1YWxseSBmcmVlIHRoZSBtZW0gZmlyc3QgYXMgcmVzZXQgZG9lc24ndCBkbyBpdAotICAgICAgZnJlZUFsbG9jYXRpb25WZWN0b3IoYWxsb2NfdmVjdG9yKTsKLSAgICAgIGFsbG9jYXRpb25fdHJhY2tlcl9yZXNldCgpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBEYXRhLCBzaXplX3QgU2l6ZSkgewotICAvLyBJbml0IG91ciB3cmFwcGVyCi0gIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoRGF0YSwgU2l6ZSk7Ci0KLSAgLy8gS2VlcCBhIHZlY3RvciBvZiBvdXIgYWxsb2NhdGVkIHBvaW50ZXJzCi0gIHN0ZDo6dmVjdG9yPGFsbG9jX3N0cnVjdD4gYWxsb2NfdmVjdG9yOwotCi0gIC8vIEhvdyBtYW55IGZ1bmN0aW9ucyBhcmUgd2UgZ29pbmcgdG8gY2FsbD8KLSAgc2l6ZV90IG51bV9mdW5jdGlvbnMgPQotICAgICAgZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfTlVNX0ZVTkNUSU9OUyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Z1bmN0aW9uczsgaSsrKSB7Ci0gICAgY2FsbEFyYml0cmFyeUZ1bmN0aW9uKCZhbGxvY192ZWN0b3IsICZkYXRhUHJvdmlkZXIpOwotICB9Ci0KLSAgLy8gRnJlZSBhbnl0aGluZyB3ZSd2ZSBhbGxvY2F0ZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBmdXp6ZXIgbG9vcAotICBmcmVlQWxsb2NhdGlvblZlY3RvcigmYWxsb2NfdmVjdG9yKTsKLQotICAvLyBSZXNldCBvdXIgdHJhY2tlciBmb3IgdGhlIG5leHQgcnVuCi0gIGFsbG9jYXRpb25fdHJhY2tlcl9yZXNldCgpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvYWxsb2NhdG9yL0FuZHJvaWQuYnAgYi9vc2kvdGVzdC9mdXp6ZXJzL2FsbG9jYXRvci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhkNjE1Li4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L2Z1enplcnMvYWxsb2NhdG9yL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAibGlib3NpX2Z1enpfYWxsb2NhdG9yIiwKLSAgICBkZWZhdWx0czogWyJsaWJvc2lfZnV6el9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZ1enpfYWxsb2NhdG9yLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9hbGxvY2F0b3IvZnV6el9hbGxvY2F0b3IuY2MgYi9vc2kvdGVzdC9mdXp6ZXJzL2FsbG9jYXRvci9mdXp6X2FsbG9jYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZDk5YS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2FsbG9jYXRvci9mdXp6X2FsbG9jYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS90ZXN0L2Z1enplcnMvaW5jbHVkZS9saWJvc2lGdXp6SGVscGVyRnVuY3Rpb25zLmgiCi0KLSNkZWZpbmUgTUFYX05VTV9GVU5DVElPTlMgNTEyCi0jZGVmaW5lIE1BWF9CVUZfU0laRSAyNTYKLQotdm9pZCBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oc3RkOjp2ZWN0b3I8dm9pZCo+KiBhbGxvY192ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlcikgewotICAvLyBHZXQgb3VyIGZ1bmN0aW9uIGlkZW50aWZpZXIKLSAgY2hhciBmdW5jX2lkID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGNoYXI+KDAsIDYpOwotCi0gIHN3aXRjaCAoZnVuY19pZCkgewotICAgIC8vIExldCAwIGJlIGEgTk8tT1AsIGFzIENvbnN1bWVJbnRlZ3JhbCB3aWxsIHJldHVybiAwIG9uIGFuIGVtcHR5IGJ1ZmZlcgotICAgIC8vIChUaGlzIHdpbGwgbGlrZWx5IGJpYXMgd2hhdGV2ZXIgYWN0aW9uIGlzIGhlcmUgdG8gcnVuIG1vcmUgb2Z0ZW4pCi0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuOwotICAgIC8vIExldCBjYXNlIDEgYmUgb3NpX21hbGxvYywgYW5kIDIgYmUgb3NpX2NhbGxvYwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6IHsKLSAgICAgIHNpemVfdCBzaXplID0KLSAgICAgICAgICBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfQlVGX1NJWkUpOwotICAgICAgdm9pZCogcHRyID0gbnVsbHB0cjsKLSAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGZ1bmNfaWQgPT0gMSkgewotICAgICAgICBwdHIgPSBvc2lfbWFsbG9jKHNpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHRyID0gb3NpX2NhbGxvYyhzaXplKTsKLSAgICAgIH0KLSAgICAgIGlmIChwdHIpIHsKLSAgICAgICAgYWxsb2NfdmVjdG9yLT5wdXNoX2JhY2socHRyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgLy8gTGV0IGNhc2UgMyBiZSBvc2lfZnJlZSwgYW5kIDQgYmUgb3NpX2ZyZWVfYW5kX3Jlc2V0Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNDogewotICAgICAgaWYgKGFsbG9jX3ZlY3Rvci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc2l6ZV90IGluZGV4ID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCi0gICAgICAgICAgMCwgYWxsb2NfdmVjdG9yLT5zaXplKCkgLSAxKTsKLSAgICAgIHZvaWQqIHB0ciA9IGFsbG9jX3ZlY3Rvci0+YXQoaW5kZXgpOwotICAgICAgaWYgKHB0cikgewotICAgICAgICBpZiAoZnVuY19pZCA9PSAzKSB7Ci0gICAgICAgICAgb3NpX2ZyZWUocHRyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoJnB0cik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGFsbG9jX3ZlY3Rvci0+ZXJhc2UoYWxsb2NfdmVjdG9yLT5iZWdpbigpICsgaW5kZXgpOwotICAgIH0KLSAgICAgIHJldHVybjsKLSAgICAvLyBMZXQgY2FzZSA1IGJlIG9zaV9zdHJkdXAsIGFuZCA2IGJlIG9zaV9zdHJkdXAKLSAgICBjYXNlIDU6Ci0gICAgY2FzZSA2OiB7Ci0gICAgICAvLyBNYWtlIGEgc3JjIGJ1ZmZlcgotICAgICAgY2hhciogYnVmID0gZ2VuZXJhdGVCdWZmZXIoZGF0YVByb3ZpZGVyLCBNQVhfQlVGX1NJWkUsIHRydWUpOwotICAgICAgY2hhciogc3RyID0gbnVsbHB0cjsKLSAgICAgIGlmIChidWYgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoZnVuY19pZCA9PSA1KSB7Ci0gICAgICAgIHN0ciA9IG9zaV9zdHJkdXAoYnVmKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemVfdCBzaXplID0KLSAgICAgICAgICAgIGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDEsIE1BWF9CVUZfU0laRSk7Ci0gICAgICAgIHN0ciA9IG9zaV9zdHJuZHVwKGJ1Ziwgc2l6ZSk7Ci0gICAgICB9Ci0gICAgICBmcmVlKGJ1Zik7Ci0gICAgICBpZiAoc3RyKSB7Ci0gICAgICAgIGFsbG9jX3ZlY3Rvci0+cHVzaF9iYWNrKHN0cik7Ci0gICAgICB9Ci0gICAgfQotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBEYXRhLCBzaXplX3QgU2l6ZSkgewotICAvLyBJbml0IG91ciB3cmFwcGVyCi0gIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoRGF0YSwgU2l6ZSk7Ci0KLSAgLy8gS2VlcCBhIHZlY3RvciBvZiBvdXIgYWxsb2NhdGVkIG9iamVjdHMgZm9yIGZyZWVpbmcgbGF0ZXIKLSAgc3RkOjp2ZWN0b3I8dm9pZCo+IGFsbG9jX3ZlY3RvcjsKLSAgLy8gQ2FsbCBzb21lIGZ1bmN0aW9ucywgY3JlYXRlIHNvbWUgYnVmZmVycwotICBzaXplX3QgbnVtX2Z1bmN0aW9ucyA9Ci0gICAgICBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9OVU1fRlVOQ1RJT05TKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZnVuY3Rpb25zOyBpKyspIHsKLSAgICBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oJmFsbG9jX3ZlY3RvciwgJmRhdGFQcm92aWRlcik7Ci0gIH0KLSAgLy8gRnJlZSBhbnl0aGluZyB3ZSd2ZSBhbGxvY2F0ZWQKLSAgZm9yIChjb25zdCBhdXRvJiBhbGxvYyA6IGFsbG9jX3ZlY3RvcikgewotICAgIGlmIChhbGxvYyAhPSBudWxscHRyKSB7Ci0gICAgICBvc2lfZnJlZShhbGxvYyk7Ci0gICAgfQotICB9Ci0gIGFsbG9jX3ZlY3Rvci5jbGVhcigpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvYXJyYXkvQW5kcm9pZC5icCBiL29zaS90ZXN0L2Z1enplcnMvYXJyYXkvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzYTNhZi4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2FycmF5L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAibGlib3NpX2Z1enpfYXJyYXkiLAotICAgIGRlZmF1bHRzOiBbImxpYm9zaV9mdXp6X2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el9hcnJheS5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2FycmF5L2Z1enpfYXJyYXkuY2MgYi9vc2kvdGVzdC9mdXp6ZXJzL2FycmF5L2Z1enpfYXJyYXkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYWJmOTUuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9hcnJheS9mdXp6X2FycmF5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hcnJheS5oIgotCi0vLyBDYXBwaW5nIHRoZSBlbGVtZW50IHNpemUgYXQgc2l6ZW9mKHVpbnQzMl90KSsxCi0vLyBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgdGhlcmUncyBhIGJ1ZmZlciBvdmVycmVhZAotI2RlZmluZSBNQVhfRUxFTUVOVF9TSVpFIHNpemVvZih1aW50MzJfdCkKLSNkZWZpbmUgTUFYX0FSUkFZX0xFTiAxMDI0Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIEF0dGVtcHQgdG8gaW5pdCBhbiBhcnJheQotICBzaXplX3QgZWxlbWVudF9zaXplID0KLSAgICAgIGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMSwgTUFYX0VMRU1FTlRfU0laRSk7Ci0gIGFycmF5X3QqIGFyciA9IGFycmF5X25ldyhlbGVtZW50X3NpemUpOwotCi0gIC8vIEZ1bmN0aW9ucyBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBub24tbnVsbCBhcnJheV90LCBhY2NvcmRpbmcgdG8gdGhlIC5oCi0gIGlmIChhcnIgIT0gbnVsbHB0cikgewotICAgIC8vIEhvdyBsYXJnZSBkbyB3ZSB3YW50IG91ciBhcnJheT8KLSAgICBzaXplX3QgYXJyX2xlbiA9Ci0gICAgICAgIGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX0FSUkFZX0xFTik7Ci0gICAgaWYgKGFycl9sZW4gPiAwKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycl9sZW47IGkrKykgewotICAgICAgICB1aW50MzJfdCBuZXdfdmFsID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKLSAgICAgICAgLy8gYXBwZW5kX3ZhbHVlKCkganVzdCBkZXJlZnMgYW5kIGNhbGxzIGFwcGVuZF9wdHIoKSwKLSAgICAgICAgLy8gc28gbm8gbmVlZCB0byBmdXp6IHNlcGFyYXRlbHkKLSAgICAgICAgYXJyYXlfYXBwZW5kX3ZhbHVlKGFyciwgbmV3X3ZhbCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFB1bGwgdGhlIHB0ciB0byBhbiBlbGVtZW50IGluIHRoZSBhcnJheQotICAgICAgc2l6ZV90IGdldF9pbmRleCA9Ci0gICAgICAgICAgZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBhcnJheV9sZW5ndGgoYXJyKSAtIDEpOwotICAgICAgYXJyYXlfYXQoYXJyLCBnZXRfaW5kZXgpOwotCi0gICAgICAvLyBHcmFiIHRoZSBhcnJheSBwb2ludGVyCi0gICAgICBhcnJheV9wdHIoYXJyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBGcmVlIHRoZSBhcnJheSAodGhpcyBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgbnVsbHB0cikKLSAgYXJyYXlfZnJlZShhcnIpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9idWZmZXIvQW5kcm9pZC5icCBiL29zaS90ZXN0L2Z1enplcnMvYnVmZmVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGIwN2EuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9idWZmZXIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJsaWJvc2lfZnV6el9idWZmZXIiLAotICAgIGRlZmF1bHRzOiBbImxpYm9zaV9mdXp6X2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el9idWZmZXIuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9idWZmZXIvZnV6el9idWZmZXIuY2MgYi9vc2kvdGVzdC9mdXp6ZXJzL2J1ZmZlci9mdXp6X2J1ZmZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4MWEzMS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2J1ZmZlci9mdXp6X2J1ZmZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYnVmZmVyLmgiCi0KLSNkZWZpbmUgTUFYX0JVRkZFUl9TSVpFIDQwOTYKLSNkZWZpbmUgTUFYX05VTV9TTElDRVMgMTAwCi0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIENyZWF0ZSBvdXIgYnVmZmVyCi0gIHNpemVfdCBidWZfc2l6ZSA9Ci0gICAgICBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDEsIE1BWF9CVUZGRVJfU0laRSk7Ci0gIGJ1ZmZlcl90KiBidWYgPSBidWZmZXJfbmV3KGJ1Zl9zaXplKTsKLQotICAvLyBUaGVzZSBmdW5jdGlvbnMgcmVxdWlyZSBhIG5vbi1udWxsIGJ1ZmZlciwgYWNjb3JkaW5nIHRvIHRoZSBoZWFkZXIKLSAgLy8gVGhlIHNpemUgYWxzbyBuZWVkcyB0byBiZSBvdmVyIDEgdG8gbWFrZSBzbGljZXMKLSAgaWYgKGJ1ZiAhPSBudWxscHRyICYmIGJ1Zl9zaXplID4gMSkgewotICAgIHN0ZDo6dmVjdG9yPGJ1ZmZlcl90Kj4gc2xpY2VzOwotCi0gICAgLy8gTWFrZSBhIGJ1bmNoIG9mIHJlZnMgdG8gdmFyaW91cyBzbGljZXMgb2YgdGhlIGJ1ZmZlcgotICAgIHNpemVfdCBudW1fc2xpY2VzID0KLSAgICAgICAgZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfTlVNX1NMSUNFUyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fc2xpY2VzOyBpKyspIHsKLSAgICAgIC8vIElmIHNsaWNlX3NpemUgaXMgemVybyBvciBHVCBidWZfc2l6ZSwgbGliIHRocm93cyBhbiBleGNlcHRpb24KLSAgICAgIHNpemVfdCBzbGljZV9zaXplID0KLSAgICAgICAgICBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDEsIGJ1Zl9zaXplIC0gMSk7Ci0gICAgICBpZiAoc2xpY2Vfc2l6ZSA+IDApIHsKLSAgICAgICAgYnVmZmVyX3QqIG5ld19zbGljZSA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChzbGljZV9zaXplID09IGJ1Zl9zaXplKSB7Ci0gICAgICAgICAgbmV3X3NsaWNlID0gYnVmZmVyX25ld19yZWYoYnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuZXdfc2xpY2UgPSBidWZmZXJfbmV3X3NsaWNlKGJ1Ziwgc2xpY2Vfc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIHNsaWNlIHRvIG91ciB2ZWN0b3Igc28gd2UgY2FuIGZyZWUgaXQgbGF0ZXIKLSAgICAgICAgc2xpY2VzLnB1c2hfYmFjayhuZXdfc2xpY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHJpZXZlIHRoZSBidWZmZXIgcHRyCi0gICAgYnVmZmVyX3B0cihidWYpOwotCi0gICAgLy8gRnJlZSB0aGUgc2xpY2VzCi0gICAgZm9yIChjb25zdCBhdXRvJiBzbGljZSA6IHNsaWNlcykgewotICAgICAgYnVmZmVyX2ZyZWUoc2xpY2UpOwotICAgIH0KLSAgfQotCi0gIC8vIEZyZWUgdGhlIHJvb3QgYnVmZmVyCi0gIGJ1ZmZlcl9mcmVlKGJ1Zik7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2NvbXBhdC9BbmRyb2lkLmJwIGIvb3NpL3Rlc3QvZnV6emVycy9jb21wYXQvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlOGIyYi4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2NvbXBhdC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYm9zaV9mdXp6X2NvbXBhdCIsCi0gICAgZGVmYXVsdHM6IFsibGlib3NpX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6X2NvbXBhdC5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9jb21wYXQvZnV6el9jb21wYXQuY2MgYi9vc2kvdGVzdC9mdXp6ZXJzL2NvbXBhdC9mdXp6X2NvbXBhdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlZWFlYi4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2NvbXBhdC9mdXp6X2NvbXBhdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotCi0jZGVmaW5lIE1BWF9CVUZGRVJfU0laRSA0MDk2Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLS8vIE91ciBmdW5jdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCB3aXRoIF9fR0xJQkNfXwotI2lmIF9fR0xJQkNfXwotICAvLyBJbml0IG91ciB3cmFwcGVyCi0gIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoRGF0YSwgU2l6ZSk7Ci0KLSAgc2l6ZV90IGJ1Zl9zaXplID0KLSAgICAgIGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX0JVRkZFUl9TSVpFKTsKLSAgaWYgKGJ1Zl9zaXplID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFNldCB1cCBvdXIgYnVmZmVycwotICAvLyBOT1RFOiBJZiB0aGUgc3JjIGJ1ZmZlciBpcyBub3QgTlVMTC10ZXJtaW5hdGVkLCB0aGUgc3RybGNweSB3aWxsCi0gIC8vICAgICAgIG92ZXJyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbiBhcmcuIEZvcmNlIG51bGwtdGVybSBmb3Igbm93LgotICBzdGQ6OnZlY3RvcjxjaGFyPiBieXRlcyA9Ci0gICAgICBkYXRhUHJvdmlkZXIuQ29uc3VtZUJ5dGVzV2l0aFRlcm1pbmF0b3I8Y2hhcj4oYnVmX3NpemUsICdcMCcpOwotICBpZiAoYnl0ZXMuZW1wdHkoKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGJ1Zl9zaXplID0gYnl0ZXMuc2l6ZSgpOwotICB2b2lkKiBkc3RfYnVmID0gbWFsbG9jKGJ1Zl9zaXplKTsKLSAgaWYgKGRzdF9idWYgPT0gbnVsbHB0cikgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQ2FsbCB0aGUgZ2V0SWQgZm4ganVzdCB0byBlbnN1cmUgdGhpbmdzIGRvbid0IGNyYXNoCi0gIGdldHRpZCgpOwotCi0gIC8vIENvcHksIHRoZW4gY29uY2F0Ci0gIHNpemVfdCBsZW5fdG9fY3B5ID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBidWZfc2l6ZSk7Ci0gIHN0cmxjcHkocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHN0X2J1ZiksCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnl0ZXMuZGF0YSgpKSwgbGVuX3RvX2NweSk7Ci0gIHN0cmxjYXQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHN0X2J1ZiksCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnl0ZXMuZGF0YSgpKSwgbGVuX3RvX2NweSk7Ci0KLSAgLy8gQ2xlYXIgb3V0IG91ciBkZXN0IGJ1ZmZlcgotICBmcmVlKGRzdF9idWYpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2ZpeGVkX3F1ZXVlL0FuZHJvaWQuYnAgYi9vc2kvdGVzdC9mdXp6ZXJzL2ZpeGVkX3F1ZXVlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzE1NTIuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9maXhlZF9xdWV1ZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYm9zaV9mdXp6X2ZpeGVkX3F1ZXVlIiwKLSAgICBkZWZhdWx0czogWyJsaWJvc2lfZnV6el9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZ1enpfZml4ZWRfcXVldWUuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvZml4ZWRfcXVldWUvZnV6el9maXhlZF9xdWV1ZS5jYyBiL29zaS90ZXN0L2Z1enplcnMvZml4ZWRfcXVldWUvZnV6el9maXhlZF9xdWV1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhNDI2YS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2ZpeGVkX3F1ZXVlL2Z1enpfZml4ZWRfcXVldWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLSNpbmNsdWRlICJvc2kvdGVzdC9mdXp6ZXJzL2luY2x1ZGUvbGlib3NpRnV6ekhlbHBlckZ1bmN0aW9ucy5oIgotCi0jZGVmaW5lIE1BWF9TVEFSVF9TSVpFIDIwNDgKLSNkZWZpbmUgTUFYX05VTV9GVU5DVElPTlMgNTEyCi0jZGVmaW5lIE1BWF9CVUZfU0laRSA1MTIKLQotc3RhdGljIGZ1dHVyZV90KiByZWNlaXZlZF9tZXNzYWdlX2Z1dHVyZSA9IG51bGxwdHI7Ci0KLS8vIEVtcHR5IGNhbGxiYWNrIGZ1bmN0aW9uCi12b2lkIGZxRnJlZUNiKHZvaWQqIGRhdGEpIHt9Ci12b2lkIGZxQ2IoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsKLSAgdm9pZCogbXNnID0gZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUocXVldWUpOwotICBmdXR1cmVfcmVhZHkocmVjZWl2ZWRfbWVzc2FnZV9mdXR1cmUsIG1zZyk7Ci19Ci0KLS8vIFJldHVybnMgZWl0aGVyIGEgbnVsbHB0ciBvciBhIGZ1bmN0aW9uIHB0ciB0byB0aGUgcGxhY2Vob2xkZXIgY2IgZnVuY3Rpb24KLWZpeGVkX3F1ZXVlX2ZyZWVfY2IgY2JPck51bGwoRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhUHJvdmlkZXIpIHsKLSAgYm9vbCBudWxsX2NiID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOwotICBpZiAobnVsbF9jYikgewotICAgIHJldHVybiBudWxscHRyOwotICB9IGVsc2UgewotICAgIHJldHVybiBmcUZyZWVDYjsKLSAgfQotfQotCi1ib29sIGZkSXNBdmFpbGFibGUoaW50IGZkKSB7Ci0gIGludCBuZmRzID0gMTsKLSAgZmRfc2V0IHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHM7Ci0gIHRpbWV2YWwgdGltZW91dDsKLQotICBGRF9aRVJPKCZyZWFkZmRzKTsKLSAgRkRfWkVSTygmd3JpdGVmZHMpOwotICBGRF9aRVJPKCZleGNlcHRmZHMpOwotICBGRF9TRVQoZmQsICZyZWFkZmRzKTsKLSAgdGltZW91dC50dl9zZWMgPSAwOwotICB0aW1lb3V0LnR2X3VzZWMgPSA1MDsKLQotICByZXR1cm4gc2VsZWN0KG5mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsICZ0aW1lb3V0KSA+IDA7Ci19Ci0KLXZvaWQgY3JlYXRlTmV3RnV0dXJlKCkgewotICAvLyBGcmVlIHRoZSBleGlzdGluZyBmdXR1cmUgaWYgaXQgZXhpc3RzCi0gIGlmIChyZWNlaXZlZF9tZXNzYWdlX2Z1dHVyZSAhPSBudWxscHRyKSB7Ci0gICAgZnV0dXJlX3JlYWR5KHJlY2VpdmVkX21lc3NhZ2VfZnV0dXJlLCBudWxscHRyKTsKLSAgICBmdXR1cmVfYXdhaXQocmVjZWl2ZWRfbWVzc2FnZV9mdXR1cmUpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgbmV3IG9uZQotICByZWNlaXZlZF9tZXNzYWdlX2Z1dHVyZSA9IGZ1dHVyZV9uZXcoKTsKLX0KLQotdm9pZCBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oZml4ZWRfcXVldWVfdCogZml4ZWRfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx2b2lkKj4qIGxpdmVfYnVmZmVyX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHRocmVhZF90Kj4qIGxpdmVfdGhyZWFkX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1enplZERhdGFQcm92aWRlciogZGF0YVByb3ZpZGVyKSB7Ci0gIHZvaWQqIGJ1Zl9wdHIgPSBudWxscHRyOwotICBzaXplX3QgaW5kZXggPSAwOwotICBpbnQgZmQgPSAwOwotICAvLyBHZXQgb3VyIGZ1bmN0aW9uIGlkZW50aWZpZXIKLSAgc3dpdGNoIChkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8Y2hhcj4oMCwgMTcpKSB7Ci0gICAgLy8gTGV0IDAgYmUgYSBOTy1PUCwgYXMgQ29uc3VtZUludGVncmFsIHdpbGwgcmV0dXJuIDAgb24gYW4gZW1wdHkgYnVmZmVyCi0gICAgLy8gKFRoaXMgd2lsbCBsaWtlbHkgYmlhcyB3aGF0ZXZlciBhY3Rpb24gaXMgaGVyZSB0byBydW4gbW9yZSBvZnRlbikKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm47Ci0gICAgLy8gQ2xlYXIgdGhlIHF1ZXVlCi0gICAgY2FzZSAxOgotICAgICAgZml4ZWRfcXVldWVfZmx1c2goZml4ZWRfcXVldWUsIGNiT3JOdWxsKGRhdGFQcm92aWRlcikpOwotICAgICAgcmV0dXJuOwotICAgIC8vIENoZWNrIGlmIGVtcHR5Ci0gICAgY2FzZSAyOgotICAgICAgZml4ZWRfcXVldWVfaXNfZW1wdHkoZml4ZWRfcXVldWUpOwotICAgICAgcmV0dXJuOwotICAgIC8vIENoZWNrIGxlbmd0aAotICAgIGNhc2UgMzoKLSAgICAgIGZpeGVkX3F1ZXVlX2xlbmd0aChmaXhlZF9xdWV1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgLy8gQ2hlY2sgY2FwYWNpdHkgKENhbm5vdCBiZSBudWxsKQotICAgIGNhc2UgNDoKLSAgICAgIGlmIChmaXhlZF9xdWV1ZSkgewotICAgICAgICBmaXhlZF9xdWV1ZV9jYXBhY2l0eShmaXhlZF9xdWV1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgLy8gQWRkIHRvIHRoZSBxdWV1ZSAoQ2Fubm90IGJlIG51bGwpCi0gICAgY2FzZSA1OgotICAgICAgaWYgKGZpeGVkX3F1ZXVlKSB7Ci0gICAgICAgIGJ1Zl9wdHIgPSBnZW5lcmF0ZUJ1ZmZlcihkYXRhUHJvdmlkZXIsIE1BWF9CVUZfU0laRSwgZmFsc2UpOwotICAgICAgICBsaXZlX2J1ZmZlcl92ZWN0b3ItPnB1c2hfYmFjayhidWZfcHRyKTsKLSAgICAgICAgaWYgKGJ1Zl9wdHIpIHsKLSAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugd29uJ3QgYmxvY2sKLSAgICAgICAgICBmZCA9IGZpeGVkX3F1ZXVlX2dldF9lbnF1ZXVlX2ZkKGZpeGVkX3F1ZXVlKTsKLSAgICAgICAgICBpZiAoZmRJc0F2YWlsYWJsZShmZCkpIHsKLSAgICAgICAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUoZml4ZWRfcXVldWUsIGJ1Zl9wdHIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgNjoKLSAgICAgIGlmIChmaXhlZF9xdWV1ZSkgewotICAgICAgICBidWZfcHRyID0gZ2VuZXJhdGVCdWZmZXIoZGF0YVByb3ZpZGVyLCBNQVhfQlVGX1NJWkUsIGZhbHNlKTsKLSAgICAgICAgbGl2ZV9idWZmZXJfdmVjdG9yLT5wdXNoX2JhY2soYnVmX3B0cik7Ci0gICAgICAgIGlmIChidWZfcHRyKSB7Ci0gICAgICAgICAgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUoZml4ZWRfcXVldWUsIGJ1Zl9wdHIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgLy8gUmVtb3ZlIGZyb20gdGhlIHF1ZXVlIChDYW5ub3QgYmUgbnVsbCkKLSAgICBjYXNlIDc6Ci0gICAgICBpZiAoZml4ZWRfcXVldWUgJiYgZml4ZWRfcXVldWVfbGVuZ3RoKGZpeGVkX3F1ZXVlKSA+IDApIHsKLSAgICAgICAgZml4ZWRfcXVldWVfZGVxdWV1ZShmaXhlZF9xdWV1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA4OgotICAgICAgaWYgKGZpeGVkX3F1ZXVlKSB7Ci0gICAgICAgIGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKGZpeGVkX3F1ZXVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICAvLyBQZWVrcwotICAgIGNhc2UgOToKLSAgICAgIGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0KGZpeGVkX3F1ZXVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDEwOgotICAgICAgZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChmaXhlZF9xdWV1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgLy8gVHJ5IHRvIHJlbW92ZSBleGlzdGluZyBzcGVjaWZpYyBlbGVtZW50Ci0gICAgY2FzZSAxMToKLSAgICAgIGlmIChsaXZlX2J1ZmZlcl92ZWN0b3ItPmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgLy8gR3JhYiBhbiBleGlzdGluZyBidWZmZXIKLSAgICAgIGluZGV4ID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCi0gICAgICAgICAgMCwgbGl2ZV9idWZmZXJfdmVjdG9yLT5zaXplKCkgLSAxKTsKLSAgICAgIGJ1Zl9wdHIgPSBsaXZlX2J1ZmZlcl92ZWN0b3ItPmF0KGluZGV4KTsKLSAgICAgIGlmIChidWZfcHRyICE9IG51bGxwdHIpIHsKLSAgICAgICAgZml4ZWRfcXVldWVfdHJ5X3JlbW92ZV9mcm9tX3F1ZXVlKGZpeGVkX3F1ZXVlLCBidWZfcHRyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICAvLyBUcnkgdG8gcmVtb3ZlIG5vbmV4aXN0YW50IGVsZW1lbnQKLSAgICBjYXNlIDEyOgotICAgICAgYnVmX3B0ciA9Ci0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkpOwotICAgICAgaWYgKGJ1Zl9wdHIgIT0gbnVsbHB0cikgewotICAgICAgICBmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUoZml4ZWRfcXVldWUsIGJ1Zl9wdHIpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIC8vIENvbnZlcnQgdGhlIHF1ZXVlIHRvIGEgbGlzdCAoQ2Fubm90IGJlIG51bGwpCi0gICAgY2FzZSAxMzoKLSAgICAgIGlmIChmaXhlZF9xdWV1ZSkgewotICAgICAgICBmaXhlZF9xdWV1ZV9nZXRfbGlzdChmaXhlZF9xdWV1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgLy8gQ2hlY2sgaWYgZW5xdWV1ZSBpcyBibG9ja2luZwotICAgIGNhc2UgMTQ6Ci0gICAgICBmaXhlZF9xdWV1ZV9nZXRfZW5xdWV1ZV9mZChmaXhlZF9xdWV1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgLy8gQ2hlY2sgaWYgZGVxdWV1ZSBpcyBibG9ja2luZwotICAgIGNhc2UgMTU6Ci0gICAgICBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZChmaXhlZF9xdWV1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgLy8gTk9URTogdGhyZWFkIGFwcGVhcnMgdG8gaGF2ZSBhIG1lbWxlYWssIGRpc2FibGluZyB0aGlzIGZvciBub3cuCi0gICAgY2FzZSAxNjoKLSAgICAgIC8vIGlmIChmaXhlZF9xdWV1ZSkgewotICAgICAgLy8gICBjcmVhdGVOZXdGdXR1cmUoKTsKLSAgICAgIC8vICAgLy8gU3RhcnQgdXAgYSB0aHJlYWQgYW5kIHJlZ2lzdGVyIHdpdGggaXQuCi0gICAgICAvLyAgIHRocmVhZF90KiB0bXBfdGhyZWFkID0gdGhyZWFkX25ldygKLSAgICAgIC8vICAgICAgIGRhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOwotICAgICAgLy8gICBpZiAodG1wX3RocmVhZCA9PSBudWxscHRyKSB7Ci0gICAgICAvLyAgICAgcmV0dXJuOwotICAgICAgLy8gICB9Ci0gICAgICAvLyAgIGxpdmVfdGhyZWFkX3ZlY3Rvci0+cHVzaF9iYWNrKHRtcF90aHJlYWQpOwotICAgICAgLy8gICByZWFjdG9yX3QqIHJlYWN0b3IgPSB0aHJlYWRfZ2V0X3JlYWN0b3IodG1wX3RocmVhZCk7Ci0gICAgICAvLyAgIGlmIChyZWFjdG9yID09IG51bGxwdHIpIHsKLSAgICAgIC8vICAgICByZXR1cm47Ci0gICAgICAvLyAgIH0KLSAgICAgIC8vICAgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZShmaXhlZF9xdWV1ZSwgcmVhY3RvciwgZnFDYiwgbnVsbHB0cik7Ci0gICAgICAvLyAgIGZpeGVkX3F1ZXVlX2VucXVldWUoZml4ZWRfcXVldWUsICh2b2lkKikidGVzdCIpOwotICAgICAgLy8gICBmdXR1cmVfYXdhaXQocmVjZWl2ZWRfbWVzc2FnZV9mdXR1cmUpOwotICAgICAgLy8gfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgMTc6Ci0gICAgICBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUoZml4ZWRfcXVldWUpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBEYXRhLCBzaXplX3QgU2l6ZSkgewotICAvLyBJbml0IG91ciB3cmFwcGVyCi0gIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoRGF0YSwgU2l6ZSk7Ci0KLSAgLy8gTWFrZSB2ZWN0b3JzIHRvIGtlZXAgdHJhY2sgb2Ygb2JqZWN0cyB3ZSBnZW5lcmF0ZSwgZm9yIGZyZWVpbmcKLSAgc3RkOjp2ZWN0b3I8dm9pZCo+IGxpdmVfYnVmZmVyX3ZlY3RvcjsKLSAgc3RkOjp2ZWN0b3I8dGhyZWFkX3QqPiBsaXZlX3RocmVhZF92ZWN0b3I7Ci0KLSAgc2l6ZV90IHN0YXJ0X2NhcGFjaXR5ID0KLSAgICAgIGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX1NUQVJUX1NJWkUpOwotICBmaXhlZF9xdWV1ZV90KiBmaXhlZF9xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhzdGFydF9jYXBhY2l0eSk7Ci0KLSAgLy8gSG93IG1hbnkgZnVuY3Rpb25zIGFyZSB3ZSBnb2luZyB0byBjYWxsPwotICBzaXplX3QgbnVtX2Z1bmN0aW9ucyA9Ci0gICAgICBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9OVU1fRlVOQ1RJT05TKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZnVuY3Rpb25zOyBpKyspIHsKLSAgICBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oZml4ZWRfcXVldWUsICZsaXZlX2J1ZmZlcl92ZWN0b3IsICZsaXZlX3RocmVhZF92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHJvdmlkZXIpOwotICB9Ci0KLSAgLy8gRnJlZSBvdXIgcXVldWUgKHdpdGggZWl0aGVyIGEgbnVsbCBvciBwbGFjZWhvbGRlciBjYWxsYmFjaykKLSAgZml4ZWRfcXVldWVfZnJlZShmaXhlZF9xdWV1ZSwgY2JPck51bGwoJmRhdGFQcm92aWRlcikpOwotCi0gIC8vIEZyZWUgYnVmZmVycyB3ZSd2ZSBjcmVhdGVkIHRocm91Z2ggZm4gY2FsbHMgZHVyaW5nIHRoaXMgZnV6emVyIGxvb3AuCi0gIGZvciAoY29uc3QgYXV0byYgYnVmZmVyIDogbGl2ZV9idWZmZXJfdmVjdG9yKSB7Ci0gICAgZnJlZShidWZmZXIpOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgdGhyZWFkIDogbGl2ZV90aHJlYWRfdmVjdG9yKSB7Ci0gICAgdGhyZWFkX2ZyZWUodGhyZWFkKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9mdXR1cmUvQW5kcm9pZC5icCBiL29zaS90ZXN0L2Z1enplcnMvZnV0dXJlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYWMzNGUuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9mdXR1cmUvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJsaWJvc2lfZnV6el9mdXR1cmUiLAotICAgIGRlZmF1bHRzOiBbImxpYm9zaV9mdXp6X2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el9mdXR1cmUuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvZnV0dXJlL2Z1enpfZnV0dXJlLmNjIGIvb3NpL3Rlc3QvZnV6emVycy9mdXR1cmUvZnV6el9mdXR1cmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjNlN2QuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9mdXR1cmUvZnV6el9mdXR1cmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2Z1dHVyZS5oIgotCi0jZGVmaW5lIE1BWF9CVUZGRVJfU0laRSA4Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIFRoZSB2YWx1ZSBvZiB0aGlzIHJlc3VsdCBwdHIgc2hvdWxkbid0IG1hdHRlciwgYnV0IG1ha2UgYSBidWZmZXIgdG8gYmUgc2FmZQotICBzaXplX3QgYnVmX3NpemUgPQotICAgICAgZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigxLCBNQVhfQlVGRkVSX1NJWkUpOwotICB2b2lkKiBidWYgPSBtYWxsb2MoYnVmX3NpemUpOwotICBpZiAoYnVmID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcyA9IGRhdGFQcm92aWRlci5Db25zdW1lQnl0ZXM8dWludDhfdD4oYnVmX3NpemUpOwotICBtZW1jcHkoYnVmLCBieXRlcy5kYXRhKCksIGJ5dGVzLnNpemUoKSk7Ci0KLSAgLy8gSXMgb3VyIGZ1dHVyZSBhbiBpbW1lZGlhdGU/Ci0gIGZ1dHVyZV90KiBmdXR1cmUgPSBudWxscHRyOwotICBib29sIGlzX2ltbWVkaWF0ZSA9IGRhdGFQcm92aWRlci5Db25zdW1lQm9vbCgpOwotICBpZiAoaXNfaW1tZWRpYXRlKSB7Ci0gICAgZnV0dXJlID0gZnV0dXJlX25ld19pbW1lZGlhdGUoYnVmKTsKLSAgfSBlbHNlIHsKLSAgICBmdXR1cmUgPSBmdXR1cmVfbmV3KCk7Ci0gIH0KLQotICAvLyBUaGVzZSBmdW5jdGlvbnMgcmVxdWlyZSBhIG5vbi1udWxsIG9iamVjdCwgYWNjb3JkaW5nIHRvIHRoZSBoZWFkZXIKLSAgaWYgKGZ1dHVyZSAhPSBudWxscHRyKSB7Ci0gICAgLy8gSWYgd2UgbmVlZCB0bywgc3BlY2lmeSB0aGF0IHRoZSBmdXR1cmUgaXMgcmVhZHkKLSAgICBpZiAoIWlzX2ltbWVkaWF0ZSkgewotICAgICAgZnV0dXJlX3JlYWR5KGZ1dHVyZSwgYnVmKTsKLSAgICB9Ci0KLSAgICAvLyBGcmVlIHRoZSBvYmplY3QKLSAgICBmdXR1cmVfYXdhaXQoZnV0dXJlKTsKLSAgfQotCi0gIGZyZWUoYnVmKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2luY2x1ZGUvbGlib3NpRnV6ekhlbHBlckZ1bmN0aW9ucy5oIGIvb3NpL3Rlc3QvZnV6emVycy9pbmNsdWRlL2xpYm9zaUZ1enpIZWxwZXJGdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1Yjg1ZS4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2luY2x1ZGUvbGlib3NpRnV6ekhlbHBlckZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBMSUJPU0lfRlVaWl9IRUxQRVJTX0hfCi0jZGVmaW5lIExJQk9TSV9GVVpaX0hFTFBFUlNfSF8KLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLWNoYXIqIGdlbmVyYXRlQnVmZmVyKEZ1enplZERhdGFQcm92aWRlciogZGF0YVByb3ZpZGVyLCBzaXplX3QgbWF4X2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBudWxsX3Rlcm1pbmF0ZSkgewotICAvLyBHZXQgb3VyIGJ1ZmZlciBzaXplCi0gIHNpemVfdCBidWZfc2l6ZSA9Ci0gICAgICBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBtYXhfYnVmZmVyX3NpemUpOwotICBpZiAoYnVmX3NpemUgPT0gMCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgYW5kIGNvcHkgaW4gZGF0YQotICBjaGFyKiBidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihtYWxsb2MoYnVmX3NpemUpKTsKLSAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnl0ZXMgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVCeXRlczxjaGFyPihidWZfc2l6ZSk7Ci0gIG1lbWNweShidWYsIGJ5dGVzLmRhdGEoKSwgYnl0ZXMuc2l6ZSgpKTsKLQotICBpZiAobnVsbF90ZXJtaW5hdGUpIHsKLSAgICAvLyBGb3JjZSBhIG51bGwtdGVybWluYXRpb24KLSAgICBidWZbYnVmX3NpemUgLSAxXSA9IDB4MDA7Ci0gIH0KLQotICByZXR1cm4gYnVmOwotfQotCi0jZW5kaWYgIC8vIExJQk9TSV9GVVpaX0hFTFBFUlNfSF8KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2Z1enplcnMvbGlzdC9BbmRyb2lkLmJwIGIvb3NpL3Rlc3QvZnV6emVycy9saXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDc1MzUuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9saXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAibGlib3NpX2Z1enpfbGlzdCIsCi0gICAgZGVmYXVsdHM6IFsibGlib3NpX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6X2xpc3QuY2MiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL2xpc3QvZnV6el9saXN0LmNjIGIvb3NpL3Rlc3QvZnV6emVycy9saXN0L2Z1enpfbGlzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4MTQ3NC4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9mdXp6ZXJzL2xpc3QvZnV6el9saXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbGlzdC5oIgotI2luY2x1ZGUgIm9zaS90ZXN0L2Z1enplcnMvaW5jbHVkZS9saWJvc2lGdXp6SGVscGVyRnVuY3Rpb25zLmgiCi0KLSNkZWZpbmUgTUFYX05VTV9GVU5DVElPTlMgNTEyCi0jZGVmaW5lIE1BWF9CVUZfU0laRSAyNTYKLQotc3RydWN0IGxpc3Rfbm9kZV90IHsKLSAgc3RydWN0IGxpc3Rfbm9kZV90KiBuZXh0OwotICB2b2lkKiBkYXRhOwotfTsKLQotdm9pZCBjYih2b2lkKiBkYXRhKSB7fQotLy8gUGFzcyBhIHB0ciB0byBGdXp6ZWREYXRhUHJvdmlkZXIgaW4gY29udGV4dAotYm9vbCBsaXN0X2l0ZXJfY2JfaW1wbCh2b2lkKiBkYXRhLCB2b2lkKiBjb250ZXh0KSB7Ci0gIEZ1enplZERhdGFQcm92aWRlciogZGF0YVByb3ZpZGVyID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RnV6emVkRGF0YVByb3ZpZGVyKj4oY29udGV4dCk7Ci0gIHJldHVybiBkYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7Ci19Ci0KLWxpc3RfdCogY3JlYXRlTGlzdChGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlcikgewotICBib29sIHNob3VsZF9jYWxsYmFjayA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKTsKLSAgaWYgKHNob3VsZF9jYWxsYmFjaykgewotICAgIHJldHVybiBsaXN0X25ldyhjYik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGxpc3RfbmV3KG51bGxwdHIpOwotICB9Ci19Ci0KLXZvaWQqIGdldEFyYml0cmFyeUVsZW1lbnQoc3RkOjp2ZWN0b3I8dm9pZCo+KiB2ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZ1enplZERhdGFQcm92aWRlciogZGF0YVByb3ZpZGVyKSB7Ci0gIGlmICh2ZWN0b3ItPnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgLy8gR2V0IGFuIGluZGV4Ci0gIHNpemVfdCBpbmRleCA9Ci0gICAgICBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCB2ZWN0b3ItPnNpemUoKSAtIDEpOwotICByZXR1cm4gdmVjdG9yLT5hdChpbmRleCk7Ci19Ci0KLWxpc3Rfbm9kZV90KiBnZXRBcmJpdHJhcnlOb2RlKGxpc3RfdCogbGlzdCwgRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhUHJvdmlkZXIpIHsKLSAgaWYgKGxpc3QgPT0gbnVsbHB0ciB8fCBsaXN0X2lzX2VtcHR5KGxpc3QpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgc2l6ZV90IGluZGV4ID0KLSAgICAgIGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGxpc3RfbGVuZ3RoKGxpc3QpIC0gMSk7Ci0gIGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihsaXN0KTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gIH0KLQotICByZXR1cm4gbm9kZTsKLX0KLQotdm9pZCBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oc3RkOjp2ZWN0b3I8dm9pZCo+KiBsaXN0X3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHZvaWQqPiogYWxsb2NfdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhUHJvdmlkZXIpIHsKLSAgbGlzdF90KiBsaXN0ID0gbnVsbHB0cjsKLSAgLy8gR2V0IG91ciBmdW5jdGlvbiBpZGVudGlmaWVyCi0gIHN3aXRjaCAoZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGNoYXI+KDAsIDE4KSkgewotICAgIC8vIExldCAwIGJlIGEgTk8tT1AsIGFzIENvbnN1bWVJbnRlZ3JhbCB3aWxsIHJldHVybiAwIG9uIGFuIGVtcHR5IGJ1ZmZlcgotICAgIC8vIChUaGlzIHdpbGwgbGlrZWx5IGJpYXMgd2hhdGV2ZXIgYWN0aW9uIGlzIGhlcmUgdG8gcnVuIG1vcmUgb2Z0ZW4pCi0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuOwotICAgIC8vIENyZWF0ZSBhIG5ldyBsaXN0Ci0gICAgY2FzZSAxOgotICAgICAgbGlzdCA9IGNyZWF0ZUxpc3QoZGF0YVByb3ZpZGVyKTsKLSAgICAgIGxpc3RfdmVjdG9yLT5wdXNoX2JhY2sobGlzdCk7Ci0gICAgICByZXR1cm47Ci0gICAgLy8gRnJlZSBhIGxpc3QKLSAgICBjYXNlIDI6IHsKLSAgICAgIHNpemVfdCBpbmRleCA9IDA7Ci0gICAgICBpZiAobGlzdF92ZWN0b3ItPnNpemUoKSA+IDApIHsKLSAgICAgICAgLy8gR2V0IGFuIGluZGV4Ci0gICAgICAgIGluZGV4ID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCi0gICAgICAgICAgICAwLCBsaXN0X3ZlY3Rvci0+c2l6ZSgpIC0gMSk7Ci0gICAgICAgIGxpc3QgPSByZWludGVycHJldF9jYXN0PGxpc3RfdCo+KGxpc3RfdmVjdG9yLT5hdChpbmRleCkpOwotICAgICAgfQotICAgICAgbGlzdF9mcmVlKGxpc3QpOwotICAgICAgLy8gT3RoZXJ3aXNlIGZyZWUgYSB2YWxpZCBsaXN0Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxpc3RfdmVjdG9yLT5lcmFzZShsaXN0X3ZlY3Rvci0+YmVnaW4oKSArIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSAzOgotICAgICAgbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bGlzdF90Kj4oCi0gICAgICAgICAgZ2V0QXJiaXRyYXJ5RWxlbWVudChsaXN0X3ZlY3RvciwgZGF0YVByb3ZpZGVyKSk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxpc3RfaXNfZW1wdHkobGlzdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA0OgotICAgICAgbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bGlzdF90Kj4oCi0gICAgICAgICAgZ2V0QXJiaXRyYXJ5RWxlbWVudChsaXN0X3ZlY3RvciwgZGF0YVByb3ZpZGVyKSk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyKSB7Ci0gICAgICAgIHZvaWQqIHNlYXJjaF9idWYgPSBnZXRBcmJpdHJhcnlFbGVtZW50KGFsbG9jX3ZlY3RvciwgZGF0YVByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlYXJjaF9idWYgIT0gbnVsbHB0cikgewotICAgICAgICAgIGxpc3RfY29udGFpbnMobGlzdCwgc2VhcmNoX2J1Zik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDU6Ci0gICAgICBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPigKLSAgICAgICAgICBnZXRBcmJpdHJhcnlFbGVtZW50KGxpc3RfdmVjdG9yLCBkYXRhUHJvdmlkZXIpKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9sZW5ndGgobGlzdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA2OgotICAgICAgbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bGlzdF90Kj4oCi0gICAgICAgICAgZ2V0QXJiaXRyYXJ5RWxlbWVudChsaXN0X3ZlY3RvciwgZGF0YVByb3ZpZGVyKSk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyICYmICFsaXN0X2lzX2VtcHR5KGxpc3QpKSB7Ci0gICAgICAgIGxpc3RfZnJvbnQobGlzdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA3OgotICAgICAgbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bGlzdF90Kj4oCi0gICAgICAgICAgZ2V0QXJiaXRyYXJ5RWxlbWVudChsaXN0X3ZlY3RvciwgZGF0YVByb3ZpZGVyKSk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyICYmICFsaXN0X2lzX2VtcHR5KGxpc3QpKSB7Ci0gICAgICAgIGxpc3RfYmFjayhsaXN0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDg6Ci0gICAgICBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPigKLSAgICAgICAgICBnZXRBcmJpdHJhcnlFbGVtZW50KGxpc3RfdmVjdG9yLCBkYXRhUHJvdmlkZXIpKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGxwdHIgJiYgIWxpc3RfaXNfZW1wdHkobGlzdCkpIHsKLSAgICAgICAgbGlzdF9iYWNrX25vZGUobGlzdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA5OiB7Ci0gICAgICBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPigKLSAgICAgICAgICBnZXRBcmJpdHJhcnlFbGVtZW50KGxpc3RfdmVjdG9yLCBkYXRhUHJvdmlkZXIpKTsKLSAgICAgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgdm9pZCogYnVmID0gZ2VuZXJhdGVCdWZmZXIoZGF0YVByb3ZpZGVyLCBNQVhfQlVGX1NJWkUsIGZhbHNlKTsKLSAgICAgIGFsbG9jX3ZlY3Rvci0+cHVzaF9iYWNrKGJ1Zik7Ci0gICAgICBsaXN0X25vZGVfdCogbm9kZSA9IGdldEFyYml0cmFyeU5vZGUobGlzdCwgZGF0YVByb3ZpZGVyKTsKLSAgICAgIGlmIChub2RlICE9IG51bGxwdHIgJiYgYnVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9pbnNlcnRfYWZ0ZXIobGlzdCwgbm9kZSwgYnVmKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSAxMDogewotICAgICAgbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bGlzdF90Kj4oCi0gICAgICAgICAgZ2V0QXJiaXRyYXJ5RWxlbWVudChsaXN0X3ZlY3RvciwgZGF0YVByb3ZpZGVyKSk7Ci0gICAgICB2b2lkKiBidWYgPSBnZW5lcmF0ZUJ1ZmZlcihkYXRhUHJvdmlkZXIsIE1BWF9CVUZfU0laRSwgZmFsc2UpOwotICAgICAgYWxsb2NfdmVjdG9yLT5wdXNoX2JhY2soYnVmKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGxwdHIgJiYgYnVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9wcmVwZW5kKGxpc3QsIGJ1Zik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgMTE6IHsKLSAgICAgIGxpc3QgPSByZWludGVycHJldF9jYXN0PGxpc3RfdCo+KAotICAgICAgICAgIGdldEFyYml0cmFyeUVsZW1lbnQobGlzdF92ZWN0b3IsIGRhdGFQcm92aWRlcikpOwotICAgICAgdm9pZCogYnVmID0gZ2VuZXJhdGVCdWZmZXIoZGF0YVByb3ZpZGVyLCBNQVhfQlVGX1NJWkUsIGZhbHNlKTsKLSAgICAgIGFsbG9jX3ZlY3Rvci0+cHVzaF9iYWNrKGJ1Zik7Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyICYmIGJ1ZiAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxpc3RfYXBwZW5kKGxpc3QsIGJ1Zik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgMTI6IHsKLSAgICAgIGxpc3QgPSByZWludGVycHJldF9jYXN0PGxpc3RfdCo+KAotICAgICAgICAgIGdldEFyYml0cmFyeUVsZW1lbnQobGlzdF92ZWN0b3IsIGRhdGFQcm92aWRlcikpOwotICAgICAgLy8gVGhlIGJ1ZmZlciB3aWxsIGJlIHZhbGlkLCBidXQgbWF5IGJlIGZvciBhIGRpZmZlcmVudCBsaXN0Ci0gICAgICB2b2lkKiBidWYgPSBnZXRBcmJpdHJhcnlFbGVtZW50KGFsbG9jX3ZlY3RvciwgZGF0YVByb3ZpZGVyKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGxwdHIgJiYgYnVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9yZW1vdmUobGlzdCwgYnVmKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSAxMzoKLSAgICAgIGxpc3QgPSByZWludGVycHJldF9jYXN0PGxpc3RfdCo+KAotICAgICAgICAgIGdldEFyYml0cmFyeUVsZW1lbnQobGlzdF92ZWN0b3IsIGRhdGFQcm92aWRlcikpOwotICAgICAgaWYgKGxpc3QgIT0gbnVsbHB0cikgewotICAgICAgICBsaXN0X2NsZWFyKGxpc3QpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgMTQ6Ci0gICAgICBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPigKLSAgICAgICAgICBnZXRBcmJpdHJhcnlFbGVtZW50KGxpc3RfdmVjdG9yLCBkYXRhUHJvdmlkZXIpKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9mb3JlYWNoKGxpc3QsIGxpc3RfaXRlcl9jYl9pbXBsLCBkYXRhUHJvdmlkZXIpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgMTU6Ci0gICAgICBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPigKLSAgICAgICAgICBnZXRBcmJpdHJhcnlFbGVtZW50KGxpc3RfdmVjdG9yLCBkYXRhUHJvdmlkZXIpKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9iZWdpbihsaXN0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDE2OgotICAgICAgbGlzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8bGlzdF90Kj4oCi0gICAgICAgICAgZ2V0QXJiaXRyYXJ5RWxlbWVudChsaXN0X3ZlY3RvciwgZGF0YVByb3ZpZGVyKSk7Ci0gICAgICBpZiAobGlzdCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxpc3RfZW5kKGxpc3QpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgMTc6IHsKLSAgICAgIGxpc3QgPSByZWludGVycHJldF9jYXN0PGxpc3RfdCo+KAotICAgICAgICAgIGdldEFyYml0cmFyeUVsZW1lbnQobGlzdF92ZWN0b3IsIGRhdGFQcm92aWRlcikpOwotICAgICAgaWYgKGxpc3QgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBsaXN0X25vZGVfdCogbm9kZSA9IGdldEFyYml0cmFyeU5vZGUobGlzdCwgZGF0YVByb3ZpZGVyKTsKLSAgICAgIGlmIChub2RlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbGlzdF9uZXh0KG5vZGUpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIDE4OiB7Ci0gICAgICBsaXN0ID0gcmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPigKLSAgICAgICAgICBnZXRBcmJpdHJhcnlFbGVtZW50KGxpc3RfdmVjdG9yLCBkYXRhUHJvdmlkZXIpKTsKLSAgICAgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbGlzdF9ub2RlX3QqIG5vZGUgPSBnZXRBcmJpdHJhcnlOb2RlKGxpc3QsIGRhdGFQcm92aWRlcik7Ci0gICAgICBpZiAobm9kZSAhPSBudWxscHRyICYmIG5vZGUgIT0gbGlzdF9lbmQobGlzdCkpIHsKLSAgICAgICAgbGlzdF9ub2RlKG5vZGUpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIEtlZXAgYSB2ZWN0b3Igb2Ygb3VyIGFsbG9jYXRlZCBvYmplY3RzIGZvciBmcmVlaW5nIGxhdGVyCi0gIHN0ZDo6dmVjdG9yPHZvaWQqPiBsaXN0X3ZlY3RvcjsKLSAgc3RkOjp2ZWN0b3I8dm9pZCo+IGFsbG9jX3ZlY3RvcjsKLQotICAvLyBDYWxsIHNvbWUgZnVuY3Rpb25zLCBjcmVhdGUgc29tZSBidWZmZXJzCi0gIHNpemVfdCBudW1fZnVuY3Rpb25zID0KLSAgICAgIGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX05VTV9GVU5DVElPTlMpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9mdW5jdGlvbnM7IGkrKykgewotICAgIGNhbGxBcmJpdHJhcnlGdW5jdGlvbigmbGlzdF92ZWN0b3IsICZhbGxvY192ZWN0b3IsICZkYXRhUHJvdmlkZXIpOwotICB9Ci0KLSAgLy8gRnJlZSBhbnl0aGluZyB3ZSd2ZSBhbGxvY2F0ZWQKLSAgZm9yIChjb25zdCBhdXRvJiBsaXN0IDogbGlzdF92ZWN0b3IpIHsKLSAgICBpZiAobGlzdCAhPSBudWxscHRyKSB7Ci0gICAgICBsaXN0X2ZyZWUocmVpbnRlcnByZXRfY2FzdDxsaXN0X3QqPihsaXN0KSk7Ci0gICAgfQotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgYWxsb2MgOiBhbGxvY192ZWN0b3IpIHsKLSAgICBpZiAoYWxsb2MgIT0gbnVsbHB0cikgewotICAgICAgZnJlZShhbGxvYyk7Ci0gICAgfQotICB9Ci0gIGxpc3RfdmVjdG9yLmNsZWFyKCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9mdXp6ZXJzL3JpbmdidWZmZXIvQW5kcm9pZC5icCBiL29zaS90ZXN0L2Z1enplcnMvcmluZ2J1ZmZlci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmVmNDM5Li4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L2Z1enplcnMvcmluZ2J1ZmZlci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYm9zaV9mdXp6X3JpbmdidWZmZXIiLAotICAgIGRlZmF1bHRzOiBbImxpYm9zaV9mdXp6X2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el9yaW5nYnVmZmVyLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvZnV6emVycy9yaW5nYnVmZmVyL2Z1enpfcmluZ2J1ZmZlci5jYyBiL29zaS90ZXN0L2Z1enplcnMvcmluZ2J1ZmZlci9mdXp6X3JpbmdidWZmZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzIxOWMuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvZnV6emVycy9yaW5nYnVmZmVyL2Z1enpfcmluZ2J1ZmZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JpbmdidWZmZXIuaCIKLQotI2RlZmluZSBNQVhfTlVNX0ZVTkNUSU9OUyA1MTIKLSNkZWZpbmUgTUFYX0JVRl9TSVpFIDIwNDgKLQotcmluZ2J1ZmZlcl90KiBnZXRBcmJpdHJhcnlSaW5nQnVmKHN0ZDo6dmVjdG9yPHJpbmdidWZmZXJfdCo+KiByaW5nYnVmX3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlcikgewotICBpZiAocmluZ2J1Zl92ZWN0b3ItPmVtcHR5KCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHNpemVfdCBpbmRleCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAotICAgICAgMCwgcmluZ2J1Zl92ZWN0b3ItPnNpemUoKSAtIDEpOwotICByZXR1cm4gcmluZ2J1Zl92ZWN0b3ItPmF0KGluZGV4KTsKLX0KLQotdm9pZCBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oc3RkOjp2ZWN0b3I8cmluZ2J1ZmZlcl90Kj4qIHJpbmdidWZfdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhUHJvdmlkZXIpIHsKLSAgLy8gR2V0IG91ciBmdW5jdGlvbiBpZGVudGlmaWVyCi0gIGNoYXIgZnVuY19pZCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxjaGFyPigwLCA4KTsKLQotICByaW5nYnVmZmVyX3QqIGJ1ZiA9IG51bGxwdHI7Ci0gIHN3aXRjaCAoZnVuY19pZCkgewotICAgIC8vIExldCAwIGJlIGEgTk8tT1AsIGFzIENvbnN1bWVJbnRlZ3JhbCB3aWxsIHJldHVybiAwIG9uIGFuIGVtcHR5IGJ1ZmZlcgotICAgIC8vIChUaGlzIHdpbGwgbGlrZWx5IGJpYXMgd2hhdGV2ZXIgYWN0aW9uIGlzIGhlcmUgdG8gcnVuIG1vcmUgb2Z0ZW4pCi0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgMTogewotICAgICAgc2l6ZV90IHNpemUgPQotICAgICAgICAgIGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9CVUZfU0laRSk7Ci0gICAgICBidWYgPSByaW5nYnVmZmVyX2luaXQoc2l6ZSk7Ci0gICAgICBpZiAoYnVmKSB7Ci0gICAgICAgIHJpbmdidWZfdmVjdG9yLT5wdXNoX2JhY2soYnVmKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSAyOiB7Ci0gICAgICBpZiAocmluZ2J1Zl92ZWN0b3ItPmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc2l6ZV90IGluZGV4ID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCi0gICAgICAgICAgMCwgcmluZ2J1Zl92ZWN0b3ItPnNpemUoKSAtIDEpOwotICAgICAgYnVmID0gcmluZ2J1Zl92ZWN0b3ItPmF0KGluZGV4KTsKLSAgICAgIGlmIChidWYpIHsKLSAgICAgICAgcmluZ2J1ZmZlcl9mcmVlKGJ1Zik7Ci0gICAgICAgIHJpbmdidWZfdmVjdG9yLT5lcmFzZShyaW5nYnVmX3ZlY3Rvci0+YmVnaW4oKSArIGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSAzOgotICAgICAgYnVmID0gZ2V0QXJiaXRyYXJ5UmluZ0J1ZihyaW5nYnVmX3ZlY3RvciwgZGF0YVByb3ZpZGVyKTsKLSAgICAgIGlmIChidWYpIHsKLSAgICAgICAgcmluZ2J1ZmZlcl9hdmFpbGFibGUoYnVmKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDQ6Ci0gICAgICBidWYgPSBnZXRBcmJpdHJhcnlSaW5nQnVmKHJpbmdidWZfdmVjdG9yLCBkYXRhUHJvdmlkZXIpOwotICAgICAgaWYgKGJ1ZikgewotICAgICAgICByaW5nYnVmZmVyX3NpemUoYnVmKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBjYXNlIDU6IHsKLSAgICAgIGJ1ZiA9IGdldEFyYml0cmFyeVJpbmdCdWYocmluZ2J1Zl92ZWN0b3IsIGRhdGFQcm92aWRlcik7Ci0gICAgICBzaXplX3Qgc2l6ZSA9Ci0gICAgICAgICAgZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMSwgTUFYX0JVRl9TSVpFKTsKLSAgICAgIGlmIChidWYgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgdm9pZCogc3JjX2J1ZiA9IG1hbGxvYyhzaXplKTsKLSAgICAgIGlmIChzcmNfYnVmID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXMgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVCeXRlczx1aW50OF90PihzaXplKTsKLSAgICAgIG1lbWNweShzcmNfYnVmLCBieXRlcy5kYXRhKCksIGJ5dGVzLnNpemUoKSk7Ci0KLSAgICAgIHJpbmdidWZmZXJfaW5zZXJ0KGJ1ZiwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oc3JjX2J1ZiksIHNpemUpOwotICAgICAgZnJlZShzcmNfYnVmKTsKLSAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzogewotICAgICAgYnVmID0gZ2V0QXJiaXRyYXJ5UmluZ0J1ZihyaW5nYnVmX3ZlY3RvciwgZGF0YVByb3ZpZGVyKTsKLSAgICAgIGlmIChidWYgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzaXplX3QgbWF4X3NpemUgPSByaW5nYnVmZmVyX3NpemUoYnVmKTsKLSAgICAgIGlmIChtYXhfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHNpemVfdCBzaXplID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMSwgbWF4X3NpemUpOwotCi0gICAgICAvLyBOT1RFOiAwLXNpemUgbWF5IGJlIGEgdmFsaWQgY2FzZSwgdGhhdCBjcmFzaGVzIGN1cnJlbnRseS4KLSAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB2b2lkKiBkc3RfYnVmID0gbWFsbG9jKHNpemUpOwotICAgICAgaWYgKGRzdF9idWYgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoZnVuY19pZCA9PSA2KSB7Ci0gICAgICAgIG9mZl90IG9mZnNldCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPG9mZl90PigpOwotICAgICAgICBpZiAob2Zmc2V0ID49IDAgJiYKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSA8PSByaW5nYnVmZmVyX3NpemUoYnVmKSkgewotICAgICAgICAgIHJpbmdidWZmZXJfcGVlayhidWYsIG9mZnNldCwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZHN0X2J1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByaW5nYnVmZmVyX3BvcChidWYsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRzdF9idWYpLCBzaXplKTsKLSAgICAgIH0KLSAgICAgIGZyZWUoZHN0X2J1Zik7Ci0gICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgODogewotICAgICAgYnVmID0gZ2V0QXJiaXRyYXJ5UmluZ0J1ZihyaW5nYnVmX3ZlY3RvciwgZGF0YVByb3ZpZGVyKTsKLSAgICAgIHNpemVfdCBzaXplID0KLSAgICAgICAgICBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfQlVGX1NJWkUpOwotICAgICAgaWYgKGJ1ZikgewotICAgICAgICByaW5nYnVmZmVyX2RlbGV0ZShidWYsIHNpemUpOwotICAgICAgfQotICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIEtlZXAgYSB2ZWN0b3Igb2Ygb3VyIGFsbG9jYXRlZCBvYmplY3RzIGZvciBmcmVlaW5nIGxhdGVyCi0gIHN0ZDo6dmVjdG9yPHJpbmdidWZmZXJfdCo+IHJpbmdidWZfdmVjdG9yOwotCi0gIC8vIENhbGwgc29tZSBmdW5jdGlvbnMsIGNyZWF0ZSBzb21lIGJ1ZmZlcnMKLSAgc2l6ZV90IG51bV9mdW5jdGlvbnMgPQotICAgICAgZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfTlVNX0ZVTkNUSU9OUyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Z1bmN0aW9uczsgaSsrKSB7Ci0gICAgY2FsbEFyYml0cmFyeUZ1bmN0aW9uKCZyaW5nYnVmX3ZlY3RvciwgJmRhdGFQcm92aWRlcik7Ci0gIH0KLQotICAvLyBGcmVlIGFueXRoaW5nIHdlJ3ZlIGFsbG9jYXRlZAotICBmb3IgKGNvbnN0IGF1dG8mIHJpbmdidWYgOiByaW5nYnVmX3ZlY3RvcikgewotICAgIGlmIChyaW5nYnVmICE9IG51bGxwdHIpIHsKLSAgICAgIHJpbmdidWZmZXJfZnJlZShyaW5nYnVmKTsKLSAgICB9Ci0gIH0KLSAgcmluZ2J1Zl92ZWN0b3IuY2xlYXIoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9oYXNoX21hcF91dGlsc190ZXN0LmNjIGIvb3NpL3Rlc3QvaGFzaF9tYXBfdXRpbHNfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZjJkNy4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9oYXNoX21hcF91dGlsc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvaGFzaF9tYXBfdXRpbHMuaCIKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotCi1jbGFzcyBIYXNoTWFwVXRpbHNUZXN0IDogcHVibGljIEFsbG9jYXRpb25UZXN0SGFybmVzcyB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlNldFVwKCk7IH0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBtYXAuY2xlYXIoKTsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7Ci0gIH0KLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXA7Ci19OwotCi1URVNUX0YoSGFzaE1hcFV0aWxzVGVzdCwgdGVzdF9lbXB0eV9zdHJpbmdfcGFyYW1zKSB7Ci0gIGNoYXIgcGFyYW1zW10gPSAiIjsKLSAgbWFwID0gaGFzaF9tYXBfdXRpbHNfbmV3X2Zyb21fc3RyaW5nX3BhcmFtcyhwYXJhbXMpOwotICBFWFBFQ1RfVFJVRShtYXAuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfRihIYXNoTWFwVXRpbHNUZXN0LCB0ZXN0X3NlbWljb2xvbnMpIHsKLSAgY2hhciBwYXJhbXNbXSA9ICI7OzsiOwotICBtYXAgPSBoYXNoX21hcF91dGlsc19uZXdfZnJvbV9zdHJpbmdfcGFyYW1zKHBhcmFtcyk7Ci0gIEVYUEVDVF9UUlVFKG1hcC5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKEhhc2hNYXBVdGlsc1Rlc3QsIHRlc3RfZXF1YWxfc2lnbl9pbl92YWx1ZSkgewotICBjaGFyIHBhcmFtc1tdID0gImtleU9mU29tZXRoaW5nPXZhbHVlPU9mU29tZXRoaW5nIjsKLSAgY2hhciBrZXlbXSA9ICJrZXlPZlNvbWV0aGluZyI7Ci0gIGNoYXIgdmFsdWVbXSA9ICJ2YWx1ZT1PZlNvbWV0aGluZyI7Ci0gIG1hcCA9IGhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMocGFyYW1zKTsKLSAgRVhQRUNUX0VRKDF1LCBtYXAuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlLCBtYXBba2V5XSk7Ci0gIG1hcC5jbGVhcigpOwotfQotCi1URVNUX0YoSGFzaE1hcFV0aWxzVGVzdCwgdGVzdF90d29fcGFpcnNfd2l0aF9zYW1lX2tleSkgewotICBjaGFyIHBhcmFtc1tdID0gImtleT12YWx1MDtrZXk9dmFsdWUxIjsKLSAgY2hhciBrZXlbXSA9ICJrZXkiOwotICBjaGFyIHZhbHVlMVtdID0gInZhbHVlMSI7Ci0gIG1hcCA9IGhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMocGFyYW1zKTsKLSAgRVhQRUNUX0VRKDF1LCBtYXAuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlMSwgbWFwW2tleV0pOwotfQotCi1URVNUX0YoSGFzaE1hcFV0aWxzVGVzdCwgdGVzdF9vbmVfa2V5X3ZhbHVlX3BhaXJfd2l0aG91dF9zZW1pY29sb24pIHsKLSAgY2hhciBwYXJhbXNbXSA9ICJrZXlPZlNvbWV0aGluZz12YWx1ZU9mU29tZXRoaW5nIjsKLSAgY2hhciBrZXlbXSA9ICJrZXlPZlNvbWV0aGluZyI7Ci0gIGNoYXIgdmFsdWVbXSA9ICJ2YWx1ZU9mU29tZXRoaW5nIjsKLSAgbWFwID0gaGFzaF9tYXBfdXRpbHNfbmV3X2Zyb21fc3RyaW5nX3BhcmFtcyhwYXJhbXMpOwotICBFWFBFQ1RfRVEoMXUsIG1hcC5zaXplKCkpOwotICBFWFBFQ1RfRVEodmFsdWUsIG1hcFtrZXldKTsKLX0KLQotVEVTVF9GKEhhc2hNYXBVdGlsc1Rlc3QsIHRlc3Rfb25lX2tleV92YWx1ZV9wYWlyX3dpdGhfc2VtaWNvbG9uKSB7Ci0gIGNoYXIgcGFyYW1zW10gPSAia2V5T2ZTb21ldGhpbmc9dmFsdWVPZlNvbWV0aGluZzsiOwotICBjaGFyIGtleVtdID0gImtleU9mU29tZXRoaW5nIjsKLSAgY2hhciB2YWx1ZVtdID0gInZhbHVlT2ZTb21ldGhpbmciOwotICBtYXAgPSBoYXNoX21hcF91dGlsc19uZXdfZnJvbV9zdHJpbmdfcGFyYW1zKHBhcmFtcyk7Ci0gIEVYUEVDVF9FUSgxdSwgbWFwLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgbWFwW2tleV0pOwotfQotCi1URVNUX0YoSGFzaE1hcFV0aWxzVGVzdCwgdGVzdF9vbmVfcGFpcl93aXRoX2VtcHR5X3ZhbHVlKSB7Ci0gIGNoYXIgcGFyYW1zW10gPSAia2V5T2ZTb21ldGhpbmc9OyI7Ci0gIGNoYXIga2V5W10gPSAia2V5T2ZTb21ldGhpbmciOwotICBjaGFyIHZhbHVlW10gPSAiIjsKLSAgbWFwID0gaGFzaF9tYXBfdXRpbHNfbmV3X2Zyb21fc3RyaW5nX3BhcmFtcyhwYXJhbXMpOwotICBFWFBFQ1RfRVEoMXUsIG1hcC5zaXplKCkpOwotICBFWFBFQ1RfRVEodmFsdWUsIG1hcFtrZXldKTsKLX0KLQotVEVTVF9GKEhhc2hNYXBVdGlsc1Rlc3QsIHRlc3Rfb25lX3BhaXJfd2l0aF9lbXB0eV9rZXkpIHsKLSAgY2hhciBwYXJhbXNbXSA9ICI9dmFsdWVPZlNvbWV0aGluZzsiOwotICBtYXAgPSBoYXNoX21hcF91dGlsc19uZXdfZnJvbV9zdHJpbmdfcGFyYW1zKHBhcmFtcyk7Ci0gIEVYUEVDVF9UUlVFKG1hcC5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKEhhc2hNYXBVdGlsc1Rlc3QsIHRlc3RfdHdvX2tleV92YWx1ZV9wYWlycykgewotICBjaGFyIHBhcmFtc1tdID0gImtleTA9dmFsdWUwO2tleTE9dmFsdWUxOyI7Ci0gIGNoYXIga2V5MFtdID0gImtleTAiOwotICBjaGFyIHZhbHVlMFtdID0gInZhbHVlMCI7Ci0gIGNoYXIga2V5MVtdID0gImtleTEiOwotICBjaGFyIHZhbHVlMVtdID0gInZhbHVlMSI7Ci0gIG1hcCA9IGhhc2hfbWFwX3V0aWxzX25ld19mcm9tX3N0cmluZ19wYXJhbXMocGFyYW1zKTsKLSAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlMCwgbWFwW2tleTBdKTsKLSAgRVhQRUNUX0VRKHZhbHVlMSwgbWFwW2tleTFdKTsKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L2xpc3RfdGVzdC5jYyBiL29zaS90ZXN0L2xpc3RfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhNDM4Zi4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9saXN0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbGlzdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi1jbGFzcyBMaXN0VGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3Mge307Ci0KLVRFU1RfRihMaXN0VGVzdCwgdGVzdF9uZXdfZnJlZV9zaW1wbGUpIHsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0gIEFTU0VSVF9UUlVFKGxpc3QgIT0gTlVMTCk7Ci0gIGxpc3RfZnJlZShsaXN0KTsKLX0KLQotVEVTVF9GKExpc3RUZXN0LCB0ZXN0X2ZyZWVfbnVsbCkgewotICAvLyBJbiB0aGlzIHRlc3Qgd2UganVzdCB2ZXJpZnkgdGhhdCBsaXN0X2ZyZWUgaXMgY2FsbGFibGUgd2l0aCBOVUxMLgotICBsaXN0X2ZyZWUoTlVMTCk7Ci19Ci0KLVRFU1RfRihMaXN0VGVzdCwgdGVzdF9lbXB0eV9saXN0X2lzX2VtcHR5KSB7Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotICBFWFBFQ1RfVFJVRShsaXN0X2lzX2VtcHR5KGxpc3QpKTsKLSAgbGlzdF9mcmVlKGxpc3QpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3RfZW1wdHlfbGlzdF9oYXNfbm9fbGVuZ3RoKSB7Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotICBFWFBFQ1RfRVEobGlzdF9sZW5ndGgobGlzdCksIDBVKTsKLSAgbGlzdF9mcmVlKGxpc3QpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3Rfc2ltcGxlX2xpc3RfcHJlcGVuZCkgewotICBsaXN0X3QqIGxpc3QgPSBsaXN0X25ldyhOVUxMKTsKLSAgRVhQRUNUX1RSVUUobGlzdF9wcmVwZW5kKGxpc3QsICZsaXN0KSk7Ci0gIEVYUEVDVF9GQUxTRShsaXN0X2lzX2VtcHR5KGxpc3QpKTsKLSAgRVhQRUNUX0VRKGxpc3RfbGVuZ3RoKGxpc3QpLCAxVSk7Ci0gIGxpc3RfZnJlZShsaXN0KTsKLX0KLQotVEVTVF9GKExpc3RUZXN0LCB0ZXN0X3NpbXBsZV9saXN0X2FwcGVuZCkgewotICBsaXN0X3QqIGxpc3QgPSBsaXN0X25ldyhOVUxMKTsKLSAgRVhQRUNUX1RSVUUobGlzdF9hcHBlbmQobGlzdCwgJmxpc3QpKTsKLSAgRVhQRUNUX0ZBTFNFKGxpc3RfaXNfZW1wdHkobGlzdCkpOwotICBFWFBFQ1RfRVEobGlzdF9sZW5ndGgobGlzdCksIDFVKTsKLSAgbGlzdF9mcmVlKGxpc3QpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3RfbGlzdF9yZW1vdmVfZm91bmQpIHsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0gIGxpc3RfYXBwZW5kKGxpc3QsICZsaXN0KTsKLSAgRVhQRUNUX1RSVUUobGlzdF9yZW1vdmUobGlzdCwgJmxpc3QpKTsKLSAgRVhQRUNUX1RSVUUobGlzdF9pc19lbXB0eShsaXN0KSk7Ci0gIEVYUEVDVF9FUShsaXN0X2xlbmd0aChsaXN0KSwgMFUpOwotICBsaXN0X2ZyZWUobGlzdCk7Ci19Ci0KLVRFU1RfRihMaXN0VGVzdCwgdGVzdF9saXN0X3JlbW92ZV9ub3RfZm91bmQpIHsKLSAgaW50IHg7Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotICBsaXN0X2FwcGVuZChsaXN0LCAmbGlzdCk7Ci0gIEVYUEVDVF9GQUxTRShsaXN0X3JlbW92ZShsaXN0LCAmeCkpOwotICBFWFBFQ1RfRkFMU0UobGlzdF9pc19lbXB0eShsaXN0KSk7Ci0gIEVYUEVDVF9FUShsaXN0X2xlbmd0aChsaXN0KSwgMVUpOwotICBsaXN0X2ZyZWUobGlzdCk7Ci19Ci0KLVRFU1RfRihMaXN0VGVzdCwgdGVzdF9saXN0X2Zyb250KSB7Ci0gIGludCB4W10gPSB7MSwgMiwgMywgNCwgNX07Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4KTsgKytpKSBsaXN0X2FwcGVuZChsaXN0LCAmeFtpXSk7Ci0KLSAgRVhQRUNUX0VRKGxpc3RfZnJvbnQobGlzdCksICZ4WzBdKTsKLQotICBsaXN0X2ZyZWUobGlzdCk7Ci19Ci0KLVRFU1RfRihMaXN0VGVzdCwgdGVzdF9saXN0X2JhY2spIHsKLSAgaW50IHhbXSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHgpOyArK2kpIGxpc3RfYXBwZW5kKGxpc3QsICZ4W2ldKTsKLQotICBFWFBFQ1RfRVEobGlzdF9iYWNrKGxpc3QpLCAmeFtBUlJBWV9TSVpFKHgpIC0gMV0pOwotCi0gIGxpc3RfZnJlZShsaXN0KTsKLX0KLQotVEVTVF9GKExpc3RUZXN0LCB0ZXN0X2xpc3RfY2xlYXIpIHsKLSAgaW50IHhbXSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHgpOyArK2kpIGxpc3RfYXBwZW5kKGxpc3QsICZ4W2ldKTsKLQotICBsaXN0X2NsZWFyKGxpc3QpOwotICBFWFBFQ1RfVFJVRShsaXN0X2lzX2VtcHR5KGxpc3QpKTsKLSAgRVhQRUNUX0VRKGxpc3RfbGVuZ3RoKGxpc3QpLCAwVSk7Ci0KLSAgbGlzdF9mcmVlKGxpc3QpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3RfbGlzdF9hcHBlbmRfbXVsdGlwbGUpIHsKLSAgaW50IHhbXSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHgpOyArK2kpIGxpc3RfYXBwZW5kKGxpc3QsICZ4W2ldKTsKLQotICBpbnQgaSA9IDA7Ci0gIGZvciAoY29uc3QgbGlzdF9ub2RlX3QgKm5vZGUgPSBsaXN0X2JlZ2luKGxpc3QpOyBub2RlICE9IGxpc3RfZW5kKGxpc3QpOwotICAgICAgIG5vZGUgPSBsaXN0X25leHQobm9kZSksICsraSkKLSAgICBFWFBFQ1RfRVEobGlzdF9ub2RlKG5vZGUpLCAmeFtpXSk7Ci0KLSAgbGlzdF9mcmVlKGxpc3QpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3RfbGlzdF9wcmVwZW5kX211bHRpcGxlKSB7Ci0gIGludCB4W10gPSB7MSwgMiwgMywgNCwgNX07Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4KTsgKytpKSBsaXN0X3ByZXBlbmQobGlzdCwgJnhbaV0pOwotCi0gIGludCBpID0gQVJSQVlfU0laRSh4KSAtIDE7Ci0gIGZvciAoY29uc3QgbGlzdF9ub2RlX3QgKm5vZGUgPSBsaXN0X2JlZ2luKGxpc3QpOyBub2RlICE9IGxpc3RfZW5kKGxpc3QpOwotICAgICAgIG5vZGUgPSBsaXN0X25leHQobm9kZSksIC0taSkKLSAgICBFWFBFQ1RfRVEobGlzdF9ub2RlKG5vZGUpLCAmeFtpXSk7Ci0KLSAgbGlzdF9mcmVlKGxpc3QpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3RfbGlzdF9iZWdpbl9lbXB0eV9saXN0KSB7Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotICBFWFBFQ1RfRVEobGlzdF9iZWdpbihsaXN0KSwgbGlzdF9lbmQobGlzdCkpOwotICBsaXN0X2ZyZWUobGlzdCk7Ci19Ci0KLVRFU1RfRihMaXN0VGVzdCwgdGVzdF9saXN0X25leHQpIHsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0gIGxpc3RfYXBwZW5kKGxpc3QsICZsaXN0KTsKLSAgRVhQRUNUX05FKGxpc3RfYmVnaW4obGlzdCksIGxpc3RfZW5kKGxpc3QpKTsKLSAgRVhQRUNUX0VRKGxpc3RfbmV4dChsaXN0X2JlZ2luKGxpc3QpKSwgbGlzdF9lbmQobGlzdCkpOwotICBsaXN0X2ZyZWUobGlzdCk7Ci19Ci0KLXN0YXRpYyBib29sIGxpc3RfY2FsbGJhY2tfc3VtKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgQ0hFQ0soZGF0YSk7Ci0gIENIRUNLKGNvbnRleHQpOwotICBpbnQqIHN1bSA9IChpbnQqKWNvbnRleHQ7Ci0gIGludCogdmFsdWUgPSAoaW50KilkYXRhOwotICAqc3VtICs9ICp2YWx1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGxpc3RfY2FsbGJhY2tfZmluZF9pbnQodm9pZCogZGF0YSwgdm9pZCogY29udGV4dCkgewotICBDSEVDSyhkYXRhKTsKLSAgQ0hFQ0soY29udGV4dCk7Ci0gIHJldHVybiAoKihpbnQqKWRhdGEgIT0gKihpbnQqKWNvbnRleHQpOwotfQotCi1URVNUX0YoTGlzdFRlc3QsIHRlc3RfbGlzdF9mb3JlYWNoX2Z1bGwpIHsKLSAgbGlzdF90KiBsaXN0ID0gbGlzdF9uZXcoTlVMTCk7Ci0KLSAgLy8gRmlsbCBpbiB0ZXN0IGRhdGEKLSAgaW50IHhbXSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHgpOyArK2kpIGxpc3RfYXBwZW5kKGxpc3QsICZ4W2ldKTsKLSAgRVhQRUNUX0VRKGxpc3RfbGVuZ3RoKGxpc3QpLCAoc2l6ZV90KTUpOwotCi0gIC8vIFRlc3QgY29tcGxldGUgaXRlcmF0aW9uCi0gIGludCBzdW0gPSAwOwotICBsaXN0X25vZGVfdCogcmMgPSBsaXN0X2ZvcmVhY2gobGlzdCwgbGlzdF9jYWxsYmFja19zdW0sICZzdW0pOwotICBFWFBFQ1RfRVEoc3VtLCAxNSk7Ci0gIEVYUEVDVF9UUlVFKHJjID09IE5VTEwpOwotCi0gIGxpc3RfZnJlZShsaXN0KTsKLX0KLQotVEVTVF9GKExpc3RUZXN0LCB0ZXN0X2xpc3RfZm9yZWFjaF9wYXJ0aWFsKSB7Ci0gIGxpc3RfdCogbGlzdCA9IGxpc3RfbmV3KE5VTEwpOwotCi0gIC8vIEZpbGwgaW4gdGVzdCBkYXRhCi0gIGludCB4W10gPSB7MSwgMiwgMywgNCwgNX07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4KTsgKytpKSBsaXN0X2FwcGVuZChsaXN0LCAmeFtpXSk7Ci0gIEVYUEVDVF9FUShsaXN0X2xlbmd0aChsaXN0KSwgKHNpemVfdCk1KTsKLQotICAvLyBUZXN0IHBhcnRpYWwgaXRlcmF0aW9uCi0gIGludCBmaW5kID0gNDsKLSAgbGlzdF9ub2RlX3QqIHJjID0gbGlzdF9mb3JlYWNoKGxpc3QsIGxpc3RfY2FsbGJhY2tfZmluZF9pbnQsICZmaW5kKTsKLSAgRVhQRUNUX1RSVUUocmMgIT0gTlVMTCk7Ci0gIGludCogcmNfdmFsID0gKGludCopbGlzdF9ub2RlKHJjKTsKLSAgRVhQRUNUX1RSVUUoKnJjX3ZhbCA9PSA0KTsKLQotICBmaW5kID0gMTsKLSAgcmMgPSBsaXN0X2ZvcmVhY2gobGlzdCwgbGlzdF9jYWxsYmFja19maW5kX2ludCwgJmZpbmQpOwotICBFWFBFQ1RfVFJVRShyYyAhPSBOVUxMKTsKLSAgcmNfdmFsID0gKGludCopbGlzdF9ub2RlKHJjKTsKLSAgRVhQRUNUX1RSVUUoKnJjX3ZhbCA9PSAxKTsKLQotICBmaW5kID0gNTsKLSAgcmMgPSBsaXN0X2ZvcmVhY2gobGlzdCwgbGlzdF9jYWxsYmFja19maW5kX2ludCwgJmZpbmQpOwotICBFWFBFQ1RfVFJVRShyYyAhPSBOVUxMKTsKLSAgcmNfdmFsID0gKGludCopbGlzdF9ub2RlKHJjKTsKLSAgRVhQRUNUX1RSVUUoKnJjX3ZhbCA9PSA1KTsKLQotICBmaW5kID0gMDsKLSAgcmMgPSBsaXN0X2ZvcmVhY2gobGlzdCwgbGlzdF9jYWxsYmFja19maW5kX2ludCwgJmZpbmQpOwotICBFWFBFQ1RfVFJVRShyYyA9PSBOVUxMKTsKLQotICBsaXN0X2ZyZWUobGlzdCk7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9wcm9wZXJ0aWVzX3Rlc3QuY2MgYi9vc2kvdGVzdC9wcm9wZXJ0aWVzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDU1M2QuLjAwMDAwMDAKLS0tIGEvb3NpL3Rlc3QvcHJvcGVydGllc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotCi1jbGFzcyBQcm9wZXJ0aWVzVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3Mge307Ci0KLVRFU1RfRihQcm9wZXJ0aWVzVGVzdCwgdGVzdF9kZWZhdWx0X3ZhbHVlKSB7Ci0gIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgb3NpX3Byb3BlcnR5X2dldCgidmVyeS51c2VmdWwudGVzdCIsIHZhbHVlLCAidmVyeV91c2VmdWxfdmFsdWUiKTsKLSAgQVNTRVJUX1NUUkVRKHZhbHVlLCAidmVyeV91c2VmdWxfdmFsdWUiKTsKLX0KLQotVEVTVF9GKFByb3BlcnRpZXNUZXN0LCB0ZXN0X3N1Y2Nlc3NmdWxsX3NldF9hbmRfZ2V0X3ZhbHVlKSB7Ci0jaWYgIWRlZmluZWQoT1NfR0VORVJJQykKLSAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gIm5vdGhpbmdfaW50ZXJlc3RpbmciOwotICBpbnQgcmV0ID0gb3NpX3Byb3BlcnR5X3NldCgidmVyeS51c2VmdWwuc2V0LnRlc3QiLCB2YWx1ZSk7Ci0gIEFTU0VSVF9FUSgwLCByZXQpOwotCi0gIGNoYXIgcmVjZWl2ZWRbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgb3NpX3Byb3BlcnR5X2dldCgidmVyeS51c2VmdWwuc2V0LnRlc3QiLCByZWNlaXZlZCwgTlVMTCk7Ci0gIEFTU0VSVF9TVFJFUShyZWNlaXZlZCwgIm5vdGhpbmdfaW50ZXJlc3RpbmciKTsKLSNlbmRpZgotfQotCi1URVNUX0YoUHJvcGVydGllc1Rlc3QsIHRlc3RfZGVmYXVsdF92YWx1ZV9pbnQzMikgewotICBpbnQzMl90IHZhbHVlID0gNDI7Ci0gIGludDMyX3QgcnZhbHVlID0gb3NpX3Byb3BlcnR5X2dldF9pbnQzMigidmVyeS51c2VmdWwudGVzdCIsIHZhbHVlKTsKLSAgQVNTRVJUX0VRKHJ2YWx1ZSwgdmFsdWUpOwotfQotCi1URVNUX0YoUHJvcGVydGllc1Rlc3QsIHRlc3Rfc3VjY2Vzc2Z1bGxfc2V0X2FuZF9nZXRfdmFsdWVfaW50MzIpIHsKLSNpZiAhZGVmaW5lZChPU19HRU5FUklDKQotICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiNDIiOwotICBpbnQgcmV0ID0gb3NpX3Byb3BlcnR5X3NldCgidmVyeS51c2VmdWwuc2V0LnRlc3QiLCB2YWx1ZSk7Ci0gIEFTU0VSVF9FUSgwLCByZXQpOwotCi0gIGludDMyX3QgcmVjZWl2ZWQgPSBvc2lfcHJvcGVydHlfZ2V0X2ludDMyKCJ2ZXJ5LnVzZWZ1bC5zZXQudGVzdCIsIDg0KTsKLSAgQVNTRVJUX0VRKHJlY2VpdmVkLCA0Mik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L3JhbmRfdGVzdC5jYyBiL29zaS90ZXN0L3JhbmRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNjE3Yi4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9yYW5kX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLWNsYXNzIFJhbmRUZXN0IDogcHVibGljIEFsbG9jYXRpb25UZXN0SGFybmVzcyB7fTsKLQotVEVTVF9GKFJhbmRUZXN0LCB0ZXN0X3JhbmQpIHsKLSAgLy8gV2UgY2FuJ3QgZ3VhcmFudGVlIGFueSBkaXN0cmlidXRpb24KLSAgLy8gV2UnZCBsaWtlIGl0IHRvIG5vdCBjcmFzaCB0aG91Z2guCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgIGludCB4OwotICAgIHggPSBvc2lfcmFuZCgpOwotICAgIEVYUEVDVF9UUlVFKHggPj0gMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L3JlYWN0b3JfdGVzdC5jYyBiL29zaS90ZXN0L3JlYWN0b3JfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2NDIyNy4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC9yZWFjdG9yX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcmVhY3Rvci5oIgotCi1jbGFzcyBSZWFjdG9yVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3Mge307Ci0KLXN0YXRpYyBwdGhyZWFkX3QgdGhyZWFkOwotc3RhdGljIHZvbGF0aWxlIGJvb2wgdGhyZWFkX3J1bm5pbmc7Ci0KLXN0YXRpYyB2b2lkKiByZWFjdG9yX3RocmVhZCh2b2lkKiBwdHIpIHsKLSAgcmVhY3Rvcl90KiByZWFjdG9yID0gKHJlYWN0b3JfdCopcHRyOwotCi0gIHRocmVhZF9ydW5uaW5nID0gdHJ1ZTsKLSAgcmVhY3Rvcl9zdGFydChyZWFjdG9yKTsKLSAgdGhyZWFkX3J1bm5pbmcgPSBmYWxzZTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgc3Bhd25fcmVhY3Rvcl90aHJlYWQocmVhY3Rvcl90KiByZWFjdG9yKSB7Ci0gIGludCByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCByZWFjdG9yX3RocmVhZCwgcmVhY3Rvcik7Ci0gIEVYUEVDVF9FUShyZXQsIDApOwotfQotCi1zdGF0aWMgdm9pZCBqb2luX3JlYWN0b3JfdGhyZWFkKCkgeyBwdGhyZWFkX2pvaW4odGhyZWFkLCBOVUxMKTsgfQotCi1URVNUX0YoUmVhY3RvclRlc3QsIHJlYWN0b3JfbmV3KSB7Ci0gIHJlYWN0b3JfdCogcmVhY3RvciA9IHJlYWN0b3JfbmV3KCk7Ci0gIEVYUEVDVF9UUlVFKHJlYWN0b3IgIT0gTlVMTCk7Ci0gIHJlYWN0b3JfZnJlZShyZWFjdG9yKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCByZWFjdG9yX2ZyZWVfbnVsbCkgeyByZWFjdG9yX2ZyZWUoTlVMTCk7IH0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCByZWFjdG9yX3N0b3Bfc3RhcnQpIHsKLSAgcmVhY3Rvcl90KiByZWFjdG9yID0gcmVhY3Rvcl9uZXcoKTsKLSAgcmVhY3Rvcl9zdG9wKHJlYWN0b3IpOwotICByZWFjdG9yX3N0YXJ0KHJlYWN0b3IpOwotICByZWFjdG9yX2ZyZWUocmVhY3Rvcik7Ci19Ci0KLVRFU1RfRihSZWFjdG9yVGVzdCwgcmVhY3Rvcl9yZXBlYXRlZF9zdG9wX3N0YXJ0KSB7Ci0gIHJlYWN0b3JfdCogcmVhY3RvciA9IHJlYWN0b3JfbmV3KCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgewotICAgIHJlYWN0b3Jfc3RvcChyZWFjdG9yKTsKLSAgICByZWFjdG9yX3N0YXJ0KHJlYWN0b3IpOwotICB9Ci0gIHJlYWN0b3JfZnJlZShyZWFjdG9yKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCByZWFjdG9yX3N0YXJ0X3dhaXRfc3RvcCkgewotICByZWFjdG9yX3QqIHJlYWN0b3IgPSByZWFjdG9yX25ldygpOwotCi0gIHNwYXduX3JlYWN0b3JfdGhyZWFkKHJlYWN0b3IpOwotICB1c2xlZXAoNTAgKiAxMDAwKTsKLSAgRVhQRUNUX1RSVUUodGhyZWFkX3J1bm5pbmcpOwotCi0gIHJlYWN0b3Jfc3RvcChyZWFjdG9yKTsKLSAgam9pbl9yZWFjdG9yX3RocmVhZCgpOwotICBFWFBFQ1RfRkFMU0UodGhyZWFkX3J1bm5pbmcpOwotCi0gIHJlYWN0b3JfZnJlZShyZWFjdG9yKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICByZWFjdG9yX3QqIHJlYWN0b3I7Ci0gIHJlYWN0b3Jfb2JqZWN0X3QqIG9iamVjdDsKLX0gdW5yZWdpc3Rlcl9hcmdfdDsKLQotc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9jYih2b2lkKiBjb250ZXh0KSB7Ci0gIHVucmVnaXN0ZXJfYXJnX3QqIGFyZyA9ICh1bnJlZ2lzdGVyX2FyZ190Kiljb250ZXh0OwotICByZWFjdG9yX3VucmVnaXN0ZXIoYXJnLT5vYmplY3QpOwotICByZWFjdG9yX3N0b3AoYXJnLT5yZWFjdG9yKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCByZWFjdG9yX3VucmVnaXN0ZXJfZnJvbV9jYWxsYmFjaykgewotICByZWFjdG9yX3QqIHJlYWN0b3IgPSByZWFjdG9yX25ldygpOwotCi0gIGludCBmZCA9IGV2ZW50ZmQoMCwgMCk7Ci0gIHVucmVnaXN0ZXJfYXJnX3QgYXJnOwotICBhcmcucmVhY3RvciA9IHJlYWN0b3I7Ci0gIGFyZy5vYmplY3QgPSByZWFjdG9yX3JlZ2lzdGVyKHJlYWN0b3IsIGZkLCAmYXJnLCB1bnJlZ2lzdGVyX2NiLCBOVUxMKTsKLSAgc3Bhd25fcmVhY3Rvcl90aHJlYWQocmVhY3Rvcik7Ci0gIGV2ZW50ZmRfd3JpdGUoZmQsIDEpOwotCi0gIGpvaW5fcmVhY3Rvcl90aHJlYWQoKTsKLQotICBjbG9zZShmZCk7Ci0gIHJlYWN0b3JfZnJlZShyZWFjdG9yKTsKLX0KLQotVEVTVF9GKFJlYWN0b3JUZXN0LCByZWFjdG9yX3VucmVnaXN0ZXJfZnJvbV9zZXBhcmF0ZV90aHJlYWQpIHsKLSAgcmVhY3Rvcl90KiByZWFjdG9yID0gcmVhY3Rvcl9uZXcoKTsKLQotICBpbnQgZmQgPSBldmVudGZkKDAsIDApOwotCi0gIHJlYWN0b3Jfb2JqZWN0X3QqIG9iamVjdCA9IHJlYWN0b3JfcmVnaXN0ZXIocmVhY3RvciwgZmQsIE5VTEwsIE5VTEwsIE5VTEwpOwotICBzcGF3bl9yZWFjdG9yX3RocmVhZChyZWFjdG9yKTsKLSAgdXNsZWVwKDUwICogMTAwMCk7Ci0gIHJlYWN0b3JfdW5yZWdpc3RlcihvYmplY3QpOwotCi0gIHJlYWN0b3Jfc3RvcChyZWFjdG9yKTsKLSAgam9pbl9yZWFjdG9yX3RocmVhZCgpOwotCi0gIGNsb3NlKGZkKTsKLSAgcmVhY3Rvcl9mcmVlKHJlYWN0b3IpOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvcmluZ2J1ZmZlcl90ZXN0LmNjIGIvb3NpL3Rlc3QvcmluZ2J1ZmZlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDc1OTczLi4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L3JpbmdidWZmZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JpbmdidWZmZXIuaCIKLQotVEVTVChSaW5nYnVmZmVyVGVzdCwgdGVzdF9uZXdfc2ltcGxlKSB7Ci0gIHJpbmdidWZmZXJfdCogcmIgPSByaW5nYnVmZmVyX2luaXQoNDA5Nik7Ci0gIEFTU0VSVF9UUlVFKHJiICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoKHNpemVfdCk0MDk2LCByaW5nYnVmZmVyX2F2YWlsYWJsZShyYikpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCByaW5nYnVmZmVyX3NpemUocmIpKTsKLSAgcmluZ2J1ZmZlcl9mcmVlKHJiKTsKLX0KLQotVEVTVChSaW5nYnVmZmVyVGVzdCwgdGVzdF9pbnNlcnRfYmFzaWMpIHsKLSAgcmluZ2J1ZmZlcl90KiByYiA9IHJpbmdidWZmZXJfaW5pdCgxNik7Ci0KLSAgdWludDhfdCBidWZmZXJbMTBdID0gezB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBfTsKLSAgcmluZ2J1ZmZlcl9pbnNlcnQocmIsIGJ1ZmZlciwgMTApOwotICBFWFBFQ1RfRVEoKHNpemVfdCkxMCwgcmluZ2J1ZmZlcl9zaXplKHJiKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTYsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0KLSAgdWludDhfdCBwZWVrWzEwXSA9IHswfTsKLSAgc2l6ZV90IHBlZWtlZCA9IHJpbmdidWZmZXJfcGVlayhyYiwgMCwgcGVlaywgMTApOwotICBFWFBFQ1RfRVEoKHNpemVfdCkxMCwgcmluZ2J1ZmZlcl9zaXplKHJiKSk7ICAvLyBFbnN1cmUgc2l6ZSBkb2Vzbid0IGNoYW5nZQotICBFWFBFQ1RfRVEoKHNpemVfdCk2LCByaW5nYnVmZmVyX2F2YWlsYWJsZShyYikpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkxMCwgcGVla2VkKTsKLSAgQVNTRVJUX1RSVUUoMCA9PSBtZW1jbXAoYnVmZmVyLCBwZWVrLCBwZWVrZWQpKTsKLQotICByaW5nYnVmZmVyX2ZyZWUocmIpOwotfQotCi1URVNUKFJpbmdidWZmZXJUZXN0LCB0ZXN0X2luc2VydF9mdWxsKSB7Ci0gIHJpbmdidWZmZXJfdCogcmIgPSByaW5nYnVmZmVyX2luaXQoNSk7Ci0KLSAgdWludDhfdCBhYVtdID0gezB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUF9OwotICB1aW50OF90IGJiW10gPSB7MHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQn07Ci0gIHVpbnQ4X3QgcGVla1s1XSA9IHswfTsKLQotICBzaXplX3QgYWRkZWQgPSByaW5nYnVmZmVyX2luc2VydChyYiwgYWEsIDcpOwotICBFWFBFQ1RfRVEoKHNpemVfdCk1LCBhZGRlZCk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTAsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTUsIHJpbmdidWZmZXJfc2l6ZShyYikpOwotCi0gIGFkZGVkID0gcmluZ2J1ZmZlcl9pbnNlcnQocmIsIGJiLCA1KTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMCwgYWRkZWQpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCByaW5nYnVmZmVyX2F2YWlsYWJsZShyYikpOwotICBFWFBFQ1RfRVEoKHNpemVfdCk1LCByaW5nYnVmZmVyX3NpemUocmIpKTsKLQotICBzaXplX3QgcGVla2VkID0gcmluZ2J1ZmZlcl9wZWVrKHJiLCAwLCBwZWVrLCA1KTsKLSAgRVhQRUNUX0VRKChzaXplX3QpNSwgcGVla2VkKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMCwgcmluZ2J1ZmZlcl9hdmFpbGFibGUocmIpKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpNSwgcmluZ2J1ZmZlcl9zaXplKHJiKSk7Ci0KLSAgQVNTRVJUX1RSVUUoMCA9PSBtZW1jbXAoYWEsIHBlZWssIHBlZWtlZCkpOwotCi0gIHJpbmdidWZmZXJfZnJlZShyYik7Ci19Ci0KLVRFU1QoUmluZ2J1ZmZlclRlc3QsIHRlc3RfbXVsdGlfaW5zZXJ0X2RlbGV0ZSkgewotICByaW5nYnVmZmVyX3QqIHJiID0gcmluZ2J1ZmZlcl9pbml0KDE2KTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMTYsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTAsIHJpbmdidWZmZXJfc2l6ZShyYikpOwotCi0gIC8vIEluc2VydCBzb21lIGJ5dGVzCi0KLSAgdWludDhfdCBhYVtdID0gezB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUF9OwotICBzaXplX3QgYWRkZWQgPSByaW5nYnVmZmVyX2luc2VydChyYiwgYWEsIHNpemVvZihhYSkpOwotICBFWFBFQ1RfRVEoKHNpemVfdCk4LCBhZGRlZCk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTgsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTgsIHJpbmdidWZmZXJfc2l6ZShyYikpOwotCi0gIHVpbnQ4X3QgYmJbXSA9IHsweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCfTsKLSAgcmluZ2J1ZmZlcl9pbnNlcnQocmIsIGJiLCBzaXplb2YoYmIpKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMywgcmluZ2J1ZmZlcl9hdmFpbGFibGUocmIpKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMTMsIHJpbmdidWZmZXJfc2l6ZShyYikpOwotCi0gIHVpbnQ4X3QgY29udGVudFtdID0gezB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsCi0gICAgICAgICAgICAgICAgICAgICAgIDB4QUEsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkJ9OwotICB1aW50OF90IHBlZWtbMTZdID0gezB9OwotICBzaXplX3QgcGVla2VkID0gcmluZ2J1ZmZlcl9wZWVrKHJiLCAwLCBwZWVrLCAxNik7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTEzLCBwZWVrZWQpOwotICBBU1NFUlRfVFJVRSgwID09IG1lbWNtcChjb250ZW50LCBwZWVrLCBwZWVrZWQpKTsKLQotICAvLyBEZWxldGUgc29tZSBieXRlcwotCi0gIHJpbmdidWZmZXJfZGVsZXRlKHJiLCBzaXplb2YoYWEpKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMTEsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTUsIHJpbmdidWZmZXJfc2l6ZShyYikpOwotCi0gIC8vIEFkZCBzb21lIG1vcmUgdG8gd3JhcCBidWZmZXIKLQotICB1aW50OF90IGNjW10gPSB7MHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHhDQ307Ci0gIHJpbmdidWZmZXJfaW5zZXJ0KHJiLCBjYywgc2l6ZW9mKGNjKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTIsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTE0LCByaW5nYnVmZmVyX3NpemUocmIpKTsKLQotICB1aW50OF90IGNvbnRlbnQyW10gPSB7MHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhDQywgMHhDQ307Ci0gIHBlZWtlZCA9IHJpbmdidWZmZXJfcGVlayhyYiwgMCwgcGVlaywgNyk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTcsIHBlZWtlZCk7Ci0gIEFTU0VSVF9UUlVFKDAgPT0gbWVtY21wKGNvbnRlbnQyLCBwZWVrLCBwZWVrZWQpKTsKLQotICAvLyBQb3AgYnVmZmVyCi0KLSAgbWVtc2V0KHBlZWssIDAsIDE2KTsKLSAgc2l6ZV90IHBvcHBlZCA9IHJpbmdidWZmZXJfcG9wKHJiLCBwZWVrLCA3KTsKLSAgRVhQRUNUX0VRKChzaXplX3QpNywgcG9wcGVkKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpOSwgcmluZ2J1ZmZlcl9hdmFpbGFibGUocmIpKTsKLSAgQVNTRVJUX1RSVUUoMCA9PSBtZW1jbXAoY29udGVudDIsIHBlZWssIHBlZWtlZCkpOwotCi0gIC8vIEFkZCBtb3JlIGFnYWluIHRvIGNoZWNrIGhlYWQgbW90aW9uCi0KLSAgdWludDhfdCBkZFtdID0gezB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4REQsIDB4RER9OwotICBhZGRlZCA9IHJpbmdidWZmZXJfaW5zZXJ0KHJiLCBkZCwgc2l6ZW9mKGRkKSk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTgsIGFkZGVkKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMSwgcmluZ2J1ZmZlcl9hdmFpbGFibGUocmIpKTsKLQotICAvLyBEZWxldGUgZXZlcnl0aGluZwotCi0gIHJpbmdidWZmZXJfZGVsZXRlKHJiLCAxNik7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTE2LCByaW5nYnVmZmVyX2F2YWlsYWJsZShyYikpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCByaW5nYnVmZmVyX3NpemUocmIpKTsKLQotICAvLyBBZGQgc21hbGwgdG9rZW4KLQotICB1aW50OF90IGFlW10gPSB7MHhBRSwgMHhBRSwgMHhBRX07Ci0gIGFkZGVkID0gcmluZ2J1ZmZlcl9pbnNlcnQocmIsIGFlLCBzaXplb2YoYWUpKTsKLSAgRVhQRUNUX0VRKChzaXplX3QpMTMsIHJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKSk7Ci0KLSAgLy8gR2V0IGV2ZXJ5dGhpbmcKLQotICBwb3BwZWQgPSByaW5nYnVmZmVyX3BvcChyYiwgcGVlaywgMTYpOwotICBFWFBFQ1RfRVEoYWRkZWQsIHBvcHBlZCk7Ci0gIEVYUEVDVF9FUSgoc2l6ZV90KTE2LCByaW5nYnVmZmVyX2F2YWlsYWJsZShyYikpOwotICBFWFBFQ1RfRVEoKHNpemVfdCkwLCByaW5nYnVmZmVyX3NpemUocmIpKTsKLSAgQVNTRVJUX1RSVUUoMCA9PSBtZW1jbXAoYWUsIHBlZWssIHBvcHBlZCkpOwotCi0gIHJpbmdidWZmZXJfZnJlZShyYik7Ci19CmRpZmYgLS1naXQgYS9vc2kvdGVzdC9zZW1hcGhvcmVfdGVzdC5jYyBiL29zaS90ZXN0L3NlbWFwaG9yZV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA0NmE4Li4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L3NlbWFwaG9yZV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJBbGxvY2F0aW9uVGVzdEhhcm5lc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcmVhY3Rvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQ7Ci0KLXN0cnVjdCBTZW1hcGhvcmVUZXN0U2VxdWVuY2VIZWxwZXIgewotICBzZW1hcGhvcmVfdCogc2VtYXBob3JlOwotICBpbnQgY291bnRlcjsKLX07Ci0KLW5hbWVzcGFjZSB7Ci12b2lkIHNsZWVwX3RoZW5faW5jcmVtZW50X2NvdW50ZXIodm9pZCogY29udGV4dCkgewotICBTZW1hcGhvcmVUZXN0U2VxdWVuY2VIZWxwZXIqIGhlbHBlciA9Ci0gICAgICByZWludGVycHJldF9jYXN0PFNlbWFwaG9yZVRlc3RTZXF1ZW5jZUhlbHBlcio+KGNvbnRleHQpOwotICBDSEVDSyhoZWxwZXIpOwotICBDSEVDSyhoZWxwZXItPnNlbWFwaG9yZSk7Ci0gIHNsZWVwKDEpOwotICArK2hlbHBlci0+Y291bnRlcjsKLSAgc2VtYXBob3JlX3Bvc3QoaGVscGVyLT5zZW1hcGhvcmUpOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIFNlbWFwaG9yZVRlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHt9OwotCi1URVNUX0YoU2VtYXBob3JlVGVzdCwgdGVzdF9uZXdfc2ltcGxlKSB7Ci0gIHNlbWFwaG9yZV90KiBzZW1hcGhvcmUgPSBzZW1hcGhvcmVfbmV3KDApOwotICBBU1NFUlRfVFJVRShzZW1hcGhvcmUgIT0gTlVMTCk7Ci0gIHNlbWFwaG9yZV9mcmVlKHNlbWFwaG9yZSk7Ci19Ci0KLVRFU1RfRihTZW1hcGhvcmVUZXN0LCB0ZXN0X25ld193aXRoX3ZhbHVlKSB7Ci0gIHNlbWFwaG9yZV90KiBzZW1hcGhvcmUgPSBzZW1hcGhvcmVfbmV3KDMpOwotICBBU1NFUlRfVFJVRShzZW1hcGhvcmUgIT0gTlVMTCk7Ci0KLSAgRVhQRUNUX1RSVUUoc2VtYXBob3JlX3RyeV93YWl0KHNlbWFwaG9yZSkpOwotICBFWFBFQ1RfVFJVRShzZW1hcGhvcmVfdHJ5X3dhaXQoc2VtYXBob3JlKSk7Ci0gIEVYUEVDVF9UUlVFKHNlbWFwaG9yZV90cnlfd2FpdChzZW1hcGhvcmUpKTsKLSAgRVhQRUNUX0ZBTFNFKHNlbWFwaG9yZV90cnlfd2FpdChzZW1hcGhvcmUpKTsKLQotICBzZW1hcGhvcmVfZnJlZShzZW1hcGhvcmUpOwotfQotCi1URVNUX0YoU2VtYXBob3JlVGVzdCwgdGVzdF90cnlfd2FpdCkgewotICBzZW1hcGhvcmVfdCogc2VtYXBob3JlID0gc2VtYXBob3JlX25ldygwKTsKLSAgQVNTRVJUX1RSVUUoc2VtYXBob3JlICE9IE5VTEwpOwotCi0gIEVYUEVDVF9GQUxTRShzZW1hcGhvcmVfdHJ5X3dhaXQoc2VtYXBob3JlKSk7Ci0gIHNlbWFwaG9yZV9wb3N0KHNlbWFwaG9yZSk7Ci0gIEVYUEVDVF9UUlVFKHNlbWFwaG9yZV90cnlfd2FpdChzZW1hcGhvcmUpKTsKLSAgRVhQRUNUX0ZBTFNFKHNlbWFwaG9yZV90cnlfd2FpdChzZW1hcGhvcmUpKTsKLQotICBzZW1hcGhvcmVfZnJlZShzZW1hcGhvcmUpOwotfQotCi1URVNUX0YoU2VtYXBob3JlVGVzdCwgdGVzdF93YWl0X2FmdGVyX3Bvc3QpIHsKLSAgc2VtYXBob3JlX3QqIHNlbWFwaG9yZSA9IHNlbWFwaG9yZV9uZXcoMCk7Ci0gIEFTU0VSVF9UUlVFKHNlbWFwaG9yZSAhPSBOVUxMKTsKLSAgc2VtYXBob3JlX3Bvc3Qoc2VtYXBob3JlKTsKLSAgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLSAgc2VtYXBob3JlX2ZyZWUoc2VtYXBob3JlKTsKLX0KLQotVEVTVF9GKFNlbWFwaG9yZVRlc3QsIHRlc3RfZW5zdXJlX3dhaXQpIHsKLSAgc2VtYXBob3JlX3QqIHNlbWFwaG9yZSA9IHNlbWFwaG9yZV9uZXcoMCk7Ci0gIEFTU0VSVF9UUlVFKHNlbWFwaG9yZSAhPSBOVUxMKTsKLSAgTWVzc2FnZUxvb3BUaHJlYWQgdGhyZWFkKCJzZW1hcGhvcmVfdGVzdF90aHJlYWQiKTsKLSAgdGhyZWFkLlN0YXJ0VXAoKTsKLSAgQVNTRVJUX1RSVUUodGhyZWFkLklzUnVubmluZygpKTsKLQotICBFWFBFQ1RfRkFMU0Uoc2VtYXBob3JlX3RyeV93YWl0KHNlbWFwaG9yZSkpOwotICBTZW1hcGhvcmVUZXN0U2VxdWVuY2VIZWxwZXIgc2VxdWVuY2VfaGVscGVyID0ge3NlbWFwaG9yZSwgMH07Ci0gIHRocmVhZC5Eb0luVGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChzbGVlcF90aGVuX2luY3JlbWVudF9jb3VudGVyLCAmc2VxdWVuY2VfaGVscGVyKSk7Ci0gIHNlbWFwaG9yZV93YWl0KHNlbWFwaG9yZSk7Ci0gIEVYUEVDVF9FUShzZXF1ZW5jZV9oZWxwZXIuY291bnRlciwgMSkKLSAgICAgIDw8ICJzZW1hcGhvcmVfd2FpdCgpIGRpZCBub3Qgd2FpdCBmb3IgY291bnRlciB0byBpbmNyZW1lbnQiOwotCi0gIHNlbWFwaG9yZV9mcmVlKHNlbWFwaG9yZSk7Ci0gIHRocmVhZC5TaHV0RG93bigpOwotfQpkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvdGVzdF9zdHVicy5oIGIvb3NpL3Rlc3QvdGVzdF9zdHVicy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNmZDM3Li4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L3Rlc3Rfc3R1YnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE0IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0vLyBIZWxwZXIgbWFjcm9zIGZvciBzdHViYmluZyBvdXQgZnVuY3Rpb25zIGFuZCBtb2R1bGVzIGZvciB0ZXN0aW5nLgotCi0vLyBTdHViIG91dCBhIGZ1bmN0aW9uLCB3aXRoIGNhbGwgY291bnRpbmcgYW5kIG1vZGUgYXdhcmVuZXNzCi0jZGVmaW5lIFNUVUJfRlVOQ1RJT04ocmV0LCBuYW1lLCBwYXJhbXMpICAgICAgICAgICAgICAgICBcCi0gIFVOVVNFRF9BVFRSIHN0YXRpYyBpbnQgbmFtZSMjX2NhbGxjb3VudDsgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyByZXQgbmFtZSBwYXJhbXMgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVU5VU0VEX0FUVFIgaW50IF9sb2NhbF9jYWxsY291bnQgPSBuYW1lIyNfY2FsbGNvdW50OyBcCi0gICAgbmFtZSMjX2NhbGxjb3VudCsrOwotCi0vLyBFeHBlY3QgYSBjZXJ0YWluIG51bWJlciBvZiBjYWxscyB0byB0aGUgc3BlY2lmaWVkIHN0dWIgZnVuY3Rpb24KLSNkZWZpbmUgRVhQRUNUX0NBTExfQ09VTlQobmFtZSwgY291bnQpICAgXAotICBFWFBFQ1RfRVEoKGNvdW50KSwgKG5hbWUjI19jYWxsY291bnQpKSBcCi0gICAgICA8PCAiZXhwZWN0ZWQgIiAjbmFtZSAiIHRvIGJlIGNhbGxlZCAiICNjb3VudCAiIHRpbWVzIgotCi0vLyBSZXNldCB0aGUgY2FsbCBjb3VudCBmb3IgdGhlIHNwZWNpZmljZWQgc3R1YiBmdW5jdGlvbgotI2RlZmluZSBSRVNFVF9DQUxMX0NPVU5UKG5hbWUpICgobmFtZSMjX2NhbGxjb3VudCkgPSAwKQotCi0vLyBVc2UgdGhpcyBpbiBhIHN0dWIgZnVuY3Rpb24gdG8gY2F0Y2ggdW5leHBlY3RlZCBjYWxscy4KLS8vIFByaW50cyBvdXQgYSBuaWNlIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBjYWxsIGNvdW50LCB0aGUKLS8vIHN0dWIgZnVuY3Rpb24gbmFtZSwgYW5kIHRoZSBtb2RlIGluZGV4IChzYWRseSBubyBtb2RlIG5hbWUpCi0jZGVmaW5lIFVORVhQRUNURURfQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBFWFBFQ1RfVFJVRShmYWxzZSkgPDwgInVuZXhwZWN0ZWQgY2FsbCAiIDw8IF9sb2NhbF9jYWxsY291bnQgPDwgIiB0byAiIFwKLSAgICAgICAgICAgICAgICAgICAgIDw8IF9fZnVuY19fIDw8ICIgZHVyaW5nIG1vZGUgIiA8PCAoaW50KV9jdXJyZW50X21vZGUKLQotI2RlZmluZSBNT0RFX0lTKG1vZGUpIChfY3VycmVudF9tb2RlID09IChtb2RlKSkKLQotLy8gTWFjcm8gc2VsZWN0aW9uIGhlbHBlcnMKLSNkZWZpbmUgT1ZFUkxPQURfQ0FUKEEsIEIpIEEjI0IKLSNkZWZpbmUgT1ZFUkxPQURfU0VMRUNUKE5BTUUsIE5VTSkgT1ZFUkxPQURfQ0FUKE5BTUUjI18sIE5VTSkKLSNkZWZpbmUgT1ZFUkxPQURfR0VUX0NPVU5UKF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIENPVU5ULCAuLi4pIENPVU5UCi0jZGVmaW5lIE9WRVJMT0FEX1ZBX1NJWkUoLi4uKSBPVkVSTE9BRF9HRVRfQ09VTlQoX19WQV9BUkdTX18sIDYsIDUsIDQsIDMsIDIsIDEpCi0jZGVmaW5lIE9WRVJMT0FEX09GKE5BTUUsIC4uLikgXAotICBPVkVSTE9BRF9TRUxFQ1QoTkFNRSwgT1ZFUkxPQURfVkFfU0laRShfX1ZBX0FSR1NfXykpKF9fVkFfQVJHU19fKQotCi0vLyBVc2UgdGhpcyB0byBicmFuY2ggc3R1YiBmdW5jdGlvbiBleGVjdXRpb24gdG8gYSBzcGVjaWZpYyBtb2RlIG9yIG1vZGVzLgotLy8gVHJlYXQgaXQgbGlrZSBhbiBpZiBzdGF0ZW1lbnQuIEZvciBleGFtcGxlOgotLy8KLS8vIERVUklORyhkaW5uZXIpIEVYUEVDVF9FUShicmVhZF9wdWRkaW5nLCBmb29kKTsKLS8vIERVUklORyhtaWRkYXlfc25hY2ssIG1pZG5pZ2h0X3NuYWNrKSBFWFBFQ1RfRVEoY2hvY29sYXRlLCBmb29kKTsKLSNkZWZpbmUgRFVSSU5HKC4uLikgT1ZFUkxPQURfT0YoRFVSSU5HLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBEVVJJTkdfMShtb2RlMCkgaWYgKE1PREVfSVMobW9kZTApKQotI2RlZmluZSBEVVJJTkdfMihtb2RlMCwgbW9kZTEpIGlmIChNT0RFX0lTKG1vZGUwKSB8fCBNT0RFX0lTKG1vZGUxKSkKLSNkZWZpbmUgRFVSSU5HXzMobW9kZTAsIG1vZGUxLCBtb2RlMikgXAotICBpZiAoTU9ERV9JUyhtb2RlMCkgfHwgTU9ERV9JUyhtb2RlMSkgfHwgTU9ERV9JUyhtb2RlMikpCi0jZGVmaW5lIERVUklOR180KG1vZGUwLCBtb2RlMSwgbW9kZTIsIG1vZGUzKSBcCi0gIGlmIChNT0RFX0lTKG1vZGUwKSB8fCBNT0RFX0lTKG1vZGUxKSB8fCBNT0RFX0lTKG1vZGUyKSB8fCBNT0RFX0lTKG1vZGUzKSkKLSNkZWZpbmUgRFVSSU5HXzUobW9kZTAsIG1vZGUxLCBtb2RlMiwgbW9kZTMsIG1vZGU0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKE1PREVfSVMobW9kZTApIHx8IE1PREVfSVMobW9kZTEpIHx8IE1PREVfSVMobW9kZTIpIHx8IE1PREVfSVMobW9kZTMpIHx8IFwKLSAgICAgIE1PREVfSVMobW9kZTQpKQotI2RlZmluZSBEVVJJTkdfNihtb2RlMCwgbW9kZTEsIG1vZGUyLCBtb2RlMywgbW9kZTQsIG1vZGU1KSAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoTU9ERV9JUyhtb2RlMCkgfHwgTU9ERV9JUyhtb2RlMSkgfHwgTU9ERV9JUyhtb2RlMikgfHwgTU9ERV9JUyhtb2RlMykgfHwgXAotICAgICAgTU9ERV9JUyhtb2RlNCkgfHwgTU9ERV9JUyhtb2RlNSkpCi0KLS8vIFVzZSB0aGlzIHRvIGJyYW5jaCBzdHViIGZ1bmN0aW9uIGV4ZXVjdGlvbiB0byBhIHNwZWNpZmljIGNhbGwKLS8vIGNvdW50IGluZGV4ICh6ZXJvIGJhc2VkKS4gVHJlYXQgaXQgbGlrZSBhbiBpZiBzdGF0ZW1lbnQuCi0vLyBVc3VhbGx5IG1vc3QgaGVscGZ1bCBmb2xsb3dpbmcgYSBEVVJJTkcgY2xhdXNlLiBGb3IgZXhhbXBsZToKLS8vCi0vLyBEVVJJTkcgKGJyZWFrZmFzdCkgQVRfQ0FMTCgwKSBFWFBFQ1RfRVEoYmFjb24sIGZvb2QpOwotLy8KLS8vIG9yCi0vLwotLy8gRFVSSU5HICh0aHJlZV9jb3Vyc2VfbWVhbCkgewotLy8gICBBVF9DQUxMKDApIEVYUEVDVF9FUShzaHJpbXBfY29ja3RhaWwsIGZvb2QpOwotLy8gICBBVF9DQUxMKDEpIEVYUEVDVF9FUShiYWNvbl93cmFwcGVkX2JhY29uLCBmb29kKTsKLS8vICAgQVRfQ0FMTCgxKSBFWFBFQ1RfRVEoY2hvY29sYXRlX2NvdmVyZWRfZmFrZV9ibHVlYmVycmllcywgZm9vZCk7Ci0vLyB9Ci0jZGVmaW5lIEFUX0NBTEwoaW5kZXgpIGlmIChfbG9jYWxfY2FsbGNvdW50ID09IChpbmRleCkpCi0KLS8vIERlY2xhcmUgYWxsIHRoZSBhdmFpbGFibGUgdGVzdCBtb2RlcyBmb3IgdGhlIERVUklORyBjbGF1c2VzCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyBERUNMQVJFX1RFU1RfTU9ERVMoYnJlYWtmYXN0LCBsdW5jaCwgZGlubmVyKTsKLSNkZWZpbmUgREVDTEFSRV9URVNUX01PREVTKC4uLikgICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgZW51bSB7IF9fVkFfQVJHU19fIH0gX3Rlc3RfbW9kZXNfdDsgXAotICBzdGF0aWMgX3Rlc3RfbW9kZXNfdCBfY3VycmVudF9tb2RlOwotCi0vLyBHZXQgdGhlIGN1cnJlbnQgdGVzdCBtb2RlCi0jZGVmaW5lIENVUlJFTlRfVEVTVF9NT0RFIF9jdXJyZW50X21vZGUKLQotI2RlZmluZSBURVNUX01PREVTX1QgX3Rlc3RfbW9kZXNfdApkaWZmIC0tZ2l0IGEvb3NpL3Rlc3QvdGhyZWFkX3Rlc3QuY2MgYi9vc2kvdGVzdC90aHJlYWRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViZjI1MC4uMDAwMDAwMAotLS0gYS9vc2kvdGVzdC90aHJlYWRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9yZWFjdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0KLWNsYXNzIFRocmVhZFRlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHt9OwotCi1URVNUX0YoVGhyZWFkVGVzdCwgdGVzdF9uZXdfc2ltcGxlKSB7Ci0gIHRocmVhZF90KiB0aHJlYWQgPSB0aHJlYWRfbmV3KCJ0ZXN0X3RocmVhZCIpOwotICBBU1NFUlRfVFJVRSh0aHJlYWQgIT0gTlVMTCk7Ci0gIHRocmVhZF9mcmVlKHRocmVhZCk7Ci19Ci0KLVRFU1RfRihUaHJlYWRUZXN0LCB0ZXN0X2ZyZWVfc2ltcGxlKSB7Ci0gIHRocmVhZF90KiB0aHJlYWQgPSB0aHJlYWRfbmV3KCJ0ZXN0X3RocmVhZCIpOwotICB0aHJlYWRfZnJlZSh0aHJlYWQpOwotfQotCi1URVNUX0YoVGhyZWFkVGVzdCwgdGVzdF9uYW1lKSB7Ci0gIHRocmVhZF90KiB0aHJlYWQgPSB0aHJlYWRfbmV3KCJ0ZXN0X25hbWUiKTsKLSAgQVNTRVJUX1NUUkVRKHRocmVhZF9uYW1lKHRocmVhZCksICJ0ZXN0X25hbWUiKTsKLSAgdGhyZWFkX2ZyZWUodGhyZWFkKTsKLX0KLQotVEVTVF9GKFRocmVhZFRlc3QsIHRlc3RfbG9uZ19uYW1lKSB7Ci0gIHRocmVhZF90KiB0aHJlYWQgPSB0aHJlYWRfbmV3KCIwMTIzNDU2Nzg5YWJjZGVmIik7Ci0gIEFTU0VSVF9TVFJFUSgiMDEyMzQ1Njc4OWFiY2RlZiIsIHRocmVhZF9uYW1lKHRocmVhZCkpOwotICB0aHJlYWRfZnJlZSh0aHJlYWQpOwotfQotCi1URVNUX0YoVGhyZWFkVGVzdCwgdGVzdF92ZXJ5X2xvbmdfbmFtZSkgewotICB0aHJlYWRfdCogdGhyZWFkID0gdGhyZWFkX25ldygiMDEyMzQ1Njc4OWFiY2RlZmciKTsKLSAgQVNTRVJUX1NUUkVRKCIwMTIzNDU2Nzg5YWJjZGVmIiwgdGhyZWFkX25hbWUodGhyZWFkKSk7Ci0gIHRocmVhZF9mcmVlKHRocmVhZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRocmVhZF9pc19zZWxmX2ZuKHZvaWQqIGNvbnRleHQpIHsKLSAgdGhyZWFkX3QqIHRocmVhZCA9ICh0aHJlYWRfdCopY29udGV4dDsKLSAgRVhQRUNUX1RSVUUodGhyZWFkX2lzX3NlbGYodGhyZWFkKSk7Ci19Ci0KLVRFU1RfRihUaHJlYWRUZXN0LCB0ZXN0X3RocmVhZF9pc19zZWxmKSB7Ci0gIHRocmVhZF90KiB0aHJlYWQgPSB0aHJlYWRfbmV3KCJ0ZXN0X3RocmVhZCIpOwotICB0aHJlYWRfcG9zdCh0aHJlYWQsIHRocmVhZF9pc19zZWxmX2ZuLCB0aHJlYWQpOwotICB0aHJlYWRfZnJlZSh0aHJlYWQpOwotfQotCi1URVNUX0YoVGhyZWFkVGVzdCwgdGVzdF90aHJlYWRfaXNfbm90X3NlbGYpIHsKLSAgdGhyZWFkX3QqIHRocmVhZCA9IHRocmVhZF9uZXcoInRlc3RfdGhyZWFkIik7Ci0gIEVYUEVDVF9GQUxTRSh0aHJlYWRfaXNfc2VsZih0aHJlYWQpKTsKLSAgdGhyZWFkX2ZyZWUodGhyZWFkKTsKLX0KZGlmZiAtLWdpdCBhL29zaS90ZXN0L3dha2Vsb2NrX3Rlc3QuY2MgYi9vc2kvdGVzdC93YWtlbG9ja190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ViMTZjLi4wMDAwMDAwCi0tLSBhL29zaS90ZXN0L3dha2Vsb2NrX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvd2FrZWxvY2suaCIKLQotI2luY2x1ZGUgIkFsbG9jYXRpb25UZXN0SGFybmVzcy5oIgotCi1zdGF0aWMgYm9vbCBpc193YWtlX2xvY2tfYWNxdWlyZWQgPSBmYWxzZTsKLQotc3RhdGljIGludCBhY3F1aXJlX3dha2VfbG9ja19jYihjb25zdCBjaGFyKiBsb2NrX25hbWUpIHsKLSAgaXNfd2FrZV9sb2NrX2FjcXVpcmVkID0gdHJ1ZTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHJlbGVhc2Vfd2FrZV9sb2NrX2NiKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSkgewotICBpc193YWtlX2xvY2tfYWNxdWlyZWQgPSBmYWxzZTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgYnRfb3NfY2FsbG91dHNfdCBidF93YWtlbG9ja19jYWxsb3V0cyA9IHsKLSAgICBzaXplb2YoYnRfb3NfY2FsbG91dHNfdCksIE5VTEwsIGFjcXVpcmVfd2FrZV9sb2NrX2NiLCByZWxlYXNlX3dha2VfbG9ja19jYn07Ci0KLWNsYXNzIFdha2Vsb2NrVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3MgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlNldFVwKCk7Ci0KLS8vIFRPRE8gKGphbXVyYWEpOiBtYXliZSB1c2UgYmFzZTo6Q3JlYXRlTmV3VGVtcERpcmVjdG9yeSBpbnN0ZWFkPwotI2lmIGRlZmluZWQoT1NfR0VORVJJQykKLSAgICB0bXBfZGlyXyA9ICIvdG1wL2J0d2xYWFhYWFgiOwotI2Vsc2UKLSAgICB0bXBfZGlyXyA9ICIvZGF0YS9sb2NhbC90bXAvYnR3bFhYWFhYWCI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKE9TX0dFTkVSSUMpCi0KLSAgICBjaGFyKiBidWZmZXIgPSBjb25zdF9jYXN0PGNoYXIqPih0bXBfZGlyXy5jX3N0cigpKTsKLSAgICBjaGFyKiBkdGVtcCA9IG1rZHRlbXAoYnVmZmVyKTsKLSAgICBpZiAoIWR0ZW1wKSB7Ci0gICAgICBwZXJyb3IoIkNhbid0IG1ha2Ugd2FrZSBsb2NrIHRlc3QgZGlyZWN0b3J5OiAiKTsKLSAgICAgIENIRUNLKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBsb2NrX3BhdGhfID0gdG1wX2Rpcl8gKyAiL3dha2VfbG9jayI7Ci0gICAgdW5sb2NrX3BhdGhfID0gdG1wX2Rpcl8gKyAiL3dha2VfdW5sb2NrIjsKLQotICAgIGxvY2tfcGF0aF9mZCA9IGNyZWF0KGxvY2tfcGF0aF8uY19zdHIoKSwgU19JUldYVSk7Ci0gICAgdW5sb2NrX3BhdGhfZmQgPSBjcmVhdCh1bmxvY2tfcGF0aF8uY19zdHIoKSwgU19JUldYVSk7Ci0gIH0KLQotICBpbnQgbG9ja19wYXRoX2Zkey0xfTsKLSAgaW50IHVubG9ja19wYXRoX2Zkey0xfTsKLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGlzX3dha2VfbG9ja19hY3F1aXJlZCA9IGZhbHNlOwotICAgIHdha2Vsb2NrX2NsZWFudXAoKTsKLSAgICB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHMoTlVMTCk7Ci0KLSAgICAvLyBDbGVhbiB1cCB0aGUgdGVtcCB3YWtlIGxvY2sgZGlyZWN0b3J5Ci0gICAgdW5saW5rKGxvY2tfcGF0aF8uY19zdHIoKSk7Ci0gICAgdW5saW5rKHVubG9ja19wYXRoXy5jX3N0cigpKTsKLSAgICBybWRpcih0bXBfZGlyXy5jX3N0cigpKTsKLQotICAgIGNsb3NlKGxvY2tfcGF0aF9mZCk7Ci0gICAgY2xvc2UodW5sb2NrX3BhdGhfZmQpOwotCi0gICAgQWxsb2NhdGlvblRlc3RIYXJuZXNzOjpUZWFyRG93bigpOwotICB9Ci0KLSAgLy8KLSAgLy8gVGVzdCB3aGV0aGVyIHRoZSBmaWxlLWJhc2VkIHdha2Vsb2NrIGlzIGFjcXVpcmVkLgotICAvLwotICBib29sIElzRmlsZVdha2VMb2NrQWNxdWlyZWQoKSB7Ci0gICAgYm9vbCBhY3F1aXJlZCA9IGZhbHNlOwotCi0gICAgaW50IGxvY2tfZmQgPSBvcGVuKGxvY2tfcGF0aF8uY19zdHIoKSwgT19SRE9OTFkpOwotICAgIENIRUNLKGxvY2tfZmQgPj0gMCk7Ci0KLSAgICBpbnQgdW5sb2NrX2ZkID0gb3Blbih1bmxvY2tfcGF0aF8uY19zdHIoKSwgT19SRE9OTFkpOwotICAgIENIRUNLKHVubG9ja19mZCA+PSAwKTsKLQotICAgIHN0cnVjdCBzdGF0IGxvY2tfc3RhdCwgdW5sb2NrX3N0YXQ7Ci0gICAgZnN0YXQobG9ja19mZCwgJmxvY2tfc3RhdCk7Ci0gICAgZnN0YXQodW5sb2NrX2ZkLCAmdW5sb2NrX3N0YXQpOwotCi0gICAgQ0hFQ0sobG9ja19zdGF0LnN0X3NpemUgPj0gdW5sb2NrX3N0YXQuc3Rfc2l6ZSk7Ci0KLSAgICB2b2lkKiBsb2NrX2ZpbGUgPQotICAgICAgICBtbWFwKG51bGxwdHIsIGxvY2tfc3RhdC5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBsb2NrX2ZkLCAwKTsKLQotICAgIHZvaWQqIHVubG9ja19maWxlID0gbW1hcChudWxscHRyLCB1bmxvY2tfc3RhdC5zdF9zaXplLCBQUk9UX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFLCB1bmxvY2tfZmQsIDApOwotCi0gICAgaWYgKG1lbWNtcChsb2NrX2ZpbGUsIHVubG9ja19maWxlLCB1bmxvY2tfc3RhdC5zdF9zaXplKSA9PSAwKSB7Ci0gICAgICBhY3F1aXJlZCA9IGxvY2tfc3RhdC5zdF9zaXplID4gdW5sb2NrX3N0YXQuc3Rfc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gdGhlc2UgZmlsZXMgc2hvdWxkIGFsd2F5cyBlaXRoZXIgYmUgd2l0aCBhIGxvY2sgdGhhdCBoYXMgbW9yZSwKLSAgICAgIC8vIG9yIGVxdWFsLgotICAgICAgQ0hFQ0soZmFsc2UpOwotICAgIH0KLQotICAgIG11bm1hcChsb2NrX2ZpbGUsIGxvY2tfc3RhdC5zdF9zaXplKTsKLSAgICBtdW5tYXAodW5sb2NrX2ZpbGUsIHVubG9ja19zdGF0LnN0X3NpemUpOwotICAgIGNsb3NlKGxvY2tfZmQpOwotICAgIGNsb3NlKHVubG9ja19mZCk7Ci0KLSAgICByZXR1cm4gYWNxdWlyZWQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB0bXBfZGlyXzsKLSAgc3RkOjpzdHJpbmcgbG9ja19wYXRoXzsKLSAgc3RkOjpzdHJpbmcgdW5sb2NrX3BhdGhfOwotfTsKLQotVEVTVF9GKFdha2Vsb2NrVGVzdCwgdGVzdF9zZXRfb3NfY2FsbG91dHMpIHsKLSAgd2FrZWxvY2tfc2V0X29zX2NhbGxvdXRzKCZidF93YWtlbG9ja19jYWxsb3V0cyk7Ci0KLSAgLy8gSW5pdGlhbGx5LCB0aGUgd2FrZWxvY2sgaXMgbm90IGFjcXVpcmVkCi0gIEFTU0VSVF9GQUxTRShpc193YWtlX2xvY2tfYWNxdWlyZWQpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0gICAgd2FrZWxvY2tfYWNxdWlyZSgpOwotICAgIEFTU0VSVF9UUlVFKGlzX3dha2VfbG9ja19hY3F1aXJlZCk7Ci0gICAgd2FrZWxvY2tfcmVsZWFzZSgpOwotICAgIEFTU0VSVF9GQUxTRShpc193YWtlX2xvY2tfYWNxdWlyZWQpOwotICB9Ci19Ci0KLVRFU1RfRihXYWtlbG9ja1Rlc3QsIHRlc3Rfc2V0X3BhdGhzKSB7Ci0gIHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cyhOVUxMKTsgIC8vIE1ha2Ugc3VyZSB3ZSB1c2UgbmF0aXZlIHdha2Vsb2NrcwotICB3YWtlbG9ja19zZXRfcGF0aHMobG9ja19wYXRoXy5jX3N0cigpLCB1bmxvY2tfcGF0aF8uY19zdHIoKSk7Ci0KLSAgLy8gSW5pdGlhbGx5LCB0aGUgd2FrZWxvY2sgaXMgbm90IGFjcXVpcmVkCi0gIEFTU0VSVF9GQUxTRShJc0ZpbGVXYWtlTG9ja0FjcXVpcmVkKCkpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Ci0gICAgd2FrZWxvY2tfYWNxdWlyZSgpOwotICAgIEFTU0VSVF9UUlVFKElzRmlsZVdha2VMb2NrQWNxdWlyZWQoKSk7Ci0gICAgd2FrZWxvY2tfcmVsZWFzZSgpOwotICAgIEFTU0VSVF9GQUxTRShJc0ZpbGVXYWtlTG9ja0FjcXVpcmVkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrZXQvQW5kcm9pZC5icCBiL3BhY2tldC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJlMmIxLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWItYnQtcGFja2V0cyIsCi0gICAgZGVmYXVsdHM6IFsibGliY2hyb21lX3N1cHBvcnRfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICIuL2luY2x1ZGUiLAotICAgICAgICAiLi8iLAotICAgIF0sCi0gICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYi1idC1wYWNrZXRzLWJhc2UiLAotICAgICAgICAibGliLWJ0LXBhY2tldHMtYXZyY3AiLAotICAgIF0sCi0gICAgYXBleF9hdmFpbGFibGU6IFsKLSAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCi0gICAgXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2J0cGFja2V0cyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInRlc3RzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3RzL2F2cmNwL2F2cmNwX2Jyb3dzZV9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC9hdnJjcF9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC9hdnJjcF9yZWplY3RfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYXZyY3AvY2hhbmdlX3BhdGhfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYXZyY3AvZ2VuZXJhbF9yZWplY3RfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYXZyY3AvZ2V0X2NhcGFiaWxpdGllc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3RzL2F2cmNwL2dldF9mb2xkZXJfaXRlbXNfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYXZyY3AvZ2V0X2l0ZW1fYXR0cmlidXRlc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC9nZXRfcGxheV9zdGF0dXNfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYXZyY3AvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC9wYXNzX3Rocm91Z2hfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYXZyY3AvcGxheV9pdGVtX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3RzL2F2cmNwL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3RzL2F2cmNwL3NldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICAgInRlc3RzL2F2cmNwL3NldF9icm93c2VkX3BsYXllcl9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9hdnJjcC92ZW5kb3JfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgICAidGVzdHMvYmFzZS9pdGVyYXRvcl90ZXN0LmNjIiwKLSAgICAgICAgInRlc3RzL2Jhc2UvcGFja2V0X2J1aWxkZXJfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0cy9iYXNlL3BhY2tldF90ZXN0LmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9wYWNrZXQvQlVJTEQuZ24gYi9wYWNrZXQvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMmMwZDguLjAwMDAwMDAKLS0tIGEvcGFja2V0L0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE4IEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1jb25maWcoInBhY2tldF9jb25maWciKSB7Ci0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiLy9idC8iLAotICAgICIvL2J0L2luY2x1ZGUiLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICIvL2J0L3Byb2ZpbGUvYXZyY3AiLAotICBdCi0KLSAgY29uZmlncyA9IFsgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiBdCi19Ci0KLXN0YXRpY19saWJyYXJ5KCJwYWNrZXQiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImF2cmNwL2dldF9mb2xkZXJfaXRlbXMuY2MiLAotICAgICJhdnJjcC9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcGFja2V0LmNjIiwKLSAgICAiYXZyY3AvY2hhbmdlX3BhdGguY2MiLAotICAgICJhdnJjcC9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zLmNjIiwKLSAgICAiYXZyY3AvY2FwYWJpbGl0aWVzX3BhY2tldC5jYyIsCi0gICAgImF2cmNwL3Bhc3NfdGhyb3VnaF9wYWNrZXQuY2MiLAotICAgICJhdnJjcC9zZXRfYnJvd3NlZF9wbGF5ZXIuY2MiLAotICAgICJhdnJjcC9hdnJjcF9yZWplY3RfcGFja2V0LmNjIiwKLSAgICAiYXZyY3Avc2V0X2Fic29sdXRlX3ZvbHVtZS5jYyIsCi0gICAgImF2cmNwL2F2cmNwX3BhY2tldC5jYyIsCi0gICAgImF2cmNwL2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcGFja2V0LmNjIiwKLSAgICAiYXZyY3AvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldC5jYyIsCi0gICAgImF2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldC5jYyIsCi0gICAgImF2cmNwL2F2cmNwX2Jyb3dzZV9wYWNrZXQuY2MiLAotICAgICJhdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzLmNjIiwKLSAgICAiYXZyY3AvcGxheV9pdGVtLmNjIiwKLSAgICAiYXZyY3AvdmVuZG9yX3BhY2tldC5jYyIsCi0gICAgImF2cmNwL3NldF9hZGRyZXNzZWRfcGxheWVyLmNjIiwKLSAgICAiYmFzZS9pdGVyYXRvci5jYyIsCi0gICAgImJhc2UvcGFja2V0LmNjIiwKLSAgICAiYmFzZS9wYWNrZXRfYnVpbGRlci5jYyIsCi0gXQotCi0gIGNvbmZpZ3MgKz0gWyI6cGFja2V0X2NvbmZpZyJdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBleGVjdXRhYmxlKCJuZXRfdGVzdF9idHBhY2tldHMiKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICJ0ZXN0cy9hdnJjcC9hdnJjcF9icm93c2VfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgInRlc3RzL2F2cmNwL2F2cmNwX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC9hdnJjcF9yZWplY3RfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgInRlc3RzL2F2cmNwL2NoYW5nZV9wYXRoX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC9nZW5lcmFsX3JlamVjdF9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3AvZ2V0X2NhcGFiaWxpdGllc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3AvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3AvZ2V0X2ZvbGRlcl9pdGVtc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3AvZ2V0X2l0ZW1fYXR0cmlidXRlc19wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3AvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC9wYXNzX3Rocm91Z2hfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgInRlc3RzL2F2cmNwL3BsYXlfaXRlbV9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3AvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllcl9wYWNrZXRfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYXZyY3Avc2V0X2Jyb3dzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcC92ZW5kb3JfcGFja2V0X3Rlc3QuY2MiLAotICAgICAgInRlc3RzL2Jhc2UvaXRlcmF0b3JfdGVzdC5jYyIsCi0gICAgICAidGVzdHMvYmFzZS9wYWNrZXRfYnVpbGRlcl90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9iYXNlL3BhY2tldF90ZXN0LmNjIiwKLSAgICBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgICAiLy9idC9wYWNrZXQvYXZyY3AiLAotICAgICAgIi8vYnQvcGFja2V0L2Jhc2UiLAotICAgICAgIi8vYnQvcGFja2V0L2luY2x1ZGUiLAotICAgICAgIi8vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICIvL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAiLy9idC9wYWNrZXQvdGVzdHMvYmFzZSIsCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICI6cGFja2V0IiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICI6cGFja2V0X2NvbmZpZyIsCi0gICAgICAiLy9idDpleHRlcm5hbF9nbW9ja19tYWluIiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9BbmRyb2lkLmJwIGIvcGFja2V0L2F2cmNwL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmFhOTcuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYi1idC1wYWNrZXRzLWF2cmNwIiwKLSAgICBkZWZhdWx0czogWyJsaWJjaHJvbWVfc3VwcG9ydF9kZWZhdWx0cyJdLAotICAgIGhlYWRlcl9saWJzOiBbImF2cmNwX2hlYWRlcnMiXSwKLSAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImF2cmNwX2hlYWRlcnMiXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiYXZyY3BfYnJvd3NlX3BhY2tldC5jYyIsCi0gICAgICAgICJhdnJjcF9wYWNrZXQuY2MiLAotICAgICAgICAiYXZyY3BfcmVqZWN0X3BhY2tldC5jYyIsCi0gICAgICAgICJjYXBhYmlsaXRpZXNfcGFja2V0LmNjIiwKLSAgICAgICAgImNoYW5nZV9wYXRoLmNjIiwKLSAgICAgICAgImdlbmVyYWxfcmVqZWN0X3BhY2tldC5jYyIsCi0gICAgICAgICJnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5jYyIsCi0gICAgICAgICJnZXRfZm9sZGVyX2l0ZW1zLmNjIiwKLSAgICAgICAgImdldF9pdGVtX2F0dHJpYnV0ZXMuY2MiLAotICAgICAgICAiZ2V0X3BsYXlfc3RhdHVzX3BhY2tldC5jYyIsCi0gICAgICAgICJnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zLmNjIiwKLSAgICAgICAgInBhc3NfdGhyb3VnaF9wYWNrZXQuY2MiLAotICAgICAgICAicGxheV9pdGVtLmNjIiwKLSAgICAgICAgInJlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXQuY2MiLAotICAgICAgICAic2V0X2Fic29sdXRlX3ZvbHVtZS5jYyIsCi0gICAgICAgICJzZXRfYWRkcmVzc2VkX3BsYXllci5jYyIsCi0gICAgICAgICJzZXRfYnJvd3NlZF9wbGF5ZXIuY2MiLAotICAgICAgICAidmVuZG9yX3BhY2tldC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliLWJ0LXBhY2tldHMtYmFzZSIsCi0gICAgXSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2F2cmNwX2Jyb3dzZV9wYWNrZXQuY2MgYi9wYWNrZXQvYXZyY3AvYXZyY3BfYnJvd3NlX3BhY2tldC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiNTQ4NS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvYXZyY3AvYXZyY3BfYnJvd3NlX3BhY2tldC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhdnJjcF9icm93c2VfcGFja2V0LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8QnJvd3NlUGFja2V0QnVpbGRlcj4gQnJvd3NlUGFja2V0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgQnJvd3NlUGR1IHBkdSwgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPiBwYXlsb2FkKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCcm93c2VQYWNrZXRCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCcm93c2VQYWNrZXRCdWlsZGVyPihuZXcgQnJvd3NlUGFja2V0QnVpbGRlcihwZHUpKTsKLQotICBidWlsZGVyLT5wYXlsb2FkXyA9IHN0ZDo6bW92ZShwYXlsb2FkKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IEJyb3dzZVBhY2tldEJ1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBwYXlsb2FkXy0+c2l6ZSgpOwotfQotCi1ib29sIEJyb3dzZVBhY2tldEJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIFB1c2hIZWFkZXIocGt0LCBwYXlsb2FkXy0+c2l6ZSgpKTsKLQotICByZXR1cm4gcGF5bG9hZF8tPlNlcmlhbGl6ZShwa3QpOwotfQotCi12b2lkIEJyb3dzZVBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QsIHVpbnQxNl90IGxlbmd0aCkgewotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsICh1aW50OF90KXBkdV8pOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKGxlbmd0aCkpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8QnJvd3NlUGFja2V0PiBCcm93c2VQYWNrZXQ6OlBhcnNlKAotICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiBwa3QpIHsKLSAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxCcm93c2VQYWNrZXQ+KG5ldyBCcm93c2VQYWNrZXQocGt0KSk7Ci19Ci0KLUJyb3dzZVBkdSBCcm93c2VQYWNrZXQ6OkdldFBkdSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEJyb3dzZVBkdT4oKmJlZ2luKCkpOwotfQotCi11aW50MTZfdCBCcm93c2VQYWNrZXQ6OkdldExlbmd0aCgpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpOwotICByZXR1cm4gaXQuZXh0cmFjdEJFPHVpbnQxNl90PigpOwotfQotCi1ib29sIEJyb3dzZVBhY2tldDo6SXNWYWxpZCgpIGNvbnN0IHsKLSAgaWYgKHNpemUoKSA8IGtNaW5TaXplKCkpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHNpemUoKSA9PSBHZXRMZW5ndGgoKSArIGtNaW5TaXplKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEJyb3dzZVBhY2tldDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiQXZyY3BCcm93c2VQYWNrZXQ6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUERVID0gIiA8PCBHZXRQZHUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBMZW5ndGggPSAiIDw8IEdldExlbmd0aCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBheWxvYWQgPSI7Ci0gIGZvciAoYXV0byBpdCA9IGJlZ2luKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDMpOyBpdCAhPSBlbmQoKTsgaXQrKykgewotICAgIHNzIDw8ICIgIiA8PCBsb2doZXgoKml0KTsKLSAgfQotICBzcyA8PCBzdGQ6OmVuZGw7Ci0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi1zdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IEJyb3dzZVBhY2tldDo6R2V0UGF5bG9hZEluZGVjaWVzKCkgY29uc3QgewotICByZXR1cm4gc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PihwYWNrZXRfc3RhcnRfaW5kZXhfICsgMywgcGFja2V0X2VuZF9pbmRleF8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9hdnJjcF9icm93c2VfcGFja2V0LmggYi9wYWNrZXQvYXZyY3AvYXZyY3BfYnJvd3NlX3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzhmNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9hdnJjcF9icm93c2VfcGFja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9hdnJjcC9hdnJjcF9jb21tb24uaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9hdnJjcC9hdnJjcF9sb2dnaW5nX2hlbHBlci5oIgotI2luY2x1ZGUgInBhY2tldC9iYXNlL2l0ZXJhdG9yLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2UvcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2UvcGFja2V0X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1jbGFzcyBCcm93c2VQYWNrZXRCdWlsZGVyIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkJyb3dzZVBhY2tldEJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxCcm93c2VQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIEJyb3dzZVBkdSBwZHUsIHN0ZDo6dW5pcXVlX3B0cjw6OmJsdWV0b290aDo6UGFja2V0QnVpbGRlcj4gcGF5bG9hZCk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBCcm93c2VQZHUgcGR1XzsKLSAgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPiBwYXlsb2FkXzsKLQotICB2b2lkIFB1c2hIZWFkZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgpOwotCi0gIEJyb3dzZVBhY2tldEJ1aWxkZXIoQnJvd3NlUGR1IHBkdSkgOiBwZHVfKHBkdSl7fTsKLX07Ci0KLWNsYXNzIEJyb3dzZVBhY2tldCA6IHB1YmxpYyA6OmJsdWV0b290aDo6UGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkJyb3dzZVBhY2tldCgpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEJyb3dzZVBhY2tldD4gUGFyc2UoCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4gcGt0KTsKLQotICAvKioKLSAgICogQXZyY3AgQnJvd3NlIFBhY2tldCBMYXlvdXQKLSAgICogICB1aW50OF90IHBkdV87Ci0gICAqICAgdWludDE2X3QgbGVuZ3RoXzsKLSAgICogICB1aW50OF90W10gcGF5bG9hZF87Ci0gICAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluU2l6ZSgpIHsgcmV0dXJuIDM7IH0KLQotICBCcm93c2VQZHUgR2V0UGR1KCkgY29uc3Q7Ci0gIHVpbnQxNl90IEdldExlbmd0aCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdXNpbmcgOjpibHVldG9vdGg6OlBhY2tldDo6UGFja2V0OwotCi0gcHJpdmF0ZToKLSAgdmlydHVhbCBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IEdldFBheWxvYWRJbmRlY2llcygpIGNvbnN0IG92ZXJyaWRlOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQnJvd3NlUGFja2V0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9hdnJjcF9wYWNrZXQuY2MgYi9wYWNrZXQvYXZyY3AvYXZyY3BfcGFja2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU3NTlhLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9hdnJjcF9wYWNrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotI2luY2x1ZGUgImF2cmNwX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxQYWNrZXRCdWlsZGVyPiBQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICBDVHlwZSB0eXBlLCB1aW50OF90IHN1YnVuaXRfdHlwZSwgdWludDhfdCBzdWJ1bml0X2lkLCBPcGNvZGUgb3Bjb2RlLAotICAgIHN0ZDo6dW5pcXVlX3B0cjw6OmJsdWV0b290aDo6UGFja2V0QnVpbGRlcj4gcGF5bG9hZCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8UGFja2V0QnVpbGRlcj4gYnVpbGRlciA9IHN0ZDo6dW5pcXVlX3B0cjxQYWNrZXRCdWlsZGVyPigKLSAgICAgIG5ldyBQYWNrZXRCdWlsZGVyKHR5cGUsIHN1YnVuaXRfdHlwZSwgc3VidW5pdF9pZCwgb3Bjb2RlKSk7Ci0KLSAgYnVpbGRlci0+cGF5bG9hZF8gPSBzdGQ6Om1vdmUocGF5bG9hZCk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXNpemVfdCBQYWNrZXRCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICAvLyBUaGUgc2l6ZSBvZiB0aGUgaGVhZGVyIGZvciBhbiBQYWNrZXQgaXMgMwotICByZXR1cm4gcGF5bG9hZF8tPnNpemUoKSArIFBhY2tldDo6a01pblNpemUoKTsKLX0KLQotYm9vbCBQYWNrZXRCdWlsZGVyOjpTZXJpYWxpemUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIHsKLSAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICAvLyBQdXNoIHRoZSBoZWFkZXIgZm9yIHRoZSBwYWNrZXQKLSAgUHVzaEhlYWRlcihwa3QpOwotCi0gIC8vIFB1c2ggdGhlIHBheWxvYWQgZm9yIHRoZSBwYWNrZXQKLSAgcmV0dXJuIHBheWxvYWRfLT5TZXJpYWxpemUocGt0KTsKLX0KLQotdm9pZCBQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oY190eXBlXykpOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIChzdWJ1bml0X3R5cGVfIDw8IDMpIHwgc3VidW5pdF9pZF8pOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG9wY29kZV8pKTsKLX0KLQotYm9vbCBQYWNrZXRCdWlsZGVyOjpQdXNoQ29tcGFueUlkKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0LCB1aW50MzJfdCBjb21wYW55X2lkKSB7Ci0gIGNvbXBhbnlfaWQgPSBiYXNlOjpCeXRlU3dhcChjb21wYW55X2lkKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBjb21wYW55X2lkID4+PSA4OwotICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgY29tcGFueV9pZCAmIDB4RkYpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+IFBhY2tldDo6UGFyc2UoCi0gICAgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+IHBrdCkgewotICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFBhY2tldD4obmV3IFBhY2tldChwa3QpKTsKLX0KLQotQ1R5cGUgUGFja2V0OjpHZXRDVHlwZSgpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZSA9ICpiZWdpbigpICYgMHgwRjsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENUeXBlPih2YWx1ZSk7Ci19Ci0KLXVpbnQ4X3QgUGFja2V0OjpHZXRTdWJ1bml0VHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICooYmVnaW4oKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMSkpID4+IDM7Ci19Ci0KLXVpbnQ4X3QgUGFja2V0OjpHZXRTdWJ1bml0SWQoKSBjb25zdCB7Ci0gIHJldHVybiAqKGJlZ2luKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpKSAmIDBiMDAwMDAxMTE7Ci19Ci0KLU9wY29kZSBQYWNrZXQ6OkdldE9wY29kZSgpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZSA9ICooYmVnaW4oKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMikpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8T3Bjb2RlPih2YWx1ZSk7Ci19Ci0KLWJvb2wgUGFja2V0OjpJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID49IGtNaW5TaXplKCk7IH0KLQotc3RkOjpzdHJpbmcgUGFja2V0OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJhdnJjcDo6UGFja2V0OiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIGNUeXBlID0gIiA8PCBHZXRDVHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgVHlwZSA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRUeXBlKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgSUQgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgT3BDb2RlID0gIiA8PCBHZXRPcGNvZGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBQYXlsb2FkID0iOwotICBmb3IgKGF1dG8gaXQgPSBiZWdpbigpICsgc3RhdGljX2Nhc3Q8c2l6ZV90PigzKTsgaXQgIT0gZW5kKCk7IGl0KyspIHsKLSAgICBzcyA8PCAiICIgPDwgbG9naGV4KCppdCk7Ci0gIH0KLSAgc3MgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBQYWNrZXQ6OkdldFBheWxvYWRJbmRlY2llcygpIGNvbnN0IHsKLSAgcmV0dXJuIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4ocGFja2V0X3N0YXJ0X2luZGV4XyArIDMsIHBhY2tldF9lbmRfaW5kZXhfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2F2cmNwX3BhY2tldC5oIGIvcGFja2V0L2F2cmNwL2F2cmNwX3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlMGQ1Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9hdnJjcF9wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9hdnJjcC9hdnJjcF9jb21tb24uaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9hdnJjcC9hdnJjcF9sb2dnaW5nX2hlbHBlci5oIgotI2luY2x1ZGUgInBhY2tldC9iYXNlL2l0ZXJhdG9yLmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2UvcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2UvcGFja2V0X2J1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1jbGFzcyBQYWNrZXRCdWlsZGVyIDogcHVibGljIDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflBhY2tldEJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIENUeXBlIGNUeXBlLCB1aW50OF90IHN1YnVuaXRfdHlwZSwgdWludDhfdCBzdWJ1bml0X2lkLCBPcGNvZGUgb3Bjb2RlLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPiBwYWNrZXQpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgQ1R5cGUgY190eXBlXzsKLSAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgdWludDhfdCBzdWJ1bml0X2lkXyA6IDM7Ci0gIE9wY29kZSBvcGNvZGVfOwotICBzdGQ6OnVuaXF1ZV9wdHI8OjpibHVldG9vdGg6OlBhY2tldEJ1aWxkZXI+IHBheWxvYWRfOwotCi0gIHZvaWQgUHVzaEhlYWRlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCk7Ci0gIGJvb2wgUHVzaENvbXBhbnlJZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbXBhbnlfaWQpOwotCi0gIFBhY2tldEJ1aWxkZXIoQ1R5cGUgdHlwZSwgdWludDhfdCBzdWJ1bml0X3R5cGUsIHVpbnQ4X3Qgc3VidW5pdF9pZCwKLSAgICAgICAgICAgICAgICBPcGNvZGUgb3Bjb2RlKQotICAgICAgOiBjX3R5cGVfKHR5cGUpLAotICAgICAgICBzdWJ1bml0X3R5cGVfKHN1YnVuaXRfdHlwZSksCi0gICAgICAgIHN1YnVuaXRfaWRfKHN1YnVuaXRfaWQpLAotICAgICAgICBvcGNvZGVfKG9wY29kZSl7fTsKLX07Ci0KLWNsYXNzIFBhY2tldCA6IHB1YmxpYyA6OmJsdWV0b290aDo6UGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflBhY2tldCgpID0gZGVmYXVsdDsKLQotICAvLyBUT0RPIChhcGFuaWNrZSk6IFJpZ2h0IG5vdyB3ZSBjYW4gdXNlIHRoaXMgdG8gYnVpbGQgYW4gQXZyY3BQYWNrZXQgZnJvbQotICAvLyBhbm90aGVyIHBhY2tldCB0eXBlLiBJbiB0aGUgZnV0dXJlLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgaW4gZmF2b3Igb2YKLSAgLy8gZ2V0dGluZyBhbiBBVlJDUCBQYWNrZXQgZGlyZWN0bHkgZnJvbSBhbiBBVkNUUCBQYWNrZXQKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+IFBhcnNlKAotICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+IHBrdCk7Ci0KLSAgLyoqCi0gICAqIEF2cmNwIFBhY2tldCBMYXlvdXQKLSAgICogICBDVHlwZSBjX3R5cGVfOwotICAgKiAgIHVpbnQ4X3Qgc3VidW5pdF90eXBlXyA6IDU7Ci0gICAqICAgdWludDhfdCBzdWJ1bml0X2lkXyA6IDM7Ci0gICAqICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgdWludDhfdFtdIHBheWxvYWRfOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiAzOyB9OwotCi0gIC8vIEdldHRlciBGdW5jdGlvbnMKLSAgQ1R5cGUgR2V0Q1R5cGUoKSBjb25zdDsKLSAgdWludDhfdCBHZXRTdWJ1bml0VHlwZSgpIGNvbnN0OwotICB1aW50OF90IEdldFN1YnVuaXRJZCgpIGNvbnN0OwotICBPcGNvZGUgR2V0T3Bjb2RlKCkgY29uc3Q7Ci0KLSAgLy8gT3ZlcmxvYWRlZCBGdW5jdGlvbnMKLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyA6OmJsdWV0b290aDo6UGFja2V0OjpQYWNrZXQ7Ci0KLSAgc3RhdGljIGlubGluZSB1aW50MzJfdCBQdWxsQ29tcGFueUlkKEl0ZXJhdG9yIGl0KSB7Ci0gICAgdWludDMyX3QgdmFsdWUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICB2YWx1ZSA8PD0gODsKLSAgICAgIHZhbHVlIHw9ICppdCsrOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZpcnR1YWwgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBHZXRQYXlsb2FkSW5kZWNpZXMoKSBjb25zdCBvdmVycmlkZTsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFBhY2tldCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9hdnJjcF9yZWplY3RfcGFja2V0LmNjIGIvcGFja2V0L2F2cmNwL2F2cmNwX3JlamVjdF9wYWNrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWQ3YWQuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2F2cmNwX3JlamVjdF9wYWNrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYXZyY3BfcmVqZWN0X3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxSZWplY3RCdWlsZGVyPiBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihDb21tYW5kUGR1IHBkdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcmVhc29uKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxSZWplY3RCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWplY3RCdWlsZGVyPihuZXcgUmVqZWN0QnVpbGRlcihwZHUsIHJlYXNvbikpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zaXplX3QgUmVqZWN0QnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIDE7IH0KLQotYm9vbCBSZWplY3RCdWlsZGVyOjpTZXJpYWxpemUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIHsKLSAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICAvLyBQdXNoIHRoZSBzdGFuZGFyZCBhdnJjcCBoZWFkZXJzCi0gIFBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0KTsKLQotICAvLyBQdXNoIHRoZSBhdnJjcCB2ZW5kb3IgY29tbWFuZCBoZWFkZXJzCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCAxKTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlYXNvbl8pKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2F2cmNwX3JlamVjdF9wYWNrZXQuaCBiL3BhY2tldC9hdnJjcC9hdnJjcF9yZWplY3RfcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2YzYTkuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2F2cmNwX3JlamVjdF9wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWNsYXNzIFJlamVjdEJ1aWxkZXIgOiBwdWJsaWMgVmVuZG9yUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5SZWplY3RCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UmVqZWN0QnVpbGRlcj4gTWFrZUJ1aWxkZXIoQ29tbWFuZFBkdSBwZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHJlYXNvbik7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBTdGF0dXMgcmVhc29uXzsKLQotICBSZWplY3RCdWlsZGVyKENvbW1hbmRQZHUgcGR1LCBTdGF0dXMgcmVhc29uKQotICAgICAgOiBWZW5kb3JQYWNrZXRCdWlsZGVyKENUeXBlOjpSRUpFQ1RFRCwgcGR1LCBQYWNrZXRUeXBlOjpTSU5HTEUpLAotICAgICAgICByZWFzb25fKHJlYXNvbil7fTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9jYXBhYmlsaXRpZXNfcGFja2V0LmNjIGIvcGFja2V0L2F2cmNwL2NhcGFiaWxpdGllc19wYWNrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OWI0N2QuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2NhcGFiaWxpdGllc19wYWNrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImNhcGFiaWxpdGllc19wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8R2V0Q2FwYWJpbGl0aWVzUmVxdWVzdEJ1aWxkZXI+Ci1HZXRDYXBhYmlsaXRpZXNSZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0QnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0QnVpbGRlcihjYXBhYmlsaXR5KSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXNpemVfdCBHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0QnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldENhcGFiaWxpdGllc1JlcXVlc3Q6OmtNaW5TaXplKCk7Ci19Ci0KLWJvb2wgR2V0Q2FwYWJpbGl0aWVzUmVxdWVzdEJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIC8vIFB1c2ggdGhlIHN0YW5kYXJkIGF2cmNwIGhlYWRlcnMKLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIC8vIFB1c2ggdGhlIGF2cmNwIHZlbmRvciBjb21tYW5kIGhlYWRlcnMsIHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGlzIGFsd2F5cyAxCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCAxKTsKLQotICAvLyBQdXNoIHRoZSBjYXBhYmlsaXR5Ci0gIHJldHVybiBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNhcGFiaWxpdHlfKSk7Ci19Ci0KLUNhcGFiaWxpdHkgR2V0Q2FwYWJpbGl0aWVzUmVxdWVzdDo6R2V0Q2FwYWJpbGl0eVJlcXVlc3RlZCgpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZSA9ICooYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDYXBhYmlsaXR5Pih2YWx1ZSk7Ci19Ci0KLWJvb2wgR2V0Q2FwYWJpbGl0aWVzUmVxdWVzdDo6SXNWYWxpZCgpIGNvbnN0IHsKLSAgaWYgKCFWZW5kb3JQYWNrZXQ6OklzVmFsaWQoKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gKHNpemUoKSA9PSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyAxKTsKLX0KLQotc3RkOjpzdHJpbmcgR2V0Q2FwYWJpbGl0aWVzUmVxdWVzdDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiQXZyY3BDYXBhYmlsaXR5UmVxUGFja2V0OiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIGNUeXBlID0gIiA8PCBHZXRDVHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgVHlwZSA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRUeXBlKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgSUQgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgT3BDb2RlID0gIiA8PCBHZXRPcGNvZGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBDb21wYW55IElEID0gIiA8PCBsb2doZXgoR2V0Q29tcGFueUlkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIENvbW1hbmQgUERVID0gIiA8PCBHZXRDb21tYW5kUGR1KCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGFja2V0VHlwZSA9ICIgPDwgR2V0UGFja2V0VHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBhcmFtZXRlciBMZW5ndGggPSAiIDw8IGxvZ2hleChHZXRQYXJhbWV0ZXJMZW5ndGgoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgQ2FwYWJpbGl0aWVzIFJlcXVlc3QgPSAiIDw8IEdldENhcGFiaWxpdHlSZXF1ZXN0ZWQoKSA8PCBzdGQ6OmVuZGw7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcj4KLUdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUNvbXBhbnlJZEJ1aWxkZXIoCi0gICAgdWludDMyX3QgY29tcGFueV9pZF9lbGVtZW50KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyKENhcGFiaWxpdHk6OkNPTVBBTllfSUQpKTsKLQotICBjb21wYW55X2lkX2VsZW1lbnQgJj0gMHgwMEZGRkZGRjsKLSAgYnVpbGRlci0+ZWxlbWVudHNfLmluc2VydChjb21wYW55X2lkX2VsZW1lbnQpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8R2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyPgotR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlRXZlbnRzU3VwcG9ydGVkQnVpbGRlcihFdmVudCBldmVudCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8R2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcihDYXBhYmlsaXR5OjpFVkVOVFNfU1VQUE9SVEVEKSk7Ci0KLSAgYnVpbGRlci0+ZWxlbWVudHNfLmluc2VydChzdGF0aWNfY2FzdDx1aW50OF90PihldmVudCkpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1HZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXIqIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6QWRkQ29tcGFueUlkKAotICAgIHVpbnQzMl90IGNvbXBhbnlfaWQpIHsKLSAgQ0hFQ0tfRVEoY2FwYWJpbGl0eV8sIENhcGFiaWxpdHk6OkNPTVBBTllfSUQpOwotICBDSEVDS19MVChlbGVtZW50c18uc2l6ZSgpLCBzaXplX3QoMHhGRikpCi0gICAgICA8PCBfX2Z1bmNfXyA8PCAiOiBtYXhpbXVtIGNhcGFiaWxpdHkgY291bnQgcmVhY2hlZCI7Ci0KLSAgY29tcGFueV9pZCAmPSAweDAwRkZGRkZGOwotICBlbGVtZW50c18uaW5zZXJ0KGNvbXBhbnlfaWQpOwotCi0gIHJldHVybiB0aGlzOwotfQotCi1HZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXIqIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6QWRkRXZlbnQoCi0gICAgRXZlbnQgZXZlbnQpIHsKLSAgQ0hFQ0tfRVEoY2FwYWJpbGl0eV8sIENhcGFiaWxpdHk6OkVWRU5UU19TVVBQT1JURUQpOwotICBDSEVDS19MVChlbGVtZW50c18uc2l6ZSgpLCBzaXplX3QoMHhGRikpCi0gICAgICA8PCBfX2Z1bmNfXyA8PCAiOiBtYXhpbXVtIGNhcGFiaWxpdHkgY291bnQgcmVhY2hlZCI7Ci0KLSAgZWxlbWVudHNfLmluc2VydChzdGF0aWNfY2FzdDx1aW50OF90PihldmVudCkpOwotCi0gIHJldHVybiB0aGlzOwotfQotCi1zaXplX3QgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICAvLyBDb21wYW55IElEJ3MgaGF2ZSBhIHNpemUgb2YgMyB3aGlsZSBFdmVudHMgaGF2ZSBhIHNpemUgb2YgMQotICBzaXplX3QgY2FwYWJpbGl0eV9jb3VudCA9IGVsZW1lbnRzXy5zaXplKCk7Ci0gIHNpemVfdCBjYXBhYmlsaXR5X3NpemUgPSBjYXBhYmlsaXR5XyA9PSBDYXBhYmlsaXR5OjpDT01QQU5ZX0lEID8gMyA6IDE7Ci0KLSAgcmV0dXJuIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlOjprTWluU2l6ZSgpICsKLSAgICAgICAgIChjYXBhYmlsaXR5X2NvdW50ICogY2FwYWJpbGl0eV9zaXplKTsKLX0KLQotYm9vbCBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIC8vIFB1c2ggdGhlIHN0YW5kYXJkIGF2cmNwIGhlYWRlcnMKLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIC8vIFB1c2ggdGhlIGF2cmNwIHZlbmRvciBjb21tYW5kIGhlYWRlcnMKLSAgdWludDE2X3QgcGFyYW1ldGVyX2NvdW50ID0gc2l6ZSgpIC0gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpOwotICBWZW5kb3JQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKHBrdCwgcGFyYW1ldGVyX2NvdW50KTsKLQotICAvLyBQdXNoIHRoZSBjYXBhYmlsaXR5LCBjYXBhYmlsaXR5IGNvdW50LCBhbmQgZWxlbWVudHMKLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBzdGF0aWNfY2FzdDx1aW50OF90PihjYXBhYmlsaXR5XykpOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIGVsZW1lbnRzXy5zaXplKCkpOwotICBmb3IgKGF1dG8gaXQgPSBlbGVtZW50c18uYmVnaW4oKTsgaXQgIT0gZWxlbWVudHNfLmVuZCgpOyBpdCsrKSB7Ci0gICAgaWYgKGNhcGFiaWxpdHlfID09IENhcGFiaWxpdHk6OkNPTVBBTllfSUQpCi0gICAgICBQdXNoQ29tcGFueUlkKHBrdCwgKml0KTsKLSAgICBlbHNlCi0gICAgICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsICppdCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2NhcGFiaWxpdGllc19wYWNrZXQuaCBiL3BhY2tldC9hdnJjcC9jYXBhYmlsaXRpZXNfcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDYwN2YuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2NhcGFiaWxpdGllc19wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgInZlbmRvcl9wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1jbGFzcyBHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0QnVpbGRlciA6IHB1YmxpYyBWZW5kb3JQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkdldENhcGFiaWxpdGllc1JlcXVlc3RCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8R2V0Q2FwYWJpbGl0aWVzUmVxdWVzdEJ1aWxkZXI+IE1ha2VCdWlsZGVyKAotICAgICAgQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KTsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBTZXJpYWxpemUoCi0gICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENhcGFiaWxpdHkgY2FwYWJpbGl0eV87Ci0KLSAgR2V0Q2FwYWJpbGl0aWVzUmVxdWVzdEJ1aWxkZXIoQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KQotICAgICAgOiBWZW5kb3JQYWNrZXRCdWlsZGVyKENUeXBlOjpTVEFUVVMsIENvbW1hbmRQZHU6OkdFVF9DQVBBQklMSVRJRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0VHlwZTo6U0lOR0xFKSwKLSAgICAgICAgY2FwYWJpbGl0eV8oY2FwYWJpbGl0eSl7fTsKLX07Ci0KLWNsYXNzIEdldENhcGFiaWxpdGllc1JlcXVlc3QgOiBwdWJsaWMgVmVuZG9yUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkdldENhcGFiaWxpdGllc1JlcXVlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqICBHZXQgQ2FwYWJpbGl0aWVzIFJlc3BvbnNlIFBhY2tldCBMYXlvdXQKLSAgICogICBBdnJjcFBhY2tldDoKLSAgICogICAgIENUeXBlIGNfdHlwZV87Ci0gICAqICAgICB1aW50OF90IHN1YnVuaXRfdHlwZV8gOiA1OwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X2lkXyA6IDM7Ci0gICAqICAgICBPcGNvZGUgb3Bjb2RlXzsKLSAgICogICBWZW5kb3JQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IGNvbXBhbnlfaWRbM107Ci0gICAqICAgICB1aW50OF90IGNvbW1hbmRfcGR1OwotICAgKiAgICAgdWludDhfdCBwYWNrZXRfdHlwZTsKLSAgICogICAgIHVpbnQxNl90IHBhcmFtX2xlbmd0aDsKLSAgICogICBHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0UGFja2V0OgotICAgKiAgICAgdWludDhfdCBjYXBhYmlsaXR5X3JlcXVlc3RlZDoKLSAgICovCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5TaXplKCkgeyByZXR1cm4gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpICsgMTsgfTsKLQotICAvLyBHZXR0ZXIgRnVuY3Rpb25zCi0gIENhcGFiaWxpdHkgR2V0Q2FwYWJpbGl0eVJlcXVlc3RlZCgpIGNvbnN0OwotCi0gIC8vIE92ZXJsb2FkZWQgRnVuY3Rpb25zCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdXNpbmcgVmVuZG9yUGFja2V0OjpWZW5kb3JQYWNrZXQ7Ci19OwotCi1jbGFzcyBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXIgOiBwdWJsaWMgVmVuZG9yUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5HZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXI+IE1ha2VDb21wYW55SWRCdWlsZGVyKAotICAgICAgdWludDMyX3QgY29tcGFueV9pZF9lbGVtZW50KTsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcj4KLSAgTWFrZUV2ZW50c1N1cHBvcnRlZEJ1aWxkZXIoRXZlbnQgZXZlbnQpOwotCi0gIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlciogQWRkQ29tcGFueUlkKHVpbnQzMl90IGNvbXBhbnlfaWQpOwotICBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXIqIEFkZEV2ZW50KEV2ZW50IGV2ZW50KTsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBTZXJpYWxpemUoCi0gICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDYXBhYmlsaXR5IGNhcGFiaWxpdHlfOwotICBzdGQ6OnNldDx1aW50MzJfdD4gZWxlbWVudHNfOwotCi0gIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcihDYXBhYmlsaXR5IGNhcGFiaWxpdHkpCi0gICAgICA6IFZlbmRvclBhY2tldEJ1aWxkZXIoQ1R5cGU6OlNUQUJMRSwgQ29tbWFuZFBkdTo6R0VUX0NBUEFCSUxJVElFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRUeXBlOjpTSU5HTEUpLAotICAgICAgICBjYXBhYmlsaXR5XyhjYXBhYmlsaXR5KXt9OwotfTsKLQotY2xhc3MgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UgOiBwdWJsaWMgVmVuZG9yUGFja2V0IHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBHZXQgQ2FwYWJpbGl0aWVzIFJlc3BvbnNlIFBhY2tldCBMYXlvdXQKLSAgICogICBBdnJjcFBhY2tldDoKLSAgICogICAgIENUeXBlIGNfdHlwZV87Ci0gICAqICAgICB1aW50OF90IHN1YnVuaXRfdHlwZV8gOiA1OwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X2lkXyA6IDM7Ci0gICAqICAgICBPcGNvZGUgb3Bjb2RlXzsKLSAgICogICBWZW5kb3JQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IGNvbXBhbnlfaWRbM107Ci0gICAqICAgICB1aW50OF90IGNvbW1hbmRfcGR1OwotICAgKiAgICAgdWludDhfdCBwYWNrZXRfdHlwZTsKLSAgICogICAgIHVpbnQxNl90IHBhcmFtX2xlbmd0aDsKLSAgICogICBHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0UGFja2V0OwotICAgKiAgICAgdWludDhfdCBjYXBhYmlsaXR5X3JlcXVlc3RlZDsKLSAgICogICAgIHVpbnQxNl90IGNhcGFiaWxpdHlfY291bnQ7Ci0gICAqICAgICB1bmlvbiB7Ci0gICAqICAgICAgICB1aW50OF90IGV2ZW50X3N1cHBvcnRlZDsKLSAgICogICAgICAgIHVpbnQ4X3QgY29tcGFueV9pZFszXTsKLSAgICogICAgIH0gY2FwYWJpbGl0eV9hcnJheVtdOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyAyOyB9OwotCi0gIC8vIFRPRE86IEltcGxlbWVudCB0aGVzZSBmb3IgQVZSQ1AgQ29udHJvbGxlcgotICAvLyB2aXJ0dWFsIHVpbnQ4X3QgR2V0Q2FwYWJpbGl0eVJldHVybmVkKCkgY29uc3Q7Ci0gIC8vIHZpcnR1YWwgdWludDhfdCBHZXRDYXBhYmlsaXR5Q291bnQoKSBjb25zdDsKLSAgLy8gdmlydHVhbCBzdGQ6OnZlY3RvcjxFdmVudD4gR2V0RXZlbnRzU3VwcG9ydGVkKCkgY29uc3Q7Ci0gIC8vIHZpcnR1YWwgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEdldENvbXBhbnlJZHMoKSBjb25zdDsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvY2hhbmdlX3BhdGguY2MgYi9wYWNrZXQvYXZyY3AvY2hhbmdlX3BhdGguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjlhYjQuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2NoYW5nZV9wYXRoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjaGFuZ2VfcGF0aC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyPgotQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXIpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlcihzdGF0dXMsIG51bV9pdGVtc19pbl9mb2xkZXIpKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHNpemVfdCBsZW4gPSBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCk7Ci0gIGxlbiArPSAxOyAgLy8gU3RhdHVzCi0gIGlmIChzdGF0dXNfICE9IFN0YXR1czo6Tk9fRVJST1IpIHJldHVybiBsZW47Ci0KLSAgbGVuICs9IDQ7ICAvLyBOdW1iZXIgb2YgaXRlbXMgaW4gZm9sZGVyCi0gIHJldHVybiBsZW47Ci19Ci0KLWJvb2wgQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgQnJvd3NlUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QsIHNpemUoKSAtIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSk7Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAodWludDhfdClzdGF0dXNfKTsKLSAgaWYgKHN0YXR1c18gIT0gU3RhdHVzOjpOT19FUlJPUikgcmV0dXJuIHRydWU7Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czQocGt0LCBiYXNlOjpCeXRlU3dhcChudW1faXRlbXNfaW5fZm9sZGVyXykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDE2X3QgQ2hhbmdlUGF0aFJlcXVlc3Q6OkdldFVpZENvdW50ZXIoKSBjb25zdCB7Ci0gIGF1dG8gaXQgPSBiZWdpbigpICsgQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICByZXR1cm4gaXQuZXh0cmFjdEJFPHVpbnQxNl90PigpOwotfQotCi1EaXJlY3Rpb24gQ2hhbmdlUGF0aFJlcXVlc3Q6OkdldERpcmVjdGlvbigpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDIpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8RGlyZWN0aW9uPigqaXQpOwotfQotCi11aW50NjRfdCBDaGFuZ2VQYXRoUmVxdWVzdDo6R2V0VWlkKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMyk7Ci0gIHJldHVybiBpdC5leHRyYWN0QkU8dWludDY0X3Q+KCk7Ci19Ci0KLWJvb2wgQ2hhbmdlUGF0aFJlcXVlc3Q6OklzVmFsaWQoKSBjb25zdCB7Ci0gIGlmICghQnJvd3NlUGFja2V0OjpJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLSAgLy8gQ2hhbmdlIHBhdGggcmVxdWVzdCBwYWNrZXRzIGFyZSBhbHdheXMgdGhlIHNhbWUgc2l6ZQotICByZXR1cm4gc2l6ZSgpID09IGtNaW5TaXplKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIENoYW5nZVBhdGhSZXF1ZXN0OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJDaGFuZ2VQYXRoUmVxdWVzdFBhY2tldDogIiA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBQRFUgPSAiIDw8IEdldFBkdSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIExlbmd0aCA9ICIgPDwgR2V0TGVuZ3RoKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgVUlEIENvdW50ZXIgPSAiIDw8IGxvZ2hleChHZXRVaWRDb3VudGVyKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIERpcmVjdGlvbiA9ICIgPDwgR2V0RGlyZWN0aW9uKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgVUlEIFJlcXVlc3RlZCA9ICIgPDwgbG9naGV4KEdldFVpZCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8IHN0ZDo6ZW5kbDsKLQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDaGFuZ2VQYXRoUmVxdWVzdEJ1aWxkZXI+IENoYW5nZVBhdGhSZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgdWludDE2X3QgdWlkX2NvdW50ZXIsIERpcmVjdGlvbiBkaXJlY3Rpb24sIHVpbnQ2NF90IGZvbGRlcl91aWQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENoYW5nZVBhdGhSZXF1ZXN0QnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBDaGFuZ2VQYXRoUmVxdWVzdEJ1aWxkZXIodWlkX2NvdW50ZXIsIGRpcmVjdGlvbiwgZm9sZGVyX3VpZCkpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zaXplX3QgQ2hhbmdlUGF0aFJlcXVlc3RCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICByZXR1cm4gQ2hhbmdlUGF0aFJlcXVlc3Q6OmtNaW5TaXplKCk7Ci19Ci0KLWJvb2wgQ2hhbmdlUGF0aFJlcXVlc3RCdWlsZGVyOjpTZXJpYWxpemUoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIHsKLSAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICBCcm93c2VQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKHBrdCwgc2l6ZSgpIC0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpKTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKHVpZF9jb3VudGVyXykpOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRpcmVjdGlvbl8pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czgocGt0LCBiYXNlOjpCeXRlU3dhcChmb2xkZXJfdWlkXykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvY2hhbmdlX3BhdGguaCBiL3BhY2tldC9hdnJjcC9jaGFuZ2VfcGF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMzYWE4Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9jaGFuZ2VfcGF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJhdnJjcF9icm93c2VfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlciA6IHB1YmxpYyBCcm93c2VQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXIpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIFN0YXR1cyBzdGF0dXNfOwotICB1aW50MzJfdCBudW1faXRlbXNfaW5fZm9sZGVyXzsKLQotICBDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXIpCi0gICAgICA6IEJyb3dzZVBhY2tldEJ1aWxkZXIoQnJvd3NlUGR1OjpDSEFOR0VfUEFUSCksCi0gICAgICAgIHN0YXR1c18oc3RhdHVzKSwKLSAgICAgICAgbnVtX2l0ZW1zX2luX2ZvbGRlcl8obnVtX2l0ZW1zX2luX2ZvbGRlcikge30KLX07Ci0KLWNsYXNzIENoYW5nZVBhdGhSZXF1ZXN0IDogcHVibGljIEJyb3dzZVBhY2tldCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5DaGFuZ2VQYXRoUmVxdWVzdCgpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogQXZyY3AgQ2hhbmdlIFBhdGggUGFja2V0IExheW91dAotICAgKiAgIEJyb3dzZVBhY2tldDoKLSAgICogICAgIHVpbnQ4X3QgcGR1XzsKLSAgICogICAgIHVpbnQxNl90IGxlbmd0aF87Ci0gICAqICAgQ2hhbmdlUGF0aFJlcXVlc3Q6Ci0gICAqICAgICB1aW50MTZfdCB1aWRfY291bnRlcl87Ci0gICAqICAgICB1aW50OF90IGRpcmVjdGlvbl87Ci0gICAqICAgICB1aW50NjRfdCBmb2xkZXJfdWlkXzsKLSAgICovCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5TaXplKCkgeyByZXR1cm4gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpICsgMTE7IH0KLQotICB1aW50MTZfdCBHZXRVaWRDb3VudGVyKCkgY29uc3Q7Ci0gIERpcmVjdGlvbiBHZXREaXJlY3Rpb24oKSBjb25zdDsKLSAgdWludDY0X3QgR2V0VWlkKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBCcm93c2VQYWNrZXQ6OkJyb3dzZVBhY2tldDsKLX07Ci0KLWNsYXNzIENoYW5nZVBhdGhSZXF1ZXN0QnVpbGRlciA6IHB1YmxpYyBCcm93c2VQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNoYW5nZVBhdGhSZXF1ZXN0QnVpbGRlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENoYW5nZVBhdGhSZXF1ZXN0QnVpbGRlcj4gTWFrZUJ1aWxkZXIoCi0gICAgICB1aW50MTZfdCB1aWRfY291bnRlciwgRGlyZWN0aW9uIGRpcmVjdGlvbiwgdWludDY0X3QgZm9sZGVyX3VpZCk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ2hhbmdlUGF0aFJlcXVlc3RCdWlsZGVyKHVpbnQxNl90IHVpZF9jb3VudGVyLCBEaXJlY3Rpb24gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZm9sZGVyX3VpZCkKLSAgICAgIDogQnJvd3NlUGFja2V0QnVpbGRlcihCcm93c2VQZHU6OkNIQU5HRV9QQVRIKSwKLSAgICAgICAgdWlkX2NvdW50ZXJfKHVpZF9jb3VudGVyKSwKLSAgICAgICAgZGlyZWN0aW9uXyhkaXJlY3Rpb24pLAotICAgICAgICBmb2xkZXJfdWlkXyhmb2xkZXJfdWlkKXt9OwotCi0gIHVpbnQxNl90IHVpZF9jb3VudGVyXzsKLSAgRGlyZWN0aW9uIGRpcmVjdGlvbl87Ci0gIHVpbnQ2NF90IGZvbGRlcl91aWRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldC5jYyBiL3BhY2tldC9hdnJjcC9nZW5lcmFsX3JlamVjdF9wYWNrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiM2QzMWEuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJnZW5lcmFsX3JlamVjdF9wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8R2VuZXJhbFJlamVjdEJ1aWxkZXI+IEdlbmVyYWxSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXMgcmVhc29uKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxHZW5lcmFsUmVqZWN0QnVpbGRlcj4gYnVpbGRlciA9Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8R2VuZXJhbFJlamVjdEJ1aWxkZXI+KG5ldyBHZW5lcmFsUmVqZWN0QnVpbGRlcihyZWFzb24pKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IEdlbmVyYWxSZWplY3RCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICByZXR1cm4gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpICsgMTsKLX0KLQotYm9vbCBHZW5lcmFsUmVqZWN0QnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgQnJvd3NlUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QsIHNpemUoKSAtIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSk7Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBzdGF0aWNfY2FzdDx1aW50OF90PihyZWFzb25fKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldC5oIGIvcGFja2V0L2F2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZiMmZlLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZW5lcmFsX3JlamVjdF9wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYXZyY3BfYnJvd3NlX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWNsYXNzIEdlbmVyYWxSZWplY3RCdWlsZGVyIDogcHVibGljIEJyb3dzZVBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2VuZXJhbFJlamVjdEJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZW5lcmFsUmVqZWN0QnVpbGRlcj4gTWFrZUJ1aWxkZXIoU3RhdHVzIHJlYXNvbik7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBTdGF0dXMgcmVhc29uXzsKLQotICBHZW5lcmFsUmVqZWN0QnVpbGRlcihTdGF0dXMgcmVhc29uKSA6IEJyb3dzZVBhY2tldEJ1aWxkZXIoQnJvd3NlUGR1OjpHRU5FUkFMX1JFSkVDVCksIHJlYXNvbl8ocmVhc29uKXt9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19wYWNrZXQuY2MgYi9wYWNrZXQvYXZyY3AvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19wYWNrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzRjZTAuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcGFja2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVpbnQ2NF90IEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdDo6R2V0SWRlbnRpZmllcigpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCk7Ci0gIHJldHVybiBpdC5leHRyYWN0PHVpbnQ2NF90PigpOwotfQotCi11aW50OF90IEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdDo6R2V0TnVtQXR0cmlidXRlcygpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDgpOwotICByZXR1cm4gaXQuZXh0cmFjdDx1aW50OF90PigpOwotfQotCi1zdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdDo6R2V0QXR0cmlidXRlc1JlcXVlc3RlZCgpCi0gICAgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oOCk7Ci0KLSAgc2l6ZV90IG51bWJlcl9vZl9hdHRyaWJ1dGVzID0gaXQuZXh0cmFjdDx1aW50OF90PigpOwotCi0gIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlX2xpc3Q7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1iZXJfb2ZfYXR0cmlidXRlczsgaSsrKSB7Ci0gICAgYXR0cmlidXRlX2xpc3QucHVzaF9iYWNrKChBdHRyaWJ1dGUpaXQuZXh0cmFjdEJFPHVpbnQzMl90PigpKTsKLSAgfQotCi0gIHJldHVybiBhdHRyaWJ1dGVfbGlzdDsKLX0KLQotYm9vbCBHZXRFbGVtZW50QXR0cmlidXRlc1JlcXVlc3Q6OklzVmFsaWQoKSBjb25zdCB7Ci0gIGlmICghVmVuZG9yUGFja2V0OjpJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUoKSA8IGtNaW5TaXplKCkpIHJldHVybiBmYWxzZTsKLQotICBzaXplX3QgbnVtX2F0dHJpYnV0ZXMgPSBHZXROdW1BdHRyaWJ1dGVzKCk7Ci0gIGF1dG8gYXR0cl9zdGFydCA9IGJlZ2luKCkgKyBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDkpOwotCi0gIC8vIENhc3RpbmcgdGhlIGludCByZXR1cm5lZCBmcm9tIGVuZCAtIGF0dHJfc3RhcnQgc2hvdWxkIGJlIGZpbmUuIElmIGFuCi0gIC8vIG92ZXJmbG93IG9jY3VycyB3ZSBjYW4gZGVmaW5pdGx5IHNheSB0aGUgcGFja2V0IGlzIGludmFsaWQKLSAgcmV0dXJuIChudW1fYXR0cmlidXRlcyAqIHNpemVvZihBdHRyaWJ1dGUpKSA9PSAoc2l6ZV90KShlbmQoKSAtIGF0dHJfc3RhcnQpOwotfQotCi1zdGQ6OnN0cmluZyBHZXRFbGVtZW50QXR0cmlidXRlc1JlcXVlc3Q6OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgIlJlZ2lzdGVyTm90aWZpY2F0aW9uUGFja2V0OiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIGNUeXBlID0gIiA8PCBHZXRDVHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgVHlwZSA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRUeXBlKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgSUQgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgT3BDb2RlID0gIiA8PCBHZXRPcGNvZGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBDb21wYW55IElEID0gIiA8PCBsb2doZXgoR2V0Q29tcGFueUlkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIENvbW1hbmQgUERVID0gIiA8PCBHZXRDb21tYW5kUGR1KCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGFja2V0VHlwZSA9ICIgPDwgR2V0UGFja2V0VHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBhcmFtZXRlciBMZW5ndGggPSAiIDw8IEdldFBhcmFtZXRlckxlbmd0aCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIElkZW50aWZpZXIgPSAiIDw8IGxvZ2hleChHZXRJZGVudGlmaWVyKCkpIDw8IHN0ZDo6ZW5kbDsKLQotICBhdXRvIGF0dHJfbGlzdCA9IEdldEF0dHJpYnV0ZXNSZXF1ZXN0ZWQoKTsKLQotICBzcyA8PCAiICDilJQgQXR0cmlidXRlIExpc3Q6IFNpemU6ICIgPDwgYXR0cl9saXN0LnNpemUoKSA8PCBzdGQ6OmVuZGw7Ci0gIGZvciAoYXV0byBpdCA9IGF0dHJfbGlzdC5iZWdpbigpOyBpdCAhPSBhdHRyX2xpc3QuZW5kKCk7IGl0KyspIHsKLSAgICBzcyA8PCAiICAgICAg4pSUICIgPDwgbG9naGV4KCh1aW50MzJfdCkoKml0KSkgPDwgc3RkOjplbmRsOwotICB9Ci0gIHNzIDw8IHN0ZDo6ZW5kbDsKLQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcj4KLUdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihzaXplX3QgbXR1KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcihtdHUpKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotYm9vbCBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6QWRkQXR0cmlidXRlRW50cnkoCi0gICAgQXR0cmlidXRlRW50cnkgZW50cnkpIHsKLSAgQ0hFQ0tfTFQoZW50cmllc18uc2l6ZSgpLCBzaXplX3QoMHhGRikpCi0gICAgICA8PCBfX2Z1bmNfXyA8PCAiOiBhdHRyaWJ1dGUgZW50cnkgb3ZlcmZsb3ciOwotCi0gIHNpemVfdCByZW1haW5pbmdfc3BhY2UgPSBtdHVfIC0gc2l6ZSgpOwotICBpZiAoZW50cnkuc2l6ZSgpID4gcmVtYWluaW5nX3NwYWNlKSB7Ci0gICAgZW50cnkucmVzaXplKHJlbWFpbmluZ19zcGFjZSk7Ci0gIH0KLQotICBpZiAoZW50cnkuZW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGVudHJpZXNfLmluc2VydChlbnRyeSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpBZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGUgYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUpIHsKLSAgcmV0dXJuIEFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZUVudHJ5KGF0dHJpYnV0ZSwgdmFsdWUpKTsKLX0KLQotc2l6ZV90IEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICBzaXplX3QgYXR0cl9saXN0X3NpemUgPSAwOwotCi0gIGZvciAoYXV0byYgYXR0cmlidXRlX2VudHJ5IDogZW50cmllc18pIHsKLSAgICBhdHRyX2xpc3Rfc2l6ZSArPSBhdHRyaWJ1dGVfZW50cnkuc2l6ZSgpOwotICB9Ci0KLSAgcmV0dXJuIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIDEgKyBhdHRyX2xpc3Rfc2l6ZTsKLX0KLQotYm9vbCBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCBzaXplKCkgLSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkpOwotCi0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgZW50cmllc18uc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVfZW50cnkgOiBlbnRyaWVzXykgewotICAgIFB1c2hBdHRyaWJ1dGVWYWx1ZShwa3QsIGF0dHJpYnV0ZV9lbnRyeSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19wYWNrZXQuaCBiL3BhY2tldC9hdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjA4NDRjLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWNsYXNzIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdCA6IHB1YmxpYyBWZW5kb3JQYWNrZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2V0RWxlbWVudEF0dHJpYnV0ZXNSZXF1ZXN0KCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiAgUmVnaXN0ZXIgTm90aWZpY2FpdG9uIFJlcXVlc3QgUGFja2V0IExheW91dAotICAgKiAgIEF2cmNwUGFja2V0OgotICAgKiAgICAgQ1R5cGUgY190eXBlXzsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF90eXBlXyA6IDU7Ci0gICAqICAgICB1aW50OF90IHN1YnVuaXRfaWRfIDogMzsKLSAgICogICAgIE9wY29kZSBvcGNvZGVfOwotICAgKiAgIFZlbmRvclBhY2tldDoKLSAgICogICAgIHVpbnQ4X3QgY29tcGFueV9pZFszXTsKLSAgICogICAgIHVpbnQ4X3QgY29tbWFuZF9wZHU7Ci0gICAqICAgICB1aW50OF90IHBhY2tldF90eXBlOwotICAgKiAgICAgdWludDE2X3QgcGFyYW1fbGVuZ3RoOwotICAgKiAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdFBhY2tldDoKLSAgICogICAgIHVpbnQ2NF90IGlkZW50aWZpZXI7Ci0gICAqICAgICB1aW50OF90IG51bWJlcl9vZl9hdHRyaWJ1dGVzOwotICAgKiAgICAgdWludDMyX3QgYXR0cmlidXRlc19yZXF1ZXN0ZWRbXTsKLSAgICovCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5TaXplKCkgeyByZXR1cm4gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpICsgOTsgfQotCi0gIC8vIEdldHRlciBGdW5jdGlvbnMKLSAgdWludDY0X3QgR2V0SWRlbnRpZmllcigpIGNvbnN0OwotICB1aW50OF90IEdldE51bUF0dHJpYnV0ZXMoKSBjb25zdDsKLSAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBHZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCkgY29uc3Q7Ci0KLSAgLy8gT3ZlcmxvYWRlZCBGdW5jdGlvbnMKLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBWZW5kb3JQYWNrZXQ6OlZlbmRvclBhY2tldDsKLX07Ci0KLWNsYXNzIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyIDogcHVibGljIFZlbmRvclBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2V0RWxlbWVudEF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcj4gTWFrZUJ1aWxkZXIoCi0gICAgICBzaXplX3QgbXR1KTsKLQotICBib29sIEFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZUVudHJ5IGVudHJ5KTsKLSAgYm9vbCBBZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGUgYXR0cmlidXRlLCBzdGQ6OnN0cmluZyB2YWx1ZSk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzZXQ8QXR0cmlidXRlRW50cnk+IGVudHJpZXNfOwotICBzaXplX3QgbXR1XzsKLQotICBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcihzaXplX3QgbXR1KQotICAgICAgOiBWZW5kb3JQYWNrZXRCdWlsZGVyKENUeXBlOjpTVEFCTEUsIENvbW1hbmRQZHU6OkdFVF9FTEVNRU5UX0FUVFJJQlVURVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0VHlwZTo6U0lOR0xFKSwKLSAgICAgICAgbXR1XyhtdHUpe307Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X2ZvbGRlcl9pdGVtcy5jYyBiL3BhY2tldC9hdnJjcC9nZXRfZm9sZGVyX2l0ZW1zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTZlM2ExLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZXRfZm9sZGVyX2l0ZW1zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJnZXRfZm9sZGVyX2l0ZW1zLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotc3RkOjp1bmlxdWVfcHRyPEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyPgotR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcihTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG10dSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8R2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXIoU2NvcGU6Ok1FRElBX1BMQVlFUl9MSVNULCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX2NvdW50ZXIsIG10dSkpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8R2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI+Ci1HZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVZGU0J1aWxkZXIoU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbXR1KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcihTY29wZTo6VkZTLCBzdGF0dXMsIHVpZF9jb3VudGVyLCBtdHUpKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyPgotR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcihTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG10dSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8R2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXIoU2NvcGU6Ok5PV19QTEFZSU5HLCBzdGF0dXMsIHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10dSkpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zaXplX3QgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHNpemVfdCBsZW4gPSBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCk7Ci0gIGxlbiArPSAxOyAgLy8gU3RhdHVzCi0KLSAgLy8gVGhlcmUgaXMgbm90aGluZyBvdGhlciB0aGFuIHRoZSBzdGF0dXMgaW4gdGhlIHBhY2tldCBpZiB0aGUgc3RhdHVzIGlzbid0Ci0gIC8vIE5PX0VSUk9SCi0gIGlmIChzdGF0dXNfICE9IFN0YXR1czo6Tk9fRVJST1IgfHwgaXRlbXNfLnNpemUoKSA9PSAwKSByZXR1cm4gbGVuOwotCi0gIGxlbiArPSAyOyAgLy8gVUlEIENvdW50ZXIKLSAgbGVuICs9IDI7ICAvLyBOdW1iZXIgb2YgSXRlbXM7Ci0gIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGl0ZW1zXykgewotICAgIGxlbiArPSBpdGVtLnNpemUoKTsKLSAgfQotCi0gIHJldHVybiBsZW47Ci19Ci0KLWJvb2wgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIEJyb3dzZVBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCBzaXplKCkgLSBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkpOwotCi0gIGlmIChzdGF0dXNfID09IFN0YXR1czo6Tk9fRVJST1IgJiYgaXRlbXNfLnNpemUoKSA9PSAwKSB7Ci0gICAgLy8gUmV0dXJuIHJhbmdlIG91dCBvZiBib3VuZHMgaWYgdGhlcmUgYXJlIHplcm8gaXRlbXMgaW4gdGhlIGZvbGRlcgotICAgIHN0YXR1c18gPSBTdGF0dXM6OlJBTkdFX09VVF9PRl9CT1VORFM7Ci0gIH0KLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsICh1aW50OF90KXN0YXR1c18pOyAgLy8gU3RhdHVzCi0gIGlmIChzdGF0dXNfICE9IFN0YXR1czo6Tk9fRVJST1IpIHJldHVybiB0cnVlOwotCi0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAodWlkX2NvdW50ZXJfKSk7Ci0gIHVpbnQxNl90IG51bV9pdGVtcyA9IGl0ZW1zXy5zaXplKCk7Ci0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAobnVtX2l0ZW1zKSk7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogaXRlbXNfKSB7Ci0gICAgUHVzaE1lZGlhTGlzdEl0ZW0ocGt0LCBpdGVtKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpBZGRNZWRpYVBsYXllcihNZWRpYVBsYXllckl0ZW0gaXRlbSkgewotICBDSEVDSyhzY29wZV8gPT0gU2NvcGU6Ok1FRElBX1BMQVlFUl9MSVNUKTsKLQotICBpZiAoc2l6ZSgpICsgaXRlbS5zaXplKCkgPiBtdHVfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaXRlbXNfLnB1c2hfYmFjayhNZWRpYUxpc3RJdGVtKGl0ZW0pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6OkFkZFNvbmcoTWVkaWFFbGVtZW50SXRlbSBpdGVtKSB7Ci0gIENIRUNLKHNjb3BlXyA9PSBTY29wZTo6VkZTIHx8IHNjb3BlXyA9PSBTY29wZTo6Tk9XX1BMQVlJTkcpOwotCi0gIGlmIChzaXplKCkgKyBpdGVtLnNpemUoKSA+IG10dV8pIHJldHVybiBmYWxzZTsKLQotICBpdGVtc18ucHVzaF9iYWNrKE1lZGlhTGlzdEl0ZW0oaXRlbSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6QWRkRm9sZGVyKEZvbGRlckl0ZW0gaXRlbSkgewotICBDSEVDSyhzY29wZV8gPT0gU2NvcGU6OlZGUyk7Ci0KLSAgaWYgKHNpemUoKSArIGl0ZW0uc2l6ZSgpID4gbXR1XykgcmV0dXJuIGZhbHNlOwotCi0gIGl0ZW1zXy5wdXNoX2JhY2soTWVkaWFMaXN0SXRlbShpdGVtKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpQdXNoTWVkaWFMaXN0SXRlbSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCwKLSAgICBjb25zdCBNZWRpYUxpc3RJdGVtJiBpdGVtKSB7Ci0gIHN3aXRjaCAoaXRlbS50eXBlXykgewotICAgIGNhc2UgTWVkaWFMaXN0SXRlbTo6UExBWUVSOgotICAgICAgUHVzaE1lZGlhUGxheWVySXRlbShwa3QsIGl0ZW0ucGxheWVyXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lZGlhTGlzdEl0ZW06OkZPTERFUjoKLSAgICAgIFB1c2hGb2xkZXJJdGVtKHBrdCwgaXRlbS5mb2xkZXJfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVkaWFMaXN0SXRlbTo6U09ORzoKLSAgICAgIFB1c2hNZWRpYUVsZW1lbnRJdGVtKHBrdCwgaXRlbS5zb25nXyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpQdXNoTWVkaWFQbGF5ZXJJdGVtKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0LAotICAgIGNvbnN0IE1lZGlhUGxheWVySXRlbSYgaXRlbSkgewotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDEpOyAgLy8gTWVkaWEgUGxheWVyIEl0ZW0KLSAgdWludDE2X3QgaXRlbV9sZW4gPSBpdGVtLnNpemUoKSAtIDM7Ci0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAoaXRlbV9sZW4pKTsgIC8vIEl0ZW0gbGVuZ3RoCi0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAoaXRlbS5pZF8pKTsgIC8vIFBsYXllciBJRAotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDEpOyAgICAgICAgICAgICAgICAgICAgICAvLyBQbGF5ZXIgVHlwZQotICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIDB4MDAwMDAwMDApOyAgICAgICAgICAgICAgICAvLyBQbGF5ZXIgU3VidHlwZQotICBBZGRQYXlsb2FkT2N0ZXRzMSgKLSAgICAgIHBrdCwgMHgwMik7ICAvLyBQbGF5ZXIgUGxheSBTdGF0dXMgLy8gVE9ETzogQWRkIHRoaXMgYXMgYSBwYXNzZWQgZmllbGQKLQotICAvLyBGZWF0dXJlcwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4YjcpOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDEpOwotICBpZiAoaXRlbS5icm93c2FibGVfKSB7Ci0gICAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAweDBDKTsKLSAgICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MGEpOwotICB9IGVsc2UgewotICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgMHgwNCk7Ci0gICAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAweDAwKTsKLSAgfQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4MDApOwotCi0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAoKHVpbnQxNl90KTB4MDA2YSkpOwotICB1aW50MTZfdCBuYW1lX2xlbiA9IGl0ZW0ubmFtZV8uc2l6ZSgpOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKG5hbWVfbGVuKSk7Ci0KLSAgZm9yIChjb25zdCB1aW50OF90JiBieXRlIDogaXRlbS5uYW1lXykgewotICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gIH0KLX0KLQotdm9pZCBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6UHVzaEZvbGRlckl0ZW0oCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QsIGNvbnN0IEZvbGRlckl0ZW0mIGl0ZW0pIHsKLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAweDAyKTsgIC8vIEZvbGRlciBJdGVtCi0gIHVpbnQxNl90IGl0ZW1fbGVuID0gaXRlbS5zaXplKCkgLSAzOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKGl0ZW1fbGVuKSk7Ci0gIEFkZFBheWxvYWRPY3RldHM4KHBrdCwgYmFzZTo6Qnl0ZVN3YXAoaXRlbS51aWRfKSk7Ci0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgaXRlbS5mb2xkZXJfdHlwZV8pOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIGl0ZW0uaXNfcGxheWFibGVfID8gMHgwMSA6IDB4MDApOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJ5dGVTd2FwKCh1aW50MTZfdCkweDAwNmEpKTsgIC8vIFVURi04IENoYXJhY3RlciBTZXQKLSAgdWludDE2X3QgbmFtZV9sZW4gPSBpdGVtLm5hbWVfLnNpemUoKTsKLSAgQWRkUGF5bG9hZE9jdGV0czIocGt0LCBiYXNlOjpCeXRlU3dhcChuYW1lX2xlbikpOwotICBmb3IgKGNvbnN0IHVpbnQ4X3QmIGJ5dGUgOiBpdGVtLm5hbWVfKSB7Ci0gICAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBieXRlKTsKLSAgfQotfQotCi12b2lkIEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpQdXNoTWVkaWFFbGVtZW50SXRlbSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCwKLSAgICBjb25zdCBNZWRpYUVsZW1lbnRJdGVtJiBpdGVtKSB7Ci0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgMHgwMyk7ICAvLyBNZWRpYSBFbGVtZW50IEl0ZW0KLSAgdWludDE2X3QgaXRlbV9sZW4gPSBpdGVtLnNpemUoKSAtIDM7Ci0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAoaXRlbV9sZW4pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czgocGt0LCBiYXNlOjpCeXRlU3dhcChpdGVtLnVpZF8pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAweDAwKTsgIC8vIE1lZGlhIFR5cGUgQXVkaW8KLSAgQWRkUGF5bG9hZE9jdGV0czIocGt0LAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCeXRlU3dhcCgodWludDE2X3QpMHgwMDZhKSk7ICAvLyBVVEYtOCBDaGFyYWN0ZXIgU2V0Ci0gIHVpbnQxNl90IG5hbWVfbGVuID0gaXRlbS5uYW1lXy5zaXplKCk7Ci0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAobmFtZV9sZW4pKTsKLSAgZm9yIChjb25zdCB1aW50OF90JiBieXRlIDogaXRlbS5uYW1lXykgewotICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gIH0KLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsICh1aW50OF90KWl0ZW0uYXR0cmlidXRlc18uc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGl0ZW0uYXR0cmlidXRlc18pIHsKLSAgICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIGJhc2U6OkJ5dGVTd2FwKCh1aW50MzJfdCllbnRyeS5hdHRyaWJ1dGUoKSkpOwotICAgIEFkZFBheWxvYWRPY3RldHMyKHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCeXRlU3dhcCgodWludDE2X3QpMHgwMDZhKSk7ICAvLyBVVEYtOCBDaGFyYWN0ZXIgU2V0Ci0KLSAgICBzdGQ6OnN0cmluZyBhdHRyX3ZhbCA9IGVudHJ5LnZhbHVlKCk7Ci0gICAgdWludDE2X3QgYXR0cl9sZW4gPSBhdHRyX3ZhbC5zaXplKCk7Ci0KLSAgICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKGF0dHJfbGVuKSk7Ci0gICAgZm9yIChjb25zdCB1aW50OF90JiBieXRlIDogYXR0cl92YWwpIHsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gICAgfQotICB9Ci19Ci0KLVNjb3BlIEdldEZvbGRlckl0ZW1zUmVxdWVzdDo6R2V0U2NvcGUoKSBjb25zdCB7Ci0gIGF1dG8gaXQgPSBiZWdpbigpICsgQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NvcGU+KCppdCk7Ci19Ci0KLXVpbnQzMl90IEdldEZvbGRlckl0ZW1zUmVxdWVzdDo6R2V0U3RhcnRJdGVtKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIHJldHVybiBpdC5leHRyYWN0QkU8dWludDMyX3Q+KCk7Ci19Ci0KLXVpbnQzMl90IEdldEZvbGRlckl0ZW1zUmVxdWVzdDo6R2V0RW5kSXRlbSgpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDUpOwotICByZXR1cm4gaXQuZXh0cmFjdEJFPHVpbnQzMl90PigpOwotfQotCi11aW50OF90IEdldEZvbGRlckl0ZW1zUmVxdWVzdDo6R2V0TnVtQXR0cmlidXRlcygpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDkpOwotICByZXR1cm4gKml0OwotfQotCi1zdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IEdldEZvbGRlckl0ZW1zUmVxdWVzdDo6R2V0QXR0cmlidXRlc1JlcXVlc3RlZCgpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDkpOwotCi0gIHNpemVfdCBudW1iZXJfb2ZfYXR0cmlidXRlcyA9IGl0LmV4dHJhY3Q8dWludDhfdD4oKTsKLSAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVfbGlzdDsKLQotICAvLyBObyBhdHRyaWJ1dGVzIHJlcXVlc3RlZAotICBpZiAobnVtYmVyX29mX2F0dHJpYnV0ZXMgPT0gMHhGRikgcmV0dXJuIGF0dHJpYnV0ZV9saXN0OwotCi0gIC8vIFRPRE86IElmIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBlcXVhbHMgMCwgdGhlbiBhbGwgYXR0cmlidXRlcyBhcmUKLSAgLy8gcmVxdWVzdGVkIHJpZ2h0IG5vdyB0aGF0cyBoYW5kbGVkIGluIHRoZSBzZXJ2aWNlIGl0c2VsZiwgYnV0IGl0J2QgYmUgbmljZQotICAvLyB0byBoYXZlIHRoaXMgZnVuY3Rpb24gcmV0dXJuIGEgdmVjdG9yIHdpdGggYWxsIHRoZSBhdHRyaWJ1dGVzCi0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1iZXJfb2ZfYXR0cmlidXRlczsgaSsrKSB7Ci0gICAgYXR0cmlidXRlX2xpc3QucHVzaF9iYWNrKChBdHRyaWJ1dGUpaXQuZXh0cmFjdEJFPHVpbnQzMl90PigpKTsKLSAgfQotCi0gIHJldHVybiBhdHRyaWJ1dGVfbGlzdDsKLX0KLQotYm9vbCBHZXRGb2xkZXJJdGVtc1JlcXVlc3Q6OklzVmFsaWQoKSBjb25zdCB7Ci0gIGlmICghQnJvd3NlUGFja2V0OjpJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLSAgLy8gVGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCB0byBiZSB2YWxpZAotICBpZiAoc2l6ZSgpIDwga01pblNpemUoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGF1dG8gYXR0cl9jb3VudCA9IEdldE51bUF0dHJpYnV0ZXMoKTsKLQotICAvLyBObyBpdGVtcyByZXF1ZXN0ZWQKLSAgaWYgKGF0dHJfY291bnQgPT0gMHhGRikgcmV0dXJuIHRydWU7Ci0KLSAgYXV0byBhdHRyX3N0YXJ0ID0gYmVnaW4oKSArIGtNaW5TaXplKCk7Ci0KLSAgLy8gQ2FzdGluZyB0aGUgaW50IHJldHVybmVkIGZyb20gZW5kIC0gYXR0cl9zdGFydCBzaG91bGQgYmUgZmluZS4gSWYgYW4KLSAgLy8gb3ZlcmZsb3cgb2NjdXJzIHdlIGNhbiBkZWZpbml0bHkgc2F5IHRoZSBwYWNrZXQgaXMgaW52YWxpZAotICByZXR1cm4gKGF0dHJfY291bnQgKiBzaXplb2YoQXR0cmlidXRlKSkgPT0gKHNpemVfdCkoZW5kKCkgLSBhdHRyX3N0YXJ0KTsKLX0KLQotc3RkOjpzdHJpbmcgR2V0Rm9sZGVySXRlbXNSZXF1ZXN0OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJHZXRGb2xkZXJJdGVtc1JlcXVlc3RQYWNrZXQ6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUERVID0gIiA8PCBHZXRQZHUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBMZW5ndGggPSAiIDw8IEdldExlbmd0aCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFNjb3BlID0gIiA8PCBHZXRTY29wZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN0YXJ0IEl0ZW0gPSAiIDw8IGxvZ2hleChHZXRTdGFydEl0ZW0oKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgRW5kIEl0ZW0gPSAiIDw8IGxvZ2hleChHZXRFbmRJdGVtKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIEF0dHJpYnV0ZSBDb3VudCA9ICIgPDwgbG9naGV4KEdldE51bUF0dHJpYnV0ZXMoKSkgPDwgc3RkOjplbmRsOwotCi0gIHNzIDw8IHN0ZDo6ZW5kbDsKLQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyPgotR2V0Rm9sZGVySXRlbXNSZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgU2NvcGUgc2NvcGUsIHVpbnQzMl90IHN0YXJ0X2l0ZW0sIHVpbnQzMl90IGVuZF9pdGVtLAotICAgIGNvbnN0IHN0ZDo6c2V0PEF0dHJpYnV0ZT4mIHJlcXVlc3RlZF9hdHRycykgewotICBzdGQ6OnVuaXF1ZV9wdHI8R2V0Rm9sZGVySXRlbXNSZXF1ZXN0QnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyKHNjb3BlLCBzdGFydF9pdGVtLCBlbmRfaXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9hdHRycykpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zaXplX3QgR2V0Rm9sZGVySXRlbXNSZXF1ZXN0QnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgc2l6ZV90IGxlbiA9IEdldEZvbGRlckl0ZW1zUmVxdWVzdDo6a01pblNpemUoKTsKLSAgbGVuICs9IHJlcXVlc3RlZF9hdHRyc18uc2l6ZSgpICogc2l6ZW9mKEF0dHJpYnV0ZSk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLWJvb2wgR2V0Rm9sZGVySXRlbXNSZXF1ZXN0QnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgQnJvd3NlUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QsIHNpemUoKSAtIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSk7Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBzdGF0aWNfY2FzdDx1aW50OF90PihzY29wZV8pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czQocGt0LCBiYXNlOjpCeXRlU3dhcChzdGFydF9pdGVtXykpOwotICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIGJhc2U6OkJ5dGVTd2FwKGVuZF9pdGVtXykpOwotCi0gIGlmIChyZXF1ZXN0ZWRfYXR0cnNfLnNpemUoKSA9PSAwKSB7Ci0gICAgLy8gMHhGRiBpcyB0aGUgdmFsdWUgdG8gc2lnbmlmeSB0aGF0IHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzIHJlcXVlc3RlZC4KLSAgICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIDB4RkYpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCByZXF1ZXN0ZWRfYXR0cnNfLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgYXR0ciA6IHJlcXVlc3RlZF9hdHRyc18pIHsKLSAgICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIGJhc2U6OkJ5dGVTd2FwKHN0YXRpY19jYXN0PHVpbnQzMl90PihhdHRyKSkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9nZXRfZm9sZGVyX2l0ZW1zLmggYi9wYWNrZXQvYXZyY3AvZ2V0X2ZvbGRlcl9pdGVtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI5MWFmLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZXRfZm9sZGVyX2l0ZW1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJhdnJjcF9icm93c2VfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXIgOiBwdWJsaWMgQnJvd3NlUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5HZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcigpID0gZGVmYXVsdDsKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcj4gTWFrZVBsYXllckxpc3RCdWlsZGVyKAotICAgICAgU3RhdHVzIHN0YXR1cywgdWludDE2X3QgdWlkX2NvdW50ZXIsIHNpemVfdCBtdHUpOwotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyPiBNYWtlVkZTQnVpbGRlcigKLSAgICAgIFN0YXR1cyBzdGF0dXMsIHVpbnQxNl90IHVpZF9jb3VudGVyLCBzaXplX3QgbXR1KTsKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcj4gTWFrZU5vd1BsYXlpbmdCdWlsZGVyKAotICAgICAgU3RhdHVzIHN0YXR1cywgdWludDE2X3QgdWlkX2NvdW50ZXIsIHNpemVfdCBtdHUpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotICAvLyBSZXR1cm5zIGZhbHNlIGlmIGFkZGluZyBhbiBpdGVtIHdvdWxkIGV4Y2VlZCB0aGUgTVRVCi0gIGJvb2wgQWRkTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXJJdGVtIGl0ZW0pOwotICBib29sIEFkZFNvbmcoTWVkaWFFbGVtZW50SXRlbSBpdGVtKTsKLSAgYm9vbCBBZGRGb2xkZXIoRm9sZGVySXRlbSBpdGVtKTsKLQotIHByb3RlY3RlZDoKLSAgU2NvcGUgc2NvcGVfOwotICBzdGQ6OnZlY3RvcjxNZWRpYUxpc3RJdGVtPiBpdGVtc187Ci0gIFN0YXR1cyBzdGF0dXNfOwotICB1aW50MTZfdCB1aWRfY291bnRlcl87Ci0gIHNpemVfdCBtdHVfOwotCi0gIEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyKFNjb3BlIHNjb3BlLCBTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwgc2l6ZV90IG10dSkKLSAgICAgIDogQnJvd3NlUGFja2V0QnVpbGRlcihCcm93c2VQZHU6OkdFVF9GT0xERVJfSVRFTVMpLAotICAgICAgICBzY29wZV8oc2NvcGUpLAotICAgICAgICBzdGF0dXNfKHN0YXR1cyksCi0gICAgICAgIHVpZF9jb3VudGVyXyh1aWRfY291bnRlciksCi0gICAgICAgIG10dV8obXR1KXt9OwotCi0gcHJpdmF0ZToKLSAgdm9pZCBQdXNoTWVkaWFMaXN0SXRlbShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUxpc3RJdGVtJiBpdGVtKTsKLSAgdm9pZCBQdXNoTWVkaWFQbGF5ZXJJdGVtKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFQbGF5ZXJJdGVtJiBpdGVtKTsKLSAgdm9pZCBQdXNoTWVkaWFFbGVtZW50SXRlbShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUVsZW1lbnRJdGVtJiBpdGVtKTsKLSAgdm9pZCBQdXNoRm9sZGVySXRlbShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb2xkZXJJdGVtJiBpdGVtKTsKLX07Ci0KLWNsYXNzIEdldEZvbGRlckl0ZW1zUmVxdWVzdCA6IHB1YmxpYyBCcm93c2VQYWNrZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2V0Rm9sZGVySXRlbXNSZXF1ZXN0KCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBBdnJjcCBDaGFuZ2UgUGF0aCBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQnJvd3NlUGFja2V0OgotICAgKiAgICAgdWludDhfdCBwZHVfOwotICAgKiAgICAgdWludDE2X3QgbGVuZ3RoXzsKLSAgICogICBHZXRGb2xkZXJJdGVtc1JlcXVlc3Q6Ci0gICAqICAgICB1aW50OF90IHNjb3BlXzsKLSAgICogICAgIHVpbnQzMl90IHN0YXJ0X2l0ZW1fOwotICAgKiAgICAgdWludDMyX3QgZW5kX2l0ZW1fOwotICAgKiAgICAgdWludDhfdCBhdHRyX2NvdW50XzsKLSAgICogICAgIHVpbnQzMl90W10gYXR0cl9yZXF1ZXN0ZWRfOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyAxMDsgfQotCi0gIFNjb3BlIEdldFNjb3BlKCkgY29uc3Q7Ci0gIHVpbnQzMl90IEdldFN0YXJ0SXRlbSgpIGNvbnN0OwotICB1aW50MzJfdCBHZXRFbmRJdGVtKCkgY29uc3Q7Ci0gIHVpbnQ4X3QgR2V0TnVtQXR0cmlidXRlcygpIGNvbnN0OwotICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IEdldEF0dHJpYnV0ZXNSZXF1ZXN0ZWQoKSBjb25zdDsKLQotICB2aXJ0dWFsIGJvb2wgSXNWYWxpZCgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVzaW5nIEJyb3dzZVBhY2tldDo6QnJvd3NlUGFja2V0OwotfTsKLQotY2xhc3MgR2V0Rm9sZGVySXRlbXNSZXF1ZXN0QnVpbGRlciA6IHB1YmxpYyBCcm93c2VQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkdldEZvbGRlckl0ZW1zUmVxdWVzdEJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIFNjb3BlIHNjb3BlLCB1aW50MzJfdCBzdGFydF9pdGVtLCB1aW50MzJfdCBlbmRfaXRlbSwKLSAgICAgIGNvbnN0IHN0ZDo6c2V0PEF0dHJpYnV0ZT4mIHJlcXVlc3RlZF9hdHRycyk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyKFNjb3BlIHNjb3BlLCB1aW50MzJfdCBzdGFydF9pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuZF9pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEF0dHJpYnV0ZT4mIHJlcXVlc3RlZF9hdHRycykKLSAgICAgIDogQnJvd3NlUGFja2V0QnVpbGRlcihCcm93c2VQZHU6OkdFVF9GT0xERVJfSVRFTVMpLAotICAgICAgICBzY29wZV8oc2NvcGUpLAotICAgICAgICBzdGFydF9pdGVtXyhzdGFydF9pdGVtKSwKLSAgICAgICAgZW5kX2l0ZW1fKGVuZF9pdGVtKSwKLSAgICAgICAgcmVxdWVzdGVkX2F0dHJzXyhyZXF1ZXN0ZWRfYXR0cnMpe307Ci0KLSAgU2NvcGUgc2NvcGVfOwotICB1aW50MzJfdCBzdGFydF9pdGVtXzsKLSAgdWludDMyX3QgZW5kX2l0ZW1fOwotICBzdGQ6OnNldDxBdHRyaWJ1dGU+IHJlcXVlc3RlZF9hdHRyc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X2l0ZW1fYXR0cmlidXRlcy5jYyBiL3BhY2tldC9hdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJiYTg3Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJnZXRfaXRlbV9hdHRyaWJ1dGVzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotc3RkOjp1bmlxdWVfcHRyPEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyPgotR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1cyBzdGF0dXMsIHNpemVfdCBtdHUpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyKHN0YXR1cywgbXR1KSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLWJvb2wgR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6OkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZUVudHJ5IGVudHJ5KSB7Ci0gIENIRUNLKGVudHJpZXNfLnNpemUoKSA8IDB4RkYpOwotCi0gIHNpemVfdCByZW1haW5pbmdfc3BhY2UgPSBtdHVfIC0gc2l6ZSgpOwotICBpZiAoZW50cnkuc2l6ZSgpID4gcmVtYWluaW5nX3NwYWNlKSB7Ci0gICAgZW50cnkucmVzaXplKHJlbWFpbmluZ19zcGFjZSk7Ci0gIH0KLQotICBpZiAoZW50cnkuZW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGVudHJpZXNfLmluc2VydChlbnRyeSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpBZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGUgYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUpIHsKLSAgcmV0dXJuIEFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZUVudHJ5KGF0dHJpYnV0ZSwgdmFsdWUpKTsKLX0KLQotc2l6ZV90IEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICBzaXplX3QgbGVuID0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICBsZW4gKz0gMTsgIC8vIFN0YXR1cwotICBpZiAoc3RhdHVzXyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSByZXR1cm4gbGVuOwotCi0gIGxlbiArPSAxOyAgLy8gTnVtYmVyIG9mIGF0dHJpYnV0ZXMKLSAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGVudHJpZXNfKSB7Ci0gICAgbGVuICs9IGVudHJ5LnNpemUoKTsKLSAgfQotICByZXR1cm4gbGVuOwotfQotCi1ib29sIEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpTZXJpYWxpemUoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIHsKLSAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICBCcm93c2VQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKHBrdCwgc2l6ZSgpIC0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpKTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsICh1aW50OF90KXN0YXR1c18pOwotICBpZiAoc3RhdHVzXyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSByZXR1cm4gdHJ1ZTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIGVudHJpZXNfLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBlbnRyaWVzXykgewotICAgIEFkZFBheWxvYWRPY3RldHM0KHBrdCwgYmFzZTo6Qnl0ZVN3YXAoKHVpbnQzMl90KWVudHJ5LmF0dHJpYnV0ZSgpKSk7Ci0gICAgdWludDE2X3QgY2hhcmFjdGVyX3NldCA9IDB4MDA2YTsgIC8vIFVURi04Ci0gICAgQWRkUGF5bG9hZE9jdGV0czIocGt0LCBiYXNlOjpCeXRlU3dhcChjaGFyYWN0ZXJfc2V0KSk7Ci0gICAgdWludDE2X3QgdmFsdWVfbGVuZ3RoID0gZW50cnkudmFsdWUoKS5sZW5ndGgoKTsKLSAgICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKHZhbHVlX2xlbmd0aCkpOwotICAgIGZvciAoY29uc3QgdWludDhfdCYgYnl0ZSA6IGVudHJ5LnZhbHVlKCkpIHsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVNjb3BlIEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdDo6R2V0U2NvcGUoKSBjb25zdCB7Ci0gIGF1dG8gaXQgPSBiZWdpbigpICsgQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NvcGU+KCppdCk7Ci19Ci0KLXVpbnQ2NF90IEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdDo6R2V0VWlkKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIHJldHVybiBpdC5leHRyYWN0QkU8dWludDY0X3Q+KCk7Ci19Ci0KLXVpbnQxNl90IEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdDo6R2V0VWlkQ291bnRlcigpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDkpOwotICByZXR1cm4gaXQuZXh0cmFjdEJFPHVpbnQxNl90PigpOwotfQotCi11aW50OF90IEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdDo6R2V0TnVtQXR0cmlidXRlcygpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDExKTsKLSAgcmV0dXJuICppdDsKLX0KLQotc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBHZXRJdGVtQXR0cmlidXRlc1JlcXVlc3Q6OkdldEF0dHJpYnV0ZXNSZXF1ZXN0ZWQoKQotICAgIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDExKTsKLSAgc2l6ZV90IG51bWJlcl9vZl9hdHRyaWJ1dGVzID0gaXQuZXh0cmFjdDx1aW50OF90PigpOwotCi0gIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlX2xpc3Q7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYmVyX29mX2F0dHJpYnV0ZXM7IGkrKykgewotICAgIGF0dHJpYnV0ZV9saXN0LnB1c2hfYmFjaygoQXR0cmlidXRlKWl0LmV4dHJhY3RCRTx1aW50MzJfdD4oKSk7Ci0gIH0KLQotICByZXR1cm4gYXR0cmlidXRlX2xpc3Q7Ci19Ci0KLWJvb2wgR2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0OjpJc1ZhbGlkKCkgY29uc3QgewotICBpZiAoIUJyb3dzZVBhY2tldDo6SXNWYWxpZCgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaXplKCkgPCBrTWluU2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ2FzdGluZyB0aGUgaW50IHJldHVybmVkIGZyb20gZW5kIC0gYXR0cl9zdGFydCBzaG91bGQgYmUgZmluZS4gSWYgYW4KLSAgLy8gb3ZlcmZsb3cgb2NjdXJzIHdlIGNhbiBkZWZpbml0bHkgc2F5IHRoZSBwYWNrZXQgaXMgaW52YWxpZAotICByZXR1cm4gKEdldE51bUF0dHJpYnV0ZXMoKSAqIHNpemVvZihBdHRyaWJ1dGUpKSA9PSAoc2l6ZSgpIC0ga01pblNpemUoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiR2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0UGFja2V0OiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBEVSA9ICIgPDwgR2V0UGR1KCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgTGVuZ3RoID0gIiA8PCBHZXRMZW5ndGgoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBTY29wZSA9ICIgPDwgR2V0U2NvcGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBVSUQgUmVxdWVzdGVkID0gIiA8PCBsb2doZXgoR2V0VWlkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFVJRCBDb3VudGVyID0gIiA8PCBsb2doZXgoR2V0VWlkQ291bnRlcigpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBOdW0gQXR0cmlidXRlcyA9ICIgPDwgbG9naGV4KEdldE51bUF0dHJpYnV0ZXMoKSkgPDwgc3RkOjplbmRsOwotCi0gIGF1dG8gYXR0cl9saXN0ID0gR2V0QXR0cmlidXRlc1JlcXVlc3RlZCgpOwotICBzcyA8PCAiICDilJQgQXR0cmlidXRlIExpc3Q6IFNpemU6ICIgPDwgYXR0cl9saXN0LnNpemUoKSA8PCBzdGQ6OmVuZGw7Ci0gIGZvciAoYXV0byBpdCA9IGF0dHJfbGlzdC5iZWdpbigpOyBpdCAhPSBhdHRyX2xpc3QuZW5kKCk7IGl0KyspIHsKLSAgICBzcyA8PCAiICAgICAg4pSUICIgPDwgbG9naGV4KCh1aW50MzJfdCkoKml0KSkgPDwgc3RkOjplbmRsOwotICB9Ci0gIHNzIDw8IHN0ZDo6ZW5kbDsKLQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2dldF9pdGVtX2F0dHJpYnV0ZXMuaCBiL3BhY2tldC9hdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWRiNzEuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2dldF9pdGVtX2F0dHJpYnV0ZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiYXZyY3BfYnJvd3NlX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWNsYXNzIEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyIDogcHVibGljIEJyb3dzZVBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcj4gTWFrZUJ1aWxkZXIoCi0gICAgICBTdGF0dXMgc3RhdHVzLCBzaXplX3QgbXR1KTsKLQotICBib29sIEFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZUVudHJ5IGVudHJ5KTsKLSAgYm9vbCBBZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGUsIHN0ZDo6c3RyaW5nKTsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBTZXJpYWxpemUoCi0gICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBTdGF0dXMgc3RhdHVzXzsKLSAgc2l6ZV90IG10dV87Ci0gIHN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PiBlbnRyaWVzXzsKLQotICBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcihTdGF0dXMgc3RhdHVzLCBzaXplX3QgbXR1KQotICAgICAgOiBCcm93c2VQYWNrZXRCdWlsZGVyKEJyb3dzZVBkdTo6R0VUX0lURU1fQVRUUklCVVRFUyksCi0gICAgICAgIHN0YXR1c18oc3RhdHVzKSwKLSAgICAgICAgbXR1XyhtdHUpIHt9Ci19OwotCi1jbGFzcyBHZXRJdGVtQXR0cmlidXRlc1JlcXVlc3QgOiBwdWJsaWMgQnJvd3NlUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdCgpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogQXZyY3AgQ2hhbmdlIFBhdGggUGFja2V0IExheW91dAotICAgKiAgIEJyb3dzZVBhY2tldDoKLSAgICogICAgIHVpbnQ4X3QgcGR1XzsKLSAgICogICAgIHVpbnQxNl90IGxlbmd0aF87Ci0gICAqICAgR2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0OgotICAgKiAgICAgdWludDhfdCBzY29wZV87Ci0gICAqICAgICB1aW50NjRfdCB1aWRfOwotICAgKiAgICAgdWludDE2X3QgdWlkX2NvdW50ZXJfOwotICAgKiAgICAgdWludDhfdCBhdHRyX2NvdW50XzsKLSAgICogICAgIHVpbnQzMl90W10gYXR0cl9yZXF1ZXN0ZWRfOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyAxMjsgfQotCi0gIFNjb3BlIEdldFNjb3BlKCkgY29uc3Q7Ci0gIHVpbnQ2NF90IEdldFVpZCgpIGNvbnN0OwotICB1aW50MTZfdCBHZXRVaWRDb3VudGVyKCkgY29uc3Q7Ci0gIHVpbnQ4X3QgR2V0TnVtQXR0cmlidXRlcygpCi0gICAgICBjb25zdDsgIC8vIElmIHRoaXMgdmFsdWUgaXMgemVybywgdGhlbiBhbGwgYXR0cmlidXRlcyBhcmUgcmVxdWVzdGVkCi0gIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gR2V0QXR0cmlidXRlc1JlcXVlc3RlZCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdXNpbmcgQnJvd3NlUGFja2V0OjpCcm93c2VQYWNrZXQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldC5jYyBiL3BhY2tldC9hdnJjcC9nZXRfcGxheV9zdGF0dXNfcGFja2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQwZGU5Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZXRfcGxheV9zdGF0dXNfcGFja2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdldF9wbGF5X3N0YXR1c19wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnN0cmluZyBHZXRQbGF5U3RhdHVzUmVxdWVzdDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiR2V0UGxheVN0YXR1c1JlcXVlc3QiOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8R2V0UGxheVN0YXR1c1Jlc3BvbnNlQnVpbGRlcj4KLUdldFBsYXlTdGF0dXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHVpbnQzMl90IHNvbmdfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc29uZ19wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGxheV9zdGF0dXMpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPEdldFBsYXlTdGF0dXNSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgR2V0UGxheVN0YXR1c1Jlc3BvbnNlQnVpbGRlcihzb25nX2xlbmd0aCwgc29uZ19wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlfc3RhdHVzKSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXNpemVfdCBHZXRQbGF5U3RhdHVzUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICByZXR1cm4gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpICsgNCArIDQgKyAxOwotfQotCi1ib29sIEdldFBsYXlTdGF0dXNSZXNwb25zZUJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIC8vIFB1c2ggdGhlIHN0YW5kYXJkIGF2cmNwIGhlYWRlcnMKLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIC8vIFB1c2ggdGhlIGF2cmNwIHZlbmRvciBjb21tYW5kIGhlYWRlcnMKLSAgdWludDE2X3QgcGFyYW1ldGVyX2NvdW50ID0gc2l6ZSgpIC0gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpOwotICBWZW5kb3JQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKHBrdCwgcGFyYW1ldGVyX2NvdW50KTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIGJhc2U6OkJ5dGVTd2FwKHNvbmdfbGVuZ3RoXykpOwotICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIGJhc2U6OkJ5dGVTd2FwKHNvbmdfcG9zaXRpb25fKSk7Ci0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgcGxheV9zdGF0dXNfKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL2dldF9wbGF5X3N0YXR1c19wYWNrZXQuaCBiL3BhY2tldC9hdnJjcC9nZXRfcGxheV9zdGF0dXNfcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTRjMjYuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL2dldF9wbGF5X3N0YXR1c19wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLS8vIFRPRE8gKGFwYW5pY2tlKTogVGhpcyBwYWNrZXQgZG9lc24ndCByZWFsbHkgbmVlZCB0byBleGlzdCBhcyBpdCBwcm92aWRlcwotLy8gemVybyBleHRyYSBpbmZvcm1hdGlvbiBvdGhlciB0aGFuIGl0IGlzIGEgc3Ryb25nIHR5cGUgYW5kIHByb3ZpZGVzIGEKLS8vIHZhbGlkYXRvcgotY2xhc3MgR2V0UGxheVN0YXR1c1JlcXVlc3QgOiBwdWJsaWMgVmVuZG9yUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkdldFBsYXlTdGF0dXNSZXF1ZXN0KCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiAgR2V0IENhcGFiaWxpdGllcyBSZXNwb25zZSBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQXZyY3BQYWNrZXQ6Ci0gICAqICAgICBDVHlwZSBjX3R5cGVfOwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF9pZF8gOiAzOwotICAgKiAgICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgVmVuZG9yUGFja2V0OgotICAgKiAgICAgdWludDhfdCBjb21wYW55X2lkWzNdOwotICAgKiAgICAgdWludDhfdCBjb21tYW5kX3BkdTsKLSAgICogICAgIHVpbnQ4X3QgcGFja2V0X3R5cGU7Ci0gICAqICAgICB1aW50MTZfdCBwYXJhbV9sZW5ndGggPSAwOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBQYWNrZXQ6OmtNaW5TaXplKCkgKyA3OyB9Ci0KLSAgLy8gT3ZlcmxvYWRlZCBGdW5jdGlvbnMKLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBWZW5kb3JQYWNrZXQ6OlZlbmRvclBhY2tldDsKLX07Ci0KLWNsYXNzIEdldFBsYXlTdGF0dXNSZXNwb25zZUJ1aWxkZXIgOiBwdWJsaWMgVmVuZG9yUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5HZXRQbGF5U3RhdHVzUmVzcG9uc2VCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8R2V0UGxheVN0YXR1c1Jlc3BvbnNlQnVpbGRlcj4gTWFrZUJ1aWxkZXIoCi0gICAgICB1aW50MzJfdCBzb25nX2xlbmd0aCwgdWludDMyX3Qgc29uZ19wb3NpdGlvbiwgdWludDhfdCBwbGF5X3N0YXR1cyk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1aW50MzJfdCBzb25nX2xlbmd0aF87Ci0gIHVpbnQzMl90IHNvbmdfcG9zaXRpb25fOwotICB1aW50OF90IHBsYXlfc3RhdHVzXzsKLQotICBHZXRQbGF5U3RhdHVzUmVzcG9uc2VCdWlsZGVyKHVpbnQzMl90IHNvbmdfbGVuZ3RoLCB1aW50MzJfdCBzb25nX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGxheV9zdGF0dXMpCi0gICAgICA6IFZlbmRvclBhY2tldEJ1aWxkZXIoQ1R5cGU6OlNUQUJMRSwgQ29tbWFuZFBkdTo6R0VUX1BMQVlfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFR5cGU6OlNJTkdMRSksCi0gICAgICAgIHNvbmdfbGVuZ3RoXyhzb25nX2xlbmd0aCksCi0gICAgICAgIHNvbmdfcG9zaXRpb25fKHNvbmdfcG9zaXRpb24pLAotICAgICAgICBwbGF5X3N0YXR1c18ocGxheV9zdGF0dXMpe307Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtcy5jYyBiL3BhY2tldC9hdnJjcC9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYwMWVhLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8R2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyPgotR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICBTdGF0dXMgc3RhdHVzLCB1aW50MTZfdCB1aWRfY291bnRlciwgdWludDMyX3QgbnVtX2l0ZW1zX2luX2ZvbGRlcikgewotICBzdGQ6OnVuaXF1ZV9wdHI8R2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IEdldFRvdGFsTnVtYmVyT2ZJdGVtc1Jlc3BvbnNlQnVpbGRlcihzdGF0dXMsIHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1faXRlbXNfaW5fZm9sZGVyKSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXNpemVfdCBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXNwb25zZUJ1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHNpemVfdCBsZW4gPSBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCk7Ci0gIGxlbiArPSAxOyAgLy8gU3RhdHVzCi0KLSAgaWYgKHN0YXR1c18gIT0gU3RhdHVzOjpOT19FUlJPUikgcmV0dXJuIGxlbjsKLQotICBsZW4gKz0gMjsgIC8vIFVJRCBDb3VudGVyCi0gIGxlbiArPSA0OyAgLy8gTnVtYmVyIG9mIGl0ZW1zIGluIGZvbGRlcgotICByZXR1cm4gbGVuOwotfQotCi1ib29sIEdldFRvdGFsTnVtYmVyT2ZJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgQnJvd3NlUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QsIHNpemUoKSAtIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSk7Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAodWludDhfdClzdGF0dXNfKTsKLQotICBpZiAoc3RhdHVzXyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSByZXR1cm4gdHJ1ZTsKLSAgQWRkUGF5bG9hZE9jdGV0czIocGt0LCBiYXNlOjpCeXRlU3dhcCh1aWRfY291bnRlcl8pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czQocGt0LCBiYXNlOjpCeXRlU3dhcChudW1faXRlbXNfaW5fZm9sZGVyXykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotU2NvcGUgR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdDo6R2V0U2NvcGUoKSBjb25zdCB7Ci0gIGF1dG8gaXQgPSBiZWdpbigpICsgQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NvcGU+KCppdCk7Ci19Ci0KLWJvb2wgR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdDo6SXNWYWxpZCgpIGNvbnN0IHsKLSAgaWYgKCFCcm93c2VQYWNrZXQ6OklzVmFsaWQoKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gc2l6ZSgpID09IGtNaW5TaXplKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEdldFRvdGFsTnVtYmVyT2ZJdGVtc1JlcXVlc3Q6OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgIkdldFRvdGFsTnVtYmVyT2ZJdGVtc1JlcXVlc3Q6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUERVID0gIiA8PCBHZXRQZHUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBMZW5ndGggPSAiIDw8IEdldExlbmd0aCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFNjb3BlID0gIiA8PCBHZXRTY29wZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtcy5oIGIvcGFja2V0L2F2cmNwL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4NDJjOS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvYXZyY3AvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJhdnJjcF9icm93c2VfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyIDogcHVibGljIEJyb3dzZVBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8R2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1cyBzdGF0dXMsIHVpbnQxNl90IHVpZF9jb3VudGVyLCB1aW50MzJfdCBudW1faXRlbXNfaW5fZm9sZGVyKTsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBTZXJpYWxpemUoCi0gICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFN0YXR1cyBzdGF0dXNfOwotICB1aW50MTZfdCB1aWRfY291bnRlcl87Ci0gIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXJfOwotCi0gIEdldFRvdGFsTnVtYmVyT2ZJdGVtc1Jlc3BvbnNlQnVpbGRlcihTdGF0dXMgc3RhdHVzLCB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXIpCi0gICAgICA6IEJyb3dzZVBhY2tldEJ1aWxkZXIoQnJvd3NlUGR1OjpHRVRfVE9UQUxfTlVNQkVSX09GX0lURU1TKSwKLSAgICAgICAgc3RhdHVzXyhzdGF0dXMpLAotICAgICAgICB1aWRfY291bnRlcl8odWlkX2NvdW50ZXIpLAotICAgICAgICBudW1faXRlbXNfaW5fZm9sZGVyXyhudW1faXRlbXNfaW5fZm9sZGVyKXt9OwotfTsKLQotY2xhc3MgR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdCA6IHB1YmxpYyBCcm93c2VQYWNrZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+R2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdCgpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogQVZSQ1AgR2V0IFRvdGFsIE51bWJlciBPZiBJdGVtcyBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQnJvd3NlUGFja2V0OgotICAgKiAgICAgdWludDhfdCBwZHVfOwotICAgKiAgICAgdWludDE2X3QgbGVuZ3RoXzsKLSAgICogICBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXF1ZXN0OgotICAgKiAgICAgdWludDhfdCBzY29wZV87Ci0gICAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluU2l6ZSgpIHsgcmV0dXJuIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIDE7IH0KLQotICBTY29wZSBHZXRTY29wZSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdXNpbmcgQnJvd3NlUGFja2V0OjpCcm93c2VQYWNrZXQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvcGFzc190aHJvdWdoX3BhY2tldC5jYyBiL3BhY2tldC9hdnJjcC9wYXNzX3Rocm91Z2hfcGFja2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2I4ZDE2Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9wYXNzX3Rocm91Z2hfcGFja2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInBhc3NfdGhyb3VnaF9wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8UGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyPiBQYXNzVGhyb3VnaFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgIGJvb2wgcmVzcG9uc2UsIGJvb2wgcHVzaGVkLCB1aW50OF90IG9wcGVyYXRpb25faWQpIHsKLSAgYXV0byBidWlsZGVyID0gc3RkOjp1bmlxdWVfcHRyPFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcj4oCi0gICAgICBuZXcgUGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyKHJlc3BvbnNlLCBwdXNoZWQsIG9wcGVyYXRpb25faWQpKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFBhc3NUaHJvdWdoUGFja2V0OjprTWluU2l6ZSgpOwotfQotCi1ib29sIFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIHVpbnQ4X3QgYnl0ZSA9IG9wcGVyYXRpb25faWRfICYgMGIwMTExMTExMTsKLSAgaWYgKCFwdXNoZWRfKSBieXRlIHw9IDBiMTAwMDAwMDA7Ci0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gIC8vIERhdGEgbGVuZ3RoLCBmb3IgdGhpcyBwYWNrZXQgaXQncyBhbHdheXMgMDsKLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAweDAwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotS2V5U3RhdGUgUGFzc1Rocm91Z2hQYWNrZXQ6OkdldEtleVN0YXRlKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFBhY2tldDo6a01pblNpemUoKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEtleVN0YXRlPigoKCppdCkgJiAwYjEwMDAwMDAwKSA+PiA3KTsKLX0KLQotdWludDhfdCBQYXNzVGhyb3VnaFBhY2tldDo6R2V0T3BlcmF0aW9uSWQoKSBjb25zdCB7Ci0gIHJldHVybiAqKGJlZ2luKCkgKyBQYWNrZXQ6OmtNaW5TaXplKCkpICYgMGIwMTExMTExMTsKLX0KLQotYm9vbCBQYXNzVGhyb3VnaFBhY2tldDo6SXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSBrTWluU2l6ZSgpOyB9Ci0KLXN0ZDo6c3RyaW5nIFBhc3NUaHJvdWdoUGFja2V0OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJBdnJjcDo6QXZyY3BQYWNrZXQ6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgY1R5cGUgPSAiIDw8IEdldENUeXBlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU3VidW5pdCBUeXBlID0gIiA8PCBsb2doZXgoR2V0U3VidW5pdFR5cGUoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU3VidW5pdCBJRCA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRJZCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBPcENvZGUgPSAiIDw8IEdldE9wY29kZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFB1c2hlZCA9ICIgPDwgR2V0S2V5U3RhdGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBPcHBlcmF0aW9uIElEID0gIiA8PCBsb2doZXgoR2V0T3BlcmF0aW9uSWQoKSkgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL3Bhc3NfdGhyb3VnaF9wYWNrZXQuaCBiL3BhY2tldC9hdnJjcC9wYXNzX3Rocm91Z2hfcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2IzZDguLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL3Bhc3NfdGhyb3VnaF9wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYXZyY3BfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgUGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyIDogcHVibGljIFBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIGJvb2wgcmVzcG9uc2UsIGJvb2wgcHVzaGVkLCB1aW50OF90IG9wZXJhdGlvbl9pZCk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBwdXNoZWRfOwotICB1aW50OF90IG9wcGVyYXRpb25faWRfOwotCi0gIFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcihib29sIHJlc3BvbnNlLCBib29sIHB1c2hlZCwgdWludDhfdCBvcHBlcmF0aW9uX2lkKQotICAgICAgOiBQYWNrZXRCdWlsZGVyKHJlc3BvbnNlID8gQ1R5cGU6OkFDQ0VQVEVEIDogQ1R5cGU6OkNPTlRST0wsIDB4MDksIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlOjpQQVNTX1RIUk9VR0gpLAotICAgICAgICBwdXNoZWRfKHB1c2hlZCksCi0gICAgICAgIG9wcGVyYXRpb25faWRfKG9wcGVyYXRpb25faWQpe307Ci19OwotCi1jbGFzcyBQYXNzVGhyb3VnaFBhY2tldCA6IHB1YmxpYyBQYWNrZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFzc1Rocm91Z2hQYWNrZXQoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIFBhc3MgVGhyb3VnaCBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQXZyY3BQYWNrZXQ6Ci0gICAqICAgICBDVHlwZSBjX3R5cGVfOwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF9pZF8gOiAzOwotICAgKiAgICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgUGFzc1Rocm91Z2hQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IHN0YXRlIDogMTsKLSAgICogICAgIHVpbnQ4X3Qgb3BwZXJhdGlvbl9pZCA6IDc7Ci0gICAqICAgICB1aW50OF90IGRhdGFfbGVuZ3RoOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBQYWNrZXQ6OmtNaW5TaXplKCkgKyAyOyB9Ci0KLSAgLy8gR2V0dGVyIEZ1bmN0aW9ucwotICBLZXlTdGF0ZSBHZXRLZXlTdGF0ZSgpIGNvbnN0OwotICB1aW50OF90IEdldE9wZXJhdGlvbklkKCkgY29uc3Q7Ci0KLSAgLy8gT3ZlcmxvYWRlZCBGdW5jdGlvbnMKLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBQYWNrZXQ6OlBhY2tldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9wbGF5X2l0ZW0uY2MgYi9wYWNrZXQvYXZyY3AvcGxheV9pdGVtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JiOWI3Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9wbGF5X2l0ZW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicGxheV9pdGVtLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotc3RkOjp1bmlxdWVfcHRyPFBsYXlJdGVtUmVzcG9uc2VCdWlsZGVyPiBQbGF5SXRlbVJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgU3RhdHVzIHN0YXR1cykgewotICBzdGQ6OnVuaXF1ZV9wdHI8UGxheUl0ZW1SZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgUGxheUl0ZW1SZXNwb25zZUJ1aWxkZXIoc3RhdHVzKSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXNpemVfdCBQbGF5SXRlbVJlc3BvbnNlQnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgc2l6ZV90IGxlbiA9IFZlbmRvclBhY2tldDo6a01pblNpemUoKTsKLSAgbGVuICs9IDE7ICAvLyBTdGF0dXMKLSAgcmV0dXJuIGxlbjsKLX0KLQotYm9vbCBQbGF5SXRlbVJlc3BvbnNlQnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCBzaXplKCkgLSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkpOwotCi0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgKHVpbnQ4X3Qpc3RhdHVzXyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVNjb3BlIFBsYXlJdGVtUmVxdWVzdDo6R2V0U2NvcGUoKSBjb25zdCB7Ci0gIGF1dG8gaXQgPSBiZWdpbigpICsgVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NvcGU+KCppdCk7Ci19Ci0KLXVpbnQ2NF90IFBsYXlJdGVtUmVxdWVzdDo6R2V0VWlkKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIHJldHVybiBpdC5leHRyYWN0QkU8dWludDY0X3Q+KCk7Ci19Ci0KLXVpbnQxNl90IFBsYXlJdGVtUmVxdWVzdDo6R2V0VWlkQ291bnRlcigpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDkpOwotICByZXR1cm4gaXQuZXh0cmFjdEJFPHVpbnQxNl90PigpOwotfQotCi1ib29sIFBsYXlJdGVtUmVxdWVzdDo6SXNWYWxpZCgpIGNvbnN0IHsKLSAgaWYgKCFWZW5kb3JQYWNrZXQ6OklzVmFsaWQoKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gc2l6ZSgpID09IGtNaW5TaXplKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFBsYXlJdGVtUmVxdWVzdDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiUGxheUl0ZW1SZXF1ZXN0OiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIGNUeXBlID0gIiA8PCBHZXRDVHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgVHlwZSA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRUeXBlKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgSUQgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgT3BDb2RlID0gIiA8PCBHZXRPcGNvZGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBDb21wYW55IElEID0gIiA8PCBsb2doZXgoR2V0Q29tcGFueUlkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIENvbW1hbmQgUERVID0gIiA8PCBHZXRDb21tYW5kUGR1KCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGFja2V0VHlwZSA9ICIgPDwgR2V0UGFja2V0VHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBhcmFtZXRlciBMZW5ndGggPSAiIDw8IGxvZ2hleChHZXRQYXJhbWV0ZXJMZW5ndGgoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU2NvcGUgPSAiIDw8IEdldFNjb3BlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgVUlEID0gIiA8PCBsb2doZXgoR2V0VWlkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFVJRCBDb3VudGVyID0gIiA8PCBsb2doZXgoR2V0VWlkQ291bnRlcigpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8IHN0ZDo6ZW5kbDsKLQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL3BsYXlfaXRlbS5oIGIvcGFja2V0L2F2cmNwL3BsYXlfaXRlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWMyZDQ4Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9wbGF5X2l0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWNsYXNzIFBsYXlJdGVtUmVzcG9uc2VCdWlsZGVyIDogcHVibGljIFZlbmRvclBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGxheUl0ZW1SZXNwb25zZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQbGF5SXRlbVJlc3BvbnNlQnVpbGRlcj4gTWFrZUJ1aWxkZXIoU3RhdHVzIHN0YXR1cyk7Ci0KLSAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKAotICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBTdGF0dXMgc3RhdHVzXzsKLQotICBQbGF5SXRlbVJlc3BvbnNlQnVpbGRlcihTdGF0dXMgc3RhdHVzKQotICAgICAgOiBWZW5kb3JQYWNrZXRCdWlsZGVyKENUeXBlOjpBQ0NFUFRFRCwgQ29tbWFuZFBkdTo6UExBWV9JVEVNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFR5cGU6OlNJTkdMRSksCi0gICAgICAgIHN0YXR1c18oc3RhdHVzKXt9OwotfTsKLQotY2xhc3MgUGxheUl0ZW1SZXF1ZXN0IDogcHVibGljIFZlbmRvclBhY2tldCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5QbGF5SXRlbVJlcXVlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIEFWUkNQIFBsYXkgSXRlbSBSZXF1ZXN0IFBhY2tldCBMYXlvdXQKLSAgICogICBBdnJjcFBhY2tldDoKLSAgICogICAgIENUeXBlIGNfdHlwZV87Ci0gICAqICAgICB1aW50OF90IHN1YnVuaXRfdHlwZV8gOiA1OwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X2lkXyA6IDM7Ci0gICAqICAgICBPcGNvZGUgb3Bjb2RlXzsKLSAgICogICBWZW5kb3JQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IGNvbXBhbnlfaWRbM107Ci0gICAqICAgICB1aW50OF90IGNvbW1hbmRfcGR1OwotICAgKiAgICAgdWludDhfdCBwYWNrZXRfdHlwZTsKLSAgICogICAgIHVpbnQxNl90IHBhcmFtZXRlcl9sZW5ndGg7Ci0gICAqICAgUGxheUl0ZW1SZXF1ZXN0OgotICAgKiAgICAgdWludDhfdCBzY29wZV87Ci0gICAqICAgICB1aW50NjRfdCB1aWRfOwotICAgKiAgICAgdWludDE2X3QgdWlkX2NvdW50ZXJfOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyAxMTsgfQotCi0gIFNjb3BlIEdldFNjb3BlKCkgY29uc3Q7Ci0gIHVpbnQ2NF90IEdldFVpZCgpIGNvbnN0OwotICB1aW50MTZfdCBHZXRVaWRDb3VudGVyKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBWZW5kb3JQYWNrZXQ6OlZlbmRvclBhY2tldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcGFja2V0LmNjIGIvcGFja2V0L2F2cmNwL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYmQxNmEuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAicmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWJvb2wgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZTo6SXNJbnRlcmltKCkgY29uc3QgewotICByZXR1cm4gR2V0Q1R5cGUoKSA9PSBDVHlwZTo6SU5URVJJTTsKLX0KLQotRXZlbnQgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZTo6R2V0RXZlbnQoKSBjb25zdCB7Ci0gIGF1dG8gdmFsdWUgPSAqKGJlZ2luKCkgKyBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8RXZlbnQ+KHZhbHVlKTsKLX0KLQotdWludDhfdCBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlOjpHZXRWb2x1bWUoKSBjb25zdCB7Ci0gIENIRUNLKEdldEV2ZW50KCkgPT0gRXZlbnQ6OlZPTFVNRV9DSEFOR0VEKTsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpOwotICByZXR1cm4gKml0OwotfQotCi1ib29sIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2U6OklzVmFsaWQoKSBjb25zdCB7Ci0gIGlmICghVmVuZG9yUGFja2V0OjpJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUoKSA8IGtNaW5TaXplKCkpIHJldHVybiBmYWxzZTsKLSAgaWYgKEdldENUeXBlKCkgIT0gQ1R5cGU6OklOVEVSSU0gJiYgR2V0Q1R5cGUoKSAhPSBDVHlwZTo6Q0hBTkdFRCAmJiBHZXRDVHlwZSgpICE9IENUeXBlOjpSRUpFQ1RFRCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN3aXRjaCAoR2V0RXZlbnQoKSkgewotICAgIGNhc2UgRXZlbnQ6OlZPTFVNRV9DSEFOR0VEOgotICAgICAgcmV0dXJuIHNpemUoKSA9PSAoa01pblNpemUoKSArIDEpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvLyBUT0RPIChhcGFuaWNrZSk6IEFkZCB0aGUgcmVtYWluaW5nIGV2ZW50cyB3aGVuIGltcGxlbWVudGluZyBBVlJDUAotICAgICAgLy8gQ29udHJvbGxlcgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2U6OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgIlJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2U6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgY1R5cGUgPSAiIDw8IEdldENUeXBlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU3VidW5pdCBUeXBlID0gIiA8PCBsb2doZXgoR2V0U3VidW5pdFR5cGUoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU3VidW5pdCBJRCA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRJZCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBPcENvZGUgPSAiIDw8IEdldE9wY29kZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIENvbXBhbnkgSUQgPSAiIDw8IGxvZ2hleChHZXRDb21wYW55SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgQ29tbWFuZCBQRFUgPSAiIDw8IEdldENvbW1hbmRQZHUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBQYWNrZXRUeXBlID0gIiA8PCBHZXRQYWNrZXRUeXBlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGFyYW1ldGVyIExlbmd0aCA9ICIgPDwgbG9naGV4KEdldFBhcmFtZXRlckxlbmd0aCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBFdmVudCBSZWdpc3RlcmVkID0gIiA8PCBHZXRFdmVudCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPgotUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5YmFja1N0YXR1c0J1aWxkZXIoCi0gICAgYm9vbCBpbnRlcmltLCB1aW50OF90IHBsYXlfc3RhdHVzKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcihpbnRlcmltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50OjpQTEFZQkFDS19TVEFUVVNfQ0hBTkdFRCkpOwotCi0gIGJ1aWxkZXItPmRhdGFfID0gcGxheV9zdGF0dXM7Ci0gIHJldHVybiBidWlsZGVyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI+Ci1SZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVRyYWNrQ2hhbmdlZEJ1aWxkZXIoCi0gICAgYm9vbCBpbnRlcmltLCB1aW50NjRfdCB0cmFja191aWQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyKGludGVyaW0sIEV2ZW50OjpUUkFDS19DSEFOR0VEKSk7Ci0KLSAgYnVpbGRlci0+ZGF0YV8gPSB0cmFja191aWQ7Ci0gIHJldHVybiBidWlsZGVyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI+Ci1SZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXliYWNrUG9zaXRpb25CdWlsZGVyKAotICAgIGJvb2wgaW50ZXJpbSwgdWludDMyX3QgcGxheWJhY2tfcG9zKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcihpbnRlcmltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50OjpQTEFZQkFDS19QT1NfQ0hBTkdFRCkpOwotCi0gIGJ1aWxkZXItPmRhdGFfID0gcGxheWJhY2tfcG9zOwotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPgotUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcihib29sIGludGVyaW0pIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyKAotICAgICAgICAgIGludGVyaW0sIEV2ZW50OjpOT1dfUExBWUlOR19DT05URU5UX0NIQU5HRUQpKTsKLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4KLVJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlQXZhaWxhYmxlUGxheWVyc0J1aWxkZXIoYm9vbCBpbnRlcmltKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4gYnVpbGRlcigKLSAgICAgIG5ldyBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcigKLSAgICAgICAgICBpbnRlcmltLCBFdmVudDo6QVZBSUxBQkxFX1BMQVlFUlNfQ0hBTkdFRCkpOwotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPgotUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VBZGRyZXNzZWRQbGF5ZXJCdWlsZGVyKAotICAgIGJvb2wgaW50ZXJpbSwgdWludDE2X3QgcGxheWVyX2lkLCB1aW50MTZfdCB1aWRfY291bnRlcikgewotICBzdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXIoaW50ZXJpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudDo6QUREUkVTU0VEX1BMQVlFUl9DSEFOR0VEKSk7Ci0gIGJ1aWxkZXItPmRhdGFfID0gKCh1aW50MzJfdClwbGF5ZXJfaWQpIDw8IDE2OwotICBidWlsZGVyLT5kYXRhXyB8PSB1aWRfY291bnRlcjsKLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4KLVJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlVWlkc0NoYW5nZWRCdWlsZGVyKAotICAgIGJvb2wgaW50ZXJpbSwgdWludDE2X3QgdWlkX2NvdW50ZXIpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyKGludGVyaW0sIEV2ZW50OjpVSURTX0NIQU5HRUQpKTsKLQotICBidWlsZGVyLT5kYXRhXyA9IHVpZF9jb3VudGVyOwotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICBzaXplX3QgZGF0YV9zaXplID0gMDsKLQotICAvLyBXZSBzcGVjaWZpY2FsbHkgYXZvaWQgaGF2aW5nIGEgZGVmYXVsdCBjYXNlIGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQKLSAgLy8gdGhlcmUgaXMgYW4gZXJyb3IgaW4gY2FzZSBhbiBldmVudCBpc24ndCBoYW5kbGVkLgotICBzd2l0Y2ggKGV2ZW50XykgewotICAgIGNhc2UgRXZlbnQ6OlBMQVlCQUNLX1NUQVRVU19DSEFOR0VEOgotICAgICAgZGF0YV9zaXplID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRXZlbnQ6OlRSQUNLX0NIQU5HRUQ6Ci0gICAgICBkYXRhX3NpemUgPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFdmVudDo6UExBWUJBQ0tfUE9TX0NIQU5HRUQ6Ci0gICAgICBkYXRhX3NpemUgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFdmVudDo6UExBWUVSX0FQUExJQ0FUSU9OX1NFVFRJTkdfQ0hBTkdFRDoKLSAgICAgIExPRyhGQVRBTCkgPDwgIlBsYXllciBBcHBsaWNhdGlvbiBOb3RpZmljYXRpb24gTm90IEltcGxlbWVudGVkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRXZlbnQ6Ok5PV19QTEFZSU5HX0NPTlRFTlRfQ0hBTkdFRDoKLSAgICAgIGRhdGFfc2l6ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEV2ZW50OjpBVkFJTEFCTEVfUExBWUVSU19DSEFOR0VEOgotICAgICAgZGF0YV9zaXplID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRXZlbnQ6OkFERFJFU1NFRF9QTEFZRVJfQ0hBTkdFRDoKLSAgICAgIGRhdGFfc2l6ZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEV2ZW50OjpVSURTX0NIQU5HRUQ6Ci0gICAgICBkYXRhX3NpemUgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFdmVudDo6Vk9MVU1FX0NIQU5HRUQ6Ci0gICAgICBMT0coRkFUQUwpIDw8ICJWb2x1bWUgQ2hhbmdlZCBOb3RpZmljYXRpb24gTm90IEltcGxlbWVudGVkIjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIDEgKyBkYXRhX3NpemU7Ci19Ci0KLWJvb2wgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIFBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0KTsKLQotICBWZW5kb3JQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKHBrdCwgc2l6ZSgpIC0gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpKTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGV2ZW50XykpOwotICBzd2l0Y2ggKGV2ZW50XykgewotICAgIGNhc2UgRXZlbnQ6OlBMQVlCQUNLX1NUQVRVU19DSEFOR0VEOiB7Ci0gICAgICB1aW50OF90IHBsYXliYWNrX3N0YXR1cyA9IGRhdGFfICYgMHhGRjsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgcGxheWJhY2tfc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50OjpUUkFDS19DSEFOR0VEOiB7Ci0gICAgICBBZGRQYXlsb2FkT2N0ZXRzOChwa3QsIGJhc2U6OkJ5dGVTd2FwKGRhdGFfKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudDo6UExBWUJBQ0tfUE9TX0NIQU5HRUQ6IHsKLSAgICAgIHVpbnQzMl90IHBsYXliYWNrX3BvcyA9IGRhdGFfICYgMHhGRkZGRkZGRjsKLSAgICAgIEFkZFBheWxvYWRPY3RldHM0KHBrdCwgYmFzZTo6Qnl0ZVN3YXAocGxheWJhY2tfcG9zKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudDo6UExBWUVSX0FQUExJQ0FUSU9OX1NFVFRJTkdfQ0hBTkdFRDoKLSAgICAgIGJyZWFrOyAgLy8gTm8gYWRkaXRpb25hbCBkYXRhCi0gICAgY2FzZSBFdmVudDo6Tk9XX1BMQVlJTkdfQ09OVEVOVF9DSEFOR0VEOgotICAgICAgYnJlYWs7ICAvLyBObyBhZGRpdGlvbmFsIGRhdGEKLSAgICBjYXNlIEV2ZW50OjpBVkFJTEFCTEVfUExBWUVSU19DSEFOR0VEOgotICAgICAgYnJlYWs7ICAvLyBObyBhZGRpdGlvbmFsIGRhdGEKLSAgICBjYXNlIEV2ZW50OjpBRERSRVNTRURfUExBWUVSX0NIQU5HRUQ6IHsKLSAgICAgIHVpbnQxNl90IHVpZF9jb3VudGVyID0gZGF0YV8gJiAweEZGRkY7Ci0gICAgICB1aW50MTZfdCBwbGF5ZXJfaWQgPSAoZGF0YV8gPj4gMTYpICYgMHhGRkZGOwotICAgICAgQWRkUGF5bG9hZE9jdGV0czIocGt0LCBiYXNlOjpCeXRlU3dhcChwbGF5ZXJfaWQpKTsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAodWlkX2NvdW50ZXIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEV2ZW50OjpVSURTX0NIQU5HRUQ6IHsKLSAgICAgIHVpbnQxNl90IHVpZF9jb3VudGVyID0gZGF0YV8gJiAweEZGRkY7Ci0gICAgICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKHVpZF9jb3VudGVyKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBFdmVudDo6Vk9MVU1FX0NIQU5HRUQ6Ci0gICAgICAvLyBUT0RPIChhcGFuaWNrZSk6IEFkZCBWb2x1bWUgQ2hhbmdlZCBidWlsZGVyIGZvciB3aGVuIHdlIGFyZSBjb250cm9sbGVyLgotICAgICAgTE9HKEZBVEFMKSA8PCAiVm9sdW1lIENoYW5nZWQgTm90aWZpY2F0aW9uIE5vdCBJbXBsZW1lbnRlZCI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1FdmVudCBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3Q6OkdldEV2ZW50UmVnaXN0ZXJlZCgpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZSA9ICooYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxFdmVudD4odmFsdWUpOwotfQotCi11aW50MzJfdCBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3Q6OkdldEludGVydmFsKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIHJldHVybiBpdC5leHRyYWN0QkU8dWludDMyX3Q+KCk7Ci19Ci0KLWJvb2wgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0OjpJc1ZhbGlkKCkgY29uc3QgewotICByZXR1cm4gKHNpemUoKSA9PSBrTWluU2l6ZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8ICJSZWdpc3Rlck5vdGlmaWNhdGlvblBhY2tldDogIiA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBjVHlwZSA9ICIgPDwgR2V0Q1R5cGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBTdWJ1bml0IFR5cGUgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0VHlwZSgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBTdWJ1bml0IElEID0gIiA8PCBsb2doZXgoR2V0U3VidW5pdElkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIE9wQ29kZSA9ICIgPDwgR2V0T3Bjb2RlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgQ29tcGFueSBJRCA9ICIgPDwgbG9naGV4KEdldENvbXBhbnlJZCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBDb21tYW5kIFBEVSA9ICIgPDwgR2V0Q29tbWFuZFBkdSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBhY2tldFR5cGUgPSAiIDw8IEdldFBhY2tldFR5cGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBQYXJhbWV0ZXIgTGVuZ3RoID0gIiA8PCBsb2doZXgoR2V0UGFyYW1ldGVyTGVuZ3RoKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIEV2ZW50IFJlZ2lzdGVyZWQgPSAiIDw8IEdldEV2ZW50UmVnaXN0ZXJlZCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIEludGVydmFsID0gIiA8PCBsb2doZXgoR2V0SW50ZXJ2YWwoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCBzdGQ6OmVuZGw7Ci0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcj4KLVJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKEV2ZW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW50ZXJ2YWwpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcihldmVudCwgaW50ZXJ2YWwpKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3Q6OmtNaW5TaXplKCk7Ci19Ci0KLWJvb2wgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCBzaXplKCkgLSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkpOwotCi0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oZXZlbnRfKSk7Ci0KLSAgQWRkUGF5bG9hZE9jdGV0czQocGt0LCBiYXNlOjpCeXRlU3dhcChpbnRlcnZhbF8pKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldC5oIGIvcGFja2V0L2F2cmNwL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyODZjNC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvYXZyY3AvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLWNsYXNzIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UgOiBwdWJsaWMgVmVuZG9yUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqICBSZWdpc3RlciBOb3RpZmljYWl0b24gUmVxdWVzdCBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQXZyY3BQYWNrZXQ6Ci0gICAqICAgICBDVHlwZSBjX3R5cGVfOwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF9pZF8gOiAzOwotICAgKiAgICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgVmVuZG9yUGFja2V0OgotICAgKiAgICAgdWludDhfdCBjb21wYW55X2lkWzNdOwotICAgKiAgICAgdWludDhfdCBjb21tYW5kX3BkdTsKLSAgICogICAgIHVpbnQ4X3QgcGFja2V0X3R5cGU7Ci0gICAqICAgICB1aW50MTZfdCBwYXJhbV9sZW5ndGg7Ci0gICAqICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0UGFja2V0OgotICAgKiAgICAgdWludDhfdCBldmVudF9pZDsKLSAgICogICAgIHVpbnQ4X3RbXSBkYXRhOyAgLy8gTGVuZ3RoIGNoYW5nZXMgYmFzZWQgb24gdGhlIGV2ZW50X2lkCi0gICAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluU2l6ZSgpIHsgcmV0dXJuIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIDE7IH0KLQotICAvLyBUT0RPIChhcGFuaWNrZSk6IEFkZCBvdGhlciBnZXR0ZXJzIHdoZW4gaW1wbGVtZW50aW5nIEFWUkNQIENvbnRyb2xsZXIKLSAgYm9vbCBJc0ludGVyaW0oKSBjb25zdDsKLSAgRXZlbnQgR2V0RXZlbnQoKSBjb25zdDsKLSAgdWludDhfdCBHZXRWb2x1bWUoKSBjb25zdDsKLQotICB2aXJ0dWFsIGJvb2wgSXNWYWxpZCgpIGNvbnN0IG92ZXJyaWRlOwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVzaW5nIFZlbmRvclBhY2tldDo6VmVuZG9yUGFja2V0OwotfTsKLQotY2xhc3MgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXIgOiBwdWJsaWMgVmVuZG9yUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5SZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPgotICBNYWtlUGxheWJhY2tTdGF0dXNCdWlsZGVyKGJvb2wgaW50ZXJpbSwgdWludDhfdCBwbGF5X3N0YXR1cyk7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4KLSAgTWFrZVRyYWNrQ2hhbmdlZEJ1aWxkZXIoYm9vbCBpbnRlcmltLCB1aW50NjRfdCB0cmFja191aWQpOwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI+Ci0gIE1ha2VQbGF5YmFja1Bvc2l0aW9uQnVpbGRlcihib29sIGludGVyaW0sIHVpbnQzMl90IHBsYXliYWNrX3Bvcyk7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4KLSAgTWFrZU5vd1BsYXlpbmdCdWlsZGVyKGJvb2wgaW50ZXJpbSk7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4KLSAgTWFrZUF2YWlsYWJsZVBsYXllcnNCdWlsZGVyKGJvb2wgaW50ZXJpbSk7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcj4KLSAgTWFrZUFkZHJlc3NlZFBsYXllckJ1aWxkZXIoYm9vbCBpbnRlcmltLCB1aW50MTZfdCBwbGF5ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHVpZF9jb3VudGVyKTsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyPgotICBNYWtlVWlkc0NoYW5nZWRCdWlsZGVyKGJvb2wgaW50ZXJpbSwgdWludDE2X3QgdWlkX2NvdW50ZXIpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgRXZlbnQgZXZlbnRfOwotICB1aW50NjRfdCBkYXRhXzsKLQotICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcihib29sIGludGVyaW0sIEV2ZW50IGV2ZW50KQotICAgICAgOiBWZW5kb3JQYWNrZXRCdWlsZGVyKGludGVyaW0gPyBDVHlwZTo6SU5URVJJTSA6IENUeXBlOjpDSEFOR0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRQZHU6OlJFR0lTVEVSX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRUeXBlOjpTSU5HTEUpLAotICAgICAgICBldmVudF8oZXZlbnQpe307Ci19OwotCi1jbGFzcyBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3QgOiBwdWJsaWMgVmVuZG9yUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdCgpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogIFJlZ2lzdGVyIE5vdGlmaWNhaXRvbiBSZXF1ZXN0IFBhY2tldCBMYXlvdXQKLSAgICogICBBdnJjcFBhY2tldDoKLSAgICogICAgIENUeXBlIGNfdHlwZV87Ci0gICAqICAgICB1aW50OF90IHN1YnVuaXRfdHlwZV8gOiA1OwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X2lkXyA6IDM7Ci0gICAqICAgICBPcGNvZGUgb3Bjb2RlXzsKLSAgICogICBWZW5kb3JQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IGNvbXBhbnlfaWRbM107Ci0gICAqICAgICB1aW50OF90IGNvbW1hbmRfcGR1OwotICAgKiAgICAgdWludDhfdCBwYWNrZXRfdHlwZTsKLSAgICogICAgIHVpbnQxNl90IHBhcmFtX2xlbmd0aDsKLSAgICogICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IGV2ZW50X2lkOwotICAgKiAgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAvLyBPbmx5IHVzZWQgZm9yIFBMQVlCQUNLX1BPU19DSEFOR0VECi0gICAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluU2l6ZSgpIHsgcmV0dXJuIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIDU7IH0KLQotICAvLyBHZXR0ZXIgRnVuY3Rpb25zCi0gIEV2ZW50IEdldEV2ZW50UmVnaXN0ZXJlZCgpIGNvbnN0OwotICB1aW50MzJfdCBHZXRJbnRlcnZhbCgpIGNvbnN0OwotCi0gIC8vIE92ZXJsb2FkZWQgRnVuY3Rpb25zCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdXNpbmcgVmVuZG9yUGFja2V0OjpWZW5kb3JQYWNrZXQ7Ci19OwotCi1jbGFzcyBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyIDogcHVibGljIFZlbmRvclBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI+IE1ha2VCdWlsZGVyKAotICAgICAgRXZlbnQgZXZlbnQsIHVpbnQzMl90IGludGVydmFsKTsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBTZXJpYWxpemUoCi0gICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEV2ZW50IGV2ZW50XzsKLSAgdWludDMyX3QgaW50ZXJ2YWxfOwotCi0gIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXIoRXZlbnQgZXZlbnQsIHVpbnQzMl90IGludGVydmFsKQotICAgICAgOiBWZW5kb3JQYWNrZXRCdWlsZGVyKENUeXBlOjpOT1RJRlksIENvbW1hbmRQZHU6OlJFR0lTVEVSX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRUeXBlOjpTSU5HTEUpLAotICAgICAgICBldmVudF8oZXZlbnQpLAotICAgICAgICBpbnRlcnZhbF8oaW50ZXJ2YWwpe307Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3Avc2V0X2Fic29sdXRlX3ZvbHVtZS5jYyBiL3BhY2tldC9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZiN2FjLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNldF9hYnNvbHV0ZV92b2x1bWUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8U2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlcj4KLVNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHVpbnQ4X3Qgdm9sdW1lKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTZXRBYnNvbHV0ZVZvbHVtZVJlcXVlc3RCdWlsZGVyPiBidWlsZGVyKAotICAgICAgbmV3IFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXIodm9sdW1lICYgMHg3RikpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zaXplX3QgU2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFZlbmRvclBhY2tldDo6a01pblNpemUoKSArIDE7Ci19Ci0KLWJvb2wgU2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCBzaXplKCkgLSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkpOwotCi0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgdm9sdW1lXyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQ4X3QgU2V0QWJzb2x1dGVWb2x1bWVSZXNwb25zZTo6R2V0Vm9sdW1lKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKTsKLSAgcmV0dXJuICppdDsKLX0KLQotYm9vbCBTZXRBYnNvbHV0ZVZvbHVtZVJlc3BvbnNlOjpJc1ZhbGlkKCkgY29uc3QgewotICBpZiAoIVZlbmRvclBhY2tldDo6SXNWYWxpZCgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChHZXRDVHlwZSgpICE9IENUeXBlOjpBQ0NFUFRFRCkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gc2l6ZSgpID09IGtNaW5TaXplKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFNldEFic29sdXRlVm9sdW1lUmVzcG9uc2U6OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgIlNldEFic29sdXRlVm9sdW1lUmVzcG9uc2U6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgY1R5cGUgPSAiIDw8IEdldENUeXBlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU3VidW5pdCBUeXBlID0gIiA8PCBsb2doZXgoR2V0U3VidW5pdFR5cGUoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgU3VidW5pdCBJRCA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRJZCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBPcENvZGUgPSAiIDw8IEdldE9wY29kZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIENvbXBhbnkgSUQgPSAiIDw8IGxvZ2hleChHZXRDb21wYW55SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgQ29tbWFuZCBQRFUgPSAiIDw8IEdldENvbW1hbmRQZHUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBQYWNrZXRUeXBlID0gIiA8PCBHZXRQYWNrZXRUeXBlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGFyYW1ldGVyIExlbmd0aCA9ICIgPDwgbG9naGV4KEdldFBhcmFtZXRlckxlbmd0aCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBWb2x1bWUgPSAiIDw8IEdldFZvbHVtZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL3NldF9hYnNvbHV0ZV92b2x1bWUuaCBiL3BhY2tldC9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2QzODguLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL3NldF9hYnNvbHV0ZV92b2x1bWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi0vLyBUT0RPIChhcGFuaWNrZSk6IFNldCBBYnNvbHV0ZSBWb2x1bWUgcmVxdWVzdCB2cyByZXNwb25zZSBoYXZlIHRoZSBzYW1lCi0vLyBwYWNrZXQgc3RydWN0dXJlLCB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBpcyB0aGUgQ1R5cGUuCi0vLyBBZGRpbmcgYSBwYXNzZWQgZmxhZyBhcyBhIHBhcmFtZXRlciB3b3VsZCBiZSBwb3NzaWJsZSBidXQgSSBmZWVsIHRoYXQKLS8vIHRoaXMgd291bGQgYnJlYWsgdGhlIGRlc2lnbiBwYXR0ZXJuIG9mIHJlcXVlc3QgdnMgcmVzcG9uc2UuIExvb2sgaW50bwotLy8gdGhpcyBmb3IgdGhlIGZ1dHVyZS4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1jbGFzcyBTZXRBYnNvbHV0ZVZvbHVtZVJlcXVlc3RCdWlsZGVyIDogcHVibGljIFZlbmRvclBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+U2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI+IE1ha2VCdWlsZGVyKAotICAgICAgdWludDhfdCB2b2x1bWUpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdWludDhfdCB2b2x1bWVfOwotCi0gIFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXIodWludDhfdCB2b2x1bWUpCi0gICAgICA6IFZlbmRvclBhY2tldEJ1aWxkZXIoQ1R5cGU6OkNPTlRST0wsIENvbW1hbmRQZHU6OlNFVF9BQlNPTFVURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0VHlwZTo6U0lOR0xFKSwKLSAgICAgICAgdm9sdW1lXyh2b2x1bWUpe307Ci19OwotCi1jbGFzcyBTZXRBYnNvbHV0ZVZvbHVtZVJlc3BvbnNlIDogcHVibGljIFZlbmRvclBhY2tldCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5TZXRBYnNvbHV0ZVZvbHVtZVJlc3BvbnNlKCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBBVlJDUCBQbGF5IEl0ZW0gUmVxdWVzdCBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQXZyY3BQYWNrZXQ6Ci0gICAqICAgICBDVHlwZSBjX3R5cGVfOwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF9pZF8gOiAzOwotICAgKiAgICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgVmVuZG9yUGFja2V0OgotICAgKiAgICAgdWludDhfdCBjb21wYW55X2lkWzNdOwotICAgKiAgICAgdWludDhfdCBjb21tYW5kX3BkdTsKLSAgICogICAgIHVpbnQ4X3QgcGFja2V0X3R5cGU7Ci0gICAqICAgICB1aW50MTZfdCBwYXJhbWV0ZXJfbGVuZ3RoOwotICAgKiAgIFNldEFic29sdXRlVm9sdW1lUmVzcG9uc2U6Ci0gICAqICAgICB1aW50OF90IHZvbHVtZTsKLSAgICovCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5TaXplKCkgeyByZXR1cm4gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpICsgMTsgfQotCi0gIHVpbnQ4X3QgR2V0Vm9sdW1lKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBWZW5kb3JQYWNrZXQ6OlZlbmRvclBhY2tldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllci5jYyBiL3BhY2tldC9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhOTkwOS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvYXZyY3Avc2V0X2FkZHJlc3NlZF9wbGF5ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2V0X2FkZHJlc3NlZF9wbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi1zdGQ6OnVuaXF1ZV9wdHI8U2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyPgotU2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXMgc3RhdHVzKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTZXRBZGRyZXNzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgU2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyKHN0YXR1cykpOwotCi0gIHJldHVybiBidWlsZGVyOwotfQotCi1zaXplX3QgU2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICBzaXplX3QgbGVuID0gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpOwotICBsZW4gKz0gMTsgIC8vIFN0YXR1cwotICByZXR1cm4gbGVuOwotfQotCi1ib29sIFNldEFkZHJlc3NlZFBsYXllclJlc3BvbnNlQnVpbGRlcjo6U2VyaWFsaXplKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSB7Ci0gIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIocGt0LCBzaXplKCkgLSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkpOwotCi0gIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgKHVpbnQ4X3Qpc3RhdHVzXyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQxNl90IFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3Q6OkdldFBsYXllcklkKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFZlbmRvclBhY2tldDo6a01pblNpemUoKTsKLSAgcmV0dXJuIGl0LmV4dHJhY3RCRTx1aW50MTZfdD4oKTsKLX0KLQotYm9vbCBTZXRBZGRyZXNzZWRQbGF5ZXJSZXF1ZXN0OjpJc1ZhbGlkKCkgY29uc3QgewotICBpZiAoIVZlbmRvclBhY2tldDo6SXNWYWxpZCgpKSByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBzaXplKCkgPT0ga01pblNpemUoKTsKLX0KLQotc3RkOjpzdHJpbmcgU2V0QWRkcmVzc2VkUGxheWVyUmVxdWVzdDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiU2V0QWRkcmVzc2VkUGxheWVyUmVxdWVzdDogIiA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBjVHlwZSA9ICIgPDwgR2V0Q1R5cGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBTdWJ1bml0IFR5cGUgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0VHlwZSgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBTdWJ1bml0IElEID0gIiA8PCBsb2doZXgoR2V0U3VidW5pdElkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIE9wQ29kZSA9ICIgPDwgR2V0T3Bjb2RlKCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgQ29tcGFueSBJRCA9ICIgPDwgbG9naGV4KEdldENvbXBhbnlJZCgpKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBDb21tYW5kIFBEVSA9ICIgPDwgR2V0Q29tbWFuZFBkdSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBhY2tldFR5cGUgPSAiIDw8IEdldFBhY2tldFR5cGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBQYXJhbWV0ZXIgTGVuZ3RoID0gIiA8PCBsb2doZXgoR2V0UGFyYW1ldGVyTGVuZ3RoKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBsYXllciBJRCA9ICIgPDwgbG9naGV4KEdldFBsYXllcklkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3Avc2V0X2FkZHJlc3NlZF9wbGF5ZXIuaCBiL3BhY2tldC9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjM0MTE2Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJ2ZW5kb3JfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgU2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyIDogcHVibGljIFZlbmRvclBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+U2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1cyBzdGF0dXMpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgU3RhdHVzIHN0YXR1c187Ci0KLSAgU2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyKFN0YXR1cyBzdGF0dXMpCi0gICAgICA6IFZlbmRvclBhY2tldEJ1aWxkZXIoQ1R5cGU6OkFDQ0VQVEVELCBDb21tYW5kUGR1OjpTRVRfQUREUkVTU0VEX1BMQVlFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRUeXBlOjpTSU5HTEUpLAotICAgICAgICBzdGF0dXNfKHN0YXR1cyl7fTsKLX07Ci0KLWNsYXNzIFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3QgOiBwdWJsaWMgVmVuZG9yUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNldEFkZHJlc3NlZFBsYXllclJlcXVlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqICBSZWdpc3RlciBOb3RpZmljYWl0b24gUmVxdWVzdCBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQXZyY3BQYWNrZXQ6Ci0gICAqICAgICBDVHlwZSBjX3R5cGVfOwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF9pZF8gOiAzOwotICAgKiAgICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgVmVuZG9yUGFja2V0OgotICAgKiAgICAgdWludDhfdCBjb21wYW55X2lkWzNdOwotICAgKiAgICAgdWludDhfdCBjb21tYW5kX3BkdTsKLSAgICogICAgIHVpbnQ4X3QgcGFja2V0X3R5cGU7Ci0gICAqICAgICB1aW50MTZfdCBwYXJhbV9sZW5ndGg7Ci0gICAqICAgU2V0QWRkcmVzc2VkUGxheWVyUmVxdWVzdDoKLSAgICogICAgIHVpbnQxNl90IHBsYXllcl9pZDsKLSAgICovCi0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5TaXplKCkgeyByZXR1cm4gVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpICsgMjsgfQotCi0gIHVpbnQxNl90IEdldFBsYXllcklkKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBWZW5kb3JQYWNrZXQ6OlZlbmRvclBhY2tldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9hdnJjcC9zZXRfYnJvd3NlZF9wbGF5ZXIuY2MgYi9wYWNrZXQvYXZyY3Avc2V0X2Jyb3dzZWRfcGxheWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBjNzY4Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC9zZXRfYnJvd3NlZF9wbGF5ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNldF9icm93c2VkX3BsYXllci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyPgotU2V0QnJvd3NlZFBsYXllclJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX2l0ZW1zX2luX2ZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZm9sZGVyX2RlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZm9sZGVyX25hbWUpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgU2V0QnJvd3NlZFBsYXllclJlc3BvbnNlQnVpbGRlcigKLSAgICAgICAgICBzdGF0dXMsIHVpZF9jb3VudGVyLCBudW1faXRlbXNfaW5fZm9sZGVyLCBmb2xkZXJfZGVwdGgsIGZvbGRlcl9uYW1lKSk7Ci0KLSAgcmV0dXJuIGJ1aWxkZXI7Ci19Ci0KLXNpemVfdCBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpzaXplKCkgY29uc3QgewotICBzaXplX3QgbGVuID0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICBsZW4gKz0gMTsgIC8vIFN0YXR1cwotCi0gIC8vIElmIHRoZSBzdGF0dXMgaXNuJ3Qgc3VjY2VzcyB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIGFyZSBvbW1pdGVkCi0gIGlmIChzdGF0dXNfICE9IFN0YXR1czo6Tk9fRVJST1IpIHJldHVybiBsZW47Ci0KLSAgbGVuICs9IDI7ICAvLyBVSUQgQ291bnRlcgotICBsZW4gKz0gNDsgIC8vIE51bWJlciBvZiBpdGVtcyBpbiBmb2xkZXIKLSAgbGVuICs9IDI7ICAvLyBVVEYtOCBDaGFyYWN0ZXIgU2V0Ci0gIGxlbiArPSAxOyAgLy8gRm9sZGVyIERlcHRoCi0KLSAgLy8gVGhpcyBpcyBvbmx5IGluY2x1ZGVkIGlmIHRoZSBmb2xkZXIgcmV0dXJuZWQgaXNuJ3QgdGhlIHJvb3QgZm9sZGVyCi0gIGlmIChmb2xkZXJfZGVwdGhfICE9IDApIHsKLSAgICBsZW4gKz0gMjsgICAgICAgICAgICAgICAgICAgIC8vIEZvbGRlciBOYW1lIFNpemU7Ci0gICAgbGVuICs9IGZvbGRlcl9uYW1lXy5zaXplKCk7ICAvLyBGb2xkZXIgTmFtZQotICB9Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotYm9vbCBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpTZXJpYWxpemUoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QpIHsKLSAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICBCcm93c2VQYWNrZXRCdWlsZGVyOjpQdXNoSGVhZGVyKHBrdCwgc2l6ZSgpIC0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpKTsKLQotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsICh1aW50OF90KXN0YXR1c18pOwotCi0gIGlmIChzdGF0dXNfICE9IFN0YXR1czo6Tk9fRVJST1IpIHJldHVybiB0cnVlOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKHVpZF9jb3VudGVyXykpOwotICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsIGJhc2U6OkJ5dGVTd2FwKG51bV9pdGVtc19pbl9mb2xkZXJfKSk7Ci0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAoKHVpbnQxNl90KTB4MDA2YSkpOyAgLy8gVVRGLTgKLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBmb2xkZXJfZGVwdGhfKTsKLQotICAvLyBTa2lwIGFkZGluZyB0aGUgZm9sZGVyIG5hbWUgaWYgdGhlIGZvbGRlciBkZXB0aCBpcyAwCi0gIGlmIChmb2xkZXJfZGVwdGhfID09IDApIHJldHVybiB0cnVlOwotICB1aW50MTZfdCBmb2xkZXJfbmFtZV9sZW4gPSBmb2xkZXJfbmFtZV8uc2l6ZSgpOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKGZvbGRlcl9uYW1lX2xlbikpOwotICBmb3IgKGF1dG8gaXQgPSBmb2xkZXJfbmFtZV8uYmVnaW4oKTsgaXQgIT0gZm9sZGVyX25hbWVfLmVuZCgpOyBpdCsrKSB7Ci0gICAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCAqaXQpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQxNl90IFNldEJyb3dzZWRQbGF5ZXJSZXF1ZXN0OjpHZXRQbGF5ZXJJZCgpIGNvbnN0IHsKLSAgYXV0byBpdCA9IGJlZ2luKCkgKyBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCk7Ci0gIHJldHVybiBpdC5leHRyYWN0QkU8dWludDE2X3Q+KCk7Ci19Ci0KLWJvb2wgU2V0QnJvd3NlZFBsYXllclJlcXVlc3Q6OklzVmFsaWQoKSBjb25zdCB7Ci0gIGlmICghQnJvd3NlUGFja2V0OjpJc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHNpemUoKSA9PSBrTWluU2l6ZSgpOwotfQotCi1zdGQ6OnN0cmluZyBTZXRCcm93c2VkUGxheWVyUmVxdWVzdDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiU2V0QnJvd3NlZFBsYXllclJlcXVlc3RQYWNrZXQ6ICIgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUERVID0gIiA8PCBHZXRQZHUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBMZW5ndGggPSAiIDw8IEdldExlbmd0aCgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBsYXllciBJRCA9ICIgPDwgbG9naGV4KEdldFBsYXllcklkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgc3RkOjplbmRsOwotCi0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3Avc2V0X2Jyb3dzZWRfcGxheWVyLmggYi9wYWNrZXQvYXZyY3Avc2V0X2Jyb3dzZWRfcGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNmM0ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL3NldF9icm93c2VkX3BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJhdnJjcF9icm93c2VfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgU2V0QnJvd3NlZFBsYXllclJlc3BvbnNlQnVpbGRlciA6IHB1YmxpYyBCcm93c2VQYWNrZXRCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1cyBzdGF0dXMsIHVpbnQxNl90IHVpZF9jb3VudGVyLCB1aW50MzJfdCBudW1faXRlbXNfaW5fZm9sZGVyLAotICAgICAgdWludDhfdCBmb2xkZXJfZGVwdGgsIHN0ZDo6c3RyaW5nIGZvbGRlcl9uYW1lKTsKLQotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgYm9vbCBTZXJpYWxpemUoCi0gICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFN0YXR1cyBzdGF0dXNfOwotICB1aW50MTZfdCB1aWRfY291bnRlcl87Ci0gIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXJfOwotICB1aW50OF90IGZvbGRlcl9kZXB0aF87Ci0gIHN0ZDo6c3RyaW5nIGZvbGRlcl9uYW1lXzsKLQotICBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyKFN0YXR1cyBzdGF0dXMsIHVpbnQxNl90IHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9pdGVtc19pbl9mb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmb2xkZXJfZGVwdGgsIHN0ZDo6c3RyaW5nIGZvbGRlcl9uYW1lKQotICAgICAgOiBCcm93c2VQYWNrZXRCdWlsZGVyKEJyb3dzZVBkdTo6U0VUX0JST1dTRURfUExBWUVSKSwKLSAgICAgICAgc3RhdHVzXyhzdGF0dXMpLAotICAgICAgICB1aWRfY291bnRlcl8odWlkX2NvdW50ZXIpLAotICAgICAgICBudW1faXRlbXNfaW5fZm9sZGVyXyhudW1faXRlbXNfaW5fZm9sZGVyKSwKLSAgICAgICAgZm9sZGVyX2RlcHRoXyhmb2xkZXJfZGVwdGgpLAotICAgICAgICBmb2xkZXJfbmFtZV8oZm9sZGVyX25hbWUpIHt9Ci19OwotCi1jbGFzcyBTZXRCcm93c2VkUGxheWVyUmVxdWVzdCA6IHB1YmxpYyBCcm93c2VQYWNrZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+U2V0QnJvd3NlZFBsYXllclJlcXVlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIEF2cmNwIENoYW5nZSBQYXRoIFBhY2tldCBMYXlvdXQKLSAgICogICBCcm93c2VQYWNrZXQ6Ci0gICAqICAgICB1aW50OF90IHBkdV87Ci0gICAqICAgICB1aW50MTZfdCBsZW5ndGhfOwotICAgKiAgIEdldEZvbGRlckl0ZW1zUmVxdWVzdDoKLSAgICogICAgIHVpbnQxNl90IHBsYXllcl9pZF87Ci0gICAqLwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluU2l6ZSgpIHsgcmV0dXJuIEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIDI7IH0KLQotICB1aW50MTZfdCBHZXRQbGF5ZXJJZCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdXNpbmcgQnJvd3NlUGFja2V0OjpCcm93c2VQYWNrZXQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYXZyY3AvdmVuZG9yX3BhY2tldC5jYyBiL3BhY2tldC9hdnJjcC92ZW5kb3JfcGFja2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTI1Y2ZiLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9hdnJjcC92ZW5kb3JfcGFja2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ2ZW5kb3JfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotc3RkOjp1bmlxdWVfcHRyPFZlbmRvclBhY2tldEJ1aWxkZXI+IFZlbmRvclBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgIENUeXBlIGN0eXBlLCBDb21tYW5kUGR1IHBkdSwgUGFja2V0VHlwZSBwYWNrZXRfdHlwZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8OjpibHVldG9vdGg6OlBhY2tldEJ1aWxkZXI+IHBheWxvYWQpIHsKLSAgLy8gSWYgdGhlIHBheWxvYWQgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHVpbnQxNl90Ci0gIC8vIHRoZSBwYWNrZXQgc2hvdWxkIGJlIGZyYWdtZW50ZWQKLSAgQ0hFQ0tfTEUocGF5bG9hZC0+c2l6ZSgpLCBzaXplX3QoMHhGRkZGKSkKLSAgICAgIDw8IF9fZnVuY19fIDw8ICI6IHBheWxvYWQgc2l6ZSBiaWdnZXIgdGhhbiB1aW50MTZfdCI7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPFZlbmRvclBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIoCi0gICAgICBuZXcgVmVuZG9yUGFja2V0QnVpbGRlcihjdHlwZSwgcGR1LCBwYWNrZXRfdHlwZSkpOwotICBidWlsZGVyLT5wYXlsb2FkXyA9IHN0ZDo6bW92ZShwYXlsb2FkKTsKLQotICByZXR1cm4gYnVpbGRlcjsKLX0KLQotc2l6ZV90IFZlbmRvclBhY2tldEJ1aWxkZXI6OnNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCkgKyBwYXlsb2FkXy0+c2l6ZSgpOwotfQotCi1ib29sIFZlbmRvclBhY2tldEJ1aWxkZXI6OlNlcmlhbGl6ZSgKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpibHVldG9vdGg6OlBhY2tldD4mIHBrdCkgewotICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gIC8vIFB1c2ggdGhlIHN0YW5kYXJkIGF2cmNwIGhlYWRlcnMKLSAgUGFja2V0QnVpbGRlcjo6UHVzaEhlYWRlcihwa3QpOwotCi0gIC8vIFB1c2ggdGhlIGF2cmNwIHZlbmRvciBjb21tYW5kIGhlYWRlcnMKLSAgQ0hFQ0tfTFQocGF5bG9hZF8tPnNpemUoKSwgc2l6ZV90KDB4RkZGRikpCi0gICAgICA8PCBfX2Z1bmNfXyA8PCAiOiBwYXlsb2FkIHNpemUgYmlnZ2VyIHRoYW4gdWludDE2X3QiOwotICBQdXNoSGVhZGVyKHBrdCwgcGF5bG9hZF8tPnNpemUoKSk7Ci0KLSAgLy8gUHVzaCB0aGUgcGF5bG9hZCBmb3IgdGhlIHBhY2tldAotICByZXR1cm4gcGF5bG9hZF8tPlNlcmlhbGl6ZShwa3QpOwotfQotCi12b2lkIFZlbmRvclBhY2tldEJ1aWxkZXI6OlB1c2hIZWFkZXIoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QsCi0gICAgdWludDE2X3QgcGFyYW1ldGVyX2xlbmd0aCkgewotICBQdXNoQ29tcGFueUlkKHBrdCwgQkxVRVRPT1RIX0NPTVBBTllfSUQpOwotICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBkdV8pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBzdGF0aWNfY2FzdDx1aW50OF90PihwYWNrZXRfdHlwZV8pKTsKLSAgQWRkUGF5bG9hZE9jdGV0czIocGt0LCBiYXNlOjpCeXRlU3dhcChwYXJhbWV0ZXJfbGVuZ3RoKSk7Ci19Ci0KLWJvb2wgVmVuZG9yUGFja2V0QnVpbGRlcjo6UHVzaEF0dHJpYnV0ZVZhbHVlKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0LAotICAgIGNvbnN0IEF0dHJpYnV0ZUVudHJ5JiBlbnRyeSkgewotICBBZGRQYXlsb2FkT2N0ZXRzNChwa3QsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJ5dGVTd2FwKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbnRyeS5hdHRyaWJ1dGUoKSkpKTsKLSAgdWludDE2X3QgY2hhcmFjdGVyX3NldCA9IDB4MDA2YTsgIC8vIFVURi04Ci0gIEFkZFBheWxvYWRPY3RldHMyKHBrdCwgYmFzZTo6Qnl0ZVN3YXAoY2hhcmFjdGVyX3NldCkpOwotICB1aW50MTZfdCB2YWx1ZV9sZW5ndGggPSBlbnRyeS52YWx1ZSgpLmxlbmd0aCgpOwotICBBZGRQYXlsb2FkT2N0ZXRzMihwa3QsIGJhc2U6OkJ5dGVTd2FwKHZhbHVlX2xlbmd0aCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlX2xlbmd0aDsgaSsrKSB7Ci0gICAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBlbnRyeS52YWx1ZSgpW2ldKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi11aW50MzJfdCBWZW5kb3JQYWNrZXQ6OkdldENvbXBhbnlJZCgpIGNvbnN0IHsKLSAgcmV0dXJuIFB1bGxDb21wYW55SWQoYmVnaW4oKSArIFBhY2tldDo6a01pblNpemUoKSk7Ci19Ci0KLUNvbW1hbmRQZHUgVmVuZG9yUGFja2V0OjpHZXRDb21tYW5kUGR1KCkgY29uc3QgewotICBhdXRvIHZhbHVlID0gKihiZWdpbigpICsgUGFja2V0OjprTWluU2l6ZSgpICsgc3RhdGljX2Nhc3Q8c2l6ZV90PigzKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDb21tYW5kUGR1Pih2YWx1ZSk7Ci19Ci0KLVBhY2tldFR5cGUgVmVuZG9yUGFja2V0OjpHZXRQYWNrZXRUeXBlKCkgY29uc3QgewotICBhdXRvIHZhbHVlID0gKihiZWdpbigpICsgUGFja2V0OjprTWluU2l6ZSgpICsgc3RhdGljX2Nhc3Q8c2l6ZV90Pig0KSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxQYWNrZXRUeXBlPih2YWx1ZSk7Ci19Ci0KLXVpbnQxNl90IFZlbmRvclBhY2tldDo6R2V0UGFyYW1ldGVyTGVuZ3RoKCkgY29uc3QgewotICBhdXRvIGl0ID0gYmVnaW4oKSArIFBhY2tldDo6a01pblNpemUoKSArIHN0YXRpY19jYXN0PHNpemVfdD4oNSk7Ci0gIC8vIFN3YXAgdG8gbGl0dGxlIGVuZGlhbgotICByZXR1cm4gaXQuZXh0cmFjdEJFPHVpbnQxNl90PigpOwotfQotCi1ib29sIFZlbmRvclBhY2tldDo6SXNWYWxpZCgpIGNvbnN0IHsKLSAgaWYgKHNpemUoKSA8IFZlbmRvclBhY2tldDo6a01pblNpemUoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGF1dG8gc3RhcnQgPSBiZWdpbigpICsgVmVuZG9yUGFja2V0OjprTWluU2l6ZSgpOwotICAvLyBFdmVuIGlmIGVuZCBpcyBsZXNzIHRoYW4gc3RhcnQgYW5kIGEgc2lnbiBleHRlbnNpb24gb2NjdXJzLCB0aGF0cyBmaW5lIGFzCi0gIC8vIGl0cyBwcmV0dHkgZGVmaW5pdGl2ZSBwcm9vZiB0aGF0IHRoZSBwYWNrZXQgaXMgcG9vcmx5IGZvcm1hdGVkCi0gIHJldHVybiBHZXRQYXJhbWV0ZXJMZW5ndGgoKSA9PSAoZW5kKCkgLSBzdGFydCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFZlbmRvclBhY2tldDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAiVmVuZG9yUGFja2V0OiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIGNUeXBlID0gIiA8PCBHZXRDVHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgVHlwZSA9ICIgPDwgbG9naGV4KEdldFN1YnVuaXRUeXBlKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFN1YnVuaXQgSUQgPSAiIDw8IGxvZ2hleChHZXRTdWJ1bml0SWQoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgT3BDb2RlID0gIiA8PCBHZXRPcGNvZGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHNzIDw8ICIgIOKUlCBDb21wYW55IElEID0gIiA8PCBsb2doZXgoR2V0Q29tcGFueUlkKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIENvbW1hbmQgUERVID0gIiA8PCBHZXRDb21tYW5kUGR1KCkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGFja2V0VHlwZSA9ICIgPDwgR2V0UGFja2V0VHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgc3MgPDwgIiAg4pSUIFBhcmFtZXRlciBMZW5ndGggPSAiIDw8IGxvZ2hleChHZXRQYXJhbWV0ZXJMZW5ndGgoKSkgPDwgc3RkOjplbmRsOwotICBzcyA8PCAiICDilJQgUGF5bG9hZCA9IjsKLSAgZm9yIChhdXRvIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7IGl0KyspIHsKLSAgICBzcyA8PCAiICIgPDwgbG9naGV4KCppdCk7Ci0gIH0KLSAgc3MgPDwgc3RkOjplbmRsOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L2F2cmNwL3ZlbmRvcl9wYWNrZXQuaCBiL3BhY2tldC9hdnJjcC92ZW5kb3JfcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTFmMTAuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2F2cmNwL3ZlbmRvcl9wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYXZyY3BfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotY2xhc3MgVmVuZG9yUGFja2V0QnVpbGRlciA6IHB1YmxpYyBhdnJjcDo6UGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5WZW5kb3JQYWNrZXRCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VmVuZG9yUGFja2V0QnVpbGRlcj4gTWFrZUJ1aWxkZXIoCi0gICAgICBDVHlwZSBjdHlwZSwgQ29tbWFuZFBkdSBwZHUsIFBhY2tldFR5cGUgcGFja2V0X3R5cGUsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8OjpibHVldG9vdGg6OlBhY2tldEJ1aWxkZXI+IHBheWxvYWQpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBib29sIFNlcmlhbGl6ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiYgcGt0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgQ29tbWFuZFBkdSBwZHVfOwotICBQYWNrZXRUeXBlIHBhY2tldF90eXBlXzsKLSAgdWludDE2X3QgcGFyYW1fbGVuZ3RoXzsKLQotICB2b2lkIFB1c2hIZWFkZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYXJhbWV0ZXJfbGVuZ3RoKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBhIGNvdXBsZSBvdGhlciBBVlJDUCBwYWNrZXQgYnVpbGRlcnMKLSAgYm9vbCBQdXNoQXR0cmlidXRlVmFsdWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXQ+JiBwa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUVudHJ5JiBlbnRyeSk7Ci0KLSAgVmVuZG9yUGFja2V0QnVpbGRlcihDVHlwZSBjdHlwZSwgQ29tbWFuZFBkdSBwZHUsIFBhY2tldFR5cGUgcGFja2V0X3R5cGUpCi0gICAgICA6IFBhY2tldEJ1aWxkZXIoY3R5cGUsIDB4MDksIDB4MDAsIE9wY29kZTo6VkVORE9SKSwKLSAgICAgICAgcGR1XyhwZHUpLAotICAgICAgICBwYWNrZXRfdHlwZV8ocGFja2V0X3R5cGUpe307Ci19OwotCi1jbGFzcyBWZW5kb3JQYWNrZXQgOiBwdWJsaWMgYXZyY3A6OlBhY2tldCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5WZW5kb3JQYWNrZXQoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIEF2cmNwIFZlbmRvciBQYWNrZXQgTGF5b3V0Ci0gICAqICAgQXZyY3BQYWNrZXQ6Ci0gICAqICAgICBDVHlwZSBjX3R5cGVfOwotICAgKiAgICAgdWludDhfdCBzdWJ1bml0X3R5cGVfIDogNTsKLSAgICogICAgIHVpbnQ4X3Qgc3VidW5pdF9pZF8gOiAzOwotICAgKiAgICAgT3Bjb2RlIG9wY29kZV87Ci0gICAqICAgVmVuZG9yUGFja2V0OgotICAgKiAgICAgdWludDhfdCBjb21wYW55X2lkWzNdOwotICAgKiAgICAgdWludDhfdCBjb21tYW5kX3BkdTsKLSAgICogICAgIHVpbnQ4X3QgcGFja2V0X3R5cGU7Ci0gICAqICAgICB1aW50MTZfdCBwYXJhbWV0ZXJfbGVuZ3RoOwotICAgKiAgIHVpbnQ4X3RbXSBwYXlsb2FkOwotICAgKi8KLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pblNpemUoKSB7IHJldHVybiBQYWNrZXQ6OmtNaW5TaXplKCkgKyA3OyB9OwotCi0gIC8vIEdldHRlciBGdW5jdGlvbnMKLSAgdWludDMyX3QgR2V0Q29tcGFueUlkKCkgY29uc3Q7Ci0gIENvbW1hbmRQZHUgR2V0Q29tbWFuZFBkdSgpIGNvbnN0OwotICBQYWNrZXRUeXBlIEdldFBhY2tldFR5cGUoKSBjb25zdDsKLSAgdWludDE2X3QgR2V0UGFyYW1ldGVyTGVuZ3RoKCkgY29uc3Q7Ci0KLSAgLy8gT3ZlcmxvYWRlZCBmdW5jdGlvbnMKLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBQYWNrZXQ6OlBhY2tldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9iYXNlL0FuZHJvaWQuYnAgYi9wYWNrZXQvYmFzZS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTdkMGY5Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9iYXNlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYi1idC1wYWNrZXRzLWJhc2UiLAotICAgIGRlZmF1bHRzOiBbImxpYmNocm9tZV9zdXBwb3J0X2RlZmF1bHRzIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuLyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vYnQvaW5jbHVkZSJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInBhY2tldC5jYyIsCi0gICAgICAgICJpdGVyYXRvci5jYyIsCi0gICAgICAgICJwYWNrZXRfYnVpbGRlci5jYyIsCi0gICAgXSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcGFja2V0L2Jhc2UvaXRlcmF0b3IuY2MgYi9wYWNrZXQvYmFzZS9pdGVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiNzM2Ny4uMDAwMDAwMAotLS0gYS9wYWNrZXQvYmFzZS9pdGVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaXRlcmF0b3IuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLUl0ZXJhdG9yOjpJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUGFja2V0PiBwYWNrZXQsIHNpemVfdCBpKSB7Ci0gIHBhY2tldF8gPSBwYWNrZXQ7Ci0gIGluZGV4XyA9IGk7Ci0KLSAgQ0hFQ0tfR0UoaW5kZXhfLCBwYWNrZXQtPnBhY2tldF9zdGFydF9pbmRleF8pOwotICBDSEVDS19MRShpbmRleF8sIHBhY2tldC0+cGFja2V0X2VuZF9pbmRleF8pOwotfQotCi1JdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0cikgeyAqdGhpcyA9IGl0cjsgfQotCi1JdGVyYXRvciBJdGVyYXRvcjo6b3BlcmF0b3IrKHNpemVfdCBvZmZzZXQpIHsKLSAgYXV0byBpdHIoKnRoaXMpOwotCi0gIHJldHVybiBpdHIgKz0gb2Zmc2V0OwotfQotCi1JdGVyYXRvciYgSXRlcmF0b3I6Om9wZXJhdG9yKz0oc2l6ZV90IG9mZnNldCkgewotICBzaXplX3QgbmV3X29mZnNldCA9IGluZGV4XyArIG9mZnNldDsKLSAgaW5kZXhfID0gbmV3X29mZnNldCA+IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfID8gcGFja2V0Xy0+cGFja2V0X2VuZF9pbmRleF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3X29mZnNldDsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1JdGVyYXRvciBJdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQpIHsKLSAgYXV0byBpdHIoKnRoaXMpOwotICBpbmRleF8rKzsKLQotICBpZiAoaW5kZXhfID4gcGFja2V0Xy0+cGFja2V0X2VuZF9pbmRleF8pIGluZGV4XyA9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfOwotCi0gIHJldHVybiBpdHI7Ci19Ci0KLUl0ZXJhdG9yJiBJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgaW5kZXhfKys7Ci0KLSAgaWYgKGluZGV4XyA+IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfKSBpbmRleF8gPSBwYWNrZXRfLT5wYWNrZXRfZW5kX2luZGV4XzsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUl0ZXJhdG9yIEl0ZXJhdG9yOjpvcGVyYXRvci0oc2l6ZV90IG9mZnNldCkgewotICBhdXRvIGl0cigqdGhpcyk7Ci0KLSAgcmV0dXJuIGl0ciAtPSBvZmZzZXQ7Ci19Ci0KLWludCBJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IEl0ZXJhdG9yJiBpdHIpIHsgcmV0dXJuIGluZGV4XyAtIGl0ci5pbmRleF87IH0KLQotSXRlcmF0b3ImIEl0ZXJhdG9yOjpvcGVyYXRvci09KHNpemVfdCBvZmZzZXQpIHsKLSAgaW5kZXhfID0gKGluZGV4XyA8IG9mZnNldCB8fCBpbmRleF8gLSBvZmZzZXQgPCBwYWNrZXRfLT5wYWNrZXRfc3RhcnRfaW5kZXhfKQotICAgICAgICAgICAgICAgPyBwYWNrZXRfLT5wYWNrZXRfc3RhcnRfaW5kZXhfCi0gICAgICAgICAgICAgICA6IGluZGV4XyAtIG9mZnNldDsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUl0ZXJhdG9yIEl0ZXJhdG9yOjpvcGVyYXRvci0tKGludCkgewotICBhdXRvIGl0cigqdGhpcyk7Ci0gIGlmIChpbmRleF8gIT0gcGFja2V0Xy0+cGFja2V0X3N0YXJ0X2luZGV4XykgaW5kZXhfLS07Ci0KLSAgcmV0dXJuIGl0cjsKLX0KLQotSXRlcmF0b3ImIEl0ZXJhdG9yOjpvcGVyYXRvci0tKCkgewotICBpZiAoaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9zdGFydF9pbmRleF8pIGluZGV4Xy0tOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotSXRlcmF0b3ImIEl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0cikgewotICBwYWNrZXRfID0gaXRyLnBhY2tldF87Ci0gIGluZGV4XyA9IGl0ci5pbmRleF87Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIEl0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yJiBpdHIpIGNvbnN0IHsKLSAgcmV0dXJuICgocGFja2V0XyA9PSBpdHIucGFja2V0XykgJiYgKGluZGV4XyA9PSBpdHIuaW5kZXhfKSk7Ci19Ci0KLWJvb2wgSXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3ImIGl0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBpdHIpOyB9Ci0KLWJvb2wgSXRlcmF0b3I6Om9wZXJhdG9yPChjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdCB7Ci0gIHJldHVybiAoKHBhY2tldF8gPT0gaXRyLnBhY2tldF8pICYmIChpbmRleF8gPCBpdHIuaW5kZXhfKSk7Ci19Ci0KLWJvb2wgSXRlcmF0b3I6Om9wZXJhdG9yPihjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdCB7Ci0gIHJldHVybiAoKHBhY2tldF8gPT0gaXRyLnBhY2tldF8pICYmIChpbmRleF8gPiBpdHIuaW5kZXhfKSk7Ci19Ci0KLWJvb2wgSXRlcmF0b3I6Om9wZXJhdG9yPD0oY29uc3QgSXRlcmF0b3ImIGl0cikgY29uc3QgewotICByZXR1cm4gKChwYWNrZXRfID09IGl0ci5wYWNrZXRfKSAmJiAoaW5kZXhfIDw9IGl0ci5pbmRleF8pKTsKLX0KLQotYm9vbCBJdGVyYXRvcjo6b3BlcmF0b3I+PShjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdCB7Ci0gIHJldHVybiAoKHBhY2tldF8gPT0gaXRyLnBhY2tldF8pICYmIChpbmRleF8gPj0gaXRyLmluZGV4XykpOwotfQotCi11aW50OF90IEl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7Ci0gIENIRUNLX05FKGluZGV4XywgcGFja2V0Xy0+cGFja2V0X2VuZF9pbmRleF8pOwotCi0gIHJldHVybiBwYWNrZXRfLT5nZXRfYXRfaW5kZXgoaW5kZXhfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9iYXNlL2l0ZXJhdG9yLmggYi9wYWNrZXQvYmFzZS9pdGVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODIxNTBkLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9iYXNlL2l0ZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBGb3J3YXJkIGRlY2xhcmUgUGFja2V0IGNsYXNzCi1jbGFzcyBQYWNrZXQ7Ci0KLS8vIEl0ZXJhdG9yIGlzIGEgY3VzdG9tIGl0ZXJhdG9yIGNsYXNzIGZvciBQYWNrZXRzLgotY2xhc3MgSXRlcmF0b3IKLSAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHVpbnQ4X3Q+IHsKLSBwdWJsaWM6Ci0gIEl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBQYWNrZXQ+IHBhY2tldCwgc2l6ZV90IGkpOwotICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgaXRyKTsKLQotICAvLyBBbGwgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIG9wZXJhdG9ycyBhcmUgYm91bmRlZCBmcm9tIDAgdG8gdGhlIGxlbmd0aCBvZgotICAvLyB0aGUgcGFja2V0LgotICBJdGVyYXRvciBvcGVyYXRvcisoc2l6ZV90IG9mZnNldCk7Ci0gIEl0ZXJhdG9yJiBvcGVyYXRvcis9KHNpemVfdCBvZmZzZXQpOwotICBJdGVyYXRvciBvcGVyYXRvcisrKGludCk7Ci0gIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCk7Ci0KLSAgSXRlcmF0b3Igb3BlcmF0b3ItKHNpemVfdCBvZmZzZXQpOwotICBpbnQgb3BlcmF0b3ItKGNvbnN0IEl0ZXJhdG9yJiBpdHIpOwotICBJdGVyYXRvciYgb3BlcmF0b3ItPShzaXplX3Qgb2Zmc2V0KTsKLSAgSXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpOwotICBJdGVyYXRvciYgb3BlcmF0b3ItLSgpOwotCi0gIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0cik7Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJiBpdHIpIGNvbnN0OwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImIGl0cikgY29uc3Q7Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSXRlcmF0b3ImIGl0cikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEl0ZXJhdG9yJiBpdHIpIGNvbnN0OwotCi0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBJdGVyYXRvciYgaXRyKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEl0ZXJhdG9yJiBpdHIpIGNvbnN0OwotCi0gIHVpbnQ4X3Qgb3BlcmF0b3IqKCkgY29uc3Q7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpeGVkV2lkdGhJbnRlZ2VyVHlwZT4KLSAgRml4ZWRXaWR0aEludGVnZXJUeXBlIGV4dHJhY3QoKSB7Ci0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPEZpeGVkV2lkdGhJbnRlZ2VyVHlwZT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgIkl0ZXJhdG9yOjpleHRyYWN0IHJlcXVpcmVzIGFuIGludGVncmFsIHR5cGUuIik7Ci0KLSAgICBGaXhlZFdpZHRoSW50ZWdlclR5cGUgZXh0cmFjdGVkX3ZhbHVlID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihGaXhlZFdpZHRoSW50ZWdlclR5cGUpOyBpKyspIHsKLSAgICAgIGV4dHJhY3RlZF92YWx1ZSB8PSBzdGF0aWNfY2FzdDxGaXhlZFdpZHRoSW50ZWdlclR5cGU+KCoqdGhpcykgPDwgaSAqIDg7Ci0gICAgICAoKnRoaXMpKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGV4dHJhY3RlZF92YWx1ZTsKLSAgfQotCi0gIC8vIEV4dHJhY3QgaW4gTGl0dGxlIEVuZGlhbiBGb3JtYXQKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpeGVkV2lkdGhJbnRlZ2VyVHlwZT4KLSAgRml4ZWRXaWR0aEludGVnZXJUeXBlIGV4dHJhY3RCRSgpIHsKLSAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8Rml4ZWRXaWR0aEludGVnZXJUeXBlPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAiSXRlcmF0b3I6OmV4dHJhY3QgcmVxdWlyZXMgYW4gaW50ZWdyYWwgdHlwZS4iKTsKLQotICAgIEZpeGVkV2lkdGhJbnRlZ2VyVHlwZSBleHRyYWN0ZWRfdmFsdWUgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKEZpeGVkV2lkdGhJbnRlZ2VyVHlwZSk7IGkrKykgewotICAgICAgZXh0cmFjdGVkX3ZhbHVlIHw9IHN0YXRpY19jYXN0PEZpeGVkV2lkdGhJbnRlZ2VyVHlwZT4oKip0aGlzKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzaXplb2YoRml4ZWRXaWR0aEludGVnZXJUeXBlKSAtIDEgLSBpKSAqIDg7Ci0gICAgICAoKnRoaXMpKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGV4dHJhY3RlZF92YWx1ZTsKLSAgfQotCi0gIHVpbnQ4X3QgZXh0cmFjdDgoKSB7IHJldHVybiBleHRyYWN0PHVpbnQ4X3Q+KCk7IH0KLSAgdWludDE2X3QgZXh0cmFjdDE2KCkgeyByZXR1cm4gZXh0cmFjdDx1aW50MTZfdD4oKTsgfQotICB1aW50MzJfdCBleHRyYWN0MzIoKSB7IHJldHVybiBleHRyYWN0PHVpbnQzMl90PigpOyB9Ci0gIHVpbnQ2NF90IGV4dHJhY3Q2NCgpIHsgcmV0dXJuIGV4dHJhY3Q8dWludDY0X3Q+KCk7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBQYWNrZXQ+IHBhY2tldF87Ci0gIHNpemVfdCBpbmRleF87Ci19OyAgLy8gSXRlcmF0b3IKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L2Jhc2UvcGFja2V0LmNjIGIvcGFja2V0L2Jhc2UvcGFja2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWUxN2UxLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9iYXNlL3BhY2tldC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAiaXRlcmF0b3IuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXNpemVfdCBQYWNrZXQ6OnNpemUoKSBjb25zdCB7IHJldHVybiBwYWNrZXRfZW5kX2luZGV4XyAtIHBhY2tldF9zdGFydF9pbmRleF87IH0KLQotSXRlcmF0b3IgUGFja2V0OjpiZWdpbigpIGNvbnN0IHsKLSAgcmV0dXJuIEl0ZXJhdG9yKHNoYXJlZF9mcm9tX3RoaXMoKSwgcGFja2V0X3N0YXJ0X2luZGV4Xyk7Ci19Ci0KLUl0ZXJhdG9yIFBhY2tldDo6ZW5kKCkgY29uc3QgewotICByZXR1cm4gSXRlcmF0b3Ioc2hhcmVkX2Zyb21fdGhpcygpLCBwYWNrZXRfZW5kX2luZGV4Xyk7Ci19Ci0KLS8vIEZvciB0aGUgQXJyYXkgb3BlcmF0b3IsIHRyZWF0IGluZGV4IDAgYXMgdGhlIHJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBwYWNrZXQKLXVpbnQ4X3QgUGFja2V0OjpvcGVyYXRvcltdKHNpemVfdCBpKSB7Ci0gIHJldHVybiBnZXRfYXRfaW5kZXgoaSArIHBhY2tldF9zdGFydF9pbmRleF8pOwotfQotCi1zaXplX3QgUGFja2V0OjpnZXRfbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gZGF0YV8tPnNpemUoKTsgfQotCi0vLyBJdGVyYXRvcnMgdXNlIHRoZSBhYnNvbHV0ZSBpbmRleCB0byBhY2Nlc3MgZGF0YS4KLXVpbnQ4X3QgUGFja2V0OjpnZXRfYXRfaW5kZXgoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gIENIRUNLX0dFKGluZGV4LCBwYWNrZXRfc3RhcnRfaW5kZXhfKTsKLSAgQ0hFQ0tfTFQoaW5kZXgsIHBhY2tldF9lbmRfaW5kZXhfKTsKLSAgcmV0dXJuIGRhdGFfLT5hdChpbmRleCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvYmFzZS9wYWNrZXQuaCBiL3BhY2tldC9iYXNlL3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUyMmFiLi4wMDAwMDAwCi0tLSBhL3BhY2tldC9iYXNlL3BhY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgc3ViY2xhc3NlZCB0byBwcm92aWRlIHR5cGUtc3BlY2lmYyBhY2Nlc3NvcnMgb24KLS8vIGRhdGEuIE1hbmFnZXMgc2FpZCBkYXRhJ3MgbWVtb3J5IGFuZCBndWFyYW50ZWVzIHRoZSBkYXRhJ3MgcGVyc2lzdGVuY2UuIE9uY2UKLS8vIGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBpbW11dGFibGUuCi1jbGFzcyBQYWNrZXQgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxQYWNrZXQ+IHsKLSAgZnJpZW5kIGNsYXNzIEl0ZXJhdG9yOwotICBmcmllbmQgY2xhc3MgUGFja2V0QnVpbGRlcjsKLQotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFja2V0KCkgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICBQYWNrZXQoKQotICAgICAgOiBwYWNrZXRfc3RhcnRfaW5kZXhfKDApLAotICAgICAgICBwYWNrZXRfZW5kX2luZGV4XygwKSwKLSAgICAgICAgZGF0YV8oc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oMCkpe307Ci0gIFBhY2tldChzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUGFja2V0PiBwa3QsIHNpemVfdCBzdGFydCwgc2l6ZV90IGVuZCkKLSAgICAgIDogcGFja2V0X3N0YXJ0X2luZGV4XyhzdGFydCksIHBhY2tldF9lbmRfaW5kZXhfKGVuZCksIGRhdGFfKHBrdC0+ZGF0YV8pe307Ci0gIFBhY2tldChzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUGFja2V0PiBwa3QpIDogZGF0YV8ocGt0LT5kYXRhXykgewotICAgIGF1dG8gaW5kaWNlcyA9IHBrdC0+R2V0UGF5bG9hZEluZGVjaWVzKCk7Ci0gICAgcGFja2V0X3N0YXJ0X2luZGV4XyA9IGluZGljZXMuZmlyc3Q7Ci0gICAgcGFja2V0X2VuZF9pbmRleF8gPSBpbmRpY2VzLnNlY29uZDsKLSAgfTsKLQotIHB1YmxpYzoKLSAgc2l6ZV90IHNpemUoKSBjb25zdDsKLSAgY2xhc3MgSXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKLSAgY2xhc3MgSXRlcmF0b3IgZW5kKCkgY29uc3Q7Ci0KLSAgdWludDhfdCBvcGVyYXRvcltdKHNpemVfdCBpKTsKLQotICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2tldCBpcyBzdHJ1Y3R1cmVkIGNvcnJlY3RseSBhbmQgaGF2ZSB0aGUgY29ycmVjdAotICAvLyBsZW5ndGhzLiBEYXRhIGFjY2VzcyBvbiBhbiBpbnZhbGlkIHBhY2tldCBtYXkgY2F1c2UgYSBjcmFzaC4KLSAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCA9IDA7Ci0KLSAgLy8gRGVidWcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYWNrZXQKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0ID0gMDsKLQotICAvLyBDb252ZXJ0IGEgcGFja2V0IGhvcml6b250YWxseSBpbiBhIGxheWVyLCB5b3UgbWF5IG9ubHkgc3BlY2lhbGl6ZQotICAvLyBpbnRvIGEgbW9yZSBzcGVjaWZpYyB0eXBlIGFuZCBkb2luZyBvdGhlcndpc2Ugd2lsbCBjYXVzZSBhIGNvbXBpbGVyIGVycm9yCi0gIC8vCi0gIC8vIEV4YW1wbGU6Ci0gIC8vIHN0ZDo6c2hhcmVkX3B0cjxBdnJjcFBhY2tldD4gYmFzZTsKLSAgLy8gc3RkOjpzaGFyZWRfcHRyPEF2cmNwVmVuZG9yUGFja2V0PiBwID0KLSAgLy8gICAgUGFja2V0OjpTcGVjaWFsaXplPEF2cmNwVmVuZG9yUGFja2V0PihiYXNlKTsKLSAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VD4gU3BlY2lhbGl6ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VT4mIHBrdCkgewotICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19jb252ZXJ0aWJsZTxVKiwgUGFja2V0Kj46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzcGVjaWFsaXplIGEgbm9uLXBhY2tldCBvYmplY3QuIik7Ci0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvbnZlcnRpYmxlPFQqLCBQYWNrZXQqPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNwZWNpYWxpemUgdG8gc29tZXRoaW5nIHRoYXQgaXNuJ3QgYSBwYWNrZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29udmVydGlibGU8VCosIFUqPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBjb252ZXJ0IGJldHdlZW4gdGhlIHR3byBwYWNrZXQgdHlwZXMuIik7Ci0gICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUPigKLSAgICAgICAgbmV3IFQocGt0LCBwa3QtPnBhY2tldF9zdGFydF9pbmRleF8sIHBrdC0+cGFja2V0X2VuZF9pbmRleF8pKTsKLSAgfTsKLQotIHByb3RlY3RlZDoKLSAgLy8gUGFja2V0IHNob3VsZCBiZSBpbW11dGFibGUgb3RoZXIgdGhhbiB3aGVuIGJ1aWxkaW5nCi0gIHNpemVfdCBwYWNrZXRfc3RhcnRfaW5kZXhfOwotICBzaXplX3QgcGFja2V0X2VuZF9pbmRleF87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gZGF0YV87Ci0KLSBwcml2YXRlOgotICAvLyBPbmx5IEF2YWlsYWJsZSB0byB0aGUgaXRlcmF0b3JzCi0gIHZpcnR1YWwgc2l6ZV90IGdldF9sZW5ndGgoKSBjb25zdDsKLSAgdmlydHVhbCB1aW50OF90IGdldF9hdF9pbmRleChzaXplX3QgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIGJlZ2luaW5nIGFuZCBlbmQgaW5kaWNpZXMgb2YgdGhlIHBheWxvYWQgb2YgdGhlIHBhY2tldC4KLSAgLy8gVXNlZCB3aGVuIGNvbnN0cnVjdGluZyBhIHBhY2tldCBmcm9tIGFub3RoZXIgcGFja2V0IHdoZW4gbW92aW5nCi0gIC8vIGJldHdlZW4gbGF5ZXJzLgotICB2aXJ0dWFsIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gR2V0UGF5bG9hZEluZGVjaWVzKCkgY29uc3QgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L2Jhc2UvcGFja2V0X2J1aWxkZXIuY2MgYi9wYWNrZXQvYmFzZS9wYWNrZXRfYnVpbGRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlOTU0NC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvYmFzZS9wYWNrZXRfYnVpbGRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwYWNrZXRfYnVpbGRlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgInBhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotdm9pZCBQYWNrZXRCdWlsZGVyOjpSZXNlcnZlU3BhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFBhY2tldD4mIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7Ci0gIHBrdC0+ZGF0YV8tPnJlc2VydmUoc2l6ZSk7Ci19Ci0KLWJvb2wgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0PiYgcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvY3RldHMsIHVpbnQ2NF90IHZhbHVlKSB7Ci0gIENIRUNLX0xFKG9jdGV0cywgc2l6ZW9mKHVpbnQ2NF90KSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvY3RldHM7IGkrKykgewotICAgIHBrdC0+ZGF0YV8tPnB1c2hfYmFjayh2YWx1ZSAmIDB4ZmYpOwotICAgIHBrdC0+cGFja2V0X2VuZF9pbmRleF8rKzsKLSAgICB2YWx1ZSA9IHZhbHVlID4+IDg7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9iYXNlL3BhY2tldF9idWlsZGVyLmggYi9wYWNrZXQvYmFzZS9wYWNrZXRfYnVpbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjcxNzA4Li4wMDAwMDAwCi0tLSBhL3BhY2tldC9iYXNlL3BhY2tldF9idWlsZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIFBhY2tldDsKLQotY2xhc3MgUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgU2VyaWFsaXplKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+JiBwa3QpID0gMDsKLQotICB2aXJ0dWFsIH5QYWNrZXRCdWlsZGVyKCkgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICAvLyBPbmx5IEJ1aWxkZXJzIHNob3VsZCBiZSBhYmxlIHRvIGNhbGwgdGhlc2UKLSAgdm9pZCBSZXNlcnZlU3BhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFBhY2tldD4mIHBrdCwgc2l6ZV90IHNpemUpOwotICBib29sIEFkZFBheWxvYWRPY3RldHMxKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+JiBwa3QsIHVpbnQ4X3QgdmFsdWUpIHsKLSAgICByZXR1cm4gQWRkUGF5bG9hZE9jdGV0cyhwa3QsIDEsIHZhbHVlKTsKLSAgfQotICBib29sIEFkZFBheWxvYWRPY3RldHMyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+JiBwa3QsIHVpbnQxNl90IHZhbHVlKSB7Ci0gICAgcmV0dXJuIEFkZFBheWxvYWRPY3RldHMocGt0LCAyLCB2YWx1ZSk7Ci0gIH0KLSAgYm9vbCBBZGRQYXlsb2FkT2N0ZXRzMyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0PiYgcGt0LCB1aW50MzJfdCB2YWx1ZSkgewotICAgIHJldHVybiBBZGRQYXlsb2FkT2N0ZXRzKHBrdCwgMywgdmFsdWUpOwotICB9Ci0gIGJvb2wgQWRkUGF5bG9hZE9jdGV0czQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFBhY2tldD4mIHBrdCwgdWludDMyX3QgdmFsdWUpIHsKLSAgICByZXR1cm4gQWRkUGF5bG9hZE9jdGV0cyhwa3QsIDQsIHZhbHVlKTsKLSAgfQotICBib29sIEFkZFBheWxvYWRPY3RldHM2KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+JiBwa3QsIHVpbnQ2NF90IHZhbHVlKSB7Ci0gICAgcmV0dXJuIEFkZFBheWxvYWRPY3RldHMocGt0LCA2LCB2YWx1ZSk7Ci0gIH0KLSAgYm9vbCBBZGRQYXlsb2FkT2N0ZXRzOChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0PiYgcGt0LCB1aW50NjRfdCB2YWx1ZSkgewotICAgIHJldHVybiBBZGRQYXlsb2FkT2N0ZXRzKHBrdCwgOCwgdmFsdWUpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBBZGQgfG9jdGV0c3wgYnl0ZXMgdG8gdGhlIHBheWxvYWQuICBSZXR1cm4gdHJ1ZSBpZjoKLSAgLy8gLSB0aGUgdmFsdWUgb2YgfHZhbHVlfCBmaXRzIGluIHxvY3RldHN8IGJ5dGVzIGFuZAotICAvLyAtIHRoZSBuZXcgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpcyBzdGlsbCA8IHxrTWF4UGF5bG9hZE9jdGV0c3wKLSAgYm9vbCBBZGRQYXlsb2FkT2N0ZXRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+JiBwa3QsIHNpemVfdCBvY3RldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L2luY2x1ZGUvYXZyY3BfcGFja2V0LmggYi9wYWNrZXQvaW5jbHVkZS9hdnJjcF9wYWNrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4NmM3ZC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvaW5jbHVkZS9hdnJjcF9wYWNrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYXZyY3AvYXZyY3BfcGFja2V0LmgiCi0jaW5jbHVkZSAiYXZyY3AvYXZyY3BfcmVqZWN0X3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwL2NhcGFiaWxpdGllc19wYWNrZXQuaCIKLSNpbmNsdWRlICJhdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwL2dldF9wbGF5X3N0YXR1c19wYWNrZXQuaCIKLSNpbmNsdWRlICJhdnJjcC9wYXNzX3Rocm91Z2hfcGFja2V0LmgiCi0jaW5jbHVkZSAiYXZyY3AvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwL3ZlbmRvcl9wYWNrZXQuaCIKLQotI2luY2x1ZGUgImF2cmNwL2F2cmNwX2Jyb3dzZV9wYWNrZXQuaCIKLSNpbmNsdWRlICJhdnJjcC9jaGFuZ2VfcGF0aC5oIgotI2luY2x1ZGUgImF2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwL2dldF9mb2xkZXJfaXRlbXMuaCIKLSNpbmNsdWRlICJhdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAiYXZyY3AvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtcy5oIgotI2luY2x1ZGUgImF2cmNwL3BsYXlfaXRlbS5oIgotI2luY2x1ZGUgImF2cmNwL3NldF9hYnNvbHV0ZV92b2x1bWUuaCIKLSNpbmNsdWRlICJhdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllci5oIgotI2luY2x1ZGUgImF2cmNwL3NldF9icm93c2VkX3BsYXllci5oIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC9pbmNsdWRlL3BhY2tldC5oIGIvcGFja2V0L2luY2x1ZGUvcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzY4YWYuLjAwMDAwMDAKLS0tIGEvcGFja2V0L2luY2x1ZGUvcGFja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJhc2UvaXRlcmF0b3IuaCIKLSNpbmNsdWRlICJiYXNlL3BhY2tldC5oIgotI2luY2x1ZGUgImJhc2UvcGFja2V0X2J1aWxkZXIuaCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3AvYXZyY3BfYnJvd3NlX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2F2cmNwX2Jyb3dzZV9wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlMDg2Ny4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvYXZyY3BfYnJvd3NlX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfYnJvd3NlX3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBoYXMgcHVibGljIGFjY2Vzc29ycyB0byBwcm90ZWN0ZWQgbWV0aG9kcwotY2xhc3MgVGVzdFBhY2tldEJ1aWxkZXIgOiBwdWJsaWMgUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRlc3RQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIobmV3IFRlc3RQYWNrZXRCdWlsZGVyKGRhdGEpKTsKLSAgICByZXR1cm4gYnVpbGRlcjsKLSAgfTsKLQotICAvLyBNYWtlIGFsbCB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgcHVibGljCi0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OlJlc2VydmVTcGFjZTsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czE7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHMyOwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzMzsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czQ7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHM2OwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzODsKLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGRhdGFfLnNpemUoKTsgfTsKLQotICBib29sIFNlcmlhbGl6ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0PiYgcGt0KSBvdmVycmlkZSB7Ci0gICAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICAgIGZvciAodWludDhfdCBieXRlIDogZGF0YV8pIHsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBUZXN0UGFja2V0QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSA6IGRhdGFfKGRhdGEpe307Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV87Ci19OwotCi1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0QnJvd3NlUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8QnJvd3NlUGFja2V0PjsKLQotVEVTVChBdnJjcEJyb3dzZVBhY2tldEJ1aWxkZXJUZXN0LCBidWlsZFBhY2tldFRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3BheWxvYWQgPSB7Ci0gICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwfTsKLSAgYXV0byBwYXlsb2FkX2J1aWxkZXIgPQotICAgICAgVGVzdFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF9wYXlsb2FkKTsKLQotICBhdXRvIGJ1aWxkZXIgPSBCcm93c2VQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcihCcm93c2VQZHU6OkdFVF9GT0xERVJfSVRFTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwYXlsb2FkX2J1aWxkZXIpKTsKLQotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Quc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0KTsKLX0KLQotVEVTVChBdnJjcEJyb3dzZVBhY2tldFRlc3QsIGdldHRlcnNUZXN0KSB7Ci0gIGF1dG8gdGVzdF9icm93c2VfcGFja2V0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZShnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3QpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X2Jyb3dzZV9wYWNrZXQtPkdldFBkdSgpLCBCcm93c2VQZHU6OkdFVF9GT0xERVJfSVRFTVMpOwotICBBU1NFUlRfRVEodGVzdF9icm93c2VfcGFja2V0LT5HZXRMZW5ndGgoKSwgMTB1KTsKLX0KLQotVEVTVChBdnJjcEJyb3dzZVBhY2tldFRlc3QsIHBheWxvYWRCb3VuZHNUZXN0KSB7Ci0gIGF1dG8gdGVzdF9icm93c2VfcGFja2V0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZShnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3QpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfcGF5bG9hZCA9IHsKLSAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDB9OwotCi0gIC8vIE1ha2UgYSBmb2xkZXIgaXRlbXMgcGF5bG9hZCBwYWNrZXQgb3V0IG9mIHRoZSBwYXlsb2FkIG9mIHRoZSBicm93c2UgcGFja2V0Ci0gIGF1dG8gZ2V0X2ZvbGRlcl9pdGVtc19wYXlsb2FkID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZSh0ZXN0X2Jyb3dzZV9wYWNrZXQpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3BheWxvYWQuc2l6ZSgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEoKCpnZXRfZm9sZGVyX2l0ZW1zX3BheWxvYWQpW2ldLAotICAgICAgICAgICAgICBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfcGF5bG9hZFtpXSk7Ci0gIH0KLX0KLQotVEVTVChBdnJjcEJyb3dzZVBhY2tldFRlc3QsIHZhbGlkVGVzdCkgewotICBhdXRvIHRlc3RfYnJvd3NlX3BhY2tldCA9IFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2UoZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0KTsKLQotICBBU1NFUlRfVFJVRSh0ZXN0X2Jyb3dzZV9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoQXZyY3BCcm93c2VQYWNrZXRUZXN0LCBpbnZhbGlkVGVzdCkgewotICBhdXRvIHBhY2tldF9jb3B5ID0gZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0OwotICBwYWNrZXRfY29weS5wdXNoX2JhY2soMHgwMCk7Ci0gIGF1dG8gdGVzdF9icm93c2VfcGFja2V0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZShwYWNrZXRfY29weSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X2Jyb3dzZV9wYWNrZXQtPklzVmFsaWQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfcGFja2V0ID0gezB4MDAsIDB4MDF9OwotICB0ZXN0X2Jyb3dzZV9wYWNrZXQgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKHNob3J0X3BhY2tldCk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X2Jyb3dzZV9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9hdnJjcC9hdnJjcF9wYWNrZXRfdGVzdC5jYyBiL3BhY2tldC90ZXN0cy9hdnJjcC9hdnJjcF9wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0MzhiMy4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvYXZyY3BfcGFja2V0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF9wYWNrZXQuaCIKLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIEEgaGVscGVyIGNsYXNzIHRoYXQgaGFzIHB1YmxpYyBhY2Nlc3NvcnMgdG8gcHJvdGVjdGVkIG1ldGhvZHMKLWNsYXNzIFRlc3RQYWNrZXRCdWlsZGVyIDogcHVibGljIFBhY2tldEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxUZXN0UGFja2V0QnVpbGRlcj4gTWFrZUJ1aWxkZXIoCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFRlc3RQYWNrZXRCdWlsZGVyPiBidWlsZGVyKG5ldyBUZXN0UGFja2V0QnVpbGRlcihkYXRhKSk7Ci0gICAgcmV0dXJuIGJ1aWxkZXI7Ci0gIH07Ci0KLSAgLy8gTWFrZSBhbGwgdGhlIHV0aWxpdHkgZnVuY3Rpb25zIHB1YmxpYwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpSZXNlcnZlU3BhY2U7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHMxOwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzMjsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czM7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHM0OwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzNjsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czg7Ci0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBkYXRhXy5zaXplKCk7IH07Ci0KLSAgYm9vbCBTZXJpYWxpemUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFBhY2tldD4mIHBrdCkgb3ZlcnJpZGUgewotICAgIFJlc2VydmVTcGFjZShwa3QsIHNpemUoKSk7Ci0KLSAgICBmb3IgKHVpbnQ4X3QgYnl0ZSA6IGRhdGFfKSB7Ci0gICAgICBBZGRQYXlsb2FkT2N0ZXRzMShwa3QsIGJ5dGUpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgVGVzdFBhY2tldEJ1aWxkZXIoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgOiBkYXRhXyhkYXRhKXt9OwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfOwotfTsKLQotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEF2cmNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFja2V0PjsKLQotVEVTVChBdnJjcFBhY2tldEJ1aWxkZXJUZXN0LCBidWlsZFBhY2tldFRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0X3BheWxvYWQgPSB7Ci0gICAgICAweDAwLCAweDE5LCAweDU4LCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDAzfTsKLSAgYXV0byBjYXBfcmVxX2J1aWxkZXIgPQotICAgICAgVGVzdFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdF9wYXlsb2FkKTsKLQotICBhdXRvIGJ1aWxkZXIgPSBQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIENUeXBlOjpTVEFUVVMsIDB4MDksIDB4MDAsIE9wY29kZTo6VkVORE9SLCBzdGQ6Om1vdmUoY2FwX3JlcV9idWlsZGVyKSk7Ci0KLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0LnNpemUoKSk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0KTsKLX0KLQotVEVTVChBdnJjcFBhY2tldFRlc3QsIGdldHRlclRlc3RzKSB7Ci0gIGF1dG8gdGVzdF9hdnJjcF9wYWNrZXQgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0KTsKLQotICBBU1NFUlRfRVEodGVzdF9hdnJjcF9wYWNrZXQtPkdldENUeXBlKCksIENUeXBlOjpTVEFUVVMpOwotICBBU1NFUlRfRVEodGVzdF9hdnJjcF9wYWNrZXQtPkdldFN1YnVuaXRUeXBlKCksIDB4MDkpOwotICBBU1NFUlRfRVEodGVzdF9hdnJjcF9wYWNrZXQtPkdldFN1YnVuaXRJZCgpLCAweDAwKTsKLSAgQVNTRVJUX0VRKHRlc3RfYXZyY3BfcGFja2V0LT5HZXRPcGNvZGUoKSwgT3Bjb2RlOjpWRU5ET1IpOwotfQotCi1URVNUKEF2cmNwUGFja2V0VGVzdCwgZ2V0dGVyTWFza1Rlc3RzKSB7Ci0gIGF1dG8gYmFkX2dldF9jYXBfZGF0YSA9IGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdDsKLSAgYmFkX2dldF9jYXBfZGF0YVswXSA9IDB4RkY7ICAvLyBDVHlwZQotICBiYWRfZ2V0X2NhcF9kYXRhWzFdID0gMHhGRjsgIC8vIFN1YnVuaXQgVHlwZSAmIElECi0KLSAgYXV0byB0ZXN0X2F2cmNwX3BhY2tldCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZShiYWRfZ2V0X2NhcF9kYXRhKTsKLQotICBBU1NFUlRfRVEodGVzdF9hdnJjcF9wYWNrZXQtPkdldENUeXBlKCksIENUeXBlOjpJTlRFUklNKTsKLSAgQVNTRVJUX0VRKHRlc3RfYXZyY3BfcGFja2V0LT5HZXRTdWJ1bml0VHlwZSgpLCAwYjAwMDExMTExKTsKLSAgQVNTRVJUX0VRKHRlc3RfYXZyY3BfcGFja2V0LT5HZXRTdWJ1bml0SWQoKSwgMGIwMDAwMDExMSk7Ci19Ci0KLVRFU1QoQXZyY3BQYWNrZXRUZXN0LCBwYXlsb2FkQm91bmRzVGVzdCkgewotICBhdXRvIHRlc3RfYXZyY3BfcGFja2V0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2NhcF9wYXlsb2FkX2RhdGEgPSB7MHgwMCwgMHgxOSwgMHg1OCwgMHgxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwM307Ci0KLSAgYXV0byBnZXRfY2FwX3BheWxvYWRfcGFja2V0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKHRlc3RfYXZyY3BfcGFja2V0KTsKLQotICAvLyBXZSBhcmUgdW5hYmxlIHRvIGRvIGEgZGlyZWN0IHZlY3RvciBjb21wYXJlIGhlcmUgYXMgb25lIG9mIHRoZSBwYWNrZXRzIGlzCi0gIC8vIGEgbGFyZ2VyIHZlY3RvciB0aGF0IG9ubHkgaGFzIGEgc2VnbWVudCBvZiBkYXRhIGN1cnJlbnRseSB2aXNpYmxlLgotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdldF9jYXBfcGF5bG9hZF9kYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGdldF9jYXBfcGF5bG9hZF9kYXRhW2ldLCAoKmdldF9jYXBfcGF5bG9hZF9wYWNrZXQpW2ldKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3AvYXZyY3BfcmVqZWN0X3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2F2cmNwX3JlamVjdF9wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhYTlhNi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvYXZyY3BfcmVqZWN0X3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF9yZWplY3RfcGFja2V0LmgiCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEF2cmNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFja2V0PjsKLQotVEVTVChSZWplY3RQYWNrZXRCdWlsZGVyVGVzdCwgYnVpbGRQYWNrZXRUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgQ29tbWFuZFBkdTo6TElTVF9BUFBMSUNBVElPTl9TRVRUSU5HX0FUVFJJQlVURVMsIFN0YXR1czo6SU5WQUxJRF9DT01NQU5EKTsKLQotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCByZWplY3RfcGxheWVyX2FwcF9zZXR0aW5nc19yZXNwb25zZS5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIHJlamVjdF9wbGF5ZXJfYXBwX3NldHRpbmdzX3Jlc3BvbnNlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL2F2cmNwX3Rlc3RfcGFja2V0cy5oIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2F2cmNwX3Rlc3RfcGFja2V0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFjMTYxLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9hdnJjcF90ZXN0X3BhY2tldHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLy8gQVZSQ1AgcGFja2V0cyBwdWxsZWQgZnJvbSB3aXJlc2hhcmsKLW5hbWVzcGFjZSB7Ci0KLS8vIEFWUkNQIEdldCBDYXBhYmlsaXRpZXMgUmVxdWVzdCBwYWNrZXQKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCA9IHsKLSAgICAweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDAzfTsKLQotLy8gQVZSQ1AgR2V0IENhcGFiaWxpdGllcyBSZXF1ZXN0IHBhY2tldCB3aXRoIENvbXBhbnkgSUQKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdF9jb21wYW55X2lkID0gewotICAgIDB4MDEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDJ9OwotCi0vLyBBVlJDUCBHZXQgQ2FwYWJpbGl0aWVzIFJlcXVlc3QgcGFja2V0IHdpdGggVW5rbm93bgotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0X3Vua25vd24gPSB7Ci0gICAgMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3Zn07Ci0KLS8vIEFWUkNQIEdldCBDYXBhYmlsaXRpZXMgUmVzcG9uc2UgdG8gQ29tcGFueSBJRCByZXF1ZXN0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlX2NvbXBhbnlfaWQgPSB7Ci0gICAgMHgwYywgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgxMCwgMHgwMCwgMHgwMCwKLSAgICAweDA4LCAweDAyLCAweDAyLCAweDAwLCAweDE5LCAweDU4LCAweDAwLCAweDIzLCAweDQ1fTsKLQotLy8gQVZSQ1AgR2V0IENhcGFiaWxpdGllcyBSZXNwb25zZSB0byBFdmVudHMgU3VwcG9ydGVkIHJlcXVlc3QKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9jYXBhYmlsaXRpZXNfcmVzcG9uc2VfZXZlbnRzX3N1cHBvcnRlZCA9IHsKLSAgICAweDBjLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDEwLCAweDAwLAotICAgIDB4MDAsIDB4MDUsIDB4MDMsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDV9OwotCi0vLyBBVlJDUCBHZXQgRWxlbWVudCBBdHRyaWJ1dGVzIHJlcXVlc3QgZm9yIGN1cnJlbnQgcGxheWluZyBzb25nIGFuZCBhdHRyaWJ1dGUKLS8vIFRpdGxlCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfcGFydGlhbCA9IHsKLSAgICAweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDIwLCAweDAwLCAweDAwLCAweDBkLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9OwotCi0vLyBBVlJDUCBHZXQgRWxlbWVudCBBdHRyaWJ1dGVzIHJlcXVlc3QgZm9yIGN1cnJlbnQgcGxheWluZyBzb25nIGFuZCBhdHRyaWJ1dGVzCi0vLyBUaXRsZSwgQXJ0aXN0LCBBbGJ1bSwgTWVkaWEgTnVtYmVyLCBQbGF5aW5nIFRpbWUsIFRvdGFsIE51bWJlciBvZiBNZWRpYSwgYW5kCi0vLyBHZW5yZQotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwgPSB7Ci0gICAgMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNn07Ci0KLQotLy8gQVZSQ1AgR2V0IEVsZW1lbnQgQXR0cmlidXRlcyByZXF1ZXN0IGZvciBjdXJyZW50IHBsYXlpbmcgc29uZyBhbmQgYXR0cmlidXRlcwotLy8gVGl0bGUsIEFydGlzdCwgQWxidW0sIE1lZGlhIE51bWJlciwgUGxheWluZyBUaW1lLCBUb3RhbCBOdW1iZXIgb2YgTWVkaWEsCi0vLyBHZW5yZSwgYW5kIENvdmVyIEFydAotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGxfY292ZXJfYXJ0ID0gewotICAgIDB4MDEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwOH07Ci0KLS8vIEFWUkNQIEdldCBFbGVtZW50IEF0dHJpYnV0ZXMgcmVzcG9uc2Ugd2l0aCBhdHRyaWJ1dGUgdmFsdWVzIGFzIGZvbGxvd3MKLS8vIFRpdGxlOiAiVGVzdCBTb25nIgotLy8gQXJ0aXN0OiAiVGVzdCBBcnRpc3QiCi0vLyBBbGJ1bTogIlRlc3QgQWxidW0iCi0vLyBUcmFjayBOdW1iZXI6ICIxIgotLy8gTnVtYmVyIG9mIFRyYWNrczogIjIiCi0vLyBHZW5yZTogIlRlc3QgR2VucmUiCi0vLyBEdXJhdGlvbjogIjEwMDAiCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfZWxlbWVudHNfYXR0cmlidXRlc19yZXNwb25zZV9mdWxsID0gewotICAgIDB4MGMsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MDcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwOSwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwKLSAgICAweDUzLCAweDZmLCAweDZlLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDZhLCAweDAwLCAweDBiLAotICAgIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NDEsIDB4NzIsIDB4NzQsIDB4NjksIDB4NzMsIDB4NzQsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHg2YSwgMHgwMCwgMHgwYSwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwKLSAgICAweDQxLCAweDZjLCAweDYyLCAweDc1LCAweDZkLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDZhLCAweDAwLAotICAgIDB4MDEsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDEsIDB4MzIsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwYSwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwKLSAgICAweDQ3LCAweDY1LCAweDZlLCAweDcyLCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDZhLCAweDAwLAotICAgIDB4MDQsIDB4MzEsIDB4MzAsIDB4MzAsIDB4MzB9OwotCi0vLyBBVlJDUCBHZXQgUGxheSBTdGF0dXMgUmVxdWVzdAotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X3BsYXlfc3RhdHVzX3JlcXVlc3QgPSB7MHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTgsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0vLyBBVlJDUCBHZXQgUGxheSBTdGF0dXMgUmVzcG9uc2UKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9wbGF5X3N0YXR1c19yZXNwb25zZSA9IHsKLSAgICAweDBjLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDMwLCAweDAwLCAweDAwLCAweDA5LAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDB9OwotCi0vLyBBVlJDUCBQYXNzIFRocm91Z2ggQ29tbWFuZCBQbGF5IFB1c2hlZCBSZXF1ZXN0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3B1c2hlZCA9IHsweDAwLCAweDQ4LCAweDdjLCAweDQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMH07Ci0KLS8vIEFWUkNQIFBhc3MgVGhyb3VnaCBDb21tYW5kIFBsYXkgUHVzaGVkIFJlc3BvbnNlCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3JlbGVhc2VkID0gezB4MDksIDB4NDgsIDB4N2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzQsIDB4MDB9OwotCi0vLyBBVlJDUCBSZWdpc3RlciBQbGF5YmFjayBTdGF0dXMgTm90aWZpY2F0aW9uCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiByZWdpc3Rlcl9wbGF5X3N0YXR1c19ub3RpZmljYXRpb24gPSB7Ci0gICAgMHgwMywgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgzMSwgMHgwMCwKLSAgICAweDAwLCAweDA1LCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA1fTsKLQotLy8gQVZSQ1AgUmVnaXN0ZXIgVm9sdW1lIENoYW5nZWQgTm90aWZpY2F0aW9uCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiByZWdpc3Rlcl92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24gPSB7Ci0gICAgMHgwMywgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgzMSwgMHgwMCwKLSAgICAweDAwLCAweDA1LCAweDBkLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotLy8gQVZSQ1AgUmVnaXN0ZXIgTm90aWZpY2F0aW9uIHdpdGhvdXQgYW55IHBhcmFtZXRlcgotc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVnaXN0ZXJfbm90aWZpY2F0aW9uX2ludmFsaWQgPSB7MHgwMywgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0vLyBBVlJDUCBJbnRlcmltIFBsYXliYWNrIFN0YXR1cyBOb3RpZmljYXRpb24KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGludGVyaW1fcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uID0gewotICAgIDB4MGYsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDB9OwotCi0vLyBBVlJDUCBJbnRlcmltIFRyYWNrIENoYW5nZWQgTm90aWZpY2F0aW9uCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnRlcmltX3RyYWNrX2NoYW5nZWRfbm90aWZpY2F0aW9uID0gewotICAgIDB4MGYsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDksCi0gICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLS8vIEFWUkNQIENoYW5nZWQgUGxheWJhY2sgUG9zaXRpb24gTm90aWZpY2F0aW9uCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjaGFuZ2VkX3BsYXlfcG9zX25vdGlmaWNhdGlvbiA9IHsKLSAgICAweDBkLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDMxLCAweDAwLAotICAgIDB4MDAsIDB4MDUsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0vLyBBVlJDUCBJbnRlcmltIE5vdyBQbGF5aW5nIENoYW5nZWQgTm90aWZpY2F0aW9uCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnRlcmltX25vd19wbGF5aW5nX25vdGlmaWNhdGlvbiA9IHsKLSAgICAweDBmLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDMxLCAweDAwLCAweDAwLCAweDAxLCAweDA5fTsKLQotLy8gQVZSQ1AgSW50ZXJpbSBBdmFpbGFibGUgUGxheWVycyBDaGFuZ2VkIE5vdGlmaWNhdGlvbgotc3RkOjp2ZWN0b3I8dWludDhfdD4gaW50ZXJpbV9hdmFpbGFibGVfcGxheWVyc19ub3RpZmljYXRpb24gPSB7Ci0gICAgMHgwZiwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwYX07Ci0KLS8vIEFWUkNQIEludGVyaW0gQWRkcmVzc2VkIFBsYXllciBDaGFuZ2VkIE5vdGlmaWNhdGlvbiB3aXRoIGFjdGl2ZQotLy8gcGxheWVyIElEIDEKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGludGVyaW1fYWRkcmVzc2VkX3BsYXllcl9ub3RpZmljYXRpb24gPSB7Ci0gICAgMHgwZiwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgzMSwgMHgwMCwKLSAgICAweDAwLCAweDA1LCAweDBiLCAweDAwLCAweDAxLCAweDAwLCAweDAwfTsKLQotLy8gQVZSQ1AgSW50ZXJpbSBVSURzIENoYW5nZWQgTm90aWZpY2F0aW9uCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnRlcmltX3VpZHNfbm90aWZpY2FpdG9uID0gezB4MGYsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTgsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMsIDB4MDAsIDB4MDB9OwotCi0vLyBBVlJDUCBJbnRlcmltIFZvbHVtZSBDaGFuZ2VkIE5vdGlmaWNhdGlvbiB3aXRoIHZvbHVtZSBhdCA1NSUgKDB4NDcpCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbiA9IHsKLSAgICAweDBmLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDMxLCAweDAwLCAweDAwLCAweDAyLCAweDBkLCAweDQ3fTsKLQotLy8gQVZSQ1AgUmVqZWN0ZWQgVm9sdW1lIENoYW5nZWQgTm90aWZpY2F0aW9uIHdpdGggdm9sdW1lIGF0IDAlCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiByZWplY3RlZF92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24gPSB7Ci0gICAgMHgwYSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwZCwgMHgwMH07Ci0KLS8vIEFWUkNQIENoYW5nZWQgVm9sdW1lIENoYW5nZWQgTm90aWZpY2F0aW9uIHdpdGggdm9sdW1lIGF0IDU1JSAoMHg0NykKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoYW5nZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uID0gewotICAgIDB4MGQsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MGQsIDB4NDd9OwotCi0vLyBBVlJDUCBSZWplY3QgTGlzdCBQbGF5ZXIgQXBwbGljYXRpb24gU2V0dGluZ3MgUmVzcG9uc2UKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlamVjdF9wbGF5ZXJfYXBwX3NldHRpbmdzX3Jlc3BvbnNlID0gewotICAgIDB4MGEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDB9OwotCi0vLyBBVlJDUCBCcm93c2UgR2VuZXJhbCBSZWplY3QgcGFja2V0IGZvciBpbnZhbGlkIFBEVSBJRAotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2VuZXJhbF9yZWplY3RfaW52YWxpZF9jb21tYW5kX3BhY2tldCA9IHsweGEwLCAweDAwLCAweDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwfTsKLQotLy8gQVZSQ1AgQnJvd3NlIEdldCBGb2xkZXIgSXRlbXMgUmVxdWVzdCBwYWNrZXQgZm9yIG1lZGlhIHBsYXllcnMgd2l0aAotLy8gdGhlIGZvbGxvd2luZyBkYXRhOgotLy8gICAgc2NvcGUgPSAweDAwIChNZWRpYSBQbGF5ZXIgTGlzdCkKLS8vICAgIHN0YXJ0X2l0ZW0gPSAweDAwCi0vLyAgICBlbmRfaXRlbSA9IDB4MDMKLS8vICAgIGF0dHJpYnV0ZXNfcmVxdWVzdGVkOiBhbGwKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdCA9IHsweDcxLCAweDAwLCAweDBhLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMywgMHgwMH07Ci0KLS8vIEFWUkNQIEJyb3dzZSBHZXQgRm9sZGVyIEl0ZW1zIFJlcXVlc3QgcGFja2V0IGZvciBtZWRpYSBwbGF5ZXJzIHdpdGgKLS8vIHRoZSBmb2xsb3dpbmcgZGF0YToKLS8vICAgIHNjb3BlID0gMHgwMSAoVkZTKQotLy8gICAgc3RhcnRfaXRlbSA9IDB4MDAKLS8vICAgIGVuZF9pdGVtID0gMHgwOQotLy8gICAgYXR0cmlidXRlc19yZXF1ZXN0ZWQ6IG5vbmUKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF9ub19hdHRycyA9IHsKLSAgICAweDcxLCAweDAwLCAweDBhLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4ZmZ9OwotCi0vLyBBVlJDUCBCcm93c2UgR2V0IEZvbGRlciBJdGVtcyBSZXF1ZXN0IHBhY2tldCBmb3IgbWVkaWEgcGxheWVycyB3aXRoCi0vLyB0aGUgZm9sbG93aW5nIGRhdGE6Ci0vLyAgICBzY29wZSA9IDB4MDEgKFZGUykKLS8vICAgIHN0YXJ0X2l0ZW0gPSAweDAwCi0vLyAgICBlbmRfaXRlbSA9IDB4MDkKLS8vICAgIGF0dHJpYnV0ZXNfcmVxdWVzdGVkOiBUaXRsZQotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3RpdGxlID0gewotICAgIDB4NzEsIDB4MDAsIDB4MGUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxfTsKLQotLy8gQVZSQ1AgQnJvd3NlIEdldCBGb2xkZXIgSXRlbXMgUmVxdWVzdCBwYWNrZXQgZm9yIHZmcyB3aXRoCi0vLyB0aGUgZm9sbG93aW5nIGRhdGE6Ci0vLyAgICBzY29wZSA9IDB4MDEgKFZGUykKLS8vICAgIHN0YXJ0X2l0ZW0gPSAweDAwCi0vLyAgICBlbmRfaXRlbSA9IDB4MDUKLS8vICAgIGF0dHJpYnV0ZXNfcmVxdWVzdGVkOiBUSVRMRQotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3ZmcyA9IHsKLSAgICAweDcxLCAweDAwLCAweDBlLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9OwotCi0vLyBBVlJDUCBCcm93c2UgR2V0IEZvbGRlciBJdGVtcyBSZXF1ZXN0IHBhY2tldCBmb3Igbm93IHBsYXlpbmcgd2l0aAotLy8gdGhlIGZvbGxvd2luZyBkYXRhOgotLy8gICAgc2NvcGUgPSAweDAzIChOb3cgUGxheWluZykKLS8vICAgIHN0YXJ0X2l0ZW0gPSAweDAwCi0vLyAgICBlbmRfaXRlbSA9IDB4MDUKLS8vICAgIGF0dHJpYnV0ZXNfcmVxdWVzdGVkOiBBbGwgSXRlbXMKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF9ub3dfcGxheWluZyA9IHsweDcxLCAweDAwLCAweDBhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDB9OwotCi0vLyBBVlJDUCBCcm93c2UgR2V0IEZvbGRlciBJdGVtcyBSZXNwb25zZSBwYWNrZXQgd2l0aCByYW5nZSBvdXQgb2YgYm91bmRzIGVycm9yCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfZm9sZGVyX2l0ZW1zX2Vycm9yX3Jlc3BvbnNlID0gezB4NzEsIDB4MDAsIDB4MDEsIDB4MGJ9OwotCi0vLyBBVlJDUCBCcm93c2UgR2V0IEZvbGRlciBJdGVtcyBSZXNwb25zZSBwYWNrZXQgZm9yIG1lZGlhIHBsYXllcnMKLS8vIENvbnRhaW5zIG9uZSBtZWRpYSBwbGF5ZXIgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKLS8vICAgIGlkID0gMHgwMDAxCi0vLyAgICBuYW1lID0gImNvbS5nb29nbGUuYW5kcm9pZC5tdXNpYyIKLS8vICAgIGJyb3dzaW5nX3N1cHBvcnRlZCA9IHRydWUKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfbWVkaWFfcGxheWVyX3Jlc3BvbnNlID0gewotICAgIDB4NzEsIDB4MDAsIDB4M2MsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MzQsCi0gICAgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweGI3LCAweDAxLCAweDBjLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MTgsIDB4NjMsIDB4NmYsIDB4NmQsIDB4MmUsIDB4NjcsCi0gICAgMHg2ZiwgMHg2ZiwgMHg2NywgMHg2YywgMHg2NSwgMHgyZSwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg3MiwgMHg2ZiwKLSAgICAweDY5LCAweDY0LCAweDJlLCAweDZkLCAweDc1LCAweDczLCAweDY5LCAweDYzfTsKLQotLy8gQVZSQ1AgQnJvd3NlIEdldCBGb2xkZXIgSXRlbXMgUmVzcG9uc2UgcGFja2V0IHdpdGggb25lIGZvbGRlcgotLy8gd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKLS8vICAgIHVpZCA9IDB4MDAwMDAwMDAwMDAwMDAwMQotLy8gICAgdHlwZSA9IDB4MDAgKE1peGVkKTsKLS8vICAgIG5hbWUgPSAiVGVzdCBGb2xkZXIiCi0vLyAgICBpc19wbGF5YWJsZSA9IHRydWUKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfZm9sZGVyX3Jlc3BvbnNlID0gewotICAgIDB4NzEsIDB4MDAsIDB4MjEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MTksIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2YSwgMHgwMCwKLSAgICAweDBiLCAweDU0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDQ2LCAweDZmLCAweDZjLCAweDY0LCAweDY1LCAweDcyfTsKLQotLy8gQVZSQ1AgQnJvd3NlIEdldCBGb2xkZXIgSXRlbXMgUmVzcG9uc2UgcGFja2V0IHdpdGggb25lIHNvbmcKLS8vIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0vLyAgICB1aWQgPSAweDAwMDAwMDAwMDAwMDAwMDIKLS8vICAgIG5hbWUgPSAiVGVzdCBUaXRsZSIKLS8vICAgIGF0dHJpYnV0ZVtUSVRMRV0gPSAiVGVzdCBUaXRsZSIKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfc29uZ19yZXNwb25zZSA9IHsKLSAgICAweDcxLCAweDAwLCAweDMyLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAwLCAweDJhLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NmEsCi0gICAgMHgwMCwgMHgwYSwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg1NCwgMHg2OSwgMHg3NCwgMHg2YywKLSAgICAweDY1LCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDZhLCAweDAwLCAweDBhLCAweDU0LAotICAgIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTQsIDB4NjksIDB4NzQsIDB4NmMsIDB4NjV9OwotCi0vLyBBVlJDUCBCcm93c2UgQ2hhbmdlIFBhdGggUmVxdWVzdCBkb3duIHRvIGZvbGRlciB3aXRoIFVJRCAweDAwMDAwMDAwMDAwMDAwMDIKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoYW5nZV9wYXRoX3JlcXVlc3QgPSB7MHg3MiwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMn07Ci0KLS8vIEFWUkNQIEJyb3dzZSBDaGFuZ2UgUGF0aCBSZXF1ZXN0IHVwCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjaGFuZ2VfcGF0aF91cF9yZXF1ZXN0ID0gezB4NzIsIDB4MDAsIDB4MGIsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OwotCi0vLyBBVlJDUCBCcm93c2UgQ2hhbmdlIFBhdGggUmVzcG9uc2Ugd2l0aCB0d28gaXRlbXMgaW4gY3VycmVudCBmb2xkZXIKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoYW5nZV9wYXRoX3Jlc3BvbnNlID0gezB4NzIsIDB4MDAsIDB4MDUsIDB4MDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAyfTsKLQotLy8gQVZSQ1AgQnJvd3NlIENoYW5nZSBQYXRoIFJlc3BvbnNlIHdpdGggYW4gZXJyb3Igb2YgaW52YWxpZCBkaXJlY3Rpb24KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNoYW5nZV9wYXRoX2Vycm9yX3Jlc3BvbnNlID0gezB4NzIsIDB4MDAsIDB4MDEsIDB4MDd9OwotCi0vLyBBVlJDUCBHZXQgSXRlbSBBdHRyaWJ1dGVzIHJlcXVlc3Qgd2l0aCBhbGwgYXR0cmlidXRlcyByZXF1ZXN0ZWQKLS8vIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0vLyAgICBzY29wZSA9IDB4MDMgKE5vdyBQbGF5aW5nIExpc3QpCi0vLyAgICB1aWRfY291bnRlciA9IDB4MDAwMAotLy8gICAgdWlkID0gMHgwMDAwMDAwMDAwMDAwMDAxCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3RfYWxsX2F0dHJpYnV0ZXMgPSB7Ci0gICAgMHg3MywgMHgwMCwgMHgyOCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwN307Ci0KLS8vIEFWUkNQIEdldCBJdGVtIEF0dHJpYnV0ZXMgcmVxdWVzdCB3aXRoIGFsbCBhdHRyaWJ1dGVzIHJlcXVlc3RlZAotLy8gd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKLS8vICAgIHNjb3BlID0gMHgwMyAoTm93IFBsYXlpbmcgTGlzdCkKLS8vICAgIHVpZF9jb3VudGVyID0gMHgwMDAwCi0vLyAgICB1aWQgPSAweDAwMDAwMDAwMDAwMDAwMDEKLS8vICAgIGF0dHJpYnV0ZXMgPSBUaXRsZSwgQXJ0aXN0LCBBbGJ1bSwgTWVkaWEgTnVtYmVyLCBQbGF5aW5nIFRpbWUsCi0vLyAgICAgICAgICAgICAgICAgVG90YWwgTnVtYmVyIG9mIE1lZGlhLCBHZW5yZSwgYW5kIENvdmVyIEFydAotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXF1ZXN0X2FsbF9hdHRyaWJ1dGVzX3dpdGhfY292ZXJfYXJ0ID0gewotICAgIDB4NzMsIDB4MDAsIDB4MkMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwOH07Ci0KLS8vIEFWUkNQIEdldCBJdGVtIEF0dHJpYnV0ZXMgcmVxdWVzdCB3aXRoIGFsbCBhdHRyaWJ1dGVzIHJlcXVlc3RlZAotLy8gd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKLS8vICAgIHNjb3BlID0gMHgwMyAoTm93IFBsYXlpbmcgTGlzdCkKLS8vICAgIHVpZF9jb3VudGVyID0gMHgwMDAxCi0vLyAgICB1aWQgPSAweDAwMDAwMDAwMDAwMDAwMDEKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdF9hbGxfYXR0cmlidXRlc19pbnZhbGlkID0gewotICAgIDB4NzMsIDB4MDAsIDB4MjgsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMSwgMHgwMCwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDd9OwotCi0vLyBBVlJDUCBHZXQgSXRlbSBBdHRyaWJ1dGVzIFJlc3BvbnNlIHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotLy8gICAgdGl0bGUgPSAiVGVzdCBTb25nIgotLy8gICAgYXJ0aXN0ID0gIlRlc3QgQXJ0aXN0IgotLy8gICAgYWxidW0gPSAiVGVzdCBBbGJ1bSIKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9pdGVtX2F0dHJpYnV0ZXNfc29uZ19yZXNwb25zZSA9IHsKLSAgICAweDczLCAweDAwLCAweDM4LCAweDA0LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDZhLCAweDAwLAotICAgIDB4MDksIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTMsIDB4NmYsIDB4NmUsIDB4NjcsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMiwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwYiwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg0MSwKLSAgICAweDcyLCAweDc0LCAweDY5LCAweDczLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDZhLCAweDAwLAotICAgIDB4MGEsIDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NDEsIDB4NmMsIDB4NjIsIDB4NzUsIDB4NmR9OwotCi0vLyBBVlJDUCBTZXQgQWRkcmVzc2VkIFBsYXllciBSZXF1ZXN0IHdpdGggcGxheWVyX2lkID0gMAotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdCA9IHsKLSAgICAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDYwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwfTsKLQotLy8gQVZSQ1AgU2V0IEFkZHJlc3NlZCBQbGF5ZXIgUmVxdWVzdCB3aXRoIHBsYXllcl9pZCA9IDEKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNldF9hZGRyZXNzZWRfcGxheWVyX2lkXzFfcmVxdWVzdCA9IHsKLSAgICAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDYwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAxfTsKLQotLy8gQVZSQ1AgU2V0IEFkZHJlc3NlZCBQbGF5ZXIgUmVzcG9uc2Ugd2l0aCBzdGF0dXMgc3VjY2Vzcwotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVzcG9uc2UgPSB7Ci0gICAgMHgwOSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNH07Ci0KLS8vIEFWUkNQIFNldCBCcm93c2VkIFBsYXllciBSZXF1ZXN0IHdpdGggcGxheWVyX2lkID0gMgotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2Jyb3dzZWRfcGxheWVyX3JlcXVlc3QgPSB7MHg3MCwgMHgwMCwgMHgwMiwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJ9OwotCi0vLyBBVlJDUCBTZXQgQnJvd3NlZCBQbGF5ZXIgUmVxdWVzdCB3aXRoIHBsYXllcl9pZCA9IDAKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNldF9icm93c2VkX3BsYXllcl9pZF8wX3JlcXVlc3QgPSB7MHg3MCwgMHgwMCwgMHgwMiwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMH07Ci0KLS8vIEFWUkNQIFNldCBCcm93c2VkIFBsYXllciBSZXNwb25zZSB3aXRoIG51bSBpdGVtcyA9IDQgYW5kIGRlcHRoID0gMAotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc3BvbnNlID0gewotICAgIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg2YSwgMHgwMH07Ci0KLS8vIEFWUkNQIEdldCBUb3RhbCBOdW1iZXIgb2YgSXRlbXMgUmVxdWVzdCB3aXRoIFNjb3BlID0gTWVkaWEgUGxheWVyIExpc3QKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxdWVzdF9tZWRpYV9wbGF5ZXJzID0gewotICAgIDB4NzUsIDB4MDAsIDB4MDEsIDB4MDB9OwotCi0vLyBBVlJDUCBHZXQgVG90YWwgTnVtYmVyIG9mIEl0ZW1zIFJlcXVlc3Qgd2l0aCBTY29wZSA9IFZGUwotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X3ZmcyA9IHsweDc1LCAweDAwLCAweDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxfTsKLQotLy8gQVZSQ1AgR2V0IFRvdGFsIE51bWJlciBvZiBJdGVtcyBSZXF1ZXN0IHdpdGggU2NvcGUgPSBOb3cgUGxheWluZyBMaXN0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmcgPSB7Ci0gICAgMHg3NSwgMHgwMCwgMHgwMSwgMHgwM307Ci0KLS8vIEFWUkNQIEdldCBUb3RhbCBudW1iZXIgb2YgSXRlbXMgUmVzcG9uc2Ugd2l0aCA1IGl0ZW1zIGluIGZvbGRlcgotc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNwb25zZSA9IHsKLSAgICAweDc1LCAweDAwLCAweDA3LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1fTsKLQotLy8gQVZSQ1AgUGxheSBJdGVtIFJlcXVlc3Qgd2l0aCBzY29wZSA9IE5vdyBQbGF5aW5nIGFuZAotLy8gVUlEID0gMHgwMDAwMDAwMDAwMDAwMDAzCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBwbGF5X2l0ZW1fcmVxdWVzdCA9IHsKLSAgICAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDc0LCAweDAwLCAweDAwLCAweDBiLCAweDAzLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDB9OwotCi0vLyBBVlJDUCBQbGF5IEl0ZW0gUmVzcG9uc2UKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBsYXlfaXRlbV9yZXNwb25zZSA9IHsweDA5LCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDR9OwotCi0vLyBBVlJDUCBTZXQgQWJzb2x1dGUgVm9sdW1lIFJlcXVlc3Qgd2l0aCB2b2x1bWUgYXQgNTYlICgweDQ4KQotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXF1ZXN0ID0gewotICAgIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDh9OwotCi0vLyBBVlJDUCBTZXQgQWJzb2x1dGUgVm9sdW1lIFJlc3BvbnNlIHdpdGggdm91bWUgYXQgNTIlICgweDQzKQotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXNwb25zZSA9IHsKLSAgICAweDA5LCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDUwLCAweDAwLCAweDAwLCAweDAxLCAweDQzfTsKLQotLy8gSW52YWxpZCBQYWNrZXRzCi0vLyBTaG9ydCBWZW5kb3IgUGFja2V0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF92ZW5kb3JfcGFja2V0ID0gezB4MDEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDF9OwotCi0vLyBTaG9ydCBHZXQgQ2FwYWJpbGl0aWVzIFJlcXVlc3QgUGFja2V0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9nZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3QgPSB7MHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLS8vIFNob3J0IEdldCBFbGVtZW50IEF0dHJpYnV0ZXMgUmVxdWVzdCBQYWNrZXQKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxdWVzdCA9IHsweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0vLyBTaG9ydCBQbGF5IEl0ZW0gUmVxdWVzdCBQYWNrZXQKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X3BsYXlfaXRlbV9yZXF1ZXN0ID0gezB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0vLyBTaG9ydCBTZXQgQWRkcmVzc2VkIFBsYXllciBSZXF1ZXN0IFBhY2tldAotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdCA9IHsweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDYwLCAweDAwLCAweDAwLCAweDAwfTsKLQotLy8gU2hvcnQgQnJvd3NlIFBhY2tldAotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfYnJvd3NlX3BhY2tldCA9IHsweDcxLCAweDAwLCAweDBhfTsKLQotLy8gU2hvcnQgR2V0IEZvbGRlciBJdGVtcyBSZXF1ZXN0IFBhY2tldAotc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0ID0gezB4NzEsIDB4MDAsIDB4MDB9OwotCi0vLyBTaG9ydCBHZXQgVG90YWwgTnVtYmVyIG9mIEl0ZW1zIFJlcXVlc3QgUGFja2V0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3QgPSB7MHg3NSwgMHgwMCwgMHgwMH07Ci0KLS8vIFNob3J0IENoYW5nZSBQYXRoIFJlcXVlc3QgUGFja2V0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9jaGFuZ2VfcGF0aF9yZXF1ZXN0ID0gezB4NzIsIDB4MDAsIDB4MDB9OwotCi0vLyBTaG9ydCBHZXQgSXRlbSBBdHRyaWJ1dGVzIFJlcXVlc3QgUGFja2V0Ci1zdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9nZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3QgPSB7MHg3MywgMHgwMCwgMHgwMH07Ci0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL2NoYW5nZV9wYXRoX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2NoYW5nZV9wYXRoX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTRkNTc3Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9jaGFuZ2VfcGF0aF9wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJjaGFuZ2VfcGF0aC5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RDaGFuZ2VQYXRoUmVxUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8Q2hhbmdlUGF0aFJlcXVlc3Q+OwotCi1URVNUKENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXJUZXN0LCBidWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLCAyKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgY2hhbmdlX3BhdGhfcmVzcG9uc2Uuc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdENoYW5nZVBhdGhSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGNoYW5nZV9wYXRoX3Jlc3BvbnNlKTsKLX0KLQotVEVTVChDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlckVycm9yU3RhdHVzVGVzdCkgewotICAvLyBOT1RFOiBUaGUgbnVtIGl0ZW1zIGluIGZvbGRlciBmaWVsZCBkb2Vzbid0IG1hdHRlciB3aGVuIHRoZSBzdGF0dXMgaXMKLSAgLy8gbm90IE5PX0VSUk9SCi0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6OklOVkFMSURfRElSRUNUSU9OLCAyKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgY2hhbmdlX3BhdGhfZXJyb3JfcmVzcG9uc2Uuc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdENoYW5nZVBhdGhSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGNoYW5nZV9wYXRoX2Vycm9yX3Jlc3BvbnNlKTsKLX0KLQotVEVTVChDaGFuZ2VQYXRoUmVxdWVzdFRlc3QsIGdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RDaGFuZ2VQYXRoUmVxUGFja2V0OjpNYWtlKGNoYW5nZV9wYXRoX3JlcXVlc3QpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0VWlkQ291bnRlcigpLCAweDAwMDB1KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREaXJlY3Rpb24oKSwgRGlyZWN0aW9uOjpET1dOKTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRVaWQoKSwgMHgwMDAwMDAwMDAwMDAwMDAydSk7Ci19Ci0KLVRFU1QoQ2hhbmdlUGF0aFJlcXVlc3RUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RDaGFuZ2VQYXRoUmVxUGFja2V0OjpNYWtlKGNoYW5nZV9wYXRoX3JlcXVlc3QpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotVEVTVChDaGFuZ2VQYXRoUmVxdWVzdFRlc3QsIGludmFsaWRUZXN0KSB7Ci0gIGF1dG8gcGFja2V0X2NvcHkgPSBjaGFuZ2VfcGF0aF9yZXF1ZXN0OwotICBwYWNrZXRfY29weS5wdXNoX2JhY2soMHgwMCk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0Q2hhbmdlUGF0aFJlcVBhY2tldDo6TWFrZShwYWNrZXRfY29weSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9wYWNrZXQgPSB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNH07Ci0gIHRlc3RfcGFja2V0ID0gVGVzdENoYW5nZVBhdGhSZXFQYWNrZXQ6Ok1ha2Uoc2hvcnRfcGFja2V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKENoYW5nZVBhdGhSZXF1ZXN0QnVpbGRlciwgYnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gQ2hhbmdlUGF0aFJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcigwLCBEaXJlY3Rpb246OkRPV04sIDIpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBjaGFuZ2VfcGF0aF9yZXF1ZXN0LnNpemUoKSk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RDaGFuZ2VQYXRoUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBjaGFuZ2VfcGF0aF9yZXF1ZXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2dlbmVyYWxfcmVqZWN0X3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDczZGJhLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9nZW5lcmFsX3JlamVjdF9wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiZ2VuZXJhbF9yZWplY3RfcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEdlbmVyYWxSZWplY3RQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxCcm93c2VQYWNrZXQ+OwotCi1URVNUKEdlbmVyYWxSZWplY3RQYWNrZXRCdWlsZGVyVGVzdCwgYnVpbGRQYWNrZXRUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdlbmVyYWxSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6OklOVkFMSURfQ09NTUFORCk7Ci0KLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgZ2VuZXJhbF9yZWplY3RfaW52YWxpZF9jb21tYW5kX3BhY2tldC5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2VuZXJhbFJlamVjdFBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2VuZXJhbF9yZWplY3RfaW52YWxpZF9jb21tYW5kX3BhY2tldCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL2dldF9jYXBhYmlsaXRpZXNfcGFja2V0X3Rlc3QuY2MgYi9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X2NhcGFiaWxpdGllc19wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3YzYyYi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X2NhcGFiaWxpdGllc19wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImNhcGFiaWxpdGllc19wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBHZXRDYXBSZXF1ZXN0VGVzdFBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPEdldENhcGFiaWxpdGllc1JlcXVlc3Q+OwotCi0vLyBUZXN0IHBhcnNpbmcgYSBHZXRDYXBhYmlsaXRpZXMgUmVxdWVzdAotVEVTVChHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0UGFja2V0VGVzdCwgZ2V0dGVyVGVzdCkgewotICBhdXRvIHRlc3RfcGFja2V0ID0gR2V0Q2FwUmVxdWVzdFRlc3RQYWNrZXQ6Ok1ha2UoZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0KTsKLQotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldENhcGFiaWxpdHlSZXF1ZXN0ZWQoKSwKLSAgICAgICAgICAgIENhcGFiaWxpdHk6OkVWRU5UU19TVVBQT1JURUQpOwotfQotCi1URVNUKEdldENhcGFiaWxpdGllc1JlcXVlc3RQYWNrZXRUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IEdldENhcFJlcXVlc3RUZXN0UGFja2V0OjpNYWtlKGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCk7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKEdldENhcGFiaWxpdGllc1JlcXVlc3RQYWNrZXRUZXN0LCBpbnZhbGlkVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfY29weSA9IGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdDsKLSAgcGFja2V0X2NvcHkucHVzaF9iYWNrKDB4MDApOwotICBhdXRvIHRlc3RfcGFja2V0ID0gR2V0Q2FwUmVxdWVzdFRlc3RQYWNrZXQ6Ok1ha2UocGFja2V0X2NvcHkpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfcGFja2V0ID0gewotICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwKLSAgfTsKLSAgdGVzdF9wYWNrZXQgPSBHZXRDYXBSZXF1ZXN0VGVzdFBhY2tldDo6TWFrZShzaG9ydF9wYWNrZXQpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCB0aGUgbGVuZ3RoIHJldHVybmVkIGJ5IHRoZSBidWlsZGVyIGdyb3dzIGNvcnJlY3RseWFzIGZpZWxkcyBhcmUKLS8vIGFkZGVkCi1URVNUKEdldENhcGFiaWxpdHlSZXNwb25zZUJ1aWxkZXIsIGJ1aWxkZXJMZW5ndGhUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUNvbXBhbnlJZEJ1aWxkZXIoMHgwMDAwMDApOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAxNXUpOwotICBidWlsZGVyLT5BZGRDb21wYW55SWQoMHgwMDAwMDEpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAxOHUpOwotICBidWlsZGVyLT5BZGRDb21wYW55SWQoMHgwMDAwMDIpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAyMXUpOwotCi0gIGJ1aWxkZXIgPSBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VFdmVudHNTdXBwb3J0ZWRCdWlsZGVyKAotICAgICAgRXZlbnQ6OlBMQVlCQUNLX1NUQVRVU19DSEFOR0VEKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgMTN1KTsKLSAgYnVpbGRlci0+QWRkRXZlbnQoRXZlbnQ6OlRSQUNLX0NIQU5HRUQpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAxNHUpOwotICBidWlsZGVyLT5BZGRFdmVudChFdmVudDo6UExBWUJBQ0tfUE9TX0NIQU5HRUQpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAxNXUpOwotfQotCi0vLyBDaGVjayB0byBzZWUgdGhhdCBhZGRpbmcgdGhlIHNhbWUgdmFsdWUgbXVsdGlwbGUgdGltZXMgZG9lcyBub3RoaW5nCi1URVNUKEdldENhcGFiaWxpdHlSZXNwb25zZUJ1aWxkZXIsIGR1cGxpY2F0ZUFkZFRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQ29tcGFueUlkQnVpbGRlcigweDAwMDAwMCk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIDE1dSk7Ci0gIGJ1aWxkZXItPkFkZENvbXBhbnlJZCgweDAwMDAwMCk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIDE1dSk7Ci0KLSAgYnVpbGRlciA9IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUV2ZW50c1N1cHBvcnRlZEJ1aWxkZXIoCi0gICAgICBFdmVudDo6UExBWUJBQ0tfU1RBVFVTX0NIQU5HRUQpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAxM3UpOwotICBidWlsZGVyLT5BZGRFdmVudChFdmVudDo6UExBWUJBQ0tfU1RBVFVTX0NIQU5HRUQpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCAxM3UpOwotfQotCi0vLyBUZXN0IHRoYXQgdHJ5aW5nIHRvIHRvIGFkZCB0aGUgd3JvbmcgdHlwZSBvZiBmaWVsZCB0byBhIGJ1aWxkZXIgY2F1c2VzIGRlYXRoCi1URVNUKEdldENhcGFiaWxpdHlSZXNwb25zZUJ1aWxkZXIsIG1pc21hdGNoQWRkRGVhdGhUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUNvbXBhbnlJZEJ1aWxkZXIoMHgwMDAwMDApOwotICBBU1NFUlRfREVBVEgoYnVpbGRlci0+QWRkRXZlbnQoRXZlbnQ6OlBMQVlCQUNLX1NUQVRVU19DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICJjYXBhYmlsaXR5XyA9PSBDYXBhYmlsaXR5OjpFVkVOVFNfU1VQUE9SVEVEIik7Ci0KLSAgYnVpbGRlciA9IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUV2ZW50c1N1cHBvcnRlZEJ1aWxkZXIoCi0gICAgICBFdmVudDo6UExBWUJBQ0tfU1RBVFVTX0NIQU5HRUQpOwotICBBU1NFUlRfREVBVEgoYnVpbGRlci0+QWRkQ29tcGFueUlkKDB4MDAwMDAwKSwKLSAgICAgICAgICAgICAgICJjYXBhYmlsaXR5XyA9PSBDYXBhYmlsaXR5OjpDT01QQU5ZX0lEIik7Ci19Ci0KLS8vIFRlc3QgYnVpbGRpbmcgYSBHZXRDYXBhYmlsaXRpZXMgUmVzcG9uc2UgdG8gYSBDb21wYW55IElEIHJlcXVlc3QKLVRFU1QoR2V0Q2FwYWJpbGl0eVJlc3BvbnNlQnVpbGRlciwgY29tYW55SWRCdWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VDb21wYW55SWRCdWlsZGVyKDB4MDAyMzQ1KTsKLSAgYnVpbGRlci0+QWRkQ29tcGFueUlkKEJMVUVUT09USF9DT01QQU5ZX0lEKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gR2V0Q2FwUmVxdWVzdFRlc3RQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGdldF9jYXBhYmlsaXRpZXNfcmVzcG9uc2VfY29tcGFueV9pZCk7Ci19Ci0KLS8vIFRlc3QgYnVpbGRpbmcgYSBHZXRDYXBhYmlsaXRpZXMgUmVzcG9uc2UgdG8gYW4gRXZlbnRzIFN1cHBvcnRlZCByZXF1ZXN0Ci1URVNUKEdldENhcGFiaWxpdHlSZXNwb25zZUJ1aWxkZXIsIGV2ZW50c1N1cHBvcnRlZEJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUV2ZW50c1N1cHBvcnRlZEJ1aWxkZXIoCi0gICAgICBFdmVudDo6UExBWUJBQ0tfU1RBVFVTX0NIQU5HRUQpOwotICBidWlsZGVyLT5BZGRFdmVudChFdmVudDo6VFJBQ0tfQ0hBTkdFRCk7Ci0gIGJ1aWxkZXItPkFkZEV2ZW50KEV2ZW50OjpQTEFZQkFDS19QT1NfQ0hBTkdFRCk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IEdldENhcFJlcXVlc3RUZXN0UGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlX2V2ZW50c19zdXBwb3J0ZWQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19wYWNrZXRfdGVzdC5jYyBiL3BhY2tldC90ZXN0cy9hdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA1NDg3Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxHZXRFbGVtZW50QXR0cmlidXRlc1JlcXVlc3Q+OwotCi1URVNUKEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdFBhY2tldFRlc3QsIGdldHRlclRlc3QpIHsKLSAgLy8gT25seSBUaXRsZSBpcyByZXF1ZXN0ZWQKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQ6Ok1ha2UoZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BhcnRpYWwpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0SWRlbnRpZmllcigpLCAwdSk7Ci0KLSAgYXV0byBhdHRyaWJ1dGVfbGlzdCA9IHRlc3RfcGFja2V0LT5HZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCk7Ci0gIEFTU0VSVF9FUShhdHRyaWJ1dGVfbGlzdC5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKGF0dHJpYnV0ZV9saXN0WzBdLCBBdHRyaWJ1dGU6OlRJVExFKTsKLQotICAvLyBUaXRsZSwgQXJ0aXN0LCBBbGJ1bSwgTWVkaWEgTnVtZXIsIFBsYXlpbmcgVGltZSwgVG90YWwgTnVtYmVyIG9mIE1lZGlhLAotICAvLyBhbmQgR2VucmUgcmVxdWVzdGVkCi0gIHRlc3RfcGFja2V0ID0KLSAgICAgIFRlc3RHZXRFbGVtQXR0clJlcVBhY2tldDo6TWFrZShnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfZnVsbCk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRJZGVudGlmaWVyKCksIDB1KTsKLQotICBhdHRyaWJ1dGVfbGlzdCA9IHRlc3RfcGFja2V0LT5HZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCk7Ci0gIEFTU0VSVF9FUShhdHRyaWJ1dGVfbGlzdC5zaXplKCksIDd1KTsKLSAgQVNTRVJUX0VRKGF0dHJpYnV0ZV9saXN0WzBdLCBBdHRyaWJ1dGU6OlRJVExFKTsKLSAgQVNTRVJUX0VRKGF0dHJpYnV0ZV9saXN0WzFdLCBBdHRyaWJ1dGU6OkFSVElTVF9OQU1FKTsKLSAgQVNTRVJUX0VRKGF0dHJpYnV0ZV9saXN0WzJdLCBBdHRyaWJ1dGU6OkFMQlVNX05BTUUpOwotICBBU1NFUlRfRVEoYXR0cmlidXRlX2xpc3RbM10sIEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSKTsKLSAgQVNTRVJUX0VRKGF0dHJpYnV0ZV9saXN0WzRdLCBBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSk7Ci0gIEFTU0VSVF9FUShhdHRyaWJ1dGVfbGlzdFs1XSwgQXR0cmlidXRlOjpUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTKTsKLSAgQVNTRVJUX0VRKGF0dHJpYnV0ZV9saXN0WzZdLCBBdHRyaWJ1dGU6OkdFTlJFKTsKLX0KLQotVEVTVChHZXRFbGVtZW50QXR0cmlidXRlc1JlcXVlc3RQYWNrZXRUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQ6Ok1ha2UoZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BhcnRpYWwpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQ6Ok1ha2UoZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotVEVTVChHZXRFbGVtZW50QXR0cmlidXRlc1JlcXVlc3RQYWNrZXRUZXN0LCBpbnZhbGlkVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfY29weSA9IGdldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxdWVzdF9wYXJ0aWFsOwotICBwYWNrZXRfY29weS5wdXNoX2JhY2soMHgwMCk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQ6Ok1ha2UocGFja2V0X2NvcHkpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfcGFja2V0ID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgdGVzdF9wYWNrZXQgPSBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQ6Ok1ha2Uoc2hvcnRfcGFja2V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlckxlbmd0aFRlc3QpIHsKLSAgLy8gQXR0cmlidXRlcyBoYXZlIGEgc2l6ZSBvZiA4ICsgc3RyaW5nIGxlbmd0aAotICBhdXRvIGJ1aWxkZXIgPSBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoMHhGRkZGKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgMTF1KTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgInRlc3QiKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgMjN1KTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgInRlc3QiKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgMzV1KTsKLX0KLQotVEVTVChHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlclRlc3QsIGJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigweEZGRkYpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiVGVzdCBTb25nIik7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIik7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSLCAiMSIpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIik7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6R0VOUkUsICJUZXN0IEdlbnJlIik7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6UExBWUlOR19USU1FLCAiMTAwMCIpOwotCi0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGdldF9lbGVtZW50c19hdHRyaWJ1dGVzX3Jlc3BvbnNlX2Z1bGwuc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEVsZW1BdHRyUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfZWxlbWVudHNfYXR0cmlidXRlc19yZXNwb25zZV9mdWxsKTsKLX0KLQotVEVTVChHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlclRlc3QsIHRydW5jYXRlQnVpbGRlclRlc3QpIHsKLSAgYXV0byBhdHRyaWJ1dGUgPSBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiMTIzNCIpOwotICBzaXplX3QgdHJ1bmNhdGVkX3NpemUgPSBWZW5kb3JQYWNrZXQ6OmtNaW5TaXplKCk7Ci0gIHRydW5jYXRlZF9zaXplICs9IDE7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYXR0cmlidXRlcwotICB0cnVuY2F0ZWRfc2l6ZSArPSBhdHRyaWJ1dGUuc2l6ZSgpOyAgLy8gQXR0cmlidXRlIHNpemUKLQotICBhdXRvIHRydW5jYXRlZF9idWlsZGVyID0KLSAgICAgIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcih0cnVuY2F0ZWRfc2l6ZSk7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgdHJ1bmNhdGVkX2J1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICIxMjM0dHJ1bmNhdGVkIikpOwotICBBU1NFUlRfRVEodHJ1bmNhdGVkX2J1aWxkZXItPnNpemUoKSwgdHJ1bmNhdGVkX3NpemUpOwotCi0gIEFTU0VSVF9GQUxTRSh0cnVuY2F0ZWRfYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBhZGQiKSk7Ci0KLSAgYXV0byB0cnVuY2F0ZWRfcGFja2V0ID0gVGVzdEdldEVsZW1BdHRyUmVxUGFja2V0OjpNYWtlKCk7Ci0gIHRydW5jYXRlZF9idWlsZGVyLT5TZXJpYWxpemUodHJ1bmNhdGVkX3BhY2tldCk7Ci0KLSAgYXV0byBidWlsZGVyID0gR2V0RWxlbWVudEF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4RkZGRik7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KGF0dHJpYnV0ZSk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0RWxlbUF0dHJSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLQotICBBU1NFUlRfRVEodHJ1bmNhdGVkX3BhY2tldC0+R2V0RGF0YSgpLCB0ZXN0X3BhY2tldC0+R2V0RGF0YSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL2dldF9mb2xkZXJfaXRlbXNfcGFja2V0X3Rlc3QuY2MgYi9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X2ZvbGRlcl9pdGVtc19wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyZDczMy4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X2ZvbGRlcl9pdGVtc19wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImdldF9mb2xkZXJfaXRlbXMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxHZXRGb2xkZXJJdGVtc1JlcXVlc3Q+OwotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlck1lZGlhUGxheWVyU2l6ZVRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zLCB0aGVuIHRoZSBvbmx5IGRhdGEgaW4gdGhlIHBhY2tldCBpcyB0aGUgc3RhdHVzCi0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGdldF9mb2xkZXJfaXRlbXNfZXJyb3JfcmVzcG9uc2Uuc2l6ZSgpKTsKLQotICBhdXRvIHBsYXllciA9IE1lZGlhUGxheWVySXRlbSgweDAwMDEsICJjb20uZ29vZ2xlLmFuZHJvaWQubXVzaWMiLCB0cnVlKTsKLSAgYnVpbGRlci0+QWRkTWVkaWFQbGF5ZXIocGxheWVyKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgZ2V0X2ZvbGRlcl9pdGVtc19tZWRpYV9wbGF5ZXJfcmVzcG9uc2Uuc2l6ZSgpKTsKLX0KLQotVEVTVChHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlclRlc3QsIGJ1aWxkZXJNZWRpYVBsYXllckFkZFRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgYXV0byBwbGF5ZXIgPSBNZWRpYVBsYXllckl0ZW0oMHgwMDAxLCAiY29tLmdvb2dsZS5hbmRyb2lkLm11c2ljIiwgdHJ1ZSk7Ci0gIGJ1aWxkZXItPkFkZE1lZGlhUGxheWVyKHBsYXllcik7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRGb2xkZXJJdGVtc1JlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2V0X2ZvbGRlcl9pdGVtc19tZWRpYV9wbGF5ZXJfcmVzcG9uc2UpOwotfQotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlclBsYXllckFkZE10dVRlc3QpIHsKLSAgTWVkaWFQbGF5ZXJJdGVtIHBsYXllcjEoMSwgIlBsYXllciAxIHRoYXQgZml0cyIsIHRydWUpOwotICBNZWRpYVBsYXllckl0ZW0gcGxheWVyMigyLCAiUGxheWVyIDIgdGhhdCBkb2Vzbid0IGZpdCIsIHRydWUpOwotICBNZWRpYVBsYXllckl0ZW0gcGxheWVyMygzLCAiUGxheWVyIDMgdGhhdCBmaXRzIiwgdHJ1ZSk7Ci0KLSAgLy8gQnJvd3NpbmcgSGVhZGVyICsgU3RhdHVzIGZpZWxkICsgVUlEIENvdW50ZXIgZmllbGQgKyBOdW1iZXIgb2YgSXRlbXMgZmllbGQKLSAgYXV0byBwYWNrZXRfc2l6ZSA9IEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIDU7Ci0gIHBhY2tldF9zaXplICs9IHBsYXllcjEuc2l6ZSgpICsgcGxheWVyMy5zaXplKCk7Ci0KLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgcGFja2V0X3NpemUpOwotCi0gIEFTU0VSVF9UUlVFKGJ1aWxkZXItPkFkZE1lZGlhUGxheWVyKHBsYXllcjEpKTsKLSAgQVNTRVJUX0ZBTFNFKGJ1aWxkZXItPkFkZE1lZGlhUGxheWVyKHBsYXllcjIpKTsKLSAgQVNTRVJUX1RSVUUoYnVpbGRlci0+QWRkTWVkaWFQbGF5ZXIocGxheWVyMykpOwotfQotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlckZvbGRlclNpemVUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlVkZTQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfZm9sZGVyX2l0ZW1zX2Vycm9yX3Jlc3BvbnNlLnNpemUoKSk7Ci0KLSAgYXV0byBmb2xkZXIgPSBGb2xkZXJJdGVtKDB4MDAwMDAwMDAwMDAwMDAwMSwgMHgwMCwgdHJ1ZSwgIlRlc3QgRm9sZGVyIik7Ci0gIGJ1aWxkZXItPkFkZEZvbGRlcihmb2xkZXIpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfZm9sZGVyX2l0ZW1zX2ZvbGRlcl9yZXNwb25zZS5zaXplKCkpOwotfQotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlckZvbGRlckFkZFRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VWRlNCdWlsZGVyKFN0YXR1czo6Tk9fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRik7Ci0gIGF1dG8gZm9sZGVyID0gRm9sZGVySXRlbSgweDAwMDAwMDAwMDAwMDAwMDEsIDB4MDAsIHRydWUsICJUZXN0IEZvbGRlciIpOwotICBidWlsZGVyLT5BZGRGb2xkZXIoZm9sZGVyKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEZvbGRlckl0ZW1zUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfZm9sZGVyX2l0ZW1zX2ZvbGRlcl9yZXNwb25zZSk7Ci19Ci0KLVRFU1QoR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXJUZXN0LCBidWlsZGVyRm9sZGVyQWRkTXR1VGVzdCkgewotICBGb2xkZXJJdGVtIGZvbGRlcjEoMHgwMSwgMHgwMCwgdHJ1ZSwgIkZvbGRlciAxIHRoYXQgZml0cyIpOwotICBGb2xkZXJJdGVtIGZvbGRlcjIoMHgwMiwgMHgwMCwgdHJ1ZSwgIkZvbGRlciAyIHRoYXQgZG9lc24ndCBmaXQiKTsKLSAgRm9sZGVySXRlbSBmb2xkZXIzKDB4MDMsIDB4MDAsIHRydWUsICJGb2xkZXIgMyB0aGF0IGZpdHMiKTsKLQotICAvLyBCcm93c2luZyBIZWFkZXIgKyBTdGF0dXMgZmllbGQgKyBVSUQgQ291bnRlciBmaWVsZCArIE51bWJlciBvZiBJdGVtcyBmaWVsZAotICBhdXRvIHBhY2tldF9zaXplID0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpICsgNTsKLSAgcGFja2V0X3NpemUgKz0gZm9sZGVyMS5zaXplKCkgKyBmb2xkZXIzLnNpemUoKTsKLQotICBhdXRvIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVZGU0J1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIHBhY2tldF9zaXplKTsKLQotICBBU1NFUlRfVFJVRShidWlsZGVyLT5BZGRGb2xkZXIoZm9sZGVyMSkpOwotICBBU1NFUlRfRkFMU0UoYnVpbGRlci0+QWRkRm9sZGVyKGZvbGRlcjIpKTsKLSAgQVNTRVJUX1RSVUUoYnVpbGRlci0+QWRkRm9sZGVyKGZvbGRlcjMpKTsKLX0KLQotVEVTVChHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlclRlc3QsIGJ1aWxkZXJTb25nU2l6ZVRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgZ2V0X2ZvbGRlcl9pdGVtc19lcnJvcl9yZXNwb25zZS5zaXplKCkpOwotCi0gIHN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PiBhdHRyaWJ1dGVzOwotICBhdHRyaWJ1dGVzLmluc2VydChBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiVGVzdCBUaXRsZSIpKTsKLSAgYXV0byBzb25nID0gTWVkaWFFbGVtZW50SXRlbSgweDAyLCAiVGVzdCBUaXRsZSIsIGF0dHJpYnV0ZXMpOwotICBidWlsZGVyLT5BZGRTb25nKHNvbmcpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3NvbmdfcmVzcG9uc2Uuc2l6ZSgpKTsKLX0KLQotVEVTVChHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlclRlc3QsIGJ1aWxkZXJTb25nQWRkVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZU5vd1BsYXlpbmdCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCAweEZGRkYpOwotICBzdGQ6OnNldDxBdHRyaWJ1dGVFbnRyeT4gYXR0cmlidXRlczsKLSAgYXR0cmlidXRlcy5pbnNlcnQoQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgVGl0bGUiKSk7Ci0gIGF1dG8gc29uZyA9IE1lZGlhRWxlbWVudEl0ZW0oMHgwMiwgIlRlc3QgVGl0bGUiLCBhdHRyaWJ1dGVzKTsKLSAgYnVpbGRlci0+QWRkU29uZyhzb25nKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEZvbGRlckl0ZW1zUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3NvbmdfcmVzcG9uc2UpOwotfQotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlclNvbmdBZGRNdHVUZXN0KSB7Ci0gIE1lZGlhRWxlbWVudEl0ZW0gc29uZzEoMHgwMSwgIlNvbmcgMSB0aGF0IGZpdHMiLCBzdGQ6OnNldDxBdHRyaWJ1dGVFbnRyeT4oKSk7Ci0gIE1lZGlhRWxlbWVudEl0ZW0gc29uZzIoMHgwMiwgIlNvbmcgMiB0aGF0IGRvZXNuJ3QgZml0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxBdHRyaWJ1dGVFbnRyeT4oKSk7Ci0gIE1lZGlhRWxlbWVudEl0ZW0gc29uZzMoMHgwMywgIlNvbmcgMyB0aGF0IGZpdHMiLCBzdGQ6OnNldDxBdHRyaWJ1dGVFbnRyeT4oKSk7Ci0KLSAgYXV0byBwYWNrZXRfc2l6ZSA9IEJyb3dzZVBhY2tldDo6a01pblNpemUoKSArIDU7Ci0gIHBhY2tldF9zaXplICs9IHNvbmcxLnNpemUoKSArIHNvbmczLnNpemUoKTsKLQotICBhdXRvIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZU5vd1BsYXlpbmdCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCBwYWNrZXRfc2l6ZSk7Ci0KLSAgQVNTRVJUX1RSVUUoYnVpbGRlci0+QWRkU29uZyhzb25nMSkpOwotICBBU1NFUlRfRkFMU0UoYnVpbGRlci0+QWRkU29uZyhzb25nMikpOwotICBBU1NFUlRfVFJVRShidWlsZGVyLT5BZGRTb25nKHNvbmczKSk7Ci19Ci0KLVRFU1QoR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXJUZXN0LCBidWlsZGVyTm9JdGVtc1Rlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRGb2xkZXJJdGVtc1JlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2V0X2ZvbGRlcl9pdGVtc19lcnJvcl9yZXNwb25zZSk7Ci0KLSAgYnVpbGRlciA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlVkZTQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGKTsKLSAgdGVzdF9wYWNrZXQgPSBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGdldF9mb2xkZXJfaXRlbXNfZXJyb3JfcmVzcG9uc2UpOwotCi0gIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZU5vd1BsYXlpbmdCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCAweEZGRkYpOwotICB0ZXN0X3BhY2tldCA9IFRlc3RHZXRGb2xkZXJJdGVtc1JlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2V0X2ZvbGRlcl9pdGVtc19lcnJvcl9yZXNwb25zZSk7Ci19Ci0KLVRFU1QoR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXJUZXN0LCBidWlsZGVyRXJyb3JTdGF0dXNUZXN0KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9mb2xkZXJfaXRlbXNfaW52X3Njb3BlID0gezB4NzEsIDB4MDAsIDB4MDEsIDB4MGF9OwotCi0gIGF1dG8gYnVpbGRlciA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWVyTGlzdEJ1aWxkZXIoCi0gICAgICBTdGF0dXM6OklOVkFMSURfU0NPUEUsIDB4MDAwMCwgMHhGRkZGKTsKLQotICAvLyBDaGVjayB0aGF0IHRoZSBzdGF0dXMgcmVtYWlucyBJTlZBTElEX1NDT1BFIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSB6ZXJvCi0gIC8vIGl0ZW1zCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGdldF9mb2xkZXJfaXRlbXNfaW52X3Njb3BlKTsKLQotICBhdXRvIHBsYXllciA9IE1lZGlhUGxheWVySXRlbSgweDAwMDEsICJjb20uZ29vZ2xlLmFuZHJvaWQubXVzaWMiLCB0cnVlKTsKLSAgYnVpbGRlci0+QWRkTWVkaWFQbGF5ZXIocGxheWVyKTsKLQotICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCBldmVuIHRob3VnaCB3ZSBhZGRlZCBhbiBpdGVtLCBpdCBkb2Vzbid0IGdldAotICAvLyB3cml0dGVuIHRvIHRoZSBwYWNrZXQKLSAgdGVzdF9wYWNrZXQgPSBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGdldF9mb2xkZXJfaXRlbXNfaW52X3Njb3BlKTsKLX0KLQotVEVTVChHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlclRlc3QsIGJ1aWxkZXJEZWF0aFRlc3QpIHsKLSAgYXV0byBwbGF5ZXIgPSBNZWRpYVBsYXllckl0ZW0oMHgwMDAxLCAiY29tLmdvb2dsZS5hbmRyb2lkLm11c2ljIiwgdHJ1ZSk7Ci0gIGF1dG8gZm9sZGVyID0gRm9sZGVySXRlbSgweDAxLCAweDAwLCB0cnVlLCAidGVzdCBmb2xkZXIiKTsKLSAgYXV0byBzb25nID0gTWVkaWFFbGVtZW50SXRlbSgweDAxLCAidGVzdCBzb25nIiwgc3RkOjpzZXQ8QXR0cmlidXRlRW50cnk+KCkpOwotCi0gIGF1dG8gYnVpbGRlciA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWVyTGlzdEJ1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIEFTU0VSVF9ERUFUSChidWlsZGVyLT5BZGRGb2xkZXIoZm9sZGVyKSwgInNjb3BlXyA9PSBTY29wZTo6VkZTIik7Ci0gIEFTU0VSVF9ERUFUSChidWlsZGVyLT5BZGRTb25nKHNvbmcpLAotICAgICAgICAgICAgICAgInNjb3BlXyA9PSBTY29wZTo6VkZTIFxcfFxcfCBzY29wZV8gPT0gU2NvcGU6Ok5PV19QTEFZSU5HIik7Ci0KLSAgYnVpbGRlciA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlVkZTQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGKTsKLSAgQVNTRVJUX0RFQVRIKGJ1aWxkZXItPkFkZE1lZGlhUGxheWVyKHBsYXllciksCi0gICAgICAgICAgICAgICAic2NvcGVfID09IFNjb3BlOjpNRURJQV9QTEFZRVJfTElTVCIpOwotCi0gIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZU5vd1BsYXlpbmdCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCAweEZGRkYpOwotICBBU1NFUlRfREVBVEgoYnVpbGRlci0+QWRkTWVkaWFQbGF5ZXIocGxheWVyKSwKLSAgICAgICAgICAgICAgICJzY29wZV8gPT0gU2NvcGU6Ok1FRElBX1BMQVlFUl9MSVNUIik7Ci0gIEFTU0VSVF9ERUFUSChidWlsZGVyLT5BZGRGb2xkZXIoZm9sZGVyKSwgInNjb3BlXyA9PSBTY29wZTo6VkZTIik7Ci19Ci0KLVRFU1QoR2V0Rm9sZGVySXRlbXNSZXF1ZXN0VGVzdCwgZ2V0dGVyVGVzdCkgewotICBhdXRvIHRlc3RfcGFja2V0ID0KLSAgICAgIFRlc3RHZXRGb2xkZXJJdGVtc1JlcVBhY2tldDo6TWFrZShnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfdmZzKTsKLQotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldFNjb3BlKCksIFNjb3BlOjpWRlMpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldFN0YXJ0SXRlbSgpLCAweDAwMDAwMDAwdSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RW5kSXRlbSgpLCAweDAwMDAwMDA1dSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0TnVtQXR0cmlidXRlcygpLCAxKTsKLQotICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJpYnV0ZV9saXN0ID0ge0F0dHJpYnV0ZTo6VElUTEV9OwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldEF0dHJpYnV0ZXNSZXF1ZXN0ZWQoKSwgYXR0cmlidXRlX2xpc3QpOwotfQotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVxdWVzdEJ1aWxkZXJUZXN0LCBidWlsZGVyWmVyb0F0dHJzVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPQotICAgICAgR2V0Rm9sZGVySXRlbXNSZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoU2NvcGU6OlZGUywgMCwgOSwge30pOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Rfbm9fYXR0cnMuc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEZvbGRlckl0ZW1zUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Rfbm9fYXR0cnMpOwotfQotCi1URVNUKEdldEZvbGRlckl0ZW1zUmVxdWVzdEJ1aWxkZXJUZXN0LCBidWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihTY29wZTo6VkZTLCAwLCA5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QXR0cmlidXRlOjpUSVRMRX0pOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfdGl0bGUuc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEZvbGRlckl0ZW1zUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfdGl0bGUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X2l0ZW1fYXR0cmlidXRlc19wYWNrZXRfdGVzdC5jYyBiL3BhY2tldC90ZXN0cy9hdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZmNjkxLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9nZXRfaXRlbV9hdHRyaWJ1dGVzX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiZ2V0X2l0ZW1fYXR0cmlidXRlcy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RHZXRJdGVtQXR0cnNSZXFQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxHZXRJdGVtQXR0cmlidXRlc1JlcXVlc3Q+OwotCi1URVNUKEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlclNpemVUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUiwgMHhGRkZGKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgNXUpOwotCi0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgMjJ1KTsKLQotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFSVElTVF9OQU1FLCAiVGVzdCBBcnRpc3QiKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgNDF1KTsKLQotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIik7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGdldF9pdGVtX2F0dHJpYnV0ZXNfc29uZ19yZXNwb25zZS5zaXplKCkpOwotfQotCi1URVNUKEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0KLSAgICAgIEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLCAweEZGRkYpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiVGVzdCBTb25nIik7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIik7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRJdGVtQXR0cnNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGdldF9pdGVtX2F0dHJpYnV0ZXNfc29uZ19yZXNwb25zZSk7Ci19Ci0KLVRFU1QoR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXJUZXN0LCB0cnVuY2F0ZUJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYXR0cmlidXRlID0gQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIjEyMzQiKTsKLSAgc2l6ZV90IHRydW5jYXRlZF9zaXplID0gQnJvd3NlUGFja2V0OjprTWluU2l6ZSgpOwotICB0cnVuY2F0ZWRfc2l6ZSArPSAyOyAgLy8gU3RhdHVzIGZpZWxkICArIE51bWJlciBvZiBhdHRyaWJ1dGVzIGZpZWxkCi0gIHRydW5jYXRlZF9zaXplICs9IGF0dHJpYnV0ZS5zaXplKCk7ICAvLyBBdHRyaWJ1dGUgc2l6ZQotCi0gIGF1dG8gdHJ1bmNhdGVkX2J1aWxkZXIgPSBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCB0cnVuY2F0ZWRfc2l6ZSk7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgdHJ1bmNhdGVkX2J1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICIxMjM0dHJ1bmNhdGVkIikpOwotICBBU1NFUlRfRVEodHJ1bmNhdGVkX2J1aWxkZXItPnNpemUoKSwgdHJ1bmNhdGVkX3NpemUpOwotCi0gIEFTU0VSVF9GQUxTRSh0cnVuY2F0ZWRfYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBhZGQiKSk7Ci0KLSAgYXV0byB0cnVuY2F0ZWRfcGFja2V0ID0gVGVzdEdldEl0ZW1BdHRyc1JlcVBhY2tldDo6TWFrZSgpOwotICB0cnVuY2F0ZWRfYnVpbGRlci0+U2VyaWFsaXplKHRydW5jYXRlZF9wYWNrZXQpOwotCi0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUiwgMHhGRkZGKTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoYXR0cmlidXRlKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRJdGVtQXR0cnNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLQotICBBU1NFUlRfRVEodHJ1bmNhdGVkX3BhY2tldC0+R2V0RGF0YSgpLCB0ZXN0X3BhY2tldC0+R2V0RGF0YSgpKTsKLX0KLQotVEVTVChHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlclRlc3QsIGVycm9yU3RhdHVzVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkb2VzX25vdF9leGlzdF9zdGF0dXMgPSB7MHg3MywgMHgwMCwgMHgwMSwgMHgwOX07Ci0gIGF1dG8gYnVpbGRlciA9IEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6RE9FU19OT1RfRVhJU1QsIDB4RkZGRik7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGRvZXNfbm90X2V4aXN0X3N0YXR1cy5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0SXRlbUF0dHJzUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBkb2VzX25vdF9leGlzdF9zdGF0dXMpOwotfQotCi1URVNUKEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdFRlc3QsIGdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRJdGVtQXR0cnNSZXFQYWNrZXQ6Ok1ha2UoCi0gICAgICBnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3RfYWxsX2F0dHJpYnV0ZXMpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0U2NvcGUoKSwgU2NvcGU6Ok5PV19QTEFZSU5HKTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRVaWRDb3VudGVyKCksIDB4MDAwMHUpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldFVpZCgpLCAweDAwMDAwMDAwMDAwMDAwMDF1KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXROdW1BdHRyaWJ1dGVzKCksIDcpOwotICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJzX3JlcXVlc3RlZCA9IHtBdHRyaWJ1dGU6OlRJVExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkFSVElTVF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkFMQlVNX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6R0VOUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6UExBWUlOR19USU1FfTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCksIGF0dHJzX3JlcXVlc3RlZCk7Ci19Ci0KLVRFU1QoR2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0VGVzdCwgdmFsaWRUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0SXRlbUF0dHJzUmVxUGFja2V0OjpNYWtlKAotICAgICAgZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXF1ZXN0X2FsbF9hdHRyaWJ1dGVzKTsKLSAgQVNTRVJUX1RSVUUodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoR2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0VGVzdCwgaW52YWxpZFRlc3QpIHsKLSAgYXV0byBwYWNrZXRfY29weSA9IGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdF9hbGxfYXR0cmlidXRlczsKLSAgcGFja2V0X2NvcHkucHVzaF9iYWNrKDB4MDApOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEl0ZW1BdHRyc1JlcVBhY2tldDo6TWFrZShwYWNrZXRfY29weSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9wYWNrZXQgPSB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDd9OwotICB0ZXN0X3BhY2tldCA9IFRlc3RHZXRJdGVtQXR0cnNSZXFQYWNrZXQ6Ok1ha2Uoc2hvcnRfcGFja2V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2dldF9wbGF5X3N0YXR1c19wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1MTQ3ZC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJnZXRfcGxheV9zdGF0dXNfcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEdldFBsYXlTdGF0dXNSc3BQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxQYWNrZXQ+OwotCi1URVNUKEdldFBsYXlTdGF0dXNSZXNwb25zZUJ1aWxkZXJUZXN0LCBidWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBHZXRQbGF5U3RhdHVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigwLCAweEZGRkZGRkZGLCAwKTsKLQotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBnZXRfcGxheV9zdGF0dXNfcmVzcG9uc2Uuc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldFBsYXlTdGF0dXNSc3BQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGdldF9wbGF5X3N0YXR1c19yZXNwb25zZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9hdnJjcC9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcGFja2V0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2VmYzIuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2F2cmNwL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcGFja2V0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0R2V0VG90YWxOdW1JdGVtc1JlcVBhY2tldCA9Ci0gICAgVGVzdFBhY2tldFR5cGU8R2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdD47Ci0KLVRFU1QoR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgYnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMHUsIDB4MDAwMDAwMDV1KTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNwb25zZS5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0VG90YWxOdW1JdGVtc1JlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNwb25zZSk7Ci19Ci0KLVRFU1QoR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyVGVzdCwgZXJyb3JTdGF0dXNUZXN0KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGludl9zY29wZV9zdGF0dXNfcGFja2V0ID0gezB4NzUsIDB4MDAsIDB4MDEsIDB4MGF9OwotICBhdXRvIGJ1aWxkZXIgPSBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpJTlZBTElEX1NDT1BFLCAweDEyMzR1LCAweDU2Nzg5YWJjdSk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGludl9zY29wZV9zdGF0dXNfcGFja2V0LnNpemUoKSk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRUb3RhbE51bUl0ZW1zUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBpbnZfc2NvcGVfc3RhdHVzX3BhY2tldCk7Ci19Ci0KLVRFU1QoR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdFRlc3QsIGdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRUb3RhbE51bUl0ZW1zUmVxUGFja2V0OjpNYWtlKAotICAgICAgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nKTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRTY29wZSgpLCBTY29wZTo6Tk9XX1BMQVlJTkcpOwotfQotCi1URVNUKEdldFRvdGFsTnVtYmVyT2ZJdGVtc1JlcXVlc3RUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRUb3RhbE51bUl0ZW1zUmVxUGFja2V0OjpNYWtlKAotICAgICAgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nKTsKLSAgQVNTRVJUX1RSVUUodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVxdWVzdFRlc3QsIGludmFsaWRUZXN0KSB7Ci0gIGF1dG8gcGFja2V0X2NvcHkgPSBnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmc7Ci0gIHBhY2tldF9jb3B5LnB1c2hfYmFjaygweDAwKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRUb3RhbE51bUl0ZW1zUmVxUGFja2V0OjpNYWtlKHBhY2tldF9jb3B5KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X3BhY2tldCA9IHsweDAwLCAweDAxLCAweDAyLCAweDAzfTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3AvcGFzc190aHJvdWdoX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL3Bhc3NfdGhyb3VnaF9wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhNzQ5Zi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3AvcGFzc190aHJvdWdoX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLSNpbmNsdWRlICJwYXNzX3Rocm91Z2hfcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdFBhc3NUaHJvdWdoUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFzc1Rocm91Z2hQYWNrZXQ+OwotCi1URVNUKFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlclRlc3QsIGJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoZmFsc2UsIHRydWUsIDB4NDQpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3B1c2hlZC5zaXplKCkpOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFBhc3NUaHJvdWdoUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3B1c2hlZCk7Ci0KLSAgYnVpbGRlciA9IFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcjo6TWFrZUJ1aWxkZXIodHJ1ZSwgZmFsc2UsIDB4NDQpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3JlbGVhc2VkLnNpemUoKSk7Ci0gIHRlc3RfcGFja2V0ID0gVGVzdFBhc3NUaHJvdWdoUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3JlbGVhc2VkKTsKLX0KLQotVEVTVChQYXNzVGhyb3VnaFBhY2tldFRlc3QsIGdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0UGFzc1Rocm91Z2hQYWNrZXQ6Ok1ha2UocGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldEtleVN0YXRlKCksIEtleVN0YXRlOjpQVVNIRUQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldE9wZXJhdGlvbklkKCksIDB4NDQpOwotCi0gIHRlc3RfcGFja2V0ID0gVGVzdFBhc3NUaHJvdWdoUGFja2V0OjpNYWtlKHBhc3NfdGhyb3VnaF9jb21tYW5kX3BsYXlfcmVsZWFzZWQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldEtleVN0YXRlKCksIEtleVN0YXRlOjpSRUxFQVNFRCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0T3BlcmF0aW9uSWQoKSwgMHg0NCk7Ci19Ci0KLVRFU1QoUGFzc1Rocm91Z2hQYWNrZXRUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0UGFzc1Rocm91Z2hQYWNrZXQ6Ok1ha2UocGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICB0ZXN0X3BhY2tldCA9IFRlc3RQYXNzVGhyb3VnaFBhY2tldDo6TWFrZShwYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3JlbGVhc2VkKTsKLSAgQVNTRVJUX1RSVUUodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoUGFzc1Rocm91Z2hQYWNrZXRUZXN0LCBpbnZhbGlkVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfY29weSA9IHBhc3NfdGhyb3VnaF9jb21tYW5kX3BsYXlfcHVzaGVkOwotICBwYWNrZXRfY29weS5wdXNoX2JhY2soMHgwMCk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0UGFzc1Rocm91Z2hQYWNrZXQ6Ok1ha2UocGFja2V0X2NvcHkpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfcGFja2V0ID0gezAsIDEsIDIsIDMsIDQsIDV9OwotICB0ZXN0X3BhY2tldCA9IFRlc3RQYXNzVGhyb3VnaFBhY2tldDo6TWFrZShzaG9ydF9wYWNrZXQpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9hdnJjcC9wbGF5X2l0ZW1fcGFja2V0X3Rlc3QuY2MgYi9wYWNrZXQvdGVzdHMvYXZyY3AvcGxheV9pdGVtX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU0OGFhLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9wbGF5X2l0ZW1fcGFja2V0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotI2luY2x1ZGUgInBsYXlfaXRlbS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RQbGF5SXRlbVJlcVBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFBsYXlJdGVtUmVxdWVzdD47Ci0KLVRFU1QoUGxheUl0ZW1SZXNwb25zZUJ1aWxkZXJUZXN0LCBidWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBQbGF5SXRlbVJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUik7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIHBsYXlfaXRlbV9yZXNwb25zZS5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0UGxheUl0ZW1SZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIHBsYXlfaXRlbV9yZXNwb25zZSk7Ci19Ci0KLVRFU1QoUGxheUl0ZW1SZXNwb25zZVRlc3QsIGdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RQbGF5SXRlbVJlcVBhY2tldDo6TWFrZShwbGF5X2l0ZW1fcmVxdWVzdCk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRTY29wZSgpLCBTY29wZTo6Tk9XX1BMQVlJTkcpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldFVpZCgpLCAweDAwMDAwMDAwMDAwMDAwMDN1KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRVaWRDb3VudGVyKCksIDB4MDAwMHUpOwotfQotCi1URVNUKFBsYXlJdGVtUmVzcG9uc2VUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RQbGF5SXRlbVJlcVBhY2tldDo6TWFrZShwbGF5X2l0ZW1fcmVxdWVzdCk7Ci0KLSAgQVNTRVJUX1RSVUUodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoUGxheUl0ZW1SZXNwb25zZVRlc3QsIGludmFsaWRUZXN0KSB7Ci0gIGF1dG8gcGFja2V0X2NvcHkgPSBwbGF5X2l0ZW1fcmVxdWVzdDsKLSAgcGFja2V0X2NvcHkucHVzaF9iYWNrKDB4MDApOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFBsYXlJdGVtUmVxUGFja2V0OjpNYWtlKHBhY2tldF9jb3B5KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X3BhY2tldCA9IHsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0fTsKLSAgdGVzdF9wYWNrZXQgPSBUZXN0UGxheUl0ZW1SZXFQYWNrZXQ6Ok1ha2Uoc2hvcnRfcGFja2V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9hdnJjcC9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcGFja2V0X3Rlc3QuY2MgYi9wYWNrZXQvdGVzdHMvYXZyY3AvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmMwOTUxLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcGFja2V0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLSNpbmNsdWRlICJyZWdpc3Rlcl9ub3RpZmljYXRpb25fcGFja2V0LmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdFJlZ05vdGlmUmVxUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0PjsKLXVzaW5nIFRlc3RSZWdOb3RpZlJzcFBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2U+OwotCi1URVNUKFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdFRlc3QsIGdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0UmVnTm90aWZSZXFQYWNrZXQ6Ok1ha2UocmVnaXN0ZXJfcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uKTsKLQotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldEV2ZW50UmVnaXN0ZXJlZCgpLCBFdmVudDo6UExBWUJBQ0tfU1RBVFVTX0NIQU5HRUQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldEludGVydmFsKCksIDV1KTsKLX0KLQotVEVTVChSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RUZXN0LCB2YWxpZFRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0UmVnTm90aWZSZXFQYWNrZXQ6Ok1ha2UocmVnaXN0ZXJfcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uKTsKLSAgQVNTRVJUX1RSVUUodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0VGVzdCwgaW52YWxpZFRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0X2NvcHkgPSByZWdpc3Rlcl9wbGF5X3N0YXR1c19ub3RpZmljYXRpb247Ci0gIHBhY2tldF9jb3B5LnB1c2hfYmFjaygweDAwKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RSZWdOb3RpZlJlcVBhY2tldDo6TWFrZShwYWNrZXRfY29weSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9wYWNrZXQgPSB7MCwgMSwgMiwgMywgNH07Ci0gIHRlc3RfcGFja2V0ID0gVGVzdFJlZ05vdGlmUmVxUGFja2V0OjpNYWtlKHNob3J0X3BhY2tldCk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotVEVTVChSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyVGVzdCwgYnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKEV2ZW50OjpWT0xVTUVfQ0hBTkdFRCwgMCk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIHJlZ2lzdGVyX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbi5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0UmVnTm90aWZSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIHJlZ2lzdGVyX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbik7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZVRlc3QsIHZvbHVtZUdldHRlclRlc3QpIHsKLSAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICBUZXN0UmVnTm90aWZSc3BQYWNrZXQ6Ok1ha2UoaW50ZXJpbV92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24pOwotCi0gIEFTU0VSVF9UUlVFKHRlc3RfcGFja2V0LT5Jc0ludGVyaW0oKSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RXZlbnQoKSwgRXZlbnQ6OlZPTFVNRV9DSEFOR0VEKTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRWb2x1bWUoKSwgMHg0Nyk7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZVRlc3QsIHZhbGlkVGVzdCkgewotICBhdXRvIHRlc3RfcGFja2V0ID0KLSAgICAgIFRlc3RSZWdOb3RpZlJzcFBhY2tldDo6TWFrZShpbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbik7Ci0KLSAgQVNTRVJUX1RSVUUodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZVRlc3QsIGludmFsaWRUZXN0KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tldF9jb3B5ID0gaW50ZXJpbV92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb247Ci0gIHBhY2tldF9jb3B5LnB1c2hfYmFjaygweDAwKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RSZWdOb3RpZlJzcFBhY2tldDo6TWFrZShwYWNrZXRfY29weSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9wYWNrZXQgPSB7MCwgMSwgMiwgMywgNH07Ci0gIHRlc3RfcGFja2V0ID0gVGVzdFJlZ05vdGlmUnNwUGFja2V0OjpNYWtlKHNob3J0X3BhY2tldCk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBhdXRvIHdyb25nX2N0eXBlID0gaW50ZXJpbV92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb247Ci0gIHdyb25nX2N0eXBlWzBdID0gMHgwMDsKLSAgdGVzdF9wYWNrZXQgPSBUZXN0UmVnTm90aWZSc3BQYWNrZXQ6Ok1ha2Uoc2hvcnRfcGFja2V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VUZXN0LCB3cm9uZ0V2ZW50RGVhdGhUZXN0KSB7Ci0gIGF1dG8gd3JvbmdfZXZlbnQgPSBpbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbjsKLSAgd3JvbmdfZXZlbnRbMTBdID0gMHgwMDsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RSZWdOb3RpZlJzcFBhY2tldDo6TWFrZSh3cm9uZ19ldmVudCk7Ci0KLSAgQVNTRVJUX0RFQVRIKHRlc3RfcGFja2V0LT5HZXRWb2x1bWUoKSwKLSAgICAgICAgICAgICAgICJHZXRFdmVudFxcKFxcKSA9PSBFdmVudDo6Vk9MVU1FX0NIQU5HRUQiKTsKLX0KLQotVEVTVChSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlclRlc3QsIHBsYXlTdGF0dXNCdWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXliYWNrU3RhdHVzQnVpbGRlcigKLSAgICAgIHRydWUsIDB4MDApOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBpbnRlcmltX3BsYXlfc3RhdHVzX25vdGlmaWNhdGlvbi5zaXplKCkpOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFJlZ05vdGlmUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBpbnRlcmltX3BsYXlfc3RhdHVzX25vdGlmaWNhdGlvbik7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXJUZXN0LCB0cmFja0NoYW5nZWRCdWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVRyYWNrQ2hhbmdlZEJ1aWxkZXIoCi0gICAgICB0cnVlLCAweDAwMDAwMDAwMDAwMDAwMDApOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBpbnRlcmltX3RyYWNrX2NoYW5nZWRfbm90aWZpY2F0aW9uLnNpemUoKSk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0UmVnTm90aWZSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGludGVyaW1fdHJhY2tfY2hhbmdlZF9ub3RpZmljYXRpb24pOwotfQotCi1URVNUKFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyVGVzdCwgcGxheVBvc2l0aW9uQnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWJhY2tQb3NpdGlvbkJ1aWxkZXIoCi0gICAgICAgICAgZmFsc2UsIDB4MDAwMDAwMDApOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBjaGFuZ2VkX3BsYXlfcG9zX25vdGlmaWNhdGlvbi5zaXplKCkpOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFJlZ05vdGlmUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBjaGFuZ2VkX3BsYXlfcG9zX25vdGlmaWNhdGlvbik7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXJUZXN0LCBub3dQbGF5aW5nQnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlTm93UGxheWluZ0J1aWxkZXIodHJ1ZSk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGludGVyaW1fbm93X3BsYXlpbmdfbm90aWZpY2F0aW9uLnNpemUoKSk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0UmVnTm90aWZSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGludGVyaW1fbm93X3BsYXlpbmdfbm90aWZpY2F0aW9uKTsKLX0KLQotVEVTVChSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlclRlc3QsIGF2YWlsYWJsZVBsYXllcnNCdWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VBdmFpbGFibGVQbGF5ZXJzQnVpbGRlcih0cnVlKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgaW50ZXJpbV9hdmFpbGFibGVfcGxheWVyc19ub3RpZmljYXRpb24uc2l6ZSgpKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RSZWdOb3RpZlJlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgaW50ZXJpbV9hdmFpbGFibGVfcGxheWVyc19ub3RpZmljYXRpb24pOwotfQotCi1URVNUKFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyVGVzdCwgYWRkcmVzc2VkUGxheWVyQnVpbGRlclRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlQWRkcmVzc2VkUGxheWVyQnVpbGRlcih0cnVlLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCk7Ci0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGludGVyaW1fYWRkcmVzc2VkX3BsYXllcl9ub3RpZmljYXRpb24uc2l6ZSgpKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RSZWdOb3RpZlJlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgaW50ZXJpbV9hZGRyZXNzZWRfcGxheWVyX25vdGlmaWNhdGlvbik7Ci19Ci0KLVRFU1QoUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXJUZXN0LCB1aWRzQ2hhbmdlZEJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVVpZHNDaGFuZ2VkQnVpbGRlcih0cnVlLCAweDAwMDApOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBpbnRlcmltX3VpZHNfbm90aWZpY2FpdG9uLnNpemUoKSk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0UmVnTm90aWZSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXREYXRhKCksIGludGVyaW1fdWlkc19ub3RpZmljYWl0b24pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL3NldF9hYnNvbHV0ZV92b2x1bWVfcGFja2V0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZTQ2MmUuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2F2cmNwL3NldF9hYnNvbHV0ZV92b2x1bWVfcGFja2V0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotI2luY2x1ZGUgInNldF9hYnNvbHV0ZV92b2x1bWUuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0U2V0Vm9sdW1lUnNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8U2V0QWJzb2x1dGVWb2x1bWVSZXNwb25zZT47Ci0KLVRFU1QoU2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlclRlc3QsIGJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4NDgpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBzZXRfYWJzb2x1dGVfdm9sdW1lX3JlcXVlc3Quc2l6ZSgpKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFNldFZvbHVtZVJzcFBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXF1ZXN0KTsKLX0KLQotLy8gVGVzdCB3aGV0aGVyIHRoZSB2b2x1bWUgZmllbGQgaGFzIHRoZSBoaWdoZXN0IGJpdCBtYXNrZWQKLVRFU1QoU2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlclRlc3QsIHZvbHVtZU1hc2tUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4YzgpOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFNldFZvbHVtZVJzcFBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXF1ZXN0KTsKLX0KLQotVEVTVChTZXRBYnNvbHV0ZVZvbHVtZVJlc3BvbnNlVGVzdCwgZ2V0dGVyVGVzdCkgewotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFNldFZvbHVtZVJzcFBhY2tldDo6TWFrZShzZXRfYWJzb2x1dGVfdm9sdW1lX3Jlc3BvbnNlKTsKLQotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldFZvbHVtZSgpLCAweDQzKTsKLX0KLQotVEVTVChTZXRBYnNvbHV0ZVZvbHVtZVJlc3BvbnNlVGVzdCwgdmFsaWRUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0U2V0Vm9sdW1lUnNwUGFja2V0OjpNYWtlKHNldF9hYnNvbHV0ZV92b2x1bWVfcmVzcG9uc2UpOwotCi0gIEFTU0VSVF9UUlVFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKFNldEFic29sdXRlVm9sdW1lUmVzcG9uc2VUZXN0LCBpbnZhbGlkVGVzdCkgewotICBhdXRvIHBhY2tldF9jb3B5ID0gc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXF1ZXN0OwotICBwYWNrZXRfY29weS5wdXNoX2JhY2soMHgwMCk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0U2V0Vm9sdW1lUnNwUGFja2V0OjpNYWtlKHBhY2tldF9jb3B5KTsKLSAgQVNTRVJUX0ZBTFNFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X3BhY2tldCA9IHsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0fTsKLSAgdGVzdF9wYWNrZXQgPSBUZXN0U2V0Vm9sdW1lUnNwUGFja2V0OjpNYWtlKHNob3J0X3BhY2tldCk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBhdXRvIHdyb25nX2N0eXBlID0gc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXF1ZXN0OwotICB3cm9uZ19jdHlwZVswXSA9IDB4MDA7Ci0gIHRlc3RfcGFja2V0ID0gVGVzdFNldFZvbHVtZVJzcFBhY2tldDo6TWFrZSh3cm9uZ19jdHlwZSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL3NldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL3NldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmNlZDllLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllcl9wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAic2V0X2FkZHJlc3NlZF9wbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0U2V0QWRkclBsYXllclBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3Q+OwotCi1URVNUKFNldEFkZHJlc3NlZFBsYXllclJlc3BvbnNlQnVpbGRlclRlc3QsIGJ1aWxkZXJUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBTZXRBZGRyZXNzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6Tk9fRVJST1IpOwotICBBU1NFUlRfRVEoYnVpbGRlci0+c2l6ZSgpLCBzZXRfYWRkcmVzc2VkX3BsYXllcl9yZXNwb25zZS5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0U2V0QWRkclBsYXllclBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldERhdGEoKSwgc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVzcG9uc2UpOwotfQotCi1URVNUKFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3RUZXN0LCBnZXR0ZXJUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgVGVzdFNldEFkZHJQbGF5ZXJQYWNrZXQ6Ok1ha2Uoc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdCk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRQbGF5ZXJJZCgpLCAweDAwMDB1KTsKLX0KLQotVEVTVChTZXRBZGRyZXNzZWRQbGF5ZXJSZXF1ZXN0VGVzdCwgdmFsaWRUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgVGVzdFNldEFkZHJQbGF5ZXJQYWNrZXQ6Ok1ha2Uoc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdCk7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3RUZXN0LCBpbnZhbGlkVGVzdCkgewotICBhdXRvIHBhY2tldF9jb3B5ID0gc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdDsKLSAgcGFja2V0X2NvcHkucHVzaF9iYWNrKDB4MDApOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFNldEFkZHJQbGF5ZXJQYWNrZXQ6Ok1ha2UocGFja2V0X2NvcHkpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfcGFja2V0ID0gezB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDR9OwotICB0ZXN0X3BhY2tldCA9IFRlc3RTZXRBZGRyUGxheWVyUGFja2V0OjpNYWtlKHNob3J0X3BhY2tldCk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYXZyY3Avc2V0X2Jyb3dzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2F2cmNwL3NldF9icm93c2VkX3BsYXllcl9wYWNrZXRfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4ZGYxOC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvYXZyY3Avc2V0X2Jyb3dzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLSNpbmNsdWRlICJzZXRfYnJvd3NlZF9wbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0U2V0QnJvd3NlZFBsYXllclBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFNldEJyb3dzZWRQbGF5ZXJSZXF1ZXN0PjsKLQotVEVTVChTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyLCBidWlsZGVyVGVzdCkgewotICBhdXRvIGJ1aWxkZXIgPSBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAsIDQsIDAsICIiKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc3BvbnNlLnNpemUoKSk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RTZXRCcm93c2VkUGxheWVyUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBzZXRfYnJvd3NlZF9wbGF5ZXJfcmVzcG9uc2UpOwotfQotCi1URVNUKFNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXIsIGVycm9yU3RhdHVzVGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwbGF5ZXJfbm90X2Jyb3dzYWJsZV9zdGF0dXMgPSB7MHg3MCwgMHgwMCwgMHgwMSwgMHgxMn07Ci0gIGF1dG8gYnVpbGRlciA9IFNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpQTEFZRVJfTk9UX0JST1dTQUJMRSwgMHgxMjM0LCA1LCA2LCAiRmllbGQgTm90IFVzZWQiKTsKLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgcGxheWVyX25vdF9icm93c2FibGVfc3RhdHVzLnNpemUoKSk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RTZXRCcm93c2VkUGxheWVyUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBwbGF5ZXJfbm90X2Jyb3dzYWJsZV9zdGF0dXMpOwotfQotCi1URVNUKFNldEJyb3dzZWRQbGF5ZXJSZXF1ZXN0VGVzdCwgZ2V0dGVyVGVzdCkgewotICBhdXRvIHRlc3RfcGFja2V0ID0KLSAgICAgIFRlc3RTZXRCcm93c2VkUGxheWVyUGFja2V0OjpNYWtlKHNldF9icm93c2VkX3BsYXllcl9yZXF1ZXN0KTsKLQotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldFBsYXllcklkKCksIDB4MDAwMnUpOwotfQotCi1URVNUKFNldEJyb3dzZWRQbGF5ZXJSZXF1ZXN0VGVzdCwgdmFsaWRUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgVGVzdFNldEJyb3dzZWRQbGF5ZXJQYWNrZXQ6Ok1ha2Uoc2V0X2Jyb3dzZWRfcGxheWVyX3JlcXVlc3QpOwotICBBU1NFUlRfVFJVRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotVEVTVChTZXRCcm93c2VkUGxheWVyUmVxdWVzdFRlc3QsIGludmFsaWRUZXN0KSB7Ci0gIGF1dG8gcGFja2V0X2NvcHkgPSBzZXRfYnJvd3NlZF9wbGF5ZXJfcmVxdWVzdDsKLSAgcGFja2V0X2NvcHkucHVzaF9iYWNrKDB4MDApOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFNldEJyb3dzZWRQbGF5ZXJQYWNrZXQ6Ok1ha2UocGFja2V0X2NvcHkpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2hvcnRfcGFja2V0ID0gezB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDR9OwotICB0ZXN0X3BhY2tldCA9IFRlc3RTZXRCcm93c2VkUGxheWVyUGFja2V0OjpNYWtlKHNob3J0X3BhY2tldCk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2F2cmNwL3ZlbmRvcl9wYWNrZXRfdGVzdC5jYyBiL3BhY2tldC90ZXN0cy9hdnJjcC92ZW5kb3JfcGFja2V0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MzM4MjQuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2F2cmNwL3ZlbmRvcl9wYWNrZXRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dHVwbGU+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAidmVuZG9yX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBoYXMgcHVibGljIGFjY2Vzc29ycyB0byBwcm90ZWN0ZWQgbWV0aG9kcwotY2xhc3MgVGVzdFBhY2tldEJ1aWxkZXIgOiBwdWJsaWMgUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRlc3RQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIobmV3IFRlc3RQYWNrZXRCdWlsZGVyKGRhdGEpKTsKLSAgICByZXR1cm4gYnVpbGRlcjsKLSAgfTsKLQotICAvLyBNYWtlIGFsbCB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgcHVibGljCi0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OlJlc2VydmVTcGFjZTsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czE7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHMyOwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzMzsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czQ7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHM2OwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzODsKLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGRhdGFfLnNpemUoKTsgfTsKLQotICBib29sIFNlcmlhbGl6ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0PiYgcGt0KSBvdmVycmlkZSB7Ci0gICAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICAgIGZvciAodWludDhfdCBieXRlIDogZGF0YV8pIHsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBUZXN0UGFja2V0QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSA6IGRhdGFfKGRhdGEpe307Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV87Ci19OwotCi1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0VmVuZG9yUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8VmVuZG9yUGFja2V0PjsKLQotVEVTVChWZW5kb3JQYWNrZXRCdWlsZGVyVGVzdCwgYnVpbGRlclRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2NhcF9wYXlsb2FkX2RhdGEgPSB7MHgwM307Ci0KLSAgYXV0byBnZXRfY2FwX3BheWxvYWQgPSBUZXN0UGFja2V0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoZ2V0X2NhcF9wYXlsb2FkX2RhdGEpOwotCi0gIGF1dG8gYnVpbGRlciA9IFZlbmRvclBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgQ1R5cGU6OlNUQVRVUywgQ29tbWFuZFBkdTo6R0VUX0NBUEFCSUxJVElFUywgUGFja2V0VHlwZTo6U0lOR0xFLAotICAgICAgc3RkOjptb3ZlKGdldF9jYXBfcGF5bG9hZCkpOwotCi0gIEFTU0VSVF9FUShidWlsZGVyLT5zaXplKCksIGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdC5zaXplKCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0VmVuZG9yUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0RGF0YSgpLCBnZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3QpOwotfQotCi11c2luZyBUZXN0UGFyYW0gPSBzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBDb21tYW5kUGR1PjsKLWNsYXNzIFZlbmRvclBhY2tldFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFRlc3RQYXJhbT4gewotIHB1YmxpYzoKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gR2V0UGFja2V0RGF0YSgpIHsgcmV0dXJuIHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOyB9Ci0gIENvbW1hbmRQZHUgR2V0Q29tbWFuZFBkdSgpIHsgcmV0dXJuIHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOyB9Ci19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUCgKLSAgICBWZW5kb3JQYWNrZXRQYXJhbWV0ZXJUZXN0LCBWZW5kb3JQYWNrZXRUZXN0LAotICAgIDo6dGVzdGluZzo6VmFsdWVzKAotICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0LCBDb21tYW5kUGR1OjpHRVRfQ0FQQUJJTElUSUVTKSwKLSAgICAgICAgc3RkOjptYWtlX3R1cGxlKGdldF9jYXBhYmlsaXRpZXNfcmVzcG9uc2VfY29tcGFueV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRQZHU6OkdFVF9DQVBBQklMSVRJRVMpLAotICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoZ2V0X2NhcGFiaWxpdGllc19yZXNwb25zZV9ldmVudHNfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFBkdTo6R0VUX0NBUEFCSUxJVElFUyksCi0gICAgICAgIHN0ZDo6bWFrZV90dXBsZShnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfcGFydGlhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRQZHU6OkdFVF9FTEVNRU5UX0FUVFJJQlVURVMpLAotICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUGR1OjpHRVRfRUxFTUVOVF9BVFRSSUJVVEVTKSwKLSAgICAgICAgc3RkOjptYWtlX3R1cGxlKGdldF9lbGVtZW50c19hdHRyaWJ1dGVzX3Jlc3BvbnNlX2Z1bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUGR1OjpHRVRfRUxFTUVOVF9BVFRSSUJVVEVTKSwKLSAgICAgICAgc3RkOjptYWtlX3R1cGxlKGdldF9wbGF5X3N0YXR1c19yZXF1ZXN0LCBDb21tYW5kUGR1OjpHRVRfUExBWV9TVEFUVVMpLAotICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoZ2V0X3BsYXlfc3RhdHVzX3Jlc3BvbnNlLCBDb21tYW5kUGR1OjpHRVRfUExBWV9TVEFUVVMpLAotICAgICAgICBzdGQ6Om1ha2VfdHVwbGUocmVnaXN0ZXJfcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFBkdTo6UkVHSVNURVJfTk9USUZJQ0FUSU9OKSwKLSAgICAgICAgc3RkOjptYWtlX3R1cGxlKGludGVyaW1fcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZFBkdTo6UkVHSVNURVJfTk9USUZJQ0FUSU9OKSwKLSAgICAgICAgc3RkOjptYWtlX3R1cGxlKGludGVyaW1fdHJhY2tfY2hhbmdlZF9ub3RpZmljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUGR1OjpSRUdJU1RFUl9OT1RJRklDQVRJT04pLAotICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoY2hhbmdlZF9wbGF5X3Bvc19ub3RpZmljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kUGR1OjpSRUdJU1RFUl9OT1RJRklDQVRJT04pKSk7Ci0KLVRFU1RfUChWZW5kb3JQYWNrZXRUZXN0LCBnZXR0ZXJUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0VmVuZG9yUGFja2V0OjpNYWtlKEdldFBhY2tldERhdGEoKSk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRDb21wYW55SWQoKSwgQkxVRVRPT1RIX0NPTVBBTllfSUQpOwotICBBU1NFUlRfRVEodGVzdF9wYWNrZXQtPkdldENvbW1hbmRQZHUoKSwgR2V0Q29tbWFuZFBkdSgpKTsKLSAgQVNTRVJUX0VRKHRlc3RfcGFja2V0LT5HZXRQYWNrZXRUeXBlKCksIFBhY2tldFR5cGU6OlNJTkdMRSk7Ci0gIC8vIEFTU0VSVF9FUSh0ZXN0X3BhY2tldC0+R2V0UGFyYW1ldGVyTGVuZ3RoKCksIDB4MDEpOwotfQotCi1URVNUX1AoVmVuZG9yUGFja2V0VGVzdCwgdmFsaWRUZXN0KSB7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0VmVuZG9yUGFja2V0OjpNYWtlKEdldFBhY2tldERhdGEoKSk7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCkpOwotfQotCi1URVNUX0YoVmVuZG9yUGFja2V0VGVzdCwgaW52YWxpZFRlc3QpIHsKLSAgYXV0byBnZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfY29weSA9IGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdDsKLSAgZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0X2NvcHkucHVzaF9iYWNrKDB4MDApOwotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFZlbmRvclBhY2tldDo6TWFrZShnZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfY29weSk7Ci0gIEFTU0VSVF9GQUxTRSh0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaG9ydF9wYWNrZXQgPSB7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNX07Ci0gIHRlc3RfcGFja2V0ID0gVGVzdFZlbmRvclBhY2tldDo6TWFrZShzaG9ydF9wYWNrZXQpOwotICBBU1NFUlRfRkFMU0UodGVzdF9wYWNrZXQtPklzVmFsaWQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9iYXNlL2l0ZXJhdG9yX3Rlc3QuY2MgYi9wYWNrZXQvdGVzdHMvYmFzZS9pdGVyYXRvcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc0M2RlLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9iYXNlL2l0ZXJhdG9yX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfY29tbW9uLmgiCi0jaW5jbHVkZSAidGVzdF9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi11c2luZyBwYWlyID0gc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PjsKLQotY2xhc3MgSXRlcmF0b3JUZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4+IHsKLSBwdWJsaWM6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxUZXN0UGFja2V0PiBHZXRUZXN0UGFja2V0KCkgewotICAgIGF1dG8gYm91bmRzID0gR2V0UGFyYW0oKTsKLSAgICBhdXRvIGxvd2VyX2JvdW5kID0gYm91bmRzLmZpcnN0OwotICAgIGF1dG8gdXBwZXJfYm91bmQgPSBib3VuZHMuc2Vjb25kOwotCi0gICAgcmV0dXJuIFRlc3RQYWNrZXQ6Ok1ha2UodGVzdF9sMmNhcF9kYXRhLCBsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQpOwotICB9Ci0KLSAgc2l6ZV90IEdldFRlc3RQYWNrZXRMZW5ndGgoKSB7IHJldHVybiBHZXRQYXJhbSgpLnNlY29uZCAtIEdldFBhcmFtKCkuZmlyc3Q7IH0KLQotICBzaXplX3QgR2V0TG93ZXJCb3VuZCgpIHsgcmV0dXJuIEdldFBhcmFtKCkuZmlyc3Q7IH0KLQotICBzaXplX3QgR2V0VXBwZXJCb3VuZCgpIHsgcmV0dXJuIEdldFBhcmFtKCkuc2Vjb25kOyB9Ci19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChJdGVyYXRvclBhcmFtZXRlclRlc3QsIEl0ZXJhdG9yVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHBhaXIoMCwgdGVzdF9sMmNhcF9kYXRhLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyKDMsIHRlc3RfbDJjYXBfZGF0YS5zaXplKCkgLSAyKSkpOwotCi1URVNUX0YoSXRlcmF0b3JUZXN0LCBpdGVyYXRvckNyZWF0ZURlYXRoVGVzdCkgewotICBhdXRvIHBhY2tldCA9Ci0gICAgICBUZXN0UGFja2V0OjpNYWtlKHRlc3RfbDJjYXBfZGF0YSwgMywgdGVzdF9sMmNhcF9kYXRhLnNpemUoKSAtIDIpOwotICBBU1NFUlRfREVBVEgoSXRlcmF0b3IocGFja2V0LCAwKSwgImluZGV4XyA+PSBwYWNrZXQtPnBhY2tldF9zdGFydF9pbmRleF8iKTsKLSAgQVNTRVJUX0RFQVRIKEl0ZXJhdG9yKHBhY2tldCwgdGVzdF9sMmNhcF9kYXRhLnNpemUoKSksCi0gICAgICAgICAgICAgICAiaW5kZXhfIDw9IHBhY2tldC0+cGFja2V0X2VuZF9pbmRleF8iKTsKLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgZXh0cmFjdFRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBUZXN0UGFja2V0OjpNYWtlKHRlc3RfbDJjYXBfZGF0YSk7Ci0gIEl0ZXJhdG9yIGdlbmVyYWxfY2FzZSA9IHBhY2tldC0+YmVnaW4oKTsKLQotICBBU1NFUlRfRVEoMHgwMnUsIGdlbmVyYWxfY2FzZS5leHRyYWN0PHVpbnQ4X3Q+KCkpOwotICBBU1NFUlRfRVEoMHgyZWRjdSwgZ2VuZXJhbF9jYXNlLmV4dHJhY3Q8dWludDE2X3Q+KCkpOwotICBBU1NFUlRfRVEoMHgwMDYyMDA2NnUsIGdlbmVyYWxfY2FzZS5leHRyYWN0PHVpbnQzMl90PigpKTsKLSAgQVNTRVJUX0VRKDB4MDAwMTAwMDAwMDBhMDAxM3UsIGdlbmVyYWxfY2FzZS5leHRyYWN0PHVpbnQ2NF90PigpKTsKLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgZXh0cmFjdEJFVGVzdCkgewotICBhdXRvIHBhY2tldCA9IFRlc3RQYWNrZXQ6Ok1ha2UodGVzdF9sMmNhcF9kYXRhKTsKLSAgSXRlcmF0b3IgZ2VuZXJhbF9jYXNlID0gcGFja2V0LT5iZWdpbigpOwotCi0gIEFTU0VSVF9FUSgweDAydSwgZ2VuZXJhbF9jYXNlLmV4dHJhY3RCRTx1aW50OF90PigpKTsKLSAgQVNTRVJUX0VRKDB4ZGMyZXUsIGdlbmVyYWxfY2FzZS5leHRyYWN0QkU8dWludDE2X3Q+KCkpOwotICBBU1NFUlRfRVEoMHg2NjAwNjIwMHUsIGdlbmVyYWxfY2FzZS5leHRyYWN0QkU8dWludDMyX3Q+KCkpOwotICBBU1NFUlRfRVEoMHgxMzAwMGEwMDAwMDAwMTAwdSwgZ2VuZXJhbF9jYXNlLmV4dHJhY3RCRTx1aW50NjRfdD4oKSk7Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIHBheWxvYWRCb3VuZHNUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PihwYWNrZXQtPmVuZCgpIC0gcGFja2V0LT5iZWdpbigpKSwKLSAgICAgICAgICAgIEdldFRlc3RQYWNrZXRMZW5ndGgoKSk7Ci0KLSAgYXV0byBpdCA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRUZXN0UGFja2V0TGVuZ3RoKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbaSArIEdldExvd2VyQm91bmQoKV0sICppdCsrKTsKLSAgfQotfQotCi1URVNUX1AoSXRlcmF0b3JUZXN0LCBleHRyYWN0Qm91bmRzRGVhdGhUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBJdGVyYXRvciBib3VuZHNfdGVzdCA9IHBhY2tldC0+ZW5kKCk7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0PHVpbnQ4X3Q+KCksCi0gICAgICAgICAgICAgICAiaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0PHVpbnQxNl90PigpLAotICAgICAgICAgICAgICAgImluZGV4XyAhPSBwYWNrZXRfLT5wYWNrZXRfZW5kX2luZGV4XyIpOwotICBBU1NFUlRfREVBVEgoYm91bmRzX3Rlc3QuZXh0cmFjdDx1aW50MzJfdD4oKSwKLSAgICAgICAgICAgICAgICJpbmRleF8gIT0gcGFja2V0Xy0+cGFja2V0X2VuZF9pbmRleF8iKTsKLSAgQVNTRVJUX0RFQVRIKGJvdW5kc190ZXN0LmV4dHJhY3Q8dWludDY0X3Q+KCksCi0gICAgICAgICAgICAgICAiaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfIik7Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIGV4dHJhY3RCRUJvdW5kc0RlYXRoVGVzdCkgewotICBhdXRvIHBhY2tldCA9IEdldFRlc3RQYWNrZXQoKTsKLSAgSXRlcmF0b3IgYm91bmRzX3Rlc3QgPSBwYWNrZXQtPmVuZCgpOwotICBBU1NFUlRfREVBVEgoYm91bmRzX3Rlc3QuZXh0cmFjdEJFPHVpbnQ4X3Q+KCksCi0gICAgICAgICAgICAgICAiaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0QkU8dWludDE2X3Q+KCksCi0gICAgICAgICAgICAgICAiaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0QkU8dWludDMyX3Q+KCksCi0gICAgICAgICAgICAgICAiaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0QkU8dWludDY0X3Q+KCksCi0gICAgICAgICAgICAgICAiaW5kZXhfICE9IHBhY2tldF8tPnBhY2tldF9lbmRfaW5kZXhfIik7Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIGRlcmVmZXJlbmNlRGVhdGhUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBJdGVyYXRvciBkZXJlZmVyZW5jZV90ZXN0ID0gcGFja2V0LT5lbmQoKTsKLQotICBBU1NFUlRfRVEoKCpwYWNrZXQpW0dldFRlc3RQYWNrZXRMZW5ndGgoKSAtIDFdLAotICAgICAgICAgICAgKihkZXJlZmVyZW5jZV90ZXN0IC0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxKSkpOwotICBBU1NFUlRfREVBVEgoKmRlcmVmZXJlbmNlX3Rlc3QsICJpbmRleF8gIT0gcGFja2V0Xy0+cGFja2V0X2VuZF9pbmRleF8iKTsKLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgcGx1c0VxVGVzdCkgewotICBhdXRvIHBhY2tldCA9IEdldFRlc3RQYWNrZXQoKTsKLSAgSXRlcmF0b3IgcGx1c19lcSA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRUZXN0UGFja2V0TGVuZ3RoKCk7IGkgKz0gMikgewotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbaSArIEdldExvd2VyQm91bmQoKV0sICpwbHVzX2VxKQotICAgICAgICA8PCAiKz0gdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIGF0IGluZGV4ICIKLSAgICAgICAgPDwgaTsKLSAgICBwbHVzX2VxICs9IDI7Ci0gIH0KLQotICBBU1NFUlRfRVEocGx1c19lcSwgcGFja2V0LT5lbmQoKSk7Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIHByZUluY3JlbWVudFRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIHBsdXNfcGx1cyA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRUZXN0UGFja2V0TGVuZ3RoKCkgLSAxOyBpKyspIHsKLSAgICBBU1NFUlRfRVEodGVzdF9sMmNhcF9kYXRhW2kgKyBHZXRMb3dlckJvdW5kKCkgKyAxXSwgKigrK3BsdXNfcGx1cykpCi0gICAgICAgIDw8ICJQcmUtaW5jcmVtZW50IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCAiCi0gICAgICAgIDw8ICJhdCBpbmRleCAiIDw8IGk7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgcG9zdEluY3JlbWVudFRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIHBsdXNfcGx1cyA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRUZXN0UGFja2V0TGVuZ3RoKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbaSArIEdldExvd2VyQm91bmQoKV0sICoocGx1c19wbHVzKyspKQotICAgICAgICA8PCAiUG9zdC1pbmNyZW1lbnQgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICIKLSAgICAgICAgPDwgImF0IGluZGV4ICIgPDwgaTsKLSAgfQotfQotCi1URVNUX1AoSXRlcmF0b3JUZXN0LCBhZGRpdGlvblRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIHBsdXMgPSBwYWNrZXQtPmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR2V0VGVzdFBhY2tldExlbmd0aCgpOyBpKyspIHsKLSAgICBBU1NFUlRfRVEodGVzdF9sMmNhcF9kYXRhW2kgKyBHZXRMb3dlckJvdW5kKCldLCAqcGx1cykKLSAgICAgICAgPDwgIisgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkIGF0IGluZGV4ICIKLSAgICAgICAgPDwgaTsKLSAgICBwbHVzID0gcGx1cyArIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgbWludXNFcVRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIG1pbnVzX2VxID0gcGFja2V0LT5lbmQoKTsKLSAgbWludXNfZXEgLT0gMTsKLSAgZm9yIChpbnQgaSA9IEdldFRlc3RQYWNrZXRMZW5ndGgoKSAtIDE7IGkgPiAwOyBpIC09IDIpIHsKLSAgICBBU1NFUlRfRVEodGVzdF9sMmNhcF9kYXRhW3N0YXRpY19jYXN0PHNpemVfdD4oaSkgKyBHZXRMb3dlckJvdW5kKCldLAotICAgICAgICAgICAgICAqbWludXNfZXEpCi0gICAgICAgIDw8ICItPSB0ZXN0OiBEZXJlZmVyZW5jZWQgaXRlcmF0b3IgZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgYXQgaW5kZXggIgotICAgICAgICA8PCBpOwotICAgIG1pbnVzX2VxIC09IDI7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgcHJlRGVjcmVtZW50VGVzdCkgewotICBhdXRvIHBhY2tldCA9IEdldFRlc3RQYWNrZXQoKTsKLSAgSXRlcmF0b3IgbWludXNfbWludXMgPSBwYWNrZXQtPmVuZCgpOwotICBmb3IgKGludCBpID0gR2V0VGVzdFBhY2tldExlbmd0aCgpOyBpID4gMDsgaS0tKSB7Ci0gICAgQVNTRVJUX0VRKHRlc3RfbDJjYXBfZGF0YVtzdGF0aWNfY2FzdDxzaXplX3Q+KGkpICsgR2V0TG93ZXJCb3VuZCgpIC0gMV0sCi0gICAgICAgICAgICAgICooLS1taW51c19taW51cykpCi0gICAgICAgIDw8ICJQcmUtZGVjcmVtZW50IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCAiCi0gICAgICAgIDw8ICJhdCBpbmRleCAiIDw8IGk7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgcG9zdERlY3JlbWVudFRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIG1pbnVzX21pbnVzID0gcGFja2V0LT5lbmQoKTsKLSAgbWludXNfbWludXMtLTsKLSAgZm9yIChpbnQgaSA9IEdldFRlc3RQYWNrZXRMZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pIHsKLSAgICBBU1NFUlRfRVEodGVzdF9sMmNhcF9kYXRhW3N0YXRpY19jYXN0PHNpemVfdD4oaSkgKyBHZXRMb3dlckJvdW5kKCldLAotICAgICAgICAgICAgICAqKG1pbnVzX21pbnVzLS0pKQotICAgICAgICA8PCAiUG9zdC1kZWNyZW1lbnQgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICIKLSAgICAgICAgPDwgImF0IGluZGV4ICIgPDwgaTsKLSAgfQotfQotCi1URVNUX1AoSXRlcmF0b3JUZXN0LCBzdWJ0cmFjdGlvblRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIG1pbnVzID0gcGFja2V0LT5lbmQoKTsKLSAgbWludXMgPSBtaW51cyAtIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIGZvciAoaW50IGkgPSBHZXRUZXN0UGFja2V0TGVuZ3RoKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0gICAgQVNTRVJUX0VRKHRlc3RfbDJjYXBfZGF0YVtzdGF0aWNfY2FzdDxzaXplX3Q+KGkpICsgR2V0TG93ZXJCb3VuZCgpXSwgKm1pbnVzKQotICAgICAgICA8PCAiLSB0ZXN0OiBEZXJlZmVyZW5jZWQgaXRlcmF0b3IgZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgYXQgaW5kZXggIgotICAgICAgICA8PCBpOwotICAgIG1pbnVzID0gbWludXMgLSBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpOwotICB9Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIHBsdXNFcUJvdW5kc1Rlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIHBsdXNfZXEgPSBwYWNrZXQtPmVuZCgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgcGx1c19lcSArPSBpOwotICAgIEFTU0VSVF9FUShwYWNrZXQtPmVuZCgpLCBwbHVzX2VxKQotICAgICAgICA8PCAiKz0gdGVzdDogSXRlcmF0b3IgZXhjZWVkZWQgdGhlIHVwcGVyIGJvdW5kIHNldCBieSBnZXRfbGVuZ3RoKCkiOwotICB9Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIHByZUluY3JlbWVudEJvdW5kc1Rlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIHBsdXNfcGx1cyA9IHBhY2tldC0+ZW5kKCk7Ci0gIHBsdXNfcGx1cy0tOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHBhY2tldC0+ZW5kKCksICsrcGx1c19wbHVzKQotICAgICAgICA8PCAiUHJlLWluY3JlbWVudCB0ZXN0OiBJdGVyYXRvciBleGNlZWRlZCB0aGUgdXBwZXIgYm91bmQgc2V0ICIKLSAgICAgICAgICAgImJ5IGdldF9sZW5ndGgoKSI7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgcG9zdEluY3JlbWVudEJvdW5kc1Rlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIHBsdXNfcGx1cyA9IHBhY2tldC0+ZW5kKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocGFja2V0LT5lbmQoKSwgcGx1c19wbHVzKyspCi0gICAgICAgIDw8ICJQb3N0LWluY3JlbWVudCB0ZXN0OiBJdGVyYXRvciBleGNlZWRlZCB0aGUgdXBwZXIgYm91bmQgc2V0ICIKLSAgICAgICAgICAgImJ5IGdldF9sZW5ndGgoKSI7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgYWRkaXRpb25Cb3VuZHNUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBJdGVyYXRvciBwbHVzID0gcGFja2V0LT5lbmQoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIHBsdXMgPSBwbHVzICsgc3RhdGljX2Nhc3Q8c2l6ZV90PihpKTsKLSAgICBBU1NFUlRfRVEocGFja2V0LT5lbmQoKSwgcGx1cykKLSAgICAgICAgPDwgIisgdGVzdDogSXRlcmF0b3IgZXhjZWVkZWQgdGhlIHVwcGVyIGJvdW5kIHNldCBieSBnZXRfbGVuZ3RoKCkiOwotICB9Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIG1pbnVzRXFCb3VuZHNUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBJdGVyYXRvciBtaW51c19lcSA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIG1pbnVzX2VxIC09IGk7Ci0gICAgQVNTRVJUX0VRKHRlc3RfbDJjYXBfZGF0YVtHZXRMb3dlckJvdW5kKCldLCAqbWludXNfZXEpCi0gICAgICAgIDw8ICItPSB0ZXN0OiBJdGVyYXRvciBpcyBsZXNzIHRoYW4gdGhlIGxvd2VyIGJvdW5kIHNldCBieSAiCi0gICAgICAgICAgICJwYWNrZXQtPmJlZ2luKCkiOwotICB9Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIHByZURlY3JlbWVudEJvdW5kc1Rlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBHZXRUZXN0UGFja2V0KCk7Ci0gIEl0ZXJhdG9yIG1pbnVzX21pbnVzID0gcGFja2V0LT5iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHRlc3RfbDJjYXBfZGF0YVtHZXRMb3dlckJvdW5kKCldLCAqKC0tbWludXNfbWludXMpKQotICAgICAgICA8PCAiUHJlLWRlY3JlbWVudCB0ZXN0OiBJdGVyYXRvciBpcyBsZXNzIHRoYW4gdGhlIGxvd2VyIGJvdW5kIHNldCBieSAiCi0gICAgICAgICAgICJwYWNrZXQtPmJlZ2luKCkiOwotICB9Ci19Ci0KLVRFU1RfUChJdGVyYXRvclRlc3QsIHBvc3REZWNyZW1lbnRCb3VuZHNUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBJdGVyYXRvciBtaW51c19taW51cyA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbR2V0TG93ZXJCb3VuZCgpXSwgKihtaW51c19taW51cy0tKSkKLSAgICAgICAgPDwgIlBvc3QtZGVjcmVtZW50IHRlc3Q6IEl0ZXJhdG9yIGlzIGxlc3MgdGhhbiB0aGUgbG93ZXIgYm91bmQgc2V0IGJ5ICIKLSAgICAgICAgICAgInBhY2tldC0+YmVnaW4oKSI7Ci0gIH0KLX0KLQotVEVTVF9QKEl0ZXJhdG9yVGVzdCwgc3VidHJhY3Rpb25Cb3VuZHNUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gR2V0VGVzdFBhY2tldCgpOwotICBJdGVyYXRvciBtaW51cyA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIG1pbnVzID0gbWludXMgLSBzdGF0aWNfY2FzdDxzaXplX3Q+KGkpOwotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbR2V0TG93ZXJCb3VuZCgpXSwgKm1pbnVzKQotICAgICAgICA8PCAiLSB0ZXN0OiBJdGVyYXRvciBpcyBsZXNzIHRoYW4gdGhlIGxvd2VyIGJvdW5kIHNldCAiCi0gICAgICAgICAgICJieSBwYWNrZXQtPmJlZ2luKCkiOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9iYXNlL3BhY2tldF9idWlsZGVyX3Rlc3QuY2MgYi9wYWNrZXQvdGVzdHMvYmFzZS9wYWNrZXRfYnVpbGRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDU3NjA2Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9iYXNlL3BhY2tldF9idWlsZGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9jb21tb24uaCIKLSNpbmNsdWRlICJ0ZXN0X3BhY2tldHMuaCIKLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1URVNUKFBhY2tldEJ1aWxkZXJUZXN0LCBzZXJpYWxpemVUZXN0KSB7Ci0gIGF1dG8gYnVpbGRlciA9IFRlc3RQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcih0ZXN0X2wyY2FwX2RhdGEpOwotICBhdXRvIHBhY2tldCA9IFRlc3RQYWNrZXQ6Ok1ha2UoKTsKLQotICBidWlsZGVyLT5TZXJpYWxpemUocGFja2V0KTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfbDJjYXBfZGF0YS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbaV0sICgqcGFja2V0KVtpXSk7Ci0gIH0KLX0KLQotVEVTVChQYWNrZXRCdWlsZGVyVGVzdCwgc2l6ZVRlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gVGVzdFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHRlc3RfbDJjYXBfZGF0YSk7Ci0KLSAgQVNTRVJUX0VRKGJ1aWxkZXItPnNpemUoKSwgdGVzdF9sMmNhcF9kYXRhLnNpemUoKSk7Ci19Ci0KLVRFU1QoUGFja2V0QnVpbGRlclRlc3QsIHJlc2VydmVTcGFjZVRlc3QpIHsKLSAgYXV0byBwYWNrZXQgPSBUZXN0UGFja2V0OjpNYWtlKCk7Ci0gIEFTU0VSVF9FUShwYWNrZXQtPkdldERhdGEoKS5jYXBhY2l0eSgpLCAwdSk7Ci0KLSAgYXV0byBidWlsZGVyID0gVGVzdFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHRlc3RfbDJjYXBfZGF0YSk7Ci0gIGJ1aWxkZXItPlJlc2VydmVTcGFjZShwYWNrZXQsIHRlc3RfbDJjYXBfZGF0YS5zaXplKCkpOwotCi0gIEFTU0VSVF9HRShwYWNrZXQtPkdldERhdGEoKS5jYXBhY2l0eSgpLCB0ZXN0X2wyY2FwX2RhdGEuc2l6ZSgpKTsKLX0KLQotVEVTVChQYWNrZXRCdWlsZGVyVGVzdCwgYWRkUGF5bG9hZE9jdGV0c1Rlc3QpIHsKLSAgYXV0byBidWlsZGVyID0gVGVzdFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHRlc3RfbDJjYXBfZGF0YSk7Ci0gIGF1dG8gcGFja2V0ID0gVGVzdFBhY2tldDo6TWFrZSgpOwotCi0gIGJ1aWxkZXItPkFkZFBheWxvYWRPY3RldHMxKHBhY2tldCwgMHgwMXUpOwotICBidWlsZGVyLT5BZGRQYXlsb2FkT2N0ZXRzMihwYWNrZXQsIDB4MDMwMnUpOwotICBidWlsZGVyLT5BZGRQYXlsb2FkT2N0ZXRzMyhwYWNrZXQsIDB4MDYwNTA0dSk7Ci0gIGJ1aWxkZXItPkFkZFBheWxvYWRPY3RldHM0KHBhY2tldCwgMHgwQTA5MDgwN3UpOwotICBidWlsZGVyLT5BZGRQYXlsb2FkT2N0ZXRzNihwYWNrZXQsIDB4MTAwRjBFMEQwQzBCdSk7Ci0gIGJ1aWxkZXItPkFkZFBheWxvYWRPY3RldHM4KHBhY2tldCwgMHgxODE3MTYxNTE0MTMxMjExdSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAweDE4OyBpKyspIHsKLSAgICBBU1NFUlRfRVEoKCpwYWNrZXQpW2ldLCBpICsgMSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9iYXNlL3BhY2tldF90ZXN0LmNjIGIvcGFja2V0L3Rlc3RzL2Jhc2UvcGFja2V0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNGMxNDcuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Jhc2UvcGFja2V0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9jb21tb24uaCIKLSNpbmNsdWRlICJ0ZXN0X3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIFRlc3QgbWFraW5nIGEgcGFja2V0IGZyb20gYW5vdGhlciBwYWNrZXQuIFRoZSBuZXcgcGFja2V0IHNob3VsZCBoYXZlIHRoZQotLy8gc2FtZSBwYXlsb2FkIGJvdW5kcyBhcyB0aGUgb2xkIHBhY2tldC4KLVRFU1QoUGFja2V0VGVzdCwgbmV3UGFja2V0RnJvbVBhY2tldFRlc3QpIHsKLSAgLy8gQ3JlYXRlIGEgcGFja2V0IHdpdGggcGF5bG9hZCBib3VuZHMKLSAgYXV0byBwYWNrZXQgPSBUZXN0UGFja2V0OjpNYWtlKAotICAgICAgdGVzdF9hdmN0cF9kYXRhLCB0ZXN0X2F2Y3RwX2RhdGFfcGF5bG9hZF9vZmZzZXQsIHRlc3RfYXZjdHBfZGF0YS5zaXplKCkpOwotCi0gIC8vIENyZWF0ZSBwYWNrZXQgZnJvbSBib3VuZGVkIHBhY2tldAotICBhdXRvIG5ld19wYWNrZXQgPSBUZXN0UGFja2V0OjpNYWtlKHBhY2tldCk7Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBuZXcgcGFja2V0IGlzIGJvdW5kZWQgYnkgdGhlIHBheWxvYWQgb2YgdGhlIG9sZCBwYWNrZXQKLSAgYXV0byBpdCA9IG5ld19wYWNrZXQtPmJlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9hdnJjcF9kYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKHRlc3RfYXZyY3BfZGF0YVtpXSwgKml0KyspOwotICB9Ci19Ci0KLS8vIFRlc3QgdGhhdCB0aGUgY29ycmVjdCBwYXlsb2FkIGxlbmd0aCBpcyByZXR1cm5lZAotVEVTVChQYWNrZXRUZXN0LCBzaXplVGVzdCkgewotICBhdXRvIHBhY2tldCA9IFRlc3RQYWNrZXQ6Ok1ha2UodGVzdF9hdmN0cF9kYXRhKTsKLSAgQVNTRVJUX0VRKHBhY2tldC0+c2l6ZSgpLCB0ZXN0X2F2Y3RwX2RhdGEuc2l6ZSgpKTsKLQotICBwYWNrZXQgPSBUZXN0UGFja2V0OjpNYWtlKHRlc3RfYXZjdHBfZGF0YSwgdGVzdF9hdmN0cF9kYXRhX3BheWxvYWRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYXZjdHBfZGF0YS5zaXplKCkpOwotICBBU1NFUlRfRVEocGFja2V0LT5zaXplKCksIHRlc3RfYXZyY3BfZGF0YS5zaXplKCkpOwotfQotCi0vLyBUZXN0IHRoZSBhcnJheSBhY2Nlc3Mgb3BlcmF0b3IKLVRFU1QoUGFja2V0VGVzdCwgYXJyYXlBY2Nlc3NUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gVGVzdFBhY2tldDo6TWFrZSh0ZXN0X2wyY2FwX2RhdGEpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfbDJjYXBfZGF0YS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh0ZXN0X2wyY2FwX2RhdGFbaV0sICgqcGFja2V0KVtpXSk7Ci0gIH0KLQotICBwYWNrZXQgPSBUZXN0UGFja2V0OjpNYWtlKHRlc3RfYXZjdHBfZGF0YSwgdGVzdF9hdmN0cF9kYXRhX3BheWxvYWRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYXZjdHBfZGF0YS5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfYXZyY3BfZGF0YS5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUSh0ZXN0X2F2cmNwX2RhdGFbaV0sICgqcGFja2V0KVtpXSk7Ci0gIH0KLX0KLQotLy8gVGVzdCB0aGF0IGFjY2Vzc2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGRlZmluZWQgcGF5bG9hZCBkaWVzCi1URVNUKFBhY2tldFRlc3QsIGFycmF5QWNjZXNzRGVhdGhUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIFRlc3RQYWNrZXQ6Ok1ha2UodGVzdF9sMmNhcF9kYXRhLCAzLCB0ZXN0X2wyY2FwX2RhdGEuc2l6ZSgpIC0gMik7Ci0gIEFTU0VSVF9ERUFUSCgoKnBhY2tldClbdGVzdF9sMmNhcF9kYXRhLnNpemUoKV0sICIiKTsKLX0KLQotLy8gVGVzdCB0aGF0IHRoZSBpdGVyYXRvciBhbmQgYXJyYXkgYWNjZXNzIG9wZXJhdG9yIHJldHVybiB0aGUgc2FtZSBkYXRhCi1URVNUKFBhY2tldFRlc3QsIGl0ZXJhdG9yVGVzdCkgewotICBhdXRvIHBhY2tldCA9IFRlc3RQYWNrZXQ6Ok1ha2UoCi0gICAgICB0ZXN0X2F2Y3RwX2RhdGEsIHRlc3RfYXZjdHBfZGF0YV9wYXlsb2FkX29mZnNldCwgdGVzdF9hdmN0cF9kYXRhLnNpemUoKSk7Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBkYXRhIG1hdGNoZXMKLSAgYXV0byBpdCA9IHBhY2tldC0+YmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWNrZXQtPnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKCgqcGFja2V0KVtpXSwgKml0KyspOwotICB9Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpdGVyYXRvciBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YQotICBBU1NFUlRfRVEoaXQsIHBhY2tldC0+ZW5kKCkpOwotfQotCi1jbGFzcyBDaGlsZFRlc3RQYWNrZXQgOiBwdWJsaWMgVGVzdFBhY2tldCB7Ci0gcHVibGljOgotICB1c2luZyBUZXN0UGFja2V0OjpUZXN0UGFja2V0OwotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIkNoaWxkVGVzdFBhY2tldCI7IH07Ci19OwotCi0vLyBUZXN0IHNwZWNpYWxpemluZyBhIHBhY2tldCB0byBhbm90aGVyIHBhY2tldCB0eXBlCi1URVNUKFBhY2tldFRlc3QsIHNwZWNpYWxpemVUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gVGVzdFBhY2tldDo6TWFrZSh0ZXN0X2wyY2FwX2RhdGEpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxDaGlsZFRlc3RQYWNrZXQ+IHNwZWNpYWxpemVkX3BhY2tldCA9Ci0gICAgICBQYWNrZXQ6OlNwZWNpYWxpemU8Q2hpbGRUZXN0UGFja2V0PihwYWNrZXQpOwotCi0gIC8vIFRlc3QgdGhhdCB0aGUgbmV3IHBhY2tldCBpcyBhbiBpbnN0YW5jZSBvZiBDaGlsZFRlc3RQYWNrZXQKLSAgQVNTRVJUX0VRKHNwZWNpYWxpemVkX3BhY2tldC0+VG9TdHJpbmcoKSwgIkNoaWxkVGVzdFBhY2tldCIpOwotCi0gIC8vIFRlc3QgdGhhdCB0aGUgdW5kZXJseWluZyBkYXRhIGlzIHRoZSBzYW1lIGFuZCBubyBjb3B5IHRvb2sgcGxhY2UKLSAgQVNTRVJUX0VRKCZzcGVjaWFsaXplZF9wYWNrZXQtPkdldERhdGEoKSwgJnBhY2tldC0+R2V0RGF0YSgpKTsKLX0KLQotLy8gVGVzdCB0aGF0IHdoZW4gdGhlIHBhY2tldCBnb2VzIG91dCBvZiBzY29wZSwgdGhhdCB0aGUgdW5kZXJseWluZyBtZW1vcnkgaXMKLS8vIGZyZWVkCi1URVNUKFBhY2tldFRlc3QsIG1lbW9yeUZyZWVUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gVGVzdFBhY2tldDo6TWFrZSh0ZXN0X2wyY2FwX2RhdGEpOwotICBzdGQ6OndlYWtfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBkYXRhX3B0cihwYWNrZXQtPkdldERhdGFQb2ludGVyKCkpOwotCi0gIEFTU0VSVF9GQUxTRShkYXRhX3B0ci5leHBpcmVkKCkpOwotCi0gIHBhY2tldC5yZXNldCgpOwotCi0gIEFTU0VSVF9UUlVFKGRhdGFfcHRyLmV4cGlyZWQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvYmFzZS9wYWNrZXRfdGVzdF9jb21tb24uaCBiL3BhY2tldC90ZXN0cy9iYXNlL3BhY2tldF90ZXN0X2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjMwMmVmLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9iYXNlL3BhY2tldF90ZXN0X2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotLy8gV2UgaGF2ZSBvdXIgb3duIGRlZmluaXRpb24gb2YgbG9naGV4IHRvIGF2b2lkIGRlcGVuZGVuY2llcwotbmFtZXNwYWNlIHsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjpzdHJpbmcgbG9naGV4KFQgeCkgewotICBzdGQ6OnN0cmluZ3N0cmVhbSB0bXA7Ci0gIHRtcCA8PCAiMHgiIDw8IHN0ZDo6aW50ZXJuYWwgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykKLSAgICAgIDw8IHN0ZDo6c2V0dyhzaXplb2YoVCkgKiAyKSA8PCAodW5zaWduZWQgaW50KXg7Ci0gIHJldHVybiB0bXAuc3RyKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIFBhY2tldEltcGwgOiBwdWJsaWMgUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHVzaW5nIFBhY2tldDo6UGFja2V0OyAgLy8gSW5oZXJpdCBjb25zdHJ1Y3RvcnMKLQotICB2aXJ0dWFsIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJUZXN0UGFja2V0OiBTdGFydCA9ICIgPDwgcGFja2V0X3N0YXJ0X2luZGV4XwotICAgICAgIDw8ICIgOiBFbmQgPSAiIDw8IHBhY2tldF9lbmRfaW5kZXhfIDw8IHN0ZDo6ZW5kbDsKLSAgICBzcyA8PCAiICDilJQgUGF5bG9hZCA9IjsKLSAgICBmb3IgKGF1dG8gaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgaXQrKykgewotICAgICAgc3MgPDwgIiAiIDw8IGxvZ2hleCgqaXQpOwotICAgIH0KLSAgICBzcyA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gc3Muc3RyKCk7Ci0gIH07Ci0KLSAgdmlydHVhbCBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IEdldFBheWxvYWRJbmRlY2llcygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PihwYWNrZXRfc3RhcnRfaW5kZXhfLCBwYWNrZXRfZW5kX2luZGV4Xyk7Ci0gIH0KLX07Ci0KLXVzaW5nIFRlc3RQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxQYWNrZXRJbXBsPjsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBoYXMgcHVibGljIGFjY2Vzc29ycyB0byBwcm90ZWN0ZWQgbWV0aG9kcwotY2xhc3MgVGVzdFBhY2tldEJ1aWxkZXIgOiBwdWJsaWMgUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRlc3RQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIobmV3IFRlc3RQYWNrZXRCdWlsZGVyKGRhdGEpKTsKLSAgICByZXR1cm4gYnVpbGRlcjsKLSAgfTsKLQotICAvLyBNYWtlIGFsbCB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgcHVibGljCi0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OlJlc2VydmVTcGFjZTsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czE7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHMyOwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzMzsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czQ7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHM2OwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzODsKLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGRhdGFfLnNpemUoKTsgfTsKLQotICBib29sIFNlcmlhbGl6ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UGFja2V0PiYgcGt0KSBvdmVycmlkZSB7Ci0gICAgUmVzZXJ2ZVNwYWNlKHBrdCwgc2l6ZSgpKTsKLQotICAgIGZvciAodWludDhfdCBieXRlIDogZGF0YV8pIHsKLSAgICAgIEFkZFBheWxvYWRPY3RldHMxKHBrdCwgYnl0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBUZXN0UGFja2V0QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSA6IGRhdGFfKGRhdGEpe307Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzhjZTguLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDc1NyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiYXZyY3BfYnJvd3NlX3BhY2tldF9mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiYXZyY3BfYnJvd3NlX3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvYXZyY3BfYnJvd3NlX3BhY2tldHNfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJjaGFuZ2VfcGF0aF9yZXFfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotICAgIC8vc3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UiCi0gICAgc3JjczogWwotICAgICAgICAiY2hhbmdlX3BhdGhfcmVxX2Z1enplci5jYyIsCi0KLSAgICBdLAotCi0gICAgY29ycHVzOiBbImNvcnB1cy9jaGFuZ2VfcGF0aF9yZXFfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJnZXRfY2FwYWJpbGl0aWVzX3JlcV9mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJnZXRfY2FwYWJpbGl0aWVzX3JlcV9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvZ2V0X2NhcGFiaWxpdGllc19yZXFfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJnZXRfY2FwYWJpbGl0aWVzX3Jlc19mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJnZXRfY2FwYWJpbGl0aWVzX3Jlc19mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvZ2V0X2NhcGFiaWxpdGllc19yZXNfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcV9mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcV9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXFfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJnZXRfcGxheV9zdGF0dXNfcmVxX2Z1enplciIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0LyIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cyIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzL2F2cmNwIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvYmFzZSIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgImdldF9wbGF5X3N0YXR1c19yZXFfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiZ2V0X3BsYXlfc3RhdHVzX3JlcV9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxX2Z1enplciIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0LyIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cyIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzL2F2cmNwIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvYmFzZSIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgImdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxX2Z1enplci5jYyIsCi0KLSAgICBdLAotCi0gICAgY29ycHVzOiBbImNvcnB1cy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcV9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInBhc3NfdGhyb3VnaF9wYWNrZXRfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAicGFzc190aHJvdWdoX3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvcGFzc190aHJvdWdoX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInBsYXlfaXRlbV9wYWNrZXRfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAicGxheV9pdGVtX3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvcGxheV9pdGVtX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInJlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAicmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInNldF9hYnNvbHV0ZV92b2x1bWVfcGFja2V0X2Z1enplciIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0LyIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cyIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzL2F2cmNwIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvYmFzZSIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInNldF9hYnNvbHV0ZV92b2x1bWVfcGFja2V0X2Z1enplci5jYyIsCi0KLSAgICBdLAotCi0gICAgY29ycHVzOiBbImNvcnB1cy9zZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInNldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF9mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzZXRfYWRkcmVzc2VkX3BsYXllcl9wYWNrZXRfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL3NldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInNldF9icm93c2VkX3BsYXllcl9yZXFfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAic2V0X2Jyb3dzZWRfcGxheWVyX3JlcV9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvc2V0X2Jyb3dzZWRfcGxheWVyX3JlcV9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInZlbmRvcl9wYWNrZXRfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAidmVuZG9yX3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvdmVuZG9yX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImF2cmNwX3BhY2tldF9mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJhdnJjcF9wYWNrZXRfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL2F2cmNwX3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogInJlamVjdF9wYWNrZXRfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAicmVqZWN0X3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvcmVqZWN0X3BhY2tldF9jb3JwdXMvKiJdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLURCVUlMRENGRyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImdldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxX2Z1enplciIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0LyIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cyIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzL2F2cmNwIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvYmFzZSIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgImdldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxX3BhY2tldF9mdXp6ZXIuY2MiLAotCi0gICAgXSwKLQotICAgIGNvcnB1czogWyJjb3JwdXMvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXFfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJjaGFuZ2VfcGF0aF9yZXNfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiY2hhbmdlX3BhdGhfcmVzX2Z1enplci5jYyIsCi0KLSAgICBdLAotCi0gICAgY29ycHVzOiBbImNvcnB1cy9jaGFuZ2VfcGF0aF9yZXNfY29ycHVzLyoiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERDRkciLAotICAgIF0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3Jlc19mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3Jlc19wYWNrZXRfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVzX2NvcnB1cy8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiZ2V0X2ZvbGRlcl9pdGVtc19yZXNfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiZ2V0X2ZvbGRlcl9pdGVtc19yZXNfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVzX2NvcnB1cy8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiZ2V0X2ZvbGRlcl9pdGVtc19yZXFfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiZ2V0X2ZvbGRlcl9pdGVtc19yZXFfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxX2NvcnB1cy8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXNfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXNfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL2dldF9pdGVtX2F0dHJpYnV0ZXNfcmVzX2NvcnB1cy8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiZ2V0X3BsYXlfc3RhdHVzX3Jlc19mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJnZXRfcGxheV9zdGF0dXNfcmVzX2Z1enplci5jYyIsCi0KLSAgICBdLAotCi0gICAgY29ycHVzOiBbImNvcnB1cy9nZXRfcGxheV9zdGF0dXNfcmVzX2NvcnB1cy8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNfZnV6emVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMvYXZyY3AiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9iYXNlIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNfZnV6emVyLmNjIiwKLQotICAgIF0sCi0KLSAgICBjb3JwdXM6IFsiY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVzX2NvcnB1cy8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAic2V0X2Jyb3dzZWRfcGxheWVyX3Jlc19mdXp6ZXIiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9wYWNrZXQvdGVzdHMiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cy9hdnJjcCIsCi0gICAgICAgICJzeXN0ZW0vYnQvcGFja2V0L2Jhc2UiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzZXRfYnJvd3NlZF9wbGF5ZXJfcmVzX2Z1enplci5jYyIsCi0KLSAgICBdLAotCi0gICAgY29ycHVzOiBbImNvcnB1cy9zZXRfYnJvd3NlZF9wbGF5ZXJfcmVzX2Z1enplci8qIl0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGliLWJ0LXBhY2tldHMiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJVSUxEQ0ZHIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvYXZyY3BfYnJvd3NlX3BhY2tldF9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9hdnJjcF9icm93c2VfcGFja2V0X2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiODRiMy4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9hdnJjcF9icm93c2VfcGFja2V0X2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBBVlJDUCBCcm93c2UgUGFja2V0IFRlc3QKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF9icm93c2VfcGFja2V0LmgiCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0QnJvd3NlUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8QnJvd3NlUGFja2V0PjsKLQotLy8gYnVpbGRwYWNrZXQgdGVzdAotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Q7Ci0KLSAgLy8gRXhwZWN0ZWQgcGFja2V0IHNpemUgYnkgdGhlIGxpYnJhcnkgaXMgfjgKLSAgaWYgKHNpemUgPiAxMCkgewotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7Ci0gICAgICBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3QucHVzaF9iYWNrKGRhdGFbeF0pOwotICAgIH0KLQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdCk7Ci0KLSAgICB0ZXN0X3BhY2tldC0+R2V0UGR1KCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldExlbmd0aCgpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvYXZyY3BfcGFja2V0X2Z1enplci5jYyBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2F2cmNwX3BhY2tldF9mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2FjNzAuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvYXZyY3BfcGFja2V0X2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBhdnJjcF9wYWNrZXRfdGVzdC5jYwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImF2cmNwX3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBoYXMgcHVibGljIGFjY2Vzc29ycyB0byBwcm90ZWN0ZWQgbWV0aG9kcwotY2xhc3MgVGVzdFBhY2tldEJ1aWxkZXIgOiBwdWJsaWMgUGFja2V0QnVpbGRlciB7Ci0gcHVibGljOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRlc3RQYWNrZXRCdWlsZGVyPiBNYWtlQnVpbGRlcigKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFBhY2tldEJ1aWxkZXI+IGJ1aWxkZXIobmV3IFRlc3RQYWNrZXRCdWlsZGVyKGRhdGEpKTsKLSAgICByZXR1cm4gYnVpbGRlcjsKLSAgfQotCi0gIC8vIE1ha2UgYWxsIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucyBwdWJsaWMKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czE7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHMyOwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzMzsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6QWRkUGF5bG9hZE9jdGV0czQ7Ci0gIHVzaW5nIFBhY2tldEJ1aWxkZXI6OkFkZFBheWxvYWRPY3RldHM2OwotICB1c2luZyBQYWNrZXRCdWlsZGVyOjpBZGRQYXlsb2FkT2N0ZXRzODsKLSAgdXNpbmcgUGFja2V0QnVpbGRlcjo6UmVzZXJ2ZVNwYWNlOwotCi0gIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZGF0YV8uc2l6ZSgpOyB9OwotCi0gIGJvb2wgU2VyaWFsaXplKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+JiBwa3QpIG92ZXJyaWRlIHsKLSAgICBSZXNlcnZlU3BhY2UocGt0LCBzaXplKCkpOwotCi0gICAgZm9yICh1aW50OF90IGJ5dGUgOiBkYXRhXykgewotICAgICAgQWRkUGF5bG9hZE9jdGV0czEocGt0LCBieXRlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGV4cGxpY2l0IFRlc3RQYWNrZXRCdWlsZGVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEpIDogZGF0YV8oZGF0YSkge30KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhXzsKLX07Ci0KLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RBdnJjcFBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFBhY2tldD47Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0X3BheWxvYWQ7Ci0KLSAgaWYgKHNpemUgPj0gOCkgewotICAgIGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdC5wdXNoX2JhY2soMCk7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCA2OyB4KyspIHsKLSAgICAgIGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdF9wYXlsb2FkLnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0KLSAgICBhdXRvIGNhcF9yZXFfYnVpbGRlciA9Ci0gICAgICAgIFRlc3RQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcihnZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfcGF5bG9hZCk7Ci0KLSAgICBhdXRvIGJ1aWxkZXIgPSBQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgICAgQ1R5cGU6OlNUQVRVUywgMHgwOSwgMHgwMCwgT3Bjb2RlOjpWRU5ET1IsIHN0ZDo6bW92ZShjYXBfcmVxX2J1aWxkZXIpKTsKLQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NoYW5nZV9wYXRoX3JlcV9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jaGFuZ2VfcGF0aF9yZXFfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E4OGIyLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NoYW5nZV9wYXRoX3JlcV9mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBZGFwdGVkIGZyb20gY2hhbmdlX3BhdGhfcGFja2V0X3Rlc3QuY2MKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImNoYW5nZV9wYXRoLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdENoYW5nZVBhdGhSZXFQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxDaGFuZ2VQYXRoUmVxdWVzdD47Ci0KLS8vIEdldHRlcgotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjaGFuZ2VfcGF0aF9yZXF1ZXN0X2RhdGE7Ci0KLSAgLy8gTWluaW11bSBmb3IgdGhpcyB0eXBlIG9mIHBhY2tldCBhcHBlYXJzIHRvIGJlIDE0IGJ5dGVzLgotICBpZiAoc2l6ZSA+IDE0KSB7Ci0gICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgIGNoYW5nZV9wYXRoX3JlcXVlc3RfZGF0YS5wdXNoX2JhY2soZGF0YVt4XSk7Ci0gICAgfQotCi0gICAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RDaGFuZ2VQYXRoUmVxUGFja2V0OjpNYWtlKGNoYW5nZV9wYXRoX3JlcXVlc3RfZGF0YSk7Ci0KLSAgICB0ZXN0X3BhY2tldC0+R2V0VWlkQ291bnRlcigpOwotICAgIHRlc3RfcGFja2V0LT5HZXREaXJlY3Rpb24oKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0VWlkKCk7Ci0gICAgdGVzdF9wYWNrZXQtPklzVmFsaWQoKTsKLSAgICB0ZXN0X3BhY2tldC0+VG9TdHJpbmcoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NoYW5nZV9wYXRoX3Jlc19mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jaGFuZ2VfcGF0aF9yZXNfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjdmZjA3Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NoYW5nZV9wYXRoX3Jlc19mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBZGFwdGVkIGZyb20gY2hhbmdlX3BhdGhfcGFja2V0X3Rlc3QuY2MKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJjaGFuZ2VfcGF0aC5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RDaGFuZ2VQYXRoUmVxUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8Q2hhbmdlUGF0aFJlcXVlc3Q+OwotCi0vLyBHZXR0ZXIKLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQodWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7Ci0gIGF1dG8gYnVpbGRlciA9IENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0Q2hhbmdlUGF0aFJlcVBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9hdnJjcF9icm93c2VfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9hdnJjcF9icm93c2VfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhODdhOC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvYXZyY3BfYnJvd3NlX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvYXZyY3BfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9hdnJjcF9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M1YjMzLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9hdnJjcF9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2F2cmNwX3Rlc3RfcGFja2V0c19jb3JwdXMvdmFsaWRwYWNrZXQgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvYXZyY3BfdGVzdF9wYWNrZXRzX2NvcnB1cy92YWxpZHBhY2tldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxMzI3YS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvYXZyY3BfdGVzdF9wYWNrZXRzX2NvcnB1cy92YWxpZHBhY2tldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9jaGFuZ2VfcGF0aF9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0IGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2NoYW5nZV9wYXRoX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTMyN2EuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2NoYW5nZV9wYXRoX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvZ2VuZXJhdGVfY29ycHVzLnNoIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2dlbmVyYXRlX2NvcnB1cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0ODU3NS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvZ2VuZXJhdGVfY29ycHVzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotbWtkaXIgYXZyY3BfYnJvd3NlX3BhY2tldF9jb3JwdXMKLW1rZGlyIGNoYW5nZV9wYXRoX3JlcV9jb3JwdXMKLW1rZGlyIGdldF9jYXBhYmlsaXRpZXNfcmVxX2NvcnB1cwotbWtkaXIgZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXFfY29ycHVzCi1ta2RpciBnZXRfcGxheV9zdGF0dXNfcmVxX2NvcnB1cwotbWtkaXIgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXFfY29ycHVzCi1ta2RpciBwYXNzX3Rocm91Z2hfcGFja2V0X2NvcnB1cwotbWtkaXIgcGxheV9pdGVtX3BhY2tldF9jb3JwdXMKLW1rZGlyIHJlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfY29ycHVzCi1ta2RpciBzZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF9jb3JwdXMKLW1rZGlyIHNldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF9jb3JwdXMKLW1rZGlyIHNldF9icm93c2VkX3BsYXllcl9yZXFfY29ycHVzCi1ta2RpciB2ZW5kb3JfcGFja2V0X2NvcnB1cwotbWtkaXIgYXZyY3BfcGFja2V0X2NvcnB1cwotbWtkaXIgcmVqZWN0X3BhY2tldF9jb3JwdXMKLSNOZXcgb25lcwotbWtkaXIgY2hhbmdlX3BhdGhfcmVzX2NvcnB1cwotbWtkaXIgZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXFfcGFja2V0X2NvcnB1cwotbWtkaXIgZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXNfcGFja2V0X2NvcnB1cwotbWtkaXIgZ2V0X2ZvbGRlcl9pdGVtc19yZXNfY29ycHVzCi1ta2RpciBnZXRfZm9sZGVyX2l0ZW1zX3JlcV9jb3JwdXMKLW1rZGlyIGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVzX2NvcnB1cwotbWtkaXIgZ2V0X3BsYXlfc3RhdHVzX3Jlc19jb3JwdXMKLW1rZGlyIGdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVzX2NvcnB1cwotbWtkaXIgc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc19jb3JwdXMKLQotZWNobyAtbiAtZSAnXHg3MSxceDAwLFx4MGEsXHgwMCxceDAwLFx4MDAsXHgwMCxceDAwLFx4MDAsXHgwMCxceDAwLFx4MDMsXHgwMCcgPiBhdnJjcF9icm93c2VfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnXHg3Mlx4MDBceDBiXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDInID4gY2hhbmdlX3BhdGhfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnXHg3Mlx4MDBceDBiXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDInID4gZ2V0X2NhcGFiaWxpdGllc19yZXFfY29ycHVzL3ZhbGlkcGFja2V0Ci1lY2hvIC1uIC1lICdceDczXHgwMFx4MjhceDAzXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDFceDAwXHgwMFx4MDdceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDNceDAwXHgwMFx4MDBceDA0XHgwMFx4MDBceDAwXHgwNVx4MDBceDAwXHgwMFx4MDZceDAwXHgwMFx4MDBceDA3JyA+IGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxX2NvcnB1cy92YWxpZHBhY2tldCAKLWVjaG8gLW4gLWUgJ1x4MDFceDQ4XHgwMFx4MDBceDE5XHg1OFx4MzBceDAwXHgwMFx4MDAnID4gZ2V0X3BsYXlfc3RhdHVzX3JlcV9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJ1x4NzVceDAwXHgwMCcgPiBnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcV9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJ1x4MDBceDQ4XHg3Y1x4NDRceDAwJyA+IHBhc3NfdGhyb3VnaF9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0Ci1lY2hvIC1uIC1lICdceDAwXHg0OFx4MDBceDAwXHgxOVx4NThceDc0XHgwMFx4MDBceDBiXHgwM1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAzXHgwMFx4MDAnID4gcGxheV9pdGVtX3JlcV9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJ1x4MDNceDQ4XHgwMFx4MDBceDE5XHg1OFx4MzFceDAwXHgwMFx4MDRceDAwXHgwMFx4MDBceDAwJyA+IHJlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0Ci1lY2hvIC1uIC1lICdceDAwXHg0OFx4MDBceDAwXHgxOVx4NThceDUwXHgwMFx4MDBceDAxXHg0OCcgPiBzZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJ1x4MDBceDQ4XHgwMFx4MDBceDE5XHg1OFx4NjBceDAwXHgwMFx4MDAnID4gc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnXHg3MFx4MDBceDAyXHgwMFx4MDInID4gc2V0X2Jyb3dzZWRfcGxheWVyX3JlcV9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJ1x4MDFceDQ4XHgwMFx4MDBceDE5XHg1OFx4MTBceDAwXHgwMFx4MDEnID4gdmVuZG9yX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJ1x4MDFceDQ4XHgwMFx4MDBceDE5XHg1OFx4MTBceDAwXHgwMFx4MDAnID4gYXZyY3BfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAotCi0jbmV3IG9uZXMgCi0KLWVjaG8gLW4gLWUgJzB4MDEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAnID4gZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXFfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCcgPiBnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3Jlc19wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0Ci1lY2hvIC1uIC1lICcweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDIwLCAweDAwLCAweDAwLCAweDAwJyA+IGdldF9mb2xkZXJfaXRlbXNfcmVzX2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCcgPiBnZXRfZm9sZGVyX2l0ZW1zX3JlcV9jb3JwdXMvdmFsaWRwYWNrZXQKLWVjaG8gLW4gLWUgJzB4MDEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAnID4gZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXNfY29ycHVzL3ZhbGlkcGFja2V0Ci1lY2hvIC1uIC1lICcweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDIwLCAweDAwLCAweDAwLCAweDAwJyA+IGdldF9wbGF5X3N0YXR1c19yZXNfY29ycHVzL3ZhbGlkcGFja2V0Ci1lY2hvIC1uIC1lICcweDAxLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDIwLCAweDAwLCAweDAwLCAweDAwJyA+IGdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVzX2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCcgPiBzZXRfYnJvd3NlZF9wbGF5ZXJfcmVzX2NvcnB1cy92YWxpZHBhY2tldAotZWNobyAtbiAtZSAnMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg1OCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCcgPiBjaGFuZ2VfcGF0aF9yZXNfY29ycHVzL3ZhbGlkcGFja2V0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTMyN2EuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcwNmI4Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvZ2V0X3BsYXlfc3RhdHVzX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTFhNDcuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2dldF9wbGF5X3N0YXR1c19wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfY29ycHVzL3ZhbGlkcGFja2V0IGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzYzNGUyLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX2NvcnB1cy92YWxpZHBhY2tldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9wYXNzX3Rocm91Z2hfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9wYXNzX3Rocm91Z2hfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMDJkMi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvcGFzc190aHJvdWdoX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvcGxheV9pdGVtX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvcGxheV9pdGVtX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOGE3YzAuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL3BsYXlfaXRlbV9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0IGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTIxM2YwLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9zZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvc2V0X2Fic29sdXRlX3ZvbHVtZV9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDAzYjg0Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9zZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9zZXRfYWRkcmVzc2VkX3BsYXllcl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODcyZDZiLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9zZXRfYWRkcmVzc2VkX3BsYXllcl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL3NldF9icm93c2VkX3BsYXllcl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0IGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvY29ycHVzL3NldF9icm93c2VkX3BsYXllcl9wYWNrZXRfY29ycHVzL3ZhbGlkcGFja2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjcxMzdiLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9zZXRfYnJvd3NlZF9wbGF5ZXJfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy92ZW5kb3JfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldCBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy92ZW5kb3JfcGFja2V0X2NvcnB1cy92YWxpZHBhY2tldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyYTY2ZS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9jb3JwdXMvdmVuZG9yX3BhY2tldF9jb3JwdXMvdmFsaWRwYWNrZXQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfY2FwYWJpbGl0aWVzX3JlcV9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfY2FwYWJpbGl0aWVzX3JlcV9mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDNkMGMuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2NhcGFiaWxpdGllc19yZXFfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWRhcHRlZCBmcm9tIGdldF9jYXBhYmlsaXRpZXNfcGFja2V0X3Rlc3QKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJjYXBhYmlsaXRpZXNfcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgR2V0Q2FwUmVxdWVzdFRlc3RQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0PjsKLQotLy8gVGVzdCBwYXJzaW5nIGEgR2V0Q2FwYWJpbGl0aWVzIFJlcXVlc3QKLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0OwotICAvLyBXZSB3aWxsIHVzZSBzdGFiaWxpdHkgdGVzdGluZyB0byBzZWUgdGhlIHNlbnNpYmxlIG1heCBzaXplIGZvciBmdXp6aW5nLgotICAvLyBNYXggQlQgcGFja2V0IHNpemUgPSAyNTEKLSAgLy8gRXhwZWN0ZWQgcGFja2V0IHNpemUgYnkgdGhlIGxpYnJhcnkgaXMgfiAxMAotICBpZiAoc2l6ZSA+PSAxMikgewotICAgIGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdC5wdXNoX2JhY2soMCk7Ci0gICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgIGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdC5wdXNoX2JhY2soZGF0YVt4XSk7Ci0gICAgfQotCi0gICAgYXV0byB0ZXN0X3BhY2tldCA9IEdldENhcFJlcXVlc3RUZXN0UGFja2V0OjpNYWtlKGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldENhcGFiaWxpdHlSZXF1ZXN0ZWQoKTsKLSAgICB0ZXN0X3BhY2tldC0+SXNWYWxpZCgpOwotICAgIHRlc3RfcGFja2V0LT5Ub1N0cmluZygpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2NhcGFiaWxpdGllc19yZXNfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2NhcGFiaWxpdGllc19yZXNfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFjZGExLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2dldF9jYXBhYmlsaXRpZXNfcmVzX2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImNhcGFiaWxpdGllc19wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi0vLyBUZXN0IHBhcnNpbmcgYSBHZXRDYXBhYmlsaXRpZXMgUmVxdWVzdAotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dCh1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKLSAgYXV0byBidWlsZGVyID0gR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQ29tcGFueUlkQnVpbGRlcigKLSAgICAgIGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKLSAgYnVpbGRlci0+QWRkQ29tcGFueUlkKGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKLSAgYnVpbGRlci0+QWRkQ29tcGFueUlkKGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKLQotICBidWlsZGVyID0gR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlRXZlbnRzU3VwcG9ydGVkQnVpbGRlcigKLSAgICAgIEV2ZW50OjpQTEFZQkFDS19TVEFUVVNfQ0hBTkdFRCk7Ci0gIGJ1aWxkZXItPkFkZEV2ZW50KEV2ZW50OjpUUkFDS19DSEFOR0VEKTsKLSAgYnVpbGRlci0+QWRkRXZlbnQoRXZlbnQ6OlBMQVlCQUNLX1BPU19DSEFOR0VEKTsKLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcV9wYWNrZXRfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXFfcGFja2V0X2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjMDM4Zi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcV9wYWNrZXRfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RHZXRFbGVtQXR0clJlcVBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdD47Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGw7Ci0KLSAgLy8gRXhwZWN0ZWQgcGFja2V0IHNpemUgYnkgdGhlIGxpYnJhcnkgaXMgfjEwCi0gIGlmIChzaXplID49IDEwKSB7Ci0gICAgZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwucHVzaF9iYWNrKDApOwotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7Ci0gICAgICBnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfZnVsbC5wdXNoX2JhY2soZGF0YVt4XSk7Ci0gICAgfQotCi0gICAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICAgIFRlc3RHZXRFbGVtQXR0clJlcVBhY2tldDo6TWFrZShnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfZnVsbCk7Ci0gICAgaWYgKCF0ZXN0X3BhY2tldC0+SXNWYWxpZCgpKSByZXR1cm4gMDsKLSAgICB0ZXN0X3BhY2tldC0+R2V0SWRlbnRpZmllcigpOwotICAgIGF1dG8gdHBTdHJpbmcgPSB0ZXN0X3BhY2tldC0+VG9TdHJpbmcoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVzX3BhY2tldF9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3Jlc19wYWNrZXRfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkwZWFhLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVzX3BhY2tldF9mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RHZXRFbGVtQXR0clJlcVBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdD47Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQodWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgYXV0byBidWlsZGVyID0gR2V0RWxlbWVudEF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4RkZGRik7Ci0gIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOwotICBzdGQ6OnN0cmluZyBzID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmVtYWluaW5nQnl0ZXNBc1N0cmluZygpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCBzKTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgcyk7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgcyk7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSLCBzKTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTLCBzKTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgcyk7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6UExBWUlOR19USU1FLCBzKTsKLQotICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdEdldEVsZW1BdHRyUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIHRlc3RfcGFja2V0LT5HZXREYXRhKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2ZvbGRlcl9pdGVtc19yZXFfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2ZvbGRlcl9pdGVtc19yZXFfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI0NzhjLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2dldF9mb2xkZXJfaXRlbXNfcmVxX2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBnZXRfZm9sZGVyX2l0ZW1zX3BhY2tldF90ZXN0Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJnZXRfZm9sZGVyX2l0ZW1zLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEdldEZvbGRlckl0ZW1zUmVxUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8R2V0Rm9sZGVySXRlbXNSZXF1ZXN0PjsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfdmZzOwotCi0gIC8vIFN0YXJ0cyBsYXJnZSB0byBhdm9pZCB0aHJvd2luZyBleGNlcHRpb25zCi0gIGlmIChzaXplID49IDM0KSB7Ci0gICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgIGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF92ZnMucHVzaF9iYWNrKGRhdGFbeF0pOwotICAgIH0KLQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgICBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQ6Ok1ha2UoZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3Zmcyk7Ci0KLSAgICB0ZXN0X3BhY2tldC0+R2V0U2NvcGUoKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0U3RhcnRJdGVtKCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldEVuZEl0ZW0oKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0TnVtQXR0cmlidXRlcygpOwotICAgIHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCk7Ci0gICAgdGVzdF9wYWNrZXQtPlRvU3RyaW5nKCk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfZm9sZGVyX2l0ZW1zX3Jlc19mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfZm9sZGVyX2l0ZW1zX3Jlc19mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTUyNTIuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2ZvbGRlcl9pdGVtc19yZXNfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWRhcHRlZCBmcm9tIGdldF9mb2xkZXJfaXRlbXNfcGFja2V0X3Rlc3QKLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImdldF9mb2xkZXJfaXRlbXMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxHZXRGb2xkZXJJdGVtc1JlcXVlc3Q+OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIGF1dG8gYnVpbGRlciA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlTm93UGxheWluZ0J1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIHN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PiBhdHRyaWJ1dGVzOwotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKLSAgc3RkOjpzdHJpbmcgcyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJlbWFpbmluZ0J5dGVzQXNTdHJpbmcoKTsKLSAgYXR0cmlidXRlcy5pbnNlcnQoQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgcykpOwotICBhdXRvIHNvbmcgPSBNZWRpYUVsZW1lbnRJdGVtKDB4MDIsIHMsIGF0dHJpYnV0ZXMpOwotICBidWlsZGVyLT5BZGRTb25nKHNvbmcpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlci0+U2VyaWFsaXplKHRlc3RfcGFja2V0KTsKLSAgdGVzdF9wYWNrZXQtPkdldERhdGEoKTsKLQotICAvLyBTZWNvbmQgdGVzdCB3aXRoIHRoZSBzYW1lIGRhdGEuCi0gIGF1dG8gYnVpbGRlcjIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVZGU0J1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIGF1dG8gZm9sZGVyID0gRm9sZGVySXRlbSgweDAwMDAwMDAwMDAwMDAwMDEsIDB4MDAsIHRydWUsIHMpOwotICBidWlsZGVyMi0+QWRkRm9sZGVyKGZvbGRlcik7Ci0KLSAgdGVzdF9wYWNrZXQgPSBUZXN0R2V0Rm9sZGVySXRlbXNSZXFQYWNrZXQ6Ok1ha2UoKTsKLSAgYnVpbGRlcjItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0gIHRlc3RfcGFja2V0LT5HZXREYXRhKCk7Ci0KLSAgLy8gVGhpcmQgdGVzdCB3aXRoIHRoZSBzYW1lIGRhdGEuCi0gIE1lZGlhUGxheWVySXRlbSBwbGF5ZXIxKDEsIHMsIHRydWUpOwotCi0gIC8vIEJyb3dzaW5nIEhlYWRlciArIFN0YXR1cyBmaWVsZCArIFVJRCBDb3VudGVyIGZpZWxkICsgTnVtYmVyIG9mIEl0ZW1zCi0gIC8vIGZpZWxkCi0gIGF1dG8gcGFja2V0X3NpemUgPSBCcm93c2VQYWNrZXQ6OmtNaW5TaXplKCkgKyA1OwotICBwYWNrZXRfc2l6ZSArPSBwbGF5ZXIxLnNpemUoKTsKLQotICBhdXRvIGJ1aWxkZXIzID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgcGFja2V0X3NpemUpOwotCi0gIGJ1aWxkZXIzLT5BZGRNZWRpYVBsYXllcihwbGF5ZXIxKTsKLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcV9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcV9mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZmRjZDMuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXFfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWRhcHRlZCBmcm9tIGdldF9pdGVtX2F0dHJpYnV0ZXNfcGFja2V0X3Rlc3QKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJnZXRfaXRlbV9hdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEdldEl0ZW1BdHRyc1JlcVBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdD47Ci0KLS8vIEJ1aWxkZXIgcGFja2V0LgotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdDsKLQotICBpZiAoc2l6ZSA+IDQ0KSB7Ci0gICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgIGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdC5wdXNoX2JhY2soZGF0YVt4XSk7Ci0gICAgfQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgICBUZXN0R2V0SXRlbUF0dHJzUmVxUGFja2V0OjpNYWtlKGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdCk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3Jlc19mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3Jlc19mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTBmYjUuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXNfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWRhcHRlZCBmcm9tIGdldF9pdGVtX2F0dHJpYnV0ZXNfcGFja2V0X3Rlc3QKLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgImdldF9pdGVtX2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0R2V0SXRlbUF0dHJzUmVxUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8R2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0PjsKLQotLy8gQnVpbGRlciBwYWNrZXQuCi0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQodWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7Ci0gIHN0ZDo6c3RyaW5nIHMgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSZW1haW5pbmdCeXRlc0FzU3RyaW5nKCk7Ci0gIGF1dG8gYnVpbGRlciA9Ci0gICAgICBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUiwgMHhGRkZGKTsKLSAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgcyk7Ci0gIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsIHMpOwotICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsIHMpOwotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0SXRlbUF0dHJzUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X3BsYXlfc3RhdHVzX3JlcV9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfcGxheV9zdGF0dXNfcmVxX2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjNTQ5ZS4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfcGxheV9zdGF0dXNfcmVxX2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBnZXRfcGxheV9zdGF0dXNfcGFja2V0X3Rlc3QuY2MKLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiZ2V0X3BsYXlfc3RhdHVzX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RHZXRQbGF5U3RhdHVzUnNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFja2V0PjsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dCh1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKLQotICBhdXRvIGJ1aWxkZXIgPSBHZXRQbGF5U3RhdHVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIDAsIGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpLCAwKTsKLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRQbGF5U3RhdHVzUnNwUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X3BsYXlfc3RhdHVzX3Jlc19mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfcGxheV9zdGF0dXNfcmVzX2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhZGZiMy4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfcGxheV9zdGF0dXNfcmVzX2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBnZXRfcGxheV9zdGF0dXNfcGFja2V0X3Rlc3QuY2MKLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiZ2V0X3BsYXlfc3RhdHVzX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RHZXRQbGF5U3RhdHVzUnNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFja2V0PjsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dCh1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKLSAgYXV0byBidWlsZGVyID0gR2V0UGxheVN0YXR1c1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICAwLCBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSwgMCk7Ci0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0UGxheVN0YXR1c1JzcFBhY2tldDo6TWFrZSgpOwotICBidWlsZGVyLT5TZXJpYWxpemUodGVzdF9wYWNrZXQpOwotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxX2Z1enplci5jYyBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxX2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyOTBiMC4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcV9mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBZGFwdGVkIGZyb20gZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc190ZXN0Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAiZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtcy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RHZXRUb3RhbE51bUl0ZW1zUmVxUGFja2V0ID0KLSAgICBUZXN0UGFja2V0VHlwZTxHZXRUb3RhbE51bWJlck9mSXRlbXNSZXF1ZXN0PjsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmc7Ci0KLSAgLy8gRXhwZWN0ZWQgcGFja2V0IHNpemUgYnkgdGhlIGxpYnJhcnkgaXMgfjQKLSAgaWYgKHNpemUgPj0gOCkgewotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7Ci0gICAgICBnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmcucHVzaF9iYWNrKGRhdGFbeF0pOwotICAgIH0KLQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0R2V0VG90YWxOdW1JdGVtc1JlcVBhY2tldDo6TWFrZSgKLSAgICAgICAgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0U2NvcGUoKTsKLSAgICB0ZXN0X3BhY2tldC0+SXNWYWxpZCgpOwotICAgIHRlc3RfcGFja2V0LT5HZXREYXRhKCk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3Jlc19mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3Jlc19mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NTZkMzIuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWRhcHRlZCBmcm9tIGdldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfdGVzdAotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdEdldFRvdGFsTnVtSXRlbXNSZXFQYWNrZXQgPQotICAgIFRlc3RQYWNrZXRUeXBlPEdldFRvdGFsTnVtYmVyT2ZJdGVtc1JlcXVlc3Q+OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOwotICBhdXRvIGJ1aWxkZXIgPSBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCksCi0gICAgICBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7Ci0KLSAgYXV0byB0ZXN0X3BhY2tldCA9IFRlc3RHZXRUb3RhbE51bUl0ZW1zUmVxUGFja2V0OjpNYWtlKCk7Ci0gIGJ1aWxkZXItPlNlcmlhbGl6ZSh0ZXN0X3BhY2tldCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvcGFzc190aHJvdWdoX3BhY2tldF9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9wYXNzX3Rocm91Z2hfcGFja2V0X2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiNDhiZi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9wYXNzX3Rocm91Z2hfcGFja2V0X2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBwYXNzX3Rocm91Z2hfcGFja2V0X2Z1enplci5jYwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotI2luY2x1ZGUgInBhc3NfdGhyb3VnaF9wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0UGFzc1Rocm91Z2hQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxQYXNzVGhyb3VnaFBhY2tldD47Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQ7Ci0KLSAgLy8gRXhwZWN0ZWQgcGFja2V0IHNpemUgYnkgdGhlIGxpYnJhcnkgaXMgfjUKLSAgaWYgKHNpemUgPj0gMTApIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgcGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQucHVzaF9iYWNrKGRhdGFbeF0pOwotICAgIH0KLQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgICBUZXN0UGFzc1Rocm91Z2hQYWNrZXQ6Ok1ha2UocGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQpOwotICAgIHRlc3RfcGFja2V0LT5HZXRLZXlTdGF0ZSgpOwotICAgIHRlc3RfcGFja2V0LT5HZXRPcGVyYXRpb25JZCgpOwotCi0gICAgdGVzdF9wYWNrZXQgPQotICAgICAgICBUZXN0UGFzc1Rocm91Z2hQYWNrZXQ6Ok1ha2UocGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9yZWxlYXNlZCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldEtleVN0YXRlKCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldE9wZXJhdGlvbklkKCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldERhdGEoKTsKLSAgICB0ZXN0X3BhY2tldC0+SXNWYWxpZCgpOwotICAgIHRlc3RfcGFja2V0LT5Ub1N0cmluZygpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvcGxheV9pdGVtX3BhY2tldF9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9wbGF5X2l0ZW1fcGFja2V0X2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwNTdiMy4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9wbGF5X2l0ZW1fcGFja2V0X2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBwbGF5X2l0ZW1fcGFja2V0X3Rlc3QuY2MKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLSNpbmNsdWRlICJwbGF5X2l0ZW0uaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0UGxheUl0ZW1SZXFQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxQbGF5SXRlbVJlcXVlc3Q+OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBsYXlfaXRlbV9yZXF1ZXN0OwotCi0gIC8vIFdlIHdpbGwgdXNlIHN0YWJpbGl0eSB0ZXN0aW5nIHRvIHNlZSB0aGUgc2Vuc2libGUgbWF4IHNpemUgZm9yIGZ1enppbmcuCi0gIC8vIE1heCBCVCBwYWNrZXQgc2l6ZSA9IDI1MQotICAvLyBFeHBlY3RlZCBwYWNrZXQgc2l6ZSBieSB0aGUgbGlicmFyeSBpcyB+MjEgYnV0IHByZXZpb3VzIHRlc3RzIGFjY291bnQgZm9yCi0gIC8vIGFzIGxvdyBhcyA0Ci0gIGlmIChzaXplID49IDIxKSB7Ci0gICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgIHBsYXlfaXRlbV9yZXF1ZXN0LnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0KLSAgICBhdXRvIHRlc3RfcGFja2V0ID0gVGVzdFBsYXlJdGVtUmVxUGFja2V0OjpNYWtlKHBsYXlfaXRlbV9yZXF1ZXN0KTsKLQotICAgIHRlc3RfcGFja2V0LT5HZXRTY29wZSgpOwotICAgIHRlc3RfcGFja2V0LT5HZXRVaWQoKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0VWlkQ291bnRlcigpOwotICAgIHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldERhdGEoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9wYWNrZXRfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF9mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzI4ZDAuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF9mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBZGFwdGVkIGZyb20gcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldF90ZXN0LmNjCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAicmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RSZWdOb3RpZlJlcVBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdD47Ci11c2luZyBUZXN0UmVnTm90aWZSc3BQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlPjsKLS8vIGFzIHNtYWxsIGFzIDQKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZWdpc3Rlcl9wbGF5X3N0YXR1c19ub3RpZmljYXRpb247Ci0KLSAgLy8gV2Ugd2lsbCB1c2Ugc3RhYmlsaXR5IHRlc3RpbmcgdG8gc2VlIHRoZSBzZW5zaWJsZSBtYXggc2l6ZSBmb3IgZnV6emluZy4KLSAgLy8gTWF4IEJUIHBhY2tldCBzaXplID0gMjUxCi0gIC8vIEV4cGVjdGVkIHBhY2tldCBzaXplIGJ5IHRoZSBsaWJyYXJ5IGlzIGFzIHNtYWxsIGFzIDQuCi0gIC8vIFNlZW1zIHRvIHJhaXNlIGV4Y2VwdGlvbnMgYmVsb3cgMTUuCi0KLSAgaWYgKHNpemUgPj0gMTUpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgcmVnaXN0ZXJfcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uLnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0KLSAgICBhdXRvIHRlc3RfcGFja2V0ID0KLSAgICAgICAgVGVzdFJlZ05vdGlmUmVxUGFja2V0OjpNYWtlKHJlZ2lzdGVyX3BsYXlfc3RhdHVzX25vdGlmaWNhdGlvbik7Ci0KLSAgICB0ZXN0X3BhY2tldC0+R2V0RXZlbnRSZWdpc3RlcmVkKCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldEludGVydmFsKCk7Ci0gICAgdGVzdF9wYWNrZXQtPkdldERhdGEoKTsKLSAgICB0ZXN0X3BhY2tldC0+VG9TdHJpbmcoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3JlamVjdF9wYWNrZXRfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvcmVqZWN0X3BhY2tldF9mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjc3NDcuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvcmVqZWN0X3BhY2tldF9mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBZGFwdGVkIGZyb20gYXZyY3BfcmVqZWN0X2Z1enplci5jYwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3JlamVjdF9wYWNrZXQuaCIKLSNpbmNsdWRlICJhdnJjcF90ZXN0X3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0QXZyY3BQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxQYWNrZXQ+OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIC8vIE1pbmltdW0gc2l6ZSBpcyAxMy4KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVqZWN0ZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uOwotCi0gIGlmIChzaXplID4gMTMpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgcmVqZWN0ZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uLnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0KLSAgICBhdXRvIHRlc3RfcGFja2V0ID0KLSAgICAgICAgVGVzdEF2cmNwUGFja2V0OjpNYWtlKHJlamVjdGVkX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbik7Ci0KLSAgICB0ZXN0X3BhY2tldC0+R2V0RGF0YSgpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2Fic29sdXRlX3ZvbHVtZV9wYWNrZXRfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2Fic29sdXRlX3ZvbHVtZV9wYWNrZXRfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODcxM2E5Li4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3NldF9hYnNvbHV0ZV92b2x1bWVfcGFja2V0X2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBzZXRfYWJzb2x1dGVfdm9sdW1lX3BhY2tldF90ZXN0LmNjCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAic2V0X2Fic29sdXRlX3ZvbHVtZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RTZXRWb2x1bWVSc3BQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxTZXRBYnNvbHV0ZVZvbHVtZVJlc3BvbnNlPjsKLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXRfYWJzb2x1dGVfdm9sdW1lX3Jlc3BvbnNlOwotCi0gIC8vIFdlIHdpbGwgdXNlIHN0YWJpbGl0eSB0ZXN0aW5nIHRvIHNlZSB0aGUgc2Vuc2libGUgbWF4IHNpemUgZm9yIGZ1enppbmcuCi0gIC8vIE1heCBCVCBwYWNrZXQgc2l6ZSA9IDI1MQotICAvLyBFeHBlY3RlZCBwYWNrZXQgc2l6ZSBieSB0aGUgbGlicmFyeSBpcyB+NQotICBpZiAoc2l6ZSA+PSAxMikgewotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7Ci0gICAgICBzZXRfYWJzb2x1dGVfdm9sdW1lX3Jlc3BvbnNlLnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0gICAgYXV0byB0ZXN0X3BhY2tldCA9Ci0gICAgICAgIFRlc3RTZXRWb2x1bWVSc3BQYWNrZXQ6Ok1ha2Uoc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXNwb25zZSk7Ci0KLSAgICB0ZXN0X3BhY2tldC0+SXNWYWxpZCgpOwotICAgIHRlc3RfcGFja2V0LT5HZXRWb2x1bWUoKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0RGF0YSgpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcGFja2V0X2Z1enplci5jYyBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3NldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF9mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjc3YjYuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcGFja2V0X2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIHNldF9hZGRyZXNzZWRfcGxheWVyX3BhY2tldF90ZXN0LmNjCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAic2V0X2FkZHJlc3NlZF9wbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBUZXN0U2V0QWRkclBsYXllclBhY2tldCA9IFRlc3RQYWNrZXRUeXBlPFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3Q+OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X3NldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3Q7Ci0gIC8vIEV4cGVjdGVkIHBhY2tldCBzaXplIGJ5IHRoZSBsaWJyYXJ5IGlzIH45Ci0gIGlmIChzaXplID49IDkpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgc2hvcnRfc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdC5wdXNoX2JhY2soZGF0YVt4XSk7Ci0gICAgfQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgICBUZXN0U2V0QWRkclBsYXllclBhY2tldDo6TWFrZShzZXRfYWRkcmVzc2VkX3BsYXllcl9yZXF1ZXN0KTsKLQotICAgIHRlc3RfcGFja2V0LT5HZXRQbGF5ZXJJZCgpOwotICAgIHRlc3RfcGFja2V0LT5HZXREYXRhKCk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2Jyb3dzZWRfcGxheWVyX3JlcV9mdXp6ZXIuY2MgYi9wYWNrZXQvdGVzdHMvZnV6emVycy9zZXRfYnJvd3NlZF9wbGF5ZXJfcmVxX2Z1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NmQzZi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvZnV6emVycy9zZXRfYnJvd3NlZF9wbGF5ZXJfcmVxX2Z1enplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFkYXB0ZWQgZnJvbSBzZXRfYnJvd3NlZF9wbGF5ZXJfcGFja2V0LmNjCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAicGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAic2V0X2Jyb3dzZWRfcGxheWVyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotdXNpbmcgVGVzdFNldEJyb3dzZWRQbGF5ZXJQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxTZXRCcm93c2VkUGxheWVyUmVxdWVzdD47Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc3BvbnNlOwotCi0gIC8vIEV4cGVjdGVkIHBhY2tldCBzaXplIGJ5IHRoZSBsaWJyYXJ5IGlzIH41Ci0gIGlmIChzaXplID49IDUpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc3BvbnNlLnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0KLSAgICBhdXRvIHRlc3RfcGFja2V0ID0KLSAgICAgICAgVGVzdFNldEJyb3dzZWRQbGF5ZXJQYWNrZXQ6Ok1ha2Uoc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc3BvbnNlKTsKLQotICAgIHRlc3RfcGFja2V0LT5HZXRQbGF5ZXJJZCgpOwotICAgIHRlc3RfcGFja2V0LT5HZXREYXRhKCk7Ci0gICAgdGVzdF9wYWNrZXQtPklzVmFsaWQoKTsKLSAgICB0ZXN0X3BhY2tldC0+VG9TdHJpbmcoKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3NldF9icm93c2VkX3BsYXllcl9yZXNfZnV6emVyLmNjIGIvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc19mdXp6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmUyYzUuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL2Z1enplcnMvc2V0X2Jyb3dzZWRfcGxheWVyX3Jlc19mdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotI2luY2x1ZGUgInNldF9icm93c2VkX3BsYXllci5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RTZXRCcm93c2VkUGxheWVyUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8U2V0QnJvd3NlZFBsYXllclJlcXVlc3Q+OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNldF9icm93c2VkX3BsYXllcl9yZXF1ZXN0OwotCi0gIC8vIEV4cGVjdGVkIHBhY2tldCBzaXplIGJ5IHRoZSBsaWJyYXJ5IGlzIH41Ci0gIGlmIChzaXplID49IDUpIHsKLSAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgc2V0X2Jyb3dzZWRfcGxheWVyX3JlcXVlc3QucHVzaF9iYWNrKGRhdGFbeF0pOwotICAgIH0KLQotICAgIGF1dG8gdGVzdF9wYWNrZXQgPQotICAgICAgICBUZXN0U2V0QnJvd3NlZFBsYXllclBhY2tldDo6TWFrZShzZXRfYnJvd3NlZF9wbGF5ZXJfcmVxdWVzdCk7Ci0KLSAgICB0ZXN0X3BhY2tldC0+R2V0UGxheWVySWQoKTsKLSAgICB0ZXN0X3BhY2tldC0+R2V0RGF0YSgpOwotICAgIHRlc3RfcGFja2V0LT5Jc1ZhbGlkKCk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvZnV6emVycy92ZW5kb3JfcGFja2V0X2Z1enplci5jYyBiL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3ZlbmRvcl9wYWNrZXRfZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGE4YzVkLi4wMDAwMDAwCi0tLSBhL3BhY2tldC90ZXN0cy9mdXp6ZXJzL3ZlbmRvcl9wYWNrZXRfZnV6emVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWRhcHRlZCBmcm9tIHZlbmRvcl9wYWNrZXRfdGVzdC5jYwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDx0dXBsZT4KLQotI2luY2x1ZGUgImF2cmNwX3Rlc3RfcGFja2V0cy5oIgotI2luY2x1ZGUgInBhY2tldF90ZXN0X2hlbHBlci5oIgotI2luY2x1ZGUgInZlbmRvcl9wYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIFRlc3RWZW5kb3JQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxWZW5kb3JQYWNrZXQ+OwotCi11c2luZyBUZXN0UGFyYW0gPSBzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBDb21tYW5kUGR1PjsKLWNsYXNzIFZlbmRvclBhY2tldFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFRlc3RQYXJhbT4gewotIHB1YmxpYzoKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gR2V0UGFja2V0RGF0YSgpIHsgcmV0dXJuIHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOyB9Ci0gIENvbW1hbmRQZHUgR2V0Q29tbWFuZFBkdSgpIHsgcmV0dXJuIHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOyB9Ci19OwotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNob3J0X3ZlbmRvcl9wYWNrZXQ7Ci0KLSAgLy8gRXhwZWN0ZWQgcGFja2V0IHNpemUgYnkgdGhlIGxpYnJhcnkgaXMgPiAxOQotICBpZiAoc2l6ZSA+PSAxOSkgewotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7Ci0gICAgICBzaG9ydF92ZW5kb3JfcGFja2V0LnB1c2hfYmFjayhkYXRhW3hdKTsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGF1dG8gdGVzdF9wYWNrZXQgPSBUZXN0VmVuZG9yUGFja2V0OjpNYWtlKHNob3J0X3ZlbmRvcl9wYWNrZXQpOwotCi0gIHRlc3RfcGFja2V0LT5HZXRDb21wYW55SWQoKTsKLSAgdGVzdF9wYWNrZXQtPkdldENvbW1hbmRQZHUoKTsKLSAgdGVzdF9wYWNrZXQtPkdldFBhY2tldFR5cGUoKTsKLSAgdGVzdF9wYWNrZXQtPkdldFBhcmFtZXRlckxlbmd0aCgpOwotICB0ZXN0X3BhY2tldC0+SXNWYWxpZCgpOwotICB0ZXN0X3BhY2tldC0+VG9TdHJpbmcoKTsKLQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wYWNrZXQvdGVzdHMvcGFja2V0X3Rlc3RfaGVscGVyLmggYi9wYWNrZXQvdGVzdHMvcGFja2V0X3Rlc3RfaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkM2RiMmMuLjAwMDAwMDAKLS0tIGEvcGFja2V0L3Rlc3RzL3BhY2tldF90ZXN0X2hlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIEEgaGVscGVyIHRlbXBsYXRlZCBjbGFzcyB0byBhY2Nlc3MgdGhlIHByb3RlY3RlZCBtZW1iZXJzIG9mIFBhY2tldCB0byBtYWtlCi0vLyB0ZXN0aW5nIGVhc2llcgotdGVtcGxhdGUgPGNsYXNzIFBhY2tldFR5cGU+Ci1jbGFzcyBUZXN0UGFja2V0VHlwZSA6IHB1YmxpYyBQYWNrZXRUeXBlIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIFBhY2tldFR5cGU6OlBhY2tldFR5cGU7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUZXN0UGFja2V0VHlwZTxQYWNrZXRUeXBlPj4gTWFrZSgpIHsKLSAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRlc3RQYWNrZXRUeXBlPFBhY2tldFR5cGU+PigKLSAgICAgICAgbmV3IFRlc3RQYWNrZXRUeXBlPFBhY2tldFR5cGU+KCkpOwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUZXN0UGFja2V0VHlwZTxQYWNrZXRUeXBlPj4gTWFrZSgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+IHBhY2tldCkgewotICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VGVzdFBhY2tldFR5cGU8UGFja2V0VHlwZT4+KAotICAgICAgICBuZXcgVGVzdFBhY2tldFR5cGU8UGFja2V0VHlwZT4ocGFja2V0KSk7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRlc3RQYWNrZXRUeXBlPFBhY2tldFR5cGU+PiBNYWtlKAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCkgewotICAgIHNpemVfdCBlbmQgPSBwYXlsb2FkLnNpemUoKTsKLSAgICByZXR1cm4gTWFrZShzdGQ6Om1vdmUocGF5bG9hZCksIDAsIGVuZCk7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRlc3RQYWNrZXRUeXBlPFBhY2tldFR5cGU+PiBNYWtlKAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCwgc2l6ZV90IHN0YXJ0LCBzaXplX3QgZW5kKSB7Ci0gICAgYXV0byBwa3QgPSBzdGQ6OnNoYXJlZF9wdHI8VGVzdFBhY2tldFR5cGU8UGFja2V0VHlwZT4+KAotICAgICAgICBuZXcgVGVzdFBhY2tldFR5cGU8UGFja2V0VHlwZT4oKSk7Ci0gICAgcGt0LT5wYWNrZXRfc3RhcnRfaW5kZXhfID0gc3RhcnQ7Ci0gICAgcGt0LT5wYWNrZXRfZW5kX2luZGV4XyA9IGVuZDsKLSAgICBwa3QtPmRhdGFfID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oc3RkOjptb3ZlKHBheWxvYWQpKTsKLSAgICByZXR1cm4gcGt0OwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIEdldERhdGEoKSB7IHJldHVybiAqUGFja2V0VHlwZTo6ZGF0YV87IH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IEdldERhdGFQb2ludGVyKCkgewotICAgIHJldHVybiBQYWNrZXRUeXBlOjpkYXRhXzsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2tldC90ZXN0cy90ZXN0X3BhY2tldHMuaCBiL3BhY2tldC90ZXN0cy90ZXN0X3BhY2tldHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwZGI0Mi4uMDAwMDAwMAotLS0gYS9wYWNrZXQvdGVzdHMvdGVzdF9wYWNrZXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIHsKLQotLy8gTDJDQVAgcGFja2V0IHB1bGxlZCBmcm9tIFdpcmVzaGFyawotc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVzdF9sMmNhcF9kYXRhID0gewotICAgIDB4MDIsIDB4ZGMsIDB4MmUsIDB4NjYsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMSwgMHgwMCwgMHhiOCwgMHg5YywgMHgwMCwgMHg4MCwgMHg1NiwgMHgwMCwgMHg0MywgMHhjNCwgMHg5YSwKLSAgICAweDg2LCAweDM2LCAweDEwLCAweDAwLCAweDI2LCAweDQzLCAweDFjLCAweDliLCAweDg4LCAweDFkLCAweDA2LCAweDAzLAotICAgIDB4MjYsIDB4ODYsIDB4MzYsIDB4MTAsIDB4MDAsIDB4MjYsIDB4NDMsIDB4YjQsIDB4OWIsIDB4ODgsIDB4MWQsIDB4MDYsCi0gICAgMHgwMywgMHgyNiwgMHg4NiwgMHgzNiwgMHgxMCwgMHgwMCwgMHgyNiwgMHg0MywgMHhlNCwgMHg5YiwgMHg4OCwgMHgxZCwKLSAgICAweDA2LCAweDAzLCAweDI2LCAweDg2LCAweDM2LCAweDEwLCAweDAwLCAweDI2LCAweDQzLCAweGY4LCAweDliLCAweDg4LAotICAgIDB4MWQsIDB4MDYsIDB4MDMsIDB4MjYsIDB4ODYsIDB4MzYsIDB4MTAsIDB4MDAsIDB4MjYsIDB4NDMsIDB4MDgsIDB4OWMsCi0gICAgMHg4OCwgMHgxZCwgMHgwNiwgMHgwMywgMHgyNiwgMHg4NiwgMHgzNiwgMHgxMCwgMHgwMCwgMHgyNiwgMHg0MywgMHhhOCwKLSAgICAweDljLCAweDg4LCAweDFkLCAweDA2LCAweDAzLCAweDI2LCAweDg2LCAweDM2LCAweDEwLCAweDAwLCAweDI2fTsKLQotLy8gQVZDVFAgcGFja2V0IHB1bGxlZCBmcm9tIFdpcmVzaGFyawotc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVzdF9hdmN0cF9kYXRhID0gewotICAgIDB4ZjIsIDB4MTEsIDB4MGUsIDB4MGMsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MTksIDB4NTgsIDB4MjAsIDB4MDAsIDB4MDAsCi0gICAgMHg4NSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2YSwgMHgwMCwgMHgyMiwgMHg1NywgMHg2MSwKLSAgICAweDcyLCAweDIwLCAweDUwLCAweDY5LCAweDY3LCAweDczLCAweDIwLCAweDI4LCAweDMyLCAweDMwLCAweDMwLCAweDM5LAotICAgIDB4MjAsIDB4NTIsIDB4NjUsIDB4NmQsIDB4NjEsIDB4NzMsIDB4NzQsIDB4NjUsIDB4NzIsIDB4NjUsIDB4NjQsIDB4MjAsCi0gICAgMHg1NiwgMHg2NSwgMHg3MiwgMHg3MywgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKLSAgICAweDAwLCAweDZhLCAweDAwLCAweDBkLCAweDQyLCAweDZjLCAweDYxLCAweDYzLCAweDZiLCAweDIwLCAweDUzLCAweDYxLAotICAgIDB4NjIsIDB4NjIsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NmEsIDB4MDAsCi0gICAgMHgxNywgMHg1NCwgMHg2OCwgMHg2NSwgMHgyMCwgMHg1NSwgMHg2YywgMHg3NCwgMHg2OSwgMHg2ZCwgMHg2MSwgMHg3NCwKLSAgICAweDY1LCAweDIwLCAweDQzLCAweDZmLCAweDZjLCAweDZjLCAweDY1LCAweDYzLCAweDc0LCAweDY5LCAweDZmLCAweDZlLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsCi0gICAgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDZhLCAweDAwLCAweDA2LCAweDM0LCAweDM3LCAweDMzLCAweDMwLAotICAgIDB4MzAsIDB4MzB9OwotCi0vLyBBbiBhdnJjcCBwYWNrZXQgcHVsbGVkIGZyb20gd2lyZXNoYXJrLiBUaGlzIGRhdGEgaXMgdGhlIHBheWxvYWQgb2YKLS8vIHRlc3RfYXZjdHBfcGFja2V0Ci1zaXplX3QgdGVzdF9hdmN0cF9kYXRhX3BheWxvYWRfb2Zmc2V0ID0gMzsKLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlc3RfYXZyY3BfZGF0YSA9IHsKLSAgICAweDBjLCAweDQ4LCAweDAwLCAweDAwLCAweDE5LCAweDU4LCAweDIwLCAweDAwLCAweDAwLCAweDg1LCAweDA3LCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MjIsIDB4NTcsIDB4NjEsIDB4NzIsIDB4MjAsIDB4NTAsCi0gICAgMHg2OSwgMHg2NywgMHg3MywgMHgyMCwgMHgyOCwgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOSwgMHgyMCwgMHg1MiwgMHg2NSwKLSAgICAweDZkLCAweDYxLCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDY1LCAweDY0LCAweDIwLCAweDU2LCAweDY1LCAweDcyLAotICAgIDB4NzMsIDB4NjksIDB4NmYsIDB4NmUsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NmEsIDB4MDAsCi0gICAgMHgwZCwgMHg0MiwgMHg2YywgMHg2MSwgMHg2MywgMHg2YiwgMHgyMCwgMHg1MywgMHg2MSwgMHg2MiwgMHg2MiwgMHg2MSwKLSAgICAweDc0LCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDZhLCAweDAwLCAweDE3LCAweDU0LCAweDY4LAotICAgIDB4NjUsIDB4MjAsIDB4NTUsIDB4NmMsIDB4NzQsIDB4NjksIDB4NmQsIDB4NjEsIDB4NzQsIDB4NjUsIDB4MjAsIDB4NDMsCi0gICAgMHg2ZiwgMHg2YywgMHg2YywgMHg2NSwgMHg2MywgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDA0LCAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNywgMHgwMCwgMHg2YSwgMHgwMCwgMHgwNiwgMHgzNCwgMHgzNywgMHgzMywgMHgzMCwgMHgzMCwgMHgzMH07Ci0KLX0gIC8vIG5hbWVzcGFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvQW5kcm9pZC5icCBiL3Byb2ZpbGUvYXZyY3AvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyYjk2OC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJhdnJjcC10YXJnZXQtc2VydmljZSIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QvcnVzdC9zaGltIiwKLSAgICBdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLi8iXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjb25uZWN0aW9uX2hhbmRsZXIuY2MiLAotICAgICAgICAiZGV2aWNlLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgIF0sCi0gICAgYXBleF9hdmFpbGFibGU6IFsKLSAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCi0gICAgXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2F2cmNwIiwKLSAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2NvdmVyYWdlX2JpbiIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2J0Y29yZS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3RzL2F2cmNwX2Nvbm5lY3Rpb25faGFuZGxlcl90ZXN0LmNjIiwKLSAgICAgICAgInRlc3RzL2F2cmNwX2RldmljZV90ZXN0LmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImF2cmNwLXRhcmdldC1zZXJ2aWNlIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiBmYWxzZSwKLSAgICB9LAotCi0gICAgY2ZsYWdzOiBbIi1EQlVJTERDRkciXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImF2cmNwX2RldmljZV9mdXp6IiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfZGVmYXVsdHNfZnV6emFibGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAidGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovYXZyY3BfZGV2aWNlX2Z1enouY2MiLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L3BhY2tldC90ZXN0cyIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImF2cmNwLXRhcmdldC1zZXJ2aWNlIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliY2hyb21lIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJldmVudCIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlic3RhdHNsb2dfYnQiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLSAgICBjb3JwdXM6IFsKLSAgICAgICAgInRlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy8qIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL0JVSUxELmduIGIvcHJvZmlsZS9hdnJjcC9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NGZmZi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTggQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWNvbmZpZygiYXZyY3BfY29uZmlnIikgewotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQvIiwKLSAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgIi8vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgIi8vYnQvcHJvZmlsZS9hdnJjcCIsCi0gICAgIi8vYnQvcGFja2V0IiwKLSAgICAiLy9idC9wYWNrZXQvaW5jbHVkZSIsCi0gICAgIi8vYnQvaW5jbHVkZS9oYXJkd2FyZS9hdnJjcCIsCi0gIF0KLQotICBjb25maWdzID0gWyIvL2J0OnRhcmdldF9kZWZhdWx0cyJdCi19Ci0KLXN0YXRpY19saWJyYXJ5KCJwcm9maWxlX2F2cmNwIikgewotICBzb3VyY2VzID0gWwotICAgICJjb25uZWN0aW9uX2hhbmRsZXIuY2MiLAotICAgICJkZXZpY2UuY2MiLAotICBdCi0KLSAgZGVwcyA9IFsKLSAgICAiLy9idC9nZC9ydXN0L3NoaW06bWVzc2FnZV9sb29wX3RocmVhZF9icmlkZ2VfaGVhZGVyIiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWwotICAgICI6YXZyY3BfY29uZmlnIgotICBdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBleGVjdXRhYmxlKCJuZXRfdGVzdF9hdnJjcCIpIHsKLSAgICBzb3VyY2VzID0gWwotICAgICAgInRlc3RzL2F2cmNwX2Nvbm5lY3Rpb25faGFuZGxlcl90ZXN0LmNjIiwKLSAgICAgICJ0ZXN0cy9hdnJjcF9kZXZpY2VfdGVzdC5jYyIsCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICI6cHJvZmlsZV9hdnJjcCIsCi0gICAgICAiLy9idC9kZXZpY2U6ZGV2aWNlIiwKLSAgICAgICIvL2J0L29zaTpvc2kiLAotICAgICAgIi8vYnQvcGFja2V0OnBhY2tldCIsCi0gICAgICAiLy9idC90eXBlczp0eXBlcyIsCi0gICAgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9nbW9ja19tYWluIiwKLSAgICAgICI6YXZyY3BfY29uZmlnIiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvYXZyY3BfY29uZmlnLmggYi9wcm9maWxlL2F2cmNwL2F2cmNwX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmE4NzI0Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvYXZyY3BfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZyY19hcGkuaCIKLQotLy8gU3VwcG9ydGVkIEZlYXR1cmVzIGZvciBBVlJDUCBWZXJzaW9uIDEuNgotI2lmbmRlZiBBVlJDUF9TVVBGX1RHXzFfNgotI2RlZmluZSBBVlJDUF9TVVBGX1RHXzFfNiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQVZSQ19TVVBGX1RHX0NBVDEgfCBBVlJDX1NVUEZfVEdfTVVMVElfUExBWUVSIHwgXAotICAgQVZSQ19TVVBGX1RHX0JST1dTRSkgLyogVE9ETzogfCBBVlJDX1NVUEZfVEdfQVBQX1NFVFRJTkdTKSAqLwotI2VuZGlmCi0KLS8vIFN1cHBvcnRlZCBGZWF0dXJlcyBmb3IgQVZSQ1AgVmVyc2lvbiAxLjUKLSNpZm5kZWYgQVZSQ1BfU1VQRl9UR18xXzUKLSNkZWZpbmUgQVZSQ1BfU1VQRl9UR18xXzUgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEFWUkNfU1VQRl9UR19DQVQxIHwgQVZSQ19TVVBGX1RHX01VTFRJX1BMQVlFUiB8IFwKLSAgIEFWUkNfU1VQRl9UR19CUk9XU0UpCi0jZW5kaWYKLQotLy8gU3VwcG9ydGVkIEZlYXR1cmVzIGZvciBBVlJDUCBWZXJzaW9uIDEuNAotI2lmbmRlZiBBVlJDUF9TVVBGX1RHXzFfNAotI2RlZmluZSBBVlJDUF9TVVBGX1RHXzFfNCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQVZSQ19TVVBGX1RHX0NBVDEgfCBBVlJDX1NVUEZfVEdfTVVMVElfUExBWUVSIHwgXAotICAgQVZSQ19TVVBGX1RHX0JST1dTRSkKLSNlbmRpZgotCi0vLyBTdXBwb3J0ZWQgRmVhdHVyZXMgZm9yIEFWUkNQIFZlcnNpb24gMS4zICJDb21wYXRpYmlsaXR5IE1vZGUiCi0jaWZuZGVmIEFWUkNQX1NVUEZfVEdfMV8zCi0jZGVmaW5lIEFWUkNQX1NVUEZfVEdfMV8zIEFWUkNfU1VQRl9UR19DQVQxCi0jZW5kaWYKLQotLyoqCi0gKiBEZWZhdWx0IFN1cHBvcnRlZCBGZWF0dXJlIGJpdHMgZm9yIEFWUkNQIENvbnRyb2xsZXIKLSAqLwotI2lmbmRlZiBBVlJDUF9TVVBGX1RHCi0jZGVmaW5lIEFWUkNQX1NVUEZfVEdfREVGQVVMVCBBVlJDUF9TVVBGX1RHXzFfNAotI2VuZGlmCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL2F2cmNwX2ludGVybmFsLmggYi9wcm9maWxlL2F2cmNwL2F2cmNwX2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjA1NzguLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC9hdnJjcF9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJhdnJjcF9jb25maWcuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2cmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKgotICogV3JhcHBlciBjbGFzc2VzIGZvciB0aGUgQVBJIGZ1bmN0aW9ucyBjdXJyZW50bHkgZGVmaW5lZCBpbiAic3lzdGVtL2J0L3N0YWNrIi4KLSAqIENvbm5lY3Rpb25IYW5kbGVyIGFuZCBBdnJjcERldmljZSBib3RoIHVzZSB0aGlzIGludGVyZmFjZSB0byBtYW5hZ2UgQVZSQ1AKLSAqIFNEUCwgY29ubmVjdGlvbnMsIGFuZCBwYWNrZXRzLiBXZSB1c2UgdGhlc2UgaW50ZXJtZWRpYXRlIGludGVyZmFjZXMgaW5zdGVhZAotICogb2YgY2FsbGluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IGluIG9yZGVyIHRvIG1ha2UgbW9ja2luZyBhbmQgdGVzdGluZwotICogZWFzaWVyLgotICovCi0vLyBUT0RPIChhcGFuaWNrZSk6IFVwZGF0ZSB0aGUgYXBpJ3MgaW4gInN5c3RlbS9idC9zdGFjayIgc28gdGhhdCBubyB3cmFwcGVyIGlzCi0vLyByZXF1aXJlZAotY2xhc3MgQXZyY3BJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB1aW50MTZfdCBHZXRBdnJjcFZlcnNpb24oKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MTZfdCBBZGRSZWNvcmQodWludDE2X3Qgc2VydmljZV91dWlkLCBjb25zdCBjaGFyKiBwX3NlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcF9wcm92aWRlcl9uYW1lLCB1aW50MTZfdCBjYXRlZ29yaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlLCBib29sIGJyb3dzZV9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb2ZpbGVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY292ZXJfYXJ0X3BzbSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDE2X3QgUmVtb3ZlUmVjb3JkKHVpbnQzMl90IHNkcF9oYW5kbGUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQxNl90IEZpbmRTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19TRFBfREJfUEFSQU1TKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX0ZJTkRfQ0JBQ0sgcF9jYmFjaykgPSAwOwotCi0gIHZpcnR1YWwgdWludDE2X3QgT3Blbih1aW50OF90KiBwX2hhbmRsZSwgdEFWUkNfQ09OTl9DQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MTZfdCBPcGVuQnJvd3NlKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGNvbm5fcm9sZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDE2X3QgR2V0UGVlck10dSh1aW50OF90IGhhbmRsZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDE2X3QgR2V0QnJvd3NlTXR1KHVpbnQ4X3QgaGFuZGxlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MTZfdCBDbG9zZSh1aW50OF90IGhhbmRsZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDE2X3QgQ2xvc2VCcm93c2UodWludDhfdCBoYW5kbGUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQxNl90IE1zZ1JlcSh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgdWludDhfdCBjdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgPSAwOwotCi0gIHZpcnR1YWwgfkF2cmNwSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgU2RwSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBJbml0RGlzY292ZXJ5RGIodFNEUF9ESVNDT1ZFUllfREIqIGEsIHVpbnQzMl90IGIsIHVpbnQxNl90IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBkLCB1aW50MTZfdCBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBmKSA9IDA7Ci0KLSAgdmlydHVhbCBib29sIFNlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBjKSA9IDA7Ci0KLSAgdmlydHVhbCB0U0RQX0RJU0NfUkVDKiBGaW5kU2VydmljZUluRGIodFNEUF9ESVNDT1ZFUllfREIqIGEsIHVpbnQxNl90IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2RwX2Rpc2NfcmVjKiBjKSA9IDA7Ci0KLSAgdmlydHVhbCB0U0RQX0RJU0NfQVRUUiogRmluZEF0dHJpYnV0ZUluUmVjKHRfc2RwX2Rpc2NfcmVjKiBhLCB1aW50MTZfdCBiKSA9IDA7Ci0KLSAgdmlydHVhbCBib29sIEZpbmRQcm9maWxlVmVyc2lvbkluUmVjKHRfc2RwX2Rpc2NfcmVjKiBhLCB1aW50MTZfdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGMpID0gMDsKLQotICB2aXJ0dWFsIH5TZHBJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBBMmRwSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgUmF3QWRkcmVzcyBhY3RpdmVfcGVlcigpID0gMDsKLSAgdmlydHVhbCBib29sIGlzX3BlZXJfaW5fc2lsZW5jZV9tb2RlKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgPSAwOwotCi0gIHZpcnR1YWwgfkEyZHBJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC9hdnJjcF9tZXNzYWdlX2NvbnZlcnRlci5oIGIvcHJvZmlsZS9hdnJjcC9hdnJjcF9tZXNzYWdlX2NvbnZlcnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ3Zjk2Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvYXZyY3BfbWVzc2FnZV9jb252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9hdnJjcF9wYWNrZXQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vLyBUaGVzZSBjbGFzc2VzIGFyZSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJzIHRvIGVhc2lseSBzd2l0Y2ggYmV0d2VlbiBCVF9IRFIgYW5kCi0vLyBwYWNrZXRzLgotY2xhc3MgVmVjdG9yUGFja2V0IDogcHVibGljIDo6Ymx1ZXRvb3RoOjpQYWNrZXQgewotIHB1YmxpYzoKLSAgdXNpbmcgUGFja2V0OjpQYWNrZXQ7ICAvLyBJbmhlcml0IGNvbnN0cnVjdG9ycwotCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmVjdG9yUGFja2V0PiBNYWtlKCkgewotICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VmVjdG9yUGFja2V0PihuZXcgVmVjdG9yUGFja2V0KCkpOwotICB9OwotCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmVjdG9yUGFja2V0PiBNYWtlKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWQpIHsKLSAgICBhdXRvIHBrdCA9IFZlY3RvclBhY2tldDo6TWFrZSgpOwotICAgIHBrdC0+cGFja2V0X3N0YXJ0X2luZGV4XyA9IDA7Ci0gICAgcGt0LT5wYWNrZXRfZW5kX2luZGV4XyA9IHBheWxvYWQuc2l6ZSgpOwotICAgIHBrdC0+ZGF0YV8gPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihzdGQ6Om1vdmUocGF5bG9hZCkpOwotICAgIHJldHVybiBwa3Q7Ci0gIH07Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIEdldERhdGEoKSB7IHJldHVybiAqZGF0YV87IH07Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCAiVmVjdG9yUGFja2V0OiIgPDwgc3RkOjplbmRsOwotICAgIHNzIDw8ICIgIOKUlCBQYXlsb2FkID0iOwotICAgIGZvciAoYXV0byBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyBpdCsrKSB7Ci0gICAgICBzcyA8PCAiICIgPDwgbG9naGV4KCppdCk7Ci0gICAgfQotICAgIHNzIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiBzcy5zdHIoKTsKLSAgfTsKLQotICB2aXJ0dWFsIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gR2V0UGF5bG9hZEluZGVjaWVzKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+KHBhY2tldF9zdGFydF9pbmRleF8sIHBhY2tldF9lbmRfaW5kZXhfKTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotfTsKLQotLy8gVE9ETyAoYXBhbmlja2UpOiBXaGVuIGRlbGV0aW5nIHRoZSBvbGQgQVZSQ1AgU3RhY2ssIHJlbW92ZSB0aGlzIGNsYXNzIGFuZAotLy8gaW5zdGVhZCBjcmVhdGUgYSBCVF9IRFIgUGFyc2luZyBwYWNrZXQuCi1jbGFzcyBBdnJjcE1lc3NhZ2VDb252ZXJ0ZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiBQYXJzZSh0QVZSQ19NU0cqIG0pIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOwotCi0gICAgc3dpdGNoIChtLT5oZHIub3Bjb2RlKSB7Ci0gICAgICBjYXNlIEFWUkNfT1BfVkVORE9SOiB7Ci0gICAgICAgIHRBVlJDX01TR19WRU5ET1IqIG1zZyA9ICh0QVZSQ19NU0dfVkVORE9SKiltOwotICAgICAgICBkYXRhLnB1c2hfYmFjayhtLT5oZHIuY3R5cGUpOwotICAgICAgICBkYXRhLnB1c2hfYmFjaygobS0+aGRyLnN1YnVuaXRfdHlwZSA8PCAzKSB8IG0tPmhkci5zdWJ1bml0X2lkKTsKLSAgICAgICAgZGF0YS5wdXNoX2JhY2sobS0+aGRyLm9wY29kZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotICAgICAgICAgIGRhdGEucHVzaF9iYWNrKCh1aW50OF90KSgobXNnLT5jb21wYW55X2lkID4+IGkgKiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZy0+dmVuZG9yX2xlbjsgaSsrKSB7Ci0gICAgICAgICAgZGF0YS5wdXNoX2JhY2sobXNnLT5wX3ZlbmRvcl9kYXRhW2ldKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQVZSQ19PUF9QQVNTX1RIUlU6IHsKLSAgICAgICAgdEFWUkNfTVNHX1BBU1MqIG1zZyA9ICh0QVZSQ19NU0dfUEFTUyopbTsKLSAgICAgICAgZGF0YS5wdXNoX2JhY2sobS0+aGRyLmN0eXBlKTsKLSAgICAgICAgZGF0YS5wdXNoX2JhY2soKG0tPmhkci5zdWJ1bml0X3R5cGUgPDwgMykgfCBtLT5oZHIuc3VidW5pdF9pZCk7Ci0gICAgICAgIGRhdGEucHVzaF9iYWNrKG0tPmhkci5vcGNvZGUpOwotICAgICAgICBkYXRhLnB1c2hfYmFjaygobXNnLT5zdGF0ZSA8PCA3KSB8IG1zZy0+b3BfaWQpOwotICAgICAgICBkYXRhLnB1c2hfYmFjaygweDAwKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEFWUkNfT1BfQlJPV1NFOiB7Ci0gICAgICAgIHRBVlJDX01TR19CUk9XU0UqIG1zZyA9ICh0QVZSQ19NU0dfQlJPV1NFKiltOwotICAgICAgICAvLyBUaGUgZmlyc3QgMyBieXRlcyBhcmUgaGVhZGVyIGJ5dGVzIHRoYXQgYXJlbid0IGFjdHVhbGx5IGluIEFWUkNQCi0gICAgICAgIC8vIHBhY2tldHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2ctPmJyb3dzZV9sZW47IGkrKykgewotICAgICAgICAgIGRhdGEucHVzaF9iYWNrKG1zZy0+cF9icm93c2VfZGF0YVtpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIG9wY29kZSBmb3IgQVZSQ1AgbWVzc2FnZSI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBWZWN0b3JQYWNrZXQ6Ok1ha2UoZGF0YSk7Ci0gIH0KLX07CmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL2Nvbm5lY3Rpb25faGFuZGxlci5jYyBiL3Byb2ZpbGUvYXZyY3AvY29ubmVjdGlvbl9oYW5kbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBmMWFjLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvY29ubmVjdGlvbl9oYW5kbGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjb25uZWN0aW9uX2hhbmRsZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImF2cmNfZGVmcy5oIgotI2luY2x1ZGUgImF2cmNwX21lc3NhZ2VfY29udmVydGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2F2cmNwL2F2cmNwX3BhY2tldC5oIgotLy8gVE9ETyAoYXBhbmlja2UpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiB0aGlzIGhlYWRlciBvbmNlIHdlIGNsZWFudXAgZmVhdHVyZQotLy8gaGFuZGxpbmcuCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLUNvbm5lY3Rpb25IYW5kbGVyKiBDb25uZWN0aW9uSGFuZGxlcjo6aW5zdGFuY2VfID0gbnVsbHB0cjsKLQotQ29ubmVjdGlvbkhhbmRsZXIqIENvbm5lY3Rpb25IYW5kbGVyOjpHZXQoKSB7Ci0gIENIRUNLKGluc3RhbmNlXyk7Ci0KLSAgcmV0dXJuIGluc3RhbmNlXzsKLX0KLQotYm9vbCBJc0Fic29sdXRlVm9sdW1lRW5hYmxlZChjb25zdCBSYXdBZGRyZXNzKiBiZGFkZHIpIHsKLSAgY2hhciB2b2x1bWVfZGlzYWJsZWRbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC5ibHVldG9vdGguZGlzYWJsZWFic3ZvbCIsIHZvbHVtZV9kaXNhYmxlZCwgImZhbHNlIik7Ci0gIGlmIChzdHJuY21wKHZvbHVtZV9kaXNhYmxlZCwgInRydWUiLCA0KSA9PSAwKSB7Ci0gICAgTE9HKElORk8pIDw8ICJBYnNvbHV0ZSB2b2x1bWUgZGlzYWJsZWQgYnkgcHJvcGVydHkiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfRElTQUJMRV9BQlNPTFVURV9WT0xVTUUsIGJkYWRkcikpIHsKLSAgICBMT0coSU5GTykgPDwgIkFic29sdXRlIHZvbHVtZSBkaXNhYmxlZCBieSBJT1AgdGFibGUiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb25uZWN0aW9uSGFuZGxlcjo6SW5pdGlhbGl6ZShjb25zdCBDb25uZWN0aW9uQ2FsbGJhY2smIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdnJjcEludGVyZmFjZSogYXZyY3AsIFNkcEludGVyZmFjZSogc2RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVJbnRlcmZhY2UqIHZvbCkgewotICBDSEVDSyhpbnN0YW5jZV8gPT0gbnVsbHB0cik7Ci0gIENIRUNLKGF2cmNwICE9IG51bGxwdHIpOwotICBDSEVDSyhzZHAgIT0gbnVsbHB0cik7Ci0KLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBXaGVuIHRyYW5zaXRpb25pbmcgdG8gdXNpbmcgdGhpcyBzZXJ2aWNlLCBpbXBsZW1lbnQKLSAgLy8gU0RQIEluaXRpYWxpemF0aW9uIGZvciBBVlJDUCBIZXJlLgotICBpbnN0YW5jZV8gPSBuZXcgQ29ubmVjdGlvbkhhbmRsZXIoKTsKLSAgaW5zdGFuY2VfLT5jb25uZWN0aW9uX2NiXyA9IGNhbGxiYWNrOwotICBpbnN0YW5jZV8tPmF2cmNfID0gYXZyY3A7Ci0gIGluc3RhbmNlXy0+c2RwXyA9IHNkcDsKLSAgaW5zdGFuY2VfLT52b2xfID0gdm9sOwotCi0gIC8vIFNldCB1cCB0aGUgQVZSQ1AgYWNjZXB0b3IgY29ubmVjdGlvbgotICBpZiAoIWluc3RhbmNlXy0+QXZyY3BDb25uZWN0KGZhbHNlLCBSYXdBZGRyZXNzOjprQW55KSkgewotICAgIGluc3RhbmNlXy0+Q2xlYW5VcCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbm5lY3Rpb25IYW5kbGVyOjpDbGVhblVwKCkgewotICBDSEVDSyhpbnN0YW5jZV8gIT0gbnVsbHB0cik7Ci0KLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBDbGVhbnVwIHRoZSBTRFAgRW50cmllcyBoZXJlCi0gIGZvciAoYXV0byBlbnRyeSA9IGluc3RhbmNlXy0+ZGV2aWNlX21hcF8uYmVnaW4oKTsKLSAgICAgICBlbnRyeSAhPSBpbnN0YW5jZV8tPmRldmljZV9tYXBfLmVuZCgpOykgewotICAgIGF1dG8gY3VyciA9IGVudHJ5OwotICAgIGVudHJ5Kys7Ci0gICAgY3Vyci0+c2Vjb25kLT5EZXZpY2VEaXNjb25uZWN0ZWQoKTsKLSAgICBpbnN0YW5jZV8tPmF2cmNfLT5DbG9zZShjdXJyLT5maXJzdCk7Ci0gIH0KLSAgaW5zdGFuY2VfLT5kZXZpY2VfbWFwXy5jbGVhcigpOwotICBpbnN0YW5jZV8tPmZlYXR1cmVfbWFwXy5jbGVhcigpOwotCi0gIGluc3RhbmNlXy0+d2Vha19wdHJfZmFjdG9yeV8uSW52YWxpZGF0ZVdlYWtQdHJzKCk7Ci0KLSAgZGVsZXRlIGluc3RhbmNlXzsKLSAgaW5zdGFuY2VfID0gbnVsbHB0cjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb25uZWN0aW9uSGFuZGxlcjo6SW5pdEZvclRlc3RpbmcoQ29ubmVjdGlvbkhhbmRsZXIqIGhhbmRsZXIpIHsKLSAgQ0hFQ0soaW5zdGFuY2VfID09IG51bGxwdHIpOwotICBpbnN0YW5jZV8gPSBoYW5kbGVyOwotfQotCi1ib29sIENvbm5lY3Rpb25IYW5kbGVyOjpDb25uZWN0RGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikgewotICBMT0coSU5GTykgPDwgIkF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBkZXZpY2UgIiA8PCBiZGFkZHI7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogZGV2aWNlX21hcF8pIHsKLSAgICBpZiAoYmRhZGRyID09IHBhaXIuc2Vjb25kLT5HZXRBZGRyZXNzKCkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiQWxyZWFkeSBjb25uZWN0ZWQgdG8gZGV2aWNlIHdpdGggYWRkcmVzcyAiIDw8IGJkYWRkcjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBhdXRvIGNvbm5lY3Rpb25fbGFtYmRhID0gW10oQ29ubmVjdGlvbkhhbmRsZXIqIGluc3RhbmNlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwgdWludDE2X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmVyc2lvbiwgdWludDE2X3QgZmVhdHVyZXMpIHsKLSAgICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICA8PCAiIFNEUCBDb21wbGV0ZWQgZmVhdHVyZXM9IiA8PCBsb2doZXgoZmVhdHVyZXMpOwotICAgIGlmIChzdGF0dXMgIT0gQVZSQ19TVUNDRVNTIHx8ICEoZmVhdHVyZXMgJiBCVEFfQVZfRkVBVF9SQ0NUKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRvIFNEUDogc3RhdHVzPSIgPDwgbG9naGV4KHN0YXR1cykKLSAgICAgICAgICAgICAgICAgPDwgIiBmZWF0dXJlcz0iIDw8IGxvZ2hleChmZWF0dXJlcykKLSAgICAgICAgICAgICAgICAgPDwgIiBzdXBwb3J0cyBjb250cm9sbGVyOiAiIDw8IChmZWF0dXJlcyAmIEJUQV9BVl9GRUFUX1JDQ1QpOwotICAgICAgaW5zdGFuY2VfLT5jb25uZWN0aW9uX2NiXy5SdW4oc3RkOjpzaGFyZWRfcHRyPERldmljZT4oKSk7Ci0gICAgfQotCi0gICAgaW5zdGFuY2VfLT5mZWF0dXJlX21hcF8uZW1wbGFjZShiZGFkZHIsIGZlYXR1cmVzKTsKLSAgICBpbnN0YW5jZV8tPkF2cmNwQ29ubmVjdCh0cnVlLCBiZGFkZHIpOwotICAgIHJldHVybjsKLSAgfTsKLQotICByZXR1cm4gU2RwTG9va3VwKGJkYWRkciwgYmFzZTo6QmluZChjb25uZWN0aW9uX2xhbWJkYSwgdGhpcywgYmRhZGRyKSwgZmFsc2UpOwotfQotCi1ib29sIENvbm5lY3Rpb25IYW5kbGVyOjpEaXNjb25uZWN0RGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikgewotICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VfbWFwXy5iZWdpbigpOyBpdCAhPSBkZXZpY2VfbWFwXy5lbmQoKTsgaXQrKykgewotICAgIGlmIChiZGFkZHIgPT0gaXQtPnNlY29uZC0+R2V0QWRkcmVzcygpKSB7Ci0gICAgICB1aW50OF90IGhhbmRsZSA9IGl0LT5maXJzdDsKLSAgICAgIHJldHVybiBhdnJjXy0+Q2xvc2UoaGFuZGxlKSA9PSBBVlJDX1NVQ0NFU1M7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENvbm5lY3Rpb25IYW5kbGVyOjpTZXRCaXBDbGllbnRTdGF0dXMoY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkKSB7Ci0gIGZvciAoYXV0byBpdCA9IGRldmljZV9tYXBfLmJlZ2luKCk7IGl0ICE9IGRldmljZV9tYXBfLmVuZCgpOyBpdCsrKSB7Ci0gICAgaWYgKGJkYWRkciA9PSBpdC0+c2Vjb25kLT5HZXRBZGRyZXNzKCkpIHsKLSAgICAgIGl0LT5zZWNvbmQtPlNldEJpcENsaWVudFN0YXR1cyhjb25uZWN0ZWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPj4gQ29ubmVjdGlvbkhhbmRsZXI6OkdldExpc3RPZkRldmljZXMoKQotICAgIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERldmljZT4+IGxpc3Q7Ci0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlX21hcF8pIHsKLSAgICBsaXN0LnB1c2hfYmFjayhkZXZpY2Uuc2Vjb25kKTsKLSAgfQotICByZXR1cm4gbGlzdDsKLX0KLQotYm9vbCBDb25uZWN0aW9uSGFuZGxlcjo6U2RwTG9va3VwKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwgU2RwQ2FsbGJhY2sgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXRyeSkgewotICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXzsKLQotICB0QVZSQ19TRFBfREJfUEFSQU1TIGRiX3BhcmFtczsKLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBUaGlzIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggc21hcnRlciBtZW1vcnkgbWFuYWdlbWVudC4KLSAgdFNEUF9ESVNDT1ZFUllfREIqIGRpc2NfZGIgPQotICAgICAgKHRTRFBfRElTQ09WRVJZX0RCKilvc2lfbWFsbG9jKEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUpOwotICB1aW50MTZfdCBhdHRyX2xpc3RbXSA9IHtBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVN9OwotCi0gIGRiX3BhcmFtcy5kYl9sZW4gPQotICAgICAgQlRfREVGQVVMVF9CVUZGRVJfU0laRTsgIC8vIFNvbWUgbWFnaWMgbnVtYmVyIGZvdW5kIGluIHRoZSBBVlJDUCBjb2RlCi0gIGRiX3BhcmFtcy5udW1fYXR0ciA9IHNpemVvZihhdHRyX2xpc3QpIC8gc2l6ZW9mKGF0dHJfbGlzdFswXSk7Ci0gIGRiX3BhcmFtcy5wX2RiID0gZGlzY19kYjsKLSAgZGJfcGFyYW1zLnBfYXR0cnMgPSBhdHRyX2xpc3Q7Ci0KLSAgcmV0dXJuIGF2cmNfLT5GaW5kU2VydmljZShVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCwgYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQ29ubmVjdGlvbkhhbmRsZXI6OlNkcENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBiZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYiwgZGlzY19kYiwgcmV0cnkpKSA9PSBBVlJDX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgQ29ubmVjdGlvbkhhbmRsZXI6OkF2cmNwQ29ubmVjdChib29sIGluaXRpYXRvciwgY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyKSB7Ci0gIExPRyhJTkZPKSA8PCAiQ29ubmVjdCB0byBkZXZpY2UgIiA8PCBiZGFkZHIuVG9TdHJpbmcoKTsKLQotICB0QVZSQ19DT05OX0NCIG9wZW5fY2I7Ci0gIGlmIChpbml0aWF0b3IpIHsKLSAgICBvcGVuX2NiLmN0cmxfY2JhY2sgPSBiYXNlOjpCaW5kKCZDb25uZWN0aW9uSGFuZGxlcjo6SW5pdGlhdG9yQ29udHJvbENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBvcGVuX2NiLmN0cmxfY2JhY2sgPSBiYXNlOjpCaW5kKCZDb25uZWN0aW9uSGFuZGxlcjo6QWNjZXB0b3JDb250cm9sQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpOwotICB9Ci0gIG9wZW5fY2IubXNnX2NiYWNrID0KLSAgICAgIGJhc2U6OkJpbmQoJkNvbm5lY3Rpb25IYW5kbGVyOjpNZXNzYWdlQ2IsIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSk7Ci0gIG9wZW5fY2IuY29tcGFueV9pZCA9IEFWUkNfQ09fR09PR0xFOwotICBvcGVuX2NiLmNvbm4gPSBpbml0aWF0b3IgPyBBVlJDX0NPTk5fSU5UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWUkNfQ09OTl9BQ1A7ICAvLyAwIGlmIGluaXRpYXRvciwgMSBpZiBhY2NlcHRvcgotICAvLyBUT0RPIChhcGFuaWNrZSk6IFdlIHNob3VsZG4ndCBuZWVkIFJDQ1QgdG8gZG8gYWJzb2x1dGUgdm9sdW1lLiBUaGUgY3VycmVudAotICAvLyBBVlJDX0FQSSByZXF1aXJlcyBpdCB0aG91Z2guCi0gIG9wZW5fY2IuY29udHJvbCA9IEJUQV9BVl9GRUFUX1JDVEcgfCBCVEFfQVZfRkVBVF9SQ0NUIHwgQlRBX0FWX0ZFQVRfTUVUQURBVEEKLSAgICAgICAgICAgICAgICAgICAgfCBBVlJDX0NUX1BBU1NJVkU7Ci0KLSAgdWludDhfdCBoYW5kbGUgPSAwOwotICB1aW50MTZfdCBzdGF0dXMgPSBhdnJjXy0+T3BlbigmaGFuZGxlLCAmb3Blbl9jYiwgYmRhZGRyKTsKLSAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogaGFuZGxlPSIgPDwgbG9naGV4KGhhbmRsZSkKLSAgICAgICAgICAgIDw8ICIgc3RhdHVzPSAiIDw8IGxvZ2hleChzdGF0dXMpOwotICByZXR1cm4gc3RhdHVzID09IEFWUkNfU1VDQ0VTUzsKLX0KLQotdm9pZCBDb25uZWN0aW9uSGFuZGxlcjo6SW5pdGlhdG9yQ29udHJvbENiKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwZWVyX2FkZHIpIHsKLSAgRENIRUNLKCFjb25uZWN0aW9uX2NiXy5pc19udWxsKCkpOwotCi0gIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IGhhbmRsZT0iIDw8IGxvZ2hleChoYW5kbGUpCi0gICAgICAgICAgICA8PCAiIHJlc3VsdD0iIDw8IGxvZ2hleChyZXN1bHQpCi0gICAgICAgICAgICA8PCAiIGFkZHI9IiA8PCAocGVlcl9hZGRyID8gcGVlcl9hZGRyLT5Ub1N0cmluZygpIDogIm5vbmUiKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBVlJDX09QRU5fSU5EX0VWVDogewotICAgICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogQ29ubmVjdGlvbiBPcGVuZWQgRXZlbnQiOwotCi0gICAgICBjb25zdCBhdXRvJiBmZWF0dXJlX2l0ZXIgPSBmZWF0dXJlX21hcF8uZmluZCgqcGVlcl9hZGRyKTsKLSAgICAgIGlmIChmZWF0dXJlX2l0ZXIgPT0gZmVhdHVyZV9tYXBfLmVuZCgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZlYXR1cmVzIGRvIG5vdCBleGlzdCBldmVuIHRob3VnaCBTRFAgc2hvdWxkIGhhdmUgYmVlbiAiCi0gICAgICAgICAgICAgICAgICAgICAgImRvbmUgZmlyc3QiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGJvb2wgc3VwcG9ydHNfYnJvd3NpbmcgPSBmZWF0dXJlX2l0ZXItPnNlY29uZCAmIEJUQV9BVl9GRUFUX0JST1dTRTsKLQotICAgICAgaWYgKHN1cHBvcnRzX2Jyb3dzaW5nKSB7Ci0gICAgICAgIGF2cmNfLT5PcGVuQnJvd3NlKGhhbmRsZSwgQVZDVF9JTlQpOwotICAgICAgfQotCi0gICAgICAvLyBUT0RPIChhcGFuaWNrZSk6IEltcGxlbWVudCBhIHN5c3RlbSB0byBjYWNoZSBTRFAgZW50cmllcy4gRm9yIG1vc3QKLSAgICAgIC8vIGRldmljZXMgU0RQIGlzIGNvbXBsZXRlZCBhZnRlciB0aGUgZGV2aWNlIGNvbm5lY3RzIEFWUkNQIHNvIHRoYXQKLSAgICAgIC8vIGluZm9ybWF0aW9uIGlzbid0IHZlcnkgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGNvbnRyb2wgb3VyCi0gICAgICAvLyBjYXBhYmlsaXRpZXMuIEZvciBub3cgYWx3YXlzIHVzZSBBVlJDUCAxLjYuCi0gICAgICBhdXRvJiYgY2FsbGJhY2sgPSBiYXNlOjpCaW5kKCZDb25uZWN0aW9uSGFuZGxlcjo6U2VuZE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGhhbmRsZSk7Ci0gICAgICBhdXRvJiYgY3RybF9tdHUgPSBhdnJjXy0+R2V0UGVlck10dShoYW5kbGUpIC0gQVZDVF9IRFJfTEVOOwotICAgICAgYXV0byYmIGJyb3dzZV9tdHUgPSBhdnJjXy0+R2V0QnJvd3NlTXR1KGhhbmRsZSkgLSBBVkNUX0hEUl9MRU47Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPiBuZXdEZXZpY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPERldmljZT4oCi0gICAgICAgICAgKnBlZXJfYWRkciwgIXN1cHBvcnRzX2Jyb3dzaW5nLCBjYWxsYmFjaywgY3RybF9tdHUsIGJyb3dzZV9tdHUpOwotCi0gICAgICBkZXZpY2VfbWFwX1toYW5kbGVdID0gbmV3RGV2aWNlOwotICAgICAgLy8gVE9ETyAoYXBhbmlja2UpOiBDcmVhdGUgdGhlIGRldmljZSB3aXRoIGFsbCBvZiB0aGUgaW50ZXJmYWNlcyBpdAotICAgICAgLy8gbmVlZHMuIFJldHVybiB0aGUgbmV3IGRldmljZSB3aGVyZSB0aGUgc2VydmljZSB3aWxsIHJlZ2lzdGVyIHRoZQotICAgICAgLy8gaW50ZXJmYWNlcyBpdCBuZWVkcy4KLSAgICAgIGNvbm5lY3Rpb25fY2JfLlJ1bihuZXdEZXZpY2UpOwotCi0gICAgICBpZiAoZmVhdHVyZV9pdGVyLT5zZWNvbmQgJiBCVEFfQVZfRkVBVF9BRFZfQ1RSTCkgewotICAgICAgICBuZXdEZXZpY2UtPlJlZ2lzdGVyVm9sdW1lQ2hhbmdlZCgpOwotICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZV8tPnZvbF8gIT0gbnVsbHB0cikgewotICAgICAgICBpbnN0YW5jZV8tPnZvbF8tPkRldmljZUNvbm5lY3RlZChuZXdEZXZpY2UtPkdldEFkZHJlc3MoKSk7Ci0gICAgICB9Ci0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0NMT1NFX0lORF9FVlQ6IHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IENvbm5lY3Rpb24gQ2xvc2VkIEV2ZW50IjsKLQotICAgICAgaWYgKGRldmljZV9tYXBfLmZpbmQoaGFuZGxlKSA9PSBkZXZpY2VfbWFwXy5lbmQoKSkgewotICAgICAgICBMT0coV0FSTklORykKLSAgICAgICAgICAgIDw8ICJDb25uZWN0aW9uIENsb3NlIHJlY2VpdmVkIGZyb20gZGV2aWNlIHRoYXQgZG9lc24ndCBleGlzdCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGF2cmNfLT5DbG9zZShoYW5kbGUpOwotICAgICAgZmVhdHVyZV9tYXBfLmVyYXNlKGRldmljZV9tYXBfW2hhbmRsZV0tPkdldEFkZHJlc3MoKSk7Ci0gICAgICBkZXZpY2VfbWFwX1toYW5kbGVdLT5EZXZpY2VEaXNjb25uZWN0ZWQoKTsKLSAgICAgIGRldmljZV9tYXBfLmVyYXNlKGhhbmRsZSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19CUk9XU0VfT1BFTl9JTkRfRVZUOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBCcm93c2UgT3BlbiBFdmVudCI7Ci0gICAgICAvLyBOT1RFIChhcGFuaWNrZSk6IFdlIGRvbid0IG5lZWQgdG8gZXhwbGljaXRseSBoYW5kbGUgdGhpcyBtZXNzYWdlCi0gICAgICAvLyBzaW5jZSB0aGUgQVZDVFAgTGF5ZXIgd2lsbCBzdGlsbCBzZW5kIHVzIGJyb3dzaW5nIG1lc3NhZ2VzCi0gICAgICAvLyByZWdhcmRsZXNzLiBJdCB3b3VsZCBiZSB1c2VmdWwgdG8gbm90ZSB0aGlzIHRob3VnaCBmb3IgZnV0dXJlCi0gICAgICAvLyBjb21wYXRpYmlsaXR5IGlzc3Vlcy4KLSAgICAgIGlmIChkZXZpY2VfbWFwXy5maW5kKGhhbmRsZSkgPT0gZGV2aWNlX21hcF8uZW5kKCkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJCcm93c2UgT3BlbmVkIHJlY2VpdmVkIGZyb20gZGV2aWNlIHRoYXQgZG9lc24ndCBleGlzdCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgYXV0byBicm93c2VfbXR1ID0gYXZyY18tPkdldEJyb3dzZU10dShoYW5kbGUpIC0gQVZDVF9IRFJfTEVOOwotICAgICAgZGV2aWNlX21hcF9baGFuZGxlXS0+U2V0QnJvd3NlTXR1KGJyb3dzZV9tdHUpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBBVlJDX0JST1dTRV9DTE9TRV9JTkRfRVZUOgotICAgICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogQnJvd3NlIENsb3NlIEV2ZW50IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIEFWUkNQIENvbnRyb2wgZXZlbnQiOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBDb25uZWN0aW9uSGFuZGxlcjo6QWNjZXB0b3JDb250cm9sQ2IodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwZWVyX2FkZHIpIHsKLSAgRENIRUNLKCFjb25uZWN0aW9uX2NiXy5pc19udWxsKCkpOwotCi0gIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IGhhbmRsZT0iIDw8IGxvZ2hleChoYW5kbGUpCi0gICAgICAgICAgICA8PCAiIHJlc3VsdD0iIDw8IGxvZ2hleChyZXN1bHQpCi0gICAgICAgICAgICA8PCAiIGFkZHI9IiA8PCAocGVlcl9hZGRyID8gcGVlcl9hZGRyLT5Ub1N0cmluZygpIDogIm5vbmUiKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBVlJDX09QRU5fSU5EX0VWVDogewotICAgICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogQ29ubmVjdGlvbiBPcGVuZWQgRXZlbnQiOwotCi0gICAgICBhdXRvJiYgY2FsbGJhY2sgPSBiYXNlOjpCaW5kKCZDb25uZWN0aW9uSGFuZGxlcjo6U2VuZE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgaGFuZGxlKTsKLSAgICAgIGF1dG8mJiBjdHJsX210dSA9IGF2cmNfLT5HZXRQZWVyTXR1KGhhbmRsZSkgLSBBVkNUX0hEUl9MRU47Ci0gICAgICBhdXRvJiYgYnJvd3NlX210dSA9IGF2cmNfLT5HZXRCcm93c2VNdHUoaGFuZGxlKSAtIEFWQ1RfSERSX0xFTjsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IG5ld0RldmljZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8RGV2aWNlPigKLSAgICAgICAgICAqcGVlcl9hZGRyLCBmYWxzZSwgY2FsbGJhY2ssIGN0cmxfbXR1LCBicm93c2VfbXR1KTsKLQotICAgICAgZGV2aWNlX21hcF9baGFuZGxlXSA9IG5ld0RldmljZTsKLSAgICAgIGNvbm5lY3Rpb25fY2JfLlJ1bihuZXdEZXZpY2UpOwotCi0gICAgICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgIDw8ICI6IFBlcmZvcm1pbmcgU0RQIG9uIGNvbm5lY3RlZCBkZXZpY2UuIGFkZHJlc3M9IgotICAgICAgICAgICAgICAgIDw8IHBlZXJfYWRkci0+VG9TdHJpbmcoKTsKLSAgICAgIGF1dG8gc2RwX2xhbWJkYSA9IFtdKENvbm5lY3Rpb25IYW5kbGVyKiBpbnN0YW5jZV8sIHVpbnQ4X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhdHVzLCB1aW50MTZfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmVhdHVyZXMpIHsKLSAgICAgICAgaWYgKGluc3RhbmNlXy0+ZGV2aWNlX21hcF8uZmluZChoYW5kbGUpID09Ci0gICAgICAgICAgICBpbnN0YW5jZV8tPmRldmljZV9tYXBfLmVuZCgpKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIjogTm8gZGV2aWNlIGZvdW5kIGZvciBoYW5kbGU6ICIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBkZXZpY2UgPSBpbnN0YW5jZV8tPmRldmljZV9tYXBfW2hhbmRsZV07Ci0gICAgICAgIGluc3RhbmNlXy0+ZmVhdHVyZV9tYXBfLmVtcGxhY2UoZGV2aWNlLT5HZXRBZGRyZXNzKCksIGZlYXR1cmVzKTsKLQotICAgICAgICAvLyBUT0RPIChhcGFuaWNrZSk6IFJlcG9ydCB0byB0aGUgVm9sdW1lSW50ZXJmYWNlIHRoYXQgYSBuZXcgRGV2aWNlIGlzCi0gICAgICAgIC8vIGNvbm5lY3RlZCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBhYnNvbHV0ZSB2b2x1bWUuCi0gICAgICAgIGlmIChmZWF0dXJlcyAmIEJUQV9BVl9GRUFUX0FEVl9DVFJMKSB7Ci0gICAgICAgICAgZGV2aWNlLT5SZWdpc3RlclZvbHVtZUNoYW5nZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZV8tPnZvbF8gIT0gbnVsbHB0cikgewotICAgICAgICAgIGluc3RhbmNlXy0+dm9sXy0+RGV2aWNlQ29ubmVjdGVkKGRldmljZS0+R2V0QWRkcmVzcygpKTsKLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgU2RwTG9va3VwKCpwZWVyX2FkZHIsIGJhc2U6OkJpbmQoc2RwX2xhbWJkYSwgdGhpcywgaGFuZGxlKSwgZmFsc2UpOwotCi0gICAgICBhdnJjXy0+T3BlbkJyb3dzZShoYW5kbGUsIEFWQ1RfQUNQKTsKLSAgICAgIEF2cmNwQ29ubmVjdChmYWxzZSwgUmF3QWRkcmVzczo6a0FueSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19DTE9TRV9JTkRfRVZUOiB7Ci0gICAgICBMT0coSU5GTykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBDb25uZWN0aW9uIENsb3NlZCBFdmVudCI7Ci0KLSAgICAgIGlmIChkZXZpY2VfbWFwXy5maW5kKGhhbmRsZSkgPT0gZGV2aWNlX21hcF8uZW5kKCkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpCi0gICAgICAgICAgICA8PCAiQ29ubmVjdGlvbiBDbG9zZSByZWNlaXZlZCBmcm9tIGRldmljZSB0aGF0IGRvZXNuJ3QgZXhpc3QiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBhdnJjXy0+Q2xvc2UoaGFuZGxlKTsKLSAgICAgIGZlYXR1cmVfbWFwXy5lcmFzZShkZXZpY2VfbWFwX1toYW5kbGVdLT5HZXRBZGRyZXNzKCkpOwotICAgICAgZGV2aWNlX21hcF9baGFuZGxlXS0+RGV2aWNlRGlzY29ubmVjdGVkKCk7Ci0gICAgICBkZXZpY2VfbWFwXy5lcmFzZShoYW5kbGUpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfQlJPV1NFX09QRU5fSU5EX0VWVDogewotICAgICAgTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogQnJvd3NlIE9wZW4gRXZlbnQiOwotICAgICAgLy8gTk9URSAoYXBhbmlja2UpOiBXZSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgaGFuZGxlIHRoaXMgbWVzc2FnZQotICAgICAgLy8gc2luY2UgdGhlIEFWQ1RQIExheWVyIHdpbGwgc3RpbGwgc2VuZCB1cyBicm93c2luZyBtZXNzYWdlcwotICAgICAgLy8gcmVnYXJkbGVzcy4gSXQgd291bGQgYmUgdXNlZnVsIHRvIG5vdGUgdGhpcyB0aG91Z2ggZm9yIGZ1dHVyZQotICAgICAgLy8gY29tcGF0aWJpbGl0eSBpc3N1ZXMuCi0gICAgICBpZiAoZGV2aWNlX21hcF8uZmluZChoYW5kbGUpID09IGRldmljZV9tYXBfLmVuZCgpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQnJvd3NlIE9wZW5lZCByZWNlaXZlZCBmcm9tIGRldmljZSB0aGF0IGRvZXNuJ3QgZXhpc3QiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGF1dG8gYnJvd3NlX210dSA9IGF2cmNfLT5HZXRCcm93c2VNdHUoaGFuZGxlKSAtIEFWQ1RfSERSX0xFTjsKLSAgICAgIGRldmljZV9tYXBfW2hhbmRsZV0tPlNldEJyb3dzZU10dShicm93c2VfbXR1KTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgQVZSQ19CUk9XU0VfQ0xPU0VfSU5EX0VWVDoKLSAgICAgIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IEJyb3dzZSBDbG9zZSBFdmVudCI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBBVlJDUCBDb250cm9sIGV2ZW50IjsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQ29ubmVjdGlvbkhhbmRsZXI6Ok1lc3NhZ2VDYih1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgdWludDhfdCBvcGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTVNHKiBwX21zZykgewotICBpZiAoZGV2aWNlX21hcF8uZmluZChoYW5kbGUpID09IGRldmljZV9tYXBfLmVuZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTWVzc2FnZSByZWNlaXZlZCBmb3IgdW5jb25uZWN0ZWQgZGV2aWNlOiBoYW5kbGU9IgotICAgICAgICAgICAgICAgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBwa3QgPSBBdnJjcE1lc3NhZ2VDb252ZXJ0ZXI6OlBhcnNlKHBfbXNnKTsKLQotICBpZiAob3Bjb2RlID09IEFWUkNfT1BfQlJPV1NFKSB7Ci0gICAgVkxPRyg0KSA8PCAiQnJvd3NlIE1lc3NhZ2UgcmVjZWl2ZWQgb24gaGFuZGxlICIgPDwgKHVuc2lnbmVkIGludCloYW5kbGU7Ci0gICAgZGV2aWNlX21hcF9baGFuZGxlXS0+QnJvd3NlTWVzc2FnZVJlY2VpdmVkKGxhYmVsLCBCcm93c2VQYWNrZXQ6OlBhcnNlKHBrdCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFZMT0coNCkgPDwgIk1lc3NhZ2UgcmVjZWl2ZWQgb24gaGFuZGxlICIgPDwgKHVuc2lnbmVkIGludCloYW5kbGU7Ci0gIGRldmljZV9tYXBfW2hhbmRsZV0tPk1lc3NhZ2VSZWNlaXZlZChsYWJlbCwgUGFja2V0OjpQYXJzZShwa3QpKTsKLX0KLQotdm9pZCBDb25uZWN0aW9uSGFuZGxlcjo6U2RwQ2IoUmF3QWRkcmVzcyBiZGFkZHIsIFNkcENhbGxiYWNrIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDT1ZFUllfREIqIGRpc2NfZGIsIGJvb2wgcmV0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGF0dXMpIHsKLSAgVkxPRygxKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IFNEUCBsb29rdXAgY2FsbGJhY2sgcmVjZWl2ZWQiOwotCi0gIGlmIChzdGF0dXMgPT0gU0RQX0NPTk5fRkFJTEVEIGFuZCAhcmV0cnkpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBTRFAgRmFpbHVyZSByZXRyeSBhZ2FpbiI7Ci0gICAgU2RwTG9va3VwKGJkYWRkciwgY2IsIHRydWUpOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQVZSQ19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICA8PCAiOiBTRFAgRmFpbHVyZTogc3RhdHVzID0gIiA8PCAodW5zaWduZWQgaW50KXN0YXR1czsKLSAgICBjYi5SdW4oc3RhdHVzLCAwLCAwKTsKLSAgICBvc2lfZnJlZShkaXNjX2RiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDaGVjayB0aGUgcGVlciBmZWF0dXJlcwotICB0U0RQX0RJU0NfUkVDKiBzZHBfcmVjb3JkID0gbnVsbHB0cjsKLSAgdWludDE2X3QgcGVlcl9mZWF0dXJlcyA9IDA7Ci0gIHVpbnQxNl90IHBlZXJfYXZyY3BfdmVyc2lvbiA9IDA7Ci0KLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBSZXBsYWNlIHRoaXMgaW4gZmF2b3Igb2Ygb3VyIG93biBzdXBwb3J0ZWQgZmVhdHVyZXMuCi0gIHNkcF9yZWNvcmQgPQotICAgICAgc2RwXy0+RmluZFNlcnZpY2VJbkRiKGRpc2NfZGIsIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MLCBudWxscHRyKTsKLSAgaWYgKHNkcF9yZWNvcmQgIT0gbnVsbHB0cikgewotICAgIExPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IERldmljZSAiIDw8IGJkYWRkci5Ub1N0cmluZygpCi0gICAgICAgICAgICAgIDw8ICIgc3VwcG9ydHMgcmVtb3RlIGNvbnRyb2wiOwotICAgIHBlZXJfZmVhdHVyZXMgfD0gQlRBX0FWX0ZFQVRfUkNDVDsKLQotICAgIGlmICgoc2RwXy0+RmluZEF0dHJpYnV0ZUluUmVjKHNkcF9yZWNvcmQsIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1QpKSAhPQotICAgICAgICBOVUxMKSB7Ci0gICAgICAvKiBnZXQgcHJvZmlsZSB2ZXJzaW9uIChpZiBmYWlsdXJlLCB2ZXJzaW9uIHBhcmFtZXRlciBpcyBub3QgdXBkYXRlZCkgKi8KLSAgICAgIHNkcF8tPkZpbmRQcm9maWxlVmVyc2lvbkluUmVjKAotICAgICAgICAgIHNkcF9yZWNvcmQsIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MLCAmcGVlcl9hdnJjcF92ZXJzaW9uKTsKLSAgICAgIFZMT0coMSkgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBEZXZpY2UgIiA8PCBiZGFkZHIuVG9TdHJpbmcoKQotICAgICAgICAgICAgICA8PCAiIHBlZXIgYXZyY3AgdmVyc2lvbj0iIDw8IGxvZ2hleChwZWVyX2F2cmNwX3ZlcnNpb24pOwotCi0gICAgICBpZiAocGVlcl9hdnJjcF92ZXJzaW9uID49IEFWUkNfUkVWXzFfMykgewotICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIGZlYXR1cmVzLCBhbm90aGVyIHdheSB0byBjaGVjayB0aGlzIGlzIHRvCi0gICAgICAgIC8vIHNlYXJjaCBmb3IgQ0FUMSBvbiB0aGUgcmVtb3RlIGRldmljZQotICAgICAgICBWTE9HKDEpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogRGV2aWNlICIgPDwgYmRhZGRyLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICA8PCAiIHN1cHBvcnRzIG1ldGFkYXRhIjsKLSAgICAgICAgcGVlcl9mZWF0dXJlcyB8PSAoQlRBX0FWX0ZFQVRfVkVORE9SIHwgQlRBX0FWX0ZFQVRfTUVUQURBVEEpOwotICAgICAgfQotICAgICAgaWYgKHBlZXJfYXZyY3BfdmVyc2lvbiA+PSBBVlJDX1JFVl8xXzQpIHsKLSAgICAgICAgLyogZ2V0IHN1cHBvcnRlZCBjYXRlZ29yaWVzICovCi0gICAgICAgIFZMT0coMSkgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiIEdldCBTdXBwb3J0ZWQgY2F0ZWdvcmllcyI7Ci0gICAgICAgIHRTRFBfRElTQ19BVFRSKiBzZHBfYXR0cmlidXRlID0KLSAgICAgICAgICAgIHNkcF8tPkZpbmRBdHRyaWJ1dGVJblJlYyhzZHBfcmVjb3JkLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUyk7Ci0gICAgICAgIGlmIChzZHBfYXR0cmlidXRlICE9IE5VTEwpIHsKLSAgICAgICAgICBWTE9HKDEpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgIDw8ICJHZXQgU3VwcG9ydGVkIGNhdGVnb3JpZXMgU0RQIEFUVFJJQlVURVMgIT0gbnVsbCI7Ci0gICAgICAgICAgdWludDE2X3QgY2F0ZWdvcmllcyA9IHNkcF9hdHRyaWJ1dGUtPmF0dHJfdmFsdWUudi51MTY7Ci0gICAgICAgICAgaWYgKGNhdGVnb3JpZXMgJiBBVlJDX1NVUEZfQ1RfQ0FUMikgewotICAgICAgICAgICAgVkxPRygxKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IERldmljZSAiIDw8IGJkYWRkci5Ub1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgc3VwcG9ydHMgYWR2YW5jZWQgY29udHJvbCI7Ci0gICAgICAgICAgICBpZiAoSXNBYnNvbHV0ZVZvbHVtZUVuYWJsZWQoJmJkYWRkcikpIHsKLSAgICAgICAgICAgICAgcGVlcl9mZWF0dXJlcyB8PSAoQlRBX0FWX0ZFQVRfQURWX0NUUkwpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY2F0ZWdvcmllcyAmIEFWUkNfU1VQRl9DVF9CUk9XU0UpIHsKLSAgICAgICAgICAgIFZMT0coMSkgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBEZXZpY2UgIiA8PCBiZGFkZHIuVG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICA8PCAiIHN1cHBvcnRzIGJyb3dzaW5nIjsKLSAgICAgICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX0JST1dTRSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc2RwX3JlY29yZCA9IHNkcF8tPkZpbmRTZXJ2aWNlSW5EYihkaXNjX2RiLCBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIGlmIChzZHBfcmVjb3JkICE9IG51bGxwdHIpIHsKLSAgICBWTE9HKDEpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogRGV2aWNlICIgPDwgYmRhZGRyLlRvU3RyaW5nKCkKLSAgICAgICAgICAgIDw8ICIgc3VwcG9ydHMgcmVtb3RlIGNvbnRyb2wgdGFyZ2V0IjsKLQotICAgIHVpbnQxNl90IHBlZXJfYXZyY3BfdGFyZ2V0X3ZlcnNpb24gPSAwOwotICAgIHNkcF8tPkZpbmRQcm9maWxlVmVyc2lvbkluUmVjKHNkcF9yZWNvcmQsIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZWVyX2F2cmNwX3RhcmdldF92ZXJzaW9uKTsKLSAgICBWTE9HKDEpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogRGV2aWNlICIgPDwgYmRhZGRyLlRvU3RyaW5nKCkKLSAgICAgICAgICAgIDw8ICIgcGVlciBhdnJjcCB0YXJnZXQgdmVyc2lvbj0iCi0gICAgICAgICAgICA8PCBsb2doZXgocGVlcl9hdnJjcF90YXJnZXRfdmVyc2lvbik7Ci0KLSAgICBpZiAoKHNkcF8tPkZpbmRBdHRyaWJ1dGVJblJlYyhzZHBfcmVjb3JkLCBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNUKSkgIT0KLSAgICAgICAgTlVMTCkgewotICAgICAgaWYgKHBlZXJfYXZyY3BfdGFyZ2V0X3ZlcnNpb24gPj0gQVZSQ19SRVZfMV80KSB7Ci0gICAgICAgIC8qIGdldCBzdXBwb3J0ZWQgY2F0ZWdvcmllcyAqLwotICAgICAgICBWTE9HKDEpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIiBHZXQgU3VwcG9ydGVkIGNhdGVnb3JpZXMiOwotICAgICAgICB0U0RQX0RJU0NfQVRUUiogc2RwX2F0dHJpYnV0ZSA9Ci0gICAgICAgICAgICBzZHBfLT5GaW5kQXR0cmlidXRlSW5SZWMoc2RwX3JlY29yZCwgQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVMpOwotICAgICAgICBpZiAoc2RwX2F0dHJpYnV0ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgVkxPRygxKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICA8PCAiR2V0IFN1cHBvcnRlZCBjYXRlZ29yaWVzIFNEUCBBVFRSSUJVVEVTICE9IG51bGwiOwotICAgICAgICAgIHVpbnQxNl90IGNhdGVnb3JpZXMgPSBzZHBfYXR0cmlidXRlLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgICAgICAgIGlmIChjYXRlZ29yaWVzICYgQVZSQ19TVVBGX0NUX0NBVDIpIHsKLSAgICAgICAgICAgIFZMT0coMSkgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBEZXZpY2UgIiA8PCBiZGFkZHIuVG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICA8PCAiIHN1cHBvcnRzIGFkdmFuY2VkIGNvbnRyb2wiOwotICAgICAgICAgICAgaWYgKElzQWJzb2x1dGVWb2x1bWVFbmFibGVkKCZiZGFkZHIpKSB7Ci0gICAgICAgICAgICAgIHBlZXJfZmVhdHVyZXMgfD0gKEJUQV9BVl9GRUFUX0FEVl9DVFJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBvc2lfZnJlZShkaXNjX2RiKTsKLQotICBjYi5SdW4oc3RhdHVzLCBwZWVyX2F2cmNwX3ZlcnNpb24sIHBlZXJfZmVhdHVyZXMpOwotfQotCi12b2lkIENvbm5lY3Rpb25IYW5kbGVyOjpTZW5kTWVzc2FnZSgKLSAgICB1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgYm9vbCBicm93c2UsCi0gICAgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPiBtZXNzYWdlKSB7Ci0gIHN0ZDo6c2hhcmVkX3B0cjw6OmJsdWV0b290aDo6UGFja2V0PiBwYWNrZXQgPSBWZWN0b3JQYWNrZXQ6Ok1ha2UoKTsKLSAgbWVzc2FnZS0+U2VyaWFsaXplKHBhY2tldCk7Ci0KLSAgdWludDhfdCBjdHlwZSA9IEFWUkNfUlNQX0FDQ0VQVDsKLSAgaWYgKCFicm93c2UpIHsKLSAgICBjdHlwZSA9Ci0gICAgICAgICh1aW50OF90KSg6OmJsdWV0b290aDo6UGFja2V0OjpTcGVjaWFsaXplPFBhY2tldD4ocGFja2V0KS0+R2V0Q1R5cGUoKSk7Ci0gIH0KLQotICBETE9HKElORk8pIDw8ICJTZW5kTWVzc2FnZSB0byBoYW5kbGU9IiA8PCBsb2doZXgoaGFuZGxlKTsKLQotICBCVF9IRFIqIHBrdCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0KLSAgcGt0LT5vZmZzZXQgPSBBVkNUX01TR19PRkZTRVQ7Ci0gIC8vIFRPRE8gKGFwYW5pY2tlKTogVXBkYXRlIHRoaXMgY29uc3RhbnQuIEN1cnJlbnRseSB0aGlzIGlzIGEgdW5pcXVlIGV2ZW50Ci0gIC8vIHVzZWQgdG8gdGVsbCB0aGUgQVZSQ1AgQVBJIGxheWVyIHRoYXQgdGhlIGRhdGEgaXMgcHJvcGVybHkgZm9ybWF0dGVkIGFuZAotICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkLiBJbiB0aGUgZnV0dXJlLCB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlIHNlbmRpbmcKLSAgLy8gdGhlIHBhY2tldCBzbyBub25lIG9mIHRoZXNlIGxheWVyIHNwZWNpZmljIGZpZWxkcyB3aWxsIGJlIHVzZWQuCi0gIHBrdC0+ZXZlbnQgPSAweEZGRkY7Ci0gIC8qIEhhbmRsZSBmb3IgQVZSQ1AgZnJhZ21lbnQgKi8KLSAgdWludDE2X3Qgb3BfY29kZSA9ICh1aW50MTZfdCkoOjpibHVldG9vdGg6OlBhY2tldDo6U3BlY2lhbGl6ZTxQYWNrZXQ+KHBhY2tldCktPkdldE9wY29kZSgpKTsKLSAgaWYgKCFicm93c2UgJiYgKG9wX2NvZGUgPT0gKHVpbnQxNl90KShPcGNvZGU6OlZFTkRPUikpKSB7Ci0gICAgcGt0LT5ldmVudCA9IG9wX2NvZGU7Ci0gIH0KLQotICAvLyBUT0RPIChhcGFuaWNrZSk6IFRoaXMgbGF5ZXIgc3BlY2lmaWMgc3R1ZmYgY2FuIGdvIGF3YXkgb25jZSB3ZSBtb3ZlIG92ZXIKLSAgLy8gdG8gdGhlIG5ldyBzZXJ2aWNlLgotICBwa3QtPmxheWVyX3NwZWNpZmljID0gQVZDVF9EQVRBX0NUUkw7Ci0gIGlmIChicm93c2UpIHsKLSAgICBwa3QtPmxheWVyX3NwZWNpZmljID0gQVZDVF9EQVRBX0JST1dTRTsKLSAgfQotCi0gIHBrdC0+bGVuID0gcGFja2V0LT5zaXplKCk7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9ICh1aW50OF90KikocGt0ICsgMSkgKyBwa3QtPm9mZnNldDsKLSAgZm9yIChhdXRvIGl0ID0gcGFja2V0LT5iZWdpbigpOyBpdCAhPSBwYWNrZXQtPmVuZCgpOyBpdCsrKSB7Ci0gICAgKnBfZGF0YSsrID0gKml0OwotICB9Ci0KLSAgYXZyY18tPk1zZ1JlcShoYW5kbGUsIGxhYmVsLCBjdHlwZSwgcGt0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL2Nvbm5lY3Rpb25faGFuZGxlci5oIGIvcHJvZmlsZS9hdnJjcC9jb25uZWN0aW9uX2hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyMGI2My4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL2Nvbm5lY3Rpb25faGFuZGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvd2Vha19wdHIuaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYXZyY3BfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvYXZyY3BfcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0L2Jhc2UvcGFja2V0LmgiCi0jaW5jbHVkZSAicHJvZmlsZS9hdnJjcC9kZXZpY2UuaCIKLSNpbmNsdWRlICJyYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLS8vIFRPRE86IFJlbW92ZSB0aGUgc2luZ2xldG9uIGRlc2lnbiBzdHJ1Y3R1cmUgZm9yIHRoaXMgY2xhc3MuCi0vLyBBdnJjcFRhcmdldFNlcnZpY2UgaXMgYWxyZWFkeSBhIHNpbmdsZXRvbiBhbmQgY2FuIG1hbmFnZSB0aGUgbGlmZXRpbWUgb2YgdGhpcwotLy8gb2JqZWN0LiBtdWx0aXBsZSBzaW5nbGV0b24gb2JqZWN0cyBjYW4gbGVhZCB0byBjb2RlIHRoYXQgaXMgaGFyZCB0byB0ZXN0IGFuZAotLy8gaGF2ZSBoYXJkIHRvIGRlYnVnIGxpZmV0aW1lcy4KLQotLy8gVE9ETyAoYXBhbmlja2UpOiBVc2UgYSBkZXZpY2UgZmFjdG9yeSBpbnN0ZWFkIG9mIGp1c3QgdGhlIGNvbnN0cnVjdG9yIGluCi0vLyBvcmRlciB0byBjcmVhdGUgZGV2aWNlIG9iamVjdHMuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBjcmVhdGUgc3BlY2lmaWMgZGV2aWNlCi0vLyBjbGFzc2VzIHRoYXQgY2FuIHByb3ZpZGUgaW50ZXJvcCBmaXhlcyBmb3IgY2VydGFpbiBiYWRseSBiZWhhdmluZyBkZXZpY2VzLgotCi0vKioKLSAqIENvbm5lY3Rpb25IYW5kbGVyIGhhbmRsZXMgU0RQLCBjb25uZWN0aW5nIHRvIHJlbW90ZSBBVlJDUCBkZXZpY2VzCi0gKiBhbmQgbXVsdGlwbGV4aW5nL2RlbGl2ZXJpbmcgbWVzc2FnZXMgdG8gZGV2aWNlcy4KLSAqLwotY2xhc3MgQ29ubmVjdGlvbkhhbmRsZXIgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byByZXR1cm4gYSBuZXcgZGV2aWNlIGFmdGVyIGEgY29ubmVjdGlvbiBhdHRlbXB0LgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV3IEF2cmNwIGRldmljZSBpcyBsb2NhdGVkIGluIHRoZSBzaGFyZWRfcHRyLgotICAgKiBJZiB0aGVyZSB3YXMgYW4gaXNzdWUgZHVyaW5nIGNvbm5lY3Rpb24gdGhlIHBvaW50ZXIgdmFsdWUgd2lsbCBiZSBudWxsLgotICAgKi8KLSAgdXNpbmcgQ29ubmVjdGlvbkNhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPik+OwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGFuZCBzZXRzIHVwIFNEUC4gQWxzbyBPcGVucyB0aGUKLSAgICogQVZSQ1AgQWNjZXB0b3IgdG8gcmVjZWl2ZSBjb25uZWN0aW9uIHJlcXVlc3RzIGZyb20gYSByZW1vdGUgZGV2aWNlLgotICAgKgotICAgKiBQYXJhbXM6Ci0gICAqIGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0aGF0IGdldHMgY2FsbGVkIGFueSB0aW1lIGEgbmV3IEFWUkNQIERldmljZQotICAgKiAgICAgICAgICAgIGlzIGNvbm5lY3RlZC4gV2lsbCByZXR1cm4gbnVsbHBvaW50ZXIgaWYgYSBkZXZpY2UgZmFpbHMKLSAgICogICAgICAgICAgICB0byBjb25uZWN0IHZpYSBDb25uZWN0RGV2aWNlKCk7Ci0gICAqCi0gICAqIFRPRE86IEFkZCBtZXNzYWdlIGxvb3AgdG8gZGV0ZXJtaW5lIHdoaWNoIHRocmVhZCBldmVudHMgYXJlIHBvc3RlZCB0bwotICAgKi8KLSAgc3RhdGljIGJvb2wgSW5pdGlhbGl6ZShjb25zdCBDb25uZWN0aW9uQ2FsbGJhY2smIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF2cmNwSW50ZXJmYWNlKiBhdnJjcCwgU2RwSW50ZXJmYWNlKiBzZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSW50ZXJmYWNlKiB2b2wpOwotCi0gIC8qKgotICAgKiBDbGVhcnMgdGhlIHNpbmdsZXRvbiBhbmQgdGVhcnMgZG93biBTRFAKLSAgICovCi0gIHN0YXRpYyBib29sIENsZWFuVXAoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ29ubmVjdGlvbiBIYW5kbGVyCi0gICAqLwotICBzdGF0aWMgQ29ubmVjdGlvbkhhbmRsZXIqIEdldCgpOwotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGNvbm5lY3QgQVZSQ1Agb24gYSBkZXZpY2UuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoCi0gICAqIGVpdGhlciBhIHNtYXJ0IHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhlIGNvbm5lY3RlZCBBVlJDUCBkZXZpY2Ugb3IgbnVsbAotICAgKiBpZiB0aGUgY29ubmVjdGlvbiBmYWlsZWQuCi0gICAqCi0gICAqIFRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGZvciB0aGlzIGZ1bmN0aW9uIGlzIGFzIGZvbGxvd3MuCi0gICAqICAgMS4gUGVyZm9ybSBTRFAgb24gcmVtb3RlIGRldmljZQotICAgKiAgIDIuIENvbm5lY3QgdGhlIEFWQ1RQIENoYW5uZWwKLSAgICogICAyLiAoT3B0aW9uYWwpIElmIHN1cHBvcnRlZCBjb25uZWN0IHRoZSBBVkNUUCBCcm93c2UgY2hhbm5lbAotICAgKiAgIDQuIENhbGwgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIHdpdGggdGhlIG5ldwotICAgKgotICAgKiBQYXJhbXM6Ci0gICAqIGJkYWRkciAtIEJsdWV0b290aCBhZGRyZXNzIG9mIGRldmljZSB0byBjb25uZWN0IHRvCi0gICAqIGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gc3VjY2VlZHMgb3IKLSAgICogICAgICAgICAgICBmYWlscy4gVGhlIHBvaW50ZXIgYmVpbmcgY2xlYXJlZCBpbXBsaWVzIHRoYXQgdGhlIGNvbm5lY3Rpb24KLSAgICogICAgICAgICAgICBmYWlsZWQuCi0gICAqCi0gICAqIFJldHVybnM6Ci0gICAqIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCBzdGFydHMsIGZhbHNlIGlmIHRoZXJlIGFyZSBubyByZXNvdXJjZXMgdG8KLSAgICogY29ubmVjdCBBVlJDUAotICAgKi8KLSAgdmlydHVhbCBib29sIENvbm5lY3REZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyKTsKLQotICAvKioKLSAgICogRGlzY29ubmVjdHMgQVZSQ1AgZnJvbSBhIGRldmljZSB0aGF0IHdhcyBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvbyB1c2luZwotICAgKiBDb25uZWN0aW9uSGFuZGxlcjo6Q29ubmVjdERldmljZQotICAgKgotICAgKiBSZXR1cm5zOgotICAgKiB0cnVlIGlmIHRoZSBBVlJDUCB3YXMgc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmb3IgdGhlIGRldmljZSBvciBmYWxzZQotICAgKiBpZiB0aGUgZGV2aWNlIHdhcyBhbHJlYWR5IGRpc2Nvbm5lY3RlZCBvciBpbiBhbiBpbnZhbGlkIHN0YXRlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgRGlzY29ubmVjdERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIG9mIGEgZGV2aWNlIG9uIHRoZSBCSVAgT0JFWCBzZXJ2ZXIuCi0gICAqCi0gICAqIFRoaXMgc3RhdHVzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGluY2x1ZGUgaW1hZ2UgaGFuZGxlcwotICAgKiB3aGVuIGJ1aWxkaW5nIHJlc3BvbnNlcyBmb3IgbWVkaWEgaXRlbSBtZXRhZGF0YSBxdWVyaWVzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNldEJpcENsaWVudFN0YXR1cyhjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsIGJvb2wgY29ubmVjdGVkKTsKLQotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+PiBHZXRMaXN0T2ZEZXZpY2VzKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGUgYSBjdXN0b20gQ29ubmVjdGlvbkhhbmRsZXIgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IEdldCgpLgotICAgKiBJbml0aWFsaXplIGFuZCBDbGVhblVwIHNob3VsZCBub3QgYmUgY2FsbGVkIGFzIHRoZSBvd25lciBvZiB0aGUgaGFuZGxlcgotICAgKiBkZXRlcm1pbmVzIGl0cyBsaWZldGltZS4KLSAgICovCi0gIHN0YXRpYyB2b2lkIEluaXRGb3JUZXN0aW5nKENvbm5lY3Rpb25IYW5kbGVyKiBoYW5kbGVyKTsKLQotIHByaXZhdGU6Ci0gIEF2cmNwSW50ZXJmYWNlKiBhdnJjXzsKLSAgU2RwSW50ZXJmYWNlKiBzZHBfOwotICBWb2x1bWVJbnRlcmZhY2UqIHZvbF87Ci0KLSAgQ29ubmVjdGlvbkNhbGxiYWNrIGNvbm5lY3Rpb25fY2JfOwotCi0gIHN0ZDo6bWFwPHVpbnQ4X3QsIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+PiBkZXZpY2VfbWFwXzsKLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBSZXBsYWNlIHRoZSBmZWF0dXJlcyB3aXRoIGEgY2xhc3MgdGhhdCBoYXMgaW5kaXZpZHVhbAotICAvLyBmaWVsZHMuCi0gIHN0ZDo6bWFwPFJhd0FkZHJlc3MsIHVpbnQxNl90PiBmZWF0dXJlX21hcF87Ci0KLSAgc3RhdGljIENvbm5lY3Rpb25IYW5kbGVyKiBpbnN0YW5jZV87Ci0KLSAgdXNpbmcgU2RwQ2FsbGJhY2sgPSBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQxNl90IHN0YXR1cywgdWludDE2X3QgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZlYXR1cmVzKT47Ci0gIHZpcnR1YWwgYm9vbCBTZHBMb29rdXAoY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLCBTZHBDYWxsYmFjayBjYiwgYm9vbCByZXRyeSk7Ci0gIHZvaWQgU2RwQ2IoUmF3QWRkcmVzcyBiZGFkZHIsIFNkcENhbGxiYWNrIGNiLAotICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBkaXNjX2RiLCBib29sIHJldHJ5LCB1aW50MTZfdCBzdGF0dXMpOwotCi0gIHZpcnR1YWwgYm9vbCBBdnJjcENvbm5lY3QoYm9vbCBpbml0aWF0b3IsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcik7Ci0KLSAgLy8gQ2FsbGJhY2tzIHdoZW4gY29ubmVjdGluZyB0byBhIGRldmljZQotICB2b2lkIEluaXRpYXRvckNvbnRyb2xDYih1aW50OF90IGhhbmRsZSwgdWludDhfdCBldmVudCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwZWVyX2FkZHIpOwotICB2b2lkIEFjY2VwdG9yQ29udHJvbENiKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGV2ZW50LCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogcGVlcl9hZGRyKTsKLSAgdm9pZCBNZXNzYWdlQ2IodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICB0QVZSQ19NU0cqIHBfbXNnKTsKLQotICBDb25uZWN0aW9uSGFuZGxlcigpIDogd2Vha19wdHJfZmFjdG9yeV8odGhpcyl7fTsKLSAgdmlydHVhbCB+Q29ubmVjdGlvbkhhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQ2FsbGJhY2sgZm9yIHdoZW4gc2VuZGluZyBhIHJlc3BvbnNlIHRvIGEgZGV2aWNlCi0gIHZvaWQgU2VuZE1lc3NhZ2UodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIGJvb2wgYnJvd3NlLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjw6OmJsdWV0b290aDo6UGFja2V0QnVpbGRlcj4gbWVzc2FnZSk7Ci0KLSAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8Q29ubmVjdGlvbkhhbmRsZXI+IHdlYWtfcHRyX2ZhY3RvcnlfOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29ubmVjdGlvbkhhbmRsZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL2RldmljZS5jYyBiL3Byb2ZpbGUvYXZyY3AvZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhmYzI0Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgImRldmljZS5oIgotCi0jaW5jbHVkZSAiYWJzdHJhY3RfbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbl9oYW5kbGVyLmgiCi0jaW5jbHVkZSAicGFja2V0L2F2cmNwL2F2cmNwX3JlamVjdF9wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvZ2VuZXJhbF9yZWplY3RfcGFja2V0LmgiCi0jaW5jbHVkZSAicGFja2V0L2F2cmNwL2dldF9wbGF5X3N0YXR1c19wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvcGFzc190aHJvdWdoX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9zZXRfYWJzb2x1dGVfdm9sdW1lLmgiCi0jaW5jbHVkZSAicGFja2V0L2F2cmNwL3NldF9hZGRyZXNzZWRfcGxheWVyLmgiCi0jaW5jbHVkZSAic3RhY2tfY29uZmlnLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLSNkZWZpbmUgREVWSUNFX0xPRyhMRVZFTCkgTE9HKExFVkVMKSA8PCBhZGRyZXNzXy5Ub1N0cmluZygpIDw8ICIgOiAiCi0jZGVmaW5lIERFVklDRV9WTE9HKExFVkVMKSBWTE9HKExFVkVMKSA8PCBhZGRyZXNzXy5Ub1N0cmluZygpIDw8ICIgOiAiCi0KLSNkZWZpbmUgVk9MX05PVF9TVVBQT1JURUQgLTEKLSNkZWZpbmUgVk9MX1JFR0lTVFJBVElPTl9GQUlMRUQgLTIKLQotRGV2aWNlOjpEZXZpY2UoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLCBib29sIGF2cmNwMTNfY29tcGF0aWJpbGl0eSwKLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgbGFiZWwsIGJvb2wgYnJvd3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPiBtZXNzYWdlKT4KLSAgICAgICAgc2VuZF9tc2dfY2IsCi0gICAgdWludDE2X3QgY3RybF9tdHUsIHVpbnQxNl90IGJyb3dzZV9tdHUpCi0gICAgOiB3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSwKLSAgICAgIGFkZHJlc3NfKGJkYWRkciksCi0gICAgICBhdnJjcDEzX2NvbXBhdGliaWxpdHlfKGF2cmNwMTNfY29tcGF0aWJpbGl0eSksCi0gICAgICBzZW5kX21lc3NhZ2VfY2JfKHNlbmRfbXNnX2NiKSwKLSAgICAgIGN0cmxfbXR1XyhjdHJsX210dSksCi0gICAgICBicm93c2VfbXR1Xyhicm93c2VfbXR1KSwKLSAgICAgIGhhc19iaXBfY2xpZW50XyhmYWxzZSkge30KLQotdm9pZCBEZXZpY2U6OlJlZ2lzdGVySW50ZXJmYWNlcyhNZWRpYUludGVyZmFjZSogbWVkaWFfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwSW50ZXJmYWNlKiBhMmRwX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSW50ZXJmYWNlKiB2b2x1bWVfaW50ZXJmYWNlKSB7Ci0gIENIRUNLKG1lZGlhX2ludGVyZmFjZSk7Ci0gIENIRUNLKGEyZHBfaW50ZXJmYWNlKTsKLSAgYTJkcF9pbnRlcmZhY2VfID0gYTJkcF9pbnRlcmZhY2U7Ci0gIG1lZGlhX2ludGVyZmFjZV8gPSBtZWRpYV9pbnRlcmZhY2U7Ci0gIHZvbHVtZV9pbnRlcmZhY2VfID0gdm9sdW1lX2ludGVyZmFjZTsKLX0KLQotYmFzZTo6V2Vha1B0cjxEZXZpY2U+IERldmljZTo6R2V0KCkgewotICByZXR1cm4gd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpOwotfQotCi12b2lkIERldmljZTo6U2V0QnJvd3NlTXR1KHVpbnQxNl90IGJyb3dzZV9tdHUpIHsKLSAgREVWSUNFX0xPRyhJTkZPKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IGJyb3dzZV9tdHUgPSAiIDw8IGJyb3dzZV9tdHU7Ci0gIGJyb3dzZV9tdHVfID0gYnJvd3NlX210dTsKLX0KLQotdm9pZCBEZXZpY2U6OlNldEJpcENsaWVudFN0YXR1cyhib29sIGNvbm5lY3RlZCkgewotICBERVZJQ0VfTE9HKElORk8pIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogY29ubmVjdGVkID0gIiA8PCBjb25uZWN0ZWQ7Ci0gIGhhc19iaXBfY2xpZW50XyA9IGNvbm5lY3RlZDsKLX0KLQotYm9vbCBEZXZpY2U6Okhhc0JpcENsaWVudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhc19iaXBfY2xpZW50XzsKLX0KLQotdm9pZCBmaWx0ZXJfY292ZXJfYXJ0KFNvbmdJbmZvJiBzKSB7Ci0gIGZvciAoYXV0byBpdCA9IHMuYXR0cmlidXRlcy5iZWdpbigpOyBpdCAhPSBzLmF0dHJpYnV0ZXMuZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoaXQtPmF0dHJpYnV0ZSgpID09IEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQpIHsKLSAgICAgIHMuYXR0cmlidXRlcy5lcmFzZShpdCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBEZXZpY2U6OklzQWN0aXZlKCkgY29uc3QgewotICByZXR1cm4gYWRkcmVzc18gPT0gYTJkcF9pbnRlcmZhY2VfLT5hY3RpdmVfcGVlcigpOwotfQotCi1ib29sIERldmljZTo6SXNJblNpbGVuY2VNb2RlKCkgY29uc3QgewotICByZXR1cm4gYTJkcF9pbnRlcmZhY2VfLT5pc19wZWVyX2luX3NpbGVuY2VfbW9kZShhZGRyZXNzXyk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpWZW5kb3JQYWNrZXRIYW5kbGVyKHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmVuZG9yUGFja2V0PiBwa3QpIHsKLSAgQ0hFQ0sobWVkaWFfaW50ZXJmYWNlXyk7Ci0gIERFVklDRV9WTE9HKDMpIDw8IF9fZnVuY19fIDw8ICI6IHBkdT0iIDw8IHBrdC0+R2V0Q29tbWFuZFBkdSgpOwotCi0gIGlmICghcGt0LT5Jc1ZhbGlkKCkpIHsKLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFJlcXVlc3QgcGFja2V0IGlzIG5vdCB2YWxpZCI7Ci0gICAgYXV0byByZXNwb25zZSA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHN0YXRpY19jYXN0PENvbW1hbmRQZHU+KDApLCBTdGF0dXM6OklOVkFMSURfQ09NTUFORCk7Ci0gICAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQWxsIENUeXBlcyBhdCBhbmQgYWJvdmUgTk9UX0lNUExFTUVOVEVEIGFyZSBhbGwgcmVzcG9uc2UgdHlwZXMuCi0gIGlmIChwa3QtPkdldENUeXBlKCkgPT0gQ1R5cGU6Ok5PVF9JTVBMRU1FTlRFRCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwa3QtPkdldENUeXBlKCkgPj0gQ1R5cGU6OkFDQ0VQVEVEKSB7Ci0gICAgc3dpdGNoIChwa3QtPkdldENvbW1hbmRQZHUoKSkgewotICAgICAgLy8gVk9MVU1FX0NIQU5HRUQgaXMgdGhlIG9ubHkgbm90aWZpY2F0aW9uIHdlIHJlZ2lzdGVyIGZvciB3aGlsZSB0YXJnZXQuCi0gICAgICBjYXNlIENvbW1hbmRQZHU6OlJFR0lTVEVSX05PVElGSUNBVElPTjogewotICAgICAgICBhdXRvIHJlZ2lzdGVyX25vdGlmaWNhdGlvbiA9Ci0gICAgICAgICAgICBQYWNrZXQ6OlNwZWNpYWxpemU8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZT4ocGt0KTsKLQotICAgICAgICBpZiAoIXJlZ2lzdGVyX25vdGlmaWNhdGlvbi0+SXNWYWxpZCgpKSB7Ci0gICAgICAgICAgREVWSUNFX0xPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZXF1ZXN0IHBhY2tldCBpcyBub3QgdmFsaWQiOwotICAgICAgICAgIGF1dG8gcmVzcG9uc2UgPQotICAgICAgICAgICAgICBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihwa3QtPkdldENvbW1hbmRQZHUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUik7Ci0gICAgICAgICAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgICAgICAgYWN0aXZlX2xhYmVsc18uZXJhc2UobGFiZWwpOwotICAgICAgICAgIHZvbHVtZV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgICAgICAgICB2b2x1bWVfID0gVk9MX1JFR0lTVFJBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZ2lzdGVyX25vdGlmaWNhdGlvbi0+R2V0RXZlbnQoKSAhPSBFdmVudDo6Vk9MVU1FX0NIQU5HRUQpIHsKLSAgICAgICAgICBERVZJQ0VfTE9HKFdBUk5JTkcpCi0gICAgICAgICAgICAgIDw8IF9fZnVuY19fIDw8ICI6IFVuaGFuZGxlZCByZWdpc3RlciBub3RpZmljYXRpb24gcmVjZWl2ZWQ6ICIKLSAgICAgICAgICAgICAgPDwgcmVnaXN0ZXJfbm90aWZpY2F0aW9uLT5HZXRFdmVudCgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBIYW5kbGVWb2x1bWVDaGFuZ2VkKGxhYmVsLCByZWdpc3Rlcl9ub3RpZmljYXRpb24pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ29tbWFuZFBkdTo6U0VUX0FCU09MVVRFX1ZPTFVNRToKLSAgICAgICAgLy8gVE9ETyAoYXBhbmlja2UpOiBBZGQgYSByZXRyeSBtZWNoYW5pc20gaWYgdGhlIHJlc3BvbnNlIGhhcyBhCi0gICAgICAgIC8vIGRpZmZlcmVudCB2b2x1bWUgdGhhbiB0aGUgb25lIHdlIHNldC4gRm9yIG5vdywgd2UgZG9uJ3QgY2FyZQotICAgICAgICAvLyBhYm91dCB0aGUgcmVzcG9uc2UgdG8gdGhpcyBtZXNzYWdlLgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFVklDRV9MT0coV0FSTklORykKLSAgICAgICAgICAgIDw8IF9fZnVuY19fIDw8ICI6IFVuaGFuZGxlZCBSZXNwb25zZTogcGR1PSIgPDwgcGt0LT5HZXRDb21tYW5kUGR1KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBzd2l0Y2ggKHBrdC0+R2V0Q29tbWFuZFBkdSgpKSB7Ci0gICAgY2FzZSBDb21tYW5kUGR1OjpHRVRfQ0FQQUJJTElUSUVTOiB7Ci0gICAgICBIYW5kbGVHZXRDYXBhYmlsaXRpZXMobGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OjpTcGVjaWFsaXplPEdldENhcGFiaWxpdGllc1JlcXVlc3Q+KHBrdCkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIENvbW1hbmRQZHU6OlJFR0lTVEVSX05PVElGSUNBVElPTjogewotICAgICAgSGFuZGxlTm90aWZpY2F0aW9uKGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDo6U3BlY2lhbGl6ZTxSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3Q+KHBrdCkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIENvbW1hbmRQZHU6OkdFVF9FTEVNRU5UX0FUVFJJQlVURVM6IHsKLSAgICAgIGF1dG8gZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BrdCA9IFBhY2tldDo6U3BlY2lhbGl6ZTxHZXRFbGVtZW50QXR0cmlidXRlc1JlcXVlc3Q+KHBrdCk7Ci0KLSAgICAgIGlmICghZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BrdC0+SXNWYWxpZCgpKSB7Ci0gICAgICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUmVxdWVzdCBwYWNrZXQgaXMgbm90IHZhbGlkIjsKLSAgICAgICAgYXV0byByZXNwb25zZSA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHBrdC0+R2V0Q29tbWFuZFBkdSgpLCBTdGF0dXM6OklOVkFMSURfUEFSQU1FVEVSKTsKLSAgICAgICAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG1lZGlhX2ludGVyZmFjZV8tPkdldFNvbmdJbmZvKGJhc2U6OkJpbmQoJkRldmljZTo6R2V0RWxlbWVudEF0dHJpYnV0ZXNSZXNwb25zZSwgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCwgZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BrdCkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIENvbW1hbmRQZHU6OkdFVF9QTEFZX1NUQVRVUzogewotICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0UGxheVN0YXR1cyhiYXNlOjpCaW5kKCZEZXZpY2U6OkdldFBsYXlTdGF0dXNSZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBDb21tYW5kUGR1OjpQTEFZX0lURU06IHsKLSAgICAgIEhhbmRsZVBsYXlJdGVtKGxhYmVsLCBQYWNrZXQ6OlNwZWNpYWxpemU8UGxheUl0ZW1SZXF1ZXN0Pihwa3QpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBDb21tYW5kUGR1OjpTRVRfQUREUkVTU0VEX1BMQVlFUjogewotICAgICAgLy8gVE9ETyAoYXBhbmlja2UpOiBJbXBsZW1lbnQgc2V0IGFkZHJlc3NlZCBwbGF5ZXIuIFdlIGRvbid0IG5lZWQKLSAgICAgIC8vIHRoaXMgY3VycmVudGx5IHNpbmNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgaGFzIG9uZQotICAgICAgLy8gcGxheWVyIGFuZCB0aGUgcGxheWVyIHdpbGwgbmV2ZXIgY2hhbmdlLCBidXQgd2UgbmVlZCBpdCBmb3IgYQotICAgICAgLy8gbW9yZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgIGF1dG8gc2V0X2FkZHJlc3NlZF9wbGF5ZXJfcmVxdWVzdCA9IFBhY2tldDo6U3BlY2lhbGl6ZTxTZXRBZGRyZXNzZWRQbGF5ZXJSZXF1ZXN0Pihwa3QpOwotCi0gICAgICBpZiAoIXNldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QtPklzVmFsaWQoKSkgewotICAgICAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFJlcXVlc3QgcGFja2V0IGlzIG5vdCB2YWxpZCI7Ci0gICAgICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihwa3QtPkdldENvbW1hbmRQZHUoKSwgU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUik7Ci0gICAgICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIG1lZGlhX2ludGVyZmFjZV8tPkdldE1lZGlhUGxheWVyTGlzdChiYXNlOjpCaW5kKCZEZXZpY2U6OkhhbmRsZVNldEFkZHJlc3NlZFBsYXllciwgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwsIHNldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDogewotICAgICAgREVWSUNFX0xPRyhFUlJPUikgPDwgIlVuaGFuZGxlZCBWZW5kb3IgUGFja2V0OiAiIDw8IHBrdC0+VG9TdHJpbmcoKTsKLSAgICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgICAgICAoQ29tbWFuZFBkdSlwa3QtPkdldENvbW1hbmRQZHUoKSwgU3RhdHVzOjpJTlZBTElEX0NPTU1BTkQpOwotICAgICAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi12b2lkIERldmljZTo6SGFuZGxlR2V0Q2FwYWJpbGl0aWVzKAotICAgIHVpbnQ4X3QgbGFiZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxHZXRDYXBhYmlsaXRpZXNSZXF1ZXN0PiYgcGt0KSB7Ci0gIERFVklDRV9WTE9HKDQpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IGNhcGFiaWxpdHk9IiA8PCBwa3QtPkdldENhcGFiaWxpdHlSZXF1ZXN0ZWQoKTsKLQotICBpZiAoIXBrdC0+SXNWYWxpZCgpKSB7Ci0gICAgREVWSUNFX0xPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZXF1ZXN0IHBhY2tldCBpcyBub3QgdmFsaWQiOwotICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihwa3QtPkdldENvbW1hbmRQZHUoKSwgU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUik7Ci0gICAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChwa3QtPkdldENhcGFiaWxpdHlSZXF1ZXN0ZWQoKSkgewotICAgIGNhc2UgQ2FwYWJpbGl0eTo6Q09NUEFOWV9JRDogewotICAgICAgYXV0byByZXNwb25zZSA9Ci0gICAgICAgICAgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQ29tcGFueUlkQnVpbGRlcigweDAwMTk1OCk7Ci0gICAgICByZXNwb25zZS0+QWRkQ29tcGFueUlkKDB4MDAyMzQ1KTsKLSAgICAgIHNlbmRfbWVzc2FnZV9jYl8uUnVuKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQ2FwYWJpbGl0eTo6RVZFTlRTX1NVUFBPUlRFRDogewotICAgICAgYXV0byByZXNwb25zZSA9Ci0gICAgICAgICAgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlRXZlbnRzU3VwcG9ydGVkQnVpbGRlcigKLSAgICAgICAgICAgICAgRXZlbnQ6OlBMQVlCQUNLX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgIHJlc3BvbnNlLT5BZGRFdmVudChFdmVudDo6VFJBQ0tfQ0hBTkdFRCk7Ci0gICAgICByZXNwb25zZS0+QWRkRXZlbnQoRXZlbnQ6OlBMQVlCQUNLX1BPU19DSEFOR0VEKTsKLQotICAgICAgaWYgKCFhdnJjcDEzX2NvbXBhdGliaWxpdHlfKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5BZGRFdmVudChFdmVudDo6QVZBSUxBQkxFX1BMQVlFUlNfQ0hBTkdFRCk7Ci0gICAgICAgIHJlc3BvbnNlLT5BZGRFdmVudChFdmVudDo6QUREUkVTU0VEX1BMQVlFUl9DSEFOR0VEKTsKLSAgICAgICAgcmVzcG9uc2UtPkFkZEV2ZW50KEV2ZW50OjpVSURTX0NIQU5HRUQpOwotICAgICAgICByZXNwb25zZS0+QWRkRXZlbnQoRXZlbnQ6Ok5PV19QTEFZSU5HX0NPTlRFTlRfQ0hBTkdFRCk7Ci0gICAgICB9Ci0KLSAgICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiB7Ci0gICAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8ICJVbmhhbmRsZWQgQ2FwYWJpbGl0eTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwa3QtPkdldENhcGFiaWxpdHlSZXF1ZXN0ZWQoKTsKLSAgICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihDb21tYW5kUGR1OjpHRVRfQ0FQQUJJTElUSUVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICAgICAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi12b2lkIERldmljZTo6SGFuZGxlTm90aWZpY2F0aW9uKAotICAgIHVpbnQ4X3QgbGFiZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3Q+JiBwa3QpIHsKLSAgaWYgKCFwa3QtPklzVmFsaWQoKSkgewotICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUmVxdWVzdCBwYWNrZXQgaXMgbm90IHZhbGlkIjsKLSAgICBhdXRvIHJlc3BvbnNlID0gUmVqZWN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIocGt0LT5HZXRDb21tYW5kUGR1KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERFVklDRV9WTE9HKDQpIDw8IF9fZnVuY19fIDw8ICI6IGV2ZW50PSIgPDwgcGt0LT5HZXRFdmVudFJlZ2lzdGVyZWQoKTsKLQotICBzd2l0Y2ggKHBrdC0+R2V0RXZlbnRSZWdpc3RlcmVkKCkpIHsKLSAgICBjYXNlIEV2ZW50OjpUUkFDS19DSEFOR0VEOiB7Ci0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXROb3dQbGF5aW5nTGlzdCgKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OlRyYWNrQ2hhbmdlZE5vdGlmaWNhdGlvblJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBsYWJlbCwgdHJ1ZSkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEV2ZW50OjpQTEFZQkFDS19TVEFUVVNfQ0hBTkdFRDogewotICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0UGxheVN0YXR1cygKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OlBsYXliYWNrU3RhdHVzTm90aWZpY2F0aW9uUmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIGxhYmVsLCB0cnVlKSk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgRXZlbnQ6OlBMQVlCQUNLX1BPU19DSEFOR0VEOiB7Ci0gICAgICBwbGF5X3Bvc19pbnRlcnZhbF8gPSBwa3QtPkdldEludGVydmFsKCk7Ci0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXRQbGF5U3RhdHVzKAotICAgICAgICAgIGJhc2U6OkJpbmQoJkRldmljZTo6UGxheWJhY2tQb3NOb3RpZmljYXRpb25SZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHRydWUpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFdmVudDo6Tk9XX1BMQVlJTkdfQ09OVEVOVF9DSEFOR0VEOiB7Ci0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXROb3dQbGF5aW5nTGlzdCgKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkhhbmRsZU5vd1BsYXlpbmdOb3RpZmljYXRpb25SZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHRydWUpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFdmVudDo6QVZBSUxBQkxFX1BMQVlFUlNfQ0hBTkdFRDogewotICAgICAgLy8gVE9ETyAoYXBhbmlja2UpOiBJZiB3ZSBtYWtlIGEgc2VwYXJhdGUgaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhpcywgbWFrZQotICAgICAgLy8gc3VyZSB0byByZWdpc3RlciB0aGUgbm90aWZpY2F0aW9uIGluIHRoZSBpbnRlcmltIHJlc3BvbnNlLgotCi0gICAgICAvLyBSZXNwb25kIGltbWVkaWF0ZWx5IHNpbmNlIHRoaXMgbm90aWZpY2F0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhbnkgaW5mbwotICAgICAgYXZhaWxfcGxheWVyc19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbih0cnVlLCBsYWJlbCk7Ci0gICAgICBhdXRvIHJlc3BvbnNlID0KLSAgICAgICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZUF2YWlsYWJsZVBsYXllcnNCdWlsZGVyKAotICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEV2ZW50OjpBRERSRVNTRURfUExBWUVSX0NIQU5HRUQ6IHsKLSAgICAgIG1lZGlhX2ludGVyZmFjZV8tPkdldE1lZGlhUGxheWVyTGlzdCgKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkFkZHJlc3NlZFBsYXllck5vdGlmaWNhdGlvblJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBsYWJlbCwgdHJ1ZSkpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEV2ZW50OjpVSURTX0NIQU5HRUQ6IHsKLSAgICAgIC8vIFRPRE8gKGFwYW5pY2tlKTogSWYgd2UgbWFrZSBhIHNlcGFyYXRlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoaXMsIG1ha2UKLSAgICAgIC8vIHN1cmUgdG8gcmVnaXN0ZXIgdGhlIG5vdGlmaWNhdGlvbiBpbiB0aGUgaW50ZXJpbSByZXNwb25zZS4KLQotICAgICAgLy8gUmVzcG9uZCBpbW1lZGlhdGVseSBzaW5jZSB0aGlzIG5vdGlmaWNhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYW55IGluZm8KLSAgICAgIHVpZHNfY2hhbmdlZF8gPSBOb3RpZmljYXRpb24odHJ1ZSwgbGFiZWwpOwotICAgICAgYXV0byByZXNwb25zZSA9Ci0gICAgICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VVaWRzQ2hhbmdlZEJ1aWxkZXIodHJ1ZSwgMCk7Ci0gICAgICBzZW5kX21lc3NhZ2UobGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDogewotICAgICAgREVWSUNFX0xPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiA6IFVua25vd24gZXZlbnQgcmVnaXN0ZXJlZC4gRXZlbnQgSUQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGt0LT5HZXRFdmVudFJlZ2lzdGVyZWQoKTsKLSAgICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgICAgICAoQ29tbWFuZFBkdSlwa3QtPkdldENvbW1hbmRQZHUoKSwgU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUik7Ci0gICAgICBzZW5kX21lc3NhZ2UobGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgICB9IGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpSZWdpc3RlclZvbHVtZUNoYW5nZWQoKSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fOwotICBpZiAodm9sdW1lX2ludGVyZmFjZV8gPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIGF1dG8gcmVxdWVzdCA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihFdmVudDo6Vk9MVU1FX0NIQU5HRUQsIDApOwotCi0gIC8vIEZpbmQgYW4gb3BlbiB0cmFuc2FjdGlvbiBsYWJlbCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyIGNvbW1hbmRzCi0gIC8vIHRoYXQgYXJlIGluIGZsaWdodC4gV2UgY2FuIG5vdCB1c2UgdGhlIHJlc2VydmVkIGxhYmVsIHdoaWxlIHRoZQotICAvLyBub3RpZmljYXRpb24gaGFzbid0IGJlZW4gY29tcGxldGVkLgotICB1aW50OF90IGxhYmVsID0gTUFYX1RSQU5TQUNUSU9OX0xBQkVMOwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBNQVhfVFJBTlNBQ1RJT05fTEFCRUw7IGkrKykgewotICAgIGlmIChhY3RpdmVfbGFiZWxzXy5maW5kKGkpID09IGFjdGl2ZV9sYWJlbHNfLmVuZCgpKSB7Ci0gICAgICBhY3RpdmVfbGFiZWxzXy5pbnNlcnQoaSk7Ci0gICAgICBsYWJlbCA9IGk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAobGFiZWwgPT0gTUFYX1RSQU5TQUNUSU9OX0xBQkVMKSB7Ci0gICAgREVWSUNFX0xPRyhGQVRBTCkKLSAgICAgICAgPDwgX19mdW5jX18KLSAgICAgICAgPDwgIjogQWJhbmRvbiBhbGwgaG9wZSwgc29tZXRoaW5nIHdlbnQgY2F0YXN0cm9waGljYWxseSB3cm9uZyI7Ci0gIH0KLQotICBzZW5kX21lc3NhZ2VfY2JfLlJ1bihsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXF1ZXN0KSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVWb2x1bWVDaGFuZ2VkKAotICAgIHVpbnQ4X3QgbGFiZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlPiYgcGt0KSB7Ci0gIERFVklDRV9WTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGludGVyaW09IiA8PCBwa3QtPklzSW50ZXJpbSgpOwotCi0gIGlmICh2b2x1bWVfaW50ZXJmYWNlXyA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgaWYgKHBrdC0+R2V0Q1R5cGUoKSA9PSBDVHlwZTo6UkVKRUNURUQpIHsKLSAgICAvLyBEaXNhYmxlIEFic29sdXRlIFZvbHVtZQotICAgIGFjdGl2ZV9sYWJlbHNfLmVyYXNlKGxhYmVsKTsKLSAgICB2b2x1bWVfaW50ZXJmYWNlXyA9IG51bGxwdHI7Ci0gICAgdm9sdW1lXyA9IFZPTF9SRUdJU1RSQVRJT05fRkFJTEVEOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFdlIG9ubHkgdXBkYXRlIG9uIGludGVyaW0gYW5kIGp1c3QgcmUtcmVnaXN0ZXIgb24gY2hhbmdlcy4KLSAgaWYgKCFwa3QtPklzSW50ZXJpbSgpKSB7Ci0gICAgYWN0aXZlX2xhYmVsc18uZXJhc2UobGFiZWwpOwotICAgIFJlZ2lzdGVyVm9sdW1lQ2hhbmdlZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEhhbmRsZSB0aGUgZmlyc3Qgdm9sdW1lIHVwZGF0ZS4KLSAgaWYgKHZvbHVtZV8gPT0gVk9MX05PVF9TVVBQT1JURUQpIHsKLSAgICB2b2x1bWVfID0gcGt0LT5HZXRWb2x1bWUoKTsKLSAgICB2b2x1bWVfICY9IH4weDgwOyAgLy8gcmVtb3ZlIFJGQSBiaXQKLSAgICB2b2x1bWVfaW50ZXJmYWNlXy0+RGV2aWNlQ29ubmVjdGVkKAotICAgICAgICBHZXRBZGRyZXNzKCksCi0gICAgICAgIGJhc2U6OkJpbmQoJkRldmljZTo6U2V0Vm9sdW1lLCB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKTsKLQotICAgIC8vIElnbm9yZSB0aGUgcmV0dXJuZWQgdm9sdW1lIGluIGZhdm9yIG9mIHRoZSB2b2x1bWUgcmV0dXJuZWQKLSAgICAvLyBieSB0aGUgdm9sdW1lIGludGVyZmFjZS4KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIUlzQWN0aXZlKCkpIHsKLSAgICBERVZJQ0VfVkxPRygzKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IElnbm9yaW5nIHZvbHVtZSBjaGFuZ2VzIGZyb20gbm9uIGFjdGl2ZSBkZXZpY2UiOwotICAgIHJldHVybjsKLSAgfQotCi0gIHZvbHVtZV8gPSBwa3QtPkdldFZvbHVtZSgpOwotICB2b2x1bWVfICY9IH4weDgwOyAgLy8gcmVtb3ZlIFJGQSBiaXQKLSAgREVWSUNFX1ZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogVm9sdW1lIGhhcyBjaGFuZ2VkIHRvICIgPDwgKHVpbnQzMl90KXZvbHVtZV87Ci0gIHZvbHVtZV9pbnRlcmZhY2VfLT5TZXRWb2x1bWUodm9sdW1lXyk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpTZXRWb2x1bWUoaW50OF90IHZvbHVtZSkgewotICAvLyBUT0RPIChhcGFuaWNrZSk6IEltcGxlbWVudCBsb2dpYyBmb3IgTXVsdGktQVZSQ1AKLSAgREVWSUNFX1ZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogdm9sdW1lPSIgPDwgKGludCl2b2x1bWU7Ci0gIGlmICh2b2x1bWUgPT0gdm9sdW1lXykgewotICAgIERFVklDRV9MT0coV0FSTklORykKLSAgICAgICAgPDwgX19mdW5jX18gPDwgIjogSWdub3Jpbmcgdm9sdW1lIGNoYW5nZSBzYW1lIGFzIGN1cnJlbnQgdm9sdW1lIGxldmVsIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byByZXF1ZXN0ID0gU2V0QWJzb2x1dGVWb2x1bWVSZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIodm9sdW1lKTsKLQotICB1aW50OF90IGxhYmVsID0gTUFYX1RSQU5TQUNUSU9OX0xBQkVMOwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBNQVhfVFJBTlNBQ1RJT05fTEFCRUw7IGkrKykgewotICAgIGlmIChhY3RpdmVfbGFiZWxzXy5maW5kKGkpID09IGFjdGl2ZV9sYWJlbHNfLmVuZCgpKSB7Ci0gICAgICBhY3RpdmVfbGFiZWxzXy5pbnNlcnQoaSk7Ci0gICAgICBsYWJlbCA9IGk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2x1bWVfID0gdm9sdW1lOwotICBzZW5kX21lc3NhZ2VfY2JfLlJ1bihsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXF1ZXN0KSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpUcmFja0NoYW5nZWROb3RpZmljYXRpb25SZXNwb25zZSh1aW50OF90IGxhYmVsLCBib29sIGludGVyaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY3Vycl9zb25nX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBzb25nX2xpc3QpIHsKLSAgREVWSUNFX1ZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKGludGVyaW0pIHsKLSAgICB0cmFja19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbih0cnVlLCBsYWJlbCk7Ci0gIH0gZWxzZSBpZiAoIXRyYWNrX2NoYW5nZWRfLmZpcnN0KSB7Ci0gICAgREVWSUNFX1ZMT0coMCkgPDwgX19mdW5jX18gPDwgIjogRGV2aWNlIG5vdCByZWdpc3RlcmVkIGZvciB1cGRhdGUiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghaW50ZXJpbSkgewotICAgIGlmIChjdXJyX3NvbmdfaWQuZW1wdHkoKSkgewotICAgICAgLy8gQ0hBTkdFRCByZXNwb25zZSBpcyBvbmx5IGRlZmluZWQgd2hlbiB0aGVyZSBpcyBtZWRpYSBzZWxlY3RlZAotICAgICAgLy8gZm9yIHBsYXlpbmcuCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFjdGl2ZV9sYWJlbHNfLmVyYXNlKGxhYmVsKTsKLSAgICB0cmFja19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIH0KLQotICAvLyBDYXNlIGZvciBicm93c2luZyBub3Qgc3VwcG9ydGVkOwotICAvLyBQVFMgQlYtMDQtQyBhbmQgQlYtNS1DIGFzc3VtZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCi0gIGlmIChzdGFja19jb25maWdfZ2V0X2ludGVyZmFjZSgpLT5nZXRfcHRzX2F2cmNwX3Rlc3QoKSkgewotICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogcHRzIHRlc3QgbW9kZSI7Ci0gICAgdWludDY0X3QgdWlkID0gY3Vycl9zb25nX2lkLmVtcHR5KCkgPyAweGZmZmZmZmZmZmZmZmZmZmYgOiAwOwotICAgIGF1dG8gcmVzcG9uc2UgPQotICAgICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVRyYWNrQ2hhbmdlZEJ1aWxkZXIoaW50ZXJpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7Ci0gICAgc2VuZF9tZXNzYWdlX2NiXy5SdW4obGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBBbnl0aW1lIHdlIHVzZSB0aGUgbm93IHBsYXlpbmcgbGlzdCwgdXBkYXRlIG91ciBtYXAgc28gdGhhdCBpdHMgYWx3YXlzCi0gIC8vIGN1cnJlbnQKLSAgbm93X3BsYXlpbmdfaWRzXy5jbGVhcigpOwotICB1aW50NjRfdCB1aWQgPSAwOwotICBmb3IgKGNvbnN0IFNvbmdJbmZvJiBzb25nIDogc29uZ19saXN0KSB7Ci0gICAgbm93X3BsYXlpbmdfaWRzXy5pbnNlcnQoc29uZy5tZWRpYV9pZCk7Ci0gICAgaWYgKGN1cnJfc29uZ19pZCA9PSBzb25nLm1lZGlhX2lkKSB7Ci0gICAgICBERVZJQ0VfVkxPRygzKSA8PCBfX2Z1bmNfXyA8PCAiOiBGb3VuZCBtZWRpYSBJRCBtYXRjaCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgPDwgc29uZy5tZWRpYV9pZDsKLSAgICAgIHVpZCA9IG5vd19wbGF5aW5nX2lkc18uZ2V0X3VpZChjdXJyX3NvbmdfaWQpOwotICAgIH0KLSAgfQotCi0gIGlmICh1aWQgPT0gMCkgewotICAgIC8vIHVpZCAwIGlzIG5vdCB2YWxpZCBoZXJlIHdoZW4gYnJvd3NpbmcgaXMgc3VwcG9ydGVkCi0gICAgREVWSUNFX0xPRyhFUlJPUikgPDwgIk5vIG1hdGNoIGZvciBtZWRpYSBJRCBmb3VuZCI7Ci0gIH0KLQotICBhdXRvIHJlc3BvbnNlID0gUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VUcmFja0NoYW5nZWRCdWlsZGVyKAotICAgICAgaW50ZXJpbSwgdWlkKTsKLSAgc2VuZF9tZXNzYWdlX2NiXy5SdW4obGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLX0KLQotdm9pZCBEZXZpY2U6OlBsYXliYWNrU3RhdHVzTm90aWZpY2F0aW9uUmVzcG9uc2UodWludDhfdCBsYWJlbCwgYm9vbCBpbnRlcmltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheVN0YXR1cyBzdGF0dXMpIHsKLSAgREVWSUNFX1ZMT0coMSkgPDwgX19mdW5jX187Ci0gIGlmIChzdGF0dXMuc3RhdGUgPT0gUGxheVN0YXRlOjpQQVVTRUQpIHBsYXlfcG9zX3VwZGF0ZV9jYl8uQ2FuY2VsKCk7Ci0KLSAgaWYgKGludGVyaW0pIHsKLSAgICBwbGF5X3N0YXR1c19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbih0cnVlLCBsYWJlbCk7Ci0gIH0gZWxzZSBpZiAoIXBsYXlfc3RhdHVzX2NoYW5nZWRfLmZpcnN0KSB7Ci0gICAgREVWSUNFX1ZMT0coMCkgPDwgX19mdW5jX18gPDwgIjogRGV2aWNlIG5vdCByZWdpc3RlcmVkIGZvciB1cGRhdGUiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gc3RhdGVfdG9fc2VuZCA9IHN0YXR1cy5zdGF0ZTsKLSAgaWYgKCFJc0FjdGl2ZSgpKSBzdGF0ZV90b19zZW5kID0gUGxheVN0YXRlOjpQQVVTRUQ7Ci0gIGlmICghaW50ZXJpbSAmJiBzdGF0ZV90b19zZW5kID09IGxhc3RfcGxheV9zdGF0dXNfLnN0YXRlKSB7Ci0gICAgREVWSUNFX1ZMT0coMCkgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBOb3Qgc2VuZGluZyBub3RpZmljYXRpb24gZHVlIHRvIG5vIHN0YXRlIHVwZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAgPDwgYWRkcmVzc18uVG9TdHJpbmcoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsYXN0X3BsYXlfc3RhdHVzXy5zdGF0ZSA9IHN0YXRlX3RvX3NlbmQ7Ci0KLSAgYXV0byByZXNwb25zZSA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXliYWNrU3RhdHVzQnVpbGRlcigKLSAgICAgICAgICBpbnRlcmltLCBJc0FjdGl2ZSgpID8gc3RhdHVzLnN0YXRlIDogUGxheVN0YXRlOjpQQVVTRUQpOwotICBzZW5kX21lc3NhZ2VfY2JfLlJ1bihsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotCi0gIGlmICghaW50ZXJpbSkgewotICAgIGFjdGl2ZV9sYWJlbHNfLmVyYXNlKGxhYmVsKTsKLSAgICBwbGF5X3N0YXR1c19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIH0KLX0KLQotdm9pZCBEZXZpY2U6OlBsYXliYWNrUG9zTm90aWZpY2F0aW9uUmVzcG9uc2UodWludDhfdCBsYWJlbCwgYm9vbCBpbnRlcmltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheVN0YXR1cyBzdGF0dXMpIHsKLSAgREVWSUNFX1ZMT0coNCkgPDwgX19mdW5jX187Ci0KLSAgaWYgKGludGVyaW0pIHsKLSAgICBwbGF5X3Bvc19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbih0cnVlLCBsYWJlbCk7Ci0gIH0gZWxzZSBpZiAoIXBsYXlfcG9zX2NoYW5nZWRfLmZpcnN0KSB7Ci0gICAgREVWSUNFX1ZMT0coMykgPDwgX19mdW5jX18gPDwgIjogRGV2aWNlIG5vdCByZWdpc3RlcmVkIGZvciB1cGRhdGUiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghaW50ZXJpbSAmJiBsYXN0X3BsYXlfc3RhdHVzXy5wb3NpdGlvbiA9PSBzdGF0dXMucG9zaXRpb24pIHsKLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IGFkZHJlc3NfLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IE5vIHVwZGF0ZSB0byBwbGF5IHBvc2l0aW9uIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIHJlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWJhY2tQb3NpdGlvbkJ1aWxkZXIoCi0gICAgICAgICAgaW50ZXJpbSwgc3RhdHVzLnBvc2l0aW9uKTsKLSAgc2VuZF9tZXNzYWdlX2NiXy5SdW4obGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLQotICBsYXN0X3BsYXlfc3RhdHVzXy5wb3NpdGlvbiA9IHN0YXR1cy5wb3NpdGlvbjsKLQotICBpZiAoIWludGVyaW0pIHsKLSAgICBhY3RpdmVfbGFiZWxzXy5lcmFzZShsYWJlbCk7Ci0gICAgcGxheV9wb3NfY2hhbmdlZF8gPSBOb3RpZmljYXRpb24oZmFsc2UsIDApOwotICB9Ci0KLSAgLy8gV2Ugc3RpbGwgdHJ5IHRvIHNlbmQgdXBkYXRlcyB3aGlsZSBtdXNpYyBpcyBwbGF5aW5nIHRvIHRoZSBub24gYWN0aXZlCi0gIC8vIGRldmljZSBldmVuIHRob3VnaCB0aGUgZGV2aWNlIHRoaW5rcyB0aGUgbXVzaWMgaXMgcGF1c2VkLiBUaGlzIG1ha2VzCi0gIC8vIHRoZSBzdGF0dXMgYmFyIG9uIHRoZSByZW1vdGUgZGV2aWNlIG1vdmUuCi0gIGlmIChzdGF0dXMuc3RhdGUgPT0gUGxheVN0YXRlOjpQTEFZSU5HICYmICFJc0luU2lsZW5jZU1vZGUoKSkgewotICAgIERFVklDRV9WTE9HKDApIDw8IF9fZnVuY19fIDw8ICI6IFF1ZXVlIG5leHQgcGxheSBwb3NpdGlvbiB1cGRhdGUiOwotICAgIHBsYXlfcG9zX3VwZGF0ZV9jYl8uUmVzZXQoYmFzZTo6QmluZCgmRGV2aWNlOjpIYW5kbGVQbGF5UG9zVXBkYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCkpKTsKLSAgICBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3A6OmN1cnJlbnRfdGFza19ydW5uZXIoKS0+UG9zdERlbGF5ZWRUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIHBsYXlfcG9zX3VwZGF0ZV9jYl8uY2FsbGJhY2soKSwKLSAgICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcyhwbGF5X3Bvc19pbnRlcnZhbF8pKTsKLSAgfQotfQotCi0vLyBUT0RPIChhcGFuaWNrZSk6IEZpbmlzaCBpbXBsZW1lbnRpbmcgd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgbW9yZSB0aGFuIG9uZQotLy8gcGxheWVyCi12b2lkIERldmljZTo6QWRkcmVzc2VkUGxheWVyTm90aWZpY2F0aW9uUmVzcG9uc2UoCi0gICAgdWludDhfdCBsYWJlbCwgYm9vbCBpbnRlcmltLCB1aW50MTZfdCBjdXJyX3BsYXllciwKLSAgICBzdGQ6OnZlY3RvcjxNZWRpYVBsYXllckluZm8+IC8qIHVudXNlZCAqLykgewotICBERVZJQ0VfVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBjdXJyX3BsYXllcl9pZD0iIDw8ICh1bnNpZ25lZCBpbnQpY3Vycl9wbGF5ZXI7Ci0KLSAgaWYgKGludGVyaW0pIHsKLSAgICBhZGRyX3BsYXllcl9jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbih0cnVlLCBsYWJlbCk7Ci0gIH0gZWxzZSBpZiAoIWFkZHJfcGxheWVyX2NoYW5nZWRfLmZpcnN0KSB7Ci0gICAgREVWSUNFX1ZMT0coMykgPDwgX19mdW5jX18gPDwgIjogRGV2aWNlIG5vdCByZWdpc3RlcmVkIGZvciB1cGRhdGUiOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIElmIHRoZXJlIGlzIG5vIHNldCBicm93c2VkIHBsYXllciwgdXNlIHRoZSBjdXJyZW50IGFkZHJlc3NlZCBwbGF5ZXIgYXMgdGhlCi0gIC8vIGRlZmF1bHQgTk9URTogVXNpbmcgYW55IGJyb3dzaW5nIGNvbW1hbmRzIGJlZm9yZSB0aGUgYnJvd3NlZCBwbGF5ZXIgaXMgc2V0Ci0gIC8vIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBBVlJDUCBTcGVjIGJ1dCB0aGVyZSBhcmUgc29tZSBjYXJraXRzIHRoYXQgdHJ5IHRvbwotICAvLyBhbnl3YXlzCi0gIGlmIChjdXJyX2Jyb3dzZWRfcGxheWVyX2lkXyA9PSAtMSkgY3Vycl9icm93c2VkX3BsYXllcl9pZF8gPSBjdXJyX3BsYXllcjsKLQotICBhdXRvIHJlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlQWRkcmVzc2VkUGxheWVyQnVpbGRlcigKLSAgICAgICAgICBpbnRlcmltLCBjdXJyX3BsYXllciwgMHgwMDAwKTsKLSAgc2VuZF9tZXNzYWdlX2NiXy5SdW4obGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLQotICBpZiAoIWludGVyaW0pIHsKLSAgICBhY3RpdmVfbGFiZWxzXy5lcmFzZShsYWJlbCk7Ci0gICAgYWRkcl9wbGF5ZXJfY2hhbmdlZF8gPSBOb3RpZmljYXRpb24oZmFsc2UsIDApOwotICAgIFJlamVjdE5vdGlmaWNhdGlvbigpOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpSZWplY3ROb3RpZmljYXRpb24oKSB7Ci0gIERFVklDRV9WTE9HKDEpIDw8IF9fZnVuY19fOwotICBOb3RpZmljYXRpb24qIHJlamVjdE5vdGlmaWNhdGlvbltdID0geyZwbGF5X3N0YXR1c19jaGFuZ2VkXywgJnRyYWNrX2NoYW5nZWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbGF5X3Bvc19jaGFuZ2VkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm93X3BsYXlpbmdfY2hhbmdlZF99OwotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgIHVpbnQ4X3QgbGFiZWwgPSByZWplY3ROb3RpZmljYXRpb25baV0tPnNlY29uZDsKLSAgICBhdXRvIHJlc3BvbnNlID0gUmVqZWN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICAgIENvbW1hbmRQZHU6OlJFR0lTVEVSX05PVElGSUNBVElPTiwgU3RhdHVzOjpBRERSRVNTRURfUExBWUVSX0NIQU5HRUQpOwotICAgIHNlbmRfbWVzc2FnZV9jYl8uUnVuKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgYWN0aXZlX2xhYmVsc18uZXJhc2UobGFiZWwpOwotICAgIHJlamVjdE5vdGlmaWNhdGlvbltpXSA9IG5ldyBOb3RpZmljYXRpb24oZmFsc2UsIDApOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpHZXRQbGF5U3RhdHVzUmVzcG9uc2UodWludDhfdCBsYWJlbCwgUGxheVN0YXR1cyBzdGF0dXMpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogcG9zaXRpb249IiA8PCBzdGF0dXMucG9zaXRpb24KLSAgICAgICAgICAgICAgICAgPDwgIiBkdXJhdGlvbj0iIDw8IHN0YXR1cy5kdXJhdGlvbgotICAgICAgICAgICAgICAgICA8PCAiIHN0YXRlPSIgPDwgc3RhdHVzLnN0YXRlOwotICBhdXRvIHJlc3BvbnNlID0gR2V0UGxheVN0YXR1c1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBzdGF0dXMuZHVyYXRpb24sIHN0YXR1cy5wb3NpdGlvbiwKLSAgICAgIElzQWN0aXZlKCkgPyBzdGF0dXMuc3RhdGUgOiBQbGF5U3RhdGU6OlBBVVNFRCk7Ci0gIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotfQotCi12b2lkIERldmljZTo6R2V0RWxlbWVudEF0dHJpYnV0ZXNSZXNwb25zZSgKLSAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnNoYXJlZF9wdHI8R2V0RWxlbWVudEF0dHJpYnV0ZXNSZXF1ZXN0PiBwa3QsCi0gICAgU29uZ0luZm8gaW5mbykgewotICBhdXRvIGdldF9lbGVtZW50X2F0dHJpYnV0ZXNfcGt0ID0gcGt0OwotICBhdXRvIGF0dHJpYnV0ZXNfcmVxdWVzdGVkID0KLSAgICAgIGdldF9lbGVtZW50X2F0dHJpYnV0ZXNfcGt0LT5HZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCk7Ci0KLSAgYXV0byByZXNwb25zZSA9IEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihjdHJsX210dV8pOwotCi0gIC8vIEZpbHRlciBvdXQgREVGQVVMVF9DT1ZFUl9BUlQgaGFuZGxlIGlmIHRoaXMgZGV2aWNlIGhhcyBubyBjbGllbnQKLSAgaWYgKCFIYXNCaXBDbGllbnQoKSkgewotICAgIGZpbHRlcl9jb3Zlcl9hcnQoaW5mbyk7Ci0gIH0KLQotICBsYXN0X3NvbmdfaW5mb18gPSBpbmZvOwotCi0gIGlmIChhdHRyaWJ1dGVzX3JlcXVlc3RlZC5zaXplKCkgIT0gMCkgewotICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogYXR0cmlidXRlc19yZXF1ZXN0ZWQpIHsKLSAgICAgIGlmIChpbmZvLmF0dHJpYnV0ZXMuZmluZChhdHRyaWJ1dGUpICE9IGluZm8uYXR0cmlidXRlcy5lbmQoKSkgewotICAgICAgICByZXNwb25zZS0+QWRkQXR0cmlidXRlRW50cnkoKmluZm8uYXR0cmlidXRlcy5maW5kKGF0dHJpYnV0ZSkpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsgIC8vIHplcm8gYXR0cmlidXRlcyByZXF1ZXN0ZWQgd2hpY2ggbWVhbnMgYWxsIGF0dHJpYnV0ZXMgcmVxdWVzdGVkCi0gICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiBpbmZvLmF0dHJpYnV0ZXMpIHsKLSAgICAgIHJlc3BvbnNlLT5BZGRBdHRyaWJ1dGVFbnRyeShhdHRyaWJ1dGUpOwotICAgIH0KLSAgfQotCi0gIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotfQotCi12b2lkIERldmljZTo6TWVzc2FnZVJlY2VpdmVkKHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+IHBrdCkgewotICBpZiAoIXBrdC0+SXNWYWxpZCgpKSB7Ci0gICAgREVWSUNFX0xPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZXF1ZXN0IHBhY2tldCBpcyBub3QgdmFsaWQiOwotICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihzdGF0aWNfY2FzdDxDb21tYW5kUGR1PigwKSwgU3RhdHVzOjpJTlZBTElEX0NPTU1BTkQpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERFVklDRV9WTE9HKDQpIDw8IF9fZnVuY19fIDw8ICI6IG9wY29kZT0iIDw8IHBrdC0+R2V0T3Bjb2RlKCk7Ci0gIGFjdGl2ZV9sYWJlbHNfLmluc2VydChsYWJlbCk7Ci0gIHN3aXRjaCAocGt0LT5HZXRPcGNvZGUoKSkgewotICAgIC8vIFRPRE8gKGFwYW5pY2tlKTogUmVtb3ZlIGhhbmRsaW5nIG9mIFVOSVRfSU5GTyBhbmQgU1VCVU5JVF9JTkZPIGZyb20KLSAgICAvLyB0aGUgQVZSQ19BUEkgYW5kIGluc3RlYWQgaGFuZGxlIGl0IGhlcmUgdG8gcmVkdWNlIGZyYWdtZW50YXRpb24uCi0gICAgY2FzZSBPcGNvZGU6OlVOSVRfSU5GTzogewotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBPcGNvZGU6OlNVQlVOSVRfSU5GTzogewotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBPcGNvZGU6OlBBU1NfVEhST1VHSDogewotICAgICAgYXV0byBwYXNzX3Rocm91Z2hfcGFja2V0ID0gUGFja2V0OjpTcGVjaWFsaXplPFBhc3NUaHJvdWdoUGFja2V0Pihwa3QpOwotCi0gICAgICBpZiAoIXBhc3NfdGhyb3VnaF9wYWNrZXQtPklzVmFsaWQoKSkgewotICAgICAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFJlcXVlc3QgcGFja2V0IGlzIG5vdCB2YWxpZCI7Ci0gICAgICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihzdGF0aWNfY2FzdDxDb21tYW5kUGR1PigwKSwgU3RhdHVzOjpJTlZBTElEX0NPTU1BTkQpOwotICAgICAgICBzZW5kX21lc3NhZ2UobGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBhdXRvIHJlc3BvbnNlID0gUGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgICAgICB0cnVlLCBwYXNzX3Rocm91Z2hfcGFja2V0LT5HZXRLZXlTdGF0ZSgpID09IEtleVN0YXRlOjpQVVNIRUQsCi0gICAgICAgICAgcGFzc190aHJvdWdoX3BhY2tldC0+R2V0T3BlcmF0aW9uSWQoKSk7Ci0gICAgICBzZW5kX21lc3NhZ2UobGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLQotICAgICAgLy8gVE9ETyAoYXBhbmlja2UpOiBVc2UgYW4gZW51bSBmb3IgbWVkaWEga2V5IElEJ3MKLSAgICAgIGlmIChwYXNzX3Rocm91Z2hfcGFja2V0LT5HZXRPcGVyYXRpb25JZCgpID09IDB4NDQgJiYKLSAgICAgICAgICBwYXNzX3Rocm91Z2hfcGFja2V0LT5HZXRLZXlTdGF0ZSgpID09IEtleVN0YXRlOjpQVVNIRUQpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgdGhlIHBsYXkgc3RhdHVzIHNpbmNlIHdlIG5lZWQgdG8ga25vdwotICAgICAgICAvLyB3aGF0IHRoZSBhY3R1YWwgcGxheXN0YXRlIGlzIHdpdGhvdXQgYmVpbmcgbW9kaWZpZWQKLSAgICAgICAgLy8gYnkgd2hldGhlciB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4KLSAgICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0UGxheVN0YXR1cyhiYXNlOjpCaW5kKAotICAgICAgICAgICAgW10oYmFzZTo6V2Vha1B0cjxEZXZpY2U+IGQsIFBsYXlTdGF0dXMgcykgewotICAgICAgICAgICAgICBpZiAoIWQpIHJldHVybjsKLQotICAgICAgICAgICAgICBpZiAoIWQtPklzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlNldHRpbmcgIiA8PCBkLT5hZGRyZXNzXy5Ub1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG8gYmUgdGhlIGFjdGl2ZSBkZXZpY2UiOwotICAgICAgICAgICAgICAgIGQtPm1lZGlhX2ludGVyZmFjZV8tPlNldEFjdGl2ZURldmljZShkLT5hZGRyZXNzXyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy5zdGF0ZSA9PSBQbGF5U3RhdGU6OlBMQVlJTkcpIHsKLSAgICAgICAgICAgICAgICAgIExPRyhJTkZPKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICJTa2lwcGluZyBzZW5kS2V5RXZlbnQgc2luY2UgbXVzaWMgaXMgYWxyZWFkeSBwbGF5aW5nIjsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBkLT5tZWRpYV9pbnRlcmZhY2VfLT5TZW5kS2V5RXZlbnQoMHg0NCwgS2V5U3RhdGU6OlBVU0hFRCk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKElzQWN0aXZlKCkpIHsKLSAgICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+U2VuZEtleUV2ZW50KHBhc3NfdGhyb3VnaF9wYWNrZXQtPkdldE9wZXJhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX3Rocm91Z2hfcGFja2V0LT5HZXRLZXlTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgT3Bjb2RlOjpWRU5ET1I6IHsKLSAgICAgIGF1dG8gdmVuZG9yX3BrdCA9IFBhY2tldDo6U3BlY2lhbGl6ZTxWZW5kb3JQYWNrZXQ+KHBrdCk7Ci0gICAgICBWZW5kb3JQYWNrZXRIYW5kbGVyKGxhYmVsLCB2ZW5kb3JfcGt0KTsKLSAgICB9IGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVQbGF5SXRlbSh1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF5SXRlbVJlcXVlc3Q+IHBrdCkgewotICBERVZJQ0VfVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBzY29wZT0iIDw8IHBrdC0+R2V0U2NvcGUoKQotICAgICAgICAgICAgICAgICA8PCAiIHVpZD0iIDw8IHBrdC0+R2V0VWlkKCk7Ci0KLSAgaWYgKCFwa3QtPklzVmFsaWQoKSkgewotICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUmVxdWVzdCBwYWNrZXQgaXMgbm90IHZhbGlkIjsKLSAgICBhdXRvIHJlc3BvbnNlID0gUmVqZWN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIocGt0LT5HZXRDb21tYW5kUGR1KCksIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIG1lZGlhX2lkID0gIiI7Ci0gIHN3aXRjaCAocGt0LT5HZXRTY29wZSgpKSB7Ci0gICAgY2FzZSBTY29wZTo6Tk9XX1BMQVlJTkc6Ci0gICAgICBtZWRpYV9pZCA9IG5vd19wbGF5aW5nX2lkc18uZ2V0X21lZGlhX2lkKHBrdC0+R2V0VWlkKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTY29wZTo6VkZTOgotICAgICAgbWVkaWFfaWQgPSB2ZnNfaWRzXy5nZXRfbWVkaWFfaWQocGt0LT5HZXRVaWQoKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgREVWSUNFX0xPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmtub3duIHNjb3BlIGZvciBwbGF5IGl0ZW0iOwotICB9Ci0KLSAgaWYgKG1lZGlhX2lkID09ICIiKSB7Ci0gICAgREVWSUNFX1ZMT0coMikgPDwgIkNvdWxkIG5vdCBmaW5kIGl0ZW0iOwotICAgIGF1dG8gcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihDb21tYW5kUGR1OjpQTEFZX0lURU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czo6RE9FU19OT1RfRVhJU1QpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1lZGlhX2ludGVyZmFjZV8tPlBsYXlJdGVtKGN1cnJfYnJvd3NlZF9wbGF5ZXJfaWRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPkdldFNjb3BlKCkgPT0gU2NvcGU6Ok5PV19QTEFZSU5HLCBtZWRpYV9pZCk7Ci0KLSAgYXV0byByZXNwb25zZSA9IFBsYXlJdGVtUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SKTsKLSAgc2VuZF9tZXNzYWdlKGxhYmVsLCBmYWxzZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVTZXRBZGRyZXNzZWRQbGF5ZXIoCi0gICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPFNldEFkZHJlc3NlZFBsYXllclJlcXVlc3Q+IHBrdCwKLSAgICB1aW50MTZfdCBjdXJyX3BsYXllciwgc3RkOjp2ZWN0b3I8TWVkaWFQbGF5ZXJJbmZvPiBwbGF5ZXJzKSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IFBsYXllcklkPSIgPDwgcGt0LT5HZXRQbGF5ZXJJZCgpOwotCi0gIGlmIChjdXJyX3BsYXllciAhPSBwa3QtPkdldFBsYXllcklkKCkpIHsKLSAgICBERVZJQ0VfVkxPRygyKSA8PCAiUmVqZWN0IGludmFsaWQgYWRkcmVzc2VkIHBsYXllciBJRCI7Ci0gICAgYXV0byByZXNwb25zZSA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKENvbW1hbmRQZHU6OlNFVF9BRERSRVNTRURfUExBWUVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM6OklOVkFMSURfUExBWUVSX0lEKTsKLSAgICBzZW5kX21lc3NhZ2UobGFiZWwsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIHJlc3BvbnNlID0KLSAgICAgIFNldEFkZHJlc3NlZFBsYXllclJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUik7Ci0gIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotfQotCi12b2lkIERldmljZTo6QnJvd3NlTWVzc2FnZVJlY2VpdmVkKHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCcm93c2VQYWNrZXQ+IHBrdCkgewotICBpZiAoIXBrdC0+SXNWYWxpZCgpKSB7Ci0gICAgREVWSUNFX0xPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBSZXF1ZXN0IHBhY2tldCBpcyBub3QgdmFsaWQiOwotICAgIGF1dG8gcmVzcG9uc2UgPSBHZW5lcmFsUmVqZWN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpJTlZBTElEX0NPTU1BTkQpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgZmFsc2UsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERFVklDRV9WTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHBkdT0iIDw8IHBrdC0+R2V0UGR1KCk7Ci0KLSAgc3dpdGNoIChwa3QtPkdldFBkdSgpKSB7Ci0gICAgY2FzZSBCcm93c2VQZHU6OlNFVF9CUk9XU0VEX1BMQVlFUjoKLSAgICAgIEhhbmRsZVNldEJyb3dzZWRQbGF5ZXIobGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDo6U3BlY2lhbGl6ZTxTZXRCcm93c2VkUGxheWVyUmVxdWVzdD4ocGt0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJyb3dzZVBkdTo6R0VUX0ZPTERFUl9JVEVNUzoKLSAgICAgIEhhbmRsZUdldEZvbGRlckl0ZW1zKGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0OjpTcGVjaWFsaXplPEdldEZvbGRlckl0ZW1zUmVxdWVzdD4ocGt0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJyb3dzZVBkdTo6Q0hBTkdFX1BBVEg6Ci0gICAgICBIYW5kbGVDaGFuZ2VQYXRoKGxhYmVsLCBQYWNrZXQ6OlNwZWNpYWxpemU8Q2hhbmdlUGF0aFJlcXVlc3Q+KHBrdCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCcm93c2VQZHU6OkdFVF9JVEVNX0FUVFJJQlVURVM6Ci0gICAgICBIYW5kbGVHZXRJdGVtQXR0cmlidXRlcygKLSAgICAgICAgICBsYWJlbCwgUGFja2V0OjpTcGVjaWFsaXplPEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdD4ocGt0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJyb3dzZVBkdTo6R0VUX1RPVEFMX05VTUJFUl9PRl9JVEVNUzoKLSAgICAgIEhhbmRsZUdldFRvdGFsTnVtYmVyT2ZJdGVtcygKLSAgICAgICAgICBsYWJlbCwgUGFja2V0OjpTcGVjaWFsaXplPEdldFRvdGFsTnVtYmVyT2ZJdGVtc1JlcXVlc3Q+KHBrdCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogIiA8PCBwa3QtPkdldFBkdSgpOwotICAgICAgYXV0byByZXNwb25zZSA9IEdlbmVyYWxSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6OklOVkFMSURfQ09NTUFORCk7Ci0gICAgICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotCi0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIERldmljZTo6SGFuZGxlR2V0Rm9sZGVySXRlbXModWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R2V0Rm9sZGVySXRlbXNSZXF1ZXN0PiBwa3QpIHsKLSAgaWYgKCFwa3QtPklzVmFsaWQoKSkgewotICAgIC8vIFRoZSBzcGVjaWZpYyBnZXQgZm9sZGVyIGl0ZW1zIGJ1aWxkZXIgaXMgdW5pbXBvcnRhbnQgb24gZmFpbHVyZS4KLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEdldCBmb2xkZXIgaXRlbXMgcmVxdWVzdCBwYWNrZXQgaXMgbm90IHZhbGlkIjsKLSAgICBhdXRvIHJlc3BvbnNlID0KLSAgICAgICAgR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcihTdGF0dXM6OklOVkFMSURfUEFSQU1FVEVSLCAweDAwMDAsIGJyb3dzZV9tdHVfKTsKLSAgICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHNjb3BlPSIgPDwgcGt0LT5HZXRTY29wZSgpOwotCi0gIHN3aXRjaCAocGt0LT5HZXRTY29wZSgpKSB7Ci0gICAgY2FzZSBTY29wZTo6TUVESUFfUExBWUVSX0xJU1Q6Ci0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXRNZWRpYVBsYXllckxpc3QoCi0gICAgICAgICAgYmFzZTo6QmluZCgmRGV2aWNlOjpHZXRNZWRpYVBsYXllckxpc3RSZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHBrdCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTY29wZTo6VkZTOgotICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0Rm9sZGVySXRlbXMoCi0gICAgICAgICAgY3Vycl9icm93c2VkX3BsYXllcl9pZF8sIEN1cnJlbnRGb2xkZXIoKSwKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkdldFZGU0xpc3RSZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHBrdCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTY29wZTo6Tk9XX1BMQVlJTkc6Ci0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXROb3dQbGF5aW5nTGlzdCgKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkdldE5vd1BsYXlpbmdMaXN0UmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIGxhYmVsLCBwa3QpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBERVZJQ0VfTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IHBrdC0+R2V0U2NvcGUoKTsKLSAgICAgIGF1dG8gcmVzcG9uc2UgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXllckxpc3RCdWlsZGVyKFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIsIDAsIGJyb3dzZV9tdHVfKTsKLSAgICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIERldmljZTo6SGFuZGxlR2V0VG90YWxOdW1iZXJPZkl0ZW1zKAotICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxHZXRUb3RhbE51bWJlck9mSXRlbXNSZXF1ZXN0PiBwa3QpIHsKLSAgaWYgKCFwa3QtPklzVmFsaWQoKSkgewotICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUmVxdWVzdCBwYWNrZXQgaXMgbm90IHZhbGlkIjsKLSAgICBhdXRvIHJlc3BvbnNlID0gR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6OklOVkFMSURfUEFSQU1FVEVSLCAweDAwMDAsIDApOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogc2NvcGU9IiA8PCBwa3QtPkdldFNjb3BlKCk7Ci0KLSAgc3dpdGNoIChwa3QtPkdldFNjb3BlKCkpIHsKLSAgICBjYXNlIFNjb3BlOjpNRURJQV9QTEFZRVJfTElTVDogewotICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0TWVkaWFQbGF5ZXJMaXN0KAotICAgICAgICAgIGJhc2U6OkJpbmQoJkRldmljZTo6R2V0VG90YWxOdW1iZXJPZkl0ZW1zTWVkaWFQbGF5ZXJzUmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIGxhYmVsKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTY29wZTo6VkZTOgotICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0Rm9sZGVySXRlbXMoCi0gICAgICAgICAgY3Vycl9icm93c2VkX3BsYXllcl9pZF8sIEN1cnJlbnRGb2xkZXIoKSwKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkdldFRvdGFsTnVtYmVyT2ZJdGVtc1ZGU1Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBsYWJlbCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTY29wZTo6Tk9XX1BMQVlJTkc6Ci0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXROb3dQbGF5aW5nTGlzdCgKLSAgICAgICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkdldFRvdGFsTnVtYmVyT2ZJdGVtc05vd1BsYXlpbmdSZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBERVZJQ0VfTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8IHBrdC0+R2V0U2NvcGUoKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpHZXRUb3RhbE51bWJlck9mSXRlbXNNZWRpYVBsYXllcnNSZXNwb25zZSgKLSAgICB1aW50OF90IGxhYmVsLCB1aW50MTZfdCBjdXJyX3BsYXllciwgc3RkOjp2ZWN0b3I8TWVkaWFQbGF5ZXJJbmZvPiBsaXN0KSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IG51bV9pdGVtcz0iIDw8IGxpc3Quc2l6ZSgpOwotCi0gIGF1dG8gYnVpbGRlciA9IEdldFRvdGFsTnVtYmVyT2ZJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIGxpc3Quc2l6ZSgpKTsKLSAgc2VuZF9tZXNzYWdlKGxhYmVsLCB0cnVlLCBzdGQ6Om1vdmUoYnVpbGRlcikpOwotfQotCi12b2lkIERldmljZTo6R2V0VG90YWxOdW1iZXJPZkl0ZW1zVkZTUmVzcG9uc2UodWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gbGlzdCkgewotICBERVZJQ0VfVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBudW1faXRlbXM9IiA8PCBsaXN0LnNpemUoKTsKLQotICBhdXRvIGJ1aWxkZXIgPSBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCBsaXN0LnNpemUoKSk7Ci0gIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKGJ1aWxkZXIpKTsKLX0KLQotdm9pZCBEZXZpY2U6OkdldFRvdGFsTnVtYmVyT2ZJdGVtc05vd1BsYXlpbmdSZXNwb25zZSgKLSAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnN0cmluZyBjdXJyX3NvbmdfaWQsIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBsaXN0KSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IG51bV9pdGVtcz0iIDw8IGxpc3Quc2l6ZSgpOwotCi0gIGF1dG8gYnVpbGRlciA9IEdldFRvdGFsTnVtYmVyT2ZJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIGxpc3Quc2l6ZSgpKTsKLSAgc2VuZF9tZXNzYWdlKGxhYmVsLCB0cnVlLCBzdGQ6Om1vdmUoYnVpbGRlcikpOwotfQotCi12b2lkIERldmljZTo6SGFuZGxlQ2hhbmdlUGF0aCh1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENoYW5nZVBhdGhSZXF1ZXN0PiBwa3QpIHsKLSAgaWYgKCFwa3QtPklzVmFsaWQoKSkgewotICAgIERFVklDRV9MT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogUmVxdWVzdCBwYWNrZXQgaXMgbm90IHZhbGlkIjsKLSAgICBhdXRvIHJlc3BvbnNlID0gQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUiwgMCk7Ci0gICAgc2VuZF9tZXNzYWdlKGxhYmVsLCB0cnVlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBERVZJQ0VfVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBkaXJlY3Rpb249IiA8PCBwa3QtPkdldERpcmVjdGlvbigpCi0gICAgICAgICAgICAgICAgIDw8ICIgdWlkPSIgPDwgbG9naGV4KHBrdC0+R2V0VWlkKCkpOwotCi0gIGlmIChwa3QtPkdldERpcmVjdGlvbigpID09IERpcmVjdGlvbjo6RE9XTiAmJgotICAgICAgdmZzX2lkc18uZ2V0X21lZGlhX2lkKHBrdC0+R2V0VWlkKCkpID09ICIiKSB7Ci0gICAgREVWSUNFX0xPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBObyBpdGVtIGZvdW5kIGZvciBVSUQ9IiA8PCBwa3QtPkdldFVpZCgpOwotICAgIGF1dG8gYnVpbGRlciA9Ci0gICAgICAgIENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6RE9FU19OT1RfRVhJU1QsIDApOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKGJ1aWxkZXIpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocGt0LT5HZXREaXJlY3Rpb24oKSA9PSBEaXJlY3Rpb246OkRPV04pIHsKLSAgICBjdXJyZW50X3BhdGhfLnB1c2godmZzX2lkc18uZ2V0X21lZGlhX2lkKHBrdC0+R2V0VWlkKCkpKTsKLSAgICBERVZJQ0VfVkxPRygyKSA8PCAiUHVzaGluZyBQYXRoIHRvIHN0YWNrOiBcIiIgPDwgQ3VycmVudEZvbGRlcigpIDw8ICJcIiI7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gRG9uJ3QgcG9wIHRoZSByb290IGlkIG9mZiB0aGUgc3RhY2sKLSAgICBpZiAoY3VycmVudF9wYXRoXy5zaXplKCkgPiAxKSB7Ci0gICAgICBjdXJyZW50X3BhdGhfLnBvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBERVZJQ0VfTE9HKEVSUk9SKSA8PCAiVHJ5aW5nIHRvIGNoYW5nZSBkaXJlY3RvcnkgdXAgcGFzdCByb290LiI7Ci0gICAgICBhdXRvIGJ1aWxkZXIgPQotICAgICAgICAgIENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6RE9FU19OT1RfRVhJU1QsIDApOwotICAgICAgc2VuZF9tZXNzYWdlKGxhYmVsLCB0cnVlLCBzdGQ6Om1vdmUoYnVpbGRlcikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIERFVklDRV9WTE9HKDIpIDw8ICJQb3BwaW5nIFBhdGggZnJvbSBzdGFjazogbmV3IHBhdGg9XCIiIDw8IEN1cnJlbnRGb2xkZXIoKQotICAgICAgICAgICAgICAgICAgIDw8ICJcIiI7Ci0gIH0KLQotICBtZWRpYV9pbnRlcmZhY2VfLT5HZXRGb2xkZXJJdGVtcygKLSAgICAgIGN1cnJfYnJvd3NlZF9wbGF5ZXJfaWRfLCBDdXJyZW50Rm9sZGVyKCksCi0gICAgICBiYXNlOjpCaW5kKCZEZXZpY2U6OkNoYW5nZVBhdGhSZXNwb25zZSwgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLAotICAgICAgICAgICAgICAgICBsYWJlbCwgcGt0KSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpDaGFuZ2VQYXRoUmVzcG9uc2UodWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENoYW5nZVBhdGhSZXF1ZXN0PiBwa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPExpc3RJdGVtPiBsaXN0KSB7Ci0gIC8vIFRPRE8gKGFwYW5pY2tlKTogUmVjb25zdHJ1Y3QgdGhlIFZGUyBJRCdzIGhlcmUuIFJpZ2h0IG5vdyBpdCBnZXRzCi0gIC8vIHJlY29uc3RydWN0ZWQgaW4gR2V0Rm9sZGVySXRlbXNWRlMKLSAgYXV0byBidWlsZGVyID0KLSAgICAgIENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6Tk9fRVJST1IsIGxpc3Quc2l6ZSgpKTsKLSAgc2VuZF9tZXNzYWdlKGxhYmVsLCB0cnVlLCBzdGQ6Om1vdmUoYnVpbGRlcikpOwotfQotCi12b2lkIERldmljZTo6SGFuZGxlR2V0SXRlbUF0dHJpYnV0ZXMoCi0gICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdD4gcGt0KSB7Ci0gIGlmICghcGt0LT5Jc1ZhbGlkKCkpIHsKLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFJlcXVlc3QgcGFja2V0IGlzIG5vdCB2YWxpZCI7Ci0gICAgYXV0byBidWlsZGVyID0gR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIsIGJyb3dzZV9tdHVfKTsKLSAgICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShidWlsZGVyKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogc2NvcGU9IiA8PCBwa3QtPkdldFNjb3BlKCkKLSAgICAgICAgICAgICAgICAgPDwgIiB1aWQ9IiA8PCBsb2doZXgocGt0LT5HZXRVaWQoKSkKLSAgICAgICAgICAgICAgICAgPDwgIiB1aWQgY291bnRlcj0iIDw8IGxvZ2hleChwa3QtPkdldFVpZENvdW50ZXIoKSk7Ci0gIGlmIChwa3QtPkdldFVpZENvdW50ZXIoKSAhPSAweDAwMDApIHsgIC8vIEZvciBkYXRhYmFzZSB1bmF3YXJlIHBsYXllciwgdXNlIDAKLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8ICJVaWRDb3VudGVyIGlzIGludmFsaWQiOwotICAgIGF1dG8gYnVpbGRlciA9IEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgICAgU3RhdHVzOjpVSURTX0NIQU5HRUQsIGJyb3dzZV9tdHVfKTsKLSAgICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShidWlsZGVyKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChwa3QtPkdldFNjb3BlKCkpIHsKLSAgICBjYXNlIFNjb3BlOjpOT1dfUExBWUlORzogewotICAgICAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0Tm93UGxheWluZ0xpc3QoCi0gICAgICAgICAgYmFzZTo6QmluZCgmRGV2aWNlOjpHZXRJdGVtQXR0cmlidXRlc05vd1BsYXlpbmdSZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHBrdCkpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBTY29wZTo6VkZTOgotICAgICAgLy8gVE9ETyAoYXBhbmlja2UpOiBDaGVjayB0aGUgdmZzX2lkc18gaGVyZS4gSWYgdGhlIGl0ZW0gZG9lc24ndCBleGlzdAotICAgICAgLy8gdGhlbiB3ZSBjYW4gYXV0byBzZW5kIHRoZSBlcnJvciB3aXRob3V0IGNhbGxpbmcgdXAuIFdlIGRvIHRoaXMgY2hlY2sKLSAgICAgIC8vIGxhdGVyIHJpZ2h0IG5vdyB0aG91Z2ggaW4gb3JkZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCB1cGRhdGVzCi0gICAgICAvLyBvbiB0aGUgbWVkaWEgbGF5ZXIuCi0gICAgICBtZWRpYV9pbnRlcmZhY2VfLT5HZXRGb2xkZXJJdGVtcygKLSAgICAgICAgICBjdXJyX2Jyb3dzZWRfcGxheWVyX2lkXywgQ3VycmVudEZvbGRlcigpLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkRldmljZTo6R2V0SXRlbUF0dHJpYnV0ZXNWRlNSZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHBrdCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIERFVklDRV9MT0coRVJST1IpIDw8ICJVTktOT1dOIFNDT1BFIEZPUiBIQU5ETEUgR0VUIElURU0gQVRUUklCVVRFUyI7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIERldmljZTo6R2V0SXRlbUF0dHJpYnV0ZXNOb3dQbGF5aW5nUmVzcG9uc2UoCi0gICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdD4gcGt0LAotICAgIHN0ZDo6c3RyaW5nIGN1cnJfbWVkaWFfaWQsIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBzb25nX2xpc3QpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogdWlkPSIgPDwgbG9naGV4KHBrdC0+R2V0VWlkKCkpOwotICBhdXRvIGJ1aWxkZXIgPSBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZV9tdHVfKTsKLQotICBhdXRvIG1lZGlhX2lkID0gbm93X3BsYXlpbmdfaWRzXy5nZXRfbWVkaWFfaWQocGt0LT5HZXRVaWQoKSk7Ci0gIGlmIChtZWRpYV9pZCA9PSAiIikgewotICAgIG1lZGlhX2lkID0gY3Vycl9tZWRpYV9pZDsKLSAgfQotCi0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IG1lZGlhX2lkPVwiIiA8PCBtZWRpYV9pZCA8PCAiXCIiOwotCi0gIFNvbmdJbmZvIGluZm87Ci0gIGlmIChzb25nX2xpc3Quc2l6ZSgpID09IDEpIHsKLSAgICBERVZJQ0VfVkxPRygyKQotICAgICAgICA8PCBfX2Z1bmNfXwotICAgICAgICA8PCAiIFNlbmQgb3V0IHRoZSBvbmx5IHNvbmcgaW4gdGhlIHF1ZXVlIGFzIG5vdyBwbGF5aW5nIHNvbmcuIjsKLSAgICBpbmZvID0gc29uZ19saXN0LmZyb250KCk7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiB0ZW1wIDogc29uZ19saXN0KSB7Ci0gICAgICBpZiAodGVtcC5tZWRpYV9pZCA9PSBtZWRpYV9pZCkgewotICAgICAgICBpbmZvID0gdGVtcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBGaWx0ZXIgb3V0IERFRkFVTFRfQ09WRVJfQVJUIGhhbmRsZSBpZiB0aGlzIGRldmljZSBoYXMgbm8gY2xpZW50Ci0gIGlmICghSGFzQmlwQ2xpZW50KCkpIHsKLSAgICBmaWx0ZXJfY292ZXJfYXJ0KGluZm8pOwotICB9Ci0KLSAgYXV0byBhdHRyaWJ1dGVzX3JlcXVlc3RlZCA9IHBrdC0+R2V0QXR0cmlidXRlc1JlcXVlc3RlZCgpOwotICBpZiAoYXR0cmlidXRlc19yZXF1ZXN0ZWQuc2l6ZSgpICE9IDApIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IGF0dHJpYnV0ZXNfcmVxdWVzdGVkKSB7Ci0gICAgICBpZiAoaW5mby5hdHRyaWJ1dGVzLmZpbmQoYXR0cmlidXRlKSAhPSBpbmZvLmF0dHJpYnV0ZXMuZW5kKCkpIHsKLSAgICAgICAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoKmluZm8uYXR0cmlidXRlcy5maW5kKGF0dHJpYnV0ZSkpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBJZiB6ZXJvIGF0dHJpYnV0ZXMgd2VyZSByZXF1ZXN0ZWQsIHRoYXQgbWVhbnMgYWxsIGF0dHJpYnV0ZXMgd2VyZQotICAgIC8vIHJlcXVlc3RlZAotICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogaW5mby5hdHRyaWJ1dGVzKSB7Ci0gICAgICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShhdHRyaWJ1dGUpOwotICAgIH0KLSAgfQotCi0gIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKGJ1aWxkZXIpKTsKLX0KLQotdm9pZCBEZXZpY2U6OkdldEl0ZW1BdHRyaWJ1dGVzVkZTUmVzcG9uc2UoCi0gICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEdldEl0ZW1BdHRyaWJ1dGVzUmVxdWVzdD4gcGt0LAotICAgIHN0ZDo6dmVjdG9yPExpc3RJdGVtPiBpdGVtX2xpc3QpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogdWlkPSIgPDwgbG9naGV4KHBrdC0+R2V0VWlkKCkpOwotCi0gIGF1dG8gbWVkaWFfaWQgPSB2ZnNfaWRzXy5nZXRfbWVkaWFfaWQocGt0LT5HZXRVaWQoKSk7Ci0gIGlmIChtZWRpYV9pZCA9PSAiIikgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBJdGVtIG5vdCBmb3VuZCI7Ci0gICAgYXV0byBidWlsZGVyID0gR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgICBTdGF0dXM6OkRPRVNfTk9UX0VYSVNULCBicm93c2VfbXR1Xyk7Ci0gICAgc2VuZF9tZXNzYWdlKGxhYmVsLCB0cnVlLCBzdGQ6Om1vdmUoYnVpbGRlcikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gYnVpbGRlciA9IEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlX210dV8pOwotCi0gIExpc3RJdGVtIGl0ZW1fcmVxdWVzdGVkOwotICBmb3IgKGNvbnN0IGF1dG8mIHRlbXAgOiBpdGVtX2xpc3QpIHsKLSAgICBpZiAoKHRlbXAudHlwZSA9PSBMaXN0SXRlbTo6Rk9MREVSICYmIHRlbXAuZm9sZGVyLm1lZGlhX2lkID09IG1lZGlhX2lkKSB8fAotICAgICAgICAodGVtcC50eXBlID09IExpc3RJdGVtOjpTT05HICYmIHRlbXAuc29uZy5tZWRpYV9pZCA9PSBtZWRpYV9pZCkpIHsKLSAgICAgIGl0ZW1fcmVxdWVzdGVkID0gdGVtcDsKLSAgICB9Ci0gIH0KLQotICAvLyBGaWx0ZXIgb3V0IERFRkFVTFRfQ09WRVJfQVJUIGhhbmRsZSBpZiB0aGlzIGRldmljZSBoYXMgbm8gY2xpZW50Ci0gIGlmIChpdGVtX3JlcXVlc3RlZC50eXBlID09IExpc3RJdGVtOjpTT05HICYmICFIYXNCaXBDbGllbnQoKSkgewotICAgIGZpbHRlcl9jb3Zlcl9hcnQoaXRlbV9yZXF1ZXN0ZWQuc29uZyk7Ci0gIH0KLQotICAvLyBUT0RPIChhcGFuaWNrZSk6IEFkZCBhIGhlbHBlciBmdW5jdGlvbiBvciBhbGxvdyBhZGRpbmcgYSBtYXAKLSAgLy8gb2YgYXR0cmlidXRlcyB0byBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcgotICBhdXRvIGF0dHJpYnV0ZXNfcmVxdWVzdGVkID0gcGt0LT5HZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCk7Ci0gIGlmIChpdGVtX3JlcXVlc3RlZC50eXBlID09IExpc3RJdGVtOjpGT0xERVIpIHsKLSAgICBpZiAoYXR0cmlidXRlc19yZXF1ZXN0ZWQuc2l6ZSgpID09IDApIHsKLSAgICAgIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsIGl0ZW1fcmVxdWVzdGVkLmZvbGRlci5uYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChhdXRvJiBhdHRyIDogYXR0cmlidXRlc19yZXF1ZXN0ZWQpIHsKLSAgICAgICAgaWYgKGF0dHIgPT0gQXR0cmlidXRlOjpUSVRMRSkgewotICAgICAgICAgIGJ1aWxkZXItPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9yZXF1ZXN0ZWQuZm9sZGVyLm5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChhdHRyaWJ1dGVzX3JlcXVlc3RlZC5zaXplKCkgIT0gMCkgewotICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzX3JlcXVlc3RlZCkgewotICAgICAgICBpZiAoaXRlbV9yZXF1ZXN0ZWQuc29uZy5hdHRyaWJ1dGVzLmZpbmQoYXR0cmlidXRlKSAhPQotICAgICAgICAgICAgaXRlbV9yZXF1ZXN0ZWQuc29uZy5hdHRyaWJ1dGVzLmVuZCgpKSB7Ci0gICAgICAgICAgYnVpbGRlci0+QWRkQXR0cmlidXRlRW50cnkoCi0gICAgICAgICAgICAgICppdGVtX3JlcXVlc3RlZC5zb25nLmF0dHJpYnV0ZXMuZmluZChhdHRyaWJ1dGUpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBJZiB6ZXJvIGF0dHJpYnV0ZXMgd2VyZSByZXF1ZXN0ZWQsIHRoYXQgbWVhbnMgYWxsIGF0dHJpYnV0ZXMgd2VyZQotICAgICAgLy8gcmVxdWVzdGVkCi0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IGl0ZW1fcmVxdWVzdGVkLnNvbmcuYXR0cmlidXRlcykgewotICAgICAgICBidWlsZGVyLT5BZGRBdHRyaWJ1dGVFbnRyeShhdHRyaWJ1dGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKGJ1aWxkZXIpKTsKLX0KLQotdm9pZCBEZXZpY2U6OkdldE1lZGlhUGxheWVyTGlzdFJlc3BvbnNlKAotICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxHZXRGb2xkZXJJdGVtc1JlcXVlc3Q+IHBrdCwKLSAgICB1aW50MTZfdCBjdXJyX3BsYXllciwgc3RkOjp2ZWN0b3I8TWVkaWFQbGF5ZXJJbmZvPiBwbGF5ZXJzKSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGlmIChwbGF5ZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgYXV0byBub19pdGVtc19yc3AgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXllckxpc3RCdWlsZGVyKAotICAgICAgICBTdGF0dXM6OlJBTkdFX09VVF9PRl9CT1VORFMsIDB4MDAwMCwgYnJvd3NlX210dV8pOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKG5vX2l0ZW1zX3JzcCkpOwotICB9Ci0KLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5ZXJMaXN0QnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgYnJvd3NlX210dV8pOwotCi0gIC8vIE1vdmUgdGhlIGN1cnJlbnQgcGxheWVyIHRvIHRoZSBmaXJzdCBzbG90IGR1ZSB0byBzb21lIGNhcmtpdHMgYWx3YXlzCi0gIC8vIGNvbm5lY3RpbmcgdG8gdGhlIGZpcnN0IGxpc3RlZCBwbGF5ZXIgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIElECi0gIC8vIHJldHVybmVkIGJ5IEFkZHJlc3NlZCBQbGF5ZXIgQ2hhbmdlZAotICBmb3IgKGF1dG8gaXQgPSBwbGF5ZXJzLmJlZ2luKCk7IGl0ICE9IHBsYXllcnMuZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoaXQtPmlkID09IGN1cnJfcGxheWVyKSB7Ci0gICAgICBERVZJQ0VfVkxPRygxKSA8PCAiIEFkZGluZyBwbGF5ZXIgdG8gZmlyc3Qgc3BvdDogIiA8PCBpdC0+bmFtZTsKLSAgICAgIGF1dG8gdGVtcF9wbGF5ZXIgPSAqaXQ7Ci0gICAgICBwbGF5ZXJzLmVyYXNlKGl0KTsKLSAgICAgIHBsYXllcnMuaW5zZXJ0KHBsYXllcnMuYmVnaW4oKSwgdGVtcF9wbGF5ZXIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IHBrdC0+R2V0U3RhcnRJdGVtKCk7Ci0gICAgICAgaSA8PSBwa3QtPkdldEVuZEl0ZW0oKSAmJiBpIDwgcGxheWVycy5zaXplKCk7IGkrKykgewotICAgIE1lZGlhUGxheWVySXRlbSBpdGVtKHBsYXllcnNbaV0uaWQsIHBsYXllcnNbaV0ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzW2ldLmJyb3dzaW5nX3N1cHBvcnRlZCk7Ci0gICAgYnVpbGRlci0+QWRkTWVkaWFQbGF5ZXIoaXRlbSk7Ci0gIH0KLQotICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShidWlsZGVyKSk7Ci19Ci0KLXN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PiBmaWx0ZXJfYXR0cmlidXRlc19yZXF1ZXN0ZWQoCi0gICAgY29uc3QgU29uZ0luZm8mIHNvbmcsIGNvbnN0IHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4mIGF0dHJzKSB7Ci0gIHN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PiByZXN1bHQ7Ci0gIGZvciAoY29uc3QgYXV0byYgYXR0ciA6IGF0dHJzKSB7Ci0gICAgaWYgKHNvbmcuYXR0cmlidXRlcy5maW5kKGF0dHIpICE9IHNvbmcuYXR0cmlidXRlcy5lbmQoKSkgewotICAgICAgcmVzdWx0Lmluc2VydCgqc29uZy5hdHRyaWJ1dGVzLmZpbmQoYXR0cikpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRGV2aWNlOjpHZXRWRlNMaXN0UmVzcG9uc2UodWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdldEZvbGRlckl0ZW1zUmVxdWVzdD4gcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gaXRlbXMpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogc3RhcnRfaXRlbT0iIDw8IHBrdC0+R2V0U3RhcnRJdGVtKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBlbmRfaXRlbT0iIDw8IHBrdC0+R2V0RW5kSXRlbSgpOwotCi0gIC8vIFRoZSBidWlsZGVyIHdpbGwgYXV0b21hdGljYWxseSBjb3JyZWN0IHRoZSBzdGF0dXMgaWYgdGhlcmUgYXJlIHplcm8gaXRlbXMKLSAgYXV0byBidWlsZGVyID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VWRlNCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCBicm93c2VfbXR1Xyk7Ci0KLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBBZGQgdGVzdCB0aGF0IGNoZWNrcyBpZiB2ZnNfaWRzXyBpcyB0aGUgY29ycmVjdCBzaXplIGFmdGVyCi0gIC8vIGFuIG9wZXJhdGlvbi4KLSAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogaXRlbXMpIHsKLSAgICBpZiAoaXRlbS50eXBlID09IExpc3RJdGVtOjpGT0xERVIpIHsKLSAgICAgIHZmc19pZHNfLmluc2VydChpdGVtLmZvbGRlci5tZWRpYV9pZCk7Ci0gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gTGlzdEl0ZW06OlNPTkcpIHsKLSAgICAgIHZmc19pZHNfLmluc2VydChpdGVtLnNvbmcubWVkaWFfaWQpOwotICAgIH0KLSAgfQotCi0gIC8vIEFkZCB0aGUgZWxlbWVudHMgcmV0cmlldmVkIGluIHRoZSBsYXN0IGdldCBmb2xkZXIgaXRlbXMgcmVxdWVzdCBhbmQgbWFwCi0gIC8vIHRoZW0gdG8gVUlEcyBUaGUgbWFwcyB3aWxsIGJlIGNsZWFyZWQgZXZlcnkgdGltZSBhIGRpcmVjdG9yeSBjaGFuZ2UKLSAgLy8gaGFwcGVucy4gVGhlc2UgaXRlbXMgZG8gbm90IG5lZWQgdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBub3cgcGxheWluZyBsaXN0IGFzCi0gIC8vIHRoZSBVSUQncyBvbmx5IG5lZWQgdG8gYmUgdW5pcXVlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHNjb3BlIGFuZAotICAvLyB0aGUgY3VycmVudCBmb2xkZXIKLSAgZm9yIChhdXRvIGkgPSBwa3QtPkdldFN0YXJ0SXRlbSgpOyBpIDw9IHBrdC0+R2V0RW5kSXRlbSgpICYmIGkgPCBpdGVtcy5zaXplKCk7Ci0gICAgICAgaSsrKSB7Ci0gICAgaWYgKGl0ZW1zW2ldLnR5cGUgPT0gTGlzdEl0ZW06OkZPTERFUikgewotICAgICAgYXV0byBmb2xkZXIgPSBpdGVtc1tpXS5mb2xkZXI7Ci0gICAgICAvLyByaWdodCBub3cgd2UgYWx3YXlzIHVzZSBmb2xkZXJzIG9mIG1peGVkIHR5cGUKLSAgICAgIEZvbGRlckl0ZW0gZm9sZGVyX2l0ZW0odmZzX2lkc18uZ2V0X3VpZChmb2xkZXIubWVkaWFfaWQpLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIuaXNfcGxheWFibGUsIGZvbGRlci5uYW1lKTsKLSAgICAgIGlmICghYnVpbGRlci0+QWRkRm9sZGVyKGZvbGRlcl9pdGVtKSkgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChpdGVtc1tpXS50eXBlID09IExpc3RJdGVtOjpTT05HKSB7Ci0gICAgICBhdXRvIHNvbmcgPSBpdGVtc1tpXS5zb25nOwotCi0gICAgICAvLyBGaWx0ZXIgb3V0IERFRkFVTFRfQ09WRVJfQVJUIGhhbmRsZSBpZiB0aGlzIGRldmljZSBoYXMgbm8gY2xpZW50Ci0gICAgICBpZiAoIUhhc0JpcENsaWVudCgpKSB7Ci0gICAgICAgIGZpbHRlcl9jb3Zlcl9hcnQoc29uZyk7Ci0gICAgICB9Ci0KLSAgICAgIGF1dG8gdGl0bGUgPQotICAgICAgICAgIHNvbmcuYXR0cmlidXRlcy5maW5kKEF0dHJpYnV0ZTo6VElUTEUpICE9IHNvbmcuYXR0cmlidXRlcy5lbmQoKQotICAgICAgICAgICAgICA/IHNvbmcuYXR0cmlidXRlcy5maW5kKEF0dHJpYnV0ZTo6VElUTEUpLT52YWx1ZSgpCi0gICAgICAgICAgICAgIDogIk5vIFNvbmcgSW5mbyI7Ci0gICAgICBNZWRpYUVsZW1lbnRJdGVtIHNvbmdfaXRlbSh2ZnNfaWRzXy5nZXRfdWlkKHNvbmcubWVkaWFfaWQpLCB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PEF0dHJpYnV0ZUVudHJ5PigpKTsKLQotICAgICAgaWYgKHBrdC0+R2V0TnVtQXR0cmlidXRlcygpID09IDB4MDApIHsgIC8vIEFsbCBhdHRyaWJ1dGVzIHJlcXVlc3RlZAotICAgICAgICBzb25nX2l0ZW0uYXR0cmlidXRlc18gPSBzdGQ6Om1vdmUoc29uZy5hdHRyaWJ1dGVzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNvbmdfaXRlbS5hdHRyaWJ1dGVzXyA9Ci0gICAgICAgICAgICBmaWx0ZXJfYXR0cmlidXRlc19yZXF1ZXN0ZWQoc29uZywgcGt0LT5HZXRBdHRyaWJ1dGVzUmVxdWVzdGVkKCkpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB3ZSBmYWlsIHRvIGFkZCBhIHNvbmcsIGRvbid0IGFjY2lkZW50YWxseSBhZGQgb25lIGxhdGVyIHRoYXQgbWlnaHQKLSAgICAgIC8vIGZpdC4KLSAgICAgIGlmICghYnVpbGRlci0+QWRkU29uZyhzb25nX2l0ZW0pKSBicmVhazsKLSAgICB9Ci0gIH0KLQotICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShidWlsZGVyKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpHZXROb3dQbGF5aW5nTGlzdFJlc3BvbnNlKAotICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxHZXRGb2xkZXJJdGVtc1JlcXVlc3Q+IHBrdCwKLSAgICBzdGQ6OnN0cmluZyAvKiB1bnVzZWQgY3Vycl9zb25nX2lkICovLCBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gc29uZ19saXN0KSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fOwotICBhdXRvIGJ1aWxkZXIgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZU5vd1BsYXlpbmdCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCBicm93c2VfbXR1Xyk7Ci0KLSAgbm93X3BsYXlpbmdfaWRzXy5jbGVhcigpOwotICBmb3IgKGNvbnN0IFNvbmdJbmZvJiBzb25nIDogc29uZ19saXN0KSB7Ci0gICAgbm93X3BsYXlpbmdfaWRzXy5pbnNlcnQoc29uZy5tZWRpYV9pZCk7Ci0gIH0KLQotICBmb3IgKHNpemVfdCBpID0gcGt0LT5HZXRTdGFydEl0ZW0oKTsKLSAgICAgICBpIDw9IHBrdC0+R2V0RW5kSXRlbSgpICYmIGkgPCBzb25nX2xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICBhdXRvIHNvbmcgPSBzb25nX2xpc3RbaV07Ci0KLSAgICAvLyBGaWx0ZXIgb3V0IERFRkFVTFRfQ09WRVJfQVJUIGhhbmRsZSBpZiB0aGlzIGRldmljZSBoYXMgbm8gY2xpZW50Ci0gICAgaWYgKCFIYXNCaXBDbGllbnQoKSkgewotICAgICAgZmlsdGVyX2NvdmVyX2FydChzb25nKTsKLSAgICB9Ci0KLSAgICBhdXRvIHRpdGxlID0gc29uZy5hdHRyaWJ1dGVzLmZpbmQoQXR0cmlidXRlOjpUSVRMRSkgIT0gc29uZy5hdHRyaWJ1dGVzLmVuZCgpCi0gICAgICAgICAgICAgICAgICAgICA/IHNvbmcuYXR0cmlidXRlcy5maW5kKEF0dHJpYnV0ZTo6VElUTEUpLT52YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICA6ICJObyBTb25nIEluZm8iOwotCi0gICAgTWVkaWFFbGVtZW50SXRlbSBpdGVtKGkgKyAxLCB0aXRsZSwgc3RkOjpzZXQ8QXR0cmlidXRlRW50cnk+KCkpOwotICAgIGlmIChwa3QtPkdldE51bUF0dHJpYnV0ZXMoKSA9PSAweDAwKSB7Ci0gICAgICBpdGVtLmF0dHJpYnV0ZXNfID0gc3RkOjptb3ZlKHNvbmcuYXR0cmlidXRlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGl0ZW0uYXR0cmlidXRlc18gPQotICAgICAgICAgIGZpbHRlcl9hdHRyaWJ1dGVzX3JlcXVlc3RlZChzb25nLCBwa3QtPkdldEF0dHJpYnV0ZXNSZXF1ZXN0ZWQoKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZmFpbCB0byBhZGQgYSBzb25nLCBkb24ndCBhY2NpZGVudGFsbHkgYWRkIG9uZSBsYXRlciB0aGF0IG1pZ2h0Ci0gICAgLy8gZml0LgotICAgIGlmICghYnVpbGRlci0+QWRkU29uZyhpdGVtKSkgYnJlYWs7Ci0gIH0KLQotICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShidWlsZGVyKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVTZXRCcm93c2VkUGxheWVyKAotICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxTZXRCcm93c2VkUGxheWVyUmVxdWVzdD4gcGt0KSB7Ci0gIGlmICghcGt0LT5Jc1ZhbGlkKCkpIHsKLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IFJlcXVlc3QgcGFja2V0IGlzIG5vdCB2YWxpZCI7Ci0gICAgYXV0byByZXNwb25zZSA9IFNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIsIDB4MDAwMCwgMCwgMCwgIiIpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX18gPDwgIjogcGxheWVyX2lkPSIgPDwgcGt0LT5HZXRQbGF5ZXJJZCgpOwotICBtZWRpYV9pbnRlcmZhY2VfLT5TZXRCcm93c2VkUGxheWVyKAotICAgICAgcGt0LT5HZXRQbGF5ZXJJZCgpLAotICAgICAgYmFzZTo6QmluZCgmRGV2aWNlOjpTZXRCcm93c2VkUGxheWVyUmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgbGFiZWwsIHBrdCkpOwotfQotCi12b2lkIERldmljZTo6U2V0QnJvd3NlZFBsYXllclJlc3BvbnNlKAotICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxTZXRCcm93c2VkUGxheWVyUmVxdWVzdD4gcGt0LCBib29sIHN1Y2Nlc3MsCi0gICAgc3RkOjpzdHJpbmcgcm9vdF9pZCwgdWludDMyX3QgbnVtX2l0ZW1zKSB7Ci0gIERFVklDRV9WTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IHN1Y2Nlc3M9IiA8PCBzdWNjZXNzIDw8ICIgcm9vdF9pZD1cIiIKLSAgICAgICAgICAgICAgICAgPDwgcm9vdF9pZCA8PCAiXCIgbnVtX2l0ZW1zPSIgPDwgbnVtX2l0ZW1zOwotCi0gIGlmICghc3VjY2VzcykgewotICAgIGF1dG8gcmVzcG9uc2UgPSBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgICAgU3RhdHVzOjpJTlZBTElEX1BMQVlFUl9JRCwgMHgwMDAwLCBudW1faXRlbXMsIDAsICIiKTsKLSAgICBzZW5kX21lc3NhZ2UobGFiZWwsIHRydWUsIHN0ZDo6bW92ZShyZXNwb25zZSkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwa3QtPkdldFBsYXllcklkKCkgPT0gMCAmJiBudW1faXRlbXMgPT0gMCkgewotICAgIC8vIFJlc3BvbnNlIGZhaWwgaWYgbm8gYnJvd3NhYmxlIHBsYXllciBpbiBCbHVldG9vdGggUGxheWVyCi0gICAgYXV0byByZXNwb25zZSA9IFNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgICBTdGF0dXM6OlBMQVlFUl9OT1RfQlJPV1NBQkxFLCAweDAwMDAsIG51bV9pdGVtcywgMCwgIiIpOwotICAgIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY3Vycl9icm93c2VkX3BsYXllcl9pZF8gPSBwa3QtPkdldFBsYXllcklkKCk7Ci0KLSAgLy8gQ2xlYXIgdGhlIHBhdGggYW5kIHB1c2ggdGhlIG5ldyByb290LgotICBjdXJyZW50X3BhdGhfID0gc3RkOjpzdGFjazxzdGQ6OnN0cmluZz4oKTsKLSAgY3VycmVudF9wYXRoXy5wdXNoKHJvb3RfaWQpOwotCi0gIGF1dG8gcmVzcG9uc2UgPSBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgbnVtX2l0ZW1zLCAwLCAiIik7Ci0gIHNlbmRfbWVzc2FnZShsYWJlbCwgdHJ1ZSwgc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpTZW5kTWVkaWFVcGRhdGUoYm9vbCBtZXRhZGF0YSwgYm9vbCBwbGF5X3N0YXR1cywgYm9vbCBxdWV1ZSkgewotICBib29sIGlzX3NpbGVuY2UgPSBJc0luU2lsZW5jZU1vZGUoKTsKLQotICBDSEVDSyhtZWRpYV9pbnRlcmZhY2VfKTsKLSAgREVWSUNFX1ZMT0coNCkgPDwgX19mdW5jX18gPDwgIjogTWV0YWRhdGE9IiA8PCBtZXRhZGF0YQotICAgICAgICAgICAgICAgICA8PCAiIDogcGxheV9zdGF0dXM9ICIgPDwgcGxheV9zdGF0dXMgPDwgIiA6IHF1ZXVlPSIgPDwgcXVldWUKLSAgICAgICAgICAgICAgICAgPDwgIiA7IGlzX3NpbGVuY2U9IiA8PCBpc19zaWxlbmNlOwotCi0gIGlmIChxdWV1ZSkgewotICAgIEhhbmRsZU5vd1BsYXlpbmdVcGRhdGUoKTsKLSAgfQotCi0gIGlmIChwbGF5X3N0YXR1cykgewotICAgIEhhbmRsZVBsYXlTdGF0dXNVcGRhdGUoKTsKLSAgICBpZiAoIWlzX3NpbGVuY2UpIHsKLSAgICAgIEhhbmRsZVBsYXlQb3NVcGRhdGUoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWV0YWRhdGEpIEhhbmRsZVRyYWNrVXBkYXRlKCk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpTZW5kRm9sZGVyVXBkYXRlKGJvb2wgYXZhaWxhYmxlX3BsYXllcnMsIGJvb2wgYWRkcmVzc2VkX3BsYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdWlkcykgewotICBDSEVDSyhtZWRpYV9pbnRlcmZhY2VfKTsKLSAgREVWSUNFX1ZMT0coNCkgPDwgX19mdW5jX187Ci0KLSAgaWYgKGF2YWlsYWJsZV9wbGF5ZXJzKSB7Ci0gICAgSGFuZGxlQXZhaWxhYmxlUGxheWVyVXBkYXRlKCk7Ci0gIH0KLQotICBpZiAoYWRkcmVzc2VkX3BsYXllcikgewotICAgIEhhbmRsZUFkZHJlc3NlZFBsYXllclVwZGF0ZSgpOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVUcmFja1VwZGF0ZSgpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX187Ci0gIGlmICghdHJhY2tfY2hhbmdlZF8uZmlyc3QpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCBmb3IgdHJhY2sgY2hhbmdlZCB1cGRhdGVzIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtZWRpYV9pbnRlcmZhY2VfLT5HZXROb3dQbGF5aW5nTGlzdCgKLSAgICAgIGJhc2U6OkJpbmQoJkRldmljZTo6VHJhY2tDaGFuZ2VkTm90aWZpY2F0aW9uUmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgdHJhY2tfY2hhbmdlZF8uc2Vjb25kLCBmYWxzZSkpOwotfQotCi12b2lkIERldmljZTo6SGFuZGxlUGxheVN0YXR1c1VwZGF0ZSgpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX187Ci0gIGlmICghcGxheV9zdGF0dXNfY2hhbmdlZF8uZmlyc3QpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCBmb3IgcGxheSBzdGF0dXMgdXBkYXRlcyI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbWVkaWFfaW50ZXJmYWNlXy0+R2V0UGxheVN0YXR1cyhiYXNlOjpCaW5kKAotICAgICAgJkRldmljZTo6UGxheWJhY2tTdGF0dXNOb3RpZmljYXRpb25SZXNwb25zZSwKLSAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgcGxheV9zdGF0dXNfY2hhbmdlZF8uc2Vjb25kLCBmYWxzZSkpOwotfQotCi12b2lkIERldmljZTo6SGFuZGxlTm93UGxheWluZ1VwZGF0ZSgpIHsKLSAgREVWSUNFX1ZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFub3dfcGxheWluZ19jaGFuZ2VkXy5maXJzdCkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiRGV2aWNlIGlzIG5vdCByZWdpc3RlcmVkIGZvciBub3cgcGxheWluZyB1cGRhdGVzIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtZWRpYV9pbnRlcmZhY2VfLT5HZXROb3dQbGF5aW5nTGlzdChiYXNlOjpCaW5kKAotICAgICAgJkRldmljZTo6SGFuZGxlTm93UGxheWluZ05vdGlmaWNhdGlvblJlc3BvbnNlLAotICAgICAgd2Vha19wdHJfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBub3dfcGxheWluZ19jaGFuZ2VkXy5zZWNvbmQsIGZhbHNlKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVOb3dQbGF5aW5nTm90aWZpY2F0aW9uUmVzcG9uc2UoCi0gICAgdWludDhfdCBsYWJlbCwgYm9vbCBpbnRlcmltLCBzdGQ6OnN0cmluZyBjdXJyX3NvbmdfaWQsCi0gICAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IHNvbmdfbGlzdCkgewotICBpZiAoaW50ZXJpbSkgewotICAgIG5vd19wbGF5aW5nX2NoYW5nZWRfID0gTm90aWZpY2F0aW9uKHRydWUsIGxhYmVsKTsKLSAgfSBlbHNlIGlmICghbm93X3BsYXlpbmdfY2hhbmdlZF8uZmlyc3QpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCBmb3Igbm93IHBsYXlpbmcgdXBkYXRlcyI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbm93X3BsYXlpbmdfaWRzXy5jbGVhcigpOwotICBmb3IgKGNvbnN0IFNvbmdJbmZvJiBzb25nIDogc29uZ19saXN0KSB7Ci0gICAgbm93X3BsYXlpbmdfaWRzXy5pbnNlcnQoc29uZy5tZWRpYV9pZCk7Ci0gIH0KLQotICBhdXRvIHJlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlTm93UGxheWluZ0J1aWxkZXIoaW50ZXJpbSk7Ci0gIHNlbmRfbWVzc2FnZShub3dfcGxheWluZ19jaGFuZ2VkXy5zZWNvbmQsIGZhbHNlLCBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLQotICBpZiAoIWludGVyaW0pIHsKLSAgICBhY3RpdmVfbGFiZWxzXy5lcmFzZShsYWJlbCk7Ci0gICAgbm93X3BsYXlpbmdfY2hhbmdlZF8gPSBOb3RpZmljYXRpb24oZmFsc2UsIDApOwotICB9Ci19Ci0KLXZvaWQgRGV2aWNlOjpIYW5kbGVQbGF5UG9zVXBkYXRlKCkgewotICBERVZJQ0VfVkxPRygwKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFwbGF5X3Bvc19jaGFuZ2VkXy5maXJzdCkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiRGV2aWNlIGlzIG5vdCByZWdpc3RlcmVkIGZvciBwbGF5IHBvc2l0aW9uIHVwZGF0ZXMiOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1lZGlhX2ludGVyZmFjZV8tPkdldFBsYXlTdGF0dXMoYmFzZTo6QmluZCgKLSAgICAgICZEZXZpY2U6OlBsYXliYWNrUG9zTm90aWZpY2F0aW9uUmVzcG9uc2UsIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwKLSAgICAgIHBsYXlfcG9zX2NoYW5nZWRfLnNlY29uZCwgZmFsc2UpKTsKLX0KLQotdm9pZCBEZXZpY2U6OkhhbmRsZUF2YWlsYWJsZVBsYXllclVwZGF0ZSgpIHsKLSAgREVWSUNFX1ZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFhdmFpbF9wbGF5ZXJzX2NoYW5nZWRfLmZpcnN0KSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJEZXZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgZm9yIGF2YWlsYWJsZSBwbGF5ZXIgdXBkYXRlcyI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byByZXNwb25zZSA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZUF2YWlsYWJsZVBsYXllcnNCdWlsZGVyKGZhbHNlKTsKLSAgc2VuZF9tZXNzYWdlX2NiXy5SdW4oYXZhaWxfcGxheWVyc19jaGFuZ2VkXy5zZWNvbmQsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLQotICBpZiAoIWF2YWlsX3BsYXllcnNfY2hhbmdlZF8uZmlyc3QpIHsKLSAgICBhY3RpdmVfbGFiZWxzXy5lcmFzZShhdmFpbF9wbGF5ZXJzX2NoYW5nZWRfLnNlY29uZCk7Ci0gICAgYXZhaWxfcGxheWVyc19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIH0KLX0KLQotdm9pZCBEZXZpY2U6OkhhbmRsZUFkZHJlc3NlZFBsYXllclVwZGF0ZSgpIHsKLSAgREVWSUNFX1ZMT0coMSkgPDwgX19mdW5jX187Ci0gIGlmICghYWRkcl9wbGF5ZXJfY2hhbmdlZF8uZmlyc3QpIHsKLSAgICBERVZJQ0VfTE9HKFdBUk5JTkcpCi0gICAgICAgIDw8ICJEZXZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgZm9yIGFkZHJlc3NlZCBwbGF5ZXIgdXBkYXRlcyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1lZGlhX2ludGVyZmFjZV8tPkdldE1lZGlhUGxheWVyTGlzdChiYXNlOjpCaW5kKAotICAgICAgJkRldmljZTo6QWRkcmVzc2VkUGxheWVyTm90aWZpY2F0aW9uUmVzcG9uc2UsCi0gICAgICB3ZWFrX3B0cl9mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIGFkZHJfcGxheWVyX2NoYW5nZWRfLnNlY29uZCwgZmFsc2UpKTsKLX0KLQotdm9pZCBEZXZpY2U6OkRldmljZURpc2Nvbm5lY3RlZCgpIHsKLSAgREVWSUNFX0xPRyhJTkZPKSA8PCAiRGV2aWNlIHdhcyBkaXNjb25uZWN0ZWQiOwotICBwbGF5X3Bvc191cGRhdGVfY2JfLkNhbmNlbCgpOwotCi0gIC8vIFRPRE8gKGFwYW5pY2tlKTogT25jZSB0aGUgaW50ZXJmYWNlcyBhcmUgc2V0IGluIHRoZSBEZXZpY2UgY29uc3RydWN0aW9uLAotICAvLyByZW1vdmUgdGhlc2UgY29uZGl0aW9uYWxzLgotICBpZiAodm9sdW1lX2ludGVyZmFjZV8gIT0gbnVsbHB0cikKLSAgICB2b2x1bWVfaW50ZXJmYWNlXy0+RGV2aWNlRGlzY29ubmVjdGVkKEdldEFkZHJlc3MoKSk7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyB2b2x1bWVUb1N0cihpbnQ4X3Qgdm9sdW1lKSB7Ci0gIGlmICh2b2x1bWUgPT0gVk9MX05PVF9TVVBQT1JURUQpIHJldHVybiAiQWJzb2x1dGUgVm9sdW1lIG5vdCBzdXBwb3J0ZWQiOwotICBpZiAodm9sdW1lID09IFZPTF9SRUdJU1RSQVRJT05fRkFJTEVEKQotICAgIHJldHVybiAiVm9sdW1lIGNoYW5nZWQgbm90aWZpY2F0aW9uIHdhcyByZWplY3RlZCI7Ci0gIHJldHVybiBzdGQ6OnRvX3N0cmluZyh2b2x1bWUpOwotfQotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IERldmljZSYgZCkgewotICBvdXQgPDwgZC5hZGRyZXNzXy5Ub1N0cmluZygpOwotICBpZiAoZC5Jc0FjdGl2ZSgpKSBvdXQgPDwgIiA8QWN0aXZlPiI7Ci0gIG91dCA8PCBzdGQ6OmVuZGw7Ci0KLSAgU2NvcGVkSW5kZW50IGluZGVudChvdXQpOwotICBvdXQgPDwgIkN1cnJlbnQgVm9sdW1lOiAiIDw8IHZvbHVtZVRvU3RyKGQudm9sdW1lXykgPDwgc3RkOjplbmRsOwotICBvdXQgPDwgIkN1cnJlbnQgQnJvd3NlZCBQbGF5ZXIgSUQ6ICIgPDwgZC5jdXJyX2Jyb3dzZWRfcGxheWVyX2lkXwotICAgICAgPDwgc3RkOjplbmRsOwotICBvdXQgPDwgIlJlZ2lzdGVyZWQgTm90aWZpY2F0aW9uczpcbiI7Ci0gIHsKLSAgICBTY29wZWRJbmRlbnQgaW5kZW50KG91dCk7Ci0gICAgaWYgKGQudHJhY2tfY2hhbmdlZF8uZmlyc3QpIG91dCA8PCAiVHJhY2sgQ2hhbmdlZFxuIjsKLSAgICBpZiAoZC5wbGF5X3N0YXR1c19jaGFuZ2VkXy5maXJzdCkgb3V0IDw8ICJQbGF5IFN0YXR1c1xuIjsKLSAgICBpZiAoZC5wbGF5X3Bvc19jaGFuZ2VkXy5maXJzdCkgb3V0IDw8ICJQbGF5IFBvc2l0aW9uXG4iOwotICAgIGlmIChkLm5vd19wbGF5aW5nX2NoYW5nZWRfLmZpcnN0KSBvdXQgPDwgIk5vdyBQbGF5aW5nXG4iOwotICAgIGlmIChkLmFkZHJfcGxheWVyX2NoYW5nZWRfLmZpcnN0KSBvdXQgPDwgIkFkZHJlc3NlZCBQbGF5ZXJcbiI7Ci0gICAgaWYgKGQuYXZhaWxfcGxheWVyc19jaGFuZ2VkXy5maXJzdCkgb3V0IDw8ICJBdmFpbGFibGUgUGxheWVyc1xuIjsKLSAgICBpZiAoZC51aWRzX2NoYW5nZWRfLmZpcnN0KSBvdXQgPDwgIlVJRHMgQ2hhbmdlZFxuIjsKLSAgfQotICBvdXQgPDwgIkxhc3QgUGxheSBTdGF0ZTogIiA8PCBkLmxhc3RfcGxheV9zdGF0dXNfLnN0YXRlIDw8IHN0ZDo6ZW5kbDsKLSAgb3V0IDw8ICJMYXN0IFNvbmcgU2VudCBJRDogXCIiIDw8IGQubGFzdF9zb25nX2luZm9fLm1lZGlhX2lkIDw8ICJcIlxuIjsKLSAgb3V0IDw8ICJDdXJyZW50IEZvbGRlcjogXCIiIDw8IGQuQ3VycmVudEZvbGRlcigpIDw8ICJcIlxuIjsKLSAgb3V0IDw8ICJNVFUgU2l6ZXM6IENUUkw9IiA8PCBkLmN0cmxfbXR1XyA8PCAiIEJST1dTRT0iIDw8IGQuYnJvd3NlX210dV8KLSAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBBZGQgc3VwcG9ydGVkIGZlYXR1cmVzIGFzIHdlbGwgYXMgbWVkaWEga2V5cwotICByZXR1cm4gb3V0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvZGV2aWNlLmggYi9wcm9maWxlL2F2cmNwL2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzVkNzM2Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RhY2s+Ci0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbmNlbGFibGVfY2FsbGJhY2suaD4KLQotI2luY2x1ZGUgImF2cmNwX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvYXZyY3AvYXZyY3AuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvYXZyY3BfYnJvd3NlX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9hdnJjcF9wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvY2FwYWJpbGl0aWVzX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9jaGFuZ2VfcGF0aC5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9nZXRfZm9sZGVyX2l0ZW1zLmgiCi0jaW5jbHVkZSAicGFja2V0L2F2cmNwL2dldF9pdGVtX2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtcy5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9wbGF5X2l0ZW0uaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3BhY2tldC5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9zZXRfYWRkcmVzc2VkX3BsYXllci5oIgotI2luY2x1ZGUgInBhY2tldC9hdnJjcC9zZXRfYnJvd3NlZF9wbGF5ZXIuaCIKLSNpbmNsdWRlICJwYWNrZXQvYXZyY3AvdmVuZG9yX3BhY2tldC5oIgotI2luY2x1ZGUgInByb2ZpbGUvYXZyY3AvbWVkaWFfaWRfbWFwLmgiCi0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi0vKioKLSAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgY29ubmVjdGlvbiB3aXRoIGEgcmVtb3RlIEFWUkNQIGRldmljZS4gSXQgaG9sZHMgYWxsCi0gKiB0aGUgc3RhdGUgYW5kIG1lc3NhZ2UgaGFuZGxpbmcgZm9yIHRoZSBkZXZpY2UgdGhhdCBpdCByZXByZXNlbnRzLgotICovCi0vLyBUT0RPIChhcGFuaWNrZSk6IE9uY2Ugd2UgbW92ZSBvdmVyIHRvIGhhdmluZyB0aGUgaW5kaXZpZHVhbCBtZXNzYWdlCi0vLyByZXNwb25kZXJzIGZvciBCcm93c2UgYW5kIENsYXNzaWMgQVZSQ1AgTWVzc2FnZXMgbW92ZSB0aGUgZGV2aWNlIGFyb3VuZCB2aWEgYQotLy8gd2VhayBwb2ludGVyLgotY2xhc3MgRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBEZXZpY2UgaXMgZnJpZW5kcyB3aXRoIEF2cmNwOjpDb25uZWN0aW9uSGFuZGxlciBzbyB0aGF0IENvbm5lY3Rpb25IYW5kbGVyCi0gICAqIGNhbiBkZWxpdmVyIG1lc3NhZ2VzIHRvIGluZGl2aWR1YWwgZGV2aWNlcy4KLSAgICovCi0gIGZyaWVuZCBjbGFzcyBDb25uZWN0aW9uSGFuZGxlcjsKLQotICBEZXZpY2UoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsIGJvb2wgYXZyY3AxM19jb21wYXRpYmlsaXR5LAotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IGxhYmVsLCBib29sIGJyb3dzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPiBtZXNzYWdlKT4KLSAgICAgICAgICBzZW5kX21zZ19jYiwKLSAgICAgIHVpbnQxNl90IGN0cmxfbXR1LCB1aW50MTZfdCBicm93c2VfbXR1KTsKLSAgdmlydHVhbCB+RGV2aWNlKCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBHZXRzIGEgd2VhayBwb2ludGVyIHRvIHRoaXMgZGV2aWNlIHRoYXQgaXMgaW52YWxpZGF0ZWQgd2hlbiB0aGUgZGV2aWNlIGlzCi0gICAqIGRpc2Nvbm5lY3RlZC4KLSAgICovCi0gIGJhc2U6OldlYWtQdHI8RGV2aWNlPiBHZXQoKTsKLQotICBjb25zdCBSYXdBZGRyZXNzJiBHZXRBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gYWRkcmVzc187IH07Ci0KLSAgLyoqCi0gICAqIERpc2Nvbm5lY3RzIHRoZSBBVlJDUCBjb25uZWN0aW9uIHRoYXQgdGhpcyBkZXZpY2UgcmVwcmVzZW50cy4KLSAgICovCi0gIGJvb2wgRGlzY29ubmVjdCgpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgQklQIG9iZXggY2xpZW50Ci0gICAqLwotICB2b2lkIFNldEJpcENsaWVudFN0YXR1cyhib29sIGNvbm5lY3RlZCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGEgQklQIE9CRVggY2xpZW50LgotICAgKi8KLSAgYm9vbCBIYXNCaXBDbGllbnQoKSBjb25zdDsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyBzaWxlbmNlZC4KLSAgICovCi0gIGJvb2wgSXNJblNpbGVuY2VNb2RlKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgYWN0aXZlLgotICAgKi8KLSAgYm9vbCBJc0FjdGl2ZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoZSBkZXZpY2UgdXNlcyB0byBnZXQgaW5mb3JtYXRpb24uIElmIHRoZQotICAgKiBWb2x1bWUgSW50ZXJmYWNlIGlzIG51bGwsIHRoZW4gYWJzb2x1dGUgdm9sdW1lIGlzIGRpc2FibGVkLgotICAgKiBUT0RPIChhcGFuaWNrZSk6IEFkZCB0aGVzZSB0byB0aGUgY29uc3RydWN0b3IvZmFjdG9yeSBzbyB0aGF0IGVhY2ggZGV2aWNlCi0gICAqIGlzIGNyZWF0ZWQgdmFsaWQgYW5kIGNhbid0IGJlIGFjY2lkZW50YWxseSBpbnRlcmFjdGVkIHdpdGggd2hlbiBubwotICAgKiBpbnRlcmZhY2VzIGFyZSByZWdpc3RlcmVkLgotICAgKi8KLSAgdm9pZCBSZWdpc3RlckludGVyZmFjZXMoTWVkaWFJbnRlcmZhY2UqIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQTJkcEludGVyZmFjZSogYTJkcF9pbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUludGVyZmFjZSogdm9sdW1lX2ludGVyZmFjZSk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSBzaXplIG9mIGEgQVZSQ1AgQnJvd3NpbmcgUGFja2V0LiBUaGlzIGlzIGRvbmUgYWZ0ZXIgdGhlCi0gICAqIGNvbm5lY3Rpb24gb2YgdGhlIEJyb3dzaW5nIGNoYW5uZWwuCi0gICAqLwotICB2b2lkIFNldEJyb3dzZU10dSh1aW50MTZfdCBicm93c2VfbXR1KTsKLQotICAvKioKLSAgICogTm90aWZ5IHRoZSBkZXZpY2UgdGhhdCBtZXRhZGF0YSwgcGxheV9zdGF0dXMsIGFuZC9vciBxdWV1ZSBoYXZlIHVwZGF0ZWQKLSAgICogdmlhIGEgYm9vbGVhbi4gRWFjaCBib29sZWFuIHJlcHJlc2VudHMgd2hldGhlciBpdHMgcmVzcGVjdGl2ZSBjb250ZW50IGhhcwotICAgKiB1cGRhdGVkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNlbmRNZWRpYVVwZGF0ZShib29sIG1ldGFkYXRhLCBib29sIHBsYXlfc3RhdHVzLCBib29sIHF1ZXVlKTsKLQotICAvKioKLSAgICogTm90aWZ5IHRoZSBkZXZpY2UgdGhhdCB0aGUgYXZhaWxhYmxlX3BsYXllciwgYWRkcmVzc2VkX3BsYXllciwgb3IgVUlEcwotICAgKiBoYXZlIHVwZGF0ZWQgdmlhIGEgYm9vbGVhbi4gRWFjaCBib29sZWFuIHJlcHJlc2VudHMgd2hldGhlciBpdHMgcmVzcGVjdGl2ZQotICAgKiBjb250ZW50IGhhcyB1cGRhdGVkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNlbmRGb2xkZXJVcGRhdGUoYm9vbCBhdmFpbGFibGVfcGxheWVyLCBib29sIGFkZHJlc3NlZF9wbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdWlkcyk7Ci0KLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBTcGxpdCB0aGUgbWVzc2FnZSBoYW5kbGVycyBpbnRvIHR3byBmaWxlcy4gT25lCi0gIC8vIGZvciBoYW5kbGluZyBCcm93c2UgTWVzc2FnZXMgYW5kIHRoZSBvdGhlciBmb3IgaGFuZGxpbmcgYWxsIG90aGVyCi0gIC8vIG1lc3NhZ2VzLiBUaGlzIHByZXZlbnRzIHRoZSAuY2MgZmlsZSBmcm9tIGdldHRpbmcgYmxvYXRlZCBsaWtlIGl0IGlzCi0gIC8vIG5vdy4gVGhlIERldmljZSBjbGFzcyB3aWxsIHRoZW4gYmVjb21lIGEgc3RhdGUgaG9sZGVyIGZvciBlYWNoIG1lc3NhZ2UKLSAgLy8gYW5kIGFsbCB0aGUgZnVuY3Rpb25zIGluIHRoZXNlIGhhbmRsZXIgY2xhc3NlcyBjYW4gYmUgc3RhdGljIHNpbmNlIHRoZQotICAvLyBkZXZpY2Ugd2lsbCBiZSBwYXNzZWQgaW4uIFRoZSBleHRlbnNpb25zIG9mIHRoZSBEZXZpY2UgY2xhc3MgY2FuIGNvbnRhaW4KLSAgLy8gYW55IGludGVyb3AgaGFuZGxpbmcgZm9yIHNwZWNpZmljIG1lc3NhZ2VzIG9uIHNwZWNpZmljIGRldmljZXMuCi0KLSAgdm9pZCBNZXNzYWdlUmVjZWl2ZWQodWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPFBhY2tldD4gcGt0KTsKLSAgdm9pZCBCcm93c2VNZXNzYWdlUmVjZWl2ZWQodWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEJyb3dzZVBhY2tldD4gcGt0KTsKLSAgdm9pZCBWZW5kb3JQYWNrZXRIYW5kbGVyKHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxWZW5kb3JQYWNrZXQ+IHBrdCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqCi0gICAqIE1FU1NBR0UgUkVTUE9OU0VTCi0gICAqKioqKioqKioqKioqKioqKioqKi8KLSAgLy8gQ1VSUkVOVCBUUkFDSyBDSEFOR0VECi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVUcmFja1VwZGF0ZSgpOwotICB2aXJ0dWFsIHZvaWQgVHJhY2tDaGFuZ2VkTm90aWZpY2F0aW9uUmVzcG9uc2UoCi0gICAgICB1aW50OF90IGxhYmVsLCBib29sIGludGVyaW0sIHN0ZDo6c3RyaW5nIGN1cnJfc29uZ19pZCwKLSAgICAgIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBzb25nX2xpc3QpOwotCi0gIC8vIEdFVCBDQVBBQklMSVRZCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVHZXRDYXBhYmlsaXRpZXMoCi0gICAgICB1aW50OF90IGxhYmVsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8R2V0Q2FwYWJpbGl0aWVzUmVxdWVzdD4mIHBrdCk7Ci0KLSAgLy8gUkVHSVNURVIgTk9USUZJQ0FUSU9OCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVOb3RpZmljYXRpb24oCi0gICAgICB1aW50OF90IGxhYmVsLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0PiYgcGt0KTsKLQotICAvLyBQTEFZIFNUQVRVUyBDSEFOR0VECi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQbGF5U3RhdHVzVXBkYXRlKCk7Ci0KLSAgLy8gTk9XIFBMQVlJTkcgTElTVCBDSEFOR0VECi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVOb3dQbGF5aW5nVXBkYXRlKCk7Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVOb3dQbGF5aW5nTm90aWZpY2F0aW9uUmVzcG9uc2UoCi0gICAgICB1aW50OF90IGxhYmVsLCBib29sIGludGVyaW0sIHN0ZDo6c3RyaW5nIGN1cnJfc29uZ19pZCwKLSAgICAgIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBzb25nX2xpc3QpOwotCi0gIC8vIFBMQVkgUE9TSVRJT04gQ0hBTkdFRAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUGxheVBvc1VwZGF0ZSgpOwotICB2aXJ0dWFsIHZvaWQgUGxheWJhY2tQb3NOb3RpZmljYXRpb25SZXNwb25zZSh1aW50OF90IGxhYmVsLCBib29sIGludGVyaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXlTdGF0dXMgc3RhdHVzKTsKLQotICAvLyBHRVQgUExBWSBTVEFUVVMKLSAgdmlydHVhbCB2b2lkIEdldFBsYXlTdGF0dXNSZXNwb25zZSh1aW50OF90IGxhYmVsLCBQbGF5U3RhdHVzIHN0YXR1cyk7Ci0gIHZpcnR1YWwgdm9pZCBQbGF5YmFja1N0YXR1c05vdGlmaWNhdGlvblJlc3BvbnNlKHVpbnQ4X3QgbGFiZWwsIGJvb2wgaW50ZXJpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheVN0YXR1cyBzdGF0dXMpOwotCi0gIC8vIEdFVCBFTEVNRU5UIEFUVFJJQlVURQotICAvLyBUT0RPIChhcGFuaWNrZSk6IEFkZCBhIEhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoaXMgc28gaWYgYSBzcGVjaWZpYyBkZXZpY2UKLSAgLy8gbmVlZHMgdG8gaW1wbGVtZW50IGFuIGludGVyb3AgZml4LCB5b3Ugb25seSBuZWVkIHRvIG92ZXJsb2FkIHRoZSBvbmUKLSAgLy8gZnVuY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlKAotICAgICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVxdWVzdD4gcGt0LAotICAgICAgU29uZ0luZm8gaW5mbyk7Ci0KLSAgLy8gQVZBSUxBQkxFIFBMQVlFUiBDSEFOR0VECi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVBdmFpbGFibGVQbGF5ZXJVcGRhdGUoKTsKLQotICAvLyBBRERSRVNTRUQgUExBWUVSIENIQU5HRUQKLSAgdmlydHVhbCB2b2lkIEhhbmRsZUFkZHJlc3NlZFBsYXllclVwZGF0ZSgpOwotICB2aXJ0dWFsIHZvaWQgUmVqZWN0Tm90aWZpY2F0aW9uKCk7Ci0gIHZpcnR1YWwgdm9pZCBBZGRyZXNzZWRQbGF5ZXJOb3RpZmljYXRpb25SZXNwb25zZSgKLSAgICAgIHVpbnQ4X3QgbGFiZWwsIGJvb2wgaW50ZXJpbSwgdWludDE2X3QgY3Vycl9wbGF5ZXIsCi0gICAgICBzdGQ6OnZlY3RvcjxNZWRpYVBsYXllckluZm8+IC8qIHVudXNlZCAqLyk7Ci0KLSAgLy8gR0VUIEZPTERFUiBJVEVNUwotICB2aXJ0dWFsIHZvaWQgSGFuZGxlR2V0Rm9sZGVySXRlbXMoCi0gICAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnNoYXJlZF9wdHI8R2V0Rm9sZGVySXRlbXNSZXF1ZXN0PiByZXF1ZXN0KTsKLSAgdmlydHVhbCB2b2lkIEdldE1lZGlhUGxheWVyTGlzdFJlc3BvbnNlKAotICAgICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEdldEZvbGRlckl0ZW1zUmVxdWVzdD4gcGt0LAotICAgICAgdWludDE2X3QgY3Vycl9wbGF5ZXIsIHN0ZDo6dmVjdG9yPE1lZGlhUGxheWVySW5mbz4gcGxheWVycyk7Ci0gIHZpcnR1YWwgdm9pZCBHZXRWRlNMaXN0UmVzcG9uc2UodWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R2V0Rm9sZGVySXRlbXNSZXF1ZXN0PiBwa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TGlzdEl0ZW0+IGl0ZW1zKTsKLSAgdmlydHVhbCB2b2lkIEdldE5vd1BsYXlpbmdMaXN0UmVzcG9uc2UoCi0gICAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnNoYXJlZF9wdHI8R2V0Rm9sZGVySXRlbXNSZXF1ZXN0PiBwa3QsCi0gICAgICBzdGQ6OnN0cmluZyBjdXJyX3NvbmdfaWQsIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBzb25nX2xpc3QpOwotCi0gIC8vIEdFVCBUT1RBTCBOVU1CRVIgT0YgSVRFTVMKLSAgdmlydHVhbCB2b2lkIEhhbmRsZUdldFRvdGFsTnVtYmVyT2ZJdGVtcygKLSAgICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxHZXRUb3RhbE51bWJlck9mSXRlbXNSZXF1ZXN0PiBwa3QpOwotICB2aXJ0dWFsIHZvaWQgR2V0VG90YWxOdW1iZXJPZkl0ZW1zTWVkaWFQbGF5ZXJzUmVzcG9uc2UoCi0gICAgICB1aW50OF90IGxhYmVsLCB1aW50MTZfdCBjdXJyX3BsYXllciwgc3RkOjp2ZWN0b3I8TWVkaWFQbGF5ZXJJbmZvPiBsaXN0KTsKLSAgdmlydHVhbCB2b2lkIEdldFRvdGFsTnVtYmVyT2ZJdGVtc1ZGU1Jlc3BvbnNlKHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gaXRlbXMpOwotICB2aXJ0dWFsIHZvaWQgR2V0VG90YWxOdW1iZXJPZkl0ZW1zTm93UGxheWluZ1Jlc3BvbnNlKAotICAgICAgdWludDhfdCBsYWJlbCwgc3RkOjpzdHJpbmcgY3Vycl9zb25nX2lkLCBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gc29uZ19saXN0KTsKLQotICAvLyBHRVQgSVRFTSBBVFRSSUJVVEVTCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVHZXRJdGVtQXR0cmlidXRlcygKLSAgICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxHZXRJdGVtQXR0cmlidXRlc1JlcXVlc3Q+IHJlcXVlc3QpOwotICB2aXJ0dWFsIHZvaWQgR2V0SXRlbUF0dHJpYnV0ZXNOb3dQbGF5aW5nUmVzcG9uc2UoCi0gICAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnNoYXJlZF9wdHI8R2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0PiBwa3QsCi0gICAgICBzdGQ6OnN0cmluZyBjdXJyX21lZGlhX2lkLCBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gc29uZ19saXN0KTsKLSAgdmlydHVhbCB2b2lkIEdldEl0ZW1BdHRyaWJ1dGVzVkZTUmVzcG9uc2UoCi0gICAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnNoYXJlZF9wdHI8R2V0SXRlbUF0dHJpYnV0ZXNSZXF1ZXN0PiBwa3QsCi0gICAgICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gaXRlbV9saXN0KTsKLQotICAvLyBTRVQgQlJPV1NFRCBQTEFZRVIKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVNldEJyb3dzZWRQbGF5ZXIoCi0gICAgICB1aW50OF90IGxhYmVsLCBzdGQ6OnNoYXJlZF9wdHI8U2V0QnJvd3NlZFBsYXllclJlcXVlc3Q+IHJlcXVlc3QpOwotICB2aXJ0dWFsIHZvaWQgU2V0QnJvd3NlZFBsYXllclJlc3BvbnNlKAotICAgICAgdWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPFNldEJyb3dzZWRQbGF5ZXJSZXF1ZXN0PiBwa3QsIGJvb2wgc3VjY2VzcywKLSAgICAgIHN0ZDo6c3RyaW5nIHJvb3RfaWQsIHVpbnQzMl90IG51bV9pdGVtcyk7Ci0KLSAgLy8gQ0hBTkdFIFBBVEgKLSAgdmlydHVhbCB2b2lkIEhhbmRsZUNoYW5nZVBhdGgodWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENoYW5nZVBhdGhSZXF1ZXN0PiByZXF1ZXN0KTsKLSAgdmlydHVhbCB2b2lkIENoYW5nZVBhdGhSZXNwb25zZSh1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDaGFuZ2VQYXRoUmVxdWVzdD4gcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gbGlzdCk7Ci0KLSAgLy8gUExBWSBJVEVNCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQbGF5SXRlbSh1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXlJdGVtUmVxdWVzdD4gcmVxdWVzdCk7Ci0KLSAgLy8gU0VUIEFERFJFU1NFRCBQTEFZRVIKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVNldEFkZHJlc3NlZFBsYXllcigKLSAgICAgIHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxTZXRBZGRyZXNzZWRQbGF5ZXJSZXF1ZXN0PiByZXF1ZXN0LAotICAgICAgdWludDE2X3QgY3Vycl9wbGF5ZXIsIHN0ZDo6dmVjdG9yPE1lZGlhUGxheWVySW5mbz4gcGxheWVycyk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqCi0gICAqIE1FU1NBR0UgUkVRVUVTVFMKLSAgICoqKioqKioqKioqKioqKioqKioqLwotICAvLyBWT0xVTUUgQ0hBTkdFRCBOT1RJRklDQVRJT04KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVm9sdW1lQ2hhbmdlZCgpOwotICB2aXJ0dWFsIHZvaWQgSGFuZGxlVm9sdW1lQ2hhbmdlZCgKLSAgICAgIHVpbnQ4X3QgbGFiZWwsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlPiYgcGt0KTsKLQotICAvLyBTRVQgVk9MVU1FCi0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoaW50OF90IHZvbHVtZSk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEF2cmNwOjpDb25uZWN0aW9uSGFuZGxlciB0byBzaWduaWZ5IHRoYXQKLSAgICogdGhlIHJlbW90ZSBkZXZpY2Ugd2FzIGRpc2Nvbm5lY3RlZC4KLSAgICoKLSAgICogVE9ETyAoYXBhbmlja2UpOiBQcmV2ZW50IGFsbG93aW5nIHJlc3BvbnNlcyB0byBtZXNzYWdlcyB3aGlsZSB0aGUgZGV2aWNlIGlzCi0gICAqIGRpc2Nvbm5lY3RlZCBieSB1c2luZyBhIHdlYWsgcG9pbnRlciBoYW5kbGUgdG8gdGhlIGRldmljZSB3aGVuIHdlIHNlcGFyYXRlCi0gICAqIG91dCB0aGUgbWVzc2FnZSBoYW5kbGluZy4gQWxzbyBzZXBhcmF0ZSB0aGUgbG9naWMgaW4gdGhlIGZ1dHVyZSB3aGVuCi0gICAqIGRpc2Nvbm5lY3Rpbmcgb25seSBicm93c2luZyAoVGhvdWdoIHRoaXMgc2hvdWxkbid0IG1hdHRlciBhcyBpZiB3ZSBhcmUKLSAgICogZGlzY29ubmVjdGluZyBicm93c2luZyB0aGVuIHdlIHNob3VsZCBiZSBmdWxseSBkaXNjb25uZWN0aW5nIHRoZSBkZXZpY2UpLgotICAgKi8KLSAgdm9pZCBEZXZpY2VEaXNjb25uZWN0ZWQoKTsKLQotICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBEZXZpY2UmIGMpOwotCi0gcHJpdmF0ZToKLSAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIGNvbnRhaW4gb25lIGl0ZW0gd2hpY2ggcmVwcmVzZW50cyB0aGUgcm9vdCBpZCBvbiB0aGUKLSAgLy8gY3VycmVudCBwbGF5ZXIuCi0gIHN0ZDo6c3RyaW5nIEN1cnJlbnRGb2xkZXIoKSBjb25zdCB7Ci0gICAgaWYgKGN1cnJlbnRfcGF0aF8uZW1wdHkoKSkgcmV0dXJuICIiOwotICAgIHJldHVybiBjdXJyZW50X3BhdGhfLnRvcCgpOwotICB9Ci0KLSAgdm9pZCBzZW5kX21lc3NhZ2UodWludDhfdCBsYWJlbCwgYm9vbCBicm93c2UsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjw6OmJsdWV0b290aDo6UGFja2V0QnVpbGRlcj4gbWVzc2FnZSkgewotICAgIGFjdGl2ZV9sYWJlbHNfLmVyYXNlKGxhYmVsKTsKLSAgICBzZW5kX21lc3NhZ2VfY2JfLlJ1bihsYWJlbCwgYnJvd3NlLCBzdGQ6Om1vdmUobWVzc2FnZSkpOwotICB9Ci0gIGJhc2U6OldlYWtQdHJGYWN0b3J5PERldmljZT4gd2Vha19wdHJfZmFjdG9yeV87Ci0KLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBJbml0aWFsaXplIGFsbCB0aGUgdmFyaWFibGVzIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgUmF3QWRkcmVzcyBhZGRyZXNzXzsKLQotICAvLyBFbmFibGVzIEFWUkNQIDEuMyBDb21wYXRpYmlsaXR5IG1vZGUuIFRoaXMgZGlzYWJsZXMgYW55IEFWUkNQIDEuNCsgZmVhdHVyZXMKLSAgLy8gc3VjaCBhcyBicm93c2luZyBhbmQgcGxheWxpc3RzIGJ1dCBoYXMgdGhlIGhpZ2hlc3QgY2hhbmNlIG9mIHdvcmtpbmcuCi0gIGJvb2wgYXZyY3AxM19jb21wYXRpYmlsaXR5XyA9IGZhbHNlOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgbGFiZWwsIGJvb2wgYnJvd3NlLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjw6OmJsdWV0b290aDo6UGFja2V0QnVpbGRlcj4gbWVzc2FnZSk+Ci0gICAgICBzZW5kX21lc3NhZ2VfY2JfOwotICB1aW50MTZfdCBjdHJsX210dV87Ci0gIHVpbnQxNl90IGJyb3dzZV9tdHVfOwotICBib29sIGhhc19iaXBfY2xpZW50XzsKLQotICBpbnQgY3Vycl9icm93c2VkX3BsYXllcl9pZF8gPSAtMTsKLQotICBzdGQ6OnN0YWNrPHN0ZDo6c3RyaW5nPiBjdXJyZW50X3BhdGhfOwotCi0gIC8vIE5vdGlmaWNhdGlvbiBUcmFja2VycwotICB1c2luZyBOb3RpZmljYXRpb24gPSBzdGQ6OnBhaXI8Ym9vbCwgdWludDhfdD47Ci0gIE5vdGlmaWNhdGlvbiB0cmFja19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIE5vdGlmaWNhdGlvbiBwbGF5X3N0YXR1c19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIE5vdGlmaWNhdGlvbiBwbGF5X3Bvc19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIE5vdGlmaWNhdGlvbiBub3dfcGxheWluZ19jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIE5vdGlmaWNhdGlvbiBhZGRyX3BsYXllcl9jaGFuZ2VkXyA9IE5vdGlmaWNhdGlvbihmYWxzZSwgMCk7Ci0gIE5vdGlmaWNhdGlvbiBhdmFpbF9wbGF5ZXJzX2NoYW5nZWRfID0gTm90aWZpY2F0aW9uKGZhbHNlLCAwKTsKLSAgTm90aWZpY2F0aW9uIHVpZHNfY2hhbmdlZF8gPSBOb3RpZmljYXRpb24oZmFsc2UsIDApOwotCi0gIE1lZGlhSWRNYXAgdmZzX2lkc187Ci0gIE1lZGlhSWRNYXAgbm93X3BsYXlpbmdfaWRzXzsKLQotICB1aW50MzJfdCBwbGF5X3Bvc19pbnRlcnZhbF8gPSAwOwotCi0gIFNvbmdJbmZvIGxhc3Rfc29uZ19pbmZvXzsKLSAgUGxheVN0YXR1cyBsYXN0X3BsYXlfc3RhdHVzXzsKLQotICBiYXNlOjpDYW5jZWxhYmxlQ2xvc3VyZSBwbGF5X3Bvc191cGRhdGVfY2JfOwotCi0gIE1lZGlhSW50ZXJmYWNlKiBtZWRpYV9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgQTJkcEludGVyZmFjZSogYTJkcF9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgVm9sdW1lSW50ZXJmYWNlKiB2b2x1bWVfaW50ZXJmYWNlXyA9IG51bGxwdHI7Ci0KLSAgLy8gTGFiZWxzIHVzZWQgZm9yIG1lc3NhZ2VzIGN1cnJlbnRseSBpbiBmbGlnaHQuCi0gIHN0ZDo6c2V0PHVpbnQ4X3Q+IGFjdGl2ZV9sYWJlbHNfOwotCi0gIGludDhfdCB2b2x1bWVfID0gLTE7Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL21lZGlhX2lkX21hcC5oIGIvcHJvZmlsZS9hdnJjcC9tZWRpYV9pZF9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4MmYyMC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL21lZGlhX2lkX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGF2cmNwIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdG8gY29udmVydCBNZWRpYSBJRCdzIChyZXByZXNlbnRlZCBhcyBzdHJpbmdzKSB0aGF0IGFyZQotLy8gcmVjZWl2ZWQgZnJvbSB0aGUgQVZSQ1AgTWVkaWEgSW50ZXJmYWNlIGxheWVyIGludG8gVUlEJ3MgdG8gYmUgdXNlZAotLy8gd2l0aCBjb25uZWN0ZWQgZGV2aWNlcy4KLWNsYXNzIE1lZGlhSWRNYXAgewotIHB1YmxpYzoKLSAgdm9pZCBjbGVhcigpIHsKLSAgICBtZWRpYV9pZF90b191aWRfLmNsZWFyKCk7Ci0gICAgdWlkX3RvX21lZGlhX2lkXy5jbGVhcigpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X21lZGlhX2lkKHVpbnQ2NF90IHVpZCkgewotICAgIGNvbnN0IGF1dG8mIHVpZF9pdCA9IHVpZF90b19tZWRpYV9pZF8uZmluZCh1aWQpOwotICAgIGlmICh1aWRfaXQgPT0gdWlkX3RvX21lZGlhX2lkXy5lbmQoKSkgcmV0dXJuICIiOwotICAgIHJldHVybiB1aWRfaXQtPnNlY29uZDsKLSAgfQotCi0gIHVpbnQ2NF90IGdldF91aWQoc3RkOjpzdHJpbmcgbWVkaWFfaWQpIHsKLSAgICBjb25zdCBhdXRvJiBtZWRpYV9pZF9pdCA9IG1lZGlhX2lkX3RvX3VpZF8uZmluZChtZWRpYV9pZCk7Ci0gICAgaWYgKG1lZGlhX2lkX2l0ID09IG1lZGlhX2lkX3RvX3VpZF8uZW5kKCkpIHJldHVybiAwOwotICAgIHJldHVybiBtZWRpYV9pZF9pdC0+c2Vjb25kOwotICB9Ci0KLSAgdWludDY0X3QgaW5zZXJ0KHN0ZDo6c3RyaW5nIG1lZGlhX2lkKSB7Ci0gICAgaWYgKG1lZGlhX2lkX3RvX3VpZF8uZmluZChtZWRpYV9pZCkgIT0gbWVkaWFfaWRfdG9fdWlkXy5lbmQoKSkgewotICAgICAgcmV0dXJuIG1lZGlhX2lkX3RvX3VpZF9bbWVkaWFfaWRdOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHVpZCA9IG1lZGlhX2lkX3RvX3VpZF8uc2l6ZSgpICsgMTsKLSAgICBtZWRpYV9pZF90b191aWRfLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVpbnQ2NF90PihtZWRpYV9pZCwgdWlkKSk7Ci0gICAgdWlkX3RvX21lZGlhX2lkXy5pbnNlcnQoc3RkOjpwYWlyPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4odWlkLCBtZWRpYV9pZCkpOwotICAgIHJldHVybiB1aWQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB1aW50NjRfdD4gbWVkaWFfaWRfdG9fdWlkXzsKLSAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c3RyaW5nPiB1aWRfdG9fbWVkaWFfaWRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2Nvbm5lY3Rpb25faGFuZGxlcl90ZXN0LmNjIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9jb25uZWN0aW9uX2hhbmRsZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmNzljNC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2Nvbm5lY3Rpb25faGFuZGxlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJhdnJjcF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImF2cmNwX3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAiY29ubmVjdGlvbl9oYW5kbGVyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6TW9ja0Z1bmN0aW9uOwotdXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnUG9pbnRlZTsKLXVzaW5nIDo6dGVzdGluZzo6U2V0QXJnUG9pbnRlZTsKLXVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi11c2luZyBkZXZpY2VfcHRyID0gc3RkOjpzaGFyZWRfcHRyPERldmljZT47Ci0KLWNsYXNzIEF2cmNwQ29ubmVjdGlvbkhhbmRsZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBPTl9DQUxMKG1vY2tfYXZyY3BfLCBDbG9zZShfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMCkpOwotICB9Ci0KLSAgdm9pZCBTZXRVcFNkcCh0QVZSQ19GSU5EX0NCQUNLKiBzZHBfY2IsIGJvb2wgYnJvd3NpbmcsIGJvb2wgYWJzb2x1dGVfdm9sdW1lKSB7Ci0gICAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIEZpbmRTZXJ2aWNlKF8sIF8sIF8sIF8pKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8Mz4oc2RwX2NiKSwgUmV0dXJuKDApKSk7Ci0KLSAgICBzdGF0aWMgdFNEUF9ESVNDX0FUVFIgZmFrZV9mZWF0dXJlczsKLQotICAgIGZha2VfZmVhdHVyZXMgPSB7Ci0gICAgICAgIC5wX25leHRfYXR0ciA9IG51bGxwdHIsCi0gICAgICAgIC5hdHRyX2lkID0gMCwKLSAgICAgICAgLmF0dHJfbGVuX3R5cGUgPSAwLAotICAgICAgICAuYXR0cl92YWx1ZSA9IHsudiA9IHsudTE2ID0gMH19LAotICAgIH07Ci0KLSAgICBpZiAoYnJvd3NpbmcpIGZha2VfZmVhdHVyZXMuYXR0cl92YWx1ZS52LnUxNiB8PSBBVlJDX1NVUEZfQ1RfQlJPV1NFOwotICAgIGlmIChhYnNvbHV0ZV92b2x1bWUpIGZha2VfZmVhdHVyZXMuYXR0cl92YWx1ZS52LnUxNiB8PSBBVlJDX1NVUEZfQ1RfQ0FUMjsKLQotICAgIEVYUEVDVF9DQUxMKG1vY2tfc2RwXywgRmluZEF0dHJpYnV0ZUluUmVjKF8sIF8pKQotICAgICAgICAuVGltZXMoNCkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybigmZmFrZV9mZWF0dXJlcykpOwotCi0gICAgRVhQRUNUX0NBTEwobW9ja19zZHBfLCBGaW5kU2VydmljZUluRGIoXywgXywgXykpCi0gICAgICAgIC5UaW1lcygyKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKCh0U0RQX0RJU0NfUkVDKikweDAxKSkgICAvLyBSZXR1cm4gYW55IG5vbiBudWxsIHBvaW50ZXIKLSAgICAgICAgLldpbGxPbmNlKFJldHVybigodFNEUF9ESVNDX1JFQyopMHgwMSkpOyAgLy8gUmV0dXJuIGFueSBub24gbnVsbCBwb2ludGVyCi0KLSAgICBFWFBFQ1RfQ0FMTChtb2NrX3NkcF8sIEZpbmRQcm9maWxlVmVyc2lvbkluUmVjKF8sIF8sIF8pKQotICAgICAgICAuVGltZXMoMikKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KERvQWxsKFNldEFyZ1BvaW50ZWU8Mj4oQVZSQ19SRVZfMV82KSwgUmV0dXJuKHRydWUpKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgQ29ubmVjdGlvbkhhbmRsZXIqIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotCi0gIC8vIFdlIHVzZSBOaWNlTW9jaydzIGhlcmUgYmVjYXVzZSBlYWNoIGZ1bmN0aW9uIG9mIHRoaXMgY29kZSBkb2VzIHF1aXRlIGEgZmV3Ci0gIC8vIG9wZXJhdGlvbnMuIFRoaXMgd2F5IGl0IGlzIG11Y2ggZWFzaWVyIHRvIHdyaXRlIGEgaGlnaGVyIG51bWJlciBvZiBzbWFsbGVyCi0gIC8vIHRlc3RzIHdpdGhvdXQgaGF2aW5nIGEgbGFyZ2UgYW1vdW50IG9mIHdhcm5pbmdzLgotICBOaWNlTW9jazxNb2NrRnVuY3Rpb248dm9pZChkZXZpY2VfcHRyKT4+IGRldmljZV9jYjsKLSAgTmljZU1vY2s8TW9ja0F2cmNwSW50ZXJmYWNlPiBtb2NrX2F2cmNwXzsKLSAgTmljZU1vY2s8TW9ja1NkcEludGVyZmFjZT4gbW9ja19zZHBfOwotICBOaWNlTW9jazxNb2NrVm9sdW1lSW50ZXJmYWNlPiBtb2NrX3ZvbHVtZV87Ci19OwotCi1URVNUX0YoQXZyY3BDb25uZWN0aW9uSGFuZGxlclRlc3QsIGluaXRpYWxpemVUZXN0KSB7Ci0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IE9wZW4gd2lsbCBiZSBjYWxsZWQgYXMgYW4gYWNjZXB0b3IgYW5kIHNhdmUgdGhlCi0gIC8vIGNvbm5lY3Rpb24gY2FsbGJhY2sgb25jZSBpdCBpcyBjYWxsZWQKLSAgdEFWUkNfQ09OTl9DQiBjb25uX2NiOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgT3BlbihfLCBfLCBSYXdBZGRyZXNzOjprQW55KSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKAotICAgICAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksIFNhdmVBcmdQb2ludGVlPDE+KCZjb25uX2NiKSwgUmV0dXJuKDApKSk7Ci0KLSAgYXV0byBib3VuZF9jYWxsYmFjayA9IGJhc2U6OkJpbmQoJk1vY2tGdW5jdGlvbjx2b2lkKGRldmljZV9wdHIpPjo6Q2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmZGV2aWNlX2NiKSk7Ci0gIEFTU0VSVF9UUlVFKENvbm5lY3Rpb25IYW5kbGVyOjpJbml0aWFsaXplKGJvdW5kX2NhbGxiYWNrLCAmbW9ja19hdnJjcF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2NrX3NkcF8sICZtb2NrX3ZvbHVtZV8pKTsKLSAgY29ubmVjdGlvbl9oYW5kbGVyXyA9IENvbm5lY3Rpb25IYW5kbGVyOjpHZXQoKTsKLQotICAvLyBDaGVjayB0aGF0IHRoZSBjYWxsYmFjayB3YXMgc2VudCB3aXRoIHVzIGFzIHRoZSBhY2NlcHRvcgotICBBU1NFUlRfRVEoY29ubl9jYi5jb25uLCAxKTsKLQotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgQ29ubmVjdGlvbkhhbmRsZXI6OkNsZWFuVXAoKTsKLX0KLQotLy8gQ2hlY2sgdGhhdCBkaXNjb25uZWN0aW5nIHdpdGhvdXQgYW4gYWN0aXZlIGNvbm5lY3Rpb24KLVRFU1RfRihBdnJjcENvbm5lY3Rpb25IYW5kbGVyVGVzdCwgbm90Q29ubmVjdGVkRGlzY29ubmVjdFRlc3QpIHsKLSAgLy8gU2V0IGFuIEV4cGVjdGF0aW9uIHRoYXQgT3BlbiB3aWxsIGJlIGNhbGxlZCB0d2ljZSBhcyBhbiBhY2NlcHRvciBhbmQgc2F2ZQotICAvLyB0aGUgY29ubmVjdGlvbiBjYWxsYmFjayBvbmNlIGl0IGlzIGNhbGxlZC4KLSAgdEFWUkNfQ09OTl9DQiBjb25uX2NiOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgT3BlbihfLCBfLCBSYXdBZGRyZXNzOjprQW55KSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKAotICAgICAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksIFNhdmVBcmdQb2ludGVlPDE+KCZjb25uX2NiKSwgUmV0dXJuKDApKSk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlCi0gIGF1dG8gYm91bmRfY2FsbGJhY2sgPSBiYXNlOjpCaW5kKCZNb2NrRnVuY3Rpb248dm9pZChkZXZpY2VfcHRyKT46OkNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmRldmljZV9jYikpOwotICBBU1NFUlRfVFJVRShDb25uZWN0aW9uSGFuZGxlcjo6SW5pdGlhbGl6ZShib3VuZF9jYWxsYmFjaywgJm1vY2tfYXZyY3BfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9ja19zZHBfLCAmbW9ja192b2x1bWVfKSk7Ci0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBDb25uZWN0aW9uSGFuZGxlcjo6R2V0KCk7Ci0KLSAgLy8gQ2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nIHRoZSBjb25uZWN0aW9uIGhhcyBjbG9zZWQKLSAgY29ubl9jYi5jdHJsX2NiYWNrLlJ1bigxLCBBVlJDX0NMT1NFX0lORF9FVlQsIDAsICZSYXdBZGRyZXNzOjprQW55KTsKLQotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgQ29ubmVjdGlvbkhhbmRsZXI6OkNsZWFuVXAoKTsKLX07Ci0KLS8vIFRlc3QgY2FsbGluZyB0aGUgY29ubmVjdGlvbiBjYWxsYmFjayBhZnRlciB0aGUgaGFuZGxlciBpcyBjbGVhbmVkIHVwCi1URVNUX0YoQXZyY3BDb25uZWN0aW9uSGFuZGxlclRlc3QsIGRpc2Nvbm5lY3RBZnRlckNsZWFudXBUZXN0KSB7Ci0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IE9wZW4gd2lsbCBiZSBjYWxsZWQgdHdpY2UgYXMgYW4gYWNjZXB0b3IgYW5kIHNhdmUKLSAgLy8gdGhlIGNvbm5lY3Rpb24gY2FsbGJhY2sgb25jZSBpdCBpcyBjYWxsZWQuCi0gIHRBVlJDX0NPTk5fQ0IgY29ubl9jYjsKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW4oXywgXywgUmF3QWRkcmVzczo6a0FueSkpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBDb25uZWN0aW9uSGFuZGxlcjo6Q2xlYW5VcCgpOwotCi0gIC8vIENhbGwgdGhlIGNhbGxiYWNrIHdpdGggYSBtZXNzYWdlIHNheWluZyB0aGUgY29ubmVjdGlvbiBoYXMgY2xvc2VkCi0gIGNvbm5fY2IuY3RybF9jYmFjay5SdW4oMSwgQVZSQ19DTE9TRV9JTkRfRVZULCAwLCAmUmF3QWRkcmVzczo6a0FueSk7Ci19OwotCi0vLyBDaGVjayB0aGF0IHdlIGNhbiBoYW5kbGUgaGF2aW5nIGEgcmVtb3RlIGRldmljZSBjb25uZWN0IHRvIHVzLCBzdGFydCBTRFAsIGFuZAotLy8gb3BlbiBhbm90aGVyIGFjY2VwdG9yIGNvbm5lY3Rpb24KLVRFU1RfRihBdnJjcENvbm5lY3Rpb25IYW5kbGVyVGVzdCwgcmVtb3RlRGV2aWNlQ29ubmVjdGlvblRlc3QpIHsKLSAgLy8gU2V0IGFuIEV4cGVjdGF0aW9uIHRoYXQgT3BlbiB3aWxsIGJlIGNhbGxlZCB0d2ljZSBhcyBhbiBhY2NlcHRvciBhbmQgc2F2ZQotICAvLyB0aGUgY29ubmVjdGlvbiBjYWxsYmFjayBvbmNlIGl0IGlzIGNhbGxlZC4KLSAgdEFWUkNfQ09OTl9DQiBjb25uX2NiOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgT3BlbihfLCBfLCBSYXdBZGRyZXNzOjprQW55KSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKAotICAgICAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksIFNhdmVBcmdQb2ludGVlPDE+KCZjb25uX2NiKSwgUmV0dXJuKDApKSkKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDIpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIENoZWNrIHRoYXQgdGhlIGNhbGxiYWNrIHdhcyBzZW50IHdpdGggdXMgYXMgdGhlIGFjY2VwdG9yCi0gIEFTU0VSVF9FUShjb25uX2NiLmNvbm4sIDEpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbnMgdGhhdCBTRFAgd2lsbCBiZSBwZXJmb3JtZWQKLSAgdEFWUkNfRklORF9DQkFDSyBzZHBfY2I7Ci0gIFNldFVwU2RwKCZzZHBfY2IsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgLy8gU2V0IGFuIGV4cGVjdGF0aW9uIHRoYXQgYSBkZXZpY2Ugd2lsbCBiZSBjcmVhdGVkCi0gIEVYUEVDVF9DQUxMKGRldmljZV9jYiwgQ2FsbChfKSkuVGltZXMoMSk7Ci0KLSAgLy8gU2V0IGFuIEV4cGVjdGF0aW9uIHRoYXQgT3BlbkJyb3dzZSB3aWxsIGJlIGNhbGxlZCBpbiBhY2NlcHRvciBtb2RlIHdoZW4gdGhlCi0gIC8vIGRldmljZSBjb25uZWN0cy4KLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW5Ccm93c2UoMSwgQVZDVF9BQ1ApKS5UaW1lcygxKTsKLQotICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzIGNvbm5lY3RlZAotICBjb25uX2NiLmN0cmxfY2JhY2suUnVuKDEsIEFWUkNfT1BFTl9JTkRfRVZULCAwLCAmUmF3QWRkcmVzczo6a0FueSk7Ci0KLSAgLy8gUnVuIHRoZSBTRFAgY2FsbGJhY2sgd2l0aCBzdGF0dXMgc3VjY2VzcwotICBzZHBfY2IuUnVuKDApOwotCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBDb25uZWN0aW9uSGFuZGxlcjo6Q2xlYW5VcCgpOwotfQotCi0vLyBDaGVjayB0aGF0IHdoZW4gYSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhYnNvbHV0ZSB2b2x1bWUsIHRoYXQgdGhlCi0vLyBoYW5kbGVyIHJlcG9ydHMgdGhhdCB2aWEgdGhlIHZvbHVtZSBpbnRlcmZhY2UuCi1URVNUX0YoQXZyY3BDb25uZWN0aW9uSGFuZGxlclRlc3QsIG5vQWJzb2x1dGVWb2x1bWVUZXN0KSB7Ci0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IE9wZW4gd2lsbCBiZSBjYWxsZWQgdHdpY2UgYXMgYW4gYWNjZXB0b3IgYW5kIHNhdmUKLSAgLy8gdGhlIGNvbm5lY3Rpb24gY2FsbGJhY2sgb25jZSBpdCBpcyBjYWxsZWQuCi0gIHRBVlJDX0NPTk5fQ0IgY29ubl9jYjsKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW4oXywgXywgUmF3QWRkcmVzczo6a0FueSkpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpCi0gICAgICAuV2lsbE9uY2UoCi0gICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigyKSwgU2F2ZUFyZ1BvaW50ZWU8MT4oJmNvbm5fY2IpLCBSZXR1cm4oMCkpKTsKLQotICAvLyBJbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKLSAgYXV0byBib3VuZF9jYWxsYmFjayA9IGJhc2U6OkJpbmQoJk1vY2tGdW5jdGlvbjx2b2lkKGRldmljZV9wdHIpPjo6Q2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmZGV2aWNlX2NiKSk7Ci0gIEFTU0VSVF9UUlVFKENvbm5lY3Rpb25IYW5kbGVyOjpJbml0aWFsaXplKGJvdW5kX2NhbGxiYWNrLCAmbW9ja19hdnJjcF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2NrX3NkcF8sICZtb2NrX3ZvbHVtZV8pKTsKLSAgY29ubmVjdGlvbl9oYW5kbGVyXyA9IENvbm5lY3Rpb25IYW5kbGVyOjpHZXQoKTsKLQotICAvLyBTZXQgYW4gRXhwZWN0YXRpb25zIHRoYXQgU0RQIHdpbGwgYmUgcGVyZm9ybWVkCi0gIHRBVlJDX0ZJTkRfQ0JBQ0sgc2RwX2NiOwotICBTZXRVcFNkcCgmc2RwX2NiLCBmYWxzZSwgZmFsc2UpOwotCi0gIEVYUEVDVF9DQUxMKG1vY2tfdm9sdW1lXywgRGV2aWNlQ29ubmVjdGVkKFJhd0FkZHJlc3M6OmtBbnkpKS5UaW1lcygxKTsKLQotICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzIGNvbm5lY3RlZAotICBjb25uX2NiLmN0cmxfY2JhY2suUnVuKDEsIEFWUkNfT1BFTl9JTkRfRVZULCAwLCAmUmF3QWRkcmVzczo6a0FueSk7Ci0KLSAgLy8gUnVuIHRoZSBTRFAgY2FsbGJhY2sgd2l0aCBzdGF0dXMgc3VjY2VzcwotICBzZHBfY2IuUnVuKDApOwotCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBDb25uZWN0aW9uSGFuZGxlcjo6Q2xlYW5VcCgpOwotfQotCi0vLyBDaGVjayB0aGF0IHdoZW4gYSBkZXZpY2UgZG9lcyBzdXBwb3J0IGFic29sdXRlIHZvbHVtZSwgdGhhdCB0aGUgaGFuZGxlcgotLy8gZG9lc24ndCByZXBvcnQgaXQuIEluc3RlYWQgdGhhdCB3aWxsIGJlIGxlZnQgdXAgdG8gdGhlIGRldmljZS4KLVRFU1RfRihBdnJjcENvbm5lY3Rpb25IYW5kbGVyVGVzdCwgYWJzb2x1dGVWb2x1bWVUZXN0KSB7Ci0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IE9wZW4gd2lsbCBiZSBjYWxsZWQgdHdpY2UgYXMgYW4gYWNjZXB0b3IgYW5kIHNhdmUKLSAgLy8gdGhlIGNvbm5lY3Rpb24gY2FsbGJhY2sgb25jZSBpdCBpcyBjYWxsZWQuCi0gIHRBVlJDX0NPTk5fQ0IgY29ubl9jYjsKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW4oXywgXywgUmF3QWRkcmVzczo6a0FueSkpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpCi0gICAgICAuV2lsbE9uY2UoCi0gICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigyKSwgU2F2ZUFyZ1BvaW50ZWU8MT4oJmNvbm5fY2IpLCBSZXR1cm4oMCkpKTsKLQotICAvLyBJbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKLSAgYXV0byBib3VuZF9jYWxsYmFjayA9IGJhc2U6OkJpbmQoJk1vY2tGdW5jdGlvbjx2b2lkKGRldmljZV9wdHIpPjo6Q2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmZGV2aWNlX2NiKSk7Ci0KLSAgU3RyaWN0TW9jazxNb2NrVm9sdW1lSW50ZXJmYWNlPiBzdHJpY3Rfdm9sdW1lOwotICBBU1NFUlRfVFJVRShDb25uZWN0aW9uSGFuZGxlcjo6SW5pdGlhbGl6ZShib3VuZF9jYWxsYmFjaywgJm1vY2tfYXZyY3BfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9ja19zZHBfLCAmc3RyaWN0X3ZvbHVtZSkpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbnMgdGhhdCBTRFAgd2lsbCBiZSBwZXJmb3JtZWQgd2l0aCBhYnNvbHV0ZSB2b2x1bWUKLSAgLy8gc3VwcG9ydGVkCi0gIHRBVlJDX0ZJTkRfQ0JBQ0sgc2RwX2NiOwotICBTZXRVcFNkcCgmc2RwX2NiLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgLy8gQ2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgYSByZW1vdGUgZGV2aWNlIGhhcyBjb25uZWN0ZWQKLSAgY29ubl9jYi5jdHJsX2NiYWNrLlJ1bigxLCBBVlJDX09QRU5fSU5EX0VWVCwgMCwgJlJhd0FkZHJlc3M6OmtBbnkpOwotCi0gIC8vIFJ1biB0aGUgU0RQIGNhbGxiYWNrIHdpdGggc3RhdHVzIHN1Y2Nlc3MKLSAgc2RwX2NiLlJ1bigwKTsKLQotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgQ29ubmVjdGlvbkhhbmRsZXI6OkNsZWFuVXAoKTsKLX0KLQotVEVTVF9GKEF2cmNwQ29ubmVjdGlvbkhhbmRsZXJUZXN0LCBkaXNjb25uZWN0VGVzdCkgewotICAvLyBTZXQgYW4gRXhwZWN0YXRpb24gdGhhdCBPcGVuIHdpbGwgYmUgY2FsbGVkIHR3aWNlIGFzIGFuIGFjY2VwdG9yIGFuZCBzYXZlCi0gIC8vIHRoZSBjb25uZWN0aW9uIGNhbGxiYWNrIG9uY2UgaXQgaXMgY2FsbGVkLgotICB0QVZSQ19DT05OX0NCIGNvbm5fY2I7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXZyY3BfLCBPcGVuKF8sIF8sIFJhd0FkZHJlc3M6OmtBbnkpKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoCi0gICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigxKSwgU2F2ZUFyZ1BvaW50ZWU8MT4oJmNvbm5fY2IpLCBSZXR1cm4oMCkpKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMiksIFJldHVybigwKSkpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIENhbGwgdGhlIGNhbGxiYWNrIHdpdGggYSBtZXNzYWdlIHNheWluZyB0aGF0IGEgcmVtb3RlIGRldmljZSBoYXMgY29ubmVjdGVkCi0gIGNvbm5fY2IuY3RybF9jYmFjay5SdW4oMSwgQVZSQ19PUEVOX0lORF9FVlQsIDAsICZSYXdBZGRyZXNzOjprQW55KTsKLQotICAvLyBTZXQgdXAgdGhlIGV4cGVjdGF0aW9uIHRoYXQgQ2xvc2Ugd2lsbCBiZSBjYWxsZWQKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIENsb3NlKDEpKS5UaW1lcygxKTsKLQotICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzCi0gIC8vIGRpc2Nvbm5lY3RlZAotICBjb25uX2NiLmN0cmxfY2JhY2suUnVuKDEsIEFWUkNfQ0xPU0VfSU5EX0VWVCwgMCwgJlJhd0FkZHJlc3M6OmtBbnkpOwotCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBDb25uZWN0aW9uSGFuZGxlcjo6Q2xlYW5VcCgpOwotfQotCi0vLyBDaGVjayB0aGF0IHdlIGNhbiBoYW5kbGUgaGF2aW5nIGEgcmVtb3RlIGRldmljZSBjb25uZWN0IHRvIHVzLCBzdGFydCBTRFAsIGFuZAotLy8gb3BlbiBhbm90aGVyIGFjY2VwdG9yIGNvbm5lY3Rpb24KLVRFU1RfRihBdnJjcENvbm5lY3Rpb25IYW5kbGVyVGVzdCwgbXVsdGlwbGVSZW1vdGVEZXZpY2VDb25uZWN0aW9uVGVzdCkgewotICAvLyBTZXQgYW4gRXhwZWN0YXRpb24gdGhhdCBPcGVuIHdpbGwgYmUgY2FsbGVkIHRocmVlIHRpbWVzIGFzIGFuIGFjY2VwdG9yIGFuZAotICAvLyBzYXZlIHRoZSBjb25uZWN0aW9uIGNhbGxiYWNrIG9uY2UgaXQgaXMgY2FsbGVkLgotICB0QVZSQ19DT05OX0NCIGNvbm5fY2I7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXZyY3BfLCBPcGVuKF8sIF8sIFJhd0FkZHJlc3M6OmtBbnkpKQotICAgICAgLlRpbWVzKDMpCi0gICAgICAuV2lsbE9uY2UoCi0gICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigxKSwgU2F2ZUFyZ1BvaW50ZWU8MT4oJmNvbm5fY2IpLCBSZXR1cm4oMCkpKQotICAgICAgLldpbGxPbmNlKAotICAgICAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMiksIFNhdmVBcmdQb2ludGVlPDE+KCZjb25uX2NiKSwgUmV0dXJuKDApKSkKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDMpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIENoZWNrIHRoYXQgdGhlIGNhbGxiYWNrIHdhcyBzZW50IHdpdGggdXMgYXMgdGhlIGFjY2VwdG9yCi0gIEFTU0VSVF9FUShjb25uX2NiLmNvbm4sIDEpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbnMgdGhhdCBTRFAgd2lsbCBiZSBwZXJmb3JtZWQKLSAgdEFWUkNfRklORF9DQkFDSyBzZHBfY2I7Ci0gIFNldFVwU2RwKCZzZHBfY2IsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgLy8gU2V0IGFuIGV4cGVjdGF0aW9uIHRoYXQgYSBkZXZpY2Ugd2lsbCBiZSBjcmVhdGVkCi0gIEVYUEVDVF9DQUxMKGRldmljZV9jYiwgQ2FsbChfKSkuVGltZXMoMSk7Ci0KLSAgLy8gU2V0IGFuIEV4cGVjdGF0aW9uIHRoYXQgT3BlbkJyb3dzZSB3aWxsIGJlIGNhbGxlZCBpbiBhY2NlcHRvciBtb2RlIHdoZW4gdGhlCi0gIC8vIGRldmljZSBjb25uZWN0cyBvbiBoYW5kbGUgMQotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgT3BlbkJyb3dzZSgxLCBBVkNUX0FDUCkpLlRpbWVzKDEpOwotCi0gIC8vIENhbGwgdGhlIGNhbGxiYWNrIHdpdGggYSBtZXNzYWdlIHNheWluZyB0aGF0IGEgcmVtb3RlIGRldmljZSBoYXMgY29ubmVjdGVkCi0gIGNvbm5fY2IuY3RybF9jYmFjay5SdW4oMSwgQVZSQ19PUEVOX0lORF9FVlQsIDAsICZSYXdBZGRyZXNzOjprQW55KTsKLQotICAvLyBSdW4gdGhlIFNEUCBjYWxsYmFjayB3aXRoIHN0YXR1cyBzdWNjZXNzCi0gIHNkcF9jYi5SdW4oMCk7Ci0KLSAgLy8gU2V0IGFuIEV4cGVjdGF0aW9ucyB0aGF0IFNEUCB3aWxsIGJlIHBlcmZvcm1lZCBhZ2FpbgotICBTZXRVcFNkcCgmc2RwX2NiLCBmYWxzZSwgZmFsc2UpOwotCi0gIC8vIFNldCBhbiBleHBlY3RhdGlvbiB0aGF0IGEgZGV2aWNlIHdpbGwgYmUgY3JlYXRlZCBhZ2FpbgotICBFWFBFQ1RfQ0FMTChkZXZpY2VfY2IsIENhbGwoXykpLlRpbWVzKDEpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IE9wZW5Ccm93c2Ugd2lsbCBiZSBjYWxsZWQgaW4gYWNjZXB0b3IgbW9kZSB3aGVuIHRoZQotICAvLyBkZXZpY2UgY29ubmVjdHMgb24gaGFuZGxlIDIKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW5Ccm93c2UoMiwgQVZDVF9BQ1ApKS5UaW1lcygxKTsKLQotICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzIGNvbm5lY3RlZAotICAvLyB3aXRoIGEgZGlmZmVyZW50IGFkZHJlc3MKLSAgY29ubl9jYi5jdHJsX2NiYWNrLlJ1bigyLCBBVlJDX09QRU5fSU5EX0VWVCwgMCwgJlJhd0FkZHJlc3M6OmtFbXB0eSk7Ci0KLSAgLy8gUnVuIHRoZSBTRFAgY2FsbGJhY2sgd2l0aCBzdGF0dXMgc3VjY2VzcwotICBzZHBfY2IuUnVuKDApOwotCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBDb25uZWN0aW9uSGFuZGxlcjo6Q2xlYW5VcCgpOwotfQotCi1URVNUX0YoQXZyY3BDb25uZWN0aW9uSGFuZGxlclRlc3QsIGNsZWFudXBUZXN0KSB7Ci0gIC8vIFNldCBVcCBFeHBlY3RhdGlvbnMgZm9yIEluaXRpYWxpemUKLSAgdEFWUkNfQ09OTl9DQiBjb25uX2NiOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgT3BlbihfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpCi0gICAgICAuV2lsbE9uY2UoCi0gICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigyKSwgU2F2ZUFyZ1BvaW50ZWU8MT4oJmNvbm5fY2IpLCBSZXR1cm4oMCkpKQotICAgICAgLldpbGxPbmNlKAotICAgICAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMyksIFNhdmVBcmdQb2ludGVlPDE+KCZjb25uX2NiKSwgUmV0dXJuKDApKSk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlCi0gIGF1dG8gYm91bmRfY2FsbGJhY2sgPSBiYXNlOjpCaW5kKCZNb2NrRnVuY3Rpb248dm9pZChkZXZpY2VfcHRyKT46OkNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJmRldmljZV9jYikpOwotICBBU1NFUlRfVFJVRShDb25uZWN0aW9uSGFuZGxlcjo6SW5pdGlhbGl6ZShib3VuZF9jYWxsYmFjaywgJm1vY2tfYXZyY3BfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9ja19zZHBfLCAmbW9ja192b2x1bWVfKSk7Ci0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBDb25uZWN0aW9uSGFuZGxlcjo6R2V0KCk7Ci0KLSAgLy8gQ2FsbCB0aGUgY2FsbGJhY2sgdHdpY2Ugd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgYSByZW1vdGUgZGV2aWNlIGhhcwotICAvLyBjb25uZWN0ZWQKLSAgY29ubl9jYi5jdHJsX2NiYWNrLlJ1bigxLCBBVlJDX09QRU5fSU5EX0VWVCwgMCwgJlJhd0FkZHJlc3M6OmtBbnkpOwotICBjb25uX2NiLmN0cmxfY2JhY2suUnVuKDIsIEFWUkNfT1BFTl9JTkRfRVZULCAwLCAmUmF3QWRkcmVzczo6a0VtcHR5KTsKLQotICAvLyBTZXQgYW4gRXhwZWN0YXRpb24gdGhhdCBDbG9zZSB3aWxsIGJlIGNhbGxlZCB0d2ljZSB3aXRoIGhhbmRsZXMgMSBhbmQgMgotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgQ2xvc2UoMSkpOwotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgQ2xvc2UoMikpOwotCi0gIC8vIENsZWFudXAgdGhlIG9iamVjdCBjYXVzaW5nIGFsbCBvcGVuIGNvbm5lY3Rpb25zIHRvIGJlIGNsb3NlZAotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgQ29ubmVjdGlvbkhhbmRsZXI6OkNsZWFuVXAoKTsKLX0KLQotVEVTVF9GKEF2cmNwQ29ubmVjdGlvbkhhbmRsZXJUZXN0LCBjb25uZWN0VG9SZW1vdGVEZXZpY2VUZXN0KSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IFNEUCB3aWxsIGJlIHBlcmZvcm1lZAotICB0QVZSQ19GSU5EX0NCQUNLIHNkcF9jYjsKLSAgU2V0VXBTZHAoJnNkcF9jYiwgZmFsc2UsIGZhbHNlKTsKLQotICAvLyBDb25uZWN0IHRvIHRoZSBkZXZpY2Ugd2hpY2ggc3RhcnRzIFNEUAotICBjb25uZWN0aW9uX2hhbmRsZXJfLT5Db25uZWN0RGV2aWNlKFJhd0FkZHJlc3M6OmtFbXB0eSk7Ci0KLSAgLy8gU2V0IGFuIGV4cGVjdGF0aW9uIHRoYXQgdGhlIGhhbmRsZXIgd2lsbCB0cnkgdG8gb3BlbiBhbiBBVlJDUCBjb25uZWN0aW9uCi0gIC8vIGFmdGVyIGRvaW5nIFNEUAotICB0QVZSQ19DT05OX0NCIGNvbm5fY2I7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXZyY3BfLCBPcGVuKF8sIF8sIFJhd0FkZHJlc3M6OmtFbXB0eSkpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZSgKLSAgICAgICAgICBEb0FsbChTZXRBcmdQb2ludGVlPDA+KDEpLCBTYXZlQXJnUG9pbnRlZTwxPigmY29ubl9jYiksIFJldHVybigwKSkpOwotCi0gIC8vIENvbXBsZXRlIFNEUAotICBzZHBfY2IuUnVuKDApOwotCi0gIC8vIENoZWNrIHRoYXQgdGhlIGNhbGxiYWNrIHdhcyBzZW50IHdpdGggdXMgYXMgdGhlIGluaXRpYXRvcgotICBBU1NFUlRfRVEoY29ubl9jYi5jb25uLCAwKTsKLQotICAvLyBTZXQgYW4gZXhwZWN0YXRpb24gdGhhdCBhIGRldmljZSB3aWxsIGJlIGNyZWF0ZWQKLSAgRVhQRUNUX0NBTEwoZGV2aWNlX2NiLCBDYWxsKF8pKS5UaW1lcygxKTsKLQotICAvLyBTZXQgYW4gRXhwZWN0YXRpb24gdGhhdCBPcGVuQnJvd3NlIHdpbGwgTk9UIGJlIGNhbGxlZCBzaW5jZSB0aGUgU0RQIGVudHJ5Ci0gIC8vIGRpZG4ndCBsaXN0IGJyb3dzaW5nIGFzIGEgZmVhdHVyZQotICBFWFBFQ1RfQ0FMTChtb2NrX2F2cmNwXywgT3BlbkJyb3dzZShfLCBfKSkuVGltZXMoMCk7Ci0KLSAgLy8gQ2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgYSByZW1vdGUgZGV2aWNlIGhhcyBjb25uZWN0ZWQKLSAgLy8gd2l0aCBhIGRpZmZlcmVudCBhZGRyZXNzCi0gIGNvbm5fY2IuY3RybF9jYmFjay5SdW4oMiwgQVZSQ19PUEVOX0lORF9FVlQsIDAsICZSYXdBZGRyZXNzOjprRW1wdHkpOwotCi0gIC8vIENsZWFudXAgdGhlIG9iamVjdCBjYXVzaW5nIGFsbCBvcGVuIGNvbm5lY3Rpb25zIHRvIGJlIGNsb3NlZAotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gbnVsbHB0cjsKLSAgQ29ubmVjdGlvbkhhbmRsZXI6OkNsZWFuVXAoKTsKLX0KLQotVEVTVF9GKEF2cmNwQ29ubmVjdGlvbkhhbmRsZXJUZXN0LCBjb25uZWN0VG9Ccm93c2FibGVSZW1vdGVEZXZpY2VUZXN0KSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IFNEUCB3aWxsIGJlIHBlcmZvcm1lZAotICB0QVZSQ19GSU5EX0NCQUNLIHNkcF9jYjsKLSAgU2V0VXBTZHAoJnNkcF9jYiwgdHJ1ZSwgZmFsc2UpOwotCi0gIC8vIENvbm5lY3QgdG8gdGhlIGRldmljZSB3aGljaCBzdGFydHMgU0RQCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8tPkNvbm5lY3REZXZpY2UoUmF3QWRkcmVzczo6a0VtcHR5KTsKLQotICAvLyBTZXQgYW4gZXhwZWN0YXRpb24gdGhhdCB0aGUgaGFuZGxlciB3aWxsIHRyeSB0byBvcGVuIGFuIEFWUkNQIGNvbm5lY3Rpb24KLSAgLy8gYWZ0ZXIgZG9pbmcgU0RQCi0gIHRBVlJDX0NPTk5fQ0IgY29ubl9jYjsKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW4oXywgXywgUmF3QWRkcmVzczo6a0VtcHR5KSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKAotICAgICAgICAgIERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMSksIFNhdmVBcmdQb2ludGVlPDE+KCZjb25uX2NiKSwgUmV0dXJuKDApKSk7Ci0KLSAgLy8gQ29tcGxldGUgU0RQCi0gIHNkcF9jYi5SdW4oMCk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCB0aGUgY2FsbGJhY2sgd2FzIHNlbnQgd2l0aCB1cyBhcyB0aGUgaW5pdGlhdG9yCi0gIEFTU0VSVF9FUShjb25uX2NiLmNvbm4sIDApOwotCi0gIC8vIFNldCBhbiBleHBlY3RhdGlvbiB0aGF0IGEgZGV2aWNlIHdpbGwgYmUgY3JlYXRlZAotICBFWFBFQ1RfQ0FMTChkZXZpY2VfY2IsIENhbGwoXykpLlRpbWVzKDEpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IE9wZW5Ccm93c2Ugd2lsbCBiZSBjYWxsZWQgc2luY2UgYnJvd3NpbmcgaXMgbGlzdGVkCi0gIC8vIGFzIHN1cHBvcnRlZCBpbiBTRFAKLSAgRVhQRUNUX0NBTEwobW9ja19hdnJjcF8sIE9wZW5Ccm93c2UoMSwgQVZDVF9JTlQpKS5UaW1lcygxKTsKLQotICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzIGNvbm5lY3RlZAotICAvLyB3aXRoIGEgZGlmZmVyZW50IGFkZHJlc3MKLSAgY29ubl9jYi5jdHJsX2NiYWNrLlJ1bigxLCBBVlJDX09QRU5fSU5EX0VWVCwgMCwgJlJhd0FkZHJlc3M6OmtFbXB0eSk7Ci0KLSAgLy8gQ2xlYW51cCB0aGUgb2JqZWN0IGNhdXNpbmcgYWxsIG9wZW4gY29ubmVjdGlvbnMgdG8gYmUgY2xvc2VkCi0gIGNvbm5lY3Rpb25faGFuZGxlcl8gPSBudWxscHRyOwotICBDb25uZWN0aW9uSGFuZGxlcjo6Q2xlYW5VcCgpOwotfQotCi1URVNUX0YoQXZyY3BDb25uZWN0aW9uSGFuZGxlclRlc3QsIGRpc2Nvbm5lY3RXaGlsZURvaW5nU2RwVGVzdCkgewotICAvLyBTZXQgYW4gRXhwZWN0YXRpb24gdGhhdCBPcGVuIHdpbGwgYmUgY2FsbGVkIHR3aWNlIGFzIGFuIGFjY2VwdG9yIGFuZCBzYXZlCi0gIC8vIHRoZSBjb25uZWN0aW9uIGNhbGxiYWNrIG9uY2UgaXQgaXMgY2FsbGVkLgotICB0QVZSQ19DT05OX0NCIGNvbm5fY2I7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYXZyY3BfLCBPcGVuKF8sIF8sIFJhd0FkZHJlc3M6OmtBbnkpKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoCi0gICAgICAgICAgRG9BbGwoU2V0QXJnUG9pbnRlZTwwPigxKSwgU2F2ZUFyZ1BvaW50ZWU8MT4oJmNvbm5fY2IpLCBSZXR1cm4oMCkpKQotICAgICAgLldpbGxPbmNlKERvQWxsKFNldEFyZ1BvaW50ZWU8MD4oMiksIFJldHVybigwKSkpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIGludGVyZmFjZQotICBhdXRvIGJvdW5kX2NhbGxiYWNrID0gYmFzZTo6QmluZCgmTW9ja0Z1bmN0aW9uPHZvaWQoZGV2aWNlX3B0cik+OjpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZkZXZpY2VfY2IpKTsKLSAgQVNTRVJUX1RSVUUoQ29ubmVjdGlvbkhhbmRsZXI6OkluaXRpYWxpemUoYm91bmRfY2FsbGJhY2ssICZtb2NrX2F2cmNwXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vY2tfc2RwXywgJm1vY2tfdm9sdW1lXykpOwotICBjb25uZWN0aW9uX2hhbmRsZXJfID0gQ29ubmVjdGlvbkhhbmRsZXI6OkdldCgpOwotCi0gIC8vIFNldCBhbiBFeHBlY3RhdGlvbiB0aGF0IFNEUCB3aWxsIGJlIHBlcmZvcm1lZAotICB0QVZSQ19GSU5EX0NCQUNLIHNkcF9jYjsKLSAgU2V0VXBTZHAoJnNkcF9jYiwgdHJ1ZSwgZmFsc2UpOwotCi0gIC8vIENhbGwgdGhlIGNhbGxiYWNrIHdpdGggYSBtZXNzYWdlIHNheWluZyB0aGF0IGEgcmVtb3RlIGRldmljZSBoYXMgY29ubmVjdGVkCi0gIGNvbm5fY2IuY3RybF9jYmFjay5SdW4oMSwgQVZSQ19PUEVOX0lORF9FVlQsIDAsICZSYXdBZGRyZXNzOjprQW55KTsKLQotICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgbWVzc2FnZSBzYXlpbmcgdGhhdCBhIHJlbW90ZSBkZXZpY2UgaGFzCi0gIC8vIGRpc2Nvbm5lY3RlZAotICBjb25uX2NiLmN0cmxfY2JhY2suUnVuKDEsIEFWUkNfQ0xPU0VfSU5EX0VWVCwgMCwgJlJhd0FkZHJlc3M6OmtBbnkpOwotCi0gIC8vIFNpZ25hbCB0aGF0IFNEUCBoYXMgY29tcGxldGVkCi0gIHNkcF9jYi5SdW4oMCk7Ci0KLSAgY29ubmVjdGlvbl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gIENvbm5lY3Rpb25IYW5kbGVyOjpDbGVhblVwKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhdnJjcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9hdnJjcF9kZXZpY2VfZnV6ei5jYyBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovYXZyY3BfZGV2aWNlX2Z1enouY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2RkNmYuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9hdnJjcF9kZXZpY2VfZnV6ei5jYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJhdnJjcF9wYWNrZXQuaCIKLSNpbmNsdWRlICJkZXZpY2UuaCIKLSNpbmNsdWRlICJwYWNrZXRfdGVzdF9oZWxwZXIuaCIKLSNpbmNsdWRlICJzdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci1jbGFzcyBGYWtlTWVkaWFJbnRlcmZhY2UgOiBwdWJsaWMgTWVkaWFJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIFNlbmRLZXlFdmVudCh1aW50OF90IGtleSwgS2V5U3RhdGUgc3RhdGUpIHt9Ci0gIHVzaW5nIFNvbmdJbmZvQ2FsbGJhY2sgPSBiYXNlOjpDYWxsYmFjazx2b2lkKFNvbmdJbmZvKT47Ci0gIHZpcnR1YWwgdm9pZCBHZXRTb25nSW5mbyhTb25nSW5mb0NhbGxiYWNrIGluZm9fY2IpIHt9Ci0gIHVzaW5nIFBsYXlTdGF0dXNDYWxsYmFjayA9IGJhc2U6OkNhbGxiYWNrPHZvaWQoUGxheVN0YXR1cyk+OwotICB2aXJ0dWFsIHZvaWQgR2V0UGxheVN0YXR1cyhQbGF5U3RhdHVzQ2FsbGJhY2sgc3RhdHVzX2NiKSB7fQotICB1c2luZyBOb3dQbGF5aW5nQ2FsbGJhY2sgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8U29uZ0luZm8+KT47Ci0gIHZpcnR1YWwgdm9pZCBHZXROb3dQbGF5aW5nTGlzdChOb3dQbGF5aW5nQ2FsbGJhY2sgbm93X3BsYXlpbmdfY2IpIHt9Ci0gIHVzaW5nIE1lZGlhTGlzdENhbGxiYWNrID0KLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDE2X3QgY3Vycl9wbGF5ZXIsIHN0ZDo6dmVjdG9yPE1lZGlhUGxheWVySW5mbz4pPjsKLSAgdmlydHVhbCB2b2lkIEdldE1lZGlhUGxheWVyTGlzdChNZWRpYUxpc3RDYWxsYmFjayBsaXN0X2NiKSB7fQotICB1c2luZyBGb2xkZXJJdGVtc0NhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnZlY3RvcjxMaXN0SXRlbT4pPjsKLSAgdmlydHVhbCB2b2lkIEdldEZvbGRlckl0ZW1zKHVpbnQxNl90IHBsYXllcl9pZCwgc3RkOjpzdHJpbmcgbWVkaWFfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkZXJJdGVtc0NhbGxiYWNrIGZvbGRlcl9jYikge30KLSAgdXNpbmcgU2V0QnJvd3NlZFBsYXllckNhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCgKLSAgICAgIGJvb2wgc3VjY2Vzcywgc3RkOjpzdHJpbmcgcm9vdF9pZCwgdWludDMyX3QgbnVtX2l0ZW1zKT47Ci0gIHZpcnR1YWwgdm9pZCBTZXRCcm93c2VkUGxheWVyKHVpbnQxNl90IHBsYXllcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0QnJvd3NlZFBsYXllckNhbGxiYWNrIGJyb3dzZV9jYikge30KLSAgdmlydHVhbCB2b2lkIFBsYXlJdGVtKHVpbnQxNl90IHBsYXllcl9pZCwgYm9vbCBub3dfcGxheWluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lZGlhX2lkKSB7fQotICB2aXJ0dWFsIHZvaWQgU2V0QWN0aXZlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHt9Ci0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlclVwZGF0ZUNhbGxiYWNrKE1lZGlhQ2FsbGJhY2tzKiBjYWxsYmFjaykge30KLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJVcGRhdGVDYWxsYmFjayhNZWRpYUNhbGxiYWNrcyogY2FsbGJhY2spIHt9Ci19OwotCi1jbGFzcyBGYWtlVm9sdW1lSW50ZXJmYWNlIDogcHVibGljIFZvbHVtZUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgRGV2aWNlQ29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkcikge30KLSAgdmlydHVhbCB2b2lkIERldmljZUNvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsIFZvbHVtZUNoYW5nZWRDYiBjYikge30KLSAgdmlydHVhbCB2b2lkIERldmljZURpc2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBTZXRWb2x1bWUoaW50OF90IHZvbHVtZSkge30KLX07Ci0KLWNsYXNzIEZha2VBMmRwSW50ZXJmYWNlIDogcHVibGljIEEyZHBJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCBSYXdBZGRyZXNzIGFjdGl2ZV9wZWVyKCkgeyByZXR1cm4gUmF3QWRkcmVzcygpOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19wZWVyX2luX3NpbGVuY2VfbW9kZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX07Ci0KLWJvb2wgZ2V0X3B0c19hdnJjcF90ZXN0KHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLWNvbnN0IHN0YWNrX2NvbmZpZ190IGludGVyZmFjZSA9IHsKLSAgICBudWxscHRyLCBnZXRfcHRzX2F2cmNwX3Rlc3QsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCi0gICAgbnVsbHB0cn07Ci0KLXZvaWQgQ2FsbGJhY2sodWludDhfdCwgYm9vbCwgc3RkOjp1bmlxdWVfcHRyPDo6Ymx1ZXRvb3RoOjpQYWNrZXRCdWlsZGVyPikge30KLQotZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBEYXRhLCBzaXplX3QgU2l6ZSkgewotICBGYWtlTWVkaWFJbnRlcmZhY2UgZm1pOwotICBGYWtlVm9sdW1lSW50ZXJmYWNlIGZ2aTsKLSAgRmFrZUEyZHBJbnRlcmZhY2UgZmFpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFBhY2tldChEYXRhLCBEYXRhICsgU2l6ZSk7Ci0gIERldmljZSBkZXZpY2UoUmF3QWRkcmVzczo6a0FueSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKFtdKHVpbnQ4X3QsIGJvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8OjpibHVldG9vdGg6OlBhY2tldEJ1aWxkZXI+KSB7fSksCi0gICAgICAgICAgICAgICAgMHhGRkZGLCAweEZGRkYpOwotICBkZXZpY2UuUmVnaXN0ZXJJbnRlcmZhY2VzKCZmbWksICZmYWksICZmdmkpOwotCi0gIGF1dG8gYnJvd3NlX3JlcXVlc3QgPSBUZXN0UGFja2V0VHlwZTxCcm93c2VQYWNrZXQ+OjpNYWtlKFBhY2tldCk7Ci0gIGRldmljZS5Ccm93c2VNZXNzYWdlUmVjZWl2ZWQoMSwgYnJvd3NlX3JlcXVlc3QpOwotCi0gIGF1dG8gYXZyY3BfcmVxdWVzdCA9IFRlc3RQYWNrZXRUeXBlPGF2cmNwOjpQYWNrZXQ+OjpNYWtlKFBhY2tldCk7Ci0gIGRldmljZS5NZXNzYWdlUmVjZWl2ZWQoMSwgYXZyY3BfcmVxdWVzdCk7Ci0gIHJldHVybiAwOwotfQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLWNvbnN0IHN0YWNrX2NvbmZpZ190KiBzdGFja19jb25maWdfZ2V0X2ludGVyZmFjZSh2b2lkKSB7Ci0gIHJldHVybiAmYmx1ZXRvb3RoOjphdnJjcDo6aW50ZXJmYWNlOwotfQpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvY2hhbmdlX3BhdGhfZXJyb3JfcmVzcG9uc2UgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9jaGFuZ2VfcGF0aF9lcnJvcl9yZXNwb25zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmOTgyYy4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9jaGFuZ2VfcGF0aF9lcnJvcl9yZXNwb25zZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZV9wYXRoX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9jaGFuZ2VfcGF0aF9yZXF1ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODEzMjdhLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZV9wYXRoX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9jaGFuZ2VfcGF0aF9yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZV9wYXRoX3Jlc3BvbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM3NTc2Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZV9wYXRoX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvY2hhbmdlX3BhdGhfdXBfcmVxdWVzdCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZV9wYXRoX3VwX3JlcXVlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMjI2NTcuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvY2hhbmdlX3BhdGhfdXBfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZWRfcGxheV9wb3Nfbm90aWZpY2F0aW9uIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvY2hhbmdlZF9wbGF5X3Bvc19ub3RpZmljYXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTc2NjEuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvY2hhbmdlZF9wbGF5X3Bvc19ub3RpZmljYXRpb24KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9jaGFuZ2VkX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbiBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQ1MGZiLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2NoYW5nZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2VuZXJhbF9yZWplY3RfaW52YWxpZF9jb21tYW5kX3BhY2tldCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dlbmVyYWxfcmVqZWN0X2ludmFsaWRfY29tbWFuZF9wYWNrZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmE0MjcuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2VuZXJhbF9yZWplY3RfaW52YWxpZF9jb21tYW5kX3BhY2tldAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2OGMwMy4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfY29tcGFueV9pZCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdF9jb21wYW55X2lkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzk2NmVkLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdF9jb21wYW55X2lkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2NhcGFiaWxpdGllc19yZXF1ZXN0X3Vua25vd24gYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfdW5rbm93bgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkYTU0Ny4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfdW5rbm93bgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcmVzcG9uc2VfY29tcGFueV9pZCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9jYXBhYmlsaXRpZXNfcmVzcG9uc2VfY29tcGFueV9pZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4ODljYS4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlX2NvbXBhbnlfaWQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlX2V2ZW50c19zdXBwb3J0ZWQgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfY2FwYWJpbGl0aWVzX3Jlc3BvbnNlX2V2ZW50c19zdXBwb3J0ZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2Y4YTguLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2NhcGFiaWxpdGllc19yZXNwb25zZV9ldmVudHNfc3VwcG9ydGVkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfZnVsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5YzFkMy4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfZnVsbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxdWVzdF9wYXJ0aWFsIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BhcnRpYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2M5YjYuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X3BhcnRpYWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZWxlbWVudHNfYXR0cmlidXRlc19yZXNwb25zZV9mdWxsIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2VsZW1lbnRzX2F0dHJpYnV0ZXNfcmVzcG9uc2VfZnVsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2M2ZlYi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZWxlbWVudHNfYXR0cmlidXRlc19yZXNwb25zZV9mdWxsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19lcnJvcl9yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfZXJyb3JfcmVzcG9uc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTM2MWIuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19lcnJvcl9yZXNwb25zZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfZm9sZGVyX3Jlc3BvbnNlIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19mb2xkZXJfcmVzcG9uc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODg4OWEuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19mb2xkZXJfcmVzcG9uc2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX21lZGlhX3BsYXllcl9yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfbWVkaWFfcGxheWVyX3Jlc3BvbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI1YzhjLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfbWVkaWFfcGxheWVyX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0IGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThmYTA1Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF9ub19hdHRycyBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF9ub19hdHRycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyN2ZmOS4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Rfbm9fYXR0cnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmcgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWEzNTUuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3RpdGxlIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3RpdGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTA4ZmM3Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF90aXRsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF92ZnMgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3RfdmZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGNjODY3Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF92ZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX3NvbmdfcmVzcG9uc2UgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfZm9sZGVyX2l0ZW1zX3NvbmdfcmVzcG9uc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NDcyZTAuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2ZvbGRlcl9pdGVtc19zb25nX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXF1ZXN0X2FsbF9hdHRyaWJ1dGVzIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXF1ZXN0X2FsbF9hdHRyaWJ1dGVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcwNmI4Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdF9hbGxfYXR0cmlidXRlcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdF9hbGxfYXR0cmlidXRlc19pbnZhbGlkIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXF1ZXN0X2FsbF9hdHRyaWJ1dGVzX2ludmFsaWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NWQwYzQuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19yZXF1ZXN0X2FsbF9hdHRyaWJ1dGVzX2ludmFsaWQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3NvbmdfcmVzcG9uc2UgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfaXRlbV9hdHRyaWJ1dGVzX3NvbmdfcmVzcG9uc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTM2NjQuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X2l0ZW1fYXR0cmlidXRlc19zb25nX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X3BsYXlfc3RhdHVzX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfcGxheV9zdGF0dXNfcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxMWE0Ny4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfcGxheV9zdGF0dXNfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9wbGF5X3N0YXR1c19yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF9wbGF5X3N0YXR1c19yZXNwb25zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwMTM2Zi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfcGxheV9zdGF0dXNfcmVzcG9uc2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3RfbWVkaWFfcGxheWVycyBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxdWVzdF9tZWRpYV9wbGF5ZXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI4NWI3Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxdWVzdF9tZWRpYV9wbGF5ZXJzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGE2NjU0Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxdWVzdF9ub3dfcGxheWluZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxdWVzdF92ZnMgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3RfdmZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjlhZDc1Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2dldF90b3RhbF9udW1iZXJfb2ZfaXRlbXNfcmVxdWVzdF92ZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3Jlc3BvbnNlIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXNwb25zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyZGE5Ni4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV9hZGRyZXNzZWRfcGxheWVyX25vdGlmaWNhdGlvbiBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2ludGVyaW1fYWRkcmVzc2VkX3BsYXllcl9ub3RpZmljYXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjA0NGIuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV9hZGRyZXNzZWRfcGxheWVyX25vdGlmaWNhdGlvbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2ludGVyaW1fYXZhaWxhYmxlX3BsYXllcnNfbm90aWZpY2F0aW9uIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV9hdmFpbGFibGVfcGxheWVyc19ub3RpZmljYXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDNjZjQuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV9hdmFpbGFibGVfcGxheWVyc19ub3RpZmljYXRpb24KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX25vd19wbGF5aW5nX25vdGlmaWNhdGlvbiBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2ludGVyaW1fbm93X3BsYXlpbmdfbm90aWZpY2F0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTY2NzVlLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2ludGVyaW1fbm93X3BsYXlpbmdfbm90aWZpY2F0aW9uCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV9wbGF5X3N0YXR1c19ub3RpZmljYXRpb24gYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3BsYXlfc3RhdHVzX25vdGlmaWNhdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMjMzZC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3BsYXlfc3RhdHVzX25vdGlmaWNhdGlvbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2ludGVyaW1fdHJhY2tfY2hhbmdlZF9ub3RpZmljYXRpb24gYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3RyYWNrX2NoYW5nZWRfbm90aWZpY2F0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNjZjZlLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL2ludGVyaW1fdHJhY2tfY2hhbmdlZF9ub3RpZmljYXRpb24KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3VpZHNfbm90aWZpY2FpdG9uIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV91aWRzX25vdGlmaWNhaXRvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjOWI0YS4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3VpZHNfbm90aWZpY2FpdG9uCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvaW50ZXJpbV92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24gYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxYmFlNi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9pbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Bhc3NfdGhyb3VnaF9jb21tYW5kX3BsYXlfcHVzaGVkIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDAyZDIuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9wdXNoZWQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9wYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3JlbGVhc2VkIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcGFzc190aHJvdWdoX2NvbW1hbmRfcGxheV9yZWxlYXNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMDBlOC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9wYXNzX3Rocm91Z2hfY29tbWFuZF9wbGF5X3JlbGVhc2VkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcGxheV9pdGVtX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9wbGF5X2l0ZW1fcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4YTdjMC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9wbGF5X2l0ZW1fcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3BsYXlfaXRlbV9yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3BsYXlfaXRlbV9yZXNwb25zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MGJjYy4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9wbGF5X2l0ZW1fcmVzcG9uc2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9yZWdpc3Rlcl9ub3RpZmljYXRpb25faW52YWxpZCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9pbnZhbGlkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTIxM2YwLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9pbnZhbGlkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcmVnaXN0ZXJfcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcmVnaXN0ZXJfcGxheV9zdGF0dXNfbm90aWZpY2F0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQwZGU0Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlZ2lzdGVyX3BsYXlfc3RhdHVzX25vdGlmaWNhdGlvbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlZ2lzdGVyX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbiBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlZ2lzdGVyX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3MjA5Yi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9yZWdpc3Rlcl92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9yZWplY3RfcGxheWVyX2FwcF9zZXR0aW5nc19yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlamVjdF9wbGF5ZXJfYXBwX3NldHRpbmdzX3Jlc3BvbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNjMDQ3Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlamVjdF9wbGF5ZXJfYXBwX3NldHRpbmdzX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcmVqZWN0ZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvcmVqZWN0ZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTE5YTJkLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3JlamVjdGVkX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hYnNvbHV0ZV92b2x1bWVfcmVxdWVzdCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hYnNvbHV0ZV92b2x1bWVfcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwM2I4NC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYWJzb2x1dGVfdm9sdW1lX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYWJzb2x1dGVfdm9sdW1lX3Jlc3BvbnNlIGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2V0X2Fic29sdXRlX3ZvbHVtZV9yZXNwb25zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwY2RlMi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYWJzb2x1dGVfdm9sdW1lX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2V0X2FkZHJlc3NlZF9wbGF5ZXJfaWRfMV9yZXF1ZXN0IGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2V0X2FkZHJlc3NlZF9wbGF5ZXJfaWRfMV9yZXF1ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmUyMjRlLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hZGRyZXNzZWRfcGxheWVyX2lkXzFfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYWRkcmVzc2VkX3BsYXllcl9yZXF1ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhjZmI3Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYWRkcmVzc2VkX3BsYXllcl9yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hZGRyZXNzZWRfcGxheWVyX3Jlc3BvbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjMwNTI0Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9hZGRyZXNzZWRfcGxheWVyX3Jlc3BvbnNlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2V0X2Jyb3dzZWRfcGxheWVyX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYnJvd3NlZF9wbGF5ZXJfcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3MTM3Yi4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYnJvd3NlZF9wbGF5ZXJfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9icm93c2VkX3BsYXllcl9yZXNwb25zZSBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3NldF9icm93c2VkX3BsYXllcl9yZXNwb25zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhM2M5My4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zZXRfYnJvd3NlZF9wbGF5ZXJfcmVzcG9uc2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9icm93c2VfcGFja2V0IGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfYnJvd3NlX3BhY2tldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2NmVmMC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9icm93c2VfcGFja2V0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfY2hhbmdlX3BhdGhfcmVxdWVzdCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X2NoYW5nZV9wYXRoX3JlcXVlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWQzMzcuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfY2hhbmdlX3BhdGhfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjNWIzMy4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9nZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9nZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmQ3ODguLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0IGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWIwYWE4Li4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X2dldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdCBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X2dldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2NzU1NS4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9nZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjM0ZTIuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfcGxheV9pdGVtX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9wbGF5X2l0ZW1fcmVxdWVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzOGRjNC4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9wbGF5X2l0ZW1fcmVxdWVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X3NldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QgYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF9zZXRfYWRkcmVzc2VkX3BsYXllcl9yZXF1ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODcyZDZiLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX2Z1enovY29ycHVzL3Nob3J0X3NldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF92ZW5kb3JfcGFja2V0IGIvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfZnV6ei9jb3JwdXMvc2hvcnRfdmVuZG9yX3BhY2tldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyYTY2ZS4uMDAwMDAwMAotLS0gYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX2RldmljZV9mdXp6L2NvcnB1cy9zaG9ydF92ZW5kb3JfcGFja2V0CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfdGVzdC5jYyBiL3Byb2ZpbGUvYXZyY3AvdGVzdHMvYXZyY3BfZGV2aWNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWE4OGIuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF9kZXZpY2VfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZC5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgImF2cmNwX3BhY2tldC5oIgotI2luY2x1ZGUgImF2cmNwX3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAiZGV2aWNlLmgiCi0jaW5jbHVkZSAic3RhY2tfY29uZmlnLmgiCi0jaW5jbHVkZSAidGVzdHMvYXZyY3AvYXZyY3BfdGVzdF9wYWNrZXRzLmgiCi0jaW5jbHVkZSAidGVzdHMvcGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXZyY3AgewotCi0vLyBUT0RPIChhcGFuaWNrZSk6IEFsbCB0aGUgdGVzdHMgYmVsb3cgYXJlIGp1c3QgYmFzaWMgcG9zaXRpdmUgdW5pdCB0ZXN0cy4KLS8vIEFkZCBtb3JlIHRlc3RzIHRvIGluY3JlYXNlIGNvZGUgY292ZXJhZ2UuCi0KLXVzaW5nIEF2cmNwUmVzcG9uc2UgPSBzdGQ6OnVuaXF1ZV9wdHI8OjpibHVldG9vdGg6OlBhY2tldEJ1aWxkZXI+OwotdXNpbmcgVGVzdEF2cmNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFja2V0PjsKLXVzaW5nIFRlc3RCcm93c2VQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxCcm93c2VQYWNrZXQ+OwotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6Ok1vY2s7Ci11c2luZyA6OnRlc3Rpbmc6Ok1vY2tGdW5jdGlvbjsKLXVzaW5nIDo6dGVzdGluZzo6TmljZU1vY2s7Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIDo6dGVzdGluZzo6U2F2ZUFyZzsKLQotYm9vbCBnZXRfcHRzX2F2cmNwX3Rlc3Qodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLQotY29uc3Qgc3RhY2tfY29uZmlnX3QgaW50ZXJmYWNlID0gewotICAgIG51bGxwdHIsIGdldF9wdHNfYXZyY3BfdGVzdCwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICBudWxscHRyfTsKLQotLy8gVE9ETyAoYXBhbmlja2UpOiBBbGwgdGhlIHRlc3RzIGJlbG93IGFyZSBqdXN0IGJhc2ljIHBvc2l0aXZlIHVuaXQgdGVzdHMuCi0vLyBBZGQgbW9yZSB0ZXN0cyB0byBpbmNyZWFzZSBjb2RlIGNvdmVyYWdlLgotY2xhc3MgQXZyY3BEZXZpY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIC8vIE5PVEU6IFdlIHVzZSBhIHdyYXBwZXIgbGFtYmRhIGZvciB0aGUgTW9ja0Z1bmN0aW9uIGluIG9yZGVyIHRvCi0gICAgLy8gYWRkIGEgY29uc3QgcXVhbGlmaWVyIHRvIHRoZSByZXNwb25zZS4gT3RoZXJ3aXNlIHRoZSBNb2NrRnVuY3Rpb24KLSAgICAvLyB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIGNhbGxiYWNrIHR5cGUgYW5kIGEgY29tcGlsZXIgZXJyb3Igb2NjdXJzLgotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCwgYm9vbCwgQXZyY3BSZXNwb25zZSk+IGNiID0gYmFzZTo6QmluZCgKLSAgICAgICAgW10oTW9ja0Z1bmN0aW9uPHZvaWQodWludDhfdCwgYm9vbCwgY29uc3QgQXZyY3BSZXNwb25zZSYpPiogYSwKLSAgICAgICAgICAgdWludDhfdCBiLCBib29sIGMsIEF2cmNwUmVzcG9uc2UgZCkgeyBhLT5DYWxsKGIsIGMsIGQpOyB9LAotICAgICAgICAmcmVzcG9uc2VfY2IpOwotCi0gICAgLy8gVE9ETyAoYXBhbmlja2UpOiBUZXN0IHNldHRpbmcgYXZyYzEzIHRvIGZhbHNlIG9uY2Ugd2UgaGF2ZSBmdWxsCi0gICAgLy8gZnVuY3Rpb25hbGl0eS4KLSAgICB0ZXN0X2RldmljZSA9IG5ldyBEZXZpY2UoUmF3QWRkcmVzczo6a0FueSwgdHJ1ZSwgY2IsIDB4RkZGRiwgMHhGRkZGKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIHRlc3RfZGV2aWNlOwotICAgIE1vY2s6OlZlcmlmeUFuZENsZWFyKCZyZXNwb25zZV9jYik7Ci0gIH0KLQotICB2b2lkIFNlbmRNZXNzYWdlKHVpbnQ4X3QgbGFiZWwsIHN0ZDo6c2hhcmVkX3B0cjxQYWNrZXQ+IG1lc3NhZ2UpIHsKLSAgICB0ZXN0X2RldmljZS0+TWVzc2FnZVJlY2VpdmVkKGxhYmVsLCBtZXNzYWdlKTsKLSAgfQotCi0gIHZvaWQgU2VuZEJyb3dzZU1lc3NhZ2UodWludDhfdCBsYWJlbCwgc3RkOjpzaGFyZWRfcHRyPEJyb3dzZVBhY2tldD4gbWVzc2FnZSkgewotICAgIHRlc3RfZGV2aWNlLT5Ccm93c2VNZXNzYWdlUmVjZWl2ZWQobGFiZWwsIG1lc3NhZ2UpOwotICB9Ci0KLSAgdm9pZCBTZXRCaXBDbGllbnRTdGF0dXMoYm9vbCBjb25uZWN0ZWQpIHsKLSAgICAgIHRlc3RfZGV2aWNlLT5TZXRCaXBDbGllbnRTdGF0dXMoY29ubmVjdGVkKTsKLSAgfQotCi0gIHZvaWQgRmlsdGVyQ292ZXJBcnQoU29uZ0luZm8mIHMpIHsKLSAgICBmb3IgKGF1dG8gaXQgPSBzLmF0dHJpYnV0ZXMuYmVnaW4oKTsgaXQgIT0gcy5hdHRyaWJ1dGVzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoaXQtPmF0dHJpYnV0ZSgpID09IEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQpIHsKLSAgICAgICAgcy5hdHRyaWJ1dGVzLmVyYXNlKGl0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgTW9ja0Z1bmN0aW9uPHZvaWQodWludDhfdCwgYm9vbCwgY29uc3QgQXZyY3BSZXNwb25zZSYpPiByZXNwb25zZV9jYjsKLSAgRGV2aWNlKiB0ZXN0X2RldmljZTsKLX07Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGFkZHJlc3NUZXN0KSB7Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCwgYm9vbCwgQXZyY3BSZXNwb25zZSk+IGNiID0KLSAgICAgIGJhc2U6OkJpbmQoW10oTW9ja0Z1bmN0aW9uPHZvaWQodWludDhfdCwgYm9vbCwgY29uc3QgQXZyY3BSZXNwb25zZSYpPiogYSwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiLCBib29sIGMsIEF2cmNwUmVzcG9uc2UgZCkgeyBhLT5DYWxsKGIsIGMsIGQpOyB9LAotICAgICAgICAgICAgICAgICAmcmVzcG9uc2VfY2IpOwotCi0gIERldmljZSBkZXZpY2UoUmF3QWRkcmVzczo6a0FueSwgdHJ1ZSwgY2IsIDB4RkZGRiwgMHhGRkZGKTsKLSAgQVNTRVJUX0VRKGRldmljZS5HZXRBZGRyZXNzKCksIFJhd0FkZHJlc3M6OmtBbnkpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBzZXRCaXBDbGllbnRTdGF0dXNUZXN0KSB7Ci0gIEFTU0VSVF9FUSh0ZXN0X2RldmljZS0+SGFzQmlwQ2xpZW50KCksIGZhbHNlKTsKLSAgU2V0QmlwQ2xpZW50U3RhdHVzKHRydWUpOwotICBBU1NFUlRfRVEodGVzdF9kZXZpY2UtPkhhc0JpcENsaWVudCgpLCB0cnVlKTsKLSAgU2V0QmlwQ2xpZW50U3RhdHVzKGZhbHNlKTsKLSAgQVNTRVJUX0VRKHRlc3RfZGV2aWNlLT5IYXNCaXBDbGllbnQoKSwgZmFsc2UpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCB0cmFja0NoYW5nZWRUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgU29uZ0luZm8gaW5mbyA9IHsidGVzdF9pZCIsCi0gICAgICAgICAgICAgICAgICAgey8vIFRoZSBhdHRyaWJ1dGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgIlRlc3QgQXJ0aXN0IiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUywgIjIiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQsICIwMDAwMDAxIil9fTsKLSAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IGxpc3QgPSB7aW5mb307Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXROb3dQbGF5aW5nTGlzdChfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZUNiPDA+KCJ0ZXN0X2lkIiwgbGlzdCkpOwotCi0gIC8vIFRlc3QgdGhlIGludGVyaW0gcmVzcG9uc2UgZm9yIHRyYWNrIGNoYW5nZWQKLSAgYXV0byBpbnRlcmltX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlVHJhY2tDaGFuZ2VkQnVpbGRlcih0cnVlLCAweDAxKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShpbnRlcmltX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gcmVxdWVzdCA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihFdmVudDo6VFJBQ0tfQ0hBTkdFRCwgMCk7Ci0gIGF1dG8gcGt0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKCk7Ci0gIHJlcXVlc3QtPlNlcmlhbGl6ZShwa3QpOwotICBTZW5kTWVzc2FnZSgxLCBwa3QpOwotCi0gIC8vIFRlc3QgdGhlIGNoYW5nZWQgcmVzcG9uc2UgZm9yIHRyYWNrIGNoYW5nZWQKLSAgYXV0byBjaGFuZ2VkX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlVHJhY2tDaGFuZ2VkQnVpbGRlcihmYWxzZSwgMHgwMSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICB0ZXN0X2RldmljZS0+SGFuZGxlVHJhY2tVcGRhdGUoKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgcGxheVN0YXR1c1Rlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBQbGF5U3RhdHVzIHN0YXR1czEgPSB7MHgxMjM0LCAweDU2NzgsIFBsYXlTdGF0ZTo6UExBWUlOR307Ci0gIFBsYXlTdGF0dXMgc3RhdHVzMiA9IHsweDEyMzQsIDB4NTY3OCwgUGxheVN0YXRlOjpTVE9QUEVEfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFBsYXlTdGF0dXMoXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPihzdGF0dXMxKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPihzdGF0dXMyKSk7Ci0KLSAgLy8gUHJldGVuZCB0aGUgZGV2aWNlIGlzIGFjdGl2ZQotICBFWFBFQ1RfQ0FMTChhMmRwX2ludGVyZmFjZSwgYWN0aXZlX3BlZXIoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odGVzdF9kZXZpY2UtPkdldEFkZHJlc3MoKSkpOwotCi0gIC8vIFRlc3QgdGhlIGludGVyaW0gcmVzcG9uc2UgZm9yIHBsYXkgc3RhdHVzIGNoYW5nZWQKLSAgYXV0byBpbnRlcmltX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWJhY2tTdGF0dXNCdWlsZGVyKAotICAgICAgICAgIHRydWUsIFBsYXlTdGF0ZTo6UExBWUlORyk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoaW50ZXJpbV9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBhdXRvIHJlcXVlc3QgPSBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIEV2ZW50OjpQTEFZQkFDS19TVEFUVVNfQ0hBTkdFRCwgMCk7Ci0gIGF1dG8gcGt0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKCk7Ci0gIHJlcXVlc3QtPlNlcmlhbGl6ZShwa3QpOwotICBTZW5kTWVzc2FnZSgxLCBwa3QpOwotCi0gIC8vIFRlc3QgdGhlIGNoYW5nZWQgcmVzcG9uc2UgZm9yIHBsYXkgc3RhdHVzIGNoYW5nZWQKLSAgYXV0byBjaGFuZ2VkX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWJhY2tTdGF0dXNCdWlsZGVyKAotICAgICAgICAgIGZhbHNlLCBQbGF5U3RhdGU6OlNUT1BQRUQpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGNoYW5nZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIHRlc3RfZGV2aWNlLT5IYW5kbGVQbGF5U3RhdHVzVXBkYXRlKCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIHBsYXlQb3NpdGlvblRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICAvLyBUT0RPIChhcGFuaWNrZSk6IEFkZCBhbiB1bmRlcmx5aW5nIG1lc3NhZ2UgbG9vcCBzbyB3ZSBjYW4gdGVzdCB0aGUgcGxheWluZwotICAvLyBzdGF0ZS4KLSAgUGxheVN0YXR1cyBzdGF0dXMxID0gezB4MTIzNCwgMHg1Njc4LCBQbGF5U3RhdGU6OlBBVVNFRH07Ci0gIFBsYXlTdGF0dXMgc3RhdHVzMiA9IHsweDU2NzgsIDB4OUFCQywgUGxheVN0YXRlOjpTVE9QUEVEfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFBsYXlTdGF0dXMoXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPihzdGF0dXMxKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPihzdGF0dXMyKSk7Ci0KLSAgLy8gUHJldGVuZCB0aGUgZGV2aWNlIGlzIGFjdGl2ZQotICBFWFBFQ1RfQ0FMTChhMmRwX2ludGVyZmFjZSwgYWN0aXZlX3BlZXIoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odGVzdF9kZXZpY2UtPkdldEFkZHJlc3MoKSkpOwotCi0gIC8vIFRlc3QgdGhlIGludGVyaW0gcmVzcG9uc2UgZm9yIHBsYXkgcG9zaXRpb24gY2hhbmdlZAotICBhdXRvIGludGVyaW1fcmVzcG9uc2UgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5YmFja1Bvc2l0aW9uQnVpbGRlcih0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzQpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGludGVyaW1fcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXF1ZXN0ID0gUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBFdmVudDo6UExBWUJBQ0tfUE9TX0NIQU5HRUQsIDApOwotICBhdXRvIHBrdCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZSgpOwotICByZXF1ZXN0LT5TZXJpYWxpemUocGt0KTsKLSAgU2VuZE1lc3NhZ2UoMSwgcGt0KTsKLQotICAvLyBUZXN0IHRoZSBjaGFuZ2VkIHJlc3BvbnNlIGZvciBwbGF5IHBvc2l0aW9uIGNoYW5nZWQKLSAgYXV0byBjaGFuZ2VkX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWJhY2tQb3NpdGlvbkJ1aWxkZXIoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTY3OCk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgdGVzdF9kZXZpY2UtPkhhbmRsZVBsYXlQb3NVcGRhdGUoKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgdHJhY2tDaGFuZ2VkQmVmb3JlSW50ZXJpbVRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICAvLyBQcmV0ZW5kIHRoZSBkZXZpY2UgaXMgYWN0aXZlCi0gIEVYUEVDVF9DQUxMKGEyZHBfaW50ZXJmYWNlLCBhY3RpdmVfcGVlcigpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0ZXN0X2RldmljZS0+R2V0QWRkcmVzcygpKSk7Ci0KLSAgU29uZ0luZm8gaW5mbyA9IHsidGVzdF9pZCIsCi0gICAgICAgICAgICAgICAgICAgey8vIFRoZSBhdHRyaWJ1dGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgIlRlc3QgQXJ0aXN0IiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUywgIjIiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQsICIwMDAwMDAxIil9fTsKLSAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IGxpc3QgPSB7aW5mb307Ci0KLSAgTWVkaWFJbnRlcmZhY2U6Ok5vd1BsYXlpbmdDYWxsYmFjayBpbnRlcmltX2NiOwotICBNZWRpYUludGVyZmFjZTo6Tm93UGxheWluZ0NhbGxiYWNrIGNoYW5nZWRfY2I7Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXROb3dQbGF5aW5nTGlzdChfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmludGVyaW1fY2IpKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmNoYW5nZWRfY2IpKTsKLQotICAvLyBUZXN0IHRoYXQgdGhlIGNoYW5nZWQgcmVzcG9uc2UgZG9lc24ndCBnZXQgc2VudCBiZWZvcmUgdGhlIGludGVyaW0KLSAgOjp0ZXN0aW5nOjpJblNlcXVlbmNlIHM7Ci0gIGF1dG8gaW50ZXJpbV9yZXNwb25zZSA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVRyYWNrQ2hhbmdlZEJ1aWxkZXIodHJ1ZSwgMHgwMSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoaW50ZXJpbV9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgYXV0byBjaGFuZ2VkX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlVHJhY2tDaGFuZ2VkQnVpbGRlcihmYWxzZSwgMHgwMSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICAvLyBSZWdpc3RlciBmb3IgdGhlIHVwZGF0ZSwgc2V0cyBpbnRlcmltX2NiCi0gIGF1dG8gcmVxdWVzdCA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihFdmVudDo6VFJBQ0tfQ0hBTkdFRCwgMCk7Ci0gIGF1dG8gcGt0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKCk7Ci0gIHJlcXVlc3QtPlNlcmlhbGl6ZShwa3QpOwotICBTZW5kTWVzc2FnZSgxLCBwa3QpOwotCi0gIC8vIFRyeSB0byBzZW5kIHRyYWNrIGNoYW5nZWQgdXBkYXRlLCBzaG91bGQgZmFpbCBhbmQgZG8gbm90aGluZwotICB0ZXN0X2RldmljZS0+SGFuZGxlVHJhY2tVcGRhdGUoKTsKLQotICAvLyBTZW5kIHRoZSBpbnRlcmltIHJlc3BvbnNlCi0gIGludGVyaW1fY2IuUnVuKCJ0ZXN0X2lkIiwgbGlzdCk7Ci0KLSAgLy8gVHJ5IHRvIHNlbmQgdHJhY2sgY2hhbmdlZCB1cGRhdGUsIHNob3VsZCBzdWNjZWVkCi0gIHRlc3RfZGV2aWNlLT5IYW5kbGVUcmFja1VwZGF0ZSgpOwotICBjaGFuZ2VkX2NiLlJ1bigidGVzdF9pZCIsIGxpc3QpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBwbGF5U3RhdHVzQ2hhbmdlZEJlZm9yZUludGVyaW1UZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICAvLyBQcmV0ZW5kIHRoZSBkZXZpY2UgaXMgYWN0aXZlCi0gIEVYUEVDVF9DQUxMKGEyZHBfaW50ZXJmYWNlLCBhY3RpdmVfcGVlcigpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0ZXN0X2RldmljZS0+R2V0QWRkcmVzcygpKSk7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIE1lZGlhSW50ZXJmYWNlOjpQbGF5U3RhdHVzQ2FsbGJhY2sgaW50ZXJpbV9jYjsKLSAgTWVkaWFJbnRlcmZhY2U6OlBsYXlTdGF0dXNDYWxsYmFjayBjaGFuZ2VkX2NiOwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0UGxheVN0YXR1cyhfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmludGVyaW1fY2IpKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmNoYW5nZWRfY2IpKTsKLQotICAvLyBUZXN0IHRoYXQgdGhlIGNoYW5nZWQgcmVzcG9uc2UgZG9lc24ndCBnZXQgc2VudCBiZWZvcmUgdGhlIGludGVyaW0KLSAgOjp0ZXN0aW5nOjpJblNlcXVlbmNlIHM7Ci0gIGF1dG8gaW50ZXJpbV9yZXNwb25zZSA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXliYWNrU3RhdHVzQnVpbGRlcigKLSAgICAgICAgICB0cnVlLCBQbGF5U3RhdGU6OlBMQVlJTkcpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGludGVyaW1fcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIGF1dG8gY2hhbmdlZF9yZXNwb25zZSA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZVBsYXliYWNrU3RhdHVzQnVpbGRlcigKLSAgICAgICAgICBmYWxzZSwgUGxheVN0YXRlOjpTVE9QUEVEKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShjaGFuZ2VkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIC8vIFNlbmQgdGhlIHJlZ2lzdHJhdGlvbiBwYWNrZXQKLSAgYXV0byByZXF1ZXN0ID0gUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBFdmVudDo6UExBWUJBQ0tfU1RBVFVTX0NIQU5HRUQsIDApOwotICBhdXRvIHBrdCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZSgpOwotICByZXF1ZXN0LT5TZXJpYWxpemUocGt0KTsKLSAgU2VuZE1lc3NhZ2UoMSwgcGt0KTsKLQotICAvLyBTZW5kIGEgcGxheSBzdGF0dXMgdXBkYXRlLCBzaG91bGQgYmUgaWdub3JlZCBzaW5jZSB0aGUgaW50ZXJpbSByZXNwb25zZQotICAvLyBoYXNuJ3QgYmVlbiBzZW50IHlldC4KLSAgdGVzdF9kZXZpY2UtPkhhbmRsZVBsYXlTdGF0dXNVcGRhdGUoKTsKLQotICAvLyBTZW5kIHRoZSBpbnRlcmltIHJlc3BvbnNlLgotICBQbGF5U3RhdHVzIHN0YXR1czEgPSB7MHgxMjM0LCAweDU2NzgsIFBsYXlTdGF0ZTo6UExBWUlOR307Ci0gIGludGVyaW1fY2IuUnVuKHN0YXR1czEpOwotCi0gIC8vIFNlbmQgdGhlIGNoYW5nZWQgcmVzcG9uc2UsIHNob3VsZCBzdWNjZWVkIHRoaXMgdGltZQotICB0ZXN0X2RldmljZS0+SGFuZGxlUGxheVN0YXR1c1VwZGF0ZSgpOwotICBQbGF5U3RhdHVzIHN0YXR1czIgPSB7MHgxMjM0LCAweDU2NzgsIFBsYXlTdGF0ZTo6U1RPUFBFRH07Ci0gIGNoYW5nZWRfY2IuUnVuKHN0YXR1czIpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBwbGF5UG9zaXRpb25DaGFuZ2VkQmVmb3JlSW50ZXJpbVRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIC8vIFByZXRlbmQgdGhlIGRldmljZSBpcyBhY3RpdmUKLSAgRVhQRUNUX0NBTEwoYTJkcF9pbnRlcmZhY2UsIGFjdGl2ZV9wZWVyKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRlc3RfZGV2aWNlLT5HZXRBZGRyZXNzKCkpKTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgTWVkaWFJbnRlcmZhY2U6OlBsYXlTdGF0dXNDYWxsYmFjayBpbnRlcmltX2NiOwotICBNZWRpYUludGVyZmFjZTo6UGxheVN0YXR1c0NhbGxiYWNrIGNoYW5nZWRfY2I7Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXRQbGF5U3RhdHVzKF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmaW50ZXJpbV9jYikpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmY2hhbmdlZF9jYikpOwotCi0gIC8vIFRlc3QgdGhhdCB0aGUgY2hhbmdlZCByZXNwb25zZSBkb2Vzbid0IGdldCBzZW50IGJlZm9yZSB0aGUgaW50ZXJpbQotICA6OnRlc3Rpbmc6OkluU2VxdWVuY2UgczsKLSAgYXV0byBpbnRlcmltX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWJhY2tQb3NpdGlvbkJ1aWxkZXIodHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0KTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShpbnRlcmltX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotICBhdXRvIGNoYW5nZWRfcmVzcG9uc2UgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VQbGF5YmFja1Bvc2l0aW9uQnVpbGRlcihmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1Njc4KTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShjaGFuZ2VkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIC8vIFNlbmQgdGhlIHJlZ2lzdHJhdGlvbiBwYWNrZXQKLSAgYXV0byByZXF1ZXN0ID0gUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoCi0gICAgICBFdmVudDo6UExBWUJBQ0tfUE9TX0NIQU5HRUQsIDApOwotICBhdXRvIHBrdCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZSgpOwotICByZXF1ZXN0LT5TZXJpYWxpemUocGt0KTsKLSAgU2VuZE1lc3NhZ2UoMSwgcGt0KTsKLQotICAvLyBTZW5kIGEgcGxheSBwb3NpdGlvbiB1cGRhdGUsIHNob3VsZCBiZSBpZ25vcmVkIHNpbmNlIHRoZSBub3RpZmljYXRpb24KLSAgLy8gaXNuJ3QgcmVnaXN0ZXJlZCBzaW5jZSBubyBpbnRlcmltIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQuCi0gIHRlc3RfZGV2aWNlLT5IYW5kbGVQbGF5UG9zVXBkYXRlKCk7Ci0KLSAgLy8gUnVuIHRoZSBpbnRlcmltIGNhbGxiYWNrIGZvciBHZXRQbGF5U3RhdHVzIHdoaWNoIHNob3VsZCBiZSBwb2ludGluZyB0byB0aGUKLSAgLy8gR2V0UGxheVN0YXR1cyBjYWxsIG1hZGUgYnkgdGhlIHVwZGF0ZS4KLSAgUGxheVN0YXR1cyBzdGF0dXMxID0gezB4MTIzNCwgMHg1Njc4LCBQbGF5U3RhdGU6OlBBVVNFRH07Ci0gIGludGVyaW1fY2IuUnVuKHN0YXR1czEpOwotCi0gIC8vIFNlbmQgYSBwbGF5IHBvc2l0aW9uIHVwZGF0ZSwgdGhpcyBvbmUgc2hvdWxkIHN1Y2NlZWQuCi0gIHRlc3RfZGV2aWNlLT5IYW5kbGVQbGF5UG9zVXBkYXRlKCk7Ci0gIFBsYXlTdGF0dXMgc3RhdHVzMiA9IHsweDU2NzgsIDB4OUFCQywgUGxheVN0YXRlOjpTVE9QUEVEfTsKLSAgY2hhbmdlZF9jYi5SdW4oc3RhdHVzMik7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIG5vd1BsYXlpbmdDaGFuZ2VkQmVmb3JlSW50ZXJpbSkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIFNvbmdJbmZvIGluZm8gPSB7InRlc3RfaWQiLAotICAgICAgICAgICAgICAgICAgIHsvLyBUaGUgYXR0cmlidXRlIG1hcAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiVGVzdCBTb25nIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSLCAiMSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6R0VOUkUsICJUZXN0IEdlbnJlIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6UExBWUlOR19USU1FLCAiMTAwMCIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkRFRkFVTFRfQ09WRVJfQVJULCAiMDAwMDAwMSIpfX07Ci0gIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBsaXN0ID0ge2luZm99OwotCi0gIE1lZGlhSW50ZXJmYWNlOjpOb3dQbGF5aW5nQ2FsbGJhY2sgaW50ZXJpbV9jYjsKLSAgTWVkaWFJbnRlcmZhY2U6Ok5vd1BsYXlpbmdDYWxsYmFjayBjaGFuZ2VkX2NiOwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0Tm93UGxheWluZ0xpc3QoXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZpbnRlcmltX2NiKSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDA+KCZjaGFuZ2VkX2NiKSk7Ci0KLSAgLy8gVGVzdCB0aGF0IHRoZSBjaGFuZ2VkIHJlc3BvbnNlIGRvZXNuJ3QgZ2V0IHNlbnQgYmVmb3JlIHRoZSBpbnRlcmltCi0gIDo6dGVzdGluZzo6SW5TZXF1ZW5jZSBzOwotICBhdXRvIGludGVyaW1fcmVzcG9uc2UgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcih0cnVlKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShpbnRlcmltX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotICBhdXRvIGNoYW5nZWRfcmVzcG9uc2UgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcihmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICAvLyBTZW5kIHRoZSByZWdpc3RyYXRpb24gcGFja2V0Ci0gIGF1dG8gcmVxdWVzdCA9IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgRXZlbnQ6Ok5PV19QTEFZSU5HX0NPTlRFTlRfQ0hBTkdFRCwgMCk7Ci0gIGF1dG8gcGt0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKCk7Ci0gIHJlcXVlc3QtPlNlcmlhbGl6ZShwa3QpOwotICBTZW5kTWVzc2FnZSgxLCBwa3QpOwotCi0gIC8vIFNlbmQgbm93IHBsYXlpbmcgY2hhbmdlZCwgc2hvdWxkIGZhaWwgc2luY2UgdGhlIGludGVyaW0gcmVzcG9uc2UgaGFzbid0Ci0gIC8vIGJlZW4gc2VudAotICB0ZXN0X2RldmljZS0+SGFuZGxlTm93UGxheWluZ1VwZGF0ZSgpOwotCi0gIC8vIFNlbmQgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgaW50ZXJpbSByZXNwb25zZQotICBpbnRlcmltX2NiLlJ1bigidGVzdF9pZCIsIGxpc3QpOwotCi0gIC8vIFNlbmQgbm93IHBsYXlpbmcgY2hhbmdlZCwgc2hvdWxkIHN1Y2NlZWQKLSAgdGVzdF9kZXZpY2UtPkhhbmRsZU5vd1BsYXlpbmdVcGRhdGUoKTsKLSAgY2hhbmdlZF9jYi5SdW4oInRlc3RfaWQiLCBsaXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgYWRkcmVzc1BsYXllckNoYW5nZWRCZWZvcmVJbnRlcmltKSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgTWVkaWFJbnRlcmZhY2U6Ok1lZGlhTGlzdENhbGxiYWNrIGludGVyaW1fY2I7Ci0gIE1lZGlhSW50ZXJmYWNlOjpNZWRpYUxpc3RDYWxsYmFjayBjaGFuZ2VkX2NiOwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0TWVkaWFQbGF5ZXJMaXN0KF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmaW50ZXJpbV9jYikpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmY2hhbmdlZF9jYikpOwotCi0gIC8vIFRlc3QgdGhhdCB0aGUgY2hhbmdlZCByZXNwb25zZSBkb2Vzbid0IGdldCBzZW50IGJlZm9yZSB0aGUgaW50ZXJpbQotICA6OnRlc3Rpbmc6OkluU2VxdWVuY2UgczsKLSAgYXV0byBpbnRlcmltX3Jlc3BvbnNlID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2VCdWlsZGVyOjpNYWtlQWRkcmVzc2VkUGxheWVyQnVpbGRlcih0cnVlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGludGVyaW1fcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIGF1dG8gY2hhbmdlZF9yZXNwb25zZSA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlQnVpbGRlcjo6TWFrZUFkZHJlc3NlZFBsYXllckJ1aWxkZXIoZmFsc2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgLy8gVE9ETyAoYXBhbmlja2UpOiBSZW1vdmUgdGhpcyBleHBlY3RhdGlvbiBvbmNlIGIvMTEwOTU3ODAyIGlzIGZpeGVkIGFuZAotICAvLyB3ZSBkb24ndCB0cnkgdG8gcmVqZWN0IG5vdGlmaWNhdGlvbnMgdGhhdCBhcmVuJ3QgcmVnaXN0ZXJlZC4KLSAgYXV0byByZWplY3RlZF9yZXNwb25zZSA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgQ29tbWFuZFBkdTo6UkVHSVNURVJfTk9USUZJQ0FUSU9OLCBTdGF0dXM6OkFERFJFU1NFRF9QTEFZRVJfQ0hBTkdFRCk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKF8sIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocmVqZWN0ZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoNCk7Ci0KLSAgLy8gU2VuZCB0aGUgcmVnaXN0cmF0aW9uIHBhY2tldAotICBhdXRvIHJlcXVlc3QgPSBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIEV2ZW50OjpBRERSRVNTRURfUExBWUVSX0NIQU5HRUQsIDApOwotICBhdXRvIHBrdCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZSgpOwotICByZXF1ZXN0LT5TZXJpYWxpemUocGt0KTsKLSAgU2VuZE1lc3NhZ2UoMSwgcGt0KTsKLQotICAvLyBTZW5kIGFkZHJlc3NlZCBwbGF5ZXIgdXBkYXRlLCBzaG91bGQgZmFpbCBzaW5jZSB0aGUgaW50ZXJpbSByZXNwb25zZQotICAvLyBoYXNuJ3QgYmVlbiBzZW50Ci0gIHRlc3RfZGV2aWNlLT5IYW5kbGVBZGRyZXNzZWRQbGF5ZXJVcGRhdGUoKTsKLQotICAvLyBTZW5kIHRoZSBkYXRhIG5lZWRlZCBmb3IgdGhlIGludGVyaW0gcmVzcG9uc2UKLSAgTWVkaWFQbGF5ZXJJbmZvIGluZm8gPSB7MCwgIlRlc3QgUGxheWVyIiwgdHJ1ZX07Ci0gIHN0ZDo6dmVjdG9yPE1lZGlhUGxheWVySW5mbz4gbGlzdCA9IHtpbmZvfTsKLSAgaW50ZXJpbV9jYi5SdW4oMCwgbGlzdCk7Ci0KLSAgLy8gU2VuZCBhZGRyZXNzZWQgcGxheWVyIHVwZGF0ZSwgc2hvdWxkIHN1Y2NlZWQKLSAgdGVzdF9kZXZpY2UtPkhhbmRsZUFkZHJlc3NlZFBsYXllclVwZGF0ZSgpOwotICBjaGFuZ2VkX2NiLlJ1bigwLCBsaXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgbm93UGxheWluZ1Rlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBTb25nSW5mbyBpbmZvID0geyJ0ZXN0X2lkIiwKLSAgICAgICAgICAgICAgICAgICB7Ly8gVGhlIGF0dHJpYnV0ZSBtYXAKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFSVElTVF9OQU1FLCAiVGVzdCBBcnRpc3QiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBTEJVTV9OQU1FLCAiVGVzdCBBbGJ1bSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTLCAiMiIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkdFTlJFLCAiVGVzdCBHZW5yZSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpERUZBVUxUX0NPVkVSX0FSVCwgIjAwMDAwMDEiKX19OwotICBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gbGlzdCA9IHtpbmZvfTsKLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXROb3dQbGF5aW5nTGlzdChfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZUNiPDA+KCJ0ZXN0X2lkIiwgbGlzdCkpOwotCi0gIC8vIFRlc3QgdGhlIGludGVyaW0gcmVzcG9uc2UgZm9yIG5vdyBwbGF5aW5nIGxpc3QgY2hhbmdlZAotICBhdXRvIGludGVyaW1fcmVzcG9uc2UgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcih0cnVlKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShpbnRlcmltX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gcmVxdWVzdCA9IFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgRXZlbnQ6Ok5PV19QTEFZSU5HX0NPTlRFTlRfQ0hBTkdFRCwgMCk7Ci0gIGF1dG8gcGt0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKCk7Ci0gIHJlcXVlc3QtPlNlcmlhbGl6ZShwa3QpOwotICBTZW5kTWVzc2FnZSgxLCBwa3QpOwotCi0gIC8vIFRlc3QgdGhlIGNoYW5nZWQgcmVzcG9uc2UgZm9yIG5vdyBwbGF5aW5nIGxpc3QgY2hhbmdlZAotICBhdXRvIGNoYW5nZWRfcmVzcG9uc2UgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcihmYWxzZSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgdGVzdF9kZXZpY2UtPkhhbmRsZU5vd1BsYXlpbmdVcGRhdGUoKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0UGxheVN0YXR1c1Rlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBQbGF5U3RhdHVzIHN0YXR1cyA9IHsweDEyMzQsIDB4NTY3OCwgUGxheVN0YXRlOjpQTEFZSU5HfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFBsYXlTdGF0dXMoXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPihzdGF0dXMpKTsKLQotICAvLyBQcmV0ZW5kIHRoZSBkZXZpY2UgaXMgYWN0aXZlCi0gIEVYUEVDVF9DQUxMKGEyZHBfaW50ZXJmYWNlLCBhY3RpdmVfcGVlcigpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0ZXN0X2RldmljZS0+R2V0QWRkcmVzcygpKSk7Ci0KLSAgYXV0byBleHBlY3RlZF9yZXNwb25zZSA9IEdldFBsYXlTdGF0dXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgMHg1Njc4LCAweDEyMzQsIFBsYXlTdGF0ZTo6UExBWUlORyk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoZXhwZWN0ZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXF1ZXN0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKGdldF9wbGF5X3N0YXR1c19yZXF1ZXN0KTsKLSAgU2VuZE1lc3NhZ2UoMSwgcmVxdWVzdCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGdldEVsZW1lbnRBdHRyaWJ1dGVzVGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIFNvbmdJbmZvIGluZm8gPSB7InRlc3RfaWQiLAotICAgICAgICAgICAgICAgICAgIHsvLyBUaGUgYXR0cmlidXRlIG1hcAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiVGVzdCBTb25nIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSLCAiMSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6R0VOUkUsICJUZXN0IEdlbnJlIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6UExBWUlOR19USU1FLCAiMTAwMCIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkRFRkFVTFRfQ09WRVJfQVJULCAiMDAwMDAwMSIpfX07Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXRTb25nSW5mbyhfKSkuV2lsbFJlcGVhdGVkbHkoSW52b2tlQ2I8MD4oaW5mbykpOwotCi0gIGF1dG8gY29tcGFyZV90b19wYXJ0aWFsID0KLSAgICAgIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigweEZGRkYpOwotICBjb21wYXJlX3RvX3BhcnRpYWwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMiwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShjb21wYXJlX3RvX3BhcnRpYWwpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIFNlbmRNZXNzYWdlKDIsIFRlc3RBdnJjcFBhY2tldDo6TWFrZShnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfcGFydGlhbCkpOwotCi0gIGF1dG8gY29tcGFyZV90b19mdWxsID0KLSAgICAgIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigweEZGRkYpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFSVElTVF9OQU1FLCAiVGVzdCBBcnRpc3QiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTLCAiMiIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6R0VOUkUsICJUZXN0IEdlbnJlIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIik7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDMsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY29tcGFyZV90b19mdWxsKSkpKQotICAgICAgLlRpbWVzKDEpOwotICBTZW5kTWVzc2FnZSgzLCBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwpKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0RWxlbWVudEF0dHJpYnV0ZXNXaXRoQ292ZXJBcnRUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgU29uZ0luZm8gaW5mbyA9IHsidGVzdF9pZCIsCi0gICAgICAgICAgICAgICAgICAgey8vIFRoZSBhdHRyaWJ1dGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgIlRlc3QgQXJ0aXN0IiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUywgIjIiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQsICIwMDAwMDAxIil9fTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFNvbmdJbmZvKF8pKS5XaWxsUmVwZWF0ZWRseShJbnZva2VDYjwwPihpbmZvKSk7Ci0gIFNldEJpcENsaWVudFN0YXR1cyhmYWxzZSk7Ci0KLSAgYXV0byBjb21wYXJlX3RvX25vX2FydCA9Ci0gICAgICBHZXRFbGVtZW50QXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoMHhGRkZGKTsKLSAgY29tcGFyZV90b19ub19hcnQtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKTsKLSAgY29tcGFyZV90b19ub19hcnQtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBjb21wYXJlX3RvX25vX2FydC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBTEJVTV9OQU1FLCAiVGVzdCBBbGJ1bSIpOwotICBjb21wYXJlX3RvX25vX2FydC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIik7Ci0gIGNvbXBhcmVfdG9fbm9fYXJ0LT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIik7Ci0gIGNvbXBhcmVfdG9fbm9fYXJ0LT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkdFTlJFLCAiVGVzdCBHZW5yZSIpOwotICBjb21wYXJlX3RvX25vX2FydC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIik7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDMsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY29tcGFyZV90b19ub19hcnQpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIFNlbmRNZXNzYWdlKDMsCi0gICAgICAgIFRlc3RBdnJjcFBhY2tldDo6TWFrZShnZXRfZWxlbWVudF9hdHRyaWJ1dGVzX3JlcXVlc3RfZnVsbF9jb3Zlcl9hcnQpKTsKLQotICBTZXRCaXBDbGllbnRTdGF0dXModHJ1ZSk7Ci0KLSAgYXV0byBjb21wYXJlX3RvX2Z1bGwgPQotICAgICAgR2V0RWxlbWVudEF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4RkZGRik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkRFRkFVTFRfQ09WRVJfQVJULCAiMDAwMDAwMSIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgzLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGNvbXBhcmVfdG9fZnVsbCkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgU2VuZE1lc3NhZ2UoMywKLSAgICAgICAgVGVzdEF2cmNwUGFja2V0OjpNYWtlKGdldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxdWVzdF9mdWxsX2NvdmVyX2FydCkpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBnZXRFbGVtZW50QXR0cmlidXRlc010dVRlc3QpIHsKLSAgYXV0byB0cnVuY2F0ZWRfcGFja2V0ID0KLSAgICAgIEdldEVsZW1lbnRBdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigweEZGRkYpOwotICB0cnVuY2F0ZWRfcGFja2V0LT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiMTIzNCIpOwotCi0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QsIGJvb2wsIEF2cmNwUmVzcG9uc2UpPiBjYiA9Ci0gICAgICBiYXNlOjpCaW5kKFtdKE1vY2tGdW5jdGlvbjx2b2lkKHVpbnQ4X3QsIGJvb2wsIGNvbnN0IEF2cmNwUmVzcG9uc2UmKT4qIGEsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYiwgYm9vbCBjLCBBdnJjcFJlc3BvbnNlIGQpIHsgYS0+Q2FsbChiLCBjLCBkKTsgfSwKLSAgICAgICAgICAgICAgICAgJnJlc3BvbnNlX2NiKTsKLSAgRGV2aWNlIGRldmljZShSYXdBZGRyZXNzOjprQW55LCB0cnVlLCBjYiwgdHJ1bmNhdGVkX3BhY2tldC0+c2l6ZSgpLCAweEZGRkYpOwotCi0gIGRldmljZS5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBTb25nSW5mbyBpbmZvID0geyJ0ZXN0X2lkIiwKLSAgICAgICAgICAgICAgICAgICB7QXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIjEyMzR0cnVuY2F0ZWQiKX19OwotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFNvbmdJbmZvKF8pKS5XaWxsUmVwZWF0ZWRseShJbnZva2VDYjwwPihpbmZvKSk7Ci0KLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZSh0cnVuY2F0ZWRfcGFja2V0KSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGRldmljZS5NZXNzYWdlUmVjZWl2ZWQoCi0gICAgICAxLCBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoZ2V0X2VsZW1lbnRfYXR0cmlidXRlc19yZXF1ZXN0X2Z1bGwpKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0VG90YWxOdW1iZXJPZkl0ZW1zTWVkaWFQbGF5ZXJzVGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIHN0ZDo6dmVjdG9yPE1lZGlhUGxheWVySW5mbz4gcGxheWVyX2xpc3QgPSB7Ci0gICAgICB7MCwgInBsYXllcjEiLCB0cnVlfSwgezEsICJwbGF5ZXIyIiwgdHJ1ZX0sIHsyLCAicGxheWVyMyIsIHRydWV9LAotICB9OwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0TWVkaWFQbGF5ZXJMaXN0KF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlQ2I8MD4oMCwgcGxheWVyX2xpc3QpKTsKLQotICBhdXRvIGV4cGVjdGVkX3Jlc3BvbnNlID0gR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDAsIHBsYXllcl9saXN0LnNpemUoKSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIHRydWUsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShleHBlY3RlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3RvdGFsX251bWJlcl9vZl9pdGVtc19yZXF1ZXN0X21lZGlhX3BsYXllcnMpKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0VG90YWxOdW1iZXJPZkl0ZW1zVkZTVGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIHN0ZDo6dmVjdG9yPExpc3RJdGVtPiB2ZnNfbGlzdCA9IHsKLSAgICAgIHtMaXN0SXRlbTo6Rk9MREVSLCB7ImlkMSIsIHRydWUsICJmb2xkZXIxIn0sIFNvbmdJbmZvKCl9LAotICAgICAge0xpc3RJdGVtOjpGT0xERVIsIHsiaWQyIiwgdHJ1ZSwgImZvbGRlcjIifSwgU29uZ0luZm8oKX0sCi0gIH07Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXRGb2xkZXJJdGVtcyhfLCAiIiwgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwyPih2ZnNfbGlzdCkpOwotCi0gIGF1dG8gZXhwZWN0ZWRfcmVzcG9uc2UgPSBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMCwgdmZzX2xpc3Quc2l6ZSgpKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGV4cGVjdGVkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIFNlbmRCcm93c2VNZXNzYWdlKAotICAgICAgMSwgVGVzdEJyb3dzZVBhY2tldDo6TWFrZShnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3RfdmZzKSk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGdldFRvdGFsTnVtYmVyT2ZJdGVtc05vd1BsYXlpbmdUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IG5vd19wbGF5aW5nX2xpc3QgPSB7Ci0gICAgICB7InRlc3RfaWQxIiwge319LCB7InRlc3RfaWQyIiwge319LCB7InRlc3RfaWQzIiwge319LAotICAgICAgeyJ0ZXN0X2lkNCIsIHt9fSwgeyJ0ZXN0X2lkNSIsIHt9fSwKLSAgfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldE5vd1BsYXlpbmdMaXN0KF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZUNiPDA+KCJ0ZXN0X2lkMSIsIG5vd19wbGF5aW5nX2xpc3QpKTsKLQotICBhdXRvIGV4cGVjdGVkX3Jlc3BvbnNlID0gR2V0VG90YWxOdW1iZXJPZkl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDAsIG5vd19wbGF5aW5nX2xpc3Quc2l6ZSgpKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGV4cGVjdGVkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIFNlbmRCcm93c2VNZXNzYWdlKAotICAgICAgMSwgVGVzdEJyb3dzZVBhY2tldDo6TWFrZShnZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3Rfbm93X3BsYXlpbmcpKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0TWVkaWFQbGF5ZXJMaXN0VGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIE1lZGlhUGxheWVySW5mbyBpbmZvID0gezAsICJUZXN0IFBsYXllciIsIHRydWV9OwotICBzdGQ6OnZlY3RvcjxNZWRpYVBsYXllckluZm8+IGxpc3QgPSB7aW5mb307Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXRNZWRpYVBsYXllckxpc3QoXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPigwLCBsaXN0KSk7Ci0KLSAgYXV0byBleHBlY3RlZF9yZXNwb25zZSA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWVyTGlzdEJ1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIGV4cGVjdGVkX3Jlc3BvbnNlLT5BZGRNZWRpYVBsYXllcihNZWRpYVBsYXllckl0ZW0oMCwgIlRlc3QgUGxheWVyIiwgdHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoZXhwZWN0ZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXF1ZXN0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZShnZXRfZm9sZGVyX2l0ZW1zX3JlcXVlc3QpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCByZXF1ZXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0Tm93UGxheWluZ0xpc3RUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0gIFNldEJpcENsaWVudFN0YXR1cyhmYWxzZSk7Ci0KLSAgU29uZ0luZm8gaW5mbyA9IHsidGVzdF9pZCIsCi0gICAgICAgICAgICAgICAgICAgey8vIFRoZSBhdHRyaWJ1dGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgIlRlc3QgQXJ0aXN0IiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUywgIjIiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQsICIwMDAwMDAxIil9fTsKLSAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IGxpc3QgPSB7aW5mb307Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXROb3dQbGF5aW5nTGlzdChfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShJbnZva2VDYjwwPigidGVzdF9pZCIsIGxpc3QpKTsKLQotICBGaWx0ZXJDb3ZlckFydChpbmZvKTsKLSAgYXV0byBleHBlY3RlZF9yZXNwb25zZSA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlTm93UGxheWluZ0J1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIGV4cGVjdGVkX3Jlc3BvbnNlLT5BZGRTb25nKE1lZGlhRWxlbWVudEl0ZW0oMSwgIlRlc3QgU29uZyIsIGluZm8uYXR0cmlidXRlcykpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoZXhwZWN0ZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIGF1dG8gcmVxdWVzdCA9IFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2UoZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X25vd19wbGF5aW5nKTsKLSAgU2VuZEJyb3dzZU1lc3NhZ2UoMSwgcmVxdWVzdCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGdldE5vd1BsYXlpbmdMaXN0V2l0aENvdmVyQXJ0VGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotICBTZXRCaXBDbGllbnRTdGF0dXModHJ1ZSk7Ci0KLSAgU29uZ0luZm8gaW5mbyA9IHsidGVzdF9pZCIsCi0gICAgICAgICAgICAgICAgICAgey8vIFRoZSBhdHRyaWJ1dGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICJUZXN0IFNvbmciKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgIlRlc3QgQXJ0aXN0IiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUUkFDS19OVU1CRVIsICIxIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUywgIjIiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpQTEFZSU5HX1RJTUUsICIxMDAwIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6REVGQVVMVF9DT1ZFUl9BUlQsICIwMDAwMDAxIil9fTsKLSAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IGxpc3QgPSB7aW5mb307Ci0KLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXROb3dQbGF5aW5nTGlzdChfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShJbnZva2VDYjwwPigidGVzdF9pZCIsIGxpc3QpKTsKLQotICBhdXRvIGV4cGVjdGVkX3Jlc3BvbnNlID0gR2V0Rm9sZGVySXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VOb3dQbGF5aW5nQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgZXhwZWN0ZWRfcmVzcG9uc2UtPkFkZFNvbmcoTWVkaWFFbGVtZW50SXRlbSgxLCAiVGVzdCBTb25nIiwgaW5mby5hdHRyaWJ1dGVzKSk7Ci0KLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGV4cGVjdGVkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotICBhdXRvIHJlcXVlc3QgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF9ub3dfcGxheWluZyk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDEsIHJlcXVlc3QpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBnZXRWRlNGb2xkZXJUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgRm9sZGVySW5mbyBpbmZvID0geyJ0ZXN0X2lkIiwgdHJ1ZSwgIlRlc3QgRm9sZGVyIn07Ci0gIExpc3RJdGVtIGl0ZW0gPSB7TGlzdEl0ZW06OkZPTERFUiwgaW5mbywgU29uZ0luZm8oKX07Ci0gIHN0ZDo6dmVjdG9yPExpc3RJdGVtPiBsaXN0ID0ge2l0ZW19OwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0Rm9sZGVySXRlbXMoXywgIiIsIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlQ2I8Mj4obGlzdCkpOwotCi0gIGF1dG8gZXhwZWN0ZWRfcmVzcG9uc2UgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVZGU0J1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIGV4cGVjdGVkX3Jlc3BvbnNlLT5BZGRGb2xkZXIoRm9sZGVySXRlbSgxLCAwLCB0cnVlLCAiVGVzdCBGb2xkZXIiKSk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIHRydWUsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShleHBlY3RlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBhdXRvIHJlcXVlc3QgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKGdldF9mb2xkZXJfaXRlbXNfcmVxdWVzdF92ZnMpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCByZXF1ZXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0Rm9sZGVySXRlbXNNdHVUZXN0KSB7Ci0gIGF1dG8gdHJ1bmNhdGVkX3BhY2tldCA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlVkZTQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgdHJ1bmNhdGVkX3BhY2tldC0+QWRkRm9sZGVyKEZvbGRlckl0ZW0oMSwgMCwgdHJ1ZSwgIlRlc3QgRm9sZGVyMCIpKTsKLSAgdHJ1bmNhdGVkX3BhY2tldC0+QWRkRm9sZGVyKEZvbGRlckl0ZW0oMiwgMCwgdHJ1ZSwgIlRlc3QgRm9sZGVyMSIpKTsKLQotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0gIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCwgYm9vbCwgQXZyY3BSZXNwb25zZSk+IGNiID0KLSAgICAgIGJhc2U6OkJpbmQoW10oTW9ja0Z1bmN0aW9uPHZvaWQodWludDhfdCwgYm9vbCwgY29uc3QgQXZyY3BSZXNwb25zZSYpPiogYSwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiLCBib29sIGMsIEF2cmNwUmVzcG9uc2UgZCkgeyBhLT5DYWxsKGIsIGMsIGQpOyB9LAotICAgICAgICAgICAgICAgICAmcmVzcG9uc2VfY2IpOwotCi0gIERldmljZSBkZXZpY2UoUmF3QWRkcmVzczo6a0FueSwgdHJ1ZSwgY2IsIDB4RkZGRiwKLSAgICAgICAgICAgICAgICB0cnVuY2F0ZWRfcGFja2V0LT5zaXplKCkgKyBGb2xkZXJJdGVtOjprSGVhZGVyU2l6ZSgpICsgNSk7Ci0gIGRldmljZS5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBGb2xkZXJJbmZvIGluZm8wID0geyJ0ZXN0X2lkMCIsIHRydWUsICJUZXN0IEZvbGRlcjAifTsKLSAgRm9sZGVySW5mbyBpbmZvMSA9IHsidGVzdF9pZDEiLCB0cnVlLCAiVGVzdCBGb2xkZXIxIn07Ci0gIEZvbGRlckluZm8gaW5mbzIgPSB7InRlc3RfaWQyIiwgdHJ1ZSwgIlRydW5jYXRlZCBmb2xkZXIifTsKLSAgLy8gVXNlZCB0byBlbnN1cmUgdGhhdCBhZGRpbmcgYW4gaXRlbSB0aGF0IHdvdWxkIGZpdCBpbiB0aGUgTVRVIGZhaWxzIGlmCi0gIC8vIGFkZGluZyBhIGxhcmdlIGl0ZW0gZmFpbGVkLgotICBGb2xkZXJJbmZvIHNtYWxsX2luZm8gPSB7InRlc3RfaWQyIiwgdHJ1ZSwgIlNtYWxsIn07Ci0KLSAgTGlzdEl0ZW0gaXRlbTAgPSB7TGlzdEl0ZW06OkZPTERFUiwgaW5mbzAsIFNvbmdJbmZvKCl9OwotICBMaXN0SXRlbSBpdGVtMSA9IHtMaXN0SXRlbTo6Rk9MREVSLCBpbmZvMSwgU29uZ0luZm8oKX07Ci0gIExpc3RJdGVtIGl0ZW0yID0ge0xpc3RJdGVtOjpGT0xERVIsIGluZm8yLCBTb25nSW5mbygpfTsKLSAgTGlzdEl0ZW0gaXRlbTMgPSB7TGlzdEl0ZW06OkZPTERFUiwgc21hbGxfaW5mbywgU29uZ0luZm8oKX07Ci0KLSAgc3RkOjp2ZWN0b3I8TGlzdEl0ZW0+IGxpc3QwID0ge2l0ZW0wLCBpdGVtMSwgaXRlbTIsIGl0ZW0zfTsKLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXRGb2xkZXJJdGVtcyhfLCAiIiwgXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlQ2I8Mj4obGlzdDApKTsKLQotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUodHJ1bmNhdGVkX3BhY2tldCkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgZGV2aWNlLkJyb3dzZU1lc3NhZ2VSZWNlaXZlZCgKLSAgICAgIDEsIFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2UoZ2V0X2ZvbGRlcl9pdGVtc19yZXF1ZXN0X3ZmcykpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBjaGFuZ2VQYXRoVGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIEZvbGRlckluZm8gaW5mbzAgPSB7InRlc3RfaWQwIiwgdHJ1ZSwgIlRlc3QgRm9sZGVyMCJ9OwotICBGb2xkZXJJbmZvIGluZm8xID0geyJ0ZXN0X2lkMSIsIHRydWUsICJUZXN0IEZvbGRlcjEifTsKLSAgTGlzdEl0ZW0gaXRlbTAgPSB7TGlzdEl0ZW06OkZPTERFUiwgaW5mbzAsIFNvbmdJbmZvKCl9OwotICBMaXN0SXRlbSBpdGVtMSA9IHtMaXN0SXRlbTo6Rk9MREVSLCBpbmZvMSwgU29uZ0luZm8oKX07Ci0gIHN0ZDo6dmVjdG9yPExpc3RJdGVtPiBsaXN0MCA9IHtpdGVtMCwgaXRlbTF9OwotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldEZvbGRlckl0ZW1zKF8sICIiLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZUNiPDI+KGxpc3QwKSk7Ci0KLSAgRm9sZGVySW5mbyBpbmZvMiA9IHsidGVzdF9pZDIiLCB0cnVlLCAiVGVzdCBGb2xkZXIyIn07Ci0gIEZvbGRlckluZm8gaW5mbzMgPSB7InRlc3RfaWQzIiwgdHJ1ZSwgIlRlc3QgRm9sZGVyMyJ9OwotICBGb2xkZXJJbmZvIGluZm80ID0geyJ0ZXN0X2lkNCIsIHRydWUsICJUZXN0IEZvbGRlcjQifTsKLSAgTGlzdEl0ZW0gaXRlbTIgPSB7TGlzdEl0ZW06OkZPTERFUiwgaW5mbzIsIFNvbmdJbmZvKCl9OwotICBMaXN0SXRlbSBpdGVtMyA9IHtMaXN0SXRlbTo6Rk9MREVSLCBpbmZvMywgU29uZ0luZm8oKX07Ci0gIExpc3RJdGVtIGl0ZW00ID0ge0xpc3RJdGVtOjpGT0xERVIsIGluZm80LCBTb25nSW5mbygpfTsKLSAgc3RkOjp2ZWN0b3I8TGlzdEl0ZW0+IGxpc3QxID0ge2l0ZW0yLCBpdGVtMywgaXRlbTR9OwotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldEZvbGRlckl0ZW1zKF8sICJ0ZXN0X2lkMSIsIF8pKQotICAgICAgLlRpbWVzKDMpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlQ2I8Mj4obGlzdDEpKTsKLQotICBzdGQ6OnZlY3RvcjxMaXN0SXRlbT4gbGlzdDIgPSB7fTsKLSAgRVhQRUNUX0NBTEwoaW50ZXJmYWNlLCBHZXRGb2xkZXJJdGVtcyhfLCAidGVzdF9pZDMiLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKEludm9rZUNiPDI+KGxpc3QyKSk7Ci0KLSAgLy8gUG9wdWxhdGUgdGhlIFZGUyBJRCBtYXAKLSAgYXV0byBmb2xkZXJfaXRlbXNfcmVzcG9uc2UgPSBHZXRGb2xkZXJJdGVtc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZVZGU0J1aWxkZXIoCi0gICAgICBTdGF0dXM6Ok5PX0VSUk9SLCAweDAwMDAsIDB4RkZGRik7Ci0gIGZvbGRlcl9pdGVtc19yZXNwb25zZS0+QWRkRm9sZGVyKEZvbGRlckl0ZW0oMSwgMCwgdHJ1ZSwgIlRlc3QgRm9sZGVyMCIpKTsKLSAgZm9sZGVyX2l0ZW1zX3Jlc3BvbnNlLT5BZGRGb2xkZXIoRm9sZGVySXRlbSgyLCAwLCB0cnVlLCAiVGVzdCBGb2xkZXIxIikpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoZm9sZGVyX2l0ZW1zX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gZm9sZGVyX3JlcXVlc3RfYnVpbGRlciA9Ci0gICAgICBHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihTY29wZTo6VkZTLCAwLCAzLCB7fSk7Ci0gIGF1dG8gcmVxdWVzdCA9IFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2UoKTsKLSAgZm9sZGVyX3JlcXVlc3RfYnVpbGRlci0+U2VyaWFsaXplKHJlcXVlc3QpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCByZXF1ZXN0KTsKLQotICAvLyBDaGFuZ2UgcGF0aCBkb3duIGludG8gVGVzdCBGb2xkZXIxCi0gIGF1dG8gY2hhbmdlX3BhdGhfcmVzcG9uc2UgPQotICAgICAgQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUiwgbGlzdDEuc2l6ZSgpKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMiwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGNoYW5nZV9wYXRoX3Jlc3BvbnNlKSkpKTsKLSAgYXV0byBwYXRoX3JlcXVlc3RfYnVpbGRlciA9Ci0gICAgICBDaGFuZ2VQYXRoUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDAsIERpcmVjdGlvbjo6RE9XTiwgMik7Ci0gIHJlcXVlc3QgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKCk7Ci0gIHBhdGhfcmVxdWVzdF9idWlsZGVyLT5TZXJpYWxpemUocmVxdWVzdCk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDIsIHJlcXVlc3QpOwotCi0gIC8vIFBvcHVsYXRlIHRoZSBuZXcgVkZTIElECi0gIGZvbGRlcl9pdGVtc19yZXNwb25zZSA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlVkZTQnVpbGRlcigKLSAgICAgIFN0YXR1czo6Tk9fRVJST1IsIDB4MDAwMCwgMHhGRkZGKTsKLSAgZm9sZGVyX2l0ZW1zX3Jlc3BvbnNlLT5BZGRGb2xkZXIoRm9sZGVySXRlbSgzLCAwLCB0cnVlLCAiVGVzdCBGb2xkZXIyIikpOwotICBmb2xkZXJfaXRlbXNfcmVzcG9uc2UtPkFkZEZvbGRlcihGb2xkZXJJdGVtKDQsIDAsIHRydWUsICJUZXN0IEZvbGRlcjMiKSk7Ci0gIGZvbGRlcl9pdGVtc19yZXNwb25zZS0+QWRkRm9sZGVyKEZvbGRlckl0ZW0oNSwgMCwgdHJ1ZSwgIlRlc3QgRm9sZGVyNCIpKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMywgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGZvbGRlcl9pdGVtc19yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgZm9sZGVyX3JlcXVlc3RfYnVpbGRlciA9Ci0gICAgICBHZXRGb2xkZXJJdGVtc1JlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihTY29wZTo6VkZTLCAwLCAzLCB7fSk7Ci0gIHJlcXVlc3QgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKCk7Ci0gIGZvbGRlcl9yZXF1ZXN0X2J1aWxkZXItPlNlcmlhbGl6ZShyZXF1ZXN0KTsKLSAgU2VuZEJyb3dzZU1lc3NhZ2UoMywgcmVxdWVzdCk7Ci0KLSAgLy8gQ2hhbmdlIHBhdGggZG93biBpbnRvIFRlc3QgRm9sZGVyMwotICBjaGFuZ2VfcGF0aF9yZXNwb25zZSA9Ci0gICAgICBDaGFuZ2VQYXRoUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLCBsaXN0Mi5zaXplKCkpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCg0LCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY2hhbmdlX3BhdGhfcmVzcG9uc2UpKSkpOwotICBwYXRoX3JlcXVlc3RfYnVpbGRlciA9Ci0gICAgICBDaGFuZ2VQYXRoUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDAsIERpcmVjdGlvbjo6RE9XTiwgNCk7Ci0gIHJlcXVlc3QgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKCk7Ci0gIHBhdGhfcmVxdWVzdF9idWlsZGVyLT5TZXJpYWxpemUocmVxdWVzdCk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDQsIHJlcXVlc3QpOwotCi0gIC8vIENoYW5nZSBwYXRoIHVwIGJhY2sgaW50byBUZXN0IEZvbGRlcjEKLSAgY2hhbmdlX3BhdGhfcmVzcG9uc2UgPQotICAgICAgQ2hhbmdlUGF0aFJlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpOT19FUlJPUiwgbGlzdDEuc2l6ZSgpKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoNSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGNoYW5nZV9wYXRoX3Jlc3BvbnNlKSkpKTsKLSAgcGF0aF9yZXF1ZXN0X2J1aWxkZXIgPQotICAgICAgQ2hhbmdlUGF0aFJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcigwLCBEaXJlY3Rpb246OlVQLCAwKTsKLSAgcmVxdWVzdCA9IFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2UoKTsKLSAgcGF0aF9yZXF1ZXN0X2J1aWxkZXItPlNlcmlhbGl6ZShyZXF1ZXN0KTsKLSAgU2VuZEJyb3dzZU1lc3NhZ2UoNSwgcmVxdWVzdCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGdldEl0ZW1BdHRyaWJ1dGVzTm93UGxheWluZ1Rlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBTb25nSW5mbyBpbmZvID0geyJ0ZXN0X2lkIiwKLSAgICAgICAgICAgICAgICAgICB7Ly8gVGhlIGF0dHJpYnV0ZSBtYXAKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFSVElTVF9OQU1FLCAiVGVzdCBBcnRpc3QiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBTEJVTV9OQU1FLCAiVGVzdCBBbGJ1bSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTLCAiMiIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkdFTlJFLCAiVGVzdCBHZW5yZSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpERUZBVUxUX0NPVkVSX0FSVCwgIjAwMDAwMDEiKX19OwotICBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gbGlzdCA9IHtpbmZvfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldE5vd1BsYXlpbmdMaXN0KF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZUNiPDA+KCJ0ZXN0X2lkIiwgbGlzdCkpOwotCi0gIFNldEJpcENsaWVudFN0YXR1cyhmYWxzZSk7Ci0KLSAgYXV0byBjb21wYXJlX3RvX2Z1bGwgPQotICAgICAgR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6Tk9fRVJST1IsIDB4RkZGRik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGNvbXBhcmVfdG9fZnVsbCkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBhdXRvIHJlcXVlc3QgPQotICAgICAgVGVzdEJyb3dzZVBhY2tldDo6TWFrZShnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3RfYWxsX2F0dHJpYnV0ZXMpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCByZXF1ZXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgZ2V0SXRlbUF0dHJpYnV0ZXNOb3dQbGF5aW5nV2l0aENvdmVyQXJ0VGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIFNvbmdJbmZvIGluZm8gPSB7InRlc3RfaWQiLAotICAgICAgICAgICAgICAgICAgIHsvLyBUaGUgYXR0cmlidXRlIG1hcAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRJVExFLCAiVGVzdCBTb25nIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VFJBQ0tfTlVNQkVSLCAiMSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6R0VOUkUsICJUZXN0IEdlbnJlIiksCi0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6UExBWUlOR19USU1FLCAiMTAwMCIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkRFRkFVTFRfQ09WRVJfQVJULCAiMDAwMDAwMSIpfX07Ci0gIHN0ZDo6dmVjdG9yPFNvbmdJbmZvPiBsaXN0ID0ge2luZm99OwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0Tm93UGxheWluZ0xpc3QoXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlQ2I8MD4oInRlc3RfaWQiLCBsaXN0KSk7Ci0KLSAgU2V0QmlwQ2xpZW50U3RhdHVzKHRydWUpOwotCi0gIGF1dG8gY29tcGFyZV90b19mdWxsID0KLSAgICAgIEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLCAweEZGRkYpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsIlRlc3QgU29uZyIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkRFRkFVTFRfQ09WRVJfQVJULCAiMDAwMDAwMSIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY29tcGFyZV90b19mdWxsKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gcmVxdWVzdFdpdGhCaXAgPQotICAgICAgVGVzdEJyb3dzZVBhY2tldDo6TWFrZSgKLSAgICAgICAgICBnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3RfYWxsX2F0dHJpYnV0ZXNfd2l0aF9jb3Zlcl9hcnQpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCByZXF1ZXN0V2l0aEJpcCk7Ci0KLSAgU2V0QmlwQ2xpZW50U3RhdHVzKGZhbHNlKTsKLQotICBhdXRvIGNvbXBhcmVfdG9fbm9fYXJ0ID0KLSAgICAgIEdldEl0ZW1BdHRyaWJ1dGVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SLCAweEZGRkYpOwotICBjb21wYXJlX3RvX25vX2FydC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpOwotICBjb21wYXJlX3RvX25vX2FydC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBUlRJU1RfTkFNRSwgIlRlc3QgQXJ0aXN0Iik7Ci0gIGNvbXBhcmVfdG9fbm9fYXJ0LT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFMQlVNX05BTUUsICJUZXN0IEFsYnVtIik7Ci0gIGNvbXBhcmVfdG9fbm9fYXJ0LT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKTsKLSAgY29tcGFyZV90b19ub19hcnQtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VE9UQUxfTlVNQkVSX09GX1RSQUNLUywgIjIiKTsKLSAgY29tcGFyZV90b19ub19hcnQtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6R0VOUkUsICJUZXN0IEdlbnJlIik7Ci0gIGNvbXBhcmVfdG9fbm9fYXJ0LT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKGNvbXBhcmVfdG9fbm9fYXJ0KSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gcmVxdWVzdFdpdGhvdXRCaXAgPQotICAgICAgVGVzdEJyb3dzZVBhY2tldDo6TWFrZSgKLSAgICAgICAgICBnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3RfYWxsX2F0dHJpYnV0ZXNfd2l0aF9jb3Zlcl9hcnQpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCByZXF1ZXN0V2l0aG91dEJpcCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGdldEl0ZW1BdHRyaWJ1dGVzTXR1VGVzdCkgewotICBhdXRvIHRydW5jYXRlZF9wYWNrZXQgPQotICAgICAgR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6Tk9fRVJST1IsIDB4RkZGRik7Ci0gIHRydW5jYXRlZF9wYWNrZXQtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICIxMjM0Iik7Ci0KLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QsIGJvb2wsIEF2cmNwUmVzcG9uc2UpPiBjYiA9Ci0gICAgICBiYXNlOjpCaW5kKFtdKE1vY2tGdW5jdGlvbjx2b2lkKHVpbnQ4X3QsIGJvb2wsIGNvbnN0IEF2cmNwUmVzcG9uc2UmKT4qIGEsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYiwgYm9vbCBjLCBBdnJjcFJlc3BvbnNlIGQpIHsgYS0+Q2FsbChiLCBjLCBkKTsgfSwKLSAgICAgICAgICAgICAgICAgJnJlc3BvbnNlX2NiKTsKLSAgRGV2aWNlIGRldmljZShSYXdBZGRyZXNzOjprQW55LCB0cnVlLCBjYiwgMHhGRkZGLCB0cnVuY2F0ZWRfcGFja2V0LT5zaXplKCkpOwotICBkZXZpY2UuUmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgU29uZ0luZm8gaW5mbyA9IHsidGVzdF9pZCIsCi0gICAgICAgICAgICAgICAgICAge0F0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6VElUTEUsICIxMjM0dHJ1bmNhdGVkIil9fTsKLSAgc3RkOjp2ZWN0b3I8U29uZ0luZm8+IGxpc3QgPSB7aW5mb307Ci0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0Tm93UGxheWluZ0xpc3QoXykpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoSW52b2tlQ2I8MD4oInRlc3RfaWQiLCBsaXN0KSk7Ci0KLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHRydW5jYXRlZF9wYWNrZXQpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIGRldmljZS5Ccm93c2VNZXNzYWdlUmVjZWl2ZWQoCi0gICAgICAxLCBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKGdldF9pdGVtX2F0dHJpYnV0ZXNfcmVxdWVzdF9hbGxfYXR0cmlidXRlcykpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBzZXRBZGRyZXNzZWRQbGF5ZXJUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgTWVkaWFQbGF5ZXJJbmZvIGluZm8gPSB7MCwgIlRlc3QgUGxheWVyIiwgdHJ1ZX07Ci0gIHN0ZDo6dmVjdG9yPE1lZGlhUGxheWVySW5mbz4gbGlzdCA9IHtpbmZvfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldE1lZGlhUGxheWVyTGlzdChfKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShJbnZva2VDYjwwPigwLCBsaXN0KSk7Ci0KLSAgYXV0byBzZXRfYWRkcl9wbGF5ZXJfcmVqX3JzcCA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgQ29tbWFuZFBkdTo6U0VUX0FERFJFU1NFRF9QTEFZRVIsIFN0YXR1czo6SU5WQUxJRF9QTEFZRVJfSUQpOwotCi0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoc2V0X2FkZHJfcGxheWVyX3Jlal9yc3ApKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byBwbGF5ZXJfaWRfMV9yZXF1ZXN0ID0KLSAgICAgIFRlc3RBdnJjcFBhY2tldDo6TWFrZShzZXRfYWRkcmVzc2VkX3BsYXllcl9pZF8xX3JlcXVlc3QpOwotICBTZW5kTWVzc2FnZSgxLCBwbGF5ZXJfaWRfMV9yZXF1ZXN0KTsKLQotICBhdXRvIHNldF9hZGRyX3BsYXllcl9yc3AgPQotICAgICAgU2V0QWRkcmVzc2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcihTdGF0dXM6Ok5PX0VSUk9SKTsKLQotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHNldF9hZGRyX3BsYXllcl9yc3ApKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXF1ZXN0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKHNldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QpOwotICBTZW5kTWVzc2FnZSgxLCByZXF1ZXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgc2V0QnJvd3NlZFBsYXllclRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIFNldEJyb3dzZWRQbGF5ZXIoXywgXykpCi0gICAgICAuVGltZXMoMykKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwxPih0cnVlLCAiIiwgMCkpCi0gICAgICAuV2lsbE9uY2UoSW52b2tlQ2I8MT4oZmFsc2UsICIiLCAwKSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwxPih0cnVlLCAiIiwgMikpOwotCi0gIGF1dG8gbm90X2Jyb3dzYWJsZV9yc3AgPSBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6UExBWUVSX05PVF9CUk9XU0FCTEUsIDB4MDAwMCwgMCwgMCwgIiIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUobm90X2Jyb3dzYWJsZV9yc3ApKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byBwbGF5ZXJfaWRfMF9yZXF1ZXN0ID0KLSAgICAgIFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2Uoc2V0X2Jyb3dzZWRfcGxheWVyX2lkXzBfcmVxdWVzdCk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDEsIHBsYXllcl9pZF8wX3JlcXVlc3QpOwotCi0gIGF1dG8gaW52YWxpZF9pZF9yc3AgPSBTZXRCcm93c2VkUGxheWVyUmVzcG9uc2VCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIFN0YXR1czo6SU5WQUxJRF9QTEFZRVJfSUQsIDB4MDAwMCwgMCwgMCwgIiIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgyLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoaW52YWxpZF9pZF9yc3ApKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgU2VuZEJyb3dzZU1lc3NhZ2UoMiwgcGxheWVyX2lkXzBfcmVxdWVzdCk7Ci0KLSAgYXV0byByZXNwb25zZSA9IFNldEJyb3dzZWRQbGF5ZXJSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpOT19FUlJPUiwgMHgwMDAwLCAyLCAwLCAiIik7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLCBDYWxsKDMsIHRydWUsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBTZW5kQnJvd3NlTWVzc2FnZSgzLCBwbGF5ZXJfaWRfMF9yZXF1ZXN0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgdm9sdW1lQ2hhbmdlZFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotICBNb2NrVm9sdW1lSW50ZXJmYWNlIHZvbF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsICZ2b2xfaW50ZXJmYWNlKTsKLQotICAvLyBQcmV0ZW5kIHRoZSBkZXZpY2UgaXMgYWN0aXZlCi0gIEVYUEVDVF9DQUxMKGEyZHBfaW50ZXJmYWNlLCBhY3RpdmVfcGVlcigpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0ZXN0X2RldmljZS0+R2V0QWRkcmVzcygpKSk7Ci0KLSAgYXV0byByZWdfbm90aWYgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoRXZlbnQ6OlZPTFVNRV9DSEFOR0VELCAwKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoXywgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZWdfbm90aWYpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlclZvbHVtZUNoYW5nZWQoKTsKLQotICBFWFBFQ1RfQ0FMTCh2b2xfaW50ZXJmYWNlLCBEZXZpY2VDb25uZWN0ZWQodGVzdF9kZXZpY2UtPkdldEFkZHJlc3MoKSwgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwxPigweDMwKSk7Ci0gIGF1dG8gc2V0X3ZvbCA9IFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4MzApOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbChfLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHNldF92b2wpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXNwb25zZSA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZShpbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbik7Ci0gIFNlbmRNZXNzYWdlKDEsIHJlc3BvbnNlKTsKLQotICBFWFBFQ1RfQ0FMTCh2b2xfaW50ZXJmYWNlLCBTZXRWb2x1bWUoMHg0NykpLlRpbWVzKDEpOwotICBhdXRvIHJlZ19ub3RpZjIgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoRXZlbnQ6OlZPTFVNRV9DSEFOR0VELCAwKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoXywgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZWdfbm90aWYyKSkpKQotICAgICAgLlRpbWVzKDEpOwotICByZXNwb25zZSA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZShjaGFuZ2VkX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbik7Ci0gIFNlbmRNZXNzYWdlKDEsIHJlc3BvbnNlKTsKLSAgcmVzcG9uc2UgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoaW50ZXJpbV92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24pOwotICBTZW5kTWVzc2FnZSgxLCByZXNwb25zZSk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIHZvbHVtZUNoYW5nZWROb25BY3RpdmVUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLSAgTW9ja1ZvbHVtZUludGVyZmFjZSB2b2xfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCAmdm9sX2ludGVyZmFjZSk7Ci0KLSAgLy8gUHJldGVuZCB0aGUgZGV2aWNlIGlzbid0IGFjdGl2ZQotICBFWFBFQ1RfQ0FMTChhMmRwX2ludGVyZmFjZSwgYWN0aXZlX3BlZXIoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oUmF3QWRkcmVzczo6a0VtcHR5KSk7Ci0KLSAgYXV0byByZWdfbm90aWYgPQotICAgICAgUmVnaXN0ZXJOb3RpZmljYXRpb25SZXF1ZXN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoRXZlbnQ6OlZPTFVNRV9DSEFOR0VELCAwKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoXywgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZWdfbm90aWYpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlclZvbHVtZUNoYW5nZWQoKTsKLQotICBFWFBFQ1RfQ0FMTCh2b2xfaW50ZXJmYWNlLCBEZXZpY2VDb25uZWN0ZWQodGVzdF9kZXZpY2UtPkdldEFkZHJlc3MoKSwgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwxPigweDMwKSk7Ci0gIGF1dG8gc2V0X3ZvbCA9IFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKDB4MzApOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbChfLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHNldF92b2wpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXNwb25zZSA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZShpbnRlcmltX3ZvbHVtZV9jaGFuZ2VkX25vdGlmaWNhdGlvbik7Ci0gIFNlbmRNZXNzYWdlKDEsIHJlc3BvbnNlKTsKLQotICAvLyBFbnN1cmUgdGhhdCBTZXRWb2x1bWUgaXMgbmV2ZXIgY2FsbGVkCi0gIEVYUEVDVF9DQUxMKHZvbF9pbnRlcmZhY2UsIFNldFZvbHVtZSgweDQ3KSkuVGltZXMoMCk7Ci0KLSAgYXV0byByZWdfbm90aWYyID0KLSAgICAgIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKEV2ZW50OjpWT0xVTUVfQ0hBTkdFRCwgMCk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLCBDYWxsKF8sIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocmVnX25vdGlmMikpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgcmVzcG9uc2UgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoY2hhbmdlZF92b2x1bWVfY2hhbmdlZF9ub3RpZmljYXRpb24pOwotICBTZW5kTWVzc2FnZSgxLCByZXNwb25zZSk7Ci0gIHJlc3BvbnNlID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKGludGVyaW1fdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uKTsKLSAgU2VuZE1lc3NhZ2UoMSwgcmVzcG9uc2UpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCB2b2x1bWVSZWplY3RlZFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotICBNb2NrVm9sdW1lSW50ZXJmYWNlIHZvbF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsICZ2b2xfaW50ZXJmYWNlKTsKLQotICBhdXRvIHJlZ19ub3RpZiA9Ci0gICAgICBSZWdpc3Rlck5vdGlmaWNhdGlvblJlcXVlc3RCdWlsZGVyOjpNYWtlQnVpbGRlcihFdmVudDo6Vk9MVU1FX0NIQU5HRUQsIDApOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbChfLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHJlZ19ub3RpZikpKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVyVm9sdW1lQ2hhbmdlZCgpOwotCi0gIGF1dG8gcmVzcG9uc2UgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UocmVqZWN0ZWRfdm9sdW1lX2NoYW5nZWRfbm90aWZpY2F0aW9uKTsKLSAgU2VuZE1lc3NhZ2UoMSwgcmVzcG9uc2UpOwotCi0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLCBDYWxsKF8sIF8sIF8pKS5UaW1lcygwKTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgc2V0Vm9sdW1lT25jZVRlc3QpIHsKLSAgaW50IHZvbCA9IDB4NDg7Ci0KLSAgYXV0byBzZXRfYWJzX3ZvbCA9IFNldEFic29sdXRlVm9sdW1lUmVxdWVzdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHZvbCk7Ci0KLSAgLy8gRW5zdXJlIHRoYXQgU2V0Vm9sdW1lIG9ubHkgYmVlbiBjYWxsIG9uY2UuCi0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLCBDYWxsKF8sIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoc2V0X2Fic192b2wpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgdGVzdF9kZXZpY2UtPlNldFZvbHVtZSh2b2wpOwotICB0ZXN0X2RldmljZS0+U2V0Vm9sdW1lKHZvbCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIHBsYXlQdXNoZWRBY3RpdmVEZXZpY2VUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLSAgTW9ja1ZvbHVtZUludGVyZmFjZSB2b2xfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCAmdm9sX2ludGVyZmFjZSk7Ci0KLSAgLy8gUHJldGVuZCB0aGUgZGV2aWNlIGlzIGFjdGl2ZQotICBFWFBFQ1RfQ0FMTChhMmRwX2ludGVyZmFjZSwgYWN0aXZlX3BlZXIoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odGVzdF9kZXZpY2UtPkdldEFkZHJlc3MoKSkpOwotCi0gIGF1dG8gcGxheV9wdXNoZWQgPSBQYXNzVGhyb3VnaFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKGZhbHNlLCB0cnVlLCAweDQ0KTsKLSAgYXV0byBwbGF5X3B1c2hlZF9yZXNwb25zZSA9Ci0gICAgICBQYXNzVGhyb3VnaFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHRydWUsIHRydWUsIDB4NDQpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbChfLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHBsYXlfcHVzaGVkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIFBsYXlTdGF0dXMgc3RhdHVzID0gezB4MTIzNCwgMHg1Njc4LCBQbGF5U3RhdGU6OlBMQVlJTkd9OwotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFBsYXlTdGF0dXMoXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShJbnZva2VDYjwwPihzdGF0dXMpKTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIFNlbmRLZXlFdmVudCgweDQ0LCBLZXlTdGF0ZTo6UFVTSEVEKSkuVGltZXMoMSk7Ci0KLSAgYXV0byBwbGF5X3B1c2hlZF9wa3QgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoKTsKLSAgcGxheV9wdXNoZWQtPlNlcmlhbGl6ZShwbGF5X3B1c2hlZF9wa3QpOwotCi0gIFNlbmRNZXNzYWdlKDEsIHBsYXlfcHVzaGVkX3BrdCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIHBsYXlQdXNoZWRJbmFjdGl2ZURldmljZVRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotICBNb2NrVm9sdW1lSW50ZXJmYWNlIHZvbF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsICZ2b2xfaW50ZXJmYWNlKTsKLQotICAvLyBQcmV0ZW5kIHRoZSBkZXZpY2UgaXMgbm90IGFjdGl2ZQotICBFWFBFQ1RfQ0FMTChhMmRwX2ludGVyZmFjZSwgYWN0aXZlX3BlZXIoKSkKLSAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oUmF3QWRkcmVzczo6a0VtcHR5KSk7Ci0KLSAgYXV0byBwbGF5X3B1c2hlZCA9IFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoZmFsc2UsIHRydWUsIDB4NDQpOwotICBhdXRvIHBsYXlfcHVzaGVkX3Jlc3BvbnNlID0KLSAgICAgIFBhc3NUaHJvdWdoUGFja2V0QnVpbGRlcjo6TWFrZUJ1aWxkZXIodHJ1ZSwgdHJ1ZSwgMHg0NCk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKF8sIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocGxheV9wdXNoZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgLy8gRXhwZWN0IHRoYXQgdGhlIGRldmljZSB3aWxsIHRyeSB0byBzZXQgaXRzZWxmIGFzIGFjdGl2ZQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIFNldEFjdGl2ZURldmljZSh0ZXN0X2RldmljZS0+R2V0QWRkcmVzcygpKSkuVGltZXMoMSk7Ci0KLSAgLy8gTm8gcGxheSBjb21tYW5kIHNob3VsZCBiZSBzZW50IHNpbmNlIHRoZSBtdXNpYyBpcyBhbHJlYWR5IHBsYXlpbmcKLSAgUGxheVN0YXR1cyBzdGF0dXMgPSB7MHgxMjM0LCAweDU2NzgsIFBsYXlTdGF0ZTo6UExBWUlOR307Ci0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0UGxheVN0YXR1cyhfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKEludm9rZUNiPDA+KHN0YXR1cykpOwotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIFNlbmRLZXlFdmVudCgweDQ0LCBLZXlTdGF0ZTo6UFVTSEVEKSkuVGltZXMoMCk7Ci0KLSAgYXV0byBwbGF5X3B1c2hlZF9wa3QgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoKTsKLSAgcGxheV9wdXNoZWQtPlNlcmlhbGl6ZShwbGF5X3B1c2hlZF9wa3QpOwotCi0gIFNlbmRNZXNzYWdlKDEsIHBsYXlfcHVzaGVkX3BrdCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIG1lZGlhS2V5QWN0aXZlRGV2aWNlVGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0gIE1vY2tWb2x1bWVJbnRlcmZhY2Ugdm9sX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgJnZvbF9pbnRlcmZhY2UpOwotCi0gIC8vIFByZXRlbmQgdGhlIGRldmljZSBpcyBhY3RpdmUKLSAgRVhQRUNUX0NBTEwoYTJkcF9pbnRlcmZhY2UsIGFjdGl2ZV9wZWVyKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRlc3RfZGV2aWNlLT5HZXRBZGRyZXNzKCkpKTsKLQotICBhdXRvIHBsYXlfcmVsZWFzZWQgPQotICAgICAgUGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcihmYWxzZSwgZmFsc2UsIDB4NDQpOwotICBhdXRvIHBsYXlfcmVsZWFzZWRfcmVzcG9uc2UgPQotICAgICAgUGFzc1Rocm91Z2hQYWNrZXRCdWlsZGVyOjpNYWtlQnVpbGRlcih0cnVlLCBmYWxzZSwgMHg0NCk7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKF8sIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocGxheV9yZWxlYXNlZF9yZXNwb25zZSkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldFBsYXlTdGF0dXMoXykpLlRpbWVzKDApOwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgU2VuZEtleUV2ZW50KDB4NDQsIEtleVN0YXRlOjpSRUxFQVNFRCkpLlRpbWVzKDEpOwotCi0gIGF1dG8gcGxheV9yZWxlYXNlZF9wa3QgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2UoKTsKLSAgcGxheV9yZWxlYXNlZC0+U2VyaWFsaXplKHBsYXlfcmVsZWFzZWRfcGt0KTsKLQotICBTZW5kTWVzc2FnZSgxLCBwbGF5X3JlbGVhc2VkX3BrdCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIG1lZGlhS2V5SW5hY3RpdmVEZXZpY2VUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLSAgTW9ja1ZvbHVtZUludGVyZmFjZSB2b2xfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCAmdm9sX2ludGVyZmFjZSk7Ci0KLSAgLy8gUHJldGVuZCB0aGUgZGV2aWNlIGlzIG5vdCBhY3RpdmUKLSAgRVhQRUNUX0NBTEwoYTJkcF9pbnRlcmZhY2UsIGFjdGl2ZV9wZWVyKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKFJhd0FkZHJlc3M6OmtFbXB0eSkpOwotCi0gIGF1dG8gcGxheV9yZWxlYXNlZCA9Ci0gICAgICBQYXNzVGhyb3VnaFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKGZhbHNlLCBmYWxzZSwgMHg0NCk7Ci0gIGF1dG8gcGxheV9yZWxlYXNlZF9yZXNwb25zZSA9Ci0gICAgICBQYXNzVGhyb3VnaFBhY2tldEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKHRydWUsIGZhbHNlLCAweDQ0KTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoXywgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShwbGF5X3JlbGVhc2VkX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIEVYUEVDVF9DQUxMKGludGVyZmFjZSwgR2V0UGxheVN0YXR1cyhfKSkuVGltZXMoMCk7Ci0KLSAgLy8gRXhwZWN0IHRoYXQgdGhlIGtleSBldmVudCB3b250IGJlIHNlbnQgdG8gdGhlIG1lZGlhIGludGVyZmFjZQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIFNlbmRLZXlFdmVudCgweDQ0LCBLZXlTdGF0ZTo6UkVMRUFTRUQpKS5UaW1lcygwKTsKLQotICBhdXRvIHBsYXlfcmVsZWFzZWRfcGt0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKCk7Ci0gIHBsYXlfcmVsZWFzZWQtPlNlcmlhbGl6ZShwbGF5X3JlbGVhc2VkX3BrdCk7Ci0KLSAgU2VuZE1lc3NhZ2UoMSwgcGxheV9yZWxlYXNlZF9wa3QpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBnZXRDYXBhYmlsaXRpZXNUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgLy8gR2V0Q2FwYWJpbGl0aWVzIHdpdGggQ2FwYWJpbGl0eUlEIENPTVBBTllfSUQKLSAgYXV0byByZXF1ZXN0X2NvbXBhbnlfaWRfcmVzcG9uc2UgPQotICAgICAgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2VCdWlsZGVyOjpNYWtlQ29tcGFueUlkQnVpbGRlcigweDAwMTk1OCk7Ci0gIHJlcXVlc3RfY29tcGFueV9pZF9yZXNwb25zZS0+QWRkQ29tcGFueUlkKDB4MDAyMzQ1KTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICByZXNwb25zZV9jYiwKLSAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZXF1ZXN0X2NvbXBhbnlfaWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXF1ZXN0X2NvbXBhbnlfaWQgPQotICAgICAgVGVzdEF2cmNwUGFja2V0OjpNYWtlKGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdF9jb21wYW55X2lkKTsKLSAgU2VuZE1lc3NhZ2UoMSwgcmVxdWVzdF9jb21wYW55X2lkKTsKLQotICAvLyBHZXRDYXBhYmlsaXRpZXMgd2l0aCBDYXBhYmlsaXR5SUQgRVZFTlRTX1NVUFBPUlRFRAotICBhdXRvIHJlcXVlc3RfZXZlbnRzX3N1cHBvcnRlZF9yZXNwb25zZSA9Ci0gICAgICBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VFdmVudHNTdXBwb3J0ZWRCdWlsZGVyKAotICAgICAgICAgIEV2ZW50OjpQTEFZQkFDS19TVEFUVVNfQ0hBTkdFRCk7Ci0gIHJlcXVlc3RfZXZlbnRzX3N1cHBvcnRlZF9yZXNwb25zZS0+QWRkRXZlbnQoRXZlbnQ6OlRSQUNLX0NIQU5HRUQpOwotICByZXF1ZXN0X2V2ZW50c19zdXBwb3J0ZWRfcmVzcG9uc2UtPkFkZEV2ZW50KEV2ZW50OjpQTEFZQkFDS19QT1NfQ0hBTkdFRCk7Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICByZXNwb25zZV9jYiwKLSAgICAgIENhbGwoMiwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZXF1ZXN0X2V2ZW50c19zdXBwb3J0ZWRfcmVzcG9uc2UpKSkpCi0gICAgICAuVGltZXMoMSk7Ci0KLSAgYXV0byByZXF1ZXN0X2V2ZW50c19zdXBwb3J0ZWQgPQotICAgICAgVGVzdEF2cmNwUGFja2V0OjpNYWtlKGdldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCk7Ci0gIFNlbmRNZXNzYWdlKDIsIHJlcXVlc3RfZXZlbnRzX3N1cHBvcnRlZCk7Ci0KLSAgLy8gR2V0Q2FwYWJpbGl0aWVzIHdpdGggQ2FwYWJpbGl0eUlEIFVOS05PV04KLSAgYXV0byByZXF1ZXN0X3Vua25vd25fcmVzcG9uc2UgPSBSZWplY3RCdWlsZGVyOjpNYWtlQnVpbGRlcigKLSAgICAgIENvbW1hbmRQZHU6OkdFVF9DQVBBQklMSVRJRVMsIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotCi0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLAotICAgICAgICAgICAgICBDYWxsKDMsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocmVxdWVzdF91bmtub3duX3Jlc3BvbnNlKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gcmVxdWVzdF91bmtub3duID0KLSAgICAgIFRlc3RBdnJjcFBhY2tldDo6TWFrZShnZXRfY2FwYWJpbGl0aWVzX3JlcXVlc3RfdW5rbm93bik7Ci0gIFNlbmRNZXNzYWdlKDMsIHJlcXVlc3RfdW5rbm93bik7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGdldEludmFsaWRJdGVtQXR0cmlidXRlc1Rlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBTb25nSW5mbyBpbmZvID0geyJ0ZXN0X2lkIiwKLSAgICAgICAgICAgICAgICAgICB7Ly8gVGhlIGF0dHJpYnV0ZSBtYXAKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkFSVElTVF9OQU1FLCAiVGVzdCBBcnRpc3QiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpBTEJVTV9OQU1FLCAiVGVzdCBBbGJ1bSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKSwKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUT1RBTF9OVU1CRVJfT0ZfVFJBQ0tTLCAiMiIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkdFTlJFLCAiVGVzdCBHZW5yZSIpLAotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKX19OwotICBzdGQ6OnZlY3RvcjxTb25nSW5mbz4gbGlzdCA9IHtpbmZvfTsKLQotICBFWFBFQ1RfQ0FMTChpbnRlcmZhY2UsIEdldE5vd1BsYXlpbmdMaXN0KF8pKQotICAgICAgLldpbGxSZXBlYXRlZGx5KEludm9rZUNiPDA+KCJ0ZXN0X2lkIiwgbGlzdCkpOwotCi0gIGF1dG8gY29tcGFyZV90b19mdWxsID0gR2V0SXRlbUF0dHJpYnV0ZXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgU3RhdHVzOjpVSURTX0NIQU5HRUQsIDB4RkZGRik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpUSVRMRSwgIlRlc3QgU29uZyIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QVJUSVNUX05BTUUsICJUZXN0IEFydGlzdCIpOwotICBjb21wYXJlX3RvX2Z1bGwtPkFkZEF0dHJpYnV0ZUVudHJ5KEF0dHJpYnV0ZTo6QUxCVU1fTkFNRSwgIlRlc3QgQWxidW0iKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRSQUNLX05VTUJFUiwgIjEiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlRPVEFMX05VTUJFUl9PRl9UUkFDS1MsICIyIik7Ci0gIGNvbXBhcmVfdG9fZnVsbC0+QWRkQXR0cmlidXRlRW50cnkoQXR0cmlidXRlOjpHRU5SRSwgIlRlc3QgR2VucmUiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OlBMQVlJTkdfVElNRSwgIjEwMDAiKTsKLSAgY29tcGFyZV90b19mdWxsLT5BZGRBdHRyaWJ1dGVFbnRyeShBdHRyaWJ1dGU6OkRFRkFVTFRfQ09WRVJfQVJULCAiMDAwMDAwMSIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwKLSAgICAgICAgICAgICAgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUoY29tcGFyZV90b19mdWxsKSkpKQotICAgICAgLlRpbWVzKDEpOwotCi0gIGF1dG8gcmVxdWVzdCA9IFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2UoCi0gICAgICBnZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3RfYWxsX2F0dHJpYnV0ZXNfaW52YWxpZCk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDEsIHJlcXVlc3QpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBpbnZhbGlkUmVnaXN0ZXJOb3RpZmljYXRpb25UZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgYXV0byByZWdfbm90aWZfcmVqX3JzcCA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKAotICAgICAgQ29tbWFuZFBkdTo6UkVHSVNURVJfTk9USUZJQ0FUSU9OLCBTdGF0dXM6OklOVkFMSURfUEFSQU1FVEVSKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyZWdfbm90aWZfcmVqX3JzcCkpKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBhdXRvIHJlZ19ub3RpZl9yZXF1ZXN0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKHJlZ2lzdGVyX25vdGlmaWNhdGlvbl9pbnZhbGlkKTsKLSAgU2VuZE1lc3NhZ2UoMSwgcmVnX25vdGlmX3JlcXVlc3QpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBpbnZhbGlkVmVuZG9yUGFja2V0VGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIGF1dG8gcnNwID0gUmVqZWN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoc3RhdGljX2Nhc3Q8Q29tbWFuZFBkdT4oMCksIFN0YXR1czo6SU5WQUxJRF9DT01NQU5EKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyc3ApKSkpLlRpbWVzKDEpOwotICBhdXRvIHNob3J0X3BhY2tldCA9IFRlc3RBdnJjcFBhY2tldDo6TWFrZShzaG9ydF92ZW5kb3JfcGFja2V0KTsKLSAgU2VuZE1lc3NhZ2UoMSwgc2hvcnRfcGFja2V0KTsKLX0KLQotVEVTVF9GKEF2cmNwRGV2aWNlVGVzdCwgaW52YWxpZENhcGFiaWxpdGllc1BhY2tldFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBhdXRvIHJzcCA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKENvbW1hbmRQZHU6OkdFVF9DQVBBQklMSVRJRVMsIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHJzcCkpKSkuVGltZXMoMSk7Ci0gIGF1dG8gc2hvcnRfcGFja2V0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKHNob3J0X2dldF9jYXBhYmlsaXRpZXNfcmVxdWVzdCk7Ci0gIFNlbmRNZXNzYWdlKDEsIHNob3J0X3BhY2tldCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGludmFsaWRHZXRFbGVtZW50QXR0cmlidXRlc1BhY2tldFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBhdXRvIHJzcCA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKENvbW1hbmRQZHU6OkdFVF9FTEVNRU5UX0FUVFJJQlVURVMsIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHJzcCkpKSkuVGltZXMoMSk7Ci0gIGF1dG8gc2hvcnRfcGFja2V0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKHNob3J0X2dldF9lbGVtZW50X2F0dHJpYnV0ZXNfcmVxdWVzdCk7Ci0gIFNlbmRNZXNzYWdlKDEsIHNob3J0X3BhY2tldCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGludmFsaWRQbGF5SXRlbVBhY2tldFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBhdXRvIHJzcCA9IFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKENvbW1hbmRQZHU6OlBMQVlfSVRFTSwgU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUik7Ci0gIEVYUEVDVF9DQUxMKHJlc3BvbnNlX2NiLCBDYWxsKDEsIGZhbHNlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocnNwKSkpKS5UaW1lcygxKTsKLSAgYXV0byBzaG9ydF9wYWNrZXQgPSBUZXN0QXZyY3BQYWNrZXQ6Ok1ha2Uoc2hvcnRfcGxheV9pdGVtX3JlcXVlc3QpOwotICBTZW5kTWVzc2FnZSgxLCBzaG9ydF9wYWNrZXQpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBpbnZhbGlkU2V0QWRkcmVzc2VkUGxheWVyUGFja2V0VGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIGF1dG8gcnNwID0gUmVqZWN0QnVpbGRlcjo6TWFrZUJ1aWxkZXIoQ29tbWFuZFBkdTo6U0VUX0FERFJFU1NFRF9QTEFZRVIsIFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbCgxLCBmYWxzZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHJzcCkpKSkuVGltZXMoMSk7Ci0gIGF1dG8gc2hvcnRfcGFja2V0ID0gVGVzdEF2cmNwUGFja2V0OjpNYWtlKHNob3J0X3NldF9hZGRyZXNzZWRfcGxheWVyX3JlcXVlc3QpOwotICBTZW5kTWVzc2FnZSgxLCBzaG9ydF9wYWNrZXQpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBpbnZhbGlkQnJvd3NlUGFja2V0VGVzdCkgewotICBNb2NrTWVkaWFJbnRlcmZhY2UgaW50ZXJmYWNlOwotICBOaWNlTW9jazxNb2NrQTJkcEludGVyZmFjZT4gYTJkcF9pbnRlcmZhY2U7Ci0KLSAgdGVzdF9kZXZpY2UtPlJlZ2lzdGVySW50ZXJmYWNlcygmaW50ZXJmYWNlLCAmYTJkcF9pbnRlcmZhY2UsIG51bGxwdHIpOwotCi0gIGF1dG8gcnNwID0gR2VuZXJhbFJlamVjdEJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6SU5WQUxJRF9DT01NQU5EKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoMSwgZmFsc2UsIG1hdGNoUGFja2V0KHN0ZDo6bW92ZShyc3ApKSkpLlRpbWVzKDEpOwotICBhdXRvIHNob3J0X3BhY2tldCA9IFRlc3RCcm93c2VQYWNrZXQ6Ok1ha2Uoc2hvcnRfYnJvd3NlX3BhY2tldCk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDEsIHNob3J0X3BhY2tldCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGludmFsaWRHZXRGb2xkZXJJdGVtc1BhY2tldFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBhdXRvIHJzcCA9IEdldEZvbGRlckl0ZW1zUmVzcG9uc2VCdWlsZGVyOjpNYWtlUGxheWVyTGlzdEJ1aWxkZXIoU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUiwgMHgwMDAwLCAweEZGRkYpOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocnNwKSkpKS5UaW1lcygxKTsKLSAgYXV0byBzaG9ydF9wYWNrZXQgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKHNob3J0X2dldF9mb2xkZXJfaXRlbXNfcmVxdWVzdCk7Ci0gIFNlbmRCcm93c2VNZXNzYWdlKDEsIHNob3J0X3BhY2tldCk7Ci19Ci0KLVRFU1RfRihBdnJjcERldmljZVRlc3QsIGludmFsaWRHZXRUb3RhbE51bWJlck9mSXRlbXNQYWNrZXRUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgYXV0byByc3AgPSBHZXRUb3RhbE51bWJlck9mSXRlbXNSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIsIDB4MDAwMCwgMHhGRkZGKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHJzcCkpKSkuVGltZXMoMSk7Ci0gIGF1dG8gc2hvcnRfcGFja2V0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZShzaG9ydF9nZXRfdG90YWxfbnVtYmVyX29mX2l0ZW1zX3JlcXVlc3QpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCBzaG9ydF9wYWNrZXQpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBpbnZhbGlkQ2hhbmdlUGF0aFBhY2tldFRlc3QpIHsKLSAgTW9ja01lZGlhSW50ZXJmYWNlIGludGVyZmFjZTsKLSAgTmljZU1vY2s8TW9ja0EyZHBJbnRlcmZhY2U+IGEyZHBfaW50ZXJmYWNlOwotCi0gIHRlc3RfZGV2aWNlLT5SZWdpc3RlckludGVyZmFjZXMoJmludGVyZmFjZSwgJmEyZHBfaW50ZXJmYWNlLCBudWxscHRyKTsKLQotICBhdXRvIHJzcCA9IENoYW5nZVBhdGhSZXNwb25zZUJ1aWxkZXI6Ok1ha2VCdWlsZGVyKFN0YXR1czo6SU5WQUxJRF9QQVJBTUVURVIsIDApOwotICBFWFBFQ1RfQ0FMTChyZXNwb25zZV9jYiwgQ2FsbCgxLCB0cnVlLCBtYXRjaFBhY2tldChzdGQ6Om1vdmUocnNwKSkpKS5UaW1lcygxKTsKLSAgYXV0byBzaG9ydF9wYWNrZXQgPSBUZXN0QnJvd3NlUGFja2V0OjpNYWtlKHNob3J0X2NoYW5nZV9wYXRoX3JlcXVlc3QpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCBzaG9ydF9wYWNrZXQpOwotfQotCi1URVNUX0YoQXZyY3BEZXZpY2VUZXN0LCBpbnZhbGlkR2V0SXRlbUF0dHJpYnV0ZXNQYWNrZXRUZXN0KSB7Ci0gIE1vY2tNZWRpYUludGVyZmFjZSBpbnRlcmZhY2U7Ci0gIE5pY2VNb2NrPE1vY2tBMmRwSW50ZXJmYWNlPiBhMmRwX2ludGVyZmFjZTsKLQotICB0ZXN0X2RldmljZS0+UmVnaXN0ZXJJbnRlcmZhY2VzKCZpbnRlcmZhY2UsICZhMmRwX2ludGVyZmFjZSwgbnVsbHB0cik7Ci0KLSAgYXV0byByc3AgPSBHZXRJdGVtQXR0cmlidXRlc1Jlc3BvbnNlQnVpbGRlcjo6TWFrZUJ1aWxkZXIoU3RhdHVzOjpJTlZBTElEX1BBUkFNRVRFUiwgMHhGRkZGKTsKLSAgRVhQRUNUX0NBTEwocmVzcG9uc2VfY2IsIENhbGwoMSwgdHJ1ZSwgbWF0Y2hQYWNrZXQoc3RkOjptb3ZlKHJzcCkpKSkuVGltZXMoMSk7Ci0gIGF1dG8gc2hvcnRfcGFja2V0ID0gVGVzdEJyb3dzZVBhY2tldDo6TWFrZShzaG9ydF9nZXRfaXRlbV9hdHRyaWJ1dGVzX3JlcXVlc3QpOwotICBTZW5kQnJvd3NlTWVzc2FnZSgxLCBzaG9ydF9wYWNrZXQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYXZyY3AKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotY29uc3Qgc3RhY2tfY29uZmlnX3QqIHN0YWNrX2NvbmZpZ19nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgcmV0dXJuICZibHVldG9vdGg6OmF2cmNwOjppbnRlcmZhY2U7Ci19CmRpZmYgLS1naXQgYS9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX3Rlc3RfaGVscGVyLmggYi9wcm9maWxlL2F2cmNwL3Rlc3RzL2F2cmNwX3Rlc3RfaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDU5MTEuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9hdnJjcC90ZXN0cy9hdnJjcF90ZXN0X2hlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi0jaW5jbHVkZSAiYXZyY3AuaCIKLSNpbmNsdWRlICJhdnJjcF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImF2cmNwX3BhY2tldC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidGVzdHMvcGFja2V0X3Rlc3RfaGVscGVyLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdnJjcCB7Ci0KLXVzaW5nIEF2cmNwUmVzcG9uc2UgPSBzdGQ6OnVuaXF1ZV9wdHI8OjpibHVldG9vdGg6OlBhY2tldEJ1aWxkZXI+OwotdXNpbmcgVGVzdEF2cmNwUGFja2V0ID0gVGVzdFBhY2tldFR5cGU8UGFja2V0PjsKLXVzaW5nIFRlc3RCcm93c2VQYWNrZXQgPSBUZXN0UGFja2V0VHlwZTxCcm93c2VQYWNrZXQ+OwotCi1jbGFzcyBNb2NrTWVkaWFJbnRlcmZhY2UgOiBwdWJsaWMgTWVkaWFJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QyKFNlbmRLZXlFdmVudCwgdm9pZCh1aW50OF90LCBLZXlTdGF0ZSkpOwotICBNT0NLX01FVEhPRDEoR2V0U29uZ0luZm8sIHZvaWQoTWVkaWFJbnRlcmZhY2U6OlNvbmdJbmZvQ2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QxKEdldFBsYXlTdGF0dXMsIHZvaWQoTWVkaWFJbnRlcmZhY2U6OlBsYXlTdGF0dXNDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDEoR2V0Tm93UGxheWluZ0xpc3QsIHZvaWQoTWVkaWFJbnRlcmZhY2U6Ok5vd1BsYXlpbmdDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDEoR2V0TWVkaWFQbGF5ZXJMaXN0LCB2b2lkKE1lZGlhSW50ZXJmYWNlOjpNZWRpYUxpc3RDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDMoR2V0Rm9sZGVySXRlbXMsIHZvaWQodWludDE2X3QsIHN0ZDo6c3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJbnRlcmZhY2U6OkZvbGRlckl0ZW1zQ2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QyKFNldEJyb3dzZWRQbGF5ZXIsCi0gICAgICAgICAgICAgICB2b2lkKHVpbnQxNl90LCBNZWRpYUludGVyZmFjZTo6U2V0QnJvd3NlZFBsYXllckNhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMyhQbGF5SXRlbSwgdm9pZCh1aW50MTZfdCwgYm9vbCwgc3RkOjpzdHJpbmcpKTsKLSAgTU9DS19NRVRIT0QxKFNldEFjdGl2ZURldmljZSwgdm9pZChjb25zdCBSYXdBZGRyZXNzJikpOwotICBNT0NLX01FVEhPRDEoUmVnaXN0ZXJVcGRhdGVDYWxsYmFjaywgdm9pZChNZWRpYUNhbGxiYWNrcyopKTsKLSAgTU9DS19NRVRIT0QxKFVucmVnaXN0ZXJVcGRhdGVDYWxsYmFjaywgdm9pZChNZWRpYUNhbGxiYWNrcyopKTsKLX07Ci0KLWNsYXNzIE1vY2tWb2x1bWVJbnRlcmZhY2UgOiBwdWJsaWMgVm9sdW1lSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMShEZXZpY2VDb25uZWN0ZWQsIHZvaWQoY29uc3QgUmF3QWRkcmVzcyYpKTsKLSAgTU9DS19NRVRIT0QyKERldmljZUNvbm5lY3RlZCwgdm9pZChjb25zdCBSYXdBZGRyZXNzJiwgVm9sdW1lQ2hhbmdlZENiKSk7Ci0gIE1PQ0tfTUVUSE9EMShEZXZpY2VEaXNjb25uZWN0ZWQsIHZvaWQoY29uc3QgUmF3QWRkcmVzcyYpKTsKLSAgTU9DS19NRVRIT0QxKFNldFZvbHVtZSwgdm9pZChpbnQ4X3QpKTsKLX07Ci0KLWNsYXNzIE1vY2tBdnJjcEludGVyZmFjZSA6IHB1YmxpYyBBdnJjcEludGVyZmFjZSB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDAoR2V0QXZyY3BWZXJzaW9uLCB1aW50MTZfdCh2b2lkKSk7Ci0gIE1PQ0tfTUVUSE9EOChBZGRSZWNvcmQsIHVpbnQxNl90KHVpbnQxNl90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHVpbnQxNl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgYm9vbCwgdWludDE2X3QsIHVpbnQxNl90KSk7Ci0gIE1PQ0tfTUVUSE9EMShSZW1vdmVSZWNvcmQsIHVpbnQxNl90KHVpbnQzMl90KSk7Ci0gIE1PQ0tfTUVUSE9ENChGaW5kU2VydmljZSwgdWludDE2X3QodWludDE2X3QsIGNvbnN0IFJhd0FkZHJlc3MmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1NEUF9EQl9QQVJBTVMqLCB0QVZSQ19GSU5EX0NCQUNLKSk7Ci0gIE1PQ0tfTUVUSE9EMyhPcGVuLCB1aW50MTZfdCh1aW50OF90KiwgdEFWUkNfQ09OTl9DQiosIGNvbnN0IFJhd0FkZHJlc3MmKSk7Ci0gIE1PQ0tfTUVUSE9EMihPcGVuQnJvd3NlLCB1aW50MTZfdCh1aW50OF90LCB1aW50OF90KSk7Ci0gIE1PQ0tfTUVUSE9EMShHZXRQZWVyTXR1LCB1aW50MTZfdCh1aW50OF90KSk7Ci0gIE1PQ0tfTUVUSE9EMShHZXRCcm93c2VNdHUsIHVpbnQxNl90KHVpbnQ4X3QpKTsKLSAgTU9DS19NRVRIT0QxKENsb3NlLCB1aW50MTZfdCh1aW50OF90KSk7Ci0gIE1PQ0tfTUVUSE9EMShDbG9zZUJyb3dzZSwgdWludDE2X3QodWludDhfdCkpOwotICBNT0NLX01FVEhPRDQoTXNnUmVxLCB1aW50MTZfdCh1aW50OF90LCB1aW50OF90LCB1aW50OF90LCBCVF9IRFIqKSk7Ci19OwotCi1jbGFzcyBNb2NrQTJkcEludGVyZmFjZSA6IHB1YmxpYyBBMmRwSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMShldmVudF9vcGVuLCB2b2lkKGNvbnN0IFJhd0FkZHJlc3MmKSk7Ci0gIE1PQ0tfTUVUSE9EMShldmVudF9jbG9zZSwgdm9pZChjb25zdCBSYXdBZGRyZXNzJikpOwotICBNT0NLX01FVEhPRDAoYWN0aXZlX3BlZXIsIFJhd0FkZHJlc3MoKSk7Ci0gIE1PQ0tfTUVUSE9EMShpc19wZWVyX2luX3NpbGVuY2VfbW9kZSwgYm9vbChjb25zdCBSYXdBZGRyZXNzJikpOwotfTsKLQotY2xhc3MgTW9ja1NkcEludGVyZmFjZSA6IHB1YmxpYyBTZHBJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Q2KEluaXREaXNjb3ZlcnlEYiwKLSAgICAgICAgICAgICAgIGJvb2wodFNEUF9ESVNDT1ZFUllfREIqLCB1aW50MzJfdCwgdWludDE2X3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCosIHVpbnQxNl90LCB1aW50MTZfdCopKTsKLSAgTU9DS19NRVRIT0QzKFNlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0LAotICAgICAgICAgICAgICAgYm9vbChjb25zdCBSYXdBZGRyZXNzJiwgdFNEUF9ESVNDT1ZFUllfREIqLCB0U0RQX0RJU0NfQ01QTF9DQiopKTsKLSAgTU9DS19NRVRIT0QzKEZpbmRTZXJ2aWNlSW5EYiwKLSAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqKHRTRFBfRElTQ09WRVJZX0RCKiwgdWludDE2X3QsIHRfc2RwX2Rpc2NfcmVjKikpOwotICBNT0NLX01FVEhPRDIoRmluZEF0dHJpYnV0ZUluUmVjLCB0U0RQX0RJU0NfQVRUUioodF9zZHBfZGlzY19yZWMqLCB1aW50MTZfdCkpOwotICBNT0NLX01FVEhPRDMoRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMsCi0gICAgICAgICAgICAgICBib29sKHRfc2RwX2Rpc2NfcmVjKiwgdWludDE2X3QsIHVpbnQxNl90KikpOwotfTsKLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUNiLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMoaW5wdXQpKSB7Ci0gIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLlJ1bihpbnB1dCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VDYiwgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzJfVkFMVUVfUEFSQU1TKGEsIGIpKSB7Ci0gIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLlJ1bihhLCBiKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUNiLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfM19WQUxVRV9QQVJBTVMoYSwgYiwgYykpIHsKLSAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykuUnVuKGEsIGIsIGMpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUGFja2V0VHlwZT4KLWNsYXNzIFBhY2tldE1hdGNoZXIgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGNvbnN0IEF2cmNwUmVzcG9uc2UmPiB7Ci0gcHVibGljOgotICBBdnJjcFJlc3BvbnNlIHBrdF90b19jb21wYXJlX3RvXzsKLQotICBQYWNrZXRNYXRjaGVyKEF2cmNwUmVzcG9uc2UmJiBwa3QpIHsgcGt0X3RvX2NvbXBhcmVfdG9fID0gc3RkOjptb3ZlKHBrdCk7IH0KLQotICBib29sIE1hdGNoQW5kRXhwbGFpbigKLSAgICAgIGNvbnN0IEF2cmNwUmVzcG9uc2UmIHIsCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgYXV0byBwYWNrZXQxID0gVGVzdFBhY2tldFR5cGU8UGFja2V0VHlwZT46Ok1ha2UoKTsKLSAgICByLT5TZXJpYWxpemUocGFja2V0MSk7Ci0KLSAgICBhdXRvIHBhY2tldDIgPSBUZXN0UGFja2V0VHlwZTxQYWNrZXRUeXBlPjo6TWFrZSgpOwotICAgIHBrdF90b19jb21wYXJlX3RvXy0+U2VyaWFsaXplKHBhY2tldDIpOwotCi0gICAgaWYgKHBhY2tldDEtPkdldERhdGEoKSAhPSBwYWNrZXQyLT5HZXREYXRhKCkpIHsKLSAgICAgICpsaXN0ZW5lciA8PCAiXG5QYWNrZXQgdG8gY29tcGFyZSB0bzogXG4iOwotICAgICAgKmxpc3RlbmVyIDw8IHBhY2tldDItPlRvU3RyaW5nKCk7Ci0gICAgICAqbGlzdGVuZXIgPDwgIlxuQWN0dWFsIHBhY2tldDogXG4iOwotICAgICAgKmxpc3RlbmVyIDw8IHBhY2tldDEtPlRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhY2tldDEtPkdldERhdGEoKSA9PSBwYWNrZXQyLT5HZXREYXRhKCk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCBvdmVycmlkZSB7ICpvcyA8PCAiUGFja2V0cyBtYXRjaCI7IH0KLX07Ci0KLWlubGluZSA6OnRlc3Rpbmc6Ok1hdGNoZXI8Y29uc3QgQXZyY3BSZXNwb25zZSY+IG1hdGNoUGFja2V0KAotICAgIHN0ZDo6dW5pcXVlX3B0cjxQYWNrZXRCdWlsZGVyPiYmIGFyZykgewotICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IFBhY2tldE1hdGNoZXI8UGFja2V0PihzdGQ6Om1vdmUoYXJnKSkpOwotfQotCi1pbmxpbmUgOjp0ZXN0aW5nOjpNYXRjaGVyPGNvbnN0IEF2cmNwUmVzcG9uc2UmPiBtYXRjaFBhY2tldCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QnJvd3NlUGFja2V0QnVpbGRlcj4mJiBhcmcpIHsKLSAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBQYWNrZXRNYXRjaGVyPEJyb3dzZVBhY2tldD4oc3RkOjptb3ZlKGFyZykpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGF2cmNwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9wcm9maWxlL3NkcC9BbmRyb2lkLmJwIGIvcHJvZmlsZS9zZHAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxMWQ1My4uMDAwMDAwMAotLS0gYS9wcm9maWxlL3NkcC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJzZHBfc2VydmljZSIsCi0gICAgZGVmYXVsdHM6IFsKLSAgICAgICAgImZsdW9yaWRlX2RlZmF1bHRzIiwKLSAgICAgICAgImNsYW5nX2ZpbGVfY292ZXJhZ2UiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQvIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNvbW1vbi9kYXRhX2VsZW1lbnRfcmVhZGVyLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWItYnQtcGFja2V0cyIsCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgIF0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJibHVldG9vdGhfdGVzdF9zZHAiLAotICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfZGVmYXVsdHMiLAotICAgICAgICAiY2xhbmdfY292ZXJhZ2VfYmluIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0LyIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjb21tb24vdGVzdC9kYXRhX2VsZW1lbnRfcmVhZGVyX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgInNkcF9zZXJ2aWNlIiwKLSAgICAgICAgImxpYi1idC1wYWNrZXRzIiwKLSAgICAgICAgImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3Byb2ZpbGUvc2RwL2NvbW1vbi9kYXRhX2VsZW1lbnRfcmVhZGVyLmNjIGIvcHJvZmlsZS9zZHAvY29tbW9uL2RhdGFfZWxlbWVudF9yZWFkZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmU3YzguLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9zZHAvY29tbW9uL2RhdGFfZWxlbWVudF9yZWFkZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImRhdGFfZWxlbWVudF9yZWFkZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLSNpbmNsdWRlICJzZHBfbG9nZ2luZ19oZWxwZXIuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi0vLyBBIGhlbHBlciBtYWNybyB0aGF0IGNhbiB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBlbm91Z2ggZGF0YSByZW1haW5pbmcgaW4gdGhlCi0vLyByZWFkZXIgdG8gZXh0cmFjdCB3aXRob3V0IG92ZXJmbG93aW5nLiBlbmRfIC0gaXRfIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZQotLy8gc28gY2FzdGluZyBpdCB0byBhIHNpemVfdCBpcyBhbHdheXMgc2FmZS4gSWYgaXQgZG9lcyBmYWlsLCBzZXQgaXRfIHRvIGVuZF8KLS8vIHNvIHRoYXQgYWxsIGFkZGl0aW9uYWwgcmVhZGluZ3MgZmFpbC4KLSNkZWZpbmUgQ0hFQ0tfUkVNQUlOSU5HX0xFTih4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoc2l6ZV90KShlbmRfIC0gaXRfKSA8IHgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBFeHRyYWN0IHdvdWxkIHJlYWQgcGFzdCBlbmQgb2YgZGF0YS4iOyBcCi0gICAgICByZXR1cm4gUGFyc2VGYWlsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2RwIHsKLQotRGF0YUVsZW1lbnRSZWFkZXI6OkRhdGFFbGVtZW50IERhdGFFbGVtZW50UmVhZGVyOjpSZWFkTmV4dCgpIHsKLSAgaWYgKGl0XyA+IGVuZF8pIExPRyhGQVRBTCkgPDwgIkJlZ2lubmluZyBvZiBidWZmZXIgaXMgcGFzdCBlbmQgb2YgYnVmZmVyLiI7Ci0gIGlmIChpdF8gPT0gZW5kXykgcmV0dXJuIHN0ZDo6bW9ub3N0YXRlKCk7Ci0KLSAgdWludDhfdCBkZXNjcmlwdG9yID0gKml0XysrOwotICBEYXRhRWxlbWVudFR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PERhdGFFbGVtZW50VHlwZT4oZGVzY3JpcHRvciA+PiAzKTsKLSAgRGF0YUVsZW1lbnRTaXplIHNpemUgPSBzdGF0aWNfY2FzdDxEYXRhRWxlbWVudFNpemU+KGRlc2NyaXB0b3IgJiAwYjAwMDAwMTExKTsKLQotICAvLyBBbGwgdHlwZXMgd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBVUkwgYXJlIGN1cnJlbnRseSByZXNlcnZlZC4KLSAgaWYgKHR5cGUgPiBEYXRhRWxlbWVudFR5cGU6Ok1BWF9WQUxVRSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBUcnlpbmcgdG8gdXNlIGEgcmVzZXJ2ZWQgZGF0YSBlbGVtZW50IHR5cGUiOwotICAgIHJldHVybiBQYXJzZUZhaWwoKTsKLSAgfQotCi0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOOgotICAgICAgaWYgKHNpemUgIT0gRGF0YUVsZW1lbnRTaXplOjpCWVRFMSkgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogSW52YWxpZCBzaXplIGZvciBib29sOiAiIDw8IHNpemU7Ci0gICAgICAgIHJldHVybiBQYXJzZUZhaWwoKTsKLSAgICAgIH0KLQotICAgICAgQ0hFQ0tfUkVNQUlOSU5HX0xFTigxKTsKLSAgICAgIHJldHVybiAoaXRfLmV4dHJhY3Q8dWludDhfdD4oKSAhPSAwKTsKLSAgICBjYXNlIERhdGFFbGVtZW50VHlwZTo6U0lHTkVEX0lOVDoKLSAgICAgIHJldHVybiBSZWFkU2lnbmVkSW50KHNpemUpOwotICAgIGNhc2UgRGF0YUVsZW1lbnRUeXBlOjpVTlNJR05FRF9JTlQ6Ci0gICAgICByZXR1cm4gUmVhZFVuc2lnbmVkSW50KHNpemUpOwotICAgIGNhc2UgRGF0YUVsZW1lbnRUeXBlOjpVVUlEOgotICAgICAgcmV0dXJuIFJlYWRVdWlkKHNpemUpOwotICAgIGNhc2UgRGF0YUVsZW1lbnRUeXBlOjpTVFJJTkc6Ci0gICAgICByZXR1cm4gUmVhZFN0cmluZyhzaXplKTsKLSAgICBjYXNlIERhdGFFbGVtZW50VHlwZTo6REFUQV9FTEVNRU5UX1NFUVVFTkNFOgotICAgICAgcmV0dXJuIFJlYWRTZXF1ZW5jZShzaXplKTsKLSAgICBkZWZhdWx0OgotICAgICAgLy8gVE9ETzogVGhlIG90aGVyIGRhdGEgZWxlbWVudCB0eXBlcyBhcmUgbmV2ZXIgdXNlZCBpbiB0aGUgcHJldmlvdXMgU0RQCi0gICAgICAvLyBpbXBsZW1lbnRhdGlvbi4gV2Ugc2hvdWxkIHByb3Blcmx5IGhhbmRsZSB0aGVtIGluIHRoZSBmdXR1cmUgdGhvdWdoCi0gICAgICAvLyBmb3IgY29tcGxldGVuZXNzLgotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmhhbmRsZWQgRGF0YSBFbGVtZW50IFR5cGU6ICIgPDwgdHlwZTsKLSAgfQotCi0gIHJldHVybiBQYXJzZUZhaWwoKTsKLX0KLQotRGF0YUVsZW1lbnRSZWFkZXI6OkRhdGFFbGVtZW50IERhdGFFbGVtZW50UmVhZGVyOjpQYXJzZUZhaWwoKSB7Ci0gIGl0XyA9IGVuZF87Ci0gIHJldHVybiBzdGQ6Om1vbm9zdGF0ZSgpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgSW50ZWdlclR5cGU+Ci1EYXRhRWxlbWVudFJlYWRlcjo6RGF0YUVsZW1lbnQgRGF0YUVsZW1lbnRSZWFkZXI6OlJlYWRJbnRlZ2VyKCkgewotICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8SW50ZWdlclR5cGU+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAiUmVhZEludGVnZXIgcmVxdWlyZXMgYW4gaW50ZWdyYWwgdHlwZS4iKTsKLQotICBDSEVDS19SRU1BSU5JTkdfTEVOKHNpemVvZihJbnRlZ2VyVHlwZSkpOwotICByZXR1cm4gaXRfLmV4dHJhY3RCRTxJbnRlZ2VyVHlwZT4oKTsKLX0KLQotRGF0YUVsZW1lbnRSZWFkZXI6OkRhdGFFbGVtZW50IERhdGFFbGVtZW50UmVhZGVyOjpSZWFkTGFyZ2VJbnQoKSB7Ci0gIENIRUNLX1JFTUFJTklOR19MRU4oMTYpOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGFycmF5OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZih1aW50OF90WzE2XSk7IGkrKykgewotICAgIGFycmF5W2ldID0gaXRfLmV4dHJhY3Q8dWludDhfdD4oKTsKLSAgfQotCi0gIHJldHVybiBhcnJheTsKLX0KLQotRGF0YUVsZW1lbnRSZWFkZXI6OkRhdGFFbGVtZW50IERhdGFFbGVtZW50UmVhZGVyOjpSZWFkU2lnbmVkSW50KAotICAgIERhdGFFbGVtZW50U2l6ZSBzaXplKSB7Ci0gIHN3aXRjaCAoc2l6ZSkgewotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpCWVRFMToKLSAgICAgIHJldHVybiBSZWFkSW50ZWdlcjxpbnQ4X3Q+KCk7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkJZVEUyOgotICAgICAgcmV0dXJuIFJlYWRJbnRlZ2VyPGludDE2X3Q+KCk7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkJZVEU0OgotICAgICAgcmV0dXJuIFJlYWRJbnRlZ2VyPGludDMyX3Q+KCk7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkJZVEU4OgotICAgICAgcmV0dXJuIFJlYWRJbnRlZ2VyPGludDY0X3Q+KCk7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkJZVEUxNjoKLSAgICAgIHJldHVybiBSZWFkTGFyZ2VJbnQoKTsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEludmFsaWQgc2l6ZSBmb3IgaW50OiAiIDw8IHNpemU7Ci0gIH0KLQotICByZXR1cm4gUGFyc2VGYWlsKCk7Ci19Ci0KLURhdGFFbGVtZW50UmVhZGVyOjpEYXRhRWxlbWVudCBEYXRhRWxlbWVudFJlYWRlcjo6UmVhZFVuc2lnbmVkSW50KAotICAgIERhdGFFbGVtZW50U2l6ZSBzaXplKSB7Ci0gIHN3aXRjaCAoc2l6ZSkgewotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpCWVRFMToKLSAgICAgIHJldHVybiBSZWFkSW50ZWdlcjx1aW50OF90PigpOwotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpCWVRFMjoKLSAgICAgIHJldHVybiBSZWFkSW50ZWdlcjx1aW50MTZfdD4oKTsKLSAgICBjYXNlIERhdGFFbGVtZW50U2l6ZTo6QllURTQ6Ci0gICAgICByZXR1cm4gUmVhZEludGVnZXI8dWludDMyX3Q+KCk7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkJZVEU4OgotICAgICAgcmV0dXJuIFJlYWRJbnRlZ2VyPHVpbnQ2NF90PigpOwotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpCWVRFMTY6Ci0gICAgICByZXR1cm4gUmVhZExhcmdlSW50KCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBJbnZhbGlkIHNpemUgZm9yIHVpbnQ6ICIgPDwgc2l6ZTsKLSAgfQotCi0gIHJldHVybiBQYXJzZUZhaWwoKTsKLX0KLQotRGF0YUVsZW1lbnRSZWFkZXI6OkRhdGFFbGVtZW50IERhdGFFbGVtZW50UmVhZGVyOjpSZWFkVXVpZCgKLSAgICBEYXRhRWxlbWVudFNpemUgc2l6ZSkgewotICBpZiAoc2l6ZSA9PSBEYXRhRWxlbWVudFNpemU6OkJZVEUyKSB7Ci0gICAgQ0hFQ0tfUkVNQUlOSU5HX0xFTigyKTsKLSAgICByZXR1cm4gVXVpZDo6RnJvbTE2Qml0KGl0Xy5leHRyYWN0QkU8dWludDE2X3Q+KCkpOwotICB9Ci0KLSAgaWYgKHNpemUgPT0gRGF0YUVsZW1lbnRTaXplOjpCWVRFNCkgewotICAgIENIRUNLX1JFTUFJTklOR19MRU4oNCk7Ci0gICAgcmV0dXJuIFV1aWQ6OkZyb20zMkJpdChpdF8uZXh0cmFjdEJFPHVpbnQzMl90PigpKTsKLSAgfQotCi0gIGlmIChzaXplID09IERhdGFFbGVtZW50U2l6ZTo6QllURTE2KSB7Ci0gICAgQ0hFQ0tfUkVNQUlOSU5HX0xFTigxNik7Ci0KLSAgICBVdWlkOjpVVUlEMTI4Qml0IHV1aWRfYXJyYXk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICB1dWlkX2FycmF5W2ldID0gaXRfLmV4dHJhY3Q8dWludDhfdD4oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVXVpZDo6RnJvbTEyOEJpdEJFKHV1aWRfYXJyYXkpOwotICB9Ci0KLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEludmFsaWQgc2l6ZSBmb3IgVVVJRDogIiA8PCBzaXplOwotICByZXR1cm4gUGFyc2VGYWlsKCk7Ci19Ci0KLURhdGFFbGVtZW50UmVhZGVyOjpEYXRhRWxlbWVudCBEYXRhRWxlbWVudFJlYWRlcjo6UmVhZFN0cmluZygKLSAgICBEYXRhRWxlbWVudFNpemUgc2l6ZSkgewotICB1aW50MzJfdCBudW1fYnl0ZXMgPSAwOwotCi0gIHN3aXRjaCAoc2l6ZSkgewotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzhCSVQ6Ci0gICAgICBDSEVDS19SRU1BSU5JTkdfTEVOKDEpOwotICAgICAgbnVtX2J5dGVzID0gaXRfLmV4dHJhY3RCRTx1aW50OF90PigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMTZCSVQ6Ci0gICAgICBDSEVDS19SRU1BSU5JTkdfTEVOKDIpOwotICAgICAgbnVtX2J5dGVzID0gaXRfLmV4dHJhY3RCRTx1aW50MTZfdD4oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzMyQklUOgotICAgICAgQ0hFQ0tfUkVNQUlOSU5HX0xFTig0KTsKLSAgICAgIG51bV9ieXRlcyA9IGl0Xy5leHRyYWN0QkU8dWludDMyX3Q+KCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEludmFsaWQgc2l6ZSBmb3Igc3RyaW5nOiAiIDw8IHNpemU7Ci0gICAgICByZXR1cm4gUGFyc2VGYWlsKCk7Ci0gIH0KLQotICBDSEVDS19SRU1BSU5JTkdfTEVOKG51bV9ieXRlcyk7Ci0KLSAgc3RkOjpzdHJpbmcgc3RyOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX2J5dGVzOyBpKyspIHsKLSAgICBzdHIucHVzaF9iYWNrKGl0Xy5leHRyYWN0QkU8dWludDhfdD4oKSk7Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi1EYXRhRWxlbWVudFJlYWRlcjo6RGF0YUVsZW1lbnQgRGF0YUVsZW1lbnRSZWFkZXI6OlJlYWRTZXF1ZW5jZSgKLSAgICBEYXRhRWxlbWVudFNpemUgc2l6ZSkgewotICB1aW50MzJfdCBudW1fYnl0ZXMgPSAwOwotCi0gIHN3aXRjaCAoc2l6ZSkgewotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzhCSVQ6Ci0gICAgICBDSEVDS19SRU1BSU5JTkdfTEVOKDEpOwotICAgICAgbnVtX2J5dGVzID0gaXRfLmV4dHJhY3RCRTx1aW50OF90PigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMTZCSVQ6Ci0gICAgICBDSEVDS19SRU1BSU5JTkdfTEVOKDIpOwotICAgICAgbnVtX2J5dGVzID0gaXRfLmV4dHJhY3RCRTx1aW50MTZfdD4oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzMyQklUOgotICAgICAgQ0hFQ0tfUkVNQUlOSU5HX0xFTig0KTsKLSAgICAgIG51bV9ieXRlcyA9IGl0Xy5leHRyYWN0QkU8dWludDMyX3Q+KCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEludmFsaWQgc2l6ZSBmb3Igc3RyaW5nOiAiIDw8IHNpemU7Ci0gICAgICByZXR1cm4gUGFyc2VGYWlsKCk7Ci0gIH0KLQotICBDSEVDS19SRU1BSU5JTkdfTEVOKG51bV9ieXRlcyk7Ci0KLSAgLy8gQ3JlYXRlIGEgcGFyc2VyIHRoYXQgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgc2VxdWVuY2UgYW5kIG1vdmUKLSAgLy8gdGhlIGl0ZXJhdG9yIHRvIHBhc3QgdGhlIGVuZCBvZiB0aGUgbmV3IHNlcXVlbmNlLgotICBhdXRvJiYgdGVtcCA9IERhdGFFbGVtZW50UmVhZGVyKGl0XywgaXRfICsgbnVtX2J5dGVzKTsKLSAgaXRfICs9IG51bV9ieXRlczsKLSAgcmV0dXJuIHN0ZDo6bW92ZSh0ZW1wKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHNkcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcHJvZmlsZS9zZHAvY29tbW9uL2RhdGFfZWxlbWVudF9yZWFkZXIuaCBiL3Byb2ZpbGUvc2RwL2NvbW1vbi9kYXRhX2VsZW1lbnRfcmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzQ2YmQuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9zZHAvY29tbW9uL2RhdGFfZWxlbWVudF9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8dmFyaWFudD4KLQotI2luY2x1ZGUgImJsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAic2RwX2NvbW1vbi5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2RwIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBoZWxwcyBleHRyYWN0IGRhdGEgZWxlbWVudCBvYmplY3RzIGZyb20gU0RQIHBhY2tldHMuCi1jbGFzcyBEYXRhRWxlbWVudFJlYWRlciB7Ci0gcHVibGljOgotICAvLyBJZiB0aGUgRGF0YUVsZW1lbnQgY29udGFpbnMgbW9ub3N0YXRlLCB0aGF0IG1lYW5zIHBhcnNpbmcgaGFzIGZhaWxlZC4KLSAgdXNpbmcgRGF0YUVsZW1lbnQgPQotICAgICAgc3RkOjp2YXJpYW50PHN0ZDo6bW9ub3N0YXRlLCBib29sLCBpbnQ4X3QsIGludDE2X3QsIGludDMyX3QsIGludDY0X3QsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCwgdWludDE2X3QsIHVpbnQzMl90LCB1aW50NjRfdCwgT2N0ZXQxNiwgVXVpZCwKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgRGF0YUVsZW1lbnRSZWFkZXI+OwotCi0gIERhdGFFbGVtZW50UmVhZGVyKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpIDogaXRfKGJlZ2luKSwgZW5kXyhlbmQpe307Ci0KLSAgLy8gR2V0IHRoZSBuZXh0IERhdGEgRWxlbWVudCBpbiB0aGUgZGF0YS4gSWYgcmVhZGluZyBmYWlscyBmb3IgYW55IHJlYXNvbiwKLSAgLy8gdGhlIERhdGFFbGVtZW50UmVhZGVyIGJlY29tZXMgaW52YWxpZCBhbmQgd2lsbCBjb250aW51b3VzbHkgZmFpbCB0byByZWFkCi0gIC8vIGZyb20gdGhhdCBwb2ludCBvbndhcmQuCi0gIERhdGFFbGVtZW50IFJlYWROZXh0KCk7Ci0KLSBwcml2YXRlOgotICAvLyBFeHRyYWN0aW9uIEhlbHBlcnMKLSAgRGF0YUVsZW1lbnQgUGFyc2VGYWlsKCk7Ci0gIHRlbXBsYXRlIDxjbGFzcyBJbnRlZ2VyVHlwZT4KLSAgRGF0YUVsZW1lbnQgUmVhZEludGVnZXIoKTsKLSAgRGF0YUVsZW1lbnQgUmVhZExhcmdlSW50KCk7Ci0KLSAgLy8gRXh0cmFjdGlvbiBGdW5jdGlvbnMKLSAgRGF0YUVsZW1lbnQgUmVhZFNpZ25lZEludChEYXRhRWxlbWVudFNpemUgc2l6ZSk7Ci0gIERhdGFFbGVtZW50IFJlYWRVbnNpZ25lZEludChEYXRhRWxlbWVudFNpemUgc2l6ZSk7Ci0gIERhdGFFbGVtZW50IFJlYWRVdWlkKERhdGFFbGVtZW50U2l6ZSBzaXplKTsKLSAgRGF0YUVsZW1lbnQgUmVhZFN0cmluZyhEYXRhRWxlbWVudFNpemUgc2l6ZSk7Ci0gIERhdGFFbGVtZW50IFJlYWRTZXF1ZW5jZShEYXRhRWxlbWVudFNpemUgc2l6ZSk7Ci0KLSAgSXRlcmF0b3IgaXRfOwotICBJdGVyYXRvciBlbmRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNkcAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvcHJvZmlsZS9zZHAvY29tbW9uL3Rlc3QvZGF0YV9lbGVtZW50X3JlYWRlcl90ZXN0LmNjIGIvcHJvZmlsZS9zZHAvY29tbW9uL3Rlc3QvZGF0YV9lbGVtZW50X3JlYWRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdmN2QxLi4wMDAwMDAwCi0tLSBhL3Byb2ZpbGUvc2RwL2NvbW1vbi90ZXN0L2RhdGFfZWxlbWVudF9yZWFkZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL2RhdGFfZWxlbWVudF9yZWFkZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzZHAgewotCi11c2luZyBuYW1lc3BhY2UgdGVzdGluZzsKLXVzaW5nIERhdGFFbGVtZW50ID0gRGF0YUVsZW1lbnRSZWFkZXI6OkRhdGFFbGVtZW50OwotCi0vLyBBIGhlbHBlciBjbGFzcyB0byBoZWxwIHdvcmsgd2l0aCB0aGUgRGF0YSBFbGVtZW50IGNsYXNzZXMuCi1jbGFzcyBSZWFkZXJQYWNrZXQgOiBwdWJsaWMgOjpibHVldG9vdGg6OlBhY2tldCB7Ci0gcHVibGljOgotICB1c2luZyBQYWNrZXQ6OlBhY2tldDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFJlYWRlclBhY2tldD4gTWFrZShzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkKSB7Ci0gICAgYXV0byBwa3QgPSBzdGQ6OnNoYXJlZF9wdHI8UmVhZGVyUGFja2V0PihuZXcgUmVhZGVyUGFja2V0KCkpOwotICAgIHBrdC0+cGFja2V0X3N0YXJ0X2luZGV4XyA9IDA7Ci0gICAgcGt0LT5wYWNrZXRfZW5kX2luZGV4XyA9IHBheWxvYWQuc2l6ZSgpOwotICAgIHBrdC0+ZGF0YV8gPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihzdGQ6Om1vdmUocGF5bG9hZCkpOwotICAgIHJldHVybiBwa3Q7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICIiOyB9Ci0gIGJvb2wgSXNWYWxpZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBHZXRQYXlsb2FkSW5kZWNpZXMoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4ocGFja2V0X3N0YXJ0X2luZGV4XywgcGFja2V0X2VuZF9pbmRleF8pOwotICB9Ci19OwotCi1ib29sIG9wZXJhdG9yIT0oRGF0YUVsZW1lbnRSZWFkZXIgYSwgRGF0YUVsZW1lbnRSZWFkZXIgYik7Ci0KLS8vIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGhlbHAgY29tcGFyZSBEYXRhRWxlbWVudFJlYWRlciBvYmplY3RzLgotYm9vbCBvcGVyYXRvcj09KERhdGFFbGVtZW50UmVhZGVyIGEsIERhdGFFbGVtZW50UmVhZGVyIGIpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBEYXRhRWxlbWVudCBhX2VsZW0gPSBhLlJlYWROZXh0KCk7Ci0gICAgRGF0YUVsZW1lbnQgYl9lbGVtID0gYi5SZWFkTmV4dCgpOwotCi0gICAgaWYgKGFfZWxlbSAhPSBiX2VsZW0pIHJldHVybiBmYWxzZTsKLQotICAgIC8vIElmIHdlIGdldCBoZXJlIHRoYXQgbWVhbnMgYm90aCBhIGFuZCBiIGhhdmUgcmVhY2hlZCB0aGUgZW5kLgotICAgIGlmIChhX2VsZW0gPT0gRGF0YUVsZW1lbnQoc3RkOjptb25vc3RhdGUoKSkpIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IhPShEYXRhRWxlbWVudFJlYWRlciBhLCBEYXRhRWxlbWVudFJlYWRlciBiKSB7IHJldHVybiAhKGEgPT0gYik7IH0KLQotLy8gQSBoZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhIHR5cGUgYW5kIGEgc2l6ZSB0byBhIGRlc2NyaXB0b3IgYnl0ZS4KLWNvbnN0ZXhwciB1aW50OF90IERlc2MoRGF0YUVsZW1lbnRUeXBlIHQsIERhdGFFbGVtZW50U2l6ZSBzKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Pih0KSA8PCAzIHwgc3RhdGljX2Nhc3Q8dWludDhfdD4ocyk7Ci19Ci0KLS8vIEhlbHBlciB0aGF0IGNhbiBjcmVhdGUgYSBEYXRhIEVsZW1lbnQgcmVhZGVyIGZyb20gYSB2ZWN0b3IuCi1EYXRhRWxlbWVudFJlYWRlciBDcmVhdGVSZWFkZXIoc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCkgewotICBhdXRvIHBhY2tldCA9IFJlYWRlclBhY2tldDo6TWFrZShzdGQ6Om1vdmUocGF5bG9hZCkpOwotICByZXR1cm4gRGF0YUVsZW1lbnRSZWFkZXIocGFja2V0LT5iZWdpbigpLCBwYWNrZXQtPmVuZCgpKTsKLX0KLQotLy8gVGVzdCBhbGwgdGhlIHZhbGlkIGNhc2VzIG9mIHJlYWRpbmcgdGhlIG5leHQgRGF0YSBFbGVtZW50LgotdXNpbmcgVmFsaWRUZXN0UGFyYW0gPSBzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBEYXRhRWxlbWVudD47Ci1jbGFzcyBWYWxpZFJlYWRUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08VmFsaWRUZXN0UGFyYW0+IHt9OwotCi1zdGQ6OnZlY3RvcjxWYWxpZFRlc3RQYXJhbT4gdmFsaWRfdmFsdWVzID0gewotICAgIC8vIEJvb2xlYW4gVGVzdHMKLSAgICBWYWxpZFRlc3RQYXJhbXsKLSAgICAgICAge0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMX0sCi0gICAgICAgIHRydWUsCi0gICAgfSwKLSAgICBWYWxpZFRlc3RQYXJhbXsKLSAgICAgICAge0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMH0sCi0gICAgICAgIGZhbHNlLAotICAgIH0sCi0KLSAgICAvLyBTaWduZWQgSW50ZWdlciBUZXN0cwotICAgIFZhbGlkVGVzdFBhcmFtewotICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QllURTEpLCAweEZGfSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90PigtMSl9LAotICAgIFZhbGlkVGVzdFBhcmFtewotICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QllURTIpLCAweEZGLCAweEZGfSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50MTZfdD4oLTEpfSwKLSAgICBWYWxpZFRlc3RQYXJhbXt7RGVzYyhEYXRhRWxlbWVudFR5cGU6OlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QllURTQpLAotICAgICAgICAgICAgICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGfSwKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigtMSl9LAotICAgIFZhbGlkVGVzdFBhcmFte3tEZXNjKERhdGFFbGVtZW50VHlwZTo6U0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFOCksCi0gICAgICAgICAgICAgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9LAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KC0xKX0sCi0gICAgVmFsaWRUZXN0UGFyYW17e0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpTSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEUxNiksCi0gICAgICAgICAgICAgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9LAotICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+ezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGfX0sCi0KLSAgICAvLyBVbnNpZ25lZCBJbnRlZ2VyIFRlc3RzCi0gICAgVmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIHtEZXNjKERhdGFFbGVtZW50VHlwZTo6VU5TSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMX0sCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDEpfSwKLSAgICBWYWxpZFRlc3RQYXJhbXt7RGVzYyhEYXRhRWxlbWVudFR5cGU6OlVOU0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMiksCi0gICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDF9LAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigxKX0sCi0gICAgVmFsaWRUZXN0UGFyYW17e0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpVTlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QllURTQpLAotICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxfSwKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSl9LAotICAgIFZhbGlkVGVzdFBhcmFte3tEZXNjKERhdGFFbGVtZW50VHlwZTo6VU5TSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEU4KSwKLSAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0sCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpfSwKLSAgICBWYWxpZFRlc3RQYXJhbXsKLSAgICAgICAge0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpVTlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QllURTE2KSwgMHgwMCwKLSAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDAwLCAweDAxfSwKLSAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCAxNj57MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMX19LAotCi0gICAgLy8gVVVJRCBUZXN0cwotICAgIFZhbGlkVGVzdFBhcmFtewotICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OlVVSUQsIERhdGFFbGVtZW50U2l6ZTo6QllURTIpLCAweDAxLCAweDAyfSwKLSAgICAgICAgVXVpZDo6RnJvbTE2Qml0KDB4MDEwMil9LAotICAgIFZhbGlkVGVzdFBhcmFte3tEZXNjKERhdGFFbGVtZW50VHlwZTo6VVVJRCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFNCksIDB4MDEsCi0gICAgICAgICAgICAgICAgICAgIDB4MDIsIDB4MDMsIDB4MDR9LAotICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20zMkJpdCgweDAxMDIwMzA0KX0sCi0gICAgVmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIHtEZXNjKERhdGFFbGVtZW50VHlwZTo6VVVJRCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMTYpLCAweDAwLCAweDAxLCAweDAyLAotICAgICAgICAgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwKLSAgICAgICAgIDB4MEZ9LAotICAgICAgICBVdWlkOjpGcm9tMTI4Qml0QkUoezB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRn0pfSwKLQotICAgIC8vIFN0cmluZyBUZXN0cwotICAgIFZhbGlkVGVzdFBhcmFtewotICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OlNUUklORywgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzhCSVQpLCAweDA1LAotICAgICAgICAgJ1QnLCAnZScsICdzJywgJ3QnLCAnMSd9LAotICAgICAgICBzdGQ6OnN0cmluZygiVGVzdDEiKX0sCi0gICAgVmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIHtEZXNjKERhdGFFbGVtZW50VHlwZTo6U1RSSU5HLCBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMTZCSVQpLCAweDAwLAotICAgICAgICAgMHgwNSwgJ1QnLCAnZScsICdzJywgJ3QnLCAnMid9LAotICAgICAgICBzdGQ6OnN0cmluZygiVGVzdDIiKX0sCi0gICAgVmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIHtEZXNjKERhdGFFbGVtZW50VHlwZTo6U1RSSU5HLCBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMzJCSVQpLCAweDAwLAotICAgICAgICAgMHgwMCwgMHgwMCwgMHgwNSwgJ1QnLCAnZScsICdzJywgJ3QnLCAnMyd9LAotICAgICAgICBzdGQ6OnN0cmluZygiVGVzdDMiKX0sCi0KLSAgICAvLyBOZXN0ZWQgRGF0YSBFbGVtZW50IExpc3QgVGVzdHMKLSAgICBWYWxpZFRlc3RQYXJhbXsKLSAgICAgICAge0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpEQVRBX0VMRU1FTlRfU0VRVUVOQ0UsCi0gICAgICAgICAgICAgIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKSwKLSAgICAgICAgIDB4MDQsIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMSwKLSAgICAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMH0sCi0gICAgICAgIENyZWF0ZVJlYWRlcigKLSAgICAgICAgICAgIHtEZXNjKERhdGFFbGVtZW50VHlwZTo6Qk9PTEVBTiwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSksIDB4MDEsCi0gICAgICAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OkJPT0xFQU4sIERhdGFFbGVtZW50U2l6ZTo6QllURTEpLCAweDAwfSl9LAotICAgIFZhbGlkVGVzdFBhcmFtewotICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OkRBVEFfRUxFTUVOVF9TRVFVRU5DRSwKLSAgICAgICAgICAgICAgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzE2QklUKSwKLSAgICAgICAgIDB4MDAsIDB4MDQsIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwKLSAgICAgICAgIDB4MDEsIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMH0sCi0gICAgICAgIENyZWF0ZVJlYWRlcigKLSAgICAgICAgICAgIHtEZXNjKERhdGFFbGVtZW50VHlwZTo6Qk9PTEVBTiwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSksIDB4MDEsCi0gICAgICAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OkJPT0xFQU4sIERhdGFFbGVtZW50U2l6ZTo6QllURTEpLCAweDAwfSl9LAotICAgIFZhbGlkVGVzdFBhcmFtewotICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OkRBVEFfRUxFTUVOVF9TRVFVRU5DRSwKLSAgICAgICAgICAgICAgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzMyQklUKSwKLSAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsCi0gICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6Qk9PTEVBTiwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSksIDB4MDEsCi0gICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6Qk9PTEVBTiwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSksIDB4MDB9LAotICAgICAgICBDcmVhdGVSZWFkZXIoCi0gICAgICAgICAgICB7RGVzYyhEYXRhRWxlbWVudFR5cGU6OkJPT0xFQU4sIERhdGFFbGVtZW50U2l6ZTo6QllURTEpLCAweDAxLAotICAgICAgICAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMH0pfSwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFJlYWROZXh0LCBWYWxpZFJlYWRUZXN0LCBWYWx1ZXNJbih2YWxpZF92YWx1ZXMpKTsKLVRFU1RfUChWYWxpZFJlYWRUZXN0LCBUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gUmVhZGVyUGFja2V0OjpNYWtlKHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpKTsKLSAgYXV0byB2YWx1ZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOwotCi0gIERhdGFFbGVtZW50UmVhZGVyIHJlYWRlcihwYWNrZXQtPmJlZ2luKCksIHBhY2tldC0+ZW5kKCkpOwotICBhdXRvIHJlYWRfdmFsdWUgPSByZWFkZXIuUmVhZE5leHQoKTsKLQotICBBU1NFUlRfRVEodmFsdWUsIHJlYWRfdmFsdWUpOwotCi0gIC8vIFRlc3QgdGhhdCB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIGRhdGEgdG8gcmVhZC4KLSAgQVNTRVJUX0VRKHJlYWRlci5SZWFkTmV4dCgpLCBEYXRhRWxlbWVudChzdGQ6Om1vbm9zdGF0ZSgpKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCBhIG5lc3RlZCByZWFkZXIgaXMgY29ycmVjdGx5IGJvdW5kZWQgYW5kIGNhbid0IHJlYWQgcGFzdCBpdHMKLS8vIGRlZmluZWQgZW5kLgotVEVTVChSZWFkTmV4dCwgQm91bmRlZFN1YnJlYWRlclRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGF5bG9hZCA9IHsKLSAgICAgIC8vIFN1YnNlcXVlbmNlIGRlc2NyaXB0b3IgYnl0ZS4KLSAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpEQVRBX0VMRU1FTlRfU0VRVUVOQ0UsCi0gICAgICAgICAgIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKSwKLSAgICAgIC8vIFN1YnNlcXVlbmNlIGxlbmd0aC4KLSAgICAgIDB4MDQsCi0gICAgICAvLyBTdWJzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHR3byBib29sZWFucyB3aXRoIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS4KLSAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMSwKLSAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKSwgMHgwMCwKLSAgICAgIC8vIEFkZGl0aW9uYWwgaW50MTYgYXQgdGhlIGVuZCBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UuCi0gICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6U0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMiksIDB4MDEsIDB4MjN9OwotCi0gIGF1dG8gcGFja2V0ID0gUmVhZGVyUGFja2V0OjpNYWtlKHBheWxvYWQpOwotICBEYXRhRWxlbWVudFJlYWRlciByZWFkZXIocGFja2V0LT5iZWdpbigpLCBwYWNrZXQtPmVuZCgpKTsKLQotICAvLyBUaGUgZmlyc3QgdGhpbmcgcmVhZCBzaG91bGQgYmUgdGhlIHN1YnNlcXVlbmNlLgotICBhdXRvIGRhdGFfZWxlbWVudCA9IHJlYWRlci5SZWFkTmV4dCgpOwotICBBU1NFUlRfVFJVRShzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPERhdGFFbGVtZW50UmVhZGVyPihkYXRhX2VsZW1lbnQpKTsKLQotICAvLyBDaGVjayB0aGF0IHRoZSBzdWJzZXF1ZW5jZSBtYXRjaGVzIHRoZSBwcmVtYWRlIHNlcXVlbmNlLgotICBhdXRvIHN1YnJlYWRlciA9IHN0ZDo6Z2V0PERhdGFFbGVtZW50UmVhZGVyPihkYXRhX2VsZW1lbnQpOwotICBkYXRhX2VsZW1lbnQgPSBzdWJyZWFkZXIuUmVhZE5leHQoKTsKLSAgQVNTRVJUX1RSVUUoc3RkOjpob2xkc19hbHRlcm5hdGl2ZTxib29sPihkYXRhX2VsZW1lbnQpKTsKLSAgQVNTRVJUX1RSVUUoc3RkOjpnZXQ8Ym9vbD4oZGF0YV9lbGVtZW50KSk7Ci0gIGRhdGFfZWxlbWVudCA9IHN1YnJlYWRlci5SZWFkTmV4dCgpOwotICBBU1NFUlRfVFJVRShzdGQ6OmhvbGRzX2FsdGVybmF0aXZlPGJvb2w+KGRhdGFfZWxlbWVudCkpOwotICBBU1NFUlRfRkFMU0Uoc3RkOjpnZXQ8Ym9vbD4oZGF0YV9lbGVtZW50KSk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgcmVhZCBmcm9tIHRoZSBzdWJyZWFkZXIuCi0gIEFTU0VSVF9FUShzdWJyZWFkZXIuUmVhZE5leHQoKSwgRGF0YUVsZW1lbnQoc3RkOjptb25vc3RhdGUoKSkpOwotCi0gIC8vIENoZWNrIHRoYXQgd2UgY2FuIHN0aWxsIHJlYWQgdGhlIGludDE2IGZyb20gdGhlIG9yaWdpbmFsIHJlYWRlci4KLSAgZGF0YV9lbGVtZW50ID0gcmVhZGVyLlJlYWROZXh0KCk7Ci0gIEFTU0VSVF9UUlVFKHN0ZDo6aG9sZHNfYWx0ZXJuYXRpdmU8aW50MTZfdD4oZGF0YV9lbGVtZW50KSk7Ci0gIGF1dG8gaW50MTZfdmFsdWUgPSBzdGQ6OmdldDxpbnQxNl90PihkYXRhX2VsZW1lbnQpOwotICBBU1NFUlRfRVEoaW50MTZfdmFsdWUsIDB4MDEyMyk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgcmVhZCBmcm9tIHRoZSBiYXNlIHJlYWRlci4KLSAgQVNTRVJUX0VRKHJlYWRlci5SZWFkTmV4dCgpLCBEYXRhRWxlbWVudChzdGQ6Om1vbm9zdGF0ZSgpKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCB0cnlpbmcgdG8gcmVhZCBhbiBlbXB0eSBwYWNrZXQgZmFpbHMuCi1URVNUKFJlYWROZXh0LCBOb0RhdGFUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gUmVhZGVyUGFja2V0OjpNYWtlKHt9KTsKLSAgRGF0YUVsZW1lbnRSZWFkZXIgcmVhZGVyKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0KLSAgQVNTRVJUX0VRKHJlYWRlci5SZWFkTmV4dCgpLCBEYXRhRWxlbWVudChzdGQ6Om1vbm9zdGF0ZSgpKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCB1c2luZyBhIHJlc2VydmVkIHZhbHVlIGZvciB0eXBlIGZhaWxzLgotVEVTVChSZWFkTmV4dCwgSW52YWxpZFR5cGVUZXN0KSB7Ci0gIGF1dG8gcGFja2V0ID0gUmVhZGVyUGFja2V0OjpNYWtlKHsweEZGfSk7Ci0gIERhdGFFbGVtZW50UmVhZGVyIHJlYWRlcihwYWNrZXQtPmJlZ2luKCksIHBhY2tldC0+ZW5kKCkpOwotCi0gIEFTU0VSVF9FUShyZWFkZXIuUmVhZE5leHQoKSwgRGF0YUVsZW1lbnQoc3RkOjptb25vc3RhdGUoKSkpOwotfQotCi0vLyBUZXN0IGFsbCBpbnZhbGlkIHBhcnNlcyBkdWUgdG8gaW5jb3JyZWN0IGxlbmd0aHMgb3IgaW52YWxpZCBzaXplcy4gQWxsIHRlc3RzCi0vLyBzaG91bGQgcmV0dXJuIHN0ZDo6bW9ub3N0YXRlLgotdXNpbmcgSW52YWxpZFRlc3RQYXJhbSA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+OwotY2xhc3MgSW52YWxpZFJlYWRUZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08SW52YWxpZFRlc3RQYXJhbT4ge307Ci0KLXN0ZDo6dmVjdG9yPEludmFsaWRUZXN0UGFyYW0+IGludmFsaWRfdmFsdWVzID0gewotICAgIC8vIEJvb2xlYW4gVGVzdHM6Ci0gICAgLy8gICBJbnZhbGlkIHNpemUgZmllbGQuCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OkJPT0xFQU4sIERhdGFFbGVtZW50U2l6ZTo6QllURTIpLAotICAgIH0sCi0gICAgLy8gICBJbnN1ZmZpY2llbnQgZGF0YS4KLSAgICBJbnZhbGlkVGVzdFBhcmFte0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpCT09MRUFOLCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKX0sCi0KLSAgICAvLyBTaWduZWQgSW50ZWdlciBUZXN0czoKLSAgICAvLyAgIEludmFsaWQgc2l6ZSBmaWVsZC4KLSAgICBJbnZhbGlkVGVzdFBhcmFtewotICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6U0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzhCSVQpfSwKLSAgICAvLyAgIDEgYnl0ZSBpbnN1ZmZpY2llbnQgZGF0YS4KLSAgICBJbnZhbGlkVGVzdFBhcmFte0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpTSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEUxKX0sCi0gICAgLy8gICAyIGJ5dGUgaW5zdWZmaWNpZW50IGRhdGEuCi0gICAgSW52YWxpZFRlc3RQYXJhbXtEZXNjKERhdGFFbGVtZW50VHlwZTo6U0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMiksCi0gICAgICAgICAgICAgICAgICAgICAweDAwfSwKLSAgICAvLyAgIDQgYnl0ZSBpbnN1ZmZpY2llbnQgZGF0YS4KLSAgICBJbnZhbGlkVGVzdFBhcmFte0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpTSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEU0KSwKLSAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDB9LAotICAgIC8vICA4IEJ5dGUgaW5zdWZmaWNpZW50IGRhdGEuCi0gICAgSW52YWxpZFRlc3RQYXJhbXtEZXNjKERhdGFFbGVtZW50VHlwZTo6U0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFOCksCi0gICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLSAgICAvLyAgMTYgQnl0ZSBpbnN1ZmZpY2llbnQgZGF0YS4KLSAgICBJbnZhbGlkVGVzdFBhcmFte0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpTSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEUxNiksCi0gICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMH0sCi0KLSAgICAvLyBVbnNpZ25lZCBJbnRlZ2VyIFRlc3RzOgotICAgIC8vICAgSW52YWxpZCBzaXplIGZpZWxkLgotICAgIEludmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpVTlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKX0sCi0gICAgLy8gICAxIGJ5dGUgaW5zdWZmaWNpZW50IGRhdGEuCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OlVOU0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSl9LAotICAgIC8vICAgMiBieXRlIGluc3VmZmljaWVudCBkYXRhLgotICAgIEludmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpVTlNJR05FRF9JTlQsIERhdGFFbGVtZW50U2l6ZTo6QllURTIpLCAweDAwfSwKLSAgICAvLyAgIDQgYnl0ZSBpbnN1ZmZpY2llbnQgZGF0YS4KLSAgICBJbnZhbGlkVGVzdFBhcmFtewotICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6VU5TSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEU0KSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMH0sCi0gICAgLy8gIDggQnl0ZSBpbnN1ZmZpY2llbnQgZGF0YS4KLSAgICBJbnZhbGlkVGVzdFBhcmFtewotICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6VU5TSUdORURfSU5ULCBEYXRhRWxlbWVudFNpemU6OkJZVEU4KSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0gICAgLy8gIDE2IEJ5dGUgaW5zdWZmaWNpZW50IGRhdGEuCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OlVOU0lHTkVEX0lOVCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMTYpLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQotICAgIC8vIFVVSUQgVGVzdHM6Ci0gICAgLy8gICBJbnZhbGlkIHNpemUgZmllbGQuCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OlVVSUQsIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKX0sCi0gICAgLy8gICAyIGJ5dGUgaW5zdWZmaWNpZW50IGRhdGEuCi0gICAgSW52YWxpZFRlc3RQYXJhbXtEZXNjKERhdGFFbGVtZW50VHlwZTo6VVVJRCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMiksIDB4MDB9LAotICAgIC8vICAgNCBieXRlIGluc3VmZmljaWVudCBkYXRhLgotICAgIEludmFsaWRUZXN0UGFyYW17RGVzYyhEYXRhRWxlbWVudFR5cGU6OlVVSUQsIERhdGFFbGVtZW50U2l6ZTo6QllURTQpLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMH0sCi0gICAgLy8gIDE2IEJ5dGUgaW5zdWZmaWNpZW50IGRhdGEuCi0gICAgSW52YWxpZFRlc3RQYXJhbXtEZXNjKERhdGFFbGVtZW50VHlwZTo6VVVJRCwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMTYpLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDB9LAotCi0gICAgLy8gU3RyaW5nIFRlc3RzOgotICAgIC8vICAgSW52YWxpZCBzaXplIGZpZWxkLgotICAgIEludmFsaWRUZXN0UGFyYW17RGVzYyhEYXRhRWxlbWVudFR5cGU6OlNUUklORywgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSl9LAotICAgIC8vICAgSW5zdWZmaWNpZW50IGRhdGEgZm9yIGFkZGl0aW9uYWwgOCBiaXRzIGxlbi4KLSAgICBJbnZhbGlkVGVzdFBhcmFtewotICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6U1RSSU5HLCBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfOEJJVCl9LAotICAgIC8vICAgSW5zdWZmaWNpZW50IGRhdGEgZm9yIGFkZGl0aW9uYWwgMTYgYml0cyBsZW4uCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OlNUUklORywgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzE2QklUKSwKLSAgICAgICAgMHgwMCwKLSAgICB9LAotICAgIC8vICAgSW5zdWZmaWNpZW50IGRhdGEgZm9yIGFkZGl0aW9uYWwgMzIgYml0IGxlbi4KLSAgICBJbnZhbGlkVGVzdFBhcmFtewotICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6U1RSSU5HLCBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMzJCSVQpLAotICAgICAgICAweDAwLAotICAgICAgICAweDAwLAotICAgICAgICAweDAwLAotICAgIH0sCi0gICAgLy8gICBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgcmVwb3J0ZWQgbGVuZ3RoLgotICAgIEludmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpTVFJJTkcsIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKSwgMHgwNCwKLSAgICAgICAgJzEnLCAnMicsICczJ30sCi0KLSAgICAvLyBOZXN0ZWQgRGF0YSBFbGVtZW50IExpc3QgVGVzdHM6Ci0gICAgLy8gICBJbnZhbGlkIHNpemUgZmllbGQuCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OkRBVEFfRUxFTUVOVF9TRVFVRU5DRSwgRGF0YUVsZW1lbnRTaXplOjpCWVRFMSl9LAotICAgIC8vICAgSW5zdWZmaWNpZW50IGRhdGEgZm9yIGFkZGl0aW9uYWwgOCBiaXRzIGxlbi4KLSAgICBJbnZhbGlkVGVzdFBhcmFte0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpEQVRBX0VMRU1FTlRfU0VRVUVOQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKX0sCi0gICAgLy8gICBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgYWRkaXRpb25hbCAxNiBiaXRzIGxlbi4KLSAgICBJbnZhbGlkVGVzdFBhcmFtewotICAgICAgICBEZXNjKERhdGFFbGVtZW50VHlwZTo6REFUQV9FTEVNRU5UX1NFUVVFTkNFLAotICAgICAgICAgICAgIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF8xNkJJVCksCi0gICAgICAgIDB4MDAsCi0gICAgfSwKLSAgICAvLyAgIEluc3VmZmljaWVudCBkYXRhIGZvciBhZGRpdGlvbmFsIDMyIGJpdCBsZW4uCi0gICAgSW52YWxpZFRlc3RQYXJhbXsKLSAgICAgICAgRGVzYyhEYXRhRWxlbWVudFR5cGU6OkRBVEFfRUxFTUVOVF9TRVFVRU5DRSwKLSAgICAgICAgICAgICBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMzJCSVQpLAotICAgICAgICAweDAwLAotICAgICAgICAweDAwLAotICAgICAgICAweDAwLAotICAgIH0sCi0gICAgLy8gICBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgcmVwb3J0ZWQgbGVuZ3RoLgotICAgIEludmFsaWRUZXN0UGFyYW17RGVzYyhEYXRhRWxlbWVudFR5cGU6OkRBVEFfRUxFTUVOVF9TRVFVRU5DRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUVsZW1lbnRTaXplOjpBRERJVElPTkFMXzhCSVQpLAotICAgICAgICAgICAgICAgICAgICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0KLSAgICAvLyBVbmhhbmRsZWQgRGF0YSBFbGVtZW50IFR5cGVzIFRlc3RzOgotICAgIC8vIE5PVEU6IFRoZXNlIHRlc3RzIHNob3VsZCBnbyBhd2F5IGFzIHdlIGJlZ2luIHRvIGhhbmRsZSB0aGUgdHlwZXMuCi0gICAgLy8gICBOaWwgVHlwZS4KLSAgICBJbnZhbGlkVGVzdFBhcmFte0Rlc2MoRGF0YUVsZW1lbnRUeXBlOjpOSUwsIERhdGFFbGVtZW50U2l6ZTo6QllURTEpfSwKLSAgICAvLyAgIERhdGEgRWxlbWVudCBBbHRlcm5hdGl2ZSBMaXN0IFR5cGUuCi0gICAgSW52YWxpZFRlc3RQYXJhbXtEZXNjKERhdGFFbGVtZW50VHlwZTo6REFUQV9FTEVNRU5UX0FMVEVSTkFUSVZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfOEJJVCksCi0gICAgICAgICAgICAgICAgICAgICAweDAwfSwKLSAgICAvLyAgIFVSTCBUeXBlLgotICAgIEludmFsaWRUZXN0UGFyYW17Ci0gICAgICAgIERlc2MoRGF0YUVsZW1lbnRUeXBlOjpVUkwsIERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKSwgMHgwMH19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChSZWFkTmV4dCwgSW52YWxpZFJlYWRUZXN0LCBWYWx1ZXNJbihpbnZhbGlkX3ZhbHVlcykpOwotVEVTVF9QKEludmFsaWRSZWFkVGVzdCwgVGVzdCkgewotICBhdXRvIHBhY2tldCA9IFJlYWRlclBhY2tldDo6TWFrZShHZXRQYXJhbSgpKTsKLSAgRGF0YUVsZW1lbnRSZWFkZXIgcmVhZGVyKHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0KLSAgQVNTRVJUX0VRKHJlYWRlci5SZWFkTmV4dCgpLCBEYXRhRWxlbWVudChzdGQ6Om1vbm9zdGF0ZSgpKSk7Ci19Ci0KLS8vIFRlc3QgdGhhdCB0cnlpbmcgdG8gcmVhZCBmcm9tIGEgcmVhZGVyIHdpdGggc3RhcnQgPiBlbmQgY3Jhc2hlcy4KLVRFU1QoRGF0YUVsZW1lbnRSZWFkZXIsIEJhZEJvdW5kc0RlYXRoVGVzdCkgewotICBhdXRvIHBhY2tldCA9IFJlYWRlclBhY2tldDo6TWFrZSh7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0pOwotICBEYXRhRWxlbWVudFJlYWRlciByZWFkZXIocGFja2V0LT5lbmQoKSwgcGFja2V0LT5iZWdpbigpKTsKLSAgQVNTRVJUX0RFQVRIKHJlYWRlci5SZWFkTmV4dCgpLCAiQmVnaW5uaW5nIG9mIGJ1ZmZlciBpcyBwYXN0IGVuZCBvZiBidWZmZXIuIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZHAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvc2RwL3NkcF9jb21tb24uaCBiL3Byb2ZpbGUvc2RwL3NkcF9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwN2E2My4uMDAwMDAwMAotLS0gYS9wcm9maWxlL3NkcC9zZHBfY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc2RwIHsKLQotZW51bSBjbGFzcyBQZHVJZCA6IHVpbnQ4X3QgewotICBSRVNFUlZFRCA9IDB4MDAsCi0gIEVSUk9SID0gMHgwMSwKLSAgU0VSVklDRV9TRUFSQ0hfUkVRVUVTVCA9IDB4MDIsCi0gIFNFUlZJQ0VfU0VBUkNIX1JFU1BPTlNFID0gMHgwMywKLSAgU0VSVklDRV9BVFRSSUJVVEVfUkVRVUVTVCA9IDB4MDQsCi0gIFNFUlZJQ0VfQVRUUklCVVRFX1JFU1BPTlNFID0gMHgwNSwKLSAgU0VSVklDRV9TRUFSQ0hfQVRUUklCVVRFX1JFUVVFU1QgPSAweDA2LAotICBTRVJWSUNFX1NFQVJDSF9BVFRSSUJVVEVfUkVTUE9OU0UgPSAweDA3LAotICBNQVhfVkFMVUUgPSAweDA3LAotfTsKLQotZW51bSBjbGFzcyBBdHRyaWJ1dGVJZCA6IHVpbnQxNl90IHsKLSAgU0VSVklDRV9SRUNPUkRfSEFORExFID0gMHgwMDAwLAotICBTRVJWSUNFX0NMQVNTX0lEX0xJU1QgPSAweDAwMDEsCi0gIFNFUlZJQ0VfUkVDT1JEX1NUQVRFID0gMHgwMDAyLAotICBTRVJWSUNFX0lEID0gMHgwMDAzLAotICBQUk9UT0NPTF9ERVNDUklQVE9SX0xJU1QgPSAweDAwMDQsCi0gIEJST1dTRV9HUk9VUF9MSVNUID0gMHgwMDA1LAotICBMQU5HVUFHRV9CQVNFX0FUVFJJQlVURV9JRF9MSVNUID0gMHgwMDA2LAotICBTRVJWSUNFX0lORk9fVElNRV9UT19MSVZFID0gMHgwMDA3LAotICBTRVJWSUNFX0FWQUlMQUJJTElUWSA9IDB4MDAwOCwKLSAgUFJPRklMRV9ERVNDUklQVE9SX0xJU1QgPSAweDAwMDksCi0gIERPQ1VNRU5UQVRJT05fVVJMID0gMHgwMDBBLAotICBDTElFTlRfRVhFQ1VUQUJMRV9VUkwgPSAweDAwMEIsCi0gIElDT05fVVJMID0gMHgwMDBDLAotICBBRERJVElPTkFMX1BST1RPQ09MX0RFU0NSSVBUT1JfTElTVCA9IDB4MDAwRCwKLQotICAvLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgU0RQIHNlcnZlciBzZXJ2aWNlIHJlY29yZC4KLSAgLy8gVGhleSBhcmUgb25seSB2YWxpZCBpZiBTZXJ2aWNlRGlzY292ZXJ5U2VydmVyU2VydmljZUNsYXNzSUQgaXMgaW4gdGhlCi0gIC8vIFNlcnZpY2VDbGFzc0lETGlzdC4gU2VlIEJsdWV0b290aCBDb3JlIHY1LjAgU2VjdGlvbiA1LjIuCi0gIFZFUlNJT05fTlVNQkVSX0xJU1QgPSAweDAyMDAsCi0gIFNFUlZJQ0VfREFUQUJBU0VfU1RBVEUgPSAweDAyMDEsCi19OwotCi0vLyBUaGUgQXR0cmlidXRlIElEJ3Mgb2YgdGhlc2UgYXR0cmlidXRlcyBhcmUgY2FsY3VsYXRlZCBieSBhZGRpbmcgdGhlIG9mZnNldAotLy8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBJRCBiYXNlIChjb250YWluZWQgaW4gdGhlCi0vLyBMYW5ndWFnZUJhc2VBdHRyaWJ1dGVJRExpc3QgYXR0cmlidXRlIHZhbHVlKS4KLWVudW0gQXR0cmlidXRlSWRPZmZzZXQgOiB1aW50MTZfdCB7Ci0gIFNFUlZJQ0VfTkFNRSA9IDB4MDAwMCwKLSAgU0VSVklDRV9ERVNDUklQVElPTiA9IDB4MDAwMSwKLSAgUFJPVklERVJfTkFNRSA9IDB4MDAwMiwKLX07Ci0KLS8vIENvbnN0YW50IHRoYXQgZGVmaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBlbGVtZW50LgotZW51bSBjbGFzcyBEYXRhRWxlbWVudFR5cGUgOiB1aW50OF90IHsKLSAgTklMID0gMHgwMCwKLSAgVU5TSUdORURfSU5UID0gMHgwMSwKLSAgU0lHTkVEX0lOVCA9IDB4MDIsCi0gIFVVSUQgPSAweDAzLAotICBTVFJJTkcgPSAweDA0LAotICBCT09MRUFOID0gMHgwNSwKLSAgREFUQV9FTEVNRU5UX1NFUVVFTkNFID0gMHgwNiwKLSAgREFUQV9FTEVNRU5UX0FMVEVSTkFUSVZFID0gMHgwNywKLSAgVVJMID0gMHgwOCwKLSAgTUFYX1ZBTFVFID0gMHgwOCwKLX07Ci0KLS8vIENvbnN0YW50IHRoYXQgZGVmaW5lIHRoZSBkaWZmZXJlbnQgc2l6ZXMgb2YgZGF0YSBlbGVtZW50LgotZW51bSBjbGFzcyBEYXRhRWxlbWVudFNpemUgOiB1aW50OF90IHsKLSAgQllURTEgPSAweDAsICAvLyBFeGNlcHRpb246IElmIHRoZSBkYXRhIGVsZW1lbnQgaXMgTklMIHRoZW4gc2l6ZSBpcyAwIGJ5dGVzCi0gIEJZVEUyID0gMHgxLAotICBCWVRFNCA9IDB4MiwKLSAgQllURTggPSAweDMsCi0gIEJZVEUxNiA9IDB4NCwKLSAgLy8gVGhlIHNpemUgdHlwZXMgYmVsb3cgcmVwcmVzZW50IHRoYXQgdGhlIGZpcnN0IFggYml0cyBvZiB0aGUgdmFsdWUKLSAgLy8gcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgcmVtYWluaW5nIGRhdGEuCi0gIEFERElUSU9OQUxfOEJJVCA9IDB4NSwKLSAgQURESVRJT05BTF8xNkJJVCA9IDB4NiwKLSAgQURESVRJT05BTF8zMkJJVCA9IDB4NywKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzZHAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Byb2ZpbGUvc2RwL3NkcF9sb2dnaW5nX2hlbHBlci5oIGIvcHJvZmlsZS9zZHAvc2RwX2xvZ2dpbmdfaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDczMjkuLjAwMDAwMDAKLS0tIGEvcHJvZmlsZS9zZHAvc2RwX2xvZ2dpbmdfaGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIKLSNpbmNsdWRlICJzZHBfY29tbW9uLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNkcCB7Ci0KLSNpZm5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0jZW5kaWYKLQotaW5saW5lIHN0ZDo6c3RyaW5nIFBkdUlkVGV4dChjb25zdCBQZHVJZCYgaWQpIHsKLSAgc3dpdGNoIChpZCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoUGR1SWQ6OlJFU0VSVkVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFBkdUlkOjpFUlJPUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQZHVJZDo6U0VSVklDRV9TRUFSQ0hfUkVRVUVTVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQZHVJZDo6U0VSVklDRV9TRUFSQ0hfUkVTUE9OU0UpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUGR1SWQ6OlNFUlZJQ0VfQVRUUklCVVRFX1JFUVVFU1QpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUGR1SWQ6OlNFUlZJQ0VfQVRUUklCVVRFX1JFU1BPTlNFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFBkdUlkOjpTRVJWSUNFX1NFQVJDSF9BVFRSSUJVVEVfUkVRVUVTVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQZHVJZDo6U0VSVklDRV9TRUFSQ0hfQVRUUklCVVRFX1JFU1BPTlNFKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIFBkdUlkOiAiICsgbG9naGV4KCh1aW50OF90KWlkKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFBkdUlkJiBpZCkgewotICByZXR1cm4gb3MgPDwgUGR1SWRUZXh0KGlkKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIEF0dHJpYnV0ZUlkVGV4dChjb25zdCBBdHRyaWJ1dGVJZCYgaWQpIHsKLSAgc3dpdGNoIChpZCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQXR0cmlidXRlSWQ6OlNFUlZJQ0VfUkVDT1JEX0hBTkRMRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6U0VSVklDRV9DTEFTU19JRF9MSVNUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZUlkOjpTRVJWSUNFX1JFQ09SRF9TVEFURSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6U0VSVklDRV9JRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6UFJPVE9DT0xfREVTQ1JJUFRPUl9MSVNUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZUlkOjpCUk9XU0VfR1JPVVBfTElTVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6TEFOR1VBR0VfQkFTRV9BVFRSSUJVVEVfSURfTElTVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6U0VSVklDRV9JTkZPX1RJTUVfVE9fTElWRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6U0VSVklDRV9BVkFJTEFCSUxJVFkpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQXR0cmlidXRlSWQ6OlBST0ZJTEVfREVTQ1JJUFRPUl9MSVNUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZUlkOjpET0NVTUVOVEFUSU9OX1VSTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6Q0xJRU5UX0VYRUNVVEFCTEVfVVJMKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEF0dHJpYnV0ZUlkOjpJQ09OX1VSTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBdHRyaWJ1dGVJZDo6QURESVRJT05BTF9QUk9UT0NPTF9ERVNDUklQVE9SX0xJU1QpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQXR0cmlidXRlSWQ6OlZFUlNJT05fTlVNQkVSX0xJU1QpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQXR0cmlidXRlSWQ6OlNFUlZJQ0VfREFUQUJBU0VfU1RBVEUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gQXR0cmlidXRlSWQ6ICIgKyBsb2doZXgoKHVpbnQxNl90KWlkKTsKLSAgfQotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEF0dHJpYnV0ZUlkJiBpZCkgewotICByZXR1cm4gb3MgPDwgQXR0cmlidXRlSWRUZXh0KGlkKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIERhdGFFbGVtZW50VHlwZVRleHQoY29uc3QgRGF0YUVsZW1lbnRUeXBlJiB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRUeXBlOjpOSUwpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRUeXBlOjpVTlNJR05FRF9JTlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRUeXBlOjpTSUdORURfSU5UKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKERhdGFFbGVtZW50VHlwZTo6VVVJRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChEYXRhRWxlbWVudFR5cGU6OlNUUklORyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChEYXRhRWxlbWVudFR5cGU6OkJPT0xFQU4pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRUeXBlOjpEQVRBX0VMRU1FTlRfU0VRVUVOQ0UpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRUeXBlOjpEQVRBX0VMRU1FTlRfQUxURVJOQVRJVkUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRUeXBlOjpVUkwpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gRGF0YUVsZW1lbnRUeXBlOiAiICsgbG9naGV4KCh1aW50OF90KXR5cGUpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRGF0YUVsZW1lbnRUeXBlJiB0eXBlKSB7Ci0gIHJldHVybiBvcyA8PCBEYXRhRWxlbWVudFR5cGVUZXh0KHR5cGUpOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgRGF0YUVsZW1lbnRTaXplVGV4dChjb25zdCBEYXRhRWxlbWVudFNpemUmIHNpemUpIHsKLSAgc3dpdGNoIChzaXplKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChEYXRhRWxlbWVudFNpemU6OkJZVEUxKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKERhdGFFbGVtZW50U2l6ZTo6QllURTIpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoRGF0YUVsZW1lbnRTaXplOjpCWVRFNCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChEYXRhRWxlbWVudFNpemU6OkJZVEU4KTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKERhdGFFbGVtZW50U2l6ZTo6QllURTE2KTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF84QklUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKERhdGFFbGVtZW50U2l6ZTo6QURESVRJT05BTF8xNkJJVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChEYXRhRWxlbWVudFNpemU6OkFERElUSU9OQUxfMzJCSVQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gRGF0YUVsZW1lbnRTaXplOiAiICsgbG9naGV4KCh1aW50OF90KXNpemUpOwotICB9Ci19Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRGF0YUVsZW1lbnRTaXplJiBzaXplKSB7Ci0gIHJldHVybiBvcyA8PCBEYXRhRWxlbWVudFNpemVUZXh0KHNpemUpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2RwCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9ydXN0Zm10LnRvbWwgYi9ydXN0Zm10LnRvbWwKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGVlOTJkOWUuLjAwMDAwMDAKLS0tIGEvcnVzdGZtdC50b21sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vYnVpbGQvc29vbmcvc2NyaXB0cy9ydXN0Zm10LnRvbWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjhkNmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLXN1YmRpcnMgPSBbCi0gICAgImNvbW1vbiIsCi1dCi0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiZmx1b3JpZGVfc2VydmljZV9kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLX0KLQotLy8gU291cmNlIHZhcmlhYmxlcwotYnRzZXJ2aWNlRGFlbW9uU3JjID0gWwotICAgICJhMmRwX3NpbmsuY2MiLAotICAgICJhMmRwX3NvdXJjZS5jYyIsCi0gICAgImFkYXB0ZXIuY2MiLAotICAgICJhdnJjcF9jb250cm9sLmNjIiwKLSAgICAiYXZyY3BfdGFyZ2V0LmNjIiwKLSAgICAiZGFlbW9uLmNjIiwKLSAgICAiZ2F0dF9jbGllbnQuY2MiLAotICAgICJnYXR0X3NlcnZlci5jYyIsCi0gICAgImdhdHRfc2VydmVyX29sZC5jYyIsCi0gICAgImhhbC9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmNjIiwKLSAgICAiaGFsL2JsdWV0b290aF9hdnJjcF9pbnRlcmZhY2UuY2MiLAotICAgICJoYWwvYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmNjIiwKLSAgICAiaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuY2MiLAotICAgICJpcGMvaXBjX2hhbmRsZXIuY2MiLAotICAgICJpcGMvaXBjX21hbmFnZXIuY2MiLAotICAgICJsb2dnaW5nX2hlbHBlcnMuY2MiLAotICAgICJsb3dfZW5lcmd5X2FkdmVydGlzZXIuY2MiLAotICAgICJsb3dfZW5lcmd5X3NjYW5uZXIuY2MiLAotICAgICJsb3dfZW5lcmd5X2NsaWVudC5jYyIsCi0gICAgInNldHRpbmdzLmNjIiwKLV0KLQotYnRzZXJ2aWNlTGludXhTcmMgPSBbCi0gICAgImlwYy9pcGNfaGFuZGxlcl9saW51eC5jYyIsCi0gICAgImlwYy9saW51eF9pcGNfaG9zdC5jYyIsCi1dCi0KLWJ0c2VydmljZUJpbmRlckRhZW1vblNyYyA9IFsKLSAgICAiaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zaW5rX2JpbmRlcl9zZXJ2ZXIuY2MiLAotICAgICJpcGMvYmluZGVyL2JsdWV0b290aF9hMmRwX3NvdXJjZV9iaW5kZXJfc2VydmVyLmNjIiwKLSAgICAiaXBjL2JpbmRlci9ibHVldG9vdGhfYXZyY3BfY29udHJvbF9iaW5kZXJfc2VydmVyLmNjIiwKLSAgICAiaXBjL2JpbmRlci9ibHVldG9vdGhfYXZyY3BfdGFyZ2V0X2JpbmRlcl9zZXJ2ZXIuY2MiLAotICAgICJpcGMvYmluZGVyL2JsdWV0b290aF9iaW5kZXJfc2VydmVyLmNjIiwKLSAgICAiaXBjL2JpbmRlci9ibHVldG9vdGhfZ2F0dF9jbGllbnRfYmluZGVyX3NlcnZlci5jYyIsCi0gICAgImlwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfc2VydmVyX2JpbmRlcl9zZXJ2ZXIuY2MiLAotICAgICJpcGMvYmluZGVyL2JsdWV0b290aF9sZV9hZHZlcnRpc2VyX2JpbmRlcl9zZXJ2ZXIuY2MiLAotICAgICJpcGMvYmluZGVyL2JsdWV0b290aF9sZV9zY2FubmVyX2JpbmRlcl9zZXJ2ZXIuY2MiLAotICAgICJpcGMvYmluZGVyL2JsdWV0b290aF9sb3dfZW5lcmd5X2JpbmRlcl9zZXJ2ZXIuY2MiLAotICAgICJpcGMvYmluZGVyL2ludGVyZmFjZV93aXRoX2luc3RhbmNlc19iYXNlLmNjIiwKLSAgICAiaXBjL2JpbmRlci9pcGNfaGFuZGxlcl9iaW5kZXIuY2MiLAotXQotCi0vLyBNYWluIHVuaXQgdGVzdCBzb3VyY2VzLiBUaGVzZSBnZXQgYnVpbHQgZm9yIGhvc3QgYW5kIHRhcmdldC4KLWJ0c2VydmljZUJhc2VUZXN0U3JjID0gWwotICAgICJoYWwvZmFrZV9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmNjIiwKLSAgICAiaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmNjIiwKLSAgICAiaGFsL2Zha2VfYmx1ZXRvb3RoX2ludGVyZmFjZS5jYyIsCi0gICAgInRlc3QvYTJkcF9zaW5rX3VuaXR0ZXN0LmNjIiwKLSAgICAidGVzdC9hMmRwX3NvdXJjZV91bml0dGVzdC5jYyIsCi0gICAgInRlc3QvYWRhcHRlcl91bml0dGVzdC5jYyIsCi0gICAgInRlc3QvYWR2ZXJ0aXNlX2RhdGFfdW5pdHRlc3QuY2MiLAotICAgICJ0ZXN0L2Zha2VfaGFsX3V0aWwuY2MiLAotICAgICJ0ZXN0L2dhdHRfY2xpZW50X3VuaXR0ZXN0LmNjIiwKLSAgICAidGVzdC9nYXR0X3NlcnZlcl91bml0dGVzdC5jYyIsCi0gICAgInRlc3QvbG93X2VuZXJneV9hZHZlcnRpc2VyX3VuaXR0ZXN0LmNjIiwKLSAgICAidGVzdC9sb3dfZW5lcmd5X2NsaWVudF91bml0dGVzdC5jYyIsCi0gICAgInRlc3QvbG93X2VuZXJneV9zY2FubmVyX3VuaXR0ZXN0LmNjIiwKLSAgICAidGVzdC9zZXR0aW5nc191bml0dGVzdC5jYyIsCi1dCi0KLS8vIE5hdGl2ZSBzeXN0ZW0gc2VydmljZSBmb3IgdGFyZ2V0Ci1jY19iaW5hcnkgewotICAgIG5hbWU6ICJibHVldG9vdGh0YmQiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX3NlcnZpY2VfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBidHNlcnZpY2VCaW5kZXJEYWVtb25TcmMgKwotICAgICAgICBidHNlcnZpY2VMaW51eFNyYyArCi0gICAgICAgIGJ0c2VydmljZURhZW1vblNyYyArCi0gICAgICAgIFsibWFpbi5jYyJdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtYmluZGVyLWNvbW1vbiIsCi0gICAgICAgICJsaWJidGNvcmUiLAotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi0gICAgaW5pdF9yYzogWyJibHVldG9vdGh0YmQucmMiXSwKLX0KLQotLy8gTmF0aXZlIHN5c3RlbSBzZXJ2aWNlIHVuaXQgdGVzdHMgZm9yIHRhcmdldCBhbmQgaG9zdAotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiYmx1ZXRvb3RodGJkX3Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX3NlcnZpY2VfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBidHNlcnZpY2VCYXNlVGVzdFNyYyArCi0gICAgICAgIGJ0c2VydmljZURhZW1vblNyYyArIFsKLSAgICAgICAgICAgICJ0ZXN0L21haW4uY2MiLAotICAgICAgICBdLAotICAgIGFpZGw6IHsKLSAgICAgICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAic3lzdGVtL2J0L3NlcnZpY2UvY29tbW9uIiwKLSAgICAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9haWRsL2JpbmRlciIsCi0gICAgICAgIF0sCi0gICAgfSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLWNvbW1vbiIsCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgIF0sCi0KLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIC8vIFRoaXMgaW5jbHVkZXMgQmluZGVyIHJlbGF0ZWQgdGVzdHMgdGhhdCBjYW4gb25seSBiZSBydW4KLSAgICAgICAgLy8gb24gdGFyZ2V0LgotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzcmNzOiBidHNlcnZpY2VCaW5kZXJEYWVtb25TcmMgKyBbCi0gICAgICAgICAgICAgICAgInRlc3QvcGFyY2VsYWJsZV91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICAgICAgInRlc3QvUGFyY2VsYWJsZVRlc3QuYWlkbCIsCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgICAgICAgICAibGliYmx1ZXRvb3RoLWJpbmRlci1jb21tb24iLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgICBob3N0OiB7Ci0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgInRlc3Qvc3R1Yl9pcGNfaGFuZGxlcl9iaW5kZXIuY2MiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgICAgbGludXhfZ2xpYmM6IHsKLSAgICAgICAgICAgIHNyY3M6IGJ0c2VydmljZUxpbnV4U3JjICsgWwotICAgICAgICAgICAgICAgIC8vIFRPRE8oYmNmKTogRml4IHRoaXMgdGVzdC4KLSAgICAgICAgICAgICAgICAvLyJ0ZXN0L2lwY19saW51eF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiBmYWxzZSwKLSAgICB9LAotfQotCi0vLyBOYXRpdmUgc3lzdGVtIHNlcnZpY2UgQ0xJIGZvciB0YXJnZXQKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImJsdWV0b290aC1jbGkiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJjbGllbnQvbWFpbi5jYyJdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtYmluZGVyLWNvbW1vbiIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotfQotCi0vLyBIZWFydCBSYXRlIEdBVFQgc2VydmljZSBleGFtcGxlIGZvciB0YXJnZXQKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImJ0LWV4YW1wbGUtaHItc2VydmVyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJleGFtcGxlL2hlYXJ0X3JhdGUiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJleGFtcGxlL2hlYXJ0X3JhdGUvaGVhcnRfcmF0ZV9zZXJ2ZXIuY2MiLAotICAgICAgICAiZXhhbXBsZS9oZWFydF9yYXRlL3NlcnZlcl9tYWluLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtYmluZGVyLWNvbW1vbiIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aHRiZF9oYWwiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9idCJdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5jYyIsCi0gICAgICAgICJoYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5jYyIsCi0gICAgICAgICJsb2dnaW5nX2hlbHBlcnMuY2MiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL0JVSUxELmduIGIvc2VydmljZS9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmOTJkMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE1IEdvb2dsZQotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1jb25maWcoInNlcnZpY2VfY29uZmlnIikgewotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQvIiwKLSAgICAiLy9idC9saW51eF9pbmNsdWRlIiwKLSAgICAiLy9idC9pbmNsdWRlIiwKLSAgICAiLy9idC9zZXJ2aWNlIiwKLSAgICAiLy9idC9zZXJ2aWNlL2NvbW1vbiIsCi0gIF0KLQotICBjb25maWdzID0gWyAiLy9idDp0YXJnZXRfZGVmYXVsdHMiIF0KLX0KLQotc291cmNlX3NldCgic2VydmljZV9kYWVtb25fc3JjIikgewotICBzb3VyY2VzID0gWwotICAgICJhMmRwX3NpbmsuY2MiLAotICAgICJhMmRwX3NvdXJjZS5jYyIsCi0gICAgImFkYXB0ZXIuY2MiLAotICAgICJhdnJjcF9jb250cm9sLmNjIiwKLSAgICAiYXZyY3BfdGFyZ2V0LmNjIiwKLSAgICAiZGFlbW9uLmNjIiwKLSAgICAiZ2F0dF9jbGllbnQuY2MiLAotICAgICJnYXR0X3NlcnZlci5jYyIsCi0gICAgImdhdHRfc2VydmVyX29sZC5jYyIsCi0gICAgImhhbC9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmNjIiwKLSAgICAiaGFsL2JsdWV0b290aF9hdnJjcF9pbnRlcmZhY2UuY2MiLAotICAgICJoYWwvYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmNjIiwKLSAgICAiaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuY2MiLAotICAgICJpcGMvaXBjX2hhbmRsZXIuY2MiLAotICAgICJpcGMvaXBjX21hbmFnZXIuY2MiLAotICAgICJsb2dnaW5nX2hlbHBlcnMuY2MiLAotICAgICJsb3dfZW5lcmd5X2FkdmVydGlzZXIuY2MiLAotICAgICJsb3dfZW5lcmd5X2NsaWVudC5jYyIsCi0gICAgImxvd19lbmVyZ3lfc2Nhbm5lci5jYyIsCi0gICAgInNldHRpbmdzLmNjIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvb3NpIiwKLSAgICAiLy9idC90eXBlcyIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIjpzZXJ2aWNlX2NvbmZpZyIgXQotfQotCi1zb3VyY2Vfc2V0KCJzZXJ2aWNlX2xpbnV4X3NyYyIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiaXBjL2lwY19oYW5kbGVyX2xpbnV4LmNjIiwKLSAgICAiaXBjL2xpbnV4X2lwY19ob3N0LmNjIiwKLSAgICAiaXBjL2RidXMvaXBjX2hhbmRsZXJfZGJ1cy5jYyIsCi0gICAgImlwYy9kYnVzL2JsdWV0b290aF9hZGFwdGVyLmNjIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvb3NpIiwKLSAgICAiLy9idC90eXBlcyIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIjpzZXJ2aWNlX2NvbmZpZyIgXQotfQotCi1zdGF0aWNfbGlicmFyeSgic2VydmljZSIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiY29tbW9uL2JsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5jYyIsCi0gICAgImNvbW1vbi9ibHVldG9vdGgvYWRhcHRlcl9zdGF0ZS5jYyIsCi0gICAgImNvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuY2MiLAotICAgICJjb21tb24vYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5jYyIsCi0gICAgImNvbW1vbi9ibHVldG9vdGgvYXZyY3BfaW50X3ZhbHVlLmNjIiwKLSAgICAiY29tbW9uL2JsdWV0b290aC9hdnJjcF9tZWRpYV9hdHRyLmNjIiwKLSAgICAiY29tbW9uL2JsdWV0b290aC9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuY2MiLAotICAgICJjb21tb24vYmx1ZXRvb3RoL2NoYXJhY3RlcmlzdGljLmNjIiwKLSAgICAiY29tbW9uL2JsdWV0b290aC9kZXNjcmlwdG9yLmNjIiwKLSAgICAiY29tbW9uL2JsdWV0b290aC9yZW1vdGVfZGV2aWNlX3Byb3BzLmNjIiwKLSAgICAiY29tbW9uL2JsdWV0b290aC9zY2FuX2ZpbHRlci5jYyIsCi0gICAgImNvbW1vbi9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuY2MiLAotICAgICJjb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuY2MiLAotICAgICJjb21tb24vYmx1ZXRvb3RoL3NlcnZpY2UuY2MiLAotICAgICJjb21tb24vYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5jYyIsCi0gIF0KLQotICBkZXBzID0gWwotICAgICI6c2VydmljZV9kYWVtb25fc3JjIiwKLSAgICAiOnNlcnZpY2VfbGludXhfc3JjIiwKLSAgICAiLy9idC9nZC9ydXN0L3NoaW06aW5pdF9mbGFnc19icmlkZ2VfaGVhZGVyIiwKLSAgICAiLy9idC9vc2kiLAotICAgICIvL2J0L3R5cGVzIiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWyAiOnNlcnZpY2VfY29uZmlnIiBdCi19Ci0KLWV4ZWN1dGFibGUoImJsdWV0b290aHRiZCIpIHsKLSAgc291cmNlcyA9IFsgIm1haW4uY2MiIF0KLQotICBkZXBzID0gWwotICAgICI6c2VydmljZSIsCi0gICAgIi8vYnQvYnRjb3JlIiwKLSAgICAiLy9idC9tYWluOmJsdWV0b290aCIsCi0gIF0KLQotICBjb25maWdzICs9IFsgIjpzZXJ2aWNlX2NvbmZpZyIgXQotCi0gIGxpYnMgPSBbCi0gICAgImRsIiwKLSAgICAicHRocmVhZCIsCi0gICAgInJ0IiwKLSAgICAiYnRfc2hpbV9mZmkiLAotICAgICJzc2wiLAotICAgICJjcnlwdG8iLAotICBdCi0KLSAgbGliX2RpcnMgPSBbCi0gICAgIiR7cm9vdF9vdXRfZGlyfS9ydXN0IgotICBdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBzb3VyY2Vfc2V0KCJzZXJ2aWNlX2Jhc2VfdGVzdF9zcmMiKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICJoYWwvZmFrZV9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmNjIiwKLSAgICAgICJoYWwvZmFrZV9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuY2MiLAotICAgICAgImhhbC9mYWtlX2JsdWV0b290aF9pbnRlcmZhY2UuY2MiLAotICAgICAgInRlc3QvYTJkcF9zaW5rX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L2EyZHBfc291cmNlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L2FkYXB0ZXJfdW5pdHRlc3QuY2MiLAotICAgICAgInRlc3QvYWR2ZXJ0aXNlX2RhdGFfdW5pdHRlc3QuY2MiLAotICAgICAgInRlc3QvZmFrZV9oYWxfdXRpbC5jYyIsCi0gICAgICAidGVzdC9nYXR0X2NsaWVudF91bml0dGVzdC5jYyIsCi0gICAgICAidGVzdC9nYXR0X3NlcnZlcl91bml0dGVzdC5jYyIsCi0gICAgICAidGVzdC9sb3dfZW5lcmd5X2FkdmVydGlzZXJfdW5pdHRlc3QuY2MiLAotICAgICAgInRlc3QvbG93X2VuZXJneV9jbGllbnRfdW5pdHRlc3QuY2MiLAotICAgICAgInRlc3QvbG93X2VuZXJneV9zY2FubmVyX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L3NldHRpbmdzX3VuaXR0ZXN0LmNjIiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsgIjpzZXJ2aWNlX2NvbmZpZyIgXQotICB9Ci0KLSAgZXhlY3V0YWJsZSgiYmx1ZXRvb3RodGJkX3Rlc3QiKSB7Ci0gICAgc291cmNlcyA9IFsgInRlc3QvbWFpbi5jYyIgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICI6c2VydmljZV9iYXNlX3Rlc3Rfc3JjIiwKLSAgICAgICI6c2VydmljZV9kYWVtb25fc3JjIiwKLSAgICAgICI6c2VydmljZV9saW51eF9zcmMiLAotICAgICAgIi8vYnQvc2VydmljZS9jb21tb246bGliYmx1ZXRvb3RoX2NvbW1vbiIsCi0gICAgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9nbW9ja19tYWluIiwKLSAgICAgICI6c2VydmljZV9jb25maWciLAotICAgIF0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9hMmRwX3NpbmsuY2MgYi9zZXJ2aWNlL2EyZHBfc2luay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiM2VjNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2EyZHBfc2luay5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvYTJkcF9zaW5rLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL21lbW9yeS9wdHJfdXRpbC5oPgotCi0jaW5jbHVkZSAic2VydmljZS9sb2dnaW5nX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBzdGF0aWMKLWNvbnN0IGludCBBMmRwU2luazo6a1NpbmdsZXRvbkluc3RhbmNlSWQgPSAwOwotCi1BMmRwU2luazo6QTJkcFNpbmsoY29uc3QgVXVpZCYgdXVpZCkgOiBhcHBfaWRlbnRpZmllcl8odXVpZCkgewotICBoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlOjpHZXQoKS0+QWRkQTJkcFNpbmtPYnNlcnZlcih0aGlzKTsKLX0KLQotQTJkcFNpbms6On5BMmRwU2luaygpIHsKLSAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCktPlJlbW92ZUEyZHBTaW5rT2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLWNvbnN0IFV1aWQmIEEyZHBTaW5rOjpHZXRBcHBJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gYXBwX2lkZW50aWZpZXJfOyB9Ci0KLWludCBBMmRwU2luazo6R2V0SW5zdGFuY2VJZCgpIGNvbnN0IHsgcmV0dXJuIGtTaW5nbGV0b25JbnN0YW5jZUlkOyB9Ci0KLXZvaWQgQTJkcFNpbms6OlNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBkZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKLX0KLQotYm9vbCBBMmRwU2luazo6RW5hYmxlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICByZXR1cm4gaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCktPkEyZHBTaW5rRW5hYmxlKCk7Ci19Ci0KLXZvaWQgQTJkcFNpbms6OkRpc2FibGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldCgpLT5BMmRwU2lua0Rpc2FibGUoKTsKLX0KLQotYm9vbCBBMmRwU2luazo6Q29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgUmF3QWRkcmVzcyBhZGRyOwotICBpZiAoIVJhd0FkZHJlc3M6OkZyb21TdHJpbmcoZGV2aWNlX2FkZHJlc3MsIGFkZHIpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBkZXZpY2UgYWRkcmVzcyBnaXZlbjogIiA8PCBkZXZpY2VfYWRkcmVzczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBidF9zdGF0dXNfdCBzdGF0dXMgPQotICAgICAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCktPkdldEEyZHBTaW5rSEFMSW50ZXJmYWNlKCktPmNvbm5lY3QoCi0gICAgICAgICAgYWRkcik7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY29ubmVjdCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcFNpbms6OkRpc2Nvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLSAgaWYgKCFSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGRldmljZV9hZGRyZXNzLCBhZGRyKSkgewotICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgZGV2aWNlIGFkZHJlc3MgZ2l2ZW46ICIgPDwgZGV2aWNlX2FkZHJlc3M7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldCgpLT5HZXRBMmRwU2lua0hBTEludGVyZmFjZSgpLT5kaXNjb25uZWN0KAotICAgICAgICAgIGFkZHIpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRpc2Nvbm5lY3QiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEEyZHBTaW5rOjpTZXRBdWRpb0ZvY3VzU3RhdGUoaW50IGZvY3VzX3N0YXRlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldCgpCi0gICAgICAtPkdldEEyZHBTaW5rSEFMSW50ZXJmYWNlKCkKLSAgICAgIC0+c2V0X2F1ZGlvX2ZvY3VzX3N0YXRlKGZvY3VzX3N0YXRlKTsKLX0KLQotdm9pZCBBMmRwU2luazo6U2V0QXVkaW9UcmFja0dhaW4oZmxvYXQgZ2FpbikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlOjpHZXQoKQotICAgICAgLT5HZXRBMmRwU2lua0hBTEludGVyZmFjZSgpCi0gICAgICAtPnNldF9hdWRpb190cmFja19nYWluKGdhaW4pOwotfQotCi12b2lkIEEyZHBTaW5rOjpDb25uZWN0aW9uU3RhdGVDYWxsYmFjayhCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpIHsKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotCi0gIGlmIChkZWxlZ2F0ZV8pCi0gICAgZGVsZWdhdGVfLT5PbkNvbm5lY3Rpb25TdGF0ZShkZXZpY2VfYWRkcmVzcywgc3RhdGljX2Nhc3Q8aW50PihzdGF0ZSkpOwotfQotCi12b2lkIEEyZHBTaW5rOjpBdWRpb1N0YXRlQ2FsbGJhY2soQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLQotICBpZiAoZGVsZWdhdGVfKQotICAgIGRlbGVnYXRlXy0+T25BdWRpb1N0YXRlKGRldmljZV9hZGRyZXNzLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRlKSk7Ci19Ci0KLXZvaWQgQTJkcFNpbms6OkF1ZGlvQ29uZmlnQ2FsbGJhY2soQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2NvdW50KSB7Ci0gIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgaWYgKGRlbGVnYXRlXykKLSAgICBkZWxlZ2F0ZV8tPk9uQXVkaW9Db25maWcoZGV2aWNlX2FkZHJlc3MsIHNhbXBsZV9yYXRlLCBjaGFubmVsX2NvdW50KTsKLX0KLQotLy8gQTJkcFNpbmtGYWN0b3J5IGltcGxlbWVudGF0aW9uCi1BMmRwU2lua0ZhY3Rvcnk6OkEyZHBTaW5rRmFjdG9yeSgpID0gZGVmYXVsdDsKLUEyZHBTaW5rRmFjdG9yeTo6fkEyZHBTaW5rRmFjdG9yeSgpID0gZGVmYXVsdDsKLQotYm9vbCBBMmRwU2lua0ZhY3Rvcnk6OlJlZ2lzdGVySW5zdGFuY2UoY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiAtIFV1aWQ6ICIgPDwgdXVpZC5Ub1N0cmluZygpOwotCi0gIGF1dG8gYTJkcF9zaW5rID0gYmFzZTo6V3JhcFVuaXF1ZShuZXcgQTJkcFNpbmsodXVpZCkpOwotICBjYWxsYmFjayhCTEVfU1RBVFVTX1NVQ0NFU1MsIHV1aWQsIHN0ZDo6bW92ZShhMmRwX3NpbmspKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvYTJkcF9zaW5rLmggYi9zZXJ2aWNlL2EyZHBfc2luay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY1OTAyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvYTJkcF9zaW5rLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInNlcnZpY2UvYmx1ZXRvb3RoX2luc3RhbmNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBBMmRwU2luayA6IHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgcHJpdmF0ZSBoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU2lua09ic2VydmVyIHsKLSBwdWJsaWM6Ci0gIC8vIFdlIG9ubHkgYWxsb3cgb25lIGluc3RhbmNlIG9mIHRoaXMgb2JqZWN0IGF0IGEgdGltZS4KLSAgc3RhdGljIGNvbnN0IGludCBrU2luZ2xldG9uSW5zdGFuY2VJZDsKLQotICBjbGFzcyBEZWxlZ2F0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uQXVkaW9TdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCBzdGF0ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPbkF1ZGlvQ29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSwgdWludDhfdCBjaGFubmVsX2NvdW50KSA9IDA7Ci0KLSAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLSAgfTsKLQotICB+QTJkcFNpbmsoKSBvdmVycmlkZTsKLQotICB2b2lkIFNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSk7Ci0KLSAgLy8gQmx1ZXRvb3RoSW5zdGFuY2UgaW1wbGVtZW50YXRpb246Ci0gIGNvbnN0IFV1aWQmIEdldEFwcElkZW50aWZpZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50IEdldEluc3RhbmNlSWQoKSBjb25zdCBvdmVycmlkZTsKLQotICBib29sIEVuYWJsZSgpOwotICB2b2lkIERpc2FibGUoKTsKLSAgYm9vbCBDb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcyk7Ci0gIGJvb2wgRGlzY29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpOwotICB2b2lkIFNldEF1ZGlvRm9jdXNTdGF0ZShpbnQgZm9jdXNfc3RhdGUpOwotICB2b2lkIFNldEF1ZGlvVHJhY2tHYWluKGZsb2F0IGdhaW4pOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIEEyZHBTaW5rRmFjdG9yeTsKLQotICBleHBsaWNpdCBBMmRwU2luayhjb25zdCBVdWlkJiB1dWlkKTsKLQotICAvLyBoYWw6OmJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6T2JzZXJ2ZXIgaW1wbGVtZW50YXRpb246Ci0gIHZvaWQgQ29ubmVjdGlvblN0YXRlQ2FsbGJhY2soYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlKSBvdmVycmlkZTsKLSAgdm9pZCBBdWRpb1N0YXRlQ2FsbGJhY2soYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSBvdmVycmlkZTsKLSAgdm9pZCBBdWRpb0NvbmZpZ0NhbGxiYWNrKGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudCkgb3ZlcnJpZGU7Ci0KLSAgLy8gU2VlIGdldHRlcnMgYWJvdmUgZm9yIGRvY3VtZW50YXRpb24uCi0gIGNvbnN0IFV1aWQgYXBwX2lkZW50aWZpZXJfOwotCi0gIHN0ZDo6bXV0ZXggbXV0ZXhfOwotICBzdGQ6Om11dGV4IGRlbGVnYXRlX211dGV4XzsKLSAgRGVsZWdhdGUqIGRlbGVnYXRlXyA9IG51bGxwdHI7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEEyZHBTaW5rKTsKLX07Ci0KLWNsYXNzIEEyZHBTaW5rRmFjdG9yeSA6IHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZUZhY3RvcnkgewotIHB1YmxpYzoKLSAgQTJkcFNpbmtGYWN0b3J5KCk7Ci0gIH5BMmRwU2lua0ZhY3RvcnkoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhJbnN0YW5jZUZhY3Rvcnkgb3ZlcnJpZGU6Ci0gIGJvb2wgUmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEEyZHBTaW5rRmFjdG9yeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2EyZHBfc291cmNlLmNjIGIvc2VydmljZS9hMmRwX3NvdXJjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3NDY2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2EyZHBfc291cmNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvYTJkcF9zb3VyY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3B0cl91dGlsLmgiCi0jaW5jbHVkZSAic2VydmljZS9sb2dnaW5nX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jZGVmaW5lIFBBUlNFX0FERFIoc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUmF3QWRkcmVzcyB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKChzdHIpLCB0bXApKSB7ICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IChzdHIpOyBcCi0gICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0pCi0KLSNkZWZpbmUgVFJZX1JFVChleHByLCBlcnJfbXNnKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGV4cHIpKSB7ICAgICAgICAgICAgIFwKLSAgICAgIExPRyhFUlJPUikgPDwgZXJyX21zZzsgICBcCi0gICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJZX1JFVF9GVU5DKGV4cHIpIFRSWV9SRVQoZXhwciwgX19mdW5jX18gPDwgIiBmYWlsZWQiKQotCi11c2luZyBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U7Ci11c2luZyBMb2NrR3VhcmQgPSBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD47Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgewotCi1idGF2X2EyZHBfY29kZWNfY29uZmlnX3QgQ29kZWNDb25maWdUb0ZsdW9yaWRlKGNvbnN0IEEyZHBDb2RlY0NvbmZpZyYgY29uZmlnKSB7Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCByZXQgPSB7Ci0gICAgICAuY29kZWNfdHlwZSA9IHN0YXRpY19jYXN0PGJ0YXZfYTJkcF9jb2RlY19pbmRleF90Pihjb25maWcuY29kZWNfdHlwZSgpKSwKLSAgICAgIC5jb2RlY19wcmlvcml0eSA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3Q+KGNvbmZpZy5jb2RlY19wcmlvcml0eSgpKSwKLSAgICAgIC5zYW1wbGVfcmF0ZSA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3Q+KGNvbmZpZy5zYW1wbGVfcmF0ZSgpKSwKLSAgICAgIC5iaXRzX3Blcl9zYW1wbGUgPSBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3Q+KAotICAgICAgICAgIGNvbmZpZy5iaXRzX3Blcl9zYW1wbGUoKSksCi0gICAgICAuY2hhbm5lbF9tb2RlID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3Q+KGNvbmZpZy5jaGFubmVsX21vZGUoKSksCi0gICAgICAuY29kZWNfc3BlY2lmaWNfMSA9IGNvbmZpZy5jb2RlY19zcGVjaWZpY18xKCksCi0gICAgICAuY29kZWNfc3BlY2lmaWNfMiA9IGNvbmZpZy5jb2RlY19zcGVjaWZpY18yKCksCi0gICAgICAuY29kZWNfc3BlY2lmaWNfMyA9IGNvbmZpZy5jb2RlY19zcGVjaWZpY18zKCksCi0gICAgICAuY29kZWNfc3BlY2lmaWNfNCA9IGNvbmZpZy5jb2RlY19zcGVjaWZpY180KCksCi0gIH07Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBDb2RlY0NvbmZpZ3NUb0ZsdW9yaWRlKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEEyZHBDb2RlY0NvbmZpZz4mIGNvbmZpZ3MpIHsKLSAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiByZXQ7Ci0gIHJldC5yZXNlcnZlKGNvbmZpZ3Muc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBjb25maWcgOiBjb25maWdzKSB7Ci0gICAgcmV0LnB1c2hfYmFjayhDb2RlY0NvbmZpZ1RvRmx1b3JpZGUoY29uZmlnKSk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotQTJkcENvZGVjQ29uZmlnIEZsdW9yaWRlQ29kZWNUb0NvZGVjKGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29uZmlnKSB7Ci0gIEEyZHBDb2RlY0NvbmZpZyByZXQoY29uZmlnLmNvZGVjX3R5cGUsIGNvbmZpZy5jb2RlY19wcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbW9kZSwgY29uZmlnLmNvZGVjX3NwZWNpZmljXzEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvZGVjX3NwZWNpZmljXzIsIGNvbmZpZy5jb2RlY19zcGVjaWZpY18zLAotICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb2RlY19zcGVjaWZpY180KTsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGQ6OnZlY3RvcjxBMmRwQ29kZWNDb25maWc+IEZsdW9yaWRlQ29kZWNzVG9Db2RlYygKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb25maWdzKSB7Ci0gIHN0ZDo6dmVjdG9yPEEyZHBDb2RlY0NvbmZpZz4gcmV0OwotICByZXQucmVzZXJ2ZShjb25maWdzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgY29uZmlnIDogY29uZmlncykgewotICAgIHJldC5wdXNoX2JhY2soRmx1b3JpZGVDb2RlY1RvQ29kZWMoY29uZmlnKSk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1jb25zdCBpbnQgQTJkcFNvdXJjZTo6a1NpbmdsZXRvbkluc3RhbmNlSWQgPSAwOwotCi1BMmRwU291cmNlOjpBMmRwU291cmNlKGNvbnN0IFV1aWQmIHV1aWQpIDogYXBwX2lkZW50aWZpZXJfKHV1aWQpIHsKLSAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCktPkFkZEEyZHBTb3VyY2VPYnNlcnZlcih0aGlzKTsKLX0KLQotQTJkcFNvdXJjZTo6fkEyZHBTb3VyY2UoKSB7Ci0gIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldCgpLT5SZW1vdmVBMmRwU291cmNlT2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLWNvbnN0IFV1aWQmIEEyZHBTb3VyY2U6OkdldEFwcElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBhcHBfaWRlbnRpZmllcl87IH0KLQotaW50IEEyZHBTb3VyY2U6OkdldEluc3RhbmNlSWQoKSBjb25zdCB7IHJldHVybiBrU2luZ2xldG9uSW5zdGFuY2VJZDsgfQotCi12b2lkIEEyZHBTb3VyY2U6OlNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSkgewotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBkZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKLX0KLQotYm9vbCBBMmRwU291cmNlOjpFbmFibGUoY29uc3Qgc3RkOjp2ZWN0b3I8QTJkcENvZGVjQ29uZmlnPiYgY29kZWNfcHJpb3JpdGllcykgewotICBhdXRvIGZsdW9yaWRlX3ByaW9yaXRpZXMgPSBDb2RlY0NvbmZpZ3NUb0ZsdW9yaWRlKGNvZGVjX3ByaW9yaXRpZXMpOwotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICByZXR1cm4gaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCktPkEyZHBTb3VyY2VFbmFibGUoCi0gICAgICBmbHVvcmlkZV9wcmlvcml0aWVzKTsKLX0KLQotdm9pZCBBMmRwU291cmNlOjpEaXNhYmxlKCkgewotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICBoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlOjpHZXQoKS0+QTJkcFNvdXJjZURpc2FibGUoKTsKLX0KLQotYm9vbCBBMmRwU291cmNlOjpDb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykgewotICBSYXdBZGRyZXNzIGFkZHIgPSBQQVJTRV9BRERSKGRldmljZV9hZGRyZXNzKTsKLSAgTG9ja0d1YXJkIGxvY2sobXV0ZXhfKTsKLSAgVFJZX1JFVF9GVU5DKAotICAgICAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCktPkdldEEyZHBTb3VyY2VIQUxJbnRlcmZhY2UoKS0+Y29ubmVjdCgKLSAgICAgICAgICBhZGRyKSA9PSBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQTJkcFNvdXJjZTo6RGlzY29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpIHsKLSAgUmF3QWRkcmVzcyBhZGRyID0gUEFSU0VfQUREUihkZXZpY2VfYWRkcmVzcyk7Ci0gIExvY2tHdWFyZCBsb2NrKG11dGV4Xyk7Ci0gIFRSWV9SRVRfRlVOQygKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldCgpLT5HZXRBMmRwU291cmNlSEFMSW50ZXJmYWNlKCktPmRpc2Nvbm5lY3QoCi0gICAgICAgICAgYWRkcikgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi1ib29sIEEyZHBTb3VyY2U6OkNvbmZpZ0NvZGVjKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxBMmRwQ29kZWNDb25maWc+JiBjb2RlY19wcmVmZXJlbmNlcykgewotICBSYXdBZGRyZXNzIGFkZHIgPSBQQVJTRV9BRERSKGRldmljZV9hZGRyZXNzKTsKLSAgYXV0byBmbHVvcmlkZV9wcmVmZXJlbmNlcyA9IENvZGVjQ29uZmlnc1RvRmx1b3JpZGUoY29kZWNfcHJlZmVyZW5jZXMpOwotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICBUUllfUkVUX0ZVTkMoaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgICAtPkdldEEyZHBTb3VyY2VIQUxJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAgIC0+Y29uZmlnX2NvZGVjKGFkZHIsIGZsdW9yaWRlX3ByZWZlcmVuY2VzKSA9PQotICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi12b2lkIEEyZHBTb3VyY2U6OkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKEJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpIHsKLSAgYXV0byBkZXZpY2VfYWRkcmVzcyA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIExvY2tHdWFyZCBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pCi0gICAgZGVsZWdhdGVfLT5PbkNvbm5lY3Rpb25TdGF0ZShkZXZpY2VfYWRkcmVzcywgc3RhdGljX2Nhc3Q8aW50PihzdGF0ZSkpOwotfQotCi12b2lkIEEyZHBTb3VyY2U6OkF1ZGlvU3RhdGVDYWxsYmFjayhCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIGF1dG8gZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKQotICAgIGRlbGVnYXRlXy0+T25BdWRpb1N0YXRlKGRldmljZV9hZGRyZXNzLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRlKSk7Ci19Ci0KLXZvaWQgQTJkcFNvdXJjZTo6QXVkaW9Db25maWdDYWxsYmFjaygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWdfZmx1b3JpZGUsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PgotICAgICAgICBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzX2ZsdW9yaWRlLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4KLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzX2ZsdW9yaWRlKSB7Ci0gIGF1dG8gZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotICBhdXRvIGNvZGVjX2NvbmZpZyA9IEZsdW9yaWRlQ29kZWNUb0NvZGVjKGNvZGVjX2NvbmZpZ19mbHVvcmlkZSk7Ci0gIGF1dG8gY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcyA9Ci0gICAgICBGbHVvcmlkZUNvZGVjc1RvQ29kZWMoY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllc19mbHVvcmlkZSk7Ci0gIGF1dG8gY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzID0KLSAgICAgIEZsdW9yaWRlQ29kZWNzVG9Db2RlYyhjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXNfZmx1b3JpZGUpOwotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKQotICAgIGRlbGVnYXRlXy0+T25BdWRpb0NvbmZpZyhkZXZpY2VfYWRkcmVzcywgY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotfQotCi1ib29sIEEyZHBTb3VyY2U6Ok1hbmRhdG9yeUNvZGVjUHJlZmVycmVkQ2FsbGJhY2soQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgTG9ja0d1YXJkIGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgLy8gRG8gbm90aGluZy4gT3B0aW9uYWwgY29kZWNzIGFyZSBwcmVmZXJyZWQgYnkgZGVmYXVsdC4KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBBMmRwU291cmNlRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotQTJkcFNvdXJjZUZhY3Rvcnk6OkEyZHBTb3VyY2VGYWN0b3J5KCkgPSBkZWZhdWx0OwotQTJkcFNvdXJjZUZhY3Rvcnk6On5BMmRwU291cmNlRmFjdG9yeSgpID0gZGVmYXVsdDsKLQotYm9vbCBBMmRwU291cmNlRmFjdG9yeTo6UmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckNhbGxiYWNrJiBjYWxsYmFjaykgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBVVUlEOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLQotICBhdXRvIGEyZHBfc291cmNlID0gYmFzZTo6V3JhcFVuaXF1ZShuZXcgQTJkcFNvdXJjZSh1dWlkKSk7Ci0gIGNhbGxiYWNrKEJMRV9TVEFUVVNfU1VDQ0VTUywgdXVpZCwgc3RkOjptb3ZlKGEyZHBfc291cmNlKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2EyZHBfc291cmNlLmggYi9zZXJ2aWNlL2EyZHBfc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTM5M2YuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9hMmRwX3NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2JsdWV0b290aF9pbnN0YW5jZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9hdl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQTJkcFNvdXJjZSA6IHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICBwcml2YXRlIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkEyZHBTb3VyY2VPYnNlcnZlciB7Ci0gcHVibGljOgotICAvLyBXZSBvbmx5IGFsbG93IG9uZSBpbnN0YW5jZSBvZiB0aGlzIG9iamVjdCBhdCBhIHRpbWUuCi0gIHN0YXRpYyBjb25zdCBpbnQga1NpbmdsZXRvbkluc3RhbmNlSWQ7Ci0KLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPbkF1ZGlvU3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgc3RhdGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25BdWRpb0NvbmZpZygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBBMmRwQ29kZWNDb25maWcgY29kZWNfY29uZmlnLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBMmRwQ29kZWNDb25maWc+JiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBMmRwQ29kZWNDb25maWc+JiBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgPSBkZWZhdWx0OwotICB9OwotCi0gIH5BMmRwU291cmNlKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gIC8vIEJsdWV0b290aEluc3RhbmNlIGltcGxlbWVudGF0aW9uOgotICBjb25zdCBVdWlkJiBHZXRBcHBJZGVudGlmaWVyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludCBHZXRJbnN0YW5jZUlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBFbmFibGUoY29uc3Qgc3RkOjp2ZWN0b3I8QTJkcENvZGVjQ29uZmlnPiYgY29kZWNfcHJpb3JpdGllcyk7Ci0gIHZvaWQgRGlzYWJsZSgpOwotICBib29sIENvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzKTsKLSAgYm9vbCBEaXNjb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcyk7Ci0gIGJvb2wgQ29uZmlnQ29kZWMoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEEyZHBDb2RlY0NvbmZpZz4mIGNvZGVjX3ByZWZlcmVuY2VzKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBBMmRwU291cmNlRmFjdG9yeTsKLQotICBleHBsaWNpdCBBMmRwU291cmNlKGNvbnN0IFV1aWQmIHV1aWQpOwotCi0gIC8vIGhhbDo6Ymx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlOjpPYnNlcnZlciBpbXBsZW1lbnRhdGlvbjoKLSAgdm9pZCBDb25uZWN0aW9uU3RhdGVDYWxsYmFjayhoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlKSBvdmVycmlkZTsKLSAgdm9pZCBBdWRpb1N0YXRlQ2FsbGJhY2soaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYXVkaW9fc3RhdGVfdCBzdGF0ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgQXVkaW9Db25maWdDYWxsYmFjaygKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+Ci0gICAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSBvdmVycmlkZTsKLSAgYm9vbCBNYW5kYXRvcnlDb2RlY1ByZWZlcnJlZENhbGxiYWNrKGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGU7Ci0KLSAgLy8gRm9yIHxHZXRBcHBJZGVudGlmaWVyfC4KLSAgY29uc3QgVXVpZCBhcHBfaWRlbnRpZmllcl87Ci0KLSAgc3RkOjptdXRleCBtdXRleF87Ci0KLSAgLy8gQSBzZWNvbmQgbXV0ZXggaXMgdXNlZCBvbmx5IGZvciB8ZGVsZWdhdGVffC4gV2UgY2Fubm90IHVzZSB8bXV0ZXhffCBiZWNhdXNlCi0gIC8vIGl0IG1heSBjYXVzZSBhIGRlYWRsb2NrIGlmIHRoZSBjYWxsZXIgYW5kIERlbGVnYXRlIGJvdGggdGFrZSB0aGUgc2FtZSBsb2NrCi0gIC8vICdjbG9jaycuCi0gIC8vIEluIHRoYXQgc2NlbmFyaW8sIHRoZSBjYWxsZXIgbWF5IHRha2UgJ2Nsb2NrJyBmaXJzdCBhbmQgd2lsbCB0cnkgdG8gdGFrZQotICAvLyB8bXV0ZXhffCBzZWNvbmQuIFRoZSBjYWxsYmFjayB3aWxsIHRha2UgfG11dGV4X3wgZmlyc3QgYW5kIGludm9rZSBhCi0gIC8vIGRlbGVnYXRlIGZ1bmN0aW9uIHdoaWNoIGF0dGVtcHRzIHRvIHRha2UgJ2Nsb2NrJy4KLSAgc3RkOjptdXRleCBkZWxlZ2F0ZV9tdXRleF87Ci0gIERlbGVnYXRlKiBkZWxlZ2F0ZV8gPSBudWxscHRyOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBMmRwU291cmNlKTsKLX07Ci0KLWNsYXNzIEEyZHBTb3VyY2VGYWN0b3J5IDogcHVibGljIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSB7Ci0gcHVibGljOgotICBBMmRwU291cmNlRmFjdG9yeSgpOwotICB+QTJkcFNvdXJjZUZhY3RvcnkoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhJbnN0YW5jZUZhY3Rvcnkgb3ZlcnJpZGU6Ci0gIGJvb2wgUmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEEyZHBTb3VyY2VGYWN0b3J5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvYWRhcHRlci5jYyBiL3NlcnZpY2UvYWRhcHRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwNDY4OC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2FkYXB0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MTIgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvb2JzZXJ2ZXJfbGlzdC5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiYWJzdHJhY3Rfb2JzZXJ2ZXJfbGlzdC5oIgotI2luY2x1ZGUgIm5vdHJlYWNoZWQuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2EyZHBfc2luay5oIgotI2luY2x1ZGUgInNlcnZpY2UvYTJkcF9zb3VyY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2F2cmNwX2NvbnRyb2wuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2F2cmNwX3RhcmdldC5oIgotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC91dGlsL2F0b21pY19zdHJpbmcuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2dhdHRfY2xpZW50LmgiCi0jaW5jbHVkZSAic2VydmljZS9nYXR0X3NlcnZlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInNlcnZpY2UvbG93X2VuZXJneV9hZHZlcnRpc2VyLmgiCi0jaW5jbHVkZSAic2VydmljZS9sb3dfZW5lcmd5X2NsaWVudC5oIgotI2luY2x1ZGUgInNlcnZpY2UvbG93X2VuZXJneV9zY2FubmVyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgc3RkOjpsb2NrX2d1YXJkOwotdXNpbmcgc3RkOjptdXRleDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLVJlbW90ZURldmljZVByb3BzIFBhcnNlUmVtb3RlRGV2aWNlUHJvcHMoaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gIHN0ZDo6c3RyaW5nIGFkZHJlc3M7Ci0gIHN0ZDo6dmVjdG9yPFV1aWQ+IHNlcnZpY2VfdXVpZHM7Ci0gIGludDMyX3QgZGV2aWNlX2NsYXNzID0gMDsKLSAgaW50MzJfdCBkZXZpY2VfdHlwZSA9IDA7Ci0gIGludDMyX3QgcnNzaSA9IDA7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcHJvcGVydGllczsgKytpKSB7Ci0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0aWVzICsgaTsKLSAgICBzd2l0Y2ggKHByb3BlcnR5LT50eXBlKSB7Ci0gICAgICBjYXNlIEJUX1BST1BFUlRZX0JETkFNRTogewotICAgICAgICBpZiAocHJvcGVydHktPmxlbiA8IDApIHsKLSAgICAgICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgbGVuZ3RoIGZvciBCVF9QUk9QRVJUWV9CRE5BTUUiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJ0X2JkbmFtZV90KiBoYWxfbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8YnRfYmRuYW1lX3QqPihwcm9wZXJ0eS0+dmFsKTsKLSAgICAgICAgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGhhbF9uYW1lLT5uYW1lKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJUX1BST1BFUlRZX0JEQUREUjogewotICAgICAgICBpZiAocHJvcGVydHktPmxlbiAhPSBzaXplb2YoUmF3QWRkcmVzcykpIHsKLSAgICAgICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgbGVuZ3RoIGZvciBCVF9QUk9QRVJUWV9CREFERFIiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGFkZHJlc3MgPSBCdEFkZHJTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxSYXdBZGRyZXNzKj4ocHJvcGVydHktPnZhbCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQlRfUFJPUEVSVFlfVVVJRFM6IHsKLSAgICAgICAgaWYgKHByb3BlcnR5LT5sZW4gPCAwKSB7Ci0gICAgICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJOZWdhdGl2ZSBsZW5ndGggb24gQlRfUFJPUEVSVFlfVVVJRFM6IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHktPmxlbiAlIHNpemVvZihVdWlkKSAhPSAwKSB7Ci0gICAgICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJUcmFpbGluZyBieXRlcyBvbiBCVF9QUk9QRVJUWV9VVUlEUzoiOwotICAgICAgICB9Ci0gICAgICAgIGF1dG8gdXVpZHMgPSBzdGF0aWNfY2FzdDxjb25zdCBVdWlkKj4ocHJvcGVydHktPnZhbCk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm9wZXJ0eS0+bGVuIC8gc2l6ZW9mKFV1aWQpOyArK2kpIHsKLSAgICAgICAgICBzZXJ2aWNlX3V1aWRzLnB1c2hfYmFjayh1dWlkc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRTogewotICAgICAgICBpZiAocHJvcGVydHktPmxlbiAhPSBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgbGVuZ3RoIGZvciBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRldmljZV9jbGFzcyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihwcm9wZXJ0eS0+dmFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFOiB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS0+bGVuICE9IHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgIE5PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBsZW5ndGggZm9yIEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VfdHlwZSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihwcm9wZXJ0eS0+dmFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJUX1BST1BFUlRZX1JFTU9URV9SU1NJOiB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS0+bGVuICE9IHNpemVvZihpbnQ4X3QpKSB7Ci0gICAgICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIGxlbmd0aCBmb3IgQlRfUFJPUEVSVFlfUkVNT1RFX1JTU0kiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJzc2kgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihwcm9wZXJ0eS0+dmFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBWTE9HKDEpIDw8ICJVbmhhbmRsZWQgYWRhcHRlciBwcm9wZXJ0eTogIgotICAgICAgICAgICAgICAgIDw8IEJ0UHJvcGVydHlUZXh0KHByb3BlcnR5LT50eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIFJlbW90ZURldmljZVByb3BzKG5hbWUsIGFkZHJlc3MsIHNlcnZpY2VfdXVpZHMsIGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlLCByc3NpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotY29uc3QgY2hhciBBZGFwdGVyOjprRGVmYXVsdEFkZHJlc3NbXSA9ICIwMDowMDowMDowMDowMDowMCI7Ci0vLyBzdGF0aWMKLWNvbnN0IGNoYXIgQWRhcHRlcjo6a0RlZmF1bHROYW1lW10gPSAibm90LWluaXRpYWxpemVkIjsKLQotLy8gVE9ETyhhcm1hbnNpdG8pOiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBjb21lIHN0cmFpZ2h0IGZyb20KLS8vIHBhY2thZ2VzL2FwcHMvQmx1ZXRvb3RoL3NyYy9jL2EvYi9idHNlcnZpY2UvQWRhcHRlclNlcnZpY2UuamF2YS4gSXQgd291bGQgYmUKLS8vIG5pY2UgdG8ga25vdyBpZiB0aGVyZSB3ZXJlIGEgd2F5IHRvIG9idGFpbiB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sKLS8vIGluc3RlYWQgb2YgaGFyZGNvZGluZyB0aGVtIGhlcmUuCi0KLS8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiBhZHZlcnRpc2luZyBpbnN0YW5jZXMgcmVxdWlyZWQgZm9yIG11bHRpLWFkdmVydGlzZW1lbnQKLS8vIHN1cHBvcnQuCi1jb25zdCBpbnQga01pbkFkdkluc3RhbmNlc0Zvck11bHRpQWR2ID0gNTsKLQotLy8gVXNlZCB3aGVuIGRldGVybWluaW5nIGlmIG9mZmxvYWRlZCBzY2FuIGZpbHRlcmluZyBpcyBzdXBwb3J0ZWQuCi1jb25zdCBpbnQga01pbk9mZmxvYWRlZEZpbHRlcnMgPSAxMDsKLQotLy8gVXNlZCB3aGVuIGRldGVybWluaW5nIGlmIG9mZmxvYWRlZCBzY2FuIGJhdGNoaW5nIGlzIHN1cHBvcnRlZC4KLWNvbnN0IGludCBrTWluT2ZmbG9hZGVkU2NhblN0b3JhZ2VCeXRlcyA9IDEwMjQ7Ci0KLXZvaWQgQWRhcHRlcjo6T2JzZXJ2ZXI6Ok9uQWRhcHRlclN0YXRlQ2hhbmdlZChBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZSBwcmV2X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZSBuZXdfc3RhdGUpIHsKLSAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLX0KLQotdm9pZCBBZGFwdGVyOjpPYnNlcnZlcjo6T25EZXZpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKAotICAgIEFkYXB0ZXIqIGFkYXB0ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgYm9vbCBjb25uZWN0ZWQpIHsKLSAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLX0KLQotdm9pZCBBZGFwdGVyOjpPYnNlcnZlcjo6T25TY2FuRW5hYmxlQ2hhbmdlZChBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjYW5fZW5hYmxlZCkgewotICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotfQotCi12b2lkIEFkYXB0ZXI6Ok9ic2VydmVyOjpPblNzcFJlcXVlc3QoQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lLCBpbnQgY29kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWlyaW5nX3ZhcmlhbnQsIGludCBwYXNzX2tleSkgewotICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotfQotCi12b2lkIEFkYXB0ZXI6Ok9ic2VydmVyOjpPbkJvbmRTdGF0ZUNoYW5nZWQoQWRhcHRlciogYWRhcHRlciwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlKSB7Ci0gIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nCi19Ci0KLXZvaWQgQWRhcHRlcjo6T2JzZXJ2ZXI6Ok9uR2V0Qm9uZGVkRGV2aWNlcygKLSAgICBBZGFwdGVyKiBhZGFwdGVyLCBpbnQgc3RhdHVzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYm9uZGVkX2RldmljZXMpIHsKLSAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLX0KLQotdm9pZCBBZGFwdGVyOjpPYnNlcnZlcjo6T25HZXRSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzKAotICAgIEFkYXB0ZXIqIGFkYXB0ZXIsIGludCBzdGF0dXMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICBjb25zdCBSZW1vdGVEZXZpY2VQcm9wcyYgcHJvcGVydGllcykgewotICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotfQotCi12b2lkIEFkYXB0ZXI6Ok9ic2VydmVyOjpPbkRldmljZUZvdW5kKEFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbW90ZURldmljZVByb3BzJiBwcm9wZXJ0aWVzKSB7Ci0gIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nCi19Ci0KLS8vIFRoZSByZWFsIEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gdXNlZCBpbiBwcm9kdWN0aW9uLgotY2xhc3MgQWRhcHRlckltcGwgOiBwdWJsaWMgQWRhcHRlciwgcHVibGljIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpPYnNlcnZlciB7Ci0gcHVibGljOgotICBBZGFwdGVySW1wbCgpCi0gICAgICA6IHN0YXRlXyhBREFQVEVSX1NUQVRFX09GRiksCi0gICAgICAgIGFkZHJlc3NfKGtEZWZhdWx0QWRkcmVzcyksCi0gICAgICAgIG5hbWVfKGtEZWZhdWx0TmFtZSkgewotICAgIG1lbXNldCgmbG9jYWxfbGVfZmVhdHVyZXNfLCAwLCBzaXplb2YobG9jYWxfbGVfZmVhdHVyZXNfKSk7Ci0gICAgaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkdldCgpLT5BZGRPYnNlcnZlcih0aGlzKTsKLSAgICBhMmRwX3NpbmtfZmFjdG9yeV8ucmVzZXQobmV3IEEyZHBTaW5rRmFjdG9yeSk7Ci0gICAgYTJkcF9zb3VyY2VfZmFjdG9yeV8ucmVzZXQobmV3IEEyZHBTb3VyY2VGYWN0b3J5KTsKLSAgICBhdnJjcF9jb250cm9sX2ZhY3RvcnlfLnJlc2V0KG5ldyBBdnJjcENvbnRyb2xGYWN0b3J5KTsKLSAgICBhdnJjcF90YXJnZXRfZmFjdG9yeV8ucmVzZXQobmV3IEF2cmNwVGFyZ2V0RmFjdG9yeSk7Ci0gICAgYmxlX2NsaWVudF9mYWN0b3J5Xy5yZXNldChuZXcgTG93RW5lcmd5Q2xpZW50RmFjdG9yeSgqdGhpcykpOwotICAgIGJsZV9hZHZlcnRpc2VyX2ZhY3RvcnlfLnJlc2V0KG5ldyBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSgpKTsKLSAgICBibGVfc2Nhbm5lcl9mYWN0b3J5Xy5yZXNldChuZXcgTG93RW5lcmd5U2Nhbm5lckZhY3RvcnkoKnRoaXMpKTsKLSAgICBnYXR0X2NsaWVudF9mYWN0b3J5Xy5yZXNldChuZXcgR2F0dENsaWVudEZhY3RvcnkoKSk7Ci0gICAgZ2F0dF9zZXJ2ZXJfZmFjdG9yeV8ucmVzZXQobmV3IEdhdHRTZXJ2ZXJGYWN0b3J5KCkpOwotICAgIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMSW50ZXJmYWNlKCktPmdldF9hZGFwdGVyX3Byb3BlcnRpZXMoKTsKLSAgfQotCi0gIH5BZGFwdGVySW1wbCgpIG92ZXJyaWRlIHsKLSAgICBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6R2V0KCktPlJlbW92ZU9ic2VydmVyKHRoaXMpOwotICB9Ci0KLSAgdm9pZCBBZGRPYnNlcnZlcihBZGFwdGVyOjpPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG9ic2VydmVyc19sb2NrXyk7Ci0gICAgb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICB2b2lkIFJlbW92ZU9ic2VydmVyKEFkYXB0ZXI6Ok9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sob2JzZXJ2ZXJzX2xvY2tfKTsKLSAgICBvYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIEFkYXB0ZXJTdGF0ZSBHZXRTdGF0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRlXy5sb2FkKCk7IH0KLQotICBib29sIElzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRlXy5sb2FkKCkgPT0gQURBUFRFUl9TVEFURV9PTjsgfQotCi0gIGJvb2wgRW5hYmxlKCkgb3ZlcnJpZGUgewotICAgIEFkYXB0ZXJTdGF0ZSBjdXJyZW50X3N0YXRlID0gR2V0U3RhdGUoKTsKLSAgICBpZiAoY3VycmVudF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX09GRikgewotICAgICAgTE9HKElORk8pIDw8ICJBZGFwdGVyIG5vdCBkaXNhYmxlZCAtIHN0YXRlOiAiCi0gICAgICAgICAgICAgICAgPDwgQWRhcHRlclN0YXRlVG9TdHJpbmcoY3VycmVudF9zdGF0ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBzdGF0ZSBiZWZvcmUgY2FsbGluZyBlbmFibGUoKSBhcyB0aGVyZSBtaWdodCBiZSBhIHJhY2UgYmV0d2VlbgotICAgIC8vIGhlcmUgYW5kIHRoZSBBZGFwdGVyU3RhdGVDaGFuZ2VkQ2FsbGJhY2suCi0gICAgc3RhdGVfID0gQURBUFRFUl9TVEFURV9UVVJOSU5HX09OOwotICAgIE5vdGlmeUFkYXB0ZXJTdGF0ZUNoYW5nZWQoY3VycmVudF9zdGF0ZSwgc3RhdGVfKTsKLQotICAgIGludCBzdGF0dXMgPSBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6R2V0KCktPkdldEhBTEludGVyZmFjZSgpLT5lbmFibGUoKTsKLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZW5hYmxlIEJsdWV0b290aCAtIHN0YXR1czogIgotICAgICAgICAgICAgICAgICA8PCBCdFN0YXR1c1RleHQoKGNvbnN0IGJ0X3N0YXR1c190KXN0YXR1cyk7Ci0gICAgICBzdGF0ZV8gPSBBREFQVEVSX1NUQVRFX09GRjsKLSAgICAgIE5vdGlmeUFkYXB0ZXJTdGF0ZUNoYW5nZWQoQURBUFRFUl9TVEFURV9UVVJOSU5HX09OLCBzdGF0ZV8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBEaXNhYmxlKCkgb3ZlcnJpZGUgewotICAgIGlmICghSXNFbmFibGVkKCkpIHsKLSAgICAgIExPRyhJTkZPKSA8PCAiQWRhcHRlciBpcyBub3QgZW5hYmxlZCI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQWRhcHRlclN0YXRlIGN1cnJlbnRfc3RhdGUgPSBHZXRTdGF0ZSgpOwotCi0gICAgLy8gU2V0IHRoZSBzdGF0ZSBiZWZvcmUgY2FsbGluZyBlbmFibGUoKSBhcyB0aGVyZSBtaWdodCBiZSBhIHJhY2UgYmV0d2VlbgotICAgIC8vIGhlcmUgYW5kIHRoZSBBZGFwdGVyU3RhdGVDaGFuZ2VkQ2FsbGJhY2suCi0gICAgc3RhdGVfID0gQURBUFRFUl9TVEFURV9UVVJOSU5HX09GRjsKLSAgICBOb3RpZnlBZGFwdGVyU3RhdGVDaGFuZ2VkKGN1cnJlbnRfc3RhdGUsIHN0YXRlXyk7Ci0KLSAgICBpbnQgc3RhdHVzID0gaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkdldCgpLT5HZXRIQUxJbnRlcmZhY2UoKS0+ZGlzYWJsZSgpOwotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBkaXNhYmxlIEJsdWV0b290aCAtIHN0YXR1czogIgotICAgICAgICAgICAgICAgICA8PCBCdFN0YXR1c1RleHQoKGNvbnN0IGJ0X3N0YXR1c190KXN0YXR1cyk7Ci0gICAgICBzdGF0ZV8gPSBjdXJyZW50X3N0YXRlOwotICAgICAgTm90aWZ5QWRhcHRlclN0YXRlQ2hhbmdlZChBREFQVEVSX1NUQVRFX1RVUk5JTkdfT0ZGLCBzdGF0ZV8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG5hbWVfLkdldCgpOyB9Ci0KLSAgYm9vbCBTZXROYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBvdmVycmlkZSB7Ci0gICAgYnRfYmRuYW1lX3QgaGFsX25hbWU7Ci0gICAgc2l6ZV90IG1heF9uYW1lX2xlbiA9IHNpemVvZihoYWxfbmFtZS5uYW1lKTsKLQotICAgIC8vIEluY2x1ZGUgdGhlIFwwIGJ5dGUgaW4gc2l6ZSBtZWFzdXJlbWVudC4KLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+PSBtYXhfbmFtZV9sZW4pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkdpdmVuIG5hbWUgXCIiIDw8IG5hbWUgPDwgIlwiIGlzIGxhcmdlciB0aGFuIG1heGltdW0iCi0gICAgICAgICAgICAgICAgIDw8ICIgYWxsb3dlZCBzaXplOiAiIDw8IG1heF9uYW1lX2xlbjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHJuY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGhhbF9uYW1lLm5hbWUpLCBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgICBuYW1lLmxlbmd0aCgpICsgMSk7Ci0KLSAgICBWTE9HKDEpIDw8ICJTZXR0aW5nIGFkYXB0ZXIgbmFtZTogIiA8PCBuYW1lOwotCi0gICAgaWYgKCFTZXRBZGFwdGVyUHJvcGVydHkoQlRfUFJPUEVSVFlfQkROQU1FLCAmaGFsX25hbWUsIHNpemVvZihoYWxfbmFtZSkpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IGFkYXB0ZXIgbmFtZTogIiA8PCBuYW1lOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgR2V0QWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGFkZHJlc3NfLkdldCgpOyB9Ci0KLSAgYm9vbCBTZXRTY2FuTW9kZShpbnQgc2Nhbl9tb2RlKSBvdmVycmlkZSB7Ci0gICAgc3dpdGNoIChzY2FuX21vZGUpIHsKLSAgICAgIGNhc2UgQlRfU0NBTl9NT0RFX05PTkU6Ci0gICAgICBjYXNlIEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRToKLSAgICAgIGNhc2UgQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRToKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHNjYW4gbW9kZTogIiA8PCBzY2FuX21vZGU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhdXRvIGJkX3NjYW5tb2RlID0gc3RhdGljX2Nhc3Q8YnRfc2Nhbl9tb2RlX3Q+KHNjYW5fbW9kZSk7Ci0KLSAgICBpZiAoIVNldEFkYXB0ZXJQcm9wZXJ0eShCVF9QUk9QRVJUWV9BREFQVEVSX1NDQU5fTU9ERSwgJmJkX3NjYW5tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiZF9zY2FubW9kZSkpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHNjYW4gbW9kZSB0byA6ICIgPDwgc2Nhbl9tb2RlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBTZXRTY2FuRW5hYmxlKGJvb2wgc2Nhbl9lbmFibGUpIG92ZXJyaWRlIHsKLSAgICBpZiAoc2Nhbl9lbmFibGUpIHsKLSAgICAgIGludCBzdGF0dXMgPQotICAgICAgICAgIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMSW50ZXJmYWNlKCktPnN0YXJ0X2Rpc2NvdmVyeSgpOwotICAgICAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZW5hYmxlIHNjYW5uaW5nIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpbnQgc3RhdHVzID0KLSAgICAgICAgICBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6R2V0KCktPkdldEhBTEludGVyZmFjZSgpLT5jYW5jZWxfZGlzY292ZXJ5KCk7Ci0gICAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBkaXNhYmxlIHNjYW5uaW5nIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgU3NwUmVwbHkoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgdmFyaWFudCwgYm9vbCBhY2NlcHQsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwYXNzX2tleSkgb3ZlcnJpZGUgewotICAgIFJhd0FkZHJlc3MgYWRkcjsKLSAgICBpZiAoIVJhd0FkZHJlc3M6OkZyb21TdHJpbmcoZGV2aWNlX2FkZHJlc3MsIGFkZHIpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludCBzdGF0dXMgPSBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6R2V0KCktPkdldEhBTEludGVyZmFjZSgpLT5zc3BfcmVwbHkoCi0gICAgICAgICZhZGRyLCBzdGF0aWNfY2FzdDxidF9zc3BfdmFyaWFudF90Pih2YXJpYW50KSwgYWNjZXB0LCBwYXNzX2tleSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgU1NQIHJlc3BvbnNlIC0gc3RhdHVzOiAiCi0gICAgICAgICAgICAgICAgIDw8IEJ0U3RhdHVzVGV4dCgoY29uc3QgYnRfc3RhdHVzX3Qpc3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgQ3JlYXRlQm9uZChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCB0cmFuc3BvcnQpIG92ZXJyaWRlIHsKLSAgICBSYXdBZGRyZXNzIGFkZHI7Ci0gICAgaWYgKCFSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGRldmljZV9hZGRyZXNzLCBhZGRyKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBkZXZpY2UgYWRkcmVzcyBnaXZlbjogIiA8PCBkZXZpY2VfYWRkcmVzczsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQgc3RhdHVzID0gaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkdldCgpLT5HZXRIQUxJbnRlcmZhY2UoKS0+Y3JlYXRlX2JvbmQoCi0gICAgICAgICZhZGRyLCB0cmFuc3BvcnQpOwotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYm9uZCAtIHN0YXR1czogIgotICAgICAgICAgICAgICAgICA8PCBCdFN0YXR1c1RleHQoKGNvbnN0IGJ0X3N0YXR1c190KXN0YXR1cyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIElzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKCkgb3ZlcnJpZGUgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobG9jYWxfbGVfZmVhdHVyZXNfbG9ja18pOwotICAgIHJldHVybiBsb2NhbF9sZV9mZWF0dXJlc18ubWF4X2Fkdl9pbnN0YW5jZSA+PSBrTWluQWR2SW5zdGFuY2VzRm9yTXVsdGlBZHY7Ci0gIH0KLQotICBib29sIElzRGV2aWNlQ29ubmVjdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2soY29ubmVjdGVkX2RldmljZXNfbG9ja18pOwotICAgIHJldHVybiBjb25uZWN0ZWRfZGV2aWNlc18uZmluZChkZXZpY2VfYWRkcmVzcykgIT0gY29ubmVjdGVkX2RldmljZXNfLmVuZCgpOwotICB9Ci0KLSAgaW50IEdldFRvdGFsTnVtYmVyT2ZUcmFja2FibGVBZHZlcnRpc2VtZW50cygpIG92ZXJyaWRlIHsKLSAgICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKGxvY2FsX2xlX2ZlYXR1cmVzX2xvY2tfKTsKLSAgICByZXR1cm4gbG9jYWxfbGVfZmVhdHVyZXNfLnRvdGFsX3RyYWNrYWJsZV9hZHZlcnRpc2VyczsKLSAgfQotCi0gIGJvb2wgSXNPZmZsb2FkZWRGaWx0ZXJpbmdTdXBwb3J0ZWQoKSBvdmVycmlkZSB7Ci0gICAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhsb2NhbF9sZV9mZWF0dXJlc19sb2NrXyk7Ci0gICAgcmV0dXJuIGxvY2FsX2xlX2ZlYXR1cmVzXy5tYXhfYWR2X2ZpbHRlcl9zdXBwb3J0ZWQgPj0ga01pbk9mZmxvYWRlZEZpbHRlcnM7Ci0gIH0KLQotICBib29sIElzT2ZmbG9hZGVkU2NhbkJhdGNoaW5nU3VwcG9ydGVkKCkgb3ZlcnJpZGUgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobG9jYWxfbGVfZmVhdHVyZXNfbG9ja18pOwotICAgIHJldHVybiBsb2NhbF9sZV9mZWF0dXJlc18uc2Nhbl9yZXN1bHRfc3RvcmFnZV9zaXplID49Ci0gICAgICAgICAgIGtNaW5PZmZsb2FkZWRTY2FuU3RvcmFnZUJ5dGVzOwotICB9Ci0KLSAgYm9vbCBHZXRCb25kZWREZXZpY2VzKCkgb3ZlcnJpZGUgewotICAgIGludCBzdGF0dXMgPQotICAgICAgICBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6R2V0KCktPkdldEhBTEludGVyZmFjZSgpLT5nZXRfYWRhcHRlcl9wcm9wZXJ0eSgKLSAgICAgICAgICAgIEJUX1BST1BFUlRZX0FEQVBURVJfQk9OREVEX0RFVklDRVMpOwotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgYm9uZGVkIGRldmljZXMuIFN0YXR1czogIgotICAgICAgICAgICAgICAgICA8PCBCdFN0YXR1c1RleHQoc3RhdGljX2Nhc3Q8YnRfc3RhdHVzX3Q+KHN0YXR1cykpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBSZW1vdmVCb25kKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykgb3ZlcnJpZGUgewotICAgIFJhd0FkZHJlc3MgYWRkcjsKLSAgICBpZiAoIVJhd0FkZHJlc3M6OkZyb21TdHJpbmcoZGV2aWNlX2FkZHJlc3MsIGFkZHIpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludCBzdGF0dXMgPQotICAgICAgICBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6R2V0KCktPkdldEhBTEludGVyZmFjZSgpLT5yZW1vdmVfYm9uZCgmYWRkcik7Ci0gICAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgcmVtb3ZlIGJvbmQgLSBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgICAgPDwgQnRTdGF0dXNUZXh0KHN0YXRpY19jYXN0PGJ0X3N0YXR1c190PihzdGF0dXMpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcyhjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpIG92ZXJyaWRlIHsKLSAgICBSYXdBZGRyZXNzIGFkZHI7Ci0gICAgaWYgKCFSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGRldmljZV9hZGRyZXNzLCBhZGRyKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBkZXZpY2UgYWRkcmVzcyBnaXZlbjogIiA8PCBkZXZpY2VfYWRkcmVzczsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQgc3RhdHVzID0gaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgICAgICAgICAgICAtPkdldEhBTEludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAtPmdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMoJmFkZHIpOwotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZW5kIEdldFJlbW90ZURldmljZVByb3BlcnRpZXMgLSBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgICAgPDwgQnRTdGF0dXNUZXh0KChjb25zdCBidF9zdGF0dXNfdClzdGF0dXMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQTJkcFNpbmtGYWN0b3J5KiBHZXRBMmRwU2lua0ZhY3RvcnkoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGEyZHBfc2lua19mYWN0b3J5Xy5nZXQoKTsKLSAgfQotCi0gIEEyZHBTb3VyY2VGYWN0b3J5KiBHZXRBMmRwU291cmNlRmFjdG9yeSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYTJkcF9zb3VyY2VfZmFjdG9yeV8uZ2V0KCk7Ci0gIH0KLQotICBBdnJjcENvbnRyb2xGYWN0b3J5KiBHZXRBdnJjcENvbnRyb2xGYWN0b3J5KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBhdnJjcF9jb250cm9sX2ZhY3RvcnlfLmdldCgpOwotICB9Ci0KLSAgQXZyY3BUYXJnZXRGYWN0b3J5KiBHZXRBdnJjcFRhcmdldEZhY3RvcnkoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGF2cmNwX3RhcmdldF9mYWN0b3J5Xy5nZXQoKTsKLSAgfQotCi0gIExvd0VuZXJneUNsaWVudEZhY3RvcnkqIEdldExvd0VuZXJneUNsaWVudEZhY3RvcnkoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGJsZV9jbGllbnRfZmFjdG9yeV8uZ2V0KCk7Ci0gIH0KLQotICBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSogR2V0TGVBZHZlcnRpc2VyRmFjdG9yeSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYmxlX2FkdmVydGlzZXJfZmFjdG9yeV8uZ2V0KCk7Ci0gIH0KLQotICBMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeSogR2V0TGVTY2FubmVyRmFjdG9yeSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gYmxlX3NjYW5uZXJfZmFjdG9yeV8uZ2V0KCk7Ci0gIH0KLQotICBHYXR0Q2xpZW50RmFjdG9yeSogR2V0R2F0dENsaWVudEZhY3RvcnkoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGdhdHRfY2xpZW50X2ZhY3RvcnlfLmdldCgpOwotICB9Ci0KLSAgR2F0dFNlcnZlckZhY3RvcnkqIEdldEdhdHRTZXJ2ZXJGYWN0b3J5KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBnYXR0X3NlcnZlcl9mYWN0b3J5Xy5nZXQoKTsKLSAgfQotCi0gIC8vIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpPYnNlcnZlciBvdmVycmlkZXMuCi0gIHZvaWQgQWRhcHRlclN0YXRlQ2hhbmdlZENhbGxiYWNrKGJ0X3N0YXRlX3Qgc3RhdGUpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgIkFkYXB0ZXIgc3RhdGUgY2hhbmdlZDogIiA8PCBCdFN0YXRlVGV4dChzdGF0ZSk7Ci0KLSAgICBBZGFwdGVyU3RhdGUgcHJldl9zdGF0ZSA9IEdldFN0YXRlKCk7Ci0KLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICBjYXNlIEJUX1NUQVRFX09GRjoKLSAgICAgICAgc3RhdGVfID0gQURBUFRFUl9TVEFURV9PRkY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUX1NUQVRFX09OOgotICAgICAgICBzdGF0ZV8gPSBBREFQVEVSX1NUQVRFX09OOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTk9UUkVBQ0hFRCgpOwotICAgIH0KLQotICAgIE5vdGlmeUFkYXB0ZXJTdGF0ZUNoYW5nZWQocHJldl9zdGF0ZSwgR2V0U3RhdGUoKSk7Ci0gIH0KLQotICB2b2lkIEFkYXB0ZXJQcm9wZXJ0aWVzQ2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLCBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8ICJBZGFwdGVyIHByb3BlcnRpZXMgY2hhbmdlZCI7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJzdGF0dXM6ICIgPDwgQnRTdGF0dXNUZXh0KHN0YXR1cyk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3Byb3BlcnRpZXM7ICsraSkgewotICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSA9IHByb3BlcnRpZXMgKyBpOwotICAgICAgICBpZiAocHJvcGVydHktPnR5cGUgPT0gQlRfUFJPUEVSVFlfQURBUFRFUl9CT05ERURfREVWSUNFUykgewotICAgICAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sob2JzZXJ2ZXJzX2xvY2tfKTsKLSAgICAgICAgICBmb3IgKGF1dG8mIG9ic2VydmVyIDogb2JzZXJ2ZXJzXykgewotICAgICAgICAgICAgb2JzZXJ2ZXIuT25HZXRCb25kZWREZXZpY2VzKHRoaXMsIHN0YXR1cywge30pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3Byb3BlcnRpZXM7IGkrKykgewotICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBwcm9wZXJ0aWVzICsgaTsKLSAgICAgIHN3aXRjaCAocHJvcGVydHktPnR5cGUpIHsKLSAgICAgICAgY2FzZSBCVF9QUk9QRVJUWV9CREFERFI6IHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBhZGRyZXNzID0KLSAgICAgICAgICAgICAgQnRBZGRyU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8UmF3QWRkcmVzcyo+KHByb3BlcnR5LT52YWwpKTsKLSAgICAgICAgICBMT0coSU5GTykgPDwgIkFkYXB0ZXIgYWRkcmVzcyBjaGFuZ2VkOiAiIDw8IGFkZHJlc3M7Ci0gICAgICAgICAgYWRkcmVzc18uU2V0KGFkZHJlc3MpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQlRfUFJPUEVSVFlfQkROQU1FOiB7Ci0gICAgICAgICAgYnRfYmRuYW1lX3QqIGhhbF9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxidF9iZG5hbWVfdCo+KHByb3BlcnR5LT52YWwpOwotICAgICAgICAgIGlmIChoYWxfbmFtZSkgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGhhbF9uYW1lLT5uYW1lKTsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQWRhcHRlciBuYW1lIGNoYW5nZWQ6ICIgPDwgbmFtZTsKLSAgICAgICAgICAgIG5hbWVfLlNldChuYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9MRV9GRUFUVVJFUzogewotICAgICAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobG9jYWxfbGVfZmVhdHVyZXNfbG9ja18pOwotICAgICAgICAgIGlmIChwcm9wZXJ0eS0+bGVuICE9IHNpemVvZihidF9sb2NhbF9sZV9mZWF0dXJlc190KSkgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJNYWxmb3JtZWQgdmFsdWUgcmVjZWl2ZWQgZm9yIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkJUX1BST1BFUlRZX0xPQ0FMX0xFX0ZFQVRVUkVTIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBidF9sb2NhbF9sZV9mZWF0dXJlc190KiBmZWF0dXJlcyA9Ci0gICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YnRfbG9jYWxfbGVfZmVhdHVyZXNfdCo+KHByb3BlcnR5LT52YWwpOwotICAgICAgICAgIG1lbWNweSgmbG9jYWxfbGVfZmVhdHVyZXNfLCBmZWF0dXJlcywgc2l6ZW9mKCpmZWF0dXJlcykpOwotICAgICAgICAgIExPRyhJTkZPKSA8PCAiU3VwcG9ydGVkIExFIGZlYXR1cmVzIHVwZGF0ZWQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQlRfUFJPUEVSVFlfQURBUFRFUl9CT05ERURfREVWSUNFUzogewotICAgICAgICAgIGlmIChwcm9wZXJ0eS0+bGVuIDwgMCkgewotICAgICAgICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJOZWdhdGl2ZSBwcm9wZXJ0eSBsZW5ndGgiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGF1dG8gYWRkcnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFJhd0FkZHJlc3MqPihwcm9wZXJ0eS0+dmFsKTsKLSAgICAgICAgICBpZiAocHJvcGVydHktPmxlbiAlIHNpemVvZihhZGRyc1swXSkgIT0gMCkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBwcm9wZXJ0eSBsZW5ndGg6ICIgPDwgcHJvcGVydHktPmxlbjsKLSAgICAgICAgICAgIC8vIFRPRE8oYmNmKTogU2VlbXMgdG8gYmUgYSBidWcgd2hlcmUgd2UgaGl0IHRoaXMgc29tZXdoYXQKLSAgICAgICAgICAgIC8vIGZyZXF1ZW50bHkuCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cl9hZGRyczsKLQotICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvcGVydHktPmxlbiAvIHNpemVvZihhZGRyc1swXSk7ICsraSkKLSAgICAgICAgICAgIHN0cl9hZGRycy5wdXNoX2JhY2soQnRBZGRyU3RyaW5nKGFkZHJzICsgaSkpOwotCi0gICAgICAgICAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhvYnNlcnZlcnNfbG9ja18pOwotICAgICAgICAgIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBvYnNlcnZlcnNfKSB7Ci0gICAgICAgICAgICBvYnNlcnZlci5PbkdldEJvbmRlZERldmljZXModGhpcywgc3RhdHVzLCBzdHJfYWRkcnMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIFZMT0coMSkgPDwgIlVuaGFuZGxlZCBhZGFwdGVyIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICA8PCBCdFByb3BlcnR5VGV4dChwcm9wZXJ0eS0+dHlwZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRPRE8oYXJtYW5zaXRvKTogbm90aWZ5IG90aGVycyBvZiB0aGUgdXBkYXRlZCBwcm9wZXJ0aWVzCi0gICAgfQotICB9Ci0KLSAgdm9pZCBSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiByZW1vdGVfYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzcyA9IEJ0QWRkclN0cmluZyhyZW1vdGVfYmRhZGRyKTsKLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG9ic2VydmVyc19sb2NrXyk7Ci0gICAgICBmb3IgKGF1dG8mIG9ic2VydmVyIDogb2JzZXJ2ZXJzXykgewotICAgICAgICBvYnNlcnZlci5PbkdldFJlbW90ZURldmljZVByb3BlcnRpZXModGhpcywgc3RhdHVzLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZURldmljZVByb3BzKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJlbW90ZURldmljZVByb3BzIHByb3BzID0KLSAgICAgICAgUGFyc2VSZW1vdGVEZXZpY2VQcm9wcyhudW1fcHJvcGVydGllcywgcHJvcGVydGllcyk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhZGRyZXNzID0gQnRBZGRyU3RyaW5nKHJlbW90ZV9iZGFkZHIpOwotICAgIHByb3BzLnNldF9hZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhvYnNlcnZlcnNfbG9ja18pOwotICAgIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBvYnNlcnZlcnNfKSB7Ci0gICAgICBvYnNlcnZlci5PbkdldFJlbW90ZURldmljZVByb3BlcnRpZXModGhpcywgc3RhdHVzLCBkZXZpY2VfYWRkcmVzcywgcHJvcHMpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRGV2aWNlRm91bmRDYWxsYmFjayhpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSBvdmVycmlkZSB7Ci0gICAgUmVtb3RlRGV2aWNlUHJvcHMgcHJvcHMgPQotICAgICAgICBQYXJzZVJlbW90ZURldmljZVByb3BzKG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLQotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sob2JzZXJ2ZXJzX2xvY2tfKTsKLSAgICBmb3IgKGF1dG8mIG9ic2VydmVyIDogb2JzZXJ2ZXJzXykgewotICAgICAgb2JzZXJ2ZXIuT25EZXZpY2VGb3VuZCh0aGlzLCBwcm9wcyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBEaXNjb3ZlcnlTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9kaXNjb3Zlcnlfc3RhdGVfdCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOwotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgIGNhc2UgQlRfRElTQ09WRVJZX1NUT1BQRUQ6Ci0gICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUX0RJU0NPVkVSWV9TVEFSVEVEOgotICAgICAgICBlbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBvYnNlcnZlciA6IG9ic2VydmVyc18pIHsKLSAgICAgIG9ic2VydmVyLk9uU2NhbkVuYWJsZUNoYW5nZWQodGhpcywgZW5hYmxlZCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTU1BSZXF1ZXN0Q2FsbGJhY2soUmF3QWRkcmVzcyogcmVtb3RlX2JkYWRkciwgYnRfYmRuYW1lX3QqIGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZCwgYnRfc3NwX3ZhcmlhbnRfdCBwYWlyaW5nX3ZhcmlhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3Nfa2V5KSBvdmVycmlkZSB7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcocmVtb3RlX2JkYWRkcik7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJkX25hbWUtPm5hbWUpOwotCi0gICAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhvYnNlcnZlcnNfbG9ja18pOwotICAgIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBvYnNlcnZlcnNfKSB7Ci0gICAgICBvYnNlcnZlci5PblNzcFJlcXVlc3QodGhpcywgZGV2aWNlX2FkZHJlc3MsIG5hbWUsIGNvZCwgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3Nfa2V5KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEJvbmRTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIHJlbW90ZV9iZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhaWxfcmVhc29uKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcocmVtb3RlX2JkYWRkcik7Ci0KLSAgICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG9ic2VydmVyc19sb2NrXyk7Ci0gICAgZm9yIChhdXRvJiBvYnNlcnZlciA6IG9ic2VydmVyc18pIHsKLSAgICAgIG9ic2VydmVyLk9uQm9uZFN0YXRlQ2hhbmdlZCh0aGlzLCBzdGF0dXMsIGRldmljZV9hZGRyZXNzLCBzdGF0ZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBBY2xTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9hY2xfc3RhdGVfdCBzdGF0ZSwgaW50IHRyYW5zcG9ydF9saW5rX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfaGNpX2Vycm9yX2NvZGVfdCBoY2lfcmVhc29uKSBvdmVycmlkZSB7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJnJlbW90ZV9iZGFkZHIpOwotICAgIGJvb2wgY29ubmVjdGVkID0gKHN0YXRlID09IEJUX0FDTF9TVEFURV9DT05ORUNURUQpOwotICAgIExPRyhJTkZPKSA8PCAiQUNMIHN0YXRlIGNoYW5nZWQ6ICIgPDwgZGV2aWNlX2FkZHJlc3MKLSAgICAgICAgICAgICAgPDwgIiAtIGNvbm5lY3RlZDogIiA8PCAoY29ubmVjdGVkID8gInRydWUiIDogImZhbHNlIik7Ci0KLSAgICAvLyBJZiB0aGlzIGlzIHJlcG9ydGVkIHdpdGggYW4gZXJyb3Igc3RhdHVzLCBJIHN1cHBvc2UgdGhlIGJlc3QgdGhpbmcgd2UgY2FuCi0gICAgLy8gZG8gaXMgdG8gbG9nIGl0IGFuZCBpZ25vcmUgdGhlIGV2ZW50LgotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgInN0YXR1czogIiA8PCBCdFN0YXR1c1RleHQoc3RhdHVzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJbnRyb2R1Y2UgYSBzY29wZSB0byBtYW5hZ2UgfGNvbm5lY3RlZF9kZXZpY2VzX2xvY2tffCB3aXRoIFJBSUkuCi0gICAgewotICAgICAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhjb25uZWN0ZWRfZGV2aWNlc19sb2NrXyk7Ci0gICAgICBpZiAoY29ubmVjdGVkKQotICAgICAgICBjb25uZWN0ZWRfZGV2aWNlc18uaW5zZXJ0KGRldmljZV9hZGRyZXNzKTsKLSAgICAgIGVsc2UKLSAgICAgICAgY29ubmVjdGVkX2RldmljZXNfLmVyYXNlKGRldmljZV9hZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG9ic2VydmVyc19sb2NrXyk7Ci0gICAgZm9yIChhdXRvJiBvYnNlcnZlciA6IG9ic2VydmVyc18pIHsKLSAgICAgIG9ic2VydmVyLk9uRGV2aWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCh0aGlzLCBkZXZpY2VfYWRkcmVzcywgY29ubmVjdGVkKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTZW5kcyBhIHJlcXVlc3QgdG8gc2V0IHRoZSBnaXZlbiBIQUwgYWRhcHRlciBwcm9wZXJ0eSB0eXBlIGFuZCB2YWx1ZS4KLSAgYm9vbCBTZXRBZGFwdGVyUHJvcGVydHkoYnRfcHJvcGVydHlfdHlwZV90IHR5cGUsIHZvaWQqIHZhbHVlLCBpbnQgbGVuZ3RoKSB7Ci0gICAgQ0hFQ0sobGVuZ3RoID4gMCk7Ci0gICAgQ0hFQ0sodmFsdWUpOwotCi0gICAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0eTsKLSAgICBwcm9wZXJ0eS5sZW4gPSBsZW5ndGg7Ci0gICAgcHJvcGVydHkudmFsID0gdmFsdWU7Ci0gICAgcHJvcGVydHkudHlwZSA9IHR5cGU7Ci0KLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICAgaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkdldCgpLT5HZXRIQUxJbnRlcmZhY2UoKS0+c2V0X2FkYXB0ZXJfcHJvcGVydHkoCi0gICAgICAgICAgICAmcHJvcGVydHkpOwotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIFZMT0coMSkgPDwgIkZhaWxlZCB0byBzZXQgcHJvcGVydHkiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gSGVscGVyIGZvciBpbnZva2luZyB0aGUgQWRhcHRlclN0YXRlQ2hhbmdlZCBvYnNlcnZlciBtZXRob2QuCi0gIHZvaWQgTm90aWZ5QWRhcHRlclN0YXRlQ2hhbmdlZChBZGFwdGVyU3RhdGUgcHJldl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZSBuZXdfc3RhdGUpIHsKLSAgICBpZiAocHJldl9zdGF0ZSA9PSBuZXdfc3RhdGUpIHJldHVybjsKLQotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sob2JzZXJ2ZXJzX2xvY2tfKTsKLSAgICBmb3IgKGF1dG8mIG9ic2VydmVyIDogb2JzZXJ2ZXJzXykgewotICAgICAgb2JzZXJ2ZXIuT25BZGFwdGVyU3RhdGVDaGFuZ2VkKHRoaXMsIHByZXZfc3RhdGUsIG5ld19zdGF0ZSk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgY3VycmVudCBhZGFwdGVyIHN0YXRlLgotICBzdGQ6OmF0b21pYzxBZGFwdGVyU3RhdGU+IHN0YXRlXzsKLQotICAvLyBUaGUgQmx1ZXRvb3RoIGRldmljZSBhZGRyZXNzIG9mIHRoZSBsb2NhbCBhZGFwdGVyIGluIHN0cmluZyBmcm9tCi0gIC8vIChpLmUuLiBYWDpYWDpYWDpYWDpYWDpYWCkKLSAgdXRpbDo6QXRvbWljU3RyaW5nIGFkZHJlc3NfOwotCi0gIC8vIFRoZSBjdXJyZW50IGxvY2FsIGFkYXB0ZXIgbmFtZS4KLSAgdXRpbDo6QXRvbWljU3RyaW5nIG5hbWVfOwotCi0gIC8vIFRoZSBjdXJyZW50IHNldCBvZiBzdXBwb3J0ZWQgTEUgZmVhdHVyZXMgYXMgb2J0YWluZWQgZnJvbSB0aGUgc3RhY2suIFRoZQotICAvLyB2YWx1ZXMgaGVyZSBhcmUgYWxsIGluaXRpYWxseSBzZXQgdG8gMCBhbmQgdXBkYXRlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nCi0gIC8vIGFkYXB0ZXIgcHJvcGVydHkgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc3RhY2suCi0gIHN0ZDo6bXV0ZXggbG9jYWxfbGVfZmVhdHVyZXNfbG9ja187Ci0gIGJ0X2xvY2FsX2xlX2ZlYXR1cmVzX3QgbG9jYWxfbGVfZmVhdHVyZXNfOwotCi0gIC8vIExpc3Qgb2Ygb2JzZXJ2ZXJzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gbm90aWZpY2F0aW9ucyBmcm9tIHVzLgotICBzdGQ6Om11dGV4IG9ic2VydmVyc19sb2NrXzsKLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxBZGFwdGVyOjpPYnNlcnZlcj4gb2JzZXJ2ZXJzXzsKLQotICAvLyBMaXN0IG9mIGRldmljZXMgYWRkcmVzc2VzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQuCi0gIHN0ZDo6bXV0ZXggY29ubmVjdGVkX2RldmljZXNfbG9ja187Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gY29ubmVjdGVkX2RldmljZXNfOwotCi0gIC8vIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgcGVyLWFwcCBBMmRwU2luayBpbnN0YW5jZXMuCi0gIHN0ZDo6dW5pcXVlX3B0cjxBMmRwU2lua0ZhY3Rvcnk+IGEyZHBfc2lua19mYWN0b3J5XzsKLQotICAvLyBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHBlci1hcHAgQTJkcFNvdXJjZSBpbnN0YW5jZXMuCi0gIHN0ZDo6dW5pcXVlX3B0cjxBMmRwU291cmNlRmFjdG9yeT4gYTJkcF9zb3VyY2VfZmFjdG9yeV87Ci0KLSAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBwZXItYXBwIEF2cmNwQ29udHJvbCBpbnN0YW5jZXMuCi0gIHN0ZDo6dW5pcXVlX3B0cjxBdnJjcENvbnRyb2xGYWN0b3J5PiBhdnJjcF9jb250cm9sX2ZhY3RvcnlfOwotCi0gIC8vIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgcGVyLWFwcCBBdnJjcFRhcmdldCBpbnN0YW5jZXMuCi0gIHN0ZDo6dW5pcXVlX3B0cjxBdnJjcFRhcmdldEZhY3Rvcnk+IGF2cmNwX3RhcmdldF9mYWN0b3J5XzsKLQotICAvLyBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHBlci1hcHAgTG93RW5lcmd5Q2xpZW50IGluc3RhbmNlcy4KLSAgc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUNsaWVudEZhY3Rvcnk+IGJsZV9jbGllbnRfZmFjdG9yeV87Ci0KLSAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBwZXItYXBwIExlQWR2ZXJ0aXNlciBpbnN0YW5jZXMuCi0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeT4gYmxlX2FkdmVydGlzZXJfZmFjdG9yeV87Ci0KLSAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBwZXItYXBwIExlU2Nhbm5lciBpbnN0YW5jZXMuCi0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeT4gYmxlX3NjYW5uZXJfZmFjdG9yeV87Ci0KLSAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBwZXItYXBwIEdhdHRDbGllbnQgaW5zdGFuY2VzLgotICBzdGQ6OnVuaXF1ZV9wdHI8R2F0dENsaWVudEZhY3Rvcnk+IGdhdHRfY2xpZW50X2ZhY3RvcnlfOwotCi0gIC8vIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgcGVyLWFwcCBHYXR0U2VydmVyIGluc3RhbmNlcy4KLSAgc3RkOjp1bmlxdWVfcHRyPEdhdHRTZXJ2ZXJGYWN0b3J5PiBnYXR0X3NlcnZlcl9mYWN0b3J5XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWRhcHRlckltcGwpOwotfTsKLQotLy8gc3RhdGljCi1zdGQ6OnVuaXF1ZV9wdHI8QWRhcHRlcj4gQWRhcHRlcjo6Q3JlYXRlKCkgewotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEFkYXB0ZXI+KG5ldyBBZGFwdGVySW1wbCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9hZGFwdGVyLmggYi9zZXJ2aWNlL2FkYXB0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlNTE3Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2FkYXB0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2FkYXB0ZXJfc3RhdGUuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvcmVtb3RlX2RldmljZV9wcm9wcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQTJkcFNpbmtGYWN0b3J5OwotY2xhc3MgQTJkcFNvdXJjZUZhY3Rvcnk7Ci1jbGFzcyBBdnJjcENvbnRyb2xGYWN0b3J5OwotY2xhc3MgQXZyY3BUYXJnZXRGYWN0b3J5OwotY2xhc3MgR2F0dENsaWVudEZhY3Rvcnk7Ci1jbGFzcyBHYXR0U2VydmVyRmFjdG9yeTsKLWNsYXNzIExvd0VuZXJneUFkdmVydGlzZXJGYWN0b3J5OwotY2xhc3MgTG93RW5lcmd5U2Nhbm5lckZhY3Rvcnk7Ci1jbGFzcyBMb3dFbmVyZ3lDbGllbnRGYWN0b3J5OwotCi0vLyBSZXByZXNlbnRzIHRoZSBsb2NhbCBCbHVldG9vdGggYWRhcHRlci4KLWNsYXNzIEFkYXB0ZXIgewotIHB1YmxpYzoKLSAgLy8gVGhlIGRlZmF1bHQgdmFsdWVzIHJldHVybmVkIGJlZm9yZSB0aGUgQWRhcHRlciBpcyBmdWxseSBpbml0aWFsaXplZCBhbmQKLSAgLy8gcG93ZXJlZC4gVGhlIGNvbXBsZXRlIHZhbHVlcyBmb3IgdGhlc2UgZmllbGRzIGFyZSBvYnRhaW5lZCBmb2xsb3dpbmcgYQotICAvLyBzdWNjZXNzZnVsIGNhbGwgdG8gIkVuYWJsZSIuCi0gIHN0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0QWRkcmVzc1tdOwotICBzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE5hbWVbXTsKLQotICAvLyBPYnNlcnZlciBpbnRlcmZhY2UgYWxsb3dzIG90aGVyIGNsYXNzZXMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZyb20gdXMuCi0gIC8vIEFsbCBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZSBhcmUgZGVjbGFyZWQgYXMgb3B0aW9uYWwgdG8gYWxsb3cKLSAgLy8gZGlmZmVyZW50IGxheWVycyB0byBwcm9jZXNzIG9ubHkgdGhvc2UgZXZlbnRzIHRoYXQgdGhleSBhcmUgaW50ZXJlc3RlZCBpbi4KLSAgLy8KLSAgLy8gQWxsIG1ldGhvZHMgdGFrZSBpbiBhbiB8YWRhcHRlcnwgYXJndW1lbnQgd2hpY2ggcG9pbnRzIHRvIHRoZSBBZGFwdGVyCi0gIC8vIG9iamVjdCB0aGF0IHRoZSBPYnNlcnZlciBpbnN0YW5jZSB3YXMgYWRkZWQgdG8uCi0gIGNsYXNzIE9ic2VydmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5PYnNlcnZlcigpID0gZGVmYXVsdDsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBzdGF0ZSBvZiB0aGUgbG9jYWwgQmx1ZXRvb3RoCi0gICAgLy8gfGFkYXB0ZXJ8IGZyb20gfHByZXZfc3RhdGV8IHRvIHxuZXdfc3RhdGV8LgotICAgIHZpcnR1YWwgdm9pZCBPbkFkYXB0ZXJTdGF0ZUNoYW5nZWQoQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJTdGF0ZSBwcmV2X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlclN0YXRlIG5ld19zdGF0ZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgY29ubmVjdGlvbiBzdGF0ZSBiZXR3ZWVuIHRoZSBsb2NhbAotICAgIC8vIHxhZGFwdGVyfCBhbmQgYSByZW1vdGUgZGV2aWNlIHdpdGggYWRkcmVzcyB8ZGV2aWNlX2FkZHJlc3N8LiBJZiB0aGUgQUNMCi0gICAgLy8gc3RhdGUgY2hhbmdlcyBmcm9tIGRpc2Nvbm5lY3RlZCB0byBjb25uZWN0ZWQsIHRoZW4gfGNvbm5lY3RlZHwgd2lsbCBiZQotICAgIC8vIHRydWUgYW5kIHZpY2UgdmVyc2EuCi0gICAgdmlydHVhbCB2b2lkIE9uRGV2aWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCgKLSAgICAgICAgQWRhcHRlciogYWRhcHRlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBib29sIGNvbm5lY3RlZCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiBzY2FubmluZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgotICAgIHZpcnR1YWwgdm9pZCBPblNjYW5FbmFibGVDaGFuZ2VkKEFkYXB0ZXIqIGFkYXB0ZXIsIGJvb2wgc2Nhbl9lbmFibGVkKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIGEgU1NQIHBhaXJpbmcgcmVxdWVzdCBjb21lcyBmcm9tIGEgcmVtb3RlIGRldmljZS4KLSAgICB2aXJ0dWFsIHZvaWQgT25Tc3BSZXF1ZXN0KEFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX25hbWUsIGludCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFpcmluZ192YXJpYW50LCBpbnQgcGFzc19rZXkpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gYSByZW1vdGUgZGV2aWNlIGJvbmQgc3RhdGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHZvaWQgT25Cb25kU3RhdGVDaGFuZ2VkKEFkYXB0ZXIqIGFkYXB0ZXIsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUpOwotCi0gICAgLy8gQ2FsbGVkIGluIHJlc3BvbnNlIHRvIHxHZXRCb25kZWREZXZpY2VzfC4KLSAgICB2aXJ0dWFsIHZvaWQgT25HZXRCb25kZWREZXZpY2VzKAotICAgICAgICBBZGFwdGVyKiBhZGFwdGVyLCBpbnQgc3RhdHVzLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGJvbmRlZF9kZXZpY2VzKTsKLQotICAgIC8vIENhbGxlZCBpbiByZXNwb25zZSB0byB8R2V0UmVtb3RlRGV2aWNlUHJvcGVydGllc3wuCi0gICAgdmlydHVhbCB2b2lkIE9uR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcyhBZGFwdGVyKiBhZGFwdGVyLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVtb3RlRGV2aWNlUHJvcHMmIHByb3BzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIGEgZGV2aWNlIGlzIGZvdW5kIHRocm91Z2ggc2Nhbm5pbmcuCi0gICAgdmlydHVhbCB2b2lkIE9uRGV2aWNlRm91bmQoQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW1vdGVEZXZpY2VQcm9wcyYgcHJvcHMpOwotICB9OwotCi0gIC8vIFJldHVybnMgYW4gQWRhcHRlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHByb2R1Y3Rpb24uIERvbid0IHVzZSB0aGVzZQotICAvLyBpbiB0ZXN0czsgdXNlIE1vY2tBZGFwdGVyIGluc3RlYWQuCi0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWRhcHRlcj4gQ3JlYXRlKCk7Ci0KLSAgdmlydHVhbCB+QWRhcHRlcigpID0gZGVmYXVsdDsKLQotICAvLyBBZGQgb3IgcmVtb3ZlIGFuIG9ic2VydmVyLgotICB2aXJ0dWFsIHZvaWQgQWRkT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IEFkYXB0ZXIgc3RhdGUuCi0gIHZpcnR1YWwgQWRhcHRlclN0YXRlIEdldFN0YXRlKCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGFkYXB0ZXIgcmFkaW8gaXMgY3VycmVudCBwb3dlcmVkLgotICB2aXJ0dWFsIGJvb2wgSXNFbmFibGVkKCkgY29uc3QgPSAwOwotCi0gIC8vIEVuYWJsZXMgQmx1ZXRvb3RoLiBUaGlzIG1ldGhvZCB3aWxsIHNlbmQgYSByZXF1ZXN0IHRvIHRoZSBCbHVldG9vdGggYWRhcHRlcgotICAvLyB0byBwb3dlciB1cCBpdHMgcmFkaW8uIFJldHVybnMgdHJ1ZSwgaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBzZW50Ci0gIC8vIHRvIHRoZSBjb250cm9sbGVyLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4gQSBzdWNjZXNzZnVsIGNhbGwgdG8gdGhpcwotICAvLyBtZXRob2Qgb25seSBtZWFucyB0aGF0IHRoZSBlbmFibGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IHRvIHRoZSBCbHVldG9vdGgKLSAgLy8gY29udHJvbGxlciBhbmQgZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUgb3BlcmF0aW9uIGl0c2VsZiBzdWNjZWVkZWQuCi0gIHZpcnR1YWwgYm9vbCBFbmFibGUoKSA9IDA7Ci0KLSAgLy8gUG93ZXJzIG9mZiB0aGUgQmx1ZXRvb3RoIHJhZGlvLiBSZXR1cm5zIHRydWUsIGlmIHRoZSBkaXNhYmxlIHJlcXVlc3Qgd2FzCi0gIC8vIHN1Y2Nlc3NmdWxseSBzZW50IHRvIHRoZSBCbHVldG9vdGggY29udHJvbGxlci4KLSAgdmlydHVhbCBib29sIERpc2FibGUoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbmFtZSBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGxvY2FsIGFkYXB0ZXIuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIGNvbnN0ID0gMDsKLQotICAvLyBTZXRzIHRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBsb2NhbCBCbHVldG9vdGggYWRhcHRlci4gVGhpcyBpcyB0aGUgbmFtZQotICAvLyB0aGF0IHRoZSBsb2NhbCBjb250cm9sbGVyIHdpbGwgcHJlc2VudCB0byByZW1vdGUgZGV2aWNlcy4KLSAgdmlydHVhbCBib29sIFNldE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBsb2NhbCBhZGFwdGVyIGFkZGVzcyBpbiBzdHJpbmcgZm9ybSAoWFg6WFg6WFg6WFg6WFg6WFgpLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEFkZHJlc3MoKSBjb25zdCA9IDA7Ci0KLSAgLy8gU2V0IGRpc2NvdmVyYWJpbGl0eSBtb2RlLgotICB2aXJ0dWFsIGJvb2wgU2V0U2Nhbk1vZGUoaW50IHNjYW5fbW9kZSkgPSAwOwotCi0gIC8vIEVuYWJsZSBvciBkaXNhYmxlIGRpc2NvdmVyYWJpbGl0eS4KLSAgdmlydHVhbCBib29sIFNldFNjYW5FbmFibGUoYm9vbCBzY2FuX2VuYWJsZSkgPSAwOwotCi0gIC8vIFJlcGx5IHRvIGFuIFNTUCByZXF1ZXN0IHJlY2VpdmVkIGluIHxPblNzcFJlcXVlc3R8LgotICB2aXJ0dWFsIGJvb2wgU3NwUmVwbHkoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNjZXB0LCBpbnQzMl90IHBhc3Nfa2V5KSA9IDA7Ci0KLSAgLy8gQ3JlYXRlIGEgYm9uZCB3aXRoIGRldmljZSBzcGVjaWZpZWQgYnkgfGRldmljZV9hZGRyZXNzfC4KLSAgdmlydHVhbCBib29sIENyZWF0ZUJvbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgdHJhbnNwb3J0KSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2NhbCBhZGFwdGVyIHN1cHBvcnRzIHRoZSBMb3ctRW5lcmd5Ci0gIC8vIG11bHRpLWFkdmVydGlzZW1lbnQgZmVhdHVyZS4KLSAgdmlydHVhbCBib29sIElzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKCkgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVtb3RlIGRldmljZSB3aXRoIGFkZHJlc3MgfGRldmljZV9hZGRyZXNzfCBpcwotICAvLyBjdXJyZW50bHkgY29ubmVjdGVkLiBUaGlzIGlzIG5vdCBhIGNvbnN0IG1ldGhvZCBhcyBpdCBtb2RpZmllcyB0aGUgc3RhdGUgb2YKLSAgLy8gdGhlIGFzc29jaWF0ZWQgaW50ZXJuYWwgbXV0ZXguCi0gIHZpcnR1YWwgYm9vbCBJc0RldmljZUNvbm5lY3RlZChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgdHJhY2thYmxlIGFkdmVydGlzZW1lbnRzIGFzIHN1cHBvcnRlZCBieSB0aGUKLSAgLy8gdW5kZXJseWluZyBoYXJkd2FyZS4KLSAgdmlydHVhbCBpbnQgR2V0VG90YWxOdW1iZXJPZlRyYWNrYWJsZUFkdmVydGlzZW1lbnRzKCkgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBoYXJkd2FyZS1iYWNrZWQgc2NhbiBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkLgotICB2aXJ0dWFsIGJvb2wgSXNPZmZsb2FkZWRGaWx0ZXJpbmdTdXBwb3J0ZWQoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGhhcmR3YXJlLWJhY2tlZCBiYXRjaCBzY2FubmluZyBpcyBzdXBwb3J0ZWQuCi0gIHZpcnR1YWwgYm9vbCBJc09mZmxvYWRlZFNjYW5CYXRjaGluZ1N1cHBvcnRlZCgpID0gMDsKLQotICAvLyBXaGVuIHRoZSBzdGFjayBjYWxsIGNvbXBsZXRlcywgfE9uR2V0Qm9uZGVkRGV2aWNlc3wgd2lsbCBiZSBjYWxsZWQuCi0gIHZpcnR1YWwgYm9vbCBHZXRCb25kZWREZXZpY2VzKCkgPSAwOwotCi0gIC8vIFdoZW4gdGhlIHN0YWNrIGNhbGwgY29tcGxldGV0cywgfE9uQm9uZFN0YXRlQ2hhbmdlZHwgd2lsbCBiZSBjYWxsZWQuCi0gIHZpcnR1YWwgYm9vbCBSZW1vdmVCb25kKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykgPSAwOwotCi0gIC8vIFdoZW4gdGhlIHN0YWNrIGNhbGwgY29tcGxldGV0cywgfE9uR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllc3wgd2lsbCBiZQotICAvLyBjYWxsZWQuCi0gIHZpcnR1YWwgYm9vbCBHZXRSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykgPSAwOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBBMmRwU2lua0ZhY3RvcnkuIFRoaXMgY2FuIGJlIHVzZWQgdG8KLSAgLy8gcmVnaXN0ZXIgcGVyLWFwcGxpY2F0aW9uIEEyZHBTaW5rQ2xpZW50IGluc3RhbmNlcyB0byBwZXJmb3JtIEEyRFAgc2luawotICAvLyBvcGVyYXRpb25zLgotICB2aXJ0dWFsIEEyZHBTaW5rRmFjdG9yeSogR2V0QTJkcFNpbmtGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBBMmRwU291cmNlRmFjdG9yeS4gVGhpcyBjYW4gYmUgdXNlZCB0bwotICAvLyByZWdpc3RlciBwZXItYXBwbGljYXRpb24gQTJkcFNvdXJjZUNsaWVudCBpbnN0YW5jZXMgdG8gcGVyZm9ybSBBMkRQIHNvdXJjZQotICAvLyBvcGVyYXRpb25zLgotICB2aXJ0dWFsIEEyZHBTb3VyY2VGYWN0b3J5KiBHZXRBMmRwU291cmNlRmFjdG9yeSgpIGNvbnN0ID0gMDsKLQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQXZyY3BDb250cm9sRmFjdG9yeS4gVGhpcyBjYW4gYmUgdXNlZCB0byByZWdpc3RlcgotICAvLyBwZXItYXBwbGljYXRpb24gQXZyY3BDb250cm9sQ2xpZW50IGluc3RhbmNlcyB0byBwZXJmb3JtIEFWUkNQIGNvbnRyb2wKLSAgLy8gb3BlcmF0aW9ucy4KLSAgdmlydHVhbCBBdnJjcENvbnRyb2xGYWN0b3J5KiBHZXRBdnJjcENvbnRyb2xGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBBdnJjcFRhcmdldEZhY3RvcnkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIKLSAgLy8gcGVyLWFwcGxpY2F0aW9uIEF2cmNwVGFyZ2V0Q2xpZW50IGluc3RhbmNlcyB0byBwZXJmb3JtIEFWUkNQIHRhcmdldAotICAvLyBvcGVyYXRpb25zLgotICB2aXJ0dWFsIEF2cmNwVGFyZ2V0RmFjdG9yeSogR2V0QXZyY3BUYXJnZXRGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBMb3dFbmVyZ3lDbGllbnRGYWN0b3J5LiBUaGlzIGNhbiBiZSB1c2VkIHRvCi0gIC8vIHJlZ2lzdGVyIHBlci1hcHBsaWNhdGlvbiBMb3dFbmVyZ3lDbGllbnQgaW5zdGFuY2VzIHRvIHBlcmZvcm0gQkxFIEdBUAotICAvLyBvcGVyYXRpb25zLgotICB2aXJ0dWFsIExvd0VuZXJneUNsaWVudEZhY3RvcnkqIEdldExvd0VuZXJneUNsaWVudEZhY3RvcnkoKSBjb25zdCA9IDA7Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIExvd0VuZXJneVNjYW5uZXJGYWN0b3J5LiBUaGlzIGNhbiBiZSB1c2VkIHRvCi0gIC8vIHJlZ2lzdGVyIHBlci1hcHBsaWNhdGlvbiBMb3dFbmVyZ3lTY2FubmVyIGluc3RhbmNlcyB0byBwZXJmb3JtIHNjYW5uaW5nLgotICB2aXJ0dWFsIExvd0VuZXJneVNjYW5uZXJGYWN0b3J5KiBHZXRMZVNjYW5uZXJGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeS4gVGhpcyBjYW4gYmUgdXNlZCB0bwotICAvLyByZWdpc3RlciBwZXItYXBwbGljYXRpb24gTG93RW5lcmd5QWR2ZXJ0aXNlciBpbnN0YW5jZXMgdG8gcGVyZm9ybQotICAvLyBhZHZlcnRpc2luZy4KLSAgdmlydHVhbCBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSogR2V0TGVBZHZlcnRpc2VyRmFjdG9yeSgpIGNvbnN0ID0gMDsKLQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgR2F0dENsaWVudEZhY3RvcnkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIKLSAgLy8gcGVyLWFwcGxpY2F0aW9uIEdBVFQgc2VydmVyIGluc3RhbmNlcy4KLSAgdmlydHVhbCBHYXR0Q2xpZW50RmFjdG9yeSogR2V0R2F0dENsaWVudEZhY3RvcnkoKSBjb25zdCA9IDA7Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEdhdHRTZXJ2ZXJGYWN0b3J5LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyCi0gIC8vIHBlci1hcHBsaWNhdGlvbiBHQVRUIHNlcnZlciBpbnN0YW5jZXMuCi0gIHZpcnR1YWwgR2F0dFNlcnZlckZhY3RvcnkqIEdldEdhdHRTZXJ2ZXJGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gcHJvdGVjdGVkOgotICBBZGFwdGVyKCkgPSBkZWZhdWx0OwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFkYXB0ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9hdnJjcF9jb250cm9sLmNjIGIvc2VydmljZS9hdnJjcF9jb250cm9sLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTRjMjRhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvYXZyY3BfY29udHJvbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvYXZyY3BfY29udHJvbC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvcHRyX3V0aWwuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotCi0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAibm90cmVhY2hlZC5oIgotI2luY2x1ZGUgInNlcnZpY2UvbG9nZ2luZ19oZWxwZXJzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdnJjX2RlZnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotQXZyY3BDb250cm9sOjpBdnJjcENvbnRyb2woY29uc3QgVXVpZCYgdXVpZCwgaW50IGNvbnRyb2xfaWQpCi0gICAgOiBhcHBfaWRlbnRpZmllcl8odXVpZCksIGNvbnRyb2xfaWRfKGNvbnRyb2xfaWQpIHsKLSAgaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCktPkFkZENvbnRyb2xPYnNlcnZlcih0aGlzKTsKLX0KLQotQXZyY3BDb250cm9sOjp+QXZyY3BDb250cm9sKCkgewotICBoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpHZXQoKS0+UmVtb3ZlQ29udHJvbE9ic2VydmVyKHRoaXMpOwotfQotCi1jb25zdCBVdWlkJiBBdnJjcENvbnRyb2w6OkdldEFwcElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBhcHBfaWRlbnRpZmllcl87IH0KLQotaW50IEF2cmNwQ29udHJvbDo6R2V0SW5zdGFuY2VJZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRyb2xfaWRfOyB9Ci0KLXZvaWQgQXZyY3BDb250cm9sOjpTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgZGVsZWdhdGVfID0gZGVsZWdhdGU7Ci19Ci0KLWJvb2wgQXZyY3BDb250cm9sOjpFbmFibGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gIHJldHVybiBoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpHZXQoKS0+QXZyY3BDb250cm9sRW5hYmxlKCk7Ci19Ci0KLXZvaWQgQXZyY3BDb250cm9sOjpEaXNhYmxlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpHZXQoKS0+QXZyY3BDb250cm9sRGlzYWJsZSgpOwotfQotCi1ib29sIEF2cmNwQ29udHJvbDo6U2VuZFBhc3NUaHJvdWdoQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9jb2RlLCBib29sIGtleV9wcmVzc2VkKSB7Ci0gIFJhd0FkZHJlc3MgYWRkcjsKLSAgaWYgKCFSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGRldmljZV9hZGRyZXNzLCBhZGRyKSkgewotICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgZGV2aWNlIGFkZHJlc3MgZ2l2ZW46ICIgPDwgZGV2aWNlX2FkZHJlc3M7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDhfdCBrZXlfc3RhdGUgPSBrZXlfcHJlc3NlZCA/IEFWUkNfU1RBVEVfUFJFU1MgOiBBVlJDX1NUQVRFX1JFTEVBU0U7Ci0gIGJ0X3N0YXR1c190IHN0YXR1czsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgc3RhdHVzID0gaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgLT5HZXRDb250cm9sSEFMSW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgLT5zZW5kX3Bhc3NfdGhyb3VnaF9jbWQoYWRkciwga2V5X2NvZGUsIGtleV9zdGF0ZSk7Ci0gIH0KLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZW5kIHBhc3N0aHJvdWdoIGNvbW1hbmQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEF2cmNwQ29udHJvbDo6U2V0QWJzVm9sdW1lUmVzcG9uc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWJzX3ZvbCwgaW50MzJfdCBsYWJlbCkgewotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGlmICghUmF3QWRkcmVzczo6RnJvbVN0cmluZyhkZXZpY2VfYWRkcmVzcywgYWRkcikpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ0X3N0YXR1c190IHN0YXR1czsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgc3RhdHVzID0gaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgLT5HZXRDb250cm9sSEFMSW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgLT5zZXRfdm9sdW1lX3JzcChhZGRyLCBhYnNfdm9sLCBsYWJlbCk7Ci0gIH0KLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZW5kIHNldCBhYnNvbHV0ZSB2b2x1bWUgcmVzcG9uc2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEF2cmNwQ29udHJvbDo6UmVnaXN0ZXJGb3JBYnNWb2x1bWVDYWxsYmFja1Jlc3BvbnNlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50MzJfdCByZXNwb25zZV90eXBlLCBpbnQzMl90IGFic192b2wsCi0gICAgaW50MzJfdCBsYWJlbCkgewotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGlmICghUmF3QWRkcmVzczo6RnJvbVN0cmluZyhkZXZpY2VfYWRkcmVzcywgYWRkcikpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ0X3N0YXR1c190IHN0YXR1czsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0gICAgc3RhdHVzID0gaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgLT5HZXRDb250cm9sSEFMSW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgLT5yZWdpc3Rlcl9hYnNfdm9sX3JzcCgKLSAgICAgICAgICAgICAgICAgICAgIGFkZHIsIHN0YXRpY19jYXN0PGJ0cmNfbm90aWZpY2F0aW9uX3R5cGVfdD4ocmVzcG9uc2VfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICBhYnNfdm9sLCBsYWJlbCk7Ci0gIH0KLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikKLSAgICAgICAgPDwgIkZhaWxlZCB0byBzZW5kIHNlbmQgcmVnaXN0ZXIgZm9yIGFic29sdXRlIHZvbHVtZSBjaGFuZ2UgY2FsbGJhY2siOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEF2cmNwQ29udHJvbDo6Q29ubmVjdGlvblN0YXRlQ2FsbGJhY2soYm9vbCByY19jb25uZWN0LCBib29sIGJ0X2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzcyA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pCi0gICAgZGVsZWdhdGVfLT5PbkNvbm5lY3Rpb25TdGF0ZShyY19jb25uZWN0LCBidF9jb25uZWN0LCBkZXZpY2VfYWRkcmVzcyk7Ci19Ci0KLXZvaWQgQXZyY3BDb250cm9sOjpDdHJsU2V0YWJzdm9sQ21kQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhYnNfdm9sLCB1aW50OF90IGxhYmVsKSB7Ci0gIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgaWYgKGRlbGVnYXRlXykKLSAgICBkZWxlZ2F0ZV8tPk9uU2V0QWJzVm9sdW1lUmVxdWVzdChkZXZpY2VfYWRkcmVzcywgYWJzX3ZvbCwgbGFiZWwpOwotfQotCi12b2lkIEF2cmNwQ29udHJvbDo6Q3RybFJlZ2lzdGVybm90aWZpY2F0aW9uQWJzVm9sQ2FsbGJhY2soCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBsYWJlbCkgewotICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzcyA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pCi0gICAgZGVsZWdhdGVfLT5PblJlZ2lzdGVyRm9yQWJzVm9sdW1lQ2FsbGJhY2tSZXF1ZXN0KGRldmljZV9hZGRyZXNzLCBsYWJlbCk7Ci19Ci0KLXZvaWQgQXZyY3BDb250cm9sOjpDdHJsVHJhY2tDaGFuZ2VkQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIHBfYXR0cnMpIHsKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotCi0gIHN0ZDo6c3RyaW5nIHRpdGxlOwotICBzdGQ6OnN0cmluZyBhcnRpc3Q7Ci0gIHN0ZDo6c3RyaW5nIGFsYnVtOwotICBzdGQ6OnN0cmluZyBnZW5yZTsKLSAgaW50IHRyYWNrX251bSA9IC0xOwotICBpbnQgbnVtX3RyYWNrcyA9IC0xOwotICBpbnQgcGxheV90aW1lID0gLTE7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fYXR0cjsgKytpKSB7Ci0gICAgYXV0byBhdHRyX3RleHQgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwX2F0dHJzW2ldLnRleHQpOwotICAgIHN3aXRjaCAocF9hdHRyc1tpXS5hdHRyX2lkKSB7Ci0gICAgICBjYXNlIEJUUkNfTUVESUFfQVRUUl9JRF9USVRMRToKLSAgICAgICAgdGl0bGUgPSBhdHRyX3RleHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVFJDX01FRElBX0FUVFJfSURfQVJUSVNUOgotICAgICAgICBhcnRpc3QgPSBhdHRyX3RleHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVFJDX01FRElBX0FUVFJfSURfQUxCVU06Ci0gICAgICAgIGFsYnVtID0gYXR0cl90ZXh0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRSQ19NRURJQV9BVFRSX0lEX1RSQUNLX05VTToKLSAgICAgICAgaWYgKCFiYXNlOjpTdHJpbmdUb0ludChhdHRyX3RleHQsICZ0cmFja19udW0pKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHRyYWNrIG51bWJlciI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJUUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTOgotICAgICAgICBpZiAoIWJhc2U6OlN0cmluZ1RvSW50KGF0dHJfdGV4dCwgJm51bV90cmFja3MpKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIG51bWJlciBvZiB0cmFja3MiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVFJDX01FRElBX0FUVFJfSURfR0VOUkU6Ci0gICAgICAgIGdlbnJlID0gYXR0cl90ZXh0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQlRSQ19NRURJQV9BVFRSX0lEX1BMQVlJTkdfVElNRToKLSAgICAgICAgaWYgKCFiYXNlOjpTdHJpbmdUb0ludChhdHRyX3RleHQsICZwbGF5X3RpbWUpKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHBsYXlpbmcgdGltZSI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgQXZyY3BNZWRpYUF0dHIgYXR0cih0aXRsZSwgYXJ0aXN0LCBhbGJ1bSwgZ2VucmUsIHRyYWNrX251bSwgbnVtX3RyYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X3RpbWUpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pIGRlbGVnYXRlXy0+T25UcmFja0NoYW5nZWQoZGV2aWNlX2FkZHJlc3MsIGF0dHIpOwotfQotCi0vLyBBdnJjcENvbnRyb2xGYWN0b3J5IGltcGxlbWVudGF0aW9uCi0KLUF2cmNwQ29udHJvbEZhY3Rvcnk6OkF2cmNwQ29udHJvbEZhY3RvcnkoKSA9IGRlZmF1bHQ7Ci1BdnJjcENvbnRyb2xGYWN0b3J5Ojp+QXZyY3BDb250cm9sRmFjdG9yeSgpID0gZGVmYXVsdDsKLQotYm9vbCBBdnJjcENvbnRyb2xGYWN0b3J5OjpSZWdpc3Rlckluc3RhbmNlKGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIC0gVXVpZDogIiA8PCB1dWlkLlRvU3RyaW5nKCk7Ci0KLSAgaW50IGNvbnRyb2xfaWQgPSBuZXh0X2NvbnRyb2xfaWRfKys7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBdnJjcENvbnRyb2w+IGhmX2NsaWVudChuZXcgQXZyY3BDb250cm9sKHV1aWQsIGNvbnRyb2xfaWQpKTsKLSAgY2FsbGJhY2soQkxFX1NUQVRVU19TVUNDRVNTLCB1dWlkLCBzdGQ6Om1vdmUoaGZfY2xpZW50KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2F2cmNwX2NvbnRyb2wuaCBiL3NlcnZpY2UvYXZyY3BfY29udHJvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWYzNmY4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvYXZyY3BfY29udHJvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgotI2luY2x1ZGUgImJsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAic2VydmljZS9ibHVldG9vdGhfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfbWVkaWFfYXR0ci5oIgotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2cmNwX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBBdnJjcENvbnRyb2wgOiBwdWJsaWMgQmx1ZXRvb3RoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlciB7Ci0gcHVibGljOgotICBjbGFzcyBEZWxlZ2F0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGJvb2wgcmNfY29ubmVjdCwgYm9vbCBidF9jb25uZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBPblRyYWNrQ2hhbmdlZChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF2cmNwTWVkaWFBdHRyJiBhdHRyKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25TZXRBYnNWb2x1bWVSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWJzX3ZvbCwgaW50MzJfdCBsYWJlbCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVnaXN0ZXJGb3JBYnNWb2x1bWVDYWxsYmFja1JlcXVlc3QoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50MzJfdCBsYWJlbCkgPSAwOwotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGVsZWdhdGUoKSA9IGRlZmF1bHQ7Ci0gIH07Ci0KLSAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVycyB0aGlzIGluc3RhbmNlIGZyb20gdGhlIHN0YWNrLgotICB+QXZyY3BDb250cm9sKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQXNzaWducyBhIGRlbGVnYXRlIHRvIHRoaXMgaW5zdGFuY2UuIHxkZWxlZ2F0ZXwgbXVzdCBvdXQtbGl2ZSB0aGlzCi0gIC8vIEF2cmNwQ29udHJvbCBpbnN0YW5jZS4KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gIC8vIEJsdWV0b290aENsaWVudEluc3RhY2Ugb3ZlcnJpZGVzOgotICBjb25zdCBVdWlkJiBHZXRBcHBJZGVudGlmaWVyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludCBHZXRJbnN0YW5jZUlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBFbmFibGUoKTsKLSAgdm9pZCBEaXNhYmxlKCk7Ci0KLSAgLy8gU2VuZCBhIHJlbW90ZSBjb250cm9sIGJ1dHRvbiBjb21tYW5kLiBDb21tYW5kcyB3aGljaCBjYW4gYmUgc2VudAotICAvLyBhcmUgZGVmaW5lZCBoZXJlOgotICAvLyBodHRwOi8vMTM5NHRhLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAxNS8wNy8yMDA3MDAxLnBkZgotICBib29sIFNlbmRQYXNzVGhyb3VnaENvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfY29kZSwgYm9vbCBrZXlfcHJlc3NlZCk7Ci0KLSAgLy8gU2VuZCBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCB0byBjaGFuZ2UgYWJzb2x1dGUgdm9sdW1lLgotICBib29sIFNldEFic1ZvbHVtZVJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50MzJfdCBhYnNfdm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGFiZWwpOwotCi0gIC8vIFNlbmQgYSByZXNwb25zZSB0byBhIHJlZ2lzdGVyIGZvciBhYnNvbHV0ZSB2b2x1bWUgY2hhbmdlIGNhbGxiYWNrLgotICBib29sIFJlZ2lzdGVyRm9yQWJzVm9sdW1lQ2FsbGJhY2tSZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVzcG9uc2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhYnNfdm9sLCBpbnQzMl90IGxhYmVsKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBBdnJjcENvbnRyb2xGYWN0b3J5OwotCi0gIC8vIENvbnN0cnVjdG9yIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgaW5zdGFuY2VzIGFyZSBtZWFudCB0byBiZQotICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBmYWN0b3J5LgotICBBdnJjcENvbnRyb2woY29uc3QgVXVpZCYgdXVpZCwgaW50IGNvbnRyb2xfaWQpOwotCi0gIC8vIGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlciBpbXBsZW1lbnRhdGlvbjoKLSAgdm9pZCBDb25uZWN0aW9uU3RhdGVDYWxsYmFjayhib29sIHJjX2Nvbm5lY3QsIGJvb2wgYnRfY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgdm9pZCBDdHJsU2V0YWJzdm9sQ21kQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBhYnNfdm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxhYmVsKSBvdmVycmlkZTsKLSAgdm9pZCBDdHJsUmVnaXN0ZXJub3RpZmljYXRpb25BYnNWb2xDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGFiZWwpIG92ZXJyaWRlOwotICB2b2lkIEN0cmxUcmFja0NoYW5nZWRDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCogcF9hdHRycykgb3ZlcnJpZGU7Ci0KLSAgLy8gU2VlIGdldHRlcnMgZm9yIGRvY3VtZW50YXRpb24uCi0gIGNvbnN0IFV1aWQgYXBwX2lkZW50aWZpZXJfOwotICBjb25zdCBpbnQgY29udHJvbF9pZF87Ci0KLSAgLy8gTXV0ZXggdGhhdCBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHRoZSBlbnRyaWVzIGJlbG93LgotICBzdGQ6Om11dGV4IG11dGV4XzsKLQotICAvLyBSYXcgaGFuZGxlIHRvIHRoZSBEZWxlZ2F0ZSwgd2hpY2ggbXVzdCBvdXRsaXZlIHRoaXMgQXZyY3BDb250cm9sIGluc3RhbmNlLgotICBzdGQ6Om11dGV4IGRlbGVnYXRlX211dGV4XzsKLSAgRGVsZWdhdGUqIGRlbGVnYXRlXyA9IG51bGxwdHI7Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF2cmNwQ29udHJvbCk7Ci19OwotCi0vLyBBdnJjcENvbnRyb2xGYWN0b3J5IGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW5kIG9idGFpbiBhIHBlci1hcHBsaWNhdGlvbgotLy8gQXZyY3BDb250cm9sCi0vLyBpbnN0YW5jZS4gVXNlcnMgc2hvdWxkIGNhbGwgUmVnaXN0ZXJDbGllbnQgdG8gb2J0YWluIHRoZWlyIG93biB1bmlxdWUKLS8vIEF2cmNwQ29udHJvbCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQmx1ZXRvb3RoIHN0YWNrLgotY2xhc3MgQXZyY3BDb250cm9sRmFjdG9yeQotICAgIDogcHVibGljIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSwKLSAgICAgIHByaXZhdGUgaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyIHsKLSBwdWJsaWM6Ci0gIC8vIERvbid0IGNvbnN0cnVjdC9kZXN0cnVjdCBkaXJlY3RseSBleGNlcHQgaW4gdGVzdHMuIEluc3RlYWQsIG9idGFpbiBhIGhhbmRsZQotICAvLyBmcm9tIGFuIEFkYXB0ZXIgaW5zdGFuY2UuCi0gIEF2cmNwQ29udHJvbEZhY3RvcnkoKTsKLSAgfkF2cmNwQ29udHJvbEZhY3RvcnkoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhJbnN0YW5jZUZhY3Rvcnkgb3ZlcnJpZGU6Ci0gIGJvb2wgUmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjphdG9taWM8aW50PiBuZXh0X2NvbnRyb2xfaWRfezB9OwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXZyY3BDb250cm9sRmFjdG9yeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2F2cmNwX3RhcmdldC5jYyBiL3NlcnZpY2UvYXZyY3BfdGFyZ2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQyMWI3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvYXZyY3BfdGFyZ2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvYXZyY3BfdGFyZ2V0LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYXJyYXlfdXRpbHMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3B0cl91dGlsLmgiCi0jaW5jbHVkZSAic2VydmljZS9sb2dnaW5nX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2cmNfZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgUEFSU0VfQUREUihzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSYXdBZGRyZXNzIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIVJhd0FkZHJlc3M6OkZyb21TdHJpbmcoKHN0ciksIHRtcCkpIHsgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgZGV2aWNlIGFkZHJlc3MgZ2l2ZW46ICIgPDwgKHN0cik7IFwKLSAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSkKLQotI2RlZmluZSBUUllfUkVUKGV4cHIsIGVycl9tc2cpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoZXhwcikpIHsgICAgICAgICAgICAgXAotICAgICAgTE9HKEVSUk9SKSA8PCBlcnJfbXNnOyAgIFwKLSAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUllfUkVUX0ZVTkMoZXhwcikgVFJZX1JFVChleHByLCBfX2Z1bmNfXyA8PCAiIGZhaWxlZCIpCi0KLXVzaW5nIExvY2tHdWFyZCA9IHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0ZDo6dmVjdG9yPGJ0cmNfcGxheWVyX3NldHRpbmdfdGV4dF90PiBTdHJpbmdWYWx1ZVRvUGxheWVyU2V0dGluZ3NUZXh0KAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF2cmNwU3RyaW5nVmFsdWU+JiBhdHRycykgewotICBzdGQ6OnZlY3RvcjxidHJjX3BsYXllcl9zZXR0aW5nX3RleHRfdD4gYnRyY19hdHRycyhhdHRycy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJzLnNpemUoKTsgKytpKSB7Ci0gICAgYnRyY19hdHRyc1tpXS5pZCA9IGF0dHJzW2ldLmlkKCk7Ci0gICAgc3RkOjpzdHJpbmcgc3RyKGF0dHJzW2ldLnZhbHVlKCkpOwotICAgIHNpemVfdCB0b19jb3B5ID0gc3RkOjptaW4oc2l6ZW9mKGJ0cmNfYXR0cnNbaV0udGV4dCkgLSAxLCBzdHIuc2l6ZSgpKTsKLSAgICBpZiAodG9fY29weSA8IHN0ci5zaXplKCkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiVmFsdWUgdHJ1bmNhdGVkIjsKLSAgICB9Ci0KLSAgICBtZW1jcHkoYnRyY19hdHRyc1tpXS50ZXh0LCBzdHIuZGF0YSgpLCB0b19jb3B5KTsKLSAgICBidHJjX2F0dHJzW2ldLnRleHRbdG9fY29weV0gPSAnXDAnOwotICB9Ci0KLSAgcmV0dXJuIGJ0cmNfYXR0cnM7Ci19Ci0KLXN0ZDo6dmVjdG9yPGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90PiBTdHJpbmdWYWx1ZVRvRWxlbWVudEF0dHJWYWwoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXZyY3BTdHJpbmdWYWx1ZT4mIGF0dHJzKSB7Ci0gIHN0ZDo6dmVjdG9yPGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90PiBidHJjX2F0dHJzKGF0dHJzLnNpemUoKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXR0cnMuc2l6ZSgpOyArK2kpIHsKLSAgICBidHJjX2F0dHJzW2ldLmF0dHJfaWQgPSBhdHRyc1tpXS5pZCgpOwotICAgIHN0ZDo6c3RyaW5nIHN0cihhdHRyc1tpXS52YWx1ZSgpKTsKLSAgICBzaXplX3QgdG9fY29weSA9IHN0ZDo6bWluKHNpemVvZihidHJjX2F0dHJzW2ldLnRleHQpIC0gMSwgc3RyLnNpemUoKSk7Ci0gICAgaWYgKHRvX2NvcHkgPCBzdHIuc2l6ZSgpKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIlZhbHVlIHRydW5jYXRlZCI7Ci0gICAgfQotCi0gICAgbWVtY3B5KGJ0cmNfYXR0cnNbaV0udGV4dCwgc3RyLmRhdGEoKSwgdG9fY29weSk7Ci0gICAgYnRyY19hdHRyc1tpXS50ZXh0W3RvX2NvcHldID0gJ1wwJzsKLSAgfQotCi0gIHJldHVybiBidHJjX2F0dHJzOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1jb25zdCBpbnQgQXZyY3BUYXJnZXQ6OmtTaW5nbGV0b25JbnN0YW5jZUlkID0gMDsKLQotQXZyY3BUYXJnZXQ6OkF2cmNwVGFyZ2V0KGNvbnN0IFV1aWQmIHV1aWQpIDogYXBwX2lkZW50aWZpZXJfKHV1aWQpIHsKLSAgaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCktPkFkZFRhcmdldE9ic2VydmVyKHRoaXMpOwotfQotCi1BdnJjcFRhcmdldDo6fkF2cmNwVGFyZ2V0KCkgewotICBoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpHZXQoKS0+UmVtb3ZlVGFyZ2V0T2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLWNvbnN0IFV1aWQmIEF2cmNwVGFyZ2V0OjpHZXRBcHBJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gYXBwX2lkZW50aWZpZXJfOyB9Ci0KLWludCBBdnJjcFRhcmdldDo6R2V0SW5zdGFuY2VJZCgpIGNvbnN0IHsgcmV0dXJuIGtTaW5nbGV0b25JbnN0YW5jZUlkOyB9Ci0KLXZvaWQgQXZyY3BUYXJnZXQ6OlNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSkgewotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBkZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKLX0KLQotYm9vbCBBdnJjcFRhcmdldDo6RW5hYmxlKCkgewotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICByZXR1cm4gaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCktPkF2cmNwVGFyZ2V0RW5hYmxlKCk7Ci19Ci0KLXZvaWQgQXZyY3BUYXJnZXQ6OkRpc2FibGUoKSB7Ci0gIExvY2tHdWFyZCBsb2NrKG11dGV4Xyk7Ci0gIGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkdldCgpLT5BdnJjcFRhcmdldERpc2FibGUoKTsKLX0KLQotYm9vbCBBdnJjcFRhcmdldDo6R2V0UGxheVN0YXR1c1Jlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYXlfc3RhdHVzLCB1aW50MzJfdCBzb25nX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzb25nX3BvcykgewotICBSYXdBZGRyZXNzIGFkZHIgPSBQQVJTRV9BRERSKHN0cl9hZGRyKTsKLSAgTG9ja0d1YXJkIGxvY2sobXV0ZXhfKTsKLSAgVFJZX1JFVF9GVU5DKGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgICAgICAgICAgLT5HZXRUYXJnZXRIQUxJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAgIC0+Z2V0X3BsYXlfc3RhdHVzX3JzcCgKLSAgICAgICAgICAgICAgICAgICAgICAgYWRkciwgc3RhdGljX2Nhc3Q8YnRyY19wbGF5X3N0YXR1c190PihwbGF5X3N0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICAgIHNvbmdfbGVuLCBzb25nX3BvcykgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi1ib29sIEF2cmNwVGFyZ2V0OjpMaXN0UGxheWVyQXBwQXR0clJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGF0dHJzKSB7Ci0gIFJhd0FkZHJlc3MgYWRkciA9IFBBUlNFX0FERFIoc3RyX2FkZHIpOwotCi0gIHN0ZDo6dmVjdG9yPGJ0cmNfcGxheWVyX2F0dHJfdD4gYnRyY19hdHRyczsKLSAgYnRyY19hdHRycy5yZXNlcnZlKGF0dHJzLnNpemUoKSk7Ci0gIGZvciAoYXV0byBhdHRyIDogYXR0cnMpIHsKLSAgICBidHJjX2F0dHJzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxidHJjX3BsYXllcl9hdHRyX3Q+KGF0dHIpKTsKLSAgfQotCi0gIExvY2tHdWFyZCBsb2NrKG11dGV4Xyk7Ci0gIFRSWV9SRVRfRlVOQyhoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpHZXQoKQotICAgICAgICAgICAgICAgICAgIC0+R2V0VGFyZ2V0SEFMSW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgICAtPmxpc3RfcGxheWVyX2FwcF9hdHRyX3JzcChhZGRyLCBidHJjX2F0dHJzLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2F0dHJzLmRhdGEoKSkgPT0KLSAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotYm9vbCBBdnJjcFRhcmdldDo6R2V0UGxheWVyQXBwVmFsdWVSZXNwb25zZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyX2FkZHIsIGNvbnN0IHN0ZDo6dmVjdG9yPEF2cmNwSW50VmFsdWU+JiB2YWx1ZXMpIHsKLSAgUmF3QWRkcmVzcyBhZGRyID0gUEFSU0VfQUREUihzdHJfYWRkcik7Ci0gIGJ0cmNfcGxheWVyX3NldHRpbmdzX3QgYnRyY192YWx1ZXM7Ci0gIGlmICh2YWx1ZXMuc2l6ZSgpID49IEFSUkFZX1NJWkUoYnRyY192YWx1ZXMuYXR0cl9pZHMpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVG9vIG1hbnkgYXR0cmlidXRlIHZhbHVlcyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnRyY192YWx1ZXMubnVtX2F0dHIgPSB2YWx1ZXMuc2l6ZSgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkgewotICAgIGJ0cmNfdmFsdWVzLmF0dHJfaWRzW2ldID0gdmFsdWVzW2ldLmlkKCk7Ci0gICAgYnRyY192YWx1ZXMuYXR0cl92YWx1ZXNbaV0gPSB2YWx1ZXNbaV0udmFsdWUoKTsKLSAgfQotCi0gIExvY2tHdWFyZCBsb2NrKG11dGV4Xyk7Ci0gIFRSWV9SRVRfRlVOQyhoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpHZXQoKQotICAgICAgICAgICAgICAgICAgIC0+R2V0VGFyZ2V0SEFMSW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgICAtPmdldF9wbGF5ZXJfYXBwX3ZhbHVlX3JzcChhZGRyLCAmYnRyY192YWx1ZXMpID09Ci0gICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQXZyY3BUYXJnZXQ6OkdldFBsYXllckFwcEF0dHJUZXh0UmVzcG9uc2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cl9hZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcFN0cmluZ1ZhbHVlPiYgYXR0cnMpIHsKLSAgUmF3QWRkcmVzcyBhZGRyID0gUEFSU0VfQUREUihzdHJfYWRkcik7Ci0gIGF1dG8gYnRyY19hdHRycyA9IFN0cmluZ1ZhbHVlVG9QbGF5ZXJTZXR0aW5nc1RleHQoYXR0cnMpOwotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICBUUllfUkVUX0ZVTkMoaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgICAtPkdldFRhcmdldEhBTEludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAgLT5nZXRfcGxheWVyX2FwcF9hdHRyX3RleHRfcnNwKGFkZHIsIGJ0cmNfYXR0cnMuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX2F0dHJzLmRhdGEoKSkgPT0KLSAgICAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotYm9vbCBBdnJjcFRhcmdldDo6R2V0UGxheWVyQXBwVmFsdWVUZXh0UmVzcG9uc2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cl9hZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcFN0cmluZ1ZhbHVlPiYgdmFsdWVzKSB7Ci0gIFJhd0FkZHJlc3MgYWRkciA9IFBBUlNFX0FERFIoc3RyX2FkZHIpOwotICBhdXRvIGJ0cmNfdmFsdWVzID0gU3RyaW5nVmFsdWVUb1BsYXllclNldHRpbmdzVGV4dCh2YWx1ZXMpOwotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICBUUllfUkVUX0ZVTkMoaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgICAtPkdldFRhcmdldEhBTEludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAgLT5nZXRfcGxheWVyX2FwcF92YWx1ZV90ZXh0X3JzcChhZGRyLCBidHJjX3ZhbHVlcy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3ZhbHVlcy5kYXRhKCkpID09Ci0gICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQXZyY3BUYXJnZXQ6OkdldEVsZW1lbnRBdHRyUmVzcG9uc2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cl9hZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcFN0cmluZ1ZhbHVlPiYgYXR0cnMpIHsKLSAgUmF3QWRkcmVzcyBhZGRyID0gUEFSU0VfQUREUihzdHJfYWRkcik7Ci0gIGF1dG8gYnRyY19hdHRycyA9IFN0cmluZ1ZhbHVlVG9FbGVtZW50QXR0clZhbChhdHRycyk7Ci0gIExvY2tHdWFyZCBsb2NrKG11dGV4Xyk7Ci0gIFRSWV9SRVRfRlVOQygKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgLT5HZXRUYXJnZXRIQUxJbnRlcmZhY2UoKQotICAgICAgICAgIC0+Z2V0X2VsZW1lbnRfYXR0cl9yc3AoYWRkciwgYnRyY19hdHRycy5zaXplKCksIGJ0cmNfYXR0cnMuZGF0YSgpKSA9PQotICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi1ib29sIEF2cmNwVGFyZ2V0OjpTZXRQbGF5ZXJBcHBWYWx1ZVJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByc3Bfc3RhdHVzKSB7Ci0gIFJhd0FkZHJlc3MgYWRkciA9IFBBUlNFX0FERFIoc3RyX2FkZHIpOwotICBMb2NrR3VhcmQgbG9jayhtdXRleF8pOwotICBUUllfUkVUX0ZVTkMoaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6R2V0KCkKLSAgICAgICAgICAgICAgICAgICAtPkdldFRhcmdldEhBTEludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAgLT5zZXRfcGxheWVyX2FwcF92YWx1ZV9yc3AoCi0gICAgICAgICAgICAgICAgICAgICAgIGFkZHIsIHN0YXRpY19jYXN0PGJ0cmNfc3RhdHVzX3Q+KHJzcF9zdGF0dXMpKSA9PQotICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi1ib29sIEF2cmNwVGFyZ2V0OjpSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKAotICAgIGludDMyX3QgZXZlbnRfaWQsIGludDMyX3QgdHlwZSwKLSAgICBjb25zdCBBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UmIHBhcmFtKSB7Ci0gIGF1dG8gcGFyYW1fY29weSA9IHBhcmFtLmRhdGEoKTsKLSAgTG9ja0d1YXJkIGxvY2sobXV0ZXhfKTsKLSAgVFJZX1JFVF9GVU5DKGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgICAgICAgICAgLT5HZXRUYXJnZXRIQUxJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAgIC0+cmVnaXN0ZXJfbm90aWZpY2F0aW9uX3JzcCgKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YnRyY19ldmVudF9pZF90PihldmVudF9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJ0cmNfbm90aWZpY2F0aW9uX3R5cGVfdD4odHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICZwYXJhbV9jb3B5KSA9PSBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQXZyY3BUYXJnZXQ6OlNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gIExvY2tHdWFyZCBsb2NrKG11dGV4Xyk7Ci0gIFRSWV9SRVRfRlVOQygKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkdldCgpLT5HZXRUYXJnZXRIQUxJbnRlcmZhY2UoKS0+c2V0X3ZvbHVtZSgKLSAgICAgICAgICB2b2x1bWUpID09IEJUX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6UmVtb3RlRmVhdHVyZXNDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3JlbW90ZV9mZWF0dXJlc190IGZlYXR1cmVzKSB7Ci0gIGF1dG8gc3RyX2FkZHIgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKQotICAgIGRlbGVnYXRlXy0+T25HZXRSZW1vdGVGZWF0dXJlcyhzdHJfYWRkciwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZmVhdHVyZXMpKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6R2V0UGxheVN0YXR1c0NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgYXV0byBzdHJfYWRkciA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIExvY2tHdWFyZCBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pIGRlbGVnYXRlXy0+T25HZXRQbGF5U3RhdHVzKHN0cl9hZGRyKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6TGlzdFBsYXllckFwcEF0dHJDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGF1dG8gc3RyX2FkZHIgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKSBkZWxlZ2F0ZV8tPk9uTGlzdFBsYXllckFwcEF0dHIoc3RyX2FkZHIpOwotfQotCi12b2lkIEF2cmNwVGFyZ2V0OjpMaXN0UGxheWVyQXBwVmFsdWVzQ2FsbGJhY2soYnRyY19wbGF5ZXJfYXR0cl90IGF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBhdXRvIHN0cl9hZGRyID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgTG9ja0d1YXJkIGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgaWYgKGRlbGVnYXRlXykKLSAgICBkZWxlZ2F0ZV8tPk9uTGlzdFBsYXllckFwcFZhbHVlcyhzdHJfYWRkciwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXR0cl9pZCkpOwotfQotCi12b2lkIEF2cmNwVGFyZ2V0OjpHZXRQbGF5ZXJBcHBWYWx1ZUNhbGxiYWNrKHVpbnQ4X3QgbnVtX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcGxheWVyX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBhdXRvIHN0cl9hZGRyID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gYXR0cl92ZWM7Ci0gIGF0dHJfdmVjLnJlc2VydmUobnVtX2F0dHIpOwotICBmb3IgKGF1dG8qIGl0ID0gcF9hdHRyczsgaXQgIT0gcF9hdHRycyArIG51bV9hdHRyOyArK2l0KSB7Ci0gICAgYXR0cl92ZWMucHVzaF9iYWNrKCppdCk7Ci0gIH0KLQotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKSBkZWxlZ2F0ZV8tPk9uR2V0UGxheWVyQXBwVmFsdWUoc3RyX2FkZHIsIGF0dHJfdmVjKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6R2V0UGxheWVyQXBwQXR0cnNUZXh0Q2FsbGJhY2sodWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcGxheWVyX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgYXV0byBzdHJfYWRkciA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGF0dHJfdmVjOwotICBhdHRyX3ZlYy5yZXNlcnZlKG51bV9hdHRyKTsKLSAgZm9yIChhdXRvKiBpdCA9IHBfYXR0cnM7IGl0ICE9IHBfYXR0cnMgKyBudW1fYXR0cjsgKytpdCkgewotICAgIGF0dHJfdmVjLnB1c2hfYmFjaygqaXQpOwotICB9Ci0KLSAgTG9ja0d1YXJkIGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgaWYgKGRlbGVnYXRlXykgZGVsZWdhdGVfLT5PbkdldFBsYXllckFwcEF0dHJzVGV4dChzdHJfYWRkciwgYXR0cl92ZWMpOwotfQotCi12b2lkIEF2cmNwVGFyZ2V0OjpHZXRQbGF5ZXJBcHBWYWx1ZXNUZXh0Q2FsbGJhY2sodWludDhfdCBhdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3ZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBhdXRvIHN0cl9hZGRyID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdmFsX3ZlYzsKLSAgdmFsX3ZlYy5yZXNlcnZlKG51bV92YWwpOwotICBmb3IgKGF1dG8qIGl0ID0gcF92YWxzOyBpdCAhPSBwX3ZhbHMgKyBudW1fdmFsOyArK2l0KSB7Ci0gICAgdmFsX3ZlYy5wdXNoX2JhY2soKml0KTsKLSAgfQotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKQotICAgIGRlbGVnYXRlXy0+T25HZXRQbGF5ZXJBcHBWYWx1ZXNUZXh0KHN0cl9hZGRyLCBhdHRyX2lkLCB2YWxfdmVjKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6U2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayhidHJjX3BsYXllcl9zZXR0aW5nc190KiBwX3ZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgYXV0byBzdHJfYWRkciA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIHN0ZDo6dmVjdG9yPEF2cmNwSW50VmFsdWU+IHZhbHVlczsKLSAgdmFsdWVzLnJlc2VydmUocF92YWxzLT5udW1fYXR0cik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcF92YWxzLT5udW1fYXR0cjsgKytpKSB7Ci0gICAgdmFsdWVzLmVtcGxhY2VfYmFjayhwX3ZhbHMtPmF0dHJfaWRzW2ldLCBwX3ZhbHMtPmF0dHJfdmFsdWVzW2ldKTsKLSAgfQotCi0gIExvY2tHdWFyZCBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pIGRlbGVnYXRlXy0+T25TZXRQbGF5ZXJBcHBWYWx1ZShzdHJfYWRkciwgdmFsdWVzKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6R2V0RWxlbWVudEF0dHJDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX21lZGlhX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBhdXRvIHN0cl9hZGRyID0gQnRBZGRyU3RyaW5nKCZiZF9hZGRyKTsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gYXR0cl92ZWM7Ci0gIGF0dHJfdmVjLnJlc2VydmUobnVtX2F0dHIpOwotICBmb3IgKGF1dG8qIGl0ID0gcF9hdHRyczsgaXQgIT0gcF9hdHRycyArIG51bV9hdHRyOyArK2l0KSB7Ci0gICAgYXR0cl92ZWMucHVzaF9iYWNrKCppdCk7Ci0gIH0KLSAgTG9ja0d1YXJkIGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgaWYgKGRlbGVnYXRlXykgZGVsZWdhdGVfLT5PbkdldEVsZW1lbnRBdHRycyhzdHJfYWRkciwgYXR0cl92ZWMpOwotfQotCi12b2lkIEF2cmNwVGFyZ2V0OjpSZWdpc3Rlck5vdGlmaWNhdGlvbkNhbGxiYWNrKGJ0cmNfZXZlbnRfaWRfdCBldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgYXV0byBzdHJfYWRkciA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIExvY2tHdWFyZCBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pCi0gICAgZGVsZWdhdGVfLT5PblJlZ2lzdGVyTm90aWZpY2F0aW9uKHN0cl9hZGRyLCBzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudF9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6Vm9sdW1lQ2hhbmdlQ2FsbGJhY2sodWludDhfdCB2b2x1bWUsIHVpbnQ4X3QgY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGF1dG8gc3RyX2FkZHIgPSBCdEFkZHJTdHJpbmcoJmJkX2FkZHIpOwotICBMb2NrR3VhcmQgbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoZGVsZWdhdGVfKSBkZWxlZ2F0ZV8tPk9uVm9sdW1lQ2hhbmdlKHN0cl9hZGRyLCB2b2x1bWUsIGN0eXBlKTsKLX0KLQotdm9pZCBBdnJjcFRhcmdldDo6UGFzc3Rocm91Z2hDbWRDYWxsYmFjayhpbnQgaWQsIGludCBrZXlfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgYXV0byBzdHJfYWRkciA9IEJ0QWRkclN0cmluZygmYmRfYWRkcik7Ci0gIExvY2tHdWFyZCBsb2NrKGRlbGVnYXRlX211dGV4Xyk7Ci0gIGlmIChkZWxlZ2F0ZV8pIGRlbGVnYXRlXy0+T25QYXNzVGhyb3VnaENvbW1hbmQoc3RyX2FkZHIsIGlkLCBrZXlfc3RhdGUpOwotfQotCi0vLyBBdnJjcFRhcmdldEZhY3RvcnkgaW1wbGVtZW50YXRpb24KLQotQXZyY3BUYXJnZXRGYWN0b3J5OjpBdnJjcFRhcmdldEZhY3RvcnkoKSA9IGRlZmF1bHQ7Ci1BdnJjcFRhcmdldEZhY3Rvcnk6On5BdnJjcFRhcmdldEZhY3RvcnkoKSA9IGRlZmF1bHQ7Ci0KLWJvb2wgQXZyY3BUYXJnZXRGYWN0b3J5OjpSZWdpc3Rlckluc3RhbmNlKGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckNhbGxiYWNrJiBjYWxsYmFjaykgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBVVUlEOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLQotICBhdXRvIGF2cmNwX3RhcmdldCA9IGJhc2U6OldyYXBVbmlxdWUobmV3IEF2cmNwVGFyZ2V0KHV1aWQpKTsKLSAgY2FsbGJhY2soQkxFX1NUQVRVU19TVUNDRVNTLCB1dWlkLCBzdGQ6Om1vdmUoYXZyY3BfdGFyZ2V0KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2F2cmNwX3RhcmdldC5oIGIvc2VydmljZS9hdnJjcF90YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlZTU3Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2F2cmNwX3RhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2JsdWV0b290aF9pbnN0YW5jZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9pbnRfdmFsdWUuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX3N0cmluZ192YWx1ZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9hdnJjcF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gTm90ZTogcHJlc2VudGx5IHRoaXMgb25seSBzdXBwb3J0cwotLy8gKEJUUkNfRkVBVF9NRVRBREFUQSB8IEJUUkNfRkVBVF9BQlNPTFVURV9WT0xVTUUpCi1jbGFzcyBBdnJjcFRhcmdldCA6IHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBoYWw6OkJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlciB7Ci0gcHVibGljOgotICAvLyBXZSBvbmx5IGFsbG93IG9uZSBpbnN0YW5jZSBvZiB0aGlzIG9iamVjdCBhdCBhIHRpbWUuCi0gIHN0YXRpYyBjb25zdCBpbnQga1NpbmdsZXRvbkluc3RhbmNlSWQ7Ci0KLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBPbkdldFJlbW90ZUZlYXR1cmVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmVhdHVyZXMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25HZXRQbGF5U3RhdHVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uTGlzdFBsYXllckFwcEF0dHIoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25MaXN0UGxheWVyQXBwVmFsdWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhdHRyX2lkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uR2V0UGxheWVyQXBwVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGF0dHJzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uR2V0UGxheWVyQXBwQXR0cnNUZXh0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXR0cnMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25HZXRQbGF5ZXJBcHBWYWx1ZXNUZXh0KAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBhdHRyX2lkLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdmFsdWVzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uU2V0UGxheWVyQXBwVmFsdWUoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcEludFZhbHVlPiYgdmFsdWVzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uR2V0RWxlbWVudEF0dHJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXR0cnMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25SZWdpc3Rlck5vdGlmaWNhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV2ZW50X2lkLCB1aW50MzJfdCBwYXJhbSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPblZvbHVtZUNoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3R5cGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgT25QYXNzVGhyb3VnaENvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsIGludDMyX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qga2V5X3N0YXRlKSA9IDA7Ci0KLSAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLSAgfTsKLQotICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHVucmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgZnJvbSB0aGUgc3RhY2suCi0gIH5BdnJjcFRhcmdldCgpIG92ZXJyaWRlOwotCi0gIC8vIEFzc2lnbnMgYSBkZWxlZ2F0ZSB0byB0aGlzIGluc3RhbmNlLiB8ZGVsZWdhdGV8IG11c3Qgb3V0LWxpdmUgdGhpcwotICAvLyBBdnJjcFRhcmdldCBpbnN0YW5jZS4KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gIC8vIEJsdWV0b290aENsaWVudEluc3RhY2Ugb3ZlcnJpZGVzOgotICBjb25zdCBVdWlkJiBHZXRBcHBJZGVudGlmaWVyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludCBHZXRJbnN0YW5jZUlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBFbmFibGUoKTsKLSAgdm9pZCBEaXNhYmxlKCk7Ci0KLSAgYm9vbCBHZXRQbGF5U3RhdHVzUmVzcG9uc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsIGludDMyX3QgcGxheV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvbmdfbGVuLCB1aW50MzJfdCBzb25nX3Bvcyk7Ci0KLSAgYm9vbCBMaXN0UGxheWVyQXBwQXR0clJlc3BvbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGF0dHJzKTsKLQotICBib29sIEdldFBsYXllckFwcFZhbHVlUmVzcG9uc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcEludFZhbHVlPiYgdmFsdWVzKTsKLQotICBib29sIEdldFBsYXllckFwcEF0dHJUZXh0UmVzcG9uc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcFN0cmluZ1ZhbHVlPiYgYXR0cnMpOwotCi0gIGJvb2wgR2V0UGxheWVyQXBwVmFsdWVUZXh0UmVzcG9uc2UoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgY29uc3Qgc3RkOjp2ZWN0b3I8QXZyY3BTdHJpbmdWYWx1ZT4mIGF0dHJzKTsKLQotICBib29sIEdldEVsZW1lbnRBdHRyUmVzcG9uc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdnJjcFN0cmluZ1ZhbHVlPiYgYXR0cnMpOwotCi0gIGJvb2wgU2V0UGxheWVyQXBwVmFsdWVSZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCByc3Bfc3RhdHVzKTsKLQotICBib29sIFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UoCi0gICAgICBpbnQzMl90IGV2ZW50X2lkLCBpbnQzMl90IHR5cGUsCi0gICAgICBjb25zdCBBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UmIHBhcmFtKTsKLQotICBib29sIFNldFZvbHVtZShpbnQgdm9sdW1lKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBBdnJjcFRhcmdldEZhY3Rvcnk7Ci0KLSAgLy8gQ29uc3RydWN0b3Igc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBhcyBpbnN0YW5jZXMgYXJlIG1lYW50IHRvIGJlCi0gIC8vIG9idGFpbmVkIGZyb20gdGhlIGZhY3RvcnkuCi0gIEF2cmNwVGFyZ2V0KGNvbnN0IFV1aWQmIHV1aWQpOwotCi0gIC8vIGhhbDo6Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyIGltcGxlbWVudGF0aW9uOgotICB2b2lkIFJlbW90ZUZlYXR1cmVzQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcmVtb3RlX2ZlYXR1cmVzX3QgZmVhdHVyZXMpIG92ZXJyaWRlOwotICB2b2lkIEdldFBsYXlTdGF0dXNDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgdm9pZCBMaXN0UGxheWVyQXBwQXR0ckNhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIG92ZXJyaWRlOwotICB2b2lkIExpc3RQbGF5ZXJBcHBWYWx1ZXNDYWxsYmFjayhidHJjX3BsYXllcl9hdHRyX3QgYXR0cl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLCBidHJjX3BsYXllcl9hdHRyX3QqIHBfYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRQbGF5ZXJBcHBBdHRyc1RleHRDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcGxheWVyX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRQbGF5ZXJBcHBWYWx1ZXNUZXh0Q2FsbGJhY2sodWludDhfdCBhdHRyX2lkLCB1aW50OF90IG51bV92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayhidHJjX3BsYXllcl9zZXR0aW5nc190KiBwX3ZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRFbGVtZW50QXR0ckNhbGxiYWNrKHVpbnQ4X3QgbnVtX2F0dHIsIGJ0cmNfbWVkaWFfYXR0cl90KiBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVnaXN0ZXJOb3RpZmljYXRpb25DYWxsYmFjayhidHJjX2V2ZW50X2lkX3QgZXZlbnRfaWQsIHVpbnQzMl90IHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIHZvaWQgVm9sdW1lQ2hhbmdlQ2FsbGJhY2sodWludDhfdCB2b2x1bWUsIHVpbnQ4X3QgY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgb3ZlcnJpZGU7Ci0gIHZvaWQgUGFzc3Rocm91Z2hDbWRDYWxsYmFjayhpbnQgaWQsIGludCBrZXlfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSBvdmVycmlkZTsKLQotICAvLyBTZWUgZ2V0dGVycyBmb3IgZG9jdW1lbnRhdGlvbi4KLSAgY29uc3QgVXVpZCBhcHBfaWRlbnRpZmllcl87Ci0KLSAgLy8gTXV0ZXggdGhhdCBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHRoZSBlbnRyaWVzIGJlbG93LgotICBzdGQ6Om11dGV4IG11dGV4XzsKLQotICAvLyBSYXcgaGFuZGxlIHRvIHRoZSBEZWxlZ2F0ZSwgd2hpY2ggbXVzdCBvdXRsaXZlIHRoaXMgQXZyY3BUYXJnZXQgaW5zdGFuY2UuCi0gIHN0ZDo6bXV0ZXggZGVsZWdhdGVfbXV0ZXhfOwotICBEZWxlZ2F0ZSogZGVsZWdhdGVfID0gbnVsbHB0cjsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXZyY3BUYXJnZXQpOwotfTsKLQotLy8gQXZyY3BUYXJnZXRGYWN0b3J5IGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW5kIG9idGFpbiBhIHBlci1hcHBsaWNhdGlvbgotLy8gQXZyY3BUYXJnZXQKLS8vIGluc3RhbmNlLiBVc2VycyBzaG91bGQgY2FsbCBSZWdpc3RlckNsaWVudCB0byBvYnRhaW4gdGhlaXIgb3duIHVuaXF1ZQotLy8gQXZyY3BUYXJnZXQgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIEJsdWV0b290aCBzdGFjay4KLWNsYXNzIEF2cmNwVGFyZ2V0RmFjdG9yeQotICAgIDogcHVibGljIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSwKLSAgICAgIHByaXZhdGUgaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6VGFyZ2V0T2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgLy8gRG9uJ3QgY29uc3RydWN0L2Rlc3RydWN0IGRpcmVjdGx5IGV4Y2VwdCBpbiB0ZXN0cy4gSW5zdGVhZCwgb2J0YWluIGEgaGFuZGxlCi0gIC8vIGZyb20gYW4gQWRhcHRlciBpbnN0YW5jZS4KLSAgQXZyY3BUYXJnZXRGYWN0b3J5KCk7Ci0gIH5BdnJjcFRhcmdldEZhY3RvcnkoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhJbnN0YW5jZUZhY3Rvcnkgb3ZlcnJpZGU6Ci0gIGJvb2wgUmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF2cmNwVGFyZ2V0RmFjdG9yeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2JsdWV0b290aF9pbnN0YW5jZS5oIGIvc2VydmljZS9ibHVldG9vdGhfaW5zdGFuY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxNDZjNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2JsdWV0b290aF9pbnN0YW5jZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvbG93X2VuZXJneV9jb25zdGFudHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIEEgQmx1ZXRvb3RoSW5zdGFuY2UgcmVwcmVzZW50cyBhbiBhcHBsaWNhdGlvbidzIGhhbmRsZSB0byBhbiBpbnN0YW5jZQotLy8gdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHVuZGVybHlpbmcgQmx1ZXRvb3RoIHN0YWNrIHVzaW5nIGEgVXVpZCBhbmQgaGFzIGEKLS8vIHN0YWNrLWFzc2lnbmVkIGludGVnZXIgImluc3RhbmNlX2lkIiBJRCBhc3NvY2lhdGVkIHdpdGggaXQuCi1jbGFzcyBCbHVldG9vdGhJbnN0YW5jZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5CbHVldG9vdGhJbnN0YW5jZSgpID0gZGVmYXVsdDsKLQotICAvLyBSZXR1cm5zIHRoZSBhcHAtc3BlY2lmaWMgdW5pcXVlIElEIHVzZWQgd2hpbGUgcmVnaXN0ZXJpbmcgdGhpcyBpbnN0YW5jZS4KLSAgdmlydHVhbCBjb25zdCBVdWlkJiBHZXRBcHBJZGVudGlmaWVyKCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIEhBTCAiaW50ZXJmYWNlIElEIiBhc3NpZ25lZCB0byB0aGlzIGluc3RhbmNlIGJ5IHRoZSBzdGFjay4KLSAgdmlydHVhbCBpbnQgR2V0SW5zdGFuY2VJZCgpIGNvbnN0ID0gMDsKLQotIHByb3RlY3RlZDoKLSAgLy8gQ29uc3RydWN0b3Igc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBhcyBpbnN0YW5jZXMgYXJlIG1lYW50IHRvIGJlCi0gIC8vIG9idGFpbmVkIGZyb20gdGhlIGZhY3RvcnkuCi0gIEJsdWV0b290aEluc3RhbmNlKCkgPSBkZWZhdWx0OwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsdWV0b290aEluc3RhbmNlKTsKLX07Ci0KLS8vIEEgQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5IHByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBmb3IgZmFjdG9yeQotLy8gY2xhc3NlcyB0aGF0IGhhbmRsZSBhc3luY2hyb25vdXNseSByZWdpc3RlcmluZyBhIHBlci1hcHBsaWNhdGlvbiBpbnN0YW5jZSBvZgotLy8gYSBCbHVldG9vdGhJbnN0YW5jZSB3aXRoIHRoZSB1bmRlcmx5aW5nIHN0YWNrLgotY2xhc3MgQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5KCkgPSBkZWZhdWx0OwotCi0gIC8vIENhbGxiYWNrIGludm9rZWQgYXMgYSByZXN1bHQgb2YgYSBjYWxsIHRvIFJlZ2lzdGVySW5zdGFuY2UuCi0gIHVzaW5nIFJlZ2lzdGVyQ2FsbGJhY2sgPQotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEJMRVN0YXR1cyBzdGF0dXMsIGNvbnN0IFV1aWQmIGFwcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhJbnN0YW5jZT4gaW5zdGFuY2UpPjsKLQotICAvLyBSZWdpc3RlcnMgYW4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB1bmlxdWUgaWRlbnRpZmllciB8YXBwX3V1aWR8LgotICAvLyBPbiBzdWNjZXNzLCB0aGlzIGFzeW5jaHJvbm91c2x5IGludm9rZXMgfGNhbGxiYWNrfCB3aXRoIGEgdW5pcXVlIHBvaW50ZXIKLSAgLy8gdG8gYSBCbHVldG9vdGhJbnN0YW5jZSB3aG9zZSBvd25lcnNoaXAgY2FuIGJlIHRha2VuIGJ5IHRoZSBjYWxsZXIuIEluCi0gIC8vIHRoZSBjYXNlIG9mIGFuIGVycm9yLCB0aGUgcG9pbnRlciB3aWxsIGNvbnRhaW4gbnVsbHB0ci4KLSAgdmlydHVhbCBib29sIFJlZ2lzdGVySW5zdGFuY2UoY29uc3QgVXVpZCYgYXBwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrKSA9IDA7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvYmx1ZXRvb3RoX2ludGVyZmFjZS5jYyBiL3NlcnZpY2UvYmx1ZXRvb3RoX2ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1OGVmMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2JsdWV0b290aF9pbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYmx1ZXRvb3RoLmMKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgQmx1ZXRvb3RoIEhBTCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRpZiIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aF9oZWFkc2V0X2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfY3Npcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9oZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hlYXJpbmdfYWlkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGZfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9sZV9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3Bhbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3JjLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc2RwLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc29jay5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3ZjLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9jc2lzX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZWFyaW5nX2FpZF9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9sZV9hdWRpb19hcGkuaCIKLSNpbmNsdWRlICJidGlmL2F2cmNwL2F2cmNwX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgImJ0aWZfYTJkcC5oIgotI2luY2x1ZGUgImJ0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJidGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWZfYXYuaCIKLSNpbmNsdWRlICJidGlmX2Jxci5oIgotI2luY2x1ZGUgImJ0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZl9kZWJ1Zy5oIgotI2luY2x1ZGUgImJ0aWZfZGVidWdfYnRzbm9vcC5oIgotI2luY2x1ZGUgImJ0aWZfZGVidWdfY29ubi5oIgotI2luY2x1ZGUgImJ0aWZfaGYuaCIKLSNpbmNsdWRlICJidGlmX2tleXN0b3JlLmgiCi0jaW5jbHVkZSAiYnRpZl9tZXRyaWNzX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJidGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJjb21tb24vYWRkcmVzc19vYmZ1c2NhdG9yLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY19pZF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgImNvbW1vbi9vc191dGlscy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRpb25fdHJhY2tlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2ZHRfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnRJbnRlcmZhY2U7Ci11c2luZyBibHVldG9vdGg6OmhlYXJpbmdfYWlkOjpIZWFyaW5nQWlkSW50ZXJmYWNlOwotdXNpbmcgYmx1ZXRvb3RoOjpsZV9hdWRpbzo6TGVBdWRpb0NsaWVudEludGVyZmFjZTsKLXVzaW5nIGJsdWV0b290aDo6dmM6OlZvbHVtZUNvbnRyb2xJbnRlcmZhY2U7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU3RhdGljIHZhcmlhYmxlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJ0X2NhbGxiYWNrc190KiBidF9oYWxfY2JhY2tzID0gTlVMTDsKLWJvb2wgcmVzdHJpY3RlZF9tb2RlID0gZmFsc2U7Ci1ib29sIGNvbW1vbl9jcml0ZXJpYV9tb2RlID0gZmFsc2U7Ci1jb25zdCBpbnQgQ09ORklHX0NPTVBBUkVfQUxMX1BBU1MgPSAwYjExOwotaW50IGNvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQgPSBDT05GSUdfQ09NUEFSRV9BTExfUEFTUzsKLWJvb2wgaXNfbG9jYWxfZGV2aWNlX2F0diA9IGZhbHNlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGxpc3QgYWxsIGV4dGVuZGVkIGludGVyZmFjZXMgaGVyZSAqLwotCi0vKiBoYW5kc2ZyZWUgcHJvZmlsZSAtIGNsaWVudCAqLwotZXh0ZXJuIGNvbnN0IGJ0aGZfY2xpZW50X2ludGVyZmFjZV90KiBidGlmX2hmX2NsaWVudF9nZXRfaW50ZXJmYWNlKCk7Ci0vKiBhZHZhbmNlZCBhdWRpbyBwcm9maWxlICovCi1leHRlcm4gY29uc3QgYnRhdl9zb3VyY2VfaW50ZXJmYWNlX3QqIGJ0aWZfYXZfZ2V0X3NyY19pbnRlcmZhY2UoKTsKLWV4dGVybiBjb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqIGJ0aWZfYXZfZ2V0X3NpbmtfaW50ZXJmYWNlKCk7Ci0vKnJmYyBsMmNhcCovCi1leHRlcm4gY29uc3QgYnRzb2NrX2ludGVyZmFjZV90KiBidGlmX3NvY2tfZ2V0X2ludGVyZmFjZSgpOwotLyogaGlkIGhvc3QgcHJvZmlsZSAqLwotZXh0ZXJuIGNvbnN0IGJ0aGhfaW50ZXJmYWNlX3QqIGJ0aWZfaGhfZ2V0X2ludGVyZmFjZSgpOwotLyogaGlkIGRldmljZSBwcm9maWxlICovCi1leHRlcm4gY29uc3QgYnRoZF9pbnRlcmZhY2VfdCogYnRpZl9oZF9nZXRfaW50ZXJmYWNlKCk7Ci0vKnBhbiovCi1leHRlcm4gY29uc3QgYnRwYW5faW50ZXJmYWNlX3QqIGJ0aWZfcGFuX2dldF9pbnRlcmZhY2UoKTsKLS8qIGdhdHQgKi8KLWV4dGVybiBjb25zdCBidGdhdHRfaW50ZXJmYWNlX3QqIGJ0aWZfZ2F0dF9nZXRfaW50ZXJmYWNlKCk7Ci0vKiBhdnJjIHRhcmdldCAqLwotZXh0ZXJuIGNvbnN0IGJ0cmNfaW50ZXJmYWNlX3QqIGJ0aWZfcmNfZ2V0X2ludGVyZmFjZSgpOwotLyogYXZyYyBjb250cm9sbGVyICovCi1leHRlcm4gY29uc3QgYnRyY19jdHJsX2ludGVyZmFjZV90KiBidGlmX3JjX2N0cmxfZ2V0X2ludGVyZmFjZSgpOwotLypTRFAgc2VhcmNoIGNsaWVudCovCi1leHRlcm4gY29uc3QgYnRzZHBfaW50ZXJmYWNlX3QqIGJ0aWZfc2RwX2dldF9pbnRlcmZhY2UoKTsKLS8qSGVhcmluZyBBaWQgY2xpZW50Ki8KLWV4dGVybiBIZWFyaW5nQWlkSW50ZXJmYWNlKiBidGlmX2hlYXJpbmdfYWlkX2dldF9pbnRlcmZhY2UoKTsKLS8qIExlQXVkaW8gdGVzdGkgY2xpZW50ICovCi1leHRlcm4gTGVBdWRpb0NsaWVudEludGVyZmFjZSogYnRpZl9sZV9hdWRpb19nZXRfaW50ZXJmYWNlKCk7Ci0vKiBDb29yZGluYXRlZCBTZXQgU2VydmljZSBDbGllbnQgKi8KLWV4dGVybiBDc2lzQ2xpZW50SW50ZXJmYWNlKiBidGlmX2NzaXNfY2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLS8qIFZvbHVtZSBDb250cm9sIGNsaWVudCAqLwotZXh0ZXJuIFZvbHVtZUNvbnRyb2xJbnRlcmZhY2UqIGJ0aWZfdm9sdW1lX2NvbnRyb2xfZ2V0X2ludGVyZmFjZSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgaW50ZXJmYWNlX3JlYWR5KHZvaWQpIHsgcmV0dXJuIGJ0X2hhbF9jYmFja3MgIT0gTlVMTDsgfQotdm9pZCBzZXRfaGFsX2NiYWNrcyhidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKSB7IGJ0X2hhbF9jYmFja3MgPSBjYWxsYmFja3M7IH0KLQotc3RhdGljIGJvb2wgaXNfcHJvZmlsZShjb25zdCBjaGFyKiBwMSwgY29uc3QgY2hhciogcDIpIHsKLSAgQ0hFQ0socDEpOwotICBDSEVDSyhwMik7Ci0gIHJldHVybiBzdHJsZW4ocDEpID09IHN0cmxlbihwMikgJiYgc3RybmNtcChwMSwgcDIsIHN0cmxlbihwMikpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgQkxVRVRPT1RIIEhBTCBJTlRFUkZBQ0UgRlVOQ1RJT05TCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgaW5pdChidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzLCBib29sIHN0YXJ0X3Jlc3RyaWN0ZWQsCi0gICAgICAgICAgICAgICAgYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSwgaW50IGNvbmZpZ19jb21wYXJlX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogaW5pdF9mbGFncywgYm9vbCBpc19hdHYpIHsKLSAgTE9HX0lORk8oCi0gICAgICAiJXM6IHN0YXJ0IHJlc3RyaWN0ZWQgPSAlZCA7IGNvbW1vbiBjcml0ZXJpYSBtb2RlID0gJWQsIGNvbmZpZyBjb21wYXJlICIKLSAgICAgICJyZXN1bHQgPSAlZCIsCi0gICAgICBfX2Z1bmNfXywgc3RhcnRfcmVzdHJpY3RlZCwgaXNfY29tbW9uX2NyaXRlcmlhX21vZGUsCi0gICAgICBjb25maWdfY29tcGFyZV9yZXN1bHQpOwotCi0gIGJsdWV0b290aDo6Y29tbW9uOjpJbml0RmxhZ3M6OkxvYWQoaW5pdF9mbGFncyk7Ci0KLSAgaWYgKGludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX0RPTkU7Ci0KLSNpZmRlZiBCTFVFRFJPSURfREVCVUcKLSAgYWxsb2NhdGlvbl90cmFja2VyX2luaXQoKTsKLSNlbmRpZgotCi0gIHNldF9oYWxfY2JhY2tzKGNhbGxiYWNrcyk7Ci0KLSAgcmVzdHJpY3RlZF9tb2RlID0gc3RhcnRfcmVzdHJpY3RlZDsKLSAgY29tbW9uX2NyaXRlcmlhX21vZGUgPSBpc19jb21tb25fY3JpdGVyaWFfbW9kZTsKLSAgY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdCA9IGNvbmZpZ19jb21wYXJlX3Jlc3VsdDsKLSAgaXNfbG9jYWxfZGV2aWNlX2F0diA9IGlzX2F0djsKLQotICBzdGFja19tYW5hZ2VyX2dldF9pbnRlcmZhY2UoKS0+aW5pdF9zdGFjaygpOwotICBidGlmX2RlYnVnX2luaXQoKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGVuYWJsZSgpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgc3RhY2tfbWFuYWdlcl9nZXRfaW50ZXJmYWNlKCktPnN0YXJ0X3VwX3N0YWNrX2FzeW5jKCk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBkaXNhYmxlKHZvaWQpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgc3RhY2tfbWFuYWdlcl9nZXRfaW50ZXJmYWNlKCktPnNodXRfZG93bl9zdGFja19hc3luYygpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFudXAodm9pZCkgeyBzdGFja19tYW5hZ2VyX2dldF9pbnRlcmZhY2UoKS0+Y2xlYW5fdXBfc3RhY2soKTsgfQotCi1ib29sIGlzX3Jlc3RyaWN0ZWRfbW9kZSgpIHsgcmV0dXJuIHJlc3RyaWN0ZWRfbW9kZTsgfQotYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSgpIHsKLSAgcmV0dXJuIGlzX2JsdWV0b290aF91aWQoKSAmJiBjb21tb25fY3JpdGVyaWFfbW9kZTsKLX0KLS8vIGlmIGNvbW1vbiBjcml0ZXJpYSBtb2RlIGRpc2FibGUsIHdpbGwgYWx3YXlzIHJldHVybgotLy8gQ09ORklHX0NPTVBBUkVfQUxMX1BBU1MoMGIxMSkgaW5kaWNhdGUgZG9uJ3QgY2hlY2sgY29uZmlnIGNoZWNrc3VtLgotaW50IGdldF9jb21tb25fY3JpdGVyaWFfY29uZmlnX2NvbXBhcmVfcmVzdWx0KCkgewotICByZXR1cm4gaXNfY29tbW9uX2NyaXRlcmlhX21vZGUoKSA/IGNvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT05GSUdfQ09NUEFSRV9BTExfUEFTUzsKLX0KLQotYm9vbCBpc19hdHZfZGV2aWNlKCkgeyByZXR1cm4gaXNfbG9jYWxfZGV2aWNlX2F0djsgfQotCi1zdGF0aWMgaW50IGdldF9hZGFwdGVyX3Byb3BlcnRpZXModm9pZCkgewotICBpZiAoIWJ0aWZfaXNfZW5hYmxlZCgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZ2V0X2FkYXB0ZXJfcHJvcGVydGllcykpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2FkYXB0ZXJfcHJvcGVydHkoYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpIHsKLSAgLyogQWxsb3cgZ2V0X2FkYXB0ZXJfcHJvcGVydHkgb25seSBmb3IgQkRBRERSIGFuZCBCRE5BTUUgaWYgQlQgaXMgZGlzYWJsZWQgKi8KLSAgaWYgKCFidGlmX2lzX2VuYWJsZWQoKSAmJiAodHlwZSAhPSBCVF9QUk9QRVJUWV9CREFERFIpICYmCi0gICAgICAodHlwZSAhPSBCVF9QUk9QRVJUWV9CRE5BTUUpICYmICh0eXBlICE9IEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRSkpCi0gICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2dldF9hZGFwdGVyX3Byb3BlcnR5LCB0eXBlKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBzZXRfYWRhcHRlcl9wcm9wZXJ0eShjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBpZiAoIWJ0aWZfaXNfZW5hYmxlZCgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBzd2l0Y2ggKHByb3BlcnR5LT50eXBlKSB7Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9CRE5BTUU6Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX1NDQU5fTU9ERToKLSAgICBjYXNlIEJUX1BST1BFUlRZX0FEQVBURVJfRElTQ09WRVJZX1RJTUVPVVQ6Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9DTEFTU19PRl9ERVZJQ0U6Ci0gICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9JT19DQVBTOgotICAgIGNhc2UgQlRfUFJPUEVSVFlfTE9DQUxfSU9fQ0FQU19CTEU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGlmX3NldF9hZGFwdGVyX3Byb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc2lfZnJlZShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2RlZXBfY29weShwcm9wZXJ0eSkpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1pbnQgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhSYXdBZGRyZXNzKiByZW1vdGVfYWRkcikgewotICBpZiAoIWJ0aWZfaXNfZW5hYmxlZCgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVtb3RlX2FkZHIpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1pbnQgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpIHsKLSAgaWYgKCFidGlmX2lzX2VuYWJsZWQoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZW1vdGVfYWRkciwgdHlwZSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBpZiAoIWJ0aWZfaXNfZW5hYmxlZCgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICBbXShSYXdBZGRyZXNzIHJlbW90ZV9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICAgICBidGlmX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZyZW1vdGVfYWRkciwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgICAgICAgICBvc2lfZnJlZShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgKnJlbW90ZV9hZGRyLCBwcm9wZXJ0eV9kZWVwX2NvcHkocHJvcGVydHkpKSk7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotaW50IGdldF9yZW1vdGVfc2VydmljZXMoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsIGludCB0cmFuc3BvcnQpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX2dldF9yZW1vdGVfc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlbW90ZV9hZGRyLCB0cmFuc3BvcnQpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHN0YXJ0X2Rpc2NvdmVyeSh2b2lkKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9kbV9zdGFydF9kaXNjb3ZlcnkpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGNhbmNlbF9kaXNjb3Zlcnkodm9pZCkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fY2FuY2VsX2Rpc2NvdmVyeSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2JvbmQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IHRyYW5zcG9ydCkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgaWYgKGJ0aWZfZG1fcGFpcmluZ19pc19idXN5KCkpIHJldHVybiBCVF9TVEFUVVNfQlVTWTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fY3JlYXRlX2JvbmQsICpiZF9hZGRyLCB0cmFuc3BvcnQpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGNyZWF0ZV9ib25kX291dF9vZl9iYW5kKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGludCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X29vYl9kYXRhX3QqIHAxOTJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCogcDI1Nl9kYXRhKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICBpZiAoYnRpZl9kbV9wYWlyaW5nX2lzX2J1c3koKSkgcmV0dXJuIEJUX1NUQVRVU19CVVNZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoYnRpZl9kbV9jcmVhdGVfYm9uZF9vdXRfb2ZfYmFuZCwgKmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgKnAxOTJfZGF0YSwgKnAyNTZfZGF0YSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGEodEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLQotICByZXR1cm4gZG9faW5fbWFpbl90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKGJ0aWZfZG1fZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGEsIHRyYW5zcG9ydCkpOwotfQotCi1zdGF0aWMgaW50IGNhbmNlbF9ib25kKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX2NhbmNlbF9ib25kLCAqYmRfYWRkcikpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgcmVtb3ZlX2JvbmQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBpZiAoaXNfcmVzdHJpY3RlZF9tb2RlKCkgJiYgIWJ0aWZfc3RvcmFnZV9pc19yZXN0cmljdGVkX2RldmljZShiZF9hZGRyKSkKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0KLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX3JlbW92ZV9ib25kLCAqYmRfYWRkcikpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gMDsKLQotICByZXR1cm4gYnRpZl9kbV9nZXRfY29ubmVjdGlvbl9zdGF0ZShiZF9hZGRyKTsKLX0KLQotc3RhdGljIGludCBwaW5fcmVwbHkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdWludDhfdCBhY2NlcHQsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgIGJ0X3Bpbl9jb2RlX3QqIHBpbl9jb2RlKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICBpZiAocGluX2NvZGUgPT0gbnVsbHB0ciB8fCBwaW5fbGVuID4gUElOX0NPREVfTEVOKSByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX3Bpbl9yZXBseSwgKmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0LCBwaW5fbGVuLCAqcGluX2NvZGUpKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHNzcF9yZXBseShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCBidF9zc3BfdmFyaWFudF90IHZhcmlhbnQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFjY2VwdCwgdWludDMyX3QgcGFzc2tleSkgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgaWYgKHZhcmlhbnQgPT0gQlRfU1NQX1ZBUklBTlRfUEFTU0tFWV9FTlRSWSkgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotCi0gIGRvX2luX21haW5fdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX3NzcF9yZXBseSwgKmJkX2FkZHIsIHZhcmlhbnQsIGFjY2VwdCkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9lbmVyZ3lfaW5mbygpIHsKLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Ci0KLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2RtX3JlYWRfZW5lcmd5X2luZm8pKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgY2hhcioqIGFyZ3VtZW50cykgewotICBidGlmX2RlYnVnX2Nvbm5fZHVtcChmZCk7Ci0gIGJ0aWZfZGVidWdfYm9uZF9ldmVudF9kdW1wKGZkKTsKLSAgYnRpZl9kZWJ1Z19hMmRwX2R1bXAoZmQpOwotICBidGlmX2RlYnVnX2F2X2R1bXAoZmQpOwotICBidGFfZGVidWdfYXZfZHVtcChmZCk7Ci0gIHN0YWNrX2RlYnVnX2F2ZHRwX2FwaV9kdW1wKGZkKTsKLSAgYmx1ZXRvb3RoOjphdnJjcDo6QXZyY3BTZXJ2aWNlOjpEZWJ1Z0R1bXAoZmQpOwotICBidGlmX2RlYnVnX2NvbmZpZ19kdW1wKGZkKTsKLSAgQlRBX0hmQ2xpZW50RHVtcFN0YXRpc3RpY3MoZmQpOwotICB3YWtlbG9ja19kZWJ1Z19kdW1wKGZkKTsKLSAgb3NpX2FsbG9jYXRvcl9kZWJ1Z19kdW1wKGZkKTsKLSAgYWxhcm1fZGVidWdfZHVtcChmZCk7Ci0gIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDo6RGVidWdEdW1wKGZkKTsKLSAgSGVhcmluZ0FpZDo6RGVidWdEdW1wKGZkKTsKLSAgTGVBdWRpb0NsaWVudDo6RGVidWdEdW1wKGZkKTsKLSAgY29ubmVjdGlvbl9tYW5hZ2VyOjpkdW1wKGZkKTsKLSAgYmx1ZXRvb3RoOjpicXI6OkRlYnVnRHVtcChmZCk7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkR1bXAoZmQsIGFyZ3VtZW50cyk7Ci0gIH0gZWxzZSB7Ci0jaWYgKEJUU05PT1BfTUVNID09IFRSVUUpCi0gICAgYnRpZl9kZWJ1Z19idHNub29wX2R1bXAoZmQpOwotI2VuZGlmCi0gIH0KLX0KLQotc3RhdGljIHZvaWQgZHVtcE1ldHJpY3Moc3RkOjpzdHJpbmcqIG91dHB1dCkgewotICBibHVldG9vdGg6OmNvbW1vbjo6Qmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6R2V0SW5zdGFuY2UoKS0+V3JpdGVTdHJpbmcob3V0cHV0KTsKLX0KLQotc3RhdGljIGNvbnN0IHZvaWQqIGdldF9wcm9maWxlX2ludGVyZmFjZShjb25zdCBjaGFyKiBwcm9maWxlX2lkKSB7Ci0gIExPR19JTkZPKCIlczogaWQgPSAlcyIsIF9fZnVuY19fLCBwcm9maWxlX2lkKTsKLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKCFpbnRlcmZhY2VfcmVhZHkoKSkgcmV0dXJuIE5VTEw7Ci0KLSAgLyogY2hlY2sgZm9yIHN1cHBvcnRlZCBwcm9maWxlIGludGVyZmFjZXMgKi8KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9IQU5EU0ZSRUVfSUQpKQotICAgIHJldHVybiBibHVldG9vdGg6OmhlYWRzZXQ6OkdldEludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfSEFORFNGUkVFX0NMSUVOVF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfaGZfY2xpZW50X2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX1NPQ0tFVFNfSUQpKQotICAgIHJldHVybiBidGlmX3NvY2tfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfUEFOX0lEKSkKLSAgICByZXR1cm4gYnRpZl9wYW5fZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfQURWQU5DRURfQVVESU9fSUQpKQotICAgIHJldHVybiBidGlmX2F2X2dldF9zcmNfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9BRFZBTkNFRF9BVURJT19TSU5LX0lEKSkKLSAgICByZXR1cm4gYnRpZl9hdl9nZXRfc2lua19pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0hJREhPU1RfSUQpKQotICAgIHJldHVybiBidGlmX2hoX2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0hJRERFVl9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfaGRfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfU0RQX0NMSUVOVF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfc2RwX2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0dBVFRfSUQpKQotICAgIHJldHVybiBidGlmX2dhdHRfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfQVZfUkNfSUQpKQotICAgIHJldHVybiBidGlmX3JjX2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX0FWX1JDX0NUUkxfSUQpKQotICAgIHJldHVybiBidGlmX3JjX2N0cmxfZ2V0X2ludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfSEVBUklOR19BSURfSUQpKQotICAgIHJldHVybiBidGlmX2hlYXJpbmdfYWlkX2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9LRVlTVE9SRV9JRCkpCi0gICAgcmV0dXJuIGJsdWV0b290aDo6Ymx1ZXRvb3RoX2tleXN0b3JlOjpnZXRCbHVldG9vdGhLZXlzdG9yZUludGVyZmFjZSgpOwotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX0FDVElWSVRZX0FUVFJJQlVUSU9OX0lEKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OmFjdGl2aXR5X2F0dHJpYnV0aW9uOjpnZXRfYWN0aXZpdHlfYXR0cmlidXRpb25faW5zdGFuY2UoKTsKLSAgfQotCi0gIGlmIChpc19wcm9maWxlKHByb2ZpbGVfaWQsIEJUX1BST0ZJTEVfTEVfQVVESU9fSUQpKQotICAgIHJldHVybiBidGlmX2xlX2F1ZGlvX2dldF9pbnRlcmZhY2UoKTsKLQotICBpZiAoaXNfcHJvZmlsZShwcm9maWxlX2lkLCBCVF9QUk9GSUxFX1ZDX0lEKSkKLSAgICByZXR1cm4gYnRpZl92b2x1bWVfY29udHJvbF9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGlzX3Byb2ZpbGUocHJvZmlsZV9pZCwgQlRfUFJPRklMRV9DU0lTX0NMSUVOVF9JRCkpCi0gICAgcmV0dXJuIGJ0aWZfY3Npc19jbGllbnRfZ2V0X2ludGVyZmFjZSgpOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1pbnQgZHV0X21vZGVfY29uZmlndXJlKHVpbnQ4X3QgZW5hYmxlKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotICBpZiAoIXN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfc3RhY2tfaXNfcnVubmluZygpKQotICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9kdXRfbW9kZV9jb25maWd1cmUsIGVuYWJsZSkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBkdXRfbW9kZV9zZW5kKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogYnVmLCB1aW50OF90IGxlbikgewotICBpZiAoIWludGVyZmFjZV9yZWFkeSgpKSByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKLSAgaWYgKCFidGlmX2lzX2R1dF9tb2RlKCkpIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLQotICB1aW50OF90KiBjb3B5ID0gKHVpbnQ4X3QqKW9zaV9jYWxsb2MobGVuKTsKLSAgbWVtY3B5KGNvcHksIGJ1ZiwgbGVuKTsKLQotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgW10odWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aWZfZHV0X21vZGVfc2VuZChvcGNvZGUsIGJ1ZiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3NpX2ZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsIGNvcHksIGxlbikpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBsZV90ZXN0X21vZGUodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gIGlmICghaW50ZXJmYWNlX3JlYWR5KCkpIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZOwotCi0gIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgY2FzZSBIQ0lfQkxFX1RSQU5TTUlUVEVSX1RFU1Q6Ci0gICAgICBpZiAobGVuICE9IDMpIHJldHVybiBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOwotICAgICAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZShidGlmX2JsZV90cmFuc21pdHRlcl90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9CTEVfUkVDRUlWRVJfVEVTVDoKLSAgICAgIGlmIChsZW4gIT0gMSkgcmV0dXJuIEJUX1NUQVRVU19QQVJNX0lOVkFMSUQ7Ci0gICAgICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZShidGlmX2JsZV9yZWNlaXZlcl90ZXN0LCBidWZbMF0pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0JMRV9URVNUX0VORDoKLSAgICAgIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoYnRpZl9ibGVfdGVzdF9lbmQpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGJ0X29zX2NhbGxvdXRzX3QqIHdha2Vsb2NrX29zX2NhbGxvdXRzX3NhdmVkID0gbnVsbHB0cjsKLQotc3RhdGljIGludCBhY3F1aXJlX3dha2VfbG9ja19jYihjb25zdCBjaGFyKiBsb2NrX25hbWUpIHsKLSAgcmV0dXJuIGRvX2luX2puaV90aHJlYWQoCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYmFzZTo6SWdub3JlUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlbG9ja19vc19jYWxsb3V0c19zYXZlZC0+YWNxdWlyZV93YWtlX2xvY2spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tfbmFtZSkpOwotfQotCi1zdGF0aWMgaW50IHJlbGVhc2Vfd2FrZV9sb2NrX2NiKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSkgewotICByZXR1cm4gZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZChiYXNlOjpJZ25vcmVSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2Vsb2NrX29zX2NhbGxvdXRzX3NhdmVkLT5yZWxlYXNlX3dha2VfbG9jayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja19uYW1lKSk7Ci19Ci0KLXN0YXRpYyBidF9vc19jYWxsb3V0c190IHdha2Vsb2NrX29zX2NhbGxvdXRzX2puaSA9IHsKLSAgICBzaXplb2Yod2FrZWxvY2tfb3NfY2FsbG91dHNfam5pKSwKLSAgICBudWxscHRyIC8qIG5vdCB1c2VkICovLAotICAgIGFjcXVpcmVfd2FrZV9sb2NrX2NiLAotICAgIHJlbGVhc2Vfd2FrZV9sb2NrX2NiLAotfTsKLQotc3RhdGljIGludCBzZXRfb3NfY2FsbG91dHMoYnRfb3NfY2FsbG91dHNfdCogY2FsbG91dHMpIHsKLSAgd2FrZWxvY2tfb3NfY2FsbG91dHNfc2F2ZWQgPSBjYWxsb3V0czsKLSAgd2FrZWxvY2tfc2V0X29zX2NhbGxvdXRzKCZ3YWtlbG9ja19vc19jYWxsb3V0c19qbmkpOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX2NsZWFyKHZvaWQpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYnRpZl9jb25maWdfY2xlYXIoKSA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLXN0YXRpYyBibHVldG9vdGg6OmF2cmNwOjpTZXJ2aWNlSW50ZXJmYWNlKiBnZXRfYXZyY3Bfc2VydmljZSh2b2lkKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmF2cmNwOjpBdnJjcFNlcnZpY2U6OkdldFNlcnZpY2VJbnRlcmZhY2UoKTsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIG9iZnVzY2F0ZV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgcmV0dXJuIGJsdWV0b290aDo6Y29tbW9uOjpBZGRyZXNzT2JmdXNjYXRvcjo6R2V0SW5zdGFuY2UoKS0+T2JmdXNjYXRlKAotICAgICAgYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X21ldHJpY19pZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHJldHVybiBhbGxvY2F0ZV9tZXRyaWNfaWRfZnJvbV9tZXRyaWNfaWRfYWxsb2NhdG9yKGFkZHJlc3MpOwotfQotCi1zdGF0aWMgaW50IHNldF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplKGludCBjb2RlYywgaW50IHNpemUpIHsKLSAgcmV0dXJuIGJ0aWZfc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUoY29kZWMsIHNpemUpOwotfQotCi1FWFBPUlRfU1lNQk9MIGJ0X2ludGVyZmFjZV90IGJsdWV0b290aEludGVyZmFjZSA9IHsKLSAgICBzaXplb2YoYmx1ZXRvb3RoSW50ZXJmYWNlKSwKLSAgICBpbml0LAotICAgIGVuYWJsZSwKLSAgICBkaXNhYmxlLAotICAgIGNsZWFudXAsCi0gICAgZ2V0X2FkYXB0ZXJfcHJvcGVydGllcywKLSAgICBnZXRfYWRhcHRlcl9wcm9wZXJ0eSwKLSAgICBzZXRfYWRhcHRlcl9wcm9wZXJ0eSwKLSAgICBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzLAotICAgIGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5LAotICAgIHNldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5LAotICAgIG51bGxwdHIsCi0gICAgZ2V0X3JlbW90ZV9zZXJ2aWNlcywKLSAgICBzdGFydF9kaXNjb3ZlcnksCi0gICAgY2FuY2VsX2Rpc2NvdmVyeSwKLSAgICBjcmVhdGVfYm9uZCwKLSAgICBjcmVhdGVfYm9uZF9vdXRfb2ZfYmFuZCwKLSAgICByZW1vdmVfYm9uZCwKLSAgICBjYW5jZWxfYm9uZCwKLSAgICBnZXRfY29ubmVjdGlvbl9zdGF0ZSwKLSAgICBwaW5fcmVwbHksCi0gICAgc3NwX3JlcGx5LAotICAgIGdldF9wcm9maWxlX2ludGVyZmFjZSwKLSAgICBkdXRfbW9kZV9jb25maWd1cmUsCi0gICAgZHV0X21vZGVfc2VuZCwKLSAgICBsZV90ZXN0X21vZGUsCi0gICAgc2V0X29zX2NhbGxvdXRzLAotICAgIHJlYWRfZW5lcmd5X2luZm8sCi0gICAgZHVtcCwKLSAgICBkdW1wTWV0cmljcywKLSAgICBjb25maWdfY2xlYXIsCi0gICAgaW50ZXJvcF9kYXRhYmFzZV9jbGVhciwKLSAgICBpbnRlcm9wX2RhdGFiYXNlX2FkZCwKLSAgICBnZXRfYXZyY3Bfc2VydmljZSwKLSAgICBvYmZ1c2NhdGVfYWRkcmVzcywKLSAgICBnZXRfbWV0cmljX2lkLAotICAgIHNldF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplLAotICAgIGdlbmVyYXRlX2xvY2FsX29vYl9kYXRhfTsKLQotLy8gY2FsbGJhY2sgcmVwb3J0aW5nIGhlbHBlcnMKLQotYnRfcHJvcGVydHlfdCogcHJvcGVydHlfZGVlcF9jb3B5X2FycmF5KGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIGJ0X3Byb3BlcnR5X3QqIGNvcHkgPSBudWxscHRyOwotICBpZiAobnVtX3Byb3BlcnRpZXMgPiAwKSB7Ci0gICAgc2l6ZV90IGNvbnRlbnRfbGVuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9wcm9wZXJ0aWVzOyBpKyspIHsKLSAgICAgIGF1dG8gbGVuID0gcHJvcGVydGllc1tpXS5sZW47Ci0gICAgICBpZiAobGVuID4gMCkgewotICAgICAgICBjb250ZW50X2xlbiArPSBsZW47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY29weSA9IChidF9wcm9wZXJ0eV90Kilvc2lfY2FsbG9jKChzaXplb2YoYnRfcHJvcGVydHlfdCkgKiBudW1fcHJvcGVydGllcykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbik7Ci0gICAgQVNTRVJUKGNvcHkgIT0gbnVsbHB0cik7Ci0gICAgdWludDhfdCogY29udGVudCA9ICh1aW50OF90KikoY29weSArIG51bV9wcm9wZXJ0aWVzKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3Byb3BlcnRpZXM7IGkrKykgewotICAgICAgYXV0byBsZW4gPSBwcm9wZXJ0aWVzW2ldLmxlbjsKLSAgICAgIGNvcHlbaV0udHlwZSA9IHByb3BlcnRpZXNbaV0udHlwZTsKLSAgICAgIGNvcHlbaV0ubGVuID0gbGVuOwotICAgICAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgY29weVtpXS52YWwgPSBjb250ZW50OwotICAgICAgbWVtY3B5KGNvbnRlbnQsIHByb3BlcnRpZXNbaV0udmFsLCBsZW4pOwotICAgICAgY29udGVudCArPSBsZW47Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb3B5OwotfQotCi12b2lkIGludm9rZV9hZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2IoYnRfc3RhdGVfdCBzdGF0ZSkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYnRfc3RhdGVfdCBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSkpOwotfQotCi12b2lkIGludm9rZV9hZGFwdGVyX3Byb3BlcnRpZXNfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwKLSAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgW10oYnRfc3RhdHVzX3Qgc3RhdHVzLCBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgYWRhcHRlcl9wcm9wZXJ0aWVzX2NiLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NpX2ZyZWUocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9kZWVwX2NvcHlfYXJyYXkobnVtX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMpKSk7Ci19Ci0KLXZvaWQgaW52b2tlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYihidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgIFtdKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsICZiZF9hZGRyLCBudW1fcHJvcGVydGllcywgcHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgb3NpX2ZyZWUocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGJkX2FkZHIsIG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZGVlcF9jb3B5X2FycmF5KG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKSkpOwotfQotCi12b2lkIGludm9rZV9kZXZpY2VfZm91bmRfY2IoaW50IG51bV9wcm9wZXJ0aWVzLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICBbXShpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgZGV2aWNlX2ZvdW5kX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcHJvcGVydGllcywgcHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zaV9mcmVlKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2RlZXBfY29weV9hcnJheShudW1fcHJvcGVydGllcywgcHJvcGVydGllcykpKTsKLX0KLQotdm9pZCBpbnZva2VfZGlzY292ZXJ5X3N0YXRlX2NoYW5nZWRfY2IoYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpIHsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSkpOwotfQotCi12b2lkIGludm9rZV9waW5fcmVxdWVzdF9jYihSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2JkbmFtZV90IGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJvb2wgbWluXzE2X2RpZ2l0KSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2JkbmFtZV90IGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kLCBib29sIG1pbl8xNl9kaWdpdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIHBpbl9yZXF1ZXN0X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiZF9hZGRyLCAmYmRfbmFtZSwgY29kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl8xNl9kaWdpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLCBiZF9uYW1lLCBjb2QsIG1pbl8xNl9kaWdpdCkpOwotfQotCi12b2lkIGludm9rZV9zc3BfcmVxdWVzdF9jYihSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2JkbmFtZV90IGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19rZXkpIHsKLSAgZG9faW5fam5pX3RocmVhZChGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgIFtdKFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfYmRuYW1lX3QgYmRfbmFtZSwgdWludDMyX3QgY29kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBidF9zc3BfdmFyaWFudF90IHBhaXJpbmdfdmFyaWFudCwgdWludDMyX3QgcGFzc19rZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgc3NwX3JlcXVlc3RfY2IsICZiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmRfbmFtZSwgY29kLCBwYWlyaW5nX3ZhcmlhbnQsIHBhc3Nfa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkciwgYmRfbmFtZSwgY29kLCBwYWlyaW5nX3ZhcmlhbnQsIHBhc3Nfa2V5KSk7Ci19Ci0KLXZvaWQgaW52b2tlX29vYl9kYXRhX3JlcXVlc3RfY2IodEJUX1RSQU5TUE9SVCB0LCBib29sIHZhbGlkLCBPY3RldDE2IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYgciwgUmF3QWRkcmVzcyByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZGRyZXNzX3R5cGUpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICBidF9vb2JfZGF0YV90IG9vYl9kYXRhID0ge307Ci0gIGNoYXIqIGxvY2FsX25hbWU7Ci0gIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lKCZsb2NhbF9uYW1lKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVE1fTUFYX0xPQ19CRF9OQU1FX0xFTjsgaSsrKSB7Ci0gICAgb29iX2RhdGEuZGV2aWNlX25hbWVbaV0gPSBsb2NhbF9uYW1lW2ldOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBsb2NhbCBhZGRyZXNzCi0gIGludCBqID0gNTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICBvb2JfZGF0YS5hZGRyZXNzW2ldID0gcmF3X2FkZHJlc3MuYWRkcmVzc1tqXTsKLSAgICBqLS07Ci0gIH0KLSAgb29iX2RhdGEuYWRkcmVzc1s2XSA9IGFkZHJlc3NfdHlwZTsKLQotICAvLyBFYWNoIHZhbHVlIChmb3IgQyBhbmQgUikgaXMgMTYgb2N0ZXRzIGluIGxlbmd0aAotICBib29sIGNfZW1wdHkgPSB0cnVlOwotICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAvLyBDIGNhbm5vdCBiZSBhbGwgMHMsIGlmIHNvIHRoZW4gd2Ugd2FudCB0byBmYWlsCi0gICAgaWYgKGNbaV0gIT0gMCkgY19lbXB0eSA9IGZhbHNlOwotICAgIG9vYl9kYXRhLmNbaV0gPSBjW2ldOwotICAgIC8vIFIgaXMgb3B0aW9uYWwgYW5kIG1heSBiZSBlbXB0eQotICAgIG9vYl9kYXRhLnJbaV0gPSByW2ldOwotICB9Ci0gIG9vYl9kYXRhLmlzX3ZhbGlkID0gdmFsaWQgJiYgIWNfZW1wdHk7Ci0gIC8vIFRoZSBvb2JfZGF0YV9sZW5ndGggaXMgMiBvY3RlY3RzIGluIGxlbmd0aC4gIFRoZSB2YWx1ZSBpbmNsdWRlcyB0aGUgbGVuZ3RoCi0gIC8vIG9mIGl0c2VsZi4gMTYgKyAxNiArIDIgPSAzNCBEYXRhIDB4MDAyMiBMaXR0bGUgRW5kaWFuIG9yZGVyIDB4MjIwMAotICBvb2JfZGF0YS5vb2JfZGF0YV9sZW5ndGhbMF0gPSAwOwotICBvb2JfZGF0YS5vb2JfZGF0YV9sZW5ndGhbMV0gPSAzNDsKLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0gZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICBbXSh0QlRfVFJBTlNQT1JUIHQsIGJ0X29vYl9kYXRhX3Qgb29iX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIGdlbmVyYXRlX2xvY2FsX29vYl9kYXRhX2NiLCB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb29iX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgIHQsIG9vYl9kYXRhKSk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBGYWlsZWQgdG8gY2FsbCBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7Ci0gIH0KLX0KLQotdm9pZCBpbnZva2VfYm9uZF9zdGF0ZV9jaGFuZ2VkX2NiKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JvbmRfc3RhdGVfdCBzdGF0ZSwgaW50IGZhaWxfcmVhc29uKSB7Ci0gIGRvX2luX2puaV90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kT25jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9ib25kX3N0YXRlX3Qgc3RhdGUsIGludCBmYWlsX3JlYXNvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9uZF9zdGF0ZV9jaGFuZ2VkX2NiLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJkX2FkZHIsIHN0YXRlLCBmYWlsX3JlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGJkX2FkZHIsIHN0YXRlLCBmYWlsX3JlYXNvbikpOwotfQotCi12b2lkIGludm9rZV9hY2xfc3RhdGVfY2hhbmdlZF9jYihidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2FjbF9zdGF0ZV90IHN0YXRlLCBpbnQgdHJhbnNwb3J0X2xpbmtfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2hjaV9lcnJvcl9jb2RlX3QgaGNpX3JlYXNvbikgewotICBkb19pbl9qbmlfdGhyZWFkKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgW10oYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2FjbF9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgIGludCB0cmFuc3BvcnRfbGlua190eXBlLCBidF9oY2lfZXJyb3JfY29kZV90IGhjaV9yZWFzb24pIHsKLSAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oYWxfY2JhY2tzLCBhY2xfc3RhdGVfY2hhbmdlZF9jYiwgc3RhdHVzLCAmYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgdHJhbnNwb3J0X2xpbmtfdHlwZSwgaGNpX3JlYXNvbik7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBzdGF0dXMsIGJkX2FkZHIsIHN0YXRlLCB0cmFuc3BvcnRfbGlua190eXBlLCBoY2lfcmVhc29uKSk7Ci19Ci0KLXZvaWQgaW52b2tlX3RocmVhZF9ldnRfY2IoYnRfY2JfdGhyZWFkX2V2dCBldmVudCkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYnRfY2JfdGhyZWFkX2V2dCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIHRocmVhZF9ldnRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IERJU0FTU09DSUFURV9KVk0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfaGFsX2NiYWNrcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkpOwotfQotCi12b2lkIGludm9rZV9sZV90ZXN0X21vZGVfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCB1aW50MTZfdCBjb3VudCkgewotICBkb19pbl9qbmlfdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZE9uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYnRfc3RhdHVzX3Qgc3RhdHVzLCB1aW50MTZfdCBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIGxlX3Rlc3RfbW9kZV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgY291bnQpKTsKLX0KLQotLy8gdGFrZXMgb3duZXJzaGlwIG9mIHx1aWRfZGF0YXwKLXZvaWQgaW52b2tlX2VuZXJneV9pbmZvX2NiKGJ0X2FjdGl2aXR5X2VuZXJneV9pbmZvIGVuZXJneV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfdWlkX3RyYWZmaWNfdCogdWlkX2RhdGEpIHsKLSAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgIFtdKGJ0X2FjdGl2aXR5X2VuZXJneV9pbmZvIGVuZXJneV9pbmZvLCBidF91aWRfdHJhZmZpY190KiB1aWRfZGF0YSkgewotICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hhbF9jYmFja3MsIGVuZXJneV9pbmZvX2NiLCAmZW5lcmd5X2luZm8sIHVpZF9kYXRhKTsKLSAgICAgICAgICAgIG9zaV9mcmVlKHVpZF9kYXRhKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIGVuZXJneV9pbmZvLCB1aWRfZGF0YSkpOwotfQotCi12b2lkIGludm9rZV9saW5rX3F1YWxpdHlfcmVwb3J0X2NiKHVpbnQ2NF90IHRpbWVzdGFtcCwgaW50IHJlcG9ydF9pZCwgaW50IHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbnIsIGludCByZXRyYW5zbWlzc2lvbl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhY2tldHNfbm90X3JlY2VpdmVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpIHsKLSAgZG9faW5fam5pX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKAotICAgICAgICAgIFtdKHVpbnQ2NF90IHRpbWVzdGFtcCwgaW50IHJlcG9ydF9pZCwgaW50IHJzc2ksIGludCBzbnIsCi0gICAgICAgICAgICAgaW50IHJldHJhbnNtaXNzaW9uX2NvdW50LCBpbnQgcGFja2V0c19ub3RfcmVjZWl2ZV9jb3VudCwKLSAgICAgICAgICAgICBpbnQgbmVnYXRpdmVfYWNrbm93bGVkZ2VtZW50X2NvdW50KSB7Ci0gICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGFsX2NiYWNrcywgbGlua19xdWFsaXR5X3JlcG9ydF9jYiwgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9pZCwgcnNzaSwgc25yLCByZXRyYW5zbWlzc2lvbl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2Fja25vd2xlZGdlbWVudF9jb3VudCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICB0aW1lc3RhbXAsIHJlcG9ydF9pZCwgcnNzaSwgc25yLCByZXRyYW5zbWlzc2lvbl9jb3VudCwKLSAgICAgICAgICBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvYmx1ZXRvb3RodGJkLnJjIGIvc2VydmljZS9ibHVldG9vdGh0YmQucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTM3MTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9ibHVldG9vdGh0YmQucmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNlcnZpY2UgYmx1ZXRvb3RodGJkIC9zeXN0ZW0vYmluL2JsdWV0b290aHRiZAotICAgIGNsYXNzIG1haW4KLSAgICB1c2VyIGJsdWV0b290aAotICAgIGdyb3VwIHdha2Vsb2NrIG5ldF9idF9hZG1pbiBibHVldG9vdGggbmV0X2FkbWluCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NsaWVudC9tYWluLmNjIGIvc2VydmljZS9jbGllbnQvbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYjA2ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NsaWVudC9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGJhc2UvYXRfZXhpdC5oPgotI2luY2x1ZGUgPGJhc2UvY29tbWFuZF9saW5lLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfc3BsaXQuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0JuQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0JuQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9CbkJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0Q2xpZW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlQWR2ZXJ0aXNlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZVNjYW5uZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTG93RW5lcmd5Lmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2FkYXB0ZXJfc3RhdGUuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvbG93X2VuZXJneV9jb25zdGFudHMuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvc2Nhbl9maWx0ZXIuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5oPgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLSNpbmNsdWRlICJub3RyZWFjaGVkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXVzaW5nIGFuZHJvaWQ6OnNwOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OmdldFNlcnZpY2U7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aDsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEdhdHRDbGllbnQ7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhMZUFkdmVydGlzZXI7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhMZVNjYW5uZXI7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhMb3dFbmVyZ3k7Ci0KLW5hbWVzcGFjZSB7Ci0KLSNkZWZpbmUgQ09MT1JfT0ZGICJceDFCWzBtIgotI2RlZmluZSBDT0xPUl9SRUQgIlx4MUJbMDs5MW0iCi0jZGVmaW5lIENPTE9SX0dSRUVOICJceDFCWzA7OTJtIgotI2RlZmluZSBDT0xPUl9ZRUxMT1cgIlx4MUJbMDs5M20iCi0jZGVmaW5lIENPTE9SX0JMVUUgIlx4MUJbMDs5NG0iCi0jZGVmaW5lIENPTE9SX01BR0VOVEEgIlx4MUJbMDs5NW0iCi0jZGVmaW5lIENPTE9SX0JPTERHUkFZICJceDFCWzE7MzBtIgotI2RlZmluZSBDT0xPUl9CT0xEV0hJVEUgIlx4MUJbMTszN20iCi0jZGVmaW5lIENPTE9SX0JPTERZRUxMT1cgIlx4MUJbMTs5M20iCi0jZGVmaW5lIENMRUFSX0xJTkUgIlx4MUJbMksiCi0KLSNkZWZpbmUgQ0hFQ0tfQVJHU19DT1VOVChhcmdzLCBvcCwgbnVtLCBtc2cpIFwKLSAgaWYgKCEoKGFyZ3MpLnNpemUoKSBvcCBudW0pKSB7ICAgICAgICAgICAgIFwKLSAgICBQcmludEVycm9yKG1zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBDSEVDS19OT19BUkdTKGFyZ3MpIFwKLSAgQ0hFQ0tfQVJHU19DT1VOVChhcmdzLCA9PSwgMCwgIkV4cGVjdGVkIG5vIGFyZ3VtZW50cyIpCi0KLS8vIFRPRE8oYXJtYW5zaXRvKTogQ2xlYW4gdXAgdGhpcyBjb2RlLiBSaWdodCBub3cgZXZlcnl0aGluZyBpcyBpbiB0aGlzCi0vLyBtb25vbGl0aGljIGZpbGUuIFdlIHNob3VsZCBvcmdhbml6ZSB0aGlzIGludG8gZGlmZmVyZW50IGNsYXNzZXMgZm9yIGNvbW1hbmQKLS8vIGhhbmRsaW5nLCBjb25zb2xlIG91dHB1dC9wcmludGluZywgY2FsbGJhY2sgaGFuZGxpbmcsIGV0Yy4KLS8vIChTZWUgaHR0cDovL2IvMjMzODc2MTEpCi0KLS8vIFVzZWQgdG8gc3luY2hyb25pemUgdGhlIHByaW50aW5nIG9mIHRoZSBjb21tYW5kLWxpbmUgcHJvbXB0IGFuZCBpbmNvbWluZwotLy8gQmluZGVyIGNhbGxiYWNrcy4KLXN0ZDo6YXRvbWljX2Jvb2wgc2hvd2luZ19wcm9tcHQoZmFsc2UpOwotCi0vLyBUaGUgcmVnaXN0ZXJlZCBJQmx1ZXRvb3RoTG93RW5lcmd5IGNsaWVudCBoYW5kbGUuIElmIHxibGVfcmVnaXN0ZXJpbmd8IGlzCi0vLyB0cnVlIHRoZW4gYW4gb3BlcmF0aW9uIHRvIHJlZ2lzdGVyIHRoZSBjbGllbnQgaXMgaW4gcHJvZ3Jlc3MuCi1zdGQ6OmF0b21pY19ib29sIGJsZV9yZWdpc3RlcmluZyhmYWxzZSk7Ci1zdGQ6OmF0b21pY19pbnQgYmxlX2NsaWVudF9pZCgwKTsKLQotLy8gVGhlIHJlZ2lzdGVyZWQgSUJsdWV0b290aExlQWR2ZXJ0aXNlciBoYW5kbGUuIElmIHxibGVfYWR2ZXJ0aXNlcl9yZWdpc3RlcmluZ3wKLS8vIGlzIHRydWUgdGhlbiBhbiBvcGVyYXRpb24gdG8gcmVnaXN0ZXIgdGhlIGFkdmVydGlzZXIgaXMgaW4gcHJvZ3Jlc3MuCi1jb25zdCBpbnQgaW52YWxpZF9hZHZlcnRpc2VyX2lkID0gLTE7Ci1zdGQ6OmF0b21pY19ib29sIGJsZV9hZHZlcnRpc2VyX3JlZ2lzdGVyaW5nKGZhbHNlKTsKLXN0ZDo6YXRvbWljX2ludCBibGVfYWR2ZXJ0aXNlcl9pZChpbnZhbGlkX2FkdmVydGlzZXJfaWQpOwotCi0vLyBUaGUgcmVnaXN0ZXJlZCBJQmx1ZXRvb3RoTGVTY2FubmVyIGhhbmRsZS4gSWYgfGJsZV9zY2FubmVyX3JlZ2lzdGVyaW5nfCBpcwotLy8gdHJ1ZSB0aGVuIGFuIG9wZXJhdGlvbiB0byByZWdpc3RlciB0aGUgc2Nhbm5lciBpcyBpbiBwcm9ncmVzcy4KLXN0ZDo6YXRvbWljX2Jvb2wgYmxlX3NjYW5uZXJfcmVnaXN0ZXJpbmcoZmFsc2UpOwotc3RkOjphdG9taWNfaW50IGJsZV9zY2FubmVyX2lkKDApOwotCi0vLyBUaGUgcmVnaXN0ZXJlZCBJQmx1ZXRvb3RoR2F0dENsaWVudCBjbGllbnQgaGFuZGxlLiBJZiB8Z2F0dF9yZWdpc3RlcmluZ3wgaXMKLS8vIHRydWUgdGhlbiBhbiBvcGVyYXRpb24gdG8gcmVnaXN0ZXIgdGhlIGNsaWVudCBpcyBpbiBwcm9ncmVzcy4KLXN0ZDo6YXRvbWljX2Jvb2wgZ2F0dF9yZWdpc3RlcmluZyhmYWxzZSk7Ci1zdGQ6OmF0b21pY19pbnQgZ2F0dF9jbGllbnRfaWQoMCk7Ci0KLS8vIFRydWUgaWYgd2Ugc2hvdWxkIGR1bXAgdGhlIHNjYW4gcmVjb3JkIGJ5dGVzIGZvciBpbmNvbWluZyBzY2FuIHJlc3VsdHMuCi1zdGQ6OmF0b21pY19ib29sIGR1bXBfc2Nhbl9yZWNvcmQoZmFsc2UpOwotCi0vLyBUcnVlIGlmIHRoZSByZW1vdGUgcHJvY2VzcyBoYXMgZGllZCBhbmQgd2Ugc2hvdWxkIGV4aXQuCi1zdGQ6OmF0b21pY19ib29sIHNob3VsZF9leGl0KGZhbHNlKTsKLQotc3RkOjpzdHJpbmcga1NlcnZpY2VOYW1lID0gImJsdWV0b290aC1zZXJ2aWNlIjsKLQotdm9pZCBQcmludFByb21wdCgpIHsgY291dCA8PCBDT0xPUl9CTFVFICJbRkNMSV0gIiBDT0xPUl9PRkYgPDwgZmx1c2g7IH0KLQotdm9pZCBQcmludEVycm9yKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICBjb3V0IDw8IENPTE9SX1JFRCA8PCBtZXNzYWdlIDw8IENPTE9SX09GRiA8PCBlbmRsOwotfQotCi12b2lkIFByaW50T3BTdGF0dXMoY29uc3Qgc3RkOjpzdHJpbmcmIG9wLCBib29sIHN0YXR1cykgewotICBjb3V0IDw8IENPTE9SX0JPTERXSElURSA8PCBvcCA8PCAiIHN0YXR1czogIiBDT0xPUl9PRkYKLSAgICAgICA8PCAoc3RhdHVzID8gKENPTE9SX0dSRUVOICJzdWNjZXNzIikgOiAoQ09MT1JfUkVEICJmYWlsdXJlIikpCi0gICAgICAgPDwgQ09MT1JfT0ZGIDw8IGVuZGw7Ci19Ci0KLWlubGluZSB2b2lkIEJlZ2luQXN5bmNPdXQoKSB7Ci0gIGlmIChzaG93aW5nX3Byb21wdC5sb2FkKCkpIGNvdXQgPDwgQ0xFQVJfTElORSA8PCAiXHIiOwotfQotCi1pbmxpbmUgdm9pZCBFbmRBc3luY091dCgpIHsKLSAgc3RkOjpmbHVzaChjb3V0KTsKLSAgaWYgKHNob3dpbmdfcHJvbXB0LmxvYWQoKSkKLSAgICBQcmludFByb21wdCgpOwotICBlbHNlCi0gICAgY291dCA8PCBlbmRsOwotfQotCi1jbGFzcyBDTElCbHVldG9vdGhDYWxsYmFjayA6IHB1YmxpYyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgQ0xJQmx1ZXRvb3RoQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0gIH5DTElCbHVldG9vdGhDYWxsYmFjaygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvLyBJQmx1ZXRvb3RoQ2FsbGJhY2sgb3ZlcnJpZGVzOgotICBTdGF0dXMgT25CbHVldG9vdGhTdGF0ZUNoYW5nZShpbnQzMl90IHByZXZfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmV3X3N0YXRlKSBvdmVycmlkZSB7Ci0gICAgQmVnaW5Bc3luY091dCgpOwotICAgIGNvdXQgPDwgQ09MT1JfQk9MRFdISVRFICJBZGFwdGVyIHN0YXRlIGNoYW5nZWQ6ICIgQ09MT1JfT0ZGIDw8IENPTE9SX01BR0VOVEEKLSAgICAgICAgIDw8IEFkYXB0ZXJTdGF0ZVRvU3RyaW5nKGJsdWV0b290aDo6QWRhcHRlclN0YXRlKHByZXZfc3RhdGUpKQotICAgICAgICAgPDwgQ09MT1JfT0ZGIDw8IENPTE9SX0JPTERXSElURSAiIC0+ICIgQ09MT1JfT0ZGIDw8IENPTE9SX0JPTERZRUxMT1cKLSAgICAgICAgIDw8IEFkYXB0ZXJTdGF0ZVRvU3RyaW5nKGJsdWV0b290aDo6QWRhcHRlclN0YXRlKG5ld19zdGF0ZSkpCi0gICAgICAgICA8PCBDT0xPUl9PRkY7Ci0gICAgRW5kQXN5bmNPdXQoKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBTdGF0dXMgT25Tc3BSZXF1ZXN0KGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgZGV2aWNlX25hbWUsIGludDMyX3QgY29kLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFpcmluZ192YXJpYW50LCBpbnQzMl90IHBhc3Nfa2V5KSBvdmVycmlkZSB7Ci0gICAgLy8gbm8tb3AKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgU3RhdHVzIE9uR2V0Qm9uZGVkRGV2aWNlcygKLSAgICAgIGludDMyX3Qgc3RhdHVzLAotICAgICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHJpbmcxNj4mIGRldmljZV9hZGRyZXNzZXMpIG92ZXJyaWRlIHsKLSAgICBCZWdpbkFzeW5jT3V0KCk7Ci0gICAgc3RkOjpjb3V0IDw8ICJCb25kZWQgZGV2aWNlczpcbiI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VfYWRkcmVzcyA6IGRldmljZV9hZGRyZXNzZXMpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiICAgICIgPDwgZGV2aWNlX2FkZHJlc3MgPDwgIlxuIjsKLSAgICB9Ci0gICAgRW5kQXN5bmNPdXQoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgU3RhdHVzIE9uQm9uZFN0YXRlQ2hhbmdlZChpbnQzMl90IHN0YXR1cywgY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpIG92ZXJyaWRlIHsKLSAgICBCZWdpbkFzeW5jT3V0KCk7Ci0gICAgc3RkOjpjb3V0IDw8IENPTE9SX0JPTERXSElURSAiRGV2aWNlIGFkZHJlc3M6ICIgPDwgQ09MT1JfQk9MRFlFTExPVyAiWyIKLSAgICAgICAgICAgICAgPDwgZGV2aWNlX2FkZHJlc3MgPDwgIiBib25kIHN0YXRlOiAiIDw8IHN0YXRlIDw8ICIgXSAiCi0gICAgICAgICAgICAgIDw8IENPTE9SX0JPTERXSElURSAiLSBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgPDwgKHN0YXR1cyA9PSAwID8gIlNVQ0NFU1MiIDogIkZBSUwiKSA8PCBDT0xPUl9PRkY7Ci0gICAgRW5kQXN5bmNPdXQoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgU3RhdHVzIE9uR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcygKLSAgICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICBjb25zdCBhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aFJlbW90ZURldmljZVByb3BzJiBwcm9wcykgb3ZlcnJpZGUgewotICAgIC8vIG5vLW9wCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIFN0YXR1cyBPbkRldmljZUZvdW5kKAotICAgICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wcyYgcHJvcHMpIG92ZXJyaWRlIHsKLSAgICAvLyBuby1vcAotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBTdGF0dXMgT25EZXZpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCkgb3ZlcnJpZGUgewotICAgIC8vIG5vLW9wCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIFN0YXR1cyBPblNjYW5FbmFibGVDaGFuZ2VkKGJvb2wgc2Nhbl9lbmFibGVkKSBvdmVycmlkZSB7Ci0gICAgLy8gbm8tb3AKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ0xJQmx1ZXRvb3RoQ2FsbGJhY2spOwotfTsKLQotY2xhc3MgQ0xJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sKLSAgICA6IHB1YmxpYyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sgewotIHB1YmxpYzoKLSAgQ0xJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0gIH5DTElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjaygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvLyBJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sgb3ZlcnJpZGVzOgotICBTdGF0dXMgT25DbGllbnRSZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBjbGllbnRfaWQpIG92ZXJyaWRlIHsKLSAgICBCZWdpbkFzeW5jT3V0KCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBibHVldG9vdGg6OkJMRV9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIHJlZ2lzdGVyIEJMRSBjbGllbnQiKTsKLSAgICB9IGVsc2UgewotICAgICAgYmxlX2NsaWVudF9pZCA9IGNsaWVudF9pZDsKLSAgICAgIGNvdXQgPDwgQ09MT1JfQk9MRFdISVRFICJSZWdpc3RlcmVkIEJMRSBjbGllbnQgd2l0aCBJRDogIiBDT0xPUl9PRkYKLSAgICAgICAgICAgPDwgQ09MT1JfR1JFRU4gPDwgY2xpZW50X2lkIDw8IENPTE9SX09GRjsKLSAgICB9Ci0gICAgRW5kQXN5bmNPdXQoKTsKLQotICAgIGJsZV9yZWdpc3RlcmluZyA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBTdGF0dXMgT25Db25uZWN0aW9uU3RhdGUoaW50IHN0YXR1cywgaW50IGNsaWVudF9pZCwgY29uc3QgU3RyaW5nMTYmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCkgb3ZlcnJpZGUgewotICAgIEJlZ2luQXN5bmNPdXQoKTsKLSAgICBjb3V0IDw8IENPTE9SX0JPTERXSElURSAiQ29ubmVjdGlvbiBzdGF0ZTogIiA8PCBDT0xPUl9CT0xEWUVMTE9XICJbIgotICAgICAgICAgPDwgYWRkcmVzcyA8PCAiIGNvbm5lY3RlZDogIiA8PCAoY29ubmVjdGVkID8gInRydWUiIDogImZhbHNlIikgPDwgIiBdICIKLSAgICAgICAgIDw8IENPTE9SX0JPTERXSElURSAiLSBzdGF0dXM6ICIgPDwgc3RhdHVzCi0gICAgICAgICA8PCBDT0xPUl9CT0xEV0hJVEUgIiAtIGNsaWVudF9pZDogIiA8PCBjbGllbnRfaWQgPDwgQ09MT1JfT0ZGOwotICAgIEVuZEFzeW5jT3V0KCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIFN0YXR1cyBPbk10dUNoYW5nZWQoaW50IHN0YXR1cywgY29uc3QgU3RyaW5nMTYmIGFkZHJlc3MsIGludCBtdHUpIG92ZXJyaWRlIHsKLSAgICBCZWdpbkFzeW5jT3V0KCk7Ci0gICAgY291dCA8PCBDT0xPUl9CT0xEV0hJVEUgIk1UVSBjaGFuZ2VkOiAiIDw8IENPTE9SX0JPTERZRUxMT1cgIlsiIDw8IGFkZHJlc3MKLSAgICAgICAgIDw8ICIgXSAiIDw8IENPTE9SX0JPTERXSElURSAiIC0gc3RhdHVzOiAiIDw8IHN0YXR1cwotICAgICAgICAgPDwgQ09MT1JfQk9MRFdISVRFICIgLSBtdHU6ICIgPDwgbXR1IDw8IENPTE9SX09GRjsKLSAgICBFbmRBc3luY091dCgpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDTElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjayk7Ci19OwotCi1jbGFzcyBDTElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjawotICAgIDogcHVibGljIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjayB7Ci0gcHVibGljOgotICBDTElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaygpID0gZGVmYXVsdDsKLSAgfkNMSUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIC8vIElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjayBvdmVycmlkZXM6Ci0gIFN0YXR1cyBPbkFkdmVydGlzZXJSZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBhZHZlcnRpc2VyX2lkKSBvdmVycmlkZSB7Ci0gICAgQmVnaW5Bc3luY091dCgpOwotICAgIGlmIChzdGF0dXMgIT0gYmx1ZXRvb3RoOjpCTEVfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIFByaW50RXJyb3IoIkZhaWxlZCB0byByZWdpc3RlciBCTEUgYWR2ZXJ0aXNlciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBibGVfYWR2ZXJ0aXNlcl9pZCA9IGFkdmVydGlzZXJfaWQ7Ci0gICAgICBjb3V0IDw8IENPTE9SX0JPTERXSElURSAiUmVnaXN0ZXJlZCBCTEUgYWR2ZXJ0aXNlciB3aXRoIElEOiAiIENPTE9SX09GRgotICAgICAgICAgICA8PCBDT0xPUl9HUkVFTiA8PCBhZHZlcnRpc2VyX2lkIDw8IENPTE9SX09GRjsKLSAgICB9Ci0gICAgRW5kQXN5bmNPdXQoKTsKLQotICAgIGJsZV9hZHZlcnRpc2VyX3JlZ2lzdGVyaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIFN0YXR1cyBPbk11bHRpQWR2ZXJ0aXNlQ2FsbGJhY2soCi0gICAgICBpbnQgc3RhdHVzLCBib29sIGlzX3N0YXJ0LAotICAgICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5ncyYgLyogc2V0dGluZ3MgKi8pIHsKLSAgICBCZWdpbkFzeW5jT3V0KCk7Ci0gICAgc3RkOjpzdHJpbmcgb3AgPSBpc19zdGFydCA/ICJzdGFydCIgOiAic3RvcCI7Ci0KLSAgICBQcmludE9wU3RhdHVzKCJBZHZlcnRpc2luZyAiICsgb3AsIHN0YXR1cyA9PSBibHVldG9vdGg6OkJMRV9TVEFUVVNfU1VDQ0VTUyk7Ci0gICAgRW5kQXN5bmNPdXQoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ0xJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2spOwotfTsKLQotY2xhc3MgQ0xJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2sKLSAgICA6IHB1YmxpYyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgQ0xJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0gIH5DTElCbHVldG9vdGhMZVNjYW5uZXJDYWxsYmFjaygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvLyBJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sgb3ZlcnJpZGVzOgotICBTdGF0dXMgT25TY2FubmVyUmVnaXN0ZXJlZChpbnQgc3RhdHVzLCBpbnQgc2Nhbm5lcl9pZCkgb3ZlcnJpZGUgewotICAgIEJlZ2luQXN5bmNPdXQoKTsKLSAgICBpZiAoc3RhdHVzICE9IGJsdWV0b290aDo6QkxFX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gcmVnaXN0ZXIgQkxFIGNsaWVudCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBibGVfc2Nhbm5lcl9pZCA9IHNjYW5uZXJfaWQ7Ci0gICAgICBjb3V0IDw8IENPTE9SX0JPTERXSElURSAiUmVnaXN0ZXJlZCBCTEUgY2xpZW50IHdpdGggSUQ6ICIgQ09MT1JfT0ZGCi0gICAgICAgICAgIDw8IENPTE9SX0dSRUVOIDw8IHNjYW5uZXJfaWQgPDwgQ09MT1JfT0ZGOwotICAgIH0KLSAgICBFbmRBc3luY091dCgpOwotCi0gICAgYmxlX3NjYW5uZXJfcmVnaXN0ZXJpbmcgPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgU3RhdHVzIE9uU2NhblJlc3VsdCgKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OmJsdWV0b290aDo6U2NhblJlc3VsdCYgc2Nhbl9yZXN1bHQpIG92ZXJyaWRlIHsKLSAgICBCZWdpbkFzeW5jT3V0KCk7Ci0gICAgY291dCA8PCBDT0xPUl9CT0xEV0hJVEUgIlNjYW4gcmVzdWx0OiAiIDw8IENPTE9SX0JPTERZRUxMT1cgIlsiCi0gICAgICAgICA8PCBzY2FuX3Jlc3VsdC5kZXZpY2VfYWRkcmVzcygpIDw8ICJdICIKLSAgICAgICAgIDw8IENPTE9SX0JPTERXSElURSAiLSBSU1NJOiAiIDw8IHNjYW5fcmVzdWx0LnJzc2koKSA8PCBDT0xPUl9PRkY7Ci0KLSAgICBpZiAoZHVtcF9zY2FuX3JlY29yZCkgewotICAgICAgY291dCA8PCAiIC0gUmVjb3JkOiAiCi0gICAgICAgICAgIDw8IGJhc2U6OkhleEVuY29kZShzY2FuX3Jlc3VsdC5zY2FuX3JlY29yZCgpLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fcmVzdWx0LnNjYW5fcmVjb3JkKCkuc2l6ZSgpKTsKLSAgICB9Ci0gICAgRW5kQXN5bmNPdXQoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ0xJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2spOwotfTsKLQotY2xhc3MgQ0xJR2F0dENsaWVudENhbGxiYWNrCi0gICAgOiBwdWJsaWMgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbkJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjayB7Ci0gcHVibGljOgotICBDTElHYXR0Q2xpZW50Q2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci0gIH5DTElHYXR0Q2xpZW50Q2FsbGJhY2soKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjayBvdmVycmlkZXM6Ci0gIFN0YXR1cyBPbkNsaWVudFJlZ2lzdGVyZWQoaW50IHN0YXR1cywgaW50IGNsaWVudF9pZCkgb3ZlcnJpZGUgewotICAgIEJlZ2luQXN5bmNPdXQoKTsKLSAgICBpZiAoc3RhdHVzICE9IGJsdWV0b290aDo6QkxFX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gcmVnaXN0ZXIgR0FUVCBjbGllbnQiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2F0dF9jbGllbnRfaWQgPSBjbGllbnRfaWQ7Ci0gICAgICBjb3V0IDw8IENPTE9SX0JPTERXSElURSAiUmVnaXN0ZXJlZCBHQVRUIGNsaWVudCB3aXRoIElEOiAiIENPTE9SX09GRgotICAgICAgICAgICA8PCBDT0xPUl9HUkVFTiA8PCBjbGllbnRfaWQgPDwgQ09MT1JfT0ZGOwotICAgIH0KLSAgICBFbmRBc3luY091dCgpOwotCi0gICAgZ2F0dF9yZWdpc3RlcmluZyA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDTElHYXR0Q2xpZW50Q2FsbGJhY2spOwotfTsKLQotdm9pZCBQcmludENvbW1hbmRTdGF0dXMoYm9vbCBzdGF0dXMpIHsgUHJpbnRPcFN0YXR1cygiQ29tbWFuZCIsIHN0YXR1cyk7IH0KLQotdm9pZCBQcmludEZpZWxkQW5kVmFsdWUoY29uc3Qgc3RyaW5nJiBmaWVsZCwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewotICBjb3V0IDw8IENPTE9SX0JPTERXSElURSA8PCBmaWVsZCA8PCAiOiAiIDw8IENPTE9SX0JPTERZRUxMT1cgPDwgdmFsdWUKLSAgICAgICA8PCBDT0xPUl9PRkYgPDwgZW5kbDsKLX0KLQotdm9pZCBQcmludEZpZWxkQW5kQm9vbFZhbHVlKGNvbnN0IHN0cmluZyYgZmllbGQsIGJvb2wgdmFsdWUpIHsKLSAgUHJpbnRGaWVsZEFuZFZhbHVlKGZpZWxkLCAodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci19Ci0KLXZvaWQgSGFuZGxlRGlzYWJsZShJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgQ0hFQ0tfTk9fQVJHUyhhcmdzKTsKLSAgYm9vbCBzdGF0dXM7Ci0gIGJ0X2lmYWNlLT5EaXNhYmxlKCZzdGF0dXMpOwotICBQcmludENvbW1hbmRTdGF0dXMoc3RhdHVzKTsKLX0KLQotdm9pZCBIYW5kbGVFbmFibGUoSUJsdWV0b290aCogYnRfaWZhY2UsIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBhcmdzKSB7Ci0gIGJvb2wgc3RhdHVzOwotICBidF9pZmFjZS0+RW5hYmxlKCZzdGF0dXMpOwotICBQcmludENvbW1hbmRTdGF0dXMoc3RhdHVzKTsKLX0KLQotdm9pZCBIYW5kbGVHZXRTdGF0ZShJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgQ0hFQ0tfTk9fQVJHUyhhcmdzKTsKLQotICBpbnQzMl90IHN0OwotICBidF9pZmFjZS0+R2V0U3RhdGUoJnN0KTsKLSAgYmx1ZXRvb3RoOjpBZGFwdGVyU3RhdGUgc3RhdGUgPSBzdGF0aWNfY2FzdDxibHVldG9vdGg6OkFkYXB0ZXJTdGF0ZT4oc3QpOwotICBQcmludEZpZWxkQW5kVmFsdWUoIkFkYXB0ZXIgc3RhdGUiLCBibHVldG9vdGg6OkFkYXB0ZXJTdGF0ZVRvU3RyaW5nKHN0YXRlKSk7Ci19Ci0KLXZvaWQgSGFuZGxlSXNFbmFibGVkKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotICBib29sIGVuYWJsZWQ7Ci0gIGJ0X2lmYWNlLT5Jc0VuYWJsZWQoJmVuYWJsZWQpOwotICBQcmludEZpZWxkQW5kQm9vbFZhbHVlKCJBZGFwdGVyIGVuYWJsZWQiLCBlbmFibGVkKTsKLX0KLQotdm9pZCBIYW5kbGVHZXRMb2NhbEFkZHJlc3MoSUJsdWV0b290aCogYnRfaWZhY2UsIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBhcmdzKSB7Ci0gIENIRUNLX05PX0FSR1MoYXJncyk7Ci0gIFN0cmluZzE2IGFkZHJlc3M7Ci0gIGJ0X2lmYWNlLT5HZXRBZGRyZXNzKCZhZGRyZXNzKTsKLSAgUHJpbnRGaWVsZEFuZFZhbHVlKCJBZGFwdGVyIGFkZHJlc3MiLCBzdGQ6OnN0cmluZyhTdHJpbmc4KGFkZHJlc3MpLnN0cmluZygpKSk7Ci19Ci0KLXZvaWQgSGFuZGxlU2V0TG9jYWxOYW1lKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19BUkdTX0NPVU5UKGFyZ3MsID49LCAxLCAiTm8gbmFtZSB3YXMgZ2l2ZW4iKTsKLQotICBzdGQ6OnN0cmluZyBuYW1lOwotICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IGFyZ3MpIG5hbWUgKz0gYXJnICsgIiAiOwotCi0gIGJhc2U6OlRyaW1XaGl0ZXNwYWNlQVNDSUkobmFtZSwgYmFzZTo6VFJJTV9UUkFJTElORywgJm5hbWUpOwotCi0gIGJvb2wgc3RhdHVzOwotICBidF9pZmFjZS0+U2V0TmFtZShTdHJpbmcxNihTdHJpbmc4KG5hbWUuY19zdHIoKSkpLCAmc3RhdHVzKTsKLSAgUHJpbnRDb21tYW5kU3RhdHVzKHN0YXR1cyk7Ci19Ci0KLXZvaWQgSGFuZGxlR2V0TG9jYWxOYW1lKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotICBTdHJpbmcxNiBuYW1lOwotICBidF9pZmFjZS0+R2V0TmFtZSgmbmFtZSk7Ci0gIFByaW50RmllbGRBbmRWYWx1ZSgiQWRhcHRlciBuYW1lIiwgc3RkOjpzdHJpbmcoU3RyaW5nOChuYW1lKS5zdHJpbmcoKSkpOwotfQotCi12b2lkIEhhbmRsZUFkYXB0ZXJJbmZvKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotCi0gIGNvdXQgPDwgQ09MT1JfQk9MRFdISVRFICJBZGFwdGVyIFByb3BlcnRpZXM6ICIgQ09MT1JfT0ZGIDw8IGVuZGw7Ci0KLSAgU3RyaW5nMTYgYWRkcmVzczsKLSAgYnRfaWZhY2UtPkdldEFkZHJlc3MoJmFkZHJlc3MpOwotICBQcmludEZpZWxkQW5kVmFsdWUoIlx0QWRkcmVzcyIsIHN0ZDo6c3RyaW5nKFN0cmluZzgoYWRkcmVzcykuc3RyaW5nKCkpKTsKLQotICBpbnQgYWRhcHRlcl9zdGF0ZTsKLSAgYnRfaWZhY2UtPkdldFN0YXRlKCZhZGFwdGVyX3N0YXRlKTsKLSAgUHJpbnRGaWVsZEFuZFZhbHVlKCJcdFN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6QWRhcHRlclN0YXRlVG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpBZGFwdGVyU3RhdGU+KGFkYXB0ZXJfc3RhdGUpKSk7Ci0KLSAgU3RyaW5nMTYgbmFtZTsKLSAgYnRfaWZhY2UtPkdldE5hbWUoJm5hbWUpOwotICBQcmludEZpZWxkQW5kVmFsdWUoIlx0TmFtZSIsIHN0ZDo6c3RyaW5nKFN0cmluZzgobmFtZSkuc3RyaW5nKCkpKTsKLQotICBib29sIG11bHRpX2FkdjsKLSAgYnRfaWZhY2UtPklzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKCZtdWx0aV9hZHYpOwotICBQcmludEZpZWxkQW5kQm9vbFZhbHVlKCJcdE11bHRpLUFkdi4gc3VwcG9ydGVkIiwgbXVsdGlfYWR2KTsKLX0KLQotdm9pZCBIYW5kbGVTdXBwb3J0c011bHRpQWR2KElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotCi0gIGJvb2wgbXVsdGlfYWR2OwotICBidF9pZmFjZS0+SXNNdWx0aUFkdmVydGlzZW1lbnRTdXBwb3J0ZWQoJm11bHRpX2Fkdik7Ci0gIFByaW50RmllbGRBbmRCb29sVmFsdWUoIk11bHRpLWFkdmVydGlzZW1lbnQgc3VwcG9ydCIsIG11bHRpX2Fkdik7Ci19Ci0KLXZvaWQgSGFuZGxlUmVnaXN0ZXJCTEVBZHZlcnRpc2VyKElCbHVldG9vdGgqIGJ0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgQ0hFQ0tfTk9fQVJHUyhhcmdzKTsKLQotICBpZiAoYmxlX2FkdmVydGlzZXJfcmVnaXN0ZXJpbmcubG9hZCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiSW4gcHJvZ3Jlc3MiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYmxlX2FkdmVydGlzZXJfaWQubG9hZCgpICE9IGludmFsaWRfYWR2ZXJ0aXNlcl9pZCkgewotICAgIFByaW50RXJyb3IoIkFscmVhZHkgcmVnaXN0ZXJlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNwPElCbHVldG9vdGhMZUFkdmVydGlzZXI+IGJsZV9hZHZlcnRpc2VyX2lmYWNlOwotICBidF9pZmFjZS0+R2V0TGVBZHZlcnRpc2VySW50ZXJmYWNlKCZibGVfYWR2ZXJ0aXNlcl9pZmFjZSk7Ci0gIGlmICghYmxlX2FkdmVydGlzZXJfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggTGUgQWR2ZXJ0aXNlciBpbnRlcmZhY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIHN0YXR1czsKLSAgYmxlX2FkdmVydGlzZXJfaWZhY2UtPlJlZ2lzdGVyQWR2ZXJ0aXNlcigKLSAgICAgIG5ldyBDTElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaygpLCAmc3RhdHVzKTsKLSAgYmxlX2FkdmVydGlzZXJfcmVnaXN0ZXJpbmcgPSBzdGF0dXM7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyhzdGF0dXMpOwotfQotCi12b2lkIEhhbmRsZVVucmVnaXN0ZXJCTEVBZHZlcnRpc2VyKElCbHVldG9vdGgqIGJ0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotCi0gIGlmIChibGVfYWR2ZXJ0aXNlcl9pZC5sb2FkKCkgPT0gaW52YWxpZF9hZHZlcnRpc2VyX2lkKSB7Ci0gICAgUHJpbnRFcnJvcigiTm90IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyPiBibGVfYWR2ZXJ0aXNlcl9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExlQWR2ZXJ0aXNlckludGVyZmFjZSgmYmxlX2FkdmVydGlzZXJfaWZhY2UpOwotICBpZiAoIWJsZV9hZHZlcnRpc2VyX2lmYWNlLmdldCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgdG8gQmx1ZXRvb3RoIExvdyBFbmVyZ3kgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYmxlX2FkdmVydGlzZXJfaWZhY2UtPlVucmVnaXN0ZXJBZHZlcnRpc2VyKGJsZV9hZHZlcnRpc2VyX2lkLmxvYWQoKSk7Ci0gIGJsZV9hZHZlcnRpc2VyX2lkID0gaW52YWxpZF9hZHZlcnRpc2VyX2lkOwotICBQcmludENvbW1hbmRTdGF0dXModHJ1ZSk7Ci19Ci0KLXZvaWQgSGFuZGxlUmVnaXN0ZXJCTEUoSUJsdWV0b290aCogYnRfaWZhY2UsIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBhcmdzKSB7Ci0gIENIRUNLX05PX0FSR1MoYXJncyk7Ci0KLSAgaWYgKGJsZV9yZWdpc3RlcmluZy5sb2FkKCkpIHsKLSAgICBQcmludEVycm9yKCJJbiBwcm9ncmVzcyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChibGVfY2xpZW50X2lkLmxvYWQoKSkgewotICAgIFByaW50RXJyb3IoIkFscmVhZHkgcmVnaXN0ZXJlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNwPElCbHVldG9vdGhMb3dFbmVyZ3k+IGJsZV9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExvd0VuZXJneUludGVyZmFjZSgmYmxlX2lmYWNlKTsKLSAgaWYgKCFibGVfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggTG93IEVuZXJneSBpbnRlcmZhY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIHN0YXR1czsKLSAgYmxlX2lmYWNlLT5SZWdpc3RlckNsaWVudChuZXcgQ0xJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2soKSwgJnN0YXR1cyk7Ci0gIGJsZV9yZWdpc3RlcmluZyA9IHN0YXR1czsKLSAgUHJpbnRDb21tYW5kU3RhdHVzKHN0YXR1cyk7Ci19Ci0KLXZvaWQgSGFuZGxlVW5yZWdpc3RlckJMRShJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgQ0hFQ0tfTk9fQVJHUyhhcmdzKTsKLQotICBpZiAoIWJsZV9jbGllbnRfaWQubG9hZCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiTm90IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoTG93RW5lcmd5PiBibGVfaWZhY2U7Ci0gIGJ0X2lmYWNlLT5HZXRMb3dFbmVyZ3lJbnRlcmZhY2UoJmJsZV9pZmFjZSk7Ci0gIGlmICghYmxlX2lmYWNlLmdldCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgdG8gQmx1ZXRvb3RoIExvdyBFbmVyZ3kgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYmxlX2lmYWNlLT5VbnJlZ2lzdGVyQ2xpZW50KGJsZV9jbGllbnRfaWQubG9hZCgpKTsKLSAgYmxlX2NsaWVudF9pZCA9IDA7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyh0cnVlKTsKLX0KLQotdm9pZCBIYW5kbGVVbnJlZ2lzdGVyQWxsQkxFKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotCi0gIHNwPElCbHVldG9vdGhMb3dFbmVyZ3k+IGJsZV9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExvd0VuZXJneUludGVyZmFjZSgmYmxlX2lmYWNlKTsKLSAgaWYgKCFibGVfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggTG93IEVuZXJneSBpbnRlcmZhY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBibGVfaWZhY2UtPlVucmVnaXN0ZXJBbGwoKTsKLSAgUHJpbnRDb21tYW5kU3RhdHVzKHRydWUpOwotfQotCi12b2lkIEhhbmRsZVJlZ2lzdGVyR0FUVChJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgQ0hFQ0tfTk9fQVJHUyhhcmdzKTsKLQotICBpZiAoZ2F0dF9yZWdpc3RlcmluZy5sb2FkKCkpIHsKLSAgICBQcmludEVycm9yKCJJbiBwcm9ncmVzcyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnYXR0X2NsaWVudF9pZC5sb2FkKCkpIHsKLSAgICBQcmludEVycm9yKCJBbHJlYWR5IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoR2F0dENsaWVudD4gZ2F0dF9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldEdhdHRDbGllbnRJbnRlcmZhY2UoJmdhdHRfaWZhY2UpOwotICBpZiAoIWdhdHRfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggR0FUVCBDbGllbnQgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGdhdHRfaWZhY2UtPlJlZ2lzdGVyQ2xpZW50KG5ldyBDTElHYXR0Q2xpZW50Q2FsbGJhY2soKSwgJnN0YXR1cyk7Ci0gIGdhdHRfcmVnaXN0ZXJpbmcgPSBzdGF0dXM7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyhzdGF0dXMpOwotfQotCi12b2lkIEhhbmRsZVVucmVnaXN0ZXJHQVRUKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotCi0gIGlmICghZ2F0dF9jbGllbnRfaWQubG9hZCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiTm90IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoR2F0dENsaWVudD4gZ2F0dF9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldEdhdHRDbGllbnRJbnRlcmZhY2UoJmdhdHRfaWZhY2UpOwotICBpZiAoIWdhdHRfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggR0FUVCBDbGllbnQgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ2F0dF9pZmFjZS0+VW5yZWdpc3RlckNsaWVudChnYXR0X2NsaWVudF9pZC5sb2FkKCkpOwotICBnYXR0X2NsaWVudF9pZCA9IDA7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyh0cnVlKTsKLX0KLQotdm9pZCBIYW5kbGVTdGFydEFkdihJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgYm9vbCBpbmNsdWRlX25hbWUgPSBmYWxzZTsKLSAgYm9vbCBpbmNsdWRlX3R4X3Bvd2VyID0gZmFsc2U7Ci0gIGJvb2wgY29ubmVjdGFibGUgPSBmYWxzZTsKLSAgYm9vbCBzZXRfbWFudWZhY3R1cmVyX2RhdGEgPSBmYWxzZTsKLSAgYm9vbCBzZXRfdXVpZCA9IGZhbHNlOwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLQotICBmb3IgKGF1dG8gaXRlciA9IGFyZ3MuYmVnaW4oKTsgaXRlciAhPSBhcmdzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnID0gKml0ZXI7Ci0gICAgaWYgKGFyZyA9PSAiLW4iKQotICAgICAgaW5jbHVkZV9uYW1lID0gdHJ1ZTsKLSAgICBlbHNlIGlmIChhcmcgPT0gIi10IikKLSAgICAgIGluY2x1ZGVfdHhfcG93ZXIgPSB0cnVlOwotICAgIGVsc2UgaWYgKGFyZyA9PSAiLWMiKQotICAgICAgY29ubmVjdGFibGUgPSB0cnVlOwotICAgIGVsc2UgaWYgKGFyZyA9PSAiLW0iKQotICAgICAgc2V0X21hbnVmYWN0dXJlcl9kYXRhID0gdHJ1ZTsKLSAgICBlbHNlIGlmIChhcmcgPT0gIi11IikgewotICAgICAgLy8gVGhpcyBmbGFnIGhhcyBhIHNpbmdsZSBhcmd1bWVudC4KLSAgICAgICsraXRlcjsKLSAgICAgIGlmIChpdGVyID09IGFyZ3MuZW5kKCkpIHsKLSAgICAgICAgUHJpbnRFcnJvcigiRXhwZWN0ZWQgYSBVdWlkIGFmdGVyIC11Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgc3RkOjpzdHJpbmcgdXVpZF9zdHIgPSAqaXRlcjsKLSAgICAgIGJvb2wgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIHV1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkZyb21TdHJpbmcodXVpZF9zdHIsICZpc192YWxpZCk7Ci0gICAgICBpZiAoIWlzX3ZhbGlkKSB7Ci0gICAgICAgIFByaW50RXJyb3IoIkludmFsaWQgVXVpZDogIiArIHV1aWRfc3RyKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBzZXRfdXVpZCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChhcmcgPT0gIi1oIikgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1VzYWdlW10gPQotICAgICAgICAgICJVc2FnZTogc3RhcnQtYWR2IFtmbGFnc11cbiIKLSAgICAgICAgICAiXG4iCi0gICAgICAgICAgIkZsYWdzOlxuIgotICAgICAgICAgICJcdC1uXHRJbmNsdWRlIGRldmljZSBuYW1lXG4iCi0gICAgICAgICAgIlx0LXRcdEluY2x1ZGUgVFggcG93ZXJcbiIKLSAgICAgICAgICAiXHQtY1x0U2VuZCBjb25uZWN0YWJsZSBhZHYuIHBhY2tldHMgKGRlZmF1bHQgaXMgbm9uLWNvbm5lY3RhYmxlKVxuIgotICAgICAgICAgICJcdC1tXHRJbmNsdWRlIHJhbmRvbSBtYW51ZmFjdHVyZXIgZGF0YVxuIgotICAgICAgICAgICJcdC1oXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlXG4iOwotICAgICAgY291dCA8PCBrVXNhZ2UgPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgUHJpbnRFcnJvcigiVW5yZWNvZ25pemVkIG9wdGlvbjogIiArIGFyZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJsZV9hZHZlcnRpc2VyX2lkLmxvYWQoKSA9PSBpbnZhbGlkX2FkdmVydGlzZXJfaWQpIHsKLSAgICBQcmludEVycm9yKCJCTEUgYWR2ZXJ0aXNlciBub3QgcmVnaXN0ZXJlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNwPElCbHVldG9vdGhMZUFkdmVydGlzZXI+IGJsZV9hZHZlcnRpc2VyX2lmYWNlOwotICBidF9pZmFjZS0+R2V0TGVBZHZlcnRpc2VySW50ZXJmYWNlKCZibGVfYWR2ZXJ0aXNlcl9pZmFjZSk7Ci0gIGlmICghYmxlX2FkdmVydGlzZXJfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggTGUgQWR2ZXJ0aXNlciBpbnRlcmZhY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOwotICBpZiAoc2V0X21hbnVmYWN0dXJlcl9kYXRhKSB7Ci0gICAgZGF0YSA9IHt7MHgwNywgYmx1ZXRvb3RoOjprRUlSVHlwZU1hbnVmYWN0dXJlclNwZWNpZmljRGF0YSwgMHhlMCwgMHgwMCwgJ1QnLAotICAgICAgICAgICAgICdlJywgJ3MnLCAndCd9fTsKLSAgfQotCi0gIGlmIChzZXRfdXVpZCkgewotICAgIC8vIERldGVybWluZSB0aGUgdHlwZSBhbmQgbGVuZ3RoIGJ5dGVzLgotICAgIGludCB1dWlkX3NpemUgPSB1dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0gICAgdWludDhfdCB0eXBlOwotICAgIGlmICh1dWlkX3NpemUgPT0gYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMxMjgpCi0gICAgICB0eXBlID0gYmx1ZXRvb3RoOjprRUlSVHlwZUNvbXBsZXRlMTI4Qml0VXVpZHM7Ci0gICAgZWxzZSBpZiAodXVpZF9zaXplID09IGJsdWV0b290aDo6VXVpZDo6a051bUJ5dGVzMzIpCi0gICAgICB0eXBlID0gYmx1ZXRvb3RoOjprRUlSVHlwZUNvbXBsZXRlMzJCaXRVdWlkczsKLSAgICBlbHNlIGlmICh1dWlkX3NpemUgPT0gYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMxNikKLSAgICAgIHR5cGUgPSBibHVldG9vdGg6OmtFSVJUeXBlQ29tcGxldGUxNkJpdFV1aWRzOwotICAgIGVsc2UKLSAgICAgIE5PVFJFQUNIRUQoKSA8PCAiVW5leHBlY3RlZCBzaXplOiAiIDw8IHV1aWRfc2l6ZTsKLQotICAgIGRhdGEucHVzaF9iYWNrKHV1aWRfc2l6ZSArIDEpOwotICAgIGRhdGEucHVzaF9iYWNrKHR5cGUpOwotCi0gICAgYXV0byB1dWlkX2J5dGVzID0gdXVpZC5UbzEyOEJpdExFKCk7Ci0gICAgaW50IGluZGV4ID0gKHV1aWRfc2l6ZSA9PSAxNikgPyAwIDogMTI7Ci0gICAgZGF0YS5pbnNlcnQoZGF0YS5lbmQoKSwgdXVpZF9ieXRlcy5kYXRhKCkgKyBpbmRleCwKLSAgICAgICAgICAgICAgICB1dWlkX2J5dGVzLmRhdGEoKSArIGluZGV4ICsgdXVpZF9zaXplKTsKLSAgfQotCi0gIGJhc2U6OlRpbWVEZWx0YSB0aW1lb3V0OwotCi0gIGJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3Mgc2V0dGluZ3MoCi0gICAgICBibHVldG9vdGg6OkFkdmVydGlzZVNldHRpbmdzOjpNT0RFX0xPV19QT1dFUiwgdGltZW91dCwKLSAgICAgIGJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3M6OlRYX1BPV0VSX0xFVkVMX01FRElVTSwgY29ubmVjdGFibGUpOwotCi0gIGlmIChpbmNsdWRlX3R4X3Bvd2VyKSB7Ci0gICAgZGF0YS5wdXNoX2JhY2soMHgwMik7Ci0gICAgZGF0YS5wdXNoX2JhY2soYmx1ZXRvb3RoOjprRUlSVHlwZVR4UG93ZXIpOwotICAgIGRhdGEucHVzaF9iYWNrKDB4MDApOwotICB9Ci0KLSAgYmx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhIGFkdl9kYXRhKGRhdGEpOwotCi0gIGlmIChpbmNsdWRlX25hbWUpIHsKLSAgICBTdHJpbmcxNiBuYW1lX3BhcmFtOwotICAgIGJ0X2lmYWNlLT5HZXROYW1lKCZuYW1lX3BhcmFtKTsKLSAgICBzdGQ6OnN0cmluZyBuYW1lKFN0cmluZzgobmFtZV9wYXJhbSkuc3RyaW5nKCkpOwotICAgIGRhdGEucHVzaF9iYWNrKG5hbWUubGVuZ3RoKCkgKyAxKTsKLSAgICBkYXRhLnB1c2hfYmFjayhibHVldG9vdGg6OmtFSVJUeXBlQ29tcGxldGVMb2NhbE5hbWUpOwotICAgIGRhdGEuaW5zZXJ0KGRhdGEuYmVnaW4oKSwgbmFtZS5jX3N0cigpLCBuYW1lLmNfc3RyKCkgKyBuYW1lLmxlbmd0aCgpKTsKLSAgfQotCi0gIGJsdWV0b290aDo6QWR2ZXJ0aXNlRGF0YSBzY2FuX3JzcDsKLQotICBib29sIHN0YXR1czsKLSAgYmxlX2FkdmVydGlzZXJfaWZhY2UtPlN0YXJ0TXVsdGlBZHZlcnRpc2luZygKLSAgICAgIGJsZV9hZHZlcnRpc2VyX2lkLmxvYWQoKSwgYWR2X2RhdGEsIHNjYW5fcnNwLCBzZXR0aW5ncywgJnN0YXR1cyk7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyhzdGF0dXMpOwotfQotCi12b2lkIEhhbmRsZVN0b3BBZHYoSUJsdWV0b290aCogYnRfaWZhY2UsIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBhcmdzKSB7Ci0gIGlmIChibGVfYWR2ZXJ0aXNlcl9pZC5sb2FkKCkgPT0gaW52YWxpZF9hZHZlcnRpc2VyX2lkKSB7Ci0gICAgUHJpbnRFcnJvcigiQkxFIGFkdmVydGlzZXIgbm90IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyPiBibGVfYWR2ZXJ0aXNlcl9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExlQWR2ZXJ0aXNlckludGVyZmFjZSgmYmxlX2FkdmVydGlzZXJfaWZhY2UpOwotICBpZiAoIWJsZV9hZHZlcnRpc2VyX2lmYWNlLmdldCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgdG8gQmx1ZXRvb3RoIExvdyBFbmVyZ3kgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGJsZV9hZHZlcnRpc2VyX2lmYWNlLT5TdG9wTXVsdGlBZHZlcnRpc2luZyhibGVfYWR2ZXJ0aXNlcl9pZC5sb2FkKCksICZzdGF0dXMpOwotICBQcmludENvbW1hbmRTdGF0dXMoc3RhdHVzKTsKLX0KLQotdm9pZCBIYW5kbGVDb25uZWN0KElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBzdHJpbmcgYWRkcmVzczsKLQotICBpZiAoYXJncy5zaXplKCkgIT0gMSkgewotICAgIFByaW50RXJyb3IoIkV4cGVjdGVkIE1BQyBhZGRyZXNzIGFzIG9ubHkgYXJndW1lbnQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhZGRyZXNzID0gYXJnc1swXTsKLQotICBpZiAoIWJsZV9jbGllbnRfaWQubG9hZCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiQkxFIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3A8SUJsdWV0b290aExvd0VuZXJneT4gYmxlX2lmYWNlOwotICBidF9pZmFjZS0+R2V0TG93RW5lcmd5SW50ZXJmYWNlKCZibGVfaWZhY2UpOwotICBpZiAoIWJsZV9pZmFjZS5nZXQoKSkgewotICAgIFByaW50RXJyb3IoIkZhaWxlZCB0byBvYnRhaW4gaGFuZGxlIHRvIEJsdWV0b290aCBMb3cgRW5lcmd5IGludGVyZmFjZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgc3RhdHVzOwotICBibGVfaWZhY2UtPkNvbm5lY3QoYmxlX2NsaWVudF9pZC5sb2FkKCksCi0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihhZGRyZXNzLmNfc3RyKCksIGFkZHJlc3MubGVuZ3RoKCkpLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogIGlzX2RpcmVjdCAqLywgJnN0YXR1cyk7Ci0KLSAgUHJpbnRDb21tYW5kU3RhdHVzKHN0YXR1cyk7Ci19Ci0KLXZvaWQgSGFuZGxlRGlzY29ubmVjdChJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgc3RyaW5nIGFkZHJlc3M7Ci0KLSAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpIHsKLSAgICBQcmludEVycm9yKCJFeHBlY3RlZCBNQUMgYWRkcmVzcyBhcyBvbmx5IGFyZ3VtZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYWRkcmVzcyA9IGFyZ3NbMF07Ci0KLSAgaWYgKCFibGVfY2xpZW50X2lkLmxvYWQoKSkgewotICAgIFByaW50RXJyb3IoIkJMRSBub3QgcmVnaXN0ZXJlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNwPElCbHVldG9vdGhMb3dFbmVyZ3k+IGJsZV9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExvd0VuZXJneUludGVyZmFjZSgmYmxlX2lmYWNlKTsKLSAgaWYgKCFibGVfaWZhY2UuZ2V0KCkpIHsKLSAgICBQcmludEVycm9yKCJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBCbHVldG9vdGggTG93IEVuZXJneSBpbnRlcmZhY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIHN0YXR1czsKLSAgYmxlX2lmYWNlLT5EaXNjb25uZWN0KGJsZV9jbGllbnRfaWQubG9hZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoYWRkcmVzcy5jX3N0cigpLCBhZGRyZXNzLmxlbmd0aCgpKSwgJnN0YXR1cyk7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyhzdGF0dXMpOwotfQotCi12b2lkIEhhbmRsZVNldE10dShJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgc3RyaW5nIGFkZHJlc3M7Ci0gIGludCBtdHU7Ci0KLSAgaWYgKGFyZ3Muc2l6ZSgpICE9IDIpIHsKLSAgICBQcmludEVycm9yKCJVc2FnZTogc2V0LW10dSBbYWRkcmVzc10gW210dV0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhZGRyZXNzID0gYXJnc1swXTsKLSAgbXR1ID0gc3RkOjpzdG9pKGFyZ3NbMV0pOwotCi0gIGlmIChtdHUgPCAyMykgewotICAgIFByaW50RXJyb3IoIk1UVSBtdXN0IGJlIDIzIG9yIGxhcmdlciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghYmxlX2NsaWVudF9pZC5sb2FkKCkpIHsKLSAgICBQcmludEVycm9yKCJCTEUgbm90IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoTG93RW5lcmd5PiBibGVfaWZhY2U7Ci0gIGJ0X2lmYWNlLT5HZXRMb3dFbmVyZ3lJbnRlcmZhY2UoJmJsZV9pZmFjZSk7Ci0gIGlmICghYmxlX2lmYWNlLmdldCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgdG8gQmx1ZXRvb3RoIExvdyBFbmVyZ3kgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGJsZV9pZmFjZS0+U2V0TXR1KGJsZV9jbGllbnRfaWQubG9hZCgpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihhZGRyZXNzLmNfc3RyKCksIGFkZHJlc3MubGVuZ3RoKCkpLCBtdHUsICZzdGF0dXMpOwotICBQcmludENvbW1hbmRTdGF0dXMoc3RhdHVzKTsKLX0KLQotdm9pZCBIYW5kbGVSZWdpc3RlckJMRVNjYW5uZXIoSUJsdWV0b290aCogYnRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBDSEVDS19OT19BUkdTKGFyZ3MpOwotCi0gIGlmIChibGVfc2Nhbm5lcl9yZWdpc3RlcmluZy5sb2FkKCkpIHsKLSAgICBQcmludEVycm9yKCJJbiBwcm9ncmVzcyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChibGVfc2Nhbm5lcl9pZC5sb2FkKCkpIHsKLSAgICBQcmludEVycm9yKCJBbHJlYWR5IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoTGVTY2FubmVyPiBibGVfc2Nhbm5lcl9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExlU2Nhbm5lckludGVyZmFjZSgmYmxlX3NjYW5uZXJfaWZhY2UpOwotICBpZiAoIWJsZV9zY2FubmVyX2lmYWNlLmdldCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgdG8gQmx1ZXRvb3RoIExFIFNjYW5uZXIgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGJsZV9zY2FubmVyX2lmYWNlLT5SZWdpc3RlclNjYW5uZXIobmV3IENMSUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIGJsZV9zY2FubmVyX3JlZ2lzdGVyaW5nID0gc3RhdHVzOwotICBQcmludENvbW1hbmRTdGF0dXMoc3RhdHVzKTsKLX0KLQotdm9pZCBIYW5kbGVVbnJlZ2lzdGVyQkxFU2Nhbm5lcihJQmx1ZXRvb3RoKiBidF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgQ0hFQ0tfTk9fQVJHUyhhcmdzKTsKLQotICBpZiAoIWJsZV9zY2FubmVyX2lkLmxvYWQoKSkgewotICAgIFByaW50RXJyb3IoIk5vdCByZWdpc3RlcmVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3A8SUJsdWV0b290aExlU2Nhbm5lcj4gYmxlX3NjYW5uZXJfaWZhY2U7Ci0gIGJ0X2lmYWNlLT5HZXRMZVNjYW5uZXJJbnRlcmZhY2UoJmJsZV9zY2FubmVyX2lmYWNlKTsKLSAgaWYgKCFibGVfc2Nhbm5lcl9pZmFjZS5nZXQoKSkgewotICAgIFByaW50RXJyb3IoIkZhaWxlZCB0byBvYnRhaW4gaGFuZGxlIHRvIEJsdWV0b290aCBMRSBzY2FubmVyIGludGVyZmFjZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJsZV9zY2FubmVyX2lmYWNlLT5VbnJlZ2lzdGVyU2Nhbm5lcihibGVfc2Nhbm5lcl9pZC5sb2FkKCkpOwotICBibGVfc2Nhbm5lcl9pZCA9IDA7Ci0gIFByaW50Q29tbWFuZFN0YXR1cyh0cnVlKTsKLX0KLQotdm9pZCBIYW5kbGVTdGFydExlU2NhbihJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKCFibGVfY2xpZW50X2lkLmxvYWQoKSkgewotICAgIFByaW50RXJyb3IoIkJMRSBub3QgcmVnaXN0ZXJlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgYXJnIDogYXJncykgewotICAgIGlmIChhcmcgPT0gIi1kIikgewotICAgICAgZHVtcF9zY2FuX3JlY29yZCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChhcmcgPT0gIi1oIikgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1VzYWdlW10gPQotICAgICAgICAgICJVc2FnZTogc3RhcnQtbGUtc2NhbiBbZmxhZ3NdXG4iCi0gICAgICAgICAgIlxuIgotICAgICAgICAgICJGbGFnczpcbiIKLSAgICAgICAgICAiXHQtZFx0RHVtcCBzY2FuIHJlY29yZFxuIgotICAgICAgICAgICJcdC1oXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlXG4iOwotICAgICAgY291dCA8PCBrVXNhZ2UgPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoTGVTY2FubmVyPiBibGVfc2Nhbm5lcl9pZmFjZTsKLSAgYnRfaWZhY2UtPkdldExlU2Nhbm5lckludGVyZmFjZSgmYmxlX3NjYW5uZXJfaWZhY2UpOwotICBpZiAoIWJsZV9zY2FubmVyX2lmYWNlLmdldCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiRmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgdG8gQmx1ZXRvb3RoIExFIHNjYW5uZXIgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYmx1ZXRvb3RoOjpTY2FuU2V0dGluZ3Mgc2V0dGluZ3M7Ci0gIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6U2NhbkZpbHRlcj4gZmlsdGVyczsKLQotICBib29sIHN0YXR1czsKLSAgYmxlX3NjYW5uZXJfaWZhY2UtPlN0YXJ0U2NhbihibGVfc2Nhbm5lcl9pZC5sb2FkKCksIHNldHRpbmdzLCBmaWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICBQcmludENvbW1hbmRTdGF0dXMoc3RhdHVzKTsKLX0KLQotdm9pZCBIYW5kbGVTdG9wTGVTY2FuKElCbHVldG9vdGgqIGJ0X2lmYWNlLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncykgewotICBpZiAoIWJsZV9jbGllbnRfaWQubG9hZCgpKSB7Ci0gICAgUHJpbnRFcnJvcigiQkxFIG5vdCByZWdpc3RlcmVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3A8SUJsdWV0b290aExlU2Nhbm5lcj4gYmxlX3NjYW5uZXJfaWZhY2U7Ci0gIGJ0X2lmYWNlLT5HZXRMZVNjYW5uZXJJbnRlcmZhY2UoJmJsZV9zY2FubmVyX2lmYWNlKTsKLSAgaWYgKCFibGVfc2Nhbm5lcl9pZmFjZS5nZXQoKSkgewotICAgIFByaW50RXJyb3IoIkZhaWxlZCB0byBvYnRhaW4gaGFuZGxlIHRvIEJsdWV0b290aCBMRSBzY2FubmVyIGludGVyZmFjZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgc3RhdHVzOwotICBibGVfc2Nhbm5lcl9pZmFjZS0+U3RvcFNjYW4oYmxlX3NjYW5uZXJfaWQubG9hZCgpLCAmc3RhdHVzKTsKLSAgUHJpbnRDb21tYW5kU3RhdHVzKHN0YXR1cyk7Ci19Ci0KLXZvaWQgSGFuZGxlSGVscChJQmx1ZXRvb3RoKiBidF9pZmFjZSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGFyZ3MpOwotCi1zdHJ1Y3QgewotICBzdHJpbmcgY29tbWFuZDsKLSAgdm9pZCAoKmZ1bmMpKElCbHVldG9vdGgqLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgYXJncyk7Ci0gIHN0cmluZyBoZWxwOwotfSBrQ29tbWFuZE1hcFtdID0gewotICAgIHsiaGVscCIsIEhhbmRsZUhlbHAsICJcdFx0XHREaXNwbGF5IHRoaXMgbWVzc2FnZSJ9LAotICAgIHsiZGlzYWJsZSIsIEhhbmRsZURpc2FibGUsICJcdFx0XHREaXNhYmxlIEJsdWV0b290aCJ9LAotICAgIHsiZW5hYmxlIiwgSGFuZGxlRW5hYmxlLCAiXHRcdFx0RW5hYmxlIEJsdWV0b290aCAoLWggZm9yIG9wdGlvbnMpIn0sCi0gICAgeyJnZXQtc3RhdGUiLCBIYW5kbGVHZXRTdGF0ZSwgIlx0XHRHZXQgdGhlIGN1cnJlbnQgYWRhcHRlciBzdGF0ZSJ9LAotICAgIHsiaXMtZW5hYmxlZCIsIEhhbmRsZUlzRW5hYmxlZCwgIlx0XHRSZXR1cm4gaWYgQmx1ZXRvb3RoIGlzIGVuYWJsZWQifSwKLSAgICB7ImdldC1sb2NhbC1hZGRyZXNzIiwgSGFuZGxlR2V0TG9jYWxBZGRyZXNzLAotICAgICAiXHRHZXQgdGhlIGxvY2FsIGFkYXB0ZXIgYWRkcmVzcyJ9LAotICAgIHsic2V0LWxvY2FsLW5hbWUiLCBIYW5kbGVTZXRMb2NhbE5hbWUsICJcdFx0U2V0IHRoZSBsb2NhbCBhZGFwdGVyIG5hbWUifSwKLSAgICB7ImdldC1sb2NhbC1uYW1lIiwgSGFuZGxlR2V0TG9jYWxOYW1lLCAiXHRcdEdldCB0aGUgbG9jYWwgYWRhcHRlciBuYW1lIn0sCi0gICAgeyJhZGFwdGVyLWluZm8iLCBIYW5kbGVBZGFwdGVySW5mbywgIlx0XHRQcmludCBhZGFwdGVyIHByb3BlcnRpZXMifSwKLSAgICB7InN1cHBvcnRzLW11bHRpLWFkdiIsIEhhbmRsZVN1cHBvcnRzTXVsdGlBZHYsCi0gICAgICJcdFdoZXRoZXIgbXVsdGktYWR2ZXJ0aXNlbWVudCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIn0sCi0gICAgeyJyZWdpc3Rlci1sZS1hZHZlcnRpc2VyIiwgSGFuZGxlUmVnaXN0ZXJCTEVBZHZlcnRpc2VyLAotICAgICAiXHRcdFJlZ2lzdGVyIHdpdGggdGhlIEJsdWV0b290aCBMb3cgRW5lcmd5IEFkdmVydGlzZXIgaW50ZXJmYWNlIn0sCi0gICAgeyJ1bnJlZ2lzdGVyLWxlLWFkdmVydGlzZXIiLCBIYW5kbGVVbnJlZ2lzdGVyQkxFQWR2ZXJ0aXNlciwKLSAgICAgIlx0XHRVbnJlZ2lzdGVyIGZyb20gdGhlIEJsdWV0b290aCBMRSBBZHZlcnRpc2VyIGludGVyZmFjZSJ9LAotICAgIHsicmVnaXN0ZXItYmxlIiwgSGFuZGxlUmVnaXN0ZXJCTEUsCi0gICAgICJcdFx0UmVnaXN0ZXIgd2l0aCB0aGUgQmx1ZXRvb3RoIExvdyBFbmVyZ3kgaW50ZXJmYWNlIn0sCi0gICAgeyJ1bnJlZ2lzdGVyLWJsZSIsIEhhbmRsZVVucmVnaXN0ZXJCTEUsCi0gICAgICJcdFx0VW5yZWdpc3RlciBmcm9tIHRoZSBCbHVldG9vdGggTG93IEVuZXJneSBpbnRlcmZhY2UifSwKLSAgICB7InVucmVnaXN0ZXItYWxsLWJsZSIsIEhhbmRsZVVucmVnaXN0ZXJBbGxCTEUsCi0gICAgICJcdFVucmVnaXN0ZXIgYWxsIGNsaWVudHMgZnJvbSB0aGUgQmx1ZXRvb3RoIExvdyBFbmVyZ3kgaW50ZXJmYWNlIn0sCi0gICAgeyJyZWdpc3Rlci1nYXR0IiwgSGFuZGxlUmVnaXN0ZXJHQVRULAotICAgICAiXHRcdFJlZ2lzdGVyIHdpdGggdGhlIEJsdWV0b290aCBHQVRUIENsaWVudCBpbnRlcmZhY2UifSwKLSAgICB7InVucmVnaXN0ZXItZ2F0dCIsIEhhbmRsZVVucmVnaXN0ZXJHQVRULAotICAgICAiXHRcdFVucmVnaXN0ZXIgZnJvbSB0aGUgQmx1ZXRvb3RoIEdBVFQgQ2xpZW50IGludGVyZmFjZSJ9LAotICAgIHsiY29ubmVjdC1sZSIsIEhhbmRsZUNvbm5lY3QsICJcdFx0Q29ubmVjdCB0byBMRSBkZXZpY2UgKC1oIGZvciBvcHRpb25zKSJ9LAotICAgIHsiZGlzY29ubmVjdC1sZSIsIEhhbmRsZURpc2Nvbm5lY3QsCi0gICAgICJcdFx0RGlzY29ubmVjdCBMRSBkZXZpY2UgKC1oIGZvciBvcHRpb25zKSJ9LAotICAgIHsic2V0LW10dSIsIEhhbmRsZVNldE10dSwgIlx0XHRTZXQgTVRVICgtaCBmb3Igb3B0aW9ucykifSwKLSAgICB7InN0YXJ0LWFkdiIsIEhhbmRsZVN0YXJ0QWR2LCAiXHRcdFN0YXJ0IGFkdmVydGlzaW5nICgtaCBmb3Igb3B0aW9ucykifSwKLSAgICB7InN0b3AtYWR2IiwgSGFuZGxlU3RvcEFkdiwgIlx0XHRTdG9wIGFkdmVydGlzaW5nIn0sCi0gICAgeyJyZWdpc3Rlci1sZS1zY2FubmVyIiwgSGFuZGxlUmVnaXN0ZXJCTEVTY2FubmVyLAotICAgICAiXHRcdFJlZ2lzdGVyIHdpdGggdGhlIEJsdWV0b290aCBMb3cgRW5lcmd5IHNjYW5uZXIgaW50ZXJmYWNlIn0sCi0gICAgeyJ1bnJlZ2lzdGVyLWxlLXNjYW5uZXIiLCBIYW5kbGVVbnJlZ2lzdGVyQkxFU2Nhbm5lciwKLSAgICAgIlx0XHRVbnJlZ2lzdGVyIGZyb20gdGhlIEJsdWV0b290aCBMRSBzY2FubmVyIGludGVyZmFjZSJ9LAotICAgIHsic3RhcnQtbGUtc2NhbiIsIEhhbmRsZVN0YXJ0TGVTY2FuLAotICAgICAiXHRcdFN0YXJ0IExFIGRldmljZSBzY2FuICgtaCBmb3Igb3B0aW9ucykifSwKLSAgICB7InN0b3AtbGUtc2NhbiIsIEhhbmRsZVN0b3BMZVNjYW4sICJcdFx0U3RvcCBMRSBkZXZpY2Ugc2NhbiJ9LAotICAgIHt9LAotfTsKLQotdm9pZCBIYW5kbGVIZWxwKElCbHVldG9vdGgqIC8qIGJ0X2lmYWNlICovLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgLyogYXJncyAqLykgewotICBjb3V0IDw8IGVuZGw7Ci0gIGZvciAoaW50IGkgPSAwOyBrQ29tbWFuZE1hcFtpXS5mdW5jOyBpKyspCi0gICAgY291dCA8PCAiXHQiIDw8IGtDb21tYW5kTWFwW2ldLmNvbW1hbmQgPDwga0NvbW1hbmRNYXBbaV0uaGVscCA8PCBlbmRsOwotICBjb3V0IDw8IGVuZGw7Ci19Ci0KLWNvbnN0IGNoYXIga0V4ZWN1dGVMb25nW10gPSAiZXhlYyI7Ci1jb25zdCBjaGFyIGtFeGVjdXRlU2hvcnRbXSA9ICJlIjsKLQotYm9vbCBFeGVjdXRlQ29tbWFuZChjb25zdCBzcDxJQmx1ZXRvb3RoPiYgYnRfaWZhY2UsIHN0ZDo6c3RyaW5nJiBjb21tYW5kKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IGFyZ3MgPSBiYXNlOjpTcGxpdFN0cmluZyhjb21tYW5kLCAiICIsIGJhc2U6OlRSSU1fV0hJVEVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlNQTElUX1dBTlRfQUxMKTsKLQotICBpZiAoYXJncy5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQotICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgd2hpbGUgdGhlIHJlbWFpbmluZyBhcmUgd2hhdCB3ZSBwYXNzIHRvCi0gIC8vIHRoZSBoYW5kbGVyIGZ1bmN0aW9ucy4KLSAgY29tbWFuZCA9IGFyZ3NbMF07Ci0gIGFyZ3MuZXJhc2UoYXJncy5iZWdpbigpKTsKLQotICBmb3IgKGludCBpID0gMDsga0NvbW1hbmRNYXBbaV0uZnVuYzsgaSsrKSB7Ci0gICAgaWYgKGNvbW1hbmQgPT0ga0NvbW1hbmRNYXBbaV0uY29tbWFuZCkgewotICAgICAga0NvbW1hbmRNYXBbaV0uZnVuYyhidF9pZmFjZS5nZXQoKSwgYXJncyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBjb3V0IDw8ICJVbnJlY29nbml6ZWQgY29tbWFuZDogIiA8PCBjb21tYW5kIDw8IGVuZGw7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIEJsdWV0b290aERlYXRoUmVjaXBpZW50IDogcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aERlYXRoUmVjaXBpZW50KCkgPSBkZWZhdWx0OwotICB+Qmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgb3ZlcnJpZGU6Ci0gIHZvaWQgYmluZGVyRGllZChjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpJQmluZGVyPiYgLyogd2hvICovKSBvdmVycmlkZSB7Ci0gICAgQmVnaW5Bc3luY091dCgpOwotICAgIGNvdXQgPDwgQ09MT1JfQk9MRFdISVRFICJUaGUgQmx1ZXRvb3RoIGRhZW1vbiBoYXMgZGllZCIgQ09MT1JfT0ZGIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiXG5QcmVzcyAnRU5URVInIHRvIGV4aXQuIjsKLSAgICBFbmRBc3luY091dCgpOwotCi0gICAgYW5kcm9pZDo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+c3RvcFByb2Nlc3MoKTsKLSAgICBzaG91bGRfZXhpdCA9IHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhEZWF0aFJlY2lwaWVudCk7Ci19OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIGJhc2U6OkF0RXhpdE1hbmFnZXIgZXhpdF9tYW5hZ2VyOwotICBiYXNlOjpDb21tYW5kTGluZTo6SW5pdChhcmdjLCBhcmd2KTsKLSAgbG9nZ2luZzo6TG9nZ2luZ1NldHRpbmdzIGxvZ19zZXR0aW5nczsKLQotICBpZiAoIWxvZ2dpbmc6OkluaXRMb2dnaW5nKGxvZ19zZXR0aW5ncykpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHVwIGxvZ2dpbmciOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICBzcDxJQmx1ZXRvb3RoPiBidF9pZmFjZTsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0U2VydmljZShTdHJpbmcxNihrU2VydmljZU5hbWUuY19zdHIoKSksICZidF9pZmFjZSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IHNlcnZpY2UgYmluZGVyOiAnIiA8PCBrU2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICInIHN0YXR1cz0iIDw8IHN0YXR1czsKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICB9Ci0KLSAgc3A8Qmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQ+IGRyKG5ldyBCbHVldG9vdGhEZWF0aFJlY2lwaWVudCgpKTsKLSAgaWYgKGFuZHJvaWQ6OklJbnRlcmZhY2U6OmFzQmluZGVyKGJ0X2lmYWNlLmdldCgpKS0+bGlua1RvRGVhdGgoZHIpICE9Ci0gICAgICBhbmRyb2lkOjpOT19FUlJPUikgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWdpc3RlciBEZWF0aFJlY2lwaWVudCBmb3IgSUJsdWV0b290aCI7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgdGhlIEJpbmRlciBwcm9jZXNzIHRocmVhZCBwb29sLiBXZSBoYXZlIHRvIHNldCB0aGlzIHVwLAotICAvLyBvdGhlcndpc2UsIGluY29taW5nIGNhbGxiYWNrcyBmcm9tIElCbHVldG9vdGhDYWxsYmFjayB3aWxsIGJsb2NrIHRoZSBtYWluCi0gIC8vIHRocmVhZCAoaW4gb3RoZXIgd29yZHMsIHdlIGhhdmUgdG8gZG8gdGhpcyBhcyB3ZSBhcmUgYSAiQmluZGVyIHNlcnZlciIpLgotICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7Ci0KLSAgLy8gUmVnaXN0ZXIgQWRhcHRlciBzdGF0ZS1jaGFuZ2UgY2FsbGJhY2sKLSAgc3A8Q0xJQmx1ZXRvb3RoQ2FsbGJhY2s+IGNhbGxiYWNrID0gbmV3IENMSUJsdWV0b290aENhbGxiYWNrKCk7Ci0gIGJ0X2lmYWNlLT5SZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKLQotICBjb3V0IDw8IENPTE9SX0JPTERXSElURSA8PCAiRmx1b3JpZGUgQ29tbWFuZC1MaW5lIEludGVyZmFjZVxuIgotICAgICAgIDw8IENPTE9SX09GRiA8PCBlbmRsCi0gICAgICAgPDwgIlR5cGUgXCJoZWxwXCIgdG8gc2VlIHBvc3NpYmxlIGNvbW1hbmRzLlxuIgotICAgICAgIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNvbW1hbmQ7Ci0KLSAgLy8gQWRkIGNvbW1hbmRzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaWYgdGhleSBleGlzdC4KLSAgYXV0byBjb21tYW5kX2xpbmUgPSBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKLSAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGtFeGVjdXRlTG9uZykpIHsKLSAgICBjb21tYW5kICs9IGNvbW1hbmRfbGluZS0+R2V0U3dpdGNoVmFsdWVBU0NJSShrRXhlY3V0ZUxvbmcpOwotICB9Ci0KLSAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGtFeGVjdXRlU2hvcnQpKSB7Ci0gICAgaWYgKCFjb21tYW5kLmVtcHR5KCkpIGNvbW1hbmQgKz0gIiA7ICI7Ci0gICAgY29tbWFuZCArPSBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlQVNDSUkoa0V4ZWN1dGVTaG9ydCk7Ci0gIH0KLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHZlY3RvcjxzdHJpbmc+IGNvbW1hbmRzID0gYmFzZTo6U3BsaXRTdHJpbmcoCi0gICAgICAgIGNvbW1hbmQsICI7IiwgYmFzZTo6VFJJTV9XSElURVNQQUNFLCBiYXNlOjpTUExJVF9XQU5UX0FMTCk7Ci0gICAgZm9yIChzdHJpbmcgY29tbWFuZCA6IGNvbW1hbmRzKSB7Ci0gICAgICBpZiAoIUV4ZWN1dGVDb21tYW5kKGJ0X2lmYWNlLCBjb21tYW5kKSkgYnJlYWs7Ci0gICAgfQotCi0gICAgY29tbWFuZHMuY2xlYXIoKTsKLQotICAgIFByaW50UHJvbXB0KCk7Ci0KLSAgICBzaG93aW5nX3Byb21wdCA9IHRydWU7Ci0gICAgYXV0byYgaXN0cmVhbSA9IGdldGxpbmUoY2luLCBjb21tYW5kKTsKLSAgICBzaG93aW5nX3Byb21wdCA9IGZhbHNlOwotCi0gICAgaWYgKGlzdHJlYW0uZW9mKCkgfHwgc2hvdWxkX2V4aXQubG9hZCgpKSB7Ci0gICAgICBjb3V0IDw8ICJcbkV4aXRpbmciIDw8IGVuZGw7Ci0gICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotICAgIH0KLQotICAgIGlmICghaXN0cmVhbS5nb29kKCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVhZGluZyBpbnB1dCI7Ci0gICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZS9jb21tb24vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1YjcwNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vIEJsdWV0b290aCB0eXBlcwotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJibHVldG9vdGgtY29tbW9uIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGNmbGFnczogWwotICAgICAgICAvKiB3ZSBleHBvcnQgYWxsIGNsYXNzZXMsIHNvIGNoYW5nZSBkZWZhdWx0IHZpc2liaWxpdHksIGluc3RlYWQgb2YgaGF2aW5nIEVYUE9SVF9TWU1CT0wgb24gZWFjaCBjbGFzcyovCi0gICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5jYyIsCi0gICAgICAgICJibHVldG9vdGgvYWRhcHRlcl9zdGF0ZS5jYyIsCi0gICAgICAgICJibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuY2MiLAotICAgICAgICAiYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5jYyIsCi0gICAgICAgICJibHVldG9vdGgvYXZyY3BfaW50X3ZhbHVlLmNjIiwKLSAgICAgICAgImJsdWV0b290aC9hdnJjcF9tZWRpYV9hdHRyLmNjIiwKLSAgICAgICAgImJsdWV0b290aC9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuY2MiLAotICAgICAgICAiYmx1ZXRvb3RoL2NoYXJhY3RlcmlzdGljLmNjIiwKLSAgICAgICAgImJsdWV0b290aC9kZXNjcmlwdG9yLmNjIiwKLSAgICAgICAgImJsdWV0b290aC9yZW1vdGVfZGV2aWNlX3Byb3BzLmNjIiwKLSAgICAgICAgImJsdWV0b290aC9zY2FuX2ZpbHRlci5jYyIsCi0gICAgICAgICJibHVldG9vdGgvc2Nhbl9yZXN1bHQuY2MiLAotICAgICAgICAiYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuY2MiLAotICAgICAgICAiYmx1ZXRvb3RoL3NlcnZpY2UuY2MiLAotICAgICAgICAiYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5jYyIsCi0gICAgXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4vIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9idCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICBdLAotfQotCi0vLyBCbHVldG9vdGggQmluZGVyIHNoYXJlZCBsaWJyYXJ5Ci1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aC1iaW5kZXItY29tbW9uIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGNmbGFnczogWwotICAgICAgICAvKiB3ZSBleHBvcnQgYWxsIGNsYXNzZXMsIHNvIGNoYW5nZSBkZWZhdWx0IHZpc2liaWxpdHksIGluc3RlYWQgb2YgaGF2aW5nIEVYUE9SVF9TWU1CT0wgb24gZWFjaCBjbGFzcyovCi0gICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNpbmsuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU291cmNlLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2wuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BDb250cm9sQ2FsbGJhY2suYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXQuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXRDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0Q2xpZW50LmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0U2VydmVyLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZUFkdmVydGlzZXIuYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2suYWlkbCIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVTY2FubmVyLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrLmFpZGwiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExvd0VuZXJneS5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjay5haWRsIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmNjIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5jYyIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYTJkcF9jb2RlY19jb25maWcuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX2ludF92YWx1ZS5jYyIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfbWVkaWFfYXR0ci5jYyIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmNjIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9zdHJpbmdfdmFsdWUuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfY2hhcmFjdGVyaXN0aWMuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfZGVzY3JpcHRvci5jYyIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9pbmNsdWRlZF9zZXJ2aWNlLmNjIiwKLSAgICAgICAgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X3NlcnZpY2UuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX3JlbW90ZV9kZXZpY2VfcHJvcHMuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuY2MiLAotICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5jYyIsCi0gICAgICAgICJhbmRyb2lkL2JsdWV0b290aC91dWlkLmNjIiwKLSAgICBdLAotICAgIGFpZGw6IHsKLSAgICAgICAgZXhwb3J0X2FpZGxfaGVhZGVyczogdHJ1ZSwKLSAgICAgICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvYWlkbC9iaW5kZXIiLAotICAgICAgICAgICAgInN5c3RlbS9idC9zZXJ2aWNlL2NvbW1vbiIsCi0gICAgICAgIF0sCi0gICAgfSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4vIl0sCi0gICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYmx1ZXRvb3RoLWNvbW1vbiJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vQlVJTEQuZ24gYi9zZXJ2aWNlL2NvbW1vbi9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZTkwYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDIxIEdvb2dsZQotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zb3VyY2Vfc2V0KCJsaWJibHVldG9vdGhfY29tbW9uIikgewotICBzb3VyY2VzID0gWwotICAgICJibHVldG9vdGgvYTJkcF9jb2RlY19jb25maWcuY2MiLAotICAgICJibHVldG9vdGgvYWRhcHRlcl9zdGF0ZS5jYyIsCi0gICAgImJsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5jYyIsCi0gICAgImJsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuY2MiLAotICAgICJibHVldG9vdGgvYXZyY3BfaW50X3ZhbHVlLmNjIiwKLSAgICAiYmx1ZXRvb3RoL2F2cmNwX21lZGlhX2F0dHIuY2MiLAotICAgICJibHVldG9vdGgvYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmNjIiwKLSAgICAiYmx1ZXRvb3RoL2NoYXJhY3RlcmlzdGljLmNjIiwKLSAgICAiYmx1ZXRvb3RoL2Rlc2NyaXB0b3IuY2MiLAotICAgICJibHVldG9vdGgvcmVtb3RlX2RldmljZV9wcm9wcy5jYyIsCi0gICAgImJsdWV0b290aC9zY2FuX2ZpbHRlci5jYyIsCi0gICAgImJsdWV0b290aC9zY2FuX3Jlc3VsdC5jYyIsCi0gICAgImJsdWV0b290aC9zY2FuX3NldHRpbmdzLmNjIiwKLSAgICAiYmx1ZXRvb3RoL3NlcnZpY2UuY2MiLAotICAgICJibHVldG9vdGgvdXRpbC9hdG9taWNfc3RyaW5nLmNjIiwKLSAgXQotCi0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiLiIsCi0gICAgIi8vYnQiLAotICBdCi0KLSAgY29uZmlncyArPSBbIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIl0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL1JFQURNRSBiL3NlcnZpY2UvY29tbW9uL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmOTVmYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlICJjb21tb24iIHNvdXJjZXMgYmV0d2VlbiB0aGUgYmx1ZXRvb3RoIGRhZW1vbgotYW5kIG91ciBjbGllbnQgbGlicmFyeS4gQWxsIHNvdXJjZSBmaWxlcyBoZXJlIGFyZSB1bmRlciB0aGUgImJsdWV0b290aCIKLXN1YmRpcmVjdG9yeSwgd2hpY2ggaXMgdGhlIGV4cG9ydGVkIHJvb3QgcGF0aCBmb3IgdGhlIGNsaWVudCBzdGF0aWMgbGlicmFyeS4KLU9ubHkgY29tbW9uIGZpbGVzIHNob3VsZCBnbyBoZXJlLiBBbGwgaGVhZGVycyB0aGF0IGdvIGludG8gY29tbW9uL2JsdWV0b290aCBtdXN0Ci1vbmx5IGluY2x1ZGUgb3RoZXIgaGVhZGVycyBmcm9tIGNvbW1vbi9ibHVldG9vdGggYW5kIG11c3QgdXNlICJibHVldG9vdGgiIGFzIHRoZQotcm9vdCBwYXRoLCBlLmcuOgotCi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3V1aWQuaD4KLQotVGhpcyBpcyBzbyB0aGF0IGNsaWVudCBhcHBsaWNhdGlvbnMgdGhhdCBsaW5rIGFnYWluc3QgdGhlIGNsaWVudCBsaWJyYXJ5IGhhdmUKLW9uZSBjb21tb24gaW5jbHVkZSBwYXRoIGV4cG9ydGVkIHRvIHRoZW0sIGFuZCBvdXIgaGVhZGVycyBjYW4gZmluZCBlYWNob3RoZXIKLXdpdGhpbiB0aGF0LgpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQWR2ZXJ0aXNlRGF0YS5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQWR2ZXJ0aXNlRGF0YS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjUwZjU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0FkdmVydGlzZURhdGEuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgQWR2ZXJ0aXNlRGF0YSBjcHBfaGVhZGVyICJhbmRyb2lkL2JsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0FkdmVydGlzZVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9BZHZlcnRpc2VTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzgwMWVjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0FkdmVydGlzZVNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIEFkdmVydGlzZVNldHRpbmdzIGNwcF9oZWFkZXIgImFuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEEyZHBDb2RlY0NvbmZpZy5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2NkNzUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhBMmRwQ29kZWNDb25maWcgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2EyZHBfY29kZWNfY29uZmlnLmgiOwpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZS5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI2MzkzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEF2cmNwSW50VmFsdWUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIEJsdWV0b290aEF2cmNwSW50VmFsdWUgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX2ludF92YWx1ZS5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEF2cmNwTWVkaWFBdHRyLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBdnJjcE1lZGlhQXR0ci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzM1NWFjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEF2cmNwTWVkaWFBdHRyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhBdnJjcE1lZGlhQXR0ciBjcHBfaGVhZGVyICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfbWVkaWFfYXR0ci5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZS5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2ExODcuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9yZXNwb25zZS5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEF2cmNwU3RyaW5nVmFsdWUuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEF2cmNwU3RyaW5nVmFsdWUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiZmJkNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlIGNwcF9oZWFkZXIgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9zdHJpbmdfdmFsdWUuaCI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY5MjJlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfY2hhcmFjdGVyaXN0aWMuaCI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0RGVzY3JpcHRvci5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZWQyNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhHYXR0RGVzY3JpcHRvci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhHYXR0RGVzY3JpcHRvciBjcHBfaGVhZGVyICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9kZXNjcmlwdG9yLmgiOwpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dEluY2x1ZGVkU2VydmljZS5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dEluY2x1ZGVkU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZkZWQwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEdhdHRJbmNsdWRlZFNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgQmx1ZXRvb3RoR2F0dEluY2x1ZGVkU2VydmljZSBjcHBfaGVhZGVyICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9pbmNsdWRlZF9zZXJ2aWNlLmgiOwpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dFNlcnZpY2UuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEdhdHRTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGJhMDkuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoR2F0dFNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgQmx1ZXRvb3RoR2F0dFNlcnZpY2UgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfc2VydmljZS5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFJlbW90ZURldmljZVByb3BzLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgwMjk1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFJlbW90ZURldmljZVByb3BzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBCbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wcyBjcHBfaGVhZGVyICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfcmVtb3RlX2RldmljZV9wcm9wcy5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjNzY1NC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoTG93RW5lcmd5OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhMZUFkdmVydGlzZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aExlU2Nhbm5lcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoR2F0dENsaWVudDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoR2F0dFNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQTJkcFNpbms7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEEyZHBTb3VyY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEF2cmNwQ29udHJvbDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQXZyY3BUYXJnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5VVUlEOwotCi1pbnRlcmZhY2UgSUJsdWV0b290aCB7Ci0gIGJvb2xlYW4gSXNFbmFibGVkKCk7Ci0gIGludCBHZXRTdGF0ZSgpOwotICBib29sZWFuIEVuYWJsZSgpOwotICBib29sZWFuIEVuYWJsZU5vQXV0b0Nvbm5lY3QoKTsKLSAgYm9vbGVhbiBEaXNhYmxlKCk7Ci0KLSAgU3RyaW5nIEdldEFkZHJlc3MoKTsKLSAgVVVJRFtdIEdldFVVSURzKCk7Ci0gIGJvb2xlYW4gU2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIFN0cmluZyBHZXROYW1lKCk7Ci0gIGJvb2xlYW4gU2V0U2Nhbk1vZGUoaW50IHNjYW5fbW9kZSk7Ci0gIGJvb2xlYW4gU2V0U2NhbkVuYWJsZShib29sZWFuIHNjYW5fZW5hYmxlKTsKLSAgYm9vbGVhbiBTc3BSZXBseSgKLSAgICAgIFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICAgIGludCB2YXJpYW50LAotICAgICAgYm9vbGVhbiBhY2NlcHQsCi0gICAgICBpbnQgcGFzc2tleSk7Ci0gIGJvb2xlYW4gQ3JlYXRlQm9uZChTdHJpbmcgZGV2aWNlX2FkZHJlc3MsIGludCB0cmFuc3BvcnQpOwotICBib29sZWFuIEdldEJvbmRlZERldmljZXMoKTsKLSAgYm9vbGVhbiBSZW1vdmVCb25kKFN0cmluZyBkZXZpY2VfYWRkcmVzcyk7Ci0gIGJvb2xlYW4gR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcyhTdHJpbmcgZGV2aWNlX2FkZHJlc3MpOwotCi0gIHZvaWQgUmVnaXN0ZXJDYWxsYmFjayhJQmx1ZXRvb3RoQ2FsbGJhY2sgY2FsbGJhY2spOwotICB2b2lkIFVucmVnaXN0ZXJDYWxsYmFjayhJQmx1ZXRvb3RoQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gIGJvb2xlYW4gSXNNdWx0aUFkdmVydGlzZW1lbnRTdXBwb3J0ZWQoKTsKLQotICBJQmx1ZXRvb3RoTG93RW5lcmd5IEdldExvd0VuZXJneUludGVyZmFjZSgpOwotICBJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyIEdldExlQWR2ZXJ0aXNlckludGVyZmFjZSgpOwotICBJQmx1ZXRvb3RoTGVTY2FubmVyIEdldExlU2Nhbm5lckludGVyZmFjZSgpOwotICBJQmx1ZXRvb3RoR2F0dENsaWVudCBHZXRHYXR0Q2xpZW50SW50ZXJmYWNlKCk7Ci0gIElCbHVldG9vdGhHYXR0U2VydmVyIEdldEdhdHRTZXJ2ZXJJbnRlcmZhY2UoKTsKLSAgSUJsdWV0b290aEEyZHBTaW5rIEdldEEyZHBTaW5rSW50ZXJmYWNlKCk7Ci0gIElCbHVldG9vdGhBMmRwU291cmNlIEdldEEyZHBTb3VyY2VJbnRlcmZhY2UoKTsKLSAgSUJsdWV0b290aEF2cmNwQ29udHJvbCBHZXRBdnJjcENvbnRyb2xJbnRlcmZhY2UoKTsKLSAgSUJsdWV0b290aEF2cmNwVGFyZ2V0IEdldEF2cmNwVGFyZ2V0SW50ZXJmYWNlKCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNpbmsuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU2luay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM3ZDI4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU2luay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjazsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhBMmRwU2luayB7Ci0gIGJvb2xlYW4gUmVnaXN0ZXIoaW4gSUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2sgY2FsbGJhY2spOwotICB2b2lkIFVucmVnaXN0ZXIoKTsKLQotICBib29sZWFuIEVuYWJsZSgpOwotICBib29sZWFuIERpc2FibGUoKTsKLSAgYm9vbGVhbiBDb25uZWN0KFN0cmluZyBkZXZpY2VfYWRkcmVzcyk7Ci0gIGJvb2xlYW4gRGlzY29ubmVjdChTdHJpbmcgZGV2aWNlX2FkZHJlc3MpOwotICBib29sZWFuIFNldEF1ZGlvRm9jdXNTdGF0ZShpbnQgc3RhdGUpOwotICBib29sZWFuIFNldEF1ZGlvVHJhY2tHYWluKGZsb2F0IGdhaW4pOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU2lua0NhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMmJlMjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2suYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhBMmRwU2lua0NhbGxiYWNrIHsKLSAgICB2b2lkIE9uUmVnaXN0ZXJlZChpbnQgc3RhdHVzKTsKLSAgICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKTsKLSAgICB2b2lkIE9uQXVkaW9TdGF0ZShTdHJpbmcgZGV2aWNlX2FkZHJlc3MsIGludCBzdGF0ZSk7Ci0gICAgdm9pZCBPbkF1ZGlvQ29uZmlnKFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW50IHNhbXBsZV9yYXRlLCBpbnQgY2hhbm5lbF9jb3VudCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNvdXJjZS5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTb3VyY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MjkyYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNvdXJjZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQTJkcFNvdXJjZUNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHBDb2RlY0NvbmZpZzsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhBMmRwU291cmNlIHsKLSAgYm9vbGVhbiBSZWdpc3RlcihpbiBJQmx1ZXRvb3RoQTJkcFNvdXJjZUNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgdm9pZCBVbnJlZ2lzdGVyKCk7Ci0KLSAgYm9vbGVhbiBFbmFibGUoaW4gQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnW10gY29kZWNfcHJpb3JpdGllcyk7Ci0gIGJvb2xlYW4gRGlzYWJsZSgpOwotICBib29sZWFuIENvbm5lY3QoU3RyaW5nIGRldmljZV9hZGRyZXNzKTsKLSAgYm9vbGVhbiBEaXNjb25uZWN0KFN0cmluZyBkZXZpY2VfYWRkcmVzcyk7Ci0gIGJvb2xlYW4gQ29uZmlnQ29kZWMoU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIGluIEJsdWV0b290aEEyZHBDb2RlY0NvbmZpZ1tdIGNvZGVjX3ByZWZlcmVuY2VzKTsKLQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjay5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDRhODJkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU291cmNlQ2FsbGJhY2suYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnOwotCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhBMmRwU291cmNlQ2FsbGJhY2sgewotICAgIHZvaWQgT25SZWdpc3RlcmVkKGludCBzdGF0dXMpOwotICAgIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoU3RyaW5nIGRldmljZV9hZGRyZXNzLCBpbnQgc3RhdGUpOwotICAgIHZvaWQgT25BdWRpb1N0YXRlKFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKTsKLSAgICB2b2lkIE9uQXVkaW9Db25maWcoCi0gICAgICAgIFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgaW4gQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnIGNvZGVjX2NvbmZpZywKLSAgICAgICAgaW4gQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnW10gY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICAgICAgaW4gQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnW10gY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2wuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2wuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2NWE3MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BDb250cm9sLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhBdnJjcENvbnRyb2xDYWxsYmFjazsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhBdnJjcENvbnRyb2wgewotICBib29sZWFuIFJlZ2lzdGVyKGluIElCbHVldG9vdGhBdnJjcENvbnRyb2xDYWxsYmFjayBjYWxsYmFjayk7Ci0gIHZvaWQgVW5yZWdpc3RlcihpbnQgaWQpOwotICB2b2lkIFVucmVnaXN0ZXJBbGwoKTsKLQotICBib29sZWFuIEVuYWJsZShpbnQgaWQpOwotICBib29sZWFuIERpc2FibGUoaW50IGlkKTsKLQotICBib29sZWFuIFNlbmRQYXNzVGhyb3VnaENvbW1hbmQoaW50IGlkLCBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsCi0gICAgICBpbnQga2V5X2NvZGUsIGJvb2xlYW4ga2V5X3ByZXNzZWQpOwotCi0gIGJvb2xlYW4gU2V0QWJzVm9sdW1lUmVzcG9uc2UoaW50IGlkLCBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsIGludCBhYnNfdm9sLAotICAgICAgaW50IGxhYmVsKTsKLQotICBib29sZWFuIFJlZ2lzdGVyRm9yQWJzVm9sdW1lQ2FsbGJhY2tSZXNwb25zZShpbnQgaWQsIFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICAgIGludCByZXNwb25zZV90eXBlLCBpbnQgYWJzX3ZvbCwgaW50IGxhYmVsKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2xDYWxsYmFjay5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEF2cmNwQ29udHJvbENhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjBkYjIuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEF2cmNwQ29udHJvbENhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF2cmNwTWVkaWFBdHRyOwotCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhBdnJjcENvbnRyb2xDYWxsYmFjayB7Ci0gIHZvaWQgT25SZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBpZCk7Ci0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoCi0gICAgICBib29sZWFuIHJjX2Nvbm5lY3QsCi0gICAgICBib29sZWFuIGJ0X2Nvbm5lY3QsCi0gICAgICBTdHJpbmcgZGV2aWNlX2FkZHJlc3MpOwotCi0gIHZvaWQgT25UcmFja0NoYW5nZWQoU3RyaW5nIGRldmljZV9hZGRyZXNzLCBpbiBCbHVldG9vdGhBdnJjcE1lZGlhQXR0ciB0cmFja19pbmZvKTsKLSAgdm9pZCBPblNldEFic1ZvbHVtZVJlcXVlc3QoU3RyaW5nIGRldmljZV9hZGRyZXNzLCBpbnQgYWJzX3ZvbCwgaW50IGxhYmVsKTsKLSAgdm9pZCBPblJlZ2lzdGVyRm9yQWJzVm9sdW1lQ2FsbGJhY2tSZXF1ZXN0KFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW50IGxhYmVsKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcFRhcmdldC5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEF2cmNwVGFyZ2V0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTRmODYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEF2cmNwVGFyZ2V0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhBdnJjcFRhcmdldENhbGxiYWNrOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZTsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhBdnJjcFRhcmdldCB7Ci0gIGJvb2xlYW4gUmVnaXN0ZXIoaW4gSUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2sgY2FsbGJhY2spOwotICB2b2lkIFVucmVnaXN0ZXIoaW50IGlkKTsKLSAgdm9pZCBVbnJlZ2lzdGVyQWxsKCk7Ci0KLSAgYm9vbGVhbiBFbmFibGUoKTsKLSAgYm9vbGVhbiBEaXNhYmxlKCk7Ci0KLSAgYm9vbGVhbiBHZXRQbGF5U3RhdHVzUmVzcG9uc2UoU3RyaW5nIGFkZHIsCi0gICAgICBpbnQgcGxheV9zdGF0dXMsIGludCBzb25nX2xlbiwgaW50IHNvbmdfcG9zKTsKLQotICBib29sZWFuIExpc3RQbGF5ZXJBcHBBdHRyUmVzcG9uc2UoU3RyaW5nIGFkZHIsIGluIGludFtdIGF0dHJzKTsKLQotICBib29sZWFuIEdldFBsYXllckFwcFZhbHVlUmVzcG9uc2UoU3RyaW5nIGFkZHIsCi0gICAgICBpbiBCbHVldG9vdGhBdnJjcEludFZhbHVlW10gdmFsdWVzKTsKLQotICBib29sZWFuIEdldFBsYXllckFwcEF0dHJUZXh0UmVzcG9uc2UoU3RyaW5nIGFkZHIsCi0gICAgICBpbiBCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlW10gYXR0cnMpOwotCi0gIGJvb2xlYW4gR2V0UGxheWVyQXBwVmFsdWVUZXh0UmVzcG9uc2UoU3RyaW5nIGFkZHIsCi0gICAgICBpbiBCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlW10gdmFsdWVzKTsKLQotICBib29sZWFuIEdldEVsZW1lbnRBdHRyUmVzcG9uc2UoU3RyaW5nIGFkZHIsCi0gICAgICBpbiBCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlW10gYXR0cnMpOwotCi0gIGJvb2xlYW4gU2V0UGxheWVyQXBwVmFsdWVSZXNwb25zZShTdHJpbmcgYWRkciwgaW50IHJzcF9zdGF0dXMpOwotCi0gIGJvb2xlYW4gUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSgKLSAgICAgIGludCBldmVudF9pZCwKLSAgICAgIGludCB0eXBlLAotICAgICAgaW4gQmx1ZXRvb3RoQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlIHBhcmFtKTsKLQotICBib29sZWFuIFNldFZvbHVtZShpbnQgdm9sdW1lKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcFRhcmdldENhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXRDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQ0NWYzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcFRhcmdldENhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEF2cmNwSW50VmFsdWU7Ci0KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2sgewotICB2b2lkIE9uUmVnaXN0ZXJlZChpbnQgc3RhdHVzKTsKLSAgdm9pZCBPbkdldFJlbW90ZUZlYXR1cmVzKFN0cmluZyBhZGRyLCBpbnQgZmVhdHVyZXMpOwotICB2b2lkIE9uR2V0UGxheVN0YXR1cyhTdHJpbmcgYWRkcik7Ci0gIHZvaWQgT25MaXN0UGxheWVyQXBwQXR0cihTdHJpbmcgYWRkcik7Ci0gIHZvaWQgT25MaXN0UGxheWVyQXBwVmFsdWVzKFN0cmluZyBhZGRyLCBpbnQgYXR0cl9pZCk7Ci0gIHZvaWQgT25HZXRQbGF5ZXJBcHBWYWx1ZShTdHJpbmcgYWRkciwgaW4gaW50W10gYXR0cnMpOwotICB2b2lkIE9uR2V0UGxheWVyQXBwQXR0cnNUZXh0KFN0cmluZyBhZGRyLCBpbiBpbnRbXSBhdHRycyk7Ci0gIHZvaWQgT25HZXRQbGF5ZXJBcHBWYWx1ZXNUZXh0KFN0cmluZyBhZGRyLCBpbnQgYXR0cl9pZCwgaW4gaW50W10gdmFsdWVzKTsKLSAgdm9pZCBPblNldFBsYXllckFwcFZhbHVlKFN0cmluZyBhZGRyLCBpbiBCbHVldG9vdGhBdnJjcEludFZhbHVlW10gdmFsdWVzKTsKLSAgdm9pZCBPbkdldEVsZW1lbnRBdHRycyhTdHJpbmcgYWRkciwgaW4gaW50W10gYXR0cnMpOwotICB2b2lkIE9uUmVnaXN0ZXJOb3RpZmljYXRpb24oU3RyaW5nIGFkZHIsIGludCBldmVudF9pZCwgaW50IHBhcmFtKTsKLSAgdm9pZCBPblZvbHVtZUNoYW5nZShTdHJpbmcgYWRkciwgaW50IHZvbHVtZSwgaW50IGN0eXBlKTsKLSAgdm9pZCBPblBhc3NUaHJvdWdoQ29tbWFuZChTdHJpbmcgYWRkciwgaW50IGlkLCBpbnQga2V5X3N0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDYWxsYmFjay5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2Q1ZDguLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aENhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFJlbW90ZURldmljZVByb3BzOwotCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhDYWxsYmFjayB7Ci0gICAgdm9pZCBPbkJsdWV0b290aFN0YXRlQ2hhbmdlKGludCBwcmV2X3N0YXRlLCBpbnQgbmV3X3N0YXRlKTsKLSAgICB2b2lkIE9uU2NhbkVuYWJsZUNoYW5nZWQoYm9vbGVhbiBzY2FuX2VuYWJsZWQpOwotICAgIHZvaWQgT25EZXZpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKAotICAgICAgICBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgIGJvb2xlYW4gY29ubmVjdGVkKTsKLSAgICB2b2lkIE9uU3NwUmVxdWVzdCgKLSAgICAgICAgU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgICAgICBTdHJpbmcgZGV2aWNlX25hbWUsCi0gICAgICAgIGludCBjb2QsCi0gICAgICAgIGludCBwYWlyaW5nX3ZhcmlhbnQsCi0gICAgICAgIGludCBwYXNzX2tleSk7Ci0gICAgdm9pZCBPbkdldEJvbmRlZERldmljZXMoaW50IHN0YXR1cywgaW4gU3RyaW5nW10gZGV2aWNlX2FkZHJlc3Nlcyk7Ci0gICAgdm9pZCBPbkJvbmRTdGF0ZUNoYW5nZWQoaW50IHN0YXR1cywgU3RyaW5nIGRldmljZV9hZGRyZXNzLCBpbnQgc3RhdGUpOwotICAgIHZvaWQgT25HZXRSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzKAotICAgICAgICBpbnQgc3RhdHVzLAotICAgICAgICBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgIGluIEJsdWV0b290aFJlbW90ZURldmljZVByb3BzIHByb3BzKTsKLSAgICB2b2lkIE9uRGV2aWNlRm91bmQoCi0gICAgICAgIGluIEJsdWV0b290aFJlbW90ZURldmljZVByb3BzIHByb3BzKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0Q2xpZW50LmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dENsaWVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWYzODMxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0Q2xpZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjazsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhHYXR0Q2xpZW50IHsKLQotICBib29sZWFuIFJlZ2lzdGVyQ2xpZW50KGluIElCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2sgY2FsbGJhY2spOwotICB2b2lkIFVucmVnaXN0ZXJDbGllbnQoaW50IGNsaWVudF9pZCk7Ci0gIHZvaWQgVW5yZWdpc3RlckFsbCgpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY0NjMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2suYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjayB7Ci0gIHZvaWQgT25DbGllbnRSZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBjbGllbnRfaWQpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRTZXJ2ZXIuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0U2VydmVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGZkODYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRTZXJ2ZXIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhHYXR0U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLlVVSUQ7Ci0KLWludGVyZmFjZSBJQmx1ZXRvb3RoR2F0dFNlcnZlciB7Ci0KLSAgYm9vbGVhbiBSZWdpc3RlclNlcnZlcihpbiBJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgdm9pZCBVbnJlZ2lzdGVyU2VydmVyKGludCBzZXJ2ZXJfaWQpOwotICB2b2lkIFVucmVnaXN0ZXJBbGwoKTsKLQotICBib29sZWFuIEFkZFNlcnZpY2UoaW50IHNlcnZlcl9pZCwgaW4gQmx1ZXRvb3RoR2F0dFNlcnZpY2Ugc2VydmljZSk7Ci0KLSAgYm9vbGVhbiBTZW5kUmVzcG9uc2UoCi0gICAgICBpbnQgc2VydmVyX2lkLAotICAgICAgU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgICAgaW50IHJlcXVlc3RfaWQsCi0gICAgICBpbnQgc3RhdHVzLCBpbnQgb2Zmc2V0LAotICAgICAgaW4gYnl0ZVtdIHZhbHVlKTsKLQotICBib29sZWFuIFNlbmROb3RpZmljYXRpb24oCi0gICAgICBpbnQgc2VydmVyX2lkLAotICAgICAgU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgICAgaW50IGhhbmRsZSwKLSAgICAgIGJvb2xlYW4gY29uZmlybSwKLSAgICAgIGluIGJ5dGVbXSB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOTE3NzAuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRTZXJ2aWNlOwotCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sgewotICB2b2lkIE9uU2VydmVyUmVnaXN0ZXJlZChpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lkKTsKLQotICB2b2lkIE9uU2VydmljZUFkZGVkKGludCBzdGF0dXMsIGluIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UpOwotCi0gIHZvaWQgT25DaGFyYWN0ZXJpc3RpY1JlYWRSZXF1ZXN0KFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwgYm9vbGVhbiBpc19sb25nLCBpbnQgaGFuZGxlKTsKLQotICB2b2lkIE9uRGVzY3JpcHRvclJlYWRSZXF1ZXN0KFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwgYm9vbGVhbiBpc19sb25nLCBpbnQgaGFuZGxlKTsKLQotICB2b2lkIE9uQ2hhcmFjdGVyaXN0aWNXcml0ZVJlcXVlc3QoU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LCBib29sZWFuIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2xlYW4gbmVlZF9yZXNwb25zZSwKLSAgICBpbiBieXRlW10gdmFsdWUsIGludCBoYW5kbGUpOwotCi0gIHZvaWQgT25EZXNjcmlwdG9yV3JpdGVSZXF1ZXN0KFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwgYm9vbGVhbiBpc19wcmVwYXJlX3dyaXRlLCBib29sZWFuIG5lZWRfcmVzcG9uc2UsCi0gICAgaW4gYnl0ZVtdIHZhbHVlLCBpbnQgaGFuZGxlKTsKLQotICB2b2lkIE9uRXhlY3V0ZVdyaXRlUmVxdWVzdChTdHJpbmcgZGV2aWNlX2FkZHJlc3MsCi0gICAgaW50IHJlcXVlc3RfaWQsIGJvb2xlYW4gaXNfZXhlY3V0ZSk7Ci0KLSAgdm9pZCBPbk5vdGlmaWNhdGlvblNlbnQoU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgIGludCBzdGF0dXMpOwotCi0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKFN0cmluZyBkZXZpY2VfYWRkcmVzcywgYm9vbGVhbiBjb25uZWN0ZWQpOwotICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVBZHZlcnRpc2VyLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVBZHZlcnRpc2VyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTRmY2EuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlQWR2ZXJ0aXNlci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjazsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkFkdmVydGlzZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQWR2ZXJ0aXNlU2V0dGluZ3M7Ci0KLWludGVyZmFjZSBJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyIHsKLSAgYm9vbGVhbiBSZWdpc3RlckFkdmVydGlzZXIoaW4gSUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgdm9pZCBVbnJlZ2lzdGVyQWR2ZXJ0aXNlcihpbnQgYWR2ZXJ0aXNlcl9pZCk7Ci0gIHZvaWQgVW5yZWdpc3RlckFsbCgpOwotCi0gIGJvb2xlYW4gU3RhcnRNdWx0aUFkdmVydGlzaW5nKAotICAgICAgaW50IGFkdmVydGlzZXJfaWQsCi0gICAgICBpbiBBZHZlcnRpc2VEYXRhIGFkdmVydGlzZV9kYXRhLAotICAgICAgaW4gQWR2ZXJ0aXNlRGF0YSBzY2FuX3Jlc3BvbnNlLAotICAgICAgaW4gQWR2ZXJ0aXNlU2V0dGluZ3Mgc2V0dGluZ3MpOwotICBib29sZWFuIFN0b3BNdWx0aUFkdmVydGlzaW5nKGludCBhZHZlcnRpc2VyX2lkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTAzMmUyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjay5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkFkdmVydGlzZVNldHRpbmdzOwotCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjayB7Ci0gIHZvaWQgT25BZHZlcnRpc2VyUmVnaXN0ZXJlZChpbnQgc3RhdHVzLCBpbnQgYWR2ZXJ0aXNlcl9pZCk7Ci0gIHZvaWQgT25NdWx0aUFkdmVydGlzZUNhbGxiYWNrKGludCBzdGF0dXMsIGJvb2xlYW4gaXNfc3RhcnQsIGluIEFkdmVydGlzZVNldHRpbmdzIHNldHRpbmdzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVTY2FubmVyLmFpZGwgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVTY2FubmVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzAwZTIuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlU2Nhbm5lci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhMZVNjYW5uZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5TY2FuRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLlNjYW5TZXR0aW5nczsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhMZVNjYW5uZXIgewotICBib29sZWFuIFJlZ2lzdGVyU2Nhbm5lcihpbiBJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICB2b2lkIFVucmVnaXN0ZXJTY2FubmVyKGludCBzY2FubmVyX2lkKTsKLSAgdm9pZCBVbnJlZ2lzdGVyQWxsKCk7Ci0KLSAgYm9vbGVhbiBTdGFydFNjYW4oaW50IGNsaWVudF9pZCwKLSAgICAgIGluIFNjYW5TZXR0aW5ncyBzZXR0aW5ncywKLSAgICAgIGluIFNjYW5GaWx0ZXJbXSBmaWx0ZXJzKTsKLSAgYm9vbGVhbiBTdG9wU2NhbihpbnQgY2xpZW50X2lkKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZVNjYW5uZXJDYWxsYmFjay5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGI5Y2IuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguU2NhblJlc3VsdDsKLQotb25ld2F5IGludGVyZmFjZSBJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2sgewotICB2b2lkIE9uU2Nhbm5lclJlZ2lzdGVyZWQoaW50IHN0YXR1cywgaW50IGNsaWVudF9pZCk7Ci0gIHZvaWQgT25TY2FuUmVzdWx0KGluIFNjYW5SZXN1bHQgc2Nhbl9yZXN1bHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMb3dFbmVyZ3kuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMb3dFbmVyZ3kuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0NzBkMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTG93RW5lcmd5LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQWR2ZXJ0aXNlRGF0YTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5BZHZlcnRpc2VTZXR0aW5nczsKLQotaW50ZXJmYWNlIElCbHVldG9vdGhMb3dFbmVyZ3kgewotICBib29sZWFuIFJlZ2lzdGVyQ2xpZW50KGluIElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjayBjYWxsYmFjayk7Ci0gIHZvaWQgVW5yZWdpc3RlckNsaWVudChpbnQgY2xpZW50X2lmKTsKLSAgdm9pZCBVbnJlZ2lzdGVyQWxsKCk7Ci0KLSAgYm9vbGVhbiBDb25uZWN0KGludCBjbGllbnRfaWQsIFN0cmluZyBhZGRyZXNzLCBib29sZWFuIGlzX2RpcmVjdCk7Ci0gIGJvb2xlYW4gRGlzY29ubmVjdChpbnQgY2xpZW50X2lkLCBTdHJpbmcgYWRkcmVzcyk7Ci0KLSAgYm9vbGVhbiBTZXRNdHUoaW50IGNsaWVudF9pZCwgU3RyaW5nIGFkZHJlc3MsIGludCBtdHUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjay5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTgwM2IuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguU2NhblJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5BZHZlcnRpc2VTZXR0aW5nczsKLQotb25ld2F5IGludGVyZmFjZSBJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sgewotICB2b2lkIE9uQ2xpZW50UmVnaXN0ZXJlZChpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkKTsKLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkLCBTdHJpbmcgYWRkcmVzcywgYm9vbGVhbiBjb25uZWN0ZWQpOwotICB2b2lkIE9uTXR1Q2hhbmdlZChpbnQgc3RhdHVzLCBTdHJpbmcgYWRkcmVzcywgaW50IG10dSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvU2NhbkZpbHRlci5haWRsIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvU2NhbkZpbHRlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2QxYWQ4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1NjYW5GaWx0ZXIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLXBhcmNlbGFibGUgU2NhbkZpbHRlciBjcHBfaGVhZGVyICJhbmRyb2lkL2JsdWV0b290aC9zY2FuX2ZpbHRlci5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1NjYW5SZXN1bHQuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1NjYW5SZXN1bHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhYzAxYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9TY2FuUmVzdWx0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIFNjYW5SZXN1bHQgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuaCI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9TY2FuU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1NjYW5TZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWIyNGM5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1NjYW5TZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotcGFyY2VsYWJsZSBTY2FuU2V0dGluZ3MgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1VVSUQuYWlkbCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL1VVSUQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwOWFhYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9VVUlELmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1wYXJjZWxhYmxlIFVVSUQgY3BwX2hlYWRlciAiYW5kcm9pZC9ibHVldG9vdGgvdXVpZC5oIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmNjIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTVjNTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmgiCi0KLXVzaW5nIGFuZHJvaWQ6Ok9LOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RhdHVzX3QgQWR2ZXJ0aXNlRGF0YTo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlQnl0ZVZlY3RvcihkYXRhXyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEFkdmVydGlzZURhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJ5dGVWZWN0b3IoJmRhdGFfKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmggYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQzZjA1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBBZHZlcnRpc2VEYXRhIDogcHVibGljIFBhcmNlbGFibGUsIHB1YmxpYyA6OmJsdWV0b290aDo6QWR2ZXJ0aXNlRGF0YSB7Ci0gcHVibGljOgotICAvLyBOT0xJTlQsIGltcGxpY2l0IGNvbnZlcnRlcgotICBBZHZlcnRpc2VEYXRhKGNvbnN0IDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhJiBhZHZlcnRpc2VfZGF0YSkgIC8vIE5PTElOVAotICAgICAgOiA6OmJsdWV0b290aDo6QWR2ZXJ0aXNlRGF0YShhZHZlcnRpc2VfZGF0YSl7fTsKLSAgQWR2ZXJ0aXNlRGF0YSgpID0gZGVmYXVsdDsKLSAgfkFkdmVydGlzZURhdGEoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5jYyBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMmFiZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5oIgotCi11c2luZyBhbmRyb2lkOjpPSzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXN0YXR1c190IEFkdmVydGlzZVNldHRpbmdzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtb2RlXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKHR4X3Bvd2VyX2xldmVsXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGNvbm5lY3RhYmxlXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKHRpbWVvdXRfLkluTWlsbGlzZWNvbmRzKCkpOwotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBZHZlcnRpc2VTZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBtb2RlXyA9IHN0YXRpY19jYXN0PEFkdmVydGlzZVNldHRpbmdzOjpNb2RlPih2YWx1ZSk7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICB0eF9wb3dlcl9sZXZlbF8gPSBzdGF0aWNfY2FzdDxBZHZlcnRpc2VTZXR0aW5nczo6VHhQb3dlckxldmVsPih2YWx1ZSk7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBjb25uZWN0YWJsZV8gPSBzdGF0aWNfY2FzdDxib29sPih2YWx1ZSk7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICB0aW1lb3V0XyA9IDo6YmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKHZhbHVlKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2FkdmVydGlzZV9zZXR0aW5ncy5oIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcxYjIuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQWR2ZXJ0aXNlU2V0dGluZ3MgOiBwdWJsaWMgUGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5ncyB7Ci0gcHVibGljOgotICAvLyBOT0xJTlQsIGltcGxpY2l0IGNvbnZlcnRlcgotICBBZHZlcnRpc2VTZXR0aW5ncygKLSAgICAgIGNvbnN0IDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5ncyYgYWR2ZXJ0aXNlX3NldHRpbmdzKSAgLy8gTk9MSU5UCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5ncyhhZHZlcnRpc2Vfc2V0dGluZ3Mpe307Ci0gIEFkdmVydGlzZVNldHRpbmdzKCkgPSBkZWZhdWx0OwotICB+QWR2ZXJ0aXNlU2V0dGluZ3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hMmRwX2NvZGVjX2NvbmZpZy5jYyBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hMmRwX2NvZGVjX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3YjcwOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYTJkcF9jb2RlY19jb25maWcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2EyZHBfY29kZWNfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgYW5kcm9pZDo6T0s7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0dXNfdCBCbHVldG9vdGhBMmRwQ29kZWNDb25maWc6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGNvZGVjX3R5cGVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoY29kZWNfcHJpb3JpdHlfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoc2FtcGxlX3JhdGVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoYml0c19wZXJfc2FtcGxlXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGNoYW5uZWxfbW9kZV8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQ2NChjb2RlY19zcGVjaWZpY18xXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDY0KGNvZGVjX3NwZWNpZmljXzJfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50NjQoY29kZWNfc3BlY2lmaWNfM18pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQ2NChjb2RlY19zcGVjaWZpY180Xyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICBpbnQzMl90IHRtcDsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRtcCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIGNvZGVjX3R5cGVfID0gdG1wOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0bXApOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBjb2RlY19wcmlvcml0eV8gPSB0bXA7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRtcCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIHNhbXBsZV9yYXRlXyA9IHRtcDsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgYml0c19wZXJfc2FtcGxlXyA9IHRtcDsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgY2hhbm5lbF9tb2RlXyA9IHRtcDsKLQotICBpbnQ2NF90IHRtcDY0OwotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQ2NCgmdG1wNjQpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBjb2RlY19zcGVjaWZpY18xXyA9IHRtcDY0OwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDY0KCZ0bXA2NCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIGNvZGVjX3NwZWNpZmljXzJfID0gdG1wNjQ7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50NjQoJnRtcDY0KTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgY29kZWNfc3BlY2lmaWNfM18gPSB0bXA2NDsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQ2NCgmdG1wNjQpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBjb2RlY19zcGVjaWZpY180XyA9IHRtcDY0OwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYTJkcF9jb2RlY19jb25maWcuaCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hMmRwX2NvZGVjX2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDcxZDY3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hMmRwX2NvZGVjX2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2EyZHBfY29kZWNfY29uZmlnLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEJsdWV0b290aEEyZHBDb2RlY0NvbmZpZyA6IHB1YmxpYyBQYXJjZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6Ymx1ZXRvb3RoOjpBMmRwQ29kZWNDb25maWcgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnKCkgPSBkZWZhdWx0OwotICBCbHVldG9vdGhBMmRwQ29kZWNDb25maWcoY29uc3QgOjpibHVldG9vdGg6OkEyZHBDb2RlY0NvbmZpZyYgb3RoZXIpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpBMmRwQ29kZWNDb25maWcob3RoZXIpIHt9ICAvLyBOT0xJTlQoaW1wbGljaXQpCi0gIEJsdWV0b290aEEyZHBDb2RlY0NvbmZpZyhjb25zdCBCbHVldG9vdGhBMmRwQ29kZWNDb25maWcmIG90aGVyKQotICAgICAgOiA6OmJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnKG90aGVyKSB7fSAgLy8gTk9MSU5UKGltcGxpY2l0KQotICB+Qmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9pbnRfdmFsdWUuY2MgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfaW50X3ZhbHVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE4OTVjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9pbnRfdmFsdWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfaW50X3ZhbHVlLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgYW5kcm9pZDo6T0s7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0dXNfdCBCbHVldG9vdGhBdnJjcEludFZhbHVlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihpZF8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMih2YWx1ZV8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEJsdWV0b290aEF2cmNwSW50VmFsdWU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgdG1wOwotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgaWRfID0gdG1wOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0bXApOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICB2YWx1ZV8gPSB0bXA7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9pbnRfdmFsdWUuaCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9pbnRfdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlZWQ3Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfaW50X3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGgvYXZyY3BfaW50X3ZhbHVlLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEJsdWV0b290aEF2cmNwSW50VmFsdWUgOiBwdWJsaWMgUGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjpibHVldG9vdGg6OkF2cmNwSW50VmFsdWUgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZSgpID0gZGVmYXVsdDsKLSAgQmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZShjb25zdCA6OmJsdWV0b290aDo6QXZyY3BJbnRWYWx1ZSYgb3RoZXIpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpBdnJjcEludFZhbHVlKG90aGVyKSB7fSAgLy8gTk9MSU5UKGltcGxpY2l0KQotICBCbHVldG9vdGhBdnJjcEludFZhbHVlKGNvbnN0IEJsdWV0b290aEF2cmNwSW50VmFsdWUmIG90aGVyKQotICAgICAgOiA6OmJsdWV0b290aDo6QXZyY3BJbnRWYWx1ZShvdGhlcikge30gIC8vIE5PTElOVChpbXBsaWNpdCkKLSAgfkJsdWV0b290aEF2cmNwSW50VmFsdWUoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX21lZGlhX2F0dHIuY2MgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfbWVkaWFfYXR0ci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MjA0ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfbWVkaWFfYXR0ci5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX21lZGlhX2F0dHIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXN0YXR1c190IEJsdWV0b290aEF2cmNwTWVkaWFBdHRyOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYodGl0bGVfLmNfc3RyKCksIHRpdGxlXy5zaXplKCkpKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoYXJ0aXN0Xy5jX3N0cigpLCBhcnRpc3RfLnNpemUoKSkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihhbGJ1bV8uY19zdHIoKSwgYWxidW1fLnNpemUoKSkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihnZW5yZV8uY19zdHIoKSwgZ2VucmVfLnNpemUoKSkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMih0cmFja19udW1fKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobnVtX3RyYWNrc18pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihwbGF5X3RpbWVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBCbHVldG9vdGhBdnJjcE1lZGlhQXR0cjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgU3RyaW5nMTYgdGl0bGU7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZ0aXRsZSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIHRpdGxlXyA9IFN0cmluZzgodGl0bGUpLnN0cmluZygpOwotCi0gIFN0cmluZzE2IGFydGlzdDsKLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmFydGlzdCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIGFydGlzdF8gPSBTdHJpbmc4KGFydGlzdCkuc3RyaW5nKCk7Ci0KLSAgU3RyaW5nMTYgYWxidW07Ci0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZhbGJ1bSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIGFsYnVtXyA9IFN0cmluZzgoYWxidW0pLnN0cmluZygpOwotCi0gIFN0cmluZzE2IGdlbnJlOwotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmZ2VucmUpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBnZW5yZV8gPSBTdHJpbmc4KGdlbnJlKS5zdHJpbmcoKTsKLQotICBpbnQzMl90IHRtcDsKLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRtcCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIHRyYWNrX251bV8gPSB0bXA7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRtcCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIG51bV90cmFja3NfID0gdG1wOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0bXApOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBwbGF5X3RpbWVfID0gdG1wOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfbWVkaWFfYXR0ci5oIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX21lZGlhX2F0dHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxZmVmNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfbWVkaWFfYXR0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2F2cmNwX21lZGlhX2F0dHIuaCIKLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQmx1ZXRvb3RoQXZyY3BNZWRpYUF0dHIgOiBwdWJsaWMgUGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6Ymx1ZXRvb3RoOjpBdnJjcE1lZGlhQXR0ciB7Ci0gcHVibGljOgotICBCbHVldG9vdGhBdnJjcE1lZGlhQXR0cigpID0gZGVmYXVsdDsKLSAgQmx1ZXRvb3RoQXZyY3BNZWRpYUF0dHIoY29uc3QgOjpibHVldG9vdGg6OkF2cmNwTWVkaWFBdHRyJiBvdGhlcikKLSAgICAgIDogOjpibHVldG9vdGg6OkF2cmNwTWVkaWFBdHRyKG90aGVyKSB7fSAgLy8gTk9MSU5UKGltcGxpY2l0KQotICBCbHVldG9vdGhBdnJjcE1lZGlhQXR0cihjb25zdCBCbHVldG9vdGhBdnJjcE1lZGlhQXR0ciYgb3RoZXIpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpBdnJjcE1lZGlhQXR0cihvdGhlcikge30gIC8vIE5PTElOVChpbXBsaWNpdCkKLSAgfkJsdWV0b290aEF2cmNwTWVkaWFBdHRyKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuY2MgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY1YTE3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgYW5kcm9pZDo6T0s7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0dXNfdCBCbHVldG9vdGhBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2U6OndyaXRlVG9QYXJjZWwoCi0gICAgUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZSgmZGF0YV8sIHNpemVvZihkYXRhXykpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZTo6cmVhZEZyb21QYXJjZWwoCi0gICAgY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkKCZkYXRhXywgc2l6ZW9mKGRhdGFfKSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuaCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzNGQxZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGgvYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZQotICAgIDogcHVibGljIFBhcmNlbGFibGUsCi0gICAgICBwdWJsaWMgOjpibHVldG9vdGg6OkF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSB7Ci0gcHVibGljOgotICBCbHVldG9vdGhBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UoKSA9IGRlZmF1bHQ7Ci0gIEJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSgKLSAgICAgIGNvbnN0IEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSYgb3RoZXIpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2Uob3RoZXIpIHt9Ci0gIEJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSgKLSAgICAgIGNvbnN0IEJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSYgb3RoZXIpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2Uob3RoZXIpIHt9Ci0gIH5CbHVldG9vdGhBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX3N0cmluZ192YWx1ZS5jYyBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9zdHJpbmdfdmFsdWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDkxMDUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX3N0cmluZ192YWx1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9hdnJjcF9zdHJpbmdfdmFsdWUuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXN0YXR1c190IEJsdWV0b290aEF2cmNwU3RyaW5nVmFsdWU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGlkXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KFN0cmluZzE2KHZhbHVlXy5jX3N0cigpLCB2YWx1ZV8uc2l6ZSgpKSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQmx1ZXRvb3RoQXZyY3BTdHJpbmdWYWx1ZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCB0bXA7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0bXApOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBpZF8gPSB0bXA7Ci0KLSAgU3RyaW5nMTYgdmFsdWU7Ci0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZ2YWx1ZSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIHZhbHVlXyA9IFN0cmluZzgodmFsdWUpLnN0cmluZygpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3Bfc3RyaW5nX3ZhbHVlLmggYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfYXZyY3Bfc3RyaW5nX3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmN2U5NTIuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2F2cmNwX3N0cmluZ192YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2F2cmNwX3N0cmluZ192YWx1ZS5oIgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlIDogcHVibGljIFBhcmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6Ymx1ZXRvb3RoOjpBdnJjcFN0cmluZ1ZhbHVlIHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aEF2cmNwU3RyaW5nVmFsdWUoKSA9IGRlZmF1bHQ7Ci0gIEJsdWV0b290aEF2cmNwU3RyaW5nVmFsdWUoY29uc3QgOjpibHVldG9vdGg6OkF2cmNwU3RyaW5nVmFsdWUmIG90aGVyKQotICAgICAgOiA6OmJsdWV0b290aDo6QXZyY3BTdHJpbmdWYWx1ZShvdGhlcikge30gIC8vIE5PTElOVChpbXBsaWNpdCkKLSAgQmx1ZXRvb3RoQXZyY3BTdHJpbmdWYWx1ZShjb25zdCBCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlJiBvdGhlcikKLSAgICAgIDogOjpibHVldG9vdGg6OkF2cmNwU3RyaW5nVmFsdWUob3RoZXIpIHt9ICAvLyBOT0xJTlQoaW1wbGljaXQpCi0gIH5CbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X2NoYXJhY3RlcmlzdGljLmNjIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfY2hhcmFjdGVyaXN0aWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYmMwNzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfY2hhcmFjdGVyaXN0aWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X2NoYXJhY3RlcmlzdGljLmgiCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfZGVzY3JpcHRvci5oIgotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL3V1aWQuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXN0YXR1c190IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYzo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoaGFuZGxlXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoKFVVSUQpdXVpZF8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihwcm9wZXJ0aWVzXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKHBlcm1pc3Npb25zXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RkOjp2ZWN0b3I8Qmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzOwotICBmb3IgKGNvbnN0IGF1dG8mIGRlc2MgOiBkZXNjcmlwdG9yc18pIHsKLSAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzYyk7Ci0gIH0KLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihkZXNjcmlwdG9ycyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYzo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50MzJfdCB0bXA7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0bXApOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBoYW5kbGVfID0gdG1wOwotCi0gIFVVSUQgdXVpZDsKLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmdXVpZCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIHV1aWRfID0gdXVpZC51dWlkOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0bXApOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBwcm9wZXJ0aWVzXyA9IHRtcDsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgcGVybWlzc2lvbnNfID0gdG1wOwotCi0gIHN0ZDo6dmVjdG9yPEJsdWV0b290aEdhdHREZXNjcmlwdG9yPiBkZXNjcmlwdG9yczsKLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3RvcigmZGVzY3JpcHRvcnMpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIGZvciAoY29uc3QgYXV0byYgZGVzYyA6IGRlc2NyaXB0b3JzKSB7Ci0gICAgZGVzY3JpcHRvcnNfLnB1c2hfYmFjayhkZXNjKTsKLSAgfQotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9jaGFyYWN0ZXJpc3RpYy5oIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfY2hhcmFjdGVyaXN0aWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0ZmU5NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9jaGFyYWN0ZXJpc3RpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2NoYXJhY3RlcmlzdGljLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljIDogcHVibGljIFBhcmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjpibHVldG9vdGg6OkNoYXJhY3RlcmlzdGljIHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aEdhdHRDaGFyYWN0ZXJpc3RpYygpID0gZGVmYXVsdDsKLSAgQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljKAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OkNoYXJhY3RlcmlzdGljJiBjaGFyYWN0ZXJpc3RpYykgIC8vIE5PTElOVChpbXBsaWNpdCkKLSAgICAgIDogOjpibHVldG9vdGg6OkNoYXJhY3RlcmlzdGljKGNoYXJhY3RlcmlzdGljKXt9OwotICB+Qmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9kZXNjcmlwdG9yLmNjIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfZGVzY3JpcHRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlYzAzZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9kZXNjcmlwdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9kZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvdXVpZC5oIgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6Ok9LOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RhdHVzX3QgQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoKFVVSUQpdXVpZF8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihoYW5kbGVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIocGVybWlzc2lvbnNfKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIFVVSUQgdXVpZDsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmdXVpZCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIHV1aWRfID0gdXVpZC51dWlkOwotCi0gIGludDMyX3QgdG1wOwotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgaGFuZGxlXyA9IHRtcDsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgcGVybWlzc2lvbnNfID0gdG1wOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9kZXNjcmlwdG9yLmggYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9kZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjFmOWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfZGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2Rlc2NyaXB0b3IuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBCbHVldG9vdGhHYXR0RGVzY3JpcHRvciA6IHB1YmxpYyBQYXJjZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjpibHVldG9vdGg6OkRlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7Ci0gIEJsdWV0b290aEdhdHREZXNjcmlwdG9yKAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OkRlc2NyaXB0b3ImIGNoYXJhY3RlcmlzdGljKSAgLy8gTk9MSU5UKGltcGxpY2l0KQotICAgICAgOiA6OmJsdWV0b290aDo6RGVzY3JpcHRvcihjaGFyYWN0ZXJpc3RpYyl7fTsKLSAgfkJsdWV0b290aEdhdHREZXNjcmlwdG9yKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9pbmNsdWRlZF9zZXJ2aWNlLmNjIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfaW5jbHVkZWRfc2VydmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjZjE5YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9pbmNsdWRlZF9zZXJ2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9jaGFyYWN0ZXJpc3RpYy5oIgotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X3NlcnZpY2UuaCIKLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC91dWlkLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgYW5kcm9pZDo6T0s7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0dXNfdCBCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKChVVUlEKXV1aWRfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoaGFuZGxlXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUJvb2wocHJpbWFyeV8pOwotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICBVVUlEIHV1aWQ7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUoJnV1aWQpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICB1dWlkXyA9IHV1aWQudXVpZDsKLQotICBpbnQzMl90IHRtcDsKLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRtcCk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIGhhbmRsZV8gPSB0bXA7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmcHJpbWFyeV8pOwotICByZXR1cm4gc3RhdHVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfaW5jbHVkZWRfc2VydmljZS5oIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfaW5jbHVkZWRfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDExNTMyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X2luY2x1ZGVkX3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJsdWV0b290aC9zZXJ2aWNlLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotCi11c2luZyA6OmJsdWV0b290aDo6VXVpZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEJsdWV0b290aEdhdHRJbmNsdWRlZFNlcnZpY2UgOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci0gcHVibGljOgotICBCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlKCkgPSBkZWZhdWx0OwotICBCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlKAotICAgICAgY29uc3QgOjpibHVldG9vdGg6OlNlcnZpY2UmIHNlcnZpY2UpICAvLyBOT0xJTlQoaW1wbGljaXQpCi0gICAgICA6IGhhbmRsZV8oc2VydmljZS5oYW5kbGUoKSksCi0gICAgICAgIHV1aWRfKHNlcnZpY2UudXVpZCgpKSwKLSAgICAgICAgcHJpbWFyeV8oc2VydmljZS5wcmltYXJ5KCkpe307Ci0gIH5CbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCi0gIHVpbnQxNl90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KLSAgYm9vbCBwcmltYXJ5KCkgY29uc3QgeyByZXR1cm4gcHJpbWFyeV87IH0KLSAgVXVpZCB1dWlkKCkgY29uc3QgeyByZXR1cm4gdXVpZF87IH0KLQotIHByb3RlY3RlZDoKLSAgdWludDE2X3QgaGFuZGxlXzsKLSAgVXVpZCB1dWlkXzsKLSAgYm9vbCBwcmltYXJ5XzsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfc2VydmljZS5jYyBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X3NlcnZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMGVmNDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfc2VydmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfc2VydmljZS5oIgotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X2NoYXJhY3RlcmlzdGljLmgiCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvdXVpZC5oIgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6Ok9LOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RhdHVzX3QgQmx1ZXRvb3RoR2F0dFNlcnZpY2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGhhbmRsZV8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKHByaW1hcnlfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZSgoVVVJRCl1dWlkXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RkOjp2ZWN0b3I8Qmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljPiBjaGFyYWN0ZXJpc3RpY3M7Ci0gIGZvciAoY29uc3QgYXV0byYgY2hyYyA6IGNoYXJhY3RlcmlzdGljc18pIGNoYXJhY3RlcmlzdGljcy5wdXNoX2JhY2soY2hyYyk7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IoY2hhcmFjdGVyaXN0aWNzKTsKLQotICBzdGQ6OnZlY3RvcjxCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlPiBpbmNsdWRlZFNlcnZpY2VzOwotICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2UgOiBpbmNsdWRlZF9zZXJ2aWNlc18pCi0gICAgaW5jbHVkZWRTZXJ2aWNlcy5wdXNoX2JhY2soc2VydmljZSk7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IoaW5jbHVkZWRTZXJ2aWNlcyk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQmx1ZXRvb3RoR2F0dFNlcnZpY2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIGludDMyX3QgdG1wOwotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdG1wKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgaGFuZGxlXyA9IHRtcDsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZwcmltYXJ5Xyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgVVVJRCB1dWlkOwotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZ1dWlkKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgdXVpZF8gPSB1dWlkLnV1aWQ7Ci0KLSAgc3RkOjp2ZWN0b3I8Qmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljPiBjaGFyYWN0ZXJpc3RpY3M7Ci0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJmNoYXJhY3RlcmlzdGljcyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBjaHJjIDogY2hhcmFjdGVyaXN0aWNzKSBjaGFyYWN0ZXJpc3RpY3NfLnB1c2hfYmFjayhjaHJjKTsKLQotICBzdGQ6OnZlY3RvcjxCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlPiBpbmNsdWRlZFNlcnZpY2VzOwotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZpbmNsdWRlZFNlcnZpY2VzKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBmb3IgKGNvbnN0IGF1dG8mIHNydmMgOiBpbmNsdWRlZFNlcnZpY2VzKQotICAgIGluY2x1ZGVkX3NlcnZpY2VzXy5wdXNoX2JhY2soQmx1ZXRvb3RoR2F0dFNlcnZpY2Uoc3J2YykpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9zZXJ2aWNlLmggYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2I2ZGEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX2dhdHRfaW5jbHVkZWRfc2VydmljZS5oIgotI2luY2x1ZGUgImJsdWV0b290aC9zZXJ2aWNlLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQmx1ZXRvb3RoR2F0dFNlcnZpY2UgOiBwdWJsaWMgUGFyY2VsYWJsZSwgcHVibGljIDo6Ymx1ZXRvb3RoOjpTZXJ2aWNlIHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aEdhdHRTZXJ2aWNlKCkgPSBkZWZhdWx0OwotICBCbHVldG9vdGhHYXR0U2VydmljZShjb25zdCA6OmJsdWV0b290aDo6U2VydmljZSYgc2VydmljZSkKLSAgICAgIDogOjpibHVldG9vdGg6OlNlcnZpY2Uoc2VydmljZSl7fTsgIC8vIE5PTElOVChpbXBsaWNpdCkKLSAgQmx1ZXRvb3RoR2F0dFNlcnZpY2UoCi0gICAgICBjb25zdCBCbHVldG9vdGhHYXR0SW5jbHVkZWRTZXJ2aWNlJiBpbmNsdWRlZFNlcnZpY2UpICAvLyBOT0xJTlQoaW1wbGljaXQpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpTZXJ2aWNlKGluY2x1ZGVkU2VydmljZS5oYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRTZXJ2aWNlLnByaW1hcnkoKSwgaW5jbHVkZWRTZXJ2aWNlLnV1aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIHt9KXt9OwotICB+Qmx1ZXRvb3RoR2F0dFNlcnZpY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9yZW1vdGVfZGV2aWNlX3Byb3BzLmNjIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX3JlbW90ZV9kZXZpY2VfcHJvcHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTc0ZGEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX3JlbW90ZV9kZXZpY2VfcHJvcHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9yZW1vdGVfZGV2aWNlX3Byb3BzLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL3V1aWQuaCIKLQotdXNpbmcgYW5kcm9pZDo6T0s7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0dXNfdCBCbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wczo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICBzdGF0dXNfdCBzdGF0dXMgPQotICAgICAgcGFyY2VsLT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG5hbWVfLmNfc3RyKCksIG5hbWVfLnNpemUoKSkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihhZGRyZXNzXy5jX3N0cigpLCBhZGRyZXNzXy5zaXplKCkpKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGQ6OnZlY3RvcjxVVUlEPiB1dWlkczsKLSAgZm9yIChjb25zdCBhdXRvJiB1dWlkIDogc2VydmljZV91dWlkc18pIHsKLSAgICB1dWlkcy5wdXNoX2JhY2sodXVpZCk7Ci0gIH0KLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3Rvcih1dWlkcyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGRldmljZV9jbGFzc18pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihkZXZpY2VfdHlwZV8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihyc3NpXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQmx1ZXRvb3RoUmVtb3RlRGV2aWNlUHJvcHM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIFN0cmluZzE2IG5hbWU7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZuYW1lKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgbmFtZV8gPSBTdHJpbmc4KG5hbWUpLnN0cmluZygpOwotCi0gIFN0cmluZzE2IGFkZHJlc3M7Ci0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZhZGRyZXNzKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgYWRkcmVzc18gPSBTdHJpbmc4KGFkZHJlc3MpLnN0cmluZygpOwotCi0gIHN0ZDo6dmVjdG9yPFVVSUQ+IHV1aWRzOwotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZ1dWlkcyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiB1dWlkIDogdXVpZHMpIHsKLSAgICBzZXJ2aWNlX3V1aWRzXy5wdXNoX2JhY2sodXVpZC51dWlkKTsKLSAgfQotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZkZXZpY2VfY2xhc3NfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmZGV2aWNlX3R5cGVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmcnNzaV8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfcmVtb3RlX2RldmljZV9wcm9wcy5oIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYmx1ZXRvb3RoX3JlbW90ZV9kZXZpY2VfcHJvcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhZDM0Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfcmVtb3RlX2RldmljZV9wcm9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL3JlbW90ZV9kZXZpY2VfcHJvcHMuaCIKLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQmx1ZXRvb3RoUmVtb3RlRGV2aWNlUHJvcHMgOiBwdWJsaWMgUGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6Ymx1ZXRvb3RoOjpSZW1vdGVEZXZpY2VQcm9wcyB7Ci0gcHVibGljOgotICBCbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wcygpID0gZGVmYXVsdDsKLSAgQmx1ZXRvb3RoUmVtb3RlRGV2aWNlUHJvcHMoY29uc3QgOjpibHVldG9vdGg6OlJlbW90ZURldmljZVByb3BzJiBvdGhlcikKLSAgICAgIDogOjpibHVldG9vdGg6OlJlbW90ZURldmljZVByb3BzKG90aGVyKSB7fSAgLy8gTk9MSU5UKGltcGxpY2l0KQotICBCbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wcyhjb25zdCBCbHVldG9vdGhSZW1vdGVEZXZpY2VQcm9wcyYgb3RoZXIpCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpSZW1vdGVEZXZpY2VQcm9wcyhvdGhlcikge30gIC8vIE5PTElOVChpbXBsaWNpdCkKLSAgfkJsdWV0b290aFJlbW90ZURldmljZVByb3BzKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdyaXRlIHx0aGlzfCBwYXJjZWxhYmxlIHRvIHRoZSBnaXZlbiB8cGFyY2VsfC4gIEtlZXAgaW4gbWluZCB0aGF0Ci0gIC8vIGltcGxlbWVudGF0aW9ucyBvZiB3cml0ZVRvUGFyY2VsIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jCi0gIC8vIHdpdGggcmVhZEZyb21QYXJjZWwgYW5kIHRoZSBKYXZhIGVxdWl2YWxlbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcy4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiB8cGFyY2VsfCBpbnRvIHx0aGlzfC4gIEFmdGVyIHJlYWRGcm9tUGFyY2VsCi0gIC8vIGNvbXBsZXRlcywgfHRoaXN8IHNob3VsZCBoYXZlIGVxdWl2YWxlbnQgc3RhdGUgdG8gdGhlIG9iamVjdCB0aGF0Ci0gIC8vIHdyb3RlIGl0c2VsZiB0byB0aGUgcGFyY2VsLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3NjYW5fZmlsdGVyLmNjIGIvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGJlYTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL3NjYW5fZmlsdGVyLmgiCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvdXVpZC5oIgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpPSzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXN0YXR1c190IFNjYW5GaWx0ZXI6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihTdHJpbmc4KGRldmljZV9uYW1lXy5jX3N0cigpKSkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihTdHJpbmc4KGRldmljZV9hZGRyZXNzXy5jX3N0cigpKSkpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIC8vIFRPRE8oanBhd2xvd3NraSkgbWFrZSB0eXBlIGNhc3RpbmcgbmljZXIKLSAgLy8gdXVpZCB3b24ndCByZWFsbHkga2VlcCBvd25lcnNoaXAsIGl0J3MganVzdCBmb3IgdHlwZSBjYXN0aW5nCi0gIHN0ZDo6b3B0aW9uYWw8VVVJRD4gdXVpZDsKLQotICBpZiAoc2VydmljZV91dWlkXykgewotICAgIHV1aWQgPSAqc2VydmljZV91dWlkXzsKLSAgfQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlTnVsbGFibGVQYXJjZWxhYmxlKHV1aWQpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHV1aWQucmVzZXQoKTsKLSAgaWYgKHNlcnZpY2VfdXVpZF9tYXNrXykgewotICAgIHV1aWQgPSAqc2VydmljZV91dWlkX21hc2tfOwotICB9Ci0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVOdWxsYWJsZVBhcmNlbGFibGUodXVpZCk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFNjYW5GaWx0ZXI6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIFN0cmluZzE2IG5hbWU7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZuYW1lKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgZGV2aWNlX25hbWVfID0gc3RkOjpzdHJpbmcoU3RyaW5nOChuYW1lKS5zdHJpbmcoKSk7Ci0KLSAgU3RyaW5nMTYgYWRkcjsKLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmFkZHIpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBkZXZpY2VfYWRkcmVzc18gPSBzdGQ6OnN0cmluZyhTdHJpbmc4KGFkZHIpLnN0cmluZygpKTsKLQotICBVVUlEIHV1aWQ7Ci0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUoJnV1aWQpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBzZXJ2aWNlX3V1aWRfLnJlc2V0KG5ldyA6OmJsdWV0b290aDo6VXVpZCh1dWlkLnV1aWQpKTsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZ1dWlkKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgc2VydmljZV91dWlkX21hc2tfLnJlc2V0KG5ldyA6OmJsdWV0b290aDo6VXVpZCh1dWlkLnV1aWQpKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuaCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3NjYW5fZmlsdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZjM0YTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJsdWV0b290aC9zY2FuX2ZpbHRlci5oIgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIFNjYW5GaWx0ZXIgOiBwdWJsaWMgUGFyY2VsYWJsZSwgcHVibGljIDo6Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyIHsKLSBwdWJsaWM6Ci0gIFNjYW5GaWx0ZXIoKSA9IGRlZmF1bHQ7Ci0gIC8vIE5PTElOVCwgaW1wbGljaXQgY29udmVydGVyCi0gIFNjYW5GaWx0ZXIoY29uc3QgOjpibHVldG9vdGg6OlNjYW5GaWx0ZXImIHNjYW5fZmlsdGVyKSAgLy8gTk9MSU5UCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyKHNjYW5fZmlsdGVyKXt9OwotICB+U2NhbkZpbHRlcigpID0gZGVmYXVsdDsKLQotICAvLyBXcml0ZSB8dGhpc3wgcGFyY2VsYWJsZSB0byB0aGUgZ2l2ZW4gfHBhcmNlbHwuICBLZWVwIGluIG1pbmQgdGhhdAotICAvLyBpbXBsZW1lbnRhdGlvbnMgb2Ygd3JpdGVUb1BhcmNlbCBtdXN0IGJlIG1hbnVhbGx5IGtlcHQgaW4gc3luYwotICAvLyB3aXRoIHJlYWRGcm9tUGFyY2VsIGFuZCB0aGUgSmF2YSBlcXVpdmFsZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBSZWFkIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gfHBhcmNlbHwgaW50byB8dGhpc3wuICBBZnRlciByZWFkRnJvbVBhcmNlbAotICAvLyBjb21wbGV0ZXMsIHx0aGlzfCBzaG91bGQgaGF2ZSBlcXVpdmFsZW50IHN0YXRlIHRvIHRoZSBvYmplY3QgdGhhdAotICAvLyB3cm90ZSBpdHNlbGYgdG8gdGhlIHBhcmNlbC4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuY2MgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9zY2FuX3Jlc3VsdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5M2VhZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9zY2FuX3Jlc3VsdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6T0s7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0dXNfdCBTY2FuUmVzdWx0Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoU3RyaW5nOChkZXZpY2VfYWRkcmVzc18uY19zdHIoKSkpKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlQnl0ZVZlY3RvcihzY2FuX3JlY29yZF8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihyc3NpXyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFNjYW5SZXN1bHQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gIFN0cmluZzE2IGFkZHI7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZhZGRyKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgZGV2aWNlX2FkZHJlc3NfID0gc3RkOjpzdHJpbmcoU3RyaW5nOChhZGRyKS5zdHJpbmcoKSk7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkQnl0ZVZlY3Rvcigmc2Nhbl9yZWNvcmRfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmcnNzaV8pOwotICByZXR1cm4gc3RhdHVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuaCBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3NjYW5fcmVzdWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNThiM2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImJsdWV0b290aC9zY2FuX3Jlc3VsdC5oIgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIFNjYW5SZXN1bHQgOiBwdWJsaWMgUGFyY2VsYWJsZSwgcHVibGljIDo6Ymx1ZXRvb3RoOjpTY2FuUmVzdWx0IHsKLSBwdWJsaWM6Ci0gIFNjYW5SZXN1bHQoKSA9IGRlZmF1bHQ7Ci0gIC8vIE5PTElOVCwgaW1wbGljaXQgY29udmVydGVyCi0gIFNjYW5SZXN1bHQoY29uc3QgOjpibHVldG9vdGg6OlNjYW5SZXN1bHQmIHNjYW5fcmVzdWx0KSAgLy8gTk9MSU5UCi0gICAgICA6IDo6Ymx1ZXRvb3RoOjpTY2FuUmVzdWx0KHNjYW5fcmVzdWx0KXt9OwotICB+U2NhblJlc3VsdCgpID0gZGVmYXVsdDsKLQotICAvLyBXcml0ZSB8dGhpc3wgcGFyY2VsYWJsZSB0byB0aGUgZ2l2ZW4gfHBhcmNlbHwuICBLZWVwIGluIG1pbmQgdGhhdAotICAvLyBpbXBsZW1lbnRhdGlvbnMgb2Ygd3JpdGVUb1BhcmNlbCBtdXN0IGJlIG1hbnVhbGx5IGtlcHQgaW4gc3luYwotICAvLyB3aXRoIHJlYWRGcm9tUGFyY2VsIGFuZCB0aGUgSmF2YSBlcXVpdmFsZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBSZWFkIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gfHBhcmNlbHwgaW50byB8dGhpc3wuICBBZnRlciByZWFkRnJvbVBhcmNlbAotICAvLyBjb21wbGV0ZXMsIHx0aGlzfCBzaG91bGQgaGF2ZSBlcXVpdmFsZW50IHN0YXRlIHRvIHRoZSBvYmplY3QgdGhhdAotICAvLyB3cm90ZSBpdHNlbGYgdG8gdGhlIHBhcmNlbC4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbmRyb2lkOjpPSyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCi0gIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5jYyBiL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNDZjNDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5jYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTYgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5oIgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6Ok9LOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RhdHVzX3QgU2NhblNldHRpbmdzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtb2RlXyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGNhbGxiYWNrX3R5cGVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIocmVzdWx0X3R5cGVfKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50NjQocmVwb3J0X2RlbGF5X21zXy5Jbk1pbGxpc2Vjb25kcygpKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobWF0Y2hfbW9kZV8pOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtYXRjaF9jb3VudF9wZXJfZmlsdGVyXyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFNjYW5TZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgaW50IHZhbHVlOwotICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBtb2RlXyA9IHN0YXRpY19jYXN0PFNjYW5TZXR0aW5nczo6TW9kZT4odmFsdWUpOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIGNhbGxiYWNrX3R5cGVfID0gc3RhdGljX2Nhc3Q8U2NhblNldHRpbmdzOjpDYWxsYmFja1R5cGU+KHZhbHVlKTsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICByZXN1bHRfdHlwZV8gPSBzdGF0aWNfY2FzdDxTY2FuU2V0dGluZ3M6OlJlc3VsdFR5cGU+KHZhbHVlKTsKLQotICBpbnQ2NF90IHZhbHVlNjQ7Ci0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDY0KCZ2YWx1ZTY0KTsKLSAgcmVwb3J0X2RlbGF5X21zXyA9IDo6YmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKHZhbHVlNjQpOwotCi0gIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gIG1hdGNoX21vZGVfID0gc3RhdGljX2Nhc3Q8U2NhblNldHRpbmdzOjpNYXRjaE1vZGU+KHZhbHVlKTsKLQotICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICBtYXRjaF9jb3VudF9wZXJfZmlsdGVyXyA9IHN0YXRpY19jYXN0PFNjYW5TZXR0aW5nczo6TWF0Y2hDb3VudD4odmFsdWUpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9zY2FuX3NldHRpbmdzLmggYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9zY2FuX3NldHRpbmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWY5ZWUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBTY2FuU2V0dGluZ3MgOiBwdWJsaWMgUGFyY2VsYWJsZSwgcHVibGljIDo6Ymx1ZXRvb3RoOjpTY2FuU2V0dGluZ3MgewotIHB1YmxpYzoKLSAgU2NhblNldHRpbmdzKCkgPSBkZWZhdWx0OwotICAvLyBOT0xJTlQsIGltcGxpY2l0IGNvbnZlcnRlcgotICBTY2FuU2V0dGluZ3MoY29uc3QgOjpibHVldG9vdGg6OlNjYW5TZXR0aW5ncyYgc2Nhbl9zZXR0aW5ncykgIC8vIE5PTElOVAotICAgICAgOiA6OmJsdWV0b290aDo6U2NhblNldHRpbmdzKHNjYW5fc2V0dGluZ3Mpe307Ci0gIH5TY2FuU2V0dGluZ3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3V1aWQuY2MgYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC91dWlkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzdkZDJiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3V1aWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL3V1aWQuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpPSzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLXN0YXR1c190IFVVSUQ6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgLy8gVGhlIHNjaGVtZSB1c2VkIGJ5IGFuZHJvaWQub3MuUGFyY2VsVXVpZCBpcyB0byB3cm90ZSB0aGUgbW9zdCBzaWduaWZpY2FudAotICAvLyBiaXRzIGZpcnN0IGFzIG9uZSA2NC1iaXQgaW50ZWdlciwgZm9sbG93ZWQgYnkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgaW4KLSAgLy8gYSBzZWNvbmQgNjQtYml0IGludGVnZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgd3JpdGluZyB0aGUgcmF3LWJ5dGVzIGluCi0gIC8vIHNlcXVlbmNlLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBhc3N1bWUgYW55IGhvc3QtZW5kaWFubmVzcyBoZXJlLiBTbyBmb2xsb3cKLSAgLy8gdGhlIHNhbWUgc2NoZW1lIGFuZCB1c2UgdGhlIHNhbWUgUGFyY2VsIEFQSXMuCi0gIDo6Ymx1ZXRvb3RoOjpVdWlkOjpVVUlEMTI4Qml0IGJ5dGVzID0gdXVpZC5UbzEyOEJpdEJFKCk7Ci0KLSAgdWludDY0X3QgbW9zdF9zaWdfYml0cyA9Ci0gICAgICAoKCgodWludDY0X3QpYnl0ZXNbMF0pIDw8IDU2KSB8ICgoKHVpbnQ2NF90KWJ5dGVzWzFdKSA8PCA0OCkgfAotICAgICAgICgoKHVpbnQ2NF90KWJ5dGVzWzJdKSA8PCA0MCkgfCAoKCh1aW50NjRfdClieXRlc1szXSkgPDwgMzIpIHwKLSAgICAgICAoKCh1aW50NjRfdClieXRlc1s0XSkgPDwgMjQpIHwgKCgodWludDY0X3QpYnl0ZXNbNV0pIDw8IDE2KSB8Ci0gICAgICAgKCgodWludDY0X3QpYnl0ZXNbNl0pIDw8IDgpIHwgYnl0ZXNbN10pOwotCi0gIHVpbnQ2NF90IGxlYXN0X3NpZ19iaXRzID0KLSAgICAgICgoKCh1aW50NjRfdClieXRlc1s4XSkgPDwgNTYpIHwgKCgodWludDY0X3QpYnl0ZXNbOV0pIDw8IDQ4KSB8Ci0gICAgICAgKCgodWludDY0X3QpYnl0ZXNbMTBdKSA8PCA0MCkgfCAoKCh1aW50NjRfdClieXRlc1sxMV0pIDw8IDMyKSB8Ci0gICAgICAgKCgodWludDY0X3QpYnl0ZXNbMTJdKSA8PCAyNCkgfCAoKCh1aW50NjRfdClieXRlc1sxM10pIDw8IDE2KSB8Ci0gICAgICAgKCgodWludDY0X3QpYnl0ZXNbMTRdKSA8PCA4KSB8IGJ5dGVzWzE1XSk7Ci0KLSAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQ2NChtb3N0X3NpZ19iaXRzKTsKLSAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLQotICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDY0KGxlYXN0X3NpZ19iaXRzKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgVVVJRDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgOjpibHVldG9vdGg6OlV1aWQ6OlVVSUQxMjhCaXQgYnl0ZXM7Ci0KLSAgdWludDY0X3QgbW9zdF9zaWdfYml0cywgbGVhc3Rfc2lnX2JpdHM7Ci0gIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQ2NCgmbW9zdF9zaWdfYml0cyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDY0KCZsZWFzdF9zaWdfYml0cyk7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0KLSAgYnl0ZXNbMF0gPSAobW9zdF9zaWdfYml0cyA+PiA1NikgJiAweEZGOwotICBieXRlc1sxXSA9IChtb3N0X3NpZ19iaXRzID4+IDQ4KSAmIDB4RkY7Ci0gIGJ5dGVzWzJdID0gKG1vc3Rfc2lnX2JpdHMgPj4gNDApICYgMHhGRjsKLSAgYnl0ZXNbM10gPSAobW9zdF9zaWdfYml0cyA+PiAzMikgJiAweEZGOwotICBieXRlc1s0XSA9IChtb3N0X3NpZ19iaXRzID4+IDI0KSAmIDB4RkY7Ci0gIGJ5dGVzWzVdID0gKG1vc3Rfc2lnX2JpdHMgPj4gMTYpICYgMHhGRjsKLSAgYnl0ZXNbNl0gPSAobW9zdF9zaWdfYml0cyA+PiA4KSAmIDB4RkY7Ci0gIGJ5dGVzWzddID0gbW9zdF9zaWdfYml0cyAmIDB4RkY7Ci0KLSAgYnl0ZXNbOF0gPSAobGVhc3Rfc2lnX2JpdHMgPj4gNTYpICYgMHhGRjsKLSAgYnl0ZXNbOV0gPSAobGVhc3Rfc2lnX2JpdHMgPj4gNDgpICYgMHhGRjsKLSAgYnl0ZXNbMTBdID0gKGxlYXN0X3NpZ19iaXRzID4+IDQwKSAmIDB4RkY7Ci0gIGJ5dGVzWzExXSA9IChsZWFzdF9zaWdfYml0cyA+PiAzMikgJiAweEZGOwotICBieXRlc1sxMl0gPSAobGVhc3Rfc2lnX2JpdHMgPj4gMjQpICYgMHhGRjsKLSAgYnl0ZXNbMTNdID0gKGxlYXN0X3NpZ19iaXRzID4+IDE2KSAmIDB4RkY7Ci0gIGJ5dGVzWzE0XSA9IChsZWFzdF9zaWdfYml0cyA+PiA4KSAmIDB4RkY7Ci0gIGJ5dGVzWzE1XSA9IGxlYXN0X3NpZ19iaXRzICYgMHhGRjsKLQotICB1dWlkID0gOjpibHVldG9vdGg6OlV1aWQ6OkZyb20xMjhCaXRCRShieXRlcyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC91dWlkLmggYi9zZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC91dWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODRkMTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvdXVpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL3V1aWQuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotCi11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBVVUlEIDogcHVibGljIFBhcmNlbGFibGUgewotIHB1YmxpYzoKLSAgVVVJRCgpID0gZGVmYXVsdDsKLSAgLy8gTk9MSU5ULCBpbXBsaWNpdCBjb252ZXJ0ZXIKLSAgVVVJRChjb25zdCA6OmJsdWV0b290aDo6VXVpZCYgdXVpZCkgOiB1dWlkKHV1aWQpe307ICAvLyBOT0xJTlQKLSAgflVVSUQoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gV3JpdGUgfHRoaXN8IHBhcmNlbGFibGUgdG8gdGhlIGdpdmVuIHxwYXJjZWx8LiAgS2VlcCBpbiBtaW5kIHRoYXQKLSAgLy8gaW1wbGVtZW50YXRpb25zIG9mIHdyaXRlVG9QYXJjZWwgbXVzdCBiZSBtYW51YWxseSBrZXB0IGluIHN5bmMKLSAgLy8gd2l0aCByZWFkRnJvbVBhcmNlbCBhbmQgdGhlIEphdmEgZXF1aXZhbGVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzLgotICAvLwotICAvLyBSZXR1cm5zIGFuZHJvaWQ6Ok9LIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KLSAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGdpdmVuIHxwYXJjZWx8IGludG8gfHRoaXN8LiAgQWZ0ZXIgcmVhZEZyb21QYXJjZWwKLSAgLy8gY29tcGxldGVzLCB8dGhpc3wgc2hvdWxkIGhhdmUgZXF1aXZhbGVudCBzdGF0ZSB0byB0aGUgb2JqZWN0IHRoYXQKLSAgLy8gd3JvdGUgaXRzZWxmIHRvIHRoZSBwYXJjZWwuCi0gIC8vCi0gIC8vIFJldHVybnMgYW5kcm9pZDo6T0sgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3Igb3RoZXJ3aXNlLgotICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KDo6Ymx1ZXRvb3RoOjpVdWlkIHJocykgY29uc3QgeyByZXR1cm4gdXVpZCA9PSByaHM7IH0KLQotICA6OmJsdWV0b290aDo6VXVpZCB1dWlkOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgOjpibHVldG9vdGg6OlV1aWQmIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpVVUlEJiByaHMpIHsKLSAgcmV0dXJuIGxocyA9PSByaHMudXVpZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZTViYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYTJkcF9jb2RlY19jb25maWcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJibHVldG9vdGgvYTJkcF9jb2RlY19jb25maWcuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLUEyZHBDb2RlY0NvbmZpZzo6QTJkcENvZGVjQ29uZmlnKCkgPSBkZWZhdWx0OwotQTJkcENvZGVjQ29uZmlnOjpBMmRwQ29kZWNDb25maWcoY29uc3QgQTJkcENvZGVjQ29uZmlnJiBvdGhlcikgPSBkZWZhdWx0OwotQTJkcENvZGVjQ29uZmlnOjpBMmRwQ29kZWNDb25maWcoaW50IGNvZGVjX3R5cGUsIGludCBjb2RlY19wcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwgaW50IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX21vZGUsIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNfc3BlY2lmaWNfNCkKLSAgICA6IGNvZGVjX3R5cGVfKGNvZGVjX3R5cGUpLAotICAgICAgY29kZWNfcHJpb3JpdHlfKGNvZGVjX3ByaW9yaXR5KSwKLSAgICAgIHNhbXBsZV9yYXRlXyhzYW1wbGVfcmF0ZSksCi0gICAgICBiaXRzX3Blcl9zYW1wbGVfKGJpdHNfcGVyX3NhbXBsZSksCi0gICAgICBjaGFubmVsX21vZGVfKGNoYW5uZWxfbW9kZSksCi0gICAgICBjb2RlY19zcGVjaWZpY18xXyhjb2RlY19zcGVjaWZpY18xKSwKLSAgICAgIGNvZGVjX3NwZWNpZmljXzJfKGNvZGVjX3NwZWNpZmljXzIpLAotICAgICAgY29kZWNfc3BlY2lmaWNfM18oY29kZWNfc3BlY2lmaWNfMyksCi0gICAgICBjb2RlY19zcGVjaWZpY180Xyhjb2RlY19zcGVjaWZpY180KSB7fQotCi1BMmRwQ29kZWNDb25maWc6On5BMmRwQ29kZWNDb25maWcoKSA9IGRlZmF1bHQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2EyZHBfY29kZWNfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZGJmY2IuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2EyZHBfY29kZWNfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIFNob3VsZCBtYXRjaCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgaW4gYnRfYXYuaAotY2xhc3MgQTJkcENvZGVjQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIEEyZHBDb2RlY0NvbmZpZygpOwotICBBMmRwQ29kZWNDb25maWcoY29uc3QgQTJkcENvZGVjQ29uZmlnJiBvdGhlcik7Ci0gIEEyZHBDb2RlY0NvbmZpZyhpbnQgY29kZWNfdHlwZSwgaW50IGNvZGVjX3ByaW9yaXR5LCBpbnQgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICBpbnQgYml0c19wZXJfc2FtcGxlLCBpbnQgY2hhbm5lbF9tb2RlLAotICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18xLCBpbnQ2NF90IGNvZGVjX3NwZWNpZmljXzIsCi0gICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvZGVjX3NwZWNpZmljXzMsIGludDY0X3QgY29kZWNfc3BlY2lmaWNfNCk7Ci0gIH5BMmRwQ29kZWNDb25maWcoKTsKLQotICBpbnQgY29kZWNfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGNvZGVjX3R5cGVfOyB9Ci0gIGludCBjb2RlY19wcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGNvZGVjX3ByaW9yaXR5XzsgfQotICBpbnQgc2FtcGxlX3JhdGUoKSBjb25zdCB7IHJldHVybiBzYW1wbGVfcmF0ZV87IH0KLSAgaW50IGJpdHNfcGVyX3NhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIGJpdHNfcGVyX3NhbXBsZV87IH0KLSAgaW50IGNoYW5uZWxfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGNoYW5uZWxfbW9kZV87IH0KLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18xKCkgY29uc3QgeyByZXR1cm4gY29kZWNfc3BlY2lmaWNfMV87IH0KLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18yKCkgY29uc3QgeyByZXR1cm4gY29kZWNfc3BlY2lmaWNfMl87IH0KLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18zKCkgY29uc3QgeyByZXR1cm4gY29kZWNfc3BlY2lmaWNfM187IH0KLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY180KCkgY29uc3QgeyByZXR1cm4gY29kZWNfc3BlY2lmaWNfNF87IH0KLQotIHByb3RlY3RlZDoKLSAgaW50IGNvZGVjX3R5cGVfID0gMDsKLSAgaW50IGNvZGVjX3ByaW9yaXR5XyA9IDA7Ci0gIGludCBzYW1wbGVfcmF0ZV8gPSAwOwotICBpbnQgYml0c19wZXJfc2FtcGxlXyA9IDA7Ci0gIGludCBjaGFubmVsX21vZGVfID0gMDsKLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18xXyA9IDA7Ci0gIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMl8gPSAwOwotICBpbnQ2NF90IGNvZGVjX3NwZWNpZmljXzNfID0gMDsKLSAgaW50NjRfdCBjb2RlY19zcGVjaWZpY180XyA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWRhcHRlcl9zdGF0ZS5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZGFwdGVyX3N0YXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg2NmQzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZGFwdGVyX3N0YXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJibHVldG9vdGgvYWRhcHRlcl9zdGF0ZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RkOjpzdHJpbmcgQWRhcHRlclN0YXRlVG9TdHJpbmcoQWRhcHRlclN0YXRlIHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBjYXNlIEFEQVBURVJfU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgcmV0dXJuICJBREFQVEVSX1NUQVRFX0RJU0NPTk5FQ1RFRCI7Ci0gICAgY2FzZSBBREFQVEVSX1NUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICByZXR1cm4gIkFEQVBURVJfU1RBVEVfQ09OTkVDVElORyI7Ci0gICAgY2FzZSBBREFQVEVSX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgIHJldHVybiAiQURBUFRFUl9TVEFURV9DT05ORUNURUQiOwotICAgIGNhc2UgQURBUFRFUl9TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgcmV0dXJuICJBREFQVEVSX1NUQVRFX0RJU0NPTk5FQ1RJTkciOwotICAgIGNhc2UgQURBUFRFUl9TVEFURV9PRkY6Ci0gICAgICByZXR1cm4gIkFEQVBURVJfU1RBVEVfT0ZGIjsKLSAgICBjYXNlIEFEQVBURVJfU1RBVEVfVFVSTklOR19PTjoKLSAgICAgIHJldHVybiAiQURBUFRFUl9TVEFURV9UVVJOSU5HX09OIjsKLSAgICBjYXNlIEFEQVBURVJfU1RBVEVfT046Ci0gICAgICByZXR1cm4gIkFEQVBURVJfU1RBVEVfT04iOwotICAgIGNhc2UgQURBUFRFUl9TVEFURV9UVVJOSU5HX09GRjoKLSAgICAgIHJldHVybiAiQURBUFRFUl9TVEFURV9UVVJOSU5HX09GRiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93biBzdGF0ZSI7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2FkYXB0ZXJfc3RhdGUuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZGFwdGVyX3N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODk3YWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2FkYXB0ZXJfc3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIFBvc3NpYmxlIEFkYXB0ZXIgc3RhdGVzLiBUaGUgdmFsdWVzIGZvciBlYWNoIGVudW1yYXRpb24gaGF2ZSBiZWVuIGNvcGllZAotLy8gZnJvbSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YS4KLS8vIFRoZXNlIHZhbHVlcyBuZWVkIHRvIG1hdGNoIHRoZWlyIGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXIKLS8vIGNvdW50ZXJwYXJ0cyBmb3IgdGhpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGZyYW1ld29yaywgaGVuY2Ugd2UKLS8vIHJlZGVjbGFyZSB0aGVtIGhlcmUuCi1lbnVtIEFkYXB0ZXJTdGF0ZSB7Ci0gIEFEQVBURVJfU1RBVEVfRElTQ09OTkVDVEVEID0gMCwKLSAgQURBUFRFUl9TVEFURV9DT05ORUNUSU5HID0gMSwKLSAgQURBUFRFUl9TVEFURV9DT05ORUNURUQgPSAyLAotICBBREFQVEVSX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzLAotICBBREFQVEVSX1NUQVRFX09GRiA9IDEwLAotICBBREFQVEVSX1NUQVRFX1RVUk5JTkdfT04gPSAxMSwKLSAgQURBUFRFUl9TVEFURV9PTiA9IDEyLAotICBBREFQVEVSX1NUQVRFX1RVUk5JTkdfT0ZGID0gMTMsCi0gIEFEQVBURVJfU1RBVEVfSU5WQUxJRCA9IDB4RkZGRgotfTsKLQotLy8gUmV0dXJucyBhIHN0cmluZyBmb3IgdGhlIGdpdmVuIEFkYXB0ZXIgc3RhdGUgfHN0YXRlfC4KLXN0ZDo6c3RyaW5nIEFkYXB0ZXJTdGF0ZVRvU3RyaW5nKEFkYXB0ZXJTdGF0ZSBzdGF0ZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiM2MyZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImJsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lkZWZzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1BZHZlcnRpc2VEYXRhOjpBZHZlcnRpc2VEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSA6IGRhdGFfKGRhdGEpIHt9Ci0KLUFkdmVydGlzZURhdGE6OkFkdmVydGlzZURhdGEoKSB7fQotCi1BZHZlcnRpc2VEYXRhOjpBZHZlcnRpc2VEYXRhKGNvbnN0IEFkdmVydGlzZURhdGEmIG90aGVyKSA6IGRhdGFfKG90aGVyLmRhdGFfKSB7fQotCi1ib29sIEFkdmVydGlzZURhdGE6OklzVmFsaWQoKSBjb25zdCB7Ci0gIHNpemVfdCBsZW4gPSBkYXRhXy5zaXplKCk7Ci0KLSAgLy8gQ29uc2lkZXIgZW1wdHkgZGF0YSBhcyB2YWxpZC4KLSAgaWYgKCFsZW4pIHJldHVybiB0cnVlOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwLCBmaWVsZF9sZW4gPSAwOyBpIDwgbGVuOyBpICs9IChmaWVsZF9sZW4gKyAxKSkgewotICAgIGZpZWxkX2xlbiA9IGRhdGFfW2ldOwotCi0gICAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBmaWVsZCB3b3VsZCBleGNlZWQgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoLAotICAgIC8vIHRoZW4gdGhlIGRhdGEgaXMgYmFkbHkgZm9ybWF0dGVkLgotICAgIGlmIChpICsgZmllbGRfbGVuID49IGxlbikgewotICAgICAgVkxPRygxKSA8PCAiQWR2ZXJ0aXNpbmcgZGF0YSBiYWRseSBmb3JtYXR0ZWQiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIEEgZmllbGQgbGVuZ3RoIG9mIDAgd291bGQgYmUgaW52YWxpZCBhcyBpdCBzaG91bGQgYXQgbGVhc3QgY29udGFpbiB0aGUKLSAgICAvLyBFSVIgZmllbGQgdHlwZS4KLSAgICBpZiAoZmllbGRfbGVuIDwgMSkgcmV0dXJuIGZhbHNlOwotCi0gICAgdWludDhfdCB0eXBlID0gZGF0YV9baSArIDFdOwotCi0gICAgLy8gQ2xpZW50cyBhcmUgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgRUlSIGZpZWxkcyBhcyB0aGVzZSBhcmUKLSAgICAvLyBtYW5hZ2VkIGJ5IHN0YWNrLgotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBIQ0lfRUlSX0ZMQUdTX1RZUEU6Ci0gICAgICBjYXNlIEhDSV9FSVJfT09CX0JEX0FERFJfVFlQRToKLSAgICAgIGNhc2UgSENJX0VJUl9PT0JfQ09EX1RZUEU6Ci0gICAgICBjYXNlIEhDSV9FSVJfT09CX1NTUF9IQVNIX0NfVFlQRToKLSAgICAgIGNhc2UgSENJX0VJUl9PT0JfU1NQX1JBTkRfUl9UWVBFOgotICAgICAgICBWTE9HKDEpIDw8ICJDYW5ub3Qgc2V0IEVJUiBmaWVsZCB0eXBlOiAiIDw8IHR5cGU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEFkdmVydGlzZURhdGE6Om9wZXJhdG9yPT0oY29uc3QgQWR2ZXJ0aXNlRGF0YSYgcmhzKSBjb25zdCB7Ci0gIHJldHVybiBkYXRhXyA9PSByaHMuZGF0YV87Ci19Ci0KLUFkdmVydGlzZURhdGEmIEFkdmVydGlzZURhdGE6Om9wZXJhdG9yPShjb25zdCBBZHZlcnRpc2VEYXRhJiBvdGhlcikgewotICBpZiAodGhpcyA9PSAmb3RoZXIpIHJldHVybiAqdGhpczsKLQotICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTgzZWUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2FkdmVydGlzZV9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBSZXByZXNlbnRzIGEgZGF0YSBwYWNrZXQgZm9yIEJsdWV0b290aCBMb3cgRW5lcmd5IGFkdmVydGlzZW1lbnRzLiBUaGlzIGlzIHRoZQotLy8gbmF0aXZlIGVxdWl2YWxlbnQgb2YgdGhlIEFuZHJvaWQgZnJhbWV3b3JrIGNsYXNzIGRlZmluZWQgaW4KLS8vIGZyYW1ld29ya3MvYmFzZS9jb3JlL2ovYW5kcm9pZC9ibHVldG9vdGgvbGUvQWR2ZXJ0aXNlRGF0YS5qYXZhCi1jbGFzcyBBZHZlcnRpc2VEYXRhIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gQWR2ZXJ0aXNlRGF0YSB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiB8ZGF0YXwgY2FuIG9ubHkKLSAgLy8gY29udGFpbiB0aGUgIlNlcnZpY2UgVXVpZHMiLCAiU2VydmljZSBEYXRhIiwgIk1hbnVmYWN0dXJlciBEYXRhIiwKLSAgLy8gIlR4IFBvd2VyIiBhbmQgIkRldmljZSBuYW1lIiBmaWVsZHMgYXMgc3BlY2lmaWVkIGluIHRoZSBDb3JlIFNwZWNpZmljYXRpb24KLSAgLy8gIFN1cHBsZW1lbnQuIHxkYXRhfCBtdXN0IGJlIHByb3Blcmx5IGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHN1cHBsZW1lbnQKLSAgLy8gYW5kIGNvbnRhaW5zIHRoZSBkYXRhIGFzIGl0IHdpbGwgYmUgc2VudCBvdmVyIHRoZSB3aXJlLgotICAvLwotICAvLyBUeCBQb3dlciBmaWVsZCB2YWx1ZSB3aWxsIGJlIGZpbGxlZCB3aXRoIHByb3BlciB2YWx1ZS4KLSAgZXhwbGljaXQgQWR2ZXJ0aXNlRGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSk7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBhbGwgZmllbGRzIHRvIGJlIGVtcHR5L2ZhbHNlLgotICBBZHZlcnRpc2VEYXRhKCk7Ci0gIEFkdmVydGlzZURhdGEoY29uc3QgQWR2ZXJ0aXNlRGF0YSYgb3RoZXIpOwotICB2aXJ0dWFsIH5BZHZlcnRpc2VEYXRhKCkgPSBkZWZhdWx0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWR2ZXJ0aXNpbmcgZGF0YSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5IGFjY29yZGluZyB0bwotICAvLyB0aGUgVExWIGZvcm1hdC4KLSAgYm9vbCBJc1ZhbGlkKCkgY29uc3Q7Ci0KLSAgLy8gZGF0YSgpIHJldHVybnMgdGhlIGN1cnJlbnQgYWR2ZXJ0aXNpbmcgZGF0YSBjb250YWluZWQgYnkgdGhpcyBpbnN0YW5jZS4gVGhlCi0gIC8vIGRhdGEgaXMgaW4gdGhlIFRMViBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHRoZSBCbHVldG9vdGggQ29yZSBTcGVjaWZpY2F0aW9uLgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9Ci0KLSAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvci4KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFkdmVydGlzZURhdGEmIHJocykgY29uc3Q7Ci0KLSAgLy8gQXNzaWdubWVudCBvcGVyYXRvcgotICBBZHZlcnRpc2VEYXRhJiBvcGVyYXRvcj0oY29uc3QgQWR2ZXJ0aXNlRGF0YSYgb3RoZXIpOwotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuY2MgYi9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWNjN2I0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImJsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLUFkdmVydGlzZVNldHRpbmdzOjpBZHZlcnRpc2VTZXR0aW5ncyhNb2RlIG1vZGUsIGJhc2U6OlRpbWVEZWx0YSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UG93ZXJMZXZlbCB0eF9wb3dlcl9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RhYmxlKQotICAgIDogbW9kZV8obW9kZSksCi0gICAgICB0aW1lb3V0Xyh0aW1lb3V0KSwKLSAgICAgIHR4X3Bvd2VyX2xldmVsXyh0eF9wb3dlcl9sZXZlbCksCi0gICAgICBjb25uZWN0YWJsZV8oY29ubmVjdGFibGUpIHt9Ci0KLS8vIERlZmF1bHQgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIHRoZSBBZHZlcnRpc2VTZXR0aW5ncy5qYXZhCi1BZHZlcnRpc2VTZXR0aW5nczo6QWR2ZXJ0aXNlU2V0dGluZ3MoKQotICAgIDogbW9kZV8oTU9ERV9MT1dfUE9XRVIpLAotICAgICAgdHhfcG93ZXJfbGV2ZWxfKFRYX1BPV0VSX0xFVkVMX01FRElVTSksCi0gICAgICBjb25uZWN0YWJsZV8odHJ1ZSkge30KLQotYm9vbCBBZHZlcnRpc2VTZXR0aW5nczo6b3BlcmF0b3I9PShjb25zdCBBZHZlcnRpc2VTZXR0aW5ncyYgcmhzKSBjb25zdCB7Ci0gIGlmIChtb2RlXyAhPSByaHMubW9kZV8pIHJldHVybiBmYWxzZTsKLQotICBpZiAodGltZW91dF8gIT0gcmhzLnRpbWVvdXRfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR4X3Bvd2VyX2xldmVsXyAhPSByaHMudHhfcG93ZXJfbGV2ZWxfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvbm5lY3RhYmxlXyAhPSByaHMuY29ubmVjdGFibGVfKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmZjRjOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJhc2UvdGltZS90aW1lLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBBZHZlcnRpc2VTZXR0aW5ncyBwcm92aWRlcyBhIHdheSB0byBhZGp1c3QgYWR2ZXJ0aXNpbmcgcHJlZmVyZW5jZXMgZm9yIGVhY2gKLS8vIEJsdWV0b290aCBMRSBhZHZlcnRpc2VtZW50IGluc3RhbmNlLiBUaGlzIGlzIHRoZSBuYXRpdmUgZXF1aXZhbGVudCBvZiB0aGUKLS8vIEFuZHJvaWQgZnJhbWV3b3JrIGNsYXNzIGRlZmluZWQgaW4KLS8vIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvbGUvQWR2ZXJ0aXNlU2V0dGluZ3MuamF2YQotY2xhc3MgQWR2ZXJ0aXNlU2V0dGluZ3MgewotIHB1YmxpYzoKLSAgLy8gQWR2ZXJ0aXNpbmcgbW9kZSBkZXNjcmliZXMgcG93ZXIgY29uc3VtcHRpb24gbW9kZSB1c2VkIGZvciBhZHZlcnRpc2luZy4KLSAgZW51bSBNb2RlIHsKLSAgICAvLyBQZXJmb3JtIEJsdWV0b290aCBMRSBhZHZlcnRpc2luZyBpbiBsb3cgcG93ZXIgbW9kZS4gVGhpcyBpcyB0aGUgZGVmYXVsdAotICAgIC8vIGFuZCBwcmVmZXJyZWQgYWR2ZXJ0aXNpbmcgbW9kZSBhcyBpdCBjb25zdW1lcyB0aGUgbGVhc3QgcG93ZXIuCi0gICAgTU9ERV9MT1dfUE9XRVIgPSAweDAwLAotCi0gICAgLy8gUGVyZm9ybSBCbHVldG9vdGggTEUgYWR2ZXJ0aXNpbmcgaW4gYmFsYW5jZWQgcG93ZXIgbW9kZS4gVGhpcyBpcyBiYWxhbmNlZAotICAgIC8vIGJldHdlZW4gYWR2ZXJ0aXNpbmcgZnJlcXVlbmN5IGFuZCBwb3dlciBjb25zdW1wdGlvbi4KLSAgICBNT0RFX0JBTEFOQ0VEID0gMHgwMSwKLQotICAgIC8vIFBlcmZvcm0gQmx1ZXRvb3RoIExFIGFkdmVydGlzaW5nIGluIGxvdyBsYXRlbmN5LCBoaWdoIHBvd2VyIG1vZGUuIFRoaXMKLSAgICAvLyBoYXMgdGhlIGhpZ2hlc3QgcG93ZXIgY29uc3VtcHRpb24gYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgY29udGludW91cwotICAgIC8vIGJhY2tncm91bmQgYWR2ZXJ0aXNpbmcuCi0gICAgTU9ERV9MT1dfTEFURU5DWSA9IDB4MDIsCi0gIH07Ci0KLSAgLy8gTGV2ZWxzIHRoYXQgY2FuIGJlIHNldCBmb3IgYWR2ZXJ0aXNpbmcgdHJhbnNtaXNzaW9uIHBvd2VyLgotICBlbnVtIFR4UG93ZXJMZXZlbCB7Ci0gICAgLy8gQWR2ZXJ0aXNlIHVzaW5nIHRoZSBsb3dlc3QgdHJhbnNtaXNzaW9uIChUWCkgcG93ZXIgbGV2ZWwuIExvdwotICAgIC8vIHRyYW5zbWlzc2lvbiBwb3dlciBjYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUgdmlzaWJpbGl0eSByYW5nZSBvZgotICAgIC8vIGFkdmVydGlzaW5nIHBhY2tldHMuCi0gICAgVFhfUE9XRVJfTEVWRUxfVUxUUkFfTE9XID0gMHgwMCwKLQotICAgIC8vIEFkdmVydGlzZSB1c2luZyBsb3cgVFggcG93ZXIgbGV2ZWwuCi0gICAgVFhfUE9XRVJfTEVWRUxfTE9XID0gMHgwMSwKLQotICAgIC8vIEFkdmVydGlzZSB1c2luZyBtZWRpdW0gVFggcG93ZXIgbGV2ZWwuCi0gICAgVFhfUE9XRVJfTEVWRUxfTUVESVVNID0gMHgwMiwKLQotICAgIC8vIEFkdmVydGlzZSB1c2luZyBoaWdoIFRYIHBvd2VyIGxldmVsLiBUaGlzIGNvcnJlc3BvbmRzIHRvIGxhcmdlc3QKLSAgICAvLyB2aXNpYmlsaXR5IHJhbmdlIG9mIHRoZSBhZHZlcnRpc2luZyBwYWNrZXQuCi0gICAgVFhfUE9XRVJfTEVWRUxfSElHSCA9IDB4MDMsCi0gIH07Ci0KLSAgQWR2ZXJ0aXNlU2V0dGluZ3MoTW9kZSBtb2RlLCBiYXNlOjpUaW1lRGVsdGEgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgVHhQb3dlckxldmVsIHR4X3Bvd2VyX2xldmVsLCBib29sIGNvbm5lY3RhYmxlKTsKLQotICAvLyBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHM6Ci0gIC8vICAgbW9kZTogTU9ERV9MT1dfUE9XRVIKLSAgLy8gICBUWCBwb3dlciBsZXZlbDogVFhfUE9XRVJfTEVWRUxfTUVESVVNCi0gIC8vICAgY29ubmVjdGFibGU6IHRydWUKLSAgQWR2ZXJ0aXNlU2V0dGluZ3MoKTsKLSAgdmlydHVhbCB+QWR2ZXJ0aXNlU2V0dGluZ3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gUmV0dXJucyB0aGUgYWR2ZXJ0aXNlIG1vZGUuCi0gIE1vZGUgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1vZGVfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgYWR2ZXJ0aXNpbmcgdGltZSBsaW1pdCBpbiBtaWxsaXNlY29uZHMuCi0gIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgdGltZW91dCgpIGNvbnN0IHsgcmV0dXJuIHRpbWVvdXRfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgVFggcG93ZXIgbGV2ZWwgZm9yIGFkdmVydGlzaW5nLgotICBUeFBvd2VyTGV2ZWwgdHhfcG93ZXJfbGV2ZWwoKSBjb25zdCB7IHJldHVybiB0eF9wb3dlcl9sZXZlbF87IH0KLQotICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGFkdmVydGlzZW1lbnQgd2lsbCBpbmRpY2F0ZSBjb25uZWN0YWJsZS4KLSAgYm9vbCBjb25uZWN0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3RhYmxlXzsgfQotCi0gIC8vIENvbXBhcmlzb24gb3BlcmF0b3IuCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBZHZlcnRpc2VTZXR0aW5ncyYgcmhzKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgTW9kZSBtb2RlXzsKLSAgYmFzZTo6VGltZURlbHRhIHRpbWVvdXRfOwotICBUeFBvd2VyTGV2ZWwgdHhfcG93ZXJfbGV2ZWxfOwotICBib29sIGNvbm5lY3RhYmxlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9pbnRfdmFsdWUuY2MgYi9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfaW50X3ZhbHVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWEwN2Q0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9pbnRfdmFsdWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJibHVldG9vdGgvYXZyY3BfaW50X3ZhbHVlLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1BdnJjcEludFZhbHVlOjpBdnJjcEludFZhbHVlKCkgPSBkZWZhdWx0OwotQXZyY3BJbnRWYWx1ZTo6QXZyY3BJbnRWYWx1ZShjb25zdCBBdnJjcEludFZhbHVlJiBvdGhlcikgPSBkZWZhdWx0OwotQXZyY3BJbnRWYWx1ZTo6QXZyY3BJbnRWYWx1ZShpbnQgaWQsIGludCB2YWx1ZSkgOiBpZF8oaWQpLCB2YWx1ZV8odmFsdWUpIHt9Ci1BdnJjcEludFZhbHVlOjp+QXZyY3BJbnRWYWx1ZSgpID0gZGVmYXVsdDsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX2ludF92YWx1ZS5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX2ludF92YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWNmNTEwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9pbnRfdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBBdnJjcEludFZhbHVlIHsKLSBwdWJsaWM6Ci0gIEF2cmNwSW50VmFsdWUoKTsKLSAgQXZyY3BJbnRWYWx1ZShjb25zdCBBdnJjcEludFZhbHVlJiBvdGhlcik7Ci0gIEF2cmNwSW50VmFsdWUoaW50IGlkLCBpbnQgdmFsdWUpOwotICB+QXZyY3BJbnRWYWx1ZSgpOwotCi0gIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIGlkXzsgfQotICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotIHByb3RlY3RlZDoKLSAgaW50IGlkXyA9IDA7Ci0gIGludCB2YWx1ZV8gPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX21lZGlhX2F0dHIuY2MgYi9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfbWVkaWFfYXR0ci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MDk1Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfbWVkaWFfYXR0ci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2F2cmNwX21lZGlhX2F0dHIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLUF2cmNwTWVkaWFBdHRyOjpBdnJjcE1lZGlhQXR0cigpID0gZGVmYXVsdDsKLUF2cmNwTWVkaWFBdHRyOjpBdnJjcE1lZGlhQXR0cihjb25zdCBBdnJjcE1lZGlhQXR0ciYgb3RoZXIpID0gZGVmYXVsdDsKLUF2cmNwTWVkaWFBdHRyOjpBdnJjcE1lZGlhQXR0cihjb25zdCBzdGQ6OnN0cmluZyYgdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFydGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWxidW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbnJlLCBpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fdHJhY2tzLCBpbnQgcGxheV90aW1lKQotICAgIDogdGl0bGVfKHRpdGxlKSwKLSAgICAgIGFydGlzdF8oYXJ0aXN0KSwKLSAgICAgIGFsYnVtXyhhbGJ1bSksCi0gICAgICBnZW5yZV8oZ2VucmUpLAotICAgICAgdHJhY2tfbnVtXyh0cmFja19udW0pLAotICAgICAgbnVtX3RyYWNrc18obnVtX3RyYWNrcyksCi0gICAgICBwbGF5X3RpbWVfKHBsYXlfdGltZSkge30KLQotQXZyY3BNZWRpYUF0dHI6On5BdnJjcE1lZGlhQXR0cigpID0gZGVmYXVsdDsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX21lZGlhX2F0dHIuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9tZWRpYV9hdHRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTdjZmQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX21lZGlhX2F0dHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBBdnJjcE1lZGlhQXR0ciB7Ci0gcHVibGljOgotICBBdnJjcE1lZGlhQXR0cigpOwotICBBdnJjcE1lZGlhQXR0cihjb25zdCBBdnJjcE1lZGlhQXR0ciYgb3RoZXIpOwotICBBdnJjcE1lZGlhQXR0cihjb25zdCBzdGQ6OnN0cmluZyYgdGl0bGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcnRpc3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbGJ1bSwgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbnJlLAotICAgICAgICAgICAgICAgICBpbnQgdHJhY2tfbnVtLCBpbnQgbnVtX3RyYWNrcywgaW50IHBsYXlfdGltZSk7Ci0gIH5BdnJjcE1lZGlhQXR0cigpOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aXRsZSgpIGNvbnN0IHsgcmV0dXJuIHRpdGxlXzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgYXJ0aXN0KCkgY29uc3QgeyByZXR1cm4gYXJ0aXN0XzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgYWxidW0oKSBjb25zdCB7IHJldHVybiBhbGJ1bV87IH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdlbnJlKCkgY29uc3QgeyByZXR1cm4gZ2VucmVfOyB9Ci0gIGludCB0cmFja19udW0oKSBjb25zdCB7IHJldHVybiB0cmFja19udW1fOyB9Ci0gIGludCBudW1fdHJhY2tzKCkgY29uc3QgeyByZXR1cm4gbnVtX3RyYWNrc187IH0KLSAgaW50IHBsYXlfdGltZSgpIGNvbnN0IHsgcmV0dXJuIHBsYXlfdGltZV87IH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgdGl0bGVfOwotICBzdGQ6OnN0cmluZyBhcnRpc3RfOwotICBzdGQ6OnN0cmluZyBhbGJ1bV87Ci0gIHN0ZDo6c3RyaW5nIGdlbnJlXzsKLSAgaW50IHRyYWNrX251bV8gPSAtMTsKLSAgaW50IG51bV90cmFja3NfID0gLTE7Ci0gIGludCBwbGF5X3RpbWVfID0gLTE7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmNjIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9yZXNwb25zZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwMGY3Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL2F2cmNwX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9yZXNwb25zZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlOjpBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UoKSA9Ci0gICAgZGVmYXVsdDsKLUF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZTo6QXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKAotICAgIGNvbnN0IEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSYgb3RoZXIpID0gZGVmYXVsdDsKLUF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZTo6QXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKAotICAgIGNvbnN0IGJ0cmNfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3QmIGRhdGEpCi0gICAgOiBkYXRhXyhkYXRhKSB7fQotQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlOjp+QXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKCkgPQotICAgIGRlZmF1bHQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9yZWdpc3Rlcl9ub3RpZmljYXRpb25fcmVzcG9uc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3OGRhMi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYXZyY3BfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3Jlc3BvbnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfY29tbW9uX3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfcmMuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSB7Ci0gcHVibGljOgotICBBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UoKTsKLSAgQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKAotICAgICAgY29uc3QgQXZyY3BSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlJiBvdGhlcik7Ci0gIEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZShjb25zdCBidHJjX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl90JiBkYXRhKTsKLSAgfkF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSgpOwotCi0gIGNvbnN0IGJ0cmNfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX3QmIGRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQotCi0gcHJvdGVjdGVkOgotICBidHJjX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl90IGRhdGFfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX3N0cmluZ192YWx1ZS5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2F2cmNwX3N0cmluZ192YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVjY2E0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hdnJjcF9zdHJpbmdfdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBBdnJjcFN0cmluZ1ZhbHVlIHsKLSBwdWJsaWM6Ci0gIEF2cmNwU3RyaW5nVmFsdWUoKSA9IGRlZmF1bHQ7Ci0gIEF2cmNwU3RyaW5nVmFsdWUoY29uc3QgQXZyY3BTdHJpbmdWYWx1ZSYgb3RoZXIpID0gZGVmYXVsdDsKLSAgQXZyY3BTdHJpbmdWYWx1ZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgOiBpZF8oaWQpLCB2YWx1ZV8odmFsdWUpe307Ci0gIH5BdnJjcFN0cmluZ1ZhbHVlKCkgPSBkZWZhdWx0OwotCi0gIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIGlkXzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotIHByb3RlY3RlZDoKLSAgaW50IGlkXyA9IDA7Ci0gIHN0ZDo6c3RyaW5nIHZhbHVlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9jaGFyYWN0ZXJpc3RpYy5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9jaGFyYWN0ZXJpc3RpYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkMDJiYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvY2hhcmFjdGVyaXN0aWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGJsdWV0b290aC9jaGFyYWN0ZXJpc3RpYy5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLUNoYXJhY3RlcmlzdGljOjpDaGFyYWN0ZXJpc3RpYyhjb25zdCBDaGFyYWN0ZXJpc3RpYyYgb3RoZXIpIHsKLSAgaGFuZGxlXyA9IG90aGVyLmhhbmRsZV87Ci0gIHV1aWRfID0gb3RoZXIudXVpZF87Ci0gIHByb3BlcnRpZXNfID0gb3RoZXIucHJvcGVydGllc187Ci0gIHBlcm1pc3Npb25zXyA9IG90aGVyLnBlcm1pc3Npb25zXzsKLSAgZGVzY3JpcHRvcnNfID0gb3RoZXIuZGVzY3JpcHRvcnNfOwotfQotCi1DaGFyYWN0ZXJpc3RpYyYgQ2hhcmFjdGVyaXN0aWM6Om9wZXJhdG9yPShjb25zdCBDaGFyYWN0ZXJpc3RpYyYgb3RoZXIpIHsKLSAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gKnRoaXM7Ci0KLSAgaGFuZGxlXyA9IG90aGVyLmhhbmRsZV87Ci0gIHV1aWRfID0gb3RoZXIudXVpZF87Ci0gIHByb3BlcnRpZXNfID0gb3RoZXIucHJvcGVydGllc187Ci0gIHBlcm1pc3Npb25zXyA9IG90aGVyLnBlcm1pc3Npb25zXzsKLSAgZGVzY3JpcHRvcnNfID0gb3RoZXIuZGVzY3JpcHRvcnNfOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotYm9vbCBDaGFyYWN0ZXJpc3RpYzo6RXF1YWxzKGNvbnN0IENoYXJhY3RlcmlzdGljJiBvdGhlcikgY29uc3QgewotICByZXR1cm4gaGFuZGxlXyA9PSBvdGhlci5oYW5kbGVfICYmIHV1aWRfID09IG90aGVyLnV1aWRfICYmCi0gICAgICAgICBwcm9wZXJ0aWVzXyA9PSBvdGhlci5wcm9wZXJ0aWVzXyAmJgotICAgICAgICAgcGVybWlzc2lvbnNfID09IG90aGVyLnBlcm1pc3Npb25zXyAmJgotICAgICAgICAgZGVzY3JpcHRvcnNfID09IG90aGVyLmRlc2NyaXB0b3JzXzsKLX0KLQotYm9vbCBDaGFyYWN0ZXJpc3RpYzo6b3BlcmF0b3I9PShjb25zdCBDaGFyYWN0ZXJpc3RpYyYgcmhzKSBjb25zdCB7Ci0gIHJldHVybiBFcXVhbHMocmhzKTsKLX0KLQotYm9vbCBDaGFyYWN0ZXJpc3RpYzo6b3BlcmF0b3IhPShjb25zdCBDaGFyYWN0ZXJpc3RpYyYgcmhzKSBjb25zdCB7Ci0gIHJldHVybiAhRXF1YWxzKHJocyk7Ci19Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvY2hhcmFjdGVyaXN0aWMuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9jaGFyYWN0ZXJpc3RpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjIyMWIzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9jaGFyYWN0ZXJpc3RpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLWNsYXNzIENoYXJhY3RlcmlzdGljIHsKLSBwdWJsaWM6Ci0gIENoYXJhY3RlcmlzdGljKCkgPSBkZWZhdWx0OwotICBDaGFyYWN0ZXJpc3RpYyhjb25zdCBDaGFyYWN0ZXJpc3RpYyYgb3RoZXIpOwotICBDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFV1aWQmIHV1aWQsIHVpbnQ4X3QgcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVybWlzc2lvbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERlc2NyaXB0b3I+JiBkZXNjcmlwdG9ycykKLSAgICAgIDogaGFuZGxlXyhoYW5kbGUpLAotICAgICAgICB1dWlkXyh1dWlkKSwKLSAgICAgICAgcHJvcGVydGllc18ocHJvcGVydGllcyksCi0gICAgICAgIHBlcm1pc3Npb25zXyhwZXJtaXNzaW9ucyksCi0gICAgICAgIGRlc2NyaXB0b3JzXyhkZXNjcmlwdG9ycyl7fTsKLSAgQ2hhcmFjdGVyaXN0aWMmIG9wZXJhdG9yPShjb25zdCBDaGFyYWN0ZXJpc3RpYyYgb3RoZXIpOwotICB2aXJ0dWFsIH5DaGFyYWN0ZXJpc3RpYygpID0gZGVmYXVsdDsKLQotICAvLyBDb21wYXJpc29uIGZ1bmN0aW9uIGFuZCBvcGVyYXRvci4KLSAgYm9vbCBFcXVhbHMoY29uc3QgQ2hhcmFjdGVyaXN0aWMmIG90aGVyKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENoYXJhY3RlcmlzdGljJiByaHMpIGNvbnN0OwotICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ2hhcmFjdGVyaXN0aWMmIHJocykgY29uc3Q7Ci0KLSAgdWludDE2X3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQotICBjb25zdCBVdWlkJiB1dWlkKCkgY29uc3QgeyByZXR1cm4gdXVpZF87IH0KLSAgdWludDhfdCBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gcHJvcGVydGllc187IH0KLSAgdWludDE2X3QgcGVybWlzc2lvbnMoKSBjb25zdCB7IHJldHVybiBwZXJtaXNzaW9uc187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvcj4mIGRlc2NyaXB0b3JzKCkgY29uc3QgeyByZXR1cm4gZGVzY3JpcHRvcnNfOyB9Ci0gIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3I+JiBkZXNjcmlwdG9ycygpIHsgcmV0dXJuIGRlc2NyaXB0b3JzXzsgfQotCi0gcHJvdGVjdGVkOgotICB1aW50MTZfdCBoYW5kbGVfOwotICBVdWlkIHV1aWRfOwotICB1aW50OF90IHByb3BlcnRpZXNfOwotICB1aW50MTZfdCBwZXJtaXNzaW9uc187Ci0gIHN0ZDo6dmVjdG9yPERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzXzsKLX07Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvZGVzY3JpcHRvci5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9kZXNjcmlwdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDM3Y2MzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9kZXNjcmlwdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxibHVldG9vdGgvZGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLURlc2NyaXB0b3I6OkRlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgb3RoZXIpIHsKLSAgaGFuZGxlXyA9IG90aGVyLmhhbmRsZV87Ci0gIHV1aWRfID0gb3RoZXIudXVpZF87Ci0gIHBlcm1pc3Npb25zXyA9IG90aGVyLnBlcm1pc3Npb25zXzsKLX0KLQotRGVzY3JpcHRvciYgRGVzY3JpcHRvcjo6b3BlcmF0b3I9KGNvbnN0IERlc2NyaXB0b3ImIG90aGVyKSB7Ci0gIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuICp0aGlzOwotCi0gIGhhbmRsZV8gPSBvdGhlci5oYW5kbGVfOwotICB1dWlkXyA9IG90aGVyLnV1aWRfOwotICBwZXJtaXNzaW9uc18gPSBvdGhlci5wZXJtaXNzaW9uc187Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIERlc2NyaXB0b3I6OkVxdWFscyhjb25zdCBEZXNjcmlwdG9yJiBvdGhlcikgY29uc3QgewotICByZXR1cm4gaGFuZGxlXyA9PSBvdGhlci5oYW5kbGVfICYmIHV1aWRfID09IG90aGVyLnV1aWRfICYmCi0gICAgICAgICBwZXJtaXNzaW9uc18gPT0gb3RoZXIucGVybWlzc2lvbnNfOwotfQotCi1ib29sIERlc2NyaXB0b3I6Om9wZXJhdG9yPT0oY29uc3QgRGVzY3JpcHRvciYgcmhzKSBjb25zdCB7IHJldHVybiBFcXVhbHMocmhzKTsgfQotCi1ib29sIERlc2NyaXB0b3I6Om9wZXJhdG9yIT0oY29uc3QgRGVzY3JpcHRvciYgcmhzKSBjb25zdCB7Ci0gIHJldHVybiAhRXF1YWxzKHJocyk7Ci19Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvZGVzY3JpcHRvci5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2Rlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzMzgyMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvZGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3V1aWQuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBEZXNjcmlwdG9yIHsKLSBwdWJsaWM6Ci0gIERlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7Ci0gIERlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgb3RoZXIpOwotICBEZXNjcmlwdG9yJiBvcGVyYXRvcj0oY29uc3QgRGVzY3JpcHRvciYgb3RoZXIpOwotICBEZXNjcmlwdG9yKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgVXVpZCYgdXVpZCwgdWludDE2X3QgcGVybWlzc2lvbnMpCi0gICAgICA6IGhhbmRsZV8oaGFuZGxlKSwgdXVpZF8odXVpZCksIHBlcm1pc3Npb25zXyhwZXJtaXNzaW9ucyl7fTsKLSAgdmlydHVhbCB+RGVzY3JpcHRvcigpID0gZGVmYXVsdDsKLQotICAvLyBDb21wYXJpc29uIGZ1bmN0aW9uIGFuZCBvcGVyYXRvci4KLSAgYm9vbCBFcXVhbHMoY29uc3QgRGVzY3JpcHRvciYgb3RoZXIpIGNvbnN0OwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVzY3JpcHRvciYgcmhzKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERlc2NyaXB0b3ImIHJocykgY29uc3Q7Ci0KLSAgdWludDE2X3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQotICB1aW50MTZfdCBwZXJtaXNzaW9ucygpIGNvbnN0IHsgcmV0dXJuIHBlcm1pc3Npb25zXzsgfQotICBjb25zdCBVdWlkJiB1dWlkKCkgY29uc3QgeyByZXR1cm4gdXVpZF87IH0KLQotIHByb3RlY3RlZDoKLSAgdWludDE2X3QgaGFuZGxlXzsKLSAgVXVpZCB1dWlkXzsKLSAgdWludDE2X3QgcGVybWlzc2lvbnNfOwotfTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9sb3dfZW5lcmd5X2NvbnN0YW50cy5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzBhZWUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBEZWZpbmVkIGhlcmUgYXJlIHZhcmlvdXMgc3RhdHVzIGNvZGVzIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gdGhlIHN0YWNrIGZvcgotLy8gQkxFIG9wZXJhdGlvbnMuCi1lbnVtIEJMRVN0YXR1cyB7Ci0gIEJMRV9TVEFUVVNfU1VDQ0VTUyA9IDAsCi0gIEJMRV9TVEFUVVNfQURWX0VSUk9SX0RBVEFfVE9PX0xBUkdFID0gMSwKLSAgQkxFX1NUQVRVU19BRFZfRVJST1JfVE9PX01BTllfQURWRVJUSVNFUlMgPSAyLAotICBCTEVfU1RBVFVTX0FEVl9FUlJPUl9BTFJFQURZX1NUQVJURUQgPSAzLAotICBCTEVfU1RBVFVTX0FEVl9FUlJPUl9GRUFUVVJFX1VOU1VQUE9SVEVEID0gNSwKLSAgQkxFX1NUQVRVU19GQUlMVVJFID0gMHgxMDEsCi19OwotCi1lbnVtIEdBVFRFcnJvciB7Ci0gIEdBVFRfRVJST1JfTk9ORSA9IDAsCi0gIEdBVFRfRVJST1JfSU5WQUxJRF9IQU5ETEUgPSAweDAxLAotICBHQVRUX0VSUk9SX1JFQURfTk9UX1BFUk1JVFRFRCA9IDB4MDIsCi0gIEdBVFRfRVJST1JfV1JJVEVfTk9UX1BFUk1JVFRFRCA9IDB4MDMsCi0gIEdBVFRfRVJST1JfSU5WQUxJRF9QRFUgPSAweDA0LAotICBHQVRUX0VSUk9SX0lOU1VGRklDSUVOVF9BVVRIRU4gPSAweDA1LAotICBHQVRUX0VSUk9SX1JFUVVFU1RfTk9UX1NVUFBPUlRFRCA9IDB4MDYsCi0gIEdBVFRfRVJST1JfSU5WQUxJRF9PRkZTRVQgPSAweDA3LAotICBHQVRUX0VSUk9SX0lOU1VGRklDSUVOVF9BVVRIT1IgPSAweDA4LAotICBHQVRUX0VSUk9SX1BSRVBfUVVFVUVfRlVMTCA9IDB4MDksCi0gIEdBVFRfRVJST1JfQVRUUklCVVRFX05PVF9GT1VORCA9IDB4MGEsCi0gIEdBVFRfRVJST1JfQVRUUklCVVRFX05PVF9MT05HID0gMHgwYiwKLSAgR0FUVF9FUlJPUl9JTlNVRkZJQ0lFTlRfS0VZX1NJWkUgPSAweDBjLAotICBHQVRUX0VSUk9SX0lOVkFMSURfQVRUUklCVVRFX0xFTkdUSCA9IDB4MGQsCi0gIEdBVFRfRVJST1JfVU5MSUtFTFkgPSAweDBlLAotICBHQVRUX0VSUk9SX0lOU1VGRklDSUVOVF9FTkNSID0gMHgwZiwKLSAgR0FUVF9FUlJPUl9VTlNVUFBPUlRFRF9HUlBfVFlQRSA9IDB4MTAsCi0gIEdBVFRfRVJST1JfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyA9IDB4MTEsCi0gIEdBVFRfRVJST1JfQ0NDRF9JTVBST1BFUkxZX0NPTkZJR1VSRUQgPSAweEZELAotICBHQVRUX0VSUk9SX1BST0NFRFVSRV9JTl9QUk9HUkVTUyA9IDB4RkUsCi0gIEdBVFRfRVJST1JfT1VUX09GX1JBTkdFID0gMHhGRgotfTsKLQotZW51bSBUcmFuc3BvcnQgeyBUUkFOU1BPUlRfQVVUTyA9IDAsIFRSQU5TUE9SVF9CUkVEUiA9IDEsIFRSQU5TUE9SVF9MRSA9IDIgfTsKLQotLy8gQW5kcm9pZCBhdHRyaWJ1dGUgcGVybWlzc2lvbiB2YWx1ZXMKLWNvbnN0IHVpbnQxNl90IGtBdHRyaWJ1dGVQZXJtaXNzaW9uTm9uZSA9IDB4MDsKLWNvbnN0IHVpbnQxNl90IGtBdHRyaWJ1dGVQZXJtaXNzaW9uUmVhZCA9IDB4MTsKLWNvbnN0IHVpbnQxNl90IGtBdHRyaWJ1dGVQZXJtaXNzaW9uUmVhZEVuY3J5cHRlZCA9IDB4MjsKLWNvbnN0IHVpbnQxNl90IGtBdHRyaWJ1dGVQZXJtaXNzaW9uUmVhZEVuY3J5cHRlZE1JVE0gPSAweDQ7Ci1jb25zdCB1aW50MTZfdCBrQXR0cmlidXRlUGVybWlzc2lvbldyaXRlID0gMHgxMDsKLWNvbnN0IHVpbnQxNl90IGtBdHRyaWJ1dGVQZXJtaXNzaW9uV3JpdGVFbmNyeXB0ZWQgPSAweDIwOwotY29uc3QgdWludDE2X3Qga0F0dHJpYnV0ZVBlcm1pc3Npb25Xcml0ZUVuY3J5cHRlZE1JVE0gPSAweDQwOwotY29uc3QgdWludDE2X3Qga0F0dHJpYnV0ZVBlcm1pc3Npb25Xcml0ZVNpZ25lZCA9IDB4ODA7Ci1jb25zdCB1aW50MTZfdCBrQXR0cmlidXRlUGVybWlzc2lvbldyaXRlU2lnbmVkTUlUTSA9IDB4MTAwOwotCi0vLyBHQVRUIGNoYXJhY3RlcmlzdGljIHByb3BlcnRpZXMgYml0LWZpZWxkIHZhbHVlcyAobm90IGluY2x1ZGluZyB0aGUKLS8vIGNoYXJhY3RlcmlzdGljIGV4dGVuZGVkIHByb3BlcnRpZXMpLgotY29uc3QgdWludDhfdCBrQ2hhcmFjdGVyaXN0aWNQcm9wZXJ0eU5vbmUgPSAweDA7Ci1jb25zdCB1aW50OF90IGtDaGFyYWN0ZXJpc3RpY1Byb3BlcnR5QnJvYWRjYXN0ID0gMHgxOwotY29uc3QgdWludDhfdCBrQ2hhcmFjdGVyaXN0aWNQcm9wZXJ0eVJlYWQgPSAweDI7Ci1jb25zdCB1aW50OF90IGtDaGFyYWN0ZXJpc3RpY1Byb3BlcnR5V3JpdGVOb1Jlc3BvbnNlID0gMHg0OwotY29uc3QgdWludDhfdCBrQ2hhcmFjdGVyaXN0aWNQcm9wZXJ0eVdyaXRlID0gMHg4OwotY29uc3QgdWludDhfdCBrQ2hhcmFjdGVyaXN0aWNQcm9wZXJ0eU5vdGlmeSA9IDB4MTA7Ci1jb25zdCB1aW50OF90IGtDaGFyYWN0ZXJpc3RpY1Byb3BlcnR5SW5kaWNhdGUgPSAweDIwOwotY29uc3QgdWludDhfdCBrQ2hhcmFjdGVyaXN0aWNQcm9wZXJ0eVNpZ25lZFdyaXRlID0gMHg0MDsKLWNvbnN0IHVpbnQ4X3Qga0NoYXJhY3RlcmlzdGljUHJvcGVydHlFeHRlbmRlZFByb3BzID0gMHg4MDsKLQotLy8gQWR2ZXJ0aXNpbmcgaW50ZXJ2YWwgZm9yIGRpZmZlcmVudCBtb2Rlcy4KLWNvbnN0IGludCBrQWR2ZXJ0aXNpbmdJbnRlcnZhbEhpZ2hNcyA9IDEwMDA7Ci1jb25zdCBpbnQga0FkdmVydGlzaW5nSW50ZXJ2YWxNZWRpdW1NcyA9IDI1MDsKLWNvbnN0IGludCBrQWR2ZXJ0aXNpbmdJbnRlcnZhbExvd01zID0gMTAwOwotCi0vLyBBZGQgc29tZSByYW5kb21uZXNzIHRvIHRoZSBhZHZlcnRpc2luZyBtaW4vbWF4IGludGVydmFsIHNvIHRoZSBjb250cm9sbGVyIGNhbgotLy8gZG8gc29tZSBvcHRpbWl6YXRpb24uCi0vLyBUT0RPKGFybWFuc2l0byk6IEkgdG9vayB0aGlzIGRpcmVjdGx5IGZyb20gcGFja2FnZXMvYXBwcy9CbHVldG9vdGggYnV0IGJhc2VkCi0vLyBvbiBjb2RlIHJldmlldyBjb21tZW50cyB0aGlzIGNvbnN0YW50IGFuZCB0aGUgYWNjb21wYW55aW5nIGxvZ2ljIGRvZXNuJ3QgbWFrZQotLy8gc2Vuc2UuIExldCdzIHJlbW92ZSB0aGlzIGNvbnN0YW50IGFuZCBmaWd1cmUgb3V0IGhvdyB0byBwcm9wZXJseSBjYWxjdWxhdGUKLS8vIHRoZSBNYXguIEFkdi4gSW50ZXJ2YWwuIChTZWUgaHR0cDovL2IvMjQzNDQwNzUpLgotY29uc3QgaW50IGtBZHZlcnRpc2luZ0ludGVydmFsRGVsdGFVbml0ID0gMTA7Ci0KLS8vIExlZ2FjeSBBZHZlcnRpc2luZyB0eXBlcyAoQURWX0lORCwgQURWX1NDQU5fSU5ELCBldGMuKSB0aGF0IGFyZSBleHBvc2VkIHRvCi0vLyBhcHBsaWNhdGlvbnMuCi1jb25zdCB1aW50MTZfdCBrQWR2ZXJ0aXNpbmdFdmVudFR5cGVMZWdhY3lDb25uZWN0YWJsZSA9IDB4MDAxMzsKLWNvbnN0IHVpbnQxNl90IGtBZHZlcnRpc2luZ0V2ZW50VHlwZUxlZ2FjeVNjYW5uYWJsZSA9IDB4MDAxMjsKLWNvbnN0IHVpbnQxNl90IGtBZHZlcnRpc2luZ0V2ZW50VHlwZUxlZ2FjeU5vbkNvbm5lY3RhYmxlID0gMHgwMDEwOwotCi0vLyBBZHZlcnRpc2luZyBjaGFubmVscy4gVGhlc2Ugc2hvdWxkIGJlIGtlcHQgdGhlIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCBpbiB0aGUKLS8vIHN0YWNrLgotY29uc3QgaW50IGtBZHZlcnRpc2luZ0NoYW5uZWwzNyA9ICgxIDw8IDApOwotY29uc3QgaW50IGtBZHZlcnRpc2luZ0NoYW5uZWwzOCA9ICgxIDw8IDEpOwotY29uc3QgaW50IGtBZHZlcnRpc2luZ0NoYW5uZWwzOSA9ICgxIDw8IDIpOwotY29uc3QgaW50IGtBZHZlcnRpc2luZ0NoYW5uZWxBbGwgPQotICAgIChrQWR2ZXJ0aXNpbmdDaGFubmVsMzcgfCBrQWR2ZXJ0aXNpbmdDaGFubmVsMzggfCBrQWR2ZXJ0aXNpbmdDaGFubmVsMzkpOwotCi0vLyBWYXJpb3VzIEV4dGVuZGVkIElucXVpcnkgUmVzcG9uc2UgZmllbGRzIHR5cGVzIHRoYXQgYXJlIHVzZWQgZm9yIGFkdmVydGlzaW5nCi0vLyBkYXRhIGZpZWxkcyBhcyBkZWZpbmVkIGluIHRoZSBDb3JlIFNwZWNpZmljYXRpb24gU3VwcGxlbWVudC4KLWNvbnN0IHVpbnQ4X3Qga0VJUlR5cGVGbGFncyA9IDB4MDE7Ci1jb25zdCB1aW50OF90IGtFSVJUeXBlSW5jb21wbGV0ZTE2Qml0VXVpZHMgPSAweDAyOwotY29uc3QgdWludDhfdCBrRUlSVHlwZUNvbXBsZXRlMTZCaXRVdWlkcyA9IDB4MDM7Ci1jb25zdCB1aW50OF90IGtFSVJUeXBlSW5jb21wbGV0ZTMyQml0VXVpZHMgPSAweDA0OwotY29uc3QgdWludDhfdCBrRUlSVHlwZUNvbXBsZXRlMzJCaXRVdWlkcyA9IDB4MDU7Ci1jb25zdCB1aW50OF90IGtFSVJUeXBlSW5jb21wbGV0ZTEyOEJpdFV1aWRzID0gMHgwNjsKLWNvbnN0IHVpbnQ4X3Qga0VJUlR5cGVDb21wbGV0ZTEyOEJpdFV1aWRzID0gMHgwNzsKLWNvbnN0IHVpbnQ4X3Qga0VJUlR5cGVTaG9ydGVuZWRMb2NhbE5hbWUgPSAweDA4OwotY29uc3QgdWludDhfdCBrRUlSVHlwZUNvbXBsZXRlTG9jYWxOYW1lID0gMHgwOTsKLWNvbnN0IHVpbnQ4X3Qga0VJUlR5cGVUeFBvd2VyID0gMHgwQTsKLWNvbnN0IHVpbnQ4X3Qga0VJUlR5cGVTZXJ2aWNlRGF0YSA9IDB4MTY7Ci1jb25zdCB1aW50OF90IGtFSVJUeXBlTWFudWZhY3R1cmVyU3BlY2lmaWNEYXRhID0gMHhGRjsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3JlbW90ZV9kZXZpY2VfcHJvcHMuY2MgYi9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvcmVtb3RlX2RldmljZV9wcm9wcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwNDIxZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvcmVtb3RlX2RldmljZV9wcm9wcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYmx1ZXRvb3RoL3JlbW90ZV9kZXZpY2VfcHJvcHMuaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1SZW1vdGVEZXZpY2VQcm9wczo6UmVtb3RlRGV2aWNlUHJvcHMoKSA9IGRlZmF1bHQ7Ci1SZW1vdGVEZXZpY2VQcm9wczo6UmVtb3RlRGV2aWNlUHJvcHMoY29uc3QgUmVtb3RlRGV2aWNlUHJvcHMmIG90aGVyKSA9IGRlZmF1bHQ7Ci1SZW1vdGVEZXZpY2VQcm9wczo6UmVtb3RlRGV2aWNlUHJvcHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VXVpZD4mIHNlcnZpY2VfdXVpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VfY2xhc3MsIGludDMyX3QgZGV2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByc3NpKQotICAgIDogbmFtZV8obmFtZSksCi0gICAgICBhZGRyZXNzXyhhZGRyZXNzKSwKLSAgICAgIHNlcnZpY2VfdXVpZHNfKHNlcnZpY2VfdXVpZHMpLAotICAgICAgZGV2aWNlX2NsYXNzXyhkZXZpY2VfY2xhc3MpLAotICAgICAgZGV2aWNlX3R5cGVfKGRldmljZV90eXBlKSwKLSAgICAgIHJzc2lfKHJzc2kpIHt9Ci1SZW1vdGVEZXZpY2VQcm9wczo6flJlbW90ZURldmljZVByb3BzKCkgPSBkZWZhdWx0OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvcmVtb3RlX2RldmljZV9wcm9wcy5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3JlbW90ZV9kZXZpY2VfcHJvcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiM2IxYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvcmVtb3RlX2RldmljZV9wcm9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJibHVldG9vdGgvdXVpZC5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgUmVtb3RlRGV2aWNlUHJvcHMgewotIHB1YmxpYzoKLSAgUmVtb3RlRGV2aWNlUHJvcHMoKTsKLSAgUmVtb3RlRGV2aWNlUHJvcHMoY29uc3QgUmVtb3RlRGV2aWNlUHJvcHMmIG90aGVyKTsKLSAgUmVtb3RlRGV2aWNlUHJvcHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxVdWlkPiYgc2VydmljZV91dWlkcywKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VfY2xhc3MsIGludDMyX3QgZGV2aWNlX3R5cGUsIGludDMyX3QgcnNzaSk7Ci0gIH5SZW1vdGVEZXZpY2VQcm9wcygpOwotCi0gIHZvaWQgc2V0X2FkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpIHsgYWRkcmVzc18gPSBhZGRyZXNzOyB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIGFkZHJlc3NfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPFV1aWQ+JiBzZXJ2aWNlX3V1aWRzKCkgY29uc3QgeyByZXR1cm4gc2VydmljZV91dWlkc187IH0KLSAgaW50MzJfdCBkZXZpY2VfY2xhc3MoKSBjb25zdCB7IHJldHVybiBkZXZpY2VfY2xhc3NfOyB9Ci0gIGludDMyX3QgZGV2aWNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBkZXZpY2VfdHlwZV87IH0KLSAgaW50MzJfdCByc3NpKCkgY29uc3QgeyByZXR1cm4gcnNzaV87IH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIGFkZHJlc3NfOwotICBzdGQ6OnZlY3RvcjxVdWlkPiBzZXJ2aWNlX3V1aWRzXzsKLSAgaW50MzJfdCBkZXZpY2VfY2xhc3NfID0gLTE7Ci0gIGludDMyX3QgZGV2aWNlX3R5cGVfID0gLTE7Ci0gIGludDMyX3QgcnNzaV8gPSAtMTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX2ZpbHRlci5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX2ZpbHRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhNGU5Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImJsdWV0b290aC9zY2FuX2ZpbHRlci5oIgotCi0jaW5jbHVkZSA8cmF3X2FkZHJlc3MuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLVNjYW5GaWx0ZXI6OlNjYW5GaWx0ZXIoY29uc3QgU2NhbkZpbHRlciYgb3RoZXIpIHsKLSAgZGV2aWNlX25hbWVfID0gb3RoZXIuZGV2aWNlX25hbWVfOwotICBkZXZpY2VfYWRkcmVzc18gPSBvdGhlci5kZXZpY2VfYWRkcmVzc187Ci0KLSAgaWYgKG90aGVyLnNlcnZpY2VfdXVpZF8pIHNlcnZpY2VfdXVpZF8ucmVzZXQobmV3IFV1aWQoKm90aGVyLnNlcnZpY2VfdXVpZF8pKTsKLQotICBpZiAob3RoZXIuc2VydmljZV91dWlkX21hc2tfKQotICAgIHNlcnZpY2VfdXVpZF9tYXNrXy5yZXNldChuZXcgVXVpZCgqb3RoZXIuc2VydmljZV91dWlkX21hc2tfKSk7Ci19Ci0KLVNjYW5GaWx0ZXImIFNjYW5GaWx0ZXI6Om9wZXJhdG9yPShjb25zdCBTY2FuRmlsdGVyJiBvdGhlcikgewotICBkZXZpY2VfbmFtZV8gPSBvdGhlci5kZXZpY2VfbmFtZV87Ci0gIGRldmljZV9hZGRyZXNzXyA9IG90aGVyLmRldmljZV9hZGRyZXNzXzsKLQotICBpZiAob3RoZXIuc2VydmljZV91dWlkXykKLSAgICBzZXJ2aWNlX3V1aWRfLnJlc2V0KG5ldyBVdWlkKCpvdGhlci5zZXJ2aWNlX3V1aWRfKSk7Ci0gIGVsc2UKLSAgICBzZXJ2aWNlX3V1aWRfID0gbnVsbHB0cjsKLQotICBpZiAob3RoZXIuc2VydmljZV91dWlkX21hc2tfKQotICAgIHNlcnZpY2VfdXVpZF9tYXNrXy5yZXNldChuZXcgVXVpZCgqb3RoZXIuc2VydmljZV91dWlkX21hc2tfKSk7Ci0gIGVsc2UKLSAgICBzZXJ2aWNlX3V1aWRfbWFza18gPSBudWxscHRyOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotYm9vbCBTY2FuRmlsdGVyOjpTZXREZXZpY2VBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykgewotICBpZiAoIVJhd0FkZHJlc3M6OklzVmFsaWRBZGRyZXNzKGRldmljZV9hZGRyZXNzKSkgcmV0dXJuIGZhbHNlOwotCi0gIGRldmljZV9hZGRyZXNzXyA9IGRldmljZV9hZGRyZXNzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTY2FuRmlsdGVyOjpTZXRTZXJ2aWNlVXVpZChjb25zdCBVdWlkJiBzZXJ2aWNlX3V1aWQpIHsKLSAgc2VydmljZV91dWlkXy5yZXNldChuZXcgVXVpZChzZXJ2aWNlX3V1aWQpKTsKLSAgc2VydmljZV91dWlkX21hc2tfLnJlc2V0KCk7Ci19Ci0KLXZvaWQgU2NhbkZpbHRlcjo6U2V0U2VydmljZVV1aWRXaXRoTWFzayhjb25zdCBVdWlkJiBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgbWFzaykgewotICBzZXJ2aWNlX3V1aWRfLnJlc2V0KG5ldyBVdWlkKHNlcnZpY2VfdXVpZCkpOwotICBzZXJ2aWNlX3V1aWRfbWFza18ucmVzZXQobmV3IFV1aWQobWFzaykpOwotfQotCi1ib29sIFNjYW5GaWx0ZXI6Om9wZXJhdG9yPT0oY29uc3QgU2NhbkZpbHRlciYgcmhzKSBjb25zdCB7Ci0gIGlmIChkZXZpY2VfbmFtZV8gIT0gcmhzLmRldmljZV9uYW1lXykgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChkZXZpY2VfYWRkcmVzc18gIT0gcmhzLmRldmljZV9hZGRyZXNzXykgcmV0dXJuIGZhbHNlOwotCi0gIC8vIEJvdGggbXVzdCBiZSBlaXRoZXIgTlVMTCBvciBub24tTlVMTC4gSWYgb25seSBvbmUgb2YgdGhlbSBpcyBOVUxMLCB0aGVuCi0gIC8vIHJldHVybiBmYWxzZS4KLSAgaWYgKCEhc2VydmljZV91dWlkXyAhPSAhIXJocy5zZXJ2aWNlX3V1aWRfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHNlcnZpY2VfdXVpZF8gJiYgcmhzLnNlcnZpY2VfdXVpZF8gJiYKLSAgICAgICpzZXJ2aWNlX3V1aWRfICE9ICpyaHMuc2VydmljZV91dWlkXykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQm90aCBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIG5vbi1OVUxMLiBJZiBvbmx5IG9uZSBvZiB0aGVtIGlzIE5VTEwsIHRoZW4KLSAgLy8gcmV0dXJuIGZhbHNlLgotICBpZiAoISFzZXJ2aWNlX3V1aWRfbWFza18gIT0gISFyaHMuc2VydmljZV91dWlkX21hc2tfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHNlcnZpY2VfdXVpZF9tYXNrXyAmJiByaHMuc2VydmljZV91dWlkX21hc2tfICYmCi0gICAgICAqc2VydmljZV91dWlkX21hc2tfICE9ICpyaHMuc2VydmljZV91dWlkX21hc2tfKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fZmlsdGVyLmggYi9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhZmFhNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBVc2VkIGZvciBmaWx0ZXJpbmcgc2NhbiByZXN1bHRzIGJ5IGFsbG93aW5nIGNsaWVudHMgdG8gcmVzdHJpY3Qgc2NhbiByZXN1bHRzCi0vLyB0byBvbmx5IHRob3NlIHRoYXQgYXJlIG9mIGludGVyZXN0IHRvIHRoZW0uCi1jbGFzcyBTY2FuRmlsdGVyIHsKLSBwdWJsaWM6Ci0gIFNjYW5GaWx0ZXIoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgflNjYW5GaWx0ZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgU2NhbkZpbHRlcihjb25zdCBTY2FuRmlsdGVyJiBvdGhlcik7Ci0gIFNjYW5GaWx0ZXImIG9wZXJhdG9yPShjb25zdCBTY2FuRmlsdGVyJiBvdGhlcik7Ci0KLSAgLy8gVGhlIGRldmljZSBuYW1lIHVzZWQgd2hpbGUgZmlsdGVyaW5nIHNjYW4gcmVzdWx0cy4KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gZGV2aWNlX25hbWVfOyB9Ci0gIHZvaWQgc2V0X2RldmljZV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGRldmljZV9uYW1lXyA9IG5hbWU7IH0KLQotICAvLyBUaGUgZGV2aWNlIGFkZHJlc3MgdXNlZCB3aGlsZSBmaWx0ZXJpbmcgc2NhbiByZXN1bHRzLiBBZGRyZXNzIHNob3VsZCBiZSBpbgotICAvLyB0aGUgWFg6WFg6WFg6WFg6WFg6WFggd2hlcmUgWCBpcyBhIGhleGFkZWNpbWFsIGRpZ2l0LgotICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MoKSBjb25zdCB7IHJldHVybiBkZXZpY2VfYWRkcmVzc187IH0KLQotICAvLyBTZXRzIHRoZSBkZXZpY2UgYWRkcmVzcyB1c2VkIGZvciBmaWx0ZXJpbmcuIFJldHVybnMgZmFsc2UgaWYKLSAgLy8gfGRldmljZV9hZGRyZXNzfCBpcyBpbiBhbiBpbGxlZ2FsIGZvcm1hdC4KLSAgYm9vbCBTZXREZXZpY2VBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcyk7Ci0KLSAgLy8gVGhlIHNlcnZpY2UgVXVpZCBhbmQgaXRzIG1hc2sgdXNlZCB3aGlsZSBmaWx0ZXJpbmcgc2NhbiByZXN1bHRzLiBTZWUKLSAgLy8gU2V0U2VydmljZVV1aWRXaXRoTWFzayBmb3Igd2hhdCB0aGlzIG1hc2sgZG9lcy4gVGhlIHJhdyBwb2ludGVyIHJldHVybmVkCi0gIC8vIGZyb20gdGhlc2UgZ2V0dGVycyBiZWxvbmdzIHRvIHRoZSBTY2FuRmlsdGVyIG9iamVjdC4gbnVsbHB0ciB3aWxsIGJlCi0gIC8vIHJldHVybmVkIGlmIHRoZXNlIGZpZWxkcyBoYXZlIG5vdCBiZWVuIHNldCBvbiB0aGlzIGZpbHRlci4KLSAgY29uc3QgVXVpZCogc2VydmljZV91dWlkKCkgY29uc3QgeyByZXR1cm4gc2VydmljZV91dWlkXy5nZXQoKTsgfQotICBjb25zdCBVdWlkKiBzZXJ2aWNlX3V1aWRfbWFzaygpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VfdXVpZF9tYXNrXy5nZXQoKTsgfQotCi0gIC8vIFNldHMgdGhlIHNlcnZpY2UgVXVpZCBmb3IgdGhpcyBmaWx0ZXIuCi0gIHZvaWQgU2V0U2VydmljZVV1aWQoY29uc3QgVXVpZCYgc2VydmljZV91dWlkKTsKLQotICAvLyBTZXRzIHRoZSBzZXJ2aWNlIFV1aWQgZm9yIHRoaXMgZmlsdGVyIHdpdGggYSAxMjgtYml0IG1hc2suIFRoZSBtYXNrIGFsbG93cwotICAvLyB0aGUgY2FsbGVyIHRvIHBhcnRpYWxseSBmaWx0ZXIgc2Nhbm5lZCBzZXJ2aWNlIFV1aWRzLiBGb3IgYW55IG9mIHRoZQotICAvLyAxMjgtYml0cyBvZiBhIFV1aWQsIHNldCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIG1hc2sgdG8gMSB0byBtYXRjaCB0aGUKLSAgLy8gYWR2ZXJ0aXNlZCB2YWx1ZSwgYW5kIDAgdG8gaWdub3JlIHRoYXQgYml0LgotICB2b2lkIFNldFNlcnZpY2VVdWlkV2l0aE1hc2soY29uc3QgVXVpZCYgc2VydmljZV91dWlkLCBjb25zdCBVdWlkJiBtYXNrKTsKLQotICAvLyBDb21wYXJpc29uIG9wZXJhdG9yLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhbkZpbHRlciYgcmhzKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX25hbWVfOwotICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzc187Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPFV1aWQ+IHNlcnZpY2VfdXVpZF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxVdWlkPiBzZXJ2aWNlX3V1aWRfbWFza187Ci0KLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBBZGQgc2VydmljZSBhbmQgbWFudWZhY3R1cmVyIGRhdGEgZmlsdGVyIGZpZWxkcy4KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX3Jlc3VsdC5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX3Jlc3VsdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1ODg5Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImJsdWV0b290aC9zY2FuX3Jlc3VsdC5oIgotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLVNjYW5SZXN1bHQ6OlNjYW5SZXN1bHQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Nhbl9yZWNvcmQsIGludCByc3NpKQotICAgIDogZGV2aWNlX2FkZHJlc3NfKGRldmljZV9hZGRyZXNzKSwgc2Nhbl9yZWNvcmRfKHNjYW5fcmVjb3JkKSwgcnNzaV8ocnNzaSkgewotICBDSEVDSyhSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcyhkZXZpY2VfYWRkcmVzcykpIDw8ICJJbnZhbGlkIEJEX0FERFIgZ2l2ZW46ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkZXZpY2VfYWRkcmVzczsKLX0KLQotYm9vbCBTY2FuUmVzdWx0OjpvcGVyYXRvcj09KGNvbnN0IFNjYW5SZXN1bHQmIHJocykgY29uc3QgewotICBpZiAoZGV2aWNlX2FkZHJlc3NfICE9IHJocy5kZXZpY2VfYWRkcmVzc18pIHJldHVybiBmYWxzZTsKLQotICBpZiAoc2Nhbl9yZWNvcmRfICE9IHJocy5zY2FuX3JlY29yZF8pIHJldHVybiBmYWxzZTsKLQotICBpZiAocnNzaV8gIT0gcmhzLnJzc2lfKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX3Jlc3VsdC5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fcmVzdWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzYyZWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fcmVzdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBTY2FuUmVzdWx0IHJlcHJlc2VudHMgYSBzaW5nbGUgQmx1ZXRvb3RoIExFIGRldmljZSBzY2FuIHJlc3VsdC4gSXQKLS8vIGVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCBkaXNjb3ZlcmVkIExFIGRldmljZXMuCi1jbGFzcyBTY2FuUmVzdWx0IHsKLSBwdWJsaWM6Ci0gIFNjYW5SZXN1bHQoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzY2FuX3JlY29yZCwgaW50IHJzc2kpOwotICBTY2FuUmVzdWx0KCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5TY2FuUmVzdWx0KCkgPSBkZWZhdWx0OwotCi0gIC8vIFJldHVybnMgdGhlIHJlbW90ZSBCRF9BRERSIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNjYW4gcmVzdWx0LgotICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MoKSBjb25zdCB7IHJldHVybiBkZXZpY2VfYWRkcmVzc187IH0KLQotICAvLyBSZXR1cm5zIHRoZSBzY2FuIHJlY29yZCAoYWR2ZXJ0aXNpbmcgK3NjYW4tcmVzcG9uc2UgZGF0YSkgYXNzb2NpYXRlZCB3aXRoCi0gIC8vIHRoaXMgc2NhbiByZXN1bHQuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzY2FuX3JlY29yZCgpIGNvbnN0IHsgcmV0dXJuIHNjYW5fcmVjb3JkXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIFJTU0kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2NhbiByZXN1bHQuCi0gIGludCByc3NpKCkgY29uc3QgeyByZXR1cm4gcnNzaV87IH0KLQotICAvLyBDb21wYXJpc29uIG9wZXJhdG9yLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhblJlc3VsdCYgcmhzKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3NfOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3JlY29yZF87Ci0gIGludCByc3NpXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX3NldHRpbmdzLmNjIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOWFhOTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgImJsdWV0b290aC9zY2FuX3NldHRpbmdzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1TY2FuU2V0dGluZ3M6OlNjYW5TZXR0aW5ncygpCi0gICAgOiBtb2RlXyhNT0RFX0xPV19QT1dFUiksCi0gICAgICBjYWxsYmFja190eXBlXyhDQUxMQkFDS19UWVBFX0FMTF9NQVRDSEVTKSwKLSAgICAgIHJlc3VsdF90eXBlXyhSRVNVTFRfVFlQRV9GVUxMKSwKLSAgICAgIG1hdGNoX2NvdW50X3Blcl9maWx0ZXJfKE1BVENIX0NPVU5UX01BWF9BRFZFUlRJU0VNRU5UUykge30KLQotU2NhblNldHRpbmdzOjpTY2FuU2V0dGluZ3MoTW9kZSBtb2RlLCBDYWxsYmFja1R5cGVCaXRGaWVsZCBjYWxsYmFja190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0VHlwZSByZXN1bHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSByZXBvcnRfZGVsYXlfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaE1vZGUgbWF0Y2hfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoQ291bnQgbWF0Y2hfY291bnRfcGVyX2ZpbHRlcikKLSAgICA6IG1vZGVfKG1vZGUpLAotICAgICAgY2FsbGJhY2tfdHlwZV8oY2FsbGJhY2tfdHlwZSksCi0gICAgICByZXN1bHRfdHlwZV8ocmVzdWx0X3R5cGUpLAotICAgICAgcmVwb3J0X2RlbGF5X21zXyhyZXBvcnRfZGVsYXlfbXMpLAotICAgICAgbWF0Y2hfbW9kZV8obWF0Y2hfbW9kZSksCi0gICAgICBtYXRjaF9jb3VudF9wZXJfZmlsdGVyXyhtYXRjaF9jb3VudF9wZXJfZmlsdGVyKSB7fQotCi1ib29sIFNjYW5TZXR0aW5nczo6b3BlcmF0b3I9PShjb25zdCBTY2FuU2V0dGluZ3MmIHJocykgY29uc3QgewotICBpZiAobW9kZV8gIT0gcmhzLm1vZGVfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNhbGxiYWNrX3R5cGVfICE9IHJocy5jYWxsYmFja190eXBlXykgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChyZXN1bHRfdHlwZV8gIT0gcmhzLnJlc3VsdF90eXBlXykgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChyZXBvcnRfZGVsYXlfbXNfICE9IHJocy5yZXBvcnRfZGVsYXlfbXNfKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1hdGNoX21vZGVfICE9IHJocy5tYXRjaF9tb2RlXykgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtYXRjaF9jb3VudF9wZXJfZmlsdGVyXyAhPSByaHMubWF0Y2hfY291bnRfcGVyX2ZpbHRlcl8pIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zY2FuX3NldHRpbmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjk4YmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL3RpbWUvdGltZS5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gU2NhblNldHRpbmdzIGVuY2Fwc3VsYXRlcyBCbHVldG9vdGggTEUgZGV2aWNlIHNjYW4gcGFyYW1ldGVycy4gVGhpcyBpcyB0aGUKLS8vIG5hdGl2ZSBlcXVpdmFsZW50IG9mIHRoZSBBbmRyb2lkIGZyYW1ld29yayBjbGFzcyBkZWZpbmVkIGluCi0vLyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL2xlL1NjYW5TZXR0aW5ncy5qYXZhLgotY2xhc3MgU2NhblNldHRpbmdzIHsKLSBwdWJsaWM6Ci0gIC8vIEEgc2NhbiBtb2RlIGRlc2NyaWJlcyB0aGUgcG93ZXIgY29uc3VtcHRpb24gaW52b2x2ZWQgaW4gTEUgc2NhbnMuCi0gIGVudW0gTW9kZSB7Ci0gICAgLy8gQSBzcGVjaWFsIEJsdWV0b290aCBMRSBzY2FuIG1vZGUuIEFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIHNjYW4gbW9kZSB3aWxsCi0gICAgLy8gcGFzc2l2ZWx5IGxpc3RlbiBmb3Igb3RoZXIgc2NhbiByZXN1bHRzIHdpdGhvdXQgc3RhcnRpbmcgQkxFIHNjYW5zCi0gICAgLy8gdGhlbXNlbHZlcy4KLSAgICBNT0RFX09QUE9SVFVOSVNUSUMgPSAtMSwKLQotICAgIC8vIFBlcmZvcm0gQmx1ZXRvb3RoIExFIHNjYW4gaW4gbG93IHBvd2VyIG1vZGUuIFRoaXMgaXMgdGhlIGRlZmF1bHQgc2NhbgotICAgIC8vIG1vZGUgYXMgaXQgY29uc3VtZXMgdGhlIGxlYXN0IHBvd2VyLgotICAgIE1PREVfTE9XX1BPV0VSID0gMCwKLQotICAgIC8vIFBlcmZvcm0gQmx1ZXRvb3RoIExFIHNjYW4gaW4gYmFsYW5jZWQgcG93ZXIgbW9kZS4gU2NhbiByZXN1bHRzIGFyZQotICAgIC8vIHJldHVybmVkIGF0IGEgcmF0ZSB0aGF0IHByb3ZpZGVzIGEgZ29vZCB0cmFkZS1vZmYgYmV0d2VlbiBzY2FuIGZyZXF1ZW5jeQotICAgIC8vIGFuZCBwb3dlciBjb25zdW1wdGlvbi4KLSAgICBNT0RFX0JBTEFOQ0VEID0gMSwKLQotICAgIC8vIFNjYW4gdXNpbmcgdGhlIGhpZ2hlc3QgZHV0eSBjeWNsZS4gSXQncyByZWNvbW1lbmRlZCB0byBvbmx5IHVzZSB0aGlzIG1vZGUKLSAgICAvLyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kLgotICAgIE1PREVfTE9XX0xBVEVOQ1kgPSAyLAotICB9OwotCi0gIC8vIEEgY2FsbGJhY2sgdHlwZSBkZXNjcmliZXMgaG93IHNjYW4gcmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIHRvIGFwcGxpY2F0aW9ucwotICAvLyBpbiBhc3luY2hyb25vdXMgY2FsbGJhY2tzLgotICBlbnVtIENhbGxiYWNrVHlwZSB7Ci0gICAgLy8gVHJpZ2dlciBhIGNhbGxiYWNrIGZvciBldmVyeSBCbHVldG9vdGggYWR2ZXJ0aXNlbWVudCBmb3VuZCB0aGF0IG1hdGNoZXMKLSAgICAvLyB0aGUgZmlsdGVyIGNyaXRlcmlhLiBJZiBubyBmaWx0ZXIgaXMgYWN0aXZlLCBhbGwgYWR2ZXJ0aXNlbWVudCBwYWNrZXRzCi0gICAgLy8gYXJlIHJlcG9ydGVkLgotICAgIENBTExCQUNLX1RZUEVfQUxMX01BVENIRVMgPSAxLAotCi0gICAgLy8gQSByZXN1bHQgY2FsbGJhY2sgaXMgb25seSB0cmlnZ2VyZWQgZm9yIHRoZSBmaXJzdCBhZHZlcnRpc2VtZW50IHBhY2tldAotICAgIC8vIHJlY2VpdmVkIHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyIGNyaXRlcmlhLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlCi0gICAgLy8gaGFyZHdhcmUgc3VwcG9ydCB0aGUgb2ZmbG9hZGVkIGZpbHRlcmluZyBmZWF0dXJlLgotICAgIENBTExCQUNLX1RZUEVfRklSU1RfTUFUQ0ggPSAyLAotCi0gICAgLy8gUmVjZWl2ZSBhIGNhbGxiYWNrIHdoZW4gYWR2ZXJ0aXNlbWVudHMgYXJlIG5vIGxvbmdlciByZWNlaXZlZCBmcm9tIGEKLSAgICAvLyBkZXZpY2UgdGhhdCBoYXMgYmVlbiBwcmV2aW91c2x5IHJlcG9ydGVkIGJ5IGEgZmlyc3QgbWF0Y2ggY2FsbGJhY2suIFRoaXMKLSAgICAvLyByZXF1aXJlcyB0aGF0IHRoZSBoYXJkd2FyZSBzdXBwb3J0IHRoZSBvZmZsb2FkZWQgZmlsdGVyaW5nIGZlYXR1cmUuCi0gICAgQ0FMTEJBQ0tfVFlQRV9NQVRDSF9MT1NUID0gNCwKLSAgfTsKLSAgdXNpbmcgQ2FsbGJhY2tUeXBlQml0RmllbGQgPSBpbnQ7Ci0KLSAgLy8gRGV0ZXJtaW5lcyBob3cgbWFueSBhZHZlcnRpc2VtZW50cyB0byBtYXRjaCBwZXIgZmlsdGVyLgotICBlbnVtIE1hdGNoQ291bnQgewotICAgIC8vIE1hdGNoIG9uZSBhZHZlcnRpc2VtZW50IHBlciBmaWx0ZXIuCi0gICAgTUFUQ0hfQ09VTlRfT05FX0FEVkVSVElTRU1FTlQgPSAxLAotCi0gICAgLy8gTWF0Y2ggZmV3IGFkdmVydGlzZW1lbnRzIHBlciBmaWx0ZXIgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNhcGFiaWxpdHkKLSAgICAvLyBhbmQgYXZhaWxhYmlsaXR5IG9mIGhhcmR3YXJlIHJlc291cmNlcy4KLSAgICBNQVRDSF9DT1VOVF9GRVdfQURWRVJUSVNFTUVOVFMgPSAyLAotCi0gICAgLy8gTWF0Y2ggYXMgbWFueSBhZHZlcnRpc2VtZW50cyBwZXIgZmlsdGVyIGFzIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIGNhbgotICAgIC8vIGFsbG93LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY2FwYWJpbGl0eSBhbmQgYXZhaWxhYmlsaXR5IG9mIGhhcmR3YXJlCi0gICAgLy8gcmVzb3VyY2VzLgotICAgIE1BVENIX0NPVU5UX01BWF9BRFZFUlRJU0VNRU5UUyA9IDMsCi0gIH07Ci0KLSAgLy8gSGFyZHdhcmUgZmlsdGVyIG1hdGNoIG1vZGUuCi0gIGVudW0gTWF0Y2hNb2RlIHsKLSAgICAvLyBJbiBhZ2dyZXNzaXZlIG1vZGUgdGhlIGhhcmR3YXJlIHdpbGwgZGV0ZXJtaW5lIGEgbWF0Y2ggc29vbmVyIGV2ZW4gd2l0aAotICAgIC8vIGZlZWJsZSBzaWduYWwgc3RyZW5ndGggYW5kIGEgbG93IG51bWJlciBvZiBzaWdodGluZ3MgaW4gYSBkdXJhdGlvbi4KLSAgICBNQVRDSF9NT0RFX0FHR1JFU1NJVkUgPSAxLAotCi0gICAgLy8gSW4gc3RpY2t5IG1vZGUgYSBoaWdoZXIgdGhyZXNob2xkIG9mIHNpZ25hbCBzdHJlbmd0aCBhbmQgc2lnaHRpbmdzIGlzCi0gICAgLy8gcmVxdWlyZWQgYmVmb3JlIGEgc2NhbiByZXN1bHQgaXMgcmVwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgotICAgIE1BVENIX01PREVfU1RJQ0tZID0gMiwKLSAgfTsKLQotICAvLyBTY2FuIHJlc3VsdCB0eXBlIGRlc2NyaWJlcyB0aGUgY29udGVudHMgb2YgZWFjaCBzY2FuIHJlc3VsdC4KLSAgZW51bSBSZXN1bHRUeXBlIHsKLSAgICAvLyBSZXF1ZXN0IGZ1bGwgc2NhbiByZXN1bHRzIHdoaWNoIGNvbnRhaW4gdGhlIGRldmljZSBuYW1lLCBSU1NJLAotICAgIC8vIGFkdmVydGlzaW5nIGRhdGEsIHNjYW4gcmVzcG9uc2UgZGF0YSwgYW5kIHRoZSBzY2FuIHRpbWVzdGFtcC4KLSAgICBSRVNVTFRfVFlQRV9GVUxMID0gMCwKLQotICAgIC8vIFJlcXVlc3QgYWJicmV2aWF0ZWQgc2NhbiByZXN1bHRzIHdoaWNoIGNvbnRhaW4gdGhlIGRldmljZSBuYW1lLCBSU1NJLCBhbmQKLSAgICAvLyBzY2FuIHRpbWVzdGFtcC4KLSAgICAvLyBOb3RlOiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdG8gZ2V0IG1vcmUgc2NhbiByZXN1bHRzIHRoYW4gaXQKLSAgICAvLyBhc2tlZCBmb3IsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBhcHBzIHVzaW5nIHRoaXMgdHlwZS4KLSAgICBSRVNVTFRfVFlQRV9BQkJSRVZJQVRFRCA9IDEsCi0gIH07Ci0KLSAgLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3Igc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHRzOgotICAvLyAgIG1vZGU6IE1PREVfTE9XX1BPV0VSCi0gIC8vICAgY2FsbGJhY2tfdHlwZTogQ0FMTEJBQ0tfVFlQRV9BTExfTUFUQ0hFUwotICAvLyAgIHJlc3VsdF90eXBlOiBSRVNVTFRfVFlQRV9GVUxMCi0gIC8vICAgcmVwb3J0X2RlbGF5X21zOiAwCi0gIC8vICAgbWF0Y2hfbW9kZTogTUFUQ0hfTU9ERV9BR0dSRVNTSVZFCi0gIC8vICAgbWF0Y2hfY291bnRfcGVyX2ZpbHRlcjogTUFUQ0hfQ09VTlRfTUFYX0FEVkVSVElTRU1FTlRTCi0gIFNjYW5TZXR0aW5ncygpOwotICBTY2FuU2V0dGluZ3MoTW9kZSBtb2RlLCBDYWxsYmFja1R5cGVCaXRGaWVsZCBjYWxsYmFja190eXBlLAotICAgICAgICAgICAgICAgUmVzdWx0VHlwZSByZXN1bHRfdHlwZSwgYmFzZTo6VGltZURlbHRhIHJlcG9ydF9kZWxheV9tcywKLSAgICAgICAgICAgICAgIE1hdGNoTW9kZSBtYXRjaF9tb2RlLCBNYXRjaENvdW50IG1hdGNoX2NvdW50X3Blcl9maWx0ZXIpOwotICB2aXJ0dWFsIH5TY2FuU2V0dGluZ3MoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2NhbiBtb2RlLgotICBNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtb2RlXzsgfQotICB2b2lkIHNldF9tb2RlKE1vZGUgbW9kZSkgeyBtb2RlXyA9IG1vZGU7IH0KLQotICAvLyBSZXR1cm5zIHRoZSBjYWxsYmFjayB0eXBlLgotICBDYWxsYmFja1R5cGVCaXRGaWVsZCBjYWxsYmFja190eXBlKCkgY29uc3QgeyByZXR1cm4gY2FsbGJhY2tfdHlwZV87IH0KLSAgdm9pZCBzZXRfY2FsbGJhY2tfdHlwZShDYWxsYmFja1R5cGVCaXRGaWVsZCB0eXBlKSB7IGNhbGxiYWNrX3R5cGVfID0gdHlwZTsgfQotCi0gIC8vIFJldHVybnMgdGhlIHNjYW4gcmVzdWx0IHR5cGUuCi0gIFJlc3VsdFR5cGUgcmVzdWx0X3R5cGUoKSBjb25zdCB7IHJldHVybiByZXN1bHRfdHlwZV87IH0KLSAgdm9pZCBzZXRfcmVzdWx0X3R5cGUoUmVzdWx0VHlwZSB0eXBlKSB7IHJlc3VsdF90eXBlXyA9IHR5cGU7IH0KLQotICAvLyBSZXR1cm5zIHRoZSByZXBvcnQgZGVsYXkgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLgotICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHJlcG9ydF9kZWxheSgpIGNvbnN0IHsgcmV0dXJuIHJlcG9ydF9kZWxheV9tc187IH0KLSAgdm9pZCBzZXRfcmVwb3J0X2RlbGF5KGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZGVsYXkpIHsKLSAgICByZXBvcnRfZGVsYXlfbXNfID0gZGVsYXk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBoYXJkd2FyZSBmaWx0ZXIgbWF0Y2ggbW9kZS4KLSAgTWF0Y2hNb2RlIG1hdGNoX21vZGUoKSBjb25zdCB7IHJldHVybiBtYXRjaF9tb2RlXzsgfQotICB2b2lkIHNldF9tYXRjaF9tb2RlKE1hdGNoTW9kZSBtb2RlKSB7IG1hdGNoX21vZGVfID0gbW9kZTsgfQotCi0gIC8vIFJldHVybnMgdGhlIGNvdW50IG9mIGFkdmVydGlzZW1lbnRzIHRvIG1hdGNoIHBlciBmaWx0ZXIuCi0gIE1hdGNoQ291bnQgbWF0Y2hfY291bnRfcGVyX2ZpbHRlcigpIGNvbnN0IHsgcmV0dXJuIG1hdGNoX2NvdW50X3Blcl9maWx0ZXJfOyB9Ci0gIHZvaWQgc2V0X21hdGNoX2NvdW50X3Blcl9maWx0ZXIoTWF0Y2hDb3VudCBjb3VudCkgewotICAgIG1hdGNoX2NvdW50X3Blcl9maWx0ZXJfID0gY291bnQ7Ci0gIH0KLQotICAvLyBDb21wYXJpc29uIG9wZXJhdG9yLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhblNldHRpbmdzJiByaHMpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBNb2RlIG1vZGVfOwotICBDYWxsYmFja1R5cGVCaXRGaWVsZCBjYWxsYmFja190eXBlXzsKLSAgUmVzdWx0VHlwZSByZXN1bHRfdHlwZV87Ci0gIGJhc2U6OlRpbWVEZWx0YSByZXBvcnRfZGVsYXlfbXNfOwotICBNYXRjaE1vZGUgbWF0Y2hfbW9kZV87Ci0gIE1hdGNoQ291bnQgbWF0Y2hfY291bnRfcGVyX2ZpbHRlcl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2VydmljZS5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zZXJ2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIzMDkxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zZXJ2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxibHVldG9vdGgvc2VydmljZS5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLVNlcnZpY2U6OlNlcnZpY2UoY29uc3QgU2VydmljZSYgb3RoZXIpIHsKLSAgaGFuZGxlXyA9IG90aGVyLmhhbmRsZV87Ci0gIHByaW1hcnlfID0gb3RoZXIucHJpbWFyeV87Ci0gIHV1aWRfID0gb3RoZXIudXVpZF87Ci0gIGNoYXJhY3RlcmlzdGljc18gPSBvdGhlci5jaGFyYWN0ZXJpc3RpY3NfOwotICBpbmNsdWRlZF9zZXJ2aWNlc18gPSBvdGhlci5pbmNsdWRlZF9zZXJ2aWNlc187Ci19Ci0KLVNlcnZpY2UmIFNlcnZpY2U6Om9wZXJhdG9yPShjb25zdCBTZXJ2aWNlJiBvdGhlcikgewotICBpZiAoKnRoaXMgPT0gb3RoZXIpIHJldHVybiAqdGhpczsKLQotICBoYW5kbGVfID0gb3RoZXIuaGFuZGxlXzsKLSAgcHJpbWFyeV8gPSBvdGhlci5wcmltYXJ5XzsKLSAgdXVpZF8gPSBvdGhlci51dWlkXzsKLSAgY2hhcmFjdGVyaXN0aWNzXyA9IG90aGVyLmNoYXJhY3RlcmlzdGljc187Ci0gIGluY2x1ZGVkX3NlcnZpY2VzXyA9IG90aGVyLmluY2x1ZGVkX3NlcnZpY2VzXzsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIFNlcnZpY2U6OkVxdWFscyhjb25zdCBTZXJ2aWNlJiBvdGhlcikgY29uc3QgewotICByZXR1cm4gaGFuZGxlXyA9PSBvdGhlci5oYW5kbGVfICYmIHByaW1hcnlfID09IG90aGVyLnByaW1hcnlfICYmCi0gICAgICAgICB1dWlkXyA9PSBvdGhlci51dWlkXyAmJiBjaGFyYWN0ZXJpc3RpY3NfID09IG90aGVyLmNoYXJhY3RlcmlzdGljc18gJiYKLSAgICAgICAgIGluY2x1ZGVkX3NlcnZpY2VzXyA9PSBvdGhlci5pbmNsdWRlZF9zZXJ2aWNlc187Ci19Ci0KLWJvb2wgU2VydmljZTo6b3BlcmF0b3I9PShjb25zdCBTZXJ2aWNlJiByaHMpIGNvbnN0IHsgcmV0dXJuIEVxdWFscyhyaHMpOyB9Ci0KLWJvb2wgU2VydmljZTo6b3BlcmF0b3IhPShjb25zdCBTZXJ2aWNlJiByaHMpIGNvbnN0IHsgcmV0dXJuICFFcXVhbHMocmhzKTsgfQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NlcnZpY2UuaCBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDNkNmQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJsdWV0b290aC9jaGFyYWN0ZXJpc3RpYy5oPgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotY2xhc3MgU2VydmljZSB7Ci0gcHVibGljOgotICBTZXJ2aWNlKCkgPSBkZWZhdWx0OwotICBTZXJ2aWNlKGNvbnN0IFNlcnZpY2UmIG90aGVyKTsKLSAgU2VydmljZSh1aW50MTZfdCBoYW5kbGUsIGJvb2wgcHJpbWFyeSwgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDaGFyYWN0ZXJpc3RpYz4mIGNoYXJhY3RlcmlzdGljcywKLSAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTZXJ2aWNlPiYgaW5jbHVkZWRfc2VydmljZXMpCi0gICAgICA6IGhhbmRsZV8oaGFuZGxlKSwKLSAgICAgICAgcHJpbWFyeV8ocHJpbWFyeSksCi0gICAgICAgIHV1aWRfKHV1aWQpLAotICAgICAgICBjaGFyYWN0ZXJpc3RpY3NfKGNoYXJhY3RlcmlzdGljcyksCi0gICAgICAgIGluY2x1ZGVkX3NlcnZpY2VzXyhpbmNsdWRlZF9zZXJ2aWNlcyl7fTsKLSAgU2VydmljZSYgb3BlcmF0b3I9KGNvbnN0IFNlcnZpY2UmIG90aGVyKTsKLSAgdmlydHVhbCB+U2VydmljZSgpID0gZGVmYXVsdDsKLQotICAvLyBDb21wYXJpc29uIGZ1bmN0aW9uIGFuZCBvcGVyYXRvci4KLSAgYm9vbCBFcXVhbHMoY29uc3QgU2VydmljZSYgb3RoZXIpIGNvbnN0OwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VydmljZSYgcmhzKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlcnZpY2UmIHJocykgY29uc3Q7Ci0KLSAgdWludDE2X3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQotICBib29sIHByaW1hcnkoKSBjb25zdCB7IHJldHVybiBwcmltYXJ5XzsgfQotICBjb25zdCBVdWlkJiB1dWlkKCkgY29uc3QgeyByZXR1cm4gdXVpZF87IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2hhcmFjdGVyaXN0aWM+JiBjaGFyYWN0ZXJpc3RpY3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJhY3RlcmlzdGljc187Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q2hhcmFjdGVyaXN0aWM+JiBjaGFyYWN0ZXJpc3RpY3MoKSB7IHJldHVybiBjaGFyYWN0ZXJpc3RpY3NfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPFNlcnZpY2U+JiBpbmNsdWRlZF9zZXJ2aWNlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gaW5jbHVkZWRfc2VydmljZXNfOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQxNl90IGhhbmRsZV87Ci0gIGJvb2wgcHJpbWFyeV87Ci0gIFV1aWQgdXVpZF87Ci0gIHN0ZDo6dmVjdG9yPENoYXJhY3RlcmlzdGljPiBjaGFyYWN0ZXJpc3RpY3NfOwotICBzdGQ6OnZlY3RvcjxTZXJ2aWNlPiBpbmNsdWRlZF9zZXJ2aWNlc187Ci19OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5jYyBiL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC91dGlsL2F0b21pY19zdHJpbmcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MzFiNDAuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5oIgotCi1uYW1lc3BhY2UgdXRpbCB7Ci0KLUF0b21pY1N0cmluZzo6QXRvbWljU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDogc3RyXyhzdHIpIHt9Ci0KLXN0ZDo6c3RyaW5nIEF0b21pY1N0cmluZzo6R2V0KCkgY29uc3QgewotICBzdGQ6Om11dGV4KiBtdXRleCA9IGNvbnN0X2Nhc3Q8c3RkOjptdXRleCo+KCZsb2NrXyk7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptdXRleCk7Ci0gIHJldHVybiBzdHJfOwotfQotCi12b2lkIEF0b21pY1N0cmluZzo6U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICBzdHJfID0gc3RyOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5oIGIvc2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3V0aWwvYXRvbWljX3N0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ0NTg4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvY29tbW9uL2JsdWV0b290aC91dGlsL2F0b21pY19zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0KLW5hbWVzcGFjZSB1dGlsIHsKLQotLy8gQSBzaW1wbGUgYXRvbWljIGNvbnRhaW5lciBjbGFzcyBmb3Igc3RkOjpzdHJpbmcuCi1jbGFzcyBBdG9taWNTdHJpbmcgZmluYWwgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQXRvbWljU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICB+QXRvbWljU3RyaW5nKCkgPSBkZWZhdWx0OwotCi0gIHN0ZDo6c3RyaW5nIEdldCgpIGNvbnN0OwotICB2b2lkIFNldChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6bXV0ZXggbG9ja187Ci0gIHN0ZDo6c3RyaW5nIHN0cl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF0b21pY1N0cmluZyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdXRpbApkaWZmIC0tZ2l0IGEvc2VydmljZS9kYWVtb24uY2MgYi9zZXJ2aWNlL2RhZW1vbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkMzg0Mi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2RhZW1vbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvZGFlbW9uLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3J1bl9sb29wLmg+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2cmNwX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9pcGNfbWFuYWdlci5oIgotI2luY2x1ZGUgInNlcnZpY2Uvc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL3N3aXRjaGVzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUgZ2xvYmFsIERhZW1vbiBpbnN0YW5jZS4KLURhZW1vbiogZ19kYWVtb24gPSBudWxscHRyOwotCi1jbGFzcyBEYWVtb25JbXBsIDogcHVibGljIERhZW1vbiwgcHVibGljIGlwYzo6SVBDTWFuYWdlcjo6RGVsZWdhdGUgewotIHB1YmxpYzoKLSAgRGFlbW9uSW1wbCgpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7fQotCi0gIH5EYWVtb25JbXBsKCkgb3ZlcnJpZGUgewotICAgIGlmICghaW5pdGlhbGl6ZWRfKSByZXR1cm47Ci0KLSAgICBDbGVhblVwQmx1ZXRvb3RoU3RhY2soKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRNYWluTG9vcCgpIG92ZXJyaWRlIHsgYmFzZTo6UnVuTG9vcCgpLlJ1bigpOyB9Ci0KLSAgU2V0dGluZ3MqIEdldFNldHRpbmdzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gc2V0dGluZ3NfLmdldCgpOyB9Ci0KLSAgYnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wKiBHZXRNZXNzYWdlTG9vcCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gbWVzc2FnZV9sb29wXy5nZXQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gaXBjOjpJUENNYW5hZ2VyOjpEZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbjoKLSAgdm9pZCBPbklQQ0hhbmRsZXJTdGFydGVkKGlwYzo6SVBDTWFuYWdlcjo6VHlwZSAvKiB0eXBlICovKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFzZXR0aW5nc18tPkVuYWJsZU9uU3RhcnQoKSkgcmV0dXJuOwotICAgIGFkYXB0ZXJfLT5FbmFibGUoKTsKLSAgfQotCi0gIHZvaWQgT25JUENIYW5kbGVyU3RvcHBlZChpcGM6OklQQ01hbmFnZXI6OlR5cGUgLyogdHlwZSAqLykgb3ZlcnJpZGUgewotICAgIC8vIERvIG5vdGhpbmcuCi0gIH0KLQotICBib29sIFN0YXJ0VXBCbHVldG9vdGhJbnRlcmZhY2VzKCkgewotICAgIGlmICghaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkluaXRpYWxpemUoKSkgZ290byBmYWlsZWQ7Ci0KLSAgICBpZiAoIWhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6SW5pdGlhbGl6ZSgpKSBnb3RvIGZhaWxlZDsKLQotICAgIGlmICghaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6SW5pdGlhbGl6ZSgpKSBnb3RvIGZhaWxlZDsKLQotICAgIGlmICghaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6SW5pdGlhbGl6ZSgpKSBnb3RvIGZhaWxlZDsKLQotICAgIHJldHVybiB0cnVlOwotCi0gIGZhaWxlZDoKLSAgICBTaHV0RG93bkJsdWV0b290aEludGVyZmFjZXMoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2b2lkIFNodXREb3duQmx1ZXRvb3RoSW50ZXJmYWNlcygpIHsKLSAgICBpZiAoaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJc0luaXRpYWxpemVkKCkpCi0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsZWFuVXAoKTsKLSAgICBpZiAoaGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OklzSW5pdGlhbGl6ZWQoKSkKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpDbGVhblVwKCk7Ci0gICAgaWYgKGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OklzSW5pdGlhbGl6ZWQoKSkKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkNsZWFuVXAoKTsKLSAgICBpZiAoaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6SXNJbml0aWFsaXplZCgpKQotICAgICAgaGFsOjpCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q2xlYW5VcCgpOwotICB9Ci0KLSAgdm9pZCBDbGVhblVwQmx1ZXRvb3RoU3RhY2soKSB7Ci0gICAgLy8gVGhlIEFkYXB0ZXIgb2JqZWN0IG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgYmVmb3JlIHRoZSBIQUwgaW50ZXJmYWNlcy4KLSAgICBpcGNfbWFuYWdlcl8ucmVzZXQoKTsKLSAgICBhZGFwdGVyXy5yZXNldCgpOwotICAgIFNodXREb3duQmx1ZXRvb3RoSW50ZXJmYWNlcygpOwotICB9Ci0KLSAgYm9vbCBTZXRVcElQQygpIHsKLSAgICAvLyBJZiBhbiBJUEMgc29ja2V0IHBhdGggd2FzIGdpdmVuLCBpbml0aWFsaXplIElQQyB3aXRoIGl0LiBPdGhlcndpc2UKLSAgICAvLyBpbml0aWFsaXplIEJpbmRlciBJUEMuCi0gICAgaWYgKHNldHRpbmdzXy0+VXNlU29ja2V0SVBDKCkpIHsKLSAgICAgIGlmICghaXBjX21hbmFnZXJfLT5TdGFydChpcGM6OklQQ01hbmFnZXI6OlRZUEVfTElOVVgsIHRoaXMpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgdXAgVU5JWCBkb21haW4tc29ja2V0IElQQ01hbmFnZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSNpZiAhZGVmaW5lZChPU19HRU5FUklDKQotICAgIGlmICghaXBjX21hbmFnZXJfLT5TdGFydChpcGM6OklQQ01hbmFnZXI6OlRZUEVfQklOREVSLCB0aGlzKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCB1cCBCaW5kZXIgSVBDTWFuYWdlciI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoIWlwY19tYW5hZ2VyXy0+U3RhcnQoaXBjOjpJUENNYW5hZ2VyOjpUWVBFX0RCVVMsIHRoaXMpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHVwIERCdXMgSVBDTWFuYWdlciI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgSW5pdCgpIG92ZXJyaWRlIHsKLSAgICBDSEVDSyghaW5pdGlhbGl6ZWRfKTsKLSAgICBtZXNzYWdlX2xvb3BfLnJlc2V0KG5ldyBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AoKSk7Ci0KLSAgICBzZXR0aW5nc18ucmVzZXQobmV3IFNldHRpbmdzKCkpOwotICAgIGlmICghc2V0dGluZ3NfLT5Jbml0KCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgdXAgU2V0dGluZ3MiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghU3RhcnRVcEJsdWV0b290aEludGVyZmFjZXMoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCB1cCBIQUwgQmx1ZXRvb3RoIGludGVyZmFjZXMiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGFkYXB0ZXJfID0gQWRhcHRlcjo6Q3JlYXRlKCk7Ci0gICAgaXBjX21hbmFnZXJfLnJlc2V0KG5ldyBpcGM6OklQQ01hbmFnZXIoYWRhcHRlcl8uZ2V0KCkpKTsKLQotICAgIGlmICghU2V0VXBJUEMoKSkgewotICAgICAgQ2xlYW5VcEJsdWV0b290aFN0YWNrKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgICBMT0coSU5GTykgPDwgIkRhZW1vbiBpbml0aWFsaXplZCI7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgaW5pdGlhbGl6ZWRfOwotICBzdGQ6OnVuaXF1ZV9wdHI8YnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wPiBtZXNzYWdlX2xvb3BfOwotICBzdGQ6OnVuaXF1ZV9wdHI8U2V0dGluZ3M+IHNldHRpbmdzXzsKLSAgc3RkOjp1bmlxdWVfcHRyPEFkYXB0ZXI+IGFkYXB0ZXJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8aXBjOjpJUENNYW5hZ2VyPiBpcGNfbWFuYWdlcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERhZW1vbkltcGwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotYm9vbCBEYWVtb246OkluaXRpYWxpemUoKSB7Ci0gIENIRUNLKCFnX2RhZW1vbik7Ci0KLSAgZ19kYWVtb24gPSBuZXcgRGFlbW9uSW1wbCgpOwotICBpZiAoZ19kYWVtb24tPkluaXQoKSkgcmV0dXJuIHRydWU7Ci0KLSAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIERhZW1vbiBvYmplY3QiOwotCi0gIGRlbGV0ZSBnX2RhZW1vbjsKLSAgZ19kYWVtb24gPSBudWxscHRyOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gc3RhdGljCi12b2lkIERhZW1vbjo6U2h1dERvd24oKSB7Ci0gIENIRUNLKGdfZGFlbW9uKTsKLSAgZGVsZXRlIGdfZGFlbW9uOwotICBnX2RhZW1vbiA9IG51bGxwdHI7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBEYWVtb246OkluaXRpYWxpemVGb3JUZXN0aW5nKERhZW1vbiogdGVzdF9kYWVtb24pIHsKLSAgQ0hFQ0sodGVzdF9kYWVtb24pOwotICBDSEVDSyghZ19kYWVtb24pOwotCi0gIGdfZGFlbW9uID0gdGVzdF9kYWVtb247Ci19Ci0KLS8vIHN0YXRpYwotRGFlbW9uKiBEYWVtb246OkdldCgpIHsKLSAgQ0hFQ0soZ19kYWVtb24pOwotICByZXR1cm4gZ19kYWVtb247Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvZGFlbW9uLmggYi9zZXJ2aWNlL2RhZW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFmZTkxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZGFlbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgImFic3RyYWN0X21lc3NhZ2VfbG9vcC5oIgotCi1uYW1lc3BhY2UgaXBjIHsKLWNsYXNzIElQQ01hbmFnZXI7Ci19ICAvLyBuYW1lc3BhY2UgaXBjCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1jbGFzcyBDb3JlU3RhY2s7Ci1jbGFzcyBTZXR0aW5nczsKLQotLy8gVGhlIERhZW1vbiBjbGFzcyBpcyBhIHNpbmdsZXRvbiB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIG93bmVyc2hpcAotLy8gaGllcmFyY2h5LiBUaGUgc2luZ2xlIGluc3RhbmNlIHNldHMgdXAgYW5kIG93bnMgdGhlIG1haW4gZXZlbnQgbG9vcCwgdGhlIElQQwotLy8gaGFuZGxlcnMsIGdsb2JhbCBTZXR0aW5ncywgYW5kIHRoZSBjb3JlIEJsdWV0b290aCBzdGFjay4KLWNsYXNzIERhZW1vbiB7Ci0gcHVibGljOgotICAvLyBJbml0aWFsaXplcyB0aGUgZGFlbW9uLiBUaGlzIG11c3QgYmUgY2FsbGVkIHRvIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgLy8gYXBwbGljYXRpb24gdG8gc2V0IHVwIHRoZSBnbG9iYWwgZGFlbW9uIGluc3RhbmNlIGFuZCBldmVyeXRoaW5nIGl0IG1hbmFnZXMuCi0gIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBhIGZhaWx1cmUuCi0gIHN0YXRpYyBib29sIEluaXRpYWxpemUoKTsKLQotICAvLyBDbGVhbnMgdXAgYWxsIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnbG9iYWwgRGFlbW9uIG9iamVjdC4KLSAgc3RhdGljIHZvaWQgU2h1dERvd24oKTsKLQotICAvLyBBc3NpZ25zIHRoZSBnbG9iYWwgRGFlbW9uIGluc3RhbmNlIGZvciB0ZXN0aW5nLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbQotICAvLyB0ZXN0IGNvZGUuCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemVGb3JUZXN0aW5nKERhZW1vbiogdGVzdF9kYWVtb24pOwotCi0gIC8vIFJldHVybnMgdGhlIHNpbmdsZXRvbiBEYWVtb24gaW5zdGFuY2UuIEFsbCBjbGFzc2VzIGNhbiBpbnRlcmFjdCB3aXRoIHRoZQotICAvLyBEYWVtb24sIG9idGFpbiBpdHMgcmVzb3VyY2VzIGV0YyB1c2luZyB0aGlzIGdldHRlci4KLSAgc3RhdGljIERhZW1vbiogR2V0KCk7Ci0KLSAgLy8gVGhlIGdsb2JhbCBTZXR0aW5ncyBvYmplY3QuIEFsbCBjbGFzc2VzIGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGlzIHRocm91Z2gKLSAgLy8gdGhlIERhZW1vbiBvYmplY3QuCi0gIHZpcnR1YWwgU2V0dGluZ3MqIEdldFNldHRpbmdzKCkgY29uc3QgPSAwOwotCi0gIC8vIFRoZSBtYWluIGV2ZW50IGxvb3AuIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGFueSBldmVudHMgYW5kIGRlbGF5ZWQgdGFza3MKLSAgLy8gdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGRhZW1vbidzIG1haW4gdGhyZWFkLgotICB2aXJ0dWFsIGJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcCogR2V0TWVzc2FnZUxvb3AoKSBjb25zdCA9IDA7Ci0KLSAgLy8gU3RhcnRzIHRoZSBkYWVtb24ncyBtYWluIGxvb3AuCi0gIHZpcnR1YWwgdm9pZCBTdGFydE1haW5Mb29wKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBEYWVtb24oKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkRhZW1vbigpID0gZGVmYXVsdDsKLQotIHByaXZhdGU6Ci0gIC8vIEludGVybmFsIGluc3RhbmNlIGhlbHBlciBjYWxsZWQgYnkgSW5pdGlhbGl6ZSgpLgotICB2aXJ0dWFsIGJvb2wgSW5pdCgpID0gMDsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGFlbW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGgudHh0IGIvc2VydmljZS9kb2MvSUJsdWV0b290aC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjBkYWEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9kb2MvSUJsdWV0b290aC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCaW5kZXIgSVBDIEFQSSBmb3IgdGFsa2luZyB3aXRoIHRoZSBCbHVldG9vdGggc2VydmljZSBhbmQgcGVyZm9ybSBoaWdoLWxldmVsCi0gKiBvcGVyYXRpb25zIG9uIHRoZSBhZGFwdGVyLgotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aCB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEJsdWV0b290aCBhZGFwdGVyIGlzIHBvd2VyZWQgYW5kIHJlYWR5IHRvIHVzZS4gVGhpcwotICAgKiBpcyBlcXVpdmFsZW50IHRvICJnZXRTdGF0ZSgpID09IEFEQVBURVJfU1RBVEVfT04iLgotICAgKi8KLSAgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBCbHVldG9vdGggYWRhcHRlciBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgb25lIG9mCi0gICAqIHRoZSBmb2xsb3dpbmc6Ci0gICAqCi0gICAqICAtIEFEQVBURVJfU1RBVEVfT0ZGID0gMTAKLSAgICogIC0gQURBUFRFUl9TVEFURV9UVVJOSU5HX09OID0gMTEKLSAgICogIC0gQURBUFRFUl9TVEFURV9PTiA9IDEyCi0gICAqICAtIEFEQVBURVJfU1RBVEVfVFVSTklOR19PRkYgPSAxMwotICAgKi8KLSAgaW50IGdldFN0YXRlKCk7Ci0KLSAgLyoqCi0gICAqIFR1cm5zIG9uIHRoZSBCbHVldG9vdGggcmFkaW8uIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIHRoZSBwcm9jZWR1cmUgdG8KLSAgICogYnJpbmcgdGhlIGFkYXB0ZXIgc3RhdGUgZnJvbSBBREFQVEVSX1NUQVRFX09GRiB0byBBREFQVEVSX1NUQVRFX09OLiBSZXR1cm5zCi0gICAqIGZhbHNlLCBpZiB0aGUgc3RhdGUgaXMgbm90IEFEQVBURVJfU1RBVEVfT0ZGIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlCi0gICAqIGluaXRpYXRpbmcgdGhlIG9wZXJhdGlvbi4gT24gc3VjY2VzcywgdGhlIGFkYXB0ZXIgc3RhdGUgd2lsbCBiZQotICAgKiBhc3luY2hyb25vdXNseSB1cGRhdGVkIHRvIEFEQVBURVJfU1RBVEVfVFVSTklOR19PTiBhbmQgZXZlbnR1YWxseSB0bwotICAgKiBBREFQVEVSX1NUQVRFX09OLiBDYWxsZXJzIGNhbiBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhpcyBjYWxsIGJ5IG9ic2VydmluZwotICAgKiB0aGUgSUJsdWV0b290aENhbGxiYWNrLm9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2UgY2FsbGJhY2suCi0gICAqLwotICBib29sZWFuIGVuYWJsZSgpOwotCi0gIC8qKgotICAgKiBUdXJucyBvZmYgdGhlIEJsdWV0b290aCByYWRpby4gVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgdGhlIHByb2NlZHVyZSB0bwotICAgKiBicmluZyB0aGUgYWRhcHRlciBzdGF0ZSBmcm9tIEFEQVBURVJfU1RBVEVfT04gdG8gQURBUFRFUl9TVEFURV9PRkYuIFJldHVybnMKLSAgICogZmFsc2UsIGlmIHRoZSBzdGF0ZSBpcyBub3QgQURBUFRFUl9TVEFURV9PTiBvciBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZQotICAgKiBpbml0aWF0aW5nIHRoZSBvcGVyYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhZGFwdGVyIHN0YXRlIHdpbGwgYmUKLSAgICogYXN5bmNocm9ub3VzbHkgdXBkYXRlZCB0byBBREFQVEVSX1NUQVRFX1RVUk5JTkdfT0ZGIGFuZCBldmVudHVhbGx5IHRvCi0gICAqIEFEQVBURVJfU1RBVEVfT0ZGLiBDYWxsZXJzIGNhbiBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhpcyBjYWxsIGJ5IG9ic2VydmluZwotICAgKiB0aGUgSUJsdWV0b290aENhbGxiYWNrLm9uQmx1ZXRvb3RoU3RhdGVDaGFuZ2UgY2FsbGJhY2suCi0gICAqLwotICBib29sZWFuIGRpc2FibGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRlbnRpdHkgQmx1ZXRvb3RoIERldmljZSBBZGRyZXNzIChCRF9BRERSKSBhc3NpZ25lZCB0byB0aGUKLSAgICogdW5kZXJseWluZyBCbHVldG9vdGggY29udHJvbGxlci4gUmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZm9ybQotICAgKiAiWFg6WFg6WFg6WFg6WFg6WFgiLCB3aGVyZSBlYWNoICJYIiBpcyBhIGhleGFkZWNpbWFsIGRpZ2l0LiBSZXR1cm5zCi0gICAqICIwMDowMDowMDowMDowMDowMCIgaWYgdGhlIGFkZHJlc3MgaXMgbm90IGtub3duLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBjYXNlCi0gICAqIGJlZm9yZSB0aGUgYWRhcHRlciBpcyBlbmFibGVkIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgICovCi0gIFN0cmluZyBnZXRBZGRyZXNzKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgYXNzaWduZWQgdG8gdGhlIEJsdWV0b290aCBhZGFwdGVyLiBUaGlzIGlzIHRoZSBuYW1lIHRoYXQgd2lsbAotICAgKiBiZSBzZWVuIGJ5IHJlbW90ZSBkZXZpY2VzIGR1cmluZyBkaXNjb3ZlcnkuIFJldHVybnMgZmFsc2UgaWYgdGhlIG9wZXJhdGlvbgotICAgKiBmYWlscy4KLSAgICovCi0gIGJvb2xlYW4gc2V0TmFtZShpbiBTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbmFtZSBhc3NpZ25lZCB0byB0aGUgQmx1ZXRvb3RoIGFkYXB0ZXIuIFRoaXMgaXMgdGhlCi0gICAqIG5hbWUgdGhhdCBpcyBzZWVuIGJ5IHJlbW90ZSBkZXZpY2VzIGR1cmluZyBkaXNjb3ZlcnkuIElmIHRoZSBjb250cm9sbGVyIGhhcwotICAgKiBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJlZm9yZSB0aGUgZmlyc3QgdGltZSBpdCBnZXRzIGVuYWJsZWQpLCB0aGlzIHdpbGwKLSAgICogcmV0dXJuICJub3QtaW5pdGlhbGl6ZWQiLgotICAgKi8KLSAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgcmVjZWl2ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIHN0YXRlIHVwZGF0ZXMKLSAgICogZnJvbSB0aGUgYWRhcHRlci4gVGhlIEJsdWV0b290aCBkYWVtb24gd2lsbCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyIHRoaXMgaWYKLSAgICogdGhlIG93bmluZyBwcm9jZXNzIGRpZXMuCi0gICAqLwotICB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soaW4gSUJsdWV0b290aENhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAvKioKLSAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2suCi0gICAqLwotICB2b2lkIHVucmVnaXN0ZXJDYWxsYmFjayhpbiBJQmx1ZXRvb3RoQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZSBtdWx0aS1hZHZlcnRpc2VtZW50IGZlYXR1cmUgaXMgc3VwcG9ydGVkLiBSZXR1cm5zCi0gICAqIGZhbHNlLCBpZiB0aGlzIGRldmljZSBjYW4gb25seSBhZHZlcnRpc2UgYSBzaW5nbGUgaW5zdGFuY2UuCi0gICAqLwotICBib29sZWFuIGlzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBiaW5kZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIExvdy1FbmVyZ3kgZmVhdHVyZXMuCi0gICAqLwotICBJQmx1ZXRvb3RoTG93RW5lcmd5IGdldExvd0VuZXJneUludGVyZmFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgYmluZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCBHQVRUIGNsaWVudC1yb2xlCi0gICAqIGZlYXR1cmVzLgotICAgKi8KLSAgSUJsdWV0b290aEdhdHRDbGllbnQgZ2V0R2F0dENsaWVudEludGVyZmFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgYmluZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCBHQVRUIHNlcnZlci1yb2xlCi0gICAqIGZlYXR1cmVzLgotICAgKi8KLSAgSUJsdWV0b290aEdhdHRTZXJ2ZXIgZ2V0R2F0dFNlcnZlckludGVyZmFjZSgpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9kb2MvSUJsdWV0b290aENhbGxiYWNrLnR4dCBiL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhDYWxsYmFjay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGNkZWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9kb2MvSUJsdWV0b290aENhbGxiYWNrLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQmluZGVyIElQQyBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGFib3V0IHRoZQotICogaGlnaC1sZXZlbCBCbHVldG9vdGggYWRhcHRlciBzdGF0ZS4KLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhDYWxsYmFjayB7Ci0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiB0aGUgYWRhcHRlciBzdGF0ZSBjaGFuZ2VzIGZyb20gfHByZXZfc3RhdGV8IHRvIHxuZXdfc3RhdGV8LgotICAgKi8KLSAgdm9pZCBvbkJsdWV0b290aFN0YXRlQ2hhbmdlKGluIGludCBwcmV2X3N0YXRlLCBpbiBpbnQgbmV3X3N0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0Q2xpZW50LnR4dCBiL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0Q2xpZW50LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmYzkwNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2RvYy9JQmx1ZXRvb3RoR2F0dENsaWVudC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCaW5kZXIgSVBDIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBCbHVldG9vdGggR0FUVCBjbGllbnQtcm9sZQotICogZmVhdHVyZXMuCi0gKiBUT0RPKGFybWFuc2l0byk6IE5vdCB5ZXQgc3VwcG9ydGVkLgotICovCi1pbnRlcmZhY2UgSUJsdWV0b290aEdhdHRDbGllbnQgewotICAvKioKLSAgICogUmVnaXN0ZXJzIGEgY2xpZW50IGFwcGxpY2F0aW9uIHdpdGggdGhpcyBpbnRlcmZhY2UuIFRoaXMgY3JlYXRlcyBhIHVuaXF1ZQotICAgKiBHQVRUIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzczsgZmFsc2UKLSAgICogb3RoZXJ3aXNlLiBJZiBzdWNjZXNzZnVsLCB0aGUgY2FsbGVyIHdpbGwgYmUgYXNzaWduZWQgYSAiY2xpZW50X2lkIiB3aGljaAotICAgKiB3aWxsIGJlIHJlcG9ydGVkIGFzeW5jaHJvbm91c2x5IHZpYQotICAgKiBJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrLm9uUmVnaXN0ZXJlZC4gVGhpcyBJRCBpcyByZXF1aXJlZCB0byBtYWtlCi0gICAqIGNhbGxzIHRvIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBiZWxvdy4KLSAgICovCi0gIGJvb2xlYW4gcmVnaXN0ZXJDbGllbnQoaW4gSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjayBjYWxsYmFjayk7Ci0KLSAgLyoqCi0gICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGNsaWVudCB3aXRoIGludGVyZmFjZSBJRCB8Y2xpZW50X2lkfC4KLSAgICovCi0gIHZvaWQgdW5yZWdpc3RlckNsaWVudChpbiBpbnQgY2xpZW50X2lkKTsKLQotICAvKioKLSAgICogVW5yZWdpc3RlcnMgYWxsIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGllbnRzLgotICAgKi8KLSAgdm9pZCB1bnJlZ2lzdGVyQWxsKCk7Ci0KLSAgLyoqCi0gICAqIFJlZnJlc2hlcyB0aGUgbG9jYWwgY2xpZW50LXNpZGUgYXR0cmlidXRlIGNhY2hlIHRoYXQgbWlycm9ycyB0aGUgYXR0cmlidXRlCi0gICAqIGRhdGFiYXNlIG9mIHJlbW90ZSBkZXZpY2Ugd2l0aCBhZGRyZXNzIHxkZXZpY2VfYWRkcmVzc3wuIFJldHVybnMgZmFsc2UgaW4KLSAgICogY2FzZSBvZiBhbiBlcnJvci4gfGNsaWVudF9pZHwgaXMgdGhlIGlkZW50aWZpZXIgb2J0YWluZWQgdmlhCi0gICAqIHJlZ2lzdGVyQ2xpZW50LgotICAgKi8KLSAgYm9vbGVhbiByZWZyZXNoRGV2aWNlKGluIGludCBjbGllbnRfaWQsIGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEdBVFQgc2VydmljZXMsIGNoYXJhY3RlcmlzdGljcywgYW5kIGRlc2NyaXB0b3JzIG9uIHRoZSByZW1vdGUKLSAgICogZGV2aWNlIHdpdGggYWRkcmVzcyB8ZGV2aWNlX2FkZHJlc3N8IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgY29ycmVzcG9uZGluZwotICAgKiBJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrIGNhbGxiYWNrcy4gQmFzZWQgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBhbmQKLSAgICogYm9uZGluZyBzdGF0ZSwgZWl0aGVyIEdBVFQgc2VydmljZSBkaXNjb3Zlcnkgd2lsbCBiZSBpbml0aWF0ZWQgb3IgdGhlCi0gICAqIHJlc3VsdHMgd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoZSBhdHRyaWJ1dGUgY2FjaGUuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZgotICAgKiBhbiBlcnJvci4gfGNsaWVudF9pZHwgaXMgdGhlIGlkZW50aWZpZXIgb2J0YWluZWQgdmlhIHJlZ2lzdGVyQ2xpZW50LgotICAgKi8KLSAgYm9vbGVhbiBkaXNjb3ZlclNlcnZpY2VzKGluIGludCBjbGllbnRfaWQsIGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcyk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlIGEgcmVhZCByZXF1ZXN0IGZvciB0aGUgcmVtb3RlIGNoYXJhY3RlcmlzdGljIHdpdGggaWRlbnRpZmllcgotICAgKiB8Y2hhcmFjdGVyaXN0aWNfaWR8LiBUaGUgcmVzdWx0IHdpbGwgYmUgYXN5bmNocm9ub3VzbHkgcmVwb3J0ZWQgaW4KLSAgICogSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5vbkNoYXJhY3RlcmlzdGljUmVhZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUKLSAgICogcmVxdWVzdCBjYW5ub3QgYmUgc3RhcnRlZCwgZS5nLiBpZiBhIHJlYWQgaXMgYWxyZWFkeSBwZW5kaW5nIG9uIHRoaXMgcmVtb3RlCi0gICAqIGRldmljZS4gSWYgdGhlIHJlYWQgcmVxdWVzdCBmYWlscyBkdWUgdG8gY2hhcmFjdGVyaXN0aWMgcGVybWlzc2lvbnMsCi0gICAqIHRoaXMgZnVuY3Rpb24gd2lsbCB0cnkgdG8gcmFpc2UgdGhlIGNvbm5lY3Rpb24gc2VjdXJpdHkgbGV2ZWwgYmFzZWQgb24gdGhlCi0gICAqIGNoYXJhY3RlcmlzdGljJ3MgcGVybWlzc2lvbiByZXF1aXJlbWVudHMuIElmIHRoYXQgb3BlcmF0aW9uIGZhaWxzLCB0aGVuIHRoZQotICAgKiB8c3RhdHVzfCBwYXJhbWV0ZXIgb2YgdGhlIG9uQ2hhcmFjdGVyaXN0aWNSZWFkIGNhbGxiYWNrIHdpbGwgY29udGFpbiB0aGUKLSAgICogYXBwcm9wcmlhdGUgQVRUIHByb3RvY29sIGVycm9yIGNvZGUuIHxjbGllbnRfaWR8IGlzIG9idGFpbmVkIHZpYQotICAgKiByZWdpc3RlckNsaWVudC4KLSAgICovCi0gIGJvb2xlYW4gcmVhZENoYXJhY3RlcmlzdGljKGluIGludCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEdhdHRJZGVudGlmaWVyIGNoYXJhY3RlcmlzdGljX2lkKTsKLQotICAvKioKLSAgICogSW5pdGlhdGUgYSB3cml0ZSByZXF1ZXN0IGZvciB0aGUgcmVtb3RlIGNoYXJhY3RlcmlzdGljIHdpdGggaWRlbnRpZmllcgotICAgKiB8Y2hhcmFjdGVyaXN0aWNfaWR8IHdpdGggdGhlIHZhbHVlIHx2YWx1ZXwuIFRoZSB8d3JpdGVfdHlwZXwgcGFyYW1ldGVyCi0gICAqIGluZGljYXRlcyB3aGljaCBvZiB0aGUgZm9sbG93aW5nIEdBVFQgd3JpdGUgcHJvY2VkdXJlIHNob3VsZCBiZSB1c2VkOgotICAgKgotICAgKiAgIC0gV1JJVEVfVFlQRV9ERUZBVUxUICgweDAyKTogUmVndWxhciBXcml0ZSBQcm9jZWR1cmUKLSAgICogICAtIFdSSVRFX1RZUEVfTk9fUkVTUE9OU0UgKDB4MDEpOiBXcml0ZSBXaXRob3V0IFJlc3BvbnNlIHByb2NlZHVyZQotICAgKiAgIC0gV1JJVEVfVFlQRV9TSUdORUQgKDB4MDQpOiBTaWduZWQgV3JpdGUgV2l0aG91dCBSZXNwb25zZSBwcm9jZWR1cmUuCi0gICAqCi0gICAqIFRoZSByZXN1bHQgd2lsbCBiZSBhc3luY2hyb25vdXNseSByZXBvcnRlZCBpbgotICAgKiBJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrLm9uQ2hhcmFjdGVyaXN0aWNXcml0ZS4gUmV0dXJucyBmYWxzZSBpZiB0aGUKLSAgICogcmVxdWVzdCBjYW5ub3QgYmUgc3RhcnRlZC4gSWYgdGhlIHdyaXRlIHJlcXVlc3QgZmFpbHMgZHVlIHRvIGF0dHJpYnV0ZQotICAgKiBwZXJtaXNzaW9ucywgdGhpcyBmdW5jdGlvbiB3aWxsIHRyeSB0byByYWlzZSB0aGUgY29ubmVjdGlvbiBzZWN1cml0eSBsZXZlbAotICAgKiBiYXNlZCBvbiB0aGUgY2hhcmFjdGVyaXN0aWMncyBwZXJtaXNzaW9uIHJlcXVpcmVtZW50cy4gSWYgdGhhdCBvcGVyYXRpb24KLSAgICogZmFpbHMsIHRoZW4gdGhlIHxzdGF0dXN8IHBhcmFtZXRlciBvZiB0aGUgb25DaGFyYWN0ZXJpc3RpY1dyaXRlIGNhbGxiYWNrCi0gICAqIHdpbGwgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgQVRUIHByb3RvY29sIGVycm9yIGNvZGUuIHxjbGllbnRfaWR8IGlzCi0gICAqIG9idGFpbmVkIHZpYSByZWdpc3RlckNsaWVudC4KLSAgICovCi0gIGJvb2xlYW4gd3JpdGVDaGFyYWN0ZXJpc3RpYyhpbiBpbnQgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gR2F0dElkZW50aWZpZXIgY2hhcmFjdGVyaXN0aWNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgd3JpdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJ5dGVbXSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlIGEgcmVhZCByZXF1ZXN0IGZvciB0aGUgcmVtb3RlIGRlc2NyaXB0b3Igd2l0aCBpZGVudGlmaWVyCi0gICAqIHxkZXNjcmlwdG9yX2lkfC4gVGhlIHJlc3VsdCB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IHJlcG9ydGVkIGluCi0gICAqIElCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2sub25EZXNjcmlwdG9yUmVhZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUKLSAgICogcmVxdWVzdCBjYW5ub3QgYmUgc3RhcnRlZCwgZS5nLiBpZiBhIHJlYWQgaXMgYWxyZWFkeSBwZW5kaW5nIG9uIHRoaXMgcmVtb3RlCi0gICAqIGRldmljZS4gSWYgdGhlIHJlYWQgcmVxdWVzdCBmYWlscyBkdWUgdG8gZGVzY3JpcHRvciBwZXJtaXNzaW9ucywKLSAgICogdGhpcyBmdW5jdGlvbiB3aWxsIHRyeSB0byByYWlzZSB0aGUgY29ubmVjdGlvbiBzZWN1cml0eSBsZXZlbCBiYXNlZCBvbiB0aGUKLSAgICogZGVzY3JpcHRvcidzIHBlcm1pc3Npb24gcmVxdWlyZW1lbnRzLiBJZiB0aGF0IG9wZXJhdGlvbiBmYWlscywgdGhlbiB0aGUKLSAgICogfHN0YXR1c3wgcGFyYW1ldGVyIG9mIHRoZSBvbkRlc2NyaXB0b3JSZWFkIGNhbGxiYWNrIHdpbGwgY29udGFpbiB0aGUKLSAgICogYXBwcm9wcmlhdGUgQVRUIHByb3RvY29sIGVycm9yIGNvZGUuIHxjbGllbnRfaWR8IGlzIG9idGFpbmVkIHZpYQotICAgKiByZWdpc3RlckNsaWVudC4KLSAgICovCi0gIGJvb2xlYW4gcmVhZERlc2NyaXB0b3IoaW4gaW50IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbiBHYXR0SWRlbnRpZmllciBkZXNjcmlwdG9yX2lkKTsKLQotICAvKioKLSAgICogSW5pdGlhdGUgYSB3cml0ZSByZXF1ZXN0IGZvciB0aGUgcmVtb3RlIGRlc2NyaXB0b3Igd2l0aCBpZGVudGlmaWVyCi0gICAqIHxkZXNjcmlwdG9yX2lkfCB3aXRoIHRoZSB2YWx1ZSB8dmFsdWV8LiBUaGUgfHdyaXRlX3R5cGV8IHBhcmFtZXRlcgotICAgKiBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGZvbGxvd2luZyBHQVRUIHdyaXRlIHByb2NlZHVyZSBzaG91bGQgYmUgdXNlZDoKLSAgICoKLSAgICogICAtIFdSSVRFX1RZUEVfREVGQVVMVCAoMHgwMik6IFJlZ3VsYXIgd3JpdGUgcHJvY2VkdXJlCi0gICAqICAgLSBXUklURV9UWVBFX05PX1JFU1BPTlNFICgweDAxKTogV3JpdGUgd2l0aG91dCByZXNwb25zZSBwcm9jZWR1cmUKLSAgICogICAtIFdSSVRFX1RZUEVfU0lHTkVEICgweDA0KTogQXV0aGVudGljYXRlZC1zaWduZWQgd3JpdGUgcHJvY2VkdXJlCi0gICAqCi0gICAqIFRoZSByZXN1bHQgd2lsbCBiZSBhc3luY2hyb25vdXNseSByZXBvcnRlZCBpbgotICAgKiBJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrLm9uRGVzY3JpcHRvcldyaXRlLiBSZXR1cm5zIGZhbHNlIGlmIHRoZQotICAgKiByZXF1ZXN0IGNhbm5vdCBiZSBzdGFydGVkLiBJZiB0aGUgd3JpdGUgcmVxdWVzdCBmYWlscyBkdWUgdG8gYXR0cmlidXRlCi0gICAqIHBlcm1pc3Npb25zLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIHJhaXNlIHRoZSBjb25uZWN0aW9uIHNlY3VyaXR5IGxldmVsCi0gICAqIGJhc2VkIG9uIHRoZSBkZXNjcmlwdG9yJ3MgcGVybWlzc2lvbiByZXF1aXJlbWVudHMuIElmIHRoYXQgb3BlcmF0aW9uIGZhaWxzLAotICAgKiB0aGVuIHRoZSB8c3RhdHVzfCBwYXJhbWV0ZXIgb2YgdGhlIG9uRGVzY3JpcHRvcldyaXRlIGNhbGxiYWNrIHdpbGwgY29udGFpbgotICAgKiB0aGUgYXBwcm9wcmlhdGUgQVRUIHByb3RvY29sIGVycm9yIGNvZGUuIHxjbGllbnRfaWR8IGlzIG9idGFpbmVkIHZpYQotICAgKiByZWdpc3RlckNsaWVudC4KLSAgICovCi0gIGJvb2xlYW4gd3JpdGVEZXNjcmlwdG9yKGluIGludCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluIEdhdHRJZGVudGlmaWVyIGRlc2NyaXB0b3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlW10gdmFsdWUpOwotCi0gIC8qKgotICAgKiBFbmFibGVzIGhhbmRsZS12YWx1ZSBub3RpZmljYXRpb25zIGZyb20gdGhlIHJlbW90ZSBjaGFyYWN0ZXJpc3RpYyB3aXRoIElECi0gICAqIHxjaGFyYWN0ZXJpc3RpY19pZHwuIElmIHN1Y2Nlc3NmdWwsIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBzaWduYWxlZCB2aWEKLSAgICogSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5vbk5vdGlmeS4gUmV0dXJucyBmYWxzZSBpZiB0aGUgcmVxdWVzdCBjYW5ub3QKLSAgICogYmUgaW5pdGlhdGVkLiB8Y2xpZW50X2lkfCBpcyBvYnRhaW5lZCB2aWEgcmVnaXN0ZXJDbGllbnQuCi0gICAqLwotICBib29sZWFuIHJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhpbiBpbnQgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBHYXR0SWRlbnRpZmllciBjaGFyYWN0ZXJpc3RpY19pZCk7Ci0KLSAgLyoqCi0gICAqIERpc2FibGVzIGhhbmRsZS12YWx1ZSBub3RpZmljYXRpb25zIGZyb20gdGhlIHJlbW90ZSBjaGFyYWN0ZXJpc3RpYyB3aXRoIElECi0gICAqIHxjaGFyYWN0ZXJpc3RpY19pZHwuIFJldHVybnMgZmFsc2UgaWYgdGhlIHJlcXVlc3QgY2Fubm90IGJlIGluaXRpYXRlZCwgZS5nLgotICAgKiBpZiBub3RpZmljYXRpb25zIGZyb20gdGhpcyBjaGFyYWN0ZXJpc3RpYyBoYXZlIG5vdCBiZWVuIGVuYWJsZWQuCi0gICAqIHxjbGllbnRfaWR8IGlzIG9idGFpbmVkIHZpYSByZWdpc3RlckNsaWVudC4KLSAgICovCi0gIGJvb2xlYW4gdW5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoaW4gaW50IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBHYXR0SWRlbnRpZmllciBjaGFyYWN0ZXJpc3RpY19pZCk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlcyBhIHJlbGlhYmxlIHdyaXRlIHByb2NlZHVyZSBmb3IgdGhlIHJlbW90ZSBkZXZpY2Ugd2l0aCBhZGRyZXNzCi0gICAqIHxkZXZpY2VfYWRkcmVzc3wuIE9uY2UgYSByZWxpYWJsZSB3cml0ZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQsIGFsbAotICAgKiBjYWxscyB0byB3cml0ZUNoYXJhY3RlcmlzdGljIGFyZSBzZW50IHRvIHRoZSByZW1vdGUgZGV2aWNlIGZvciB2ZXJpZmljYXRpb24KLSAgICogYW5kIHF1ZXVlZCB1cCBmb3IgYXRvbWljIGV4ZWN1dGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNhbiB2ZXJpZnkgZWFjaCB3cml0ZQotICAgKiBwYXlsb2FkIHVzaW5nIHRoZSBJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrLm9uQ2hhcmFjdGVyaXN0aWNXcml0ZQotICAgKiBjYWxsYmFjayBhbmQgYWJvcnQgcmVsaWFibGUgd3JpdGUgaW4gY2FzZSBvZiBhIG1pc21hdGNoLiBUaGUgcXVldWVkIHdyaXRlcwotICAgKiB3aWxsIGJlIHByb2Nlc3NlZCBhdG9taWNhbGx5IGJ5IHRoZSByZW1vdGUgZGV2aWNlIGFmdGVyIGNhbGxpbmcKLSAgICogZW5kUmVsaWFibGVXcml0ZS4gUmV0dXJucyBmYWxzZSBpZiB0aGUgcHJvY2VkdXJlIGNhbm5vdCBiZSBzdGFydGVkLCBlLmcuIGlmCi0gICAqIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBlYXJsaWVyLiB8Y2xpZW50X2lkfCBpcyBvYnRhaW5lZCB2aWEKLSAgICogcmVnaXN0ZXJDbGllbnQuCi0gICAqLwotICBib29sZWFuIGJlZ2luUmVsaWFibGVXcml0ZShpbiBpbnQgY2xpZW50X2lkLCBpbiBTdHJpbmcgZGV2aWNlX2FkZHJlc3MpOwotCi0gIC8qKgotICAgKiBFbmRzIGEgcHJldmlvdXNseSBzdGFydGVkIHJlbGlhYmxlIHdyaXRlIHByb2NlZHVyZSBmb3IgdGhlIHJlbW90ZSBkZXZpY2UKLSAgICogd2l0aCBhZGRyZXNzIHxkZXZpY2VfYWRkcmVzc3wuIElmIHxleGVjdXRlfCBpcyB0cnVlLCB0aGVuIGEgcmVxdWVzdCB3aWxsIGJlCi0gICAqIHNlbnQgdG8gZXhlY3V0ZSB0aGUgcXVldWVkIHdyaXRlcywgZWxzZSBhIHJlcXVlc3Qgd2lsbCBiZSBzZW50IHRvIGFib3J0IHRoZQotICAgKiBxdWV1ZWQgd3JpdGVzLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgYSBmYWlsdXJlLCBlLmcuIGlmIGEgcmVsaWFibGUgd3JpdGUKLSAgICogcHJvY2VkdXJlIHdhcyBub3Qgc3RhcnRlZC4gSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5vbkV4ZWN1dGVXcml0ZSB3aWxsCi0gICAqIGJlIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVwb3J0IHRoZSByZXN1bHQgb2YgdGhlIGV4ZWN1dGUgd3JpdGUgcmVxdWVzdC4KLSAgICogfGNsaWVudF9pZHwgaXMgb2J0YWluZWQgdmlhIHJlZ2lzdGVyQ2xpZW50LgotICAgKi8KLSAgYm9vbGVhbiBlbmRSZWxpYWJsZVdyaXRlKGluIGludCBjbGllbnRfaWQsIGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gZXhlY3V0ZSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL2RvYy9JQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrLnR4dCBiL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2sudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTVmY2FjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2sudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQmluZGVyIElQQyBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBjYWxsYmFja3MgcmVsYXRlZCB0byBCbHVldG9vdGggR0FUVAotICogY2xpZW50LXJvbGUgb3BlcmF0aW9ucy4KLSAqIFRPRE8oYXJtYW5zaXRvKTogTm90IHlldCBzdXBwb3J0ZWQuCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjayB7Ci0gIC8qKgotICAgKiBDYWxsZWQgYXMgYSByZXN1bHQgb2YgSUJsdWV0b290aEdhdHRDbGllbnQucmVnaXN0ZXJDbGllbnQuCi0gICAqIHxzdGF0dXN8IHdpbGwgY29udGFpbiBCTEVfU1RBVFVTX1NVQ0NFU1MgKDApIGlmIHRoZSBjbGllbnQgd2FzIHN1Y2Nlc3NmdWxseQotICAgKiByZWdpc3RlcmVkLiB8Y2xpZW50X2lkfCBpcyB0aGUgb3duaW5nIGFwcGxpY2F0aW9uJ3MgdW5pcXVlIEdBVFQgY2xpZW50Ci0gICAqIGhhbmRsZSBhbmQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhlCi0gICAqIElCbHVldG9vdGhHYXR0Q2xpZW50IGludGVyZmFjZS4KLSAgICovCi0gIHZvaWQgb25DbGllbnRSZWdpc3RlcmVkKGluIGludCBzdGF0dXMsIGluIGludCBjbGllbnRfaWQpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgZm9yIGVhY2ggR0FUVCBzZXJ2aWNlIHRoYXQgd2FzIGRpc2NvdmVyZWQgb24gdGhlIHJlbW90ZSBkZXZpY2UuIFRoZQotICAgKiBkZXZpY2UgdGhhdCB0aGlzIHNlcnZpY2UgYmVsb25ncyB0byBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgfHNlcnZpY2VfaWR8Ci0gICAqIHN0cnVjdHVyZS4gfGlzX3ByaW1hcnl8IGlzIHRydWUgaWYgdGhpcyByZWZlcnMgdG8gYSBwcmltYXJ5IHNlcnZpY2UsCi0gICAqIG90aGVyd2lzZSB0aGlzIHJlZmVycyB0byBhIHNlY29uZGFyeSBzZXJ2aWNlLgotICAgKi8KLSAgdm9pZCBvbkdldFNlcnZpY2UoaW4gYm9vbGVhbiBpc19wcmltYXJ5LCBpbiBHYXR0SWRlbnRpZmllciBzZXJ2aWNlX2lkKTsKLQotICAvKioKLSAgICogQ2FsbGVkIGZvciBlYWNoIGluY2x1ZGUgZGVmaW5pdGlvbiB0aGF0IHdhcyBkaXNjb3ZlcmVkIG9uIHRoZSByZW1vdGUKLSAgICogZGV2aWNlLgotICAgKi8KLSAgdm9pZCBvbkdldEluY2x1ZGVkU2VydmljZShpbiBHYXR0SWRlbnRpZmllciBpbmNsdWRlZF9zZXJ2aWNlX2lkKTsKLQotICAvKioKLSAgICogQ2FsbGVkIGZvciBlYWNoIGNoYXJhY3RlcmlzdGljIHRoYXQgd2FzIGRpc2NvdmVyZWQgb24gdGhlIHJlbW90ZSBkZXZpY2UuCi0gICAqIFRoZSBzZXJ2aWNlIHRoYXQgdGhpcyBjaGFyYWN0ZXJpc3RpYyBiZWxvbmdzIHRvIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZQotICAgKiB8Y2hhcmFjdGVyaXN0aWNfaWR8IHN0cnVjdHVyZS4gfHByb3BlcnRpZXN8IGNvbnRhaW5zIHRoZSBiaXRtYXNrIG9mIEdBVFQKLSAgICogY2hhcmFjdGVyaXN0aWMgcHJvcGVydGllcyBhcyBkZWZpbmVkIGluIHRoZSBCbHVldG9vdGggQ29yZSBTcGVjaWZpY2F0aW9uLgotICAgKi8KLSAgdm9pZCBvbkdldENoYXJhY3RlcmlzdGljKGluIEdhdHRJZGVudGlmaWVyIGNoYXJhY3RlcmlzdGljX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IHByb3BlcnRpZXMpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgZm9yIGVhY2ggZGVzY3JpcHRvciB0aGF0IHdhcyBkaXNjb3ZlcmVkIG9uIHRoZSByZW1vdGUgZGV2aWNlLiBUaGUKLSAgICogc2VydmljZSBhbmQgY2hhcmFjdGVyaXN0aWMgdGhhdCB0aGlzIGRlc2NyaXB0b3IgYmVsb25ncyB0byBjYW4gYmUgb2J0YWluZWQKLSAgICogZnJvbSB0aGUgfGRlc2NyaXB0b3JfaWR8IHN0cnVjdHVyZS4KLSAgICovCi0gIHZvaWQgb25HZXREZXNjcmlwdG9yKGluIEdhdHRJZGVudGlmaWVyIGRlc2NyaXB0b3JfaWQpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgdG8gbWFyayB0aGUgZW5kIG9mIEdBVFQgc2VydmljZSBkaXNjb3Zlcnkgb24gdGhlIHJlbW90ZSBkZXZpY2Ugd2l0aAotICAgKiBhZGRyZXNzIHxkZXZpY2VfYWRkcmVzc3wuIHxzdGF0dXN8IHdpbGwgY29udGFpbiBCTEVfU1RBVFVTX1NVQ0NFU1MgKDApIGlmCi0gICAqIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gICAqLwotICB2b2lkIG9uU2VhcmNoQ29tcGxldGUoaW4gU3RyaW5nIGRldmljZV9hZGRyZXNzLCBpbiBpbnQgc3RhdHVzKTsKLQotICAvKioKLSAgICogQ2FsbGVkIGFzIGEgcmVzdWx0IG9mIElCbHVldG9vdGhHYXR0Q2xpZW50LnJlYWRDaGFyYWN0ZXJpc3RpYy4gfHN0YXR1c3wKLSAgICogd2lsbCBjb250YWluIEJMRV9TVEFUVVNfU1VDQ0VTUyAoMCkgb24gc3VjY2VzcyBhbmQgYW4gQVRUIHByb3RvY29sIGVycm9yCi0gICAqIGNvZGUgaW4gY2FzZSBvZiBhbiBlcnJvci4gfGNoYXJhY3RlcmlzdGljX2lkfCByZWZlcnMgdG8gdGhlIGNoYXJhY3RlcmlzdGljCi0gICAqIHRoaXMgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQgb24uIE9uIHN1Y2Nlc3MsIHx2YWx1ZXwgd2lsbCBjb250YWluIHRoZQotICAgKiBjaGFyYWN0ZXJpc3RpYyB2YWx1ZSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIHJlbW90ZSBkZXZpY2UuIFRoaXMgYXJndW1lbnQKLSAgICogY2FuIGJlIGlnbm9yZWQgaW4gY2FzZSBvZiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBvbkNoYXJhY3RlcmlzdGljUmVhZChpbiBpbnQgc3RhdHVzLCBpbiBHYXR0SWRlbnRpZmllciBjaGFyYWN0ZXJpc3RpY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlW10gdmFsdWUpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgYXMgYSByZXN1bHQgb2YgSUJsdWV0b290aEdhdHRDbGllbnQud3JpdGVDaGFyYWN0ZXJpc3RpYy4gfHN0YXR1c3wKLSAgICogd2lsbCBjb250YWluIEJMRV9TVEFUVVNfU1VDQ0VTUyAoMCkgb24gc3VjY2VzcyBhbmQgYW4gQVRUIHByb3RvY29sIGVycm9yCi0gICAqIGNvZGUgaW4gY2FzZSBvZiBhbiBlcnJvci4gfGNoYXJhY3RlcmlzdGljX2lkfCByZWZlcnMgdG8gdGhlIGNoYXJhY3RlcmlzdGljCi0gICAqIHRoaXMgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQgb24uCi0gICAqLwotICB2b2lkIG9uQ2hhcmFjdGVyaXN0aWNXcml0ZShpbiBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBHYXR0SWRlbnRpZmllciBjaGFyYWN0ZXJpc3RpY19pZCk7Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBhcyBhIHJlc3VsdCBvZiBJQmx1ZXRvb3RoR2F0dENsaWVudC5lbmRSZWxpYWJsZVdyaXRlLgotICAgKiB8ZGV2aWNlX2FkZHJlc3N8IHJlZmVycyB0byB0aGUgcmVtb3RlIGRldmljZSB0aGF0IHRoZSBlbmRSZWxpYWJsZVdyaXRlCi0gICAqIG1ldGhvZCB3YXMgY2FsbGVkIG9uLiB8c3RhdHVzfCB3aWxsIGNvbnRhaW4gQkxFX1NUQVRVU19TVUNDRVNTICgwKSBvbgotICAgKiBzdWNjZXNzIGFuZCBhbiBBVFQgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGFuIGVycm9yLgotICAgKi8KLSAgdm9pZCBvbkV4ZWN1dGVXcml0ZShpbiBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsIGluIGludCBzdGF0dXMpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgYXMgYSByZXN1bHQgb2YgSUJsdWV0b290aEdhdHRDbGllbnQucmVhZERlc2NyaXB0b3IuIHxzdGF0dXN8Ci0gICAqIHdpbGwgY29udGFpbiBCTEVfU1RBVFVTX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MgYW5kIGFuIEFUVCBwcm90b2NvbCBlcnJvcgotICAgKiBjb2RlIGluIGNhc2Ugb2YgYW4gZXJyb3IuIHxkZXNjcmlwdG9yX2lkfCByZWZlcnMgdG8gdGhlIGRlc2NyaXB0b3IgdGhpcwotICAgKiBvcGVyYXRpb24gd2FzIHBlcmZvcm1lZCBvbi4gT24gc3VjY2VzcywgfHZhbHVlfCB3aWxsIGNvbnRhaW4gdGhlCi0gICAqIGRlc2NyaXB0b3IgdmFsdWUgdGhhdCB3YXMgcmVhZCBmcm9tIHRoZSByZW1vdGUgZGV2aWNlLiBUaGlzIGFyZ3VtZW50Ci0gICAqIGNhbiBiZSBpZ25vcmVkIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgb25EZXNjcmlwdG9yUmVhZChpbiBpbnQgc3RhdHVzLCBpbiBHYXR0SWRlbnRpZmllciBkZXNjcmlwdG9yX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZVtdIHZhbHVlKTsKLQotICAvKioKLSAgICogQ2FsbGVkIGFzIGEgcmVzdWx0IG9mIElCbHVldG9vdGhHYXR0Q2xpZW50LndyaXRlRGVzY3JpcHRvci4gfHN0YXR1c3wKLSAgICogd2lsbCBjb250YWluIEJMRV9TVEFUVVNfU1VDQ0VTUyAoMCkgb24gc3VjY2VzcyBhbmQgYW4gQVRUIHByb3RvY29sIGVycm9yCi0gICAqIGNvZGUgaW4gY2FzZSBvZiBhbiBlcnJvci4gfGRlc2NyaXB0b3JfaWR8IHJlZmVycyB0byB0aGUgZGVzY3JpcHRvciB0aGlzCi0gICAqIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkIG9uLgotICAgKi8KLSAgdm9pZCBvbkRlc2NyaXB0b3JXcml0ZShpbiBpbnQgc3RhdHVzLCBpbiBHYXR0SWRlbnRpZmllciBkZXNjcmlwdG9yX2lkKTsKLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gaW5jb21pbmcgQVRUIEhhbmRsZS1WYWx1ZSBub3RpZmljYXRpb24gb3IKLSAgICogaW5kaWNhdGlvbiBmb3IgdGhlIGNoYXJhY3RlcmlzdGljIHdpdGggaWRlbnRpZmllciB8Y2hhcmFjdGVyaXN0aWNfaWR8LgotICAgKi8KLSAgdm9pZCBvbk5vdGlmeShpbiBHYXR0SWRlbnRpZmllciBjaGFyYWN0ZXJpc3RpY19pZCwgaW4gYnl0ZVtdIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0U2VydmVyLnR4dCBiL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0U2VydmVyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4MTA5YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2RvYy9JQmx1ZXRvb3RoR2F0dFNlcnZlci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJpbmRlciBJUEMgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIEJsdWV0b290aCBHQVRUIHNlcnZlci1yb2xlCi0gKiBmZWF0dXJlcy4KLSAqLwotaW50ZXJmYWNlIElCbHVldG9vdGhHYXR0U2VydmVyIHsKLSAgLyoqCi0gICAqIFJlZ2lzdGVycyBhIGNsaWVudCBhcHBsaWNhdGlvbiB3aXRoIHRoaXMgaW50ZXJmYWNlLiBUaGlzIGNyZWF0ZXMgYSB1bmlxdWUKLSAgICogR0FUVCBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgY29udGFpbiB0aGUgR0FUVAotICAgKiBzZXJ2aWNlcyBiZWxvbmdpbmcgdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEEgc3BlY2lhbCBpbnRlcmZhY2UgSUQgd2lsbAotICAgKiBiZSByZXR1cm5lZCBpbiBhIGNhbGxiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KLSAgICogR0FUVCBzZXJ2ZXIgb3BlcmF0aW9ucy4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGFuIGVycm9yLgotICAgKi8KLSAgYm9vbGVhbiByZWdpc3RlclNlcnZlcihpbiBJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAvKioKLSAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgc2VydmVyIHdpdGggaW50ZXJmYWNlIElEIHxzZXJ2ZXJfaWZ8LgotICAgKi8KLSAgdm9pZCB1bnJlZ2lzdGVyU2VydmVyKGluIGludCBzZXJ2ZXJfaWYpOwotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVycyBhbGwgcHJldmlvdXNseSByZWdpc3RlcmVkIHNlcnZlcnMuCi0gICAqLwotICB2b2lkIHVucmVnaXN0ZXJBbGwoKTsKLQotICAvKioKLSAgICogQWRkcyBuZXcgR0FUVCBzZXJ2aWNlLiBUaGlzIHdpbGwgZXhlY3V0ZSBzeW5jaHJvbm91c2x5LCBhbmQgcmVzdWx0IGluCi0gICAqIElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sub25TZXJ2aWNlQWRkZWQuCi0gICAqCi0gICAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBib29sZWFuIEFkZFNlcnZpY2UoaW50IHNlcnZlcl9pZCwgaW4gQmx1ZXRvb3RoR2F0dFNlcnZpY2Ugc2VydmljZSk7Ci0KLSAgLyoqCi0gICAqIFNlbmRzIGEgcmVzcG9uc2UgdG8gYSBjdXJyZW50bHkgcGVuZGluZyByZWFkIG9yIHdyaXRlIHJlcXVlc3QuIFRoZSByZXF1ZXN0Ci0gICAqIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sgd2l0aAotICAgKiBhIHVuaXF1ZSB8cmVxdWVzdF9pZHwgd2hpY2ggbXVzdCBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QgYWxvbmcgd2l0aCB0aGUKLSAgICogfGRldmljZV9hZGRyZXNzfCBvZiB0aGUgZGV2aWNlIHRoYXQgdGhlIHJlcXVlc3Qgb3JpZ2luYXRlZCBmcm9tLgotICAgKgotICAgKiBUaGUgfHN0YXR1c3wgZmllbGQgc2hvdWxkIGNvbnRhaW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLiBJbiB0aGUgY2FzZQotICAgKiBvZiBzdWNjZXNzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHBhc3MgaW4gIjAiLiBPdGhlcndpc2UgdGhpcyBzaG91bGQKLSAgICogY29udGFpbiBhbiBBVFQgcHJvdG9jb2wgZXJyb3IgY29kZS4KLSAgICovCi0gIGJvb2xlYW4gc2VuZFJlc3BvbnNlKGluIGludCBzZXJ2ZXJfaWYsIGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IHJlcXVlc3RfaWQsIGluIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGluIGludCBvZmZzZXQsIGluIGJ5dGVbXSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlbmRzIGEgaGFuZGxlLXZhbHVlIG5vdGlmaWNhdGlvbiBvciBpbmRpY2F0aW9uIHRvIHRoZSBkZXZpY2Ugd2l0aCB0aGUKLSAgICogZ2l2ZW4gYWRkcmVzcyBmb3IgdGhlIGNoYXJhY3RlcmlzdGljIHdpdGggdGhlIGdpdmVuIGhhbmRsZS4gfGNvbmZpcm18Ci0gICAqIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSwgaWYgYSBoYW5kbGUtdmFsdWUgaW5kaWNhdGlvbiBzaG91bGQgYmUgc2VudCwgd2hpY2gKLSAgICogd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCB0aGUgcmVtb3RlIGRldmljZSBzZW5kcyBhIGhhbmRsZS12YWx1ZQotICAgKiBjb25maXJtYXRpb24uIFJldHVybnMgZmFsc2UgaWYgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIGlzIHBlbmRpbmcuIE90aGVyd2lzZQotICAgKiByZXBvcnRzIHRoZSByZXN1bHQgYXN5bmNocm9ub3VzbHkgaW4KLSAgICogSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjay5vbk5vdGlmaWNhdGlvblNlbnQuCi0gICAqLwotICBib29sZWFuIHNlbmROb3RpZmljYXRpb24oaW4gaW50IHNlcnZlcl9pZiwgaW4gU3RyaW5nIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gY29uZmlybSwgaW4gYnl0ZVtdIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sudHh0IGIvc2VydmljZS9kb2MvSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWVmYmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9kb2MvSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCaW5kZXIgSVBDIGludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGNhbGxiYWNrcyByZWxhdGVkIHRvIEJsdWV0b290aCBHQVRUCi0gKiBzZXJ2ZXItcm9sZSBvcGVyYXRpb25zLgotICovCi1vbmV3YXkgaW50ZXJmYWNlIElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sgewotICAvKioKLSAgICogQ2FsbGVkIHRvIHJlcG9ydCB0aGUgcmVzdWx0IG9mIGEgY2FsbCB0bwotICAgKiBJQmx1ZXRvb3RoR2F0dFNlcnZlci5yZWdpc3RlclNlcnZlci4gfHN0YXR1c3wgd2lsbCBiZSAwIChvcgotICAgKiBCTEVfU1RBVFVTX1NVQ0NFU1MpIGlmIHRoZSBzZXJ2ZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLiB8c2VydmVyX2lmfAotICAgKiBpcyB0aGUgb3duaW5nIGFwcGxpY2F0aW9uJ3MgdW5pcXVlIEdBVFQgc2VydmVyIGhhbmRsZSBhbmQgY2FuIGJlIHVzZWQgdG8KLSAgICogcGVyZm9ybSBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhlIElCbHVldG9vdGhHYXR0U2VydmVyIGludGVyZmFjZS4KLSAgICovCi0gIHZvaWQgb25TZXJ2ZXJSZWdpc3RlcmVkKGluIGludCBzdGF0dXMsIGluIGludCBzZXJ2ZXJfaWYpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgdG8gcmVwb3J0IHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIElCbHVldG9vdGhHYXR0U2VydmVyLkFkZFNlcnZpY2UuCi0gICAqIEEgfHN0YXR1c3wgb2YgMCBkZW5vdGVzIHN1Y2Nlc3MsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIEdBVFQgc2VydmljZSBoYXMKLSAgICogYmVlbiBwdWJsaXNoZWQgYW5kIGlzIGRpc2NvdmVyYWJsZS4gSW4gdGhpcyBjYXNlIGhhbmRsZXMgb2YgYWRkZWQgc2VydmljZSwKLSAgICogaXQncyBjaGFyYWN0ZXJpc3RpY3MgYW5kIGRlc2NyaXB0b3JzIGFyZSBmaWxsZWQuCi0gICAqLwotICB2b2lkIG9uU2VydmljZUFkZGVkKGluIGludCBzdGF0dXMsIGluIEJsdWV0b290aEdhdHRTZXJ2ZXIgc2VydmljZV9pZCk7Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIHJlYWQgcmVxdWVzdCBmcm9tIHRoZSByZW1vdGUgZGV2aWNlIHdpdGgKLSAgICogYWRkcmVzcyB8ZGV2aWNlX2FkZHJlc3N8IGZvciB0aGUgY2hhcmFjdGVyaXN0aWMgd2l0aCBoYW5kbGUgfGhhbmRsZXwuCi0gICAqIHxvZmZzZXR8IGlzIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyaXN0aWMgdmFsdWUgdGhhdAotICAgKiB0aGUgcmVtb3RlIGRldmljZSB3YW50cyB0byByZWFkIGZyb20uIElmIHxpc19sb25nfCBpcyB0cnVlLCB0aGVuIHRoaXMKLSAgICogcmVxdWVzdCBpcyBwYXJ0IG9mIGEgTG9uZyBSZWFkIHByb2NlZHVyZS4gQW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIGhhbmRsZQotICAgKiB0aGlzIHJlcXVlc3QgYnkgY2FsbGluZyBJQmx1ZXRvb3RoR2F0dFNlcnZlci5zZW5kUmVzcG9uc2Ugd2l0aCB0aGUgZ2l2ZW4KLSAgICogfHJlcXVlc3RfaWR8IGFuZCB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVyaXN0aWMgdmFsdWUuCi0gICAqCi0gICAqIElmIHxvZmZzZXR8IGlzIGludmFsaWQgdGhlbiBzZW5kUmVzcG9uc2Ugc2hvdWxkIGJlIGNhbGxlZCB3aXRoCi0gICAqIEdBVFRfRVJST1JfSU5WQUxJRF9PRkZTRVQuIElmIHxpc19sb25nfCBpcyB0cnVlIGJ1dCB0aGlzIGNoYXJhY3RlcmlzdGljIGlzCi0gICAqIG5vdCBhIGxvbmcgYXR0cmlidXRlIChpLmUuIGl0cyB2YWx1ZSB3b3VsZCBmaXQgd2l0aGluIHRoZSBjdXJyZW50IEFUVCBNVFUpLAotICAgKiB0aGVuIEdBVFRfRVJST1JfQVRUUklCVVRFX05PVF9MT05HIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICovCi0gIHZvaWQgb25DaGFyYWN0ZXJpc3RpY1JlYWRSZXF1ZXN0KGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW4gaW50IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBvZmZzZXQsIGluIGJvb2xlYW4gaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIHJlYWQgcmVxdWVzdCBmcm9tIHRoZSByZW1vdGUgZGV2aWNlIHdpdGgKLSAgICogYWRkcmVzcyB8ZGV2aWNlX2FkZHJlc3N8IGZvciB0aGUgZGVzY3JpcHRvciB3aXRoIGhhbmRsZSB8aGFuZGxlfC4KLSAgICogfG9mZnNldHwgaXMgdGhlIGluZGV4IG9mIHRoZSBkZXNjcmlwdG9yIHZhbHVlIHRoYXQKLSAgICogdGhlIHJlbW90ZSBkZXZpY2Ugd2FudHMgdG8gcmVhZCBmcm9tLiBJZiB8aXNfbG9uZ3wgaXMgdHJ1ZSwgdGhlbiB0aGlzCi0gICAqIHJlcXVlc3QgaXMgcGFydCBvZiBhIExvbmcgUmVhZCBwcm9jZWR1cmUuIEFuIGltcGxlbWVudGF0aW9uIHNob3VsZCBoYW5kbGUKLSAgICogdGhpcyByZXF1ZXN0IGJ5IGNhbGxpbmcgSUJsdWV0b290aEdhdHRTZXJ2ZXIuc2VuZFJlc3BvbnNlIHdpdGggdGhlIGdpdmVuCi0gICAqIHxyZXF1ZXN0X2lkfCBhbmQgdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0b3IgdmFsdWUuCi0gICAqCi0gICAqIElmIHxvZmZzZXR8IGlzIGludmFsaWQgdGhlbiBzZW5kUmVzcG9uc2Ugc2hvdWxkIGJlIGNhbGxlZCB3aXRoCi0gICAqIEdBVFRfRVJST1JfSU5WQUxJRF9PRkZTRVQuIElmIHxpc19sb25nfCBpcyB0cnVlIGJ1dCB0aGlzIGRlc2NyaXB0b3IgaXMKLSAgICogbm90IGEgbG9uZyBhdHRyaWJ1dGUgKGkuZS4gaXRzIHZhbHVlIHdvdWxkIGZpdCB3aXRoaW4gdGhlIGN1cnJlbnQgQVRUIE1UVSksCi0gICAqIHRoZW4gR0FUVF9FUlJPUl9BVFRSSUJVVEVfTk9UX0xPTkcgc2hvdWxkIGJlIHJldHVybmVkLgotICAgKi8KLSAgdm9pZCBvbkRlc2NyaXB0b3JSZWFkUmVxdWVzdChpbiBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsIGluIGludCByZXF1ZXN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBvZmZzZXQsIGluIGJvb2xlYW4gaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgaGFuZGxlKTsKLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gaW5jb21pbmcgd3JpdGUgcmVxdWVzdCBmcm9tIHRoZSByZW1vdGUgZGV2aWNlIHdpdGgKLSAgICogYWRkcmVzcyB8ZGV2aWNlX2FkZHJlc3N8IGZvciB0aGUgY2hhcmFjdGVyaXN0aWMgd2l0aCBoYW5kbGUgfGhhbmRsZXwKLSAgICogd2l0aCB0aGUgdmFsdWUgfHZhbHVlfC4gQW4gaW1wbGVtZW50YXRpb24gc2hvdWxkIGhhbmRsZQotICAgKiB0aGlzIHJlcXVlc3QgYnkgY2FsbGluZyBJQmx1ZXRvb3RoR2F0dFNlcnZlci5zZW5kUmVzcG9uc2Ugd2l0aCB0aGUgZ2l2ZW4KLSAgICogfHJlcXVlc3RfaWR8LiB8b2Zmc2V0fCBpcyB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlcmlzdGljIHZhbHVlIHRoYXQgdGhlCi0gICAqIHJlbW90ZSBkZXZpY2Ugd2FudHMgdG8gd3JpdGUgdG8sIHNvIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBzdGFydGluZyBhdAotICAgKiB8b2Zmc2V0fC4gSWYgfG5lZWRfcmVzcG9uc2V8IGlzIGZhbHNlLCB0aGVuIHRoaXMgaXMgYSAiV3JpdGUgV2l0aG91dAotICAgKiBSZXNwb25zZSIgcHJvY2VkdXJlIGFuZCBzZW5kUmVzcG9uc2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQuIElmCi0gICAqIHxpc19wcmVwYXJlX3dyaXRlfCBpcyB0cnVlLCB0aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbm90IGNvbW1pdCB0aGlzCi0gICAqIHdyaXRlIHVudGlsIGEgY2FsbCB0byBvbkV4ZWN1dGVXcml0ZVJlcXVlc3QgaXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIElmIHxvZmZzZXR8IGlzIGludmFsaWQsIHRoZW4gc2VuZFJlc3BvbnNlIHNob3VsZCBiZSBjYWxsZWQgd2l0aAotICAgKiBHQVRUX0VSUk9SX0lOVkFMSURfT0ZGU0VULgotICAgKi8KLSAgdm9pZCBvbkNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0KGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW4gaW50IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgb2Zmc2V0LCBpbiBib29sZWFuIGlzX3ByZXBhcmVfd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIG5lZWRfcmVzcG9uc2UsIGluIGJ5dGVbXSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBoYW5kbGUpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBhbiBpbmNvbWluZyB3cml0ZSByZXF1ZXN0IGZyb20gdGhlIHJlbW90ZSBkZXZpY2Ugd2l0aAotICAgKiBhZGRyZXNzIHxkZXZpY2VfYWRkcmVzc3wgZm9yIHRoZSBkZXNjcmlwdG9yIHdpdGggaGFuZGxlIHxoYW5kbGV8Ci0gICAqIHdpdGggdGhlIHZhbHVlIHx2YWx1ZXwuIEFuIGltcGxlbWVudGF0aW9uIHNob3VsZCBoYW5kbGUKLSAgICogdGhpcyByZXF1ZXN0IGJ5IGNhbGxpbmcgSUJsdWV0b290aEdhdHRTZXJ2ZXIuc2VuZFJlc3BvbnNlIHdpdGggdGhlIGdpdmVuCi0gICAqIHxyZXF1ZXN0X2lkfC4gfG9mZnNldHwgaXMgdGhlIGluZGV4IG9mIHRoZSBkZXNjcmlwdG9yIHZhbHVlIHRoYXQgdGhlCi0gICAqIHJlbW90ZSBkZXZpY2Ugd2FudHMgdG8gd3JpdGUgdG8sIHNvIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBzdGFydGluZyBhdAotICAgKiB8b2Zmc2V0fC4gSWYgfG5lZWRfcmVzcG9uc2V8IGlzIGZhbHNlLCB0aGVuIHRoaXMgaXMgYSAiV3JpdGUgV2l0aG91dAotICAgKiBSZXNwb25zZSIgcHJvY2VkdXJlIGFuZCBzZW5kUmVzcG9uc2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQuIElmCi0gICAqIHxpc19wcmVwYXJlX3dyaXRlfCBpcyB0cnVlLCB0aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbm90IGNvbW1pdCB0aGlzCi0gICAqIHdyaXRlIHVudGlsIGEgY2FsbCB0byBvbkV4ZWN1dGVXcml0ZVJlcXVlc3QgaXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIElmIHxvZmZzZXR8IGlzIGludmFsaWQsIHRoZW4gc2VuZFJlc3BvbnNlIHNob3VsZCBiZSBjYWxsZWQgd2l0aAotICAgKiBHQVRUX0VSUk9SX0lOVkFMSURfT0ZGU0VULgotICAgKi8KLSAgdm9pZCBvbkRlc2NyaXB0b3JXcml0ZVJlcXVlc3QoaW4gU3RyaW5nIGRldmljZV9hZGRyZXNzLCBpbiBpbnQgcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IG9mZnNldCwgaW4gYm9vbGVhbiBpc19wcmVwYXJlX3dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBib29sZWFuIG5lZWRfcmVzcG9uc2UsIGluIGJ5dGVbXSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IGhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIGV4ZWN1dGUtd3JpdGUgcmVxdWVzdCB0byBjb21taXQgb3IgYWJvcnQKLSAgICogcHJldmlvdXNseSBwcmVwYXJlZCB3cml0ZXMuIElmIHxpc19leGVjdXRlfCBpcyB0cnVlLCB0aGVuIHRoZQotICAgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY29tbWl0IGFsbCBwcmV2aW91c2x5IHByZXBhcmVkIHdyaXRlcy4gT3RoZXJ3aXNlIGFsbAotICAgKiBwcmVwYXJlZCB3cml0ZXMgc2hvdWxkIGRyb3BwZWQgKGFib3J0ZWQpLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJlcG9ydCB0aGUKLSAgICogcmVzdWx0IG9mIHRoZSBleGVjdXRlIHdyaXRlIGJ5IGNhbGxpbmcgSUJsdWV0b290aEdhdHRTZXJ2ZXIuc2VuZFJlc3BvbnNlCi0gICAqIHdpdGggdGhlIGdpdmVuIHxyZXF1ZXN0X2lkfC4KLSAgICovCi0gIHZvaWQgb25FeGVjdXRlV3JpdGVSZXF1ZXN0KGluIFN0cmluZyBkZXZpY2VfYWRkcmVzcywgaW4gaW50IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gaXNfZXhlY3V0ZSk7Ci0KLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIHJlc3VsdCBvZiBhIHByZXZpb3VzIGNhbGwgdG8KLSAgICogSUJsdWV0b290aEdhdHRTZXJ2ZXIuc2VuZE5vdGlmaWNhdGlvbi4gSWYgYW4gaW5kaWNhdGlvbiB3YXMgc2VudCwgdGhpcyB3aWxsCi0gICAqIGJlIGNhbGxlZCB3aGVuIHRoZSByZW1vdGUgZGV2aWNlIHNlbmRzIGEgY29uZmlybWF0aW9uIHBhY2tldC4gT3RoZXJ3aXNlCi0gICAqIHRoaXMgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB0aGUgbm90aWZpY2F0aW9uIHBhY2tldCBpcyBzdWNjZXNzZnVsbHkgc2VudAotICAgKiBvdXQgb3ZlciB0aGUgcmFkaW8uCi0gICAqLwotICB2b2lkIG9uTm90aWZpY2F0aW9uU2VudChpbiBTdHJpbmcgZGV2aWNlX2FkZHJlc3MsIGluIGludCBzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS9kb2MvSUJsdWV0b290aExvd0VuZXJneS50eHQgYi9zZXJ2aWNlL2RvYy9JQmx1ZXRvb3RoTG93RW5lcmd5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3YTZjYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2RvYy9JQmx1ZXRvb3RoTG93RW5lcmd5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQmluZGVyIElQQyBBUEkgZm9yIGludGVyYWN0aW5nIHdpdGggQmx1ZXRvb3RoIExvdy1FbmVyZ3kgZmVhdHVyZXMuCi0gKi8KLWludGVyZmFjZSBJQmx1ZXRvb3RoTG93RW5lcmd5IHsKLSAgLyoqCi0gICAqIFJlZ2lzdGVycyBhIGNsaWVudCBhcHBsaWNhdGlvbiB0aGF0IGNhbiBtYW5hZ2UgaXRzIG93biBMb3cgRW5lcmd5Ci0gICAqIGluc3RhbmNlLiBBIHNwZWNpYWwgY2xpZW50IGludGVyZmFjZSBJRCB3aWxsIGJlIHJldHVybmVkIGluIGEgY2FsbGJhY2sgdG8KLSAgICogdGhlIGFwcGxpY2F0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBMb3cgRW5lcmd5IG9wZXJhdGlvbnMuIFJldHVybnMKLSAgICogZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvci4KLSAgICovCi0gIGJvb2xlYW4gcmVnaXN0ZXJDbGllbnQoaW4gSUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAvKioKLSAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2xpZW50IHdpdGggImNsaWVudCBpbnRlcmZhY2UgSUQiCi0gICAqIHxjbGllbnRfaWZ8LgotICAgKi8KLSAgdm9pZCB1bnJlZ2lzdGVyQ2xpZW50KGluIGludCBjbGllbnRfaWYpOwotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVycyBhbGwgcHJldmlvdXNseSByZWdpc3RlcmVkIGNsaWVudHMuCi0gICAqLwotICB2b2lkIHVucmVnaXN0ZXJBbGwoKTsKLQotICAvKiBJbml0aWF0ZXMgYSBCTEUgY29ubmVjdGlvbiBkbyBkZXZpY2Ugd2l0aCBhZGRyZXNzIHxhZGRyZXNzfC4gSWYKLSAgICogfGlzX2RpcmVjdHwgaXMgc2V0LCB1c2UgZGlyZWN0IGNvbm5lY3QgcHJvY2VkdXJlLiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLAotICAgKiBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBib29sZWFuIENvbm5lY3QoaW4gaW50IGNsaWVudF9pZCwgaW4gY29uc3QgY2hhciogYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgIGluIGJvb2xlYW4gaXNfZGlyZWN0KTsKLQotICAvKiBEaXNjb25uZWN0IGZyb20gcHJldmlvdXNseSBjb25uZWN0ZWQgQkxFIGRldmljZSB3aXRoIGFkZHJlc3MgfGFkZHJlc3N8LgotICAgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgYm9vbGVhbiBEaXNjb25uZWN0KGluIGludCBjbGllbnRfaWQsIGluIGNvbnN0IGNoYXIqIGFkZHJlc3MpOwotCi0gIC8qKgotICAgKiBTZW5kcyByZXF1ZXN0IHRvIHNldCBNVFUgdG8gfG10dXwgZm9yIHRoZSBkZXZpY2Ugd2l0aCBhZGRyZXNzIHxhZGRyZXNzfC4KLSAgICogT25NdHVDaGFuZ2VkIGNhbGxiYWNrIHdpbGwgYmUgdHJpZ2dlcmVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY2FsbC4gUmV0dXJucwotICAgKiB0cnVlIHdoZW4gdGhlIGNvbW1hbmQgd2FzIHNlbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gICBib29sZWFuIHNldE10dShpbiBpbnQgY2xpZW50X2lkLCBpbiBjaGFyKiBhZGRyZXNzLCBpbnQgbXR1KTsKLQotICAvKioKLSAgICogSW5pdGlhdGVzIGEgQkxFIGRldmljZSBzY2FuIGZvciB0aGUgc2NhbiBjbGllbnQgd2l0aCBJRCB8Y2xpZW50X2lkfCwgdXNpbmcKLSAgICogdGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB8c2V0dGluZ3N8LiBTY2FuIHJlc3VsdHMgdGhhdCBhcmUgcmVwb3J0ZWQgdG8gdGhlCi0gICAqIGFwcGxpY2F0aW9uIHdpdGggdGhlIGFzc29jaWF0ZWQgSUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrIGV2ZW50IHdpbGwgYmUKLSAgICogZmlsdGVyZWQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgZmlsdGVyaW5nIGJhc2VkIG9uCi0gICAqIHxmaWx0ZXJzfC4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgYm9vbGVhbiBzdGFydFNjYW4oaW4gaW50IGNsaWVudF9pZCwgaW4gU2NhblNldHRpbmdzIHNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICBpbiBTY2FuRmlsdGVyW10gZmlsdGVycyk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgc2NhbiBzZXNzaW9uIGZvciB0aGUgY2xpZW50IHdpdGggSUQKLSAgICogfGNsaWVudF9pZHwuIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIGJvb2xlYW4gc3RvcFNjYW4oaW4gaW50IGNsaWVudF9pZCk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIG11bHRpLWFkdmVydGlzaW5nIGluc3RhbmNlIHVzaW5nIHxhZHZlcnRpc2luZ19kYXRhfCBhbmQKLSAgICogfHNjYW5fcmVzcG9uc2VfZGF0YXwsIGJvdGggb2Ygd2hpY2ggY2FuIGJlIGVtcHR5LiBFYWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMKLSAgICogbXVzdCBjb250YWluIHRoZSByYXcgYWR2ZXJ0aXNpbmcgcGFja2V0LiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdlcmUgYW55Ci0gICAqIHN5bmNocm9ub3VzIGZhaWx1cmVzLCBlLmcuIGlmIHRoZSBhZHZlcnRpc2luZyBvciBzY2FuIHJlc3BvbnNlIGRhdGEgYXJlCi0gICAqIGluY29ycmVjdGx5IGZvcm1hdHRlZC4gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZQotICAgKiBhc3luY2hyb25vdXNseSByZXBvcnRlZCBpbgotICAgKiBJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sub25NdWx0aUFkdmVydGlzZUNhbGxiYWNrLiBTZWUgdGhlIGhlYWRlcnMgaW4KLSAgICogY29tbW9uL2JsdWV0b290aC9iaW5kZXIgZm9yIGRvY3VtZW50YXRpb24gb24gdGhlIEFkdmVydGlzZURhdGEgYW5kCi0gICAqIEFkdmVydGlzZVNldHRpbmdzIGRhdGEgdHlwZXMuCi0gICAqLwotICBib29sZWFuIHN0YXJ0TXVsdGlBZHZlcnRpc2luZyhpbiBpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBZHZlcnRpc2VEYXRhIGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBZHZlcnRpc2VEYXRhIHNjYW5fcmVzcG9uc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQWR2ZXJ0aXNlU2V0dGluZ3Mgc2V0dGluZ3MpOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgcHJldmlvdXNseSBzdGFydGVkIG11bHRpLWFkdmVydGlzaW5nIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4KLSAgICogY2xpZW50LiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgYW4gZXJyb3IsIGUuZy4gdGhpcyBjbGllbnQgaGFzIG5vdCBzdGFydGVkCi0gICAqIGFuIGluc3RhbmNlLgotICAgKi8KLSAgYm9vbGVhbiBzdG9wTXVsdGlBZHZlcnRpc2luZyhpbiBpbnQgY2xpZW50X2lmKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjay50eHQgYi9zZXJ2aWNlL2RvYy9JQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY3Mzc5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZG9jL0lCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJpbmRlciBJUEMgaW50ZXJmYWNlIGZvciByZWNlaXZpbmcgY2FsbGJhY2tzIHJlbGF0ZWQgdG8gQmx1ZXRvb3RoIExvdyBFbmVyZ3kKLSAqIG9wZXJhdGlvbnMuCi0gKi8KLW9uZXdheSBpbnRlcmZhY2UgSUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrIHsKLSAgLyoqCi0gICAqIENhbGxlZCB0byByZXBvcnQgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8KLSAgICogSUJsdWV0b290aExvd0VuZXJneS5yZWdpc3RlckNsaWVudC4gfHN0YXR1c3wgd2lsbCBiZSBCTEVfU1RBVFVTX1NVQ0NFU1MgKDApCi0gICAqIGlmIHRoZSBjbGllbnQgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLiB8Y2xpZW50X2lmfCBpcyB0aGUgb3duaW5nCi0gICAqIGFwcGxpY2F0aW9uJ3MgdW5pcXVlIExvdyBFbmVyZ3kgY2xpZW50IGhhbmRsZSBhbmQgY2FuIGJlIHVzZWQKLSAgICogdG8gcGVyZm9ybSBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gdGhlIElCbHVldG9vdGhMb3dFbmVyZ3kgaW50ZXJmYWNlLgotICAgKi8KLSAgdm9pZCBvbkNsaWVudFJlZ2lzdGVyZWQoaW4gaW50IHN0YXR1cywgaW4gaW50IGNsaWVudF9pZik7Ci0KLSAgLyogQ2FsbGVkIGFzeW5jaHJvbm91c2x5IHRvIG5vdGlmeSB0aGUgZGVsZWdhdGUgb2YgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UuCi0gICAqLwotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGluIGludCBzdGF0dXMsIGluIGludCBjbGllbnRfaWQsIGluIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4gYm9vbCBjb25uZWN0ZWQpOwotCi0gIC8qIENhbGxlZCB0byByZXBvcnQgY3VycmVudCBNVFUgdmFsdWUuIENhbiBiZSBhIHJlc3VsdCBvZiBjYWxsaW5nCi0gICAqIElCbHVldG9vdGhMb3dFbmVyZ3kuc2V0TXR1IG9yIHJlbW90ZSBkZXZpY2UgdHJ5aW5nIHRvIGNoYW5nZSBNVFUuCi0gICAqLwotICB2b2lkIE9uTXR1Q2hhbmdlZChpbiBpbnQgc3RhdHVzLCBpbiBjb25zdCBjaGFyKiBhZGRyZXNzLCBpbiBpbnQgbXR1KTsKLQotICAvKioKLSAgICogQ2FsbGVkIHRvIHJlcG9ydCBCTEUgZGV2aWNlIHNjYW4gcmVzdWx0cyBvbmNlIGEgc2NhbiBzZXNzaW9uIGlzIHN0YXJ0ZWQgZm9yCi0gICAqIHRoaXMgY2xpZW50IHVzaW5nIElCbHVldG9vdGhMb3dFbmVyZ3kuc3RhcnRTY2FuLiB8c2Nhbl9yZXN1bHR8IGNvbnRhaW5zIGFsbAotICAgKiB0aGUgZGF0YSByZWxhdGVkIHRvIHRoZSBkaXNjb3ZlcmVkIEJMRSBkZXZpY2UuCi0gICAqLwotICB2b2lkIG9uU2NhblJlc3VsdChpbiBTY2FuUmVzdWx0IHNjYW5fcmVzdWx0KTsKLQotICAvKioKLSAgICogQ2FsbGVkIHRvIHJlcG9ydCB0aGUgcmVzdWx0IG9mIGEgY2FsbCB0bwotICAgKiBJQmx1ZXRvb3RoTG93RW5lcmd5LnN0YXJ0TXVsdGlBZHZlcnRpc2luZyBvciBzdG9wTXVsdGlBZHZlcnRpc2luZy4KLSAgICovCi0gIHZvaWQgb25NdWx0aUFkdmVydGlzZUNhbGxiYWNrKGluIGludCBzdGF0dXMsIGluIGJvb2xlYW4gaXNfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEFkdmVydGlzZVNldHRpbmdzIHNldHRpbmdzKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvZXhhbXBsZS9oZWFydF9yYXRlL2NvbnN0YW50cy5oIGIvc2VydmljZS9leGFtcGxlL2hlYXJ0X3JhdGUvY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGQ1ZWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9leGFtcGxlL2hlYXJ0X3JhdGUvY29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotCi0vLyBUaGlzIGhlYWRlciBkZWZpbmVzIGNvbnN0YW50cyBzcGVjaWZpYyB0byB0aGUgR0FUVCBIZWFydCBSYXRlIFNlcnZpY2UuCi0KLW5hbWVzcGFjZSBoZWFydF9yYXRlIHsKLQotLy8gSFIgTWVhc3VyZW1lbnQgY2hhcmFjdGVyaXN0aWMgdmFsdWUgZmxhZ3MKLWNvbnN0IHVpbnQ4X3Qga0hSVmFsdWVGb3JtYXQ4Qml0ID0gKDAgPDwgMCk7Ci1jb25zdCB1aW50OF90IGtIUlZhbHVlRm9ybWF0MTZCaXQgPSAoMSA8PCAwKTsKLWNvbnN0IHVpbnQxNl90IGtIUlNlbnNvckNvbnRhY3REZXRlY3RlZCA9ICgzIDw8IDEpOwotY29uc3QgdWludDhfdCBrSFJFbmVyZ3lFeHBlbmRlZFByZXNlbnQgPSAoMSA8PCAzKTsKLQotY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtDQ0NEZXNjcmlwdG9yVXVpZCA9IGJsdWV0b290aDo6VXVpZDo6RnJvbVN0cmluZygiMjkwMiIpOwotY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtIUlNlcnZpY2VVdWlkID0gYmx1ZXRvb3RoOjpVdWlkOjpGcm9tU3RyaW5nKCIxODBEIik7Ci1jb25zdCBibHVldG9vdGg6OlV1aWQga0hSTWVhc3VyZW1lbnRVdWlkID0gYmx1ZXRvb3RoOjpVdWlkOjpGcm9tU3RyaW5nKCIyQTM3Iik7Ci1jb25zdCBibHVldG9vdGg6OlV1aWQga0JvZHlTZW5zb3JMb2NhdGlvblV1aWQgPQotICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbVN0cmluZygiMkEzOCIpOwotY29uc3QgYmx1ZXRvb3RoOjpVdWlkIGtIUkNvbnRyb2xQb2ludFV1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkZyb21TdHJpbmcoIjJBMzkiKTsKLQotY29uc3QgdWludDhfdCBrSFJCb2R5TG9jYXRpb25PdGhlciA9IDA7Ci1jb25zdCB1aW50OF90IGtIUkJvZHlMb2NhdGlvbkNoZXN0ID0gMTsKLWNvbnN0IHVpbnQ4X3Qga0hSQm9keUxvY2F0aW9uV3Jpc3QgPSAyOwotY29uc3QgdWludDhfdCBrSFJCb2R5TG9jYXRpb25GaW5nZXIgPSAzOwotY29uc3QgdWludDhfdCBrSFJCb2R5TG9jYXRpb25IYW5kID0gNDsKLWNvbnN0IHVpbnQ4X3Qga0hSQm9keUxvY2F0aW9uRWFyTG9iZSA9IDU7Ci1jb25zdCB1aW50OF90IGtIUkJvZHlMb2NhdGlvbkZvb3QgPSA2OwotCi19ICAvLyBuYW1lc3BhY2UgaGVhcnRfcmF0ZQpkaWZmIC0tZ2l0IGEvc2VydmljZS9leGFtcGxlL2hlYXJ0X3JhdGUvaGVhcnRfcmF0ZV9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2V4YW1wbGUvaGVhcnRfcmF0ZS9oZWFydF9yYXRlX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZTg3OS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2V4YW1wbGUvaGVhcnRfcmF0ZS9oZWFydF9yYXRlX3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9yYW5kX3V0aWwuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0JuQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTGVBZHZlcnRpc2VyLmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmg+Ci0KLSNpbmNsdWRlICJjb25zdGFudHMuaCIKLSNpbmNsdWRlICJoZWFydF9yYXRlX3NlcnZlci5oIgotCi11c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLQotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0U2VydmljZTsKLQotbmFtZXNwYWNlIGhlYXJ0X3JhdGUgewotCi1jbGFzcyBDTElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjawotICAgIDogcHVibGljIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDTElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaygKLSAgICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aD4gYnQpCi0gICAgICA6IGJ0XyhidCkge30KLQotICAvLyBJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2sgb3ZlcnJpZGVzOgotICBTdGF0dXMgT25BZHZlcnRpc2VyUmVnaXN0ZXJlZChpbnQgc3RhdHVzLCBpbnQgYWR2ZXJ0aXNlcl9pZCkgewotICAgIGlmIChzdGF0dXMgIT0gYmx1ZXRvb3RoOjpCTEVfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikKLSAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIEJMRSBhZHZlcnRpc2VyLCB3aWxsIG5vdCBzdGFydCBhZHZlcnRpc2luZyI7Ci0gICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiUmVnaXN0ZXJlZCBCTEUgYWR2ZXJ0aXNlciB3aXRoIElEOiAiIDw8IGFkdmVydGlzZXJfaWQ7Ci0KLSAgICBTdHJpbmcxNiBuYW1lX3BhcmFtOwotICAgIGJ0Xy0+R2V0TmFtZSgmbmFtZV9wYXJhbSk7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZShTdHJpbmc4KG5hbWVfcGFyYW0pLnN0cmluZygpKTsKLQotICAgIC8qIEFkdmVydGlzaW5nIGRhdGE6IDE2LWJpdCBTZXJ2aWNlIFV1aWQ6IEhlYXJ0IFJhdGUgU2VydmljZSwgVHggcG93ZXIqLwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGF7MHgwMywgYmx1ZXRvb3RoOjprRUlSVHlwZUNvbXBsZXRlMTZCaXRVdWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQsIDB4MTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyLCBibHVldG9vdGg6OmtFSVJUeXBlVHhQb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDB9OwotICAgIGRhdGEucHVzaF9iYWNrKG5hbWUubGVuZ3RoKCkgKyAxKTsKLSAgICBkYXRhLnB1c2hfYmFjayhibHVldG9vdGg6OmtFSVJUeXBlQ29tcGxldGVMb2NhbE5hbWUpOwotICAgIGRhdGEuaW5zZXJ0KGRhdGEuZW5kKCksIG5hbWUuY19zdHIoKSwgbmFtZS5jX3N0cigpICsgbmFtZS5sZW5ndGgoKSk7Ci0KLSAgICBiYXNlOjpUaW1lRGVsdGEgdGltZW91dDsKLQotICAgIGJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3Mgc2V0dGluZ3MoCi0gICAgICAgIGJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3M6Ok1PREVfTE9XX1BPV0VSLCB0aW1lb3V0LAotICAgICAgICBibHVldG9vdGg6OkFkdmVydGlzZVNldHRpbmdzOjpUWF9QT1dFUl9MRVZFTF9NRURJVU0sIHRydWUpOwotCi0gICAgYmx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhIGFkdl9kYXRhKGRhdGEpOwotICAgIGJsdWV0b290aDo6QWR2ZXJ0aXNlRGF0YSBzY2FuX3JzcDsKLQotICAgIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXI+IGJsZTsKLSAgICBidF8tPkdldExlQWR2ZXJ0aXNlckludGVyZmFjZSgmYmxlKTsKLSAgICBib29sIHN0YXJ0X3N0YXR1czsKLSAgICBibGUtPlN0YXJ0TXVsdGlBZHZlcnRpc2luZyhhZHZlcnRpc2VyX2lkLCBhZHZfZGF0YSwgc2Nhbl9yc3AsIHNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydF9zdGF0dXMpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBTdGF0dXMgT25NdWx0aUFkdmVydGlzZUNhbGxiYWNrKAotICAgICAgaW50IHN0YXR1cywgYm9vbCBpc19zdGFydCwKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OmJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3MmIC8qIHNldHRpbmdzICovKSB7Ci0gICAgTE9HKElORk8pIDw8ICJBZHZlcnRpc2luZyIgPDwgKGlzX3N0YXJ0ID8gIiBzdGFydGVkIiA6ICIgc3RvcHBlZCIpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGg+IGJ0XzsKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENMSUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrKTsKLX07Ci0KLUhlYXJ0UmF0ZVNlcnZlcjo6SGVhcnRSYXRlU2VydmVyKAotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aD4gYmx1ZXRvb3RoLAotICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gbWFpbl90YXNrX3J1bm5lciwKLSAgICBib29sIGFkdmVydGlzZSkKLSAgICA6IHNpbXVsYXRpb25fc3RhcnRlZF8oZmFsc2UpLAotICAgICAgYmx1ZXRvb3RoXyhibHVldG9vdGgpLAotICAgICAgc2VydmVyX2lmXygtMSksCi0gICAgICBocl9ub3RpZmljYXRpb25fY291bnRfKDApLAotICAgICAgZW5lcmd5X2V4cGVuZGVkXygwKSwKLSAgICAgIGFkdmVydGlzZV8oYWR2ZXJ0aXNlKSwKLSAgICAgIG1haW5fdGFza19ydW5uZXJfKG1haW5fdGFza19ydW5uZXIpLAotICAgICAgd2Vha19wdHJfZmFjdG9yeV8odGhpcykgewotICBDSEVDSyhibHVldG9vdGhfLmdldCgpKTsKLX0KLQotSGVhcnRSYXRlU2VydmVyOjp+SGVhcnRSYXRlU2VydmVyKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBpZiAoIWdhdHRfLmdldCgpIHx8IHNlcnZlcl9pZl8gPT0gLTEpIHJldHVybjsKLQotICBpZiAoIWFuZHJvaWQ6OklJbnRlcmZhY2U6OmFzQmluZGVyKGdhdHRfLmdldCgpKS0+aXNCaW5kZXJBbGl2ZSgpKSByZXR1cm47Ci0KLSAgLy8gTWFudWFsbHkgdW5yZWdpc3RlciBvdXJzZWx2ZXMgZnJvbSB0aGUgZGFlbW9uLiBJdCdzIGdvb2QgcHJhY3RpY2UgdG8gZG8KLSAgLy8gdGhpcywgZXZlbiB0aG91Z2ggdGhlIGRhZW1vbiB3aWxsIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciB1cyBpZiB0aGlzCi0gIC8vIHByb2Nlc3MgZXhpdHMuCi0gIGdhdHRfLT5VbnJlZ2lzdGVyU2VydmVyKHNlcnZlcl9pZl8pOwotfQotCi1ib29sIEhlYXJ0UmF0ZVNlcnZlcjo6UnVuKGNvbnN0IFJ1bkNhbGxiYWNrJiBjYWxsYmFjaykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotCi0gIGlmIChwZW5kaW5nX3J1bl9jYl8pIHsKLSAgICBMT0coRVJST1IpIDw8ICJBbHJlYWR5IHN0YXJ0ZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEdyYWIgdGhlIElCbHVldG9vdGhHYXR0U2VydmVyIGJpbmRlciBmcm9tIHRoZSBCbHVldG9vdGggZGFlbW9uLgotICBibHVldG9vdGhfLT5HZXRHYXR0U2VydmVySW50ZXJmYWNlKCZnYXR0Xyk7Ci0gIGlmICghZ2F0dF8uZ2V0KCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb2J0YWluIGhhbmRsZSB0byBJQmx1ZXRvb3RoR2F0dFNlcnZlciBpbnRlcmZhY2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFJlZ2lzdGVyIHRoaXMgaW5zdGFuY2UgYXMgYSBHQVRUIHNlcnZlci4gSWYgdGhpcyBjYWxsIHN1Y2NlZWRzLCB3ZSB3aWxsCi0gIC8vIGFzeW5jaHJvbm91c2x5IHJlY2VpdmUgYSBzZXJ2ZXIgSUQgdmlhIHRoZSBPblNlcnZlclJlZ2lzdGVyZWQgY2FsbGJhY2suCi0gIGJvb2wgc3RhdHVzOwotICBnYXR0Xy0+UmVnaXN0ZXJTZXJ2ZXIodGhpcywgJnN0YXR1cyk7Ci0gIGlmICghc3RhdHVzKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggdGhlIHNlcnZlciBpbnRlcmZhY2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHBlbmRpbmdfcnVuX2NiXyA9IGNhbGxiYWNrOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhlYXJ0UmF0ZVNlcnZlcjo6U2NoZWR1bGVOZXh0TWVhc3VyZW1lbnQoKSB7Ci0gIG1haW5fdGFza19ydW5uZXJfLT5Qb3N0RGVsYXllZFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkhlYXJ0UmF0ZVNlcnZlcjo6U2VuZEhlYXJ0UmF0ZU1lYXN1cmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSksCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEpKTsKLX0KLQotdm9pZCBIZWFydFJhdGVTZXJ2ZXI6OlNlbmRIZWFydFJhdGVNZWFzdXJlbWVudCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICAvLyBTZW5kIGEgbm90aWZpY2F0aW9uIG9yIGluZGljYXRpb24gdG8gYWxsIGVuYWJsZWQgZGV2aWNlcy4KLSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBkZXZpY2VfY2NjX21hcF8pIHsKLSAgICB1aW50OF90IGNjY192YWwgPSBpdGVyLnNlY29uZDsKLQotICAgIGlmICghY2NjX3ZhbCkgY29udGludWU7Ci0KLSAgICBmb3VuZCA9IHRydWU7Ci0KLSAgICAvLyBEb24ndCBzZW5kIGEgbm90aWZpY2F0aW9uIGlmIG9uZSBpcyBhbHJlYWR5IHBlbmRpbmcgZm9yIHRoaXMgZGV2aWNlLgotICAgIGlmIChwZW5kaW5nX25vdGlmaWNhdGlvbl9tYXBfW2l0ZXIuZmlyc3RdKSBjb250aW51ZTsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlOwotICAgIEJ1aWxkSGVhcnRSYXRlTWVhc3VyZW1lbnRWYWx1ZSgmdmFsdWUpOwotCi0gICAgYm9vbCBzdGF0dXM7Ci0gICAgZ2F0dF8tPlNlbmROb3RpZmljYXRpb24oc2VydmVyX2lmXywgU3RyaW5nMTYoU3RyaW5nOChpdGVyLmZpcnN0LmNfc3RyKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBocl9tZWFzdXJlbWVudF9oYW5kbGVfLCBmYWxzZSwgdmFsdWUsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMpIHBlbmRpbmdfbm90aWZpY2F0aW9uX21hcF9baXRlci5maXJzdF0gPSB0cnVlOwotICB9Ci0KLSAgLy8gU3RpbGwgZW5hYmxlZCEKLSAgaWYgKGZvdW5kKSB7Ci0gICAgU2NoZWR1bGVOZXh0TWVhc3VyZW1lbnQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBBbGwgY2xpZW50cyBkaXNhYmxlZCBub3RpZmljYXRpb25zLgotICBzaW11bGF0aW9uX3N0YXJ0ZWRfID0gZmFsc2U7Ci0KLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBXZSBzaG91bGQga2VlcCB0cmFjayBvZiBjbG9zZWQgY29ubmVjdGlvbnMgaGVyZSBzbyB0aGF0IHdlCi0gIC8vIGRvbid0IHNlbmQgbm90aWZpY2F0aW9ucyB0byB1bmludGVyZXN0ZWQgY2xpZW50cy4KLX0KLQotdm9pZCBIZWFydFJhdGVTZXJ2ZXI6OkJ1aWxkSGVhcnRSYXRlTWVhc3VyZW1lbnRWYWx1ZSgKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Piogb3V0X3ZhbHVlKSB7Ci0gIENIRUNLKG91dF92YWx1ZSk7ICAvLyBBc3NlcnQgdGhhdCB8b3V0X3ZhbHVlfCBpcyBub3QgbnVsbHB0ci4KLQotICAvLyBEZWZhdWx0IGZsYWdzIGZpZWxkLiBIZXJlIGlzIHdoYXQgd2UgcHV0IGluIHRoZXJlOgotICAvLyAgIEJpdCAwOiAwIC0gOC1iaXQgSGVhcnQgUmF0ZSB2YWx1ZQotICAvLyAgIEJpdHMgMSAmIDI6IDExIC0gU2Vuc29yIGNvbnRhY3QgZmVhdHVyZSBzdXBwb3J0ZWQgYW5kIGNvbnRhY3QgZGV0ZWN0ZWQuCi0gIHVpbnQ4X3QgZmxhZ3MgPSBrSFJWYWx1ZUZvcm1hdDhCaXQgfCBrSFJTZW5zb3JDb250YWN0RGV0ZWN0ZWQ7Ci0KLSAgLy8gT3VyIGRlbW8ncyBoZWFydCByYXRlLiBQaWNrIGEgdmFsdWUgYmV0d2VlbiA5MCBhbmQgMTMwLgotICB1aW50OF90IGhlYXJ0X3JhdGUgPSBiYXNlOjpSYW5kSW50KDkwLCAxMzApOwotCi0gIC8vIE9uIGV2ZXJ5IHRlbnRoIGJlYXQgd2UgaW5jbHVkZSB0aGUgRW5lcmd5IEV4cGVuZGVkIHZhbHVlLgotICBib29sIGluY2x1ZGVfZWUgPSBmYWxzZTsKLSAgaWYgKCEoaHJfbm90aWZpY2F0aW9uX2NvdW50XyAlIDEwKSkgewotICAgIGluY2x1ZGVfZWUgPSB0cnVlOwotICAgIGZsYWdzIHw9IGtIUkVuZXJneUV4cGVuZGVkUHJlc2VudDsKLSAgfQotCi0gIGhyX25vdGlmaWNhdGlvbl9jb3VudF8rKzsKLSAgZW5lcmd5X2V4cGVuZGVkXyA9IHN0ZDo6bWluKFVJTlQxNl9NQVgsIChpbnQpZW5lcmd5X2V4cGVuZGVkXyArIDEpOwotCi0gIC8vIEFkZCBhbGwgdGhlIHZhbHVlIGJ5dGVzLgotICBvdXRfdmFsdWUtPnB1c2hfYmFjayhmbGFncyk7Ci0gIG91dF92YWx1ZS0+cHVzaF9iYWNrKGhlYXJ0X3JhdGUpOwotICBpZiAoaW5jbHVkZV9lZSkgewotICAgIG91dF92YWx1ZS0+cHVzaF9iYWNrKGVuZXJneV9leHBlbmRlZF8pOwotICAgIG91dF92YWx1ZS0+cHVzaF9iYWNrKGVuZXJneV9leHBlbmRlZF8gPj4gOCk7Ci0gIH0KLX0KLQotU3RhdHVzIEhlYXJ0UmF0ZVNlcnZlcjo6T25TZXJ2ZXJSZWdpc3RlcmVkKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICBpZiAoc3RhdHVzICE9IGJsdWV0b290aDo6QkxFX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIEdBVFQgc2VydmVyIjsKLSAgICBwZW5kaW5nX3J1bl9jYl8oZmFsc2UpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAvLyBSZWdpc3RyYXRpb24gc3VjY2VlZGVkLiBTdG9yZSBvdXIgSUQsIGFzIHdlIG5lZWQgaXQgZm9yIEdBVFQgc2VydmVyCi0gIC8vIG9wZXJhdGlvbnMuCi0gIHNlcnZlcl9pZl8gPSBzZXJ2ZXJfaWY7Ci0KLSAgTE9HKElORk8pIDw8ICJIZWFydCBSYXRlIHNlcnZlciByZWdpc3RlcmVkIC0gc2VydmVyX2lmOiAiIDw8IHNlcnZlcl9pZl87Ci0KLSAgYmx1ZXRvb3RoOjpTZXJ2aWNlIGhyU2VydmljZSgwLCB0cnVlLCBrSFJTZXJ2aWNlVXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSFJNZWFzdXJlbWVudFV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmtDaGFyYWN0ZXJpc3RpY1Byb3BlcnR5Tm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MCwga0NDQ0Rlc2NyaXB0b3JVdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZXRvb3RoOjprQXR0cmlidXRlUGVybWlzc2lvblJlYWQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjprQXR0cmlidXRlUGVybWlzc2lvbldyaXRlKX19fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQm9keVNlbnNvckxvY2F0aW9uVXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6a0NoYXJhY3RlcmlzdGljUHJvcGVydHlSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjprQXR0cmlidXRlUGVybWlzc2lvblJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hSQ29udHJvbFBvaW50VXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6a0NoYXJhY3RlcmlzdGljUHJvcGVydHlXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6a0F0dHJpYnV0ZVBlcm1pc3Npb25Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9fX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pOwotCi0gIGJvb2wgb3Bfc3RhdHVzID0gdHJ1ZTsKLQotICBTdGF0dXMgc3RhdCA9IGdhdHRfLT5BZGRTZXJ2aWNlKHNlcnZlcl9pZl8sIChCbHVldG9vdGhHYXR0U2VydmljZSloclNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX3N0YXR1cyk7Ci0gIGlmICghc3RhdC5pc09rKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWRkIHNlcnZpY2UsIHN0YXR1cyBpczogIiAvKjw8IHN0YXQqLzsKLSAgICBwZW5kaW5nX3J1bl9jYl8oZmFsc2UpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIW9wX3N0YXR1cykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhZGQgc2VydmljZSI7Ci0gICAgcGVuZGluZ19ydW5fY2JfKGZhbHNlKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgTE9HKElORk8pIDw8ICJJbml0aWF0ZWQgQWRkU2VydmljZSByZXF1ZXN0IjsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEhlYXJ0UmF0ZVNlcnZlcjo6T25TZXJ2aWNlQWRkZWQoCi0gICAgaW50IHN0YXR1cywgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0U2VydmljZSYgc2VydmljZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotCi0gIGlmIChzdGF0dXMgIT0gYmx1ZXRvb3RoOjpCTEVfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWRkIEhlYXJ0IFJhdGUgc2VydmljZSI7Ci0gICAgcGVuZGluZ19ydW5fY2JfKGZhbHNlKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgaHJfc2VydmljZV9oYW5kbGVfID0gc2VydmljZS5oYW5kbGUoKTsKLSAgaHJfbWVhc3VyZW1lbnRfaGFuZGxlXyA9IHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKClbMF0uaGFuZGxlKCk7Ci0gIGhyX21lYXN1cmVtZW50X2NjY2RfaGFuZGxlXyA9Ci0gICAgICBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcygpWzBdLmRlc2NyaXB0b3JzKClbMF0uaGFuZGxlKCk7Ci0gIGJvZHlfc2Vuc29yX2xvY19oYW5kbGVfID0gc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MoKVsxXS5oYW5kbGUoKTsKLSAgaHJfY29udHJvbF9wb2ludF9oYW5kbGVfID0gc2VydmljZS5jaGFyYWN0ZXJpc3RpY3MoKVsyXS5oYW5kbGUoKTsKLQotICBMT0coSU5GTykgPDwgIkhlYXJ0IFJhdGUgc2VydmljZSBhZGRlZCI7Ci0gIHBlbmRpbmdfcnVuX2NiXyh0cnVlKTsKLQotICBpZiAoYWR2ZXJ0aXNlXykgewotICAgIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXI+IGJsZTsKLSAgICBibHVldG9vdGhfLT5HZXRMZUFkdmVydGlzZXJJbnRlcmZhY2UoJmJsZSk7Ci0gICAgYm9vbCBzdGF0dXM7Ci0gICAgYmxlLT5SZWdpc3RlckFkdmVydGlzZXIobmV3IENMSUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrKGJsdWV0b290aF8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICB9Ci0KLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEhlYXJ0UmF0ZVNlcnZlcjo6T25DaGFyYWN0ZXJpc3RpY1JlYWRSZXF1ZXN0KAotICAgIGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgYm9vbCAvKiBpc19sb25nICovLCBpbnQgaGFuZGxlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0KLSAgLy8gVGhpcyBpcyB3aGVyZSB3ZSBoYW5kbGUgYW4gaW5jb21pbmcgY2hhcmFjdGVyaXN0aWMgcmVhZC4gT25seSB0aGUgYm9keQotICAvLyBzZW5zb3IgbG9jYXRpb24gY2hhcmFjdGVyaXN0aWMgaXMgcmVhZGFibGUuCi0gIENIRUNLKGhhbmRsZSA9PSBib2R5X3NlbnNvcl9sb2NfaGFuZGxlXyk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gIGJsdWV0b290aDo6R0FUVEVycm9yIGVycm9yID0gYmx1ZXRvb3RoOjpHQVRUX0VSUk9SX05PTkU7Ci0gIGlmIChvZmZzZXQgPiAxKQotICAgIGVycm9yID0gYmx1ZXRvb3RoOjpHQVRUX0VSUk9SX0lOVkFMSURfT0ZGU0VUOwotICBlbHNlIGlmIChvZmZzZXQgPT0gMCkKLSAgICB2YWx1ZS5wdXNoX2JhY2soa0hSQm9keUxvY2F0aW9uRm9vdCk7Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGdhdHRfLT5TZW5kUmVzcG9uc2Uoc2VydmVyX2lmXywgZGV2aWNlX2FkZHJlc3MsIHJlcXVlc3RfaWQsIGVycm9yLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWUsICZzdGF0dXMpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgSGVhcnRSYXRlU2VydmVyOjpPbkRlc2NyaXB0b3JSZWFkUmVxdWVzdChjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogaXNfbG9uZyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYW5kbGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICAvLyBUaGlzIGlzIHdoZXJlIHdlIGhhbmRsZSBhbiBpbmNvbWluZyBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9yIHJlYWQuIFRoZXJlCi0gIC8vIGlzIG9ubHkgb25lIGRlc2NyaXB0b3IuCi0gIGlmIChoYW5kbGUgIT0gaHJfbWVhc3VyZW1lbnRfY2NjZF9oYW5kbGVfKSB7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gICAgYm9vbCBzdGF0dXM7Ci0gICAgZ2F0dF8tPlNlbmRSZXNwb25zZShzZXJ2ZXJfaWZfLCBkZXZpY2VfYWRkcmVzcywgcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6R0FUVF9FUlJPUl9BVFRSSUJVVEVfTk9UX0ZPVU5ELCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgJnN0YXR1cyk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIC8vIDE2LWJpdCB2YWx1ZSBlbmNvZGVkIGFzIGxpdHRsZS1lbmRpYW4uCi0gIGNvbnN0IHVpbnQ4X3QgdmFsdWVfYnl0ZXNbXSA9IHsKLSAgICAgIGRldmljZV9jY2NfbWFwX1tzdGQ6OnN0cmluZyhTdHJpbmc4KGRldmljZV9hZGRyZXNzKS5zdHJpbmcoKSldLCAweDAwfTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgYmx1ZXRvb3RoOjpHQVRURXJyb3IgZXJyb3IgPSBibHVldG9vdGg6OkdBVFRfRVJST1JfTk9ORTsKLSAgaWYgKG9mZnNldCA+IDIpCi0gICAgZXJyb3IgPSBibHVldG9vdGg6OkdBVFRfRVJST1JfSU5WQUxJRF9PRkZTRVQ7Ci0gIGVsc2UKLSAgICB2YWx1ZS5pbnNlcnQodmFsdWUuYmVnaW4oKSwgdmFsdWVfYnl0ZXMgKyBvZmZzZXQsIHZhbHVlX2J5dGVzICsgMiAtIG9mZnNldCk7Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGdhdHRfLT5TZW5kUmVzcG9uc2Uoc2VydmVyX2lmXywgZGV2aWNlX2FkZHJlc3MsIHJlcXVlc3RfaWQsIGVycm9yLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWUsICZzdGF0dXMpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgSGVhcnRSYXRlU2VydmVyOjpPbkNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0KAotICAgIGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgYm9vbCBpc19wcmVwYXJlX3dyaXRlLCBib29sIG5lZWRfcmVzcG9uc2UsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLCBpbnQgaGFuZGxlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xyk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZHVtbXk7Ci0KLSAgLy8gVGhpcyBpcyB3aGVyZSB3ZSBoYW5kbGUgYW4gaW5jb21pbmcgY2hhcmFjdGVyaXN0aWMgd3JpdGUuIFRoZSBIZWFydCBSYXRlCi0gIC8vIHNlcnZpY2UgZG9lc24ndCByZWFsbHkgc3VwcG9ydCBwcmVwYXJlZCB3cml0ZXMsIHNvIHdlIGp1c3QgcmVqZWN0IHRoZW0gdG8KLSAgLy8ga2VlcCB0aGluZ3Mgc2ltcGxlLgotICBpZiAoaXNfcHJlcGFyZV93cml0ZSkgewotICAgIGJvb2wgc3RhdHVzOwotICAgIGdhdHRfLT5TZW5kUmVzcG9uc2Uoc2VydmVyX2lmXywgZGV2aWNlX2FkZHJlc3MsIHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkdBVFRfRVJST1JfUkVRVUVTVF9OT1RfU1VQUE9SVEVELCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkdW1teSwgJnN0YXR1cyk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIC8vIEhlYXJ0IFJhdGUgQ29udHJvbCBwb2ludCBpcyB0aGUgb25seSB3cml0YWJsZSBjaGFyYWN0ZXJpc3RpYy4KLSAgQ0hFQ0soaGFuZGxlID09IGhyX2NvbnRyb2xfcG9pbnRfaGFuZGxlXyk7Ci0KLSAgLy8gV3JpdGVzIHRvIHRoZSBIZWFydCBSYXRlIENvbnRyb2wgUG9pbnQgY2hhcmFjdGVyaXN0aWMgbXVzdCBjb250YWluIGEgc2luZ2xlCi0gIC8vIGJ5dGUgd2l0aCB0aGUgdmFsdWUgMHgwMS4KLSAgaWYgKHZhbHVlLnNpemUoKSAhPSAxIHx8IHZhbHVlWzBdICE9IDB4MDEpIHsKLSAgICBib29sIHN0YXR1czsKLSAgICBnYXR0Xy0+U2VuZFJlc3BvbnNlKHNlcnZlcl9pZl8sIGRldmljZV9hZGRyZXNzLCByZXF1ZXN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpHQVRUX0VSUk9SX09VVF9PRl9SQU5HRSwgb2Zmc2V0LCBkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBMT0coSU5GTykgPDwgIkhlYXJ0IFJhdGUgQ29udHJvbCBQb2ludCB3cml0dGVuOyBFbmVyeSBFeHBlbmRlZCByZXNldCEiOwotICBlbmVyZ3lfZXhwZW5kZWRfID0gMDsKLQotICBpZiAoIW5lZWRfcmVzcG9uc2UpIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0KLSAgYm9vbCBzdGF0dXM7Ci0gIGdhdHRfLT5TZW5kUmVzcG9uc2Uoc2VydmVyX2lmXywgZGV2aWNlX2FkZHJlc3MsIHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpHQVRUX0VSUk9SX05PTkUsIG9mZnNldCwgZHVtbXksICZzdGF0dXMpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgSGVhcnRSYXRlU2VydmVyOjpPbkRlc2NyaXB0b3JXcml0ZVJlcXVlc3QoCi0gICAgY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwKLSAgICBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsIGludCBoYW5kbGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkdW1teTsKLQotICAvLyBUaGlzIGlzIHdoZXJlIHdlIGhhbmRsZSBhbiBpbmNvbWluZyBjaGFyYWN0ZXJpc3RpYyB3cml0ZS4gVGhlIEhlYXJ0IFJhdGUKLSAgLy8gc2VydmljZSBkb2Vzbid0IHJlYWxseSBzdXBwb3J0IHByZXBhcmVkIHdyaXRlcywgc28gd2UganVzdCByZWplY3QgdGhlbSB0bwotICAvLyBrZWVwIHRoaW5ncyBzaW1wbGUuCi0gIGlmIChpc19wcmVwYXJlX3dyaXRlKSB7Ci0gICAgYm9vbCBzdGF0dXM7Ci0gICAgZ2F0dF8tPlNlbmRSZXNwb25zZShzZXJ2ZXJfaWZfLCBkZXZpY2VfYWRkcmVzcywgcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6R0FUVF9FUlJPUl9SRVFVRVNUX05PVF9TVVBQT1JURUQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15LCAmc3RhdHVzKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgLy8gQ0NDIGlzIHRoZSBvbmx5IGRlc2NyaXB0b3Igd2UgaGF2ZS4KLSAgQ0hFQ0soaGFuZGxlID09IGhyX21lYXN1cmVtZW50X2NjY2RfaGFuZGxlXyk7Ci0KLSAgLy8gQ0NDIG11c3QgY29udGFpbiAyIGJ5dGVzIGZvciBhIDE2LWJpdCB2YWx1ZSBpbiBsaXR0bGUtZW5kaWFuLiBUaGUgb25seQotICAvLyBhbGxvd2VkIHZhbHVlcyBoZXJlIGFyZSAweDAwMDAgYW5kIDB4MDAwMS4KLSAgaWYgKHZhbHVlLnNpemUoKSAhPSAyIHx8IHZhbHVlWzFdICE9IDB4MDAgfHwgdmFsdWVbMF0gPiAweDAxKSB7Ci0gICAgYm9vbCBzdGF0dXM7Ci0gICAgZ2F0dF8tPlNlbmRSZXNwb25zZShzZXJ2ZXJfaWZfLCBkZXZpY2VfYWRkcmVzcywgcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6R0FUVF9FUlJPUl9DQ0NEX0lNUFJPUEVSTFlfQ09ORklHVVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgZHVtbXksICZzdGF0dXMpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBkZXZpY2VfY2NjX21hcF9bc3RkOjpzdHJpbmcoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCkpXSA9IHZhbHVlWzBdOwotCi0gIExPRyhJTkZPKSA8PCAiSGVhcnQgUmF0ZSBNZWFzdXJlbWVudCBDQ0Mgd3JpdHRlbiAtIGRldmljZTogIiA8PCBkZXZpY2VfYWRkcmVzcwotICAgICAgICAgICAgPDwgIiB2YWx1ZTogIiA8PCAoaW50KXZhbHVlWzBdOwotCi0gIC8vIFN0YXJ0IHRoZSBzaW11bGF0aW9uLgotICBpZiAoIXNpbXVsYXRpb25fc3RhcnRlZF8gJiYgdmFsdWVbMF0pIHsKLSAgICBzaW11bGF0aW9uX3N0YXJ0ZWRfID0gdHJ1ZTsKLSAgICBTY2hlZHVsZU5leHRNZWFzdXJlbWVudCgpOwotICB9Ci0KLSAgaWYgKCFuZWVkX3Jlc3BvbnNlKSByZXR1cm4gU3RhdHVzOjpvaygpOwotCi0gIGJvb2wgc3RhdHVzOwotICBnYXR0Xy0+U2VuZFJlc3BvbnNlKHNlcnZlcl9pZl8sIGRldmljZV9hZGRyZXNzLCByZXF1ZXN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6R0FUVF9FUlJPUl9OT05FLCBvZmZzZXQsIGR1bW15LCAmc3RhdHVzKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEhlYXJ0UmF0ZVNlcnZlcjo6T25FeGVjdXRlV3JpdGVSZXF1ZXN0KGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIGlzX2V4ZWN1dGUgKi8pIHsKLSAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBQcmVwYXJlZCBXcml0ZXMgc28sIHNpbXBseSByZXR1cm4gTm90IFN1cHBvcnRlZCBlcnJvci4KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZHVtbXk7Ci0gIGJvb2wgc3RhdHVzOwotICBnYXR0Xy0+U2VuZFJlc3BvbnNlKHNlcnZlcl9pZl8sIGRldmljZV9hZGRyZXNzLCByZXF1ZXN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6R0FUVF9FUlJPUl9SRVFVRVNUX05PVF9TVVBQT1JURUQsIDAsIGR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotCi0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBIZWFydFJhdGVTZXJ2ZXI6Ok9uTm90aWZpY2F0aW9uU2VudChjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICBMT0coSU5GTykgPDwgIk5vdGlmaWNhdGlvbiB3YXMgc2VudCAtIGRldmljZTogIiA8PCBkZXZpY2VfYWRkcmVzcwotICAgICAgICAgICAgPDwgIiBzdGF0dXM6ICIgPDwgc3RhdHVzOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleF8pOwotICBwZW5kaW5nX25vdGlmaWNhdGlvbl9tYXBfW3N0ZDo6c3RyaW5nKFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLnN0cmluZygpKV0gPQotICAgICAgZmFsc2U7Ci0KLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEhlYXJ0UmF0ZVNlcnZlcjo6T25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCkgewotICBMT0coSU5GTykgPDwgIkNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZCAtIGRldmljZTogIiA8PCBkZXZpY2VfYWRkcmVzcwotICAgICAgICAgICAgPDwgIiBjb25uZWN0ZWQ6ICIgPDwgKGNvbm5lY3RlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotfSAgLy8gbmFtZXNwYWNlIGhlYXJ0X3JhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2UvZXhhbXBsZS9oZWFydF9yYXRlL2hlYXJ0X3JhdGVfc2VydmVyLmggYi9zZXJ2aWNlL2V4YW1wbGUvaGVhcnRfcmF0ZS9oZWFydF9yYXRlX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQ2NjUyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZXhhbXBsZS9oZWFydF9yYXRlL2hlYXJ0X3JhdGVfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaD4KLSNpbmNsdWRlIDxiYXNlL21lbW9yeS93ZWFrX3B0ci5oPgotI2luY2x1ZGUgPGJhc2Uvc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci0KLW5hbWVzcGFjZSBoZWFydF9yYXRlIHsKLQotLy8gSW1wbGVtZW50cyBhbiBleGFtcGxlIEdBVFQgSGVhcnQgUmF0ZSBzZXJ2aWNlLiBUaGlzIGNsYXNzIGVtdWxhdGVzIHRoZQotLy8gYmVoYXZpb3Igb2YgYSBoZWFydCByYXRlIHNlcnZpY2UgYnkgc2VuZGluZyBmYWtlIGhlYXJ0LXJhdGUgcHVsc2VzLgotY2xhc3MgSGVhcnRSYXRlU2VydmVyCi0gICAgOiBwdWJsaWMgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbkJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjayB7Ci0gcHVibGljOgotICBIZWFydFJhdGVTZXJ2ZXIoYW5kcm9pZDo6c3A8YW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoPiBibHVldG9vdGgsCi0gICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IG1haW5fdGFza19ydW5uZXIsCi0gICAgICAgICAgICAgICAgICBib29sIGFkdmVydGlzZSk7Ci0gIH5IZWFydFJhdGVTZXJ2ZXIoKSBvdmVycmlkZTsKLQotICAvLyBTZXQgdXAgdGhlIHNlcnZlciBhbmQgcmVnaXN0ZXIgdGhlIEdBVFQgc2VydmljZXMgd2l0aCB0aGUgc3RhY2suIFRoaXMKLSAgLy8gaW5pdGlhdGVzIGEgc2V0IG9mIGFzeW5jaHJvbm91cyBwcm9jZWR1cmVzLiBJbnZva2VzIHxjYWxsYmFja3wKLSAgLy8gYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gIHVzaW5nIFJ1bkNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+OwotICBib29sIFJ1bihjb25zdCBSdW5DYWxsYmFjayYgY2FsbGJhY2spOwotCi0gcHJpdmF0ZToKLSAgLy8gSGVscGVycyBmb3IgcG9zdGluZyBoZWFydCByYXRlIG1lYXN1cmVtZW50IG5vdGlmaWNhdGlvbnMuCi0gIHZvaWQgU2NoZWR1bGVOZXh0TWVhc3VyZW1lbnQoKTsKLSAgdm9pZCBTZW5kSGVhcnRSYXRlTWVhc3VyZW1lbnQoKTsKLSAgdm9pZCBCdWlsZEhlYXJ0UmF0ZU1lYXN1cmVtZW50VmFsdWUoc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dF92YWx1ZSk7Ci0KLSAgLy8gaXBjOjpiaW5kZXI6OklCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sgb3ZlcnJpZGU6Ci0gIFN0YXR1cyBPblNlcnZlclJlZ2lzdGVyZWQoaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZCkgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBPblNlcnZpY2VBZGRlZCgKLSAgICAgIGludCBzdGF0dXMsCi0gICAgICBjb25zdCBhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEdhdHRTZXJ2aWNlJiBzZXJ2aWNlKSBvdmVycmlkZTsKLSAgU3RhdHVzIE9uQ2hhcmFjdGVyaXN0aWNSZWFkUmVxdWVzdChjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFuZGxlKSBvdmVycmlkZTsKLSAgU3RhdHVzIE9uRGVzY3JpcHRvclJlYWRSZXF1ZXN0KGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgaW50IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBib29sIGlzX2xvbmcsIGludCBoYW5kbGUpIG92ZXJyaWRlOwotICBTdGF0dXMgT25DaGFyYWN0ZXJpc3RpY1dyaXRlUmVxdWVzdChjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFuZGxlKSBvdmVycmlkZTsKLSAgU3RhdHVzIE9uRGVzY3JpcHRvcldyaXRlUmVxdWVzdChjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcmVwYXJlX3dyaXRlLCBib29sIG5lZWRfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYW5kbGUpIG92ZXJyaWRlOwotICBTdGF0dXMgT25FeGVjdXRlV3JpdGVSZXF1ZXN0KGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgaW50IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGVjdXRlKSBvdmVycmlkZTsKLSAgU3RhdHVzIE9uTm90aWZpY2F0aW9uU2VudChjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKLQotICAvLyBTaW5nbGUgbXV0ZXggdG8gcHJvdGVjdCBhbGwgdmFyaWFibGVzIGJlbG93LgotICBzdGQ6Om11dGV4IG11dGV4XzsKLQotICAvLyBUaGlzIHN0b3JlcyB3aGV0aGVyIG9yIG5vdCBhdCBsZWFzdCBvbmUgcmVtb3RlIGRldmljZSBoYXMgd3JpdHRlbiB0byB0aGUKLSAgLy8gQ0NDIGRlc2NyaXB0b3IuCi0gIGJvb2wgc2ltdWxhdGlvbl9zdGFydGVkXzsKLQotICAvLyBUaGUgSUJsdWV0b290aCBhbmQgSUJsdWV0b290aEdhdHRTZXJ2ZXIgYmluZGVycyB0aGF0IHdlIHVzZSB0byBjb21tdW5pY2F0ZQotICAvLyB3aXRoIHRoZSBCbHVldG9vdGggZGFlbW9uJ3MgR0FUVCBzZXJ2ZXIgZmVhdHVyZXMuCi0gIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aD4gYmx1ZXRvb3RoXzsKLSAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoR2F0dFNlcnZlcj4gZ2F0dF87Ci0KLSAgLy8gSUQgYXNzaWduZWQgdG8gdXMgYnkgdGhlIGRhZW1vbiB0byBvcGVyYXRlIG9uIG91ciBkZWRpY2F0ZWQgR0FUVCBzZXJ2ZXIKLSAgLy8gaW5zdGFuY2UuCi0gIGludCBzZXJ2ZXJfaWZfOwotCi0gIC8vIENhbGxiYWNrIHBhc3NlZCB0byBSdW4oKS4gV2UgdXNlIHRoaXMgdG8gdGVsbCBtYWluIHRoYXQgYWxsIGF0dHJpYnV0ZXMgaGF2ZQotICAvLyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZGFlbW9uLgotICBSdW5DYWxsYmFjayBwZW5kaW5nX3J1bl9jYl87Ci0KLSAgLy8gU3RvcmVzIHdoZXRoZXIgb3Igbm90IGFuIG91dGdvaW5nIG5vdGlmaWNhdGlvbiBpcyBzdGlsbCBwZW5kaW5nLiBXZSB1c2UKLSAgLy8gdGhpcyB0byB0aHJvdHRsZSBub3RpZmljYXRpb25zIHNvIHRoYXQgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGNvbmdlc3QgdGhlCi0gIC8vIGNvbm5lY3Rpb24uCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgYm9vbD4gcGVuZGluZ19ub3RpZmljYXRpb25fbWFwXzsKLQotICAvLyBUaGUgY3VycmVudCBIUiBub3RpZmljYXRpb24gY291bnQuCi0gIGludCBocl9ub3RpZmljYXRpb25fY291bnRfOwotCi0gIC8vIFRoZSBFbmVyZ3kgRXhwZW5kZWQgdmFsdWUgd2UgdXNlIGluIG91ciBub3RpZmljYXRpb25zLgotICB1aW50MTZfdCBlbmVyZ3lfZXhwZW5kZWRfOwotCi0gIC8vIEhhbmRsZXMgdGhhdCByZWZlciB0byBIZWFydCBSYXRlIFNlcnZpY2UgR0FUVCBvYmplY3RzLgotICAvLyBUaGVzZSByZXR1cm5lZCB0byB1cyBmcm9tIHRoZSBCbHVldG9vdGggZGFlbW9uIGFzIHdlIHBvcHVsYXRlIHRoZSBkYXRhYmFzZS4KLSAgdWludDE2X3QgaHJfc2VydmljZV9oYW5kbGVfOwotICB1aW50MTZfdCBocl9tZWFzdXJlbWVudF9oYW5kbGVfOwotICB1aW50MTZfdCBocl9tZWFzdXJlbWVudF9jY2NkX2hhbmRsZV87Ci0gIHVpbnQxNl90IGJvZHlfc2Vuc29yX2xvY19oYW5kbGVfOwotICB1aW50MTZfdCBocl9jb250cm9sX3BvaW50X2hhbmRsZV87Ci0KLSAgLy8gVGhlIGRhZW1vbiBpdHNlbGYgZG9lc24ndCBtYWludGFpbiBhIENsaWVudCBDaGFyYWN0ZXJpc3RpYyBDb25maWd1cmF0aW9uCi0gIC8vIG1hcHBpbmcsIHNvIHdlIGRvIGl0IG91cnNlbHZlcyBoZXJlLgotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHVpbnQ4X3Q+IGRldmljZV9jY2NfbWFwXzsKLQotICAvLyBXZXRoZXIgd2Ugc2hvdWxkIGFsc28gc3RhcnQgYWR2ZXJ0aXNpbmcKLSAgYm9vbCBhZHZlcnRpc2VfOwotCi0gIC8vIGxpYmNocm9tZSB0YXNrIHJ1bm5lciB0aGF0IHdlIHVzZSB0byBwb3N0IGhlYXJ0IHJhdGUgbWVhc3VyZW1lbnQKLSAgLy8gbm90aWZpY2F0aW9ucyBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gbWFpbl90YXNrX3J1bm5lcl87Ci0KLSAgLy8gV2UgdXNlIHRoaXMgdG8gcGFzcyB3ZWFrX3B0cidzIHRvIGJhc2U6OkJpbmQsIHdoaWNoIHdvbid0IGV4ZWN1dGUgaWYgdGhlCi0gIC8vIEhlYXJ0UmF0ZVNlcnZlciBvYmplY3QgZ2V0cyBkZWxldGVkLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgdXRpbGl0eSBmcm9tCi0gIC8vIGxpYmNocm9tZSBhbmQgd2UgdXNlIGl0IGhlcmUgc2luY2UgYmFzZTo6VGFza1J1bm5lciB1c2VzIGJhc2U6OkNhbGxiYWNrLgotICAvLyBOb3RlOiBUaGlzIHNob3VsZCByZW1haW4gdGhlIGxhc3QgbWVtYmVyIHNvIHRoYXQgaXQnbGwgYmUgZGVzdHJveWVkIGFuZAotICAvLyBpbnZhbGlkYXRlIGl0cyB3ZWFrIHBvaW50ZXJzIGJlZm9yZSBhbnkgb3RoZXIgbWVtYmVycyBhcmUgZGVzdHJveWVkLgotICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxIZWFydFJhdGVTZXJ2ZXI+IHdlYWtfcHRyX2ZhY3RvcnlfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihIZWFydFJhdGVTZXJ2ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhlYXJ0X3JhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2UvZXhhbXBsZS9oZWFydF9yYXRlL3NlcnZlcl9tYWluLmNjIGIvc2VydmljZS9leGFtcGxlL2hlYXJ0X3JhdGUvc2VydmVyX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTUzZjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9leGFtcGxlL2hlYXJ0X3JhdGUvc2VydmVyX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxiYXNlL2F0X2V4aXQuaD4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NvbW1hbmRfbGluZS5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3J1bl9sb29wLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5oPgotCi0jaW5jbHVkZSAiYWJzdHJhY3RfbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAiaGVhcnRfcmF0ZV9zZXJ2ZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjpPSzsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aDsKLQotdXNpbmcgYW5kcm9pZDo6Z2V0U2VydmljZTsKLQotbmFtZXNwYWNlIHsKLQotc3RkOjpzdHJpbmcga1NlcnZpY2VOYW1lID0gImJsdWV0b290aC1zZXJ2aWNlIjsKLQotdm9pZCBRdWl0TWVzc2FnZUxvb3AoKSB7Ci0gIGJhc2U6OlJ1bkxvb3AoKS5RdWl0KCk7Ci19Ci0KLS8vIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIEJsdWV0b290aCBwcm9jZXNzIGRpZXMuCi1jbGFzcyBCbHVldG9vdGhEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBCbHVldG9vdGhEZWF0aFJlY2lwaWVudCgKLSAgICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gbWFpbl90YXNrX3J1bm5lcikKLSAgICAgIDogbWFpbl90YXNrX3J1bm5lcl8obWFpbl90YXNrX3J1bm5lcikge30KLQotICB+Qmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgb3ZlcnJpZGU6Ci0gIHZvaWQgYmluZGVyRGllZChjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpJQmluZGVyPiYgLyogd2hvICovKSBvdmVycmlkZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVGhlIEJsdWV0b290aCBkYWVtb24gaGFzIGRpZWQuIEFib3J0aW5nLiI7Ci0KLSAgICAvLyBiaW5kZXJEaWVkIGV4ZWN1dGVzIG9uIGEgZGVkaWNhdGVkIHRocmVhZC4gV2UgbmVlZCB0byBzdG9wIHRoZSBtYWluIGxvb3AKLSAgICAvLyBvbiB0aGUgbWFpbiB0aHJlYWQgc28gd2UgcG9zdCBhIG1lc3NhZ2UgdG8gaXQgaGVyZS4gVGhlIG1haW4gbG9vcCBvbmx5Ci0gICAgLy8gcnVucyBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gICAgbWFpbl90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgmUXVpdE1lc3NhZ2VMb29wKSk7Ci0KLSAgICBhbmRyb2lkOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5zdG9wUHJvY2VzcygpOwotICB9Ci0KLSBwcml2YXRlOgotICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IG1haW5fdGFza19ydW5uZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgYmFzZTo6QXRFeGl0TWFuYWdlciBleGl0X21hbmFnZXI7Ci0gIGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0KGFyZ2MsIGFyZ3YpOwotICBsb2dnaW5nOjpMb2dnaW5nU2V0dGluZ3MgbG9nX3NldHRpbmdzOwotCi0gIC8vIEluaXRpYWxpemUgZ2xvYmFsIGxvZ2dpbmcgYmFzZWQgb24gY29tbWFuZC1saW5lIHBhcmFtZXRlcnMgKHRoaXMgaXMgYQotICAvLyBsaWJjaHJvbWUgcGF0dGVybikuCi0gIGlmICghbG9nZ2luZzo6SW5pdExvZ2dpbmcobG9nX3NldHRpbmdzKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgdXAgbG9nZ2luZyI7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIC8vIFNldCB1cCBhIG1lc3NhZ2UgbG9vcCBzbyB0aGF0IHdlIGNhbiBzY2hlZHVsZSB0aW1lZCBIZWFydCBSYXRlCi0gIC8vIG5vdGlmaWNhdGlvbnMuCi0gIGJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcCBtYWluX2xvb3A7Ci0KLSAgTE9HKElORk8pIDw8ICJTdGFydGluZyBHQVRUIEhlYXJ0IFJhdGUgU2VydmljZSBzYW1wbGUiOwotCi0gIHNwPElCbHVldG9vdGg+IGJsdWV0b290aDsKLSAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0U2VydmljZShTdHJpbmcxNihrU2VydmljZU5hbWUuY19zdHIoKSksICZibHVldG9vdGgpOwotICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBzZXJ2aWNlIGJpbmRlcjogJyIgPDwga1NlcnZpY2VOYW1lCi0gICAgICAgICAgICAgICA8PCAiJyBzdGF0dXM9IiA8PCBzdGF0dXM7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIC8vIEJsdWV0b290aCBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBvdXIgZGVtbyB0byB3b3JrLgotICBib29sIGVuYWJsZWQ7Ci0gIGJsdWV0b290aC0+SXNFbmFibGVkKCZlbmFibGVkKTsKLSAgaWYgKCFlbmFibGVkKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQmx1ZXRvb3RoIGlzIG5vdCBlbmFibGVkLiI7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIC8vIFJlZ2lzdGVyIGZvciBkZWF0aCBub3RpZmljYXRpb25zIG9uIHRoZSBJQmx1ZXRvb3RoIGJpbmRlci4gVGhpcyBsZXQncyB1cwotICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIEJsdWV0b290aCBkYWVtb24gcHJvY2VzcyAoYmx1ZXRvb3RodGJkKSBkaWVzCi0gIC8vIG91dHNpZGUgb2Ygb3VyIGNvbnRyb2wuCi0gIHNwPEJsdWV0b290aERlYXRoUmVjaXBpZW50PiBkcigKLSAgICAgIG5ldyBCbHVldG9vdGhEZWF0aFJlY2lwaWVudChtYWluX2xvb3AudGFza19ydW5uZXIoKSkpOwotICBpZiAoYW5kcm9pZDo6SUludGVyZmFjZTo6YXNCaW5kZXIoYmx1ZXRvb3RoLmdldCgpKS0+bGlua1RvRGVhdGgoZHIpICE9Ci0gICAgICBhbmRyb2lkOjpOT19FUlJPUikgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWdpc3RlciBEZWF0aFJlY2lwaWVudCBmb3IgSUJsdWV0b290aCI7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgdGhlIEJpbmRlciBwcm9jZXNzIHRocmVhZCBwb29sLiBXZSBoYXZlIHRvIHNldCB0aGlzIHVwLAotICAvLyBvdGhlcndpc2UsIGluY29taW5nIGNhbGxiYWNrcyBmcm9tIHRoZSBCbHVldG9vdGggZGFlbW9uIHdvdWxkIGJsb2NrIHRoZQotICAvLyBtYWluIHRocmVhZCAoaW4gb3RoZXIgd29yZHMsIHdlIGhhdmUgdG8gZG8gdGhpcyBhcyB3ZSBhcmUgYSAiQmluZGVyCi0gIC8vIHNlcnZlciIpLgotICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7Ci0KLSAgLy8gaGVhcnRfcmF0ZTo6SGVhcnRSYXRlU2VydmVyIG5vdGlmaWVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhc3luY2hyb25vdXNseQotICAvLyB1c2luZyBhIGNsb3N1cmUsIHNvIHdlIHNldCB1cCBhIGxhbWJkYSBmb3IgdGhhdCBoZXJlLgotICBhdXRvIGNhbGxiYWNrID0gWyZdKGJvb2wgc3VjY2VzcykgewotICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIkhlYXJ0IFJhdGUgc2VydmljZSBzdGFydGVkIHN1Y2Nlc3NmdWxseSI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKEVSUk9SKSA8PCAiU3RhcnRpbmcgSGVhcnQgUmF0ZSBzZXJ2ZXIgZmFpbGVkIGFzeW5jaHJvbm91c2x5IjsKLSAgICBiYXNlOjpSdW5Mb29wKCkuUXVpdFdoZW5JZGxlKCk7Ci0gIH07Ci0KLSAgYm9vbCBhZHZlcnRpc2UgPQotICAgICAgYmFzZTo6Q29tbWFuZExpbmU6OkZvckN1cnJlbnRQcm9jZXNzKCktPkhhc1N3aXRjaCgiYWR2ZXJ0aXNlIik7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBIZWFydCBSYXRlIHNlcnZlci4KLSAgc3RkOjp1bmlxdWVfcHRyPGhlYXJ0X3JhdGU6OkhlYXJ0UmF0ZVNlcnZlcj4gaHIoCi0gICAgICBuZXcgaGVhcnRfcmF0ZTo6SGVhcnRSYXRlU2VydmVyKGJsdWV0b290aCwgbWFpbl9sb29wLnRhc2tfcnVubmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZSkpOwotICBpZiAoIWhyLT5SdW4oY2FsbGJhY2spKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IEhlYXJ0IFJhdGUgc2VydmVyIjsKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICB9Ci0KLSAgLy8gUnVuIHRoZSBtYWluIGxvb3Agb24gdGhlIG1haW4gcHJvY2VzcyB0aHJlYWQuIEJpbmRlciBjYWxsYmFja3Mgd2lsbCBiZQotICAvLyByZWNlaXZlZCBpbiBkZWRpY2F0ZWQgdGhyZWFkcyBzZXQgdXAgYnkgdGhlIFByb2Nlc3NTdGF0ZTo6c3RhcnRUaHJlYWRQb29sCi0gIC8vIGNhbGwgYWJvdmUgYnV0IHdlIHVzZSB0aGlzIG1haW4gbG9vcCBmb3Igc2VuZGluZyBvdXQgaGVhcnQgcmF0ZQotICAvLyBub3RpZmljYXRpb25zLgotICBiYXNlOjpSdW5Mb29wKCkuUnVuKCk7Ci0KLSAgTE9HKElORk8pIDw8ICJFeGl0aW5nIjsKLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvZ2F0dF9jbGllbnQuY2MgYi9zZXJ2aWNlL2dhdHRfY2xpZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDkxOTQ4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZ2F0dF9jbGllbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2dhdHRfY2xpZW50LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgc3RkOjpsb2NrX2d1YXJkOwotdXNpbmcgc3RkOjptdXRleDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIEdhdHRDbGllbnQgaW1wbGVtZW50YXRpb24KLQotR2F0dENsaWVudDo6R2F0dENsaWVudChjb25zdCBVdWlkJiB1dWlkLCBpbnQgY2xpZW50X2lkKQotICAgIDogYXBwX2lkZW50aWZpZXJfKHV1aWQpLCBjbGllbnRfaWRfKGNsaWVudF9pZCkge30KLQotR2F0dENsaWVudDo6fkdhdHRDbGllbnQoKSB7Ci0gIC8vIEF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciB0aGUgY2xpZW50LgotICBWTE9HKDEpIDw8ICJHYXR0Q2xpZW50IHVucmVnaXN0ZXJpbmcgY2xpZW50OiAiIDw8IGNsaWVudF9pZF87Ci0KLSAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKQotICAgICAgLT5HZXRDbGllbnRIQUxJbnRlcmZhY2UoKQotICAgICAgLT51bnJlZ2lzdGVyX2NsaWVudChjbGllbnRfaWRfKTsKLX0KLQotY29uc3QgVXVpZCYgR2F0dENsaWVudDo6R2V0QXBwSWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIGFwcF9pZGVudGlmaWVyXzsgfQotCi1pbnQgR2F0dENsaWVudDo6R2V0SW5zdGFuY2VJZCgpIGNvbnN0IHsgcmV0dXJuIGNsaWVudF9pZF87IH0KLQotLy8gR2F0dENsaWVudEZhY3RvcnkgaW1wbGVtZW50YXRpb24KLQotR2F0dENsaWVudEZhY3Rvcnk6OkdhdHRDbGllbnRGYWN0b3J5KCkgewotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5BZGRDbGllbnRPYnNlcnZlcih0aGlzKTsKLX0KLQotR2F0dENsaWVudEZhY3Rvcnk6On5HYXR0Q2xpZW50RmFjdG9yeSgpIHsKLSAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+UmVtb3ZlQ2xpZW50T2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLWJvb2wgR2F0dENsaWVudEZhY3Rvcnk6OlJlZ2lzdGVySW5zdGFuY2UoY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIC0gVXVpZDogIiA8PCB1dWlkLlRvU3RyaW5nKCk7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2socGVuZGluZ19jYWxsc19sb2NrXyk7Ci0KLSAgaWYgKHBlbmRpbmdfY2FsbHNfLmZpbmQodXVpZCkgIT0gcGVuZGluZ19jYWxsc18uZW5kKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJHQVRUIGNsaWVudCB3aXRoIGdpdmVuIFV1aWQgYWxyZWFkeSByZWdpc3RlcmVkIC0gIgotICAgICAgICAgICAgICAgPDwgIlV1aWQ6ICIgPDwgdXVpZC5Ub1N0cmluZygpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QqIGhhbF9pZmFjZSA9Ci0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5HZXRDbGllbnRIQUxJbnRlcmZhY2UoKTsKLQotICBpZiAoaGFsX2lmYWNlLT5yZWdpc3Rlcl9jbGllbnQodXVpZCwgZmFsc2UpICE9IEJUX1NUQVRVU19TVUNDRVNTKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwZW5kaW5nX2NhbGxzX1t1dWlkXSA9IGNhbGxiYWNrOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEdhdHRDbGllbnRGYWN0b3J5OjpSZWdpc3RlckNsaWVudENhbGxiYWNrKAotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZCwKLSAgICBjb25zdCBVdWlkJiBhcHBfdXVpZCkgewotICBVdWlkIHV1aWQoYXBwX3V1aWQpOwotCi0gIGF1dG8gaXRlciA9IHBlbmRpbmdfY2FsbHNfLmZpbmQodXVpZCk7Ci0gIGlmIChpdGVyID09IHBlbmRpbmdfY2FsbHNfLmVuZCgpKSB7Ci0gICAgVkxPRygxKSA8PCAiSWdub3JpbmcgY2FsbGJhY2sgZm9yIHVua25vd24gYXBwX2lkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIHN1Y2Nlc3MgPSAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgQkxFU3RhdHVzIHJlc3VsdCA9IHN1Y2Nlc3MgPyBCTEVfU1RBVFVTX1NVQ0NFU1MgOiBCTEVfU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgLy8gTm8gbmVlZCB0byBjb25zdHJ1Y3QgYSBjbGllbnQgaWYgdGhlIGNhbGwgd2Fzbid0IHN1Y2Nlc3NmdWwuCi0gIHN0ZDo6dW5pcXVlX3B0cjxHYXR0Q2xpZW50PiBjbGllbnQ7Ci0gIGlmIChzdWNjZXNzKSBjbGllbnQucmVzZXQobmV3IEdhdHRDbGllbnQodXVpZCwgY2xpZW50X2lkKSk7Ci0KLSAgLy8gTm90aWZ5IHRoZSByZXN1bHQgdmlhIHRoZSByZXN1bHQgY2FsbGJhY2suCi0gIGl0ZXItPnNlY29uZChyZXN1bHQsIHV1aWQsIHN0ZDo6bW92ZShjbGllbnQpKTsKLQotICBwZW5kaW5nX2NhbGxzXy5lcmFzZShpdGVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9nYXR0X2NsaWVudC5oIGIvc2VydmljZS9nYXR0X2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTAzMjJkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZ2F0dF9jbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2JsdWV0b290aF9pbnN0YW5jZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gQSBHYXR0Q2xpZW50IGluc3RhbmNlIHJlcHJlc2VudHMgYW4gYXBwbGljYXRpb24ncyBoYW5kbGUgdG8gcGVyZm9ybSBHQVRUCi0vLyBjbGllbnQtcm9sZSBvcGVyYXRpb25zLiBJbnN0YW5jZXMgY2Fubm90IGJlIGNyZWF0ZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZQotLy8gb2J0YWluZWQgdGhyb3VnaCB0aGUgZmFjdG9yeS4KLWNsYXNzIEdhdHRDbGllbnQgOiBwdWJsaWMgQmx1ZXRvb3RoSW5zdGFuY2UgewotIHB1YmxpYzoKLSAgfkdhdHRDbGllbnQoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhDbGllbnRJbnN0YWNlIG92ZXJyaWRlczoKLSAgY29uc3QgVXVpZCYgR2V0QXBwSWRlbnRpZmllcigpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQgR2V0SW5zdGFuY2VJZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIEdhdHRDbGllbnRGYWN0b3J5OwotCi0gIC8vIENvbnN0cnVjdG9yIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgaW5zdGFuY2VzIGFyZSBtZWFudCB0byBiZQotICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBmYWN0b3J5LgotICBHYXR0Q2xpZW50KGNvbnN0IFV1aWQmIHV1aWQsIGludCBjbGllbnRfaWQpOwotCi0gIC8vIFNlZSBnZXR0ZXJzIGFib3ZlIGZvciBkb2N1bWVudGF0aW9uLgotICBVdWlkIGFwcF9pZGVudGlmaWVyXzsKLSAgaW50IGNsaWVudF9pZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEdhdHRDbGllbnQpOwotfTsKLQotLy8gR2F0dENsaWVudEZhY3RvcnkgaXMgdXNlZCB0byByZWdpc3RlciBhbmQgb2J0YWluIGEgcGVyLWFwcGxpY2F0aW9uIEdhdHRDbGllbnQKLS8vIGluc3RhbmNlLiBVc2VycyBzaG91bGQgY2FsbCBSZWdpc3RlckNsaWVudCB0byBvYnRhaW4gdGhlaXIgb3duIHVuaXF1ZQotLy8gR2F0dENsaWVudCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQmx1ZXRvb3RoIHN0YWNrLgotY2xhc3MgR2F0dENsaWVudEZhY3RvcnkgOiBwdWJsaWMgQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgLy8gRG9uJ3QgY29uc3RydWN0L2Rlc3RydWN0IGRpcmVjdGx5IGV4Y2VwdCBpbiB0ZXN0cy4gSW5zdGVhZCwgb2J0YWluIGEgaGFuZGxlCi0gIC8vIGZyb20gYW4gQWRhcHRlciBpbnN0YW5jZS4KLSAgR2F0dENsaWVudEZhY3RvcnkoKTsKLSAgfkdhdHRDbGllbnRGYWN0b3J5KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5IG92ZXJyaWRlOgotICBib29sIFJlZ2lzdGVySW5zdGFuY2UoY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXIgb3ZlcnJpZGU6Ci0gIHZvaWQgUmVnaXN0ZXJDbGllbnRDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgYXBwX3V1aWQpIG92ZXJyaWRlOwotCi0gIC8vIE1hcCBvZiBwZW5kaW5nIGNhbGxzIHRvIHJlZ2lzdGVyLgotICBzdGQ6Om11dGV4IHBlbmRpbmdfY2FsbHNfbG9ja187Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxVdWlkLCBSZWdpc3RlckNhbGxiYWNrPiBwZW5kaW5nX2NhbGxzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR2F0dENsaWVudEZhY3RvcnkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9nYXR0X3NlcnZlci5jYyBiL3NlcnZpY2UvZ2F0dF9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjdmYzEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9nYXR0X3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvZ2F0dF9zZXJ2ZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAic2VydmljZS9sb2dnaW5nX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgc3RkOjpsb2NrX2d1YXJkOwotdXNpbmcgc3RkOjptdXRleDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIEdhdHRTZXJ2ZXIgaW1wbGVtZW50YXRpb24KLQotR2F0dFNlcnZlcjo6R2F0dFNlcnZlcihjb25zdCBVdWlkJiB1dWlkLCBpbnQgc2VydmVyX2lkKQotICAgIDogYXBwX2lkZW50aWZpZXJfKHV1aWQpLCBzZXJ2ZXJfaWRfKHNlcnZlcl9pZCksIGRlbGVnYXRlXyhudWxscHRyKSB7fQotCi1HYXR0U2VydmVyOjp+R2F0dFNlcnZlcigpIHsKLSAgLy8gQXV0b21hdGljYWxseSB1bnJlZ2lzdGVyIHRoZSBzZXJ2ZXIuCi0gIFZMT0coMSkgPDwgIkdhdHRTZXJ2ZXIgdW5yZWdpc3RlcmluZzogIiA8PCBzZXJ2ZXJfaWRfOwotCi0gIC8vIFVucmVnaXN0ZXIgYXMgb2JzZXJ2ZXIgc28gd2Ugbm8gbG9uZ2VyIHJlY2VpdmUgYW55IGNhbGxiYWNrcy4KLSAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+UmVtb3ZlU2VydmVyT2JzZXJ2ZXIodGhpcyk7Ci0KLSAgLy8gVW5yZWdpc3RlciB0aGlzIHNlcnZlciwgc3RvcCBhbGwgc2VydmljZXMsIGFuZCBpZ25vcmUgdGhlIHJlc3VsdC4KLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBzdG9wIGFuZCByZW1vdmUgYWxsIHNlcnZpY2VzIGhlcmU/IHVucmVnaXN0ZXJfc2VydmVyCi0gIC8vIHNob3VsZCByZWFsbHkgdGFrZSBjYXJlIG9mIHRoYXQuCi0gIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCkKLSAgICAgIC0+R2V0U2VydmVySEFMSW50ZXJmYWNlKCkKLSAgICAgIC0+dW5yZWdpc3Rlcl9zZXJ2ZXIoc2VydmVyX2lkXyk7Ci19Ci0KLXZvaWQgR2F0dFNlcnZlcjo6U2V0RGVsZWdhdGUoRGVsZWdhdGUqIGRlbGVnYXRlKSB7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLSAgZGVsZWdhdGVfID0gZGVsZWdhdGU7Ci19Ci0KLWNvbnN0IFV1aWQmIEdhdHRTZXJ2ZXI6OkdldEFwcElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBhcHBfaWRlbnRpZmllcl87IH0KLQotaW50IEdhdHRTZXJ2ZXI6OkdldEluc3RhbmNlSWQoKSBjb25zdCB7IHJldHVybiBzZXJ2ZXJfaWRfOyB9Ci0KLWJvb2wgR2F0dFNlcnZlcjo6QWRkU2VydmljZShjb25zdCBibHVldG9vdGg6OlNlcnZpY2UmIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzdWx0Q2FsbGJhY2smIGNhbGxiYWNrKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBzZXJ2ZXJfaWQ6ICIgPDwgc2VydmVyX2lkXzsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhtdXRleF8pOwotCi0gIGlmICghY2FsbGJhY2spIHsKLSAgICBMT0coRVJST1IpIDw8ICJ8Y2FsbGJhY2t8IGNhbm5vdCBiZSBOVUxMIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzdmM7Ci0KLSAgc3ZjLnB1c2hfYmFjayh7Ci0gICAgICAudXVpZCA9IHNlcnZpY2UudXVpZCgpLAotICAgICAgLnR5cGUgPSAoc2VydmljZS5wcmltYXJ5KCkgPyBCVEdBVFRfREJfUFJJTUFSWV9TRVJWSUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJUR0FUVF9EQl9TRUNPTkRBUllfU0VSVklDRSksCi0gIH0pOwotCi0gIGZvciAoY29uc3QgYXV0byYgY2hhcmFjdGVyaXN0aWMgOiBzZXJ2aWNlLmNoYXJhY3RlcmlzdGljcygpKSB7Ci0gICAgc3ZjLnB1c2hfYmFjayh7LnV1aWQgPSBjaGFyYWN0ZXJpc3RpYy51dWlkKCksCi0gICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBjaGFyYWN0ZXJpc3RpYy5wcm9wZXJ0aWVzKCksCi0gICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zID0gY2hhcmFjdGVyaXN0aWMucGVybWlzc2lvbnMoKX0pOwotICAgIGZvciAoY29uc3QgYXV0byYgZGVzY3JpcHRvciA6IGNoYXJhY3RlcmlzdGljLmRlc2NyaXB0b3JzKCkpCi0gICAgICBzdmMucHVzaF9iYWNrKHsudXVpZCA9IGRlc2NyaXB0b3IudXVpZCgpLAotICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUiwKLSAgICAgICAgICAgICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IGRlc2NyaXB0b3IucGVybWlzc2lvbnMoKX0pOwotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBpbmNsX3N2YyA6IHNlcnZpY2UuaW5jbHVkZWRfc2VydmljZXMoKSkKLSAgICBzdmMucHVzaF9iYWNrKHsudHlwZSA9IEJUR0FUVF9EQl9JTkNMVURFRF9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgIC5hdHRyaWJ1dGVfaGFuZGxlID0gaW5jbF9zdmMuaGFuZGxlKCl9KTsKLQotICBwZW5kaW5nX2VuZF9kZWNsX2NiXyA9IGNhbGxiYWNrOwotCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9Ci0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5HZXRTZXJ2ZXJIQUxJbnRlcmZhY2UoKS0+YWRkX3NlcnZpY2UoCi0gICAgICAgICAgc2VydmVyX2lkXywgc3ZjLmRhdGEoKSwgc3ZjLnNpemUoKSk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbCB0byBwb3B1bGF0ZSBHQVRUIHNlcnZpY2UiOwotICAgIENsZWFuVXBQZW5kaW5nRGF0YSgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdhdHRTZXJ2ZXI6OlNlbmRSZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCByZXF1ZXN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVEVycm9yIGVycm9yLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiAtIHNlcnZlcl9pZDogIiA8PCBzZXJ2ZXJfaWRfCi0gICAgICAgICAgPDwgIiBkZXZpY2VfYWRkcmVzczogIiA8PCBkZXZpY2VfYWRkcmVzcwotICAgICAgICAgIDw8ICIgcmVxdWVzdF9pZDogIiA8PCByZXF1ZXN0X2lkIDw8ICIgZXJyb3I6ICIgPDwgZXJyb3IKLSAgICAgICAgICA8PCAiIG9mZnNldDogIiA8PCBvZmZzZXQ7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGlmICghUmF3QWRkcmVzczo6RnJvbVN0cmluZyhkZXZpY2VfYWRkcmVzcywgYWRkcikpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChvZmZzZXQgPCAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiT2Zmc2V0IGlzIGxlc3MgdGhhbiAwIG9mZnNldDogIiA8PCBvZmZzZXQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHZhbHVlLnNpemUoKSArIG9mZnNldCA+IEJUR0FUVF9NQVhfQVRUUl9MRU4pIHsKLSAgICBMT0coRVJST1IpIDw8ICJWYWx1ZSBpcyB0b28gbGFyZ2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEZpbmQgdGhlIGNvcnJlY3QgY29ubmVjdGlvbiBJRCBmb3IgfGRldmljZV9hZGRyZXNzfCBhbmQgfHJlcXVlc3RfaWR8LgotICBhdXRvIGl0ZXIgPSBjb25uX2FkZHJfbWFwXy5maW5kKGRldmljZV9hZGRyZXNzKTsKLSAgaWYgKGl0ZXIgPT0gY29ubl9hZGRyX21hcF8uZW5kKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJObyBrbm93biBjb25uZWN0aW9ucyBmb3IgZGV2aWNlIGFkZHJlc3M6ICIgPDwgZGV2aWNlX2FkZHJlc3M7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247Ci0gIGZvciAoY29uc3QgYXV0byYgdG1wIDogaXRlci0+c2Vjb25kKSB7Ci0gICAgaWYgKHRtcC0+cmVxdWVzdF9pZF90b19oYW5kbGUuZmluZChyZXF1ZXN0X2lkKSA9PQotICAgICAgICB0bXAtPnJlcXVlc3RfaWRfdG9faGFuZGxlLmVuZCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBjb25uZWN0aW9uID0gdG1wOwotICB9Ci0KLSAgaWYgKCFjb25uZWN0aW9uKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiUGVuZGluZyByZXF1ZXN0IHdpdGggSUQgIiA8PCByZXF1ZXN0X2lkCi0gICAgICAgICAgICAgICA8PCAiIG5vdCBmb3VuZCBmb3IgZGV2aWNlIHdpdGggQkRfQUREUjogIiA8PCBkZXZpY2VfYWRkcmVzczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBidGdhdHRfcmVzcG9uc2VfdCByZXNwb25zZTsKLSAgbWVtc2V0KCZyZXNwb25zZSwgMCwgc2l6ZW9mKHJlc3BvbnNlKSk7Ci0KLSAgLy8gV2Uga2VlcCAtMSBhcyB0aGUgaGFuZGxlIGZvciAiRXhlY3V0ZSBXcml0ZSBSZXF1ZXN0Ii4gSW4gdGhhdCBjYXNlLAotICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIHBvcHVsYXRlIHRoZSByZXNwb25zZSBkYXRhLiBKdXN0IHNlbmQgemVyb3MgYmFjay4KLSAgaW50IGhhbmRsZSA9IGNvbm5lY3Rpb24tPnJlcXVlc3RfaWRfdG9faGFuZGxlW3JlcXVlc3RfaWRdOwotICByZXNwb25zZS5oYW5kbGUgPSBoYW5kbGU7Ci0gIHJlc3BvbnNlLmF0dHJfdmFsdWUuaGFuZGxlID0gaGFuZGxlOwotICBpZiAoaGFuZGxlICE9IC0xKSB7Ci0gICAgbWVtY3B5KHJlc3BvbnNlLmF0dHJfdmFsdWUudmFsdWUsIHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKLSAgICByZXNwb25zZS5hdHRyX3ZhbHVlLm9mZnNldCA9IG9mZnNldDsKLSAgICByZXNwb25zZS5hdHRyX3ZhbHVlLmxlbiA9IHZhbHVlLnNpemUoKTsKLSAgfQotCi0gIGJ0X3N0YXR1c190IHJlc3VsdCA9Ci0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgLT5HZXRTZXJ2ZXJIQUxJbnRlcmZhY2UoKQotICAgICAgICAgIC0+c2VuZF9yZXNwb25zZShjb25uZWN0aW9uLT5jb25uX2lkLCByZXF1ZXN0X2lkLCBlcnJvciwgcmVzcG9uc2UpOwotICBpZiAocmVzdWx0ICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwgdG8gc2VuZCBHQVRUIHJlc3BvbnNlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25uZWN0aW9uLT5yZXF1ZXN0X2lkX3RvX2hhbmRsZS5lcmFzZShyZXF1ZXN0X2lkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBHYXR0U2VydmVyOjpTZW5kTm90aWZpY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBoYW5kbGUsIGJvb2wgY29uZmlybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2F0dENhbGxiYWNrJiBjYWxsYmFjaykgewotICBWTE9HKDEpIDw8ICIgLSBzZXJ2ZXJfaWQ6ICIgPDwgc2VydmVyX2lkXwotICAgICAgICAgIDw8ICIgZGV2aWNlX2FkZHJlc3M6ICIgPDwgZGV2aWNlX2FkZHJlc3MgPDwgIiBjb25maXJtOiAiIDw8IGNvbmZpcm07Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICBSYXdBZGRyZXNzIGFkZHI7Ci0gIGlmICghUmF3QWRkcmVzczo6RnJvbVN0cmluZyhkZXZpY2VfYWRkcmVzcywgYWRkcikpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGRldmljZSBhZGRyZXNzIGdpdmVuOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEdldCB0aGUgY29ubmVjdGlvbiBJRHMgZm9yIHdoaWNoIHdlIHdpbGwgc2VuZCB0aGlzIG5vdGlmaWNhdGlvbi4KLSAgYXV0byBjb25uX2l0ZXIgPSBjb25uX2FkZHJfbWFwXy5maW5kKGRldmljZV9hZGRyZXNzKTsKLSAgaWYgKGNvbm5faXRlciA9PSBjb25uX2FkZHJfbWFwXy5lbmQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIk5vIGtub3duIGNvbm5lY3Rpb25zIGZvciBkZXZpY2Ugd2l0aCBhZGRyZXNzOiAiCi0gICAgICAgICAgICAgICA8PCBkZXZpY2VfYWRkcmVzczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8UGVuZGluZ0luZGljYXRpb24+IHBlbmRpbmdfaW5kKAotICAgICAgbmV3IFBlbmRpbmdJbmRpY2F0aW9uKGNhbGxiYWNrKSk7Ci0KLSAgLy8gU2VuZCB0aGUgbm90aWZpY2F0aW9uL2luZGljYXRpb24gb24gYWxsIG1hdGNoaW5nIGNvbm5lY3Rpb25zLgotICBpbnQgc2VuZF9jb3VudCA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgY29ubiA6IGNvbm5faXRlci0+c2Vjb25kKSB7Ci0gICAgLy8gTWFrZSBzdXJlIHRoYXQgb25lIGlzbid0IGFscmVhZHkgcGVuZGluZyBmb3IgdGhpcyBjb25uZWN0aW9uLgotICAgIGlmIChwZW5kaW5nX2luZGljYXRpb25zXy5maW5kKGNvbm4tPmNvbm5faWQpICE9Ci0gICAgICAgIHBlbmRpbmdfaW5kaWNhdGlvbnNfLmVuZCgpKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJBIiA8PCAoY29uZmlybSA/ICJuIGluZGljYXRpb24iIDogIiBub3RpZmljYXRpb24iKQotICAgICAgICAgICAgICA8PCAiIGlzIGFscmVhZHkgcGVuZGluZyBmb3IgY29ubmVjdGlvbjogIiA8PCBjb25uLT5jb25uX2lkOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gVGhlIEhBTCBBUEkgdGFrZXMgY2hhciogcmF0aGVyIGNvbnN0IGNoYXIqIGZvciB8dmFsdWV8LCBzbyB3ZSBoYXZlIHRvCi0gICAgLy8gY2FzdCBhd2F5IHRoZSBjb25zdC4KLSAgICAvLyBUT0RPKGFybWFuc2l0byk6IE1ha2UgSEFMIGFjY2VwdCBjb25zdCBjaGFyKi4KLSAgICBidF9zdGF0dXNfdCBzdGF0dXMgPQotICAgICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgICAtPkdldFNlcnZlckhBTEludGVyZmFjZSgpCi0gICAgICAgICAgICAtPnNlbmRfaW5kaWNhdGlvbihzZXJ2ZXJfaWRfLCBoYW5kbGUsIGNvbm4tPmNvbm5faWQsIGNvbmZpcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Ci0KLSAgICAvLyBJbmNyZW1lbnQgdGhlIHNlbmQgY291bnQgaWYgdGhpcyB3YXMgc3VjY2Vzc2Z1bC4gV2UgZG9uJ3QgaW1tZWRpYXRlbHkKLSAgICAvLyBmYWlsIGlmIHRoZSBIQUwgcmV0dXJuZWQgYW4gZXJyb3IuIEl0J3MgYmV0dGVyIHRvIHJlcG9ydCBzdWNjZXNzIGFzIGxvbmcKLSAgICAvLyBhcyB3ZSBzZW50IG91dCBhdCBsZWFzdCBvbmUgbm90aWZpY2F0aW9uIHRvIHRoaXMgZGV2aWNlIGFzCi0gICAgLy8gbXVsdGktdHJhbnNwb3J0IEdBVFQgY29ubmVjdGlvbnMgZnJvbSB0aGUgc2FtZSBCRF9BRERSIHdpbGwgYmUgcmFyZQotICAgIC8vIGVub3VnaCBhbHJlYWR5LgotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIGNvbnRpbnVlOwotCi0gICAgc2VuZF9jb3VudCsrOwotICAgIHBlbmRpbmdfaW5kaWNhdGlvbnNfW2Nvbm4tPmNvbm5faWRdID0gcGVuZGluZ19pbmQ7Ci0gIH0KLQotICBpZiAoc2VuZF9jb3VudCA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgbm90aWZpY2F0aW9ucy9pbmRpY2F0aW9ucyB0byBkZXZpY2U6ICIKLSAgICAgICAgICAgICAgIDw8IGRldmljZV9hZGRyZXNzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEdhdHRTZXJ2ZXI6OkNvbm5lY3Rpb25DYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCBjb25uX2lkLCBpbnQgc2VydmVyX2lkLAotICAgIGludCBjb25uZWN0ZWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG11dGV4Xyk7Ci0KLSAgaWYgKHNlcnZlcl9pZCAhPSBzZXJ2ZXJfaWRfKSByZXR1cm47Ci0KLSAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJmJkYSk7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIGNvbm5lY3RlZDogIiA8PCBjb25uZWN0ZWQKLSAgICAgICAgICA8PCAiIEJEX0FERFI6ICIgPDwgZGV2aWNlX2FkZHJlc3M7Ci0KLSAgaWYgKCFjb25uZWN0ZWQpIHsKLSAgICAvLyBFcmFzZSB0aGUgZW50cnkgaWYgd2Ugd2VyZSBjb25uZWN0ZWQgdG8gaXQuCi0gICAgVkxPRygxKSA8PCAiTm8gbG9uZ2VyIGNvbm5lY3RlZDogIiA8PCBkZXZpY2VfYWRkcmVzczsKLSAgICBjb25uX2lkX21hcF8uZXJhc2UoY29ubl9pZCk7Ci0gICAgYXV0byBpdGVyID0gY29ubl9hZGRyX21hcF8uZmluZChkZXZpY2VfYWRkcmVzcyk7Ci0gICAgaWYgKGl0ZXIgPT0gY29ubl9hZGRyX21hcF8uZW5kKCkpIHJldHVybjsKLQotICAgIC8vIFJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgY29ubmVjdGlvbiBvYmplY3RzIGluIHRoZSBhZGRyZXNzLgotICAgIGZvciAoYXV0byBjb25uX2l0ZXIgPSBpdGVyLT5zZWNvbmQuYmVnaW4oKTsgY29ubl9pdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKLSAgICAgICAgICsrY29ubl9pdGVyKSB7Ci0gICAgICBpZiAoKCpjb25uX2l0ZXIpLT5jb25uX2lkICE9IGNvbm5faWQpIGNvbnRpbnVlOwotCi0gICAgICBpdGVyLT5zZWNvbmQuZXJhc2UoY29ubl9pdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChkZWxlZ2F0ZV8pCi0gICAgICBkZWxlZ2F0ZV8tPk9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCh0aGlzLCBkZXZpY2VfYWRkcmVzcywgZmFsc2UpOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGNvbm5faWRfbWFwXy5maW5kKGNvbm5faWQpICE9IGNvbm5faWRfbWFwXy5lbmQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ29ubmVjdGlvbiBlbnRyeSBhbHJlYWR5IGV4aXN0czsgIgotICAgICAgICAgICAgICAgICA8PCAiaWdub3JpbmcgQ29ubmVjdGlvbkNhbGxiYWNrIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBMT0coSU5GTykgPDwgIkFkZGVkIGNvbm5lY3Rpb24gZW50cnkgZm9yIGNvbm5faWQ6ICIgPDwgY29ubl9pZAotICAgICAgICAgICAgPDwgIiBkZXZpY2UgYWRkcmVzczogIiA8PCBkZXZpY2VfYWRkcmVzczsKLSAgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb24+IGNvbm5lY3Rpb24obmV3IENvbm5lY3Rpb24oY29ubl9pZCwgYmRhKSk7Ci0gIGNvbm5faWRfbWFwX1tjb25uX2lkXSA9IGNvbm5lY3Rpb247Ci0gIGNvbm5fYWRkcl9tYXBfW2RldmljZV9hZGRyZXNzXS5wdXNoX2JhY2soY29ubmVjdGlvbik7Ci0KLSAgaWYgKGRlbGVnYXRlXykKLSAgICBkZWxlZ2F0ZV8tPk9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCh0aGlzLCBkZXZpY2VfYWRkcmVzcywgdHJ1ZSk7Ci19Ci0KLXZvaWQgR2F0dFNlcnZlcjo6U2VydmljZUFkZGVkQ2FsbGJhY2soaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzdmMpIHsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhtdXRleF8pOwotCi0gIGlmIChzZXJ2ZXJfaWQgIT0gc2VydmVyX2lkXykgcmV0dXJuOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiAtIHN0YXR1czogIiA8PCBzdGF0dXMgPDwgIiBzZXJ2ZXJfaWQ6ICIgPDwgc2VydmVyX2lkCi0gICAgICAgICAgPDwgIiBmaXJzdCBoYW5kbGU6ICIgPDwgc3ZjWzBdLmF0dHJpYnV0ZV9oYW5kbGUKLSAgICAgICAgICA8PCAiIHNlcnZpY2UgVXVpZDogIiA8PCBVdWlkKHN2Y1swXS51dWlkKS5Ub1N0cmluZygpCi0gICAgICAgICAgPDwgIiBjb3VudDogIiA8PCBzdmMuc2l6ZSgpOwotCi0gIFNlcnZpY2Ugc2VydmljZShzdmNbMF0uYXR0cmlidXRlX2hhbmRsZSwgdHJ1ZSwgVXVpZChzdmNbMF0udXVpZCksIHt9LCB7fSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzdmMuc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBidGdhdHRfZGJfZWxlbWVudF90JiBjdXJyID0gc3ZjW2ldOwotICAgIFZMT0coMSkgPDwgIiAtIHByb2Nlc3NpbmcgaXRlbSBubzogIiA8PCBpCi0gICAgICAgICAgICA8PCAiIGhhbmRsZTogIiA8PCBjdXJyLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gICAgaWYgKGN1cnIudHlwZSA9PSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMpIHsKLSAgICAgIHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKCkucHVzaF9iYWNrKHtjdXJyLmF0dHJpYnV0ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZChjdXJyLnV1aWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIucHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyLnBlcm1pc3Npb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9fSk7Ci0gICAgfSBlbHNlIGlmIChjdXJyLnR5cGUgPT0gQlRHQVRUX0RCX0RFU0NSSVBUT1IpIHsKLSAgICAgIHNlcnZpY2UuY2hhcmFjdGVyaXN0aWNzKCkuYmFjaygpLmRlc2NyaXB0b3JzKCkucHVzaF9iYWNrKAotICAgICAgICAgIHtjdXJyLmF0dHJpYnV0ZV9oYW5kbGUsIFV1aWQoY3Vyci51dWlkKSwgY3Vyci5wZXJtaXNzaW9uc30pOwotICAgIH0gZWxzZSBpZiAoc3ZjW2ldLnR5cGUgPT0gQlRHQVRUX0RCX0lOQ0xVREVEX1NFUlZJQ0UpIHsKLSAgICB9Ci0gIH0KLQotICBwZW5kaW5nX2VuZF9kZWNsX2NiXygoYmx1ZXRvb3RoOjpCTEVTdGF0dXMpc3RhdHVzLCBzZXJ2aWNlKTsKLQotICBDbGVhblVwUGVuZGluZ0RhdGEoKTsKLX0KLQotdm9pZCBHYXR0U2VydmVyOjpTZXJ2aWNlU3RvcHBlZENhbGxiYWNrKAotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIHN0YXR1cyAqLywKLSAgICBpbnQgLyogc2VydmVyX2lkICovLCBpbnQgLyogc2VydmljZV9oYW5kbGUgKi8pIHsKLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBTdXBwb3J0IHN0b3BwaW5nIGEgc2VydmljZS4KLX0KLQotdm9pZCBHYXR0U2VydmVyOjpSZXF1ZXN0UmVhZENoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJpYnV0ZV9oYW5kbGUsIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZykgewotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG11dGV4Xyk7Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGtub3cgYWJvdXQgdGhpcyBjb25uZWN0aW9uLiBPdGhlcndpc2UgaWdub3JlIHRoZQotICAvLyByZXF1ZXN0LgotICBhdXRvIGNvbm4gPSBHZXRDb25uZWN0aW9uKGNvbm5faWQsIGJkYSwgdHJhbnNfaWQpOwotICBpZiAoIWNvbm4pIHJldHVybjsKLQotICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzcyA9IEJ0QWRkclN0cmluZygmYmRhKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBjb25uX2lkOiAiIDw8IGNvbm5faWQgPDwgIiB0cmFuc19pZDogIiA8PCB0cmFuc19pZAotICAgICAgICAgIDw8ICIgQkRfQUREUjogIiA8PCBkZXZpY2VfYWRkcmVzcwotICAgICAgICAgIDw8ICIgYXR0cmlidXRlX2hhbmRsZTogIiA8PCBhdHRyaWJ1dGVfaGFuZGxlIDw8ICIgb2Zmc2V0OiAiIDw8IG9mZnNldAotICAgICAgICAgIDw8ICIgaXNfbG9uZzogIiA8PCBpc19sb25nOwotCi0gIGNvbm4tPnJlcXVlc3RfaWRfdG9faGFuZGxlW3RyYW5zX2lkXSA9IGF0dHJpYnV0ZV9oYW5kbGU7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgbm8gZGVsZWdhdGUgdGhlbiB0aGVyZSBpcyBub2JvZHkgdG8gaGFuZGxlIHJlcXVlc3QuIFRoZSByZXF1ZXN0Ci0gIC8vIHdpbGwgZXZlbnR1YWxseSB0aW1lb3V0IGFuZCB3ZSBzaG91bGQgZ2V0IGEgY29ubmVjdGlvbiB1cGRhdGUgdGhhdAotICAvLyB0ZXJtaW5hdGVzIHRoZSBjb25uZWN0aW9uLgotICBpZiAoIWRlbGVnYXRlXykgewotICAgIC8vIFRPRE8oYXJtYW5zaXRvKTogUmVxdWlyZSBhIGRlbGVnYXRlIGF0IHNlcnZlciByZWdpc3RyYXRpb24gc28gdGhhdCB0aGlzCi0gICAgLy8gaXMgbmV2ZXIgcG9zc2libGUuCi0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBkZWxlZ2F0ZSB3YXMgYXNzaWduZWQgdG8gR2F0dFNlcnZlci4gSW5jb21pbmcgcmVxdWVzdCAiCi0gICAgICAgICAgICAgICAgIDw8ICJ3aWxsIHRpbWUgb3V0LiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGVsZWdhdGVfLT5PbkNoYXJhY3RlcmlzdGljUmVhZFJlcXVlc3QodGhpcywgZGV2aWNlX2FkZHJlc3MsIHRyYW5zX2lkLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvbmcsIGF0dHJpYnV0ZV9oYW5kbGUpOwotfQotdm9pZCBHYXR0U2VydmVyOjpSZXF1ZXN0UmVhZERlc2NyaXB0b3JDYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cmlidXRlX2hhbmRsZSwgaW50IG9mZnNldCwgYm9vbCBpc19sb25nKSB7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICAvLyBDaGVjayB0byBzZWUgaWYgd2Uga25vdyBhYm91dCB0aGlzIGNvbm5lY3Rpb24uIE90aGVyd2lzZSBpZ25vcmUgdGhlCi0gIC8vIHJlcXVlc3QuCi0gIGF1dG8gY29ubiA9IEdldENvbm5lY3Rpb24oY29ubl9pZCwgYmRhLCB0cmFuc19pZCk7Ci0gIGlmICghY29ubikgcmV0dXJuOwotCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzID0gQnRBZGRyU3RyaW5nKCZiZGEpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIHRyYW5zX2lkOiAiIDw8IHRyYW5zX2lkCi0gICAgICAgICAgPDwgIiBCRF9BRERSOiAiIDw8IGRldmljZV9hZGRyZXNzCi0gICAgICAgICAgPDwgIiBhdHRyaWJ1dGVfaGFuZGxlOiAiIDw8IGF0dHJpYnV0ZV9oYW5kbGUgPDwgIiBvZmZzZXQ6ICIgPDwgb2Zmc2V0Ci0gICAgICAgICAgPDwgIiBpc19sb25nOiAiIDw8IGlzX2xvbmc7Ci0KLSAgY29ubi0+cmVxdWVzdF9pZF90b19oYW5kbGVbdHJhbnNfaWRdID0gYXR0cmlidXRlX2hhbmRsZTsKLQotICAvLyBJZiB0aGVyZSBpcyBubyBkZWxlZ2F0ZSB0aGVuIHRoZXJlIGlzIG5vYm9keSB0byBoYW5kbGUgcmVxdWVzdC4gVGhlIHJlcXVlc3QKLSAgLy8gd2lsbCBldmVudHVhbGx5IHRpbWVvdXQgYW5kIHdlIHNob3VsZCBnZXQgYSBjb25uZWN0aW9uIHVwZGF0ZSB0aGF0Ci0gIC8vIHRlcm1pbmF0ZXMgdGhlIGNvbm5lY3Rpb24uCi0gIGlmICghZGVsZWdhdGVfKSB7Ci0gICAgLy8gVE9ETyhhcm1hbnNpdG8pOiBSZXF1aXJlIGEgZGVsZWdhdGUgYXQgc2VydmVyIHJlZ2lzdHJhdGlvbiBzbyB0aGF0IHRoaXMKLSAgICAvLyBpcyBuZXZlciBwb3NzaWJsZS4KLSAgICBMT0coV0FSTklORykgPDwgIk5vIGRlbGVnYXRlIHdhcyBhc3NpZ25lZCB0byBHYXR0U2VydmVyLiBJbmNvbWluZyByZXF1ZXN0ICIKLSAgICAgICAgICAgICAgICAgPDwgIndpbGwgdGltZSBvdXQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkZWxlZ2F0ZV8tPk9uRGVzY3JpcHRvclJlYWRSZXF1ZXN0KHRoaXMsIGRldmljZV9hZGRyZXNzLCB0cmFuc19pZCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvbmcsIGF0dHJpYnV0ZV9oYW5kbGUpOwotfQotCi12b2lkIEdhdHRTZXJ2ZXI6OlJlcXVlc3RXcml0ZUNoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJfaGFuZGxlLCBpbnQgb2Zmc2V0LCBib29sIG5lZWRfcnNwLAotICAgIGJvb2wgaXNfcHJlcCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUpIHsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhtdXRleF8pOwotCi0gIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBrbm93IGFib3V0IHRoaXMgY29ubmVjdGlvbi4gT3RoZXJ3aXNlIGlnbm9yZSB0aGUKLSAgLy8gcmVxdWVzdC4KLSAgYXV0byBjb25uID0gR2V0Q29ubmVjdGlvbihjb25uX2lkLCBiZGEsIHRyYW5zX2lkKTsKLSAgaWYgKCFjb25uKSByZXR1cm47Ci0KLSAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3MgPSBCdEFkZHJTdHJpbmcoJmJkYSk7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgdHJhbnNfaWQ6ICIgPDwgdHJhbnNfaWQKLSAgICAgICAgICA8PCAiIEJEX0FERFI6ICIgPDwgZGV2aWNlX2FkZHJlc3MgPDwgIiBhdHRyX2hhbmRsZTogIiA8PCBhdHRyX2hhbmRsZQotICAgICAgICAgIDw8ICIgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiIGxlbmd0aDogIiA8PCB2YWx1ZS5zaXplKCkKLSAgICAgICAgICA8PCAiIG5lZWRfcnNwOiAiIDw8IG5lZWRfcnNwIDw8ICIgaXNfcHJlcDogIiA8PCBpc19wcmVwOwotCi0gIC8vIFN0b3JlIHRoZSByZXF1ZXN0IElEIG9ubHkgaWYgdGhpcyBpcyBub3QgYSB3cml0ZS13aXRob3V0LXJlc3BvbnNlLiBJZgotICAvLyBhbm90aGVyIHJlcXVlc3Qgb2NjdXJzIGFmdGVyIHRoaXMgd2l0aCB0aGUgc2FtZSByZXF1ZXN0IElELCB0aGVuIHdlJ2xsCi0gIC8vIHNpbXBseSBwcm9jZXNzIGl0IG5vcm1hbGx5LCB0aG91Z2ggdGhhdCBzaG91bGRuJ3QgZXZlciBoYXBwZW4uCi0gIGlmIChuZWVkX3JzcCkgY29ubi0+cmVxdWVzdF9pZF90b19oYW5kbGVbdHJhbnNfaWRdID0gYXR0cl9oYW5kbGU7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgbm8gZGVsZWdhdGUgdGhlbiB0aGVyZSBpcyBub2JvZHkgdG8gaGFuZGxlIHJlcXVlc3QuIFRoZSByZXF1ZXN0Ci0gIC8vIHdpbGwgZXZlbnR1YWxseSB0aW1lb3V0IGFuZCB3ZSBzaG91bGQgZ2V0IGEgY29ubmVjdGlvbiB1cGRhdGUgdGhhdAotICAvLyB0ZXJtaW5hdGVzIHRoZSBjb25uZWN0aW9uLgotICBpZiAoIWRlbGVnYXRlXykgewotICAgIC8vIFRPRE8oYXJtYW5zaXRvKTogUmVxdWlyZSBhIGRlbGVnYXRlIGF0IHNlcnZlciByZWdpc3RyYXRpb24gc28gdGhhdCB0aGlzCi0gICAgLy8gaXMgbmV2ZXIgcG9zc2libGUuCi0gICAgTE9HKFdBUk5JTkcpIDw8ICJObyBkZWxlZ2F0ZSB3YXMgYXNzaWduZWQgdG8gR2F0dFNlcnZlci4gSW5jb21pbmcgcmVxdWVzdCAiCi0gICAgICAgICAgICAgICAgIDw8ICJ3aWxsIHRpbWUgb3V0LiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZGVsZWdhdGVfLT5PbkNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0KHRoaXMsIGRldmljZV9hZGRyZXNzLCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgaXNfcHJlcCwgbmVlZF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodmFsdWUpLCBhdHRyX2hhbmRsZSk7Ci19Ci0KLXZvaWQgR2F0dFNlcnZlcjo6UmVxdWVzdFdyaXRlRGVzY3JpcHRvckNhbGxiYWNrKAotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBhdHRyX2hhbmRsZSwgaW50IG9mZnNldCwgYm9vbCBuZWVkX3JzcCwKLSAgICBib29sIGlzX3ByZXAsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKSB7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobXV0ZXhfKTsKLQotICAvLyBDaGVjayB0byBzZWUgaWYgd2Uga25vdyBhYm91dCB0aGlzIGNvbm5lY3Rpb24uIE90aGVyd2lzZSBpZ25vcmUgdGhlCi0gIC8vIHJlcXVlc3QuCi0gIGF1dG8gY29ubiA9IEdldENvbm5lY3Rpb24oY29ubl9pZCwgYmRhLCB0cmFuc19pZCk7Ci0gIGlmICghY29ubikgcmV0dXJuOwotCi0gIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzID0gQnRBZGRyU3RyaW5nKCZiZGEpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIHRyYW5zX2lkOiAiIDw8IHRyYW5zX2lkCi0gICAgICAgICAgPDwgIiBCRF9BRERSOiAiIDw8IGRldmljZV9hZGRyZXNzIDw8ICIgYXR0cl9oYW5kbGU6ICIgPDwgYXR0cl9oYW5kbGUKLSAgICAgICAgICA8PCAiIG9mZnNldDogIiA8PCBvZmZzZXQgPDwgIiBsZW5ndGg6ICIgPDwgdmFsdWUuc2l6ZSgpCi0gICAgICAgICAgPDwgIiBuZWVkX3JzcDogIiA8PCBuZWVkX3JzcCA8PCAiIGlzX3ByZXA6ICIgPDwgaXNfcHJlcDsKLQotICAvLyBTdG9yZSB0aGUgcmVxdWVzdCBJRCBvbmx5IGlmIHRoaXMgaXMgbm90IGEgd3JpdGUtd2l0aG91dC1yZXNwb25zZS4gSWYKLSAgLy8gYW5vdGhlciByZXF1ZXN0IG9jY3VycyBhZnRlciB0aGlzIHdpdGggdGhlIHNhbWUgcmVxdWVzdCBJRCwgdGhlbiB3ZSdsbAotICAvLyBzaW1wbHkgcHJvY2VzcyBpdCBub3JtYWxseSwgdGhvdWdoIHRoYXQgc2hvdWxkbid0IGV2ZXIgaGFwcGVuLgotICBpZiAobmVlZF9yc3ApIGNvbm4tPnJlcXVlc3RfaWRfdG9faGFuZGxlW3RyYW5zX2lkXSA9IGF0dHJfaGFuZGxlOwotCi0gIC8vIElmIHRoZXJlIGlzIG5vIGRlbGVnYXRlIHRoZW4gdGhlcmUgaXMgbm9ib2R5IHRvIGhhbmRsZSByZXF1ZXN0LiBUaGUgcmVxdWVzdAotICAvLyB3aWxsIGV2ZW50dWFsbHkgdGltZW91dCBhbmQgd2Ugc2hvdWxkIGdldCBhIGNvbm5lY3Rpb24gdXBkYXRlIHRoYXQKLSAgLy8gdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4KLSAgaWYgKCFkZWxlZ2F0ZV8pIHsKLSAgICAvLyBUT0RPKGFybWFuc2l0byk6IFJlcXVpcmUgYSBkZWxlZ2F0ZSBhdCBzZXJ2ZXIgcmVnaXN0cmF0aW9uIHNvIHRoYXQgdGhpcwotICAgIC8vIGlzIG5ldmVyIHBvc3NpYmxlLgotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gZGVsZWdhdGUgd2FzIGFzc2lnbmVkIHRvIEdhdHRTZXJ2ZXIuIEluY29taW5nIHJlcXVlc3QgIgotICAgICAgICAgICAgICAgICA8PCAid2lsbCB0aW1lIG91dC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlbGVnYXRlXy0+T25EZXNjcmlwdG9yV3JpdGVSZXF1ZXN0KHRoaXMsIGRldmljZV9hZGRyZXNzLCB0cmFuc19pZCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19wcmVwLCBuZWVkX3JzcCwgc3RkOjptb3ZlKHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9oYW5kbGUpOwotfQotCi12b2lkIEdhdHRTZXJ2ZXI6OlJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgZXhlY193cml0ZSkgewotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG11dGV4Xyk7Ci0KLSAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGtub3cgYWJvdXQgdGhpcyBjb25uZWN0aW9uLiBPdGhlcndpc2UgaWdub3JlIHRoZQotICAvLyByZXF1ZXN0LgotICBhdXRvIGNvbm4gPSBHZXRDb25uZWN0aW9uKGNvbm5faWQsIGJkYSwgdHJhbnNfaWQpOwotICBpZiAoIWNvbm4pIHJldHVybjsKLQotICBzdGQ6OnN0cmluZyBkZXZpY2VfYWRkcmVzcyA9IEJ0QWRkclN0cmluZygmYmRhKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBjb25uX2lkOiAiIDw8IGNvbm5faWQgPDwgIiB0cmFuc19pZDogIiA8PCB0cmFuc19pZAotICAgICAgICAgIDw8ICIgQkRfQUREUjogIiA8PCBkZXZpY2VfYWRkcmVzcyA8PCAiIGV4ZWNfd3JpdGU6ICIgPDwgZXhlY193cml0ZTsKLQotICAvLyBKdXN0IHN0b3JlIGEgZHVtbXkgaW52YWxpZCBoYW5kbGUgYXMgdGhpcyByZXF1ZXN0IGRvZXNuJ3QgYXBwbHkgdG8gYQotICAvLyBzcGVjaWZpYyBoYW5kbGUuCi0gIGNvbm4tPnJlcXVlc3RfaWRfdG9faGFuZGxlW3RyYW5zX2lkXSA9IC0xOwotCi0gIC8vIElmIHRoZXJlIGlzIG5vIGRlbGVnYXRlIHRoZW4gdGhlcmUgaXMgbm9ib2R5IHRvIGhhbmRsZSByZXF1ZXN0LiBUaGUgcmVxdWVzdAotICAvLyB3aWxsIGV2ZW50dWFsbHkgdGltZW91dCBhbmQgd2Ugc2hvdWxkIGdldCBhIGNvbm5lY3Rpb24gdXBkYXRlIHRoYXQKLSAgLy8gdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4KLSAgaWYgKCFkZWxlZ2F0ZV8pIHsKLSAgICAvLyBUT0RPKGFybWFuc2l0byk6IFJlcXVpcmUgYSBkZWxlZ2F0ZSBhdCBzZXJ2ZXIgcmVnaXN0cmF0aW9uIHNvIHRoYXQgdGhpcwotICAgIC8vIGlzIG5ldmVyIHBvc3NpYmxlLgotICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gZGVsZWdhdGUgd2FzIGFzc2lnbmVkIHRvIEdhdHRTZXJ2ZXIuIEluY29taW5nIHJlcXVlc3QgIgotICAgICAgICAgICAgICAgICA8PCAid2lsbCB0aW1lIG91dC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRlbGVnYXRlXy0+T25FeGVjdXRlV3JpdGVSZXF1ZXN0KHRoaXMsIGRldmljZV9hZGRyZXNzLCB0cmFuc19pZCwgZXhlY193cml0ZSk7Ci19Ci0KLXZvaWQgR2F0dFNlcnZlcjo6SW5kaWNhdGlvblNlbnRDYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCBjb25uX2lkLCBpbnQgc3RhdHVzKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBjb25uX2lkOiAiIDw8IGNvbm5faWQgPDwgIiBzdGF0dXM6ICIgPDwgc3RhdHVzOwotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG11dGV4Xyk7Ci0KLSAgY29uc3QgYXV0byYgcGVuZGluZ19pbmRfaXRlciA9IHBlbmRpbmdfaW5kaWNhdGlvbnNfLmZpbmQoY29ubl9pZCk7Ci0gIGlmIChwZW5kaW5nX2luZF9pdGVyID09IHBlbmRpbmdfaW5kaWNhdGlvbnNfLmVuZCgpKSB7Ci0gICAgVkxPRygxKSA8PCAiVW5rbm93biBjb25uZWN0aW9uOiAiIDw8IGNvbm5faWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPFBlbmRpbmdJbmRpY2F0aW9uPiBwZW5kaW5nX2luZCA9IHBlbmRpbmdfaW5kX2l0ZXItPnNlY29uZDsKLSAgcGVuZGluZ19pbmRpY2F0aW9uc18uZXJhc2UocGVuZGluZ19pbmRfaXRlcik7Ci0KLSAgaWYgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgcGVuZGluZ19pbmQtPmhhc19zdWNjZXNzID0gdHJ1ZTsKLQotICAvLyBJbnZva2UgaXQgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBjb25maXJtYXRpb24gY2FsbGJhY2suCi0gIGlmIChwZW5kaW5nX2luZC51bmlxdWUoKSAmJiBwZW5kaW5nX2luZC0+Y2FsbGJhY2spIHsKLSAgICBwZW5kaW5nX2luZC0+Y2FsbGJhY2socGVuZGluZ19pbmQtPmhhc19zdWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdBVFRfRVJST1JfTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxHQVRURXJyb3I+KHN0YXR1cykpOwotICB9Ci19Ci0KLXZvaWQgR2F0dFNlcnZlcjo6Q2xlYW5VcFBlbmRpbmdEYXRhKCkgewotICBwZW5kaW5nX2VuZF9kZWNsX2NiXyA9IFJlc3VsdENhbGxiYWNrKCk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxHYXR0U2VydmVyOjpDb25uZWN0aW9uPiBHYXR0U2VydmVyOjpHZXRDb25uZWN0aW9uKAotICAgIGludCBjb25uX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCByZXF1ZXN0X2lkKSB7Ci0gIGF1dG8gaXRlciA9IGNvbm5faWRfbWFwXy5maW5kKGNvbm5faWQpOwotICBpZiAoaXRlciA9PSBjb25uX2lkX21hcF8uZW5kKCkpIHsKLSAgICBWTE9HKDEpIDw8ICJDb25uZWN0aW9uIGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgc2VydmVyIjsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIGF1dG8gY29ubiA9IGl0ZXItPnNlY29uZDsKLSAgaWYgKGNvbm4tPmJkYWRkciAhPSBiZGEpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkJEX0FERFI6ICIgPDwgQnRBZGRyU3RyaW5nKCZiZGEpIDw8ICIgZG9lc24ndCBtYXRjaCAiCi0gICAgICAgICAgICAgICAgIDw8ICJjb25uZWN0aW9uIElEOiAiIDw8IGNvbm5faWQ7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoY29ubi0+cmVxdWVzdF9pZF90b19oYW5kbGUuZmluZChyZXF1ZXN0X2lkKSAhPQotICAgICAgY29ubi0+cmVxdWVzdF9pZF90b19oYW5kbGUuZW5kKCkpIHsKLSAgICBWTE9HKDEpIDw8ICJSZXF1ZXN0IHdpdGggSUQ6ICIgPDwgcmVxdWVzdF9pZCA8PCAiIGFscmVhZHkgZXhpc3RzIGZvciAiCi0gICAgICAgICAgICA8PCAiIGNvbm5lY3Rpb246ICIgPDwgY29ubl9pZDsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHJldHVybiBjb25uOwotfQotCi0vLyBHYXR0U2VydmVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotCi1HYXR0U2VydmVyRmFjdG9yeTo6R2F0dFNlcnZlckZhY3RvcnkoKSB7Ci0gIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkFkZFNlcnZlck9ic2VydmVyKHRoaXMpOwotfQotCi1HYXR0U2VydmVyRmFjdG9yeTo6fkdhdHRTZXJ2ZXJGYWN0b3J5KCkgewotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5SZW1vdmVTZXJ2ZXJPYnNlcnZlcih0aGlzKTsKLX0KLQotYm9vbCBHYXR0U2VydmVyRmFjdG9yeTo6UmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckNhbGxiYWNrJiBjYWxsYmFjaykgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBVdWlkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhwZW5kaW5nX2NhbGxzX2xvY2tfKTsKLQotICBpZiAocGVuZGluZ19jYWxsc18uZmluZCh1dWlkKSAhPSBwZW5kaW5nX2NhbGxzXy5lbmQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkdBVFQtc2VydmVyIGNsaWVudCB3aXRoIGdpdmVuIFV1aWQgYWxyZWFkeSBiZWluZyByZWdpc3RlcmVkICIKLSAgICAgICAgICAgICAgIDw8ICIgLSBVdWlkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90KiBoYWxfaWZhY2UgPQotICAgICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+R2V0U2VydmVySEFMSW50ZXJmYWNlKCk7Ci0KLSAgaWYgKGhhbF9pZmFjZS0+cmVnaXN0ZXJfc2VydmVyKHV1aWQsIGZhbHNlKSAhPSBCVF9TVEFUVVNfU1VDQ0VTUykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcGVuZGluZ19jYWxsc19bdXVpZF0gPSBjYWxsYmFjazsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHYXR0U2VydmVyRmFjdG9yeTo6UmVnaXN0ZXJTZXJ2ZXJDYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWQsCi0gICAgY29uc3QgVXVpZCYgYXBwX3V1aWQpIHsKLSAgVXVpZCB1dWlkKGFwcF91dWlkKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBVdWlkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhwZW5kaW5nX2NhbGxzX2xvY2tfKTsKLQotICBhdXRvIGl0ZXIgPSBwZW5kaW5nX2NhbGxzXy5maW5kKHV1aWQpOwotICBpZiAoaXRlciA9PSBwZW5kaW5nX2NhbGxzXy5lbmQoKSkgewotICAgIFZMT0coMSkgPDwgIklnbm9yaW5nIGNhbGxiYWNrIGZvciB1bmtub3duIGFwcF9pZDogIiA8PCB1dWlkLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gTm8gbmVlZCB0byBjb25zdHJ1Y3QgYSBzZXJ2ZXIgaWYgdGhlIGNhbGwgd2Fzbid0IHN1Y2Nlc3NmdWwuCi0gIHN0ZDo6dW5pcXVlX3B0cjxHYXR0U2VydmVyPiBzZXJ2ZXI7Ci0gIEJMRVN0YXR1cyByZXN1bHQgPSBCTEVfU1RBVFVTX0ZBSUxVUkU7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBzZXJ2ZXIucmVzZXQobmV3IEdhdHRTZXJ2ZXIodXVpZCwgc2VydmVyX2lkKSk7Ci0KLSAgICBnYXR0X2lmYWNlLT5BZGRTZXJ2ZXJPYnNlcnZlcihzZXJ2ZXIuZ2V0KCkpOwotCi0gICAgcmVzdWx0ID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICB9Ci0KLSAgLy8gTm90aWZ5IHRoZSByZXN1bHQgdmlhIHRoZSByZXN1bHQgY2FsbGJhY2suCi0gIGl0ZXItPnNlY29uZChyZXN1bHQsIHV1aWQsIHN0ZDo6bW92ZShzZXJ2ZXIpKTsKLQotICBwZW5kaW5nX2NhbGxzXy5lcmFzZShpdGVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9nYXR0X3NlcnZlci5oIGIvc2VydmljZS9nYXR0X3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZlOGQwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvZ2F0dF9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic2VydmljZS9ibHVldG9vdGhfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2VydmljZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi0vLyBBIEdhdHRTZXJ2ZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhbiBhcHBsaWNhdGlvbidzIGhhbmRsZSB0byBwZXJmb3JtIEdBVFQKLS8vIHNlcnZlci1yb2xlIG9wZXJhdGlvbnMuIEluc3RhbmNlcyBjYW5ub3QgYmUgY3JlYXRlZCBkaXJlY3RseSBhbmQgc2hvdWxkIGJlCi0vLyBvYnRhaW5lZCB0aHJvdWdoIHRoZSBmYWN0b3J5LgotY2xhc3MgR2F0dFNlcnZlciA6IHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICBwcml2YXRlIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgLy8gRGVsZWdhdGUgaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGFuZCBjb25maXJtYXRpb25zCi0gIC8vIGZvciBhIEdBVFQgc2VydmljZS4KLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIERlbGVnYXRlKCkgPSBkZWZhdWx0OwotICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgPSBkZWZhdWx0OwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gaW5jb21pbmcgcmVhZCByZXF1ZXN0IGZvciB0aGUgY2hhcmFjdGVyaXN0aWMgd2l0aAotICAgIC8vIElEIHxjaGFyYWN0ZXJpc3RpY19pZHwgZnJvbSBhIHJlbW90ZSBkZXZpY2Ugd2l0aCBhZGRyZXNzCi0gICAgLy8gfGRldmljZV9hZGRyZXNzfC4gfHJlcXVlc3RfaWR8IGNhbiBiZSB1c2VkIHRvIHJlc3BvbmQgdG8gdGhpcyByZXF1ZXN0IGJ5Ci0gICAgLy8gY2FsbGluZyBTZW5kUmVzcG9uc2UgYmVsb3cuCi0gICAgdmlydHVhbCB2b2lkIE9uQ2hhcmFjdGVyaXN0aWNSZWFkUmVxdWVzdChHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb25nLCB1aW50MTZfdCBoYW5kbGUpID0gMDsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIHJlYWQgcmVxdWVzdCBmb3IgdGhlIGRlc2NyaXB0b3Igd2l0aAotICAgIC8vIElEIHxkZXNjcmlwdG9yX2lkfCBmcm9tIGEgcmVtb3RlIGRldmljZSB3aXRoIGFkZHJlc3MgfGRldmljZV9hZGRyZXNzfC4KLSAgICAvLyB8cmVxdWVzdF9pZHwgY2FuIGJlIHVzZWQgdG8gcmVzcG9uZCB0byB0aGlzIHJlcXVlc3QgYnkKLSAgICAvLyBjYWxsaW5nIFNlbmRSZXNwb25zZSBiZWxvdy4KLSAgICB2aXJ0dWFsIHZvaWQgT25EZXNjcmlwdG9yUmVhZFJlcXVlc3QoR2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbG9uZywgdWludDE2X3QgaGFuZGxlKSA9IDA7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBhbiBpbmNvbWluZyB3cml0ZSByZXF1ZXN0IGZvciB0aGUgY2hhcmFjdGVyaXN0aWMKLSAgICAvLyB3aXRoIElEIHxjaGFyYWN0ZXJpc3RpY19pZHwgZnJvbSBhIHJlbW90ZSBkZXZpY2Ugd2l0aCBhZGRyZXNzCi0gICAgLy8gfGRldmljZV9hZGRyZXNzfC4gfHJlcXVlc3RfaWR8IGNhbiBiZSB1c2VkIHRvIHJlc3BvbmQgdG8gdGhpcyByZXF1ZXN0IGJ5Ci0gICAgLy8gY2FsbGluZyBTZW5kUmVzcG9uc2UsIGlmIHRoZSB8bmVlZF9yZXNwb25zZXwgcGFyYW1ldGVyIGlzIHRydWUuIE90aGVyd2lzZQotICAgIC8vIHRoaXMgaXMgYSAiV3JpdGUgV2l0aG91dCBSZXBvbnNlIiBwcm9jZWR1cmUgYW5kIFNlbmRSZXNwb25zZSB3aWxsIGZhaWwuCi0gICAgLy8gSWYgfGlzX3ByZXBhcmVfd3JpdGV8IGlzIHRydWUsIHRoZW4gdGhlIHdyaXRlIHNob3VsZCBub3QgYmUgY29tbWl0dGVkCi0gICAgLy8gaW1tZWRpYXRlbHkgYXMgdGhpcyBpcyBhICJQcmVwYXJlZCBXcml0ZSBSZXF1ZXN0Ii4gSW5zdGVhZCwgdGhlIERlbGVnYXRlCi0gICAgLy8gc2hvdWxkIGhvbGQgb24gdG8gdGhlIHZhbHVlIGFuZCBlaXRoZXIgZGlzY2FyZCBpdCBvciBjb21wbGV0ZSB0aGUgd3JpdGUKLSAgICAvLyB3aGVuIGl0IHJlY2VpdmVzIHRoZSBPbkV4ZWN1dGVXcml0ZVJlcXVlc3QgZXZlbnQuCi0gICAgdmlydHVhbCB2b2lkIE9uQ2hhcmFjdGVyaXN0aWNXcml0ZVJlcXVlc3QoCi0gICAgICAgIEdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LCBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLCB1aW50MTZfdCBoYW5kbGUpID0gMDsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIHdyaXRlIHJlcXVlc3QgZm9yIHRoZSBkZXNjcmlwdG9yCi0gICAgLy8gd2l0aCBJRCB8ZGVzY3JpcHRvcl9pZHwgZnJvbSBhIHJlbW90ZSBkZXZpY2Ugd2l0aCBhZGRyZXNzCi0gICAgLy8gfGRldmljZV9hZGRyZXNzfC4gfHJlcXVlc3RfaWR8IGNhbiBiZSB1c2VkIHRvIHJlc3BvbmQgdG8gdGhpcyByZXF1ZXN0IGJ5Ci0gICAgLy8gY2FsbGluZyBTZW5kUmVzcG9uc2UsIGlmIHRoZSB8bmVlZF9yZXNwb25zZXwgcGFyYW1ldGVyIGlzIHRydWUuIE90aGVyd2lzZQotICAgIC8vIHRoaXMgaXMgYSAiV3JpdGUgV2l0aG91dCBSZXNwb25zZSIgcHJvY2VkdXJlIGFuZCBTZW5kUmVzcG9uc2Ugd2lsbCBmYWlsLgotICAgIC8vIElmIHxpc19wcmVwYXJlX3dyaXRlfCBpcyB0cnVlLCB0aGVuIHRoZSB3cml0ZSBzaG91bGQgbm90IGJlIGNvbW1pdHRlZAotICAgIC8vIGltbWVkaWF0ZWx5IGFzIHRoaXMgaXMgYSAiUHJlcGFyZWQgV3JpdGUgUmVxdWVzdCIuIEluc3RlYWQsIHRoZSBEZWxlZ2F0ZQotICAgIC8vIHNob3VsZCBob2xkIG9uIHRvIHRoZSB2YWx1ZSBhbmQgZWl0aGVyIGRpc2NhcmQgaXQgb3IgY29tcGxldGUgdGhlIHdyaXRlCi0gICAgLy8gd2hlbiBpdCByZWNlaXZlcyB0aGUgT25FeGVjdXRlV3JpdGVSZXF1ZXN0IGV2ZW50LgotICAgIHZpcnR1YWwgdm9pZCBPbkRlc2NyaXB0b3JXcml0ZVJlcXVlc3QoCi0gICAgICAgIEdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LCBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLCB1aW50MTZfdCBoYW5kbGUpID0gMDsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nICJFeGVjdXRlIFdyaXRlIFJlcXVlc3QiLiBJZiB8aXNfZXhlY3V0ZXwKLSAgICAvLyBpcyB0cnVlLCB0aGVuIHRoZSBEZWxlZ2F0ZSBzaG91bGQgY29tbWl0IGFsbCBwcmV2aW91c2x5IHByZXBhcmVkIHdyaXRlcy4KLSAgICAvLyBPdGhlcndpc2UsIGFsbCBwcmVwYXJlZCB3cml0ZXMgc2hvdWxkIGJlIGFib3J0ZWQuIFRoZSBEZWxlZ2F0ZSBzaG91bGQKLSAgICAvLyBjYWxsICJTZW5kUmVzcG9uc2UiIHRvIGNvbXBsZXRlIHRoZSBwcm9jZWR1cmUuCi0gICAgdmlydHVhbCB2b2lkIE9uRXhlY3V0ZVdyaXRlUmVxdWVzdChHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0X2lkLCBib29sIGlzX2V4ZWN1dGUpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoR2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkKSA9IDA7Ci0KLSAgIHByaXZhdGU6Ci0gICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlbGVnYXRlKTsKLSAgfTsKLQotICAvLyBUaGUgZGVzY3RydWN0b3IgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVycyB0aGlzIGluc3RhbmNlIGZyb20gdGhlIHN0YWNrLgotICB+R2F0dFNlcnZlcigpIG92ZXJyaWRlOwotCi0gIC8vIEFzc2lnbnMgYSBkZWxlZ2F0ZSB0byB0aGlzIGluc3RhbmNlLiB8ZGVsZWdhdGV8IG11c3Qgb3V0LWxpdmUgdGhpcwotICAvLyBHYXR0U2VydmVyIGluc3RhbmNlLgotICB2b2lkIFNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSk7Ci0KLSAgLy8gQmx1ZXRvb3RoQ2xpZW50SW5zdGFjZSBvdmVycmlkZXM6Ci0gIGNvbnN0IFV1aWQmIEdldEFwcElkZW50aWZpZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50IEdldEluc3RhbmNlSWQoKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBDYWxsYmFjayB0eXBlIHVzZWQgdG8gcmVwb3J0IHRoZSBzdGF0dXMgb2YgYW4gYXN5bmNocm9ub3VzIEdBVFQgc2VydmVyCi0gIC8vIG9wZXJhdGlvbi4KLSAgdXNpbmcgUmVzdWx0Q2FsbGJhY2sgPQotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEJMRVN0YXR1cyBzdGF0dXMsIGNvbnN0IFNlcnZpY2UmIGlkKT47Ci0gIHVzaW5nIEdhdHRDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChHQVRURXJyb3IgZXJyb3IpPjsKLQotICAvLyBBZGQgc2VydmljZSBkZWNsYXJhdGlvbi4gVGhpcyBtZXRob2QgaW1tZWRpYXRlbHkKLSAgLy8gcmV0dXJucyBmYWxzZSBpZiBhIHNlcnZpY2UgaGFzbid0IGJlZW4gc3RhcnRlZC4gT3RoZXJ3aXNlLCB8Y2FsbGJhY2t8IHdpbGwKLSAgLy8gYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgotICAvLwotICAvLyBUT0RPKGFybWFuc2l0byk6IEl0IGlzIHVuY2xlYXIgdG8gbWUgd2hhdCBpdCBtZWFucyBmb3IgdGhpcyBmdW5jdGlvbiB0bwotICAvLyBmYWlsLiBXaGF0IGlzIHRoZSBzdGF0ZSB0aGF0IHdlJ3JlIGluPyBJcyB0aGUgc2VydmljZSBkZWNsYXJhdGlvbiBvdmVyIHNvCi0gIC8vIHdlIGNhbiBhZGQgb3RoZXIgc2VydmljZXMgdG8gdGhpcyBzZXJ2ZXIgaW5zdGFuY2U/IERvIHdlIG5lZWQgdG8gY2xlYW4gdXAKLSAgLy8gYWxsIHRoZSBlbnRyaWVzIG9yIGRvZXMgdGhlIHVwcGVyLWxheWVyIG5lZWQgdG8gcmVtb3ZlIHRoZSBzZXJ2aWNlPyBPciBhcmUKLSAgLy8gd2UgaW4gYSBzdHVjay1zdGF0ZSB3aGVyZSB0aGUgc2VydmljZSBkZWNsYXJhdGlvbiBoYXNuJ3QgZW5kZWQ/Ci0gIGJvb2wgQWRkU2VydmljZShjb25zdCBTZXJ2aWNlJiwgY29uc3QgUmVzdWx0Q2FsbGJhY2smIGNhbGxiYWNrKTsKLQotICAvLyBTZW5kcyBhIHJlc3BvbnNlIGZvciBhIHBlbmRpbmcgbm90aWZpY2F0aW9uLiB8cmVxdWVzdF9pZHwgYW5kCi0gIC8vIHxkZXZpY2VfYWRkcmVzc3wgc2hvdWxkIG1hdGNoIHRob3NlIHRoYXQgd2VyZSByZWNlaXZlZCB0aHJvdWdoIG9uZSBvZiB0aGUKLSAgLy8gRGVsZWdhdGUgY2FsbGJhY2tzLiB8dmFsdWV8IGFuZCB8b2Zmc2V0fCBhcmUgdXNlZCBmb3IgcmVhZCByZXF1ZXN0cyBhbmQKLSAgLy8gcHJlcGFyZSB3cml0ZSByZXF1ZXN0cyBhbmQgc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBSZXR1cm5zCi0gIC8vIGZhbHNlIGlmIHRoZSBwZW5kaW5nIHJlcXVlc3QgY291bGQgbm90IGJlIHJlc29sdmVkIHVzaW5nIHRoZSBnaXZlbgotICAvLyBwYXJhbWV0ZXJzIG9yIGlmIHRoZSBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIHN0YWNrIGZhaWxzLgotICBib29sIFNlbmRSZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCByZXF1ZXN0X2lkLAotICAgICAgICAgICAgICAgICAgICBHQVRURXJyb3IgZXJyb3IsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSk7Ci0KLSAgLy8gU2VuZHMgYW4gQVRUIEhhbmRsZS1WYWx1ZSBOb3RpZmljYXRpb24gdG8gdGhlIGRldmljZSB3aXRoIEJEX0FERFIKLSAgLy8gfGRldmljZV9hZGRyZXNzfCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljIHdpdGggaGFuZGxlIHxoYW5kbGV8IGFuZAotICAvLyB2YWx1ZSB8dmFsdWV8LiBJZiB8Y29uZmlybXwgaXMgdHJ1ZSwgdGhlbiBhbiBBVFQgSGFuZGxlLVZhbHVlIEluZGljYXRpb24KLSAgLy8gd2lsbCBiZSBzZW50IGluc3RlYWQsIHdoaWNoIHJlcXVpcmVzIHRoZSByZW1vdGUgdG8gY29uZmlybSByZWNlaXB0LiBSZXR1cm5zCi0gIC8vIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBpbW1lZGlhdGUgZXJyb3IgaW4gaW5pdGlhdGluZyB0aGUgbm90aWZpY2F0aW9uCi0gIC8vIHByb2NlZHVyZS4gT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUgYW5kIHJlcG9ydHMgdGhlIGFzeW5jaHJvbm91cyByZXN1bHQgb2YKLSAgLy8gdGhlIG9wZXJhdGlvbiBpbiB8Y2FsbGJhY2t8LgotICAvLwotICAvLyBJZiB8Y29uZmlybXwgaXMgdHJ1ZSwgdGhlbiB8Y2FsbGJhY2t8IHdpbGwgYmUgcnVuIHdoZW4gdGhlIHJlbW90ZSBkZXZpY2UKLSAgLy8gc2VuZHMgYSBBVFQgSGFuZGxlLVZhbHVlIENvbmZpcm1hdGlvbiBwYWNrZXQuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBydW4gYXMKLSAgLy8gc29vbiBhcyB0aGUgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHNlbnQgb3V0LgotICBib29sIFNlbmROb3RpZmljYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgaGFuZGxlLCBib29sIGNvbmZpcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHYXR0Q2FsbGJhY2smIGNhbGxiYWNrKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBHYXR0U2VydmVyRmFjdG9yeTsKLQotICAvLyBVc2VkIGZvciB0aGUgaW50ZXJuYWwgcmVtb3RlIGNvbm5lY3Rpb24gdHJhY2tpbmcuIEtlZXBzIHRyYWNrIG9mIHRoZQotICAvLyByZXF1ZXN0IElEIGFuZCB0aGUgZGV2aWNlIGFkZHJlc3MgZm9yIHRoZSBjb25uZWN0aW9uLiBJZiB8cmVxdWVzdF9pZHwgaXMgLTEKLSAgLy8gdGhlbiBubyBBVFQgcmVhZC93cml0ZSByZXF1ZXN0IGlzIGN1cnJlbnRseSBwZW5kaW5nLgotICBzdHJ1Y3QgQ29ubmVjdGlvbiB7Ci0gICAgQ29ubmVjdGlvbihpbnQgY29ubl9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyKQotICAgICAgICA6IGNvbm5faWQoY29ubl9pZCksIGJkYWRkcihiZGFkZHIpIHt9Ci0gICAgQ29ubmVjdGlvbigpIDogY29ubl9pZCgtMSkgeyBtZW1zZXQoJmJkYWRkciwgMCwgc2l6ZW9mKGJkYWRkcikpOyB9Ci0KLSAgICBpbnQgY29ubl9pZDsKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHJlcXVlc3RfaWRfdG9faGFuZGxlOwotICAgIFJhd0FkZHJlc3MgYmRhZGRyOwotICB9OwotCi0gIC8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiBhIHBlbmRpbmcgSGFuZGxlLVZhbHVlIGluZGljYXRpb24uCi0gIHN0cnVjdCBQZW5kaW5nSW5kaWNhdGlvbiB7Ci0gICAgZXhwbGljaXQgUGVuZGluZ0luZGljYXRpb24oY29uc3QgR2F0dENhbGxiYWNrJiBjYWxsYmFjaykKLSAgICAgICAgOiBoYXNfc3VjY2VzcyhmYWxzZSksIGNhbGxiYWNrKGNhbGxiYWNrKSB7fQotCi0gICAgYm9vbCBoYXNfc3VjY2VzczsKLSAgICBHYXR0Q2FsbGJhY2sgY2FsbGJhY2s7Ci0gIH07Ci0KLSAgLy8gQ29uc3RydWN0b3Igc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBhcyBpbnN0YW5jZXMgYXJlIG1lYW50IHRvIGJlCi0gIC8vIG9idGFpbmVkIGZyb20gdGhlIGZhY3RvcnkuCi0gIEdhdHRTZXJ2ZXIoY29uc3QgVXVpZCYgdXVpZCwgaW50IHNlcnZlcl9pZCk7Ci0KLSAgLy8gaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlciBvdmVycmlkZXM6Ci0gIHZvaWQgQ29ubmVjdGlvbkNhbGxiYWNrKGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2ZXJfaWQsIGludCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2VydmljZUFkZGVkQ2FsbGJhY2soaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4pIG92ZXJyaWRlOwotICB2b2lkIFNlcnZpY2VTdG9wcGVkQ2FsbGJhY2soaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlX2hhbmRsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVxdWVzdFJlYWRDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cmlidXRlX2hhbmRsZSwgaW50IG9mZnNldCwKLSAgICAgIGJvb2wgaXNfbG9uZykgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVxdWVzdFJlYWREZXNjcmlwdG9yQ2FsbGJhY2soaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGVfaGFuZGxlLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbG9uZykgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJfaGFuZGxlLCBpbnQgb2Zmc2V0LCBib29sIG5lZWRfcnNwLAotICAgICAgYm9vbCBpc19wcmVwLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVxdWVzdFdyaXRlRGVzY3JpcHRvckNhbGxiYWNrKGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGJvb2wgbmVlZF9yc3AsIGJvb2wgaXNfcHJlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUpIG92ZXJyaWRlOwotICB2b2lkIFJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGV4ZWNfd3JpdGUpIG92ZXJyaWRlOwotICB2b2lkIEluZGljYXRpb25TZW50Q2FsbGJhY2soaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCBzdGF0dXMpIG92ZXJyaWRlOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IG5vdGlmaWVzIGFuZCBjbGVhcnMgdGhlIHBlbmRpbmcgY2FsbGJhY2suCi0gIHZvaWQgQ2xlYW5VcFBlbmRpbmdEYXRhKCk7Ci0KLSAgLy8gSGFuZGxlcyB0aGUgbmV4dCBhdHRyaWJ1dGUgZW50cnkgaW4gdGhlIHBlbmRpbmcgc2VydmljZSBkZWNsYXJhdGlvbi4KLSAgdm9pZCBIYW5kbGVOZXh0RW50cnkoaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlKTsKLQotICAvLyBIZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgQ29ubmVjdGlvbiBpbnN0YW5jZQotICAvLyB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0gIHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uPiBHZXRDb25uZWN0aW9uKGludCBjb25uX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0X2lkKTsKLQotICAvLyBTZWUgZ2V0dGVycyBmb3IgZG9jdW1lbnRhdGlvbi4KLSAgVXVpZCBhcHBfaWRlbnRpZmllcl87Ci0gIGludCBzZXJ2ZXJfaWRfOwotCi0gIC8vIE11dGV4IHRoYXQgc3luY2hyb25pemVzIGFjY2VzcyB0byB0aGUgZW50cmllcyBiZWxvdy4KLSAgc3RkOjptdXRleCBtdXRleF87Ci0gIFJlc3VsdENhbGxiYWNrIHBlbmRpbmdfZW5kX2RlY2xfY2JfOwotCi0gIC8vIEdBVFQgY29ubmVjdGlvbiBtYXBwaW5ncyBmcm9tIHN0YWNrLXByb3ZpZGVkICJjb25uX2lkIiBJRHMgYW5kIHJlbW90ZQotICAvLyBkZXZpY2UgYWRkcmVzc2VzIHRvIENvbm5lY3Rpb24gc3RydWN0dXJlcy4gVGhlIGNvbm5faWQgbWFwIGlzIG9uZS10by1vbmUKLSAgLy8gd2hpbGUgdGhlIGNvbm5fYWRkciBtYXAgaXMgb25lIHRvIG1hbnksIGFzIGEgcmVtb3RlIGRldmljZSBtYXkgc3VwcG9ydAotICAvLyBtdWx0aXBsZSB0cmFuc3BvcnRzIChCUi9FRFIgJiBMRSkgYW5kIHVzZSB0aGUgc2FtZSBkZXZpY2UgYWRkcmVzcyBmb3IgYm90aC4KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb24+PiBjb25uX2lkX21hcF87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb24+Pj4KLSAgICAgIGNvbm5fYWRkcl9tYXBfOwotCi0gIC8vIENvbm5lY3Rpb25zIGZvciB3aGljaCBhIEhhbmRsZS1WYWx1ZSBpbmRpY2F0aW9uIGlzIHBlbmRpbmcuIFNpbmNlIHRoZXJlIGNhbgotICAvLyBiZSBtdWx0aXBsZSBpbmRpY2F0aW9ucyB0byB0aGUgc2FtZSBkZXZpY2UgKGluIHRoZSBjYXNlIG9mIGEgZHVhbC1tb2RlCi0gIC8vIGRldmljZSB3aXRoIHNpbXVsYXRlbm91cyBCUi9FRFIgJiBMRSBHQVRUIGNvbm5lY3Rpb25zKSwgd2UgYWxzbyBrZWVwIHRyYWNrCi0gIC8vIG9mIHdoZXRoZXIgdGhlcmUgaGFzIGJlZW4gYXQgbGVhc3Qgb25lIHN1Y2Nlc3NmdWwgY29uZmlybWF0aW9uLgotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnNoYXJlZF9wdHI8UGVuZGluZ0luZGljYXRpb24+PgotICAgICAgcGVuZGluZ19pbmRpY2F0aW9uc187Ci0KLSAgLy8gUmF3IGhhbmRsZSB0byB0aGUgRGVsZWdhdGUsIHdoaWNoIG11c3Qgb3V0bGl2ZSB0aGlzIEdhdHRTZXJ2ZXIgaW5zdGFuY2UuCi0gIERlbGVnYXRlKiBkZWxlZ2F0ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEdhdHRTZXJ2ZXIpOwotfTsKLQotLy8gR2F0dFNlcnZlckZhY3RvcnkgaXMgdXNlZCB0byByZWdpc3RlciBhbmQgb2J0YWluIGEgcGVyLWFwcGxpY2F0aW9uIEdhdHRTZXJ2ZXIKLS8vIGluc3RhbmNlLiBVc2VycyBzaG91bGQgY2FsbCBSZWdpc3RlckNsaWVudCB0byBvYnRhaW4gdGhlaXIgb3duIHVuaXF1ZQotLy8gR2F0dFNlcnZlciBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQmx1ZXRvb3RoIHN0YWNrLgotY2xhc3MgR2F0dFNlcnZlckZhY3RvcnkgOiBwdWJsaWMgQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgLy8gRG9uJ3QgY29uc3RydWN0L2Rlc3RydWN0IGRpcmVjdGx5IGV4Y2VwdCBpbiB0ZXN0cy4gSW5zdGVhZCwgb2J0YWluIGEgaGFuZGxlCi0gIC8vIGZyb20gYW4gQWRhcHRlciBpbnN0YW5jZS4KLSAgR2F0dFNlcnZlckZhY3RvcnkoKTsKLSAgfkdhdHRTZXJ2ZXJGYWN0b3J5KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5IG92ZXJyaWRlOgotICBib29sIFJlZ2lzdGVySW5zdGFuY2UoY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXIgb3ZlcnJpZGU6Ci0gIHZvaWQgUmVnaXN0ZXJTZXJ2ZXJDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgYXBwX3V1aWQpIG92ZXJyaWRlOwotCi0gIC8vIE1hcCBvZiBwZW5kaW5nIGNhbGxzIHRvIHJlZ2lzdGVyLgotICBzdGQ6Om11dGV4IHBlbmRpbmdfY2FsbHNfbG9ja187Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxVdWlkLCBSZWdpc3RlckNhbGxiYWNrPiBwZW5kaW5nX2NhbGxzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR2F0dFNlcnZlckZhY3RvcnkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9nYXR0X3NlcnZlcl9vbGQuY2MgYi9zZXJ2aWNlL2dhdHRfc2VydmVyX29sZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyYjZhYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2dhdHRfc2VydmVyX29sZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2RlZmluZSBMT0dfVEFHICJidF9nYXR0cyIKLQotI2luY2x1ZGUgImdhdHRfc2VydmVyX29sZC5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBrTWF4R2F0dEF0dHJpYnV0ZVNpemUgPSA1MTI7Ci1zdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBwZW5kaW5nX3N2Y19kZWNsOwotc3RkOjp1bm9yZGVyZWRfc2V0PGludD4gYmxvYl9pbmRleDsKLQotLy8gVE9ETyhpY29vbGlkZ2UpOiBTdXBwb3J0IG11bHRpcGxlIGluc3RhbmNlcwotLy8gVE9ETyhhcm1hbnNpdG8pOiBSZW1vdmUgdGhpcyB2YXJpYWJsZS4gTm8gcG9pbnQgb2YgaGF2aW5nIHRoaXMgaWYKLS8vIGVhY2ggYmx1ZXRvb3RoOjpnYXR0OjpTZXJ2ZXIgaW5zdGFuY2UgYWxyZWFkeSBrZWVwcyBhIHBvaW50ZXIgdG8gdGhlCi0vLyBTZXJ2ZXJJbnRlcm5hbHMgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggaXQgKHdoaWNoIGlzIG11Y2ggY2xlYW5lcikuIEl0IGxvb2tzCi0vLyBsaWtlIHRoaXMgdmFyaWFibGUgZXhpc3RzIGJlY2F1c2UgdGhlIGJ0aWYgY2FsbGJhY2tzIGRvbid0IGFsbG93IHRoZQotLy8gdXBwZXItbGF5ZXIgdG8gcGFzcyB1c2VyIGRhdGEgdG8gdGhlbS4gV2UgY291bGQ6Ci0vLwotLy8gICAgMS4gRml4IHRoZSBidGlmIGNhbGxiYWNrcyBzbyB0aGF0IHNvbWUgc29ydCBvZiBjb250aW51YXRpb24gY2FuIGJlCi0vLyAgICBhdHRhY2hlZCB0byBhIGNhbGxiYWNrLiBUaGlzIG1pZ2h0IGJlIGEgbG9uZyBzaG90IHNpbmNlIHRoZSBjYWxsYmFjawotLy8gICAgaW50ZXJmYWNlIGRvZXNuJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBjYWxsZXIgdG8gcmVnaXN0ZXIgaXRzIG93biBjYWxsYmFja3MKLS8vICAgICh3aGljaCBtaWdodCBiZSB3aGF0IHdlIHdhbnQgdGhvdWdoLCBzaW5jZSB0aGlzIHdvdWxkIG1ha2UgdGhlIEFQSSBtb3JlCi0vLyAgICBmbGV4aWJsZSkuCi0vLwotLy8gICAgMi4gQWxsb3cgY3JlYXRpb24gb2YgU2VydmVyIG9iamVjdHMgdXNpbmcgYSBmYWN0b3J5IG1ldGhvZCB0aGF0IHJldHVybnMKLS8vICAgIHRoZSByZXN1bHQgYXN5bmNocm9ub3VzbHkgaW4gYSBiYXNlOjpDYWxsYmFjay4gVGhlIFJlZ2lzdGVyU2VydmVyQ2FsbGJhY2sKLS8vICAgIHByb3ZpZGVzIGFuIHxhcHBfdXVpZHwsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHN0b3JlIGNhbGxiYWNrIHN0cnVjdHVyZXMgaW4KLS8vICAgIGEgbWFwIGFuZCBsYXppbHkgaW5zdGFudGlhdGUgdGhlIFNlcnZlciBhbmQgaW52b2tlIHRoZSBjb3JyZWN0IGNhbGxiYWNrLgotLy8gICAgVGhpcyBpcyBhIGdlbmVyYWwgcGF0dGVybiB0aGF0IHdlIHNob3VsZCB1c2UgdGhyb3VnaG91dCB0aGUgZGFlbW9uLCBzaW5jZQotLy8gICAgYWxsIG9wZXJhdGlvbnMgY2FuIHRpbWVvdXQgb3IgZmFpbCBhbmQgdGhpcyBpcyBiZXN0IHJlcG9ydGVkIGluIGFuCi0vLyAgICBhc3luY2hyb25vdXMgYmFzZTo6Q2FsbGJhY2suCi0vLwotc3RhdGljIGJsdWV0b290aDo6Z2F0dDo6U2VydmVySW50ZXJuYWxzKiBnX2ludGVybmFsID0gbnVsbHB0cjsKLQotZW51bSB7IGtQaXBlUmVhZEVuZCA9IDAsIGtQaXBlV3JpdGVFbmQgPSAxLCBrUGlwZU51bUVuZHMgPSAyIH07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBnYXR0IHsKLQotc3RydWN0IENoYXJhY3RlcmlzdGljIHsKLSAgVXVpZCB1dWlkOwotICBpbnQgYmxvYl9zZWN0aW9uOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBibG9iOwotCi0gIC8vIFN1cHBvcnQgc3luY2hyb25pemVkIGJsb2IgdXBkYXRlcyBieSBsYXRjaGluZyB1bmRlciBtdXRleC4KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmV4dF9ibG9iOwotICBib29sIG5leHRfYmxvYl9wZW5kaW5nOwotICBib29sIG5vdGlmeTsKLX07Ci0KLXN0cnVjdCBTZXJ2ZXJJbnRlcm5hbHMgewotICBTZXJ2ZXJJbnRlcm5hbHMoKTsKLSAgflNlcnZlckludGVybmFscygpOwotICBpbnQgSW5pdGlhbGl6ZSgpOwotICBidF9zdGF0dXNfdCBBZGRDaGFyYWN0ZXJpc3RpYyhjb25zdCBVdWlkJiB1dWlkLCB1aW50OF90IHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBlcm1pc3Npb25zKTsKLQotICAvLyBUaGlzIG1hcHMgQVBJIGF0dHJpYnV0ZSBVdWlkcyB0byBCbHVlRHJvaWQgaGFuZGxlcy4KLSAgc3RkOjptYXA8VXVpZCwgaW50PiB1dWlkX3RvX2F0dHJpYnV0ZTsKLQotICAvLyBUaGUgYXR0cmlidXRlIGNhY2hlLCBpbmRleGVkIGJ5IEJsdWVEcm9pZCBoYW5kbGVzLgotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBDaGFyYWN0ZXJpc3RpYz4gY2hhcmFjdGVyaXN0aWNzOwotCi0gIC8vIEFzc29jaWF0ZSBhIGNvbnRyb2wgYXR0cmlidXRlIHdpdGggaXRzIHZhbHVlIGF0dHJpYnV0ZS4KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgaW50PiBjb250cm9sbGVkX2Jsb2JzOwotCi0gIFNjYW5SZXN1bHRzIHNjYW5fcmVzdWx0czsKLQotICBVdWlkIGxhc3Rfd3JpdGU7Ci0gIGNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCogZ2F0dDsKLSAgaW50IHNlcnZlcl9pZjsKLSAgaW50IGNsaWVudF9pZjsKLSAgaW50IHNlcnZpY2VfaGFuZGxlOwotICBzdGQ6OnNldDxpbnQ+IGNvbm5lY3Rpb25zOwotCi0gIHN0ZDo6bXV0ZXggbG9jazsKLSAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgYXBpX3N5bmNocm9uaXplOwotICBpbnQgcGlwZWZkW2tQaXBlTnVtRW5kc107Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZ2F0dAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgewotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCBpbiByZXNwb25zZSB0byByZWdpc3Rlcl9zZXJ2ZXIgKi8KLXZvaWQgUmVnaXN0ZXJTZXJ2ZXJDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgYXBwX3V1aWQpIHsKLSAgTE9HX0lORk8oIiVzOiBzdGF0dXM6JWQgc2VydmVyX2lmOiVkIGFwcF91dWlkOiVwIiwgX19mdW5jX18sIHN0YXR1cywKLSAgICAgICAgICAgc2VydmVyX2lmLCAmYXBwX3V1aWQpOwotCi0gIGdfaW50ZXJuYWwtPnNlcnZlcl9pZiA9IHNlcnZlcl9pZjsKLQotICBwZW5kaW5nX3N2Y19kZWNsLnB1c2hfYmFjayh7Ci0gICAgICAudXVpZCA9IGFwcF91dWlkLAotICAgICAgLnR5cGUgPSBCVEdBVFRfREJfUFJJTUFSWV9TRVJWSUNFLAotICB9KTsKLX0KLQotdm9pZCBTZXJ2aWNlQWRkZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidGdhdHRfZGJfZWxlbWVudF90KiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VydmljZV9jb3VudCkgewotICBMT0dfSU5GTygiJXM6IHN0YXR1czolZCBzZXJ2ZXJfaWY6JWQgY291bnQ6JXp1IHN2Y19oYW5kbGU6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgc3RhdHVzLCBzZXJ2ZXJfaWYsIHNlcnZpY2VfY291bnQsIHNlcnZpY2VbMF0uYXR0cmlidXRlX2hhbmRsZSk7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ19pbnRlcm5hbC0+bG9jayk7Ci0gIGdfaW50ZXJuYWwtPnNlcnZlcl9pZiA9IHNlcnZlcl9pZjsKLQotICBnX2ludGVybmFsLT5zZXJ2aWNlX2hhbmRsZSA9IHNlcnZpY2VbMF0uYXR0cmlidXRlX2hhbmRsZTsKLQotICB1aW50MTZfdCBwcmV2X2NoYXJfaGFuZGxlID0gMDsKLSAgdWludDE2X3QgcHJldl9jaGFyX3Byb3BlcnRpZXMgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNlcnZpY2VfY291bnQ7IGkrKykgewotICAgIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QmIGVsID0gc2VydmljZVtpXTsKLSAgICBpZiAoZWwudHlwZSA9PSBCVEdBVFRfREJfREVTQ1JJUFRPUikgewotICAgICAgTE9HX0lORk8oIiVzOiBkZXNjcl9oYW5kbGU6JWQiLCBfX2Z1bmNfXywgZWwuYXR0cmlidXRlX2hhbmRsZSk7Ci0gICAgfSBlbHNlIGlmIChlbC50eXBlID09IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQykgewotICAgICAgYmx1ZXRvb3RoOjpVdWlkIGlkKGVsLnV1aWQpOwotICAgICAgdWludDE2X3QgY2hhcl9oYW5kbGUgPSBlbC5hdHRyaWJ1dGVfaGFuZGxlOwotCi0gICAgICBMT0dfSU5GTygiJXM6IGNoYXJfaGFuZGxlOiVkIiwgX19mdW5jX18sIGNoYXJfaGFuZGxlKTsKLQotICAgICAgZ19pbnRlcm5hbC0+dXVpZF90b19hdHRyaWJ1dGVbaWRdID0gY2hhcl9oYW5kbGU7Ci0gICAgICBnX2ludGVybmFsLT5jaGFyYWN0ZXJpc3RpY3NbY2hhcl9oYW5kbGVdLnV1aWQgPSBpZDsKLSAgICAgIGdfaW50ZXJuYWwtPmNoYXJhY3RlcmlzdGljc1tjaGFyX2hhbmRsZV0uYmxvYl9zZWN0aW9uID0gMDsKLQotICAgICAgLy8gSWYgdGhlIGFkZGVkIGNoYXJhY3RlcmlzdGljIGlzIGJsb2IKLSAgICAgIGlmIChibG9iX2luZGV4LmZpbmQoaSkgIT0gYmxvYl9pbmRleC5lbmQoKSkgewotICAgICAgICAvLyBGaW5hbGx5LCBhc3NvY2lhdGUgdGhlIGNvbnRyb2wgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlIGF0dHJpYnV0ZS4KLSAgICAgICAgLy8gQWxzbywgaW5pdGlhbGl6ZSB0aGUgY29udHJvbCBhdHRyaWJ1dGUgdG8gYSByZWFkYWJsZSB6ZXJvLgotICAgICAgICBjb25zdCB1aW50MTZfdCBjb250cm9sX2F0dHJpYnV0ZSA9IGNoYXJfaGFuZGxlOwotICAgICAgICBjb25zdCB1aW50MTZfdCBibG9iX2F0dHJpYnV0ZSA9IHByZXZfY2hhcl9oYW5kbGU7Ci0gICAgICAgIGdfaW50ZXJuYWwtPmNvbnRyb2xsZWRfYmxvYnNbY29udHJvbF9hdHRyaWJ1dGVdID0gYmxvYl9hdHRyaWJ1dGU7Ci0gICAgICAgIGdfaW50ZXJuYWwtPmNoYXJhY3RlcmlzdGljc1tibG9iX2F0dHJpYnV0ZV0ubm90aWZ5ID0KLSAgICAgICAgICAgIHByZXZfY2hhcl9wcm9wZXJ0aWVzICYgYmx1ZXRvb3RoOjpnYXR0OjprUHJvcGVydHlOb3RpZnk7Ci0KLSAgICAgICAgYmx1ZXRvb3RoOjpnYXR0OjpDaGFyYWN0ZXJpc3RpYyYgY3RybCA9Ci0gICAgICAgICAgICBnX2ludGVybmFsLT5jaGFyYWN0ZXJpc3RpY3NbY29udHJvbF9hdHRyaWJ1dGVdOwotICAgICAgICBjdHJsLm5leHRfYmxvYi5jbGVhcigpOwotICAgICAgICBjdHJsLm5leHRfYmxvYi5wdXNoX2JhY2soMCk7Ci0gICAgICAgIGN0cmwubmV4dF9ibG9iX3BlbmRpbmcgPSB0cnVlOwotICAgICAgICBjdHJsLmJsb2Jfc2VjdGlvbiA9IDA7Ci0gICAgICAgIGN0cmwubm90aWZ5ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBwcmV2X2NoYXJfaGFuZGxlID0gY2hhcl9oYW5kbGU7Ci0gICAgICBwcmV2X2NoYXJfcHJvcGVydGllcyA9IGVsLnByb3BlcnRpZXM7Ci0gICAgfQotICB9Ci0KLSAgcGVuZGluZ19zdmNfZGVjbC5jbGVhcigpOwotICBibG9iX2luZGV4LmNsZWFyKCk7Ci0KLSAgLy8gVGhlIFV1aWQgcHJvdmlkZWQgaGVyZSBpcyB1bmltcG9ydGFudCwgYW5kIGlzIG9ubHkgdXNlZCB0byBzYXRpc2Z5Ci0gIC8vIEJsdWVEcm9pZC4KLSAgLy8gSXQgbXVzdCBiZSBkaWZmZXJlbnQgdGhhbiBhbnkgb3RoZXIgcmVnaXN0ZXJlZCBVdWlkLgotICBibHVldG9vdGg6OlV1aWQgY2xpZW50X2lkID0gYmx1ZXRvb3RoOjpVdWlkOjpHZXRSYW5kb20oKTsKLQotICBidF9zdGF0dXNfdCBidHN0YXQgPQotICAgICAgZ19pbnRlcm5hbC0+Z2F0dC0+Y2xpZW50LT5yZWdpc3Rlcl9jbGllbnQoY2xpZW50X2lkLCBmYWxzZSk7Ci0gIGlmIChidHN0YXQgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgY2xpZW50IiwgX19mdW5jX18pOwotICB9Ci19Ci0KLXZvaWQgUmVxdWVzdFJlYWRDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJfaGFuZGxlLCBpbnQgYXR0cmlidXRlX29mZnNldF9vY3RldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb25nKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdfaW50ZXJuYWwtPmxvY2spOwotCi0gIGJsdWV0b290aDo6Z2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoID0KLSAgICAgIGdfaW50ZXJuYWwtPmNoYXJhY3RlcmlzdGljc1thdHRyX2hhbmRsZV07Ci0KLSAgLy8gTGF0Y2ggbmV4dF9ibG9iIHRvIGJsb2Igb24gYSAnZnJlc2gnIHJlYWQuCi0gIGlmIChjaC5uZXh0X2Jsb2JfcGVuZGluZyAmJiBhdHRyaWJ1dGVfb2Zmc2V0X29jdGV0cyA9PSAwICYmCi0gICAgICBjaC5ibG9iX3NlY3Rpb24gPT0gMCkgewotICAgIHN0ZDo6c3dhcChjaC5ibG9iLCBjaC5uZXh0X2Jsb2IpOwotICAgIGNoLm5leHRfYmxvYl9wZW5kaW5nID0gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBzaXplX3QgYmxvYl9vZmZzZXRfb2N0ZXRzID0KLSAgICAgIHN0ZDo6bWluKGNoLmJsb2Iuc2l6ZSgpLCBjaC5ibG9iX3NlY3Rpb24gKiBrTWF4R2F0dEF0dHJpYnV0ZVNpemUpOwotICBjb25zdCBzaXplX3QgYmxvYl9yZW1haW5pbmcgPSBjaC5ibG9iLnNpemUoKSAtIGJsb2Jfb2Zmc2V0X29jdGV0czsKLSAgY29uc3Qgc2l6ZV90IGF0dHJpYnV0ZV9zaXplID0gc3RkOjptaW4oa01heEdhdHRBdHRyaWJ1dGVTaXplLCBibG9iX3JlbWFpbmluZyk7Ci0KLSAgc3RkOjpzdHJpbmcgYWRkcihCdEFkZHJTdHJpbmcoJmJkYSkpOwotICBMT0dfSU5GTygKLSAgICAgICIlczogY29ubmVjdGlvbjolZCAoJXMpIHJlYWRpbmcgYXR0cjolZCBhdHRyaWJ1dGVfb2Zmc2V0X29jdGV0czolZCAiCi0gICAgICAiYmxvYl9zZWN0aW9uOiV1IChpc19sb25nOiV1KSIsCi0gICAgICBfX2Z1bmNfXywgY29ubl9pZCwgYWRkci5jX3N0cigpLCBhdHRyX2hhbmRsZSwgYXR0cmlidXRlX29mZnNldF9vY3RldHMsCi0gICAgICBjaC5ibG9iX3NlY3Rpb24sIGlzX2xvbmcpOwotCi0gIGJ0Z2F0dF9yZXNwb25zZV90IHJlc3BvbnNlOwotICByZXNwb25zZS5hdHRyX3ZhbHVlLmxlbiA9IDA7Ci0KLSAgaWYgKGF0dHJpYnV0ZV9vZmZzZXRfb2N0ZXRzIDwgc3RhdGljX2Nhc3Q8aW50PihhdHRyaWJ1dGVfc2l6ZSkpIHsKLSAgICBzdGQ6OmNvcHkoY2guYmxvYi5iZWdpbigpICsgYmxvYl9vZmZzZXRfb2N0ZXRzICsgYXR0cmlidXRlX29mZnNldF9vY3RldHMsCi0gICAgICAgICAgICAgIGNoLmJsb2IuYmVnaW4oKSArIGJsb2Jfb2Zmc2V0X29jdGV0cyArIGF0dHJpYnV0ZV9zaXplLAotICAgICAgICAgICAgICByZXNwb25zZS5hdHRyX3ZhbHVlLnZhbHVlKTsKLSAgICByZXNwb25zZS5hdHRyX3ZhbHVlLmxlbiA9IGF0dHJpYnV0ZV9zaXplIC0gYXR0cmlidXRlX29mZnNldF9vY3RldHM7Ci0gIH0KLQotICByZXNwb25zZS5hdHRyX3ZhbHVlLmhhbmRsZSA9IGF0dHJfaGFuZGxlOwotICByZXNwb25zZS5hdHRyX3ZhbHVlLm9mZnNldCA9IGF0dHJpYnV0ZV9vZmZzZXRfb2N0ZXRzOwotICByZXNwb25zZS5hdHRyX3ZhbHVlLmF1dGhfcmVxID0gMDsKLSAgZ19pbnRlcm5hbC0+Z2F0dC0+c2VydmVyLT5zZW5kX3Jlc3BvbnNlKGNvbm5faWQsIHRyYW5zX2lkLCAwLCByZXNwb25zZSk7Ci19Ci0KLXZvaWQgUmVxdWVzdFdyaXRlQ2FsbGJhY2soaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cl9oYW5kbGUsIGludCBhdHRyaWJ1dGVfb2Zmc2V0LCBib29sIG5lZWRfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXAsIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHN0ZDo6c3RyaW5nIGFkZHIoQnRBZGRyU3RyaW5nKCZiZGEpKTsKLSAgTE9HX0lORk8oCi0gICAgICAiJXM6IGNvbm5lY3Rpb246JWQgKCVzOnRyYW5zOiVkKSB3cml0ZSBhdHRyOiVkIGF0dHJpYnV0ZV9vZmZzZXQ6JWQgIgotICAgICAgImxlbmd0aDolenUgIgotICAgICAgIm5lZWRfcmVzcDoldSBpc19wcmVwOiV1IiwKLSAgICAgIF9fZnVuY19fLCBjb25uX2lkLCBhZGRyLmNfc3RyKCksIHRyYW5zX2lkLCBhdHRyX2hhbmRsZSwgYXR0cmlidXRlX29mZnNldCwKLSAgICAgIGxlbmd0aCwgbmVlZF9yc3AsIGlzX3ByZXApOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdfaW50ZXJuYWwtPmxvY2spOwotCi0gIGJsdWV0b290aDo6Z2F0dDo6Q2hhcmFjdGVyaXN0aWMmIGNoID0KLSAgICAgIGdfaW50ZXJuYWwtPmNoYXJhY3RlcmlzdGljc1thdHRyX2hhbmRsZV07Ci0KLSAgY2guYmxvYi5yZXNpemUoYXR0cmlidXRlX29mZnNldCArIGxlbmd0aCk7Ci0KLSAgc3RkOjpjb3B5KHZhbHVlLCB2YWx1ZSArIGxlbmd0aCwgY2guYmxvYi5iZWdpbigpICsgYXR0cmlidXRlX29mZnNldCk7Ci0KLSAgYXV0byB0YXJnZXRfYmxvYiA9IGdfaW50ZXJuYWwtPmNvbnRyb2xsZWRfYmxvYnMuZmluZChhdHRyX2hhbmRsZSk7Ci0gIC8vIElmIHRoaXMgaXMgYSBjb250cm9sIGF0dHJpYnV0ZSwgYWRqdXN0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGJsb2IuCi0gIGlmICh0YXJnZXRfYmxvYiAhPSBnX2ludGVybmFsLT5jb250cm9sbGVkX2Jsb2JzLmVuZCgpICYmCi0gICAgICBjaC5ibG9iLnNpemUoKSA9PSAxdSkgewotICAgIGdfaW50ZXJuYWwtPmNoYXJhY3RlcmlzdGljc1t0YXJnZXRfYmxvYi0+c2Vjb25kXS5ibG9iX3NlY3Rpb24gPSBjaC5ibG9iWzBdOwotICAgIExPR19JTkZPKCIlczogdXBkYXRpbmcgYXR0cmlidXRlICVkIGJsb2Jfc2VjdGlvbiB0byAldSIsIF9fZnVuY19fLAotICAgICAgICAgICAgIHRhcmdldF9ibG9iLT5zZWNvbmQsIGNoLmJsb2JbMF0pOwotICB9IGVsc2UgaWYgKCFpc19wcmVwKSB7Ci0gICAgLy8gVGhpcyBpcyBhIHNpbmdsZSBmcmFtZSBjaGFyYWN0ZXJpc3RpYyB3cml0ZS4KLSAgICAvLyBOb3RpZnkgdXB3YXJkcyBiZWNhdXNlIHdlJ3JlIGRvbmUgbm93LgotICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZDo6VVVJRDEyOEJpdCYgYXR0cl91dWlkID0gY2gudXVpZC5UbzEyOEJpdEJFKCk7Ci0gICAgc3NpemVfdCBzdGF0dXM7Ci0gICAgT1NJX05PX0lOVFIoc3RhdHVzID0gd3JpdGUoZ19pbnRlcm5hbC0+cGlwZWZkW2tQaXBlV3JpdGVFbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfdXVpZC5kYXRhKCksIGF0dHJfdXVpZC5zaXplKCkpKTsKLSAgICBpZiAoLTEgPT0gc3RhdHVzKQotICAgICAgTE9HX0VSUk9SKCIlczogd3JpdGUgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICB9IGVsc2UgewotICAgIC8vIFRoaXMgaXMgYSBtdWx0aS1mcmFtZSBjaGFyYWN0ZXJpc3RpYyB3cml0ZS4KLSAgICAvLyBXYWl0IGZvciBhbiAnUmVxdWVzdEV4ZWNXcml0ZUNhbGxiYWNrJyB0byBub3RpZnkgY29tcGxldGlvbi4KLSAgICBnX2ludGVybmFsLT5sYXN0X3dyaXRlID0gY2gudXVpZDsKLSAgfQotCi0gIC8vIFJlc3BvbmQgb25seSBpZiBuZWVkZWQuCi0gIGlmICghbmVlZF9yc3ApIHJldHVybjsKLQotICBidGdhdHRfcmVzcG9uc2VfdCByZXNwb25zZTsKLSAgcmVzcG9uc2UuYXR0cl92YWx1ZS5oYW5kbGUgPSBhdHRyX2hhbmRsZTsKLSAgcmVzcG9uc2UuYXR0cl92YWx1ZS5vZmZzZXQgPSBhdHRyaWJ1dGVfb2Zmc2V0OwotICByZXNwb25zZS5hdHRyX3ZhbHVlLmxlbiA9IGxlbmd0aDsKLSAgcmVzcG9uc2UuYXR0cl92YWx1ZS5hdXRoX3JlcSA9IDA7Ci0gIC8vIFByb3ZpZGUgd3JpdHRlbiBkYXRhIGJhY2sgdG8gc2VuZGVyIGZvciB0aGUgcmVzcG9uc2UuCi0gIC8vIFJlbW90ZSBzdGFja3MgdXNlIHRoaXMgdG8gdmFsaWRhdGUgdGhlIHN1Y2Nlc3Mgb2YgdGhlIHdyaXRlLgotICBzdGQ6OmNvcHkodmFsdWUsIHZhbHVlICsgbGVuZ3RoLCByZXNwb25zZS5hdHRyX3ZhbHVlLnZhbHVlKTsKLSAgZ19pbnRlcm5hbC0+Z2F0dC0+c2VydmVyLT5zZW5kX3Jlc3BvbnNlKGNvbm5faWQsIHRyYW5zX2lkLCAwLCByZXNwb25zZSk7Ci19Ci0KLXZvaWQgUmVxdWVzdEV4ZWNXcml0ZUNhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGVjX3dyaXRlKSB7Ci0gIHN0ZDo6c3RyaW5nIGFkZHIoQnRBZGRyU3RyaW5nKCZiZGEpKTsKLSAgTE9HX0lORk8oIiVzOiBjb25uZWN0aW9uOiVkICglczp0cmFuczolZCkgZXhlY193cml0ZTolZCIsIF9fZnVuY19fLCBjb25uX2lkLAotICAgICAgICAgICBhZGRyLmNfc3RyKCksIHRyYW5zX2lkLCBleGVjX3dyaXRlKTsKLQotICAvLyBUaGlzICdyZXNwb25zZScgZGF0YSBpcyB1bnVzZWQgZm9yIEV4ZWNXcml0ZVJlc3BvbnNlcy4KLSAgLy8gSXQgaXMgb25seSB1c2VkIHRvIHBhc3MgQmx1ZURyb2lkIGFyZ3VtZW50IHZhbGlkYXRpb24uCi0gIGJ0Z2F0dF9yZXNwb25zZV90IHJlc3BvbnNlID0ge307Ci0gIGdfaW50ZXJuYWwtPmdhdHQtPnNlcnZlci0+c2VuZF9yZXNwb25zZShjb25uX2lkLCB0cmFuc19pZCwgMCwgcmVzcG9uc2UpOwotCi0gIGlmICghZXhlY193cml0ZSkgcmV0dXJuOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdfaW50ZXJuYWwtPmxvY2spOwotICAvLyBDb21tdW5pY2F0ZSB0aGUgYXR0cmlidXRlIFV1aWQgYXMgbm90aWZpY2F0aW9uIG9mIGEgd3JpdGUgdXBkYXRlLgotICBjb25zdCBibHVldG9vdGg6OlV1aWQ6OlVVSUQxMjhCaXQgdXVpZCA9IGdfaW50ZXJuYWwtPmxhc3Rfd3JpdGUuVG8xMjhCaXRCRSgpOwotICBzc2l6ZV90IHN0YXR1czsKLSAgT1NJX05PX0lOVFIoc3RhdHVzID0gd3JpdGUoZ19pbnRlcm5hbC0+cGlwZWZkW2tQaXBlV3JpdGVFbmRdLCB1dWlkLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZC5zaXplKCkpKTsKLSAgaWYgKC0xID09IHN0YXR1cykKLSAgICBMT0dfRVJST1IoIiVzOiB3cml0ZSBmYWlsZWQ6ICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLXZvaWQgQ29ubmVjdGlvbkNhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgc2VydmVyX2lmLCBpbnQgY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIHN0ZDo6c3RyaW5nIGFkZHIoQnRBZGRyU3RyaW5nKCZiZGEpKTsKLSAgTE9HX0lORk8oIiVzOiBjb25uZWN0aW9uOiVkIHNlcnZlcl9pZjolZCBjb25uZWN0ZWQ6JWQgYWRkcjolcyIsIF9fZnVuY19fLAotICAgICAgICAgICBjb25uX2lkLCBzZXJ2ZXJfaWYsIGNvbm5lY3RlZCwgYWRkci5jX3N0cigpKTsKLSAgaWYgKGNvbm5lY3RlZCA9PSAxKSB7Ci0gICAgZ19pbnRlcm5hbC0+Y29ubmVjdGlvbnMuaW5zZXJ0KGNvbm5faWQpOwotICB9IGVsc2UgaWYgKGNvbm5lY3RlZCA9PSAwKSB7Ci0gICAgZ19pbnRlcm5hbC0+Y29ubmVjdGlvbnMuZXJhc2UoY29ubl9pZCk7Ci0gIH0KLX0KLQotdm9pZCBFbmFibGVBZHZlcnRpc2luZ0NhbGxiYWNrKHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdHVzOiVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gIC8vIFRoaXMgdGVybWluYXRlcyBhIFN0YXJ0IGNhbGwuCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdfaW50ZXJuYWwtPmxvY2spOwotICBnX2ludGVybmFsLT5hcGlfc3luY2hyb25pemUubm90aWZ5X29uZSgpOwotfQotCi12b2lkIFJlZ2lzdGVyQ2xpZW50Q2FsbGJhY2soaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKSB7Ci0gIExPR19JTkZPKCIlczogc3RhdHVzOiVkIGNsaWVudF9pZjolZCB1dWlkWzBdOiVzIiwgX19mdW5jX18sIHN0YXR1cywgY2xpZW50X2lmLAotICAgICAgICAgICBhcHBfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBnX2ludGVybmFsLT5jbGllbnRfaWYgPSBjbGllbnRfaWY7Ci0KLSAgLy8gU2V0dXAgb3VyIGFkdmVydGlzZW1lbnQuIFRoaXMgaGFzIG5vIGNhbGxiYWNrLgotICBnX2ludGVybmFsLT5nYXR0LT5hZHZlcnRpc2VyLT5TZXREYXRhKDAgLyogc3RkX2luc3QgKi8sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKlRPRE86IHB1dCBpbnZlcnZhbCAyLDIgaGVyZSovfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSk7Ci0KLSAgZ19pbnRlcm5hbC0+Z2F0dC0+YWR2ZXJ0aXNlci0+RW5hYmxlKAotICAgICAgMCAvKiBzdGRfaW5zdCAqLywgdHJ1ZSwgYmFzZTo6QmluZCgmRW5hYmxlQWR2ZXJ0aXNpbmdDYWxsYmFjayksCi0gICAgICAwIC8qIG5vIGR1cmF0aW9uICovLCAwIC8qIG5vIG1heEV4dEFkdkV2ZW50Ki8sIGJhc2U6OkRvTm90aGluZygpKTsKLX0KLQotdm9pZCBTZXJ2aWNlU3RvcHBlZENhbGxiYWNrKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsIGludCBzcnZjX2hhbmRsZSkgewotICBMT0dfSU5GTygiJXM6IHN0YXR1czolZCBzZXJ2ZXJfaWY6JWQgc3J2Y19oYW5kbGU6JWQiLCBfX2Z1bmNfXywgc3RhdHVzLAotICAgICAgICAgICBzZXJ2ZXJfaWYsIHNydmNfaGFuZGxlKTsKLSAgLy8gVGhpcyB0ZXJtaW5hdGVzIGEgU3RvcCBjYWxsLgotICAvLyBUT0RPKGljb29saWRnZSk6IG1ha2UgdGhpcyBzeW1tZXRyaWMgd2l0aCBzdGFydAotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnX2ludGVybmFsLT5sb2NrKTsKLSAgZ19pbnRlcm5hbC0+YXBpX3N5bmNocm9uaXplLm5vdGlmeV9vbmUoKTsKLX0KLQotdm9pZCBTY2FuUmVzdWx0Q2FsbGJhY2sodWludDE2X3QgYmxlX2V2dF90eXBlLCB1aW50OF90IGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIGJkYSwgdWludDhfdCBibGVfcHJpbWFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsZV9zZWNvbmRhcnlfcGh5LCB1aW50OF90IGJsZV9hZHZlcnRpc2luZ19zaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgYmxlX3R4X3Bvd2VyLCBpbnQ4X3QgcnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsZV9wZXJpb2RpY19hZHZfaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGEpIHsKLSAgc3RkOjpzdHJpbmcgYWRkcihCdEFkZHJTdHJpbmcoYmRhKSk7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdfaW50ZXJuYWwtPmxvY2spOwotICBnX2ludGVybmFsLT5zY2FuX3Jlc3VsdHNbYWRkcl0gPSByc3NpOwotfQotCi12b2lkIENsaWVudENvbm5lY3RDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBzdGQ6OnN0cmluZyBhZGRyKEJ0QWRkclN0cmluZygmYmRhKSk7Ci0gIExPR19JTkZPKCIlczogY29ubl9pZDolZCBzdGF0dXM6JWQgY2xpZW50X2lmOiVkICVzIiwgX19mdW5jX18sIGNvbm5faWQsCi0gICAgICAgICAgIHN0YXR1cywgY2xpZW50X2lmLCBhZGRyLmNfc3RyKCkpOwotfQotCi12b2lkIENsaWVudERpc2Nvbm5lY3RDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBzdGQ6OnN0cmluZyBhZGRyKEJ0QWRkclN0cmluZygmYmRhKSk7Ci0gIExPR19JTkZPKCIlczogY29ubl9pZDolZCBzdGF0dXM6JWQgY2xpZW50X2lmOiVkICVzIiwgX19mdW5jX18sIGNvbm5faWQsCi0gICAgICAgICAgIHN0YXR1cywgY2xpZW50X2lmLCBhZGRyLmNfc3RyKCkpOwotfQotCi12b2lkIEluZGljYXRpb25TZW50Q2FsbGJhY2soVU5VU0VEX0FUVFIgaW50IGNvbm5faWQsIFVOVVNFRF9BVFRSIGludCBzdGF0dXMpIHsKLSAgLy8gVE9ETyhpY29vbGlkZ2UpOiB3aGF0IHRvIGRvCi19Ci0KLXZvaWQgUmVzcG9uc2VDb25maXJtYXRpb25DYWxsYmFjayhVTlVTRURfQVRUUiBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGludCBoYW5kbGUpIHsKLSAgLy8gVE9ETyhpY29vbGlkZ2UpOiB3aGF0IHRvIGRvCi19Ci0KLWNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfY2FsbGJhY2tzX3QgZ2F0dF9zZXJ2ZXJfY2FsbGJhY2tzID0gewotICAgIFJlZ2lzdGVyU2VydmVyQ2FsbGJhY2ssCi0gICAgQ29ubmVjdGlvbkNhbGxiYWNrLAotICAgIFNlcnZpY2VBZGRlZENhbGxiYWNrLAotICAgIFNlcnZpY2VTdG9wcGVkQ2FsbGJhY2ssCi0gICAgbnVsbHB0ciwgLyogc2VydmljZV9kZWxldGVkX2NiICovCi0gICAgUmVxdWVzdFJlYWRDYWxsYmFjaywKLSAgICBSZXF1ZXN0UmVhZENhbGxiYWNrLAotICAgIFJlcXVlc3RXcml0ZUNhbGxiYWNrLAotICAgIFJlcXVlc3RXcml0ZUNhbGxiYWNrLAotICAgIFJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjaywKLSAgICBSZXNwb25zZUNvbmZpcm1hdGlvbkNhbGxiYWNrLAotICAgIEluZGljYXRpb25TZW50Q2FsbGJhY2ssCi0gICAgbnVsbHB0ciwgLyogY29uZ2VzdGlvbl9jYiovCi0gICAgbnVsbHB0ciwgLyogbXR1X2NoYW5nZWRfY2IgKi8KLSAgICBudWxscHRyLCAvKiBwaHlfdXBkYXRlX2NiICovCi0gICAgbnVsbHB0ciwgLyogY29ubl91cGRhdGVfY2IgKi8KLX07Ci0KLS8vIFRPRE8oZWlzZW5iYWNoKTogUmVmYWN0b3IgR0FUVCBpbnRlcmZhY2UgdG8gbm90IHJlcXVpcmUgc2VydmVycwotLy8gdG8gcmVmZXIgdG8gdGhlIGNsaWVudCBpbnRlcmZhY2UuCi1jb25zdCBidGdhdHRfY2xpZW50X2NhbGxiYWNrc190IGdhdHRfY2xpZW50X2NhbGxiYWNrcyA9IHsKLSAgICBSZWdpc3RlckNsaWVudENhbGxiYWNrLAotICAgIENsaWVudENvbm5lY3RDYWxsYmFjaywKLSAgICBDbGllbnREaXNjb25uZWN0Q2FsbGJhY2ssCi0gICAgbnVsbHB0ciwgLyogc2VhcmNoX2NvbXBsZXRlX2NiOyAqLwotICAgIG51bGxwdHIsIC8qIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb25fY2I7ICovCi0gICAgbnVsbHB0ciwgLyogbm90aWZ5X2NiOyAqLwotICAgIG51bGxwdHIsIC8qIHJlYWRfY2hhcmFjdGVyaXN0aWNfY2I7ICovCi0gICAgbnVsbHB0ciwgLyogd3JpdGVfY2hhcmFjdGVyaXN0aWNfY2I7ICovCi0gICAgbnVsbHB0ciwgLyogcmVhZF9kZXNjcmlwdG9yX2NiOyAqLwotICAgIG51bGxwdHIsIC8qIHdyaXRlX2Rlc2NyaXB0b3JfY2I7ICovCi0gICAgbnVsbHB0ciwgLyogZXhlY3V0ZV93cml0ZV9jYjsgKi8KLSAgICBudWxscHRyLCAvKiByZWFkX3JlbW90ZV9yc3NpX2NiOyAqLwotICAgIG51bGxwdHIsIC8qIGNvbmZpZ3VyZV9tdHVfY2I7ICovCi0gICAgbnVsbHB0ciwgLyogY29uZ2VzdGlvbl9jYjsgKi8KLSAgICBudWxscHRyLCAvKiBnZXRfZ2F0dF9kYl9jYjsgKi8KLSAgICBudWxscHRyLCAvKiBzZXJ2aWNlc19yZW1vdmVkX2NiICovCi0gICAgbnVsbHB0ciwgLyogc2VydmljZXNfYWRkZWRfY2IgKi8KLSAgICBudWxscHRyLCAvKiBwaHlfdXBkYXRlX2NiICovCi0gICAgbnVsbHB0ciwgLyogY29ubl91cGRhdGVfY2IgKi8KLSAgICBudWxscHRyLCAvKiBzZXJ2aWNlX2NoYW5nZWRfY2IqLwotfTsKLQotY29uc3QgYnRnYXR0X3NjYW5uZXJfY2FsbGJhY2tzX3QgZ2F0dF9zY2FubmVyX2NhbGxiYWNrcyA9IHsKLSAgICBTY2FuUmVzdWx0Q2FsbGJhY2ssCi0gICAgbnVsbHB0ciwgLyogYmF0Y2hzY2FuX3JlcG9ydHNfY2I7ICovCi0gICAgbnVsbHB0ciwgLyogYmF0Y2hzY2FuX3RocmVzaG9sZF9jYjsgKi8KLSAgICBudWxscHRyLCAvKiB0cmFja19hZHZfZXZlbnRfY2I7ICovCi19OwotCi1jb25zdCBidGdhdHRfY2FsbGJhY2tzX3QgZ2F0dF9jYWxsYmFja3MgPSB7Ci0gICAgLyoqIFNldCB0byBzaXplb2YoYnRnYXR0X2NhbGxiYWNrc190KSAqLwotICAgIHNpemVvZihidGdhdHRfY2FsbGJhY2tzX3QpLAotCi0gICAgLyoqIEdBVFQgQ2xpZW50IGNhbGxiYWNrcyAqLwotICAgICZnYXR0X2NsaWVudF9jYWxsYmFja3MsCi0KLSAgICAvKiogR0FUVCBTZXJ2ZXIgY2FsbGJhY2tzICovCi0gICAgJmdhdHRfc2VydmVyX2NhbGxiYWNrcywKLQotICAgIC8qKiBHQVRUIFNlcnZlciBjYWxsYmFja3MgKi8KLSAgICAmZ2F0dF9zY2FubmVyX2NhbGxiYWNrcywKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBnYXR0IHsKLQotaW50IFNlcnZlckludGVybmFsczo6SW5pdGlhbGl6ZSgpIHsKLSAgLy8gR2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIEdBVFQgcHJvZmlsZS4KLSAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIGJ0X2lmYWNlID0KLSAgICAgIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMSW50ZXJmYWNlKCk7Ci0gIGdhdHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJ0Z2F0dF9pbnRlcmZhY2VfdCo+KAotICAgICAgYnRfaWZhY2UtPmdldF9wcm9maWxlX2ludGVyZmFjZShCVF9QUk9GSUxFX0dBVFRfSUQpKTsKLSAgaWYgKCFnYXR0KSB7Ci0gICAgTE9HX0VSUk9SKCJFcnJvciBnZXR0aW5nIEdBVFQgaW50ZXJmYWNlIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgYnRfc3RhdHVzX3QgYnRzdGF0ID0gZ2F0dC0+aW5pdCgmZ2F0dF9jYWxsYmFja3MpOwotICBpZiAoYnRzdGF0ICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBnYXR0IGludGVyZmFjZSIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGludCBzdGF0dXMgPSBwaXBlKHBpcGVmZCk7Ci0gIGlmIChzdGF0dXMgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoInBpcGUgY3JlYXRpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWJ0X3N0YXR1c190IFNlcnZlckludGVybmFsczo6QWRkQ2hhcmFjdGVyaXN0aWMoY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJtaXNzaW9ucykgewotICBwZW5kaW5nX3N2Y19kZWNsLnB1c2hfYmFjayh7LnV1aWQgPSB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcGVydGllcyA9IHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uc30pOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLVNlcnZlckludGVybmFsczo6U2VydmVySW50ZXJuYWxzKCkKLSAgICA6IGdhdHQobnVsbHB0ciksCi0gICAgICBzZXJ2ZXJfaWYoMCksCi0gICAgICBjbGllbnRfaWYoMCksCi0gICAgICBzZXJ2aWNlX2hhbmRsZSgwKSwKLSAgICAgIHBpcGVmZHtJTlZBTElEX0ZELCBJTlZBTElEX0ZEfSB7fQotCi1TZXJ2ZXJJbnRlcm5hbHM6On5TZXJ2ZXJJbnRlcm5hbHMoKSB7Ci0gIGlmIChwaXBlZmRbMF0gIT0gSU5WQUxJRF9GRCkgY2xvc2UocGlwZWZkWzBdKTsKLSAgaWYgKHBpcGVmZFsxXSAhPSBJTlZBTElEX0ZEKSBjbG9zZShwaXBlZmRbMV0pOwotCi0gIGdhdHQtPnNlcnZlci0+ZGVsZXRlX3NlcnZpY2Uoc2VydmVyX2lmLCBzZXJ2aWNlX2hhbmRsZSk7Ci0gIGdhdHQtPnNlcnZlci0+dW5yZWdpc3Rlcl9zZXJ2ZXIoc2VydmVyX2lmKTsKLSAgZ2F0dC0+Y2xpZW50LT51bnJlZ2lzdGVyX2NsaWVudChjbGllbnRfaWYpOwotfQotCi1TZXJ2ZXI6OlNlcnZlcigpIDogaW50ZXJuYWxfKG51bGxwdHIpIHt9Ci0KLVNlcnZlcjo6flNlcnZlcigpIHt9Ci0KLWJvb2wgU2VydmVyOjpJbml0aWFsaXplKGNvbnN0IFV1aWQmIHNlcnZpY2VfaWQsIGludCogZ2F0dF9waXBlKSB7Ci0gIGludGVybmFsXy5yZXNldChuZXcgU2VydmVySW50ZXJuYWxzKTsKLSAgaWYgKCFpbnRlcm5hbF8pIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIGNyZWF0aW5nIGludGVybmFscyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBnX2ludGVybmFsID0gaW50ZXJuYWxfLmdldCgpOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbnRlcm5hbF8tPmxvY2spOwotICBpbnQgc3RhdHVzID0gaW50ZXJuYWxfLT5Jbml0aWFsaXplKCk7Ci0gIGlmIChzdGF0dXMpIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIGluaXRpYWxpemluZyBpbnRlcm5hbHMiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBidF9zdGF0dXNfdCBidHN0YXQgPQotICAgICAgaW50ZXJuYWxfLT5nYXR0LT5zZXJ2ZXItPnJlZ2lzdGVyX3NlcnZlcihzZXJ2aWNlX2lkLCBmYWxzZSk7Ci0gIGlmIChidHN0YXQgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBzZXJ2ZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnRlcm5hbF8tPmFwaV9zeW5jaHJvbml6ZS53YWl0KGxvY2spOwotICAvLyBUT0RPKGljb29saWRnZSk6IEJldHRlciBlcnJvciBoYW5kbGluZy4KLSAgaWYgKGludGVybmFsXy0+c2VydmVyX2lmID09IDApIHsKLSAgICBMT0dfRVJST1IoIkluaXRpYWxpemF0aW9uIG9mIHNlcnZlciBmYWlsZWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqZ2F0dF9waXBlID0gaW50ZXJuYWxfLT5waXBlZmRba1BpcGVSZWFkRW5kXTsKLSAgTE9HX0lORk8oIlNlcnZlciBJbml0aWFsaXplIHN1Y2NlZWRlZCIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXJ2ZXI6OlNldEFkdmVydGlzZW1lbnQoY29uc3Qgc3RkOjp2ZWN0b3I8VXVpZD4mIGlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXJ2aWNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWFudWZhY3R1cmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyYW5zbWl0X25hbWUpIHsKLSAgLy8gc3RkOjp2ZWN0b3I8dWludDhfdD4gaWRfZGF0YTsKLSAgLy8gY29uc3QgYXV0byYgbXV0YWJsZV9tYW51ZmFjdHVyZXJfZGF0YSA9IG1hbnVmYWN0dXJlcl9kYXRhOwotICAvLyBjb25zdCBhdXRvJiBtdXRhYmxlX3NlcnZpY2VfZGF0YSA9IHNlcnZpY2VfZGF0YTsKLQotICAvLyBmb3IgKGNvbnN0IFV1aWQgJmlkIDogaWRzKSB7Ci0gIC8vICAgY29uc3QgYXV0byBsZV9pZCA9IGlkLlRvMTI4Qml0TEUoKTsKLSAgLy8gICBpZF9kYXRhLmluc2VydChpZF9kYXRhLmVuZCgpLCBsZV9pZC5iZWdpbigpLCBsZV9pZC5lbmQoKSk7Ci0gIC8vIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpbnRlcm5hbF8tPmxvY2spOwotCi0gIC8vIFNldHVwIG91ciBhZHZlcnRpc2VtZW50LiBUaGlzIGhhcyBubyBjYWxsYmFjay4KLSAgaW50ZXJuYWxfLT5nYXR0LT5hZHZlcnRpc2VyLT5TZXREYXRhKDAsIGZhbHNlLCAvKiBiZWFjb24sIG5vdCBzY2FuIHJlc3BvbnNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICAvLyB0cmFuc21pdF9uYW1lLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgLy8gMiwgMiwgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwKLSAgLy8gbXV0YWJsZV9tYW51ZmFjdHVyZXJfZGF0YSwKLSAgLy8gbXV0YWJsZV9zZXJ2aWNlX2RhdGEsCi0gIC8vIGlkX2RhdGEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXJ2ZXI6OlNldFNjYW5SZXNwb25zZShjb25zdCBzdGQ6OnZlY3RvcjxVdWlkPiYgaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2VydmljZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWFudWZhY3R1cmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJhbnNtaXRfbmFtZSkgewotICAvLyBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpZF9kYXRhOwotICAvLyBjb25zdCBhdXRvJiBtdXRhYmxlX21hbnVmYWN0dXJlcl9kYXRhID0gbWFudWZhY3R1cmVyX2RhdGE7Ci0gIC8vIGNvbnN0IGF1dG8mIG11dGFibGVfc2VydmljZV9kYXRhID0gc2VydmljZV9kYXRhOwotCi0gIC8vIGZvciAoY29uc3QgVXVpZCAmaWQgOiBpZHMpIHsKLSAgLy8gICBjb25zdCBhdXRvIGxlX2lkID0gaWQuVG8xMjhCaXRMRSgpOwotICAvLyAgIGlkX2RhdGEuaW5zZXJ0KGlkX2RhdGEuZW5kKCksIGxlX2lkLmJlZ2luKCksIGxlX2lkLmVuZCgpKTsKLSAgLy8gfQotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGludGVybmFsXy0+bG9jayk7Ci0KLSAgLy8gU2V0dXAgb3VyIGFkdmVydGlzZW1lbnQuIFRoaXMgaGFzIG5vIGNhbGxiYWNrLgotICBpbnRlcm5hbF8tPmdhdHQtPmFkdmVydGlzZXItPlNldERhdGEoMCwgdHJ1ZSwgLyogc2NhbiByZXNwb25zZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIGJhc2U6OkRvTm90aGluZygpKTsKLSAgLy8gdHJhbnNtaXRfbmFtZSwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgLy8gZmFsc2UsICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHR4cG93ZXIgKi8KLSAgLy8gMiwgMiwgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbAotICAvLyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXBwZWFyYW5jZSAqLwotICAvLyBtdXRhYmxlX21hbnVmYWN0dXJlcl9kYXRhLAotICAvLyBtdXRhYmxlX3NlcnZpY2VfZGF0YSwKLSAgLy8gaWRfZGF0YSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlcnZlcjo6QWRkQ2hhcmFjdGVyaXN0aWMoY29uc3QgVXVpZCYgaWQsIGludCBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJtaXNzaW9ucykgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW50ZXJuYWxfLT5sb2NrKTsKLSAgYnRfc3RhdHVzX3QgYnRzdGF0ID0KLSAgICAgIGludGVybmFsXy0+QWRkQ2hhcmFjdGVyaXN0aWMoaWQsIHByb3BlcnRpZXMsIHBlcm1pc3Npb25zKTsKLSAgaWYgKGJ0c3RhdCAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGFkZCBjaGFyYWN0ZXJpc3RpYyB0byBzZXJ2aWNlOiAweCUwNHgiLAotICAgICAgICAgICAgICBpbnRlcm5hbF8tPnNlcnZpY2VfaGFuZGxlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50ZXJuYWxfLT5hcGlfc3luY2hyb25pemUud2FpdChsb2NrKTsKLSAgY29uc3QgaW50IGhhbmRsZSA9IGludGVybmFsXy0+dXVpZF90b19hdHRyaWJ1dGVbaWRdOwotICBpbnRlcm5hbF8tPmNoYXJhY3RlcmlzdGljc1toYW5kbGVdLm5vdGlmeSA9IHByb3BlcnRpZXMgJiBrUHJvcGVydHlOb3RpZnk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlcnZlcjo6QWRkQmxvYihjb25zdCBVdWlkJiBpZCwgY29uc3QgVXVpZCYgY29udHJvbF9pZCwgaW50IHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcGVybWlzc2lvbnMpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGludGVybmFsXy0+bG9jayk7Ci0KLSAgLy8gRmlyc3QsIGFkZCB0aGUgcHJpbWFyeSBhdHRyaWJ1dGUgKGNoYXJhY3RlcmlzdGljIHZhbHVlKQotICBidF9zdGF0dXNfdCBidHN0YXQgPQotICAgICAgaW50ZXJuYWxfLT5BZGRDaGFyYWN0ZXJpc3RpYyhpZCwgcHJvcGVydGllcywgcGVybWlzc2lvbnMpOwotICBpZiAoYnRzdGF0ICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHNjYW4gcmVzcG9uc2UgZGF0YSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIE5leHQsIGFkZCB0aGUgc2Vjb25kYXJ5IGF0dHJpYnV0ZSAoYmxvYiBjb250cm9sKS4KLSAgLy8gQ29udHJvbCBhdHRyaWJ1dGVzIGhhdmUgZml4ZWQgcGVybWlzc2lvbnMvcHJvcGVydGllcy4KLSAgLy8gUmVtZW1iZXIgcG9zaXRpb24gYXQgd2hpY2ggYmxvYiB3YXMgYWRkZWQuCi0gIGJsb2JfaW5kZXguaW5zZXJ0KHBlbmRpbmdfc3ZjX2RlY2wuc2l6ZSgpKTsKLSAgYnRzdGF0ID0KLSAgICAgIGludGVybmFsXy0+QWRkQ2hhcmFjdGVyaXN0aWMoY29udHJvbF9pZCwga1Byb3BlcnR5UmVhZCB8IGtQcm9wZXJ0eVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUGVybWlzc2lvblJlYWQgfCBrUGVybWlzc2lvbldyaXRlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXJ2ZXI6OlN0YXJ0KCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW50ZXJuYWxfLT5sb2NrKTsKLSAgYnRfc3RhdHVzX3QgYnRzdGF0ID0gaW50ZXJuYWxfLT5nYXR0LT5zZXJ2ZXItPmFkZF9zZXJ2aWNlKAotICAgICAgaW50ZXJuYWxfLT5zZXJ2ZXJfaWYsIHBlbmRpbmdfc3ZjX2RlY2wuZGF0YSgpLCBwZW5kaW5nX3N2Y19kZWNsLnNpemUoKSk7Ci0gIGlmIChidHN0YXQgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBzdGFydCBzZXJ2aWNlIHdpdGggaGFuZGxlOiAweCUwNHgiLAotICAgICAgICAgICAgICBpbnRlcm5hbF8tPnNlcnZpY2VfaGFuZGxlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50ZXJuYWxfLT5hcGlfc3luY2hyb25pemUud2FpdChsb2NrKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2VydmVyOjpTdG9wKCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW50ZXJuYWxfLT5sb2NrKTsKLSAgYnRfc3RhdHVzX3QgYnRzdGF0ID0gaW50ZXJuYWxfLT5nYXR0LT5zZXJ2ZXItPnN0b3Bfc2VydmljZSgKLSAgICAgIGludGVybmFsXy0+c2VydmVyX2lmLCBpbnRlcm5hbF8tPnNlcnZpY2VfaGFuZGxlKTsKLSAgaWYgKGJ0c3RhdCAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHN0b3Agc2VydmljZSB3aXRoIGhhbmRsZTogMHglMDR4IiwKLSAgICAgICAgICAgICAgaW50ZXJuYWxfLT5zZXJ2aWNlX2hhbmRsZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludGVybmFsXy0+YXBpX3N5bmNocm9uaXplLndhaXQobG9jayk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlcnZlcjo6U2NhbkVuYWJsZSgpIHsKLSAgaW50ZXJuYWxfLT5nYXR0LT5zY2FubmVyLT5TY2FuKHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXJ2ZXI6OlNjYW5EaXNhYmxlKCkgewotICBpbnRlcm5hbF8tPmdhdHQtPnNjYW5uZXItPlNjYW4oZmFsc2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTZXJ2ZXI6OkdldFNjYW5SZXN1bHRzKFNjYW5SZXN1bHRzKiByZXN1bHRzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGludGVybmFsXy0+bG9jayk7Ci0gICpyZXN1bHRzID0gaW50ZXJuYWxfLT5zY2FuX3Jlc3VsdHM7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlcnZlcjo6U2V0Q2hhcmFjdGVyaXN0aWNWYWx1ZShjb25zdCBVdWlkJiBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpbnRlcm5hbF8tPmxvY2spOwotICBjb25zdCBpbnQgYXR0cmlidXRlX2lkID0gaW50ZXJuYWxfLT51dWlkX3RvX2F0dHJpYnV0ZVtpZF07Ci0gIENoYXJhY3RlcmlzdGljJiBjaCA9IGludGVybmFsXy0+Y2hhcmFjdGVyaXN0aWNzW2F0dHJpYnV0ZV9pZF07Ci0gIGNoLm5leHRfYmxvYiA9IHZhbHVlOwotICBjaC5uZXh0X2Jsb2JfcGVuZGluZyA9IHRydWU7Ci0KLSAgaWYgKCFjaC5ub3RpZnkpIHJldHVybiB0cnVlOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGluZF92YWx1ZSA9IHswfTsKLSAgZm9yIChhdXRvIGNvbm5lY3Rpb24gOiBpbnRlcm5hbF8tPmNvbm5lY3Rpb25zKSB7Ci0gICAgaW50ZXJuYWxfLT5nYXR0LT5zZXJ2ZXItPnNlbmRfaW5kaWNhdGlvbihpbnRlcm5hbF8tPnNlcnZlcl9pZiwgYXR0cmlidXRlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgdHJ1ZSwgaW5kX3ZhbHVlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZF92YWx1ZS5zaXplKCkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlcnZlcjo6R2V0Q2hhcmFjdGVyaXN0aWNWYWx1ZShjb25zdCBVdWlkJiBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiB2YWx1ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhpbnRlcm5hbF8tPmxvY2spOwotICBjb25zdCBpbnQgYXR0cmlidXRlX2lkID0gaW50ZXJuYWxfLT51dWlkX3RvX2F0dHJpYnV0ZVtpZF07Ci0gICp2YWx1ZSA9IGludGVybmFsXy0+Y2hhcmFjdGVyaXN0aWNzW2F0dHJpYnV0ZV9pZF0uYmxvYjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBnYXR0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2dhdHRfc2VydmVyX29sZC5oIGIvc2VydmljZS9nYXR0X3NlcnZlcl9vbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2ZjE2NC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2dhdHRfc2VydmVyX29sZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImhhcmR3YXJlL2JsdWV0b290aC5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2dhdHQuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZ2F0dCB7Ci0KLS8vIEF0dHJpYnV0ZSBwZXJtaXNzaW9uIHZhbHVlcwotY29uc3QgaW50IGtQZXJtaXNzaW9uUmVhZCA9IDB4MTsKLWNvbnN0IGludCBrUGVybWlzc2lvblJlYWRFbmNyeXB0ZWQgPSAweDI7Ci1jb25zdCBpbnQga1Blcm1pc3Npb25SZWFkRW5jcnlwdGVkTWl0bSA9IDB4NDsKLWNvbnN0IGludCBrUGVybWlzc2lvbldyaXRlID0gMHgxMDsKLWNvbnN0IGludCBrUGVybWlzc2lvbldyaXRlRW5lY3J5cHRlZCA9IDB4MjA7Ci1jb25zdCBpbnQgS1Blcm1pc3Npb25Xcml0ZUVuY3J5cHRlZE1pdG0gPSAweDQwOwotY29uc3QgaW50IGtQZXJtaXNzaW9uV3JpdGVTaWduZWQgPSAweDgwOwotY29uc3QgaW50IGtQZXJtaXNzaW9uV3JpdGVTaWduZWRNaXRtID0gMHgxMDA7Ci0KLS8vIEdBVFQgY2hhcmFjdGVyaXN0aWMgcHJvcGVydGllcyBiaXQtZmllbGQgdmFsdWVzCi1jb25zdCBpbnQga1Byb3BlcnR5QnJvYWRjYXN0ID0gMHgxOwotY29uc3QgaW50IGtQcm9wZXJ0eVJlYWQgPSAweDI7Ci1jb25zdCBpbnQga1Byb3BlcnR5V3JpdGVOb1Jlc3BvbnNlID0gMHg0OwotY29uc3QgaW50IGtQcm9wZXJ0eVdyaXRlID0gMHg4OwotY29uc3QgaW50IGtQcm9wZXJ0eU5vdGlmeSA9IDB4MTA7Ci1jb25zdCBpbnQga1Byb3BlcnR5SW5kaWNhdGUgPSAweDIwOwotY29uc3QgaW50IGtQcm9wZXJ0eVNpZ25lZFdyaXRlID0gMHg0MDsKLWNvbnN0IGludCBrUHJvcGVydHlFeHRlbmRlZFByb3BzID0gMHg4MDsKLQotLy8gQSBtYXBwaW5nIGZyb20gc3RyaW5nIGJsdWV0b290aCBhZGRyZXNzZXMgdG8gUlNTSSBtZWFzdXJlbWVudHMuCi10eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50PiBTY2FuUmVzdWx0czsKLQotLy8gVE9ETyhhcm1hbnNpdG8pOiBUaGlzIHNob3VsZCBiZSBhIHByaXZhdGUgaW50ZXJuYWwgY2xhc3MgdGhvdWdoIEkgZG9uJ3Qgc2VlCi0vLyB3aHkgd2UgZXZlbiBuZWVkIHRoaXMgY2xhc3MuIEluc3RlYWQgaXQgc2hvdWxkIHByb2JhYmx5IGJlIG1lcmdlZCBpbnRvCi0vLyBTZXJ2ZXIuCi1zdHJ1Y3QgU2VydmVySW50ZXJuYWxzOwotCi0vLyBTZXJ2ZXIgaXMgdGhyZWFkc2FmZSBhbmQgaW50ZXJuYWxseSBsb2NrZWQuCi0vLyBBc3luY2hyb25vdXMgSU8gaXMgaWRlbnRpZmllZCB2aWEgYSBnYXR0X3BpcGUgRkQsCi0vLyBhbmQgc3luY2hyb25vdXNseSByZWFkIHdpdGggJ0dldENoYXJhY3RlcmlzdGljVmFsdWUnCi0vLwotLy8gKioqKkRFUFJFQ0FURUQqKioqCi0vLwotLy8gVE9ETyhhcm1hbnNpdG8pOiBUaGlzIGNsYXNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGlzIGJlaW5nIHJlcGxhY2VkIGJ5Ci0vLyBibHVldG9vdGg6OkdhdHRTZXJ2ZXIuIFdlIHdpbGwgcmVtb3ZlIHRoaXMgZW50aXJlbHkgb25jZSB0aGUgbmV3IGNvZGUgaXMKLS8vIHJlYWR5LgotY2xhc3MgU2VydmVyIHsKLSBwdWJsaWM6Ci0gIFNlcnZlcigpOwotICB+U2VydmVyKCk7Ci0KLSAgLy8gUmVnaXN0ZXIgR0FUVCBpbnRlcmZhY2UsIGluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUsCi0gIC8vIGFuZCBvcGVuIGEgcGlwZSBmb3IgY2hhcmFjdGVyaXN0aWMgd3JpdGUgbm90aWZpY2F0aW9uLgotICBib29sIEluaXRpYWxpemUoY29uc3QgVXVpZCYgc2VydmljZV9pZCwgaW50KiBnYXR0X3BpcGUpOwotCi0gIC8vIENvbnRyb2wgdGhlIGNvbnRlbnQgb2Ygc2VydmljZSBhZHZlcnRpc2VtZW50LgotICBib29sIFNldEFkdmVydGlzZW1lbnQoY29uc3Qgc3RkOjp2ZWN0b3I8VXVpZD4mIGlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXJ2aWNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWFudWZhY3R1cmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyYW5zbWl0X25hbWUpOwotCi0gIC8vIENvbnRyb2wgdGhlIGNvbnRlbnQgb2Ygc2VydmljZSBzY2FuIHJlc3BvbnNlLgotICBib29sIFNldFNjYW5SZXNwb25zZShjb25zdCBzdGQ6OnZlY3RvcjxVdWlkPiYgaWRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2VydmljZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWFudWZhY3R1cmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJhbnNtaXRfbmFtZSk7Ci0KLSAgLy8gQWRkIGFuIG9yZGluYXJ5IGNoYXJhY3RlcmlzdGljIGZvciByZWFkaW5nIGFuZC9vciB3cml0aW5nLgotICBib29sIEFkZENoYXJhY3RlcmlzdGljKGNvbnN0IFV1aWQmIGlkLCBpbnQgcHJvcGVydGllcywgaW50IHBlcm1pc3Npb25zKTsKLQotICAvLyBBZGQgYSBzcGVjaWFsICdibG9iJyBjaGFyYWN0ZXJpc3RpYyB3aXRoIGEgY29ycmVzcG9uZGluZyBjb250cm9sCi0gIC8vIGF0dHJpYnV0ZSB0byBtYW5pcHVsYXRlIHdoaWNoIHBhcnQgb2YgdGhlIGJsb2IgdGhlIGF0dHJpYnV0ZSByZXByZXNlbnRzLgotICBib29sIEFkZEJsb2IoY29uc3QgVXVpZCYgaWQsIGNvbnN0IFV1aWQmIGNvbnRyb2xfaWQsIGludCBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgaW50IHBlcm1pc3Npb25zKTsKLQotICAvLyBQdXQgYSBuZXcgdmFsdWUgaW50byBhIGNoYXJhY2V0ZXJpc3RpYy4KLSAgLy8gSXQgd2lsbCBiZSByZWFkIGZyb20gYSBjbGllbnQgc3RhcnRpbmcgYXQgdGhlIG5leHQgMC1vZmZzZXQgcmVhZC4KLSAgYm9vbCBTZXRDaGFyYWN0ZXJpc3RpY1ZhbHVlKGNvbnN0IFV1aWQmIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlKTsKLQotICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBjaGFyYWN0ZXJpc3RpYy4KLSAgYm9vbCBHZXRDaGFyYWN0ZXJpc3RpY1ZhbHVlKGNvbnN0IFV1aWQmIGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogdmFsdWUpOwotCi0gIC8vIFN0YXJ0IHRoaXMgc2VydmljZS4gQWN0aXZhdGUgYWR2ZXJ0aXNlbWVudHMsIGFsbG93IGNvbm5lY3Rpb25zLgotICAvLyBDaGFyYWN0ZXJpc3RpY3Mgc2hvdWxkIGFsbCBiZSBjcmVhdGVkIGJlZm9yZSB0aGlzLgotICBib29sIFN0YXJ0KCk7Ci0KLSAgLy8gQ2Vhc2UgYWR2ZXJ0aXNlbWVudHMgYW5kIGRpc2FsbG93IGNvbm5lY3Rpb25zLgotICBib29sIFN0b3AoKTsKLQotICAvLyBFbmFibGUgTEUgc2Nhbi4gU2NhbiByZXN1bHRzIHdpbGwgYmUgY2FjaGVkIGludGVybmFsbHkuCi0gIGJvb2wgU2NhbkVuYWJsZSgpOwotCi0gIC8vIERpc2FibGUgTEUgc2Nhbi4KLSAgYm9vbCBTY2FuRGlzYWJsZSgpOwotCi0gIC8vIENvcHkgb3V0IHRoZSBjYWNoZWQgc2NhbiByZXN1bHRzLgotICBib29sIEdldFNjYW5SZXN1bHRzKFNjYW5SZXN1bHRzKiByZXN1bHRzKTsKLQotIHByaXZhdGU6Ci0gIC8vIEludGVybmFsIGRhdGEuCi0gIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2ZXJJbnRlcm5hbHM+IGludGVybmFsXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBnYXR0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmNjIGIvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhNzU5ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvcHRyX3V0aWwuaD4KLSNpbmNsdWRlIDxiYXNlL29ic2VydmVyX2xpc3QuaD4KLQotI2luY2x1ZGUgPHNoYXJlZF9tdXRleD4KLQotI2luY2x1ZGUgImFic3RyYWN0X29ic2VydmVyX2xpc3QuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLQotbmFtZXNwYWNlIHsKLQotQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGdfaW50ZXJmYWNlID0gbnVsbHB0cjsKLQotI2lmIGRlZmluZWQoT1NfR0VORVJJQykgJiYgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pICYmIChfTElCQ1BQX1ZFUlNJT04gPCAzNTAwKQotdXNpbmcgc2hhcmVkX211dGV4X2ltcGwgPSBzdGQ6OnNoYXJlZF9tdXRleDsKLSNlbHNlCi11c2luZyBzaGFyZWRfbXV0ZXhfaW1wbCA9IHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4OwotI2VuZGlmCi0KLS8vIE11dGV4IHVzZWQgYnkgY2FsbGJhY2tzIHRvIGFjY2VzcyB8Z19pbnRlcmZhY2V8LiBJZiB3ZSBpbml0aWFsaXplIG9yIGNsZWFuIGl0Ci0vLyB1c2UgdW5pcXVlX2xvY2suIElmIG9ubHkgYWNjZXNzaW5nIHxnX2ludGVyZmFjZXwgdXNlIHNoYXJlZCBsb2NrLgotc2hhcmVkX211dGV4X2ltcGwgZ19pbnN0YW5jZV9sb2NrOwotCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU291cmNlT2JzZXJ2ZXI+KgotR2V0QTJkcFNvdXJjZU9ic2VydmVycygpOwotYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxCbHVldG9vdGhBdkludGVyZmFjZTo6QTJkcFNpbmtPYnNlcnZlcj4qCi1HZXRBMmRwU2lua09ic2VydmVycygpOwotCi0jZGVmaW5lIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZ19pbnRlcmZhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0coV0FSTklORykgPDwgIkNhbGxiYWNrIHJlY2VpdmVkIHdoaWxlIHxnX2ludGVyZmFjZXwgaXMgTlVMTCI7IFwKLSAgICAgIHJldHVybiBfX1ZBX0FSR1NfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIFNvdXJjZUNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfY29ubmVjdGlvbl9zdGF0ZV90IHN0YXRlKSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldEEyZHBTb3VyY2VPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKGdfaW50ZXJmYWNlLCBiZF9hZGRyLCBzdGF0ZSk7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VBdWRpb1N0YXRlQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYXVkaW9fc3RhdGVfdCBzdGF0ZSkgewotICBzdGQ6OnNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0QTJkcFNvdXJjZU9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuQXVkaW9TdGF0ZUNhbGxiYWNrKGdfaW50ZXJmYWNlLCBiZF9hZGRyLCBzdGF0ZSk7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VBdWRpb0NvbmZpZ0NhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWcsCi0gICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRBMmRwU291cmNlT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5BdWRpb0NvbmZpZ0NhbGxiYWNrKGdfaW50ZXJmYWNlLCBiZF9hZGRyLCBjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKTsKLSAgfQotfQotCi1ib29sIFNvdXJjZU1hbmRhdG9yeUNvZGVjUHJlZmVycmVkQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTihmYWxzZSk7Ci0gIC8vIFRoZSBtYW5kYXRvcnkgY29kZWMgaXMgcHJlZmVycmVkIG9ubHkgd2hlbiBhbGwgb2JzZXJ2ZXJzIGRpc2FibGUgdGhlaXIKLSAgLy8gb3B0aW9uYWwgY29kZWNzLgotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldEEyZHBTb3VyY2VPYnNlcnZlcnMoKSkgewotICAgIGlmICghb2JzZXJ2ZXIuTWFuZGF0b3J5Q29kZWNQcmVmZXJyZWRDYWxsYmFjayhnX2ludGVyZmFjZSwgYmRfYWRkcikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2lua0Nvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSkgewotICBzdGQ6OnNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0QTJkcFNpbmtPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKGdfaW50ZXJmYWNlLCBiZF9hZGRyLCBzdGF0ZSk7Ci0gIH0KLX0KLQotdm9pZCBTaW5rQXVkaW9TdGF0ZUNhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRBMmRwU2lua09ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuQXVkaW9TdGF0ZUNhbGxiYWNrKGdfaW50ZXJmYWNlLCBiZF9hZGRyLCBzdGF0ZSk7Ci0gIH0KLX0KLQotdm9pZCBTaW5rQXVkaW9Db25maWdDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2NvdW50KSB7Ci0gIHN0ZDo6c2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRBMmRwU2lua09ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuQXVkaW9Db25maWdDYWxsYmFjayhnX2ludGVyZmFjZSwgYmRfYWRkciwgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NvdW50KTsKLSAgfQotfQotCi1idGF2X3NvdXJjZV9jYWxsYmFja3NfdCBhdl9zb3VyY2VfY2FsbGJhY2tzID0gewotICAgIC5zaXplID0gc2l6ZW9mKGJ0YXZfc291cmNlX2NhbGxiYWNrc190KSwKLSAgICAuY29ubmVjdGlvbl9zdGF0ZV9jYiA9IFNvdXJjZUNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrLAotICAgIC5hdWRpb19zdGF0ZV9jYiA9IFNvdXJjZUF1ZGlvU3RhdGVDYWxsYmFjaywKLSAgICAuYXVkaW9fY29uZmlnX2NiID0gU291cmNlQXVkaW9Db25maWdDYWxsYmFjaywKLSAgICAubWFuZGF0b3J5X2NvZGVjX3ByZWZlcnJlZF9jYiA9IFNvdXJjZU1hbmRhdG9yeUNvZGVjUHJlZmVycmVkQ2FsbGJhY2ssCi19OwotCi1idGF2X3NpbmtfY2FsbGJhY2tzX3QgYXZfc2lua19jYWxsYmFja3MgPSB7Ci0gICAgLnNpemUgPSBzaXplb2YoYnRhdl9zaW5rX2NhbGxiYWNrc190KSwKLSAgICAuY29ubmVjdGlvbl9zdGF0ZV9jYiA9IFNpbmtDb25uZWN0aW9uU3RhdGVDYWxsYmFjaywKLSAgICAuYXVkaW9fc3RhdGVfY2IgPSBTaW5rQXVkaW9TdGF0ZUNhbGxiYWNrLAotICAgIC5hdWRpb19jb25maWdfY2IgPSBTaW5rQXVkaW9Db25maWdDYWxsYmFjaywKLX07Ci0KLWNsYXNzIEJsdWV0b290aEF2SW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBCbHVldG9vdGhBdkludGVyZmFjZSB7Ci0gcHVibGljOgotICBCbHVldG9vdGhBdkludGVyZmFjZUltcGwoKSA9IGRlZmF1bHQ7Ci0gIH5CbHVldG9vdGhBdkludGVyZmFjZUltcGwoKSBvdmVycmlkZSB7Ci0gICAgQTJkcFNpbmtEaXNhYmxlKCk7Ci0gICAgQTJkcFNvdXJjZURpc2FibGUoKTsKLSAgfQotCi0gIGJvb2wgQTJkcFNvdXJjZUVuYWJsZSgKLSAgICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNfcHJpb3JpdGllcykgb3ZlcnJpZGUgewotICAgIGlmIChzb3VyY2VfZW5hYmxlZF8pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IHN1cHBvcnQgb25lIGNvbm5lY3RlZCBhdWRpbyBkZXZpY2UuCi0gICAgaW50IG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcyA9IDE7Ci0gICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBvZmZsb2FkaW5nX3ByZWZlcmVuY2UoMCk7Ci0gICAgaWYgKGhhbF9zb3VyY2VfaWZhY2VfLT5pbml0KAotICAgICAgICAgICAgJmF2X3NvdXJjZV9jYWxsYmFja3MsIG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcywKLSAgICAgICAgICAgIHN0ZDo6bW92ZShjb2RlY19wcmlvcml0aWVzKSwKLSAgICAgICAgICAgIHN0ZDo6bW92ZShvZmZsb2FkaW5nX3ByZWZlcmVuY2UpKSAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgSEFMIEEyRFAgc291cmNlIGludGVyZmFjZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHNvdXJjZV9lbmFibGVkXyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIEEyZHBTb3VyY2VEaXNhYmxlKCkgb3ZlcnJpZGUgewotICAgIGlmICghc291cmNlX2VuYWJsZWRfKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaGFsX3NvdXJjZV9pZmFjZV8tPmNsZWFudXAoKTsKLSAgICBzb3VyY2VfZW5hYmxlZF8gPSBmYWxzZTsKLSAgfQotCi0gIGJvb2wgQTJkcFNpbmtFbmFibGUoKSBvdmVycmlkZSB7Ci0gICAgaWYgKHNpbmtfZW5hYmxlZF8pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IHN1cHBvcnQgb25lIGNvbm5lY3RlZCBhdWRpbyBkZXZpY2UuCi0gICAgaW50IG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcyA9IDE7Ci0gICAgaWYgKGhhbF9zaW5rX2lmYWNlXy0+aW5pdCgmYXZfc2lua19jYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29ubmVjdGVkX2F1ZGlvX2RldmljZXMpICE9Ci0gICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBIQUwgQTJEUCBzaW5rIGludGVyZmFjZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHNpbmtfZW5hYmxlZF8gPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBBMmRwU2lua0Rpc2FibGUoKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFzaW5rX2VuYWJsZWRfKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGhhbF9zaW5rX2lmYWNlXy0+Y2xlYW51cCgpOwotICAgIHNpbmtfZW5hYmxlZF8gPSBmYWxzZTsKLSAgfQotCi0gIHZvaWQgQWRkQTJkcFNvdXJjZU9ic2VydmVyKEEyZHBTb3VyY2VPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICBhMmRwX3NvdXJjZV9vYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlQTJkcFNvdXJjZU9ic2VydmVyKEEyZHBTb3VyY2VPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICBhMmRwX3NvdXJjZV9vYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIHZvaWQgQWRkQTJkcFNpbmtPYnNlcnZlcihBMmRwU2lua09ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIGEyZHBfc2lua19vYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlQTJkcFNpbmtPYnNlcnZlcihBMmRwU2lua09ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIGEyZHBfc2lua19vYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIGNvbnN0IGJ0YXZfc291cmNlX2ludGVyZmFjZV90KiBHZXRBMmRwU291cmNlSEFMSW50ZXJmYWNlKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBoYWxfc291cmNlX2lmYWNlXzsKLSAgfQotCi0gIGNvbnN0IGJ0YXZfc2lua19pbnRlcmZhY2VfdCogR2V0QTJkcFNpbmtIQUxJbnRlcmZhY2UoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGhhbF9zaW5rX2lmYWNlXzsKLSAgfQotCi0gIGJvb2wgSW5pdGlhbGl6ZSgpIHsKLSAgICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRfaWZhY2UgPQotICAgICAgICBCbHVldG9vdGhJbnRlcmZhY2U6OkdldCgpLT5HZXRIQUxJbnRlcmZhY2UoKTsKLSAgICBDSEVDSyhidF9pZmFjZSk7Ci0KLSAgICBjb25zdCBhdXRvKiBoYWxfc291cmNlX2lmYWNlID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCo+KAotICAgICAgICAgICAgYnRfaWZhY2UtPmdldF9wcm9maWxlX2ludGVyZmFjZShCVF9QUk9GSUxFX0FEVkFOQ0VEX0FVRElPX0lEKSk7Ci0gICAgaWYgKCFoYWxfc291cmNlX2lmYWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb2J0YWluIEEyRFAgc291cmNlIGludGVyZmFjZSBoYW5kbGUiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IGF1dG8qIGhhbF9zaW5rX2lmYWNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqPigKLSAgICAgICAgYnRfaWZhY2UtPmdldF9wcm9maWxlX2ludGVyZmFjZShCVF9QUk9GSUxFX0FEVkFOQ0VEX0FVRElPX1NJTktfSUQpKTsKLSAgICBpZiAoIWhhbF9zaW5rX2lmYWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb2J0YWluIEEyRFAgc2luayBpbnRlcmZhY2UgaGFuZGxlIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBoYWxfc2lua19pZmFjZV8gPSBoYWxfc2lua19pZmFjZTsKLSAgICBoYWxfc291cmNlX2lmYWNlXyA9IGhhbF9zb3VyY2VfaWZhY2U7Ci0KLSAgICAvLyBPbmx5IGluaXRpYWxpemUgdGhlIHNpbmsgaW50ZXJmYWNlLgotICAgIHJldHVybiBBMmRwU2lua0VuYWJsZSgpOwotICB9Ci0KLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxBMmRwU291cmNlT2JzZXJ2ZXI+KiBzb3VyY2Vfb2JzZXJ2ZXJzKCkgewotICAgIHJldHVybiAmYTJkcF9zb3VyY2Vfb2JzZXJ2ZXJzXzsKLSAgfQotCi0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8QTJkcFNpbmtPYnNlcnZlcj4qIHNpbmtfb2JzZXJ2ZXJzKCkgewotICAgIHJldHVybiAmYTJkcF9zaW5rX29ic2VydmVyc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8QTJkcFNvdXJjZU9ic2VydmVyPiBhMmRwX3NvdXJjZV9vYnNlcnZlcnNfOwotICBidGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEEyZHBTaW5rT2JzZXJ2ZXI+IGEyZHBfc2lua19vYnNlcnZlcnNfOwotCi0gIGNvbnN0IGJ0YXZfc291cmNlX2ludGVyZmFjZV90KiBoYWxfc291cmNlX2lmYWNlXyA9IG51bGxwdHI7Ci0gIGNvbnN0IGJ0YXZfc2lua19pbnRlcmZhY2VfdCogaGFsX3NpbmtfaWZhY2VfID0gbnVsbHB0cjsKLQotICBib29sIHNvdXJjZV9lbmFibGVkXyA9IGZhbHNlOwotICBib29sIHNpbmtfZW5hYmxlZF8gPSBmYWxzZTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoQXZJbnRlcmZhY2VJbXBsKTsKLX07Ci0KLW5hbWVzcGFjZSB7Ci0KLWJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8Qmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkEyZHBTb3VyY2VPYnNlcnZlcj4qCi1HZXRBMmRwU291cmNlT2JzZXJ2ZXJzKCkgewotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxCbHVldG9vdGhBdkludGVyZmFjZUltcGwqPihnX2ludGVyZmFjZSkKLSAgICAgIC0+c291cmNlX29ic2VydmVycygpOwotfQotCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU2lua09ic2VydmVyPioKLUdldEEyZHBTaW5rT2JzZXJ2ZXJzKCkgewotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxCbHVldG9vdGhBdkludGVyZmFjZUltcGwqPihnX2ludGVyZmFjZSktPnNpbmtfb2JzZXJ2ZXJzKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIEJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU291cmNlT2JzZXJ2ZXI6OkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKAotICAgIEJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSkgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU291cmNlT2JzZXJ2ZXI6OkF1ZGlvU3RhdGVDYWxsYmFjaygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkEyZHBTb3VyY2VPYnNlcnZlcjo6QXVkaW9Db25maWdDYWxsYmFjaygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4KLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLWJvb2wgQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkEyZHBTb3VyY2VPYnNlcnZlcjo6TWFuZGF0b3J5Q29kZWNQcmVmZXJyZWRDYWxsYmFjaygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gRG8gbm90aGluZy4KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU2lua09ic2VydmVyOjpDb25uZWN0aW9uU3RhdGVDYWxsYmFjaygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdkludGVyZmFjZTo6QTJkcFNpbmtPYnNlcnZlcjo6QXVkaW9TdGF0ZUNhbGxiYWNrKAotICAgIEJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBidGF2X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdkludGVyZmFjZTo6QTJkcFNpbmtPYnNlcnZlcjo6QXVkaW9Db25maWdDYWxsYmFjaygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgdWludDMyX3Qgc2FtcGxlX3JhdGUsIHVpbnQ4X3QgY2hhbm5lbF9jb3VudCkgewotICAvLyBEbyBub3RoaW5nLgotfQotCi0vLyBzdGF0aWMKLWJvb2wgQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkluaXRpYWxpemUoKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0soIWdfaW50ZXJmYWNlKTsKLQotICBhdXRvIGltcGwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJsdWV0b290aEF2SW50ZXJmYWNlSW1wbD4oKTsKLSAgaWYgKCFpbXBsLT5Jbml0aWFsaXplKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBCbHVldG9vdGhBdkludGVyZmFjZSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZ19pbnRlcmZhY2UgPSBpbXBsLnJlbGVhc2UoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBCbHVldG9vdGhBdkludGVyZmFjZTo6Q2xlYW5VcCgpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0KLSAgZGVsZXRlIGdfaW50ZXJmYWNlOwotICBnX2ludGVyZmFjZSA9IG51bGxwdHI7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBCbHVldG9vdGhBdkludGVyZmFjZTo6SXNJbml0aWFsaXplZCgpIHsKLSAgc3RkOjpzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICByZXR1cm4gZ19pbnRlcmZhY2UgIT0gbnVsbHB0cjsKLX0KLQotLy8gc3RhdGljCi12b2lkIEJsdWV0b290aEF2SW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZygKLSAgICBCbHVldG9vdGhBdkludGVyZmFjZSogdGVzdF9pbnN0YW5jZSkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIENIRUNLKHRlc3RfaW5zdGFuY2UpOwotICBDSEVDSyghZ19pbnRlcmZhY2UpOwotCi0gIGdfaW50ZXJmYWNlID0gdGVzdF9pbnN0YW5jZTsKLX0KLQotLy8gc3RhdGljCi1CbHVldG9vdGhBdkludGVyZmFjZSogQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldCgpIHsKLSAgc3RkOjpzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0gIHJldHVybiBnX2ludGVyZmFjZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5oIGIvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ0NGIyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaGFsL2JsdWV0b290aF9hdl9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9hdi5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLQotY2xhc3MgQmx1ZXRvb3RoQXZJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgY2xhc3MgQTJkcFNvdXJjZU9ic2VydmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgQ29ubmVjdGlvblN0YXRlQ2FsbGJhY2soQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIEF1ZGlvU3RhdGVDYWxsYmFjayhCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgQXVkaW9Db25maWdDYWxsYmFjaygKLSAgICAgICAgQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2NvbmZpZywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+Ci0gICAgICAgICAgICBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotICAgIHZpcnR1YWwgYm9vbCBNYW5kYXRvcnlDb2RlY1ByZWZlcnJlZENhbGxiYWNrKEJsdWV0b290aEF2SW50ZXJmYWNlKiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkEyZHBTb3VyY2VPYnNlcnZlcigpID0gZGVmYXVsdDsKLSAgfTsKLQotICBjbGFzcyBBMmRwU2lua09ic2VydmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgQ29ubmVjdGlvblN0YXRlQ2FsbGJhY2soQmx1ZXRvb3RoQXZJbnRlcmZhY2UqIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIEF1ZGlvU3RhdGVDYWxsYmFjayhCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgQXVkaW9Db25maWdDYWxsYmFjayhCbHVldG9vdGhBdkludGVyZmFjZSogaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfY291bnQpOwotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QTJkcFNpbmtPYnNlcnZlcigpID0gZGVmYXVsdDsKLSAgfTsKLQotICBzdGF0aWMgYm9vbCBJbml0aWFsaXplKCk7Ci0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLSAgc3RhdGljIGJvb2wgSXNJbml0aWFsaXplZCgpOwotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplRm9yVGVzdGluZyhCbHVldG9vdGhBdkludGVyZmFjZSogdGVzdF9pbnN0YW5jZSk7Ci0KLSAgc3RhdGljIEJsdWV0b290aEF2SW50ZXJmYWNlKiBHZXQoKTsKLQotICB2aXJ0dWFsIGJvb2wgQTJkcFNvdXJjZUVuYWJsZSgKLSAgICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNfcHJpb3JpdGllcykgPSAwOwotICB2aXJ0dWFsIHZvaWQgQTJkcFNvdXJjZURpc2FibGUoKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBBMmRwU2lua0VuYWJsZSgpID0gMDsKLSAgdmlydHVhbCB2b2lkIEEyZHBTaW5rRGlzYWJsZSgpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgQWRkQTJkcFNvdXJjZU9ic2VydmVyKEEyZHBTb3VyY2VPYnNlcnZlciogb2JzZXJ2ZXIpID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlbW92ZUEyZHBTb3VyY2VPYnNlcnZlcihBMmRwU291cmNlT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBZGRBMmRwU2lua09ic2VydmVyKEEyZHBTaW5rT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVBMmRwU2lua09ic2VydmVyKEEyZHBTaW5rT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0KLSAgdmlydHVhbCBjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCogR2V0QTJkcFNvdXJjZUhBTEludGVyZmFjZSgpID0gMDsKLSAgdmlydHVhbCBjb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqIEdldEEyZHBTaW5rSEFMSW50ZXJmYWNlKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBCbHVldG9vdGhBdkludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoQXZJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoQXZJbnRlcmZhY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2cmNwX2ludGVyZmFjZS5jYyBiL3NlcnZpY2UvaGFsL2JsdWV0b290aF9hdnJjcF9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWMwYTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2cmNwX2ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg5MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9hdnJjcF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvb2JzZXJ2ZXJfbGlzdC5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c2hhcmVkX211dGV4PgotCi0jaW5jbHVkZSAiYWJzdHJhY3Rfb2JzZXJ2ZXJfbGlzdC5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIHN0ZDo6bG9ja19ndWFyZDsKLXVzaW5nIHN0ZDo6bXV0ZXg7Ci11c2luZyBzdGQ6OnNoYXJlZF9sb2NrOwotdXNpbmcgc3RkOjp1bmlxdWVfbG9jazsKLSNpZiBkZWZpbmVkKE9TX0dFTkVSSUMpICYmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKSAmJiAoX0xJQkNQUF9WRVJTSU9OIDwgMzUwMCkKLXVzaW5nIHNoYXJlZF9tdXRleF9pbXBsID0gc3RkOjpzaGFyZWRfbXV0ZXg7Ci0jZWxzZQotdXNpbmcgc2hhcmVkX211dGV4X2ltcGwgPSBzdGQ6OnNoYXJlZF90aW1lZF9tdXRleDsKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUgZ2xvYmFsIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlIGluc3RhbmNlLgotQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2UqIGdfaW50ZXJmYWNlID0gbnVsbHB0cjsKLQotLy8gTXV0ZXggdXNlZCBieSBjYWxsYmFja3MgdG8gYWNjZXNzIHxnX2ludGVyZmFjZXwuIElmIHdlIGluaXRpYWxpemUgb3IgY2xlYW4gaXQKLS8vIHVzZSB1bmlxdWVfbG9jay4gSWYgb25seSBhY2Nlc3NpbmcgfGdfaW50ZXJmYWNlfCB1c2Ugc2hhcmVkIGxvY2suCi0vLyBUT0RPKGpwYXdsb3dza2kpOiB0aGlzIHNob3VsZCBiZSBqdXN0IHNoYXJlZF9tdXRleCwgYXMgd2UgY3VycmVudGx5IGRvbid0IHVzZQotLy8gdGltZWQgbWV0aG9kcy4gQ2hhbmdlIHRvIHNoYXJlZF9tdXRleCB3aGVuIHdlIHVwZ3JhZGUgdG8gQysrMTQKLXNoYXJlZF9tdXRleF9pbXBsIGdfaW5zdGFuY2VfbG9jazsKLQotLy8gSGVscGVyIGZvciBvYnRhaW5pbmcgdGhlIG9ic2VydmVyIGxpc3RzLiBUaGlzIGlzIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotLy8gYW5kIGRlZmluZWQgYmVsb3cgc2luY2UgaXQgZGVwZW5kcyBvbiBCbHVldG9vdGhJbnRlcmZhY2VJbXBsLgotYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6VGFyZ2V0T2JzZXJ2ZXI+KgotR2V0VGFyZ2V0T2JzZXJ2ZXJzKCk7Ci0KLWJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcj4qCi1HZXRDb250cm9sT2JzZXJ2ZXJzKCk7Ci0KLSNkZWZpbmUgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFnX2ludGVyZmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgcmVjZWl2ZWQgd2hpbGUgfGdfaW50ZXJmYWNlfCBpcyBOVUxMIjsgXAotICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotdm9pZCBSZW1vdGVGZWF0dXJlc0NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19yZW1vdGVfZmVhdHVyZXNfdCBmZWF0dXJlcykgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuUmVtb3RlRmVhdHVyZXNDYWxsYmFjayhiZF9hZGRyLCBmZWF0dXJlcyk7Ci0gIH0KLX0KLQotdm9pZCBHZXRQbGF5U3RhdHVzQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuR2V0UGxheVN0YXR1c0NhbGxiYWNrKGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgTGlzdFBsYXllckFwcEF0dHJDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0VGFyZ2V0T2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5MaXN0UGxheWVyQXBwQXR0ckNhbGxiYWNrKGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgTGlzdFBsYXllckFwcFZhbHVlc0NhbGxiYWNrKGJ0cmNfcGxheWVyX2F0dHJfdCBhdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuTGlzdFBsYXllckFwcFZhbHVlc0NhbGxiYWNrKGF0dHJfaWQsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgR2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLCBidHJjX3BsYXllcl9hdHRyX3QqIHBfYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuR2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayhudW1fYXR0ciwgcF9hdHRycywgYmRfYWRkcik7Ci0gIH0KLX0KLQotdm9pZCBHZXRQbGF5ZXJBcHBBdHRyc1RleHRDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3BsYXllcl9hdHRyX3QqIHBfYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRUYXJnZXRPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkdldFBsYXllckFwcEF0dHJzVGV4dENhbGxiYWNrKG51bV9hdHRyLCBwX2F0dHJzLCBiZF9hZGRyKTsKLSAgfQotfQotCi12b2lkIEdldFBsYXllckFwcFZhbHVlc1RleHRDYWxsYmFjayh1aW50OF90IGF0dHJfaWQsIHVpbnQ4X3QgbnVtX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRUYXJnZXRPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkdldFBsYXllckFwcFZhbHVlc1RleHRDYWxsYmFjayhhdHRyX2lkLCBudW1fdmFsLCBwX3ZhbHMsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgU2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayhidHJjX3BsYXllcl9zZXR0aW5nc190KiBwX3ZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuU2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayhwX3ZhbHMsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgR2V0RWxlbWVudEF0dHJDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLCBidHJjX21lZGlhX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0VGFyZ2V0T2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5HZXRFbGVtZW50QXR0ckNhbGxiYWNrKG51bV9hdHRyLCBwX2F0dHJzLCBiZF9hZGRyKTsKLSAgfQotfQotCi12b2lkIFJlZ2lzdGVyTm90aWZpY2F0aW9uQ2FsbGJhY2soYnRyY19ldmVudF9pZF90IGV2ZW50X2lkLCB1aW50MzJfdCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0VGFyZ2V0T2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5SZWdpc3Rlck5vdGlmaWNhdGlvbkNhbGxiYWNrKGV2ZW50X2lkLCBwYXJhbSwgYmRfYWRkcik7Ci0gIH0KLX0KLQotdm9pZCBWb2x1bWVDaGFuZ2VDYWxsYmFjayh1aW50OF90IHZvbHVtZSwgdWludDhfdCBjdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuVm9sdW1lQ2hhbmdlQ2FsbGJhY2sodm9sdW1lLCBjdHlwZSwgYmRfYWRkcik7Ci0gIH0KLX0KLQotdm9pZCBQYXNzdGhyb3VnaENtZENhbGxiYWNrKGludCBpZCwgaW50IGtleV9zdGF0ZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuUGFzc3Rocm91Z2hDbWRDYWxsYmFjayhpZCwga2V5X3N0YXRlLCBiZF9hZGRyKTsKLSAgfQotfQotCi12b2lkIFNldEFkZHJlc3NlZFBsYXllckNhbGxiYWNrKHVpbnQxNl90IHBsYXllcl9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuU2V0QWRkcmVzc2VkUGxheWVyQ2FsbGJhY2socGxheWVyX2lkLCBiZF9hZGRyKTsKLSAgfQotfQotCi12b2lkIFNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjayh1aW50MTZfdCBwbGF5ZXJfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRUYXJnZXRPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLlNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjayhwbGF5ZXJfaWQsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgR2V0Rm9sZGVySXRlbXNDYWxsYmFjayh1aW50OF90IHNjb3BlLCB1aW50MzJfdCBzdGFydF9pdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVuZF9pdGVtLCB1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX2F0dHJfaWRzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0VGFyZ2V0T2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5HZXRGb2xkZXJJdGVtc0NhbGxiYWNrKHNjb3BlLCBzdGFydF9pdGVtLCBlbmRfaXRlbSwgbnVtX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2F0dHJfaWRzLCBiZF9hZGRyKTsKLSAgfQotfQotCi12b2lkIENoYW5nZVBhdGhDYWxsYmFjayh1aW50OF90IGRpcmVjdGlvbiwgdWludDhfdCogZm9sZGVyX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRUYXJnZXRPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkNoYW5nZVBhdGhDYWxsYmFjayhkaXJlY3Rpb24sIGZvbGRlcl91aWQsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgR2V0SXRlbUF0dHJDYWxsYmFjayh1aW50OF90IHNjb3BlLCB1aW50OF90KiB1aWQsIHVpbnQxNl90IHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2F0dHIsIGJ0cmNfbWVkaWFfYXR0cl90KiBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRUYXJnZXRPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkdldEl0ZW1BdHRyQ2FsbGJhY2soc2NvcGUsIHVpZCwgdWlkX2NvdW50ZXIsIG51bV9hdHRyLCBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkcik7Ci0gIH0KLX0KLQotdm9pZCBQbGF5SXRlbUNhbGxiYWNrKHVpbnQ4X3Qgc2NvcGUsIHVpbnQxNl90IHVpZF9jb3VudGVyLCB1aW50OF90KiB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuUGxheUl0ZW1DYWxsYmFjayhzY29wZSwgdWlkX2NvdW50ZXIsIHVpZCwgYmRfYWRkcik7Ci0gIH0KLX0KLQotdm9pZCBHZXRUb3RhbE51bU9mSXRlbXNDYWxsYmFjayh1aW50OF90IHNjb3BlLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0VGFyZ2V0T2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5HZXRUb3RhbE51bU9mSXRlbXNDYWxsYmFjayhzY29wZSwgYmRfYWRkcik7Ci0gIH0KLX0KLQotdm9pZCBTZWFyY2hDYWxsYmFjayh1aW50MTZfdCBjaGFyc2V0X2lkLCB1aW50MTZfdCBzdHJfbGVuLCB1aW50OF90KiBwX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuU2VhcmNoQ2FsbGJhY2soc3RyX2xlbiwgcF9zdHIsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgQWRkVG9Ob3dQbGF5aW5nQ2FsbGJhY2sodWludDhfdCBzY29wZSwgdWludDhfdCogdWlkLCB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFRhcmdldE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuQWRkVG9Ob3dQbGF5aW5nQ2FsbGJhY2soc2NvcGUsIHVpZCwgdWlkX2NvdW50ZXIsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgUGFzc3Rocm91Z2hSc3BDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBpbnQgaWQsIGludCBrZXlfc3RhdGUpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRDb250cm9sT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5QYXNzdGhyb3VnaFJzcENhbGxiYWNrKGJkX2FkZHIsIGlkLCBrZXlfc3RhdGUpOwotICB9Ci19Ci0KLXZvaWQgR3JvdXBuYXZpZ2F0aW9uUnNwQ2FsbGJhY2soaW50IGlkLCBpbnQga2V5X3N0YXRlKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0Q29udHJvbE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuR3JvdXBuYXZpZ2F0aW9uUnNwQ2FsbGJhY2soaWQsIGtleV9zdGF0ZSk7Ci0gIH0KLX0KLQotdm9pZCBDb25uZWN0aW9uU3RhdGVDYWxsYmFjayhib29sIHJjX2Nvbm5lY3QsIGJvb2wgYnRfY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkNvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrKHJjX2Nvbm5lY3QsIGJ0X2Nvbm5lY3QsIGJkX2FkZHIpOwotICB9Ci19Ci0KLXZvaWQgQ3RybEdldHJjZmVhdHVyZXNDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBpbnQgZmVhdHVyZXMpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRDb250cm9sT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5DdHJsR2V0cmNmZWF0dXJlc0NhbGxiYWNrKGJkX2FkZHIsIGZlYXR1cmVzKTsKLSAgfQotfQotCi12b2lkIEN0cmxTZXRwbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdSc3BDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhY2NlcHRlZCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0Q29udHJvbE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuQ3RybFNldHBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ1JzcENhbGxiYWNrKGJkX2FkZHIsIGFjY2VwdGVkKTsKLSAgfQotfQotCi12b2lkIEN0cmxQbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdDYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IG51bV9hdHRyLAotICAgIGJ0cmNfcGxheWVyX2FwcF9hdHRyX3QqIGFwcF9hdHRycywgdWludDhfdCBudW1fZXh0X2F0dHIsCi0gICAgYnRyY19wbGF5ZXJfYXBwX2V4dF9hdHRyX3QqIGV4dF9hdHRycykgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkN0cmxQbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdDYWxsYmFjayhiZF9hZGRyLCBudW1fYXR0ciwgYXBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZXh0X2F0dHIsIGV4dF9hdHRycyk7Ci0gIH0KLX0KLQotdm9pZCBDdHJsUGxheWVyYXBwbGljYXRpb25zZXR0aW5nQ2hhbmdlZENhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGNvbnN0IGJ0cmNfcGxheWVyX3NldHRpbmdzX3QmIHZhbHMpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRDb250cm9sT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5DdHJsUGxheWVyYXBwbGljYXRpb25zZXR0aW5nQ2hhbmdlZENhbGxiYWNrKGJkX2FkZHIsIHZhbHMpOwotICB9Ci19Ci0KLXZvaWQgQ3RybFNldGFic3ZvbENtZENhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgYWJzX3ZvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGFiZWwpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRDb250cm9sT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5DdHJsU2V0YWJzdm9sQ21kQ2FsbGJhY2soYmRfYWRkciwgYWJzX3ZvbCwgbGFiZWwpOwotICB9Ci19Ci0KLXZvaWQgQ3RybFJlZ2lzdGVybm90aWZpY2F0aW9uQWJzVm9sQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYWJlbCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkN0cmxSZWdpc3Rlcm5vdGlmaWNhdGlvbkFic1ZvbENhbGxiYWNrKGJkX2FkZHIsIGxhYmVsKTsKLSAgfQotfQotCi12b2lkIEN0cmxUcmFja0NoYW5nZWRDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIHBfYXR0cnMpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRDb250cm9sT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5DdHJsVHJhY2tDaGFuZ2VkQ2FsbGJhY2soYmRfYWRkciwgbnVtX2F0dHIsIHBfYXR0cnMpOwotICB9Ci19Ci0KLXZvaWQgQ3RybFBsYXlQb3NpdGlvbkNoYW5nZWRDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvbmdfbGVuLCB1aW50MzJfdCBzb25nX3BvcykgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkN0cmxQbGF5UG9zaXRpb25DaGFuZ2VkQ2FsbGJhY2soYmRfYWRkciwgc29uZ19sZW4sIHNvbmdfcG9zKTsKLSAgfQotfQotCi12b2lkIEN0cmxQbGF5U3RhdHVzQ2hhbmdlZENhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcGxheV9zdGF0dXNfdCBwbGF5X3N0YXR1cykgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkN0cmxQbGF5U3RhdHVzQ2hhbmdlZENhbGxiYWNrKGJkX2FkZHIsIHBsYXlfc3RhdHVzKTsKLSAgfQotfQotCi12b2lkIEN0cmxHZXRGb2xkZXJJdGVtc0NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJ0cmNfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidHJjX2ZvbGRlcl9pdGVtc190KiBmb2xkZXJfaXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY291bnQpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRDb250cm9sT2JzZXJ2ZXJzKCkpIHsKLSAgICBvYnNlcnZlci5DdHJsR2V0Rm9sZGVySXRlbXNDYWxsYmFjayhiZF9hZGRyLCBzdGF0dXMsIGZvbGRlcl9pdGVtcywgY291bnQpOwotICB9Ci19Ci0KLXZvaWQgQ3RybENoYW5nZVBhdGhDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCBjb3VudCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkN0cmxDaGFuZ2VQYXRoQ2FsbGJhY2soYmRfYWRkciwgY291bnQpOwotICB9Ci19Ci0KLXZvaWQgQ3RybFNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IG51bV9pdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlcHRoKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiAqR2V0Q29udHJvbE9ic2VydmVycygpKSB7Ci0gICAgb2JzZXJ2ZXIuQ3RybFNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjayhiZF9hZGRyLCBudW1faXRlbXMsIGRlcHRoKTsKLSAgfQotfQotCi12b2lkIEN0cmxTZXRBZGRyZXNzZWRQbGF5ZXJDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHN0YXR1cykgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENvbnRyb2xPYnNlcnZlcnMoKSkgewotICAgIG9ic2VydmVyLkN0cmxTZXRBZGRyZXNzZWRQbGF5ZXJDYWxsYmFjayhiZF9hZGRyLCBzdGF0dXMpOwotICB9Ci19Ci0KLWJ0cmNfY2FsbGJhY2tzX3QgdGFyZ2V0X2NhbGxiYWNrcyA9IHsKLSAgICAuc2l6ZSA9IHNpemVvZihidHJjX2NhbGxiYWNrc190KSwKLSAgICAucmVtb3RlX2ZlYXR1cmVzX2NiID0gUmVtb3RlRmVhdHVyZXNDYWxsYmFjaywKLSAgICAuZ2V0X3BsYXlfc3RhdHVzX2NiID0gR2V0UGxheVN0YXR1c0NhbGxiYWNrLAotICAgIC5saXN0X3BsYXllcl9hcHBfYXR0cl9jYiA9IExpc3RQbGF5ZXJBcHBBdHRyQ2FsbGJhY2ssCi0gICAgLmxpc3RfcGxheWVyX2FwcF92YWx1ZXNfY2IgPSBMaXN0UGxheWVyQXBwVmFsdWVzQ2FsbGJhY2ssCi0gICAgLmdldF9wbGF5ZXJfYXBwX3ZhbHVlX2NiID0gR2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjaywKLSAgICAuZ2V0X3BsYXllcl9hcHBfYXR0cnNfdGV4dF9jYiA9IEdldFBsYXllckFwcEF0dHJzVGV4dENhbGxiYWNrLAotICAgIC5nZXRfcGxheWVyX2FwcF92YWx1ZXNfdGV4dF9jYiA9IEdldFBsYXllckFwcFZhbHVlc1RleHRDYWxsYmFjaywKLSAgICAuc2V0X3BsYXllcl9hcHBfdmFsdWVfY2IgPSBTZXRQbGF5ZXJBcHBWYWx1ZUNhbGxiYWNrLAotICAgIC5nZXRfZWxlbWVudF9hdHRyX2NiID0gR2V0RWxlbWVudEF0dHJDYWxsYmFjaywKLSAgICAucmVnaXN0ZXJfbm90aWZpY2F0aW9uX2NiID0gUmVnaXN0ZXJOb3RpZmljYXRpb25DYWxsYmFjaywKLSAgICAudm9sdW1lX2NoYW5nZV9jYiA9IFZvbHVtZUNoYW5nZUNhbGxiYWNrLAotICAgIC5wYXNzdGhyb3VnaF9jbWRfY2IgPSBQYXNzdGhyb3VnaENtZENhbGxiYWNrLAotICAgIC5zZXRfYWRkcmVzc2VkX3BsYXllcl9jYiA9IFNldEFkZHJlc3NlZFBsYXllckNhbGxiYWNrLAotICAgIC5zZXRfYnJvd3NlZF9wbGF5ZXJfY2IgPSBTZXRCcm93c2VkUGxheWVyQ2FsbGJhY2ssCi0gICAgLmdldF9mb2xkZXJfaXRlbXNfY2IgPSBHZXRGb2xkZXJJdGVtc0NhbGxiYWNrLAotICAgIC5jaGFuZ2VfcGF0aF9jYiA9IENoYW5nZVBhdGhDYWxsYmFjaywKLSAgICAuZ2V0X2l0ZW1fYXR0cl9jYiA9IEdldEl0ZW1BdHRyQ2FsbGJhY2ssCi0gICAgLnBsYXlfaXRlbV9jYiA9IFBsYXlJdGVtQ2FsbGJhY2ssCi0gICAgLmdldF90b3RhbF9udW1fb2ZfaXRlbXNfY2IgPSBHZXRUb3RhbE51bU9mSXRlbXNDYWxsYmFjaywKLSAgICAuc2VhcmNoX2NiID0gU2VhcmNoQ2FsbGJhY2ssCi0gICAgLmFkZF90b19ub3dfcGxheWluZ19jYiA9IEFkZFRvTm93UGxheWluZ0NhbGxiYWNrLAotfTsKLQotYnRyY19jdHJsX2NhbGxiYWNrc190IGNvbnRyb2xfY2FsbGJhY2tzID0gewotICAgIC5zaXplID0gc2l6ZW9mKGJ0cmNfY3RybF9jYWxsYmFja3NfdCksCi0gICAgLnBhc3N0aHJvdWdoX3JzcF9jYiA9IFBhc3N0aHJvdWdoUnNwQ2FsbGJhY2ssCi0gICAgLmdyb3VwbmF2aWdhdGlvbl9yc3BfY2IgPSBHcm91cG5hdmlnYXRpb25Sc3BDYWxsYmFjaywKLSAgICAuY29ubmVjdGlvbl9zdGF0ZV9jYiA9IENvbm5lY3Rpb25TdGF0ZUNhbGxiYWNrLAotICAgIC5nZXRyY2ZlYXR1cmVzX2NiID0gQ3RybEdldHJjZmVhdHVyZXNDYWxsYmFjaywKLSAgICAuc2V0cGxheWVyYXBwc2V0dGluZ19yc3BfY2IgPSBDdHJsU2V0cGxheWVyYXBwbGljYXRpb25zZXR0aW5nUnNwQ2FsbGJhY2ssCi0gICAgLnBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ19jYiA9IEN0cmxQbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdDYWxsYmFjaywKLSAgICAucGxheWVyYXBwbGljYXRpb25zZXR0aW5nX2NoYW5nZWRfY2IgPQotICAgICAgICBDdHJsUGxheWVyYXBwbGljYXRpb25zZXR0aW5nQ2hhbmdlZENhbGxiYWNrLAotICAgIC5zZXRhYnN2b2xfY21kX2NiID0gQ3RybFNldGFic3ZvbENtZENhbGxiYWNrLAotICAgIC5yZWdpc3Rlcm5vdGlmaWNhdGlvbl9hYnN2b2xfY2IgPSBDdHJsUmVnaXN0ZXJub3RpZmljYXRpb25BYnNWb2xDYWxsYmFjaywKLSAgICAudHJhY2tfY2hhbmdlZF9jYiA9IEN0cmxUcmFja0NoYW5nZWRDYWxsYmFjaywKLSAgICAucGxheV9wb3NpdGlvbl9jaGFuZ2VkX2NiID0gQ3RybFBsYXlQb3NpdGlvbkNoYW5nZWRDYWxsYmFjaywKLSAgICAucGxheV9zdGF0dXNfY2hhbmdlZF9jYiA9IEN0cmxQbGF5U3RhdHVzQ2hhbmdlZENhbGxiYWNrLAotICAgIC5nZXRfZm9sZGVyX2l0ZW1zX2NiID0gQ3RybEdldEZvbGRlckl0ZW1zQ2FsbGJhY2ssCi0gICAgLmNoYW5nZV9mb2xkZXJfcGF0aF9jYiA9IEN0cmxDaGFuZ2VQYXRoQ2FsbGJhY2ssCi0gICAgLnNldF9icm93c2VkX3BsYXllcl9jYiA9IEN0cmxTZXRCcm93c2VkUGxheWVyQ2FsbGJhY2ssCi0gICAgLnNldF9hZGRyZXNzZWRfcGxheWVyX2NiID0gQ3RybFNldEFkZHJlc3NlZFBsYXllckNhbGxiYWNrLAotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBwcm9kdWN0aW9uLgotY2xhc3MgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2VJbXBsIDogcHVibGljIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlSW1wbCgpIDogY29udHJvbF9pZmFjZV8obnVsbHB0cikge30KLQotICB+Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2VJbXBsKCkgb3ZlcnJpZGUgewotICAgIGlmIChjb250cm9sX2lmYWNlXykgY29udHJvbF9pZmFjZV8tPmNsZWFudXAoKTsKLSAgfQotCi0gIGJvb2wgQXZyY3BDb250cm9sRW5hYmxlKCkgb3ZlcnJpZGUgewotICAgIGlmIChjb250cm9sX2VuYWJsZWRfKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoY29udHJvbF9pZmFjZV8tPmluaXQoJmNvbnRyb2xfY2FsbGJhY2tzKSAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgSEFMIEFWUkNQIGNvbnRyb2wgaW50ZXJmYWNlIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb250cm9sX2VuYWJsZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgQXZyY3BDb250cm9sRGlzYWJsZSgpIG92ZXJyaWRlIHsKLSAgICBpZiAoIWNvbnRyb2xfZW5hYmxlZF8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb250cm9sX2lmYWNlXy0+Y2xlYW51cCgpOwotICAgIGNvbnRyb2xfZW5hYmxlZF8gPSBmYWxzZTsKLSAgfQotCi0gIGJvb2wgQXZyY3BUYXJnZXRFbmFibGUoKSBvdmVycmlkZSB7Ci0gICAgaWYgKHRhcmdldF9lbmFibGVkXykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldF9pZmFjZV8tPmluaXQoJnRhcmdldF9jYWxsYmFja3MpICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBIQUwgQVZSQ1AgdGFyZ2V0IGludGVyZmFjZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdGFyZ2V0X2VuYWJsZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgQXZyY3BUYXJnZXREaXNhYmxlKCkgb3ZlcnJpZGUgewotICAgIGlmICghdGFyZ2V0X2VuYWJsZWRfKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdGFyZ2V0X2lmYWNlXy0+Y2xlYW51cCgpOwotICAgIHRhcmdldF9lbmFibGVkXyA9IGZhbHNlOwotICB9Ci0KLSAgdm9pZCBBZGRUYXJnZXRPYnNlcnZlcihUYXJnZXRPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICB0YXJnZXRfb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICB2b2lkIFJlbW92ZVRhcmdldE9ic2VydmVyKFRhcmdldE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHRhcmdldF9vYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIHZvaWQgQWRkQ29udHJvbE9ic2VydmVyKENvbnRyb2xPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICBjb250cm9sX29ic2VydmVyc18uQWRkT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVDb250cm9sT2JzZXJ2ZXIoQ29udHJvbE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIGNvbnRyb2xfb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICBjb25zdCBidHJjX2ludGVyZmFjZV90KiBHZXRUYXJnZXRIQUxJbnRlcmZhY2UoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHRhcmdldF9pZmFjZV87Ci0gIH0KLQotICBjb25zdCBidHJjX2N0cmxfaW50ZXJmYWNlX3QqIEdldENvbnRyb2xIQUxJbnRlcmZhY2UoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGNvbnRyb2xfaWZhY2VfOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlLgotICBib29sIEluaXRpYWxpemUoKSB7Ci0gICAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIGJ0X2lmYWNlID0KLSAgICAgICAgQmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMSW50ZXJmYWNlKCk7Ci0gICAgQ0hFQ0soYnRfaWZhY2UpOwotCi0gICAgYXV0byogdGFyZ2V0X2lmYWNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBidHJjX2ludGVyZmFjZV90Kj4oCi0gICAgICAgIGJ0X2lmYWNlLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoQlRfUFJPRklMRV9BVl9SQ19JRCkpOwotICAgIGlmICghdGFyZ2V0X2lmYWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb2J0YWluIEhBTCBBVlJDUCB0YXJnZXQgaW50ZXJmYWNlIGhhbmRsZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYXV0byogY29udHJvbF9pZmFjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYnRyY19jdHJsX2ludGVyZmFjZV90Kj4oCi0gICAgICAgIGJ0X2lmYWNlLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoQlRfUFJPRklMRV9BVl9SQ19DVFJMX0lEKSk7Ci0gICAgaWYgKCFjb250cm9sX2lmYWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb2J0YWluIEhBTCBBVlJDUCBjb250cm9sIGludGVyZmFjZSBoYW5kbGUiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnRyb2xfaWZhY2VfID0gY29udHJvbF9pZmFjZTsKLSAgICB0YXJnZXRfaWZhY2VfID0gdGFyZ2V0X2lmYWNlOwotCi0gICAgLy8gT25seSBpbml0aWFsaXplIHRoZSBjb250cm9sIGludGVyZmFjZS4KLSAgICByZXR1cm4gQXZyY3BDb250cm9sRW5hYmxlKCk7Ci0gIH0KLQotICBidGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PFRhcmdldE9ic2VydmVyPiogdGFyZ2V0X29ic2VydmVycygpIHsKLSAgICByZXR1cm4gJnRhcmdldF9vYnNlcnZlcnNfOwotICB9Ci0KLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxDb250cm9sT2JzZXJ2ZXI+KiBjb250cm9sX29ic2VydmVycygpIHsKLSAgICByZXR1cm4gJmNvbnRyb2xfb2JzZXJ2ZXJzXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTGlzdCBvZiBvYnNlcnZlcnMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBub3RpZmljYXRpb25zIGZyb20gdXMuCi0gIC8vIFdlJ3JlIG5vdCB1c2luZyBhIGJhc2U6Ok9ic2VydmVyTGlzdFRocmVhZFNhZmUsIHdoaWNoIGl0IHBvc3RzIG9ic2VydmVyCi0gIC8vIGV2ZW50cyBhdXRvbWF0aWNhbGx5IG9uIHRoZSBvcmlnaW4gdGhyZWFkcywgYXMgd2Ugd2FudCB0byBhdm9pZCB0aGF0Ci0gIC8vIG92ZXJoZWFkIGFuZCBzaW1wbHkgZm9yd2FyZCB0aGUgZXZlbnRzIHRvIHRoZSB1cHBlciBsYXllci4KLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxUYXJnZXRPYnNlcnZlcj4gdGFyZ2V0X29ic2VydmVyc187Ci0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8Q29udHJvbE9ic2VydmVyPiBjb250cm9sX29ic2VydmVyc187Ci0KLSAgLy8gVGhlIEhBTCBoYW5kbGUgb2J0YWluZWQgZnJvbSB0aGUgc2hhcmVkIGxpYnJhcnkuIFdlIGhvbGQgYSB3ZWFrIHJlZmVyZW5jZQotICAvLyB0byB0aGlzIHNpbmNlIHRoZSBhY3R1YWwgZGF0YSByZXNpZGVzIGluIHRoZSBzaGFyZWQgQmx1ZXRvb3RoIGxpYnJhcnkuCi0gIGNvbnN0IGJ0cmNfaW50ZXJmYWNlX3QqIHRhcmdldF9pZmFjZV8gPSBudWxscHRyOwotICBjb25zdCBidHJjX2N0cmxfaW50ZXJmYWNlX3QqIGNvbnRyb2xfaWZhY2VfID0gbnVsbHB0cjsKLQotICBib29sIGNvbnRyb2xfZW5hYmxlZF8gPSBmYWxzZTsKLSAgYm9vbCB0YXJnZXRfZW5hYmxlZF8gPSBmYWxzZTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2VJbXBsKTsKLX07Ci0KLW5hbWVzcGFjZSB7Ci0KLWJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyPioKLUdldFRhcmdldE9ic2VydmVycygpIHsKLSAgQ0hFQ0soZ19pbnRlcmZhY2UpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2VJbXBsKj4oZ19pbnRlcmZhY2UpCi0gICAgICAtPnRhcmdldF9vYnNlcnZlcnMoKTsKLX0KLQotYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyPioKLUdldENvbnRyb2xPYnNlcnZlcnMoKSB7Ci0gIENIRUNLKGdfaW50ZXJmYWNlKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEJsdWV0b290aEF2cmNwSW50ZXJmYWNlSW1wbCo+KGdfaW50ZXJmYWNlKQotICAgICAgLT5jb250cm9sX29ic2VydmVycygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6VGFyZ2V0T2JzZXJ2ZXI6OlJlbW90ZUZlYXR1cmVzQ2FsbGJhY2soCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYnRyY19yZW1vdGVfZmVhdHVyZXNfdCBmZWF0dXJlcykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6R2V0UGxheVN0YXR1c0NhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6VGFyZ2V0T2JzZXJ2ZXI6Okxpc3RQbGF5ZXJBcHBBdHRyQ2FsbGJhY2soCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6TGlzdFBsYXllckFwcFZhbHVlc0NhbGxiYWNrKAotICAgIGJ0cmNfcGxheWVyX2F0dHJfdCBhdHRyX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpHZXRQbGF5ZXJBcHBWYWx1ZUNhbGxiYWNrKAotICAgIHVpbnQ4X3QgbnVtX2F0dHIsIGJ0cmNfcGxheWVyX2F0dHJfdCogcF9hdHRycywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6R2V0UGxheWVyQXBwQXR0cnNUZXh0Q2FsbGJhY2soCi0gICAgdWludDhfdCBudW1fYXR0ciwgYnRyY19wbGF5ZXJfYXR0cl90KiBwX2F0dHJzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpHZXRQbGF5ZXJBcHBWYWx1ZXNUZXh0Q2FsbGJhY2soCi0gICAgdWludDhfdCBhdHRyX2lkLCB1aW50OF90IG51bV92YWwsIHVpbnQ4X3QqIHBfdmFscywKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpTZXRQbGF5ZXJBcHBWYWx1ZUNhbGxiYWNrKAotICAgIGJ0cmNfcGxheWVyX3NldHRpbmdzX3QqIHBfdmFscywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6R2V0RWxlbWVudEF0dHJDYWxsYmFjaygKLSAgICB1aW50OF90IG51bV9hdHRyLCBidHJjX21lZGlhX2F0dHJfdCogcF9hdHRycywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6UmVnaXN0ZXJOb3RpZmljYXRpb25DYWxsYmFjaygKLSAgICBidHJjX2V2ZW50X2lkX3QgZXZlbnRfaWQsIHVpbnQzMl90IHBhcmFtLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpWb2x1bWVDaGFuZ2VDYWxsYmFjaygKLSAgICB1aW50OF90IHZvbHVtZSwgdWludDhfdCBjdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6UGFzc3Rocm91Z2hDbWRDYWxsYmFjaygKLSAgICBpbnQgaWQsIGludCBrZXlfc3RhdGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6VGFyZ2V0T2JzZXJ2ZXI6OlNldEFkZHJlc3NlZFBsYXllckNhbGxiYWNrKAotICAgIHVpbnQxNl90IHBsYXllcl9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6U2V0QnJvd3NlZFBsYXllckNhbGxiYWNrKAotICAgIHVpbnQxNl90IHBsYXllcl9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6R2V0Rm9sZGVySXRlbXNDYWxsYmFjaygKLSAgICB1aW50OF90IHNjb3BlLCB1aW50MzJfdCBzdGFydF9pdGVtLCB1aW50MzJfdCBlbmRfaXRlbSwgdWludDhfdCBudW1fYXR0ciwKLSAgICB1aW50MzJfdCogcF9hdHRyX2lkcywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6Q2hhbmdlUGF0aENhbGxiYWNrKAotICAgIHVpbnQ4X3QgZGlyZWN0aW9uLCB1aW50OF90KiBmb2xkZXJfdWlkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpHZXRJdGVtQXR0ckNhbGxiYWNrKAotICAgIHVpbnQ4X3Qgc2NvcGUsIHVpbnQ4X3QqIHVpZCwgdWludDE2X3QgdWlkX2NvdW50ZXIsIHVpbnQ4X3QgbnVtX2F0dHIsCi0gICAgYnRyY19tZWRpYV9hdHRyX3QqIHBfYXR0cnMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6VGFyZ2V0T2JzZXJ2ZXI6OlBsYXlJdGVtQ2FsbGJhY2soCi0gICAgdWludDhfdCBzY29wZSwgdWludDE2X3QgdWlkX2NvdW50ZXIsIHVpbnQ4X3QqIHVpZCwKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpHZXRUb3RhbE51bU9mSXRlbXNDYWxsYmFjaygKLSAgICB1aW50OF90IHNjb3BlLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OlRhcmdldE9ic2VydmVyOjpTZWFyY2hDYWxsYmFjaygKLSAgICB1aW50MTZfdCBzdHJfbGVuLCB1aW50OF90KiBwX3N0ciwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpUYXJnZXRPYnNlcnZlcjo6QWRkVG9Ob3dQbGF5aW5nQ2FsbGJhY2soCi0gICAgdWludDhfdCBzY29wZSwgdWludDhfdCogdWlkLCB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcjo6UGFzc3Rocm91Z2hSc3BDYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZF9hZGRyICovLCBpbnQgLyogaWQgKi8sIGludCAvKiBrZXlfc3RhdGUgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyOjpHcm91cG5hdmlnYXRpb25Sc3BDYWxsYmFjaygKLSAgICBpbnQgLyogaWQgKi8sIGludCAvKiBrZXlfc3RhdGUgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyOjpDb25uZWN0aW9uU3RhdGVDYWxsYmFjaygKLSAgICBib29sIC8qIHJjX2Nvbm5lY3QgKi8sIGJvb2wgLyogYnRfY29ubmVjdCAqLywKLSAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZF9hZGRyICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcjo6Q3RybEdldHJjZmVhdHVyZXNDYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZF9hZGRyICovLCBpbnQgLyogZmVhdHVyZXMgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyOjoKLSAgICBDdHJsU2V0cGxheWVyYXBwbGljYXRpb25zZXR0aW5nUnNwQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgLyogYmRfYWRkciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAvKiBhY2NlcHRlZCAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpDb250cm9sT2JzZXJ2ZXI6OgotICAgIEN0cmxQbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdDYWxsYmFjaygKLSAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgLyogYmRfYWRkciAqLywgdWludDhfdCAvKiBudW1fYXR0ciAqLywKLSAgICAgICAgYnRyY19wbGF5ZXJfYXBwX2F0dHJfdCogLyogYXBwX2F0dHJzICovLCB1aW50OF90IC8qIG51bV9leHRfYXR0ciAqLywKLSAgICAgICAgYnRyY19wbGF5ZXJfYXBwX2V4dF9hdHRyX3QqIC8qIGV4dF9hdHRycyAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpDb250cm9sT2JzZXJ2ZXI6OgotICAgIEN0cmxQbGF5ZXJhcHBsaWNhdGlvbnNldHRpbmdDaGFuZ2VkQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkX2FkZHIqLywKLSAgICAgICAgY29uc3QgYnRyY19wbGF5ZXJfc2V0dGluZ3NfdCYgLyogdmFscyAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpDb250cm9sT2JzZXJ2ZXI6OkN0cmxTZXRhYnN2b2xDbWRDYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZF9hZGRyICovLCB1aW50OF90IC8qIGFic192b2wgKi8sCi0gICAgdWludDhfdCAvKiBsYWJlbCAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpDb250cm9sT2JzZXJ2ZXI6OgotICAgIEN0cmxSZWdpc3Rlcm5vdGlmaWNhdGlvbkFic1ZvbENhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkX2FkZHIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAvKiBsYWJlbCAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpDb250cm9sT2JzZXJ2ZXI6OkN0cmxUcmFja0NoYW5nZWRDYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiAvKmJkX2FkZHIgKi8sIHVpbnQ4X3QgLyogbnVtX2F0dHIgKi8sCi0gICAgYnRyY19lbGVtZW50X2F0dHJfdmFsX3QqIC8qIHBfYXR0cnMgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyOjpDdHJsUGxheVBvc2l0aW9uQ2hhbmdlZENhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkX2FkZHIgKi8sIHVpbnQzMl90IC8qIHNvbmdfbGVuICovLAotICAgIHVpbnQzMl90IC8qIHNvbmdfcG9zICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcjo6Q3RybFBsYXlTdGF0dXNDaGFuZ2VkQ2FsbGJhY2soCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgLyogYmRfYWRkciAqLywgYnRyY19wbGF5X3N0YXR1c190IC8qIHBsYXlfc3RhdHVzICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcjo6Q3RybEdldEZvbGRlckl0ZW1zQ2FsbGJhY2soCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgLyogYmRfYWRkciAqLywgYnRyY19zdGF0dXNfdCAvKiBzdGF0dXMgKi8sCi0gICAgY29uc3QgYnRyY19mb2xkZXJfaXRlbXNfdCogLypmb2xkZXJfaXRlbXMgKi8sIHVpbnQ4X3QgLyogY291bnQgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6Q29udHJvbE9ic2VydmVyOjpDdHJsQ2hhbmdlUGF0aENhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkX2FkZHIgKi8sIHVpbnQzMl90IC8qIGNvdW50ICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcjo6Q3RybFNldEJyb3dzZWRQbGF5ZXJDYWxsYmFjaygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZF9hZGRyICovLCB1aW50OF90IC8qIG51bV9pdGVtcyAqLywKLSAgICB1aW50OF90IC8qIGRlcHRoICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkNvbnRyb2xPYnNlcnZlcjo6Q3RybFNldEFkZHJlc3NlZFBsYXllckNhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkX2FkZHIgKi8sIHVpbnQ4X3QgLyogc3RhdHVzICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLS8vIHN0YXRpYwotYm9vbCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6SW5pdGlhbGl6ZSgpIHsKLSAgdW5pcXVlX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0soIWdfaW50ZXJmYWNlKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2VJbXBsPiBpbXBsKAotICAgICAgbmV3IEJsdWV0b290aEF2cmNwSW50ZXJmYWNlSW1wbCgpKTsKLSAgaWYgKCFpbXBsLT5Jbml0aWFsaXplKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBCbHVldG9vdGhBdnJjcEludGVyZmFjZSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZ19pbnRlcmZhY2UgPSBpbXBsLnJlbGVhc2UoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlOjpDbGVhblVwKCkgewotICB1bmlxdWVfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0KLSAgZGVsZXRlIGdfaW50ZXJmYWNlOwotICBnX2ludGVyZmFjZSA9IG51bGxwdHI7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6SXNJbml0aWFsaXplZCgpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLQotICByZXR1cm4gZ19pbnRlcmZhY2UgIT0gbnVsbHB0cjsKLX0KLQotLy8gc3RhdGljCi1CbHVldG9vdGhBdnJjcEludGVyZmFjZSogQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2U6OkdldCgpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0soZ19pbnRlcmZhY2UpOwotICByZXR1cm4gZ19pbnRlcmZhY2U7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBCbHVldG9vdGhBdnJjcEludGVyZmFjZTo6SW5pdGlhbGl6ZUZvclRlc3RpbmcoCi0gICAgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2UqIHRlc3RfaW5zdGFuY2UpIHsKLSAgdW5pcXVlX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0sodGVzdF9pbnN0YW5jZSk7Ci0gIENIRUNLKCFnX2ludGVyZmFjZSk7Ci0KLSAgZ19pbnRlcmZhY2UgPSB0ZXN0X2luc3RhbmNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfYXZyY3BfaW50ZXJmYWNlLmggYi9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfYXZyY3BfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjdjM2MuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2F2cmNwX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3JjLmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotCi1jbGFzcyBCbHVldG9vdGhBdnJjcEludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgSEFMIGludGVyZmFjZSBkb2Vzbid0IGFsbG93IHJlZ2lzdGVyaW5nICJ1c2VyIGRhdGEiIHRoYXQgY2FycmllcwotICAvLyBjb250ZXh0IGJleW9uZCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVycywgZm9yY2luZyBpbXBsZW1lbnRhdGlvbnMgdG8gZGVhbAotICAvLyB3aXRoIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSAqT2JzZXJ2ZXIgaW50ZXJmYWNlIGlzIHRvIHJlZGlyZWN0IHRoZXNlIGV2ZW50cwotICAvLyB0byBpbnRlcmVzdGVkIHBhcnRpZXMgaW4gYW4gb2JqZWN0LW9yaWVudGVkIG1hbm5lci4KLSAgY2xhc3MgVGFyZ2V0T2JzZXJ2ZXIgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgflRhcmdldE9ic2VydmVyKCkgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB2b2lkIFJlbW90ZUZlYXR1cmVzQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3JlbW90ZV9mZWF0dXJlc190IGZlYXR1cmVzKTsKLSAgICB2aXJ0dWFsIHZvaWQgR2V0UGxheVN0YXR1c0NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBMaXN0UGxheWVyQXBwQXR0ckNhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBMaXN0UGxheWVyQXBwVmFsdWVzQ2FsbGJhY2soYnRyY19wbGF5ZXJfYXR0cl90IGF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgR2V0UGxheWVyQXBwVmFsdWVDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfcGxheWVyX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgR2V0UGxheWVyQXBwQXR0cnNUZXh0Q2FsbGJhY2sodWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19wbGF5ZXJfYXR0cl90KiBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgR2V0UGxheWVyQXBwVmFsdWVzVGV4dENhbGxiYWNrKHVpbnQ4X3QgYXR0cl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBTZXRQbGF5ZXJBcHBWYWx1ZUNhbGxiYWNrKGJ0cmNfcGxheWVyX3NldHRpbmdzX3QqIHBfdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgR2V0RWxlbWVudEF0dHJDYWxsYmFjayh1aW50OF90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfbWVkaWFfYXR0cl90KiBwX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBSZWdpc3Rlck5vdGlmaWNhdGlvbkNhbGxiYWNrKGJ0cmNfZXZlbnRfaWRfdCBldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgVm9sdW1lQ2hhbmdlQ2FsbGJhY2sodWludDhfdCB2b2x1bWUsIHVpbnQ4X3QgY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBQYXNzdGhyb3VnaENtZENhbGxiYWNrKGludCBpZCwgaW50IGtleV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgU2V0QWRkcmVzc2VkUGxheWVyQ2FsbGJhY2sodWludDE2X3QgcGxheWVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgU2V0QnJvd3NlZFBsYXllckNhbGxiYWNrKHVpbnQxNl90IHBsYXllcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBHZXRGb2xkZXJJdGVtc0NhbGxiYWNrKHVpbnQ4X3Qgc2NvcGUsIHVpbnQzMl90IHN0YXJ0X2l0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZW5kX2l0ZW0sIHVpbnQ4X3QgbnVtX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfYXR0cl9pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0gICAgdmlydHVhbCB2b2lkIENoYW5nZVBhdGhDYWxsYmFjayh1aW50OF90IGRpcmVjdGlvbiwgdWludDhfdCogZm9sZGVyX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBHZXRJdGVtQXR0ckNhbGxiYWNrKHVpbnQ4X3Qgc2NvcGUsIHVpbnQ4X3QqIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX21lZGlhX2F0dHJfdCogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgUGxheUl0ZW1DYWxsYmFjayh1aW50OF90IHNjb3BlLCB1aW50MTZfdCB1aWRfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1aWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBHZXRUb3RhbE51bU9mSXRlbXNDYWxsYmFjayh1aW50OF90IHNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgU2VhcmNoQ2FsbGJhY2sodWludDE2X3Qgc3RyX2xlbiwgdWludDhfdCogcF9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBBZGRUb05vd1BsYXlpbmdDYWxsYmFjayh1aW50OF90IHNjb3BlLCB1aW50OF90KiB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHVpZF9jb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgfTsKLQotICBjbGFzcyBDb250cm9sT2JzZXJ2ZXIgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgfkNvbnRyb2xPYnNlcnZlcigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgdm9pZCBQYXNzdGhyb3VnaFJzcENhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X3N0YXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgR3JvdXBuYXZpZ2F0aW9uUnNwQ2FsbGJhY2soaW50IGlkLCBpbnQga2V5X3N0YXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ29ubmVjdGlvblN0YXRlQ2FsbGJhY2soYm9vbCByY19jb25uZWN0LCBib29sIGJ0X2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZpcnR1YWwgdm9pZCBDdHJsR2V0cmNmZWF0dXJlc0NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZlYXR1cmVzKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybFNldHBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ1JzcENhbGxiYWNrKAotICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGFjY2VwdGVkKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybFBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ0NhbGxiYWNrKAotICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IG51bV9hdHRyLAotICAgICAgICBidHJjX3BsYXllcl9hcHBfYXR0cl90KiBhcHBfYXR0cnMsIHVpbnQ4X3QgbnVtX2V4dF9hdHRyLAotICAgICAgICBidHJjX3BsYXllcl9hcHBfZXh0X2F0dHJfdCogZXh0X2F0dHJzKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybFBsYXllcmFwcGxpY2F0aW9uc2V0dGluZ0NoYW5nZWRDYWxsYmFjaygKLSAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgY29uc3QgYnRyY19wbGF5ZXJfc2V0dGluZ3NfdCYgcF92YWxzKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybFNldGFic3ZvbENtZENhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFic192b2wsIHVpbnQ4X3QgbGFiZWwpOwotICAgIHZpcnR1YWwgdm9pZCBDdHJsUmVnaXN0ZXJub3RpZmljYXRpb25BYnNWb2xDYWxsYmFjaygKLSAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBsYWJlbCk7Ci0gICAgdmlydHVhbCB2b2lkIEN0cmxUcmFja0NoYW5nZWRDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90KiBwX2F0dHJzKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybFBsYXlQb3NpdGlvbkNoYW5nZWRDYWxsYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvbmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvbmdfcG9zKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybFBsYXlTdGF0dXNDaGFuZ2VkQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19wbGF5X3N0YXR1c190IHBsYXlfc3RhdHVzKTsKLSAgICB2aXJ0dWFsIHZvaWQgQ3RybEdldEZvbGRlckl0ZW1zQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJ0cmNfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICBjb25zdCBidHJjX2ZvbGRlcl9pdGVtc190KiBmb2xkZXJfaXRlbXMsIHVpbnQ4X3QgY291bnQpOwotICAgIHZpcnR1YWwgdm9pZCBDdHJsQ2hhbmdlUGF0aENhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQpOwotICAgIHZpcnR1YWwgdm9pZCBDdHJsU2V0QnJvd3NlZFBsYXllckNhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1faXRlbXMsIHVpbnQ4X3QgZGVwdGgpOwotICAgIHZpcnR1YWwgdm9pZCBDdHJsU2V0QWRkcmVzc2VkUGxheWVyQ2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKTsKLSAgfTsKLQotICAvLyBJbml0aWFsaXplIGFuZCBjbGVhbiB1cCB0aGUgQmx1ZXRvb3RoSW50ZXJmYWNlIHNpbmdsZXRvbi4gUmV0dXJucyBmYWxzZSBpZgotICAvLyB0aGUgdW5kZXJseWluZyBIQUwgaW50ZXJmYWNlIGZhaWxlZCB0byBpbml0aWFsaXplLCBhbmQgdHJ1ZSBvbiBzdWNjZXNzLgotICBzdGF0aWMgYm9vbCBJbml0aWFsaXplKCk7Ci0KLSAgLy8gU2h1dHMgZG93biBhbmQgY2xlYW5zIHVwIHRoZSBpbnRlcmZhY2UuIENsZWFuVXAgbXVzdCBiZSBjYWxsZWQgb24gdGhlIHNhbWUKLSAgLy8gdGhyZWFkIHRoYXQgY2FsbGVkIEluaXRpYWxpemUuCi0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGludGVyZmFjZSB3YXMgaW5pdGlhbGl6ZWQgYW5kIGEgZ2xvYmFsIHNpbmdsZXRvbiBoYXMKLSAgLy8gYmVlbiBjcmVhdGVkLgotICBzdGF0aWMgYm9vbCBJc0luaXRpYWxpemVkKCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBmb3IgdGVzdGluZy4gVXNlIHRoaXMgdG8gaW5qZWN0IGEgdGVzdCB2ZXJzaW9uIG9mCi0gIC8vIEJsdWV0b290aEF2cmNwSW50ZXJmYWNlLiBUbyBiZSB1c2VkIGZyb20gdW5pdCB0ZXN0cyBvbmx5LgotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplRm9yVGVzdGluZyhCbHVldG9vdGhBdnJjcEludGVyZmFjZSogdGVzdF9pbnN0YW5jZSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2Ugc2luZ2xldG9uLiBJZiB0aGUgaW50ZXJmYWNlIGhhcwotICAvLyBub3QgYmVlbiBpbml0aWFsaXplZCwgcmV0dXJucyBudWxscHRyLiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQtc2FmZSwgaW4gdGhhdAotICAvLyBpdCB3aWxsIGJsb2NrIGlmIHRoZSBpbnRlcm5hbCBsb2NrIGlzIGJlaW5nIGhlbGQgYnkgYW5vdGhlciB0aHJlYWQuIERvbid0Ci0gIC8vIGNhbGwgdGhpcyByZS1lbnRyYW50bHkgZnJvbSBhbiBvYnNlcnZlciBldmVudCBhcyB0aGlzIG1heSBjYXVzZSBhIGRlYWRsb2NrLgotICBzdGF0aWMgQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2UqIEdldCgpOwotCi0gIHZpcnR1YWwgYm9vbCBBdnJjcENvbnRyb2xFbmFibGUoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBdnJjcENvbnRyb2xEaXNhYmxlKCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgQXZyY3BUYXJnZXRFbmFibGUoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBdnJjcFRhcmdldERpc2FibGUoKSA9IDA7Ci0KLSAgLy8gVGhyZWFkLXNhZmV0eSBpcyBndWFyYW50ZWVkIGJ5IE9ic2VydmVyTGlzdC4KLSAgdmlydHVhbCB2b2lkIEFkZFRhcmdldE9ic2VydmVyKFRhcmdldE9ic2VydmVyKiBvYnNlcnZlcikgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlVGFyZ2V0T2JzZXJ2ZXIoVGFyZ2V0T2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0KLSAgLy8gVGhyZWFkLXNhZmV0eSBpcyBndWFyYW50ZWVkIGJ5IE9ic2VydmVyTGlzdC4KLSAgdmlydHVhbCB2b2lkIEFkZENvbnRyb2xPYnNlcnZlcihDb250cm9sT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVDb250cm9sT2JzZXJ2ZXIoQ29udHJvbE9ic2VydmVyKiBvYnNlcnZlcikgPSAwOwotCi0gIC8vIFRoZSBIQUwgbW9kdWxlIHBvaW50ZXJzIHByb3ZpZGVkIGJ5IHRoZSBzaGFyZWQgQmx1ZXRvb3RoIGxpYnJhcnkKLSAgdmlydHVhbCBjb25zdCBidHJjX2ludGVyZmFjZV90KiBHZXRUYXJnZXRIQUxJbnRlcmZhY2UoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgY29uc3QgYnRyY19jdHJsX2ludGVyZmFjZV90KiBHZXRDb250cm9sSEFMSW50ZXJmYWNlKCkgY29uc3QgPSAwOwotCi0gcHJvdGVjdGVkOgotICBCbHVldG9vdGhBdnJjcEludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoQXZyY3BJbnRlcmZhY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmNjIGIvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMxZDdiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDgyNyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9vYnNlcnZlcl9saXN0Lmg+Ci0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9vYnNlcnZlcl9saXN0LmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvbG9nZ2luZ19oZWxwZXJzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgc3RkOjpsb2NrX2d1YXJkOwotdXNpbmcgc3RkOjp1bmlxdWVfbG9jazsKLXVzaW5nIHN0ZDo6c2hhcmVkX2xvY2s7Ci11c2luZyBzdGQ6Om11dGV4OwotI2lmIGRlZmluZWQoT1NfR0VORVJJQykgJiYgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pICYmIChfTElCQ1BQX1ZFUlNJT04gPCAzNTAwKQotdXNpbmcgc2hhcmVkX211dGV4X2ltcGwgPSBzdGQ6OnNoYXJlZF9tdXRleDsKLSNlbHNlCi11c2luZyBzaGFyZWRfbXV0ZXhfaW1wbCA9IHN0ZDo6c2hhcmVkX3RpbWVkX211dGV4OwotI2VuZGlmCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIFRoZSBnbG9iYWwgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSBpbnN0YW5jZS4KLUJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdfaW50ZXJmYWNlID0gbnVsbHB0cjsKLQotLy8gTXV0ZXggdXNlZCBieSBjYWxsYmFja3MgdG8gYWNjZXNzIHxnX2ludGVyZmFjZXwuIElmIHdlIGluaXRpYWxpemUgb3IgY2xlYW4gaXQKLS8vIHVzZSB1bmlxdWVfbG9jay4gSWYgb25seSBhY2Nlc3NpbmcgfGdfaW50ZXJmYWNlfCB1c2Ugc2hhcmVkIGxvY2suCi0vLyBUT0RPKGpwYXdsb3dza2kpOiB0aGlzIHNob3VsZCBiZSBqdXN0IHNoYXJlZF9tdXRleCwgYXMgd2UgY3VycmVudGx5IGRvbid0IHVzZQotLy8gdGltZWQgbWV0aG9kcy4gQ2hhbmdlIHRvIHNoYXJlZF9tdXRleCB3aGVuIHdlIHVwZ3JhZGUgdG8gQysrMTQKLXNoYXJlZF9tdXRleF9pbXBsIGdfaW5zdGFuY2VfbG9jazsKLQotLy8gSGVscGVyIGZvciBvYnRhaW5pbmcgdGhlIG9ic2VydmVyIGxpc3RzLiBUaGlzIGlzIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotLy8gYW5kIGRlZmluZWQgYmVsb3cgc2luY2UgaXQgZGVwZW5kcyBvbiBCbHVldG9vdGhJbnRlcmZhY2VJbXBsLgotYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTY2FubmVyT2JzZXJ2ZXI+KgotR2V0U2Nhbm5lck9ic2VydmVycygpOwotYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGllbnRPYnNlcnZlcj4qCi1HZXRDbGllbnRPYnNlcnZlcnMoKTsKLWJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXI+KgotR2V0U2VydmVyT2JzZXJ2ZXJzKCk7Ci0KLSNkZWZpbmUgRk9SX0VBQ0hfU0NBTk5FUl9PQlNFUlZFUihmdW5jKSAgICAgICAgICAgXAotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldFNjYW5uZXJPYnNlcnZlcnMoKSkgeyBcCi0gICAgb2JzZXJ2ZXIuZnVuYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUihmdW5jKSAgICAgICAgICAgXAotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogKkdldENsaWVudE9ic2VydmVycygpKSB7IFwKLSAgICBvYnNlcnZlci5mdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGT1JfRUFDSF9TRVJWRVJfT0JTRVJWRVIoZnVuYykgICAgICAgICAgIFwKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRTZXJ2ZXJPYnNlcnZlcnMoKSkgeyBcCi0gICAgb2JzZXJ2ZXIuZnVuYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFnX2ludGVyZmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgcmVjZWl2ZWQgd2hpbGUgfGdfaW50ZXJmYWNlfCBpcyBOVUxMIjsgXAotICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotdm9pZCBSZWdpc3RlckNsaWVudENhbGxiYWNrKGludCBzdGF0dXMsIGludCBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIgY2xpZW50X2lmOiAiIDw8IGNsaWVudF9pZjsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBGT1JfRUFDSF9DTElFTlRfT0JTRVJWRVIoCi0gICAgICBSZWdpc3RlckNsaWVudENhbGxiYWNrKGdfaW50ZXJmYWNlLCBzdGF0dXMsIGNsaWVudF9pZiwgYXBwX3V1aWQpKTsKLX0KLQotdm9pZCBTY2FuUmVzdWx0Q2FsbGJhY2soCi0gICAgdWludDE2X3QgYmxlX2V2dF90eXBlLCB1aW50OF90IGFkZHJfdHlwZSwgUmF3QWRkcmVzcyogYmRhLAotICAgIHVpbnQ4X3QgYmxlX3ByaW1hcnlfcGh5LCB1aW50OF90IGJsZV9zZWNvbmRhcnlfcGh5LAotICAgIHVpbnQ4X3QgYmxlX2FkdmVydGlzaW5nX3NpZCwgaW50OF90IGJsZV90eF9wb3dlciwgaW50OF90IHJzc2ksCi0gICAgdWludDE2X3QgYmxlX3BlcmlvZGljX2Fkdl9pbnQsCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGEpIHsgIC8vIE5PTElOVChwYXNzLWJ5LXZhbHVlKQotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBDSEVDSyhiZGEpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIEJEX0FERFI6ICIgPDwgQnRBZGRyU3RyaW5nKGJkYSkKLSAgICAgICAgICA8PCAiIFJTU0k6ICIgPDwgcnNzaTsKLSAgRk9SX0VBQ0hfU0NBTk5FUl9PQlNFUlZFUigKLSAgICAgIFNjYW5SZXN1bHRDYWxsYmFjayhnX2ludGVyZmFjZSwgKmJkYSwgcnNzaSwgYWR2X2RhdGEpKTsKLX0KLQotdm9pZCBDb25uZWN0Q2FsbGJhY2soaW50IGNvbm5faWQsIGludCBzdGF0dXMsIGludCBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIgY2xpZW50X2lmOiAiIDw8IGNsaWVudF9pZgotICAgICAgICAgIDw8ICIgLSBCRF9BRERSOiAiIDw8IEJ0QWRkclN0cmluZygmYmRhKSA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkOwotCi0gIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUigKLSAgICAgIENvbm5lY3RDYWxsYmFjayhnX2ludGVyZmFjZSwgY29ubl9pZCwgc3RhdHVzLCBjbGllbnRfaWYsIGJkYSkpOwotfQotCi12b2lkIERpc2Nvbm5lY3RDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIC0gc3RhdHVzOiAiIDw8IHN0YXR1cwotICAgICAgICAgIDw8ICIgY2xpZW50X2lmOiAiIDw8IGNsaWVudF9pZgotICAgICAgICAgIDw8ICIgLSBCRF9BRERSOiAiIDw8IEJ0QWRkclN0cmluZygmYmRhKTsKLSAgRk9SX0VBQ0hfQ0xJRU5UX09CU0VSVkVSKAotICAgICAgRGlzY29ubmVjdENhbGxiYWNrKGdfaW50ZXJmYWNlLCBjb25uX2lkLCBzdGF0dXMsIGNsaWVudF9pZiwgYmRhKSk7Ci19Ci0KLXZvaWQgU2VhcmNoQ29tcGxldGVDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cykgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIC0gc3RhdHVzOiAiIDw8IHN0YXR1czsKLSAgRk9SX0VBQ0hfQ0xJRU5UX09CU0VSVkVSKAotICAgICAgU2VhcmNoQ29tcGxldGVDYWxsYmFjayhnX2ludGVyZmFjZSwgY29ubl9pZCwgc3RhdHVzKSk7Ci19Ci0KLXZvaWQgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25DYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHJlZ2lzdGVyZWQsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgLSBjb25uX2lkOiAiIDw8IGNvbm5faWQgPDwgIiAtIHN0YXR1czogIiA8PCBzdGF0dXMKLSAgICAgICAgICAgIDw8ICIgLSByZWdpc3RlcmVkOiAiIDw8IHJlZ2lzdGVyZWQgPDwgIiAtIGhhbmRsZTogIiA8PCBoYW5kbGU7Ci0gIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUihSZWdpc3RlckZvck5vdGlmaWNhdGlvbkNhbGxiYWNrKAotICAgICAgZ19pbnRlcmZhY2UsIGNvbm5faWQsIHJlZ2lzdGVyZWQsIHN0YXR1cywgaGFuZGxlKSk7Ci19Ci0KLXZvaWQgTm90aWZ5Q2FsbGJhY2soaW50IGNvbm5faWQsIGNvbnN0IGJ0Z2F0dF9ub3RpZnlfcGFyYW1zX3QmIHBfZGF0YSkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZAotICAgICAgICAgIDw8ICIgLSBhZGRyZXNzOiAiIDw8IEJ0QWRkclN0cmluZygmcF9kYXRhLmJkYSkKLSAgICAgICAgICA8PCAiIC0gaGFuZGxlOiAiIDw8IHBfZGF0YS5oYW5kbGUgPDwgIiAtIGxlbjogIiA8PCBwX2RhdGEubGVuCi0gICAgICAgICAgPDwgIiAtIGlzX25vdGlmeTogIiA8PCBwX2RhdGEuaXNfbm90aWZ5OwotCi0gIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUihOb3RpZnlDYWxsYmFjayhnX2ludGVyZmFjZSwgY29ubl9pZCwgcF9kYXRhKSk7Ci19Ci0KLXZvaWQgV3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzOwotCi0gIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUihXcml0ZUNoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgICBnX2ludGVyZmFjZSwgY29ubl9pZCwgc3RhdHVzLCBoYW5kbGUsIGxlbiwgdmFsdWUpKTsKLX0KLQotdm9pZCBXcml0ZURlc2NyaXB0b3JDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGNvbnN0IHVpbnQ4X3QqIHZhbHVlKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzOwotCi0gIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUihXcml0ZURlc2NyaXB0b3JDYWxsYmFjayhnX2ludGVyZmFjZSwgY29ubl9pZCwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBsZW4sIHZhbHVlKSk7Ci19Ci0KLXZvaWQgTXR1Q2hhbmdlZENhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCBpbnQgbXR1KSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1cwotICAgICAgICAgIDw8ICIgbXR1OiAiIDw8IG10dTsKLQotICBGT1JfRUFDSF9DTElFTlRfT0JTRVJWRVIoCi0gICAgICBNdHVDaGFuZ2VkQ2FsbGJhY2soZ19pbnRlcmZhY2UsIGNvbm5faWQsIHN0YXR1cywgbXR1KSk7Ci19Ci0KLXZvaWQgR2V0R2F0dERiQ2FsbGJhY2soaW50IGNvbm5faWQsIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGRiLCBpbnQgc2l6ZSkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBjb25uX2lkOiAiIDw8IGNvbm5faWQgPDwgIiBzaXplOiAiIDw8IHNpemU7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgRk9SX0VBQ0hfQ0xJRU5UX09CU0VSVkVSKEdldEdhdHREYkNhbGxiYWNrKGdfaW50ZXJmYWNlLCBjb25uX2lkLCBkYiwgc2l6ZSkpOwotfQotCi12b2lkIFNlcnZpY2VzUmVtb3ZlZENhbGxiYWNrKGludCBjb25uX2lkLCB1aW50MTZfdCBzdGFydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVuZF9oYW5kbGUpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkCi0gICAgICAgICAgPDwgIiBzdGFydF9oYW5kbGU6ICIgPDwgc3RhcnRfaGFuZGxlIDw8ICIgZW5kX2hhbmRsZTogIiA8PCBlbmRfaGFuZGxlOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIEZPUl9FQUNIX0NMSUVOVF9PQlNFUlZFUigKLSAgICAgIFNlcnZpY2VzUmVtb3ZlZENhbGxiYWNrKGdfaW50ZXJmYWNlLCBjb25uX2lkLCBzdGFydF9oYW5kbGUsIGVuZF9oYW5kbGUpKTsKLX0KLQotdm9pZCBTZXJ2aWNlc0FkZGVkQ2FsbGJhY2soaW50IGNvbm5faWQsIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QmIGFkZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZGVkX2NvdW50KSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZAotICAgICAgICAgIDw8ICIgYWRkZWRfY291bnQ6ICIgPDwgYWRkZWRfY291bnQ7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgRk9SX0VBQ0hfQ0xJRU5UX09CU0VSVkVSKAotICAgICAgU2VydmljZXNBZGRlZENhbGxiYWNrKGdfaW50ZXJmYWNlLCBjb25uX2lkLCBhZGRlZCwgYWRkZWRfY291bnQpKTsKLX0KLQotdm9pZCBSZWdpc3RlclNlcnZlckNhbGxiYWNrKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIgc2VydmVyX2lmOiAiIDw8IHNlcnZlcl9pZjsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBGT1JfRUFDSF9TRVJWRVJfT0JTRVJWRVIoCi0gICAgICBSZWdpc3RlclNlcnZlckNhbGxiYWNrKGdfaW50ZXJmYWNlLCBzdGF0dXMsIHNlcnZlcl9pZiwgYXBwX3V1aWQpKTsKLX0KLQotdm9pZCBDb25uZWN0aW9uQ2FsbGJhY2soaW50IGNvbm5faWQsIGludCBzZXJ2ZXJfaWYsIGludCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkCi0gICAgICAgICAgPDwgIiBzZXJ2ZXJfaWY6ICIgPDwgc2VydmVyX2lmIDw8ICIgY29ubmVjdGVkOiAiIDw8IGNvbm5lY3RlZDsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBGT1JfRUFDSF9TRVJWRVJfT0JTRVJWRVIoCi0gICAgICBDb25uZWN0aW9uQ2FsbGJhY2soZ19pbnRlcmZhY2UsIGNvbm5faWQsIHNlcnZlcl9pZiwgY29ubmVjdGVkLCBiZGEpKTsKLX0KLQotdm9pZCBTZXJ2aWNlQWRkZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidGdhdHRfZGJfZWxlbWVudF90KiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VydmljZV9jb3VudCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIgc2VydmVyX2lmOiAiIDw8IHNlcnZlcl9pZgotICAgICAgICAgIDw8ICIgY291bnQ6ICIgPDwgc2VydmljZV9jb3VudDsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgQ0hFQ0soc2VydmljZV9jb3VudCk7Ci0KLSAgRk9SX0VBQ0hfU0VSVkVSX09CU0VSVkVSKFNlcnZpY2VBZGRlZENhbGxiYWNrKAotICAgICAgZ19pbnRlcmZhY2UsIHN0YXR1cywgc2VydmVyX2lmLAotICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4oc2VydmljZSwgc2VydmljZSArIHNlcnZpY2VfY291bnQpKSk7Ci19Ci0KLXZvaWQgU2VydmljZVN0b3BwZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLCBpbnQgc3J2Y19oYW5kbGUpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gc3RhdHVzOiAiIDw8IHN0YXR1cyA8PCAiIHNlcnZlcl9pZjogIiA8PCBzZXJ2ZXJfaWYKLSAgICAgICAgICA8PCAiIGhhbmRsZTogIiA8PCBzcnZjX2hhbmRsZTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBGT1JfRUFDSF9TRVJWRVJfT0JTRVJWRVIoCi0gICAgICBTZXJ2aWNlU3RvcHBlZENhbGxiYWNrKGdfaW50ZXJmYWNlLCBzdGF0dXMsIHNlcnZlcl9pZiwgc3J2Y19oYW5kbGUpKTsKLX0KLQotdm9pZCBTZXJ2aWNlRGVsZXRlZENhbGxiYWNrKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsIGludCBzcnZjX2hhbmRsZSkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIgc2VydmVyX2lmOiAiIDw8IHNlcnZlcl9pZgotICAgICAgICAgIDw8ICIgaGFuZGxlOiAiIDw8IHNydmNfaGFuZGxlOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIEZPUl9FQUNIX1NFUlZFUl9PQlNFUlZFUigKLSAgICAgIFNlcnZpY2VEZWxldGVkQ2FsbGJhY2soZ19pbnRlcmZhY2UsIHN0YXR1cywgc2VydmVyX2lmLCBzcnZjX2hhbmRsZSkpOwotfQotCi12b2lkIFJlcXVlc3RSZWFkQ2hhcmFjdGVyaXN0aWNDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBib29sIGlzX2xvbmcpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgdHJhbnNfaWQ6ICIgPDwgdHJhbnNfaWQKLSAgICAgICAgICA8PCAiIGF0dHJfaGFuZGxlOiAiIDw8IGF0dHJfaGFuZGxlIDw8ICIgb2Zmc2V0OiAiIDw8IG9mZnNldAotICAgICAgICAgIDw8ICIgaXNfbG9uZzogIiA8PCBpc19sb25nOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIEZPUl9FQUNIX1NFUlZFUl9PQlNFUlZFUihSZXF1ZXN0UmVhZENoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgICBnX2ludGVyZmFjZSwgY29ubl9pZCwgdHJhbnNfaWQsIGJkYSwgYXR0cl9oYW5kbGUsIG9mZnNldCwgaXNfbG9uZykpOwotfQotCi12b2lkIFJlcXVlc3RSZWFkRGVzY3JpcHRvckNhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBib29sIGlzX2xvbmcpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgdHJhbnNfaWQ6ICIgPDwgdHJhbnNfaWQKLSAgICAgICAgICA8PCAiIGF0dHJfaGFuZGxlOiAiIDw8IGF0dHJfaGFuZGxlIDw8ICIgb2Zmc2V0OiAiIDw8IG9mZnNldAotICAgICAgICAgIDw8ICIgaXNfbG9uZzogIiA8PCBpc19sb25nOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotCi0gIEZPUl9FQUNIX1NFUlZFUl9PQlNFUlZFUihSZXF1ZXN0UmVhZERlc2NyaXB0b3JDYWxsYmFjaygKLSAgICAgIGdfaW50ZXJmYWNlLCBjb25uX2lkLCB0cmFuc19pZCwgYmRhLCBhdHRyX2hhbmRsZSwgb2Zmc2V0LCBpc19sb25nKSk7Ci19Ci0KLXZvaWQgUmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGJvb2wgbmVlZF9yc3AsIGJvb2wgaXNfcHJlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSwgc2l6ZV90IGxlbmd0aCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgLSBjb25uX2lkOiAiIDw8IGNvbm5faWQgPDwgIiB0cmFuc19pZDogIiA8PCB0cmFuc19pZAotICAgICAgICAgIDw8ICIgYXR0cl9oYW5kbGU6ICIgPDwgYXR0cl9oYW5kbGUgPDwgIiBvZmZzZXQ6ICIgPDwgb2Zmc2V0Ci0gICAgICAgICAgPDwgIiBsZW5ndGg6ICIgPDwgbGVuZ3RoIDw8ICIgbmVlZF9yc3A6ICIgPDwgbmVlZF9yc3AKLSAgICAgICAgICA8PCAiIGlzX3ByZXA6ICIgPDwgaXNfcHJlcDsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBGT1JfRUFDSF9TRVJWRVJfT0JTRVJWRVIoUmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICAgIGdfaW50ZXJmYWNlLCBjb25uX2lkLCB0cmFuc19pZCwgYmRhLCBhdHRyX2hhbmRsZSwgb2Zmc2V0LCBuZWVkX3JzcCwKLSAgICAgIGlzX3ByZXAsIHN0ZDo6dmVjdG9yKHZhbHVlLCB2YWx1ZSArIGxlbmd0aCkpKTsKLX0KLQotdm9pZCBSZXF1ZXN0V3JpdGVEZXNjcmlwdG9yQ2FsbGJhY2soaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgYm9vbCBuZWVkX3JzcCwgYm9vbCBpc19wcmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgdHJhbnNfaWQ6ICIgPDwgdHJhbnNfaWQKLSAgICAgICAgICA8PCAiIGF0dHJfaGFuZGxlOiAiIDw8IGF0dHJfaGFuZGxlIDw8ICIgb2Zmc2V0OiAiIDw8IG9mZnNldAotICAgICAgICAgIDw8ICIgbGVuZ3RoOiAiIDw8IGxlbmd0aCA8PCAiIG5lZWRfcnNwOiAiIDw8IG5lZWRfcnNwCi0gICAgICAgICAgPDwgIiBpc19wcmVwOiAiIDw8IGlzX3ByZXA7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgRk9SX0VBQ0hfU0VSVkVSX09CU0VSVkVSKFJlcXVlc3RXcml0ZURlc2NyaXB0b3JDYWxsYmFjaygKLSAgICAgIGdfaW50ZXJmYWNlLCBjb25uX2lkLCB0cmFuc19pZCwgYmRhLCBhdHRyX2hhbmRsZSwgb2Zmc2V0LCBuZWVkX3JzcCwKLSAgICAgIGlzX3ByZXAsIHN0ZDo6dmVjdG9yKHZhbHVlLCB2YWx1ZSArIGxlbmd0aCkpKTsKLX0KLQotdm9pZCBSZXF1ZXN0RXhlY1dyaXRlQ2FsbGJhY2soaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWNfd3JpdGUpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gY29ubl9pZDogIiA8PCBjb25uX2lkIDw8ICIgdHJhbnNfaWQ6ICIgPDwgdHJhbnNfaWQKLSAgICAgICAgICA8PCAiIGV4ZWNfd3JpdGU6ICIgPDwgZXhlY193cml0ZTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLQotICBGT1JfRUFDSF9TRVJWRVJfT0JTRVJWRVIoUmVxdWVzdEV4ZWNXcml0ZUNhbGxiYWNrKGdfaW50ZXJmYWNlLCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zX2lkLCBiZGEsIGV4ZWNfd3JpdGUpKTsKLX0KLQotdm9pZCBSZXNwb25zZUNvbmZpcm1hdGlvbkNhbGxiYWNrKGludCBzdGF0dXMsIGludCBoYW5kbGUpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gc3RhdHVzOiAiIDw8IHN0YXR1cyA8PCAiIGhhbmRsZTogIiA8PCBoYW5kbGU7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgRk9SX0VBQ0hfU0VSVkVSX09CU0VSVkVSKAotICAgICAgUmVzcG9uc2VDb25maXJtYXRpb25DYWxsYmFjayhnX2ludGVyZmFjZSwgc3RhdHVzLCBoYW5kbGUpKTsKLX0KLQotdm9pZCBJbmRpY2F0aW9uU2VudENhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgc3RhdHVzKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgRk9SX0VBQ0hfU0VSVkVSX09CU0VSVkVSKAotICAgICAgSW5kaWNhdGlvblNlbnRDYWxsYmFjayhnX2ludGVyZmFjZSwgY29ubl9pZCwgc3RhdHVzKSk7Ci19Ci0KLXZvaWQgTXR1Q2hhbmdlZENhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgbXR1KSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIG10dTogIiA8PCBtdHU7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0KLSAgRk9SX0VBQ0hfU0VSVkVSX09CU0VSVkVSKE10dUNoYW5nZWRDYWxsYmFjayhnX2ludGVyZmFjZSwgY29ubl9pZCwgbXR1KSk7Ci19Ci0KLS8vIFRoZSBIQUwgQmx1ZXRvb3RoIEdBVFQgY2xpZW50IGludGVyZmFjZSBjYWxsYmFja3MuIFRoZXNlIHNpZ25hbCBhIG1peHR1cmUgb2YKLS8vIEdBVFQgY2xpZW50LXJvbGUgYW5kIEdBUCBldmVudHMuCi0KLWNvbnN0IGJ0Z2F0dF9zY2FubmVyX2NhbGxiYWNrc190IGdhdHRfc2Nhbm5lcl9jYWxsYmFja3MgPSB7Ci0gICAgU2NhblJlc3VsdENhbGxiYWNrLAotICAgIG51bGxwdHIsICAvLyBiYXRjaHNjYW5fcmVwb3J0c19jYgotICAgIG51bGxwdHIsICAvLyBiYXRjaHNjYW5fdGhyZXNob2xkX2NiCi0gICAgbnVsbHB0ciwgIC8vIHRyYWNrX2Fkdl9ldmVudF9jYgotfTsKLQotY29uc3QgYnRnYXR0X2NsaWVudF9jYWxsYmFja3NfdCBnYXR0X2NsaWVudF9jYWxsYmFja3MgPSB7Ci0gICAgUmVnaXN0ZXJDbGllbnRDYWxsYmFjaywKLSAgICBDb25uZWN0Q2FsbGJhY2ssCi0gICAgRGlzY29ubmVjdENhbGxiYWNrLAotICAgIFNlYXJjaENvbXBsZXRlQ2FsbGJhY2ssCi0gICAgUmVnaXN0ZXJGb3JOb3RpZmljYXRpb25DYWxsYmFjaywKLSAgICBOb3RpZnlDYWxsYmFjaywKLSAgICBudWxscHRyLCAgLy8gcmVhZF9jaGFyYWN0ZXJpc3RpY19jYgotICAgIFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaywKLSAgICBudWxscHRyLCAgLy8gcmVhZF9kZXNjcmlwdG9yX2NiCi0gICAgV3JpdGVEZXNjcmlwdG9yQ2FsbGJhY2ssCi0gICAgbnVsbHB0ciwgIC8vIGV4ZWN1dGVfd3JpdGVfY2IKLSAgICBudWxscHRyLCAgLy8gcmVhZF9yZW1vdGVfcnNzaV9jYgotICAgIE10dUNoYW5nZWRDYWxsYmFjaywKLSAgICBudWxscHRyLCAgLy8gY29uZ2VzdGlvbl9jYgotICAgIEdldEdhdHREYkNhbGxiYWNrLAotICAgIFNlcnZpY2VzUmVtb3ZlZENhbGxiYWNrLAotICAgIFNlcnZpY2VzQWRkZWRDYWxsYmFjaywKLSAgICBudWxscHRyLAotICAgIG51bGxwdHIsCi0gICAgbnVsbHB0ciwgIC8vIHNlcnZpY2VfY2hhbmdlZF9jYgotfTsKLQotY29uc3QgYnRnYXR0X3NlcnZlcl9jYWxsYmFja3NfdCBnYXR0X3NlcnZlcl9jYWxsYmFja3MgPSB7Ci0gICAgUmVnaXN0ZXJTZXJ2ZXJDYWxsYmFjaywKLSAgICBDb25uZWN0aW9uQ2FsbGJhY2ssCi0gICAgU2VydmljZUFkZGVkQ2FsbGJhY2ssCi0gICAgU2VydmljZVN0b3BwZWRDYWxsYmFjaywKLSAgICBTZXJ2aWNlRGVsZXRlZENhbGxiYWNrLAotICAgIFJlcXVlc3RSZWFkQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaywKLSAgICBSZXF1ZXN0UmVhZERlc2NyaXB0b3JDYWxsYmFjaywKLSAgICBSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrLAotICAgIFJlcXVlc3RXcml0ZURlc2NyaXB0b3JDYWxsYmFjaywKLSAgICBSZXF1ZXN0RXhlY1dyaXRlQ2FsbGJhY2ssCi0gICAgUmVzcG9uc2VDb25maXJtYXRpb25DYWxsYmFjaywKLSAgICBJbmRpY2F0aW9uU2VudENhbGxiYWNrLAotICAgIG51bGxwdHIsICAvLyBjb25nZXN0aW9uX2NiCi0gICAgTXR1Q2hhbmdlZENhbGxiYWNrLAotICAgIG51bGxwdHIsCi0gICAgbnVsbHB0ciwKLX07Ci0KLWNvbnN0IGJ0Z2F0dF9jYWxsYmFja3NfdCBnYXR0X2NhbGxiYWNrcyA9IHsKLSAgICBzaXplb2YoYnRnYXR0X2NhbGxiYWNrc190KSwgJmdhdHRfY2xpZW50X2NhbGxiYWNrcywgJmdhdHRfc2VydmVyX2NhbGxiYWNrcywKLSAgICAmZ2F0dF9zY2FubmVyX2NhbGxiYWNrcywKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBCbHVldG9vdGhHYXR0SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBwcm9kdWN0aW9uLgotY2xhc3MgQmx1ZXRvb3RoR2F0dEludGVyZmFjZUltcGwgOiBwdWJsaWMgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSB7Ci0gcHVibGljOgotICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlSW1wbCgpIDogaGFsX2lmYWNlXyhudWxscHRyKSB7fQotCi0gIH5CbHVldG9vdGhHYXR0SW50ZXJmYWNlSW1wbCgpIG92ZXJyaWRlIHsKLSAgICBpZiAoaGFsX2lmYWNlXykgaGFsX2lmYWNlXy0+Y2xlYW51cCgpOwotICB9Ci0KLSAgdm9pZCBBZGRTY2FubmVyT2JzZXJ2ZXIoU2Nhbm5lck9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHNjYW5uZXJfb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICB2b2lkIFJlbW92ZVNjYW5uZXJPYnNlcnZlcihTY2FubmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZSB7Ci0gICAgc2Nhbm5lcl9vYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIHZvaWQgQWRkQ2xpZW50T2JzZXJ2ZXIoQ2xpZW50T2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZSB7Ci0gICAgY2xpZW50X29ic2VydmVyc18uQWRkT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVDbGllbnRPYnNlcnZlcihDbGllbnRPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICBjbGllbnRfb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICB2b2lkIEFkZFNlcnZlck9ic2VydmVyKFNlcnZlck9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHNlcnZlcl9vYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlU2VydmVyT2JzZXJ2ZXIoU2VydmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZSB7Ci0gICAgc2VydmVyX29ic2VydmVyc18uUmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICB9Ci0KLSAgQmxlQWR2ZXJ0aXNlckludGVyZmFjZSogR2V0QWR2ZXJ0aXNlckhBTEludGVyZmFjZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gaGFsX2lmYWNlXy0+YWR2ZXJ0aXNlcjsKLSAgfQotCi0gIEJsZVNjYW5uZXJJbnRlcmZhY2UqIEdldFNjYW5uZXJIQUxJbnRlcmZhY2UoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGhhbF9pZmFjZV8tPnNjYW5uZXI7Ci0gIH0KLQotICBjb25zdCBidGdhdHRfY2xpZW50X2ludGVyZmFjZV90KiBHZXRDbGllbnRIQUxJbnRlcmZhY2UoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGhhbF9pZmFjZV8tPmNsaWVudDsKLSAgfQotCi0gIGNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QqIEdldFNlcnZlckhBTEludGVyZmFjZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gaGFsX2lmYWNlXy0+c2VydmVyOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlLgotICBib29sIEluaXRpYWxpemUoKSB7Ci0gICAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIGJ0X2lmYWNlID0KLSAgICAgICAgQmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMSW50ZXJmYWNlKCk7Ci0gICAgQ0hFQ0soYnRfaWZhY2UpOwotCi0gICAgY29uc3QgYnRnYXR0X2ludGVyZmFjZV90KiBnYXR0X2lmYWNlID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBidGdhdHRfaW50ZXJmYWNlX3QqPigKLSAgICAgICAgICAgIGJ0X2lmYWNlLT5nZXRfcHJvZmlsZV9pbnRlcmZhY2UoQlRfUFJPRklMRV9HQVRUX0lEKSk7Ci0gICAgaWYgKCFnYXR0X2lmYWNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb2J0YWluIEhBTCBHQVRUIGludGVyZmFjZSBoYW5kbGUiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJ0X3N0YXR1c190IHN0YXR1cyA9IGdhdHRfaWZhY2UtPmluaXQoJmdhdHRfY2FsbGJhY2tzKTsKLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBIQUwgR0FUVCBpbnRlcmZhY2UiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGhhbF9pZmFjZV8gPSBnYXR0X2lmYWNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBidGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PFNjYW5uZXJPYnNlcnZlcj4qIHNjYW5uZXJfb2JzZXJ2ZXJzKCkgewotICAgIHJldHVybiAmc2Nhbm5lcl9vYnNlcnZlcnNfOwotICB9Ci0KLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxDbGllbnRPYnNlcnZlcj4qIGNsaWVudF9vYnNlcnZlcnMoKSB7Ci0gICAgcmV0dXJuICZjbGllbnRfb2JzZXJ2ZXJzXzsKLSAgfQotCi0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8U2VydmVyT2JzZXJ2ZXI+KiBzZXJ2ZXJfb2JzZXJ2ZXJzKCkgewotICAgIHJldHVybiAmc2VydmVyX29ic2VydmVyc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIExpc3Qgb2Ygb2JzZXJ2ZXJzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gbm90aWZpY2F0aW9ucyBmcm9tIHVzLgotICAvLyBXZSdyZSBub3QgdXNpbmcgYSBiYXNlOjpPYnNlcnZlckxpc3RUaHJlYWRTYWZlLCB3aGljaCBpdCBwb3N0cyBvYnNlcnZlcgotICAvLyBldmVudHMgYXV0b21hdGljYWxseSBvbiB0aGUgb3JpZ2luIHRocmVhZHMsIGFzIHdlIHdhbnQgdG8gYXZvaWQgdGhhdAotICAvLyBvdmVyaGVhZCBhbmQgc2ltcGx5IGZvcndhcmQgdGhlIGV2ZW50cyB0byB0aGUgdXBwZXIgbGF5ZXIuCi0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8U2Nhbm5lck9ic2VydmVyPiBzY2FubmVyX29ic2VydmVyc187Ci0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8Q2xpZW50T2JzZXJ2ZXI+IGNsaWVudF9vYnNlcnZlcnNfOwotICBidGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PFNlcnZlck9ic2VydmVyPiBzZXJ2ZXJfb2JzZXJ2ZXJzXzsKLQotICAvLyBUaGUgSEFMIGhhbmRsZSBvYnRhaW5lZCBmcm9tIHRoZSBzaGFyZWQgbGlicmFyeS4gV2UgaG9sZCBhIHdlYWsgcmVmZXJlbmNlCi0gIC8vIHRvIHRoaXMgc2luY2UgdGhlIGFjdHVhbCBkYXRhIHJlc2lkZXMgaW4gdGhlIHNoYXJlZCBCbHVldG9vdGggbGlicmFyeS4KLSAgY29uc3QgYnRnYXR0X2ludGVyZmFjZV90KiBoYWxfaWZhY2VfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhHYXR0SW50ZXJmYWNlSW1wbCk7Ci19OwotCi1uYW1lc3BhY2UgewotCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNjYW5uZXJPYnNlcnZlcj4qCi1HZXRTY2FubmVyT2JzZXJ2ZXJzKCkgewotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxCbHVldG9vdGhHYXR0SW50ZXJmYWNlSW1wbCo+KGdfaW50ZXJmYWNlKQotICAgICAgLT5zY2FubmVyX29ic2VydmVycygpOwotfQotCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyPioKLUdldENsaWVudE9ic2VydmVycygpIHsKLSAgQ0hFQ0soZ19pbnRlcmZhY2UpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Qmx1ZXRvb3RoR2F0dEludGVyZmFjZUltcGwqPihnX2ludGVyZmFjZSkKLSAgICAgIC0+Y2xpZW50X29ic2VydmVycygpOwotfQotCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNlcnZlck9ic2VydmVyPioKLUdldFNlcnZlck9ic2VydmVycygpIHsKLSAgQ0hFQ0soZ19pbnRlcmZhY2UpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Qmx1ZXRvb3RoR2F0dEludGVyZmFjZUltcGwqPihnX2ludGVyZmFjZSkKLSAgICAgIC0+c2VydmVyX29ic2VydmVycygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gRGVmYXVsdCBvYnNlcnZlciBpbXBsZW1lbnRhdGlvbnMuIFRoZXNlIGFyZSBwcm92aWRlZCBzbyB0aGF0IHRoZSBtZXRob2RzCi0vLyB0aGVtc2VsdmVzIGFyZSBvcHRpb25hbC4KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTY2FubmVyT2JzZXJ2ZXI6OlNjYW5SZXN1bHRDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZGEgKi8sCi0gICAgaW50IC8qIHJzc2kgKi8sCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gLyogYWR2X2RhdGEgKi8pIHsgIC8vIE5PTElOVChwYXNzLWJ5LXZhbHVlKQotICAvLyBEbyBOb3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyOjpSZWdpc3RlckNsaWVudENhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBzdGF0dXMgKi8sCi0gICAgaW50IC8qIGNsaWVudF9pZiAqLywgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiAvKiBhcHBfdXVpZCAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyOjpDb25uZWN0Q2FsbGJhY2soCi0gICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIGNvbm5faWQgKi8sCi0gICAgaW50IC8qIHN0YXR1cyAqLywgaW50IC8qIGNsaWVudF9pZiAqLywgY29uc3QgUmF3QWRkcmVzcyYgLyogYmRhICovKSB7Ci0gIC8vIERvIG5vdGhpbmcKLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGllbnRPYnNlcnZlcjo6RGlzY29ubmVjdENhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGludCAvKiBzdGF0dXMgKi8sIGludCAvKiBjbGllbnRfaWYgKi8sIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkYSAqLykgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXI6OlNlYXJjaENvbXBsZXRlQ2FsbGJhY2soCi0gICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIGNvbm5faWQgKi8sCi0gICAgaW50IC8qIHN0YXR1cyAqLykgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXI6OlJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uQ2FsbGJhY2soCi0gICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIGNvbm5faWQgKi8sCi0gICAgaW50IC8qIHJlZ2lzdGVyZWQgKi8sIGludCAvKiBzdGF0dXMgKi8sIHVpbnQxNl90IC8qIGhhbmRsZSAqLykgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXI6Ok5vdGlmeUNhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGNvbnN0IGJ0Z2F0dF9ub3RpZnlfcGFyYW1zX3QmIC8qIHBfZGF0YSAqLykgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXI6OldyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogY29ubl9pZCAqLywKLSAgICBpbnQgLyogc3RhdHVzICovLCB1aW50MTZfdCAvKiBoYW5kbGUgKi8sIHVpbnQxNl90IC8qIGxlbiAqLywKLSAgICBjb25zdCB1aW50OF90KiAvKiB2YWx1ZSAqLykgewotICAvLyBEbyBub3RoaW5nCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXI6OldyaXRlRGVzY3JpcHRvckNhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGludCAvKiBzdGF0dXMgKi8sIHVpbnQxNl90IC8qIGhhbmRsZSAqLywgdWludDE2X3QgLyogbGVuICovLAotICAgIGNvbnN0IHVpbnQ4X3QqIC8qIHZhbHVlICovKSB7Ci0gIC8vIERvIG5vdGhpbmcKLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGllbnRPYnNlcnZlcjo6TXR1Q2hhbmdlZENhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGludCAvKiBzdGF0aXMqLywgaW50IC8qIG10dSAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyOjpHZXRHYXR0RGJDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogY29ubl9pZCAqLywKLSAgICBjb25zdCBidGdhdHRfZGJfZWxlbWVudF90KiAvKiBnYXR0X2RiICovLCBpbnQgLyogc2l6ZSAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyOjpTZXJ2aWNlc1JlbW92ZWRDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogY29ubl9pZCAqLywKLSAgICB1aW50MTZfdCAvKiBzdGFydF9oYW5kbGUgKi8sIHVpbnQxNl90IC8qIGVuZF9oYW5kbGUgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGllbnRPYnNlcnZlcjo6U2VydmljZXNBZGRlZENhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QmIC8qIGFkZGVkICovLCBpbnQgLyogYWRkZWRfY291bnQgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6UmVnaXN0ZXJTZXJ2ZXJDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogc3RhdHVzICovLAotICAgIGludCAvKiBzZXJ2ZXJfaWYgKi8sIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgLyogYXBwX3V1aWQgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6Q29ubmVjdGlvbkNhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGludCAvKiBzZXJ2ZXJfaWYgKi8sIGludCAvKiBjb25uZWN0ZWQgKi8sIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkYSAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNlcnZlck9ic2VydmVyOjpTZXJ2aWNlQWRkZWRDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogc3RhdHVzICovLAotICAgIGludCAvKiBzZXJ2ZXJfaWYgKi8sCi0gICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gLyogc2VydmljZSAqLykgeyAgLy8gTk9MSU5UKHBhc3MtYnktdmFsdWUpCi0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXI6OlNlcnZpY2VTdG9wcGVkQ2FsbGJhY2soCi0gICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIHN0YXR1cyAqLywKLSAgICBpbnQgLyogc2VydmVyX2lmICovLCBpbnQgLyogc3J2Y19oYW5kbGUgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6U2VydmljZURlbGV0ZWRDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogc3RhdHVzICovLAotICAgIGludCAvKiBzZXJ2ZXJfaWYgKi8sIGludCAvKiBzcnZjX2hhbmRsZSAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNlcnZlck9ic2VydmVyOjpSZXF1ZXN0UmVhZENoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIGNvbm5faWQgKi8sCi0gICAgaW50IC8qIHRyYW5zX2lkICovLCBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZGEgKi8sIGludCAvKiBhdHRyX2hhbmRsZSAqLywKLSAgICBpbnQgLyogb2Zmc2V0ICovLCBib29sIC8qIGlzX2xvbmcgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6UmVxdWVzdFJlYWREZXNjcmlwdG9yQ2FsbGJhY2soCi0gICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogZ2F0dF9pZmFjZSAqLywgaW50IC8qIGNvbm5faWQgKi8sCi0gICAgaW50IC8qIHRyYW5zX2lkICovLCBjb25zdCBSYXdBZGRyZXNzJiAvKiBiZGEgKi8sIGludCAvKiBhdHRyX2hhbmRsZSAqLywKLSAgICBpbnQgLyogb2Zmc2V0ICovLCBib29sIC8qIGlzX2xvbmcgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6UmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogY29ubl9pZCAqLywKLSAgICBpbnQgLyogdHJhbnNfaWQgKi8sIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkYSAqLywgaW50IC8qIGF0dHJfaGFuZGxlICovLAotICAgIGludCAvKiBvZmZzZXQgKi8sIGJvb2wgLyogbmVlZF9yc3AgKi8sIGJvb2wgLyogaXNfcHJlcCAqLywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAvKiB2YWx1ZSAqLykgeyAgLy8gTk9MSU5UKHBhc3MtYnktdmFsdWUpCi0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXI6OlJlcXVlc3RXcml0ZURlc2NyaXB0b3JDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogY29ubl9pZCAqLywKLSAgICBpbnQgLyogdHJhbnNfaWQgKi8sIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkYSAqLywgaW50IC8qIGF0dHJfaGFuZGxlICovLAotICAgIGludCAvKiBvZmZzZXQgKi8sIGJvb2wgLyogbmVlZF9yc3AgKi8sIGJvb2wgLyogaXNfcHJlcCAqLywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAvKiB2YWx1ZSAqLykgeyAgLy8gTk9MSU5UKHBhc3MtYnktdmFsdWUpCi0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2VydmVyT2JzZXJ2ZXI6OlJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogY29ubl9pZCAqLywKLSAgICBpbnQgLyogdHJhbnNfaWQgKi8sIGNvbnN0IFJhd0FkZHJlc3MmIC8qIGJkYSAqLywgaW50IC8qIGV4ZWNfd3JpdGUgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6UmVzcG9uc2VDb25maXJtYXRpb25DYWxsYmFjaygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiBnYXR0X2lmYWNlICovLCBpbnQgLyogc3RhdHVzICovLAotICAgIGludCAvKiBoYW5kbGUgKi8pIHsKLSAgLy8gRG8gbm90aGluZwotfQotCi12b2lkIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNlcnZlck9ic2VydmVyOjpJbmRpY2F0aW9uU2VudENhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGludCAvKiBzdGF0dXMgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTZXJ2ZXJPYnNlcnZlcjo6TXR1Q2hhbmdlZENhbGxiYWNrKAotICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIGdhdHRfaWZhY2UgKi8sIGludCAvKiBjb25uX2lkICovLAotICAgIGludCAvKiBtdHUgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotLy8gc3RhdGljCi1ib29sIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkluaXRpYWxpemUoKSB7Ci0gIHVuaXF1ZV9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIENIRUNLKCFnX2ludGVyZmFjZSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPEJsdWV0b290aEdhdHRJbnRlcmZhY2VJbXBsPiBpbXBsKAotICAgICAgbmV3IEJsdWV0b290aEdhdHRJbnRlcmZhY2VJbXBsKCkpOwotICBpZiAoIWltcGwtPkluaXRpYWxpemUoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIEJsdWV0b290aEdhdHRJbnRlcmZhY2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGdfaW50ZXJmYWNlID0gaW1wbC5yZWxlYXNlKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGVhblVwKCkgewotICB1bmlxdWVfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBDSEVDSyhnX2ludGVyZmFjZSk7Ci0KLSAgZGVsZXRlIGdfaW50ZXJmYWNlOwotICBnX2ludGVyZmFjZSA9IG51bGxwdHI7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJc0luaXRpYWxpemVkKCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotCi0gIHJldHVybiBnX2ludGVyZmFjZSAhPSBudWxscHRyOwotfQotCi0vLyBzdGF0aWMKLUJsdWV0b290aEdhdHRJbnRlcmZhY2UqIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0soZ19pbnRlcmZhY2UpOwotICByZXR1cm4gZ19pbnRlcmZhY2U7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZygKLSAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiB0ZXN0X2luc3RhbmNlKSB7Ci0gIHVuaXF1ZV9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIENIRUNLKHRlc3RfaW5zdGFuY2UpOwotICBDSEVDSyghZ19pbnRlcmZhY2UpOwotCi0gIGdfaW50ZXJmYWNlID0gdGVzdF9pbnN0YW5jZTsKLX0KLQotYnRfc3RhdHVzX3QgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U3RhcnRTY2FuKGludCBjbGllbnRfaWQpIHsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhzY2FuX2NsaWVudHNfbG9ja18pOwotCi0gIC8vIFNjYW4gYWxyZWFkeSBpbml0aWF0ZWQgZm9yIHRoaXMgY2xpZW50LgotICBpZiAoc2Nhbl9jbGllbnRfc2V0Xy5maW5kKGNsaWVudF9pZCkgIT0gc2Nhbl9jbGllbnRfc2V0Xy5lbmQoKSkgewotICAgIC8vIEFzc3VtZSBzdGFydGluZyBzY2FuIG11bHRpcGxlIHRpbWVzIGlzIG5vdCBlcnJvciwgYnV0IHdhcm4gdXNlci4KLSAgICBMT0coV0FSTklORykgPDwgIlNjYW4gYWxyZWFkeSBpbml0aWF0ZWQgZm9yIGNsaWVudCI7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotICB9Ci0KLSAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2NhbiBjbGllbnQsIHRoZW4gbWFrZSBhIGNhbGwgaW50byB0aGUgc3RhY2suIFdlCi0gIC8vIG9ubHkgZG8gdGhpcyB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgY2hhbmdlcyB0byBvciBmcm9tIDAuCi0gIGlmIChzY2FuX2NsaWVudF9zZXRfLmVtcHR5KCkpIHsKLSAgICBHZXRTY2FubmVySEFMSW50ZXJmYWNlKCktPlNjYW4odHJ1ZSk7Ci0gIH0KLQotICBzY2FuX2NsaWVudF9zZXRfLmluc2VydChjbGllbnRfaWQpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U3RvcFNjYW4oaW50IGNsaWVudF9pZCkgewotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKHNjYW5fY2xpZW50c19sb2NrXyk7Ci0KLSAgLy8gU2NhbiBub3QgaW5pdGlhdGVkIGZvciB0aGlzIGNsaWVudC4KLSAgYXV0byBpdGVyID0gc2Nhbl9jbGllbnRfc2V0Xy5maW5kKGNsaWVudF9pZCk7Ci0gIGlmIChpdGVyID09IHNjYW5fY2xpZW50X3NldF8uZW5kKCkpIHsKLSAgICAvLyBBc3N1bWUgc3RvcHBpbmcgc2NhbiBtdWx0aXBsZSB0aW1lcyBpcyBub3QgZXJyb3IsIGJ1dCB3YXJuIHVzZXIuCi0gICAgTE9HKFdBUk5JTkcpIDw8ICJTY2FuIGFscmVhZHkgc3RvcHBlZCBvciBub3QgaW5pdGlhdGVkIGZvciBjbGllbnQiOwotICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotCi0gIGlmIChzY2FuX2NsaWVudF9zZXRfLnNpemUoKSA9PSAxKSB7Ci0gICAgR2V0U2Nhbm5lckhBTEludGVyZmFjZSgpLT5TY2FuKGZhbHNlKTsKLSAgfQotCi0gIHNjYW5fY2xpZW50X3NldF8uZXJhc2UoaXRlcik7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmggYi9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxZGZjNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLQotLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1HQVRUIGludGVyZmFjZS4gVGhpcyBjbGFzcyBjb21iaW5lcwotLy8gR0FUVCBwcm9maWxlIHNlcnZlciBhbmQgY2xpZW50IHJvbGUgb3BlcmF0aW9ucyB3aXRoIGdlbmVyYWwgR0FQIHByb2ZpbGUKLS8vIG9wZXJhdGlvbnMgb2YgdmFyaW91cyByb2xlcyAoY2VudHJhbCwgc2Nhbm5lciwgcGVyaXBoZXJhbCwgYWR2ZXJ0aXNlciksCi0vLyB3cmFwcGluZyBhcm91bmQgdGhlIHVuZGVybHlpbmcgYnRfZ2F0dF9pbnRlcmZhY2VfdCBzdHJ1Y3R1cmUuIEEgc2luZ2xlCi0vLyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGV4aXN0cyBwZXIgYXBwbGljYXRpb24gYW5kIGl0IGFsbG93cyBtdWx0aXBsZSBjbGFzc2VzCi0vLyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2xvYmFsIEhBTCBpbnRlcmZhY2UgYnkgbXVsdGlwbGV4aW5nIGNhbGxiYWNrcyBhbW9uZwotLy8gcmVnaXN0ZXJlZCBjbGllbnRzLgotLy8KLS8vIFRoaXMgaXMgZGVjbGFyZWQgYXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlIHNvIHRoYXQgYSBmYWtlIGltcGxlbWVudGF0aW9uIGNhbgotLy8gYmUgaW5qZWN0ZWQgZm9yIHRlc3RpbmcgdGhlIHVwcGVyIGxheWVyLgotY2xhc3MgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgSEFMIGludGVyZmFjZSBkb2Vzbid0IGFsbG93IHJlZ2lzdGVyaW5nICJ1c2VyIGRhdGEiIHRoYXQgY2FycmllcwotICAvLyBjb250ZXh0IGJleW9uZCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVycywgZm9yY2luZyBpbXBsZW1lbnRhdGlvbnMgdG8gZGVhbAotICAvLyB3aXRoIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSAqT2JzZXJ2ZXIgaW50ZXJmYWNlIGlzIHRvIHJlZGlyZWN0IHRoZXNlIGV2ZW50cwotICAvLyB0byBpbnRlcmVzdGVkIHBhcnRpZXMgaW4gYW4gb2JqZWN0LW9yaWVudGVkIG1hbm5lci4KLQotICAvLyBUaGUgc3RhbmRhcmQgTEUgc2Nhbm5lciBjYWxsYmFjayBpbnRlcmZhY2UuCi0gIGNsYXNzIFNjYW5uZXJPYnNlcnZlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+U2Nhbm5lck9ic2VydmVyKCkgPSBkZWZhdWx0OwotCi0gICAgLy8gQWxsIG9mIHRoZSBldmVudHMgYmVsb3cgY29ycmVzcG9uZCB0byBjYWxsYmFja3MgZGVmaW5lZCBpbgotICAgIC8vICJidGdhdHRfc2Nhbm5lcl9jYWxsYmFja3NfdCIgaW4gdGhlIEhBTCBBUEkgZGVmaW5pdGlvbnMuCi0KLSAgICB2aXJ0dWFsIHZvaWQgU2NhblJlc3VsdENhbGxiYWNrKAotICAgICAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCByc3NpLAotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZfZGF0YSk7ICAvLyBOT0xJTlQocGFzcy1ieS12YWx1ZSkKLSAgfTsKLQotICAvLyBUaGUgc3RhbmRhcmQgQlQtR0FUVCBjbGllbnQgY2FsbGJhY2sgaW50ZXJmYWNlLgotICBjbGFzcyBDbGllbnRPYnNlcnZlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+Q2xpZW50T2JzZXJ2ZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvLyBBbGwgb2YgdGhlIGV2ZW50cyBiZWxvdyBjb3JyZXNwb25kIHRvIGNhbGxiYWNrcyBkZWZpbmVkIGluCi0gICAgLy8gImJ0X2dhdHRfY2xpZW50X2NhbGxiYWNrc190IiBpbiB0aGUgSEFMIEFQSSBkZWZpbml0aW9ucy4KLQotICAgIHZpcnR1YWwgdm9pZCBSZWdpc3RlckNsaWVudENhbGxiYWNrKEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBDb25uZWN0Q2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLQotICAgIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0Q2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLQotICAgIHZpcnR1YWwgdm9pZCBTZWFyY2hDb21wbGV0ZUNhbGxiYWNrKEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCBzdGF0dXMpOwotCi0gICAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyRm9yTm90aWZpY2F0aW9uQ2FsbGJhY2soCi0gICAgICAgIEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGludCBjb25uX2lkLCBpbnQgcmVnaXN0ZXJlZCwKLSAgICAgICAgaW50IHN0YXR1cywgdWludDE2X3QgaGFuZGxlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBOb3RpZnlDYWxsYmFjayhCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBpbnQgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X25vdGlmeV9wYXJhbXNfdCYgcF9kYXRhKTsKLQotICAgIHZpcnR1YWwgdm9pZCBXcml0ZUNoYXJhY3RlcmlzdGljQ2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgV3JpdGVEZXNjcmlwdG9yQ2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgTXR1Q2hhbmdlZENhbGxiYWNrKEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IG10dSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgR2V0R2F0dERiQ2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGdhdHRfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKLQotICAgIHZpcnR1YWwgdm9pZCBTZXJ2aWNlc1JlbW92ZWRDYWxsYmFjayhCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCwgdWludDE2X3Qgc3RhcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfaGFuZGxlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBTZXJ2aWNlc0FkZGVkQ2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X2RiX2VsZW1lbnRfdCYgYWRkZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkZWRfY291bnQpOwotICB9OwotCi0gIC8vIFRoZSBzdGFuZGFyZCBCVC1HQVRUIHNlcnZlciBjYWxsYmFjayBpbnRlcmZhY2UuCi0gIGNsYXNzIFNlcnZlck9ic2VydmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5TZXJ2ZXJPYnNlcnZlcigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgdm9pZCBSZWdpc3RlclNlcnZlckNhbGxiYWNrKEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBDb25uZWN0aW9uQ2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgc2VydmVyX2lmLCBpbnQgY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLQotICAgIHZpcnR1YWwgdm9pZCBTZXJ2aWNlQWRkZWRDYWxsYmFjaygKLSAgICAgICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZiwKLSAgICAgICAgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSk7ICAvLyBOT0xJTlQocGFzcy1ieS12YWx1ZSkKLQotICAgIHZpcnR1YWwgdm9pZCBTZXJ2aWNlU3RvcHBlZENhbGxiYWNrKEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3J2Y19oYW5kbGUpOwotCi0gICAgdmlydHVhbCB2b2lkIFNlcnZpY2VEZWxldGVkQ2FsbGJhY2soQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcnZjX2hhbmRsZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgUmVxdWVzdFJlYWRDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBhdHRyX2hhbmRsZSwgaW50IG9mZnNldCwgYm9vbCBpc19sb25nKTsKLQotICAgIHZpcnR1YWwgdm9pZCBSZXF1ZXN0UmVhZERlc2NyaXB0b3JDYWxsYmFjaygKLSAgICAgICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cl9oYW5kbGUsIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgUmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICAgICAgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cl9oYW5kbGUsIGludCBvZmZzZXQsIGJvb2wgbmVlZF9yc3AsCi0gICAgICAgIGJvb2wgaXNfcHJlcCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUpOyAgLy8gTk9MSU5UKHBhc3MtYnktdmFsdWUpCi0KLSAgICB2aXJ0dWFsIHZvaWQgUmVxdWVzdFdyaXRlRGVzY3JpcHRvckNhbGxiYWNrKAotICAgICAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBhdHRyX2hhbmRsZSwgaW50IG9mZnNldCwgYm9vbCBuZWVkX3JzcCwKLSAgICAgICAgYm9vbCBpc19wcmVwLAotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSk7ICAvLyBOT0xJTlQocGFzcy1ieS1hbHVlKQotCi0gICAgdmlydHVhbCB2b2lkIFJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjayhCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGVjX3dyaXRlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBSZXNwb25zZUNvbmZpcm1hdGlvbkNhbGxiYWNrKAotICAgICAgICBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLCBpbnQgc3RhdHVzLCBpbnQgaGFuZGxlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBJbmRpY2F0aW9uU2VudENhbGxiYWNrKEJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCBzdGF0dXMpOwotCi0gICAgdmlydHVhbCB2b2lkIE10dUNoYW5nZWRDYWxsYmFjayhCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQsIGludCBtdHUpOwotICB9OwotCi0gIC8vIEluaXRpYWxpemUgYW5kIGNsZWFuIHVwIHRoZSBCbHVldG9vdGhJbnRlcmZhY2Ugc2luZ2xldG9uLiBSZXR1cm5zIGZhbHNlIGlmCi0gIC8vIHRoZSB1bmRlcmx5aW5nIEhBTCBpbnRlcmZhY2UgZmFpbGVkIHRvIGluaXRpYWxpemUsIGFuZCB0cnVlIG9uIHN1Y2Nlc3MuCi0gIHN0YXRpYyBib29sIEluaXRpYWxpemUoKTsKLQotICAvLyBTaHV0cyBkb3duIGFuZCBjbGVhbnMgdXAgdGhlIGludGVyZmFjZS4gQ2xlYW5VcCBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2FtZQotICAvLyB0aHJlYWQgdGhhdCBjYWxsZWQgSW5pdGlhbGl6ZS4KLSAgc3RhdGljIHZvaWQgQ2xlYW5VcCgpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW50ZXJmYWNlIHdhcyBpbml0aWFsaXplZCBhbmQgYSBnbG9iYWwgc2luZ2xldG9uIGhhcwotICAvLyBiZWVuIGNyZWF0ZWQuCi0gIHN0YXRpYyBib29sIElzSW5pdGlhbGl6ZWQoKTsKLQotICAvLyBJbml0aWFsaXplIGZvciB0ZXN0aW5nLiBVc2UgdGhpcyB0byBpbmplY3QgYSB0ZXN0IHZlcnNpb24gb2YKLSAgLy8gQmx1ZXRvb3RoR2F0dEludGVyZmFjZS4gVG8gYmUgdXNlZCBmcm9tIHVuaXQgdGVzdHMgb25seS4KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZUZvclRlc3RpbmcoQmx1ZXRvb3RoR2F0dEludGVyZmFjZSogdGVzdF9pbnN0YW5jZSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgQmx1ZXRvb3RoR2F0dEludGVyZmFjZSBzaW5nbGV0b24uIElmIHRoZSBpbnRlcmZhY2UgaGFzCi0gIC8vIG5vdCBiZWVuIGluaXRpYWxpemVkLCByZXR1cm5zIG51bGxwdHIuIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlLCBpbiB0aGF0Ci0gIC8vIGl0IHdpbGwgYmxvY2sgaWYgdGhlIGludGVybmFsIGxvY2sgaXMgYmVpbmcgaGVsZCBieSBhbm90aGVyIHRocmVhZC4gRG9uJ3QKLSAgLy8gY2FsbCB0aGlzIHJlLWVudHJhbnRseSBmcm9tIGFuIG9ic2VydmVyIGV2ZW50IGFzIHRoaXMgbWF5IGNhdXNlIGEgZGVhZGxvY2suCi0gIHN0YXRpYyBCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBHZXQoKTsKLQotICAvLyBBZGQgb3IgcmVtb3ZlIGFuIG9ic2VydmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiBMRSBzY2FubmVyIGludGVyZmFjZQotICAvLyBub3RpZmljYXRpb25zIGZyb20gdXMuIFRocmVhZC1zYWZldHkgaXMgZ3VhcmFudGVlZCBieSBPYnNlcnZlckxpc3QuCi0gIHZpcnR1YWwgdm9pZCBBZGRTY2FubmVyT2JzZXJ2ZXIoU2Nhbm5lck9ic2VydmVyKiBvYnNlcnZlcikgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlU2Nhbm5lck9ic2VydmVyKFNjYW5uZXJPYnNlcnZlciogb2JzZXJ2ZXIpID0gMDsKLQotICAvLyBBZGQgb3IgcmVtb3ZlIGFuIG9ic2VydmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiBHQVRUIGNsaWVudCBpbnRlcmZhY2UKLSAgLy8gbm90aWZpY2F0aW9ucyBmcm9tIHVzLiBUaHJlYWQtc2FmZXR5IGlzIGd1YXJhbnRlZWQgYnkgT2JzZXJ2ZXJMaXN0LgotICB2aXJ0dWFsIHZvaWQgQWRkQ2xpZW50T2JzZXJ2ZXIoQ2xpZW50T2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVDbGllbnRPYnNlcnZlcihDbGllbnRPYnNlcnZlciogb2JzZXJ2ZXIpID0gMDsKLQotICAvLyBBZGQgb3IgcmVtb3ZlIGFuIG9ic2VydmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiBHQVRUIHNlcnZlciBpbnRlcmZhY2UKLSAgLy8gbm90aWZpY2F0aW9ucyBmcm9tIHVzLiBUaHJlYWQtc2FmZXR5IGlzIGd1YXJhbnRlZWQgYnkgT2JzZXJ2ZXJMaXN0LgotICB2aXJ0dWFsIHZvaWQgQWRkU2VydmVyT2JzZXJ2ZXIoU2VydmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZW1vdmVTZXJ2ZXJPYnNlcnZlcihTZXJ2ZXJPYnNlcnZlciogb2JzZXJ2ZXIpID0gMDsKLQotICAvLyBUaGUgSEFMIG1vZHVsZSBwb2ludGVyIHRoYXQgcmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQgTEUgYWR2ZXJ0aXNlcgotICAvLyBpbnRlcmZhY2UuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gYW5kIHByb3ZpZGVkIGJ5IHRoZSBzaGFyZWQgQmx1ZXRvb3RoCi0gIC8vIGxpYnJhcnksIHNvIHRoaXMgaXNuJ3Qgb3duZWQgYnkgdXMuCi0gIC8vCi0gIC8vIFVwcGVyIGxheWVycyBjYW4gbWFrZSBibGVfYWR2ZXJ0aXNlcl9pbnRlcmZhY2VfdCBBUEkgY2FsbHMgdGhyb3VnaCB0aGlzCi0gIC8vIHN0cnVjdHVyZS4KLSAgdmlydHVhbCBCbGVBZHZlcnRpc2VySW50ZXJmYWNlKiBHZXRBZHZlcnRpc2VySEFMSW50ZXJmYWNlKCkgY29uc3QgPSAwOwotCi0gIC8vIFRoZSBIQUwgbW9kdWxlIHBvaW50ZXIgdGhhdCByZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVCBMRSBzY2FubmVyCi0gIC8vIGludGVyZmFjZS4gVGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBhbmQgcHJvdmlkZWQgYnkgdGhlIHNoYXJlZCBCbHVldG9vdGgKLSAgLy8gbGlicmFyeSwgc28gdGhpcyBpc24ndCBvd25lZCBieSB1cy4KLSAgLy8KLSAgLy8gVXBwZXIgbGF5ZXJzIGNhbiBtYWtlIGJsZV9zY2FubmVyX2ludGVyZmFjZV90IEFQSSBjYWxscyB0aHJvdWdoIHRoaXMKLSAgLy8gc3RydWN0dXJlLgotICB2aXJ0dWFsIEJsZVNjYW5uZXJJbnRlcmZhY2UqIEdldFNjYW5uZXJIQUxJbnRlcmZhY2UoKSBjb25zdCA9IDA7Ci0KLSAgLy8gVGhlIEhBTCBtb2R1bGUgcG9pbnRlciB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJULUdBVFQgY2xpZW50Ci0gIC8vIGludGVyZmFjZS4gVGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBhbmQgcHJvdmlkZWQgYnkgdGhlIHNoYXJlZCBCbHVldG9vdGgKLSAgLy8gbGlicmFyeSwgc28gdGhpcyBpc24ndCBvd25lZCBieSB1cy4KLSAgLy8KLSAgLy8gVXBwZXIgbGF5ZXJzIGNhbiBtYWtlIGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QgQVBJIGNhbGxzIHRocm91Z2ggdGhpcwotICAvLyBzdHJ1Y3R1cmUuCi0gIHZpcnR1YWwgY29uc3QgYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCogR2V0Q2xpZW50SEFMSW50ZXJmYWNlKCkgY29uc3QgPSAwOwotCi0gIC8vIFRoZSBIQUwgbW9kdWxlIHBvaW50ZXIgdGhhdCByZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1HQVRUIHNlcnZlcgotICAvLyBpbnRlcmZhY2UuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gYW5kIHByb3ZpZGVkIGJ5IHRoZSBzaGFyZWQgQmx1ZXRvb3RoCi0gIC8vIGxpYnJhcnksIHNvIHRoaXMgaXNuJ3Qgb3duZWQgYnkgdXMuCi0gIC8vCi0gIC8vIFVwcGVyIGxheWVycyBjYW4gbWFrZSBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90IEFQSSBjYWxscyB0aHJvdWdoIHRoaXMKLSAgLy8gc3RydWN0dXJlLgotICB2aXJ0dWFsIGNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QqIEdldFNlcnZlckhBTEludGVyZmFjZSgpIGNvbnN0ID0gMDsKLQotICAvLyBJbml0aWF0ZXMgYSByZWd1bGFyIEJMRSBkZXZpY2Ugc2Nhbi4gVGhpcyBpcyBjYWxsZWQgaW50ZXJuYWxseSBmcm9tIGVhY2gKLSAgLy8gTG93RW5lcmd5Q2xpZW50LiBUaGlzIGZ1bmN0aW9uIHN5bmNocm9uaXplcyB0aGUgc2NhbiByZXF1ZXN0cyBhbmQgbWFpbnRhaW5zCi0gIC8vIGFuIGludGVybmFsIHJlZmVyZW5jZSBjb3VudCBmb3IgZWFjaCBzY2FuIGNsaWVudCB0aGF0IGlzIGludGVyZXN0ZWQuCi0gIGJ0X3N0YXR1c190IFN0YXJ0U2NhbihpbnQgY2xpZW50X2lkKTsKLSAgYnRfc3RhdHVzX3QgU3RvcFNjYW4oaW50IGNsaWVudF9pZCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEJsdWV0b290aEdhdHRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkJsdWV0b290aEdhdHRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSBwcml2YXRlOgotICAvLyBVc2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBkaWZmZXJlbnQgQkxFIHNjYW4gY2xpZW50cy4KLSAgc3RkOjptdXRleCBzY2FuX2NsaWVudHNfbG9ja187Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQ+IHNjYW5fY2xpZW50X3NldF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsdWV0b290aEdhdHRJbnRlcmZhY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5jYyBiL3NlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODJiNWUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9oYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvb2JzZXJ2ZXJfbGlzdC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxzaGFyZWRfbXV0ZXg+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9vYnNlcnZlcl9saXN0LmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvaGFsX3V0aWwuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIHN0ZDo6bG9ja19ndWFyZDsKLXVzaW5nIHN0ZDo6dW5pcXVlX2xvY2s7Ci11c2luZyBzdGQ6OnNoYXJlZF9sb2NrOwotdXNpbmcgc3RkOjptdXRleDsKLSNpZiBkZWZpbmVkKE9TX0dFTkVSSUMpICYmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKSAmJiAoX0xJQkNQUF9WRVJTSU9OIDwgMzUwMCkKLXVzaW5nIHNoYXJlZF9tdXRleF9pbXBsID0gc3RkOjpzaGFyZWRfbXV0ZXg7Ci0jZWxzZQotdXNpbmcgc2hhcmVkX211dGV4X2ltcGwgPSBzdGQ6OnNoYXJlZF90aW1lZF9tdXRleDsKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUgZ2xvYmFsIEJsdWV0b290aEludGVyZmFjZSBpbnN0YW5jZS4KLUJsdWV0b290aEludGVyZmFjZSogZ19ibHVldG9vdGhfaW50ZXJmYWNlID0gbnVsbHB0cjsKLQotLy8gTXV0ZXggdXNlZCBieSBjYWxsYmFja3MgdG8gYWNjZXNzIHxnX2ludGVyZmFjZXwuIElmIHdlIGluaXRpYWxpemUgb3IgY2xlYW4gaXQKLS8vIHVzZSB1bmlxdWVfbG9jay4gSWYgb25seSBhY2Nlc3NpbmcgfGdfaW50ZXJmYWNlfCB1c2Ugc2hhcmVkIGxvY2suCi0vLyBUT0RPKGpwYXdsb3dza2kpOiB0aGlzIHNob3VsZCBiZSBqdXN0IHNoYXJlZF9tdXRleCwgYXMgd2UgY3VycmVudGx5IGRvbid0IHVzZQotLy8gdGltZWQgbWV0aG9kcy4gQ2hhbmdlIHRvIHNoYXJlZF9tdXRleCB3aGVuIHdlIHVwZ3JhZGUgdG8gQysrMTQKLXNoYXJlZF9tdXRleF9pbXBsIGdfaW5zdGFuY2VfbG9jazsKLQotLy8gSGVscGVyIGZvciBvYnRhaW5pbmcgdGhlIG9ic2VydmVyIGxpc3QuIFRoaXMgaXMgZm9yd2FyZCBkZWNsYXJlZCBoZXJlIGFuZAotLy8gZGVmaW5lZCBiZWxvdyBzaW5jZSBpdCBkZXBlbmRzIG9uIEJsdWV0b290aEludGVyZmFjZUltcGwuCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEludGVyZmFjZTo6T2JzZXJ2ZXI+KiBHZXRPYnNlcnZlcnMoKTsKLQotI2RlZmluZSBGT1JfRUFDSF9CTFVFVE9PVEhfT0JTRVJWRVIoZnVuYykgIFwKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6ICpHZXRPYnNlcnZlcnMoKSkgeyBcCi0gICAgb2JzZXJ2ZXIuZnVuYzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFnX2JsdWV0b290aF9pbnRlcmZhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgcmVjZWl2ZWQgd2hpbGUgfGdfaW50ZXJmYWNlfCBpcyBOVUxMIjsgXAotICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotdm9pZCBBZGFwdGVyU3RhdGVDaGFuZ2VkQ2FsbGJhY2soYnRfc3RhdGVfdCBzdGF0ZSkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBWTE9HKDEpIDw8ICJBZGFwdGVyIHN0YXRlIGNoYW5nZWQ6ICIgPDwgQnRTdGF0ZVRleHQoc3RhdGUpOwotICBGT1JfRUFDSF9CTFVFVE9PVEhfT0JTRVJWRVIoQWRhcHRlclN0YXRlQ2hhbmdlZENhbGxiYWNrKHN0YXRlKSk7Ci19Ci0KLXZvaWQgQWRhcHRlclByb3BlcnRpZXNDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIFZMT0coMSkgPDwgIkFkYXB0ZXIgcHJvcGVydGllcyBjaGFuZ2VkIC0gc3RhdHVzOiAiIDw8IEJ0U3RhdHVzVGV4dChzdGF0dXMpCi0gICAgICAgICAgPDwgIiwgbnVtX3Byb3BlcnRpZXM6ICIgPDwgbnVtX3Byb3BlcnRpZXM7Ci0gIEZPUl9FQUNIX0JMVUVUT09USF9PQlNFUlZFUigKLSAgICAgIEFkYXB0ZXJQcm9wZXJ0aWVzQ2FsbGJhY2soc3RhdHVzLCBudW1fcHJvcGVydGllcywgcHJvcGVydGllcykpOwotfQotCi12b2lkIFJlbW90ZURldmljZVByb3BlcnRpZXNDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgVkxPRygxKSA8PCAiIFJlbW90ZSBkZXZpY2UgcHJvcGVydGllcyBjaGFuZ2VkIC0gc3RhdHVzOiAiCi0gICAgICAgICAgPDwgQnRTdGF0dXNUZXh0KHN0YXR1cykKLSAgICAgICAgICA8PCAiIC0gQkRfQUREUjogIiA8PCBCdEFkZHJTdHJpbmcocmVtb3RlX2JkX2FkZHIpCi0gICAgICAgICAgPDwgIiwgbnVtX3Byb3BlcnRpZXM6ICIgPDwgbnVtX3Byb3BlcnRpZXM7Ci0gIEZPUl9FQUNIX0JMVUVUT09USF9PQlNFUlZFUihSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FsbGJhY2soCi0gICAgICBzdGF0dXMsIHJlbW90ZV9iZF9hZGRyLCBudW1fcHJvcGVydGllcywgcHJvcGVydGllcykpOwotfQotCi12b2lkIERldmljZUZvdW5kQ2FsbGJhY2soaW50IG51bV9wcm9wZXJ0aWVzLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIFZMT0coMSkgPDwgIiBEZXZpY2UgZm91bmQuIjsKLSAgRk9SX0VBQ0hfQkxVRVRPT1RIX09CU0VSVkVSKERldmljZUZvdW5kQ2FsbGJhY2sobnVtX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMpKTsKLX0KLQotdm9pZCBEaXNjb3ZlcnlTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9kaXNjb3Zlcnlfc3RhdGVfdCBzdGF0ZSkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBWRVJJRllfSU5URVJGQUNFX09SX1JFVFVSTigpOwotICBWTE9HKDEpIDw8ICJEaXNjb3Zlcnkgc3RhdGUgY2hhbmdlZCAtIHN0YXRlOiAiIDw8IEJ0RGlzY292ZXJ5U3RhdGVUZXh0KHN0YXRlKTsKLSAgRk9SX0VBQ0hfQkxVRVRPT1RIX09CU0VSVkVSKERpc2NvdmVyeVN0YXRlQ2hhbmdlZENhbGxiYWNrKHN0YXRlKSk7Ci19Ci0KLXZvaWQgUGluUmVxdWVzdENhbGxiYWNrKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9iZG5hbWVfdCogYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZCwgYm9vbCBtaW5fMTZfZGlnaXQpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gcmVtb3RlX2JkX2FkZHI6ICIgPDwgcmVtb3RlX2JkX2FkZHIKLSAgICAgICAgICA8PCAiIC0gYmRfbmFtZTogIiA8PCBiZF9uYW1lIDw8ICIgLSBjb2Q6ICIgPDwgY29kCi0gICAgICAgICAgPDwgIiAtIG1pbl8xNl9kaWdpdDogIiA8PCBtaW5fMTZfZGlnaXQ7Ci0gIEZPUl9FQUNIX0JMVUVUT09USF9PQlNFUlZFUigKLSAgICAgIFBpblJlcXVlc3RDYWxsYmFjayhyZW1vdGVfYmRfYWRkciwgYmRfbmFtZSwgY29kLCBtaW5fMTZfZGlnaXQpKTsKLX0KLQotdm9pZCBTU1BSZXF1ZXN0Q2FsbGJhY2soUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIGJ0X2JkbmFtZV90KiBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kLCBidF9zc3BfdmFyaWFudF90IHBhaXJpbmdfdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3Nfa2V5KSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIHJlbW90ZV9iZF9hZGRyOiAiIDw8IHJlbW90ZV9iZF9hZGRyCi0gICAgICAgICAgPDwgIiAtIGJkX25hbWU6ICIgPDwgYmRfbmFtZSA8PCAiIC0gY29kOiAiIDw8IGNvZAotICAgICAgICAgIDw8ICIgLSBwYWlyaW5nX3ZhcmlhbnQ6ICIgPDwgcGFpcmluZ192YXJpYW50OwotICBGT1JfRUFDSF9CTFVFVE9PVEhfT0JTRVJWRVIoU1NQUmVxdWVzdENhbGxiYWNrKHJlbW90ZV9iZF9hZGRyLCBiZF9uYW1lLCBjb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcmluZ192YXJpYW50LCBwYXNzX2tleSkpOwotfQotCi12b2lkIEJvbmRTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlLCBpbnQgZmFpbF9yZWFzb24pIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gcmVtb3RlX2JkX2FkZHI6ICIgPDwgQnRBZGRyU3RyaW5nKHJlbW90ZV9iZF9hZGRyKQotICAgICAgICAgIDw8ICIgLSBzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIgLSBzdGF0ZTogIiA8PCBzdGF0ZTsKLSAgRk9SX0VBQ0hfQkxVRVRPT1RIX09CU0VSVkVSKAotICAgICAgQm9uZFN0YXRlQ2hhbmdlZENhbGxiYWNrKHN0YXR1cywgcmVtb3RlX2JkX2FkZHIsIHN0YXRlLCBmYWlsX3JlYXNvbikpOwotfQotCi12b2lkIEFjbFN0YXRlQ2hhbmdlZENhbGxiYWNrKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2FjbF9zdGF0ZV90IHN0YXRlLCBpbnQgdHJhbnNwb3J0X2xpbmtfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfaGNpX2Vycm9yX2NvZGVfdCBoY2lfcmVhc29uKSB7Ci0gIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gIFZFUklGWV9JTlRFUkZBQ0VfT1JfUkVUVVJOKCk7Ci0gIENIRUNLKHJlbW90ZV9iZF9hZGRyKTsKLSAgVkxPRygxKSA8PCAiUmVtb3RlIGRldmljZSBBQ0wgc3RhdGUgY2hhbmdlZCAtIHN0YXR1czogIgotICAgICAgICAgIDw8IEJ0U3RhdHVzVGV4dChzdGF0dXMpCi0gICAgICAgICAgPDwgIiAtIEJEX0FERFI6ICIgPDwgQnRBZGRyU3RyaW5nKHJlbW90ZV9iZF9hZGRyKSA8PCAiIC0gc3RhdGU6ICIKLSAgICAgICAgICA8PCAoKHN0YXRlID09IEJUX0FDTF9TVEFURV9DT05ORUNURUQpID8gIkNPTk5FQ1RFRCIgOiAiRElTQ09OTkVDVEVEIikKLSAgICAgICAgICA8PCAiIC0gSENJX1JFQVNPTjogIiA8PCBzdGQ6OnRvX3N0cmluZyhoY2lfcmVhc29uKTsKLSAgRk9SX0VBQ0hfQkxVRVRPT1RIX09CU0VSVkVSKEFjbFN0YXRlQ2hhbmdlZENhbGxiYWNrKAotICAgICAgc3RhdHVzLCAqcmVtb3RlX2JkX2FkZHIsIHN0YXRlLCB0cmFuc3BvcnRfbGlua190eXBlLCBoY2lfcmVhc29uKSk7Ci19Ci0KLXZvaWQgVGhyZWFkRXZlbnRDYWxsYmFjayhidF9jYl90aHJlYWRfZXZ0IGV2dCkgewotICBWTE9HKDEpIDw8ICJUaHJlYWRFdmVudENhbGxiYWNrIiA8PCBCdEV2ZW50VGV4dChldnQpOwotCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogVGhpcyBjYWxsYmFjayBpcyBjb21wbGV0ZWx5IHVzZWxlc3MgdG8gdXMgYnV0IGJ0aWYgYm9ya3MKLSAgLy8gb3V0IGlmIHRoaXMgaXMgbm90IHNldC4gQ29uc2lkZXIgbWFraW5nIHRoaXMgb3B0aW9uYWwuCi19Ci0KLWJvb2wgU2V0V2FrZUFsYXJtQ2FsbG91dCh1aW50NjRfdCAvKiBkZWxheV9taWxsaXMgKi8sIGJvb2wgLyogc2hvdWxkX3dha2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fY2IgLyogY2IgKi8sIHZvaWQqIC8qIGRhdGEgKi8pIHsKLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBBY2NvcmRpbmcgdG8gc2hhcnZpbEAsIHRoaXMgaW50ZXJmYWNlIGRvZXNuJ3QgZXZlbiBuZWVkIHRvCi0gIC8vIGV4aXN0IGFuZCBjYW4gYmUgZG9uZSBlbnRpcmVseSBmcm9tIHdpdGhpbiBvc2kgYnkgaW50ZXJmYWNpbmcgZGlyZWN0bHkgd2l0aAotICAvLyB0aGUga2VybmVsLiBSZW1vdmUgdGhlc2Ugc3R1YnMgb25jZSB0aGF0J3MgZml4ZWQuIChTZWUgaHR0cDovL2IvMjMzOTAyOTcpCi0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50IEFjcXVpcmVXYWtlTG9ja0NhbGxvdXQoY29uc3QgY2hhciogLyogbG9ja19uYW1lICovKSB7Ci0gIC8vIFRPRE8oYXJtYW5zaXRvKTogQWNjb3JkaW5nIHRvIHNoYXJ2aWxALCB0aGlzIGludGVyZmFjZSBkb2Vzbid0IGV2ZW4gbmVlZCB0bwotICAvLyBleGlzdCBhbmQgY2FuIGJlIGRvbmUgZW50aXJlbHkgZnJvbSB3aXRoaW4gb3NpIGJ5IGludGVyZmFjaW5nIGRpcmVjdGx5IHdpdGgKLSAgLy8gdGhlIGtlcm5lbC4gUmVtb3ZlIHRoZXNlIHN0dWJzIG9uY2UgdGhhdCdzIGZpeGVkLiAoU2VlIGh0dHA6Ly9iLzIzMzkwMjk3KQotICAvLyBMaWUgaGVyZSBhbmQgcmV0dXJuIHN1Y2Nlc3Mgc28gdGhhdCBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHRoZSBjb250cm9sbGVyCi0gIC8vIHdvcmtzIGJlZm9yZSB0aGlzIGlzIHByb3Blcmx5IGltcGxlbWVudGVkLgotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBSZWxlYXNlV2FrZUxvY2tDYWxsb3V0KGNvbnN0IGNoYXIqIC8qIGxvY2tfbmFtZSAqLykgewotICAvLyBUT0RPKGFybWFuc2l0byk6IEFjY29yZGluZyB0byBzaGFydmlsQCwgdGhpcyBpbnRlcmZhY2UgZG9lc24ndCBldmVuIG5lZWQgdG8KLSAgLy8gZXhpc3QgYW5kIGNhbiBiZSBkb25lIGVudGlyZWx5IGZyb20gd2l0aGluIG9zaSBieSBpbnRlcmZhY2luZyBkaXJlY3RseSB3aXRoCi0gIC8vIHRoZSBrZXJuZWwuIFJlbW92ZSB0aGVzZSBzdHVicyBvbmNlIHRoYXQncyBmaXhlZC4gKFNlZSBodHRwOi8vYi8yMzM5MDI5NykKLSAgLy8gTGllIGhlcmUgYW5kIHJldHVybiBzdWNjZXNzIHNvIHRoYXQgZW5hYmxpbmcgYW5kIGRpc2FibGluZyB0aGUgY29udHJvbGxlcgotICAvLyB3b3JrcyBiZWZvcmUgdGhpcyBpcyBwcm9wZXJseSBpbXBsZW1lbnRlZC4KLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi12b2lkIExpbmtRdWFsaXR5UmVwb3J0Q2FsbGJhY2sodWludDY0X3QgdGltZXN0YW1wLCBpbnQgcmVwb3J0X2lkLCBpbnQgcnNzaSwKLSAgICBpbnQgc25yLCBpbnQgcmV0cmFuc21pc3Npb25fY291bnQsIGludCBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LAotICAgIGludCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpIHsKLSAgc2hhcmVkX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgVkVSSUZZX0lOVEVSRkFDRV9PUl9SRVRVUk4oKTsKLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgLSB0aW1lc3RhbXA6ICIgPDwgdGltZXN0YW1wCi0gICAgICAgICAgICAgICA8PCAiIC0gcmVwb3J0X2lkOiAiIDw8IHJlcG9ydF9pZCA8PCAiIC0gcnNzaTogIiA8PCByc3NpCi0gICAgICAgICAgICAgICA8PCAiIC0gc25yOiAiIDw8IHNucgotICAgICAgICAgICAgICAgPDwgIiAtIHJldHJhbnNtaXNzaW9uX2NvdW50OiAiIDw8IHJldHJhbnNtaXNzaW9uX2NvdW50Ci0gICAgICAgICAgICAgICA8PCAiIC0gcGFja2V0c19ub3RfcmVjZWl2ZV9jb3VudDogIiA8PCBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50Ci0gICAgICAgICAgICAgICA8PCAiIC0gbmVnYXRpdmVfYWNrbm93bGVkZ2VtZW50X2NvdW50OiAiCi0gICAgICAgICAgICAgICA8PCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQ7Ci0gIEZPUl9FQUNIX0JMVUVUT09USF9PQlNFUlZFUihMaW5rUXVhbGl0eVJlcG9ydENhbGxiYWNrKAotICAgICAgdGltZXN0YW1wLCByZXBvcnRfaWQsIHJzc2ksIHNuciwgcmV0cmFuc21pc3Npb25fY291bnQsCi0gICAgICBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50LCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpKTsKLX0KLQotLy8gVGhlIEhBTCBCbHVldG9vdGggRE0gY2FsbGJhY2tzLgotYnRfY2FsbGJhY2tzX3QgYnRfY2FsbGJhY2tzID0gewotICAgIHNpemVvZihidF9jYWxsYmFja3NfdCksCi0gICAgQWRhcHRlclN0YXRlQ2hhbmdlZENhbGxiYWNrLAotICAgIEFkYXB0ZXJQcm9wZXJ0aWVzQ2FsbGJhY2ssCi0gICAgUmVtb3RlRGV2aWNlUHJvcGVydGllc0NhbGxiYWNrLAotICAgIERldmljZUZvdW5kQ2FsbGJhY2ssCi0gICAgRGlzY292ZXJ5U3RhdGVDaGFuZ2VkQ2FsbGJhY2ssCi0gICAgUGluUmVxdWVzdENhbGxiYWNrLAotICAgIFNTUFJlcXVlc3RDYWxsYmFjaywKLSAgICBCb25kU3RhdGVDaGFuZ2VkQ2FsbGJhY2ssCi0gICAgQWNsU3RhdGVDaGFuZ2VkQ2FsbGJhY2ssCi0gICAgVGhyZWFkRXZlbnRDYWxsYmFjaywKLSAgICBudWxscHRyLCAvKiBkdXRfbW9kZV9yZWN2X2NiICovCi0gICAgbnVsbHB0ciwgLyogbGVfdGVzdF9tb2RlX2NiICovCi0gICAgbnVsbHB0ciwgLyogZW5lcmd5X2luZm9fY2IgKi8KLSAgICBMaW5rUXVhbGl0eVJlcG9ydENhbGxiYWNrLAotICAgIG51bGxwdHIgLyogZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGFfY2IgKi8KLX07Ci0KLWJ0X29zX2NhbGxvdXRzX3QgYnRfb3NfY2FsbG91dHMgPSB7c2l6ZW9mKGJ0X29zX2NhbGxvdXRzX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRXYWtlQWxhcm1DYWxsb3V0LCBBY3F1aXJlV2FrZUxvY2tDYWxsb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlV2FrZUxvY2tDYWxsb3V0fTsKLQotY29uc3RleHByIGNoYXIga0xpYmJsdWV0b290aFtdID0gImxpYmJsdWV0b290aC5zbyI7Ci1jb25zdGV4cHIgY2hhciBrQmx1ZXRvb3RoSW50ZXJmYWNlU3ltW10gPSAiYmx1ZXRvb3RoSW50ZXJmYWNlIjsKLQotaW50IGhhbF91dGlsX2xvYWRfYnRfbGlicmFyeV9mcm9tX2RsaWIoY29uc3QgYnRfaW50ZXJmYWNlX3QqKiBpbnRlcmZhY2UpIHsKLSAgYnRfaW50ZXJmYWNlX3QqIGl0ZntudWxscHRyfTsKLQotICAvLyBBbHdheXMgdHJ5IHRvIGxvYWQgdGhlIGRlZmF1bHQgQmx1ZXRvb3RoIHN0YWNrIG9uIEdOIGJ1aWxkcy4KLSAgdm9pZCogaGFuZGxlID0gZGxvcGVuKGtMaWJibHVldG9vdGgsIFJUTERfTk9XKTsKLSAgaWYgKCFoYW5kbGUpIHsKLSAgICBjb25zdCBjaGFyKiBlcnJfc3RyID0gZGxlcnJvcigpOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIHRvIGxvYWQgYmx1ZXRvb3RoIGxpYnJhcnksIGVycm9yPSIKLSAgICAgICAgICAgICAgIDw8IChlcnJfc3RyID8gZXJyX3N0ciA6ICJlcnJvciB1bmtub3duIik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYnRfaW50ZXJmYWNlX3QuCi0gIGl0ZiA9IChidF9pbnRlcmZhY2VfdCopZGxzeW0oaGFuZGxlLCBrQmx1ZXRvb3RoSW50ZXJmYWNlU3ltKTsKLSAgaWYgKCFpdGYpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBsb2FkIHN5bWJvbCBmcm9tIEJsdWV0b290aCBsaWJyYXJ5ICIKLSAgICAgICAgICAgICAgIDw8IGtCbHVldG9vdGhJbnRlcmZhY2VTeW07Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIC8vIFN1Y2Nlc3MuCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGxvYWRlZCBIQUwgcGF0aD0iIDw8IGtMaWJibHVldG9vdGgKLSAgICAgICAgICAgIDw8ICIgYnRpbnRlcmZhY2U9IiA8PCBpdGYgPDwgIiBoYW5kbGU9IiA8PCBoYW5kbGU7Ci0KLSAgKmludGVyZmFjZSA9IGl0ZjsKLSAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICAqaW50ZXJmYWNlID0gTlVMTDsKLSAgaWYgKGhhbmRsZSkgZGxjbG9zZShoYW5kbGUpOwotCi0gIHJldHVybiAtRUlOVkFMOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gQmx1ZXRvb3RoSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBwcm9kdWN0aW9uLgotY2xhc3MgQmx1ZXRvb3RoSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBCbHVldG9vdGhJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoSW50ZXJmYWNlSW1wbCgpIDogaGFsX2lmYWNlXyhudWxscHRyKSB7fQotCi0gIH5CbHVldG9vdGhJbnRlcmZhY2VJbXBsKCkgb3ZlcnJpZGUgewotICAgIGlmIChoYWxfaWZhY2VfKSBoYWxfaWZhY2VfLT5jbGVhbnVwKCk7Ci0gIH0KLQotICAvLyBCbHVldG9vdGhJbnRlcmZhY2Ugb3ZlcnJpZGVzLgotICB2b2lkIEFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gICAgb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICB2b2lkIFJlbW92ZU9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHNoYXJlZF9sb2NrPHNoYXJlZF9tdXRleF9pbXBsPiBsb2NrKGdfaW5zdGFuY2VfbG9jayk7Ci0gICAgb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7Ci0gIH0KLQotICBjb25zdCBidF9pbnRlcmZhY2VfdCogR2V0SEFMSW50ZXJmYWNlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gaGFsX2lmYWNlXzsgfQotCi0gIGJ0X2NhbGxiYWNrc190KiBHZXRIQUxDYWxsYmFja3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAmYnRfY2FsbGJhY2tzOyB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlLiBUaGlzIGxvYWRzIHRoZSBzaGFyZWQgQmx1ZXRvb3RoIGxpYnJhcnkgYW5kIHNldHMKLSAgLy8gdXAgdGhlIGNhbGxiYWNrcy4KLSAgYm9vbCBJbml0aWFsaXplKCkgewotICAgIC8vIExvYWQgdGhlIEJsdWV0b290aCBzaGFyZWQgbGlicmFyeSBtb2R1bGUuCi0gICAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIGludGVyZmFjZTsKLSAgICBpbnQgc3RhdHVzID0gaGFsX3V0aWxfbG9hZF9idF9saWJyYXJ5X2Zyb21fZGxpYigmaW50ZXJmYWNlKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiB0aGUgQmx1ZXRvb3RoIG1vZHVsZSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaGFsX2lmYWNlXyA9IGludGVyZmFjZTsKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEJsdWV0b290aCBpbnRlcmZhY2UuIFNldCB1cCB0aGUgYWRhcHRlciAoQmx1ZXRvb3RoIERNKSBBUEkKLSAgICAvLyBjYWxsYmFja3MuCi0gICAgc3RhdHVzID0gaGFsX2lmYWNlXy0+aW5pdCgmYnRfY2FsbGJhY2tzLCBmYWxzZSwgZmFsc2UsIDAsIG51bGxwdHIsIGZhbHNlKTsKLSAgICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBCbHVldG9vdGggc3RhY2siOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXR1cyA9IGhhbF9pZmFjZV8tPnNldF9vc19jYWxsb3V0cygmYnRfb3NfY2FsbG91dHMpOwotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgdXAgQmx1ZXRvb3RoIE9TIGNhbGxvdXRzIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8T2JzZXJ2ZXI+KiBvYnNlcnZlcnMoKSB7IHJldHVybiAmb2JzZXJ2ZXJzXzsgfQotCi0gcHJpdmF0ZToKLSAgLy8gTGlzdCBvZiBvYnNlcnZlcnMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBub3RpZmljYXRpb25zIGZyb20gdXMuIFdlJ3JlIG5vdAotICAvLyB1c2luZyBhIGJhc2U6Ok9ic2VydmVyTGlzdFRocmVhZFNhZmUsIHdoaWNoIGl0IHBvc3RzIG9ic2VydmVyIGV2ZW50cwotICAvLyBhdXRvbWF0aWNhbGx5IG9uIHRoZSBvcmlnaW4gdGhyZWFkcywgYXMgd2Ugd2FudCB0byBhdm9pZCB0aGF0IG92ZXJoZWFkIGFuZAotICAvLyBzaW1wbHkgZm9yd2FyZCB0aGUgZXZlbnRzIHRvIHRoZSB1cHBlciBsYXllci4KLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxPYnNlcnZlcj4gb2JzZXJ2ZXJzXzsKLQotICAvLyBUaGUgSEFMIGhhbmRsZSBvYnRhaW5lZCBmcm9tIHRoZSBzaGFyZWQgbGlicmFyeS4gV2UgaG9sZCBhIHdlYWsgcmVmZXJlbmNlCi0gIC8vIHRvIHRoaXMgc2luY2UgdGhlIGFjdHVhbCBkYXRhIHJlc2lkZXMgaW4gdGhlIHNoYXJlZCBCbHVldG9vdGggbGlicmFyeS4KLSAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIGhhbF9pZmFjZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsdWV0b290aEludGVyZmFjZUltcGwpOwotfTsKLQotbmFtZXNwYWNlIHsKLQotLy8gSGVscGVyIGZvciBvYnRhaW5pbmcgdGhlIG9ic2VydmVyIGxpc3QgZnJvbSB0aGUgZ2xvYmFsIGluc3RhbmNlLiBUaGlzCi0vLyBmdW5jdGlvbiBpcyBOT1QgdGhyZWFkIHNhZmUuCi1idGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEJsdWV0b290aEludGVyZmFjZTo6T2JzZXJ2ZXI+KiBHZXRPYnNlcnZlcnMoKSB7Ci0gIENIRUNLKGdfYmx1ZXRvb3RoX2ludGVyZmFjZSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxCbHVldG9vdGhJbnRlcmZhY2VJbXBsKj4oZ19ibHVldG9vdGhfaW50ZXJmYWNlKQotICAgICAgLT5vYnNlcnZlcnMoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIERlZmF1bHQgb2JzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLiBUaGVzZSBhcmUgcHJvdmlkZWQgc28gdGhhdCB0aGUgbWV0aG9kcwotLy8gdGhlbXNlbHZlcyBhcmUgb3B0aW9uYWwuCi12b2lkIEJsdWV0b290aEludGVyZmFjZTo6T2JzZXJ2ZXI6OkFkYXB0ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjaygKLSAgICBidF9zdGF0ZV90IC8qIHN0YXRlKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhJbnRlcmZhY2U6Ok9ic2VydmVyOjpBZGFwdGVyUHJvcGVydGllc0NhbGxiYWNrKAotICAgIGJ0X3N0YXR1c190IC8qIHN0YXR1cyAqLywgaW50IC8qIG51bV9wcm9wZXJ0aWVzICovLAotICAgIGJ0X3Byb3BlcnR5X3QqIC8qIHByb3BlcnRpZXMgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhJbnRlcmZhY2U6Ok9ic2VydmVyOjpSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FsbGJhY2soCi0gICAgYnRfc3RhdHVzX3QgLyogc3RhdHVzICovLCBSYXdBZGRyZXNzKiAvKiByZW1vdGVfYmRfYWRkciAqLywKLSAgICBpbnQgLyogbnVtX3Byb3BlcnRpZXMgKi8sIGJ0X3Byb3BlcnR5X3QqIC8qIHByb3BlcnRpZXMgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhJbnRlcmZhY2U6Ok9ic2VydmVyOjpEZXZpY2VGb3VuZENhbGxiYWNrKAotICAgIGludCAvKiBudW1fcHJvcGVydGllcyAqLywgYnRfcHJvcGVydHlfdCogLyogcHJvcGVydGllcyAqLykgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEludGVyZmFjZTo6T2JzZXJ2ZXI6OkRpc2NvdmVyeVN0YXRlQ2hhbmdlZENhbGxiYWNrKAotICAgIGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IC8qIHN0YXRlICovKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoSW50ZXJmYWNlOjpPYnNlcnZlcjo6UGluUmVxdWVzdENhbGxiYWNrKAotICAgIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9iZG5hbWVfdCogYmRfbmFtZSwgdWludDMyX3QgY29kLAotICAgIGJvb2wgbWluXzE2X2RpZ2l0KSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoSW50ZXJmYWNlOjpPYnNlcnZlcjo6U1NQUmVxdWVzdENhbGxiYWNrKAotICAgIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9iZG5hbWVfdCogYmRfbmFtZSwgdWludDMyX3QgY29kLAotICAgIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LCB1aW50MzJfdCBwYXNzX2tleSkgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIEJsdWV0b290aEludGVyZmFjZTo6T2JzZXJ2ZXI6OkJvbmRTdGF0ZUNoYW5nZWRDYWxsYmFjaygKLSAgICBidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9ib25kX3N0YXRlX3Qgc3RhdGUsCi0gICAgaW50IGZhaWxfcmVhc29uKSB7Ci0gIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgQmx1ZXRvb3RoSW50ZXJmYWNlOjpPYnNlcnZlcjo6QWNsU3RhdGVDaGFuZ2VkQ2FsbGJhY2soCi0gICAgYnRfc3RhdHVzX3QgLyogc3RhdHVzICovLCBjb25zdCBSYXdBZGRyZXNzJiAvKiByZW1vdGVfYmRhZGRyICovLAotICAgIGJ0X2FjbF9zdGF0ZV90IC8qIHN0YXRlICovLCBpbnQgLyogdHJhbnNwb3J0X2xpbmtfdHlwZSAqLywKLSAgICBidF9oY2lfZXJyb3JfY29kZV90IC8qIGhjaV9yZWFzb24gKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotdm9pZCBCbHVldG9vdGhJbnRlcmZhY2U6Ok9ic2VydmVyOjpMaW5rUXVhbGl0eVJlcG9ydENhbGxiYWNrKAotICAgIHVpbnQ2NF90IC8qIHRpbWVzdGFtcCAqLywgaW50IC8qIHJlcG9ydF9pZCAqLywgaW50IC8qIHJzc2kgKi8sCi0gICAgaW50IC8qIHNuciAqLywgaW50IC8qIHJldHJhbnNtaXNzaW9uX2NvdW50ICovLAotICAgIGludCAvKiBwYWNrZXRzX25vdF9yZWNlaXZlX2NvdW50ICovLAotICAgIGludCAvKiBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQgKi8pIHsKLSAgLy8gRG8gbm90aGluZy4KLX0KLQotLy8gc3RhdGljCi1ib29sIEJsdWV0b290aEludGVyZmFjZTo6SW5pdGlhbGl6ZSgpIHsKLSAgdW5pcXVlX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0soIWdfYmx1ZXRvb3RoX2ludGVyZmFjZSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPEJsdWV0b290aEludGVyZmFjZUltcGw+IGltcGwobmV3IEJsdWV0b290aEludGVyZmFjZUltcGwoKSk7Ci0gIGlmICghaW1wbC0+SW5pdGlhbGl6ZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQmx1ZXRvb3RoSW50ZXJmYWNlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBnX2JsdWV0b290aF9pbnRlcmZhY2UgPSBpbXBsLnJlbGVhc2UoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEJsdWV0b290aEludGVyZmFjZTo6Q2xlYW5VcCgpIHsKLSAgdW5pcXVlX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0soZ19ibHVldG9vdGhfaW50ZXJmYWNlKTsKLQotICBkZWxldGUgZ19ibHVldG9vdGhfaW50ZXJmYWNlOwotICBnX2JsdWV0b290aF9pbnRlcmZhY2UgPSBudWxscHRyOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQmx1ZXRvb3RoSW50ZXJmYWNlOjpJc0luaXRpYWxpemVkKCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotCi0gIHJldHVybiBnX2JsdWV0b290aF9pbnRlcmZhY2UgIT0gbnVsbHB0cjsKLX0KLQotLy8gc3RhdGljCi1CbHVldG9vdGhJbnRlcmZhY2UqIEJsdWV0b290aEludGVyZmFjZTo6R2V0KCkgewotICBzaGFyZWRfbG9jazxzaGFyZWRfbXV0ZXhfaW1wbD4gbG9jayhnX2luc3RhbmNlX2xvY2spOwotICBDSEVDSyhnX2JsdWV0b290aF9pbnRlcmZhY2UpOwotICByZXR1cm4gZ19ibHVldG9vdGhfaW50ZXJmYWNlOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQmx1ZXRvb3RoSW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZygKLSAgICBCbHVldG9vdGhJbnRlcmZhY2UqIHRlc3RfaW5zdGFuY2UpIHsKLSAgdW5pcXVlX2xvY2s8c2hhcmVkX211dGV4X2ltcGw+IGxvY2soZ19pbnN0YW5jZV9sb2NrKTsKLSAgQ0hFQ0sodGVzdF9pbnN0YW5jZSk7Ci0gIENIRUNLKCFnX2JsdWV0b290aF9pbnRlcmZhY2UpOwotCi0gIGdfYmx1ZXRvb3RoX2ludGVyZmFjZSA9IHRlc3RfaW5zdGFuY2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCBiL3NlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5MGNiMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2hhbC9ibHVldG9vdGhfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLQotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLS8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgSEFMIEJsdWV0b290aCBhZGFwdGVyIGludGVyZmFjZSwgd3JhcHBpbmcgYXJvdW5kCi0vLyB0aGUgdW5kZXJseWluZyBidF9pbnRlcmZhY2VfdCBzdHJ1Y3R1cmUsIGl0cyBtZXRob2RzLCBhbmQgY2FsbGJhY2tzLiBBIHNpbmdsZQotLy8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBleGlzdHMgcGVyIGFwcGxpY2F0aW9uIGFuZCBpdCBhbGxvd3MgbXVsdGlwbGUgY2xhc3NlcwotLy8gdG8gaW50ZXJmYWNlIHdpdGggdGhlIGdsb2JhbCBIQUwgaW50ZXJmYWNlIGJ5IG11bHRpcGxleGluZyBjYWxsYmFja3MgYW1vbmcKLS8vIHJlZ2lzdGVyZWQgY2xpZW50cy4KLS8vCi0vLyBUaGlzIGlzIGRlY2xhcmVkIGFzIGFuIGFic3RyYWN0IGludGVyZmFjZSBzbyB0aGF0IGEgZmFrZSBpbXBsZW1lbnRhdGlvbiBjYW4KLS8vIGJlIGluamVjdGVkIGZvciB0ZXN0aW5nIHRoZSB1cHBlciBsYXllci4KLS8vCi0vLyBUT0RPOiAoZXhwb3NlIGNhbGxiYWNrIHR5cGVzIGRpcmVjdGx5IGJ1dCB2aWEgcmVkaXJlY3Rpb24pIG1ldGhvZHMgZm9yCi0vLyBpbml0aWFsaXplLCBjbGVhbiB1cCwgYW5kIHNldCBmb3IgdGVzdGluZy4KLWNsYXNzIEJsdWV0b290aEludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgc3RhbmRhcmQgQmx1ZXRvb3RoIGFkYXB0ZXIgbWFuYWdlbWVudCBjYWxsYmFjayBpbnRlcmZhY2UuIFRoZSBIQUwKLSAgLy8gaW50ZXJmYWNlIGRvZXNuJ3QgYWxsb3cgcmVnaXN0ZXJpbmcgInVzZXIgZGF0YSIgdGhhdCBjYXJyaWVzIGNvbnRleHQgYmV5b25kCi0gIC8vIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXJzLCBmb3JjaW5nIGltcGxlbWVudGF0aW9ucyB0byBkZWFsIHdpdGggZ2xvYmFsCi0gIC8vIHZhcmlhYmxlcy4gVGhlIE9ic2VydmVyIGludGVyZmFjZSBpcyB0byByZWRpcmVjdCB0aGVzZSBldmVudHMgdG8gaW50ZXJlc3RlZAotICAvLyBwYXJ0aWVzIGluIGFuIG9iamVjdC1vcmllbnRlZCBtYW5uZXIuCi0gIC8vCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogV2Ugc2hvdWxkIGZpeCB0aGlzIGluIHRoZSBIQUwuCi0gIGNsYXNzIE9ic2VydmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5PYnNlcnZlcigpID0gZGVmYXVsdDsKLQotICAgIC8vIEFsbCBvZiB0aGUgZXZlbnRzIGJlbG93IGNvcnJlc3BvbmQgdG8gY2FsbGJhY2tzIGRlZmluZWQgaW4KLSAgICAvLyAiYnRfY2FsbGJhY2tzX3QiIGluIHRoZSBIQUwgQVBJIGRlZmluaXRpb25zLgotCi0gICAgdmlydHVhbCB2b2lkIEFkYXB0ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9zdGF0ZV90IHN0YXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgQWRhcHRlclByb3BlcnRpZXNDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpOwotICAgIHZpcnR1YWwgdm9pZCBSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKTsKLSAgICB2aXJ0dWFsIHZvaWQgRGV2aWNlRm91bmRDYWxsYmFjayhpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcyk7Ci0gICAgdmlydHVhbCB2b2lkIERpc2NvdmVyeVN0YXRlQ2hhbmdlZENhbGxiYWNrKGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IHN0YXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgUGluUmVxdWVzdENhbGxiYWNrKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYmRuYW1lX3QqIGJkX25hbWUsIHVpbnQzMl90IGNvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWluXzE2X2RpZ2l0KTsKLSAgICB2aXJ0dWFsIHZvaWQgU1NQUmVxdWVzdENhbGxiYWNrKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYmRuYW1lX3QqIGJkX25hbWUsIHVpbnQzMl90IGNvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19rZXkpOwotICAgIHZpcnR1YWwgdm9pZCBCb25kU3RhdGVDaGFuZ2VkQ2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9ib25kX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFpbF9yZWFzb24pOwotICAgIHZpcnR1YWwgdm9pZCBBY2xTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2FjbF9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNwb3J0X2xpbmtfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfaGNpX2Vycm9yX2NvZGVfdCBoY2lfcmVhc29uKTsKLSAgICB2aXJ0dWFsIHZvaWQgTGlua1F1YWxpdHlSZXBvcnRDYWxsYmFjaygKLSAgICAgICAgdWludDY0X3QgdGltZXN0YW1wLCBpbnQgcmVwb3J0X2lkLCBpbnQgcnNzaSwgaW50IHNuciwKLSAgICAgICAgaW50IHJldHJhbnNtaXNzaW9uX2NvdW50LCBpbnQgcGFja2V0c19ub3RfcmVjZWl2ZV9jb3VudCwKLSAgICAgICAgaW50IG5lZ2F0aXZlX2Fja25vd2xlZGdlbWVudF9jb3VudCk7Ci0KLSAgICAvLyBUT0RPKGFybWFuc2l0byk6IENvbXBsZXRlIHRoZSBsaXN0IG9mIGNhbGxiYWNrcy4KLSAgfTsKLQotICAvLyBJbml0aWFsaXplIGFuZCBjbGVhbiB1cCB0aGUgQmx1ZXRvb3RoSW50ZXJmYWNlIHNpbmdsZXRvbi4gUmV0dXJucyBmYWxzZSBpZgotICAvLyB0aGUgdW5kZXJseWluZyBIQUwgaW50ZXJmYWNlIGZhaWxlZCB0byBpbml0aWFsaXplLCBhbmQgdHJ1ZSBvbiBzdWNjZXNzLgotICBzdGF0aWMgYm9vbCBJbml0aWFsaXplKCk7Ci0KLSAgLy8gU2h1dHMgZG93biBhbmQgY2xlYW5zIHVwIHRoZSBpbnRlcmZhY2UuIENsZWFuVXAgbXVzdCBiZSBjYWxsZWQgb24gdGhlIHNhbWUKLSAgLy8gdGhyZWFkIHRoYXQgY2FsbGVkIEluaXRpYWxpemUuCi0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGludGVyZmFjZSB3YXMgaW5pdGlhbGl6ZWQgYW5kIGEgZ2xvYmFsIHNpbmdsZXRvbiBoYXMKLSAgLy8gYmVlbiBjcmVhdGVkLgotICBzdGF0aWMgYm9vbCBJc0luaXRpYWxpemVkKCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBmb3IgdGVzdGluZy4gVXNlIHRoaXMgdG8gaW5qZWN0IGEgdGVzdCB2ZXJzaW9uIG9mCi0gIC8vIEJsdWVvb3RoSW50ZXJmYWNlLiBUbyBiZSB1c2VkIGZyb20gdW5pdCB0ZXN0cyBvbmx5LgotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplRm9yVGVzdGluZyhCbHVldG9vdGhJbnRlcmZhY2UqIHRlc3RfaW5zdGFuY2UpOwotCi0gIC8vIFJldHVybnMgdGhlIEJsdWV0b290aEludGVyZmFjZSBzaW5nbGV0b24uIElmIHRoZSBpbnRlcmZhY2UgaGFzIG5vdCBiZWVuCi0gIC8vIGluaXRpYWxpemVkLCByZXR1cm5zIG51bGxwdHIuCi0gIHN0YXRpYyBCbHVldG9vdGhJbnRlcmZhY2UqIEdldCgpOwotCi0gIC8vIEFkZCBvciByZW1vdmUgYW4gb2JzZXJ2ZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIG5vdGlmaWNhdGlvbnMgZnJvbSB1cy4KLSAgdmlydHVhbCB2b2lkIEFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcikgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0KLSAgLy8gVGhlIEhBTCBtb2R1bGUgcG9pbnRlciB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJsdWV0b290aCBhZGFwdGVyCi0gIC8vIG1hbmFnZW1lbnQgaW50ZXJmYWNlLiBUaGlzIGlzIGltcGxlbWVudGVkIGluIGFuZCBwcm92aWRlZCBieSB0aGUgc2hhcmVkCi0gIC8vIEJsdWV0b290aCBsaWJyYXJ5LCBzbyB0aGlzIGlzbid0IG93bmVkIGJ5IHVzLgotICAvLwotICAvLyBVcHBlciBsYXllcnMgY2FuIG1ha2UgYnRfaW50ZXJmYWNlX3QgQVBJIGNhbGxzIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmUuCi0gIC8vIEhvd2V2ZXIsIERPIE5PVCBjYWxsIHRoZSAiaW5pdCIgZnVuY3Rpb24gYXMgdGhpcyBpcyBjYWxsZWQgYW5kIG1hbmFnZWQgYnkKLSAgLy8gdXMuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgImluaXQiIGlzIGNhbGxlZCBkaXJlY3RseSBieSB1cHBlciBsYXllcnMuCi0gIHZpcnR1YWwgY29uc3QgYnRfaW50ZXJmYWNlX3QqIEdldEhBTEludGVyZmFjZSgpIGNvbnN0ID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBIQUwgY2FsbGJhY2tzIHRoYXQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHByZXZpb3VzbHkuCi0gIHZpcnR1YWwgYnRfY2FsbGJhY2tzX3QqIEdldEhBTENhbGxiYWNrcygpIGNvbnN0ID0gMDsKLQotIHByb3RlY3RlZDoKLSAgQmx1ZXRvb3RoSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5CbHVldG9vdGhJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoSW50ZXJmYWNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5jYyBiL3NlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2F2X2ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4NjZhNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9hdl9pbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9hdl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgewotCi0vLyBUaGUgZ2xvYmFsIHRlc3QgaGFuZGxlciBpbnN0YW5jZXMuIFdlIGhhdmUgdG8gaGF2ZSBnbG9iYWxzIHNpbmNlIHRoZSBIQUwKLS8vIGludGVyZmFjZSBtZXRob2RzIGFsbCBoYXZlIHRvIGJlIGdsb2JhbCBhbmQgdGhlaXIgc2lnbmF0dXJlcyBkb24ndCBhbGxvdyB1cwotLy8gdG8gcGFzcyBpbiB1c2VyX2RhdGEuCi1zdGQ6OnNoYXJlZF9wdHI8RmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpUZXN0QTJkcFNvdXJjZUhhbmRsZXI+Ci0gICAgZ19hMmRwX3NvdXJjZV9oYW5kbGVye307Ci1zdGQ6OnNoYXJlZF9wdHI8RmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpUZXN0QTJkcFNpbmtIYW5kbGVyPgotICAgIGdfYTJkcF9zaW5rX2hhbmRsZXJ7fTsKLQotYnRfc3RhdHVzX3QgRmFrZVNvdXJjZUluaXQoCi0gICAgYnRhdl9zb3VyY2VfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywgaW50IG1heF9jb25uZWN0ZWRfYXVkaW9fZGV2aWNlcywKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4mIG9mZmxvYWRpbmdfcHJlZmVyZW5jZSkgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IEZha2VTaW5rSW5pdChidGF2X3NpbmtfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2Nvbm5lY3RlZF9hdWRpb19kZXZpY2VzKSB7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotYnRfc3RhdHVzX3QgRmFrZUNvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBpZiAoZ19hMmRwX3NvdXJjZV9oYW5kbGVyKSByZXR1cm4gZ19hMmRwX3NvdXJjZV9oYW5kbGVyLT5Db25uZWN0KGJkX2FkZHIpOwotICBpZiAoZ19hMmRwX3NpbmtfaGFuZGxlcikgcmV0dXJuIGdfYTJkcF9zaW5rX2hhbmRsZXItPkNvbm5lY3QoYmRfYWRkcik7Ci0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotYnRfc3RhdHVzX3QgRmFrZURpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBpZiAoZ19hMmRwX3NvdXJjZV9oYW5kbGVyKSByZXR1cm4gZ19hMmRwX3NvdXJjZV9oYW5kbGVyLT5EaXNjb25uZWN0KGJkX2FkZHIpOwotICBpZiAoZ19hMmRwX3NpbmtfaGFuZGxlcikgcmV0dXJuIGdfYTJkcF9zaW5rX2hhbmRsZXItPkRpc2Nvbm5lY3QoYmRfYWRkcik7Ci0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotdm9pZCBGYWtlQ2xlYW51cCh2b2lkKSB7fQotCi12b2lkIEZha2VTZXRBdWRpb0ZvY3VzU3RhdGUoaW50IGZvY3VzX3N0YXRlKSB7Ci0gIGlmIChnX2EyZHBfc2lua19oYW5kbGVyKQotICAgIHJldHVybiBnX2EyZHBfc2lua19oYW5kbGVyLT5TZXRBdWRpb0ZvY3VzU3RhdGUoZm9jdXNfc3RhdGUpOwotfQotCi12b2lkIEZha2VTZXRBdWRpb1RyYWNrR2FpbihmbG9hdCBnYWluKSB7Ci0gIGlmIChnX2EyZHBfc2lua19oYW5kbGVyKSByZXR1cm4gZ19hMmRwX3NpbmtfaGFuZGxlci0+U2V0QXVkaW9UcmFja0dhaW4oZ2Fpbik7Ci19Ci0KLWJ0YXZfc291cmNlX2ludGVyZmFjZV90IGZha2VfYTJkcF9zb3VyY2VfaW50ZXJmYWNlID0gewotICAgIC5zaXplID0gc2l6ZW9mKGJ0YXZfc291cmNlX2ludGVyZmFjZV90KSwKLSAgICAuaW5pdCA9IEZha2VTb3VyY2VJbml0LAotICAgIC5jb25uZWN0ID0gRmFrZUNvbm5lY3QsCi0gICAgLmRpc2Nvbm5lY3QgPSBGYWtlRGlzY29ubmVjdCwKLSAgICAuc2V0X3NpbGVuY2VfZGV2aWNlID0gbnVsbHB0ciwKLSAgICAuc2V0X2FjdGl2ZV9kZXZpY2UgPSBudWxscHRyLAotICAgIC5jb25maWdfY29kZWMgPSBudWxscHRyLAotICAgIC5jbGVhbnVwID0gRmFrZUNsZWFudXAsCi19OwotCi1idGF2X3NpbmtfaW50ZXJmYWNlX3QgZmFrZV9hMmRwX3NpbmtfaW50ZXJmYWNlID0gewotICAgIC5zaXplID0gc2l6ZW9mKGJ0YXZfc2lua19pbnRlcmZhY2VfdCksCi0gICAgLmluaXQgPSBGYWtlU2lua0luaXQsCi0gICAgLmNvbm5lY3QgPSBGYWtlQ29ubmVjdCwKLSAgICAuZGlzY29ubmVjdCA9IEZha2VEaXNjb25uZWN0LAotICAgIC5jbGVhbnVwID0gRmFrZUNsZWFudXAsCi0gICAgLnNldF9hdWRpb19mb2N1c19zdGF0ZSA9IEZha2VTZXRBdWRpb0ZvY3VzU3RhdGUsCi0gICAgLnNldF9hdWRpb190cmFja19nYWluID0gRmFrZVNldEF1ZGlvVHJhY2tHYWluLAotICAgIC5zZXRfYWN0aXZlX2RldmljZSA9IG51bGxwdHIsCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2UoCi0gICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RBMmRwU291cmNlSGFuZGxlcj4gYTJkcF9zb3VyY2VfaGFuZGxlcikgewotICBDSEVDSyghZ19hMmRwX3NvdXJjZV9oYW5kbGVyKTsKLQotICBpZiAoYTJkcF9zb3VyY2VfaGFuZGxlcikgZ19hMmRwX3NvdXJjZV9oYW5kbGVyID0gYTJkcF9zb3VyY2VfaGFuZGxlcjsKLX0KLQotRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2UoCi0gICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RBMmRwU2lua0hhbmRsZXI+IGEyZHBfc2lua19oYW5kbGVyKSB7Ci0gIENIRUNLKCFnX2EyZHBfc2lua19oYW5kbGVyKTsKLQotICBpZiAoYTJkcF9zaW5rX2hhbmRsZXIpIGdfYTJkcF9zaW5rX2hhbmRsZXIgPSBhMmRwX3NpbmtfaGFuZGxlcjsKLX0KLQotRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjp+RmFrZUJsdWV0b290aEF2SW50ZXJmYWNlKCkgewotICBnX2EyZHBfc291cmNlX2hhbmRsZXIgPSB7fTsKLSAgZ19hMmRwX3NpbmtfaGFuZGxlciA9IHt9OwotfQotCi12b2lkIEZha2VCbHVldG9vdGhBdkludGVyZmFjZTo6Tm90aWZ5Q29ubmVjdGlvblN0YXRlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpIHsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6IGEyZHBfc291cmNlX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5Db25uZWN0aW9uU3RhdGVDYWxsYmFjayh0aGlzLCBiZGEsIHN0YXRlKTsKLSAgfQotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogYTJkcF9zaW5rX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5Db25uZWN0aW9uU3RhdGVDYWxsYmFjayh0aGlzLCBiZGEsIHN0YXRlKTsKLSAgfQotfQotdm9pZCBGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6Ok5vdGlmeUF1ZGlvU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hdWRpb19zdGF0ZV90IHN0YXRlKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBhMmRwX3NvdXJjZV9vYnNlcnZlcnNfKSB7Ci0gICAgb2JzZXJ2ZXIuQXVkaW9TdGF0ZUNhbGxiYWNrKHRoaXMsIGJkYSwgc3RhdGUpOwotICB9Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBhMmRwX3Npbmtfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLkF1ZGlvU3RhdGVDYWxsYmFjayh0aGlzLCBiZGEsIHN0YXRlKTsKLSAgfQotfQotdm9pZCBGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6Ok5vdGlmeUF1ZGlvQ29uZmlnKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4KLSAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBhMmRwX3NvdXJjZV9vYnNlcnZlcnNfKSB7Ci0gICAgb2JzZXJ2ZXIuQXVkaW9Db25maWdDYWxsYmFjayh0aGlzLCBiZGEsIGNvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotICB9Ci19Ci1ib29sIEZha2VCbHVldG9vdGhBdkludGVyZmFjZTo6UXVlcnlNYW5kYXRvcnlDb2RlY1ByZWZlcnJlZCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgLy8gVGhlIG1hbmRhdG9yeSBjb2RlYyBpcyBwcmVmZXJyZWQgb25seSB3aGVuIGFsbCBvYnNlcnZlcnMgZGlzYWJsZSB0aGVpcgotICAvLyBvcHRpb25hbCBjb2RlY3MuCi0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBhMmRwX3NvdXJjZV9vYnNlcnZlcnNfKSB7Ci0gICAgaWYgKCFvYnNlcnZlci5NYW5kYXRvcnlDb2RlY1ByZWZlcnJlZENhbGxiYWNrKHRoaXMsIGJkYSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIEZha2VCbHVldG9vdGhBdkludGVyZmFjZTo6Tm90aWZ5QXVkaW9Db25maWcoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudCkgewotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogYTJkcF9zaW5rX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5BdWRpb0NvbmZpZ0NhbGxiYWNrKHRoaXMsIGJkYSwgc2FtcGxlX3JhdGUsIGNoYW5uZWxfY291bnQpOwotICB9Ci19Ci0KLWJvb2wgRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpBMmRwU291cmNlRW5hYmxlKAotICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNfcHJpb3JpdGllcykgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkEyZHBTb3VyY2VEaXNhYmxlKCkge30KLQotYm9vbCBGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkEyZHBTaW5rRW5hYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi12b2lkIEZha2VCbHVldG9vdGhBdkludGVyZmFjZTo6QTJkcFNpbmtEaXNhYmxlKCkge30KLQotdm9pZCBGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkFkZEEyZHBTb3VyY2VPYnNlcnZlcigKLSAgICBBMmRwU291cmNlT2JzZXJ2ZXIqIG9ic2VydmVyKSB7Ci0gIENIRUNLKG9ic2VydmVyKTsKLSAgYTJkcF9zb3VyY2Vfb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpSZW1vdmVBMmRwU291cmNlT2JzZXJ2ZXIoCi0gICAgQTJkcFNvdXJjZU9ic2VydmVyKiBvYnNlcnZlcikgewotICBDSEVDSyhvYnNlcnZlcik7Ci0gIGEyZHBfc291cmNlX29ic2VydmVyc18uUmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotfQotCi12b2lkIEZha2VCbHVldG9vdGhBdkludGVyZmFjZTo6QWRkQTJkcFNpbmtPYnNlcnZlcihBMmRwU2lua09ic2VydmVyKiBvYnNlcnZlcikgewotICBDSEVDSyhvYnNlcnZlcik7Ci0gIGEyZHBfc2lua19vYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OlJlbW92ZUEyZHBTaW5rT2JzZXJ2ZXIoCi0gICAgQTJkcFNpbmtPYnNlcnZlciogb2JzZXJ2ZXIpIHsKLSAgQ0hFQ0sob2JzZXJ2ZXIpOwotICBhMmRwX3Npbmtfb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7Ci19Ci0KLWNvbnN0IGJ0YXZfc291cmNlX2ludGVyZmFjZV90KgotRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlOjpHZXRBMmRwU291cmNlSEFMSW50ZXJmYWNlKCkgewotICByZXR1cm4gJmZha2VfYTJkcF9zb3VyY2VfaW50ZXJmYWNlOwotfQotCi1jb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqCi1GYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OkdldEEyZHBTaW5rSEFMSW50ZXJmYWNlKCkgewotICByZXR1cm4gJmZha2VfYTJkcF9zaW5rX2ludGVyZmFjZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmggYi9zZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9hdl9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3YzlhMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9hdl9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxiYXNlL29ic2VydmVyX2xpc3QuaD4KLQotI2luY2x1ZGUgImFic3RyYWN0X29ic2VydmVyX2xpc3QuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLQotY2xhc3MgRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlIDogcHVibGljIEJsdWV0b290aEF2SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIEhhbmRsZXMgSEFMIEJsdWV0b290aCBBMkRQIEFQSSBjYWxscyBmb3IgdGVzdGluZy4gVGVzdCBjb2RlIGNhbiBwcm92aWRlIGEKLSAgLy8gZmFrZSBvciBtb2NrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgYW5kIGFsbCBjYWxscyB3aWxsIGJlIHJvdXRlZCB0byBpdC4KLSAgY2xhc3MgVGVzdEEyZHBTb3VyY2VIYW5kbGVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGJ0X3N0YXR1c190IENvbm5lY3QoUmF3QWRkcmVzcyBiZGEpID0gMDsKLSAgICB2aXJ0dWFsIGJ0X3N0YXR1c190IERpc2Nvbm5lY3QoUmF3QWRkcmVzcyBiZGEpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflRlc3RBMmRwU291cmNlSGFuZGxlcigpID0gZGVmYXVsdDsKLSAgfTsKLSAgY2xhc3MgVGVzdEEyZHBTaW5rSGFuZGxlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCBidF9zdGF0dXNfdCBDb25uZWN0KFJhd0FkZHJlc3MgYmRhKSA9IDA7Ci0gICAgdmlydHVhbCBidF9zdGF0dXNfdCBEaXNjb25uZWN0KFJhd0FkZHJlc3MgYmRhKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFNldEF1ZGlvRm9jdXNTdGF0ZShpbnQgZm9jdXNfc3RhdGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgU2V0QXVkaW9UcmFja0dhaW4oZmxvYXQgZ2FpbikgPSAwOwotCi0gICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+VGVzdEEyZHBTaW5rSGFuZGxlcigpID0gZGVmYXVsdDsKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3RzIHRoZSBmYWtlIHdpdGggdGhlIGdpdmVuIGhhbmRsZXJzLiBJbXBsZW1lbnRhdGlvbnMgY2FuCi0gIC8vIHByb3ZpZGUgdGhlaXIgb3duIGhhbmRsZXJzIG9yIHNpbXBseSBwYXNzICJudWxscHRyIiBmb3IgdGhlIGRlZmF1bHQKLSAgLy8gYmVoYXZpb3IgaW4gd2hpY2ggQlRfU1RBVFVTX0ZBSUwgd2lsbCBiZSByZXR1cm5lZCBmcm9tIGFsbCBjYWxscy4KLSAgRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlKAotICAgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RBMmRwU291cmNlSGFuZGxlcj4gYTJkcF9zb3VyY2VfaGFuZGxlcik7Ci0gIEZha2VCbHVldG9vdGhBdkludGVyZmFjZSgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0QTJkcFNpbmtIYW5kbGVyPiBhMmRwX3NpbmtfaGFuZGxlcik7Ci0gIH5GYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2UoKTsKLQotICAvLyBUaGUgbWV0aG9kcyBiZWxvdyBjYW4gYmUgdXNlZCB0byBub3RpZnkgb2JzZXJ2ZXJzIHdpdGggY2VydGFpbiBldmVudHMgYW5kCi0gIC8vIGdpdmVuIHBhcmFtZXRlcnMuCi0KLSAgLy8gQTJEUCBjb21tb24gY2FsbGJhY2tzCi0gIHZvaWQgTm90aWZ5Q29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpOwotICB2b2lkIE5vdGlmeUF1ZGlvU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBidGF2X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpOwotICAvLyBBMkRQIHNvdXJjZSBjYWxsYmFja3MKLSAgdm9pZCBOb3RpZnlBdWRpb0NvbmZpZygKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+Ci0gICAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKTsKLSAgYm9vbCBRdWVyeU1hbmRhdG9yeUNvZGVjUHJlZmVycmVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0gIC8vIEEyRFAgc2luayBjYWxsYmFja3MKLSAgdm9pZCBOb3RpZnlBdWRpb0NvbmZpZyhjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQzMl90IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudCk7Ci0KLSAgLy8gQmx1ZXRvb3RoQXZJbnRlcmZhY2Ugb3ZlcnJpZGVzOgotICBib29sIEEyZHBTb3VyY2VFbmFibGUoCi0gICAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjX3ByaW9yaXRpZXMpIG92ZXJyaWRlOwotICB2b2lkIEEyZHBTb3VyY2VEaXNhYmxlKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgQTJkcFNpbmtFbmFibGUoKSBvdmVycmlkZTsKLSAgdm9pZCBBMmRwU2lua0Rpc2FibGUoKSBvdmVycmlkZTsKLSAgdm9pZCBBZGRBMmRwU291cmNlT2JzZXJ2ZXIoQTJkcFNvdXJjZU9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVtb3ZlQTJkcFNvdXJjZU9ic2VydmVyKEEyZHBTb3VyY2VPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlOwotICB2b2lkIEFkZEEyZHBTaW5rT2JzZXJ2ZXIoQTJkcFNpbmtPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlOwotICB2b2lkIFJlbW92ZUEyZHBTaW5rT2JzZXJ2ZXIoQTJkcFNpbmtPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlOwotICBjb25zdCBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdCogR2V0QTJkcFNvdXJjZUhBTEludGVyZmFjZSgpIG92ZXJyaWRlOwotICBjb25zdCBidGF2X3NpbmtfaW50ZXJmYWNlX3QqIEdldEEyZHBTaW5rSEFMSW50ZXJmYWNlKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBidGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PEEyZHBTb3VyY2VPYnNlcnZlcj4gYTJkcF9zb3VyY2Vfb2JzZXJ2ZXJzXzsKLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxBMmRwU2lua09ic2VydmVyPiBhMmRwX3Npbmtfb2JzZXJ2ZXJzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRmFrZUJsdWV0b290aEF2SW50ZXJmYWNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmNjIGIvc2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzc0MjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSB7Ci0KLS8vIFRoZSBnbG9iYWwgdGVzdCBoYW5kbGVyIGluc3RhbmNlcy4gV2UgaGF2ZSB0byBoYXZlIGdsb2JhbHMgc2luY2UgdGhlIEhBTAotLy8gaW50ZXJmYWNlIG1ldGhvZHMgYWxsIGhhdmUgdG8gYmUgZ2xvYmFsIGFuZCB0aGVpciBzaWduYXR1cmVzIGRvbid0IGFsbG93IHVzCi0vLyB0byBwYXNzIGluIHVzZXJfZGF0YS4KLXN0ZDo6c2hhcmVkX3B0cjxCbGVBZHZlcnRpc2VySW50ZXJmYWNlPiBnX2FkdmVydGlzZXJfaGFuZGxlcjsKLXN0ZDo6c2hhcmVkX3B0cjxCbGVTY2FubmVySW50ZXJmYWNlPiBnX3NjYW5uZXJfaGFuZGxlcjsKLXN0ZDo6c2hhcmVkX3B0cjxGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6VGVzdENsaWVudEhhbmRsZXI+IGdfY2xpZW50X2hhbmRsZXI7Ci1zdGQ6OnNoYXJlZF9wdHI8RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlRlc3RTZXJ2ZXJIYW5kbGVyPiBnX3NlcnZlcl9oYW5kbGVyOwotCi1idF9zdGF0dXNfdCBGYWtlUmVnaXN0ZXJDbGllbnQoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVhdHRfc3VwcG9ydCkgewotICBpZiAoZ19jbGllbnRfaGFuZGxlcikKLSAgICByZXR1cm4gZ19jbGllbnRfaGFuZGxlci0+UmVnaXN0ZXJDbGllbnQoYXBwX3V1aWQsIGZhbHNlKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLWJ0X3N0YXR1c190IEZha2VVbnJlZ2lzdGVyQ2xpZW50KGludCBjbGllbnRfaWYpIHsKLSAgaWYgKGdfY2xpZW50X2hhbmRsZXIpIHJldHVybiBnX2NsaWVudF9oYW5kbGVyLT5VbnJlZ2lzdGVyQ2xpZW50KGNsaWVudF9pZik7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotfQotCi1idF9zdGF0dXNfdCBGYWtlQ29ubmVjdChpbnQgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGludCB0cmFuc3BvcnQsIGJvb2wgb3Bwb3J0dW5pc3RpYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaHkpIHsKLSAgaWYgKGdfY2xpZW50X2hhbmRsZXIpCi0gICAgcmV0dXJuIGdfY2xpZW50X2hhbmRsZXItPkNvbm5lY3QoY2xpZW50X2lmLCBiZF9hZGRyLCBpc19kaXJlY3QsIHRyYW5zcG9ydCk7Ci0KLSAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotfQotCi1idF9zdGF0dXNfdCBGYWtlRGlzY29ubmVjdChpbnQgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5faWQpIHsKLSAgaWYgKGdfY2xpZW50X2hhbmRsZXIpCi0gICAgcmV0dXJuIGdfY2xpZW50X2hhbmRsZXItPkRpc2Nvbm5lY3QoY2xpZW50X2lmLCBiZF9hZGRyLCBjb25uX2lkKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLWJ0X3N0YXR1c190IEZha2VSZWdpc3RlclNlcnZlcihjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIGlmIChnX3NlcnZlcl9oYW5kbGVyKQotICAgIHJldHVybiBnX3NlcnZlcl9oYW5kbGVyLT5SZWdpc3RlclNlcnZlcihhcHBfdXVpZCwgZmFsc2UpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotYnRfc3RhdHVzX3QgRmFrZVVucmVnaXN0ZXJTZXJ2ZXIoaW50IHNlcnZlcl9pZikgewotICBpZiAoZ19zZXJ2ZXJfaGFuZGxlcikgcmV0dXJuIGdfc2VydmVyX2hhbmRsZXItPlVucmVnaXN0ZXJTZXJ2ZXIoc2VydmVyX2lmKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLWJ0X3N0YXR1c190IEZha2VBZGRTZXJ2aWNlKGludCBzZXJ2ZXJfaWYsIGNvbnN0IGJ0Z2F0dF9kYl9lbGVtZW50X3QqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VydmljZV9jb3VudCkgewotICBpZiAoZ19zZXJ2ZXJfaGFuZGxlcikKLSAgICByZXR1cm4gZ19zZXJ2ZXJfaGFuZGxlci0+QWRkU2VydmljZSgKLSAgICAgICAgc2VydmVyX2lmLCBzdGQ6OnZlY3RvcihzZXJ2aWNlLCBzZXJ2aWNlICsgc2VydmljZV9jb3VudCkpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotYnRfc3RhdHVzX3QgRmFrZURlbGV0ZVNlcnZpY2UoaW50IHNlcnZlcl9pZiwgaW50IHNydmNfaGFuZGxlKSB7Ci0gIGlmIChnX3NlcnZlcl9oYW5kbGVyKQotICAgIHJldHVybiBnX3NlcnZlcl9oYW5kbGVyLT5EZWxldGVTZXJ2aWNlKHNlcnZlcl9pZiwgc3J2Y19oYW5kbGUpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotYnRfc3RhdHVzX3QgRmFrZVNlbmRJbmRpY2F0aW9uKGludCBzZXJ2ZXJfaWYsIGludCBhdHRyaWJ1dGVfaGFuZGxlLCBpbnQgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29uZmlybSwgY29uc3QgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBpZiAoZ19zZXJ2ZXJfaGFuZGxlcikKLSAgICByZXR1cm4gZ19zZXJ2ZXJfaGFuZGxlci0+U2VuZEluZGljYXRpb24oc2VydmVyX2lmLCBhdHRyaWJ1dGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX2lkLCBjb25maXJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcih2YWx1ZSwgdmFsdWUgKyBsZW5ndGgpKTsKLQotICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLWJ0X3N0YXR1c190IEZha2VTZW5kUmVzcG9uc2UoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRnYXR0X3Jlc3BvbnNlX3QmIHJlc3BvbnNlKSB7Ci0gIGlmIChnX3NlcnZlcl9oYW5kbGVyKQotICAgIHJldHVybiBnX3NlcnZlcl9oYW5kbGVyLT5TZW5kUmVzcG9uc2UoY29ubl9pZCwgdHJhbnNfaWQsIHN0YXR1cywgcmVzcG9uc2UpOwotCi0gIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCBmYWtlX2J0Z2F0dGNfaWZhY2UgPSB7Ci0gICAgRmFrZVJlZ2lzdGVyQ2xpZW50LAotICAgIEZha2VVbnJlZ2lzdGVyQ2xpZW50LAotICAgIEZha2VDb25uZWN0LAotICAgIEZha2VEaXNjb25uZWN0LAotICAgIG51bGxwdHIsICAvLyByZWZyZXNoCi0gICAgbnVsbHB0ciwgIC8vIHNlYXJjaF9zZXJ2aWNlCi0gICAgbnVsbHB0ciwgIC8vIGRpc2NvdmVyX3NlcnZpY2VfYnlfdXVpZAotICAgIG51bGxwdHIsICAvLyByZWFkX2NoYXJhY3RlcmlzdGljCi0gICAgbnVsbHB0ciwgIC8vIHJlYWRfdXNpbmdfY2hhcmFjdGVyaXN0aWNfdXVpZAotICAgIG51bGxwdHIsICAvLyB3cml0ZV9jaGFyYWN0ZXJpc3RpYwotICAgIG51bGxwdHIsICAvLyByZWFkX2Rlc2NyaXB0b3IKLSAgICBudWxscHRyLCAgLy8gd3JpdGVfZGVzY3JpcHRvcgotICAgIG51bGxwdHIsICAvLyBleGVjdXRlX3dyaXRlCi0gICAgbnVsbHB0ciwgIC8vIHJlZ2lzdGVyX2Zvcl9ub3RpZmljYXRpb24KLSAgICBudWxscHRyLCAgLy8gZGVyZWdpc3Rlcl9mb3Jfbm90aWZpY2F0aW9uCi0gICAgbnVsbHB0ciwgIC8vIHJlYWRfcmVtb3RlX3Jzc2kKLSAgICBudWxscHRyLCAgLy8gZ2V0X2RldmljZV90eXBlCi0gICAgbnVsbHB0ciwgIC8vIGNvbmZpZ3VyZV9tdHUKLSAgICBudWxscHRyLCAgLy8gY29ubl9wYXJhbWV0ZXJfdXBkYXRlCi0gICAgbnVsbHB0ciwgIC8vIHNldF9waHkKLSAgICBudWxscHRyLCAgLy8gcmVhZF9waHkKLSAgICBudWxscHRyLCAgLy8gdGVzdF9jb21tYW5kCi0gICAgbnVsbHB0ciwgIC8vIGdldF9nYXR0X2RiCi19OwotCi1idGdhdHRfc2VydmVyX2ludGVyZmFjZV90IGZha2VfYnRnYXR0c19pZmFjZSA9IHsKLSAgICBGYWtlUmVnaXN0ZXJTZXJ2ZXIsCi0gICAgRmFrZVVucmVnaXN0ZXJTZXJ2ZXIsCi0gICAgbnVsbHB0ciwgIC8vIGNvbm5lY3QKLSAgICBudWxscHRyLCAgLy8gZGlzY29ubmVjdAotICAgIEZha2VBZGRTZXJ2aWNlLAotICAgIG51bGxwdHIsICAvLyBzdG9wX3NlcnZpY2UKLSAgICBGYWtlRGVsZXRlU2VydmljZSwKLSAgICBGYWtlU2VuZEluZGljYXRpb24sCi0gICAgRmFrZVNlbmRSZXNwb25zZSwKLSAgICBudWxscHRyLCAgLy8gc2V0X3BoeQotICAgIG51bGxwdHIsICAvLyByZWFkX3BoeQotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLUZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZSgKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QmxlQWR2ZXJ0aXNlckludGVyZmFjZT4gYWR2ZXJ0aXNlcl9oYW5kbGVyLAotICAgIHN0ZDo6c2hhcmVkX3B0cjxCbGVTY2FubmVySW50ZXJmYWNlPiBzY2FubmVyX2hhbmRsZXIsCi0gICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRIYW5kbGVyPiBjbGllbnRfaGFuZGxlciwKLSAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFNlcnZlckhhbmRsZXI+IHNlcnZlcl9oYW5kbGVyKQotICAgIDogY2xpZW50X2hhbmRsZXJfKGNsaWVudF9oYW5kbGVyKSB7Ci0gIENIRUNLKCFnX2FkdmVydGlzZXJfaGFuZGxlcik7Ci0gIENIRUNLKCFnX3NjYW5uZXJfaGFuZGxlcik7Ci0gIENIRUNLKCFnX2NsaWVudF9oYW5kbGVyKTsKLSAgQ0hFQ0soIWdfc2VydmVyX2hhbmRsZXIpOwotCi0gIC8vIFdlIGFsbG93IHBhc3NpbmcgTlVMTC4gSW4gdGhpcyBjYXNlIGFsbCBjYWxscyB3ZSBmYWlsIGJ5IGRlZmF1bHQuCi0gIGlmIChhZHZlcnRpc2VyX2hhbmRsZXIpIGdfYWR2ZXJ0aXNlcl9oYW5kbGVyID0gYWR2ZXJ0aXNlcl9oYW5kbGVyOwotCi0gIGlmIChzY2FubmVyX2hhbmRsZXIpIGdfc2Nhbm5lcl9oYW5kbGVyID0gc2Nhbm5lcl9oYW5kbGVyOwotCi0gIGlmIChjbGllbnRfaGFuZGxlcikgZ19jbGllbnRfaGFuZGxlciA9IGNsaWVudF9oYW5kbGVyOwotCi0gIGlmIChzZXJ2ZXJfaGFuZGxlcikgZ19zZXJ2ZXJfaGFuZGxlciA9IHNlcnZlcl9oYW5kbGVyOwotfQotCi1GYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6fkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlKCkgewotICBpZiAoZ19hZHZlcnRpc2VyX2hhbmRsZXIpIGdfYWR2ZXJ0aXNlcl9oYW5kbGVyID0gbnVsbHB0cjsKLQotICBpZiAoZ19zY2FubmVyX2hhbmRsZXIpIGdfc2Nhbm5lcl9oYW5kbGVyID0gbnVsbHB0cjsKLQotICBpZiAoZ19jbGllbnRfaGFuZGxlcikgZ19jbGllbnRfaGFuZGxlciA9IG51bGxwdHI7Ci0KLSAgaWYgKGdfc2VydmVyX2hhbmRsZXIpIGdfc2VydmVyX2hhbmRsZXIgPSBudWxscHRyOwotfQotCi0vLyBUaGUgbWV0aG9kcyBiZWxvdyBjYW4gYmUgdXNlZCB0byBub3RpZnkgb2JzZXJ2ZXJzIHdpdGggY2VydGFpbiBldmVudHMgYW5kCi0vLyBnaXZlbiBwYXJhbWV0ZXJzLgotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Tm90aWZ5U2NhblJlc3VsdENhbGxiYWNrKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IHJzc2ksIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzY2FubmVyX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5TY2FuUmVzdWx0Q2FsbGJhY2sodGhpcywgYmRhLCByc3NpLCBhZHZfZGF0YSk7Ci0gIH0KLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Tm90aWZ5UmVnaXN0ZXJDbGllbnRDYWxsYmFjaygKLSAgICBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lmLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBjbGllbnRfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLlJlZ2lzdGVyQ2xpZW50Q2FsbGJhY2sodGhpcywgc3RhdHVzLCBjbGllbnRfaWYsIGFwcF91dWlkKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpOb3RpZnlDb25uZWN0Q2FsbGJhY2soaW50IGNvbm5faWQsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6IGNsaWVudF9vYnNlcnZlcnNfKSB7Ci0gICAgb2JzZXJ2ZXIuQ29ubmVjdENhbGxiYWNrKHRoaXMsIGNvbm5faWQsIHN0YXR1cywgY2xpZW50X2lmLCBiZGEpOwotICB9Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6Ok5vdGlmeURpc2Nvbm5lY3RDYWxsYmFjaygKLSAgICBpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBjbGllbnRfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLkRpc2Nvbm5lY3RDYWxsYmFjayh0aGlzLCBjb25uX2lkLCBzdGF0dXMsIGNsaWVudF9pZiwgYmRhKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpOb3RpZnlSZWdpc3RlclNlcnZlckNhbGxiYWNrKAotICAgIGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsIGNvbnN0IFV1aWQmIGFwcF91dWlkKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzZXJ2ZXJfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLlJlZ2lzdGVyU2VydmVyQ2FsbGJhY2sodGhpcywgc3RhdHVzLCBzZXJ2ZXJfaWYsIGFwcF91dWlkKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpOb3RpZnlTZXJ2ZXJDb25uZWN0aW9uQ2FsbGJhY2soCi0gICAgaW50IGNvbm5faWQsIGludCBzZXJ2ZXJfaWYsIGludCBjb25uZWN0ZWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogc2VydmVyX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5Db25uZWN0aW9uQ2FsbGJhY2sodGhpcywgY29ubl9pZCwgc2VydmVyX2lmLCBjb25uZWN0ZWQsIGJkYSk7Ci0gIH0KLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Tm90aWZ5U2VydmljZUFkZGVkQ2FsbGJhY2soCi0gICAgaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZiwgc3RkOjp2ZWN0b3I8YnRnYXR0X2RiX2VsZW1lbnRfdD4gc2VydmljZSkgewotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogc2VydmVyX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5TZXJ2aWNlQWRkZWRDYWxsYmFjayh0aGlzLCBzdGF0dXMsIHNlcnZlcl9pZiwgc2VydmljZSk7Ci0gIH0KLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Tm90aWZ5UmVxdWVzdFJlYWRDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgIGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IGF0dHJfaGFuZGxlLAotICAgIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZykgewotICBmb3IgKGF1dG8mIG9ic2VydmVyIDogc2VydmVyX29ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5SZXF1ZXN0UmVhZENoYXJhY3RlcmlzdGljQ2FsbGJhY2sodGhpcywgY29ubl9pZCwgdHJhbnNfaWQsIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9oYW5kbGUsIG9mZnNldCwgaXNfbG9uZyk7Ci0gIH0KLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Tm90aWZ5UmVxdWVzdFJlYWREZXNjcmlwdG9yQ2FsbGJhY2soCi0gICAgaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgYXR0cl9oYW5kbGUsCi0gICAgaW50IG9mZnNldCwgYm9vbCBpc19sb25nKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzZXJ2ZXJfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLlJlcXVlc3RSZWFkRGVzY3JpcHRvckNhbGxiYWNrKHRoaXMsIGNvbm5faWQsIHRyYW5zX2lkLCBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9oYW5kbGUsIG9mZnNldCwgaXNfbG9uZyk7Ci0gIH0KLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Tm90aWZ5UmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBhdHRyX2hhbmRsZSwKLSAgICBpbnQgb2Zmc2V0LCBib29sIG5lZWRfcnNwLCBib29sIGlzX3ByZXAsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzZXJ2ZXJfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLlJlcXVlc3RXcml0ZUNoYXJhY3RlcmlzdGljQ2FsbGJhY2sodGhpcywgY29ubl9pZCwgdHJhbnNfaWQsIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfaGFuZGxlLCBvZmZzZXQsIG5lZWRfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcHJlcCwgdmFsdWUpOwotICB9Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6Ok5vdGlmeVJlcXVlc3RXcml0ZURlc2NyaXB0b3JDYWxsYmFjaygKLSAgICBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBhdHRyX2hhbmRsZSwKLSAgICBpbnQgb2Zmc2V0LCBib29sIG5lZWRfcnNwLCBib29sIGlzX3ByZXAsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzZXJ2ZXJfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLlJlcXVlc3RXcml0ZURlc2NyaXB0b3JDYWxsYmFjayh0aGlzLCBjb25uX2lkLCB0cmFuc19pZCwgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX2hhbmRsZSwgb2Zmc2V0LCBuZWVkX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcHJlcCwgdmFsdWUpOwotICB9Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6Ok5vdGlmeVJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjaygKLSAgICBpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCBleGVjX3dyaXRlKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzZXJ2ZXJfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLlJlcXVlc3RFeGVjV3JpdGVDYWxsYmFjayh0aGlzLCBjb25uX2lkLCB0cmFuc19pZCwgYmRhLCBleGVjX3dyaXRlKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpOb3RpZnlJbmRpY2F0aW9uU2VudENhbGxiYWNrKGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBzZXJ2ZXJfb2JzZXJ2ZXJzXykgewotICAgIG9ic2VydmVyLkluZGljYXRpb25TZW50Q2FsbGJhY2sodGhpcywgY29ubl9pZCwgc3RhdHVzKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpBZGRTY2FubmVyT2JzZXJ2ZXIoU2Nhbm5lck9ic2VydmVyKiBvYnNlcnZlcikgewotICBDSEVDSyhvYnNlcnZlcik7Ci0gIHNjYW5uZXJfb2JzZXJ2ZXJzXy5BZGRPYnNlcnZlcihvYnNlcnZlcik7Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlJlbW92ZVNjYW5uZXJPYnNlcnZlcigKLSAgICBTY2FubmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSB7Ci0gIENIRUNLKG9ic2VydmVyKTsKLSAgc2Nhbm5lcl9vYnNlcnZlcnNfLlJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTsKLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6QWRkQ2xpZW50T2JzZXJ2ZXIoQ2xpZW50T2JzZXJ2ZXIqIG9ic2VydmVyKSB7Ci0gIENIRUNLKG9ic2VydmVyKTsKLSAgY2xpZW50X29ic2VydmVyc18uQWRkT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotfQotCi12b2lkIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpSZW1vdmVDbGllbnRPYnNlcnZlcigKLSAgICBDbGllbnRPYnNlcnZlciogb2JzZXJ2ZXIpIHsKLSAgQ0hFQ0sob2JzZXJ2ZXIpOwotICBjbGllbnRfb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkFkZFNlcnZlck9ic2VydmVyKFNlcnZlck9ic2VydmVyKiBvYnNlcnZlcikgewotICBDSEVDSyhvYnNlcnZlcik7Ci0gIHNlcnZlcl9vYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6UmVtb3ZlU2VydmVyT2JzZXJ2ZXIoCi0gICAgU2VydmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSB7Ci0gIENIRUNLKG9ic2VydmVyKTsKLSAgc2VydmVyX29ic2VydmVyc18uUmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotfQotCi1CbGVBZHZlcnRpc2VySW50ZXJmYWNlKiBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0QWR2ZXJ0aXNlckhBTEludGVyZmFjZSgpCi0gICAgY29uc3QgewotICByZXR1cm4gZ19hZHZlcnRpc2VyX2hhbmRsZXIuZ2V0KCk7Ci19Ci0KLUJsZVNjYW5uZXJJbnRlcmZhY2UqIEZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXRTY2FubmVySEFMSW50ZXJmYWNlKCkKLSAgICBjb25zdCB7Ci0gIHJldHVybiBnX3NjYW5uZXJfaGFuZGxlci5nZXQoKTsKLX0KLQotY29uc3QgYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCoKLUZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXRDbGllbnRIQUxJbnRlcmZhY2UoKSBjb25zdCB7Ci0gIHJldHVybiAmZmFrZV9idGdhdHRjX2lmYWNlOwotfQotCi1jb25zdCBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90KgotRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldFNlcnZlckhBTEludGVyZmFjZSgpIGNvbnN0IHsKLSAgcmV0dXJuICZmYWtlX2J0Z2F0dHNfaWZhY2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmggYi9zZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU5MTdmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxiYXNlL29ic2VydmVyX2xpc3QuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImFic3RyYWN0X29ic2VydmVyX2xpc3QuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotCi1jbGFzcyBGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZSA6IHB1YmxpYyBCbHVldG9vdGhHYXR0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIEhhbmRsZXMgSEFMIEJsdWV0b290aCBHQVRUIGNsaWVudCBBUEkgY2FsbHMgZm9yIHRlc3RpbmcuIFRlc3QgY29kZSBjYW4KLSAgLy8gcHJvdmlkZSBhIGZha2Ugb3IgbW9jayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGFuZCBhbGwgY2FsbHMgd2lsbCBiZSByb3V0ZWQKLSAgLy8gdG8gaXQuCi0gIGNsYXNzIFRlc3RDbGllbnRIYW5kbGVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50SGFuZGxlcigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgYnRfc3RhdHVzX3QgUmVnaXN0ZXJDbGllbnQoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZWF0dF9zdXBwb3J0KSA9IDA7Ci0gICAgdmlydHVhbCBidF9zdGF0dXNfdCBVbnJlZ2lzdGVyQ2xpZW50KGludCBjbGllbnRfaWYpID0gMDsKLQotICAgIHZpcnR1YWwgYnRfc3RhdHVzX3QgQ29ubmVjdChpbnQgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgaW50IHRyYW5zcG9ydCkgPSAwOwotICAgIHZpcnR1YWwgYnRfc3RhdHVzX3QgRGlzY29ubmVjdChpbnQgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCkgPSAwOwotICB9OwotCi0gIC8vIEhhbmRsZXMgSEFMIEJsdWV0b290aCBHQVRUIHNlcnZlciBBUEkgY2FsbHMgZm9yIHRlc3RpbmcuIFRlc3QgY29kZSBjYW4KLSAgLy8gcHJvdmlkZSBhIGZha2Ugb3IgbW9jayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGFuZCBhbGwgY2FsbHMgd2lsbCBiZSByb3V0ZWQKLSAgLy8gdG8gaXQuCi0gIGNsYXNzIFRlc3RTZXJ2ZXJIYW5kbGVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5UZXN0U2VydmVySGFuZGxlcigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgYnRfc3RhdHVzX3QgUmVnaXN0ZXJTZXJ2ZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZWF0dF9zdXBwb3J0KSA9IDA7Ci0gICAgdmlydHVhbCBidF9zdGF0dXNfdCBVbnJlZ2lzdGVyU2VydmVyKGludCBzZXJ2ZXJfaWYpID0gMDsKLSAgICB2aXJ0dWFsIGJ0X3N0YXR1c190IEFkZFNlcnZpY2UoCi0gICAgICAgIGludCBzZXJ2ZXJfaWYsIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2UpID0gMDsKLSAgICB2aXJ0dWFsIGJ0X3N0YXR1c190IERlbGV0ZVNlcnZpY2UoaW50IHNlcnZlcl9pZiwgaW50IHNydmNfaGFuZGxlKSA9IDA7Ci0gICAgdmlydHVhbCBidF9zdGF0dXNfdCBTZW5kSW5kaWNhdGlvbihpbnQgc2VydmVyX2lmLCBpbnQgYXR0cmlidXRlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgY29uZmlybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKSA9IDA7Ci0gICAgdmlydHVhbCBidF9zdGF0dXNfdCBTZW5kUmVzcG9uc2UoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidGdhdHRfcmVzcG9uc2VfdCYgcmVzcG9uc2UpID0gMDsKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3RzIHRoZSBmYWtlIHdpdGggdGhlIGdpdmVuIGhhbmRsZXJzLiBJbXBsZW1lbnRhdGlvbnMgY2FuCi0gIC8vIHByb3ZpZGUgdGhlaXIgb3duIGhhbmRsZXJzIG9yIHNpbXBseSBwYXNzICJudWxscHRyIiBmb3IgdGhlIGRlZmF1bHQKLSAgLy8gYmVoYXZpb3IgaW4gd2hpY2ggQlRfU1RBVFVTX0ZBSUwgd2lsbCBiZSByZXR1cm5lZCBmcm9tIGFsbCBjYWxscy4KLSAgRmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2UoCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QmxlQWR2ZXJ0aXNlckludGVyZmFjZT4gYWR2ZXJ0aXNlcl9oYW5kbGVyLAotICAgICAgc3RkOjpzaGFyZWRfcHRyPEJsZVNjYW5uZXJJbnRlcmZhY2U+IHNjYW5uZXJfaGFuZGxlciwKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50SGFuZGxlcj4gY2xpZW50X2hhbmRsZXIsCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFNlcnZlckhhbmRsZXI+IHNlcnZlcl9oYW5kbGVyKTsKLSAgfkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlKCk7Ci0KLSAgLy8gVGhlIG1ldGhvZHMgYmVsb3cgY2FuIGJlIHVzZWQgdG8gbm90aWZ5IG9ic2VydmVycyB3aXRoIGNlcnRhaW4gZXZlbnRzIGFuZAotICAvLyBnaXZlbiBwYXJhbWV0ZXJzLgotCi0gIHZvaWQgTm90aWZ5UmVnaXN0ZXJTY2FubmVyQ2FsbGJhY2soaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKTsKLSAgdm9pZCBOb3RpZnlTY2FuUmVzdWx0Q2FsbGJhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgcnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGEpOwotCi0gIC8vIENsaWVudCBjYWxsYmFja3M6Ci0gIHZvaWQgTm90aWZ5UmVnaXN0ZXJDbGllbnRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCk7Ci0gIHZvaWQgTm90aWZ5Q29ubmVjdENhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotICB2b2lkIE5vdGlmeURpc2Nvbm5lY3RDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLQotICAvLyBTZXJ2ZXIgY2FsbGJhY2tzOgotICB2b2lkIE5vdGlmeVJlZ2lzdGVyU2VydmVyQ2FsbGJhY2soaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgYXBwX3V1aWQpOwotICB2b2lkIE5vdGlmeVNlcnZlckNvbm5lY3Rpb25DYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHNlcnZlcl9pZiwgaW50IGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLSAgdm9pZCBOb3RpZnlTZXJ2aWNlQWRkZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNydmMpOwotICB2b2lkIE5vdGlmeUNoYXJhY3RlcmlzdGljQWRkZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcnZjX2hhbmRsZSwgaW50IGNoYXJfaGFuZGxlKTsKLSAgdm9pZCBOb3RpZnlEZXNjcmlwdG9yQWRkZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3J2Y19oYW5kbGUsIGludCBkZXNjX2hhbmRsZSk7Ci0gIHZvaWQgTm90aWZ5U2VydmljZVN0YXJ0ZWRDYWxsYmFjayhpbnQgc3RhdHVzLCBpbnQgc2VydmVyX2lmLCBpbnQgc3J2Y19oYW5kbGUpOwotICB2b2lkIE5vdGlmeVJlcXVlc3RSZWFkQ2hhcmFjdGVyaXN0aWNDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdHRyX2hhbmRsZSwgaW50IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb25nKTsKLSAgdm9pZCBOb3RpZnlSZXF1ZXN0UmVhZERlc2NyaXB0b3JDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cl9oYW5kbGUsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb25nKTsKLSAgdm9pZCBOb3RpZnlSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cl9oYW5kbGUsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRfcnNwLCBib29sIGlzX3ByZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSk7Ci0gIHZvaWQgTm90aWZ5UmVxdWVzdFdyaXRlRGVzY3JpcHRvckNhbGxiYWNrKGludCBjb25uX2lkLCBpbnQgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJfaGFuZGxlLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRfcnNwLCBib29sIGlzX3ByZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKTsKLSAgdm9pZCBOb3RpZnlSZXF1ZXN0RXhlY1dyaXRlQ2FsbGJhY2soaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQgZXhlY193cml0ZSk7Ci0gIHZvaWQgTm90aWZ5SW5kaWNhdGlvblNlbnRDYWxsYmFjayhpbnQgY29ubl9pZCwgaW50IHN0YXR1cyk7Ci0KLSAgLy8gQmx1ZXRvb3RoR2F0dEludGVyZmFjZSBvdmVycmlkZXM6Ci0gIHZvaWQgQWRkU2Nhbm5lck9ic2VydmVyKFNjYW5uZXJPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlOwotICB2b2lkIFJlbW92ZVNjYW5uZXJPYnNlcnZlcihTY2FubmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZTsKLSAgdm9pZCBBZGRDbGllbnRPYnNlcnZlcihDbGllbnRPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlOwotICB2b2lkIFJlbW92ZUNsaWVudE9ic2VydmVyKENsaWVudE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGU7Ci0gIHZvaWQgQWRkU2VydmVyT2JzZXJ2ZXIoU2VydmVyT2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZTsKLSAgdm9pZCBSZW1vdmVTZXJ2ZXJPYnNlcnZlcihTZXJ2ZXJPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlOwotICBCbGVBZHZlcnRpc2VySW50ZXJmYWNlKiBHZXRBZHZlcnRpc2VySEFMSW50ZXJmYWNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIEJsZVNjYW5uZXJJbnRlcmZhY2UqIEdldFNjYW5uZXJIQUxJbnRlcmZhY2UoKSBjb25zdCBvdmVycmlkZTsKLSAgY29uc3QgYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCogR2V0Q2xpZW50SEFMSW50ZXJmYWNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QqIEdldFNlcnZlckhBTEludGVyZmFjZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxTY2FubmVyT2JzZXJ2ZXI+IHNjYW5uZXJfb2JzZXJ2ZXJzXzsKLSAgYnRiYXNlOjpBYnN0cmFjdE9ic2VydmVyTGlzdDxDbGllbnRPYnNlcnZlcj4gY2xpZW50X29ic2VydmVyc187Ci0gIGJ0YmFzZTo6QWJzdHJhY3RPYnNlcnZlckxpc3Q8U2VydmVyT2JzZXJ2ZXI+IHNlcnZlcl9vYnNlcnZlcnNfOwotICBzdGQ6OnNoYXJlZF9wdHI8QmxlU2Nhbm5lckludGVyZmFjZT4gc2Nhbm5lcl9oYW5kbGVyXzsKLSAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRIYW5kbGVyPiBjbGllbnRfaGFuZGxlcl87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxUZXN0U2VydmVySGFuZGxlcj4gc2VydmVyX2hhbmRsZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9pbnRlcmZhY2UuY2MgYi9zZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMmMzODAuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoYWwgewotCi1uYW1lc3BhY2UgewotCi1GYWtlQmx1ZXRvb3RoSW50ZXJmYWNlOjpNYW5hZ2VyIGdfaGFsX21hbmFnZXI7Ci0KLWludCBGYWtlSEFMRW5hYmxlKCkgewotICByZXR1cm4gZ19oYWxfbWFuYWdlci5lbmFibGVfc3VjY2VlZCA/IEJUX1NUQVRVU19TVUNDRVNTIDogQlRfU1RBVFVTX0ZBSUw7Ci19Ci0KLWludCBGYWtlSEFMRGlzYWJsZSgpIHsKLSAgcmV0dXJuIGdfaGFsX21hbmFnZXIuZGlzYWJsZV9zdWNjZWVkID8gQlRfU1RBVFVTX1NVQ0NFU1MgOiBCVF9TVEFUVVNfRkFJTDsKLX0KLQotaW50IEZha2VIQUxHZXRBZGFwdGVyUHJvcGVydGllcygpIHsgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOyB9Ci0KLWludCBGYWtlSEFMU2V0QWRhcHRlclByb3BlcnR5KGNvbnN0IGJ0X3Byb3BlcnR5X3QqIC8qIHByb3BlcnR5ICovKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgcmV0dXJuIChnX2hhbF9tYW5hZ2VyLnNldF9wcm9wZXJ0eV9zdWNjZWVkID8gQlRfU1RBVFVTX1NVQ0NFU1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQlRfU1RBVFVTX0ZBSUwpOwotfQotCi1idF9pbnRlcmZhY2VfdCBmYWtlX2J0X2lmYWNlID0gewotICAgIHNpemVvZihidF9pbnRlcmZhY2VfdCksCi0gICAgbnVsbHB0ciwgLyogaW5pdCAqLwotICAgIEZha2VIQUxFbmFibGUsCi0gICAgRmFrZUhBTERpc2FibGUsCi0gICAgbnVsbHB0ciwgLyogY2xlYW51cCAqLwotICAgIEZha2VIQUxHZXRBZGFwdGVyUHJvcGVydGllcywKLSAgICBudWxscHRyLCAvKiBnZXRfYWRhcHRlcl9wcm9wZXJ0eSAqLwotICAgIEZha2VIQUxTZXRBZGFwdGVyUHJvcGVydHksCi0gICAgbnVsbHB0ciwgLyogZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyAqLwotICAgIG51bGxwdHIsIC8qIGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5ICovCi0gICAgbnVsbHB0ciwgLyogc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkgKi8KLSAgICBudWxscHRyLCAvKiBnZXRfcmVtb3RlX3NlcnZpY2VfcmVjb3JkICovCi0gICAgbnVsbHB0ciwgLyogZ2V0X3JlbW90ZV9zZXJ2aWNlcyAqLwotICAgIG51bGxwdHIsIC8qIHN0YXJ0X2Rpc2NvdmVyeSAqLwotICAgIG51bGxwdHIsIC8qIGNhbmNlbF9kaXNjb3ZlcnkgKi8KLSAgICBudWxscHRyLCAvKiBjcmVhdGVfYm9uZCAqLwotICAgIG51bGxwdHIsIC8qIGNyZWF0ZV9ib25kX291dF9vZl9iYW5kICovCi0gICAgbnVsbHB0ciwgLyogcmVtb3ZlX2JvbmQgKi8KLSAgICBudWxscHRyLCAvKiBjYW5jZWxfYm9uZCAqLwotICAgIG51bGxwdHIsIC8qIGdldF9jb25uZWN0aW9uX3N0YXRlICovCi0gICAgbnVsbHB0ciwgLyogcGluX3JlcGx5ICovCi0gICAgbnVsbHB0ciwgLyogc3NwX3JlcGx5ICovCi0gICAgbnVsbHB0ciwgLyogZ2V0X3Byb2ZpbGVfaW50ZXJmYWNlICovCi0gICAgbnVsbHB0ciwgLyogZHV0X21vZGVfY29uZmlndXJlICovCi0gICAgbnVsbHB0ciwgLyogZHV0X21vcmVfc2VuZCAqLwotICAgIG51bGxwdHIsIC8qIGxlX3Rlc3RfbW9kZSAqLwotICAgIG51bGxwdHIsIC8qIHNldF9vc19jYWxsb3V0cyAqLwotICAgIG51bGxwdHIsIC8qIHJlYWRfZW5lcmd5X2luZm8gKi8KLSAgICBudWxscHRyLCAvKiBkdW1wICovCi0gICAgbnVsbHB0ciwgLyogZHVtcE1ldHJpY3MgKi8KLSAgICBudWxscHRyLCAvKiBjb25maWcgY2xlYXIgKi8KLSAgICBudWxscHRyLCAvKiBpbnRlcm9wX2RhdGFiYXNlX2NsZWFyICovCi0gICAgbnVsbHB0ciwgLyogaW50ZXJvcF9kYXRhYmFzZV9hZGQgKi8KLSAgICBudWxscHRyLCAvKiBnZXRfYXZyY3Bfc2VydmljZSAqLwotICAgIG51bGxwdHIsIC8qIG9iZnVzY2F0ZV9hZGRyZXNzICovCi0gICAgbnVsbHB0ciwgLyogZ2V0X21ldHJpY19pZCAqLwotICAgIG51bGxwdHIsIC8qIHNldF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplICovCi0gICAgbnVsbHB0ciwgLyogZ2VuZXJhdGVfbG9jYWxfb29iX2RhdGEgKi8KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUZha2VCbHVldG9vdGhJbnRlcmZhY2U6Ok1hbmFnZXIqIEZha2VCbHVldG9vdGhJbnRlcmZhY2U6OkdldE1hbmFnZXIoKSB7Ci0gIHJldHVybiAmZ19oYWxfbWFuYWdlcjsKLX0KLQotRmFrZUJsdWV0b290aEludGVyZmFjZTo6TWFuYWdlcjo6TWFuYWdlcigpCi0gICAgOiBlbmFibGVfc3VjY2VlZChmYWxzZSksCi0gICAgICBkaXNhYmxlX3N1Y2NlZWQoZmFsc2UpLAotICAgICAgc2V0X3Byb3BlcnR5X3N1Y2NlZWQoZmFsc2UpIHt9Ci0KLXZvaWQgRmFrZUJsdWV0b290aEludGVyZmFjZTo6Tm90aWZ5QWRhcHRlclN0YXRlQ2hhbmdlZChidF9zdGF0ZV90IHN0YXRlKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBvYnNlcnZlcnNfKSB7Ci0gICAgb2JzZXJ2ZXIuQWRhcHRlclN0YXRlQ2hhbmdlZENhbGxiYWNrKHN0YXRlKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhJbnRlcmZhY2U6Ok5vdGlmeUFkYXB0ZXJQcm9wZXJ0aWVzQ2hhbmdlZCgKLSAgICBpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgZm9yIChhdXRvJiBvYnNlcnZlciA6IG9ic2VydmVyc18pIHsKLSAgICBvYnNlcnZlci5BZGFwdGVyUHJvcGVydGllc0NhbGxiYWNrKEJUX1NUQVRVU19TVUNDRVNTLCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOwotICB9Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEludGVyZmFjZTo6Tm90aWZ5QWRhcHRlck5hbWVQcm9wZXJ0eUNoYW5nZWQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgYnRfYmRuYW1lX3QgaGFsX25hbWU7Ci0gIHN0cm5jcHkocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oaGFsX25hbWUubmFtZSksIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICBzdGQ6Om1pbihzaXplb2YoaGFsX25hbWUpIC0gMSwgbmFtZS5sZW5ndGgoKSkpOwotICByZWludGVycHJldF9jYXN0PGNoYXIqPihoYWxfbmFtZS5uYW1lKVtuYW1lLmxlbmd0aCgpXSA9ICdcMCc7Ci0KLSAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0eTsKLSAgcHJvcGVydHkubGVuID0gc2l6ZW9mKGhhbF9uYW1lKTsKLSAgcHJvcGVydHkudmFsID0gJmhhbF9uYW1lOwotICBwcm9wZXJ0eS50eXBlID0gQlRfUFJPUEVSVFlfQkROQU1FOwotCi0gIE5vdGlmeUFkYXB0ZXJQcm9wZXJ0aWVzQ2hhbmdlZCgxLCAmcHJvcGVydHkpOwotfQotCi12b2lkIEZha2VCbHVldG9vdGhJbnRlcmZhY2U6Ok5vdGlmeUFkYXB0ZXJBZGRyZXNzUHJvcGVydHlDaGFuZ2VkKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MpIHsKLSAgYnRfcHJvcGVydHlfdCBwcm9wZXJ0eTsKLSAgcHJvcGVydHkubGVuID0gUmF3QWRkcmVzczo6a0xlbmd0aDsKLSAgcHJvcGVydHkudmFsID0gKHZvaWQqKWFkZHJlc3MtPmFkZHJlc3M7Ci0gIHByb3BlcnR5LnR5cGUgPSBCVF9QUk9QRVJUWV9CREFERFI7Ci0KLSAgTm90aWZ5QWRhcHRlclByb3BlcnRpZXNDaGFuZ2VkKDEsICZwcm9wZXJ0eSk7Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEludGVyZmFjZTo6Tm90aWZ5QWRhcHRlckxvY2FsTGVGZWF0dXJlc1Byb3BlcnR5Q2hhbmdlZCgKLSAgICBjb25zdCBidF9sb2NhbF9sZV9mZWF0dXJlc190KiBmZWF0dXJlcykgewotICBidF9wcm9wZXJ0eV90IHByb3BlcnR5OwotICBwcm9wZXJ0eS5sZW4gPSBzaXplb2YoKmZlYXR1cmVzKTsKLSAgcHJvcGVydHkudmFsID0gKHZvaWQqKWZlYXR1cmVzOwotICBwcm9wZXJ0eS50eXBlID0gQlRfUFJPUEVSVFlfTE9DQUxfTEVfRkVBVFVSRVM7Ci0KLSAgTm90aWZ5QWRhcHRlclByb3BlcnRpZXNDaGFuZ2VkKDEsICZwcm9wZXJ0eSk7Ci19Ci0KLXZvaWQgRmFrZUJsdWV0b290aEludGVyZmFjZTo6Tm90aWZ5QWNsU3RhdGVDaGFuZ2VkQ2FsbGJhY2soCi0gICAgYnRfc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhZGRyLCBidF9hY2xfc3RhdGVfdCBzdGF0ZSwKLSAgICBpbnQgdHJhbnNwb3J0X2xpbmtfdHlwZSwgYnRfaGNpX2Vycm9yX2NvZGVfdCBoY2lfcmVhc29uKSB7Ci0gIGZvciAoYXV0byYgb2JzZXJ2ZXIgOiBvYnNlcnZlcnNfKSB7Ci0gICAgb2JzZXJ2ZXIuQWNsU3RhdGVDaGFuZ2VkQ2FsbGJhY2soc3RhdHVzLCByZW1vdGVfYmRhZGRyLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfbGlua190eXBlLCBoY2lfcmVhc29uKTsKLSAgfQotfQotCi12b2lkIEZha2VCbHVldG9vdGhJbnRlcmZhY2U6OkFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcikgewotICBvYnNlcnZlcnNfLkFkZE9ic2VydmVyKG9ic2VydmVyKTsKLX0KLQotdm9pZCBGYWtlQmx1ZXRvb3RoSW50ZXJmYWNlOjpSZW1vdmVPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpIHsKLSAgb2JzZXJ2ZXJzXy5SZW1vdmVPYnNlcnZlcihvYnNlcnZlcik7Ci19Ci0KLWNvbnN0IGJ0X2ludGVyZmFjZV90KiBGYWtlQmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXRIQUxJbnRlcmZhY2UoKSBjb25zdCB7Ci0gIHJldHVybiAmZmFrZV9idF9pZmFjZTsKLX0KLQotYnRfY2FsbGJhY2tzX3QqIEZha2VCbHVldG9vdGhJbnRlcmZhY2U6OkdldEhBTENhbGxiYWNrcygpIGNvbnN0IHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2ludGVyZmFjZS5oIGIvc2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTk5YjUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YmFzZS9vYnNlcnZlcl9saXN0Lmg+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9vYnNlcnZlcl9saXN0LmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIEZha2VCbHVldG9vdGhJbnRlcmZhY2UgOiBwdWJsaWMgQmx1ZXRvb3RoSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIEEgRmFrZSBIQUwgQmx1ZXRvb3RoIGludGVyZmFjZS4gVGhpcyBpcyBrZXB0IGFzIGEgZ2xvYmFsIHNpbmdsZXRvbiBhcyB0aGUKLSAgLy8gQmx1ZXRvb3RoIEhBTCBkb2Vzbid0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXJ3aXNlLgotICAvLwotICAvLyBUT0RPKGFybWFuc2l0byk6IFVzZSBhbiBhYnN0cmFjdCAiVGVzdEhhbmRsZXIiIGludGVyZmFjZSBpbnN0ZWFkLgotICBzdHJ1Y3QgTWFuYWdlciB7Ci0gICAgTWFuYWdlcigpOwotICAgIH5NYW5hZ2VyKCkgPSBkZWZhdWx0OwotCi0gICAgLy8gVmFsdWVzIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGZyb20gYnRfaW50ZXJmYWNlX3QgbWV0aG9kcy4KLSAgICBib29sIGVuYWJsZV9zdWNjZWVkOwotICAgIGJvb2wgZGlzYWJsZV9zdWNjZWVkOwotICAgIGJvb2wgc2V0X3Byb3BlcnR5X3N1Y2NlZWQ7Ci0gIH07Ci0KLSAgLy8gUmV0dXJucyB0aGUgZ2xvYmFsIE1hbmFnZXIuCi0gIHN0YXRpYyBNYW5hZ2VyKiBHZXRNYW5hZ2VyKCk7Ci0KLSAgRmFrZUJsdWV0b290aEludGVyZmFjZSgpID0gZGVmYXVsdDsKLSAgfkZha2VCbHVldG9vdGhJbnRlcmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gTm90aWZpZXMgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBhZGFwdGVyIHN0YXRlIGNoYW5nZWQgdG8gfHN0YXRlfC4KLSAgdm9pZCBOb3RpZnlBZGFwdGVyU3RhdGVDaGFuZ2VkKGJ0X3N0YXRlX3Qgc3RhdGUpOwotCi0gIC8vIFRyaWdnZXJzIGFuIGFkYXB0ZXIgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotICB2b2lkIE5vdGlmeUFkYXB0ZXJQcm9wZXJ0aWVzQ2hhbmdlZChpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpOwotICB2b2lkIE5vdGlmeUFkYXB0ZXJOYW1lUHJvcGVydHlDaGFuZ2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKLSAgdm9pZCBOb3RpZnlBZGFwdGVyQWRkcmVzc1Byb3BlcnR5Q2hhbmdlZChjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzKTsKLSAgdm9pZCBOb3RpZnlBZGFwdGVyTG9jYWxMZUZlYXR1cmVzUHJvcGVydHlDaGFuZ2VkKAotICAgICAgY29uc3QgYnRfbG9jYWxfbGVfZmVhdHVyZXNfdCogZmVhdHVyZXMpOwotICB2b2lkIE5vdGlmeUFjbFN0YXRlQ2hhbmdlZENhbGxiYWNrKGJ0X3N0YXR1c190IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2FjbF9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BvcnRfbGlua190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2hjaV9lcnJvcl9jb2RlX3QgaGNpX3JlYXNvbik7Ci0KLSAgLy8gaGFsOjpCbHVldG9vdGhJbnRlcmZhY2Ugb3ZlcnJpZGVzOgotICB2b2lkIEFkZE9ic2VydmVyKE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZTsKLSAgY29uc3QgYnRfaW50ZXJmYWNlX3QqIEdldEhBTEludGVyZmFjZSgpIGNvbnN0IG92ZXJyaWRlOwotICBidF9jYWxsYmFja3NfdCogR2V0SEFMQ2FsbGJhY2tzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBidGJhc2U6OkFic3RyYWN0T2JzZXJ2ZXJMaXN0PE9ic2VydmVyPiBvYnNlcnZlcnNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGYWtlQmx1ZXRvb3RoSW50ZXJmYWNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zaW5rX2JpbmRlcl9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2EyZHBfc2lua19iaW5kZXJfc2VydmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA5YWE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zaW5rX2JpbmRlcl9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hMmRwX3NpbmtfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2s7Ci0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLUJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyOjpCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcigKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIENIRUNLKGFkYXB0ZXIpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6OlJlZ2lzdGVyKAotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCbHVldG9vdGhBMmRwU2lua0NhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIGF1dG8gZmFjdG9yeSA9IGFkYXB0ZXJfLT5HZXRBMmRwU2lua0ZhY3RvcnkoKTsKLSAgKl9haWRsX3JldHVybiA9IFJlZ2lzdGVySW5zdGFuY2VCYXNlKGNhbGxiYWNrLCBmYWN0b3J5KTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyOjpVbnJlZ2lzdGVyKCkgewotICBVbnJlZ2lzdGVyQWxsQmFzZSgpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6OkVuYWJsZShib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBhMmRwX3NpbmsgPSBHZXRBMmRwU2luaygpOwotICBpZiAoIWEyZHBfc2luaykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgQTJEUCBzaW5rIGluc3RhbmNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghYTJkcF9zaW5rLT5FbmFibGUoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBlbmFibGUiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcjo6RGlzYWJsZShib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBhMmRwX3NpbmsgPSBHZXRBMmRwU2luaygpOwotICBpZiAoIWEyZHBfc2luaykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgQTJEUCBzaW5rIGluc3RhbmNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGEyZHBfc2luay0+RGlzYWJsZSgpOwotICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyOjpDb25uZWN0KGNvbnN0IFN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBhMmRwX3NpbmsgPSBHZXRBMmRwU2luaygpOwotICBpZiAoIWEyZHBfc2luaykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgQTJEUCBzaW5rIGluc3RhbmNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghYTJkcF9zaW5rLT5Db25uZWN0KFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLnN0cmluZygpKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjb25uZWN0IjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6OkRpc2Nvbm5lY3QoY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGEyZHBfc2luayA9IEdldEEyZHBTaW5rKCk7Ci0gIGlmICghYTJkcF9zaW5rKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBBMkRQIHNpbmsgaW5zdGFuY2UiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgaWYgKCFhMmRwX3NpbmstPkRpc2Nvbm5lY3QoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCkpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNvbm5lY3QiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcjo6U2V0QXVkaW9Gb2N1c1N0YXRlKGludCBmb2N1c19zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGEyZHBfc2luayA9IEdldEEyZHBTaW5rKCk7Ci0gIGlmICghYTJkcF9zaW5rKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBBMkRQIGluc3RhbmNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGEyZHBfc2luay0+U2V0QXVkaW9Gb2N1c1N0YXRlKGZvY3VzX3N0YXRlKTsKLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcjo6U2V0QXVkaW9UcmFja0dhaW4oZmxvYXQgZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gYTJkcF9zaW5rID0gR2V0QTJkcFNpbmsoKTsKLSAgaWYgKCFhMmRwX3NpbmspIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IEEyRFAgaW5zdGFuY2UiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgYTJkcF9zaW5rLT5TZXRBdWRpb1RyYWNrR2FpbihnYWluKTsKLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6Ok9uQ29ubmVjdGlvblN0YXRlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gY2IgPSBHZXRBMmRwU2lua0NhbGxiYWNrKCk7Ci0gIGlmICghY2IuZ2V0KCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkNhbGxiYWNrIGZvciB0aGlzIEdhdHRTZXJ2ZXIgd2FzIGRlbGV0ZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjYi0+T25Db25uZWN0aW9uU3RhdGUoU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSksIHN0YXRlKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcjo6T25BdWRpb1N0YXRlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gY2IgPSBHZXRBMmRwU2lua0NhbGxiYWNrKCk7Ci0gIGlmICghY2IuZ2V0KCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkNhbGxiYWNrIGZvciB0aGlzIEdhdHRTZXJ2ZXIgd2FzIGRlbGV0ZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjYi0+T25BdWRpb1N0YXRlKFN0cmluZzE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCkpLCBzdGF0ZSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6Ok9uQXVkaW9Db25maWcoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICB1aW50OF90IGNoYW5uZWxfY291bnQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IEdldEEyZHBTaW5rQ2FsbGJhY2soKTsKLSAgaWYgKCFjYi5nZXQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgZm9yIHRoaXMgR2F0dFNlcnZlciB3YXMgZGVsZXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNiLT5PbkF1ZGlvQ29uZmlnKFN0cmluZzE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCkpLCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jb3VudCk7Ci19Ci0KLWJvb2wgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6Okhhc0luc3RhbmNlKCkgewotICByZXR1cm4gR2V0QTJkcFNpbmsoKSAhPSBudWxscHRyOwotfQotCi1hbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjaz4KLUJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyOjpHZXRBMmRwU2lua0NhbGxiYWNrKCkgewotICBhdXRvIGNiID0gR2V0Q2FsbGJhY2soYmx1ZXRvb3RoOjpBMmRwU2luazo6a1NpbmdsZXRvbkluc3RhbmNlSWQpOwotICByZXR1cm4gYW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2s+KAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2sqPihjYi5nZXQoKSkpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpBMmRwU2luaz4KLUJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyOjpHZXRBMmRwU2luaygpIHsKLSAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxibHVldG9vdGg6OkEyZHBTaW5rPigKLSAgICAgIEdldEluc3RhbmNlKGJsdWV0b290aDo6QTJkcFNpbms6OmtTaW5nbGV0b25JbnN0YW5jZUlkKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI6Ok9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoCi0gICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdGFuY2UgSUQ6ICIgPDwgaW5zdGFuY2UtPkdldEluc3RhbmNlSWQoKQotICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLSAgYmx1ZXRvb3RoOjpBMmRwU2luayogYTJkcF9zaW5rID0gc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpBMmRwU2luayo+KGluc3RhbmNlKTsKLSAgYTJkcF9zaW5rLT5TZXREZWxlZ2F0ZSh0aGlzKTsKLQotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjaz4gY2IoCi0gICAgICBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjayo+KGNhbGxiYWNrLmdldCgpKSk7Ci0gIGNiLT5PblJlZ2lzdGVyZWQoc3RhdHVzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hMmRwX3NpbmtfYmluZGVyX3NlcnZlci5oIGIvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hMmRwX3NpbmtfYmluZGVyX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThhZjU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zaW5rX2JpbmRlcl9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0JuQmx1ZXRvb3RoQTJkcFNpbmsuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjay5oPgotCi0jaW5jbHVkZSAic2VydmljZS9hMmRwX3NpbmsuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvaW50ZXJmYWNlX3dpdGhfaW5zdGFuY2VzX2Jhc2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi1jbGFzcyBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcgotICAgIDogcHVibGljIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlLAotICAgICAgcHVibGljIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhBMmRwU2luaywKLSAgICAgIHB1YmxpYyBibHVldG9vdGg6OkEyZHBTaW5rOjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+Qmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gSUJsdWV0b290aEEyZHBTaW5rIGltcGxlbWVudGF0aW9uOgotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWdpc3RlcigKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEEyZHBTaW5rQ2FsbGJhY2s+JgotICAgICAgICAgIGNhbGxiYWNrLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRW5hYmxlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIERpc2FibGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVW5yZWdpc3RlcigpIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBDb25uZWN0KGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBEaXNjb25uZWN0KGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBTZXRBdWRpb0ZvY3VzU3RhdGUoaW50IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgU2V0QXVkaW9UcmFja0dhaW4oZmxvYXQgZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAvLyBibHVldG9vdGg6OmJsdWV0b290aDo6QTJkcFNpbms6OkRlbGVnYXRlIGltcGxlbWVudGF0aW9uOgotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkF1ZGlvU3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgc3RhdGUpIG92ZXJyaWRlOwotICB2b2lkIE9uQXVkaW9Db25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9jb3VudCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBIYXNJbnN0YW5jZSgpOwotCi0gcHJpdmF0ZToKLSAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoQTJkcFNpbmtDYWxsYmFjaz4KLSAgR2V0QTJkcFNpbmtDYWxsYmFjaygpOwotICBzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpBMmRwU2luaz4gR2V0QTJkcFNpbmsoKTsKLQotICAvLyBJbnRlcmZhY2VXaXRoSW5zdGFuY2VzQmFzZSBvdmVycmlkZToKLSAgdm9pZCBPblJlZ2lzdGVySW5zdGFuY2VJbXBsKGJsdWV0b290aDo6QkxFU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZSogaW5zdGFuY2UpIG92ZXJyaWRlOwotCi0gIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcl87ICAvLyB3ZWFrCi0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zb3VyY2VfYmluZGVyX3NlcnZlci5jYyBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zb3VyY2VfYmluZGVyX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlNmRmZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2EyZHBfc291cmNlX2JpbmRlcl9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zb3VyY2VfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotI2RlZmluZSBBSURMX1JFVCh2YWx1ZSkgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqX2FpZGxfcmV0dXJuID0gKHZhbHVlKTsgXAotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7ICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJZX0dFVF9TT1VSQ0UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXV0byBzb3VyY2UgPSBHZXRBMmRwU291cmNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIXNvdXJjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiAiICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IEEyRFAgc291cmNlIGludGVyZmFjZSI7IFwKLSAgICAgIEFJRExfUkVUKGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSkKLQotI2RlZmluZSBUUllfR0VUX0NCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdXRvIGNiID0gR2V0QTJkcFNvdXJjZUNhbGxiYWNrKCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghY2IuZ2V0KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBMT0coV0FSTklORykgPDwgIkNhbGxiYWNrIGZvciBBMkRQIFNPVVJDRSB3YXMgZGVsZXRlZCI7IFwKLSAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSkKLQotI2RlZmluZSBUUllfUkVUKGV4cHIsIG1zZykgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGV4cHIpKSB7ICAgICAgICAgXAotICAgICAgTE9HKEVSUk9SKSA8PCBtc2c7ICAgXAotICAgICAgQUlETF9SRVQoZmFsc2UpOyAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgXAotICAgIEFJRExfUkVUKHRydWUpOyAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSWV9SRVRfRlVOQyhleHByKSBUUllfUkVUKGV4cHIsIF9fZnVuY19fIDw8ICIgZmFpbGVkIikKLQotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEEyZHBDb2RlY0NvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjazsKLQotdXNpbmcgTG9ja0d1YXJkID0gc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+OwotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi1uYW1lc3BhY2UgewotCi1zdGQ6OnZlY3RvcjxibHVldG9vdGg6OkEyZHBDb2RlY0NvbmZpZz4gQTJkcENvZGVjc0Zyb21CaW5kZXIoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Qmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnPiYgY29kZWNzKSB7Ci0gIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnPiByZXQ7Ci0gIHJldC5yZXNlcnZlKGNvZGVjcy5zaXplKCkpOwotICBmb3IgKGNvbnN0IGF1dG8mIGNvbmZpZyA6IGNvZGVjcykgewotICAgIHJldC5wdXNoX2JhY2soY29uZmlnKTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPEJsdWV0b290aEEyZHBDb2RlY0NvbmZpZz4gQTJkcENvZGVjc1RvQmluZGVyKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnPiYgY29kZWNzKSB7Ci0gIHN0ZDo6dmVjdG9yPEJsdWV0b290aEEyZHBDb2RlY0NvbmZpZz4gcmV0OwotICByZXQucmVzZXJ2ZShjb2RlY3Muc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBjb25maWcgOiBjb2RlY3MpIHsKLSAgICByZXQucHVzaF9iYWNrKGNvbmZpZyk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcjo6Qmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcigKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIENIRUNLKGFkYXB0ZXIpOwotfQotCi1CbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyOjp+Qmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcigpID0gZGVmYXVsdDsKLQotYm9vbCBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyOjpIYXNJbnN0YW5jZSgpIHsKLSAgcmV0dXJuIEdldEEyZHBTb3VyY2UoKSAhPSBudWxscHRyOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcjo6UmVnaXN0ZXIoCi0gICAgY29uc3QgYW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBhdXRvIGZhY3RvcnkgPSBhZGFwdGVyXy0+R2V0QTJkcFNvdXJjZUZhY3RvcnkoKTsKLSAgKl9haWRsX3JldHVybiA9IFJlZ2lzdGVySW5zdGFuY2VCYXNlKGNhbGxiYWNrLCBmYWN0b3J5KTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI6OlVucmVnaXN0ZXIoKSB7Ci0gIFVucmVnaXN0ZXJBbGxCYXNlKCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyOjpFbmFibGUoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhBMmRwQ29kZWNDb25maWc+JgotICAgICAgICBjb2RlY19wcmlvcml0aWVzLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBhdXRvIGNvZGVjX3ByaW9yaXRpZXNfbm9uX2JpbmRlciA9IEEyZHBDb2RlY3NGcm9tQmluZGVyKGNvZGVjX3ByaW9yaXRpZXMpOwotCi0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gYTJkcF9zb3VyY2UgPSBUUllfR0VUX1NPVVJDRSgpOwotICBUUllfUkVUX0ZVTkMoYTJkcF9zb3VyY2UtPkVuYWJsZShjb2RlY19wcmlvcml0aWVzX25vbl9iaW5kZXIpKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI6OkRpc2FibGUoYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gYTJkcF9zb3VyY2UgPSBUUllfR0VUX1NPVVJDRSgpOwotICBhMmRwX3NvdXJjZS0+RGlzYWJsZSgpOwotICBBSURMX1JFVCh0cnVlKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI6OkNvbm5lY3QoY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gYTJkcF9zb3VyY2UgPSBUUllfR0VUX1NPVVJDRSgpOwotICBUUllfUkVUX0ZVTkMoYTJkcF9zb3VyY2UtPkNvbm5lY3QoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCkpKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI6OkRpc2Nvbm5lY3QoCi0gICAgY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBhMmRwX3NvdXJjZSA9IFRSWV9HRVRfU09VUkNFKCk7Ci0gIFRSWV9SRVRfRlVOQyhhMmRwX3NvdXJjZS0+RGlzY29ubmVjdChTdHJpbmc4KGRldmljZV9hZGRyZXNzKS5zdHJpbmcoKSkpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcjo6Q29uZmlnQ29kZWMoCi0gICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnPiYKLSAgICAgICAgY29kZWNfcHJlZmVyZW5jZXMsCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIGF1dG8gY29kZWNfcHJlZmVyZW5jZXNfbm9uX2JpbmRlciA9IEEyZHBDb2RlY3NGcm9tQmluZGVyKGNvZGVjX3ByZWZlcmVuY2VzKTsKLQotICBMb2NrR3VhcmQgbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGEyZHBfc291cmNlID0gVFJZX0dFVF9TT1VSQ0UoKTsKLSAgVFJZX1JFVF9GVU5DKGEyZHBfc291cmNlLT5Db25maWdDb2RlYyhTdHJpbmc4KGRldmljZV9hZGRyZXNzKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19wcmVmZXJlbmNlc19ub25fYmluZGVyKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcjo6T25Db25uZWN0aW9uU3RhdGUoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgc3RhdGUpIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uQ29ubmVjdGlvblN0YXRlKFN0cmluZzE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCkpLCBzdGF0ZSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQTJkcFNvdXJjZUJpbmRlclNlcnZlcjo6T25BdWRpb1N0YXRlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKSB7Ci0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gY2IgPSBUUllfR0VUX0NCKCk7Ci0gIGNiLT5PbkF1ZGlvU3RhdGUoU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSksIHN0YXRlKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyOjpPbkF1ZGlvQ29uZmlnKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgYmx1ZXRvb3RoOjpBMmRwQ29kZWNDb25maWcgY29kZWNfY29uZmlnLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnPiYgY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OkEyZHBDb2RlY0NvbmZpZz4mCi0gICAgICAgIGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcykgewotICBhdXRvIGJpbmRlcl9jb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzID0KLSAgICAgIEEyZHBDb2RlY3NUb0JpbmRlcihjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzKTsKLSAgYXV0byBiaW5kZXJfY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzID0KLSAgICAgIEEyZHBDb2RlY3NUb0JpbmRlcihjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotCi0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gY2IgPSBUUllfR0VUX0NCKCk7Ci0gIGNiLT5PbkF1ZGlvQ29uZmlnKFN0cmluZzE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCkpLCBjb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRlcl9jb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICBiaW5kZXJfY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKTsKLX0KLQotYW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjaz4KLUJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI6OkdldEEyZHBTb3VyY2VDYWxsYmFjaygpIHsKLSAgYXV0byBjYiA9IEdldENhbGxiYWNrKGJsdWV0b290aDo6QTJkcFNvdXJjZTo6a1NpbmdsZXRvbkluc3RhbmNlSWQpOwotICByZXR1cm4gYW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjaz4oCi0gICAgICBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoQTJkcFNvdXJjZUNhbGxiYWNrKj4oY2IuZ2V0KCkpKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6QTJkcFNvdXJjZT4KLUJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI6OkdldEEyZHBTb3VyY2UoKSB7Ci0gIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Ymx1ZXRvb3RoOjpBMmRwU291cmNlPigKLSAgICAgIEdldEluc3RhbmNlKGJsdWV0b290aDo6QTJkcFNvdXJjZTo6a1NpbmdsZXRvbkluc3RhbmNlSWQpKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyOjpPblJlZ2lzdGVySW5zdGFuY2VJbXBsKAotICAgIGJsdWV0b290aDo6QkxFU3RhdHVzIHN0YXR1cywgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZSogaW5zdGFuY2UpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGluc3RhbmNlIElEOiAiIDw8IGluc3RhbmNlLT5HZXRJbnN0YW5jZUlkKCkKLSAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0gIGJsdWV0b290aDo6QTJkcFNvdXJjZSogYTJkcF9zb3VyY2UgPQotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpBMmRwU291cmNlKj4oaW5zdGFuY2UpOwotICBhMmRwX3NvdXJjZS0+U2V0RGVsZWdhdGUodGhpcyk7Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjaz4gY2IoCi0gICAgICBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoQTJkcFNvdXJjZUNhbGxiYWNrKj4oY2FsbGJhY2suZ2V0KCkpKTsKLSAgY2ItPk9uUmVnaXN0ZXJlZChzdGF0dXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2EyZHBfc291cmNlX2JpbmRlcl9zZXJ2ZXIuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zb3VyY2VfYmluZGVyX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjBhMzhhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zb3VyY2VfYmluZGVyX3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0JuQmx1ZXRvb3RoQTJkcFNvdXJjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwU291cmNlQ2FsbGJhY2suaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvYTJkcF9zb3VyY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvaW50ZXJmYWNlX3dpdGhfaW5zdGFuY2VzX2Jhc2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi1jbGFzcyBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyCi0gICAgOiBwdWJsaWMgSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2UsCi0gICAgICBwdWJsaWMgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbkJsdWV0b290aEEyZHBTb3VyY2UsCi0gICAgICBwdWJsaWMgYmx1ZXRvb3RoOjpBMmRwU291cmNlOjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcik7Ci0gIH5CbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyKCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBIYXNJbnN0YW5jZSgpOwotCi0gIC8vIElCbHVldG9vdGhBMmRwU291cmNlIGltcGxlbWVudGF0aW9uOgotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWdpc3RlcigKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjaz4mCi0gICAgICAgICAgY2FsbGJhY2ssCi0gICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbnJlZ2lzdGVyKCkgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEVuYWJsZSgKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnPiYKLSAgICAgICAgICBjb2RlY19wcmlvcml0aWVzLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRGlzYWJsZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBDb25uZWN0KGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBEaXNjb25uZWN0KGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBDb25maWdDb2RlYygKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQTJkcENvZGVjQ29uZmlnPiYKLSAgICAgICAgICBjb2RlY19wcmVmZXJlbmNlcywKLSAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICAvLyBibHVldG9vdGg6OmJsdWV0b290aDo6QTJkcFNvdXJjZTo6RGVsZWdhdGUgaW1wbGVtZW50YXRpb246Ci0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgc3RhdGUpIG92ZXJyaWRlOwotICB2b2lkIE9uQXVkaW9TdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCBzdGF0ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25BdWRpb0NvbmZpZygKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgIGJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnIGNvZGVjX2NvbmZpZywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnPiYgY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6QTJkcENvZGVjQ29uZmlnPiYKLSAgICAgICAgICBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpIG92ZXJyaWRlOwotCi0gIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEEyZHBTb3VyY2VDYWxsYmFjaz4KLSAgR2V0QTJkcFNvdXJjZUNhbGxiYWNrKCk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OkEyZHBTb3VyY2U+IEdldEEyZHBTb3VyY2UoKTsKLQotICAvLyBJbnRlcmZhY2VXaXRoSW5zdGFuY2VzQmFzZSBvdmVycmlkZToKLSAgdm9pZCBPblJlZ2lzdGVySW5zdGFuY2VJbXBsKGJsdWV0b290aDo6QkxFU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZSogaW5zdGFuY2UpIG92ZXJyaWRlOwotCi0gIGJsdWV0b290aDo6QWRhcHRlciogY29uc3QgYWRhcHRlcl87ICAvLyB3ZWFrCi0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hdnJjcF9jb250cm9sX2JpbmRlcl9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX2NvbnRyb2xfYmluZGVyX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxNjg1OS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX2NvbnRyb2xfYmluZGVyX3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX2NvbnRyb2xfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhBdnJjcENvbnRyb2xDYWxsYmFjazsKLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgYmluZGVyIHsKLQotbmFtZXNwYWNlIHsKLWNvbnN0IGludCBrSW52YWxpZEluc3RhbmNlSWQgPSAtMTsKLX0gIC8vIG5hbWVzcGFjZQotCi1CbHVldG9vdGhBdnJjcENvbnRyb2xCaW5kZXJTZXJ2ZXI6OkJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcigKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIENIRUNLKGFkYXB0ZXJfKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcjo6UmVnaXN0ZXIoCi0gICAgY29uc3QgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF2cmNwQ29udHJvbENhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgYmx1ZXRvb3RoOjpBdnJjcENvbnRyb2xGYWN0b3J5KiBnYXR0X2NsaWVudF9mYWN0b3J5ID0KLSAgICAgIGFkYXB0ZXJfLT5HZXRBdnJjcENvbnRyb2xGYWN0b3J5KCk7Ci0KLSAgKl9haWRsX3JldHVybiA9IFJlZ2lzdGVySW5zdGFuY2VCYXNlKGNhbGxiYWNrLCBnYXR0X2NsaWVudF9mYWN0b3J5KTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcjo6VW5yZWdpc3RlcihpbnQzMl90IGlkKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFVucmVnaXN0ZXJJbnN0YW5jZUJhc2UoaWQpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyOjpVbnJlZ2lzdGVyQWxsKCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBVbnJlZ2lzdGVyQWxsQmFzZSgpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyOjpFbmFibGUoaW50MzJfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBhdnJjcF9jb250cm9sID0gR2V0QXZyY3BDb250cm9sKGlkKTsKLSAgaWYgKCFhdnJjcF9jb250cm9sKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBhdnJjcCBjb250cm9sIGluc3RhbmNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghYXZyY3BfY29udHJvbC0+RW5hYmxlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZW5hYmxlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyOjpEaXNhYmxlKGludDMyX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGF2cmNwX2NvbnRyb2wgPSBHZXRBdnJjcENvbnRyb2woaWQpOwotICBpZiAoIWF2cmNwX2NvbnRyb2wpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IGF2cmNwIGNvbnRyb2wgaW5zdGFuY2UiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgYXZyY3BfY29udHJvbC0+RGlzYWJsZSgpOwotICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcjo6U2VuZFBhc3NUaHJvdWdoQ29tbWFuZCgKLSAgICBpbnQzMl90IGlkLCBjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsIGludDMyX3Qga2V5X2NvZGUsCi0gICAgYm9vbCBrZXlfcHJlc3NlZCwgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gYXZyY3BfY29udHJvbCA9IEdldEF2cmNwQ29udHJvbChpZCk7Ci0gIGlmICghYXZyY3BfY29udHJvbCkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgYXZyY3AgY29udHJvbCBpbnN0YW5jZSI7Ci0gICAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIWF2cmNwX2NvbnRyb2wtPlNlbmRQYXNzVGhyb3VnaENvbW1hbmQoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29kZSwga2V5X3ByZXNzZWQpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgcGFzcyB0aHJvdWdoIGNvbW1hbmQiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLWFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcjo6U2V0QWJzVm9sdW1lUmVzcG9uc2UoCi0gICAgaW50MzJfdCBpZCwgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBpbnQzMl90IGFic192b2wsCi0gICAgaW50MzJfdCBsYWJlbCwgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gYXZyY3BfY29udHJvbCA9IEdldEF2cmNwQ29udHJvbChpZCk7Ci0gIGlmICghYXZyY3BfY29udHJvbCkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgYXZyY3AgY29udHJvbCBpbnN0YW5jZSI7Ci0gICAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIWF2cmNwX2NvbnRyb2wtPlNldEFic1ZvbHVtZVJlc3BvbnNlKFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic192b2wsIGxhYmVsKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZW5kIHNldCBhYnNvbHV0ZSB2b2x1bWUgcmVzcG9uc2UiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0gICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1hbmRyb2lkOjpiaW5kZXI6OlN0YXR1cwotQmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyOjpSZWdpc3RlckZvckFic1ZvbHVtZUNhbGxiYWNrUmVzcG9uc2UoCi0gICAgaW50MzJfdCBpZCwgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBpbnQzMl90IHJlc3BvbnNlX3R5cGUsCi0gICAgaW50MzJfdCBhYnNfdm9sLCBpbnQzMl90IGxhYmVsLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBhdnJjcF9jb250cm9sID0gR2V0QXZyY3BDb250cm9sKGlkKTsKLSAgaWYgKCFhdnJjcF9jb250cm9sKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBhdnJjcCBjb250cm9sIGluc3RhbmNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghYXZyY3BfY29udHJvbC0+UmVnaXN0ZXJGb3JBYnNWb2x1bWVDYWxsYmFja1Jlc3BvbnNlKAotICAgICAgICAgIFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLnN0cmluZygpLCByZXNwb25zZV90eXBlLCBhYnNfdm9sLCBsYWJlbCkpIHsKLSAgICBMT0coRVJST1IpCi0gICAgICAgIDw8ICJGYWlsZWQgdG8gc2VuZCByZWdpc3RlciBmb3IgYWJzb2x1dGUgdm9sdW1lIGNhbGxiYWNrIHJlc3BvbnNlIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcENvbnRyb2xCaW5kZXJTZXJ2ZXI6Ok9uQ29ubmVjdGlvblN0YXRlKAotICAgIGJvb2wgcmNfY29ubmVjdCwgYm9vbCBidF9jb25uZWN0LCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MpIHsKLSAgYXV0byBmdW5jID0gW3JjX2Nvbm5lY3QsIGJ0X2Nvbm5lY3QsICZkZXZpY2VfYWRkcmVzc10oSUludGVyZmFjZSogY2IpIHsKLSAgICBhdXRvIGF2cmNwX2NvbnRyb2xfY2IgPSBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoQXZyY3BDb250cm9sQ2FsbGJhY2sqPihjYik7Ci0gICAgYXZyY3BfY29udHJvbF9jYi0+T25Db25uZWN0aW9uU3RhdGUocmNfY29ubmVjdCwgYnRfY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihkZXZpY2VfYWRkcmVzcy5jX3N0cigpKSk7Ci0gIH07Ci0KLSAgRm9yRWFjaENhbGxiYWNrKGZ1bmMpOwotfQotCi12b2lkIEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcjo6T25UcmFja0NoYW5nZWQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBjb25zdCBibHVldG9vdGg6OkF2cmNwTWVkaWFBdHRyJiBhdHRyKSB7Ci0gIGF1dG8gYmluZGVyX2F0dHIgPSBhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEF2cmNwTWVkaWFBdHRyKGF0dHIpOwotCi0gIGF1dG8gZnVuYyA9IFsmZGV2aWNlX2FkZHJlc3MsICZiaW5kZXJfYXR0cl0oSUludGVyZmFjZSogY2IpIHsKLSAgICBhdXRvIGF2cmNwX2NvbnRyb2xfY2IgPSBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoQXZyY3BDb250cm9sQ2FsbGJhY2sqPihjYik7Ci0gICAgYXZyY3BfY29udHJvbF9jYi0+T25UcmFja0NoYW5nZWQoU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyX2F0dHIpOwotICB9OwotCi0gIEZvckVhY2hDYWxsYmFjayhmdW5jKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcENvbnRyb2xCaW5kZXJTZXJ2ZXI6Ok9uU2V0QWJzVm9sdW1lUmVxdWVzdCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludDMyX3QgYWJzX3ZvbCwgaW50MzJfdCBsYWJlbCkgewotICBhdXRvIGFkZHJfczE2ID0gU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSwgZGV2aWNlX2FkZHJlc3Muc2l6ZSgpKTsKLSAgYXV0byBmdW5jID0gWyZhZGRyX3MxNiwgYWJzX3ZvbCwgbGFiZWxdKElJbnRlcmZhY2UqIGNiKSB7Ci0gICAgYXV0byBhdnJjcF9jb250cm9sX2NiID0gc3RhdGljX2Nhc3Q8SUJsdWV0b290aEF2cmNwQ29udHJvbENhbGxiYWNrKj4oY2IpOwotICAgIGF2cmNwX2NvbnRyb2xfY2ItPk9uU2V0QWJzVm9sdW1lUmVxdWVzdChhZGRyX3MxNiwgYWJzX3ZvbCwgbGFiZWwpOwotICB9OwotCi0gIEZvckVhY2hDYWxsYmFjayhmdW5jKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcENvbnRyb2xCaW5kZXJTZXJ2ZXI6Ok9uUmVnaXN0ZXJGb3JBYnNWb2x1bWVDYWxsYmFja1JlcXVlc3QoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQzMl90IGxhYmVsKSB7Ci0gIGF1dG8gYWRkcl9zMTYgPSBTdHJpbmcxNihkZXZpY2VfYWRkcmVzcy5jX3N0cigpLCBkZXZpY2VfYWRkcmVzcy5zaXplKCkpOwotICBhdXRvIGZ1bmMgPSBbJmFkZHJfczE2LCBsYWJlbF0oSUludGVyZmFjZSogY2IpIHsKLSAgICBhdXRvIGF2cmNwX2NvbnRyb2xfY2IgPSBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoQXZyY3BDb250cm9sQ2FsbGJhY2sqPihjYik7Ci0gICAgYXZyY3BfY29udHJvbF9jYi0+T25SZWdpc3RlckZvckFic1ZvbHVtZUNhbGxiYWNrUmVxdWVzdChhZGRyX3MxNiwgbGFiZWwpOwotICB9OwotCi0gIEZvckVhY2hDYWxsYmFjayhmdW5jKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6QXZyY3BDb250cm9sPgotQmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyOjpHZXRBdnJjcENvbnRyb2woaW50IGlkKSB7Ci0gIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Ymx1ZXRvb3RoOjpBdnJjcENvbnRyb2w+KEdldEluc3RhbmNlKGlkKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyOjpPblJlZ2lzdGVySW5zdGFuY2VJbXBsKAotICAgIGJsdWV0b290aDo6QkxFU3RhdHVzIHN0YXR1cywgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZSogaW5zdGFuY2UpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGNsaWVudCBJRDogIiA8PCBpbnN0YW5jZS0+R2V0SW5zdGFuY2VJZCgpCi0gICAgICAgICAgPDwgIiBzdGF0dXM6ICIgPDwgc3RhdHVzOwotCi0gIGJsdWV0b290aDo6QXZyY3BDb250cm9sKiBhdnJjcF9jb250cm9sID0KLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6QXZyY3BDb250cm9sKj4oaW5zdGFuY2UpOwotICBhdnJjcF9jb250cm9sLT5TZXREZWxlZ2F0ZSh0aGlzKTsKLQotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXZyY3BDb250cm9sQ2FsbGJhY2s+IGNiKAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aEF2cmNwQ29udHJvbENhbGxiYWNrKj4oY2FsbGJhY2suZ2V0KCkpKTsKLSAgY2ItPk9uUmVnaXN0ZXJlZChzdGF0dXMsIChzdGF0dXMgPT0gYmx1ZXRvb3RoOjpCTEVfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnN0YW5jZS0+R2V0SW5zdGFuY2VJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrSW52YWxpZEluc3RhbmNlSWQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX2NvbnRyb2xfYmluZGVyX3NlcnZlci5oIGIvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hdnJjcF9jb250cm9sX2JpbmRlcl9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZjFmMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX2NvbnRyb2xfYmluZGVyX3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgotCi0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhBdnJjcENvbnRyb2wuaCIKLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BDb250cm9sQ2FsbGJhY2suaCIKLQotI2luY2x1ZGUgInNlcnZpY2UvYXZyY3BfY29udHJvbC5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLWNsYXNzIEFkYXB0ZXI7Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLWNsYXNzIEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcgotICAgIDogcHVibGljIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlLAotICAgICAgcHVibGljIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhBdnJjcENvbnRyb2wsCi0gICAgICBwdWJsaWMgYmx1ZXRvb3RoOjpBdnJjcENvbnRyb2w6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+Qmx1ZXRvb3RoQXZyY3BDb250cm9sQmluZGVyU2VydmVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIC8vIElCbHVldG9vdGhBdnJjcENvbnRyb2wgaW1wbGVtZW50YXRpb246Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFJlZ2lzdGVyKAotICAgICAgY29uc3QgYW5kcm9pZDo6c3A8OjphbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhBdnJjcENvbnRyb2xDYWxsYmFjaz4mCi0gICAgICAgICAgY2FsbGJhY2ssCi0gICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbnJlZ2lzdGVyKGludDMyX3QgaWQpIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBVbnJlZ2lzdGVyQWxsKCkgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEVuYWJsZShpbnQzMl90IGlkLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBEaXNhYmxlKGludDMyX3QgaWQsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIFNlbmRQYXNzVGhyb3VnaENvbW1hbmQoCi0gICAgICBpbnQzMl90IGlkLCBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsIGludDMyX3Qga2V5X2NvZGUsCi0gICAgICBib29sIGtleV9wcmVzc2VkLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBTZXRBYnNWb2x1bWVSZXNwb25zZSgKLSAgICAgIGludDMyX3QgaWQsIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgaW50MzJfdCBhYnNfdm9sLAotICAgICAgaW50MzJfdCBsYWJlbCwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgUmVnaXN0ZXJGb3JBYnNWb2x1bWVDYWxsYmFja1Jlc3BvbnNlKAotICAgICAgaW50MzJfdCBpZCwgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgaW50MzJfdCByZXNwb25zZV90eXBlLCBpbnQzMl90IGFic192b2wsIGludDMyX3QgbGFiZWwsCi0gICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgLy8gYmx1ZXRvb3RoOjpibHVldG9vdGg6OkF2cmNwQ29udHJvbDo6RGVsZWdhdGUgaW1wbGVtZW50YXRpb246Ci0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoYm9vbCByY19jb25uZWN0LCBib29sIGJ0X2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzKSBvdmVycmlkZTsKLSAgdm9pZCBPblRyYWNrQ2hhbmdlZChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpBdnJjcE1lZGlhQXR0ciYgYXR0cikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TZXRBYnNWb2x1bWVSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50MzJfdCBhYnNfdm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxhYmVsKSBvdmVycmlkZTsKLSAgdm9pZCBPblJlZ2lzdGVyRm9yQWJzVm9sdW1lQ2FsbGJhY2tSZXF1ZXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGFiZWwpIG92ZXJyaWRlOwotCi0gIC8vIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlIG92ZXJyaWRlOgotICB2b2lkIE9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgb3ZlcnJpZGU7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6QXZyY3BDb250cm9sPiBHZXRBdnJjcENvbnRyb2woaW50IGlkKTsKLQotICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXJfOyAgLy8gd2VhawotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhBdnJjcENvbnRyb2xCaW5kZXJTZXJ2ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hdnJjcF90YXJnZXRfYmluZGVyX3NlcnZlci5jYyBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYXZyY3BfdGFyZ2V0X2JpbmRlcl9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NTJiMTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hdnJjcF90YXJnZXRfYmluZGVyX3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9hdnJjcF90YXJnZXRfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotI2RlZmluZSBBSURMX1JFVCh2YWx1ZSkgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqX2FpZGxfcmV0dXJuID0gKHZhbHVlKTsgXAotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7ICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJZX0dFVF9UQVJHRVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdXRvIHRhcmdldCA9IEdldEF2cmNwVGFyZ2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIXRhcmdldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogIiAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgQVZSQ1AgdGFyZ2V0IGludGVyZmFjZSI7IFwKLSAgICAgIEFJRExfUkVUKGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0YXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSkKLQotI2RlZmluZSBUUllfR0VUX0NCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF1dG8gY2IgPSBHZXRBdnJjcFRhcmdldENhbGxiYWNrKCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghY2IuZ2V0KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYWxsYmFjayBmb3IgQVZSQ1AgdGFyZ2V0IHdhcyBkZWxldGVkIjsgXAotICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9KQotCi0jZGVmaW5lIFRSWV9SRVQoZXhwciwgbXNnKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoZXhwcikpIHsgICAgICAgICBcCi0gICAgICBMT0coRVJST1IpIDw8IG1zZzsgICBcCi0gICAgICBBSURMX1JFVChmYWxzZSk7ICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQUlETF9SRVQodHJ1ZSk7ICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJZX1JFVF9GVU5DKGV4cHIpIFRSWV9SRVQoZXhwciwgX19mdW5jX18gPDwgIiBmYWlsZWQiKQotCi11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZTsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2s7Ci0KLXVzaW5nIExvY2tHdWFyZCA9IHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PjsKLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgYmluZGVyIHsKLQotQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6OkJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyKAotICAgIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcikKLSAgICA6IGFkYXB0ZXJfKGFkYXB0ZXIpIHsKLSAgQ0hFQ0soYWRhcHRlcl8pOwotfQotCi1CbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6fkJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyKCkgPSBkZWZhdWx0OwotCi1ib29sIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpIYXNJbnN0YW5jZSgpIHsKLSAgcmV0dXJuIEdldEF2cmNwVGFyZ2V0KCkgIT0gbnVsbHB0cjsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpSZWdpc3RlcigKLSAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXZyY3BUYXJnZXRDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGJsdWV0b290aDo6QXZyY3BUYXJnZXRGYWN0b3J5KiBnYXR0X2NsaWVudF9mYWN0b3J5ID0KLSAgICAgIGFkYXB0ZXJfLT5HZXRBdnJjcFRhcmdldEZhY3RvcnkoKTsKLQotICAqX2FpZGxfcmV0dXJuID0gUmVnaXN0ZXJJbnN0YW5jZUJhc2UoY2FsbGJhY2ssIGdhdHRfY2xpZW50X2ZhY3RvcnkpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6OlVucmVnaXN0ZXIoaW50MzJfdCBpZCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBVbnJlZ2lzdGVySW5zdGFuY2VCYXNlKGlkKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpVbnJlZ2lzdGVyQWxsKCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBVbnJlZ2lzdGVyQWxsQmFzZSgpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6OkVuYWJsZShib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgYXV0byBhdnJjcF90YXJnZXQgPSBUUllfR0VUX1RBUkdFVCgpOwotICBUUllfUkVUX0ZVTkMoYXZyY3BfdGFyZ2V0LT5FbmFibGUoKSk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6RGlzYWJsZShib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgYXV0byBhdnJjcF90YXJnZXQgPSBUUllfR0VUX1RBUkdFVCgpOwotICBhdnJjcF90YXJnZXQtPkRpc2FibGUoKTsKLSAgQUlETF9SRVQodHJ1ZSk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6R2V0UGxheVN0YXR1c1Jlc3BvbnNlKAotICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBhZGRyLCBpbnQzMl90IHBsYXlfc3RhdHVzLCBpbnQzMl90IHNvbmdfbGVuLAotICAgIGludDMyX3Qgc29uZ19wb3MsIGJvb2wqIF9haWRsX3JldHVybikgewotICBhdXRvIGF2cmNwX3RhcmdldCA9IFRSWV9HRVRfVEFSR0VUKCk7Ci0gIFRSWV9SRVRfRlVOQyhhdnJjcF90YXJnZXQtPkdldFBsYXlTdGF0dXNSZXNwb25zZSgKLSAgICAgIFN0cmluZzgoYWRkcikuc3RyaW5nKCksIHBsYXlfc3RhdHVzLCBzb25nX2xlbiwgc29uZ19wb3MpKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpMaXN0UGxheWVyQXBwQXR0clJlc3BvbnNlKAotICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBhZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXR0cnMsCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIGF1dG8gYXZyY3BfdGFyZ2V0ID0gVFJZX0dFVF9UQVJHRVQoKTsKLSAgVFJZX1JFVF9GVU5DKAotICAgICAgYXZyY3BfdGFyZ2V0LT5MaXN0UGxheWVyQXBwQXR0clJlc3BvbnNlKFN0cmluZzgoYWRkcikuc3RyaW5nKCksIGF0dHJzKSk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6R2V0UGxheWVyQXBwVmFsdWVSZXNwb25zZSgKLSAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgYWRkciwKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZT4mIHZhbHVlcywKLSAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgYXV0byBhdnJjcF90YXJnZXQgPSBUUllfR0VUX1RBUkdFVCgpOwotICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OkF2cmNwSW50VmFsdWU+IG5vbl9iaW5kZXI7Ci0gIG5vbl9iaW5kZXIucmVzZXJ2ZSh2YWx1ZXMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiB2YWwgOiB2YWx1ZXMpIHsKLSAgICBub25fYmluZGVyLnB1c2hfYmFjayh2YWwpOwotICB9Ci0gIFRSWV9SRVRfRlVOQyhhdnJjcF90YXJnZXQtPkdldFBsYXllckFwcFZhbHVlUmVzcG9uc2UoU3RyaW5nOChhZGRyKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fYmluZGVyKSk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6R2V0UGxheWVyQXBwQXR0clRleHRSZXNwb25zZSgKLSAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgYWRkciwKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BTdHJpbmdWYWx1ZT4mIGF0dHJzLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBhdXRvIGF2cmNwX3RhcmdldCA9IFRSWV9HRVRfVEFSR0VUKCk7Ci0gIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6QXZyY3BTdHJpbmdWYWx1ZT4gbm9uX2JpbmRlcjsKLSAgbm9uX2JpbmRlci5yZXNlcnZlKGF0dHJzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgdmFsIDogYXR0cnMpIHsKLSAgICBub25fYmluZGVyLnB1c2hfYmFjayh2YWwpOwotICB9Ci0gIFRSWV9SRVRfRlVOQyhhdnJjcF90YXJnZXQtPkdldFBsYXllckFwcEF0dHJUZXh0UmVzcG9uc2UoCi0gICAgICBTdHJpbmc4KGFkZHIpLnN0cmluZygpLCBub25fYmluZGVyKSk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6R2V0UGxheWVyQXBwVmFsdWVUZXh0UmVzcG9uc2UoCi0gICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGFkZHIsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEF2cmNwU3RyaW5nVmFsdWU+JiB2YWx1ZXMsCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIGF1dG8gYXZyY3BfdGFyZ2V0ID0gVFJZX0dFVF9UQVJHRVQoKTsKLSAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpBdnJjcFN0cmluZ1ZhbHVlPiBub25fYmluZGVyOwotICBub25fYmluZGVyLnJlc2VydmUodmFsdWVzLnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgdmFsIDogdmFsdWVzKSB7Ci0gICAgbm9uX2JpbmRlci5wdXNoX2JhY2sodmFsKTsKLSAgfQotICBUUllfUkVUX0ZVTkMoYXZyY3BfdGFyZ2V0LT5HZXRQbGF5ZXJBcHBWYWx1ZVRleHRSZXNwb25zZSgKLSAgICAgIFN0cmluZzgoYWRkcikuc3RyaW5nKCksIG5vbl9iaW5kZXIpKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpHZXRFbGVtZW50QXR0clJlc3BvbnNlKAotICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBhZGRyLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhBdnJjcFN0cmluZ1ZhbHVlPiYgYXR0cnMsCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIGF1dG8gYXZyY3BfdGFyZ2V0ID0gVFJZX0dFVF9UQVJHRVQoKTsKLSAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpBdnJjcFN0cmluZ1ZhbHVlPiBub25fYmluZGVyOwotICBub25fYmluZGVyLnJlc2VydmUoYXR0cnMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiB2YWwgOiBhdHRycykgewotICAgIG5vbl9iaW5kZXIucHVzaF9iYWNrKHZhbCk7Ci0gIH0KLSAgVFJZX1JFVF9GVU5DKAotICAgICAgYXZyY3BfdGFyZ2V0LT5HZXRFbGVtZW50QXR0clJlc3BvbnNlKFN0cmluZzgoYWRkcikuc3RyaW5nKCksIG5vbl9iaW5kZXIpKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpTZXRQbGF5ZXJBcHBWYWx1ZVJlc3BvbnNlKAotICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBhZGRyLCBpbnQzMl90IHJzcF9zdGF0dXMsIGJvb2wqIF9haWRsX3JldHVybikgewotICBhdXRvIGF2cmNwX3RhcmdldCA9IFRSWV9HRVRfVEFSR0VUKCk7Ci0gIFRSWV9SRVRfRlVOQyhhdnJjcF90YXJnZXQtPlNldFBsYXllckFwcFZhbHVlUmVzcG9uc2UoU3RyaW5nOChhZGRyKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3Bfc3RhdHVzKSk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6UmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSgKLSAgICBpbnQzMl90IGV2ZW50X2lkLCBpbnQzMl90IHR5cGUsCi0gICAgY29uc3QgOjphbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEF2cmNwUmVnaXN0ZXJOb3RpZmljYXRpb25SZXNwb25zZSYKLSAgICAgICAgcGFyYW0sCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIGF1dG8gYXZyY3BfdGFyZ2V0ID0gVFJZX0dFVF9UQVJHRVQoKTsKLSAgVFJZX1JFVF9GVU5DKAotICAgICAgYXZyY3BfdGFyZ2V0LT5SZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKGV2ZW50X2lkLCB0eXBlLCBwYXJhbSkpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6OlNldFZvbHVtZShpbnQzMl90IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBhdXRvIGF2cmNwX3RhcmdldCA9IFRSWV9HRVRfVEFSR0VUKCk7Ci0gIFRSWV9SRVRfRlVOQyhhdnJjcF90YXJnZXQtPlNldFZvbHVtZSh2b2x1bWUpKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6T25HZXRSZW1vdGVGZWF0dXJlcygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBmZWF0dXJlcykgewotICBMb2NrR3VhcmQgbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGNiID0gVFJZX0dFVF9DQigpOwotICBjYi0+T25HZXRSZW1vdGVGZWF0dXJlcyhTdHJpbmcxNihhZGRyLmRhdGEoKSwgYWRkci5zaXplKCkpLCBmZWF0dXJlcyk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6Ok9uR2V0UGxheVN0YXR1cygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcikgewotICBMb2NrR3VhcmQgbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGNiID0gVFJZX0dFVF9DQigpOwotICBjYi0+T25HZXRQbGF5U3RhdHVzKFN0cmluZzE2KGFkZHIuZGF0YSgpLCBhZGRyLnNpemUoKSkpOwotfQotCi12b2lkIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpPbkxpc3RQbGF5ZXJBcHBBdHRyKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyKSB7Ci0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gY2IgPSBUUllfR0VUX0NCKCk7Ci0gIGNiLT5Pbkxpc3RQbGF5ZXJBcHBBdHRyKFN0cmluZzE2KGFkZHIuZGF0YSgpLCBhZGRyLnNpemUoKSkpOwotfQotCi12b2lkIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpPbkxpc3RQbGF5ZXJBcHBWYWx1ZXMoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsIGludDMyX3QgYXR0cl9pZCkgewotICBMb2NrR3VhcmQgbG9jaygqbWFwc19sb2NrKCkpOwotICBhdXRvIGNiID0gVFJZX0dFVF9DQigpOwotICBjYi0+T25MaXN0UGxheWVyQXBwVmFsdWVzKFN0cmluZzE2KGFkZHIuZGF0YSgpLCBhZGRyLnNpemUoKSksIGF0dHJfaWQpOwotfQotCi12b2lkIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpPbkdldFBsYXllckFwcFZhbHVlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXR0cnMpIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uR2V0UGxheWVyQXBwVmFsdWUoU3RyaW5nMTYoYWRkci5kYXRhKCksIGFkZHIuc2l6ZSgpKSwgYXR0cnMpOwotfQotCi12b2lkIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpPbkdldFBsYXllckFwcEF0dHJzVGV4dCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGF0dHJzKSB7Ci0gIExvY2tHdWFyZCBsb2NrKCptYXBzX2xvY2soKSk7Ci0gIGF1dG8gY2IgPSBUUllfR0VUX0NCKCk7Ci0gIGNiLT5PbkdldFBsYXllckFwcEF0dHJzVGV4dChTdHJpbmcxNihhZGRyLmRhdGEoKSwgYWRkci5zaXplKCkpLCBhdHRycyk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6Ok9uR2V0UGxheWVyQXBwVmFsdWVzVGV4dCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBhdHRyX2lkLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB2YWx1ZXMpIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uR2V0UGxheWVyQXBwVmFsdWVzVGV4dChTdHJpbmcxNihhZGRyLmRhdGEoKSwgYWRkci5zaXplKCkpLCBhdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6Ok9uU2V0UGxheWVyQXBwVmFsdWUoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpBdnJjcEludFZhbHVlPiYgdmFsdWVzKSB7Ci0gIHN0ZDo6dmVjdG9yPEJsdWV0b290aEF2cmNwSW50VmFsdWU+IGJpbmRlcl92YWx1ZXM7Ci0gIGJpbmRlcl92YWx1ZXMucmVzZXJ2ZSh2YWx1ZXMuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiB2YWwgOiB2YWx1ZXMpIHsKLSAgICBiaW5kZXJfdmFsdWVzLnB1c2hfYmFjayh2YWwpOwotICB9Ci0KLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uU2V0UGxheWVyQXBwVmFsdWUoU3RyaW5nMTYoYWRkci5kYXRhKCksIGFkZHIuc2l6ZSgpKSwgYmluZGVyX3ZhbHVlcyk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6Ok9uR2V0RWxlbWVudEF0dHJzKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXR0cnMpIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uR2V0RWxlbWVudEF0dHJzKFN0cmluZzE2KGFkZHIuZGF0YSgpLCBhZGRyLnNpemUoKSksIGF0dHJzKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6T25SZWdpc3Rlck5vdGlmaWNhdGlvbigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBldmVudF9pZCwgdWludDMyX3QgcGFyYW0pIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uUmVnaXN0ZXJOb3RpZmljYXRpb24oU3RyaW5nMTYoYWRkci5kYXRhKCksIGFkZHIuc2l6ZSgpKSwgZXZlbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKTsKLX0KLQotdm9pZCBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjo6T25Wb2x1bWVDaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3R5cGUpIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uVm9sdW1lQ2hhbmdlKFN0cmluZzE2KGFkZHIuZGF0YSgpLCBhZGRyLnNpemUoKSksIHZvbHVtZSwgY3R5cGUpOwotfQotCi12b2lkIEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpPblBhc3NUaHJvdWdoQ29tbWFuZCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBpZCwgaW50MzJfdCBrZXlfc3RhdGUpIHsKLSAgTG9ja0d1YXJkIGxvY2soKm1hcHNfbG9jaygpKTsKLSAgYXV0byBjYiA9IFRSWV9HRVRfQ0IoKTsKLSAgY2ItPk9uUGFzc1Rocm91Z2hDb21tYW5kKFN0cmluZzE2KGFkZHIuZGF0YSgpLCBhZGRyLnNpemUoKSksIGlkLCBrZXlfc3RhdGUpOwotfQotCi1hbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXZyY3BUYXJnZXRDYWxsYmFjaz4KLUJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpHZXRBdnJjcFRhcmdldENhbGxiYWNrKCkgewotICBhdXRvIGNiID0gR2V0Q2FsbGJhY2soYmx1ZXRvb3RoOjpBdnJjcFRhcmdldDo6a1NpbmdsZXRvbkluc3RhbmNlSWQpOwotICByZXR1cm4gYW5kcm9pZDo6c3A8SUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2s+KAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2sqPihjYi5nZXQoKSkpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpBdnJjcFRhcmdldD4KLUJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyOjpHZXRBdnJjcFRhcmdldCgpIHsKLSAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxibHVldG9vdGg6OkF2cmNwVGFyZ2V0PigKLSAgICAgIEdldEluc3RhbmNlKGJsdWV0b290aDo6QXZyY3BUYXJnZXQ6OmtTaW5nbGV0b25JbnN0YW5jZUlkKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXI6Ok9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoCi0gICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgY2xpZW50IElEOiAiIDw8IGluc3RhbmNlLT5HZXRJbnN0YW5jZUlkKCkKLSAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0KLSAgYmx1ZXRvb3RoOjpBdnJjcFRhcmdldCogYXZyY3BfdGFyZ2V0ID0KLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6QXZyY3BUYXJnZXQqPihpbnN0YW5jZSk7Ci0gIGF2cmNwX3RhcmdldC0+U2V0RGVsZWdhdGUodGhpcyk7Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2s+IGNiKAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2sqPihjYWxsYmFjay5nZXQoKSkpOwotICBjYi0+T25SZWdpc3RlcmVkKHN0YXR1cyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYXZyY3BfdGFyZ2V0X2JpbmRlcl9zZXJ2ZXIuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYXZyY3BfdGFyZ2V0X2JpbmRlcl9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyYmJhMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX3RhcmdldF9iaW5kZXJfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKLQotI2luY2x1ZGUgImFuZHJvaWQvYmx1ZXRvb3RoL0JuQmx1ZXRvb3RoQXZyY3BUYXJnZXQuaCIKLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXRDYWxsYmFjay5oIgotCi0jaW5jbHVkZSAic2VydmljZS9hdnJjcF90YXJnZXQuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvaW50ZXJmYWNlX3dpdGhfaW5zdGFuY2VzX2Jhc2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi1jbGFzcyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcgotICAgIDogcHVibGljIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlLAotICAgICAgcHVibGljIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhBdnJjcFRhcmdldCwKLSAgICAgIHB1YmxpYyBibHVldG9vdGg6OkF2cmNwVGFyZ2V0OjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+Qmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXIoKSBvdmVycmlkZTsKLQotICBib29sIEhhc0luc3RhbmNlKCk7Ci0KLSAgLy8gSUJsdWV0b290aEF2cmNwVGFyZ2V0IGltcGxlbWVudGF0aW9uOgotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWdpc3RlcigKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEF2cmNwVGFyZ2V0Q2FsbGJhY2s+JgotICAgICAgICAgIGNhbGxiYWNrLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVW5yZWdpc3RlcihpbnQzMl90IGlkKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgVW5yZWdpc3RlckFsbCgpIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBFbmFibGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgRGlzYWJsZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBHZXRQbGF5U3RhdHVzUmVzcG9uc2UoY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYXlfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb25nX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc29uZ19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBMaXN0UGxheWVyQXBwQXR0clJlc3BvbnNlKAotICAgICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmIGFkZHIsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhdHRycywKLSAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldFBsYXllckFwcFZhbHVlUmVzcG9uc2UoCi0gICAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgYWRkciwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BJbnRWYWx1ZT4mIHZhbHVlcywKLSAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldFBsYXllckFwcEF0dHJUZXh0UmVzcG9uc2UoCi0gICAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgYWRkciwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BTdHJpbmdWYWx1ZT4mIGF0dHJzLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgR2V0UGxheWVyQXBwVmFsdWVUZXh0UmVzcG9uc2UoCi0gICAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgYWRkciwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BTdHJpbmdWYWx1ZT4mIHZhbHVlcywKLSAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEdldEVsZW1lbnRBdHRyUmVzcG9uc2UoCi0gICAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgYWRkciwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoQXZyY3BTdHJpbmdWYWx1ZT4mIGF0dHJzLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgU2V0UGxheWVyQXBwVmFsdWVSZXNwb25zZSgKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBhZGRyLCBpbnQzMl90IHJzcF9zdGF0dXMsCi0gICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBSZWdpc3Rlck5vdGlmaWNhdGlvblJlc3BvbnNlKAotICAgICAgaW50MzJfdCBldmVudF9pZCwgaW50MzJfdCB0eXBlLAotICAgICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhBdnJjcFJlZ2lzdGVyTm90aWZpY2F0aW9uUmVzcG9uc2UmCi0gICAgICAgICAgcGFyYW0sCi0gICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBTZXRWb2x1bWUoaW50MzJfdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgLy8gYmx1ZXRvb3RoOjpibHVldG9vdGg6OkF2cmNwVGFyZ2V0OjpEZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbjoKLSAgdm9pZCBPbkdldFJlbW90ZUZlYXR1cmVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLCBpbnQzMl90IGZlYXR1cmVzKSBvdmVycmlkZTsKLSAgdm9pZCBPbkdldFBsYXlTdGF0dXMoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIpIG92ZXJyaWRlOwotICB2b2lkIE9uTGlzdFBsYXllckFwcEF0dHIoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIpIG92ZXJyaWRlOwotICB2b2lkIE9uTGlzdFBsYXllckFwcFZhbHVlcyhjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBhdHRyX2lkKSBvdmVycmlkZTsKLSAgdm9pZCBPbkdldFBsYXllckFwcFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGF0dHJzKSBvdmVycmlkZTsKLSAgdm9pZCBPbkdldFBsYXllckFwcEF0dHJzVGV4dChjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXR0cnMpIG92ZXJyaWRlOwotICB2b2lkIE9uR2V0UGxheWVyQXBwVmFsdWVzVGV4dChjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBhdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdmFsdWVzKSBvdmVycmlkZTsKLSAgdm9pZCBPblNldFBsYXllckFwcFZhbHVlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OkF2cmNwSW50VmFsdWU+JiB2YWx1ZXMpIG92ZXJyaWRlOwotICB2b2lkIE9uR2V0RWxlbWVudEF0dHJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhdHRycykgb3ZlcnJpZGU7Ci0gIHZvaWQgT25SZWdpc3Rlck5vdGlmaWNhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCBldmVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtKSBvdmVycmlkZTsKLSAgdm9pZCBPblZvbHVtZUNoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgYWRkciwgaW50MzJfdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjdHlwZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QYXNzVGhyb3VnaENvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIsIGludDMyX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrZXlfc3RhdGUpIG92ZXJyaWRlOwotCi0gIC8vIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlIG92ZXJyaWRlOgotICB2b2lkIE9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgb3ZlcnJpZGU7Ci0KLSAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoQXZyY3BUYXJnZXRDYWxsYmFjaz4KLSAgR2V0QXZyY3BUYXJnZXRDYWxsYmFjaygpOwotICBzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpBdnJjcFRhcmdldD4gR2V0QXZyY3BUYXJnZXQoKTsKLQotICBibHVldG9vdGg6OkFkYXB0ZXIqIGNvbnN0IGFkYXB0ZXJfOyAgLy8gd2VhawotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2JpbmRlcl9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2JpbmRlcl9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5N2FiYjcuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9iaW5kZXJfc2VydmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9iaW5kZXJfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYTJkcF9zaW5rX2JpbmRlcl9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2EyZHBfc291cmNlX2JpbmRlcl9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2F2cmNwX2NvbnRyb2xfYmluZGVyX3NlcnZlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYXZyY3BfdGFyZ2V0X2JpbmRlcl9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfY2xpZW50X2JpbmRlcl9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfc2VydmVyX2JpbmRlcl9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX2FkdmVydGlzZXJfYmluZGVyX3NlcnZlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbGVfc2Nhbm5lcl9iaW5kZXJfc2VydmVyLmgiCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sb3dfZW5lcmd5X2JpbmRlcl9zZXJ2ZXIuaCIKLQotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9pbnRlcmZhY2UuaCIKLQotdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aENhbGxiYWNrOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoR2F0dENsaWVudDsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEdhdHRTZXJ2ZXI7Ci0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLUJsdWV0b290aEJpbmRlclNlcnZlcjo6Qmx1ZXRvb3RoQmluZGVyU2VydmVyKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcikKLSAgICA6IGFkYXB0ZXJfKGFkYXB0ZXIpIHsKLSAgQ0hFQ0soYWRhcHRlcl8pOwotICBhZGFwdGVyXy0+QWRkT2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLUJsdWV0b290aEJpbmRlclNlcnZlcjo6fkJsdWV0b290aEJpbmRlclNlcnZlcigpIHsKLSAgYWRhcHRlcl8tPlJlbW92ZU9ic2VydmVyKHRoaXMpOwotfQotCi0vLyBiaW5kZXI6OkJuQmx1ZXRvb3RoIG92ZXJyaWRlczoKLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OklzRW5hYmxlZChib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgKl9haWRsX3JldHVybiA9IGFkYXB0ZXJfLT5Jc0VuYWJsZWQoKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6R2V0U3RhdGUoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPSBhZGFwdGVyXy0+R2V0U3RhdGUoKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6RW5hYmxlKGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICAqX2FpZGxfcmV0dXJuID0gYWRhcHRlcl8tPkVuYWJsZSgpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpFbmFibGVOb0F1dG9Db25uZWN0KGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICAvLyBUT0RPKGFybWFuc2l0byk6IEltcGxlbWVudC4KLSAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpEaXNhYmxlKGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICAqX2FpZGxfcmV0dXJuID0gYWRhcHRlcl8tPkRpc2FibGUoKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6R2V0QWRkcmVzcyg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgKl9haWRsX3JldHVybiA9IFN0cmluZzE2KFN0cmluZzgoYWRhcHRlcl8tPkdldEFkZHJlc3MoKS5jX3N0cigpKSk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldFVVSURzKAotICAgIDo6c3RkOjp2ZWN0b3I8OjphbmRyb2lkOjpibHVldG9vdGg6OlVVSUQ+KiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBJbXBsZW1lbnQuCi0gICpfYWlkbF9yZXR1cm4gPSBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpibHVldG9vdGg6OlVVSUQ+KCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OlNldE5hbWUoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPSBhZGFwdGVyXy0+U2V0TmFtZShzdGQ6OnN0cmluZyhTdHJpbmc4KG5hbWUpLnN0cmluZygpKSk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPSBTdHJpbmcxNihTdHJpbmc4KGFkYXB0ZXJfLT5HZXROYW1lKCkuY19zdHIoKSkpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpTZXRTY2FuTW9kZShpbnQzMl90IHNjYW5fbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICAqX2FpZGxfcmV0dXJuID0gYWRhcHRlcl8tPlNldFNjYW5Nb2RlKHNjYW5fbW9kZSk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OlNldFNjYW5FbmFibGUoYm9vbCBzY2FuX2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPSBhZGFwdGVyXy0+U2V0U2NhbkVuYWJsZShzY2FuX2VuYWJsZSk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OlNzcFJlcGx5KAotICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBpbnQzMl90IHZhcmlhbnQsIGJvb2wgYWNjZXB0LAotICAgIGludDMyX3QgcGFzc2tleSwgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPSBhZGFwdGVyXy0+U3NwUmVwbHkoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCksIHZhcmlhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0LCBwYXNza2V5KTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6Q3JlYXRlQm9uZCgKLSAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgaW50MzJfdCB0cmFuc3BvcnQsCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPQotICAgICAgYWRhcHRlcl8tPkNyZWF0ZUJvbmQoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCksIHRyYW5zcG9ydCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldEJvbmRlZERldmljZXMoYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPSBhZGFwdGVyXy0+R2V0Qm9uZGVkRGV2aWNlcygpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpSZW1vdmVCb25kKAotICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgKl9haWRsX3JldHVybiA9IGFkYXB0ZXJfLT5SZW1vdmVCb25kKFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLnN0cmluZygpKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6R2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcygKLSAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gICpfYWlkbF9yZXR1cm4gPQotICAgICAgYWRhcHRlcl8tPkdldFJlbW90ZURldmljZVByb3BlcnRpZXMoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCkpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpSZWdpc3RlckNhbGxiYWNrKAotICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aENhbGxiYWNrPiYgY2FsbGJhY2spIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFjYWxsYmFjay5nZXQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIlJlZ2lzdGVyQ2FsbGJhY2sgY2FsbGVkIHdpdGggTlVMTCBiaW5kZXIuIElnbm9yaW5nLiI7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotICBjYWxsYmFja3NfLlJlZ2lzdGVyKGNhbGxiYWNrKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6VW5yZWdpc3RlckNhbGxiYWNrKAotICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aENhbGxiYWNrPiYgY2FsbGJhY2spIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFjYWxsYmFjay5nZXQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIlVucmVnaXN0ZXJDYWxsYmFjayBjYWxsZWQgd2l0aCBOVUxMIGJpbmRlci4gSWdub3JpbmcuIjsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0gIGNhbGxiYWNrc18uVW5yZWdpc3RlcihjYWxsYmFjayk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OklzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICAqX2FpZGxfcmV0dXJuID0gYWRhcHRlcl8tPklzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldEEyZHBTaW5rSW50ZXJmYWNlKAotICAgIDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTaW5rPiogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFhZGFwdGVyXy0+SXNFbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJDYW5ub3Qgb2J0YWluIElCbHVldG9vdGhBMmRwU2luayBpbnRlcmZhY2Ugd2hpbGUgZGlzYWJsZWQiOwotICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIWEyZHBfc2lua19pbnRlcmZhY2VfLmdldCgpKQotICAgIGEyZHBfc2lua19pbnRlcmZhY2VfID0gbmV3IEJsdWV0b290aEEyZHBTaW5rQmluZGVyU2VydmVyKGFkYXB0ZXJfKTsKLQotICBpZiAoYTJkcF9zaW5rX2ludGVyZmFjZV8tPkhhc0luc3RhbmNlKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJPbmx5IG9uZSBBMmRwU2luayBpbnRlcmZhY2UgYWxsb3dlZCBhdCBhIHRpbWUiOwotICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAqX2FpZGxfcmV0dXJuID0gYTJkcF9zaW5rX2ludGVyZmFjZV87Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldEEyZHBTb3VyY2VJbnRlcmZhY2UoCi0gICAgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQTJkcFNvdXJjZT4qIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGlmICghYWRhcHRlcl8tPklzRW5hYmxlZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9idGFpbiBJQmx1ZXRvb3RoQTJkcFNvdXJjZSBpbnRlcmZhY2Ugd2hpbGUgZGlzYWJsZWQiOwotICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIWEyZHBfc291cmNlX2ludGVyZmFjZV8uZ2V0KCkpCi0gICAgYTJkcF9zb3VyY2VfaW50ZXJmYWNlXyA9IG5ldyBCbHVldG9vdGhBMmRwU291cmNlQmluZGVyU2VydmVyKGFkYXB0ZXJfKTsKLQotICBpZiAoYTJkcF9zb3VyY2VfaW50ZXJmYWNlXy0+SGFzSW5zdGFuY2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgIk9ubHkgb25lIEEyZHBTb3VyY2UgaW50ZXJmYWNlIGFsbG93ZWQgYXQgYSB0aW1lIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gbnVsbHB0cjsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgKl9haWRsX3JldHVybiA9IGEyZHBfc291cmNlX2ludGVyZmFjZV87Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldExvd0VuZXJneUludGVyZmFjZSgKLSAgICA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhMb3dFbmVyZ3k+KiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoIWFkYXB0ZXJfLT5Jc0VuYWJsZWQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBvYnRhaW4gSUJsdWV0b290aExvd0VuZXJneSBpbnRlcmZhY2Ugd2hpbGUgZGlzYWJsZWQiOwotICAgICpfYWlkbF9yZXR1cm4gPSBOVUxMOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIWxvd19lbmVyZ3lfaW50ZXJmYWNlXy5nZXQoKSkKLSAgICBsb3dfZW5lcmd5X2ludGVyZmFjZV8gPSBuZXcgQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyKGFkYXB0ZXJfKTsKLQotICAqX2FpZGxfcmV0dXJuID0gbG93X2VuZXJneV9pbnRlcmZhY2VfOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpHZXRMZUFkdmVydGlzZXJJbnRlcmZhY2UoCi0gICAgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyPiogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFhZGFwdGVyXy0+SXNFbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpCi0gICAgICAgIDw8ICJDYW5ub3Qgb2J0YWluIElCbHVldG9vdGhMZUFkdmVydGlzZXIgaW50ZXJmYWNlIHdoaWxlIGRpc2FibGVkIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gTlVMTDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgaWYgKCFsZV9hZHZlcnRpc2VyX2ludGVyZmFjZV8uZ2V0KCkpCi0gICAgbGVfYWR2ZXJ0aXNlcl9pbnRlcmZhY2VfID0gbmV3IEJsdWV0b290aExlQWR2ZXJ0aXNlckJpbmRlclNlcnZlcihhZGFwdGVyXyk7Ci0KLSAgKl9haWRsX3JldHVybiA9IGxlX2FkdmVydGlzZXJfaW50ZXJmYWNlXzsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6R2V0TGVTY2FubmVySW50ZXJmYWNlKAotICAgIDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aExlU2Nhbm5lcj4qIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGlmICghYWRhcHRlcl8tPklzRW5hYmxlZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9idGFpbiBJQmx1ZXRvb3RoTGVTY2FubmVyIGludGVyZmFjZSB3aGlsZSBkaXNhYmxlZCI7Ci0gICAgKl9haWRsX3JldHVybiA9IE5VTEw7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghbGVfc2Nhbm5lcl9pbnRlcmZhY2VfLmdldCgpKQotICAgIGxlX3NjYW5uZXJfaW50ZXJmYWNlXyA9IG5ldyBCbHVldG9vdGhMZVNjYW5uZXJCaW5kZXJTZXJ2ZXIoYWRhcHRlcl8pOwotCi0gICpfYWlkbF9yZXR1cm4gPSBsZV9zY2FubmVyX2ludGVyZmFjZV87Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6OkdldEdhdHRDbGllbnRJbnRlcmZhY2UoCi0gICAgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dENsaWVudD4qIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIGlmICghYWRhcHRlcl8tPklzRW5hYmxlZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9idGFpbiBJQmx1ZXRvb3RoR2F0dENsaWVudCBpbnRlcmZhY2Ugd2hpbGUgZGlzYWJsZWQiOwotICAgICpfYWlkbF9yZXR1cm4gPSBOVUxMOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICBpZiAoIWdhdHRfY2xpZW50X2ludGVyZmFjZV8uZ2V0KCkpCi0gICAgZ2F0dF9jbGllbnRfaW50ZXJmYWNlXyA9IG5ldyBCbHVldG9vdGhHYXR0Q2xpZW50QmluZGVyU2VydmVyKGFkYXB0ZXJfKTsKLQotICAqX2FpZGxfcmV0dXJuID0gZ2F0dF9jbGllbnRfaW50ZXJmYWNlXzsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6R2V0R2F0dFNlcnZlckludGVyZmFjZSgKLSAgICA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhHYXR0U2VydmVyPiogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFhZGFwdGVyXy0+SXNFbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJDYW5ub3Qgb2J0YWluIElCbHVldG9vdGhHYXR0U2VydmVyIGludGVyZmFjZSB3aGlsZSBkaXNhYmxlZCI7Ci0gICAgKl9haWRsX3JldHVybiA9IE5VTEw7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghZ2F0dF9zZXJ2ZXJfaW50ZXJmYWNlXy5nZXQoKSkKLSAgICBnYXR0X3NlcnZlcl9pbnRlcmZhY2VfID0gbmV3IEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXIoYWRhcHRlcl8pOwotCi0gICpfYWlkbF9yZXR1cm4gPSBnYXR0X3NlcnZlcl9pbnRlcmZhY2VfOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpHZXRBdnJjcENvbnRyb2xJbnRlcmZhY2UoCi0gICAgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXZyY3BDb250cm9sPiogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFhZGFwdGVyXy0+SXNFbmFibGVkKCkpIHsKLSAgICBMT0coRVJST1IpCi0gICAgICAgIDw8ICJDYW5ub3Qgb2J0YWluIElCbHVldG9vdGhBdnJjcENvbnRyb2wgaW50ZXJmYWNlIHdoaWxlIGRpc2FibGVkIjsKLSAgICAqX2FpZGxfcmV0dXJuID0gTlVMTDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgaWYgKCFhdnJjcF9jb250cm9sX2ludGVyZmFjZV8uZ2V0KCkpCi0gICAgYXZyY3BfY29udHJvbF9pbnRlcmZhY2VfID0gbmV3IEJsdWV0b290aEF2cmNwQ29udHJvbEJpbmRlclNlcnZlcihhZGFwdGVyXyk7Ci0KLSAgKl9haWRsX3JldHVybiA9IGF2cmNwX2NvbnRyb2xfaW50ZXJmYWNlXzsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEJpbmRlclNlcnZlcjo6R2V0QXZyY3BUYXJnZXRJbnRlcmZhY2UoCi0gICAgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQXZyY3BUYXJnZXQ+KiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoIWFkYXB0ZXJfLT5Jc0VuYWJsZWQoKSkgewotICAgIExPRyhFUlJPUikKLSAgICAgICAgPDwgIkNhbm5vdCBvYnRhaW4gSUJsdWV0b290aEF2cmNwVGFyZ2V0IGludGVyZmFjZSB3aGlsZSBkaXNhYmxlZCI7Ci0gICAgKl9haWRsX3JldHVybiA9IE5VTEw7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gIGlmICghYXZyY3BfdGFyZ2V0X2ludGVyZmFjZV8uZ2V0KCkpCi0gICAgYXZyY3BfdGFyZ2V0X2ludGVyZmFjZV8gPSBuZXcgQmx1ZXRvb3RoQXZyY3BUYXJnZXRCaW5kZXJTZXJ2ZXIoYWRhcHRlcl8pOwotCi0gIGlmIChhdnJjcF90YXJnZXRfaW50ZXJmYWNlXy0+SGFzSW5zdGFuY2UoKSkgewotICAgIExPRyhFUlJPUikgPDwgIk9ubHkgb25lIEFWUkNQIHRhcmdldCBpbnRlcmZhY2UgYWxsb3dlZCBhdCBhIHRpbWUiOwotICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAqX2FpZGxfcmV0dXJuID0gYXZyY3BfdGFyZ2V0X2ludGVyZmFjZV87Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IEJsdWV0b290aEJpbmRlclNlcnZlcjo6ZHVtcCgKLSAgICBpbnQgZmQsIGNvbnN0IGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxlZCB3aXRoIGZkICIgPDwgZmQ7Ci0gIGlmIChhcmdzLnNpemUoKSA+IDApIHsKLSAgICAvLyBUT0RPIChqYW11cmFhKTogUGFyc2UgYXJndW1lbnRzIGFuZCBzd2l0Y2ggb24gLS1wcm90bywgLS1wcm90b190ZXh0Ci0gICAgZm9yIChjb25zdCBhdXRvJiB4IDogYXJncykgewotICAgICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiYXJndW1lbnQ6ICIgPDwgeC5zdHJpbmcoKTsKLSAgICB9Ci0gIH0KLSAgLy8gVE9ETyAoamFtdXJhYSk6IGVudW1lcmF0ZSBwcm9maWxlcyBhbmQgZHVtcCBwcm9maWxlIGluZm9ybWF0aW9uCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBpZmFjZSA9Ci0gICAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMSW50ZXJmYWNlKCk7Ci0gIGlmYWNlLT5kdW1wKGZkLCBOVUxMKTsKLSAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwotfQotCi12b2lkIEJsdWV0b290aEJpbmRlclNlcnZlcjo6T25BZGFwdGVyU3RhdGVDaGFuZ2VkKAotICAgIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwgYmx1ZXRvb3RoOjpBZGFwdGVyU3RhdGUgcHJldl9zdGF0ZSwKLSAgICBibHVldG9vdGg6OkFkYXB0ZXJTdGF0ZSBuZXdfc3RhdGUpIHsKLSAgQ0hFQ0tfRVEoYWRhcHRlciwgYWRhcHRlcl8pOwotICBWTE9HKDIpIDw8ICJSZWNlaXZlZCBhZGFwdGVyIHN0YXRlIHVwZGF0ZSAtIHByZXY6ICIgPDwgcHJldl9zdGF0ZQotICAgICAgICAgIDw8ICIgbmV3OiAiIDw8IG5ld19zdGF0ZTsKLSAgY2FsbGJhY2tzXy5Gb3JFYWNoKFtwcmV2X3N0YXRlLCBuZXdfc3RhdGVdKElCbHVldG9vdGhDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgICBjYWxsYmFjay0+T25CbHVldG9vdGhTdGF0ZUNoYW5nZShwcmV2X3N0YXRlLCBuZXdfc3RhdGUpOwotICB9KTsKLX0KLQotdm9pZCBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6Ok9uRGV2aWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCgKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICBib29sIGNvbm5lY3RlZCkgewotICBDSEVDS19FUShhZGFwdGVyLCBhZGFwdGVyXyk7Ci0gIGF1dG8gYWRkcl9zMTYgPSBTdHJpbmcxNihkZXZpY2VfYWRkcmVzcy5jX3N0cigpLCBkZXZpY2VfYWRkcmVzcy5zaXplKCkpOwotICBjYWxsYmFja3NfLkZvckVhY2goWyZhZGRyX3MxNiwgY29ubmVjdGVkXShJQmx1ZXRvb3RoQ2FsbGJhY2sqIGNhbGxiYWNrKSB7Ci0gICAgY2FsbGJhY2stPk9uRGV2aWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChhZGRyX3MxNiwgY29ubmVjdGVkKTsKLSAgfSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpPblNjYW5FbmFibGVDaGFuZ2VkKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2Nhbl9lbmFibGVkKSB7Ci0gIENIRUNLX0VRKGFkYXB0ZXIsIGFkYXB0ZXJfKTsKLSAgY2FsbGJhY2tzXy5Gb3JFYWNoKFtzY2FuX2VuYWJsZWRdKElCbHVldG9vdGhDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgICBjYWxsYmFjay0+T25TY2FuRW5hYmxlQ2hhbmdlZChzY2FuX2VuYWJsZWQpOwotICB9KTsKLX0KLQotdm9pZCBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6Ok9uU3NwUmVxdWVzdChibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kLCBpbnQgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzc19rZXkpIHsKLSAgQ0hFQ0tfRVEoYWRhcHRlciwgYWRhcHRlcl8pOwotICBWTE9HKDIpIDw8ICJSZWNlaXZlZCBzc3AgcmVxdWVzdDogZGV2aWNlX2FkZHJlc3M6ICIgPDwgZGV2aWNlX2FkZHJlc3MKLSAgICAgICAgICA8PCAiLCBkZXZpY2VfbmFtZTogIiA8PCBkZXZpY2VfbmFtZSA8PCAiLCBjb2Q6ICIgPDwgY29kCi0gICAgICAgICAgPDwgIiwgcGFpcmluZ192YXJpYW50OiAiIDw8IHBhaXJpbmdfdmFyaWFudAotICAgICAgICAgIDw8ICIsIHBhc3Nfa2V5OiAiIDw8IHBhc3Nfa2V5OwotCi0gIGFuZHJvaWQ6OlN0cmluZzE2IGFkZHJfczE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCkpOwotICBhbmRyb2lkOjpTdHJpbmcxNiBuYW1lX3MxNihkZXZpY2VfbmFtZS5jX3N0cigpKTsKLSAgY2FsbGJhY2tzXy5Gb3JFYWNoKFsmYWRkcl9zMTYsICZuYW1lX3MxNiwgY29kLCBwYWlyaW5nX3ZhcmlhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgcGFzc19rZXldKElCbHVldG9vdGhDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgICBjYWxsYmFjay0+T25Tc3BSZXF1ZXN0KGFkZHJfczE2LCBuYW1lX3MxNiwgY29kLCBwYWlyaW5nX3ZhcmlhbnQsIHBhc3Nfa2V5KTsKLSAgfSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpPbkJvbmRTdGF0ZUNoYW5nZWQoCi0gICAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyLCBpbnQgc3RhdHVzLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgaW50IHN0YXRlKSB7Ci0gIENIRUNLX0VRKGFkYXB0ZXIsIGFkYXB0ZXJfKTsKLSAgVkxPRygyKSA8PCAiUmVjZWl2ZWQgIiA8PCBfX2Z1bmNfXyA8PCAiICIKLSAgICAgICAgICA8PCAic3RhdHVzOiAiIDw8IHN0YXR1cyA8PCAiLCBkZXZpY2VfYWRkcmVzczogIiA8PCBkZXZpY2VfYWRkcmVzcwotICAgICAgICAgIDw8ICIsIHN0YXRlOiAiIDw8IHN0YXRlOwotICBhbmRyb2lkOjpTdHJpbmcxNiBhZGRyX3MxNihkZXZpY2VfYWRkcmVzcy5jX3N0cigpLCBkZXZpY2VfYWRkcmVzcy5zaXplKCkpOwotICBjYWxsYmFja3NfLkZvckVhY2goW3N0YXR1cywgJmFkZHJfczE2LCBzdGF0ZV0oSUJsdWV0b290aENhbGxiYWNrKiBjYWxsYmFjaykgewotICAgIGNhbGxiYWNrLT5PbkJvbmRTdGF0ZUNoYW5nZWQoc3RhdHVzLCBhZGRyX3MxNiwgc3RhdGUpOwotICB9KTsKLX0KLQotdm9pZCBCbHVldG9vdGhCaW5kZXJTZXJ2ZXI6Ok9uR2V0Qm9uZGVkRGV2aWNlcygKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsIGludCBzdGF0dXMsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBib25kZWRfZGV2aWNlcykgewotICBDSEVDS19FUShhZGFwdGVyLCBhZGFwdGVyXyk7Ci0gIFZMT0coMikgPDwgIlJlY2VpdmVkICIgPDwgX19mdW5jX187Ci0gIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OlN0cmluZzE2PiBkZXZpY2VzX3MxNjsKLSAgZGV2aWNlc19zMTYucmVzZXJ2ZShib25kZWRfZGV2aWNlcy5zaXplKCkpOwotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGJvbmRlZF9kZXZpY2VzKQotICAgIGRldmljZXNfczE2LmVtcGxhY2VfYmFjayhkZXZpY2UuY19zdHIoKSwgZGV2aWNlLnNpemUoKSk7Ci0KLSAgY2FsbGJhY2tzXy5Gb3JFYWNoKFtzdGF0dXMsICZkZXZpY2VzX3MxNl0oSUJsdWV0b290aENhbGxiYWNrKiBjYWxsYmFjaykgewotICAgIGNhbGxiYWNrLT5PbkdldEJvbmRlZERldmljZXMoc3RhdHVzLCBkZXZpY2VzX3MxNik7Ci0gIH0pOwotfQotCi12b2lkIEJsdWV0b290aEJpbmRlclNlcnZlcjo6T25HZXRSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzKAotICAgIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwgaW50IHN0YXR1cywgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgIGNvbnN0IGJsdWV0b290aDo6UmVtb3RlRGV2aWNlUHJvcHMmIHByb3BlcnRpZXMpIHsKLSAgQ0hFQ0tfRVEoYWRhcHRlciwgYWRhcHRlcl8pOwotICBWTE9HKDIpIDw8ICJSZWNlaXZlZCAiIDw8IF9fZnVuY19fIDw8ICIgIgotICAgICAgICAgIDw8ICJzdGF0dXM6ICIgPDwgc3RhdHVzIDw8ICIsIGRldmljZV9hZGRyZXNzOiAiIDw8IGRldmljZV9hZGRyZXNzOwotICBhbmRyb2lkOjpTdHJpbmcxNiBhZGRyX3MxNihkZXZpY2VfYWRkcmVzcy5jX3N0cigpLCBkZXZpY2VfYWRkcmVzcy5zaXplKCkpOwotICBhdXRvIGJpbmRlcl9wcm9wcyA9Ci0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aFJlbW90ZURldmljZVByb3BzKHByb3BlcnRpZXMpOwotICBjYWxsYmFja3NfLkZvckVhY2goCi0gICAgICBbc3RhdHVzLCAmYWRkcl9zMTYsICZiaW5kZXJfcHJvcHNdKElCbHVldG9vdGhDYWxsYmFjayogY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2stPk9uR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcyhzdGF0dXMsIGFkZHJfczE2LCBiaW5kZXJfcHJvcHMpOwotICAgICAgfSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQmluZGVyU2VydmVyOjpPbkRldmljZUZvdW5kKAotICAgIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwKLSAgICBjb25zdCBibHVldG9vdGg6OlJlbW90ZURldmljZVByb3BzJiBwcm9wZXJ0aWVzKSB7Ci0gIENIRUNLX0VRKGFkYXB0ZXIsIGFkYXB0ZXJfKTsKLSAgVkxPRygyKSA8PCAiUmVjZWl2ZWQgIiA8PCBfX2Z1bmNfXyA8PCAiICI7Ci0gIGF1dG8gYmluZGVyX3Byb3BzID0KLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoUmVtb3RlRGV2aWNlUHJvcHMocHJvcGVydGllcyk7Ci0gIGNhbGxiYWNrc18uRm9yRWFjaChbJmJpbmRlcl9wcm9wc10oSUJsdWV0b290aENhbGxiYWNrKiBjYWxsYmFjaykgewotICAgIGNhbGxiYWNrLT5PbkRldmljZUZvdW5kKGJpbmRlcl9wcm9wcyk7Ci0gIH0pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2JpbmRlcl9zZXJ2ZXIuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYmluZGVyX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTMxZThiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYmluZGVyX3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGguaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNpbmsuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcFNvdXJjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBdnJjcENvbnRyb2wuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQXZyY3BUYXJnZXQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoR2F0dENsaWVudC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhHYXR0U2VydmVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlQWR2ZXJ0aXNlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhMZVNjYW5uZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTG93RW5lcmd5Lmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInNlcnZpY2UvYWRhcHRlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9yZW1vdGVfY2FsbGJhY2tfbGlzdC5oIgotCi11c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKLXVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwotCi11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoQTJkcFNpbms7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhBMmRwU291cmNlOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoQXZyY3BDb250cm9sOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoQXZyY3BUYXJnZXQ7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhDYWxsYmFjazsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEdhdHRDbGllbnQ7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhHYXR0U2VydmVyOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoTGVTY2FubmVyOwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoTG93RW5lcmd5OwotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi1jbGFzcyBCbHVldG9vdGhBMmRwU2lua0JpbmRlclNlcnZlcjsKLWNsYXNzIEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI7Ci1jbGFzcyBCbHVldG9vdGhBdnJjcFRhcmdldEJpbmRlclNlcnZlcjsKLQotLy8gSW1wbGVtZW50cyB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIElCbHVldG9vdGggQmluZGVyIGludGVyZmFjZS4KLWNsYXNzIEJsdWV0b290aEJpbmRlclNlcnZlciA6IHB1YmxpYyBCbkJsdWV0b290aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBibHVldG9vdGg6OkFkYXB0ZXI6Ok9ic2VydmVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJsdWV0b290aEJpbmRlclNlcnZlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+Qmx1ZXRvb3RoQmluZGVyU2VydmVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSUJsdWV0b290aCBvdmVycmlkZXM6Ci0gIFN0YXR1cyBJc0VuYWJsZWQoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldFN0YXRlKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBFbmFibGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEVuYWJsZU5vQXV0b0Nvbm5lY3QoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIERpc2FibGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICBTdGF0dXMgR2V0QWRkcmVzcyg6OmFuZHJvaWQ6OlN0cmluZzE2KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBTdGF0dXMgR2V0VVVJRHMoCi0gICAgICA6OnN0ZDo6dmVjdG9yPDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjpVVUlEPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFNldE5hbWUoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgbmFtZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldE5hbWUoOjphbmRyb2lkOjpTdHJpbmcxNiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFNldFNjYW5Nb2RlKGludDMyX3Qgc2Nhbl9tb2RlLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBTdGF0dXMgU2V0U2NhbkVuYWJsZShib29sIHNjYW5fZW5hYmxlLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBTdGF0dXMgU3NwUmVwbHkoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsIGludDMyX3QgdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYWNjZXB0LCBpbnQzMl90IHBhc3NrZXksIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBDcmVhdGVCb25kKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zcG9ydCwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldEJvbmRlZERldmljZXMoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFJlbW92ZUJvbmQoY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBHZXRSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzKGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gIFN0YXR1cyBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoQ2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBVbnJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhDYWxsYmFjaz4mIGNhbGxiYWNrKSBvdmVycmlkZTsKLSAgU3RhdHVzIElzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBHZXRBMmRwU2lua0ludGVyZmFjZSgKLSAgICAgIDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aEEyZHBTaW5rPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldEEyZHBTb3VyY2VJbnRlcmZhY2UoCi0gICAgICA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhBMmRwU291cmNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldExvd0VuZXJneUludGVyZmFjZSgKLSAgICAgIDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aExvd0VuZXJneT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBHZXRMZUFkdmVydGlzZXJJbnRlcmZhY2UoCi0gICAgICA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBTdGF0dXMgR2V0TGVTY2FubmVySW50ZXJmYWNlKAotICAgICAgOjphbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTGVTY2FubmVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldEdhdHRDbGllbnRJbnRlcmZhY2UoCi0gICAgICA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhHYXR0Q2xpZW50PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldEdhdHRTZXJ2ZXJJbnRlcmZhY2UoCi0gICAgICA6OmFuZHJvaWQ6OnNwPElCbHVldG9vdGhHYXR0U2VydmVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIEdldEF2cmNwQ29udHJvbEludGVyZmFjZSgKLSAgICAgIDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aEF2cmNwQ29udHJvbD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBHZXRBdnJjcFRhcmdldEludGVyZmFjZSgKLSAgICAgIDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aEF2cmNwVGFyZ2V0PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICBhbmRyb2lkOjpzdGF0dXNfdCBkdW1wKAotICAgICAgaW50IGZkLCBjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKLQotICAvLyBibHVldG9vdGg6OkFkYXB0ZXI6Ok9ic2VydmVyIG92ZXJyaWRlczoKLSAgdm9pZCBPbkFkYXB0ZXJTdGF0ZUNoYW5nZWQoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkFkYXB0ZXJTdGF0ZSBwcmV2X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkFkYXB0ZXJTdGF0ZSBuZXdfc3RhdGUpIG92ZXJyaWRlOwotCi0gIHZvaWQgT25EZXZpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBPblNjYW5FbmFibGVDaGFuZ2VkKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2Nhbl9lbmFibGVkKSBvdmVycmlkZTsKLQotICB2b2lkIE9uU3NwUmVxdWVzdChibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lLCBpbnQgY29kLAotICAgICAgICAgICAgICAgICAgICBpbnQgcGFpcmluZ192YXJpYW50LCBpbnQgcGFzc19rZXkpIG92ZXJyaWRlOwotCi0gIHZvaWQgT25Cb25kU3RhdGVDaGFuZ2VkKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUpIG92ZXJyaWRlOwotICB2b2lkIE9uR2V0Qm9uZGVkRGV2aWNlcygKLSAgICAgIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwgaW50IHN0YXR1cywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYm9uZGVkX2RldmljZXMpIG92ZXJyaWRlOwotICB2b2lkIE9uR2V0UmVtb3RlRGV2aWNlUHJvcGVydGllcygKLSAgICAgIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwgaW50IHN0YXR1cywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgIGNvbnN0IGJsdWV0b290aDo6UmVtb3RlRGV2aWNlUHJvcHMmIHByb3BlcnRpZXMpIG92ZXJyaWRlOwotICB2b2lkIE9uRGV2aWNlRm91bmQoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpSZW1vdGVEZXZpY2VQcm9wcyYgcHJvcGVydGllcykgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXJfOyAgLy8gd2VhawotICBSZW1vdGVDYWxsYmFja0xpc3Q8SUJsdWV0b290aENhbGxiYWNrPiBjYWxsYmFja3NfOwotCi0gIC8vIFRoZSBJQmx1ZXRvb3RoQTJkcFNpbmsgaW50ZXJmYWNlIGhhbmRsZS4gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgb24gdGhlCi0gIC8vIGZpcnN0IGNhbGwgdG8gR2V0QTJkcFNpbmtJbnRlcmZhY2UoKS4KLSAgYW5kcm9pZDo6c3A8Qmx1ZXRvb3RoQTJkcFNpbmtCaW5kZXJTZXJ2ZXI+IGEyZHBfc2lua19pbnRlcmZhY2VfOwotCi0gIC8vIFRoZSBJQmx1ZXRvb3RoQTJkcFNvdXJjZSBpbnRlcmZhY2UgaGFuZGxlLiBUaGlzIGlzIGxhemlseSBpbml0aWFsaXplZCBvbgotICAvLyB0aGUgZmlyc3QgY2FsbCB0byBHZXRBMmRwU291cmNlSW50ZXJmYWNlKCkuCi0gIGFuZHJvaWQ6OnNwPEJsdWV0b290aEEyZHBTb3VyY2VCaW5kZXJTZXJ2ZXI+IGEyZHBfc291cmNlX2ludGVyZmFjZV87Ci0KLSAgLy8gVGhlIElCbHVldG9vdGhMb3dFbmVyZ3kgaW50ZXJmYWNlIGhhbmRsZS4gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgb24gdGhlCi0gIC8vIGZpcnN0IGNhbGwgdG8gR2V0TG93RW5lcmd5SW50ZXJmYWNlKCkuCi0gIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMb3dFbmVyZ3k+IGxvd19lbmVyZ3lfaW50ZXJmYWNlXzsKLQotICAvLyBUaGUgSUJsdWV0b290aExlQWR2ZXJ0aXNlciBpbnRlcmZhY2UgaGFuZGxlLiBUaGlzIGlzIGxhemlseSBpbml0aWFsaXplZCBvbgotICAvLyB0aGUgZmlyc3QgY2FsbCB0byBHZXRMZUFkdmVydGlzZXJJbnRlcmZhY2UoKS4KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aExlQWR2ZXJ0aXNlcj4gbGVfYWR2ZXJ0aXNlcl9pbnRlcmZhY2VfOwotCi0gIC8vIFRoZSBJQmx1ZXRvb3RoTGVTY2FubmVyIGludGVyZmFjZSBoYW5kbGUuIFRoaXMgaXMgbGF6aWx5IGluaXRpYWxpemVkIG9uIHRoZQotICAvLyBmaXJzdCBjYWxsIHRvIEdldExlU2Nhbm5lckludGVyZmFjZSgpLgotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTGVTY2FubmVyPiBsZV9zY2FubmVyX2ludGVyZmFjZV87Ci0KLSAgLy8gVGhlIElCbHVldG9vdGhHYXR0Q2xpZW50IGludGVyZmFjZSBoYW5kbGUuIFRoaXMgaXMgbGF6aWx5IGluaXRpYWxpemVkIG9uCi0gIC8vIHRoZSBmaXJzdCBjYWxsIHRvIEdldEdhdHRDbGllbnRJbnRlcmZhY2UoKS4KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEdhdHRDbGllbnQ+IGdhdHRfY2xpZW50X2ludGVyZmFjZV87Ci0KLSAgLy8gVGhlIElCbHVldG9vdGhHYXR0U2VydmVyIGludGVyZmFjZSBoYW5kbGUuIFRoaXMgaXMgbGF6aWx5IGluaXRpYWxpemVkIG9uCi0gIC8vIHRoZSBmaXJzdCBjYWxsIHRvIEdldEdhdHRTZXJ2ZXJJbnRlcmZhY2UoKS4KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aEdhdHRTZXJ2ZXI+IGdhdHRfc2VydmVyX2ludGVyZmFjZV87Ci0KLSAgLy8gVGhlIElCbHVldG9vdGhBdnJjcENvbnRyb2wgaW50ZXJmYWNlIGhhbmRsZS4gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgb24KLSAgLy8gdGhlIGZpcnN0IGNhbGwgdG8gR2V0QXZyY3BDb250cm9sSW50ZXJmYWNlKCkuCi0gIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhBdnJjcENvbnRyb2w+IGF2cmNwX2NvbnRyb2xfaW50ZXJmYWNlXzsKLQotICAvLyBUaGUgSUJsdWV0b290aEF2cmNwVGFyZ2V0IGludGVyZmFjZSBoYW5kbGUuIFRoaXMgaXMgbGF6aWx5IGluaXRpYWxpemVkIG9uCi0gIC8vIHRoZSBmaXJzdCBjYWxsIHRvIEdldEF2cmNwVGFyZ2V0SW50ZXJmYWNlKCkuCi0gIGFuZHJvaWQ6OnNwPEJsdWV0b290aEF2cmNwVGFyZ2V0QmluZGVyU2VydmVyPiBhdnJjcF90YXJnZXRfaW50ZXJmYWNlXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoQmluZGVyU2VydmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfZ2F0dF9jbGllbnRfYmluZGVyX3NlcnZlci5jYyBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfZ2F0dF9jbGllbnRfYmluZGVyX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNzY3Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfY2xpZW50X2JpbmRlcl9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfZ2F0dF9jbGllbnRfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrOwotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi1uYW1lc3BhY2UgewotY29uc3QgaW50IGtJbnZhbGlkSW5zdGFuY2VJZCA9IC0xOwotfSAgLy8gbmFtZXNwYWNlCi0KLUJsdWV0b290aEdhdHRDbGllbnRCaW5kZXJTZXJ2ZXI6OkJsdWV0b290aEdhdHRDbGllbnRCaW5kZXJTZXJ2ZXIoCi0gICAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKQotICAgIDogYWRhcHRlcl8oYWRhcHRlcikgewotICBDSEVDSyhhZGFwdGVyXyk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhHYXR0Q2xpZW50QmluZGVyU2VydmVyOjpSZWdpc3RlckNsaWVudCgKLSAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgYmx1ZXRvb3RoOjpHYXR0Q2xpZW50RmFjdG9yeSogZ2F0dF9jbGllbnRfZmFjdG9yeSA9Ci0gICAgICBhZGFwdGVyXy0+R2V0R2F0dENsaWVudEZhY3RvcnkoKTsKLQotICAqX2FpZGxfcmV0dXJuID0gUmVnaXN0ZXJJbnN0YW5jZUJhc2UoY2FsbGJhY2ssIGdhdHRfY2xpZW50X2ZhY3RvcnkpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoR2F0dENsaWVudEJpbmRlclNlcnZlcjo6VW5yZWdpc3RlckNsaWVudChpbnQgY2xpZW50X2lkKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFVucmVnaXN0ZXJJbnN0YW5jZUJhc2UoY2xpZW50X2lkKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEdhdHRDbGllbnRCaW5kZXJTZXJ2ZXI6OlVucmVnaXN0ZXJBbGwoKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFVucmVnaXN0ZXJBbGxCYXNlKCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLWFuZHJvaWQ6OnNwPElCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2s+Ci1CbHVldG9vdGhHYXR0Q2xpZW50QmluZGVyU2VydmVyOjpHZXRHYXR0Q2xpZW50Q2FsbGJhY2soaW50IGNsaWVudF9pZCkgewotICBhdXRvIGNiID0gR2V0Q2FsbGJhY2soY2xpZW50X2lkKTsKLSAgcmV0dXJuIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2s+KAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjayo+KGNiLmdldCgpKSk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OkdhdHRDbGllbnQ+Ci1CbHVldG9vdGhHYXR0Q2xpZW50QmluZGVyU2VydmVyOjpHZXRHYXR0Q2xpZW50KGludCBjbGllbnRfaWQpIHsKLSAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxibHVldG9vdGg6OkdhdHRDbGllbnQ+KAotICAgICAgR2V0SW5zdGFuY2UoY2xpZW50X2lkKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dENsaWVudEJpbmRlclNlcnZlcjo6T25SZWdpc3Rlckluc3RhbmNlSW1wbCgKLSAgICBibHVldG9vdGg6OkJMRVN0YXR1cyBzdGF0dXMsIGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgIGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2UqIGluc3RhbmNlKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBjbGllbnQgSUQ6ICIgPDwgaW5zdGFuY2UtPkdldEluc3RhbmNlSWQoKQotICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLQotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrPiBjYigKLSAgICAgIHN0YXRpY19jYXN0PElCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2sqPihjYWxsYmFjay5nZXQoKSkpOwotICBjYi0+T25DbGllbnRSZWdpc3RlcmVkKHN0YXR1cywgKHN0YXR1cyA9PSBibHVldG9vdGg6OkJMRV9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGluc3RhbmNlLT5HZXRJbnN0YW5jZUlkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtJbnZhbGlkSW5zdGFuY2VJZCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfZ2F0dF9jbGllbnRfYmluZGVyX3NlcnZlci5oIGIvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9nYXR0X2NsaWVudF9iaW5kZXJfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjhiNjAuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9nYXR0X2NsaWVudF9iaW5kZXJfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhHYXR0Q2xpZW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjay5oPgotCi0jaW5jbHVkZSAic2VydmljZS9nYXR0X2NsaWVudC5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oIgotCi11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoR2F0dENsaWVudDsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEdhdHRDbGllbnRDYWxsYmFjazsKLQotdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgSUJsdWV0b290aEdhdHRDbGllbnQgaW50ZXJmYWNlLgotY2xhc3MgQmx1ZXRvb3RoR2F0dENsaWVudEJpbmRlclNlcnZlciA6IHB1YmxpYyBCbkJsdWV0b290aEdhdHRDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJsdWV0b290aEdhdHRDbGllbnRCaW5kZXJTZXJ2ZXIoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKTsKLSAgfkJsdWV0b290aEdhdHRDbGllbnRCaW5kZXJTZXJ2ZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gSUJsdWV0b290aEdhdHRDbGllbnQgb3ZlcnJpZGVzOgotICBTdGF0dXMgUmVnaXN0ZXJDbGllbnQoCi0gICAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBTdGF0dXMgVW5yZWdpc3RlckNsaWVudChpbnQgY2xpZW50X2lkKSBvdmVycmlkZTsKLSAgU3RhdHVzIFVucmVnaXN0ZXJBbGwoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBJQmx1ZXRvb3RoR2F0dENsaWVudENhbGxiYWNrIGluc3RhbmNlCi0gIC8vIGFzc29jaWF0ZWQgd2l0aCB8Y2xpZW50X2lkfC4gUmV0dXJucyBOVUxMIGlmIHN1Y2ggYSBjYWxsYmFjayBjYW5ub3QgYmUKLSAgLy8gZm91bmQuCi0gIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhHYXR0Q2xpZW50Q2FsbGJhY2s+IEdldEdhdHRDbGllbnRDYWxsYmFjaygKLSAgICAgIGludCBjbGllbnRfaWQpOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBHYXR0Q2xpZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB8Y2xpZW50X2lkfC4KLSAgLy8gUmV0dXJucyBOVUxMIGlmIHN1Y2ggYSBjbGllbnQgY2Fubm90IGJlIGZvdW5kLgotICBzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpHYXR0Q2xpZW50PiBHZXRHYXR0Q2xpZW50KGludCBjbGllbnRfaWQpOwotCi0gIC8vIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlIG92ZXJyaWRlOgotICB2b2lkIE9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgb3ZlcnJpZGU7Ci0KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyXzsgIC8vIHdlYWsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoR2F0dENsaWVudEJpbmRlclNlcnZlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfc2VydmVyX2JpbmRlcl9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfc2VydmVyX2JpbmRlcl9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmZlZjcuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9nYXR0X3NlcnZlcl9iaW5kZXJfc2VydmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9nYXR0X3NlcnZlcl9iaW5kZXJfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvYWRhcHRlci5oIgotCi11c2luZyA6OmFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyA6OmFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLQotdXNpbmcgOjphbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2s7Ci0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga0ludmFsaWRJbnN0YW5jZUlkID0gLTE7Ci19ICAvLyBuYW1lc3BhY2UKLQotQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcjo6Qmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcigKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIENIRUNLKGFkYXB0ZXJfKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXI6OlJlZ2lzdGVyU2VydmVyKAotICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8SUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBibHVldG9vdGg6OkdhdHRTZXJ2ZXJGYWN0b3J5KiBnYXR0X3NlcnZlcl9mYWN0b3J5ID0KLSAgICAgIGFkYXB0ZXJfLT5HZXRHYXR0U2VydmVyRmFjdG9yeSgpOwotCi0gICpfYWlkbF9yZXR1cm4gPSBSZWdpc3Rlckluc3RhbmNlQmFzZShjYWxsYmFjaywgZ2F0dF9zZXJ2ZXJfZmFjdG9yeSk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhHYXR0U2VydmVyQmluZGVyU2VydmVyOjpVbnJlZ2lzdGVyU2VydmVyKGludCBzZXJ2ZXJfaWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVW5yZWdpc3Rlckluc3RhbmNlQmFzZShzZXJ2ZXJfaWQpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcjo6VW5yZWdpc3RlckFsbCgpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVW5yZWdpc3RlckFsbEJhc2UoKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXI6OkFkZFNlcnZpY2UoCi0gICAgaW50IHNlcnZlcl9pZCwgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0U2VydmljZSYgc2VydmljZSwKLSAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIGdhdHRfc2VydmVyID0gR2V0R2F0dFNlcnZlcihzZXJ2ZXJfaWQpOwotICBpZiAoIWdhdHRfc2VydmVyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBzZXJ2ZXJfaWQ6ICIgPDwgc2VydmVyX2lkOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgd2VhayBwb2ludGVyIGFuZCBwYXNzIHRoYXQgdG8gdGhlIGNhbGxiYWNrIHRvIHByZXZlbnQgYSBwb3RlbnRpYWwKLSAgLy8gdXNlIGFmdGVyIGZyZWUuCi0gIGFuZHJvaWQ6OndwPEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXI+IHdlYWtfcHRyX3RvX3RoaXModGhpcyk7Ci0gIGF1dG8gY2FsbGJhY2sgPSBbPV0oYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6U2VydmljZSYgc2VydmljZSkgewotICAgIGF1dG8gc3BfdG9fdGhpcyA9IHdlYWtfcHRyX3RvX3RoaXMucHJvbW90ZSgpOwotICAgIGlmICghc3BfdG9fdGhpcy5nZXQoKSkgewotICAgICAgVkxPRygyKSA8PCAiQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyIHdhcyBkZWxldGVkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gICAgYXV0byBnYXR0X2NiID0gR2V0R2F0dFNlcnZlckNhbGxiYWNrKHNlcnZlcl9pZCk7Ci0gICAgaWYgKCFnYXR0X2NiLmdldCgpKSB7Ci0gICAgICBWTE9HKDIpIDw8ICJUaGUgY2FsbGJhY2sgd2FzIGRlbGV0ZWQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdhdHRfY2ItPk9uU2VydmljZUFkZGVkKHN0YXR1cywgc2VydmljZSk7Ci0gIH07Ci0KLSAgaWYgKCFnYXR0X3NlcnZlci0+QWRkU2VydmljZShzZXJ2aWNlLCBjYWxsYmFjaykpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWRkIHNlcnZpY2UiOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhHYXR0U2VydmVyQmluZGVyU2VydmVyOjpTZW5kUmVzcG9uc2UoCi0gICAgaW50IHNlcnZlcl9pZCwgY29uc3QgU3RyaW5nMTYmIGRldmljZV9hZGRyZXNzLCBpbnQgcmVxdWVzdF9pZCwgaW50IHN0YXR1cywKLSAgICBpbnQgb2Zmc2V0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gIGF1dG8gZ2F0dF9zZXJ2ZXIgPSBHZXRHYXR0U2VydmVyKHNlcnZlcl9pZCk7Ci0gIGlmICghZ2F0dF9zZXJ2ZXIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHNlcnZlcl9pZDogIiA8PCBzZXJ2ZXJfaWQ7Ci0gICAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAqX2FpZGxfcmV0dXJuID0gZ2F0dF9zZXJ2ZXItPlNlbmRSZXNwb25zZSgKLSAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLnN0cmluZygpKSwgcmVxdWVzdF9pZCwKLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6R0FUVEVycm9yPihzdGF0dXMpLCBvZmZzZXQsIHZhbHVlKTsKLQotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcjo6U2VuZE5vdGlmaWNhdGlvbigKLSAgICBpbnQgc2VydmVyX2lkLCBjb25zdCBTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsIGludCBoYW5kbGUsIGJvb2wgY29uZmlybSwKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gIGF1dG8gZ2F0dF9zZXJ2ZXIgPSBHZXRHYXR0U2VydmVyKHNlcnZlcl9pZCk7Ci0gIGlmICghZ2F0dF9zZXJ2ZXIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHNlcnZlcl9pZDogIiA8PCBzZXJ2ZXJfaWQ7Ci0gICAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSB3ZWFrIHBvaW50ZXIgYW5kIHBhc3MgdGhhdCB0byB0aGUgY2FsbGJhY2sgdG8gcHJldmVudCBhIHBvdGVudGlhbAotICAvLyB1c2UgYWZ0ZXIgZnJlZS4KLSAgYW5kcm9pZDo6d3A8Qmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcj4gd2Vha19wdHJfdG9fdGhpcyh0aGlzKTsKLSAgYXV0byBjYWxsYmFjayA9IFs9XShibHVldG9vdGg6OkdBVFRFcnJvciBlcnJvcikgewotICAgIGF1dG8gc3BfdG9fdGhpcyA9IHdlYWtfcHRyX3RvX3RoaXMucHJvbW90ZSgpOwotICAgIGlmICghc3BfdG9fdGhpcy5nZXQoKSkgewotICAgICAgVkxPRygyKSA8PCAiQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyIHdhcyBkZWxldGVkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gICAgYXV0byBnYXR0X2NiID0gR2V0R2F0dFNlcnZlckNhbGxiYWNrKHNlcnZlcl9pZCk7Ci0gICAgaWYgKCFnYXR0X2NiLmdldCgpKSB7Ci0gICAgICBWTE9HKDIpIDw8ICJUaGUgY2FsbGJhY2sgd2FzIGRlbGV0ZWQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdhdHRfY2ItPk9uTm90aWZpY2F0aW9uU2VudChkZXZpY2VfYWRkcmVzcywgZXJyb3IpOwotICB9OwotCi0gIGlmICghZ2F0dF9zZXJ2ZXItPlNlbmROb3RpZmljYXRpb24oCi0gICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChkZXZpY2VfYWRkcmVzcykuc3RyaW5nKCkpLCBoYW5kbGUsIGNvbmZpcm0sIHZhbHVlLAotICAgICAgICAgIGNhbGxiYWNrKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZW5kIG5vdGlmaWNhdGlvbiI7Ci0gICAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0U2VydmVyQmluZGVyU2VydmVyOjpPbkNoYXJhY3RlcmlzdGljUmVhZFJlcXVlc3QoCi0gICAgYmx1ZXRvb3RoOjpHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LCBib29sIGlzX2xvbmcsIHVpbnQxNl90IGhhbmRsZSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gIGF1dG8gZ2F0dF9jYiA9IEdldEdhdHRTZXJ2ZXJDYWxsYmFjayhnYXR0X3NlcnZlci0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgaWYgKCFnYXR0X2NiLmdldCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJDYWxsYmFjayBmb3IgdGhpcyBHYXR0U2VydmVyIHdhcyBkZWxldGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ2F0dF9jYi0+T25DaGFyYWN0ZXJpc3RpY1JlYWRSZXF1ZXN0KAotICAgICAgU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSwgZGV2aWNlX2FkZHJlc3MubGVuZ3RoKCkpLCByZXF1ZXN0X2lkLAotICAgICAgb2Zmc2V0LCBpc19sb25nLCBoYW5kbGUpOwotfQotCi12b2lkIEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXI6Ok9uRGVzY3JpcHRvclJlYWRSZXF1ZXN0KAotICAgIGJsdWV0b290aDo6R2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwgYm9vbCBpc19sb25nLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIGdhdHRfY2IgPSBHZXRHYXR0U2VydmVyQ2FsbGJhY2soZ2F0dF9zZXJ2ZXItPkdldEluc3RhbmNlSWQoKSk7Ci0gIGlmICghZ2F0dF9jYi5nZXQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgZm9yIHRoaXMgR2F0dFNlcnZlciB3YXMgZGVsZXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGdhdHRfY2ItPk9uRGVzY3JpcHRvclJlYWRSZXF1ZXN0KAotICAgICAgU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSwgZGV2aWNlX2FkZHJlc3MubGVuZ3RoKCkpLCByZXF1ZXN0X2lkLAotICAgICAgb2Zmc2V0LCBpc19sb25nLCBoYW5kbGUpOwotfQotCi1hbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrPgotQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcjo6R2V0R2F0dFNlcnZlckNhbGxiYWNrKGludCBzZXJ2ZXJfaWQpIHsKLSAgYXV0byBjYiA9IEdldENhbGxiYWNrKHNlcnZlcl9pZCk7Ci0gIHJldHVybiBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrPigKLSAgICAgIHN0YXRpY19jYXN0PElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sqPihjYi5nZXQoKSkpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpHYXR0U2VydmVyPgotQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcjo6R2V0R2F0dFNlcnZlcihpbnQgc2VydmVyX2lkKSB7Ci0gIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Ymx1ZXRvb3RoOjpHYXR0U2VydmVyPigKLSAgICAgIEdldEluc3RhbmNlKHNlcnZlcl9pZCkpOwotfQotCi12b2lkIEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXI6Ok9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoCi0gICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdGFuY2UgSUQ6ICIgPDwgaW5zdGFuY2UtPkdldEluc3RhbmNlSWQoKQotICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLSAgYmx1ZXRvb3RoOjpHYXR0U2VydmVyKiBnYXR0X3NlcnZlciA9Ci0gICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OkdhdHRTZXJ2ZXIqPihpbnN0YW5jZSk7Ci0gIGdhdHRfc2VydmVyLT5TZXREZWxlZ2F0ZSh0aGlzKTsKLQotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrPiBjYigKLSAgICAgIHN0YXRpY19jYXN0PElCbHVldG9vdGhHYXR0U2VydmVyQ2FsbGJhY2sqPihjYWxsYmFjay5nZXQoKSkpOwotICBjYi0+T25TZXJ2ZXJSZWdpc3RlcmVkKHN0YXR1cywgKHN0YXR1cyA9PSBibHVldG9vdGg6OkJMRV9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGluc3RhbmNlLT5HZXRJbnN0YW5jZUlkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtJbnZhbGlkSW5zdGFuY2VJZCk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlcjo6T25DaGFyYWN0ZXJpc3RpY1dyaXRlUmVxdWVzdCgKLSAgICBibHVldG9vdGg6OkdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsIGJvb2wgaXNfcHJlcGFyZV93cml0ZSwgYm9vbCBuZWVkX3Jlc3BvbnNlLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSwgdWludDE2X3QgaGFuZGxlKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0KLSAgYXV0byBnYXR0X2NiID0gR2V0R2F0dFNlcnZlckNhbGxiYWNrKGdhdHRfc2VydmVyLT5HZXRJbnN0YW5jZUlkKCkpOwotICBpZiAoIWdhdHRfY2IuZ2V0KCkpIHsKLSAgICBMT0coV0FSTklORykgPDwgIkNhbGxiYWNrIGZvciB0aGlzIEdhdHRTZXJ2ZXIgd2FzIGRlbGV0ZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBnYXR0X2NiLT5PbkNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0KAotICAgICAgU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSwgZGV2aWNlX2FkZHJlc3MubGVuZ3RoKCkpLCByZXF1ZXN0X2lkLAotICAgICAgb2Zmc2V0LCBpc19wcmVwYXJlX3dyaXRlLCBuZWVkX3Jlc3BvbnNlLCB2YWx1ZSwgaGFuZGxlKTsKLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0U2VydmVyQmluZGVyU2VydmVyOjpPbkRlc2NyaXB0b3JXcml0ZVJlcXVlc3QoCi0gICAgYmx1ZXRvb3RoOjpHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LCBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsIHVpbnQxNl90IGhhbmRsZSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gIGF1dG8gZ2F0dF9jYiA9IEdldEdhdHRTZXJ2ZXJDYWxsYmFjayhnYXR0X3NlcnZlci0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgaWYgKCFnYXR0X2NiLmdldCgpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJDYWxsYmFjayBmb3IgdGhpcyBHYXR0U2VydmVyIHdhcyBkZWxldGVkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ2F0dF9jYi0+T25EZXNjcmlwdG9yV3JpdGVSZXF1ZXN0KAotICAgICAgU3RyaW5nMTYoZGV2aWNlX2FkZHJlc3MuY19zdHIoKSwgZGV2aWNlX2FkZHJlc3MubGVuZ3RoKCkpLCByZXF1ZXN0X2lkLAotICAgICAgb2Zmc2V0LCBpc19wcmVwYXJlX3dyaXRlLCBuZWVkX3Jlc3BvbnNlLCB2YWx1ZSwgaGFuZGxlKTsKLX0KLQotdm9pZCBCbHVldG9vdGhHYXR0U2VydmVyQmluZGVyU2VydmVyOjpPbkV4ZWN1dGVXcml0ZVJlcXVlc3QoCi0gICAgYmx1ZXRvb3RoOjpHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgIGludCByZXF1ZXN0X2lkLCBib29sIGlzX2V4ZWN1dGUpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIGdhdHRfY2IgPSBHZXRHYXR0U2VydmVyQ2FsbGJhY2soZ2F0dF9zZXJ2ZXItPkdldEluc3RhbmNlSWQoKSk7Ci0gIGlmICghZ2F0dF9jYi5nZXQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgZm9yIHRoaXMgR2F0dFNlcnZlciB3YXMgZGVsZXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGdhdHRfY2ItPk9uRXhlY3V0ZVdyaXRlUmVxdWVzdCgKLSAgICAgIFN0cmluZzE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCksIGRldmljZV9hZGRyZXNzLmxlbmd0aCgpKSwgcmVxdWVzdF9pZCwKLSAgICAgIGlzX2V4ZWN1dGUpOwotfQotCi12b2lkIEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXI6Ok9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCgKLSAgICBibHVldG9vdGg6OkdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgYm9vbCBjb25uZWN0ZWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIGdhdHRfY2IgPSBHZXRHYXR0U2VydmVyQ2FsbGJhY2soZ2F0dF9zZXJ2ZXItPkdldEluc3RhbmNlSWQoKSk7Ci0gIGlmICghZ2F0dF9jYi5nZXQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbGJhY2sgZm9yIHRoaXMgR2F0dFNlcnZlciB3YXMgZGVsZXRlZC4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGdhdHRfY2ItPk9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCgKLSAgICAgIFN0cmluZzE2KGRldmljZV9hZGRyZXNzLmNfc3RyKCksIGRldmljZV9hZGRyZXNzLmxlbmd0aCgpKSwgY29ubmVjdGVkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9nYXR0X3NlcnZlcl9iaW5kZXJfc2VydmVyLmggYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfc2VydmVyX2JpbmRlcl9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1MzM5YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2dhdHRfc2VydmVyX2JpbmRlcl9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhHYXR0U2VydmVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjay5oPgotCi0jaW5jbHVkZSAic2VydmljZS9nYXR0X3NlcnZlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oIgotCi11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoR2F0dFNlcnZlcjsKLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6SUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjazsKLQotdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgSUJsdWV0b290aEdhdHRTZXJ2ZXIgaW50ZXJmYWNlLgotY2xhc3MgQmx1ZXRvb3RoR2F0dFNlcnZlckJpbmRlclNlcnZlciA6IHB1YmxpYyBCbkJsdWV0b290aEdhdHRTZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBibHVldG9vdGg6OkdhdHRTZXJ2ZXI6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXIoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKTsKLSAgfkJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLy8gSUJsdWV0b290aEdhdHRTZXJ2ZXIgb3ZlcnJpZGVzOgotICBTdGF0dXMgUmVnaXN0ZXJTZXJ2ZXIoCi0gICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrPiYKLSAgICAgICAgICBjYWxsYmFjaywKLSAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBVbnJlZ2lzdGVyU2VydmVyKGludDMyX3Qgc2VydmVyX2lkKSBvdmVycmlkZTsKLSAgU3RhdHVzIFVucmVnaXN0ZXJBbGwoKSBvdmVycmlkZTsKLSAgU3RhdHVzIEFkZFNlcnZpY2UoaW50MzJfdCBzZXJ2ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0U2VydmljZSYgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFNlbmRSZXNwb25zZShpbnQzMl90IHNlcnZlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RfaWQsIGludDMyX3Qgc3RhdHVzLCBpbnQzMl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICBTdGF0dXMgU2VuZE5vdGlmaWNhdGlvbihpbnQzMl90IHNlcnZlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgZGV2aWNlX2FkZHJlc3MsIGludCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uZmlybSwgY29uc3QgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgLy8gYmx1ZXRvb3RoOjpHYXR0U2VydmVyOjpEZWxlZ2F0ZSBvdmVycmlkZXM6Ci0gIHZvaWQgT25DaGFyYWN0ZXJpc3RpY1JlYWRSZXF1ZXN0KGJsdWV0b290aDo6R2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkRlc2NyaXB0b3JSZWFkUmVxdWVzdChibHVldG9vdGg6OkdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwgYm9vbCBpc19sb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25DaGFyYWN0ZXJpc3RpY1dyaXRlUmVxdWVzdChibHVldG9vdGg6OkdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EZXNjcmlwdG9yV3JpdGVSZXF1ZXN0KGJsdWV0b290aDo6R2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJlcGFyZV93cml0ZSwgYm9vbCBuZWVkX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25FeGVjdXRlV3JpdGVSZXF1ZXN0KGJsdWV0b290aDo6R2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50IHJlcXVlc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhlY3V0ZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKGJsdWV0b290aDo6R2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgSUJsdWV0b290aEdhdHRTZXJ2ZXJDYWxsYmFjayBpbnN0YW5jZQotICAvLyBhc3NvY2lhdGVkIHdpdGggfHNlcnZlcl9pZHwuIFJldHVybnMgTlVMTCBpZiBzdWNoIGEgY2FsbGJhY2sgY2Fubm90IGJlCi0gIC8vIGZvdW5kLgotICBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoR2F0dFNlcnZlckNhbGxiYWNrPiBHZXRHYXR0U2VydmVyQ2FsbGJhY2soCi0gICAgICBpbnQgc2VydmVyX2lkKTsKLQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgR2F0dFNlcnZlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggfHNlcnZlcl9pZHwuCi0gIC8vIFJldHVybnMgTlVMTCBpZiBzdWNoIGFuIGluc3RhbmNlIGNhbm5vdCBiZSBmb3VuZC4KLSAgc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6R2F0dFNlcnZlcj4gR2V0R2F0dFNlcnZlcihpbnQgc2VydmVyX2lkKTsKLQotICAvLyBJbnRlcmZhY2VXaXRoSW5zdGFuY2VzQmFzZSBvdmVycmlkZToKLSAgdm9pZCBPblJlZ2lzdGVySW5zdGFuY2VJbXBsKGJsdWV0b290aDo6QkxFU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZSogaW5zdGFuY2UpIG92ZXJyaWRlOwotCi0gIGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcl87ICAvLyB3ZWFrCi0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJsdWV0b290aEdhdHRTZXJ2ZXJCaW5kZXJTZXJ2ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sZV9hZHZlcnRpc2VyX2JpbmRlcl9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX2FkdmVydGlzZXJfYmluZGVyX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmNzBkNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX2FkdmVydGlzZXJfYmluZGVyX3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbGVfYWR2ZXJ0aXNlcl9iaW5kZXJfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvYWRhcHRlci5oIgotCi11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci11c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgYmluZGVyIHsKLQotbmFtZXNwYWNlIHsKLWNvbnN0IGludCBrSW52YWxpZEluc3RhbmNlSWQgPSAtMTsKLX0gIC8vIG5hbWVzcGFjZQotCi1CbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXI6OkJsdWV0b290aExlQWR2ZXJ0aXNlckJpbmRlclNlcnZlcigKLSAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIENIRUNLKGFkYXB0ZXJfKTsKLX0KLQotQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyOjp+Qmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyKCkge30KLQotU3RhdHVzIEJsdWV0b290aExlQWR2ZXJ0aXNlckJpbmRlclNlcnZlcjo6UmVnaXN0ZXJBZHZlcnRpc2VyKAotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBibHVldG9vdGg6Okxvd0VuZXJneUFkdmVydGlzZXJGYWN0b3J5KiBhZHZfZmFjdG9yeSA9Ci0gICAgICBhZGFwdGVyXy0+R2V0TGVBZHZlcnRpc2VyRmFjdG9yeSgpOwotCi0gICpfYWlkbF9yZXR1cm4gPSBSZWdpc3Rlckluc3RhbmNlQmFzZShjYWxsYmFjaywgYWR2X2ZhY3RvcnkpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyOjpVbnJlZ2lzdGVyQWR2ZXJ0aXNlcigKLSAgICBpbnQgYWR2ZXJ0aXNlcl9pZCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBVbnJlZ2lzdGVySW5zdGFuY2VCYXNlKGFkdmVydGlzZXJfaWQpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyOjpVbnJlZ2lzdGVyQWxsKCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBVbnJlZ2lzdGVyQWxsQmFzZSgpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyOjpTdGFydE11bHRpQWR2ZXJ0aXNpbmcoCi0gICAgaW50IGFkdmVydGlzZXJfaWQsIGNvbnN0IGFuZHJvaWQ6OmJsdWV0b290aDo6QWR2ZXJ0aXNlRGF0YSYgYWR2ZXJ0aXNlX2RhdGEsCi0gICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhJiBzY2FuX3Jlc3BvbnNlLAotICAgIGNvbnN0IGFuZHJvaWQ6OmJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3MmIHNldHRpbmdzLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkdmVydGlzZXJfaWQ6ICIgPDwgYWR2ZXJ0aXNlcl9pZDsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIGFkdmVydGlzZXIgPSBHZXRMRUFkdmVydGlzZXIoYWR2ZXJ0aXNlcl9pZCk7Ci0gIGlmICghYWR2ZXJ0aXNlcikgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gYWR2ZXJ0aXNlcl9pZDogIiA8PCBhZHZlcnRpc2VyX2lkOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgd2VhayBwb2ludGVyIGFuZCBwYXNzIHRoYXQgdG8gdGhlIGNhbGxiYWNrIHRvIHByZXZlbnQgYSBwb3RlbnRpYWwKLSAgLy8gdXNlIGFmdGVyIGZyZWUuCi0gIGFuZHJvaWQ6OndwPEJsdWV0b290aExlQWR2ZXJ0aXNlckJpbmRlclNlcnZlcj4gd2Vha19wdHJfdG9fdGhpcyh0aGlzKTsKLSAgYXV0byBzZXR0aW5nc19jb3B5ID0gc2V0dGluZ3M7Ci0gIGF1dG8gY2FsbGJhY2sgPSBbPV0oYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgYXV0byBzcF90b190aGlzID0gd2Vha19wdHJfdG9fdGhpcy5wcm9tb3RlKCk7Ci0gICAgaWYgKCFzcF90b190aGlzLmdldCgpKSB7Ci0gICAgICBWTE9HKDIpIDw8ICJCbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXIgd2FzIGRlbGV0ZWQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0KLSAgICBhdXRvIGNiID0gR2V0TEVDYWxsYmFjayhhZHZlcnRpc2VyX2lkKTsKLSAgICBpZiAoIWNiLmdldCgpKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJBZHZlcnRpc2VyIHdhcyByZW1vdmVkIGJlZm9yZSBjYWxsYmFjazogIiA8PCBhZHZlcnRpc2VyX2lkOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNiLT5Pbk11bHRpQWR2ZXJ0aXNlQ2FsbGJhY2soc3RhdHVzLCB0cnVlIC8qIGlzX3N0YXJ0ICovLCBzZXR0aW5nc19jb3B5KTsKLSAgfTsKLQotICBpZiAoIWFkdmVydGlzZXItPlN0YXJ0QWR2ZXJ0aXNpbmcoc2V0dGluZ3MsIGFkdmVydGlzZV9kYXRhLCBzY2FuX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwgdG8gc3RhcnQgYWR2ZXJ0aXNpbmciOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXI6OlN0b3BNdWx0aUFkdmVydGlzaW5nKAotICAgIGludCBhZHZlcnRpc2VyX2lkLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIGFkdmVydGlzZXIgPSBHZXRMRUFkdmVydGlzZXIoYWR2ZXJ0aXNlcl9pZCk7Ci0gIGlmICghYWR2ZXJ0aXNlcikgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gYWR2ZXJ0aXNlcl9pZDogIiA8PCBhZHZlcnRpc2VyX2lkOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgd2VhayBwb2ludGVyIGFuZCBwYXNzIHRoYXQgdG8gdGhlIGNhbGxiYWNrIHRvIHByZXZlbnQgYSBwb3RlbnRpYWwKLSAgLy8gdXNlIGFmdGVyIGZyZWUuCi0gIGFuZHJvaWQ6OndwPEJsdWV0b290aExlQWR2ZXJ0aXNlckJpbmRlclNlcnZlcj4gd2Vha19wdHJfdG9fdGhpcyh0aGlzKTsKLSAgYXV0byBzZXR0aW5nc19jb3B5ID0gYWR2ZXJ0aXNlci0+YWR2ZXJ0aXNlX3NldHRpbmdzKCk7Ci0gIGF1dG8gY2FsbGJhY2sgPSBbPV0oYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgYXV0byBzcF90b190aGlzID0gd2Vha19wdHJfdG9fdGhpcy5wcm9tb3RlKCk7Ci0gICAgaWYgKCFzcF90b190aGlzLmdldCgpKSB7Ci0gICAgICBWTE9HKDIpIDw8ICJCbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXIgd2FzIGRlbGV0ZWQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gY2IgPSBHZXRMRUNhbGxiYWNrKGFkdmVydGlzZXJfaWQpOwotICAgIGlmICghY2IuZ2V0KCkpIHsKLSAgICAgIFZMT0coMikgPDwgIkFkdmVydGlzZXIgd2FzIHVucmVnaXN0ZXJlZCAtIGFkdmVydGlzZXJfaWQ6ICIKLSAgICAgICAgICAgICAgPDwgYWR2ZXJ0aXNlcl9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jaygqbWFwc19sb2NrKCkpOwotCi0gICAgY2ItPk9uTXVsdGlBZHZlcnRpc2VDYWxsYmFjayhzdGF0dXMsIGZhbHNlIC8qIGlzX3N0YXJ0ICovLCBzZXR0aW5nc19jb3B5KTsKLSAgfTsKLQotICBpZiAoIWFkdmVydGlzZXItPlN0b3BBZHZlcnRpc2luZyhjYWxsYmFjaykpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbCB0byBzdGFydCBhZHZlcnRpc2luZyI7Ci0gICAgKl9haWRsX3JldHVybiA9IGZhbHNlOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gIH0KLQotICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotYW5kcm9pZDo6c3A8SUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrPgotQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyOjpHZXRMRUNhbGxiYWNrKGludCBhZHZlcnRpc2VyX2lkKSB7Ci0gIGF1dG8gY2IgPSBHZXRDYWxsYmFjayhhZHZlcnRpc2VyX2lkKTsKLSAgcmV0dXJuIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaz4oCi0gICAgICBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2sqPihjYi5nZXQoKSkpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpMb3dFbmVyZ3lBZHZlcnRpc2VyPgotQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyOjpHZXRMRUFkdmVydGlzZXIoaW50IGFkdmVydGlzZXJfaWQpIHsKLSAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxibHVldG9vdGg6Okxvd0VuZXJneUFkdmVydGlzZXI+KAotICAgICAgR2V0SW5zdGFuY2UoYWR2ZXJ0aXNlcl9pZCkpOwotfQotCi12b2lkIEJsdWV0b290aExlQWR2ZXJ0aXNlckJpbmRlclNlcnZlcjo6T25SZWdpc3Rlckluc3RhbmNlSW1wbCgKLSAgICBibHVldG9vdGg6OkJMRVN0YXR1cyBzdGF0dXMsIGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgIGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2UqIGluc3RhbmNlKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBzdGF0dXM6ICIgPDwgc3RhdHVzOwotCi0gIGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaz4gY2IoCi0gICAgICBzdGF0aWNfY2FzdDxJQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQ2FsbGJhY2sqPihjYWxsYmFjay5nZXQoKSkpOwotICBjYi0+T25BZHZlcnRpc2VyUmVnaXN0ZXJlZChzdGF0dXMsIChzdGF0dXMgPT0gYmx1ZXRvb3RoOjpCTEVfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5zdGFuY2UtPkdldEluc3RhbmNlSWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtJbnZhbGlkSW5zdGFuY2VJZCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbGVfYWR2ZXJ0aXNlcl9iaW5kZXJfc2VydmVyLmggYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX2FkdmVydGlzZXJfYmluZGVyX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAyZjVhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbGVfYWR2ZXJ0aXNlcl9iaW5kZXJfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrLmg+Ci0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhMZUFkdmVydGlzZXIuaCIKLQotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9sb3dfZW5lcmd5X2NvbnN0YW50cy5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvbG93X2VuZXJneV9hZHZlcnRpc2VyLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhMZUFkdmVydGlzZXI7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjazsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgSUJsdWV0b290aExvd0VuZXJneSBpbnRlcmZhY2UuCi1jbGFzcyBCbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXIgOiBwdWJsaWMgQm5CbHVldG9vdGhMZUFkdmVydGlzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQmx1ZXRvb3RoTGVBZHZlcnRpc2VyQmluZGVyU2VydmVyKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcik7Ci0gIH5CbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXIoKSBvdmVycmlkZTsKLQotICAvLyBJQmx1ZXRvb3RoTG93RW5lcmd5IG92ZXJyaWRlczoKLSAgU3RhdHVzIFJlZ2lzdGVyQWR2ZXJ0aXNlcigKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFVucmVnaXN0ZXJBZHZlcnRpc2VyKGludCBhZHZlcnRpc2VyX2lkKSBvdmVycmlkZTsKLSAgU3RhdHVzIFVucmVnaXN0ZXJBbGwoKSBvdmVycmlkZTsKLSAgU3RhdHVzIFN0YXJ0TXVsdGlBZHZlcnRpc2luZygKLSAgICAgIGludCBhZHZlcnRpc2VyX2lkLAotICAgICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhJiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OmJsdWV0b290aDo6QWR2ZXJ0aXNlRGF0YSYgc2Nhbl9yZXNwb25zZSwKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OmJsdWV0b290aDo6QWR2ZXJ0aXNlU2V0dGluZ3MmIHNldHRpbmdzLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFN0b3BNdWx0aUFkdmVydGlzaW5nKGludCBhZHZlcnRpc2VyX2lkLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIElCbHVldG9vdGhMZUFkdmVydGlzZXJDYWxsYmFjayBpbnN0YW5jZSBhc3NvY2lhdGVkCi0gIC8vIHdpdGggfGFkdmVydGlzZXJfaWR8LiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIGNhbGxiYWNrIGNhbm5vdCBiZSBmb3VuZC4KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aExlQWR2ZXJ0aXNlckNhbGxiYWNrPiBHZXRMRUNhbGxiYWNrKGludCBhZHZlcnRpc2VyX2lkKTsKLQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgTG93RW5lcmd5QWR2ZXJ0aXNlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGgKLSAgLy8gfGFkdmVydGlzZXJfaWR8LiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIGFkdmVydGlzZXIgY2Fubm90IGJlIGZvdW5kLgotICBzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpMb3dFbmVyZ3lBZHZlcnRpc2VyPiBHZXRMRUFkdmVydGlzZXIoCi0gICAgICBpbnQgYWR2ZXJ0aXNlcl9pZCk7Ci0KLSAgLy8gSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2Ugb3ZlcnJpZGU6Ci0gIHZvaWQgT25SZWdpc3Rlckluc3RhbmNlSW1wbChibHVldG9vdGg6OkJMRVN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2UqIGluc3RhbmNlKSBvdmVycmlkZTsKLQotICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXJfOyAgLy8gd2VhawotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhMZUFkdmVydGlzZXJCaW5kZXJTZXJ2ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sZV9zY2FubmVyX2JpbmRlcl9zZXJ2ZXIuY2MgYi9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX3NjYW5uZXJfYmluZGVyX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNzJiZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX3NjYW5uZXJfYmluZGVyX3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xlX3NjYW5uZXJfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga0ludmFsaWRJbnN0YW5jZUlkID0gLTE7Ci19ICAvLyBuYW1lc3BhY2UKLQotQmx1ZXRvb3RoTGVTY2FubmVyQmluZGVyU2VydmVyOjpCbHVldG9vdGhMZVNjYW5uZXJCaW5kZXJTZXJ2ZXIoCi0gICAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKQotICAgIDogYWRhcHRlcl8oYWRhcHRlcikgewotICBDSEVDSyhhZGFwdGVyXyk7Ci19Ci0KLUJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6fkJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcigpIHt9Ci0KLVN0YXR1cyBCbHVldG9vdGhMZVNjYW5uZXJCaW5kZXJTZXJ2ZXI6OlJlZ2lzdGVyU2Nhbm5lcigKLSAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgYmx1ZXRvb3RoOjpMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeSogYmxlX2ZhY3RvcnkgPQotICAgICAgYWRhcHRlcl8tPkdldExlU2Nhbm5lckZhY3RvcnkoKTsKLQotICAqX2FpZGxfcmV0dXJuID0gUmVnaXN0ZXJJbnN0YW5jZUJhc2UoY2FsbGJhY2ssIGJsZV9mYWN0b3J5KTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6VW5yZWdpc3RlclNjYW5uZXIoaW50IHNjYW5uZXJfaWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVW5yZWdpc3Rlckluc3RhbmNlQmFzZShzY2FubmVyX2lkKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6VW5yZWdpc3RlckFsbCgpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgVW5yZWdpc3RlckFsbEJhc2UoKTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6U3RhcnRTY2FuKAotICAgIGludCBzY2FubmVyX2lkLCBjb25zdCBhbmRyb2lkOjpibHVldG9vdGg6OlNjYW5TZXR0aW5ncyYgc2V0dGluZ3MsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyPiYgZmlsdGVycywKLSAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIHNjYW5uZXJfaWQ6ICIgPDwgc2Nhbm5lcl9pZDsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBhdXRvIHNjYW5uZXIgPSBHZXRMRVNjYW5uZXIoc2Nhbm5lcl9pZCk7Ci0gIGlmICghc2Nhbm5lcikgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gc2Nhbm5lcl9pZDogIiA8PCBzY2FubmVyX2lkOwotICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyPiBmbHQ7Ci0gIGZvciAoY29uc3QgYXV0byYgZmlsdGVyIDogZmlsdGVycykgewotICAgIGZsdC5wdXNoX2JhY2soZmlsdGVyKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPSBzY2FubmVyLT5TdGFydFNjYW4oc2V0dGluZ3MsIGZsdCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhMZVNjYW5uZXJCaW5kZXJTZXJ2ZXI6OlN0b3BTY2FuKGludCBzY2FubmVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBzY2FubmVyX2lkOiAiIDw8IHNjYW5uZXJfaWQ7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0KLSAgYXV0byBzY2FubmVyID0gR2V0TEVTY2FubmVyKHNjYW5uZXJfaWQpOwotICBpZiAoIXNjYW5uZXIpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHNjYW5uZXJfaWQ6ICIgPDwgc2Nhbm5lcl9pZDsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPSBzY2FubmVyLT5TdG9wU2NhbigpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi12b2lkIEJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6T25TY2FuUmVzdWx0KAotICAgIGJsdWV0b290aDo6TG93RW5lcmd5U2Nhbm5lciogc2Nhbm5lciwgY29uc3QgYmx1ZXRvb3RoOjpTY2FuUmVzdWx0JiByZXN1bHQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soKm1hcHNfbG9jaygpKTsKLQotICBpbnQgc2Nhbm5lcl9pZCA9IHNjYW5uZXItPkdldEluc3RhbmNlSWQoKTsKLSAgYXV0byBjYiA9IEdldExFQ2FsbGJhY2soc2Nhbm5lci0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgaWYgKCFjYi5nZXQoKSkgewotICAgIFZMT0coMikgPDwgIlNjYW5uZXIgd2FzIHVucmVnaXN0ZXJlZCAtIHNjYW5uZXJfaWQ6ICIgPDwgc2Nhbm5lcl9pZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjYi0+T25TY2FuUmVzdWx0KHJlc3VsdCk7Ci19Ci0KLWFuZHJvaWQ6OnNwPElCbHVldG9vdGhMZVNjYW5uZXJDYWxsYmFjaz4KLUJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6R2V0TEVDYWxsYmFjayhpbnQgc2Nhbm5lcl9pZCkgewotICBhdXRvIGNiID0gR2V0Q2FsbGJhY2soc2Nhbm5lcl9pZCk7Ci0gIHJldHVybiBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2s+KAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrKj4oY2IuZ2V0KCkpKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6TG93RW5lcmd5U2Nhbm5lcj4KLUJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcjo6R2V0TEVTY2FubmVyKGludCBzY2FubmVyX2lkKSB7Ci0gIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Ymx1ZXRvb3RoOjpMb3dFbmVyZ3lTY2FubmVyPigKLSAgICAgIEdldEluc3RhbmNlKHNjYW5uZXJfaWQpKTsKLX0KLQotdm9pZCBCbHVldG9vdGhMZVNjYW5uZXJCaW5kZXJTZXJ2ZXI6Ok9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoCi0gICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLSAgYmx1ZXRvb3RoOjpMb3dFbmVyZ3lTY2FubmVyKiBsZV9zY2FubmVyID0KLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6TG93RW5lcmd5U2Nhbm5lcio+KGluc3RhbmNlKTsKLSAgbGVfc2Nhbm5lci0+U2V0RGVsZWdhdGUodGhpcyk7Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrPiBjYigKLSAgICAgIHN0YXRpY19jYXN0PElCbHVldG9vdGhMZVNjYW5uZXJDYWxsYmFjayo+KGNhbGxiYWNrLmdldCgpKSk7Ci0gIGNiLT5PblNjYW5uZXJSZWdpc3RlcmVkKHN0YXR1cywgKHN0YXR1cyA9PSBibHVldG9vdGg6OkJMRV9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnN0YW5jZS0+R2V0SW5zdGFuY2VJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0ludmFsaWRJbnN0YW5jZUlkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sZV9zY2FubmVyX2JpbmRlcl9zZXJ2ZXIuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbGVfc2Nhbm5lcl9iaW5kZXJfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzNhZTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sZV9zY2FubmVyX2JpbmRlcl9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrLmg+Ci0jaW5jbHVkZSAiYW5kcm9pZC9ibHVldG9vdGgvQm5CbHVldG9vdGhMZVNjYW5uZXIuaCIKLQotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9sb3dfZW5lcmd5X2NvbnN0YW50cy5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oIgotI2luY2x1ZGUgInNlcnZpY2UvbG93X2VuZXJneV9zY2FubmVyLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJsdWV0b290aDo6Qm5CbHVldG9vdGhMZVNjYW5uZXI7Ci11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OklCbHVldG9vdGhMZVNjYW5uZXJDYWxsYmFjazsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1jbGFzcyBBZGFwdGVyOwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgSUJsdWV0b290aExvd0VuZXJneSBpbnRlcmZhY2UuCi1jbGFzcyBCbHVldG9vdGhMZVNjYW5uZXJCaW5kZXJTZXJ2ZXIKLSAgICA6IHB1YmxpYyBCbkJsdWV0b290aExlU2Nhbm5lciwKLSAgICAgIHB1YmxpYyBJbnRlcmZhY2VXaXRoSW5zdGFuY2VzQmFzZSwKLSAgICAgIHB1YmxpYyBibHVldG9vdGg6Okxvd0VuZXJneVNjYW5uZXI6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJsdWV0b290aExlU2Nhbm5lckJpbmRlclNlcnZlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+Qmx1ZXRvb3RoTGVTY2FubmVyQmluZGVyU2VydmVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSUJsdWV0b290aExvd0VuZXJneSBvdmVycmlkZXM6Ci0gIFN0YXR1cyBSZWdpc3RlclNjYW5uZXIoCi0gICAgICBjb25zdCBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTGVTY2FubmVyQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBVbnJlZ2lzdGVyU2Nhbm5lcihpbnQgc2Nhbm5lcl9pZCkgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBVbnJlZ2lzdGVyQWxsKCkgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBTdGFydFNjYW4oaW50IHNjYW5uZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTY2FuU2V0dGluZ3MmIHNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmJsdWV0b290aDo6U2NhbkZpbHRlcj4mIGZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFN0b3BTY2FuKGludCBzY2FubmVyX2lkLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gIHZvaWQgT25TY2FuUmVzdWx0KGJsdWV0b290aDo6TG93RW5lcmd5U2Nhbm5lciogc2Nhbm5lciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpTY2FuUmVzdWx0JiByZXN1bHQpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjayBpbnN0YW5jZSBhc3NvY2lhdGVkCi0gIC8vIHdpdGggfHNjYW5uZXJfaWR8LiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIGNhbGxiYWNrIGNhbm5vdCBiZSBmb3VuZC4KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aExlU2Nhbm5lckNhbGxiYWNrPiBHZXRMRUNhbGxiYWNrKGludCBzY2FubmVyX2lkKTsKLQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgTG93RW5lcmd5U2Nhbm5lciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGgKLSAgLy8gfHNjYW5uZXJfaWR8LiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIHNjYW5uZXIgY2Fubm90IGJlIGZvdW5kLgotICBzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpMb3dFbmVyZ3lTY2FubmVyPiBHZXRMRVNjYW5uZXIoaW50IHNjYW5uZXJfaWQpOwotCi0gIC8vIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlIG92ZXJyaWRlOgotICB2b2lkIE9uUmVnaXN0ZXJJbnN0YW5jZUltcGwoYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlKiBpbnN0YW5jZSkgb3ZlcnJpZGU7Ci0KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyXzsgIC8vIHdlYWsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmx1ZXRvb3RoTGVTY2FubmVyQmluZGVyU2VydmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbG93X2VuZXJneV9iaW5kZXJfc2VydmVyLmNjIGIvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sb3dfZW5lcmd5X2JpbmRlcl9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjBkNmQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sb3dfZW5lcmd5X2JpbmRlcl9zZXJ2ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvYmx1ZXRvb3RoX2xvd19lbmVyZ3lfYmluZGVyX3NlcnZlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotdXNpbmcgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBpbnQga0ludmFsaWRJbnN0YW5jZUlkID0gLTE7Ci19ICAvLyBuYW1lc3BhY2UKLQotQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyOjpCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXIoCi0gICAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKQotICAgIDogYWRhcHRlcl8oYWRhcHRlcikgewotICBDSEVDSyhhZGFwdGVyXyk7Ci19Ci0KLUJsdWV0b290aExvd0VuZXJneUJpbmRlclNlcnZlcjo6fkJsdWV0b290aExvd0VuZXJneUJpbmRlclNlcnZlcigpIHt9Ci0KLVN0YXR1cyBCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXI6OlJlZ2lzdGVyQ2xpZW50KAotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgIGJvb2wqIF9haWRsX3JldHVybikgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBibHVldG9vdGg6Okxvd0VuZXJneUNsaWVudEZhY3RvcnkqIGJsZV9mYWN0b3J5ID0KLSAgICAgIGFkYXB0ZXJfLT5HZXRMb3dFbmVyZ3lDbGllbnRGYWN0b3J5KCk7Ci0KLSAgKl9haWRsX3JldHVybiA9IFJlZ2lzdGVySW5zdGFuY2VCYXNlKGNhbGxiYWNrLCBibGVfZmFjdG9yeSk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXI6OlVucmVnaXN0ZXJDbGllbnQoaW50IGNsaWVudF9pZCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBVbnJlZ2lzdGVySW5zdGFuY2VCYXNlKGNsaWVudF9pZCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXI6OlVucmVnaXN0ZXJBbGwoKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIFVucmVnaXN0ZXJBbGxCYXNlKCk7Ci0gIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXI6OkNvbm5lY3QoaW50IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGNsaWVudF9pZDogIiA8PCBjbGllbnRfaWQgPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICA8PCAiIGlzX2RpcmVjdDogIiA8PCBpc19kaXJlY3Q7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0KLSAgYXV0byBjbGllbnQgPSBHZXRMRUNsaWVudChjbGllbnRfaWQpOwotICBpZiAoIWNsaWVudCkgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY2xpZW50X2lkOiAiIDw8IGNsaWVudF9pZDsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPQotICAgICAgY2xpZW50LT5Db25uZWN0KHN0ZDo6c3RyaW5nKFN0cmluZzgoYWRkcmVzcykuc3RyaW5nKCkpLCBpc19kaXJlY3QpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyOjpEaXNjb25uZWN0KGludCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGNsaWVudF9pZDogIiA8PCBjbGllbnRfaWQgPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3M7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0KLSAgYXV0byBjbGllbnQgPSBHZXRMRUNsaWVudChjbGllbnRfaWQpOwotICBpZiAoIWNsaWVudCkgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY2xpZW50X2lkOiAiIDw8IGNsaWVudF9pZDsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPSBjbGllbnQtPkRpc2Nvbm5lY3Qoc3RkOjpzdHJpbmcoU3RyaW5nOChhZGRyZXNzKS5zdHJpbmcoKSkpOwotICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyOjpTZXRNdHUoaW50IGNsaWVudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgYWRkcmVzcywgaW50IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGNsaWVudF9pZDogIiA8PCBjbGllbnRfaWQgPDwgIiBhZGRyZXNzOiAiIDw8IGFkZHJlc3MKLSAgICAgICAgICA8PCAiIG10dTogIiA8PCBtdHU7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKCptYXBzX2xvY2soKSk7Ci0KLSAgYXV0byBjbGllbnQgPSBHZXRMRUNsaWVudChjbGllbnRfaWQpOwotICBpZiAoIWNsaWVudCkgewotICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY2xpZW50X2lkOiAiIDw8IGNsaWVudF9pZDsKLSAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgfQotCi0gICpfYWlkbF9yZXR1cm4gPSBjbGllbnQtPlNldE10dShzdGQ6OnN0cmluZyhTdHJpbmc4KGFkZHJlc3MpLnN0cmluZygpKSwgbXR1KTsKLSAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXI6Ok9uQ29ubmVjdGlvblN0YXRlKAotICAgIGJsdWV0b290aDo6TG93RW5lcmd5Q2xpZW50KiBjbGllbnQsIGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgYm9vbCBjb25uZWN0ZWQpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZHJlc3M6ICIgPDwgYWRkcmVzcyA8PCAiIGNvbm5lY3RlZDogIiA8PCBjb25uZWN0ZWQ7Ci0KLSAgaW50IGNsaWVudF9pZCA9IGNsaWVudC0+R2V0SW5zdGFuY2VJZCgpOwotICBhdXRvIGNiID0gR2V0TEVDYWxsYmFjayhjbGllbnQtPkdldEluc3RhbmNlSWQoKSk7Ci0gIGlmICghY2IuZ2V0KCkpIHsKLSAgICBWTE9HKDIpIDw8ICJDbGllbnQgd2FzIHVucmVnaXN0ZXJlZCAtIGNsaWVudF9pZDogIiA8PCBjbGllbnRfaWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2ItPk9uQ29ubmVjdGlvblN0YXRlKHN0YXR1cywgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoYWRkcmVzcywgc3RkOjpzdHJsZW4oYWRkcmVzcykpLCBjb25uZWN0ZWQpOwotfQotCi12b2lkIEJsdWV0b290aExvd0VuZXJneUJpbmRlclNlcnZlcjo6T25NdHVDaGFuZ2VkKAotICAgIGJsdWV0b290aDo6TG93RW5lcmd5Q2xpZW50KiBjbGllbnQsIGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgaW50IG10dSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgYWRkcmVzczogIiA8PCBhZGRyZXNzIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1cwotICAgICAgICAgIDw8ICIgbXR1OiAiIDw8IG10dTsKLQotICBpbnQgY2xpZW50X2lkID0gY2xpZW50LT5HZXRJbnN0YW5jZUlkKCk7Ci0gIGF1dG8gY2IgPSBHZXRMRUNhbGxiYWNrKGNsaWVudF9pZCk7Ci0gIGlmICghY2IuZ2V0KCkpIHsKLSAgICBWTE9HKDIpIDw8ICJDbGllbnQgd2FzIHVucmVnaXN0ZXJlZCAtIGNsaWVudF9pZDogIiA8PCBjbGllbnRfaWQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY2ItPk9uTXR1Q2hhbmdlZChzdGF0dXMsIFN0cmluZzE2KGFkZHJlc3MsIHN0ZDo6c3RybGVuKGFkZHJlc3MpKSwgbXR1KTsKLX0KLQotYW5kcm9pZDo6c3A8SUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrPgotQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyOjpHZXRMRUNhbGxiYWNrKGludCBjbGllbnRfaWQpIHsKLSAgYXV0byBjYiA9IEdldENhbGxiYWNrKGNsaWVudF9pZCk7Ci0gIHJldHVybiBhbmRyb2lkOjpzcDxJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2s+KAotICAgICAgc3RhdGljX2Nhc3Q8SUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrKj4oY2IuZ2V0KCkpKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6TG93RW5lcmd5Q2xpZW50PgotQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyOjpHZXRMRUNsaWVudChpbnQgY2xpZW50X2lkKSB7Ci0gIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Ymx1ZXRvb3RoOjpMb3dFbmVyZ3lDbGllbnQ+KAotICAgICAgR2V0SW5zdGFuY2UoY2xpZW50X2lkKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyOjpPblJlZ2lzdGVySW5zdGFuY2VJbXBsKAotICAgIGJsdWV0b290aDo6QkxFU3RhdHVzIHN0YXR1cywgYW5kcm9pZDo6c3A8SUludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZSogaW5zdGFuY2UpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0gIGJsdWV0b290aDo6TG93RW5lcmd5Q2xpZW50KiBsZV9jbGllbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpMb3dFbmVyZ3lDbGllbnQqPihpbnN0YW5jZSk7Ci0gIGxlX2NsaWVudC0+U2V0RGVsZWdhdGUodGhpcyk7Ci0KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrPiBjYigKLSAgICAgIHN0YXRpY19jYXN0PElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjayo+KGNhbGxiYWNrLmdldCgpKSk7Ci0gIGNiLT5PbkNsaWVudFJlZ2lzdGVyZWQoc3RhdHVzLCAoc3RhdHVzID09IGJsdWV0b290aDo6QkxFX1NUQVRVU19TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5zdGFuY2UtPkdldEluc3RhbmNlSWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0ludmFsaWRJbnN0YW5jZUlkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sb3dfZW5lcmd5X2JpbmRlcl9zZXJ2ZXIuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfbG93X2VuZXJneV9iaW5kZXJfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDhiMzQuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2JsdWV0b290aF9sb3dfZW5lcmd5X2JpbmRlcl9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2suaD4KLSNpbmNsdWRlICJhbmRyb2lkL2JsdWV0b290aC9CbkJsdWV0b290aExvd0VuZXJneS5oIgotCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2ludGVyZmFjZV93aXRoX2luc3RhbmNlc19iYXNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9sb3dfZW5lcmd5X2NsaWVudC5oIgotCi11c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotCi11c2luZyBhbmRyb2lkOjpibHVldG9vdGg6OkJuQmx1ZXRvb3RoTG93RW5lcmd5OwotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2s7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotY2xhc3MgQWRhcHRlcjsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgYmluZGVyIHsKLQotLy8gSW1wbGVtZW50cyB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIElCbHVldG9vdGhMb3dFbmVyZ3kgaW50ZXJmYWNlLgotY2xhc3MgQmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyCi0gICAgOiBwdWJsaWMgQm5CbHVldG9vdGhMb3dFbmVyZ3ksCi0gICAgICBwdWJsaWMgSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2UsCi0gICAgICBwdWJsaWMgYmx1ZXRvb3RoOjpMb3dFbmVyZ3lDbGllbnQ6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJsdWV0b290aExvd0VuZXJneUJpbmRlclNlcnZlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+Qmx1ZXRvb3RoTG93RW5lcmd5QmluZGVyU2VydmVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSUJsdWV0b290aExvd0VuZXJneSBvdmVycmlkZXM6Ci0gIFN0YXR1cyBSZWdpc3RlckNsaWVudCgKLSAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCbHVldG9vdGhMb3dFbmVyZ3lDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIFVucmVnaXN0ZXJDbGllbnQoaW50IGNsaWVudF9pZCkgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBVbnJlZ2lzdGVyQWxsKCkgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBDb25uZWN0KGludCBjbGllbnRfaWQsIGNvbnN0IFN0cmluZzE2JiBhZGRyZXNzLCBib29sIGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgU3RhdHVzIERpc2Nvbm5lY3QoaW50IGNsaWVudF9pZCwgY29uc3QgU3RyaW5nMTYmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gIFN0YXR1cyBTZXRNdHUoaW50IGNsaWVudF9pZCwgY29uc3QgU3RyaW5nMTYmIGFkZHJlc3MsIGludCBtdHUsCi0gICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAvLyBibHVldG9vdGg6Okxvd0VuZXJneUNsaWVudDo6RGVsZWdhdGUgb3ZlcnJpZGVzOgotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGJsdWV0b290aDo6TG93RW5lcmd5Q2xpZW50KiBjbGllbnQsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOwotICB2b2lkIE9uTXR1Q2hhbmdlZChibHVldG9vdGg6Okxvd0VuZXJneUNsaWVudCogY2xpZW50LCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLCBpbnQgbXR1KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2sgaW5zdGFuY2UgYXNzb2NpYXRlZAotICAvLyB3aXRoIHxjbGllbnRfaWR8LiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIGNhbGxiYWNrIGNhbm5vdCBiZSBmb3VuZC4KLSAgYW5kcm9pZDo6c3A8SUJsdWV0b290aExvd0VuZXJneUNhbGxiYWNrPiBHZXRMRUNhbGxiYWNrKGludCBjbGllbnRfaWQpOwotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBMb3dFbmVyZ3lDbGllbnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoCi0gIC8vIHxjbGllbnRfaWR8LiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIGNsaWVudCBjYW5ub3QgYmUgZm91bmQuCi0gIHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6Okxvd0VuZXJneUNsaWVudD4gR2V0TEVDbGllbnQoaW50IGNsaWVudF9pZCk7Ci0KLSAgLy8gSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2Ugb3ZlcnJpZGU6Ci0gIHZvaWQgT25SZWdpc3Rlckluc3RhbmNlSW1wbChibHVldG9vdGg6OkJMRVN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2UqIGluc3RhbmNlKSBvdmVycmlkZTsKLQotICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXJfOyAgLy8gd2VhawotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhMb3dFbmVyZ3lCaW5kZXJTZXJ2ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2ludGVyZmFjZV93aXRoX2luc3RhbmNlc19iYXNlLmNjIGIvc2VydmljZS9pcGMvYmluZGVyL2ludGVyZmFjZV93aXRoX2luc3RhbmNlc19iYXNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE2YmJkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLW5hbWVzcGFjZSBpcGMgewotbmFtZXNwYWNlIGJpbmRlciB7Ci0KLWJvb2wgSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2U6OlJlZ2lzdGVySW5zdGFuY2VCYXNlKAotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+JiBjYWxsYmFjaywKLSAgICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlRmFjdG9yeSogZmFjdG9yeSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotICBDSEVDSyhmYWN0b3J5KTsKLQotICBpZiAoIWNhbGxiYWNrLmdldCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGEgTlVMTCBjYWxsYmFjayI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU3RvcmUgdGhlIGNhbGxiYWNrIGluIHRoZSBwZW5kaW5nIGxpc3QuIEl0IHdpbGwgZ2V0IHJlbW92ZWQgbGF0ZXIgd2hlbiB0aGUKLSAgLy8gc3RhY2sgbm90aWZpZXMgdXMgYXN5bmNocm9ub3VzbHkuCi0gIGJsdWV0b290aDo6VXVpZCBhcHBfdXVpZCA9IGJsdWV0b290aDo6VXVpZDo6R2V0UmFuZG9tKCk7Ci0gIGlmICghcGVuZGluZ19jYWxsYmFja3NfLlJlZ2lzdGVyKGFwcF91dWlkLCBjYWxsYmFjaykpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc3RvcmUgfGNhbGxiYWNrfCB0byBtYXAiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIHdlYWsgcG9pbnRlciBhbmQgcGFzcyB0aGF0IHRvIHRoZSBjYWxsYmFjayB0byBwcmV2ZW50IGFuIGludmFsaWQKLSAgLy8gYWNjZXNzIGxhdGVyLiBTaW5jZSB0aGlzIG9iamVjdCBpcyBtYW5hZ2VkIHVzaW5nIEFuZHJvaWQncyBTdHJvbmdQb2ludGVyCi0gIC8vIChzcCkgd2UgYXJlIHVzaW5nIGEgd3AgaGVyZSByYXRoZXIgdGhhbiBzdGQ6OndlYWtfcHRyLgotICBhbmRyb2lkOjp3cDxJbnRlcmZhY2VXaXRoSW5zdGFuY2VzQmFzZT4gd2Vha19wdHJfdG9fdGhpcyh0aGlzKTsKLQotICBibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlRmFjdG9yeTo6UmVnaXN0ZXJDYWxsYmFjayBjYiA9Ci0gICAgICBbd2Vha19wdHJfdG9fdGhpc10oCi0gICAgICAgICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIGluX3V1aWQsCi0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2U+IGluc3RhbmNlKSB7Ci0gICAgICAgIC8vIElmIHRoZSB3ZWFrIHBvaW50ZXIgd2FzIGludmFsaWRhdGVkIHRoZW4gdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8uCi0gICAgICAgIGFuZHJvaWQ6OnNwPEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlPiBzdHJvbmdfcHRyX3RvX3RoaXMgPQotICAgICAgICAgICAgd2Vha19wdHJfdG9fdGhpcy5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICghc3Ryb25nX3B0cl90b190aGlzLmdldCgpKSB7Ci0gICAgICAgICAgVkxPRygyKSA8PCAiSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2Ugd2FzIGRlbGV0ZWQgd2hpbGUgaW5zdGFuY2Ugd2FzIgotICAgICAgICAgICAgICAgICAgPDwgIiBiZWluZyByZWdpc3RlcmVkIjsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJvbmdfcHRyX3RvX3RoaXMtPk9uUmVnaXN0ZXJJbnN0YW5jZShzdGF0dXMsIGluX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShpbnN0YW5jZSkpOwotICAgICAgfTsKLQotICBpZiAoZmFjdG9yeS0+UmVnaXN0ZXJJbnN0YW5jZShhcHBfdXVpZCwgY2IpKSByZXR1cm4gdHJ1ZTsKLQotICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgaW5zdGFuY2UiOwotICBwZW5kaW5nX2NhbGxiYWNrc18uUmVtb3ZlKGFwcF91dWlkKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2U6OlVucmVnaXN0ZXJJbnN0YW5jZUJhc2UoaW50IGluc3RhbmNlX2lkKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1hcHNfbG9ja18pOwotCi0gIGlkX3RvX2NiXy5SZW1vdmUoaW5zdGFuY2VfaWQpOwotICBpZF90b19pbnN0YW5jZV8uZXJhc2UoaW5zdGFuY2VfaWQpOwotfQotCi12b2lkIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlOjpVbnJlZ2lzdGVyQWxsQmFzZSgpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobWFwc19sb2NrXyk7Ci0KLSAgaWRfdG9fY2JfLkNsZWFyKCk7Ci0gIGlkX3RvX2luc3RhbmNlXy5jbGVhcigpOwotfQotCi12b2lkIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlOjpGb3JFYWNoQ2FsbGJhY2soCi0gICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKElJbnRlcmZhY2UqKT4mIGZ1bmMpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobWFwc19sb2NrXyk7Ci0gIGZvciAoYXV0byYgcGFpciA6IGlkX3RvX2luc3RhbmNlXykgewotICAgIGF1dG8gY2IgPSBpZF90b19jYl8uR2V0KHBhaXIuZmlyc3QpOwotICAgIGZ1bmMoY2IuZ2V0KCkpOwotICB9Ci19Ci0KLWFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlOjpHZXRDYWxsYmFjaygKLSAgICBpbnQgaW5zdGFuY2VfaWQpIHsKLSAgcmV0dXJuIGlkX3RvX2NiXy5HZXQoaW5zdGFuY2VfaWQpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZT4KLUludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlOjpHZXRJbnN0YW5jZShpbnQgaW5zdGFuY2VfaWQpIHsKLSAgYXV0byBpdGVyID0gaWRfdG9faW5zdGFuY2VfLmZpbmQoaW5zdGFuY2VfaWQpOwotICBpZiAoaXRlciA9PSBpZF90b19pbnN0YW5jZV8uZW5kKCkpCi0gICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlPigpOwotICByZXR1cm4gaXRlci0+c2Vjb25kOwotfQotCi12b2lkIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlOjpPblJlZ2lzdGVySW5zdGFuY2UoCi0gICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2U+IGluc3RhbmNlKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiAtIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0KLSAgLy8gU2ltcGx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSB8cGVuZGluZ19jYWxsYmFja3NffCBhcyBpdCBubyBsb25nZXIKLSAgLy8gYmVsb25ncyBpbiB0aGVyZS4KLSAgc3A8SUludGVyZmFjZT4gY2FsbGJhY2sgPSBwZW5kaW5nX2NhbGxiYWNrc18uUmVtb3ZlKHV1aWQpOwotCi0gIC8vIHxjYWxsYmFja3wgbWlnaHQgYmUgTlVMTCBpZiBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBwZW5kaW5nIGxpc3QsIGUuZy4gdGhlCi0gIC8vIHJlbW90ZSBwcm9jZXNzIHRoYXQgb3ducyB0aGUgY2FsbGJhY2sgZGllZC4KLSAgaWYgKCFjYWxsYmFjay5nZXQoKSkgewotICAgIFZMT0coMSkgPDwgIkNhbGxiYWNrIHdhcyByZW1vdmVkIGJlZm9yZSB0aGUgY2FsbCB0byBcIlJlZ2lzdGVySW5zdGFuY2VcIiAiCi0gICAgICAgICAgICA8PCAicmV0dXJuZWQ7IHVucmVnaXN0ZXJpbmcgaW5zdGFuY2UiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gYmx1ZXRvb3RoOjpCTEVfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAvLyBUaGUgY2FsbCB3YXNuJ3Qgc3VjY2Vzc2Z1bC4gTm90aWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgcmV0dXJuLgotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWdpc3RlciBpbnN0YW5jZTogIiA8PCBzdGF0dXM7Ci0gICAgT25SZWdpc3Rlckluc3RhbmNlSW1wbChzdGF0dXMsIGNhbGxiYWNrLCBudWxscHRyKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtYXBzX2xvY2tfKTsKLSAgaW50IGluc3RhbmNlX2lkID0gaW5zdGFuY2UtPkdldEluc3RhbmNlSWQoKTsKLSAgaWYgKCFpZF90b19jYl8uUmVnaXN0ZXIoaW5zdGFuY2VfaWQsIGNhbGxiYWNrLCB0aGlzKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzdG9yZSBjYWxsYmFjayI7Ci0gICAgT25SZWdpc3Rlckluc3RhbmNlSW1wbChibHVldG9vdGg6OkJMRV9TVEFUVVNfRkFJTFVSRSwgY2FsbGJhY2ssIG51bGxwdHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFZMT0coMSkgPDwgIlJlZ2lzdGVyZWQgQmx1ZXRvb3RoSW5zdGFuY2UgLSBJRDogIiA8PCBpbnN0YW5jZV9pZDsKLQotICBhdXRvIHNoYXJlZF9pbnN0YW5jZSA9Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZT4oaW5zdGFuY2UucmVsZWFzZSgpKTsKLSAgaWRfdG9faW5zdGFuY2VfW2luc3RhbmNlX2lkXSA9IHNoYXJlZF9pbnN0YW5jZTsKLQotICBPblJlZ2lzdGVySW5zdGFuY2VJbXBsKHN0YXR1cywgY2FsbGJhY2ssIHNoYXJlZF9pbnN0YW5jZS5nZXQoKSk7Ci19Ci0KLXZvaWQgSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2U6Ok9uUmVtb3RlQ2FsbGJhY2tSZW1vdmVkKGNvbnN0IGludCYga2V5KSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBpbnN0YW5jZV9pZDogIiA8PCBrZXk7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1hcHNfbG9ja18pOwotCi0gIC8vIE5vIG5lZWQgdG8gcmVtb3ZlIGZyb20gdGhlIGNhbGxiYWNrIG1hcCBhcyB0aGUgZW50cnkgc2hvdWxkIGJlIGFscmVhZHkKLSAgLy8gcmVtb3ZlZCB3aGVuIHRoaXMgY2FsbGJhY2sgZ2V0cyBjYWxsZWQuCi0gIGlkX3RvX2luc3RhbmNlXy5lcmFzZShrZXkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvaW50ZXJmYWNlX3dpdGhfaW5zdGFuY2VzX2Jhc2UuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYyODE3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9pbnRlcmZhY2Vfd2l0aF9pbnN0YW5jZXNfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInNlcnZpY2UvYmx1ZXRvb3RoX2luc3RhbmNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL3JlbW90ZV9jYWxsYmFja19tYXAuaCIKLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgYmluZGVyIHsKLQotLy8gSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2UgcHJvdmlkZXMgYSBjb21tb24gYmFzZSBjbGFzcyBmb3IgQmluZGVyIGludGVyZmFjZQotLy8gc2VydmVycyB0aGF0IGludm9sdmUgaW5zdGFuY2UgY2FsbGJhY2sgQmluZGVycyByZWdpc3RlcmVkIHdpdGggYW4gaW50ZWdlcgotLy8gaW5zdGFuY2UgSUQgb3ZlciBhbiBhc3luY2hyb25vdXMgbG93ZXItbGV2ZWwgc3RhY2sgQVBJLiBUaGlzIGNsYXNzIGFic3RyYWN0cwotLy8gYXdheSB0aGUgY29tbW9uIHByb2NlZHVyZXMgb2YgbWFuYWdpbmcgcGVuZGluZyBjYWxsYmFja3MsIGxpc3RlbmluZyB0byBkZWF0aAotLy8gbm90aWZpY2F0aW9ucywgYW5kIG1haW50YWluaW5nIG11bHRpcGxlIGludGVybmFsIG1hcHMgaW4gb25lIGNvbW1vbiBiYXNlCi0vLyBjbGFzcy4KLS8vIFRPRE86IGFkZCBjb2RlIGV4YW1wbGUgaGVyZS4KLWNsYXNzIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlCi0gICAgOiBwdWJsaWMgUmVtb3RlQ2FsbGJhY2tNYXA8aW50LCBhbmRyb2lkOjpJSW50ZXJmYWNlPjo6RGVsZWdhdGUsCi0gICAgICB2aXJ0dWFsIHB1YmxpYyBhbmRyb2lkOjpSZWZCYXNlIHsKLSBwdWJsaWM6Ci0gIEludGVyZmFjZVdpdGhJbnN0YW5jZXNCYXNlKCkgPSBkZWZhdWx0OwotICB+SW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFRoZSBpbml0aWFsIGVudHJ5IHBvaW50IGZvciByZWdpc3RlcmluZyBhIGluc3RhbmNlLiBJbnZva2UgdGhpcyBmcm9tIHRoZQotICAvLyByZWdpc3RyYXRpb24gQVBJIHRvIGFkZCBhIGluc3RhbmNlL1V1aWQgcGFpciB0byB0aGUgcGVuZGluZyBsaXN0IGFuZCBzZXQgdXAKLSAgLy8gdGhlIGdlbmVyaWMgYXN5bmNocm9ub3VzIGNhbGxiYWNrIGhhbmRsZXIgYW5kIGluaXRpYXRlIHRoZSBwcm9jZXNzIHdpdGggdGhlCi0gIC8vIGdpdmVuIHxmYWN0b3J5fCBpbnN0YW5jZS4gUmV0dXJucyBmYWxzZSwgaWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzIHRoYXQKLSAgLy8gY291bGQgYmUgc3luY2hyb25vdXNseSByZXBvcnRlZC4KLSAgYm9vbCBSZWdpc3Rlckluc3RhbmNlQmFzZShjb25zdCBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZUZhY3RvcnkqIGZhY3RvcnkpOwotCi0gIC8vIFVucmVnaXN0ZXIgdGhlIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIElELCBpZiBpdCB3YXMgcmVnaXN0ZXJlZCBiZWZvcmUuCi0gIHZvaWQgVW5yZWdpc3Rlckluc3RhbmNlQmFzZShpbnQgaW5zdGFuY2VfaWQpOwotCi0gIC8vIFVucmVnaXN0ZXJzIGFsbCByZWdpc3RlcmVkIGluc3RhbmNlcy4KLSAgdm9pZCBVbnJlZ2lzdGVyQWxsQmFzZSgpOwotCi0gIHZvaWQgRm9yRWFjaENhbGxiYWNrKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChJSW50ZXJmYWNlKik+JiBmdW5jKTsKLQotICAvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBsb2NrIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbAotICAvLyBkYXRhIHN0cnVjdHVyZXMuIFN1YmNsYXNzZXMgc2hvdWxkIGFjcXVpcmUgdGhpcyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBtYXBzLgotICBzdGQ6Om11dGV4KiBtYXBzX2xvY2soKSB7IHJldHVybiAmbWFwc19sb2NrXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIGNhbGxiYWNrIGludGVyZmFjZSBiaW5kZXIgdGhhdCBpcyBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4KLSAgLy8gaW5zdGFuY2UgSUQgfGluc3RhbmNlX2lkfC4gVGhlIHJldHVybmVkIHBvaW50ZXIgd2lsbCBjb250YWluIE5VTEwgaWYgYW4KLSAgLy8gZW50cnkgZm9yIHRoZSBnaXZlbiBJRCBjYW5ub3QgYmUgZm91bmQuCi0gIGFuZHJvaWQ6OnNwPElJbnRlcmZhY2U+IEdldENhbGxiYWNrKGludCBpbnN0YW5jZV9pZCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBpcyBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gaW5zdGFuY2UgSUQKLSAgLy8gfGluc3RhbmNlX2lkfC4gVGhlIHJldHVybmVkIHBvaW50ZXIgd2lsbCBjb250YWluIE5VTEwgaWYgYW4gZW50cnkgZm9yIHRoZQotICAvLyBnaXZlbiBJRCBjYW5ub3QgYmUgZm91bmQuCi0gIHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlPiBHZXRJbnN0YW5jZShpbnQgaW5zdGFuY2VfaWQpOwotCi0gcHJpdmF0ZToKLSAgLy8gQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVnaXN0ZXIgY2FsbGJhY2suCi0gIHZvaWQgT25SZWdpc3Rlckluc3RhbmNlKAotICAgICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpCbHVldG9vdGhJbnN0YW5jZT4gaW5zdGFuY2UpOwotCi0gIC8vIENhbGxlZCB3aGVuIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gaGFzIGNvbXBsZXRlZC4gfGluc3RhbmNlfCBpcyBvd25lZCBieQotICAvLyB0aGUgYmFzZSBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSBkZWxldGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gSWYgdGhlCi0gIC8vIG9wZXJhdGlvbiBmYWlsZWQsIG51bGxwdHIgd2lsbCBiZSBwYXNzZWQgZm9yIHxpbnN0YW5jZXwuCi0gIHZpcnR1YWwgdm9pZCBPblJlZ2lzdGVySW5zdGFuY2VJbXBsKAotICAgICAgYmx1ZXRvb3RoOjpCTEVTdGF0dXMgc3RhdHVzLCBhbmRyb2lkOjpzcDxJSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgIGJsdWV0b290aDo6Qmx1ZXRvb3RoSW5zdGFuY2UqIGluc3RhbmNlKSA9IDA7Ci0KLSAgLy8gUmVtb3RlQ2FsbGJhY2tNYXA8aW50LCBJQmx1ZXRvb3RoTG93RW5lcmd5Q2FsbGJhY2s+OjpEZWxlZ2F0ZSBvdmVycmlkZToKLSAgdm9pZCBPblJlbW90ZUNhbGxiYWNrUmVtb3ZlZChjb25zdCBpbnQmIGtleSkgb3ZlcnJpZGU7Ci0KLSAgLy8gSW5zdGFuY2VzIHRoYXQgYXJlIHBlbmRpbmcgcmVnaXN0cmF0aW9uLiBPbmNlIHRoZWlyIHJlZ2lzdHJhdGlvbiBpcwotICAvLyBjb21wbGV0ZSwgdGhlIGVudHJ5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwLgotICBSZW1vdGVDYWxsYmFja01hcDxibHVldG9vdGg6OlV1aWQsIGFuZHJvaWQ6OklJbnRlcmZhY2U+IHBlbmRpbmdfY2FsbGJhY2tzXzsKLQotICAvLyBXZSBrZWVwIHR3byBtYXBzIGhlcmU6IG9uZSBmcm9tIGluc3RhbmNlX2lkIElEcyB0byBjYWxsYmFjayBCaW5kZXJzIGFuZCBvbmUKLSAgLy8gZnJvbSBpbnN0YW5jZV9pZCBJRHMgdG8gdGhlIEJsdWV0b290aEluc3RhbmNlIHN0cnVjdHVyZXMgdGhlbXNlbHZlcy4KLSAgc3RkOjptdXRleCBtYXBzX2xvY2tfOyAgLy8gTmVlZGVkIGZvciB8aWRfdG9faW5zdGFuY2VffC4KLSAgUmVtb3RlQ2FsbGJhY2tNYXA8aW50LCBJSW50ZXJmYWNlPiBpZF90b19jYl87Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OkJsdWV0b290aEluc3RhbmNlPj4KLSAgICAgIGlkX3RvX2luc3RhbmNlXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW50ZXJmYWNlV2l0aEluc3RhbmNlc0Jhc2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRlcgotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2lwY19oYW5kbGVyX2JpbmRlci5jYyBiL3NlcnZpY2UvaXBjL2JpbmRlci9pcGNfaGFuZGxlcl9iaW5kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZmY2NmYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvYmluZGVyL2lwY19oYW5kbGVyX2JpbmRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9pcGMvYmluZGVyL2lwY19oYW5kbGVyX2JpbmRlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLQotI2luY2x1ZGUgImFic3RyYWN0X21lc3NhZ2VfbG9vcC5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9ibHVldG9vdGhfYmluZGVyX3NlcnZlci5oIgotCi11c2luZyBhbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXI7Ci11c2luZyBhbmRyb2lkOjpzcDsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwotCi1uYW1lc3BhY2UgaXBjIHsKLQotc3RkOjpzdHJpbmcga1NlcnZpY2VOYW1lID0gImJsdWV0b290aC1zZXJ2aWNlIjsKLQotSVBDSGFuZGxlckJpbmRlcjo6SVBDSGFuZGxlckJpbmRlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ01hbmFnZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSkKLSAgICA6IElQQ0hhbmRsZXIoYWRhcHRlciwgZGVsZWdhdGUpIHt9Ci0KLUlQQ0hhbmRsZXJCaW5kZXI6On5JUENIYW5kbGVyQmluZGVyKCkge30KLQotYm9vbCBJUENIYW5kbGVyQmluZGVyOjpSdW4oKSB7Ci0gIENIRUNLKGFkYXB0ZXIoKSk7Ci0KLSAgLy8gUmVnaXN0ZXIgdGhlIElCbHVldG9vdGggc2VydmljZSB3aXRoIHRoZSBBbmRyb2lkIFNlcnZpY2VNYW5hZ2VyLgotICBhbmRyb2lkOjpzcDxiaW5kZXI6OkJsdWV0b290aEJpbmRlclNlcnZlcj4gYnRfc2VydmVyID0KLSAgICAgIG5ldyBiaW5kZXI6OkJsdWV0b290aEJpbmRlclNlcnZlcihhZGFwdGVyKCkpOwotICBzdGF0dXNfdCBzdGF0dXMgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZSgKLSAgICAgIFN0cmluZzE2KFN0cmluZzgoa1NlcnZpY2VOYW1lLmNfc3RyKCkpKSwgYnRfc2VydmVyKTsKLSAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWdpc3RlciBCbHVldG9vdGggc2VydmljZSB3aXRoIFNlcnZpY2VNYW5hZ2VyIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBOb3RpZnkgdGhlIGRlbGVnYXRlLiBXZSBkbyB0aGlzIGluIHRoZSBtZXNzYWdlIGxvb3AgdG8gYXZvaWQgcmVlbnRyYW5jeS4KLSAgaWYgKGRlbGVnYXRlKCkpIHsKLSAgICBidGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3A6OmN1cnJlbnRfdGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmSVBDSGFuZGxlckJpbmRlcjo6Tm90aWZ5U3RhcnRlZCwgdGhpcykpOwotICB9Ci0KLSAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIElQQ0hhbmRsZXJCaW5kZXI6OlN0b3AoKSB7Ci0gIC8vIFRPRE8oYXJtYW5zaXRvKTogVGhlcmUgYXJlIHNldmVyYWwgbWV0aG9kcyBpbiBhbmRyb2lkOjpJUENUaHJlYWRTdGF0ZSB0aGF0Ci0gIC8vIGFyZSByZWxhdGVkIHRvIHNodXR0aW5nIGRvd24gdGhlIHRocmVhZHBvb2wsIGhvd2V2ZXIgSSBoYXZlbid0IGJlZW4gYWJsZSB0bwotICAvLyBtYWtlIHRoZW0gc2h1dCB0aGluZ3MgZG93biBjbGVhbmx5LiBGaWd1cmUgb3V0IHRoZSByaWdodCB3YXkgdG8gc3RvcCB0aGUKLSAgLy8gQmluZGVyIElQQyBoZXJlLgotfQotCi12b2lkIElQQ0hhbmRsZXJCaW5kZXI6Ok5vdGlmeVN0YXJ0ZWQoKSB7Ci0gIGlmIChkZWxlZ2F0ZSgpKSBkZWxlZ2F0ZSgpLT5PbklQQ0hhbmRsZXJTdGFydGVkKElQQ01hbmFnZXI6OlRZUEVfQklOREVSKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvYmluZGVyL2lwY19oYW5kbGVyX2JpbmRlci5oIGIvc2VydmljZS9pcGMvYmluZGVyL2lwY19oYW5kbGVyX2JpbmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRkMzIzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9pcGNfaGFuZGxlcl9iaW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9pcGNfaGFuZGxlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBpcGMgewotCi0vLyBJbXBsZW1lbnRzIGEgQmluZGVyIGJhc2VkIElQQ0hhbmRsZXIuCi1jbGFzcyBJUENIYW5kbGVyQmluZGVyIDogcHVibGljIElQQ0hhbmRsZXIgewotIHB1YmxpYzoKLSAgSVBDSGFuZGxlckJpbmRlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsIElQQ01hbmFnZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSk7Ci0gIH5JUENIYW5kbGVyQmluZGVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSVBDSGFuZGxlciBvdmVycmlkZXM6Ci0gIGJvb2wgUnVuKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgSVBDSGFuZGxlckJpbmRlcigpID0gZGVmYXVsdDsKLQotICAvLyBOb3RpZnkgdGhlIGRlbGVnYXRlIHRoYXQgSVBDIGhhcyBzdGFydGVkLgotICB2b2lkIE5vdGlmeVN0YXJ0ZWQoKTsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSVBDSGFuZGxlckJpbmRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvcmVtb3RlX2NhbGxiYWNrX2xpc3QuaCBiL3NlcnZpY2UvaXBjL2JpbmRlci9yZW1vdGVfY2FsbGJhY2tfbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjVlNTUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2JpbmRlci9yZW1vdGVfY2FsbGJhY2tfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBiaW5kZXIgewotCi0vLyBUYWtlcyBjYXJlIG9mIHRoZSBncnVudCB3b3JrIG9mIG1haW50YWluaW5nIGEgbGlzdCBvZiByZW1vdGUgaW50ZXJmYWNlcywKLS8vIHR5cGljYWxseSBmb3IgdGhlIHVzZSBvZiBwZXJmb3JtaW5nIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZyb20gYSByZW1vdGUKLS8vIHNlcnZpY2UuIFRoaXMgaXMgYSBuYXRpdmUgZXF1aXZhbGVudCBvZiB0aGUgdGhlIGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2tMaXN0Ci0vLyBKYXZhIGNsYXNzLiBUaGUgdHlwZSAiVCIgbXVzdCBpbmhlcml0IGZyb20gYW5kcm9pZDo6SUludGVyZmFjZS4KLS8vCi0vLyBUT0RPKGFybWFuc2l0byk6IFdlIG5lZWQgdG8gdW5pdCB0ZXN0IHRoaXMgY2xhc3MuIFJpZ2h0IG5vdyBpdCdzIGRlZmluZWQgYXMgYQotLy8gc2ltcGxlIHRlbXBsYXRlIGludGVyZmFjZSBvdmVyIHRoZSBuYXRpdmUgbGliYmluZGVyIHR5cGVzIGRpcmVjdGx5IGFuZCB3ZQotLy8gY2FuJ3QgY29tcGlsZSBsaWJiaW5kZXIgZm9yIGhvc3QgdW5sZXNzIHRoZSBCaW5kZXIga2VybmVsIG1vZHVsZSBpcyBlbmFibGVkCi0vLyBvbiB0aGUgc3lzdGVtLiBGaWd1cmUgb3V0IHdoZXRoZXIgdG86Ci0vLyAgICAxKSB3cml0ZSB0aGUgQmluZGVyIHRlc3QtY29kZSBpbiBhIG5ldyB0YXJnZXQtb25seSBleGVjdXRhYmxlOwotLy8gICAgMikgY29uZGl0aW9uYWxseSBjb21waWxlIGludG8gdGhlIGhvc3QtbmF0aXZlIHRlc3Qgc3VpdGUgaWYgdGhlIEJpbmRlcgotLy8gICAgICAgbW9kdWxlIGlzIGJ1aWx0OwotLy8gICAgMykgcHJvdmlkZSBhIHRlc3Qtb25seSBzdGF0aWMgbGlicmFyeSB0aGF0IHJlLWRlZmluZXMgdGhlIGxpYmJpbmRlcgotLy8gICAgICAgY2xhc3NlcyBhcyBtb2Nrcy4KLS8vIChTZWUgaHR0cDovL2IvMjMzODYzODcpCi0vLwotLy8gVE9ETyhhcm1hbnNpdG8pOiBXZSBzaG91bGQgbWFrZSB0aGlzIGNsYXNzIG5vbi1maW5hbCBhbmQgdGhlIHRlbXBsYXRlCi0vLyBpbnRlcmZhY2UgYWJzdHJhY3QsIHNvIHRoYXQgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcyBjYW4gYmUgdW5pdCB0ZXN0ZWQKLS8vIGFnYWluc3QgYSBtb2NrIHZlcnNpb24gb2YgdGhpcyBjbGFzcy4KLS8vCi0vLyBUT0RPKGFybWFuc2l0byk6IENvbnNpZGVyIHN1Ym1pdHRpbmcgdGhpcyBjbGFzcyB0byBmcmFtZXdvcmtzL25hdGl2ZS9iaW5kZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJlbW90ZUNhbGxiYWNrTGlzdCBmaW5hbCB7Ci0gcHVibGljOgotICBSZW1vdGVDYWxsYmFja0xpc3QoKSA9IGRlZmF1bHQ7Ci0gIH5SZW1vdGVDYWxsYmFja0xpc3QoKTsKLQotICAvLyBSZWdpc3RlciBhbmQgdW5yZWdpc3RlciBhIGNhbGxiYWNrIGludGVyZmFjZS4gUmVnaXN0ZXJpbmcgd2lsbAotICAvLyBhdXRvbWF0aWNhbGx5IHN0YXJ0IHRyYWNraW5nIGZvciBkZWF0aCBub3RpZmljYXRpb25zIGluIGNhc2UgdGhlIHJlbW90ZQotICAvLyBwcm9jZXNzIGhvc3RpbmcgdGhlIEJpbmRlciBkaWVzLiBJbiBzdWNoIGEgY2FzZSwgdGhlIEJpbmRlciBpcwotICAvLyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLSAgYm9vbCBSZWdpc3Rlcihjb25zdCBhbmRyb2lkOjpzcDxUPiYgY2FsbGJhY2spOwotICBib29sIFVucmVnaXN0ZXIoY29uc3QgYW5kcm9pZDo6c3A8VD4mIGNhbGxiYWNrKTsKLQotICAvLyBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gZWFjaCBvZiB0aGUgY29udGFpbmVkIGNhbGxiYWNrcy4gVGhlIGludGVybmFsCi0gIC8vIG11dGV4IGlzIGxvY2tlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBpdGVyYXRpb24uCi0gIHZvaWQgRm9yRWFjaChjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoVCopPiYgY2FsbGJhY2spOwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgQ2FsbGJhY2tEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gICBwdWJsaWM6Ci0gICAgQ2FsbGJhY2tEZWF0aFJlY2lwaWVudChjb25zdCBhbmRyb2lkOjpzcDxUPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVDYWxsYmFja0xpc3QqIG93bmVyKTsKLQotICAgIGFuZHJvaWQ6OnNwPFQ+IGdldF9jYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIGNhbGxiYWNrXzsgfQotCi0gICAgLy8gYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgb3ZlcnJpZGU6Ci0gICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IGFuZHJvaWQ6OndwPGFuZHJvaWQ6OklCaW5kZXI+JiB3aG8pIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OnNwPFQ+IGNhbGxiYWNrXzsKLSAgICBSZW1vdGVDYWxsYmFja0xpc3Q8VD4qIG93bmVyXzsgIC8vIHdlYWsKLSAgfTsKLQotICAvLyBUeXBlZGVmIGZvciBpbnRlcm5hbCBtYXAgY29udGFpbmVyLiBUaGlzIGtlZXBzIHRyYWNrIG9mIGEgZ2l2ZW4gQmluZGVyIGFuZAotICAvLyBhIGRlYXRoIHJlY2VpdmVyIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgdXNpbmcgQ2FsbGJhY2tNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8YW5kcm9pZDo6SUJpbmRlciosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPENhbGxiYWNrRGVhdGhSZWNpcGllbnQ+PjsKLQotICBib29sIFVucmVnaXN0ZXJJbnRlcm5hbCh0eXBlbmFtZSBDYWxsYmFja01hcDo6aXRlcmF0b3IgaXRlcik7Ci0KLSAgc3RkOjptdXRleCBtYXBfbG9ja187Ci0gIENhbGxiYWNrTWFwIGNhbGxiYWNrc187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlbW90ZUNhbGxiYWNrTGlzdCk7Ci19OwotCi0vLyBUZW1wbGF0ZSBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGJlbG93Ci0KLXVzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Ci11c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwotdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjp3cDsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1SZW1vdGVDYWxsYmFja0xpc3Q8VD46On5SZW1vdGVDYWxsYmFja0xpc3QoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1hcF9sb2NrXyk7Ci0gIGZvciAoYXV0byBpdGVyID0gY2FsbGJhY2tzXy5iZWdpbigpOyBpdGVyICE9IGNhbGxiYWNrc18uZW5kKCk7ICsraXRlcikKLSAgICBVbnJlZ2lzdGVySW50ZXJuYWwoaXRlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBSZW1vdGVDYWxsYmFja0xpc3Q8VD46OlJlZ2lzdGVyKGNvbnN0IHNwPFQ+JiBjYWxsYmFjaykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtYXBfbG9ja18pOwotCi0gIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbGxiYWNrLmdldCgpKTsKLSAgaWYgKGNhbGxiYWNrc18uZmluZChiaW5kZXIuZ2V0KCkpICE9IGNhbGxiYWNrc18uZW5kKCkpIHsKLSAgICBWTE9HKDEpIDw8ICJDYWxsYmFjayBsaXN0IGFscmVhZHkgY29udGFpbnMgZ2l2ZW4gY2FsbGJhY2siOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNwPENhbGxiYWNrRGVhdGhSZWNpcGllbnQ+IGRyKG5ldyBDYWxsYmFja0RlYXRoUmVjaXBpZW50KGNhbGxiYWNrLCB0aGlzKSk7Ci0KLSAgaWYgKGJpbmRlci0+bGlua1RvRGVhdGgoZHIpICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxpbmsgZGVhdGggcmVjaXBpZW50IHRvIGJpbmRlciI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY2FsbGJhY2tzX1tiaW5kZXIuZ2V0KCldID0gZHI7Ci0KLSAgVkxPRygyKSA8PCAiQ2FsbGJhY2sgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgd2l0aCBsaXN0IjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIFJlbW90ZUNhbGxiYWNrTGlzdDxUPjo6VW5yZWdpc3Rlcihjb25zdCBzcDxUPiYgY2FsbGJhY2spIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobWFwX2xvY2tfKTsKLQotICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjYWxsYmFjay5nZXQoKSk7Ci0gIGF1dG8gaXRlciA9IGNhbGxiYWNrc18uZmluZChiaW5kZXIuZ2V0KCkpOwotICBpZiAoaXRlciA9PSBjYWxsYmFja3NfLmVuZCgpKSB7Ci0gICAgVkxPRygyKSA8PCAiR2l2ZW4gY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGxpc3QiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBVbnJlZ2lzdGVySW50ZXJuYWwoaXRlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBSZW1vdGVDYWxsYmFja0xpc3Q8VD46OkZvckVhY2goY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKFQqKT4mIGNhbGxiYWNrKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1hcF9sb2NrXyk7Ci0gIGZvciAoY29uc3QgYXV0byYgaXRlciA6IGNhbGxiYWNrc18pCi0gICAgY2FsbGJhY2soaXRlci5zZWNvbmQtPmdldF9jYWxsYmFjaygpLmdldCgpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIFJlbW90ZUNhbGxiYWNrTGlzdDxUPjo6VW5yZWdpc3RlckludGVybmFsKAotICAgIHR5cGVuYW1lIENhbGxiYWNrTWFwOjppdGVyYXRvciBpdGVyKSB7Ci0gIHNwPENhbGxiYWNrRGVhdGhSZWNpcGllbnQ+IGRyID0gaXRlci0+c2Vjb25kOwotICBjYWxsYmFja3NfLmVyYXNlKGl0ZXIpOwotCi0gIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihkci0+Z2V0X2NhbGxiYWNrKCkuZ2V0KCkpLT51bmxpbmtUb0RlYXRoKGRyKSAhPQotICAgICAgYW5kcm9pZDo6Tk9fRVJST1IpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5saW5rIGRlYXRoIHJlY2lwaWVudCBmcm9tIGJpbmRlciI7Ci0KLSAgICAvLyBXZSByZW1vdmVkIHRoZSBlbnRyeSBmcm9tIHxtYXBffCBidXQgdW5saW5rVG9EZWF0aCBmYWlsZWQuIFRoZXJlIGlzbid0Ci0gICAgLy8gcmVhbGx5IG11Y2ggd2UgY2FuIGRvIGhlcmUgb3RoZXIgdGhhbiBkZWxldGluZyB0aGUgYmluZGVyIGFuZCByZXR1cm5pbmcKLSAgICAvLyBhbiBlcnJvci4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBWTE9HKDIpIDw8ICJDYWxsYmFjayBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIGxpc3QiOwotCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVJlbW90ZUNhbGxiYWNrTGlzdDxUPjo6Q2FsbGJhY2tEZWF0aFJlY2lwaWVudDo6Q2FsbGJhY2tEZWF0aFJlY2lwaWVudCgKLSAgICBjb25zdCBzcDxUPiYgY2FsbGJhY2ssIFJlbW90ZUNhbGxiYWNrTGlzdDxUPiogb3duZXIpCi0gICAgOiBjYWxsYmFja18oY2FsbGJhY2spLCBvd25lcl8ob3duZXIpIHsKLSAgQ0hFQ0soY2FsbGJhY2tfLmdldCgpKTsKLSAgQ0hFQ0sob3duZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIFJlbW90ZUNhbGxiYWNrTGlzdDxUPjo6Q2FsbGJhY2tEZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZCgKLSAgICBjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Ci0gIFZMT0coMSkgPDwgIlJlY2VpdmVkIGJpbmRlckRpZWQiOwotCi0gIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbGxiYWNrXy5nZXQoKSk7Ci0gIENIRUNLKHdoby51bnNhZmVfZ2V0KCkgPT0gYmluZGVyLmdldCgpKTsKLQotICAvLyBSZW1vdmUgdGhlIGNhbGxiYWNrIGJ1dCBubyBuZWVkIHRvIGNhbGwgdW5saW5rVG9EZWF0aC4KLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sob3duZXJfLT5tYXBfbG9ja18pOwotICBhdXRvIGl0ZXIgPSBvd25lcl8tPmNhbGxiYWNrc18uZmluZChiaW5kZXIuZ2V0KCkpOwotICBDSEVDSyhpdGVyICE9IG93bmVyXy0+Y2FsbGJhY2tzXy5lbmQoKSk7Ci0gIG93bmVyXy0+Y2FsbGJhY2tzXy5lcmFzZShpdGVyKTsKLQotICBWTE9HKDEpIDw8ICJDYWxsYmFjayBmcm9tIGRlYWQgcHJvY2VzcyB1bnJlZ2lzdGVyZWQiOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmluZGVyCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9iaW5kZXIvcmVtb3RlX2NhbGxiYWNrX21hcC5oIGIvc2VydmljZS9pcGMvYmluZGVyL3JlbW90ZV9jYWxsYmFja19tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMWI1My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9iaW5kZXIvcmVtb3RlX2NhbGxiYWNrX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgYmluZGVyIHsKLQotLy8gQSBtYXAgb2YgcmVtb3RlIGludGVyZmFjZXMgd2hlcmUgdGhlIHZhbHVlIHR5cGUgIlYiIG11c3QgaW5oZXJpdCBmcm9tCi0vLyBhbmRyb2lkOjpJSW50ZXJmYWNlLiBUaGlzIGlzIGp1c3QgbGlrZSBSZW1vdGVDYWxsYmFja0xpc3QgZXhjZXB0IGl0IHByb3ZpZGVzCi0vLyBhIGtleS12YWx1ZSBtYXBwaW5nLgotLy8KLS8vIFRPRE8oYXJtYW5zaXRvKTogV2Ugc2hvdWxkIG1ha2UgdGhpcyBjbGFzcyBub24tZmluYWwgYW5kIHRoZSB0ZW1wbGF0ZQotLy8gaW50ZXJmYWNlIGFic3RyYWN0LCBzbyB0aGF0IGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMgY2FuIGJlIHVuaXQgdGVzdGVkCi0vLyBhZ2FpbnN0IGEgbW9jayB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWNsYXNzIFJlbW90ZUNhbGxiYWNrTWFwIGZpbmFsIHsKLSBwdWJsaWM6Ci0gIFJlbW90ZUNhbGxiYWNrTWFwKCkgPSBkZWZhdWx0OwotICB+UmVtb3RlQ2FsbGJhY2tNYXAoKTsKLQotICAvLyBUaGUgRGVsZWdhdGUgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbm90aWZ5IHdoZW4gYSByZWdpc3RlcmVkIGNhbGxiYWNrIGlzCi0gIC8vIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGFzIGEgcmVzdWx0IG9mIHRoZSBkZWF0aCBvZiB0aGUgcmVtb3RlIHByb2Nlc3MgdGhhdAotICAvLyBvd25zIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrLgotICBjbGFzcyBEZWxlZ2F0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+RGVsZWdhdGUoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiBhIHJlbW90ZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSB8a2V5fCBoYXMgYmVlbgotICAgIC8vIHJlbW92ZWQuIFRoaXMgd29uJ3QgZ2V0IGNhbGxlZCBpZiB0aGUgY2FsbGJhY2sgd2FzIHJlbW92ZWQgYXMgYSByZXN1bHQgb2YKLSAgICAvLyBhIGNhbGwgdG8gUmVtb3RlQ2FsbGJhY2tNYXA6OlVucmVnaXN0ZXIuCi0gICAgdmlydHVhbCB2b2lkIE9uUmVtb3RlQ2FsbGJhY2tSZW1vdmVkKGNvbnN0IEsmIGtleSkgPSAwOwotICB9OwotCi0gIC8vIFJlZ2lzdGVyIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ2l2ZW4ga2V5LgotICAvLyBSZWdpc3RlcmluZyB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhcnQgdHJhY2tpbmcgZm9yIGRlYXRoIG5vdGlmaWNhdGlvbnMgaW4KLSAgLy8gY2FzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaG9zdGluZyB0aGUgQmluZGVyIGRpZXMuIEluIHN1Y2ggYSBjYXNlLCB0aGUgQmluZGVyCi0gIC8vIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuCi0gIC8vCi0gIC8vIEFuIG9wdGlvbmFsIHxkZWxlZ2F0ZXwgY2FuIGJlIHBhc3NlZCB3aGljaCB3aWxsIGJlIGFzc29jYXRlZCB3aXRoIHRoZSBnaXZlbgotICAvLyBrZXkvdmFsdWUgcGFpci4gfGRlbGVnYXRlfCBtdXN0IG91dGxpdmUgdGhpcyBtYXAuCi0gIGJvb2wgUmVnaXN0ZXIoY29uc3QgSyYga2V5LCBjb25zdCBhbmRyb2lkOjpzcDxWPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlID0gbnVsbHB0cik7Ci0KLSAgLy8gVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zCi0gIC8vIGZhbHNlIGlmIHxrZXl8IGRvZXNuJ3QgZXhpc3QuCi0gIGJvb2wgVW5yZWdpc3Rlcihjb25zdCBLJiBrZXkpOwotCi0gIC8vIFJldHVybnMgdGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zIE5VTEwgaWYgfGtleXwKLSAgLy8gZG9lc24ndCBleGlzdC4KLSAgYW5kcm9pZDo6c3A8Vj4gR2V0KGNvbnN0IEsmIGtleSk7Ci0KLSAgLy8gUmVtb3ZlcyB0aGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgbWFwIGFuZCByZXR1cm5zCi0gIC8vIHRoZSB2YWx1ZS4gUmV0dXJucyBOVUxMIGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdHMuCi0gIGFuZHJvaWQ6OnNwPFY+IFJlbW92ZShjb25zdCBLJiBrZXkpOwotCi0gIC8vIENsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgbWFwLgotICB2b2lkIENsZWFyKCk7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBDYWxsYmFja0RlYXRoUmVjaXBpZW50IDogcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKLSAgIHB1YmxpYzoKLSAgICBDYWxsYmFja0RlYXRoUmVjaXBpZW50KGNvbnN0IEsmIGtleSwgY29uc3QgYW5kcm9pZDo6c3A8Vj4mIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlQ2FsbGJhY2tNYXA8SywgVj4qIG93bmVyLCBEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gICAgYW5kcm9pZDo6c3A8Vj4gZ2V0X2NhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gY2FsbGJhY2tfOyB9Ci0KLSAgICAvLyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBvdmVycmlkZToKLSAgICB2b2lkIGJpbmRlckRpZWQoY29uc3QgYW5kcm9pZDo6d3A8YW5kcm9pZDo6SUJpbmRlcj4mIHdobykgb3ZlcnJpZGU7Ci0KLSAgIHByaXZhdGU6Ci0gICAgSyBrZXlfOwotICAgIGFuZHJvaWQ6OnNwPFY+IGNhbGxiYWNrXzsKLSAgICBSZW1vdGVDYWxsYmFja01hcDxLLCBWPiogb3duZXJfOyAgLy8gd2VhawotICAgIERlbGVnYXRlKiBkZWxlZ2F0ZV87ICAgICAgICAgICAgICAvLyB3ZWFrCi0gIH07Ci0KLSAgLy8gVHlwZWRlZiBmb3IgaW50ZXJuYWwgbWFwIGNvbnRhaW5lci4KLSAgdXNpbmcgQ2FsbGJhY2tNYXAgPQotICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPEssIGFuZHJvaWQ6OnNwPENhbGxiYWNrRGVhdGhSZWNpcGllbnQ+PjsKLQotICBib29sIFVucmVnaXN0ZXJJbnRlcm5hbCh0eXBlbmFtZSBDYWxsYmFja01hcDo6aXRlcmF0b3IgaXRlcik7Ci0KLSAgc3RkOjptdXRleCBtYXBfbG9ja187Ci0gIENhbGxiYWNrTWFwIG1hcF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlbW90ZUNhbGxiYWNrTWFwKTsKLX07Ci0KLS8vIFRlbXBsYXRlIEltcGxlbWVudGF0aW9uIGRldGFpbHMgYmVsb3cKLQotdXNpbmcgYW5kcm9pZDo6SUJpbmRlcjsKLXVzaW5nIGFuZHJvaWQ6OklJbnRlcmZhY2U7Ci11c2luZyBhbmRyb2lkOjpzcDsKLXVzaW5nIGFuZHJvaWQ6OndwOwotdXNpbmcgc3RkOjpsb2NrX2d1YXJkOwotdXNpbmcgc3RkOjptdXRleDsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1SZW1vdGVDYWxsYmFja01hcDxLLCBWPjo6flJlbW90ZUNhbGxiYWNrTWFwKCkgewotICBDbGVhcigpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWJvb2wgUmVtb3RlQ2FsbGJhY2tNYXA8SywgVj46OlJlZ2lzdGVyKGNvbnN0IEsmIGtleSwgY29uc3Qgc3A8Vj4mIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlKSB7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobWFwX2xvY2tfKTsKLQotICBpZiAobWFwXy5maW5kKGtleSkgIT0gbWFwXy5lbmQoKSkgewotICAgIFZMT0coMSkgPDwgIkNhbGxiYWNrIG1hcCBhbHJlYWR5IGNvbnRhaW5zIGtleSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3A8Q2FsbGJhY2tEZWF0aFJlY2lwaWVudD4gZHIoCi0gICAgICBuZXcgQ2FsbGJhY2tEZWF0aFJlY2lwaWVudChrZXksIGNhbGxiYWNrLCB0aGlzLCBkZWxlZ2F0ZSkpOwotICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjYWxsYmFjay5nZXQoKSk7Ci0gIGlmIChiaW5kZXItPmxpbmtUb0RlYXRoKGRyKSAhPSBhbmRyb2lkOjpOT19FUlJPUikgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBsaW5rIGRlYXRoIHJlY2lwaWVudCB0byBiaW5kZXIiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1hcF9ba2V5XSA9IGRyOwotCi0gIFZMT0coMikgPDwgIkNhbGxiYWNrIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIHdpdGggbWFwIjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1ib29sIFJlbW90ZUNhbGxiYWNrTWFwPEssIFY+OjpVbnJlZ2lzdGVyKGNvbnN0IEsmIGtleSkgewotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG1hcF9sb2NrXyk7Ci0KLSAgYXV0byBpdGVyID0gbWFwXy5maW5kKGtleSk7Ci0gIGlmIChpdGVyID09IG1hcF8uZW5kKCkpIHsKLSAgICBWTE9HKDEpIDw8ICJDYWxsYmFjayB3aXRoIGdpdmVuIGtleSBub3QgZm91bmQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBVbnJlZ2lzdGVySW50ZXJuYWwoaXRlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotc3A8Vj4gUmVtb3RlQ2FsbGJhY2tNYXA8SywgVj46OkdldChjb25zdCBLJiBrZXkpIHsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhtYXBfbG9ja18pOwotCi0gIGF1dG8gaXRlciA9IG1hcF8uZmluZChrZXkpOwotICBpZiAoaXRlciA9PSBtYXBfLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gaXRlci0+c2Vjb25kLT5nZXRfY2FsbGJhY2soKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1zcDxWPiBSZW1vdGVDYWxsYmFja01hcDxLLCBWPjo6UmVtb3ZlKGNvbnN0IEsmIGtleSkgewotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKG1hcF9sb2NrXyk7Ci0KLSAgYXV0byBpdGVyID0gbWFwXy5maW5kKGtleSk7Ci0gIGlmIChpdGVyID09IG1hcF8uZW5kKCkpIHJldHVybiBudWxscHRyOwotCi0gIHNwPFY+IHZhbCA9IGl0ZXItPnNlY29uZC0+Z2V0X2NhbGxiYWNrKCk7Ci0gIFVucmVnaXN0ZXJJbnRlcm5hbChpdGVyKTsKLQotICByZXR1cm4gdmFsOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIFJlbW90ZUNhbGxiYWNrTWFwPEssIFY+OjpDbGVhcigpIHsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhtYXBfbG9ja18pOwotCi0gIGZvciAoYXV0byBpdGVyID0gbWFwXy5iZWdpbigpOyBpdGVyICE9IG1hcF8uZW5kKCk7KQotICAgIFVucmVnaXN0ZXJJbnRlcm5hbChpdGVyKyspOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWJvb2wgUmVtb3RlQ2FsbGJhY2tNYXA8SywgVj46OlVucmVnaXN0ZXJJbnRlcm5hbCgKLSAgICB0eXBlbmFtZSBDYWxsYmFja01hcDo6aXRlcmF0b3IgaXRlcikgewotICBzcDxDYWxsYmFja0RlYXRoUmVjaXBpZW50PiBkciA9IGl0ZXItPnNlY29uZDsKLSAgbWFwXy5lcmFzZShpdGVyKTsKLQotICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoZHItPmdldF9jYWxsYmFjaygpLmdldCgpKS0+dW5saW5rVG9EZWF0aChkcikgIT0KLSAgICAgIGFuZHJvaWQ6Ok5PX0VSUk9SKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVubGluayBkZWF0aCByZWNpcGllbnQgZnJvbSBiaW5kZXIiOwotCi0gICAgLy8gV2UgcmVtb3ZlZCB0aGUgZW50cnkgZnJvbSB8bWFwX3wgYnV0IHVubGlua1RvRGVhdGggZmFpbGVkLiBUaGVyZSBpc24ndAotICAgIC8vIHJlYWxseSBtdWNoIHdlIGNhbiBkbyBoZXJlIG90aGVyIHRoYW4gZGVsZXRpbmcgdGhlIGJpbmRlciBhbmQgcmV0dXJuaW5nCi0gICAgLy8gYW4gZXJyb3IuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgVkxPRygyKSA8PCAiQ2FsbGJhY2sgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSBtYXAiOwotCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLVJlbW90ZUNhbGxiYWNrTWFwPEssIFY+OjpDYWxsYmFja0RlYXRoUmVjaXBpZW50OjpDYWxsYmFja0RlYXRoUmVjaXBpZW50KAotICAgIGNvbnN0IEsmIGtleSwgY29uc3Qgc3A8Vj4mIGNhbGxiYWNrLCBSZW1vdGVDYWxsYmFja01hcDxLLCBWPiogb3duZXIsCi0gICAgRGVsZWdhdGUqIGRlbGVnYXRlKQotICAgIDoga2V5XyhrZXkpLCBjYWxsYmFja18oY2FsbGJhY2spLCBvd25lcl8ob3duZXIpLCBkZWxlZ2F0ZV8oZGVsZWdhdGUpIHsKLSAgQ0hFQ0soY2FsbGJhY2tfLmdldCgpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIFJlbW90ZUNhbGxiYWNrTWFwPEssIFY+OjpDYWxsYmFja0RlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKAotICAgIGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgVkxPRygxKSA8PCAiUmVjZWl2ZWQgYmluZGVyRGllZCI7Ci0KLSAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2FsbGJhY2tfLmdldCgpKTsKLSAgQ0hFQ0sod2hvLnVuc2FmZV9nZXQoKSA9PSBiaW5kZXIuZ2V0KCkpOwotCi0gIC8vIFJlbW92ZSB0aGUgY2FsbGJhY2sgYnV0IG5vIG5lZWQgdG8gY2FsbCB1bmxpbmtUb0RlYXRoLgotICB7Ci0gICAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhvd25lcl8tPm1hcF9sb2NrXyk7Ci0gICAgYXV0byBpdGVyID0gb3duZXJfLT5tYXBfLmZpbmQoa2V5Xyk7Ci0gICAgQ0hFQ0soaXRlciAhPSBvd25lcl8tPm1hcF8uZW5kKCkpOwotICAgIG93bmVyXy0+bWFwXy5lcmFzZShpdGVyKTsKLSAgfQotCi0gIFZMT0coMSkgPDwgIkNhbGxiYWNrIGZyb20gZGVhZCBwcm9jZXNzIHVucmVnaXN0ZXJlZDsgbm90aWZ5aW5nIGRlbGVnYXRlIjsKLQotICAvLyBOb3RpZnkgZGVsZWdhdGUuCi0gIGlmIChkZWxlZ2F0ZV8pIGRlbGVnYXRlXy0+T25SZW1vdGVDYWxsYmFja1JlbW92ZWQoa2V5Xyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kZXIKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2RidXMvYmx1ZXRvb3RoX2FkYXB0ZXIuY2MgYi9zZXJ2aWNlL2lwYy9kYnVzL2JsdWV0b290aF9hZGFwdGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODMxYzFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2RidXMvYmx1ZXRvb3RoX2FkYXB0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9pcGMvZGJ1cy9ibHVldG9vdGhfYWRhcHRlci5oIgotI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5oIgotCi11c2luZyA6OmRidXM6OkJ1czsKLXVzaW5nIDo6ZGJ1czo6RXhwb3J0ZWRPYmplY3Q7Ci11c2luZyA6OmRidXM6Ok1ldGhvZENhbGw7Ci11c2luZyA6OmRidXM6Ok1lc3NhZ2VXcml0ZXI7Ci11c2luZyA6OmRidXM6OlJlc3BvbnNlOwotdXNpbmcgOjpkYnVzOjpPYmplY3RQYXRoOwotdXNpbmcgOjpkYnVzOjpFcnJvclJlc3BvbnNlOwotCi1uYW1lc3BhY2UgewotCi1jb25zdCBzdGQ6OnN0cmluZyBrQmx1ZXRvb3RoQWRhcHRlckludGVyZmFjZSA9ICJvcmcuZmx1b3JpZGUuQmx1ZXRvb3RoQWRhcHRlciI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrRW5hYmxlID0gIkVuYWJsZSI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrRGlzYWJsZSA9ICJEaXNhYmxlIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCbHVldG9vdGhBZGFwdGVyID0gIm9yZy5mbHVvcmlkZS5CbHVldG9vdGhBZGFwdGVyIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCbHVldG9vdGhBZGFwdGVyUGF0aCA9ICIvb3JnL2ZsdW9yaWRlL0JsdWV0b290aEFkYXB0ZXIiOwotCi0vLyBUT0RPKGpwYXdsb3dza2kpOiByaWdodCBub3cgeG1sIGludGVyZmFjZSBmaWxlcyBhcmUgaW4gc2VydmljZS9pcGMvZGJ1cy8KLS8vIGZvbGRlci4gIE1ha2UgYSBzY3JpcHQgdG8gbW92ZSB0aGVtIGludG8gL3Vzci9zaGFyZS9kYnVzLTEvaW50ZXJmYWNlcwotY29uc3QgY2hhciBrQmluZGluZ3NQYXRoW10gPQotICAgICIvdXNyL3NoYXJlL2RidXMtMS9pbnRlcmZhY2VzL29yZy5mbHVvcmlkZS5CbHVldG9vdGhBZGFwdGVyLnhtbCI7Ci1jb25zdCBjaGFyIGtEQnVzSW50cm9zcGVjdE1ldGhvZFtdID0gIkludHJvc3BlY3QiOwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGlwYyB7Ci1uYW1lc3BhY2UgZGJ1cyB7Ci0KLSNpZiBkZWZpbmVkKEJBU0VfVkVSKSAmJiBCQVNFX1ZFUiA+IDc4MDAwMAotLy8gTmV3IGxpYmNocm9tZSB0cmVhdHMgUmVzcG9uc2VTZW5kZXIgYXMgYmFzZTo6T25jZUNhbGxiYWNrIHNvIHdlIG5lZWQgdG8gbW92ZQotLy8gb3duZXJzaGlwIGJlZm9yZSBjYWxsaW5nIDo6UnVuKCkKLWlubGluZSB2b2lkIFJ1blJlc3BvbnNlKHN0ZDo6dW5pcXVlX3B0cjxSZXNwb25zZT4gcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRlZE9iamVjdDo6UmVzcG9uc2VTZW5kZXImIHJlc3BvbnNlX3NlbmRlcikgewotICBzdGQ6Om1vdmUocmVzcG9uc2Vfc2VuZGVyKS5SdW4oc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci19Ci0jZWxzZQotaW5saW5lIHZvaWQgUnVuUmVzcG9uc2Uoc3RkOjp1bmlxdWVfcHRyPFJlc3BvbnNlPiByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydGVkT2JqZWN0OjpSZXNwb25zZVNlbmRlciYgcmVzcG9uc2Vfc2VuZGVyKSB7Ci0gIHJlc3BvbnNlX3NlbmRlci5SdW4oc3RkOjptb3ZlKHJlc3BvbnNlKSk7Ci19Ci0jZW5kaWYKLQotQmx1ZXRvb3RoQWRhcHRlcjo6Qmx1ZXRvb3RoQWRhcHRlcihzY29wZWRfcmVmcHRyPEJ1cz4gYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIGV4cG9ydGVkX29iamVjdF8gPSBidXMtPkdldEV4cG9ydGVkT2JqZWN0KE9iamVjdFBhdGgoa0JsdWV0b290aEFkYXB0ZXJQYXRoKSk7Ci0KLSAgQ0hFQ0soZXhwb3J0ZWRfb2JqZWN0Xy0+RXhwb3J0TWV0aG9kQW5kQmxvY2soCi0gICAgICBrQmx1ZXRvb3RoQWRhcHRlckludGVyZmFjZSwga0VuYWJsZSwKLSAgICAgIGJhc2U6OkJpbmQoJkJsdWV0b290aEFkYXB0ZXI6OkVuYWJsZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKLQotICBDSEVDSyhleHBvcnRlZF9vYmplY3RfLT5FeHBvcnRNZXRob2RBbmRCbG9jaygKLSAgICAgIGtCbHVldG9vdGhBZGFwdGVySW50ZXJmYWNlLCBrRGlzYWJsZSwKLSAgICAgIGJhc2U6OkJpbmQoJkJsdWV0b290aEFkYXB0ZXI6OkRpc2FibGUsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSk7Ci0KLSAgQ0hFQ0soZXhwb3J0ZWRfb2JqZWN0Xy0+RXhwb3J0TWV0aG9kQW5kQmxvY2soCi0gICAgICBEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRSwga0RCdXNJbnRyb3NwZWN0TWV0aG9kLAotICAgICAgYmFzZTo6QmluZCgmQmx1ZXRvb3RoQWRhcHRlcjo6SW50cm9zcGVjdCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKLQotICBDSEVDSyhidXMtPlJlcXVlc3RPd25lcnNoaXBBbmRCbG9jayhrQmx1ZXRvb3RoQWRhcHRlciwgQnVzOjpSRVFVSVJFX1BSSU1BUlkpKQotICAgICAgPDwgIlVuYWJsZSB0byB0YWtlIG93bmVyc2hpcCBvZiAiIDw8IGtCbHVldG9vdGhBZGFwdGVyCi0gICAgICA8PCAiLiBNYWtlIHN1cmUgeW91IGhhdmUgcHJvcGVyIGJ1c2NvbmZpZyBmaWxlICIKLSAgICAgICAgICIvZXRjL2RidXMtMS9zeXN0ZW0uZC9vcmcuZmx1b3JpZGUuY29uZiI7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQWRhcHRlcjo6RW5hYmxlKE1ldGhvZENhbGwqIG1ldGhvZF9jYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3J0ZWRPYmplY3Q6OlJlc3BvbnNlU2VuZGVyIHJlc3BvbnNlX3NlbmRlcikgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICBhZGFwdGVyXy0+RW5hYmxlKCk7Ci0gIFJ1blJlc3BvbnNlKFJlc3BvbnNlOjpGcm9tTWV0aG9kQ2FsbChtZXRob2RfY2FsbCksIHJlc3BvbnNlX3NlbmRlcik7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQWRhcHRlcjo6RGlzYWJsZShNZXRob2RDYWxsKiBtZXRob2RfY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRlZE9iamVjdDo6UmVzcG9uc2VTZW5kZXIgcmVzcG9uc2Vfc2VuZGVyKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0gIGFkYXB0ZXJfLT5EaXNhYmxlKCk7Ci0gIFJ1blJlc3BvbnNlKFJlc3BvbnNlOjpGcm9tTWV0aG9kQ2FsbChtZXRob2RfY2FsbCksIHJlc3BvbnNlX3NlbmRlcik7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoQWRhcHRlcjo6SW50cm9zcGVjdCgKLSAgICBNZXRob2RDYWxsKiBtZXRob2RfY2FsbCwgRXhwb3J0ZWRPYmplY3Q6OlJlc3BvbnNlU2VuZGVyIHJlc3BvbnNlX3NlbmRlcikgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIHN0ZDo6c3RyaW5nIG91dHB1dDsKLSAgaWYgKCFiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGJhc2U6OkZpbGVQYXRoKGtCaW5kaW5nc1BhdGgpLCAmb3V0cHV0KSkgewotICAgIFBMT0coRVJST1IpIDw8ICJDYW4ndCByZWFkIFhNTCBiaW5kaW5ncyBmcm9tIGRpc2s6IjsKLSAgICBSdW5SZXNwb25zZShFcnJvclJlc3BvbnNlOjpGcm9tTWV0aG9kQ2FsbCgKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwsICJDYW4ndCByZWFkIFhNTCBiaW5kaW5ncyBmcm9tIGRpc2suIiwgIiIpLAotICAgICAgICAgICAgICAgIHJlc3BvbnNlX3NlbmRlcik7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8UmVzcG9uc2U+IHJlc3BvbnNlKFJlc3BvbnNlOjpGcm9tTWV0aG9kQ2FsbChtZXRob2RfY2FsbCkpOwotICBNZXNzYWdlV3JpdGVyIHdyaXRlcihyZXNwb25zZS5nZXQoKSk7Ci0gIHdyaXRlci5BcHBlbmRTdHJpbmcob3V0cHV0KTsKLQotICBSdW5SZXNwb25zZShzdGQ6Om1vdmUocmVzcG9uc2UpLCByZXNwb25zZV9zZW5kZXIpOwotfQotCi1CbHVldG9vdGhBZGFwdGVyOjp+Qmx1ZXRvb3RoQWRhcHRlcigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBkYnVzCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9kYnVzL2JsdWV0b290aF9hZGFwdGVyLmggYi9zZXJ2aWNlL2lwYy9kYnVzL2JsdWV0b290aF9hZGFwdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGFjMTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvZGJ1cy9ibHVldG9vdGhfYWRhcHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgInNlcnZpY2UvYWRhcHRlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaD4KLSNpbmNsdWRlIDxkYnVzL2J1cy5oPgotI2luY2x1ZGUgPGRidXMvZXhwb3J0ZWRfb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8ZGJ1cy9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8ZGJ1cy9vYmplY3RfcGF0aC5oPgotI2luY2x1ZGUgPGRidXMvcHJvcGVydHkuaD4KLQotdXNpbmcgOjpkYnVzOjpCdXM7Ci11c2luZyA6OmRidXM6OkV4cG9ydGVkT2JqZWN0OwotdXNpbmcgOjpkYnVzOjpNZXRob2RDYWxsOwotCi1uYW1lc3BhY2UgaXBjIHsKLW5hbWVzcGFjZSBkYnVzIHsKLQotY2xhc3MgQmx1ZXRvb3RoQWRhcHRlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBCbHVldG9vdGhBZGFwdGVyKHNjb3BlZF9yZWZwdHI8QnVzPiBidXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKTsKLSAgdmlydHVhbCB+Qmx1ZXRvb3RoQWRhcHRlcigpOwotCi0gIHZvaWQgRW5hYmxlKE1ldGhvZENhbGwqIG1ldGhvZF9jYWxsLAotICAgICAgICAgICAgICBFeHBvcnRlZE9iamVjdDo6UmVzcG9uc2VTZW5kZXIgcmVzcG9uc2Vfc2VuZGVyKTsKLQotICB2b2lkIERpc2FibGUoTWV0aG9kQ2FsbCogbWV0aG9kX2NhbGwsCi0gICAgICAgICAgICAgICBFeHBvcnRlZE9iamVjdDo6UmVzcG9uc2VTZW5kZXIgcmVzcG9uc2Vfc2VuZGVyKTsKLQotICB2b2lkIEludHJvc3BlY3QoTWV0aG9kQ2FsbCogbWV0aG9kX2NhbGwsCi0gICAgICAgICAgICAgICAgICBFeHBvcnRlZE9iamVjdDo6UmVzcG9uc2VTZW5kZXIgcmVzcG9uc2Vfc2VuZGVyKTsKLQotIHByaXZhdGU6Ci0gIEV4cG9ydGVkT2JqZWN0KiBleHBvcnRlZF9vYmplY3RfOwotICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGRidXMKLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2RidXMvaXBjX2hhbmRsZXJfZGJ1cy5jYyBiL3NlcnZpY2UvaXBjL2RidXMvaXBjX2hhbmRsZXJfZGJ1cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiZDI0NC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9kYnVzL2lwY19oYW5kbGVyX2RidXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9kYnVzL2lwY19oYW5kbGVyX2RidXMuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZF90YXNrX3J1bm5lcl9oYW5kbGUuaD4KLSNpbmNsdWRlIDxkYnVzL2J1cy5oPgotI2luY2x1ZGUgInNlcnZpY2UvZGFlbW9uLmgiCi0jaW5jbHVkZSAic2VydmljZS9pcGMvZGJ1cy9ibHVldG9vdGhfYWRhcHRlci5oIgotCi11c2luZyBkYnVzOjpCdXM7Ci0KLW5hbWVzcGFjZSBpcGMgewotCi1JUENIYW5kbGVyREJ1czo6SVBDSGFuZGxlckRCdXMoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ01hbmFnZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSkKLSAgICA6IElQQ0hhbmRsZXIoYWRhcHRlciwgZGVsZWdhdGUpIHt9Ci0KLUlQQ0hhbmRsZXJEQnVzOjp+SVBDSGFuZGxlckRCdXMoKSB7fQotCi1ib29sIElQQ0hhbmRsZXJEQnVzOjpSdW4oKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLQotICBkYnVzX3RocmVhZF8gPSBuZXcgYmFzZTo6VGhyZWFkKCJELUJ1cyBUaHJlYWQiKTsKLSAgYmFzZTo6VGhyZWFkOjpPcHRpb25zIHRocmVhZF9vcHRpb25zOwotICBidGJhc2U6OnNldF9tZXNzYWdlX2xvb3BfdHlwZV9JTyh0aHJlYWRfb3B0aW9ucyk7Ci0gIGRidXNfdGhyZWFkXy0+U3RhcnRXaXRoT3B0aW9ucyh0aHJlYWRfb3B0aW9ucyk7Ci0KLSAgZGJ1c190aHJlYWRfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmSVBDSGFuZGxlckRCdXM6OkluaXREYnVzLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSVBDSGFuZGxlckRCdXM6OkluaXREYnVzKCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgQnVzOjpPcHRpb25zIGJ1c19vcHRpb25zOwotICBidXNfb3B0aW9ucy5idXNfdHlwZSA9IEJ1czo6U1lTVEVNOwotICBidXNfb3B0aW9ucy5jb25uZWN0aW9uX3R5cGUgPSBCdXM6OlBSSVZBVEU7Ci0gIGJ1c19vcHRpb25zLmRidXNfdGFza19ydW5uZXIgPSBiYXNlOjpUaHJlYWRUYXNrUnVubmVySGFuZGxlOjpHZXQoKTsKLQotICBzY29wZWRfcmVmcHRyPEJ1cz4gYnVzXyA9IG5ldyBCdXMoYnVzX29wdGlvbnMpOwotCi0gIGlwYzo6ZGJ1czo6Qmx1ZXRvb3RoQWRhcHRlciogYmx1ZXRvb3RoX2FkYXB0ZXIgPQotICAgICAgbmV3IGlwYzo6ZGJ1czo6Qmx1ZXRvb3RoQWRhcHRlcihidXNfLCBhZGFwdGVyKCkpOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBhbGwgc2VydmljZXMgYWRkZWQiOwotfQotCi12b2lkIElQQ0hhbmRsZXJEQnVzOjpTdG9wKCkgeyBkYnVzX3RocmVhZF8tPlN0b3AoKTsgfQotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9kYnVzL2lwY19oYW5kbGVyX2RidXMuaCBiL3NlcnZpY2UvaXBjL2RidXMvaXBjX2hhbmRsZXJfZGJ1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgzMzY5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2RidXMvaXBjX2hhbmRsZXJfZGJ1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9pcGNfaGFuZGxlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIFNpbmdsZVRocmVhZFRhc2tSdW5uZXI7Ci19ICAvLyBuYW1lc3BhY2UgYmFzZQotCi1uYW1lc3BhY2UgaXBjIHsKLQotLy8gSW1wbGVtZW50cyBhIERCdXMgYmFzZWQgSVBDSGFuZGxlcgotY2xhc3MgSVBDSGFuZGxlckRCdXMgOiBwdWJsaWMgSVBDSGFuZGxlciB7Ci0gcHVibGljOgotICBJUENIYW5kbGVyREJ1cyhibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsIElQQ01hbmFnZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSk7Ci0gIH5JUENIYW5kbGVyREJ1cygpIG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdERidXMoKTsKLQotICAvLyBJUENIYW5kbGVyIG92ZXJyaWRlczoKLSAgYm9vbCBSdW4oKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBiYXNlOjpUaHJlYWQqIGRidXNfdGhyZWFkXzsKLQotICBJUENIYW5kbGVyREJ1cygpID0gZGVmYXVsdDsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSVBDSGFuZGxlckRCdXMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvZGJ1cy9vcmcuZmx1b3JpZGUuQmx1ZXRvb3RoQWRhcHRlci54bWwgYi9zZXJ2aWNlL2lwYy9kYnVzL29yZy5mbHVvcmlkZS5CbHVldG9vdGhBZGFwdGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3MThlNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9kYnVzL29yZy5mbHVvcmlkZS5CbHVldG9vdGhBZGFwdGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBub2RlIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBPYmplY3QgSW50cm9zcGVjdGlvbiAxLjAvL0VOIgotICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQiPgotPG5vZGUgbmFtZT0iL29yZy9jaHJvbWl1bS9TZXNzaW9uTWFuYWdlciIKLSAgICAgIHhtbG5zOmRvYz0iaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvZGJ1cy8xLjAvZG9jLmR0ZCI+Ci0KLSAgPCEtLQotICAgICAgb3JnLmZsdW9yaWRlLkJsdWV0b290aEFkYXB0ZXI6Ci0gICAgICBAc2hvcnRfZGVzY3JpcHRpb246IEJsdWV0b290aCBhZGFwdGVyIG1hbmFnZXIuCi0KLSAgICAgIEludGVyZmFjZSBmb3IgdXNlciBibHVldG9vdGggYWRhcHRlci4gUmlnaHQgbm93IGFsbG93cyBvbmx5IHRvIGVuYWJsZQotICAgICAgYW5kIGRpc2FibGUgdGhlIGFkYXB0ZXIuCi0gIC0tPgotICA8aW50ZXJmYWNlIG5hbWU9Im9yZy5mbHVvcmlkZS5CbHVldG9vdGhBZGFwdGVyIj4KLSAgICA8IS0tCi0gICAgICAgIEVuYWJsZToKLQotICAgICAgICBFbmFibGUgdGhlIGJsdWV0b290aCBhZGFwdGVyLgotICAgIC0tPgotICAgIDxtZXRob2QgbmFtZT0iRW5hYmxlIj48L21ldGhvZD4KLQotICAgIDwhLS0KLSAgICAgICAgRGlzYWJsZToKLQotICAgICAgICBEaXNhYmxlIHRoZSBibHVldG9vdGggYWRhcHRlci4KLSAgICAtLT4KLSAgICA8bWV0aG9kIG5hbWU9IkRpc2FibGUiPjwvbWV0aG9kPgotICA8L2ludGVyZmFjZT4KLTwvbm9kZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9pcGNfaGFuZGxlci5jYyBiL3NlcnZpY2UvaXBjL2lwY19oYW5kbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWMxYTUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2lwY19oYW5kbGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9pcGNfaGFuZGxlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLW5hbWVzcGFjZSBpcGMgewotCi1JUENIYW5kbGVyOjpJUENIYW5kbGVyKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgSVBDTWFuYWdlcjo6RGVsZWdhdGUqIGRlbGVnYXRlKQotICAgIDogYWRhcHRlcl8oYWRhcHRlciksIGRlbGVnYXRlXyhkZWxlZ2F0ZSkgewotICBDSEVDSyhhZGFwdGVyXyk7Ci19Ci0KLUlQQ0hhbmRsZXI6On5JUENIYW5kbGVyKCkge30KLQotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9pcGMvaXBjX2hhbmRsZXIuaCBiL3NlcnZpY2UvaXBjL2lwY19oYW5kbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzk5NGMuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9pcGMvaXBjX2hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotY2xhc3MgQWRhcHRlcjsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotbmFtZXNwYWNlIGlwYyB7Ci0KLS8vIElQQ0hhbmRsZXIgaXMgYW4gaW50ZXJmYWNlIHRoYXQgY2xhc3NlcyBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IElQQyBtZWNoYW5pc21zCi0vLyBtdXN0IGNvbmZvcm0gdG8uCi1jbGFzcyBJUENIYW5kbGVyIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPElQQ0hhbmRsZXI+IHsKLSBwdWJsaWM6Ci0gIElQQ0hhbmRsZXIoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyLCBJUENNYW5hZ2VyOjpEZWxlZ2F0ZSogZGVsZWdhdGUpOwotICB2aXJ0dWFsIH5JUENIYW5kbGVyKCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgYW5kIHJ1bnMgdGhlIElQQyBtZWNoYW5pc20uIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZQotICAvLyBvdGhlcndpc2UuCi0gIHZpcnR1YWwgYm9vbCBSdW4oKSA9IDA7Ci0KLSAgLy8gU3RvcHMgdGhlIElQQyBtZWNoYW5pc20uCi0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICAvLyBHZXR0ZXJzIGZvciBwcml2YXRlIG1lbWJlcnMgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBhY2Nlc3MgdGhlbSBpbiByZWFkLW9ubHkKLSAgLy8gZmFzaGlvbi4KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKCkgY29uc3QgeyByZXR1cm4gYWRhcHRlcl87IH0KLSAgSVBDTWFuYWdlcjo6RGVsZWdhdGUqIGRlbGVnYXRlKCkgY29uc3QgeyByZXR1cm4gZGVsZWdhdGVfOyB9Ci0KLSBwcml2YXRlOgotICBJUENIYW5kbGVyKCkgPSBkZWZhdWx0OwotCi0gIC8vIFdlYWsgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgQWRhcHRlciBpbnN0YW5jZS4KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyXzsKLQotICAvLyBUaGUgZGVsZWdhdGUgdGhhdCBpcyBpbnRlcmVzdGVkIGluIG5vdGlmaWNhdGlvbnMgZnJvbSB1cy4KLSAgSVBDTWFuYWdlcjo6RGVsZWdhdGUqIGRlbGVnYXRlXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSVBDSGFuZGxlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9pcGNfaGFuZGxlcl9saW51eC5jYyBiL3NlcnZpY2UvaXBjL2lwY19oYW5kbGVyX2xpbnV4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc3MjdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2lwY19oYW5kbGVyX2xpbnV4LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9pcGMvaXBjX2hhbmRsZXJfbGludXguaCIKLQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotCi0jaW5jbHVkZSAiYWJzdHJhY3RfbWVzc2FnZV9sb29wLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc29ja2V0X3V0aWxzL3NvY2tldHMuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2RhZW1vbi5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2xpbnV4X2lwY19ob3N0LmgiCi0jaW5jbHVkZSAic2VydmljZS9zZXR0aW5ncy5oIgotCi1uYW1lc3BhY2UgaXBjIHsKLQotSVBDSGFuZGxlckxpbnV4OjpJUENIYW5kbGVyTGludXgoYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDTWFuYWdlcjo6RGVsZWdhdGUqIGRlbGVnYXRlKQotICAgIDogSVBDSGFuZGxlcihhZGFwdGVyLCBkZWxlZ2F0ZSksCi0gICAgICBydW5uaW5nXyhmYWxzZSksCi0gICAgICB0aHJlYWRfKCJJUENIYW5kbGVyTGludXgiKSwKLSAgICAgIGtlZXBfcnVubmluZ18odHJ1ZSkge30KLQotSVBDSGFuZGxlckxpbnV4Ojp+SVBDSGFuZGxlckxpbnV4KCkgewotICAvLyBUaGlzIHdpbGwgb25seSBiZSBzZXQgaWYgdGhlIFNldHRpbmdzOjpjcmVhdGVfaXBjX3NvY2tldF9wYXRoKCkgd2FzCi0gIC8vIG9yaWdpbmFsbHkgcHJvdmlkZWQuCi0gIGlmICghc29ja2V0X3BhdGhfLmVtcHR5KCkpIHVubGluayhzb2NrZXRfcGF0aF8udmFsdWUoKS5jX3N0cigpKTsKLX0KLQotYm9vbCBJUENIYW5kbGVyTGludXg6OlJ1bigpIHsKLSAgQ0hFQ0soIXJ1bm5pbmdfKTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9zdWZmaXggPQotICAgICAgYmx1ZXRvb3RoOjpEYWVtb246OkdldCgpLT5HZXRTZXR0aW5ncygpLT5hbmRyb2lkX2lwY19zb2NrZXRfc3VmZml4KCk7Ci0gIGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBwYXRoID0KLSAgICAgIGJsdWV0b290aDo6RGFlbW9uOjpHZXQoKS0+R2V0U2V0dGluZ3MoKS0+Y3JlYXRlX2lwY19zb2NrZXRfcGF0aCgpOwotCi0gIC8vIEJvdGggZmxhZ3MgY2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lLgotICBDSEVDSyhhbmRyb2lkX3N1ZmZpeC5lbXB0eSgpIHx8IHBhdGguZW1wdHkoKSk7Ci0gIGlmIChhbmRyb2lkX3N1ZmZpeC5lbXB0eSgpICYmIHBhdGguZW1wdHkoKSkgewotICAgIExPRyhFUlJPUikgPDwgIk5vIGRvbWFpbiBzb2NrZXQgcGF0aCBwcm92aWRlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQW4gb3JpZ2luIGV2ZW50IGxvb3AgaXMgcmVxdWlyZWQuCi0gIENIRUNLKGJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcDo6Y3VycmVudF90YXNrX3J1bm5lcigpKTsKLSAgb3JpZ2luX3Rhc2tfcnVubmVyXyA9IGJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcDo6Y3VycmVudF90YXNrX3J1bm5lcigpOwotCi0gIGlmICghYW5kcm9pZF9zdWZmaXguZW1wdHkoKSkgewotICAgIGludCBzZXJ2ZXJfZmQgPSBvc2lfYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQoYW5kcm9pZF9zdWZmaXguY19zdHIoKSk7Ci0gICAgaWYgKHNlcnZlcl9mZCA9PSAtMSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGdldCBBbmRyb2lkIHNvY2tldCBmcm9tOiAiIDw8IGFuZHJvaWRfc3VmZml4OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgIkJpbmRpbmcgdG8gQW5kcm9pZCBzZXJ2ZXIgc29ja2V0OiIgPDwgYW5kcm9pZF9zdWZmaXg7Ci0gICAgc29ja2V0Xy5yZXNldChzZXJ2ZXJfZmQpOwotICB9IGVsc2UgewotICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgYSBVbml4IGRvbWFpbiBzb2NrZXQ6IiA8PCBwYXRoLnZhbHVlKCk7Ci0KLSAgICAvLyBUT0RPKGFybWFuc2l0byk6IFRoaXMgaXMgb3BlbnMgdGhlIGRvb3IgdG8gcG90ZW50aWFsbHkgdW5saW5raW5nIGZpbGVzIGluCi0gICAgLy8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgd2UncmUgbm90IHN1cHBvc2VkIHRvLiBGb3Igbm93IHdlIHdpbGwgaGF2ZSBhbgotICAgIC8vIGFzc3VtcHRpb24gdGhhdCB0aGUgZGFlbW9uIHJ1bnMgaW4gYSBzYW5kYm94IGJ1dCB3ZSBzaG91bGQgZ2VuZXJhbGx5IGRvCi0gICAgLy8gdGhpcyBwcm9wZXJseS4KLSAgICB1bmxpbmsocGF0aC52YWx1ZSgpLmNfc3RyKCkpOwotCi0gICAgYmFzZTo6U2NvcGVkRkQgc2VydmVyX3NvY2tldChzb2NrZXQoUEZfVU5JWCwgU09DS19TRVFQQUNLRVQsIDApKTsKLSAgICBpZiAoIXNlcnZlcl9zb2NrZXQuaXNfdmFsaWQoKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gZG9tYWluIHNvY2tldCBmb3IgSVBDIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKLSAgICBtZW1zZXQoJmFkZHJlc3MsIDAsIHNpemVvZihhZGRyZXNzKSk7Ci0gICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzdHJuY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGgudmFsdWUoKS5jX3N0cigpLAotICAgICAgICAgICAgc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gMSk7Ci0gICAgaWYgKGJpbmQoc2VydmVyX3NvY2tldC5nZXQoKSwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSkgPAotICAgICAgICAwKSB7Ci0gICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGJpbmQgSVBDIHNvY2tldCB0byBhZGRyZXNzIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzb2NrZXRfLnN3YXAoc2VydmVyX3NvY2tldCk7Ci0gICAgc29ja2V0X3BhdGhfID0gcGF0aDsKLSAgfQotCi0gIENIRUNLKHNvY2tldF8uaXNfdmFsaWQoKSk7Ci0KLSAgcnVubmluZ18gPSB0cnVlOyAgLy8gU2V0IHRoaXMgaGVyZSBiZWZvcmUgbGF1bmNoaW5nIHRoZSB0aHJlYWQuCi0KLSAgLy8gU3RhcnQgYW4gSU8gdGhyZWFkIGFuZCBwb3N0IHRoZSBsaXN0ZW5pbmcgdGFzay4KLSAgYmFzZTo6VGhyZWFkOjpPcHRpb25zIG9wdGlvbnM7Ci0gIGJ0YmFzZTo6c2V0X21lc3NhZ2VfbG9vcF90eXBlX0lPKG9wdGlvbnMpOwotICBpZiAoIXRocmVhZF8uU3RhcnRXaXRoT3B0aW9ucyhvcHRpb25zKSkgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzdGFydCBJUENIYW5kbGVyTGludXggdGhyZWFkIjsKLSAgICBydW5uaW5nXyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHRocmVhZF8udGFza19ydW5uZXIoKS0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJklQQ0hhbmRsZXJMaW51eDo6U3RhcnRMaXN0ZW5pbmdPblRocmVhZCwgdGhpcykpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIElQQ0hhbmRsZXJMaW51eDo6U3RvcCgpIHsKLSAga2VlcF9ydW5uaW5nXyA9IGZhbHNlOwotCi0gIC8vIEF0IHRoaXMgbW9tZW50IHRoZSBsaXN0ZW5pbmcgdGhyZWFkIG1pZ2h0IGJlIGJsb2NraW5nIG9uIHRoZSBhY2NlcHQKLSAgLy8gc3lzY2FsbC4gU2h1dGRvd24gYW5kIGNsb3NlIHRoZSBzZXJ2ZXIgc29ja2V0IGJlZm9yZSBqb2luaW5nIHRoZSB0aHJlYWQgdG8KLSAgLy8gaW50ZXJydXB0IGFjY2VwdCBzbyB0aGF0IHRoZSBtYWluIHRocmVhZCBkb2Vzbid0IGtlZXAgYmxvY2tpbmcuCi0gIHNodXRkb3duKHNvY2tldF8uZ2V0KCksIFNIVVRfUkRXUik7Ci0gIHNvY2tldF8ucmVzZXQoKTsKLQotICAvLyBKb2luIGFuZCBjbGVhbiB1cCB0aGUgdGhyZWFkLgotICB0aHJlYWRfLlN0b3AoKTsKLQotICAvLyBUaHJlYWQgZXhpdGVkLiBOb3RpZnkgdGhlIGRlbGVnYXRlLiBQb3N0IHRoaXMgb24gdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB0aGUKLSAgLy8gY2FsbGJhY2sgaXNuJ3QgcmVlbnRyYW50LgotICBOb3RpZnlTdG9wcGVkT25PcmlnaW5UaHJlYWQoKTsKLX0KLQotdm9pZCBJUENIYW5kbGVyTGludXg6OlN0YXJ0TGlzdGVuaW5nT25UaHJlYWQoKSB7Ci0gIENIRUNLKHNvY2tldF8uaXNfdmFsaWQoKSk7Ci0gIENIRUNLKGFkYXB0ZXIoKSk7Ci0gIENIRUNLKHJ1bm5pbmdfKTsKLQotICBMT0coSU5GTykgPDwgIkxpc3RlbmluZyB0byBpbmNvbWluZyBjb25uZWN0aW9ucyI7Ci0KLSAgaW50IHN0YXR1cyA9IGxpc3Rlbihzb2NrZXRfLmdldCgpLCBTT01BWENPTk4pOwotICBpZiAoc3RhdHVzIDwgMCkgewotICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbGlzdGVuIG9uIGRvbWFpbiBzb2NrZXQiOwotICAgIG9yaWdpbl90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAotICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJklQQ0hhbmRsZXJMaW51eDo6U2h1dERvd25Pbk9yaWdpblRocmVhZCwgdGhpcykpOwotICAgIHJldHVybjsKLSAgfQotCi0gIE5vdGlmeVN0YXJ0ZWRPbk9yaWdpblRocmVhZCgpOwotCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogVGhlIGNvZGUgYmVsb3cgY2FuIGNhdXNlIHRoZSBkYWVtb24gdG8gcnVuIGluZGVmaW5pdGVseSBpZgotICAvLyB0aGUgdGhyZWFkIGlzIGpvaW5lZCB3aGlsZSBpdCdzIGluIHRoZSBtaWRkbGUgb2YgdGhlIEV2ZW50TG9vcCgpIGNhbGwuIFRoZQotICAvLyBFdmVudExvb3AoKSB3b24ndCBleGl0IHVudGlsIGEgY2xpZW50IHRlcm1pbmF0ZXMgdGhlIGNvbm5lY3Rpb24sIGhvd2V2ZXIKLSAgLy8gdGhpcyBjYW4gYmUgZml4ZWQgYnkgdXNpbmcgdGhlIHx0aHJlYWRffCdzIE1lc3NhZ2VMb29wRm9ySU8gaW5zdGVhZCAoc2luY2UKLSAgLy8gaXQgZ2V0cyBzdG9wcGVkIGFsb25nIHdpdGggdGhlIHRocmVhZCkuCi0gIC8vIFRPRE8oaWNvb2xpZGdlKTogYWNjZXB0IHNpbXVsdGFuZW91cyBjbGllbnRzCi0gIHdoaWxlIChrZWVwX3J1bm5pbmdfLmxvYWQoKSkgewotICAgIGludCBjbGllbnRfc29ja2V0ID0gYWNjZXB0NChzb2NrZXRfLmdldCgpLCBudWxscHRyLCBudWxscHRyLCBTT0NLX05PTkJMT0NLKTsKLSAgICBpZiAoY2xpZW50X3NvY2tldCA8IDApIHsKLSAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9uIjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiRXN0YWJsaXNoZWQgY2xpZW50IGNvbm5lY3Rpb246IGZkPSIgPDwgY2xpZW50X3NvY2tldDsKLQotICAgIExpbnV4SVBDSG9zdCBpcGNfaG9zdChjbGllbnRfc29ja2V0LCBhZGFwdGVyKCkpOwotCi0gICAgLy8gVE9ETyhhcm1hbnNpdG8pOiBVc2UgfHRocmVhZF98J3MgTWVzc2FnZUxvb3BGb3JJTyBpbnN0ZWFkIG9mIHVzaW5nIGEKLSAgICAvLyBjdXN0b20gZXZlbnQgbG9vcCB0byBwb2xsIGZyb20gdGhlIHNvY2tldC4KLSAgICBpcGNfaG9zdC5FdmVudExvb3AoKTsKLSAgfQotfQotCi12b2lkIElQQ0hhbmRsZXJMaW51eDo6U2h1dERvd25Pbk9yaWdpblRocmVhZCgpIHsKLSAgTE9HKElORk8pIDw8ICJTaHV0dGluZyBkb3duIElQQ0hhbmRsZXJMaW51eCB0aHJlYWQiOwotICB0aHJlYWRfLlN0b3AoKTsKLSAgcnVubmluZ18gPSBmYWxzZTsKLQotICBOb3RpZnlTdG9wcGVkT25DdXJyZW50VGhyZWFkKCk7Ci19Ci0KLXZvaWQgSVBDSGFuZGxlckxpbnV4OjpOb3RpZnlTdGFydGVkT25PcmlnaW5UaHJlYWQoKSB7Ci0gIGlmICghZGVsZWdhdGUoKSkgcmV0dXJuOwotCi0gIG9yaWdpbl90YXNrX3J1bm5lcl8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmSVBDSGFuZGxlckxpbnV4OjpOb3RpZnlTdGFydGVkT25DdXJyZW50VGhyZWFkLCB0aGlzKSk7Ci19Ci0KLXZvaWQgSVBDSGFuZGxlckxpbnV4OjpOb3RpZnlTdGFydGVkT25DdXJyZW50VGhyZWFkKCkgewotICBpZiAoZGVsZWdhdGUoKSkgZGVsZWdhdGUoKS0+T25JUENIYW5kbGVyU3RhcnRlZChJUENNYW5hZ2VyOjpUWVBFX0xJTlVYKTsKLX0KLQotdm9pZCBJUENIYW5kbGVyTGludXg6Ok5vdGlmeVN0b3BwZWRPbk9yaWdpblRocmVhZCgpIHsKLSAgaWYgKCFkZWxlZ2F0ZSgpKSByZXR1cm47Ci0KLSAgb3JpZ2luX3Rhc2tfcnVubmVyXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpCaW5kKCZJUENIYW5kbGVyTGludXg6Ok5vdGlmeVN0b3BwZWRPbkN1cnJlbnRUaHJlYWQsIHRoaXMpKTsKLX0KLQotdm9pZCBJUENIYW5kbGVyTGludXg6Ok5vdGlmeVN0b3BwZWRPbkN1cnJlbnRUaHJlYWQoKSB7Ci0gIGlmIChkZWxlZ2F0ZSgpKSBkZWxlZ2F0ZSgpLT5PbklQQ0hhbmRsZXJTdG9wcGVkKElQQ01hbmFnZXI6OlRZUEVfTElOVVgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9pcGNfaGFuZGxlcl9saW51eC5oIGIvc2VydmljZS9pcGMvaXBjX2hhbmRsZXJfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkNmVmYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9pcGNfaGFuZGxlcl9saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV9wYXRoLmg+Ci0jaW5jbHVkZSA8YmFzZS9maWxlcy9zY29wZWRfZmlsZS5oPgotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YmFzZS90aHJlYWRpbmcvdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9pcGNfaGFuZGxlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIFNpbmdsZVRocmVhZFRhc2tSdW5uZXI7Ci19ICAvLyBuYW1lc3BhY2UgYmFzZQotCi1uYW1lc3BhY2UgaXBjIHsKLQotLy8gSW1wbGVtZW50cyBhIExpbnV4IHNlcXVlbnRpYWwgcGFja2V0IGRvbWFpbi1zb2NrZXQgYmFzZWQgSVBDSGFuZGxlcgotY2xhc3MgSVBDSGFuZGxlckxpbnV4IDogcHVibGljIElQQ0hhbmRsZXIgewotIHB1YmxpYzoKLSAgSVBDSGFuZGxlckxpbnV4KGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlciwgSVBDTWFuYWdlcjo6RGVsZWdhdGUqIGRlbGVnYXRlKTsKLSAgfklQQ0hhbmRsZXJMaW51eCgpIG92ZXJyaWRlOwotCi0gIC8vIElQQ0hhbmRsZXIgb3ZlcnJpZGVzOgotICBib29sIFJ1bigpIG92ZXJyaWRlOwotICB2b2lkIFN0b3AoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIElQQ0hhbmRsZXJMaW51eCgpID0gZGVmYXVsdDsKLQotICAvLyBTdGFydHMgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gUG9zdGVkIG9uIHx0aHJlYWRffCBieSBSdW4oKS4KLSAgdm9pZCBTdGFydExpc3RlbmluZ09uVGhyZWFkKCk7Ci0KLSAgLy8gU3RvcHMgdGhlIElQQyB0aHJlYWQuIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBzaW5jZSBiYXNlOjpUaHJlYWQgcmVxdWlyZXMKLSAgLy8gdGhyZWFkcyB0byBiZSBzdG9wcGVkIG9uIHRoZSB0aHJlYWQgdGhhdCBzdGFydGVkIHRoZW0uCi0gIHZvaWQgU2h1dERvd25Pbk9yaWdpblRocmVhZCgpOwotCi0gIC8vIE5vdGlmaWVzIHRoZSBkZWxlZ2F0ZSB0aGF0IHdlIHN0YXJ0ZWQgb3Igc3RvcHBlZGxpc3RlbmluZyBmb3IgaW5jb21pbmcKLSAgLy8gY29ubmVjdGlvbnMuCi0gIHZvaWQgTm90aWZ5U3RhcnRlZE9uT3JpZ2luVGhyZWFkKCk7Ci0gIHZvaWQgTm90aWZ5U3RhcnRlZE9uQ3VycmVudFRocmVhZCgpOwotICB2b2lkIE5vdGlmeVN0b3BwZWRPbk9yaWdpblRocmVhZCgpOwotICB2b2lkIE5vdGlmeVN0b3BwZWRPbkN1cnJlbnRUaHJlYWQoKTsKLQotLy8gVHJ1ZSwgaWYgdGhlIElQQyBtZWNoYW5pc20gaXMgcnVubmluZy4KLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSAgYm9vbCBydW5uaW5nXyBBVFRSSUJVVEVfVU5VU0VEOwotI2Vsc2UKLSAgYm9vbCBydW5uaW5nXzsKLSNlbmRpZgotCi0gIC8vIFRoZSBzZXJ2ZXIgc29ja2V0IG9uIHdoaWNoIHdlIGxpc3RlbiB0byBpbmNvbWluZyBjb25uZWN0aW9ucy4KLSAgYmFzZTo6U2NvcGVkRkQgc29ja2V0XzsKLQotICAvLyBUaGUgZmlsZSBwYXRoIHRvIHxzb2NrZXRffC4gVGhpcyBpcyBvbmx5IHNldCBpZiB3ZSBjcmVhdGUgYW5kIG1hbmFnZSB0aGUKLSAgLy8gbGlmZSB0aW1lIG9mIHRoZSBzb2NrZXQuCi0gIGJhc2U6OkZpbGVQYXRoIHNvY2tldF9wYXRoXzsKLQotICAvLyBXZSB1c2UgYSBkZWRpY2F0ZWQgdGhyZWFkIGZvciBsaXN0ZW5pbmcgdG8gaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kCi0gIC8vIHBvbGxpbmcgZnJvbSB0aGUgc29ja2V0IHRvIGF2b2lkIGJsb2NraW5nIHRoZSBtYWluIHRocmVhZC4KLSAgYmFzZTo6VGhyZWFkIHRocmVhZF87Ci0KLSAgLy8gV2hldGhlciBvciBub3QgdGhlIGxpc3RlbmluZyB0aHJlYWQgc2hvdWxkIGNvbnRpbnVlIHRvIHJ1bi4KLSAgc3RkOjphdG9taWM8Ym9vbD4ga2VlcF9ydW5uaW5nXzsKLQotICAvLyBUaGUgb3JpZ2luIHRocmVhZCdzIHRhc2sgcnVubmVyLgotICBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IG9yaWdpbl90YXNrX3J1bm5lcl87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKElQQ0hhbmRsZXJMaW51eCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9pcGNfbWFuYWdlci5jYyBiL3NlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg3MGI0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9pcGNfbWFuYWdlci5oIgotCi0jaWYgIWRlZmluZWQoT1NfR0VORVJJQykKLSNpbmNsdWRlICJzZXJ2aWNlL2lwYy9iaW5kZXIvaXBjX2hhbmRsZXJfYmluZGVyLmgiCi0jZWxzZQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2RidXMvaXBjX2hhbmRsZXJfZGJ1cy5oIgotI2VuZGlmICAvLyAhZGVmaW5lZChPU19HRU5FUklDKQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2lwY19oYW5kbGVyX2xpbnV4LmgiCi0KLW5hbWVzcGFjZSBpcGMgewotCi1JUENNYW5hZ2VyOjpJUENNYW5hZ2VyKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcikgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIENIRUNLKGFkYXB0ZXJfKTsKLX0KLQotSVBDTWFuYWdlcjo6fklQQ01hbmFnZXIoKSB7Ci0gIC8vIERvbid0IHJlbHkgb24gdGhlIGhhbmRsZXJzIGdldHRpbmcgZGVzdHJveWVkIHNpbmNlIGFub3RoZXIgdGhyZWFkIG1pZ2h0IGJlCi0gIC8vIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gdGhlbS4gSW5zdGVhZCwgZXhwbGljaXRseSBzdG9wIHRoZW0gaGVyZS4KLSAgaWYgKEJpbmRlclN0YXJ0ZWQoKSkgYmluZGVyX2hhbmRsZXJfLT5TdG9wKCk7Ci0gIGlmIChMaW51eFN0YXJ0ZWQoKSkgbGludXhfaGFuZGxlcl8tPlN0b3AoKTsKLSAgaWYgKERCdXNTdGFydGVkKCkpIGRidXNfaGFuZGxlcl8tPlN0b3AoKTsKLX0KLQotYm9vbCBJUENNYW5hZ2VyOjpTdGFydChUeXBlIHR5cGUsIERlbGVnYXRlKiBkZWxlZ2F0ZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRZUEVfTElOVVg6Ci0gICAgICBpZiAoTGludXhTdGFydGVkKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiSVBDTWFuYWdlckxpbnV4IGFscmVhZHkgc3RhcnRlZC4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGxpbnV4X2hhbmRsZXJfID0gbmV3IElQQ0hhbmRsZXJMaW51eChhZGFwdGVyXywgZGVsZWdhdGUpOwotICAgICAgaWYgKCFsaW51eF9oYW5kbGVyXy0+UnVuKCkpIHsKLSAgICAgICAgbGludXhfaGFuZGxlcl8gPSBudWxscHRyOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotI2lmICFkZWZpbmVkKE9TX0dFTkVSSUMpCi0gICAgY2FzZSBUWVBFX0JJTkRFUjoKLSAgICAgIGlmIChCaW5kZXJTdGFydGVkKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiSVBDTWFuYWdlckJpbmRlciBhbHJlYWR5IHN0YXJ0ZWQuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBiaW5kZXJfaGFuZGxlcl8gPSBuZXcgSVBDSGFuZGxlckJpbmRlcihhZGFwdGVyXywgZGVsZWdhdGUpOwotICAgICAgaWYgKCFiaW5kZXJfaGFuZGxlcl8tPlJ1bigpKSB7Ci0gICAgICAgIGJpbmRlcl9oYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgICBjYXNlIFRZUEVfREJVUzoKLSAgICAgIGlmIChEQnVzU3RhcnRlZCgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIklQQ01hbmFnZXJEQnVzIGFscmVhZHkgc3RhcnRlZC4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGRidXNfaGFuZGxlcl8gPSBuZXcgSVBDSGFuZGxlckRCdXMoYWRhcHRlcl8sIGRlbGVnYXRlKTsKLSAgICAgIGlmICghZGJ1c19oYW5kbGVyXy0+UnVuKCkpIHsKLSAgICAgICAgZGJ1c19oYW5kbGVyXyA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotI2VuZGlmICAvLyAhZGVmaW5lZChPU19HRU5FUklDKQotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIElQQyB0eXBlIGdpdmVuOiAiIDw8IHR5cGU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSVBDTWFuYWdlcjo6QmluZGVyU3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIGJpbmRlcl9oYW5kbGVyXy5nZXQoKTsgfQotCi1ib29sIElQQ01hbmFnZXI6OkxpbnV4U3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIGxpbnV4X2hhbmRsZXJfLmdldCgpOyB9Ci0KLWJvb2wgSVBDTWFuYWdlcjo6REJ1c1N0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBkYnVzX2hhbmRsZXJfLmdldCgpOyB9Ci0KLX0gIC8vIG5hbWVzcGFjZSBpcGMKZGlmZiAtLWdpdCBhL3NlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmggYi9zZXJ2aWNlL2lwYy9pcGNfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTk2MGJhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2lwY19tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLWNsYXNzIEFkYXB0ZXI7Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLW5hbWVzcGFjZSBpcGMgewotCi1jbGFzcyBJUENIYW5kbGVyOwotCi0vLyBJUENNYW5hZ2VyIGlzIGEgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhbmQgcnVubmluZyBzdXBwb3J0ZWQgSVBDIG1lY2hhbmlzbXMuCi0vLyBJdCBtYW5hZ2VzIHRoZSBsaWZlLXRpbWUgb2YgZGlmZmVyZW50IElQQyBmbGF2b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiB0aGUKLS8vIHN5c3RlbS4gVGhlcmUgYXJlIHR3byBmbGF2b3JzOiBhIExpbnV4IHNlcXVlbnRpYWwgcGFja2V0IGRvbWFpbiBzb2NrZXQgYmFzZWQKLS8vIHN5c3RlbSBhbmQgb25lIGJhc2VkIG9uIHRoZSBCaW5kZXItYmFzZWQgYW5kcm9pZC5ibHVldG9vdGggZnJhbWV3b3JrLgotY2xhc3MgSVBDTWFuYWdlciB7Ci0gcHVibGljOgotICAvLyBQb3NzaWJsZSBJUEMgdHlwZXMuCi0gIGVudW0gVHlwZSB7Ci0gICAgVFlQRV9MSU5VWCwgICAvLyBJUEMgYmFzZWQgb24gYSBMaW51eCBzZXF1ZW50aWFsIHBhY2tldCBkb21haW4gc29ja2V0Ci0gICAgVFlQRV9CSU5ERVIsICAvLyBJUEMgYmFzZWQgb24gdGhlIEJpbmRlcgotICAgIFRZUEVfREJVUyAgICAgLy8gSVBDIGJhc2VkIG9uIHRoZSBEQnVzCi0gIH07Ci0KLSAgLy8gSW50ZXJmYWNlIGZvciBvYnNlcnZpbmcgZXZlbnRzIGZyb20gYW4gSVBDIG1lY2hhbmlzbS4gVGhlc2UgbWV0aG9kcyB3aWxsIGJlCi0gIC8vIGNhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgc3RhcnRlZCB0aGUgcGFydGljdWxhciBJUEMgdHlwZS4KLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIERlbGVnYXRlKCkgPSBkZWZhdWx0OwotICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgPSBkZWZhdWx0OwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gYW4gSVBDIG1lY2hhbmlzbSBoYXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgYW5kIGlzIHJlYWR5IGZvcgotICAgIC8vIGNsaWVudCBjb25uZWN0aW9ucy4KLSAgICB2aXJ0dWFsIHZvaWQgT25JUENIYW5kbGVyU3RhcnRlZChUeXBlIHR5cGUpID0gMDsKLQotICAgIC8vIENhbGxlZCB3aGVuIGFuIElQQyBtZWNoYW5pc20gaGFzIHN0b3BwZWQuIFRoaXMgbWF5IGhhcHBlbiBkdWUgdG8gYW4gZXJyb3IKLSAgICAvLyBpbiBpbml0aWFsaXphdGlvbiBvciBkdWUgdG8gYSByZWd1bGFyIHNodXQgZG93biByb3V0aW5lLgotICAgIHZpcnR1YWwgdm9pZCBPbklQQ0hhbmRsZXJTdG9wcGVkKFR5cGUgdHlwZSkgPSAwOwotCi0gICBwcml2YXRlOgotICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZWxlZ2F0ZSk7Ci0gIH07Ci0KLSAgZXhwbGljaXQgSVBDTWFuYWdlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIpOwotICB+SVBDTWFuYWdlcigpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIHVuZGVybHlpbmcgSVBDIGhhbmRsZXIgYmFzZWQgb24gfHR5cGV8LCBpZiB0aGF0IHR5cGUgaGFzIG5vdAotICAvLyB5ZXQgYmVlbiBpbml0aWFsaXplZCBhbmQgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFJldHVybnMgZmFsc2UgaWYgdGhhdAotICAvLyB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAvLwotICAvLyBJZiBUWVBFX0xJTlVYIGlzIGdpdmVuLCB0aGUgZmlsZSBwYXRoIHRvIHVzZSBmb3IgdGhlIGRvbWFpbiBzb2NrZXQgd2lsbCBiZQotICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBnbG9iYWwgU2V0dGluZ3Mgb2JqZWN0LiBIZW5jZSwgdGhlIFNldHRpbmdzIG9iamVjdCBtdXN0Ci0gIC8vIGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgLy8KLSAgLy8gfGRlbGVnYXRlfCBtdXN0IG91dC1saXZlIHRoZSBJUENNYW5hZ2VyIGFuZCB0aGUgdW5kZXJseWluZyBoYW5kbGVyLiBVc2VycwotICAvLyBjYW4gZ3VhcmFudGVlIHByb3BlciBjbGVhbiB1cCBieSBkZWFsbG9jYXRpbmcgfGRlbGVnYXRlfCB3aGVuIG9yIGFmdGVyCi0gIC8vIERlbGVnYXRlOjpPbklQQ0hhbmRsZXJTdG9wcGVkIGlzIGNhbGxlZC4gSXQgaXMgc2FmZSB0byBkZXN0cm95IHxkZWxlZ2F0ZXwKLSAgLy8gYWZ0ZXIgZGVzdHJveWluZyB0aGUgSVBDTWFuYWdlciBpbnN0YW5jZSwgYXMgdGhlIGRlc3RydWN0b3Igd2lsbCBqb2luIGFuZAotICAvLyBjbGVhbiB1cCBhbGwgdW5kZXJseWluZyB0aHJlYWRzLgotICBib29sIFN0YXJ0KFR5cGUgdHlwZSwgRGVsZWdhdGUqIGRlbGVnYXRlKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYW4gSVBDIHR5cGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gIGJvb2wgQmluZGVyU3RhcnRlZCgpIGNvbnN0OwotICBib29sIExpbnV4U3RhcnRlZCgpIGNvbnN0OwotICBib29sIERCdXNTdGFydGVkKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBJUENNYW5hZ2VyKCkgPSBkZWZhdWx0OwotCi0gIC8vIFBvaW50ZXJzIHRvIHRoZSBkaWZmZXJlbnQgSVBDIGhhbmRsZXIgY2xhc3Nlcy4gVGhlc2UgYXJlIGluaXRpYWxpemVkIGFuZAotICAvLyBvd25lZCBieSB1cy4KLSAgc2NvcGVkX3JlZnB0cjxJUENIYW5kbGVyPiBiaW5kZXJfaGFuZGxlcl87Ci0gIHNjb3BlZF9yZWZwdHI8SVBDSGFuZGxlcj4gbGludXhfaGFuZGxlcl87Ci0gIHNjb3BlZF9yZWZwdHI8SVBDSGFuZGxlcj4gZGJ1c19oYW5kbGVyXzsKLQotICAvLyBUaGUgQmx1ZXRvb3RoIGFkYXB0ZXIgaW5zdGFuY2UuIFRoaXMgaXMgb3duZWQgYnkgRGFlbW9uIHNvIHdlIGtlZXAgYSByYXcKLSAgLy8gcG9pbnRlciB0byBpdC4KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSVBDTWFuYWdlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9saW51eF9pcGNfaG9zdC5jYyBiL3NlcnZpY2UvaXBjL2xpbnV4X2lwY19ob3N0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQ0MWYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvaXBjL2xpbnV4X2lwY19ob3N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2JsdWV0b290aF9ob3N0IgotCi0jaW5jbHVkZSAic2VydmljZS9pcGMvbGludXhfaXBjX2hvc3QuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxiYXNlL2Jhc2U2NC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19zcGxpdC5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic2VydmljZS9hZGFwdGVyLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6QWRhcHRlcjsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDo6Z2F0dDsKLQotbmFtZXNwYWNlIHsKLQotLy8gSVBDIEFQSSBpcyBhY2NvcmRpbmcgdG86Ci0vLyBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFlUm5rdS1qQXlWVTF3R0pzTFQyQ3pXaTAtOGJzMmc0OXMxYjNGUl9HQXBNCi1jb25zdCBjaGFyIGtTZXRBZGFwdGVyTmFtZUNvbW1hbmRbXSA9ICJzZXQtZGV2aWNlLW5hbWUiOwotY29uc3QgY2hhciBrQ3JlYXRlU2VydmljZUNvbW1hbmRbXSA9ICJjcmVhdGUtc2VydmljZSI7Ci1jb25zdCBjaGFyIGtEZXN0cm95U2VydmljZUNvbW1hbmRbXSA9ICJkZXN0cm95LXNlcnZpY2UiOwotY29uc3QgY2hhciBrQWRkQ2hhcmFjdGVyaXN0aWNDb21tYW5kW10gPSAiYWRkLWNoYXJhY3RlcmlzdGljIjsKLWNvbnN0IGNoYXIga1NldENoYXJhY3RlcmlzdGljVmFsdWVDb21tYW5kW10gPSAic2V0LWNoYXJhY3RlcmlzdGljLXZhbHVlIjsKLWNvbnN0IGNoYXIga1NldEFkdmVydGlzZW1lbnRDb21tYW5kW10gPSAic2V0LWFkdmVydGlzZW1lbnQiOwotY29uc3QgY2hhciBrU2V0U2NhblJlc3BvbnNlQ29tbWFuZFtdID0gInNldC1zY2FuLXJlc3BvbnNlIjsKLWNvbnN0IGNoYXIga1N0YXJ0U2VydmljZUNvbW1hbmRbXSA9ICJzdGFydC1zZXJ2aWNlIjsKLWNvbnN0IGNoYXIga1N0b3BTZXJ2aWNlQ29tbWFuZFtdID0gInN0b3Atc2VydmljZSI7Ci1jb25zdCBjaGFyIGtXcml0ZUNoYXJhY3RlcmlzdGljQ29tbWFuZFtdID0gIndyaXRlLWNoYXJhY3RlcmlzdGljIjsKLQotLy8gVXNlZnVsIHZhbHVlcyBmb3IgaW5kZXhpbmcgTGludXhJUENIb3N0OjpwZmRzXwotLy8gTm90IHN1cGVyIGdlbmVyYWwgY29uc2lkZXJpbmcgdGhhdCB3ZSBzaG91bGQgYmUgYWJsZSB0byBzdXBwb3J0Ci0vLyBtYW55IEdBVFQgRkRzIG93bmVkIGJ5IG9uZSBMaW51eElQQ0hvc3QuCi1lbnVtIHsKLSAga0ZkSXBjID0gMCwKLSAga0ZkR2F0dCA9IDEsCi0gIGtQb3NzaWJsZUZkcyA9IDIsCi19OwotCi1ib29sIFRva2VuQm9vbChjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCkgeyByZXR1cm4gdGV4dCA9PSAidHJ1ZSI7IH0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBpcGMgewotCi1MaW51eElQQ0hvc3Q6OkxpbnV4SVBDSG9zdChpbnQgc29ja2ZkLCBBZGFwdGVyKiBhZGFwdGVyKQotICAgIDogYWRhcHRlcl8oYWRhcHRlciksIHBmZHNfKDEsIHtzb2NrZmQsIFBPTExJTiwgMH0pIHt9Ci0KLUxpbnV4SVBDSG9zdDo6fkxpbnV4SVBDSG9zdCgpIHsgY2xvc2UocGZkc19bMF0uZmQpOyB9Ci0KLWJvb2wgTGludXhJUENIb3N0OjpFdmVudExvb3AoKSB7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShwcG9sbChwZmRzXy5kYXRhKCksIHBmZHNfLnNpemUoKSwgbnVsbHB0ciwgbnVsbHB0cikpOwotICAgIGlmIChzdGF0dXMgPCAxKSB7Ci0gICAgICBMT0dfRVJST1IoInBwb2xsIGVycm9yIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHBmZHNfW2tGZElwY10ucmV2ZW50cyAmJiAhT25NZXNzYWdlKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAocGZkc18uc2l6ZSgpID09IGtQb3NzaWJsZUZkcyAmJiBwZmRzX1trRmRHYXR0XS5yZXZlbnRzICYmCi0gICAgICAgICFPbkdhdHRXcml0ZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExpbnV4SVBDSG9zdDo6T25TZXRBZGFwdGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICBzdGQ6OnN0cmluZyBkZWNvZGVkX2RhdGE7Ci0gIGJhc2U6OkJhc2U2NERlY29kZShuYW1lLCAmZGVjb2RlZF9kYXRhKTsKLSAgcmV0dXJuIGFkYXB0ZXJfLT5TZXROYW1lKGRlY29kZWRfZGF0YSk7Ci19Ci0KLWJvb2wgTGludXhJUENIb3N0OjpPbkNyZWF0ZVNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfdXVpZCkgewotICBnYXR0X3NlcnZlcnNfW3NlcnZpY2VfdXVpZF0gPSBzdGQ6OnVuaXF1ZV9wdHI8U2VydmVyPihuZXcgU2VydmVyKTsKLQotICBpbnQgZ2F0dGZkOwotICBib29sIHN0YXR1cyA9IGdhdHRfc2VydmVyc19bc2VydmljZV91dWlkXS0+SW5pdGlhbGl6ZSgKLSAgICAgIFV1aWQ6OkZyb21TdHJpbmcoc2VydmljZV91dWlkKSwgJmdhdHRmZCk7Ci0gIGlmICghc3RhdHVzKSB7Ci0gICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBibHVldG9vdGgiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcGZkc18ucmVzaXplKGtQb3NzaWJsZUZkcyk7Ci0gIHBmZHNfW2tGZEdhdHRdID0ge2dhdHRmZCwgUE9MTElOLCAwfTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTGludXhJUENIb3N0OjpPbkRlc3Ryb3lTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQpIHsKLSAgZ2F0dF9zZXJ2ZXJzXy5lcmFzZShzZXJ2aWNlX3V1aWQpOwotICBjbG9zZShwZmRzX1sxXS5mZCk7Ci0gIHBmZHNfLnJlc2l6ZSgxKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTGludXhJUENIb3N0OjpPbkFkZENoYXJhY3RlcmlzdGljKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2hhcmFjdGVyaXN0aWNfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250cm9sX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3B0aW9uX3Rva2VucyA9IGJhc2U6OlNwbGl0U3RyaW5nKAotICAgICAgb3B0aW9ucywgIi4iLCBiYXNlOjpUUklNX1dISVRFU1BBQ0UsIGJhc2U6OlNQTElUX1dBTlRfQUxMKTsKLQotICBpbnQgcHJvcGVydGllc19tYXNrID0gMDsKLSAgaW50IHBlcm1pc3Npb25zX21hc2sgPSAwOwotCi0gIGlmIChzdGQ6OmZpbmQob3B0aW9uX3Rva2Vucy5iZWdpbigpLCBvcHRpb25fdG9rZW5zLmVuZCgpLCAibm90aWZ5IikgIT0KLSAgICAgIG9wdGlvbl90b2tlbnMuZW5kKCkpIHsKLSAgICBwZXJtaXNzaW9uc19tYXNrIHw9IGtQZXJtaXNzaW9uUmVhZDsKLSAgICBwcm9wZXJ0aWVzX21hc2sgfD0ga1Byb3BlcnR5UmVhZDsKLSAgICBwcm9wZXJ0aWVzX21hc2sgfD0ga1Byb3BlcnR5Tm90aWZ5OwotICB9Ci0gIGlmIChzdGQ6OmZpbmQob3B0aW9uX3Rva2Vucy5iZWdpbigpLCBvcHRpb25fdG9rZW5zLmVuZCgpLCAicmVhZCIpICE9Ci0gICAgICBvcHRpb25fdG9rZW5zLmVuZCgpKSB7Ci0gICAgcGVybWlzc2lvbnNfbWFzayB8PSBrUGVybWlzc2lvblJlYWQ7Ci0gICAgcHJvcGVydGllc19tYXNrIHw9IGtQcm9wZXJ0eVJlYWQ7Ci0gIH0KLSAgaWYgKHN0ZDo6ZmluZChvcHRpb25fdG9rZW5zLmJlZ2luKCksIG9wdGlvbl90b2tlbnMuZW5kKCksICJ3cml0ZSIpICE9Ci0gICAgICBvcHRpb25fdG9rZW5zLmVuZCgpKSB7Ci0gICAgcGVybWlzc2lvbnNfbWFzayB8PSBrUGVybWlzc2lvbldyaXRlOwotICAgIHByb3BlcnRpZXNfbWFzayB8PSBrUHJvcGVydHlXcml0ZTsKLSAgfQotCi0gIGlmIChjb250cm9sX3V1aWQuZW1wdHkoKSkgewotICAgIGdhdHRfc2VydmVyc19bc2VydmljZV91dWlkXS0+QWRkQ2hhcmFjdGVyaXN0aWMoCi0gICAgICAgIFV1aWQ6OkZyb21TdHJpbmcoY2hhcmFjdGVyaXN0aWNfdXVpZCksIHByb3BlcnRpZXNfbWFzaywKLSAgICAgICAgcGVybWlzc2lvbnNfbWFzayk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2F0dF9zZXJ2ZXJzX1tzZXJ2aWNlX3V1aWRdLT5BZGRCbG9iKFV1aWQ6OkZyb21TdHJpbmcoY2hhcmFjdGVyaXN0aWNfdXVpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb21TdHJpbmcoY29udHJvbF91dWlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc19tYXNrLCBwZXJtaXNzaW9uc19tYXNrKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBMaW51eElQQ0hvc3Q6Ok9uU2V0Q2hhcmFjdGVyaXN0aWNWYWx1ZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV91dWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgY2hhcmFjdGVyaXN0aWNfdXVpZCwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmcgZGVjb2RlZF9kYXRhOwotICBiYXNlOjpCYXNlNjREZWNvZGUodmFsdWUsICZkZWNvZGVkX2RhdGEpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBibG9iX2RhdGEoZGVjb2RlZF9kYXRhLmJlZ2luKCksIGRlY29kZWRfZGF0YS5lbmQoKSk7Ci0gIGdhdHRfc2VydmVyc19bc2VydmljZV91dWlkXS0+U2V0Q2hhcmFjdGVyaXN0aWNWYWx1ZSgKLSAgICAgIFV1aWQ6OkZyb21TdHJpbmcoY2hhcmFjdGVyaXN0aWNfdXVpZCksIGJsb2JfZGF0YSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExpbnV4SVBDSG9zdDo6T25TZXRBZHZlcnRpc2VtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZHZlcnRpc2VfdXVpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1hbnVmYWN0dXJlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHJhbnNtaXRfbmFtZSkgewotICBMT0dfSU5GTygiJXM6IHNlcnZpY2U6JXMgdXVpZHM6JXMgZGF0YTolcyIsIF9fZnVuY19fLCBzZXJ2aWNlX3V1aWQuY19zdHIoKSwKLSAgICAgICAgICAgYWR2ZXJ0aXNlX3V1aWRzLmNfc3RyKCksIGFkdmVydGlzZV9kYXRhLmNfc3RyKCkpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhZHZlcnRpc2VfdXVpZF90b2tlbnMgPSBiYXNlOjpTcGxpdFN0cmluZygKLSAgICAgIGFkdmVydGlzZV91dWlkcywgIi4iLCBiYXNlOjpUUklNX1dISVRFU1BBQ0UsIGJhc2U6OlNQTElUX1dBTlRfQUxMKTsKLQotICAvLyBzdHJpbmcgLT4gdmVjdG9yPFV1aWQ+Ci0gIHN0ZDo6dmVjdG9yPFV1aWQ+IGlkczsKLSAgZm9yIChjb25zdCBhdXRvJiB1dWlkX3Rva2VuIDogYWR2ZXJ0aXNlX3V1aWRfdG9rZW5zKQotICAgIGlkcy5lbXBsYWNlX2JhY2soVXVpZDo6RnJvbVN0cmluZyh1dWlkX3Rva2VuKSk7Ci0KLSAgc3RkOjpzdHJpbmcgZGVjb2RlZF9kYXRhOwotICBiYXNlOjpCYXNlNjREZWNvZGUoYWR2ZXJ0aXNlX2RhdGEsICZkZWNvZGVkX2RhdGEpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZWNvZGVkX2FkdmVydGlzZV9kYXRhKGRlY29kZWRfZGF0YS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRfZGF0YS5lbmQoKSk7Ci0KLSAgYmFzZTo6QmFzZTY0RGVjb2RlKG1hbnVmYWN0dXJlcl9kYXRhLCAmZGVjb2RlZF9kYXRhKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVjb2RlZF9tYW51ZmFjdHVyZXJfZGF0YShkZWNvZGVkX2RhdGEuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX2RhdGEuZW5kKCkpOwotCi0gIGdhdHRfc2VydmVyc19bc2VydmljZV91dWlkXS0+U2V0QWR2ZXJ0aXNlbWVudChpZHMsIGRlY29kZWRfYWR2ZXJ0aXNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX21hbnVmYWN0dXJlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5Cb29sKHRyYW5zbWl0X25hbWUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTGludXhJUENIb3N0OjpPblNldFNjYW5SZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzY2FuX3Jlc3BvbnNlX3V1aWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzY2FuX3Jlc3BvbnNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1hbnVmYWN0dXJlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFuc21pdF9uYW1lKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzY2FuX3Jlc3BvbnNlX3V1aWRfdG9rZW5zID0gYmFzZTo6U3BsaXRTdHJpbmcoCi0gICAgICBzY2FuX3Jlc3BvbnNlX3V1aWRzLCAiLiIsIGJhc2U6OlRSSU1fV0hJVEVTUEFDRSwgYmFzZTo6U1BMSVRfV0FOVF9BTEwpOwotCi0gIC8vIHN0cmluZyAtPiB2ZWN0b3I8VXVpZD4KLSAgc3RkOjp2ZWN0b3I8VXVpZD4gaWRzOwotICBmb3IgKGNvbnN0IGF1dG8mIHV1aWRfdG9rZW4gOiBzY2FuX3Jlc3BvbnNlX3V1aWRfdG9rZW5zKQotICAgIGlkcy5lbXBsYWNlX2JhY2soVXVpZDo6RnJvbVN0cmluZyh1dWlkX3Rva2VuKSk7Ci0KLSAgc3RkOjpzdHJpbmcgZGVjb2RlZF9kYXRhOwotICBiYXNlOjpCYXNlNjREZWNvZGUoc2Nhbl9yZXNwb25zZV9kYXRhLCAmZGVjb2RlZF9kYXRhKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVjb2RlZF9hZHZlcnRpc2VfZGF0YShkZWNvZGVkX2RhdGEuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX2RhdGEuZW5kKCkpOwotCi0gIGJhc2U6OkJhc2U2NERlY29kZShtYW51ZmFjdHVyZXJfZGF0YSwgJmRlY29kZWRfZGF0YSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWRfbWFudWZhY3R1cmVyX2RhdGEoZGVjb2RlZF9kYXRhLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF9kYXRhLmVuZCgpKTsKLQotICBnYXR0X3NlcnZlcnNfW3NlcnZpY2VfdXVpZF0tPlNldFNjYW5SZXNwb25zZShpZHMsIGRlY29kZWRfYWR2ZXJ0aXNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRfbWFudWZhY3R1cmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuQm9vbCh0cmFuc21pdF9uYW1lKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExpbnV4SVBDSG9zdDo6T25TdGFydFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfdXVpZCkgewotICByZXR1cm4gZ2F0dF9zZXJ2ZXJzX1tzZXJ2aWNlX3V1aWRdLT5TdGFydCgpOwotfQotCi1ib29sIExpbnV4SVBDSG9zdDo6T25TdG9wU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV91dWlkKSB7Ci0gIHJldHVybiBnYXR0X3NlcnZlcnNfW3NlcnZpY2VfdXVpZF0tPlN0b3AoKTsKLX0KLQotYm9vbCBMaW51eElQQ0hvc3Q6Ok9uTWVzc2FnZSgpIHsKLSAgc3RkOjpzdHJpbmcgaXBjX21zZzsKLSAgc3NpemVfdCBzaXplOwotCi0gIE9TSV9OT19JTlRSKHNpemUgPQotICAgICAgICAgICAgICAgICAgcmVjdihwZmRzX1trRmRJcGNdLmZkLCAmaXBjX21zZ1swXSwgMCwgTVNHX1BFRUsgfCBNU0dfVFJVTkMpKTsKLSAgaWYgKC0xID09IHNpemUpIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIHJlYWRpbmcgZGF0YWdyYW0gc2l6ZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICgwID09IHNpemUpIHsKLSAgICBMT0dfSU5GTygiJXM6JWQ6IENvbm5lY3Rpb24gY2xvc2VkIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpcGNfbXNnLnJlc2l6ZShzaXplKTsKLSAgT1NJX05PX0lOVFIoc2l6ZSA9IHJlYWQocGZkc19ba0ZkSXBjXS5mZCwgJmlwY19tc2dbMF0sIGlwY19tc2cuc2l6ZSgpKSk7Ci0gIGlmICgtMSA9PSBzaXplKSB7Ci0gICAgTE9HX0VSUk9SKCJFcnJvciByZWFkaW5nIElQQzogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICgwID09IHNpemUpIHsKLSAgICBMT0dfSU5GTygiJXM6JWQ6IENvbm5lY3Rpb24gY2xvc2VkIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zID0gYmFzZTo6U3BsaXRTdHJpbmcoCi0gICAgICBpcGNfbXNnLCAifCIsIGJhc2U6OlRSSU1fV0hJVEVTUEFDRSwgYmFzZTo6U1BMSVRfV0FOVF9BTEwpOwotICBzd2l0Y2ggKHRva2Vucy5zaXplKCkpIHsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAodG9rZW5zWzBdID09IGtTZXRBZGFwdGVyTmFtZUNvbW1hbmQpCi0gICAgICAgIHJldHVybiBPblNldEFkYXB0ZXJOYW1lKHRva2Vuc1sxXSk7Ci0gICAgICBpZiAodG9rZW5zWzBdID09IGtDcmVhdGVTZXJ2aWNlQ29tbWFuZCkgcmV0dXJuIE9uQ3JlYXRlU2VydmljZSh0b2tlbnNbMV0pOwotICAgICAgaWYgKHRva2Vuc1swXSA9PSBrRGVzdHJveVNlcnZpY2VDb21tYW5kKQotICAgICAgICByZXR1cm4gT25EZXN0cm95U2VydmljZSh0b2tlbnNbMV0pOwotICAgICAgaWYgKHRva2Vuc1swXSA9PSBrU3RhcnRTZXJ2aWNlQ29tbWFuZCkgcmV0dXJuIE9uU3RhcnRTZXJ2aWNlKHRva2Vuc1sxXSk7Ci0gICAgICBpZiAodG9rZW5zWzBdID09IGtTdG9wU2VydmljZUNvbW1hbmQpIHJldHVybiBPblN0b3BTZXJ2aWNlKHRva2Vuc1sxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAodG9rZW5zWzBdID09IGtTZXRDaGFyYWN0ZXJpc3RpY1ZhbHVlQ29tbWFuZCkKLSAgICAgICAgcmV0dXJuIE9uU2V0Q2hhcmFjdGVyaXN0aWNWYWx1ZSh0b2tlbnNbMV0sIHRva2Vuc1syXSwgdG9rZW5zWzNdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgIGlmICh0b2tlbnNbMF0gPT0ga0FkZENoYXJhY3RlcmlzdGljQ29tbWFuZCkKLSAgICAgICAgcmV0dXJuIE9uQWRkQ2hhcmFjdGVyaXN0aWModG9rZW5zWzFdLCB0b2tlbnNbMl0sIHRva2Vuc1szXSwgdG9rZW5zWzRdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIGlmICh0b2tlbnNbMF0gPT0ga1NldEFkdmVydGlzZW1lbnRDb21tYW5kKQotICAgICAgICByZXR1cm4gT25TZXRBZHZlcnRpc2VtZW50KHRva2Vuc1sxXSwgdG9rZW5zWzJdLCB0b2tlbnNbM10sIHRva2Vuc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnNbNV0pOwotICAgICAgaWYgKHRva2Vuc1swXSA9PSBrU2V0U2NhblJlc3BvbnNlQ29tbWFuZCkKLSAgICAgICAgcmV0dXJuIE9uU2V0U2NhblJlc3BvbnNlKHRva2Vuc1sxXSwgdG9rZW5zWzJdLCB0b2tlbnNbM10sIHRva2Vuc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vuc1s1XSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIk1hbGZvcm1lZCBJUEMgbWVzc2FnZTogJXMiLCBpcGNfbXNnLmNfc3RyKCkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTGludXhJUENIb3N0OjpPbkdhdHRXcml0ZSgpIHsKLSAgVXVpZDo6VVVJRDEyOEJpdCBpZDsKLSAgc3NpemVfdCByOwotCi0gIE9TSV9OT19JTlRSKHIgPSByZWFkKHBmZHNfW2tGZEdhdHRdLmZkLCBpZC5kYXRhKCksIGlkLnNpemUoKSkpOwotICBpZiAociAhPSBpZC5zaXplKCkpIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIHJlYWRpbmcgR0FUVCBhdHRyaWJ1dGUgSUQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZTsKLSAgLy8gVE9ETyhpY29vbGlkZ2UpOiBHZW5lcmFsaXplIHRoaXMgZm9yIG11bHRpcGxlIGNsaWVudHMuCi0gIGF1dG8gc2VydmVyID0gZ2F0dF9zZXJ2ZXJzXy5iZWdpbigpOwotICBzZXJ2ZXItPnNlY29uZC0+R2V0Q2hhcmFjdGVyaXN0aWNWYWx1ZShVdWlkOjpGcm9tMTI4Qml0QkUoaWQpLCAmdmFsdWUpOwotICBjb25zdCBzdGQ6OnN0cmluZyB2YWx1ZV9zdHJpbmcodmFsdWUuYmVnaW4oKSwgdmFsdWUuZW5kKCkpOwotICBzdGQ6OnN0cmluZyBlbmNvZGVkX3ZhbHVlOwotICBiYXNlOjpCYXNlNjRFbmNvZGUodmFsdWVfc3RyaW5nLCAmZW5jb2RlZF92YWx1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgdHJhbnNtaXQoa1dyaXRlQ2hhcmFjdGVyaXN0aWNDb21tYW5kKTsKLSAgdHJhbnNtaXQgKz0gInwiICsgc2VydmVyLT5maXJzdDsKLSAgdHJhbnNtaXQgKz0gInwiICsgYmFzZTo6SGV4RW5jb2RlKGlkLmRhdGEoKSwgaWQuc2l6ZSgpKTsKLSAgdHJhbnNtaXQgKz0gInwiICsgZW5jb2RlZF92YWx1ZTsKLQotICBPU0lfTk9fSU5UUihyID0gd3JpdGUocGZkc19ba0ZkSXBjXS5mZCwgdHJhbnNtaXQuZGF0YSgpLCB0cmFuc21pdC5zaXplKCkpKTsKLSAgaWYgKC0xID09IHIpIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIHJlcGx5aW5nIHRvIElQQzogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaXBjCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2lwYy9saW51eF9pcGNfaG9zdC5oIGIvc2VydmljZS9pcGMvbGludXhfaXBjX2hvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyZjcwZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2lwYy9saW51eF9pcGNfaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxwb2xsLmg+Ci0KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgInNlcnZpY2UvZ2F0dF9zZXJ2ZXJfb2xkLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotY2xhc3MgQWRhcHRlcjsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotbmFtZXNwYWNlIGlwYyB7Ci0KLS8vIFRoaXMgaW1wbGVtZW50cyBhIHNpbmdsZSB0aHJlYWRlZCBldmVudCBsb29wIHdoaWNoIGRpc3BhdGNoZXMKLS8vIHJlYWRzIGZyb20gYSBzZXQgb2YgRkRzIChwZmRzXykgdG8gYSBzZXQgb2YgaGFuZGxlcnMuCi0vLyBSZWFkcyBmcm9tIHRoZSBHQVRUIHBpcGUgcmVhZCBlbmQgd2lsbCByZXN1bHQgaW4gYSB3cml0ZSB0bwotLy8gdG8gdGhlIElQQyBzb2NrZXQsIGFuZCB2aXNlIHZlcnNhLgotY2xhc3MgTGludXhJUENIb3N0IHsKLSBwdWJsaWM6Ci0gIC8vIExpbnV4SVBDSG9zdCBvd25zIHRoZSBwYXNzZWQgc29ja2ZkLgotICBMaW51eElQQ0hvc3QoaW50IHNvY2tmZCwgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyKTsKLSAgfkxpbnV4SVBDSG9zdCgpOwotCi0gIC8vIFN5bmNocm9ub3VzbHkgaGFuZGxlIGFsbCBldmVudHMgb24gaW5wdXQgRkRzLgotICBib29sIEV2ZW50TG9vcCgpOwotCi0gcHJpdmF0ZToKLSAgLy8gSGFuZGxlciBmb3IgSVBDIG1lc3NhZ2UgcmVjZWl2ZXMuCi0gIC8vIERlY29kZXMgcHJvdG9jb2wgYW5kIGRpc3BhdGNoZXMgdG8gYW5vdGhlciBoYW5kbGVyLgotICBib29sIE9uTWVzc2FnZSgpOwotCi0gIC8vIEhhbmRsZXIgZm9yIEdBVFQgY2hhcmFjdGVyaXN0aWMgd3JpdGVzLgotICAvLyBFbmNvZGVzIHRvIHByb3RvY29sIGFuZCB0cmFuc21pdHMgSVBDLgotICBib29sIE9uR2F0dFdyaXRlKCk7Ci0KLSAgLy8gQXBwbGllcyBhZGFwdGVyIG5hbWUgY2hhbmdlcyB0byBzdGFjay4KLSAgYm9vbCBPblNldEFkYXB0ZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKLQotICAvLyBIYW5kbGVzIHNlcnZpY2UgY3JlYXRpb24uCi0gIGJvb2wgT25DcmVhdGVTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQpOwotCi0gIC8vIEhhbmRsZXMgc2VydmljZSBkZXN0cnVjdGlvbi4KLSAgYm9vbCBPbkRlc3Ryb3lTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQpOwotCi0gIC8vIENyZWF0ZXMgYSBjaGFyYWN0ZXJpc3RpYyBmb3IgYSBzZXJ2aWNlLgotICBib29sIE9uQWRkQ2hhcmFjdGVyaXN0aWMoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGFyYWN0ZXJpc3RpY191dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiBhIGNoYXJhY2V0aXN0aWMuCi0gIGJvb2wgT25TZXRDaGFyYWN0ZXJpc3RpY1ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGFyYWN0ZXJpc3RpY191dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotCi0gIC8vIEFwcGxpZXMgc2V0dGluZ3MgdG8gc2VydmljZSBhZHZlcnRpc2VtZW50LgotICBib29sIE9uU2V0QWR2ZXJ0aXNlbWVudChjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWR2ZXJ0aXNlX3V1aWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWR2ZXJ0aXNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRyYW5zbWl0X25hbWUpOwotCi0gIC8vIEFwcGxpZXMgc2V0dGluZ3MgdG8gc2NhbiByZXNwb25zZS4KLSAgYm9vbCBPblNldFNjYW5SZXNwb25zZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZHZlcnRpc2VfdXVpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHJhbnNtaXRfbmFtZSk7Ci0KLSAgLy8gU3RhcnRzIHNlcnZpY2UgKGFkdmVydGlzZW1lbnQgYW5kIGNvbm5lY3Rpb25zKQotICBib29sIE9uU3RhcnRTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX3V1aWQpOwotCi0gIC8vIFN0b3BzIHNlcnZpY2UuCi0gIGJvb2wgT25TdG9wU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV91dWlkKTsKLQotICAvLyB3ZWFrIHJlZmVyZW5jZS4KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyKiBhZGFwdGVyXzsKLQotICAvLyBGaWxlIGRlc2NyaXB0ZXJzIHRoYXQgd2Ugd2lsbCBibG9jayBhZ2FpbnN0LgotICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgcG9sbGZkPiBwZmRzXzsKLQotICAvLyBDb250YWluZXIgZm9yIG11bHRpcGxlIEdBVFQgc2VydmVycy4gQ3VycmVudGx5IG9ubHkgb25lIGlzIHN1cHBvcnRlZC4KLSAgLy8gVE9ETyhpY29vbGlkZ2UpOiBzdXBwb3J0IG1hbnkgdG8gb25lIGZvciByZWFsLgotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OmdhdHQ6OlNlcnZlcj4+Ci0gICAgICBnYXR0X3NlcnZlcnNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlwYwpkaWZmIC0tZ2l0IGEvc2VydmljZS9sb2dnaW5nX2hlbHBlcnMuY2MgYi9zZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MzAzMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLSNpbmNsdWRlICJsb2dnaW5nX2hlbHBlcnMuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1jb25zdCBjaGFyKiBCdEF2Q29ubmVjdGlvblN0YXRlVGV4dChjb25zdCBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFWX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQVZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQVZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBVl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIkludmFsaWQgQVYgY29ubmVjdGlvbiBzdGF0ZSI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogQnRBdkF1ZGlvU3RhdGVUZXh0KGNvbnN0IGJ0YXZfYXVkaW9fc3RhdGVfdCBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFWX0FVRElPX1NUQVRFX1JFTU9URV9TVVNQRU5EKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUQVZfQVVESU9fU1RBVEVfU1RPUFBFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVEFWX0FVRElPX1NUQVRFX1NUQVJURUQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIkludmFsaWQgYXVkaW8gc3RhdGUiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIEJ0VHJhbnNwb3J0VGV4dChjb25zdCBidGdhdHRfdHJhbnNwb3J0X3QgdCkgewotICBzd2l0Y2ggKHQpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1RSQU5TUE9SVF9BVVRPKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfVFJBTlNQT1JUX0xFKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIHRyYW5zcG9ydCI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogQnRTdGF0ZVRleHQoY29uc3QgYnRfc3RhdGVfdCBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9TVEFURV9PRkYpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfU1RBVEVfT04pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gc3RhdGUgY29kZSI7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogQnREaXNjb3ZlcnlTdGF0ZVRleHQoY29uc3QgYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfRElTQ09WRVJZX1NUT1BQRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfRElTQ09WRVJZX1NUQVJURUQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gInVua25vd24gZGlzY292ZXJ5IHN0YXRlIGNvZGUiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIEJ0U2Nhbk1vZGVUZXh0KGNvbnN0IGJ0X3NjYW5fbW9kZV90IG1vZGUpIHsKLSAgc3dpdGNoIChtb2RlKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9TQ0FOX01PREVfTk9ORSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9TQ0FOX01PREVfQ09OTkVDVEFCTEUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93biBzY2FuIG1vZGUiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIEJ0U3RhdHVzVGV4dChjb25zdCBidF9zdGF0dXNfdCBzdGF0dXMpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19GQUlMKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19OT1RfUkVBRFkpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfU1RBVFVTX05PTUVNKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19ET05FKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19CVVNZKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19VTlNVUFBPUlRFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9TVEFUVVNfUEFSTV9JTlZBTElEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19VTkhBTkRMRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfU1RBVFVTX0FVVEhfRkFJTFVSRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9TVEFUVVNfUk1UX0RFVl9ET1dOKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1NUQVRVU19BVVRIX1JFSkVDVEVEKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXR1cyBjb2RlIjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBCdFByb3BlcnR5VGV4dChjb25zdCBidF9wcm9wZXJ0eV90eXBlX3QgcHJvcCkgewotICBzd2l0Y2ggKHByb3ApIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX0JETkFNRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9QUk9QRVJUWV9CREFERFIpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfUFJPUEVSVFlfVVVJRFMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfUFJPUEVSVFlfQ0xBU1NfT0ZfREVWSUNFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX1RZUEVfT0ZfREVWSUNFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX1NFUlZJQ0VfUkVDT1JEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX0FEQVBURVJfQk9OREVEX0RFVklDRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfUFJPUEVSVFlfQURBUFRFUl9ESVNDT1ZFUllfVElNRU9VVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9QUk9QRVJUWV9SRU1PVEVfRlJJRU5ETFlfTkFNRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9QUk9QRVJUWV9SRU1PVEVfUlNTSSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9QUk9QRVJUWV9SRU1PVEVfVkVSU0lPTl9JTkZPKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX0xPQ0FMX0xFX0ZFQVRVUkVTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUX1BST1BFUlRZX1JFTU9URV9ERVZJQ0VfVElNRVNUQU1QKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJJbnZhbGlkIHByb3BlcnR5IjsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBCdEV2ZW50VGV4dChjb25zdCBidF9jYl90aHJlYWRfZXZ0IGV2dCkgewotICBzd2l0Y2ggKGV2dCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQVNTT0NJQVRFX0pWTSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChESVNBU1NPQ0lBVEVfSlZNKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIGNvZGUiOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIqIEJ0QWNsVGV4dChjb25zdCBidF9hY2xfc3RhdGVfdCBjb2RlKSB7Ci0gIHN3aXRjaCAoY29kZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfQUNMX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9BQ0xfU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIEFDTCBjb2RlIjsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyBCdEFkZHJTdHJpbmcoY29uc3QgUmF3QWRkcmVzcyogYWRkcikgewotICBjaGFyIGJ1ZmZlclsyMF07Ci0gIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0gICAgICAgICAgIGFkZHItPmFkZHJlc3NbMF0sIGFkZHItPmFkZHJlc3NbMV0sIGFkZHItPmFkZHJlc3NbMl0sCi0gICAgICAgICAgIGFkZHItPmFkZHJlc3NbM10sIGFkZHItPmFkZHJlc3NbNF0sIGFkZHItPmFkZHJlc3NbNV0pOwotICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2UvbG9nZ2luZ19oZWxwZXJzLmggYi9zZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTEyNDMwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvbG9nZ2luZ19oZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9idF9hdi5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2J0X2dhdHRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1jb25zdCBjaGFyKiBCdEF2Q29ubmVjdGlvblN0YXRlVGV4dChjb25zdCBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSk7Ci0KLWNvbnN0IGNoYXIqIEJ0QXZBdWRpb1N0YXRlVGV4dChjb25zdCBidGF2X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpOwotCi1jb25zdCBjaGFyKiBCdFRyYW5zcG9ydFRleHQoY29uc3QgYnRnYXR0X3RyYW5zcG9ydF90IHQpOwotCi1jb25zdCBjaGFyKiBCdFN0YXRlVGV4dChjb25zdCBidF9zdGF0ZV90IHN0YXRlKTsKLQotY29uc3QgY2hhciogQnREaXNjb3ZlcnlTdGF0ZVRleHQoY29uc3QgYnRfZGlzY292ZXJ5X3N0YXRlX3QpOwotCi1jb25zdCBjaGFyKiBCdFNjYW5Nb2RlVGV4dChjb25zdCBidF9zY2FuX21vZGVfdCBtb2RlKTsKLQotY29uc3QgY2hhciogQnRTdGF0dXNUZXh0KGNvbnN0IGJ0X3N0YXR1c190IHN0YXR1cyk7Ci0KLWNvbnN0IGNoYXIqIEJ0UHJvcGVydHlUZXh0KGNvbnN0IGJ0X3Byb3BlcnR5X3R5cGVfdCBwcm9wKTsKLQotY29uc3QgY2hhciogQnRFdmVudFRleHQoY29uc3QgYnRfY2JfdGhyZWFkX2V2dCBldnQpOwotCi1jb25zdCBjaGFyKiBCdEFjbFRleHQoY29uc3QgYnRfYWNsX3N0YXRlX3Qgc3RhdGUpOwotCi0vLyBUT0RPKGljb29saWRnZSk6IEFkZHJlc3Mgb2JqZWN0Lgotc3RkOjpzdHJpbmcgQnRBZGRyU3RyaW5nKGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZS9sb3dfZW5lcmd5X2FkdmVydGlzZXIuY2MgYi9zZXJ2aWNlL2xvd19lbmVyZ3lfYWR2ZXJ0aXNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3MDI5Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2xvd19lbmVyZ3lfYWR2ZXJ0aXNlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvbG93X2VuZXJneV9hZHZlcnRpc2VyLmgiCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotCi11c2luZyBzdGQ6OmxvY2tfZ3VhcmQ7Ci11c2luZyBzdGQ6Om11dGV4OwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIHsKLQotQkxFU3RhdHVzIEdldEJMRVN0YXR1cyhpbnQgc3RhdHVzKSB7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX0ZBSUwpIHJldHVybiBCTEVfU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PEJMRVN0YXR1cz4oc3RhdHVzKTsKLX0KLQotLy8gVGhlIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24gZGVmaW5lcyB0aW1lIGludGVydmFsIChlLmcuIFBhZ2UgU2NhbgotLy8gSW50ZXJ2YWwsIEFkdmVydGlzaW5nIEludGVydmFsLCBldGMpIHVuaXRzIGFzIDAuNjI1IG1pbGxpc2Vjb25kcyAob3IgMQotLy8gQmFzZWJhbmQgc2xvdCkuIFRoZSBIQUwgYWR2ZXJ0aXNpbmcgZnVuY3Rpb25zIGV4cGVjdCB0aGUgaW50ZXJ2YWwgaW4gdGhpcwotLy8gdW5pdC4gVGhpcyBmdW5jdGlvbiBtYXBzIGFuIEFkdmVydGlzZVNldHRpbmdzOjpNb2RlIHZhbHVlIHRvIHRoZQotLy8gY29ycmVzcG9uZGluZyB0aW1lIHVuaXQuCi1pbnQgR2V0QWR2ZXJ0aXNpbmdJbnRlcnZhbFVuaXQoQWR2ZXJ0aXNlU2V0dGluZ3M6Ok1vZGUgbW9kZSkgewotICBpbnQgbXM7Ci0KLSAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBBZHZlcnRpc2VTZXR0aW5nczo6TU9ERV9CQUxBTkNFRDoKLSAgICAgIG1zID0ga0FkdmVydGlzaW5nSW50ZXJ2YWxNZWRpdW1NczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWR2ZXJ0aXNlU2V0dGluZ3M6Ok1PREVfTE9XX0xBVEVOQ1k6Ci0gICAgICBtcyA9IGtBZHZlcnRpc2luZ0ludGVydmFsTG93TXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFkdmVydGlzZVNldHRpbmdzOjpNT0RFX0xPV19QT1dFUjoKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBtcyA9IGtBZHZlcnRpc2luZ0ludGVydmFsSGlnaE1zOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBCbHVldG9vdGggdW5pdHMuCi0gIHJldHVybiAobXMgKiAxMDAwKSAvIDYyNTsKLX0KLQotaW50OF90IEdldEFkdmVydGlzaW5nVHhQb3dlcihBZHZlcnRpc2VTZXR0aW5nczo6VHhQb3dlckxldmVsIHR4X3Bvd2VyKSB7Ci0gIGludDhfdCBwb3dlcjsKLQotICBzd2l0Y2ggKHR4X3Bvd2VyKSB7Ci0gICAgY2FzZSBBZHZlcnRpc2VTZXR0aW5nczo6VFhfUE9XRVJfTEVWRUxfVUxUUkFfTE9XOgotICAgICAgcG93ZXIgPSAtMjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFkdmVydGlzZVNldHRpbmdzOjpUWF9QT1dFUl9MRVZFTF9MT1c6Ci0gICAgICBwb3dlciA9IC0xNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQWR2ZXJ0aXNlU2V0dGluZ3M6OlRYX1BPV0VSX0xFVkVMX01FRElVTToKLSAgICAgIHBvd2VyID0gLTc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFkdmVydGlzZVNldHRpbmdzOjpUWF9QT1dFUl9MRVZFTF9ISUdIOgotICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHBvd2VyID0gMTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHBvd2VyOwotfQotCi12b2lkIEdldEFkdmVydGlzZVBhcmFtcyhjb25zdCBBZHZlcnRpc2VTZXR0aW5ncyYgc2V0dGluZ3MsIGJvb2wgaGFzX3NjYW5fcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlUGFyYW1ldGVycyogb3V0X3BhcmFtcykgewotICBDSEVDSyhvdXRfcGFyYW1zKTsKLQotICBvdXRfcGFyYW1zLT5taW5faW50ZXJ2YWwgPSBHZXRBZHZlcnRpc2luZ0ludGVydmFsVW5pdChzZXR0aW5ncy5tb2RlKCkpOwotICBvdXRfcGFyYW1zLT5tYXhfaW50ZXJ2YWwgPQotICAgICAgb3V0X3BhcmFtcy0+bWluX2ludGVydmFsICsga0FkdmVydGlzaW5nSW50ZXJ2YWxEZWx0YVVuaXQ7Ci0KLSAgaWYgKHNldHRpbmdzLmNvbm5lY3RhYmxlKCkpCi0gICAgb3V0X3BhcmFtcy0+YWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyA9Ci0gICAgICAgIGtBZHZlcnRpc2luZ0V2ZW50VHlwZUxlZ2FjeUNvbm5lY3RhYmxlOwotICBlbHNlIGlmIChoYXNfc2Nhbl9yc3ApCi0gICAgb3V0X3BhcmFtcy0+YWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyA9Ci0gICAgICAgIGtBZHZlcnRpc2luZ0V2ZW50VHlwZUxlZ2FjeVNjYW5uYWJsZTsKLSAgZWxzZQotICAgIG91dF9wYXJhbXMtPmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgPQotICAgICAgICBrQWR2ZXJ0aXNpbmdFdmVudFR5cGVMZWdhY3lOb25Db25uZWN0YWJsZTsKLQotICBvdXRfcGFyYW1zLT5jaGFubmVsX21hcCA9IGtBZHZlcnRpc2luZ0NoYW5uZWxBbGw7Ci0gIG91dF9wYXJhbXMtPnR4X3Bvd2VyID0gR2V0QWR2ZXJ0aXNpbmdUeFBvd2VyKHNldHRpbmdzLnR4X3Bvd2VyX2xldmVsKCkpOwotCi0gIC8vIFRPRE86IGV4cG9zZSB0aG9zZSBuZXcgc2V0dGluZyB0aHJvdWdoIEFkdmVydGlzZVNldHRpbmdzCi0gIG91dF9wYXJhbXMtPnByaW1hcnlfYWR2ZXJ0aXNpbmdfcGh5ID0gMHgwMTsKLSAgb3V0X3BhcmFtcy0+c2Vjb25kYXJ5X2FkdmVydGlzaW5nX3BoeSA9IDB4MDE7Ci0gIG91dF9wYXJhbXMtPnNjYW5fcmVxdWVzdF9ub3RpZmljYXRpb25fZW5hYmxlID0gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIExvd0VuZXJneUFkdmVydGlzZXIgaW1wbGVtZW50YXRpb24KLQotTG93RW5lcmd5QWR2ZXJ0aXNlcjo6TG93RW5lcmd5QWR2ZXJ0aXNlcihjb25zdCBVdWlkJiB1dWlkLCBpbnQgYWR2ZXJ0aXNlcl9pZCkKLSAgICA6IGFwcF9pZGVudGlmaWVyXyh1dWlkKSwKLSAgICAgIGFkdmVydGlzZXJfaWRfKGFkdmVydGlzZXJfaWQpLAotICAgICAgYWR2X3N0YXJ0ZWRfKGZhbHNlKSwKLSAgICAgIGFkdl9zdGFydF9jYWxsYmFja18obnVsbHB0ciksCi0gICAgICBhZHZfc3RvcF9jYWxsYmFja18obnVsbHB0cikge30KLQotTG93RW5lcmd5QWR2ZXJ0aXNlcjo6fkxvd0VuZXJneUFkdmVydGlzZXIoKSB7Ci0gIC8vIEF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciB0aGUgYWR2ZXJ0aXNlci4KLSAgVkxPRygxKSA8PCAiTG93RW5lcmd5QWR2ZXJ0aXNlciB1bnJlZ2lzdGVyaW5nIGFkdmVydGlzZXI6ICIgPDwgYWR2ZXJ0aXNlcl9pZF87Ci0KLSAgLy8gU3RvcCBhZHZlcnRpc2luZyBhbmQgaWdub3JlIHRoZSByZXN1bHQuCi0gIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkdldEFkdmVydGlzZXJIQUxJbnRlcmZhY2UoKS0+RW5hYmxlKAotICAgICAgYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlLCBiYXNlOjpEb05vdGhpbmcoKSwgMCwgMCwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5HZXRBZHZlcnRpc2VySEFMSW50ZXJmYWNlKCktPlVucmVnaXN0ZXIoCi0gICAgICBhZHZlcnRpc2VyX2lkXyk7Ci19Ci0KLWJvb2wgTG93RW5lcmd5QWR2ZXJ0aXNlcjo6U3RhcnRBZHZlcnRpc2luZyhjb25zdCBBZHZlcnRpc2VTZXR0aW5ncyYgc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWR2ZXJ0aXNlRGF0YSYgYWR2ZXJ0aXNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWR2ZXJ0aXNlRGF0YSYgc2Nhbl9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhhZHZfZmllbGRzX2xvY2tfKTsKLQotICBpZiAoSXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQWxyZWFkeSBhZHZlcnRpc2luZyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKElzU3RhcnRpbmdBZHZlcnRpc2luZygpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJTdGFydEFkdmVydGlzaW5nIGFscmVhZHkgcGVuZGluZyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFhZHZlcnRpc2VfZGF0YS5Jc1ZhbGlkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGFkdmVydGlzaW5nIGRhdGEiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghc2Nhbl9yZXNwb25zZS5Jc1ZhbGlkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHNjYW4gcmVzcG9uc2UgZGF0YSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYWR2ZXJ0aXNlX3NldHRpbmdzXyA9IHNldHRpbmdzOwotCi0gIEFkdmVydGlzZVBhcmFtZXRlcnMgcGFyYW1zOwotICBHZXRBZHZlcnRpc2VQYXJhbXMoc2V0dGluZ3MsICFzY2FuX3Jlc3BvbnNlLmRhdGEoKS5lbXB0eSgpLCAmcGFyYW1zKTsKLQotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpCi0gICAgICAtPkdldEFkdmVydGlzZXJIQUxJbnRlcmZhY2UoKQotICAgICAgLT5TdGFydEFkdmVydGlzaW5nKAotICAgICAgICAgIGFkdmVydGlzZXJfaWRfLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkxvd0VuZXJneUFkdmVydGlzZXI6OkVuYWJsZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgdHJ1ZSwgYWR2ZXJ0aXNlcl9pZF8pLAotICAgICAgICAgIHBhcmFtcywgYWR2ZXJ0aXNlX2RhdGEuZGF0YSgpLCBzY2FuX3Jlc3BvbnNlLmRhdGEoKSwKLSAgICAgICAgICBzZXR0aW5ncy50aW1lb3V0KCkuSW5TZWNvbmRzKCksCi0gICAgICAgICAgYmFzZTo6QmluZCgmTG93RW5lcmd5QWR2ZXJ0aXNlcjo6RW5hYmxlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBmYWxzZSwgYWR2ZXJ0aXNlcl9pZF8pKTsKLSAgOwotCi0gIGFkdl9zdGFydF9jYWxsYmFja18ucmVzZXQobmV3IFN0YXR1c0NhbGxiYWNrKGNhbGxiYWNrKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExvd0VuZXJneUFkdmVydGlzZXI6OlN0b3BBZHZlcnRpc2luZyhjb25zdCBTdGF0dXNDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhhZHZfZmllbGRzX2xvY2tfKTsKLQotICBpZiAoIUlzQWR2ZXJ0aXNpbmdTdGFydGVkKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJOb3QgYWR2ZXJ0aXNpbmciOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChJc1N0b3BwaW5nQWR2ZXJ0aXNpbmcoKSkgewotICAgIExPRyhFUlJPUikgPDwgIlN0b3BBZHZlcnRpc2luZyBhbHJlYWR5IHBlbmRpbmciOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkdldEFkdmVydGlzZXJIQUxJbnRlcmZhY2UoKS0+RW5hYmxlKAotICAgICAgYWR2ZXJ0aXNlcl9pZF8sIGZhbHNlLAotICAgICAgYmFzZTo6QmluZCgmTG93RW5lcmd5QWR2ZXJ0aXNlcjo6RW5hYmxlQ2FsbGJhY2ssIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgICAgIGZhbHNlLCBhZHZlcnRpc2VyX2lkXyksCi0gICAgICAwLCAwLCBiYXNlOjpCaW5kKCZMb3dFbmVyZ3lBZHZlcnRpc2VyOjpFbmFibGVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgZmFsc2UsIGFkdmVydGlzZXJfaWRfKSk7Ci0KLSAgLy8gT0sgdG8gc2V0IHRoaXMgYXQgdGhlIGVuZCBzaW5jZSB3ZSdyZSBzdGlsbCBob2xkaW5nIHxhZHZfZmllbGRzX2xvY2tffC4KLSAgYWR2X3N0b3BfY2FsbGJhY2tfLnJlc2V0KG5ldyBTdGF0dXNDYWxsYmFjayhjYWxsYmFjaykpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExvd0VuZXJneUFkdmVydGlzZXI6OklzQWR2ZXJ0aXNpbmdTdGFydGVkKCkgY29uc3QgewotICByZXR1cm4gYWR2X3N0YXJ0ZWRfLmxvYWQoKTsKLX0KLQotYm9vbCBMb3dFbmVyZ3lBZHZlcnRpc2VyOjpJc1N0YXJ0aW5nQWR2ZXJ0aXNpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAhSXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSAmJiBhZHZfc3RhcnRfY2FsbGJhY2tfOwotfQotCi1ib29sIExvd0VuZXJneUFkdmVydGlzZXI6OklzU3RvcHBpbmdBZHZlcnRpc2luZygpIGNvbnN0IHsKLSAgcmV0dXJuIElzQWR2ZXJ0aXNpbmdTdGFydGVkKCkgJiYgYWR2X3N0b3BfY2FsbGJhY2tfOwotfQotCi1jb25zdCBVdWlkJiBMb3dFbmVyZ3lBZHZlcnRpc2VyOjpHZXRBcHBJZGVudGlmaWVyKCkgY29uc3QgewotICByZXR1cm4gYXBwX2lkZW50aWZpZXJfOwotfQotCi1pbnQgTG93RW5lcmd5QWR2ZXJ0aXNlcjo6R2V0SW5zdGFuY2VJZCgpIGNvbnN0IHsgcmV0dXJuIGFkdmVydGlzZXJfaWRfOyB9Ci0KLXZvaWQgTG93RW5lcmd5QWR2ZXJ0aXNlcjo6RW5hYmxlQ2FsbGJhY2soYm9vbCBlbmFibGUsIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgaWYgKGFkdmVydGlzZXJfaWQgIT0gYWR2ZXJ0aXNlcl9pZF8pIHJldHVybjsKLQotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKGFkdl9maWVsZHNfbG9ja18pOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgImFkdmVydGlzZXJfaWQ6ICIgPDwgYWR2ZXJ0aXNlcl9pZAotICAgICAgICAgIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1cyA8PCAiIGVuYWJsZTogIiA8PCBlbmFibGU7Ci0KLSAgaWYgKGVuYWJsZSkgewotICAgIENIRUNLKGFkdl9zdGFydF9jYWxsYmFja18pOwotICAgIENIRUNLKCFhZHZfc3RvcF9jYWxsYmFja18pOwotCi0gICAgLy8gVGVybWluYXRlIG9wZXJhdGlvbiBpbiBjYXNlIG9mIGVycm9yLgotICAgIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBlbmFibGUgbXVsdGktYWR2ZXJ0aXNpbmciOwotICAgICAgSW52b2tlQW5kQ2xlYXJTdGFydENhbGxiYWNrKEdldEJMRVN0YXR1cyhzdGF0dXMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBBbGwgcGVuZGluZyB0YXNrcyBhcmUgY29tcGxldGUuIFJlcG9ydCBzdWNjZXNzLgotICAgIGFkdl9zdGFydGVkXyA9IHRydWU7Ci0gICAgSW52b2tlQW5kQ2xlYXJTdGFydENhbGxiYWNrKEJMRV9TVEFUVVNfU1VDQ0VTUyk7Ci0KLSAgfSBlbHNlIHsKLSAgICBDSEVDSyghYWR2X3N0YXJ0X2NhbGxiYWNrXyk7Ci0gICAgQ0hFQ0soYWR2X3N0b3BfY2FsbGJhY2tfKTsKLQotICAgIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgIFZMT0coMSkgPDwgIk11bHRpLWFkdmVydGlzaW5nIHN0b3BwZWQgZm9yIGFkdmVydGlzZXJfaWQ6ICIKLSAgICAgICAgICAgICAgPDwgYWR2ZXJ0aXNlcl9pZDsKLSAgICAgIGFkdl9zdGFydGVkXyA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc3RvcCBtdWx0aS1hZHZlcnRpc2luZyI7Ci0gICAgfQotCi0gICAgSW52b2tlQW5kQ2xlYXJTdG9wQ2FsbGJhY2soR2V0QkxFU3RhdHVzKHN0YXR1cykpOwotICB9Ci19Ci0KLXZvaWQgTG93RW5lcmd5QWR2ZXJ0aXNlcjo6SW52b2tlQW5kQ2xlYXJTdGFydENhbGxiYWNrKEJMRVN0YXR1cyBzdGF0dXMpIHsKLSAgLy8gV2UgYWxsb3cgTlVMTCBjYWxsYmFja3MuCi0gIGlmICgqYWR2X3N0YXJ0X2NhbGxiYWNrXykgKCphZHZfc3RhcnRfY2FsbGJhY2tfKShzdGF0dXMpOwotCi0gIGFkdl9zdGFydF9jYWxsYmFja18gPSBudWxscHRyOwotfQotCi12b2lkIExvd0VuZXJneUFkdmVydGlzZXI6Okludm9rZUFuZENsZWFyU3RvcENhbGxiYWNrKEJMRVN0YXR1cyBzdGF0dXMpIHsKLSAgLy8gV2UgYWxsb3cgTlVMTCBjYWxsYmFja3MuCi0gIGlmICgqYWR2X3N0b3BfY2FsbGJhY2tfKSAoKmFkdl9zdG9wX2NhbGxiYWNrXykoc3RhdHVzKTsKLQotICBhZHZfc3RvcF9jYWxsYmFja18gPSBudWxscHRyOwotfQotCi0vLyBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotCi1Mb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeTo6TG93RW5lcmd5QWR2ZXJ0aXNlckZhY3RvcnkoKSB7fQotCi1Mb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeTo6fkxvd0VuZXJneUFkdmVydGlzZXJGYWN0b3J5KCkge30KLQotYm9vbCBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeTo6UmVnaXN0ZXJJbnN0YW5jZSgKLSAgICBjb25zdCBVdWlkJiBhcHBfdXVpZCwgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhwZW5kaW5nX2NhbGxzX2xvY2tfKTsKLQotICBpZiAocGVuZGluZ19jYWxsc18uZmluZChhcHBfdXVpZCkgIT0gcGVuZGluZ19jYWxsc18uZW5kKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJMb3ctRW5lcmd5IGFkdmVydGlzZXIgd2l0aCBnaXZlbiBVdWlkIGFscmVhZHkgcmVnaXN0ZXJlZCAtICIKLSAgICAgICAgICAgICAgIDw8ICJVdWlkOiAiIDw8IGFwcF91dWlkLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQmxlQWR2ZXJ0aXNlckludGVyZmFjZSogaGFsX2lmYWNlID0KLSAgICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkdldEFkdmVydGlzZXJIQUxJbnRlcmZhY2UoKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgY2FsbGluZyByZWdpc3RlciEiOwotICBoYWxfaWZhY2UtPlJlZ2lzdGVyQWR2ZXJ0aXNlcigKLSAgICAgIGJhc2U6OkJpbmQoJkxvd0VuZXJneUFkdmVydGlzZXJGYWN0b3J5OjpSZWdpc3RlckFkdmVydGlzZXJDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2FsbGJhY2ssIGFwcF91dWlkKSk7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBjYWxsIGZpbmlzaGVkISI7Ci0KLSAgcGVuZGluZ19jYWxsc18uaW5zZXJ0KGFwcF91dWlkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeTo6UmVnaXN0ZXJBZHZlcnRpc2VyQ2FsbGJhY2soCi0gICAgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2ssIGNvbnN0IFV1aWQmIGFwcF91dWlkLAotICAgIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhwZW5kaW5nX2NhbGxzX2xvY2tfKTsKLQotICBhdXRvIGl0ZXIgPSBwZW5kaW5nX2NhbGxzXy5maW5kKGFwcF91dWlkKTsKLSAgaWYgKGl0ZXIgPT0gcGVuZGluZ19jYWxsc18uZW5kKCkpIHsKLSAgICBWTE9HKDEpIDw8ICJJZ25vcmluZyBjYWxsYmFjayBmb3IgdW5rbm93biBhcHBfaWQ6ICIgPDwgYXBwX3V1aWQuVG9TdHJpbmcoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBObyBuZWVkIHRvIGNvbnN0cnVjdCBhIGFkdmVydGlzZXIgaWYgdGhlIGNhbGwgd2Fzbid0IHN1Y2Nlc3NmdWwuCi0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lBZHZlcnRpc2VyPiBhZHZlcnRpc2VyOwotICBCTEVTdGF0dXMgcmVzdWx0ID0gQkxFX1NUQVRVU19GQUlMVVJFOwotICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgYWR2ZXJ0aXNlci5yZXNldChuZXcgTG93RW5lcmd5QWR2ZXJ0aXNlcihhcHBfdXVpZCwgYWR2ZXJ0aXNlcl9pZCkpOwotCi0gICAgcmVzdWx0ID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICB9Ci0KLSAgLy8gTm90aWZ5IHRoZSByZXN1bHQgdmlhIHRoZSByZXN1bHQgY2FsbGJhY2suCi0gIGNhbGxiYWNrKHJlc3VsdCwgYXBwX3V1aWQsIHN0ZDo6bW92ZShhZHZlcnRpc2VyKSk7Ci0KLSAgcGVuZGluZ19jYWxsc18uZXJhc2UoaXRlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvbG93X2VuZXJneV9hZHZlcnRpc2VyLmggYi9zZXJ2aWNlL2xvd19lbmVyZ3lfYWR2ZXJ0aXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzBkZDc0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvbG93X2VuZXJneV9hZHZlcnRpc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotCi0jaW5jbHVkZSAic2VydmljZS9ibHVldG9vdGhfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fZmlsdGVyLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fcmVzdWx0LmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLWNsYXNzIEFkYXB0ZXI7Ci0KLS8vIEEgTG93RW5lcmd5QWR2ZXJ0aXNlciByZXByZXNlbnRzIGFuIGFwcGxpY2F0aW9uJ3MgaGFuZGxlIHRvIHBlcmZvcm0gdmFyaW91cwotLy8gQmx1ZXRvb3RoIExvdyBFbmVyZ3kgR0FQIG9wZXJhdGlvbnMuIEluc3RhbmNlcyBjYW5ub3QgYmUgY3JlYXRlZCBkaXJlY3RseSBhbmQKLS8vIHNob3VsZCBiZSBvYnRhaW5lZCB0aHJvdWdoIHRoZSBmYWN0b3J5LgotY2xhc3MgTG93RW5lcmd5QWR2ZXJ0aXNlciA6IHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZSB7Ci0gcHVibGljOgotICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHVucmVnaXN0ZXJzIHRoaXMgY2xpZW50IGluc3RhbmNlIGZyb20gdGhlCi0gIC8vIHN0YWNrLgotICB+TG93RW5lcmd5QWR2ZXJ0aXNlcigpIG92ZXJyaWRlOwotCi0gIC8vIENhbGxiYWNrIHR5cGUgdXNlZCB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBiZWxvdy4KLSAgdXNpbmcgU3RhdHVzQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQkxFU3RhdHVzKT47Ci0KLSAgLy8gU3RhcnRzIGFkdmVydGlzaW5nIGJhc2VkIG9uIHRoZSBnaXZlbiBhZHZlcnRpc2luZyBhbmQgc2NhbiByZXNwb25zZQotICAvLyBkYXRhIGFuZCB0aGUgcHJvdmlkZWQgfHNldHRpbmdzfC4gUmVwb3J0cyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gaW4KLSAgLy8gfGNhbGxiYWNrfC4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLiBQbGVhc2Ugc2VlIGxvZ3MgZm9yCi0gIC8vIGRldGFpbHMgaW4gY2FzZSBvZiBlcnJvci4KLSAgYm9vbCBTdGFydEFkdmVydGlzaW5nKGNvbnN0IEFkdmVydGlzZVNldHRpbmdzJiBzZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFkdmVydGlzZURhdGEmIGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWR2ZXJ0aXNlRGF0YSYgc2Nhbl9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c0NhbGxiYWNrJiBjYWxsYmFjayk7Ci0KLSAgLy8gU3RvcHMgYWR2ZXJ0aXNpbmcgaWYgaXQgd2FzIGFscmVhZHkgc3RhcnRlZC4gUmVwb3J0cyB0aGUgcmVzdWx0IG9mIHRoZQotICAvLyBvcGVyYXRpb24gaW4gfGNhbGxiYWNrfC4KLSAgYm9vbCBTdG9wQWR2ZXJ0aXNpbmcoY29uc3QgU3RhdHVzQ2FsbGJhY2smIGNhbGxiYWNrKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYWR2ZXJ0aXNpbmcgaGFzIGJlZW4gc3RhcnRlZC4KLSAgYm9vbCBJc0FkdmVydGlzaW5nU3RhcnRlZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIHN0YXRlIG9mIHBlbmRpbmcgYWR2ZXJ0aXNpbmcgb3BlcmF0aW9ucy4KLSAgYm9vbCBJc1N0YXJ0aW5nQWR2ZXJ0aXNpbmcoKSBjb25zdDsKLSAgYm9vbCBJc1N0b3BwaW5nQWR2ZXJ0aXNpbmcoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFkdmVydGlzaW5nIHNldHRpbmdzLgotICBjb25zdCBBZHZlcnRpc2VTZXR0aW5ncyYgYWR2ZXJ0aXNlX3NldHRpbmdzKCkgY29uc3QgewotICAgIHJldHVybiBhZHZlcnRpc2Vfc2V0dGluZ3NfOwotICB9Ci0KLSAgLy8gQmx1ZXRvb3RoQ2xpZW50SW5zdGFjZSBvdmVycmlkZXM6Ci0gIGNvbnN0IFV1aWQmIEdldEFwcElkZW50aWZpZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50IEdldEluc3RhbmNlSWQoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeTsKLQotICAvLyBDb25zdHJ1Y3RvciBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGFzIGluc3RhbmNlcyBhcmUgbWVhbnQgdG8gYmUKLSAgLy8gb2J0YWluZWQgZnJvbSB0aGUgZmFjdG9yeS4KLSAgTG93RW5lcmd5QWR2ZXJ0aXNlcihjb25zdCBVdWlkJiB1dWlkLCBpbnQgYWR2ZXJ0aXNlcl9pZCk7Ci0KLSAgLy8gQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6QWR2ZXJ0aXNlck9ic2VydmVyIG92ZXJyaWRlczoKLSAgdm9pZCBTZXREYXRhQ2FsbGJhY2sodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cyk7Ci0gIHZvaWQgU2V0UGFyYW1zQ2FsbGJhY2sodWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cyk7Ci0gIHZvaWQgRW5hYmxlQ2FsbGJhY2soYm9vbCBlbmFibGUsIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgdWludDhfdCBzdGF0dXMpOwotCi0gIC8vIENhbGxzIGFuZCBjbGVhcnMgdGhlIHBlbmRpbmcgY2FsbGJhY2tzLgotICB2b2lkIEludm9rZUFuZENsZWFyU3RhcnRDYWxsYmFjayhCTEVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBJbnZva2VBbmRDbGVhclN0b3BDYWxsYmFjayhCTEVTdGF0dXMgc3RhdHVzKTsKLQotICAvLyBTZWUgZ2V0dGVycyBhYm92ZSBmb3IgZG9jdW1lbnRhdGlvbi4KLSAgVXVpZCBhcHBfaWRlbnRpZmllcl87Ci0gIGludCBhZHZlcnRpc2VyX2lkXzsKLQotICAvLyBQcm90ZWN0cyBhZHZlcnRpc2luZy1yZWxhdGVkIG1lbWJlcnMgYmVsb3cuCi0gIHN0ZDo6bXV0ZXggYWR2X2ZpZWxkc19sb2NrXzsKLQotICAvLyBMYXRlc3QgYWR2ZXJ0aXNpbmcgc2V0dGluZ3MuCi0gIEFkdmVydGlzZVNldHRpbmdzIGFkdmVydGlzZV9zZXR0aW5nc187Ci0KLSAgc3RkOjphdG9taWNfYm9vbCBhZHZfc3RhcnRlZF87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNDYWxsYmFjaz4gYWR2X3N0YXJ0X2NhbGxiYWNrXzsKLSAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c0NhbGxiYWNrPiBhZHZfc3RvcF9jYWxsYmFja187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvd0VuZXJneUFkdmVydGlzZXIpOwotfTsKLQotLy8gTG93RW5lcmd5QWR2ZXJ0aXNlckZhY3RvcnkgaXMgdXNlZCB0byByZWdpc3RlciBhbmQgb2J0YWluIGEgcGVyLWFwcGxpY2F0aW9uCi0vLyBMb3dFbmVyZ3lBZHZlcnRpc2VyIGluc3RhbmNlLiBVc2VycyBzaG91bGQgY2FsbCBSZWdpc3Rlckluc3RhbmNlIHRvIG9idGFpbgotLy8gdGhlaXIKLS8vIG93biB1bmlxdWUgTG93RW5lcmd5QWR2ZXJ0aXNlciBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUKLS8vIEJsdWV0b290aCBzdGFjay4KLWNsYXNzIExvd0VuZXJneUFkdmVydGlzZXJGYWN0b3J5IDogcHVibGljIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSB7Ci0gcHVibGljOgotICAvLyBEb24ndCBjb25zdHJ1Y3QvZGVzdHJ1Y3QgZGlyZWN0bHkgZXhjZXB0IGluIHRlc3RzLiBJbnN0ZWFkLCBvYnRhaW4gYSBoYW5kbGUKLSAgLy8gZnJvbSBhbiBBZGFwdGVyIGluc3RhbmNlLgotICBleHBsaWNpdCBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSgpOwotICB+TG93RW5lcmd5QWR2ZXJ0aXNlckZhY3RvcnkoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhJbnN0YW5jZUZhY3Rvcnkgb3ZlcnJpZGU6Ci0gIGJvb2wgUmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBMb3dFbmVyZ3lBZHZlcnRpc2VyOwotCi0gIC8vIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkFkdmVydGlzZXJPYnNlcnZlciBvdmVycmlkZXM6Ci0gIHZvaWQgUmVnaXN0ZXJBZHZlcnRpc2VyQ2FsbGJhY2soY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgYXBwX3V1aWQsIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cyk7Ci0KLSAgLy8gTWFwIG9mIHBlbmRpbmcgY2FsbHMgdG8gcmVnaXN0ZXIuCi0gIHN0ZDo6bXV0ZXggcGVuZGluZ19jYWxsc19sb2NrXzsKLSAgc3RkOjp1bm9yZGVyZWRfc2V0PFV1aWQ+IHBlbmRpbmdfY2FsbHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2xvd19lbmVyZ3lfY2xpZW50LmNjIGIvc2VydmljZS9sb3dfZW5lcmd5X2NsaWVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhNzZmOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2xvd19lbmVyZ3lfY2xpZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9sb3dfZW5lcmd5X2NsaWVudC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBzdGQ6OmxvY2tfZ3VhcmQ7Ci11c2luZyBzdGQ6Om11dGV4OwotCi1jb25zdGV4cHIgaW50IGtQaHlMZTFNYk1hc2sgPSAxOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gTG93RW5lcmd5Q2xpZW50IGltcGxlbWVudGF0aW9uCi0KLUxvd0VuZXJneUNsaWVudDo6TG93RW5lcmd5Q2xpZW50KEFkYXB0ZXImIGFkYXB0ZXIsIGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50X2lkKQotICAgIDogYWRhcHRlcl8oYWRhcHRlciksCi0gICAgICBhcHBfaWRlbnRpZmllcl8odXVpZCksCi0gICAgICBjbGllbnRfaWRfKGNsaWVudF9pZCksCi0gICAgICBkZWxlZ2F0ZV8obnVsbHB0cikge30KLQotTG93RW5lcmd5Q2xpZW50Ojp+TG93RW5lcmd5Q2xpZW50KCkgewotICAvLyBBdXRvbWF0aWNhbGx5IHVucmVnaXN0ZXIgdGhlIGNsaWVudC4KLSAgVkxPRygxKSA8PCAiTG93RW5lcmd5Q2xpZW50IHVucmVnaXN0ZXJpbmcgY2xpZW50OiAiIDw8IGNsaWVudF9pZF87Ci0KLSAgLy8gVW5yZWdpc3RlciBhcyBvYnNlcnZlciBzbyB3ZSBubyBsb25nZXIgcmVjZWl2ZSBhbnkgY2FsbGJhY2tzLgotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5SZW1vdmVDbGllbnRPYnNlcnZlcih0aGlzKTsKLQotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpCi0gICAgICAtPkdldENsaWVudEhBTEludGVyZmFjZSgpCi0gICAgICAtPnVucmVnaXN0ZXJfY2xpZW50KGNsaWVudF9pZF8pOwotfQotCi1ib29sIExvd0VuZXJneUNsaWVudDo6Q29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgYm9vbCBpc19kaXJlY3QpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiQWRkcmVzczogIiA8PCBhZGRyZXNzIDw8ICIgaXNfZGlyZWN0OiAiIDw8IGlzX2RpcmVjdDsKLQotICBSYXdBZGRyZXNzIGJkYTsKLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyhhZGRyZXNzLCBiZGEpOwotCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9Ci0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5HZXRDbGllbnRIQUxJbnRlcmZhY2UoKS0+Y29ubmVjdCgKLSAgICAgICAgICBjbGllbnRfaWRfLCBiZGEsIGlzX2RpcmVjdCwgQlRfVFJBTlNQT1JUX0xFLCBmYWxzZSwga1BoeUxlMU1iTWFzayk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8ICJIQUwgY2FsbCB0byBjb25uZWN0IGZhaWxlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTG93RW5lcmd5Q2xpZW50OjpEaXNjb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIkFkZHJlc3M6ICIgPDwgYWRkcmVzczsKLQotICBSYXdBZGRyZXNzIGJkYTsKLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyhhZGRyZXNzLCBiZGEpOwotCi0gIHN0ZDo6bWFwPGNvbnN0IFJhd0FkZHJlc3MsIGludD46Oml0ZXJhdG9yIGNvbm5faWQ7Ci0gIHsKLSAgICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKGNvbm5lY3Rpb25fZmllbGRzX2xvY2tfKTsKLSAgICBjb25uX2lkID0gY29ubmVjdGlvbl9pZHNfLmZpbmQoYmRhKTsKLSAgICBpZiAoY29ubl9pZCA9PSBjb25uZWN0aW9uX2lkc18uZW5kKCkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FuJ3QgZGlzY29ubmVjdCwgbm8gZXhpc3RpbmcgY29ubmVjdGlvbiB0byAiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgYnRfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkdldENsaWVudEhBTEludGVyZmFjZSgpLT5kaXNjb25uZWN0KAotICAgICAgICAgIGNsaWVudF9pZF8sIGJkYSwgY29ubl9pZC0+c2Vjb25kKTsKLSAgaWYgKHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgIkhBTCBjYWxsIHRvIGRpc2Nvbm5lY3QgZmFpbGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBMb3dFbmVyZ3lDbGllbnQ6OlNldE10dShjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IG10dSkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICJBZGRyZXNzOiAiIDw8IGFkZHJlc3MgPDwgIiBNVFU6ICIgPDwgbXR1OwotCi0gIFJhd0FkZHJlc3MgYmRhOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGFkZHJlc3MsIGJkYSk7Ci0KLSAgc3RkOjptYXA8Y29uc3QgUmF3QWRkcmVzcywgaW50Pjo6aXRlcmF0b3IgY29ubl9pZDsKLSAgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2soY29ubmVjdGlvbl9maWVsZHNfbG9ja18pOwotICAgIGNvbm5faWQgPSBjb25uZWN0aW9uX2lkc18uZmluZChiZGEpOwotICAgIGlmIChjb25uX2lkID09IGNvbm5lY3Rpb25faWRzXy5lbmQoKSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYW4ndCBzZXQgTVRVLCBubyBleGlzdGluZyBjb25uZWN0aW9uIHRvICIgPDwgYWRkcmVzczsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBidF9zdGF0dXNfdCBzdGF0dXMgPSBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldENsaWVudEhBTEludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbmZpZ3VyZV9tdHUoY29ubl9pZC0+c2Vjb25kLCBtdHUpOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiSEFMIGNhbGwgdG8gc2V0IE1UVSBmYWlsZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIExvd0VuZXJneUNsaWVudDo6U2V0RGVsZWdhdGUoRGVsZWdhdGUqIGRlbGVnYXRlKSB7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2soZGVsZWdhdGVfbXV0ZXhfKTsKLSAgZGVsZWdhdGVfID0gZGVsZWdhdGU7Ci19Ci0KLWNvbnN0IFV1aWQmIExvd0VuZXJneUNsaWVudDo6R2V0QXBwSWRlbnRpZmllcigpIGNvbnN0IHsKLSAgcmV0dXJuIGFwcF9pZGVudGlmaWVyXzsKLX0KLQotaW50IExvd0VuZXJneUNsaWVudDo6R2V0SW5zdGFuY2VJZCgpIGNvbnN0IHsgcmV0dXJuIGNsaWVudF9pZF87IH0KLQotdm9pZCBMb3dFbmVyZ3lDbGllbnQ6OkNvbm5lY3RDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgaWYgKGNsaWVudF9pZCAhPSBjbGllbnRfaWRfKSByZXR1cm47Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiY2xpZW50X2lkOiAiIDw8IGNsaWVudF9pZCA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0KLSAgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2soY29ubmVjdGlvbl9maWVsZHNfbG9ja18pOwotICAgIGF1dG8gc3VjY2VzcyA9IGNvbm5lY3Rpb25faWRzXy5lbXBsYWNlKGJkYSwgY29ubl9pZCk7Ci0gICAgaWYgKCFzdWNjZXNzLnNlY29uZCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIEluc2VydGlvbiBpbnRvIGNvbm5lY3Rpb25faWRzXyBmYWlsZWQhIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZGVsZWdhdGVfKQotICAgIGRlbGVnYXRlXy0+T25Db25uZWN0aW9uU3RhdGUodGhpcywgc3RhdHVzLCBCdEFkZHJTdHJpbmcoJmJkYSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotfQotCi12b2lkIExvd0VuZXJneUNsaWVudDo6RGlzY29ubmVjdENhbGxiYWNrKAotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IGNvbm5faWQsIGludCBzdGF0dXMsCi0gICAgaW50IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIGlmIChjbGllbnRfaWQgIT0gY2xpZW50X2lkXykgcmV0dXJuOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBjbGllbnRfaWQ6ICIgPDwgY2xpZW50X2lkIDw8ICIgc3RhdHVzOiAiIDw8IHN0YXR1czsKLSAgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2soY29ubmVjdGlvbl9maWVsZHNfbG9ja18pOwotICAgIGlmICghY29ubmVjdGlvbl9pZHNfLmVyYXNlKGJkYSkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBFcmFzaW5nIGZyb20gY29ubmVjdGlvbl9pZHNfIGZhaWxlZCEiOwotICAgIH0KLSAgfQotCi0gIGlmIChkZWxlZ2F0ZV8pCi0gICAgZGVsZWdhdGVfLT5PbkNvbm5lY3Rpb25TdGF0ZSh0aGlzLCBzdGF0dXMsIEJ0QWRkclN0cmluZygmYmRhKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi12b2lkIExvd0VuZXJneUNsaWVudDo6TXR1Q2hhbmdlZENhbGxiYWNrKAotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwgaW50IGNvbm5faWQsIGludCBzdGF0dXMsIGludCBtdHUpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5faWQ6ICIgPDwgY29ubl9pZCA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXMKLSAgICAgICAgICA8PCAiIG10dTogIiA8PCBtdHU7Ci0KLSAgY29uc3QgUmF3QWRkcmVzcyogYmRhID0gbnVsbHB0cjsKLSAgewotICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2soY29ubmVjdGlvbl9maWVsZHNfbG9ja18pOwotICAgIGZvciAoYXV0byYgY29ubmVjdGlvbiA6IGNvbm5lY3Rpb25faWRzXykgewotICAgICAgaWYgKGNvbm5lY3Rpb24uc2Vjb25kID09IGNvbm5faWQpIHsKLSAgICAgICAgYmRhID0gJmNvbm5lY3Rpb24uZmlyc3Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghYmRhKSByZXR1cm47Ci0KLSAgc3RkOjpzdHJpbmcgYWRkciA9IEJ0QWRkclN0cmluZyhiZGEpOwotICBpZiAoZGVsZWdhdGVfKSBkZWxlZ2F0ZV8tPk9uTXR1Q2hhbmdlZCh0aGlzLCBzdGF0dXMsIGFkZHIuY19zdHIoKSwgbXR1KTsKLX0KLQotLy8gTG93RW5lcmd5Q2xpZW50RmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotCi1Mb3dFbmVyZ3lDbGllbnRGYWN0b3J5OjpMb3dFbmVyZ3lDbGllbnRGYWN0b3J5KEFkYXB0ZXImIGFkYXB0ZXIpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSB7Ci0gIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkFkZENsaWVudE9ic2VydmVyKHRoaXMpOwotfQotCi1Mb3dFbmVyZ3lDbGllbnRGYWN0b3J5Ojp+TG93RW5lcmd5Q2xpZW50RmFjdG9yeSgpIHsKLSAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+UmVtb3ZlQ2xpZW50T2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLWJvb2wgTG93RW5lcmd5Q2xpZW50RmFjdG9yeTo6UmVnaXN0ZXJJbnN0YW5jZSgKLSAgICBjb25zdCBVdWlkJiB1dWlkLCBjb25zdCBSZWdpc3RlckNhbGxiYWNrJiBjYWxsYmFjaykgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgLSBVdWlkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhwZW5kaW5nX2NhbGxzX2xvY2tfKTsKLQotICBpZiAocGVuZGluZ19jYWxsc18uZmluZCh1dWlkKSAhPSBwZW5kaW5nX2NhbGxzXy5lbmQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkxvdy1FbmVyZ3kgY2xpZW50IHdpdGggZ2l2ZW4gVXVpZCBhbHJlYWR5IHJlZ2lzdGVyZWQgLSAiCi0gICAgICAgICAgICAgICA8PCAiVXVpZDogIiA8PCB1dWlkLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCogaGFsX2lmYWNlID0KLSAgICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6R2V0KCktPkdldENsaWVudEhBTEludGVyZmFjZSgpOwotCi0gIGlmIChoYWxfaWZhY2UtPnJlZ2lzdGVyX2NsaWVudCh1dWlkLCBmYWxzZSkgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBlbmRpbmdfY2FsbHNfW3V1aWRdID0gY2FsbGJhY2s7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG93RW5lcmd5Q2xpZW50RmFjdG9yeTo6UmVnaXN0ZXJDbGllbnRDYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGludCBzdGF0dXMsIGludCBjbGllbnRfaWQsCi0gICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhcHBfdXVpZCkgewotICBVdWlkIHV1aWQoYXBwX3V1aWQpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiAtIFV1aWQ6ICIgPDwgdXVpZC5Ub1N0cmluZygpOwotICBsb2NrX2d1YXJkPG11dGV4PiBsb2NrKHBlbmRpbmdfY2FsbHNfbG9ja18pOwotCi0gIGF1dG8gaXRlciA9IHBlbmRpbmdfY2FsbHNfLmZpbmQodXVpZCk7Ci0gIGlmIChpdGVyID09IHBlbmRpbmdfY2FsbHNfLmVuZCgpKSB7Ci0gICAgVkxPRygxKSA8PCAiSWdub3JpbmcgY2FsbGJhY2sgZm9yIHVua25vd24gYXBwX2lkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBObyBuZWVkIHRvIGNvbnN0cnVjdCBhIGNsaWVudCBpZiB0aGUgY2FsbCB3YXNuJ3Qgc3VjY2Vzc2Z1bC4KLSAgc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUNsaWVudD4gY2xpZW50OwotICBCTEVTdGF0dXMgcmVzdWx0ID0gQkxFX1NUQVRVU19GQUlMVVJFOwotICBpZiAoc3RhdHVzID09IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgY2xpZW50LnJlc2V0KG5ldyBMb3dFbmVyZ3lDbGllbnQoYWRhcHRlcl8sIHV1aWQsIGNsaWVudF9pZCkpOwotCi0gICAgZ2F0dF9pZmFjZS0+QWRkQ2xpZW50T2JzZXJ2ZXIoY2xpZW50LmdldCgpKTsKLQotICAgIHJlc3VsdCA9IEJMRV9TVEFUVVNfU1VDQ0VTUzsKLSAgfQotCi0gIC8vIE5vdGlmeSB0aGUgcmVzdWx0IHZpYSB0aGUgcmVzdWx0IGNhbGxiYWNrLgotICBpdGVyLT5zZWNvbmQocmVzdWx0LCB1dWlkLCBzdGQ6Om1vdmUoY2xpZW50KSk7Ci0KLSAgcGVuZGluZ19jYWxsc18uZXJhc2UoaXRlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvbG93X2VuZXJneV9jbGllbnQuaCBiL3NlcnZpY2UvbG93X2VuZXJneV9jbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiNjBjNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL2xvd19lbmVyZ3lfY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAic2VydmljZS9ibHVldG9vdGhfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvbG93X2VuZXJneV9jb25zdGFudHMuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9yZXN1bHQuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvc2Nhbl9zZXR0aW5ncy5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdHJ1Y3QgQ29ubkNvbXBhcmF0b3IgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYSwgY29uc3QgUmF3QWRkcmVzcyYgYikgY29uc3QgewotICAgIHJldHVybiBtZW1jbXAoYS5hZGRyZXNzLCBiLmFkZHJlc3MsIFJhd0FkZHJlc3M6OmtMZW5ndGgpIDwgMDsKLSAgfQotfTsKLQotY2xhc3MgQWRhcHRlcjsKLQotLy8gQSBMb3dFbmVyZ3lDbGllbnQgcmVwcmVzZW50cyBhbiBhcHBsaWNhdGlvbidzIGhhbmRsZSB0byBwZXJmb3JtIHZhcmlvdXMKLS8vIEJsdWV0b290aCBMb3cgRW5lcmd5IEdBUCBvcGVyYXRpb25zLiBJbnN0YW5jZXMgY2Fubm90IGJlIGNyZWF0ZWQgZGlyZWN0bHkgYW5kCi0vLyBzaG91bGQgYmUgb2J0YWluZWQgdGhyb3VnaCB0aGUgZmFjdG9yeS4KLWNsYXNzIExvd0VuZXJneUNsaWVudCA6IHByaXZhdGUgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGllbnRPYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBCbHVldG9vdGhJbnN0YW5jZSB7Ci0gcHVibGljOgotICAvLyBUaGUgRGVsZWdhdGUgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbm90aWZ5IGFzeW5jaHJvbm91cyBldmVudHMgcmVsYXRlZCB0byBCTEUKLSAgLy8gR0FQIG9wZXJhdGlvbnMuCi0gIGNsYXNzIERlbGVnYXRlIHsKLSAgIHB1YmxpYzoKLSAgICBEZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLSAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLQotICAgIC8vIENhbGxlZCBhc3luY2hyb25vdXNseSB0byBub3RpZnkgdGhlIGRlbGVnYXRlIG9mIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlCi0gICAgdmlydHVhbCB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKExvd0VuZXJneUNsaWVudCogY2xpZW50LCBpbnQgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLCBib29sIGNvbm5lY3RlZCkgPSAwOwotCi0gICAgLy8gQ2FsbGVkIGFzeW5jaHJvbm91c2x5IHRvIG5vdGlmeSB0aGUgZGVsZWdhdGUgb2YgbXR1IGNoYW5nZQotICAgIHZpcnR1YWwgdm9pZCBPbk10dUNoYW5nZWQoTG93RW5lcmd5Q2xpZW50KiBjbGllbnQsIGludCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLCBpbnQgbXR1KSA9IDA7Ci0KLSAgIHByaXZhdGU6Ci0gICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlbGVnYXRlKTsKLSAgfTsKLQotICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHVucmVnaXN0ZXJzIHRoaXMgY2xpZW50IGluc3RhbmNlIGZyb20gdGhlCi0gIC8vIHN0YWNrLgotICB+TG93RW5lcmd5Q2xpZW50KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQXNzaWducyBhIGRlbGVnYXRlIHRvIHRoaXMgaW5zdGFuY2UuIHxkZWxlZ2F0ZXwgbXVzdCBvdXQtbGl2ZSB0aGlzCi0gIC8vIExvd0VuZXJneUNsaWVudCBpbnN0YW5jZS4KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gIC8vIENhbGxiYWNrIHR5cGUgdXNlZCB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBiZWxvdy4KLSAgdXNpbmcgU3RhdHVzQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQkxFU3RhdHVzKT47Ci0KLSAgLy8gSW5pdGlhdGVzIGEgQkxFIGNvbm5lY3Rpb24gZG8gZGV2aWNlIHdpdGggYWRkcmVzcyB8YWRkcmVzc3wuIElmCi0gIC8vIHxpc19kaXJlY3R8IGlzIHNldCwgdXNlIGRpcmVjdCBjb25uZWN0IHByb2NlZHVyZS4gUmV0dXJuIHRydWUgb24gc3VjY2VzcwotICAvLywgZmFsc2Ugb3RoZXJ3aXNlLgotICBib29sIENvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsIGJvb2wgaXNfZGlyZWN0KTsKLQotICAvLyBEaXNjb25uZWN0IGZyb20gcHJldmlvdXNseSBjb25uZWN0ZWQgQkxFIGRldmljZSB3aXRoIGFkZHJlc3MgfGFkZHJlc3N8LgotICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi0gIGJvb2wgRGlzY29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcyk7Ci0KLSAgLy8gU2VuZHMgcmVxdWVzdCB0byBzZXQgTVRVIHRvIHxtdHV8IGZvciBkZXZpY2Ugd2l0aCBhZGRyZXNzIHxhZGRyZXNzfC4KLSAgLy8gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotICBib29sIFNldE10dShjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IG10dSk7Ci0KLSAgLy8gQmx1ZXRvb3RoQ2xpZW50SW5zdGFjZSBvdmVycmlkZXM6Ci0gIGNvbnN0IFV1aWQmIEdldEFwcElkZW50aWZpZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50IEdldEluc3RhbmNlSWQoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBMb3dFbmVyZ3lDbGllbnRGYWN0b3J5OwotCi0gIC8vIENvbnN0cnVjdG9yIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgaW5zdGFuY2VzIGFyZSBtZWFudCB0byBiZQotICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBmYWN0b3J5LgotICBMb3dFbmVyZ3lDbGllbnQoQWRhcHRlciYgYWRhcHRlciwgY29uc3QgVXVpZCYgdXVpZCwgaW50IGNsaWVudF9pZCk7Ci0KLSAgLy8gQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXIgb3ZlcnJpZGVzOgotICB2b2lkIENvbm5lY3RDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIG92ZXJyaWRlOwotICB2b2lkIERpc2Nvbm5lY3RDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIG92ZXJyaWRlOwotICB2b2lkIE10dUNoYW5nZWRDYWxsYmFjayhoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGludCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBpbnQgbXR1KSBvdmVycmlkZTsKLQotICAvLyBDYWxscyBhbmQgY2xlYXJzIHRoZSBwZW5kaW5nIGNhbGxiYWNrcy4KLSAgdm9pZCBJbnZva2VBbmRDbGVhclN0YXJ0Q2FsbGJhY2soQkxFU3RhdHVzIHN0YXR1cyk7Ci0gIHZvaWQgSW52b2tlQW5kQ2xlYXJTdG9wQ2FsbGJhY2soQkxFU3RhdHVzIHN0YXR1cyk7Ci0KLSAgLy8gUmF3IHBvaW50ZXIgdG8gdGhlIEJsdWV0b290aCBBZGFwdGVyLgotICBBZGFwdGVyJiBhZGFwdGVyXzsKLQotICAvLyBTZWUgZ2V0dGVycyBhYm92ZSBmb3IgZG9jdW1lbnRhdGlvbi4KLSAgVXVpZCBhcHBfaWRlbnRpZmllcl87Ci0gIGludCBjbGllbnRfaWRfOwotCi0gIC8vIFJhdyBoYW5kbGUgdG8gdGhlIERlbGVnYXRlLCB3aGljaCBtdXN0IG91dGxpdmUgdGhpcyBMb3dFbmVyZ3lDbGllbnQKLSAgLy8gaW5zdGFuY2UuCi0gIHN0ZDo6bXV0ZXggZGVsZWdhdGVfbXV0ZXhfOwotICBEZWxlZ2F0ZSogZGVsZWdhdGVfOwotCi0gIC8vIFByb3RlY3RzIGRldmljZSBjb25uZWN0aW9uIHJlbGF0ZWQgbWVtYmVycyBiZWxvdy4KLSAgc3RkOjptdXRleCBjb25uZWN0aW9uX2ZpZWxkc19sb2NrXzsKLQotICAvLyBNYXBzIGJsdWV0b290aCBhZGRyZXNzIHRvIGNvbm5lY3Rpb24gaWQKLSAgLy8gVE9ETyhqcGF3bG93c2tpKTogY2hhbmdlIHR5cGUgdG8gYmltYXAKLSAgc3RkOjptYXA8Y29uc3QgUmF3QWRkcmVzcywgaW50LCBDb25uQ29tcGFyYXRvcj4gY29ubmVjdGlvbl9pZHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lDbGllbnQpOwotfTsKLQotLy8gTG93RW5lcmd5Q2xpZW50RmFjdG9yeSBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFuZCBvYnRhaW4gYSBwZXItYXBwbGljYXRpb24KLS8vIExvd0VuZXJneUNsaWVudCBpbnN0YW5jZS4gVXNlcnMgc2hvdWxkIGNhbGwgUmVnaXN0ZXJJbnN0YW5jZSB0byBvYnRhaW4gdGhlaXIKLS8vIG93biB1bmlxdWUgTG93RW5lcmd5Q2xpZW50IGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZQotLy8gQmx1ZXRvb3RoIHN0YWNrLgotY2xhc3MgTG93RW5lcmd5Q2xpZW50RmFjdG9yeQotICAgIDogcHJpdmF0ZSBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyLAotICAgICAgcHVibGljIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSB7Ci0gcHVibGljOgotICAvLyBEb24ndCBjb25zdHJ1Y3QvZGVzdHJ1Y3QgZGlyZWN0bHkgZXhjZXB0IGluIHRlc3RzLiBJbnN0ZWFkLCBvYnRhaW4gYSBoYW5kbGUKLSAgLy8gZnJvbSBhbiBBZGFwdGVyIGluc3RhbmNlLgotICBleHBsaWNpdCBMb3dFbmVyZ3lDbGllbnRGYWN0b3J5KEFkYXB0ZXImIGFkYXB0ZXIpOwotICB+TG93RW5lcmd5Q2xpZW50RmFjdG9yeSgpIG92ZXJyaWRlOwotCi0gIC8vIEJsdWV0b290aEluc3RhbmNlRmFjdG9yeSBvdmVycmlkZToKLSAgYm9vbCBSZWdpc3Rlckluc3RhbmNlKGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckNhbGxiYWNrJiBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgTG93RW5lcmd5Q2xpZW50OwotCi0gIC8vIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsaWVudE9ic2VydmVyIG92ZXJyaWRlczoKLSAgdm9pZCBSZWdpc3RlckNsaWVudENhbGxiYWNrKGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogZ2F0dF9pZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMsIGludCBjbGllbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKSBvdmVycmlkZTsKLQotICAvLyBNYXAgb2YgcGVuZGluZyBjYWxscyB0byByZWdpc3Rlci4KLSAgc3RkOjptdXRleCBwZW5kaW5nX2NhbGxzX2xvY2tfOwotICBzdGQ6Om1hcDxVdWlkLCBSZWdpc3RlckNhbGxiYWNrPiBwZW5kaW5nX2NhbGxzXzsKLQotICAvLyBSYXcgcG9pbnRlciB0byB0aGUgQWRhcHRlciB0aGF0IG93bnMgdGhpcyBmYWN0b3J5LgotICBBZGFwdGVyJiBhZGFwdGVyXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTG93RW5lcmd5Q2xpZW50RmFjdG9yeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL2xvd19lbmVyZ3lfc2Nhbm5lci5jYyBiL3NlcnZpY2UvbG93X2VuZXJneV9zY2FubmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI1ZTg1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvbG93X2VuZXJneV9zY2FubmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvbG93X2VuZXJneV9zY2FubmVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2xvZ2dpbmdfaGVscGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBzdGQ6OmxvY2tfZ3VhcmQ7Ci11c2luZyBzdGQ6Om11dGV4OwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIHsKLQotLy8gMzEgKyAzMSBmb3IgYWR2ZXJ0aXNpbmcgZGF0YSBhbmQgc2NhbiByZXNwb25zZS4gVGhpcyBpcyB0aGUgbWF4aW11bSBsZW5ndGgKLS8vIFRPRE8oYXJtYW5zaXRvKTogRml4IHRoZSBIQUwgdG8gcmV0dXJuIGEgY29uY2F0ZW5hdGVkIGJsb2IgdGhhdCBjb250YWlucyB0aGUKLS8vIHRydWUgbGVuZ3RoIG9mIGVhY2ggZmllbGQgYW5kIGFsc28gcHJvdmlkZSBhIGxlbmd0aCBwYXJhbWV0ZXIgc28gdGhhdCB3ZQotLy8gY2FuIHN1cHBvcnQgYWR2ZXJ0aXNpbmcgbGVuZ3RoIGV4dGVuc2lvbnMgaW4gdGhlIGZ1dHVyZS4KLWNvbnN0IHNpemVfdCBrU2NhblJlY29yZExlbmd0aCA9IDYyOwotCi0vLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIHNjYW4gcmVjb3JkIGFycmF5LiBXZSBoYXZlIHRvIGNhbGN1bGF0ZSB0aGlzCi0vLyBiYXNlZCBvbiB0aGUgbWF4aW11bSBwb3NzaWJsZSBkYXRhIGxlbmd0aCBhbmQgdGhlIFRMViBkYXRhLiBTZWUgVE9ETyBhYm92ZQotLy8gfGtTY2FuUmVjb3JkTGVuZ3RofC4KLXNpemVfdCBHZXRTY2FuUmVjb3JkTGVuZ3RoKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwLCBmaWVsZF9sZW4gPSAwOyBpIDwga1NjYW5SZWNvcmRMZW5ndGg7Ci0gICAgICAgaSArPSAoZmllbGRfbGVuICsgMSkpIHsKLSAgICBmaWVsZF9sZW4gPSBieXRlc1tpXTsKLQotICAgIC8vIEFzc2VydCBoZXJlIHRoYXQgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgc3RhY2sgaXMgY29ycmVjdGx5IGZvcm1hdHRlZAotICAgIC8vIGluIFRMViBmb3JtIGFuZCB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgZmllbGQgd29uJ3QgZXhjZWVkIHRoZQotICAgIC8vIHRvdGFsIGRhdGEgbGVuZ3RoLgotICAgIENIRUNLKGkgKyBmaWVsZF9sZW4gPCBrU2NhblJlY29yZExlbmd0aCk7Ci0KLSAgICAvLyBJZiB0aGUgZmllbGQgbGVuZ3RoIGlzIHplcm8gYW5kIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgbWF4aW11bSBsZW5ndGgsCi0gICAgLy8gdGhlbiB3ZSBoYXZlIGZvdW5kIHRoZSBsZW5ndGgsIGFzIHRoZSBzdGFjayB3aWxsIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zCi0gICAgLy8gYWNjb3JkaW5nbHkuCi0gICAgaWYgKGZpZWxkX2xlbiA9PSAwKSByZXR1cm4gaTsKLSAgfQotCi0gIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kLgotICByZXR1cm4ga1NjYW5SZWNvcmRMZW5ndGg7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBMb3dFbmVyZ3lTY2FubmVyIGltcGxlbWVudGF0aW9uCi0KLUxvd0VuZXJneVNjYW5uZXI6Okxvd0VuZXJneVNjYW5uZXIoQWRhcHRlciYgYWRhcHRlciwgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYW5uZXJfaWQpCi0gICAgOiBhZGFwdGVyXyhhZGFwdGVyKSwKLSAgICAgIGFwcF9pZGVudGlmaWVyXyh1dWlkKSwKLSAgICAgIHNjYW5uZXJfaWRfKHNjYW5uZXJfaWQpLAotICAgICAgc2Nhbl9zdGFydGVkXyhmYWxzZSksCi0gICAgICBkZWxlZ2F0ZV8obnVsbHB0cikge30KLQotTG93RW5lcmd5U2Nhbm5lcjo6fkxvd0VuZXJneVNjYW5uZXIoKSB7Ci0gIC8vIEF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciB0aGUgc2Nhbm5lci4KLSAgVkxPRygxKSA8PCAiTG93RW5lcmd5U2Nhbm5lciB1bnJlZ2lzdGVyaW5nIHNjYW5uZXI6ICIgPDwgc2Nhbm5lcl9pZF87Ci0KLSAgLy8gVW5yZWdpc3RlciBhcyBvYnNlcnZlciBzbyB3ZSBubyBsb25nZXIgcmVjZWl2ZSBhbnkgY2FsbGJhY2tzLgotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5SZW1vdmVTY2FubmVyT2JzZXJ2ZXIodGhpcyk7Ci0KLSAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+R2V0U2Nhbm5lckhBTEludGVyZmFjZSgpLT5VbnJlZ2lzdGVyKAotICAgICAgc2Nhbm5lcl9pZF8pOwotCi0gIC8vIFN0b3AgYW55IHNjYW5zIHN0YXJ0ZWQgYnkgdGhpcyBjbGllbnQuCi0gIGlmIChzY2FuX3N0YXJ0ZWRfLmxvYWQoKSkgU3RvcFNjYW4oKTsKLX0KLQotdm9pZCBMb3dFbmVyZ3lTY2FubmVyOjpTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpIHsKLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBkZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKLX0KLQotYm9vbCBMb3dFbmVyZ3lTY2FubmVyOjpTdGFydFNjYW4oY29uc3QgU2NhblNldHRpbmdzJiBzZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNjYW5GaWx0ZXI+JiBmaWx0ZXJzKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgLy8gQ2Fubm90IHN0YXJ0IGEgc2NhbiBpZiB0aGUgYWRhcHRlciBpcyBub3QgZW5hYmxlZC4KLSAgaWYgKCFhZGFwdGVyXy5Jc0VuYWJsZWQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBzY2FuIHdoaWxlIEJsdWV0b290aCBpcyBkaXNhYmxlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVE9ETyhqcGF3bG93c2tpKTogUHVzaCBzZXR0aW5ncyBhbmQgZmlsdGVyaW5nIGxvZ2ljIGJlbG93IHRoZSBIQUwuCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9Ci0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5TdGFydFNjYW4oc2Nhbm5lcl9pZF8pOwotICBpZiAoc3RhdHVzICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYXRlIHNjYW5uaW5nIGZvciBjbGllbnQ6ICIgPDwgc2Nhbm5lcl9pZF87Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2Nhbl9zdGFydGVkXyA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExvd0VuZXJneVNjYW5uZXI6OlN0b3BTY2FuKCkgewotICBWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogV2UgZG9uJ3Qgc3VwcG9ydCBiYXRjaCBzY2FubmluZyB5ZXQgc28gY2FsbAotICAvLyBTdG9wUmVndWxhclNjYW5Gb3JDbGllbnQgZGlyZWN0bHkuIEluIHRoZSBmdXR1cmUgd2Ugd2lsbCBuZWVkIHRvCi0gIC8vIGNvbmRpdGlvbmFsbHkgY2FsbCBhIGJhdGNoIHNjYW4gQVBJIGhlcmUuCi0gIGJ0X3N0YXR1c190IHN0YXR1cyA9Ci0gICAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5TdG9wU2NhbihzY2FubmVyX2lkXyk7Ci0gIGlmIChzdGF0dXMgIT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc3RvcCBzY2FuIGZvciBjbGllbnQ6ICIgPDwgc2Nhbm5lcl9pZF87Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2Nhbl9zdGFydGVkXyA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgVXVpZCYgTG93RW5lcmd5U2Nhbm5lcjo6R2V0QXBwSWRlbnRpZmllcigpIGNvbnN0IHsKLSAgcmV0dXJuIGFwcF9pZGVudGlmaWVyXzsKLX0KLQotaW50IExvd0VuZXJneVNjYW5uZXI6OkdldEluc3RhbmNlSWQoKSBjb25zdCB7IHJldHVybiBzY2FubmVyX2lkXzsgfQotCi12b2lkIExvd0VuZXJneVNjYW5uZXI6OlNjYW5SZXN1bHRDYWxsYmFjaygKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGdhdHRfaWZhY2UsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50IHJzc2ksCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGEpIHsKLSAgLy8gSWdub3JlIHNjYW4gcmVzdWx0cyBpZiB0aGlzIGNsaWVudCBkaWRuJ3Qgc3RhcnQgYSBzY2FuLgotICBpZiAoIXNjYW5fc3RhcnRlZF8ubG9hZCgpKSByZXR1cm47Ci0KLSAgbG9ja19ndWFyZDxtdXRleD4gbG9jayhkZWxlZ2F0ZV9tdXRleF8pOwotICBpZiAoIWRlbGVnYXRlXykgcmV0dXJuOwotCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogQXBwbHkgc29mdHdhcmUgZmlsdGVycyBoZXJlLgotCi0gIHNpemVfdCByZWNvcmRfbGVuID0gR2V0U2NhblJlY29yZExlbmd0aChhZHZfZGF0YSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVjb3JkKGFkdl9kYXRhLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kYXRhLmJlZ2luKCkgKyByZWNvcmRfbGVuKTsKLQotICBTY2FuUmVzdWx0IHJlc3VsdChCdEFkZHJTdHJpbmcoJmJkYSksIHNjYW5fcmVjb3JkLCByc3NpKTsKLQotICBkZWxlZ2F0ZV8tPk9uU2NhblJlc3VsdCh0aGlzLCByZXN1bHQpOwotfQotCi0vLyBMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotCi1Mb3dFbmVyZ3lTY2FubmVyRmFjdG9yeTo6TG93RW5lcmd5U2Nhbm5lckZhY3RvcnkoQWRhcHRlciYgYWRhcHRlcikKLSAgICA6IGFkYXB0ZXJfKGFkYXB0ZXIpIHsKLSAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+QWRkU2Nhbm5lck9ic2VydmVyKHRoaXMpOwotfQotCi1Mb3dFbmVyZ3lTY2FubmVyRmFjdG9yeTo6fkxvd0VuZXJneVNjYW5uZXJGYWN0b3J5KCkgewotICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5SZW1vdmVTY2FubmVyT2JzZXJ2ZXIodGhpcyk7Ci19Ci0KLWJvb2wgTG93RW5lcmd5U2Nhbm5lckZhY3Rvcnk6OlJlZ2lzdGVySW5zdGFuY2UoCi0gICAgY29uc3QgVXVpZCYgdXVpZCwgY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2spIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIC0gVXVpZDogIiA8PCB1dWlkLlRvU3RyaW5nKCk7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2socGVuZGluZ19jYWxsc19sb2NrXyk7Ci0KLSAgaWYgKHBlbmRpbmdfY2FsbHNfLmZpbmQodXVpZCkgIT0gcGVuZGluZ19jYWxsc18uZW5kKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJMb3ctRW5lcmd5IHNjYW5uZXIgd2l0aCBnaXZlbiBVdWlkIGFscmVhZHkgcmVnaXN0ZXJlZCAtICIKLSAgICAgICAgICAgICAgIDw8ICJVdWlkOiAiIDw8IHV1aWQuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBCbGVTY2FubmVySW50ZXJmYWNlKiBoYWxfaWZhY2UgPQotICAgICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpHZXQoKS0+R2V0U2Nhbm5lckhBTEludGVyZmFjZSgpOwotCi0gIFV1aWQgdXVpZF9lbXB0eSA9IFV1aWQ6OmtFbXB0eTsKLQotICBoYWxfaWZhY2UtPlJlZ2lzdGVyU2Nhbm5lcigKLSAgICAgIHV1aWRfZW1wdHksIGJhc2U6OkJpbmQoJkxvd0VuZXJneVNjYW5uZXJGYWN0b3J5OjpSZWdpc3RlclNjYW5uZXJDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgY2FsbGJhY2ssIHV1aWQpKTsKLQotICBwZW5kaW5nX2NhbGxzXy5pbnNlcnQodXVpZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG93RW5lcmd5U2Nhbm5lckZhY3Rvcnk6OlJlZ2lzdGVyU2Nhbm5lckNhbGxiYWNrKAotICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrLCBjb25zdCBVdWlkJiBhcHBfdXVpZCwgdWludDhfdCBzY2FubmVyX2lkLAotICAgIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIFV1aWQgdXVpZChhcHBfdXVpZCk7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIC0gVXVpZDogIiA8PCB1dWlkLlRvU3RyaW5nKCk7Ci0gIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2socGVuZGluZ19jYWxsc19sb2NrXyk7Ci0KLSAgYXV0byBpdGVyID0gcGVuZGluZ19jYWxsc18uZmluZCh1dWlkKTsKLSAgaWYgKGl0ZXIgPT0gcGVuZGluZ19jYWxsc18uZW5kKCkpIHsKLSAgICBWTE9HKDEpIDw8ICJJZ25vcmluZyBjYWxsYmFjayBmb3IgdW5rbm93biBhcHBfaWQ6ICIgPDwgdXVpZC5Ub1N0cmluZygpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIE5vIG5lZWQgdG8gY29uc3RydWN0IGEgc2Nhbm5lciBpZiB0aGUgY2FsbCB3YXNuJ3Qgc3VjY2Vzc2Z1bC4KLSAgc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneVNjYW5uZXI+IHNjYW5uZXI7Ci0gIEJMRVN0YXR1cyByZXN1bHQgPSBCTEVfU1RBVFVTX0ZBSUxVUkU7Ci0gIGlmIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICBzY2FubmVyLnJlc2V0KG5ldyBMb3dFbmVyZ3lTY2FubmVyKGFkYXB0ZXJfLCB1dWlkLCBzY2FubmVyX2lkKSk7Ci0KLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpLT5BZGRTY2FubmVyT2JzZXJ2ZXIoc2Nhbm5lci5nZXQoKSk7Ci0KLSAgICByZXN1bHQgPSBCTEVfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0KLQotICAvLyBOb3RpZnkgdGhlIHJlc3VsdCB2aWEgdGhlIHJlc3VsdCBjYWxsYmFjay4KLSAgY2FsbGJhY2socmVzdWx0LCBhcHBfdXVpZCwgc3RkOjptb3ZlKHNjYW5uZXIpKTsKLQotICBwZW5kaW5nX2NhbGxzXy5lcmFzZShpdGVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9sb3dfZW5lcmd5X3NjYW5uZXIuaCBiL3NlcnZpY2UvbG93X2VuZXJneV9zY2FubmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjVjNDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9sb3dfZW5lcmd5X3NjYW5uZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAic2VydmljZS9ibHVldG9vdGhfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9ibHVldG9vdGgvYWR2ZXJ0aXNlX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fZmlsdGVyLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fcmVzdWx0LmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotY2xhc3MgQWRhcHRlcjsKLQotLy8gQSBMb3dFbmVyZ3lTY2FubmVyIHJlcHJlc2VudHMgYW4gYXBwbGljYXRpb24ncyBoYW5kbGUgdG8gcGVyZm9ybSB2YXJpb3VzCi0vLyBCbHVldG9vdGggTG93IEVuZXJneSBHQVAgb3BlcmF0aW9ucy4gSW5zdGFuY2VzIGNhbm5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5IGFuZAotLy8gc2hvdWxkIGJlIG9idGFpbmVkIHRocm91Z2ggdGhlIGZhY3RvcnkuCi1jbGFzcyBMb3dFbmVyZ3lTY2FubmVyIDogcHJpdmF0ZSBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNjYW5uZXJPYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQmx1ZXRvb3RoSW5zdGFuY2UgewotIHB1YmxpYzoKLSAgLy8gVGhlIERlbGVnYXRlIGludGVyZmFjZSBpcyB1c2VkIHRvIG5vdGlmeSBhc3luY2hyb25vdXMgZXZlbnRzIHJlbGF0ZWQgdG8gTEUKLSAgLy8gc2Nhbi4KLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIERlbGVnYXRlKCkgPSBkZWZhdWx0OwotICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgPSBkZWZhdWx0OwotCi0gICAgLy8gQ2FsbGVkIGFzeW5jaHJvbm91c2x5IHRvIG5vdGlmeSB0aGUgZGVsZWdhdGUgb2YgbmVhcmJ5IEJMRSBhZHZlcnRpc2VycwotICAgIC8vIGZvdW5kIGR1cmluZyBhIGRldmljZSBzY2FuLgotICAgIHZpcnR1YWwgdm9pZCBPblNjYW5SZXN1bHQoTG93RW5lcmd5U2Nhbm5lciogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhblJlc3VsdCYgc2Nhbl9yZXN1bHQpID0gMDsKLQotICAgcHJpdmF0ZToKLSAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGVsZWdhdGUpOwotICB9OwotCi0gIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlcnMgdGhpcyBjbGllbnQgaW5zdGFuY2UgZnJvbSB0aGUKLSAgLy8gc3RhY2suCi0gIH5Mb3dFbmVyZ3lTY2FubmVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQXNzaWducyBhIGRlbGVnYXRlIHRvIHRoaXMgaW5zdGFuY2UuIHxkZWxlZ2F0ZXwgbXVzdCBvdXQtbGl2ZSB0aGlzCi0gIC8vIExvd0VuZXJneUNsaWVudCBpbnN0YW5jZS4KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpOwotCi0gIC8vIEluaXRpYXRlcyBhIEJMRSBkZXZpY2Ugc2NhbiBmb3IgdGhpcyBjbGllbnQgdXNpbmcgdGhlIGdpdmVuIHxzZXR0aW5nc3wgYW5kCi0gIC8vIHxmaWx0ZXJzfC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTY2FuU2V0dGluZ3MgYW5kIFNjYW5GaWx0ZXIgZm9yIGhvdwotICAvLyB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBjb25maWd1cmVkLiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZQotICAvLyBvdGhlcndpc2UuIFBsZWFzZSBzZWUgbG9ncyBmb3IgZGV0YWlscyBpbiBjYXNlIG9mIGVycm9yLgotICBib29sIFN0YXJ0U2Nhbihjb25zdCBTY2FuU2V0dGluZ3MmIHNldHRpbmdzLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTY2FuRmlsdGVyPiYgZmlsdGVycyk7Ci0KLSAgLy8gU3RvcHMgYW4gb25nb2luZyBCTEUgZGV2aWNlIHNjYW4gZm9yIHRoaXMgY2xpZW50LgotICBib29sIFN0b3BTY2FuKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBzY2FuIHNldHRpbmdzLgotICBjb25zdCBTY2FuU2V0dGluZ3MmIHNjYW5fc2V0dGluZ3MoKSBjb25zdCB7IHJldHVybiBzY2FuX3NldHRpbmdzXzsgfQotCi0gIC8vIEJsdWV0b290aEluc3RhY2Ugb3ZlcnJpZGVzOgotICBjb25zdCBVdWlkJiBHZXRBcHBJZGVudGlmaWVyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludCBHZXRJbnN0YW5jZUlkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTY2FuUmVzdWx0Q2FsbGJhY2soaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBnYXR0X2lmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCByc3NpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZfZGF0YSkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgTG93RW5lcmd5U2Nhbm5lckZhY3Rvcnk7Ci0KLSAgLy8gQ29uc3RydWN0b3Igc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBhcyBpbnN0YW5jZXMgYXJlIG1lYW50IHRvIGJlCi0gIC8vIG9idGFpbmVkIGZyb20gdGhlIGZhY3RvcnkuCi0gIExvd0VuZXJneVNjYW5uZXIoQWRhcHRlciYgYWRhcHRlciwgY29uc3QgVXVpZCYgdXVpZCwgaW50IHNjYW5uZXJfaWQpOwotCi0gIC8vIENhbGxzIGFuZCBjbGVhcnMgdGhlIHBlbmRpbmcgY2FsbGJhY2tzLgotICB2b2lkIEludm9rZUFuZENsZWFyU3RhcnRDYWxsYmFjayhCTEVTdGF0dXMgc3RhdHVzKTsKLSAgdm9pZCBJbnZva2VBbmRDbGVhclN0b3BDYWxsYmFjayhCTEVTdGF0dXMgc3RhdHVzKTsKLQotICAvLyBSYXcgcG9pbnRlciB0byB0aGUgQmx1ZXRvb3RoIEFkYXB0ZXIuCi0gIEFkYXB0ZXImIGFkYXB0ZXJfOwotCi0gIC8vIFNlZSBnZXR0ZXJzIGFib3ZlIGZvciBkb2N1bWVudGF0aW9uLgotICBVdWlkIGFwcF9pZGVudGlmaWVyXzsKLSAgaW50IHNjYW5uZXJfaWRfOwotCi0gIC8vIFByb3RlY3RzIGRldmljZSBzY2FuIHJlbGF0ZWQgbWVtYmVycyBiZWxvdy4KLSAgc3RkOjptdXRleCBzY2FuX2ZpZWxkc19sb2NrXzsKLQotICAvLyBDdXJyZW50IHNjYW4gc2V0dGluZ3MuCi0gIFNjYW5TZXR0aW5ncyBzY2FuX3NldHRpbmdzXzsKLQotICAvLyBJZiB0cnVlLCB0aGVuIHRoaXMgY2xpZW50IGhhdmUgYSBCTEUgZGV2aWNlIHNjYW4gaW4gcHJvZ3Jlc3MuCi0gIHN0ZDo6YXRvbWljX2Jvb2wgc2Nhbl9zdGFydGVkXzsKLQotICAvLyBSYXcgaGFuZGxlIHRvIHRoZSBEZWxlZ2F0ZSwgd2hpY2ggbXVzdCBvdXRsaXZlIHRoaXMgTG93RW5lcmd5U2Nhbm5lcgotICAvLyBpbnN0YW5jZS4KLSAgc3RkOjptdXRleCBkZWxlZ2F0ZV9tdXRleF87Ci0gIERlbGVnYXRlKiBkZWxlZ2F0ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvd0VuZXJneVNjYW5uZXIpOwotfTsKLQotLy8gTG93RW5lcmd5U2Nhbm5lckZhY3RvcnkgaXMgdXNlZCB0byByZWdpc3RlciBhbmQgb2J0YWluIGEgcGVyLWFwcGxpY2F0aW9uCi0vLyBMb3dFbmVyZ3lTY2FubmVyIGluc3RhbmNlLiBVc2VycyBzaG91bGQgY2FsbCBSZWdpc3Rlckluc3RhbmNlIHRvIG9idGFpbiB0aGVpcgotLy8gb3duIHVuaXF1ZSBMb3dFbmVyZ3lTY2FubmVyIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZQotLy8gQmx1ZXRvb3RoIHN0YWNrLgotY2xhc3MgTG93RW5lcmd5U2Nhbm5lckZhY3RvcnkKLSAgICA6IHByaXZhdGUgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpTY2FubmVyT2JzZXJ2ZXIsCi0gICAgICBwdWJsaWMgQmx1ZXRvb3RoSW5zdGFuY2VGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIC8vIERvbid0IGNvbnN0cnVjdC9kZXN0cnVjdCBkaXJlY3RseSBleGNlcHQgaW4gdGVzdHMuIEluc3RlYWQsIG9idGFpbiBhIGhhbmRsZQotICAvLyBmcm9tIGFuIEFkYXB0ZXIgaW5zdGFuY2UuCi0gIGV4cGxpY2l0IExvd0VuZXJneVNjYW5uZXJGYWN0b3J5KEFkYXB0ZXImIGFkYXB0ZXIpOwotICB+TG93RW5lcmd5U2Nhbm5lckZhY3RvcnkoKSBvdmVycmlkZTsKLQotICAvLyBCbHVldG9vdGhJbnN0YW5jZUZhY3Rvcnkgb3ZlcnJpZGU6Ci0gIGJvb2wgUmVnaXN0ZXJJbnN0YW5jZShjb25zdCBVdWlkJiBhcHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQ2FsbGJhY2smIGNhbGxiYWNrKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBMb3dFbmVyZ3lTY2FubmVyOwotCi0gIC8vIEJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNjYW5uZXJPYnNlcnZlciBvdmVycmlkZXM6Ci0gIHZvaWQgUmVnaXN0ZXJTY2FubmVyQ2FsbGJhY2soY29uc3QgUmVnaXN0ZXJDYWxsYmFjayYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgYXBwX3V1aWQsIHVpbnQ4X3Qgc2Nhbm5lcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cyk7Ci0KLSAgLy8gTWFwIG9mIHBlbmRpbmcgY2FsbHMgdG8gcmVnaXN0ZXIuCi0gIHN0ZDo6bXV0ZXggcGVuZGluZ19jYWxsc19sb2NrXzsKLSAgc3RkOjp1bm9yZGVyZWRfc2V0PFV1aWQ+IHBlbmRpbmdfY2FsbHNfOwotCi0gIC8vIFJhdyBwb2ludGVyIHRvIHRoZSBBZGFwdGVyIHRoYXQgb3ducyB0aGlzIGZhY3RvcnkuCi0gIEFkYXB0ZXImIGFkYXB0ZXJfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL21haW4uY2MgYi9zZXJ2aWNlL21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTA5OGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxiYXNlL2F0X2V4aXQuaD4KLSNpbmNsdWRlIDxiYXNlL2NvbW1hbmRfbGluZS5oPgotI2luY2x1ZGUgPGJhc2UvZmlsZXMvc2NvcGVkX2ZpbGUuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2RhZW1vbi5oIgotI2luY2x1ZGUgInNlcnZpY2Uvc3dpdGNoZXMuaCIKLQotbmFtZXNwYWNlIHsKLQotLy8gVE9ETyhhcm1hbnNpdG8pOiBOb25lIG9mIHRoZXNlIHNob3VsZCBiZSBoYXJkY29kZWQgaGVyZS4gSW5zdGVhZCwgcGFzcyB0aGVzZQotLy8gdmlhIGNvbW1hbmRsaW5lLgotY29uc3QgY2hhciBrRGlzYWJsZVByb3BlcnR5W10gPSAicGVyc2lzdC5ibHVldG9vdGguZGlzYWJsZSI7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIGJhc2U6OkF0RXhpdE1hbmFnZXIgZXhpdF9tYW5hZ2VyOwotICBiYXNlOjpDb21tYW5kTGluZTo6SW5pdChhcmdjLCBhcmd2KTsKLQotICBsb2dnaW5nOjpMb2dnaW5nU2V0dGluZ3MgbG9nX3NldHRpbmdzOwotICBpZiAoIWxvZ2dpbmc6OkluaXRMb2dnaW5nKGxvZ19zZXR0aW5ncykpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHVwIGxvZ2dpbmciOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICAvLyBUT0RPKGFybWFuc2l0byk6IEluaXRpYWxpemUgYmFzZS9sb2dnaW5nLiBCeSBkZWZhdWx0IGl0IHdpbGwgZHVtcCB0byBzdGRvdXQKLSAgLy8gYnV0IHdlIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoYXQgYmFzZWQgb24gYSBjb21tYW5kLWxpbmUgc3dpdGNoLiBGaWd1cmUgb3V0Ci0gIC8vIGhvdyB0byByb3V0ZSB0aGUgbG9nZ2luZyB0byBBbmRyb2lkJ3Mgc3lzbG9nLiBPbmNlIHRoYXQncyBkb25lLCB3ZSB3b24ndAotICAvLyBuZWVkIHRvIHVzZSBvc2kvaW5jbHVkZS9sb2cuaCBhbnltb3JlLgotCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogUmVnaXN0ZXIgZXhpdC10aW1lIGNsZWFuLXVwIGhhbmRsZXJzIGZvciB0aGUgSVBDIHNvY2tldHMuCi0gIC8vIFJlZ2lzdGVyIHNpZ25hbCBoYW5kbGVycy4KLSAgYXV0byBjb21tYW5kX2xpbmUgPSBiYXNlOjpDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKLSAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGJsdWV0b290aDo6c3dpdGNoZXM6OmtIZWxwTG9uZykgfHwKLSAgICAgIGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGJsdWV0b290aDo6c3dpdGNoZXM6OmtIZWxwU2hvcnQpKSB7Ci0gICAgTE9HKElORk8pIDw8IGJsdWV0b290aDo6c3dpdGNoZXM6OmtIZWxwTWVzc2FnZTsKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotICB9Ci0KLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBSZW1vdmUgQ2hyb21lY2FzdCBzcGVjaWZpYyBwcm9wZXJ0eSBvdXQgb2YgaGVyZS4gVGhpcwotICAvLyBzaG91bGQganVzdCBiZSBvYnRhaW5lZCBmcm9tIGdsb2JhbCBjb25maWcuCi0gIGNoYXIgZGlzYWJsZV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICBpbnQgc3RhdHVzID0gb3NpX3Byb3BlcnR5X2dldChrRGlzYWJsZVByb3BlcnR5LCBkaXNhYmxlX3ZhbHVlLCBudWxscHRyKTsKLSAgaWYgKHN0YXR1cyAmJiAhc3RyY21wKGRpc2FibGVfdmFsdWUsICIxIikpIHsKLSAgICBMT0coSU5GTykgPDwgInNlcnZpY2UgZGlzYWJsZWQiOwotICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Ci0gIH0KLQotICBpZiAoIWJsdWV0b290aDo6RGFlbW9uOjpJbml0aWFsaXplKCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBEYWVtb24iOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICAvLyBTdGFydCB0aGUgbWFpbiBldmVudCBsb29wLgotICBibHVldG9vdGg6OkRhZW1vbjo6R2V0KCktPlN0YXJ0TWFpbkxvb3AoKTsKLQotICAvLyBUaGUgbWFpbiBtZXNzYWdlIGxvb3AgaGFzIGV4aXRlZDsgY2xlYW4gdXAgdGhlIERhZW1vbi4KLSAgYmx1ZXRvb3RoOjpEYWVtb246OkdldCgpLT5TaHV0RG93bigpOwotCi0gIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL3NldHRpbmdzLmNjIGIvc2VydmljZS9zZXR0aW5ncy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkYzIwMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL3NldHRpbmdzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL3NldHRpbmdzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2NvbW1hbmRfbGluZS5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAic2VydmljZS9zd2l0Y2hlcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotbmFtZXNwYWNlIHN3aXRjaGVzIHsKLS8vIFZlcmJvc2Ugc3dpdGNoIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgYmFzZV9zd2l0Y2hlcyBidXQgZG9lc24ndCBzZWVtIHRvIGJlCi0vLyBleHBvcnRlZCBhcyBwYXJ0IG9mIGxpYmJhc2UuCi1jb25zdCBjaGFyIGtWW10gPSAidiI7Ci19OyAgLy8gbmFtZXNwYWNlIHN3aXRjaGVzCi0KLVNldHRpbmdzOjpTZXR0aW5ncygpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSwgZW5hYmxlX29uX3N0YXJ0XyhmYWxzZSkge30KLQotU2V0dGluZ3M6On5TZXR0aW5ncygpIHt9Ci0KLWJvb2wgU2V0dGluZ3M6OkluaXQoKSB7Ci0gIENIRUNLKCFpbml0aWFsaXplZF8pOwotICBhdXRvIGNvbW1hbmRfbGluZSA9IGJhc2U6OkNvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwotICBjb25zdCBhdXRvJiBzd2l0Y2hlcyA9IGNvbW1hbmRfbGluZS0+R2V0U3dpdGNoZXMoKTsKLQotICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBzd2l0Y2hlcykgewotICAgIGlmIChpdGVyLmZpcnN0ID09IHN3aXRjaGVzOjprQ3JlYXRlSVBDU29ja2V0UGF0aCkgewotICAgICAgLy8ga0NyZWF0ZUlQQ1NvY2tldFBhdGg6IEFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaW5pdGlhbGl6ZXMgYW4gSVBDCi0gICAgICAvLyBzb2NrZXQgcGF0aCBmb3IgSVBDLgotICAgICAgYmFzZTo6RmlsZVBhdGggcGF0aChpdGVyLnNlY29uZCk7Ci0gICAgICBpZiAocGF0aC5lbXB0eSgpIHx8IHBhdGguRW5kc1dpdGhTZXBhcmF0b3IoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIElQQyBjcmVhdGUgc29ja2V0IHBhdGgiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGNyZWF0ZV9pcGNfc29ja2V0X3BhdGhfID0gcGF0aDsKLSAgICB9IGVsc2UgaWYgKGl0ZXIuZmlyc3QgPT0gc3dpdGNoZXM6OmtBbmRyb2lkSVBDU29ja2V0U3VmZml4KSB7Ci0gICAgICAvLyBrQW5kcm9pZElQQ1NvY2tldFN1ZmZpeDogQW4gb3B0aW9uYWwgYXJndW1lbnQgdXNlZCB0byBleHByZXNzCi0gICAgICAvLyBhIHNvY2tldCB0aGF0IEFuZHJvaWQgaW5pdCBjcmVhdGVkIGZvciB1cy4gV2UgYmluZCB0byB0aGlzLgotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCA9IGl0ZXIuc2Vjb25kOwotICAgICAgaWYgKHN1ZmZpeC5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQW5kcm9pZCBzb2NrZXQgc3VmZml4IjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBhbmRyb2lkX2lwY19zb2NrZXRfc3VmZml4XyA9IHN1ZmZpeDsKLSAgICB9IGVsc2UgaWYgKGl0ZXIuZmlyc3QgPT0gc3dpdGNoZXM6OmtFbmFibGVPblN0YXJ0KSB7Ci0gICAgICBpZiAoaXRlci5zZWNvbmQgPT0gInRydWUiKSB7Ci0gICAgICAgIGVuYWJsZV9vbl9zdGFydF8gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChpdGVyLnNlY29uZCA9PSAiZmFsc2UiKSB7Ci0gICAgICAgIGVuYWJsZV9vbl9zdGFydF8gPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgdmFsdWUgZm9yICIgPDwgc3dpdGNoZXM6OmtFbmFibGVPblN0YXJ0IDw8ICI6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBpdGVyLnNlY29uZCA8PCAiLiBFeHBlY3QgJ3RydWUnIG9yICdmYWxzZSciOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIENoZWNrIGZvciBsaWJiYXNlIGxvZ2dpbmcgc3dpdGNoZXMuIFRoZXNlIGdldCBwcm9jZXNzZWQgYnkKLSAgICAvLyBsb2dnaW5nOjpJbml0TG9nZ2luZyBkaXJlY3RseS4KLSAgICBlbHNlIGlmIChpdGVyLmZpcnN0ICE9IHN3aXRjaGVzOjprVikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCBjb21tYW5kLWxpbmUgc3dpdGNoZXMgZm91bmQ6ICIgPDwgaXRlci5maXJzdDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvLyBUd28gSVBDIG1ldGhvZHMvcGF0aHMgd2VyZSBwcm92aWRlZC4KLSAgaWYgKCFhbmRyb2lkX2lwY19zb2NrZXRfc3VmZml4Xy5lbXB0eSgpICYmICFjcmVhdGVfaXBjX3NvY2tldF9wYXRoXy5lbXB0eSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVG9vIG1hbnkgSVBDIG1ldGhvZHMgcHJvdmlkZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRoZSBkYWVtb24gaGFzIG5vIGFyZ3VtZW50cwotICBpZiAoY29tbWFuZF9saW5lLT5HZXRBcmdzKCkuc2l6ZSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvdW5kIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbml0aWFsaXplZF8gPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9zZXR0aW5ncy5oIGIvc2VydmljZS9zZXR0aW5ncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI5OGQ2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2Uvc2V0dGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV9wYXRoLmg+Ci0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8vIFRoZSBTZXR0aW5ncyBjbGFzcyBzdG9yZXMgZ2xvYmFsIHJ1bnRpbWUgY29uZmlndXJhdGlvbnMsIHN1Y2ggYXMgSVBDIGRvbWFpbgotLy8gbmFtZXNwYWNlLCBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRpb25zLCBhbmQgb3RoZXIgc3lzdGVtIHByb3BlcnRpZXMgYW5kCi0vLyBmbGFncy4KLWNsYXNzIFNldHRpbmdzIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0YW50IGZvciB0aGUgIi0taGVscCIgY29tbWFuZC1saW5lIHN3aXRjaGVzLgotICBzdGF0aWMgY29uc3QgY2hhciBrSGVscFtdOwotCi0gIFNldHRpbmdzKCk7Ci0gIH5TZXR0aW5ncygpOwotCi0gIC8vIFRPRE8oYXJtYW5zaXRvKTogV3JpdGUgYW4gaW5zdGFuY2UgbWV0aG9kIGZvciBzdG9yaW5nIHRoaW5ncyBpbnRvIGEgZmlsZS4KLQotICAvLyBJbml0aWFsaXplcyB0aGUgU2V0dGluZ3Mgb2JqZWN0LiBUaGlzIHJlYWRzIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IKLSAgLy8gdGhlIGN1cnJlbnQgcHJvY2VzcyAod2hpY2ggbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgdXNpbmcKLSAgLy8gYmFzZTo6Q29tbWFuZExpbmUpIGFuZCBzZXRzIHVwIHRoZSBpbml0aWFsIGdsb2JhbCBzZXR0aW5ncy4gUmV0dXJucyBmYWxzZQotICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciwgZS5nLiBpZiB0aGUgcGFyYW1ldGVycy9zd2l0Y2hlcyBhcmUgbWFsZm9ybWVkLgotICBib29sIEluaXQoKTsKLQotICAvLyBJZiBBbmRyb2lkIGluaXQgY3JlYXRlZCBhIHNlcnZlciBzb2NrZXQgZm9yIHRoZSBkYWVtb24sCi0gIC8vIHdlIGNhbiByZXRyaWV2ZSBpdCB0aHJvdWdoIHRoaXMgc3VmZml4LgotICBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9pcGNfc29ja2V0X3N1ZmZpeCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYW5kcm9pZF9pcGNfc29ja2V0X3N1ZmZpeF87Ci0gIH0KLQotICAvLyBQYXRoIHRvIGNyZWF0ZSBhIFVuaXggZG9tYWluIHNvY2tldCBzZXJ2ZXIgZm9yIEJsdWV0b290aCBJUEMuCi0gIGNvbnN0IGJhc2U6OkZpbGVQYXRoJiBjcmVhdGVfaXBjX3NvY2tldF9wYXRoKCkgY29uc3QgewotICAgIHJldHVybiBjcmVhdGVfaXBjX3NvY2tldF9wYXRoXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBkb21haW4tc29ja2V0IGJhc2VkIElQQyBzaG91bGQgYmUgdXNlZC4gSWYgZmFsc2UsIHRoZW4KLSAgLy8gQmluZGVyIElQQyBtdXN0IGJlIHVzZWQuCi0gIGlubGluZSBib29sIFVzZVNvY2tldElQQygpIGNvbnN0IHsKLSAgICByZXR1cm4gIWFuZHJvaWRfaXBjX3NvY2tldF9zdWZmaXgoKS5lbXB0eSgpIHx8Ci0gICAgICAgICAgICFjcmVhdGVfaXBjX3NvY2tldF9wYXRoKCkuZW1wdHkoKTsKLSAgfQotCi0gIGJvb2wgRW5hYmxlT25TdGFydCgpIGNvbnN0IHsgcmV0dXJuIGVuYWJsZV9vbl9zdGFydF87IH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgaW5pdGlhbGl6ZWRfOwotICBib29sIGVuYWJsZV9vbl9zdGFydF87Ci0gIHN0ZDo6c3RyaW5nIGFuZHJvaWRfaXBjX3NvY2tldF9zdWZmaXhfOwotICBiYXNlOjpGaWxlUGF0aCBjcmVhdGVfaXBjX3NvY2tldF9wYXRoXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2V0dGluZ3MpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS9zd2l0Y2hlcy5oIGIvc2VydmljZS9zd2l0Y2hlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTE2NThjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2Uvc3dpdGNoZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugc3dpdGNoZXMgewotCi0vLyBMaXN0IG9mIGNvbW1hbmQtbGluZSBzd2l0Y2hlcyB1c2VkIGJ5IHRoZSBkYWVtb24uCi1jb25zdCBjaGFyIGtIZWxwTG9uZ1tdID0gImhlbHAiOwotY29uc3QgY2hhciBrSGVscFNob3J0W10gPSAiaCI7Ci1jb25zdCBjaGFyIGtBbmRyb2lkSVBDU29ja2V0U3VmZml4W10gPSAiYW5kcm9pZC1pcGMtc29ja2V0LXN1ZmZpeCI7Ci1jb25zdCBjaGFyIGtDcmVhdGVJUENTb2NrZXRQYXRoW10gPSAiY3JlYXRlLWlwYy1zb2NrZXQiOwotY29uc3QgY2hhciBrRW5hYmxlT25TdGFydFtdID0gImVuYWJsZS1vbi1zdGFydCI7Ci0KLWNvbnN0IGNoYXIga0hlbHBNZXNzYWdlW10gPQotICAgICJcbkJsdWV0b290aCBTeXN0ZW0gU2VydmljZVxuIgotICAgICJcbiIKLSAgICAiVXNhZ2U6XG4iCi0gICAgIlx0LS1oZWxwLC1oXHRcdFx0U2hvdyB0aGlzIGhlbHAgbWVzc2FnZVxuIgotICAgICJcdC0tYW5kcm9pZC1pcGMtc29ja2V0LXN1ZmZpeFx0U3VmZml4IG9mIHNvY2tldCBjcmVhdGVkIGJ5IEFuZHJvaWQgaW5pdC4gIgotICAgICJNdXR1YWxseSBleGNsdXNpdmUgd2l0aCAtLWNyZWF0ZS1pcGMtc29ja2V0LlxuIgotICAgICJcdC0tY3JlYXRlLWlwYy1zb2NrZXRcdFx0U29ja2V0IHBhdGggY3JlYXRlZCBmb3IgVW5peCBkb21haW4gc29ja2V0IGJhc2VkICIKLSAgICAiSVBDLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCAtLWFuZHJvaWQtaXBjLXNvY2tldC1zdWZmaXguXG4iCi0gICAgIlx0LS1lbmFibGUtb24tc3RhcnQgKHRydWV8ZmFsc2UpXHRJZiB0cnVlLCBlbmFibGUgYWRhcHRlciBhcyBzb29uIGFzIHRoZSAiCi0gICAgImRhZW1vbiBzdGFydHMuXG4iCi0gICAgIlx0LS12XHRcdFx0XHRMb2cgdmVyYm9zaXR5IGxldmVsIChlLmcuIC12PTEpXG4iOwotCi19ICAvLyBuYW1lc3BhY2Ugc3dpdGNoZXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9QYXJjZWxhYmxlVGVzdC5haWRsIGIvc2VydmljZS90ZXN0L1BhcmNlbGFibGVUZXN0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWFhZGYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L1BhcmNlbGFibGVUZXN0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qIFRoaXMgZmlsZSBpcyBqdXN0IGEgdGVzdCB0byBtYWtlIHN1cmUgYWxsIHBhcmNlbGFibGVzCi0gKiBhcmUgY29ycmVjdC4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhleSdyZSB1c2VkIGluCi0gKiByZWFsIEFJREwgZmlsZXMuCi0gKi8KLQotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkFkdmVydGlzZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQWR2ZXJ0aXNlU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dENoYXJhY3RlcmlzdGljOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHREZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEdhdHRJbmNsdWRlZFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoR2F0dFNlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguU2NhbkZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5TY2FuUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLlNjYW5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5VVUlEOwotCi1pbnRlcmZhY2UgUGFyY2VsYWJsZVRlc3QgewotICB2b2lkIE9uQWR2ZXJ0aXNlRGF0YShpbiBBZHZlcnRpc2VEYXRhIGFkdmVydGlzZV9kYXRhKTsKLSAgdm9pZCBPbkFkdmVydGlzZVNldHRpbmdzKGluIEFkdmVydGlzZVNldHRpbmdzIGFkdmVydGlzZV9zZXR0aW5ncyk7Ci0gIHZvaWQgT25TY2FuRmlsdGVyKGluIFNjYW5GaWx0ZXIgc2Nhbl9maWx0ZXIpOwotICB2b2lkIE9uU2NhblJlc3VsdChpbiBTY2FuUmVzdWx0IHNjYW5fcmVzdWx0KTsKLSAgdm9pZCBPblNjYW5TZXR0aW5ncyhpbiBTY2FuU2V0dGluZ3Mgc2Nhbl9zZXR0aW5ncyk7Ci0gIHZvaWQgT25VVUlEKGluIFVVSUQgdXVpZCk7Ci0gIHZvaWQgT25EZXNjcmlwb3IoaW4gQmx1ZXRvb3RoR2F0dERlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0gIHZvaWQgT25DaGFyYWN0ZXJpc3RpYyhpbiBCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWMgY2hhcmFjdGVyaXN0aWMpOwotICB2b2lkIE9uSW5jbHVkZWRTZXJ2aWNlKGluIEJsdWV0b290aEdhdHRJbmNsdWRlZFNlcnZpY2Ugc2VydmljZSk7Ci0gIHZvaWQgT25TZXJ2aWNlKGluIEJsdWV0b290aEdhdHRTZXJ2aWNlIHNlcnZpY2UpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZS90ZXN0L2EyZHBfc2lua191bml0dGVzdC5jYyBiL3NlcnZpY2UvdGVzdC9hMmRwX3NpbmtfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWUxMTIuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L2EyZHBfc2lua191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE3IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvYTJkcF9zaW5rLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9hdl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBNb2NrQTJkcFNpbmtIYW5kbGVyCi0gICAgOiBwdWJsaWMgaGFsOjpGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OlRlc3RBMmRwU2lua0hhbmRsZXIgewotIHB1YmxpYzoKLSAgTW9ja0EyZHBTaW5rSGFuZGxlcigpID0gZGVmYXVsdDsKLSAgfk1vY2tBMmRwU2lua0hhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QxKENvbm5lY3QsIGJ0X3N0YXR1c190KFJhd0FkZHJlc3MpKTsKLSAgTU9DS19NRVRIT0QxKERpc2Nvbm5lY3QsIGJ0X3N0YXR1c190KFJhd0FkZHJlc3MpKTsKLSAgTU9DS19NRVRIT0QxKFNldEF1ZGlvRm9jdXNTdGF0ZSwgdm9pZChpbnQpKTsKLSAgTU9DS19NRVRIT0QxKFNldEF1ZGlvVHJhY2tHYWluLCB2b2lkKGZsb2F0KSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0EyZHBTaW5rSGFuZGxlcik7Ci19OwotCi1jbGFzcyBUZXN0RGVsZWdhdGUgOiBwdWJsaWMgQTJkcFNpbms6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIFRlc3REZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLSAgflRlc3REZWxlZ2F0ZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBzdHJ1Y3QgUmVxdWVzdERhdGEgewotICAgIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzOwotICAgIGludCBzdGF0ZSA9IC0xOwotICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKLSAgICB1aW50OF90IGNoYW5uZWxfY291bnQgPSAwOwotICAgIGludCBjb3VudCA9IDA7Ci0gIH07Ci0KLSAgLy8gQTJkcFNpbms6OkRlbGVnYXRlIGltcGxlbWVudGF0aW9uOgotICB2b2lkIE9uQ29ubmVjdGlvblN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUpIG92ZXJyaWRlIHsKLSAgICArK2Nvbm5lY3Rpb25fc3RhdGVfLmNvdW50OwotICAgIGNvbm5lY3Rpb25fc3RhdGVfLmRldmljZV9hZGRyZXNzID0gZGV2aWNlX2FkZHJlc3M7Ci0gICAgY29ubmVjdGlvbl9zdGF0ZV8uc3RhdGUgPSBzdGF0ZTsKLSAgfQotICB2b2lkIE9uQXVkaW9TdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgICsrYXVkaW9fc3RhdGVfLmNvdW50OwotICAgIGF1ZGlvX3N0YXRlXy5kZXZpY2VfYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOwotICAgIGF1ZGlvX3N0YXRlXy5zdGF0ZSA9IHN0YXRlOwotICB9Ci0gIHZvaWQgT25BdWRpb0NvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIHVpbnQzMl90IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2NvdW50KSBvdmVycmlkZSB7Ci0gICAgKythdWRpb19jb25maWdfLmNvdW50OwotICAgIGF1ZGlvX2NvbmZpZ18uZGV2aWNlX2FkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICBhdWRpb19jb25maWdfLnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0gICAgYXVkaW9fY29uZmlnXy5jaGFubmVsX2NvdW50ID0gY2hhbm5lbF9jb3VudDsKLSAgfQotCi0gIGNvbnN0IFJlcXVlc3REYXRhJiBjb25uZWN0aW9uX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gY29ubmVjdGlvbl9zdGF0ZV87IH0KLSAgY29uc3QgUmVxdWVzdERhdGEmIGF1ZGlvX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gYXVkaW9fc3RhdGVfOyB9Ci0gIGNvbnN0IFJlcXVlc3REYXRhJiBhdWRpb19jb25maWcoKSBjb25zdCB7IHJldHVybiBhdWRpb19jb25maWdfOyB9Ci0KLSBwcml2YXRlOgotICBSZXF1ZXN0RGF0YSBjb25uZWN0aW9uX3N0YXRlXzsKLSAgUmVxdWVzdERhdGEgYXVkaW9fc3RhdGVfOwotICBSZXF1ZXN0RGF0YSBhdWRpb19jb25maWdfOwotfTsKLQotY2xhc3MgQTJkcFNpbmtUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBBMmRwU2lua1Rlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5BMmRwU2lua1Rlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtb2NrX2hhbmRsZXJfLnJlc2V0KG5ldyBNb2NrQTJkcFNpbmtIYW5kbGVyKCkpOwotICAgIGZha2VfaGFsX2F2X2lmYWNlXyA9IG5ldyBoYWw6OkZha2VCbHVldG9vdGhBdkludGVyZmFjZShtb2NrX2hhbmRsZXJfKTsKLSAgICBoYWw6OkJsdWV0b290aEF2SW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZyhmYWtlX2hhbF9hdl9pZmFjZV8pOwotICAgIGZhY3RvcnlfLnJlc2V0KG5ldyBBMmRwU2lua0ZhY3RvcnkoKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGZhY3RvcnlfLnJlc2V0KCk7Ci0gICAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6Q2xlYW5VcCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGhhbDo6RmFrZUJsdWV0b290aEF2SW50ZXJmYWNlKiBmYWtlX2hhbF9hdl9pZmFjZV87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxNb2NrQTJkcFNpbmtIYW5kbGVyPiBtb2NrX2hhbmRsZXJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNpbmtGYWN0b3J5PiBmYWN0b3J5XzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBMmRwU2lua1Rlc3QpOwotfTsKLQotY2xhc3MgQTJkcFNpbmtQb3N0UmVnaXN0ZXJUZXN0IDogcHVibGljIEEyZHBTaW5rVGVzdCB7Ci0gcHVibGljOgotICBBMmRwU2lua1Bvc3RSZWdpc3RlclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5BMmRwU2lua1Bvc3RSZWdpc3RlclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBMmRwU2lua1Rlc3Q6OlNldFVwKCk7Ci0gICAgVXVpZCB1dWlkID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gICAgYXV0byBjYWxsYmFjayA9IFsmXShCTEVTdGF0dXMgc3RhdHVzLCBjb25zdCBVdWlkJiBpbl91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsdWV0b290aEluc3RhbmNlPiBpbl9jbGllbnQpIHsKLSAgICAgIENIRUNLKGluX3V1aWQgPT0gdXVpZCk7Ci0gICAgICBDSEVDSyhpbl9jbGllbnQuZ2V0KCkpOwotICAgICAgQ0hFQ0soc3RhdHVzID09IEJMRV9TVEFUVVNfU1VDQ0VTUyk7Ci0KLSAgICAgIGEyZHBfc2lua18gPSBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNpbms+KAotICAgICAgICAgIHN0YXRpY19jYXN0PEEyZHBTaW5rKj4oaW5fY2xpZW50LnJlbGVhc2UoKSkpOwotICAgIH07Ci0KLSAgICBmYWN0b3J5Xy0+UmVnaXN0ZXJJbnN0YW5jZSh1dWlkLCBjYWxsYmFjayk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGEyZHBfc2lua18gPSBudWxscHRyOwotICAgIEEyZHBTaW5rVGVzdDo6VGVhckRvd24oKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIENvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIpIHsKLSAgICBSYXdBZGRyZXNzIGhhbF9hZGRyOwotICAgIEFTU0VSVF9UUlVFKFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoYWRkciwgaGFsX2FkZHIpKTsKLQotICAgIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBDb25uZWN0KGhhbF9hZGRyKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotCi0gICAgRVhQRUNUX1RSVUUoYTJkcF9zaW5rXy0+Q29ubmVjdChhZGRyKSk7Ci0gIH0KLQotICB2b2lkIERpc2Nvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHIpIHsKLSAgICBSYXdBZGRyZXNzIGhhbF9hZGRyOwotICAgIEFTU0VSVF9UUlVFKFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoYWRkciwgaGFsX2FkZHIpKTsKLQotICAgIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBEaXNjb25uZWN0KGhhbF9hZGRyKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotCi0gICAgRVhQRUNUX1RSVUUoYTJkcF9zaW5rXy0+RGlzY29ubmVjdChhZGRyKSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNpbms+IGEyZHBfc2lua187Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQTJkcFNpbmtQb3N0UmVnaXN0ZXJUZXN0KTsKLX07Ci0KLVRFU1RfRihBMmRwU2lua1Rlc3QsIFJlZ2lzdGVyQTJkcFNpbmspIHsKLSAgLy8gVGhlc2Ugd2lsbCBiZSBhc3luY2hyb25vdXNseSBwb3B1bGF0ZSB3aXRoIGEgcmVzdWx0IHdoZW4gdGhlIGNhbGxiYWNrCi0gIC8vIGV4ZWN1dGVzLgotICBCTEVTdGF0dXMgc3RhdHVzID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICBVdWlkIGNiX3V1aWQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBMmRwU2luaz4gYTJkcF9zaW5rOwotICBpbnQgY2FsbGJhY2tfY291bnQgPSAwOwotCi0gIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIGluX3N0YXR1cywgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Qmx1ZXRvb3RoSW5zdGFuY2U+IGluX2EyZHBfc2luaykgewotICAgIHN0YXR1cyA9IGluX3N0YXR1czsKLSAgICBjYl91dWlkID0gdXVpZDsKLSAgICBhMmRwX3NpbmsgPSBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNpbms+KAotICAgICAgICBzdGF0aWNfY2FzdDxBMmRwU2luayo+KGluX2EyZHBfc2luay5yZWxlYXNlKCkpKTsKLSAgICBjYWxsYmFja19jb3VudCsrOwotICB9OwotCi0gIFV1aWQgdXVpZDAgPSBVdWlkOjpHZXRSYW5kb20oKTsKLQotICAvLyBUaGlzIHNob3VsZCBhbHdheXMgc3VjY2VlZC4KLSAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDAsIGNhbGxiYWNrKSk7Ci0gIEVYUEVDVF9FUSgxLCBjYWxsYmFja19jb3VudCk7Ci0KLSAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgQVNTRVJUX1RSVUUoYTJkcF9zaW5rLmdldCgpICE9Ci0gICAgICAgICAgICAgIG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX1NVQ0NFU1MsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUShibHVldG9vdGg6OkEyZHBTaW5rOjprU2luZ2xldG9uSW5zdGFuY2VJZCwKLSAgICAgICAgICAgIGEyZHBfc2luay0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBhMmRwX3NpbmstPkdldEFwcElkZW50aWZpZXIoKSk7Ci0gIEVYUEVDVF9FUSh1dWlkMCwgY2JfdXVpZCk7Ci0KLSAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihBMmRwU2lua1Bvc3RSZWdpc3RlclRlc3QsIENvbm5lY3QpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RBZGRyW10gPSAiQUE6QkI6Q0M6REQ6RUU6RkYiOwotICBDb25uZWN0KGtUZXN0QWRkcik7Ci0gIERpc2Nvbm5lY3Qoa1Rlc3RBZGRyKTsKLX0KLQotVEVTVF9GKEEyZHBTaW5rUG9zdFJlZ2lzdGVyVGVzdCwgU2V0QXVkaW9Gb2N1c1N0YXRlKSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0QWRkcltdID0gIkFBOkJCOkNDOkREOkVFOkZGIjsKLSAgc3RhdGljIGNvbnN0IGludCBrRm9jdXNTdGF0ZSA9IDI7Ci0gIENvbm5lY3Qoa1Rlc3RBZGRyKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2V0QXVkaW9Gb2N1c1N0YXRlKGtGb2N1c1N0YXRlKSk7Ci0gIGEyZHBfc2lua18tPlNldEF1ZGlvRm9jdXNTdGF0ZShrRm9jdXNTdGF0ZSk7Ci0KLSAgRGlzY29ubmVjdChrVGVzdEFkZHIpOwotfQotCi1URVNUX0YoQTJkcFNpbmtQb3N0UmVnaXN0ZXJUZXN0LCBTZXRBdWRpb1RyYWNrR2FpbikgewotICBzdGF0aWMgY29uc3QgY2hhciBrVGVzdEFkZHJbXSA9ICJBQTpCQjpDQzpERDpFRTpGRiI7Ci0gIHN0YXRpYyBjb25zdCBmbG9hdCBrVHJhY2tHYWluID0gMC41OwotICBDb25uZWN0KGtUZXN0QWRkcik7Ci0KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFNldEF1ZGlvVHJhY2tHYWluKGtUcmFja0dhaW4pKTsKLSAgYTJkcF9zaW5rXy0+U2V0QXVkaW9UcmFja0dhaW4oa1RyYWNrR2Fpbik7Ci0KLSAgRGlzY29ubmVjdChrVGVzdEFkZHIpOwotfQotCi1URVNUX0YoQTJkcFNpbmtQb3N0UmVnaXN0ZXJUZXN0LCBDYWxsYmFja1Rlc3QpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RBZGRyW10gPSAiQUE6QkI6Q0M6REQ6RUU6RkYiOwotICBSYXdBZGRyZXNzIGhhbF9hZGRyOwotICBBU1NFUlRfVFJVRShSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkciwgaGFsX2FkZHIpKTsKLQotICBUZXN0RGVsZWdhdGUgZGVsZWdhdGU7Ci0gIGEyZHBfc2lua18tPlNldERlbGVnYXRlKCZkZWxlZ2F0ZSk7Ci0gIENvbm5lY3Qoa1Rlc3RBZGRyKTsKLQotICAvLyBPbkNvbm5lY3Rpb25TdGF0ZQotICBjb25zdCBpbnQga0Nvbm5lY3Rpb25TdGF0ZSA9IDI7Ci0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5jb25uZWN0aW9uX3N0YXRlKCkuY291bnQpOwotICBmYWtlX2hhbF9hdl9pZmFjZV8tPk5vdGlmeUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgIGhhbF9hZGRyLCBzdGF0aWNfY2FzdDxidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdD4oa0Nvbm5lY3Rpb25TdGF0ZSkpOwotICBFWFBFQ1RfRVEoMSwgZGVsZWdhdGUuY29ubmVjdGlvbl9zdGF0ZSgpLmNvdW50KTsKLSAgRVhQRUNUX0VRKGtUZXN0QWRkciwgZGVsZWdhdGUuY29ubmVjdGlvbl9zdGF0ZSgpLmRldmljZV9hZGRyZXNzKTsKLSAgRVhQRUNUX0VRKGtDb25uZWN0aW9uU3RhdGUsIGRlbGVnYXRlLmNvbm5lY3Rpb25fc3RhdGUoKS5zdGF0ZSk7Ci0KLSAgLy8gT25BdWRpb1N0YXRlCi0gIGNvbnN0IGludCBrQXVkaW9TdGF0ZSA9IDE7Ci0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5hdWRpb19zdGF0ZSgpLmNvdW50KTsKLSAgZmFrZV9oYWxfYXZfaWZhY2VfLT5Ob3RpZnlBdWRpb1N0YXRlKAotICAgICAgaGFsX2FkZHIsIHN0YXRpY19jYXN0PGJ0YXZfYXVkaW9fc3RhdGVfdD4oa0F1ZGlvU3RhdGUpKTsKLSAgRVhQRUNUX0VRKDEsIGRlbGVnYXRlLmF1ZGlvX3N0YXRlKCkuY291bnQpOwotICBFWFBFQ1RfRVEoa1Rlc3RBZGRyLCBkZWxlZ2F0ZS5hdWRpb19zdGF0ZSgpLmRldmljZV9hZGRyZXNzKTsKLSAgRVhQRUNUX0VRKGtBdWRpb1N0YXRlLCBkZWxlZ2F0ZS5hdWRpb19zdGF0ZSgpLnN0YXRlKTsKLQotICAvLyBPbkF1ZGlvQ29uZmlnCi0gIGNvbnN0IHVpbnQzMl90IGtTYW1wbGVSYXRlID0gNDQxMDA7Ci0gIGNvbnN0IHVpbnQzMl90IGtDaGFubmVsQ291bnQgPSAyOwotICBFWFBFQ1RfRVEoMCwgZGVsZWdhdGUuYXVkaW9fY29uZmlnKCkuY291bnQpOwotICBmYWtlX2hhbF9hdl9pZmFjZV8tPk5vdGlmeUF1ZGlvQ29uZmlnKGhhbF9hZGRyLCBrU2FtcGxlUmF0ZSwga0NoYW5uZWxDb3VudCk7Ci0gIEVYUEVDVF9FUSgxLCBkZWxlZ2F0ZS5hdWRpb19jb25maWcoKS5jb3VudCk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkZHIsIGRlbGVnYXRlLmF1ZGlvX2NvbmZpZygpLmRldmljZV9hZGRyZXNzKTsKLSAgRVhQRUNUX0VRKGtTYW1wbGVSYXRlLCBkZWxlZ2F0ZS5hdWRpb19jb25maWcoKS5zYW1wbGVfcmF0ZSk7Ci0gIEVYUEVDVF9FUShrQ2hhbm5lbENvdW50LCBkZWxlZ2F0ZS5hdWRpb19jb25maWcoKS5jaGFubmVsX2NvdW50KTsKLQotICBEaXNjb25uZWN0KGtUZXN0QWRkcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS90ZXN0L2EyZHBfc291cmNlX3VuaXR0ZXN0LmNjIGIvc2VydmljZS90ZXN0L2EyZHBfc291cmNlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWVkZTgxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvdGVzdC9hMmRwX3NvdXJjZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2VydmljZS9hMmRwX3NvdXJjZS5oIgotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfYXZfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW9ja0EyZHBTb3VyY2VIYW5kbGVyCi0gICAgOiBwdWJsaWMgaGFsOjpGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2U6OlRlc3RBMmRwU291cmNlSGFuZGxlciB7Ci0gcHVibGljOgotICBNb2NrQTJkcFNvdXJjZUhhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0gIH5Nb2NrQTJkcFNvdXJjZUhhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QxKENvbm5lY3QsIGJ0X3N0YXR1c190KFJhd0FkZHJlc3MpKTsKLSAgTU9DS19NRVRIT0QxKERpc2Nvbm5lY3QsIGJ0X3N0YXR1c190KFJhd0FkZHJlc3MpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrQTJkcFNvdXJjZUhhbmRsZXIpOwotfTsKLQotY2xhc3MgVGVzdERlbGVnYXRlIDogcHVibGljIEEyZHBTb3VyY2U6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIFRlc3REZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLSAgflRlc3REZWxlZ2F0ZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBzdHJ1Y3QgUmVxdWVzdERhdGEgewotICAgIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzOwotICAgIGludCBzdGF0ZSA9IC0xOwotICAgIGludCBjb3VudCA9IDA7Ci0gIH07Ci0KLSAgLy8gQTJkcFNvdXJjZTo6RGVsZWdhdGUgaW1wbGVtZW50YXRpb246Ci0gIHZvaWQgT25Db25uZWN0aW9uU3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSkgb3ZlcnJpZGUgewotICAgICsrY29ubmVjdGlvbl9zdGF0ZV8uY291bnQ7Ci0gICAgY29ubmVjdGlvbl9zdGF0ZV8uZGV2aWNlX2FkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICBjb25uZWN0aW9uX3N0YXRlXy5zdGF0ZSA9IHN0YXRlOwotICB9Ci0gIHZvaWQgT25BdWRpb1N0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywgaW50IHN0YXRlKSBvdmVycmlkZSB7Ci0gICAgKythdWRpb19zdGF0ZV8uY291bnQ7Ci0gICAgYXVkaW9fc3RhdGVfLmRldmljZV9hZGRyZXNzID0gZGV2aWNlX2FkZHJlc3M7Ci0gICAgYXVkaW9fc3RhdGVfLnN0YXRlID0gc3RhdGU7Ci0gIH0KLSAgdm9pZCBPbkF1ZGlvQ29uZmlnKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBBMmRwQ29kZWNDb25maWcgY29kZWNfY29uZmlnLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QTJkcENvZGVjQ29uZmlnPiYgY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEEyZHBDb2RlY0NvbmZpZz4mIGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcykKLSAgICAgIG92ZXJyaWRlIHsKLSAgICArK2F1ZGlvX2NvbmZpZ18uY291bnQ7Ci0gICAgYXVkaW9fY29uZmlnXy5kZXZpY2VfYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOwotICB9Ci0KLSAgY29uc3QgUmVxdWVzdERhdGEmIGNvbm5lY3Rpb25fc3RhdGUoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uX3N0YXRlXzsgfQotICBjb25zdCBSZXF1ZXN0RGF0YSYgYXVkaW9fc3RhdGUoKSBjb25zdCB7IHJldHVybiBhdWRpb19zdGF0ZV87IH0KLSAgY29uc3QgUmVxdWVzdERhdGEmIGF1ZGlvX2NvbmZpZygpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvX2NvbmZpZ187IH0KLQotIHByaXZhdGU6Ci0gIFJlcXVlc3REYXRhIGNvbm5lY3Rpb25fc3RhdGVfOwotICBSZXF1ZXN0RGF0YSBhdWRpb19zdGF0ZV87Ci0gIFJlcXVlc3REYXRhIGF1ZGlvX2NvbmZpZ187Ci19OwotCi1jbGFzcyBBMmRwU291cmNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQTJkcFNvdXJjZVRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5BMmRwU291cmNlVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1vY2tfaGFuZGxlcl8ucmVzZXQobmV3IE1vY2tBMmRwU291cmNlSGFuZGxlcigpKTsKLSAgICBmYWtlX2hhbF9hdl9pZmFjZV8gPSBuZXcgaGFsOjpGYWtlQmx1ZXRvb3RoQXZJbnRlcmZhY2UobW9ja19oYW5kbGVyXyk7Ci0gICAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6SW5pdGlhbGl6ZUZvclRlc3RpbmcoZmFrZV9oYWxfYXZfaWZhY2VfKTsKLSAgICBmYWN0b3J5Xy5yZXNldChuZXcgQTJkcFNvdXJjZUZhY3RvcnkoKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGZhY3RvcnlfLnJlc2V0KCk7Ci0gICAgaGFsOjpCbHVldG9vdGhBdkludGVyZmFjZTo6Q2xlYW5VcCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGhhbDo6RmFrZUJsdWV0b290aEF2SW50ZXJmYWNlKiBmYWtlX2hhbF9hdl9pZmFjZV87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxNb2NrQTJkcFNvdXJjZUhhbmRsZXI+IG1vY2tfaGFuZGxlcl87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBMmRwU291cmNlRmFjdG9yeT4gZmFjdG9yeV87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQTJkcFNvdXJjZVRlc3QpOwotfTsKLQotY2xhc3MgQTJkcFNvdXJjZVBvc3RSZWdpc3RlclRlc3QgOiBwdWJsaWMgQTJkcFNvdXJjZVRlc3QgewotIHB1YmxpYzoKLSAgQTJkcFNvdXJjZVBvc3RSZWdpc3RlclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5BMmRwU291cmNlUG9zdFJlZ2lzdGVyVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIEEyZHBTb3VyY2VUZXN0OjpTZXRVcCgpOwotICAgIFV1aWQgdXVpZCA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICAgIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIHN0YXR1cywgY29uc3QgVXVpZCYgaW5fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhJbnN0YW5jZT4gaW5fY2xpZW50KSB7Ci0gICAgICBDSEVDSyhpbl91dWlkID09IHV1aWQpOwotICAgICAgQ0hFQ0soaW5fY2xpZW50LmdldCgpKTsKLSAgICAgIENIRUNLKHN0YXR1cyA9PSBCTEVfU1RBVFVTX1NVQ0NFU1MpOwotCi0gICAgICBhMmRwX3NvdXJjZV8gPSBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNvdXJjZT4oCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8QTJkcFNvdXJjZSo+KGluX2NsaWVudC5yZWxlYXNlKCkpKTsKLSAgICB9OwotCi0gICAgZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZCwgY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBhMmRwX3NvdXJjZV8gPSBudWxscHRyOwotICAgIEEyZHBTb3VyY2VUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgQ29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcikgewotICAgIFJhd0FkZHJlc3MgaGFsX2FkZHI7Ci0gICAgQVNTRVJUX1RSVUUoUmF3QWRkcmVzczo6RnJvbVN0cmluZyhhZGRyLCBoYWxfYWRkcikpOwotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIENvbm5lY3QoaGFsX2FkZHIpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19TVUNDRVNTKSk7Ci0KLSAgICBFWFBFQ1RfVFJVRShhMmRwX3NvdXJjZV8tPkNvbm5lY3QoYWRkcikpOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyKSB7Ci0gICAgUmF3QWRkcmVzcyBoYWxfYWRkcjsKLSAgICBBU1NFUlRfVFJVRShSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGFkZHIsIGhhbF9hZGRyKSk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgRGlzY29ubmVjdChoYWxfYWRkcikpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLQotICAgIEVYUEVDVF9UUlVFKGEyZHBfc291cmNlXy0+RGlzY29ubmVjdChhZGRyKSk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNvdXJjZT4gYTJkcF9zb3VyY2VfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEEyZHBTb3VyY2VQb3N0UmVnaXN0ZXJUZXN0KTsKLX07Ci0KLVRFU1RfRihBMmRwU291cmNlVGVzdCwgUmVnaXN0ZXJBMmRwU291cmNlKSB7Ci0gIC8vIFRoZXNlIHdpbGwgYmUgYXN5bmNocm9ub3VzbHkgcG9wdWxhdGUgd2l0aCBhIHJlc3VsdCB3aGVuIHRoZSBjYWxsYmFjawotICAvLyBleGVjdXRlcy4KLSAgQkxFU3RhdHVzIHN0YXR1cyA9IEJMRV9TVEFUVVNfU1VDQ0VTUzsKLSAgVXVpZCBjYl91dWlkOwotICBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNvdXJjZT4gYTJkcF9zb3VyY2U7Ci0gIGludCBjYWxsYmFja19jb3VudCA9IDA7Ci0KLSAgYXV0byBjYWxsYmFjayA9IFsmXShCTEVTdGF0dXMgaW5fc3RhdHVzLCBjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhJbnN0YW5jZT4gaW5fYTJkcF9zb3VyY2UpIHsKLSAgICBzdGF0dXMgPSBpbl9zdGF0dXM7Ci0gICAgY2JfdXVpZCA9IHV1aWQ7Ci0gICAgYTJkcF9zb3VyY2UgPSBzdGQ6OnVuaXF1ZV9wdHI8QTJkcFNvdXJjZT4oCi0gICAgICAgIHN0YXRpY19jYXN0PEEyZHBTb3VyY2UqPihpbl9hMmRwX3NvdXJjZS5yZWxlYXNlKCkpKTsKLSAgICBjYWxsYmFja19jb3VudCsrOwotICB9OwotCi0gIFV1aWQgdXVpZDAgPSBVdWlkOjpHZXRSYW5kb20oKTsKLQotICAvLyBUaGlzIHNob3VsZCBhbHdheXMgc3VjY2VlZC4KLSAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDAsIGNhbGxiYWNrKSk7Ci0gIEVYUEVDVF9FUSgxLCBjYWxsYmFja19jb3VudCk7Ci0KLSAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgQVNTRVJUX1RSVUUoYTJkcF9zb3VyY2UuZ2V0KCkgIT0KLSAgICAgICAgICAgICAgbnVsbHB0cik7ICAvLyBBc3NlcnQgdG8gdGVybWluYXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgRVhQRUNUX0VRKEJMRV9TVEFUVVNfU1VDQ0VTUywgc3RhdHVzKTsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QTJkcFNvdXJjZTo6a1NpbmdsZXRvbkluc3RhbmNlSWQsCi0gICAgICAgICAgICBhMmRwX3NvdXJjZS0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBhMmRwX3NvdXJjZS0+R2V0QXBwSWRlbnRpZmllcigpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBjYl91dWlkKTsKLQotICB0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLX0KLQotVEVTVF9GKEEyZHBTb3VyY2VQb3N0UmVnaXN0ZXJUZXN0LCBDb25uZWN0KSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0QWRkcltdID0gIkFBOkJCOkNDOkREOkVFOkZGIjsKLSAgQ29ubmVjdChrVGVzdEFkZHIpOwotICBEaXNjb25uZWN0KGtUZXN0QWRkcik7Ci19Ci0KLVRFU1RfRihBMmRwU291cmNlUG9zdFJlZ2lzdGVyVGVzdCwgQ2FsbGJhY2tUZXN0KSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0QWRkcltdID0gIkFBOkJCOkNDOkREOkVFOkZGIjsKLSAgUmF3QWRkcmVzcyBoYWxfYWRkcjsKLSAgQVNTRVJUX1RSVUUoUmF3QWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIsIGhhbF9hZGRyKSk7Ci0KLSAgVGVzdERlbGVnYXRlIGRlbGVnYXRlOwotICBhMmRwX3NvdXJjZV8tPlNldERlbGVnYXRlKCZkZWxlZ2F0ZSk7Ci0gIENvbm5lY3Qoa1Rlc3RBZGRyKTsKLQotICAvLyBPbkNvbm5lY3Rpb25TdGF0ZQotICBjb25zdCBpbnQga0Nvbm5lY3Rpb25TdGF0ZSA9IDI7Ci0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5jb25uZWN0aW9uX3N0YXRlKCkuY291bnQpOwotICBmYWtlX2hhbF9hdl9pZmFjZV8tPk5vdGlmeUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgIGhhbF9hZGRyLCBzdGF0aWNfY2FzdDxidGF2X2Nvbm5lY3Rpb25fc3RhdGVfdD4oa0Nvbm5lY3Rpb25TdGF0ZSkpOwotICBFWFBFQ1RfRVEoMSwgZGVsZWdhdGUuY29ubmVjdGlvbl9zdGF0ZSgpLmNvdW50KTsKLSAgRVhQRUNUX0VRKGtUZXN0QWRkciwgZGVsZWdhdGUuY29ubmVjdGlvbl9zdGF0ZSgpLmRldmljZV9hZGRyZXNzKTsKLSAgRVhQRUNUX0VRKGtDb25uZWN0aW9uU3RhdGUsIGRlbGVnYXRlLmNvbm5lY3Rpb25fc3RhdGUoKS5zdGF0ZSk7Ci0KLSAgLy8gT25BdWRpb1N0YXRlCi0gIGNvbnN0IGludCBrQXVkaW9TdGF0ZSA9IDE7Ci0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5hdWRpb19zdGF0ZSgpLmNvdW50KTsKLSAgZmFrZV9oYWxfYXZfaWZhY2VfLT5Ob3RpZnlBdWRpb1N0YXRlKAotICAgICAgaGFsX2FkZHIsIHN0YXRpY19jYXN0PGJ0YXZfYXVkaW9fc3RhdGVfdD4oa0F1ZGlvU3RhdGUpKTsKLSAgRVhQRUNUX0VRKDEsIGRlbGVnYXRlLmF1ZGlvX3N0YXRlKCkuY291bnQpOwotICBFWFBFQ1RfRVEoa1Rlc3RBZGRyLCBkZWxlZ2F0ZS5hdWRpb19zdGF0ZSgpLmRldmljZV9hZGRyZXNzKTsKLSAgRVhQRUNUX0VRKGtBdWRpb1N0YXRlLCBkZWxlZ2F0ZS5hdWRpb19zdGF0ZSgpLnN0YXRlKTsKLQotICAvLyBPbkF1ZGlvQ29uZmlnCi0gIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWd7fTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzKDApOwotICBjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcygwKTsKLSAgRVhQRUNUX0VRKDAsIGRlbGVnYXRlLmF1ZGlvX2NvbmZpZygpLmNvdW50KTsKLSAgZmFrZV9oYWxfYXZfaWZhY2VfLT5Ob3RpZnlBdWRpb0NvbmZpZyhoYWxfYWRkciwgY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKTsKLSAgRVhQRUNUX0VRKDEsIGRlbGVnYXRlLmF1ZGlvX2NvbmZpZygpLmNvdW50KTsKLSAgRVhQRUNUX0VRKGtUZXN0QWRkciwgZGVsZWdhdGUuYXVkaW9fY29uZmlnKCkuZGV2aWNlX2FkZHJlc3MpOwotCi0gIGZha2VfaGFsX2F2X2lmYWNlXy0+UXVlcnlNYW5kYXRvcnlDb2RlY1ByZWZlcnJlZChoYWxfYWRkcik7Ci0KLSAgRGlzY29ubmVjdChrVGVzdEFkZHIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9hZGFwdGVyX3VuaXR0ZXN0LmNjIGIvc2VydmljZS90ZXN0L2FkYXB0ZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjBhYmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L2FkYXB0ZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBBZGFwdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQWRhcHRlclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5BZGFwdGVyVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGZha2VfaGFsX21hbmFnZXJfID0gaGFsOjpGYWtlQmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXRNYW5hZ2VyKCk7Ci0gICAgZmFrZV9oYWxfaWZhY2VfID0gbmV3IGhhbDo6RmFrZUJsdWV0b290aEludGVyZmFjZSgpOwotICAgIGhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZyhmYWtlX2hhbF9pZmFjZV8pOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBHQVRUIGludGVyZmFjZSB3aXRoIGRlZmF1bHQgaGFuZGxlcnMuCi0gICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZygKLSAgICAgICAgbmV3IGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2UobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpOwotCi0gICAgYWRhcHRlcl8gPSBBZGFwdGVyOjpDcmVhdGUoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgYWRhcHRlcl8ucmVzZXQoKTsKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsZWFuVXAoKTsKLSAgICBoYWw6OkJsdWV0b290aEludGVyZmFjZTo6Q2xlYW5VcCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGhhbDo6RmFrZUJsdWV0b290aEludGVyZmFjZSogZmFrZV9oYWxfaWZhY2VfOwotICBoYWw6OkZha2VCbHVldG9vdGhJbnRlcmZhY2U6Ok1hbmFnZXIqIGZha2VfaGFsX21hbmFnZXJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8QWRhcHRlcj4gYWRhcHRlcl87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWRhcHRlclRlc3QpOwotfTsKLQotY2xhc3MgVGVzdE9ic2VydmVyIGZpbmFsIDogcHVibGljIGJsdWV0b290aDo6QWRhcHRlcjo6T2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGVzdE9ic2VydmVyKGJsdWV0b290aDo6QWRhcHRlciogYWRhcHRlcikKLSAgICAgIDogYWRhcHRlcl8oYWRhcHRlciksCi0gICAgICAgIHByZXZfc3RhdGVfKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9JTlZBTElEKSwKLSAgICAgICAgY3VyX3N0YXRlXyhibHVldG9vdGg6OkFEQVBURVJfU1RBVEVfSU5WQUxJRCksCi0gICAgICAgIGxhc3RfZGV2aWNlX2Nvbm5lY3RlZF9zdGF0ZV8oZmFsc2UpIHsKLSAgICBDSEVDSyhhZGFwdGVyXyk7Ci0gICAgYWRhcHRlcl8tPkFkZE9ic2VydmVyKHRoaXMpOwotICB9Ci0KLSAgflRlc3RPYnNlcnZlcigpIG92ZXJyaWRlIHsgYWRhcHRlcl8tPlJlbW92ZU9ic2VydmVyKHRoaXMpOyB9Ci0KLSAgYmx1ZXRvb3RoOjpBZGFwdGVyU3RhdGUgcHJldl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHByZXZfc3RhdGVfOyB9Ci0gIGJsdWV0b290aDo6QWRhcHRlclN0YXRlIGN1cl9zdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGN1cl9zdGF0ZV87IH0KLQotICBzdGQ6OnN0cmluZyBsYXN0X2Nvbm5lY3Rpb25fc3RhdGVfYWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbGFzdF9jb25uZWN0aW9uX3N0YXRlX2FkZHJlc3NfOwotICB9Ci0KLSAgYm9vbCBsYXN0X2RldmljZV9jb25uZWN0ZWRfc3RhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxhc3RfZGV2aWNlX2Nvbm5lY3RlZF9zdGF0ZV87Ci0gIH0KLQotICAvLyBibHVldG9vdGg6OkFkYXB0ZXI6Ok9ic2VydmVyIG92ZXJyaWRlOgotICB2b2lkIE9uQWRhcHRlclN0YXRlQ2hhbmdlZChibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6QWRhcHRlclN0YXRlIHByZXZfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6QWRhcHRlclN0YXRlIG5ld19zdGF0ZSkgb3ZlcnJpZGUgewotICAgIEFTU0VSVF9FUShhZGFwdGVyXywgYWRhcHRlcik7Ci0gICAgcHJldl9zdGF0ZV8gPSBwcmV2X3N0YXRlOwotICAgIGN1cl9zdGF0ZV8gPSBuZXdfc3RhdGU7Ci0gIH0KLQotICB2b2lkIE9uRGV2aWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZSB7Ci0gICAgQVNTRVJUX0VRKGFkYXB0ZXJfLCBhZGFwdGVyKTsKLSAgICBsYXN0X2Nvbm5lY3Rpb25fc3RhdGVfYWRkcmVzc18gPSBkZXZpY2VfYWRkcmVzczsKLSAgICBsYXN0X2RldmljZV9jb25uZWN0ZWRfc3RhdGVfID0gY29ubmVjdGVkOwotICB9Ci0KLSBwcml2YXRlOgotICBibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXJfOwotICBibHVldG9vdGg6OkFkYXB0ZXJTdGF0ZSBwcmV2X3N0YXRlXywgY3VyX3N0YXRlXzsKLSAgc3RkOjpzdHJpbmcgbGFzdF9jb25uZWN0aW9uX3N0YXRlX2FkZHJlc3NfOwotICBib29sIGxhc3RfZGV2aWNlX2Nvbm5lY3RlZF9zdGF0ZV87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRlc3RPYnNlcnZlcik7Ci19OwotCi1URVNUX0YoQWRhcHRlclRlc3QsIElzRW5hYmxlZCkgewotICBFWFBFQ1RfRkFMU0UoYWRhcHRlcl8tPklzRW5hYmxlZCgpKTsKLQotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFkYXB0ZXJTdGF0ZUNoYW5nZWQoQlRfU1RBVEVfT04pOwotICBFWFBFQ1RfVFJVRShhZGFwdGVyXy0+SXNFbmFibGVkKCkpOwotCi0gIGZha2VfaGFsX2lmYWNlXy0+Tm90aWZ5QWRhcHRlclN0YXRlQ2hhbmdlZChCVF9TVEFURV9PRkYpOwotICBFWFBFQ1RfRkFMU0UoYWRhcHRlcl8tPklzRW5hYmxlZCgpKTsKLX0KLQotVEVTVF9GKEFkYXB0ZXJUZXN0LCBFbmFibGUpIHsKLSAgVGVzdE9ic2VydmVyIG9ic2VydmVyKGFkYXB0ZXJfLmdldCgpKTsKLQotICBFWFBFQ1RfRkFMU0UoYWRhcHRlcl8tPklzRW5hYmxlZCgpKTsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9PRkYsIGFkYXB0ZXJfLT5HZXRTdGF0ZSgpKTsKLQotICAvLyBFbmFibGUgZmFpbHMgYXQgSEFMIGxldmVsCi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+RW5hYmxlKCkpOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09GRiwgYWRhcHRlcl8tPkdldFN0YXRlKCkpOwotCi0gIC8vIEVuYWJsZSBzdWNjZXNzCi0gIGZha2VfaGFsX21hbmFnZXJfLT5lbmFibGVfc3VjY2VlZCA9IHRydWU7Ci0gIEVYUEVDVF9UUlVFKGFkYXB0ZXJfLT5FbmFibGUoKSk7Ci0KLSAgLy8gU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBzdGF0ZSB1cGRhdGUuCi0gIEVYUEVDVF9FUShibHVldG9vdGg6OkFEQVBURVJfU1RBVEVfT0ZGLCBvYnNlcnZlci5wcmV2X3N0YXRlKCkpOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX1RVUk5JTkdfT04sIG9ic2VydmVyLmN1cl9zdGF0ZSgpKTsKLQotICAvLyBFbmFibGUgZmFpbHMgYmVjYXVzZSBub3QgZGlzYWJsZWQKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9UVVJOSU5HX09OLCBhZGFwdGVyXy0+R2V0U3RhdGUoKSk7Ci0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+RW5hYmxlKCkpOwotCi0gIC8vIEFkYXB0ZXIgc3RhdGUgdXBkYXRlcyBwcm9wZXJseQotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFkYXB0ZXJTdGF0ZUNoYW5nZWQoQlRfU1RBVEVfT04pOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09OLCBhZGFwdGVyXy0+R2V0U3RhdGUoKSk7Ci0KLSAgLy8gU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBzdGF0ZSB1cGRhdGUuCi0gIEVYUEVDVF9FUShibHVldG9vdGg6OkFEQVBURVJfU1RBVEVfVFVSTklOR19PTiwgb2JzZXJ2ZXIucHJldl9zdGF0ZSgpKTsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9PTiwgb2JzZXJ2ZXIuY3VyX3N0YXRlKCkpOwotCi0gIC8vIEVuYWJsZSBmYWlscyBiZWNhdXNlIGFscmVhZHkgZW5hYmxlZAotICBFWFBFQ1RfRkFMU0UoYWRhcHRlcl8tPkVuYWJsZSgpKTsKLX0KLQotVEVTVF9GKEFkYXB0ZXJUZXN0LCBEaXNhYmxlKSB7Ci0gIFRlc3RPYnNlcnZlciBvYnNlcnZlcihhZGFwdGVyXy5nZXQoKSk7Ci0KLSAgZmFrZV9oYWxfbWFuYWdlcl8tPmRpc2FibGVfc3VjY2VlZCA9IHRydWU7Ci0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+SXNFbmFibGVkKCkpOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09GRiwgYWRhcHRlcl8tPkdldFN0YXRlKCkpOwotCi0gIC8vIERpc2FibGUgZmFpbHMgYmVjYXVzZSBhbHJlYWR5IGRpc2FibGVkCi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+RGlzYWJsZSgpKTsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9PRkYsIGFkYXB0ZXJfLT5HZXRTdGF0ZSgpKTsKLQotICAvLyBEaXNhYmxlIHN1Y2Nlc3MKLSAgZmFrZV9oYWxfaWZhY2VfLT5Ob3RpZnlBZGFwdGVyU3RhdGVDaGFuZ2VkKEJUX1NUQVRFX09OKTsKLQotICAvLyBTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHN0YXRlIHVwZGF0ZS4KLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9PRkYsIG9ic2VydmVyLnByZXZfc3RhdGUoKSk7Ci0gIEVYUEVDVF9FUShibHVldG9vdGg6OkFEQVBURVJfU1RBVEVfT04sIG9ic2VydmVyLmN1cl9zdGF0ZSgpKTsKLQotICBFWFBFQ1RfVFJVRShhZGFwdGVyXy0+RGlzYWJsZSgpKTsKLQotICAvLyBTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHN0YXRlIHVwZGF0ZS4KLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9PTiwgb2JzZXJ2ZXIucHJldl9zdGF0ZSgpKTsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QURBUFRFUl9TVEFURV9UVVJOSU5HX09GRiwgb2JzZXJ2ZXIuY3VyX3N0YXRlKCkpOwotCi0gIC8vIERpc2FibGUgZmFpbHMgYmVjYXVzZSBub3QgZW5hYmxlZAotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX1RVUk5JTkdfT0ZGLCBhZGFwdGVyXy0+R2V0U3RhdGUoKSk7Ci0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+RGlzYWJsZSgpKTsKLQotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFkYXB0ZXJTdGF0ZUNoYW5nZWQoQlRfU1RBVEVfT04pOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09OLCBhZGFwdGVyXy0+R2V0U3RhdGUoKSk7Ci0KLSAgLy8gU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBzdGF0ZSB1cGRhdGUuCi0gIEVYUEVDVF9FUShibHVldG9vdGg6OkFEQVBURVJfU1RBVEVfVFVSTklOR19PRkYsIG9ic2VydmVyLnByZXZfc3RhdGUoKSk7Ci0gIEVYUEVDVF9FUShibHVldG9vdGg6OkFEQVBURVJfU1RBVEVfT04sIG9ic2VydmVyLmN1cl9zdGF0ZSgpKTsKLQotICAvLyBEaXNhYmxlIGZhaWxzIGF0IEhBTCBsZXZlbAotICBmYWtlX2hhbF9tYW5hZ2VyXy0+ZGlzYWJsZV9zdWNjZWVkID0gZmFsc2U7Ci0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+RGlzYWJsZSgpKTsKLQotICAvLyBTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHN0YXRlIHVwZGF0ZS4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgcmVjZWl2ZSB0d28KLSAgLy8gdXBkYXRlczogb25lIGdvaW5nIGZyb20gT0ZGIHRvIFRVUk5JTkdfT0ZGLCBhbmQgb25lIGdvaW5nIGZyb20gVFVSTklOR19PRkYKLSAgLy8gYmFjayB0byBPTiBzaW5jZSB3ZSBmYWlsZWQgdG8gaW5pdGlhdGUgdGhlIGRpc2FibGUgb3BlcmF0aW9uLgotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX1RVUk5JTkdfT0ZGLCBvYnNlcnZlci5wcmV2X3N0YXRlKCkpOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09OLCBvYnNlcnZlci5jdXJfc3RhdGUoKSk7Ci0KLSAgLy8gVXBkYXRlIHN0YXRlIHRvIE9GRi4gU2hvdWxkIHJlY2VpdmUgYSBzdGF0ZSB1cGRhdGUuCi0gIGZha2VfaGFsX2lmYWNlXy0+Tm90aWZ5QWRhcHRlclN0YXRlQ2hhbmdlZChCVF9TVEFURV9PRkYpOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09OLCBvYnNlcnZlci5wcmV2X3N0YXRlKCkpOwotICBFWFBFQ1RfRVEoYmx1ZXRvb3RoOjpBREFQVEVSX1NUQVRFX09GRiwgb2JzZXJ2ZXIuY3VyX3N0YXRlKCkpOwotfQotCi1URVNUX0YoQWRhcHRlclRlc3QsIEdldE5hbWUpIHsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QWRhcHRlcjo6a0RlZmF1bHROYW1lLCBhZGFwdGVyXy0+R2V0TmFtZSgpKTsKLQotICBjb25zdCBjaGFyIGtUZXN0QWRhcHRlck5hbWVbXSA9ICJUZXN0IEFkYXB0ZXIgTmFtZSI7Ci0KLSAgZmFrZV9oYWxfaWZhY2VfLT5Ob3RpZnlBZGFwdGVyTmFtZVByb3BlcnR5Q2hhbmdlZChrVGVzdEFkYXB0ZXJOYW1lKTsKLSAgRVhQRUNUX0VRKGtUZXN0QWRhcHRlck5hbWUsIGFkYXB0ZXJfLT5HZXROYW1lKCkpOwotfQotCi1URVNUX0YoQWRhcHRlclRlc3QsIFNldE5hbWUpIHsKLSAgYnRfYmRuYW1lX3QgaGFsX25hbWU7Ci0KLSAgLy8gTmFtZSB0b28gbGFyZ2UuCi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+U2V0TmFtZShzdGQ6OnN0cmluZyhzaXplb2YoaGFsX25hbWUubmFtZSksICdhJykpKTsKLQotICAvLyBWYWxpZCBsZW5ndGguCi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+U2V0TmFtZSgiVGVzdCBOYW1lIikpOwotICBmYWtlX2hhbF9tYW5hZ2VyXy0+c2V0X3Byb3BlcnR5X3N1Y2NlZWQgPSB0cnVlOwotICBFWFBFQ1RfVFJVRShhZGFwdGVyXy0+U2V0TmFtZSgiVGVzdCBOYW1lIikpOwotfQotCi1URVNUX0YoQWRhcHRlclRlc3QsIEdldEFkZHJlc3MpIHsKLSAgRVhQRUNUX0VRKGJsdWV0b290aDo6QWRhcHRlcjo6a0RlZmF1bHRBZGRyZXNzLCBhZGFwdGVyXy0+R2V0QWRkcmVzcygpKTsKLQotICBjb25zdCBSYXdBZGRyZXNzIGtUZXN0QWRhcHRlcklucHV0ID0ge3sweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjfX07Ci0gIGNvbnN0IGNoYXIga1Rlc3RBZGFwdGVyQWRkcmVzc091dHB1dFtdID0gIjEyOjM0OjU2Ojc4OjlBOkJDIjsKLQotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFkYXB0ZXJBZGRyZXNzUHJvcGVydHlDaGFuZ2VkKCZrVGVzdEFkYXB0ZXJJbnB1dCk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkYXB0ZXJBZGRyZXNzT3V0cHV0LCBhZGFwdGVyXy0+R2V0QWRkcmVzcygpKTsKLX0KLQotVEVTVF9GKEFkYXB0ZXJUZXN0LCBJc011bHRpQWR2ZXJ0aXNlbWVudFN1cHBvcnRlZCkgewotICBFWFBFQ1RfRkFMU0UoYWRhcHRlcl8tPklzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkKCkpOwotCi0gIGJ0X2xvY2FsX2xlX2ZlYXR1cmVzX3QgZmVhdHVyZXM7Ci0gIG1lbXNldCgmZmVhdHVyZXMsIDAsIHNpemVvZihmZWF0dXJlcykpOwotCi0gIGZlYXR1cmVzLm1heF9hZHZfaW5zdGFuY2UgPSAxMDsgIC8vIFNvbWUgaGlnaCBudW1iZXIuCi0gIGZha2VfaGFsX2lmYWNlXy0+Tm90aWZ5QWRhcHRlckxvY2FsTGVGZWF0dXJlc1Byb3BlcnR5Q2hhbmdlZCgmZmVhdHVyZXMpOwotICBFWFBFQ1RfVFJVRShhZGFwdGVyXy0+SXNNdWx0aUFkdmVydGlzZW1lbnRTdXBwb3J0ZWQoKSk7Ci0KLSAgZmVhdHVyZXMubWF4X2Fkdl9pbnN0YW5jZSA9IDA7ICAvLyBMb3cgbnVtYmVyLgotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFkYXB0ZXJMb2NhbExlRmVhdHVyZXNQcm9wZXJ0eUNoYW5nZWQoJmZlYXR1cmVzKTsKLSAgRVhQRUNUX0ZBTFNFKGFkYXB0ZXJfLT5Jc011bHRpQWR2ZXJ0aXNlbWVudFN1cHBvcnRlZCgpKTsKLX0KLQotVEVTVF9GKEFkYXB0ZXJUZXN0LCBJc0RldmljZUNvbm5lY3RlZCkgewotICBjb25zdCBjaGFyIGtEZXZpY2VBZGRyW10gPSAiMTI6MzQ6NTY6Nzg6OUE6QkMiOwotICBUZXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIoYWRhcHRlcl8uZ2V0KCkpOwotCi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+SXNEZXZpY2VDb25uZWN0ZWQoa0RldmljZUFkZHIpKTsKLQotICBSYXdBZGRyZXNzIGhhbF9hZGRyOwotICBBU1NFUlRfVFJVRShSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGtEZXZpY2VBZGRyLCBoYWxfYWRkcikpOwotCi0gIC8vIHN0YXR1cyAhPSBCVF9TVEFUVVNfU1VDQ0VTUyBzaG91bGQgYmUgaWdub3JlZAotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFjbFN0YXRlQ2hhbmdlZENhbGxiYWNrKAotICAgICAgQlRfU1RBVFVTX0ZBSUwsIGhhbF9hZGRyLCBCVF9BQ0xfU1RBVEVfQ09OTkVDVEVELCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAweGZmKTsgIC8vIEhDSV9FUlJfVU5ERUZJTkVECi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+SXNEZXZpY2VDb25uZWN0ZWQoa0RldmljZUFkZHIpKTsKLSAgRVhQRUNUX1RSVUUob2JzZXJ2ZXIubGFzdF9jb25uZWN0aW9uX3N0YXRlX2FkZHJlc3MoKS5lbXB0eSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG9ic2VydmVyLmxhc3RfZGV2aWNlX2Nvbm5lY3RlZF9zdGF0ZSgpKTsKLQotICAvLyBDb25uZWN0ZWQKLSAgZmFrZV9oYWxfaWZhY2VfLT5Ob3RpZnlBY2xTdGF0ZUNoYW5nZWRDYWxsYmFjaygKLSAgICAgIEJUX1NUQVRVU19TVUNDRVNTLCBoYWxfYWRkciwgQlRfQUNMX1NUQVRFX0NPTk5FQ1RFRCwgQlRfVFJBTlNQT1JUX0xFLAotICAgICAgMHgwMCk7ICAvLyBIQ0lfU1VDQ0VTUwotICBFWFBFQ1RfVFJVRShhZGFwdGVyXy0+SXNEZXZpY2VDb25uZWN0ZWQoa0RldmljZUFkZHIpKTsKLSAgRVhQRUNUX0VRKGtEZXZpY2VBZGRyLCBvYnNlcnZlci5sYXN0X2Nvbm5lY3Rpb25fc3RhdGVfYWRkcmVzcygpKTsKLSAgRVhQRUNUX1RSVUUob2JzZXJ2ZXIubGFzdF9kZXZpY2VfY29ubmVjdGVkX3N0YXRlKCkpOwotCi0gIC8vIERpc2Nvbm5lY3RlZAotICBmYWtlX2hhbF9pZmFjZV8tPk5vdGlmeUFjbFN0YXRlQ2hhbmdlZENhbGxiYWNrKAotICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MsIGhhbF9hZGRyLCBCVF9BQ0xfU1RBVEVfRElTQ09OTkVDVEVELCBCVF9UUkFOU1BPUlRfTEUsCi0gICAgICAweDE2KTsgIC8vIEhDSV9FUlJfQ09OTl9DQVVTRV9MT0NBTF9IT1NUCi0gIEVYUEVDVF9GQUxTRShhZGFwdGVyXy0+SXNEZXZpY2VDb25uZWN0ZWQoa0RldmljZUFkZHIpKTsKLSAgRVhQRUNUX0VRKGtEZXZpY2VBZGRyLCBvYnNlcnZlci5sYXN0X2Nvbm5lY3Rpb25fc3RhdGVfYWRkcmVzcygpKTsKLSAgRVhQRUNUX0ZBTFNFKG9ic2VydmVyLmxhc3RfZGV2aWNlX2Nvbm5lY3RlZF9zdGF0ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL3Rlc3QvYWR2ZXJ0aXNlX2RhdGFfdW5pdHRlc3QuY2MgYi9zZXJ2aWNlL3Rlc3QvYWR2ZXJ0aXNlX2RhdGFfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODFjOGMuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L2FkdmVydGlzZV9kYXRhX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hZHZlcnRpc2VfZGF0YS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaWRlZnMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLVRFU1QoQWR2ZXJ0aXNlRGF0YVRlc3QsIEVtcHR5RGF0YSkgewotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMDsKLSAgQWR2ZXJ0aXNlRGF0YSBhZHYwKGRhdGEwKTsKLSAgRVhQRUNUX1RSVUUoYWR2MC5Jc1ZhbGlkKCkpOwotCi0gIC8vIFNpbmdsZSBlbXB0eSBmaWVsZCBub3QgYWxsb3dlZC4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTF7MHgwMH07Ci0gIEFkdmVydGlzZURhdGEgYWR2MShkYXRhMSk7Ci0gIEVYUEVDVF9GQUxTRShhZHYxLklzVmFsaWQoKSk7Ci19Ci0KLVRFU1QoQWR2ZXJ0aXNlRGF0YVRlc3QsIEJhZFRMVikgewotICAvLyBTaW5nbGUgZmllbGQsIGZpZWxkIGVtcHR5LgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMHsweDAxfTsKLSAgQWR2ZXJ0aXNlRGF0YSBhZHYwKGRhdGEwKTsKLSAgRVhQRUNUX0ZBTFNFKGFkdjAuSXNWYWxpZCgpKTsKLQotICAvLyBTaW5nbGUgZmllbGQsIGZpcnN0IGZpZWxkIGxlbmd0aCB0b28gbG9uZy4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTF7MHgwNSwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIEFkdmVydGlzZURhdGEgYWR2MShkYXRhMSk7Ci0gIEVYUEVDVF9GQUxTRShhZHYxLklzVmFsaWQoKSk7Ci0KLSAgLy8gVHdvIGZpZWxkcywgc2Vjb25kIGZpZWxkIGxlbmd0aCB0b28gbG9uZy4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTJ7MHgwMiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMH07Ci0gIEFkdmVydGlzZURhdGEgYWR2MihkYXRhMik7Ci0gIEVYUEVDVF9GQUxTRShhZHYyLklzVmFsaWQoKSk7Ci0KLSAgLy8gVHdvIGZpZWxkcywgc2Vjb25kIGZpZWxkIGVtcHR5LgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhM3sweDAyLCAweDAyLCAweDAwLCAweDAxfTsKLSAgQWR2ZXJ0aXNlRGF0YSBhZHYzKGRhdGEzKTsKLSAgRVhQRUNUX0ZBTFNFKGFkdjMuSXNWYWxpZCgpKTsKLX0KLQotVEVTVChBZHZlcnRpc2VEYXRhVGVzdCwgR29vZFRMVikgewotICAvLyBTaW5nZSBmaWVsZC4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTB7MHgwMywgMHgwMiwgMHgwMSwgMHgwMn07Ci0gIEFkdmVydGlzZURhdGEgYWR2MChkYXRhMCk7Ci0gIEVYUEVDVF9UUlVFKGFkdjAuSXNWYWxpZCgpKTsKLQotICAvLyBUd2kgZmllbGRzLgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMXsweDAzLCAweDAyLCAweDAxLCAweDAyLCAweDAyLCAweDAzLCAweDAxfTsKLSAgQWR2ZXJ0aXNlRGF0YSBhZHYxKGRhdGExKTsKLSAgRVhQRUNUX1RSVUUoYWR2MC5Jc1ZhbGlkKCkpOwotfQotCi1URVNUKEFkdmVydGlzZURhdGFUZXN0LCBEaXNhbGxvd2VkRmllbGRzKSB7Ci0gIC8vIFNpbmdlIGZpZWxkLgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMHsweDAyLCBIQ0lfRUlSX0ZMQUdTX1RZUEUsIDB4MDB9OwotICBBZHZlcnRpc2VEYXRhIGFkdjAoZGF0YTApOwotICBFWFBFQ1RfRkFMU0UoYWR2MC5Jc1ZhbGlkKCkpOwotCi0gIC8vIFR3byBmaWVsZHMsIGZpcnN0IGludmFsaWQuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGExewotICAgICAgMHgwMiwgSENJX0VJUl9GTEFHU19UWVBFLCAweDAwLCAweDAzLCAweDAyLCAweDAxLCAweDAyfTsKLSAgQWR2ZXJ0aXNlRGF0YSBhZHYxKGRhdGExKTsKLSAgRVhQRUNUX0ZBTFNFKGFkdjEuSXNWYWxpZCgpKTsKLQotICAvLyBUd28gZmllbGRzLCBzZWNvbmQgaW52YWxpZC4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTJ7Ci0gICAgICAweDAzLCAweDAyLCAweDAxLCAweDAyLCAweDAyLCBIQ0lfRUlSX0ZMQUdTX1RZUEUsIDB4MDB9OwotICBBZHZlcnRpc2VEYXRhIGFkdjIoZGF0YTIpOwotICBFWFBFQ1RfRkFMU0UoYWR2Mi5Jc1ZhbGlkKCkpOwotCi0gIC8vIENoZWNrIGFsbCByZWplY3RsaXN0ZWQgZmllbGRzCi0gIHVpbnQ4X3QgcmVqZWN0bGlzdFtdID0ge0hDSV9FSVJfRkxBR1NfVFlQRSwgSENJX0VJUl9PT0JfQkRfQUREUl9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfRUlSX09PQl9DT0RfVFlQRSwgSENJX0VJUl9PT0JfU1NQX0hBU0hfQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfRUlSX09PQl9TU1BfUkFORF9SX1RZUEV9OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihyZWplY3RsaXN0KTsgaSsrKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YXsweDAyLCByZWplY3RsaXN0W2ldLCAweDAwfTsKLSAgICBBZHZlcnRpc2VEYXRhIGFkdihkYXRhKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWR2LklzVmFsaWQoKSk7Ci0gIH0KLX0KLQotVEVTVChBZHZlcnRpc2VEYXRhVGVzdCwgRXF1YWxzRGF0YSkgewotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMHsweDAyLCAweDAyLCAweDAwfTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTF7MHgwMiwgMHgwMywgMHgwMH07Ci0KLSAgQWR2ZXJ0aXNlRGF0YSBhZHYwKGRhdGEwKTsKLSAgQWR2ZXJ0aXNlRGF0YSBhZHYxKGRhdGExKTsKLQotICBFWFBFQ1RfRkFMU0UoYWR2MCA9PSBhZHYxKTsKLQotICBBZHZlcnRpc2VEYXRhIGFkdjIoZGF0YTEpOwotICBFWFBFQ1RfVFJVRShhZHYxID09IGFkdjIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL3Rlc3QvZmFrZV9oYWxfdXRpbC5jYyBiL3NlcnZpY2UvdGVzdC9mYWtlX2hhbF91dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNiZTY0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvdGVzdC9mYWtlX2hhbF91dGlsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9oYWxfdXRpbC5oIgotCi0vLyBUT0RPKGFybWFuc2l0byk6IFRoaXMgcHJvdmlkZXMgYSBmYWtlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiBkZWZpbmVkCi0vLyBpbiBidGNvcmUvaW5jbHVkZS9oYWxfdXRpbC5oLiBXZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyB0byBwcmV2ZW50IGhhdmluZyB0bwotLy8gcHVsbCBpbiBsaWJidGNvcmUgYW5kIHRyYW5zaXRpdmVseSBsaWJoYXJkd2FyZSBhcyBkZXBlbmRlbmNpZXMgZm9yIHRoZSB1bml0Ci0vLyB0ZXN0cy4gSW5zdGVhZCBvZiBkb2luZyBpdCB0aGlzIHdheSwgaG93ZXZlciwgd2Ugc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhIEMrKwotLy8gY2xhc3MgYWJzdHJhY3Rpb24gZm9yIHRoaXMgKGFuZCBhbGwgb3RoZXIgYnRpZiBpbnRlcmZhY2VzKSB0aGF0IHdlIGNhbiBtb2NrCi0vLyBmb3IgdGVzdGluZy4KLWludCBoYWxfdXRpbF9sb2FkX2J0X2xpYnJhcnkoY29uc3QgYnRfaW50ZXJmYWNlX3QqKiBpbnRlcmZhY2UpIHsgcmV0dXJuIC0xOyB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlL3Rlc3QvZ2F0dF9jbGllbnRfdW5pdHRlc3QuY2MgYi9zZXJ2aWNlL3Rlc3QvZ2F0dF9jbGllbnRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODUwY2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L2dhdHRfY2xpZW50X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9nYXR0X2NsaWVudC5oIgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vY2tHYXR0SGFuZGxlcgotICAgIDogcHVibGljIGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlRlc3RDbGllbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tHYXR0SGFuZGxlcigpID0gZGVmYXVsdDsKLSAgfk1vY2tHYXR0SGFuZGxlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBNT0NLX01FVEhPRDIoUmVnaXN0ZXJDbGllbnQsCi0gICAgICAgICAgICAgICBidF9zdGF0dXNfdChjb25zdCBibHVldG9vdGg6OlV1aWQmLCBib29sIGVhdHRfc3VwcG9ydCkpOwotICBNT0NLX01FVEhPRDEoVW5yZWdpc3RlckNsaWVudCwgYnRfc3RhdHVzX3QoaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMShTY2FuLCBidF9zdGF0dXNfdChib29sKSk7Ci0gIE1PQ0tfTUVUSE9ENChDb25uZWN0LCBidF9zdGF0dXNfdChpbnQsIGNvbnN0IFJhd0FkZHJlc3MmLCBib29sLCBpbnQpKTsKLSAgTU9DS19NRVRIT0QzKERpc2Nvbm5lY3QsIGJ0X3N0YXR1c190KGludCwgY29uc3QgUmF3QWRkcmVzcyYsIGludCkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tHYXR0SGFuZGxlcik7Ci19OwotCi1jbGFzcyBHYXR0Q2xpZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgR2F0dENsaWVudFRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5HYXR0Q2xpZW50VGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIC8vIE9ubHkgc2V0IHxtb2NrX2hhbmRsZXJffCBpZiBhIHByZXZpb3VzIHRlc3QgY2FzZSBoYXNuJ3Qgc2V0IGl0LgotICAgIGlmICghbW9ja19oYW5kbGVyXykgbW9ja19oYW5kbGVyXy5yZXNldChuZXcgTW9ja0dhdHRIYW5kbGVyKCkpOwotCi0gICAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8gPSBuZXcgaGFsOjpGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZSgKLSAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PAotICAgICAgICAgICAgaGFsOjpGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6VGVzdENsaWVudEhhbmRsZXI+KG1vY2tfaGFuZGxlcl8pLAotICAgICAgICBudWxscHRyKTsKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkluaXRpYWxpemVGb3JUZXN0aW5nKGZha2VfaGFsX2dhdHRfaWZhY2VfKTsKLQotICAgIGZhY3RvcnlfLnJlc2V0KG5ldyBHYXR0Q2xpZW50RmFjdG9yeSgpKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZmFjdG9yeV8ucmVzZXQoKTsKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsZWFuVXAoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBoYWw6OkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBmYWtlX2hhbF9nYXR0X2lmYWNlXzsKLSAgc3RkOjpzaGFyZWRfcHRyPE1vY2tHYXR0SGFuZGxlcj4gbW9ja19oYW5kbGVyXzsKLSAgc3RkOjp1bmlxdWVfcHRyPEdhdHRDbGllbnRGYWN0b3J5PiBmYWN0b3J5XzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihHYXR0Q2xpZW50VGVzdCk7Ci19OwotCi1URVNUX0YoR2F0dENsaWVudFRlc3QsIFJlZ2lzdGVySW5zdGFuY2UpIHsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFJlZ2lzdGVyQ2xpZW50KF8sIF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19GQUlMKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLQotICAvLyBUaGVzZSB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IHBvcHVsYXRlZCB3aXRoIGEgcmVzdWx0IHdoZW4gdGhlIGNhbGxiYWNrCi0gIC8vIGV4ZWN1dGVzLgotICBCTEVTdGF0dXMgc3RhdHVzID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICBVdWlkIGNiX3V1aWQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxHYXR0Q2xpZW50PiBjbGllbnQ7Ci0gIGludCBjYWxsYmFja19jb3VudCA9IDA7Ci0KLSAgYXV0byBjYWxsYmFjayA9IFsmXShCTEVTdGF0dXMgaW5fc3RhdHVzLCBjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhJbnN0YW5jZT4gaW5fY2xpZW50KSB7Ci0gICAgc3RhdHVzID0gaW5fc3RhdHVzOwotICAgIGNiX3V1aWQgPSB1dWlkOwotICAgIGNsaWVudCA9IHN0ZDo6dW5pcXVlX3B0cjxHYXR0Q2xpZW50PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8R2F0dENsaWVudCo+KGluX2NsaWVudC5yZWxlYXNlKCkpKTsKLSAgICBjYWxsYmFja19jb3VudCsrOwotICB9OwotCi0gIFV1aWQgdXVpZDAgPSBVdWlkOjpHZXRSYW5kb20oKTsKLQotICAvLyBIQUwgcmV0dXJucyBmYWlsdXJlLgotICBFWFBFQ1RfRkFMU0UoZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDAsIGNhbGxiYWNrKSk7Ci0gIEVYUEVDVF9FUSgwLCBjYWxsYmFja19jb3VudCk7Ci0KLSAgLy8gSEFMIHJldHVybnMgc3VjY2Vzcy4KLSAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDAsIGNhbGxiYWNrKSk7Ci0gIEVYUEVDVF9FUSgwLCBjYWxsYmFja19jb3VudCk7Ci0KLSAgLy8gQ2FsbGluZyB0d2ljZSB3aXRoIHRoZSBzYW1lIFV1aWQgc2hvdWxkIGZhaWwgd2l0aCBubyBhZGRpdGlvbmFsIGNhbGwgaW50bwotICAvLyB0aGUgc3RhY2suCi0gIEVYUEVDVF9GQUxTRShmYWN0b3J5Xy0+UmVnaXN0ZXJJbnN0YW5jZSh1dWlkMCwgY2FsbGJhY2spKTsKLQotICB0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICAvLyBDYWxsIHdpdGggYSBkaWZmZXJlbnQgVXVpZCB3aGlsZSBvbmUgaXMgcGVuZGluZy4KLSAgVXVpZCB1dWlkMSA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgUmVnaXN0ZXJDbGllbnQoXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLSAgRVhQRUNUX1RSVUUoZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDEsIGNhbGxiYWNrKSk7Ci0KLSAgLy8gVHJpZ2dlciBjYWxsYmFjayB3aXRoIGFuIHVua25vd24gVXVpZC4gVGhpcyBzaG91bGQgZ2V0IGlnbm9yZWQuCi0gIFV1aWQgdXVpZDIgPSBVdWlkOjpHZXRSYW5kb20oKTsKLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyQ2xpZW50Q2FsbGJhY2soMCwgMCwgdXVpZDIpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIHx1dWlkMHwgc3VjY2VlZHMuCi0gIGludCBjbGllbnRfaWQwID0gMjsgIC8vIFBpY2sgc29tZXRoaW5nIHRoYXQncyBub3QgMC4KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyQ2xpZW50Q2FsbGJhY2soQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZDAsIHV1aWQwKTsKLQotICBFWFBFQ1RfRVEoMSwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShjbGllbnQuZ2V0KCkgIT0gbnVsbHB0cik7ICAvLyBBc3NlcnQgdG8gdGVybWluYXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgRVhQRUNUX0VRKEJMRV9TVEFUVVNfU1VDQ0VTUywgc3RhdHVzKTsKLSAgRVhQRUNUX0VRKGNsaWVudF9pZDAsIGNsaWVudC0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBjbGllbnQtPkdldEFwcElkZW50aWZpZXIoKSk7Ci0gIEVYUEVDVF9FUSh1dWlkMCwgY2JfdXVpZCk7Ci0KLSAgLy8gVGhlIGNsaWVudCBzaG91bGQgdW5yZWdpc3RlciBpdHNlbGYgd2hlbiBkZWxldGVkLgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgVW5yZWdpc3RlckNsaWVudChjbGllbnRfaWQwKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBjbGllbnQucmVzZXQoKTsKLSAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gfHV1aWQxfCBmYWlscy4KLSAgaW50IGNsaWVudF9pZDEgPSAzOwotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5UmVnaXN0ZXJDbGllbnRDYWxsYmFjayhCVF9TVEFUVVNfRkFJTCwgY2xpZW50X2lkMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDEpOwotCi0gIEVYUEVDVF9FUSgyLCBjYWxsYmFja19jb3VudCk7Ci0gIEFTU0VSVF9UUlVFKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKTsgIC8vIEFzc2VydCB0byB0ZXJtaW5hdGUgaW4gY2FzZSBvZiBlcnJvcgotICBFWFBFQ1RfRVEoQkxFX1NUQVRVU19GQUlMVVJFLCBzdGF0dXMpOwotICBFWFBFQ1RfRVEodXVpZDEsIGNiX3V1aWQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9nYXR0X3NlcnZlcl91bml0dGVzdC5jYyBiL3NlcnZpY2UvdGVzdC9nYXR0X3NlcnZlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3MTAwYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL3Rlc3QvZ2F0dF9zZXJ2ZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MzAgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2dhdHRfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vY2tHYXR0SGFuZGxlcgotICAgIDogcHVibGljIGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlRlc3RTZXJ2ZXJIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tHYXR0SGFuZGxlcigpID0gZGVmYXVsdDsKLSAgfk1vY2tHYXR0SGFuZGxlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBNT0NLX01FVEhPRDIoUmVnaXN0ZXJTZXJ2ZXIsCi0gICAgICAgICAgICAgICBidF9zdGF0dXNfdChjb25zdCBibHVldG9vdGg6OlV1aWQmLCBib29sIGVhdHRfc3VwcG9ydCkpOwotICBNT0NLX01FVEhPRDEoVW5yZWdpc3RlclNlcnZlciwgYnRfc3RhdHVzX3QoaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMihBZGRTZXJ2aWNlLCBidF9zdGF0dXNfdChpbnQsIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+KSk7Ci0gIE1PQ0tfTUVUSE9ENShBZGRDaGFyYWN0ZXJpc3RpYywKLSAgICAgICAgICAgICAgIGJ0X3N0YXR1c190KGludCwgaW50LCBibHVldG9vdGg6OlV1aWQqLCBpbnQsIGludCkpOwotICBNT0NLX01FVEhPRDQoQWRkRGVzY3JpcHRvciwgYnRfc3RhdHVzX3QoaW50LCBpbnQsIGJsdWV0b290aDo6VXVpZCosIGludCkpOwotICBNT0NLX01FVEhPRDMoU3RhcnRTZXJ2aWNlLCBidF9zdGF0dXNfdChpbnQsIGludCwgaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMihEZWxldGVTZXJ2aWNlLCBidF9zdGF0dXNfdChpbnQsIGludCkpOwotICBNT0NLX01FVEhPRDUoU2VuZEluZGljYXRpb24sCi0gICAgICAgICAgICAgICBidF9zdGF0dXNfdChpbnQsIGludCwgaW50LCBpbnQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KSk7Ci0gIE1PQ0tfTUVUSE9ENChTZW5kUmVzcG9uc2UsCi0gICAgICAgICAgICAgICBidF9zdGF0dXNfdChpbnQsIGludCwgaW50LCBjb25zdCBidGdhdHRfcmVzcG9uc2VfdCYpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrR2F0dEhhbmRsZXIpOwotfTsKLQotY2xhc3MgVGVzdERlbGVnYXRlIDogcHVibGljIEdhdHRTZXJ2ZXI6OkRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIFRlc3REZWxlZ2F0ZSgpID0gZGVmYXVsdDsKLSAgflRlc3REZWxlZ2F0ZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBzdHJ1Y3QgUmVxdWVzdERhdGEgewotICAgIFJlcXVlc3REYXRhKCkKLSAgICAgICAgOiBpZCgtMSksCi0gICAgICAgICAgb2Zmc2V0KC0xKSwKLSAgICAgICAgICBpc19sb25nKGZhbHNlKSwKLSAgICAgICAgICBpc19wcmVwKGZhbHNlKSwKLSAgICAgICAgICBuZWVkX3JzcChmYWxzZSksCi0gICAgICAgICAgaXNfZXhlYyhmYWxzZSksCi0gICAgICAgICAgY291bnQoMCksCi0gICAgICAgICAgY29ubmVjdGVkKGZhbHNlKSB7fQotICAgIH5SZXF1ZXN0RGF0YSgpID0gZGVmYXVsdDsKLQotICAgIHN0ZDo6c3RyaW5nIGRldmljZV9hZGRyZXNzOwotICAgIGludCBpZDsKLSAgICBpbnQgb2Zmc2V0OwotICAgIGJvb2wgaXNfbG9uZzsKLSAgICBib29sIGlzX3ByZXA7Ci0gICAgYm9vbCBuZWVkX3JzcDsKLSAgICBib29sIGlzX2V4ZWM7Ci0gICAgdWludDE2X3QgaGFuZGxlOwotICAgIGludCBjb3VudDsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB3cml0ZV92YWx1ZTsKLSAgICBib29sIGNvbm5lY3RlZDsKLSAgfTsKLQotICB2b2lkIE9uQ2hhcmFjdGVyaXN0aWNSZWFkUmVxdWVzdChHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdF9pZCwgaW50IG9mZnNldCwgYm9vbCBpc19sb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIG92ZXJyaWRlIHsKLSAgICBBU1NFUlRfVFJVRShnYXR0X3NlcnZlcik7Ci0gICAgY2hhcl9yZWFkX3JlcV8uZGV2aWNlX2FkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICBjaGFyX3JlYWRfcmVxXy5pZCA9IHJlcXVlc3RfaWQ7Ci0gICAgY2hhcl9yZWFkX3JlcV8ub2Zmc2V0ID0gb2Zmc2V0OwotICAgIGNoYXJfcmVhZF9yZXFfLmlzX2xvbmcgPSBpc19sb25nOwotICAgIGNoYXJfcmVhZF9yZXFfLmhhbmRsZSA9IGhhbmRsZTsKLSAgICBjaGFyX3JlYWRfcmVxXy5jb3VudCsrOwotICB9Ci0KLSAgdm9pZCBPbkRlc2NyaXB0b3JSZWFkUmVxdWVzdChHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsIGJvb2wgaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIG92ZXJyaWRlIHsKLSAgICBBU1NFUlRfVFJVRShnYXR0X3NlcnZlcik7Ci0gICAgZGVzY19yZWFkX3JlcV8uZGV2aWNlX2FkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICBkZXNjX3JlYWRfcmVxXy5pZCA9IHJlcXVlc3RfaWQ7Ci0gICAgZGVzY19yZWFkX3JlcV8ub2Zmc2V0ID0gb2Zmc2V0OwotICAgIGRlc2NfcmVhZF9yZXFfLmlzX2xvbmcgPSBpc19sb25nOwotICAgIGRlc2NfcmVhZF9yZXFfLmhhbmRsZSA9IGhhbmRsZTsKLSAgICBkZXNjX3JlYWRfcmVxXy5jb3VudCsrOwotICB9Ci0KLSAgdm9pZCBPbkNoYXJhY3RlcmlzdGljV3JpdGVSZXF1ZXN0KEdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3RfaWQsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgb3ZlcnJpZGUgewotICAgIEFTU0VSVF9UUlVFKGdhdHRfc2VydmVyKTsKLSAgICBjaGFyX3dyaXRlX3JlcV8uZGV2aWNlX2FkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICBjaGFyX3dyaXRlX3JlcV8uaWQgPSByZXF1ZXN0X2lkOwotICAgIGNoYXJfd3JpdGVfcmVxXy5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgY2hhcl93cml0ZV9yZXFfLmlzX3ByZXAgPSBpc19wcmVwYXJlX3dyaXRlOwotICAgIGNoYXJfd3JpdGVfcmVxXy5uZWVkX3JzcCA9IG5lZWRfcmVzcG9uc2U7Ci0gICAgY2hhcl93cml0ZV9yZXFfLmhhbmRsZSA9IGhhbmRsZTsKLSAgICBjaGFyX3dyaXRlX3JlcV8uY291bnQrKzsKLSAgICBjaGFyX3dyaXRlX3JlcV8ud3JpdGVfdmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHZvaWQgT25EZXNjcmlwdG9yV3JpdGVSZXF1ZXN0KEdhdHRTZXJ2ZXIqIGdhdHRfc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0X2lkLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXBhcmVfd3JpdGUsIGJvb2wgbmVlZF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIG92ZXJyaWRlIHsKLSAgICBBU1NFUlRfVFJVRShnYXR0X3NlcnZlcik7Ci0gICAgZGVzY193cml0ZV9yZXFfLmRldmljZV9hZGRyZXNzID0gZGV2aWNlX2FkZHJlc3M7Ci0gICAgZGVzY193cml0ZV9yZXFfLmlkID0gcmVxdWVzdF9pZDsKLSAgICBkZXNjX3dyaXRlX3JlcV8ub2Zmc2V0ID0gb2Zmc2V0OwotICAgIGRlc2Nfd3JpdGVfcmVxXy5pc19wcmVwID0gaXNfcHJlcGFyZV93cml0ZTsKLSAgICBkZXNjX3dyaXRlX3JlcV8ubmVlZF9yc3AgPSBuZWVkX3Jlc3BvbnNlOwotICAgIGRlc2Nfd3JpdGVfcmVxXy5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgZGVzY193cml0ZV9yZXFfLmNvdW50Kys7Ci0gICAgZGVzY193cml0ZV9yZXFfLndyaXRlX3ZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICB2b2lkIE9uRXhlY3V0ZVdyaXRlUmVxdWVzdChHYXR0U2VydmVyKiBnYXR0X3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9hZGRyZXNzLCBpbnQgcmVxdWVzdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGVjdXRlKSBvdmVycmlkZSB7Ci0gICAgQVNTRVJUX1RSVUUoZ2F0dF9zZXJ2ZXIpOwotICAgIGV4ZWNfcmVxXy5kZXZpY2VfYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOwotICAgIGV4ZWNfcmVxXy5pZCA9IHJlcXVlc3RfaWQ7Ci0gICAgZXhlY19yZXFfLmlzX2V4ZWMgPSBpc19leGVjdXRlOwotICAgIGV4ZWNfcmVxXy5jb3VudCsrOwotICB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoR2F0dFNlcnZlciogZ2F0dF9zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlIHsKLSAgICBBU1NFUlRfVFJVRShnYXR0X3NlcnZlcik7Ci0gICAgY29ubl9zdGF0ZV9jaGFuZ2VkXy5kZXZpY2VfYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOwotICAgIGNvbm5fc3RhdGVfY2hhbmdlZF8uY29ubmVjdGVkID0gY29ubmVjdGVkOwotICAgIGNvbm5fc3RhdGVfY2hhbmdlZF8uY291bnQrKzsKLSAgfQotCi0gIGNvbnN0IFJlcXVlc3REYXRhJiBjaGFyX3JlYWRfcmVxKCkgY29uc3QgeyByZXR1cm4gY2hhcl9yZWFkX3JlcV87IH0KLSAgY29uc3QgUmVxdWVzdERhdGEmIGRlc2NfcmVhZF9yZXEoKSBjb25zdCB7IHJldHVybiBkZXNjX3JlYWRfcmVxXzsgfQotICBjb25zdCBSZXF1ZXN0RGF0YSYgY2hhcl93cml0ZV9yZXEoKSBjb25zdCB7IHJldHVybiBjaGFyX3dyaXRlX3JlcV87IH0KLSAgY29uc3QgUmVxdWVzdERhdGEmIGRlc2Nfd3JpdGVfcmVxKCkgY29uc3QgeyByZXR1cm4gZGVzY193cml0ZV9yZXFfOyB9Ci0gIGNvbnN0IFJlcXVlc3REYXRhJiBjb25uX3N0YXRlX2NoYW5nZWQoKSBjb25zdCB7IHJldHVybiBjb25uX3N0YXRlX2NoYW5nZWRfOyB9Ci0KLSBwcml2YXRlOgotICBSZXF1ZXN0RGF0YSBjaGFyX3JlYWRfcmVxXzsKLSAgUmVxdWVzdERhdGEgZGVzY19yZWFkX3JlcV87Ci0gIFJlcXVlc3REYXRhIGNoYXJfd3JpdGVfcmVxXzsKLSAgUmVxdWVzdERhdGEgZGVzY193cml0ZV9yZXFfOwotICBSZXF1ZXN0RGF0YSBleGVjX3JlcV87Ci0gIFJlcXVlc3REYXRhIGNvbm5fc3RhdGVfY2hhbmdlZF87Ci19OwotCi1jbGFzcyBHYXR0U2VydmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgR2F0dFNlcnZlclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5HYXR0U2VydmVyVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1vY2tfaGFuZGxlcl8ucmVzZXQobmV3IE1vY2tHYXR0SGFuZGxlcigpKTsKLSAgICBmYWtlX2hhbF9nYXR0X2lmYWNlXyA9IG5ldyBoYWw6OkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlKAotICAgICAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Ci0gICAgICAgICAgICBoYWw6OkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpUZXN0U2VydmVySGFuZGxlcj4obW9ja19oYW5kbGVyXykpOwotCi0gICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZyhmYWtlX2hhbF9nYXR0X2lmYWNlXyk7Ci0gICAgZmFjdG9yeV8ucmVzZXQobmV3IEdhdHRTZXJ2ZXJGYWN0b3J5KCkpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBmYWN0b3J5Xy5yZXNldCgpOwotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xlYW5VcCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGZha2VfaGFsX2dhdHRfaWZhY2VfOwotICBzdGQ6OnNoYXJlZF9wdHI8TW9ja0dhdHRIYW5kbGVyPiBtb2NrX2hhbmRsZXJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8R2F0dFNlcnZlckZhY3Rvcnk+IGZhY3RvcnlfOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEdhdHRTZXJ2ZXJUZXN0KTsKLX07Ci0KLWNvbnN0IGludCBrRGVmYXVsdFNlcnZlcklkID0gNDsKLQotY2xhc3MgR2F0dFNlcnZlclBvc3RSZWdpc3RlclRlc3QgOiBwdWJsaWMgR2F0dFNlcnZlclRlc3QgewotIHB1YmxpYzoKLSAgR2F0dFNlcnZlclBvc3RSZWdpc3RlclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5HYXR0U2VydmVyUG9zdFJlZ2lzdGVyVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIEdhdHRTZXJ2ZXJUZXN0OjpTZXRVcCgpOwotICAgIFV1aWQgdXVpZCA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICAgIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIHN0YXR1cywgY29uc3QgVXVpZCYgaW5fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhJbnN0YW5jZT4gaW5fY2xpZW50KSB7Ci0gICAgICBDSEVDSyhpbl91dWlkID09IHV1aWQpOwotICAgICAgQ0hFQ0soaW5fY2xpZW50LmdldCgpKTsKLSAgICAgIENIRUNLKHN0YXR1cyA9PSBCTEVfU1RBVFVTX1NVQ0NFU1MpOwotCi0gICAgICBnYXR0X3NlcnZlcl8gPSBzdGQ6OnVuaXF1ZV9wdHI8R2F0dFNlcnZlcj4oCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8R2F0dFNlcnZlcio+KGluX2NsaWVudC5yZWxlYXNlKCkpKTsKLSAgICB9OwotCi0gICAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFJlZ2lzdGVyU2VydmVyKF8sIF8pKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotCi0gICAgZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZCwgY2FsbGJhY2spOwotCi0gICAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyU2VydmVyQ2FsbGJhY2soQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRTZXJ2ZXJJZCwgdXVpZCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBVbnJlZ2lzdGVyU2VydmVyKF8pKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICAgIGdhdHRfc2VydmVyXyA9IG51bGxwdHI7Ci0gICAgR2F0dFNlcnZlclRlc3Q6OlRlYXJEb3duKCk7Ci0gIH0KLQotICB2b2lkIFNldFVwVGVzdFNlcnZpY2UoKSB7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIEFkZFNlcnZpY2UoXywgXykpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19TVUNDRVNTKSk7Ci0KLSAgICBVdWlkIHV1aWQwID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gICAgVXVpZCB1dWlkMSA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICAgIFV1aWQgdXVpZDIgPSBVdWlkOjpHZXRSYW5kb20oKTsKLQotICAgIGJvb2wgcmVnaXN0ZXJfc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgU2VydmljZSBzZXJ2aWNlKDAsIHRydWUsIHV1aWQwLCB7fSwge30pOwotCi0gICAgQVNTRVJUX1RSVUUoZ2F0dF9zZXJ2ZXJfLT5BZGRTZXJ2aWNlKAotICAgICAgICBzZXJ2aWNlLCBbJl0oQkxFU3RhdHVzIHN0YXR1cywgY29uc3QgU2VydmljZSYgYWRkZWRfc2VydmljZSkgewotICAgICAgICAgIEFTU0VSVF9FUShCTEVfU1RBVFVTX1NVQ0NFU1MsIHN0YXR1cyk7Ci0gICAgICAgICAgQVNTRVJUX1RSVUUoVXVpZChhZGRlZF9zZXJ2aWNlLnV1aWQoKSkgPT0gVXVpZChzZXJ2aWNlLnV1aWQoKSkpOwotICAgICAgICAgIEFTU0VSVF9UUlVFKGFkZGVkX3NlcnZpY2UuaGFuZGxlKCkgPT0gMHgwMDAxKTsKLSAgICAgICAgICByZWdpc3Rlcl9zdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgfSkpOwotCi0gICAgc3J2Y19oYW5kbGVfID0gMHgwMDAxOwotICAgIGNoYXJfaGFuZGxlXyA9IDB4MDAwMjsKLSAgICBkZXNjX2hhbmRsZV8gPSAweDAwMDQ7Ci0KLSAgICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlX3dpdGhfaGFuZGxlcyA9IHsKLSAgICAgICAgey51dWlkID0gdXVpZDAsCi0gICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9QUklNQVJZX1NFUlZJQ0UsCi0gICAgICAgICAuYXR0cmlidXRlX2hhbmRsZSA9IHNydmNfaGFuZGxlX30sCi0gICAgICAgIHsudXVpZCA9IHV1aWQxLAotICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAuYXR0cmlidXRlX2hhbmRsZSA9IGNoYXJfaGFuZGxlX30sCi0gICAgICAgIHsudXVpZCA9IHV1aWQyLAotICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUiwKLSAgICAgICAgIC5hdHRyaWJ1dGVfaGFuZGxlID0gZGVzY19oYW5kbGVffSwKLSAgICB9OwotCi0gICAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVNlcnZpY2VBZGRlZENhbGxiYWNrKAotICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUywga0RlZmF1bHRTZXJ2ZXJJZCwgc2VydmljZV93aXRoX2hhbmRsZXMpOwotCi0gICAgdGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgICBBU1NFUlRfVFJVRShyZWdpc3Rlcl9zdWNjZXNzKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnVuaXF1ZV9wdHI8R2F0dFNlcnZlcj4gZ2F0dF9zZXJ2ZXJfOwotCi0gIHVpbnQxNl90IHNydmNfaGFuZGxlXzsKLSAgdWludDE2X3QgY2hhcl9oYW5kbGVfOwotICB1aW50MTZfdCBkZXNjX2hhbmRsZV87Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR2F0dFNlcnZlclBvc3RSZWdpc3RlclRlc3QpOwotfTsKLQotVEVTVF9GKEdhdHRTZXJ2ZXJUZXN0LCBSZWdpc3RlclNlcnZlcikgewotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgUmVnaXN0ZXJTZXJ2ZXIoXywgXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX0ZBSUwpKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotCi0gIC8vIFRoZXNlIHdpbGwgYmUgYXN5bmNocm9ub3VzbHkgcG9wdWxhdGUgd2l0aCBhIHJlc3VsdCB3aGVuIHRoZSBjYWxsYmFjawotICAvLyBleGVjdXRlcy4KLSAgQkxFU3RhdHVzIHN0YXR1cyA9IEJMRV9TVEFUVVNfU1VDQ0VTUzsKLSAgVXVpZCBjYl91dWlkOwotICBzdGQ6OnVuaXF1ZV9wdHI8R2F0dFNlcnZlcj4gc2VydmVyOwotICBpbnQgY2FsbGJhY2tfY291bnQgPSAwOwotCi0gIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIGluX3N0YXR1cywgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Qmx1ZXRvb3RoSW5zdGFuY2U+IGluX3NlcnZlcikgewotICAgIHN0YXR1cyA9IGluX3N0YXR1czsKLSAgICBjYl91dWlkID0gdXVpZDsKLSAgICBzZXJ2ZXIgPSBzdGQ6OnVuaXF1ZV9wdHI8R2F0dFNlcnZlcj4oCi0gICAgICAgIHN0YXRpY19jYXN0PEdhdHRTZXJ2ZXIqPihpbl9zZXJ2ZXIucmVsZWFzZSgpKSk7Ci0gICAgY2FsbGJhY2tfY291bnQrKzsKLSAgfTsKLQotICBVdWlkIHV1aWQwID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0KLSAgLy8gSEFMIHJldHVybnMgZmFpbHVyZS4KLSAgRVhQRUNUX0ZBTFNFKGZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQwLCBjYWxsYmFjaykpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIEhBTCByZXR1cm5zIHN1Y2Nlc3MuCi0gIEVYUEVDVF9UUlVFKGZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQwLCBjYWxsYmFjaykpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIENhbGxpbmcgdHdpY2Ugd2l0aCB0aGUgc2FtZSBVdWlkIHNob3VsZCBmYWlsIHdpdGggbm8gYWRkaXRpb25hbCBjYWxscyBpbnRvCi0gIC8vIHRoZSBzdGFjay4KLSAgRVhQRUNUX0ZBTFNFKGZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQwLCBjYWxsYmFjaykpOwotCi0gIHRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotCi0gIC8vIENhbGwgd2l0aCBhIGRpZmZlcmVudCBVdWlkIHdoaWxlIG9uZSBpcyBwZW5kaW5nLgotICBVdWlkIHV1aWQxID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBSZWdpc3RlclNlcnZlcihfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBFWFBFQ1RfVFJVRShmYWN0b3J5Xy0+UmVnaXN0ZXJJbnN0YW5jZSh1dWlkMSwgY2FsbGJhY2spKTsKLQotICAvLyBUcmlnZ2VyIGNhbGxiYWNrIHdpdGggYW4gdW5rbm93biBVdWlkLiBUaGlzIHNob3VsZCBnZXQgaWdub3JlZC4KLSAgYmx1ZXRvb3RoOjpVdWlkIGhhbF91dWlkID0gYmx1ZXRvb3RoOjpVdWlkOjpHZXRSYW5kb20oKTsKLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyU2VydmVyQ2FsbGJhY2soMCwgMCwgaGFsX3V1aWQpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIHx1dWlkMHwgc3VjY2VlZHMuCi0gIGludCBzZXJ2ZXJfaWYwID0gMjsgIC8vIFBpY2sgc29tZXRoaW5nIHRoYXQncyBub3QgMC4KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyU2VydmVyQ2FsbGJhY2soQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9pZjAsIHV1aWQwKTsKLQotICBFWFBFQ1RfRVEoMSwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShzZXJ2ZXIuZ2V0KCkgIT0gbnVsbHB0cik7ICAvLyBBc3NlcnQgdG8gdGVybWluYXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgRVhQRUNUX0VRKEJMRV9TVEFUVVNfU1VDQ0VTUywgc3RhdHVzKTsKLSAgRVhQRUNUX0VRKHNlcnZlcl9pZjAsIHNlcnZlci0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBzZXJ2ZXItPkdldEFwcElkZW50aWZpZXIoKSk7Ci0gIEVYUEVDVF9FUSh1dWlkMCwgY2JfdXVpZCk7Ci0KLSAgLy8gVGhlIHNlcnZlciBzaG91bGQgdW5yZWdpc3RlciBpdHNlbGYgd2hlbiBkZWxldGVkLgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgVW5yZWdpc3RlclNlcnZlcihzZXJ2ZXJfaWYwKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBzZXJ2ZXIucmVzZXQoKTsKLQotICB0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICAvLyB8dXVpZDF8IGZhaWxzLgotICBpbnQgc2VydmVyX2lmMSA9IDM7Ci0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZWdpc3RlclNlcnZlckNhbGxiYWNrKEJUX1NUQVRVU19GQUlMLCBzZXJ2ZXJfaWYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkMSk7Ci0KLSAgRVhQRUNUX0VRKDIsIGNhbGxiYWNrX2NvdW50KTsKLSAgQVNTRVJUX1RSVUUoc2VydmVyLmdldCgpID09IG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX0ZBSUxVUkUsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUSh1dWlkMSwgY2JfdXVpZCk7Ci19Ci0KLVRFU1RfRihHYXR0U2VydmVyUG9zdFJlZ2lzdGVyVGVzdCwgUmVxdWVzdFJlYWQpIHsKLSAgU2V0VXBUZXN0U2VydmljZSgpOwotCi0gIFRlc3REZWxlZ2F0ZSB0ZXN0X2RlbGVnYXRlOwotICBnYXR0X3NlcnZlcl8tPlNldERlbGVnYXRlKCZ0ZXN0X2RlbGVnYXRlKTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVGVzdFZhbHVlID0gezB4MDEsIDB4MDIsIDB4MDN9OwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVGVzdFZhbHVlVG9vTGFyZ2UoQlRHQVRUX01BWF9BVFRSX0xFTiArIDEsIDApOwotICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdEFkZHJlc3MwID0gIjAxOjIzOjQ1OjY3Ojg5OkFCIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RBZGRyZXNzMSA9ICJDRDpFRjowMToyMzo0NTo2NyI7Ci0gIGNvbnN0IGludCBrUmVxSWQwID0gMDsKLSAgY29uc3QgaW50IGtSZXFJZDEgPSAxOwotICBjb25zdCBpbnQga0Nvbm5JZDAgPSAxOwotCi0gIC8vIE5vIHBlbmRpbmcgcmVxdWVzdC4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0VSUk9SX05PTkUsIDAsIGtUZXN0VmFsdWUpKTsKLQotICBSYXdBZGRyZXNzIGhhbF9hZGRyMCwgaGFsX2FkZHIxOwotICBBU1NFUlRfVFJVRShSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcmVzczAsIGhhbF9hZGRyMCkpOwotICBBU1NFUlRfVFJVRShSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcmVzczEsIGhhbF9hZGRyMSkpOwotCi0gIC8vIFNlbmQgYSBjb25uZWN0aW9uIGNhbGxiYWNrLiBUaGUgR2F0dFNlcnZlciBzaG91bGQgc3RvcmUgdGhlIGNvbm5lY3Rpb24KLSAgLy8gaW5mb3JtYXRpb24gYW5kIGJlIGFibGUgdG8gcHJvY2VzcyB0aGUgaW5jb21pbmcgcmVhZCByZXF1ZXN0cyBmb3IgdGhpcwotICAvLyBjb25uZWN0aW9uLgotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5U2VydmVyQ29ubmVjdGlvbkNhbGxiYWNrKAotICAgICAga0Nvbm5JZDAsIGtEZWZhdWx0U2VydmVySWQsIHRydWUsIGhhbF9hZGRyMCk7Ci0KLSAgLy8gVW5rbm93biBjb25uZWN0aW9uIElEIHNob3VsZG4ndCB0cmlnZ2VyIGFueXRoaW5nLgotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5UmVxdWVzdFJlYWRDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAga0Nvbm5JZDAgKyAxLCBrUmVxSWQwLCBoYWxfYWRkcjAsIGNoYXJfaGFuZGxlXywgMCwgZmFsc2UpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9kZWxlZ2F0ZS5jaGFyX3JlYWRfcmVxKCkuY291bnQpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3JlYWRfcmVxKCkuY291bnQpOwotCi0gIC8vIFVua25vd24gZGV2aWNlIGFkZHJlc3Mgc2hvdWxkbid0IHRyaWdnZXIgYW55dGhpbmcuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0UmVhZENoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgICBrQ29ubklkMCwga1JlcUlkMCwgaGFsX2FkZHIxLCBjaGFyX2hhbmRsZV8sIDAsIGZhbHNlKTsKLSAgRVhQRUNUX0VRKDAsIHRlc3RfZGVsZWdhdGUuY2hhcl9yZWFkX3JlcSgpLmNvdW50KTsKLSAgRVhQRUNUX0VRKDAsIHRlc3RfZGVsZWdhdGUuZGVzY19yZWFkX3JlcSgpLmNvdW50KTsKLQotICAvLyBDaGFyYWN0ZXJpc3RpYyBhbmQgZGVzY3JpcHRvciBoYW5kbGVzIHNob3VsZCB0cmlnZ2VyIGNvcnJlY3QgY2FsbGJhY2tzLgotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5UmVxdWVzdFJlYWRDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAga0Nvbm5JZDAsIGtSZXFJZDAsIGhhbF9hZGRyMCwgY2hhcl9oYW5kbGVfLCAwLCBmYWxzZSk7Ci0gIEVYUEVDVF9FUSgxLCB0ZXN0X2RlbGVnYXRlLmNoYXJfcmVhZF9yZXEoKS5jb3VudCk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkZHJlc3MwLCB0ZXN0X2RlbGVnYXRlLmNoYXJfcmVhZF9yZXEoKS5kZXZpY2VfYWRkcmVzcyk7Ci0gIEVYUEVDVF9FUShrUmVxSWQwLCB0ZXN0X2RlbGVnYXRlLmNoYXJfcmVhZF9yZXEoKS5pZCk7Ci0gIEVYUEVDVF9FUSgwLCB0ZXN0X2RlbGVnYXRlLmNoYXJfcmVhZF9yZXEoKS5vZmZzZXQpOwotICBFWFBFQ1RfRkFMU0UodGVzdF9kZWxlZ2F0ZS5jaGFyX3JlYWRfcmVxKCkuaXNfbG9uZyk7Ci0gIEVYUEVDVF9UUlVFKGNoYXJfaGFuZGxlXyA9PSB0ZXN0X2RlbGVnYXRlLmNoYXJfcmVhZF9yZXEoKS5oYW5kbGUpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3JlYWRfcmVxKCkuY291bnQpOwotCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0UmVhZERlc2NyaXB0b3JDYWxsYmFjaygKLSAgICAgIGtDb25uSWQwLCBrUmVxSWQxLCBoYWxfYWRkcjAsIGRlc2NfaGFuZGxlXywgMiwgdHJ1ZSk7Ci0gIEVYUEVDVF9FUSgxLCB0ZXN0X2RlbGVnYXRlLmNoYXJfcmVhZF9yZXEoKS5jb3VudCk7Ci0gIEVYUEVDVF9FUSgxLCB0ZXN0X2RlbGVnYXRlLmRlc2NfcmVhZF9yZXEoKS5jb3VudCk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkZHJlc3MwLCB0ZXN0X2RlbGVnYXRlLmRlc2NfcmVhZF9yZXEoKS5kZXZpY2VfYWRkcmVzcyk7Ci0gIEVYUEVDVF9FUShrUmVxSWQxLCB0ZXN0X2RlbGVnYXRlLmRlc2NfcmVhZF9yZXEoKS5pZCk7Ci0gIEVYUEVDVF9FUSgyLCB0ZXN0X2RlbGVnYXRlLmRlc2NfcmVhZF9yZXEoKS5vZmZzZXQpOwotICBFWFBFQ1RfVFJVRSh0ZXN0X2RlbGVnYXRlLmRlc2NfcmVhZF9yZXEoKS5pc19sb25nKTsKLSAgRVhQRUNUX1RSVUUoZGVzY19oYW5kbGVfID09IHRlc3RfZGVsZWdhdGUuZGVzY19yZWFkX3JlcSgpLmhhbmRsZSk7Ci0KLSAgLy8gQ2FsbGJhY2sgd2l0aCBhIHBlbmRpbmcgcmVxdWVzdCBJRCB3aWxsIGJlIGlnbm9yZWQuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0UmVhZENoYXJhY3RlcmlzdGljQ2FsbGJhY2soCi0gICAgICBrQ29ubklkMCwga1JlcUlkMCwgaGFsX2FkZHIwLCBjaGFyX2hhbmRsZV8sIDAsIGZhbHNlKTsKLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlcXVlc3RSZWFkQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICAgIGtDb25uSWQwLCBrUmVxSWQxLCBoYWxfYWRkcjAsIGNoYXJfaGFuZGxlXywgMCwgZmFsc2UpOwotICBFWFBFQ1RfRVEoMSwgdGVzdF9kZWxlZ2F0ZS5jaGFyX3JlYWRfcmVxKCkuY291bnQpOwotICBFWFBFQ1RfRVEoMSwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3JlYWRfcmVxKCkuY291bnQpOwotCi0gIC8vIFNlbmQgcmVzcG9uc2UgZm9yIHdyb25nIGRldmljZSBhZGRyZXNzLgotICBFWFBFQ1RfRkFMU0UoZ2F0dF9zZXJ2ZXJfLT5TZW5kUmVzcG9uc2Uoa1Rlc3RBZGRyZXNzMSwga1JlcUlkMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfRVJST1JfTk9ORSwgMCwga1Rlc3RWYWx1ZSkpOwotCi0gIC8vIFNlbmQgcmVzcG9uc2UgZm9yIGEgdmFsdWUgdGhhdCdzIHRvbyBsYXJnZS4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKAotICAgICAga1Rlc3RBZGRyZXNzMCwga1JlcUlkMCwgR0FUVF9FUlJPUl9OT05FLCAwLCBrVGVzdFZhbHVlVG9vTGFyZ2UpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywKLSAgICAgICAgICAgICAgU2VuZFJlc3BvbnNlKGtDb25uSWQwLCBrUmVxSWQwLCBCVF9TVEFUVVNfU1VDQ0VTUywgXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX0ZBSUwpKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotCi0gIC8vIFN0YWNrIGNhbGwgZmFpbHMuCi0gIEVYUEVDVF9GQUxTRShnYXR0X3NlcnZlcl8tPlNlbmRSZXNwb25zZShrVGVzdEFkZHJlc3MwLCBrUmVxSWQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9FUlJPUl9OT05FLCAwLCBrVGVzdFZhbHVlKSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBzZW5kIHJlc3BvbnNlIGZvciBjaGFyYWN0ZXJpc3RpYy4KLSAgRVhQRUNUX1RSVUUoZ2F0dF9zZXJ2ZXJfLT5TZW5kUmVzcG9uc2Uoa1Rlc3RBZGRyZXNzMCwga1JlcUlkMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9FUlJPUl9OT05FLCAwLCBrVGVzdFZhbHVlKSk7Ci0KLSAgLy8gQ2hhcmFjdGVyaXN0aWMgcmVxdWVzdCBJRCBubyBsb25nZXIgcGVuZGluZy4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0VSUk9SX05PTkUsIDAsIGtUZXN0VmFsdWUpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywKLSAgICAgICAgICAgICAgU2VuZFJlc3BvbnNlKGtDb25uSWQwLCBrUmVxSWQxLCBCVF9TVEFUVVNfU1VDQ0VTUywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLQotICAvLyBTdWNjZXNzZnVsIHNlbmQgcmVzcG9uc2UgZm9yIGRlc2NyaXB0b3IuCi0gIEVYUEVDVF9UUlVFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfRVJST1JfTk9ORSwgMCwga1Rlc3RWYWx1ZSkpOwotCi0gIC8vIERlc2NyaXB0b3IgcmVxdWVzdCBJRCBubyBsb25nZXIgcGVuZGluZy4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0VSUk9SX05PTkUsIDAsIGtUZXN0VmFsdWUpKTsKLQotICBnYXR0X3NlcnZlcl8tPlNldERlbGVnYXRlKG51bGxwdHIpOwotfQotCi1URVNUX0YoR2F0dFNlcnZlclBvc3RSZWdpc3RlclRlc3QsIFJlcXVlc3RXcml0ZSkgewotICBTZXRVcFRlc3RTZXJ2aWNlKCk7Ci0KLSAgVGVzdERlbGVnYXRlIHRlc3RfZGVsZWdhdGU7Ci0gIGdhdHRfc2VydmVyXy0+U2V0RGVsZWdhdGUoJnRlc3RfZGVsZWdhdGUpOwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtUZXN0VmFsdWUgPSB7MHgwMSwgMHgwMiwgMHgwM307Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0QWRkcmVzczAgPSAiMDE6MjM6NDU6Njc6ODk6QUIiOwotICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdEFkZHJlc3MxID0gIkNEOkVGOjAxOjIzOjQ1OjY3IjsKLSAgY29uc3QgaW50IGtSZXFJZDAgPSAwOwotICBjb25zdCBpbnQga1JlcUlkMSA9IDE7Ci0gIGNvbnN0IGludCBrQ29ubklkMCA9IDE7Ci0KLSAgLy8gTm8gcGVuZGluZyByZXF1ZXN0LgotICBFWFBFQ1RfRkFMU0UoZ2F0dF9zZXJ2ZXJfLT5TZW5kUmVzcG9uc2Uoa1Rlc3RBZGRyZXNzMCwga1JlcUlkMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfRVJST1JfTk9ORSwgMCwga1Rlc3RWYWx1ZSkpOwotCi0gIFJhd0FkZHJlc3MgaGFsX2FkZHIwLCBoYWxfYWRkcjE7Ci0gIEFTU0VSVF9UUlVFKFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoa1Rlc3RBZGRyZXNzMCwgaGFsX2FkZHIwKSk7Ci0gIEFTU0VSVF9UUlVFKFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoa1Rlc3RBZGRyZXNzMSwgaGFsX2FkZHIxKSk7Ci0KLSAgLy8gU2VuZCBhIGNvbm5lY3Rpb24gY2FsbGJhY2suIFRoZSBHYXR0U2VydmVyIHNob3VsZCBzdG9yZSB0aGUgY29ubmVjdGlvbgotICAvLyBpbmZvcm1hdGlvbiBhbmQgYmUgYWJsZSB0byBwcm9jZXNzIHRoZSBpbmNvbWluZyByZWFkIHJlcXVlc3RzIGZvciB0aGlzCi0gIC8vIGNvbm5lY3Rpb24uCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlTZXJ2ZXJDb25uZWN0aW9uQ2FsbGJhY2soCi0gICAgICBrQ29ubklkMCwga0RlZmF1bHRTZXJ2ZXJJZCwgdHJ1ZSwgaGFsX2FkZHIwKTsKLQotICAvLyBVbmtub3duIGNvbm5lY3Rpb24gSUQgc2hvdWxkbid0IHRyaWdnZXIgYW55dGhpbmcuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAga0Nvbm5JZDAgKyAxLCBrUmVxSWQwLCBoYWxfYWRkcjAsIGNoYXJfaGFuZGxlXywgMCwgdHJ1ZSwgZmFsc2UsCi0gICAgICBrVGVzdFZhbHVlKTsKLSAgRVhQRUNUX0VRKDAsIHRlc3RfZGVsZWdhdGUuY2hhcl93cml0ZV9yZXEoKS5jb3VudCk7Ci0gIEVYUEVDVF9FUSgwLCB0ZXN0X2RlbGVnYXRlLmRlc2Nfd3JpdGVfcmVxKCkuY291bnQpOwotCi0gIC8vIFVua25vd24gZGV2aWNlIGFkZHJlc3Mgc2hvdWxkbid0IHRyaWdnZXIgYW55dGhpbmcuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAga0Nvbm5JZDAsIGtSZXFJZDAsIGhhbF9hZGRyMSwgY2hhcl9oYW5kbGVfLCAwLCB0cnVlLCBmYWxzZSwga1Rlc3RWYWx1ZSk7Ci0gIEVYUEVDVF9FUSgwLCB0ZXN0X2RlbGVnYXRlLmNoYXJfd3JpdGVfcmVxKCkuY291bnQpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3dyaXRlX3JlcSgpLmNvdW50KTsKLQotICAvLyBDaGFyYWN0ZXJpc3RpYyBhbmQgZGVzY3JpcHRvciBoYW5kbGVzIHNob3VsZCB0cmlnZ2VyIGNvcnJlY3QgY2FsbGJhY2tzLgotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5UmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICAgIGtDb25uSWQwLCBrUmVxSWQwLCBoYWxfYWRkcjAsIGNoYXJfaGFuZGxlXywgMCwgdHJ1ZSwgZmFsc2UsIGtUZXN0VmFsdWUpOwotICBFWFBFQ1RfRVEoMSwgdGVzdF9kZWxlZ2F0ZS5jaGFyX3dyaXRlX3JlcSgpLmNvdW50KTsKLSAgRVhQRUNUX0VRKGtUZXN0QWRkcmVzczAsIHRlc3RfZGVsZWdhdGUuY2hhcl93cml0ZV9yZXEoKS5kZXZpY2VfYWRkcmVzcyk7Ci0gIEVYUEVDVF9FUShrUmVxSWQwLCB0ZXN0X2RlbGVnYXRlLmNoYXJfd3JpdGVfcmVxKCkuaWQpOwotICBFWFBFQ1RfRVEoMCwgdGVzdF9kZWxlZ2F0ZS5jaGFyX3dyaXRlX3JlcSgpLm9mZnNldCk7Ci0gIEVYUEVDVF9FUSh0cnVlLCB0ZXN0X2RlbGVnYXRlLmNoYXJfd3JpdGVfcmVxKCkubmVlZF9yc3ApOwotICBFWFBFQ1RfRVEoZmFsc2UsIHRlc3RfZGVsZWdhdGUuY2hhcl93cml0ZV9yZXEoKS5pc19leGVjKTsKLSAgRVhQRUNUX0VRKGtUZXN0VmFsdWUsIHRlc3RfZGVsZWdhdGUuY2hhcl93cml0ZV9yZXEoKS53cml0ZV92YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKGNoYXJfaGFuZGxlXyA9PSB0ZXN0X2RlbGVnYXRlLmNoYXJfd3JpdGVfcmVxKCkuaGFuZGxlKTsKLSAgRVhQRUNUX0VRKDAsIHRlc3RfZGVsZWdhdGUuZGVzY193cml0ZV9yZXEoKS5jb3VudCk7Ci0KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlcXVlc3RXcml0ZURlc2NyaXB0b3JDYWxsYmFjaygKLSAgICAgIGtDb25uSWQwLCBrUmVxSWQxLCBoYWxfYWRkcjAsIGRlc2NfaGFuZGxlXywgMiwgdHJ1ZSwgZmFsc2UsIGtUZXN0VmFsdWUpOwotICBFWFBFQ1RfRVEoMSwgdGVzdF9kZWxlZ2F0ZS5jaGFyX3dyaXRlX3JlcSgpLmNvdW50KTsKLSAgRVhQRUNUX0VRKDEsIHRlc3RfZGVsZWdhdGUuZGVzY193cml0ZV9yZXEoKS5jb3VudCk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkZHJlc3MwLCB0ZXN0X2RlbGVnYXRlLmRlc2Nfd3JpdGVfcmVxKCkuZGV2aWNlX2FkZHJlc3MpOwotICBFWFBFQ1RfRVEoa1JlcUlkMSwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3dyaXRlX3JlcSgpLmlkKTsKLSAgRVhQRUNUX0VRKDIsIHRlc3RfZGVsZWdhdGUuZGVzY193cml0ZV9yZXEoKS5vZmZzZXQpOwotICBFWFBFQ1RfRVEodHJ1ZSwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3dyaXRlX3JlcSgpLm5lZWRfcnNwKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCB0ZXN0X2RlbGVnYXRlLmRlc2Nfd3JpdGVfcmVxKCkuaXNfZXhlYyk7Ci0gIEVYUEVDVF9FUShrVGVzdFZhbHVlLCB0ZXN0X2RlbGVnYXRlLmRlc2Nfd3JpdGVfcmVxKCkud3JpdGVfdmFsdWUpOwotICBFWFBFQ1RfVFJVRShkZXNjX2hhbmRsZV8gPT0gdGVzdF9kZWxlZ2F0ZS5kZXNjX3dyaXRlX3JlcSgpLmhhbmRsZSk7Ci0KLSAgLy8gQ2FsbGJhY2sgd2l0aCBhIHBlbmRpbmcgcmVxdWVzdCBJRCB3aWxsIGJlIGlnbm9yZWQuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAga0Nvbm5JZDAsIGtSZXFJZDAsIGhhbF9hZGRyMCwgY2hhcl9oYW5kbGVfLCAwLCB0cnVlLCBmYWxzZSwga1Rlc3RWYWx1ZSk7Ci0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZXF1ZXN0V3JpdGVDaGFyYWN0ZXJpc3RpY0NhbGxiYWNrKAotICAgICAga0Nvbm5JZDAsIGtSZXFJZDEsIGhhbF9hZGRyMCwgY2hhcl9oYW5kbGVfLCAwLCB0cnVlLCBmYWxzZSwga1Rlc3RWYWx1ZSk7Ci0gIEVYUEVDVF9FUSgxLCB0ZXN0X2RlbGVnYXRlLmNoYXJfd3JpdGVfcmVxKCkuY291bnQpOwotICBFWFBFQ1RfRVEoMSwgdGVzdF9kZWxlZ2F0ZS5kZXNjX3dyaXRlX3JlcSgpLmNvdW50KTsKLQotICAvLyBTZW5kIHJlc3BvbnNlIGZvciB3cm9uZyBkZXZpY2UgYWRkcmVzcy4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczEsIGtSZXFJZDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0VSUk9SX05PTkUsIDAsIGtUZXN0VmFsdWUpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywKLSAgICAgICAgICAgICAgU2VuZFJlc3BvbnNlKGtDb25uSWQwLCBrUmVxSWQwLCBCVF9TVEFUVVNfU1VDQ0VTUywgXykpCi0gICAgICAuVGltZXMoMikKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX0ZBSUwpKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotCi0gIC8vIFN0YWNrIGNhbGwgZmFpbHMuCi0gIEVYUEVDVF9GQUxTRShnYXR0X3NlcnZlcl8tPlNlbmRSZXNwb25zZShrVGVzdEFkZHJlc3MwLCBrUmVxSWQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9FUlJPUl9OT05FLCAwLCBrVGVzdFZhbHVlKSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBzZW5kIHJlc3BvbnNlIGZvciBjaGFyYWN0ZXJpc3RpYy4KLSAgRVhQRUNUX1RSVUUoZ2F0dF9zZXJ2ZXJfLT5TZW5kUmVzcG9uc2Uoa1Rlc3RBZGRyZXNzMCwga1JlcUlkMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9FUlJPUl9OT05FLCAwLCBrVGVzdFZhbHVlKSk7Ci0KLSAgLy8gQ2hhcmFjdGVyaXN0aWMgcmVxdWVzdCBJRCBubyBsb25nZXIgcGVuZGluZy4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0VSUk9SX05PTkUsIDAsIGtUZXN0VmFsdWUpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywKLSAgICAgICAgICAgICAgU2VuZFJlc3BvbnNlKGtDb25uSWQwLCBrUmVxSWQxLCBCVF9TVEFUVVNfU1VDQ0VTUywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLQotICAvLyBTdWNjZXNzZnVsIHNlbmQgcmVzcG9uc2UgZm9yIGRlc2NyaXB0b3IuCi0gIEVYUEVDVF9UUlVFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfRVJST1JfTk9ORSwgMCwga1Rlc3RWYWx1ZSkpOwotCi0gIC8vIERlc2NyaXB0b3IgcmVxdWVzdCBJRCBubyBsb25nZXIgcGVuZGluZy4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZFJlc3BvbnNlKGtUZXN0QWRkcmVzczAsIGtSZXFJZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX0VSUk9SX05PTkUsIDAsIGtUZXN0VmFsdWUpKTsKLQotICAvLyBTZW5kUmVzcG9uc2Ugc2hvdWxkIGZhaWwgZm9yIGEgIldyaXRlIFdpdGhvdXQgUmVzcG9uc2UiLgotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5UmVxdWVzdFdyaXRlQ2hhcmFjdGVyaXN0aWNDYWxsYmFjaygKLSAgICAgIGtDb25uSWQwLCBrUmVxSWQwLCBoYWxfYWRkcjAsIGNoYXJfaGFuZGxlXywgMCwgZmFsc2UsIGZhbHNlLCBrVGVzdFZhbHVlKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCB0ZXN0X2RlbGVnYXRlLmNoYXJfd3JpdGVfcmVxKCkubmVlZF9yc3ApOwotICBFWFBFQ1RfRkFMU0UoZ2F0dF9zZXJ2ZXJfLT5TZW5kUmVzcG9uc2Uoa1Rlc3RBZGRyZXNzMCwga1JlcUlkMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfRVJST1JfTk9ORSwgMCwga1Rlc3RWYWx1ZSkpOwotCi0gIGdhdHRfc2VydmVyXy0+U2V0RGVsZWdhdGUobnVsbHB0cik7Ci19Ci0KLVRFU1RfRihHYXR0U2VydmVyUG9zdFJlZ2lzdGVyVGVzdCwgU2VuZE5vdGlmaWNhdGlvbikgewotICBTZXRVcFRlc3RTZXJ2aWNlKCk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RBZGRyZXNzMCA9ICIwMToyMzo0NTo2Nzo4OTpBQiI7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0QWRkcmVzczEgPSAiY2Q6ZWY6MDE6MjM6NDU6NjciOwotICBjb25zdCBzdGQ6OnN0cmluZyBrSW52YWxpZEFkZHJlc3MgPSAidGhpbmdhbWFqaWcgYmxhYmJpZHlib29wIjsKLSAgY29uc3QgaW50IGtDb25uSWQwID0gMDsKLSAgY29uc3QgaW50IGtDb25uSWQxID0gMTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWU7Ci0gIFJhd0FkZHJlc3MgaGFsX2FkZHIwOwotICBBU1NFUlRfVFJVRShSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcmVzczAsIGhhbF9hZGRyMCkpOwotCi0gIC8vIFNldCB1cCB0d28gY29ubmVjdGlvbnMgd2l0aCB0aGUgc2FtZSBhZGRyZXNzLgotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5U2VydmVyQ29ubmVjdGlvbkNhbGxiYWNrKAotICAgICAga0Nvbm5JZDAsIGtEZWZhdWx0U2VydmVySWQsIHRydWUsIGhhbF9hZGRyMCk7Ci0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlTZXJ2ZXJDb25uZWN0aW9uQ2FsbGJhY2soCi0gICAgICBrQ29ubklkMSwga0RlZmF1bHRTZXJ2ZXJJZCwgdHJ1ZSwgaGFsX2FkZHIwKTsKLQotICAvLyBTZXQgdXAgYSB0ZXN0IGNhbGxiYWNrLgotICBHQVRURXJyb3IgZ2F0dF9lcnJvcjsKLSAgaW50IGNhbGxiYWNrX2NvdW50ID0gMDsKLSAgYXV0byBjYWxsYmFjayA9IFsmXShHQVRURXJyb3IgaW5fZXJyb3IpIHsKLSAgICBnYXR0X2Vycm9yID0gaW5fZXJyb3I7Ci0gICAgY2FsbGJhY2tfY291bnQrKzsKLSAgfTsKLQotICAvLyBCYWQgZGV2aWNlIGFkZHJlc3MuCi0gIEVYUEVDVF9GQUxTRShnYXR0X3NlcnZlcl8tPlNlbmROb3RpZmljYXRpb24oa0ludmFsaWRBZGRyZXNzLCBjaGFyX2hhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZhbHVlLCBjYWxsYmFjaykpOwotCi0gIC8vIEJhZCBjb25uZWN0aW9uLgotICBFWFBFQ1RfRkFMU0UoZ2F0dF9zZXJ2ZXJfLT5TZW5kTm90aWZpY2F0aW9uKGtUZXN0QWRkcmVzczEsIGNoYXJfaGFuZGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdmFsdWUsIGNhbGxiYWNrKSk7Ci0KLSAgLy8gV2Ugc2hvdWxkIGdldCBhIEhBTCBjYWxsIGZvciBlYWNoIGNvbm5lY3Rpb24gZm9yIHRoaXMgYWRkcmVzcy4gVGhlIGNhbGxzCi0gIC8vIGZhaWwuCi0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBTZW5kSW5kaWNhdGlvbihrRGVmYXVsdFNlcnZlcklkLCBjaGFyX2hhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29ubklkMCwgMCwgdmFsdWUpKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19GQUlMKSk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBTZW5kSW5kaWNhdGlvbihrRGVmYXVsdFNlcnZlcklkLCBjaGFyX2hhbmRsZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ29ubklkMSwgMCwgdmFsdWUpKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19GQUlMKSk7Ci0gIEVYUEVDVF9GQUxTRShnYXR0X3NlcnZlcl8tPlNlbmROb3RpZmljYXRpb24oa1Rlc3RBZGRyZXNzMCwgY2hhcl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB2YWx1ZSwgY2FsbGJhY2spKTsKLQotICAvLyBPbmUgb2YgdGhlIGNhbGxzIHN1Y2NlZWRzLgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2VuZEluZGljYXRpb24oa0RlZmF1bHRTZXJ2ZXJJZCwgY2hhcl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Nvbm5JZDAsIDAsIHZhbHVlKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2VuZEluZGljYXRpb24oa0RlZmF1bHRTZXJ2ZXJJZCwgY2hhcl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Nvbm5JZDEsIDAsIHZhbHVlKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfRkFJTCkpOwotICBFWFBFQ1RfVFJVRShnYXR0X3NlcnZlcl8tPlNlbmROb3RpZmljYXRpb24oa1Rlc3RBZGRyZXNzMCwgY2hhcl9oYW5kbGVfLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBjYWxsYmFjaykpOwotCi0gIC8vIE9uZSBvZiB0aGUgY29ubmVjdGlvbnMgaXMgYWxyZWFkeSBwZW5kaW5nIHNvIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBjYWxsLgotICAvLyBUaGlzIG9uZSB3ZSBzZW5kIHdpdGggY29uZmlybT10cnVlLgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2VuZEluZGljYXRpb24oa0RlZmF1bHRTZXJ2ZXJJZCwgY2hhcl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Nvbm5JZDEsIDEsIHZhbHVlKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBFWFBFQ1RfVFJVRShnYXR0X3NlcnZlcl8tPlNlbmROb3RpZmljYXRpb24oa1Rlc3RBZGRyZXNzMCwgY2hhcl9oYW5kbGVfLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGNhbGxiYWNrKSk7Ci0KLSAgLy8gQ2FsbHMgYXJlIGFscmVhZHkgcGVuZGluZy4KLSAgRVhQRUNUX0ZBTFNFKGdhdHRfc2VydmVyXy0+U2VuZE5vdGlmaWNhdGlvbihrVGVzdEFkZHJlc3MwLCBjaGFyX2hhbmRsZV8sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGNhbGxiYWNrKSk7Ci0KLSAgLy8gVHJpZ2dlciBvbmUgY29uZmlybWF0aW9uIGNhbGxiYWNrLiBXZSBzaG91bGQgZ2V0IGNhbGxzIGZvciB0d28gY2FsbGJhY2tzCi0gIC8vIHNpbmNlIHdlIGhhdmUgdHdvIHNlcGFyYXRlIGNhbGxzIHBlbmRpbmcuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlJbmRpY2F0aW9uU2VudENhbGxiYWNrKGtDb25uSWQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlJbmRpY2F0aW9uU2VudENhbGxiYWNrKGtDb25uSWQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIEVYUEVDVF9FUSgyLCBjYWxsYmFja19jb3VudCk7Ci0gIEVYUEVDVF9FUShHQVRUX0VSUk9SX05PTkUsIGdhdHRfZXJyb3IpOwotCi0gIGNhbGxiYWNrX2NvdW50ID0gMDsKLQotICAvLyBSZXN0YXJ0LiBCb3RoIGNhbGxzIHN1Y2NlZWQgbm93LgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2VuZEluZGljYXRpb24oa0RlZmF1bHRTZXJ2ZXJJZCwgY2hhcl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Nvbm5JZDAsIDAsIHZhbHVlKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2VuZEluZGljYXRpb24oa0RlZmF1bHRTZXJ2ZXJJZCwgY2hhcl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Nvbm5JZDEsIDAsIHZhbHVlKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBFWFBFQ1RfVFJVRShnYXR0X3NlcnZlcl8tPlNlbmROb3RpZmljYXRpb24oa1Rlc3RBZGRyZXNzMCwgY2hhcl9oYW5kbGVfLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBjYWxsYmFjaykpOwotCi0gIC8vIFRyaWdnZXIgb25lIGNvbmZpcm1hdGlvbiBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIHdlIHBhc3NlZCBzaG91bGQgc3RpbGwgYmUKLSAgLy8gcGVuZGluZy4gVGhlIGZpcnN0IGNhbGxiYWNrIGlzIGZvciB0aGUgd3JvbmcgY29ubmVjdGlvbiBJRC4KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeUluZGljYXRpb25TZW50Q2FsbGJhY2soa0Nvbm5JZDAgKyA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX0ZBSUwpOwotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5SW5kaWNhdGlvblNlbnRDYWxsYmFjayhrQ29ubklkMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIFRoaXMgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2UgfGtDb25uSWQwfCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlJbmRpY2F0aW9uU2VudENhbGxiYWNrKGtDb25uSWQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIEVYUEVDVF9FUSgwLCBjYWxsYmFja19jb3VudCk7Ci0KLSAgLy8gUnVuIHRoZSBjYWxsYmFjayB3aXRoIGZhaWx1cmUuIFNpbmNlIHRoZSBwcmV2aW91cyBjYWxsYmFjayByZXBvcnRlZAotICAvLyBzdWNjZXNzLCB3ZSBzaG91bGQgcmVwb3J0IHN1Y2Nlc3MuCi0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlJbmRpY2F0aW9uU2VudENhbGxiYWNrKGtDb25uSWQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIEVYUEVDVF9FUSgxLCBjYWxsYmFja19jb3VudCk7Ci0gIEVYUEVDVF9FUShHQVRUX0VSUk9SX05PTkUsIGdhdHRfZXJyb3IpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9pcGNfbGludXhfdW5pdHRlc3QuY2MgYi9zZXJ2aWNlL3Rlc3QvaXBjX2xpbnV4X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZjZDZhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvdGVzdC9pcGNfbGludXhfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0KLSNpbmNsdWRlIDxiYXNlL2F0X2V4aXQuaD4KLSNpbmNsdWRlIDxiYXNlL2NvbW1hbmRfbGluZS5oPgotI2luY2x1ZGUgPGJhc2UvZmlsZXMvc2NvcGVkX2ZpbGUuaD4KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJhc2UvcnVuX2xvb3AuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgImFic3RyYWN0X21lc3NhZ2VfbG9vcCIKLSNpbmNsdWRlICJhcnJheV91dGlscy5oIgotI2luY2x1ZGUgInNlcnZpY2UvYWRhcHRlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvZmFrZV9ibHVldG9vdGhfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9pcGMvaXBjX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL3NldHRpbmdzLmgiCi0jaW5jbHVkZSAic2VydmljZS90ZXN0L21vY2tfZGFlbW9uLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLQotY29uc3QgY2hhciBrVGVzdFNvY2tldFBhdGhbXSA9ICJ0ZXN0X3NvY2tldF9wYXRoIjsKLQotY2xhc3MgSVBDTGludXhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBJUENMaW51eFRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5JUENMaW51eFRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBTZXRVcENvbW1hbmRMaW5lKCk7Ci0gICAgQVNTRVJUX1RSVUUoc2V0dGluZ3NfLkluaXQoKSk7Ci0KLSAgICBhdXRvIG1vY2tfZGFlbW9uID0gbmV3IGJsdWV0b290aDo6dGVzdGluZzo6TW9ja0RhZW1vbigpOwotCi0gICAgT05fQ0FMTCgqbW9ja19kYWVtb24sIEdldFNldHRpbmdzKCkpLldpbGxCeURlZmF1bHQoUmV0dXJuKCZzZXR0aW5nc18pKTsKLSAgICBPTl9DQUxMKCptb2NrX2RhZW1vbiwgR2V0TWVzc2FnZUxvb3AoKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKCZtZXNzYWdlX2xvb3BfKSk7Ci0KLSAgICBibHVldG9vdGg6OkRhZW1vbjo6SW5pdGlhbGl6ZUZvclRlc3RpbmcobW9ja19kYWVtb24pOwotICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6OkluaXRpYWxpemVGb3JUZXN0aW5nKAotICAgICAgICBuZXcgYmx1ZXRvb3RoOjpoYWw6OkZha2VCbHVldG9vdGhJbnRlcmZhY2UoKSk7Ci0gICAgYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkluaXRpYWxpemVGb3JUZXN0aW5nKAotICAgICAgICBuZXcgYmx1ZXRvb3RoOjpoYWw6OkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlKG51bGxwdHIsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpOwotCi0gICAgYWRhcHRlcl8gPSBibHVldG9vdGg6OkFkYXB0ZXI6OkNyZWF0ZSgpOwotICAgIGlwY19tYW5hZ2VyXy5yZXNldChuZXcgaXBjOjpJUENNYW5hZ2VyKGFkYXB0ZXJfLmdldCgpKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGNsaWVudF9mZF8ucmVzZXQoKTsKLSAgICBpcGNfbWFuYWdlcl8ucmVzZXQoKTsKLSAgICBhZGFwdGVyXy5yZXNldCgpOwotICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGVhblVwKCk7Ci0gICAgYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEludGVyZmFjZTo6Q2xlYW5VcCgpOwotICAgIGJsdWV0b290aDo6RGFlbW9uOjpTaHV0RG93bigpOwotICAgIGJhc2U6OkNvbW1hbmRMaW5lOjpSZXNldCgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFNldFVwQ29tbWFuZExpbmUoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaXBjX3NvY2tldF9hcmcgPQotICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIi0tY3JlYXRlLWlwYy1zb2NrZXQ9JXMiLCBrVGVzdFNvY2tldFBhdGgpOwotICAgIGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lOjpDaGFyVHlwZSogYXJndltdID0gewotICAgICAgICAicHJvZ3JhbSIsIGlwY19zb2NrZXRfYXJnLmNfc3RyKCksCi0gICAgfTsKLSAgICBiYXNlOjpDb21tYW5kTGluZTo6SW5pdChBUlJBWV9TSVpFKGFyZ3YpLCBhcmd2KTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdFRvVGVzdFNvY2tldCgpIHsKLSAgICBjbGllbnRfZmRfLnJlc2V0KHNvY2tldChQRl9VTklYLCBTT0NLX1NFUVBBQ0tFVCwgMCkpOwotICAgIEFTU0VSVF9UUlVFKGNsaWVudF9mZF8uaXNfdmFsaWQoKSk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKLSAgICBtZW1zZXQoJmFkZHJlc3MsIDAsIHNpemVvZihhZGRyZXNzKSk7Ci0gICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzdHJuY3B5KGFkZHJlc3Muc3VuX3BhdGgsIGtUZXN0U29ja2V0UGF0aCwgc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gMSk7Ci0KLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICAgY29ubmVjdChjbGllbnRfZmRfLmdldCgpLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKTsKLSAgICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBiYXNlOjpBdEV4aXRNYW5hZ2VyIGV4aXRfbWFuYWdlcl87Ci0gIERFRklORV9URVNUX1RBU0tfRU5WKG1lc3NhZ2VfbG9vcF8pOwotICBibHVldG9vdGg6OlNldHRpbmdzIHNldHRpbmdzXzsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpBZGFwdGVyPiBhZGFwdGVyXzsKLSAgc3RkOjp1bmlxdWVfcHRyPGlwYzo6SVBDTWFuYWdlcj4gaXBjX21hbmFnZXJfOwotICBiYXNlOjpTY29wZWRGRCBjbGllbnRfZmRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihJUENMaW51eFRlc3QpOwotfTsKLQotY2xhc3MgSVBDTGludXhUZXN0RGlzYWJsZWQgOiBwdWJsaWMgSVBDTGludXhUZXN0IHsKLSBwdWJsaWM6Ci0gIElQQ0xpbnV4VGVzdERpc2FibGVkKCkgPSBkZWZhdWx0OwotICB+SVBDTGludXhUZXN0RGlzYWJsZWQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcENvbW1hbmRMaW5lKCkgb3ZlcnJpZGUgewotICAgIC8vIFNldCB1cCB3aXRoIG5vIC0taXBjLXNvY2tldC1wYXRoCi0gICAgY29uc3QgYmFzZTo6Q29tbWFuZExpbmU6OkNoYXJUeXBlKiBhcmd2W10gPSB7InByb2dyYW0ifTsKLSAgICBiYXNlOjpDb21tYW5kTGluZTo6SW5pdChBUlJBWV9TSVpFKGFyZ3YpLCBhcmd2KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKElQQ0xpbnV4VGVzdERpc2FibGVkKTsKLX07Ci0KLWNsYXNzIFRlc3REZWxlZ2F0ZSA6IHB1YmxpYyBpcGM6OklQQ01hbmFnZXI6OkRlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJhc2U6OlN1cHBvcnRzV2Vha1B0cjxUZXN0RGVsZWdhdGU+IHsKLSBwdWJsaWM6Ci0gIFRlc3REZWxlZ2F0ZSgpIDogc3RhcnRlZF9jb3VudF8oMCksIHN0b3BwZWRfY291bnRfKDApIHt9Ci0KLSAgdm9pZCBPbklQQ0hhbmRsZXJTdGFydGVkKGlwYzo6SVBDTWFuYWdlcjo6VHlwZSB0eXBlKSBvdmVycmlkZSB7Ci0gICAgQVNTRVJUX0VRKGlwYzo6SVBDTWFuYWdlcjo6VFlQRV9MSU5VWCwgdHlwZSk7Ci0gICAgc3RhcnRlZF9jb3VudF8rKzsKLSAgICBidGJhc2U6OkFic3RyYWN0VGVzdE1lc3NhZ2VMb29wOjpjdXJyZW50SU8oKS0+UXVpdFdoZW5JZGxlKCk7Ci0gIH0KLQotICB2b2lkIE9uSVBDSGFuZGxlclN0b3BwZWQoaXBjOjpJUENNYW5hZ2VyOjpUeXBlIHR5cGUpIG92ZXJyaWRlIHsKLSAgICBBU1NFUlRfRVEoaXBjOjpJUENNYW5hZ2VyOjpUWVBFX0xJTlVYLCB0eXBlKTsKLSAgICBzdG9wcGVkX2NvdW50XysrOwotICAgIGJ0YmFzZTo6QWJzdHJhY3RUZXN0TWVzc2FnZUxvb3A6OmN1cnJlbnRJTygpLT5RdWl0V2hlbklkbGUoKTsKLSAgfQotCi0gIGludCBzdGFydGVkX2NvdW50KCkgY29uc3QgeyByZXR1cm4gc3RhcnRlZF9jb3VudF87IH0KLSAgaW50IHN0b3BwZWRfY291bnQoKSBjb25zdCB7IHJldHVybiBzdG9wcGVkX2NvdW50XzsgfQotCi0gcHJpdmF0ZToKLSAgaW50IHN0YXJ0ZWRfY291bnRfOwotICBpbnQgc3RvcHBlZF9jb3VudF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRlc3REZWxlZ2F0ZSk7Ci19OwotCi1URVNUX0YoSVBDTGludXhUZXN0RGlzYWJsZWQsIFN0YXJ0V2l0aE5vU29ja2V0UGF0aCkgewotICBUZXN0RGVsZWdhdGUgZGVsZWdhdGU7Ci0gIEVYUEVDVF9GQUxTRShpcGNfbWFuYWdlcl8tPlN0YXJ0KGlwYzo6SVBDTWFuYWdlcjo6VFlQRV9MSU5VWCwgJmRlbGVnYXRlKSk7Ci0gIEVYUEVDVF9GQUxTRShpcGNfbWFuYWdlcl8tPkxpbnV4U3RhcnRlZCgpKTsKLSAgRVhQRUNUX0VRKDAsIGRlbGVnYXRlLnN0YXJ0ZWRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5zdG9wcGVkX2NvdW50KCkpOwotfQotCi1URVNUX0YoSVBDTGludXhUZXN0LCBCYXNpY1N0YXJ0QW5kRXhpdCkgewotICBUZXN0RGVsZWdhdGUgZGVsZWdhdGU7Ci0gIEVYUEVDVF9UUlVFKGlwY19tYW5hZ2VyXy0+U3RhcnQoaXBjOjpJUENNYW5hZ2VyOjpUWVBFX0xJTlVYLCAmZGVsZWdhdGUpKTsKLSAgRVhQRUNUX1RSVUUoaXBjX21hbmFnZXJfLT5MaW51eFN0YXJ0ZWQoKSk7Ci0KLSAgLy8gUnVuIHRoZSBtZXNzYWdlIGxvb3AuIFdlIHdpbGwgc3RvcCB0aGUgbG9vcCB3aGVuIHdlIHJlY2VpdmUgYSBkZWxlZ2F0ZQotICAvLyBldmVudC4KLSAgYmFzZTo6UnVuTG9vcCgpLlJ1bigpOwotCi0gIC8vIFdlIHNob3VsZCBoYXZlIHJlY2VpdmVkIHRoZSBzdGFydGVkIGV2ZW50LgotICBFWFBFQ1RfRVEoMSwgZGVsZWdhdGUuc3RhcnRlZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIGRlbGVnYXRlLnN0b3BwZWRfY291bnQoKSk7Ci0KLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgdGhyZWFkIGlzIGJsb2NraW5nIG9uIGFjY2VwdCBhbmQgbGlzdGVuaW5nIGZvciBpbmNvbWluZwotICAvLyBjb25uZWN0aW9ucy4gVGVhckRvd24gc2hvdWxkIGdyYWNlZnVsbHkgY2xlYW4gdXAgdGhlIHRocmVhZCBhbmQgdGhlIHRlc3QKLSAgLy8gc2hvdWxkIHN1Y2NlZWQgd2l0aG91dCBoYW5naW5nLgotICBpcGNfbWFuYWdlcl8ucmVzZXQoKTsKLSAgYmFzZTo6UnVuTG9vcCgpLlJ1bigpOwotICBFWFBFQ1RfRVEoMSwgZGVsZWdhdGUuc3RvcHBlZF9jb3VudCgpKTsKLX0KLQotVEVTVF9GKElQQ0xpbnV4VGVzdCwgQmFzaWNTdGFydEFuZENvbm5lY3QpIHsKLSAgVGVzdERlbGVnYXRlIGRlbGVnYXRlOwotICBFWFBFQ1RfVFJVRShpcGNfbWFuYWdlcl8tPlN0YXJ0KGlwYzo6SVBDTWFuYWdlcjo6VFlQRV9MSU5VWCwgJmRlbGVnYXRlKSk7Ci0gIEVYUEVDVF9UUlVFKGlwY19tYW5hZ2VyXy0+TGludXhTdGFydGVkKCkpOwotCi0gIC8vIFJ1biB0aGUgbWVzc2FnZSBsb29wLiBXZSB3aWxsIHN0b3AgdGhlIGxvb3Agd2hlbiB3ZSByZWNlaXZlIGEgZGVsZWdhdGUKLSAgLy8gZXZlbnQuCi0gIGJhc2U6OlJ1bkxvb3AoKS5SdW4oKTsKLQotICAvLyBXZSBzaG91bGQgaGF2ZSByZWNlaXZlZCB0aGUgc3RhcnRlZCBldmVudC4KLSAgRVhQRUNUX0VRKDEsIGRlbGVnYXRlLnN0YXJ0ZWRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5zdG9wcGVkX2NvdW50KCkpOwotCi0gIC8vIElQQyBzdWNjZXNzZnVsbHkgc3RhcnRlZC4gTm93IGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGUgc29ja2V0LgotICBDb25uZWN0VG9UZXN0U29ja2V0KCk7Ci0KLSAgLy8gVE9ETyhhcm1hbnNpdG8pOiBUZXN0IHRoYXQgdGhlIElQQyBldmVudCBsb29wIHNodXRzIGRvd24gY2xlYW5seSB3aGlsZSBhCi0gIC8vIGNsaWVudCBpcyBjb25uZWN0ZWQuIEN1cnJlbnRseSB0aGlzIHdpbGwgZmFpbCBhbmQgdGhlIGZpeCBpcyB0byB1c2UKLSAgLy8gTWVzc2FnZUxvb3BGb3JJTyByYXRoZXIgdGhhbiBhIGN1c3RvbSBldmVudCBsb29wLgotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9sb3dfZW5lcmd5X2FkdmVydGlzZXJfdW5pdHRlc3QuY2MgYi9zZXJ2aWNlL3Rlc3QvbG93X2VuZXJneV9hZHZlcnRpc2VyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFlYjJiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvdGVzdC9sb3dfZW5lcmd5X2FkdmVydGlzZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NDEgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvYWRhcHRlci5oIgotI2luY2x1ZGUgInNlcnZpY2UvaGFsL2Zha2VfYmx1ZXRvb3RoX2dhdHRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9sb3dfZW5lcmd5X2FkdmVydGlzZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lkZWZzLmgiCi0jaW5jbHVkZSAidGVzdC9tb2NrX2FkYXB0ZXIuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpfOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6RXhhY3RseTsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpQb2ludGVlOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyA6OnRlc3Rpbmc6Ok1hdGNoZXI7Ci11c2luZyBzdGF0dXNfY2IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPjsKLXVzaW5nIHJlZ19jYiA9Ci0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGFkdmVydGlzZXJfaWQgKi8sIHVpbnQ4X3QgLyogc3RhdHVzICovKT47Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW9ja0FkdmVydGlzZXJIYW5kbGVyIDogcHVibGljIEJsZUFkdmVydGlzZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTW9ja0FkdmVydGlzZXJIYW5kbGVyKCkge30KLSAgfk1vY2tBZHZlcnRpc2VySGFuZGxlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBNT0NLX01FVEhPRDEoUmVnaXN0ZXJBZHZlcnRpc2VyLCB2b2lkKElkU3RhdHVzQ2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QxKFVucmVnaXN0ZXIsIHZvaWQodWludDhfdCkpOwotICBNT0NLX01FVEhPRDIoR2V0T3duQWRkcmVzcywgdm9pZCh1aW50OF90LCBHZXRBZGRyZXNzQ2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QzKFNldFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICB2b2lkKHVpbnQ4X3QsIEFkdmVydGlzZVBhcmFtZXRlcnMsIFBhcmFtZXRlcnNDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDQoU2V0RGF0YSwgdm9pZChpbnQsIGJvb2wsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTdGF0dXNDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDYoRW5hYmxlLCB2b2lkKHVpbnQ4X3QsIGJvb2wsIFN0YXR1c0NhbGxiYWNrLCB1aW50MTZfdCwgdWludDhfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDcoU3RhcnRBZHZlcnRpc2luZywKLSAgICAgICAgICAgICAgIHZvaWQodWludDhfdCBhZHZlcnRpc2VyX2lkLCBTdGF0dXNDYWxsYmFjayBjYiwKLSAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlUGFyYW1ldGVycywgc3RkOjp2ZWN0b3I8dWludDhfdD4sCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBpbnQsIFN0YXR1c0NhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMTAoU3RhcnRBZHZlcnRpc2luZ1NldCwKLSAgICAgICAgICAgICAgICB2b2lkKGludCByZWdfaWQsIElkVHhQb3dlclN0YXR1c0NhbGxiYWNrIGNiLAotICAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlUGFyYW1ldGVycyBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHBlcmlvZGljX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlcmlvZGljX2RhdGEsIHVpbnQxNl90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhFeHRBZHZFdmVudHMsIElkU3RhdHVzQ2FsbGJhY2sgdGltZW91dF9jYikpOwotICBNT0NLX01FVEhPRDMoU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICB2b2lkKGludCwgUGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMsIFN0YXR1c0NhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMyhTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YSwKLSAgICAgICAgICAgICAgIHZvaWQoaW50LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU3RhdHVzQ2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QzKFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUsIHZvaWQoaW50LCBib29sLCBTdGF0dXNDYWxsYmFjaykpOwotICBNT0NLX01FVEhPRDEoUmVnaXN0ZXJDYWxsYmFja3MsIHZvaWQoQWR2ZXJ0aXNpbmdDYWxsYmFja3MqIGNhbGxiYWNrcykpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tBZHZlcnRpc2VySGFuZGxlcik7Ci19OwotCi1jbGFzcyBMb3dFbmVyZ3lBZHZlcnRpc2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgTG93RW5lcmd5QWR2ZXJ0aXNlclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5Mb3dFbmVyZ3lBZHZlcnRpc2VyVGVzdCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIC8vIE9ubHkgc2V0IHxtb2NrX2hhbmRsZXJffCBpZiBhIHRlc3QgaGFzbid0IHNldCBpdC4KLSAgICBpZiAoIW1vY2tfaGFuZGxlcl8pIG1vY2tfaGFuZGxlcl8ucmVzZXQobmV3IE1vY2tBZHZlcnRpc2VySGFuZGxlcigpKTsKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkluaXRpYWxpemVGb3JUZXN0aW5nKAotICAgICAgICBuZXcgaGFsOjpGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZSgKLSAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxCbGVBZHZlcnRpc2VySW50ZXJmYWNlPihtb2NrX2hhbmRsZXJfKSwKLSAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKTsKLSAgICBibGVfYWR2ZXJ0aXNlcl9mYWN0b3J5Xy5yZXNldChuZXcgTG93RW5lcmd5QWR2ZXJ0aXNlckZhY3RvcnkoKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGJsZV9hZHZlcnRpc2VyX2ZhY3RvcnlfLnJlc2V0KCk7Ci0gICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpDbGVhblVwKCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzaGFyZWRfcHRyPE1vY2tBZHZlcnRpc2VySGFuZGxlcj4gbW9ja19oYW5kbGVyXzsKLSAgc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUFkdmVydGlzZXJGYWN0b3J5PiBibGVfYWR2ZXJ0aXNlcl9mYWN0b3J5XzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lBZHZlcnRpc2VyVGVzdCk7Ci19OwotCi0vLyBVc2VkIGZvciB0ZXN0cyB0aGF0IG9wZXJhdGUgb24gYSBwcmUtcmVnaXN0ZXJlZCBhZHZlcnRpc2VyLgotY2xhc3MgTG93RW5lcmd5QWR2ZXJ0aXNlclBvc3RSZWdpc3RlclRlc3QgOiBwdWJsaWMgTG93RW5lcmd5QWR2ZXJ0aXNlclRlc3QgewotIHB1YmxpYzoKLSAgTG93RW5lcmd5QWR2ZXJ0aXNlclBvc3RSZWdpc3RlclRlc3QoKSA6IG5leHRfY2xpZW50X2lkXygwKSB7fQotICB+TG93RW5lcmd5QWR2ZXJ0aXNlclBvc3RSZWdpc3RlclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBMb3dFbmVyZ3lBZHZlcnRpc2VyVGVzdDo6U2V0VXAoKTsKLSAgICBhdXRvIGNhbGxiYWNrID0gWyZdKHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lBZHZlcnRpc2VyPiBhZHZlcnRpc2VyKSB7Ci0gICAgICBsZV9hZHZlcnRpc2VyXyA9IHN0ZDo6bW92ZShhZHZlcnRpc2VyKTsKLSAgICB9OwotICAgIFJlZ2lzdGVyVGVzdEFkdmVydGlzZXIoY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgRW5hYmxlKF8sIGZhbHNlLCBfLCBfLCBfLCBfKSkuVGltZXMoMSk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFVucmVnaXN0ZXIoXykpLlRpbWVzKDEpOwotICAgIGxlX2FkdmVydGlzZXJfLnJlc2V0KCk7Ci0gICAgTG93RW5lcmd5QWR2ZXJ0aXNlclRlc3Q6OlRlYXJEb3duKCk7Ci0gIH0KLQotICB2b2lkIFJlZ2lzdGVyVGVzdEFkdmVydGlzZXIoCi0gICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUFkdmVydGlzZXI+IGFkdmVydGlzZXIpPgotICAgICAgICAgIGNhbGxiYWNrKSB7Ci0gICAgVXVpZCB1dWlkID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gICAgYXV0byBhcGlfY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIHN0YXR1cywgY29uc3QgVXVpZCYgaW5fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Qmx1ZXRvb3RoSW5zdGFuY2U+IGluX2NsaWVudCkgewotICAgICAgQ0hFQ0soaW5fdXVpZCA9PSB1dWlkKTsKLSAgICAgIENIRUNLKGluX2NsaWVudC5nZXQoKSk7Ci0gICAgICBDSEVDSyhzdGF0dXMgPT0gQkxFX1NUQVRVU19TVUNDRVNTKTsKLQotICAgICAgY2FsbGJhY2soc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUFkdmVydGlzZXI+KAotICAgICAgICAgIHN0YXRpY19jYXN0PExvd0VuZXJneUFkdmVydGlzZXIqPihpbl9jbGllbnQucmVsZWFzZSgpKSkpOwotICAgIH07Ci0KLSAgICByZWdfY2IgcmVnX2Fkdl9jYjsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgUmVnaXN0ZXJBZHZlcnRpc2VyKF8pKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnJlZ19hZHZfY2IpKTsKLQotICAgIGJsZV9hZHZlcnRpc2VyX2ZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQsIGFwaV9jYWxsYmFjayk7Ci0KLSAgICByZWdfYWR2X2NiLlJ1bihuZXh0X2NsaWVudF9pZF8rKywgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0gIH0KLQotICB2b2lkIFN0YXJ0QWR2ZXJ0aXNpbmcoKSB7Ci0gICAgQVNTRVJUX0ZBTFNFKGxlX2FkdmVydGlzZXJfLT5Jc0FkdmVydGlzaW5nU3RhcnRlZCgpKTsKLSAgICBBU1NFUlRfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RhcnRpbmdBZHZlcnRpc2luZygpKTsKLSAgICBBU1NFUlRfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLQotICAgIHN0YXR1c19jYiBzdGFydF9hZHZlcnRpc2luZ19jYjsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU3RhcnRBZHZlcnRpc2luZyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgICAgLlRpbWVzKDEpCi0gICAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZzdGFydF9hZHZlcnRpc2luZ19jYikpOwotICAgIHN0YXR1c19jYiBzZXRfZGF0YV9jYjsKLQotICAgIEFkdmVydGlzZVNldHRpbmdzIHNldHRpbmdzOwotICAgIEFkdmVydGlzZURhdGEgYWR2LCBzY2FuX3JzcDsKLSAgICBBU1NFUlRfVFJVRShsZV9hZHZlcnRpc2VyXy0+U3RhcnRBZHZlcnRpc2luZygKLSAgICAgICAgc2V0dGluZ3MsIGFkdiwgc2Nhbl9yc3AsIExvd0VuZXJneUFkdmVydGlzZXI6OlN0YXR1c0NhbGxiYWNrKCkpKTsKLSAgICBBU1NFUlRfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotCi0gICAgc3RhcnRfYWR2ZXJ0aXNpbmdfY2IuUnVuKEJUX1NUQVRVU19TVUNDRVNTKTsKLQotICAgIEFTU0VSVF9UUlVFKGxlX2FkdmVydGlzZXJfLT5Jc0FkdmVydGlzaW5nU3RhcnRlZCgpKTsKLSAgICBBU1NFUlRfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RhcnRpbmdBZHZlcnRpc2luZygpKTsKLSAgICBBU1NFUlRfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLSAgfQotCi0gIHZvaWQgQWR2ZXJ0aXNlRGF0YVRlc3RIZWxwZXIoQWR2ZXJ0aXNlRGF0YSBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChCTEVTdGF0dXMpPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IqIHNldF9kYXRhX2NiKSB7Ci0gICAgQWR2ZXJ0aXNlU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLSAgICBMT0dfQVNTRVJUKHNldF9kYXRhX2NiKSA8PCAic2V0X2RhdGFfY2IgbXVzdCBiZSBzZXQiOwotCi0gICAgRVhQRUNUX1RSVUUobGVfYWR2ZXJ0aXNlcl8tPlN0YXJ0QWR2ZXJ0aXNpbmcoc2V0dGluZ3MsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlRGF0YSgpLCBjYWxsYmFjaykpOwotCi0gICAgc2V0X2RhdGFfY2ItPlJ1bihCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0KLSAgICBzdGF0dXNfY2IgZGlzYWJsZV9jYjsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgRW5hYmxlKF8sIGZhbHNlLCBfLCBfLCBfLCBfKSkKLSAgICAgICAgLlRpbWVzKDEpCi0gICAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZkaXNhYmxlX2NiKSk7Ci0KLSAgICBFWFBFQ1RfVFJVRSgKLSAgICAgICAgbGVfYWR2ZXJ0aXNlcl8tPlN0b3BBZHZlcnRpc2luZyhMb3dFbmVyZ3lBZHZlcnRpc2VyOjpTdGF0dXNDYWxsYmFjaygpKSk7Ci0gICAgZGlzYWJsZV9jYi5SdW4oQlRfU1RBVFVTX1NVQ0NFU1MpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lBZHZlcnRpc2VyPiBsZV9hZHZlcnRpc2VyXzsKLQotIHByaXZhdGU6Ci0gIGludCBuZXh0X2NsaWVudF9pZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvd0VuZXJneUFkdmVydGlzZXJQb3N0UmVnaXN0ZXJUZXN0KTsKLX07Ci0KLVRFU1RfRihMb3dFbmVyZ3lBZHZlcnRpc2VyVGVzdCwgUmVnaXN0ZXJJbnN0YW5jZSkgewotICAvLyBUaGVzZSB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IHBvcHVsYXRlZCB3aXRoIGEgcmVzdWx0IHdoZW4gdGhlIGNhbGxiYWNrCi0gIC8vIGV4ZWN1dGVzLgotICBCTEVTdGF0dXMgc3RhdHVzID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICBVdWlkIGNiX3V1aWQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lBZHZlcnRpc2VyPiBhZHZlcnRpc2VyOwotICBpbnQgY2FsbGJhY2tfY291bnQgPSAwOwotCi0gIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIGluX3N0YXR1cywgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Qmx1ZXRvb3RoSW5zdGFuY2U+IGluX2NsaWVudCkgewotICAgIHN0YXR1cyA9IGluX3N0YXR1czsKLSAgICBjYl91dWlkID0gdXVpZDsKLSAgICBhZHZlcnRpc2VyID0gc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUFkdmVydGlzZXI+KAotICAgICAgICBzdGF0aWNfY2FzdDxMb3dFbmVyZ3lBZHZlcnRpc2VyKj4oaW5fY2xpZW50LnJlbGVhc2UoKSkpOwotICAgIGNhbGxiYWNrX2NvdW50Kys7Ci0gIH07Ci0KLSAgVXVpZCB1dWlkMCA9IFV1aWQ6OkdldFJhbmRvbSgpOwotCi0gIHJlZ19jYiByZWdfYWR2MV9jYjsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFJlZ2lzdGVyQWR2ZXJ0aXNlcihfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnJlZ19hZHYxX2NiKSk7Ci0KLSAgLy8gU3VjY2Vzcy4KLSAgRVhQRUNUX1RSVUUoYmxlX2FkdmVydGlzZXJfZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDAsIGNhbGxiYWNrKSk7Ci0gIEVYUEVDVF9FUSgwLCBjYWxsYmFja19jb3VudCk7Ci0KLSAgLy8gQ2FsbGluZyB0d2ljZSB3aXRoIHRoZSBzYW1lIFV1aWQgc2hvdWxkIGZhaWwgd2l0aCBubyBhZGRpdGlvbmFsIGNhbGwgaW50bwotICAvLyB0aGUgc3RhY2suCi0gIEVYUEVDVF9GQUxTRShibGVfYWR2ZXJ0aXNlcl9mYWN0b3J5Xy0+UmVnaXN0ZXJJbnN0YW5jZSh1dWlkMCwgY2FsbGJhY2spKTsKLQotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotCi0gIC8vIENhbGwgd2l0aCBhIGRpZmZlcmVudCBVdWlkIHdoaWxlIG9uZSBpcyBwZW5kaW5nLgotICBVdWlkIHV1aWQxID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gIHJlZ19jYiByZWdfYWR2Ml9jYjsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFJlZ2lzdGVyQWR2ZXJ0aXNlcihfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJnJlZ19hZHYyX2NiKSk7Ci0gIEVYUEVDVF9UUlVFKGJsZV9hZHZlcnRpc2VyX2ZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQxLCBjYWxsYmFjaykpOwotCi0gIC8vIHx1dWlkMHwgc3VjY2VlZHMuCi0gIGludCBjbGllbnRfaWYwID0gMjsgIC8vIFBpY2sgc29tZXRoaW5nIHRoYXQncyBub3QgMC4KLSAgcmVnX2FkdjFfY2IuUnVuKGNsaWVudF9pZjAsIEJUX1NUQVRVU19TVUNDRVNTKTsKLQotICBFWFBFQ1RfRVEoMSwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShhZHZlcnRpc2VyLmdldCgpICE9Ci0gICAgICAgICAgICAgIG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX1NVQ0NFU1MsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUShjbGllbnRfaWYwLCBhZHZlcnRpc2VyLT5HZXRJbnN0YW5jZUlkKCkpOwotICBFWFBFQ1RfRVEodXVpZDAsIGFkdmVydGlzZXItPkdldEFwcElkZW50aWZpZXIoKSk7Ci0gIEVYUEVDVF9FUSh1dWlkMCwgY2JfdXVpZCk7Ci0KLSAgLy8gVGhlIGFkdmVydGlzZXIgc2hvdWxkIHVucmVnaXN0ZXIgaXRzZWxmIHdoZW4gZGVsZXRlZC4KLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIEVuYWJsZShjbGllbnRfaWYwLCBmYWxzZSwgXywgXywgXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgVW5yZWdpc3RlcihjbGllbnRfaWYwKSkuVGltZXMoMSk7Ci0gIGFkdmVydGlzZXIucmVzZXQoKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICAvLyB8dXVpZDF8IGZhaWxzLgotICB1aW50OF90IGNsaWVudF9pZjEgPSAxMDsKLSAgcmVnX2FkdjJfY2IuUnVuKGNsaWVudF9pZjEsIEJUX1NUQVRVU19GQUlMKTsKLQotICBFWFBFQ1RfRVEoMiwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShhZHZlcnRpc2VyLmdldCgpID09Ci0gICAgICAgICAgICAgIG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX0ZBSUxVUkUsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUSh1dWlkMSwgY2JfdXVpZCk7Ci19Ci0KLVRFU1RfRihMb3dFbmVyZ3lBZHZlcnRpc2VyUG9zdFJlZ2lzdGVyVGVzdCwgU3RhcnRBZHZlcnRpc2luZ0Jhc2ljKSB7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLQotICAvLyBVc2UgZGVmYXVsdCBhZHZlcnRpc2luZyBzZXR0aW5ncyBhbmQgZGF0YS4KLSAgQWR2ZXJ0aXNlU2V0dGluZ3Mgc2V0dGluZ3M7Ci0gIEFkdmVydGlzZURhdGEgYWR2X2RhdGEsIHNjYW5fcnNwOwotICBpbnQgY2FsbGJhY2tfY291bnQgPSAwOwotICBCTEVTdGF0dXMgbGFzdF9zdGF0dXMgPSBCTEVfU1RBVFVTX0ZBSUxVUkU7Ci0gIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIHN0YXR1cykgewotICAgIGxhc3Rfc3RhdHVzID0gc3RhdHVzOwotICAgIGNhbGxiYWNrX2NvdW50Kys7Ci0gIH07Ci0KLSAgc3RhdHVzX2NiIHN0YXJ0X2FkdmVydGlzaW5nX2NiOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU3RhcnRBZHZlcnRpc2luZyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8MT4oJnN0YXJ0X2FkdmVydGlzaW5nX2NiKSk7Ci0KLSAgLy8gU3RhY2sgY2FsbCByZXR1cm5zIHN1Y2Nlc3MuCi0gIEVYUEVDVF9UUlVFKAotICAgICAgbGVfYWR2ZXJ0aXNlcl8tPlN0YXJ0QWR2ZXJ0aXNpbmcoc2V0dGluZ3MsIGFkdl9kYXRhLCBzY2FuX3JzcCwgY2FsbGJhY2spKTsKLQotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzQWR2ZXJ0aXNpbmdTdGFydGVkKCkpOwotICBFWFBFQ1RfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX0VRKDAsIGNhbGxiYWNrX2NvdW50KTsKLQotICAvLyBBbHJlYWR5IHN0YXJ0aW5nLgotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBsZV9hZHZlcnRpc2VyXy0+U3RhcnRBZHZlcnRpc2luZyhzZXR0aW5ncywgYWR2X2RhdGEsIHNjYW5fcnNwLCBjYWxsYmFjaykpOwotCi0gIC8vIE5vdGlmeSBmYWlsdXJlLgotICBzdGFydF9hZHZlcnRpc2luZ19jYi5SdW4oQlRfU1RBVFVTX0ZBSUwpOwotCi0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX0VRKDEsIGNhbGxiYWNrX2NvdW50KTsKLSAgRVhQRUNUX0VRKEJMRV9TVEFUVVNfRkFJTFVSRSwgbGFzdF9zdGF0dXMpOwotCi0gIC8vIFRyeSBhZ2Fpbi4KLSAgRVhQRUNUX1RSVUUoCi0gICAgICBsZV9hZHZlcnRpc2VyXy0+U3RhcnRBZHZlcnRpc2luZyhzZXR0aW5ncywgYWR2X2RhdGEsIHNjYW5fcnNwLCBjYWxsYmFjaykpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzQWR2ZXJ0aXNpbmdTdGFydGVkKCkpOwotICBFWFBFQ1RfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX0VRKDEsIGNhbGxiYWNrX2NvdW50KTsKLQotICBzdGFydF9hZHZlcnRpc2luZ19jYi5SdW4oQlRfU1RBVFVTX1NVQ0NFU1MpOwotCi0gIEVYUEVDVF9UUlVFKGxlX2FkdmVydGlzZXJfLT5Jc0FkdmVydGlzaW5nU3RhcnRlZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGxlX2FkdmVydGlzZXJfLT5Jc1N0YXJ0aW5nQWR2ZXJ0aXNpbmcoKSk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNTdG9wcGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRVEoMiwgY2FsbGJhY2tfY291bnQpOwotICBFWFBFQ1RfRVEoQkxFX1NUQVRVU19TVUNDRVNTLCBsYXN0X3N0YXR1cyk7Ci0KLSAgLy8gQWxyZWFkeSBzdGFydGVkLgotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBsZV9hZHZlcnRpc2VyXy0+U3RhcnRBZHZlcnRpc2luZyhzZXR0aW5ncywgYWR2X2RhdGEsIHNjYW5fcnNwLCBjYWxsYmFjaykpOwotfQotCi1URVNUX0YoTG93RW5lcmd5QWR2ZXJ0aXNlclBvc3RSZWdpc3RlclRlc3QsIFN0b3BBZHZlcnRpc2luZ0Jhc2ljKSB7Ci0gIEFkdmVydGlzZVNldHRpbmdzIHNldHRpbmdzOwotCi0gIC8vIE5vdCBlbmFibGVkLgotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzQWR2ZXJ0aXNpbmdTdGFydGVkKCkpOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBsZV9hZHZlcnRpc2VyXy0+U3RvcEFkdmVydGlzaW5nKExvd0VuZXJneUFkdmVydGlzZXI6OlN0YXR1c0NhbGxiYWNrKCkpKTsKLQotICAvLyBTdGFydCBhZHZlcnRpc2luZyBmb3IgdGVzdGluZy4KLSAgU3RhcnRBZHZlcnRpc2luZygpOwotCi0gIGludCBjYWxsYmFja19jb3VudCA9IDA7Ci0gIEJMRVN0YXR1cyBsYXN0X3N0YXR1cyA9IEJMRV9TVEFUVVNfRkFJTFVSRTsKLSAgYXV0byBjYWxsYmFjayA9IFsmXShCTEVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgbGFzdF9zdGF0dXMgPSBzdGF0dXM7Ci0gICAgY2FsbGJhY2tfY291bnQrKzsKLSAgfTsKLQotICBzdGF0dXNfY2IgZW5hYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgRW5hYmxlKF8sIGZhbHNlLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8Mj4oJmVuYWJsZV9jYikpOwotCi0gIC8vIFN0YWNrIHJldHVybnMgc3VjY2Vzcy4KLSAgRVhQRUNUX1RSVUUobGVfYWR2ZXJ0aXNlcl8tPlN0b3BBZHZlcnRpc2luZyhjYWxsYmFjaykpOwotICBFWFBFQ1RfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNTdG9wcGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIEFscmVhZHkgZGlzYWJsaW5nLgotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPlN0b3BBZHZlcnRpc2luZyhjYWxsYmFjaykpOwotICBFWFBFQ1RfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfVFJVRShsZV9hZHZlcnRpc2VyXy0+SXNTdG9wcGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIE5vdGlmeSBmYWlsdXJlLgotICBlbmFibGVfY2IuUnVuKEJUX1NUQVRVU19GQUlMKTsKLSAgRVhQRUNUX1RSVUUobGVfYWR2ZXJ0aXNlcl8tPklzQWR2ZXJ0aXNpbmdTdGFydGVkKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RhcnRpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX0ZBTFNFKGxlX2FkdmVydGlzZXJfLT5Jc1N0b3BwaW5nQWR2ZXJ0aXNpbmcoKSk7Ci0gIEVYUEVDVF9FUSgxLCBjYWxsYmFja19jb3VudCk7Ci0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX0ZBSUxVUkUsIGxhc3Rfc3RhdHVzKTsKLQotICAvLyBUcnkgYWdhaW4uCi0gIEVYUEVDVF9UUlVFKGxlX2FkdmVydGlzZXJfLT5TdG9wQWR2ZXJ0aXNpbmcoY2FsbGJhY2spKTsKLSAgRVhQRUNUX1RSVUUobGVfYWR2ZXJ0aXNlcl8tPklzQWR2ZXJ0aXNpbmdTdGFydGVkKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RhcnRpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX1RSVUUobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX0VRKDEsIGNhbGxiYWNrX2NvdW50KTsKLQotICAvLyBOb3RpZnkgc3VjY2Vzcy4KLSAgZW5hYmxlX2NiLlJ1bihCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNBZHZlcnRpc2luZ1N0YXJ0ZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShsZV9hZHZlcnRpc2VyXy0+SXNTdGFydGluZ0FkdmVydGlzaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPklzU3RvcHBpbmdBZHZlcnRpc2luZygpKTsKLSAgRVhQRUNUX0VRKDIsIGNhbGxiYWNrX2NvdW50KTsKLSAgRVhQRUNUX0VRKEJMRV9TVEFUVVNfU1VDQ0VTUywgbGFzdF9zdGF0dXMpOwotCi0gIC8vIEFscmVhZHkgc3RvcHBlZC4KLSAgRVhQRUNUX0ZBTFNFKGxlX2FkdmVydGlzZXJfLT5TdG9wQWR2ZXJ0aXNpbmcoY2FsbGJhY2spKTsKLX0KLQotVEVTVF9GKExvd0VuZXJneUFkdmVydGlzZXJQb3N0UmVnaXN0ZXJUZXN0LCBJbnZhbGlkQWR2ZXJ0aXNlRGF0YSkgewotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMHsweDAyLCBIQ0lfRUlSX0ZMQUdTX1RZUEUsIDB4MDB9OwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMXsweDA0LCBIQ0lfRUlSX01BTlVGQUNUVVJFUl9TUEVDSUZJQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAyLCAweDAwfTsKLSAgQWR2ZXJ0aXNlRGF0YSBpbnZhbGlkX2FkdihkYXRhMCk7Ci0gIEFkdmVydGlzZURhdGEgdmFsaWRfYWR2KGRhdGExKTsKLQotICBBZHZlcnRpc2VTZXR0aW5ncyBzZXR0aW5nczsKLQotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPlN0YXJ0QWR2ZXJ0aXNpbmcoCi0gICAgICBzZXR0aW5ncywgdmFsaWRfYWR2LCBpbnZhbGlkX2FkdiwgTG93RW5lcmd5QWR2ZXJ0aXNlcjo6U3RhdHVzQ2FsbGJhY2soKSkpOwotICBFWFBFQ1RfRkFMU0UobGVfYWR2ZXJ0aXNlcl8tPlN0YXJ0QWR2ZXJ0aXNpbmcoCi0gICAgICBzZXR0aW5ncywgaW52YWxpZF9hZHYsIHZhbGlkX2FkdiwgTG93RW5lcmd5QWR2ZXJ0aXNlcjo6U3RhdHVzQ2FsbGJhY2soKSkpOwotCi0gIC8vIE1hbnVmYWN0dXJlciBkYXRhIG5vdCBjb3JyZWN0bHkgZm9ybWF0dGVkIGFjY29yZGluZyB0byBzcGVjLiBXZSBsZXQgdGhlCi0gIC8vIHN0YWNrIGhhbmRsZSB0aGlzIGNhc2UuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEyezB4MDEsIEhDSV9FSVJfTUFOVUZBQ1RVUkVSX1NQRUNJRklDX1RZUEV9OwotICBBZHZlcnRpc2VEYXRhIGludmFsaWRfbWZjKGRhdGEyKTsKLQotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU3RhcnRBZHZlcnRpc2luZyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9UUlVFKGxlX2FkdmVydGlzZXJfLT5TdGFydEFkdmVydGlzaW5nKAotICAgICAgc2V0dGluZ3MsIGludmFsaWRfbWZjLCB2YWxpZF9hZHYsIExvd0VuZXJneUFkdmVydGlzZXI6OlN0YXR1c0NhbGxiYWNrKCkpKTsKLX0KLQotVEVTVF9GKExvd0VuZXJneUFkdmVydGlzZXJQb3N0UmVnaXN0ZXJUZXN0LCBBZHZlcnRpc2VEYXRhUGFyc2luZykgewotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVXVpZDE2Qml0RGF0YXsKLSAgICAgIDB4MDMsIEhDSV9FSVJfQ09NUExFVEVfMTZCSVRTX1VVSURfVFlQRSwgMHhERSwgMHhBRCwKLSAgfTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVXVpZDMyQml0RGF0YXsKLSAgICAgIDB4MDUsIEhDSV9FSVJfQ09NUExFVEVfMzJCSVRTX1VVSURfVFlQRSwgMHhERSwgMHhBRCwgMHgwMSwgMHgwMn07Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4ga1VVSUQxMjhCaXREYXRhewotICAgICAgMHgxMSwgSENJX0VJUl9DT01QTEVURV8xMjhCSVRTX1VVSURfVFlQRSwKLSAgICAgIDB4REUsIDB4QUQsCi0gICAgICAweDAxLCAweDAyLAotICAgICAgMHgwMywgMHgwNCwKLSAgICAgIDB4MDUsIDB4MDYsCi0gICAgICAweDA3LCAweDA4LAotICAgICAgMHgwOSwgMHgwQSwKLSAgICAgIDB4MEIsIDB4MEMsCi0gICAgICAweDBELCAweDBFfTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrTXVsdGlVdWlkRGF0YXsKLSAgICAgIDB4MTEsIEhDSV9FSVJfQ09NUExFVEVfMTI4QklUU19VVUlEX1RZUEUsCi0gICAgICAweERFLCAweEFELAotICAgICAgMHgwMSwgMHgwMiwKLSAgICAgIDB4MDMsIDB4MDQsCi0gICAgICAweDA1LCAweDA2LAotICAgICAgMHgwNywgMHgwOCwKLSAgICAgIDB4MDksIDB4MEEsCi0gICAgICAweDBCLCAweDBDLAotICAgICAgMHgwRCwgMHgwRSwKLSAgICAgIDB4MDUsIEhDSV9FSVJfQ09NUExFVEVfMzJCSVRTX1VVSURfVFlQRSwKLSAgICAgIDB4REUsIDB4QUQsCi0gICAgICAweEJFLCAweEVGfTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrU2VydmljZURhdGExNkJpdHsKLSAgICAgIDB4MDUsIEhDSV9FSVJfU0VSVklDRV9EQVRBXzE2QklUU19VVUlEX1RZUEUsIDB4REUsIDB4QUQsIDB4QkUsIDB4RUZ9OwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtTZXJ2aWNlRGF0YTMyQml0ewotICAgICAgMHgwNywgSENJX0VJUl9TRVJWSUNFX0RBVEFfMzJCSVRTX1VVSURfVFlQRSwgMHhERSwgMHhBRCwgMHgwMSwgMHgwMiwgMHhCRSwKLSAgICAgIDB4RUZ9OwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtTZXJ2aWNlRGF0YTEyOEJpdHsKLSAgICAgIDB4MTMsIEhDSV9FSVJfU0VSVklDRV9EQVRBXzEyOEJJVFNfVVVJRF9UWVBFLAotICAgICAgMHhERSwgMHhBRCwKLSAgICAgIDB4MDEsIDB4MDIsCi0gICAgICAweDAzLCAweDA0LAotICAgICAgMHgwNSwgMHgwNiwKLSAgICAgIDB4MDcsIDB4MDgsCi0gICAgICAweDA5LCAweDBBLAotICAgICAgMHgwQiwgMHgwQywKLSAgICAgIDB4MEQsIDB4MEUsCi0gICAgICAweEJFLCAweEVGfTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrTXVsdGlTZXJ2aWNlRGF0YXsKLSAgICAgIDB4MTMsIEhDSV9FSVJfU0VSVklDRV9EQVRBXzEyOEJJVFNfVVVJRF9UWVBFLAotICAgICAgMHhERSwgMHhBRCwKLSAgICAgIDB4MDEsIDB4MDIsCi0gICAgICAweDAzLCAweDA0LAotICAgICAgMHgwNSwgMHgwNiwKLSAgICAgIDB4QkUsIDB4RUYsCi0gICAgICAweERFLCAweEFELAotICAgICAgMHgwMSwgMHgwMiwKLSAgICAgIDB4MDMsIDB4MDQsCi0gICAgICAweDA1LCAweDA2LAotICAgICAgMHgwNSwgSENJX0VJUl9TRVJWSUNFX0RBVEFfMTZCSVRTX1VVSURfVFlQRSwKLSAgICAgIDB4REUsIDB4QUQsCi0gICAgICAweEJFLCAweEVGfTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrU2VydmljZVV1aWRNYXRjaHsKLSAgICAgIDB4MDUsIEhDSV9FSVJfQ09NUExFVEVfMzJCSVRTX1VVSURfVFlQRSwKLSAgICAgIDB4REUsIDB4QUQsCi0gICAgICAweDAxLCAweDAyLAotICAgICAgMHgwNywgSENJX0VJUl9TRVJWSUNFX0RBVEFfMzJCSVRTX1VVSURfVFlQRSwKLSAgICAgIDB4REUsIDB4QUQsCi0gICAgICAweDAxLCAweDAyLAotICAgICAgMHhCRSwgMHhFRn07Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4ga1NlcnZpY2VVdWlkTWlzbWF0Y2h7Ci0gICAgICAweDA1LCBIQ0lfRUlSX0NPTVBMRVRFXzMyQklUU19VVUlEX1RZUEUsCi0gICAgICAweERFLCAweEFELAotICAgICAgMHgwMSwgMHgwMSwKLSAgICAgIDB4MDcsIEhDSV9FSVJfU0VSVklDRV9EQVRBXzMyQklUU19VVUlEX1RZUEUsCi0gICAgICAweERFLCAweEFELAotICAgICAgMHgwMSwgMHgwMiwKLSAgICAgIDB4QkUsIDB4RUZ9OwotCi0gIEFkdmVydGlzZURhdGEgdXVpZF8xNmJpdF9hZHYoa1V1aWQxNkJpdERhdGEpOwotICBBZHZlcnRpc2VEYXRhIHV1aWRfMzJiaXRfYWR2KGtVdWlkMzJCaXREYXRhKTsKLSAgQWR2ZXJ0aXNlRGF0YSB1dWlkXzEyOGJpdF9hZHYoa1VVSUQxMjhCaXREYXRhKTsKLSAgQWR2ZXJ0aXNlRGF0YSBtdWx0aV91dWlkX2FkdihrTXVsdGlVdWlkRGF0YSk7Ci0KLSAgQWR2ZXJ0aXNlRGF0YSBzZXJ2aWNlXzE2Yml0X2FkdihrU2VydmljZURhdGExNkJpdCk7Ci0gIEFkdmVydGlzZURhdGEgc2VydmljZV8zMmJpdF9hZHYoa1NlcnZpY2VEYXRhMzJCaXQpOwotICBBZHZlcnRpc2VEYXRhIHNlcnZpY2VfMTI4Yml0X2FkdihrU2VydmljZURhdGExMjhCaXQpOwotICBBZHZlcnRpc2VEYXRhIG11bHRpX3NlcnZpY2VfYWR2KGtNdWx0aVNlcnZpY2VEYXRhKTsKLQotICBBZHZlcnRpc2VEYXRhIHNlcnZpY2VfdXVpZF9tYXRjaChrU2VydmljZVV1aWRNYXRjaCk7Ci0gIEFkdmVydGlzZURhdGEgc2VydmljZV91dWlkX21pc21hdGNoKGtTZXJ2aWNlVXVpZE1pc21hdGNoKTsKLQotICBBZHZlcnRpc2VTZXR0aW5ncyBzZXR0aW5nczsKLQotICBpbnQgY2FsbGJhY2tfY291bnQgPSAwOwotICBCTEVTdGF0dXMgbGFzdF9zdGF0dXMgPSBCTEVfU1RBVFVTX0ZBSUxVUkU7Ci0gIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIHN0YXR1cykgewotICAgIGxhc3Rfc3RhdHVzID0gc3RhdHVzOwotICAgIGNhbGxiYWNrX2NvdW50Kys7Ci0gIH07Ci0KLSAgc3RhdHVzX2NiIHN0YXJ0X2FkdmVydGlzaW5nX2NiOwotICAvLyBNdWx0aXBsZSBVdWlkIHRlc3QKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFN0YXJ0QWR2ZXJ0aXNpbmcoXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZzdGFydF9hZHZlcnRpc2luZ19jYikpOwotICBBZHZlcnRpc2VEYXRhVGVzdEhlbHBlcihtdWx0aV91dWlkX2FkdiwgY2FsbGJhY2ssICZzdGFydF9hZHZlcnRpc2luZ19jYik7Ci0gIEVYUEVDVF9FUSgxLCBjYWxsYmFja19jb3VudCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gTXVsdGlwbGUgU2VydmljZSBEYXRhIHRlc3QKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFN0YXJ0QWR2ZXJ0aXNpbmcoXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZzdGFydF9hZHZlcnRpc2luZ19jYikpOwotICBBZHZlcnRpc2VEYXRhVGVzdEhlbHBlcihtdWx0aV9zZXJ2aWNlX2FkdiwgY2FsbGJhY2ssICZzdGFydF9hZHZlcnRpc2luZ19jYik7Ci0gIEVYUEVDVF9FUSgyLCBjYWxsYmFja19jb3VudCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gMTZiaXQgdXVpZCB0ZXN0LCBzaG91bGQgc3VjY2VlZCB3aXRoIGNvcnJlY3RseSBwYXJzZWQgdXVpZCBpbiBsaXR0bGUtZW5kaWFuCi0gIC8vIDEyOC1iaXQgZm9ybWF0LgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1dWlkXzE2Yml0X2Nhbm9uaWNhbHsKLSAgICAgIDB4RkIsIDB4MzQsIDB4OWIsIDB4NUYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsCi0gICAgICAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweERFLCAweEFELCAweDAwLCAweDAwfTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFN0YXJ0QWR2ZXJ0aXNpbmcoXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZzdGFydF9hZHZlcnRpc2luZ19jYikpOwotICBBZHZlcnRpc2VEYXRhVGVzdEhlbHBlcih1dWlkXzE2Yml0X2FkdiwgY2FsbGJhY2ssICZzdGFydF9hZHZlcnRpc2luZ19jYik7Ci0gIEVYUEVDVF9FUSgzLCBjYWxsYmFja19jb3VudCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gMzJiaXQgdXVpZCB0ZXN0LCBzaG91bGQgc3VjY2VlZCB3aXRoIGNvcnJlY3RseSBwYXJzZWQgdXVpZAotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1dWlkXzMyYml0X2Nhbm9uaWNhbHsKLSAgICAgIDB4RkIsIDB4MzQsIDB4OWIsIDB4NUYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsCi0gICAgICAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweERFLCAweEFELCAweDAxLCAweDAyfTsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFN0YXJ0QWR2ZXJ0aXNpbmcoXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZzdGFydF9hZHZlcnRpc2luZ19jYikpOwotICBBZHZlcnRpc2VEYXRhVGVzdEhlbHBlcih1dWlkXzMyYml0X2FkdiwgY2FsbGJhY2ssICZzdGFydF9hZHZlcnRpc2luZ19jYik7Ci0gIEVYUEVDVF9FUSg0LCBjYWxsYmFja19jb3VudCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gMTI4Yml0IHV1aWQgdGVzdCwgc2hvdWxkIHN1Y2NlZWQgd2l0aCBjb3JyZWN0bHkgcGFyc2VkIHV1aWQKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gdXVpZF8xMjhiaXR7MHhERSwgMHhBRCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQiwgMHgwQywgMHgwRCwgMHgwRX07Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBTdGFydEFkdmVydGlzaW5nKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmc3RhcnRfYWR2ZXJ0aXNpbmdfY2IpKTsKLSAgQWR2ZXJ0aXNlRGF0YVRlc3RIZWxwZXIodXVpZF8xMjhiaXRfYWR2LCBjYWxsYmFjaywgJnN0YXJ0X2FkdmVydGlzaW5nX2NiKTsKLSAgRVhQRUNUX0VRKDUsIGNhbGxiYWNrX2NvdW50KTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXJ2aWNlX2RhdGF7MHhCRSwgMHhFRn07Ci0KLSAgLy8gU2VydmljZSBkYXRhIHdpdGggMTZiaXQgdXVpZCBpbmNsdWRlZCwgc2hvdWxkIHN1Y2NlZWQgd2l0aAotICAvLyB1dWlkIGFuZCBzZXJ2aWNlIGRhdGEgcGFyc2VkIG91dAotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU3RhcnRBZHZlcnRpc2luZyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnN0YXJ0X2FkdmVydGlzaW5nX2NiKSk7Ci0gIEFkdmVydGlzZURhdGFUZXN0SGVscGVyKHNlcnZpY2VfMTZiaXRfYWR2LCBjYWxsYmFjaywgJnN0YXJ0X2FkdmVydGlzaW5nX2NiKTsKLSAgRVhQRUNUX0VRKDYsIGNhbGxiYWNrX2NvdW50KTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICAvLyBTZXJ2aWNlIGRhdGEgd2l0aCAzMmJpdCB1dWlkIGluY2x1ZGVkLCBzaG91bGQgc3VjY2VlZCB3aXRoCi0gIC8vIHV1aWQgYW5kIHNlcnZpY2UgZGF0YSBwYXJzZWQgb3V0Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBTdGFydEFkdmVydGlzaW5nKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmc3RhcnRfYWR2ZXJ0aXNpbmdfY2IpKTsKLSAgQWR2ZXJ0aXNlRGF0YVRlc3RIZWxwZXIoc2VydmljZV8zMmJpdF9hZHYsIGNhbGxiYWNrLCAmc3RhcnRfYWR2ZXJ0aXNpbmdfY2IpOwotICBFWFBFQ1RfRVEoNywgY2FsbGJhY2tfY291bnQpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotCi0gIC8vIFNlcnZpY2UgZGF0YSB3aXRoIDEyOGJpdCB1dWlkIGluY2x1ZGVkLCBzaG91bGQgc3VjY2VlZCB3aXRoCi0gIC8vIHV1aWQgYW5kIHNlcnZpY2UgZGF0YSBwYXJzZWQgb3V0Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBTdGFydEFkdmVydGlzaW5nKF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmc3RhcnRfYWR2ZXJ0aXNpbmdfY2IpKTsKLSAgQWR2ZXJ0aXNlRGF0YVRlc3RIZWxwZXIoc2VydmljZV8xMjhiaXRfYWR2LCBjYWxsYmFjaywgJnN0YXJ0X2FkdmVydGlzaW5nX2NiKTsKLSAgRVhQRUNUX0VRKDgsIGNhbGxiYWNrX2NvdW50KTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICAvLyBTZXJ2aWNlIGRhdGEgYW5kIFV1aWQgd2hlcmUgdGhlIFV1aWQgZm9yIGJvdGggbWF0Y2gsIHNob3VsZCBzdWNjZWVkLgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU3RhcnRBZHZlcnRpc2luZyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnN0YXJ0X2FkdmVydGlzaW5nX2NiKSk7Ci0gIEFkdmVydGlzZURhdGFUZXN0SGVscGVyKHNlcnZpY2VfdXVpZF9tYXRjaCwgY2FsbGJhY2ssICZzdGFydF9hZHZlcnRpc2luZ19jYik7Ci0gIEVYUEVDVF9FUSg5LCBjYWxsYmFja19jb3VudCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gU2VydmljZSBkYXRhIGFuZCBVdWlkIHdoZXJlIHRoZSBVdWlkIGZvciBkb250IG1hdGNoLCBzaG91bGQgZmFpbAotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU3RhcnRBZHZlcnRpc2luZyhfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnN0YXJ0X2FkdmVydGlzaW5nX2NiKSk7Ci0gIEFkdmVydGlzZURhdGFUZXN0SGVscGVyKHNlcnZpY2VfdXVpZF9tYXRjaCwgY2FsbGJhY2ssICZzdGFydF9hZHZlcnRpc2luZ19jYik7Ci0gIEVYUEVDVF9FUSgxMCwgY2FsbGJhY2tfY291bnQpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotfQotCi1NQVRDSEVSX1AoQml0RXEsIHgsIHN0ZDo6c3RyaW5nKG5lZ2F0aW9uID8gImlzbid0IiA6ICJpcyIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYml0d2lzZSBlcXVhbCB0byAiICsgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHgpKSB7Ci0gIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHgpID09IHNpemVvZihhcmcpLCAiU2l6ZSBtaXNtYXRjaCIpOwotICByZXR1cm4gc3RkOjptZW1jbXAoJmFyZywgJngsIHNpemVvZih4KSkgPT0gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zZXJ2aWNlL3Rlc3QvbG93X2VuZXJneV9jbGllbnRfdW5pdHRlc3QuY2MgYi9zZXJ2aWNlL3Rlc3QvbG93X2VuZXJneV9jbGllbnRfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OWQ3NTguLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L2xvd19lbmVyZ3lfY2xpZW50X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic2VydmljZS9sb3dfZW5lcmd5X2NsaWVudC5oIgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0ZXN0L21vY2tfYWRhcHRlci5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpQb2ludGVlOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vY2tHYXR0SGFuZGxlcgotICAgIDogcHVibGljIGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlRlc3RDbGllbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tHYXR0SGFuZGxlcigpe307Ci0gIH5Nb2NrR2F0dEhhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QyKFJlZ2lzdGVyQ2xpZW50LAotICAgICAgICAgICAgICAgYnRfc3RhdHVzX3QoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiwgYm9vbCBlYXR0X3N1cHBvcnQpKTsKLSAgTU9DS19NRVRIT0QxKFVucmVnaXN0ZXJDbGllbnQsIGJ0X3N0YXR1c190KGludCkpOwotICBNT0NLX01FVEhPRDQoQ29ubmVjdCwgYnRfc3RhdHVzX3QoaW50LCBjb25zdCBSYXdBZGRyZXNzJiwgYm9vbCwgaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMyhEaXNjb25uZWN0LCBidF9zdGF0dXNfdChpbnQsIGNvbnN0IFJhd0FkZHJlc3MmLCBpbnQpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrR2F0dEhhbmRsZXIpOwotfTsKLQotY2xhc3MgVGVzdERlbGVnYXRlIDogcHVibGljIExvd0VuZXJneUNsaWVudDo6RGVsZWdhdGUgewotIHB1YmxpYzoKLSAgVGVzdERlbGVnYXRlKCkgOiBjb25uZWN0aW9uX3N0YXRlX2NvdW50XygwKSwgbGFzdF9tdHVfKDApIHt9Ci0KLSAgflRlc3REZWxlZ2F0ZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBpbnQgY29ubmVjdGlvbl9zdGF0ZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25fc3RhdGVfY291bnRfOyB9Ci0KLSAgdm9pZCBPbkNvbm5lY3Rpb25TdGF0ZShMb3dFbmVyZ3lDbGllbnQqIGNsaWVudCwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLCBib29sIGNvbm5lY3RlZCkgb3ZlcnJpZGUgewotICAgIEFTU0VSVF9UUlVFKGNsaWVudCk7Ci0gICAgY29ubmVjdGlvbl9zdGF0ZV9jb3VudF8rKzsKLSAgfQotCi0gIHZvaWQgT25NdHVDaGFuZ2VkKExvd0VuZXJneUNsaWVudCogY2xpZW50LCBpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBpbnQgbXR1KSBvdmVycmlkZSB7Ci0gICAgQVNTRVJUX1RSVUUoY2xpZW50KTsKLSAgICBsYXN0X210dV8gPSBtdHU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCBjb25uZWN0aW9uX3N0YXRlX2NvdW50XzsKLQotICBpbnQgbGFzdF9tdHVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUZXN0RGVsZWdhdGUpOwotfTsKLQotY2xhc3MgTG93RW5lcmd5Q2xpZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgTG93RW5lcmd5Q2xpZW50VGVzdCgpID0gZGVmYXVsdDsKLSAgfkxvd0VuZXJneUNsaWVudFRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAvLyBPbmx5IHNldCB8bW9ja19oYW5kbGVyX3wgaWYgYSB0ZXN0IGhhc24ndCBzZXQgaXQuCi0gICAgaWYgKCFtb2NrX2hhbmRsZXJfKSBtb2NrX2hhbmRsZXJfLnJlc2V0KG5ldyBNb2NrR2F0dEhhbmRsZXIoKSk7Ci0gICAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8gPSBuZXcgaGFsOjpGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZSgKLSAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PAotICAgICAgICAgICAgaGFsOjpGYWtlQmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6VGVzdENsaWVudEhhbmRsZXI+KG1vY2tfaGFuZGxlcl8pLAotICAgICAgICBudWxscHRyKTsKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkluaXRpYWxpemVGb3JUZXN0aW5nKGZha2VfaGFsX2dhdHRfaWZhY2VfKTsKLSAgICBibGVfZmFjdG9yeV8ucmVzZXQobmV3IExvd0VuZXJneUNsaWVudEZhY3RvcnkobW9ja19hZGFwdGVyXykpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBibGVfZmFjdG9yeV8ucmVzZXQoKTsKLSAgICBoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkNsZWFuVXAoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBoYWw6OkZha2VCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiBmYWtlX2hhbF9nYXR0X2lmYWNlXzsKLSAgdGVzdGluZzo6TW9ja0FkYXB0ZXIgbW9ja19hZGFwdGVyXzsKLSAgc3RkOjpzaGFyZWRfcHRyPE1vY2tHYXR0SGFuZGxlcj4gbW9ja19oYW5kbGVyXzsKLSAgc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUNsaWVudEZhY3Rvcnk+IGJsZV9mYWN0b3J5XzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lDbGllbnRUZXN0KTsKLX07Ci0KLS8vIFVzZWQgZm9yIHRlc3RzIHRoYXQgb3BlcmF0ZSBvbiBhIHByZS1yZWdpc3RlcmVkIGNsaWVudC4KLWNsYXNzIExvd0VuZXJneUNsaWVudFBvc3RSZWdpc3RlclRlc3QgOiBwdWJsaWMgTG93RW5lcmd5Q2xpZW50VGVzdCB7Ci0gcHVibGljOgotICBMb3dFbmVyZ3lDbGllbnRQb3N0UmVnaXN0ZXJUZXN0KCkgOiBuZXh0X2NsaWVudF9pZF8oMCkge30KLSAgfkxvd0VuZXJneUNsaWVudFBvc3RSZWdpc3RlclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBMb3dFbmVyZ3lDbGllbnRUZXN0OjpTZXRVcCgpOwotICAgIGF1dG8gY2FsbGJhY2sgPSBbJl0oc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUNsaWVudD4gY2xpZW50KSB7Ci0gICAgICBsZV9jbGllbnRfID0gc3RkOjptb3ZlKGNsaWVudCk7Ci0gICAgfTsKLSAgICBSZWdpc3RlclRlc3RDbGllbnQoY2FsbGJhY2spOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgVW5yZWdpc3RlckNsaWVudChfKSkKLSAgICAgICAgLlRpbWVzKDEpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLSAgICBsZV9jbGllbnRfLnJlc2V0KCk7Ci0gICAgTG93RW5lcmd5Q2xpZW50VGVzdDo6VGVhckRvd24oKTsKLSAgfQotCi0gIHZvaWQgUmVnaXN0ZXJUZXN0Q2xpZW50KAotICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lDbGllbnQ+IGNsaWVudCk+Ci0gICAgICAgICAgY2FsbGJhY2spIHsKLSAgICBVdWlkIHV1aWQgPSBVdWlkOjpHZXRSYW5kb20oKTsKLSAgICBhdXRvIGFwaV9jYWxsYmFjayA9IFsmXShCTEVTdGF0dXMgc3RhdHVzLCBjb25zdCBVdWlkJiBpbl91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbHVldG9vdGhJbnN0YW5jZT4gaW5fY2xpZW50KSB7Ci0gICAgICBDSEVDSyhpbl91dWlkID09IHV1aWQpOwotICAgICAgQ0hFQ0soaW5fY2xpZW50LmdldCgpKTsKLSAgICAgIENIRUNLKHN0YXR1cyA9PSBCTEVfU1RBVFVTX1NVQ0NFU1MpOwotCi0gICAgICBjYWxsYmFjayhzdGQ6OnVuaXF1ZV9wdHI8TG93RW5lcmd5Q2xpZW50PigKLSAgICAgICAgICBzdGF0aWNfY2FzdDxMb3dFbmVyZ3lDbGllbnQqPihpbl9jbGllbnQucmVsZWFzZSgpKSkpOwotICAgIH07Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgUmVnaXN0ZXJDbGllbnQoXywgXykpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19TVUNDRVNTKSk7Ci0KLSAgICBibGVfZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZCwgYXBpX2NhbGxiYWNrKTsKLQotICAgIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZWdpc3RlckNsaWVudENhbGxiYWNrKDAsIG5leHRfY2xpZW50X2lkXysrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUNsaWVudD4gbGVfY2xpZW50XzsKLQotIHByaXZhdGU6Ci0gIGludCBuZXh0X2NsaWVudF9pZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvd0VuZXJneUNsaWVudFBvc3RSZWdpc3RlclRlc3QpOwotfTsKLQotVEVTVF9GKExvd0VuZXJneUNsaWVudFRlc3QsIFJlZ2lzdGVySW5zdGFuY2UpIHsKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFJlZ2lzdGVyQ2xpZW50KF8sIF8pKQotICAgICAgLlRpbWVzKDIpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKEJUX1NUQVRVU19GQUlMKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKTsKLQotICAvLyBUaGVzZSB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IHBvcHVsYXRlZCB3aXRoIGEgcmVzdWx0IHdoZW4gdGhlIGNhbGxiYWNrCi0gIC8vIGV4ZWN1dGVzLgotICBCTEVTdGF0dXMgc3RhdHVzID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICBVdWlkIGNiX3V1aWQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lDbGllbnQ+IGNsaWVudDsKLSAgaW50IGNhbGxiYWNrX2NvdW50ID0gMDsKLQotICBhdXRvIGNhbGxiYWNrID0gWyZdKEJMRVN0YXR1cyBpbl9zdGF0dXMsIGNvbnN0IFV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsdWV0b290aEluc3RhbmNlPiBpbl9jbGllbnQpIHsKLSAgICBzdGF0dXMgPSBpbl9zdGF0dXM7Ci0gICAgY2JfdXVpZCA9IHV1aWQ7Ci0gICAgY2xpZW50ID0gc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneUNsaWVudD4oCi0gICAgICAgIHN0YXRpY19jYXN0PExvd0VuZXJneUNsaWVudCo+KGluX2NsaWVudC5yZWxlYXNlKCkpKTsKLSAgICBjYWxsYmFja19jb3VudCsrOwotICB9OwotCi0gIFV1aWQgdXVpZDAgPSBVdWlkOjpHZXRSYW5kb20oKTsKLQotICAvLyBIQUwgcmV0dXJucyBmYWlsdXJlLgotICBFWFBFQ1RfRkFMU0UoYmxlX2ZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQwLCBjYWxsYmFjaykpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIEhBTCByZXR1cm5zIHN1Y2Nlc3MuCi0gIEVYUEVDVF9UUlVFKGJsZV9mYWN0b3J5Xy0+UmVnaXN0ZXJJbnN0YW5jZSh1dWlkMCwgY2FsbGJhY2spKTsKLSAgRVhQRUNUX0VRKDAsIGNhbGxiYWNrX2NvdW50KTsKLQotICAvLyBDYWxsaW5nIHR3aWNlIHdpdGggdGhlIHNhbWUgVXVpZCBzaG91bGQgZmFpbCB3aXRoIG5vIGFkZGl0aW9uYWwgY2FsbCBpbnRvCi0gIC8vIHRoZSBzdGFjay4KLSAgRVhQRUNUX0ZBTFNFKGJsZV9mYWN0b3J5Xy0+UmVnaXN0ZXJJbnN0YW5jZSh1dWlkMCwgY2FsbGJhY2spKTsKLQotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotCi0gIC8vIENhbGwgd2l0aCBhIGRpZmZlcmVudCBVdWlkIHdoaWxlIG9uZSBpcyBwZW5kaW5nLgotICBVdWlkIHV1aWQxID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBSZWdpc3RlckNsaWVudChfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBFWFBFQ1RfVFJVRShibGVfZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZDEsIGNhbGxiYWNrKSk7Ci0KLSAgLy8gVHJpZ2dlciBjYWxsYmFjayB3aXRoIGFuIHVua25vd24gVXVpZC4gVGhpcyBzaG91bGQgZ2V0IGlnbm9yZWQuCi0gIFV1aWQgdXVpZDIgPSBVdWlkOjpHZXRSYW5kb20oKTsKLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyQ2xpZW50Q2FsbGJhY2soMCwgMCwgdXVpZDIpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIHx1dWlkMHwgc3VjY2VlZHMuCi0gIGludCBjbGllbnRfaWYwID0gMjsgIC8vIFBpY2sgc29tZXRoaW5nIHRoYXQncyBub3QgMC4KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVJlZ2lzdGVyQ2xpZW50Q2FsbGJhY2soQlRfU1RBVFVTX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZjAsIHV1aWQwKTsKLQotICBFWFBFQ1RfRVEoMSwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShjbGllbnQuZ2V0KCkgIT0gbnVsbHB0cik7ICAvLyBBc3NlcnQgdG8gdGVybWluYXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgRVhQRUNUX0VRKEJMRV9TVEFUVVNfU1VDQ0VTUywgc3RhdHVzKTsKLSAgRVhQRUNUX0VRKGNsaWVudF9pZjAsIGNsaWVudC0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBjbGllbnQtPkdldEFwcElkZW50aWZpZXIoKSk7Ci0gIEVYUEVDVF9FUSh1dWlkMCwgY2JfdXVpZCk7Ci0KLSAgLy8gVGhlIGNsaWVudCBzaG91bGQgdW5yZWdpc3RlciBpdHNlbGYgd2hlbiBkZWxldGVkLgotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgVW5yZWdpc3RlckNsaWVudChjbGllbnRfaWYwKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihCVF9TVEFUVVNfU1VDQ0VTUykpOwotICBjbGllbnQucmVzZXQoKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhtb2NrX2hhbmRsZXJfLmdldCgpKTsKLQotICAvLyB8dXVpZDF8IGZhaWxzLgotICBpbnQgY2xpZW50X2lmMSA9IDM7Ci0gIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlSZWdpc3RlckNsaWVudENhbGxiYWNrKEJUX1NUQVRVU19GQUlMLCBjbGllbnRfaWYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkMSk7Ci0KLSAgRVhQRUNUX0VRKDIsIGNhbGxiYWNrX2NvdW50KTsKLSAgQVNTRVJUX1RSVUUoY2xpZW50LmdldCgpID09IG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX0ZBSUxVUkUsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUSh1dWlkMSwgY2JfdXVpZCk7Ci19Ci0KLU1BVENIRVJfUChCaXRFcSwgeCwgc3RkOjpzdHJpbmcobmVnYXRpb24gPyAiaXNuJ3QiIDogImlzIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBiaXR3aXNlIGVxdWFsIHRvICIgKyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoeCkpIHsKLSAgc3RhdGljX2Fzc2VydChzaXplb2YoeCkgPT0gc2l6ZW9mKGFyZyksICJTaXplIG1pc21hdGNoIik7Ci0gIHJldHVybiBzdGQ6Om1lbWNtcCgmYXJnLCAmeCwgc2l6ZW9mKHgpKSA9PSAwOwotfQotCi1URVNUX0YoTG93RW5lcmd5Q2xpZW50UG9zdFJlZ2lzdGVyVGVzdCwgQ29ubmVjdCkgewotICBjb25zdCBSYXdBZGRyZXNzIGtUZXN0QWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwQSwgMHgwQiwgMHgwQ319OwotICBjb25zdCBjaGFyIGtUZXN0QWRkcmVzc1N0cltdID0gIjAxOjAyOjAzOjBBOjBCOjBDIjsKLSAgY29uc3QgYm9vbCBrVGVzdERpcmVjdCA9IGZhbHNlOwotICBjb25zdCBpbnQgY29ubklkID0gMTI7Ci0KLSAgVGVzdERlbGVnYXRlIGRlbGVnYXRlOwotICBsZV9jbGllbnRfLT5TZXREZWxlZ2F0ZSgmZGVsZWdhdGUpOwotCi0gIC8vIFRPRE8oanBhd2xvd3NraSk6IE5vdGlmeUNvbm5lY3RDYWxsYmFjayBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJldHVybmluZwotICAvLyBzdWNjZXNzLCBmaXggaXQgd2hlbiBpdCBiZWNvbWVzIGltcG9ydGFudC4KLSAgLy8gVGhlc2Ugc2hvdWxkIHN1Y2NlZWQgYW5kIHJlc3VsdCBpbiBhIEhBTCBjYWxsCi0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLAotICAgICAgICAgICAgICBDb25uZWN0KGxlX2NsaWVudF8tPkdldEluc3RhbmNlSWQoKSwgQml0RXEoa1Rlc3RBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICBrVGVzdERpcmVjdCwgQlRfVFJBTlNQT1JUX0xFKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKERvQWxsKEludm9rZShbJl0oaW50IGNsaWVudF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCBpbnQgdHJhbnNwb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5Q29ubmVjdENhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5JZCwgQlRfU1RBVFVTX1NVQ0NFU1MsIGNsaWVudF9pZCwgYmRfYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgfSksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKEJUX1NUQVRVU19TVUNDRVNTKSkpOwotCi0gIEVYUEVDVF9UUlVFKGxlX2NsaWVudF8tPkNvbm5lY3Qoa1Rlc3RBZGRyZXNzU3RyLCBrVGVzdERpcmVjdCkpOwotICBFWFBFQ1RfRVEoMSwgZGVsZWdhdGUuY29ubmVjdGlvbl9zdGF0ZV9jb3VudCgpKTsKLQotICAvLyBUT0RPKGpwYXdsb3dza2kpOiBzYW1lIGFzIGFib3ZlCi0gIC8vIFRoZXNlIHNob3VsZCBzdWNjZWVkIGFuZCByZXN1bHQgaW4gYSBIQUwgY2FsbAotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgRGlzY29ubmVjdChsZV9jbGllbnRfLT5HZXRJbnN0YW5jZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdEVxKGtUZXN0QWRkcmVzcyksIGNvbm5JZCkpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShEb0FsbCgKLSAgICAgICAgICBJbnZva2UoWyZdKGludCBjbGllbnRfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGludCBjb25uSWQpIHsKLSAgICAgICAgICAgIGZha2VfaGFsX2dhdHRfaWZhY2VfLT5Ob3RpZnlEaXNjb25uZWN0Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgY29ubklkLCBCVF9TVEFUVVNfU1VDQ0VTUywgY2xpZW50X2lkLCBiZF9hZGRyKTsKLSAgICAgICAgICB9KSwKLSAgICAgICAgICBSZXR1cm4oQlRfU1RBVFVTX1NVQ0NFU1MpKSk7Ci0KLSAgRVhQRUNUX1RSVUUobGVfY2xpZW50Xy0+RGlzY29ubmVjdChrVGVzdEFkZHJlc3NTdHIpKTsKLSAgRVhQRUNUX0VRKDIsIGRlbGVnYXRlLmNvbm5lY3Rpb25fc3RhdGVfY291bnQoKSk7Ci0KLSAgbGVfY2xpZW50Xy0+U2V0RGVsZWdhdGUobnVsbHB0cik7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS90ZXN0L2xvd19lbmVyZ3lfc2Nhbm5lcl91bml0dGVzdC5jYyBiL3NlcnZpY2UvdGVzdC9sb3dfZW5lcmd5X3NjYW5uZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmNhMTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L2xvd19lbmVyZ3lfc2Nhbm5lcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJzZXJ2aWNlL2xvd19lbmVyZ3lfc2Nhbm5lci5oIgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJzZXJ2aWNlL2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9mYWtlX2JsdWV0b290aF9nYXR0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0ZXN0L21vY2tfYWRhcHRlci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6XzsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpQb2ludGVlOwotdXNpbmcgOjp0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIDo6dGVzdGluZzo6SW52b2tlOwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vY2tTY2FubmVySGFuZGxlciA6IHB1YmxpYyBCbGVTY2FubmVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1vY2tTY2FubmVySGFuZGxlcigpIHt9Ci0gIH5Nb2NrU2Nhbm5lckhhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QyKFJlZ2lzdGVyU2Nhbm5lciwgdm9pZChjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsZVNjYW5uZXJJbnRlcmZhY2U6OlJlZ2lzdGVyQ2FsbGJhY2spKTsKLSAgTU9DS19NRVRIT0QxKFVucmVnaXN0ZXIsIHZvaWQoaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMShTY2FuLCB2b2lkKGJvb2wpKTsKLQotICBNT0NLX01FVEhPRDUoU2NhbkZpbHRlclBhcmFtU2V0dXBJbXBsLAotICAgICAgICAgICAgICAgdm9pZCh1aW50OF90IGNsaWVudF9pZiwgdWludDhfdCBhY3Rpb24sIHVpbnQ4X3QgZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgYnRnYXR0X2ZpbHRfcGFyYW1fc2V0dXBfdCogZmlsdF9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgRmlsdGVyUGFyYW1TZXR1cENhbGxiYWNrIGNiKSk7Ci0gIE1PQ0tfTUVUSE9EMihTY2FuRmlsdGVyQ2xlYXIsIHZvaWQoaW50IGZpbHRfaW5kZXgsIEZpbHRlckNvbmZpZ0NhbGxiYWNrIGNiKSk7Ci0gIE1PQ0tfTUVUSE9EMihTY2FuRmlsdGVyRW5hYmxlLCB2b2lkKGJvb2wgZW5hYmxlLCBFbmFibGVDYWxsYmFjayBjYikpOwotICBNT0NLX01FVEhPRDQoU2V0U2NhblBhcmFtZXRlcnMsIHZvaWQoaW50IHNjYW5uZXJfaWQsIGludCBzY2FuX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYW5fd2luZG93LCBDYWxsYmFjayBjYikpOwotCi0gIE1PQ0tfTUVUSE9ENShCYXRjaHNjYW5Db25maWdTdG9yYWdlLAotICAgICAgICAgICAgICAgdm9pZChpbnQgY2xpZW50X2lmLCBpbnQgYmF0Y2hfc2Nhbl9mdWxsX21heCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGJhdGNoX3NjYW5fdHJ1bmNfbWF4LCBpbnQgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBjYikpOwotCi0gIE1PQ0tfTUVUSE9ENihCYXRjaHNjYW5FbmFibGUsCi0gICAgICAgICAgICAgICB2b2lkKGludCBzY2FuX21vZGUsIGludCBzY2FuX2ludGVydmFsLCBpbnQgc2Nhbl93aW5kb3csCi0gICAgICAgICAgICAgICAgICAgIGludCBhZGRyX3R5cGUsIGludCBkaXNjYXJkX3J1bGUsIENhbGxiYWNrIGNiKSk7Ci0KLSAgTU9DS19NRVRIT0QxKEJhdGNoc2NhbkRpc2FibGUsIHZvaWQoQ2FsbGJhY2sgY2IpKTsKLQotICBNT0NLX01FVEhPRDIoQmF0Y2hzY2FuUmVhZFJlcG9ydHMsIHZvaWQoaW50IGNsaWVudF9pZiwgaW50IHNjYW5fbW9kZSkpOwotCi0gIE1PQ0tfTUVUSE9ENyhTdGFydFN5bmMsIHZvaWQodWludDhfdCwgUmF3QWRkcmVzcywgdWludDE2X3QsIHVpbnQxNl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0U3luY0NiLCBTeW5jUmVwb3J0Q2IsIFN5bmNMb3N0Q2IpKTsKLSAgTU9DS19NRVRIT0QxKFN0b3BTeW5jLCB2b2lkKHVpbnQxNl90KSk7Ci0KLSAgTU9DS19NRVRIT0QxKFJlZ2lzdGVyQ2FsbGJhY2tzLCB2b2lkKFNjYW5uaW5nQ2FsbGJhY2tzKiBjYWxsYmFja3MpKTsKLQotICB2b2lkIFNjYW5GaWx0ZXJBZGQoaW50IGZpbHRlcl9pbmRleCwgc3RkOjp2ZWN0b3I8QXBjZkNvbW1hbmQ+IGZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDb25maWdDYWxsYmFjayBjYikgb3ZlcnJpZGV7fTsKLQotICB2b2lkIFNjYW5GaWx0ZXJQYXJhbVNldHVwKAotICAgICAgdWludDhfdCBjbGllbnRfaWYsIHVpbnQ4X3QgYWN0aW9uLCB1aW50OF90IGZpbHRfaW5kZXgsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8YnRnYXR0X2ZpbHRfcGFyYW1fc2V0dXBfdD4gZmlsdF9wYXJhbSwKLSAgICAgIEZpbHRlclBhcmFtU2V0dXBDYWxsYmFjayBjYikgb3ZlcnJpZGUgewotICAgIFNjYW5GaWx0ZXJQYXJhbVNldHVwSW1wbChjbGllbnRfaWYsIGFjdGlvbiwgZmlsdF9pbmRleCwgZmlsdF9wYXJhbS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIFRlc3REZWxlZ2F0ZSA6IHB1YmxpYyBMb3dFbmVyZ3lTY2FubmVyOjpEZWxlZ2F0ZSB7Ci0gcHVibGljOgotICBUZXN0RGVsZWdhdGUoKSA6IHNjYW5fcmVzdWx0X2NvdW50XygwKSB7fQotCi0gIH5UZXN0RGVsZWdhdGUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgaW50IHNjYW5fcmVzdWx0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gc2Nhbl9yZXN1bHRfY291bnRfOyB9Ci0gIGNvbnN0IFNjYW5SZXN1bHQmIGxhc3Rfc2Nhbl9yZXN1bHQoKSBjb25zdCB7IHJldHVybiBsYXN0X3NjYW5fcmVzdWx0XzsgfQotCi0gIHZvaWQgT25TY2FuUmVzdWx0KExvd0VuZXJneVNjYW5uZXIqIHNjYW5uZXIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYW5SZXN1bHQmIHNjYW5fcmVzdWx0KSBvdmVycmlkZSB7Ci0gICAgQVNTRVJUX1RSVUUoc2Nhbm5lcik7Ci0gICAgc2Nhbl9yZXN1bHRfY291bnRfKys7Ci0gICAgbGFzdF9zY2FuX3Jlc3VsdF8gPSBzY2FuX3Jlc3VsdDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgaW50IHNjYW5fcmVzdWx0X2NvdW50XzsKLSAgU2NhblJlc3VsdCBsYXN0X3NjYW5fcmVzdWx0XzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVGVzdERlbGVnYXRlKTsKLX07Ci0KLWNsYXNzIExvd0VuZXJneVNjYW5uZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBMb3dFbmVyZ3lTY2FubmVyVGVzdCgpID0gZGVmYXVsdDsKLSAgfkxvd0VuZXJneVNjYW5uZXJUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgLy8gT25seSBzZXQgfG1vY2tfaGFuZGxlcl98IGlmIGEgdGVzdCBoYXNuJ3Qgc2V0IGl0LgotICAgIGlmICghbW9ja19oYW5kbGVyXykgbW9ja19oYW5kbGVyXy5yZXNldChuZXcgTW9ja1NjYW5uZXJIYW5kbGVyKCkpOwotICAgIGZha2VfaGFsX2dhdHRfaWZhY2VfID0gbmV3IGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2UoCi0gICAgICAgIG51bGxwdHIsIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxCbGVTY2FubmVySW50ZXJmYWNlPihtb2NrX2hhbmRsZXJfKSwKLSAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgaGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJbml0aWFsaXplRm9yVGVzdGluZyhmYWtlX2hhbF9nYXR0X2lmYWNlXyk7Ci0gICAgYmxlX2ZhY3RvcnlfLnJlc2V0KG5ldyBMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeShtb2NrX2FkYXB0ZXJfKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGJsZV9mYWN0b3J5Xy5yZXNldCgpOwotICAgIGhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xlYW5VcCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGhhbDo6RmFrZUJsdWV0b290aEdhdHRJbnRlcmZhY2UqIGZha2VfaGFsX2dhdHRfaWZhY2VfOwotICB0ZXN0aW5nOjpNb2NrQWRhcHRlciBtb2NrX2FkYXB0ZXJfOwotICBzdGQ6OnNoYXJlZF9wdHI8TW9ja1NjYW5uZXJIYW5kbGVyPiBtb2NrX2hhbmRsZXJfOwotICBzdGQ6OnVuaXF1ZV9wdHI8TG93RW5lcmd5U2Nhbm5lckZhY3Rvcnk+IGJsZV9mYWN0b3J5XzsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lTY2FubmVyVGVzdCk7Ci19OwotCi0vLyBVc2VkIGZvciB0ZXN0cyB0aGF0IG9wZXJhdGUgb24gYSBwcmUtcmVnaXN0ZXJlZCBzY2FubmVyLgotY2xhc3MgTG93RW5lcmd5U2Nhbm5lclBvc3RSZWdpc3RlclRlc3QgOiBwdWJsaWMgTG93RW5lcmd5U2Nhbm5lclRlc3QgewotIHB1YmxpYzoKLSAgTG93RW5lcmd5U2Nhbm5lclBvc3RSZWdpc3RlclRlc3QoKSA6IG5leHRfc2Nhbm5lcl9pZF8oMCkge30KLSAgfkxvd0VuZXJneVNjYW5uZXJQb3N0UmVnaXN0ZXJUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgTG93RW5lcmd5U2Nhbm5lclRlc3Q6OlNldFVwKCk7Ci0gICAgYXV0byBjYWxsYmFjayA9IFsmXShzdGQ6OnVuaXF1ZV9wdHI8TG93RW5lcmd5U2Nhbm5lcj4gc2Nhbm5lcikgewotICAgICAgbGVfc2Nhbm5lcl8gPSBzdGQ6Om1vdmUoc2Nhbm5lcik7Ci0gICAgfTsKLSAgICBSZWdpc3RlclRlc3RTY2FubmVyKGNhbGxiYWNrKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFVucmVnaXN0ZXIoXykpLlRpbWVzKDEpLldpbGxPbmNlKFJldHVybigpKTsKLSAgICBsZV9zY2FubmVyXy5yZXNldCgpOwotICAgIExvd0VuZXJneVNjYW5uZXJUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlclRlc3RTY2FubmVyKAotICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lTY2FubmVyPiBzY2FubmVyKT4KLSAgICAgICAgICBjYWxsYmFjaykgewotICAgIFV1aWQgdXVpZCA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICAgIGF1dG8gYXBpX2NhbGxiYWNrID0gWyZdKEJMRVN0YXR1cyBzdGF0dXMsIGNvbnN0IFV1aWQmIGluX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsdWV0b290aEluc3RhbmNlPiBpbl9zY2FubmVyKSB7Ci0gICAgICBDSEVDSyhpbl91dWlkID09IHV1aWQpOwotICAgICAgQ0hFQ0soaW5fc2Nhbm5lci5nZXQoKSk7Ci0gICAgICBDSEVDSyhzdGF0dXMgPT0gQkxFX1NUQVRVU19TVUNDRVNTKTsKLQotICAgICAgY2FsbGJhY2soc3RkOjp1bmlxdWVfcHRyPExvd0VuZXJneVNjYW5uZXI+KAotICAgICAgICAgIHN0YXRpY19jYXN0PExvd0VuZXJneVNjYW5uZXIqPihpbl9zY2FubmVyLnJlbGVhc2UoKSkpKTsKLSAgICB9OwotCi0gICAgQmxlU2Nhbm5lckludGVyZmFjZTo6UmVnaXN0ZXJDYWxsYmFjayByZWdfc2Nhbm5lcl9jYjsKLSAgICBVdWlkIHV1aWRfZW1wdHk7Ci0gICAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFJlZ2lzdGVyU2Nhbm5lcihfLCBfKSkKLSAgICAgICAgLlRpbWVzKDEpCi0gICAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZ1dWlkX2VtcHR5KSwgU2F2ZUFyZzwxPigmcmVnX3NjYW5uZXJfY2IpKSk7Ci0KLSAgICBibGVfZmFjdG9yeV8tPlJlZ2lzdGVySW5zdGFuY2UodXVpZCwgYXBpX2NhbGxiYWNrKTsKLQotICAgIHJlZ19zY2FubmVyX2NiLlJ1bihuZXh0X3NjYW5uZXJfaWRfKyssIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lTY2FubmVyPiBsZV9zY2FubmVyXzsKLQotIHByaXZhdGU6Ci0gIGludCBuZXh0X3NjYW5uZXJfaWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMb3dFbmVyZ3lTY2FubmVyUG9zdFJlZ2lzdGVyVGVzdCk7Ci19OwotCi1URVNUX0YoTG93RW5lcmd5U2Nhbm5lclRlc3QsIFJlZ2lzdGVySW5zdGFuY2UpIHsKLSAgQmxlU2Nhbm5lckludGVyZmFjZTo6UmVnaXN0ZXJDYWxsYmFjayByZWdfc2Nhbm5lcl9jYjE7Ci0gIFV1aWQgdXVpZF9lbXB0eTE7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBSZWdpc3RlclNjYW5uZXIoXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZ1dWlkX2VtcHR5MSksIFNhdmVBcmc8MT4oJnJlZ19zY2FubmVyX2NiMSkpKTsKLQotICAvLyBUaGVzZSB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IHBvcHVsYXRlZCB3aXRoIGEgcmVzdWx0IHdoZW4gdGhlIGNhbGxiYWNrCi0gIC8vIGV4ZWN1dGVzLgotICBCTEVTdGF0dXMgc3RhdHVzID0gQkxFX1NUQVRVU19TVUNDRVNTOwotICBVdWlkIGNiX3V1aWQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lTY2FubmVyPiBzY2FubmVyOwotICBpbnQgY2FsbGJhY2tfY291bnQgPSAwOwotCi0gIGF1dG8gY2FsbGJhY2sgPSBbJl0oQkxFU3RhdHVzIGluX3N0YXR1cywgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Qmx1ZXRvb3RoSW5zdGFuY2U+IGluX3NjYW5uZXIpIHsKLSAgICBzdGF0dXMgPSBpbl9zdGF0dXM7Ci0gICAgY2JfdXVpZCA9IHV1aWQ7Ci0gICAgc2Nhbm5lciA9IHN0ZDo6dW5pcXVlX3B0cjxMb3dFbmVyZ3lTY2FubmVyPigKLSAgICAgICAgc3RhdGljX2Nhc3Q8TG93RW5lcmd5U2Nhbm5lcio+KGluX3NjYW5uZXIucmVsZWFzZSgpKSk7Ci0gICAgY2FsbGJhY2tfY291bnQrKzsKLSAgfTsKLQotICBVdWlkIHV1aWQwID0gVXVpZDo6R2V0UmFuZG9tKCk7Ci0KLSAgLy8gSEFMIHJldHVybnMgc3VjY2Vzcy4KLSAgRVhQRUNUX1RSVUUoYmxlX2ZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQwLCBjYWxsYmFjaykpOwotICBFWFBFQ1RfRVEoMCwgY2FsbGJhY2tfY291bnQpOwotCi0gIC8vIENhbGxpbmcgdHdpY2Ugd2l0aCB0aGUgc2FtZSBVdWlkIHNob3VsZCBmYWlsIHdpdGggbm8gYWRkaXRpb25hbCBjYWxsIGludG8KLSAgLy8gdGhlIHN0YWNrLgotICBFWFBFQ1RfRkFMU0UoYmxlX2ZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQwLCBjYWxsYmFjaykpOwotCi0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci0KLSAgLy8gQ2FsbCB3aXRoIGEgZGlmZmVyZW50IFV1aWQgd2hpbGUgb25lIGlzIHBlbmRpbmcuCi0gIFV1aWQgdXVpZDEgPSBVdWlkOjpHZXRSYW5kb20oKTsKLSAgQmxlU2Nhbm5lckludGVyZmFjZTo6UmVnaXN0ZXJDYWxsYmFjayByZWdfc2Nhbm5lcl9jYjI7Ci0gIFV1aWQgdXVpZF9lbXB0eTI7Ci0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBSZWdpc3RlclNjYW5uZXIoXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDA+KCZ1dWlkX2VtcHR5MiksIFNhdmVBcmc8MT4oJnJlZ19zY2FubmVyX2NiMikpKTsKLSAgRVhQRUNUX1RSVUUoYmxlX2ZhY3RvcnlfLT5SZWdpc3Rlckluc3RhbmNlKHV1aWQxLCBjYWxsYmFjaykpOwotCi0gIC8vIHx1dWlkMHwgc3VjY2VlZHMuCi0gIGludCBzY2FubmVyX2lmMCA9IDI7ICAvLyBQaWNrIHNvbWV0aGluZyB0aGF0J3Mgbm90IDAuCi0gIHJlZ19zY2FubmVyX2NiMS5SdW4oc2Nhbm5lcl9pZjAsIEJUX1NUQVRVU19TVUNDRVNTKTsKLQotICBFWFBFQ1RfRVEoMSwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShzY2FubmVyLmdldCgpICE9Ci0gICAgICAgICAgICAgIG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX1NVQ0NFU1MsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUShzY2FubmVyX2lmMCwgc2Nhbm5lci0+R2V0SW5zdGFuY2VJZCgpKTsKLSAgRVhQRUNUX0VRKHV1aWQwLCBzY2FubmVyLT5HZXRBcHBJZGVudGlmaWVyKCkpOwotICBFWFBFQ1RfRVEodXVpZDAsIGNiX3V1aWQpOwotCi0gIC8vIFRoZSBzY2FubmVyIHNob3VsZCB1bnJlZ2lzdGVyIGl0c2VsZiB3aGVuIGRlbGV0ZWQuCi0gIEVYUEVDVF9DQUxMKCptb2NrX2hhbmRsZXJfLCBVbnJlZ2lzdGVyKHNjYW5uZXJfaWYwKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKTsKLSAgc2Nhbm5lci5yZXNldCgpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKG1vY2tfaGFuZGxlcl8uZ2V0KCkpOwotCi0gIC8vIHx1dWlkMXwgZmFpbHMuCi0gIGludCBzY2FubmVyX2lmMSA9IDM7Ci0gIHJlZ19zY2FubmVyX2NiMi5SdW4oc2Nhbm5lcl9pZjEsIEJUX1NUQVRVU19GQUlMKTsKLQotICBFWFBFQ1RfRVEoMiwgY2FsbGJhY2tfY291bnQpOwotICBBU1NFUlRfVFJVRShzY2FubmVyLmdldCgpID09Ci0gICAgICAgICAgICAgIG51bGxwdHIpOyAgLy8gQXNzZXJ0IHRvIHRlcm1pbmF0ZSBpbiBjYXNlIG9mIGVycm9yCi0gIEVYUEVDVF9FUShCTEVfU1RBVFVTX0ZBSUxVUkUsIHN0YXR1cyk7Ci0gIEVYUEVDVF9FUSh1dWlkMSwgY2JfdXVpZCk7Ci19Ci0KLVRFU1RfRihMb3dFbmVyZ3lTY2FubmVyUG9zdFJlZ2lzdGVyVGVzdCwgU2NhblNldHRpbmdzKSB7Ci0gIEVYUEVDVF9DQUxMKG1vY2tfYWRhcHRlcl8sIElzRW5hYmxlZCgpKQotICAgICAgLldpbGxPbmNlKFJldHVybihmYWxzZSkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKHRydWUpKTsKLQotICBTY2FuU2V0dGluZ3Mgc2V0dGluZ3M7Ci0gIHN0ZDo6dmVjdG9yPFNjYW5GaWx0ZXI+IGZpbHRlcnM7Ci0KLSAgLy8gQWRhcHRlciBpcyBub3QgZW5hYmxlZC4KLSAgRVhQRUNUX0ZBTFNFKGxlX3NjYW5uZXJfLT5TdGFydFNjYW4oc2V0dGluZ3MsIGZpbHRlcnMpKTsKLQotICAvLyBUT0RPKGpwYXdsb3dza2kpOiBhZGQgdGVzdHMgY2hlY2tpbmcgc2V0dGluZ3MgYW5kIGZpbHRlciBwYXJzaW5nIHdoZW4KLSAgLy8gaW1wbGVtZW50ZWQKLQotICAvLyBUaGVzZSBzaG91bGQgc3VjY2VlZCBhbmQgcmVzdWx0IGluIGEgSEFMIGNhbGwKLSAgRVhQRUNUX0NBTEwoKm1vY2tfaGFuZGxlcl8sIFNjYW4odHJ1ZSkpLlRpbWVzKDEpLldpbGxPbmNlKFJldHVybigpKTsKLSAgRVhQRUNUX1RSVUUobGVfc2Nhbm5lcl8tPlN0YXJ0U2NhbihzZXR0aW5ncywgZmlsdGVycykpOwotCi0gIC8vIFRoZXNlIHNob3VsZCBzdWNjZWVkIGFuZCByZXN1bHQgaW4gYSBIQUwgY2FsbAotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2NhbihmYWxzZSkpLlRpbWVzKDEpLldpbGxPbmNlKFJldHVybigpKTsKLSAgRVhQRUNUX1RSVUUobGVfc2Nhbm5lcl8tPlN0b3BTY2FuKCkpOwotCi0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobW9ja19oYW5kbGVyXy5nZXQoKSk7Ci19Ci0KLVRFU1RfRihMb3dFbmVyZ3lTY2FubmVyUG9zdFJlZ2lzdGVyVGVzdCwgU2NhblJlY29yZCkgewotICBUZXN0RGVsZWdhdGUgZGVsZWdhdGU7Ci0gIGxlX3NjYW5uZXJfLT5TZXREZWxlZ2F0ZSgmZGVsZWdhdGUpOwotCi0gIEVYUEVDVF9FUSgwLCBkZWxlZ2F0ZS5zY2FuX3Jlc3VsdF9jb3VudCgpKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVGVzdFJlY29yZDAoezB4MDIsIDB4MDEsIDB4MDAsIDB4MDB9KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga1Rlc3RSZWNvcmQxKHsweDAwfSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtUZXN0UmVjb3JkMigKLSAgICAgIHsweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLAotICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCi0gICAgICAgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwKLSAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsCi0gICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMH0pOwotICBjb25zdCBSYXdBZGRyZXNzIGtUZXN0QWRkcmVzcyA9IHt7MHgwMSwgMHgwMiwgMHgwMywgMHgwQSwgMHgwQiwgMHgwQ319OwotICBjb25zdCBjaGFyIGtUZXN0QWRkcmVzc1N0cltdID0gIjAxOjAyOjAzOjBBOjBCOjBDIjsKLSAgY29uc3QgaW50IGtUZXN0UnNzaSA9IDY0OwotCi0gIC8vIFNjYW4gd2Fzbid0IHN0YXJ0ZWQuIFJlc3VsdCBzaG91bGQgYmUgaWdub3JlZC4KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVNjYW5SZXN1bHRDYWxsYmFjayhrVGVzdEFkZHJlc3MsIGtUZXN0UnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFJlY29yZDApOwotICBFWFBFQ1RfRVEoMCwgZGVsZWdhdGUuc2Nhbl9yZXN1bHRfY291bnQoKSk7Ci0KLSAgLy8gU3RhcnQgYSBzY2FuIHNlc3Npb24gZm9yIHxsZV9zY2FubmVyX3wuCi0gIEVYUEVDVF9DQUxMKG1vY2tfYWRhcHRlcl8sIElzRW5hYmxlZCgpKS5UaW1lcygxKS5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqbW9ja19oYW5kbGVyXywgU2NhbihfKSkKLSAgICAgIC5UaW1lcygyKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKQotICAgICAgLldpbGxPbmNlKFJldHVybigpKTsKLSAgU2NhblNldHRpbmdzIHNldHRpbmdzOwotICBzdGQ6OnZlY3RvcjxTY2FuRmlsdGVyPiBmaWx0ZXJzOwotICBBU1NFUlRfVFJVRShsZV9zY2FubmVyXy0+U3RhcnRTY2FuKHNldHRpbmdzLCBmaWx0ZXJzKSk7Ci0KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVNjYW5SZXN1bHRDYWxsYmFjayhrVGVzdEFkZHJlc3MsIGtUZXN0UnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFJlY29yZDApOwotICBFWFBFQ1RfRVEoMSwgZGVsZWdhdGUuc2Nhbl9yZXN1bHRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkZHJlc3NTdHIsIGRlbGVnYXRlLmxhc3Rfc2Nhbl9yZXN1bHQoKS5kZXZpY2VfYWRkcmVzcygpKTsKLSAgRVhQRUNUX0VRKGtUZXN0UnNzaSwgZGVsZWdhdGUubGFzdF9zY2FuX3Jlc3VsdCgpLnJzc2koKSk7Ci0gIEVYUEVDVF9FUSgzVSwgZGVsZWdhdGUubGFzdF9zY2FuX3Jlc3VsdCgpLnNjYW5fcmVjb3JkKCkuc2l6ZSgpKTsKLQotICBmYWtlX2hhbF9nYXR0X2lmYWNlXy0+Tm90aWZ5U2NhblJlc3VsdENhbGxiYWNrKGtUZXN0QWRkcmVzcywga1Rlc3RSc3NpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0UmVjb3JkMSk7Ci0gIEVYUEVDVF9FUSgyLCBkZWxlZ2F0ZS5zY2FuX3Jlc3VsdF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKGtUZXN0QWRkcmVzc1N0ciwgZGVsZWdhdGUubGFzdF9zY2FuX3Jlc3VsdCgpLmRldmljZV9hZGRyZXNzKCkpOwotICBFWFBFQ1RfRVEoa1Rlc3RSc3NpLCBkZWxlZ2F0ZS5sYXN0X3NjYW5fcmVzdWx0KCkucnNzaSgpKTsKLSAgRVhQRUNUX1RSVUUoZGVsZWdhdGUubGFzdF9zY2FuX3Jlc3VsdCgpLnNjYW5fcmVjb3JkKCkuZW1wdHkoKSk7Ci0KLSAgZmFrZV9oYWxfZ2F0dF9pZmFjZV8tPk5vdGlmeVNjYW5SZXN1bHRDYWxsYmFjayhrVGVzdEFkZHJlc3MsIGtUZXN0UnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFJlY29yZDIpOwotICBFWFBFQ1RfRVEoMywgZGVsZWdhdGUuc2Nhbl9yZXN1bHRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUShrVGVzdEFkZHJlc3NTdHIsIGRlbGVnYXRlLmxhc3Rfc2Nhbl9yZXN1bHQoKS5kZXZpY2VfYWRkcmVzcygpKTsKLSAgRVhQRUNUX0VRKGtUZXN0UnNzaSwgZGVsZWdhdGUubGFzdF9zY2FuX3Jlc3VsdCgpLnJzc2koKSk7Ci0gIEVYUEVDVF9FUSg2MlUsIGRlbGVnYXRlLmxhc3Rfc2Nhbl9yZXN1bHQoKS5zY2FuX3JlY29yZCgpLnNpemUoKSk7Ci0KLSAgbGVfc2Nhbm5lcl8tPlNldERlbGVnYXRlKG51bGxwdHIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9tYWluLmNjIGIvc2VydmljZS90ZXN0L21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTE3MzUuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGJhc2UvYXRfZXhpdC5oPgotI2luY2x1ZGUgPGJhc2UvY29tbWFuZF9saW5lLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1HVEVTVF9BUElfIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBiYXNlOjpBdEV4aXRNYW5hZ2VyIGV4aXRfbWFuYWdlcjsKLSAgYmFzZTo6Q29tbWFuZExpbmU6OkluaXQoYXJnYywgYXJndik7Ci0gIGxvZ2dpbmc6OkxvZ2dpbmdTZXR0aW5ncyBsb2dfc2V0dGluZ3M7Ci0gIGxvZ2dpbmc6OkluaXRMb2dnaW5nKGxvZ19zZXR0aW5ncyk7Ci0KLSAgTE9HKElORk8pIDw8ICJSdW5uaW5nIEJsdWV0b290aCBkYWVtb24gdW5pdCB0ZXN0cy4iOwotICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlL3Rlc3QvbW9ja19hZGFwdGVyLmggYi9zZXJ2aWNlL3Rlc3QvbW9ja19hZGFwdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTIwMjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L21vY2tfYWRhcHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgInNlcnZpY2UvZGFlbW9uLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb2NrQWRhcHRlciA6IHB1YmxpYyBBZGFwdGVyIHsKLSBwdWJsaWM6Ci0gIE1vY2tBZGFwdGVyKCkgPSBkZWZhdWx0OwotICB+TW9ja0FkYXB0ZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19NRVRIT0QxKEFkZE9ic2VydmVyLCB2b2lkKE9ic2VydmVyKikpOwotICBNT0NLX01FVEhPRDEoUmVtb3ZlT2JzZXJ2ZXIsIHZvaWQoT2JzZXJ2ZXIqKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRTdGF0ZSwgQWRhcHRlclN0YXRlKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDAoSXNFbmFibGVkLCBib29sKCkpOwotICBNT0NLX01FVEhPRDAoRW5hYmxlLCBib29sKCkpOwotICBNT0NLX01FVEhPRDAoRGlzYWJsZSwgYm9vbCgpKTsKLSAgTU9DS19DT05TVF9NRVRIT0QwKEdldE5hbWUsIHN0ZDo6c3RyaW5nKCkpOwotICBNT0NLX01FVEhPRDEoU2V0TmFtZSwgYm9vbChjb25zdCBzdGQ6OnN0cmluZyYpKTsKLSAgTU9DS19DT05TVF9NRVRIT0QwKEdldEFkZHJlc3MsIHN0ZDo6c3RyaW5nKCkpOwotICBNT0NLX01FVEhPRDEoU2V0U2Nhbk1vZGUsIGJvb2woaW50KSk7Ci0gIE1PQ0tfTUVUSE9EMShTZXRTY2FuRW5hYmxlLCBib29sKGJvb2wpKTsKLSAgTU9DS19NRVRIT0Q0KFNzcFJlcGx5LCBib29sKGNvbnN0IHN0ZDo6c3RyaW5nJiwgaW50LCBib29sLCBpbnQzMl90KSk7Ci0gIE1PQ0tfTUVUSE9EMihDcmVhdGVCb25kLAotICAgICAgICAgICAgICAgYm9vbChjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX2FkZHJlc3MsIGludCB0cmFuc3BvcnQpKTsKLSAgTU9DS19NRVRIT0QwKElzTXVsdGlBZHZlcnRpc2VtZW50U3VwcG9ydGVkLCBib29sKCkpOwotICBNT0NLX01FVEhPRDEoSXNEZXZpY2VDb25uZWN0ZWQsIGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmKSk7Ci0gIE1PQ0tfTUVUSE9EMChHZXRUb3RhbE51bWJlck9mVHJhY2thYmxlQWR2ZXJ0aXNlbWVudHMsIGludCgpKTsKLSAgTU9DS19NRVRIT0QwKElzT2ZmbG9hZGVkRmlsdGVyaW5nU3VwcG9ydGVkLCBib29sKCkpOwotICBNT0NLX01FVEhPRDAoSXNPZmZsb2FkZWRTY2FuQmF0Y2hpbmdTdXBwb3J0ZWQsIGJvb2woKSk7Ci0gIE1PQ0tfTUVUSE9EMChHZXRCb25kZWREZXZpY2VzLCBib29sKCkpOwotICBNT0NLX01FVEhPRDEoUmVtb3ZlQm9uZCwgYm9vbChjb25zdCBzdGQ6OnN0cmluZyYpKTsKLSAgTU9DS19NRVRIT0QxKEdldFJlbW90ZURldmljZVByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICBib29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfYWRkcmVzcykpOwotICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0QTJkcFNpbmtGYWN0b3J5LCBBMmRwU2lua0ZhY3RvcnkqKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0QTJkcFNvdXJjZUZhY3RvcnksIEEyZHBTb3VyY2VGYWN0b3J5KigpKTsKLSAgTU9DS19DT05TVF9NRVRIT0QwKEdldEF2cmNwQ29udHJvbEZhY3RvcnksIEF2cmNwQ29udHJvbEZhY3RvcnkqKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0QXZyY3BUYXJnZXRGYWN0b3J5LCBBdnJjcFRhcmdldEZhY3RvcnkqKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0TG93RW5lcmd5Q2xpZW50RmFjdG9yeSwgTG93RW5lcmd5Q2xpZW50RmFjdG9yeSooKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRMZUFkdmVydGlzZXJGYWN0b3J5LCBMb3dFbmVyZ3lBZHZlcnRpc2VyRmFjdG9yeSooKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRMZVNjYW5uZXJGYWN0b3J5LCBMb3dFbmVyZ3lTY2FubmVyRmFjdG9yeSooKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRHYXR0Q2xpZW50RmFjdG9yeSwgR2F0dENsaWVudEZhY3RvcnkqKCkpOwotICBNT0NLX0NPTlNUX01FVEhPRDAoR2V0R2F0dFNlcnZlckZhY3RvcnksIEdhdHRTZXJ2ZXJGYWN0b3J5KigpKTsKLQotIHByaXZhdGU6Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrQWRhcHRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS90ZXN0L21vY2tfZGFlbW9uLmggYi9zZXJ2aWNlL3Rlc3QvbW9ja19kYWVtb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwMjYyMi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL3Rlc3QvbW9ja19kYWVtb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vCi0vLyAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0vLwotLy8gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0vLwotLy8gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlICJhYnN0cmFjdF9tZXNzYWdlX2xvb3AuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2RhZW1vbi5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW9ja0RhZW1vbiA6IHB1YmxpYyBEYWVtb24gewotIHB1YmxpYzoKLSAgTW9ja0RhZW1vbigpID0gZGVmYXVsdDsKLSAgfk1vY2tEYWVtb24oKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTU9DS19DT05TVF9NRVRIT0QwKEdldFNldHRpbmdzLCBTZXR0aW5ncyooKSk7Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChHZXRNZXNzYWdlTG9vcCwgYnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wKigpKTsKLSAgTU9DS19NRVRIT0QwKFN0YXJ0TWFpbkxvb3AsIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMChJbml0LCBib29sKCkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tEYWVtb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9wYXJjZWxhYmxlX3VuaXR0ZXN0LmNjIGIvc2VydmljZS90ZXN0L3BhcmNlbGFibGVfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYzJiNjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZS90ZXN0L3BhcmNlbGFibGVfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLy8KLS8vICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLS8vCi0vLyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLS8vCi0vLyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvYWR2ZXJ0aXNlX2RhdGEuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9hZHZlcnRpc2Vfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9jaGFyYWN0ZXJpc3RpYy5oIgotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL2JsdWV0b290aF9nYXR0X2Rlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9ibHVldG9vdGhfZ2F0dF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYW5kcm9pZC9ibHVldG9vdGgvc2Nhbl9maWx0ZXIuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC9zY2FuX3Jlc3VsdC5oIgotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2FuZHJvaWQvYmx1ZXRvb3RoL3NjYW5fc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2NvbW1vbi9hbmRyb2lkL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAic2VydmljZS9jb21tb24vYmx1ZXRvb3RoL2xvd19lbmVyZ3lfY29uc3RhbnRzLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLQotdXNpbmcgYmx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhOwotdXNpbmcgYmx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5nczsKLXVzaW5nIGJsdWV0b290aDo6Q2hhcmFjdGVyaXN0aWM7Ci11c2luZyBibHVldG9vdGg6OkRlc2NyaXB0b3I7Ci11c2luZyBibHVldG9vdGg6OlNjYW5GaWx0ZXI7Ci11c2luZyBibHVldG9vdGg6OlNjYW5SZXN1bHQ7Ci11c2luZyBibHVldG9vdGg6OlNjYW5TZXR0aW5nczsKLXVzaW5nIGJsdWV0b290aDo6U2VydmljZTsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgewotCi10ZW1wbGF0ZSA8Y2xhc3MgSU4sIGNsYXNzIE9VVD4KLWJvb2wgVGVzdERhdGEoSU4mIGluKSB7Ci0gIFBhcmNlbCBwYXJjZWw7Ci0KLSAgcGFyY2VsLndyaXRlUGFyY2VsYWJsZSgoT1VUKWluKTsKLSAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKLSAgT1VUIG91dDsKLSAgcGFyY2VsLnJlYWRQYXJjZWxhYmxlKCZvdXQpOwotICAvLyBpbiBjYXNlIG9mIGVycm9yIHRoaXMgZGlzcGxheSBuaWNlIGxvZyBtZXNzYWdlCi0gIEVYUEVDVF9FUShvdXQsIGluKTsKLSAgcmV0dXJuIGluID09IG91dDsKLX0KLQotVEVTVChQYXJjZWxhYmxlVGVzdCwgTm9uRW1wdHlBZHZlcnRpc2VEYXRhKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGF7MHgwMiwgMHgwMiwgMHgwMH07Ci0gIEFkdmVydGlzZURhdGEgYWR2MChkYXRhKTsKLSAgYm9vbCByZXN1bHQgPQotICAgICAgVGVzdERhdGE8QWR2ZXJ0aXNlRGF0YSwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VEYXRhPihhZHYwKTsKLSAgRVhQRUNUX1RSVUUocmVzdWx0KTsKLX0KLQotVEVTVChQYXJjZWxhYmxlVGVzdCwgRGVmYXVsdEFkdmVydGlzZVNldHRpbmdzKSB7Ci0gIEFkdmVydGlzZVNldHRpbmdzIHNldHRpbmdzOwotICBib29sIHJlc3VsdCA9Ci0gICAgICBUZXN0RGF0YTxBZHZlcnRpc2VTZXR0aW5ncywgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5ncz4oCi0gICAgICAgICAgc2V0dGluZ3MpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotfQotCi1URVNUKFBhcmNlbGFibGVUZXN0LCBOb25FbXB0eUFkdmVydGlzZVNldHRpbmdzKSB7Ci0gIEFkdmVydGlzZVNldHRpbmdzIHNldHRpbmdzKAotICAgICAgQWR2ZXJ0aXNlU2V0dGluZ3M6Ok1PREVfQkFMQU5DRUQsIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxNTApLAotICAgICAgQWR2ZXJ0aXNlU2V0dGluZ3M6OlRYX1BPV0VSX0xFVkVMX0hJR0gsIGZhbHNlIC8qIGNvbm5lY3RhYmxlICovKTsKLQotICBib29sIHJlc3VsdCA9Ci0gICAgICBUZXN0RGF0YTxBZHZlcnRpc2VTZXR0aW5ncywgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpBZHZlcnRpc2VTZXR0aW5ncz4oCi0gICAgICAgICAgc2V0dGluZ3MpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotfQotCi1URVNUKFBhcmNlbGFibGVUZXN0LCBVdWlkKSB7Ci0gIC8vIFRyeSBhIHdob2xlIGJ1bmNoIG9mIFV1aWRzLgotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBVdWlkIHV1aWQgPSBVdWlkOjpHZXRSYW5kb20oKTsKLSAgICBUZXN0RGF0YTxVdWlkLCBhbmRyb2lkOjpibHVldG9vdGg6OlVVSUQ+KHV1aWQpOwotICB9Ci19Ci0KLVRFU1QoUGFyY2VsYWJsZVRlc3QsIFNjYW5TZXR0aW5ncykgewotICBTY2FuU2V0dGluZ3Mgc2V0dGluZ3MwOwotICBTY2FuU2V0dGluZ3Mgc2V0dGluZ3MxKAotICAgICAgU2NhblNldHRpbmdzOjpNT0RFX0JBTEFOQ0VELCBTY2FuU2V0dGluZ3M6OkNBTExCQUNLX1RZUEVfRklSU1RfTUFUQ0gsCi0gICAgICBTY2FuU2V0dGluZ3M6OlJFU1VMVF9UWVBFX0FCQlJFVklBVEVELAotICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDE1MCksIFNjYW5TZXR0aW5nczo6TUFUQ0hfTU9ERV9TVElDS1ksCi0gICAgICBTY2FuU2V0dGluZ3M6Ok1BVENIX0NPVU5UX0ZFV19BRFZFUlRJU0VNRU5UUyk7Ci0KLSAgYm9vbCByZXN1bHQgPQotICAgICAgVGVzdERhdGE8U2NhblNldHRpbmdzLCBhbmRyb2lkOjpibHVldG9vdGg6OlNjYW5TZXR0aW5ncz4oc2V0dGluZ3MwKTsKLSAgRVhQRUNUX1RSVUUocmVzdWx0KTsKLQotICByZXN1bHQgPSBUZXN0RGF0YTxTY2FuU2V0dGluZ3MsIGFuZHJvaWQ6OmJsdWV0b290aDo6U2NhblNldHRpbmdzPihzZXR0aW5nczApOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotfQotCi1URVNUKFBhcmNlbGFibGVUZXN0LCBTY2FuRmlsdGVyKSB7Ci0gIFNjYW5GaWx0ZXIgZmlsdGVyOwotCi0gIGZpbHRlci5zZXRfZGV2aWNlX25hbWUoIlRlc3QgRGV2aWNlIE5hbWUiKTsKLSAgQVNTRVJUX1RSVUUoZmlsdGVyLlNldERldmljZUFkZHJlc3MoIjAxOjAyOjA0OkFCOkNEOkVGIikpOwotCi0gIGJvb2wgcmVzdWx0ID0gVGVzdERhdGE8U2NhbkZpbHRlciwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyPihmaWx0ZXIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotCi0gIFV1aWQgdXVpZCA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICBmaWx0ZXIuU2V0U2VydmljZVV1aWQodXVpZCk7Ci0KLSAgcmVzdWx0ID0gVGVzdERhdGE8U2NhbkZpbHRlciwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyPihmaWx0ZXIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotCi0gIFV1aWQgbWFzayA9IFV1aWQ6OkdldFJhbmRvbSgpOwotICBmaWx0ZXIuU2V0U2VydmljZVV1aWRXaXRoTWFzayh1dWlkLCBtYXNrKTsKLSAgcmVzdWx0ID0gVGVzdERhdGE8U2NhbkZpbHRlciwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTY2FuRmlsdGVyPihmaWx0ZXIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotfQotCi1URVNUKFBhcmNlbGFibGVUZXN0LCBTY2FuUmVzdWx0KSB7Ci0gIGNvbnN0IGNoYXIga1Rlc3RBZGRyZXNzW10gPSAiMDE6MDI6MDM6QUI6Q0Q6RUYiOwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtFbXB0eUJ5dGVzOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVGVzdEJ5dGVzezB4MDEsIDB4MDIsIDB4MDN9OwotCi0gIGNvbnN0IGludCBrVGVzdFJzc2kgPSAxMjc7Ci0KLSAgU2NhblJlc3VsdCByZXN1bHQwKGtUZXN0QWRkcmVzcywga0VtcHR5Qnl0ZXMsIGtUZXN0UnNzaSk7Ci0gIFNjYW5SZXN1bHQgcmVzdWx0MShrVGVzdEFkZHJlc3MsIGtUZXN0Qnl0ZXMsIGtUZXN0UnNzaSk7Ci0KLSAgYm9vbCByZXN1bHQgPSBUZXN0RGF0YTxTY2FuUmVzdWx0LCBhbmRyb2lkOjpibHVldG9vdGg6OlNjYW5SZXN1bHQ+KHJlc3VsdDApOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotCi0gIHJlc3VsdCA9IFRlc3REYXRhPFNjYW5SZXN1bHQsIGFuZHJvaWQ6OmJsdWV0b290aDo6U2NhblJlc3VsdD4ocmVzdWx0MSk7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdCk7Ci19Ci0KLVRFU1QoUGFyY2VsYWJsZVRlc3QsIEdhdHREZXNjcmlwdG9yKSB7Ci0gIERlc2NyaXB0b3IgcyA9IERlc2NyaXB0b3IoMHgwMDAwLCBVdWlkOjpHZXRSYW5kb20oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmtBdHRyaWJ1dGVQZXJtaXNzaW9uUmVhZCk7Ci0gIERlc2NyaXB0b3IgczIgPSBEZXNjcmlwdG9yKDB4RkZGRSwgVXVpZDo6R2V0UmFuZG9tKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6a0F0dHJpYnV0ZVBlcm1pc3Npb25Xcml0ZSk7Ci0gIERlc2NyaXB0b3IgczMgPSBEZXNjcmlwdG9yKDB4MDAzRCwgVXVpZDo6R2V0UmFuZG9tKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6a0F0dHJpYnV0ZVBlcm1pc3Npb25SZWFkRW5jcnlwdGVkTUlUTSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmtBdHRyaWJ1dGVQZXJtaXNzaW9uUmVhZCk7Ci0KLSAgYm9vbCByZXN1bHQgPQotICAgICAgVGVzdERhdGE8RGVzY3JpcHRvciwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0RGVzY3JpcHRvcj4ocyk7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdCk7Ci0KLSAgcmVzdWx0ID0KLSAgICAgIFRlc3REYXRhPERlc2NyaXB0b3IsIGFuZHJvaWQ6OmJsdWV0b290aDo6Qmx1ZXRvb3RoR2F0dERlc2NyaXB0b3I+KHMyKTsKLSAgRVhQRUNUX1RSVUUocmVzdWx0KTsKLQotICByZXN1bHQgPQotICAgICAgVGVzdERhdGE8RGVzY3JpcHRvciwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0RGVzY3JpcHRvcj4oczMpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotfQotCi1URVNUKFBhcmNlbGFibGVUZXN0LCBHYXR0Q2hhcmFjdGVyaXN0aWMpIHsKLSAgQ2hhcmFjdGVyaXN0aWMgYyA9IENoYXJhY3RlcmlzdGljKDB4MDAwNCwgVXVpZDo6R2V0UmFuZG9tKCksIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RGVzY3JpcHRvcigweDAwMDUsIFV1aWQ6OkdldFJhbmRvbSgpLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKDB4MDAwNywgVXVpZDo6R2V0UmFuZG9tKCksIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IoMHgwMEExLCBVdWlkOjpHZXRSYW5kb20oKSwgMCl9KTsKLQotICBib29sIHJlc3VsdCA9Ci0gICAgICBUZXN0RGF0YTxDaGFyYWN0ZXJpc3RpYywgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0Q2hhcmFjdGVyaXN0aWM+KAotICAgICAgICAgIGMpOwotICBFWFBFQ1RfVFJVRShyZXN1bHQpOwotfQotCi1URVNUKFBhcmNlbGFibGVUZXN0LCBHYXR0U2VydmljZSkgewotICBTZXJ2aWNlIHMgPQotICAgICAgU2VydmljZSgweDAwMDEsIHRydWUsIFV1aWQ6OkZyb21TdHJpbmcoIkNBRkUiLCBudWxscHRyKSwKLSAgICAgICAgICAgICAge0NoYXJhY3RlcmlzdGljKDB4MDAwNCwgVXVpZDo6R2V0UmFuZG9tKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmtDaGFyYWN0ZXJpc3RpY1Byb3BlcnR5Tm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjprQXR0cmlidXRlUGVybWlzc2lvblJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RGVzY3JpcHRvcigweDAwMDUsIFV1aWQ6OkdldFJhbmRvbSgpLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKDB4MDAwNywgVXVpZDo6R2V0UmFuZG9tKCksIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IoMHgwMDA5LCBVdWlkOjpHZXRSYW5kb20oKSwgMCl9KSwKLSAgICAgICAgICAgICAgIENoYXJhY3RlcmlzdGljKDB4MDAwRCwgVXVpZDo6R2V0UmFuZG9tKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmtDaGFyYWN0ZXJpc3RpY1Byb3BlcnR5V3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmtBdHRyaWJ1dGVQZXJtaXNzaW9uV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RGVzY3JpcHRvcigweDAwMTAsIFV1aWQ6OkdldFJhbmRvbSgpLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKDB4MDAxMiwgVXVpZDo6R2V0UmFuZG9tKCksIDApfSksCi0gICAgICAgICAgICAgICBDaGFyYWN0ZXJpc3RpYygweDAwMTUsIFV1aWQ6OkdldFJhbmRvbSgpLCAwLCAwLCB7fSl9LAotICAgICAgICAgICAgICB7fSk7Ci0KLSAgUGFyY2VsIHBhcmNlbDsKLQotICBwYXJjZWwud3JpdGVQYXJjZWxhYmxlKChhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEdhdHRTZXJ2aWNlKXMpOwotICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOwotICBhbmRyb2lkOjpibHVldG9vdGg6OkJsdWV0b290aEdhdHRTZXJ2aWNlIG91dDsKLSAgcGFyY2VsLnJlYWRQYXJjZWxhYmxlKCZvdXQpOwotCi0gIGJvb2wgcmVzdWx0ID0gVGVzdERhdGE8U2VydmljZSwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpCbHVldG9vdGhHYXR0U2VydmljZT4ocyk7Ci0gIEVYUEVDVF9UUlVFKHJlc3VsdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc2VydmljZS90ZXN0L3NldHRpbmdzX3VuaXR0ZXN0LmNjIGIvc2VydmljZS90ZXN0L3NldHRpbmdzX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQzNzJlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2UvdGVzdC9zZXR0aW5nc191bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGJhc2UvYXRfZXhpdC5oPgotI2luY2x1ZGUgPGJhc2UvY29tbWFuZF9saW5lLmg+Ci0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYXJyYXlfdXRpbHMuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL3NldHRpbmdzLmgiCi0jaW5jbHVkZSAic2VydmljZS9zd2l0Y2hlcy5oIgotCi11c2luZyBibHVldG9vdGg6OlNldHRpbmdzOwotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDo6c3dpdGNoZXM7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFNldHRpbmdzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgU2V0dGluZ3NUZXN0KCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IGJhc2U6OkNvbW1hbmRMaW5lOjpSZXNldCgpOyB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgYmFzZTo6Q29tbWFuZExpbmU6OlJlc2V0KCk7IH0KLQotIHByb3RlY3RlZDoKLSAgYmFzZTo6QXRFeGl0TWFuYWdlciBleGl0X21hbmFnZXJfOwotICBTZXR0aW5ncyBzZXR0aW5nc187Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2V0dGluZ3NUZXN0KTsKLX07Ci0KLVRFU1RfRihTZXR0aW5nc1Rlc3QsIEVtcHR5Q29tbWFuZExpbmUpIHsKLSAgY29uc3QgYmFzZTo6Q29tbWFuZExpbmU6OkNoYXJUeXBlKiBhcmd2W10gPSB7InByb2dyYW0ifTsKLSAgRVhQRUNUX1RSVUUoYmFzZTo6Q29tbWFuZExpbmU6OkluaXQoQVJSQVlfU0laRShhcmd2KSwgYXJndikpOwotICBFWFBFQ1RfVFJVRShzZXR0aW5nc18uSW5pdCgpKTsKLX0KLQotVEVTVF9GKFNldHRpbmdzVGVzdCwgVW5leHBlY3RlZFN3aXRjaGVzMSkgewotICBjb25zdCBiYXNlOjpDb21tYW5kTGluZTo6Q2hhclR5cGUqIGFyZ3ZbXSA9IHsKLSAgICAgICJwcm9ncmFtIiwgIi0tY3JlYXRlLWlwYy1zb2NrZXQ9Zm9vYmFyIiwgIi0tZm9vYmFyYmF6In07Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0KEFSUkFZX1NJWkUoYXJndiksIGFyZ3YpKTsKLSAgRVhQRUNUX0ZBTFNFKHNldHRpbmdzXy5Jbml0KCkpOwotfQotCi1URVNUX0YoU2V0dGluZ3NUZXN0LCBVbmV4cGVjdGVkU3dpdGNoZXMyKSB7Ci0gIGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lOjpDaGFyVHlwZSogYXJndltdID0geyJwcm9ncmFtIiwgIi0tZm9vYmFyYmF6In07Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0KEFSUkFZX1NJWkUoYXJndiksIGFyZ3YpKTsKLSAgRVhQRUNUX0ZBTFNFKHNldHRpbmdzXy5Jbml0KCkpOwotfQotCi1URVNUX0YoU2V0dGluZ3NUZXN0LCBVbmV4cGVjdGVkQXJndW1lbnRzMSkgewotICBjb25zdCBiYXNlOjpDb21tYW5kTGluZTo6Q2hhclR5cGUqIGFyZ3ZbXSA9IHsicHJvZ3JhbSIsICJmb29iYXJiYXoifTsKLSAgRVhQRUNUX1RSVUUoYmFzZTo6Q29tbWFuZExpbmU6OkluaXQoQVJSQVlfU0laRShhcmd2KSwgYXJndikpOwotICBFWFBFQ1RfRkFMU0Uoc2V0dGluZ3NfLkluaXQoKSk7Ci19Ci0KLVRFU1RfRihTZXR0aW5nc1Rlc3QsIFVuZXhwZWN0ZWRBcmd1bWVudHMyKSB7Ci0gIGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lOjpDaGFyVHlwZSogYXJndltdID0gewotICAgICAgInByb2dyYW0iLCAiLS1jcmVhdGUtaXBjLXNvY2tldD1mb29iYXIiLCAiZm9vYmFyYmF6In07Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0KEFSUkFZX1NJWkUoYXJndiksIGFyZ3YpKTsKLSAgRVhQRUNUX0ZBTFNFKHNldHRpbmdzXy5Jbml0KCkpOwotfQotCi1URVNUX0YoU2V0dGluZ3NUZXN0LCBUb29NYW55SXBjT3B0aW9ucykgewotICBjb25zdCBiYXNlOjpDb21tYW5kTGluZTo6Q2hhclR5cGUqIGFyZ3ZbXSA9IHsKLSAgICAgICJwcm9ncmFtIiwgIi0tY3JlYXRlLWlwYy1zb2NrZXQ9Zm9vYmFyIiwKLSAgICAgICItLWFuZHJvaWQtaXBjLXNvY2tldC1zdWZmaXg9Zm9vYmFyIn07Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0KEFSUkFZX1NJWkUoYXJndiksIGFyZ3YpKTsKLSAgRVhQRUNUX0ZBTFNFKHNldHRpbmdzXy5Jbml0KCkpOwotfQotCi1URVNUX0YoU2V0dGluZ3NUZXN0LCBHb29kQXJndW1lbnRzQ3JlYXRlSXBjKSB7Ci0gIGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lOjpDaGFyVHlwZSogYXJndltdID0geyJwcm9ncmFtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tY3JlYXRlLWlwYy1zb2NrZXQ9Zm9vYmFyIn07Ci0gIEVYUEVDVF9UUlVFKGJhc2U6OkNvbW1hbmRMaW5lOjpJbml0KEFSUkFZX1NJWkUoYXJndiksIGFyZ3YpKTsKLSAgRVhQRUNUX1RSVUUoc2V0dGluZ3NfLkluaXQoKSk7Ci19Ci0KLVRFU1RfRihTZXR0aW5nc1Rlc3QsIEdvb2RBcmd1bWVudHNBbmRyb2lkSXBjKSB7Ci0gIGNvbnN0IGJhc2U6OkNvbW1hbmRMaW5lOjpDaGFyVHlwZSogYXJndltdID0gewotICAgICAgInByb2dyYW0iLCAiLS1hbmRyb2lkLWlwYy1zb2NrZXQtc3VmZml4PWZvb2JhciJ9OwotICBFWFBFQ1RfVFJVRShiYXNlOjpDb21tYW5kTGluZTo6SW5pdChBUlJBWV9TSVpFKGFyZ3YpLCBhcmd2KSk7Ci0gIEVYUEVDVF9UUlVFKHNldHRpbmdzXy5Jbml0KCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2UvdGVzdC9zdHViX2lwY19oYW5kbGVyX2JpbmRlci5jYyBiL3NlcnZpY2UvdGVzdC9zdHViX2lwY19oYW5kbGVyX2JpbmRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiNDUwZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlL3Rlc3Qvc3R1Yl9pcGNfaGFuZGxlcl9iaW5kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLwotLy8gIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotLy8KLS8vICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotLy8KLS8vICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNlcnZpY2UvaXBjL2JpbmRlci9pcGNfaGFuZGxlcl9iaW5kZXIuaCIKLQotLy8gVE9ETyhhcm1hbnNpdG8pOiBUaGlzIGlzIGEgY3JhcHB5IHdvcmthcm91bmQgdG8gbGluayBJUENIYW5kbGVyQmluZGVyIGludG8KLS8vIGhvc3QtbmF0aXZlIHVuaXQgdGVzdHMuIFdlIHNob3VsZCBpbnN0ZWFkIGZpZ3VyZSBvdXQgYSB3YXkgdG8gYnVpbGQgQmluZGVyCi0vLyB1bml0IHRlc3RzIGZvciBob3N0LgotCi1uYW1lc3BhY2UgaXBjIHsKLQotSVBDSGFuZGxlckJpbmRlcjo6SVBDSGFuZGxlckJpbmRlcihibHVldG9vdGg6OkFkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ01hbmFnZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSkKLSAgICA6IElQQ0hhbmRsZXIoYWRhcHRlciwgZGVsZWdhdGUpIHsKLSAgLy8gU3R1YgotfQotCi1JUENIYW5kbGVyQmluZGVyOjp+SVBDSGFuZGxlckJpbmRlcigpIHsKLSAgLy8gU3R1YgotfQotCi1ib29sIElQQ0hhbmRsZXJCaW5kZXI6OlJ1bigpIHsKLSAgLy8gU3R1YgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSVBDSGFuZGxlckJpbmRlcjo6U3RvcCgpIHsKLSAgLy8gU3R1YgotfQotCi12b2lkIElQQ0hhbmRsZXJCaW5kZXI6Ok5vdGlmeVN0YXJ0ZWQoKSB7Ci0gIC8vIFN0dWIKLX0KLQotfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zdGFjay9BbmRyb2lkLmJwIGIvc3RhY2svQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwNzRlYS4uMDAwMDAwMAotLS0gYS9zdGFjay9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNECi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNyeXB0b190b29sYm94X3NyY3MgPSBbCi0gICAgImNyeXB0b190b29sYm94L2Flcy5jYyIsCi0gICAgImNyeXB0b190b29sYm94L2Flc19jbWFjLmNjIiwKLSAgICAiY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guY2MiLAotXQotCi1jY190ZXN0X2xpYnJhcnkgewotICAgIG5hbWU6ICJjcnlwdG9fdG9vbGJveF9mb3JfdGVzdHMiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgIF0sCi0gICAgc3JjczogY3J5cHRvX3Rvb2xib3hfc3JjcwotfQotCi0vLyBCbHVldG9vdGggc3RhY2sgc3RhdGljIGxpYnJhcnkgZm9yIHRhcmdldAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidC1zdGFjayIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAiYXZjdCIsCi0gICAgICAgICJidG0iLAotICAgICAgICAiYXZyYyIsCi0gICAgICAgICJsMmNhcCIsCi0gICAgICAgICJhdmR0IiwKLSAgICAgICAgImVhdHQiLAotICAgICAgICAiZ2F0dCIsCi0gICAgICAgICJnYXAiLAotICAgICAgICAicGFuIiwKLSAgICAgICAgImJuZXAiLAotICAgICAgICAiaGlkIiwKLSAgICAgICAgIm1ldHJpY3MiLAotICAgICAgICAic2RwIiwKLSAgICAgICAgInNtcCIsCi0gICAgICAgICJzcnZjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfaGVhZGVycyIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2FhYy9saWJBQUNlbmMvaW5jbHVkZSIsCi0gICAgICAgICJleHRlcm5hbC9hYWMvbGliQUFDZGVjL2luY2x1ZGUiLAotICAgICAgICAiZXh0ZXJuYWwvYWFjL2xpYlNZUy9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2xpYmxkYWMvaW5jIiwKLSAgICAgICAgImV4dGVybmFsL2xpYmxkYWMvYWJyL2luYyIsCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdm5kL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3ZuZC9ibGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0aWYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3VkcnYvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0YS9zeXMiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2dkL3J1c3Qvc2hpbSIsCi0gICAgXSwKLSAgICBzcmNzOiBjcnlwdG9fdG9vbGJveF9zcmNzICsgWwotICAgICAgICAiYTJkcC9hMmRwX2FhYy5jYyIsCi0gICAgICAgICJhMmRwL2EyZHBfYWFjX2RlY29kZXIuY2MiLAotICAgICAgICAiYTJkcC9hMmRwX2FhY19lbmNvZGVyLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF9hcGkuY2MiLAotICAgICAgICAiYTJkcC9hMmRwX2NvZGVjX2NvbmZpZy5jYyIsCi0gICAgICAgICJhMmRwL2EyZHBfc2JjLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF9zYmNfZGVjb2Rlci5jYyIsCi0gICAgICAgICJhMmRwL2EyZHBfc2JjX2VuY29kZXIuY2MiLAotICAgICAgICAiYTJkcC9hMmRwX3NiY191cF9zYW1wbGUuY2MiLAotICAgICAgICAiYTJkcC9hMmRwX3ZlbmRvci5jYyIsCi0gICAgICAgICJhMmRwL2EyZHBfdmVuZG9yX2FwdHguY2MiLAotICAgICAgICAiYTJkcC9hMmRwX3ZlbmRvcl9hcHR4X2hkLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF92ZW5kb3JfbGRhYy5jYyIsCi0gICAgICAgICJhMmRwL2EyZHBfdmVuZG9yX2xkYWNfYWJyLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyLmNjIiwKLSAgICAgICAgImEyZHAvYTJkcF92ZW5kb3JfbGRhY19lbmNvZGVyLmNjIiwKLSAgICAgICAgImF2Y3QvYXZjdF9hcGkuY2MiLAotICAgICAgICAiYXZjdC9hdmN0X2JjYl9hY3QuY2MiLAotICAgICAgICAiYXZjdC9hdmN0X2NjYi5jYyIsCi0gICAgICAgICJhdmN0L2F2Y3RfbDJjLmNjIiwKLSAgICAgICAgImF2Y3QvYXZjdF9sMmNfYnIuY2MiLAotICAgICAgICAiYXZjdC9hdmN0X2xjYi5jYyIsCi0gICAgICAgICJhdmN0L2F2Y3RfbGNiX2FjdC5jYyIsCi0gICAgICAgICJhdmR0L2F2ZHRfYWQuY2MiLAotICAgICAgICAiYXZkdC9hdmR0X2FwaS5jYyIsCi0gICAgICAgICJhdmR0L2F2ZHRfY2NiLmNjIiwKLSAgICAgICAgImF2ZHQvYXZkdF9jY2JfYWN0LmNjIiwKLSAgICAgICAgImF2ZHQvYXZkdF9sMmMuY2MiLAotICAgICAgICAiYXZkdC9hdmR0X21zZy5jYyIsCi0gICAgICAgICJhdmR0L2F2ZHRfc2NiLmNjIiwKLSAgICAgICAgImF2ZHQvYXZkdF9zY2JfYWN0LmNjIiwKLSAgICAgICAgImF2cmMvYXZyY19hcGkuY2MiLAotICAgICAgICAiYXZyYy9hdnJjX2JsZF9jdC5jYyIsCi0gICAgICAgICJhdnJjL2F2cmNfYmxkX3RnLmNjIiwKLSAgICAgICAgImF2cmMvYXZyY19vcHQuY2MiLAotICAgICAgICAiYXZyYy9hdnJjX3BhcnNfY3QuY2MiLAotICAgICAgICAiYXZyYy9hdnJjX3BhcnNfdGcuY2MiLAotICAgICAgICAiYXZyYy9hdnJjX3NkcC5jYyIsCi0gICAgICAgICJhdnJjL2F2cmNfdXRpbHMuY2MiLAotICAgICAgICAiYm5lcC9ibmVwX2FwaS5jYyIsCi0gICAgICAgICJibmVwL2JuZXBfbWFpbi5jYyIsCi0gICAgICAgICJibmVwL2JuZXBfdXRpbHMuY2MiLAotICAgICAgICAiYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuY2MiLAotICAgICAgICAiYWNsL2FjbC5jYyIsCi0gICAgICAgICJhY2wvYnRtX2FjbC5jYyIsCi0gICAgICAgICJhY2wvYmxlX2FjbC5jYyIsCi0gICAgICAgICJidG0vYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZS5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZV9hZGRyLmNjIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX2Fkdl9maWx0ZXIuY2MiLAotICAgICAgICAiYnRtL2J0bV9ibGVfYmF0Y2hzY2FuLmNjIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX2JnY29ubi5jYyIsCi0gICAgICAgICJhY2wvYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQuY2MiLAotICAgICAgICAiYnRtL2J0bV9ibGVfY29udF9lbmVyZ3kuY2MiLAotICAgICAgICAiYnRtL2J0bV9ibGVfZ2FwLmNjIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX211bHRpX2Fkdi5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZV9wcml2YWN5LmNjIiwKLSAgICAgICAgImJ0bS9idG1fY2xpZW50X2ludGVyZmFjZS5jYyIsCi0gICAgICAgICJidG0vYnRtX2Rldi5jYyIsCi0gICAgICAgICJidG0vYnRtX2RldmN0bC5jYyIsCi0gICAgICAgICJidG0vYnRtX2lucS5jYyIsCi0gICAgICAgICJidG0vYnRtX21haW4uY2MiLAotICAgICAgICAiYWNsL2J0bV9wbS5jYyIsCi0gICAgICAgICJidG0vYnRtX3Njby5jYyIsCi0gICAgICAgICJidG0vYnRtX3Njb19oY2kuY2MiLAotICAgICAgICAiYnRtL2J0bV9pc28uY2MiLAotICAgICAgICAiYnRtL2J0bV9zZWMuY2MiLAotICAgICAgICAiYnRtL2J0bV9zY24uY2MiLAotICAgICAgICAiYnR1L2J0dV9oY2lmLmNjIiwKLSAgICAgICAgImJ0dS9idHVfdGFzay5jYyIsCi0gICAgICAgICJlYXR0L2VhdHQuY2MiLAotICAgICAgICAiZ2FwL2dhcF9ibGUuY2MiLAotICAgICAgICAiZ2FwL2dhcF9jb25uLmNjIiwKLSAgICAgICAgImdhdHQvYXR0X3Byb3RvY29sLmNjIiwKLSAgICAgICAgImdhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF9hcGkuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X2F0dHIuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X2F1dGguY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X2NsLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF9kYi5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfbWFpbi5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfc3IuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X3NyX2hhc2guY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X3V0aWxzLmNjIiwKLSAgICAgICAgImhjaWMvaGNpYmxlY21kcy5jYyIsCi0gICAgICAgICJoY2ljL2hjaWNtZHMuY2MiLAotICAgICAgICAiaGlkL2hpZGhfYXBpLmNjIiwKLSAgICAgICAgImhpZC9oaWRoX2Nvbm4uY2MiLAotICAgICAgICAiaGlkL2hpZGRfYXBpLmNjIiwKLSAgICAgICAgImhpZC9oaWRkX2Nvbm4uY2MiLAotICAgICAgICAibDJjYXAvbDJjX2FwaS5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNfYmxlLmNjIiwKLSAgICAgICAgImwyY2FwL2wyY19jc20uY2MiLAotICAgICAgICAibDJjYXAvbDJjX2Zjci5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNfbGluay5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNfbWFpbi5jYyIsCi0gICAgICAgICJsMmNhcC9sMmNfdXRpbHMuY2MiLAotICAgICAgICAibWV0cmljcy9zdGFja19tZXRyaWNzX2xvZ2dpbmcuY2MiLAotICAgICAgICAicGFuL3Bhbl9hcGkuY2MiLAotICAgICAgICAicGFuL3Bhbl9tYWluLmNjIiwKLSAgICAgICAgInBhbi9wYW5fdXRpbHMuY2MiLAotICAgICAgICAicmZjb21tL3BvcnRfYXBpLmNjIiwKLSAgICAgICAgInJmY29tbS9wb3J0X3JmYy5jYyIsCi0gICAgICAgICJyZmNvbW0vcG9ydF91dGlscy5jYyIsCi0gICAgICAgICJyZmNvbW0vcmZjX2wyY2FwX2lmLmNjIiwKLSAgICAgICAgInJmY29tbS9yZmNfbXhfZnNtLmNjIiwKLSAgICAgICAgInJmY29tbS9yZmNfcG9ydF9mc20uY2MiLAotICAgICAgICAicmZjb21tL3JmY19wb3J0X2lmLmNjIiwKLSAgICAgICAgInJmY29tbS9yZmNfdHNfZnJhbWVzLmNjIiwKLSAgICAgICAgInJmY29tbS9yZmNfdXRpbHMuY2MiLAotICAgICAgICAic2RwL3NkcF9hcGkuY2MiLAotICAgICAgICAic2RwL3NkcF9kYi5jYyIsCi0gICAgICAgICJzZHAvc2RwX2Rpc2NvdmVyeS5jYyIsCi0gICAgICAgICJzZHAvc2RwX21haW4uY2MiLAotICAgICAgICAic2RwL3NkcF9zZXJ2ZXIuY2MiLAotICAgICAgICAic2RwL3NkcF91dGlscy5jYyIsCi0gICAgICAgICJzbXAvcF8yNTZfY3VydmVwYXJhLmNjIiwKLSAgICAgICAgInNtcC9wXzI1Nl9lY2NfcHAuY2MiLAotICAgICAgICAic21wL3BfMjU2X211bHRwcmVjaXNpb24uY2MiLAotICAgICAgICAic21wL3NtcF9hY3QuY2MiLAotICAgICAgICAic21wL3NtcF9hcGkuY2MiLAotICAgICAgICAic21wL3NtcF9icl9tYWluLmNjIiwKLSAgICAgICAgInNtcC9zbXBfa2V5cy5jYyIsCi0gICAgICAgICJzbXAvc21wX2wyYy5jYyIsCi0gICAgICAgICJzbXAvc21wX21haW4uY2MiLAotICAgICAgICAic21wL3NtcF91dGlscy5jYyIsCi0gICAgICAgICJzcnZjL3NydmNfZGlzLmNjIiwKLSAgICAgICAgInNydmMvc3J2Y19lbmcuY2MiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0LWhjaSIsCi0gICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLSAgICByZXF1aXJlZDogWwotICAgICAgICAibGlibGRhY0JUX2VuYyIsCi0gICAgICAgICJsaWJsZGFjQlRfYWJyIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQotCi0vLyBCbHVldG9vdGggc3RhY2sgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2siLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L3N0YWNrX2EyZHBfdGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0L3N0YWNrX2F2cmNwX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYTJkcEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGguYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMSIsCi0gICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLmNvbnRyb2wtVjEtbmRrIiwKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXJfbmRrIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJ0aW55eG1sMiIsCi0gICAgICAgICJsaWJ6IiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtYXVkaW8taGFsLWludGVyZmFjZSIsCi0gICAgICAgICJsaWJibHVldG9vdGgtZHVtcHN5cyIsCi0gICAgICAgICJsaWJidGNvcmUiLAotICAgICAgICAibGliYnQtYnRhIiwKLSAgICAgICAgImxpYmJ0LXN0YWNrIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1zYmMtZGVjb2RlciIsCi0gICAgICAgICJsaWJidC1zYmMtZW5jb2RlciIsCi0gICAgICAgICJsaWJidC11dGlscyIsCi0gICAgICAgICJsaWJidGlmIiwKLSAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAotICAgICAgICAibGliYnQtaGNpIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmc3MjJjb2RlYyIsCi0gICAgICAgICJsaWJsYzNjb2RlYyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlidWRydi11aXBjIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICBdLAotICAgIHdob2xlX3N0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtZm9yLXRlc3RzIiwKLSAgICBdLAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2tfcmZjb21tIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJidG0iLAotICAgICAgICAibDJjYXAiLAotICAgICAgICAic21wIiwKLSAgICAgICAgInJmY29tbSIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbiIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2J0Y29yZS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9oY2kvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6VGVzdENvbW1vbk1vY2tGdW5jdGlvbnMiLAotICAgICAgICAiOlRlc3RNb2NrSGNpIiwKLSAgICAgICAgInJmY29tbS9wb3J0X2FwaS5jYyIsCi0gICAgICAgICJyZmNvbW0vcG9ydF9yZmMuY2MiLAotICAgICAgICAicmZjb21tL3BvcnRfdXRpbHMuY2MiLAotICAgICAgICAicmZjb21tL3JmY19sMmNhcF9pZi5jYyIsCi0gICAgICAgICJyZmNvbW0vcmZjX214X2ZzbS5jYyIsCi0gICAgICAgICJyZmNvbW0vcmZjX3BvcnRfZnNtLmNjIiwKLSAgICAgICAgInJmY29tbS9yZmNfcG9ydF9pZi5jYyIsCi0gICAgICAgICJyZmNvbW0vcmZjX3RzX2ZyYW1lcy5jYyIsCi0gICAgICAgICJyZmNvbW0vcmZjX3V0aWxzLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfYnRtX2xheWVyLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfYnR1X2xheWVyLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfbDJjYXBfbGF5ZXIuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vc3RhY2tfdGVzdF9wYWNrZXRfdXRpbHMuY2MiLAotICAgICAgICAidGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfbWFpbi5jYyIsCi0gICAgICAgICJ0ZXN0L3JmY29tbS9zdGFja19yZmNvbW1fdGVzdF91dGlscy5jYyIsCi0gICAgICAgICJ0ZXN0L3JmY29tbS9zdGFja19yZmNvbW1fdGVzdF91dGlsc190ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IGZhbHNlLAotICAgIH0sCi19Ci0KLS8vIEJsdWV0b290aCBzdGFjayBzbXAgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2tfc21wIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJidG0iLAotICAgICAgICAibDJjYXAiLAotICAgICAgICAic21wIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC91dGlscy9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IGNyeXB0b190b29sYm94X3NyY3MgKyBbCi0gICAgICAgICI6VGVzdENvbW1vbk1haW5IYW5kbGVyIiwKLSAgICAgICAgIjpUZXN0TW9ja0J0aWYiLAotICAgICAgICAiOlRlc3RNb2NrQ29tbW9uIiwKLSAgICAgICAgIjpUZXN0TW9ja0RldmljZSIsCi0gICAgICAgICI6VGVzdE1vY2tMZWdhY3lIY2lDb21tYW5kcyIsCi0gICAgICAgICI6VGVzdE1vY2tNYWluU2hpbSIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0FjbCIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0J0bSIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0wyY2FwIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrTWV0cmljcyIsCi0gICAgICAgICJzbXAvcF8yNTZfY3VydmVwYXJhLmNjIiwKLSAgICAgICAgInNtcC9wXzI1Nl9lY2NfcHAuY2MiLAotICAgICAgICAic21wL3BfMjU2X211bHRwcmVjaXNpb24uY2MiLAotICAgICAgICAic21wL3NtcF9hY3QuY2MiLAotICAgICAgICAic21wL3NtcF9hcGkuY2MiLAotICAgICAgICAic21wL3NtcF9icl9tYWluLmNjIiwKLSAgICAgICAgInNtcC9zbXBfa2V5cy5jYyIsCi0gICAgICAgICJzbXAvc21wX2wyYy5jYyIsCi0gICAgICAgICJzbXAvc21wX21haW4uY2MiLAotICAgICAgICAic21wL3NtcF91dGlscy5jYyIsCi0gICAgICAgICJ0ZXN0L2NyeXB0b190b29sYm94X3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9zdGFja19zbXBfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c0RhdGFTY2hlbWFfaCIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotfQotCi0vLyBCbHVldG9vdGggc3RhY2sgbXVsdGktYWR2ZXJ0aXNpbmcgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2tfbXVsdGlfYWR2IiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJidG0iLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiOlRlc3RNb2NrRGV2aWNlIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX211bHRpX2Fkdi5jYyIsCi0gICAgICAgICJ0ZXN0L2JsZV9hZHZlcnRpc2VyX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQuY29udHJvbC1WMS1uZGsiLAotICAgICAgICAibGliYmluZGVyX25kayIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogZmFsc2UsCi0gICAgfSwKLX0KLQotLy8gQmx1ZXRvb3RoIHN0YWNrIGFkdmVydGlzZSBkYXRhIHBhcnNpbmcgdW5pdCB0ZXN0cyBmb3IgdGFyZ2V0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2tfYWRfcGFyc2VyIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2FkX3BhcnNlcl91bml0dGVzdC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RoLXR5cGVzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJnbW9jayIsCi0gICAgXSwKLX0KLQotLy8gQmx1ZXRvb3RoIHN0YWNrIGNvbm5lY3Rpb24gbXVsdGlwbGV4aW5nCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfZ2F0dF9jb25uX211bHRpcGxleGluZyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAiYnRtIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC91dGlscy9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImdhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmNjIiwKLSAgICAgICAgInRlc3QvZ2F0dF9jb25uZWN0aW9uX21hbmFnZXJfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGgtdHlwZXMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogZmFsc2UsCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X3N0YWNrX2dhdHRfbmF0aXZlIiwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2VhdHQiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9idG0iLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiOlRlc3RNb2NrU3RhY2tCdG0iLAotICAgICAgICAiZ2F0dC9nYXR0X3V0aWxzLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfZWF0dC5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2dhdHRfbGF5ZXIuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19tYWluX3NoaW0uY2MiLAotICAgICAgICAidGVzdC9nYXR0L2dhdHRfc3JfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlib3NpLUFsbG9jYXRpb25UZXN0SGFybmVzcyIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAotICAgIH0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9zdGFja19hdmR0cCIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICB0ZXN0X29wdGlvbnM6IHsKLSAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAotICAgIH0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJsZGFjL2luYyIsCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC91dGlscy9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3Qvc3RhY2tfYXZkdHBfdGVzdC5jYyIsCi0gICAgICAgICJhdmR0L2F2ZHRfYWQuY2MiLAotICAgICAgICAiYXZkdC9hdmR0X2FwaS5jYyIsCi0gICAgICAgICJhdmR0L2F2ZHRfY2NiLmNjIiwKLSAgICAgICAgImF2ZHQvYXZkdF9jY2JfYWN0LmNjIiwKLSAgICAgICAgImF2ZHQvYXZkdF9sMmMuY2MiLAotICAgICAgICAiYXZkdC9hdmR0X3NjYi5jYyIsCi0gICAgICAgICJhdmR0L2F2ZHRfc2NiX2FjdC5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2J0dV9sYXllci5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX3N0YWNrX2F2ZHRfbXNnLmNjIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrTDJjYXAiLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tBY2wiLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tBMmRwIiwKLSAgICAgICAgIjpUZXN0TW9ja0J0YSIsCi0gICAgICAgICI6VGVzdE1vY2tEZXZpY2UiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYm9zaS1BbGxvY2F0aW9uVGVzdEhhcm5lc3MiLAotICAgIF0sCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJib3VuZHMiXSwKLSAgICB9LAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2tfYTJkcF9uYXRpdmUiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgdGVzdF9vcHRpb25zOiB7Ci0gICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKLSAgICB9LAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGlibGRhYy9pbmMiLAotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2EyZHAvYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9hMmRwL21pc2NfZmFrZS5jYyIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlib3NpLUFsbG9jYXRpb25UZXN0SGFybmVzcyIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAotICAgIH0sCi19Ci0KLS8vIGdhdHQgc3IgaGFzaCB0ZXN0Ci1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3Rfc3RhY2tfZ2F0dF9zcl9oYXNoX25hdGl2ZSIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2J0bSIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svZWF0dCIsCi0gICAgICAgICJzeXN0ZW0vYnQvc3RhY2svaW5jbHVkZSIsCi0gICAgICAgICJzeXN0ZW0vYnQvdXRpbHMvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBjcnlwdG9fdG9vbGJveF9zcmNzICsgWwotICAgICAgICAiOlRlc3RNb2NrU3RhY2tCdG0iLAotICAgICAgICAiZ2F0dC9nYXR0X2RiLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF9zcl9oYXNoLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF91dGlscy5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2VhdHQuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19nYXR0X2xheWVyLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfbWFpbl9zaGltLmNjIiwKLSAgICAgICAgInRlc3QvZ2F0dC9tb2NrX2dhdHRfdXRpbHNfcmVmLmNjIiwKLSAgICAgICAgInRlc3Qvc3RhY2tfZ2F0dF9zcl9oYXNoX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlib3NpIiwKLSAgICBdLAotfQotCi0vLyBJc28gbWFuYWdlciB1bml0IHRlc3RzCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfYnRtX2lzbyIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgdGVzdF9vcHRpb25zOiB7Ci0gICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKLSAgICB9LAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJidG0iLAotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbiIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2J0Y29yZS9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImJ0bS9idG1faXNvLmNjIiwKLSAgICAgICAgInRlc3QvYnRtX2lzb190ZXN0LmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2dhdHRfbGF5ZXIuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19oY2ljX2xheWVyLmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIHNjczogdHJ1ZSwKLSAgICAgICAgYWRkcmVzczogdHJ1ZSwKLSAgICAgICAgYWxsX3VuZGVmaW5lZDogdHJ1ZSwKLSAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgdW5kZWZpbmVkIDogdHJ1ZQotICAgICAgICB9LAotICAgIH0sCi19Ci0KLS8vIEVBVFQgdW5pdCB0ZXN0cwotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2VhdHQiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZmx1b3JpZGVfZGVmYXVsdHMiLAotICAgICAgICAiY2xhbmdfY292ZXJhZ2VfYmluIiwKLSAgICBdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJidG0iLAotICAgICAgICAiZWF0dCIsCi0gICAgICAgICJnYXR0IiwKLSAgICAgICAgImwyY2FwIiwKLSAgICAgICAgInRlc3QvY29tbW9uIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczpbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJlYXR0L2VhdHQuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19idG1fYXBpX2xheWVyLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfYnRpZl9zdG9yYWdlLmNjIiwKLSAgICAgICAgInRlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5jYyIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2dhdHRfbGF5ZXIuY2MiLAotICAgICAgICAidGVzdC9jb21tb24vbW9ja19sMmNhcF9sYXllci5jYyIsCi0gICAgICAgICJ0ZXN0L2dhdHQvbW9ja19nYXR0X3V0aWxzX3JlZi5jYyIsCi0gICAgICAgICJ0ZXN0L2VhdHQvZWF0dF90ZXN0LmNjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IGZhbHNlLAotICAgIH0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9zdGFja19idG0iLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHRlc3Rfb3B0aW9uczogewotICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCi0gICAgfSwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJidG0iLAotICAgICAgICAidGVzdC9jb21tb24iLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC92bmQvYmxlIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWREdW1wc3lzRGF0YVNjaGVtYV9oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgXSwKLSAgICBzcmNzOiBjcnlwdG9fdG9vbGJveF9zcmNzICsgWwotICAgICAgICAiOkJsdWV0b290aEJ0YWFTb3VyY2VzX2hvc3QiLAotICAgICAgICAiOkJsdWV0b290aEhhbFNvdXJjZXNfaGNpX2hvc3QiLAotICAgICAgICAiOkJsdWV0b290aE9zU291cmNlc19ob3N0IiwKLSAgICAgICAgIjpUZXN0Q29tbW9uTWFpbkhhbmRsZXIiLAotICAgICAgICAiOlRlc3RNb2NrQnRhIiwKLSAgICAgICAgIjpUZXN0TW9ja0J0aWYiLAotICAgICAgICAiOlRlc3RNb2NrRGV2aWNlIiwKLSAgICAgICAgIjpUZXN0TW9ja0xlZ2FjeUhjaUNvbW1hbmRzIiwKLSAgICAgICAgIjpUZXN0TW9ja01haW5CdGUiLAotICAgICAgICAiOlRlc3RNb2NrTWFpblNoaW0iLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tCdHUiLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tHYXAiLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tHYXR0IiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrTDJjYXAiLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tTbXAiLAotICAgICAgICAiYWNsL2FjbC5jYyIsCi0gICAgICAgICJhY2wvYmxlX2FjbC5jYyIsCi0gICAgICAgICJhY2wvYnRtX2FjbC5jYyIsCi0gICAgICAgICJhY2wvYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQuY2MiLAotICAgICAgICAiYWNsL2J0bV9wbS5jYyIsCi0gICAgICAgICJidG0vYmxlX2FkdmVydGlzZXJfaGNpX2ludGVyZmFjZS5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZS5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZV9hZGRyLmNjIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX2Fkdl9maWx0ZXIuY2MiLAotICAgICAgICAiYnRtL2J0bV9ibGVfYmF0Y2hzY2FuLmNjIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX2JnY29ubi5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZV9jb250X2VuZXJneS5jYyIsCi0gICAgICAgICJidG0vYnRtX2JsZV9nYXAuY2MiLAotICAgICAgICAiYnRtL2J0bV9ibGVfbXVsdGlfYWR2LmNjIiwKLSAgICAgICAgImJ0bS9idG1fYmxlX3ByaXZhY3kuY2MiLAotICAgICAgICAiYnRtL2J0bV9jbGllbnRfaW50ZXJmYWNlLmNjIiwKLSAgICAgICAgImJ0bS9idG1fZGV2LmNjIiwKLSAgICAgICAgImJ0bS9idG1fZGV2Y3RsLmNjIiwKLSAgICAgICAgImJ0bS9idG1faW5xLmNjIiwKLSAgICAgICAgImJ0bS9idG1faXNvLmNjIiwKLSAgICAgICAgImJ0bS9idG1fbWFpbi5jYyIsCi0gICAgICAgICJidG0vYnRtX3Njby5jYyIsCi0gICAgICAgICJidG0vYnRtX3Njb19oY2kuY2MiLAotICAgICAgICAiYnRtL2J0bV9zY24uY2MiLAotICAgICAgICAiYnRtL2J0bV9zZWMuY2MiLAotICAgICAgICAibWV0cmljcy9zdGFja19tZXRyaWNzX2xvZ2dpbmcuY2MiLAotICAgICAgICAidGVzdC9idG0vc3RhY2tfYnRtX3Rlc3QuY2MiLAotICAgICAgICAidGVzdC9idG0vcGVlcl9wYWNrZXRfdHlwZXNfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmJ0LXV0aWxzIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlidWRydi11aXBjIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliZmxhdGJ1ZmZlcnMtY3BwIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGFkZHJlc3M6IHRydWUsCi0gICAgICAgIGFsbF91bmRlZmluZWQ6IHRydWUsCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKLSAgICAgICAgc2NzOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICB1bmRlZmluZWQgOiB0cnVlCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X3N0YWNrX2hjaSIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAiYnRtIiwKLSAgICAgICAgInRlc3QvY29tbW9uIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvdm5kL2JsZSIsCi0gICAgXSwKLSAgICBzcmNzOiBjcnlwdG9fdG9vbGJveF9zcmNzICsgWwotICAgICAgICAidGVzdC9oY2kvc3RhY2tfaGNpX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0LWNvbW1vbiIsCi0gICAgICAgICJsaWJidC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJidGUiLAotICAgICAgICAibGliZ21vY2siLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgICAgICJsaWJidGRldmljZSIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICBdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGFkZHJlc3M6IHRydWUsCi0gICAgICAgIGFsbF91bmRlZmluZWQ6IHRydWUsCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKLSAgICAgICAgc2NzOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICB1bmRlZmluZWQgOiB0cnVlCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X3N0YWNrX2hpZCIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAidGVzdC9jb21tb24iLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICBdLAotICAgIHNyY3M6IGNyeXB0b190b29sYm94X3NyY3MgKyBbCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0wyY2FwIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrU2RwIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrQnRtIiwKLSAgICAgICAgIjpUZXN0U3R1YkxlZ2FjeVRyYWNlIiwKLSAgICAgICAgImhpZC9oaWRkX2FwaS5jYyIsCi0gICAgICAgICJoaWQvaGlkZF9jb25uLmNjIiwKLSAgICAgICAgImhpZC9oaWRoX2FwaS5jYyIsCi0gICAgICAgICJoaWQvaGlkaF9jb25uLmNjIiwKLSAgICAgICAgInRlc3QvaGlkL3N0YWNrX2hpZF90ZXN0LmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYnQtcHJvdG9zLWxpdGUiLAotICAgICAgICAibGliYnRkZXZpY2UiLAotICAgICAgICAibGliYnRlIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBhbGxfdW5kZWZpbmVkOiB0cnVlLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCi0gICAgICAgIHNjczogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgdW5kZWZpbmVkIDogdHJ1ZQotICAgICAgICB9LAotICAgIH0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9zdGFja19idHUiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICAgICAgInRlc3QvY29tbW9uIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkRHVtcHN5c0RhdGFTY2hlbWFfaCIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiOlRlc3RNb2NrQnRhIiwKLSAgICAgICAgIjpUZXN0TW9ja0J0aWYiLAotICAgICAgICAiOlRlc3RNb2NrSGNpIiwKLSAgICAgICAgIjpUZXN0TW9ja0xlZ2FjeUhjaUNvbW1hbmRzIiwKLSAgICAgICAgIjpUZXN0TW9ja01haW5TaGltIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrQWNsIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrQnRtIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrTDJjYXAiLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tNZXRyaWNzIiwKLSAgICAgICAgIjpUZXN0TW9ja1N0YWNrU21wIiwKLSAgICAgICAgImJ0dS9idHVfaGNpZi5jYyIsCi0gICAgICAgICJidHUvYnR1X3Rhc2suY2MiLAotICAgICAgICAidGVzdC9zdGFja19idHVfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlcl9uZGsiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmZsYXRidWZmZXJzLWNwcCIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBhbGxfdW5kZWZpbmVkOiB0cnVlLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCi0gICAgICAgIHNjczogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgdW5kZWZpbmVkIDogdHJ1ZQotICAgICAgICB9LAotICAgIH0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9zdGFja19nYXR0IiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV9kZWZhdWx0cyJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJ0ZXN0L2NvbW1vbiIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZER1bXBzeXNEYXRhU2NoZW1hX2giLAotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpPc2lDb21wYXRTb3VyY2VzIiwKLSAgICAgICAgIjpUZXN0TW9ja0J0YSIsCi0gICAgICAgICI6VGVzdE1vY2tCdGlmIiwKLSAgICAgICAgIjpUZXN0TW9ja0hjaSIsCi0gICAgICAgICI6VGVzdE1vY2tMZWdhY3lIY2lDb21tYW5kcyIsCi0gICAgICAgICI6VGVzdE1vY2tNYWluU2hpbSIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0FjbCIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0J0bSIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja0NyeXB0b3Rvb2xib3giLAotICAgICAgICAiOlRlc3RNb2NrU3RhY2tMMmNhcCIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja1NkcCIsCi0gICAgICAgICI6VGVzdE1vY2tTdGFja1NtcCIsCi0gICAgICAgICJlYXR0L2VhdHQuY2MiLAotICAgICAgICAiZ2F0dC9hdHRfcHJvdG9jb2wuY2MiLAotICAgICAgICAiZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X2FwaS5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfYXR0ci5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfYXV0aC5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfY2wuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X2RiLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF9tYWluLmNjIiwKLSAgICAgICAgImdhdHQvZ2F0dF9zci5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfc3JfaGFzaC5jYyIsCi0gICAgICAgICJnYXR0L2dhdHRfdXRpbHMuY2MiLAotICAgICAgICAidGVzdC9nYXR0L3N0YWNrX2dhdHRfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmdtb2NrIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlcl9uZGsiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmZsYXRidWZmZXJzLWNwcCIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBhbGxfdW5kZWZpbmVkOiB0cnVlLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCi0gICAgICAgIHNjczogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgdW5kZWZpbmVkIDogdHJ1ZQotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9zdGFjay9CVUlMRC5nbiBiL3N0YWNrL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMxYjZiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zdGF0aWNfbGlicmFyeSgiY3J5cHRvX3Rvb2xib3giKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImNyeXB0b190b29sYm94L2Flcy5jYyIsCi0gICAgImNyeXB0b190b29sYm94L2Flc19jbWFjLmNjIiwKLSAgICAiY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWyAiLy9idC8iIF0KLQotICBjb25maWdzICs9IFsgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiBdCi19Ci0KLXNvdXJjZV9zZXQoIm5vbnN0YW5kYXJkX2NvZGVjcyIpIHsKLSAgaWYgKGRlZmluZWQodXNlLmJ0X25vbnN0YW5kYXJkX2NvZGVjcykgJiYgdXNlLmJ0X25vbnN0YW5kYXJkX2NvZGVjcykgewotICAgIHNvdXJjZXMgPSBbCi0gICAgICAiYTJkcC9hMmRwX2FhYy5jYyIsCi0gICAgICAiYTJkcC9hMmRwX2FhY19kZWNvZGVyLmNjIiwKLSAgICAgICJhMmRwL2EyZHBfYWFjX2VuY29kZXIuY2MiLAotICAgICAgImEyZHAvYTJkcF92ZW5kb3IuY2MiLAotICAgICAgImEyZHAvYTJkcF92ZW5kb3JfYXB0eC5jYyIsCi0gICAgICAiYTJkcC9hMmRwX3ZlbmRvcl9hcHR4X2VuY29kZXIuY2MiLAotICAgICAgImEyZHAvYTJkcF92ZW5kb3JfYXB0eF9oZC5jYyIsCi0gICAgICAiYTJkcC9hMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIuY2MiLAotICAgICAgImEyZHAvYTJkcF92ZW5kb3JfbGRhYy5jYyIsCi0gICAgICAiYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2Fici5jYyIsCi0gICAgICAiYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXIuY2MiLAotICAgICAgImEyZHAvYTJkcF92ZW5kb3JfbGRhY19lbmNvZGVyLmNjIiwKLSAgICBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgICAiLy9idCIsCi0gICAgICAiLy9idC9idGEvaW5jbHVkZSIsCi0gICAgICAiLy9idC9idGlmL2luY2x1ZGUiLAotICAgICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAiLy9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICIvL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgIF0KLQotICAgIGRlcHMgPSBbICIvL2J0L2dkL3J1c3Qvc2hpbTppbml0X2ZsYWdzX2JyaWRnZV9oZWFkZXIiIF0KLQotICAgIGNvbmZpZ3MgKz0gWwotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICAgICIvL2J0OmV4dGVybmFsX2xpYmxkYWMiLAotICAgICAgIi8vYnQ6ZXh0ZXJuYWxfYWFjIiwKLSAgICBdCi0gIH0KLX0KLQotc291cmNlX3NldCgic3RhY2siKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImEyZHAvYTJkcF9hcGkuY2MiLAotICAgICJhMmRwL2EyZHBfY29kZWNfY29uZmlnLmNjIiwKLSAgICAiYTJkcC9hMmRwX3NiYy5jYyIsCi0gICAgImEyZHAvYTJkcF9zYmNfZGVjb2Rlci5jYyIsCi0gICAgImEyZHAvYTJkcF9zYmNfZW5jb2Rlci5jYyIsCi0gICAgImEyZHAvYTJkcF9zYmNfdXBfc2FtcGxlLmNjIiwKLSAgICAiYWNsL2FjbC5jYyIsCi0gICAgImFjbC9ibGVfYWNsLmNjIiwKLSAgICAiYWNsL2J0bV9hY2wuY2MiLAotICAgICJhY2wvYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQuY2MiLAotICAgICJhY2wvYnRtX3BtLmNjIiwKLSAgICAiYXZjdC9hdmN0X2FwaS5jYyIsCi0gICAgImF2Y3QvYXZjdF9iY2JfYWN0LmNjIiwKLSAgICAiYXZjdC9hdmN0X2NjYi5jYyIsCi0gICAgImF2Y3QvYXZjdF9sMmMuY2MiLAotICAgICJhdmN0L2F2Y3RfbDJjX2JyLmNjIiwKLSAgICAiYXZjdC9hdmN0X2xjYi5jYyIsCi0gICAgImF2Y3QvYXZjdF9sY2JfYWN0LmNjIiwKLSAgICAiYXZkdC9hdmR0X2FkLmNjIiwKLSAgICAiYXZkdC9hdmR0X2FwaS5jYyIsCi0gICAgImF2ZHQvYXZkdF9jY2IuY2MiLAotICAgICJhdmR0L2F2ZHRfY2NiX2FjdC5jYyIsCi0gICAgImF2ZHQvYXZkdF9sMmMuY2MiLAotICAgICJhdmR0L2F2ZHRfbXNnLmNjIiwKLSAgICAiYXZkdC9hdmR0X3NjYi5jYyIsCi0gICAgImF2ZHQvYXZkdF9zY2JfYWN0LmNjIiwKLSAgICAiYXZyYy9hdnJjX2FwaS5jYyIsCi0gICAgImF2cmMvYXZyY19ibGRfY3QuY2MiLAotICAgICJhdnJjL2F2cmNfYmxkX3RnLmNjIiwKLSAgICAiYXZyYy9hdnJjX29wdC5jYyIsCi0gICAgImF2cmMvYXZyY19wYXJzX2N0LmNjIiwKLSAgICAiYXZyYy9hdnJjX3BhcnNfdGcuY2MiLAotICAgICJhdnJjL2F2cmNfc2RwLmNjIiwKLSAgICAiYXZyYy9hdnJjX3V0aWxzLmNjIiwKLSAgICAiYm5lcC9ibmVwX2FwaS5jYyIsCi0gICAgImJuZXAvYm5lcF9tYWluLmNjIiwKLSAgICAiYm5lcC9ibmVwX3V0aWxzLmNjIiwKLSAgICAiYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuY2MiLAotICAgICJidG0vYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5jYyIsCi0gICAgImJ0bS9idG1fYmxlLmNjIiwKLSAgICAiYnRtL2J0bV9ibGVfYWRkci5jYyIsCi0gICAgImJ0bS9idG1fYmxlX2Fkdl9maWx0ZXIuY2MiLAotICAgICJidG0vYnRtX2JsZV9iYXRjaHNjYW4uY2MiLAotICAgICJidG0vYnRtX2JsZV9iZ2Nvbm4uY2MiLAotICAgICJidG0vYnRtX2JsZV9jb250X2VuZXJneS5jYyIsCi0gICAgImJ0bS9idG1fYmxlX2dhcC5jYyIsCi0gICAgImJ0bS9idG1fYmxlX211bHRpX2Fkdi5jYyIsCi0gICAgImJ0bS9idG1fYmxlX3ByaXZhY3kuY2MiLAotICAgICJidG0vYnRtX2NsaWVudF9pbnRlcmZhY2UuY2MiLAotICAgICJidG0vYnRtX2Rldi5jYyIsCi0gICAgImJ0bS9idG1fZGV2Y3RsLmNjIiwKLSAgICAiYnRtL2J0bV9pbnEuY2MiLAotICAgICJidG0vYnRtX2lzby5jYyIsCi0gICAgImJ0bS9idG1fbWFpbi5jYyIsCi0gICAgImJ0bS9idG1fc2NuLmNjIiwKLSAgICAiYnRtL2J0bV9zY28uY2MiLAotICAgICJidG0vYnRtX3Njb19oY2kuY2MiLAotICAgICJidG0vYnRtX3NlYy5jYyIsCi0gICAgImJ0dS9idHVfaGNpZi5jYyIsCi0gICAgImJ0dS9idHVfdGFzay5jYyIsCi0gICAgImVhdHQvZWF0dC5jYyIsCi0gICAgImdhcC9nYXBfYmxlLmNjIiwKLSAgICAiZ2FwL2dhcF9jb25uLmNjIiwKLSAgICAiZ2F0dC9hdHRfcHJvdG9jb2wuY2MiLAotICAgICJnYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5jYyIsCi0gICAgImdhdHQvZ2F0dF9hcGkuY2MiLAotICAgICJnYXR0L2dhdHRfYXR0ci5jYyIsCi0gICAgImdhdHQvZ2F0dF9hdXRoLmNjIiwKLSAgICAiZ2F0dC9nYXR0X2NsLmNjIiwKLSAgICAiZ2F0dC9nYXR0X2RiLmNjIiwKLSAgICAiZ2F0dC9nYXR0X21haW4uY2MiLAotICAgICJnYXR0L2dhdHRfc3IuY2MiLAotICAgICJnYXR0L2dhdHRfc3JfaGFzaC5jYyIsCi0gICAgImdhdHQvZ2F0dF91dGlscy5jYyIsCi0gICAgImhjaWMvaGNpYmxlY21kcy5jYyIsCi0gICAgImhjaWMvaGNpY21kcy5jYyIsCi0gICAgImhpZC9oaWRkX2FwaS5jYyIsCi0gICAgImhpZC9oaWRkX2Nvbm4uY2MiLAotICAgICJoaWQvaGlkaF9hcGkuY2MiLAotICAgICJoaWQvaGlkaF9jb25uLmNjIiwKLSAgICAibDJjYXAvbDJjX2FwaS5jYyIsCi0gICAgImwyY2FwL2wyY19ibGUuY2MiLAotICAgICJsMmNhcC9sMmNfY3NtLmNjIiwKLSAgICAibDJjYXAvbDJjX2Zjci5jYyIsCi0gICAgImwyY2FwL2wyY19saW5rLmNjIiwKLSAgICAibDJjYXAvbDJjX21haW4uY2MiLAotICAgICJsMmNhcC9sMmNfdXRpbHMuY2MiLAotICAgICJtZXRyaWNzL3N0YWNrX21ldHJpY3NfbG9nZ2luZy5jYyIsCi0gICAgInBhbi9wYW5fYXBpLmNjIiwKLSAgICAicGFuL3Bhbl9tYWluLmNjIiwKLSAgICAicGFuL3Bhbl91dGlscy5jYyIsCi0gICAgInJmY29tbS9wb3J0X2FwaS5jYyIsCi0gICAgInJmY29tbS9wb3J0X3JmYy5jYyIsCi0gICAgInJmY29tbS9wb3J0X3V0aWxzLmNjIiwKLSAgICAicmZjb21tL3JmY19sMmNhcF9pZi5jYyIsCi0gICAgInJmY29tbS9yZmNfbXhfZnNtLmNjIiwKLSAgICAicmZjb21tL3JmY19wb3J0X2ZzbS5jYyIsCi0gICAgInJmY29tbS9yZmNfcG9ydF9pZi5jYyIsCi0gICAgInJmY29tbS9yZmNfdHNfZnJhbWVzLmNjIiwKLSAgICAicmZjb21tL3JmY191dGlscy5jYyIsCi0gICAgInNkcC9zZHBfYXBpLmNjIiwKLSAgICAic2RwL3NkcF9kYi5jYyIsCi0gICAgInNkcC9zZHBfZGlzY292ZXJ5LmNjIiwKLSAgICAic2RwL3NkcF9tYWluLmNjIiwKLSAgICAic2RwL3NkcF9zZXJ2ZXIuY2MiLAotICAgICJzZHAvc2RwX3V0aWxzLmNjIiwKLSAgICAic21wL3BfMjU2X2N1cnZlcGFyYS5jYyIsCi0gICAgInNtcC9wXzI1Nl9lY2NfcHAuY2MiLAotICAgICJzbXAvcF8yNTZfbXVsdHByZWNpc2lvbi5jYyIsCi0gICAgInNtcC9zbXBfYWN0LmNjIiwKLSAgICAic21wL3NtcF9hcGkuY2MiLAotICAgICJzbXAvc21wX2JyX21haW4uY2MiLAotICAgICJzbXAvc21wX2tleXMuY2MiLAotICAgICJzbXAvc21wX2wyYy5jYyIsCi0gICAgInNtcC9zbXBfbWFpbi5jYyIsCi0gICAgInNtcC9zbXBfdXRpbHMuY2MiLAotICAgICJzcnZjL3NydmNfZGlzLmNjIiwKLSAgICAic3J2Yy9zcnZjX2VuZy5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi4iLAotICAgICJpbmNsdWRlIiwKLSAgICAiYXZjdCIsCi0gICAgImJ0bSIsCi0gICAgImF2cmMiLAotICAgICJsMmNhcCIsCi0gICAgImF2ZHQiLAotICAgICJnYXR0IiwKLSAgICAiZ2FwIiwKLSAgICAicGFuIiwKLSAgICAiYm5lcCIsCi0gICAgImVhdHQiLAotICAgICJoaWQiLAotICAgICJtZXRyaWNzIiwKLSAgICAic2RwIiwKLSAgICAic21wIiwKLSAgICAic3J2YyIsCi0gICAgIi8vYnQvdHlwZXMiLAotICAgICIvL2J0L2xpbnV4X2luY2x1ZGUiLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L2J0Y29yZS9pbmNsdWRlIiwKLSAgICAiLy9idC92bmQvaW5jbHVkZSIsCi0gICAgIi8vYnQvdm5kL2JsZSIsCi0gICAgIi8vYnQvYnRpZi9pbmNsdWRlIiwKLSAgICAiLy9idC9oY2kvaW5jbHVkZSIsCi0gICAgIi8vYnQvdWRydi9pbmNsdWRlIiwKLSAgICAiLy9idC9ycGMvaW5jbHVkZSIsCi0gICAgIi8vYnQvaGNpcyIsCi0gICAgIi8vYnQvY3RybHIvaW5jbHVkZSIsCi0gICAgIi8vYnQvYnRhL2luY2x1ZGUiLAotICAgICIvL2J0L2J0YS9zeXMiLAotICAgICIvL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICIvL2J0LyIsCi0gIF0KLQotICBkZXBzID0gWwotICAgICI6Y3J5cHRvX3Rvb2xib3giLAotICAgICI6bm9uc3RhbmRhcmRfY29kZWNzIiwKLSAgICAiLy9idDpsaWJidC1wbGF0Zm9ybS1wcm90b3MtbGl0ZSIsCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgIi8vYnQvdHlwZXMiLAotICAgICIvL2J0L3R5cGVzIiwKLSAgXQotCi0gIGNvbmZpZ3MgKz0gWyAiLy9idDp0YXJnZXRfZGVmYXVsdHMiIF0KLX0KLQotaWYgKHVzZS50ZXN0KSB7Ci0gIGV4ZWN1dGFibGUoIm5ldF90ZXN0X2J0bV9pc28iKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICJidG0vYnRtX2lzby5jYyIsCi0gICAgICAidGVzdC9idG1faXNvX3Rlc3QuY2MiLAotICAgICAgInRlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5jYyIsCi0gICAgICAidGVzdC9jb21tb24vbW9ja19nYXR0X2xheWVyLmNjIiwKLSAgICAgICJ0ZXN0L2NvbW1vbi9tb2NrX2hjaWNfbGF5ZXIuY2MiLAotICAgIF0KLQotICAgIGluY2x1ZGVfZGlycyA9IFsKLSAgICAgICJidG0iLAotICAgICAgImluY2x1ZGUiLAotICAgICAgInRlc3QvY29tbW9uIiwKLSAgICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgIi8vYnQvcGFja2V0L3Rlc3RzIiwKLSAgICBdCi0KLSAgICBkZXBzID0gWwotICAgICAgIi8vYnQvY29tbW9uIiwKLSAgICAgICIvL2J0L29zaSIsCi0gICAgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9nbW9ja19tYWluIiwKLSAgICAgICIvL2J0OnRhcmdldF9kZWZhdWx0cyIsCi0gICAgXQotICB9Ci19Ci0KLWlmIChkZWZpbmVkKHVzZS5hbmRyb2lkKSAmJiB1c2UuYW5kcm9pZCkgewotICBleGVjdXRhYmxlKCJzdGFja191bml0dGVzdHMiKSB7Ci0gICAgc291cmNlcyA9IFsKLSAgICAgICJ0ZXN0L3N0YWNrX2EyZHBfdGVzdC5jYyIsCi0gICAgICAidGVzdC9zdGFja19hdnJjcF90ZXN0LmNjIiwKLSAgICBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgICAiaW5jbHVkZSIsCi0gICAgICAiLy9idC8iLAotICAgICAgIi8vYnQvYnRhL2VhdHQiLAotICAgICAgIi8vYnQvYnRhL2luY2x1ZGUiLAotICAgICAgIi8vYnQvYnRhL3N5cyIsCi0gICAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAiLy9idC9lbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZSIsCi0gICAgICAiLy9idC9oY2kvaW5jbHVkZSIsCi0gICAgICAiLy9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICIvL2J0L3N0YWNrL2EyZHAiLAotICAgICAgIi8vYnQvc3RhY2svYnRtIiwKLSAgICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICAgIi8vYnQvdWRydi9pbmNsdWRlIiwKLSAgICAgICIvL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgIi8vYnQvdm5kL2luY2x1ZGUiLAotICAgIF0KLQotICAgIGxpYnMgPSBbCi0gICAgICAiZGwiLAotICAgICAgInB0aHJlYWQiLAotICAgICAgInJlc29sdiIsCi0gICAgICAicnQiLAotICAgICAgInoiLAotICAgIF0KLQotICAgIGRlcHMgPSBbCi0gICAgICAiOnN0YWNrIiwKLSAgICAgICIvL2J0L2J0Y29yZSIsCi0gICAgICAiLy9idC9kZXZpY2UiLAotICAgICAgIi8vYnQvZW1iZHJ2L2c3MjIiLAotICAgICAgIi8vYnQvZW1iZHJ2L3NiYyIsCi0gICAgICAiLy9idC9oY2kiLAotICAgICAgIi8vYnQvbWFpbjpibHVldG9vdGgiLAotICAgICAgIi8vYnQvb3NpIiwKLSAgICAgICIvL2J0L3R5cGVzIiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICIvL2J0OmV4dGVybmFsX3Rpbnl4bWwyIiwKLSAgICAgICIvL2J0OmV4dGVybmFsX2dtb2NrX21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0gIH0KLQotICBleGVjdXRhYmxlKCJuZXRfdGVzdF9zdGFja19jcnlwdG9fdG9vbGJveCIpIHsKLSAgICBzb3VyY2VzID0gWyAidGVzdC9jcnlwdG9fdG9vbGJveF90ZXN0LmNjIiBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbICIvL2J0LyIgXQotCi0gICAgZGVwcyA9IFsgIjpjcnlwdG9fdG9vbGJveCIgXQotCi0gICAgY29uZmlncyArPSBbCi0gICAgICAiLy9idDpleHRlcm5hbF9nbW9ja19tYWluIiwKLSAgICAgICIvL2J0OnRhcmdldF9kZWZhdWx0cyIsCi0gICAgXQotICB9Ci0KLSAgZXhlY3V0YWJsZSgibmV0X3Rlc3Rfc3RhY2tfc21wIikgewotICAgIHNvdXJjZXMgPSBbCi0gICAgICAic21wL3BfMjU2X2N1cnZlcGFyYS5jYyIsCi0gICAgICAic21wL3BfMjU2X2VjY19wcC5jYyIsCi0gICAgICAic21wL3BfMjU2X211bHRwcmVjaXNpb24uY2MiLAotICAgICAgInNtcC9zbXBfYXBpLmNjIiwKLSAgICAgICJzbXAvc21wX2tleXMuY2MiLAotICAgICAgInNtcC9zbXBfbWFpbi5jYyIsCi0gICAgICAic21wL3NtcF91dGlscy5jYyIsCi0gICAgICAidGVzdC9zdGFja19zbXBfdGVzdC5jYyIsCi0gICAgXQotCi0gICAgaW5jbHVkZV9kaXJzID0gWwotICAgICAgIi8vYnQvIiwKLSAgICAgICIvL2J0L2xpbnV4X2luY2x1ZGUiLAotICAgICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAiLy9idC9idGNvcmUvaW5jbHVkZSIsCi0gICAgICAiLy9idC9oY2kvaW5jbHVkZSIsCi0gICAgICAiLy9idC91dGlscy9pbmNsdWRlIiwKLSAgICAgICIvL2J0L2J0YS9pbmNsdWRlIiwKLSAgICAgICIvL2J0L2J0YS9zeXMiLAotICAgICAgIi8vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgIi8vYnQvZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUiLAotICAgICAgIi8vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAiLy9idC9zdGFjay9hMmRwIiwKLSAgICAgICIvL2J0L3N0YWNrL2wyY2FwIiwKLSAgICAgICIvL2J0L3N0YWNrL2J0bSIsCi0gICAgICAiLy9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICIvL2J0L3VkcnYvaW5jbHVkZSIsCi0gICAgICAiLy9idC91dGlscy9pbmNsdWRlIiwKLSAgICAgICIvL2J0L3ZuZC9pbmNsdWRlIiwKLSAgICBdCi0KLSAgICBsaWJzID0gWwotICAgICAgImRsIiwKLSAgICAgICJwdGhyZWFkIiwKLSAgICAgICJyZXNvbHYiLAotICAgICAgInJ0IiwKLSAgICAgICJ6IiwKLSAgICBdCi0KLSAgICBkZXBzID0gWwotICAgICAgIjpjcnlwdG9fdG9vbGJveCIsCi0gICAgICAiLy9idC9vc2kiLAotICAgICAgIi8vYnQvdHlwZXMiLAotICAgIF0KLQotICAgIGNvbmZpZ3MgKz0gWwotICAgICAgIi8vYnQ6ZXh0ZXJuYWxfdGlueXhtbDIiLAotICAgICAgIi8vYnQ6ZXh0ZXJuYWxfZ21vY2tfbWFpbiIsCi0gICAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICAgIF0KLSAgfQotCi0gIGV4ZWN1dGFibGUoIm5ldF90ZXN0X3N0YWNrX211bHRpX2FkdiIpIHsKLSAgICBzb3VyY2VzID0gWwotICAgICAgImJ0bS9idG1fYmxlX211bHRpX2Fkdi5jYyIsCi0gICAgICAidGVzdC9ibGVfYWR2ZXJ0aXNlcl90ZXN0LmNjIiwKLSAgICBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgICAiaW5jbHVkZSIsCi0gICAgICAiLy9idC8iLAotICAgICAgIi8vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgIi8vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgIi8vYnQvaW50ZXJuYWxfaW5jbHVkZSIsCi0gICAgICAiLy9idC9zdGFjay9idG0iLAotICAgIF0KLQotICAgIGxpYnMgPSBbCi0gICAgICAiZGwiLAotICAgICAgInB0aHJlYWQiLAotICAgICAgInJlc29sdiIsCi0gICAgICAicnQiLAotICAgICAgInoiLAotICAgIF0KLQotICAgIGRlcHMgPSBbICIvL2J0L3R5cGVzIiBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICIvL2J0OmV4dGVybmFsX2dtb2NrX21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF9hYWMuY2MgYi9zdGFjay9hMmRwL2EyZHBfYWFjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U5Y2I0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF9hYWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVXRpbGl0eSBmdW5jdGlvbnMgdG8gaGVscCBidWlsZCBhbmQgcGFyc2UgdGhlIEFBQyBDb2RlYyBJbmZvcm1hdGlvbgotICogIEVsZW1lbnQgYW5kIE1lZGlhIFBheWxvYWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX2FhYyIKLQotI2luY2x1ZGUgImEyZHBfYWFjLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfYWFjX2RlY29kZXIuaCIKLSNpbmNsdWRlICJhMmRwX2FhY19lbmNvZGVyLmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotI2RlZmluZSBBMkRQX0FBQ19ERUZBVUxUX0JJVFJBVEUgMzIwMDAwICAvLyAzMjAga2JwcwotI2RlZmluZSBBMkRQX0FBQ19NSU5fQklUUkFURSA2NDAwMCAgICAgICAvLyA2NCBrYnBzCi0KLS8vIGRhdGEgdHlwZSBmb3IgdGhlIEFBQyBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50ICovCi0vLyBOT1RFOiBiaXRzX3Blcl9zYW1wbGUgaXMgbmVlZGVkIG9ubHkgZm9yIEFBQyBlbmNvZGVyIGluaXRpYWxpemF0aW9uLgotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG9iamVjdFR5cGU7ICAgICAgICAgICAgIC8qIE9iamVjdCBUeXBlICovCi0gIHVpbnQxNl90IHNhbXBsZVJhdGU7ICAgICAgICAgICAgLyogU2FtcGxpbmcgRnJlcXVlbmN5ICovCi0gIHVpbnQ4X3QgY2hhbm5lbE1vZGU7ICAgICAgICAgICAgLyogU1RFUkVPL01PTk8gKi8KLSAgdWludDhfdCB2YXJpYWJsZUJpdFJhdGVTdXBwb3J0OyAvKiBWYXJpYWJsZSBCaXQgUmF0ZSBTdXBwb3J0Ki8KLSAgdWludDMyX3QgYml0UmF0ZTsgICAgICAgICAgICAgICAvKiBCaXQgcmF0ZSAqLwotICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgYml0c19wZXJfc2FtcGxlOwotfSB0QTJEUF9BQUNfQ0lFOwotCi1zdGF0aWMgYm9vbCBhYWNfc291cmNlX2NhcHNfY29uZmlndXJlZCA9IGZhbHNlOwotc3RhdGljIHRBMkRQX0FBQ19DSUUgYTJkcF9hYWNfc291cmNlX2NhcHMgPSB7fTsKLQotLyogQUFDIFNvdXJjZSBjb2RlYyBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBjb25zdCB0QTJEUF9BQUNfQ0lFIGEyZHBfYWFjX2Nicl9zb3VyY2VfY2FwcyA9IHsKLSAgICAvLyBvYmplY3RUeXBlCi0gICAgQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzJfTEMsCi0gICAgLy8gc2FtcGxlUmF0ZQotICAgIC8vIFRPRE86IEFBQyA0OC4wa0h6IHNhbXBsaW5nIHJhdGUgc2hvdWxkIGJlIGFkZGVkIGJhY2sgLSBzZWUgYi82MjMwMTM3NgotICAgIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDQxMDAsCi0gICAgLy8gY2hhbm5lbE1vZGUKLSAgICBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPLAotICAgIC8vIHZhcmlhYmxlQml0UmF0ZVN1cHBvcnQKLSAgICBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9ESVNBQkxFRCwKLSAgICAvLyBiaXRSYXRlCi0gICAgQTJEUF9BQUNfREVGQVVMVF9CSVRSQVRFLAotICAgIC8vIGJpdHNfcGVyX3NhbXBsZQotICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTZ9OwotCi0vKiBBQUMgU291cmNlIGNvZGVjIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGNvbnN0IHRBMkRQX0FBQ19DSUUgYTJkcF9hYWNfdmJyX3NvdXJjZV9jYXBzID0gewotICAgIC8vIG9iamVjdFR5cGUKLSAgICBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQywKLSAgICAvLyBzYW1wbGVSYXRlCi0gICAgLy8gVE9ETzogQUFDIDQ4LjBrSHogc2FtcGxpbmcgcmF0ZSBzaG91bGQgYmUgYWRkZWQgYmFjayAtIHNlZSBiLzYyMzAxMzc2Ci0gICAgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCwKLSAgICAvLyBjaGFubmVsTW9kZQotICAgIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU8sCi0gICAgLy8gdmFyaWFibGVCaXRSYXRlU3VwcG9ydAotICAgIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0VOQUJMRUQsCi0gICAgLy8gYml0UmF0ZQotICAgIEEyRFBfQUFDX0RFRkFVTFRfQklUUkFURSwKLSAgICAvLyBiaXRzX3Blcl9zYW1wbGUKLSAgICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2fTsKLQotLyogQUFDIFNpbmsgY29kZWMgY2FwYWJpbGl0aWVzICovCi1zdGF0aWMgY29uc3QgdEEyRFBfQUFDX0NJRSBhMmRwX2FhY19zaW5rX2NhcHMgPSB7Ci0gICAgLy8gb2JqZWN0VHlwZQotICAgIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUcyX0xDLAotICAgIC8vIHNhbXBsZVJhdGUKLSAgICBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwIHwgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80ODAwMCwKLSAgICAvLyBjaGFubmVsTW9kZQotICAgIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NT05PIHwgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTywKLSAgICAvLyB2YXJpYWJsZUJpdFJhdGVTdXBwb3J0Ci0gICAgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRU5BQkxFRCwKLSAgICAvLyBiaXRSYXRlCi0gICAgQTJEUF9BQUNfREVGQVVMVF9CSVRSQVRFLAotICAgIC8vIGJpdHNfcGVyX3NhbXBsZQotICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTZ9OwotCi0vKiBEZWZhdWx0IEFBQyBjb2RlYyBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgY29uc3QgdEEyRFBfQUFDX0NJRSBhMmRwX2FhY19kZWZhdWx0X2NvbmZpZyA9IHsKLSAgICBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQywgICAgICAgIC8vIG9iamVjdFR5cGUKLSAgICBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwLCAgICAgICAgIC8vIHNhbXBsZVJhdGUKLSAgICBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPLCAgICAgICAgIC8vIGNoYW5uZWxNb2RlCi0gICAgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRElTQUJMRUQsICAvLyB2YXJpYWJsZUJpdFJhdGVTdXBwb3J0Ci0gICAgQTJEUF9BQUNfREVGQVVMVF9CSVRSQVRFLCAgICAgICAgICAgICAvLyBiaXRSYXRlCi0gICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNiAgICAvLyBiaXRzX3Blcl9zYW1wbGUKLX07Ci0KLXN0YXRpYyBjb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSBhMmRwX2VuY29kZXJfaW50ZXJmYWNlX2FhYyA9IHsKLSAgICBhMmRwX2FhY19lbmNvZGVyX2luaXQsCi0gICAgYTJkcF9hYWNfZW5jb2Rlcl9jbGVhbnVwLAotICAgIGEyZHBfYWFjX2ZlZWRpbmdfcmVzZXQsCi0gICAgYTJkcF9hYWNfZmVlZGluZ19mbHVzaCwKLSAgICBhMmRwX2FhY19nZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcywKLSAgICBhMmRwX2FhY19nZXRfZWZmZWN0aXZlX2ZyYW1lX3NpemUsCi0gICAgYTJkcF9hYWNfc2VuZF9mcmFtZXMsCi0gICAgbnVsbHB0ciAgLy8gc2V0X3RyYW5zbWl0X3F1ZXVlX2xlbmd0aAotfTsKLQotc3RhdGljIGNvbnN0IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFIGEyZHBfZGVjb2Rlcl9pbnRlcmZhY2VfYWFjID0gewotICAgIGEyZHBfYWFjX2RlY29kZXJfaW5pdCwKLSAgICBhMmRwX2FhY19kZWNvZGVyX2NsZWFudXAsCi0gICAgYTJkcF9hYWNfZGVjb2Rlcl9kZWNvZGVfcGFja2V0LAotICAgIG51bGxwdHIsICAvLyBkZWNvZGVyX3N0YXJ0Ci0gICAgbnVsbHB0ciwgIC8vIGRlY29kZXJfc3VzcGVuZAotICAgIG51bGxwdHIsICAvLyBkZWNvZGVyX2NvbmZpZ3VyZQotfTsKLQotVU5VU0VEX0FUVFIgc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5QWFjKAotICAgIGNvbnN0IHRBMkRQX0FBQ19DSUUqIHBfY2FwLCBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgYm9vbCBpc19jYXBhYmlsaXR5KTsKLQotLy8gQnVpbGRzIHRoZSBBQUMgTWVkaWEgQ29kZWMgQ2FwYWJpbGl0aWVzIGJ5dGUgc2VxdWVuY2UgYmVnaW5uaW5nIGZyb20gdGhlCi0vLyBMT1NDIG9jdGV0LiB8bWVkaWFfdHlwZXwgaXMgdGhlIG1lZGlhIHR5cGUgfEFWRFRfTUVESUFfVFlQRV8qfC4KLS8vIHxwX2llfCBpcyBhIHBvaW50ZXIgdG8gdGhlIEFBQyBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50IGluZm9ybWF0aW9uLgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fC4gUmV0dXJucyBBMkRQX1NVQ0NFU1Mgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB0aGUgY29ycmVzcG9uZGluZyBBMkRQIGVycm9yIHN0YXR1cyBjb2RlLgotc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0J1aWxkSW5mb0FhYyh1aW50OF90IG1lZGlhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBMkRQX0FBQ19DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0KSB7Ci0gIGlmIChwX2llID09IE5VTEwgfHwgcF9yZXN1bHQgPT0gTlVMTCkgewotICAgIHJldHVybiBBMkRQX0lOVkFMSURfUEFSQU1TOwotICB9Ci0KLSAgKnBfcmVzdWx0KysgPSBBMkRQX0FBQ19DT0RFQ19MRU47Ci0gICpwX3Jlc3VsdCsrID0gKG1lZGlhX3R5cGUgPDwgNCk7Ci0gICpwX3Jlc3VsdCsrID0gQTJEUF9NRURJQV9DVF9BQUM7Ci0KLSAgLy8gT2JqZWN0IFR5cGUKLSAgaWYgKHBfaWUtPm9iamVjdFR5cGUgPT0gMCkgcmV0dXJuIEEyRFBfSU5WQUxJRF9QQVJBTVM7Ci0gICpwX3Jlc3VsdCsrID0gcF9pZS0+b2JqZWN0VHlwZTsKLQotICAvLyBTYW1wbGluZyBGcmVxdWVuY3kKLSAgaWYgKHBfaWUtPnNhbXBsZVJhdGUgPT0gMCkgcmV0dXJuIEEyRFBfSU5WQUxJRF9QQVJBTVM7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKHBfaWUtPnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRX01BU0swKTsKLSAgKnBfcmVzdWx0ID0gKHVpbnQ4X3QpKChwX2llLT5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV9NQVNLMSkgPj4gOCk7Ci0KLSAgLy8gQ2hhbm5lbCBNb2RlCi0gIGlmIChwX2llLT5jaGFubmVsTW9kZSA9PSAwKSByZXR1cm4gQTJEUF9JTlZBTElEX1BBUkFNUzsKLSAgKnBfcmVzdWx0KysgfD0gKHBfaWUtPmNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01BU0spOwotCi0gIC8vIFZhcmlhYmxlIEJpdCBSYXRlIFN1cHBvcnQKLSAgKnBfcmVzdWx0ID0gKHBfaWUtPnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgJiBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9NQVNLKTsKLQotICAvLyBCaXQgUmF0ZQotICAqcF9yZXN1bHQrKyB8PSAodWludDhfdCkoKHBfaWUtPmJpdFJhdGUgJiBBMkRQX0FBQ19CSVRfUkFURV9NQVNLMCkgPj4gMTYpOwotICAqcF9yZXN1bHQrKyA9ICh1aW50OF90KSgocF9pZS0+Yml0UmF0ZSAmIEEyRFBfQUFDX0JJVF9SQVRFX01BU0sxKSA+PiA4KTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkocF9pZS0+Yml0UmF0ZSAmIEEyRFBfQUFDX0JJVF9SQVRFX01BU0syKTsKLQotICByZXR1cm4gQTJEUF9TVUNDRVNTOwotfQotCi0vLyBQYXJzZXMgdGhlIEFBQyBNZWRpYSBDb2RlYyBDYXBhYmlsaXRpZXMgYnl0ZSBzZXF1ZW5jZSBiZWdpbm5pbmcgZnJvbSB0aGUKLS8vIExPU0Mgb2N0ZXQuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX2llfC4gVGhlIGJ5dGUgc2VxdWVuY2UgdG8gcGFyc2UgaXMKLS8vIHxwX2NvZGVjX2luZm98LiBJZiB8aXNfY2FwYWJpbGl0eXwgaXMgdHJ1ZSwgdGhlIGJ5dGUgc2VxdWVuY2UgaXMKLS8vIGNvZGVjIGNhcGFiaWxpdGllcywgb3RoZXJ3aXNlIGlzIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0vLyBSZXR1cm5zIEEyRFBfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgQTJEUCBlcnJvcgotLy8gc3RhdHVzIGNvZGUuCi1zdGF0aWMgdEEyRFBfU1RBVFVTIEEyRFBfUGFyc2VJbmZvQWFjKHRBMkRQX0FBQ19DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5KSB7Ci0gIHVpbnQ4X3QgbG9zYzsKLSAgdWludDhfdCBtZWRpYV90eXBlOwotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGU7Ci0KLSAgaWYgKHBfaWUgPT0gTlVMTCB8fCBwX2NvZGVjX2luZm8gPT0gTlVMTCkgcmV0dXJuIEEyRFBfSU5WQUxJRF9QQVJBTVM7Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNhcGFiaWxpdHkgbGVuZ3RoCi0gIGxvc2MgPSAqcF9jb2RlY19pbmZvKys7Ci0gIGlmIChsb3NjICE9IEEyRFBfQUFDX0NPREVDX0xFTikgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0KLSAgbWVkaWFfdHlwZSA9ICgqcF9jb2RlY19pbmZvKyspID4+IDQ7Ci0gIGNvZGVjX3R5cGUgPSAqcF9jb2RlY19pbmZvKys7Ci0gIC8qIENoZWNrIHRoZSBNZWRpYSBUeXBlIGFuZCBNZWRpYSBDb2RlYyBUeXBlICovCi0gIGlmIChtZWRpYV90eXBlICE9IEFWRFRfTUVESUFfVFlQRV9BVURJTyB8fCBjb2RlY190eXBlICE9IEEyRFBfTUVESUFfQ1RfQUFDKSB7Ci0gICAgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0gIH0KLQotICBwX2llLT5vYmplY3RUeXBlID0gKnBfY29kZWNfaW5mbysrOwotICBwX2llLT5zYW1wbGVSYXRlID0gKCpwX2NvZGVjX2luZm8gJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRX01BU0swKSB8Ci0gICAgICAgICAgICAgICAgICAgICAoKihwX2NvZGVjX2luZm8gKyAxKSA8PCA4ICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV9NQVNLMSk7Ci0gIHBfY29kZWNfaW5mbysrOwotICBwX2llLT5jaGFubmVsTW9kZSA9ICpwX2NvZGVjX2luZm8gJiBBMkRQX0FBQ19DSEFOTkVMX01PREVfTUFTSzsKLSAgcF9jb2RlY19pbmZvKys7Ci0KLSAgcF9pZS0+dmFyaWFibGVCaXRSYXRlU3VwcG9ydCA9Ci0gICAgICAqcF9jb2RlY19pbmZvICYgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfTUFTSzsKLQotICBwX2llLT5iaXRSYXRlID0gKCgqcF9jb2RlY19pbmZvKSA8PCAxNiAmIEEyRFBfQUFDX0JJVF9SQVRFX01BU0swKSB8Ci0gICAgICAgICAgICAgICAgICAoKihwX2NvZGVjX2luZm8gKyAxKSA8PCA4ICYgQTJEUF9BQUNfQklUX1JBVEVfTUFTSzEpIHwKLSAgICAgICAgICAgICAgICAgICgqKHBfY29kZWNfaW5mbyArIDIpICYgQTJEUF9BQUNfQklUX1JBVEVfTUFTSzIpOwotICBwX2NvZGVjX2luZm8gKz0gMzsKLQotICBpZiAoaXNfY2FwYWJpbGl0eSkgewotICAgIC8vIE5PVEU6IFRoZSBjaGVja3MgaGVyZSBhcmUgdmVyeSBsaWJlcmFsLiBXZSBzaG91bGQgYmUgdXNpbmcgbW9yZQotICAgIC8vIHBlZGFudGljIGNoZWNrcyBzcGVjaWZpYyB0byB0aGUgU1JDIG9yIFNOSyBhcyBzcGVjaWZpZWQgaW4gdGhlIHNwZWMuCi0gICAgaWYgKEEyRFBfQml0c1NldChwX2llLT5vYmplY3RUeXBlKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9PQkpfVFlQRTsKLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPnNhbXBsZVJhdGUpID09IEEyRFBfU0VUX1pFUk9fQklUKQotICAgICAgcmV0dXJuIEEyRFBfQkFEX1NBTVBfRlJFUTsKLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gICAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLSAgfQotCi0gIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+b2JqZWN0VHlwZSkgIT0gQTJEUF9TRVRfT05FX0JJVCkKLSAgICByZXR1cm4gQTJEUF9CQURfT0JKX1RZUEU7Ci0gIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+c2FtcGxlUmF0ZSkgIT0gQTJEUF9TRVRfT05FX0JJVCkKLSAgICByZXR1cm4gQTJEUF9CQURfU0FNUF9GUkVROwotICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSAhPSBBMkRQX1NFVF9PTkVfQklUKQotICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWRBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FBQ19DSUUgY2ZnX2NpZTsKLQotICAvKiBVc2UgYSBsaWJlcmFsIGNoZWNrIHdoZW4gcGFyc2luZyB0aGUgY29kZWMgaW5mbyAqLwotICByZXR1cm4gKEEyRFBfUGFyc2VJbmZvQWFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9BYWMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotYm9vbCBBMkRQX0lzU2lua0NvZGVjVmFsaWRBYWMoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FBQ19DSUUgY2ZnX2NpZTsKLQotICAvKiBVc2UgYSBsaWJlcmFsIGNoZWNrIHdoZW4gcGFyc2luZyB0aGUgY29kZWMgaW5mbyAqLwotICByZXR1cm4gKEEyRFBfUGFyc2VJbmZvQWFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9BYWMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotYm9vbCBBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWRBYWMoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FBQ19DSUUgY2ZnX2NpZTsKLQotICAvKiBVc2UgYSBsaWJlcmFsIGNoZWNrIHdoZW4gcGFyc2luZyB0aGUgY29kZWMgaW5mbyAqLwotICByZXR1cm4gKEEyRFBfUGFyc2VJbmZvQWFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9BYWMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotYm9vbCBBMkRQX0lzUGVlclNpbmtDb2RlY1ZhbGlkQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BQUNfQ0lFIGNmZ19jaWU7Ci0KLSAgLyogVXNlIGEgbGliZXJhbCBjaGVjayB3aGVuIHBhcnNpbmcgdGhlIGNvZGVjIGluZm8gKi8KLSAgcmV0dXJuIChBMkRQX1BhcnNlSW5mb0FhYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSkgPT0gQTJEUF9TVUNDRVNTKSB8fAotICAgICAgICAgKEEyRFBfUGFyc2VJbmZvQWFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQTJEUF9Jc1NpbmtDb2RlY1N1cHBvcnRlZEFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgcmV0dXJuIEEyRFBfQ29kZWNJbmZvTWF0Y2hlc0NhcGFiaWxpdHlBYWMoJmEyZHBfYWFjX3NpbmtfY2FwcywgcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkgPT0gQTJEUF9TVUNDRVNTOwotfQotCi1ib29sIEEyRFBfSXNQZWVyU291cmNlQ29kZWNTdXBwb3J0ZWRBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5QWFjKCZhMmRwX2FhY19zaW5rX2NhcHMsIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTOwotfQotCi0vLyBDaGVja3Mgd2hldGhlciBBMkRQIEFBQyBjb2RlYyBjb25maWd1cmF0aW9uIG1hdGNoZXMgd2l0aCBhIGRldmljZSdzIGNvZGVjCi0vLyBjYXBhYmlsaXRpZXMuIHxwX2NhcHwgaXMgdGhlIEFBQyBjb2RlYyBjb25maWd1cmF0aW9uLiB8cF9jb2RlY19pbmZvfCBpcwotLy8gdGhlIGRldmljZSdzIGNvZGVjIGNhcGFiaWxpdGllcy4gfGlzX2NhcGFiaWxpdHl8IGlzIHRydWUgaWYKLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIEEyRFAgY29kZWMgY2FwYWJpbGl0eS4KLS8vIFJldHVybnMgQTJEUF9TVUNDRVNTIGlmIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIG1hdGNoZXMgd2l0aCBjYXBhYmlsaXRpZXMsCi0vLyBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgQTJEUCBlcnJvciBzdGF0dXMgY29kZS4KLXN0YXRpYyB0QTJEUF9TVEFUVVMgQTJEUF9Db2RlY0luZm9NYXRjaGVzQ2FwYWJpbGl0eUFhYygKLSAgICBjb25zdCB0QTJEUF9BQUNfQ0lFKiBwX2NhcCwgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgIGJvb2wgaXNfY2FwYWJpbGl0eSkgewotICB0QTJEUF9TVEFUVVMgc3RhdHVzOwotICB0QTJEUF9BQUNfQ0lFIGNmZ19jaWU7Ci0KLSAgLyogcGFyc2UgY29uZmlndXJhdGlvbiAqLwotICBzdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0FhYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCBpc19jYXBhYmlsaXR5KTsKLSAgaWYgKHN0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBwYXJzaW5nIGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKiB2ZXJpZnkgdGhhdCBlYWNoIHBhcmFtZXRlciBpcyBpbiByYW5nZSAqLwotCi0gIExPR19WRVJCT1NFKCIlczogT2JqZWN0IFR5cGUgcGVlcjogMHgleCwgY2FwYWJpbGl0eSAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGNmZ19jaWUub2JqZWN0VHlwZSwgcF9jYXAtPm9iamVjdFR5cGUpOwotICBMT0dfVkVSQk9TRSgiJXM6IFNhbXBsZSBSYXRlIHBlZXI6ICV1LCBjYXBhYmlsaXR5ICV1IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGNmZ19jaWUuc2FtcGxlUmF0ZSwgcF9jYXAtPnNhbXBsZVJhdGUpOwotICBMT0dfVkVSQk9TRSgiJXM6IENoYW5uZWwgTW9kZSBwZWVyOiAweCV4LCBjYXBhYmlsaXR5IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgY2ZnX2NpZS5jaGFubmVsTW9kZSwgcF9jYXAtPmNoYW5uZWxNb2RlKTsKLSAgTE9HX1ZFUkJPU0UoIiVzOiBWYXJpYWJsZSBCaXQgUmF0ZSBTdXBwb3J0IHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBjZmdfY2llLnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQsCi0gICAgICAgICAgICAgIHBfY2FwLT52YXJpYWJsZUJpdFJhdGVTdXBwb3J0KTsKLSAgTE9HX1ZFUkJPU0UoIiVzOiBCaXQgUmF0ZSBwZWVyOiAldSwgY2FwYWJpbGl0eSAldSIsIF9fZnVuY19fLCBjZmdfY2llLmJpdFJhdGUsCi0gICAgICAgICAgICAgIHBfY2FwLT5iaXRSYXRlKTsKLQotICAvKiBPYmplY3QgVHlwZSAqLwotICBpZiAoKGNmZ19jaWUub2JqZWN0VHlwZSAmIHBfY2FwLT5vYmplY3RUeXBlKSA9PSAwKSByZXR1cm4gQTJEUF9CQURfT0JKX1RZUEU7Ci0KLSAgLyogU2FtcGxlIFJhdGUgKi8KLSAgaWYgKChjZmdfY2llLnNhbXBsZVJhdGUgJiBwX2NhcC0+c2FtcGxlUmF0ZSkgPT0gMCkgcmV0dXJuIEEyRFBfQkFEX1NBTVBfRlJFUTsKLQotICAvKiBDaGFubmVsIE1vZGUgKi8KLSAgaWYgKChjZmdfY2llLmNoYW5uZWxNb2RlICYgcF9jYXAtPmNoYW5uZWxNb2RlKSA9PSAwKSByZXR1cm4gQTJEUF9OU19DSF9NT0RFOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgQTJEUF9Vc2VzUnRwSGVhZGVyQWFjKFVOVVNFRF9BVFRSIGJvb2wgY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNOYW1lQWFjKFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICByZXR1cm4gIkFBQyI7Ci19Ci0KLWJvb2wgQTJEUF9Db2RlY1R5cGVFcXVhbHNBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKSB7Ci0gIHRBMkRQX0FBQ19DSUUgYWFjX2NpZV9hOwotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWVfYjsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llX2EsIHBfY29kZWNfaW5mb19hLCB0cnVlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0FhYygmYWFjX2NpZV9iLCBwX2NvZGVjX2luZm9fYiwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJEUF9Db2RlY0VxdWFsc0FhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWVfYTsKLSAgdEEyRFBfQUFDX0NJRSBhYWNfY2llX2I7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9Ci0gICAgICBBMkRQX1BhcnNlSW5mb0FhYygmYWFjX2NpZV9hLCBwX2NvZGVjX2luZm9fYSwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BYWMoJmFhY19jaWVfYiwgcF9jb2RlY19pbmZvX2IsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiAoYWFjX2NpZV9hLm9iamVjdFR5cGUgPT0gYWFjX2NpZV9iLm9iamVjdFR5cGUpICYmCi0gICAgICAgICAoYWFjX2NpZV9hLnNhbXBsZVJhdGUgPT0gYWFjX2NpZV9iLnNhbXBsZVJhdGUpICYmCi0gICAgICAgICAoYWFjX2NpZV9hLmNoYW5uZWxNb2RlID09IGFhY19jaWVfYi5jaGFubmVsTW9kZSkgJiYKLSAgICAgICAgIChhYWNfY2llX2EudmFyaWFibGVCaXRSYXRlU3VwcG9ydCA9PQotICAgICAgICAgIGFhY19jaWVfYi52YXJpYWJsZUJpdFJhdGVTdXBwb3J0KSAmJgotICAgICAgICAgKGFhY19jaWVfYS5iaXRSYXRlID09IGFhY19jaWVfYi5iaXRSYXRlKTsKLX0KLQotaW50IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGFhY19jaWUuc2FtcGxlUmF0ZSkgewotICAgIGNhc2UgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV84MDAwOgotICAgICAgcmV0dXJuIDgwMDA7Ci0gICAgY2FzZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzExMDI1OgotICAgICAgcmV0dXJuIDExMDI1OwotICAgIGNhc2UgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV8xMjAwMDoKLSAgICAgIHJldHVybiAxMjAwMDsKLSAgICBjYXNlIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfMTYwMDA6Ci0gICAgICByZXR1cm4gMTYwMDA7Ci0gICAgY2FzZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzIyMDUwOgotICAgICAgcmV0dXJuIDIyMDUwOwotICAgIGNhc2UgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV8yNDAwMDoKLSAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfMzIwMDA6Ci0gICAgICByZXR1cm4gMzIwMDA7Ci0gICAgY2FzZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwOgotICAgICAgcmV0dXJuIDQ0MTAwOwotICAgIGNhc2UgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80ODAwMDoKLSAgICAgIHJldHVybiA0ODAwMDsKLSAgICBjYXNlIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNjQwMDA6Ci0gICAgICByZXR1cm4gNjQwMDA7Ci0gICAgY2FzZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzg4MjAwOgotICAgICAgcmV0dXJuIDg4MjAwOwotICAgIGNhc2UgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV85NjAwMDoKLSAgICAgIHJldHVybiA5NjAwMDsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfR2V0VHJhY2tCaXRzUGVyU2FtcGxlQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBOT1RFOiBUaGUgYml0cyBwZXIgc2FtcGxlIG5ldmVyIGNoYW5nZXMgZm9yIEFBQwotICByZXR1cm4gMTY7Ci19Ci0KLWludCBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50QWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGFhY19jaWUuY2hhbm5lbE1vZGUpIHsKLSAgICBjYXNlIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgcmV0dXJuIDI7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX0dldFNpbmtUcmFja0NoYW5uZWxUeXBlQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGFhY19jaWUuY2hhbm5lbE1vZGUpIHsKLSAgICBjYXNlIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgcmV0dXJuIDM7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX0dldE9iamVjdFR5cGVDb2RlQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BQUNfQ0lFIGFhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGFhY19jaWUub2JqZWN0VHlwZSkgewotICAgIGNhc2UgQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzJfTEM6Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9MQzoKLSAgICBjYXNlIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xUUDoKLSAgICBjYXNlIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X1NDQUxBQkxFOgotICAgICAgcmV0dXJuIGFhY19jaWUub2JqZWN0VHlwZTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX0dldENoYW5uZWxNb2RlQ29kZUFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQUFDX0NJRSBhYWNfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0FhYygmYWFjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChhYWNfY2llLmNoYW5uZWxNb2RlKSB7Ci0gICAgY2FzZSBBMkRQX0FBQ19DSEFOTkVMX01PREVfTU9OTzoKLSAgICBjYXNlIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICByZXR1cm4gYWFjX2NpZS5jaGFubmVsTW9kZTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX0dldFZhcmlhYmxlQml0UmF0ZVN1cHBvcnRBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FBQ19DSUUgYWFjX2NpZTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BYWMoJmFhY19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN3aXRjaCAoYWFjX2NpZS52YXJpYWJsZUJpdFJhdGVTdXBwb3J0KSB7Ci0gICAgY2FzZSBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9FTkFCTEVEOgotICAgIGNhc2UgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRElTQUJMRUQ6Ci0gICAgICByZXR1cm4gYWFjX2NpZS52YXJpYWJsZUJpdFJhdGVTdXBwb3J0OwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfR2V0Qml0UmF0ZUFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQUFDX0NJRSBhYWNfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0FhYygmYWFjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIGFhY19jaWUuYml0UmF0ZTsKLX0KLQotaW50IEEyRFBfQ29tcHV0ZU1heEJpdFJhdGVBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCB1aW50MTZfdCBtdHUpIHsKLSAgdEEyRFBfQUFDX0NJRSBhYWNfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0FhYygmYWFjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaW50IHNhbXBsaW5nX2ZyZXEgPSBBMkRQX0dldFRyYWNrU2FtcGxlUmF0ZUFhYyhwX2NvZGVjX2luZm8pOwotICBpZiAoc2FtcGxpbmdfZnJlcSA9PSAtMSkgcmV0dXJuIC0xOwotCi0gIGludCBwY21fY2hhbm5lbF9zYW1wbGVzX3Blcl9mcmFtZSA9IDA7Ci0gIHN3aXRjaCAoYWFjX2NpZS5vYmplY3RUeXBlKSB7Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQzoKLSAgICBjYXNlIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xDOgotICAgICAgcGNtX2NoYW5uZWxfc2FtcGxlc19wZXJfZnJhbWUgPSAxMDI0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9MVFA6Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9TQ0FMQUJMRToKLSAgICAgIC8vIFRPRE86IFRoZSBNUEVHIGRvY3VtZW50YXRpb24gZG9lc24ndCBzcGVjaWZ5IHRoZSB2YWx1ZS4KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAocGNtX2NoYW5uZWxfc2FtcGxlc19wZXJfZnJhbWUgPT0gMCkgcmV0dXJuIC0xOwotCi0gIC8vIFNlZSBTZWN0aW9uIDMuMi4xIEVzdGltYXRpbmcgQXZlcmFnZSBGcmFtZSBTaXplIGZyb20KLSAgLy8gdGhlIGFhY0VuY29kZXIucGRmIGRvY3VtZW50IGluY2x1ZGVkIHdpdGggdGhlIEFBQyBzb3VyY2UgY29kZS4KLSAgcmV0dXJuICg4ICogbXR1ICogc2FtcGxpbmdfZnJlcSkgLyBwY21fY2hhbm5lbF9zYW1wbGVzX3Blcl9mcmFtZTsKLX0KLQotYm9vbCBBMkRQX0dldFBhY2tldFRpbWVzdGFtcEFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwgdWludDMyX3QqIHBfdGltZXN0YW1wKSB7Ci0gIC8vIFRPRE86IElzIHRoaXMgZnVuY3Rpb24gcmVhbGx5IGNvZGVjLXNwZWNpZmljPwotICAqcF90aW1lc3RhbXAgPSAqKGNvbnN0IHVpbnQzMl90KilwX2RhdGE7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfQnVpbGRDb2RlY0hlYWRlckFhYyhVTlVTRURfQVRUUiBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgZnJhbWVzX3Blcl9wYWNrZXQpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6c3RyaW5nIEEyRFBfQ29kZWNJbmZvU3RyaW5nQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBzdGQ6OnN0cmluZ3N0cmVhbSByZXM7Ci0gIHN0ZDo6c3RyaW5nIGZpZWxkOwotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXM7Ci0gIHRBMkRQX0FBQ19DSUUgYWFjX2NpZTsKLQotICBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQWFjKCZhYWNfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgcmVzIDw8ICJBMkRQX1BhcnNlSW5mb0FhYyBmYWlsOiAiIDw8IGxvZ2hleChhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIHJlcy5zdHIoKTsKLSAgfQotCi0gIHJlcyA8PCAiXHRuYW1lOiBBQUNcbiI7Ci0KLSAgLy8gT2JqZWN0IHR5cGUKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5vYmplY3RUeXBlID09IDApLCAiTk9ORSIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhYWNfY2llLm9iamVjdFR5cGUgJiBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQyksCi0gICAgICAgICAgICAgICIoTVBFRy0yIEFBQyBMQykiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5vYmplY3RUeXBlICYgQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzRfTEMpLAotICAgICAgICAgICAgICAiKE1QRUctNCBBQUMgTEMpIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUub2JqZWN0VHlwZSAmIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xUUCksCi0gICAgICAgICAgICAgICIoTVBFRy00IEFBQyBMVFApIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwKLSAgICAgICAgICAgICAgKGFhY19jaWUub2JqZWN0VHlwZSAmIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X1NDQUxBQkxFKSwKLSAgICAgICAgICAgICAgIihNUEVHLTQgQUFDIFNjYWxhYmxlKSIpOwotICByZXMgPDwgIlx0b2JqZWN0VHlwZTogIiA8PCBmaWVsZCA8PCAiICgiIDw8IGxvZ2hleChhYWNfY2llLm9iamVjdFR5cGUpCi0gICAgICA8PCAiKVxuIjsKLQotICAvLyBTYW1wbGUgZnJlcXVlbmN5Ci0gIGZpZWxkLmNsZWFyKCk7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUuc2FtcGxlUmF0ZSA9PSAwKSwgIk5PTkUiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV84MDAwKSwKLSAgICAgICAgICAgICAgIjgwMDAiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV8xMTAyNSksCi0gICAgICAgICAgICAgICIxMTAyNSIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhYWNfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzEyMDAwKSwKLSAgICAgICAgICAgICAgIjEyMDAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfMTYwMDApLAotICAgICAgICAgICAgICAiMTYwMDAiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV8yMjA1MCksCi0gICAgICAgICAgICAgICIyMjA1MCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhYWNfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzI0MDAwKSwKLSAgICAgICAgICAgICAgIjI0MDAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfMzIwMDApLAotICAgICAgICAgICAgICAiMzIwMDAiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCksCi0gICAgICAgICAgICAgICI0NDEwMCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhYWNfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSwKLSAgICAgICAgICAgICAgIjQ4MDAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNjQwMDApLAotICAgICAgICAgICAgICAiNjQwMDAiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYWFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV84ODIwMCksCi0gICAgICAgICAgICAgICI4ODIwMCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhYWNfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwKSwKLSAgICAgICAgICAgICAgIjk2MDAwIik7Ci0gIHJlcyA8PCAiXHRzYW1wX2ZyZXE6ICIgPDwgZmllbGQgPDwgIiAoIiA8PCBsb2doZXgoYWFjX2NpZS5zYW1wbGVSYXRlKQotICAgICAgPDwgIilcbiI7Ci0KLSAgLy8gQ2hhbm5lbCBtb2RlCi0gIGZpZWxkLmNsZWFyKCk7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUuY2hhbm5lbE1vZGUgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFhY19jaWUuY2hhbm5lbE1vZGUgPT0gQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk8pLAotICAgICAgICAgICAgICAiTW9ubyIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhYWNfY2llLmNoYW5uZWxNb2RlID09IEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU8pLAotICAgICAgICAgICAgICAiU3RlcmVvIik7Ci0gIHJlcyA8PCAiXHRjaF9tb2RlOiAiIDw8IGZpZWxkIDw8ICIgKCIgPDwgbG9naGV4KGFhY19jaWUuY2hhbm5lbE1vZGUpIDw8ICIpXG4iOwotCi0gIC8vIFZhcmlhYmxlIGJpdCByYXRlIHN1cHBvcnQKLSAgcmVzIDw8ICJcdHZhcmlhYmxlQml0UmF0ZVN1cHBvcnQ6ICIgPDwgc3RkOjpib29sYWxwaGEKLSAgICAgIDw8IChhYWNfY2llLnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgIT0gMCkgPDwgIlxuIjsKLQotICAvLyBCaXQgcmF0ZQotICByZXMgPDwgIlx0Yml0UmF0ZTogIiA8PCBzdGQ6OnRvX3N0cmluZyhhYWNfY2llLmJpdFJhdGUpIDw8ICJcbiI7Ci0KLSAgcmV0dXJuIHJlcy5zdHIoKTsKLX0KLQotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfR2V0RW5jb2RlckludGVyZmFjZUFhYygKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgaWYgKCFBMkRQX0lzU291cmNlQ29kZWNWYWxpZEFhYyhwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZW5jb2Rlcl9pbnRlcmZhY2VfYWFjOwotfQotCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXREZWNvZGVySW50ZXJmYWNlQWFjKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBpZiAoIUEyRFBfSXNTaW5rQ29kZWNWYWxpZEFhYyhwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZGVjb2Rlcl9pbnRlcmZhY2VfYWFjOwotfQotCi1ib29sIEEyRFBfQWRqdXN0Q29kZWNBYWModWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FBQ19DSUUgY2ZnX2NpZTsKLQotICAvLyBOb3RoaW5nIHRvIGRvOiBqdXN0IHZlcmlmeSB0aGUgY29kZWMgaW5mbyBpcyB2YWxpZAotICBpZiAoQTJEUF9QYXJzZUluZm9BYWMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgIT0gQTJEUF9TVUNDRVNTKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgQTJEUF9Tb3VyY2VDb2RlY0luZGV4QWFjKAotICAgIFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM7Ci19Ci0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU2lua0NvZGVjSW5kZXhBYWMoCi0gICAgVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUM7Ci19Ci0KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNJbmRleFN0ckFhYyh2b2lkKSB7IHJldHVybiAiQUFDIjsgfQotCi1jb25zdCBjaGFyKiBBMkRQX0NvZGVjSW5kZXhTdHJBYWNTaW5rKHZvaWQpIHsgcmV0dXJuICJBQUMgU0lOSyI7IH0KLQotdm9pZCBhYWNfc291cmNlX2NhcHNfaW5pdGlhbGl6ZSgpIHsKLSAgaWYgKGFhY19zb3VyY2VfY2Fwc19jb25maWd1cmVkKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGEyZHBfYWFjX3NvdXJjZV9jYXBzID0KLSAgICAgIG9zaV9wcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9hYWMudmJyX3N1cHBvcnRlZCIsIGZhbHNlKQotICAgICAgICAgID8gYTJkcF9hYWNfdmJyX3NvdXJjZV9jYXBzCi0gICAgICAgICAgOiBhMmRwX2FhY19jYnJfc291cmNlX2NhcHM7Ci0gIGFhY19zb3VyY2VfY2Fwc19jb25maWd1cmVkID0gdHJ1ZTsKLX0KLQotYm9vbCBBMkRQX0luaXRDb2RlY0NvbmZpZ0FhYyhBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgYWFjX3NvdXJjZV9jYXBzX2luaXRpYWxpemUoKTsKLSAgaWYgKEEyRFBfQnVpbGRJbmZvQWFjKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJmEyZHBfYWFjX3NvdXJjZV9jYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9jZmctPmNvZGVjX2luZm8pICE9IEEyRFBfU1VDQ0VTUykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgLyogQ29udGVudCBwcm90ZWN0aW9uIGluZm8gLSBzdXBwb3J0IFNDTVMtVCAqLwotICB1aW50OF90KiBwID0gcF9jZmctPnByb3RlY3RfaW5mbzsKLSAgKnArKyA9IEFWRFRfQ1BfTE9TQzsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBBVkRUX0NQX1NDTVNfVF9JRCk7Ci0gIHBfY2ZnLT5udW1fcHJvdGVjdCA9IDE7Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMkRQX0luaXRDb2RlY0NvbmZpZ0FhY1NpbmsoQXZkdHBTZXBDb25maWcqIHBfY2ZnKSB7Ci0gIHJldHVybiBBMkRQX0J1aWxkSW5mb0FhYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZhMmRwX2FhY19zaW5rX2NhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NmZy0+Y29kZWNfaW5mbykgPT0gQTJEUF9TVUNDRVNTOwotfQotCi1VTlVTRURfQVRUUiBzdGF0aWMgdm9pZCBidWlsZF9jb2RlY19jb25maWcoY29uc3QgdEEyRFBfQUFDX0NJRSYgY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHJlc3VsdCkgewotICBpZiAoY29uZmlnX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCkKLSAgICByZXN1bHQtPnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgaWYgKGNvbmZpZ19jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApCi0gICAgcmVzdWx0LT5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gIGlmIChjb25maWdfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzg4MjAwKQotICAgIHJlc3VsdC0+c2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICBpZiAoY29uZmlnX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV85NjAwMCkKLSAgICByZXN1bHQtPnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLQotICByZXN1bHQtPmJpdHNfcGVyX3NhbXBsZSA9IGNvbmZpZ19jaWUuYml0c19wZXJfc2FtcGxlOwotCi0gIGlmIChjb25maWdfY2llLmNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk8pCi0gICAgcmVzdWx0LT5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICBpZiAoY29uZmlnX2NpZS5jaGFubmVsTW9kZSAmIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU8pIHsKLSAgICByZXN1bHQtPmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotfQotCi1BMmRwQ29kZWNDb25maWdBYWNTb3VyY2U6OkEyZHBDb2RlY0NvbmZpZ0FhY1NvdXJjZSgKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkKLSAgICA6IEEyZHBDb2RlY0NvbmZpZ0FhY0Jhc2UoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmRleFN0ckFhYygpLCBjb2RlY19wcmlvcml0eSwgdHJ1ZSkgewotICBhYWNfc291cmNlX2NhcHNfaW5pdGlhbGl6ZSgpOwotICAvLyBDb21wdXRlIHRoZSBsb2NhbCBjYXBhYmlsaXR5Ci0gIGlmIChhMmRwX2FhY19zb3VyY2VfY2Fwcy5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCkgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgfQotICBpZiAoYTJkcF9hYWNfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gIH0KLSAgaWYgKGEyZHBfYWFjX3NvdXJjZV9jYXBzLnNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzg4MjAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICB9Ci0gIGlmIChhMmRwX2FhY19zb3VyY2VfY2Fwcy5zYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV85NjAwMCkgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgfQotICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgYTJkcF9hYWNfc291cmNlX2NhcHMuYml0c19wZXJfc2FtcGxlOwotICBpZiAoYTJkcF9hYWNfc291cmNlX2NhcHMuY2hhbm5lbE1vZGUgJiBBMkRQX0FBQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gIH0KLSAgaWYgKGEyZHBfYWFjX3NvdXJjZV9jYXBzLmNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotfQotCi1BMmRwQ29kZWNDb25maWdBYWNTb3VyY2U6On5BMmRwQ29kZWNDb25maWdBYWNTb3VyY2UoKSB7fQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ0FhY1NvdXJjZTo6aW5pdCgpIHsKLSAgaWYgKCFpc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLQotICAvLyBMb2FkIHRoZSBlbmNvZGVyCi0gIGlmICghQTJEUF9Mb2FkRW5jb2RlckFhYygpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGxvYWQgdGhlIGVuY29kZXIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQWFjU291cmNlOjp1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBiZXN0IHNhbXBsZSByYXRlIGZyb20gfHNhbXBsZVJhdGV8LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKHVpbnQxNl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9BQUNfQ0lFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwKSB7Ci0gICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwOwotICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfODgyMDApIHsKLSAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfODgyMDA7Ci0gICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80ODAwMCkgewotICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80ODAwMDsKLSAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwKSB7Ci0gICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwOwotICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBhdWRpbyBzYW1wbGUgcmF0ZSBmcm9tIHxwX2NvZGVjX2F1ZGlvX2NvbmZpZ3wuCi0vLyB8c2FtcGxlUmF0ZXwgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2F1ZGlvX3NhbXBsZV9yYXRlKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19hdWRpb19jb25maWcsIHVpbnQxNl90IHNhbXBsZVJhdGUsCi0gICAgdEEyRFBfQUFDX0NJRSogcF9yZXN1bHQsIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChwX2NvZGVjX2F1ZGlvX2NvbmZpZy0+c2FtcGxlX3JhdGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDQxMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80ODAwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDgwMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV84ODIwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfODgyMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV85NjAwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfOTYwMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBiZXN0IGJpdHMgcGVyIHNhbXBsZSBmcm9tIHxiaXRzX3Blcl9zYW1wbGV8LgotLy8gfGJpdHNfcGVyX3NhbXBsZXwgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2Jlc3RfYml0c19wZXJfc2FtcGxlKAotICAgIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBiaXRzX3Blcl9zYW1wbGUsIHRBMkRQX0FBQ19DSUUqIHBfcmVzdWx0LAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIpIHsKLSAgICBwX2NvZGVjX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjsKLSAgICBwX3Jlc3VsdC0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCkgewotICAgIHBfY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgIHBfcmVzdWx0LT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2KSB7Ci0gICAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgcF9yZXN1bHQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYXVkaW8gYml0cyBwZXIgc2FtcGxlIGZyb20gfHBfY29kZWNfYXVkaW9fY29uZmlnfC4KLS8vIHxiaXRzX3Blcl9zYW1wbGV8IGNvbnRhaW5zIHRoZSBjYXBhYmlsaXR5LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9hdWRpb19iaXRzX3Blcl9zYW1wbGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgYml0c19wZXJfc2FtcGxlLCB0QTJEUF9BQUNfQ0lFKiBwX3Jlc3VsdCwKLSAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIHN3aXRjaCAocF9jb2RlY19hdWRpb19jb25maWctPmJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2KSB7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OwotICAgICAgICBwX3Jlc3VsdC0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICBpZiAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCkgewotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDsKLSAgICAgICAgcF9yZXN1bHQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgICAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIpIHsKLSAgICAgICAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzI7Ci0gICAgICAgIHBfcmVzdWx0LT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYmVzdCBjaGFubmVsIG1vZGUgZnJvbSB8Y2hhbm5lbE1vZGV8LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X2NoYW5uZWxfbW9kZSh1aW50OF90IGNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBMkRQX0FBQ19DSUUqIHBfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NT05PKSB7Ci0gICAgcF9yZXN1bHQtPmNoYW5uZWxNb2RlID0gQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBhdWRpbyBjaGFubmVsIG1vZGUgZnJvbSB8cF9jb2RlY19hdWRpb19jb25maWd8LgotLy8gfGNoYW5uZWxNb2RlfCBjb250YWlucyB0aGUgY2FwYWJpbGl0eS4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYXVkaW9fY2hhbm5lbF9tb2RlKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19hdWRpb19jb25maWcsIHVpbnQ4X3QgY2hhbm5lbE1vZGUsCi0gICAgdEEyRFBfQUFDX0NJRSogcF9yZXN1bHQsIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChwX2NvZGVjX2F1ZGlvX2NvbmZpZy0+Y2hhbm5lbF9tb2RlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FBQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgICAgICBwX3Jlc3VsdC0+Y2hhbm5lbE1vZGUgPSBBMkRQX0FBQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgICAgICBwX3Jlc3VsdC0+Y2hhbm5lbE1vZGUgPSBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdBYWNCYXNlOjpzZXRDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0gIHRBMkRQX0FBQ19DSUUgcGVlcl9pbmZvX2NpZTsKLSAgdEEyRFBfQUFDX0NJRSByZXN1bHRfY29uZmlnX2NpZTsKLSAgdWludDhfdCBjaGFubmVsTW9kZTsKLSAgdWludDE2X3Qgc2FtcGxlUmF0ZTsKLSAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGJpdHNfcGVyX3NhbXBsZTsKLSAgY29uc3QgdEEyRFBfQUFDX0NJRSogcF9hMmRwX2FhY19jYXBzID0KLSAgICAgIChpc19zb3VyY2VfKSA/ICZhMmRwX2FhY19zb3VyY2VfY2FwcyA6ICZhMmRwX2FhY19zaW5rX2NhcHM7Ci0KLSAgLy8gU2F2ZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZ187Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19jYXBhYmlsaXR5ID0gY29kZWNfY2FwYWJpbGl0eV87Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHkgPQotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX3VzZXJfY29uZmlnID0gY29kZWNfdXNlcl9jb25maWdfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfYXVkaW9fY29uZmlnID0gY29kZWNfYXVkaW9fY29uZmlnXzsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIHVpbnQ4X3Qgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eVtBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZ1tBVkRUX0NPREVDX1NJWkVdOwotICBtZW1jcHkoc2F2ZWRfb3RhX2NvZGVjX2NvbmZpZywgb3RhX2NvZGVjX2NvbmZpZ18sIHNpemVvZihvdGFfY29kZWNfY29uZmlnXykpOwotICBtZW1jcHkoc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eSwgb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZywgb3RhX2NvZGVjX3BlZXJfY29uZmlnXywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jb25maWdfKSk7Ci0KLSAgdEEyRFBfU1RBVFVTIHN0YXR1cyA9Ci0gICAgICBBMkRQX1BhcnNlSW5mb0FhYygmcGVlcl9pbmZvX2NpZSwgcF9wZWVyX2NvZGVjX2luZm8sIGlzX2NhcGFiaWxpdHkpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbid0IHBhcnNlIHBlZXIncyBjYXBhYmlsaXRpZXM6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBCdWlsZCB0aGUgcHJlZmVycmVkIGNvbmZpZ3VyYXRpb24KLSAgLy8KLSAgbWVtc2V0KCZyZXN1bHRfY29uZmlnX2NpZSwgMCwgc2l6ZW9mKHJlc3VsdF9jb25maWdfY2llKSk7Ci0KLSAgLy8gTk9URTogQWx3YXlzIGFzc2lnbiB0aGUgT2JqZWN0IFR5cGUgYW5kIFZhcmlhYmxlIEJpdCBSYXRlIFN1cHBvcnQuCi0gIHJlc3VsdF9jb25maWdfY2llLm9iamVjdFR5cGUgPSBwX2EyZHBfYWFjX2NhcHMtPm9iamVjdFR5cGU7Ci0gIC8vIFRoZSBWYXJpYWJsZSBCaXQgUmF0ZSBTdXBwb3J0IGlzIGRpc2FibGVkIGlmIGVpdGhlciBzaWRlIGRpc2FibGVzIGl0Ci0gIHJlc3VsdF9jb25maWdfY2llLnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgPQotICAgICAgcF9hMmRwX2FhY19jYXBzLT52YXJpYWJsZUJpdFJhdGVTdXBwb3J0ICYKLSAgICAgIHBlZXJfaW5mb19jaWUudmFyaWFibGVCaXRSYXRlU3VwcG9ydDsKLSAgaWYgKHJlc3VsdF9jb25maWdfY2llLnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgIT0KLSAgICAgIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0RJU0FCTEVEKSB7Ci0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oQWFjRW5jb2RlckJpdHJhdGVNb2RlOjpBQUNFTkNfQlJfTU9ERV9WQlJfNSk7Ci0gIH0gZWxzZSB7Ci0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oQWFjRW5jb2RlckJpdHJhdGVNb2RlOjpBQUNFTkNfQlJfTU9ERV9DQlIpOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBiaXQgcmF0ZSBhcyBmb2xsb3dzOgotICAvLyAxLiBJZiB0aGUgcmVtb3RlIGRldmljZSByZXBvcnRzIGEgYm9ndXMgYml0IHJhdGUKLSAgLy8gICAgKGJpdFJhdGUgPCBBMkRQX0FBQ19NSU5fQklUUkFURSksIHRoZW4gdXNlIHRoZSBiaXQgcmF0ZSBmcm9tIG91cgotICAvLyAgICBjb25maWd1cmF0aW9uLiBFeGFtcGxlcyBvZiBvYnNlcnZlZCBib2d1cyBiaXQgcmF0ZXMgYXJlIHplcm8KLSAgLy8gICAgYW5kIDI0NTc2LgotICAvLyAyLiBJZiB0aGUgcmVtb3RlIGRldmljZSByZXBvcnRzIHZhbGlkIGJpdCByYXRlCi0gIC8vICAgIChiaXRSYXRlID49IEEyRFBfQUFDX01JTl9CSVRSQVRFKSwgdGhlbiB1c2UgdGhlIHNtYWxsZXIKLSAgLy8gICAgb2YgdGhlIHJlbW90ZSBkZXZpY2UncyBiaXQgcmF0ZSBhbmQgdGhlIGJpdCByYXRlIGZyb20gb3VyIGNvbmZpZ3VyYXRpb24uCi0gIC8vIEluIGVpdGhlciBjYXNlLCB0aGUgYWN0dWFsIHN0cmVhbWluZyBiaXQgcmF0ZSB3aWxsIGFsc28gY29uc2lkZXIgdGhlIE1UVS4KLSAgaWYgKHBlZXJfaW5mb19jaWUuYml0UmF0ZSA8IEEyRFBfQUFDX01JTl9CSVRSQVRFKSB7Ci0gICAgLy8gQm9ndXMgYml0IHJhdGUKLSAgICByZXN1bHRfY29uZmlnX2NpZS5iaXRSYXRlID0gcF9hMmRwX2FhY19jYXBzLT5iaXRSYXRlOwotICB9IGVsc2UgewotICAgIHJlc3VsdF9jb25maWdfY2llLmJpdFJhdGUgPQotICAgICAgICBzdGQ6Om1pbihwX2EyZHBfYWFjX2NhcHMtPmJpdFJhdGUsIHBlZXJfaW5mb19jaWUuYml0UmF0ZSk7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIHNhbXBsZSBmcmVxdWVuY3kKLSAgLy8KLSAgc2FtcGxlUmF0ZSA9IHBfYTJkcF9hYWNfY2Fwcy0+c2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZTsKLSAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICBzd2l0Y2ggKGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ4MDAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzg4MjAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzg4MjAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORToKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIFNlbGVjdCB0aGUgc2FtcGxlIGZyZXF1ZW5jeSBpZiB0aGVyZSBpcyBubyB1c2VyIHByZWZlcmVuY2UKLSAgZG8gewotICAgIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCkgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICB9Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIH0KLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfODgyMDApIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA7Ci0gICAgfQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV85NjAwMCkgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgICB9Ci0KLSAgICBpZiAoY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSAhPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSkgYnJlYWs7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBjb21tb24gY2FwYWJpbGl0eQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApCi0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzg4MjAwKQotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV85NjAwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgY29kZWMgYXVkaW8gY29uZmlnCi0gICAgaWYgKHNlbGVjdF9hdWRpb19zYW1wbGVfcmF0ZSgmY29kZWNfYXVkaW9fY29uZmlnXywgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB0cnkgdGhlIGRlZmF1bHQgY29uZmlnCi0gICAgaWYgKHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKAotICAgICAgICAgICAgYTJkcF9hYWNfZGVmYXVsdF9jb25maWcuc2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB1c2UgdGhlIGJlc3QgbWF0Y2gKLSAgICBpZiAoc2VsZWN0X2Jlc3Rfc2FtcGxlX3JhdGUoc2FtcGxlUmF0ZSwgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBjYW5ub3QgbWF0Y2ggc2FtcGxlIGZyZXF1ZW5jeTogc291cmNlIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9hMmRwX2FhY19jYXBzLT5zYW1wbGVSYXRlLCBwZWVyX2luZm9fY2llLnNhbXBsZVJhdGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgYml0cyBwZXIgc2FtcGxlCi0gIC8vCi0gIC8vIE5PVEU6IHRoaXMgaW5mb3JtYXRpb24gaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBBQUMgQTJEUCBjb2RlYyBkZXNjcmlwdGlvbgotICAvLyB0aGF0IGlzIHNlbnQgT1RBLgotICBiaXRzX3Blcl9zYW1wbGUgPSBwX2EyZHBfYWFjX2NhcHMtPmJpdHNfcGVyX3NhbXBsZTsKLSAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gIHN3aXRjaCAoY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2KSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDoKLSAgICAgIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0KSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICAgICAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIFNlbGVjdCB0aGUgYml0cyBwZXIgc2FtcGxlIGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQotICBkbyB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgICBwX2EyZHBfYWFjX2NhcHMtPmJpdHNfcGVyX3NhbXBsZTsKLQotICAgIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSAhPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpCi0gICAgICBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOwotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdGhlIHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX2JpdHNfcGVyX3NhbXBsZSgmY29kZWNfYXVkaW9fY29uZmlnXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2EyZHBfYWFjX2NhcHMtPmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBkZWZhdWx0IGNvbmZpZwotICAgIGlmIChzZWxlY3RfYmVzdF9iaXRzX3Blcl9zYW1wbGUoYTJkcF9hYWNfZGVmYXVsdF9jb25maWcuYml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHVzZSB0aGUgYmVzdCBtYXRjaAotICAgIGlmIChzZWxlY3RfYmVzdF9iaXRzX3Blcl9zYW1wbGUocF9hMmRwX2FhY19jYXBzLT5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlIChmYWxzZSk7Ci0gIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9PSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIGJpdHMgcGVyIHNhbXBsZTogZGVmYXVsdCA9IDB4JXggIgotICAgICAgICAidXNlciBwcmVmZXJlbmNlID0gMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBhMmRwX2FhY19kZWZhdWx0X2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgIGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgY2hhbm5lbCBtb2RlCi0gIC8vCi0gIGNoYW5uZWxNb2RlID0gcF9hMmRwX2FhY19jYXBzLT5jaGFubmVsTW9kZSAmIHBlZXJfaW5mb19jaWUuY2hhbm5lbE1vZGU7Ci0gIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotICBzd2l0Y2ggKGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzoKLSAgICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NT05PKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmNoYW5uZWxNb2RlID0gQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmNoYW5uZWxNb2RlID0gQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU6Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0gICAgICBjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gU2VsZWN0IHRoZSBjaGFubmVsIG1vZGUgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCi0gIGRvIHsKLSAgICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkKLSAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FBQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgfQotICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU8pIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotCi0gICAgaWYgKGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlICE9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkgYnJlYWs7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBjb21tb24gY2FwYWJpbGl0eQotICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NT05PKQotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX2NoYW5uZWxfbW9kZSgmY29kZWNfYXVkaW9fY29uZmlnXywgY2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgZGVmYXVsdCBjb25maWcKLSAgICBpZiAoc2VsZWN0X2Jlc3RfY2hhbm5lbF9tb2RlKAotICAgICAgICAgICAgYTJkcF9hYWNfZGVmYXVsdF9jb25maWcuY2hhbm5lbE1vZGUgJiBwZWVyX2luZm9fY2llLmNoYW5uZWxNb2RlLAotICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHVzZSB0aGUgYmVzdCBtYXRjaAotICAgIGlmIChzZWxlY3RfYmVzdF9jaGFubmVsX21vZGUoY2hhbm5lbE1vZGUsICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlIChmYWxzZSk7Ci0gIGlmIChjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIGNoYW5uZWwgbW9kZTogc291cmNlIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9hMmRwX2FhY19jYXBzLT5jaGFubmVsTW9kZSwgcGVlcl9pbmZvX2NpZS5jaGFubmVsTW9kZSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gQ29weSB0aGUgY29kZWMtc3BlY2lmaWMgZmllbGRzIGlmIHRoZXkgYXJlIG5vdCB6ZXJvCi0gIC8vCi0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSAhPSAwKSB7Ci0gICAgaWYgKHJlc3VsdF9jb25maWdfY2llLnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgIT0KLSAgICAgICAgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRElTQUJMRUQpIHsKLSAgICAgIGF1dG8gdXNlcl9iaXRyYXRlX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMTsKLSAgICAgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8QWFjRW5jb2RlckJpdHJhdGVNb2RlPih1c2VyX2JpdHJhdGVfbW9kZSkpIHsKLSAgICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl9DOgotICAgICAgICAgIC8vIFZCUiBpcyBzdXBwb3J0ZWQsIGFuZCBpcyBkaXNhYmxlZCBieSB0aGUgdXNlciBwcmVmZXJlbmNlCi0gICAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUudmFyaWFibGVCaXRSYXRlU3VwcG9ydCA9Ci0gICAgICAgICAgICAgIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0RJU0FCTEVEOwotICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgotICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgotICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgotICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl80OgotICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl81OgotICAgICAgICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSA9Ci0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KEFhY0VuY29kZXJCaXRyYXRlTW9kZTo6QUFDRU5DX0JSX01PREVfVkJSXzUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBJdCBpcyBubyBuZWVkZWQgdG8gY2hlY2sgdGhlIHVzZXIgcHJlZmVyZW5jZSB3aGVuIFZhcmlhYmxlIEJpdHJhdGUKLSAgICAgIC8vIHVuc3VwcG9ydGVkIGJ5IG9uZSBvZiBzb3VyY2Ugb3Igc2luawotICAgICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX0NCUik7Ci0gICAgfQotICB9Ci0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMiAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMiA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18yOwotICBpZiAoY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzMgIT0gMCkKLSAgICBjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzMgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMzsKLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY180ICE9IDApCi0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY180ID0gY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzQ7Ci0KLSAgaWYgKEEyRFBfQnVpbGRJbmZvQWFjKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHRfY29kZWNfY29uZmlnKSAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBsb2NhbCBjb3B5IG9mIHRoZSBwZWVyIGNvZGVjIGNhcGFiaWxpdHkvY29uZmlnLCBhbmQgdGhlCi0gIC8vIHJlc3VsdCBjb2RlYyBjb25maWcuCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BYWMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcGVlcl9pbmZvX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xyk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BYWMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcGVlcl9pbmZvX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jb25maWdfKTsKLSAgfQotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLSAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BYWMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcmVzdWx0X2NvbmZpZ19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19jb25maWdfKTsKLSAgQ0hFQ0soc3RhdHVzID09IEEyRFBfU1VDQ0VTUyk7Ci0gIHJldHVybiB0cnVlOwotCi1mYWlsOgotICAvLyBSZXN0b3JlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICBjb2RlY19jb25maWdfID0gc2F2ZWRfY29kZWNfY29uZmlnOwotICBjb2RlY19jYXBhYmlsaXR5XyA9IHNhdmVkX2NvZGVjX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8gPSBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX3VzZXJfY29uZmlnXyA9IHNhdmVkX2NvZGVjX3VzZXJfY29uZmlnOwotICBjb2RlY19hdWRpb19jb25maWdfID0gc2F2ZWRfY29kZWNfYXVkaW9fY29uZmlnOwotICBtZW1jcHkob3RhX2NvZGVjX2NvbmZpZ18sIHNhdmVkX290YV9jb2RlY19jb25maWcsIHNpemVvZihvdGFfY29kZWNfY29uZmlnXykpOwotICBtZW1jcHkob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sIHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgbWVtY3B5KG90YV9jb2RlY19wZWVyX2NvbmZpZ18sIHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jb25maWdfKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdBYWNCYXNlOjpzZXRQZWVyQ29kZWNDYXBhYmlsaXRpZXMoCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgdEEyRFBfQUFDX0NJRSBwZWVyX2luZm9fY2llOwotICB1aW50OF90IGNoYW5uZWxNb2RlOwotICB1aW50MTZfdCBzYW1wbGVSYXRlOwotICB1aW50OF90IHZhcmlhYmxlQml0UmF0ZVN1cHBvcnQ7Ci0gIGNvbnN0IHRBMkRQX0FBQ19DSUUqIHBfYTJkcF9hYWNfY2FwcyA9Ci0gICAgICAoaXNfc291cmNlXykgPyAmYTJkcF9hYWNfc291cmNlX2NhcHMgOiAmYTJkcF9hYWNfc2lua19jYXBzOwotCi0gIC8vIFNhdmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHkgPQotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XzsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5W0FWRFRfQ09ERUNfU0laRV07Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LCBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotCi0gIHRBMkRQX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9BYWMoJnBlZXJfaW5mb19jaWUsIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMsIHRydWUpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbid0IHBhcnNlIHBlZXIncyBjYXBhYmlsaXRpZXM6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkgLSBzYW1wbGUgcmF0ZQotICBzYW1wbGVSYXRlID0gcF9hMmRwX2FhY19jYXBzLT5zYW1wbGVSYXRlICYgcGVlcl9pbmZvX2NpZS5zYW1wbGVSYXRlOwotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDQxMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfODgyMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfOTYwMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGJpdHMgcGVyIHNhbXBsZQotICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBwX2EyZHBfYWFjX2NhcHMtPmJpdHNfcGVyX3NhbXBsZTsKLQotICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkgLSBjaGFubmVsIG1vZGUKLSAgY2hhbm5lbE1vZGUgPSBwX2EyZHBfYWFjX2NhcHMtPmNoYW5uZWxNb2RlICYgcGVlcl9pbmZvX2NpZS5jaGFubmVsTW9kZTsKLSAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk8pIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gIH0KLSAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICB9Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5IC0gdmFyaWFibGUgYml0cmF0ZSBtb2RlCi0gIHZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgPSBwX2EyZHBfYWFjX2NhcHMtPnZhcmlhYmxlQml0UmF0ZVN1cHBvcnQgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9pbmZvX2NpZS52YXJpYWJsZUJpdFJhdGVTdXBwb3J0OwotICBpZiAodmFyaWFibGVCaXRSYXRlU3VwcG9ydCAhPSBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9ESVNBQkxFRCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY29kZWNfc3BlY2lmaWNfMSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KEFhY0VuY29kZXJCaXRyYXRlTW9kZTo6QUFDRU5DX0JSX01PREVfVkJSXzUpOwotICB9IGVsc2UgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY29kZWNfc3BlY2lmaWNfMSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KEFhY0VuY29kZXJCaXRyYXRlTW9kZTo6QUFDRU5DX0JSX01PREVfQ0JSKTsKLSAgfQotCi0gIHN0YXR1cyA9IEEyRFBfQnVpbGRJbmZvQWFjKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJnBlZXJfaW5mb19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKTsKLSAgQ0hFQ0soc3RhdHVzID09IEEyRFBfU1VDQ0VTUyk7Ci0gIHJldHVybiB0cnVlOwotCi1mYWlsOgotICAvLyBSZXN0b3JlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfID0gc2F2ZWRfY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5OwotICBtZW1jcHkob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sIHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1BMmRwQ29kZWNDb25maWdBYWNTaW5rOjpBMmRwQ29kZWNDb25maWdBYWNTaW5rKAotICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KQotICAgIDogQTJkcENvZGVjQ29uZmlnQWFjQmFzZShCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmRleFN0ckFhY1NpbmsoKSwgY29kZWNfcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSB7fQotCi1BMmRwQ29kZWNDb25maWdBYWNTaW5rOjp+QTJkcENvZGVjQ29uZmlnQWFjU2luaygpIHt9Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQWFjU2luazo6aW5pdCgpIHsKLSAgaWYgKCFpc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLQotICAvLyBMb2FkIHRoZSBkZWNvZGVyCi0gIGlmICghQTJEUF9Mb2FkRGVjb2RlckFhYygpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGxvYWQgdGhlIGRlY29kZXIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQWFjU2luazo6dXNlUnRwSGVhZGVyTWFya2VyQml0KCkgY29uc3QgewotICAvLyBUT0RPOiBUaGlzIG1ldGhvZCBhcHBsaWVzIG9ubHkgdG8gU291cmNlIGNvZGVjcwotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfYWFjX2RlY29kZXIuY2MgYi9zdGFjay9hMmRwL2EyZHBfYWFjX2RlY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDBmNjEuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX2FhY19kZWNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImEyZHBfYWFjX2RlY29kZXIiCi0KLSNpbmNsdWRlICJhMmRwX2FhY19kZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxhYWNkZWNvZGVyX2xpYi5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiYTJkcF9hYWMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0jZGVmaW5lIERFQ09ERV9CVUZfTEVOICg4ICogMiAqIDEwMjQpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgSEFORExFX0FBQ0RFQ09ERVIgYWFjX2hhbmRsZTsKLSAgYm9vbCBoYXNfYWFjX2hhbmRsZTsgIC8vIFRydWUgaWYgYWFjX2hhbmRsZSBpcyB2YWxpZAotICBJTlRfUENNKiBkZWNvZGVfYnVmID0gbnVsbHB0cjsKLSAgZGVjb2RlZF9kYXRhX2NhbGxiYWNrX3QgZGVjb2RlX2NhbGxiYWNrOwotfSB0QTJEUF9BQUNfREVDT0RFUl9DQjsKLQotc3RhdGljIHRBMkRQX0FBQ19ERUNPREVSX0NCIGEyZHBfYWFjX2RlY29kZXJfY2I7Ci0KLWJvb2wgQTJEUF9Mb2FkRGVjb2RlckFhYyh2b2lkKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8gLSB0aGUgbGlicmFyeSBpcyBzdGF0aWNhbGx5IGxpbmtlZAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBMkRQX1VubG9hZERlY29kZXJBYWModm9pZCkgeyBhMmRwX2FhY19kZWNvZGVyX2NsZWFudXAoKTsgfQotCi1ib29sIGEyZHBfYWFjX2RlY29kZXJfaW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spIHsKLSAgYTJkcF9hYWNfZGVjb2Rlcl9jbGVhbnVwKCk7Ci0KLSAgYTJkcF9hYWNfZGVjb2Rlcl9jYi5hYWNfaGFuZGxlID0KLSAgICAgIGFhY0RlY29kZXJfT3BlbihUVF9NUDRfTEFUTV9NQ1AxLCAxIC8qIG5yT2ZMYXllcnMgKi8pOwotICBhMmRwX2FhY19kZWNvZGVyX2NiLmhhc19hYWNfaGFuZGxlID0gdHJ1ZTsKLSAgYTJkcF9hYWNfZGVjb2Rlcl9jYi5kZWNvZGVfYnVmID0gc3RhdGljX2Nhc3Q8SU5UX1BDTSo+KAotICAgICAgb3NpX21hbGxvYyhzaXplb2YoYTJkcF9hYWNfZGVjb2Rlcl9jYi5kZWNvZGVfYnVmWzBdKSAqIERFQ09ERV9CVUZfTEVOKSk7Ci0gIGEyZHBfYWFjX2RlY29kZXJfY2IuZGVjb2RlX2NhbGxiYWNrID0gZGVjb2RlX2NhbGxiYWNrOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBhMmRwX2FhY19kZWNvZGVyX2NsZWFudXAodm9pZCkgewotICBpZiAoYTJkcF9hYWNfZGVjb2Rlcl9jYi5oYXNfYWFjX2hhbmRsZSkKLSAgICBhYWNEZWNvZGVyX0Nsb3NlKGEyZHBfYWFjX2RlY29kZXJfY2IuYWFjX2hhbmRsZSk7Ci0gIG9zaV9mcmVlKGEyZHBfYWFjX2RlY29kZXJfY2IuZGVjb2RlX2J1Zik7Ci0gIG1lbXNldCgmYTJkcF9hYWNfZGVjb2Rlcl9jYiwgMCwgc2l6ZW9mKGEyZHBfYWFjX2RlY29kZXJfY2IpKTsKLX0KLQotYm9vbCBhMmRwX2FhY19kZWNvZGVyX2RlY29kZV9wYWNrZXQoQlRfSERSKiBwX2J1ZikgewotICBhdXRvKiBwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxVQ0hBUio+KHBfYnVmLT5kYXRhICsgcF9idWYtPm9mZnNldCk7Ci0gIFVJTlQgYnVmZmVyU2l6ZSA9IHBfYnVmLT5sZW47Ci0gIFVJTlQgYnl0ZXNWYWxpZCA9IHBfYnVmLT5sZW47Ci0gIHdoaWxlIChieXRlc1ZhbGlkID4gMCkgewotICAgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IGFhY0RlY29kZXJfRmlsbChhMmRwX2FhY19kZWNvZGVyX2NiLmFhY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLCAmYnVmZmVyU2l6ZSwgJmJ5dGVzVmFsaWQpOwotICAgIGlmIChlcnIgIT0gQUFDX0RFQ19PSykgewotICAgICAgTE9HX0VSUk9SKCIlczogYWFjRGVjb2Rlcl9GaWxsIGZhaWxlZDogMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihlcnIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgZXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShhMmRwX2FhY19kZWNvZGVyX2NiLmFhY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyZHBfYWFjX2RlY29kZXJfY2IuZGVjb2RlX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFX0JVRl9MRU4sIDAgLyogZmxhZ3MgKi8pOwotICAgICAgaWYgKGVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChlcnIgIT0gQUFDX0RFQ19PSykgewotICAgICAgICBMT0dfRVJST1IoIiVzOiBhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGZhaWxlZDogMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihlcnIpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIENTdHJlYW1JbmZvKiBpbmZvID0KLSAgICAgICAgICBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oYTJkcF9hYWNfZGVjb2Rlcl9jYi5hYWNfaGFuZGxlKTsKLSAgICAgIGlmICghaW5mbyB8fCBpbmZvLT5zYW1wbGVSYXRlIDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCIlczogSW52YWxpZCBzdHJlYW0gaW5mbyIsIF9fZnVuY19fKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHNpemVfdCBmcmFtZV9sZW4gPSBpbmZvLT5mcmFtZVNpemUgKiBpbmZvLT5udW1DaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGEyZHBfYWFjX2RlY29kZXJfY2IuZGVjb2RlX2J1ZlswXSk7Ci0gICAgICBhMmRwX2FhY19kZWNvZGVyX2NiLmRlY29kZV9jYWxsYmFjaygKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihhMmRwX2FhY19kZWNvZGVyX2NiLmRlY29kZV9idWYpLAotICAgICAgICAgIGZyYW1lX2xlbik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfYWFjX2VuY29kZXIuY2MgYi9zdGFjay9hMmRwL2EyZHBfYWFjX2VuY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGIxYTIuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX2FhY19lbmNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYTJkcF9hYWNfZW5jb2RlciIKLQotI2luY2x1ZGUgImEyZHBfYWFjX2VuY29kZXIuaCIKLQotI2luY2x1ZGUgPGFhY2VuY19saWIuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhMmRwX2FhYy5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vLwotLy8gRW5jb2RlciBmb3IgQUFDIFNvdXJjZSBDb2RlYwotLy8KLQotLy8gQTJEUCBBQUMgZW5jb2RlciBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMKLSNkZWZpbmUgQTJEUF9BQUNfRU5DT0RFUl9JTlRFUlZBTF9NUyAyMAotCi0vLyBvZmZzZXQKLSNpZiAoQlRBX0FWX0NPX0NQX1NDTVNfVCA9PSBUUlVFKQotI2RlZmluZSBBMkRQX0FBQ19PRkZTRVQgKEFWRFRfTUVESUFfT0ZGU0VUICsgMSkKLSNlbHNlCi0jZGVmaW5lIEEyRFBfQUFDX09GRlNFVCBBVkRUX01FRElBX09GRlNFVAotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0gIHVpbnQ4X3QgY2hhbm5lbF9tb2RlOwotICB1aW50OF90IGJpdHNfcGVyX3NhbXBsZTsKLSAgdWludDMyX3QgZnJhbWVfbGVuZ3RoOyAgICAgICAgIC8vIFNhbXBsZXMgcGVyIGNoYW5uZWwgaW4gYSBmcmFtZQotICB1aW50OF90IGlucHV0X2NoYW5uZWxzX247ICAgICAgLy8gTnVtYmVyIG9mIGNoYW5uZWxzCi0gIGludCBtYXhfZW5jb2RlZF9idWZmZXJfYnl0ZXM7ICAvLyBNYXggZW5jb2RlZCBieXRlcyBwZXIgZnJhbWUKLX0gdEEyRFBfQUFDX0VOQ09ERVJfUEFSQU1TOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGZsb2F0IGNvdW50ZXI7Ci0gIHVpbnQzMl90IGJ5dGVzX3Blcl90aWNrOyAvKiBwY20gYnl0ZXMgcmVhZCBlYWNoIG1lZGlhIHRhc2sgdGljayAqLwotICB1aW50NjRfdCBsYXN0X2ZyYW1lX3VzOwotfSB0QTJEUF9BQUNfRkVFRElOR19TVEFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50NjRfdCBzZXNzaW9uX3N0YXJ0X3VzOwotCi0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3BhY2tldHM7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRzX2NvdW50OwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkX2J5dGVzOwotCi0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0czsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRzX2NvdW50OwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZF9ieXRlczsKLX0gYTJkcF9hYWNfZW5jb2Rlcl9zdGF0c190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCByZWFkX2NhbGxiYWNrOwotICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjazsKLSAgdWludDE2X3QgVHhBYU10dVNpemU7Ci0KLSAgYm9vbCB1c2VfU0NNU19UOwotICB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMgcGVlcl9wYXJhbXM7Ci0gIHVpbnQzMl90IHRpbWVzdGFtcDsgICAgICAgIC8vIFRpbWVzdGFtcCBmb3IgdGhlIEEyRFAgZnJhbWVzCi0KLSAgSEFORExFX0FBQ0VOQ09ERVIgYWFjX2hhbmRsZTsKLSAgYm9vbCBoYXNfYWFjX2hhbmRsZTsgIC8vIFRydWUgaWYgYWFjX2hhbmRsZSBpcyB2YWxpZAotCi0gIHRBMkRQX0ZFRURJTkdfUEFSQU1TIGZlZWRpbmdfcGFyYW1zOwotICB0QTJEUF9BQUNfRU5DT0RFUl9QQVJBTVMgYWFjX2VuY29kZXJfcGFyYW1zOwotICB0QTJEUF9BQUNfRkVFRElOR19TVEFURSBhYWNfZmVlZGluZ19zdGF0ZTsKLQotICBhMmRwX2FhY19lbmNvZGVyX3N0YXRzX3Qgc3RhdHM7Ci19IHRBMkRQX0FBQ19FTkNPREVSX0NCOwotCi1zdGF0aWMgdEEyRFBfQUFDX0VOQ09ERVJfQ0IgYTJkcF9hYWNfZW5jb2Rlcl9jYjsKLQotc3RhdGljIHVpbnQzMl90IGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXMgPSBBMkRQX0FBQ19FTkNPREVSX0lOVEVSVkFMX01TOwotCi1zdGF0aWMgdm9pZCBhMmRwX2FhY19lbmNvZGVyX3VwZGF0ZShBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9yZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfY29uZmlnX3VwZGF0ZWQpOwotc3RhdGljIHZvaWQgYTJkcF9hYWNfZ2V0X251bV9mcmFtZV9pdGVyYXRpb24odWludDhfdCogbnVtX29mX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBudW1fb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wX3VzKTsKLXN0YXRpYyB2b2lkIGEyZHBfYWFjX2VuY29kZV9mcmFtZXModWludDhfdCBuYl9mcmFtZSk7Ci1zdGF0aWMgYm9vbCBhMmRwX2FhY19yZWFkX2ZlZWRpbmcodWludDhfdCogcmVhZF9idWZmZXIsIHVpbnQzMl90KiBieXRlc19yZWFkKTsKLXN0YXRpYyB1aW50MTZfdCBhZGp1c3RfZWZmZWN0aXZlX210dSgKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMmIHBlZXJfcGFyYW1zKTsKLQotYm9vbCBBMkRQX0xvYWRFbmNvZGVyQWFjKHZvaWQpIHsKLSAgLy8gTm90aGluZyB0byBkbyAtIHRoZSBsaWJyYXJ5IGlzIHN0YXRpY2FsbHkgbGlua2VkCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEEyRFBfVW5sb2FkRW5jb2RlckFhYyh2b2lkKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8gLSB0aGUgbGlicmFyeSBpcyBzdGF0aWNhbGx5IGxpbmtlZAotICBpZiAoYTJkcF9hYWNfZW5jb2Rlcl9jYi5oYXNfYWFjX2hhbmRsZSkKLSAgICBhYWNFbmNDbG9zZSgmYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfaGFuZGxlKTsKLSAgbWVtc2V0KCZhMmRwX2FhY19lbmNvZGVyX2NiLCAwLCBzaXplb2YoYTJkcF9hYWNfZW5jb2Rlcl9jYikpOwotfQotCi12b2lkIGEyZHBfYWFjX2VuY29kZXJfaW5pdChjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjaykgewotICBpZiAoYTJkcF9hYWNfZW5jb2Rlcl9jYi5oYXNfYWFjX2hhbmRsZSkKLSAgICBhYWNFbmNDbG9zZSgmYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfaGFuZGxlKTsKLSAgbWVtc2V0KCZhMmRwX2FhY19lbmNvZGVyX2NiLCAwLCBzaXplb2YoYTJkcF9hYWNfZW5jb2Rlcl9jYikpOwotCi0gIGEyZHBfYWFjX2VuY29kZXJfY2Iuc3RhdHMuc2Vzc2lvbl9zdGFydF91cyA9Ci0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLQotICBhMmRwX2FhY19lbmNvZGVyX2NiLnJlYWRfY2FsbGJhY2sgPSByZWFkX2NhbGxiYWNrOwotICBhMmRwX2FhY19lbmNvZGVyX2NiLmVucXVldWVfY2FsbGJhY2sgPSBlbnF1ZXVlX2NhbGxiYWNrOwotICBhMmRwX2FhY19lbmNvZGVyX2NiLnBlZXJfcGFyYW1zID0gKnBfcGVlcl9wYXJhbXM7Ci0gIGEyZHBfYWFjX2VuY29kZXJfY2IudGltZXN0YW1wID0gMDsKLQotICBhMmRwX2FhY19lbmNvZGVyX2NiLnVzZV9TQ01TX1QgPSBmYWxzZTsgIC8vIFRPRE86IHNob3VsZCBiZSBhIHBhcmFtZXRlcgotI2lmIChCVEFfQVZfQ09fQ1BfU0NNU19UID09IFRSVUUpCi0gIGEyZHBfYWFjX2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IHRydWU7Ci0jZW5kaWYKLQotICAvLyBOT1RFOiBJZ25vcmUgdGhlIHJlc3RhcnRfaW5wdXQgLyByZXN0YXJ0X291dHB1dCBmbGFncyAtIHRoaXMgaW5pdGl6YXRpb24KLSAgLy8gaGFwcGVucyB3aGVuIHRoZSBhdWRpbyBzZXNzaW9uIGlzIChyZSlzdGFydGVkLgotICBib29sIHJlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGEyZHBfYWFjX2VuY29kZXJfdXBkYXRlKGEyZHBfY29kZWNfY29uZmlnLCAmcmVzdGFydF9pbnB1dCwgJnJlc3RhcnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnX3VwZGF0ZWQpOwotfQotCi0vLyBVcGRhdGUgdGhlIEEyRFAgQUFDIGVuY29kZXIuCi0vLyB8YTJkcF9jb2RlY19jb25maWd8IGlzIHRoZSBBMkRQIGNvZGVjIHRvIHVzZSBmb3IgdGhlIHVwZGF0ZS4KLXN0YXRpYyB2b2lkIGEyZHBfYWFjX2VuY29kZXJfdXBkYXRlKEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9jb25maWdfdXBkYXRlZCkgewotICB0QTJEUF9BQUNfRU5DT0RFUl9QQVJBTVMqIHBfZW5jb2Rlcl9wYXJhbXMgPQotICAgICAgJmEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2VuY29kZXJfcGFyYW1zOwotICB1aW50OF90IGNvZGVjX2luZm9bQVZEVF9DT0RFQ19TSVpFXTsKLSAgQUFDRU5DX0VSUk9SIGFhY19lcnJvcjsKLSAgaW50IGFhY19wYXJhbV92YWx1ZSwgYWFjX3NhbXBsaW5nX2ZyZXEsIGFhY19wZWFrX2JpdF9yYXRlOwotCi0gICpwX3Jlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgKnBfcmVzdGFydF9vdXRwdXQgPSBmYWxzZTsKLSAgKnBfY29uZmlnX3VwZGF0ZWQgPSBmYWxzZTsKLQotICBpZiAoIWEyZHBfYWFjX2VuY29kZXJfY2IuaGFzX2FhY19oYW5kbGUpIHsKLSAgICBBQUNFTkNfRVJST1IgYWFjX2Vycm9yID0gYWFjRW5jT3BlbigmYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfaGFuZGxlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLyogbWF4IDIgY2hhbm5lbHM6IHN0ZXJlbyAqLyk7Ci0gICAgaWYgKGFhY19lcnJvciAhPSBBQUNFTkNfT0spIHsKLSAgICAgIExPR19FUlJPUigiJXM6IENhbm5vdCBvcGVuIEFBQyBlbmNvZGVyIGhhbmRsZTogQUFDIGVycm9yIDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBhYWNfZXJyb3IpOwotICAgICAgcmV0dXJuOyAgLy8gVE9ETzogUmV0dXJuIGFuIGVycm9yPwotICAgIH0KLSAgICBhMmRwX2FhY19lbmNvZGVyX2NiLmhhc19hYWNfaGFuZGxlID0gdHJ1ZTsKLSAgfQotCi0gIGlmICghYTJkcF9jb2RlY19jb25maWctPmNvcHlPdXRPdGFDb2RlY0NvbmZpZyhjb2RlY19pbmZvKSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3QgdXBkYXRlIHRoZSBjb2RlYyBlbmNvZGVyIGZvciAlczogIgotICAgICAgICAiaW52YWxpZCBjb2RlYyBjb25maWciLAotICAgICAgICBfX2Z1bmNfXywgYTJkcF9jb2RlY19jb25maWctPm5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvID0gY29kZWNfaW5mbzsKLQotICAvLyBUaGUgZmVlZGluZyBwYXJhbWV0ZXJzCi0gIHRBMkRQX0ZFRURJTkdfUEFSQU1TKiBwX2ZlZWRpbmdfcGFyYW1zID0gJmEyZHBfYWFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXM7Ci0gIHBfZmVlZGluZ19wYXJhbXMtPnNhbXBsZV9yYXRlID0gQTJEUF9HZXRUcmFja1NhbXBsZVJhdGVBYWMocF9jb2RlY19pbmZvKTsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlID0KLSAgICAgIGEyZHBfY29kZWNfY29uZmlnLT5nZXRBdWRpb0JpdHNQZXJTYW1wbGUoKTsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+Y2hhbm5lbF9jb3VudCA9IEEyRFBfR2V0VHJhY2tDaGFubmVsQ291bnRBYWMocF9jb2RlY19pbmZvKTsKLSAgTE9HX0lORk8oIiVzOiBzYW1wbGVfcmF0ZT0ldSBiaXRzX3Blcl9zYW1wbGU9JXUgY2hhbm5lbF9jb3VudD0ldSIsIF9fZnVuY19fLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5jaGFubmVsX2NvdW50KTsKLQotICAvLyBUaGUgY29kZWMgcGFyYW1ldGVycwotICBwX2VuY29kZXJfcGFyYW1zLT5zYW1wbGVfcmF0ZSA9Ci0gICAgICBhMmRwX2FhY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLnNhbXBsZV9yYXRlOwotICBwX2VuY29kZXJfcGFyYW1zLT5jaGFubmVsX21vZGUgPSBBMkRQX0dldENoYW5uZWxNb2RlQ29kZUFhYyhwX2NvZGVjX2luZm8pOwotCi0gIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyYgcGVlcl9wYXJhbXMgPQotICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5wZWVyX3BhcmFtczsKLSAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5UeEFhTXR1U2l6ZSA9IGFkanVzdF9lZmZlY3RpdmVfbXR1KHBlZXJfcGFyYW1zKTsKLSAgTE9HX0lORk8oIiVzOiBNVFU9JWQsIHBlZXJfbXR1PSVkIiwgX19mdW5jX18sIGEyZHBfYWFjX2VuY29kZXJfY2IuVHhBYU10dVNpemUsCi0gICAgICAgICAgIHBlZXJfcGFyYW1zLnBlZXJfbXR1KTsKLSAgTE9HX0lORk8oIiVzOiBzYW1wbGVfcmF0ZTogJWQgY2hhbm5lbF9tb2RlOiAlZCAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+c2FtcGxlX3JhdGUsIHBfZW5jb2Rlcl9wYXJhbXMtPmNoYW5uZWxfbW9kZSk7Ci0KLSAgLy8gU2V0IHRoZSBlbmNvZGVyJ3MgcGFyYW1ldGVyczogQXVkaW8gT2JqZWN0IFR5cGUgLSBNQU5EQVRPUlkKLSAgLy8gQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzJfTEMgLT4gQU9UX0FBQ19MQwotICAvLyBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9MQyAtPiBBT1RfQUFDX0xDCi0gIC8vIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xUUCAtPiBBT1RfQUFDX0xUUAotICAvLyBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9TQ0FMQUJMRSAtPiBBT1RfQUFDX1NDQUwKLSAgYWFjX3BhcmFtX3ZhbHVlID0gQU9UX0FBQ19MQzsKLSAgaW50IG9iamVjdF90eXBlID0gQTJEUF9HZXRPYmplY3RUeXBlQ29kZUFhYyhwX2NvZGVjX2luZm8pOwotICBzd2l0Y2ggKG9iamVjdF90eXBlKSB7Ci0gICAgY2FzZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQzoKLSAgICAgIGFhY19wYXJhbV92YWx1ZSA9IEFPVF9BQUNfTEM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xDOgotICAgICAgYWFjX3BhcmFtX3ZhbHVlID0gQU9UX0FBQ19MQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzRfTFRQOgotICAgICAgYWFjX3BhcmFtX3ZhbHVlID0gQU9UX0FBQ19MVFA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X1NDQUxBQkxFOgotICAgICAgYWFjX3BhcmFtX3ZhbHVlID0gQU9UX0FBQ19TQ0FMOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAiJXM6IENhbm5vdCBzZXQgQUFDIHBhcmFtZXRlciBBQUNFTkNfQU9UOiAiCi0gICAgICAgICAgImludmFsaWQgb2JqZWN0IHR5cGUgJWQiLAotICAgICAgICAgIF9fZnVuY19fLCBvYmplY3RfdHlwZSk7Ci0gICAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLSAgYWFjX2Vycm9yID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUsIEFBQ0VOQ19BT1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjX3BhcmFtX3ZhbHVlKTsKLSAgaWYgKGFhY19lcnJvciAhPSBBQUNFTkNfT0spIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogQ2Fubm90IHNldCBBQUMgcGFyYW1ldGVyIEFBQ0VOQ19BT1QgdG8gJWQ6ICIKLSAgICAgICAgIkFBQyBlcnJvciAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGFhY19wYXJhbV92YWx1ZSwgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBTZXQgdGhlIGVuY29kZXIncyBwYXJhbWV0ZXJzOiBhdWRpb011eFZlcnNpb24KLSAgYWFjX3BhcmFtX3ZhbHVlID0gMjsgIC8vIGF1ZGlvTXV4VmVyc2lvbiA9ICIyIgotICBhYWNfZXJyb3IgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQVVESU9NVVhWRVIsIGFhY19wYXJhbV92YWx1ZSk7Ci0gIGlmIChhYWNfZXJyb3IgIT0gQUFDRU5DX09LKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IENhbm5vdCBzZXQgQUFDIHBhcmFtZXRlciBBQUNFTkNfQVVESU9NVVhWRVIgdG8gJWQ6ICIKLSAgICAgICAgIkFBQyBlcnJvciAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGFhY19wYXJhbV92YWx1ZSwgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBTZXQgdGhlIGVuY29kZXIncyBwYXJhbWV0ZXJzOiBTaWduYWxpbmcgbW9kZSBvZiB0aGUgZXh0ZW5zaW9uIEFPVAotICBhYWNfcGFyYW1fdmFsdWUgPSAxOyAgLy8gU2lnbmFsaW5nIG1vZGUgb2YgdGhlIGV4dGVuc2lvbiBBT1QgPSAxCi0gIGFhY19lcnJvciA9IGFhY0VuY29kZXJfU2V0UGFyYW0oYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19TSUdOQUxJTkdfTU9ERSwgYWFjX3BhcmFtX3ZhbHVlKTsKLSAgaWYgKGFhY19lcnJvciAhPSBBQUNFTkNfT0spIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogQ2Fubm90IHNldCBBQUMgcGFyYW1ldGVyIEFBQ0VOQ19TSUdOQUxJTkdfTU9ERSB0byAlZDogIgotICAgICAgICAiQUFDIGVycm9yIDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgYWFjX3BhcmFtX3ZhbHVlLCBhYWNfZXJyb3IpOwotICAgIHJldHVybjsgIC8vIFRPRE86IFJldHVybiBhbiBlcnJvcj8KLSAgfQotCi0gIC8vIFNldCB0aGUgZW5jb2RlcidzIHBhcmFtZXRlcnM6IFNhbXBsZSBSYXRlIC0gTUFOREFUT1JZCi0gIGFhY19wYXJhbV92YWx1ZSA9IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlQWFjKHBfY29kZWNfaW5mbyk7Ci0gIGFhY19lcnJvciA9IGFhY0VuY29kZXJfU2V0UGFyYW0oYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19TQU1QTEVSQVRFLCBhYWNfcGFyYW1fdmFsdWUpOwotICBpZiAoYWFjX2Vycm9yICE9IEFBQ0VOQ19PSykgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3Qgc2V0IEFBQyBwYXJhbWV0ZXIgQUFDRU5DX1NBTVBMRVJBVEUgdG8gJWQ6ICIKLSAgICAgICAgIkFBQyBlcnJvciAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGFhY19wYXJhbV92YWx1ZSwgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLSAgYWFjX3NhbXBsaW5nX2ZyZXEgPSBhYWNfcGFyYW1fdmFsdWU7ICAvLyBTYXZlIGZvciBleHRyYSB1c2FnZSBiZWxvdwotCi0gIC8vIFNldCB0aGUgZW5jb2RlcidzIHBhcmFtZXRlcnM6IEJpdCBSYXRlIC0gTUFOREFUT1JZCi0gIGFhY19wYXJhbV92YWx1ZSA9IEEyRFBfR2V0Qml0UmF0ZUFhYyhwX2NvZGVjX2luZm8pOwotICAvLyBDYWxjdWxhdGUgdGhlIGJpdCByYXRlIGZyb20gTVRVIGFuZCBzYW1wbGluZyBmcmVxdWVuY3kKLSAgYWFjX3BlYWtfYml0X3JhdGUgPQotICAgICAgQTJEUF9Db21wdXRlTWF4Qml0UmF0ZUFhYyhwX2NvZGVjX2luZm8sIGEyZHBfYWFjX2VuY29kZXJfY2IuVHhBYU10dVNpemUpOwotICBhYWNfcGFyYW1fdmFsdWUgPSBzdGQ6Om1pbihhYWNfcGFyYW1fdmFsdWUsIGFhY19wZWFrX2JpdF9yYXRlKTsKLSAgTE9HX0lORk8oIiVzOiBNVFUgPSAlZCBTYW1wbGluZyBGcmVxdWVuY3kgPSAlZCBCaXQgUmF0ZSA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgIGEyZHBfYWFjX2VuY29kZXJfY2IuVHhBYU10dVNpemUsIGFhY19zYW1wbGluZ19mcmVxLCBhYWNfcGFyYW1fdmFsdWUpOwotICBpZiAoYWFjX3BhcmFtX3ZhbHVlID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IENhbm5vdCBzZXQgQUFDIHBhcmFtZXRlciBBQUNFTkNfQklUUkFURTogIgotICAgICAgICAiaW52YWxpZCBjb2RlYyBiaXQgcmF0ZSIsCi0gICAgICAgIF9fZnVuY19fKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLSAgYWFjX2Vycm9yID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0JJVFJBVEUsIGFhY19wYXJhbV92YWx1ZSk7Ci0gIGlmIChhYWNfZXJyb3IgIT0gQUFDRU5DX09LKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IENhbm5vdCBzZXQgQUFDIHBhcmFtZXRlciBBQUNFTkNfQklUUkFURSB0byAlZDogIgotICAgICAgICAiQUFDIGVycm9yIDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgYWFjX3BhcmFtX3ZhbHVlLCBhYWNfZXJyb3IpOwotICAgIHJldHVybjsgIC8vIFRPRE86IFJldHVybiBhbiBlcnJvcj8KLSAgfQotCi0gIC8vIFNldCB0aGUgZW5jb2RlcidzIHBhcmFtZXRlcnM6IFBFQUsgQml0IFJhdGUKLSAgYWFjX2Vycm9yID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX1BFQUtfQklUUkFURSwgYWFjX3BlYWtfYml0X3JhdGUpOwotICBpZiAoYWFjX2Vycm9yICE9IEFBQ0VOQ19PSykgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3Qgc2V0IEFBQyBwYXJhbWV0ZXIgQUFDRU5DX1BFQUtfQklUUkFURSB0byAlZDogIgotICAgICAgICAiQUFDIGVycm9yIDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgYWFjX3BlYWtfYml0X3JhdGUsIGFhY19lcnJvcik7Ci0gICAgcmV0dXJuOyAgLy8gVE9ETzogUmV0dXJuIGFuIGVycm9yPwotICB9Ci0KLSAgLy8gU2V0IHRoZSBlbmNvZGVyJ3MgcGFyYW1ldGVyczogQ2hhbm5lbCBNb2RlIC0gTUFOREFUT1JZCi0gIGlmIChBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50QWFjKHBfY29kZWNfaW5mbykgPT0gMSkgewotICAgIGFhY19wYXJhbV92YWx1ZSA9IE1PREVfMTsgIC8vIE1vbm8KLSAgfSBlbHNlIHsKLSAgICBhYWNfcGFyYW1fdmFsdWUgPSBNT0RFXzI7ICAvLyBTdGVyZW8KLSAgfQotICBhYWNfZXJyb3IgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQ0hBTk5FTE1PREUsIGFhY19wYXJhbV92YWx1ZSk7Ci0gIGlmIChhYWNfZXJyb3IgIT0gQUFDRU5DX09LKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IENhbm5vdCBzZXQgQUFDIHBhcmFtZXRlciBBQUNFTkNfQ0hBTk5FTE1PREUgdG8gJWQ6ICIKLSAgICAgICAgIkFBQyBlcnJvciAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGFhY19wYXJhbV92YWx1ZSwgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBTZXQgdGhlIGVuY29kZXIncyBwYXJhbWV0ZXJzOiBUcmFuc3BvcnQgVHlwZQotICBhYWNfcGFyYW1fdmFsdWUgPSBUVF9NUDRfTEFUTV9NQ1AxOyAgLy8gbXV4Q29uZmlnUHJlc2VudCA9IDEKLSAgYWFjX2Vycm9yID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX1RSQU5TTVVYLCBhYWNfcGFyYW1fdmFsdWUpOwotICBpZiAoYWFjX2Vycm9yICE9IEFBQ0VOQ19PSykgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3Qgc2V0IEFBQyBwYXJhbWV0ZXIgQUFDRU5DX1RSQU5TTVVYIHRvICVkOiAiCi0gICAgICAgICJBQUMgZXJyb3IgMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBhYWNfcGFyYW1fdmFsdWUsIGFhY19lcnJvcik7Ci0gICAgcmV0dXJuOyAgLy8gVE9ETzogUmV0dXJuIGFuIGVycm9yPwotICB9Ci0KLSAgLy8gU2V0IHRoZSBlbmNvZGVyJ3MgcGFyYW1ldGVyczogSGVhZGVyIFBlcmlvZAotICBhYWNfcGFyYW1fdmFsdWUgPSAxOwotICBhYWNfZXJyb3IgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfSEVBREVSX1BFUklPRCwgYWFjX3BhcmFtX3ZhbHVlKTsKLSAgaWYgKGFhY19lcnJvciAhPSBBQUNFTkNfT0spIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogQ2Fubm90IHNldCBBQUMgcGFyYW1ldGVyIEFBQ0VOQ19IRUFERVJfUEVSSU9EIHRvICVkOiAiCi0gICAgICAgICJBQUMgZXJyb3IgMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBhYWNfcGFyYW1fdmFsdWUsIGFhY19lcnJvcik7Ci0gICAgcmV0dXJuOyAgLy8gVE9ETzogUmV0dXJuIGFuIGVycm9yPwotICB9Ci0KLSAgLy8gU2V0IHRoZSBlbmNvZGVyJ3MgcGFyYW1ldGVyczogVmFyaWFibGUgQml0IFJhdGUgU3VwcG9ydAotICBhYWNfcGFyYW1fdmFsdWUgPSBBMkRQX0dldFZhcmlhYmxlQml0UmF0ZVN1cHBvcnRBYWMocF9jb2RlY19pbmZvKTsKLSAgaWYgKGFhY19wYXJhbV92YWx1ZSA9PSAtMSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3Qgc2V0IEFBQyBwYXJhbWV0ZXIgQUFDRU5DX0JJVFJBVEVNT0RFOiAiCi0gICAgICAgICJpbnZhbGlkIGNvZGVjIGJpdCByYXRlIG1vZGUiLAotICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOyAgLy8gVE9ETzogUmV0dXJuIGFuIGVycm9yPwotICB9IGVsc2UgaWYgKGFhY19wYXJhbV92YWx1ZSA9PSBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9FTkFCTEVEKSB7Ci0gICAgLy8gVkJSIGhhcyA1IG1vZGVzIGRlZmluZWQgaW4gZXh0ZXJuYWwvYWFjL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmgKLSAgICAvLyBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9ESVNBQkxFRCBpcyBlcXVhbCB0byBBQUNFTkNfQlJfTU9ERV9DQlIKLSAgICBhdXRvIGJpdHJhdGVfbW9kZSA9IGEyZHBfY29kZWNfY29uZmlnLT5nZXRDb2RlY0NvbmZpZygpLmNvZGVjX3NwZWNpZmljXzE7Ci0gICAgc3dpdGNoIChzdGF0aWNfY2FzdDxBYWNFbmNvZGVyQml0cmF0ZU1vZGU+KGJpdHJhdGVfbW9kZSkpIHsKLSAgICAgIGNhc2UgQWFjRW5jb2RlckJpdHJhdGVNb2RlOjpBQUNFTkNfQlJfTU9ERV9WQlJfMToKLSAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl8yOgotICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICBjYXNlIEFhY0VuY29kZXJCaXRyYXRlTW9kZTo6QUFDRU5DX0JSX01PREVfVkJSXzM6Ci0gICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgIGNhc2UgQWFjRW5jb2RlckJpdHJhdGVNb2RlOjpBQUNFTkNfQlJfTU9ERV9WQlJfNDoKLSAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgICAgY2FzZSBBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl81OgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJpdHJhdGVfbW9kZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihBYWNFbmNvZGVyQml0cmF0ZU1vZGU6OkFBQ0VOQ19CUl9NT0RFX1ZCUl81KTsKLSAgICB9Ci0gICAgYWFjX3BhcmFtX3ZhbHVlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oYml0cmF0ZV9tb2RlKSAmIH5BMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9NQVNLOwotICB9Ci0gIExPR19JTkZPKCIlczogQUFDRU5DX0JJVFJBVEVNT0RFOiAlZCIsIF9fZnVuY19fLCBhYWNfcGFyYW1fdmFsdWUpOwotICBhYWNfZXJyb3IgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQklUUkFURU1PREUsIGFhY19wYXJhbV92YWx1ZSk7Ci0gIGlmIChhYWNfZXJyb3IgIT0gQUFDRU5DX09LKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IENhbm5vdCBzZXQgQUFDIHBhcmFtZXRlciBBQUNFTkNfQklUUkFURU1PREUgdG8gJWQ6ICIKLSAgICAgICAgIkFBQyBlcnJvciAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGFhY19wYXJhbV92YWx1ZSwgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBNYXJrIHRoZSBlbmQgb2Ygc2V0dGluZyB0aGUgZW5jb2RlcidzIHBhcmFtZXRlcnMKLSAgYWFjX2Vycm9yID0KLSAgICAgIGFhY0VuY0VuY29kZShhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICBpZiAoYWFjX2Vycm9yICE9IEFBQ0VOQ19PSykgewotICAgIExPR19FUlJPUigiJXM6IENhbm5vdCBjb21wbGV0ZSBzZXR0aW5nIHRoZSBBQUMgcGFyYW1ldGVyczogQUFDIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBSZXRyaWV2ZSB0aGUgZW5jb2RlciBpbmZvIHNvIHdlIGNhbiBzYXZlIHRoZSBmcmFtZSBsZW5ndGgKLSAgQUFDRU5DX0luZm9TdHJ1Y3QgYWFjX2luZm87Ci0gIGFhY19lcnJvciA9IGFhY0VuY0luZm8oYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfaGFuZGxlLCAmYWFjX2luZm8pOwotICBpZiAoYWFjX2Vycm9yICE9IEFBQ0VOQ19PSykgewotICAgIExPR19FUlJPUigiJXM6IENhbm5vdCByZXRyaWV2ZSB0aGUgQUFDIGVuY29kZXIgaW5mbzogQUFDIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgYWFjX2Vycm9yKTsKLSAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLSAgcF9lbmNvZGVyX3BhcmFtcy0+ZnJhbWVfbGVuZ3RoID0gYWFjX2luZm8uZnJhbWVMZW5ndGg7Ci0gIHBfZW5jb2Rlcl9wYXJhbXMtPmlucHV0X2NoYW5uZWxzX24gPSBhYWNfaW5mby5pbnB1dENoYW5uZWxzOwotICBwX2VuY29kZXJfcGFyYW1zLT5tYXhfZW5jb2RlZF9idWZmZXJfYnl0ZXMgPSBhYWNfaW5mby5tYXhPdXRCdWZCeXRlczsKLSAgTE9HX0lORk8oCi0gICAgICAiJXM6IEFBQyBmcmFtZV9sZW5ndGggPSAldSBpbnB1dF9jaGFubmVsc19uID0gJXUgIgotICAgICAgIm1heF9lbmNvZGVkX2J1ZmZlcl9ieXRlcyA9ICVkIiwKLSAgICAgIF9fZnVuY19fLCBwX2VuY29kZXJfcGFyYW1zLT5mcmFtZV9sZW5ndGgsCi0gICAgICBwX2VuY29kZXJfcGFyYW1zLT5pbnB1dF9jaGFubmVsc19uLAotICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+bWF4X2VuY29kZWRfYnVmZmVyX2J5dGVzKTsKLQotICAvLyBBZnRlciBlbmNvZGVyIHBhcmFtcyByZWFkeSwgcmVzZXQgdGhlIGZlZWRpbmcgc3RhdGUgYW5kIGl0cyBpbnRlcnZhbC4KLSAgYTJkcF9hYWNfZmVlZGluZ19yZXNldCgpOwotfQotCi12b2lkIGEyZHBfYWFjX2VuY29kZXJfY2xlYW51cCh2b2lkKSB7Ci0gIGlmIChhMmRwX2FhY19lbmNvZGVyX2NiLmhhc19hYWNfaGFuZGxlKQotICAgIGFhY0VuY0Nsb3NlKCZhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUpOwotICBtZW1zZXQoJmEyZHBfYWFjX2VuY29kZXJfY2IsIDAsIHNpemVvZihhMmRwX2FhY19lbmNvZGVyX2NiKSk7Ci19Ci0KLXZvaWQgYTJkcF9hYWNfZmVlZGluZ19yZXNldCh2b2lkKSB7Ci0gIGF1dG8gZnJhbWVfbGVuZ3RoID0gYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZW5jb2Rlcl9wYXJhbXMuZnJhbWVfbGVuZ3RoOwotICBhdXRvIHNhbXBsZV9yYXRlID0gYTJkcF9hYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5zYW1wbGVfcmF0ZTsKLSAgaWYgKGZyYW1lX2xlbmd0aCA9PSAwIHx8IHNhbXBsZV9yYXRlID09IDApIHsKLSAgICBMT0dfV0FSTigiJXM6IEFBQyBlbmNvZGVyIGlzIG5vdCBjb25maWd1cmVkIiwgX19mdW5jX18pOwotICAgIGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXMgPSBBMkRQX0FBQ19FTkNPREVSX0lOVEVSVkFMX01TOwotICB9IGVsc2UgewotICAgIC8vIFBDTSBkYXRhIHNpemUgcGVyIEFBQyBmcmFtZSAoYml0cykKLSAgICAvLyA9IGFhY19lbmNvZGVyX3BhcmFtcy5mcmFtZV9sZW5ndGggKiBmZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUKLSAgICAvLyAgICogZmVlZGluZ19wYXJhbXMuY2hhbm5lbF9jb3VudAotICAgIC8vID0gZmVlZGluZ19wYXJhbXMuc2FtcGxlX3JhdGUgKiBmZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUKLSAgICAvLyAgICogZmVlZGluZ19wYXJhbXMuY2hhbm5lbF9jb3VudCAqIChUX2ludGVydmFsX21zIC8gMTAwMCk7Ci0gICAgLy8gSGVyZSB3ZSB1c2UgdGhlIG5lYXJlc3QgaW50ZWdlciBub3QgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZS4KLSAgICBhMmRwX2FhY19lbmNvZGVyX2ludGVydmFsX21zID0gZnJhbWVfbGVuZ3RoICogMTAwMCAvIHNhbXBsZV9yYXRlOwotICAgIGlmIChhMmRwX2FhY19lbmNvZGVyX2ludGVydmFsX21zIDwgQTJEUF9BQUNfRU5DT0RFUl9JTlRFUlZBTF9NUykKLSAgICAgIGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXMgPSBBMkRQX0FBQ19FTkNPREVSX0lOVEVSVkFMX01TOwotICB9Ci0KLSAgLyogQnkgZGVmYXVsdCwganVzdCBjbGVhciB0aGUgZW50aXJlIHN0YXRlICovCi0gIG1lbXNldCgmYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZmVlZGluZ19zdGF0ZSwgMCwKLSAgICAgICAgIHNpemVvZihhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19mZWVkaW5nX3N0YXRlKSk7Ci0KLSAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZmVlZGluZ19zdGF0ZS5ieXRlc19wZXJfdGljayA9Ci0gICAgICAoYTJkcF9hYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5zYW1wbGVfcmF0ZSAqCi0gICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUgLyA4ICoKLSAgICAgICBhMmRwX2FhY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLmNoYW5uZWxfY291bnQgKgotICAgICAgIGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXMpIC8KLSAgICAgIDEwMDA7Ci0KLSAgTE9HX0lORk8oIiVzOiBQQ00gYnl0ZXMgJXUgcGVyIHRpY2sgJXUgbXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZmVlZGluZ19zdGF0ZS5ieXRlc19wZXJfdGljaywKLSAgICAgICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9pbnRlcnZhbF9tcyk7Ci19Ci0KLXZvaWQgYTJkcF9hYWNfZmVlZGluZ19mbHVzaCh2b2lkKSB7Ci0gIGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2ZlZWRpbmdfc3RhdGUuY291bnRlciA9IDAuMGY7Ci19Ci0KLXVpbnQ2NF90IGEyZHBfYWFjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKHZvaWQpIHsKLSAgcmV0dXJuIGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXM7Ci19Ci0KLWludCBhMmRwX2FhY19nZXRfZWZmZWN0aXZlX2ZyYW1lX3NpemUoKSB7Ci0gIHJldHVybiBhMmRwX2FhY19lbmNvZGVyX2NiLlR4QWFNdHVTaXplOwotfQotCi12b2lkIGEyZHBfYWFjX3NlbmRfZnJhbWVzKHVpbnQ2NF90IHRpbWVzdGFtcF91cykgewotICB1aW50OF90IG5iX2ZyYW1lID0gMDsKLSAgdWludDhfdCBuYl9pdGVyYXRpb25zID0gMDsKLQotICBhMmRwX2FhY19nZXRfbnVtX2ZyYW1lX2l0ZXJhdGlvbigmbmJfaXRlcmF0aW9ucywgJm5iX2ZyYW1lLCB0aW1lc3RhbXBfdXMpOwotICBMT0dfVkVSQk9TRSgiJXM6IFNlbmRpbmcgJWQgZnJhbWVzIHBlciBpdGVyYXRpb24sICVkIGl0ZXJhdGlvbnMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgbmJfZnJhbWUsIG5iX2l0ZXJhdGlvbnMpOwotICBpZiAobmJfZnJhbWUgPT0gMCkgcmV0dXJuOwotCi0gIGZvciAodWludDhfdCBjb3VudGVyID0gMDsgY291bnRlciA8IG5iX2l0ZXJhdGlvbnM7IGNvdW50ZXIrKykgewotICAgIC8vIFRyYW5zY29kZSBmcmFtZSBhbmQgZW5xdWV1ZQotICAgIGEyZHBfYWFjX2VuY29kZV9mcmFtZXMobmJfZnJhbWUpOwotICB9Ci19Ci0KLS8vIE9idGFpbnMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2VuZCBhbmQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKLS8vIHRvIGJlIHVzZWQuIHxudW1fb2ZfaXRlcmF0aW9uc3wgYW5kIHxudW1fb2ZfZnJhbWVzfCBwYXJhbWV0ZXJzCi0vLyBhcmUgdXNlZCBhcyBvdXRwdXQgcGFyYW0gZm9yIHJldHVybmluZyB0aGUgcmVzcGVjdGl2ZSB2YWx1ZXMuCi1zdGF0aWMgdm9pZCBhMmRwX2FhY19nZXRfbnVtX2ZyYW1lX2l0ZXJhdGlvbih1aW50OF90KiBudW1fb2ZfaXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG51bV9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfdXMpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgdWludDhfdCBub2YgPSAwOwotICB1aW50OF90IG5vaSA9IDE7Ci0KLSAgdWludDMyX3QgcGNtX2J5dGVzX3Blcl9mcmFtZSA9Ci0gICAgICBhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19lbmNvZGVyX3BhcmFtcy5mcmFtZV9sZW5ndGggKgotICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5jaGFubmVsX2NvdW50ICoKLSAgICAgIGEyZHBfYWFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuYml0c19wZXJfc2FtcGxlIC8gODsKLSAgTE9HX1ZFUkJPU0UoIiVzOiBwY21fYnl0ZXNfcGVyX2ZyYW1lICV1IiwgX19mdW5jX18sIHBjbV9ieXRlc19wZXJfZnJhbWUpOwotCi0gIHVpbnQzMl90IHVzX3RoaXNfdGljayA9IGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXMgKiAxMDAwOwotICB1aW50NjRfdCBub3dfdXMgPSB0aW1lc3RhbXBfdXM7Ci0gIGlmIChhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19mZWVkaW5nX3N0YXRlLmxhc3RfZnJhbWVfdXMgIT0gMCkKLSAgICB1c190aGlzX3RpY2sgPQotICAgICAgICAobm93X3VzIC0gYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZmVlZGluZ19zdGF0ZS5sYXN0X2ZyYW1lX3VzKTsKLSAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZmVlZGluZ19zdGF0ZS5sYXN0X2ZyYW1lX3VzID0gbm93X3VzOwotCi0gIGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2ZlZWRpbmdfc3RhdGUuY291bnRlciArPQotICAgICAgKGZsb2F0KWEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2ZlZWRpbmdfc3RhdGUuYnl0ZXNfcGVyX3RpY2sgKgotICAgICAgdXNfdGhpc190aWNrIC8gKGEyZHBfYWFjX2VuY29kZXJfaW50ZXJ2YWxfbXMgKiAxMDAwKTsKLQotICByZXN1bHQgPSBhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19mZWVkaW5nX3N0YXRlLmNvdW50ZXIgLyBwY21fYnl0ZXNfcGVyX2ZyYW1lOwotICBhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19mZWVkaW5nX3N0YXRlLmNvdW50ZXIgLT0gcmVzdWx0ICogcGNtX2J5dGVzX3Blcl9mcmFtZTsKLSAgbm9mID0gcmVzdWx0OwotCi0gIExPR19WRVJCT1NFKCIlczogZWZmZWN0aXZlIG51bSBvZiBmcmFtZXMgJXUsIGl0ZXJhdGlvbnMgJXUiLCBfX2Z1bmNfXywgbm9mLAotICAgICAgICAgICAgICBub2kpOwotCi0gICpudW1fb2ZfZnJhbWVzID0gbm9mOwotICAqbnVtX29mX2l0ZXJhdGlvbnMgPSBub2k7Ci19Ci0KLXN0YXRpYyB2b2lkIGEyZHBfYWFjX2VuY29kZV9mcmFtZXModWludDhfdCBuYl9mcmFtZSkgewotICB0QTJEUF9BQUNfRU5DT0RFUl9QQVJBTVMqIHBfZW5jb2Rlcl9wYXJhbXMgPQotICAgICAgJmEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2VuY29kZXJfcGFyYW1zOwotICB0QTJEUF9GRUVESU5HX1BBUkFNUyogcF9mZWVkaW5nX3BhcmFtcyA9ICZhMmRwX2FhY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zOwotICB1aW50OF90IHJlbWFpbl9uYl9mcmFtZSA9IG5iX2ZyYW1lOwotICB1aW50OF90IHJlYWRfYnVmZmVyW0JUX0RFRkFVTFRfQlVGRkVSX1NJWkVdOwotICBpbnQgcGNtX2J5dGVzX3Blcl9mcmFtZSA9IHBfZW5jb2Rlcl9wYXJhbXMtPmZyYW1lX2xlbmd0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mZWVkaW5nX3BhcmFtcy0+Y2hhbm5lbF9jb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlIC8gODsKLSAgQ0hFQ0socGNtX2J5dGVzX3Blcl9mcmFtZSA8PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihyZWFkX2J1ZmZlcikpKTsKLQotICAvLyBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyCi0gIEFBQ0VOQ19CdWZEZXNjIGluX2J1Zl9kZXNjOwotICB2b2lkKiBpbl9idWZfdmVjdG9yWzFdID0ge251bGxwdHJ9OwotICBpbnQgaW5fYnVmX2lkZW50aWZpZXJzWzFdID0ge0lOX0FVRElPX0RBVEF9OwotICBpbnQgaW5fYnVmX3NpemVzWzFdID0ge3BjbV9ieXRlc19wZXJfZnJhbWV9OwotICBpbnQgaW5fYnVmX2VsZW1lbnRfc2l6ZXNbMV0gPSB7cF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlIC8gOH07Ci0gIGluX2J1Zl9kZXNjLm51bUJ1ZnMgPSAxOwotICBpbl9idWZfZGVzYy5idWZzID0gaW5fYnVmX3ZlY3RvcjsKLSAgaW5fYnVmX2Rlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbl9idWZfaWRlbnRpZmllcnM7Ci0gIGluX2J1Zl9kZXNjLmJ1ZlNpemVzID0gaW5fYnVmX3NpemVzOwotICBpbl9idWZfZGVzYy5idWZFbFNpemVzID0gaW5fYnVmX2VsZW1lbnRfc2l6ZXM7Ci0KLSAgLy8gU2V0dXAgdGhlIG91dHB1dCBidWZmZXIgKHBhcnRpYWxseSkKLSAgQUFDRU5DX0J1ZkRlc2Mgb3V0X2J1Zl9kZXNjOwotICB2b2lkKiBvdXRfYnVmX3ZlY3RvclsxXSA9IHtudWxscHRyfTsKLSAgaW50IG91dF9idWZfaWRlbnRpZmllcnNbMV0gPSB7T1VUX0JJVFNUUkVBTV9EQVRBfTsKLSAgaW50IG91dF9idWZfc2l6ZXNbMV0gPSB7cF9lbmNvZGVyX3BhcmFtcy0+bWF4X2VuY29kZWRfYnVmZmVyX2J5dGVzfTsKLSAgLy8gTk9URTogb3V0X2J1Zl9lbGVtZW50X3NpemVzIGJlbG93IGlzIHByb2JhYmx5IHVudXNlZCBieSB0aGUgZW5jb2RlcgotICBpbnQgb3V0X2J1Zl9lbGVtZW50X3NpemVzWzFdID0ge3BfZmVlZGluZ19wYXJhbXMtPmJpdHNfcGVyX3NhbXBsZSAvIDh9OwotICBvdXRfYnVmX2Rlc2MubnVtQnVmcyA9IDE7Ci0gIG91dF9idWZfZGVzYy5idWZzID0gb3V0X2J1Zl92ZWN0b3I7Ci0gIG91dF9idWZfZGVzYy5idWZmZXJJZGVudGlmaWVycyA9IG91dF9idWZfaWRlbnRpZmllcnM7Ci0gIG91dF9idWZfZGVzYy5idWZTaXplcyA9IG91dF9idWZfc2l6ZXM7Ci0gIG91dF9idWZfZGVzYy5idWZFbFNpemVzID0gb3V0X2J1Zl9lbGVtZW50X3NpemVzOwotICBDSEVDSyhwX2VuY29kZXJfcGFyYW1zLT5tYXhfZW5jb2RlZF9idWZmZXJfYnl0ZXMgPD0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihCVF9ERUZBVUxUX0JVRkZFUl9TSVpFIC0gc2l6ZW9mKEJUX0hEUikpKTsKLQotICBBQUNFTkNfSW5BcmdzIGFhY19pbl9hcmdzOwotICBhYWNfaW5fYXJncy5udW1JblNhbXBsZXMgPQotICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+ZnJhbWVfbGVuZ3RoICogcF9mZWVkaW5nX3BhcmFtcy0+Y2hhbm5lbF9jb3VudDsKLSAgYWFjX2luX2FyZ3MubnVtQW5jQnl0ZXMgPSAwOwotCi0gIEFBQ0VOQ19PdXRBcmdzIGFhY19vdXRfYXJncyA9IHsKLSAgICAgIC5udW1PdXRCeXRlcyA9IDAsIC5udW1JblNhbXBsZXMgPSAwLCAubnVtQW5jQnl0ZXMgPSAwfTsKLQotICB1aW50MzJfdCBjb3VudDsKLSAgdWludDMyX3QgdG90YWxfYnl0ZXNfcmVhZCA9IDA7Ci0gIGludCB3cml0dGVuID0gMDsKLQotICB3aGlsZSAobmJfZnJhbWUpIHsKLSAgICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhCVF9ERUZBVUxUX0JVRkZFUl9TSVpFKTsKLSAgICBwX2J1Zi0+b2Zmc2V0ID0gQTJEUF9BQUNfT0ZGU0VUOwotICAgIHBfYnVmLT5sZW4gPSAwOwotICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0gICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3BhY2tldHMrKzsKLQotICAgIGNvdW50ID0gMDsKLSAgICBkbyB7Ci0gICAgICAvLwotICAgICAgLy8gUmVhZCB0aGUgUENNIGRhdGEgYW5kIGVuY29kZSBpdAotICAgICAgLy8KLSAgICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOwotICAgICAgaWYgKGEyZHBfYWFjX3JlYWRfZmVlZGluZyhyZWFkX2J1ZmZlciwgJmJ5dGVzX3JlYWQpKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHBhY2tldCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQgKyBwX2J1Zi0+bGVuOwotICAgICAgICBpZiAoIWEyZHBfYWFjX2VuY29kZXJfY2IuaGFzX2FhY19oYW5kbGUpIHsKLSAgICAgICAgICBMT0dfRVJST1IoIiVzOiBpbnZhbGlkIEFBQyBoYW5kbGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cysrOwotICAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW5fYnVmX3ZlY3RvclswXSA9IHJlYWRfYnVmZmVyOwotICAgICAgICBvdXRfYnVmX3ZlY3RvclswXSA9IHBhY2tldCArIGNvdW50OwotICAgICAgICBBQUNFTkNfRVJST1IgYWFjX2Vycm9yID0KLSAgICAgICAgICAgIGFhY0VuY0VuY29kZShhMmRwX2FhY19lbmNvZGVyX2NiLmFhY19oYW5kbGUsICZpbl9idWZfZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0X2J1Zl9kZXNjLCAmYWFjX2luX2FyZ3MsICZhYWNfb3V0X2FyZ3MpOwotICAgICAgICBpZiAoYWFjX2Vycm9yICE9IEFBQ0VOQ19PSykgewotICAgICAgICAgIExPR19FUlJPUigiJXM6IEFBQyBlbmNvZGluZyBlcnJvcjogMHgleCIsIF9fZnVuY19fLCBhYWNfZXJyb3IpOwotICAgICAgICAgIGEyZHBfYWFjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHMrKzsKLSAgICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHdyaXR0ZW4gPSBhYWNfb3V0X2FyZ3MubnVtT3V0Qnl0ZXM7Ci0gICAgICAgIGNvdW50ICs9IHdyaXR0ZW47Ci0gICAgICAgIHBfYnVmLT5sZW4gKz0gd3JpdHRlbjsKLSAgICAgICAgbmJfZnJhbWUtLTsKLSAgICAgICAgcF9idWYtPmxheWVyX3NwZWNpZmljKys7ICAvLyBhZGRlZCBhIGZyYW1lIHRvIHRoZSBidWZmZXIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19XQVJOKCIlczogdW5kZXJmbG93ICVkIiwgX19mdW5jX18sIG5iX2ZyYW1lKTsKLSAgICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5hYWNfZmVlZGluZ19zdGF0ZS5jb3VudGVyICs9Ci0gICAgICAgICAgICBuYl9mcmFtZSAqIHBfZW5jb2Rlcl9wYXJhbXMtPmZyYW1lX2xlbmd0aCAqCi0gICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5jaGFubmVsX2NvdW50ICoKLSAgICAgICAgICAgIHBfZmVlZGluZ19wYXJhbXMtPmJpdHNfcGVyX3NhbXBsZSAvIDg7Ci0KLSAgICAgICAgLy8gbm8gbW9yZSBwY20gdG8gcmVhZAotICAgICAgICBuYl9mcmFtZSA9IDA7Ci0gICAgICB9Ci0gICAgICB0b3RhbF9ieXRlc19yZWFkICs9IGJ5dGVzX3JlYWQ7Ci0gICAgfSB3aGlsZSAoKHdyaXR0ZW4gPT0gMCkgJiYgbmJfZnJhbWUpOwotCi0gICAgLy8gTk9URTogV2UgZG9uJ3QgY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IHdpbGwgZml0IGluIHRoZSBNVFUsCi0gICAgLy8gYmVjYXVzZSBBQUMgZG9lc24ndCBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgZW5jb2RlZCBmcmFtZSBzaXplLgotICAgIC8vIElmIHRoZSBwYWNrZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIE1UVSwgaXQgd2lsbCBiZSBmcmFnbWVudGVkIGJlZm9yZQotICAgIC8vIHRyYW5zbWlzc2lvbi4KLSAgICBpZiAocF9idWYtPmxlbikgewotICAgICAgLyoKLSAgICAgICAqIFRpbWVzdGFtcCBvZiB0aGUgbWVkaWEgcGFja2V0IGhlYWRlciByZXByZXNlbnQgdGhlIFRTIG9mIHRoZQotICAgICAgICogZmlyc3QgZnJhbWUsIGkuZSB0aGUgdGltZXN0YW1wIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmcmFtZS4KLSAgICAgICAqLwotICAgICAgKigodWludDMyX3QqKShwX2J1ZiArIDEpKSA9IGEyZHBfYWFjX2VuY29kZXJfY2IudGltZXN0YW1wOwotCi0gICAgICBhMmRwX2FhY19lbmNvZGVyX2NiLnRpbWVzdGFtcCArPQotICAgICAgICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyAqIHBfZW5jb2Rlcl9wYXJhbXMtPmZyYW1lX2xlbmd0aDsKLQotICAgICAgdWludDhfdCBkb25lX25iX2ZyYW1lID0gcmVtYWluX25iX2ZyYW1lIC0gbmJfZnJhbWU7Ci0gICAgICByZW1haW5fbmJfZnJhbWUgPSBuYl9mcmFtZTsKLSAgICAgIGlmICghYTJkcF9hYWNfZW5jb2Rlcl9jYi5lbnF1ZXVlX2NhbGxiYWNrKHBfYnVmLCBkb25lX25iX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfcmVhZCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cysrOwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgYm9vbCBhMmRwX2FhY19yZWFkX2ZlZWRpbmcodWludDhfdCogcmVhZF9idWZmZXIsIHVpbnQzMl90KiBieXRlc19yZWFkKSB7Ci0gIHVpbnQzMl90IHJlYWRfc2l6ZSA9IGEyZHBfYWFjX2VuY29kZXJfY2IuYWFjX2VuY29kZXJfcGFyYW1zLmZyYW1lX2xlbmd0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgIGEyZHBfYWFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuY2hhbm5lbF9jb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgIGEyZHBfYWFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuYml0c19wZXJfc2FtcGxlIC8gODsKLQotICBhMmRwX2FhY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQrKzsKLSAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRfYnl0ZXMgKz0gcmVhZF9zaXplOwotCi0gIC8qIFJlYWQgRGF0YSBmcm9tIFVJUEMgY2hhbm5lbCAqLwotICB1aW50MzJfdCBuYl9ieXRlX3JlYWQgPQotICAgICAgYTJkcF9hYWNfZW5jb2Rlcl9jYi5yZWFkX2NhbGxiYWNrKHJlYWRfYnVmZmVyLCByZWFkX3NpemUpOwotICBhMmRwX2FhY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRfYnl0ZXMgKz0gbmJfYnl0ZV9yZWFkOwotICAqYnl0ZXNfcmVhZCA9IG5iX2J5dGVfcmVhZDsKLQotICBpZiAobmJfYnl0ZV9yZWFkIDwgcmVhZF9zaXplKSB7Ci0gICAgaWYgKG5iX2J5dGVfcmVhZCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBGaWxsIHRoZSB1bmZpbGxlZCBwYXJ0IG9mIHRoZSByZWFkIGJ1ZmZlciB3aXRoIHNpbGVuY2UgKDApICovCi0gICAgbWVtc2V0KCgodWludDhfdCopcmVhZF9idWZmZXIpICsgbmJfYnl0ZV9yZWFkLCAwLCByZWFkX3NpemUgLSBuYl9ieXRlX3JlYWQpOwotICAgIG5iX2J5dGVfcmVhZCA9IHJlYWRfc2l6ZTsKLSAgfQotICBhMmRwX2FhY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRzX2NvdW50Kys7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBhZGp1c3RfZWZmZWN0aXZlX210dSgKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMmIHBlZXJfcGFyYW1zKSB7Ci0gIHVpbnQxNl90IG10dV9zaXplID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIEEyRFBfQUFDX09GRlNFVCAtIHNpemVvZihCVF9IRFIpOwotICBpZiAobXR1X3NpemUgPiBwZWVyX3BhcmFtcy5wZWVyX210dSkgewotICAgIG10dV9zaXplID0gcGVlcl9wYXJhbXMucGVlcl9tdHU7Ci0gIH0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBvcmlnaW5hbCBBVkRUUCBNVFUgc2l6ZTogJWQiLCBfX2Z1bmNfXywgbXR1X3NpemUpOwotICBpZiAocGVlcl9wYXJhbXMuaXNfcGVlcl9lZHIgJiYgIXBlZXJfcGFyYW1zLnBlZXJfc3VwcG9ydHNfM21icHMpIHsKLSAgICAvLyBUaGlzIGNvbmRpdGlvbiB3b3VsZCBiZSBzYXRpc2ZpZWQgb25seSBpZiB0aGUgcmVtb3RlIGRldmljZSBpcwotICAgIC8vIEVEUiBhbmQgc3VwcG9ydHMgb25seSAyIE1icHMsIGJ1dCB0aGUgZWZmZWN0aXZlIEFWRFRQIE1UVSBzaXplCi0gICAgLy8gZXhjZWVkcyB0aGUgMkRINSBwYWNrZXQgc2l6ZS4KLSAgICBMT0dfVkVSQk9TRSgiJXM6IFRoZSByZW1vdGUgZGV2aWNlIGlzIEVEUiBidXQgZG9lcyBub3Qgc3VwcG9ydCAzIE1icHMiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBpZiAobXR1X3NpemUgPiBNQVhfMk1CUFNfQVZEVFBfTVRVKSB7Ci0gICAgICBMT0dfV0FSTigiJXM6IFJlc3RyaWN0aW5nIEFWRFRQIE1UVSBzaXplIGZyb20gJWQgdG8gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgIG10dV9zaXplLCBNQVhfMk1CUFNfQVZEVFBfTVRVKTsKLSAgICAgIG10dV9zaXplID0gTUFYXzJNQlBTX0FWRFRQX01UVTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG10dV9zaXplOwotfQotCi12b2lkIEEyZHBDb2RlY0NvbmZpZ0FhY1NvdXJjZTo6ZGVidWdfY29kZWNfZHVtcChpbnQgZmQpIHsKLSAgYTJkcF9hYWNfZW5jb2Rlcl9zdGF0c190KiBzdGF0cyA9ICZhMmRwX2FhY19lbmNvZGVyX2NiLnN0YXRzOwotCi0gIEEyZHBDb2RlY0NvbmZpZzo6ZGVidWdfY29kZWNfZHVtcChmZCk7Ci0KLSAgYXV0byBjb2RlY19zcGVjaWZpY18xID0gZ2V0Q29kZWNDb25maWcoKS5jb2RlY19zcGVjaWZpY18xOwotICBkcHJpbnRmKAotICAgICAgZmQsCi0gICAgICAiICBBQUMgYml0cmF0ZSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJXMgIgotICAgICAgIigweCUiIFBSSXg2NCAiKVxuIiwKLSAgICAgICgoY29kZWNfc3BlY2lmaWNfMSAmIH5BMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9NQVNLKSA9PSAwID8gIkNvbnN0YW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVmFyaWFibGUiKSwKLSAgICAgIGNvZGVjX3NwZWNpZmljXzEpOwotICBkcHJpbnRmKGZkLCAiICBFbmNvZGVyIGludGVydmFsIChtcyk6ICUiIFBSSXU2NCAiXG4iLAotICAgICAgICAgIGEyZHBfYWFjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKCkpOwotICBkcHJpbnRmKGZkLCAiICBFZmZlY3RpdmUgTVRVOiAlZFxuIiwgYTJkcF9hYWNfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCkpOwotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIFBhY2tldCBjb3VudHMgKGV4cGVjdGVkL2Ryb3BwZWQpICAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dVxuIiwKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9wYWNrZXRzLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cyk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBQQ00gcmVhZCBjb3VudHMgKGV4cGVjdGVkL2FjdHVhbCkgICAgICAgICAgICAgICAgICAgICAgIDogJXp1IC8gIgotICAgICAgICAgICIlenVcbiIsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRzX2NvdW50KTsKLQotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIFBDTSByZWFkIGJ5dGVzIChleHBlY3RlZC9hY3R1YWwpICAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dVxuIiwKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkX2J5dGVzLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF9hcGkuY2MgYi9zdGFjay9hMmRwL2EyZHBfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM3OGY1Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb21tb24gQVBJIGZvciB0aGUgQWR2YW5jZWQgQXVkaW8gRGlzdHJpYnV0aW9uIFByb2ZpbGUgKEEyRFApCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX2FwaSIKLQotI2luY2x1ZGUgImEyZHBfYXBpLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfaW50LmgiCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzZHBkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QTJEUF9DQiBhMmRwX2NiOwotc3RhdGljIHVpbnQxNl90IGEyZHBfYXR0cl9saXN0W10gPSB7Ci0gICAgQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QsIC8qIHVwZGF0ZSBBMkRQX05VTV9BVFRSLCBpZiBjaGFuZ2VkICovCi0gICAgQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCwgIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTLAotICAgIEFUVFJfSURfU0VSVklDRV9OQU1FLCAgICAgICAgICBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVCwKLSAgICBBVFRSX0lEX1BST1ZJREVSX05BTUV9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhMmRwX3NkcF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgU0RQIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgYnkgQTJEUF9GaW5kU2VydmljZS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIGJ5IFNEUCB3aGVuIHRoZSBzZXJ2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHNlYXJjaCBpcyBjb21wbGV0ZWQuICBJZiB0aGUgc2VhcmNoIGlzIHN1Y2Nlc3NmdWwsIGl0Ci0gKiAgICAgICAgICAgICAgICAgIGZpbmRzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGRhdGFiYXNlIHRoYXQgbWF0Y2hlcyB0aGUKLSAqICAgICAgICAgICAgICAgICAgVVVJRCBvZiB0aGUgc2VhcmNoLiAgVGhlbiByZXRyaWV2ZXMgdmFyaW91cyBwYXJhbWV0ZXJzCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHJlY29yZC4gIFdoZW4gaXQgaXMgZmluaXNoZWQgaXQgY2FsbHMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhMmRwX3NkcF9jYmFjayh0U0RQX1NUQVRVUyBzdGF0dXMpIHsKLSAgdFNEUF9ESVNDX1JFQyogcF9yZWMgPSBOVUxMOwotICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyOwotICBib29sIGZvdW5kID0gZmFsc2U7Ci0gIHRBMkRQX1NlcnZpY2UgYTJkcF9zdmM7Ci0gIHRTRFBfUFJPVE9DT0xfRUxFTSBlbGVtOwotICBSYXdBZGRyZXNzIHBlZXJfYWRkcmVzcyA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLQotICBMT0dfSU5GTygiJXM6IHN0YXR1czogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzID09IFNEUF9TVUNDRVNTKSB7Ci0gICAgLyogbG9vcCB0aHJvdWdoIGFsbCByZWNvcmRzIHdlIGZvdW5kICovCi0gICAgZG8gewotICAgICAgLyogZ2V0IG5leHQgcmVjb3JkOyBpZiBub25lIGZvdW5kLCB3ZSdyZSBkb25lICovCi0gICAgICBpZiAoKHBfcmVjID0gU0RQX0ZpbmRTZXJ2aWNlSW5EYigKLSAgICAgICAgICAgICAgIGEyZHBfY2IuZmluZC5wX2RiLCBhMmRwX2NiLmZpbmQuc2VydmljZV91dWlkLCBwX3JlYykpID09IE5VTEwpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtZW1zZXQoJmEyZHBfc3ZjLCAwLCBzaXplb2YodEEyRFBfU2VydmljZSkpOwotICAgICAgcGVlcl9hZGRyZXNzID0gcF9yZWMtPnJlbW90ZV9iZF9hZGRyOwotCi0gICAgICAvKiBnZXQgc2VydmljZSBuYW1lICovCi0gICAgICBpZiAoKHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU0VSVklDRV9OQU1FKSkgIT0KLSAgICAgICAgICBOVUxMKSB7Ci0gICAgICAgIGEyZHBfc3ZjLnBfc2VydmljZV9uYW1lID0gKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5OwotICAgICAgICBhMmRwX3N2Yy5zZXJ2aWNlX2xlbiA9IFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGdldCBwcm92aWRlciBuYW1lICovCi0gICAgICBpZiAoKHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfUFJPVklERVJfTkFNRSkpICE9Ci0gICAgICAgICAgTlVMTCkgewotICAgICAgICBhMmRwX3N2Yy5wX3Byb3ZpZGVyX25hbWUgPSAoY2hhciopcF9hdHRyLT5hdHRyX3ZhbHVlLnYuYXJyYXk7Ci0gICAgICAgIGEyZHBfc3ZjLnByb3ZpZGVyX2xlbiA9IFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGdldCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLSAgICAgIGlmICgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYygKLSAgICAgICAgICAgICAgIHBfcmVjLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUykpICE9IE5VTEwpIHsKLSAgICAgICAgYTJkcF9zdmMuZmVhdHVyZXMgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGdldCBBVkRUUCB2ZXJzaW9uICovCi0gICAgICBpZiAoU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9yZWMsIFVVSURfUFJPVE9DT0xfQVZEVFAsICZlbGVtKSkgewotICAgICAgICBhMmRwX3N2Yy5hdmR0X3ZlcnNpb24gPSBlbGVtLnBhcmFtc1swXTsKLSAgICAgICAgTE9HX1ZFUkJPU0UoImF2ZHRfdmVyc2lvbjogMHgleCIsIGEyZHBfc3ZjLmF2ZHRfdmVyc2lvbik7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlJ3ZlIGdvdCBldmVyeXRoaW5nLCB3ZSdyZSBkb25lICovCi0gICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIH0gd2hpbGUgKHRydWUpOwotICB9Ci0KLSAgYTJkcF9jYi5maW5kLnNlcnZpY2VfdXVpZCA9IDA7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZhMmRwX2NiLmZpbmQucF9kYik7Ci0gIC8qIHJldHVybiBpbmZvIGZyb20gc2RwIHJlY29yZCBpbiBhcHAgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgaWYgKGEyZHBfY2IuZmluZC5wX2NiYWNrICE9IE5VTEwpIHsKLSAgICAoKmEyZHBfY2IuZmluZC5wX2NiYWNrKShmb3VuZCwgJmEyZHBfc3ZjLCBwZWVyX2FkZHJlc3MpOwotICB9Ci0KLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYTJkcF9zZXRfYXZkdF9zZHBfdmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgc2NyaXB0IHdyYXBwZXIgdG8gY2hhbmdlIHRoZQotICogICAgICAgICAgICAgICAgICBhdmR0IHZlcnNpb24gb2YgYTJkcC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhMmRwX3NldF9hdmR0X3NkcF92ZXIodWludDE2X3QgYXZkdF9zZHBfdmVyKSB7Ci0gIGEyZHBfY2IuYXZkdF9zZHBfdmVyID0gYXZkdF9zZHBfdmVyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBMkRQX0FkZFJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBzZXJ2ZXIgYXBwbGljYXRpb24gdG8gYWRkCi0gKiAgICAgICAgICAgICAgICAgIFNSQyBvciBTTksgaW5mb3JtYXRpb24gdG8gYW4gU0RQIHJlY29yZC4gIFByaW9yIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsCi0gKiAgICAgICAgICAgICAgICAgIFNEUF9DcmVhdGVSZWNvcmQoKSB0byBjcmVhdGUgYW4gU0RQIHJlY29yZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQ6ICBJbmRpY2F0ZXMgU1JDIG9yIFNOSy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfbmFtZTogIFBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VydmljZSBuYW1lLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfcHJvdmlkZXJfbmFtZTogIFBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgcHJvdmlkZXIgbmFtZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogIFByb2ZpbGUgc3VwcG9ydGVkIGZlYXR1cmVzLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGU6ICBTRFAgaGFuZGxlIHJldHVybmVkIGJ5IFNEUF9DcmVhdGVSZWNvcmQoKS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEEyRFBfU1VDQ0VTUyBpZiBmdW5jdGlvbiBleGVjdXRpb24gc3VjY2VlZGVkLAotICogICAgICAgICAgICAgICAgICBBMkRQX0lOVkFMSURfUEFSQU1TIGlmIGJhZCBwYXJhbWV0ZXJzIGFyZSBnaXZlbi4KLSAqICAgICAgICAgICAgICAgICAgQTJEUF9GQUlMIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEEyRFBfU1RBVFVTIEEyRFBfQWRkUmVjb3JkKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgY2hhciogcF9zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9wcm92aWRlcl9uYW1lLCB1aW50MTZfdCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlKSB7Ci0gIHVpbnQxNl90IGJyb3dzZV9saXN0WzFdOwotICBib29sIHJlc3VsdCA9IHRydWU7Ci0gIHVpbnQ4X3QgdGVtcFs4XTsKLSAgdWludDhfdCogcDsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHByb3RvX2xpc3RbQTJEUF9OVU1fUFJPVE9fRUxFTVNdOwotCi0gIExPR19WRVJCT1NFKCIlczogdXVpZDogMHgleCIsIF9fZnVuY19fLCBzZXJ2aWNlX3V1aWQpOwotCi0gIGlmICgoc2RwX2hhbmRsZSA9PSAwKSB8fCAoc2VydmljZV91dWlkICE9IFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZCAhPSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LKSkKLSAgICByZXR1cm4gQTJEUF9JTlZBTElEX1BBUkFNUzsKLQotICAvKiBhZGQgc2VydmljZSBjbGFzcyBpZCBsaXN0ICovCi0gIHJlc3VsdCAmPSBTRFBfQWRkU2VydmljZUNsYXNzSWRMaXN0KHNkcF9oYW5kbGUsIDEsICZzZXJ2aWNlX3V1aWQpOwotCi0gIG1lbXNldCgodm9pZCopcHJvdG9fbGlzdCwgMCwKLSAgICAgICAgIEEyRFBfTlVNX1BST1RPX0VMRU1TICogc2l6ZW9mKHRTRFBfUFJPVE9DT0xfRUxFTSkpOwotCi0gIC8qIGFkZCBwcm90b2NvbCBkZXNjcmlwdG9yIGxpc3QgICAqLwotICBwcm90b19saXN0WzBdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0wyQ0FQOwotICBwcm90b19saXN0WzBdLm51bV9wYXJhbXMgPSAxOwotICBwcm90b19saXN0WzBdLnBhcmFtc1swXSA9IEFWRFRfUFNNOwotICBwcm90b19saXN0WzFdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0FWRFRQOwotICBwcm90b19saXN0WzFdLm51bV9wYXJhbXMgPSAxOwotICBwcm90b19saXN0WzFdLnBhcmFtc1swXSA9IGEyZHBfY2IuYXZkdF9zZHBfdmVyOwotCi0gIHJlc3VsdCAmPSBTRFBfQWRkUHJvdG9jb2xMaXN0KHNkcF9oYW5kbGUsIEEyRFBfTlVNX1BST1RPX0VMRU1TLCBwcm90b19saXN0KTsKLQotICAvKiBhZGQgcHJvZmlsZSBkZXNjcmlwdG9yIGxpc3QgICAqLwotICByZXN1bHQgJj0gU0RQX0FkZFByb2ZpbGVEZXNjcmlwdG9yTGlzdCgKLSAgICAgIHNkcF9oYW5kbGUsIFVVSURfU0VSVkNMQVNTX0FEVl9BVURJT19ESVNUUklCVVRJT04sIEEyRFBfVkVSU0lPTik7Ci0KLSAgLyogYWRkIHN1cHBvcnRlZCBmZWF0dXJlICovCi0gIGlmIChmZWF0dXJlcyAhPSAwKSB7Ci0gICAgcCA9IHRlbXA7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBmZWF0dXJlcyk7Ci0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsICh1aW50MzJfdCkyLCAodWludDhfdCopdGVtcCk7Ci0gIH0KLQotICAvKiBhZGQgcHJvdmlkZXIgbmFtZSAqLwotICBpZiAocF9wcm92aWRlcl9uYW1lICE9IE5VTEwpIHsKLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZSgKLSAgICAgICAgc2RwX2hhbmRsZSwgQVRUUl9JRF9QUk9WSURFUl9OQU1FLCBURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfcHJvdmlkZXJfbmFtZSkgKyAxKSwgKHVpbnQ4X3QqKXBfcHJvdmlkZXJfbmFtZSk7Ci0gIH0KLQotICAvKiBhZGQgc2VydmljZSBuYW1lICovCi0gIGlmIChwX3NlcnZpY2VfbmFtZSAhPSBOVUxMKSB7Ci0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoCi0gICAgICAgIHNkcF9oYW5kbGUsIEFUVFJfSURfU0VSVklDRV9OQU1FLCBURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfc2VydmljZV9uYW1lKSArIDEpLCAodWludDhfdCopcF9zZXJ2aWNlX25hbWUpOwotICB9Ci0KLSAgLyogYWRkIGJyb3dzZSBncm91cCBsaXN0ICovCi0gIGJyb3dzZV9saXN0WzBdID0gVVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUDsKLSAgcmVzdWx0ICY9IFNEUF9BZGRVdWlkU2VxdWVuY2Uoc2RwX2hhbmRsZSwgQVRUUl9JRF9CUk9XU0VfR1JPVVBfTElTVCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlX2xpc3QpOwotCi0gIHJldHVybiAocmVzdWx0ID8gQTJEUF9TVUNDRVNTIDogQTJEUF9GQUlMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQTJEUF9GaW5kU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBjbGllbnQgYXBwbGljYXRpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgcGVyZm9ybSBzZXJ2aWNlIGRpc2NvdmVyeSBhbmQgcmV0cmlldmUgU1JDIG9yIFNOSyBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkIGluZm9ybWF0aW9uIGZyb20gYSBzZXJ2ZXIuICBJbmZvcm1hdGlvbiBpcwotICogICAgICAgICAgICAgICAgICByZXR1cm5lZCBmb3IgdGhlIGZpcnN0IHNlcnZpY2UgcmVjb3JkIGZvdW5kIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIgdGhhdCBtYXRjaGVzIHRoZSBzZXJ2aWNlIFVVSUQuICBUaGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHNlcnZpY2UgZGlzY292ZXJ5IGlzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlLiAgVGhlcmUgY2FuIG9ubHkgYmUgb25lIG91dHN0YW5kaW5nIGNhbGwgdG8KLSAqICAgICAgICAgICAgICAgICAgQTJEUF9GaW5kU2VydmljZSgpIGF0IGEgdGltZTsgdGhlIGFwcGxpY2F0aW9uIG11c3Qgd2FpdAotICogICAgICAgICAgICAgICAgICBmb3IgdGhlIGNhbGxiYWNrIGJlZm9yZSBpdCBtYWtlcyBhbm90aGVyIGNhbGwgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZDogIEluZGljYXRlcyBTUkMgb3IgU05LLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHI6ICBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2RiOiAgUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXNjb3ZlcnkgZGF0YWJhc2UuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcF9jYmFjazogIFBvaW50ZXIgdG8gdGhlIEEyRFBfRmluZFNlcnZpY2UoKQotICogICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBPdXRwdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBMkRQX1NVQ0NFU1MgaWYgZnVuY3Rpb24gZXhlY3V0aW9uIHN1Y2NlZWRlZCwKLSAqICAgICAgICAgICAgICAgICAgQTJEUF9JTlZBTElEX1BBUkFNUyBpZiBiYWQgcGFyYW1ldGVycyBhcmUgZ2l2ZW4uCi0gKiAgICAgICAgICAgICAgICAgIEEyRFBfQlVTWSBpZiBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4KLSAqICAgICAgICAgICAgICAgICAgQTJEUF9GQUlMIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEEyRFBfU1RBVFVTIEEyRFBfRmluZFNlcnZpY2UodWludDE2X3Qgc2VydmljZV91dWlkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEEyRFBfU0RQX0RCX1BBUkFNUyogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBMkRQX0ZJTkRfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgYm9vbCByZXN1bHQgPSB0cnVlOwotCi0gIExPR19JTkZPKCIlczogcGVlcjogJXMgVVVJRDogMHgleCIsIF9fZnVuY19fLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgc2VydmljZV91dWlkKTsKLSAgaWYgKChzZXJ2aWNlX3V1aWQgIT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFICYmCi0gICAgICAgc2VydmljZV91dWlkICE9IFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkspIHx8Ci0gICAgICBwX2RiID09IE5VTEwgfHwgcF9jYmFjayA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IGNhbm5vdCBmaW5kIHNlcnZpY2UgZm9yIHBlZXIgJXMgVVVJRCAweCV4OiAiCi0gICAgICAgICJpbnZhbGlkIHBhcmFtZXRlcnMiLAotICAgICAgICBfX2Z1bmNfXywgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHNlcnZpY2VfdXVpZCk7Ci0gICAgcmV0dXJuIEEyRFBfSU5WQUxJRF9QQVJBTVM7Ci0gIH0KLQotICBpZiAoYTJkcF9jYi5maW5kLnNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UgfHwKLSAgICAgIGEyZHBfY2IuZmluZC5zZXJ2aWNlX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBmaW5kIHNlcnZpY2UgZm9yIHBlZXIgJXMgVVVJRCAweCV4OiBidXN5IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBzZXJ2aWNlX3V1aWQpOwotICAgIHJldHVybiBBMkRQX0JVU1k7Ci0gIH0KLQotICBpZiAocF9kYi0+cF9hdHRycyA9PSBOVUxMIHx8IHBfZGItPm51bV9hdHRyID09IDApIHsKLSAgICBwX2RiLT5wX2F0dHJzID0gYTJkcF9hdHRyX2xpc3Q7Ci0gICAgcF9kYi0+bnVtX2F0dHIgPSBBMkRQX05VTV9BVFRSOwotICB9Ci0KLSAgaWYgKGEyZHBfY2IuZmluZC5wX2RiID09IE5VTEwpCi0gICAgYTJkcF9jYi5maW5kLnBfZGIgPSAodFNEUF9ESVNDT1ZFUllfREIqKW9zaV9tYWxsb2MocF9kYi0+ZGJfbGVuKTsKLQotICBVdWlkIHV1aWRfbGlzdCA9IFV1aWQ6OkZyb20xNkJpdChzZXJ2aWNlX3V1aWQpOwotICByZXN1bHQgPSBTRFBfSW5pdERpc2NvdmVyeURiKGEyZHBfY2IuZmluZC5wX2RiLCBwX2RiLT5kYl9sZW4sIDEsICZ1dWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYi0+bnVtX2F0dHIsIHBfZGItPnBfYXR0cnMpOwotCi0gIGlmIChyZXN1bHQpIHsKLSAgICAvKiBzdG9yZSBzZXJ2aWNlX3V1aWQgKi8KLSAgICBhMmRwX2NiLmZpbmQuc2VydmljZV91dWlkID0gc2VydmljZV91dWlkOwotICAgIGEyZHBfY2IuZmluZC5wX2NiYWNrID0gcF9jYmFjazsKLQotICAgIC8qIHBlcmZvcm0gc2VydmljZSBzZWFyY2ggKi8KLSAgICByZXN1bHQgPSBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QoYmRfYWRkciwgYTJkcF9jYi5maW5kLnBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyZHBfc2RwX2NiYWNrKTsKLSAgICBpZiAoIXJlc3VsdCkgewotICAgICAgYTJkcF9jYi5maW5kLnNlcnZpY2VfdXVpZCA9IDA7Ci0gICAgfQotICB9Ci0gIGlmICghcmVzdWx0KSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IGNhbm5vdCBmaW5kIHNlcnZpY2UgZm9yIHBlZXIgJXMgVVVJRCAweCV4OiAiCi0gICAgICAgICJTRFAgZXJyb3IiLAotICAgICAgICBfX2Z1bmNfXywgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHNlcnZpY2VfdXVpZCk7Ci0gICAgcmV0dXJuIEEyRFBfRkFJTDsKLSAgfQotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEEyRFBfU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEEyRC4gSWYgMHhmZiBpcyBwYXNzZWQsIHRoZQotICogICAgICAgICAgICAgICAgICBjdXJyZW50IHRyYWNlIGxldmVsIGlzIHJldHVybmVkLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIG5ld19sZXZlbDogIFRoZSBsZXZlbCB0byBzZXQgdGhlIEEyRFAgdHJhY2luZyB0bzoKLSAqICAgICAgICAgICAgICAgICAgICAgIDB4ZmYtcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nLgotICogICAgICAgICAgICAgICAgICAgICAgMC10dXJucyBvZmYgdHJhY2luZy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDEtRXJyb3JzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMi1XYXJuaW5ncy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDMtQVBJcy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDQtRXZlbnRzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gNS1EZWJ1Zy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBuZXcgdHJhY2UgbGV2ZWwgb3IgY3VycmVudCB0cmFjZSBsZXZlbCBpZgotICogICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIDB4ZmYuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBBMkRQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBhMmRwX2NiLnRyYWNlX2xldmVsID0gbmV3X2xldmVsOwotCi0gIHJldHVybiAoYTJkcF9jYi50cmFjZV9sZXZlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICAgICAgQTJEUF9CaXRzU2V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayB0aGUgZ2l2ZW4gbnVtIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0Ci0gKiBSZXR1cm5zICAgICAgICAgIEEyRFBfU0VUX09ORV9CSVQsIGlmIG9uZSBhbmQgb25seSBvbmUgYml0IGlzIHNldAotICogICAgICAgICAgICAgICAgICBBMkRQX1NFVF9aRVJPX0JJVCwgaWYgYWxsIGJpdHMgY2xlYXIKLSAqICAgICAgICAgICAgICAgICAgQTJEUF9TRVRfTVVMVExfQklULCBpZiBtdWx0aXBsZSBiaXRzIGFyZSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQTJEUF9CaXRzU2V0KHVpbnQ2NF90IG51bSkgewotICBpZiAobnVtID09IDApIHJldHVybiBBMkRQX1NFVF9aRVJPX0JJVDsKLSAgaWYgKChudW0gJiAobnVtIC0gMSkpID09IDApIHJldHVybiBBMkRQX1NFVF9PTkVfQklUOwotICByZXR1cm4gQTJEUF9TRVRfTVVMVExfQklUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQTJEUF9Jbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBjb250cm9sIGJsb2NrCi0gKiAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGxheWVyLiAgSXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFjY2Vzc2luZyBhbnkKLSAqICAgICAgICAgICAgICAgICAgb3RoZXIgQVBJIGZ1bmN0aW9ucyBmb3IgdGhpcyBsYXllci4gIEl0IGlzIHR5cGljYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgb25jZSBkdXJpbmcgdGhlIHN0YXJ0IHVwIG9mIHRoZSBzdGFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBMkRQX0luaXQodm9pZCkgewotICBtZW1zZXQoJmEyZHBfY2IsIDAsIHNpemVvZih0QTJEUF9DQikpOwotCi0gIGEyZHBfY2IuYXZkdF9zZHBfdmVyID0gQVZEVF9WRVJTSU9OOwotCi0jaWYgZGVmaW5lZChBMkRQX0lOSVRJQUxfVFJBQ0VfTEVWRUwpCi0gIGEyZHBfY2IudHJhY2VfbGV2ZWwgPSBBMkRQX0lOSVRJQUxfVFJBQ0VfTEVWRUw7Ci0jZWxzZQotICBhMmRwX2NiLnRyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfTk9ORTsKLSNlbmRpZgotfQotCi11aW50MTZfdCBBMkRQX0dldEF2ZHRwVmVyc2lvbigpIHsgcmV0dXJuIGEyZHBfY2IuYXZkdF9zZHBfdmVyOyB9CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfY29kZWNfY29uZmlnLmNjIGIvc3RhY2svYTJkcC9hMmRwX2NvZGVjX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlMGY2Zi4uMDAwMDAwMAotLS0gYS9zdGFjay9hMmRwL2EyZHBfY29kZWNfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEEyRFAgQ29kZWNzIENvbmZpZ3VyYXRpb24KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImEyZHBfY29kZWMiCi0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgImEyZHBfYWFjLmgiCi0jaW5jbHVkZSAiYTJkcF9zYmMuaCIKLSNpbmNsdWRlICJhMmRwX3ZlbmRvci5oIgotCi0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eC5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yX2FwdHhfaGQuaCIKLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9sZGFjLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImJ0YS9hdi9idGFfYXZfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8qIFRoZSBNZWRpYSBUeXBlIG9mZnNldCB3aXRoaW4gdGhlIGNvZGVjIGluZm8gYnl0ZSBhcnJheSAqLwotI2RlZmluZSBBMkRQX01FRElBX1RZUEVfT0ZGU0VUIDEKLQotLyogQTJEUCBPZmZsb2FkIGVuYWJsZWQgaW4gc3RhY2sgKi8KLXN0YXRpYyBib29sIGEyZHBfb2ZmbG9hZF9zdGF0dXM7Ci0KLS8vIEluaXRpYWxpemVzIHRoZSBjb2RlYyBjb25maWcuCi0vLyB8Y29kZWNfY29uZmlnfCBpcyB0aGUgY29kZWMgY29uZmlnIHRvIGluaXRpYWxpemUuCi0vLyB8Y29kZWNfaW5kZXh8IGFuZCB8Y29kZWNfcHJpb3JpdHl8IGFyZSB0aGUgY29kZWMgdHlwZSBhbmQgcHJpb3JpdHkgdG8gdXNlCi0vLyBmb3IgdGhlIGluaXRpYWxpemF0aW9uLgotCi1zdGF0aWMgdm9pZCBpbml0X2J0YXZfYTJkcF9jb2RlY19jb25maWcoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBjb2RlY19jb25maWcsIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KSB7Ci0gIG1lbXNldChjb2RlY19jb25maWcsIDAsIHNpemVvZihidGF2X2EyZHBfY29kZWNfY29uZmlnX3QpKTsKLSAgY29kZWNfY29uZmlnLT5jb2RlY190eXBlID0gY29kZWNfaW5kZXg7Ci0gIGNvZGVjX2NvbmZpZy0+Y29kZWNfcHJpb3JpdHkgPSBjb2RlY19wcmlvcml0eTsKLX0KLQotQTJkcENvZGVjQ29uZmlnOjpBMmRwQ29kZWNDb25maWcoYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KQotICAgIDogY29kZWNfaW5kZXhfKGNvZGVjX2luZGV4KSwKLSAgICAgIG5hbWVfKG5hbWUpLAotICAgICAgZGVmYXVsdF9jb2RlY19wcmlvcml0eV8oY29kZWNfcHJpb3JpdHkpIHsKLSAgc2V0Q29kZWNQcmlvcml0eShjb2RlY19wcmlvcml0eSk7Ci0KLSAgaW5pdF9idGF2X2EyZHBfY29kZWNfY29uZmlnKCZjb2RlY19jb25maWdfLCBjb2RlY19pbmRleF8sIGNvZGVjUHJpb3JpdHkoKSk7Ci0gIGluaXRfYnRhdl9hMmRwX2NvZGVjX2NvbmZpZygmY29kZWNfY2FwYWJpbGl0eV8sIGNvZGVjX2luZGV4XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpb3JpdHkoKSk7Ci0gIGluaXRfYnRhdl9hMmRwX2NvZGVjX2NvbmZpZygmY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8sIGNvZGVjX2luZGV4XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpb3JpdHkoKSk7Ci0gIGluaXRfYnRhdl9hMmRwX2NvZGVjX2NvbmZpZygmY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XywgY29kZWNfaW5kZXhfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcmlvcml0eSgpKTsKLSAgaW5pdF9idGF2X2EyZHBfY29kZWNfY29uZmlnKCZjb2RlY191c2VyX2NvbmZpZ18sIGNvZGVjX2luZGV4XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ERUZBVUxUKTsKLSAgaW5pdF9idGF2X2EyZHBfY29kZWNfY29uZmlnKCZjb2RlY19hdWRpb19jb25maWdfLCBjb2RlY19pbmRleF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVCk7Ci0KLSAgbWVtc2V0KG90YV9jb2RlY19jb25maWdfLCAwLCBzaXplb2Yob3RhX2NvZGVjX2NvbmZpZ18pKTsKLSAgbWVtc2V0KG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLCAwLCBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgbWVtc2V0KG90YV9jb2RlY19wZWVyX2NvbmZpZ18sIDAsIHNpemVvZihvdGFfY29kZWNfcGVlcl9jb25maWdfKSk7Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZzo6fkEyZHBDb2RlY0NvbmZpZygpIHt9Ci0KLXZvaWQgQTJkcENvZGVjQ29uZmlnOjpzZXRDb2RlY1ByaW9yaXR5KAotICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KSB7Ci0gIGlmIChjb2RlY19wcmlvcml0eSA9PSBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVCkgewotICAgIC8vIENvbXB1dGUgdGhlIGRlZmF1bHQgY29kZWMgcHJpb3JpdHkKLSAgICBzZXREZWZhdWx0Q29kZWNQcmlvcml0eSgpOwotICB9IGVsc2UgewotICAgIGNvZGVjX3ByaW9yaXR5XyA9IGNvZGVjX3ByaW9yaXR5OwotICB9Ci0gIGNvZGVjX2NvbmZpZ18uY29kZWNfcHJpb3JpdHkgPSBjb2RlY19wcmlvcml0eV87Ci19Ci0KLXZvaWQgQTJkcENvZGVjQ29uZmlnOjpzZXREZWZhdWx0Q29kZWNQcmlvcml0eSgpIHsKLSAgaWYgKGRlZmF1bHRfY29kZWNfcHJpb3JpdHlfICE9IEJUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgY29kZWNfcHJpb3JpdHlfID0gZGVmYXVsdF9jb2RlY19wcmlvcml0eV87Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCBjb2RlYyBwcmlvcml0eQotICAgIHVpbnQzMl90IHByaW9yaXR5ID0gMTAwMCAqIChjb2RlY19pbmRleF8gKyAxKSArIDE7Ci0gICAgY29kZWNfcHJpb3JpdHlfID0gc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3Q+KHByaW9yaXR5KTsKLSAgfQotICBjb2RlY19jb25maWdfLmNvZGVjX3ByaW9yaXR5ID0gY29kZWNfcHJpb3JpdHlfOwotfQotCi1BMmRwQ29kZWNDb25maWcqIEEyZHBDb2RlY0NvbmZpZzo6Y3JlYXRlQ29kZWMoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgsCi0gICAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNfcHJpb3JpdHkpIHsKLSAgTE9HX0lORk8oIiVzOiBjb2RlYyAlcyIsIF9fZnVuY19fLCBBMkRQX0NvZGVjSW5kZXhTdHIoY29kZWNfaW5kZXgpKTsKLQotICBBMmRwQ29kZWNDb25maWcqIGNvZGVjX2NvbmZpZyA9IG51bGxwdHI7Ci0gIHN3aXRjaCAoY29kZWNfaW5kZXgpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDOgotICAgICAgY29kZWNfY29uZmlnID0gbmV3IEEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZShjb2RlY19wcmlvcml0eSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX1NCQzoKLSAgICAgIGNvZGVjX2NvbmZpZyA9IG5ldyBBMmRwQ29kZWNDb25maWdTYmNTaW5rKGNvZGVjX3ByaW9yaXR5KTsKLSAgICAgIGJyZWFrOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM6Ci0gICAgICBjb2RlY19jb25maWcgPSBuZXcgQTJkcENvZGVjQ29uZmlnQWFjU291cmNlKGNvZGVjX3ByaW9yaXR5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfQUFDOgotICAgICAgY29kZWNfY29uZmlnID0gbmV3IEEyZHBDb2RlY0NvbmZpZ0FhY1NpbmsoY29kZWNfcHJpb3JpdHkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFg6Ci0gICAgICBjb2RlY19jb25maWcgPSBuZXcgQTJkcENvZGVjQ29uZmlnQXB0eChjb2RlY19wcmlvcml0eSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRDoKLSAgICAgIGNvZGVjX2NvbmZpZyA9IG5ldyBBMmRwQ29kZWNDb25maWdBcHR4SGQoY29kZWNfcHJpb3JpdHkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM6Ci0gICAgICBjb2RlY19jb25maWcgPSBuZXcgQTJkcENvZGVjQ29uZmlnTGRhY1NvdXJjZShjb2RlY19wcmlvcml0eSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0xEQUM6Ci0gICAgICBjb2RlY19jb25maWcgPSBuZXcgQTJkcENvZGVjQ29uZmlnTGRhY1NpbmsoY29kZWNfcHJpb3JpdHkpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVg6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGNvZGVjX2NvbmZpZyAhPSBudWxscHRyKSB7Ci0gICAgaWYgKCFjb2RlY19jb25maWctPmluaXQoKSkgewotICAgICAgZGVsZXRlIGNvZGVjX2NvbmZpZzsKLSAgICAgIGNvZGVjX2NvbmZpZyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGNvZGVjX2NvbmZpZzsKLX0KLQotaW50IEEyZHBDb2RlY0NvbmZpZzo6Z2V0VHJhY2tCaXRSYXRlKCkgY29uc3QgewotICB1aW50OF90IHBfY29kZWNfaW5mb1tBVkRUX0NPREVDX1NJWkVdOwotICBtZW1jcHkocF9jb2RlY19pbmZvLCBvdGFfY29kZWNfY29uZmlnXywgc2l6ZW9mKG90YV9jb2RlY19jb25maWdfKSk7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBjb2RlY190eXBlID0gMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfR2V0Qml0cmF0ZVNiYygpOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9HZXRCaXRSYXRlQWFjKHBfY29kZWNfaW5mbyk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yR2V0Qml0UmF0ZShwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgTE9HX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotICByZXR1cm4gLTE7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpnZXRDb2RlY1NwZWNpZmljQ29uZmlnKHRCVF9BMkRQX09GRkxPQUQqIHBfYTJkcF9vZmZsb2FkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotCi0gIHVpbnQ4X3QgY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIHVpbnQzMl90IHZlbmRvcl9pZDsKLSAgdWludDE2X3QgY29kZWNfaWQ7Ci0KLSAgbWVtc2V0KHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvLCAwLCBzaXplb2YocF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm8pKTsKLQotICBpZiAoIUEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKG90YV9jb2RlY19jb25maWdfKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1lbWNweShjb2RlY19jb25maWcsIG90YV9jb2RlY19jb25maWdfLCBzaXplb2Yob3RhX2NvZGVjX2NvbmZpZ18pKTsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUoY29kZWNfY29uZmlnKTsKLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvWzBdID0KLSAgICAgICAgICBjb2RlY19jb25maWdbNF07ICAvLyBibGtfbGVuIHwgc3ViYmFuZHMgfCBBbGxvYyBNZXRob2QKLSAgICAgIHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvWzFdID0gY29kZWNfY29uZmlnWzVdOyAgLy8gTWluIGJpdCBwb29sCi0gICAgICBwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb1syXSA9IGNvZGVjX2NvbmZpZ1s2XTsgIC8vIE1heCBiaXQgcG9vbAotICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bM10gPQotICAgICAgICAgIGNvZGVjX2NvbmZpZ1szXTsgIC8vIFNhbXBsZSBmcmVxIHwgY2hhbm5lbCBtb2RlCi0gICAgICBicmVhazsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bMF0gPSBjb2RlY19jb25maWdbM107ICAvLyBvYmplY3QgdHlwZQotICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bMV0gPSBjb2RlY19jb25maWdbNl07ICAvLyBWQlIgfCBCUgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKGNvZGVjX2NvbmZpZyk7Ci0gICAgICBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKGNvZGVjX2NvbmZpZyk7Ci0gICAgICBwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb1swXSA9ICh2ZW5kb3JfaWQgJiAweDAwMDAwMEZGKTsKLSAgICAgIHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvWzFdID0gKHZlbmRvcl9pZCAmIDB4MDAwMEZGMDApID4+IDg7Ci0gICAgICBwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb1syXSA9ICh2ZW5kb3JfaWQgJiAweDAwRkYwMDAwKSA+PiAxNjsKLSAgICAgIHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvWzNdID0gKHZlbmRvcl9pZCAmIDB4RkYwMDAwMDApID4+IDI0OwotICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bNF0gPSAoY29kZWNfaWQgJiAweDAwMDAwMEZGKTsKLSAgICAgIHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvWzVdID0gKGNvZGVjX2lkICYgMHgwMDAwRkYwMCkgPj4gODsKLSAgICAgIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICAgICAgaWYgKGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSA9PSAwKSB7ICAvLyBkZWZhdWx0IGlzIDAsIEFCUgotICAgICAgICAgIHBfYTJkcF9vZmZsb2FkLT5jb2RlY19pbmZvWzZdID0KLSAgICAgICAgICAgICAgQTJEUF9MREFDX1FVQUxJVFlfQUJSX09GRkxPQUQ7ICAvLyBBQlIgaW4gb2ZmbG9hZAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xICUgMTApIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bNl0gPQotICAgICAgICAgICAgICAgICAgQTJEUF9MREFDX1FVQUxJVFlfSElHSDsgIC8vIEhpZ2ggYml0cmF0ZQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bNl0gPQotICAgICAgICAgICAgICAgICAgQTJEUF9MREFDX1FVQUxJVFlfTUlEOyAgLy8gTWlkIGJpcmF0ZQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgcF9hMmRwX29mZmxvYWQtPmNvZGVjX2luZm9bNl0gPQotICAgICAgICAgICAgICAgICAgQTJEUF9MREFDX1FVQUxJVFlfTE9XOyAgLy8gTG93IGJpcmF0ZQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb1s2XSA9Ci0gICAgICAgICAgICAgICAgICBBMkRQX0xEQUNfUVVBTElUWV9BQlJfT0ZGTE9BRDsgIC8vIEFCUiBpbiBvZmZsb2FkCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb1s3XSA9Ci0gICAgICAgICAgICBjb2RlY19jb25maWdbMTBdOyAgLy8gTERBQyBzcGVjaWZpYyBjaGFubmVsIG1vZGUKLSAgICAgICAgTE9HX1ZFUkJPU0UoIiVzOiBMZGFjIHNwZWNpZmljIGNoYW5uZWxtb2RlID0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb1s3XSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWc6OmlzVmFsaWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpjb3B5T3V0T3RhQ29kZWNDb25maWcodWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotCi0gIC8vIFRPRE86IFdlIHNob3VsZCB1c2UgYSBtZWNoYW5pc20gdG8gdmVyaWZ5IGNvZGVjIGNvbmZpZywKLSAgLy8gbm90IGNvZGVjIGNhcGFiaWxpdHkuCi0gIGlmICghQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWQob3RhX2NvZGVjX2NvbmZpZ18pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1lbWNweShwX2NvZGVjX2luZm8sIG90YV9jb2RlY19jb25maWdfLCBzaXplb2Yob3RhX2NvZGVjX2NvbmZpZ18pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjQ29uZmlnKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLQotICAvLyBUT0RPOiBXZSBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgY29kZWMgY29uZmlnIGlzIHZhbGlkCi0gIHJldHVybiBjb2RlY19jb25maWdfOwotfQotCi1idGF2X2EyZHBfY29kZWNfY29uZmlnX3QgQTJkcENvZGVjQ29uZmlnOjpnZXRDb2RlY0NhcGFiaWxpdHkoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotCi0gIC8vIFRPRE86IFdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBjYXBhYmlsaXR5IGlzIHZhbGlkCi0gIHJldHVybiBjb2RlY19jYXBhYmlsaXR5XzsKLX0KLQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNMb2NhbENhcGFiaWxpdHkoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotCi0gIC8vIFRPRE86IFdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBjYXBhYmlsaXR5IGlzIHZhbGlkCi0gIHJldHVybiBjb2RlY19sb2NhbF9jYXBhYmlsaXR5XzsKLX0KLQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNTZWxlY3RhYmxlQ2FwYWJpbGl0eSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0KLSAgLy8gVE9ETzogV2Ugc2hvdWxkIGNoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdHkgaXMgdmFsaWQKLSAgcmV0dXJuIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV87Ci19Ci0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjVXNlckNvbmZpZygpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0KLSAgcmV0dXJuIGNvZGVjX3VzZXJfY29uZmlnXzsKLX0KLQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNBdWRpb0NvbmZpZygpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0KLSAgcmV0dXJuIGNvZGVjX2F1ZGlvX2NvbmZpZ187Ci19Ci0KLXVpbnQ4X3QgQTJkcENvZGVjQ29uZmlnOjpnZXRBdWRpb0JpdHNQZXJTYW1wbGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotCi0gIHN3aXRjaCAoY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY6Ci0gICAgICByZXR1cm4gMTY7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OgotICAgICAgcmV0dXJuIDI0OwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIHJldHVybiAzMjsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZzo6aXNDb2RlY0NvbmZpZ0VtcHR5KAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfY29uZmlnKSB7Ci0gIHJldHVybiAoCi0gICAgICAoY29kZWNfY29uZmlnLmNvZGVjX3ByaW9yaXR5ID09IEJUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ERUZBVUxUKSAmJgotICAgICAgKGNvZGVjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSkgJiYKLSAgICAgIChjb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlID09IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORSkgJiYKLSAgICAgIChjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlID09IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkgJiYKLSAgICAgIChjb2RlY19jb25maWcuY29kZWNfc3BlY2lmaWNfMSA9PSAwKSAmJgotICAgICAgKGNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY18yID09IDApICYmCi0gICAgICAoY29kZWNfY29uZmlnLmNvZGVjX3NwZWNpZmljXzMgPT0gMCkgJiYKLSAgICAgIChjb2RlY19jb25maWcuY29kZWNfc3BlY2lmaWNfNCA9PSAwKSk7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpzZXRDb2RlY1VzZXJDb25maWcoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICAqcF9yZXN0YXJ0X2lucHV0ID0gZmFsc2U7Ci0gICpwX3Jlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gICpwX2NvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0KLSAgLy8gU2F2ZSBjb3BpZXMgb2YgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlnLCBhbmQgdGhlIE9UQSBjb2RlYyBjb25maWcsIHNvIHRoZXkKLSAgLy8gY2FuIGJlIGNvbXBhcmVkIGZvciBjaGFuZ2VzLgotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfY29uZmlnID0gZ2V0Q29kZWNDb25maWcoKTsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfY29uZmlnLCBvdGFfY29kZWNfY29uZmlnXywgc2l6ZW9mKG90YV9jb2RlY19jb25maWdfKSk7Ci0KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX3VzZXJfY29uZmlnID0gY29kZWNfdXNlcl9jb25maWdfOwotICBjb2RlY191c2VyX2NvbmZpZ18gPSBjb2RlY191c2VyX2NvbmZpZzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX2F1ZGlvX2NvbmZpZyA9IGNvZGVjX2F1ZGlvX2NvbmZpZ187Ci0gIGNvZGVjX2F1ZGlvX2NvbmZpZ18gPSBjb2RlY19hdWRpb19jb25maWc7Ci0gIGJvb2wgc3VjY2VzcyA9Ci0gICAgICBzZXRDb2RlY0NvbmZpZyhwX3BlZXJfY29kZWNfaW5mbywgaXNfY2FwYWJpbGl0eSwgcF9yZXN1bHRfY29kZWNfY29uZmlnKTsKLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgLy8gUmVzdG9yZSB0aGUgbG9jYWwgY29weSBvZiB0aGUgdXNlciBhbmQgYXVkaW8gY29uZmlnCi0gICAgY29kZWNfdXNlcl9jb25maWdfID0gc2F2ZWRfY29kZWNfdXNlcl9jb25maWc7Ci0gICAgY29kZWNfYXVkaW9fY29uZmlnXyA9IHNhdmVkX2NvZGVjX2F1ZGlvX2NvbmZpZzsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLwotICAvLyBUaGUgaW5wdXQgKGF1ZGlvIGRhdGEpIHNob3VsZCBiZSByZXN0YXJ0ZWQgaWYgdGhlIGF1ZGlvIGZvcm1hdCBoYXMgY2hhbmdlZAotICAvLwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgbmV3X2NvZGVjX2NvbmZpZyA9IGdldENvZGVjQ29uZmlnKCk7Ci0gIGlmICgoc2F2ZWRfY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlICE9IG5ld19jb2RlY19jb25maWcuc2FtcGxlX3JhdGUpIHx8Ci0gICAgICAoc2F2ZWRfY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSAhPQotICAgICAgIG5ld19jb2RlY19jb25maWcuYml0c19wZXJfc2FtcGxlKSB8fAotICAgICAgKHNhdmVkX2NvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUgIT0gbmV3X2NvZGVjX2NvbmZpZy5jaGFubmVsX21vZGUpKSB7Ci0gICAgKnBfcmVzdGFydF9pbnB1dCA9IHRydWU7Ci0gIH0KLQotICAvLwotICAvLyBUaGUgb3V0cHV0ICh0aGUgY29ubmVjdGlvbikgc2hvdWxkIGJlIHJlc3RhcnRlZCBpZiBPVEEgY29kZWMgY29uZmlnCi0gIC8vIGhhcyBjaGFuZ2VkLgotICAvLwotICBpZiAoIUEyRFBfQ29kZWNFcXVhbHMoc2F2ZWRfb3RhX2NvZGVjX2NvbmZpZywgcF9yZXN1bHRfY29kZWNfY29uZmlnKSkgewotICAgICpwX3Jlc3RhcnRfb3V0cHV0ID0gdHJ1ZTsKLSAgfQotCi0gIGlmICgqcF9yZXN0YXJ0X2lucHV0IHx8ICpwX3Jlc3RhcnRfb3V0cHV0KSAqcF9jb25maWdfdXBkYXRlZCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpjb2RlY0NvbmZpZ0lzVmFsaWQoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcpIHsKLSAgcmV0dXJuIChjb2RlY19jb25maWcuY29kZWNfdHlwZSA8IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVgpICYmCi0gICAgICAgICAoY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlICE9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FKSAmJgotICAgICAgICAgKGNvZGVjX2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUgIT0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpICYmCi0gICAgICAgICAoY29kZWNfY29uZmlnLmNoYW5uZWxfbW9kZSAhPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkUpOwotfQotCi1zdGQ6OnN0cmluZyBBMmRwQ29kZWNDb25maWc6OmNvZGVjQ29uZmlnMlN0cigKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2NvbmZpZykgewotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0KLSAgaWYgKCFjb2RlY0NvbmZpZ0lzVmFsaWQoY29kZWNfY29uZmlnKSkgcmV0dXJuICJJbnZhbGlkIjsKLQotICByZXN1bHQuYXBwZW5kKCJSYXRlPSIpOwotICByZXN1bHQuYXBwZW5kKGNvZGVjU2FtcGxlUmF0ZTJTdHIoY29kZWNfY29uZmlnLnNhbXBsZV9yYXRlKSk7Ci0gIHJlc3VsdC5hcHBlbmQoIiBCaXRzPSIpOwotICByZXN1bHQuYXBwZW5kKGNvZGVjQml0c1BlclNhbXBsZTJTdHIoY29kZWNfY29uZmlnLmJpdHNfcGVyX3NhbXBsZSkpOwotICByZXN1bHQuYXBwZW5kKCIgTW9kZT0iKTsKLSAgcmVzdWx0LmFwcGVuZChjb2RlY0NoYW5uZWxNb2RlMlN0cihjb2RlY19jb25maWcuY2hhbm5lbF9tb2RlKSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjpzdHJpbmcgQTJkcENvZGVjQ29uZmlnOjpjb2RlY1NhbXBsZVJhdGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGNvZGVjX3NhbXBsZV9yYXRlKSB7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLQotICBpZiAoY29kZWNfc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDApIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiNDQxMDAiOwotICB9Ci0gIGlmIChjb2RlY19zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMCkgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICI0ODAwMCI7Ci0gIH0KLSAgaWYgKGNvZGVjX3NhbXBsZV9yYXRlICYgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwKSB7Ci0gICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICJ8IjsKLSAgICByZXN1bHQgKz0gIjg4MjAwIjsKLSAgfQotICBpZiAoY29kZWNfc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDApIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiOTYwMDAiOwotICB9Ci0gIGlmIChjb2RlY19zYW1wbGVfcmF0ZSAmIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDApIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiMTc2NDAwIjsKLSAgfQotICBpZiAoY29kZWNfc2FtcGxlX3JhdGUgJiBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwKSB7Ci0gICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICJ8IjsKLSAgICByZXN1bHQgKz0gIjE5MjAwMCI7Ci0gIH0KLSAgaWYgKHJlc3VsdC5lbXB0eSgpKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgIlVua25vd25TYW1wbGVSYXRlKDB4IiA8PCBzdGQ6OmhleCA8PCBjb2RlY19zYW1wbGVfcmF0ZSA8PCAiKSI7Ci0gICAgc3MgPj4gcmVzdWx0OwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjpzdHJpbmcgQTJkcENvZGVjQ29uZmlnOjpjb2RlY0JpdHNQZXJTYW1wbGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBjb2RlY19iaXRzX3Blcl9zYW1wbGUpIHsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotCi0gIGlmIChjb2RlY19iaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2KSB7Ci0gICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICJ8IjsKLSAgICByZXN1bHQgKz0gIjE2IjsKLSAgfQotICBpZiAoY29kZWNfYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCkgewotICAgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAifCI7Ci0gICAgcmVzdWx0ICs9ICIyNCI7Ci0gIH0KLSAgaWYgKGNvZGVjX2JpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIpIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiMzIiOwotICB9Ci0gIGlmIChyZXN1bHQuZW1wdHkoKSkgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJVbmtub3duQml0c1BlclNhbXBsZSgweCIgPDwgc3RkOjpoZXggPDwgY29kZWNfYml0c19wZXJfc2FtcGxlIDw8ICIpIjsKLSAgICBzcyA+PiByZXN1bHQ7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBBMmRwQ29kZWNDb25maWc6OmNvZGVjQ2hhbm5lbE1vZGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCBjb2RlY19jaGFubmVsX21vZGUpIHsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotCi0gIGlmIChjb2RlY19jaGFubmVsX21vZGUgJiBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk8pIHsKLSAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSByZXN1bHQgKz0gInwiOwotICAgIHJlc3VsdCArPSAiTU9OTyI7Ci0gIH0KLSAgaWYgKGNvZGVjX2NoYW5uZWxfbW9kZSAmIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICJ8IjsKLSAgICByZXN1bHQgKz0gIlNURVJFTyI7Ci0gIH0KLSAgaWYgKHJlc3VsdC5lbXB0eSgpKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgIlVua25vd25DaGFubmVsTW9kZSgweCIgPDwgc3RkOjpoZXggPDwgY29kZWNfY2hhbm5lbF9tb2RlIDw8ICIpIjsKLSAgICBzcyA+PiByZXN1bHQ7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEEyZHBDb2RlY0NvbmZpZzo6ZGVidWdfY29kZWNfZHVtcChpbnQgZmQpIHsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBkcHJpbnRmKGZkLCAiXG5BMkRQICVzIFN0YXRlOlxuIiwgbmFtZSgpLmNfc3RyKCkpOwotICBkcHJpbnRmKGZkLCAiICBQcmlvcml0eTogJWRcbiIsIGNvZGVjUHJpb3JpdHkoKSk7Ci0KLSAgcmVzdWx0ID0gY29kZWNDb25maWcyU3RyKGdldENvZGVjQ29uZmlnKCkpOwotICBkcHJpbnRmKGZkLCAiICBDb25maWc6ICVzXG4iLCByZXN1bHQuY19zdHIoKSk7Ci0KLSAgcmVzdWx0ID0gY29kZWNDb25maWcyU3RyKGdldENvZGVjU2VsZWN0YWJsZUNhcGFiaWxpdHkoKSk7Ci0gIGRwcmludGYoZmQsICIgIFNlbGVjdGFibGU6ICVzXG4iLCByZXN1bHQuY19zdHIoKSk7Ci0KLSAgcmVzdWx0ID0gY29kZWNDb25maWcyU3RyKGdldENvZGVjTG9jYWxDYXBhYmlsaXR5KCkpOwotICBkcHJpbnRmKGZkLCAiICBMb2NhbCBjYXBhYmlsaXR5OiAlc1xuIiwgcmVzdWx0LmNfc3RyKCkpOwotfQotCi0vLwotLy8gQ29tcGFyZXMgdHdvIGNvZGVjcyB8bGhzfCBhbmQgfHJoc3wgYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkuCi0vLyBSZXR1cm5zIHRydWUgaWYgfGxoc3wgaGFzIGhpZ2hlciBwcmlvcml0eSAobGFyZ2VyIHByaW9yaXR5IHZhbHVlKS4KLS8vIElmIHxsaHN8IGFuZCB8cmhzfCBoYXZlIHNhbWUgcHJpb3JpdHksIHRoZSB1bmlxdWUgY29kZWMgaW5kZXggaXMgdXNlZAotLy8gYXMgYSB0aWUtYnJlYWtlcjogbGFyZ2VyIGNvZGVjIGluZGV4IHZhbHVlIG1lYW5zIGhpZ2hlciBwcmlvcml0eS4KLS8vCi1zdGF0aWMgYm9vbCBjb21wYXJlX2NvZGVjX3ByaW9yaXR5KGNvbnN0IEEyZHBDb2RlY0NvbmZpZyogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBMmRwQ29kZWNDb25maWcqIHJocykgewotICBpZiAobGhzLT5jb2RlY1ByaW9yaXR5KCkgPiByaHMtPmNvZGVjUHJpb3JpdHkoKSkgcmV0dXJuIHRydWU7Ci0gIGlmIChsaHMtPmNvZGVjUHJpb3JpdHkoKSA8IHJocy0+Y29kZWNQcmlvcml0eSgpKSByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiAobGhzLT5jb2RlY0luZGV4KCkgPiByaHMtPmNvZGVjSW5kZXgoKSk7Ci19Ci0KLUEyZHBDb2RlY3M6OkEyZHBDb2RlY3MoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllcykKLSAgICA6IGN1cnJlbnRfY29kZWNfY29uZmlnXyhudWxscHRyKSB7Ci0gIGZvciAoYXV0byBjb25maWcgOiBjb2RlY19wcmlvcml0aWVzKSB7Ci0gICAgY29kZWNfcHJpb3JpdGllc18uaW5zZXJ0KAotICAgICAgICBzdGQ6Om1ha2VfcGFpcihjb25maWcuY29kZWNfdHlwZSwgY29uZmlnLmNvZGVjX3ByaW9yaXR5KSk7Ci0gIH0KLX0KLQotQTJkcENvZGVjczo6fkEyZHBDb2RlY3MoKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogaW5kZXhlZF9jb2RlY3NfKSB7Ci0gICAgZGVsZXRlIGl0ZXIuc2Vjb25kOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgaXRlciA6IGRpc2FibGVkX2NvZGVjc18pIHsKLSAgICBkZWxldGUgaXRlci5zZWNvbmQ7Ci0gIH0KLSAgbG9jay51bmxvY2soKTsKLX0KLQotYm9vbCBBMmRwQ29kZWNzOjppbml0KCkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICBjaGFyKiB0b2sgPSBOVUxMOwotICBjaGFyKiB0bXBfdG9rZW4gPSBOVUxMOwotICBib29sIG9mZmxvYWRfY29kZWNfc3VwcG9ydFtCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYXSA9IHtmYWxzZX07Ci0gIGNoYXIgdmFsdWVfc3VwW1BST1BFUlRZX1ZBTFVFX01BWF0sIHZhbHVlX2Rpc1tQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi0gIG9zaV9wcm9wZXJ0eV9nZXQoInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgdmFsdWVfc3VwLCAiZmFsc2UiKTsKLSAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgdmFsdWVfZGlzLAotICAgICAgICAgICAgICAgICAgICJmYWxzZSIpOwotICBhMmRwX29mZmxvYWRfc3RhdHVzID0KLSAgICAgIChzdHJjbXAodmFsdWVfc3VwLCAidHJ1ZSIpID09IDApICYmIChzdHJjbXAodmFsdWVfZGlzLCAiZmFsc2UiKSA9PSAwKTsKLQotICBpZiAoYTJkcF9vZmZsb2FkX3N0YXR1cykgewotICAgIGNoYXIgdmFsdWVfY2FwW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgb3NpX3Byb3BlcnR5X2dldCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmNhcCIsIHZhbHVlX2NhcCwgIiIpOwotICAgIHRvayA9IHN0cnRva19yKChjaGFyKil2YWx1ZV9jYXAsICItIiwgJnRtcF90b2tlbik7Ci0gICAgd2hpbGUgKHRvayAhPSBOVUxMKSB7Ci0gICAgICBpZiAoc3RyY21wKHRvaywgInNiYyIpID09IDApIHsKLSAgICAgICAgTE9HX0lORk8oIiVzOiBTQkMgb2ZmbG9hZCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIG9mZmxvYWRfY29kZWNfc3VwcG9ydFtCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQ10gPSB0cnVlOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgICAgfSBlbHNlIGlmIChzdHJjbXAodG9rLCAiYWFjIikgPT0gMCkgewotICAgICAgICBMT0dfSU5GTygiJXM6IEFBQyBvZmZsb2FkIHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKLSAgICAgICAgb2ZmbG9hZF9jb2RlY19zdXBwb3J0W0JUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2ssICJhcHR4IikgPT0gMCkgewotICAgICAgICBMT0dfSU5GTygiJXM6IEFQVFggb2ZmbG9hZCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIG9mZmxvYWRfY29kZWNfc3VwcG9ydFtCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFhdID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHRvaywgImFwdHhoZCIpID09IDApIHsKLSAgICAgICAgTE9HX0lORk8oIiVzOiBBUFRYSEQgb2ZmbG9hZCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIG9mZmxvYWRfY29kZWNfc3VwcG9ydFtCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFhfSERdID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHRvaywgImxkYWMiKSA9PSAwKSB7Ci0gICAgICAgIExPR19JTkZPKCIlczogTERBQyBvZmZsb2FkIHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKLSAgICAgICAgb2ZmbG9hZF9jb2RlY19zdXBwb3J0W0JUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTERBQ10gPSB0cnVlOwotI2VuZGlmCi0gICAgICB9Ci0gICAgICB0b2sgPSBzdHJ0b2tfcihOVUxMLCAiLSIsICZ0bXBfdG9rZW4pOwotICAgIH07Ci0gIH0KLQotICBmb3IgKGludCBpID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX01JTjsgaSA8IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVg7IGkrKykgewotICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3Q+KGkpOwotCi0gICAgLy8gU2VsZWN0IHRoZSBjb2RlYyBwcmlvcml0eSBpZiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSA9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ERUZBVUxUOwotICAgIGF1dG8gY3BfaXRlciA9IGNvZGVjX3ByaW9yaXRpZXNfLmZpbmQoY29kZWNfaW5kZXgpOwotICAgIGlmIChjcF9pdGVyICE9IGNvZGVjX3ByaW9yaXRpZXNfLmVuZCgpKSB7Ci0gICAgICBjb2RlY19wcmlvcml0eSA9IGNwX2l0ZXItPnNlY29uZDsKLSAgICB9Ci0KLSAgICAvLyBJbiBvZmZsb2FkIG1vZGUsIGRpc2FibGUgdGhlIGNvZGVjcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkKLSAgICBpZiAoKGNvZGVjX2luZGV4IDwgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9NQVgpICYmCi0gICAgICAgIGEyZHBfb2ZmbG9hZF9zdGF0dXMgJiYgKG9mZmxvYWRfY29kZWNfc3VwcG9ydFtpXSAhPSB0cnVlKSkgewotICAgICAgY29kZWNfcHJpb3JpdHkgPSBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfRElTQUJMRUQ7Ci0gICAgfQotCi0gICAgQTJkcENvZGVjQ29uZmlnKiBjb2RlY19jb25maWcgPQotICAgICAgICBBMmRwQ29kZWNDb25maWc6OmNyZWF0ZUNvZGVjKGNvZGVjX2luZGV4LCBjb2RlY19wcmlvcml0eSk7Ci0gICAgaWYgKGNvZGVjX2NvbmZpZyA9PSBudWxscHRyKSBjb250aW51ZTsKLQotICAgIGlmIChjb2RlY19wcmlvcml0eSAhPSBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVCkgewotICAgICAgTE9HX0lORk8oIiVzOiB1cGRhdGVkICVzIGNvZGVjIHByaW9yaXR5IHRvICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICBjb2RlY19jb25maWctPm5hbWUoKS5jX3N0cigpLCBjb2RlY19wcmlvcml0eSk7Ci0gICAgfQotCi0gICAgLy8gVGVzdCBpZiB0aGUgY29kZWMgaXMgZGlzYWJsZWQKLSAgICBpZiAoY29kZWNfY29uZmlnLT5jb2RlY1ByaW9yaXR5KCkgPT0gQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0RJU0FCTEVEKSB7Ci0gICAgICBkaXNhYmxlZF9jb2RlY3NfLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb2RlY19pbmRleCwgY29kZWNfY29uZmlnKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpbmRleGVkX2NvZGVjc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvZGVjX2luZGV4LCBjb2RlY19jb25maWcpKTsKLQotICAgIGlmIChjb2RlY19pbmRleCA8IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUFYKSB7Ci0gICAgICBvcmRlcmVkX3NvdXJjZV9jb2RlY3NfLnB1c2hfYmFjayhjb2RlY19jb25maWcpOwotICAgICAgb3JkZXJlZF9zb3VyY2VfY29kZWNzXy5zb3J0KGNvbXBhcmVfY29kZWNfcHJpb3JpdHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvcmRlcmVkX3NpbmtfY29kZWNzXy5wdXNoX2JhY2soY29kZWNfY29uZmlnKTsKLSAgICAgIG9yZGVyZWRfc2lua19jb2RlY3NfLnNvcnQoY29tcGFyZV9jb2RlY19wcmlvcml0eSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9yZGVyZWRfc291cmNlX2NvZGVjc18uZW1wdHkoKSkgewotICAgIExPR19FUlJPUigiJXM6IG5vIFNvdXJjZSBjb2RlY3Mgd2VyZSBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKGF1dG8gaXRlciA6IG9yZGVyZWRfc291cmNlX2NvZGVjc18pIHsKLSAgICAgIExPR19JTkZPKCIlczogaW5pdGlhbGl6ZWQgU291cmNlIGNvZGVjICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICBpdGVyLT5uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChvcmRlcmVkX3NpbmtfY29kZWNzXy5lbXB0eSgpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogbm8gU2luayBjb2RlY3Mgd2VyZSBpbml0aWFsaXplZCIsIF9fZnVuY19fKTsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKGF1dG8gaXRlciA6IG9yZGVyZWRfc2lua19jb2RlY3NfKSB7Ci0gICAgICBMT0dfSU5GTygiJXM6IGluaXRpYWxpemVkIFNpbmsgY29kZWMgJXMiLCBfX2Z1bmNfXywgaXRlci0+bmFtZSgpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAoIW9yZGVyZWRfc291cmNlX2NvZGVjc18uZW1wdHkoKSAmJiAhb3JkZXJlZF9zaW5rX2NvZGVjc18uZW1wdHkoKSk7Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZyogQTJkcENvZGVjczo6ZmluZFNvdXJjZUNvZGVjQ29uZmlnKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXggPSBBMkRQX1NvdXJjZUNvZGVjSW5kZXgocF9jb2RlY19pbmZvKTsKLSAgaWYgKGNvZGVjX2luZGV4ID09IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVgpIHJldHVybiBudWxscHRyOwotCi0gIGF1dG8gaXRlciA9IGluZGV4ZWRfY29kZWNzXy5maW5kKGNvZGVjX2luZGV4KTsKLSAgaWYgKGl0ZXIgPT0gaW5kZXhlZF9jb2RlY3NfLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLX0KLQotQTJkcENvZGVjQ29uZmlnKiBBMmRwQ29kZWNzOjpmaW5kU2lua0NvZGVjQ29uZmlnKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXggPSBBMkRQX1NpbmtDb2RlY0luZGV4KHBfY29kZWNfaW5mbyk7Ci0gIGlmIChjb2RlY19pbmRleCA9PSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKSByZXR1cm4gbnVsbHB0cjsKLQotICBhdXRvIGl0ZXIgPSBpbmRleGVkX2NvZGVjc18uZmluZChjb2RlY19pbmRleCk7Ci0gIGlmIChpdGVyID09IGluZGV4ZWRfY29kZWNzXy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci19Ci0KLWJvb2wgQTJkcENvZGVjczo6aXNTdXBwb3J0ZWRDb2RlYyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgcmV0dXJuIGluZGV4ZWRfY29kZWNzXy5maW5kKGNvZGVjX2luZGV4KSAhPSBpbmRleGVkX2NvZGVjc18uZW5kKCk7Ci19Ci0KLWJvb2wgQTJkcENvZGVjczo6c2V0Q29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlbGVjdF9jdXJyZW50X2NvZGVjKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnID0gZmluZFNvdXJjZUNvZGVjQ29uZmlnKHBfcGVlcl9jb2RlY19pbmZvKTsKLSAgaWYgKGEyZHBfY29kZWNfY29uZmlnID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgaWYgKCFhMmRwX2NvZGVjX2NvbmZpZy0+c2V0Q29kZWNDb25maWcocF9wZWVyX2NvZGVjX2luZm8sIGlzX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0X2NvZGVjX2NvbmZpZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHNlbGVjdF9jdXJyZW50X2NvZGVjKSB7Ci0gICAgY3VycmVudF9jb2RlY19jb25maWdfID0gYTJkcF9jb2RlY19jb25maWc7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcENvZGVjczo6c2V0U2lua0NvZGVjQ29uZmlnKGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZWxlY3RfY3VycmVudF9jb2RlYykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZyA9IGZpbmRTaW5rQ29kZWNDb25maWcocF9wZWVyX2NvZGVjX2luZm8pOwotICBpZiAoYTJkcF9jb2RlY19jb25maWcgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICBpZiAoIWEyZHBfY29kZWNfY29uZmlnLT5zZXRDb2RlY0NvbmZpZyhwX3BlZXJfY29kZWNfaW5mbywgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHRfY29kZWNfY29uZmlnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoc2VsZWN0X2N1cnJlbnRfY29kZWMpIHsKLSAgICBjdXJyZW50X2NvZGVjX2NvbmZpZ18gPSBhMmRwX2NvZGVjX2NvbmZpZzsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNzOjpzZXRDb2RlY1VzZXJDb25maWcoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX3NpbmtfY2FwYWJpbGl0aWVzLCB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgYm9vbCogcF9yZXN0YXJ0X2lucHV0LCBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfYXVkaW9fY29uZmlnOwotICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnID0gbnVsbHB0cjsKLSAgQTJkcENvZGVjQ29uZmlnKiBsYXN0X2NvZGVjX2NvbmZpZyA9IGN1cnJlbnRfY29kZWNfY29uZmlnXzsKLSAgKnBfcmVzdGFydF9pbnB1dCA9IGZhbHNlOwotICAqcF9yZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICAqcF9jb25maWdfdXBkYXRlZCA9IGZhbHNlOwotCi0gIExPR19JTkZPKCIlczogQ29uZmlndXJpbmc6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgIGNvZGVjX3VzZXJfY29uZmlnLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnLmNvZGVjX3R5cGUgPCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKSB7Ci0gICAgYXV0byBpdGVyID0gaW5kZXhlZF9jb2RlY3NfLmZpbmQoY29kZWNfdXNlcl9jb25maWcuY29kZWNfdHlwZSk7Ci0gICAgaWYgKGl0ZXIgPT0gaW5kZXhlZF9jb2RlY3NfLmVuZCgpKSBnb3RvIGZhaWw7Ci0gICAgYTJkcF9jb2RlY19jb25maWcgPSBpdGVyLT5zZWNvbmQ7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVXBkYXRlIHRoZSBkZWZhdWx0IGNvZGVjCi0gICAgYTJkcF9jb2RlY19jb25maWcgPSBjdXJyZW50X2NvZGVjX2NvbmZpZ187Ci0gIH0KLSAgaWYgKGEyZHBfY29kZWNfY29uZmlnID09IG51bGxwdHIpIGdvdG8gZmFpbDsKLQotICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgY29kZWMgYXVkaW8gY29uZmlnCi0gIGNvZGVjX2F1ZGlvX2NvbmZpZyA9IGEyZHBfY29kZWNfY29uZmlnLT5nZXRDb2RlY0F1ZGlvQ29uZmlnKCk7Ci0gIGlmICghYTJkcF9jb2RlY19jb25maWctPnNldENvZGVjVXNlckNvbmZpZygKLSAgICAgICAgICBjb2RlY191c2VyX2NvbmZpZywgY29kZWNfYXVkaW9fY29uZmlnLCBwX3BlZXJfcGFyYW1zLAotICAgICAgICAgIHBfcGVlcl9zaW5rX2NhcGFiaWxpdGllcywgdHJ1ZSwgcF9yZXN1bHRfY29kZWNfY29uZmlnLAotICAgICAgICAgIHBfcmVzdGFydF9pbnB1dCwgcF9yZXN0YXJ0X291dHB1dCwgcF9jb25maWdfdXBkYXRlZCkpIHsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIGNvZGVjIHByaW9yaXRpZXMsIGFuZCBldmVudHVhbGx5IHJlc3RhcnQgdGhlIGNvbm5lY3Rpb24KLSAgLy8gaWYgYSBuZXcgY29kZWMgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCi0gIGRvIHsKLSAgICAvLyBVcGRhdGUgdGhlIGNvZGVjIHByaW9yaXR5Ci0gICAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3Qgb2xkX3ByaW9yaXR5ID0KLSAgICAgICAgYTJkcF9jb2RlY19jb25maWctPmNvZGVjUHJpb3JpdHkoKTsKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBuZXdfcHJpb3JpdHkgPSBjb2RlY191c2VyX2NvbmZpZy5jb2RlY19wcmlvcml0eTsKLSAgICBhMmRwX2NvZGVjX2NvbmZpZy0+c2V0Q29kZWNQcmlvcml0eShuZXdfcHJpb3JpdHkpOwotICAgIC8vIEdldCB0aGUgYWN0dWFsIChyZWNvbXB1dGVkKSBwcmlvcml0eQotICAgIG5ld19wcmlvcml0eSA9IGEyZHBfY29kZWNfY29uZmlnLT5jb2RlY1ByaW9yaXR5KCk7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgbm8gcHJldmlvdXMgY29kZWMKLSAgICBpZiAobGFzdF9jb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgY3VycmVudF9jb2RlY19jb25maWdfID0gYTJkcF9jb2RlY19jb25maWc7Ci0gICAgICAqcF9yZXN0YXJ0X2lucHV0ID0gdHJ1ZTsKLSAgICAgICpwX3Jlc3RhcnRfb3V0cHV0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBjb2RlYyB3YXMgdXBkYXRlZAotICAgIGlmIChhMmRwX2NvZGVjX2NvbmZpZyA9PSBsYXN0X2NvZGVjX2NvbmZpZykgewotICAgICAgaWYgKG9sZF9wcmlvcml0eSA9PSBuZXdfcHJpb3JpdHkpIGJyZWFrOyAgLy8gTm8gY2hhbmdlIGluIHByaW9yaXR5Ci0KLSAgICAgICpwX2NvbmZpZ191cGRhdGVkID0gdHJ1ZTsKLSAgICAgIGlmIChuZXdfcHJpb3JpdHkgPCBvbGRfcHJpb3JpdHkpIHsKLSAgICAgICAgLy8gVGhlIHByaW9yaXR5IGhhcyBiZWNvbWUgbG93ZXIgLSByZXN0YXJ0IHRoZSBjb25uZWN0aW9uIHRvCi0gICAgICAgIC8vIHNlbGVjdCBhIG5ldyBjb2RlYy4KLSAgICAgICAgKnBfcmVzdGFydF9vdXRwdXQgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG5ld19wcmlvcml0eSA8PSBvbGRfcHJpb3JpdHkpIHsKLSAgICAgIC8vIE5vIGNoYW5nZSBpbiBwcmlvcml0eSwgb3IgdGhlIHByaW9yaXR5IGhhcyBiZWNvbWUgbG93ZXIuCi0gICAgICAvLyBUaGlzIHdhc24ndCB0aGUgY3VycmVudCBjb2RlYywgc28gd2Ugc2hvdWxkbid0IHNlbGVjdCBhIG5ldyBjb2RlYy4KLSAgICAgIGlmICgqcF9yZXN0YXJ0X2lucHV0IHx8ICpwX3Jlc3RhcnRfb3V0cHV0IHx8Ci0gICAgICAgICAgKG9sZF9wcmlvcml0eSAhPSBuZXdfcHJpb3JpdHkpKSB7Ci0gICAgICAgICpwX2NvbmZpZ191cGRhdGVkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgICpwX3Jlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgICAgICpwX3Jlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAqcF9jb25maWdfdXBkYXRlZCA9IHRydWU7Ci0gICAgaWYgKG5ld19wcmlvcml0eSA+PSBsYXN0X2NvZGVjX2NvbmZpZy0+Y29kZWNQcmlvcml0eSgpKSB7Ci0gICAgICAvLyBUaGUgbmV3IHByaW9yaXR5IGlzIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IGNvZGVjLiBSZXN0YXJ0IHRoZQotICAgICAgLy8gY29ubmVjdGlvbiB0byBzZWxlY3QgYSBuZXcgY29kZWMuCi0gICAgICBjdXJyZW50X2NvZGVjX2NvbmZpZ18gPSBhMmRwX2NvZGVjX2NvbmZpZzsKLSAgICAgIGxhc3RfY29kZWNfY29uZmlnLT5zZXREZWZhdWx0Q29kZWNQcmlvcml0eSgpOwotICAgICAgKnBfcmVzdGFydF9pbnB1dCA9IHRydWU7Ci0gICAgICAqcF9yZXN0YXJ0X291dHB1dCA9IHRydWU7Ci0gICAgfQotICB9IHdoaWxlIChmYWxzZSk7Ci0gIG9yZGVyZWRfc291cmNlX2NvZGVjc18uc29ydChjb21wYXJlX2NvZGVjX3ByaW9yaXR5KTsKLQotICBpZiAoKnBfcmVzdGFydF9pbnB1dCB8fCAqcF9yZXN0YXJ0X291dHB1dCkgKnBfY29uZmlnX3VwZGF0ZWQgPSB0cnVlOwotCi0gIExPR19JTkZPKAotICAgICAgIiVzOiBDb25maWd1cmVkOiByZXN0YXJ0X2lucHV0ID0gJWQgcmVzdGFydF9vdXRwdXQgPSAlZCAiCi0gICAgICAiY29uZmlnX3VwZGF0ZWQgPSAlZCIsCi0gICAgICBfX2Z1bmNfXywgKnBfcmVzdGFydF9pbnB1dCwgKnBfcmVzdGFydF9vdXRwdXQsICpwX2NvbmZpZ191cGRhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotZmFpbDoKLSAgY3VycmVudF9jb2RlY19jb25maWdfID0gbGFzdF9jb2RlY19jb25maWc7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNzOjpzZXRDb2RlY0F1ZGlvQ29uZmlnKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfYXVkaW9fY29uZmlnLAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMsIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfdXNlcl9jb25maWc7Ci0gIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcgPSBjdXJyZW50X2NvZGVjX2NvbmZpZ187Ci0gICpwX3Jlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gICpwX2NvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0KLSAgaWYgKGEyZHBfY29kZWNfY29uZmlnID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLQotICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgY29kZWMgdXNlciBjb25maWcKLSAgY29kZWNfdXNlcl9jb25maWcgPSBhMmRwX2NvZGVjX2NvbmZpZy0+Z2V0Q29kZWNVc2VyQ29uZmlnKCk7Ci0gIGJvb2wgcmVzdGFydF9pbnB1dCA9IGZhbHNlOyAgLy8gRmxhZyBpZ25vcmVkIC0gaW5wdXQgd2FzIGp1c3QgcmVzdGFydGVkCi0gIGlmICghYTJkcF9jb2RlY19jb25maWctPnNldENvZGVjVXNlckNvbmZpZygKLSAgICAgICAgICBjb2RlY191c2VyX2NvbmZpZywgY29kZWNfYXVkaW9fY29uZmlnLCBwX3BlZXJfcGFyYW1zLAotICAgICAgICAgIHBfcGVlcl9zaW5rX2NhcGFiaWxpdGllcywgdHJ1ZSwgcF9yZXN1bHRfY29kZWNfY29uZmlnLCAmcmVzdGFydF9pbnB1dCwKLSAgICAgICAgICBwX3Jlc3RhcnRfb3V0cHV0LCBwX2NvbmZpZ191cGRhdGVkKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyZHBDb2RlY3M6OnNldENvZGVjT3RhQ29uZmlnKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfb3RhX2NvZGVjX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnLCBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCwgYm9vbCogcF9jb25maWdfdXBkYXRlZCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfdHlwZTsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX3VzZXJfY29uZmlnOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfYXVkaW9fY29uZmlnOwotICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnID0gbnVsbHB0cjsKLSAgQTJkcENvZGVjQ29uZmlnKiBsYXN0X2NvZGVjX2NvbmZpZyA9IGN1cnJlbnRfY29kZWNfY29uZmlnXzsKLSAgKnBfcmVzdGFydF9pbnB1dCA9IGZhbHNlOwotICAqcF9yZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICAqcF9jb25maWdfdXBkYXRlZCA9IGZhbHNlOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlnIGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZCBieQotICAvLyB1c2VyIGNvbmZpZ3VyYXRpb24uIElmIHllcywgdGhlbiB0aGUgT1RBIGNvZGVjIGNvbmZpZ3VyYXRpb24gaXMgaWdub3JlZC4KLSAgaWYgKGN1cnJlbnRfY29kZWNfY29uZmlnXyAhPSBudWxscHRyKSB7Ci0gICAgY29kZWNfdXNlcl9jb25maWcgPSBjdXJyZW50X2NvZGVjX2NvbmZpZ18tPmdldENvZGVjVXNlckNvbmZpZygpOwotICAgIGlmICghQTJkcENvZGVjQ29uZmlnOjppc0NvZGVjQ29uZmlnRW1wdHkoY29kZWNfdXNlcl9jb25maWcpKSB7Ci0gICAgICBMT0dfV0FSTigKLSAgICAgICAgICAiJXM6IGlnbm9yaW5nIHBlZXIgT1RBIGNvbmZpZ3VyYXRpb24gZm9yIGNvZGVjICVzOiAiCi0gICAgICAgICAgImV4aXN0aW5nIHVzZXIgY29uZmlndXJhdGlvbiBmb3IgY3VycmVudCBjb2RlYyAlcyIsCi0gICAgICAgICAgX19mdW5jX18sIEEyRFBfQ29kZWNOYW1lKHBfb3RhX2NvZGVjX2NvbmZpZyksCi0gICAgICAgICAgY3VycmVudF9jb2RlY19jb25maWdfLT5uYW1lKCkuY19zdHIoKSk7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgY29uZmlnIGZvciB0aGUgc2FtZSBjb2RlYyBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQKLSAgLy8gYnkgdXNlciBjb25maWd1cmF0aW9uLiBJZiB5ZXMsIHRoZW4gdGhlIE9UQSBjb2RlYyBjb25maWd1cmF0aW9uIGlzCi0gIC8vIGlnbm9yZWQuCi0gIGNvZGVjX3R5cGUgPSBBMkRQX1NvdXJjZUNvZGVjSW5kZXgocF9vdGFfY29kZWNfY29uZmlnKTsKLSAgaWYgKGNvZGVjX3R5cGUgPT0gQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiJXM6IGlnbm9yaW5nIHBlZXIgT1RBIGNvZGVjIGNvbmZpZ3VyYXRpb246ICIKLSAgICAgICAgImludmFsaWQgY29kZWMiLAotICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgZ290byBmYWlsOyAgLy8gSW52YWxpZCBjb2RlYwotICB9IGVsc2UgewotICAgIGF1dG8gaXRlciA9IGluZGV4ZWRfY29kZWNzXy5maW5kKGNvZGVjX3R5cGUpOwotICAgIGlmIChpdGVyID09IGluZGV4ZWRfY29kZWNzXy5lbmQoKSkgewotICAgICAgTE9HX1dBUk4oIiVzOiBjYW5ub3QgZmluZCBjb2RlYyBjb25maWd1cmF0aW9uIGZvciBwZWVyIE9UQSBjb2RlYyAlcyIsCi0gICAgICAgICAgICAgICBfX2Z1bmNfXywgQTJEUF9Db2RlY05hbWUocF9vdGFfY29kZWNfY29uZmlnKSk7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIGEyZHBfY29kZWNfY29uZmlnID0gaXRlci0+c2Vjb25kOwotICB9Ci0gIGlmIChhMmRwX2NvZGVjX2NvbmZpZyA9PSBudWxscHRyKSBnb3RvIGZhaWw7Ci0gIGNvZGVjX3VzZXJfY29uZmlnID0gYTJkcF9jb2RlY19jb25maWctPmdldENvZGVjVXNlckNvbmZpZygpOwotICBpZiAoIUEyZHBDb2RlY0NvbmZpZzo6aXNDb2RlY0NvbmZpZ0VtcHR5KGNvZGVjX3VzZXJfY29uZmlnKSkgewotICAgIExPR19XQVJOKAotICAgICAgICAiJXM6IGlnbm9yaW5nIHBlZXIgT1RBIGNvbmZpZ3VyYXRpb24gZm9yIGNvZGVjICVzOiAiCi0gICAgICAgICJleGlzdGluZyB1c2VyIGNvbmZpZ3VyYXRpb24gZm9yIHNhbWUgY29kZWMiLAotICAgICAgICBfX2Z1bmNfXywgQTJEUF9Db2RlY05hbWUocF9vdGFfY29kZWNfY29uZmlnKSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0gIGN1cnJlbnRfY29kZWNfY29uZmlnXyA9IGEyZHBfY29kZWNfY29uZmlnOwotCi0gIC8vIFJldXNlIHRoZSBleGlzdGluZyBjb2RlYyB1c2VyIGNvbmZpZyBhbmQgY29kZWMgYXVkaW8gY29uZmlnCi0gIGNvZGVjX2F1ZGlvX2NvbmZpZyA9IGEyZHBfY29kZWNfY29uZmlnLT5nZXRDb2RlY0F1ZGlvQ29uZmlnKCk7Ci0gIGlmICghYTJkcF9jb2RlY19jb25maWctPnNldENvZGVjVXNlckNvbmZpZygKLSAgICAgICAgICBjb2RlY191c2VyX2NvbmZpZywgY29kZWNfYXVkaW9fY29uZmlnLCBwX3BlZXJfcGFyYW1zLAotICAgICAgICAgIHBfb3RhX2NvZGVjX2NvbmZpZywgZmFsc2UsIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywgcF9yZXN0YXJ0X2lucHV0LAotICAgICAgICAgIHBfcmVzdGFydF9vdXRwdXQsIHBfY29uZmlnX3VwZGF0ZWQpKSB7Ci0gICAgTE9HX1dBUk4oIiVzOiBjYW5ub3Qgc2V0IGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIHBlZXIgT1RBIGNvZGVjICVzIiwKLSAgICAgICAgICAgICBfX2Z1bmNfXywgQTJEUF9Db2RlY05hbWUocF9vdGFfY29kZWNfY29uZmlnKSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0gIENIRUNLKGN1cnJlbnRfY29kZWNfY29uZmlnXyAhPSBudWxscHRyKTsKLQotICBpZiAoKnBfcmVzdGFydF9pbnB1dCB8fCAqcF9yZXN0YXJ0X291dHB1dCkgKnBfY29uZmlnX3VwZGF0ZWQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotCi1mYWlsOgotICBjdXJyZW50X2NvZGVjX2NvbmZpZ18gPSBsYXN0X2NvZGVjX2NvbmZpZzsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyZHBDb2RlY3M6OnNldFBlZXJTaW5rQ29kZWNDYXBhYmlsaXRpZXMoCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLQotICBpZiAoIUEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWQocF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcykpIHJldHVybiBmYWxzZTsKLSAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZyA9Ci0gICAgICBmaW5kU291cmNlQ29kZWNDb25maWcocF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcyk7Ci0gIGlmIChhMmRwX2NvZGVjX2NvbmZpZyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBhMmRwX2NvZGVjX2NvbmZpZy0+c2V0UGVlckNvZGVjQ2FwYWJpbGl0aWVzKHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpOwotfQotCi1ib29sIEEyZHBDb2RlY3M6OnNldFBlZXJTb3VyY2VDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotCi0gIGlmICghQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpKSByZXR1cm4gZmFsc2U7Ci0gIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcgPQotICAgICAgZmluZFNpbmtDb2RlY0NvbmZpZyhwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKTsKLSAgaWYgKGEyZHBfY29kZWNfY29uZmlnID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIGEyZHBfY29kZWNfY29uZmlnLT5zZXRQZWVyQ29kZWNDYXBhYmlsaXRpZXMocF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcyk7Ci19Ci0KLWJvb2wgQTJkcENvZGVjczo6Z2V0Q29kZWNDb25maWdBbmRDYXBhYmlsaXRpZXMoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZywKLSAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+KiBwX2NvZGVjc19sb2NhbF9jYXBhYmlsaXRpZXMsCi0gICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiogcF9jb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0KLSAgaWYgKGN1cnJlbnRfY29kZWNfY29uZmlnXyAhPSBudWxscHRyKSB7Ci0gICAgKnBfY29kZWNfY29uZmlnID0gY3VycmVudF9jb2RlY19jb25maWdfLT5nZXRDb2RlY0NvbmZpZygpOwotICB9IGVsc2UgewotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jb25maWc7Ci0gICAgbWVtc2V0KCZjb2RlY19jb25maWcsIDAsIHNpemVvZihjb2RlY19jb25maWcpKTsKLSAgICAqcF9jb2RlY19jb25maWcgPSBjb2RlY19jb25maWc7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19jYXBhYmlsaXRpZXM7Ci0gIGZvciAoYXV0byBjb2RlYyA6IG9yZGVyZWRTb3VyY2VDb2RlY3MoKSkgewotICAgIGNvZGVjc19jYXBhYmlsaXRpZXMucHVzaF9iYWNrKGNvZGVjLT5nZXRDb2RlY0xvY2FsQ2FwYWJpbGl0eSgpKTsKLSAgfQotICAqcF9jb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzID0gY29kZWNzX2NhcGFiaWxpdGllczsKLQotICBjb2RlY3NfY2FwYWJpbGl0aWVzLmNsZWFyKCk7Ci0gIGZvciAoYXV0byBjb2RlYyA6IG9yZGVyZWRTb3VyY2VDb2RlY3MoKSkgewotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19jYXBhYmlsaXR5ID0KLSAgICAgICAgY29kZWMtPmdldENvZGVjU2VsZWN0YWJsZUNhcGFiaWxpdHkoKTsKLSAgICAvLyBEb24ndCBhZGQgZW50cmllcyB0aGF0IGNhbm5vdCBiZSB1c2VkCi0gICAgaWYgKChjb2RlY19jYXBhYmlsaXR5LnNhbXBsZV9yYXRlID09IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FKSB8fAotICAgICAgICAoY29kZWNfY2FwYWJpbGl0eS5iaXRzX3Blcl9zYW1wbGUgPT0KLSAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORSkgfHwKLSAgICAgICAgKGNvZGVjX2NhcGFiaWxpdHkuY2hhbm5lbF9tb2RlID09IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBjb2RlY3NfY2FwYWJpbGl0aWVzLnB1c2hfYmFjayhjb2RlY19jYXBhYmlsaXR5KTsKLSAgfQotICAqcF9jb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMgPSBjb2RlY3NfY2FwYWJpbGl0aWVzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEEyZHBDb2RlY3M6OmRlYnVnX2NvZGVjX2R1bXAoaW50IGZkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICBkcHJpbnRmKGZkLCAiXG5BMkRQIENvZGVjcyBTdGF0ZTpcbiIpOwotCi0gIC8vIFByaW50IHRoZSBjdXJyZW50IGNvZGVjIG5hbWUKLSAgaWYgKGN1cnJlbnRfY29kZWNfY29uZmlnXyAhPSBudWxscHRyKSB7Ci0gICAgZHByaW50ZihmZCwgIiAgQ3VycmVudCBDb2RlYzogJXNcbiIsIGN1cnJlbnRfY29kZWNfY29uZmlnXy0+bmFtZSgpLmNfc3RyKCkpOwotICB9IGVsc2UgewotICAgIGRwcmludGYoZmQsICIgIEN1cnJlbnQgQ29kZWM6IE5vbmVcbiIpOwotICB9Ci0KLSAgLy8gUHJpbnQgdGhlIGNvZGVjLXNwZWNpZmljIHN0YXRlCi0gIGZvciAoYXV0byBjb2RlY19jb25maWcgOiBvcmRlcmVkX3NvdXJjZV9jb2RlY3NfKSB7Ci0gICAgY29kZWNfY29uZmlnLT5kZWJ1Z19jb2RlY19kdW1wKGZkKTsKLSAgfQotfQotCi10QTJEUF9DT0RFQ19UWVBFIEEyRFBfR2V0Q29kZWNUeXBlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICByZXR1cm4gKHRBMkRQX0NPREVDX1RZUEUpKHBfY29kZWNfaW5mb1tBVkRUX0NPREVDX1RZUEVfSU5ERVhdKTsKLX0KLQotYm9vbCBBMkRQX0lzU291cmNlQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvKTsKLQotICBMT0dfVkVSQk9TRSgiJXM6IGNvZGVjX3R5cGUgPSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWRTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkQWFjKHBfY29kZWNfaW5mbyk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfSXNWZW5kb3JTb3VyY2VDb2RlY1ZhbGlkKHBfY29kZWNfaW5mbyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQTJEUF9Jc1NpbmtDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIExPR19WRVJCT1NFKCIlczogY29kZWNfdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0lzU2lua0NvZGVjVmFsaWRTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfSXNTaW5rQ29kZWNWYWxpZEFhYyhwX2NvZGVjX2luZm8pOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIHJldHVybiBBMkRQX0lzVmVuZG9yU2lua0NvZGVjVmFsaWQocF9jb2RlY19pbmZvKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBjb2RlY190eXBlID0gMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfSXNQZWVyU291cmNlQ29kZWNWYWxpZFNiYyhwX2NvZGVjX2luZm8pOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkQWFjKHBfY29kZWNfaW5mbyk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfSXNWZW5kb3JQZWVyU291cmNlQ29kZWNWYWxpZChwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBjb2RlY190eXBlID0gMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWRTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWRBYWMocF9jb2RlY19pbmZvKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9Jc1ZlbmRvclBlZXJTaW5rQ29kZWNWYWxpZChwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyRFBfSXNTaW5rQ29kZWNTdXBwb3J0ZWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBjb2RlY190eXBlID0gMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfSXNTaW5rQ29kZWNTdXBwb3J0ZWRTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfSXNTaW5rQ29kZWNTdXBwb3J0ZWRBYWMocF9jb2RlY19pbmZvKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9Jc1ZlbmRvclNpbmtDb2RlY1N1cHBvcnRlZChwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgTE9HX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvKTsKLQotICBMT0dfVkVSQk9TRSgiJXM6IGNvZGVjX3R5cGUgPSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZFNiYyhwX2NvZGVjX2luZm8pOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZEFhYyhwX2NvZGVjX2luZm8pOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIHJldHVybiBBMkRQX0lzVmVuZG9yUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKHBfY29kZWNfaW5mbyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIiVzOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlIDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBMkRQX0luaXREZWZhdWx0Q29kZWModWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIEEyRFBfSW5pdERlZmF1bHRDb2RlY1NiYyhwX2NvZGVjX2luZm8pOwotfQotCi1ib29sIEEyRFBfVXNlc1J0cEhlYWRlcihib29sIGNvbnRlbnRfcHJvdGVjdGlvbl9lbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgaWYgKGNvZGVjX3R5cGUgIT0gQTJEUF9NRURJQV9DVF9OT05fQTJEUCkgcmV0dXJuIHRydWU7Ci0KLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgcmV0dXJuIEEyRFBfVmVuZG9yVXNlc1J0cEhlYWRlcihjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwgcF9jb2RlY19pbmZvKTsKLSNlbHNlCi0gIHJldHVybiB0cnVlOwotI2VuZGlmCi19Ci0KLXVpbnQ4X3QgQTJEUF9HZXRNZWRpYVR5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQ4X3QgbWVkaWFfdHlwZSA9IChwX2NvZGVjX2luZm9bQTJEUF9NRURJQV9UWVBFX09GRlNFVF0gPj4gNCkgJiAweDBmOwotICByZXR1cm4gbWVkaWFfdHlwZTsKLX0KLQotY29uc3QgY2hhciogQTJEUF9Db2RlY05hbWUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBjb2RlY190eXBlID0gMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfQ29kZWNOYW1lU2JjKHBfY29kZWNfaW5mbyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0NvZGVjTmFtZUFhYyhwX2NvZGVjX2luZm8pOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIHJldHVybiBBMkRQX1ZlbmRvckNvZGVjTmFtZShwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgTE9HX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotICByZXR1cm4gIlVOS05PV04gQ09ERUMiOwotfQotCi1ib29sIEEyRFBfQ29kZWNUeXBlRXF1YWxzKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGVfYSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mb19hKTsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlX2IgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm9fYik7Ci0KLSAgaWYgKGNvZGVjX3R5cGVfYSAhPSBjb2RlY190eXBlX2IpIHJldHVybiBmYWxzZTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGVfYSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9Db2RlY1R5cGVFcXVhbHNTYmMocF9jb2RlY19pbmZvX2EsIHBfY29kZWNfaW5mb19iKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfQ29kZWNUeXBlRXF1YWxzQWFjKHBfY29kZWNfaW5mb19hLCBwX2NvZGVjX2luZm9fYik7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNUeXBlRXF1YWxzKHBfY29kZWNfaW5mb19hLCBwX2NvZGVjX2luZm9fYik7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIiVzOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlIDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZV9hKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyRFBfQ29kZWNFcXVhbHMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlX2EgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm9fYSk7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZV9iID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvX2IpOwotCi0gIGlmIChjb2RlY190eXBlX2EgIT0gY29kZWNfdHlwZV9iKSByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlX2EpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfQ29kZWNFcXVhbHNTYmMocF9jb2RlY19pbmZvX2EsIHBfY29kZWNfaW5mb19iKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfQ29kZWNFcXVhbHNBYWMocF9jb2RlY19pbmZvX2EsIHBfY29kZWNfaW5mb19iKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY0VxdWFscyhwX2NvZGVjX2luZm9fYSwgcF9jb2RlY19pbmZvX2IpOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgTE9HX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGVfYSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIExPR19WRVJCT1NFKCIlczogY29kZWNfdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0dldFRyYWNrU2FtcGxlUmF0ZVNiYyhwX2NvZGVjX2luZm8pOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9HZXRUcmFja1NhbXBsZVJhdGVBYWMocF9jb2RlY19pbmZvKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGUocF9jb2RlY19pbmZvKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIExPR19FUlJPUigiJXM6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLSAgcmV0dXJuIC0xOwotfQotCi1pbnQgQTJEUF9HZXRUcmFja0JpdHNQZXJTYW1wbGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBjb2RlY190eXBlID0gMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfR2V0VHJhY2tCaXRzUGVyU2FtcGxlU2JjKHBfY29kZWNfaW5mbyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0dldFRyYWNrQml0c1BlclNhbXBsZUFhYyhwX2NvZGVjX2luZm8pOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFRyYWNrQml0c1BlclNhbXBsZShwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgTE9HX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIExPR19WRVJCT1NFKCIlczogY29kZWNfdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50U2JjKHBfY29kZWNfaW5mbyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50QWFjKHBfY29kZWNfaW5mbyk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnQocF9jb2RlY19pbmZvKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIExPR19FUlJPUigiJXM6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLSAgcmV0dXJuIC0xOwotfQotCi1pbnQgQTJEUF9HZXRTaW5rVHJhY2tDaGFubmVsVHlwZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvKTsKLQotICBMT0dfVkVSQk9TRSgiJXM6IGNvZGVjX3R5cGUgPSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9HZXRTaW5rVHJhY2tDaGFubmVsVHlwZVNiYyhwX2NvZGVjX2luZm8pOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9HZXRTaW5rVHJhY2tDaGFubmVsVHlwZUFhYyhwX2NvZGVjX2luZm8pOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFNpbmtUcmFja0NoYW5uZWxUeXBlKHBfY29kZWNfaW5mbyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIiVzOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlIDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0gIHJldHVybiAtMTsKLX0KLQotYm9vbCBBMkRQX0dldFBhY2tldFRpbWVzdGFtcChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0dldFBhY2tldFRpbWVzdGFtcFNiYyhwX2NvZGVjX2luZm8sIHBfZGF0YSwgcF90aW1lc3RhbXApOwotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9HZXRQYWNrZXRUaW1lc3RhbXBBYWMocF9jb2RlY19pbmZvLCBwX2RhdGEsIHBfdGltZXN0YW1wKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRQYWNrZXRUaW1lc3RhbXAocF9jb2RlY19pbmZvLCBwX2RhdGEsIHBfdGltZXN0YW1wKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIExPR19FUlJPUigiJXM6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyRFBfQnVpbGRDb2RlY0hlYWRlcihjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmcmFtZXNfcGVyX3BhY2tldCkgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9CdWlsZENvZGVjSGVhZGVyU2JjKHBfY29kZWNfaW5mbywgcF9idWYsIGZyYW1lc19wZXJfcGFja2V0KTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfQnVpbGRDb2RlY0hlYWRlckFhYyhwX2NvZGVjX2luZm8sIHBfYnVmLCBmcmFtZXNfcGVyX3BhY2tldCk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yQnVpbGRDb2RlY0hlYWRlcihwX2NvZGVjX2luZm8sIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNfcGVyX3BhY2tldCk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIiVzOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlIDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfR2V0RW5jb2RlckludGVyZmFjZSgKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvKTsKLQotICBMT0dfVkVSQk9TRSgiJXM6IGNvZGVjX3R5cGUgPSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9HZXRFbmNvZGVySW50ZXJmYWNlU2JjKHBfY29kZWNfaW5mbyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0dldEVuY29kZXJJbnRlcmZhY2VBYWMocF9jb2RlY19pbmZvKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRFbmNvZGVySW50ZXJmYWNlKHBfY29kZWNfaW5mbyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIiVzOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlIDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXREZWNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIExPR19WRVJCT1NFKCIlczogY29kZWNfdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0dldERlY29kZXJJbnRlcmZhY2VTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfR2V0RGVjb2RlckludGVyZmFjZUFhYyhwX2NvZGVjX2luZm8pOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIHJldHVybiBBMkRQX1ZlbmRvckdldERlY29kZXJJbnRlcmZhY2UocF9jb2RlY19pbmZvKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIExPR19FUlJPUigiJXM6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2wgQTJEUF9BZGp1c3RDb2RlYyh1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvKTsKLQotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfQWRqdXN0Q29kZWNTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfQWRqdXN0Q29kZWNBYWMocF9jb2RlY19pbmZvKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JBZGp1c3RDb2RlYyhwX2NvZGVjX2luZm8pOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgTE9HX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU291cmNlQ29kZWNJbmRleChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvKTsKLQotICBMT0dfVkVSQk9TRSgiJXM6IGNvZGVjX3R5cGUgPSAweCV4IiwgX19mdW5jX18sIGNvZGVjX3R5cGUpOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9Tb3VyY2VDb2RlY0luZGV4U2JjKHBfY29kZWNfaW5mbyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX1NvdXJjZUNvZGVjSW5kZXhBYWMocF9jb2RlY19pbmZvKTsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JTb3VyY2VDb2RlY0luZGV4KHBfY29kZWNfaW5mbyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBMT0dfRVJST1IoIiVzOiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlIDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOwotfQotCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1NpbmtDb2RlY0luZGV4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIExPR19WRVJCT1NFKCIlczogY29kZWNfdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywgY29kZWNfdHlwZSk7Ci0KLSAgc3dpdGNoIChjb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX1NpbmtDb2RlY0luZGV4U2JjKHBfY29kZWNfaW5mbyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX1NpbmtDb2RlY0luZGV4QWFjKHBfY29kZWNfaW5mbyk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yU2lua0NvZGVjSW5kZXgocF9jb2RlY19pbmZvKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIExPR19FUlJPUigiJXM6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgMHgleCIsIF9fZnVuY19fLCBjb2RlY190eXBlKTsKLSAgcmV0dXJuIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVg7Ci19Ci0KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNJbmRleFN0cihidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCkgewotICBzd2l0Y2ggKGNvZGVjX2luZGV4KSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0NvZGVjSW5kZXhTdHJTYmMoKTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX1NCQzoKLSAgICAgIHJldHVybiBBMkRQX0NvZGVjSW5kZXhTdHJTYmNTaW5rKCk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0NvZGVjSW5kZXhTdHJBYWMoKTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0NvZGVjSW5kZXhTdHJBYWNTaW5rKCk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotI2lmICFkZWZpbmVkKEVYQ0xVREVfTk9OU1RBTkRBUkRfQ09ERUNTKQotICBpZiAoY29kZWNfaW5kZXggPCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKQotICAgIHJldHVybiBBMkRQX1ZlbmRvckNvZGVjSW5kZXhTdHIoY29kZWNfaW5kZXgpOwotI2VuZGlmCi0KLSAgcmV0dXJuICJVTktOT1dOIENPREVDIElOREVYIjsKLX0KLQotYm9vbCBBMkRQX0luaXRDb2RlY0NvbmZpZyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkdHBTZXBDb25maWcqIHBfY2ZnKSB7Ci0gIExPR19WRVJCT1NFKCIlczogY29kZWMgJXMiLCBfX2Z1bmNfXywgQTJEUF9Db2RlY0luZGV4U3RyKGNvZGVjX2luZGV4KSk7Ci0KLSAgLyogRGVmYXVsdDogbm8gY29udGVudCBwcm90ZWN0aW9uIGluZm8gKi8KLSAgcF9jZmctPm51bV9wcm90ZWN0ID0gMDsKLSAgcF9jZmctPnByb3RlY3RfaW5mb1swXSA9IDA7Ci0KLSAgc3dpdGNoIChjb2RlY19pbmRleCkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9Jbml0Q29kZWNDb25maWdTYmMocF9jZmcpOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDOgotICAgICAgcmV0dXJuIEEyRFBfSW5pdENvZGVjQ29uZmlnU2JjU2luayhwX2NmZyk7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICAgIHJldHVybiBBMkRQX0luaXRDb2RlY0NvbmZpZ0FhYyhwX2NmZyk7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUM6Ci0gICAgICByZXR1cm4gQTJEUF9Jbml0Q29kZWNDb25maWdBYWNTaW5rKHBfY2ZnKTsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gIGlmIChjb2RlY19pbmRleCA8IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVgpCi0gICAgcmV0dXJuIEEyRFBfVmVuZG9ySW5pdENvZGVjQ29uZmlnKGNvZGVjX2luZGV4LCBwX2NmZyk7Ci0jZW5kaWYKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0ZDo6c3RyaW5nIEEyRFBfQ29kZWNJbmZvU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm8pOwotCi0gIHN3aXRjaCAoY29kZWNfdHlwZSkgewotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9TQkM6Ci0gICAgICByZXR1cm4gQTJEUF9Db2RlY0luZm9TdHJpbmdTYmMocF9jb2RlY19pbmZvKTsKLSNpZiAhZGVmaW5lZChFWENMVURFX05PTlNUQU5EQVJEX0NPREVDUykKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfQUFDOgotICAgICAgcmV0dXJuIEEyRFBfQ29kZWNJbmZvU3RyaW5nQWFjKHBfY29kZWNfaW5mbyk7Ci0gICAgY2FzZSBBMkRQX01FRElBX0NUX05PTl9BMkRQOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nKHBfY29kZWNfaW5mbyk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gIlVuc3VwcG9ydGVkIGNvZGVjIHR5cGU6ICIgKyBsb2doZXgoY29kZWNfdHlwZSk7Ci19Ci0KLWludCBBMkRQX0dldEVlY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mbyk7Ci0KLSAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIGEyZHBfZW5jb2Rlcl9pbnRlcmZhY2UgPSBudWxscHRyOwotICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEEyRFBfTUVESUFfQ1RfU0JDOgotICAgICAgYTJkcF9lbmNvZGVyX2ludGVyZmFjZSA9IEEyRFBfR2V0RW5jb2RlckludGVyZmFjZVNiYyhwX2NvZGVjX2luZm8pOwotICAgICAgYnJlYWs7Ci0jaWYgIWRlZmluZWQoRVhDTFVERV9OT05TVEFOREFSRF9DT0RFQ1MpCi0gICAgY2FzZSBBMkRQX01FRElBX0NUX0FBQzoKLSAgICAgIGEyZHBfZW5jb2Rlcl9pbnRlcmZhY2UgPSBBMkRQX0dldEVuY29kZXJJbnRlcmZhY2VBYWMocF9jb2RlY19pbmZvKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQTJEUF9NRURJQV9DVF9OT05fQTJEUDoKLSAgICAgIGEyZHBfZW5jb2Rlcl9pbnRlcmZhY2UgPSBBMkRQX1ZlbmRvckdldEVuY29kZXJJbnRlcmZhY2UocF9jb2RlY19pbmZvKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChhMmRwX2VuY29kZXJfaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gYTJkcF9lbmNvZGVyX2ludGVyZmFjZS0+Z2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfaW50LmggYi9zdGFjay9hMmRwL2EyZHBfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOGY5MDguLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAyRFAgaW50ZXJuYWwgaGVhZGVyIGZpbGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBBMkRQX0lOVF9ICi0jZGVmaW5lIEEyRFBfSU5UX0gKLQotI2luY2x1ZGUgImEyZHBfYXBpLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEEyRFBfVkVSU0lPTiAweDAxMDMKLQotLyogTnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gQTJEUCBTRFAgcmVjb3JkLiAqLwotI2RlZmluZSBBMkRQX05VTV9BVFRSIDYKLQotLyogTnVtYmVyIG9mIHByb3RvY29sIGVsZW1lbnRzIGluIHByb3RvY29sIGVsZW1lbnQgbGlzdC4gKi8KLSNkZWZpbmUgQTJEUF9OVU1fUFJPVE9fRUxFTVMgMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29udHJvbCBibG9jayB1c2VkIGJ5IEEyRFBfRmluZFNlcnZpY2UoKS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEEyRFBfRklORF9DQkFDSyogcF9jYmFjazsgLyogcG9pbnRlciB0byBhcHBsaWNhdGlvbiBjYWxsYmFjayAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYjsgICAvKiBwb2ludGVyIHRvIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQ7ICAgICAvKiBzZXJ2aWNlIFVVSUQgb2Ygc2VhcmNoICovCi19IHRBMkRQX0ZJTkRfQ0I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEEyRFBfRklORF9DQiBmaW5kOyAvKiBmaW5kIHNlcnZpY2UgY29udHJvbCBibG9jayAqLwotICB1aW50OF90IHRyYWNlX2xldmVsOwotICB1aW50MTZfdCBhdmR0X3NkcF92ZXI7IC8qIEFWRFRQIHZlcnNpb24gKi8KLX0gdEEyRFBfQ0I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1haW4gQ29udHJvbCBCbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QTJEUF9DQiBhMmRwX2NiOwotCi0vKiBVc2VkIG9ubHkgZm9yIGNvbmZvcm1hbmNlIHRlc3RpbmcgKi8KLWV4dGVybiB2b2lkIGEyZHBfc2V0X2F2ZHRfc2RwX3Zlcih1aW50MTZfdCBhdmR0X3NkcF92ZXIpOwotCi0jZW5kaWYgLyogQTJEUF9JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svYTJkcC9hMmRwX3NiYy5jYyBiL3N0YWNrL2EyZHAvYTJkcF9zYmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDVhMTUuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3NiYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoZWxwIGJ1aWxkIGFuZCBwYXJzZSBTQkMgQ29kZWMgSW5mb3JtYXRpb24gRWxlbWVudAotICogIGFuZCBNZWRpYSBQYXlsb2FkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYTJkcF9zYmMiCi0KLSNpbmNsdWRlICJhMmRwX3NiYy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhMmRwX3NiY19kZWNvZGVyLmgiCi0jaW5jbHVkZSAiYTJkcF9zYmNfZW5jb2Rlci5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiZW1iZHJ2L3NiYy9lbmNvZGVyL2luY2x1ZGUvc2JjX2VuY29kZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0jZGVmaW5lIEEyRFBfU0JDX01BWF9CSVRQT09MIDUzCi0KLS8qIGRhdGEgdHlwZSBmb3IgdGhlIFNCQyBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc2FtcF9mcmVxOyAgICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgdWludDhfdCBjaF9tb2RlOyAgICAgIC8qIENoYW5uZWwgbW9kZSAqLwotICB1aW50OF90IGJsb2NrX2xlbjsgICAgLyogQmxvY2sgbGVuZ3RoICovCi0gIHVpbnQ4X3QgbnVtX3N1YmJhbmRzOyAvKiBOdW1iZXIgb2Ygc3ViYmFuZHMgKi8KLSAgdWludDhfdCBhbGxvY19tZXRob2Q7IC8qIEFsbG9jYXRpb24gbWV0aG9kICovCi0gIHVpbnQ4X3QgbWluX2JpdHBvb2w7ICAvKiBNaW5pbXVtIGJpdHBvb2wgKi8KLSAgdWludDhfdCBtYXhfYml0cG9vbDsgIC8qIE1heGltdW0gYml0cG9vbCAqLwotICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgYml0c19wZXJfc2FtcGxlOwotfSB0QTJEUF9TQkNfQ0lFOwotCi0vKiBTQkMgU291cmNlIGNvZGVjIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGNvbnN0IHRBMkRQX1NCQ19DSUUgYTJkcF9zYmNfc291cmNlX2NhcHMgPSB7Ci0gICAgKEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhbXBfZnJlcSAqLwotICAgIChBMkRQX1NCQ19JRV9DSF9NRF9NT05PIHwgQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQpLCAvKiBjaF9tb2RlICovCi0gICAgKEEyRFBfU0JDX0lFX0JMT0NLU18xNiB8IEEyRFBfU0JDX0lFX0JMT0NLU18xMiB8IEEyRFBfU0JDX0lFX0JMT0NLU184IHwKLSAgICAgQTJEUF9TQkNfSUVfQkxPQ0tTXzQpLCAgICAgICAgICAgIC8qIGJsb2NrX2xlbiAqLwotICAgIEEyRFBfU0JDX0lFX1NVQkJBTkRfOCwgICAgICAgICAgICAgLyogbnVtX3N1YmJhbmRzICovCi0gICAgQTJEUF9TQkNfSUVfQUxMT0NfTURfTCwgICAgICAgICAgICAvKiBhbGxvY19tZXRob2QgKi8KLSAgICBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTCwgICAgICAgICAgIC8qIG1pbl9iaXRwb29sICovCi0gICAgQTJEUF9TQkNfTUFYX0JJVFBPT0wsICAgICAgICAgICAgICAvKiBtYXhfYml0cG9vbCAqLwotICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYgLyogYml0c19wZXJfc2FtcGxlICovCi19OwotCi0vKiBTQkMgU2luayBjb2RlYyBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBjb25zdCB0QTJEUF9TQkNfQ0lFIGEyZHBfc2JjX3NpbmtfY2FwcyA9IHsKLSAgICAoQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4IHwgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0KSwgLyogc2FtcF9mcmVxICovCi0gICAgKEEyRFBfU0JDX0lFX0NIX01EX01PTk8gfCBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8gfAotICAgICBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVCB8IEEyRFBfU0JDX0lFX0NIX01EX0RVQUwpLCAvKiBjaF9tb2RlICovCi0gICAgKEEyRFBfU0JDX0lFX0JMT0NLU18xNiB8IEEyRFBfU0JDX0lFX0JMT0NLU18xMiB8IEEyRFBfU0JDX0lFX0JMT0NLU184IHwKLSAgICAgQTJEUF9TQkNfSUVfQkxPQ0tTXzQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibG9ja19sZW4gKi8KLSAgICAoQTJEUF9TQkNfSUVfU1VCQkFORF80IHwgQTJEUF9TQkNfSUVfU1VCQkFORF84KSwgICAvKiBudW1fc3ViYmFuZHMgKi8KLSAgICAoQTJEUF9TQkNfSUVfQUxMT0NfTURfTCB8IEEyRFBfU0JDX0lFX0FMTE9DX01EX1MpLCAvKiBhbGxvY19tZXRob2QgKi8KLSAgICBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5fYml0cG9vbCAqLwotICAgIEEyRFBfU0JDX01BWF9CSVRQT09MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heF9iaXRwb29sICovCi0gICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNiAgICAgICAgICAgICAgICAgLyogYml0c19wZXJfc2FtcGxlICovCi19OwotCi0vKiBEZWZhdWx0IFNCQyBjb2RlYyBjb25maWd1cmF0aW9uICovCi1jb25zdCB0QTJEUF9TQkNfQ0lFIGEyZHBfc2JjX2RlZmF1bHRfY29uZmlnID0gewotICAgIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCwgICAgICAgICAgLyogc2FtcF9mcmVxICovCi0gICAgQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQsICAgICAgICAgICAvKiBjaF9tb2RlICovCi0gICAgQTJEUF9TQkNfSUVfQkxPQ0tTXzE2LCAgICAgICAgICAgICAvKiBibG9ja19sZW4gKi8KLSAgICBBMkRQX1NCQ19JRV9TVUJCQU5EXzgsICAgICAgICAgICAgIC8qIG51bV9zdWJiYW5kcyAqLwotICAgIEEyRFBfU0JDX0lFX0FMTE9DX01EX0wsICAgICAgICAgICAgLyogYWxsb2NfbWV0aG9kICovCi0gICAgQTJEUF9TQkNfSUVfTUlOX0JJVFBPT0wsICAgICAgICAgICAvKiBtaW5fYml0cG9vbCAqLwotICAgIEEyRFBfU0JDX01BWF9CSVRQT09MLCAgICAgICAgICAgICAgLyogbWF4X2JpdHBvb2wgKi8KLSAgICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2IC8qIGJpdHNfcGVyX3NhbXBsZSAqLwotfTsKLQotc3RhdGljIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFIGEyZHBfZW5jb2Rlcl9pbnRlcmZhY2Vfc2JjID0gewotICAgIGEyZHBfc2JjX2VuY29kZXJfaW5pdCwKLSAgICBhMmRwX3NiY19lbmNvZGVyX2NsZWFudXAsCi0gICAgYTJkcF9zYmNfZmVlZGluZ19yZXNldCwKLSAgICBhMmRwX3NiY19mZWVkaW5nX2ZsdXNoLAotICAgIGEyZHBfc2JjX2dldF9lbmNvZGVyX2ludGVydmFsX21zLAotICAgIGEyZHBfc2JjX2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSwKLSAgICBhMmRwX3NiY19zZW5kX2ZyYW1lcywKLSAgICBudWxscHRyICAvLyBzZXRfdHJhbnNtaXRfcXVldWVfbGVuZ3RoCi19OwotCi1zdGF0aWMgY29uc3QgdEEyRFBfREVDT0RFUl9JTlRFUkZBQ0UgYTJkcF9kZWNvZGVyX2ludGVyZmFjZV9zYmMgPSB7Ci0gICAgYTJkcF9zYmNfZGVjb2Rlcl9pbml0LAotICAgIGEyZHBfc2JjX2RlY29kZXJfY2xlYW51cCwKLSAgICBhMmRwX3NiY19kZWNvZGVyX2RlY29kZV9wYWNrZXQsCi0gICAgbnVsbHB0ciwgIC8vIGRlY29kZXJfc3RhcnQKLSAgICBudWxscHRyLCAgLy8gZGVjb2Rlcl9zdXNwZW5kCi0gICAgbnVsbHB0ciwgIC8vIGRlY29kZXJfY29uZmlndXJlCi19OwotCi1zdGF0aWMgdEEyRFBfU1RBVFVTIEEyRFBfQ29kZWNJbmZvTWF0Y2hlc0NhcGFiaWxpdHlTYmMoCi0gICAgY29uc3QgdEEyRFBfU0JDX0NJRSogcF9jYXAsIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICBib29sIGlzX2NhcGFiaWxpdHkpOwotc3RhdGljIHZvaWQgQTJEUF9QYXJzZU1wbEhlYWRlclNiYyh1aW50OF90KiBwX3NyYywgYm9vbCogcF9mcmFnLCBib29sKiBwX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX2xhc3QsIHVpbnQ4X3QqIHBfbnVtKTsKLQotLy8gQnVpbGRzIHRoZSBTQkMgTWVkaWEgQ29kZWMgQ2FwYWJpbGl0aWVzIGJ5dGUgc2VxdWVuY2UgYmVnaW5uaW5nIGZyb20gdGhlCi0vLyBMT1NDIG9jdGV0LiB8bWVkaWFfdHlwZXwgaXMgdGhlIG1lZGlhIHR5cGUgfEFWRFRfTUVESUFfVFlQRV8qfC4KLS8vIHxwX2llfCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNCQyBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50IGluZm9ybWF0aW9uLgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fC4gUmV0dXJucyBBMkRQX1NVQ0NFU1Mgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB0aGUgY29ycmVzcG9uZGluZyBBMkRQIGVycm9yIHN0YXR1cyBjb2RlLgotc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0J1aWxkSW5mb1NiYyh1aW50OF90IG1lZGlhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBMkRQX1NCQ19DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0KSB7Ci0gIGlmIChwX2llID09IE5VTEwgfHwgcF9yZXN1bHQgPT0gTlVMTCB8fAotICAgICAgKHBfaWUtPnNhbXBfZnJlcSAmIH5BMkRQX1NCQ19JRV9TQU1QX0ZSRVFfTVNLKSB8fAotICAgICAgKHBfaWUtPmNoX21vZGUgJiB+QTJEUF9TQkNfSUVfQ0hfTURfTVNLKSB8fAotICAgICAgKHBfaWUtPmJsb2NrX2xlbiAmIH5BMkRQX1NCQ19JRV9CTE9DS1NfTVNLKSB8fAotICAgICAgKHBfaWUtPm51bV9zdWJiYW5kcyAmIH5BMkRQX1NCQ19JRV9TVUJCQU5EX01TSykgfHwKLSAgICAgIChwX2llLT5hbGxvY19tZXRob2QgJiB+QTJEUF9TQkNfSUVfQUxMT0NfTURfTVNLKSB8fAotICAgICAgKHBfaWUtPm1pbl9iaXRwb29sID4gcF9pZS0+bWF4X2JpdHBvb2wpIHx8Ci0gICAgICAocF9pZS0+bWluX2JpdHBvb2wgPCBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTCkgfHwKLSAgICAgIChwX2llLT5taW5fYml0cG9vbCA+IEEyRFBfU0JDX0lFX01BWF9CSVRQT09MKSB8fAotICAgICAgKHBfaWUtPm1heF9iaXRwb29sIDwgQTJEUF9TQkNfSUVfTUlOX0JJVFBPT0wpIHx8Ci0gICAgICAocF9pZS0+bWF4X2JpdHBvb2wgPiBBMkRQX1NCQ19JRV9NQVhfQklUUE9PTCkpIHsKLSAgICAvKiBpZiBhbnkgdW51c2VkIGJpdCBpcyBzZXQgKi8KLSAgICByZXR1cm4gQTJEUF9JTlZBTElEX1BBUkFNUzsKLSAgfQotCi0gICpwX3Jlc3VsdCsrID0gQTJEUF9TQkNfSU5GT19MRU47Ci0gICpwX3Jlc3VsdCsrID0gKG1lZGlhX3R5cGUgPDwgNCk7Ci0gICpwX3Jlc3VsdCsrID0gQTJEUF9NRURJQV9DVF9TQkM7Ci0KLSAgLyogTWVkaWEgQ29kZWMgU3BlY2lmaWMgSW5mb3JtYXRpb24gRWxlbWVudCAqLwotICAqcF9yZXN1bHQrKyA9IHBfaWUtPnNhbXBfZnJlcSB8IHBfaWUtPmNoX21vZGU7Ci0KLSAgKnBfcmVzdWx0KysgPSBwX2llLT5ibG9ja19sZW4gfCBwX2llLT5udW1fc3ViYmFuZHMgfCBwX2llLT5hbGxvY19tZXRob2Q7Ci0KLSAgKnBfcmVzdWx0KysgPSBwX2llLT5taW5fYml0cG9vbDsKLSAgKnBfcmVzdWx0ID0gcF9pZS0+bWF4X2JpdHBvb2w7Ci0KLSAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLX0KLQotLy8gUGFyc2VzIHRoZSBTQkMgTWVkaWEgQ29kZWMgQ2FwYWJpbGl0aWVzIGJ5dGUgc2VxdWVuY2UgYmVnaW5uaW5nIGZyb20gdGhlCi0vLyBMT1NDIG9jdGV0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9pZXwuIFRoZSBieXRlIHNlcXVlbmNlIHRvIHBhcnNlIGlzCi0vLyB8cF9jb2RlY19pbmZvfC4gSWYgfGlzX2NhcGFiaWxpdHl8IGlzIHRydWUsIHRoZSBieXRlIHNlcXVlbmNlIGNvbnRhaW5zCi0vLyBjb2RlYyBjYXBhYmlsaXR5LgotLy8gUmV0dXJucyBBMkRQX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHRoZSBjb3JyZXNwb25kaW5nIEEyRFAgZXJyb3IKLS8vIHN0YXR1cyBjb2RlLgotc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX1BhcnNlSW5mb1NiYyh0QTJEUF9TQkNfQ0lFKiBwX2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2FwYWJpbGl0eSkgewotICB1aW50OF90IGxvc2M7Ci0gIHVpbnQ4X3QgbWVkaWFfdHlwZTsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlOwotCi0gIGlmIChwX2llID09IE5VTEwgfHwgcF9jb2RlY19pbmZvID09IE5VTEwpIHJldHVybiBBMkRQX0lOVkFMSURfUEFSQU1TOwotCi0gIC8vIENoZWNrIHRoZSBjb2RlYyBjYXBhYmlsaXR5IGxlbmd0aAotICBsb3NjID0gKnBfY29kZWNfaW5mbysrOwotICBpZiAobG9zYyAhPSBBMkRQX1NCQ19JTkZPX0xFTikgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0KLSAgbWVkaWFfdHlwZSA9ICgqcF9jb2RlY19pbmZvKyspID4+IDQ7Ci0gIGNvZGVjX3R5cGUgPSAqcF9jb2RlY19pbmZvKys7Ci0gIC8qIENoZWNrIHRoZSBNZWRpYSBUeXBlIGFuZCBNZWRpYSBDb2RlYyBUeXBlICovCi0gIGlmIChtZWRpYV90eXBlICE9IEFWRFRfTUVESUFfVFlQRV9BVURJTyB8fCBjb2RlY190eXBlICE9IEEyRFBfTUVESUFfQ1RfU0JDKSB7Ci0gICAgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0gIH0KLQotICBwX2llLT5zYW1wX2ZyZXEgPSAqcF9jb2RlY19pbmZvICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRX01TSzsKLSAgcF9pZS0+Y2hfbW9kZSA9ICpwX2NvZGVjX2luZm8gJiBBMkRQX1NCQ19JRV9DSF9NRF9NU0s7Ci0gIHBfY29kZWNfaW5mbysrOwotICBwX2llLT5ibG9ja19sZW4gPSAqcF9jb2RlY19pbmZvICYgQTJEUF9TQkNfSUVfQkxPQ0tTX01TSzsKLSAgcF9pZS0+bnVtX3N1YmJhbmRzID0gKnBfY29kZWNfaW5mbyAmIEEyRFBfU0JDX0lFX1NVQkJBTkRfTVNLOwotICBwX2llLT5hbGxvY19tZXRob2QgPSAqcF9jb2RlY19pbmZvICYgQTJEUF9TQkNfSUVfQUxMT0NfTURfTVNLOwotICBwX2NvZGVjX2luZm8rKzsKLSAgcF9pZS0+bWluX2JpdHBvb2wgPSAqcF9jb2RlY19pbmZvKys7Ci0gIHBfaWUtPm1heF9iaXRwb29sID0gKnBfY29kZWNfaW5mbysrOwotICBpZiAocF9pZS0+bWluX2JpdHBvb2wgPCBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTCB8fAotICAgICAgcF9pZS0+bWluX2JpdHBvb2wgPiBBMkRQX1NCQ19JRV9NQVhfQklUUE9PTCkgewotICAgIHJldHVybiBBMkRQX0JBRF9NSU5fQklUUE9PTDsKLSAgfQotCi0gIGlmIChwX2llLT5tYXhfYml0cG9vbCA8IEEyRFBfU0JDX0lFX01JTl9CSVRQT09MIHx8Ci0gICAgICBwX2llLT5tYXhfYml0cG9vbCA+IEEyRFBfU0JDX0lFX01BWF9CSVRQT09MIHx8Ci0gICAgICBwX2llLT5tYXhfYml0cG9vbCA8IHBfaWUtPm1pbl9iaXRwb29sKSB7Ci0gICAgcmV0dXJuIEEyRFBfQkFEX01BWF9CSVRQT09MOwotICB9Ci0KLSAgaWYgKGlzX2NhcGFiaWxpdHkpIHsKLSAgICAvLyBOT1RFOiBUaGUgY2hlY2tzIGhlcmUgYXJlIHZlcnkgbGliZXJhbC4gV2Ugc2hvdWxkIGJlIHVzaW5nIG1vcmUKLSAgICAvLyBwZWRhbnRpYyBjaGVja3Mgc3BlY2lmaWMgdG8gdGhlIFNSQyBvciBTTksgYXMgc3BlY2lmaWVkIGluIHRoZSBzcGVjLgotICAgIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+c2FtcF9mcmVxKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9TQU1QX0ZSRVE7Ci0gICAgaWYgKEEyRFBfQml0c1NldChwX2llLT5jaF9tb2RlKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotICAgIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+YmxvY2tfbGVuKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9CTE9DS19MRU47Ci0gICAgaWYgKEEyRFBfQml0c1NldChwX2llLT5udW1fc3ViYmFuZHMpID09IEEyRFBfU0VUX1pFUk9fQklUKQotICAgICAgcmV0dXJuIEEyRFBfQkFEX1NVQkJBTkRTOwotICAgIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+YWxsb2NfbWV0aG9kKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9BTExPQ19NRVRIT0Q7Ci0KLSAgICByZXR1cm4gQTJEUF9TVUNDRVNTOwotICB9Ci0KLSAgaWYgKEEyRFBfQml0c1NldChwX2llLT5zYW1wX2ZyZXEpICE9IEEyRFBfU0VUX09ORV9CSVQpCi0gICAgcmV0dXJuIEEyRFBfQkFEX1NBTVBfRlJFUTsKLSAgaWYgKEEyRFBfQml0c1NldChwX2llLT5jaF9tb2RlKSAhPSBBMkRQX1NFVF9PTkVfQklUKSByZXR1cm4gQTJEUF9CQURfQ0hfTU9ERTsKLSAgaWYgKEEyRFBfQml0c1NldChwX2llLT5ibG9ja19sZW4pICE9IEEyRFBfU0VUX09ORV9CSVQpCi0gICAgcmV0dXJuIEEyRFBfQkFEX0JMT0NLX0xFTjsKLSAgaWYgKEEyRFBfQml0c1NldChwX2llLT5udW1fc3ViYmFuZHMpICE9IEEyRFBfU0VUX09ORV9CSVQpCi0gICAgcmV0dXJuIEEyRFBfQkFEX1NVQkJBTkRTOwotICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmFsbG9jX21ldGhvZCkgIT0gQTJEUF9TRVRfT05FX0JJVCkKLSAgICByZXR1cm4gQTJEUF9CQURfQUxMT0NfTUVUSE9EOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLS8vIEJ1aWxkIHRoZSBTQkMgTWVkaWEgUGF5bG9hZCBIZWFkZXIuCi0vLyB8cF9kc3R8IHBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGhlYWRlciBzaG91bGQgYmUgd3JpdHRlbiB0by4KLS8vIElmIHxmcmFnfCBpcyB0cnVlLCB0aGUgbWVkaWEgcGF5bG9hZCBmcmFtZSBpcyBmcmFnbWVudGVkLgotLy8gfHN0YXJ0fCBpcyB0cnVlIGZvciB0aGUgZmlyc3QgcGFja2V0IG9mIGEgZnJhZ21lbnRlZCBmcmFtZS4KLS8vIHxsYXN0fCBpcyB0cnVlIGZvciB0aGUgbGFzdCBwYWNrZXQgb2YgYSBmcmFnbWVudGVkIGZyYW1lLgotLy8gSWYgfGZyYWd8IGlzIGZhbHNlLCB8bnVtfCBpcyB0aGUgbnVtYmVyIG9mIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHBhY2tldCwKLS8vIG90aGVyd2lzZSBpcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBmcmFnbWVudHMgKGluY2x1ZGluZyB0aGlzIG9uZSkuCi1zdGF0aWMgdm9pZCBBMkRQX0J1aWxkTWVkaWFQYXlsb2FkSGVhZGVyU2JjKHVpbnQ4X3QqIHBfZHN0LCBib29sIGZyYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnQsIGJvb2wgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW0pIHsKLSAgaWYgKHBfZHN0ID09IE5VTEwpIHJldHVybjsKLQotICAqcF9kc3QgPSAwOwotICBpZiAoZnJhZykgKnBfZHN0IHw9IEEyRFBfU0JDX0hEUl9GX01TSzsKLSAgaWYgKHN0YXJ0KSAqcF9kc3QgfD0gQTJEUF9TQkNfSERSX1NfTVNLOwotICBpZiAobGFzdCkgKnBfZHN0IHw9IEEyRFBfU0JDX0hEUl9MX01TSzsKLSAgKnBfZHN0IHw9IChBMkRQX1NCQ19IRFJfTlVNX01TSyAmIG51bSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEEyRFBfUGFyc2VNcGxIZWFkZXJTYmMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRvIHBhcnNlCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBTQkMgTWVkaWEgUGF5bG9hZCBoZWFkZXIuCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBwX3NyYzogIHRoZSBieXRlIHNlcXVlbmNlIHRvIHBhcnNlLi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgZnJhZzogIDEsIGlmIGZyYWdtZW50ZWQuIDAsIG90aGVyd2lzZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdGFydDogIDEsIGlmIHRoZSBzdGFydGluZyBwYWNrZXQgb2YgYSBmcmFnbWVudGVkIGZyYW1lLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6ICAxLCBpZiB0aGUgbGFzdCBwYWNrZXQgb2YgYSBmcmFnbWVudGVkIGZyYW1lLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIG51bTogIElmIGZyYWcgaXMgMSwgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5jbHVkaW5nIHRoaXMgZnJhZ21lbnQpIG9mIHRoaXMgZnJhbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBmcmFnIGlzIDAsIHRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGFja2V0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVOVVNFRF9BVFRSIHN0YXRpYyB2b2lkIEEyRFBfUGFyc2VNcGxIZWFkZXJTYmModWludDhfdCogcF9zcmMsIGJvb2wqIHBfZnJhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9zdGFydCwgYm9vbCogcF9sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX251bSkgewotICBpZiAocF9zcmMgJiYgcF9mcmFnICYmIHBfc3RhcnQgJiYgcF9sYXN0ICYmIHBfbnVtKSB7Ci0gICAgKnBfZnJhZyA9ICgqcF9zcmMgJiBBMkRQX1NCQ19IRFJfRl9NU0spID8gdHJ1ZSA6IGZhbHNlOwotICAgICpwX3N0YXJ0ID0gKCpwX3NyYyAmIEEyRFBfU0JDX0hEUl9TX01TSykgPyB0cnVlIDogZmFsc2U7Ci0gICAgKnBfbGFzdCA9ICgqcF9zcmMgJiBBMkRQX1NCQ19IRFJfTF9NU0spID8gdHJ1ZSA6IGZhbHNlOwotICAgICpwX251bSA9ICgqcF9zcmMgJiBBMkRQX1NCQ19IRFJfTlVNX01TSyk7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogQTJEUF9Db2RlY05hbWVTYmMoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiAiU0JDIjsKLX0KLQotYm9vbCBBMkRQX0lzU291cmNlQ29kZWNWYWxpZFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9TYmMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpID09IEEyRFBfU1VDQ0VTUykgfHwKLSAgICAgICAgIChBMkRQX1BhcnNlSW5mb1NiYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKSA9PSBBMkRQX1NVQ0NFU1MpOwotfQotCi1ib29sIEEyRFBfSXNTaW5rQ29kZWNWYWxpZFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9TYmMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpID09IEEyRFBfU1VDQ0VTUykgfHwKLSAgICAgICAgIChBMkRQX1BhcnNlSW5mb1NiYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKSA9PSBBMkRQX1NVQ0NFU1MpOwotfQotCi1ib29sIEEyRFBfSXNQZWVyU291cmNlQ29kZWNWYWxpZFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9TYmMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpID09IEEyRFBfU1VDQ0VTUykgfHwKLSAgICAgICAgIChBMkRQX1BhcnNlSW5mb1NiYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKSA9PSBBMkRQX1NVQ0NFU1MpOwotfQotCi1ib29sIEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWRTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX1NCQ19DSUUgY2ZnX2NpZTsKLQotICAvKiBVc2UgYSBsaWJlcmFsIGNoZWNrIHdoZW4gcGFyc2luZyB0aGUgY29kZWMgaW5mbyAqLwotICByZXR1cm4gKEEyRFBfUGFyc2VJbmZvU2JjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9TYmMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotYm9vbCBBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICByZXR1cm4gKEEyRFBfQ29kZWNJbmZvTWF0Y2hlc0NhcGFiaWxpdHlTYmMoJmEyZHBfc2JjX3NpbmtfY2FwcywgcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgcmV0dXJuIChBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5U2JjKCZhMmRwX3NiY19zaW5rX2NhcHMsIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLXZvaWQgQTJEUF9Jbml0RGVmYXVsdENvZGVjU2JjKHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBpZiAoQTJEUF9CdWlsZEluZm9TYmMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmYTJkcF9zYmNfZGVmYXVsdF9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2NvZGVjX2luZm8pICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IEEyRFBfQnVpbGRJbmZvU2JjIGZhaWxlZCIsIF9fZnVuY19fKTsKLSAgfQotfQotCi0vLyBDaGVja3Mgd2hldGhlciBBMkRQIFNCQyBjb2RlYyBjb25maWd1cmF0aW9uIG1hdGNoZXMgd2l0aCBhIGRldmljZSdzIGNvZGVjCi0vLyBjYXBhYmlsaXRpZXMuIHxwX2NhcHwgaXMgdGhlIFNCQyBjb2RlYyBjb25maWd1cmF0aW9uLiB8cF9jb2RlY19pbmZvfCBpcwotLy8gdGhlIGRldmljZSdzIGNvZGVjIGNhcGFiaWxpdGllcy4gfGlzX2NhcGFiaWxpdHl8IGlzIHRydWUgaWYKLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIEEyRFAgY29kZWMgY2FwYWJpbGl0eS4KLS8vIFJldHVybnMgQTJEUF9TVUNDRVNTIGlmIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIG1hdGNoZXMgd2l0aCBjYXBhYmlsaXRpZXMsCi0vLyBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgQTJEUCBlcnJvciBzdGF0dXMgY29kZS4KLXN0YXRpYyB0QTJEUF9TVEFUVVMgQTJEUF9Db2RlY0luZm9NYXRjaGVzQ2FwYWJpbGl0eVNiYygKLSAgICBjb25zdCB0QTJEUF9TQkNfQ0lFKiBwX2NhcCwgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgIGJvb2wgaXNfY2FwYWJpbGl0eSkgewotICB0QTJEUF9TVEFUVVMgc3RhdHVzOwotICB0QTJEUF9TQkNfQ0lFIGNmZ19jaWU7Ci0KLSAgLyogcGFyc2UgY29uZmlndXJhdGlvbiAqLwotICBzdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCBpc19jYXBhYmlsaXR5KTsKLSAgaWYgKHN0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBwYXJzaW5nIGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKiB2ZXJpZnkgdGhhdCBlYWNoIHBhcmFtZXRlciBpcyBpbiByYW5nZSAqLwotCi0gIExPR19WRVJCT1NFKCIlczogRlJFUSBwZWVyOiAweCV4LCBjYXBhYmlsaXR5IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgY2ZnX2NpZS5zYW1wX2ZyZXEsIHBfY2FwLT5zYW1wX2ZyZXEpOwotICBMT0dfVkVSQk9TRSgiJXM6IENIX01PREUgcGVlcjogMHgleCwgY2FwYWJpbGl0eSAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGNmZ19jaWUuY2hfbW9kZSwgcF9jYXAtPmNoX21vZGUpOwotICBMT0dfVkVSQk9TRSgiJXM6IEJMT0NLX0xFTiBwZWVyOiAweCV4LCBjYXBhYmlsaXR5IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgY2ZnX2NpZS5ibG9ja19sZW4sIHBfY2FwLT5ibG9ja19sZW4pOwotICBMT0dfVkVSQk9TRSgiJXM6IFNVQl9CQU5EIHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBjZmdfY2llLm51bV9zdWJiYW5kcywgcF9jYXAtPm51bV9zdWJiYW5kcyk7Ci0gIExPR19WRVJCT1NFKCIlczogQUxMT0NfTUVUSE9EIHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBjZmdfY2llLmFsbG9jX21ldGhvZCwgcF9jYXAtPmFsbG9jX21ldGhvZCk7Ci0gIExPR19WRVJCT1NFKCIlczogTUlOX0JpdFBvb2wgcGVlcjogMHgleCwgY2FwYWJpbGl0eSAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGNmZ19jaWUubWluX2JpdHBvb2wsIHBfY2FwLT5taW5fYml0cG9vbCk7Ci0gIExPR19WRVJCT1NFKCIlczogTUFYX0JpdFBvb2wgcGVlcjogMHgleCwgY2FwYWJpbGl0eSAweCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGNmZ19jaWUubWF4X2JpdHBvb2wsIHBfY2FwLT5tYXhfYml0cG9vbCk7Ci0KLSAgLyogc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gIGlmICgoY2ZnX2NpZS5zYW1wX2ZyZXEgJiBwX2NhcC0+c2FtcF9mcmVxKSA9PSAwKSByZXR1cm4gQTJEUF9OU19TQU1QX0ZSRVE7Ci0KLSAgLyogY2hhbm5lbCBtb2RlICovCi0gIGlmICgoY2ZnX2NpZS5jaF9tb2RlICYgcF9jYXAtPmNoX21vZGUpID09IDApIHJldHVybiBBMkRQX05TX0NIX01PREU7Ci0KLSAgLyogYmxvY2sgbGVuZ3RoICovCi0gIGlmICgoY2ZnX2NpZS5ibG9ja19sZW4gJiBwX2NhcC0+YmxvY2tfbGVuKSA9PSAwKSByZXR1cm4gQTJEUF9CQURfQkxPQ0tfTEVOOwotCi0gIC8qIHN1YmJhbmRzICovCi0gIGlmICgoY2ZnX2NpZS5udW1fc3ViYmFuZHMgJiBwX2NhcC0+bnVtX3N1YmJhbmRzKSA9PSAwKQotICAgIHJldHVybiBBMkRQX05TX1NVQkJBTkRTOwotCi0gIC8qIGFsbG9jYXRpb24gbWV0aG9kICovCi0gIGlmICgoY2ZnX2NpZS5hbGxvY19tZXRob2QgJiBwX2NhcC0+YWxsb2NfbWV0aG9kKSA9PSAwKQotICAgIHJldHVybiBBMkRQX05TX0FMTE9DX01FVEhPRDsKLQotICAvKiBtaW4gYml0cG9vbCAqLwotICBpZiAoY2ZnX2NpZS5taW5fYml0cG9vbCA+IHBfY2FwLT5tYXhfYml0cG9vbCkgcmV0dXJuIEEyRFBfTlNfTUlOX0JJVFBPT0w7Ci0KLSAgLyogbWF4IGJpdHBvb2wgKi8KLSAgaWYgKGNmZ19jaWUubWF4X2JpdHBvb2wgPCBwX2NhcC0+bWluX2JpdHBvb2wpIHJldHVybiBBMkRQX05TX01BWF9CSVRQT09MOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgQTJEUF9Db2RlY1R5cGVFcXVhbHNTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKSB7Ci0gIHRBMkRQX1NCQ19DSUUgc2JjX2NpZV9hOwotICB0QTJEUF9TQkNfQ0lFIHNiY19jaWVfYjsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvU2JjKCZzYmNfY2llX2EsIHBfY29kZWNfaW5mb19hLCB0cnVlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZV9iLCBwX2NvZGVjX2luZm9fYiwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlX2EgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm9fYSk7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZV9iID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvX2IpOwotCi0gIHJldHVybiAoY29kZWNfdHlwZV9hID09IGNvZGVjX3R5cGVfYikgJiYgKGNvZGVjX3R5cGVfYSA9PSBBMkRQX01FRElBX0NUX1NCQyk7Ci19Ci0KLWJvb2wgQTJEUF9Db2RlY0VxdWFsc1NiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICB0QTJEUF9TQkNfQ0lFIHNiY19jaWVfYTsKLSAgdEEyRFBfU0JDX0NJRSBzYmNfY2llX2I7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9Ci0gICAgICBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZV9hLCBwX2NvZGVjX2luZm9fYSwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9TYmMoJnNiY19jaWVfYiwgcF9jb2RlY19pbmZvX2IsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZV9hID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvX2EpOwotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGVfYiA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mb19iKTsKLQotICBpZiAoKGNvZGVjX3R5cGVfYSAhPSBjb2RlY190eXBlX2IpIHx8IChjb2RlY190eXBlX2EgIT0gQTJEUF9NRURJQV9DVF9TQkMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gKHNiY19jaWVfYS5zYW1wX2ZyZXEgPT0gc2JjX2NpZV9iLnNhbXBfZnJlcSkgJiYKLSAgICAgICAgIChzYmNfY2llX2EuY2hfbW9kZSA9PSBzYmNfY2llX2IuY2hfbW9kZSkgJiYKLSAgICAgICAgIChzYmNfY2llX2EuYmxvY2tfbGVuID09IHNiY19jaWVfYi5ibG9ja19sZW4pICYmCi0gICAgICAgICAoc2JjX2NpZV9hLm51bV9zdWJiYW5kcyA9PSBzYmNfY2llX2IubnVtX3N1YmJhbmRzKSAmJgotICAgICAgICAgKHNiY19jaWVfYS5hbGxvY19tZXRob2QgPT0gc2JjX2NpZV9iLmFsbG9jX21ldGhvZCkgJiYKLSAgICAgICAgIChzYmNfY2llX2EubWluX2JpdHBvb2wgPT0gc2JjX2NpZV9iLm1pbl9iaXRwb29sKSAmJgotICAgICAgICAgKHNiY19jaWVfYS5tYXhfYml0cG9vbCA9PSBzYmNfY2llX2IubWF4X2JpdHBvb2wpOwotfQotCi1pbnQgQTJEUF9HZXRUcmFja1NhbXBsZVJhdGVTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX1NCQ19DSUUgc2JjX2NpZTsKLQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChzYmNfY2llLnNhbXBfZnJlcSkgewotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzE2OgotICAgICAgcmV0dXJuIDE2MDAwOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzMyOgotICAgICAgcmV0dXJuIDMyMDAwOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0OgotICAgICAgcmV0dXJuIDQ0MTAwOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4OgotICAgICAgcmV0dXJuIDQ4MDAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfR2V0VHJhY2tCaXRzUGVyU2FtcGxlU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9TQkNfQ0lFIHNiY19jaWU7Ci0KLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9TYmMoJnNiY19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8vIE5PVEU6IFRoZSBiaXRzIHBlciBzYW1wbGUgbmV2ZXIgY2hhbmdlcyBmb3IgU0JDCi0gIHJldHVybiAxNjsKLX0KLQotaW50IEEyRFBfR2V0VHJhY2tDaGFubmVsQ291bnRTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX1NCQ19DSUUgc2JjX2NpZTsKLQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChzYmNfY2llLmNoX21vZGUpIHsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0NIX01EX01PTk86Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0NIX01EX0RVQUw6Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU86Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVDoKLSAgICAgIHJldHVybiAyOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfR2V0TnVtYmVyT2ZTdWJiYW5kc1NiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBzYmNfY2llOwotCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvU2JjKCZzYmNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKHNiY19jaWUubnVtX3N1YmJhbmRzKSB7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9TVUJCQU5EXzQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX1NVQkJBTkRfODoKLSAgICAgIHJldHVybiA4OwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfR2V0TnVtYmVyT2ZCbG9ja3NTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX1NCQ19DSUUgc2JjX2NpZTsKLQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChzYmNfY2llLmJsb2NrX2xlbikgewotICAgIGNhc2UgQTJEUF9TQkNfSUVfQkxPQ0tTXzQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0JMT0NLU184OgotICAgICAgcmV0dXJuIDg7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9CTE9DS1NfMTI6Ci0gICAgICByZXR1cm4gMTI7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9CTE9DS1NfMTY6Ci0gICAgICByZXR1cm4gMTY7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQgQTJEUF9HZXRBbGxvY2F0aW9uTWV0aG9kQ29kZVNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBzYmNfY2llOwotCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvU2JjKCZzYmNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKHNiY19jaWUuYWxsb2NfbWV0aG9kKSB7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9BTExPQ19NRF9TOgotICAgICAgcmV0dXJuIFNCQ19TTlI7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9BTExPQ19NRF9MOgotICAgICAgcmV0dXJuIFNCQ19MT1VETkVTUzsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX0dldENoYW5uZWxNb2RlQ29kZVNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBzYmNfY2llOwotCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvU2JjKCZzYmNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKHNiY19jaWUuY2hfbW9kZSkgewotICAgIGNhc2UgQTJEUF9TQkNfSUVfQ0hfTURfTU9OTzoKLSAgICAgIHJldHVybiBTQkNfTU9OTzsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0NIX01EX0RVQUw6Ci0gICAgICByZXR1cm4gU0JDX0RVQUw7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU86Ci0gICAgICByZXR1cm4gU0JDX1NURVJFTzsKLSAgICBjYXNlIEEyRFBfU0JDX0lFX0NIX01EX0pPSU5UOgotICAgICAgcmV0dXJuIFNCQ19KT0lOVF9TVEVSRU87Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQgQTJEUF9HZXRTYW1wbGluZ0ZyZXF1ZW5jeUNvZGVTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX1NCQ19DSUUgc2JjX2NpZTsKLQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChzYmNfY2llLnNhbXBfZnJlcSkgewotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzE2OgotICAgICAgcmV0dXJuIFNCQ19zZjE2MDAwOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzMyOgotICAgICAgcmV0dXJuIFNCQ19zZjMyMDAwOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0OgotICAgICAgcmV0dXJuIFNCQ19zZjQ0MTAwOwotICAgIGNhc2UgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4OgotICAgICAgcmV0dXJuIFNCQ19zZjQ4MDAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfR2V0TWluQml0cG9vbFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfU0JDX0NJRSBzYmNfY2llOwotCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvU2JjKCZzYmNfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBzYmNfY2llLm1pbl9iaXRwb29sOwotfQotCi1pbnQgQTJEUF9HZXRNYXhCaXRwb29sU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9TQkNfQ0lFIHNiY19jaWU7Ci0KLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9TYmMoJnNiY19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIHNiY19jaWUubWF4X2JpdHBvb2w7Ci19Ci0KLXVpbnQzMl90IEEyRFBfR2V0Qml0cmF0ZVNiYygpIHsgcmV0dXJuIGEyZHBfc2JjX2dldF9iaXRyYXRlKCk7IH0KLWludCBBMkRQX0dldFNpbmtUcmFja0NoYW5uZWxUeXBlU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9TQkNfQ0lFIHNiY19jaWU7Ci0KLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9TYmMoJnNiY19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN3aXRjaCAoc2JjX2NpZS5jaF9tb2RlKSB7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9DSF9NRF9NT05POgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMOgotICAgIGNhc2UgQTJEUF9TQkNfSUVfQ0hfTURfU1RFUkVPOgotICAgIGNhc2UgQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQ6Ci0gICAgICByZXR1cm4gMzsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWJvb2wgQTJEUF9HZXRQYWNrZXRUaW1lc3RhbXBTYmMoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2RhdGEsIHVpbnQzMl90KiBwX3RpbWVzdGFtcCkgewotICAqcF90aW1lc3RhbXAgPSAqKGNvbnN0IHVpbnQzMl90KilwX2RhdGE7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfQnVpbGRDb2RlY0hlYWRlclNiYyhVTlVTRURfQVRUUiBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCB1aW50MTZfdCBmcmFtZXNfcGVyX3BhY2tldCkgewotICAvLyB0aGlzIGRvZXNuJ3QgaGFwcGVuIGluIHJlYWwgbGlmZSwgYnV0IGtlZXBzIGZ1enplciBoYXBweQotICBpZiAocF9idWYtPmxlbiAtIHBfYnVmLT5vZmZzZXQgPCBBMkRQX1NCQ19NUExfSERSX0xFTikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHBfYnVmLT5vZmZzZXQgLT0gQTJEUF9TQkNfTVBMX0hEUl9MRU47Ci0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBwX2J1Zi0+bGVuICs9IEEyRFBfU0JDX01QTF9IRFJfTEVOOwotICBBMkRQX0J1aWxkTWVkaWFQYXlsb2FkSGVhZGVyU2JjKHAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpZnJhbWVzX3Blcl9wYWNrZXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGQ6OnN0cmluZyBBMkRQX0NvZGVjSW5mb1N0cmluZ1NiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzOwotICBzdGQ6OnN0cmluZyBmaWVsZDsKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzOwotICB0QTJEUF9TQkNfQ0lFIHNiY19jaWU7Ci0KLSAgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb1NiYygmc2JjX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIHJlcyA8PCAiQTJEUF9QYXJzZUluZm9TYmMgZmFpbDogIiA8PCBsb2doZXgoYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiByZXMuc3RyKCk7Ci0gIH0KLQotICByZXMgPDwgIlx0bmFtZTogU0JDXG4iOwotCi0gIC8vIFNhbXBsZSBmcmVxdWVuY3kKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5zYW1wX2ZyZXEgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzE2KSwgIjE2MDAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzMyKSwgIjMyMDAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0KSwgIjQ0MTAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4KSwgIjQ4MDAwIik7Ci0gIHJlcyA8PCAiXHRzYW1wX2ZyZXE6ICIgPDwgZmllbGQgPDwgIiAoIiA8PCBsb2doZXgoc2JjX2NpZS5zYW1wX2ZyZXEpIDw8ICIpXG4iOwotCi0gIC8vIENoYW5uZWwgbW9kZQotICBmaWVsZC5jbGVhcigpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChzYmNfY2llLmNoX21vZGUgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX01PTk8pLCAiTW9ubyIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChzYmNfY2llLmNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMKSwgIkR1YWwiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5jaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfU1RFUkVPKSwgIlN0ZXJlbyIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChzYmNfY2llLmNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVCksICJKb2ludCIpOwotICByZXMgPDwgIlx0Y2hfbW9kZTogIiA8PCBmaWVsZCA8PCAiICgiIDw8IGxvZ2hleChzYmNfY2llLmNoX21vZGUpIDw8ICIpXG4iOwotCi0gIC8vIEJsb2NrIGxlbmd0aAotICBmaWVsZC5jbGVhcigpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChzYmNfY2llLmJsb2NrX2xlbiA9PSAwKSwgIk5PTkUiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5ibG9ja19sZW4gJiBBMkRQX1NCQ19JRV9CTE9DS1NfNCksICI0Iik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuYmxvY2tfbGVuICYgQTJEUF9TQkNfSUVfQkxPQ0tTXzgpLCAiOCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChzYmNfY2llLmJsb2NrX2xlbiAmIEEyRFBfU0JDX0lFX0JMT0NLU18xMiksICIxMiIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChzYmNfY2llLmJsb2NrX2xlbiAmIEEyRFBfU0JDX0lFX0JMT0NLU18xNiksICIxNiIpOwotICByZXMgPDwgIlx0YmxvY2tfbGVuOiAiIDw8IGZpZWxkIDw8ICIgKCIgPDwgbG9naGV4KHNiY19jaWUuYmxvY2tfbGVuKSA8PCAiKVxuIjsKLQotICAvLyBOdW1iZXIgb2Ygc3ViYmFuZHMKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5udW1fc3ViYmFuZHMgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUubnVtX3N1YmJhbmRzICYgQTJEUF9TQkNfSUVfU1VCQkFORF80KSwgIjQiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5udW1fc3ViYmFuZHMgJiBBMkRQX1NCQ19JRV9TVUJCQU5EXzgpLCAiOCIpOwotICByZXMgPDwgIlx0bnVtX3N1YmJhbmRzOiAiIDw8IGZpZWxkIDw8ICIgKCIgPDwgbG9naGV4KHNiY19jaWUubnVtX3N1YmJhbmRzKQotICAgICAgPDwgIilcbiI7Ci0KLSAgLy8gQWxsb2NhdGlvbiBtZXRob2QKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5hbGxvY19tZXRob2QgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKHNiY19jaWUuYWxsb2NfbWV0aG9kICYgQTJEUF9TQkNfSUVfQUxMT0NfTURfUyksICJTTlIiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoc2JjX2NpZS5hbGxvY19tZXRob2QgJiBBMkRQX1NCQ19JRV9BTExPQ19NRF9MKSwKLSAgICAgICAgICAgICAgIkxvdW5kZXNzIik7Ci0gIHJlcyA8PCAiXHRhbGxvY19tZXRob2Q6ICIgPDwgZmllbGQgPDwgIiAoIiA8PCBsb2doZXgoc2JjX2NpZS5hbGxvY19tZXRob2QpCi0gICAgICA8PCAiKVxuIjsKLQotICAvLyBNaW4vbWF4IGJpdGxvb3AKLSAgcmVzIDw8ICJcdEJpdCBwb29sIE1pbjogIiA8PCBzdGQ6OnRvX3N0cmluZyhzYmNfY2llLm1pbl9iaXRwb29sKQotICAgICAgPDwgIiBNYXg6ICIgPDwgc3RkOjp0b19zdHJpbmcoc2JjX2NpZS5tYXhfYml0cG9vbCk7Ci0KLSAgcmV0dXJuIHJlcy5zdHIoKTsKLX0KLQotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfR2V0RW5jb2RlckludGVyZmFjZVNiYygKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgaWYgKCFBMkRQX0lzU291cmNlQ29kZWNWYWxpZFNiYyhwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZW5jb2Rlcl9pbnRlcmZhY2Vfc2JjOwotfQotCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXREZWNvZGVySW50ZXJmYWNlU2JjKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBpZiAoIUEyRFBfSXNTaW5rQ29kZWNWYWxpZFNiYyhwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZGVjb2Rlcl9pbnRlcmZhY2Vfc2JjOwotfQotCi1ib29sIEEyRFBfQWRqdXN0Q29kZWNTYmModWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX1NCQ19DSUUgY2ZnX2NpZTsKLQotICBpZiAoQTJEUF9QYXJzZUluZm9TYmMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgIT0gQTJEUF9TVUNDRVNTKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBVcGRhdGVkIHRoZSBtYXggYml0cG9vbAotICBpZiAoY2ZnX2NpZS5tYXhfYml0cG9vbCA+IEEyRFBfU0JDX01BWF9CSVRQT09MKSB7Ci0gICAgTE9HX1dBUk4oIiVzOiBVcGRhdGVkIHRoZSBTQkMgY29kZWMgbWF4IGJpdHBvb2wgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgIGNmZ19jaWUubWF4X2JpdHBvb2wsIEEyRFBfU0JDX01BWF9CSVRQT09MKTsKLSAgICBjZmdfY2llLm1heF9iaXRwb29sID0gQTJEUF9TQkNfTUFYX0JJVFBPT0w7Ci0gIH0KLQotICByZXR1cm4gKEEyRFBfQnVpbGRJbmZvU2JjKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJmNmZ19jaWUsIHBfY29kZWNfaW5mbykgPT0KLSAgICAgICAgICBBMkRQX1NVQ0NFU1MpOwotfQotCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1NvdXJjZUNvZGVjSW5kZXhTYmMoCi0gICAgVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQzsKLX0KLQotYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgQTJEUF9TaW5rQ29kZWNJbmRleFNiYygKLSAgICBVTlVTRURfQVRUUiBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgcmV0dXJuIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX1NCQzsKLX0KLQotY29uc3QgY2hhciogQTJEUF9Db2RlY0luZGV4U3RyU2JjKHZvaWQpIHsgcmV0dXJuICJTQkMiOyB9Ci0KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNJbmRleFN0clNiY1Npbmsodm9pZCkgeyByZXR1cm4gIlNCQyBTSU5LIjsgfQotCi1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnU2JjKEF2ZHRwU2VwQ29uZmlnKiBwX2NmZykgewotICBpZiAoQTJEUF9CdWlsZEluZm9TYmMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmYTJkcF9zYmNfc291cmNlX2NhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2NmZy0+Y29kZWNfaW5mbykgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSNpZiAoQlRBX0FWX0NPX0NQX1NDTVNfVCA9PSBUUlVFKQotICAvKiBDb250ZW50IHByb3RlY3Rpb24gaW5mbyAtIHN1cHBvcnQgU0NNUy1UICovCi0gIHVpbnQ4X3QqIHAgPSBwX2NmZy0+cHJvdGVjdF9pbmZvOwotICAqcCsrID0gQVZEVF9DUF9MT1NDOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIEFWRFRfQ1BfU0NNU19UX0lEKTsKLSAgcF9jZmctPm51bV9wcm90ZWN0ID0gMTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnU2JjU2luayhBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgaWYgKEEyRFBfQnVpbGRJbmZvU2JjKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJmEyZHBfc2JjX3NpbmtfY2FwcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ZnLT5jb2RlY19pbmZvKSAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotVU5VU0VEX0FUVFIgc3RhdGljIHZvaWQgYnVpbGRfY29kZWNfY29uZmlnKGNvbnN0IHRBMkRQX1NCQ19DSUUmIGNvbmZpZ19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiByZXN1bHQpIHsKLSAgaWYgKGNvbmZpZ19jaWUuc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0KQotICAgIHJlc3VsdC0+c2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICBpZiAoY29uZmlnX2NpZS5zYW1wX2ZyZXEgJiBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDgpCi0gICAgcmVzdWx0LT5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0KLSAgcmVzdWx0LT5iaXRzX3Blcl9zYW1wbGUgPSBjb25maWdfY2llLmJpdHNfcGVyX3NhbXBsZTsKLQotICBpZiAoY29uZmlnX2NpZS5jaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfTU9OTykKLSAgICByZXN1bHQtPmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0KLSAgaWYgKGNvbmZpZ19jaWUuY2hfbW9kZSAmIChBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8gfCBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTJEUF9TQkNfSUVfQ0hfTURfRFVBTCkpIHsKLSAgICByZXN1bHQtPmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotfQotCi1BMmRwQ29kZWNDb25maWdTYmNTb3VyY2U6OkEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZSgKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkKLSAgICA6IEEyZHBDb2RlY0NvbmZpZ1NiY0Jhc2UoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmRleFN0clNiYygpLCBjb2RlY19wcmlvcml0eSwgdHJ1ZSkgewotICAvLyBDb21wdXRlIHRoZSBsb2NhbCBjYXBhYmlsaXR5Ci0gIGlmIChhMmRwX3NiY19zb3VyY2VfY2Fwcy5zYW1wX2ZyZXEgJiBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDQpIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gIH0KLSAgaWYgKGEyZHBfc2JjX3NvdXJjZV9jYXBzLnNhbXBfZnJlcSAmIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80OCkgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgfQotICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgYTJkcF9zYmNfc291cmNlX2NhcHMuYml0c19wZXJfc2FtcGxlOwotICBpZiAoYTJkcF9zYmNfc291cmNlX2NhcHMuY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX01PTk8pIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICB9Ci0gIGlmIChhMmRwX3NiY19zb3VyY2VfY2Fwcy5jaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQpIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gIH0KLSAgaWYgKGEyZHBfc2JjX3NvdXJjZV9jYXBzLmNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8pIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gIH0KLSAgaWYgKGEyZHBfc2JjX3NvdXJjZV9jYXBzLmNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICB9Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZTo6fkEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZSgpIHt9Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnU2JjU291cmNlOjppbml0KCkgewotICBpZiAoIWlzVmFsaWQoKSkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIExvYWQgdGhlIGVuY29kZXIKLSAgaWYgKCFBMkRQX0xvYWRFbmNvZGVyU2JjKCkpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgbG9hZCB0aGUgZW5jb2RlciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdTYmNTb3VyY2U6OnVzZVJ0cEhlYWRlck1hcmtlckJpdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBiZXN0IHNhbXBsZSByYXRlIGZyb20gfHNhbXBfZnJlcXwuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2Jlc3Rfc2FtcGxlX3JhdGUodWludDhfdCBzYW1wX2ZyZXEsIHRBMkRQX1NCQ19DSUUqIHBfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4KSB7Ci0gICAgcF9yZXN1bHQtPnNhbXBfZnJlcSA9IEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80ODsKLSAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHNhbXBfZnJlcSAmIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCkgewotICAgIHBfcmVzdWx0LT5zYW1wX2ZyZXEgPSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDQ7Ci0gICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGF1ZGlvIHNhbXBsZSByYXRlIGZyb20gfHBfY29kZWNfYXVkaW9fY29uZmlnfC4KLS8vIHxzYW1wX2ZyZXF8IGNvbnRhaW5zIHRoZSBjYXBhYmlsaXR5LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9hdWRpb19zYW1wbGVfcmF0ZSgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfYXVkaW9fY29uZmlnLCB1aW50OF90IHNhbXBfZnJlcSwKLSAgICB0QTJEUF9TQkNfQ0lFKiBwX3Jlc3VsdCwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKHBfY29kZWNfYXVkaW9fY29uZmlnLT5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgaWYgKHNhbXBfZnJlcSAmIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcF9mcmVxID0gQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0OwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4KSB7Ci0gICAgICAgIHBfcmVzdWx0LT5zYW1wX2ZyZXEgPSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDg7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGJlc3QgYml0cyBwZXIgc2FtcGxlLgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X2JpdHNfcGVyX3NhbXBsZSgKLSAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIHBfY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGF1ZGlvIGJpdHMgcGVyIHNhbXBsZSBmcm9tIHxwX2NvZGVjX2F1ZGlvX2NvbmZpZ3wuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2F1ZGlvX2JpdHNfcGVyX3NhbXBsZSgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfYXVkaW9fY29uZmlnLAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChwX2NvZGVjX2F1ZGlvX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OgotICAgICAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYmVzdCBjaGFubmVsIG1vZGUgZnJvbSB8Y2hfbW9kZXwuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2Jlc3RfY2hhbm5lbF9tb2RlKHVpbnQ4X3QgY2hfbW9kZSwgdEEyRFBfU0JDX0NJRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX0pPSU5UKSB7Ci0gICAgcF9yZXN1bHQtPmNoX21vZGUgPSBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVDsKLSAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8pIHsKLSAgICBwX3Jlc3VsdC0+Y2hfbW9kZSA9IEEyRFBfU0JDX0lFX0NIX01EX1NURVJFTzsKLSAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMKSB7Ci0gICAgcF9yZXN1bHQtPmNoX21vZGUgPSBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMOwotICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX01PTk8pIHsKLSAgICBwX3Jlc3VsdC0+Y2hfbW9kZSA9IEEyRFBfU0JDX0lFX0NIX01EX01PTk87Ci0gICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBhdWRpbyBjaGFubmVsIG1vZGUgZnJvbSB8cF9jb2RlY19hdWRpb19jb25maWd8LgotLy8gfGNoX21vZGV8IGNvbnRhaW5zIHRoZSBjYXBhYmlsaXR5LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9hdWRpb19jaGFubmVsX21vZGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2F1ZGlvX2NvbmZpZywgdWludDhfdCBjaF9tb2RlLAotICAgIHRBMkRQX1NCQ19DSUUqIHBfcmVzdWx0LCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIHN3aXRjaCAocF9jb2RlY19hdWRpb19jb25maWctPmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9NT05PKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5jaF9tb2RlID0gQTJEUF9TQkNfSUVfQ0hfTURfTU9OTzsKLSAgICAgICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVCkgewotICAgICAgICBwX3Jlc3VsdC0+Y2hfbW9kZSA9IEEyRFBfU0JDX0lFX0NIX01EX0pPSU5UOwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8pIHsKLSAgICAgICAgcF9yZXN1bHQtPmNoX21vZGUgPSBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU87Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX0RVQUwpIHsKLSAgICAgICAgcF9yZXN1bHQtPmNoX21vZGUgPSBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMOwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdTYmNCYXNlOjpzZXRDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0gIHRBMkRQX1NCQ19DSUUgcGVlcl9pbmZvX2NpZTsKLSAgdEEyRFBfU0JDX0NJRSByZXN1bHRfY29uZmlnX2NpZTsKLSAgdWludDhfdCBzYW1wX2ZyZXE7Ci0gIHVpbnQ4X3QgY2hfbW9kZTsKLSAgdWludDhfdCBibG9ja19sZW47Ci0gIHVpbnQ4X3QgbnVtX3N1YmJhbmRzOwotICB1aW50OF90IGFsbG9jX21ldGhvZDsKLSAgY29uc3QgdEEyRFBfU0JDX0NJRSogcF9hMmRwX3NiY19jYXBzID0KLSAgICAgIChpc19zb3VyY2VfKSA/ICZhMmRwX3NiY19zb3VyY2VfY2FwcyA6ICZhMmRwX3NiY19zaW5rX2NhcHM7Ci0KLSAgLy8gU2F2ZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX2NvbmZpZyA9IGNvZGVjX2NvbmZpZ187Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19jYXBhYmlsaXR5ID0gY29kZWNfY2FwYWJpbGl0eV87Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHkgPQotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX3VzZXJfY29uZmlnID0gY29kZWNfdXNlcl9jb25maWdfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfYXVkaW9fY29uZmlnID0gY29kZWNfYXVkaW9fY29uZmlnXzsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIHVpbnQ4X3Qgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eVtBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZ1tBVkRUX0NPREVDX1NJWkVdOwotICBtZW1jcHkoc2F2ZWRfb3RhX2NvZGVjX2NvbmZpZywgb3RhX2NvZGVjX2NvbmZpZ18sIHNpemVvZihvdGFfY29kZWNfY29uZmlnXykpOwotICBtZW1jcHkoc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eSwgb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZywgb3RhX2NvZGVjX3BlZXJfY29uZmlnXywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jb25maWdfKSk7Ci0KLSAgdEEyRFBfU1RBVFVTIHN0YXR1cyA9Ci0gICAgICBBMkRQX1BhcnNlSW5mb1NiYygmcGVlcl9pbmZvX2NpZSwgcF9wZWVyX2NvZGVjX2luZm8sIGlzX2NhcGFiaWxpdHkpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbid0IHBhcnNlIHBlZXIncyBjYXBhYmlsaXRpZXM6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLSAgLy8gVHJ5IHVzaW5nIHRoZSBwcmVmZXJlZCBwZWVyIGNvZGVjIGNvbmZpZyAoaWYgdmFsaWQpLCBpbnN0ZWFkIG9mIHRoZSBwZWVyCi0gIC8vIGNhcGFiaWxpdHkuCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgaWYgKGlzX3NvdXJjZV8pIHsKLSAgICAgIGlmIChBMkRQX0lzUGVlclNpbmtDb2RlY1ZhbGlkU2JjKG90YV9jb2RlY19wZWVyX2NvbmZpZ18pKSB7Ci0gICAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgICBBMkRQX1BhcnNlSW5mb1NiYygmcGVlcl9pbmZvX2NpZSwgb3RhX2NvZGVjX3BlZXJfY29uZmlnXywgZmFsc2UpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkU2JjKG90YV9jb2RlY19wZWVyX2NvbmZpZ18pKSB7Ci0gICAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgICBBMkRQX1BhcnNlSW5mb1NiYygmcGVlcl9pbmZvX2NpZSwgb3RhX2NvZGVjX3BlZXJfY29uZmlnXywgZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgICAgLy8gVXNlIHRoZSBwZWVyIGNvZGVjIGNhcGFiaWxpdHkKLSAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgQTJEUF9QYXJzZUluZm9TYmMoJnBlZXJfaW5mb19jaWUsIHBfcGVlcl9jb2RlY19pbmZvLCBpc19jYXBhYmlsaXR5KTsKLSAgICAgIENIRUNLKHN0YXR1cyA9PSBBMkRQX1NVQ0NFU1MpOwotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIEJ1aWxkIHRoZSBwcmVmZXJyZWQgY29uZmlndXJhdGlvbgotICAvLwotICBtZW1zZXQoJnJlc3VsdF9jb25maWdfY2llLCAwLCBzaXplb2YocmVzdWx0X2NvbmZpZ19jaWUpKTsKLQotICAvLwotICAvLyBTZWxlY3QgdGhlIHNhbXBsZSBmcmVxdWVuY3kKLSAgLy8KLSAgc2FtcF9mcmVxID0gcF9hMmRwX3NiY19jYXBzLT5zYW1wX2ZyZXEgJiBwZWVyX2luZm9fY2llLnNhbXBfZnJlcTsKLSAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICBzd2l0Y2ggKGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgaWYgKHNhbXBfZnJlcSAmIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCkgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5zYW1wX2ZyZXEgPSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDQ7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4KSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBfZnJlcSA9IEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80ODsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU6Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBTZWxlY3QgdGhlIHNhbXBsZSBmcmVxdWVuY3kgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCi0gIGRvIHsKLSAgICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkKLSAgICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0KSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgIH0KLSAgICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4KSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIH0KLQotICAgIGlmIChjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlICE9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FKSBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgaWYgKHNhbXBfZnJlcSAmIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4KQotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX3NhbXBsZV9yYXRlKCZjb2RlY19hdWRpb19jb25maWdfLCBzYW1wX2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBkZWZhdWx0IGNvbmZpZwotICAgIGlmIChzZWxlY3RfYmVzdF9zYW1wbGVfcmF0ZSgKLSAgICAgICAgICAgIGEyZHBfc2JjX2RlZmF1bHRfY29uZmlnLnNhbXBfZnJlcSAmIHBlZXJfaW5mb19jaWUuc2FtcF9mcmVxLAotICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHVzZSB0aGUgYmVzdCBtYXRjaAotICAgIGlmIChzZWxlY3RfYmVzdF9zYW1wbGVfcmF0ZShzYW1wX2ZyZXEsICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gd2hpbGUgKGZhbHNlKTsKLSAgaWYgKGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPT0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIHNhbXBsZSBmcmVxdWVuY3k6IGxvY2FsIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9hMmRwX3NiY19jYXBzLT5zYW1wX2ZyZXEsIHBlZXJfaW5mb19jaWUuc2FtcF9mcmVxKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIGJpdHMgcGVyIHNhbXBsZQotICAvLwotICAvLyBOT1RFOiB0aGlzIGluZm9ybWF0aW9uIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgU0JDIEEyRFAgY29kZWMgZGVzY3JpcHRpb24KLSAgLy8gdGhhdCBpcyBzZW50IE9UQS4KLSAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gIHN3aXRjaCAoY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICBjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICAgICAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIFNlbGVjdCB0aGUgYml0cyBwZXIgc2FtcGxlIGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQotICBkbyB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgICBwX2EyZHBfc2JjX2NhcHMtPmJpdHNfcGVyX3NhbXBsZTsKLQotICAgIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSAhPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpCi0gICAgICBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjsKLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgY29kZWMgYXVkaW8gY29uZmlnCi0gICAgaWYgKHNlbGVjdF9hdWRpb19iaXRzX3Blcl9zYW1wbGUoJmNvZGVjX2F1ZGlvX2NvbmZpZ18sICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBkZWZhdWx0IGNvbmZpZwotICAgIGlmIChzZWxlY3RfYmVzdF9iaXRzX3Blcl9zYW1wbGUoJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB1c2UgdGhlIGJlc3QgbWF0Y2gKLSAgICAvLyBUT0RPOiBuby1vcCAtIHRlbXBvcmFyeSBrZXB0IGhlcmUgZm9yIGNvbnNpc3RlbmN5Ci0gICAgaWYgKHNlbGVjdF9iZXN0X2JpdHNfcGVyX3NhbXBsZSgmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPT0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IG1hdGNoIGJpdHMgcGVyIHNhbXBsZTogdXNlciBwcmVmZXJlbmNlID0gMHgleCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIGNoYW5uZWwgbW9kZQotICAvLwotICBjaF9tb2RlID0gcF9hMmRwX3NiY19jYXBzLT5jaF9tb2RlICYgcGVlcl9pbmZvX2NpZS5jaF9tb2RlOwotICBjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLSAgc3dpdGNoIChjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX01PTk8pIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuY2hfbW9kZSA9IEEyRFBfU0JDX0lFX0NIX01EX01PTk87Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX0pPSU5UKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmNoX21vZGUgPSBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVDsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChjaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfU1RFUkVPKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmNoX21vZGUgPSBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU87Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX0RVQUwpIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuY2hfbW9kZSA9IEEyRFBfU0JDX0lFX0NIX01EX0RVQUw7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORToKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLSAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBTZWxlY3QgdGhlIGNoYW5uZWwgbW9kZSBpZiB0aGVyZSBpcyBubyB1c2VyIHByZWZlcmVuY2UKLSAgZG8gewotICAgIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eQotICAgIGlmIChjaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfTU9OTykgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgfQotICAgIGlmIChjaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQpIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotICAgIGlmIChjaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfU1RFUkVPKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgIH0KLSAgICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX0RVQUwpIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotCi0gICAgaWYgKGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlICE9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkgYnJlYWs7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBjb21tb24gY2FwYWJpbGl0eQotICAgIGlmIChjaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfTU9OTykKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgaWYgKGNoX21vZGUgJiAoQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQgfCBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8gfAotICAgICAgICAgICAgICAgICAgIEEyRFBfU0JDX0lFX0NIX01EX0RVQUwpKSB7Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdXNlIHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX2NoYW5uZWxfbW9kZSgmY29kZWNfYXVkaW9fY29uZmlnXywgY2hfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBkZWZhdWx0IGNvbmZpZwotICAgIGlmIChzZWxlY3RfYmVzdF9jaGFubmVsX21vZGUoCi0gICAgICAgICAgICBhMmRwX3NiY19kZWZhdWx0X2NvbmZpZy5jaF9tb2RlICYgcGVlcl9pbmZvX2NpZS5jaF9tb2RlLAotICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHVzZSB0aGUgYmVzdCBtYXRjaAotICAgIGlmIChzZWxlY3RfYmVzdF9jaGFubmVsX21vZGUoY2hfbW9kZSwgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPT0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IGNhbm5vdCBtYXRjaCBjaGFubmVsIG1vZGU6IGxvY2FsIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9hMmRwX3NiY19jYXBzLT5jaF9tb2RlLCBwZWVyX2luZm9fY2llLmNoX21vZGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgYmxvY2sgbGVuZ3RoCi0gIC8vCi0gIGJsb2NrX2xlbiA9IHBfYTJkcF9zYmNfY2Fwcy0+YmxvY2tfbGVuICYgcGVlcl9pbmZvX2NpZS5ibG9ja19sZW47Ci0gIGlmIChibG9ja19sZW4gJiBBMkRQX1NCQ19JRV9CTE9DS1NfMTYpIHsKLSAgICByZXN1bHRfY29uZmlnX2NpZS5ibG9ja19sZW4gPSBBMkRQX1NCQ19JRV9CTE9DS1NfMTY7Ci0gIH0gZWxzZSBpZiAoYmxvY2tfbGVuICYgQTJEUF9TQkNfSUVfQkxPQ0tTXzEyKSB7Ci0gICAgcmVzdWx0X2NvbmZpZ19jaWUuYmxvY2tfbGVuID0gQTJEUF9TQkNfSUVfQkxPQ0tTXzEyOwotICB9IGVsc2UgaWYgKGJsb2NrX2xlbiAmIEEyRFBfU0JDX0lFX0JMT0NLU184KSB7Ci0gICAgcmVzdWx0X2NvbmZpZ19jaWUuYmxvY2tfbGVuID0gQTJEUF9TQkNfSUVfQkxPQ0tTXzg7Ci0gIH0gZWxzZSBpZiAoYmxvY2tfbGVuICYgQTJEUF9TQkNfSUVfQkxPQ0tTXzQpIHsKLSAgICByZXN1bHRfY29uZmlnX2NpZS5ibG9ja19sZW4gPSBBMkRQX1NCQ19JRV9CTE9DS1NfNDsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIGJsb2NrIGxlbmd0aDogbG9jYWwgY2FwcyA9IDB4JXggIgotICAgICAgICAicGVlciBpbmZvID0gMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBwX2EyZHBfc2JjX2NhcHMtPmJsb2NrX2xlbiwgcGVlcl9pbmZvX2NpZS5ibG9ja19sZW4pOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgbnVtYmVyIG9mIHN1Yi1iYW5kcwotICAvLwotICBudW1fc3ViYmFuZHMgPSBwX2EyZHBfc2JjX2NhcHMtPm51bV9zdWJiYW5kcyAmIHBlZXJfaW5mb19jaWUubnVtX3N1YmJhbmRzOwotICBpZiAobnVtX3N1YmJhbmRzICYgQTJEUF9TQkNfSUVfU1VCQkFORF84KSB7Ci0gICAgcmVzdWx0X2NvbmZpZ19jaWUubnVtX3N1YmJhbmRzID0gQTJEUF9TQkNfSUVfU1VCQkFORF84OwotICB9IGVsc2UgaWYgKG51bV9zdWJiYW5kcyAmIEEyRFBfU0JDX0lFX1NVQkJBTkRfNCkgewotICAgIHJlc3VsdF9jb25maWdfY2llLm51bV9zdWJiYW5kcyA9IEEyRFBfU0JDX0lFX1NVQkJBTkRfNDsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIG51bWJlciBvZiBzdWItYmFuZHM6IGxvY2FsIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9hMmRwX3NiY19jYXBzLT5udW1fc3ViYmFuZHMsIHBlZXJfaW5mb19jaWUubnVtX3N1YmJhbmRzKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIGFsbG9jYXRpb24gbWV0aG9kCi0gIC8vCi0gIGFsbG9jX21ldGhvZCA9IHBfYTJkcF9zYmNfY2Fwcy0+YWxsb2NfbWV0aG9kICYgcGVlcl9pbmZvX2NpZS5hbGxvY19tZXRob2Q7Ci0gIGlmIChhbGxvY19tZXRob2QgJiBBMkRQX1NCQ19JRV9BTExPQ19NRF9MKSB7Ci0gICAgcmVzdWx0X2NvbmZpZ19jaWUuYWxsb2NfbWV0aG9kID0gQTJEUF9TQkNfSUVfQUxMT0NfTURfTDsKLSAgfSBlbHNlIGlmIChhbGxvY19tZXRob2QgJiBBMkRQX1NCQ19JRV9BTExPQ19NRF9TKSB7Ci0gICAgcmVzdWx0X2NvbmZpZ19jaWUuYWxsb2NfbWV0aG9kID0gQTJEUF9TQkNfSUVfQUxMT0NfTURfUzsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIGFsbG9jYXRpb24gbWV0aG9kOiBsb2NhbCBjYXBzID0gMHgleCAiCi0gICAgICAgICJwZWVyIGluZm8gPSAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIHBfYTJkcF9zYmNfY2Fwcy0+YWxsb2NfbWV0aG9kLCBwZWVyX2luZm9fY2llLmFsbG9jX21ldGhvZCk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gU2VsZWN0IHRoZSBtaW4vbWF4IGJpdHBvb2wKLSAgLy8KLSAgcmVzdWx0X2NvbmZpZ19jaWUubWluX2JpdHBvb2wgPSBwX2EyZHBfc2JjX2NhcHMtPm1pbl9iaXRwb29sOwotICBpZiAocmVzdWx0X2NvbmZpZ19jaWUubWluX2JpdHBvb2wgPCBwZWVyX2luZm9fY2llLm1pbl9iaXRwb29sKQotICAgIHJlc3VsdF9jb25maWdfY2llLm1pbl9iaXRwb29sID0gcGVlcl9pbmZvX2NpZS5taW5fYml0cG9vbDsKLSAgcmVzdWx0X2NvbmZpZ19jaWUubWF4X2JpdHBvb2wgPSBwX2EyZHBfc2JjX2NhcHMtPm1heF9iaXRwb29sOwotICBpZiAocmVzdWx0X2NvbmZpZ19jaWUubWF4X2JpdHBvb2wgPiBwZWVyX2luZm9fY2llLm1heF9iaXRwb29sKQotICAgIHJlc3VsdF9jb25maWdfY2llLm1heF9iaXRwb29sID0gcGVlcl9pbmZvX2NpZS5tYXhfYml0cG9vbDsKLSAgaWYgKHJlc3VsdF9jb25maWdfY2llLm1pbl9iaXRwb29sID4gcmVzdWx0X2NvbmZpZ19jaWUubWF4X2JpdHBvb2wpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIG1pbi9tYXggYml0cG9vbDogIgotICAgICAgICAibG9jYWwgY2FwcyBtaW4vbWF4ID0gMHgleC8weCV4IHBlZXIgaW5mbyBtaW4vbWF4ID0gMHgleC8weCV4IiwKLSAgICAgICAgX19mdW5jX18sIHBfYTJkcF9zYmNfY2Fwcy0+bWluX2JpdHBvb2wsIHBfYTJkcF9zYmNfY2Fwcy0+bWF4X2JpdHBvb2wsCi0gICAgICAgIHBlZXJfaW5mb19jaWUubWluX2JpdHBvb2wsIHBlZXJfaW5mb19jaWUubWF4X2JpdHBvb2wpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIGlmIChBMkRQX0J1aWxkSW5mb1NiYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0X2NvZGVjX2NvbmZpZykgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gQ29weSB0aGUgY29kZWMtc3BlY2lmaWMgZmllbGRzIGlmIHRoZXkgYXJlIG5vdCB6ZXJvCi0gIC8vCi0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xOwotICBpZiAoY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzIgIT0gMCkKLSAgICBjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzIgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMjsKLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18zICE9IDApCi0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18zID0gY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzM7Ci0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfNCAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfNCA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY180OwotCi0gIC8vIENyZWF0ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIHBlZXIgY29kZWMgY2FwYWJpbGl0eS9jb25maWcsIGFuZCB0aGUKLSAgLy8gcmVzdWx0IGNvZGVjIGNvbmZpZy4KLSAgaWYgKGlzX2NhcGFiaWxpdHkpIHsKLSAgICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb1NiYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKTsKLSAgfSBlbHNlIHsKLSAgICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb1NiYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19wZWVyX2NvbmZpZ18pOwotICB9Ci0gIENIRUNLKHN0YXR1cyA9PSBBMkRQX1NVQ0NFU1MpOwotICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb1NiYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RhX2NvZGVjX2NvbmZpZ18pOwotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWZhaWw6Ci0gIC8vIFJlc3RvcmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGNvZGVjX2NvbmZpZ18gPSBzYXZlZF9jb2RlY19jb25maWc7Ci0gIGNvZGVjX2NhcGFiaWxpdHlfID0gc2F2ZWRfY29kZWNfY2FwYWJpbGl0eTsKLSAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XyA9IHNhdmVkX2NvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eTsKLSAgY29kZWNfdXNlcl9jb25maWdfID0gc2F2ZWRfY29kZWNfdXNlcl9jb25maWc7Ci0gIGNvZGVjX2F1ZGlvX2NvbmZpZ18gPSBzYXZlZF9jb2RlY19hdWRpb19jb25maWc7Ci0gIG1lbWNweShvdGFfY29kZWNfY29uZmlnXywgc2F2ZWRfb3RhX2NvZGVjX2NvbmZpZywgc2l6ZW9mKG90YV9jb2RlY19jb25maWdfKSk7Ci0gIG1lbWNweShvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xywgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eSwKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotICBtZW1jcHkob3RhX2NvZGVjX3BlZXJfY29uZmlnXywgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY29uZmlnLAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NvbmZpZ18pKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ1NiY0Jhc2U6OnNldFBlZXJDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICB0QTJEUF9TQkNfQ0lFIHBlZXJfaW5mb19jaWU7Ci0gIHVpbnQ4X3Qgc2FtcF9mcmVxOwotICB1aW50OF90IGNoX21vZGU7Ci0gIGNvbnN0IHRBMkRQX1NCQ19DSUUqIHBfYTJkcF9zYmNfY2FwcyA9Ci0gICAgICAoaXNfc291cmNlXykgPyAmYTJkcF9zYmNfc291cmNlX2NhcHMgOiAmYTJkcF9zYmNfc2lua19jYXBzOwotCi0gIC8vIFNhdmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHkgPQotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XzsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5W0FWRFRfQ09ERUNfU0laRV07Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LCBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotCi0gIHRBMkRQX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9TYmMoJnBlZXJfaW5mb19jaWUsIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMsIHRydWUpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbid0IHBhcnNlIHBlZXIncyBjYXBhYmlsaXRpZXM6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkgLSBzYW1wbGUgcmF0ZQotICBzYW1wX2ZyZXEgPSBwX2EyZHBfc2JjX2NhcHMtPnNhbXBfZnJlcSAmIHBlZXJfaW5mb19jaWUuc2FtcF9mcmVxOwotICBpZiAoc2FtcF9mcmVxICYgQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ0KSB7Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gIH0KLSAgaWYgKHNhbXBfZnJlcSAmIEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80OCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICB9Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5IC0gYml0cyBwZXIgc2FtcGxlCi0gIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0KLSAgICAgIHBfYTJkcF9zYmNfY2Fwcy0+Yml0c19wZXJfc2FtcGxlOwotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGNoYW5uZWwgbW9kZQotICBjaF9tb2RlID0gcF9hMmRwX3NiY19jYXBzLT5jaF9tb2RlICYgcGVlcl9pbmZvX2NpZS5jaF9tb2RlOwotICBpZiAoY2hfbW9kZSAmIEEyRFBfU0JDX0lFX0NIX01EX01PTk8pIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gIH0KLSAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICB9Ci0gIGlmIChjaF9tb2RlICYgQTJEUF9TQkNfSUVfQ0hfTURfU1RFUkVPKSB7Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gIH0KLSAgaWYgKGNoX21vZGUgJiBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMKSB7Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gIH0KLQotICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb1NiYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xyk7Ci0gIENIRUNLKHN0YXR1cyA9PSBBMkRQX1NVQ0NFU1MpOwotICByZXR1cm4gdHJ1ZTsKLQotZmFpbDoKLSAgLy8gUmVzdG9yZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XyA9IHNhdmVkX2NvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eTsKLSAgbWVtY3B5KG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotQTJkcENvZGVjQ29uZmlnU2JjU2luazo6QTJkcENvZGVjQ29uZmlnU2JjU2luaygKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkKLSAgICA6IEEyZHBDb2RlY0NvbmZpZ1NiY0Jhc2UoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMkRQX0NvZGVjSW5kZXhTdHJTYmNTaW5rKCksIGNvZGVjX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkge30KLQotQTJkcENvZGVjQ29uZmlnU2JjU2luazo6fkEyZHBDb2RlY0NvbmZpZ1NiY1NpbmsoKSB7fQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ1NiY1Npbms6OmluaXQoKSB7Ci0gIGlmICghaXNWYWxpZCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gTG9hZCB0aGUgZGVjb2RlcgotICBpZiAoIUEyRFBfTG9hZERlY29kZXJTYmMoKSkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBsb2FkIHRoZSBkZWNvZGVyIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ1NiY1Npbms6OnVzZVJ0cEhlYWRlck1hcmtlckJpdCgpIGNvbnN0IHsKLSAgLy8gVE9ETzogVGhpcyBtZXRob2QgYXBwbGllcyBvbmx5IHRvIFNvdXJjZSBjb2RlY3MKLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYTJkcC9hMmRwX3NiY19kZWNvZGVyLmNjIGIvc3RhY2svYTJkcC9hMmRwX3NiY19kZWNvZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ4ZjUwLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF9zYmNfZGVjb2Rlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImEyZHBfc2JjX2RlY29kZXIiCi0KLSNpbmNsdWRlICJhMmRwX3NiY19kZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImVtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX2NvZGVjX3NiYy5oIgotI2luY2x1ZGUgImVtYmRydi9zYmMvZGVjb2Rlci9pbmNsdWRlL29pX3N0YXR1cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgT0lfQ09ERUNfU0JDX0RFQ09ERVJfQ09OVEVYVCBkZWNvZGVyX2NvbnRleHQ7Ci0gIHVpbnQzMl90IGNvbnRleHRfZGF0YVtDT0RFQ19EQVRBX1dPUkRTKDIsIFNCQ19DT0RFQ19GQVNUX0ZJTFRFUl9CVUZGRVJTKV07Ci0gIGludDE2X3QgZGVjb2RlX2J1ZlsxNSAqIFNCQ19NQVhfU0FNUExFU19QRVJfRlJBTUUgKiBTQkNfTUFYX0NIQU5ORUxTXTsKLSAgZGVjb2RlZF9kYXRhX2NhbGxiYWNrX3QgZGVjb2RlX2NhbGxiYWNrOwotfSB0QTJEUF9TQkNfREVDT0RFUl9DQjsKLQotc3RhdGljIHRBMkRQX1NCQ19ERUNPREVSX0NCIGEyZHBfc2JjX2RlY29kZXJfY2I7Ci0KLWJvb2wgQTJEUF9Mb2FkRGVjb2RlclNiYyh2b2lkKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8gLSB0aGUgbGlicmFyeSBpcyBzdGF0aWNhbGx5IGxpbmtlZAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBMkRQX1VubG9hZERlY29kZXJTYmModm9pZCkgeyBhMmRwX3NiY19kZWNvZGVyX2NsZWFudXAoKTsgfQotCi1ib29sIGEyZHBfc2JjX2RlY29kZXJfaW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spIHsKLSAgT0lfU1RBVFVTIHN0YXR1cyA9IE9JX0NPREVDX1NCQ19EZWNvZGVyUmVzZXQoCi0gICAgICAmYTJkcF9zYmNfZGVjb2Rlcl9jYi5kZWNvZGVyX2NvbnRleHQsIGEyZHBfc2JjX2RlY29kZXJfY2IuY29udGV4dF9kYXRhLAotICAgICAgc2l6ZW9mKGEyZHBfc2JjX2RlY29kZXJfY2IuY29udGV4dF9kYXRhKSwgMiwgMiwgZmFsc2UpOwotICBpZiAoIU9JX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgIExPR19FUlJPUigiJXM6IE9JX0NPREVDX1NCQ19EZWNvZGVyUmVzZXQgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGEyZHBfc2JjX2RlY29kZXJfY2IuZGVjb2RlX2NhbGxiYWNrID0gZGVjb2RlX2NhbGxiYWNrOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBhMmRwX3NiY19kZWNvZGVyX2NsZWFudXAodm9pZCkgewotICAvLyBEbyBub3RoaW5nLgotfQotCi1ib29sIGEyZHBfc2JjX2RlY29kZXJfZGVjb2RlX3BhY2tldChCVF9IRFIqIHBfYnVmKSB7Ci0gIHVpbnQ4X3QqIGRhdGEgPSBwX2J1Zi0+ZGF0YSArIHBfYnVmLT5vZmZzZXQ7Ci0gIHNpemVfdCBkYXRhX3NpemUgPSBwX2J1Zi0+bGVuOwotCi0gIGlmIChkYXRhX3NpemUgPT0gMCkgewotICAgIExPR19FUlJPUigiJXM6IEVtcHR5IHBhY2tldCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc2l6ZV90IG51bV9mcmFtZXMgPSBkYXRhWzBdICYgMHhmOwotICBkYXRhICs9IDE7Ci0gIGRhdGFfc2l6ZSAtPSAxOwotCi0gIGNvbnN0IE9JX0JZVEUqIG9pX2RhdGEgPSBkYXRhOwotICB1aW50MzJfdCBvaV9zaXplID0gZGF0YV9zaXplOwotICBzaXplX3Qgb3V0X2F2YWlsID0gc2l6ZW9mKGEyZHBfc2JjX2RlY29kZXJfY2IuZGVjb2RlX2J1Zik7Ci0gIGludDE2X3QqIG91dF9wdHIgPSBhMmRwX3NiY19kZWNvZGVyX2NiLmRlY29kZV9idWY7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZnJhbWVzOyArK2kpIHsKLSAgICB1aW50MzJfdCBvdXRfc2l6ZSA9IG91dF9hdmFpbDsKLSAgICBPSV9TVEFUVVMgc3RhdHVzID0KLSAgICAgICAgT0lfQ09ERUNfU0JDX0RlY29kZUZyYW1lKCZhMmRwX3NiY19kZWNvZGVyX2NiLmRlY29kZXJfY29udGV4dCwgJm9pX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2lfc2l6ZSwgb3V0X3B0ciwgJm91dF9zaXplKTsKLSAgICBpZiAoIU9JX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgICAgTE9HX0VSUk9SKCIlczogRGVjb2RpbmcgZmFpbHVyZTogJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb3V0X2F2YWlsIC09IG91dF9zaXplOwotICAgIG91dF9wdHIgKz0gb3V0X3NpemUgLyBzaXplb2YoKm91dF9wdHIpOwotICB9Ci0KLSAgc2l6ZV90IG91dF91c2VkID0KLSAgICAgIChvdXRfcHRyIC0gYTJkcF9zYmNfZGVjb2Rlcl9jYi5kZWNvZGVfYnVmKSAqIHNpemVvZigqb3V0X3B0cik7Ci0gIGEyZHBfc2JjX2RlY29kZXJfY2IuZGVjb2RlX2NhbGxiYWNrKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYTJkcF9zYmNfZGVjb2Rlcl9jYi5kZWNvZGVfYnVmKSwgb3V0X3VzZWQpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF9zYmNfZW5jb2Rlci5jYyBiL3N0YWNrL2EyZHAvYTJkcF9zYmNfZW5jb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkNjgzOC4uMDAwMDAwMAotLS0gYS9zdGFjay9hMmRwL2EyZHBfc2JjX2VuY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYTJkcF9zYmNfZW5jb2RlciIKLQotI2luY2x1ZGUgImEyZHBfc2JjX2VuY29kZXIuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhMmRwX3NiYy5oIgotI2luY2x1ZGUgImEyZHBfc2JjX3VwX3NhbXBsZS5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJlbWJkcnYvc2JjL2VuY29kZXIvaW5jbHVkZS9zYmNfZW5jb2Rlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8qIEJ1ZmZlciBwb29sICovCi0jZGVmaW5lIEEyRFBfU0JDX0JVRkZFUl9TSVpFIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUKLQotLy8gQTJEUCBTQkMgZW5jb2RlciBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuCi0jZGVmaW5lIEEyRFBfU0JDX0VOQ09ERVJfSU5URVJWQUxfTVMgMjAKLQotLyogSGlnaCBxdWFsaXR5IHF1YWxpdHkgc2V0dGluZyBAIDQ0LjEga2h6ICovCi0jZGVmaW5lIEEyRFBfU0JDX0RFRkFVTFRfQklUUkFURSAzMjgKLQotI2RlZmluZSBBMkRQX1NCQ19OT05fRURSX01BWF9SQVRFIDIyOQotCi0jZGVmaW5lIEEyRFBfU0JDX01BWF9QQ01fSVRFUl9OVU1fUEVSX1RJQ0sgMwotCi0jZGVmaW5lIEEyRFBfU0JDX01BWF9IUV9GUkFNRV9TSVpFXzQ0XzEgMTE5Ci0jZGVmaW5lIEEyRFBfU0JDX01BWF9IUV9GUkFNRV9TSVpFXzQ4IDExNQotCi0vKiBEZWZpbmUgdGhlIGJpdHJhdGUgc3RlcCB3aGVuIHRyeWluZyB0byBtYXRjaCBiaXRwb29sIHZhbHVlICovCi0jZGVmaW5lIEEyRFBfU0JDX0JJVFJBVEVfU1RFUCA1Ci0KLS8qIFJlYWRhYmlsaXR5IGNvbnN0YW50cyAqLwotI2RlZmluZSBBMkRQX1NCQ19GUkFNRV9IRUFERVJfU0laRV9CWVRFUyA0ICAvLyBBMkRQIFNwZWMgdjEuMywgMTIuNCwgVGFibGUgMTIuMTIKLSNkZWZpbmUgQTJEUF9TQkNfU0NBTEVfRkFDVE9SX0JJVFMgNCAgICAgICAgLy8gQTJEUCBTcGVjIHYxLjMsIDEyLjQsIFRhYmxlIDEyLjEzCi0KLS8qIG9mZnNldCAqLwotI2lmIChCVEFfQVZfQ09fQ1BfU0NNU19UID09IFRSVUUpCi0vKiBBMkRQIGhlYWRlciB3aWxsIGNvbnRhaW4gYSBDUCBoZWFkZXIgb2Ygc2l6ZSAxICovCi0jZGVmaW5lIEEyRFBfSERSX1NJWkUgMgotI2RlZmluZSBBMkRQX1NCQ19PRkZTRVQgKEFWRFRfTUVESUFfT0ZGU0VUICsgQTJEUF9TQkNfTVBMX0hEUl9MRU4gKyAxKQotI2Vsc2UKLSNkZWZpbmUgQTJEUF9IRFJfU0laRSAxCi0jZGVmaW5lIEEyRFBfU0JDX09GRlNFVCAoQVZEVF9NRURJQV9PRkZTRVQgKyBBMkRQX1NCQ19NUExfSERSX0xFTikKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IGFhX2ZyYW1lX2NvdW50ZXI7Ci0gIGludDMyX3QgYWFfZmVlZF9jb3VudGVyOwotICBpbnQzMl90IGFhX2ZlZWRfcmVzaWR1ZTsKLSAgZmxvYXQgY291bnRlcjsKLSAgdWludDMyX3QgYnl0ZXNfcGVyX3RpY2s7IC8qIHBjbSBieXRlcyByZWFkIGVhY2ggbWVkaWEgdGFzayB0aWNrICovCi0gIHVpbnQ2NF90IGxhc3RfZnJhbWVfdXM7Ci19IHRBMkRQX1NCQ19GRUVESU5HX1NUQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ2NF90IHNlc3Npb25fc3RhcnRfdXM7Ci0KLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcGFja2V0czsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQ7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRfYnl0ZXM7Ci0KLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZHJvcHBlZF9wYWNrZXRzOwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZHNfY291bnQ7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzOwotCi0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX2ZyYW1lczsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZHJvcHBlZF9mcmFtZXM7Ci19IGEyZHBfc2JjX2VuY29kZXJfc3RhdHNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBhMmRwX3NvdXJjZV9yZWFkX2NhbGxiYWNrX3QgcmVhZF9jYWxsYmFjazsKLSAgYTJkcF9zb3VyY2VfZW5xdWV1ZV9jYWxsYmFja190IGVucXVldWVfY2FsbGJhY2s7Ci0gIHVpbnQxNl90IFR4QWFNdHVTaXplOwotICB1aW50OF90IHR4X3NiY19mcmFtZXM7Ci0gIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwZWVyX3BhcmFtczsKLSAgdWludDMyX3QgdGltZXN0YW1wOyAgICAgICAvKiBUaW1lc3RhbXAgZm9yIHRoZSBBMkRQIGZyYW1lcyAqLwotICBTQkNfRU5DX1BBUkFNUyBzYmNfZW5jb2Rlcl9wYXJhbXM7Ci0gIHRBMkRQX0ZFRURJTkdfUEFSQU1TIGZlZWRpbmdfcGFyYW1zOwotICB0QTJEUF9TQkNfRkVFRElOR19TVEFURSBmZWVkaW5nX3N0YXRlOwotICBpbnQxNl90IHBjbUJ1ZmZlcltTQkNfTUFYX1BDTV9CVUZGRVJfU0laRV07Ci0KLSAgYTJkcF9zYmNfZW5jb2Rlcl9zdGF0c190IHN0YXRzOwotfSB0QTJEUF9TQkNfRU5DT0RFUl9DQjsKLQotc3RhdGljIHRBMkRQX1NCQ19FTkNPREVSX0NCIGEyZHBfc2JjX2VuY29kZXJfY2I7Ci0KLXN0YXRpYyB2b2lkIGEyZHBfc2JjX2VuY29kZXJfdXBkYXRlKEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9jb25maWdfdXBkYXRlZCk7Ci1zdGF0aWMgYm9vbCBhMmRwX3NiY19yZWFkX2ZlZWRpbmcodWludDMyX3QqIGJ5dGVzKTsKLXN0YXRpYyB2b2lkIGEyZHBfc2JjX2VuY29kZV9mcmFtZXModWludDhfdCBuYl9mcmFtZSk7Ci1zdGF0aWMgdm9pZCBhMmRwX3NiY19nZXRfbnVtX2ZyYW1lX2l0ZXJhdGlvbih1aW50OF90KiBudW1fb2ZfaXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG51bV9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfdXMpOwotc3RhdGljIHVpbnQxNl90IGFkanVzdF9lZmZlY3RpdmVfbXR1KAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyYgcGVlcl9wYXJhbXMpOwotc3RhdGljIHVpbnQ4X3QgY2FsY3VsYXRlX21heF9mcmFtZXNfcGVyX3BhY2tldCh2b2lkKTsKLXN0YXRpYyB1aW50MTZfdCBhMmRwX3NiY19zb3VyY2VfcmF0ZShib29sIGlzX3BlZXJfZWRyKTsKLXN0YXRpYyB1aW50MzJfdCBhMmRwX3NiY19mcmFtZV9sZW5ndGgodm9pZCk7Ci0KLWJvb2wgQTJEUF9Mb2FkRW5jb2RlclNiYyh2b2lkKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8gLSB0aGUgbGlicmFyeSBpcyBzdGF0aWNhbGx5IGxpbmtlZAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBMkRQX1VubG9hZEVuY29kZXJTYmModm9pZCkgewotICAvLyBOb3RoaW5nIHRvIGRvIC0gdGhlIGxpYnJhcnkgaXMgc3RhdGljYWxseSBsaW5rZWQKLX0KLQotdm9pZCBhMmRwX3NiY19lbmNvZGVyX2luaXQoY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TKiBwX3BlZXJfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCByZWFkX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zb3VyY2VfZW5xdWV1ZV9jYWxsYmFja190IGVucXVldWVfY2FsbGJhY2spIHsKLSAgbWVtc2V0KCZhMmRwX3NiY19lbmNvZGVyX2NiLCAwLCBzaXplb2YoYTJkcF9zYmNfZW5jb2Rlcl9jYikpOwotCi0gIGEyZHBfc2JjX2VuY29kZXJfY2Iuc3RhdHMuc2Vzc2lvbl9zdGFydF91cyA9Ci0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLQotICBhMmRwX3NiY19lbmNvZGVyX2NiLnJlYWRfY2FsbGJhY2sgPSByZWFkX2NhbGxiYWNrOwotICBhMmRwX3NiY19lbmNvZGVyX2NiLmVucXVldWVfY2FsbGJhY2sgPSBlbnF1ZXVlX2NhbGxiYWNrOwotICBhMmRwX3NiY19lbmNvZGVyX2NiLnBlZXJfcGFyYW1zID0gKnBfcGVlcl9wYXJhbXM7Ci0gIGEyZHBfc2JjX2VuY29kZXJfY2IudGltZXN0YW1wID0gMDsKLQotICAvLyBOT1RFOiBJZ25vcmUgdGhlIHJlc3RhcnRfaW5wdXQgLyByZXN0YXJ0X291dHB1dCBmbGFncyAtIHRoaXMgaW5pdGl6YXRpb24KLSAgLy8gaGFwcGVucyB3aGVuIHRoZSBhdWRpbyBzZXNzaW9uIGlzIChyZSlzdGFydGVkLgotICBib29sIHJlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGEyZHBfc2JjX2VuY29kZXJfdXBkYXRlKGEyZHBfY29kZWNfY29uZmlnLCAmcmVzdGFydF9pbnB1dCwgJnJlc3RhcnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnX3VwZGF0ZWQpOwotfQotCi0vLyBVcGRhdGUgdGhlIEEyRFAgU0JDIGVuY29kZXIuCi0vLyB8YTJkcF9jb2RlY19jb25maWd8IGlzIHRoZSBBMkRQIGNvZGVjIHRvIHVzZSBmb3IgdGhlIHVwZGF0ZS4KLXN0YXRpYyB2b2lkIGEyZHBfc2JjX2VuY29kZXJfdXBkYXRlKEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9jb25maWdfdXBkYXRlZCkgewotICBTQkNfRU5DX1BBUkFNUyogcF9lbmNvZGVyX3BhcmFtcyA9ICZhMmRwX3NiY19lbmNvZGVyX2NiLnNiY19lbmNvZGVyX3BhcmFtczsKLSAgdWludDhfdCBjb2RlY19pbmZvW0FWRFRfQ09ERUNfU0laRV07Ci0gIHVpbnQxNl90IHMxNlNhbXBsaW5nRnJlcTsKLSAgaW50MTZfdCBzMTZCaXRQb29sID0gMDsKLSAgaW50MTZfdCBzMTZCaXRSYXRlOwotICBpbnQxNl90IHMxNkZyYW1lTGVuOwotICB1aW50OF90IHByb3RlY3QgPSAwOwotICBpbnQgbWluX2JpdHBvb2w7Ci0gIGludCBtYXhfYml0cG9vbDsKLQotICAqcF9yZXN0YXJ0X2lucHV0ID0gZmFsc2U7Ci0gICpwX3Jlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gICpwX2NvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGlmICghYTJkcF9jb2RlY19jb25maWctPmNvcHlPdXRPdGFDb2RlY0NvbmZpZyhjb2RlY19pbmZvKSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3QgdXBkYXRlIHRoZSBjb2RlYyBlbmNvZGVyIGZvciAlczogIgotICAgICAgICAiaW52YWxpZCBjb2RlYyBjb25maWciLAotICAgICAgICBfX2Z1bmNfXywgYTJkcF9jb2RlY19jb25maWctPm5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvID0gY29kZWNfaW5mbzsKLSAgbWluX2JpdHBvb2wgPSBBMkRQX0dldE1pbkJpdHBvb2xTYmMocF9jb2RlY19pbmZvKTsKLSAgbWF4X2JpdHBvb2wgPSBBMkRQX0dldE1heEJpdHBvb2xTYmMocF9jb2RlY19pbmZvKTsKLQotICAvLyBUaGUgZmVlZGluZyBwYXJhbWV0ZXJzCi0gIHRBMkRQX0ZFRURJTkdfUEFSQU1TKiBwX2ZlZWRpbmdfcGFyYW1zID0gJmEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXM7Ci0gIHBfZmVlZGluZ19wYXJhbXMtPnNhbXBsZV9yYXRlID0gQTJEUF9HZXRUcmFja1NhbXBsZVJhdGVTYmMocF9jb2RlY19pbmZvKTsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlID0KLSAgICAgIGEyZHBfY29kZWNfY29uZmlnLT5nZXRBdWRpb0JpdHNQZXJTYW1wbGUoKTsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+Y2hhbm5lbF9jb3VudCA9IEEyRFBfR2V0VHJhY2tDaGFubmVsQ291bnRTYmMocF9jb2RlY19pbmZvKTsKLSAgTE9HX0lORk8oIiVzOiBzYW1wbGVfcmF0ZT0ldSBiaXRzX3Blcl9zYW1wbGU9JXUgY2hhbm5lbF9jb3VudD0ldSIsIF9fZnVuY19fLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5jaGFubmVsX2NvdW50KTsKLSAgYTJkcF9zYmNfZmVlZGluZ19yZXNldCgpOwotCi0gIC8vIFRoZSBjb2RlYyBwYXJhbWV0ZXJzCi0gIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkNoYW5uZWxNb2RlID0gQTJEUF9HZXRDaGFubmVsTW9kZUNvZGVTYmMocF9jb2RlY19pbmZvKTsKLSAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyA9Ci0gICAgICBBMkRQX0dldE51bWJlck9mU3ViYmFuZHNTYmMocF9jb2RlY19pbmZvKTsKLSAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MgPSBBMkRQX0dldE51bWJlck9mQmxvY2tzU2JjKHBfY29kZWNfaW5mbyk7Ci0gIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkFsbG9jYXRpb25NZXRob2QgPQotICAgICAgQTJEUF9HZXRBbGxvY2F0aW9uTWV0aG9kQ29kZVNiYyhwX2NvZGVjX2luZm8pOwotICBwX2VuY29kZXJfcGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXEgPQotICAgICAgQTJEUF9HZXRTYW1wbGluZ0ZyZXF1ZW5jeUNvZGVTYmMocF9jb2RlY19pbmZvKTsKLSAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZDaGFubmVscyA9Ci0gICAgICBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50U2JjKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gUmVzZXQgaW52YWxpZCBwYXJhbWV0ZXJzCi0gIGlmICghcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykgewotICAgIExPR19XQVJOKCIlczogU3ViQmFuZHMgYXJlIHNldCB0byAwLCByZXNldHRpbmcgdG8gbWF4ICglZCkiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICBTQkNfTUFYX05VTV9PRl9TVUJCQU5EUyk7Ci0gICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyA9IFNCQ19NQVhfTlVNX09GX1NVQkJBTkRTOwotICB9Ci0gIGlmICghcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MpIHsKLSAgICBMT0dfV0FSTigiJXM6IEJsb2NrcyBhcmUgc2V0IHRvIDAsIHJlc2V0dGluZyB0byBtYXggKCVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgIFNCQ19NQVhfTlVNX09GX0JMT0NLUyk7Ci0gICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MgPSBTQkNfTUFYX05VTV9PRl9CTE9DS1M7Ci0gIH0KLSAgaWYgKCFwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSB7Ci0gICAgTE9HX1dBUk4oIiVzOiBDaGFubmVscyBhcmUgc2V0IHRvIDAsIHJlc2V0dGluZyB0byBtYXggKCVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgIFNCQ19NQVhfTlVNX09GX0NIQU5ORUxTKTsKLSAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzID0gU0JDX01BWF9OVU1fT0ZfQ0hBTk5FTFM7Ci0gIH0KLQotICBpZiAocF9lbmNvZGVyX3BhcmFtcy0+czE2U2FtcGxpbmdGcmVxID09IFNCQ19zZjE2MDAwKQotICAgIHMxNlNhbXBsaW5nRnJlcSA9IDE2MDAwOwotICBlbHNlIGlmIChwX2VuY29kZXJfcGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXEgPT0gU0JDX3NmMzIwMDApCi0gICAgczE2U2FtcGxpbmdGcmVxID0gMzIwMDA7Ci0gIGVsc2UgaWYgKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNlNhbXBsaW5nRnJlcSA9PSBTQkNfc2Y0NDEwMCkKLSAgICBzMTZTYW1wbGluZ0ZyZXEgPSA0NDEwMDsKLSAgZWxzZQotICAgIHMxNlNhbXBsaW5nRnJlcSA9IDQ4MDAwOwotCi0gIC8vIFNldCB0aGUgaW5pdGlhbCB0YXJnZXQgYml0IHJhdGUKLSAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TJiBwZWVyX3BhcmFtcyA9Ci0gICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLnBlZXJfcGFyYW1zOwotICBwX2VuY29kZXJfcGFyYW1zLT51MTZCaXRSYXRlID0gYTJkcF9zYmNfc291cmNlX3JhdGUocGVlcl9wYXJhbXMuaXNfcGVlcl9lZHIpOwotCi0gIGEyZHBfc2JjX2VuY29kZXJfY2IuVHhBYU10dVNpemUgPSBhZGp1c3RfZWZmZWN0aXZlX210dShwZWVyX3BhcmFtcyk7Ci0gIExPR19JTkZPKCIlczogTVRVPSVkLCBwZWVyX210dT0lZCBtaW5fYml0cG9vbD0lZCBtYXhfYml0cG9vbD0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLlR4QWFNdHVTaXplLCBwZWVyX3BhcmFtcy5wZWVyX210dSwgbWluX2JpdHBvb2wsCi0gICAgICAgICAgIG1heF9iaXRwb29sKTsKLSAgTE9HX0lORk8oCi0gICAgICAiJXM6IENoYW5uZWxNb2RlPSVkLCBOdW1PZlN1YkJhbmRzPSVkLCBOdW1PZkJsb2Nrcz0lZCwgIgotICAgICAgIkFsbG9jYXRpb25NZXRob2Q9JWQsIEJpdFJhdGU9JWQsIFNhbXBsaW5nRnJlcT0lZCBCaXRQb29sPSVkIiwKLSAgICAgIF9fZnVuY19fLCBwX2VuY29kZXJfcGFyYW1zLT5zMTZDaGFubmVsTW9kZSwKLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMsIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzLAotICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2QWxsb2NhdGlvbk1ldGhvZCwgcF9lbmNvZGVyX3BhcmFtcy0+dTE2Qml0UmF0ZSwKLSAgICAgIHMxNlNhbXBsaW5nRnJlcSwgcF9lbmNvZGVyX3BhcmFtcy0+czE2Qml0UG9vbCk7Ci0KLSAgZG8gewotICAgIGlmICgocF9lbmNvZGVyX3BhcmFtcy0+czE2Q2hhbm5lbE1vZGUgPT0gU0JDX0pPSU5UX1NURVJFTykgfHwKLSAgICAgICAgKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkNoYW5uZWxNb2RlID09IFNCQ19TVEVSRU8pKSB7Ci0gICAgICBzMTZCaXRQb29sID0gKGludDE2X3QpKChwX2VuY29kZXJfcGFyYW1zLT51MTZCaXRSYXRlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgKiAxMDAwIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxNlNhbXBsaW5nRnJlcSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDMyICsgKDQgKiBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwX2VuY29kZXJfcGFyYW1zLT5zMTZDaGFubmVsTW9kZSAtIDIpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzKSk7Ci0KLSAgICAgIHMxNkZyYW1lTGVuID0gNCArCi0gICAgICAgICAgICAgICAgICAgICg0ICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyAqCi0gICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICA4ICsKLSAgICAgICAgICAgICAgICAgICAgKCgocF9lbmNvZGVyX3BhcmFtcy0+czE2Q2hhbm5lbE1vZGUgLSAyKSAqCi0gICAgICAgICAgICAgICAgICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykgKwotICAgICAgICAgICAgICAgICAgICAgKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzICogczE2Qml0UG9vbCkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgIDg7Ci0KLSAgICAgIHMxNkJpdFJhdGUgPSAoOCAqIHMxNkZyYW1lTGVuICogczE2U2FtcGxpbmdGcmVxKSAvCi0gICAgICAgICAgICAgICAgICAgKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgKgotICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkJsb2NrcyAqIDEwMDApOwotCi0gICAgICBpZiAoczE2Qml0UmF0ZSA+IHBfZW5jb2Rlcl9wYXJhbXMtPnUxNkJpdFJhdGUpIHMxNkJpdFBvb2wtLTsKLQotICAgICAgaWYgKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgPT0gOCkKLSAgICAgICAgczE2Qml0UG9vbCA9IChzMTZCaXRQb29sID4gMjU1KSA/IDI1NSA6IHMxNkJpdFBvb2w7Ci0gICAgICBlbHNlCi0gICAgICAgIHMxNkJpdFBvb2wgPSAoczE2Qml0UG9vbCA+IDEyOCkgPyAxMjggOiBzMTZCaXRQb29sOwotICAgIH0gZWxzZSB7Ci0gICAgICBzMTZCaXRQb29sID0KLSAgICAgICAgICAoaW50MTZfdCkoKChwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICoKLSAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT51MTZCaXRSYXRlICogMTAwMCkgLwotICAgICAgICAgICAgICAgICAgICAgKHMxNlNhbXBsaW5nRnJlcSAqIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMpKSAtCi0gICAgICAgICAgICAgICAgICAgICgoKDMyIC8gcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZDaGFubmVscykgKwotICAgICAgICAgICAgICAgICAgICAgICg0ICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykpIC8KLSAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzKSk7Ci0KLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkJpdFBvb2wgPQotICAgICAgICAgIChzMTZCaXRQb29sID4gKDE2ICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykpCi0gICAgICAgICAgICAgID8gKDE2ICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcykKLSAgICAgICAgICAgICAgOiBzMTZCaXRQb29sOwotICAgIH0KLQotICAgIGlmIChzMTZCaXRQb29sIDwgMCkgczE2Qml0UG9vbCA9IDA7Ci0KLSAgICBMT0dfVkVSQk9TRSgiJXM6IGJpdHBvb2wgY2FuZGlkYXRlOiAlZCAoJWQga2JwcykiLCBfX2Z1bmNfXywgczE2Qml0UG9vbCwKLSAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT51MTZCaXRSYXRlKTsKLQotICAgIGlmIChzMTZCaXRQb29sID4gbWF4X2JpdHBvb2wpIHsKLSAgICAgIExPR19WRVJCT1NFKCIlczogY29tcHV0ZWQgYml0cG9vbCB0b28gbGFyZ2UgKCVkKSIsIF9fZnVuY19fLCBzMTZCaXRQb29sKTsKLSAgICAgIC8qIERlY3JlYXNlIGJpdHJhdGUgKi8KLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnUxNkJpdFJhdGUgLT0gQTJEUF9TQkNfQklUUkFURV9TVEVQOwotICAgICAgLyogUmVjb3JkIHRoYXQgd2UgaGF2ZSBkZWNyZWFzZWQgdGhlIGJpdHJhdGUgKi8KLSAgICAgIHByb3RlY3QgfD0gMTsKLSAgICB9IGVsc2UgaWYgKHMxNkJpdFBvb2wgPCBtaW5fYml0cG9vbCkgewotICAgICAgTE9HX1dBUk4oIiVzOiBjb21wdXRlZCBiaXRwb29sIHRvbyBzbWFsbCAoJWQpIiwgX19mdW5jX18sIHMxNkJpdFBvb2wpOwotCi0gICAgICAvKiBJbmNyZWFzZSBiaXRyYXRlICovCi0gICAgICB1aW50MTZfdCBwcmV2aW91c191MTZCaXRSYXRlID0gcF9lbmNvZGVyX3BhcmFtcy0+dTE2Qml0UmF0ZTsKLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnUxNkJpdFJhdGUgKz0gQTJEUF9TQkNfQklUUkFURV9TVEVQOwotICAgICAgLyogUmVjb3JkIHRoYXQgd2UgaGF2ZSBpbmNyZWFzZWQgdGhlIGJpdHJhdGUgKi8KLSAgICAgIHByb3RlY3QgfD0gMjsKLSAgICAgIC8qIENoZWNrIG92ZXItZmxvdyAqLwotICAgICAgaWYgKHBfZW5jb2Rlcl9wYXJhbXMtPnUxNkJpdFJhdGUgPCBwcmV2aW91c191MTZCaXRSYXRlKSBwcm90ZWN0IHw9IDM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBJbiBjYXNlIHdlIGhhdmUgYWxyZWFkeSBpbmNyZWFzZWQgYW5kIGRlY3JlYXNlZCB0aGUgYml0cmF0ZSwganVzdCBzdG9wICovCi0gICAgaWYgKHByb3RlY3QgPT0gMykgewotICAgICAgTE9HX0VSUk9SKCIlczogY291bGQgbm90IGZpbmQgYml0cG9vbCBpbiByYW5nZSIsIF9fZnVuY19fKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAodHJ1ZSk7Ci0KLSAgLyogRmluYWxseSB1cGRhdGUgdGhlIGJpdHBvb2wgaW4gdGhlIGVuY29kZXIgc3RydWN0dXJlICovCi0gIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkJpdFBvb2wgPSBzMTZCaXRQb29sOwotCi0gIExPR19JTkZPKCIlczogZmluYWwgYml0IHJhdGUgJWQsIGZpbmFsIGJpdCBwb29sICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnUxNkJpdFJhdGUsIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkJpdFBvb2wpOwotCi0gIC8qIFJlc2V0IHRoZSBTQkMgZW5jb2RlciAqLwotICBTQkNfRW5jb2Rlcl9Jbml0KCZhMmRwX3NiY19lbmNvZGVyX2NiLnNiY19lbmNvZGVyX3BhcmFtcyk7Ci0gIGEyZHBfc2JjX2VuY29kZXJfY2IudHhfc2JjX2ZyYW1lcyA9IGNhbGN1bGF0ZV9tYXhfZnJhbWVzX3Blcl9wYWNrZXQoKTsKLX0KLQotdm9pZCBhMmRwX3NiY19lbmNvZGVyX2NsZWFudXAodm9pZCkgewotICBtZW1zZXQoJmEyZHBfc2JjX2VuY29kZXJfY2IsIDAsIHNpemVvZihhMmRwX3NiY19lbmNvZGVyX2NiKSk7Ci19Ci0KLXZvaWQgYTJkcF9zYmNfZmVlZGluZ19yZXNldCh2b2lkKSB7Ci0gIC8qIEJ5IGRlZmF1bHQsIGp1c3QgY2xlYXIgdGhlIGVudGlyZSBzdGF0ZSAqLwotICBtZW1zZXQoJmEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZSwgMCwKLSAgICAgICAgIHNpemVvZihhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUpKTsKLQotICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuYnl0ZXNfcGVyX3RpY2sgPQotICAgICAgKGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuc2FtcGxlX3JhdGUgKgotICAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuYml0c19wZXJfc2FtcGxlIC8gOCAqCi0gICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5jaGFubmVsX2NvdW50ICoKLSAgICAgICBBMkRQX1NCQ19FTkNPREVSX0lOVEVSVkFMX01TKSAvCi0gICAgICAxMDAwOwotCi0gIExPR19JTkZPKCIlczogUENNIGJ5dGVzIHBlciB0aWNrICV1IiwgX19mdW5jX18sCi0gICAgICAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5ieXRlc19wZXJfdGljayk7Ci19Ci0KLXZvaWQgYTJkcF9zYmNfZmVlZGluZ19mbHVzaCh2b2lkKSB7Ci0gIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5jb3VudGVyID0gMC4wZjsKLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZSA9IDA7Ci19Ci0KLXVpbnQ2NF90IGEyZHBfc2JjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKHZvaWQpIHsKLSAgcmV0dXJuIEEyRFBfU0JDX0VOQ09ERVJfSU5URVJWQUxfTVM7Ci19Ci0KLWludCBhMmRwX3NiY19nZXRfZWZmZWN0aXZlX2ZyYW1lX3NpemUoKSB7Ci0gIHJldHVybiBhMmRwX3NiY19lbmNvZGVyX2NiLlR4QWFNdHVTaXplOwotfQotCi12b2lkIGEyZHBfc2JjX3NlbmRfZnJhbWVzKHVpbnQ2NF90IHRpbWVzdGFtcF91cykgewotICB1aW50OF90IG5iX2ZyYW1lID0gMDsKLSAgdWludDhfdCBuYl9pdGVyYXRpb25zID0gMDsKLQotICBhMmRwX3NiY19nZXRfbnVtX2ZyYW1lX2l0ZXJhdGlvbigmbmJfaXRlcmF0aW9ucywgJm5iX2ZyYW1lLCB0aW1lc3RhbXBfdXMpOwotICBMT0dfVkVSQk9TRSgiJXM6IFNlbmRpbmcgJWQgZnJhbWVzIHBlciBpdGVyYXRpb24sICVkIGl0ZXJhdGlvbnMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgbmJfZnJhbWUsIG5iX2l0ZXJhdGlvbnMpOwotICBpZiAobmJfZnJhbWUgPT0gMCkgcmV0dXJuOwotCi0gIGZvciAodWludDhfdCBjb3VudGVyID0gMDsgY291bnRlciA8IG5iX2l0ZXJhdGlvbnM7IGNvdW50ZXIrKykgewotICAgIC8vIFRyYW5zY29kZSBmcmFtZSBhbmQgZW5xdWV1ZQotICAgIGEyZHBfc2JjX2VuY29kZV9mcmFtZXMobmJfZnJhbWUpOwotICB9Ci19Ci0KLS8vIE9idGFpbnMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2VuZCBhbmQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKLS8vIHRvIGJlIHVzZWQuIHxudW1fb2ZfaXRlcmF0aW9uc3wgYW5kIHxudW1fb2ZfZnJhbWVzfCBwYXJhbWV0ZXJzCi0vLyBhcmUgdXNlZCBhcyBvdXRwdXQgcGFyYW0gZm9yIHJldHVybmluZyB0aGUgcmVzcGVjdGl2ZSB2YWx1ZXMuCi1zdGF0aWMgdm9pZCBhMmRwX3NiY19nZXRfbnVtX2ZyYW1lX2l0ZXJhdGlvbih1aW50OF90KiBudW1fb2ZfaXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG51bV9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfdXMpIHsKLSAgdWludDhfdCBub2YgPSAwOwotICB1aW50OF90IG5vaSA9IDE7Ci0KLSAgdWludDMyX3QgcHJvamVjdGVkX25vZiA9IDA7Ci0gIHVpbnQzMl90IHBjbV9ieXRlc19wZXJfZnJhbWUgPQotICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5zYmNfZW5jb2Rlcl9wYXJhbXMuczE2TnVtT2ZTdWJCYW5kcyAqCi0gICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLnNiY19lbmNvZGVyX3BhcmFtcy5zMTZOdW1PZkJsb2NrcyAqCi0gICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLmNoYW5uZWxfY291bnQgKgotICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUgLyA4OwotICBMT0dfVkVSQk9TRSgiJXM6IHBjbV9ieXRlc19wZXJfZnJhbWUgJXUiLCBfX2Z1bmNfXywgcGNtX2J5dGVzX3Blcl9mcmFtZSk7Ci0KLSAgdWludDMyX3QgdXNfdGhpc190aWNrID0gQTJEUF9TQkNfRU5DT0RFUl9JTlRFUlZBTF9NUyAqIDEwMDA7Ci0gIHVpbnQ2NF90IG5vd191cyA9IHRpbWVzdGFtcF91czsKLSAgaWYgKGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5sYXN0X2ZyYW1lX3VzICE9IDApCi0gICAgdXNfdGhpc190aWNrID0gKG5vd191cyAtIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5sYXN0X2ZyYW1lX3VzKTsKLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmxhc3RfZnJhbWVfdXMgPSBub3dfdXM7Ci0KLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmNvdW50ZXIgKz0KLSAgICAgIChmbG9hdClhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuYnl0ZXNfcGVyX3RpY2sgKgotICAgICAgKGZsb2F0KXVzX3RoaXNfdGljayAvIChBMkRQX1NCQ19FTkNPREVSX0lOVEVSVkFMX01TICogMTAwMCk7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlbmRpbmcgZm9yIHRoaXMgbWVkaWEgdGljayAqLwotICBwcm9qZWN0ZWRfbm9mID0KLSAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5jb3VudGVyIC8gKGZsb2F0KXBjbV9ieXRlc19wZXJfZnJhbWU7Ci0gIC8vIFVwZGF0ZSB0aGUgc3RhdHMKLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX2ZyYW1lcyArPSBwcm9qZWN0ZWRfbm9mOwotCi0gIGlmIChwcm9qZWN0ZWRfbm9mID4gTUFYX1BDTV9GUkFNRV9OVU1fUEVSX1RJQ0spIHsKLSAgICBMT0dfV0FSTigiJXM6IGxpbWl0aW5nIGZyYW1lcyB0byBiZSBzZW50IGZyb20gJWQgdG8gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICBwcm9qZWN0ZWRfbm9mLCBNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDSyk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIHN0YXRzCi0gICAgc2l6ZV90IGRlbHRhID0gcHJvamVjdGVkX25vZiAtIE1BWF9QQ01fRlJBTUVfTlVNX1BFUl9USUNLOwotICAgIGEyZHBfc2JjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX2ZyYW1lcyArPSBkZWx0YTsKLQotICAgIHByb2plY3RlZF9ub2YgPSBNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDSzsKLSAgfQotCi0gIExPR19WRVJCT1NFKCIlczogZnJhbWVzIGZvciBhdmFpbGFibGUgUENNIGRhdGEgJXUiLCBfX2Z1bmNfXywgcHJvamVjdGVkX25vZik7Ci0KLSAgaWYgKGEyZHBfc2JjX2VuY29kZXJfY2IucGVlcl9wYXJhbXMuaXNfcGVlcl9lZHIpIHsKLSAgICBpZiAoIWEyZHBfc2JjX2VuY29kZXJfY2IudHhfc2JjX2ZyYW1lcykgewotICAgICAgTE9HX0VSUk9SKCIlczogdHhfc2JjX2ZyYW1lcyBub3QgdXBkYXRlZCwgdXBkYXRlIGZyb20gaGVyZSIsIF9fZnVuY19fKTsKLSAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IudHhfc2JjX2ZyYW1lcyA9IGNhbGN1bGF0ZV9tYXhfZnJhbWVzX3Blcl9wYWNrZXQoKTsKLSAgICB9Ci0KLSAgICBub2YgPSBhMmRwX3NiY19lbmNvZGVyX2NiLnR4X3NiY19mcmFtZXM7Ci0gICAgaWYgKCFub2YpIHsKLSAgICAgIExPR19FUlJPUigiJXM6IG51bWJlciBvZiBmcmFtZXMgbm90IHVwZGF0ZWQsIHNldCBjYWxjdWxhdGVkIHZhbHVlcyIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgbm9mID0gcHJvamVjdGVkX25vZjsKLSAgICAgIG5vaSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChub2YgPCBwcm9qZWN0ZWRfbm9mKSB7Ci0gICAgICAgIG5vaSA9IHByb2plY3RlZF9ub2YgLyBub2Y7ICAvLyBudW1iZXIgb2YgaXRlcmF0aW9ucyB3b3VsZCB2YXJ5Ci0gICAgICAgIGlmIChub2kgPiBBMkRQX1NCQ19NQVhfUENNX0lURVJfTlVNX1BFUl9USUNLKSB7Ci0gICAgICAgICAgTE9HX0VSUk9SKCIlczogQXVkaW8gQ29uZ2VzdGlvbiAoaXRlcmF0aW9uczolZCA+IG1heCAoJWQpKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBub2ksIEEyRFBfU0JDX01BWF9QQ01fSVRFUl9OVU1fUEVSX1RJQ0spOwotICAgICAgICAgIG5vaSA9IEEyRFBfU0JDX01BWF9QQ01fSVRFUl9OVU1fUEVSX1RJQ0s7Ci0gICAgICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmNvdW50ZXIgPQotICAgICAgICAgICAgICBub2kgKiBub2YgKiAoZmxvYXQpcGNtX2J5dGVzX3Blcl9mcmFtZTsKLSAgICAgICAgfQotICAgICAgICBwcm9qZWN0ZWRfbm9mID0gbm9mOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbm9pID0gMTsgIC8vIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIDEKLSAgICAgICAgTE9HX1ZFUkJPU0UoIiVzOiByZWR1Y2luZyBmcmFtZXMgZm9yIGF2YWlsYWJsZSBQQ00gZGF0YSIsIF9fZnVuY19fKTsKLSAgICAgICAgbm9mID0gcHJvamVjdGVkX25vZjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gRm9yIEJSIGNhc2VzIG5vZiB3aWxsIGJlIHNhbWUgYXMgdGhlIHZhbHVlIHJldHJpZXZlZCBhdCBwcm9qZWN0ZWRfbm9mCi0gICAgTE9HX1ZFUkJPU0UoIiVzOiBoZWFkc2V0IEJSLCBudW1iZXIgb2YgZnJhbWVzICV1IiwgX19mdW5jX18sIG5vZik7Ci0gICAgaWYgKHByb2plY3RlZF9ub2YgPiBNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDSykgewotICAgICAgTE9HX0VSUk9SKCIlczogQXVkaW8gQ29uZ2VzdGlvbiAoZnJhbWVzOiAlZCA+IG1heCAoJWQpKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIHByb2plY3RlZF9ub2YsIE1BWF9QQ01fRlJBTUVfTlVNX1BFUl9USUNLKTsKLQotICAgICAgLy8gVXBkYXRlIHRoZSBzdGF0cwotICAgICAgc2l6ZV90IGRlbHRhID0gcHJvamVjdGVkX25vZiAtIE1BWF9QQ01fRlJBTUVfTlVNX1BFUl9USUNLOwotICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfZnJhbWVzICs9IGRlbHRhOwotCi0gICAgICBwcm9qZWN0ZWRfbm9mID0gTUFYX1BDTV9GUkFNRV9OVU1fUEVSX1RJQ0s7Ci0gICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuY291bnRlciA9Ci0gICAgICAgICAgKGZsb2F0KW5vaSAqIChmbG9hdClwcm9qZWN0ZWRfbm9mICogKGZsb2F0KXBjbV9ieXRlc19wZXJfZnJhbWU7Ci0gICAgfQotICAgIG5vZiA9IHByb2plY3RlZF9ub2Y7Ci0gIH0KLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmNvdW50ZXIgLT0KLSAgICAgIG5vaSAqIG5vZiAqIChmbG9hdClwY21fYnl0ZXNfcGVyX2ZyYW1lOwotICBMT0dfVkVSQk9TRSgiJXM6IGVmZmVjdGl2ZSBudW0gb2YgZnJhbWVzICV1LCBpdGVyYXRpb25zICV1IiwgX19mdW5jX18sIG5vZiwKLSAgICAgICAgICAgICAgbm9pKTsKLQotICAqbnVtX29mX2ZyYW1lcyA9IG5vZjsKLSAgKm51bV9vZl9pdGVyYXRpb25zID0gbm9pOwotfQotCi1zdGF0aWMgdm9pZCBhMmRwX3NiY19lbmNvZGVfZnJhbWVzKHVpbnQ4X3QgbmJfZnJhbWUpIHsKLSAgU0JDX0VOQ19QQVJBTVMqIHBfZW5jb2Rlcl9wYXJhbXMgPSAmYTJkcF9zYmNfZW5jb2Rlcl9jYi5zYmNfZW5jb2Rlcl9wYXJhbXM7Ci0gIHVpbnQ4X3QgcmVtYWluX25iX2ZyYW1lID0gbmJfZnJhbWU7Ci0gIHVpbnQxNl90IGJsb2NtX3hfc3ViYmFuZCA9Ci0gICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3M7Ci0KLSAgdWludDhfdCBsYXN0X2ZyYW1lX2xlbiA9IDA7Ci0KLSAgd2hpbGUgKG5iX2ZyYW1lKSB7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQTJEUF9TQkNfQlVGRkVSX1NJWkUpOwotICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOwotCi0gICAgcF9idWYtPm9mZnNldCA9IEEyRFBfU0JDX09GRlNFVDsKLSAgICBwX2J1Zi0+bGVuID0gMDsKLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotICAgIGEyZHBfc2JjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9wYWNrZXRzKys7Ci0KLSAgICBkbyB7Ci0gICAgICAvKiBGaWxsIGFsbG9jYXRlZCBidWZmZXIgd2l0aCAwICovCi0gICAgICBtZW1zZXQoYTJkcF9zYmNfZW5jb2Rlcl9jYi5wY21CdWZmZXIsIDAsCi0gICAgICAgICAgICAgYmxvY21feF9zdWJiYW5kICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZDaGFubmVscyk7Ci0gICAgICAvLwotICAgICAgLy8gUmVhZCB0aGUgUENNIGRhdGEgYW5kIGVuY29kZSBpdC4gSWYgbmVjZXNzYXJ5LCB1cHNhbXBsZSB0aGUgZGF0YS4KLSAgICAgIC8vCi0gICAgICB1aW50MzJfdCBudW1fYnl0ZXMgPSAwOwotICAgICAgaWYgKGEyZHBfc2JjX3JlYWRfZmVlZGluZygmbnVtX2J5dGVzKSkgewotICAgICAgICB1aW50OF90KiBvdXRwdXQgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0ICsgcF9idWYtPmxlbjsKLSAgICAgICAgaW50MTZfdCogaW5wdXQgPSBhMmRwX3NiY19lbmNvZGVyX2NiLnBjbUJ1ZmZlcjsKLSAgICAgICAgdWludDE2X3Qgb3V0cHV0X2xlbiA9IFNCQ19FbmNvZGUocF9lbmNvZGVyX3BhcmFtcywgaW5wdXQsIG91dHB1dCk7Ci0gICAgICAgIGxhc3RfZnJhbWVfbGVuID0gb3V0cHV0X2xlbjsKLQotICAgICAgICAvKiBVcGRhdGUgU0JDIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICBwX2J1Zi0+bGVuICs9IG91dHB1dF9sZW47Ci0gICAgICAgIG5iX2ZyYW1lLS07Ci0gICAgICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYysrOwotCi0gICAgICAgIGJ5dGVzX3JlYWQgKz0gbnVtX2J5dGVzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX1dBUk4oIiVzOiB1bmRlcmZsb3cgJWQsICVkIiwgX19mdW5jX18sIG5iX2ZyYW1lLAotICAgICAgICAgICAgICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuYWFfZmVlZF9yZXNpZHVlKTsKLSAgICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmNvdW50ZXIgKz0KLSAgICAgICAgICAgIG5iX2ZyYW1lICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyAqCi0gICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkJsb2NrcyAqCi0gICAgICAgICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLmNoYW5uZWxfY291bnQgKgotICAgICAgICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUgLyA4OwotICAgICAgICAvKiBubyBtb3JlIHBjbSB0byByZWFkICovCi0gICAgICAgIG5iX2ZyYW1lID0gMDsKLSAgICAgIH0KLSAgICB9IHdoaWxlICgKLSAgICAgICAgKChwX2J1Zi0+bGVuICsgbGFzdF9mcmFtZV9sZW4pIDwgYTJkcF9zYmNfZW5jb2Rlcl9jYi5UeEFhTXR1U2l6ZSkgJiYKLSAgICAgICAgKHBfYnVmLT5sYXllcl9zcGVjaWZpYyA8IDB4MEYpICYmIG5iX2ZyYW1lKTsKLQotICAgIGlmIChwX2J1Zi0+bGVuKSB7Ci0gICAgICAvKgotICAgICAgICogVGltZXN0YW1wIG9mIHRoZSBtZWRpYSBwYWNrZXQgaGVhZGVyIHJlcHJlc2VudCB0aGUgVFMgb2YgdGhlCi0gICAgICAgKiBmaXJzdCBTQkMgZnJhbWUsIGkuZSB0aGUgdGltZXN0YW1wIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmcmFtZS4KLSAgICAgICAqLwotICAgICAgKigodWludDMyX3QqKShwX2J1ZiArIDEpKSA9IGEyZHBfc2JjX2VuY29kZXJfY2IudGltZXN0YW1wOwotCi0gICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLnRpbWVzdGFtcCArPSBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgKiBibG9jbV94X3N1YmJhbmQ7Ci0KLSAgICAgIHVpbnQ4X3QgZG9uZV9uYl9mcmFtZSA9IHJlbWFpbl9uYl9mcmFtZSAtIG5iX2ZyYW1lOwotICAgICAgcmVtYWluX25iX2ZyYW1lID0gbmJfZnJhbWU7Ci0gICAgICBpZiAoIWEyZHBfc2JjX2VuY29kZXJfY2IuZW5xdWV1ZV9jYWxsYmFjayhwX2J1ZiwgZG9uZV9uYl9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQpKQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHMrKzsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgYTJkcF9zYmNfcmVhZF9mZWVkaW5nKHVpbnQzMl90KiBieXRlc19yZWFkKSB7Ci0gIFNCQ19FTkNfUEFSQU1TKiBwX2VuY29kZXJfcGFyYW1zID0gJmEyZHBfc2JjX2VuY29kZXJfY2Iuc2JjX2VuY29kZXJfcGFyYW1zOwotICB1aW50MTZfdCBibG9jbV94X3N1YmJhbmQgPQotICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyAqIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzOwotICB1aW50MzJfdCByZWFkX3NpemU7Ci0gIHVpbnQzMl90IHNiY19zYW1wbGluZyA9IDQ4MDAwOwotICB1aW50MzJfdCBzcmNfc2FtcGxlczsKLSAgdWludDE2X3QgYnl0ZXNfbmVlZGVkID0gYmxvY21feF9zdWJiYW5kICogcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZDaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuYml0c19wZXJfc2FtcGxlIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgODsKLSAgc3RhdGljIHVpbnQxNl90IHVwX3NhbXBsZWRfYnVmZmVyW1NCQ19NQVhfTlVNX0ZSQU1FICogU0JDX01BWF9OVU1fT0ZfQkxPQ0tTICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCQ19NQVhfTlVNX09GX0NIQU5ORUxTICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCQ19NQVhfTlVNX09GX1NVQkJBTkRTICogMl07Ci0gIHN0YXRpYyB1aW50MTZfdCByZWFkX2J1ZmZlcltTQkNfTUFYX05VTV9GUkFNRSAqIFNCQ19NQVhfTlVNX09GX0JMT0NLUyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQkNfTUFYX05VTV9PRl9DSEFOTkVMUyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQkNfTUFYX05VTV9PRl9TVUJCQU5EU107Ci0gIHVpbnQzMl90IHNyY19zaXplX3VzZWQ7Ci0gIHVpbnQzMl90IGRzdF9zaXplX3VzZWQ7Ci0gIGJvb2wgZnJhY3RfbmVlZGVkOwotICBpbnQzMl90IGZyYWN0X21heDsKLSAgaW50MzJfdCBmcmFjdF90aHJlc2hvbGQ7Ci0gIHVpbnQzMl90IG5iX2J5dGVfcmVhZDsKLQotICAvKiBHZXQgdGhlIFNCQyBzYW1wbGluZyByYXRlICovCi0gIHN3aXRjaCAocF9lbmNvZGVyX3BhcmFtcy0+czE2U2FtcGxpbmdGcmVxKSB7Ci0gICAgY2FzZSBTQkNfc2Y0ODAwMDoKLSAgICAgIHNiY19zYW1wbGluZyA9IDQ4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkNfc2Y0NDEwMDoKLSAgICAgIHNiY19zYW1wbGluZyA9IDQ0MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkNfc2YzMjAwMDoKLSAgICAgIHNiY19zYW1wbGluZyA9IDMyMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkNfc2YxNjAwMDoKLSAgICAgIHNiY19zYW1wbGluZyA9IDE2MDAwOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBhMmRwX3NiY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQrKzsKLSAgaWYgKHNiY19zYW1wbGluZyA9PSBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLnNhbXBsZV9yYXRlKSB7Ci0gICAgcmVhZF9zaXplID0KLSAgICAgICAgYnl0ZXNfbmVlZGVkIC0gYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZTsKLSAgICBhMmRwX3NiY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZF9ieXRlcyArPSByZWFkX3NpemU7Ci0gICAgbmJfYnl0ZV9yZWFkID0gYTJkcF9zYmNfZW5jb2Rlcl9jYi5yZWFkX2NhbGxiYWNrKAotICAgICAgICAoKHVpbnQ4X3QqKWEyZHBfc2JjX2VuY29kZXJfY2IucGNtQnVmZmVyKSArCi0gICAgICAgICAgICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuYWFfZmVlZF9yZXNpZHVlLAotICAgICAgICByZWFkX3NpemUpOwotICAgIGEyZHBfc2JjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZF9ieXRlcyArPQotICAgICAgICBuYl9ieXRlX3JlYWQ7Ci0KLSAgICAqYnl0ZXNfcmVhZCA9IG5iX2J5dGVfcmVhZDsKLSAgICBpZiAobmJfYnl0ZV9yZWFkICE9IHJlYWRfc2l6ZSkgewotICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZSArPSBuYl9ieXRlX3JlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGEyZHBfc2JjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZHNfY291bnQrKzsKLSAgICBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuYWFfZmVlZF9yZXNpZHVlID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIFNvbWUgRmVlZGluZyBQQ00gZnJlcXVlbmNpZXMgcmVxdWlyZSB0byBzcGxpdCB0aGUgbnVtYmVyIG9mIHNhbXBsZQotICAgKiB0byByZWFkLgotICAgKiBFLmcgMTI4IC8gNiA9IDIxLjMzMzMgPT4gcmVhZCAyMiBhbmQgMjEgYW5kIDIxID0+IG1heCA9IDI7IHRocmVzaG9sZCA9IDAKLSAgICovCi0gIGZyYWN0X25lZWRlZCA9IGZhbHNlOyAvKiBEZWZhdWx0ICovCi0gIHN3aXRjaCAoYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgMzIwMDA6Ci0gICAgY2FzZSA4MDAwOgotICAgICAgZnJhY3RfbmVlZGVkID0gdHJ1ZTsKLSAgICAgIGZyYWN0X21heCA9IDI7ICAgICAgIC8qIDAsIDEgYW5kIDIgKi8KLSAgICAgIGZyYWN0X3RocmVzaG9sZCA9IDA7IC8qIEFkZCBvbmUgZm9yIHRoZSBmaXJzdCAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgIGZyYWN0X25lZWRlZCA9IHRydWU7Ci0gICAgICBmcmFjdF9tYXggPSAyOyAgICAgICAvKiAwLCAxIGFuZCAyICovCi0gICAgICBmcmFjdF90aHJlc2hvbGQgPSAxOyAvKiBBZGQgb25lIGZvciB0aGUgZmlyc3QgdHdvIGZyYW1lcyovCi0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIENvbXB1dGUgbnVtYmVyIG9mIHNhbXBsZSB0byByZWFkIGZyb20gc291cmNlICovCi0gIHNyY19zYW1wbGVzID0gYmxvY21feF9zdWJiYW5kOwotICBzcmNfc2FtcGxlcyAqPSBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLnNhbXBsZV9yYXRlOwotICBzcmNfc2FtcGxlcyAvPSBzYmNfc2FtcGxpbmc7Ci0KLSAgLyogVGhlIHByZXZpb3VzIGRpdmlzaW9uIG1heSBoYXZlIGEgcmVtYWluZGVyIG5vdCBudWxsICovCi0gIGlmIChmcmFjdF9uZWVkZWQpIHsKLSAgICBpZiAoYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfY291bnRlciA8PSBmcmFjdF90aHJlc2hvbGQpIHsKLSAgICAgIHNyY19zYW1wbGVzKys7IC8qIGZvciBldmVyeSByZWFkIGJlZm9yZSB0aHJlc2hvbGQgYWRkIG9uZSBzYW1wbGUgKi8KLSAgICB9Ci0KLSAgICAvKiBkbyBub3RoaW5nIGlmIGNvdW50ZXIgPj0gdGhyZXNob2xkICovCi0gICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfY291bnRlcisrOyAvKiBvbmUgbW9yZSByZWFkICovCi0gICAgaWYgKGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5hYV9mZWVkX2NvdW50ZXIgPiBmcmFjdF9tYXgpIHsKLSAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5hYV9mZWVkX2NvdW50ZXIgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBzb3VyY2UgKi8KLSAgcmVhZF9zaXplID0gc3JjX3NhbXBsZXM7Ci0gIHJlYWRfc2l6ZSAqPSBhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLmNoYW5uZWxfY291bnQ7Ci0gIHJlYWRfc2l6ZSAqPSAoYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUgLyA4KTsKLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRfYnl0ZXMgKz0gcmVhZF9zaXplOwotCi0gIC8qIFJlYWQgRGF0YSBmcm9tIFVJUEMgY2hhbm5lbCAqLwotICBuYl9ieXRlX3JlYWQgPQotICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5yZWFkX2NhbGxiYWNrKCh1aW50OF90KilyZWFkX2J1ZmZlciwgcmVhZF9zaXplKTsKLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzICs9IG5iX2J5dGVfcmVhZDsKLQotICBpZiAobmJfYnl0ZV9yZWFkIDwgcmVhZF9zaXplKSB7Ci0gICAgaWYgKG5iX2J5dGVfcmVhZCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBGaWxsIHRoZSB1bmZpbGxlZCBwYXJ0IG9mIHRoZSByZWFkIGJ1ZmZlciB3aXRoIHNpbGVuY2UgKDApICovCi0gICAgbWVtc2V0KCgodWludDhfdCopcmVhZF9idWZmZXIpICsgbmJfYnl0ZV9yZWFkLCAwLCByZWFkX3NpemUgLSBuYl9ieXRlX3JlYWQpOwotICAgIG5iX2J5dGVfcmVhZCA9IHJlYWRfc2l6ZTsKLSAgfQotICBhMmRwX3NiY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRzX2NvdW50Kys7Ci0KLSAgLyogSW5pdGlhbGl6ZSBQQ00gdXAtc2FtcGxpbmcgZW5naW5lICovCi0gIGEyZHBfc2JjX2luaXRfdXBfc2FtcGxlKGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNiY19zYW1wbGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuY2hhbm5lbF9jb3VudCk7Ci0KLSAgLyoKLSAgICogUmUtc2FtcGxlIHRoZSByZWFkIGJ1ZmZlci4KLSAgICogVGhlIG91dHB1dCBQQ00gYnVmZmVyIHdpbGwgYmUgc3RlcmVvLCAxNiBiaXQgcGVyIHNhbXBsZS4KLSAgICovCi0gIGRzdF9zaXplX3VzZWQgPSBhMmRwX3NiY191cF9zYW1wbGUoCi0gICAgICAodWludDhfdCopcmVhZF9idWZmZXIsCi0gICAgICAodWludDhfdCopdXBfc2FtcGxlZF9idWZmZXIgKwotICAgICAgICAgIGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5hYV9mZWVkX3Jlc2lkdWUsCi0gICAgICBuYl9ieXRlX3JlYWQsIHNpemVvZih1cF9zYW1wbGVkX2J1ZmZlcikgLQotICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZSwKLSAgICAgICZzcmNfc2l6ZV91c2VkKTsKLQotICAvKiB1cGRhdGUgdGhlIHJlc2lkdWUgKi8KLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZSArPSBkc3Rfc2l6ZV91c2VkOwotCi0gIC8qIG9ubHkgY29weSB0aGUgcGNtIHNhbXBsZSB3aGVuIHdlIGhhdmUgdXAtc2FtcGxlZCBlbm91Z2ggUENNICovCi0gIGlmIChhMmRwX3NiY19lbmNvZGVyX2NiLmZlZWRpbmdfc3RhdGUuYWFfZmVlZF9yZXNpZHVlIDwgYnl0ZXNfbmVlZGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDb3B5IHRoZSBvdXRwdXQgcGNtIHNhbXBsZXMgaW4gU0JDIGVuY29kaW5nIGJ1ZmZlciAqLwotICBtZW1jcHkoKHVpbnQ4X3QqKWEyZHBfc2JjX2VuY29kZXJfY2IucGNtQnVmZmVyLCAodWludDhfdCopdXBfc2FtcGxlZF9idWZmZXIsCi0gICAgICAgICBieXRlc19uZWVkZWQpOwotICAvKiB1cGRhdGUgdGhlIHJlc2lkdWUgKi8KLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZSAtPSBieXRlc19uZWVkZWQ7Ci0KLSAgaWYgKGEyZHBfc2JjX2VuY29kZXJfY2IuZmVlZGluZ19zdGF0ZS5hYV9mZWVkX3Jlc2lkdWUgIT0gMCkgewotICAgIG1lbWNweSgodWludDhfdCopdXBfc2FtcGxlZF9idWZmZXIsCi0gICAgICAgICAgICh1aW50OF90Kil1cF9zYW1wbGVkX2J1ZmZlciArIGJ5dGVzX25lZWRlZCwKLSAgICAgICAgICAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5mZWVkaW5nX3N0YXRlLmFhX2ZlZWRfcmVzaWR1ZSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBhZGp1c3RfZWZmZWN0aXZlX210dSgKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMmIHBlZXJfcGFyYW1zKSB7Ci0gIHVpbnQxNl90IG10dV9zaXplID0gQTJEUF9TQkNfQlVGRkVSX1NJWkUgLSBBMkRQX1NCQ19PRkZTRVQgLSBzaXplb2YoQlRfSERSKTsKLSAgaWYgKG10dV9zaXplID4gcGVlcl9wYXJhbXMucGVlcl9tdHUpIHsKLSAgICBtdHVfc2l6ZSA9IHBlZXJfcGFyYW1zLnBlZXJfbXR1OwotICB9Ci0gIExPR19WRVJCT1NFKCIlczogb3JpZ2luYWwgQVZEVFAgTVRVIHNpemU6ICVkIiwgX19mdW5jX18sIG10dV9zaXplKTsKLSAgaWYgKHBlZXJfcGFyYW1zLmlzX3BlZXJfZWRyICYmICFwZWVyX3BhcmFtcy5wZWVyX3N1cHBvcnRzXzNtYnBzKSB7Ci0gICAgLy8gVGhpcyBjb25kaXRpb24gd291bGQgYmUgc2F0aXNmaWVkIG9ubHkgaWYgdGhlIHJlbW90ZSBkZXZpY2UgaXMKLSAgICAvLyBFRFIgYW5kIHN1cHBvcnRzIG9ubHkgMiBNYnBzLCBidXQgdGhlIGVmZmVjdGl2ZSBBVkRUUCBNVFUgc2l6ZQotICAgIC8vIGV4Y2VlZHMgdGhlIDJESDUgcGFja2V0IHNpemUuCi0gICAgTE9HX1ZFUkJPU0UoIiVzOiBUaGUgcmVtb3RlIGRldmljZSBpcyBFRFIgYnV0IGRvZXMgbm90IHN1cHBvcnQgMyBNYnBzIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgaWYgKG10dV9zaXplID4gTUFYXzJNQlBTX0FWRFRQX01UVSkgewotICAgICAgTE9HX1dBUk4oIiVzOiBSZXN0cmljdGluZyBBVkRUUCBNVFUgc2l6ZSBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICBtdHVfc2l6ZSwgTUFYXzJNQlBTX0FWRFRQX01UVSk7Ci0gICAgICBtdHVfc2l6ZSA9IE1BWF8yTUJQU19BVkRUUF9NVFU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBtdHVfc2l6ZTsKLX0KLQotc3RhdGljIHVpbnQ4X3QgY2FsY3VsYXRlX21heF9mcmFtZXNfcGVyX3BhY2tldCh2b2lkKSB7Ci0gIFNCQ19FTkNfUEFSQU1TKiBwX2VuY29kZXJfcGFyYW1zID0gJmEyZHBfc2JjX2VuY29kZXJfY2Iuc2JjX2VuY29kZXJfcGFyYW1zOwotICB1aW50MTZfdCByZXN1bHQgPSAwOwotICB1aW50MzJfdCBmcmFtZV9sZW47Ci0KLSAgYTJkcF9zYmNfZW5jb2Rlcl9jYi5UeEFhTXR1U2l6ZSA9Ci0gICAgICBhZGp1c3RfZWZmZWN0aXZlX210dShhMmRwX3NiY19lbmNvZGVyX2NiLnBlZXJfcGFyYW1zKTsKLSAgY29uc3QgdWludDE2X3QmIGVmZmVjdGl2ZV9tdHVfc2l6ZSA9IGEyZHBfc2JjX2VuY29kZXJfY2IuVHhBYU10dVNpemU7Ci0KLSAgaWYgKCFwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogU3ViQmFuZHMgYXJlIHNldCB0byAwLCByZXNldHRpbmcgdG8gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgU0JDX01BWF9OVU1fT0ZfU1VCQkFORFMpOwotICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mU3ViQmFuZHMgPSBTQkNfTUFYX05VTV9PRl9TVUJCQU5EUzsKLSAgfQotICBpZiAoIXBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogQmxvY2tzIGFyZSBzZXQgdG8gMCwgcmVzZXR0aW5nIHRvICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIFNCQ19NQVhfTlVNX09GX0JMT0NLUyk7Ci0gICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MgPSBTQkNfTUFYX05VTV9PRl9CTE9DS1M7Ci0gIH0KLSAgaWYgKCFwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogQ2hhbm5lbHMgYXJlIHNldCB0byAwLCByZXNldHRpbmcgdG8gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgU0JDX01BWF9OVU1fT0ZfQ0hBTk5FTFMpOwotICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMgPSBTQkNfTUFYX05VTV9PRl9DSEFOTkVMUzsKLSAgfQotCi0gIGZyYW1lX2xlbiA9IGEyZHBfc2JjX2ZyYW1lX2xlbmd0aCgpOwotCi0gIExPR19WRVJCT1NFKCIlczogRWZmZWN0aXZlIFR4IE1UVSB0byBiZSBjb25zaWRlcmVkOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBlZmZlY3RpdmVfbXR1X3NpemUpOwotCi0gIHN3aXRjaCAocF9lbmNvZGVyX3BhcmFtcy0+czE2U2FtcGxpbmdGcmVxKSB7Ci0gICAgY2FzZSBTQkNfc2Y0NDEwMDoKLSAgICAgIGlmIChmcmFtZV9sZW4gPT0gMCkgewotICAgICAgICBMT0dfRVJST1IoIiVzOiBDYWxjdWxhdGluZyBmcmFtZSBsZW5ndGgsIHJlc2V0dGluZyBpdCB0byBkZWZhdWx0ICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBMkRQX1NCQ19NQVhfSFFfRlJBTUVfU0laRV80NF8xKTsKLSAgICAgICAgZnJhbWVfbGVuID0gQTJEUF9TQkNfTUFYX0hRX0ZSQU1FX1NJWkVfNDRfMTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCA9IChlZmZlY3RpdmVfbXR1X3NpemUgLSBBMkRQX0hEUl9TSVpFKSAvIGZyYW1lX2xlbjsKLSAgICAgIExPR19WRVJCT1NFKCIlczogTWF4IG51bWJlciBvZiBTQkMgZnJhbWVzOiAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNCQ19zZjQ4MDAwOgotICAgICAgaWYgKGZyYW1lX2xlbiA9PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigiJXM6IENhbGN1bGF0aW5nIGZyYW1lIGxlbmd0aCwgcmVzZXR0aW5nIGl0IHRvIGRlZmF1bHQgJWQiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIEEyRFBfU0JDX01BWF9IUV9GUkFNRV9TSVpFXzQ4KTsKLSAgICAgICAgZnJhbWVfbGVuID0gQTJEUF9TQkNfTUFYX0hRX0ZSQU1FX1NJWkVfNDg7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSAoZWZmZWN0aXZlX210dV9zaXplIC0gQTJEUF9IRFJfU0laRSkgLyBmcmFtZV9sZW47Ci0gICAgICBMT0dfVkVSQk9TRSgiJXM6IE1heCBudW1iZXIgb2YgU0JDIGZyYW1lczogJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiJXM6IE1heCBudW1iZXIgb2YgU0JDIGZyYW1lczogJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBhMmRwX3NiY19zb3VyY2VfcmF0ZShib29sIGlzX3BlZXJfZWRyKSB7Ci0gIHVpbnQxNl90IHJhdGUgPSBBMkRQX1NCQ19ERUZBVUxUX0JJVFJBVEU7Ci0KLSAgLyogcmVzdHJpY3QgYml0cmF0ZSBpZiBhMmRwIGxpbmsgaXMgbm9uLWVkciAqLwotICBpZiAoIWlzX3BlZXJfZWRyKSB7Ci0gICAgcmF0ZSA9IEEyRFBfU0JDX05PTl9FRFJfTUFYX1JBVEU7Ci0gICAgTE9HX1ZFUkJPU0UoIiVzOiBub24tZWRyIGEyZHAgc2luayBkZXRlY3RlZCwgcmVzdHJpY3QgcmF0ZSB0byAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIHJhdGUpOwotICB9Ci0KLSAgcmV0dXJuIHJhdGU7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBhMmRwX3NiY19mcmFtZV9sZW5ndGgodm9pZCkgewotICBTQkNfRU5DX1BBUkFNUyogcF9lbmNvZGVyX3BhcmFtcyA9ICZhMmRwX3NiY19lbmNvZGVyX2NiLnNiY19lbmNvZGVyX3BhcmFtczsKLSAgdWludDMyX3QgZnJhbWVfbGVuID0gMDsKLQotICBMT0dfVkVSQk9TRSgKLSAgICAgICIlczogY2hhbm5lbCBtb2RlOiAlZCwgc3ViLWJhbmQ6ICVkLCBudW1iZXIgb2YgYmxvY2s6ICVkLCAiCi0gICAgICAiYml0cG9vbDogJWQsIHNhbXBsaW5nIGZyZXF1ZW5jeTogJWQsIG51bSBjaGFubmVsczogJWQiLAotICAgICAgX19mdW5jX18sIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkNoYW5uZWxNb2RlLAotICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcywgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MsCi0gICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZCaXRQb29sLCBwX2VuY29kZXJfcGFyYW1zLT5zMTZTYW1wbGluZ0ZyZXEsCi0gICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKTsKLQotICBzd2l0Y2ggKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkNoYW5uZWxNb2RlKSB7Ci0gICAgY2FzZSBTQkNfTU9OTzoKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgU0JDX0RVQUw6Ci0gICAgICBmcmFtZV9sZW4gPSBBMkRQX1NCQ19GUkFNRV9IRUFERVJfU0laRV9CWVRFUyArCi0gICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShBMkRQX1NCQ19TQ0FMRV9GQUNUT1JfQklUUyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMpIC8KLSAgICAgICAgICAgICAgICAgICBDSEFSX0JJVCkgKwotICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkocF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZDaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZCaXRQb29sKSAvCi0gICAgICAgICAgICAgICAgICAgQ0hBUl9CSVQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkNfU1RFUkVPOgotICAgICAgZnJhbWVfbGVuID0gQTJEUF9TQkNfRlJBTUVfSEVBREVSX1NJWkVfQllURVMgKwotICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoQTJEUF9TQkNfU0NBTEVfRkFDVE9SX0JJVFMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZkNoYW5uZWxzKSAvCi0gICAgICAgICAgICAgICAgICAgQ0hBUl9CSVQpICsKLSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQmxvY2tzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkJpdFBvb2wpIC8KLSAgICAgICAgICAgICAgICAgICBDSEFSX0JJVCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNCQ19KT0lOVF9TVEVSRU86Ci0gICAgICBmcmFtZV9sZW4gPSBBMkRQX1NCQ19GUkFNRV9IRUFERVJfU0laRV9CWVRFUyArCi0gICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShBMkRQX1NCQ19TQ0FMRV9GQUNUT1JfQklUUyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2VuY29kZXJfcGFyYW1zLT5zMTZOdW1PZlN1YkJhbmRzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNk51bU9mQ2hhbm5lbHMpIC8KLSAgICAgICAgICAgICAgICAgICBDSEFSX0JJVCkgKwotICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkocF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZTdWJCYW5kcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9lbmNvZGVyX3BhcmFtcy0+czE2TnVtT2ZCbG9ja3MgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkJpdFBvb2wpKSAvCi0gICAgICAgICAgICAgICAgICAgQ0hBUl9CSVQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19WRVJCT1NFKCIlczogSW52YWxpZCBjaGFubmVsIG51bWJlcjogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnMxNkNoYW5uZWxNb2RlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIExPR19WRVJCT1NFKCIlczogY2FsY3VsYXRlZCBmcmFtZSBsZW5ndGg6ICVkIiwgX19mdW5jX18sIGZyYW1lX2xlbik7Ci0gIHJldHVybiBmcmFtZV9sZW47Ci19Ci0KLXVpbnQzMl90IGEyZHBfc2JjX2dldF9iaXRyYXRlKCkgewotICBTQkNfRU5DX1BBUkFNUyogcF9lbmNvZGVyX3BhcmFtcyA9ICZhMmRwX3NiY19lbmNvZGVyX2NiLnNiY19lbmNvZGVyX3BhcmFtczsKLSAgTE9HX0lORk8oIiVzOiBiaXQgcmF0ZSAlZCAiLCBfX2Z1bmNfXywgcF9lbmNvZGVyX3BhcmFtcy0+dTE2Qml0UmF0ZSk7Ci0gIHJldHVybiBwX2VuY29kZXJfcGFyYW1zLT51MTZCaXRSYXRlICogMTAwMDsKLX0KLQotdm9pZCBBMmRwQ29kZWNDb25maWdTYmNTb3VyY2U6OmRlYnVnX2NvZGVjX2R1bXAoaW50IGZkKSB7Ci0gIGEyZHBfc2JjX2VuY29kZXJfc3RhdHNfdCogc3RhdHMgPSAmYTJkcF9zYmNfZW5jb2Rlcl9jYi5zdGF0czsKLQotICBBMmRwQ29kZWNDb25maWc6OmRlYnVnX2NvZGVjX2R1bXAoZmQpOwotCi0gIHVpbnQ4X3QgY29kZWNfaW5mb1tBVkRUX0NPREVDX1NJWkVdOwotICBpZiAoY29weU91dE90YUNvZGVjQ29uZmlnKGNvZGVjX2luZm8pKSB7Ci0gICAgZHByaW50ZihmZCwKLSAgICAgICAgICAgICIgIFNCQyBCbG9jayBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAlZFxuIiwKLSAgICAgICAgICAgIEEyRFBfR2V0TnVtYmVyT2ZCbG9ja3NTYmMoY29kZWNfaW5mbykpOwotICAgIGRwcmludGYoZmQsCi0gICAgICAgICAgICAiICBTQkMgTnVtYmVyIG9mIHN1YmJhbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWRcbiIsCi0gICAgICAgICAgICBBMkRQX0dldE51bWJlck9mU3ViYmFuZHNTYmMoY29kZWNfaW5mbykpOwotICAgIGRwcmludGYoZmQsCi0gICAgICAgICAgICAiICBTQkMgQWxsb2NhdGlvbiBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWRcbiIsCi0gICAgICAgICAgICBBMkRQX0dldEFsbG9jYXRpb25NZXRob2RDb2RlU2JjKGNvZGVjX2luZm8pKTsKLSAgICBkcHJpbnRmKAotICAgICAgICBmZCwKLSAgICAgICAgIiAgU0JDIEJpdHBvb2wgKG1pbi9tYXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVkIC8gJWRcbiIsCi0gICAgICAgIEEyRFBfR2V0TWluQml0cG9vbFNiYyhjb2RlY19pbmZvKSwgQTJEUF9HZXRNYXhCaXRwb29sU2JjKGNvZGVjX2luZm8pKTsKLSAgfQotCi0gIGRwcmludGYoZmQsICIgIEVuY29kZXIgaW50ZXJ2YWwgKG1zKTogJSIgUFJJdTY0ICJcbiIsCi0gICAgICAgICAgYTJkcF9zYmNfZ2V0X2VuY29kZXJfaW50ZXJ2YWxfbXMoKSk7Ci0gIGRwcmludGYoZmQsICIgIEVmZmVjdGl2ZSBNVFU6ICVkXG4iLCBhMmRwX3NiY19nZXRfZWZmZWN0aXZlX2ZyYW1lX3NpemUoKSk7Ci0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgUGFja2V0IGNvdW50cyAoZXhwZWN0ZWQvZHJvcHBlZCkgICAgICAgICAgICAgICAgICAgICAgICA6ICV6dSAvICIKLSAgICAgICAgICAiJXp1XG4iLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3BhY2tldHMsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZHJvcHBlZF9wYWNrZXRzKTsKLQotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIFBDTSByZWFkIGNvdW50cyAoZXhwZWN0ZWQvYWN0dWFsKSAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dVxuIiwKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkc19jb3VudCwKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZHNfY291bnQpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgUENNIHJlYWQgYnl0ZXMgKGV4cGVjdGVkL2FjdHVhbCkgICAgICAgICAgICAgICAgICAgICAgICA6ICV6dSAvICIKLSAgICAgICAgICAiJXp1XG4iLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRfYnl0ZXMsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRfYnl0ZXMpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgRnJhbWVzIGNvdW50cyAoZXhwZWN0ZWQvZHJvcHBlZCkgICAgICAgICAgICAgICAgICAgICAgICA6ICV6dSAvICIKLSAgICAgICAgICAiJXp1XG4iLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX2ZyYW1lcywKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX2ZyYW1lcyk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfc2JjX3VwX3NhbXBsZS5jYyBiL3N0YWNrL2EyZHAvYTJkcF9zYmNfdXBfc2FtcGxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNhYzg1Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF9zYmNfdXBfc2FtcGxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDQtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBTQkMgZGF0YSBmcmFtZXMKLSAqICBhbmQgY29kZWMgY2FwYWJpbGl0aWVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJhMmRwX3NiY191cF9zYW1wbGUuaCIKLQotdHlwZWRlZiBpbnQodEEyRFBfU0JDX0FDVCkodm9pZCogcF9zcmMsIHZvaWQqIHBfZHN0LCB1aW50MzJfdCBzcmNfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdF9zYW1wbGVzLCB1aW50MzJfdCogcF9yZXQpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludDMyX3QgY3VyX3BvczsgICAgICAvKiBjdXJyZW50IHBvc2l0aW9uICovCi0gIHVpbnQzMl90IHNyY19zcHM7ICAgICAvKiBzYW1wbGVzIHBlciBzZWNvbmQgKHNvdXJjZSBhdWRpbyBkYXRhKSAqLwotICB1aW50MzJfdCBkc3Rfc3BzOyAgICAgLyogc2FtcGxlcyBwZXIgc2Vjb25kIChjb252ZXJ0ZWQgYXVkaW8gZGF0YSkgKi8KLSAgdEEyRFBfU0JDX0FDVCogcF9hY3Q7IC8qIHRoZSBhY3Rpb24gZnVuY3Rpb24gdG8gZG8gdGhlIGNvbnZlcnNpb24gKi8KLSAgdWludDhfdCBiaXRzOyAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIHBlciBwY20gc2FtcGxlICovCi0gIHVpbnQ4X3Qgbl9jaGFubmVsczsgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKGkuZS4gbW9ubygxKSwgc3RlcmVvKDIpLi4uKSAqLwotICBpbnQxNl90IHdvcmtlcjE7Ci0gIGludDE2X3Qgd29ya2VyMjsKLSAgdWludDhfdCBkaXY7Ci19IHRBMkRQX1NCQ19VUFNfQ0I7Ci0KLXRBMkRQX1NCQ19VUFNfQ0IgYTJkcF9zYmNfdXBzX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYTJkcF9zYmNfaW5pdF91cF9zYW1wbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGluaXRpYWxpemUgdGhlIHVwIHNhbXBsZQotICoKLSAqICAgICAgICAgICAgICAgICAgc3JjX3Nwczogc2FtcGxlcyBwZXIgc2Vjb25kIChzb3VyY2UgYXVkaW8gZGF0YSkKLSAqICAgICAgICAgICAgICAgICAgZHN0X3Nwczogc2FtcGxlcyBwZXIgc2Vjb25kIChjb252ZXJ0ZWQgYXVkaW8gZGF0YSkKLSAqICAgICAgICAgICAgICAgICAgYml0czogbnVtYmVyIG9mIGJpdHMgcGVyIHBjbSBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgbl9jaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzIChpLmUuIG1vbm8oMSksIHN0ZXJlbygyKS4uLikKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhMmRwX3NiY19pbml0X3VwX3NhbXBsZSh1aW50MzJfdCBzcmNfc3BzLCB1aW50MzJfdCBkc3Rfc3BzLCB1aW50OF90IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgbl9jaGFubmVscykgewotICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9IC0xOwotICBhMmRwX3NiY191cHNfY2Iuc3JjX3NwcyA9IHNyY19zcHM7Ci0gIGEyZHBfc2JjX3Vwc19jYi5kc3Rfc3BzID0gZHN0X3NwczsKLSAgYTJkcF9zYmNfdXBzX2NiLmJpdHMgPSBiaXRzOwotICBhMmRwX3NiY191cHNfY2Iubl9jaGFubmVscyA9IG5fY2hhbm5lbHM7Ci0KLSAgaWYgKG5fY2hhbm5lbHMgPT0gMSkgewotICAgIC8qIG1vbm8gKi8KLSAgICBpZiAoYml0cyA9PSA4KSB7Ci0gICAgICBhMmRwX3NiY191cHNfY2IucF9hY3QgPSBhMmRwX3NiY191cF9zYW1wbGVfOG07Ci0gICAgICBhMmRwX3NiY191cHNfY2IuZGl2ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgYTJkcF9zYmNfdXBzX2NiLnBfYWN0ID0gYTJkcF9zYmNfdXBfc2FtcGxlXzE2bTsKLSAgICAgIGEyZHBfc2JjX3Vwc19jYi5kaXYgPSAyOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBzdGVyZW8gKi8KLSAgICBpZiAoYml0cyA9PSA4KSB7Ci0gICAgICBhMmRwX3NiY191cHNfY2IucF9hY3QgPSBhMmRwX3NiY191cF9zYW1wbGVfOHM7Ci0gICAgICBhMmRwX3NiY191cHNfY2IuZGl2ID0gMjsKLSAgICB9IGVsc2UgewotICAgICAgYTJkcF9zYmNfdXBzX2NiLnBfYWN0ID0gYTJkcF9zYmNfdXBfc2FtcGxlXzE2czsKLSAgICAgIGEyZHBfc2JjX3Vwc19jYi5kaXYgPSA0OwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYTJkcF9zYmNfdXBfc2FtcGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiB0aGUgc291cmNlIChwX3NyYykgYXVkaW8gZGF0YSBhbmQKLSAqICAgICAgICAgICAgICAgICAgc291cmNlIHNwZWVkIChzcmNfc3BzLCBzYW1wbGVzIHBlciBzZWNvbmQpLAotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGl0IHRvIGF1ZGlvIGRhdGEgaW4gdGhlIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAgICAgZm9ybWF0Ci0gKgotICogICAgICAgICAgICAgICAgICBwX3NyYzogdGhlIGRhdGEgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHBfZHN0OiB0aGUgZGF0YSBidWZmZXIgdG8gaG9sZCB0aGUgY29udmVydGVkIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgc3JjX3NhbXBsZXM6IFRoZSBudW1iZXIgb2Ygc291cmNlIHNhbXBsZXMgKG51bWJlciBvZiBieXRlcykKLSAqICAgICAgICAgICAgICAgICAgZHN0X3NhbXBsZXM6IFRoZSBzaXplIG9mIHBfZHN0IChudW1iZXIgb2YgYnl0ZXMpCi0gKgotICogTm90ZTogICAgICAgICAgICBBbiBBRSByZXBvcnRlZCBhbiBpc3N1ZSB3aXRoIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gY2FsbGVkIHdpdGggYTJkcF9zYmNfdXBfc2FtcGxlKHNyYywgdWludDhfYXJyYXlfZHN0Li4pCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBieXRlIGJlZm9yZSB1aW50OF9hcnJheV9kc3QgbWF5IGdldCBvdmVyd3JpdHRlbi4KLSAqICAgICAgICAgICAgICAgICAgVXNpbmcgdWludDE2X2FycmF5X2RzdCBhdm9pZHMgdGhlIHByb2JsZW0uCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgaXNzdWUgaXMgcmVsYXRlZCB0byBlbmRpYW4tbmVzcyBhbmQgaXMgaGFyZCB0byByZXNvbHZlCi0gKiAgICAgICAgICAgICAgICAgIGluIGEgZ2VuZXJpYyBtYW5uZXIuCi0gKiAqKioqKioqKioqKioqKioqIFBsZWFzZSB1c2UgdWludDE2IGFycmF5IGFzIGRzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX2RzdAotICogICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9zcmMgKGluICpwX3JldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGEyZHBfc2JjX3VwX3NhbXBsZSh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2FtcGxlcywgdWludDMyX3QqIHBfcmV0KSB7Ci0gIHVpbnQzMl90IHNyYzsKLSAgdWludDMyX3QgZHN0OwotCi0gIGlmIChhMmRwX3NiY191cHNfY2IucF9hY3QpIHsKLSAgICBzcmMgPSBzcmNfc2FtcGxlcyAvIGEyZHBfc2JjX3Vwc19jYi5kaXY7Ci0gICAgZHN0ID0gZHN0X3NhbXBsZXMgLyBhMmRwX3NiY191cHNfY2IuZGl2OwotICAgIHJldHVybiAoKmEyZHBfc2JjX3Vwc19jYi5wX2FjdCkocF9zcmMsIHBfZHN0LCBzcmMsIGRzdCwgcF9yZXQpOwotICB9IGVsc2UgewotICAgICpwX3JldCA9IDA7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX3VwX3NhbXBsZV8xNnMgKDE2Yml0cy1zdGVyZW8pCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiB0aGUgc291cmNlIChwX3NyYykgYXVkaW8gZGF0YSBhbmQKLSAqICAgICAgICAgICAgICAgICAgc291cmNlIHNwZWVkIChzcmNfc3BzLCBzYW1wbGVzIHBlciBzZWNvbmQpLAotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGl0IHRvIGF1ZGlvIGRhdGEgaW4gdGhlIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAgICAgZm9ybWF0Ci0gKgotICogICAgICAgICAgICAgICAgICBwX3NyYzogdGhlIGRhdGEgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHBfZHN0OiB0aGUgZGF0YSBidWZmZXIgdG8gaG9sZCB0aGUgY29udmVydGVkIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgc3JjX3NhbXBsZXM6IFRoZSBudW1iZXIgb2Ygc291cmNlIHNhbXBsZXMgKGluIHVpbnQgb2YgNAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpCi0gKiAgICAgICAgICAgICAgICAgIGRzdF9zYW1wbGVzOiBUaGUgc2l6ZSBvZiBwX2RzdCAoaW4gdWludCBvZiA0IGJ5dGVzKQotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGluIHBfZHN0Ci0gKiAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX3NyYyAoaW4gKnBfcmV0KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgYTJkcF9zYmNfdXBfc2FtcGxlXzE2cyh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0X3NhbXBsZXMsIHVpbnQzMl90KiBwX3JldCkgewotICBpbnQxNl90KiBwX3NyY190bXAgPSAoaW50MTZfdCopcF9zcmM7Ci0gIGludDE2X3QqIHBfZHN0X3RtcCA9IChpbnQxNl90KilwX2RzdDsKLSAgaW50MTZfdCogcF93b3JrZXIxID0gJmEyZHBfc2JjX3Vwc19jYi53b3JrZXIxOwotICBpbnQxNl90KiBwX3dvcmtlcjIgPSAmYTJkcF9zYmNfdXBzX2NiLndvcmtlcjI7Ci0gIHVpbnQzMl90IHNyY19zcHMgPSBhMmRwX3NiY191cHNfY2Iuc3JjX3NwczsKLSAgdWludDMyX3QgZHN0X3NwcyA9IGEyZHBfc2JjX3Vwc19jYi5kc3Rfc3BzOwotCi0gIHdoaWxlIChhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA+IDAgJiYgZHN0X3NhbXBsZXMpIHsKLSAgICAqcF9kc3RfdG1wKysgPSAqcF93b3JrZXIxOwotICAgICpwX2RzdF90bXArKyA9ICpwX3dvcmtlcjI7Ci0KLSAgICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyAtPSBzcmNfc3BzOwotICAgIGRzdF9zYW1wbGVzLS07Ci0gIH0KLQotICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9IGRzdF9zcHM7Ci0KLSAgd2hpbGUgKHNyY19zYW1wbGVzLS0gJiYgZHN0X3NhbXBsZXMpIHsKLSAgICAqcF93b3JrZXIxID0gKnBfc3JjX3RtcCsrOwotICAgICpwX3dvcmtlcjIgPSAqcF9zcmNfdG1wKys7Ci0KLSAgICBkbyB7Ci0gICAgICAqcF9kc3RfdG1wKysgPSAqcF93b3JrZXIxOwotICAgICAgKnBfZHN0X3RtcCsrID0gKnBfd29ya2VyMjsKLQotICAgICAgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgLT0gc3JjX3NwczsKLSAgICAgIGRzdF9zYW1wbGVzLS07Ci0gICAgfSB3aGlsZSAoYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKTsKLQotICAgIGEyZHBfc2JjX3Vwc19jYi5jdXJfcG9zICs9IGRzdF9zcHM7Ci0gIH0KLQotICBpZiAoYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPT0gKGludDMyX3QpZHN0X3NwcykgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPSAwOwotCi0gICpwX3JldCA9ICgoY2hhciopcF9zcmNfdG1wIC0gKGNoYXIqKXBfc3JjKTsKLSAgcmV0dXJuICgoY2hhciopcF9kc3RfdG1wIC0gKGNoYXIqKXBfZHN0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX3VwX3NhbXBsZV8xNm0gKDE2Yml0cy1tb25vKQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gdGhlIHNvdXJjZSAocF9zcmMpIGF1ZGlvIGRhdGEgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHNvdXJjZSBzcGVlZCAoc3JjX3Nwcywgc2FtcGxlcyBwZXIgc2Vjb25kKSwKLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBpdCB0byBhdWRpbyBkYXRhIGluIHRoZSBkZXNpcmVkCi0gKiAgICAgICAgICAgICAgICAgIGZvcm1hdAotICoKLSAqICAgICAgICAgICAgICAgICAgcF9zcmM6IHRoZSBkYXRhIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBzb3VyY2UgYXVkaW8gZGF0YQotICogICAgICAgICAgICAgICAgICBwX2RzdDogdGhlIGRhdGEgYnVmZmVyIHRvIGhvbGQgdGhlIGNvbnZlcnRlZCBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHNyY19zYW1wbGVzOiBUaGUgbnVtYmVyIG9mIHNvdXJjZSBzYW1wbGVzIChpbiB1aW50IG9mIDIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKQotICogICAgICAgICAgICAgICAgICBkc3Rfc2FtcGxlczogVGhlIHNpemUgb2YgcF9kc3QgKGluIHVpbnQgb2YgMiBieXRlcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX2RzdAotICogICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9zcmMgKGluICpwX3JldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGEyZHBfc2JjX3VwX3NhbXBsZV8xNm0odm9pZCogcF9zcmMsIHZvaWQqIHBfZHN0LCB1aW50MzJfdCBzcmNfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdF9zYW1wbGVzLCB1aW50MzJfdCogcF9yZXQpIHsKLSAgaW50MTZfdCogcF9zcmNfdG1wID0gKGludDE2X3QqKXBfc3JjOwotICBpbnQxNl90KiBwX2RzdF90bXAgPSAoaW50MTZfdCopcF9kc3Q7Ci0gIGludDE2X3QqIHBfd29ya2VyID0gJmEyZHBfc2JjX3Vwc19jYi53b3JrZXIxOwotICB1aW50MzJfdCBzcmNfc3BzID0gYTJkcF9zYmNfdXBzX2NiLnNyY19zcHM7Ci0gIHVpbnQzMl90IGRzdF9zcHMgPSBhMmRwX3NiY191cHNfY2IuZHN0X3NwczsKLQotICB3aGlsZSAoYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKSB7Ci0gICAgKnBfZHN0X3RtcCsrID0gKnBfd29ya2VyOwotICAgICpwX2RzdF90bXArKyA9ICpwX3dvcmtlcjsKLQotICAgIGEyZHBfc2JjX3Vwc19jYi5jdXJfcG9zIC09IHNyY19zcHM7Ci0gICAgZHN0X3NhbXBsZXMtLTsKLSAgICBkc3Rfc2FtcGxlcy0tOwotICB9Ci0KLSAgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPSBkc3Rfc3BzOwotCi0gIHdoaWxlIChzcmNfc2FtcGxlcy0tICYmIGRzdF9zYW1wbGVzKSB7Ci0gICAgKnBfd29ya2VyID0gKnBfc3JjX3RtcCsrOwotCi0gICAgZG8gewotICAgICAgKnBfZHN0X3RtcCsrID0gKnBfd29ya2VyOwotICAgICAgKnBfZHN0X3RtcCsrID0gKnBfd29ya2VyOwotCi0gICAgICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyAtPSBzcmNfc3BzOwotICAgICAgZHN0X3NhbXBsZXMtLTsKLSAgICAgIGRzdF9zYW1wbGVzLS07Ci0KLSAgICB9IHdoaWxlIChhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA+IDAgJiYgZHN0X3NhbXBsZXMpOwotCi0gICAgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgKz0gZHN0X3NwczsKLSAgfQotCi0gIGlmIChhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9PSAoaW50MzJfdClkc3Rfc3BzKSBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9IDA7Ci0KLSAgKnBfcmV0ID0gKChjaGFyKilwX3NyY190bXAgLSAoY2hhciopcF9zcmMpOwotICByZXR1cm4gKChjaGFyKilwX2RzdF90bXAgLSAoY2hhciopcF9kc3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYTJkcF9zYmNfdXBfc2FtcGxlXzhzICg4Yml0cy1zdGVyZW8pCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiB0aGUgc291cmNlIChwX3NyYykgYXVkaW8gZGF0YSBhbmQKLSAqICAgICAgICAgICAgICAgICAgc291cmNlIHNwZWVkIChzcmNfc3BzLCBzYW1wbGVzIHBlciBzZWNvbmQpLAotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGl0IHRvIGF1ZGlvIGRhdGEgaW4gdGhlIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAgICAgZm9ybWF0Ci0gKgotICogICAgICAgICAgICAgICAgICBwX3NyYzogdGhlIGRhdGEgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHBfZHN0OiB0aGUgZGF0YSBidWZmZXIgdG8gaG9sZCB0aGUgY29udmVydGVkIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgc3JjX3NhbXBsZXM6IFRoZSBudW1iZXIgb2Ygc291cmNlIHNhbXBsZXMgKGluIHVpbnQgb2YgMgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpCi0gKiAgICAgICAgICAgICAgICAgIGRzdF9zYW1wbGVzOiBUaGUgc2l6ZSBvZiBwX2RzdCAoaW4gdWludCBvZiAyIGJ5dGVzKQotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGluIHBfZHN0Ci0gKiAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX3NyYyAoaW4gKnBfcmV0KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgYTJkcF9zYmNfdXBfc2FtcGxlXzhzKHZvaWQqIHBfc3JjLCB2b2lkKiBwX2RzdCwgdWludDMyX3Qgc3JjX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdF9zYW1wbGVzLCB1aW50MzJfdCogcF9yZXQpIHsKLSAgdWludDhfdCogcF9zcmNfdG1wID0gKHVpbnQ4X3QqKXBfc3JjOwotICBpbnQxNl90KiBwX2RzdF90bXAgPSAoaW50MTZfdCopcF9kc3Q7Ci0gIGludDE2X3QqIHBfd29ya2VyMSA9ICZhMmRwX3NiY191cHNfY2Iud29ya2VyMTsKLSAgaW50MTZfdCogcF93b3JrZXIyID0gJmEyZHBfc2JjX3Vwc19jYi53b3JrZXIyOwotICB1aW50MzJfdCBzcmNfc3BzID0gYTJkcF9zYmNfdXBzX2NiLnNyY19zcHM7Ci0gIHVpbnQzMl90IGRzdF9zcHMgPSBhMmRwX3NiY191cHNfY2IuZHN0X3NwczsKLQotICB3aGlsZSAoYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKSB7Ci0gICAgKnBfZHN0X3RtcCsrID0gKnBfd29ya2VyMTsKLSAgICAqcF9kc3RfdG1wKysgPSAqcF93b3JrZXIyOwotCi0gICAgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgLT0gc3JjX3NwczsKLSAgICBkc3Rfc2FtcGxlcy0tOwotICAgIGRzdF9zYW1wbGVzLS07Ci0gIH0KLQotICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9IGRzdF9zcHM7Ci0KLSAgd2hpbGUgKHNyY19zYW1wbGVzLS0gJiYgZHN0X3NhbXBsZXMpIHsKLSAgICAqcF93b3JrZXIxID0gKih1aW50OF90KilwX3NyY190bXArKzsKLSAgICAqcF93b3JrZXIxIC09IDB4ODA7Ci0gICAgKnBfd29ya2VyMSA8PD0gODsKLSAgICAqcF93b3JrZXIyID0gKih1aW50OF90KilwX3NyY190bXArKzsKLSAgICAqcF93b3JrZXIyIC09IDB4ODA7Ci0gICAgKnBfd29ya2VyMiA8PD0gODsKLQotICAgIGRvIHsKLSAgICAgICpwX2RzdF90bXArKyA9ICpwX3dvcmtlcjE7Ci0gICAgICAqcF9kc3RfdG1wKysgPSAqcF93b3JrZXIyOwotCi0gICAgICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyAtPSBzcmNfc3BzOwotICAgICAgZHN0X3NhbXBsZXMtLTsKLSAgICAgIGRzdF9zYW1wbGVzLS07Ci0gICAgfSB3aGlsZSAoYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPiAwICYmIGRzdF9zYW1wbGVzKTsKLQotICAgIGEyZHBfc2JjX3Vwc19jYi5jdXJfcG9zICs9IGRzdF9zcHM7Ci0gIH0KLQotICBpZiAoYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPT0gKGludDMyX3QpZHN0X3NwcykgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgPSAwOwotCi0gICpwX3JldCA9ICgoY2hhciopcF9zcmNfdG1wIC0gKGNoYXIqKXBfc3JjKTsKLSAgcmV0dXJuICgoY2hhciopcF9kc3RfdG1wIC0gKGNoYXIqKXBfZHN0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX3VwX3NhbXBsZV84bSAoOGJpdHMtbW9ubykKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIHRoZSBzb3VyY2UgKHBfc3JjKSBhdWRpbyBkYXRhIGFuZAotICogICAgICAgICAgICAgICAgICBzb3VyY2Ugc3BlZWQgKHNyY19zcHMsIHNhbXBsZXMgcGVyIHNlY29uZCksCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgaXQgdG8gYXVkaW8gZGF0YSBpbiB0aGUgZGVzaXJlZAotICogICAgICAgICAgICAgICAgICBmb3JtYXQKLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfc3JjOiB0aGUgZGF0YSBidWZmZXIgdGhhdCBob2xkcyB0aGUgc291cmNlIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgcF9kc3Q6IHRoZSBkYXRhIGJ1ZmZlciB0byBob2xkIHRoZSBjb252ZXJ0ZWQgYXVkaW8gZGF0YQotICogICAgICAgICAgICAgICAgICBzcmNfc2FtcGxlczogVGhlIG51bWJlciBvZiBzb3VyY2Ugc2FtcGxlcyAobnVtYmVyIG9mIGJ5dGVzKQotICogICAgICAgICAgICAgICAgICBkc3Rfc2FtcGxlczogVGhlIHNpemUgb2YgcF9kc3QgKG51bWJlciBvZiBieXRlcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX2RzdAotICogICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9zcmMgKGluICpwX3JldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGEyZHBfc2JjX3VwX3NhbXBsZV84bSh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2FtcGxlcywgdWludDMyX3QqIHBfcmV0KSB7Ci0gIHVpbnQ4X3QqIHBfc3JjX3RtcCA9ICh1aW50OF90KilwX3NyYzsKLSAgaW50MTZfdCogcF9kc3RfdG1wID0gKGludDE2X3QqKXBfZHN0OwotICBpbnQxNl90KiBwX3dvcmtlciA9ICZhMmRwX3NiY191cHNfY2Iud29ya2VyMTsKLSAgdWludDMyX3Qgc3JjX3NwcyA9IGEyZHBfc2JjX3Vwc19jYi5zcmNfc3BzOwotICB1aW50MzJfdCBkc3Rfc3BzID0gYTJkcF9zYmNfdXBzX2NiLmRzdF9zcHM7Ci0KLSAgd2hpbGUgKGEyZHBfc2JjX3Vwc19jYi5jdXJfcG9zID4gMCAmJiBkc3Rfc2FtcGxlcykgewotICAgICpwX2RzdF90bXArKyA9ICpwX3dvcmtlcjsKLSAgICAqcF9kc3RfdG1wKysgPSAqcF93b3JrZXI7Ci0KLSAgICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyAtPSBzcmNfc3BzOwotICAgIGRzdF9zYW1wbGVzIC09IDQ7Ci0gIH0KLQotICBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9IGRzdF9zcHM7Ci0KLSAgd2hpbGUgKHNyY19zYW1wbGVzLS0gJiYgZHN0X3NhbXBsZXMpIHsKLSAgICAqcF93b3JrZXIgPSAqKHVpbnQ4X3QqKXBfc3JjX3RtcCsrOwotICAgICpwX3dvcmtlciAtPSAweDgwOwotICAgICpwX3dvcmtlciA8PD0gODsKLQotICAgIGRvIHsKLSAgICAgICpwX2RzdF90bXArKyA9ICpwX3dvcmtlcjsKLSAgICAgICpwX2RzdF90bXArKyA9ICpwX3dvcmtlcjsKLQotICAgICAgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgLT0gc3JjX3NwczsKLSAgICAgIGRzdF9zYW1wbGVzIC09IDQ7Ci0KLSAgICB9IHdoaWxlIChhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA+IDAgJiYgZHN0X3NhbXBsZXMpOwotCi0gICAgYTJkcF9zYmNfdXBzX2NiLmN1cl9wb3MgKz0gZHN0X3NwczsKLSAgfQotCi0gIGlmIChhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9PSAoaW50MzJfdClkc3Rfc3BzKSBhMmRwX3NiY191cHNfY2IuY3VyX3BvcyA9IDA7Ci0KLSAgKnBfcmV0ID0gKChjaGFyKilwX3NyY190bXAgLSAoY2hhciopcF9zcmMpOwotICByZXR1cm4gKChjaGFyKilwX2RzdF90bXAgLSAoY2hhciopcF9kc3QpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvci5jYyBiL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2ExNTMuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFZlbmRvciBTcGVjaWZpYyBBMkRQIENvZGVjcyBTdXBwb3J0Ci0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX3ZlbmRvciIKLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0KLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9hcHR4LmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eF9oZC5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yX2xkYWMuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1ib29sIEEyRFBfSXNWZW5kb3JTb3VyY2VDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB1aW50MzJfdCB2ZW5kb3JfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvKTsKLSAgdWludDE2X3QgY29kZWNfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm8pOwotCi0gIC8vIENoZWNrIGZvciBhcHRYCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZEFwdHgocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZEFwdHhIZChwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0xEQUNfVkVORE9SX0lEICYmIGNvZGVjX2lkID09IEEyRFBfTERBQ19DT0RFQ19JRCkgewotICAgIHJldHVybiBBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZExkYWMocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyRFBfSXNWZW5kb3JTaW5rQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotICAvLyBOT1RFOiBTaG91bGQgYmUgZG9uZSBvbmx5IGZvciBsb2NhbCBTaW5rIGNvZGVjcy4KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfSXNWZW5kb3JTaW5rQ29kZWNWYWxpZExkYWMocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMkRQX0lzVmVuZG9yUGVlclNvdXJjZUNvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm8pOwotICB1aW50MTZfdCBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gQWRkIGNoZWNrcyBiYXNlZCBvbiA8dmVuZG9yX2lkLCBjb2RlY19pZD4KLSAgLy8gTk9URTogU2hvdWxkIGJlIGRvbmUgb25seSBmb3IgbG9jYWwgU2luayBjb2RlY3MuCi0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0xEQUNfVkVORE9SX0lEICYmIGNvZGVjX2lkID09IEEyRFBfTERBQ19DT0RFQ19JRCkgewotICAgIHJldHVybiBBMkRQX0lzVmVuZG9yUGVlclNvdXJjZUNvZGVjVmFsaWRMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTaW5rQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9Jc1ZlbmRvclBlZXJTaW5rQ29kZWNWYWxpZEFwdHgocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX0lzVmVuZG9yUGVlclNpbmtDb2RlY1ZhbGlkQXB0eEhkKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfSXNWZW5kb3JQZWVyU2lua0NvZGVjVmFsaWRMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMkRQX0lzVmVuZG9yU2lua0NvZGVjU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB1aW50MzJfdCB2ZW5kb3JfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvKTsKLSAgdWludDE2X3QgY29kZWNfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm8pOwotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+Ci0gIC8vIE5PVEU6IFNob3VsZCBiZSBkb25lIG9ubHkgZm9yIGxvY2FsIFNpbmsgY29kZWNzLgotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9Jc1ZlbmRvclNpbmtDb2RlY1N1cHBvcnRlZExkYWMocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMkRQX0lzVmVuZG9yUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB1aW50MzJfdCB2ZW5kb3JfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvKTsKLSAgdWludDE2X3QgY29kZWNfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm8pOwotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+IGFuZCBwZWVyIGNvZGVjIGNhcGFiaWxpdGllcwotICAvLyBOT1RFOiBTaG91bGQgYmUgZG9uZSBvbmx5IGZvciBsb2NhbCBTaW5rIGNvZGVjcy4KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfSXNQZWVyU291cmNlQ29kZWNTdXBwb3J0ZWRMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXVpbnQzMl90IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgY29uc3QgdWludDhfdCogcCA9ICZwX2NvZGVjX2luZm9bQTJEUF9WRU5ET1JfQ09ERUNfVkVORE9SX0lEX1NUQVJUX0lEWF07Ci0KLSAgdWludDMyX3QgdmVuZG9yX2lkID0gKHBbMF0gJiAweDAwMDAwMGZmKSB8ICgocFsxXSA8PCA4KSAmIDB4MDAwMGZmMDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKChwWzJdIDw8IDE2KSAmIDB4MDBmZjAwMDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKChwWzNdIDw8IDI0KSAmIDB4ZmYwMDAwMDApOwotCi0gIHJldHVybiB2ZW5kb3JfaWQ7Ci19Ci0KLXVpbnQxNl90IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBjb25zdCB1aW50OF90KiBwID0gJnBfY29kZWNfaW5mb1tBMkRQX1ZFTkRPUl9DT0RFQ19DT0RFQ19JRF9TVEFSVF9JRFhdOwotCi0gIHVpbnQxNl90IGNvZGVjX2lkID0gKHBbMF0gJiAweDAwZmYpIHwgKChwWzFdIDw8IDgpICYgMHhmZjAwKTsKLQotICByZXR1cm4gY29kZWNfaWQ7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JVc2VzUnRwSGVhZGVyKGJvb2wgY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JVc2VzUnRwSGVhZGVyQXB0eChjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgtSEQKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0FQVFhfSERfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZCA9PSBBMkRQX0FQVFhfSERfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yVXNlc1J0cEhlYWRlckFwdHhIZChjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yVXNlc1J0cEhlYWRlckxkYWMoY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPGNvbnRlbnRfcHJvdGVjdGlvbl9lbmFibGVkLCB2ZW5kb3JfaWQsIGNvZGVjX2lkPgotCi0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjTmFtZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY05hbWVBcHR4KHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYXB0WC1IRAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9IRF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY05hbWVBcHR4SGQocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY05hbWVMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotCi0gIHJldHVybiAiVU5LTk9XTiBWRU5ET1IgQ09ERUMiOwotfQotCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNUeXBlRXF1YWxzKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGVfYSA9IEEyRFBfR2V0Q29kZWNUeXBlKHBfY29kZWNfaW5mb19hKTsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlX2IgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm9fYik7Ci0KLSAgaWYgKChjb2RlY190eXBlX2EgIT0gY29kZWNfdHlwZV9iKSB8fAotICAgICAgKGNvZGVjX3R5cGVfYSAhPSBBMkRQX01FRElBX0NUX05PTl9BMkRQKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQzMl90IHZlbmRvcl9pZF9hID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mb19hKTsKLSAgdWludDE2X3QgY29kZWNfaWRfYSA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mb19hKTsKLSAgdWludDMyX3QgdmVuZG9yX2lkX2IgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvX2IpOwotICB1aW50MTZfdCBjb2RlY19pZF9iID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvX2IpOwotCi0gIGlmICh2ZW5kb3JfaWRfYSAhPSB2ZW5kb3JfaWRfYiB8fCBjb2RlY19pZF9hICE9IGNvZGVjX2lkX2IpIHJldHVybiBmYWxzZTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkX2EgPT0gQTJEUF9BUFRYX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWRfYSA9PSBBMkRQX0FQVFhfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNUeXBlRXF1YWxzQXB0eChwX2NvZGVjX2luZm9fYSwgcF9jb2RlY19pbmZvX2IpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgtSEQKLSAgaWYgKHZlbmRvcl9pZF9hID09IEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkX2EgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckNvZGVjVHlwZUVxdWFsc0FwdHhIZChwX2NvZGVjX2luZm9fYSwgcF9jb2RlY19pbmZvX2IpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZF9hID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWRfYSA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY1R5cGVFcXVhbHNMZGFjKHBfY29kZWNfaW5mb19hLCBwX2NvZGVjX2luZm9fYik7Ci0gIH0KLQotICAvLyBPUFRJT05BTDogQWRkIGV4dHJhIHZlbmRvci1zcGVjaWZpYyBjaGVja3MgYmFzZWQgb24gdGhlCi0gIC8vIHZlbmRvci1zcGVjaWZpYyBkYXRhIHN0b3JlZCBpbiAicF9jb2RlY19pbmZvX2EiIGFuZCAicF9jb2RlY19pbmZvX2IiLgotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNFcXVhbHMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpIHsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlX2EgPSBBMkRQX0dldENvZGVjVHlwZShwX2NvZGVjX2luZm9fYSk7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZV9iID0gQTJEUF9HZXRDb2RlY1R5cGUocF9jb2RlY19pbmZvX2IpOwotCi0gIGlmICgoY29kZWNfdHlwZV9hICE9IGNvZGVjX3R5cGVfYikgfHwKLSAgICAgIChjb2RlY190eXBlX2EgIT0gQTJEUF9NRURJQV9DVF9OT05fQTJEUCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1aW50MzJfdCB2ZW5kb3JfaWRfYSA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm9fYSk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkX2EgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm9fYSk7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZF9iID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mb19iKTsKLSAgdWludDE2X3QgY29kZWNfaWRfYiA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mb19iKTsKLQotICBpZiAoKHZlbmRvcl9pZF9hICE9IHZlbmRvcl9pZF9iKSB8fCAoY29kZWNfaWRfYSAhPSBjb2RlY19pZF9iKSkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIENoZWNrIGZvciBhcHRYCi0gIGlmICh2ZW5kb3JfaWRfYSA9PSBBMkRQX0FQVFhfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZF9hID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY0VxdWFsc0FwdHgocF9jb2RlY19pbmZvX2EsIHBfY29kZWNfaW5mb19iKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWRfYSA9PSBBMkRQX0FQVFhfSERfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZF9hID09IEEyRFBfQVBUWF9IRF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY0VxdWFsc0FwdHhIZChwX2NvZGVjX2luZm9fYSwgcF9jb2RlY19pbmZvX2IpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZF9hID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWRfYSA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY0VxdWFsc0xkYWMocF9jb2RlY19pbmZvX2EsIHBfY29kZWNfaW5mb19iKTsKLSAgfQotCi0gIC8vIEFkZCBleHRyYSB2ZW5kb3Itc3BlY2lmaWMgY2hlY2tzIGJhc2VkIG9uIHRoZQotICAvLyB2ZW5kb3Itc3BlY2lmaWMgZGF0YSBzdG9yZWQgaW4gInBfY29kZWNfaW5mb19hIiBhbmQgInBfY29kZWNfaW5mb19iIi4KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBBMkRQX1ZlbmRvckdldEJpdFJhdGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm8pOwotICB1aW50MTZfdCBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0FQVFhfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZCA9PSBBMkRQX0FQVFhfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yR2V0Qml0UmF0ZUFwdHgocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldEJpdFJhdGVBcHR4SGQocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRCaXRSYXRlTGRhYyhwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQWRkIGNoZWNrcyBiYXNlZCBvbiA8dmVuZG9yX2lkLCBjb2RlY19pZD4KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX1ZlbmRvckdldFRyYWNrU2FtcGxlUmF0ZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVBcHR4KHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYXB0WC1IRAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9IRF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVBcHR4SGQocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tCaXRzUGVyU2FtcGxlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB1aW50MzJfdCB2ZW5kb3JfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvKTsKLSAgdWludDE2X3QgY29kZWNfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm8pOwotCi0gIC8vIENoZWNrIGZvciBhcHRYCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFRyYWNrQml0c1BlclNhbXBsZUFwdHgocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFRyYWNrQml0c1BlclNhbXBsZUFwdHhIZChwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0xEQUNfVkVORE9SX0lEICYmIGNvZGVjX2lkID09IEEyRFBfTERBQ19DT0RFQ19JRCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFRyYWNrQml0c1BlclNhbXBsZUxkYWMocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQgQTJEUF9WZW5kb3JHZXRUcmFja0NoYW5uZWxDb3VudChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRUcmFja0NoYW5uZWxDb3VudEFwdHgocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFRyYWNrQ2hhbm5lbENvdW50QXB0eEhkKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnRMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm8pOwotICB1aW50MTZfdCBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gQWRkIGNoZWNrcyBiYXNlZCBvbiA8dmVuZG9yX2lkLCBjb2RlY19pZD4KLSAgLy8gTk9URTogU2hvdWxkIGJlIGRvbmUgb25seSBmb3IgbG9jYWwgU2luayBjb2RlY3MuCi0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0xEQUNfVkVORE9SX0lEICYmIGNvZGVjX2lkID09IEEyRFBfTERBQ19DT0RFQ19JRCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldFNpbmtUcmFja0NoYW5uZWxUeXBlTGRhYyhwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1ib29sIEEyRFBfVmVuZG9yR2V0UGFja2V0VGltZXN0YW1wKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF90aW1lc3RhbXApIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRQYWNrZXRUaW1lc3RhbXBBcHR4KHBfY29kZWNfaW5mbywgcF9kYXRhLCBwX3RpbWVzdGFtcCk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYXB0WC1IRAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9IRF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRQYWNrZXRUaW1lc3RhbXBBcHR4SGQocF9jb2RlY19pbmZvLCBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGltZXN0YW1wKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRQYWNrZXRUaW1lc3RhbXBMZGFjKHBfY29kZWNfaW5mbywgcF9kYXRhLCBwX3RpbWVzdGFtcCk7Ci0gIH0KLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckJ1aWxkQ29kZWNIZWFkZXIoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnJhbWVzX3Blcl9wYWNrZXQpIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBDaGVjayBmb3IgYXB0WAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JCdWlsZENvZGVjSGVhZGVyQXB0eChwX2NvZGVjX2luZm8sIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc19wZXJfcGFja2V0KTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckJ1aWxkQ29kZWNIZWFkZXJBcHR4SGQocF9jb2RlY19pbmZvLCBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc19wZXJfcGFja2V0KTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JCdWlsZENvZGVjSGVhZGVyTGRhYyhwX2NvZGVjX2luZm8sIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc19wZXJfcGFja2V0KTsKLSAgfQotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogQTJEUF9WZW5kb3JHZXRFbmNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB1aW50MzJfdCB2ZW5kb3JfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvKTsKLSAgdWludDE2X3QgY29kZWNfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm8pOwotCi0gIC8vIENoZWNrIGZvciBhcHRYCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldEVuY29kZXJJbnRlcmZhY2VBcHR4KHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYXB0WC1IRAotICBpZiAodmVuZG9yX2lkID09IEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQgJiYKLSAgICAgIGNvZGVjX2lkID09IEEyRFBfQVBUWF9IRF9DT0RFQ19JRF9CTFVFVE9PVEgpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JHZXRFbmNvZGVySW50ZXJmYWNlQXB0eEhkKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yR2V0RW5jb2RlckludGVyZmFjZUxkYWMocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFKiBBMkRQX1ZlbmRvckdldERlY29kZXJJbnRlcmZhY2UoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm8pOwotICB1aW50MTZfdCBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gQWRkIGNoZWNrcyBiYXNlZCBvbiA8dmVuZG9yX2lkLCBjb2RlY19pZD4KLSAgLy8gTk9URTogU2hvdWxkIGJlIGRvbmUgb25seSBmb3IgbG9jYWwgU2luayBjb2RlY3MuCi0KLSAgLy8gQ2hlY2sgZm9yIExEQUMKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0xEQUNfVkVORE9SX0lEICYmIGNvZGVjX2lkID09IEEyRFBfTERBQ19DT0RFQ19JRCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckdldERlY29kZXJJbnRlcmZhY2VMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckFkanVzdENvZGVjKHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB1aW50MzJfdCB2ZW5kb3JfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0VmVuZG9ySWQocF9jb2RlY19pbmZvKTsKLSAgdWludDE2X3QgY29kZWNfaWQgPSBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChwX2NvZGVjX2luZm8pOwotCi0gIC8vIENoZWNrIGZvciBhcHRYCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvckFkanVzdENvZGVjQXB0eChwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgtSEQKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0FQVFhfSERfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZCA9PSBBMkRQX0FQVFhfSERfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yQWRqdXN0Q29kZWNBcHR4SGQocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JBZGp1c3RDb2RlY0xkYWMocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gPHZlbmRvcl9pZCwgY29kZWNfaWQ+Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXgoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm8pOwotICB1aW50MTZfdCBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0FQVFhfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZCA9PSBBMkRQX0FQVFhfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yU291cmNlQ29kZWNJbmRleEFwdHgocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhcHRYLUhECi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCAmJgotICAgICAgY29kZWNfaWQgPT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXhBcHR4SGQocF9jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBMREFDCi0gIGlmICh2ZW5kb3JfaWQgPT0gQTJEUF9MREFDX1ZFTkRPUl9JRCAmJiBjb2RlY19pZCA9PSBBMkRQX0xEQUNfQ09ERUNfSUQpIHsKLSAgICByZXR1cm4gQTJEUF9WZW5kb3JTb3VyY2VDb2RlY0luZGV4TGRhYyhwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQWRkIGNoZWNrcyBiYXNlZCBvbiA8dmVuZG9yX2lkLCBjb2RlY19pZD4KLQotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsKLX0KLQotYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgQTJEUF9WZW5kb3JTaW5rQ29kZWNJbmRleChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdWludDMyX3QgdmVuZG9yX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldFZlbmRvcklkKHBfY29kZWNfaW5mbyk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkID0gQTJEUF9WZW5kb3JDb2RlY0dldENvZGVjSWQocF9jb2RlY19pbmZvKTsKLQotICAvLyBBZGQgY2hlY2tzIGJhc2VkIG9uIDx2ZW5kb3JfaWQsIGNvZGVjX2lkPgotICAvLyBOT1RFOiBTaG91bGQgYmUgZG9uZSBvbmx5IGZvciBsb2NhbCBTaW5rIGNvZGVjcy4KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yU2lua0NvZGVjSW5kZXhMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsKLX0KLQotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KSB7Ci0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gY29kZWNfaW5kZXgKLSAgc3dpdGNoIChjb2RlY19pbmRleCkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkM6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkM6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQzoKLSAgICAgIGJyZWFrOyAgLy8gVGhlc2UgYXJlIG5vdCB2ZW5kb3Itc3BlY2lmaWMgY29kZWNzCi0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFg6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyQXB0eCgpOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hEOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNJbmRleFN0ckFwdHhIZCgpOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9MREFDOgotICAgICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNJbmRleFN0ckxkYWMoKTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0xEQUM6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyTGRhY1NpbmsoKTsKLSAgICAvLyBBZGQgYSBzd2l0Y2ggc3RhdGVtZW50IGZvciBlYWNoIHZlbmRvci1zcGVjaWZpYyBjb2RlYwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuICJVTktOT1dOIENPREVDIElOREVYIjsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckluaXRDb2RlY0NvbmZpZyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkdHBTZXBDb25maWcqIHBfY2ZnKSB7Ci0gIC8vIEFkZCBjaGVja3MgYmFzZWQgb24gY29kZWNfaW5kZXgKLSAgc3dpdGNoIChjb2RlY19pbmRleCkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkM6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkM6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQzoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQzoKLSAgICAgIGJyZWFrOyAgLy8gVGhlc2UgYXJlIG5vdCB2ZW5kb3Itc3BlY2lmaWMgY29kZWNzCi0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFg6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JJbml0Q29kZWNDb25maWdBcHR4KHBfY2ZnKTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRDoKLSAgICAgIHJldHVybiBBMkRQX1ZlbmRvckluaXRDb2RlY0NvbmZpZ0FwdHhIZChwX2NmZyk7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JJbml0Q29kZWNDb25maWdMZGFjKHBfY2ZnKTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0xEQUM6Ci0gICAgICByZXR1cm4gQTJEUF9WZW5kb3JJbml0Q29kZWNDb25maWdMZGFjU2luayhwX2NmZyk7Ci0gICAgLy8gQWRkIGEgc3dpdGNoIHN0YXRlbWVudCBmb3IgZWFjaCB2ZW5kb3Itc3BlY2lmaWMgY29kZWMKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVg6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RkOjpzdHJpbmcgQTJEUF9WZW5kb3JDb2RlY0luZm9TdHJpbmcoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHVpbnQzMl90IHZlbmRvcl9pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChwX2NvZGVjX2luZm8pOwotICB1aW50MTZfdCBjb2RlY19pZCA9IEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKHBfY29kZWNfaW5mbyk7Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0FQVFhfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZCA9PSBBMkRQX0FQVFhfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nQXB0eChwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGFwdFgtSEQKLSAgaWYgKHZlbmRvcl9pZCA9PSBBMkRQX0FQVFhfSERfVkVORE9SX0lEICYmCi0gICAgICBjb2RlY19pZCA9PSBBMkRQX0FQVFhfSERfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nQXB0eEhkKHBfY29kZWNfaW5mbyk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgTERBQwotICBpZiAodmVuZG9yX2lkID09IEEyRFBfTERBQ19WRU5ET1JfSUQgJiYgY29kZWNfaWQgPT0gQTJEUF9MREFDX0NPREVDX0lEKSB7Ci0gICAgcmV0dXJuIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nTGRhYyhwX2NvZGVjX2luZm8pOwotICB9Ci0KLSAgLy8gQWRkIGNoZWNrcyBiYXNlZCBvbiA8dmVuZG9yX2lkLCBjb2RlY19pZD4KLQotICByZXR1cm4gIlVuc3VwcG9ydGVkIGNvZGVjIHZlbmRvcl9pZDogIiArIGxvZ2hleCh2ZW5kb3JfaWQpICsKLSAgICAgICAgICIgY29kZWNfaWQ6ICIgKyBsb2doZXgoY29kZWNfaWQpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9hcHR4LmNjIGIvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9hcHR4LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjhhYWNhLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfYXB0eC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGhlbHAgYnVpbGQgYW5kIHBhcnNlIHRoZSBhcHRYIENvZGVjIEluZm9ybWF0aW9uCi0gKiAgRWxlbWVudCBhbmQgTWVkaWEgUGF5bG9hZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImEyZHBfdmVuZG9yX2FwdHgiCi0KLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9hcHR4LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyLmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJidGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLy8gZGF0YSB0eXBlIGZvciB0aGUgYXB0WCBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHZlbmRvcklkOwotICB1aW50MTZfdCBjb2RlY0lkOyAgICAvKiBDb2RlYyBJRCBmb3IgYXB0WCAqLwotICB1aW50OF90IHNhbXBsZVJhdGU7ICAvKiBTYW1wbGluZyBGcmVxdWVuY3kgKi8KLSAgdWludDhfdCBjaGFubmVsTW9kZTsgLyogU1RFUkVPL0RVQUwvTU9OTyAqLwotICB1aW50OF90IGZ1dHVyZTE7Ci0gIHVpbnQ4X3QgZnV0dXJlMjsKLSAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGJpdHNfcGVyX3NhbXBsZTsKLX0gdEEyRFBfQVBUWF9DSUU7Ci0KLS8qIGFwdFggU291cmNlIGNvZGVjIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGNvbnN0IHRBMkRQX0FQVFhfQ0lFIGEyZHBfYXB0eF9zb3VyY2VfY2FwcyA9IHsKLSAgICBBMkRQX0FQVFhfVkVORE9SX0lELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlbmRvcklkICovCi0gICAgQTJEUF9BUFRYX0NPREVDX0lEX0JMVUVUT09USCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlY0lkICovCi0gICAgKEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ0MTAwIHwgQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDgwMDApLCAvKiBzYW1wbGVSYXRlICovCi0gICAgQTJEUF9BUFRYX0NIQU5ORUxTX1NURVJFTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsTW9kZSAqLwotICAgIEEyRFBfQVBUWF9GVVRVUkVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnV0dXJlMSAqLwotICAgIEEyRFBfQVBUWF9GVVRVUkVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnV0dXJlMiAqLwotICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYgLyogYml0c19wZXJfc2FtcGxlICovCi19OwotCi0vKiBEZWZhdWx0IGFwdFggY29kZWMgY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGNvbnN0IHRBMkRQX0FQVFhfQ0lFIGEyZHBfYXB0eF9kZWZhdWx0X2NvbmZpZyA9IHsKLSAgICBBMkRQX0FQVFhfVkVORE9SX0lELCAgICAgICAgICAgICAgIC8qIHZlbmRvcklkICovCi0gICAgQTJEUF9BUFRYX0NPREVDX0lEX0JMVUVUT09USCwgICAgICAvKiBjb2RlY0lkICovCi0gICAgQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDgwMDAsICAgICAgICAvKiBzYW1wbGVSYXRlICovCi0gICAgQTJEUF9BUFRYX0NIQU5ORUxTX1NURVJFTywgICAgICAgICAvKiBjaGFubmVsTW9kZSAqLwotICAgIEEyRFBfQVBUWF9GVVRVUkVfMSwgICAgICAgICAgICAgICAgLyogZnV0dXJlMSAqLwotICAgIEEyRFBfQVBUWF9GVVRVUkVfMiwgICAgICAgICAgICAgICAgLyogZnV0dXJlMiAqLwotICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYgLyogYml0c19wZXJfc2FtcGxlICovCi19OwotCi1zdGF0aWMgY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UgYTJkcF9lbmNvZGVyX2ludGVyZmFjZV9hcHR4ID0gewotICAgIGEyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlcl9pbml0LAotICAgIGEyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlcl9jbGVhbnVwLAotICAgIGEyZHBfdmVuZG9yX2FwdHhfZmVlZGluZ19yZXNldCwKLSAgICBhMmRwX3ZlbmRvcl9hcHR4X2ZlZWRpbmdfZmx1c2gsCi0gICAgYTJkcF92ZW5kb3JfYXB0eF9nZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcywKLSAgICBhMmRwX3ZlbmRvcl9hcHR4X2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSwKLSAgICBhMmRwX3ZlbmRvcl9hcHR4X3NlbmRfZnJhbWVzLAotICAgIG51bGxwdHIgIC8vIHNldF90cmFuc21pdF9xdWV1ZV9sZW5ndGgKLX07Ci0KLVVOVVNFRF9BVFRSIHN0YXRpYyB0QTJEUF9TVEFUVVMgQTJEUF9Db2RlY0luZm9NYXRjaGVzQ2FwYWJpbGl0eUFwdHgoCi0gICAgY29uc3QgdEEyRFBfQVBUWF9DSUUqIHBfY2FwLCBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgYm9vbCBpc19wZWVyX2NvZGVjX2luZm8pOwotCi0vLyBCdWlsZHMgdGhlIGFwdFggTWVkaWEgQ29kZWMgQ2FwYWJpbGl0aWVzIGJ5dGUgc2VxdWVuY2UgYmVnaW5uaW5nIGZyb20gdGhlCi0vLyBMT1NDIG9jdGV0LiB8bWVkaWFfdHlwZXwgaXMgdGhlIG1lZGlhIHR5cGUgfEFWRFRfTUVESUFfVFlQRV8qfC4KLS8vIHxwX2llfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGFwdFggQ29kZWMgSW5mb3JtYXRpb24gRWxlbWVudCBpbmZvcm1hdGlvbi4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwuIFJldHVybnMgQTJEUF9TVUNDRVNTIG9uIHN1Y2Nlc3MsCi0vLyBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgQTJEUCBlcnJvciBzdGF0dXMgY29kZS4KLXN0YXRpYyB0QTJEUF9TVEFUVVMgQTJEUF9CdWlsZEluZm9BcHR4KHVpbnQ4X3QgbWVkaWFfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBMkRQX0FQVFhfQ0lFKiBwX2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXN1bHQpIHsKLSAgaWYgKHBfaWUgPT0gTlVMTCB8fCBwX3Jlc3VsdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIEEyRFBfSU5WQUxJRF9QQVJBTVM7Ci0gIH0KLQotICAqcF9yZXN1bHQrKyA9IEEyRFBfQVBUWF9DT0RFQ19MRU47Ci0gICpwX3Jlc3VsdCsrID0gKG1lZGlhX3R5cGUgPDwgNCk7Ci0gICpwX3Jlc3VsdCsrID0gQTJEUF9NRURJQV9DVF9OT05fQTJEUDsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkocF9pZS0+dmVuZG9ySWQgJiAweDAwMDAwMEZGKTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkoKHBfaWUtPnZlbmRvcklkICYgMHgwMDAwRkYwMCkgPj4gOCk7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKChwX2llLT52ZW5kb3JJZCAmIDB4MDBGRjAwMDApID4+IDE2KTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkoKHBfaWUtPnZlbmRvcklkICYgMHhGRjAwMDAwMCkgPj4gMjQpOwotICAqcF9yZXN1bHQrKyA9ICh1aW50OF90KShwX2llLT5jb2RlY0lkICYgMHgwMEZGKTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkoKHBfaWUtPmNvZGVjSWQgJiAweEZGMDApID4+IDgpOwotICAqcF9yZXN1bHQrKyA9IHBfaWUtPnNhbXBsZVJhdGUgfCBwX2llLT5jaGFubmVsTW9kZTsKLQotICByZXR1cm4gQTJEUF9TVUNDRVNTOwotfQotCi0vLyBQYXJzZXMgdGhlIGFwdFggTWVkaWEgQ29kZWMgQ2FwYWJpbGl0aWVzIGJ5dGUgc2VxdWVuY2UgYmVnaW5uaW5nIGZyb20gdGhlCi0vLyBMT1NDIG9jdGV0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9pZXwuIFRoZSBieXRlIHNlcXVlbmNlIHRvIHBhcnNlIGlzCi0vLyB8cF9jb2RlY19pbmZvfC4gSWYgfGlzX2NhcGFiaWxpdHl8IGlzIHRydWUsIHRoZSBieXRlIHNlcXVlbmNlIGlzCi0vLyBjb2RlYyBjYXBhYmlsaXRpZXMsIG90aGVyd2lzZSBpcyBjb2RlYyBjb25maWd1cmF0aW9uLgotLy8gUmV0dXJucyBBMkRQX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHRoZSBjb3JyZXNwb25kaW5nIEEyRFAgZXJyb3IKLS8vIHN0YXR1cyBjb2RlLgotc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX1BhcnNlSW5mb0FwdHgodEEyRFBfQVBUWF9DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NhcGFiaWxpdHkpIHsKLSAgdWludDhfdCBsb3NjOwotICB1aW50OF90IG1lZGlhX3R5cGU7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZTsKLQotICBpZiAocF9pZSA9PSBOVUxMIHx8IHBfY29kZWNfaW5mbyA9PSBOVUxMKSByZXR1cm4gQTJEUF9JTlZBTElEX1BBUkFNUzsKLQotICAvLyBDaGVjayB0aGUgY29kZWMgY2FwYWJpbGl0eSBsZW5ndGgKLSAgbG9zYyA9ICpwX2NvZGVjX2luZm8rKzsKLSAgaWYgKGxvc2MgIT0gQTJEUF9BUFRYX0NPREVDX0xFTikgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0KLSAgbWVkaWFfdHlwZSA9ICgqcF9jb2RlY19pbmZvKyspID4+IDQ7Ci0gIGNvZGVjX3R5cGUgPSAqcF9jb2RlY19pbmZvKys7Ci0gIC8qIENoZWNrIHRoZSBNZWRpYSBUeXBlIGFuZCBNZWRpYSBDb2RlYyBUeXBlICovCi0gIGlmIChtZWRpYV90eXBlICE9IEFWRFRfTUVESUFfVFlQRV9BVURJTyB8fAotICAgICAgY29kZWNfdHlwZSAhPSBBMkRQX01FRElBX0NUX05PTl9BMkRQKSB7Ci0gICAgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0gIH0KLQotICAvLyBDaGVjayB0aGUgVmVuZG9yIElEIGFuZCBDb2RlYyBJRCAqLwotICBwX2llLT52ZW5kb3JJZCA9ICgqcF9jb2RlY19pbmZvICYgMHgwMDAwMDBGRikgfAotICAgICAgICAgICAgICAgICAgICgqKHBfY29kZWNfaW5mbyArIDEpIDw8IDggJiAweDAwMDBGRjAwKSB8Ci0gICAgICAgICAgICAgICAgICAgKCoocF9jb2RlY19pbmZvICsgMikgPDwgMTYgJiAweDAwRkYwMDAwKSB8Ci0gICAgICAgICAgICAgICAgICAgKCoocF9jb2RlY19pbmZvICsgMykgPDwgMjQgJiAweEZGMDAwMDAwKTsKLSAgcF9jb2RlY19pbmZvICs9IDQ7Ci0gIHBfaWUtPmNvZGVjSWQgPQotICAgICAgKCpwX2NvZGVjX2luZm8gJiAweDAwRkYpIHwgKCoocF9jb2RlY19pbmZvICsgMSkgPDwgOCAmIDB4RkYwMCk7Ci0gIHBfY29kZWNfaW5mbyArPSAyOwotICBpZiAocF9pZS0+dmVuZG9ySWQgIT0gQTJEUF9BUFRYX1ZFTkRPUl9JRCB8fAotICAgICAgcF9pZS0+Y29kZWNJZCAhPSBBMkRQX0FQVFhfQ09ERUNfSURfQkxVRVRPT1RIKSB7Ci0gICAgcmV0dXJuIEEyRFBfV1JPTkdfQ09ERUM7Ci0gIH0KLQotICBwX2llLT5jaGFubmVsTW9kZSA9ICpwX2NvZGVjX2luZm8gJiAweDBGOwotICBwX2llLT5zYW1wbGVSYXRlID0gKnBfY29kZWNfaW5mbyAmIDB4RjA7Ci0gIHBfY29kZWNfaW5mbysrOwotCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgLy8gTk9URTogVGhlIGNoZWNrcyBoZXJlIGFyZSB2ZXJ5IGxpYmVyYWwuIFdlIHNob3VsZCBiZSB1c2luZyBtb3JlCi0gICAgLy8gcGVkYW50aWMgY2hlY2tzIHNwZWNpZmljIHRvIHRoZSBTUkMgb3IgU05LIGFzIHNwZWNpZmllZCBpbiB0aGUgc3BlYy4KLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPnNhbXBsZVJhdGUpID09IEEyRFBfU0VUX1pFUk9fQklUKQotICAgICAgcmV0dXJuIEEyRFBfQkFEX1NBTVBfRlJFUTsKLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gICAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLSAgfQotCi0gIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+c2FtcGxlUmF0ZSkgIT0gQTJEUF9TRVRfT05FX0JJVCkKLSAgICByZXR1cm4gQTJEUF9CQURfU0FNUF9GUkVROwotICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSAhPSBBMkRQX1NFVF9PTkVfQklUKQotICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgQTJEUF9Jc1ZlbmRvclNvdXJjZUNvZGVjVmFsaWRBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BUFRYX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9BcHR4KCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9BcHR4KCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTaW5rQ29kZWNWYWxpZEFwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FQVFhfQ0lFIGNmZ19jaWU7Ci0KLSAgLyogVXNlIGEgbGliZXJhbCBjaGVjayB3aGVuIHBhcnNpbmcgdGhlIGNvZGVjIGluZm8gKi8KLSAgcmV0dXJuIChBMkRQX1BhcnNlSW5mb0FwdHgoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpID09IEEyRFBfU1VDQ0VTUykgfHwKLSAgICAgICAgIChBMkRQX1BhcnNlSW5mb0FwdHgoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotLy8gQ2hlY2tzIHdoZXRoZXIgQTJEUCBhcHRYIGNvZGVjIGNvbmZpZ3VyYXRpb24gbWF0Y2hlcyB3aXRoIGEgZGV2aWNlJ3MgY29kZWMKLS8vIGNhcGFiaWxpdGllcy4gfHBfY2FwfCBpcyB0aGUgYXB0WCBjb2RlYyBjb25maWd1cmF0aW9uLiB8cF9jb2RlY19pbmZvfCBpcwotLy8gdGhlIGRldmljZSdzIGNvZGVjIGNhcGFiaWxpdGllcy4KLS8vIElmIHxpc19jYXBhYmlsaXR5fCBpcyB0cnVlLCB0aGUgYnl0ZSBzZXF1ZW5jZSBpcyBjb2RlYyBjYXBhYmlsaXRpZXMsCi0vLyBvdGhlcndpc2UgaXMgY29kZWMgY29uZmlndXJhdGlvbi4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgZm9yIGEgcGVlciBkZXZpY2UgdGhhdAotLy8gaXMgYWN0aW5nIGFzIGFuIEEyRFAgc291cmNlLgotLy8gUmV0dXJucyBBMkRQX1NVQ0NFU1MgaWYgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gbWF0Y2hlcyB3aXRoIGNhcGFiaWxpdGllcywKLS8vIG90aGVyd2lzZSB0aGUgY29ycmVzcG9uZGluZyBBMkRQIGVycm9yIHN0YXR1cyBjb2RlLgotc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5QXB0eCgKLSAgICBjb25zdCB0QTJEUF9BUFRYX0NJRSogcF9jYXAsIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICBib29sIGlzX2NhcGFiaWxpdHkpIHsKLSAgdEEyRFBfU1RBVFVTIHN0YXR1czsKLSAgdEEyRFBfQVBUWF9DSUUgY2ZnX2NpZTsKLQotICAvKiBwYXJzZSBjb25maWd1cmF0aW9uICovCi0gIHN0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQXB0eCgmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCBpc19jYXBhYmlsaXR5KTsKLSAgaWYgKHN0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBwYXJzaW5nIGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKiB2ZXJpZnkgdGhhdCBlYWNoIHBhcmFtZXRlciBpcyBpbiByYW5nZSAqLwotCi0gIExPR19WRVJCT1NFKCIlczogRlJFUSBwZWVyOiAweCV4LCBjYXBhYmlsaXR5IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgY2ZnX2NpZS5zYW1wbGVSYXRlLCBwX2NhcC0+c2FtcGxlUmF0ZSk7Ci0gIExPR19WRVJCT1NFKCIlczogQ0hfTU9ERSBwZWVyOiAweCV4LCBjYXBhYmlsaXR5IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgY2ZnX2NpZS5jaGFubmVsTW9kZSwgcF9jYXAtPmNoYW5uZWxNb2RlKTsKLQotICAvKiBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgaWYgKChjZmdfY2llLnNhbXBsZVJhdGUgJiBwX2NhcC0+c2FtcGxlUmF0ZSkgPT0gMCkgcmV0dXJuIEEyRFBfTlNfU0FNUF9GUkVROwotCi0gIC8qIGNoYW5uZWwgbW9kZSAqLwotICBpZiAoKGNmZ19jaWUuY2hhbm5lbE1vZGUgJiBwX2NhcC0+Y2hhbm5lbE1vZGUpID09IDApIHJldHVybiBBMkRQX05TX0NIX01PREU7Ci0KLSAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvclVzZXNSdHBIZWFkZXJBcHR4KFVOVVNFRF9BVFRSIGJvb2wgY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICAvLyBubyBSVFAgaGVhZGVyIGZvciBhcHRYIGNsYXNzaWMgYW5kIG5vIENvcHkgUHJvdGVjdGlvbiBieXRlCi0gIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjTmFtZUFwdHgoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiAiYXB0WCI7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JDb2RlY1R5cGVFcXVhbHNBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpIHsKLSAgdEEyRFBfQVBUWF9DSUUgYXB0eF9jaWVfYTsKLSAgdEEyRFBfQVBUWF9DSUUgYXB0eF9jaWVfYjsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvQXB0eCgmYXB0eF9jaWVfYSwgcF9jb2RlY19pbmZvX2EsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQXB0eCgmYXB0eF9jaWVfYiwgcF9jb2RlY19pbmZvX2IsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNFcXVhbHNBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICB0QTJEUF9BUFRYX0NJRSBhcHR4X2NpZV9hOwotICB0QTJEUF9BUFRYX0NJRSBhcHR4X2NpZV9iOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9BcHR4KCZhcHR4X2NpZV9hLCBwX2NvZGVjX2luZm9fYSwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BcHR4KCZhcHR4X2NpZV9iLCBwX2NvZGVjX2luZm9fYiwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIChhcHR4X2NpZV9hLnNhbXBsZVJhdGUgPT0gYXB0eF9jaWVfYi5zYW1wbGVSYXRlKSAmJgotICAgICAgICAgKGFwdHhfY2llX2EuY2hhbm5lbE1vZGUgPT0gYXB0eF9jaWVfYi5jaGFubmVsTW9kZSk7Ci19Ci0KLWludCBBMkRQX1ZlbmRvckdldEJpdFJhdGVBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBBMmRwQ29kZWNDb25maWcqIENvZGVjQ29uZmlnID0gYnRhX2F2X2dldF9hMmRwX2N1cnJlbnRfY29kZWMoKTsKLSAgdEEyRFBfQklUU19QRVJfU0FNUExFIGJpdHNfcGVyX3NhbXBsZSA9IENvZGVjQ29uZmlnLT5nZXRBdWRpb0JpdHNQZXJTYW1wbGUoKTsKLSAgdWludDE2X3Qgc2FtcGxlcmF0ZSA9IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlKHBfY29kZWNfaW5mbyk7Ci0gIHJldHVybiAoc2FtcGxlcmF0ZSAqIGJpdHNfcGVyX3NhbXBsZSAqIDIpIC8gNDsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tTYW1wbGVSYXRlQXB0eChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfQVBUWF9DSUUgYXB0eF9jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQXB0eCgmYXB0eF9jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChhcHR4X2NpZS5zYW1wbGVSYXRlID09IEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ0MTAwKSByZXR1cm4gNDQxMDA7Ci0gIGlmIChhcHR4X2NpZS5zYW1wbGVSYXRlID09IEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwKSByZXR1cm4gNDgwMDA7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQgQTJEUF9WZW5kb3JHZXRUcmFja0JpdHNQZXJTYW1wbGVBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BUFRYX0NJRSBhcHR4X2NpZTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BcHR4KCZhcHR4X2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gTk9URTogVGhlIGJpdHMgcGVyIHNhbXBsZSBuZXZlciBjaGFuZ2VzIGZvciBhcHRYCi0gIHJldHVybiAxNjsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnRBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BUFRYX0NJRSBhcHR4X2NpZTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BcHR4KCZhcHR4X2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChhcHR4X2NpZS5jaGFubmVsTW9kZSkgewotICAgIGNhc2UgQTJEUF9BUFRYX0NIQU5ORUxTX01PTk86Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEEyRFBfQVBUWF9DSEFOTkVMU19TVEVSRU86Ci0gICAgICByZXR1cm4gMjsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckdldFBhY2tldFRpbWVzdGFtcEFwdHgoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKSB7Ci0gIC8vIFRPRE86IElzIHRoaXMgZnVuY3Rpb24gcmVhbGx5IGNvZGVjLXNwZWNpZmljPwotICAqcF90aW1lc3RhbXAgPSAqKGNvbnN0IHVpbnQzMl90KilwX2RhdGE7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfVmVuZG9yQnVpbGRDb2RlY0hlYWRlckFwdHgoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgZnJhbWVzX3Blcl9wYWNrZXQpIHsKLSAgLy8gTm90aGluZyB0byBkbwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RkOjpzdHJpbmcgQTJEUF9WZW5kb3JDb2RlY0luZm9TdHJpbmdBcHR4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBzdGQ6OnN0cmluZ3N0cmVhbSByZXM7Ci0gIHN0ZDo6c3RyaW5nIGZpZWxkOwotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXM7Ci0gIHRBMkRQX0FQVFhfQ0lFIGFwdHhfY2llOwotCi0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BcHR4KCZhcHR4X2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIHJlcyA8PCAiQTJEUF9QYXJzZUluZm9BcHR4IGZhaWw6ICIgPDwgbG9naGV4KGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gcmVzLnN0cigpOwotICB9Ci0KLSAgcmVzIDw8ICJcdG5hbWU6IGFwdFhcbiI7Ci0KLSAgLy8gU2FtcGxlIGZyZXF1ZW5jeQotICBmaWVsZC5jbGVhcigpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhcHR4X2NpZS5zYW1wbGVSYXRlID09IDApLCAiTk9ORSIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhcHR4X2NpZS5zYW1wbGVSYXRlICYgQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDQxMDApLAotICAgICAgICAgICAgICAiNDQxMDAiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYXB0eF9jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwKSwKLSAgICAgICAgICAgICAgIjQ4MDAwIik7Ci0gIHJlcyA8PCAiXHRzYW1wX2ZyZXE6ICIgPDwgZmllbGQgPDwgIiAoIiA8PCBsb2doZXgoYXB0eF9jaWUuc2FtcGxlUmF0ZSkKLSAgICAgIDw8ICIpXG4iOwotCi0gIC8vIENoYW5uZWwgbW9kZQotICBmaWVsZC5jbGVhcigpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhcHR4X2NpZS5jaGFubmVsTW9kZSA9PSAwKSwgIk5PTkUiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYXB0eF9jaWUuY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfQ0hBTk5FTFNfTU9OTyksICJNb25vIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFwdHhfY2llLmNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0NIQU5ORUxTX1NURVJFTyksCi0gICAgICAgICAgICAgICJTdGVyZW8iKTsKLSAgcmVzIDw8ICJcdGNoX21vZGU6ICIgPDwgZmllbGQgPDwgIiAoIiA8PCBsb2doZXgoYXB0eF9jaWUuY2hhbm5lbE1vZGUpCi0gICAgICA8PCAiKVxuIjsKLQotICByZXR1cm4gcmVzLnN0cigpOwotfQotCi1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogQTJEUF9WZW5kb3JHZXRFbmNvZGVySW50ZXJmYWNlQXB0eCgKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgaWYgKCFBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZEFwdHgocF9jb2RlY19pbmZvKSkgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuICZhMmRwX2VuY29kZXJfaW50ZXJmYWNlX2FwdHg7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JBZGp1c3RDb2RlY0FwdHgodWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FQVFhfQ0lFIGNmZ19jaWU7Ci0KLSAgLy8gTm90aGluZyB0byBkbzoganVzdCB2ZXJpZnkgdGhlIGNvZGVjIGluZm8gaXMgdmFsaWQKLSAgaWYgKEEyRFBfUGFyc2VJbmZvQXB0eCgmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKSAhPSBBMkRQX1NVQ0NFU1MpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXhBcHR4KAotICAgIFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYOwotfQotCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjSW5kZXhTdHJBcHR4KHZvaWQpIHsgcmV0dXJuICJhcHRYIjsgfQotCi1ib29sIEEyRFBfVmVuZG9ySW5pdENvZGVjQ29uZmlnQXB0eChBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgaWYgKEEyRFBfQnVpbGRJbmZvQXB0eChBVkRUX01FRElBX1RZUEVfQVVESU8sICZhMmRwX2FwdHhfc291cmNlX2NhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9jZmctPmNvZGVjX2luZm8pICE9IEEyRFBfU1VDQ0VTUykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgLyogQ29udGVudCBwcm90ZWN0aW9uIGluZm8gLSBzdXBwb3J0IFNDTVMtVCAqLwotICB1aW50OF90KiBwID0gcF9jZmctPnByb3RlY3RfaW5mbzsKLSAgKnArKyA9IEFWRFRfQ1BfTE9TQzsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBBVkRUX0NQX1NDTVNfVF9JRCk7Ci0gIHBfY2ZnLT5udW1fcHJvdGVjdCA9IDE7Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQTJkcENvZGVjQ29uZmlnQXB0eDo6QTJkcENvZGVjQ29uZmlnQXB0eCgKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkKLSAgICA6IEEyZHBDb2RlY0NvbmZpZyhCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFgsCi0gICAgICAgICAgICAgICAgICAgICAgQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyQXB0eCgpLCBjb2RlY19wcmlvcml0eSkgewotICAvLyBDb21wdXRlIHRoZSBsb2NhbCBjYXBhYmlsaXR5Ci0gIGlmIChhMmRwX2FwdHhfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ0MTAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICB9Ci0gIGlmIChhMmRwX2FwdHhfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICB9Ci0gIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBhMmRwX2FwdHhfc291cmNlX2NhcHMuYml0c19wZXJfc2FtcGxlOwotICBpZiAoYTJkcF9hcHR4X3NvdXJjZV9jYXBzLmNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0NIQU5ORUxTX01PTk8pIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICB9Ci0gIGlmIChhMmRwX2FwdHhfc291cmNlX2NhcHMuY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfQ0hBTk5FTFNfU1RFUkVPKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICB9Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZ0FwdHg6On5BMmRwQ29kZWNDb25maWdBcHR4KCkge30KLQotYm9vbCBBMmRwQ29kZWNDb25maWdBcHR4Ojppbml0KCkgewotICBpZiAoIWlzVmFsaWQoKSkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIExvYWQgdGhlIGVuY29kZXIKLSAgaWYgKCFBMkRQX1ZlbmRvckxvYWRFbmNvZGVyQXB0eCgpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGxvYWQgdGhlIGVuY29kZXIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQXB0eDo6dXNlUnRwSGVhZGVyTWFya2VyQml0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGJlc3Qgc2FtcGxlIHJhdGUgZnJvbSB8c2FtcGxlUmF0ZXwuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCBwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYmVzdF9zYW1wbGVfcmF0ZSh1aW50OF90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9BUFRYX0NJRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDgwMDApIHsKLSAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwOwotICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ0MTAwKSB7Ci0gICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0FQVFhfU0FNUExFUkFURV80NDEwMDsKLSAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYXVkaW8gc2FtcGxlIHJhdGUgZnJvbSB8cF9jb2RlY19hdWRpb19jb25maWd8LgotLy8gfHNhbXBsZVJhdGV8IGNvbnRhaW5zIHRoZSBjYXBhYmlsaXR5LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9hdWRpb19zYW1wbGVfcmF0ZSgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfYXVkaW9fY29uZmlnLCB1aW50OF90IHNhbXBsZVJhdGUsCi0gICAgdEEyRFBfQVBUWF9DSUUqIHBfcmVzdWx0LCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIHN3aXRjaCAocF9jb2RlY19hdWRpb19jb25maWctPnNhbXBsZV9yYXRlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA6Ci0gICAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ0MTAwKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDQxMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDgwMDApIHsKLSAgICAgICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0FQVFhfU0FNUExFUkFURV80ODAwMDsKLSAgICAgICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGJlc3QgYml0cyBwZXIgc2FtcGxlLgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X2JpdHNfcGVyX3NhbXBsZSgKLSAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIHBfY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGF1ZGlvIGJpdHMgcGVyIHNhbXBsZSBmcm9tIHxwX2NvZGVjX2F1ZGlvX2NvbmZpZ3wuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2F1ZGlvX2JpdHNfcGVyX3NhbXBsZSgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfYXVkaW9fY29uZmlnLAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChwX2NvZGVjX2F1ZGlvX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OgotICAgICAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYmVzdCBjaGFubmVsIG1vZGUgZnJvbSB8Y2hhbm5lbE1vZGV8LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X2NoYW5uZWxfbW9kZSh1aW50OF90IGNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBMkRQX0FQVFhfQ0lFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19TVEVSRU8pIHsKLSAgICBwX3Jlc3VsdC0+Y2hhbm5lbE1vZGUgPSBBMkRQX0FQVFhfQ0hBTk5FTFNfU1RFUkVPOwotICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfQ0hBTk5FTFNfTU9OTykgewotICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfQVBUWF9DSEFOTkVMU19NT05POwotICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYXVkaW8gY2hhbm5lbCBtb2RlIGZyb20gfHBfY29kZWNfYXVkaW9fY29uZmlnfC4KLS8vIHxjaGFubmVsTW9kZXwgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2F1ZGlvX2NoYW5uZWxfbW9kZSgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfYXVkaW9fY29uZmlnLCB1aW50OF90IGNoYW5uZWxNb2RlLAotICAgIHRBMkRQX0FQVFhfQ0lFKiBwX3Jlc3VsdCwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKHBfY29kZWNfYXVkaW9fY29uZmlnLT5jaGFubmVsX21vZGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzoKLSAgICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19NT05PKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfQVBUWF9DSEFOTkVMU19NT05POwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfQ0hBTk5FTFNfU1RFUkVPKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfQVBUWF9DSEFOTkVMU19TVEVSRU87Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ0FwdHg6OnNldENvZGVjQ29uZmlnKGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgdEEyRFBfQVBUWF9DSUUgcGVlcl9pbmZvX2NpZTsKLSAgdEEyRFBfQVBUWF9DSUUgcmVzdWx0X2NvbmZpZ19jaWU7Ci0gIHVpbnQ4X3Qgc2FtcGxlUmF0ZTsKLSAgdWludDhfdCBjaGFubmVsTW9kZTsKLQotICAvLyBTYXZlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfY29uZmlnID0gY29kZWNfY29uZmlnXzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX2NhcGFiaWxpdHkgPSBjb2RlY19jYXBhYmlsaXR5XzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eSA9Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfdXNlcl9jb25maWcgPSBjb2RlY191c2VyX2NvbmZpZ187Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19hdWRpb19jb25maWcgPSBjb2RlY19hdWRpb19jb25maWdfOwotICB1aW50OF90IHNhdmVkX290YV9jb2RlY19jb25maWdbQVZEVF9DT0RFQ19TSVpFXTsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5W0FWRFRfQ09ERUNfU0laRV07Ci0gIHVpbnQ4X3Qgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY29uZmlnW0FWRFRfQ09ERUNfU0laRV07Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfY29uZmlnLCBvdGFfY29kZWNfY29uZmlnXywgc2l6ZW9mKG90YV9jb2RlY19jb25maWdfKSk7Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LCBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotICBtZW1jcHkoc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY29uZmlnLCBvdGFfY29kZWNfcGVlcl9jb25maWdfLAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NvbmZpZ18pKTsKLQotICB0QTJEUF9TVEFUVVMgc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvQXB0eCgmcGVlcl9pbmZvX2NpZSwgcF9wZWVyX2NvZGVjX2luZm8sIGlzX2NhcGFiaWxpdHkpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbid0IHBhcnNlIHBlZXIncyBjYXBhYmlsaXRpZXM6IGVycm9yID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBCdWlsZCB0aGUgcHJlZmVycmVkIGNvbmZpZ3VyYXRpb24KLSAgLy8KLSAgbWVtc2V0KCZyZXN1bHRfY29uZmlnX2NpZSwgMCwgc2l6ZW9mKHJlc3VsdF9jb25maWdfY2llKSk7Ci0gIHJlc3VsdF9jb25maWdfY2llLnZlbmRvcklkID0gYTJkcF9hcHR4X3NvdXJjZV9jYXBzLnZlbmRvcklkOwotICByZXN1bHRfY29uZmlnX2NpZS5jb2RlY0lkID0gYTJkcF9hcHR4X3NvdXJjZV9jYXBzLmNvZGVjSWQ7Ci0KLSAgLy8KLSAgLy8gU2VsZWN0IHRoZSBzYW1wbGUgZnJlcXVlbmN5Ci0gIC8vCi0gIHNhbXBsZVJhdGUgPSBhMmRwX2FwdHhfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZTsKLSAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICBzd2l0Y2ggKGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfU0FNUExFUkFURV80NDEwMCkgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5zYW1wbGVSYXRlID0gQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDQxMDA7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0FQVFhfU0FNUExFUkFURV80ODAwMDsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzI0MDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU6Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBTZWxlY3QgdGhlIHNhbXBsZSBmcmVxdWVuY3kgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCi0gIGRvIHsKLSAgICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkKLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ0MTAwKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgIH0KLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIH0KLQotICAgIGlmIChjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlICE9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FKSBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfU0FNUExFUkFURV80NDEwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwKQotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX3NhbXBsZV9yYXRlKCZjb2RlY19hdWRpb19jb25maWdfLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgZGVmYXVsdCBjb25maWcKLSAgICBpZiAoc2VsZWN0X2Jlc3Rfc2FtcGxlX3JhdGUoCi0gICAgICAgICAgICBhMmRwX2FwdHhfZGVmYXVsdF9jb25maWcuc2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB1c2UgdGhlIGJlc3QgbWF0Y2gKLSAgICBpZiAoc2VsZWN0X2Jlc3Rfc2FtcGxlX3JhdGUoc2FtcGxlUmF0ZSwgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBjYW5ub3QgbWF0Y2ggc2FtcGxlIGZyZXF1ZW5jeTogbG9jYWwgY2FwcyA9IDB4JXggIgotICAgICAgICAicGVlciBpbmZvID0gMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBhMmRwX2FwdHhfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSwgcGVlcl9pbmZvX2NpZS5zYW1wbGVSYXRlKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIGJpdHMgcGVyIHNhbXBsZQotICAvLwotICAvLyBOT1RFOiB0aGlzIGluZm9ybWF0aW9uIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgYXB0WCBBMkRQIGNvZGVjCi0gIC8vIGRlc2NyaXB0aW9uIHRoYXQgaXMgc2VudCBPVEEuCi0gIGNvZGVjX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICBzd2l0Y2ggKGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY6Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPSBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlOwotICAgICAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORToKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORTsKLSAgICAgIGNvZGVjX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBTZWxlY3QgdGhlIGJpdHMgcGVyIHNhbXBsZSBpZiB0aGVyZSBpcyBubyB1c2VyIHByZWZlcmVuY2UKLSAgZG8gewotICAgIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eQotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0KLSAgICAgICAgYTJkcF9hcHR4X3NvdXJjZV9jYXBzLmJpdHNfcGVyX3NhbXBsZTsKLQotICAgIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSAhPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpCi0gICAgICBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjsKLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgY29kZWMgYXVkaW8gY29uZmlnCi0gICAgaWYgKHNlbGVjdF9hdWRpb19iaXRzX3Blcl9zYW1wbGUoJmNvZGVjX2F1ZGlvX2NvbmZpZ18sICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBkZWZhdWx0IGNvbmZpZwotICAgIGlmIChzZWxlY3RfYmVzdF9iaXRzX3Blcl9zYW1wbGUoJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB1c2UgdGhlIGJlc3QgbWF0Y2gKLSAgICAvLyBOT1RFOiBuby1vcCAtIGtlcHQgaGVyZSBmb3IgY29uc2lzdGVuY3kKLSAgICBpZiAoc2VsZWN0X2Jlc3RfYml0c19wZXJfc2FtcGxlKCZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlIChmYWxzZSk7Ci0gIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9PSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgbWF0Y2ggYml0cyBwZXIgc2FtcGxlOiB1c2VyIHByZWZlcmVuY2UgPSAweCV4IiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGVjX3VzZXJfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgY2hhbm5lbCBtb2RlCi0gIC8vCi0gIGNoYW5uZWxNb2RlID0gYTJkcF9hcHR4X3NvdXJjZV9jYXBzLmNoYW5uZWxNb2RlICYgcGVlcl9pbmZvX2NpZS5jaGFubmVsTW9kZTsKLSAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0gIHN3aXRjaCAoY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0NIQU5ORUxTX01PTk8pIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuY2hhbm5lbE1vZGUgPSBBMkRQX0FQVFhfQ0hBTk5FTFNfTU9OTzsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzoKLSAgICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19TVEVSRU8pIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuY2hhbm5lbE1vZGUgPSBBMkRQX0FQVFhfQ0hBTk5FTFNfU1RFUkVPOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgICBjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORToKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLSAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBTZWxlY3QgdGhlIGNoYW5uZWwgbW9kZSBpZiB0aGVyZSBpcyBubyB1c2VyIHByZWZlcmVuY2UKLSAgZG8gewotICAgIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eQotICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19NT05PKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICB9Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0NIQU5ORUxTX1NURVJFTykgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICB9Ci0KLSAgICBpZiAoY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgIT0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FKSBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0NIQU5ORUxTX01PTk8pCi0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19TVEVSRU8pCi0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB0cnkgdGhlIGNvZGVjIGF1ZGlvIGNvbmZpZwotICAgIGlmIChzZWxlY3RfYXVkaW9fY2hhbm5lbF9tb2RlKCZjb2RlY19hdWRpb19jb25maWdfLCBjaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBkZWZhdWx0IGNvbmZpZwotICAgIGlmIChzZWxlY3RfYmVzdF9jaGFubmVsX21vZGUoCi0gICAgICAgICAgICBhMmRwX2FwdHhfZGVmYXVsdF9jb25maWcuY2hhbm5lbE1vZGUgJiBwZWVyX2luZm9fY2llLmNoYW5uZWxNb2RlLAotICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHVzZSB0aGUgYmVzdCBtYXRjaAotICAgIGlmIChzZWxlY3RfYmVzdF9jaGFubmVsX21vZGUoY2hhbm5lbE1vZGUsICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlIChmYWxzZSk7Ci0gIGlmIChjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIGNoYW5uZWwgbW9kZTogbG9jYWwgY2FwcyA9IDB4JXggIgotICAgICAgICAicGVlciBpbmZvID0gMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBhMmRwX2FwdHhfc291cmNlX2NhcHMuY2hhbm5lbE1vZGUsIHBlZXJfaW5mb19jaWUuY2hhbm5lbE1vZGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNldCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIGFzIGJpdC13aXNlIEFORCBvcGVyYXRpb24KLSAgLy8KLSAgcmVzdWx0X2NvbmZpZ19jaWUuZnV0dXJlMSA9Ci0gICAgICBhMmRwX2FwdHhfc291cmNlX2NhcHMuZnV0dXJlMSAmIHBlZXJfaW5mb19jaWUuZnV0dXJlMTsKLSAgcmVzdWx0X2NvbmZpZ19jaWUuZnV0dXJlMiA9Ci0gICAgICBhMmRwX2FwdHhfc291cmNlX2NhcHMuZnV0dXJlMiAmIHBlZXJfaW5mb19jaWUuZnV0dXJlMjsKLQotICBpZiAoQTJEUF9CdWlsZEluZm9BcHR4KEFWRFRfTUVESUFfVFlQRV9BVURJTywgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0X2NvZGVjX2NvbmZpZykgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gQ29weSB0aGUgY29kZWMtc3BlY2lmaWMgZmllbGRzIGlmIHRoZXkgYXJlIG5vdCB6ZXJvCi0gIC8vCi0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xOwotICBpZiAoY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzIgIT0gMCkKLSAgICBjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzIgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMjsKLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18zICE9IDApCi0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18zID0gY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzM7Ci0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfNCAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfNCA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY180OwotCi0gIC8vIENyZWF0ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIHBlZXIgY29kZWMgY2FwYWJpbGl0eS9jb25maWcsIGFuZCB0aGUKLSAgLy8gcmVzdWx0IGNvZGVjIGNvbmZpZy4KLSAgaWYgKGlzX2NhcGFiaWxpdHkpIHsKLSAgICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb0FwdHgoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcGVlcl9pbmZvX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pOwotICB9IGVsc2UgewotICAgIHN0YXR1cyA9IEEyRFBfQnVpbGRJbmZvQXB0eChBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jb25maWdfKTsKLSAgfQotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLSAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BcHR4KEFWRFRfTUVESUFfVFlQRV9BVURJTywgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RhX2NvZGVjX2NvbmZpZ18pOwotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotZmFpbDoKLSAgLy8gUmVzdG9yZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgY29kZWNfY29uZmlnXyA9IHNhdmVkX2NvZGVjX2NvbmZpZzsKLSAgY29kZWNfY2FwYWJpbGl0eV8gPSBzYXZlZF9jb2RlY19jYXBhYmlsaXR5OwotICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfID0gc2F2ZWRfY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5OwotICBjb2RlY191c2VyX2NvbmZpZ18gPSBzYXZlZF9jb2RlY191c2VyX2NvbmZpZzsKLSAgY29kZWNfYXVkaW9fY29uZmlnXyA9IHNhdmVkX2NvZGVjX2F1ZGlvX2NvbmZpZzsKLSAgbWVtY3B5KG90YV9jb2RlY19jb25maWdfLCBzYXZlZF9vdGFfY29kZWNfY29uZmlnLCBzaXplb2Yob3RhX2NvZGVjX2NvbmZpZ18pKTsKLSAgbWVtY3B5KG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKSk7Ci0gIG1lbWNweShvdGFfY29kZWNfcGVlcl9jb25maWdfLCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jb25maWcsCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY29uZmlnXykpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQXB0eDo6c2V0UGVlckNvZGVjQ2FwYWJpbGl0aWVzKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0gIHRBMkRQX0FQVFhfQ0lFIHBlZXJfaW5mb19jaWU7Ci0gIHVpbnQ4X3Qgc2FtcGxlUmF0ZTsKLSAgdWludDhfdCBjaGFubmVsTW9kZTsKLQotICAvLyBTYXZlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5ID0KLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV87Ci0gIHVpbnQ4X3Qgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eVtBVkRUX0NPREVDX1NJWkVdOwotICBtZW1jcHkoc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eSwgb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLQotICB0QTJEUF9TVEFUVVMgc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvQXB0eCgmcGVlcl9pbmZvX2NpZSwgcF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcywgdHJ1ZSk7Ci0gIGlmIChzdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2FuJ3QgcGFyc2UgcGVlcidzIGNhcGFiaWxpdGllczogZXJyb3IgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIHNhbXBsZSByYXRlCi0gIHNhbXBsZVJhdGUgPSBhMmRwX2FwdHhfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZTsKLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfU0FNUExFUkFURV80NDEwMCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICB9Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX1NBTVBMRVJBVEVfNDgwMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGJpdHMgcGVyIHNhbXBsZQotICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBhMmRwX2FwdHhfc291cmNlX2NhcHMuYml0c19wZXJfc2FtcGxlOwotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGNoYW5uZWwgbW9kZQotICBjaGFubmVsTW9kZSA9IGEyZHBfYXB0eF9zb3VyY2VfY2Fwcy5jaGFubmVsTW9kZSAmIHBlZXJfaW5mb19jaWUuY2hhbm5lbE1vZGU7Ci0gIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19NT05PKSB7Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICB9Ci0gIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9DSEFOTkVMU19TVEVSRU8pIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotCi0gIHN0YXR1cyA9IEEyRFBfQnVpbGRJbmZvQXB0eChBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pOwotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWZhaWw6Ci0gIC8vIFJlc3RvcmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8gPSBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHk7Ci0gIG1lbWNweShvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xywgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eSwKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlci5jYyBiL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjkyOWMyLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyIgotCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyLmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eC5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vLwotLy8gRW5jb2RlciBmb3IgYXB0WCBTb3VyY2UgQ29kZWMKLS8vCi0KLS8vCi0vLyBUaGUgYXB0WCBlbmNvZGVyIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhlIGZ1bmN0aW9ucyB0byB1c2UKLS8vCi1zdGF0aWMgY29uc3QgY2hhciogQVBUWF9FTkNPREVSX0xJQl9OQU1FID0gImxpYmFwdFhfZW5jb2Rlci5zbyI7Ci1zdGF0aWMgdm9pZCogYXB0eF9lbmNvZGVyX2xpYl9oYW5kbGUgPSBOVUxMOwotCi1zdGF0aWMgY29uc3QgY2hhciogQVBUWF9FTkNPREVSX0lOSVRfTkFNRSA9ICJhcHR4YnRlbmNfaW5pdCI7Ci10eXBlZGVmIGludCAoKnRBUFRYX0VOQ09ERVJfSU5JVCkodm9pZCogc3RhdGUsIHNob3J0IGVuZGlhbik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBBUFRYX0VOQ09ERVJfRU5DT0RFX1NURVJFT19OQU1FID0gImFwdHhidGVuY19lbmNvZGVzdGVyZW8iOwotdHlwZWRlZiBpbnQgKCp0QVBUWF9FTkNPREVSX0VOQ09ERV9TVEVSRU8pKHZvaWQqIHN0YXRlLCB2b2lkKiBwY21MLCB2b2lkKiBwY21SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlcik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBBUFRYX0VOQ09ERVJfU0laRU9GX1BBUkFNU19OQU1FID0gIlNpemVvZkFwdHhidGVuYyI7Ci10eXBlZGVmIGludCAoKnRBUFRYX0VOQ09ERVJfU0laRU9GX1BBUkFNUykodm9pZCk7Ci0KLXN0YXRpYyB0QVBUWF9FTkNPREVSX0lOSVQgYXB0eF9lbmNvZGVyX2luaXRfZnVuYzsKLXN0YXRpYyB0QVBUWF9FTkNPREVSX0VOQ09ERV9TVEVSRU8gYXB0eF9lbmNvZGVyX2VuY29kZV9zdGVyZW9fZnVuYzsKLXN0YXRpYyB0QVBUWF9FTkNPREVSX1NJWkVPRl9QQVJBTVMgYXB0eF9lbmNvZGVyX3NpemVvZl9wYXJhbXNfZnVuYzsKLQotLy8gb2Zmc2V0Ci0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSNkZWZpbmUgQTJEUF9BUFRYX09GRlNFVCAoQVZEVF9NRURJQV9PRkZTRVQgKyAxKQotI2Vsc2UKLS8vIG5vIFJUUCBoZWFkZXIgZm9yIGFwdFggY2xhc3NpYwotI2RlZmluZSBBMkRQX0FQVFhfT0ZGU0VUIChBVkRUX01FRElBX09GRlNFVCAtIEFWRFRfTUVESUFfSERSX1NJWkUpCi0jZW5kaWYKLQotI2RlZmluZSBBMkRQX0FQVFhfTUFYX1BDTV9CWVRFU19QRVJfUkVBRCA0MDk2Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDY0X3Qgc2xlZXBfdGltZV9uczsKLSAgdWludDMyX3QgcGNtX3JlYWRzOwotICB1aW50MzJfdCBwY21fYnl0ZXNfcGVyX3JlYWQ7Ci0gIHVpbnQzMl90IGFwdHhfYnl0ZXM7Ci0gIHVpbnQzMl90IGZyYW1lX3NpemVfY291bnRlcjsKLX0gdEFQVFhfRlJBTUlOR19QQVJBTVM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDY0X3Qgc2Vzc2lvbl9zdGFydF91czsKLQotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9wYWNrZXRzOwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkc19jb3VudDsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZF9ieXRlczsKLQotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHM7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkc19jb3VudDsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRfYnl0ZXM7Ci19IGEyZHBfYXB0eF9lbmNvZGVyX3N0YXRzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2s7Ci0gIGEyZHBfc291cmNlX2VucXVldWVfY2FsbGJhY2tfdCBlbnF1ZXVlX2NhbGxiYWNrOwotCi0gIGJvb2wgdXNlX1NDTVNfVDsKLSAgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TIHBlZXJfcGFyYW1zOwotICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAgICAvLyBUaW1lc3RhbXAgZm9yIHRoZSBBMkRQIGZyYW1lcwotCi0gIHRBMkRQX0ZFRURJTkdfUEFSQU1TIGZlZWRpbmdfcGFyYW1zOwotICB0QVBUWF9GUkFNSU5HX1BBUkFNUyBmcmFtaW5nX3BhcmFtczsKLSAgdm9pZCogYXB0eF9lbmNvZGVyX3N0YXRlOwotICBhMmRwX2FwdHhfZW5jb2Rlcl9zdGF0c190IHN0YXRzOwotfSB0QTJEUF9BUFRYX0VOQ09ERVJfQ0I7Ci0KLXN0YXRpYyB0QTJEUF9BUFRYX0VOQ09ERVJfQ0IgYTJkcF9hcHR4X2VuY29kZXJfY2I7Ci0KLXN0YXRpYyB2b2lkIGEyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlcl91cGRhdGUoQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9yZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX2NvbmZpZ191cGRhdGVkKTsKLXN0YXRpYyB2b2lkIGFwdHhfaW5pdF9mcmFtaW5nX3BhcmFtcyh0QVBUWF9GUkFNSU5HX1BBUkFNUyogZnJhbWluZ19wYXJhbXMpOwotc3RhdGljIHZvaWQgYXB0eF91cGRhdGVfZnJhbWluZ19wYXJhbXModEFQVFhfRlJBTUlOR19QQVJBTVMqIGZyYW1pbmdfcGFyYW1zKTsKLXN0YXRpYyBzaXplX3QgYXB0eF9lbmNvZGVfMTZiaXQodEFQVFhfRlJBTUlOR19QQVJBTVMqIGZyYW1pbmdfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGRhdGFfb3V0X2luZGV4LCB1aW50MTZfdCogZGF0YTE2X2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX291dCk7Ci0KLWJvb2wgQTJEUF9WZW5kb3JMb2FkRW5jb2RlckFwdHgodm9pZCkgewotICBpZiAoYXB0eF9lbmNvZGVyX2xpYl9oYW5kbGUgIT0gTlVMTCkgcmV0dXJuIHRydWU7ICAvLyBBbHJlYWR5IGxvYWRlZAotCi0gIC8vIE9wZW4gdGhlIGVuY29kZXIgbGlicmFyeQotICBhcHR4X2VuY29kZXJfbGliX2hhbmRsZSA9IGRsb3BlbihBUFRYX0VOQ09ERVJfTElCX05BTUUsIFJUTERfTk9XKTsKLSAgaWYgKGFwdHhfZW5jb2Rlcl9saWJfaGFuZGxlID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3Qgb3BlbiBhcHRYIGVuY29kZXIgbGlicmFyeSAlczogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgQVBUWF9FTkNPREVSX0xJQl9OQU1FLCBkbGVycm9yKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGFwdHhfZW5jb2Rlcl9pbml0X2Z1bmMgPSAodEFQVFhfRU5DT0RFUl9JTklUKWRsc3ltKGFwdHhfZW5jb2Rlcl9saWJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFRYX0VOQ09ERVJfSU5JVF9OQU1FKTsKLSAgaWYgKGFwdHhfZW5jb2Rlcl9pbml0X2Z1bmMgPT0gTlVMTCkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBmaW5kIGZ1bmN0aW9uICclcycgaW4gdGhlIGVuY29kZXIgbGlicmFyeTogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgQVBUWF9FTkNPREVSX0lOSVRfTkFNRSwgZGxlcnJvcigpKTsKLSAgICBBMkRQX1ZlbmRvclVubG9hZEVuY29kZXJBcHR4KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYXB0eF9lbmNvZGVyX2VuY29kZV9zdGVyZW9fZnVuYyA9ICh0QVBUWF9FTkNPREVSX0VOQ09ERV9TVEVSRU8pZGxzeW0oCi0gICAgICBhcHR4X2VuY29kZXJfbGliX2hhbmRsZSwgQVBUWF9FTkNPREVSX0VOQ09ERV9TVEVSRU9fTkFNRSk7Ci0gIGlmIChhcHR4X2VuY29kZXJfZW5jb2RlX3N0ZXJlb19mdW5jID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBmdW5jdGlvbiAnJXMnIGluIHRoZSBlbmNvZGVyIGxpYnJhcnk6ICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIEFQVFhfRU5DT0RFUl9FTkNPREVfU1RFUkVPX05BTUUsIGRsZXJyb3IoKSk7Ci0gICAgQTJEUF9WZW5kb3JVbmxvYWRFbmNvZGVyQXB0eCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGFwdHhfZW5jb2Rlcl9zaXplb2ZfcGFyYW1zX2Z1bmMgPSAodEFQVFhfRU5DT0RFUl9TSVpFT0ZfUEFSQU1TKWRsc3ltKAotICAgICAgYXB0eF9lbmNvZGVyX2xpYl9oYW5kbGUsIEFQVFhfRU5DT0RFUl9TSVpFT0ZfUEFSQU1TX05BTUUpOwotICBpZiAoYXB0eF9lbmNvZGVyX3NpemVvZl9wYXJhbXNfZnVuYyA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGZpbmQgZnVuY3Rpb24gJyVzJyBpbiB0aGUgZW5jb2RlciBsaWJyYXJ5OiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBBUFRYX0VOQ09ERVJfU0laRU9GX1BBUkFNU19OQU1FLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkRW5jb2RlckFwdHgoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBMkRQX1ZlbmRvclVubG9hZEVuY29kZXJBcHR4KHZvaWQpIHsKLSAgYXB0eF9lbmNvZGVyX2luaXRfZnVuYyA9IE5VTEw7Ci0gIGFwdHhfZW5jb2Rlcl9lbmNvZGVfc3RlcmVvX2Z1bmMgPSBOVUxMOwotICBhcHR4X2VuY29kZXJfc2l6ZW9mX3BhcmFtc19mdW5jID0gTlVMTDsKLQotICBpZiAoYXB0eF9lbmNvZGVyX2xpYl9oYW5kbGUgIT0gTlVMTCkgewotICAgIGRsY2xvc2UoYXB0eF9lbmNvZGVyX2xpYl9oYW5kbGUpOwotICAgIGFwdHhfZW5jb2Rlcl9saWJfaGFuZGxlID0gTlVMTDsKLSAgfQotfQotCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlcl9pbml0KAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgIGEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCByZWFkX2NhbGxiYWNrLAotICAgIGEyZHBfc291cmNlX2VucXVldWVfY2FsbGJhY2tfdCBlbnF1ZXVlX2NhbGxiYWNrKSB7Ci0gIG1lbXNldCgmYTJkcF9hcHR4X2VuY29kZXJfY2IsIDAsIHNpemVvZihhMmRwX2FwdHhfZW5jb2Rlcl9jYikpOwotCi0gIGEyZHBfYXB0eF9lbmNvZGVyX2NiLnN0YXRzLnNlc3Npb25fc3RhcnRfdXMgPQotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0KLSAgYTJkcF9hcHR4X2VuY29kZXJfY2IucmVhZF9jYWxsYmFjayA9IHJlYWRfY2FsbGJhY2s7Ci0gIGEyZHBfYXB0eF9lbmNvZGVyX2NiLmVucXVldWVfY2FsbGJhY2sgPSBlbnF1ZXVlX2NhbGxiYWNrOwotICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi5wZWVyX3BhcmFtcyA9ICpwX3BlZXJfcGFyYW1zOwotICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi50aW1lc3RhbXAgPSAwOwotCi0gIC8qIGFwdFggZW5jb2RlciBjb25maWcgKi8KLSAgYTJkcF9hcHR4X2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IGZhbHNlOyAgLy8gVE9ETzogc2hvdWxkIGJlIGEgcGFyYW1ldGVyCi0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgYTJkcF9hcHR4X2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IHRydWU7Ci0jZW5kaWYKLQotICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi5hcHR4X2VuY29kZXJfc3RhdGUgPQotICAgICAgb3NpX21hbGxvYyhhcHR4X2VuY29kZXJfc2l6ZW9mX3BhcmFtc19mdW5jKCkpOwotICBpZiAoYTJkcF9hcHR4X2VuY29kZXJfY2IuYXB0eF9lbmNvZGVyX3N0YXRlICE9IE5VTEwpIHsKLSAgICBhcHR4X2VuY29kZXJfaW5pdF9mdW5jKGEyZHBfYXB0eF9lbmNvZGVyX2NiLmFwdHhfZW5jb2Rlcl9zdGF0ZSwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCIlczogQ2Fubm90IGFsbG9jYXRlIGFwdFggZW5jb2RlciBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBOT1RFOiBJZ25vcmUgdGhlIHJlc3RhcnRfaW5wdXQgLyByZXN0YXJ0X291dHB1dCBmbGFncyAtIHRoaXMgaW5pdGl6YXRpb24KLSAgLy8gaGFwcGVucyB3aGVuIHRoZSBhdWRpbyBzZXNzaW9uIGlzIChyZSlzdGFydGVkLgotICBib29sIHJlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGEyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlcl91cGRhdGUoYTJkcF9jb2RlY19jb25maWcsICZyZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0YXJ0X291dHB1dCwgJmNvbmZpZ191cGRhdGVkKTsKLX0KLQotLy8gVXBkYXRlIHRoZSBBMkRQIGFwdFggZW5jb2Rlci4KLS8vIHxhMmRwX2NvZGVjX2NvbmZpZ3wgaXMgdGhlIEEyRFAgY29kZWMgdG8gdXNlIGZvciB0aGUgdXBkYXRlLgotc3RhdGljIHZvaWQgYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyX3VwZGF0ZShBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfY29uZmlnX3VwZGF0ZWQpIHsKLSAgdWludDhfdCBjb2RlY19pbmZvW0FWRFRfQ09ERUNfU0laRV07Ci0KLSAgKnBfcmVzdGFydF9pbnB1dCA9IGZhbHNlOwotICAqcF9yZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICAqcF9jb25maWdfdXBkYXRlZCA9IGZhbHNlOwotICBpZiAoIWEyZHBfY29kZWNfY29uZmlnLT5jb3B5T3V0T3RhQ29kZWNDb25maWcoY29kZWNfaW5mbykpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogQ2Fubm90IHVwZGF0ZSB0aGUgY29kZWMgZW5jb2RlciBmb3IgJXM6ICIKLSAgICAgICAgImludmFsaWQgY29kZWMgY29uZmlnIiwKLSAgICAgICAgX19mdW5jX18sIGEyZHBfY29kZWNfY29uZmlnLT5uYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyA9IGNvZGVjX2luZm87Ci0KLSAgLy8gVGhlIGZlZWRpbmcgcGFyYW1ldGVycwotICB0QTJEUF9GRUVESU5HX1BBUkFNUyogcF9mZWVkaW5nX3BhcmFtcyA9ICZhMmRwX2FwdHhfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtczsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+c2FtcGxlX3JhdGUgPQotICAgICAgQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVBcHR4KHBfY29kZWNfaW5mbyk7Ci0gIHBfZmVlZGluZ19wYXJhbXMtPmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBhMmRwX2NvZGVjX2NvbmZpZy0+Z2V0QXVkaW9CaXRzUGVyU2FtcGxlKCk7Ci0gIHBfZmVlZGluZ19wYXJhbXMtPmNoYW5uZWxfY291bnQgPQotICAgICAgQTJEUF9WZW5kb3JHZXRUcmFja0NoYW5uZWxDb3VudEFwdHgocF9jb2RlY19pbmZvKTsKLSAgTE9HX0lORk8oIiVzOiBzYW1wbGVfcmF0ZT0ldSBiaXRzX3Blcl9zYW1wbGU9JXUgY2hhbm5lbF9jb3VudD0ldSIsIF9fZnVuY19fLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5jaGFubmVsX2NvdW50KTsKLSAgYTJkcF92ZW5kb3JfYXB0eF9mZWVkaW5nX3Jlc2V0KCk7Ci19Ci0KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyX2NsZWFudXAodm9pZCkgewotICBvc2lfZnJlZShhMmRwX2FwdHhfZW5jb2Rlcl9jYi5hcHR4X2VuY29kZXJfc3RhdGUpOwotICBtZW1zZXQoJmEyZHBfYXB0eF9lbmNvZGVyX2NiLCAwLCBzaXplb2YoYTJkcF9hcHR4X2VuY29kZXJfY2IpKTsKLX0KLQotLy8KLS8vIEluaXRpYWxpemUgdGhlIGZyYW1pbmcgcGFyYW1ldGVycywgYW5kIHNldCB0aG9zZSB0aGF0IGRvbid0IGNoYW5nZQotLy8gd2hpbGUgc3RyZWFtaW5nIChlLmcuLCAnc2xlZXBfdGltZV9ucycpLgotLy8KLXN0YXRpYyB2b2lkIGFwdHhfaW5pdF9mcmFtaW5nX3BhcmFtcyh0QVBUWF9GUkFNSU5HX1BBUkFNUyogZnJhbWluZ19wYXJhbXMpIHsKLSAgZnJhbWluZ19wYXJhbXMtPnNsZWVwX3RpbWVfbnMgPSAwOwotICBmcmFtaW5nX3BhcmFtcy0+cGNtX3JlYWRzID0gMDsKLSAgZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZCA9IDA7Ci0gIGZyYW1pbmdfcGFyYW1zLT5hcHR4X2J5dGVzID0gMDsKLSAgZnJhbWluZ19wYXJhbXMtPmZyYW1lX3NpemVfY291bnRlciA9IDA7Ci0KLSAgaWYgKGEyZHBfYXB0eF9lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLnNhbXBsZV9yYXRlID09IDQ4MDAwKSB7Ci0gICAgaWYgKGEyZHBfYXB0eF9lbmNvZGVyX2NiLnVzZV9TQ01TX1QpIHsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5zbGVlcF90aW1lX25zID0gMTMwMDAwMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5zbGVlcF90aW1lX25zID0gMTQwMDAwMDA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEFzc3VtZSB0aGUgc2FtcGxlIHJhdGUgaXMgNDQxMDAKLSAgICBpZiAoYTJkcF9hcHR4X2VuY29kZXJfY2IudXNlX1NDTVNfVCkgewotICAgICAgZnJhbWluZ19wYXJhbXMtPnNsZWVwX3RpbWVfbnMgPSAxNDAwMDAwMDsKLSAgICB9IGVsc2UgewotICAgICAgZnJhbWluZ19wYXJhbXMtPnNsZWVwX3RpbWVfbnMgPSAxNTAwMDAwMDsKLSAgICB9Ci0gIH0KLQotICBMT0dfSU5GTygiJXM6IHNsZWVwX3RpbWVfbnMgPSAlIiBQUkl1NjQsIF9fZnVuY19fLAotICAgICAgICAgICBmcmFtaW5nX3BhcmFtcy0+c2xlZXBfdGltZV9ucyk7Ci19Ci0KLS8vCi0vLyBTZXQgZnJhbWUgc2l6ZSBhbmQgdHJhbnNtaXNzaW9uIGludGVydmFsIG5lZWRlZCB0byBzdHJlYW0gdGhlIHJlcXVpcmVkCi0vLyBzYW1wbGUgcmF0ZSB1c2luZyAyLURINSBwYWNrZXRzIGZvciBhcHRYIGFuZCAyLURIMyBwYWNrZXRzIGZvciBhcHRYLUxMLgotLy8gV2l0aCBTQ01TLVQgZW5hYmxlZCB3ZSBuZWVkIHRvIHJlc2VydmUgcm9vbSBmb3IgZXh0cmEgaGVhZGVycyBhZGRlZCBsYXRlci4KLS8vIFBhY2tldHMgYXJlIGFsd2F5cyBzZW50IGF0IGVxdWFscyB0aW1lIGludGVydmFscyBidXQgdG8gYWNoaWV2ZSB0aGUKLS8vIHJlcXVpcmVkIHNhbXBsZSByYXRlLCB0aGUgZnJhbWUgc2l6ZSBuZWVkcyB0byBjaGFuZ2Ugb24gb2NjYXNpb24uCi0vLwotLy8gQWxzbyBuZWVkIHRvIHNwZWNpZnkgaG93IG1hbnkgb2YgdGhlIHJlcXVpcmVkIFBDTSBzYW1wbGVzIGFyZSByZWFkIGF0IGEKLS8vIHRpbWU6Ci0vLyAgICAgYXB0eF9ieXRlcyA9IHBjbV9yZWFkcyAqIHBjbV9ieXRlc19wZXJfcmVhZCAvIDQKLS8vIGFuZAotLy8gICAgIG51bWJlciBvZiBhcHRYIHNhbXBsZXMgcHJvZHVjZWQgPSBwY21fYnl0ZXNfcGVyX3JlYWQgLyAxNgotLy8KLXN0YXRpYyB2b2lkIGFwdHhfdXBkYXRlX2ZyYW1pbmdfcGFyYW1zKHRBUFRYX0ZSQU1JTkdfUEFSQU1TKiBmcmFtaW5nX3BhcmFtcykgewotICBpZiAoYTJkcF9hcHR4X2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuc2FtcGxlX3JhdGUgPT0gNDgwMDApIHsKLSAgICBpZiAoYTJkcF9hcHR4X2VuY29kZXJfY2IudXNlX1NDTVNfVCkgewotICAgICAgZnJhbWluZ19wYXJhbXMtPmFwdHhfYnl0ZXMgPSA2MjQ7Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX2J5dGVzX3Blcl9yZWFkID0gMjA4OwotICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcyA9IDEyOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9ieXRlcyA9IDY3MjsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQgPSAyMjQ7Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX3JlYWRzID0gMTI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEFzc3VtZSB0aGUgc2FtcGxlIHJhdGUgaXMgNDQxMDAKLSAgICBpZiAoYTJkcF9hcHR4X2VuY29kZXJfY2IudXNlX1NDTVNfVCkgewotICAgICAgaWYgKCsrZnJhbWluZ19wYXJhbXMtPmZyYW1lX3NpemVfY291bnRlciA8IDIwKSB7Ci0gICAgICAgIGZyYW1pbmdfcGFyYW1zLT5hcHR4X2J5dGVzID0gNjE2OwotICAgICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX2J5dGVzX3Blcl9yZWFkID0gMjI0OwotICAgICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX3JlYWRzID0gMTE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9ieXRlcyA9IDY0NDsKLSAgICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZCA9IDM2ODsKLSAgICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcyA9IDc7Ci0gICAgICAgIGZyYW1pbmdfcGFyYW1zLT5mcmFtZV9zaXplX2NvdW50ZXIgPSAwOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoKytmcmFtaW5nX3BhcmFtcy0+ZnJhbWVfc2l6ZV9jb3VudGVyIDwgOCkgewotICAgICAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9ieXRlcyA9IDY2MDsKLSAgICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZCA9IDI0MDsKLSAgICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcyA9IDExOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWluZ19wYXJhbXMtPmFwdHhfYnl0ZXMgPSA2NzI7Ci0gICAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQgPSAyMjQ7Ci0gICAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fcmVhZHMgPSAxMjsKLSAgICAgICAgZnJhbWluZ19wYXJhbXMtPmZyYW1lX3NpemVfY291bnRlciA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBzbGVlcF90aW1lX25zID0gJSIgUFJJdTY0Ci0gICAgICAgICAgICAgICIgYXB0eF9ieXRlcyA9ICV1ICIKLSAgICAgICAgICAgICAgInBjbV9ieXRlc19wZXJfcmVhZCA9ICV1IHBjbV9yZWFkcyA9ICV1IGZyYW1lX3NpemVfY291bnRlciA9ICV1IiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIGZyYW1pbmdfcGFyYW1zLT5zbGVlcF90aW1lX25zLAotICAgICAgICAgICAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9ieXRlcywgZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZCwKLSAgICAgICAgICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcywgZnJhbWluZ19wYXJhbXMtPmZyYW1lX3NpemVfY291bnRlcik7Ci19Ci0KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9mZWVkaW5nX3Jlc2V0KHZvaWQpIHsKLSAgYXB0eF9pbml0X2ZyYW1pbmdfcGFyYW1zKCZhMmRwX2FwdHhfZW5jb2Rlcl9jYi5mcmFtaW5nX3BhcmFtcyk7Ci19Ci0KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9mZWVkaW5nX2ZsdXNoKHZvaWQpIHsKLSAgYXB0eF9pbml0X2ZyYW1pbmdfcGFyYW1zKCZhMmRwX2FwdHhfZW5jb2Rlcl9jYi5mcmFtaW5nX3BhcmFtcyk7Ci19Ci0KLXVpbnQ2NF90IGEyZHBfdmVuZG9yX2FwdHhfZ2V0X2VuY29kZXJfaW50ZXJ2YWxfbXModm9pZCkgewotICByZXR1cm4gYTJkcF9hcHR4X2VuY29kZXJfY2IuZnJhbWluZ19wYXJhbXMuc2xlZXBfdGltZV9ucyAvICgxMDAwICogMTAwMCk7Ci19Ci0KLWludCBhMmRwX3ZlbmRvcl9hcHR4X2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSgpIHsKLSAgcmV0dXJuIGEyZHBfYXB0eF9lbmNvZGVyX2NiLnBlZXJfcGFyYW1zLnBlZXJfbXR1OwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfc2VuZF9mcmFtZXModWludDY0X3QgdGltZXN0YW1wX3VzKSB7Ci0gIHRBUFRYX0ZSQU1JTkdfUEFSQU1TKiBmcmFtaW5nX3BhcmFtcyA9ICZhMmRwX2FwdHhfZW5jb2Rlcl9jYi5mcmFtaW5nX3BhcmFtczsKLQotICAvLyBQcmVwYXJlIHRoZSBwYWNrZXQgdG8gc2VuZAotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhCVF9ERUZBVUxUX0JVRkZFUl9TSVpFKTsKLSAgcF9idWYtPm9mZnNldCA9IEEyRFBfQVBUWF9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSAwOwotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotCi0gIHVpbnQ4X3QqIGVuY29kZWRfcHRyID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpOwotICBlbmNvZGVkX3B0ciArPSBwX2J1Zi0+b2Zmc2V0OwotCi0gIGFwdHhfdXBkYXRlX2ZyYW1pbmdfcGFyYW1zKGZyYW1pbmdfcGFyYW1zKTsKLQotICAvLwotICAvLyBSZWFkIHRoZSBQQ00gZGF0YSBhbmQgZW5jb2RlIGl0Ci0gIC8vCi0gIHVpbnQxNl90IHJlYWRfYnVmZmVyMTZbQTJEUF9BUFRYX01BWF9QQ01fQllURVNfUEVSX1JFQUQgLyBzaXplb2YodWludDE2X3QpXTsKLSAgdWludDMyX3QgZXhwZWN0ZWRfcmVhZF9ieXRlcyA9Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX3JlYWRzICogZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZDsKLSAgc2l6ZV90IGVuY29kZWRfcHRyX2luZGV4ID0gMDsKLSAgc2l6ZV90IHBjbV9ieXRlc19lbmNvZGVkID0gMDsKLSAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IDA7Ci0KLSAgYTJkcF9hcHR4X2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9wYWNrZXRzKys7Ci0gIGEyZHBfYXB0eF9lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQrKzsKLSAgYTJkcF9hcHR4X2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkX2J5dGVzICs9Ci0gICAgICBleHBlY3RlZF9yZWFkX2J5dGVzOwotCi0gIExPR19WRVJCT1NFKCIlczogUENNIHJlYWQgb2Ygc2l6ZSAldSIsIF9fZnVuY19fLCBleHBlY3RlZF9yZWFkX2J5dGVzKTsKLSAgYnl0ZXNfcmVhZCA9IGEyZHBfYXB0eF9lbmNvZGVyX2NiLnJlYWRfY2FsbGJhY2soKHVpbnQ4X3QqKXJlYWRfYnVmZmVyMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3JlYWRfYnl0ZXMpOwotICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzICs9IGJ5dGVzX3JlYWQ7Ci0gIGlmIChieXRlc19yZWFkIDwgZXhwZWN0ZWRfcmVhZF9ieXRlcykgewotICAgIExPR19XQVJOKCIlczogdW5kZXJmbG93IGF0IFBDTSByZWFkaW5nOiByZWFkICV1IGJ5dGVzIGluc3RlYWQgb2YgJXUiLAotICAgICAgICAgICAgIF9fZnVuY19fLCBieXRlc19yZWFkLCBleHBlY3RlZF9yZWFkX2J5dGVzKTsKLSAgICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cysrOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYTJkcF9hcHR4X2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZHNfY291bnQrKzsKLQotICBmb3IgKHVpbnQzMl90IHJlYWRzID0gMCwgb2Zmc2V0ID0gMDsgcmVhZHMgPCBmcmFtaW5nX3BhcmFtcy0+cGNtX3JlYWRzOwotICAgICAgIHJlYWRzKyssIG9mZnNldCArPQotICAgICAgICAgICAgICAgIChmcmFtaW5nX3BhcmFtcy0+cGNtX2J5dGVzX3Blcl9yZWFkIC8gc2l6ZW9mKHVpbnQxNl90KSkpIHsKLSAgICBwY21fYnl0ZXNfZW5jb2RlZCArPSBhcHR4X2VuY29kZV8xNmJpdChmcmFtaW5nX3BhcmFtcywgJmVuY29kZWRfcHRyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyMTYgKyBvZmZzZXQsIGVuY29kZWRfcHRyKTsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBlbmNvZGVkIGJ5dGVzCi0gIGNvbnN0IGludCBDT01QUkVTU0lPTl9SQVRJTyA9IDQ7Ci0gIHNpemVfdCBlbmNvZGVkX2J5dGVzID0gcGNtX2J5dGVzX2VuY29kZWQgLyBDT01QUkVTU0lPTl9SQVRJTzsKLSAgcF9idWYtPmxlbiArPSBlbmNvZGVkX2J5dGVzOwotICBMT0dfVkVSQk9TRSgiJXM6IGVuY29kZWQgJXp1IFBDTSBieXRlcyB0byAlenUiLCBfX2Z1bmNfXywgcGNtX2J5dGVzX2VuY29kZWQsCi0gICAgICAgICAgICAgIGVuY29kZWRfYnl0ZXMpOwotCi0gIC8vIFVwZGF0ZSB0aGUgUlRQIHRpbWVzdGFtcAotICAqKCh1aW50MzJfdCopKHBfYnVmICsgMSkpID0gYTJkcF9hcHR4X2VuY29kZXJfY2IudGltZXN0YW1wOwotICBjb25zdCB1aW50OF90IEJZVEVTX1BFUl9GUkFNRSA9IDI7Ci0gIHVpbnQzMl90IHJ0cF90aW1lc3RhbXAgPQotICAgICAgKHBjbV9ieXRlc19lbmNvZGVkIC8gYTJkcF9hcHR4X2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuY2hhbm5lbF9jb3VudCkgLwotICAgICAgQllURVNfUEVSX0ZSQU1FOwotICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi50aW1lc3RhbXAgKz0gcnRwX3RpbWVzdGFtcDsKLQotICBpZiAocF9idWYtPmxlbiA+IDApIHsKLSAgICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi5lbnF1ZXVlX2NhbGxiYWNrKHBfYnVmLCAxLCBieXRlc19yZWFkKTsKLSAgfSBlbHNlIHsKLSAgICBhMmRwX2FwdHhfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cysrOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfQotfQotCi1zdGF0aWMgc2l6ZV90IGFwdHhfZW5jb2RlXzE2Yml0KHRBUFRYX0ZSQU1JTkdfUEFSQU1TKiBmcmFtaW5nX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBkYXRhX291dF9pbmRleCwgdWludDE2X3QqIGRhdGExNl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YV9vdXQpIHsKLSAgc2l6ZV90IHBjbV9ieXRlc19lbmNvZGVkID0gMDsKLSAgc2l6ZV90IGZyYW1lID0gMDsKLQotICBmb3IgKHNpemVfdCBhcHR4X3NhbXBsZXMgPSAwOwotICAgICAgIGFwdHhfc2FtcGxlcyA8IGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQgLyAxNjsgYXB0eF9zYW1wbGVzKyspIHsKLSAgICB1aW50MzJfdCBwY21MWzRdOwotICAgIHVpbnQzMl90IHBjbVJbNF07Ci0gICAgdWludDE2X3QgZW5jb2RlZF9zYW1wbGVbMl07Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMCwgaiA9IGZyYW1lOyBpIDwgNDsgaSsrLCBqKyspIHsKLSAgICAgIHBjbUxbaV0gPSAodWludDE2X3QpICogKGRhdGExNl9pbiArICgyICogaikpOwotICAgICAgcGNtUltpXSA9ICh1aW50MTZfdCkgKiAoZGF0YTE2X2luICsgKCgyICogaikgKyAxKSk7Ci0gICAgfQotCi0gICAgYXB0eF9lbmNvZGVyX2VuY29kZV9zdGVyZW9fZnVuYyhhMmRwX2FwdHhfZW5jb2Rlcl9jYi5hcHR4X2VuY29kZXJfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGNtTCwgJnBjbVIsICZlbmNvZGVkX3NhbXBsZSk7Ci0KLSAgICBkYXRhX291dFsqZGF0YV9vdXRfaW5kZXggKyAwXSA9ICh1aW50OF90KSgoZW5jb2RlZF9zYW1wbGVbMF0gPj4gOCkgJiAweGZmKTsKLSAgICBkYXRhX291dFsqZGF0YV9vdXRfaW5kZXggKyAxXSA9ICh1aW50OF90KSgoZW5jb2RlZF9zYW1wbGVbMF0gPj4gMCkgJiAweGZmKTsKLSAgICBkYXRhX291dFsqZGF0YV9vdXRfaW5kZXggKyAyXSA9ICh1aW50OF90KSgoZW5jb2RlZF9zYW1wbGVbMV0gPj4gOCkgJiAweGZmKTsKLSAgICBkYXRhX291dFsqZGF0YV9vdXRfaW5kZXggKyAzXSA9ICh1aW50OF90KSgoZW5jb2RlZF9zYW1wbGVbMV0gPj4gMCkgJiAweGZmKTsKLQotICAgIGZyYW1lICs9IDQ7Ci0gICAgcGNtX2J5dGVzX2VuY29kZWQgKz0gMTY7Ci0gICAgKmRhdGFfb3V0X2luZGV4ICs9IDQ7Ci0gIH0KLQotICByZXR1cm4gcGNtX2J5dGVzX2VuY29kZWQ7Ci19Ci0KLXZvaWQgQTJkcENvZGVjQ29uZmlnQXB0eDo6ZGVidWdfY29kZWNfZHVtcChpbnQgZmQpIHsKLSAgYTJkcF9hcHR4X2VuY29kZXJfc3RhdHNfdCogc3RhdHMgPSAmYTJkcF9hcHR4X2VuY29kZXJfY2Iuc3RhdHM7Ci0KLSAgQTJkcENvZGVjQ29uZmlnOjpkZWJ1Z19jb2RlY19kdW1wKGZkKTsKLQotICBkcHJpbnRmKGZkLCAiICBFbmNvZGVyIGludGVydmFsIChtcyk6ICUiIFBSSXU2NCAiXG4iLAotICAgICAgICAgIGEyZHBfdmVuZG9yX2FwdHhfZ2V0X2VuY29kZXJfaW50ZXJ2YWxfbXMoKSk7Ci0gIGRwcmludGYoZmQsICIgIEVmZmVjdGl2ZSBNVFU6ICVkXG4iLAotICAgICAgICAgIGEyZHBfdmVuZG9yX2FwdHhfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCkpOwotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIFBhY2tldCBjb3VudHMgKGV4cGVjdGVkL2Ryb3BwZWQpICAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dVxuIiwKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9wYWNrZXRzLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cyk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBQQ00gcmVhZCBjb3VudHMgKGV4cGVjdGVkL2FjdHVhbCkgICAgICAgICAgICAgICAgICAgICAgIDogJXp1IC8gIgotICAgICAgICAgICIlenVcbiIsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRzX2NvdW50KTsKLQotICBkcHJpbnRmKGZkLAotICAgICAgICAgICIgIFBDTSByZWFkIGJ5dGVzIChleHBlY3RlZC9hY3R1YWwpICAgICAgICAgICAgICAgICAgICAgICAgOiAlenUgLyAiCi0gICAgICAgICAgIiV6dVxuIiwKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkX2J5dGVzLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfYXB0eF9oZC5jYyBiL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfYXB0eF9oZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxNzk4NDkuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9hcHR4X2hkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGhlbHAgYnVpbGQgYW5kIHBhcnNlIHRoZSBhcHRYLUhEIENvZGVjIEluZm9ybWF0aW9uCi0gKiAgRWxlbWVudCBhbmQgTWVkaWEgUGF5bG9hZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImEyZHBfdmVuZG9yX2FwdHhfaGQiCi0KLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9hcHR4X2hkLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyLmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJidGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLy8gZGF0YSB0eXBlIGZvciB0aGUgYXB0WC1IRCBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHZlbmRvcklkOwotICB1aW50MTZfdCBjb2RlY0lkOyAgICAvKiBDb2RlYyBJRCBmb3IgYXB0WC1IRCAqLwotICB1aW50OF90IHNhbXBsZVJhdGU7ICAvKiBTYW1wbGluZyBGcmVxdWVuY3kgKi8KLSAgdWludDhfdCBjaGFubmVsTW9kZTsgLyogU1RFUkVPL0RVQUwvTU9OTyAqLwotICB1aW50OF90IGFjbF9zcHJpbnRfcmVzZXJ2ZWQwOwotICB1aW50OF90IGFjbF9zcHJpbnRfcmVzZXJ2ZWQxOwotICB1aW50OF90IGFjbF9zcHJpbnRfcmVzZXJ2ZWQyOwotICB1aW50OF90IGFjbF9zcHJpbnRfcmVzZXJ2ZWQzOwotICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgYml0c19wZXJfc2FtcGxlOwotfSB0QTJEUF9BUFRYX0hEX0NJRTsKLQotLyogYXB0WC1IRCBTb3VyY2UgY29kZWMgY2FwYWJpbGl0aWVzICovCi1zdGF0aWMgY29uc3QgdEEyRFBfQVBUWF9IRF9DSUUgYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzID0gewotICAgIEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQsICAgICAgICAgIC8qIHZlbmRvcklkICovCi0gICAgQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCwgLyogY29kZWNJZCAqLwotICAgIChBMkRQX0FQVFhfSERfU0FNUExFUkFURV80NDEwMCB8Ci0gICAgIEEyRFBfQVBUWF9IRF9TQU1QTEVSQVRFXzQ4MDAwKSwgICAvKiBzYW1wbGVSYXRlICovCi0gICAgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTywgICAgICAvKiBjaGFubmVsTW9kZSAqLwotICAgIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMCwgLyogYWNsX3NwcmludF9yZXNlcnZlZDAgKi8KLSAgICBBMkRQX0FQVFhfSERfQUNMX1NQUklOVF9SRVNFUlZFRDEsIC8qIGFjbF9zcHJpbnRfcmVzZXJ2ZWQxICovCi0gICAgQTJEUF9BUFRYX0hEX0FDTF9TUFJJTlRfUkVTRVJWRUQyLCAvKiBhY2xfc3ByaW50X3Jlc2VydmVkMiAqLwotICAgIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMywgLyogYWNsX3NwcmludF9yZXNlcnZlZDMgKi8KLSAgICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0IC8qIGJpdHNfcGVyX3NhbXBsZSAqLwotfTsKLQotLyogRGVmYXVsdCBhcHRYLUhEIGNvZGVjIGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBjb25zdCB0QTJEUF9BUFRYX0hEX0NJRSBhMmRwX2FwdHhfaGRfZGVmYXVsdF9jb25maWcgPSB7Ci0gICAgQTJEUF9BUFRYX0hEX1ZFTkRPUl9JRCwgICAgICAgICAgICAvKiB2ZW5kb3JJZCAqLwotICAgIEEyRFBfQVBUWF9IRF9DT0RFQ19JRF9CTFVFVE9PVEgsICAgLyogY29kZWNJZCAqLwotICAgIEEyRFBfQVBUWF9IRF9TQU1QTEVSQVRFXzQ4MDAwLCAgICAgLyogc2FtcGxlUmF0ZSAqLwotICAgIEEyRFBfQVBUWF9IRF9DSEFOTkVMU19TVEVSRU8sICAgICAgLyogY2hhbm5lbE1vZGUgKi8KLSAgICBBMkRQX0FQVFhfSERfQUNMX1NQUklOVF9SRVNFUlZFRDAsIC8qIGFjbF9zcHJpbnRfcmVzZXJ2ZWQwICovCi0gICAgQTJEUF9BUFRYX0hEX0FDTF9TUFJJTlRfUkVTRVJWRUQxLCAvKiBhY2xfc3ByaW50X3Jlc2VydmVkMSAqLwotICAgIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMiwgLyogYWNsX3NwcmludF9yZXNlcnZlZDIgKi8KLSAgICBBMkRQX0FQVFhfSERfQUNMX1NQUklOVF9SRVNFUlZFRDMsIC8qIGFjbF9zcHJpbnRfcmVzZXJ2ZWQzICovCi0gICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCAvKiBiaXRzX3Blcl9zYW1wbGUgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSBhMmRwX2VuY29kZXJfaW50ZXJmYWNlX2FwdHhfaGQgPSB7Ci0gICAgYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyX2luaXQsCi0gICAgYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyX2NsZWFudXAsCi0gICAgYTJkcF92ZW5kb3JfYXB0eF9oZF9mZWVkaW5nX3Jlc2V0LAotICAgIGEyZHBfdmVuZG9yX2FwdHhfaGRfZmVlZGluZ19mbHVzaCwKLSAgICBhMmRwX3ZlbmRvcl9hcHR4X2hkX2dldF9lbmNvZGVyX2ludGVydmFsX21zLAotICAgIGEyZHBfdmVuZG9yX2FwdHhfaGRfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplLAotICAgIGEyZHBfdmVuZG9yX2FwdHhfaGRfc2VuZF9mcmFtZXMsCi0gICAgbnVsbHB0ciAgLy8gc2V0X3RyYW5zbWl0X3F1ZXVlX2xlbmd0aAotfTsKLQotVU5VU0VEX0FUVFIgc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5QXB0eEhkKAotICAgIGNvbnN0IHRBMkRQX0FQVFhfSERfQ0lFKiBwX2NhcCwgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgIGJvb2wgaXNfcGVlcl9jb2RlY19pbmZvKTsKLQotLy8gQnVpbGRzIHRoZSBhcHRYLUhEIE1lZGlhIENvZGVjIENhcGFiaWxpdGllcyBieXRlIHNlcXVlbmNlIGJlZ2lubmluZyBmcm9tIHRoZQotLy8gTE9TQyBvY3RldC4gfG1lZGlhX3R5cGV8IGlzIHRoZSBtZWRpYSB0eXBlIHxBVkRUX01FRElBX1RZUEVfKnwuCi0vLyB8cF9pZXwgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYLUhEIENvZGVjIEluZm9ybWF0aW9uIEVsZW1lbnQgaW5mb3JtYXRpb24uCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8LiBSZXR1cm5zIEEyRFBfU1VDQ0VTUyBvbiBzdWNjZXNzLAotLy8gb3RoZXJ3aXNlIHRoZSBjb3JyZXNwb25kaW5nIEEyRFAgZXJyb3Igc3RhdHVzIGNvZGUuCi1zdGF0aWMgdEEyRFBfU1RBVFVTIEEyRFBfQnVpbGRJbmZvQXB0eEhkKHVpbnQ4X3QgbWVkaWFfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEEyRFBfQVBUWF9IRF9DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0KSB7Ci0gIGlmIChwX2llID09IE5VTEwgfHwgcF9yZXN1bHQgPT0gTlVMTCkgewotICAgIHJldHVybiBBMkRQX0lOVkFMSURfUEFSQU1TOwotICB9Ci0KLSAgKnBfcmVzdWx0KysgPSBBMkRQX0FQVFhfSERfQ09ERUNfTEVOOwotICAqcF9yZXN1bHQrKyA9IChtZWRpYV90eXBlIDw8IDQpOwotICAqcF9yZXN1bHQrKyA9IEEyRFBfTUVESUFfQ1RfTk9OX0EyRFA7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKHBfaWUtPnZlbmRvcklkICYgMHgwMDAwMDBGRik7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKChwX2llLT52ZW5kb3JJZCAmIDB4MDAwMEZGMDApID4+IDgpOwotICAqcF9yZXN1bHQrKyA9ICh1aW50OF90KSgocF9pZS0+dmVuZG9ySWQgJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKChwX2llLT52ZW5kb3JJZCAmIDB4RkYwMDAwMDApID4+IDI0KTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkocF9pZS0+Y29kZWNJZCAmIDB4MDBGRik7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKChwX2llLT5jb2RlY0lkICYgMHhGRjAwKSA+PiA4KTsKLSAgKnBfcmVzdWx0KysgPSBwX2llLT5zYW1wbGVSYXRlIHwgcF9pZS0+Y2hhbm5lbE1vZGU7Ci0gICpwX3Jlc3VsdCsrID0gcF9pZS0+YWNsX3NwcmludF9yZXNlcnZlZDA7Ci0gICpwX3Jlc3VsdCsrID0gcF9pZS0+YWNsX3NwcmludF9yZXNlcnZlZDE7Ci0gICpwX3Jlc3VsdCsrID0gcF9pZS0+YWNsX3NwcmludF9yZXNlcnZlZDI7Ci0gICpwX3Jlc3VsdCsrID0gcF9pZS0+YWNsX3NwcmludF9yZXNlcnZlZDM7Ci0KLSAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLX0KLQotLy8gUGFyc2VzIHRoZSBhcHRYLUhEIE1lZGlhIENvZGVjIENhcGFiaWxpdGllcyBieXRlIHNlcXVlbmNlIGJlZ2lubmluZyBmcm9tIHRoZQotLy8gTE9TQyBvY3RldC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfaWV8LiBUaGUgYnl0ZSBzZXF1ZW5jZSB0byBwYXJzZSBpcwotLy8gfHBfY29kZWNfaW5mb3wuIElmIHxpc19jYXBhYmlsaXR5fCBpcyB0cnVlLCB0aGUgYnl0ZSBzZXF1ZW5jZSBpcwotLy8gY29kZWMgY2FwYWJpbGl0aWVzLCBvdGhlcndpc2UgaXMgY29kZWMgY29uZmlndXJhdGlvbi4KLS8vIFJldHVybnMgQTJEUF9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSB0aGUgY29ycmVzcG9uZGluZyBBMkRQIGVycm9yCi0vLyBzdGF0dXMgY29kZS4KLXN0YXRpYyB0QTJEUF9TVEFUVVMgQTJEUF9QYXJzZUluZm9BcHR4SGQodEEyRFBfQVBUWF9IRF9DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5KSB7Ci0gIHVpbnQ4X3QgbG9zYzsKLSAgdWludDhfdCBtZWRpYV90eXBlOwotICB0QTJEUF9DT0RFQ19UWVBFIGNvZGVjX3R5cGU7Ci0KLSAgaWYgKHBfaWUgPT0gTlVMTCB8fCBwX2NvZGVjX2luZm8gPT0gTlVMTCkgcmV0dXJuIEEyRFBfSU5WQUxJRF9QQVJBTVM7Ci0KLSAgLy8gQ2hlY2sgdGhlIGNvZGVjIGNhcGFiaWxpdHkgbGVuZ3RoCi0gIGxvc2MgPSAqcF9jb2RlY19pbmZvKys7Ci0gIGlmIChsb3NjICE9IEEyRFBfQVBUWF9IRF9DT0RFQ19MRU4pIHJldHVybiBBMkRQX1dST05HX0NPREVDOwotCi0gIG1lZGlhX3R5cGUgPSAoKnBfY29kZWNfaW5mbysrKSA+PiA0OwotICBjb2RlY190eXBlID0gKnBfY29kZWNfaW5mbysrOwotICAvKiBDaGVjayB0aGUgTWVkaWEgVHlwZSBhbmQgTWVkaWEgQ29kZWMgVHlwZSAqLwotICBpZiAobWVkaWFfdHlwZSAhPSBBVkRUX01FRElBX1RZUEVfQVVESU8gfHwKLSAgICAgIGNvZGVjX3R5cGUgIT0gQTJEUF9NRURJQV9DVF9OT05fQTJEUCkgewotICAgIHJldHVybiBBMkRQX1dST05HX0NPREVDOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhlIFZlbmRvciBJRCBhbmQgQ29kZWMgSUQgKi8KLSAgcF9pZS0+dmVuZG9ySWQgPSAoKnBfY29kZWNfaW5mbyAmIDB4MDAwMDAwRkYpIHwKLSAgICAgICAgICAgICAgICAgICAoKihwX2NvZGVjX2luZm8gKyAxKSA8PCA4ICYgMHgwMDAwRkYwMCkgfAotICAgICAgICAgICAgICAgICAgICgqKHBfY29kZWNfaW5mbyArIDIpIDw8IDE2ICYgMHgwMEZGMDAwMCkgfAotICAgICAgICAgICAgICAgICAgICgqKHBfY29kZWNfaW5mbyArIDMpIDw8IDI0ICYgMHhGRjAwMDAwMCk7Ci0gIHBfY29kZWNfaW5mbyArPSA0OwotICBwX2llLT5jb2RlY0lkID0KLSAgICAgICgqcF9jb2RlY19pbmZvICYgMHgwMEZGKSB8ICgqKHBfY29kZWNfaW5mbyArIDEpIDw8IDggJiAweEZGMDApOwotICBwX2NvZGVjX2luZm8gKz0gMjsKLSAgaWYgKHBfaWUtPnZlbmRvcklkICE9IEEyRFBfQVBUWF9IRF9WRU5ET1JfSUQgfHwKLSAgICAgIHBfaWUtPmNvZGVjSWQgIT0gQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCkgewotICAgIHJldHVybiBBMkRQX1dST05HX0NPREVDOwotICB9Ci0KLSAgcF9pZS0+Y2hhbm5lbE1vZGUgPSAqcF9jb2RlY19pbmZvICYgMHgwRjsKLSAgcF9pZS0+c2FtcGxlUmF0ZSA9ICpwX2NvZGVjX2luZm8gJiAweEYwOwotICBwX2NvZGVjX2luZm8rKzsKLQotICBwX2llLT5hY2xfc3ByaW50X3Jlc2VydmVkMCA9ICoocF9jb2RlY19pbmZvKyspOwotICBwX2llLT5hY2xfc3ByaW50X3Jlc2VydmVkMSA9ICoocF9jb2RlY19pbmZvKyspOwotICBwX2llLT5hY2xfc3ByaW50X3Jlc2VydmVkMiA9ICoocF9jb2RlY19pbmZvKyspOwotICBwX2llLT5hY2xfc3ByaW50X3Jlc2VydmVkMyA9ICoocF9jb2RlY19pbmZvKyspOwotCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgLy8gTk9URTogVGhlIGNoZWNrcyBoZXJlIGFyZSB2ZXJ5IGxpYmVyYWwuIFdlIHNob3VsZCBiZSB1c2luZyBtb3JlCi0gICAgLy8gcGVkYW50aWMgY2hlY2tzIHNwZWNpZmljIHRvIHRoZSBTUkMgb3IgU05LIGFzIHNwZWNpZmllZCBpbiB0aGUgc3BlYy4KLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPnNhbXBsZVJhdGUpID09IEEyRFBfU0VUX1pFUk9fQklUKQotICAgICAgcmV0dXJuIEEyRFBfQkFEX1NBTVBfRlJFUTsKLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gICAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLSAgfQotCi0gIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+c2FtcGxlUmF0ZSkgIT0gQTJEUF9TRVRfT05FX0JJVCkKLSAgICByZXR1cm4gQTJEUF9CQURfU0FNUF9GUkVROwotICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSAhPSBBMkRQX1NFVF9PTkVfQklUKQotICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLWJvb2wgQTJEUF9Jc1ZlbmRvclNvdXJjZUNvZGVjVmFsaWRBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FQVFhfSERfQ0lFIGNmZ19jaWU7Ci0KLSAgLyogVXNlIGEgbGliZXJhbCBjaGVjayB3aGVuIHBhcnNpbmcgdGhlIGNvZGVjIGluZm8gKi8KLSAgcmV0dXJuIChBMkRQX1BhcnNlSW5mb0FwdHhIZCgmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSkgPT0KLSAgICAgICAgICBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9BcHR4SGQoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotYm9vbCBBMkRQX0lzVmVuZG9yUGVlclNpbmtDb2RlY1ZhbGlkQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BUFRYX0hEX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9BcHR4SGQoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpID09Ci0gICAgICAgICAgQTJEUF9TVUNDRVNTKSB8fAotICAgICAgICAgKEEyRFBfUGFyc2VJbmZvQXB0eEhkKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLS8vIENoZWNrcyB3aGV0aGVyIEEyRFAgYXB0WC1IRCBjb2RlYyBjb25maWd1cmF0aW9uIG1hdGNoZXMgd2l0aCBhIGRldmljZSdzCi0vLyBjb2RlYyBjYXBhYmlsaXRpZXMuIHxwX2NhcHwgaXMgdGhlIGFwdFgtSEQgY29kZWMgY29uZmlndXJhdGlvbi4KLS8vIHxwX2NvZGVjX2luZm98IGlzIHRoZSBkZXZpY2UncyBjb2RlYyBjYXBhYmlsaXRpZXMuCi0vLyBJZiB8aXNfY2FwYWJpbGl0eXwgaXMgdHJ1ZSwgdGhlIGJ5dGUgc2VxdWVuY2UgaXMgY29kZWMgY2FwYWJpbGl0aWVzLAotLy8gb3RoZXJ3aXNlIGlzIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGZvciBhIHBlZXIgZGV2aWNlIHRoYXQKLS8vIGlzIGFjdGluZyBhcyBhbiBBMkRQIHNvdXJjZS4KLS8vIFJldHVybnMgQTJEUF9TVUNDRVNTIGlmIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIG1hdGNoZXMgd2l0aCBjYXBhYmlsaXRpZXMsCi0vLyBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgQTJEUCBlcnJvciBzdGF0dXMgY29kZS4KLXN0YXRpYyB0QTJEUF9TVEFUVVMgQTJEUF9Db2RlY0luZm9NYXRjaGVzQ2FwYWJpbGl0eUFwdHhIZCgKLSAgICBjb25zdCB0QTJEUF9BUFRYX0hEX0NJRSogcF9jYXAsIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICBib29sIGlzX2NhcGFiaWxpdHkpIHsKLSAgdEEyRFBfU1RBVFVTIHN0YXR1czsKLSAgdEEyRFBfQVBUWF9IRF9DSUUgY2ZnX2NpZTsKLQotICAvKiBwYXJzZSBjb25maWd1cmF0aW9uICovCi0gIHN0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQXB0eEhkKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGlzX2NhcGFiaWxpdHkpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IHBhcnNpbmcgZmFpbGVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qIHZlcmlmeSB0aGF0IGVhY2ggcGFyYW1ldGVyIGlzIGluIHJhbmdlICovCi0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBGUkVRIHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBjZmdfY2llLnNhbXBsZVJhdGUsIHBfY2FwLT5zYW1wbGVSYXRlKTsKLSAgTE9HX1ZFUkJPU0UoIiVzOiBDSF9NT0RFIHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBjZmdfY2llLmNoYW5uZWxNb2RlLCBwX2NhcC0+Y2hhbm5lbE1vZGUpOwotCi0gIC8qIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICBpZiAoKGNmZ19jaWUuc2FtcGxlUmF0ZSAmIHBfY2FwLT5zYW1wbGVSYXRlKSA9PSAwKSByZXR1cm4gQTJEUF9OU19TQU1QX0ZSRVE7Ci0KLSAgLyogY2hhbm5lbCBtb2RlICovCi0gIGlmICgoY2ZnX2NpZS5jaGFubmVsTW9kZSAmIHBfY2FwLT5jaGFubmVsTW9kZSkgPT0gMCkgcmV0dXJuIEEyRFBfTlNfQ0hfTU9ERTsKLQotICByZXR1cm4gQTJEUF9TVUNDRVNTOwotfQotCi1ib29sIEEyRFBfVmVuZG9yVXNlc1J0cEhlYWRlckFwdHhIZChVTlVTRURfQVRUUiBib29sIGNvbnRlbnRfcHJvdGVjdGlvbl9lbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjTmFtZUFwdHhIZCgKLSAgICBVTlVTRURfQVRUUiBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgcmV0dXJuICJhcHRYLUhEIjsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckNvZGVjVHlwZUVxdWFsc0FwdHhIZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpIHsKLSAgdEEyRFBfQVBUWF9IRF9DSUUgYXB0eF9oZF9jaWVfYTsKLSAgdEEyRFBfQVBUWF9IRF9DSUUgYXB0eF9oZF9jaWVfYjsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvQXB0eEhkKCZhcHR4X2hkX2NpZV9hLCBwX2NvZGVjX2luZm9fYSwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BcHR4SGQoJmFwdHhfaGRfY2llX2IsIHBfY29kZWNfaW5mb19iLCB0cnVlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckNvZGVjRXF1YWxzQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKSB7Ci0gIHRBMkRQX0FQVFhfSERfQ0lFIGFwdHhfaGRfY2llX2E7Ci0gIHRBMkRQX0FQVFhfSERfQ0lFIGFwdHhfaGRfY2llX2I7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9Ci0gICAgICBBMkRQX1BhcnNlSW5mb0FwdHhIZCgmYXB0eF9oZF9jaWVfYSwgcF9jb2RlY19pbmZvX2EsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvQXB0eEhkKCZhcHR4X2hkX2NpZV9iLCBwX2NvZGVjX2luZm9fYiwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIChhcHR4X2hkX2NpZV9hLnNhbXBsZVJhdGUgPT0gYXB0eF9oZF9jaWVfYi5zYW1wbGVSYXRlKSAmJgotICAgICAgICAgKGFwdHhfaGRfY2llX2EuY2hhbm5lbE1vZGUgPT0gYXB0eF9oZF9jaWVfYi5jaGFubmVsTW9kZSk7Ci19Ci0KLWludCBBMkRQX1ZlbmRvckdldEJpdFJhdGVBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIEEyZHBDb2RlY0NvbmZpZyogQ29kZWNDb25maWcgPSBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYygpOwotICB0QTJEUF9CSVRTX1BFUl9TQU1QTEUgYml0c19wZXJfc2FtcGxlID0gQ29kZWNDb25maWctPmdldEF1ZGlvQml0c1BlclNhbXBsZSgpOwotICB1aW50MTZfdCBzYW1wbGVyYXRlID0gQTJEUF9HZXRUcmFja1NhbXBsZVJhdGUocF9jb2RlY19pbmZvKTsKLSAgcmV0dXJuIChzYW1wbGVyYXRlICogYml0c19wZXJfc2FtcGxlICogMikgLyA0OwotfQotCi1pbnQgQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FQVFhfSERfQ0lFIGFwdHhfaGRfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9BcHR4SGQoJmFwdHhfaGRfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYXB0eF9oZF9jaWUuc2FtcGxlUmF0ZSA9PSBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80NDEwMCkgcmV0dXJuIDQ0MTAwOwotICBpZiAoYXB0eF9oZF9jaWUuc2FtcGxlUmF0ZSA9PSBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkgcmV0dXJuIDQ4MDAwOwotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tCaXRzUGVyU2FtcGxlQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BUFRYX0hEX0NJRSBhcHR4X2hkX2NpZTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvQXB0eEhkKCZhcHR4X2hkX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gTk9URTogVGhlIGJpdHMgcGVyIHNhbXBsZSBuZXZlciBjaGFuZ2VzIGZvciBhcHRYLUhECi0gIHJldHVybiAyNDsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnRBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0FQVFhfSERfQ0lFIGFwdHhfaGRfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9BcHR4SGQoJmFwdHhfaGRfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGFwdHhfaGRfY2llLmNoYW5uZWxNb2RlKSB7Ci0gICAgY2FzZSBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfTU9OTzoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTzoKLSAgICAgIHJldHVybiAyOwotICB9Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1ib29sIEEyRFBfVmVuZG9yR2V0UGFja2V0VGltZXN0YW1wQXB0eEhkKAotICAgIFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywgY29uc3QgdWludDhfdCogcF9kYXRhLAotICAgIHVpbnQzMl90KiBwX3RpbWVzdGFtcCkgewotICAvLyBUT0RPOiBJcyB0aGlzIGZ1bmN0aW9uIHJlYWxseSBjb2RlYy1zcGVjaWZpYz8KLSAgKnBfdGltZXN0YW1wID0gKihjb25zdCB1aW50MzJfdCopcF9kYXRhOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckJ1aWxkQ29kZWNIZWFkZXJBcHR4SGQoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgQlRfSERSKiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IGZyYW1lc19wZXJfcGFja2V0KSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6c3RyaW5nIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBzdGQ6OnN0cmluZ3N0cmVhbSByZXM7Ci0gIHN0ZDo6c3RyaW5nIGZpZWxkOwotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXM7Ci0gIHRBMkRQX0FQVFhfSERfQ0lFIGFwdHhfaGRfY2llOwotCi0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9BcHR4SGQoJmFwdHhfaGRfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgcmVzIDw8ICJBMkRQX1BhcnNlSW5mb0FwdHhIZCBmYWlsOiAiIDw8IGxvZ2hleChhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIHJlcy5zdHIoKTsKLSAgfQotCi0gIHJlcyA8PCAiXHRuYW1lOiBhcHRYLUhEXG4iOwotCi0gIC8vIFNhbXBsZSBmcmVxdWVuY3kKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYXB0eF9oZF9jaWUuc2FtcGxlUmF0ZSA9PSAwKSwgIk5PTkUiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYXB0eF9oZF9jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfQVBUWF9IRF9TQU1QTEVSQVRFXzQ0MTAwKSwKLSAgICAgICAgICAgICAgIjQ0MTAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFwdHhfaGRfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCksCi0gICAgICAgICAgICAgICI0ODAwMCIpOwotICByZXMgPDwgIlx0c2FtcF9mcmVxOiAiIDw8IGZpZWxkIDw8ICIgKCIgPDwgbG9naGV4KGFwdHhfaGRfY2llLnNhbXBsZVJhdGUpCi0gICAgICA8PCAiKVxuIjsKLQotICAvLyBDaGFubmVsIG1vZGUKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAoYXB0eF9oZF9jaWUuY2hhbm5lbE1vZGUgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGFwdHhfaGRfY2llLmNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX01PTk8pLAotICAgICAgICAgICAgICAiTW9ubyIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChhcHR4X2hkX2NpZS5jaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9IRF9DSEFOTkVMU19TVEVSRU8pLAotICAgICAgICAgICAgICAiU3RlcmVvIik7Ci0gIHJlcyA8PCAiXHRjaF9tb2RlOiAiIDw8IGZpZWxkIDw8ICIgKCIgPDwgbG9naGV4KGFwdHhfaGRfY2llLmNoYW5uZWxNb2RlKQotICAgICAgPDwgIilcbiI7Ci0KLSAgcmV0dXJuIHJlcy5zdHIoKTsKLX0KLQotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfVmVuZG9yR2V0RW5jb2RlckludGVyZmFjZUFwdHhIZCgKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgaWYgKCFBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZEFwdHhIZChwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZW5jb2Rlcl9pbnRlcmZhY2VfYXB0eF9oZDsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckFkanVzdENvZGVjQXB0eEhkKHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9BUFRYX0hEX0NJRSBjZmdfY2llOwotCi0gIC8vIE5vdGhpbmcgdG8gZG86IGp1c3QgdmVyaWZ5IHRoZSBjb2RlYyBpbmZvIGlzIHZhbGlkCi0gIGlmIChBMkRQX1BhcnNlSW5mb0FwdHhIZCgmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKSAhPSBBMkRQX1NVQ0NFU1MpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXhBcHR4SGQoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFhfSEQ7Ci19Ci0KLWNvbnN0IGNoYXIqIEEyRFBfVmVuZG9yQ29kZWNJbmRleFN0ckFwdHhIZCh2b2lkKSB7IHJldHVybiAiYXB0WC1IRCI7IH0KLQotYm9vbCBBMkRQX1ZlbmRvckluaXRDb2RlY0NvbmZpZ0FwdHhIZChBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgaWYgKEEyRFBfQnVpbGRJbmZvQXB0eEhkKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJmEyZHBfYXB0eF9oZF9zb3VyY2VfY2FwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ZnLT5jb2RlY19pbmZvKSAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotI2lmIChCVEFfQVZfQ09fQ1BfU0NNU19UID09IFRSVUUpCi0gIC8qIENvbnRlbnQgcHJvdGVjdGlvbiBpbmZvIC0gc3VwcG9ydCBTQ01TLVQgKi8KLSAgdWludDhfdCogcCA9IHBfY2ZnLT5wcm90ZWN0X2luZm87Ci0gICpwKysgPSBBVkRUX0NQX0xPU0M7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgQVZEVF9DUF9TQ01TX1RfSUQpOwotICBwX2NmZy0+bnVtX3Byb3RlY3QgPSAxOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZ0FwdHhIZDo6QTJkcENvZGVjQ29uZmlnQXB0eEhkKAotICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KQotICAgIDogQTJkcENvZGVjQ29uZmlnKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWF9IRCwKLSAgICAgICAgICAgICAgICAgICAgICBBMkRQX1ZlbmRvckNvZGVjSW5kZXhTdHJBcHR4SGQoKSwgY29kZWNfcHJpb3JpdHkpIHsKLSAgLy8gQ29tcHV0ZSB0aGUgbG9jYWwgY2FwYWJpbGl0eQotICBpZiAoYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLnNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80NDEwMCkgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgfQotICBpZiAoYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLnNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgfQotICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLmJpdHNfcGVyX3NhbXBsZTsKLSAgaWYgKGEyZHBfYXB0eF9oZF9zb3VyY2VfY2Fwcy5jaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9IRF9DSEFOTkVMU19NT05PKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgfQotICBpZiAoYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLmNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTykgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotfQotCi1BMmRwQ29kZWNDb25maWdBcHR4SGQ6On5BMmRwQ29kZWNDb25maWdBcHR4SGQoKSB7fQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ0FwdHhIZDo6aW5pdCgpIHsKLSAgaWYgKCFpc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLQotICAvLyBMb2FkIHRoZSBlbmNvZGVyCi0gIGlmICghQTJEUF9WZW5kb3JMb2FkRW5jb2RlckFwdHhIZCgpKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGxvYWQgdGhlIGVuY29kZXIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQXB0eEhkOjp1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYmVzdCBzYW1wbGUgcmF0ZSBmcm9tIHxzYW1wbGVSYXRlfC4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKHVpbnQ4X3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBMkRQX0FQVFhfSERfQ0lFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkgewotICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDgwMDA7Ci0gICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDQxMDApIHsKLSAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQVBUWF9IRF9TQU1QTEVSQVRFXzQ0MTAwOwotICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBhdWRpbyBzYW1wbGUgcmF0ZSBmcm9tIHxwX2NvZGVjX2F1ZGlvX2NvbmZpZ3wuCi0vLyB8c2FtcGxlUmF0ZXwgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2F1ZGlvX3NhbXBsZV9yYXRlKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19hdWRpb19jb25maWcsIHVpbnQ4X3Qgc2FtcGxlUmF0ZSwKLSAgICB0QTJEUF9BUFRYX0hEX0NJRSogcF9yZXN1bHQsIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChwX2NvZGVjX2F1ZGlvX2NvbmZpZy0+c2FtcGxlX3JhdGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDQxMDApIHsKLSAgICAgICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80NDEwMDsKLSAgICAgICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfQVBUWF9IRF9TQU1QTEVSQVRFXzQ4MDAwOwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYmVzdCBiaXRzIHBlciBzYW1wbGUuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2Jlc3RfYml0c19wZXJfc2FtcGxlKAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYXVkaW8gYml0cyBwZXIgc2FtcGxlIGZyb20gfHBfY29kZWNfYXVkaW9fY29uZmlnfC4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYXVkaW9fYml0c19wZXJfc2FtcGxlKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19hdWRpb19jb25maWcsCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKHBfY29kZWNfYXVkaW9fY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ6Ci0gICAgICBwX2NvZGVjX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzI6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBiZXN0IGNoYW5uZWwgbW9kZSBmcm9tIHxjaGFubmVsTW9kZXwuCi0vLyBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB8cF9yZXN1bHR8IGFuZCB8cF9jb2RlY19jb25maWd8LgotLy8gUmV0dXJucyB0cnVlIGlmIGEgc2VsZWN0aW9uIHdhcyBtYWRlLCBvdGhlcndpc2UgZmFsc2UuCi0vLwotc3RhdGljIGJvb2wgc2VsZWN0X2Jlc3RfY2hhbm5lbF9tb2RlKHVpbnQ4X3QgY2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEEyRFBfQVBUWF9IRF9DSUUqIHBfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTykgewotICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfQVBUWF9IRF9DSEFOTkVMU19TVEVSRU87Ci0gICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9IRF9DSEFOTkVMU19NT05PKSB7Ci0gICAgcF9yZXN1bHQtPmNoYW5uZWxNb2RlID0gQTJEUF9BUFRYX0hEX0NIQU5ORUxTX01PTk87Ci0gICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vCi0vLyBTZWxlY3RzIHRoZSBhdWRpbyBjaGFubmVsIG1vZGUgZnJvbSB8cF9jb2RlY19hdWRpb19jb25maWd8LgotLy8gfGNoYW5uZWxNb2RlfCBjb250YWlucyB0aGUgY2FwYWJpbGl0eS4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYXVkaW9fY2hhbm5lbF9tb2RlKAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19hdWRpb19jb25maWcsIHVpbnQ4X3QgY2hhbm5lbE1vZGUsCi0gICAgdEEyRFBfQVBUWF9IRF9DSUUqIHBfcmVzdWx0LCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIHN3aXRjaCAocF9jb2RlY19hdWRpb19jb25maWctPmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX01PTk8pIHsKLSAgICAgICAgcF9yZXN1bHQtPmNoYW5uZWxNb2RlID0gQTJEUF9BUFRYX0hEX0NIQU5ORUxTX01PTk87Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzoKLSAgICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfQVBUWF9IRF9DSEFOTkVMU19TVEVSRU8pIHsKLSAgICAgICAgcF9yZXN1bHQtPmNoYW5uZWxNb2RlID0gQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTzsKLSAgICAgICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQTJkcENvZGVjQ29uZmlnQXB0eEhkOjpzZXRDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICB0QTJEUF9BUFRYX0hEX0NJRSBwZWVyX2luZm9fY2llOwotICB0QTJEUF9BUFRYX0hEX0NJRSByZXN1bHRfY29uZmlnX2NpZTsKLSAgdWludDhfdCBzYW1wbGVSYXRlOwotICB1aW50OF90IGNoYW5uZWxNb2RlOwotCi0gIC8vIFNhdmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19jb25maWcgPSBjb2RlY19jb25maWdfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfY2FwYWJpbGl0eSA9IGNvZGVjX2NhcGFiaWxpdHlfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5ID0KLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV87Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY191c2VyX2NvbmZpZyA9IGNvZGVjX3VzZXJfY29uZmlnXzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX2F1ZGlvX2NvbmZpZyA9IGNvZGVjX2F1ZGlvX2NvbmZpZ187Ci0gIHVpbnQ4X3Qgc2F2ZWRfb3RhX2NvZGVjX2NvbmZpZ1tBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlbQVZEVF9DT0RFQ19TSVpFXTsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jb25maWdbQVZEVF9DT0RFQ19TSVpFXTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19jb25maWcsIG90YV9jb2RlY19jb25maWdfLCBzaXplb2Yob3RhX2NvZGVjX2NvbmZpZ18pKTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksIG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKSk7Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfcGVlcl9jb25maWcsIG90YV9jb2RlY19wZWVyX2NvbmZpZ18sCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY29uZmlnXykpOwotCi0gIHRBMkRQX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9BcHR4SGQoJnBlZXJfaW5mb19jaWUsIHBfcGVlcl9jb2RlY19pbmZvLCBpc19jYXBhYmlsaXR5KTsKLSAgaWYgKHN0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW4ndCBwYXJzZSBwZWVyJ3MgY2FwYWJpbGl0aWVzOiBlcnJvciA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gQnVpbGQgdGhlIHByZWZlcnJlZCBjb25maWd1cmF0aW9uCi0gIC8vCi0gIG1lbXNldCgmcmVzdWx0X2NvbmZpZ19jaWUsIDAsIHNpemVvZihyZXN1bHRfY29uZmlnX2NpZSkpOwotICByZXN1bHRfY29uZmlnX2NpZS52ZW5kb3JJZCA9IGEyZHBfYXB0eF9oZF9zb3VyY2VfY2Fwcy52ZW5kb3JJZDsKLSAgcmVzdWx0X2NvbmZpZ19jaWUuY29kZWNJZCA9IGEyZHBfYXB0eF9oZF9zb3VyY2VfY2Fwcy5jb2RlY0lkOwotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgc2FtcGxlIGZyZXF1ZW5jeQotICAvLwotICBzYW1wbGVSYXRlID0gYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLnNhbXBsZVJhdGUgJiBwZWVyX2luZm9fY2llLnNhbXBsZVJhdGU7Ci0gIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORTsKLSAgc3dpdGNoIChjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDQxMDApIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuc2FtcGxlUmF0ZSA9IEEyRFBfQVBUWF9IRF9TQU1QTEVSQVRFXzQ0MTAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5zYW1wbGVSYXRlID0gQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDgwMDA7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOgotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNjAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8yNDAwMDoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FOgotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORTsKLSAgICAgIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gU2VsZWN0IHRoZSBzYW1wbGUgZnJlcXVlbmN5IGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQotICBkbyB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80NDEwMCkgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICB9Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICB9Ci0KLSAgICBpZiAoY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSAhPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSkgYnJlYWs7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBjb21tb24gY2FwYWJpbGl0eQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDQxMDApCi0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgY29kZWMgYXVkaW8gY29uZmlnCi0gICAgaWYgKHNlbGVjdF9hdWRpb19zYW1wbGVfcmF0ZSgmY29kZWNfYXVkaW9fY29uZmlnXywgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB0cnkgdGhlIGRlZmF1bHQgY29uZmlnCi0gICAgaWYgKHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKAotICAgICAgICAgICAgYTJkcF9hcHR4X2hkX2RlZmF1bHRfY29uZmlnLnNhbXBsZVJhdGUgJiBwZWVyX2luZm9fY2llLnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdXNlIHRoZSBiZXN0IG1hdGNoCi0gICAgaWYgKHNlbGVjdF9iZXN0X3NhbXBsZV9yYXRlKHNhbXBsZVJhdGUsICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gd2hpbGUgKGZhbHNlKTsKLSAgaWYgKGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPT0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIHNhbXBsZSBmcmVxdWVuY3k6IGxvY2FsIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLnNhbXBsZVJhdGUsCi0gICAgICAgIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gU2VsZWN0IHRoZSBiaXRzIHBlciBzYW1wbGUKLSAgLy8KLSAgLy8gTk9URTogdGhpcyBpbmZvcm1hdGlvbiBpcyBOT1QgaW5jbHVkZWQgaW4gdGhlIGFwdFgtSEQgQTJEUCBjb2RlYwotICAvLyBkZXNjcmlwdGlvbiB0aGF0IGlzIHNlbnQgT1RBLgotICBjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORTsKLSAgc3dpdGNoIChjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OgotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgIGNvZGVjX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjoKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzI6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU6Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gICAgICBjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gU2VsZWN0IHRoZSBiaXRzIHBlciBzYW1wbGUgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCi0gIGRvIHsKLSAgICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICAgIGEyZHBfYXB0eF9oZF9zb3VyY2VfY2Fwcy5iaXRzX3Blcl9zYW1wbGU7Ci0KLSAgICBpZiAoY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgIT0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FKQotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBjb21tb24gY2FwYWJpbGl0eQotICAgIGNvZGVjX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ7Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB0cnkgdGhlIGNvZGVjIGF1ZGlvIGNvbmZpZwotICAgIGlmIChzZWxlY3RfYXVkaW9fYml0c19wZXJfc2FtcGxlKCZjb2RlY19hdWRpb19jb25maWdfLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgZGVmYXVsdCBjb25maWcKLSAgICBpZiAoc2VsZWN0X2Jlc3RfYml0c19wZXJfc2FtcGxlKCZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdXNlIHRoZSBiZXN0IG1hdGNoCi0gICAgLy8gTk9URTogbm8tb3AgLSBrZXB0IGhlcmUgZm9yIGNvbnNpc3RlbmN5Ci0gICAgaWYgKHNlbGVjdF9iZXN0X2JpdHNfcGVyX3NhbXBsZSgmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPT0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IG1hdGNoIGJpdHMgcGVyIHNhbXBsZTogdXNlciBwcmVmZXJlbmNlID0gMHgleCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIGNoYW5uZWwgbW9kZQotICAvLwotICBjaGFubmVsTW9kZSA9Ci0gICAgICBhMmRwX2FwdHhfaGRfc291cmNlX2NhcHMuY2hhbm5lbE1vZGUgJiBwZWVyX2luZm9fY2llLmNoYW5uZWxNb2RlOwotICBjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORTsKLSAgc3dpdGNoIChjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfTU9OTykgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5jaGFubmVsTW9kZSA9IEEyRFBfQVBUWF9IRF9DSEFOTkVMU19NT05POwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgICBjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTykgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5jaGFubmVsTW9kZSA9IEEyRFBfQVBUWF9IRF9DSEFOTkVMU19TVEVSRU87Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOgotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIFNlbGVjdCB0aGUgY2hhbm5lbCBtb2RlIGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQotICBkbyB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX01PTk8pIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIH0KLSAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfU1RFUkVPKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgIH0KLQotICAgIGlmIChjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSAhPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkUpIGJyZWFrOwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgY29tbW9uIGNhcGFiaWxpdHkKLSAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfTU9OTykKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9BUFRYX0hEX0NIQU5ORUxTX1NURVJFTykKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgY29kZWMgYXVkaW8gY29uZmlnCi0gICAgaWYgKHNlbGVjdF9hdWRpb19jaGFubmVsX21vZGUoJmNvZGVjX2F1ZGlvX2NvbmZpZ18sIGNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB0cnkgdGhlIGRlZmF1bHQgY29uZmlnCi0gICAgaWYgKHNlbGVjdF9iZXN0X2NoYW5uZWxfbW9kZSgKLSAgICAgICAgICAgIGEyZHBfYXB0eF9oZF9kZWZhdWx0X2NvbmZpZy5jaGFubmVsTW9kZSAmIHBlZXJfaW5mb19jaWUuY2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdXNlIHRoZSBiZXN0IG1hdGNoCi0gICAgaWYgKHNlbGVjdF9iZXN0X2NoYW5uZWxfbW9kZShjaGFubmVsTW9kZSwgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gd2hpbGUgKGZhbHNlKTsKLSAgaWYgKGNvZGVjX2NvbmZpZ18uY2hhbm5lbF9tb2RlID09IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBjYW5ub3QgbWF0Y2ggY2hhbm5lbCBtb2RlOiBsb2NhbCBjYXBzID0gMHgleCAiCi0gICAgICAgICJwZWVyIGluZm8gPSAweCV4IiwKLSAgICAgICAgX19mdW5jX18sIGEyZHBfYXB0eF9oZF9zb3VyY2VfY2Fwcy5jaGFubmVsTW9kZSwKLSAgICAgICAgcGVlcl9pbmZvX2NpZS5jaGFubmVsTW9kZSk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8KLSAgLy8gU2V0IHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgYXMgYml0LXdpc2UgQU5EIG9wZXJhdGlvbgotICAvLwotICByZXN1bHRfY29uZmlnX2NpZS5hY2xfc3ByaW50X3Jlc2VydmVkMCA9Ci0gICAgICBhMmRwX2FwdHhfaGRfc291cmNlX2NhcHMuYWNsX3NwcmludF9yZXNlcnZlZDAgJgotICAgICAgcGVlcl9pbmZvX2NpZS5hY2xfc3ByaW50X3Jlc2VydmVkMDsKLSAgcmVzdWx0X2NvbmZpZ19jaWUuYWNsX3NwcmludF9yZXNlcnZlZDEgPQotICAgICAgYTJkcF9hcHR4X2hkX3NvdXJjZV9jYXBzLmFjbF9zcHJpbnRfcmVzZXJ2ZWQxICYKLSAgICAgIHBlZXJfaW5mb19jaWUuYWNsX3NwcmludF9yZXNlcnZlZDE7Ci0gIHJlc3VsdF9jb25maWdfY2llLmFjbF9zcHJpbnRfcmVzZXJ2ZWQyID0KLSAgICAgIGEyZHBfYXB0eF9oZF9zb3VyY2VfY2Fwcy5hY2xfc3ByaW50X3Jlc2VydmVkMiAmCi0gICAgICBwZWVyX2luZm9fY2llLmFjbF9zcHJpbnRfcmVzZXJ2ZWQyOwotICByZXN1bHRfY29uZmlnX2NpZS5hY2xfc3ByaW50X3Jlc2VydmVkMyA9Ci0gICAgICBhMmRwX2FwdHhfaGRfc291cmNlX2NhcHMuYWNsX3NwcmludF9yZXNlcnZlZDMgJgotICAgICAgcGVlcl9pbmZvX2NpZS5hY2xfc3ByaW50X3Jlc2VydmVkMzsKLQotICBpZiAoQTJEUF9CdWlsZEluZm9BcHR4SGQoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcmVzdWx0X2NvbmZpZ19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdF9jb2RlY19jb25maWcpICE9IEEyRFBfU1VDQ0VTUykgewotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIENvcHkgdGhlIGNvZGVjLXNwZWNpZmljIGZpZWxkcyBpZiB0aGV5IGFyZSBub3QgemVybwotICAvLwotICBpZiAoY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzEgIT0gMCkKLSAgICBjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzEgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMTsKLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18yICE9IDApCi0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18yID0gY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzI7Ci0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMyAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMyA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18zOwotICBpZiAoY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzQgIT0gMCkKLSAgICBjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzQgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfNDsKLQotICAvLyBDcmVhdGUgYSBsb2NhbCBjb3B5IG9mIHRoZSBwZWVyIGNvZGVjIGNhcGFiaWxpdHkvY29uZmlnLCBhbmQgdGhlCi0gIC8vIHJlc3VsdCBjb2RlYyBjb25maWcuCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BcHR4SGQoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcGVlcl9pbmZvX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xyk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BcHR4SGQoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcGVlcl9pbmZvX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jb25maWdfKTsKLSAgfQotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLSAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9BcHR4SGQoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcmVzdWx0X2NvbmZpZ19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19jb25maWdfKTsKLSAgQ0hFQ0soc3RhdHVzID09IEEyRFBfU1VDQ0VTUyk7Ci0gIHJldHVybiB0cnVlOwotCi1mYWlsOgotICAvLyBSZXN0b3JlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICBjb2RlY19jb25maWdfID0gc2F2ZWRfY29kZWNfY29uZmlnOwotICBjb2RlY19jYXBhYmlsaXR5XyA9IHNhdmVkX2NvZGVjX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8gPSBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX3VzZXJfY29uZmlnXyA9IHNhdmVkX2NvZGVjX3VzZXJfY29uZmlnOwotICBjb2RlY19hdWRpb19jb25maWdfID0gc2F2ZWRfY29kZWNfYXVkaW9fY29uZmlnOwotICBtZW1jcHkob3RhX2NvZGVjX2NvbmZpZ18sIHNhdmVkX290YV9jb2RlY19jb25maWcsIHNpemVvZihvdGFfY29kZWNfY29uZmlnXykpOwotICBtZW1jcHkob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sIHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgbWVtY3B5KG90YV9jb2RlY19wZWVyX2NvbmZpZ18sIHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jb25maWdfKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdBcHR4SGQ6OnNldFBlZXJDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhjb2RlY19tdXRleF8pOwotICB0QTJEUF9BUFRYX0hEX0NJRSBwZWVyX2luZm9fY2llOwotICB1aW50OF90IHNhbXBsZVJhdGU7Ci0gIHVpbnQ4X3QgY2hhbm5lbE1vZGU7Ci0KLSAgLy8gU2F2ZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eSA9Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfOwotICB1aW50OF90IHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlbQVZEVF9DT0RFQ19TSVpFXTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksIG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKSk7Ci0KLSAgdEEyRFBfU1RBVFVTIHN0YXR1cyA9Ci0gICAgICBBMkRQX1BhcnNlSW5mb0FwdHhIZCgmcGVlcl9pbmZvX2NpZSwgcF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcywgdHJ1ZSk7Ci0gIGlmIChzdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2FuJ3QgcGFyc2UgcGVlcidzIGNhcGFiaWxpdGllczogZXJyb3IgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIHNhbXBsZSByYXRlCi0gIHNhbXBsZVJhdGUgPSBhMmRwX2FwdHhfaGRfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZTsKLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80NDEwMCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICB9Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDgwMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGJpdHMgcGVyIHNhbXBsZQotICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBhMmRwX2FwdHhfaGRfc291cmNlX2NhcHMuYml0c19wZXJfc2FtcGxlOwotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGNoYW5uZWwgbW9kZQotICBjaGFubmVsTW9kZSA9Ci0gICAgICBhMmRwX2FwdHhfaGRfc291cmNlX2NhcHMuY2hhbm5lbE1vZGUgJiBwZWVyX2luZm9fY2llLmNoYW5uZWxNb2RlOwotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfTU9OTykgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgfQotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfU1RFUkVPKSB7Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gIH0KLQotICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb0FwdHhIZChBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xyk7Ci0gIENIRUNLKHN0YXR1cyA9PSBBMkRQX1NVQ0NFU1MpOwotICByZXR1cm4gdHJ1ZTsKLQotZmFpbDoKLSAgLy8gUmVzdG9yZSB0aGUgaW50ZXJuYWwgc3RhdGUKLSAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XyA9IHNhdmVkX2NvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eTsKLSAgbWVtY3B5KG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyLmNjIGIvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTZiMTIuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIiCi0KLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIuaCIKLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3IuaCIKLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9hcHR4X2hkLmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8vCi0vLyBFbmNvZGVyIGZvciBhcHRYLUhEIFNvdXJjZSBDb2RlYwotLy8KLQotLy8KLS8vIFRoZSBhcHRYLUhEIGVuY29kZXIgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGUgZnVuY3Rpb25zIHRvIHVzZQotLy8KLXN0YXRpYyBjb25zdCBjaGFyKiBBUFRYX0hEX0VOQ09ERVJfTElCX05BTUUgPSAibGliYXB0WEhEX2VuY29kZXIuc28iOwotc3RhdGljIHZvaWQqIGFwdHhfaGRfZW5jb2Rlcl9saWJfaGFuZGxlID0gTlVMTDsKLQotc3RhdGljIGNvbnN0IGNoYXIqIEFQVFhfSERfRU5DT0RFUl9JTklUX05BTUUgPSAiYXB0eGhkYnRlbmNfaW5pdCI7Ci10eXBlZGVmIGludCAoKnRBUFRYX0hEX0VOQ09ERVJfSU5JVCkodm9pZCogc3RhdGUsIHNob3J0IGVuZGlhbik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBBUFRYX0hEX0VOQ09ERVJfRU5DT0RFX1NURVJFT19OQU1FID0KLSAgICAiYXB0eGhkYnRlbmNfZW5jb2Rlc3RlcmVvIjsKLXR5cGVkZWYgaW50ICgqdEFQVFhfSERfRU5DT0RFUl9FTkNPREVfU1RFUkVPKSh2b2lkKiBzdGF0ZSwgdm9pZCogcGNtTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwY21SLCB2b2lkKiBidWZmZXIpOwotCi1zdGF0aWMgY29uc3QgY2hhciogQVBUWF9IRF9FTkNPREVSX1NJWkVPRl9QQVJBTVNfTkFNRSA9ICJTaXplb2ZBcHR4aGRidGVuYyI7Ci10eXBlZGVmIGludCAoKnRBUFRYX0hEX0VOQ09ERVJfU0laRU9GX1BBUkFNUykodm9pZCk7Ci0KLXN0YXRpYyB0QVBUWF9IRF9FTkNPREVSX0lOSVQgYXB0eF9oZF9lbmNvZGVyX2luaXRfZnVuYzsKLXN0YXRpYyB0QVBUWF9IRF9FTkNPREVSX0VOQ09ERV9TVEVSRU8gYXB0eF9oZF9lbmNvZGVyX2VuY29kZV9zdGVyZW9fZnVuYzsKLXN0YXRpYyB0QVBUWF9IRF9FTkNPREVSX1NJWkVPRl9QQVJBTVMgYXB0eF9oZF9lbmNvZGVyX3NpemVvZl9wYXJhbXNfZnVuYzsKLQotLy8gb2Zmc2V0Ci0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSNkZWZpbmUgQTJEUF9BUFRYX0hEX09GRlNFVCAoQVZEVF9NRURJQV9PRkZTRVQgKyAxKQotI2Vsc2UKLSNkZWZpbmUgQTJEUF9BUFRYX0hEX09GRlNFVCBBVkRUX01FRElBX09GRlNFVAotI2VuZGlmCi0KLSNkZWZpbmUgQTJEUF9BUFRYX0hEX01BWF9QQ01fQllURVNfUEVSX1JFQUQgNDA5NgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ2NF90IHNsZWVwX3RpbWVfbnM7Ci0gIHVpbnQzMl90IHBjbV9yZWFkczsKLSAgdWludDMyX3QgcGNtX2J5dGVzX3Blcl9yZWFkOwotICB1aW50MzJfdCBhcHR4X2hkX2J5dGVzOwotICB1aW50MzJfdCBmcmFtZV9zaXplX2NvdW50ZXI7Ci19IHRBUFRYX0hEX0ZSQU1JTkdfUEFSQU1TOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ2NF90IHNlc3Npb25fc3RhcnRfdXM7Ci0KLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcGFja2V0czsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQ7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRfYnl0ZXM7Ci0KLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZHJvcHBlZF9wYWNrZXRzOwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZHNfY291bnQ7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzOwotfSBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9zdGF0c190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCByZWFkX2NhbGxiYWNrOwotICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjazsKLQotICBib29sIHVzZV9TQ01TX1Q7Ci0gIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwZWVyX3BhcmFtczsKLSAgdWludDMyX3QgdGltZXN0YW1wOyAgICAgICAgLy8gVGltZXN0YW1wIGZvciB0aGUgQTJEUCBmcmFtZXMKLQotICB0QTJEUF9GRUVESU5HX1BBUkFNUyBmZWVkaW5nX3BhcmFtczsKLSAgdEFQVFhfSERfRlJBTUlOR19QQVJBTVMgZnJhbWluZ19wYXJhbXM7Ci0gIHZvaWQqIGFwdHhfaGRfZW5jb2Rlcl9zdGF0ZTsKLSAgYTJkcF9hcHR4X2hkX2VuY29kZXJfc3RhdHNfdCBzdGF0czsKLX0gdEEyRFBfQVBUWF9IRF9FTkNPREVSX0NCOwotCi1zdGF0aWMgdEEyRFBfQVBUWF9IRF9FTkNPREVSX0NCIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiOwotCi1zdGF0aWMgdm9pZCBhMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXJfdXBkYXRlKAotICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKTsKLXN0YXRpYyB2b2lkIGFwdHhfaGRfaW5pdF9mcmFtaW5nX3BhcmFtcygKLSAgICB0QVBUWF9IRF9GUkFNSU5HX1BBUkFNUyogZnJhbWluZ19wYXJhbXMpOwotc3RhdGljIHZvaWQgYXB0eF9oZF91cGRhdGVfZnJhbWluZ19wYXJhbXMoCi0gICAgdEFQVFhfSERfRlJBTUlOR19QQVJBTVMqIGZyYW1pbmdfcGFyYW1zKTsKLXN0YXRpYyBzaXplX3QgYXB0eF9oZF9lbmNvZGVfMjRiaXQodEFQVFhfSERfRlJBTUlOR19QQVJBTVMqIGZyYW1pbmdfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGRhdGFfb3V0X2luZGV4LCB1aW50MzJfdCogZGF0YTMyX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX291dCk7Ci0KLWJvb2wgQTJEUF9WZW5kb3JMb2FkRW5jb2RlckFwdHhIZCh2b2lkKSB7Ci0gIGlmIChhcHR4X2hkX2VuY29kZXJfbGliX2hhbmRsZSAhPSBOVUxMKSByZXR1cm4gdHJ1ZTsgIC8vIEFscmVhZHkgbG9hZGVkCi0KLSAgLy8gT3BlbiB0aGUgZW5jb2RlciBsaWJyYXJ5Ci0gIGFwdHhfaGRfZW5jb2Rlcl9saWJfaGFuZGxlID0gZGxvcGVuKEFQVFhfSERfRU5DT0RFUl9MSUJfTkFNRSwgUlRMRF9OT1cpOwotICBpZiAoYXB0eF9oZF9lbmNvZGVyX2xpYl9oYW5kbGUgPT0gTlVMTCkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBvcGVuIGFwdFgtSEQgZW5jb2RlciBsaWJyYXJ5ICVzOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBBUFRYX0hEX0VOQ09ERVJfTElCX05BTUUsIGRsZXJyb3IoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYXB0eF9oZF9lbmNvZGVyX2luaXRfZnVuYyA9ICh0QVBUWF9IRF9FTkNPREVSX0lOSVQpZGxzeW0oCi0gICAgICBhcHR4X2hkX2VuY29kZXJfbGliX2hhbmRsZSwgQVBUWF9IRF9FTkNPREVSX0lOSVRfTkFNRSk7Ci0gIGlmIChhcHR4X2hkX2VuY29kZXJfaW5pdF9mdW5jID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBmdW5jdGlvbiAnJXMnIGluIHRoZSBlbmNvZGVyIGxpYnJhcnk6ICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIEFQVFhfSERfRU5DT0RFUl9JTklUX05BTUUsIGRsZXJyb3IoKSk7Ci0gICAgQTJEUF9WZW5kb3JVbmxvYWRFbmNvZGVyQXB0eEhkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYXB0eF9oZF9lbmNvZGVyX2VuY29kZV9zdGVyZW9fZnVuYyA9ICh0QVBUWF9IRF9FTkNPREVSX0VOQ09ERV9TVEVSRU8pZGxzeW0oCi0gICAgICBhcHR4X2hkX2VuY29kZXJfbGliX2hhbmRsZSwgQVBUWF9IRF9FTkNPREVSX0VOQ09ERV9TVEVSRU9fTkFNRSk7Ci0gIGlmIChhcHR4X2hkX2VuY29kZXJfZW5jb2RlX3N0ZXJlb19mdW5jID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBmdW5jdGlvbiAnJXMnIGluIHRoZSBlbmNvZGVyIGxpYnJhcnk6ICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIEFQVFhfSERfRU5DT0RFUl9FTkNPREVfU1RFUkVPX05BTUUsIGRsZXJyb3IoKSk7Ci0gICAgQTJEUF9WZW5kb3JVbmxvYWRFbmNvZGVyQXB0eEhkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYXB0eF9oZF9lbmNvZGVyX3NpemVvZl9wYXJhbXNfZnVuYyA9ICh0QVBUWF9IRF9FTkNPREVSX1NJWkVPRl9QQVJBTVMpZGxzeW0oCi0gICAgICBhcHR4X2hkX2VuY29kZXJfbGliX2hhbmRsZSwgQVBUWF9IRF9FTkNPREVSX1NJWkVPRl9QQVJBTVNfTkFNRSk7Ci0gIGlmIChhcHR4X2hkX2VuY29kZXJfc2l6ZW9mX3BhcmFtc19mdW5jID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBmdW5jdGlvbiAnJXMnIGluIHRoZSBlbmNvZGVyIGxpYnJhcnk6ICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIEFQVFhfSERfRU5DT0RFUl9TSVpFT0ZfUEFSQU1TX05BTUUsIGRsZXJyb3IoKSk7Ci0gICAgQTJEUF9WZW5kb3JVbmxvYWRFbmNvZGVyQXB0eEhkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQTJEUF9WZW5kb3JVbmxvYWRFbmNvZGVyQXB0eEhkKHZvaWQpIHsKLSAgYXB0eF9oZF9lbmNvZGVyX2luaXRfZnVuYyA9IE5VTEw7Ci0gIGFwdHhfaGRfZW5jb2Rlcl9lbmNvZGVfc3RlcmVvX2Z1bmMgPSBOVUxMOwotICBhcHR4X2hkX2VuY29kZXJfc2l6ZW9mX3BhcmFtc19mdW5jID0gTlVMTDsKLQotICBpZiAoYXB0eF9oZF9lbmNvZGVyX2xpYl9oYW5kbGUgIT0gTlVMTCkgewotICAgIGRsY2xvc2UoYXB0eF9oZF9lbmNvZGVyX2xpYl9oYW5kbGUpOwotICAgIGFwdHhfaGRfZW5jb2Rlcl9saWJfaGFuZGxlID0gTlVMTDsKLSAgfQotfQotCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfaGRfZW5jb2Rlcl9pbml0KAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgIGEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCByZWFkX2NhbGxiYWNrLAotICAgIGEyZHBfc291cmNlX2VucXVldWVfY2FsbGJhY2tfdCBlbnF1ZXVlX2NhbGxiYWNrKSB7Ci0gIG1lbXNldCgmYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IsIDAsIHNpemVvZihhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYikpOwotCi0gIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnN0YXRzLnNlc3Npb25fc3RhcnRfdXMgPQotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0KLSAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IucmVhZF9jYWxsYmFjayA9IHJlYWRfY2FsbGJhY2s7Ci0gIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLmVucXVldWVfY2FsbGJhY2sgPSBlbnF1ZXVlX2NhbGxiYWNrOwotICBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi5wZWVyX3BhcmFtcyA9ICpwX3BlZXJfcGFyYW1zOwotICBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi50aW1lc3RhbXAgPSAwOwotCi0gIC8qIGFwdFgtSEQgZW5jb2RlciBjb25maWcgKi8KLSAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IGZhbHNlOyAgLy8gVE9ETzogc2hvdWxkIGJlIGEgcGFyYW1ldGVyCi0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IHRydWU7Ci0jZW5kaWYKLQotICBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi5hcHR4X2hkX2VuY29kZXJfc3RhdGUgPQotICAgICAgb3NpX21hbGxvYyhhcHR4X2hkX2VuY29kZXJfc2l6ZW9mX3BhcmFtc19mdW5jKCkpOwotICBpZiAoYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IuYXB0eF9oZF9lbmNvZGVyX3N0YXRlICE9IE5VTEwpIHsKLSAgICBhcHR4X2hkX2VuY29kZXJfaW5pdF9mdW5jKGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLmFwdHhfaGRfZW5jb2Rlcl9zdGF0ZSwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCIlczogQ2Fubm90IGFsbG9jYXRlIGFwdFgtSEQgZW5jb2RlciBzdGF0ZSIsIF9fZnVuY19fKTsKLSAgICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gIH0KLQotICAvLyBOT1RFOiBJZ25vcmUgdGhlIHJlc3RhcnRfaW5wdXQgLyByZXN0YXJ0X291dHB1dCBmbGFncyAtIHRoaXMgaW5pdGl6YXRpb24KLSAgLy8gaGFwcGVucyB3aGVuIHRoZSBhdWRpbyBzZXNzaW9uIGlzIChyZSlzdGFydGVkLgotICBib29sIHJlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGEyZHBfdmVuZG9yX2FwdHhfaGRfZW5jb2Rlcl91cGRhdGUoYTJkcF9jb2RlY19jb25maWcsICZyZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0YXJ0X291dHB1dCwgJmNvbmZpZ191cGRhdGVkKTsKLX0KLQotLy8gVXBkYXRlIHRoZSBBMkRQIGFwdFgtSEQgZW5jb2Rlci4KLS8vIHxhMmRwX2NvZGVjX2NvbmZpZ3wgaXMgdGhlIEEyRFAgY29kZWMgdG8gdXNlIGZvciB0aGUgdXBkYXRlLgotc3RhdGljIHZvaWQgYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyX3VwZGF0ZSgKLSAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLCBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCwgYm9vbCogcF9jb25maWdfdXBkYXRlZCkgewotICB1aW50OF90IGNvZGVjX2luZm9bQVZEVF9DT0RFQ19TSVpFXTsKLQotICAqcF9yZXN0YXJ0X2lucHV0ID0gZmFsc2U7Ci0gICpwX3Jlc3RhcnRfb3V0cHV0ID0gZmFsc2U7Ci0gICpwX2NvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGlmICghYTJkcF9jb2RlY19jb25maWctPmNvcHlPdXRPdGFDb2RlY0NvbmZpZyhjb2RlY19pbmZvKSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBDYW5ub3QgdXBkYXRlIHRoZSBjb2RlYyBlbmNvZGVyIGZvciAlczogIgotICAgICAgICAiaW52YWxpZCBjb2RlYyBjb25maWciLAotICAgICAgICBfX2Z1bmNfXywgYTJkcF9jb2RlY19jb25maWctPm5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvID0gY29kZWNfaW5mbzsKLQotICAvLyBUaGUgZmVlZGluZyBwYXJhbWV0ZXJzCi0gIHRBMkRQX0ZFRURJTkdfUEFSQU1TKiBwX2ZlZWRpbmdfcGFyYW1zID0KLSAgICAgICZhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtczsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+c2FtcGxlX3JhdGUgPQotICAgICAgQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVBcHR4SGQocF9jb2RlY19pbmZvKTsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlID0KLSAgICAgIGEyZHBfY29kZWNfY29uZmlnLT5nZXRBdWRpb0JpdHNQZXJTYW1wbGUoKTsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+Y2hhbm5lbF9jb3VudCA9Ci0gICAgICBBMkRQX1ZlbmRvckdldFRyYWNrQ2hhbm5lbENvdW50QXB0eEhkKHBfY29kZWNfaW5mbyk7Ci0gIExPR19JTkZPKCIlczogc2FtcGxlX3JhdGU9JXUgYml0c19wZXJfc2FtcGxlPSV1IGNoYW5uZWxfY291bnQ9JXUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcF9mZWVkaW5nX3BhcmFtcy0+c2FtcGxlX3JhdGUsIHBfZmVlZGluZ19wYXJhbXMtPmJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgcF9mZWVkaW5nX3BhcmFtcy0+Y2hhbm5lbF9jb3VudCk7Ci0gIGEyZHBfdmVuZG9yX2FwdHhfaGRfZmVlZGluZ19yZXNldCgpOwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfaGRfZW5jb2Rlcl9jbGVhbnVwKHZvaWQpIHsKLSAgb3NpX2ZyZWUoYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IuYXB0eF9oZF9lbmNvZGVyX3N0YXRlKTsKLSAgbWVtc2V0KCZhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYiwgMCwgc2l6ZW9mKGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiKSk7Ci19Ci0KLS8vCi0vLyBJbml0aWFsaXplIHRoZSBmcmFtaW5nIHBhcmFtZXRlcnMsIGFuZCBzZXQgdGhvc2UgdGhhdCBkb24ndCBjaGFuZ2UKLS8vIHdoaWxlIHN0cmVhbWluZyAoZS5nLiwgJ3NsZWVwX3RpbWVfbnMnKS4KLS8vCi1zdGF0aWMgdm9pZCBhcHR4X2hkX2luaXRfZnJhbWluZ19wYXJhbXMoCi0gICAgdEFQVFhfSERfRlJBTUlOR19QQVJBTVMqIGZyYW1pbmdfcGFyYW1zKSB7Ci0gIGZyYW1pbmdfcGFyYW1zLT5zbGVlcF90aW1lX25zID0gMDsKLSAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcyA9IDA7Ci0gIGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQgPSAwOwotICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9oZF9ieXRlcyA9IDA7Ci0gIGZyYW1pbmdfcGFyYW1zLT5mcmFtZV9zaXplX2NvdW50ZXIgPSAwOwotCi0gIGZyYW1pbmdfcGFyYW1zLT5zbGVlcF90aW1lX25zID0gOTAwMDAwMDsKLQotICBMT0dfSU5GTygiJXM6IHNsZWVwX3RpbWVfbnMgPSAlIiBQUkl1NjQsIF9fZnVuY19fLAotICAgICAgICAgICBmcmFtaW5nX3BhcmFtcy0+c2xlZXBfdGltZV9ucyk7Ci19Ci0KLS8vCi0vLyBTZXQgZnJhbWUgc2l6ZSBhbmQgdHJhbnNtaXNzaW9uIGludGVydmFsIG5lZWRlZCB0byBzdHJlYW0gdGhlIHJlcXVpcmVkCi0vLyBzYW1wbGUgcmF0ZSB1c2luZyAyLURINSBwYWNrZXRzIGZvciBhcHRYIGFuZCAyLURIMyBwYWNrZXRzIGZvciBhcHRYLUxMLgotLy8gV2l0aCBTQ01TLVQgZW5hYmxlZCB3ZSBuZWVkIHRvIHJlc2VydmUgcm9vbSBmb3IgZXh0cmEgaGVhZGVycyBhZGRlZCBsYXRlci4KLS8vIFBhY2tldHMgYXJlIGFsd2F5cyBzZW50IGF0IGVxdWFscyB0aW1lIGludGVydmFscyBidXQgdG8gYWNoaWV2ZSB0aGUKLS8vIHJlcXVpcmVkIHNhbXBsZSByYXRlLCB0aGUgZnJhbWUgc2l6ZSBuZWVkcyB0byBjaGFuZ2Ugb24gb2NjYXNpb24uCi0vLwotLy8gQWxzbyBuZWVkIHRvIHNwZWNpZnkgaG93IG1hbnkgb2YgdGhlIHJlcXVpcmVkIFBDTSBzYW1wbGVzIGFyZSByZWFkIGF0IGEKLS8vIHRpbWU6Ci0vLyAgICAgYXB0eF9ieXRlcyA9IHBjbV9yZWFkcyAqIHBjbV9ieXRlc19wZXJfcmVhZCAvIDQKLS8vIGFuZAotLy8gICAgIG51bWJlciBvZiBhcHRYIHNhbXBsZXMgcHJvZHVjZWQgPSBwY21fYnl0ZXNfcGVyX3JlYWQgLyAxNgotLy8KLXN0YXRpYyB2b2lkIGFwdHhfaGRfdXBkYXRlX2ZyYW1pbmdfcGFyYW1zKAotICAgIHRBUFRYX0hEX0ZSQU1JTkdfUEFSQU1TKiBmcmFtaW5nX3BhcmFtcykgewotICBpZiAoYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuc2FtcGxlX3JhdGUgPT0gNDgwMDApIHsKLSAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9oZF9ieXRlcyA9IDY0ODsKLSAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX2J5dGVzX3Blcl9yZWFkID0gMjQ7Ci0gICAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcyA9IDEwODsKLSAgfSBlbHNlIHsKLSAgICAvLyBBc3N1bWUgdGhlIHNhbXBsZSByYXRlIGlzIDQ0MTAwCi0KLSAgICAvLwotICAgIC8vIFRvdGFsIG9mIDgwIGl0ZXJhdGlvbnM6Ci0gICAgLy8gLSBJdGVyYXRpb24gODA6IHBhY2tldCBzaXplIDY0OCwgd2l0aCAxMDggcmVhZHMgb2YgMjQgUENNIGJ5dGVzCi0gICAgLy8gLSBJdGVyYXRpb25zIDIwLCA0MCwgNjA6IHBhY2tldCBzaXplIDYxMiwgd2l0aCAxMDIgcmVhZHMgb2YgMjQgUENNIGJ5dGVzCi0gICAgLy8gLSBBbGwgb3RoZXIgaXRlcmF0aW9uczogcGFja2V0IHNpemUgNTk0LCB3aXRoIDk5IHJlYWRzIG9mIDI0IFBDTSBieXRlcwotICAgIC8vCi0gICAgaWYgKGZyYW1pbmdfcGFyYW1zLT5mcmFtZV9zaXplX2NvdW50ZXIgKyAxID09IDgwKSB7Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9oZF9ieXRlcyA9IDY0ODsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQgPSAyNDsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fcmVhZHMgPSAxMDg7Ci0gICAgfSBlbHNlIGlmICgoKGZyYW1pbmdfcGFyYW1zLT5mcmFtZV9zaXplX2NvdW50ZXIgKyAxKSAlIDIwKSA9PSAwKSB7Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+YXB0eF9oZF9ieXRlcyA9IDYxMjsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQgPSAyNDsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fcmVhZHMgPSAxMDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZyYW1pbmdfcGFyYW1zLT5hcHR4X2hkX2J5dGVzID0gNTk0OwotICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZCA9IDI0OwotICAgICAgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkcyA9IDk5OwotICAgIH0KLSAgICBmcmFtaW5nX3BhcmFtcy0+ZnJhbWVfc2l6ZV9jb3VudGVyKys7Ci0gICAgaWYgKGZyYW1pbmdfcGFyYW1zLT5mcmFtZV9zaXplX2NvdW50ZXIgPT0gODApCi0gICAgICBmcmFtaW5nX3BhcmFtcy0+ZnJhbWVfc2l6ZV9jb3VudGVyID0gMDsKLSAgfQotCi0gIExPR19WRVJCT1NFKCIlczogc2xlZXBfdGltZV9ucyA9ICUiIFBSSXU2NAotICAgICAgICAgICAgICAiIGFwdHhfaGRfYnl0ZXMgPSAldSAiCi0gICAgICAgICAgICAgICJwY21fYnl0ZXNfcGVyX3JlYWQgPSAldSBwY21fcmVhZHMgPSAldSBmcmFtZV9zaXplX2NvdW50ZXIgPSAldSIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBmcmFtaW5nX3BhcmFtcy0+c2xlZXBfdGltZV9ucywKLSAgICAgICAgICAgICAgZnJhbWluZ19wYXJhbXMtPmFwdHhfaGRfYnl0ZXMsIGZyYW1pbmdfcGFyYW1zLT5wY21fYnl0ZXNfcGVyX3JlYWQsCi0gICAgICAgICAgICAgIGZyYW1pbmdfcGFyYW1zLT5wY21fcmVhZHMsIGZyYW1pbmdfcGFyYW1zLT5mcmFtZV9zaXplX2NvdW50ZXIpOwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfaGRfZmVlZGluZ19yZXNldCh2b2lkKSB7Ci0gIGFwdHhfaGRfaW5pdF9mcmFtaW5nX3BhcmFtcygmYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IuZnJhbWluZ19wYXJhbXMpOwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfaGRfZmVlZGluZ19mbHVzaCh2b2lkKSB7Ci0gIGFwdHhfaGRfaW5pdF9mcmFtaW5nX3BhcmFtcygmYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IuZnJhbWluZ19wYXJhbXMpOwotfQotCi11aW50NjRfdCBhMmRwX3ZlbmRvcl9hcHR4X2hkX2dldF9lbmNvZGVyX2ludGVydmFsX21zKHZvaWQpIHsKLSAgcmV0dXJuIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLmZyYW1pbmdfcGFyYW1zLnNsZWVwX3RpbWVfbnMgLyAoMTAwMCAqIDEwMDApOwotfQotCi1pbnQgYTJkcF92ZW5kb3JfYXB0eF9oZF9nZXRfZWZmZWN0aXZlX2ZyYW1lX3NpemUoKSB7Ci0gIHJldHVybiBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi5wZWVyX3BhcmFtcy5wZWVyX210dTsKLX0KLQotdm9pZCBhMmRwX3ZlbmRvcl9hcHR4X2hkX3NlbmRfZnJhbWVzKHVpbnQ2NF90IHRpbWVzdGFtcF91cykgewotICB0QVBUWF9IRF9GUkFNSU5HX1BBUkFNUyogZnJhbWluZ19wYXJhbXMgPQotICAgICAgJmEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLmZyYW1pbmdfcGFyYW1zOwotCi0gIC8vIFByZXBhcmUgdGhlIHBhY2tldCB0byBzZW5kCi0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUpOwotICBwX2J1Zi0+b2Zmc2V0ID0gQTJEUF9BUFRYX0hEX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IDA7Ci0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0KLSAgdWludDhfdCogZW5jb2RlZF9wdHIgPSAodWludDhfdCopKHBfYnVmICsgMSk7Ci0gIGVuY29kZWRfcHRyICs9IHBfYnVmLT5vZmZzZXQ7Ci0KLSAgYXB0eF9oZF91cGRhdGVfZnJhbWluZ19wYXJhbXMoZnJhbWluZ19wYXJhbXMpOwotCi0gIC8vCi0gIC8vIFJlYWQgdGhlIFBDTSBkYXRhIGFuZCBlbmNvZGUgaXQKLSAgLy8KLSAgdWludDMyX3QKLSAgICAgIHJlYWRfYnVmZmVyMzJbQTJEUF9BUFRYX0hEX01BWF9QQ01fQllURVNfUEVSX1JFQUQgLyBzaXplb2YodWludDMyX3QpXTsKLSAgdWludDMyX3QgZXhwZWN0ZWRfcmVhZF9ieXRlcyA9Ci0gICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX3JlYWRzICogZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZDsKLSAgc2l6ZV90IGVuY29kZWRfcHRyX2luZGV4ID0gMDsKLSAgc2l6ZV90IHBjbV9ieXRlc19lbmNvZGVkID0gMDsKLSAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IDA7Ci0KLSAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9wYWNrZXRzKys7Ci0gIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQrKzsKLSAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9leHBlY3RlZF9yZWFkX2J5dGVzICs9Ci0gICAgICBleHBlY3RlZF9yZWFkX2J5dGVzOwotCi0gIExPR19WRVJCT1NFKCIlczogUENNIHJlYWQgb2Ygc2l6ZSAldSIsIF9fZnVuY19fLCBleHBlY3RlZF9yZWFkX2J5dGVzKTsKLSAgYnl0ZXNfcmVhZCA9IGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnJlYWRfY2FsbGJhY2soKHVpbnQ4X3QqKXJlYWRfYnVmZmVyMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3JlYWRfYnl0ZXMpOwotICBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzICs9Ci0gICAgICBieXRlc19yZWFkOwotICBpZiAoYnl0ZXNfcmVhZCA8IGV4cGVjdGVkX3JlYWRfYnl0ZXMpIHsKLSAgICBMT0dfV0FSTigiJXM6IHVuZGVyZmxvdyBhdCBQQ00gcmVhZGluZzogcmVhZCAldSBieXRlcyBpbnN0ZWFkIG9mICV1IiwKLSAgICAgICAgICAgICBfX2Z1bmNfXywgYnl0ZXNfcmVhZCwgZXhwZWN0ZWRfcmVhZF9ieXRlcyk7Ci0gICAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHMrKzsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfYWN0dWFsX3JlYWRzX2NvdW50Kys7Ci0KLSAgZm9yICh1aW50MzJfdCByZWFkcyA9IDAsIG9mZnNldCA9IDA7IHJlYWRzIDwgZnJhbWluZ19wYXJhbXMtPnBjbV9yZWFkczsKLSAgICAgICByZWFkcysrLCBvZmZzZXQgKz0KLSAgICAgICAgICAgICAgICBmcmFtaW5nX3BhcmFtcy0+cGNtX2J5dGVzX3Blcl9yZWFkIC8gc2l6ZW9mKHVpbnQzMl90KSkgewotICAgIHBjbV9ieXRlc19lbmNvZGVkICs9Ci0gICAgICAgIGFwdHhfaGRfZW5jb2RlXzI0Yml0KGZyYW1pbmdfcGFyYW1zLCAmZW5jb2RlZF9wdHJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyMzIgKyBvZmZzZXQsIGVuY29kZWRfcHRyKTsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIG51bWJlciBvZiBlbmNvZGVkIGJ5dGVzCi0gIGNvbnN0IGludCBDT01QUkVTU0lPTl9SQVRJTyA9IDQ7Ci0gIHNpemVfdCBlbmNvZGVkX2J5dGVzID0gcGNtX2J5dGVzX2VuY29kZWQgLyBDT01QUkVTU0lPTl9SQVRJTzsKLSAgcF9idWYtPmxlbiArPSBlbmNvZGVkX2J5dGVzOwotICBMT0dfVkVSQk9TRSgiJXM6IGVuY29kZWQgJXp1IFBDTSBieXRlcyB0byAlenUiLCBfX2Z1bmNfXywgcGNtX2J5dGVzX2VuY29kZWQsCi0gICAgICAgICAgICAgIGVuY29kZWRfYnl0ZXMpOwotCi0gIC8vIFVwZGF0ZSB0aGUgUlRQIHRpbWVzdGFtcAotICAqKCh1aW50MzJfdCopKHBfYnVmICsgMSkpID0gYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IudGltZXN0YW1wOwotICBjb25zdCB1aW50OF90IEJZVEVTX1BFUl9GUkFNRSA9IDM7Ci0gIHVpbnQzMl90IHJ0cF90aW1lc3RhbXAgPQotICAgICAgKHBjbV9ieXRlc19lbmNvZGVkIC8KLSAgICAgICBhMmRwX2FwdHhfaGRfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5jaGFubmVsX2NvdW50KSAvCi0gICAgICBCWVRFU19QRVJfRlJBTUU7Ci0gIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnRpbWVzdGFtcCArPSBydHBfdGltZXN0YW1wOwotCi0gIGlmIChwX2J1Zi0+bGVuID4gMCkgewotICAgIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLmVucXVldWVfY2FsbGJhY2socF9idWYsIDEsIGJ5dGVzX3JlYWQpOwotICB9IGVsc2UgewotICAgIGEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZHJvcHBlZF9wYWNrZXRzKys7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgYXB0eF9oZF9lbmNvZGVfMjRiaXQodEFQVFhfSERfRlJBTUlOR19QQVJBTVMqIGZyYW1pbmdfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGRhdGFfb3V0X2luZGV4LCB1aW50MzJfdCogZGF0YTMyX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX291dCkgewotICBzaXplX3QgcGNtX2J5dGVzX2VuY29kZWQgPSAwOwotICBjb25zdCB1aW50OF90KiBwID0gKGNvbnN0IHVpbnQ4X3QqKShkYXRhMzJfaW4pOwotCi0gIGZvciAoc2l6ZV90IGFwdHhfaGRfc2FtcGxlcyA9IDA7Ci0gICAgICAgYXB0eF9oZF9zYW1wbGVzIDwgZnJhbWluZ19wYXJhbXMtPnBjbV9ieXRlc19wZXJfcmVhZCAvIDI0OwotICAgICAgIGFwdHhfaGRfc2FtcGxlcysrKSB7Ci0gICAgdWludDMyX3QgcGNtTFs0XTsKLSAgICB1aW50MzJfdCBwY21SWzRdOwotICAgIHVpbnQzMl90IGVuY29kZWRfc2FtcGxlWzJdOwotCi0gICAgLy8gRXhwYW5kIGZyb20gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIGRhdGEgKDMgYnl0ZXMgcGVyIHNhbXBsZSkKLSAgICAvLyBpbnRvIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQgKDQgYnl0ZXMgcGVyIHNhbXBsZSkuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgIHBjbUxbaV0gPSAoKHBbMF0gPDwgMCkgfCAocFsxXSA8PCA4KSB8ICgoKGludDhfdClwWzJdKSA8PCAxNikpOwotICAgICAgcCArPSAzOwotICAgICAgcGNtUltpXSA9ICgocFswXSA8PCAwKSB8IChwWzFdIDw8IDgpIHwgKCgoaW50OF90KXBbMl0pIDw8IDE2KSk7Ci0gICAgICBwICs9IDM7Ci0gICAgfQotCi0gICAgYXB0eF9oZF9lbmNvZGVyX2VuY29kZV9zdGVyZW9fZnVuYygKLSAgICAgICAgYTJkcF9hcHR4X2hkX2VuY29kZXJfY2IuYXB0eF9oZF9lbmNvZGVyX3N0YXRlLCAmcGNtTCwgJnBjbVIsCi0gICAgICAgICZlbmNvZGVkX3NhbXBsZSk7Ci0KLSAgICB1aW50OF90KiBlbmNvZGVkX3B0ciA9ICh1aW50OF90KikmZW5jb2RlZF9zYW1wbGVbMF07Ci0gICAgZGF0YV9vdXRbKmRhdGFfb3V0X2luZGV4ICsgMF0gPSAqKGVuY29kZWRfcHRyICsgMik7Ci0gICAgZGF0YV9vdXRbKmRhdGFfb3V0X2luZGV4ICsgMV0gPSAqKGVuY29kZWRfcHRyICsgMSk7Ci0gICAgZGF0YV9vdXRbKmRhdGFfb3V0X2luZGV4ICsgMl0gPSAqKGVuY29kZWRfcHRyICsgMCk7Ci0gICAgZGF0YV9vdXRbKmRhdGFfb3V0X2luZGV4ICsgM10gPSAqKGVuY29kZWRfcHRyICsgNik7Ci0gICAgZGF0YV9vdXRbKmRhdGFfb3V0X2luZGV4ICsgNF0gPSAqKGVuY29kZWRfcHRyICsgNSk7Ci0gICAgZGF0YV9vdXRbKmRhdGFfb3V0X2luZGV4ICsgNV0gPSAqKGVuY29kZWRfcHRyICsgNCk7Ci0KLSAgICBwY21fYnl0ZXNfZW5jb2RlZCArPSAyNDsKLSAgICAqZGF0YV9vdXRfaW5kZXggKz0gNjsKLSAgfQotCi0gIHJldHVybiBwY21fYnl0ZXNfZW5jb2RlZDsKLX0KLQotdm9pZCBBMmRwQ29kZWNDb25maWdBcHR4SGQ6OmRlYnVnX2NvZGVjX2R1bXAoaW50IGZkKSB7Ci0gIGEyZHBfYXB0eF9oZF9lbmNvZGVyX3N0YXRzX3QqIHN0YXRzID0gJmEyZHBfYXB0eF9oZF9lbmNvZGVyX2NiLnN0YXRzOwotCi0gIEEyZHBDb2RlY0NvbmZpZzo6ZGVidWdfY29kZWNfZHVtcChmZCk7Ci0KLSAgZHByaW50ZihmZCwgIiAgRW5jb2RlciBpbnRlcnZhbCAobXMpOiAlIiBQUkl1NjQgIlxuIiwKLSAgICAgICAgICBhMmRwX3ZlbmRvcl9hcHR4X2hkX2dldF9lbmNvZGVyX2ludGVydmFsX21zKCkpOwotICBkcHJpbnRmKGZkLCAiICBFZmZlY3RpdmUgTVRVOiAlZFxuIiwKLSAgICAgICAgICBhMmRwX3ZlbmRvcl9hcHR4X2hkX2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSgpKTsKLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBQYWNrZXQgY291bnRzIChleHBlY3RlZC9kcm9wcGVkKSAgICAgICAgICAgICAgICAgICAgICAgIDogJXp1IC8gIgotICAgICAgICAgICIlenVcbiIsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcGFja2V0cywKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHMpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgUENNIHJlYWQgY291bnRzIChleHBlY3RlZC9hY3R1YWwpICAgICAgICAgICAgICAgICAgICAgICA6ICV6dSAvICIKLSAgICAgICAgICAiJXp1XG4iLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRzX2NvdW50LAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkc19jb3VudCk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBQQ00gcmVhZCBieXRlcyAoZXhwZWN0ZWQvYWN0dWFsKSAgICAgICAgICAgICAgICAgICAgICAgIDogJXp1IC8gIgotICAgICAgICAgICIlenVcbiIsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZF9ieXRlcywKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZF9ieXRlcyk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hMmRwL2EyZHBfdmVuZG9yX2xkYWMuY2MgYi9zdGFjay9hMmRwL2EyZHBfdmVuZG9yX2xkYWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWFlZTUuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9sZGFjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGhlbHAgYnVpbGQgYW5kIHBhcnNlIHRoZSBMREFDIENvZGVjIEluZm9ybWF0aW9uCi0gKiAgRWxlbWVudCBhbmQgTWVkaWEgUGF5bG9hZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImEyZHBfdmVuZG9yX2xkYWMiCi0KLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9sZGFjLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhY19lbmNvZGVyLmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJidGlmX2F2X2NvLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLy8gZGF0YSB0eXBlIGZvciB0aGUgTERBQyBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50ICovCi0vLyBOT1RFOiBiaXRzX3Blcl9zYW1wbGUgaXMgbmVlZGVkIG9ubHkgZm9yIExEQUMgZW5jb2RlciBpbml0aWFsaXphdGlvbi4KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgdmVuZG9ySWQ7Ci0gIHVpbnQxNl90IGNvZGVjSWQ7ICAgIC8qIENvZGVjIElEIGZvciBMREFDICovCi0gIHVpbnQ4X3Qgc2FtcGxlUmF0ZTsgIC8qIFNhbXBsaW5nIEZyZXF1ZW5jeSAqLwotICB1aW50OF90IGNoYW5uZWxNb2RlOyAvKiBTVEVSRU8vRFVBTC9NT05PICovCi0gIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBiaXRzX3Blcl9zYW1wbGU7Ci19IHRBMkRQX0xEQUNfQ0lFOwotCi0vKiBMREFDIFNvdXJjZSBjb2RlYyBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBjb25zdCB0QTJEUF9MREFDX0NJRSBhMmRwX2xkYWNfc291cmNlX2NhcHMgPSB7Ci0gICAgQTJEUF9MREFDX1ZFTkRPUl9JRCwgIC8vIHZlbmRvcklkCi0gICAgQTJEUF9MREFDX0NPREVDX0lELCAgIC8vIGNvZGVjSWQKLSAgICAvLyBzYW1wbGVSYXRlCi0gICAgKEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ0MTAwIHwgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDgwMDAgfAotICAgICBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV84ODIwMCB8IEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzk2MDAwKSwKLSAgICAvLyBjaGFubmVsTW9kZQotICAgIChBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUwgfCBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTyksCi0gICAgLy8gYml0c19wZXJfc2FtcGxlCi0gICAgKEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYgfCBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0IHwKLSAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMil9OwotCi0vKiBMREFDIFNpbmsgY29kZWMgY2FwYWJpbGl0aWVzICovCi1zdGF0aWMgY29uc3QgdEEyRFBfTERBQ19DSUUgYTJkcF9sZGFjX3NpbmtfY2FwcyA9IHsKLSAgICBBMkRQX0xEQUNfVkVORE9SX0lELCAgLy8gdmVuZG9ySWQKLSAgICBBMkRQX0xEQUNfQ09ERUNfSUQsICAgLy8gY29kZWNJZAotICAgIC8vIHNhbXBsZVJhdGUKLSAgICAoQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDQxMDAgfCBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80ODAwMCB8Ci0gICAgIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzg4MjAwIHwgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfOTYwMDApLAotICAgIC8vIGNoYW5uZWxNb2RlCi0gICAgKEEyRFBfTERBQ19DSEFOTkVMX01PREVfTU9OTyB8IEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTCB8Ci0gICAgIEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPKSwKLSAgICAvLyBiaXRzX3Blcl9zYW1wbGUKLSAgICAoQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNiB8IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQgfAotICAgICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyKX07Ci0KLS8qIERlZmF1bHQgTERBQyBjb2RlYyBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgY29uc3QgdEEyRFBfTERBQ19DSUUgYTJkcF9sZGFjX2RlZmF1bHRfY29uZmlnID0gewotICAgIEEyRFBfTERBQ19WRU5ET1JfSUQsICAgICAgICAgICAgICAgIC8vIHZlbmRvcklkCi0gICAgQTJEUF9MREFDX0NPREVDX0lELCAgICAgICAgICAgICAgICAgLy8gY29kZWNJZAotICAgIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzk2MDAwLCAgICAgIC8vIHNhbXBsZVJhdGUKLSAgICBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTywgICAgICAvLyBjaGFubmVsTW9kZQotICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIgIC8vIGJpdHNfcGVyX3NhbXBsZQotfTsKLQotc3RhdGljIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFIGEyZHBfZW5jb2Rlcl9pbnRlcmZhY2VfbGRhYyA9IHsKLSAgICBhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXJfaW5pdCwKLSAgICBhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXJfY2xlYW51cCwKLSAgICBhMmRwX3ZlbmRvcl9sZGFjX2ZlZWRpbmdfcmVzZXQsCi0gICAgYTJkcF92ZW5kb3JfbGRhY19mZWVkaW5nX2ZsdXNoLAotICAgIGEyZHBfdmVuZG9yX2xkYWNfZ2V0X2VuY29kZXJfaW50ZXJ2YWxfbXMsCi0gICAgYTJkcF92ZW5kb3JfbGRhY19nZXRfZWZmZWN0aXZlX2ZyYW1lX3NpemUsCi0gICAgYTJkcF92ZW5kb3JfbGRhY19zZW5kX2ZyYW1lcywKLSAgICBhMmRwX3ZlbmRvcl9sZGFjX3NldF90cmFuc21pdF9xdWV1ZV9sZW5ndGh9OwotCi1zdGF0aWMgY29uc3QgdEEyRFBfREVDT0RFUl9JTlRFUkZBQ0UgYTJkcF9kZWNvZGVyX2ludGVyZmFjZV9sZGFjID0gewotICAgIGEyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl9pbml0LCAgICAgICAgICBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfY2xlYW51cCwKLSAgICBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfZGVjb2RlX3BhY2tldCwgYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyX3N0YXJ0LAotICAgIGEyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl9zdXNwZW5kLCAgICAgICBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfY29uZmlndXJlLAotfTsKLQotVU5VU0VEX0FUVFIgc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5TGRhYygKLSAgICBjb25zdCB0QTJEUF9MREFDX0NJRSogcF9jYXAsIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICBib29sIGlzX3BlZXJfY29kZWNfaW5mbyk7Ci0KLS8vIEJ1aWxkcyB0aGUgTERBQyBNZWRpYSBDb2RlYyBDYXBhYmlsaXRpZXMgYnl0ZSBzZXF1ZW5jZSBiZWdpbm5pbmcgZnJvbSB0aGUKLS8vIExPU0Mgb2N0ZXQuIHxtZWRpYV90eXBlfCBpcyB0aGUgbWVkaWEgdHlwZSB8QVZEVF9NRURJQV9UWVBFXyp8LgotLy8gfHBfaWV8IGlzIGEgcG9pbnRlciB0byB0aGUgTERBQyBDb2RlYyBJbmZvcm1hdGlvbiBFbGVtZW50IGluZm9ybWF0aW9uLgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fC4gUmV0dXJucyBBMkRQX1NVQ0NFU1Mgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB0aGUgY29ycmVzcG9uZGluZyBBMkRQIGVycm9yIHN0YXR1cyBjb2RlLgotc3RhdGljIHRBMkRQX1NUQVRVUyBBMkRQX0J1aWxkSW5mb0xkYWModWludDhfdCBtZWRpYV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEEyRFBfTERBQ19DSUUqIHBfaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdCkgewotICBpZiAocF9pZSA9PSBOVUxMIHx8IHBfcmVzdWx0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gQTJEUF9JTlZBTElEX1BBUkFNUzsKLSAgfQotCi0gICpwX3Jlc3VsdCsrID0gQTJEUF9MREFDX0NPREVDX0xFTjsKLSAgKnBfcmVzdWx0KysgPSAobWVkaWFfdHlwZSA8PCA0KTsKLSAgKnBfcmVzdWx0KysgPSBBMkRQX01FRElBX0NUX05PTl9BMkRQOwotCi0gIC8vIFZlbmRvciBJRCBhbmQgQ29kZWMgSUQKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkocF9pZS0+dmVuZG9ySWQgJiAweDAwMDAwMEZGKTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkoKHBfaWUtPnZlbmRvcklkICYgMHgwMDAwRkYwMCkgPj4gOCk7Ci0gICpwX3Jlc3VsdCsrID0gKHVpbnQ4X3QpKChwX2llLT52ZW5kb3JJZCAmIDB4MDBGRjAwMDApID4+IDE2KTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkoKHBfaWUtPnZlbmRvcklkICYgMHhGRjAwMDAwMCkgPj4gMjQpOwotICAqcF9yZXN1bHQrKyA9ICh1aW50OF90KShwX2llLT5jb2RlY0lkICYgMHgwMEZGKTsKLSAgKnBfcmVzdWx0KysgPSAodWludDhfdCkoKHBfaWUtPmNvZGVjSWQgJiAweEZGMDApID4+IDgpOwotCi0gIC8vIFNhbXBsaW5nIEZyZXF1ZW5jeQotICAqcF9yZXN1bHQgPSAodWludDhfdCkocF9pZS0+c2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRX01BU0spOwotICBpZiAoKnBfcmVzdWx0ID09IDApIHJldHVybiBBMkRQX0lOVkFMSURfUEFSQU1TOwotICBwX3Jlc3VsdCsrOwotCi0gIC8vIENoYW5uZWwgTW9kZQotICAqcF9yZXN1bHQgPSAodWludDhfdCkocF9pZS0+Y2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX01BU0spOwotICBpZiAoKnBfcmVzdWx0ID09IDApIHJldHVybiBBMkRQX0lOVkFMSURfUEFSQU1TOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLS8vIFBhcnNlcyB0aGUgTERBQyBNZWRpYSBDb2RlYyBDYXBhYmlsaXRpZXMgYnl0ZSBzZXF1ZW5jZSBiZWdpbm5pbmcgZnJvbSB0aGUKLS8vIExPU0Mgb2N0ZXQuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX2llfC4gVGhlIGJ5dGUgc2VxdWVuY2UgdG8gcGFyc2UgaXMKLS8vIHxwX2NvZGVjX2luZm98LiBJZiB8aXNfY2FwYWJpbGl0eXwgaXMgdHJ1ZSwgdGhlIGJ5dGUgc2VxdWVuY2UgaXMKLS8vIGNvZGVjIGNhcGFiaWxpdGllcywgb3RoZXJ3aXNlIGlzIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0vLyBSZXR1cm5zIEEyRFBfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgdGhlIGNvcnJlc3BvbmRpbmcgQTJEUCBlcnJvcgotLy8gc3RhdHVzIGNvZGUuCi1zdGF0aWMgdEEyRFBfU1RBVFVTIEEyRFBfUGFyc2VJbmZvTGRhYyh0QTJEUF9MREFDX0NJRSogcF9pZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2FwYWJpbGl0eSkgewotICB1aW50OF90IGxvc2M7Ci0gIHVpbnQ4X3QgbWVkaWFfdHlwZTsKLSAgdEEyRFBfQ09ERUNfVFlQRSBjb2RlY190eXBlOwotCi0gIGlmIChwX2llID09IE5VTEwgfHwgcF9jb2RlY19pbmZvID09IE5VTEwpIHJldHVybiBBMkRQX0lOVkFMSURfUEFSQU1TOwotCi0gIC8vIENoZWNrIHRoZSBjb2RlYyBjYXBhYmlsaXR5IGxlbmd0aAotICBsb3NjID0gKnBfY29kZWNfaW5mbysrOwotICBpZiAobG9zYyAhPSBBMkRQX0xEQUNfQ09ERUNfTEVOKSByZXR1cm4gQTJEUF9XUk9OR19DT0RFQzsKLQotICBtZWRpYV90eXBlID0gKCpwX2NvZGVjX2luZm8rKykgPj4gNDsKLSAgY29kZWNfdHlwZSA9ICpwX2NvZGVjX2luZm8rKzsKLSAgLyogQ2hlY2sgdGhlIE1lZGlhIFR5cGUgYW5kIE1lZGlhIENvZGVjIFR5cGUgKi8KLSAgaWYgKG1lZGlhX3R5cGUgIT0gQVZEVF9NRURJQV9UWVBFX0FVRElPIHx8Ci0gICAgICBjb2RlY190eXBlICE9IEEyRFBfTUVESUFfQ1RfTk9OX0EyRFApIHsKLSAgICByZXR1cm4gQTJEUF9XUk9OR19DT0RFQzsKLSAgfQotCi0gIC8vIENoZWNrIHRoZSBWZW5kb3IgSUQgYW5kIENvZGVjIElEICovCi0gIHBfaWUtPnZlbmRvcklkID0gKCpwX2NvZGVjX2luZm8gJiAweDAwMDAwMEZGKSB8Ci0gICAgICAgICAgICAgICAgICAgKCoocF9jb2RlY19pbmZvICsgMSkgPDwgOCAmIDB4MDAwMEZGMDApIHwKLSAgICAgICAgICAgICAgICAgICAoKihwX2NvZGVjX2luZm8gKyAyKSA8PCAxNiAmIDB4MDBGRjAwMDApIHwKLSAgICAgICAgICAgICAgICAgICAoKihwX2NvZGVjX2luZm8gKyAzKSA8PCAyNCAmIDB4RkYwMDAwMDApOwotICBwX2NvZGVjX2luZm8gKz0gNDsKLSAgcF9pZS0+Y29kZWNJZCA9Ci0gICAgICAoKnBfY29kZWNfaW5mbyAmIDB4MDBGRikgfCAoKihwX2NvZGVjX2luZm8gKyAxKSA8PCA4ICYgMHhGRjAwKTsKLSAgcF9jb2RlY19pbmZvICs9IDI7Ci0gIGlmIChwX2llLT52ZW5kb3JJZCAhPSBBMkRQX0xEQUNfVkVORE9SX0lEIHx8Ci0gICAgICBwX2llLT5jb2RlY0lkICE9IEEyRFBfTERBQ19DT0RFQ19JRCkgewotICAgIHJldHVybiBBMkRQX1dST05HX0NPREVDOwotICB9Ci0KLSAgcF9pZS0+c2FtcGxlUmF0ZSA9ICpwX2NvZGVjX2luZm8rKyAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRX01BU0s7Ci0gIHBfaWUtPmNoYW5uZWxNb2RlID0gKnBfY29kZWNfaW5mbysrICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NQVNLOwotCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgLy8gTk9URTogVGhlIGNoZWNrcyBoZXJlIGFyZSB2ZXJ5IGxpYmVyYWwuIFdlIHNob3VsZCBiZSB1c2luZyBtb3JlCi0gICAgLy8gcGVkYW50aWMgY2hlY2tzIHNwZWNpZmljIHRvIHRoZSBTUkMgb3IgU05LIGFzIHNwZWNpZmllZCBpbiB0aGUgc3BlYy4KLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPnNhbXBsZVJhdGUpID09IEEyRFBfU0VUX1pFUk9fQklUKQotICAgICAgcmV0dXJuIEEyRFBfQkFEX1NBTVBfRlJFUTsKLSAgICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSA9PSBBMkRQX1NFVF9aRVJPX0JJVCkKLSAgICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gICAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLSAgfQotCi0gIGlmIChBMkRQX0JpdHNTZXQocF9pZS0+c2FtcGxlUmF0ZSkgIT0gQTJEUF9TRVRfT05FX0JJVCkKLSAgICByZXR1cm4gQTJEUF9CQURfU0FNUF9GUkVROwotICBpZiAoQTJEUF9CaXRzU2V0KHBfaWUtPmNoYW5uZWxNb2RlKSAhPSBBMkRQX1NFVF9PTkVfQklUKQotICAgIHJldHVybiBBMkRQX0JBRF9DSF9NT0RFOwotCi0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci0KLS8vIEJ1aWxkIHRoZSBMREFDIE1lZGlhIFBheWxvYWQgSGVhZGVyLgotLy8gfHBfZHN0fCBwb2ludHMgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBoZWFkZXIgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCi0vLyBJZiB8ZnJhZ3wgaXMgdHJ1ZSwgdGhlIG1lZGlhIHBheWxvYWQgZnJhbWUgaXMgZnJhZ21lbnRlZC4KLS8vIHxzdGFydHwgaXMgdHJ1ZSBmb3IgdGhlIGZpcnN0IHBhY2tldCBvZiBhIGZyYWdtZW50ZWQgZnJhbWUuCi0vLyB8bGFzdHwgaXMgdHJ1ZSBmb3IgdGhlIGxhc3QgcGFja2V0IG9mIGEgZnJhZ21lbnRlZCBmcmFtZS4KLS8vIElmIHxmcmFnfCBpcyBmYWxzZSwgfG51bXwgaXMgdGhlIG51bWJlciBvZiBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBwYWNrZXQsCi0vLyBvdGhlcndpc2UgaXMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgZnJhZ21lbnRzIChpbmNsdWRpbmcgdGhpcyBvbmUpLgotc3RhdGljIHZvaWQgQTJEUF9CdWlsZE1lZGlhUGF5bG9hZEhlYWRlckxkYWModWludDhfdCogcF9kc3QsIGJvb2wgZnJhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnQsIGJvb2wgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtKSB7Ci0gIGlmIChwX2RzdCA9PSBOVUxMKSByZXR1cm47Ci0KLSAgKnBfZHN0ID0gMDsKLSAgaWYgKGZyYWcpICpwX2RzdCB8PSBBMkRQX0xEQUNfSERSX0ZfTVNLOwotICBpZiAoc3RhcnQpICpwX2RzdCB8PSBBMkRQX0xEQUNfSERSX1NfTVNLOwotICBpZiAobGFzdCkgKnBfZHN0IHw9IEEyRFBfTERBQ19IRFJfTF9NU0s7Ci0gICpwX2RzdCB8PSAoQTJEUF9MREFDX0hEUl9OVU1fTVNLICYgbnVtKTsKLX0KLQotYm9vbCBBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0xEQUNfQ0lFIGNmZ19jaWU7Ci0KLSAgLyogVXNlIGEgbGliZXJhbCBjaGVjayB3aGVuIHBhcnNpbmcgdGhlIGNvZGVjIGluZm8gKi8KLSAgcmV0dXJuIChBMkRQX1BhcnNlSW5mb0xkYWMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpID09IEEyRFBfU1VDQ0VTUykgfHwKLSAgICAgICAgIChBMkRQX1BhcnNlSW5mb0xkYWMoJmNmZ19jaWUsIHBfY29kZWNfaW5mbywgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTKTsKLX0KLQotYm9vbCBBMkRQX0lzVmVuZG9yU2lua0NvZGVjVmFsaWRMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9MREFDX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9MZGFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9MZGFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTb3VyY2VDb2RlY1ZhbGlkTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfTERBQ19DSUUgY2ZnX2NpZTsKLQotICAvKiBVc2UgYSBsaWJlcmFsIGNoZWNrIHdoZW4gcGFyc2luZyB0aGUgY29kZWMgaW5mbyAqLwotICByZXR1cm4gKEEyRFBfUGFyc2VJbmZvTGRhYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSkgPT0gQTJEUF9TVUNDRVNTKSB8fAotICAgICAgICAgKEEyRFBfUGFyc2VJbmZvTGRhYygmY2ZnX2NpZSwgcF9jb2RlY19pbmZvLCB0cnVlKSA9PSBBMkRQX1NVQ0NFU1MpOwotfQotCi1ib29sIEEyRFBfSXNWZW5kb3JQZWVyU2lua0NvZGVjVmFsaWRMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9MREFDX0NJRSBjZmdfY2llOwotCi0gIC8qIFVzZSBhIGxpYmVyYWwgY2hlY2sgd2hlbiBwYXJzaW5nIHRoZSBjb2RlYyBpbmZvICovCi0gIHJldHVybiAoQTJEUF9QYXJzZUluZm9MZGFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKSA9PSBBMkRQX1NVQ0NFU1MpIHx8Ci0gICAgICAgICAoQTJEUF9QYXJzZUluZm9MZGFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpID09IEEyRFBfU1VDQ0VTUyk7Ci19Ci0KLWJvb2wgQTJEUF9Jc1ZlbmRvclNpbmtDb2RlY1N1cHBvcnRlZExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5TGRhYygmYTJkcF9sZGFjX3NpbmtfY2FwcywgcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpID09IEEyRFBfU1VDQ0VTUzsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBBMkRQX0NvZGVjSW5mb01hdGNoZXNDYXBhYmlsaXR5TGRhYygmYTJkcF9sZGFjX3NpbmtfY2FwcywgcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkgPT0gQTJEUF9TVUNDRVNTOwotfQotCi0vLyBDaGVja3Mgd2hldGhlciBBMkRQIExEQUMgY29kZWMgY29uZmlndXJhdGlvbiBtYXRjaGVzIHdpdGggYSBkZXZpY2UncyBjb2RlYwotLy8gY2FwYWJpbGl0aWVzLiB8cF9jYXB8IGlzIHRoZSBMREFDIGNvZGVjIGNvbmZpZ3VyYXRpb24uIHxwX2NvZGVjX2luZm98IGlzCi0vLyB0aGUgZGV2aWNlJ3MgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gSWYgfGlzX2NhcGFiaWxpdHl8IGlzIHRydWUsIHRoZSBieXRlIHNlcXVlbmNlIGlzIGNvZGVjIGNhcGFiaWxpdGllcywKLS8vIG90aGVyd2lzZSBpcyBjb2RlYyBjb25maWd1cmF0aW9uLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBmb3IgYSBwZWVyIGRldmljZSB0aGF0Ci0vLyBpcyBhY3RpbmcgYXMgYW4gQTJEUCBzb3VyY2UuCi0vLyBSZXR1cm5zIEEyRFBfU1VDQ0VTUyBpZiB0aGUgY29kZWMgY29uZmlndXJhdGlvbiBtYXRjaGVzIHdpdGggY2FwYWJpbGl0aWVzLAotLy8gb3RoZXJ3aXNlIHRoZSBjb3JyZXNwb25kaW5nIEEyRFAgZXJyb3Igc3RhdHVzIGNvZGUuCi1zdGF0aWMgdEEyRFBfU1RBVFVTIEEyRFBfQ29kZWNJbmZvTWF0Y2hlc0NhcGFiaWxpdHlMZGFjKAotICAgIGNvbnN0IHRBMkRQX0xEQUNfQ0lFKiBwX2NhcCwgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgIGJvb2wgaXNfY2FwYWJpbGl0eSkgewotICB0QTJEUF9TVEFUVVMgc3RhdHVzOwotICB0QTJEUF9MREFDX0NJRSBjZmdfY2llOwotCi0gIC8qIHBhcnNlIGNvbmZpZ3VyYXRpb24gKi8KLSAgc3RhdHVzID0gQTJEUF9QYXJzZUluZm9MZGFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIGlzX2NhcGFiaWxpdHkpOwotICBpZiAoc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IHBhcnNpbmcgZmFpbGVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qIHZlcmlmeSB0aGF0IGVhY2ggcGFyYW1ldGVyIGlzIGluIHJhbmdlICovCi0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBGUkVRIHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBjZmdfY2llLnNhbXBsZVJhdGUsIHBfY2FwLT5zYW1wbGVSYXRlKTsKLSAgTE9HX1ZFUkJPU0UoIiVzOiBDSF9NT0RFIHBlZXI6IDB4JXgsIGNhcGFiaWxpdHkgMHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBjZmdfY2llLmNoYW5uZWxNb2RlLCBwX2NhcC0+Y2hhbm5lbE1vZGUpOwotCi0gIC8qIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICBpZiAoKGNmZ19jaWUuc2FtcGxlUmF0ZSAmIHBfY2FwLT5zYW1wbGVSYXRlKSA9PSAwKSByZXR1cm4gQTJEUF9OU19TQU1QX0ZSRVE7Ci0KLSAgLyogY2hhbm5lbCBtb2RlICovCi0gIGlmICgoY2ZnX2NpZS5jaGFubmVsTW9kZSAmIHBfY2FwLT5jaGFubmVsTW9kZSkgPT0gMCkgcmV0dXJuIEEyRFBfTlNfQ0hfTU9ERTsKLQotICByZXR1cm4gQTJEUF9TVUNDRVNTOwotfQotCi1ib29sIEEyRFBfVmVuZG9yVXNlc1J0cEhlYWRlckxkYWMoVU5VU0VEX0FUVFIgYm9vbCBjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgLy8gVE9ETzogSXMgdGhpcyBjb3JyZWN0PyBUaGUgUlRQIGhlYWRlciBpcyBhbHdheXMgaW5jbHVkZWQ/Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjTmFtZUxkYWMoVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiAiTERBQyI7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JDb2RlY1R5cGVFcXVhbHNMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpIHsKLSAgdEEyRFBfTERBQ19DSUUgbGRhY19jaWVfYTsKLSAgdEEyRFBfTERBQ19DSUUgbGRhY19jaWVfYjsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0KLSAgICAgIEEyRFBfUGFyc2VJbmZvTGRhYygmbGRhY19jaWVfYSwgcF9jb2RlY19pbmZvX2EsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvTGRhYygmbGRhY19jaWVfYiwgcF9jb2RlY19pbmZvX2IsIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNFcXVhbHNMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICB0QTJEUF9MREFDX0NJRSBsZGFjX2NpZV9hOwotICB0QTJEUF9MREFDX0NJRSBsZGFjX2NpZV9iOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9MZGFjKCZsZGFjX2NpZV9hLCBwX2NvZGVjX2luZm9fYSwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9MZGFjKCZsZGFjX2NpZV9iLCBwX2NvZGVjX2luZm9fYiwgdHJ1ZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIChsZGFjX2NpZV9hLnNhbXBsZVJhdGUgPT0gbGRhY19jaWVfYi5zYW1wbGVSYXRlKSAmJgotICAgICAgICAgKGxkYWNfY2llX2EuY2hhbm5lbE1vZGUgPT0gbGRhY19jaWVfYi5jaGFubmVsTW9kZSk7Ci19Ci0KLWludCBBMkRQX1ZlbmRvckdldEJpdFJhdGVMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBBMmRwQ29kZWNDb25maWcqIGN1cnJlbnRfY29kZWMgPSBidGFfYXZfZ2V0X2EyZHBfY3VycmVudF9jb2RlYygpOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnXyA9IGN1cnJlbnRfY29kZWMtPmdldENvZGVjQ29uZmlnKCk7Ci0gIGludCBzYW1wbGVyYXRlID0gQTJEUF9HZXRUcmFja1NhbXBsZVJhdGUocF9jb2RlY19pbmZvKTsKLSAgc3dpdGNoIChjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzEgJSAxMCkgewotICAgIGNhc2UgMDoKLSAgICAgIGlmIChzYW1wbGVyYXRlID09IDQ0MTAwIHx8IHNhbXBsZXJhdGUgPT0gODgyMDApCi0gICAgICAgIHJldHVybiA5MDkwMDA7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiA5OTAwMDA7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKHNhbXBsZXJhdGUgPT0gNDQxMDAgfHwgc2FtcGxlcmF0ZSA9PSA4ODIwMCkKLSAgICAgICAgcmV0dXJuIDYwNjAwMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDY2MDAwMDsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoc2FtcGxlcmF0ZSA9PSA0NDEwMCB8fCBzYW1wbGVyYXRlID09IDg4MjAwKQotICAgICAgICByZXR1cm4gMzAzMDAwOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gMzMwMDAwOwotICAgIGNhc2UgMzoKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHNhbXBsZXJhdGUgPT0gNDQxMDAgfHwgc2FtcGxlcmF0ZSA9PSA4ODIwMCkKLSAgICAgICAgcmV0dXJuIDkwOTAwMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDk5MDAwMDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tTYW1wbGVSYXRlTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfTERBQ19DSUUgbGRhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvTGRhYygmbGRhY19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN3aXRjaCAobGRhY19jaWUuc2FtcGxlUmF0ZSkgewotICAgIGNhc2UgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDQxMDA6Ci0gICAgICByZXR1cm4gNDQxMDA7Ci0gICAgY2FzZSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80ODAwMDoKLSAgICAgIHJldHVybiA0ODAwMDsKLSAgICBjYXNlIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzg4MjAwOgotICAgICAgcmV0dXJuIDg4MjAwOwotICAgIGNhc2UgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfOTYwMDA6Ci0gICAgICByZXR1cm4gOTYwMDA7Ci0gICAgY2FzZSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xNzY0MDA6Ci0gICAgICByZXR1cm4gMTc2NDAwOwotICAgIGNhc2UgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTkyMDAwOgotICAgICAgcmV0dXJuIDE5MjAwMDsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tCaXRzUGVyU2FtcGxlTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfTERBQ19DSUUgbGRhY19jaWU7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29kZWMgaW5mbyBjb250YWlucyB2YWxpZCBkYXRhCi0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1cyA9IEEyRFBfUGFyc2VJbmZvTGRhYygmbGRhY19jaWUsIHBfY29kZWNfaW5mbywgZmFsc2UpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGRlY29kZSBjb2RlYyBpbmZvcm1hdGlvbjogJWQiLCBfX2Z1bmNfXywgYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0jaWYgMQotICByZXR1cm4gMzI7Ci0jZWxzZQotICAvLyBUT0RPIDogSW1wbGVtZW50IHByb2MgdG8gY2FyZSBhYm91dCBiaXQgcGVyIHNhbXBsZSBpbiBBMkRQX1BhcnNlSW5mb0xkYWMoKQotCi0gIHN3aXRjaCAobGRhY19jaWUuYml0c19wZXJfc2FtcGxlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OgotICAgICAgcmV0dXJuIDE2OwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNDoKLSAgICAgIHJldHVybiAyNDsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzI6Ci0gICAgICByZXR1cm4gMzI7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU6Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSNlbmRpZgotfQotCi1pbnQgQTJEUF9WZW5kb3JHZXRUcmFja0NoYW5uZWxDb3VudExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0xEQUNfQ0lFIGxkYWNfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0xkYWMoJmxkYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGxkYWNfY2llLmNoYW5uZWxNb2RlKSB7Ci0gICAgY2FzZSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTDoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICByZXR1cm4gMjsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGVMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICB0QTJEUF9MREFDX0NJRSBsZGFjX2NpZTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb2RlYyBpbmZvIGNvbnRhaW5zIHZhbGlkIGRhdGEKLSAgdEEyRFBfU1RBVFVTIGEyZHBfc3RhdHVzID0gQTJEUF9QYXJzZUluZm9MZGFjKCZsZGFjX2NpZSwgcF9jb2RlY19pbmZvLCBmYWxzZSk7Ci0gIGlmIChhMmRwX3N0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZGVjb2RlIGNvZGVjIGluZm9ybWF0aW9uOiAlZCIsIF9fZnVuY19fLCBhMmRwX3N0YXR1cyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChsZGFjX2NpZS5jaGFubmVsTW9kZSkgewotICAgIGNhc2UgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUw6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgcmV0dXJuIDM7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBBMkRQX1ZlbmRvckdldENoYW5uZWxNb2RlQ29kZUxkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHRBMkRQX0xEQUNfQ0lFIGxkYWNfY2llOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvZGVjIGluZm8gY29udGFpbnMgdmFsaWQgZGF0YQotICB0QTJEUF9TVEFUVVMgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0xkYWMoJmxkYWNfY2llLCBwX2NvZGVjX2luZm8sIGZhbHNlKTsKLSAgaWYgKGEyZHBfc3RhdHVzICE9IEEyRFBfU1VDQ0VTUykgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBkZWNvZGUgY29kZWMgaW5mb3JtYXRpb246ICVkIiwgX19mdW5jX18sIGEyZHBfc3RhdHVzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGxkYWNfY2llLmNoYW5uZWxNb2RlKSB7Ci0gICAgY2FzZSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgY2FzZSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUw6Ci0gICAgY2FzZSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTzoKLSAgICAgIHJldHVybiBsZGFjX2NpZS5jaGFubmVsTW9kZTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JHZXRQYWNrZXRUaW1lc3RhbXBMZGFjKFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX3RpbWVzdGFtcCkgewotICAvLyBUT0RPOiBJcyB0aGlzIGZ1bmN0aW9uIHJlYWxseSBjb2RlYy1zcGVjaWZpYz8KLSAgKnBfdGltZXN0YW1wID0gKihjb25zdCB1aW50MzJfdCopcF9kYXRhOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckJ1aWxkQ29kZWNIZWFkZXJMZGFjKFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lc19wZXJfcGFja2V0KSB7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgcF9idWYtPm9mZnNldCAtPSBBMkRQX0xEQUNfTVBMX0hEUl9MRU47Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBwX2J1Zi0+bGVuICs9IEEyRFBfTERBQ19NUExfSERSX0xFTjsKLSAgQTJEUF9CdWlsZE1lZGlhUGF5bG9hZEhlYWRlckxkYWMocCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpZnJhbWVzX3Blcl9wYWNrZXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGQ6OnN0cmluZyBBMkRQX1ZlbmRvckNvZGVjSW5mb1N0cmluZ0xkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHJlczsKLSAgc3RkOjpzdHJpbmcgZmllbGQ7Ci0gIHRBMkRQX1NUQVRVUyBhMmRwX3N0YXR1czsKLSAgdEEyRFBfTERBQ19DSUUgbGRhY19jaWU7Ci0KLSAgYTJkcF9zdGF0dXMgPSBBMkRQX1BhcnNlSW5mb0xkYWMoJmxkYWNfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpOwotICBpZiAoYTJkcF9zdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgcmVzIDw8ICJBMkRQX1BhcnNlSW5mb0xkYWMgZmFpbDogIiA8PCBsb2doZXgoYTJkcF9zdGF0dXMpOwotICAgIHJldHVybiByZXMuc3RyKCk7Ci0gIH0KLQotICByZXMgPDwgIlx0bmFtZTogTERBQ1xuIjsKLQotICAvLyBTYW1wbGUgZnJlcXVlbmN5Ci0gIGZpZWxkLmNsZWFyKCk7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGxkYWNfY2llLnNhbXBsZVJhdGUgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGxkYWNfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80NDEwMCksCi0gICAgICAgICAgICAgICI0NDEwMCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChsZGFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApLAotICAgICAgICAgICAgICAiNDgwMDAiKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAobGRhY19jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzg4MjAwKSwKLSAgICAgICAgICAgICAgIjg4MjAwIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGxkYWNfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV85NjAwMCksCi0gICAgICAgICAgICAgICI5NjAwMCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChsZGFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTc2NDAwKSwKLSAgICAgICAgICAgICAgIjE3NjQwMCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChsZGFjX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTkyMDAwKSwKLSAgICAgICAgICAgICAgIjE5MjAwMCIpOwotICByZXMgPDwgIlx0c2FtcF9mcmVxOiAiIDw8IGZpZWxkIDw8ICIgKCIgPDwgbG9naGV4KGxkYWNfY2llLnNhbXBsZVJhdGUpCi0gICAgICA8PCAiKVxuIjsKLQotICAvLyBDaGFubmVsIG1vZGUKLSAgZmllbGQuY2xlYXIoKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAobGRhY19jaWUuY2hhbm5lbE1vZGUgPT0gMCksICJOT05FIik7Ci0gIEFwcGVuZEZpZWxkKCZmaWVsZCwgKGxkYWNfY2llLmNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05PKSwKLSAgICAgICAgICAgICAgIk1vbm8iKTsKLSAgQXBwZW5kRmllbGQoJmZpZWxkLCAobGRhY19jaWUuY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUwpLAotICAgICAgICAgICAgICAiRHVhbCIpOwotICBBcHBlbmRGaWVsZCgmZmllbGQsIChsZGFjX2NpZS5jaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPKSwKLSAgICAgICAgICAgICAgIlN0ZXJlbyIpOwotICByZXMgPDwgIlx0Y2hfbW9kZTogIiA8PCBmaWVsZCA8PCAiICgiIDw8IGxvZ2hleChsZGFjX2NpZS5jaGFubmVsTW9kZSkKLSAgICAgIDw8ICIpXG4iOwotCi0gIHJldHVybiByZXMuc3RyKCk7Ci19Ci0KLWNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFKiBBMkRQX1ZlbmRvckdldEVuY29kZXJJbnRlcmZhY2VMZGFjKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBpZiAoIUEyRFBfSXNWZW5kb3JTb3VyY2VDb2RlY1ZhbGlkTGRhYyhwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZW5jb2Rlcl9pbnRlcmZhY2VfbGRhYzsKLX0KLQotY29uc3QgdEEyRFBfREVDT0RFUl9JTlRFUkZBQ0UqIEEyRFBfVmVuZG9yR2V0RGVjb2RlckludGVyZmFjZUxkYWMoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIGlmICghQTJEUF9Jc1ZlbmRvclNpbmtDb2RlY1ZhbGlkTGRhYyhwX2NvZGVjX2luZm8pKSByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gJmEyZHBfZGVjb2Rlcl9pbnRlcmZhY2VfbGRhYzsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckFkanVzdENvZGVjTGRhYyh1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgdEEyRFBfTERBQ19DSUUgY2ZnX2NpZTsKLQotICAvLyBOb3RoaW5nIHRvIGRvOiBqdXN0IHZlcmlmeSB0aGUgY29kZWMgaW5mbyBpcyB2YWxpZAotICBpZiAoQTJEUF9QYXJzZUluZm9MZGFjKCZjZmdfY2llLCBwX2NvZGVjX2luZm8sIHRydWUpICE9IEEyRFBfU1VDQ0VTUykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfVmVuZG9yU291cmNlQ29kZWNJbmRleExkYWMoCi0gICAgVU5VU0VEX0FUVFIgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM7Ci19Ci0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfVmVuZG9yU2lua0NvZGVjSW5kZXhMZGFjKAotICAgIFVOVVNFRF9BVFRSIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfTERBQzsKLX0KLQotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyTGRhYyh2b2lkKSB7IHJldHVybiAiTERBQyI7IH0KLQotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyTGRhY1Npbmsodm9pZCkgeyByZXR1cm4gIkxEQUMgU0lOSyI7IH0KLQotYm9vbCBBMkRQX1ZlbmRvckluaXRDb2RlY0NvbmZpZ0xkYWMoQXZkdHBTZXBDb25maWcqIHBfY2ZnKSB7Ci0gIGlmIChBMkRQX0J1aWxkSW5mb0xkYWMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmYTJkcF9sZGFjX3NvdXJjZV9jYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ZnLT5jb2RlY19pbmZvKSAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotI2lmIChCVEFfQVZfQ09fQ1BfU0NNU19UID09IFRSVUUpCi0gIC8qIENvbnRlbnQgcHJvdGVjdGlvbiBpbmZvIC0gc3VwcG9ydCBTQ01TLVQgKi8KLSAgdWludDhfdCogcCA9IHBfY2ZnLT5wcm90ZWN0X2luZm87Ci0gICpwKysgPSBBVkRUX0NQX0xPU0M7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgQVZEVF9DUF9TQ01TX1RfSUQpOwotICBwX2NmZy0+bnVtX3Byb3RlY3QgPSAxOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JJbml0Q29kZWNDb25maWdMZGFjU2luayhBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgcmV0dXJuIEEyRFBfQnVpbGRJbmZvTGRhYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZhMmRwX2xkYWNfc2lua19jYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ZnLT5jb2RlY19pbmZvKSA9PSBBMkRQX1NVQ0NFU1M7Ci19Ci0KLVVOVVNFRF9BVFRSIHN0YXRpYyB2b2lkIGJ1aWxkX2NvZGVjX2NvbmZpZyhjb25zdCB0QTJEUF9MREFDX0NJRSYgY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHJlc3VsdCkgewotICBpZiAoY29uZmlnX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDQxMDApCi0gICAgcmVzdWx0LT5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gIGlmIChjb25maWdfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80ODAwMCkKLSAgICByZXN1bHQtPnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgaWYgKGNvbmZpZ19jaWUuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzg4MjAwKQotICAgIHJlc3VsdC0+c2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICBpZiAoY29uZmlnX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfOTYwMDApCi0gICAgcmVzdWx0LT5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA7Ci0gIGlmIChjb25maWdfY2llLnNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xNzY0MDApCi0gICAgcmVzdWx0LT5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOwotICBpZiAoY29uZmlnX2NpZS5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTkyMDAwKQotICAgIHJlc3VsdC0+c2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDsKLQotICByZXN1bHQtPmJpdHNfcGVyX3NhbXBsZSA9IGNvbmZpZ19jaWUuYml0c19wZXJfc2FtcGxlOwotCi0gIGlmIChjb25maWdfY2llLmNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05PKQotICAgIHJlc3VsdC0+Y2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgaWYgKGNvbmZpZ19jaWUuY2hhbm5lbE1vZGUgJgotICAgICAgKEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTCB8IEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPKSkgewotICAgIHJlc3VsdC0+Y2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICB9Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZ0xkYWNTb3VyY2U6OkEyZHBDb2RlY0NvbmZpZ0xkYWNTb3VyY2UoCi0gICAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNfcHJpb3JpdHkpCi0gICAgOiBBMmRwQ29kZWNDb25maWdMZGFjQmFzZShCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMkRQX1ZlbmRvckNvZGVjSW5kZXhTdHJMZGFjKCksIGNvZGVjX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkgewotICAvLyBDb21wdXRlIHRoZSBsb2NhbCBjYXBhYmlsaXR5Ci0gIGlmIChhMmRwX2xkYWNfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ0MTAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICB9Ci0gIGlmIChhMmRwX2xkYWNfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICB9Ci0gIGlmIChhMmRwX2xkYWNfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzg4MjAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICB9Ci0gIGlmIChhMmRwX2xkYWNfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzk2MDAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOwotICB9Ci0gIGlmIChhMmRwX2xkYWNfc291cmNlX2NhcHMuc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE3NjQwMCkgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA7Ci0gIH0KLSAgaWYgKGEyZHBfbGRhY19zb3VyY2VfY2Fwcy5zYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTkyMDAwKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDsKLSAgfQotICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPQotICAgICAgYTJkcF9sZGFjX3NvdXJjZV9jYXBzLmJpdHNfcGVyX3NhbXBsZTsKLSAgaWYgKGEyZHBfbGRhY19zb3VyY2VfY2Fwcy5jaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgIGNvZGVjX2xvY2FsX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gIH0KLSAgaWYgKGEyZHBfbGRhY19zb3VyY2VfY2Fwcy5jaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPKSB7Ci0gICAgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICB9Ci0gIGlmIChhMmRwX2xkYWNfc291cmNlX2NhcHMuY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUwpIHsKLSAgICBjb2RlY19sb2NhbF9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gIH0KLX0KLQotQTJkcENvZGVjQ29uZmlnTGRhY1NvdXJjZTo6fkEyZHBDb2RlY0NvbmZpZ0xkYWNTb3VyY2UoKSB7fQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ0xkYWNTb3VyY2U6OmluaXQoKSB7Ci0gIGlmICghaXNWYWxpZCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gTG9hZCB0aGUgZW5jb2RlcgotICBpZiAoIUEyRFBfVmVuZG9yTG9hZEVuY29kZXJMZGFjKCkpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgbG9hZCB0aGUgZW5jb2RlciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdMZGFjU291cmNlOjp1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYmVzdCBzYW1wbGUgcmF0ZSBmcm9tIHxzYW1wbGVSYXRlfC4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYmVzdF9zYW1wbGVfcmF0ZSh1aW50OF90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9MREFDX0NJRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnKSB7Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTkyMDAwKSB7Ci0gICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xOTIwMDA7Ci0gICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE3NjQwMCkgewotICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTc2NDAwOwotICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV85NjAwMCkgewotICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfOTYwMDA7Ci0gICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfODgyMDApIHsKLSAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzg4MjAwOwotICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSB7Ci0gICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80ODAwMDsKLSAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80NDEwMCkgewotICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDQxMDA7Ci0gICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGF1ZGlvIHNhbXBsZSByYXRlIGZyb20gfHBfY29kZWNfYXVkaW9fY29uZmlnfC4KLS8vIHxzYW1wbGVSYXRlfCBjb250YWlucyB0aGUgY2FwYWJpbGl0eS4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYXVkaW9fc2FtcGxlX3JhdGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2F1ZGlvX2NvbmZpZywgdWludDhfdCBzYW1wbGVSYXRlLAotICAgIHRBMkRQX0xEQUNfQ0lFKiBwX3Jlc3VsdCwgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKHBfY29kZWNfYXVkaW9fY29uZmlnLT5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80NDEwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ0MTAwOwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA6Ci0gICAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5zYW1wbGVSYXRlID0gQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDgwMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfODgyMDApIHsKLSAgICAgICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV84ODIwMDsKLSAgICAgICAgcF9jb2RlY19jb25maWctPnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV85NjAwMCkgewotICAgICAgICBwX3Jlc3VsdC0+c2FtcGxlUmF0ZSA9IEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzk2MDAwOwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xNzY0MDApIHsKLSAgICAgICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xNzY0MDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xOTIwMDApIHsKLSAgICAgICAgcF9yZXN1bHQtPnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xOTIwMDA7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGJlc3QgYml0cyBwZXIgc2FtcGxlIGZyb20gfGJpdHNfcGVyX3NhbXBsZXwuCi0vLyB8Yml0c19wZXJfc2FtcGxlfCBjb250YWlucyB0aGUgY2FwYWJpbGl0eS4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYmVzdF9iaXRzX3Blcl9zYW1wbGUoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGJpdHNfcGVyX3NhbXBsZSwgdEEyRFBfTERBQ19DSUUqIHBfcmVzdWx0LAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIpIHsKLSAgICBwX2NvZGVjX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjsKLSAgICBwX3Jlc3VsdC0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCkgewotICAgIHBfY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgIHBfcmVzdWx0LT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2KSB7Ci0gICAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgcF9yZXN1bHQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gU2VsZWN0cyB0aGUgYXVkaW8gYml0cyBwZXIgc2FtcGxlIGZyb20gfHBfY29kZWNfYXVkaW9fY29uZmlnfC4KLS8vIHxiaXRzX3Blcl9zYW1wbGV8IGNvbnRhaW5zIHRoZSBjYXBhYmlsaXR5LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9hdWRpb19iaXRzX3Blcl9zYW1wbGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgYml0c19wZXJfc2FtcGxlLCB0QTJEUF9MREFDX0NJRSogcF9yZXN1bHQsCi0gICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBzd2l0Y2ggKHBfY29kZWNfYXVkaW9fY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUpIHsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY6Ci0gICAgICBpZiAoYml0c19wZXJfc2FtcGxlICYgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNikgewotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNjsKLSAgICAgICAgcF9yZXN1bHQtPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTY7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OgotICAgICAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQpIHsKLSAgICAgICAgcF9jb2RlY19jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQ7Ci0gICAgICAgIHBfcmVzdWx0LT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjoKLSAgICAgIGlmIChiaXRzX3Blcl9zYW1wbGUgJiBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyKSB7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOwotICAgICAgICBwX3Jlc3VsdC0+Yml0c19wZXJfc2FtcGxlID0gQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8zMjsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGJlc3QgY2hhbm5lbCBtb2RlIGZyb20gfGNoYW5uZWxNb2RlfC4KLS8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdHwgYW5kIHxwX2NvZGVjX2NvbmZpZ3wuCi0vLyBSZXR1cm5zIHRydWUgaWYgYSBzZWxlY3Rpb24gd2FzIG1hZGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vCi1zdGF0aWMgYm9vbCBzZWxlY3RfYmVzdF9jaGFubmVsX21vZGUodWludDhfdCBjaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9MREFDX0NJRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2NvbmZpZykgewotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUwpIHsKLSAgICBwX3Jlc3VsdC0+Y2hhbm5lbE1vZGUgPSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUw7Ci0gICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfTU9OTykgewotICAgIHBfcmVzdWx0LT5jaGFubmVsTW9kZSA9IEEyRFBfTERBQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8KLS8vIFNlbGVjdHMgdGhlIGF1ZGlvIGNoYW5uZWwgbW9kZSBmcm9tIHxwX2NvZGVjX2F1ZGlvX2NvbmZpZ3wuCi0vLyB8Y2hhbm5lbE1vZGV8IGNvbnRhaW5zIHRoZSBjYXBhYmlsaXR5LgotLy8gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0fCBhbmQgfHBfY29kZWNfY29uZmlnfC4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIHNlbGVjdGlvbiB3YXMgbWFkZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8KLXN0YXRpYyBib29sIHNlbGVjdF9hdWRpb19jaGFubmVsX21vZGUoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190KiBwX2NvZGVjX2F1ZGlvX2NvbmZpZywgdWludDhfdCBjaGFubmVsTW9kZSwKLSAgICB0QTJEUF9MREFDX0NJRSogcF9yZXN1bHQsIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcpIHsKLSAgc3dpdGNoIChwX2NvZGVjX2F1ZGlvX2NvbmZpZy0+Y2hhbm5lbF9tb2RlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk86Ci0gICAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX01PTk8pIHsKLSAgICAgICAgcF9yZXN1bHQtPmNoYW5uZWxNb2RlID0gQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgICBwX2NvZGVjX2NvbmZpZy0+Y2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU86Ci0gICAgICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTykgewotICAgICAgICBwX3Jlc3VsdC0+Y2hhbm5lbE1vZGUgPSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgcF9jb2RlY19jb25maWctPmNoYW5uZWxfbW9kZSA9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTCkgewotICAgICAgICBwX3Jlc3VsdC0+Y2hhbm5lbE1vZGUgPSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUw7Ci0gICAgICAgIHBfY29kZWNfY29uZmlnLT5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ0xkYWNCYXNlOjpzZXRDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2soY29kZWNfbXV0ZXhfKTsKLSAgdEEyRFBfTERBQ19DSUUgcGVlcl9pbmZvX2NpZTsKLSAgdEEyRFBfTERBQ19DSUUgcmVzdWx0X2NvbmZpZ19jaWU7Ci0gIHVpbnQ4X3QgY2hhbm5lbE1vZGU7Ci0gIHVpbnQ4X3Qgc2FtcGxlUmF0ZTsKLSAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGJpdHNfcGVyX3NhbXBsZTsKLSAgY29uc3QgdEEyRFBfTERBQ19DSUUqIHBfYTJkcF9sZGFjX2NhcHMgPQotICAgICAgKGlzX3NvdXJjZV8pID8gJmEyZHBfbGRhY19zb3VyY2VfY2FwcyA6ICZhMmRwX2xkYWNfc2lua19jYXBzOwotCi0gIC8vIFNhdmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19jb25maWcgPSBjb2RlY19jb25maWdfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfY2FwYWJpbGl0eSA9IGNvZGVjX2NhcGFiaWxpdHlfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Qgc2F2ZWRfY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5ID0KLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV87Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY191c2VyX2NvbmZpZyA9IGNvZGVjX3VzZXJfY29uZmlnXzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHNhdmVkX2NvZGVjX2F1ZGlvX2NvbmZpZyA9IGNvZGVjX2F1ZGlvX2NvbmZpZ187Ci0gIHVpbnQ4X3Qgc2F2ZWRfb3RhX2NvZGVjX2NvbmZpZ1tBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlbQVZEVF9DT0RFQ19TSVpFXTsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jb25maWdbQVZEVF9DT0RFQ19TSVpFXTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19jb25maWcsIG90YV9jb2RlY19jb25maWdfLCBzaXplb2Yob3RhX2NvZGVjX2NvbmZpZ18pKTsKLSAgbWVtY3B5KHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksIG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfLAotICAgICAgICAgc2l6ZW9mKG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKSk7Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfcGVlcl9jb25maWcsIG90YV9jb2RlY19wZWVyX2NvbmZpZ18sCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY29uZmlnXykpOwotCi0gIHRBMkRQX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9MZGFjKCZwZWVyX2luZm9fY2llLCBwX3BlZXJfY29kZWNfaW5mbywgaXNfY2FwYWJpbGl0eSk7Ci0gIGlmIChzdGF0dXMgIT0gQTJEUF9TVUNDRVNTKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2FuJ3QgcGFyc2UgcGVlcidzIGNhcGFiaWxpdGllczogZXJyb3IgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIEJ1aWxkIHRoZSBwcmVmZXJyZWQgY29uZmlndXJhdGlvbgotICAvLwotICBtZW1zZXQoJnJlc3VsdF9jb25maWdfY2llLCAwLCBzaXplb2YocmVzdWx0X2NvbmZpZ19jaWUpKTsKLSAgcmVzdWx0X2NvbmZpZ19jaWUudmVuZG9ySWQgPSBwX2EyZHBfbGRhY19jYXBzLT52ZW5kb3JJZDsKLSAgcmVzdWx0X2NvbmZpZ19jaWUuY29kZWNJZCA9IHBfYTJkcF9sZGFjX2NhcHMtPmNvZGVjSWQ7Ci0KLSAgLy8KLSAgLy8gU2VsZWN0IHRoZSBzYW1wbGUgZnJlcXVlbmN5Ci0gIC8vCi0gIHNhbXBsZVJhdGUgPSBwX2EyZHBfbGRhY19jYXBzLT5zYW1wbGVSYXRlICYgcGVlcl9pbmZvX2NpZS5zYW1wbGVSYXRlOwotICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gIHN3aXRjaCAoY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA6Ci0gICAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ0MTAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80NDEwMDsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuc2FtcGxlUmF0ZSA9IEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOgotICAgICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV84ODIwMCkgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5zYW1wbGVSYXRlID0gQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfODgyMDA7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA6Ci0gICAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzk2MDAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV85NjAwMDsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICAgIGNvZGVjX2NvbmZpZ18uc2FtcGxlX3JhdGUgPSBjb2RlY191c2VyX2NvbmZpZ18uc2FtcGxlX3JhdGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA6Ci0gICAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE3NjQwMCkgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5zYW1wbGVSYXRlID0gQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTc2NDAwOwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5zYW1wbGVfcmF0ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDoKLSAgICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTkyMDAwKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLnNhbXBsZVJhdGUgPSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xOTIwMDA7Ci0gICAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gY29kZWNfdXNlcl9jb25maWdfLnNhbXBsZV9yYXRlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTYwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDA6Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORToKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gICAgICBjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlID0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIFNlbGVjdCB0aGUgc2FtcGxlIGZyZXF1ZW5jeSBpZiB0aGVyZSBpcyBubyB1c2VyIHByZWZlcmVuY2UKLSAgZG8gewotICAgIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDQxMDApIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDA7Ci0gICAgfQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDgwMDApIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gICAgfQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfODgyMDApIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA7Ci0gICAgfQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfOTYwMDApIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfOTYwMDA7Ci0gICAgfQotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfMTc2NDAwKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDsKLSAgICB9Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xOTIwMDApIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOwotICAgIH0KLQotICAgIGlmIChjb2RlY19jb25maWdfLnNhbXBsZV9yYXRlICE9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV9OT05FKSBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80NDEwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwKQotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0gQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ4MDAwOwotICAgIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfODgyMDApCi0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfODgyMDA7Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV85NjAwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE3NjQwMCkKLSAgICAgIGNvZGVjX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9IEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xNzY0MDA7Ci0gICAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV8xOTIwMDApCi0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTkyMDAwOwotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX3NhbXBsZV9yYXRlKCZjb2RlY19hdWRpb19jb25maWdfLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgZGVmYXVsdCBjb25maWcKLSAgICBpZiAoc2VsZWN0X2Jlc3Rfc2FtcGxlX3JhdGUoCi0gICAgICAgICAgICBhMmRwX2xkYWNfZGVmYXVsdF9jb25maWcuc2FtcGxlUmF0ZSAmIHBlZXJfaW5mb19jaWUuc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB1c2UgdGhlIGJlc3QgbWF0Y2gKLSAgICBpZiAoc2VsZWN0X2Jlc3Rfc2FtcGxlX3JhdGUoc2FtcGxlUmF0ZSwgJnJlc3VsdF9jb25maWdfY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5zYW1wbGVfcmF0ZSA9PSBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIiVzOiBjYW5ub3QgbWF0Y2ggc2FtcGxlIGZyZXF1ZW5jeTogbG9jYWwgY2FwcyA9IDB4JXggIgotICAgICAgICAicGVlciBpbmZvID0gMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBwX2EyZHBfbGRhY19jYXBzLT5zYW1wbGVSYXRlLCBwZWVyX2luZm9fY2llLnNhbXBsZVJhdGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIC8vCi0gIC8vIFNlbGVjdCB0aGUgYml0cyBwZXIgc2FtcGxlCi0gIC8vCi0gIC8vIE5PVEU6IHRoaXMgaW5mb3JtYXRpb24gaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBMREFDIEEyRFAgY29kZWMgZGVzY3JpcHRpb24KLSAgLy8gdGhhdCBpcyBzZW50IE9UQS4KLSAgYml0c19wZXJfc2FtcGxlID0gcF9hMmRwX2xkYWNfY2Fwcy0+Yml0c19wZXJfc2FtcGxlOwotICBjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORTsKLSAgc3dpdGNoIChjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlKSB7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2OgotICAgICAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMTYpIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzI0OgotICAgICAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQpIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyOgotICAgICAgaWYgKGJpdHNfcGVyX3NhbXBsZSAmIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIpIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gY29kZWNfdXNlcl9jb25maWdfLmJpdHNfcGVyX3NhbXBsZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5iaXRzX3Blcl9zYW1wbGUgPSBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU6Ci0gICAgICByZXN1bHRfY29uZmlnX2NpZS5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5iaXRzX3Blcl9zYW1wbGUgPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkU7Ci0gICAgICBjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9IEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfTk9ORTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gU2VsZWN0IHRoZSBiaXRzIHBlciBzYW1wbGUgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCi0gIGRvIHsKLSAgICAvLyBDb21wdXRlIHRoZSBzZWxlY3RhYmxlIGNhcGFiaWxpdHkKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICAgIHBfYTJkcF9sZGFjX2NhcHMtPmJpdHNfcGVyX3NhbXBsZTsKLQotICAgIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSAhPSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpCi0gICAgICBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgY29kZWNfY2FwYWJpbGl0eV8uYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOwotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdGhlIHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX2JpdHNfcGVyX3NhbXBsZSgmY29kZWNfYXVkaW9fY29uZmlnXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2EyZHBfbGRhY19jYXBzLT5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgZGVmYXVsdCBjb25maWcKLSAgICBpZiAoc2VsZWN0X2Jlc3RfYml0c19wZXJfc2FtcGxlKGEyZHBfbGRhY19kZWZhdWx0X2NvbmZpZy5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdXNlIHRoZSBiZXN0IG1hdGNoCi0gICAgaWYgKHNlbGVjdF9iZXN0X2JpdHNfcGVyX3NhbXBsZShwX2EyZHBfbGRhY19jYXBzLT5iaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0X2NvbmZpZ19jaWUsICZjb2RlY19jb25maWdfKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlIChmYWxzZSk7Ci0gIGlmIChjb2RlY19jb25maWdfLmJpdHNfcGVyX3NhbXBsZSA9PSBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFX05PTkUpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogY2Fubm90IG1hdGNoIGJpdHMgcGVyIHNhbXBsZTogZGVmYXVsdCA9IDB4JXggIgotICAgICAgICAidXNlciBwcmVmZXJlbmNlID0gMHgleCIsCi0gICAgICAgIF9fZnVuY19fLCBhMmRwX2xkYWNfZGVmYXVsdF9jb25maWcuYml0c19wZXJfc2FtcGxlLAotICAgICAgICBjb2RlY191c2VyX2NvbmZpZ18uYml0c19wZXJfc2FtcGxlKTsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBTZWxlY3QgdGhlIGNoYW5uZWwgbW9kZQotICAvLwotICBjaGFubmVsTW9kZSA9IHBfYTJkcF9sZGFjX2NhcHMtPmNoYW5uZWxNb2RlICYgcGVlcl9pbmZvX2NpZS5jaGFubmVsTW9kZTsKLSAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0gIHN3aXRjaCAoY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9NT05POgotICAgICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05PKSB7Ci0gICAgICAgIHJlc3VsdF9jb25maWdfY2llLmNoYW5uZWxNb2RlID0gQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05POwotICAgICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgICBjb2RlY19jb25maWdfLmNoYW5uZWxfbW9kZSA9IGNvZGVjX3VzZXJfY29uZmlnXy5jaGFubmVsX21vZGU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPOgotICAgICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9TVEVSRU8pIHsKLSAgICAgICAgcmVzdWx0X2NvbmZpZ19jaWUuY2hhbm5lbE1vZGUgPSBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTCkgewotICAgICAgICByZXN1bHRfY29uZmlnX2NpZS5jaGFubmVsTW9kZSA9IEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTDsKLSAgICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gY29kZWNfdXNlcl9jb25maWdfLmNoYW5uZWxfbW9kZTsKLSAgICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBjb2RlY191c2VyX2NvbmZpZ18uY2hhbm5lbF9tb2RlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOgotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlID0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FOwotICAgICAgY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPSBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX05PTkU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIFNlbGVjdCB0aGUgY2hhbm5lbCBtb2RlIGlmIHRoZXJlIGlzIG5vIHVzZXIgcHJlZmVyZW5jZQotICBkbyB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05PKSB7Ci0gICAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICB9Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9TVEVSRU8pIHsKLSAgICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotICAgIGlmIChjaGFubmVsTW9kZSAmIEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTCkgewotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0KLSAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgICB9Ci0KLSAgICBpZiAoY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgIT0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FKSBicmVhazsKLQotICAgIC8vIENvbXB1dGUgdGhlIGNvbW1vbiBjYXBhYmlsaXR5Ci0gICAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9NT05PKQotICAgICAgY29kZWNfY2FwYWJpbGl0eV8uY2hhbm5lbF9tb2RlIHw9IEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTzsKLSAgICBpZiAoY2hhbm5lbE1vZGUgJgotICAgICAgICAoQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9TVEVSRU8gfCBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUwpKSB7Ci0gICAgICBjb2RlY19jYXBhYmlsaXR5Xy5jaGFubmVsX21vZGUgfD0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9TVEVSRU87Ci0gICAgfQotCi0gICAgLy8gTm8gdXNlciBwcmVmZXJlbmNlIC0gdHJ5IHRoZSBjb2RlYyBhdWRpbyBjb25maWcKLSAgICBpZiAoc2VsZWN0X2F1ZGlvX2NoYW5uZWxfbW9kZSgmY29kZWNfYXVkaW9fY29uZmlnXywgY2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9jb25maWdfY2llLCAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIE5vIHVzZXIgcHJlZmVyZW5jZSAtIHRyeSB0aGUgZGVmYXVsdCBjb25maWcKLSAgICBpZiAoc2VsZWN0X2Jlc3RfY2hhbm5lbF9tb2RlKAotICAgICAgICAgICAgYTJkcF9sZGFjX2RlZmF1bHRfY29uZmlnLmNoYW5uZWxNb2RlICYgcGVlcl9pbmZvX2NpZS5jaGFubmVsTW9kZSwKLSAgICAgICAgICAgICZyZXN1bHRfY29uZmlnX2NpZSwgJmNvZGVjX2NvbmZpZ18pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBObyB1c2VyIHByZWZlcmVuY2UgLSB1c2UgdGhlIGJlc3QgbWF0Y2gKLSAgICBpZiAoc2VsZWN0X2Jlc3RfY2hhbm5lbF9tb2RlKGNoYW5uZWxNb2RlLCAmcmVzdWx0X2NvbmZpZ19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfY29uZmlnXykpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZmFsc2UpOwotICBpZiAoY29kZWNfY29uZmlnXy5jaGFubmVsX21vZGUgPT0gQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IGNhbm5vdCBtYXRjaCBjaGFubmVsIG1vZGU6IGxvY2FsIGNhcHMgPSAweCV4ICIKLSAgICAgICAgInBlZXIgaW5mbyA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcF9hMmRwX2xkYWNfY2Fwcy0+Y2hhbm5lbE1vZGUsIHBlZXJfaW5mb19jaWUuY2hhbm5lbE1vZGUpOwotICAgIGdvdG8gZmFpbDsKLSAgfQotCi0gIGlmIChBMkRQX0J1aWxkSW5mb0xkYWMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcmVzdWx0X2NvbmZpZ19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHRfY29kZWNfY29uZmlnKSAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBnb3RvIGZhaWw7Ci0gIH0KLQotICAvLwotICAvLyBDb3B5IHRoZSBjb2RlYy1zcGVjaWZpYyBmaWVsZHMgaWYgdGhleSBhcmUgbm90IHplcm8KLSAgLy8KLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xICE9IDApCi0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY18xID0gY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzE7Ci0gIGlmIChjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMiAhPSAwKQotICAgIGNvZGVjX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMiA9IGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY18yOwotICBpZiAoY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzMgIT0gMCkKLSAgICBjb2RlY19jb25maWdfLmNvZGVjX3NwZWNpZmljXzMgPSBjb2RlY191c2VyX2NvbmZpZ18uY29kZWNfc3BlY2lmaWNfMzsKLSAgaWYgKGNvZGVjX3VzZXJfY29uZmlnXy5jb2RlY19zcGVjaWZpY180ICE9IDApCi0gICAgY29kZWNfY29uZmlnXy5jb2RlY19zcGVjaWZpY180ID0gY29kZWNfdXNlcl9jb25maWdfLmNvZGVjX3NwZWNpZmljXzQ7Ci0KLSAgLy8gQ3JlYXRlIGEgbG9jYWwgY29weSBvZiB0aGUgcGVlciBjb2RlYyBjYXBhYmlsaXR5LCBhbmQgdGhlCi0gIC8vIHJlc3VsdCBjb2RlYyBjb25maWcuCi0gIGlmIChpc19jYXBhYmlsaXR5KSB7Ci0gICAgc3RhdHVzID0gQTJEUF9CdWlsZEluZm9MZGFjKEFWRFRfTUVESUFfVFlQRV9BVURJTywgJnBlZXJfaW5mb19jaWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19wZWVyX2NhcGFiaWxpdHlfKTsKLSAgfSBlbHNlIHsKLSAgICBzdGF0dXMgPSBBMkRQX0J1aWxkSW5mb0xkYWMoQVZEVF9NRURJQV9UWVBFX0FVRElPLCAmcGVlcl9pbmZvX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RhX2NvZGVjX3BlZXJfY29uZmlnXyk7Ci0gIH0KLSAgQ0hFQ0soc3RhdHVzID09IEEyRFBfU1VDQ0VTUyk7Ci0gIHN0YXR1cyA9IEEyRFBfQnVpbGRJbmZvTGRhYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZyZXN1bHRfY29uZmlnX2NpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90YV9jb2RlY19jb25maWdfKTsKLSAgQ0hFQ0soc3RhdHVzID09IEEyRFBfU1VDQ0VTUyk7Ci0gIHJldHVybiB0cnVlOwotCi1mYWlsOgotICAvLyBSZXN0b3JlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICBjb2RlY19jb25maWdfID0gc2F2ZWRfY29kZWNfY29uZmlnOwotICBjb2RlY19jYXBhYmlsaXR5XyA9IHNhdmVkX2NvZGVjX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8gPSBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHk7Ci0gIGNvZGVjX3VzZXJfY29uZmlnXyA9IHNhdmVkX2NvZGVjX3VzZXJfY29uZmlnOwotICBjb2RlY19hdWRpb19jb25maWdfID0gc2F2ZWRfY29kZWNfYXVkaW9fY29uZmlnOwotICBtZW1jcHkob3RhX2NvZGVjX2NvbmZpZ18sIHNhdmVkX290YV9jb2RlY19jb25maWcsIHNpemVvZihvdGFfY29kZWNfY29uZmlnXykpOwotICBtZW1jcHkob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8sIHNhdmVkX290YV9jb2RlY19wZWVyX2NhcGFiaWxpdHksCi0gICAgICAgICBzaXplb2Yob3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pKTsKLSAgbWVtY3B5KG90YV9jb2RlY19wZWVyX2NvbmZpZ18sIHNhdmVkX290YV9jb2RlY19wZWVyX2NvbmZpZywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jb25maWdfKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBMmRwQ29kZWNDb25maWdMZGFjQmFzZTo6c2V0UGVlckNvZGVjQ2FwYWJpbGl0aWVzKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKGNvZGVjX211dGV4Xyk7Ci0gIHRBMkRQX0xEQUNfQ0lFIHBlZXJfaW5mb19jaWU7Ci0gIHVpbnQ4X3QgY2hhbm5lbE1vZGU7Ci0gIHVpbnQ4X3Qgc2FtcGxlUmF0ZTsKLSAgY29uc3QgdEEyRFBfTERBQ19DSUUqIHBfYTJkcF9sZGFjX2NhcHMgPQotICAgICAgKGlzX3NvdXJjZV8pID8gJmEyZHBfbGRhY19zb3VyY2VfY2FwcyA6ICZhMmRwX2xkYWNfc2lua19jYXBzOwotCi0gIC8vIFNhdmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHkgPQotICAgICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5XzsKLSAgdWludDhfdCBzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5W0FWRFRfQ09ERUNfU0laRV07Ci0gIG1lbWNweShzYXZlZF9vdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5LCBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XywKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotCi0gIHRBMkRQX1NUQVRVUyBzdGF0dXMgPQotICAgICAgQTJEUF9QYXJzZUluZm9MZGFjKCZwZWVyX2luZm9fY2llLCBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzLCB0cnVlKTsKLSAgaWYgKHN0YXR1cyAhPSBBMkRQX1NVQ0NFU1MpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW4ndCBwYXJzZSBwZWVyJ3MgY2FwYWJpbGl0aWVzOiBlcnJvciA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgZ290byBmYWlsOwotICB9Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5IC0gc2FtcGxlIHJhdGUKLSAgc2FtcGxlUmF0ZSA9IHBfYTJkcF9sZGFjX2NhcHMtPnNhbXBsZVJhdGUgJiBwZWVyX2luZm9fY2llLnNhbXBsZVJhdGU7Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfNDQxMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80NDEwMDsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwKSB7Ci0gICAgY29kZWNfc2VsZWN0YWJsZV9jYXBhYmlsaXR5Xy5zYW1wbGVfcmF0ZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDA7Ci0gIH0KLSAgaWYgKHNhbXBsZVJhdGUgJiBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV84ODIwMCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzg4MjAwOwotICB9Ci0gIGlmIChzYW1wbGVSYXRlICYgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfOTYwMDApIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLnNhbXBsZV9yYXRlIHw9Ci0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV85NjAwMDsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE3NjQwMCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMDsKLSAgfQotICBpZiAoc2FtcGxlUmF0ZSAmIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE5MjAwMCkgewotICAgIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8uc2FtcGxlX3JhdGUgfD0KLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMDsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHNlbGVjdGFibGUgY2FwYWJpbGl0eSAtIGJpdHMgcGVyIHNhbXBsZQotICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBwX2EyZHBfbGRhY19jYXBzLT5iaXRzX3Blcl9zYW1wbGU7Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0YWJsZSBjYXBhYmlsaXR5IC0gY2hhbm5lbCBtb2RlCi0gIGNoYW5uZWxNb2RlID0gcF9hMmRwX2xkYWNfY2Fwcy0+Y2hhbm5lbE1vZGUgJiBwZWVyX2luZm9fY2llLmNoYW5uZWxNb2RlOwotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX01PTk8pIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk87Ci0gIH0KLSAgaWYgKGNoYW5uZWxNb2RlICYgQTJEUF9MREFDX0NIQU5ORUxfTU9ERV9TVEVSRU8pIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotICBpZiAoY2hhbm5lbE1vZGUgJiBBMkRQX0xEQUNfQ0hBTk5FTF9NT0RFX0RVQUwpIHsKLSAgICBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfLmNoYW5uZWxfbW9kZSB8PQotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX1NURVJFTzsKLSAgfQotCi0gIHN0YXR1cyA9IEEyRFBfQnVpbGRJbmZvTGRhYyhBVkRUX01FRElBX1RZUEVfQVVESU8sICZwZWVyX2luZm9fY2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eV8pOwotICBDSEVDSyhzdGF0dXMgPT0gQTJEUF9TVUNDRVNTKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWZhaWw6Ci0gIC8vIFJlc3RvcmUgdGhlIGludGVybmFsIHN0YXRlCi0gIGNvZGVjX3NlbGVjdGFibGVfY2FwYWJpbGl0eV8gPSBzYXZlZF9jb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHk7Ci0gIG1lbWNweShvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5Xywgc2F2ZWRfb3RhX2NvZGVjX3BlZXJfY2FwYWJpbGl0eSwKLSAgICAgICAgIHNpemVvZihvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5XykpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUEyZHBDb2RlY0NvbmZpZ0xkYWNTaW5rOjpBMmRwQ29kZWNDb25maWdMZGFjU2luaygKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkKLSAgICA6IEEyZHBDb2RlY0NvbmZpZ0xkYWNCYXNlKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0xEQUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMkRQX1ZlbmRvckNvZGVjSW5kZXhTdHJMZGFjU2luaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfcHJpb3JpdHksIGZhbHNlKSB7fQotCi1BMmRwQ29kZWNDb25maWdMZGFjU2luazo6fkEyZHBDb2RlY0NvbmZpZ0xkYWNTaW5rKCkge30KLQotYm9vbCBBMmRwQ29kZWNDb25maWdMZGFjU2luazo6aW5pdCgpIHsKLSAgaWYgKCFpc1ZhbGlkKCkpIHJldHVybiBmYWxzZTsKLQotICAvLyBMb2FkIHRoZSBkZWNvZGVyCi0gIGlmICghQTJEUF9WZW5kb3JMb2FkRGVjb2RlckxkYWMoKSkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBsb2FkIHRoZSBkZWNvZGVyIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEEyZHBDb2RlY0NvbmZpZ0xkYWNTaW5rOjp1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCB7Ci0gIC8vIFRPRE86IFRoaXMgbWV0aG9kIGFwcGxpZXMgb25seSB0byBTb3VyY2UgY29kZWNzCi0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfbGRhY19hYnIuY2MgYi9zdGFjay9hMmRwL2EyZHBfdmVuZG9yX2xkYWNfYWJyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzVjNmVlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfbGRhY19hYnIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX3ZlbmRvcl9sZGFjX2FiciIKLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yX2xkYWNfYWJyLmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotCi0vLwotLy8gTERBQyBBQlIoQWRhcHRpdmUgQml0IFJhdGUpIFNvdXJjZSBDb2RlCi0vLwotCi0vLwotLy8gVGhlIExEQUMgQUJSIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhlIGZ1bmN0aW9ucyB0byB1c2UKLS8vCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19BQlJfTElCX05BTUUgPSAibGlibGRhY0JUX2Fici5zbyI7Ci1zdGF0aWMgdm9pZCogbGRhY19hYnJfbGliX2hhbmRsZSA9IE5VTEw7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0FCUl9HRVRfSEFORExFX05BTUUgPSAibGRhY19BQlJfZ2V0X2hhbmRsZSI7Ci10eXBlZGVmIEhBTkRMRV9MREFDX0FCUiAoKnRMREFDX0FCUl9HRVRfSEFORExFKSh2b2lkKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfQUJSX0ZSRUVfSEFORExFX05BTUUgPSAibGRhY19BQlJfZnJlZV9oYW5kbGUiOwotdHlwZWRlZiB2b2lkICgqdExEQUNfQUJSX0ZSRUVfSEFORExFKShIQU5ETEVfTERBQ19BQlIgaExkYWNBYnIpOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19BQlJfSU5JVF9OQU1FID0gImxkYWNfQUJSX0luaXQiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19BQlJfSU5JVCkoSEFORExFX0xEQUNfQUJSIGhMZGFjQWJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGludGVydmFsX21zKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfQUJSX1NFVF9USFJFU0hPTERTX05BTUUgPSAibGRhY19BQlJfc2V0X3RocmVzaG9sZHMiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19BQlJfU0VUX1RIUkVTSE9MRFMpKEhBTkRMRV9MREFDX0FCUiBoTGRhY0FiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGhfY3JpdGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRoX2Rhbmdlcm91c190cmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGhfc2FmZXR5XzRocXNxKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfQUJSX1BST0NfTkFNRSA9ICJsZGFjX0FCUl9Qcm9jIjsKLXR5cGVkZWYgaW50ICgqdExEQUNfQUJSX1BST0MpKEhBTkRMRV9MREFDX0JUIGhMZGFjUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTERBQ19BQlIgaExkYWNBYnIsIHVuc2lnbmVkIGludCB0eHFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdfZW5hYmxlKTsKLQotc3RhdGljIHRMREFDX0FCUl9HRVRfSEFORExFIGxkYWNfYWJyX2dldF9oYW5kbGVfZnVuYzsKLXN0YXRpYyB0TERBQ19BQlJfRlJFRV9IQU5ETEUgbGRhY19hYnJfZnJlZV9oYW5kbGVfZnVuYzsKLXN0YXRpYyB0TERBQ19BQlJfSU5JVCBsZGFjX2Ficl9pbml0X2Z1bmM7Ci1zdGF0aWMgdExEQUNfQUJSX1NFVF9USFJFU0hPTERTIGxkYWNfYWJyX3NldF90aHJlc2hvbGRzX2Z1bmM7Ci1zdGF0aWMgdExEQUNfQUJSX1BST0MgbGRhY19hYnJfcHJvY19mdW5jOwotCi1ib29sIEEyRFBfVmVuZG9yTG9hZExkYWNBYnIodm9pZCkgewotICBpZiAobGRhY19hYnJfbGliX2hhbmRsZSAhPSBOVUxMKSByZXR1cm4gdHJ1ZTsgIC8vIEFscmVhZHkgbG9hZGVkCi0KLSAgLy8gT3BlbiB0aGUgTERBQyBBQlIgbGlicmFyeQotICBsZGFjX2Ficl9saWJfaGFuZGxlID0gZGxvcGVuKExEQUNfQUJSX0xJQl9OQU1FLCBSVExEX05PVyk7Ci0gIGlmIChsZGFjX2Ficl9saWJfaGFuZGxlID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3Qgb3BlbiBMREFDIEFCUiBsaWJyYXJ5ICVzOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBMREFDX0FCUl9MSUJfTkFNRSwgZGxlcnJvcigpKTsKLSAgICBBMkRQX1ZlbmRvclVubG9hZExkYWNBYnIoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBMb2FkIGFsbCBmdW5jdGlvbnMKLSAgbGRhY19hYnJfZ2V0X2hhbmRsZV9mdW5jID0gKHRMREFDX0FCUl9HRVRfSEFORExFKWRsc3ltKAotICAgICAgbGRhY19hYnJfbGliX2hhbmRsZSwgTERBQ19BQlJfR0VUX0hBTkRMRV9OQU1FKTsKLSAgaWYgKGxkYWNfYWJyX2dldF9oYW5kbGVfZnVuYyA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGZpbmQgZnVuY3Rpb24gJyVzJyBpbiB0aGUgTERBQyBBQlIgbGlicmFyeTogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgTERBQ19BQlJfR0VUX0hBTkRMRV9OQU1FLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkTGRhY0FicigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGxkYWNfYWJyX2ZyZWVfaGFuZGxlX2Z1bmMgPSAodExEQUNfQUJSX0ZSRUVfSEFORExFKWRsc3ltKAotICAgICAgbGRhY19hYnJfbGliX2hhbmRsZSwgTERBQ19BQlJfRlJFRV9IQU5ETEVfTkFNRSk7Ci0gIGlmIChsZGFjX2Ficl9mcmVlX2hhbmRsZV9mdW5jID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBmdW5jdGlvbiAnJXMnIGluIHRoZSBMREFDIEFCUiBsaWJyYXJ5OiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBMREFDX0FCUl9GUkVFX0hBTkRMRV9OQU1FLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkTGRhY0FicigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGxkYWNfYWJyX2luaXRfZnVuYyA9Ci0gICAgICAodExEQUNfQUJSX0lOSVQpZGxzeW0obGRhY19hYnJfbGliX2hhbmRsZSwgTERBQ19BQlJfSU5JVF9OQU1FKTsKLSAgaWYgKGxkYWNfYWJyX2luaXRfZnVuYyA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGZpbmQgZnVuY3Rpb24gJyVzJyBpbiB0aGUgTERBQyBBQlIgbGlicmFyeTogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgTERBQ19BQlJfSU5JVF9OQU1FLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkTGRhY0FicigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGxkYWNfYWJyX3NldF90aHJlc2hvbGRzX2Z1bmMgPSAodExEQUNfQUJSX1NFVF9USFJFU0hPTERTKWRsc3ltKAotICAgICAgbGRhY19hYnJfbGliX2hhbmRsZSwgTERBQ19BQlJfU0VUX1RIUkVTSE9MRFNfTkFNRSk7Ci0gIGlmIChsZGFjX2Ficl9zZXRfdGhyZXNob2xkc19mdW5jID09IE5VTEwpIHsKLSAgICBMT0dfRVJST1IoIiVzOiBjYW5ub3QgZmluZCBmdW5jdGlvbiAnJXMnIGluIHRoZSBMREFDIEFCUiBsaWJyYXJ5OiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBMREFDX0FCUl9TRVRfVEhSRVNIT0xEU19OQU1FLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkTGRhY0FicigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGxkYWNfYWJyX3Byb2NfZnVuYyA9Ci0gICAgICAodExEQUNfQUJSX1BST0MpZGxzeW0obGRhY19hYnJfbGliX2hhbmRsZSwgTERBQ19BQlJfUFJPQ19OQU1FKTsKLSAgaWYgKGxkYWNfYWJyX3Byb2NfZnVuYyA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGZpbmQgZnVuY3Rpb24gJyVzJyBpbiB0aGUgTERBQyBBQlIgbGlicmFyeTogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgTERBQ19BQlJfUFJPQ19OQU1FLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkTGRhY0FicigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEEyRFBfVmVuZG9yVW5sb2FkTGRhY0Ficih2b2lkKSB7Ci0gIGxkYWNfYWJyX2dldF9oYW5kbGVfZnVuYyA9IE5VTEw7Ci0gIGxkYWNfYWJyX2ZyZWVfaGFuZGxlX2Z1bmMgPSBOVUxMOwotICBsZGFjX2Ficl9pbml0X2Z1bmMgPSBOVUxMOwotICBsZGFjX2Ficl9zZXRfdGhyZXNob2xkc19mdW5jID0gTlVMTDsKLSAgbGRhY19hYnJfcHJvY19mdW5jID0gTlVMTDsKLQotICBpZiAobGRhY19hYnJfbGliX2hhbmRsZSAhPSBOVUxMKSB7Ci0gICAgZGxjbG9zZShsZGFjX2Ficl9saWJfaGFuZGxlKTsKLSAgICBsZGFjX2Ficl9saWJfaGFuZGxlID0gTlVMTDsKLSAgfQotfQotCi1IQU5ETEVfTERBQ19BQlIgYTJkcF9sZGFjX2Ficl9nZXRfaGFuZGxlKHZvaWQpIHsKLSAgcmV0dXJuIGxkYWNfYWJyX2dldF9oYW5kbGVfZnVuYygpOwotfQotCi12b2lkIGEyZHBfbGRhY19hYnJfZnJlZV9oYW5kbGUoSEFORExFX0xEQUNfQUJSIGhMZGFjQWJyKSB7Ci0gIHJldHVybiBsZGFjX2Ficl9mcmVlX2hhbmRsZV9mdW5jKGhMZGFjQWJyKTsKLX0KLQotaW50IGEyZHBfbGRhY19hYnJfaW5pdChIQU5ETEVfTERBQ19BQlIgaExkYWNBYnIsIHVuc2lnbmVkIGludCBpbnRlcnZhbF9tcykgewotICByZXR1cm4gbGRhY19hYnJfaW5pdF9mdW5jKGhMZGFjQWJyLCBpbnRlcnZhbF9tcyk7Ci19Ci0KLWludCBhMmRwX2xkYWNfYWJyX3NldF90aHJlc2hvbGRzKEhBTkRMRV9MREFDX0FCUiBoTGRhY0FiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aF9jcml0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aF9kYW5nZXJvdXNfdHJlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGhfNGhxc3EpIHsKLSAgcmV0dXJuIGxkYWNfYWJyX3NldF90aHJlc2hvbGRzX2Z1bmMoaExkYWNBYnIsIHRoX2NyaXRpY2FsLCB0aF9kYW5nZXJvdXNfdHJlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoXzRocXNxKTsKLX0KLQotaW50IGEyZHBfbGRhY19hYnJfcHJvYyhIQU5ETEVfTERBQ19CVCBoTGRhY1BhcmFtLCBIQU5ETEVfTERBQ19BQlIgaExkYWNBYnIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0cmFuc21pdF9xdWV1ZV9sZW5ndGgsIHVuc2lnbmVkIGludCBmbGFnX2VuYWJsZSkgewotICByZXR1cm4gbGRhY19hYnJfcHJvY19mdW5jKGhMZGFjUGFyYW0sIGhMZGFjQWJyLCB0cmFuc21pdF9xdWV1ZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ19lbmFibGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyLmNjIGIvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Y2JlMjguLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXIiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwotCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2lmbmRlZiBPU19HRU5FUklDCi0jaW5jbHVkZSA8Y3V0aWxzL3RyYWNlLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGRhY0JULmg+Ci0jaW5jbHVkZSA8bGRhY0JUX2Jjb19mb3JfZmx1b3JpZGUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhYy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8vCi0vLyBEZWNvZGVyIGZvciBMREFDIFNvdXJjZSBDb2RlYwotLy8KLQotLy8KLS8vIFRoZSBMREFDIEJDTyBzaGFyZWQgbGlicmFyeSwgYW5kIHRoZSBmdW5jdGlvbnMgdG8gdXNlCi0vLwotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfQkNPX0xJQl9OQU1FID0gImxpYmxkYWNCVF9iY28uc28iOwotc3RhdGljIHZvaWQqIGxkYWNfYmNvX2xpYl9oYW5kbGUgPSBOVUxMOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19CQ09fSU5JVF9OQU1FID0gImxkYWNfQkNPX2luaXQiOwotdHlwZWRlZiBIQU5ETEVfTERBQ19CQ08gKCp0TERBQ19CQ09fSU5JVCkoCi0gICAgZGVjb2RlZF9kYXRhX2NhbGxiYWNrX3QgZGVjb2RlX2NhbGxiYWNrKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfQkNPX0NMRUFOVVBfTkFNRSA9ICJsZGFjX0JDT19jbGVhbnVwIjsKLXR5cGVkZWYgaW50MzJfdCAoKnRMREFDX0JDT19DTEVBTlVQKShIQU5ETEVfTERBQ19CQ08gaExkYWNCY28pOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19CQ09fREVDT0RFX1BBQ0tFVF9OQU1FID0gImxkYWNfQkNPX2RlY29kZV9wYWNrZXQiOwotdHlwZWRlZiBpbnQzMl90ICgqdExEQUNfQkNPX0RFQ09ERV9QQUNLRVQpKEhBTkRMRV9MREFDX0JDTyBoTGRhY0Jjbywgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0JDT19TVEFSVF9OQU1FID0gImxkYWNfQkNPX3N0YXJ0IjsKLXR5cGVkZWYgaW50MzJfdCAoKnRMREFDX0JDT19TVEFSVCkoSEFORExFX0xEQUNfQkNPIGhMZGFjQmNvKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfQkNPX1NVU1BFTkRfTkFNRSA9ICJsZGFjX0JDT19zdXNwZW5kIjsKLXR5cGVkZWYgaW50MzJfdCAoKnRMREFDX0JDT19TVVNQRU5EKShIQU5ETEVfTERBQ19CQ08gaExkYWNCY28pOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19CQ09fQ09ORklHVVJFX05BTUUgPSAibGRhY19CQ09fY29uZmlndXJlIjsKLXR5cGVkZWYgaW50MzJfdCAoKnRMREFDX0JDT19DT05GSUdVUkUpKEhBTkRMRV9MREFDX0JDTyBoTGRhY0JjbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbF9tb2RlKTsKLQotc3RhdGljIHRMREFDX0JDT19JTklUIGxkYWNfQkNPX2luaXRfZnVuYzsKLXN0YXRpYyB0TERBQ19CQ09fQ0xFQU5VUCBsZGFjX0JDT19jbGVhbnVwX2Z1bmM7Ci1zdGF0aWMgdExEQUNfQkNPX0RFQ09ERV9QQUNLRVQgbGRhY19CQ09fZGVjb2RlX3BhY2tldF9mdW5jOwotc3RhdGljIHRMREFDX0JDT19TVEFSVCBsZGFjX0JDT19zdGFydF9mdW5jOwotc3RhdGljIHRMREFDX0JDT19TVVNQRU5EIGxkYWNfQkNPX3N1c3BlbmRfZnVuYzsKLXN0YXRpYyB0TERBQ19CQ09fQ09ORklHVVJFIGxkYWNfQkNPX2NvbmZpZ3VyZV9mdW5jOwotCi0vLyBvZmZzZXQKLSNpZiAoQlRBX0FWX0NPX0NQX1NDTVNfVCA9PSBUUlVFKQotI2RlZmluZSBBMkRQX0xEQUNfT0ZGU0VUIChBVkRUX01FRElBX09GRlNFVCArIEEyRFBfTERBQ19NUExfSERSX0xFTiArIDEpCi0jZWxzZQotI2RlZmluZSBBMkRQX0xEQUNfT0ZGU0VUIChBVkRUX01FRElBX09GRlNFVCArIEEyRFBfTERBQ19NUExfSERSX0xFTikKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHNhbXBsZV9yYXRlOwotICB1aW50OF90IGNoYW5uZWxfbW9kZTsKLSAgdWludDhfdCBiaXRzX3Blcl9zYW1wbGU7Ci0gIGludCBwY21fd2xlbmd0aDsKLSAgTERBQ0JUX1NNUExfRk1UX1QgcGNtX2ZtdDsKLX0gdEEyRFBfTERBQ19ERUNPREVSX1BBUkFNUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0gIGJvb2wgdXNlX1NDTVNfVDsKLSAgYm9vbCBpc19wZWVyX2VkcjsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGUgcGVlciBkZXZpY2Ugc3VwcG9ydHMgRURSCi0gIGJvb2wgcGVlcl9zdXBwb3J0c18zbWJwczsgIC8vIFRydWUgaWYgdGhlIHBlZXIgZGV2aWNlIHN1cHBvcnRzIDNNYnBzIEVEUgotICB1aW50MTZfdCBwZWVyX210dTsgICAgICAgICAvLyBNVFUgb2YgdGhlIEEyRFAgcGVlcgotICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAgICAvLyBUaW1lc3RhbXAgZm9yIHRoZSBBMkRQIGZyYW1lcwotCi0gIEhBTkRMRV9MREFDX0JDTyBsZGFjX2hhbmRsZV9iY287Ci0gIGJvb2wgaGFzX2xkYWNfaGFuZGxlOyAgLy8gVHJ1ZSBpZiBsZGFjX2hhbmRsZSBpcyB2YWxpZAotICB1bnNpZ25lZCBjaGFyKiBkZWNvZGVfYnVmOwotICBkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2s7Ci19IHRBMkRQX0xEQUNfREVDT0RFUl9DQjsKLQotc3RhdGljIHRBMkRQX0xEQUNfREVDT0RFUl9DQiBhMmRwX2xkYWNfZGVjb2Rlcl9jYjsKLQotc3RhdGljIHZvaWQqIGxvYWRfZnVuYyhjb25zdCBjaGFyKiBmdW5jX25hbWUpIHsKLSAgdm9pZCogZnVuY19wdHIgPSBkbHN5bShsZGFjX2Jjb19saWJfaGFuZGxlLCBmdW5jX25hbWUpOwotICBpZiAoZnVuY19wdHIgPT0gTlVMTCkgewotICAgIExPR19FUlJPUigiJXM6IGNhbm5vdCBmaW5kIGZ1bmN0aW9uICclcycgaW4gdGhlIGRlY29kZXIgbGlicmFyeTogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgZnVuY19uYW1lLCBkbGVycm9yKCkpOwotICAgIEEyRFBfVmVuZG9yVW5sb2FkRGVjb2RlckxkYWMoKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gZnVuY19wdHI7Ci19Ci0KLWJvb2wgQTJEUF9WZW5kb3JMb2FkRGVjb2RlckxkYWModm9pZCkgewotICBpZiAobGRhY19iY29fbGliX2hhbmRsZSAhPSBOVUxMKSByZXR1cm4gdHJ1ZTsgIC8vIEFscmVhZHkgbG9hZGVkCi0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBibG9jawotICBtZW1zZXQoJmEyZHBfbGRhY19kZWNvZGVyX2NiLCAwLCBzaXplb2YoYTJkcF9sZGFjX2RlY29kZXJfY2IpKTsKLQotICBwdGhyZWFkX211dGV4X2luaXQoJihhMmRwX2xkYWNfZGVjb2Rlcl9jYi5tdXRleCksIE5VTEwpOwotCi0gIC8vIE9wZW4gdGhlIGRlY29kZXIgbGlicmFyeQotICBsZGFjX2Jjb19saWJfaGFuZGxlID0gZGxvcGVuKExEQUNfQkNPX0xJQl9OQU1FLCBSVExEX05PVyk7Ci0gIGlmIChsZGFjX2Jjb19saWJfaGFuZGxlID09IE5VTEwpIHsKLSAgICBMT0dfSU5GTygiJXM6IGNhbm5vdCBvcGVuIExEQUMgZGVjb2RlciBsaWJyYXJ5ICVzOiAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBMREFDX0JDT19MSUJfTkFNRSwgZGxlcnJvcigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBMb2FkIGFsbCBmdW5jdGlvbnMKLSAgbGRhY19CQ09faW5pdF9mdW5jID0gKHRMREFDX0JDT19JTklUKWxvYWRfZnVuYyhMREFDX0JDT19JTklUX05BTUUpOwotICBpZiAobGRhY19CQ09faW5pdF9mdW5jID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBsZGFjX0JDT19jbGVhbnVwX2Z1bmMgPSAodExEQUNfQkNPX0NMRUFOVVApbG9hZF9mdW5jKExEQUNfQkNPX0NMRUFOVVBfTkFNRSk7Ci0gIGlmIChsZGFjX0JDT19jbGVhbnVwX2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIGxkYWNfQkNPX2RlY29kZV9wYWNrZXRfZnVuYyA9Ci0gICAgICAodExEQUNfQkNPX0RFQ09ERV9QQUNLRVQpbG9hZF9mdW5jKExEQUNfQkNPX0RFQ09ERV9QQUNLRVRfTkFNRSk7Ci0gIGlmIChsZGFjX0JDT19kZWNvZGVfcGFja2V0X2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIGxkYWNfQkNPX3N0YXJ0X2Z1bmMgPSAodExEQUNfQkNPX1NUQVJUKWxvYWRfZnVuYyhMREFDX0JDT19TVEFSVF9OQU1FKTsKLSAgaWYgKGxkYWNfQkNPX3N0YXJ0X2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIGxkYWNfQkNPX3N1c3BlbmRfZnVuYyA9ICh0TERBQ19CQ09fU1VTUEVORClsb2FkX2Z1bmMoTERBQ19CQ09fU1VTUEVORF9OQU1FKTsKLSAgaWYgKGxkYWNfQkNPX3N1c3BlbmRfZnVuYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgbGRhY19CQ09fY29uZmlndXJlX2Z1bmMgPQotICAgICAgKHRMREFDX0JDT19DT05GSUdVUkUpbG9hZF9mdW5jKExEQUNfQkNPX0NPTkZJR1VSRV9OQU1FKTsKLSAgaWYgKGxkYWNfQkNPX2NvbmZpZ3VyZV9mdW5jID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBMkRQX1ZlbmRvclVubG9hZERlY29kZXJMZGFjKHZvaWQpIHsKLSAgLy8gQ2xlYW51cCBhbnkgTERBQy1yZWxhdGVkIHN0YXRlCi0gIGlmIChhMmRwX2xkYWNfZGVjb2Rlcl9jYi5oYXNfbGRhY19oYW5kbGUgJiYgbGRhY19CQ09fY2xlYW51cF9mdW5jICE9IE5VTEwpCi0gICAgbGRhY19CQ09fY2xlYW51cF9mdW5jKGEyZHBfbGRhY19kZWNvZGVyX2NiLmxkYWNfaGFuZGxlX2Jjbyk7Ci0gIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKGEyZHBfbGRhY19kZWNvZGVyX2NiLm11dGV4KSk7Ci0gIG1lbXNldCgmYTJkcF9sZGFjX2RlY29kZXJfY2IsIDAsIHNpemVvZihhMmRwX2xkYWNfZGVjb2Rlcl9jYikpOwotCi0gIGxkYWNfQkNPX2luaXRfZnVuYyA9IE5VTEw7Ci0gIGxkYWNfQkNPX2NsZWFudXBfZnVuYyA9IE5VTEw7Ci0gIGxkYWNfQkNPX2RlY29kZV9wYWNrZXRfZnVuYyA9IE5VTEw7Ci0gIGxkYWNfQkNPX3N0YXJ0X2Z1bmMgPSBOVUxMOwotICBsZGFjX0JDT19zdXNwZW5kX2Z1bmMgPSBOVUxMOwotICBsZGFjX0JDT19jb25maWd1cmVfZnVuYyA9IE5VTEw7Ci0KLSAgaWYgKGxkYWNfYmNvX2xpYl9oYW5kbGUgIT0gTlVMTCkgewotICAgIGRsY2xvc2UobGRhY19iY29fbGliX2hhbmRsZSk7Ci0gICAgbGRhY19iY29fbGliX2hhbmRsZSA9IE5VTEw7Ci0gIH0KLX0KLQotYm9vbCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfaW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spIHsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCYoYTJkcF9sZGFjX2RlY29kZXJfY2IubXV0ZXgpKTsKLQotICBpZiAoYTJkcF9sZGFjX2RlY29kZXJfY2IuaGFzX2xkYWNfaGFuZGxlKQotICAgIGxkYWNfQkNPX2NsZWFudXBfZnVuYyhhMmRwX2xkYWNfZGVjb2Rlcl9jYi5sZGFjX2hhbmRsZV9iY28pOwotCi0gIGEyZHBfbGRhY19kZWNvZGVyX2NiLmxkYWNfaGFuZGxlX2JjbyA9IGxkYWNfQkNPX2luaXRfZnVuYyhkZWNvZGVfY2FsbGJhY2spOwotICBhMmRwX2xkYWNfZGVjb2Rlcl9jYi5oYXNfbGRhY19oYW5kbGUgPQotICAgICAgKGEyZHBfbGRhY19kZWNvZGVyX2NiLmxkYWNfaGFuZGxlX2JjbyAhPSBOVUxMKTsKLQotICBwdGhyZWFkX211dGV4X3VubG9jaygmKGEyZHBfbGRhY19kZWNvZGVyX2NiLm11dGV4KSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl9jbGVhbnVwKHZvaWQpIHsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCYoYTJkcF9sZGFjX2RlY29kZXJfY2IubXV0ZXgpKTsKLSAgaWYgKGEyZHBfbGRhY19kZWNvZGVyX2NiLmhhc19sZGFjX2hhbmRsZSkKLSAgICBsZGFjX0JDT19jbGVhbnVwX2Z1bmMoYTJkcF9sZGFjX2RlY29kZXJfY2IubGRhY19oYW5kbGVfYmNvKTsKLSAgYTJkcF9sZGFjX2RlY29kZXJfY2IubGRhY19oYW5kbGVfYmNvID0gTlVMTDsKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJihhMmRwX2xkYWNfZGVjb2Rlcl9jYi5tdXRleCkpOwotfQotCi1ib29sIGEyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl9kZWNvZGVfcGFja2V0KEJUX0hEUiogcF9idWYpIHsKLSAgaWYgKHBfYnVmID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIiVzIERyb3BwaW5nIHBhY2tldCB3aXRoIG51bGxwdHIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmKGEyZHBfbGRhY19kZWNvZGVyX2NiLm11dGV4KSk7Ci0gIHVuc2lnbmVkIGNoYXIqIHBCdWZmZXIgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4ocF9idWYtPmRhdGEgKyBwX2J1Zi0+b2Zmc2V0KTsKLSAgLy8gIHVuc2lnbmVkIGludCBidWZmZXJTaXplID0gcF9idWYtPmxlbjsKLSAgdW5zaWduZWQgaW50IGJ5dGVzVmFsaWQgPSBwX2J1Zi0+bGVuOwotICBpZiAoYnl0ZXNWYWxpZCA9PSAwKSB7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJihhMmRwX2xkYWNfZGVjb2Rlcl9jYi5tdXRleCkpOwotICAgIExPR19XQVJOKCIlcyBEcm9wcGluZyBwYWNrZXQgd2l0aCB6ZXJvIGxlbmd0aCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgYnNfYnl0ZXMsIGZyYW1lX251bWJlcjsKLQotICBmcmFtZV9udW1iZXIgPSAoaW50KXBCdWZmZXJbMF07Ci0gIGJzX2J5dGVzID0gKGludClieXRlc1ZhbGlkOwotICBieXRlc1ZhbGlkIC09IDE7Ci0gIExPR19JTkZPKCIlczpJTlBVVCBzaXplIDogJWQsIGZyYW1lIDogJWQiLCBfX2Z1bmNfXywgYnNfYnl0ZXMsIGZyYW1lX251bWJlcik7Ci0KLSAgaWYgKGEyZHBfbGRhY19kZWNvZGVyX2NiLmhhc19sZGFjX2hhbmRsZSkKLSAgICBsZGFjX0JDT19kZWNvZGVfcGFja2V0X2Z1bmMoYTJkcF9sZGFjX2RlY29kZXJfY2IubGRhY19oYW5kbGVfYmNvLCBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic19ieXRlcyk7Ci0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJihhMmRwX2xkYWNfZGVjb2Rlcl9jYi5tdXRleCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfc3RhcnQodm9pZCkgewotICBwdGhyZWFkX211dGV4X2xvY2soJihhMmRwX2xkYWNfZGVjb2Rlcl9jYi5tdXRleCkpOwotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChhMmRwX2xkYWNfZGVjb2Rlcl9jYi5oYXNfbGRhY19oYW5kbGUpCi0gICAgbGRhY19CQ09fc3RhcnRfZnVuYyhhMmRwX2xkYWNfZGVjb2Rlcl9jYi5sZGFjX2hhbmRsZV9iY28pOwotICBwdGhyZWFkX211dGV4X3VubG9jaygmKGEyZHBfbGRhY19kZWNvZGVyX2NiLm11dGV4KSk7Ci19Ci0KLXZvaWQgYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyX3N1c3BlbmQodm9pZCkgewotICBwdGhyZWFkX211dGV4X2xvY2soJihhMmRwX2xkYWNfZGVjb2Rlcl9jYi5tdXRleCkpOwotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChhMmRwX2xkYWNfZGVjb2Rlcl9jYi5oYXNfbGRhY19oYW5kbGUpCi0gICAgbGRhY19CQ09fc3VzcGVuZF9mdW5jKGEyZHBfbGRhY19kZWNvZGVyX2NiLmxkYWNfaGFuZGxlX2Jjbyk7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoYTJkcF9sZGFjX2RlY29kZXJfY2IubXV0ZXgpKTsKLX0KLQotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfY29uZmlndXJlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBpbnQzMl90IHNhbXBsZV9yYXRlOwotICBpbnQzMl90IGJpdHNfcGVyX3NhbXBsZTsKLSAgaW50MzJfdCBjaGFubmVsX21vZGU7Ci0KLSAgaWYgKHBfY29kZWNfaW5mbyA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogcF9jb2RlY19pbmZvIGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcHRocmVhZF9tdXRleF9sb2NrKCYoYTJkcF9sZGFjX2RlY29kZXJfY2IubXV0ZXgpKTsKLSAgc2FtcGxlX3JhdGUgPSBBMkRQX1ZlbmRvckdldFRyYWNrU2FtcGxlUmF0ZUxkYWMocF9jb2RlY19pbmZvKTsKLSAgYml0c19wZXJfc2FtcGxlID0gQTJEUF9WZW5kb3JHZXRUcmFja0JpdHNQZXJTYW1wbGVMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIGNoYW5uZWxfbW9kZSA9IEEyRFBfVmVuZG9yR2V0Q2hhbm5lbE1vZGVDb2RlTGRhYyhwX2NvZGVjX2luZm8pOwotCi0gIExPR19JTkZPKCIlcyAsIHNhbXBsZV9yYXRlPSVkLCBiaXRzX3Blcl9zYW1wbGU9JWQsIGNoYW5uZWxfbW9kZT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICBzYW1wbGVfcmF0ZSwgYml0c19wZXJfc2FtcGxlLCBjaGFubmVsX21vZGUpOwotCi0gIGlmIChhMmRwX2xkYWNfZGVjb2Rlcl9jYi5oYXNfbGRhY19oYW5kbGUpCi0gICAgbGRhY19CQ09fY29uZmlndXJlX2Z1bmMoYTJkcF9sZGFjX2RlY29kZXJfY2IubGRhY19oYW5kbGVfYmNvLCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGUsIGNoYW5uZWxfbW9kZSk7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoYTJkcF9sZGFjX2RlY29kZXJfY2IubXV0ZXgpKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2EyZHAvYTJkcF92ZW5kb3JfbGRhY19lbmNvZGVyLmNjIGIvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODdjNTIuLjAwMDAwMDAKLS0tIGEvc3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3ODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXIiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwotCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhY19lbmNvZGVyLmgiCi0KLSNpZm5kZWYgT1NfR0VORVJJQwotI2luY2x1ZGUgPGN1dGlscy90cmFjZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxkYWNCVC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhMmRwX3ZlbmRvci5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yX2xkYWMuaCIKLSNpbmNsdWRlICJhMmRwX3ZlbmRvcl9sZGFjX2Fici5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vLwotLy8gRW5jb2RlciBmb3IgTERBQyBTb3VyY2UgQ29kZWMKLS8vCi0KLS8vCi0vLyBUaGUgTERBQyBlbmNvZGVyIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhlIGZ1bmN0aW9ucyB0byB1c2UKLS8vCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19FTkNPREVSX0xJQl9OQU1FID0gImxpYmxkYWNCVF9lbmMuc28iOwotc3RhdGljIHZvaWQqIGxkYWNfZW5jb2Rlcl9saWJfaGFuZGxlID0gTlVMTDsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfR0VUX0hBTkRMRV9OQU1FID0gImxkYWNCVF9nZXRfaGFuZGxlIjsKLXR5cGVkZWYgSEFORExFX0xEQUNfQlQgKCp0TERBQ19HRVRfSEFORExFKSh2b2lkKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfRlJFRV9IQU5ETEVfTkFNRSA9ICJsZGFjQlRfZnJlZV9oYW5kbGUiOwotdHlwZWRlZiB2b2lkICgqdExEQUNfRlJFRV9IQU5ETEUpKEhBTkRMRV9MREFDX0JUIGhMZGFjUGFyYW0pOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19DTE9TRV9IQU5ETEVfTkFNRSA9ICJsZGFjQlRfY2xvc2VfaGFuZGxlIjsKLXR5cGVkZWYgdm9pZCAoKnRMREFDX0NMT1NFX0hBTkRMRSkoSEFORExFX0xEQUNfQlQgaExkYWNQYXJhbSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0dFVF9WRVJTSU9OX05BTUUgPSAibGRhY0JUX2dldF92ZXJzaW9uIjsKLXR5cGVkZWYgaW50ICgqdExEQUNfR0VUX1ZFUlNJT04pKHZvaWQpOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19HRVRfQklUUkFURV9OQU1FID0gImxkYWNCVF9nZXRfYml0cmF0ZSI7Ci10eXBlZGVmIGludCAoKnRMREFDX0dFVF9CSVRSQVRFKShIQU5ETEVfTERBQ19CVCBoTGRhY1BhcmFtKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIExEQUNfR0VUX1NBTVBMSU5HX0ZSRVFfTkFNRSA9ICJsZGFjQlRfZ2V0X3NhbXBsaW5nX2ZyZXEiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19HRVRfU0FNUExJTkdfRlJFUSkoSEFORExFX0xEQUNfQlQgaExkYWNQYXJhbSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0lOSVRfSEFORExFX0VOQ09ERV9OQU1FID0gImxkYWNCVF9pbml0X2hhbmRsZV9lbmNvZGUiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19JTklUX0hBTkRMRV9FTkNPREUpKEhBTkRMRV9MREFDX0JUIGhMZGFjUGFyYW0sIGludCBtdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVxbWlkLCBpbnQgY2hhbm5lbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQUNCVF9TTVBMX0ZNVF9UIGZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdfZnJlcSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0VOQ09ERV9OQU1FID0gImxkYWNCVF9lbmNvZGUiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19FTkNPREUpKEhBTkRMRV9MREFDX0JUIGhMZGFjUGFyYW0sIHZvaWQqIHBfcGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcF9wY21fZW5jb2RlZF9ieXRlLCB1bnNpZ25lZCBjaGFyKiBwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBmcmFtZV9sZW5ndGhfd3JvdGUsIGludCogcGZyYW1lX251bSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX1NFVF9FUU1JRF9OQU1FID0gImxkYWNCVF9zZXRfZXFtaWQiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19TRVRfRVFNSUQpKEhBTkRMRV9MREFDX0JUIGhMZGFjUGFyYW0sIGludCBlcW1pZCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0FMVEVSX0VRTUlEX1BSSU9SSVRZX05BTUUgPQotICAgICJsZGFjQlRfYWx0ZXJfZXFtaWRfcHJpb3JpdHkiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19BTFRFUl9FUU1JRF9QUklPUklUWSkoSEFORExFX0xEQUNfQlQgaExkYWNQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0dFVF9FUU1JRF9OQU1FID0gImxkYWNCVF9nZXRfZXFtaWQiOwotdHlwZWRlZiBpbnQgKCp0TERBQ19HRVRfRVFNSUQpKEhBTkRMRV9MREFDX0JUIGhMZGFjUGFyYW0pOwotCi1zdGF0aWMgY29uc3QgY2hhciogTERBQ19HRVRfRVJST1JfQ09ERV9OQU1FID0gImxkYWNCVF9nZXRfZXJyb3JfY29kZSI7Ci10eXBlZGVmIGludCAoKnRMREFDX0dFVF9FUlJPUl9DT0RFKShIQU5ETEVfTERBQ19CVCBoTGRhY1BhcmFtKTsKLQotc3RhdGljIHRMREFDX0dFVF9IQU5ETEUgbGRhY19nZXRfaGFuZGxlX2Z1bmM7Ci1zdGF0aWMgdExEQUNfRlJFRV9IQU5ETEUgbGRhY19mcmVlX2hhbmRsZV9mdW5jOwotc3RhdGljIHRMREFDX0NMT1NFX0hBTkRMRSBsZGFjX2Nsb3NlX2hhbmRsZV9mdW5jOwotc3RhdGljIHRMREFDX0dFVF9WRVJTSU9OIGxkYWNfZ2V0X3ZlcnNpb25fZnVuYzsKLXN0YXRpYyB0TERBQ19HRVRfQklUUkFURSBsZGFjX2dldF9iaXRyYXRlX2Z1bmM7Ci1zdGF0aWMgdExEQUNfR0VUX1NBTVBMSU5HX0ZSRVEgbGRhY19nZXRfc2FtcGxpbmdfZnJlcV9mdW5jOwotc3RhdGljIHRMREFDX0lOSVRfSEFORExFX0VOQ09ERSBsZGFjX2luaXRfaGFuZGxlX2VuY29kZV9mdW5jOwotc3RhdGljIHRMREFDX0VOQ09ERSBsZGFjX2VuY29kZV9mdW5jOwotc3RhdGljIHRMREFDX1NFVF9FUU1JRCBsZGFjX3NldF9lcW1pZF9mdW5jOwotc3RhdGljIHRMREFDX0FMVEVSX0VRTUlEX1BSSU9SSVRZIGxkYWNfYWx0ZXJfZXFtaWRfcHJpb3JpdHlfZnVuYzsKLXN0YXRpYyB0TERBQ19HRVRfRVFNSUQgbGRhY19nZXRfZXFtaWRfZnVuYzsKLXN0YXRpYyB0TERBQ19HRVRfRVJST1JfQ09ERSBsZGFjX2dldF9lcnJvcl9jb2RlX2Z1bmM7Ci0KLS8vIEEyRFAgTERBQyBlbmNvZGVyIGludGVydmFsIGluIG1pbGxpc2Vjb25kcwotI2RlZmluZSBBMkRQX0xEQUNfRU5DT0RFUl9JTlRFUlZBTF9NUyAyMAotI2RlZmluZSBBMkRQX0xEQUNfTUVESUFfQllURVNfUEVSX0ZSQU1FIDEyOAotCi0vLyBvZmZzZXQKLSNpZiAoQlRBX0FWX0NPX0NQX1NDTVNfVCA9PSBUUlVFKQotI2RlZmluZSBBMkRQX0xEQUNfT0ZGU0VUIChBVkRUX01FRElBX09GRlNFVCArIEEyRFBfTERBQ19NUExfSERSX0xFTiArIDEpCi0jZWxzZQotI2RlZmluZSBBMkRQX0xEQUNfT0ZGU0VUIChBVkRUX01FRElBX09GRlNFVCArIEEyRFBfTERBQ19NUExfSERSX0xFTikKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHNhbXBsZV9yYXRlOwotICB1aW50OF90IGNoYW5uZWxfbW9kZTsKLSAgdWludDhfdCBiaXRzX3Blcl9zYW1wbGU7Ci0gIGludCBxdWFsaXR5X21vZGVfaW5kZXg7Ci0gIGludCBwY21fd2xlbmd0aDsKLSAgTERBQ0JUX1NNUExfRk1UX1QgcGNtX2ZtdDsKLX0gdEEyRFBfTERBQ19FTkNPREVSX1BBUkFNUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBmbG9hdCBjb3VudGVyOwotICB1aW50MzJfdCBieXRlc19wZXJfdGljazsgLyogcGNtIGJ5dGVzIHJlYWQgZWFjaCBtZWRpYSB0YXNrIHRpY2sgKi8KLSAgdWludDY0X3QgbGFzdF9mcmFtZV91czsKLX0gdEEyRFBfTERBQ19GRUVESU5HX1NUQVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ2NF90IHNlc3Npb25fc3RhcnRfdXM7Ci0KLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcGFja2V0czsKLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZHNfY291bnQ7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRfYnl0ZXM7Ci0KLSAgc2l6ZV90IG1lZGlhX3JlYWRfdG90YWxfZHJvcHBlZF9wYWNrZXRzOwotICBzaXplX3QgbWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZHNfY291bnQ7Ci0gIHNpemVfdCBtZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzOwotfSBhMmRwX2xkYWNfZW5jb2Rlcl9zdGF0c190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCByZWFkX2NhbGxiYWNrOwotICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjazsKLSAgdWludDE2X3QgVHhBYU10dVNpemU7Ci0gIHNpemVfdCBUeFF1ZXVlTGVuZ3RoOwotCi0gIGJvb2wgdXNlX1NDTVNfVDsKLSAgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TIHBlZXJfcGFyYW1zOwotICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAgICAvLyBUaW1lc3RhbXAgZm9yIHRoZSBBMkRQIGZyYW1lcwotCi0gIEhBTkRMRV9MREFDX0JUIGxkYWNfaGFuZGxlOwotICBib29sIGhhc19sZGFjX2hhbmRsZTsgIC8vIFRydWUgaWYgbGRhY19oYW5kbGUgaXMgdmFsaWQKLQotICBIQU5ETEVfTERBQ19BQlIgbGRhY19hYnJfaGFuZGxlOwotICBib29sIGhhc19sZGFjX2Ficl9oYW5kbGU7Ci0gIGludCBsYXN0X2xkYWNfYWJyX2VxbWlkOwotICBzaXplX3QgbGRhY19hYnJfYWRqdXN0bWVudHM7Ci0KLSAgdEEyRFBfRkVFRElOR19QQVJBTVMgZmVlZGluZ19wYXJhbXM7Ci0gIHRBMkRQX0xEQUNfRU5DT0RFUl9QQVJBTVMgbGRhY19lbmNvZGVyX3BhcmFtczsKLSAgdEEyRFBfTERBQ19GRUVESU5HX1NUQVRFIGxkYWNfZmVlZGluZ19zdGF0ZTsKLQotICBhMmRwX2xkYWNfZW5jb2Rlcl9zdGF0c190IHN0YXRzOwotfSB0QTJEUF9MREFDX0VOQ09ERVJfQ0I7Ci0KLXN0YXRpYyBib29sIGxkYWNfYWJyX2xvYWRlZCA9IGZhbHNlOwotCi1zdGF0aWMgdEEyRFBfTERBQ19FTkNPREVSX0NCIGEyZHBfbGRhY19lbmNvZGVyX2NiOwotCi1zdGF0aWMgdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXJfdXBkYXRlKEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcF9jb25maWdfdXBkYXRlZCk7Ci1zdGF0aWMgdm9pZCBhMmRwX2xkYWNfZ2V0X251bV9mcmFtZV9pdGVyYXRpb24odWludDhfdCogbnVtX29mX2l0ZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogbnVtX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfdXMpOwotc3RhdGljIHZvaWQgYTJkcF9sZGFjX2VuY29kZV9mcmFtZXModWludDhfdCBuYl9mcmFtZSk7Ci1zdGF0aWMgYm9vbCBhMmRwX2xkYWNfcmVhZF9mZWVkaW5nKHVpbnQ4X3QqIHJlYWRfYnVmZmVyLCB1aW50MzJfdCogYnl0ZXNfcmVhZCk7Ci1zdGF0aWMgdWludDE2X3QgYWRqdXN0X2VmZmVjdGl2ZV9tdHUoCi0gICAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TJiBwZWVyX3BhcmFtcyk7Ci1zdGF0aWMgc3RkOjpzdHJpbmcgcXVhbGl0eV9tb2RlX2luZGV4X3RvX25hbWUoaW50IHF1YWxpdHlfbW9kZV9pbmRleCk7Ci0KLXN0YXRpYyB2b2lkKiBsb2FkX2Z1bmMoY29uc3QgY2hhciogZnVuY19uYW1lKSB7Ci0gIHZvaWQqIGZ1bmNfcHRyID0gZGxzeW0obGRhY19lbmNvZGVyX2xpYl9oYW5kbGUsIGZ1bmNfbmFtZSk7Ci0gIGlmIChmdW5jX3B0ciA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IGZpbmQgZnVuY3Rpb24gJyVzJyBpbiB0aGUgZW5jb2RlciBsaWJyYXJ5OiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBmdW5jX25hbWUsIGRsZXJyb3IoKSk7Ci0gICAgQTJEUF9WZW5kb3JVbmxvYWRFbmNvZGVyTGRhYygpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBmdW5jX3B0cjsKLX0KLQotYm9vbCBBMkRQX1ZlbmRvckxvYWRFbmNvZGVyTGRhYyh2b2lkKSB7Ci0gIGlmIChsZGFjX2VuY29kZXJfbGliX2hhbmRsZSAhPSBOVUxMKSByZXR1cm4gdHJ1ZTsgIC8vIEFscmVhZHkgbG9hZGVkCi0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBibG9jawotICBtZW1zZXQoJmEyZHBfbGRhY19lbmNvZGVyX2NiLCAwLCBzaXplb2YoYTJkcF9sZGFjX2VuY29kZXJfY2IpKTsKLQotICAvLyBPcGVuIHRoZSBlbmNvZGVyIGxpYnJhcnkKLSAgbGRhY19lbmNvZGVyX2xpYl9oYW5kbGUgPSBkbG9wZW4oTERBQ19FTkNPREVSX0xJQl9OQU1FLCBSVExEX05PVyk7Ci0gIGlmIChsZGFjX2VuY29kZXJfbGliX2hhbmRsZSA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCIlczogY2Fubm90IG9wZW4gTERBQyBlbmNvZGVyIGxpYnJhcnkgJXM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIExEQUNfRU5DT0RFUl9MSUJfTkFNRSwgZGxlcnJvcigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBMb2FkIGFsbCBmdW5jdGlvbnMKLSAgbGRhY19nZXRfaGFuZGxlX2Z1bmMgPSAodExEQUNfR0VUX0hBTkRMRSlsb2FkX2Z1bmMoTERBQ19HRVRfSEFORExFX05BTUUpOwotICBpZiAobGRhY19nZXRfaGFuZGxlX2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBsZGFjX2ZyZWVfaGFuZGxlX2Z1bmMgPSAodExEQUNfRlJFRV9IQU5ETEUpbG9hZF9mdW5jKExEQUNfRlJFRV9IQU5ETEVfTkFNRSk7Ci0gIGlmIChsZGFjX2ZyZWVfaGFuZGxlX2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBsZGFjX2Nsb3NlX2hhbmRsZV9mdW5jID0KLSAgICAgICh0TERBQ19DTE9TRV9IQU5ETEUpbG9hZF9mdW5jKExEQUNfQ0xPU0VfSEFORExFX05BTUUpOwotICBpZiAobGRhY19jbG9zZV9oYW5kbGVfZnVuYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gIGxkYWNfZ2V0X3ZlcnNpb25fZnVuYyA9ICh0TERBQ19HRVRfVkVSU0lPTilsb2FkX2Z1bmMoTERBQ19HRVRfVkVSU0lPTl9OQU1FKTsKLSAgaWYgKGxkYWNfZ2V0X3ZlcnNpb25fZnVuYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gIGxkYWNfZ2V0X2JpdHJhdGVfZnVuYyA9ICh0TERBQ19HRVRfQklUUkFURSlsb2FkX2Z1bmMoTERBQ19HRVRfQklUUkFURV9OQU1FKTsKLSAgaWYgKGxkYWNfZ2V0X2JpdHJhdGVfZnVuYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gIGxkYWNfZ2V0X3NhbXBsaW5nX2ZyZXFfZnVuYyA9Ci0gICAgICAodExEQUNfR0VUX1NBTVBMSU5HX0ZSRVEpbG9hZF9mdW5jKExEQUNfR0VUX1NBTVBMSU5HX0ZSRVFfTkFNRSk7Ci0gIGlmIChsZGFjX2dldF9zYW1wbGluZ19mcmVxX2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBsZGFjX2luaXRfaGFuZGxlX2VuY29kZV9mdW5jID0KLSAgICAgICh0TERBQ19JTklUX0hBTkRMRV9FTkNPREUpbG9hZF9mdW5jKExEQUNfSU5JVF9IQU5ETEVfRU5DT0RFX05BTUUpOwotICBpZiAobGRhY19pbml0X2hhbmRsZV9lbmNvZGVfZnVuYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gIGxkYWNfZW5jb2RlX2Z1bmMgPSAodExEQUNfRU5DT0RFKWxvYWRfZnVuYyhMREFDX0VOQ09ERV9OQU1FKTsKLSAgaWYgKGxkYWNfZW5jb2RlX2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBsZGFjX3NldF9lcW1pZF9mdW5jID0gKHRMREFDX1NFVF9FUU1JRClsb2FkX2Z1bmMoTERBQ19TRVRfRVFNSURfTkFNRSk7Ci0gIGlmIChsZGFjX3NldF9lcW1pZF9mdW5jID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgbGRhY19hbHRlcl9lcW1pZF9wcmlvcml0eV9mdW5jID0KLSAgICAgICh0TERBQ19BTFRFUl9FUU1JRF9QUklPUklUWSlsb2FkX2Z1bmMoTERBQ19BTFRFUl9FUU1JRF9QUklPUklUWV9OQU1FKTsKLSAgaWYgKGxkYWNfYWx0ZXJfZXFtaWRfcHJpb3JpdHlfZnVuYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gIGxkYWNfZ2V0X2VxbWlkX2Z1bmMgPSAodExEQUNfR0VUX0VRTUlEKWxvYWRfZnVuYyhMREFDX0dFVF9FUU1JRF9OQU1FKTsKLSAgaWYgKGxkYWNfZ2V0X2VxbWlkX2Z1bmMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBsZGFjX2dldF9lcnJvcl9jb2RlX2Z1bmMgPQotICAgICAgKHRMREFDX0dFVF9FUlJPUl9DT0RFKWxvYWRfZnVuYyhMREFDX0dFVF9FUlJPUl9DT0RFX05BTUUpOwotICBpZiAobGRhY19nZXRfZXJyb3JfY29kZV9mdW5jID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBpZiAoIUEyRFBfVmVuZG9yTG9hZExkYWNBYnIoKSkgewotICAgIExPR19XQVJOKCIlczogY2Fubm90IGxvYWQgdGhlIExEQUMgQUJSIGxpYnJhcnkiLCBfX2Z1bmNfXyk7Ci0gICAgbGRhY19hYnJfbG9hZGVkID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgbGRhY19hYnJfbG9hZGVkID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBMkRQX1ZlbmRvclVubG9hZEVuY29kZXJMZGFjKHZvaWQpIHsKLSAgLy8gQ2xlYW51cCBhbnkgTERBQy1yZWxhdGVkIHN0YXRlCi0gIGlmIChhMmRwX2xkYWNfZW5jb2Rlcl9jYi5oYXNfbGRhY19oYW5kbGUgJiYgbGRhY19mcmVlX2hhbmRsZV9mdW5jICE9IE5VTEwpCi0gICAgbGRhY19mcmVlX2hhbmRsZV9mdW5jKGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfaGFuZGxlKTsKLSAgbWVtc2V0KCZhMmRwX2xkYWNfZW5jb2Rlcl9jYiwgMCwgc2l6ZW9mKGEyZHBfbGRhY19lbmNvZGVyX2NiKSk7Ci0KLSAgbGRhY19nZXRfaGFuZGxlX2Z1bmMgPSBOVUxMOwotICBsZGFjX2ZyZWVfaGFuZGxlX2Z1bmMgPSBOVUxMOwotICBsZGFjX2Nsb3NlX2hhbmRsZV9mdW5jID0gTlVMTDsKLSAgbGRhY19nZXRfdmVyc2lvbl9mdW5jID0gTlVMTDsKLSAgbGRhY19nZXRfYml0cmF0ZV9mdW5jID0gTlVMTDsKLSAgbGRhY19nZXRfc2FtcGxpbmdfZnJlcV9mdW5jID0gTlVMTDsKLSAgbGRhY19pbml0X2hhbmRsZV9lbmNvZGVfZnVuYyA9IE5VTEw7Ci0gIGxkYWNfZW5jb2RlX2Z1bmMgPSBOVUxMOwotICBsZGFjX3NldF9lcW1pZF9mdW5jID0gTlVMTDsKLSAgbGRhY19hbHRlcl9lcW1pZF9wcmlvcml0eV9mdW5jID0gTlVMTDsKLSAgbGRhY19nZXRfZXFtaWRfZnVuYyA9IE5VTEw7Ci0gIGxkYWNfZ2V0X2Vycm9yX2NvZGVfZnVuYyA9IE5VTEw7Ci0KLSAgaWYgKGxkYWNfZW5jb2Rlcl9saWJfaGFuZGxlICE9IE5VTEwpIHsKLSAgICBkbGNsb3NlKGxkYWNfZW5jb2Rlcl9saWJfaGFuZGxlKTsKLSAgICBsZGFjX2VuY29kZXJfbGliX2hhbmRsZSA9IE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXJfaW5pdCgKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZywKLSAgICBhMmRwX3NvdXJjZV9yZWFkX2NhbGxiYWNrX3QgcmVhZF9jYWxsYmFjaywKLSAgICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjaykgewotICBpZiAoYTJkcF9sZGFjX2VuY29kZXJfY2IuaGFzX2xkYWNfaGFuZGxlKQotICAgIGxkYWNfZnJlZV9oYW5kbGVfZnVuYyhhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2hhbmRsZSk7Ci0gIGlmIChhMmRwX2xkYWNfZW5jb2Rlcl9jYi5oYXNfbGRhY19hYnJfaGFuZGxlKQotICAgIGEyZHBfbGRhY19hYnJfZnJlZV9oYW5kbGUoYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19hYnJfaGFuZGxlKTsKLSAgbWVtc2V0KCZhMmRwX2xkYWNfZW5jb2Rlcl9jYiwgMCwgc2l6ZW9mKGEyZHBfbGRhY19lbmNvZGVyX2NiKSk7Ci0KLSAgYTJkcF9sZGFjX2VuY29kZXJfY2Iuc3RhdHMuc2Vzc2lvbl9zdGFydF91cyA9Ci0gICAgICBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLQotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5yZWFkX2NhbGxiYWNrID0gcmVhZF9jYWxsYmFjazsKLSAgYTJkcF9sZGFjX2VuY29kZXJfY2IuZW5xdWV1ZV9jYWxsYmFjayA9IGVucXVldWVfY2FsbGJhY2s7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLnBlZXJfcGFyYW1zID0gKnBfcGVlcl9wYXJhbXM7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLnRpbWVzdGFtcCA9IDA7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfYWJyX2hhbmRsZSA9IE5VTEw7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLmhhc19sZGFjX2Ficl9oYW5kbGUgPSBmYWxzZTsKLSAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGFzdF9sZGFjX2Ficl9lcW1pZCA9IC0xOwotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2Ficl9hZGp1c3RtZW50cyA9IDA7Ci0KLSAgYTJkcF9sZGFjX2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IGZhbHNlOyAgLy8gVE9ETzogc2hvdWxkIGJlIGEgcGFyYW1ldGVyCi0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgYTJkcF9sZGFjX2VuY29kZXJfY2IudXNlX1NDTVNfVCA9IHRydWU7Ci0jZW5kaWYKLQotICAvLyBOT1RFOiBJZ25vcmUgdGhlIHJlc3RhcnRfaW5wdXQgLyByZXN0YXJ0X291dHB1dCBmbGFncyAtIHRoaXMgaW5pdGl6YXRpb24KLSAgLy8gaGFwcGVucyB3aGVuIHRoZSBhdWRpbyBzZXNzaW9uIGlzIChyZSlzdGFydGVkLgotICBib29sIHJlc3RhcnRfaW5wdXQgPSBmYWxzZTsKLSAgYm9vbCByZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICBib29sIGNvbmZpZ191cGRhdGVkID0gZmFsc2U7Ci0gIGEyZHBfdmVuZG9yX2xkYWNfZW5jb2Rlcl91cGRhdGUoYTJkcF9jb2RlY19jb25maWcsICZyZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0YXJ0X291dHB1dCwgJmNvbmZpZ191cGRhdGVkKTsKLX0KLQotLy8gVXBkYXRlIHRoZSBBMkRQIExEQUMgZW5jb2Rlci4KLS8vIHxhMmRwX2NvZGVjX2NvbmZpZ3wgaXMgdGhlIEEyRFAgY29kZWMgdG8gdXNlIGZvciB0aGUgdXBkYXRlLgotc3RhdGljIHZvaWQgYTJkcF92ZW5kb3JfbGRhY19lbmNvZGVyX3VwZGF0ZShBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfY29uZmlnX3VwZGF0ZWQpIHsKLSAgdEEyRFBfTERBQ19FTkNPREVSX1BBUkFNUyogcF9lbmNvZGVyX3BhcmFtcyA9Ci0gICAgICAmYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19lbmNvZGVyX3BhcmFtczsKLSAgdWludDhfdCBjb2RlY19pbmZvW0FWRFRfQ09ERUNfU0laRV07Ci0KLSAgKnBfcmVzdGFydF9pbnB1dCA9IGZhbHNlOwotICAqcF9yZXN0YXJ0X291dHB1dCA9IGZhbHNlOwotICAqcF9jb25maWdfdXBkYXRlZCA9IGZhbHNlOwotCi0gIGlmICghYTJkcF9sZGFjX2VuY29kZXJfY2IuaGFzX2xkYWNfaGFuZGxlKSB7Ci0gICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19oYW5kbGUgPSBsZGFjX2dldF9oYW5kbGVfZnVuYygpOwotICAgIGlmIChhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2hhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICBMT0dfRVJST1IoIiVzOiBDYW5ub3QgZ2V0IExEQUMgZW5jb2RlciBoYW5kbGUiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm47ICAvLyBUT0RPOiBSZXR1cm4gYW4gZXJyb3I/Ci0gICAgfQotICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLmhhc19sZGFjX2hhbmRsZSA9IHRydWU7Ci0gIH0KLSAgQ0hFQ0soYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19oYW5kbGUgIT0gbnVsbHB0cik7Ci0KLSAgaWYgKCFhMmRwX2NvZGVjX2NvbmZpZy0+Y29weU91dE90YUNvZGVjQ29uZmlnKGNvZGVjX2luZm8pKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiJXM6IENhbm5vdCB1cGRhdGUgdGhlIGNvZGVjIGVuY29kZXIgZm9yICVzOiAiCi0gICAgICAgICJpbnZhbGlkIGNvZGVjIGNvbmZpZyIsCi0gICAgICAgIF9fZnVuY19fLCBhMmRwX2NvZGVjX2NvbmZpZy0+bmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8gPSBjb2RlY19pbmZvOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnID0gYTJkcF9jb2RlY19jb25maWctPmdldENvZGVjQ29uZmlnKCk7Ci0KLSAgLy8gVGhlIGZlZWRpbmcgcGFyYW1ldGVycwotICB0QTJEUF9GRUVESU5HX1BBUkFNUyogcF9mZWVkaW5nX3BhcmFtcyA9ICZhMmRwX2xkYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtczsKLSAgcF9mZWVkaW5nX3BhcmFtcy0+c2FtcGxlX3JhdGUgPQotICAgICAgQTJEUF9WZW5kb3JHZXRUcmFja1NhbXBsZVJhdGVMZGFjKHBfY29kZWNfaW5mbyk7Ci0gIHBfZmVlZGluZ19wYXJhbXMtPmJpdHNfcGVyX3NhbXBsZSA9Ci0gICAgICBhMmRwX2NvZGVjX2NvbmZpZy0+Z2V0QXVkaW9CaXRzUGVyU2FtcGxlKCk7Ci0gIHBfZmVlZGluZ19wYXJhbXMtPmNoYW5uZWxfY291bnQgPQotICAgICAgQTJEUF9WZW5kb3JHZXRUcmFja0NoYW5uZWxDb3VudExkYWMocF9jb2RlY19pbmZvKTsKLSAgTE9HX0lORk8oIiVzOiBzYW1wbGVfcmF0ZT0ldSBiaXRzX3Blcl9zYW1wbGU9JXUgY2hhbm5lbF9jb3VudD0ldSIsIF9fZnVuY19fLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5zYW1wbGVfcmF0ZSwgcF9mZWVkaW5nX3BhcmFtcy0+Yml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICBwX2ZlZWRpbmdfcGFyYW1zLT5jaGFubmVsX2NvdW50KTsKLSAgYTJkcF92ZW5kb3JfbGRhY19mZWVkaW5nX3Jlc2V0KCk7Ci0KLSAgLy8gVGhlIGNvZGVjIHBhcmFtZXRlcnMKLSAgcF9lbmNvZGVyX3BhcmFtcy0+c2FtcGxlX3JhdGUgPQotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuc2FtcGxlX3JhdGU7Ci0gIHBfZW5jb2Rlcl9wYXJhbXMtPmNoYW5uZWxfbW9kZSA9Ci0gICAgICBBMkRQX1ZlbmRvckdldENoYW5uZWxNb2RlQ29kZUxkYWMocF9jb2RlY19pbmZvKTsKLQotICAvLyBTZXQgdGhlIHF1YWxpdHkgbW9kZSBpbmRleAotICBpbnQgb2xkX3F1YWxpdHlfbW9kZV9pbmRleCA9IHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleDsKLSAgaWYgKGNvZGVjX2NvbmZpZy5jb2RlY19zcGVjaWZpY18xICE9IDApIHsKLSAgICBwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXggPSBjb2RlY19jb25maWcuY29kZWNfc3BlY2lmaWNfMSAlIDEwOwotICAgIExPR19JTkZPKCIlczogc2V0dGluZyBxdWFsaXR5IG1vZGUgdG8gJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICBxdWFsaXR5X21vZGVfaW5kZXhfdG9fbmFtZShwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXgpCi0gICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXggPSBBMkRQX0xEQUNfUVVBTElUWV9BQlI7Ci0gICAgTE9HX0lORk8oIiVzOiBzZXR0aW5nIHF1YWxpdHkgbW9kZSB0byBkZWZhdWx0ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgcXVhbGl0eV9tb2RlX2luZGV4X3RvX25hbWUocF9lbmNvZGVyX3BhcmFtcy0+cXVhbGl0eV9tb2RlX2luZGV4KQotICAgICAgICAgICAgICAgICAuY19zdHIoKSk7Ci0gIH0KLQotICBpbnQgbGRhY19lcW1pZCA9IExEQUNfQUJSX01PREVfRVFNSUQ7Ci0gIGlmIChwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXggPT0gQTJEUF9MREFDX1FVQUxJVFlfQUJSKSB7Ci0gICAgaWYgKCFsZGFjX2Ficl9sb2FkZWQpIHsKLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleCA9IEEyRFBfTERBQ19RVUFMSVRZX01JRDsKLSAgICAgIExPR19XQVJOKAotCi0gICAgICAgICAgIiVzOiBMREFDIEFCUiBsaWJyYXJ5IGlzIG5vdCBsb2FkZWQsIHJlc2V0dGluZyBxdWFsaXR5IG1vZGUgdG8gJXMiLAotICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgIHF1YWxpdHlfbW9kZV9pbmRleF90b19uYW1lKHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleCkKLSAgICAgICAgICAgICAgLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfSU5GTygiJXM6IGNoYW5naW5nIG1vZGUgZnJvbSAlcyB0byAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgcXVhbGl0eV9tb2RlX2luZGV4X3RvX25hbWUob2xkX3F1YWxpdHlfbW9kZV9pbmRleCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIHF1YWxpdHlfbW9kZV9pbmRleF90b19uYW1lKHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7Ci0gICAgICBpZiAoYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19hYnJfaGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgTE9HX0lORk8oIiVzOiBhbHJlYWR5IGluIExEQUMgQUJSIG1vZGUsIGRvIG5vdGhpbmcuIiwgX19mdW5jX18pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0lORk8oIiVzOiBnZXQgYW5kIGluaXQgTERBQyBBQlIgaGFuZGxlLiIsIF9fZnVuY19fKTsKLSAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19hYnJfaGFuZGxlID0gYTJkcF9sZGFjX2Ficl9nZXRfaGFuZGxlKCk7Ci0gICAgICAgIGlmIChhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2Ficl9oYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLmhhc19sZGFjX2Ficl9oYW5kbGUgPSB0cnVlOwotICAgICAgICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxhc3RfbGRhY19hYnJfZXFtaWQgPSAtMTsKLSAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2Ficl9hZGp1c3RtZW50cyA9IDA7Ci0gICAgICAgICAgYTJkcF9sZGFjX2Ficl9pbml0KGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfYWJyX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTJEUF9MREFDX0VOQ09ERVJfSU5URVJWQUxfTVMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleCA9IEEyRFBfTERBQ19RVUFMSVRZX01JRDsKLSAgICAgICAgICBMT0dfSU5GTygKLQotICAgICAgICAgICAgICAiJXM6IGdldCBMREFDIEFCUiBoYW5kbGUgZmFpbGVkLCByZXNldHRpbmcgcXVhbGl0eSBtb2RlIHRvICVzLiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICBxdWFsaXR5X21vZGVfaW5kZXhfdG9fbmFtZShwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXgpCi0gICAgICAgICAgICAgICAgICAuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbGRhY19lcW1pZCA9IHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleDsKLSAgICBMT0dfSU5GTygiJXM6IGluICVzIG1vZGUsIGZyZWUgTERBQyBBQlIgaGFuZGxlLiIsIF9fZnVuY19fLAotICAgICAgICAgICAgIHF1YWxpdHlfbW9kZV9pbmRleF90b19uYW1lKGxkYWNfZXFtaWQpLmNfc3RyKCkpOwotICAgIGlmIChhMmRwX2xkYWNfZW5jb2Rlcl9jYi5oYXNfbGRhY19hYnJfaGFuZGxlKSB7Ci0gICAgICBhMmRwX2xkYWNfYWJyX2ZyZWVfaGFuZGxlKGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfYWJyX2hhbmRsZSk7Ci0gICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2Ficl9oYW5kbGUgPSBOVUxMOwotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuaGFzX2xkYWNfYWJyX2hhbmRsZSA9IGZhbHNlOwotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGFzdF9sZGFjX2Ficl9lcW1pZCA9IC0xOwotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19hYnJfYWRqdXN0bWVudHMgPSAwOwotICAgIH0KLSAgfQotCi0gIGlmIChwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXggIT0gb2xkX3F1YWxpdHlfbW9kZV9pbmRleCkKLSAgICAqcF9jb25maWdfdXBkYXRlZCA9IHRydWU7Ci0KLSAgcF9lbmNvZGVyX3BhcmFtcy0+cGNtX3dsZW5ndGggPQotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuYml0c19wZXJfc2FtcGxlID4+IDM7Ci0gIC8vIFNldCB0aGUgQXVkaW8gZm9ybWF0IGZyb20gcGNtX3dsZW5ndGgKLSAgcF9lbmNvZGVyX3BhcmFtcy0+cGNtX2ZtdCA9IExEQUNCVF9TTVBMX0ZNVF9TMTY7Ci0gIGlmIChwX2VuY29kZXJfcGFyYW1zLT5wY21fd2xlbmd0aCA9PSAyKQotICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnBjbV9mbXQgPSBMREFDQlRfU01QTF9GTVRfUzE2OwotICBlbHNlIGlmIChwX2VuY29kZXJfcGFyYW1zLT5wY21fd2xlbmd0aCA9PSAzKQotICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnBjbV9mbXQgPSBMREFDQlRfU01QTF9GTVRfUzI0OwotICBlbHNlIGlmIChwX2VuY29kZXJfcGFyYW1zLT5wY21fd2xlbmd0aCA9PSA0KQotICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnBjbV9mbXQgPSBMREFDQlRfU01QTF9GTVRfUzMyOwotCi0gIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyYgcGVlcl9wYXJhbXMgPQotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IucGVlcl9wYXJhbXM7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLlR4QWFNdHVTaXplID0gYWRqdXN0X2VmZmVjdGl2ZV9tdHUocGVlcl9wYXJhbXMpOwotICBMT0dfSU5GTygiJXM6IE1UVT0lZCwgcGVlcl9tdHU9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuVHhBYU10dVNpemUsIHBlZXJfcGFyYW1zLnBlZXJfbXR1KTsKLSAgTE9HX0lORk8oCi0gICAgICAiJXM6IHNhbXBsZV9yYXRlOiAlZCBjaGFubmVsX21vZGU6ICVkICIKLSAgICAgICJxdWFsaXR5X21vZGVfaW5kZXg6ICVkIHBjbV93bGVuZ3RoOiAlZCBwY21fZm10OiAlZCIsCi0gICAgICBfX2Z1bmNfXywgcF9lbmNvZGVyX3BhcmFtcy0+c2FtcGxlX3JhdGUsIHBfZW5jb2Rlcl9wYXJhbXMtPmNoYW5uZWxfbW9kZSwKLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnF1YWxpdHlfbW9kZV9pbmRleCwgcF9lbmNvZGVyX3BhcmFtcy0+cGNtX3dsZW5ndGgsCi0gICAgICBwX2VuY29kZXJfcGFyYW1zLT5wY21fZm10KTsKLQotICAvLyBJbml0aWFsaXplIHRoZSBlbmNvZGVyLgotICAvLyBOT1RFOiBNVFUgaW4gdGhlIGluaXRpYWxpemF0aW9uIG11c3QgaW5jbHVkZSB0aGUgQVZEVCBtZWRpYSBoZWFkZXIgc2l6ZS4KLSAgaW50IHJlc3VsdCA9IGxkYWNfaW5pdF9oYW5kbGVfZW5jb2RlX2Z1bmMoCi0gICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2hhbmRsZSwKLSAgICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLlR4QWFNdHVTaXplICsgQVZEVF9NRURJQV9IRFJfU0laRSwgbGRhY19lcW1pZCwKLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPmNoYW5uZWxfbW9kZSwgcF9lbmNvZGVyX3BhcmFtcy0+cGNtX2ZtdCwKLSAgICAgIHBfZW5jb2Rlcl9wYXJhbXMtPnNhbXBsZV9yYXRlKTsKLSAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgaW50IGVycl9jb2RlID0gbGRhY19nZXRfZXJyb3JfY29kZV9mdW5jKGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfaGFuZGxlKTsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICIlczogZXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBMREFDIGVuY29kZXI6ICVkIGFwaV9lcnJvciA9ICVkICIKLSAgICAgICAgImhhbmRsZV9lcnJvciA9ICVkIGJsb2NrX2Vycm9yID0gJWQgZXJyb3JfY29kZSA9IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCBMREFDQlRfQVBJX0VSUihlcnJfY29kZSksIExEQUNCVF9IQU5ETEVfRVJSKGVycl9jb2RlKSwKLSAgICAgICAgTERBQ0JUX0JMT0NLX0VSUihlcnJfY29kZSksIGVycl9jb2RlKTsKLSAgfQotfQotCi12b2lkIGEyZHBfdmVuZG9yX2xkYWNfZW5jb2Rlcl9jbGVhbnVwKHZvaWQpIHsKLSAgaWYgKGEyZHBfbGRhY19lbmNvZGVyX2NiLmhhc19sZGFjX2Ficl9oYW5kbGUpCi0gICAgYTJkcF9sZGFjX2Ficl9mcmVlX2hhbmRsZShhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2Ficl9oYW5kbGUpOwotICBpZiAoYTJkcF9sZGFjX2VuY29kZXJfY2IuaGFzX2xkYWNfaGFuZGxlKQotICAgIGxkYWNfZnJlZV9oYW5kbGVfZnVuYyhhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2hhbmRsZSk7Ci0gIG1lbXNldCgmYTJkcF9sZGFjX2VuY29kZXJfY2IsIDAsIHNpemVvZihhMmRwX2xkYWNfZW5jb2Rlcl9jYikpOwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2xkYWNfZmVlZGluZ19yZXNldCh2b2lkKSB7Ci0gIC8qIEJ5IGRlZmF1bHQsIGp1c3QgY2xlYXIgdGhlIGVudGlyZSBzdGF0ZSAqLwotICBtZW1zZXQoJmEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfZmVlZGluZ19zdGF0ZSwgMCwKLSAgICAgICAgIHNpemVvZihhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUpKTsKLQotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUuYnl0ZXNfcGVyX3RpY2sgPQotICAgICAgKGEyZHBfbGRhY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLnNhbXBsZV9yYXRlICoKLSAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUgLyA4ICoKLSAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5jaGFubmVsX2NvdW50ICoKLSAgICAgICBBMkRQX0xEQUNfRU5DT0RFUl9JTlRFUlZBTF9NUykgLwotICAgICAgMTAwMDsKLQotICBMT0dfSU5GTygiJXM6IFBDTSBieXRlcyBwZXIgdGljayAldSIsIF9fZnVuY19fLAotICAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUuYnl0ZXNfcGVyX3RpY2spOwotfQotCi12b2lkIGEyZHBfdmVuZG9yX2xkYWNfZmVlZGluZ19mbHVzaCh2b2lkKSB7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfZmVlZGluZ19zdGF0ZS5jb3VudGVyID0gMC4wZjsKLX0KLQotdWludDY0X3QgYTJkcF92ZW5kb3JfbGRhY19nZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcyh2b2lkKSB7Ci0gIHJldHVybiBBMkRQX0xEQUNfRU5DT0RFUl9JTlRFUlZBTF9NUzsKLX0KLQotaW50IGEyZHBfdmVuZG9yX2xkYWNfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCkgewotICByZXR1cm4gYTJkcF9sZGFjX2VuY29kZXJfY2IuVHhBYU10dVNpemU7Ci19Ci0KLXZvaWQgYTJkcF92ZW5kb3JfbGRhY19zZW5kX2ZyYW1lcyh1aW50NjRfdCB0aW1lc3RhbXBfdXMpIHsKLSAgdWludDhfdCBuYl9mcmFtZSA9IDA7Ci0gIHVpbnQ4X3QgbmJfaXRlcmF0aW9ucyA9IDA7Ci0KLSAgYTJkcF9sZGFjX2dldF9udW1fZnJhbWVfaXRlcmF0aW9uKCZuYl9pdGVyYXRpb25zLCAmbmJfZnJhbWUsIHRpbWVzdGFtcF91cyk7Ci0gIExPR19WRVJCT1NFKCIlczogU2VuZGluZyAlZCBmcmFtZXMgcGVyIGl0ZXJhdGlvbiwgJWQgaXRlcmF0aW9ucyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBuYl9mcmFtZSwgbmJfaXRlcmF0aW9ucyk7Ci0gIGlmIChuYl9mcmFtZSA9PSAwKSByZXR1cm47Ci0KLSAgZm9yICh1aW50OF90IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbmJfaXRlcmF0aW9uczsgY291bnRlcisrKSB7Ci0gICAgaWYgKGEyZHBfbGRhY19lbmNvZGVyX2NiLmhhc19sZGFjX2Ficl9oYW5kbGUpIHsKLSAgICAgIGludCBmbGFnX2VuYWJsZSA9IDE7Ci0gICAgICBpbnQgcHJldl9lcW1pZCA9IGEyZHBfbGRhY19lbmNvZGVyX2NiLmxhc3RfbGRhY19hYnJfZXFtaWQ7Ci0gICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sYXN0X2xkYWNfYWJyX2VxbWlkID0KLSAgICAgICAgICBhMmRwX2xkYWNfYWJyX3Byb2MoYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfYWJyX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuVHhRdWV1ZUxlbmd0aCwgZmxhZ19lbmFibGUpOwotICAgICAgaWYgKHByZXZfZXFtaWQgIT0gYTJkcF9sZGFjX2VuY29kZXJfY2IubGFzdF9sZGFjX2Ficl9lcW1pZCkKLSAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19hYnJfYWRqdXN0bWVudHMrKzsKLSNpZm5kZWYgT1NfR0VORVJJQwotICAgICAgQVRSQUNFX0lOVCgiTERBQyBBQlIgbGV2ZWwiLCBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sYXN0X2xkYWNfYWJyX2VxbWlkKTsKLSNlbmRpZgotICAgIH0KLSAgICAvLyBUcmFuc2NvZGUgZnJhbWUgYW5kIGVucXVldWUKLSAgICBhMmRwX2xkYWNfZW5jb2RlX2ZyYW1lcyhuYl9mcmFtZSk7Ci0gIH0KLX0KLQotLy8gT2J0YWlucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBzZW5kIGFuZCBudW1iZXIgb2YgaXRlcmF0aW9ucwotLy8gdG8gYmUgdXNlZC4gfG51bV9vZl9pdGVyYXRpb25zfCBhbmQgfG51bV9vZl9mcmFtZXN8IHBhcmFtZXRlcnMKLS8vIGFyZSB1c2VkIGFzIG91dHB1dCBwYXJhbSBmb3IgcmV0dXJuaW5nIHRoZSByZXNwZWN0aXZlIHZhbHVlcy4KLXN0YXRpYyB2b2lkIGEyZHBfbGRhY19nZXRfbnVtX2ZyYW1lX2l0ZXJhdGlvbih1aW50OF90KiBudW1fb2ZfaXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBudW1fb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcF91cykgewotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICB1aW50OF90IG5vZiA9IDA7Ci0gIHVpbnQ4X3Qgbm9pID0gMTsKLQotICB1aW50MzJfdCBwY21fYnl0ZXNfcGVyX2ZyYW1lID0KLSAgICAgIEEyRFBfTERBQ19NRURJQV9CWVRFU19QRVJfRlJBTUUgKgotICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuY2hhbm5lbF9jb3VudCAqCi0gICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5iaXRzX3Blcl9zYW1wbGUgLyA4OwotICBMT0dfVkVSQk9TRSgiJXM6IHBjbV9ieXRlc19wZXJfZnJhbWUgJXUiLCBfX2Z1bmNfXywgcGNtX2J5dGVzX3Blcl9mcmFtZSk7Ci0KLSAgdWludDMyX3QgdXNfdGhpc190aWNrID0gQTJEUF9MREFDX0VOQ09ERVJfSU5URVJWQUxfTVMgKiAxMDAwOwotICB1aW50NjRfdCBub3dfdXMgPSB0aW1lc3RhbXBfdXM7Ci0gIGlmIChhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUubGFzdF9mcmFtZV91cyAhPSAwKQotICAgIHVzX3RoaXNfdGljayA9Ci0gICAgICAgIChub3dfdXMgLSBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUubGFzdF9mcmFtZV91cyk7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfZmVlZGluZ19zdGF0ZS5sYXN0X2ZyYW1lX3VzID0gbm93X3VzOwotCi0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfZmVlZGluZ19zdGF0ZS5jb3VudGVyICs9Ci0gICAgICAoZmxvYXQpYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19mZWVkaW5nX3N0YXRlLmJ5dGVzX3Blcl90aWNrICogdXNfdGhpc190aWNrIC8KLSAgICAgIChBMkRQX0xEQUNfRU5DT0RFUl9JTlRFUlZBTF9NUyAqIDEwMDApOwotCi0gIHJlc3VsdCA9Ci0gICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUuY291bnRlciAvIHBjbV9ieXRlc19wZXJfZnJhbWU7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLmxkYWNfZmVlZGluZ19zdGF0ZS5jb3VudGVyIC09Ci0gICAgICByZXN1bHQgKiBwY21fYnl0ZXNfcGVyX2ZyYW1lOwotICBub2YgPSByZXN1bHQ7Ci0KLSAgTE9HX1ZFUkJPU0UoIiVzOiBlZmZlY3RpdmUgbnVtIG9mIGZyYW1lcyAldSwgaXRlcmF0aW9ucyAldSIsIF9fZnVuY19fLCBub2YsCi0gICAgICAgICAgICAgIG5vaSk7Ci0KLSAgKm51bV9vZl9mcmFtZXMgPSBub2Y7Ci0gICpudW1fb2ZfaXRlcmF0aW9ucyA9IG5vaTsKLX0KLQotc3RhdGljIHZvaWQgYTJkcF9sZGFjX2VuY29kZV9mcmFtZXModWludDhfdCBuYl9mcmFtZSkgewotICB0QTJEUF9MREFDX0VOQ09ERVJfUEFSQU1TKiBwX2VuY29kZXJfcGFyYW1zID0KLSAgICAgICZhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2VuY29kZXJfcGFyYW1zOwotICB1aW50OF90IHJlbWFpbl9uYl9mcmFtZSA9IG5iX2ZyYW1lOwotICB1aW50MTZfdCBsZGFjX2ZyYW1lX3NpemU7Ci0gIHVpbnQ4X3QgcmVhZF9idWZmZXJbTERBQ0JUX01BWF9MU1UgKiA0IC8qIGJ5dGUvc2FtcGxlICovICogMiAvKiBjaCAqL107Ci0KLSAgc3dpdGNoIChwX2VuY29kZXJfcGFyYW1zLT5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgMTc2NDAwOgotICAgIGNhc2UgMTkyMDAwOgotICAgICAgbGRhY19mcmFtZV9zaXplID0gNTEyOyAgLy8gc2FtcGxlL2NoCi0gICAgICBicmVhazsKLSAgICBjYXNlIDg4MjAwOgotICAgIGNhc2UgOTYwMDA6Ci0gICAgICBsZGFjX2ZyYW1lX3NpemUgPSAyNTY7ICAvLyBzYW1wbGUvY2gKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgY2FzZSA0ODAwMDoKLSAgICBkZWZhdWx0OgotICAgICAgbGRhY19mcmFtZV9zaXplID0gMTI4OyAgLy8gc2FtcGxlL2NoCi0gICAgICBicmVhazsKLSAgfQotCi0gIHVpbnQzMl90IGNvdW50OwotICBpbnQzMl90IGVuY29kZV9jb3VudCA9IDA7Ci0gIGludDMyX3Qgb3V0X2ZyYW1lcyA9IDA7Ci0gIGludCB3cml0dGVuID0gMDsKLQotICB1aW50MzJfdCBieXRlc19yZWFkID0gMDsKLSAgd2hpbGUgKG5iX2ZyYW1lKSB7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0gICAgcF9idWYtPm9mZnNldCA9IEEyRFBfTERBQ19PRkZTRVQ7Ci0gICAgcF9idWYtPmxlbiA9IDA7Ci0gICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gMDsKLSAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3BhY2tldHMrKzsKLQotICAgIGNvdW50ID0gMDsKLSAgICBkbyB7Ci0gICAgICAvLwotICAgICAgLy8gUmVhZCB0aGUgUENNIGRhdGEgYW5kIGVuY29kZSBpdAotICAgICAgLy8KLSAgICAgIHVpbnQzMl90IHRlbXBfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICBpZiAoYTJkcF9sZGFjX3JlYWRfZmVlZGluZyhyZWFkX2J1ZmZlciwgJnRlbXBfYnl0ZXNfcmVhZCkpIHsKLSAgICAgICAgYnl0ZXNfcmVhZCArPSB0ZW1wX2J5dGVzX3JlYWQ7Ci0gICAgICAgIHVpbnQ4X3QqIHBhY2tldCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQgKyBwX2J1Zi0+bGVuOwotICAgICAgICBpZiAoYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19oYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAgIExPR19FUlJPUigiJXM6IGludmFsaWQgTERBQyBoYW5kbGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2Iuc3RhdHMubWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHMrKzsKLSAgICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCByZXN1bHQgPSBsZGFjX2VuY29kZV9mdW5jKAotICAgICAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGRhY19oYW5kbGUsIHJlYWRfYnVmZmVyLCAoaW50KikmZW5jb2RlX2NvdW50LAotICAgICAgICAgICAgcGFja2V0ICsgY291bnQsIChpbnQqKSZ3cml0dGVuLCAoaW50Kikmb3V0X2ZyYW1lcyk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gMCkgewotICAgICAgICAgIGludCBlcnJfY29kZSA9Ci0gICAgICAgICAgICAgIGxkYWNfZ2V0X2Vycm9yX2NvZGVfZnVuYyhhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2hhbmRsZSk7Ci0gICAgICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICAgICAiJXM6IExEQUMgZW5jb2RpbmcgZXJyb3I6ICVkIGFwaV9lcnJvciA9ICVkICIKLSAgICAgICAgICAgICAgImhhbmRsZV9lcnJvciA9ICVkIGJsb2NrX2Vycm9yID0gJWQgZXJyb3JfY29kZSA9IDB4JXgiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCBMREFDQlRfQVBJX0VSUihlcnJfY29kZSksCi0gICAgICAgICAgICAgIExEQUNCVF9IQU5ETEVfRVJSKGVycl9jb2RlKSwgTERBQ0JUX0JMT0NLX0VSUihlcnJfY29kZSksCi0gICAgICAgICAgICAgIGVycl9jb2RlKTsKLSAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cysrOwotICAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKz0gd3JpdHRlbjsKLSAgICAgICAgcF9idWYtPmxlbiArPSB3cml0dGVuOwotICAgICAgICBuYl9mcmFtZS0tOwotICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgKz0gb3V0X2ZyYW1lczsgIC8vIGFkZGVkIGEgZnJhbWUgdG8gdGhlIGJ1ZmZlcgotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX1dBUk4oIiVzOiB1bmRlcmZsb3cgJWQiLCBfX2Z1bmNfXywgbmJfZnJhbWUpOwotICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2ZlZWRpbmdfc3RhdGUuY291bnRlciArPQotICAgICAgICAgICAgbmJfZnJhbWUgKiBMREFDQlRfRU5DX0xTVSAqCi0gICAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5jaGFubmVsX2NvdW50ICoKLSAgICAgICAgICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLmZlZWRpbmdfcGFyYW1zLmJpdHNfcGVyX3NhbXBsZSAvIDg7Ci0KLSAgICAgICAgLy8gbm8gbW9yZSBwY20gdG8gcmVhZAotICAgICAgICBuYl9mcmFtZSA9IDA7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoKHdyaXR0ZW4gPT0gMCkgJiYgbmJfZnJhbWUpOwotCi0gICAgaWYgKHBfYnVmLT5sZW4pIHsKLSAgICAgIC8qCi0gICAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIG1lZGlhIHBhY2tldCBoZWFkZXIgcmVwcmVzZW50IHRoZSBUUyBvZiB0aGUKLSAgICAgICAqIGZpcnN0IGZyYW1lLCBpLmUgdGhlIHRpbWVzdGFtcCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZnJhbWUuCi0gICAgICAgKi8KLSAgICAgICooKHVpbnQzMl90KikocF9idWYgKyAxKSkgPSBhMmRwX2xkYWNfZW5jb2Rlcl9jYi50aW1lc3RhbXA7Ci0KLSAgICAgIGEyZHBfbGRhY19lbmNvZGVyX2NiLnRpbWVzdGFtcCArPSBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgKiBsZGFjX2ZyYW1lX3NpemU7Ci0KLSAgICAgIHVpbnQ4X3QgZG9uZV9uYl9mcmFtZSA9IHJlbWFpbl9uYl9mcmFtZSAtIG5iX2ZyYW1lOwotICAgICAgcmVtYWluX25iX2ZyYW1lID0gbmJfZnJhbWU7Ci0gICAgICBpZiAoIWEyZHBfbGRhY19lbmNvZGVyX2NiLmVucXVldWVfY2FsbGJhY2socF9idWYsIGRvbmVfbmJfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTk9URTogVW5saWtlIHRoZSBleGVjdXRpb24gcGF0aCBmb3Igb3RoZXIgY29kZWNzLCBpdCBpcyBub3JtYWwgZm9yCi0gICAgICAvLyBMREFDIHRvIE5PVCB3cml0ZSBlbmNvZGVkIGRhdGEgdG8gdGhlIGxhc3QgYnVmZmVyIGlmIHRoZXJlIHdhc24ndAotICAgICAgLy8gZW5vdWdoIGRhdGEgdG8gd3JpdGUgdG8uIFRoYXQgZGF0YSBpcyBhY2N1bXVsYXRlZCBpbnRlcm5hbGx5IGJ5Ci0gICAgICAvLyB0aGUgY29kZWMgYW5kIGluY2x1ZGVkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbi4gVGhlcmVmb3JlLCBoZXJlIHdlCi0gICAgICAvLyBkb24ndCBpbmNyZW1lbnQgdGhlICJtZWRpYV9yZWFkX3RvdGFsX2Ryb3BwZWRfcGFja2V0cyIgY291bnRlci4KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgYTJkcF9sZGFjX3JlYWRfZmVlZGluZyh1aW50OF90KiByZWFkX2J1ZmZlciwgdWludDMyX3QqIGJ5dGVzX3JlYWQpIHsKLSAgdWludDMyX3QgcmVhZF9zaXplID0gTERBQ0JUX0VOQ19MU1UgKgotICAgICAgICAgICAgICAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5mZWVkaW5nX3BhcmFtcy5jaGFubmVsX2NvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IuZmVlZGluZ19wYXJhbXMuYml0c19wZXJfc2FtcGxlIC8gODsKLQotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRzX2NvdW50Kys7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX2NiLnN0YXRzLm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZF9ieXRlcyArPSByZWFkX3NpemU7Ci0KLSAgLyogUmVhZCBEYXRhIGZyb20gVUlQQyBjaGFubmVsICovCi0gIHVpbnQzMl90IG5iX2J5dGVfcmVhZCA9Ci0gICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5yZWFkX2NhbGxiYWNrKHJlYWRfYnVmZmVyLCByZWFkX3NpemUpOwotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkX2J5dGVzICs9IG5iX2J5dGVfcmVhZDsKLQotICBpZiAobmJfYnl0ZV9yZWFkIDwgcmVhZF9zaXplKSB7Ci0gICAgaWYgKG5iX2J5dGVfcmVhZCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBGaWxsIHRoZSB1bmZpbGxlZCBwYXJ0IG9mIHRoZSByZWFkIGJ1ZmZlciB3aXRoIHNpbGVuY2UgKDApICovCi0gICAgbWVtc2V0KCgodWludDhfdCopcmVhZF9idWZmZXIpICsgbmJfYnl0ZV9yZWFkLCAwLCByZWFkX3NpemUgLSBuYl9ieXRlX3JlYWQpOwotICAgIG5iX2J5dGVfcmVhZCA9IHJlYWRfc2l6ZTsKLSAgfQotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5zdGF0cy5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkc19jb3VudCsrOwotCi0gICpieXRlc19yZWFkID0gbmJfYnl0ZV9yZWFkOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHVpbnQxNl90IGFkanVzdF9lZmZlY3RpdmVfbXR1KAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyYgcGVlcl9wYXJhbXMpIHsKLSAgdWludDE2X3QgbXR1X3NpemUgPQotICAgICAgQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIEEyRFBfTERBQ19PRkZTRVQgLSBzaXplb2YoQlRfSERSKTsKLSAgaWYgKG10dV9zaXplID4gcGVlcl9wYXJhbXMucGVlcl9tdHUpIHsKLSAgICBtdHVfc2l6ZSA9IHBlZXJfcGFyYW1zLnBlZXJfbXR1OwotICB9Ci0gIExPR19WRVJCT1NFKCIlczogb3JpZ2luYWwgQVZEVFAgTVRVIHNpemU6ICVkIiwgX19mdW5jX18sIG10dV9zaXplKTsKLSAgcmV0dXJuIG10dV9zaXplOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgcXVhbGl0eV9tb2RlX2luZGV4X3RvX25hbWUoaW50IHF1YWxpdHlfbW9kZV9pbmRleCkgewotICBzd2l0Y2ggKHF1YWxpdHlfbW9kZV9pbmRleCkgewotICAgIGNhc2UgQTJEUF9MREFDX1FVQUxJVFlfSElHSDoKLSAgICAgIHJldHVybiAiSElHSCI7Ci0gICAgY2FzZSBBMkRQX0xEQUNfUVVBTElUWV9NSUQ6Ci0gICAgICByZXR1cm4gIk1JRCI7Ci0gICAgY2FzZSBBMkRQX0xEQUNfUVVBTElUWV9MT1c6Ci0gICAgICByZXR1cm4gIkxPVyI7Ci0gICAgY2FzZSBBMkRQX0xEQUNfUVVBTElUWV9BQlI6Ci0gICAgICByZXR1cm4gIkFCUiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biI7Ci0gIH0KLX0KLQotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX3NldF90cmFuc21pdF9xdWV1ZV9sZW5ndGgoc2l6ZV90IHRyYW5zbWl0X3F1ZXVlX2xlbmd0aCkgewotICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5UeFF1ZXVlTGVuZ3RoID0gdHJhbnNtaXRfcXVldWVfbGVuZ3RoOwotfQotCi12b2lkIEEyZHBDb2RlY0NvbmZpZ0xkYWNTb3VyY2U6OmRlYnVnX2NvZGVjX2R1bXAoaW50IGZkKSB7Ci0gIGEyZHBfbGRhY19lbmNvZGVyX3N0YXRzX3QqIHN0YXRzID0gJmEyZHBfbGRhY19lbmNvZGVyX2NiLnN0YXRzOwotICB0QTJEUF9MREFDX0VOQ09ERVJfUEFSQU1TKiBwX2VuY29kZXJfcGFyYW1zID0KLSAgICAgICZhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2VuY29kZXJfcGFyYW1zOwotCi0gIEEyZHBDb2RlY0NvbmZpZzo6ZGVidWdfY29kZWNfZHVtcChmZCk7Ci0KLSAgZHByaW50ZigKLSAgICAgIGZkLCAiICBMREFDIHF1YWxpdHkgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJXNcbiIsCi0gICAgICBxdWFsaXR5X21vZGVfaW5kZXhfdG9fbmFtZShwX2VuY29kZXJfcGFyYW1zLT5xdWFsaXR5X21vZGVfaW5kZXgpLmNfc3RyKCkpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgTERBQyB0cmFuc21pc3Npb24gYml0cmF0ZSAoS2JwcykgICAgICAgICAgICAgICAgICAgICAgICA6ICVkXG4iLAotICAgICAgICAgIGxkYWNfZ2V0X2JpdHJhdGVfZnVuYyhhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2hhbmRsZSkpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgTERBQyBzYXZlZCB0cmFuc21pdCBxdWV1ZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICA6ICV6dVxuIiwKLSAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5UeFF1ZXVlTGVuZ3RoKTsKLSAgaWYgKGEyZHBfbGRhY19lbmNvZGVyX2NiLmhhc19sZGFjX2Ficl9oYW5kbGUpIHsKLSAgICBkcHJpbnRmKGZkLAotICAgICAgICAgICAgIiAgTERBQyBhZGFwdGl2ZSBiaXQgcmF0ZSBlbmNvZGUgcXVhbGl0eSBtb2RlIGluZGV4ICAgICAgICA6ICVkXG4iLAotICAgICAgICAgICAgYTJkcF9sZGFjX2VuY29kZXJfY2IubGFzdF9sZGFjX2Ficl9lcW1pZCk7Ci0gICAgZHByaW50ZihmZCwKLSAgICAgICAgICAgICIgIExEQUMgYWRhcHRpdmUgYml0IHJhdGUgYWRqdXN0bWVudHMgICAgICAgICAgICAgICAgICAgICAgOiAlenVcbiIsCi0gICAgICAgICAgICBhMmRwX2xkYWNfZW5jb2Rlcl9jYi5sZGFjX2Ficl9hZGp1c3RtZW50cyk7Ci0gIH0KLSAgZHByaW50ZihmZCwgIiAgRW5jb2RlciBpbnRlcnZhbCAobXMpOiAlIiBQUkl1NjQgIlxuIiwKLSAgICAgICAgICBhMmRwX3ZlbmRvcl9sZGFjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKCkpOwotICBkcHJpbnRmKGZkLCAiICBFZmZlY3RpdmUgTVRVOiAlZFxuIiwKLSAgICAgICAgICBhMmRwX3ZlbmRvcl9sZGFjX2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSgpKTsKLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBQYWNrZXQgY291bnRzIChleHBlY3RlZC9kcm9wcGVkKSAgICAgICAgICAgICAgICAgICAgICAgIDogJXp1IC8gIgotICAgICAgICAgICIlenVcbiIsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcGFja2V0cywKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9kcm9wcGVkX3BhY2tldHMpOwotCi0gIGRwcmludGYoZmQsCi0gICAgICAgICAgIiAgUENNIHJlYWQgY291bnRzIChleHBlY3RlZC9hY3R1YWwpICAgICAgICAgICAgICAgICAgICAgICA6ICV6dSAvICIKLSAgICAgICAgICAiJXp1XG4iLAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2V4cGVjdGVkX3JlYWRzX2NvdW50LAotICAgICAgICAgIHN0YXRzLT5tZWRpYV9yZWFkX3RvdGFsX2FjdHVhbF9yZWFkc19jb3VudCk7Ci0KLSAgZHByaW50ZihmZCwKLSAgICAgICAgICAiICBQQ00gcmVhZCBieXRlcyAoZXhwZWN0ZWQvYWN0dWFsKSAgICAgICAgICAgICAgICAgICAgICAgIDogJXp1IC8gIgotICAgICAgICAgICIlenVcbiIsCi0gICAgICAgICAgc3RhdHMtPm1lZGlhX3JlYWRfdG90YWxfZXhwZWN0ZWRfcmVhZF9ieXRlcywKLSAgICAgICAgICBzdGF0cy0+bWVkaWFfcmVhZF90b3RhbF9hY3R1YWxfcmVhZF9ieXRlcyk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hY2wvYWNsLmNjIGIvc3RhY2svYWNsL2FjbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjYTA2Ny4uMDAwMDAwMAotLS0gYS9zdGFjay9hY2wvYWNsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2FjbC9hY2wuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIHRBQ0xfQ09OTjo6UmVzZXQoKSB7Ci0gIG1lbXNldChwZWVyX2xlX2ZlYXR1cmVzLCAwLCBzaXplb2YocGVlcl9sZV9mZWF0dXJlcykpOwotICBwZWVyX2xlX2ZlYXR1cmVzX3ZhbGlkID0gZmFsc2U7Ci0gIG1lbXNldChwZWVyX2xtcF9mZWF0dXJlX3BhZ2VzLCAwLCBzaXplb2YocGVlcl9sbXBfZmVhdHVyZV9wYWdlcykpOwotICBtZW1zZXQocGVlcl9sbXBfZmVhdHVyZV92YWxpZCwgMCwgc2l6ZW9mKHBlZXJfbG1wX2ZlYXR1cmVfdmFsaWQpKTsKLSAgYWN0aXZlX3JlbW90ZV9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBjb25uX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIHJlbW90ZV9hZGRyID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBsaW5rX3VwX2lzc3VlZCA9IGZhbHNlOwotICB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfQVVUTzsKLSAgZmx1c2hfdGltZW91dF9pbl90aWNrcyA9IDA7Ci0gIGhjaV9oYW5kbGUgPSAwOwotICBsaW5rX3N1cGVyX3RvdXQgPSAwOwotICBwa3RfdHlwZXNfbWFzayA9IDA7Ci0gIGFjdGl2ZV9yZW1vdGVfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICBjb25uX2FkZHJfdHlwZSA9IEJMRV9BRERSX1BVQkxJQzsKLSAgZGlzY29ubmVjdF9yZWFzb24gPSAwOwotICBlbmNyeXB0X3N0YXRlXyA9IEJUTV9BQ0xfRU5DUllQVF9TVEFURV9JRExFOwotICBpc19lbmNyeXB0ZWQgPSBmYWxzZTsKLSAgbGlua19yb2xlID0gSENJX1JPTEVfQ0VOVFJBTDsKLSAgc3dpdGNoX3JvbGVfZmFpbGVkX2F0dGVtcHRzID0gMDsKLSAgbWVtc2V0KCZyZW1vdGVfdmVyc2lvbl9pbmZvLCAwLCBzaXplb2YocmVtb3RlX3ZlcnNpb25faW5mbykpOwotICByc19kaXNjX3BlbmRpbmcgPSBCVE1fU0VDX1JTX05PVF9QRU5ESU5HOwotICBzd2l0Y2hfcm9sZV9zdGF0ZV8gPSBCVE1fQUNMX1NXS0VZX1NUQVRFX0lETEU7Ci0gIHNjYSA9IDA7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hY2wvYWNsLmggYi9zdGFjay9hY2wvYWNsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMTRjZGEuLjAwMDAwMDAKLS0tIGEvc3RhY2svYWNsL2FjbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFjay9hY2wvcGVlcl9wYWNrZXRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2ltc2dzLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1lbnVtIGJ0bV9hY2xfZW5jcnlwdF9zdGF0ZV90IHsKLSAgQlRNX0FDTF9FTkNSWVBUX1NUQVRFX0lETEUgPSAwLAotICBCVE1fQUNMX0VOQ1JZUFRfU1RBVEVfRU5DUllQVF9PRkYgPSAxLAotICBCVE1fQUNMX0VOQ1JZUFRfU1RBVEVfVEVNUF9GVU5DID0gMiwKLSAgQlRNX0FDTF9FTkNSWVBUX1NUQVRFX0VOQ1JZUFRfT04gPSAzLAotfTsKLQotZW51bSBidG1fYWNsX3N3a2V5X3N0YXRlX3QgewotICBCVE1fQUNMX1NXS0VZX1NUQVRFX0lETEUgPSAwLAotICBCVE1fQUNMX1NXS0VZX1NUQVRFX01PREVfQ0hBTkdFID0gMSwKLSAgQlRNX0FDTF9TV0tFWV9TVEFURV9FTkNSWVBUSU9OX09GRiA9IDIsCi0gIEJUTV9BQ0xfU1dLRVlfU1RBVEVfU1dJVENISU5HID0gMywKLSAgQlRNX0FDTF9TV0tFWV9TVEFURV9FTkNSWVBUSU9OX09OID0gNCwKLSAgQlRNX0FDTF9TV0tFWV9TVEFURV9JTl9QUk9HUkVTUyA9IDUsCi19OwotCi0vKiBQb2xpY3kgc2V0dGluZ3Mgc3RhdHVzICovCi10eXBlZGVmIGVudW0gOiB1aW50MTZfdCB7Ci0gIEhDSV9ESVNBQkxFX0FMTF9MTV9NT0RFUyA9IDAsCi0gIEhDSV9FTkFCTEVfQ0VOVFJBTF9QRVJJUEhFUkFMX1NXSVRDSCA9ICgxdSA8PCAwKSwKLSAgSENJX0VOQUJMRV9IT0xEX01PREUgPSAoMXUgPDwgMSksCi0gIEhDSV9FTkFCTEVfU05JRkZfTU9ERSA9ICgxdSA8PCAyKSwKLSAgSENJX0VOQUJMRV9QQVJLX01PREUgPSAoMXUgPDwgMyksCi19IHRMSU5LX1BPTElDWV9CSVRNQVNLOwotdHlwZWRlZiB1aW50MTZfdCB0TElOS19QT0xJQ1k7Ci0KLWNvbnN0ZXhwciB0TElOS19QT0xJQ1kga0FsbExpbmtQb2xpY2llc0VuYWJsZWQgPQotICAgIChIQ0lfRU5BQkxFX0NFTlRSQUxfUEVSSVBIRVJBTF9TV0lUQ0ggfCBIQ0lfRU5BQkxFX0hPTERfTU9ERSB8Ci0gICAgIEhDSV9FTkFCTEVfU05JRkZfTU9ERSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBsaW5rX3BvbGljeV9zdHJpbmdbXSA9IHsKLSAgICAiIHJvbGVfc3dpdGNoICIsCi0gICAgIiBob2xkX21vZGUgIiwKLSAgICAiIHNuaWZmX21vZGUgIiwKLSAgICAiIHBhcmtfbW9kZSAiLAotfTsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGxpbmtfcG9saWN5X3RleHQodExJTktfUE9MSUNZIHBvbGljeSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7Ci0gIG9zIDw8ICIweCIgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQxNl90Pihwb2xpY3kpKSA8PCAiIDoiOwotICBzdGQ6OnN0cmluZyBzID0gb3Muc3RyKCk7Ci0gIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICBpZiAocG9saWN5ICYgKDB4MSA8PCBpKSkgcyArPSBsaW5rX3BvbGljeV9zdHJpbmdbaV07Ci0gIH0KLSAgcmV0dXJuIHM7Ci19Ci0KLS8vIFBvd2VyIG1vZGUgc3RhdGVzLgotLy8gVXNlZCBhcyBib3RoIHZhbHVlIGFuZCBiaXRtYXNrCi1lbnVtIDogdWludDhfdCB7Ci0gIEJUTV9QTV9TVF9BQ1RJVkUgPSBIQ0lfTU9ERV9BQ1RJVkUsICAgICAgLy8gMHgwMAotICBCVE1fUE1fU1RfSE9MRCA9IEhDSV9NT0RFX0hPTEQsICAgICAgICAgIC8vIDB4MDEKLSAgQlRNX1BNX1NUX1NOSUZGID0gSENJX01PREVfU05JRkYsICAgICAgICAvLyAweDAyCi0gIEJUTV9QTV9TVF9QQVJLID0gSENJX01PREVfUEFSSywgICAgICAgICAgLy8gMHgwMwotICBCVE1fUE1fU1RfVU5VU0VELCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDQKLSAgQlRNX1BNX1NUX1BFTkRJTkcgPSBCVE1fUE1fU1RTX1BFTkRJTkcsICAvLyAweDA1Ci0gIEJUTV9QTV9TVF9JTlZBTElEID0gMHg3RiwKLSAgQlRNX1BNX1NUT1JFRF9NQVNLID0gMHg4MCwgLyogc2V0IHRoaXMgbWFzayBpZiB0aGUgY29tbWFuZCBpcyBzdG9yZWQgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUTV9QTV9TVEFURTsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIHBvd2VyX21vZGVfc3RhdGVfdGV4dCh0QlRNX1BNX1NUQVRFIHN0YXRlKSB7Ci0gIHN0ZDo6c3RyaW5nIHMgPQotICAgICAgc3RkOjpzdHJpbmcoKHN0YXRlICYgQlRNX1BNX1NUT1JFRF9NQVNLKSA/ICJzdG9yZWQ6IiA6ICJpbW1lZGlhdGU6Iik7Ci0gIHN3aXRjaCAoc3RhdGUgJiB+QlRNX1BNX1NUT1JFRF9NQVNLKSB7Ci0gICAgY2FzZSBCVE1fUE1fU1RfQUNUSVZFOgotICAgICAgcmV0dXJuIHMgKyBzdGQ6OnN0cmluZygiYWN0aXZlIik7Ci0gICAgY2FzZSBCVE1fUE1fU1RfSE9MRDoKLSAgICAgIHJldHVybiBzICsgc3RkOjpzdHJpbmcoImhvbGQiKTsKLSAgICBjYXNlIEJUTV9QTV9TVF9TTklGRjoKLSAgICAgIHJldHVybiBzICsgc3RkOjpzdHJpbmcoInNuaWZmIik7Ci0gICAgY2FzZSBCVE1fUE1fU1RfUEFSSzoKLSAgICAgIHJldHVybiBzICsgc3RkOjpzdHJpbmcoInBhcmsiKTsKLSAgICBjYXNlIEJUTV9QTV9TVF9VTlVTRUQ6Ci0gICAgICByZXR1cm4gcyArIHN0ZDo6c3RyaW5nKCJXQVJOOlVOVVNFRCIpOwotICAgIGNhc2UgQlRNX1BNX1NUX1BFTkRJTkc6Ci0gICAgICByZXR1cm4gcyArIHN0ZDo6c3RyaW5nKCJwZW5kaW5nIik7Ci0gICAgY2FzZSBCVE1fUE1fU1RfSU5WQUxJRDoKLSAgICAgIHJldHVybiBzICsgc3RkOjpzdHJpbmcoImludmFsaWQiKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHMgKyBzdGQ6OnN0cmluZygiVU5LTk9XTiIpOwotICB9Ci19Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHNoaW0gewotdEJUTV9TVEFUVVMgQlRNX1NldFBvd2VyTW9kZSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IHRCVE1fUE1fUFdSX01EJiBuZXdfbW9kZSk7Ci10QlRNX1NUQVRVUyBCVE1fU2V0U3NyUGFyYW1zKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X2xhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3JtdF90bywgdWludDE2X3QgbWluX2xvY190byk7Ci12b2lkIGJ0bV9wbV9vbl9tb2RlX2NoYW5nZSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfTU9ERSBoY2lfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpOwotdm9pZCBidG1fcG1fb25fc25pZmZfc3VicmF0aW5nKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IG1heF94bWl0X2xhdGVuY3k7Ci0gIHVpbnQxNl90IG1heF9yZWN2X2xhdGVuY3k7Ci0gIHVpbnQxNl90IG1pbl9yZW1vdGVfdGltZW91dDsKLSAgdWludDE2X3QgbWluX2xvY2FsX3RpbWVvdXQ7Ci19IHRTU1JfUEFSQU1TOwotCi0jZGVmaW5lIEJUTV9QTV9SRUNfTk9UX1VTRUQgMAotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX1BNX1NUQVRVU19DQkFDSyogY2JhY2sgPQotICAgICAgbnVsbHB0cjsgICAgICAvKiB0byBub3RpZnkgdGhlIHJlZ2lzdGVyZWQgcGFydHkgb2YgbW9kZSBjaGFuZ2UgZXZlbnQgKi8KLSAgdWludDhfdCBtYXNrID0gMDsgLyogcmVnaXN0ZXJlZCByZXF1ZXN0IG1hc2suIDAsIGlmIHRoaXMgZW50cnkgaXMgbm90IHVzZWQgKi8KLX0gdEJUTV9QTV9SQ0I7Ci0KLS8qIFN0cnVjdHVyZSByZXR1cm5lZCB3aXRoIFJvbGUgU3dpdGNoIGluZm9ybWF0aW9uIChpbiB0QlRNX0NNUExfQ0IgY2FsbGJhY2sKLSAqIGZ1bmN0aW9uKSBpbiByZXNwb25zZSB0byBCVE1fU3dpdGNoUm9sZVRvQ2VudHJhbCBjYWxsLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkX2FkZHI7IC8qIFJlbW90ZSBCRCBhZGRyIGludm9sdmVkIHdpdGggdGhlIHN3aXRjaCAqLwotICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzOyAgICAvKiBIQ0kgc3RhdHVzIHJldHVybmVkIHdpdGggdGhlIGV2ZW50ICovCi0gIHRIQ0lfUk9MRSByb2xlOyAgICAgICAgICAgIC8qIEhDSV9ST0xFX0NFTlRSQUwgb3IgSENJX1JPTEVfUEVSSVBIRVJBTCAqLwotfSB0QlRNX1JPTEVfU1dJVENIX0NNUEw7Ci0KLXN0cnVjdCB0QlRNX1BNX01DQiB7Ci0gIGJvb2wgY2hnX2luZCA9IGZhbHNlOwotICB0QlRNX1BNX1BXUl9NRCByZXFfbW9kZTsKLSAgdEJUTV9QTV9QV1JfTUQgc2V0X21vZGU7Ci0gIHRCVE1fUE1fU1RBVEUgc3RhdGUgPSBCVE1fUE1fU1RfQUNUSVZFOyAgLy8gMAotICB1aW50MTZfdCBpbnRlcnZhbCA9IDA7Ci0gIHVpbnQxNl90IG1heF9sYXQgPSAwOwotICB1aW50MTZfdCBtaW5fbG9jX3RvID0gMDsKLSAgdWludDE2X3QgbWluX3JtdF90byA9IDA7Ci0gIHZvaWQgSW5pdChSYXdBZGRyZXNzIGJkYSwgdWludDE2X3QgaGFuZGxlKSB7Ci0gICAgYmRhXyA9IGJkYTsKLSAgICBoYW5kbGVfID0gaGFuZGxlOwotICB9Ci0gIFJhd0FkZHJlc3MgYmRhXzsKLSAgdWludDE2X3QgaGFuZGxlXzsKLX07Ci0KLXN0cnVjdCB0QUNMX0NPTk4gewotICBCRF9GRUFUVVJFUyBwZWVyX2xlX2ZlYXR1cmVzOwotICBib29sIHBlZXJfbGVfZmVhdHVyZXNfdmFsaWQ7Ci0gIEJEX0ZFQVRVUkVTIHBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbSENJX0VYVF9GRUFUVVJFU19QQUdFX01BWCArIDFdOwotICBib29sIHBlZXJfbG1wX2ZlYXR1cmVfdmFsaWRbSENJX0VYVF9GRUFUVVJFU19QQUdFX01BWCArIDFdOwotCi0gIFJhd0FkZHJlc3MgYWN0aXZlX3JlbW90ZV9hZGRyOwotICB0QkxFX0FERFJfVFlQRSBhY3RpdmVfcmVtb3RlX2FkZHJfdHlwZTsKLSAgUmF3QWRkcmVzcyBjb25uX2FkZHI7Ci0gIHRCTEVfQUREUl9UWVBFIGNvbm5fYWRkcl90eXBlOwotCi0gIFJhd0FkZHJlc3MgcmVtb3RlX2FkZHI7Ci0gIGJvb2wgaW5fdXNle2ZhbHNlfTsKLQotIHB1YmxpYzoKLSAgYm9vbCBJblVzZSgpIGNvbnN0IHsgcmV0dXJuIGluX3VzZTsgfQotICBjb25zdCBSYXdBZGRyZXNzIFJlbW90ZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiByZW1vdGVfYWRkcjsgfQotCi0gIGJvb2wgbGlua191cF9pc3N1ZWQ7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICBib29sIGlzX3RyYW5zcG9ydF9icl9lZHIoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUjsgfQotICBib29sIGlzX3RyYW5zcG9ydF9ibGUoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFOyB9Ci0gIGJvb2wgaXNfdHJhbnNwb3J0X3ZhbGlkKCkgY29uc3QgewotICAgIHJldHVybiBpc190cmFuc3BvcnRfYmxlKCkgfHwgaXNfdHJhbnNwb3J0X2JyX2VkcigpOwotICB9Ci0KLSAgdWludDE2X3QgZmx1c2hfdGltZW91dF9pbl90aWNrczsKLSAgdWludDE2X3QgaGNpX2hhbmRsZTsKLSAgdExJTktfUE9MSUNZIGxpbmtfcG9saWN5OwotCi0gcHVibGljOgotICB1aW50MTZfdCBIYW5kbGUoKSBjb25zdCB7IHJldHVybiBoY2lfaGFuZGxlOyB9Ci0gIHVpbnQxNl90IGxpbmtfc3VwZXJfdG91dDsKLSAgdWludDE2X3QgcGt0X3R5cGVzX21hc2s7Ci0gIHVpbnQ4X3QgZGlzY29ubmVjdF9yZWFzb247Ci0KLSBwcml2YXRlOgotICBidG1fYWNsX2VuY3J5cHRfc3RhdGVfdCBlbmNyeXB0X3N0YXRlXzsKLQotIHB1YmxpYzoKLSAgdm9pZCBzZXRfZW5jcnlwdGlvbl9vZmYoKSB7Ci0gICAgaWYgKGVuY3J5cHRfc3RhdGVfICE9IEJUTV9BQ0xfRU5DUllQVF9TVEFURV9FTkNSWVBUX09GRikgewotICAgICAgYnRzbmRfaGNpY19zZXRfY29ubl9lbmNyeXB0KGhjaV9oYW5kbGUsIGZhbHNlKTsKLSAgICAgIGVuY3J5cHRfc3RhdGVfID0gQlRNX0FDTF9FTkNSWVBUX1NUQVRFX0VOQ1JZUFRfT0ZGOwotICAgIH0KLSAgfQotICB2b2lkIHNldF9lbmNyeXB0aW9uX29uKCkgewotICAgIGlmIChlbmNyeXB0X3N0YXRlXyAhPSBCVE1fQUNMX0VOQ1JZUFRfU1RBVEVfRU5DUllQVF9PTikgewotICAgICAgYnRzbmRfaGNpY19zZXRfY29ubl9lbmNyeXB0KGhjaV9oYW5kbGUsIHRydWUpOwotICAgICAgZW5jcnlwdF9zdGF0ZV8gPSBCVE1fQUNMX0VOQ1JZUFRfU1RBVEVfRU5DUllQVF9PTjsKLSAgICB9Ci0gIH0KLSAgdm9pZCBzZXRfZW5jcnlwdGlvbl9pZGxlKCkgeyBlbmNyeXB0X3N0YXRlXyA9IEJUTV9BQ0xfRU5DUllQVF9TVEFURV9JRExFOyB9Ci0KLSAgdm9pZCBzZXRfZW5jcnlwdGlvbl9zd2l0Y2hpbmcoKSB7Ci0gICAgZW5jcnlwdF9zdGF0ZV8gPSBCVE1fQUNMX0VOQ1JZUFRfU1RBVEVfVEVNUF9GVU5DOwotICB9Ci0KLSBwdWJsaWM6Ci0gIGJvb2wgaXNfZW5jcnlwdGVkID0gZmFsc2U7Ci0gIHRIQ0lfUk9MRSBsaW5rX3JvbGU7Ci0gIHVpbnQ4X3Qgc3dpdGNoX3JvbGVfZmFpbGVkX2F0dGVtcHRzOwotCi0gIHRSRU1PVEVfVkVSU0lPTl9JTkZPIHJlbW90ZV92ZXJzaW9uX2luZm87Ci0KLSNkZWZpbmUgQlRNX1NFQ19SU19OT1RfUEVORElORyAwIC8qIFJvbGUgU3dpdGNoIG5vdCBpbiBwcm9ncmVzcyAqLwotI2RlZmluZSBCVE1fU0VDX1JTX1BFTkRJTkcgMSAgICAgLyogUm9sZSBTd2l0Y2ggaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUgQlRNX1NFQ19ESVNDX1BFTkRJTkcgMiAgIC8qIERpc2Nvbm5lY3QgaXMgcGVuZGluZyAqLwotIHByaXZhdGU6Ci0gIHVpbnQ4X3QgcnNfZGlzY19wZW5kaW5nID0gQlRNX1NFQ19SU19OT1RfUEVORElORzsKLSAgZnJpZW5kIHN0cnVjdCBTdGFja0FjbEJ0bUFjbDsKLSAgZnJpZW5kIHRCVE1fU1RBVFVTIGJ0bV9yZW1vdmVfYWNsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0gIGZyaWVuZCB2b2lkIGFjbF9kaXNjb25uZWN0X2FmdGVyX3JvbGVfc3dpdGNoKHVpbnQxNl90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyByZWFzb24pOwotICBmcmllbmQgdm9pZCBibHVldG9vdGg6OnNoaW06OmJ0bV9wbV9vbl9tb2RlX2NoYW5nZSh0SENJX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGhjaV9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCk7Ci0gIGZyaWVuZCB2b2lkIGJ0bV9hY2xfZW5jcnlwdF9jaGFuZ2UodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuY3JfZW5hYmxlKTsKLQotIHB1YmxpYzoKLSAgYm9vbCBpc19kaXNjb25uZWN0X3BlbmRpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJzX2Rpc2NfcGVuZGluZyA9PSBCVE1fU0VDX0RJU0NfUEVORElORzsKLSAgfQotICBib29sIGlzX3JvbGVfc3dpdGNoX3BlbmRpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJzX2Rpc2NfcGVuZGluZyA9PSBCVE1fU0VDX1JTX1BFTkRJTkc7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3Qgc3dpdGNoX3JvbGVfc3RhdGVfOwotCi0gcHVibGljOgotICB2b2lkIHJlc2V0X3N3aXRjaF9yb2xlKCkgeyBzd2l0Y2hfcm9sZV9zdGF0ZV8gPSBCVE1fQUNMX1NXS0VZX1NUQVRFX0lETEU7IH0KLSAgdm9pZCBzZXRfc3dpdGNoX3JvbGVfY2hhbmdpbmcoKSB7Ci0gICAgc3dpdGNoX3JvbGVfc3RhdGVfID0gQlRNX0FDTF9TV0tFWV9TVEFURV9NT0RFX0NIQU5HRTsKLSAgfQotICB2b2lkIHNldF9zd2l0Y2hfcm9sZV9lbmNyeXB0aW9uX29mZigpIHsKLSAgICBzd2l0Y2hfcm9sZV9zdGF0ZV8gPSBCVE1fQUNMX1NXS0VZX1NUQVRFX0VOQ1JZUFRJT05fT0ZGOwotICB9Ci0gIHZvaWQgc2V0X3N3aXRjaF9yb2xlX2VuY3J5cHRpb25fb24oKSB7Ci0gICAgc3dpdGNoX3JvbGVfc3RhdGVfID0gQlRNX0FDTF9TV0tFWV9TVEFURV9FTkNSWVBUSU9OX09OOwotICB9Ci0gIHZvaWQgc2V0X3N3aXRjaF9yb2xlX2luX3Byb2dyZXNzKCkgewotICAgIHN3aXRjaF9yb2xlX3N0YXRlXyA9IEJUTV9BQ0xfU1dLRVlfU1RBVEVfSU5fUFJPR1JFU1M7Ci0gIH0KLSAgdm9pZCBzZXRfc3dpdGNoX3JvbGVfc3dpdGNoaW5nKCkgewotICAgIHN3aXRjaF9yb2xlX3N0YXRlXyA9IEJUTV9BQ0xfU1dLRVlfU1RBVEVfU1dJVENISU5HOwotICB9Ci0KLSAgYm9vbCBpc19zd2l0Y2hfcm9sZV9pZGxlKCkgY29uc3QgewotICAgIHJldHVybiBzd2l0Y2hfcm9sZV9zdGF0ZV8gPT0gQlRNX0FDTF9TV0tFWV9TVEFURV9JRExFOwotICB9Ci0gIGJvb2wgaXNfc3dpdGNoX3JvbGVfZW5jcnlwdGlvbl9vZmYoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN3aXRjaF9yb2xlX3N0YXRlXyA9PSBCVE1fQUNMX1NXS0VZX1NUQVRFX0VOQ1JZUFRJT05fT0ZGOwotICB9Ci0gIGJvb2wgaXNfc3dpdGNoX3JvbGVfZW5jcnlwdGlvbl9vbigpIGNvbnN0IHsKLSAgICByZXR1cm4gc3dpdGNoX3JvbGVfc3RhdGVfID09IEJUTV9BQ0xfU1dLRVlfU1RBVEVfRU5DUllQVElPTl9PTjsKLSAgfQotICBib29sIGlzX3N3aXRjaF9yb2xlX3N3aXRjaGluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3dpdGNoX3JvbGVfc3RhdGVfID09IEJUTV9BQ0xfU1dLRVlfU1RBVEVfU1dJVENISU5HOwotICB9Ci0gIGJvb2wgaXNfc3dpdGNoX3JvbGVfaW5fcHJvZ3Jlc3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN3aXRjaF9yb2xlX3N0YXRlXyA9PSBCVE1fQUNMX1NXS0VZX1NUQVRFX0lOX1BST0dSRVNTOwotICB9Ci0gIGJvb2wgaXNfc3dpdGNoX3JvbGVfbW9kZV9jaGFuZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN3aXRjaF9yb2xlX3N0YXRlXyA9PSBCVE1fQUNMX1NXS0VZX1NUQVRFX01PREVfQ0hBTkdFOwotICB9Ci0gIGJvb2wgaXNfc3dpdGNoX3JvbGVfc3dpdGNoaW5nX29yX2luX3Byb2dyZXNzKCkgY29uc3QgewotICAgIHJldHVybiBpc19zd2l0Y2hfcm9sZV9zd2l0Y2hpbmcoKSB8fCBpc19zd2l0Y2hfcm9sZV9pbl9wcm9ncmVzcygpOwotICB9Ci0KLSAgZnJpZW5kIHZvaWQgRHVtcHN5c0wyY2FwKGludCBmZCk7Ci0KLSBwdWJsaWM6Ci0gIHVpbnQ4X3Qgc2NhOyAvKiBTbGVlcCBjbG9jayBhY2N1cmFjeSAqLwotCi0gIHZvaWQgUmVzZXQoKTsKLQotICBzdHJ1Y3QgdFBvbGljeSB7Ci0gICAgdEJUTV9QTV9NT0RFIE1vZGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5tb2RlLm1vZGVfOyB9Ci0gICAgc3RydWN0IHsKLSAgICAgIGJvb2wgSXNQZW5kaW5nKCkgY29uc3QgeyByZXR1cm4gcGVuZGluZ18gIT0gQlRNX1BNX01EX1VOS05PV047IH0KLSAgICAgIHRCVE1fUE1fTU9ERSBQZW5kaW5nKCkgY29uc3QgeyByZXR1cm4gcGVuZGluZ187IH0KLSAgICAgIHVpbnQxNl90IEludGVydmFsKCkgY29uc3QgeyByZXR1cm4gaW50ZXJ2YWxfOyB9Ci0KLSAgICAgcHJpdmF0ZToKLSAgICAgIHRCVE1fUE1fTU9ERSBtb2RlX3tCVE1fUE1fTURfQUNUSVZFfTsKLSAgICAgIHRCVE1fUE1fTU9ERSBwZW5kaW5nX3tCVE1fUE1fTURfVU5LTk9XTn07Ci0gICAgICB1aW50MTZfdCBpbnRlcnZhbF97MH07Ci0gICAgICBmcmllbmQgdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0UG93ZXJNb2RlKAotICAgICAgICAgIHVpbnQxNl90LCBjb25zdCB0QlRNX1BNX1BXUl9NRCYgbmV3X21vZGUpOwotICAgICAgZnJpZW5kIHZvaWQgYmx1ZXRvb3RoOjpzaGltOjpidG1fcG1fb25fbW9kZV9jaGFuZ2UodEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGhjaV9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwpOwotICAgICAgZnJpZW5kIHZvaWQgdEFDTF9DT05OOjpSZXNldCgpOwotICAgICAgZnJpZW5kIHRCVE1fUE1fTU9ERSB0QUNMX0NPTk46OnRQb2xpY3k6Ok1vZGUoKSBjb25zdDsKLSAgICB9IG1vZGU7Ci0KLSAgICBoY2lfcm9sZV90IFJvbGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5yb2xlLnJvbGVfOyB9Ci0gICAgc3RydWN0IHsKLSAgICAgIHVuc2lnbmVkIFJvbGVTd2l0Y2hGYWlsZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHJvbGVfc3dpdGNoX2ZhaWxlZF9jbnRfOyB9Ci0KLSAgICAgcHJpdmF0ZToKLSAgICAgIGhjaV9yb2xlX3Qgcm9sZV97SENJX1JPTEVfQ0VOVFJBTH07Ci0gICAgICB1bnNpZ25lZCByb2xlX3N3aXRjaF9mYWlsZWRfY250X3swfTsKLSAgICAgIGZyaWVuZCB2b2lkIHRBQ0xfQ09OTjo6UmVzZXQoKTsKLSAgICAgIGZyaWVuZCBoY2lfcm9sZV90IHRBQ0xfQ09OTjo6dFBvbGljeTo6Um9sZSgpIGNvbnN0OwotICAgIH0gcm9sZTsKLQotICAgIHN0cnVjdCB7Ci0gICAgICBib29sIElzUGVuZGluZygpIGNvbnN0IHsgcmV0dXJuIHBlbmRpbmdfOyB9Ci0KLSAgICAgcHJpdmF0ZToKLSAgICAgIGJvb2wgcGVuZGluZ197ZmFsc2V9OwotICAgICAgZnJpZW5kIHRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX1NldFNzclBhcmFtcyh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9sb2NfdG8pOwotICAgICAgZnJpZW5kIHZvaWQgYmx1ZXRvb3RoOjpzaGltOjpidG1fcG1fb25fc25pZmZfc3VicmF0aW5nKAotICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgICAgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KTsKLSAgICAgIGZyaWVuZCB2b2lkIHRBQ0xfQ09OTjo6UmVzZXQoKTsKLSAgICB9IHNuaWZmX3N1YnJhdGluZzsKLQotICAgIHRMSU5LX1BPTElDWSBTZXR0aW5ncygpIGNvbnN0IHsgcmV0dXJuIHNldHRpbmdzXzsgfQotCi0gICBwcml2YXRlOgotICAgIHRMSU5LX1BPTElDWSBzZXR0aW5nc197a0FsbExpbmtQb2xpY2llc0VuYWJsZWR9OwotICAgIGZyaWVuZCB2b2lkIGJ0bV9zZXRfbGlua19wb2xpY3kodEFDTF9DT05OKiBjb25uLCB0TElOS19QT0xJQ1kgcG9saWN5KTsKLSAgICBmcmllbmQgdm9pZCB0QUNMX0NPTk46OlJlc2V0KCk7Ci0gIH0gcG9saWN5OwotfTsKLQotc3RydWN0IGNvbnRyb2xsZXJfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKiAgICAgIEFDTCBNYW5hZ2VtZW50IEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdGV4cHIgdWludDE2X3Qga0RlZmF1bHRQYWNrZXRUeXBlTWFzayA9Ci0gICAgSENJX1BLVF9UWVBFU19NQVNLX0RIMSB8IEhDSV9QS1RfVFlQRVNfTUFTS19ETTEgfCBIQ0lfUEtUX1RZUEVTX01BU0tfREgzIHwKLSAgICBIQ0lfUEtUX1RZUEVTX01BU0tfRE0zIHwgSENJX1BLVF9UWVBFU19NQVNLX0RINSB8IEhDSV9QS1RfVFlQRVNfTUFTS19ETTU7Ci0KLXN0cnVjdCB0QUNMX0NCIHsKLSBwcml2YXRlOgotICBmcmllbmQgdWludDhfdCBidG1faGFuZGxlX3RvX2FjbF9pbmRleCh1aW50MTZfdCBoY2lfaGFuZGxlKTsKLSAgZnJpZW5kIHZvaWQgYnRtX2FjbF9kZXZpY2VfZG93bih2b2lkKTsKLSAgZnJpZW5kIHZvaWQgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jcl9lbmFibGUpOwotCi0gIGZyaWVuZCB2b2lkIER1bXBzeXNMMmNhcChpbnQgZmQpOwotICBmcmllbmQgdm9pZCBEdW1wc3lzQWNsKGludCBmZCk7Ci0gIGZyaWVuZCBzdHJ1Y3QgU3RhY2tBY2xCdG1BY2w7Ci0KLSAgdEFDTF9DT05OIGFjbF9kYltNQVhfTDJDQVBfTElOS1NdOwotICB0QlRNX1JPTEVfU1dJVENIX0NNUEwgc3dpdGNoX3JvbGVfcmVmX2RhdGE7Ci0gIHVpbnQxNl90IGJ0bV9hY2xfcGt0X3R5cGVzX3N1cHBvcnRlZCA9IGtEZWZhdWx0UGFja2V0VHlwZU1hc2s7Ci0gIHVpbnQxNl90IGJ0bV9kZWZfbGlua19wb2xpY3k7Ci0gIHRIQ0lfU1RBVFVTIGFjbF9kaXNjX3JlYXNvbiA9IEhDSV9FUlJfVU5ERUZJTkVEOwotCi0gcHVibGljOgotICB2b2lkIFNldERlZmF1bHRQYWNrZXRUeXBlTWFzayh1aW50MTZfdCBwYWNrZXRfdHlwZV9tYXNrKSB7Ci0gICAgYnRtX2FjbF9wa3RfdHlwZXNfc3VwcG9ydGVkID0gcGFja2V0X3R5cGVfbWFzazsKLSAgfQotCi0gIHRIQ0lfU1RBVFVTIGdldF9kaXNjb25uZWN0X3JlYXNvbigpIGNvbnN0IHsgcmV0dXJuIGFjbF9kaXNjX3JlYXNvbjsgfQotICB2b2lkIHNldF9kaXNjb25uZWN0X3JlYXNvbih0SENJX1NUQVRVUyByZWFzb24pIHsgYWNsX2Rpc2NfcmVhc29uID0gcmVhc29uOyB9Ci0gIHVpbnQxNl90IERlZmF1bHRQYWNrZXRUeXBlcygpIGNvbnN0IHsgcmV0dXJuIGJ0bV9hY2xfcGt0X3R5cGVzX3N1cHBvcnRlZDsgfQotICB1aW50MTZfdCBEZWZhdWx0TGlua1BvbGljeSgpIGNvbnN0IHsgcmV0dXJuIGJ0bV9kZWZfbGlua19wb2xpY3k7IH0KLQotICBzdHJ1Y3QgewotICAgIHN0ZDo6dmVjdG9yPHRCVE1fUE1fU1RBVFVTX0NCQUNLKj4gY2xpZW50czsKLSAgfSBsaW5rX3BvbGljeTsKLQotICB1bnNpZ25lZCBOdW1iZXJPZkFjdGl2ZUxpbmtzKCkgY29uc3QgewotICAgIHVuc2lnbmVkIGNudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTDJDQVBfTElOS1M7IGkrKykgewotICAgICAgaWYgKGFjbF9kYltpXS5JblVzZSgpKSArK2NudDsKLSAgICB9Ci0gICAgcmV0dXJuIGNudDsKLSAgfQotfTsKZGlmZiAtLWdpdCBhL3N0YWNrL2FjbC9ibGVfYWNsLmNjIGIvc3RhY2svYWNsL2JsZV9hY2wuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODdlMGMuLjAwMDAwMDAKLS0tIGEvc3RhY2svYWNsL2JsZV9hY2wuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLXZvaWQgYnRtX2JsZV9hZHZlcnRpc2VyX25vdGlmeV90ZXJtaW5hdGVkX2xlZ2FjeSh1aW50OF90IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSk7Ci12b2lkIGJ0bV9ibGVfaW5jcmVtZW50X2xpbmtfdG9wb2xvZ3lfbWFzayh1aW50OF90IGxpbmtfcm9sZSk7Ci0KLWJvb2wgbWF5YmVfcmVzb2x2ZV9hZGRyZXNzKFJhd0FkZHJlc3MqIGJkYSwgdEJMRV9BRERSX1RZUEUqIGJkYV90eXBlKTsKLQotc3RhdGljIGJvb2wgYWNsX2JsZV9jb21tb25fY29ubmVjdGlvbihjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2luX3NlY3VyaXR5X2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fdGltZW91dCkgewotICBpZiAocm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgYnRtX2NiLmJsZV9jdHJfY2Iuc2V0X2Nvbm5lY3Rpb25fc3RhdGVfaWRsZSgpOwotICAgIGJ0bV9ibGVfY2xlYXJfdG9wb2xvZ3lfbWFzayhCVE1fQkxFX1NUQVRFX0lOSVRfQklUKTsKLSAgfQotCi0gIC8vIEluZm9ybSBhbnkgYXBwbGljYXRpb25zIHRoYXQgYSBjb25uZWN0aW9uIGhhcyBjb21wbGV0ZWQuCi0gIGNvbm5lY3Rpb25fbWFuYWdlcjo6b25fY29ubmVjdGlvbl9jb21wbGV0ZShhZGRyZXNzX3dpdGhfdHlwZS5iZGEpOwotCi0gIC8vIEFsbG9jYXRlIG9yIHVwZGF0ZSB0aGUgc2VjdXJpdHkgZGV2aWNlIHJlY29yZCBmb3IgdGhpcyBkZXZpY2UKLSAgYnRtX2JsZV9jb25uZWN0ZWQoYWRkcmVzc193aXRoX3R5cGUuYmRhLCBoYW5kbGUsIEhDSV9FTkNSWVBUX01PREVfRElTQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgIHJvbGUsIGFkZHJlc3Nfd2l0aF90eXBlLnR5cGUsIGlzX2luX3NlY3VyaXR5X2RiKTsKLQotICAvLyBVcGRhdGUgdGhlIGxpbmsgdG9wb2xvZ3kgaW5mb3JtYXRpb24gZm9yIG91ciBkZXZpY2UKLSAgYnRtX2JsZV9pbmNyZW1lbnRfbGlua190b3BvbG9neV9tYXNrKHJvbGUpOwotCi0gIC8vIEluZm9ybSBsMmNhcCBvZiBhIHBvdGVudGlhbCBjb25uZWN0aW9uLgotICBpZiAoIWwyY2JsZV9jb25uX2NvbXAoaGFuZGxlLCByb2xlLCBhZGRyZXNzX3dpdGhfdHlwZS5iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZS50eXBlLCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uX3RpbWVvdXQpKSB7Ci0gICAgYnRtX3NlY19kaXNjb25uZWN0KGhhbmRsZSwgSENJX0VSUl9OT19DT05ORUNUSU9OKTsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGNvbXBsZXRlIGwyY2FwIGNvbm5lY3Rpb24iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBidG1fYmxlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QoQlRNX0JMRV9STF9JTklULCB0cnVlKTsKLQotICAvKiBUZWxsIEJUTSBBY2wgbWFuYWdlbWVudCBhYm91dCB0aGUgbGluayAqLwotICBidG1fYWNsX2NyZWF0ZWQoYWRkcmVzc193aXRoX3R5cGUuYmRhLCBoYW5kbGUsIHJvbGUsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgYWNsX2JsZV9jb25uZWN0aW9uX2NvbXBsZXRlKGNvbnN0IHRCTEVfQkRfQUREUiYgYWRkcmVzc193aXRoX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLCBib29sIG1hdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pbnRlcnZhbCwgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl90aW1lb3V0KSB7Ci0gIGlmICghYWNsX2JsZV9jb21tb25fY29ubmVjdGlvbihhZGRyZXNzX3dpdGhfdHlwZSwgaGFuZGxlLCByb2xlLCBtYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5faW50ZXJ2YWwsIGNvbm5fbGF0ZW5jeSwgY29ubl90aW1lb3V0KSkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gY3JlYXRlIG5vbiBlbmhhbmNlZCBibGUgYWNsIGNvbm5lY3Rpb24iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidG1fYmxlX3VwZGF0ZV9tb2RlX29wZXJhdGlvbihyb2xlLCAmYWRkcmVzc193aXRoX3R5cGUuYmRhLCBIQ0lfU1VDQ0VTUyk7Ci0KLSAgaWYgKHJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkKLSAgICBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5KEhDSV9TVUNDRVNTLCBoYW5kbGUpOwotfQotCi12b2lkIGFjbF9ibGVfZW5oYW5jZWRfY29ubmVjdGlvbl9jb21wbGV0ZSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLAotICAgIGJvb2wgbWF0Y2gsIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICB1aW50MTZfdCBjb25uX3RpbWVvdXQsIGNvbnN0IFJhd0FkZHJlc3MmIGxvY2FsX3JwYSwKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX3JwYSwgdEJMRV9BRERSX1RZUEUgcGVlcl9hZGRyX3R5cGUpIHsKLSAgaWYgKCFhY2xfYmxlX2NvbW1vbl9jb25uZWN0aW9uKGFkZHJlc3Nfd2l0aF90eXBlLCBoYW5kbGUsIHJvbGUsIG1hdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9pbnRlcnZhbCwgY29ubl9sYXRlbmN5LCBjb25uX3RpbWVvdXQpKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBjcmVhdGUgZW5oYW5jZWQgYmxlIGFjbCBjb25uZWN0aW9uIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRtX2JsZV9yZWZyZXNoX2xvY2FsX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyKGFkZHJlc3Nfd2l0aF90eXBlLmJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3JwYSk7Ci0KLSAgaWYgKHBlZXJfYWRkcl90eXBlICYgQkxFX0FERFJfVFlQRV9JRF9CSVQpCi0gICAgYnRtX2JsZV9yZWZyZXNoX3BlZXJfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLmJkYSwgcGVlcl9ycGEsIHRCVE1fU0VDX0JMRTo6QlRNX0JMRV9BRERSX1JSQSk7Ci0gIGJ0bV9ibGVfdXBkYXRlX21vZGVfb3BlcmF0aW9uKHJvbGUsICZhZGRyZXNzX3dpdGhfdHlwZS5iZGEsIEhDSV9TVUNDRVNTKTsKLQotICBpZiAocm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKQotICAgIGJ0bV9ibGVfYWR2ZXJ0aXNlcl9ub3RpZnlfdGVybWluYXRlZF9sZWdhY3koSENJX1NVQ0NFU1MsIGhhbmRsZSk7Ci19Ci0KLXN0YXRpYyBib29sIG1heWJlX3Jlc29sdmVfcmVjZWl2ZWRfYWRkcmVzcygKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgIHRCTEVfQkRfQUREUiogcmVzb2x2ZWRfYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgQVNTRVJUKHJlc29sdmVkX2FkZHJlc3Nfd2l0aF90eXBlICE9IG51bGxwdHIpOwotCi0gICpyZXNvbHZlZF9hZGRyZXNzX3dpdGhfdHlwZSA9IGFkZHJlc3Nfd2l0aF90eXBlOwotICByZXR1cm4gbWF5YmVfcmVzb2x2ZV9hZGRyZXNzKCZyZXNvbHZlZF9hZGRyZXNzX3dpdGhfdHlwZS0+YmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlZF9hZGRyZXNzX3dpdGhfdHlwZS0+dHlwZSk7Ci19Ci0KLXZvaWQgYWNsX2JsZV9lbmhhbmNlZF9jb25uZWN0aW9uX2NvbXBsZXRlX2Zyb21fc2hpbSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLAotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGxvY2FsX3JwYSwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9ycGEsCi0gICAgdEJMRV9BRERSX1RZUEUgcGVlcl9hZGRyX3R5cGUpIHsKLSAgaWYgKCFjb25uZWN0aW9uX21hbmFnZXI6OnJlbW92ZV91bmNvbmRpdGlvbmFsX2Zyb21fc2hpbSgKLSAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZS5iZGEpKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJVbmFibGUgdG8gcmVtb3ZlIGZyb20gbGVnYWN5IGNvbm5lY3Rpb24gbWFuYWdlciBhY2NlcHQgbGlzdCBhZGRyOiVzIiwKLSAgICAgICAgUFJJVkFURV9BRERSRVNTKGFkZHJlc3Nfd2l0aF90eXBlLmJkYSkpOwotICB9Ci0KLSAgdEJMRV9CRF9BRERSIHJlc29sdmVkX2FkZHJlc3Nfd2l0aF90eXBlOwotICBjb25zdCBib29sIGlzX2luX3NlY3VyaXR5X2RiID0gbWF5YmVfcmVzb2x2ZV9yZWNlaXZlZF9hZGRyZXNzKAotICAgICAgYWRkcmVzc193aXRoX3R5cGUsICZyZXNvbHZlZF9hZGRyZXNzX3dpdGhfdHlwZSk7Ci0KLSAgYWNsX2JsZV9lbmhhbmNlZF9jb25uZWN0aW9uX2NvbXBsZXRlKHJlc29sdmVkX2FkZHJlc3Nfd2l0aF90eXBlLCBoYW5kbGUsIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbl9zZWN1cml0eV9kYiwgY29ubl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5fbGF0ZW5jeSwgY29ubl90aW1lb3V0LCBsb2NhbF9ycGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyX3JwYSwgcGVlcl9hZGRyX3R5cGUpOwotCi0gIC8vIFRoZSBsZWdhY3kgc3RhY2sgY29udGludWVzIHRoZSBMRSBjb25uZWN0aW9uIGFmdGVyIHRoZSByZWFkIHJlbW90ZSB2ZXJzaW9uCi0gIC8vIGNvbXBsZXRlIGhhcyBiZWVuIHJlY2VpdmVkLgotICBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb24oYWRkcmVzc193aXRoX3R5cGUuYmRhKTsKLSAgbDJjYmxlX3VzZV9wcmVmZXJyZWRfY29ubl9wYXJhbXMoYWRkcmVzc193aXRoX3R5cGUuYmRhKTsKLX0KLQotdm9pZCBhY2xfYmxlX2Nvbm5lY3Rpb25fZmFpbChjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIGJvb2wgZW5oYW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBpZiAoc3RhdHVzICE9IEhDSV9FUlJfQURWRVJUSVNJTkdfVElNRU9VVCkgewotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnNldF9jb25uZWN0aW9uX3N0YXRlX2lkbGUoKTsKLSAgICBidG1fYmxlX2NsZWFyX3RvcG9sb2d5X21hc2soQlRNX0JMRV9TVEFURV9JTklUX0JJVCk7Ci0gICAgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0KEJUTV9CTEVfUkxfSU5JVCwgdHJ1ZSk7Ci0gICAgY29ubmVjdGlvbl9tYW5hZ2VyOjpvbl9jb25uZWN0aW9uX3RpbWVkX291dF9mcm9tX3NoaW0oCi0gICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLmJkYSk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3Zhci5hZHZfbW9kZSA9IEJUTV9CTEVfQURWX0RJU0FCTEU7Ci0gICAgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0KEJUTV9CTEVfUkxfQURWLCB0cnVlKTsKLSAgfQotICBidG1fYmxlX3VwZGF0ZV9tb2RlX29wZXJhdGlvbihIQ0lfUk9MRV9VTktOT1dOLCAmYWRkcmVzc193aXRoX3R5cGUuYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotfQotCi12b2lkIGdhdHRfbm90aWZ5X2Nvbm5fdXBkYXRlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZSwgdWludDE2X3QgaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci12b2lkIGFjbF9ibGVfdXBkYXRlX2V2ZW50X3JlY2VpdmVkKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCkgewotICBsMmNibGVfcHJvY2Vzc19jb25uX3VwZGF0ZV9ldnQoaGFuZGxlLCBzdGF0dXMsIGludGVydmFsLCBsYXRlbmN5LCB0aW1lb3V0KTsKLQotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXZfYnlfaGFuZGxlKGhhbmRsZSk7Ci0KLSAgaWYgKCFwX2Rldl9yZWMpIHJldHVybjsKLQotICBnYXR0X25vdGlmeV9jb25uX3VwZGF0ZShwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciwgaW50ZXJ2YWwsIGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hY2wvYnRtX2FjbC5jYyBiL3N0YWNrL2FjbC9idG1fYWNsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc5ZDQzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2FjbC9idG1fYWNsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAwLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgTmFtZTogICAgICAgICAgYnRtX2FjbC5jYwotICoKLSAqICBEZXNjcmlwdGlvbjogICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIEFDTCBjb25uZWN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICBUaGlzIGluY2x1ZGVzIG9wZXJhdGlvbnMgc3VjaCBhcyBob2xkIGFuZCBzbmlmZiBtb2RlcywKLSAqICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgcGFja2V0IHR5cGVzLgotICoKLSAqICAgICAgICAgICAgICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCAoQVBJKQotICogICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy4gRXh0ZXJuYWwgKEFQSSkgZnVuY3Rpb25zIGFyZSBkaXN0aW5ndWlzaGFibGUKLSAqICAgICAgICAgICAgICAgICBieSB0aGVpciBuYW1lcyBiZWdpbm5pbmcgd2l0aCB1cHBlcmNhc2UgQlRNLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRtX2FjbCIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZG1fYWNsLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYWNsLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgImluY2x1ZGUvbDJjYXBfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYnRtX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2wyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9hY2wvYWNsLmgiCi0jaW5jbHVkZSAic3RhY2svYWNsL3BlZXJfcGFja2V0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL3NlY3VyaXR5X2RldmljZV9yZWNvcmQuaCIKLSNpbmNsdWRlICJzdGFjay9nYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1faXNvX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjYXBfYWNsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2NvX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi12b2lkIEJUTV91cGRhdGVfdmVyc2lvbl9pbmZvKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW90ZV92ZXJzaW9uX2luZm8mIHJlbW90ZV92ZXJzaW9uX2luZm8pOwotCi12b2lkIGdhdHRfZmluZF9pbl9kZXZpY2VfcmVjb3JkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQkRfQUREUiogYWRkcmVzc193aXRoX3R5cGUpOwotdm9pZCBsMmNfbGlua19oY2lfY29ubl9jb21wKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKTsKLQotdm9pZCBCVE1fZGJfcmVzZXQodm9pZCk7Ci0KLWV4dGVybiB0QlRNX0NCIGJ0bV9jYjsKLQotc3RydWN0IFN0YWNrQWNsQnRtQWNsIHsKLSAgdEFDTF9DT05OKiBhY2xfYWxsb2NhdGVfY29ubmVjdGlvbigpOwotICB0QUNMX0NPTk4qIGFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpOwotICB0QUNMX0NPTk4qIGJ0bV9iZGFfdG9fYWNsKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotICBib29sIGNoYW5nZV9jb25uZWN0aW9uX3BhY2tldF90eXBlcyh0QUNMX0NPTk4mIGxpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90IG5ld19wYWNrZXRfdHlwZV9iaXRtYXNrKTsKLSAgdm9pZCBidG1fZXN0YWJsaXNoX2NvbnRpbnVlKHRBQ0xfQ09OTiogcF9hY2xfY2IpOwotICB2b2lkIGJ0bV9yZWFkX3JlbW90ZV9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUpOwotICB2b2lkIGJ0bV9zZXRfZGVmYXVsdF9saW5rX3BvbGljeSh0TElOS19QT0xJQ1kgc2V0dGluZ3MpOwotICB2b2lkIGJ0bV9hY2xfcm9sZV9jaGFuZ2VkKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9ST0xFIG5ld19yb2xlKTsKLSAgdm9pZCBoY2lfc3RhcnRfcm9sZV9zd2l0Y2hfdG9fY2VudHJhbCh0QUNMX0NPTk4mIHBfYWNsKTsKLSAgdm9pZCBzZXRfZGVmYXVsdF9wYWNrZXRfdHlwZXNfc3VwcG9ydGVkKHVpbnQxNl90IHBhY2tldF90eXBlc19zdXBwb3J0ZWQpIHsKLSAgICBidG1fY2IuYWNsX2NiXy5idG1fYWNsX3BrdF90eXBlc19zdXBwb3J0ZWQgPSBwYWNrZXRfdHlwZXNfc3VwcG9ydGVkOwotICB9Ci19OwotCi1zdHJ1Y3QgUm9sZUNoYW5nZVZpZXcgewotICB0SENJX1JPTEUgbmV3X3JvbGUgPSBIQ0lfUk9MRV9VTktOT1dOOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci19OwotCi1uYW1lc3BhY2UgewotU3RhY2tBY2xCdG1BY2wgaW50ZXJuYWxfOwotc3RkOjp1bmlxdWVfcHRyPFJvbGVDaGFuZ2VWaWV3PiBkZWxheWVkX3JvbGVfY2hhbmdlXyA9IG51bGxwdHI7Ci1jb25zdCBibHVldG9vdGg6OmxlZ2FjeTo6aGNpOjpJbnRlcmZhY2UmIEdldExlZ2FjeUhjaUludGVyZmFjZSgpIHsKLSAgcmV0dXJuIGJsdWV0b290aDo6bGVnYWN5OjpoY2k6OkdldEludGVyZmFjZSgpOwotfQotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgaGNpX2xlbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWNsX2hlYWRlcl90OwotCi1jb25zdGV4cHIgdWludDhfdCBCVE1fTUFYX1NXX1JPTEVfRkFJTEVEX0FUVEVNUFRTID0gMzsKLQotLyogRGVmaW5lIG1hc2tzIGZvciBzdXBwb3J0ZWQgYW5kIGV4Y2VwdGlvbiAyLjAgQUNMIHBhY2tldCB0eXBlcwotICovCi1jb25zdGV4cHIgdWludDE2X3QgQlRNX0FDTF9TVVBQT1JURURfUEtUU19NQVNLID0KLSAgICAoSENJX1BLVF9UWVBFU19NQVNLX0RNMSB8IEhDSV9QS1RfVFlQRVNfTUFTS19ESDEgfCBIQ0lfUEtUX1RZUEVTX01BU0tfRE0zIHwKLSAgICAgSENJX1BLVF9UWVBFU19NQVNLX0RIMyB8IEhDSV9QS1RfVFlQRVNfTUFTS19ETTUgfCBIQ0lfUEtUX1RZUEVTX01BU0tfREg1KTsKLQotY29uc3RleHByIHVpbnQxNl90IEJUTV9BQ0xfRVhDRVBUSU9OX1BLVFNfTUFTSyA9Ci0gICAgKEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RIMSB8IEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RIMSB8Ci0gICAgIEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RIMyB8IEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RIMyB8Ci0gICAgIEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RINSB8IEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RINSk7Ci0KLWlubGluZSBib29sIElzRXByQXZhaWxhYmxlKGNvbnN0IHRBQ0xfQ09OTiYgcF9hY2wpIHsKLSAgaWYgKCFwX2FjbC5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkWzBdKSB7Ci0gICAgTE9HX1dBUk4oIkNoZWNraW5nIGluY29tcGxldGUgZmVhdHVyZSBwYWdlIHJlYWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIEhDSV9BVE9NSUNfRU5DUllQVF9TVVBQT1JURUQocF9hY2wucGVlcl9sbXBfZmVhdHVyZV9wYWdlc1swXSkgJiYKLSAgICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19lbmNyeXB0aW9uX3BhdXNlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV9wcm9jZXNzX3JlbW90ZV9leHRfZmVhdHVyZXModEFDTF9DT05OKiBwX2FjbF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfcGFnZV9udW1iZXIpOwotc3RhdGljIHZvaWQgYnRtX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW1iZXIpOwotc3RhdGljIHZvaWQgYnRtX3JlYWRfcnNzaV90aW1lb3V0KHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRtX3JlYWRfdHhfcG93ZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLXN0YXRpYyB2b2lkIGNoZWNrX2xpbmtfcG9saWN5KHRMSU5LX1BPTElDWSogc2V0dGluZ3MpOwotdm9pZCBidG1fc2V0X2xpbmtfcG9saWN5KHRBQ0xfQ09OTiogY29ubiwgdExJTktfUE9MSUNZIHBvbGljeSk7Ci0KLW5hbWVzcGFjZSB7Ci12b2lkIE5vdGlmeUFjbExpbmtVcCh0QUNMX0NPTk4mIHBfYWNsKSB7Ci0gIGlmIChwX2FjbC5saW5rX3VwX2lzc3VlZCkgewotICAgIExPR19JTkZPKCJBbHJlYWR5IG5vdGlmaWVkIEJUQSBsYXllciB0aGF0IHRoZSBsaW5rIGlzIHVwIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfYWNsLmxpbmtfdXBfaXNzdWVkID0gdHJ1ZTsKLSAgQlRBX2RtX2FjbF91cChwX2FjbC5yZW1vdGVfYWRkciwgcF9hY2wudHJhbnNwb3J0KTsKLX0KLQotdm9pZCBOb3RpZnlBY2xMaW5rRG93bih0QUNMX0NPTk4mIHBfYWNsKSB7Ci0gIC8qIE9ubHkgbm90aWZ5IGlmIGxpbmsgdXAgaGFzIGhhZCBhIGNoYW5jZSB0byBiZSBpc3N1ZWQgKi8KLSAgaWYgKHBfYWNsLmxpbmtfdXBfaXNzdWVkKSB7Ci0gICAgcF9hY2wubGlua191cF9pc3N1ZWQgPSBmYWxzZTsKLSAgICBCVEFfZG1fYWNsX2Rvd24ocF9hY2wucmVtb3RlX2FkZHIsIHBfYWNsLnRyYW5zcG9ydCk7Ci0gIH0KLX0KLQotdm9pZCBOb3RpZnlBY2xSb2xlU3dpdGNoQ29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0SENJX1JPTEUgbmV3X3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKSB7Ci0gIEJUQV9kbV9yZXBvcnRfcm9sZV9jaGFuZ2UoYmRhLCBuZXdfcm9sZSwgaGNpX3N0YXR1cyk7Ci19Ci0KLXZvaWQgTm90aWZ5QWNsRmVhdHVyZXNSZWFkQ29tcGxldGUodEFDTF9DT05OJiBwX2FjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBtYXhfcGFnZV9udW1iZXIpIHsKLSAgQVNTRVJUX0xPRyhibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCksCi0gICAgICAgICAgICAgIkZvciByaWdodCBub3cgb25seSBjYWxsZWQgd2l0aCBnZF9hY2wgc3VwcG9ydCIpOwotICBidG1fcHJvY2Vzc19yZW1vdGVfZXh0X2ZlYXR1cmVzKCZwX2FjbCwgbWF4X3BhZ2VfbnVtYmVyKTsKLSAgYnRtX3NldF9saW5rX3BvbGljeSgmcF9hY2wsIGJ0bV9jYi5hY2xfY2JfLkRlZmF1bHRMaW5rUG9saWN5KCkpOwotICBCVEFfZG1fbm90aWZ5X3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZShwX2FjbC5yZW1vdGVfYWRkcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdGF0aWMgdm9pZCBoY2lfYnRzbmRfaGNpY19kaXNjb25uZWN0KHRBQ0xfQ09OTiYgcF9hY2wsIHRIQ0lfU1RBVFVTIHJlYXNvbikgewotICBMT0dfSU5GTygiRGlzY29ubmVjdGluZyBwZWVyOiVzIHJlYXNvbjolcyIsCi0gICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX2FjbC5yZW1vdGVfYWRkciksCi0gICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQocmVhc29uKS5jX3N0cigpKTsKLSAgcF9hY2wuZGlzY29ubmVjdF9yZWFzb24gPSByZWFzb247Ci0KLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkFDTF9EaXNjb25uZWN0KHBfYWNsLmhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hY2wuaXNfdHJhbnNwb3J0X2JyX2VkcigpLCByZWFzb24pOwotICB9IGVsc2UgewotICAgIEdldExlZ2FjeUhjaUludGVyZmFjZSgpLkRpc2Nvbm5lY3QocF9hY2wuaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihyZWFzb24pKTsKLSAgfQotfQotCi12b2lkIFN0YWNrQWNsQnRtQWNsOjpoY2lfc3RhcnRfcm9sZV9zd2l0Y2hfdG9fY2VudHJhbCh0QUNMX0NPTk4mIHBfYWNsKSB7Ci0gIEdldExlZ2FjeUhjaUludGVyZmFjZSgpLlN0YXJ0Um9sZVN3aXRjaCgKLSAgICAgIHBfYWNsLnJlbW90ZV9hZGRyLCBzdGF0aWNfY2FzdDx1aW50OF90PihIQ0lfUk9MRV9DRU5UUkFMKSk7Ci0gIHBfYWNsLnNldF9zd2l0Y2hfcm9sZV9pbl9wcm9ncmVzcygpOwotICBwX2FjbC5yc19kaXNjX3BlbmRpbmcgPSBCVE1fU0VDX1JTX1BFTkRJTkc7Ci19Ci0KLXZvaWQgaGNpX2J0bV9zZXRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KHRBQ0xfQ09OTiYgbGluaywgdWludDE2X3QgdGltZW91dCkgewotICBpZiAobGluay5saW5rX3JvbGUgIT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgIC8qIE9ubHkgc2VuZCBpZiBjdXJyZW50IHJvbGUgaXMgQ2VudHJhbDsgMi4wIHNwZWMgcmVxdWlyZXMgdGhpcyAqLwotICAgIExPR19XQVJOKCJDYW4gb25seSBzZXQgbGluayBzdXBlcnZpc2lvbiB0aW1lb3V0IGlmIGNlbnRyYWwgcm9sZTolcyIsCi0gICAgICAgICAgICAgUm9sZVRleHQobGluay5saW5rX3JvbGUpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19ERUJVRygiU2V0dGluZyBsaW5rIHN1cGVydmlzaW9uIHRpbWVvdXQ6JS4yZnMgcGVlcjolcyIsCi0gICAgICAgICAgICBkb3VibGUodGltZW91dCkgKiAwLjAxLCBQUklWQVRFX0FERFJFU1MobGluay5SZW1vdGVBZGRyZXNzKCkpKTsKLSAgbGluay5saW5rX3N1cGVyX3RvdXQgPSB0aW1lb3V0OwotICBidHNuZF9oY2ljX3dyaXRlX2xpbmtfc3VwZXJfdG91dChsaW5rLkhhbmRsZSgpLCB0aW1lb3V0KTsKLX0KLQotLyogMyBzZWNvbmRzIHRpbWVvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2VzICovCi0jZGVmaW5lIEJUTV9ERVZfUkVQTFlfVElNRU9VVF9NUyAoMyAqIDEwMDApCi0KLXZvaWQgQlRNX2FjbF9hZnRlcl9jb250cm9sbGVyX3N0YXJ0ZWQoY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyKSB7Ci0gIGludGVybmFsXy5idG1fc2V0X2RlZmF1bHRfbGlua19wb2xpY3koCi0gICAgICBIQ0lfRU5BQkxFX0NFTlRSQUxfUEVSSVBIRVJBTF9TV0lUQ0ggfCBIQ0lfRU5BQkxFX0hPTERfTU9ERSB8Ci0gICAgICBIQ0lfRU5BQkxFX1NOSUZGX01PREUgfCBIQ0lfRU5BQkxFX1BBUktfTU9ERSk7Ci0KLSAgLyogQ3JlYXRlIEFDTCBzdXBwb3J0ZWQgcGFja2V0IHR5cGVzIG1hc2sgKi8KLSAgdWludDE2X3QgYnRtX2FjbF9wa3RfdHlwZXNfc3VwcG9ydGVkID0KLSAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfREgxICsgSENJX1BLVF9UWVBFU19NQVNLX0RNMSk7Ci0KLSAgaWYgKGNvbnRyb2xsZXItPnN1cHBvcnRzXzNfc2xvdF9wYWNrZXRzKCkpCi0gICAgYnRtX2FjbF9wa3RfdHlwZXNfc3VwcG9ydGVkIHw9Ci0gICAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfREgzICsgSENJX1BLVF9UWVBFU19NQVNLX0RNMyk7Ci0KLSAgaWYgKGNvbnRyb2xsZXItPnN1cHBvcnRzXzVfc2xvdF9wYWNrZXRzKCkpCi0gICAgYnRtX2FjbF9wa3RfdHlwZXNfc3VwcG9ydGVkIHw9Ci0gICAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfREg1ICsgSENJX1BLVF9UWVBFU19NQVNLX0RNNSk7Ci0KLSAgLyogQWRkIGluIEVEUiByZWxhdGVkIEFDTCB0eXBlcyAqLwotICBpZiAoIWNvbnRyb2xsZXItPnN1cHBvcnRzX2NsYXNzaWNfMm1fcGh5KCkpIHsKLSAgICBidG1fYWNsX3BrdF90eXBlc19zdXBwb3J0ZWQgfD0KLSAgICAgICAgKEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RIMSArIEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RIMyArCi0gICAgICAgICBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fMl9ESDUpOwotICB9Ci0KLSAgaWYgKCFjb250cm9sbGVyLT5zdXBwb3J0c19jbGFzc2ljXzNtX3BoeSgpKSB7Ci0gICAgYnRtX2FjbF9wa3RfdHlwZXNfc3VwcG9ydGVkIHw9Ci0gICAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDEgKyBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDMgKwotICAgICAgICAgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREg1KTsKLSAgfQotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiAzIGFuZCA1IHNsb3QgcGFja2V0cyBhcmUgYXZhaWxhYmxlICovCi0gIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19jbGFzc2ljXzJtX3BoeSgpIHx8Ci0gICAgICBjb250cm9sbGVyLT5zdXBwb3J0c19jbGFzc2ljXzNtX3BoeSgpKSB7Ci0gICAgaWYgKCFjb250cm9sbGVyLT5zdXBwb3J0c18zX3Nsb3RfZWRyX3BhY2tldHMoKSkKLSAgICAgIGJ0bV9hY2xfcGt0X3R5cGVzX3N1cHBvcnRlZCB8PQotICAgICAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfTk9fMl9ESDMgKyBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDMpOwotCi0gICAgaWYgKCFjb250cm9sbGVyLT5zdXBwb3J0c181X3Nsb3RfZWRyX3BhY2tldHMoKSkKLSAgICAgIGJ0bV9hY2xfcGt0X3R5cGVzX3N1cHBvcnRlZCB8PQotICAgICAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfTk9fMl9ESDUgKyBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDUpOwotICB9Ci0gIGludGVybmFsXy5zZXRfZGVmYXVsdF9wYWNrZXRfdHlwZXNfc3VwcG9ydGVkKGJ0bV9hY2xfcGt0X3R5cGVzX3N1cHBvcnRlZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgIGJ0bV9iZGFfdG9fYWNsCi0gKgotICogRGVzY3JpcHRpb24gICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgRklSU1QgYWNsX2RiIGVudHJ5IGZvciB0aGUgcGFzc2VkCi0gKiAgICAgICAgICAgICAgICAgQkRBLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICBiZGEgOiBCRCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IDogUGh5c2ljYWwgdHJhbnNwb3J0IHVzZWQgZm9yIEFDTCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgKEJSL0VEUiBvciBMRSkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgUmV0dXJucyBwb2ludGVyIHRvIHRoZSBBQ0wgREIgZm9yIHRoZSByZXF1ZXN0ZWQgQkRBIGlmIGZvdW5kLgotICogICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QUNMX0NPTk4qIFN0YWNrQWNsQnRtQWNsOjpidG1fYmRhX3RvX2FjbChjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gJmJ0bV9jYi5hY2xfY2JfLmFjbF9kYlswXTsKLSAgZm9yICh1aW50OF90IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTDJDQVBfTElOS1M7IGluZGV4KyssIHBfYWNsKyspIHsKLSAgICBpZiAoKHBfYWNsLT5pbl91c2UpICYmIHBfYWNsLT5yZW1vdGVfYWRkciA9PSBiZGEgJiYKLSAgICAgICAgcF9hY2wtPnRyYW5zcG9ydCA9PSB0cmFuc3BvcnQpIHsKLSAgICAgIHJldHVybiBwX2FjbDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXRBQ0xfQ09OTiogYWNsX2dldF9jb25uZWN0aW9uX2Zyb21fYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHJldHVybiBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2woYmRfYWRkciwgdHJhbnNwb3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9oYW5kbGVfdG9fYWNsX2luZGV4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEZJUlNUIGFjbF9kYiBlbnRyeSBmb3IgdGhlIHBhc3NlZAotICogICAgICAgICAgICAgICAgICBoY2lfaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgaW5kZXggdG8gdGhlIGFjbF9kYiBvciBNQVhfTDJDQVBfTElOS1MuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRtX2hhbmRsZV90b19hY2xfaW5kZXgodWludDE2X3QgaGNpX2hhbmRsZSkgewotICB0QUNMX0NPTk4qIHAgPSAmYnRtX2NiLmFjbF9jYl8uYWNsX2RiWzBdOwotICB1aW50OF90IHh4OwotICBmb3IgKHh4ID0gMDsgeHggPCBNQVhfTDJDQVBfTElOS1M7IHh4KyssIHArKykgewotICAgIGlmICgocC0+aW5fdXNlKSAmJiAocC0+aGNpX2hhbmRsZSA9PSBoY2lfaGFuZGxlKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm8gQkQgQWRkciBmb3VuZCAqLwotICByZXR1cm4gKHh4KTsKLX0KLQotdEFDTF9DT05OKiBTdGFja0FjbEJ0bUFjbDo6YWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgdWludDhfdCBpbmRleCA9IGJ0bV9oYW5kbGVfdG9fYWNsX2luZGV4KGhjaV9oYW5kbGUpOwotICBpZiAoaW5kZXggPj0gTUFYX0wyQ0FQX0xJTktTKSByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuICZidG1fY2IuYWNsX2NiXy5hY2xfZGJbaW5kZXhdOwotfQotCi10QUNMX0NPTk4qIGFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgcmV0dXJuIGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLX0KLQotdm9pZCBidG1fYWNsX3Byb2Nlc3Nfc2NhX2NtcGxfcGt0KHVpbnQ4X3QgbGVuLCB1aW50OF90KiBkYXRhKSB7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDhfdCBzY2E7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIGRhdGEpOwotCi0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICBMT0dfV0FSTigiUGVlciBTQ0EgQ29tbWFuZCBjb21wbGV0ZSBmYWlsZWQ6JXMiLAotICAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBkYXRhKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHNjYSwgZGF0YSk7Ci0KLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotICBwX2FjbC0+c2NhID0gc2NhOwotfQotCi10QUNMX0NPTk4qIFN0YWNrQWNsQnRtQWNsOjphY2xfYWxsb2NhdGVfY29ubmVjdGlvbigpIHsKLSAgdEFDTF9DT05OKiBwX2FjbCA9ICZidG1fY2IuYWNsX2NiXy5hY2xfZGJbMF07Ci0gIGZvciAodWludDhfdCB4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwX2FjbCsrKSB7Ci0gICAgaWYgKCFwX2FjbC0+aW5fdXNlKSB7Ci0gICAgICByZXR1cm4gcF9hY2w7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIGJ0bV9hY2xfY3JlYXRlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbGlua19yb2xlLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfYWNsICE9ICh0QUNMX0NPTk4qKU5VTEwpIHsKLSAgICBwX2FjbC0+aGNpX2hhbmRsZSA9IGhjaV9oYW5kbGU7Ci0gICAgcF9hY2wtPmxpbmtfcm9sZSA9IGxpbmtfcm9sZTsKLSAgICBwX2FjbC0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgICAgYnRtX3NldF9saW5rX3BvbGljeShwX2FjbCwgYnRtX2NiLmFjbF9jYl8uRGVmYXVsdExpbmtQb2xpY3koKSk7Ci0gICAgfQotICAgIExPR19XQVJOKAotICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkdXBsaWNhdGUgYWNsIHdoZW4gb25lIGFscmVhZHkgZXhpc3RzIGhhbmRsZTolaHUiCi0gICAgICAgICIgcm9sZTolcyB0cmFuc3BvcnQ6JXMiLAotICAgICAgICBoY2lfaGFuZGxlLCBSb2xlVGV4dChsaW5rX3JvbGUpLmNfc3RyKCksCi0gICAgICAgIGJ0X3RyYW5zcG9ydF90ZXh0KHRyYW5zcG9ydCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2FsbG9jYXRlX2Nvbm5lY3Rpb24oKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfYWNsLT5pbl91c2UgPSB0cnVlOwotICBwX2FjbC0+aGNpX2hhbmRsZSA9IGhjaV9oYW5kbGU7Ci0gIHBfYWNsLT5saW5rX3JvbGUgPSBsaW5rX3JvbGU7Ci0gIHBfYWNsLT5saW5rX3VwX2lzc3VlZCA9IGZhbHNlOwotICBwX2FjbC0+cmVtb3RlX2FkZHIgPSBiZGE7Ci0gIHBfYWNsLT5zY2EgPSAweEZGOwotICBwX2FjbC0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICBwX2FjbC0+c3dpdGNoX3JvbGVfZmFpbGVkX2F0dGVtcHRzID0gMDsKLSAgcF9hY2wtPnJlc2V0X3N3aXRjaF9yb2xlKCk7Ci0gIEJUTV9QTV9PbkNvbm5lY3RlZChoY2lfaGFuZGxlLCBiZGEpOwotCi0gIExPR19ERUJVRygKLSAgICAgICJDcmVhdGVkIG5ldyBBQ0wgY29ubmVjdGlvbiBwZWVyOiVzIHJvbGU6JXMgaGFuZGxlOjB4JTA0eCB0cmFuc3BvcnQ6JXMiLAotICAgICAgUFJJVkFURV9BRERSRVNTKGJkYSksIFJvbGVUZXh0KHBfYWNsLT5saW5rX3JvbGUpLmNfc3RyKCksIGhjaV9oYW5kbGUsCi0gICAgICBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCkpOwotCi0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgIGJ0bV9zZXRfbGlua19wb2xpY3kocF9hY2wsIGJ0bV9jYi5hY2xfY2JfLkRlZmF1bHRMaW5rUG9saWN5KCkpOwotICB9Ci0KLSAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBidG1fYmxlX3JlZnJlc2hfbG9jYWxfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgICAgIGJkYSwgYnRtX2NiLmJsZV9jdHJfY2IuYWRkcl9tZ250X2NiLnByaXZhdGVfYWRkcik7Ci0gIH0KLSAgLyogaWYgQlIvRURSIGRvIHNvbWV0aGluZyBtb3JlICovCi0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgIGJ0c25kX2hjaWNfcmVhZF9ybXRfY2xrX29mZnNldChoY2lfaGFuZGxlKTsKLSAgICBpZiAoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpICYmCi0gICAgICAgICFibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICAgIC8vIEdEIEwyY2FwIGFuZCBHRCBBY2wgcmVhZCB0aGlzIGF1dG9tYXRpY2FsbHkKLSAgICAgIGJ0c25kX2hjaWNfcm10X3Zlcl9yZXEoaGNpX2hhbmRsZSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBidG1fYmxlX2dldF9hY2xfcmVtb3RlX2FkZHIoaGNpX2hhbmRsZSwgcF9hY2wtPmFjdGl2ZV9yZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfYWNsLT5hY3RpdmVfcmVtb3RlX2FkZHJfdHlwZSk7Ci0KLSAgICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkKLSAgICAgICAgICAgIC0+c3VwcG9ydHNfYmxlX3BlcmlwaGVyYWxfaW5pdGlhdGVkX2ZlYXR1cmVfZXhjaGFuZ2UoKSB8fAotICAgICAgICBsaW5rX3JvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgICAgYnRzbmRfaGNpY19ibGVfcmVhZF9yZW1vdGVfZmVhdChwX2FjbC0+aGNpX2hhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludGVybmFsXy5idG1fZXN0YWJsaXNoX2NvbnRpbnVlKHBfYWNsKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBidG1fYWNsX3VwZGF0ZV9jb25uX2FkZHIodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcF9hY2wtPmNvbm5fYWRkciA9IGFkZHJlc3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYWNsX3JlbW92ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEwyQ0FQIHdoZW4gYW4gQUNMIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgaXMgcmVtb3ZlZC4gU2luY2Ugb25seSBMMkNBUCBjcmVhdGVzIEFDTCBsaW5rcywgd2UgdXNlCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBMMkNBUCBsaW5rIGluZGV4IGFzIG91ciBpbmRleCBpbnRvIHRoZSBjb250cm9sIGJsb2Nrcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYWNsX3JlbW92ZWQodWludDE2X3QgaGFuZGxlKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcF9hY2wtPmluX3VzZSA9IGZhbHNlOwotICBOb3RpZnlBY2xMaW5rRG93bigqcF9hY2wpOwotICBwX2FjbC0+UmVzZXQoKTsKLSAgQlRNX1BNX09uRGlzY29ubmVjdGVkKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYWNsX2RldmljZV9kb3duCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsb2NhbCBkZXZpY2UgaXMgZGVlbWVkCi0gKiAgICAgICAgICAgICAgICAgIHRvIGJlIGRvd24uIEl0IG5vdGlmaWVzIEwyQ0FQIG9mIHRoZSBmYWlsdXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9hY2xfZGV2aWNlX2Rvd24odm9pZCkgewotICB0QUNMX0NPTk4qIHAgPSAmYnRtX2NiLmFjbF9jYl8uYWNsX2RiWzBdOwotICB1aW50MTZfdCB4eDsKLSAgZm9yICh4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwKyspIHsKLSAgICBpZiAocC0+aW5fdXNlKSB7Ci0gICAgICBsMmNfbGlua19oY2lfZGlzY19jb21wKHAtPmhjaV9oYW5kbGUsIEhDSV9FUlJfSFdfRkFJTFVSRSk7Ci0gICAgfQotICB9Ci0gIEJUTV9kYl9yZXNldCgpOwotfQotCi12b2lkIGJ0bV9hY2xfc2V0X3BhZ2luZyhib29sIHZhbHVlKSB7IGJ0bV9jYi5pc19wYWdpbmcgPSB2YWx1ZTsgfQotCi12b2lkIGJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzKHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIGJ0bV9jYi5pc19pbnF1aXJ5ID0gc3RhdHVzID09IEJUTV9JTlFVSVJZX1NUQVJURUQ7Ci0gIEJUSUZfZG1fcmVwb3J0X2lucXVpcnlfc3RhdHVzX2NoYW5nZShzdGF0dXMpOwotfQotCi10QlRNX1NUQVRVUyBCVE1fR2V0Um9sZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwgdEhDSV9ST0xFKiBwX3JvbGUpIHsKLSAgaWYgKHBfcm9sZSA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIEJUTV9JTExFR0FMX1ZBTFVFOwotICB9Ci0gICpwX3JvbGUgPSBIQ0lfUk9MRV9VTktOT1dOOwotCi0gIHRBQ0xfQ09OTiogcF9hY2wgPQotICAgICAgaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybiBCVE1fVU5LTk9XTl9BRERSOwotICB9Ci0gICpwX3JvbGUgPSBwX2FjbC0+bGlua19yb2xlOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU3dpdGNoUm9sZVRvQ2VudHJhbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3dpdGNoIHJvbGUgYmV0d2VlbiBjZW50cmFsIGFuZAotICogICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLiAgSWYgcm9sZSBpcyBhbHJlYWR5IHNldCBpdCB3aWxsIGRvIG5vdGhpbmcuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBhbHJlYWR5IGluIHNwZWNpZmllZCByb2xlLgotICogICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgY29tbWFuZCBpc3N1ZWQgdG8gY29udHJvbGxlci4KLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gaXNzdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgbm8gYWN0aXZlIGxpbmsgd2l0aCBiZCBhZGRyIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBCVE1fTU9ERV9VTlNVUFBPUlRFRCBpZiBsb2NhbCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCByb2xlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGluZwotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyBub3QgY29tcGxldGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9Td2l0Y2hSb2xlVG9DZW50cmFsKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Td2l0Y2hSb2xlVG9DZW50cmFsKHJlbW90ZV9iZF9hZGRyKTsKLSAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gIH0KLSAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfY2VudHJhbF9wZXJpcGhlcmFsX3JvbGVfc3dpdGNoKCkpIHsKLSAgICBMT0dfSU5GTygiTG9jYWwgY29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IHJvbGUgc3dpdGNoaW5nIik7Ci0gICAgcmV0dXJuIEJUTV9NT0RFX1VOU1VQUE9SVEVEOwotICB9Ci0KLSAgdEFDTF9DT05OKiBwX2FjbCA9Ci0gICAgICBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocmVtb3RlX2JkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gIH0KLQotICBpZiAocF9hY2wtPmxpbmtfcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgTE9HX0lORk8oIlJlcXVlc3RlZCByb2xlIGlzIGFscmVhZHkgaW4gZWZmZWN0Iik7Ci0gICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICB9Ci0KLSAgaWYgKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfUk9MRV9TV0lUQ0gsICZyZW1vdGVfYmRfYWRkcikpIHsKLSAgICBMT0dfSU5GTygiUmVtb3RlIGRldmljZSBpcyBvbiBsaXN0IHByZXZlbnRpbmcgcm9sZSBzd2l0Y2giKTsKLSAgICByZXR1cm4gQlRNX0RFVl9SRVNUUklDVF9MSVNURUQ7Ci0gIH0KLQotICBpZiAoQlRNX0lzU2NvQWN0aXZlQnlCZGFkZHIocmVtb3RlX2JkX2FkZHIpKSB7Ci0gICAgTE9HX0lORk8oIkFuIGFjdGl2ZSBTQ08gdG8gZGV2aWNlIHByZXZlbnRzIHJvbGUgc3dpdGNoIGF0IHRoaXMgdGltZSIpOwotICAgIHJldHVybiBCVE1fTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgaWYgKCFwX2FjbC0+aXNfc3dpdGNoX3JvbGVfaWRsZSgpKSB7Ci0gICAgTE9HX0lORk8oIlJvbGUgc3dpdGNoIGlzIGFscmVhZHkgcHJvZ3Jlc3MiKTsKLSAgICByZXR1cm4gQlRNX0JVU1k7Ci0gIH0KLQotICB0QlRNX1BNX01PREUgcHdyX21vZGU7Ci0gIGlmICghQlRNX1JlYWRQb3dlck1vZGUocF9hY2wtPnJlbW90ZV9hZGRyLCAmcHdyX21vZGUpKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJVbmFibGUgdG8gZmluZCBkZXZpY2UgdG8gcmVhZCBjdXJyZW50IHBvd2VyIG1vZGUgcHJpb3IgdG8gcm9sZSAiCi0gICAgICAgICJzd2l0Y2giKTsKLSAgICByZXR1cm4gQlRNX1VOS05PV05fQUREUjsKLSAgfTsKLQotICBpZiAocHdyX21vZGUgPT0gQlRNX1BNX01EX1BBUksgfHwgcHdyX21vZGUgPT0gQlRNX1BNX01EX1NOSUZGKSB7Ci0gICAgaWYgKCFCVE1fU2V0TGlua1BvbGljeUFjdGl2ZU1vZGUocF9hY2wtPnJlbW90ZV9hZGRyKSkgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBzZXQgbGluayBwb2xpY3kgYWN0aXZlIGJlZm9yZSBhdHRlbXB0aW5nIHN3aXRjaCIpOwotICAgICAgcmV0dXJuIEJUTV9XUk9OR19NT0RFOwotICAgIH0KLSAgICBwX2FjbC0+c2V0X3N3aXRjaF9yb2xlX2NoYW5naW5nKCk7Ci0gIH0KLSAgLyogc29tZSBkZXZpY2VzIGRvIG5vdCBzdXBwb3J0IHN3aXRjaCB3aGlsZSBlbmNyeXB0aW9uIGlzIG9uICovCi0gIGVsc2UgewotICAgIGlmIChwX2FjbC0+aXNfZW5jcnlwdGVkICYmICFJc0VwckF2YWlsYWJsZSgqcF9hY2wpKSB7Ci0gICAgICAvKiBieXBhc3MgdHVybmluZyBvZmYgZW5jcnlwdGlvbiBpZiBjaGFuZ2UgbGluayBrZXkgaXMgYWxyZWFkeSBkb2luZyBpdCAqLwotICAgICAgcF9hY2wtPnNldF9lbmNyeXB0aW9uX29mZigpOwotICAgICAgcF9hY2wtPnNldF9zd2l0Y2hfcm9sZV9lbmNyeXB0aW9uX29mZigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbnRlcm5hbF8uaGNpX3N0YXJ0X3JvbGVfc3dpdGNoX3RvX2NlbnRyYWwoKnBfYWNsKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB3aGVuIGVuY3J5cHRpb24gb2YgdGhlIGNvbm5lY3Rpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgY29tcGxldGVkIGJ5IHRoZSBMTS4gIENoZWNrcyB0byBzZWUgaWYgYSByb2xlIHN3aXRjaCBvcgotICogICAgICAgICAgICAgICAgICBjaGFuZ2Ugb2YgbGluayBrZXkgd2FzIGFjdGl2ZSBhbmQgaW5pdGlhdGVzIG9yIGNvbnRpbnVlcwotICogICAgICAgICAgICAgICAgICBwcm9jZXNzIGlmIG5lZWRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYWNsX2VuY3J5cHRfY2hhbmdlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNyX2VuYWJsZSkgewotICB0QUNMX0NPTk4qIHAgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci0gIGlmIChwID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAtPmlzX2VuY3J5cHRlZCA9IGVuY3JfZW5hYmxlOwotCi0gIC8qIFByb2Nlc3MgUm9sZSBTd2l0Y2ggaWYgYWN0aXZlICovCi0gIGlmIChwLT5pc19zd2l0Y2hfcm9sZV9lbmNyeXB0aW9uX29mZigpKSB7Ci0gICAgLyogaWYgZW5jcnlwdGlvbiB0dXJuIG9mZiBmYWlsZWQgd2Ugc3RpbGwgd2lsbCB0cnkgdG8gc3dpdGNoIHJvbGUgKi8KLSAgICBpZiAoZW5jcl9lbmFibGUpIHsKLSAgICAgIHAtPnNldF9lbmNyeXB0aW9uX2lkbGUoKTsKLSAgICAgIHAtPnJlc2V0X3N3aXRjaF9yb2xlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHAtPnNldF9lbmNyeXB0aW9uX3N3aXRjaGluZygpOwotICAgICAgcC0+c2V0X3N3aXRjaF9yb2xlX3N3aXRjaGluZygpOwotICAgIH0KLSAgICBpbnRlcm5hbF8uaGNpX3N0YXJ0X3JvbGVfc3dpdGNoX3RvX2NlbnRyYWwoKnApOwotICB9Ci0gIC8qIEZpbmlzaGVkIGVuYWJsaW5nIEVuY3J5cHRpb24gYWZ0ZXIgcm9sZSBzd2l0Y2ggKi8KLSAgZWxzZSBpZiAocC0+aXNfc3dpdGNoX3JvbGVfZW5jcnlwdGlvbl9vbigpKSB7Ci0gICAgcC0+cmVzZXRfc3dpdGNoX3JvbGUoKTsKLSAgICBwLT5zZXRfZW5jcnlwdGlvbl9pZGxlKCk7Ci0gICAgTm90aWZ5QWNsUm9sZVN3aXRjaENvbXBsZXRlKAotICAgICAgICBidG1fY2IuYWNsX2NiXy5zd2l0Y2hfcm9sZV9yZWZfZGF0YS5yZW1vdGVfYmRfYWRkciwKLSAgICAgICAgYnRtX2NiLmFjbF9jYl8uc3dpdGNoX3JvbGVfcmVmX2RhdGEucm9sZSwKLSAgICAgICAgYnRtX2NiLmFjbF9jYl8uc3dpdGNoX3JvbGVfcmVmX2RhdGEuaGNpX3N0YXR1cyk7Ci0KLSAgICAvKiBJZiBhIGRpc2Nvbm5lY3QgaXMgcGVuZGluZywgaXNzdWUgaXQgbm93IHRoYXQgcm9sZSBzd2l0Y2ggaGFzIGNvbXBsZXRlZAotICAgICAqLwotICAgIGlmIChwLT5yc19kaXNjX3BlbmRpbmcgPT0gQlRNX1NFQ19ESVNDX1BFTkRJTkcpIHsKLSAgICAgIGhjaV9idHNuZF9oY2ljX2Rpc2Nvbm5lY3QoKnAsIEhDSV9FUlJfUEVFUl9VU0VSKTsKLSAgICB9Ci0gICAgcC0+cnNfZGlzY19wZW5kaW5nID0gQlRNX1NFQ19SU19OT1RfUEVORElORzsgLyogcmVzZXQgZmxhZyAqLwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX2xpbmtfcG9saWN5KHRMSU5LX1BPTElDWSogc2V0dGluZ3MpIHsKLSAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgaWYgKCgqc2V0dGluZ3MgJiBIQ0lfRU5BQkxFX0NFTlRSQUxfUEVSSVBIRVJBTF9TV0lUQ0gpICYmCi0gICAgICAoIWNvbnRyb2xsZXItPnN1cHBvcnRzX3JvbGVfc3dpdGNoKCkpKSB7Ci0gICAgKnNldHRpbmdzICY9ICh+SENJX0VOQUJMRV9DRU5UUkFMX1BFUklQSEVSQUxfU1dJVENIKTsKLSAgICBMT0dfSU5GTygiUm9sZSBzd2l0Y2ggbm90IHN1cHBvcnRlZCAoc2V0dGluZ3M6IDB4JTA0eCkiLCAqc2V0dGluZ3MpOwotICB9Ci0gIGlmICgoKnNldHRpbmdzICYgSENJX0VOQUJMRV9IT0xEX01PREUpICYmCi0gICAgICAoIWNvbnRyb2xsZXItPnN1cHBvcnRzX2hvbGRfbW9kZSgpKSkgewotICAgICpzZXR0aW5ncyAmPSAofkhDSV9FTkFCTEVfSE9MRF9NT0RFKTsKLSAgICBMT0dfSU5GTygiaG9sZCBub3Qgc3VwcG9ydGVkIChzZXR0aW5nczogMHglMDR4KSIsICpzZXR0aW5ncyk7Ci0gIH0KLSAgaWYgKCgqc2V0dGluZ3MgJiBIQ0lfRU5BQkxFX1NOSUZGX01PREUpICYmCi0gICAgICAoIWNvbnRyb2xsZXItPnN1cHBvcnRzX3NuaWZmX21vZGUoKSkpIHsKLSAgICAqc2V0dGluZ3MgJj0gKH5IQ0lfRU5BQkxFX1NOSUZGX01PREUpOwotICAgIExPR19JTkZPKCJzbmlmZiBub3Qgc3VwcG9ydGVkIChzZXR0aW5nczogMHglMDR4KSIsICpzZXR0aW5ncyk7Ci0gIH0KLSAgaWYgKCgqc2V0dGluZ3MgJiBIQ0lfRU5BQkxFX1BBUktfTU9ERSkgJiYKLSAgICAgICghY29udHJvbGxlci0+c3VwcG9ydHNfcGFya19tb2RlKCkpKSB7Ci0gICAgKnNldHRpbmdzICY9ICh+SENJX0VOQUJMRV9QQVJLX01PREUpOwotICAgIExPR19JTkZPKCJwYXJrIG5vdCBzdXBwb3J0ZWQgKHNldHRpbmdzOiAweCUwNHgpIiwgKnNldHRpbmdzKTsKLSAgfQotfQotCi12b2lkIGJ0bV9zZXRfbGlua19wb2xpY3kodEFDTF9DT05OKiBjb25uLCB0TElOS19QT0xJQ1kgcG9saWN5KSB7Ci0gIGNvbm4tPmxpbmtfcG9saWN5ID0gcG9saWN5OwotICBjaGVja19saW5rX3BvbGljeSgmY29ubi0+bGlua19wb2xpY3kpOwotICBpZiAoKGNvbm4tPmxpbmtfcG9saWN5ICYgSENJX0VOQUJMRV9DRU5UUkFMX1BFUklQSEVSQUxfU1dJVENIKSAmJgotICAgICAgaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfRElTQUJMRV9TTklGRiwgJihjb25uLT5yZW1vdGVfYWRkcikpKSB7Ci0gICAgY29ubi0+bGlua19wb2xpY3kgJj0gKH5IQ0lfRU5BQkxFX1NOSUZGX01PREUpOwotICB9Ci0gIGJ0c25kX2hjaWNfd3JpdGVfcG9saWN5X3NldChjb25uLT5oY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvbm4tPmxpbmtfcG9saWN5KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV90b2dnbGVfcG9saWN5X29uX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmxhZykgewotICBhdXRvIGNvbm4gPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocGVlcl9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKCFjb25uKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYnRtX3NldF9saW5rX3BvbGljeShjb25uLCBjb25uLT5saW5rX3BvbGljeSB8IGZsYWcpOwotfQotCi1zdGF0aWMgdm9pZCBidG1fdG9nZ2xlX3BvbGljeV9vZmZfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmxhZykgewotICBhdXRvIGNvbm4gPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocGVlcl9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKCFjb25uKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYnRtX3NldF9saW5rX3BvbGljeShjb25uLCBjb25uLT5saW5rX3BvbGljeSAmIH5mbGFnKTsKLX0KLQotYm9vbCBCVE1faXNfc25pZmZfYWxsb3dlZF9mb3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGF1dG8gY29ubiA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChwZWVyX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAoIWNvbm4pIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gY29ubi0+bGlua19wb2xpY3kgJiBIQ0lfRU5BQkxFX1NOSUZGX01PREU7Ci19Ci0KLXZvaWQgQlRNX3VuYmxvY2tfc25pZmZfbW9kZV9mb3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGJ0bV90b2dnbGVfcG9saWN5X29uX2ZvcihwZWVyX2FkZHIsIEhDSV9FTkFCTEVfU05JRkZfTU9ERSk7Ci19Ci0KLXZvaWQgQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBidG1fdG9nZ2xlX3BvbGljeV9vZmZfZm9yKHBlZXJfYWRkciwgSENJX0VOQUJMRV9TTklGRl9NT0RFKTsKLX0KLQotdm9pZCBCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9mb3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIGJ0bV90b2dnbGVfcG9saWN5X29uX2ZvcihwZWVyX2FkZHIsIEhDSV9FTkFCTEVfQ0VOVFJBTF9QRVJJUEhFUkFMX1NXSVRDSCk7Ci19Ci0KLXZvaWQgQlRNX2Jsb2NrX3JvbGVfc3dpdGNoX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgYnRtX3RvZ2dsZV9wb2xpY3lfb2ZmX2ZvcihwZWVyX2FkZHIsIEhDSV9FTkFCTEVfQ0VOVFJBTF9QRVJJUEhFUkFMX1NXSVRDSCk7Ci19Ci0KLXZvaWQgQlRNX3VuYmxvY2tfcm9sZV9zd2l0Y2hfYW5kX3NuaWZmX21vZGVfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBidG1fdG9nZ2xlX3BvbGljeV9vbl9mb3IoCi0gICAgICBwZWVyX2FkZHIsIEhDSV9FTkFCTEVfU05JRkZfTU9ERSB8IEhDSV9FTkFCTEVfQ0VOVFJBTF9QRVJJUEhFUkFMX1NXSVRDSCk7Ci19Ci0KLXZvaWQgQlRNX2Jsb2NrX3JvbGVfc3dpdGNoX2FuZF9zbmlmZl9tb2RlX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgYnRtX3RvZ2dsZV9wb2xpY3lfb2ZmX2ZvcigKLSAgICAgIHBlZXJfYWRkciwgSENJX0VOQUJMRV9TTklGRl9NT0RFIHwgSENJX0VOQUJMRV9DRU5UUkFMX1BFUklQSEVSQUxfU1dJVENIKTsKLX0KLQotdm9pZCBTdGFja0FjbEJ0bUFjbDo6YnRtX3NldF9kZWZhdWx0X2xpbmtfcG9saWN5KHRMSU5LX1BPTElDWSBzZXR0aW5ncykgewotICBjaGVja19saW5rX3BvbGljeSgmc2V0dGluZ3MpOwotICBidG1fY2IuYWNsX2NiXy5idG1fZGVmX2xpbmtfcG9saWN5ID0gc2V0dGluZ3M7Ci0gIGJ0c25kX2hjaWNfd3JpdGVfZGVmX3BvbGljeV9zZXQoc2V0dGluZ3MpOwotfQotCi12b2lkIEJUTV9kZWZhdWx0X3VuYmxvY2tfcm9sZV9zd2l0Y2goKSB7Ci0gIGludGVybmFsXy5idG1fc2V0X2RlZmF1bHRfbGlua19wb2xpY3koYnRtX2NiLmFjbF9jYl8uRGVmYXVsdExpbmtQb2xpY3koKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VOQUJMRV9DRU5UUkFMX1BFUklQSEVSQUxfU1dJVENIKTsKLX0KLQotdm9pZCBCVE1fZGVmYXVsdF9ibG9ja19yb2xlX3N3aXRjaCgpIHsKLSAgaW50ZXJuYWxfLmJ0bV9zZXRfZGVmYXVsdF9saW5rX3BvbGljeShidG1fY2IuYWNsX2NiXy5EZWZhdWx0TGlua1BvbGljeSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+SENJX0VOQUJMRV9DRU5UUkFMX1BFUklQSEVSQUxfU1dJVENIKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgSENJIGZvciB0aGUgcmVtb3RlIHZlcnNpb24gaW5mby4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbWF5YmVfY2hhaW5fbW9yZV9jb21tYW5kc19hZnRlcl9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlKAotICAgIHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgdEFDTF9DT05OKiBwX2FjbF9jYiA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsX2NiID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiUmVjZWl2ZWQgcmVtb3RlIHZlcnNpb24gY29tcGxldGUgZm9yIHVua25vd24gZGV2aWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChwX2FjbF9jYi0+dHJhbnNwb3J0KSB7Ci0gICAgY2FzZSBCVF9UUkFOU1BPUlRfTEU6Ci0gICAgICBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb24ocF9hY2xfY2ItPnJlbW90ZV9hZGRyKTsKLSAgICAgIGwyY2JsZV91c2VfcHJlZmVycmVkX2Nvbm5fcGFyYW1zKHBfYWNsX2NiLT5yZW1vdGVfYWRkcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1RSQU5TUE9SVF9CUl9FRFI6Ci0gICAgICAvKioKLSAgICAgICAqIFdoZW4gcnVubmluZyBsZWdhY3kgc3RhY2sgY29udGludWUgY2hhaW4gb2YgZXhlY3V0aW5nIHZhcmlvdXMKLSAgICAgICAqIHJlYWQgY29tbWFuZHMuICBTa2lwIHdoZW4gZ2RfYWNsIGlzIGVuYWJsZWQgYmVjYXVzZSB0aGF0Ci0gICAgICAgKiBtb2R1bGUgaGFuZGxlcyBhbGwgcmVtb3RlIHJlYWQgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAqLwotICAgICAgaWYgKCFibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgICAgICAgIGludGVybmFsXy5idG1fcmVhZF9yZW1vdGVfZmVhdHVyZXMocF9hY2xfY2ItPmhjaV9oYW5kbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHRyYW5zcG9ydDolcyBkZXZpY2U6JXMiLAotICAgICAgICAgICAgICAgIGJ0X3RyYW5zcG9ydF90ZXh0KHBfYWNsX2NiLT50cmFuc3BvcnQpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBfYWNsX2NiLT5yZW1vdGVfYWRkcikpOwotICB9Ci19Ci0KLXZvaWQgYnRtX3Byb2Nlc3NfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsbXBfc3VidmVyc2lvbikgewotICB0QUNMX0NPTk4qIHBfYWNsX2NiID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9hY2xfY2IgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCByZW1vdGUgdmVyc2lvbiBjb21wbGV0ZSBmb3IgdW5rbm93biBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgcF9hY2xfY2ItPnJlbW90ZV92ZXJzaW9uX2luZm8ubG1wX3ZlcnNpb24gPSBsbXBfdmVyc2lvbjsKLSAgICBwX2FjbF9jYi0+cmVtb3RlX3ZlcnNpb25faW5mby5tYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7Ci0gICAgcF9hY2xfY2ItPnJlbW90ZV92ZXJzaW9uX2luZm8ubG1wX3N1YnZlcnNpb24gPSBsbXBfc3VidmVyc2lvbjsKLSAgICBwX2FjbF9jYi0+cmVtb3RlX3ZlcnNpb25faW5mby52YWxpZCA9IHRydWU7Ci0gICAgQlRNX3VwZGF0ZV92ZXJzaW9uX2luZm8ocF9hY2xfY2ItPlJlbW90ZUFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FjbF9jYi0+cmVtb3RlX3ZlcnNpb25faW5mbyk7Ci0KLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TG9nUmVtb3RlVmVyc2lvbkluZm8oaGFuZGxlLCBzdGF0dXMsIGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXIsIGxtcF9zdWJ2ZXJzaW9uKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TG9nUmVtb3RlVmVyc2lvbkluZm8oaGFuZGxlLCBzdGF0dXMsIDAsIDAsIDApOwotICB9Ci19Ci0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGVfcmF3KHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDhfdCBsbXBfdmVyc2lvbjsKLSAgdWludDE2X3QgbWFudWZhY3R1cmVyOwotICB1aW50MTZfdCBsbXBfc3VidmVyc2lvbjsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgobG1wX3ZlcnNpb24sIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KG1hbnVmYWN0dXJlciwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYobG1wX3N1YnZlcnNpb24sIHApOwotCi0gIEFTU0VSVF9MT0coIWJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSwKLSAgICAgICAgICAgICAiZ2QgYWNsIGxheWVyIHNob3VsZCBiZSByZWNlaXZpbmcgdGhpcyBjb21wbGV0aW9uIik7Ci0gIGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXIsIGxtcF92ZXJzaW9uKTsKLX0KLQotdm9pZCBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsbXBfc3VidmVyc2lvbikgewotICBidG1fcHJvY2Vzc19yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZShzdGF0dXMsIGhhbmRsZSwgbG1wX3ZlcnNpb24sIG1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1wX3N1YnZlcnNpb24pOwotICBtYXliZV9jaGFpbl9tb3JlX2NvbW1hbmRzX2FmdGVyX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUoc3RhdHVzLCBoYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Byb2Nlc3NfcmVtb3RlX2V4dF9mZWF0dXJlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9jYWwgZnVuY3Rpb24gY2FsbGVkIHRvIHByb2Nlc3MgYWxsIGV4dGVuZGVkIGZlYXR1cmVzIHBhZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHJlYWQgZnJvbSBhIHJlbW90ZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3Byb2Nlc3NfcmVtb3RlX2V4dF9mZWF0dXJlcyh0QUNMX0NPTk4qIHBfYWNsX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyKSB7Ci0gIENIRUNLKHBfYWNsX2NiICE9IG51bGxwdHIpOwotICBpZiAoIXBfYWNsX2NiLT5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkW21heF9wYWdlX251bWJlcl0pIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkNoZWNraW5nIHJlbW90ZSBmZWF0dXJlcyBidXQgcmVtb3RlIGZlYXR1cmUgcmVhZCBpcyAiCi0gICAgICAgICJpbmNvbXBsZXRlIik7Ci0gIH0KLQotICBib29sIHNzcF9zdXBwb3J0ZWQgPQotICAgICAgSENJX1NTUF9IT1NUX1NVUFBPUlRFRChwX2FjbF9jYi0+cGVlcl9sbXBfZmVhdHVyZV9wYWdlc1sxXSk7Ci0gIGJvb2wgc2VjdXJlX2Nvbm5lY3Rpb25zX3N1cHBvcnRlZCA9Ci0gICAgICBIQ0lfU0NfSE9TVF9TVVBQT1JURUQocF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbMV0pOwotICBib29sIHJvbGVfc3dpdGNoX3N1cHBvcnRlZCA9Ci0gICAgICBIQ0lfU1dJVENIX1NVUFBPUlRFRChwX2FjbF9jYi0+cGVlcl9sbXBfZmVhdHVyZV9wYWdlc1swXSk7Ci0gIGJvb2wgYnJfZWRyX3N1cHBvcnRlZCA9Ci0gICAgICAhSENJX0JSRURSX05PVF9TUFRfU1VQUE9SVEVEKHBfYWNsX2NiLT5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzWzBdKTsKLSAgYm9vbCBsZV9zdXBwb3J0ZWQgPQotICAgICAgSENJX0xFX1NQVF9TVVBQT1JURUQocF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbMF0pICYmCi0gICAgICBIQ0lfTEVfSE9TVF9TVVBQT1JURUQocF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbMV0pOwotICBidG1fc2VjX3NldF9wZWVyX3NlY19jYXBzKHBfYWNsX2NiLT5oY2lfaGFuZGxlLCBzc3Bfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9jb25uZWN0aW9uc19zdXBwb3J0ZWQsIHJvbGVfc3dpdGNoX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicl9lZHJfc3VwcG9ydGVkLCBsZV9zdXBwb3J0ZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb2NhbCBmdW5jdGlvbiBjYWxsZWQgdG8gc2VuZCBhIHJlYWQgcmVtb3RlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgICAgICBmZWF0dXJlcy9yZW1vdGUgZXh0ZW5kZWQgZmVhdHVyZXMgcGFnZVswXS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTdGFja0FjbEJ0bUFjbDo6YnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzKHVpbnQxNl90IGhhbmRsZSkgewotICB1aW50OF90IGFjbF9pZHg7Ci0gIHRBQ0xfQ09OTiogcF9hY2xfY2I7Ci0KLSAgYWNsX2lkeCA9IGJ0bV9oYW5kbGVfdG9fYWNsX2luZGV4KGhhbmRsZSk7Ci0gIGlmIChhY2xfaWR4ID49IE1BWF9MMkNBUF9MSU5LUykgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9hY2xfY2IgPSAmYnRtX2NiLmFjbF9jYl8uYWNsX2RiW2FjbF9pZHhdOwotICBtZW1zZXQocF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXMsIDAsCi0gICAgICAgICBzaXplb2YocF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXMpKTsKLQotICAvKiBmaXJzdCBzZW5kIHJlYWQgcmVtb3RlIHN1cHBvcnRlZCBmZWF0dXJlcyBIQ0kgY29tbWFuZCAqLwotICAvKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgcmVtb3RlIHN1cHBvcnQgZXh0ZW5kZWQgZmVhdHVyZSBjb21tYW5kCi0gICAqLwotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICAvLyBHRCBMMmNhcCByZWFkcyB0aGlzIGF1dG9tYXRpY2FsbHkKLSAgICByZXR1cm47Ci0gIH0KLSAgYnRzbmRfaGNpY19ybXRfZmVhdHVyZXNfcmVxKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb2NhbCBmdW5jdGlvbiBjYWxsZWQgdG8gc2VuZCBhIHJlYWQgcmVtb3RlIGV4dGVuZGVkCi0gKiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW1iZXIpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgLy8gR0QgTDJjYXAgcmVhZHMgdGhpcyBhdXRvbWF0aWNhbGx5Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJ0c25kX2hjaWNfcm10X2V4dF9mZWF0dXJlcyhoYW5kbGUsIHBhZ2VfbnVtYmVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgcmVtb3RlIHN1cHBvcnRlZCBmZWF0dXJlcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZSBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlX3Jhdyh1aW50OF90KiBwKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MTZfdCBoYW5kbGU7Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIExPR19XQVJOKCJVYW5ibGUgdG8gcmVhZCByZW1vdGUgZmVhdHVyZXMgc3RhdHVzOiVzIiwKLSAgICAgICAgICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0KLSAgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKGhhbmRsZSwgcCk7Ci19Ci0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCogZmVhdHVyZXMpIHsKLSAgdEFDTF9DT05OKiBwX2FjbF9jYiA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsX2NiID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIENvcHkgdGhlIHJlY2VpdmVkIGZlYXR1cmVzIHBhZ2UgKi8KLSAgU1RSRUFNX1RPX0FSUkFZKHBfYWNsX2NiLT5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzWzBdLCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgIEhDSV9GRUFUVVJFX0JZVEVTX1BFUl9QQUdFKTsKLSAgcF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfdmFsaWRbMF0gPSB0cnVlOwotCi0gIGlmICgoSENJX0xNUF9FWFRFTkRFRF9TVVBQT1JURUQocF9hY2xfY2ItPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbMF0pKSAmJgotICAgICAgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgIC0+c3VwcG9ydHNfcmVhZGluZ19yZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZXMoKSkpIHsKLSAgICAvKiBpZiB0aGUgcmVtb3RlIGNvbnRyb2xsZXIgaGFzIGV4dGVuZGVkIGZlYXR1cmVzIGFuZCBsb2NhbCBjb250cm9sbGVyCi0gICAgICAgc3VwcG9ydHMgSENJX1JlYWRfUmVtb3RlX0V4dGVuZGVkX0ZlYXR1cmVzIGNvbW1hbmQgdGhlbiBzdGFydCByZWFkaW5nCi0gICAgICAgdGhlc2UgZmVhdHVyZSBzdGFydGluZyB3aXRoIGV4dGVuZGVkIGZlYXR1cmVzIHBhZ2UgMSAqLwotICAgIExPR19ERUJVRygiU3RhcnQgcmVhZGluZyByZW1vdGUgZXh0ZW5kZWQgZmVhdHVyZXMiKTsKLSAgICBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzKGhhbmRsZSwgMSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogUmVtb3RlIGNvbnRyb2xsZXIgaGFzIG5vIGV4dGVuZGVkIGZlYXR1cmVzLiBQcm9jZXNzIHJlbW90ZSBjb250cm9sbGVyCi0gICAgIHN1cHBvcnRlZCBmZWF0dXJlcyAoZmVhdHVyZXMgcGFnZSAwKS4gKi8KLSAgYnRtX3Byb2Nlc3NfcmVtb3RlX2V4dF9mZWF0dXJlcyhwX2FjbF9jYiwgMCk7Ci0KLSAgLyogQ29udGludWUgd2l0aCBIQ0kgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50ICovCi0gIGludGVybmFsXy5idG1fZXN0YWJsaXNoX2NvbnRpbnVlKHBfYWNsX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHJlbW90ZSBleHRlbmRlZCBmZWF0dXJlcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZSBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZV9yYXcodWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7Ci0gIHVpbnQ4X3QgcGFnZV9udW0sIG1heF9wYWdlOwotICB1aW50MTZfdCBoYW5kbGU7Ci0KLSAgaWYgKGV2dF9sZW4gPCBIQ0lfRVhUX0ZFQVRVUkVTX1NVQ0NFU1NfRVZUX0xFTikgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTQxNTUyODU5Iik7Ci0gICAgTE9HX1dBUk4oIlJlbW90ZSBleHRlbmRlZCBmZWF0dXJlIGxlbmd0aCB0b28gc2hvcnQuIGxlbmd0aD0lZCIsIGV2dF9sZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gICsrcDsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgocGFnZV9udW0sIHApOwotICBTVFJFQU1fVE9fVUlOVDgobWF4X3BhZ2UsIHApOwotCi0gIGlmIChtYXhfcGFnZSA+IEhDSV9FWFRfRkVBVFVSRVNfUEFHRV9NQVgpIHsKLSAgICBMT0dfV0FSTigiVG9vIG1hbnkgbWF4IHBhZ2VzIHJlYWQgcGFnZT0lZCB1bmtub3duIiwgbWF4X3BhZ2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwYWdlX251bSA+IEhDSV9FWFRfRkVBVFVSRVNfUEFHRV9NQVgpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE0MTU1Mjg1OSIpOwotICAgIExPR19XQVJOKCJUb28gbWFueSByZWNlaXZlZCBwYWdlcyBudW1fcGFnZT0lZCBpbnZhbGlkIiwgcGFnZV9udW0pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwYWdlX251bSA+IG1heF9wYWdlKSB7Ci0gICAgTE9HX1dBUk4oIm51bV9wYWdlPSVkLCBtYXhfcGFnZT0lZCBpbnZhbGlkIiwgcGFnZV9udW0sIG1heF9wYWdlKTsKLSAgfQotCi0gIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGUoaGFuZGxlLCBwYWdlX251bSwgbWF4X3BhZ2UsIHApOwotfQotCi12b2lkIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGUodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHBhZ2VfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZmVhdHVyZXMpIHsKLSAgLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLwotICBhdXRvKiBwX2FjbF9jYiA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsX2NiID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIENvcHkgdGhlIHJlY2VpdmVkIGZlYXR1cmVzIHBhZ2UgKi8KLSAgU1RSRUFNX1RPX0FSUkFZKHBfYWNsX2NiLT5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzW3BhZ2VfbnVtXSwgZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICBIQ0lfRkVBVFVSRV9CWVRFU19QRVJfUEFHRSk7Ci0gIHBfYWNsX2NiLT5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkW3BhZ2VfbnVtXSA9IHRydWU7Ci0KLSAgLyogSWYgdGhlcmUgaXMgdGhlIG5leHQgcmVtb3RlIGZlYXR1cmVzIHBhZ2UgYW5kCi0gICAqIHdlIGhhdmUgc3BhY2UgdG8ga2VlcCB0aGlzIHBhZ2UgZGF0YSAtIHJlYWQgdGhpcyBwYWdlICovCi0gIGlmICgocGFnZV9udW0gPCBtYXhfcGFnZSkgJiYgKHBhZ2VfbnVtIDwgSENJX0VYVF9GRUFUVVJFU19QQUdFX01BWCkpIHsKLSAgICBwYWdlX251bSsrOwotICAgIExPR19ERUJVRygiQlRNIHJlYWRzIG5leHQgcmVtb3RlIGV4dGVuZGVkIGZlYXR1cmVzIHBhZ2UgKCVkKSIsIHBhZ2VfbnVtKTsKLSAgICBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzKGhhbmRsZSwgcGFnZV9udW0pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlYWRpbmcgb2YgcmVtb3RlIGZlYXR1cmUgcGFnZXMgaXMgY29tcGxldGUgKi8KLSAgTE9HX0RFQlVHKCJCVE0gcmVhY2hlZCBsYXN0IHJlbW90ZSBleHRlbmRlZCBmZWF0dXJlcyBwYWdlICglZCkiLCBwYWdlX251bSk7Ci0KLSAgLyogUHJvY2VzcyB0aGUgcGFnZXMgKi8KLSAgYnRtX3Byb2Nlc3NfcmVtb3RlX2V4dF9mZWF0dXJlcyhwX2FjbF9jYiwgbWF4X3BhZ2UpOwotCi0gIC8qIENvbnRpbnVlIHdpdGggSENJIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCAqLwotICBpbnRlcm5hbF8uYnRtX2VzdGFibGlzaF9jb250aW51ZShwX2FjbF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgcmVtb3RlIGV4dGVuZGVkIGZlYXR1cmVzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIGV2ZW50IHJldHVybnMgYSBmYWlsZWQgc3RhdHVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfZmFpbGVkKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgTE9HX1dBUk4oInN0YXR1cyAweCUwMnggZm9yIGhhbmRsZSAlZCIsIHN0YXR1cywgaGFuZGxlKTsKLQotICB0QUNMX0NPTk4qIHBfYWNsX2NiID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9hY2xfY2IgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogUHJvY2VzcyBzdXBwb3J0ZWQgZmVhdHVyZXMgb25seSAqLwotICBidG1fcHJvY2Vzc19yZW1vdGVfZXh0X2ZlYXR1cmVzKHBfYWNsX2NiLCAwKTsKLQotICAvKiBDb250aW51ZSBIQ0kgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50ICovCi0gIGludGVybmFsXy5idG1fZXN0YWJsaXNoX2NvbnRpbnVlKHBfYWNsX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9lc3RhYmxpc2hfY29udGludWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSByZWFkIGxvY2FsIGxpbmsgcG9saWN5Ci0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgU3RhY2tBY2xCdG1BY2w6OmJ0bV9lc3RhYmxpc2hfY29udGludWUodEFDTF9DT05OKiBwX2FjbCkgewotICBDSEVDSyhwX2FjbCAhPSBudWxscHRyKTsKLQotICBpZiAocF9hY2wtPmlzX3RyYW5zcG9ydF9icl9lZHIoKSkgewotICAgIC8qIEZvciBub3cgdGhlcmUgYXJlIGEgc29tZSBkZXZpY2VzIHRoYXQgZG8gbm90IGxpa2Ugc2VuZGluZyAqLwotICAgIC8qIGNvbW1hbmRzIGV2ZW50cyBhbmQgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLiAqLwotICAgIC8qIFNldCB0aGUgcGFja2V0IHR5cGVzIHRvIHRoZSBkZWZhdWx0IGFsbG93ZWQgYnkgdGhlIGRldmljZSAqLwotICAgIGNvbnN0IHVpbnQxNl90IGRlZmF1bHRfcGFja2V0X3R5cGVfbWFzayA9Ci0gICAgICAgIGJ0bV9jYi5hY2xfY2JfLkRlZmF1bHRQYWNrZXRUeXBlcygpOwotICAgIGlmICghaW50ZXJuYWxfLmNoYW5nZV9jb25uZWN0aW9uX3BhY2tldF90eXBlcygqcF9hY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcGFja2V0X3R5cGVfbWFzaykpIHsKLSAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGNoYW5nZSBjb25uZWN0aW9uIHBhY2tldCB0eXBlIHR5cGVzOiUwNHggYWRkcmVzczolcyIsCi0gICAgICAgICAgICAgICAgZGVmYXVsdF9wYWNrZXRfdHlwZV9tYXNrLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX2FjbC0+UmVtb3RlQWRkcmVzcygpKSk7Ci0gICAgfQotICAgIGJ0bV9zZXRfbGlua19wb2xpY3kocF9hY2wsIGJ0bV9jYi5hY2xfY2JfLkRlZmF1bHRMaW5rUG9saWN5KCkpOwotICB9Ci0gIE5vdGlmeUFjbExpbmtVcCgqcF9hY2wpOwotfQotCi12b2lkIGJ0bV9lc3RhYmxpc2hfY29udGludWVfZnJvbV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChiZGEsIHRyYW5zcG9ydCk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50ZXJuYWxfLmJ0bV9lc3RhYmxpc2hfY29udGludWUocF9hY2wpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldExpbmtTdXBlclRvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYWQgdGhlIGxpbmsgc3VwZXJ2aXNpb24gdGltZW91dCB2YWx1ZSBvZiB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0dldExpbmtTdXBlclRvdXQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3RpbWVvdXQpIHsKLSAgQ0hFQ0socF90aW1lb3V0ICE9IG51bGxwdHIpOwotICBjb25zdCB0QUNMX0NPTk4qIHBfYWNsID0KLSAgICAgIGludGVybmFsXy5idG1fYmRhX3RvX2FjbChyZW1vdGVfYmRhLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybiBCVE1fVU5LTk9XTl9BRERSOwotICB9Ci0gICpwX3RpbWVvdXQgPSBwX2FjbC0+bGlua19zdXBlcl90b3V0OwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0TGlua1N1cGVyVG91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGFuZCBzZW5kIEhDSSAiV3JpdGUgTGluayBTdXBlcnZpc2lvbiBUaW1lb3V0IiBjb21tYW5kCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0TGlua1N1cGVyVG91dChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZGEsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gIH0KLQotICAvKiBPbmx5IHNlbmQgaWYgY3VycmVudCByb2xlIGlzIENlbnRyYWw7IDIuMCBzcGVjIHJlcXVpcmVzIHRoaXMgKi8KLSAgaWYgKHBfYWNsLT5saW5rX3JvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgIHBfYWNsLT5saW5rX3N1cGVyX3RvdXQgPSB0aW1lb3V0OwotICAgIGJ0c25kX2hjaWNfd3JpdGVfbGlua19zdXBlcl90b3V0KHBfYWNsLT5oY2lfaGFuZGxlLCB0aW1lb3V0KTsKLSAgICBMT0dfREVCVUcoIlNldCBzdXBlcnZpc2lvbiB0aW1lb3V0OiUuMmZtcyBiZF9hZGRyOiVzIiwKLSAgICAgICAgICAgICAgc3VwZXJ2aXNpb25fdGltZW91dF90b19zZWNvbmRzKHRpbWVvdXQpLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocmVtb3RlX2JkYSkpOwotICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJSb2xlIGlzIHBlcmlwaGVyYWwgc28gdW5hYmxlIHRvIHNldCBzdXBlcnZpc2lvbiB0aW1lb3V0OiUuMmZtcyAiCi0gICAgICAgICJiZF9hZGRyOiVzIiwKLSAgICAgICAgc3VwZXJ2aXNpb25fdGltZW91dF90b19zZWNvbmRzKHRpbWVvdXQpLCBQUklWQVRFX0FERFJFU1MocmVtb3RlX2JkYSkpOwotICAgIHJldHVybiBCVE1fU1VDQ0VTUzsKLSAgfQotfQotCi1ib29sIEJUTV9Jc0FjbENvbm5lY3Rpb25VcChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Jc0xpbmtFc3RhYmxpc2hlZChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICB9Ci0KLSAgcmV0dXJuIGludGVybmFsXy5idG1fYmRhX3RvX2FjbChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpICE9IG51bGxwdHI7Ci19Ci0KLWJvb2wgQlRNX0lzQWNsQ29ubmVjdGlvblVwQW5kSGFuZGxlVmFsaWQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Jc0xpbmtFc3RhYmxpc2hlZChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICB9Ci0KLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBwX2FjbC0+aGNpX2hhbmRsZSAhPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci19Ci0KLWJvb2wgQlRNX0lzQWNsQ29ubmVjdGlvblVwRnJvbUhhbmRsZSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIHJldHVybiBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhjaV9oYW5kbGUpICE9IG51bGxwdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0TnVtQWNsTGlua3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YKLSAqICAgICAgICAgICAgICAgICAgQUNMIGxpbmtzIHRoYXQgYXJlIGFjdGl2ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHVpbnQxNl90IE51bWJlciBvZiBhY3RpdmUgQUNMIGxpbmtzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUTV9HZXROdW1BY2xMaW5rcyh2b2lkKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfR2V0TnVtTGlua3MoKTsKLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGJ0bV9jYi5hY2xfY2JfLk51bWJlck9mQWN0aXZlTGlua3MoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIGRpc2Nvbm5lY3Rpb24gcmVhc29uIGNvZGUKLSAqICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkgdGhlIEhDSSBhdCBkaXNjb25uZWN0aW9uIGNvbXBsZXRlIGV2ZW50LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIHVwLCBlbHNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SENJX1JFQVNPTiBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlKHZvaWQpIHsKLSAgcmV0dXJuIGJ0bV9jYi5hY2xfY2JfLmdldF9kaXNjb25uZWN0X3JlYXNvbigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldEhDSUNvbm5IYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgaGFuZGxlIGZvciBhbiBBQ0wKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIHJlbW90ZSBCRCBBZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiwgb3IgSENJX0lOVkFMSURfSEFORExFIGlmIG5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUTV9HZXRIQ0lDb25uSGFuZGxlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fR2V0SENJQ29ubkhhbmRsZShyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICB9Ci0KLSAgdEFDTF9DT05OKiBwOwotICBwID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci0gIGlmIChwICE9ICh0QUNMX0NPTk4qKU5VTEwpIHsKLSAgICByZXR1cm4gKHAtPmhjaV9oYW5kbGUpOwotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm8gQkQgQWRkciBmb3VuZCAqLwotICByZXR1cm4gSENJX0lOVkFMSURfSEFORExFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0lzUGh5Mm1TdXBwb3J0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIFBIWSAyTSBzdXBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIGZyb20gcGVlciBkZXZpY2UKLSAqIFJldHVybnMgICAgICAgICAgVHJ1ZSB3aGVuIFBIWSAyTSBzdXBwb3J0ZWQgZmFsc2Ugb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0lzUGh5Mm1TdXBwb3J0ZWQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdEFDTF9DT05OKiBwOwotICBCVE1fVFJBQ0VfREVCVUcoIkJUTV9Jc1BoeTJtU3VwcG9ydGVkIik7Ci0gIHAgPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKHAgPT0gKHRBQ0xfQ09OTiopTlVMTCkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiQlRNX0lzUGh5Mm1TdXBwb3J0ZWQ6IG5vIGNvbm5lY3Rpb24iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXAtPnBlZXJfbGVfZmVhdHVyZXNfdmFsaWQpIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkNoZWNraW5nIHJlbW90ZSBmZWF0dXJlcyBidXQgcmVtb3RlIGZlYXR1cmUgcmVhZCBpcyAiCi0gICAgICAgICJpbmNvbXBsZXRlIik7Ci0gIH0KLSAgcmV0dXJuIEhDSV9MRV8yTV9QSFlfU1VQUE9SVEVEKHAtPnBlZXJfbGVfZmVhdHVyZXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlcXVlc3RQZWVyU0NBCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXF1ZXN0IHNsZWVwIGNsb2NrIGFjY3VyYWN5Ci0gKiAgICAgICAgICAgICAgICAgIGZyb20gcGVlciBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVxdWVzdFBlZXJTQ0EoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdEFDTF9DT05OKiBwOwotICBwID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci0gIGlmIChwID09ICh0QUNMX0NPTk4qKU5VTEwpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0c25kX2hjaWNfcmVxX3BlZXJfc2NhKHAtPmhjaV9oYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldFBlZXJTQ0EKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBwZWVyIHNsZWVwIGNsb2NrIGFjY3VyYWN5Ci0gKgotICogUmV0dXJucyAgICAgICAgICBTQ0Egb3IgMHhGRiBpZiBTQ0Egd2FzIG5ldmVyIHByZXZpb3VzbHkgcmVxdWVzdGVkLCByZXF1ZXN0Ci0gKiAgICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgcGVlciBkZXZpY2Ugb3IgQUNMIGRvZXMgbm90IGV4aXN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQlRNX0dldFBlZXJTQ0EoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdEFDTF9DT05OKiBwOwotICBwID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci0gIGlmIChwICE9ICh0QUNMX0NPTk4qKU5VTEwpIHsKLSAgICByZXR1cm4gKHAtPnNjYSk7Ci0gIH0KLSAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLQotICAvKiBJZiBoZXJlLCBubyBCRCBBZGRyIGZvdW5kICovCi0gIHJldHVybiAoMHhGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVqZWN0bGlzdF9yb2xlX2NoYW5nZV9kZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWplY3RsaXN0IHRoZSBkZXZpY2UgaWYgdGhlIHJvbGUKLSAqICAgICAgICAgICAgICAgICAgc3dpdGNoIGZhaWxzIGZvciBtYXhpbXVtIG51bWJlciBvZiB0aW1lcy4gSXQgYWxzbyByZW1vdmVzCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBkZXZpY2UgZnJvbSB0aGUgYmxhY2sgbGlzdCBpZiB0aGUgcm9sZSBzd2l0Y2ggc3VjY2VlZHMuCi0gKgotICogSW5wdXQgUGFybXMgICAgICBiZF9hZGRyIC0gcmVtb3RlIEJEIGFkZHIKLSAqICAgICAgICAgICAgICAgICAgaGNpX3N0YXR1cyAtIHJvbGUgc3dpdGNoIHN0YXR1cwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVqZWN0bGlzdF9yb2xlX2NoYW5nZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGNpX3N0YXR1cykgewotICB0QUNMX0NPTk4qIHAgPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2woYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0KLSAgaWYgKCFwKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBwLT5zd2l0Y2hfcm9sZV9mYWlsZWRfYXR0ZW1wdHMgPSAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIGNoZWNrIGZvciBjYXJraXRzICovCi0gIGNvbnN0IHVpbnQzMl90IGNvZF9hdWRpb19kZXZpY2UgPQotICAgICAgKEJUTV9DT0RfU0VSVklDRV9BVURJTyB8IEJUTV9DT0RfTUFKT1JfQVVESU8pIDw8IDg7Ci0gIGNvbnN0IHVpbnQ4X3QqIGRldl9jbGFzcyA9IGJ0bV9nZXRfZGV2X2NsYXNzKGJkX2FkZHIpOwotICBpZiAoZGV2X2NsYXNzID09IG51bGxwdHIpIHJldHVybjsKLSAgY29uc3QgdWludDMyX3QgY29kID0KLSAgICAgICgoZGV2X2NsYXNzWzBdIDw8IDE2KSB8IChkZXZfY2xhc3NbMV0gPDwgOCkgfCBkZXZfY2xhc3NbMl0pICYgMHhmZmZmZmY7Ci0gIGlmICgoaGNpX3N0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgJiYKLSAgICAgIChwLT5pc19zd2l0Y2hfcm9sZV9zd2l0Y2hpbmdfb3JfaW5fcHJvZ3Jlc3MoKSkgJiYKLSAgICAgICgoY29kICYgY29kX2F1ZGlvX2RldmljZSkgPT0gY29kX2F1ZGlvX2RldmljZSkgJiYKLSAgICAgICghaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfRFlOQU1JQ19ST0xFX1NXSVRDSCwgJmJkX2FkZHIpKSkgewotICAgIHAtPnN3aXRjaF9yb2xlX2ZhaWxlZF9hdHRlbXB0cysrOwotICAgIGlmIChwLT5zd2l0Y2hfcm9sZV9mYWlsZWRfYXR0ZW1wdHMgPT0gQlRNX01BWF9TV19ST0xFX0ZBSUxFRF9BVFRFTVBUUykgewotICAgICAgTE9HX1dBUk4oCi0gICAgICAgICAgIkRldmljZSAlcyByZWplY3RsaXN0ZWQgZm9yIHJvbGUgc3dpdGNoaW5nIC0gIgotICAgICAgICAgICJtdWx0aXBsZSByb2xlIHN3aXRjaCBmYWlsZWQgYXR0ZW1wdHM6ICV1IiwKLSAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgcC0+c3dpdGNoX3JvbGVfZmFpbGVkX2F0dGVtcHRzKTsKLSAgICAgIGludGVyb3BfZGF0YWJhc2VfYWRkKElOVEVST1BfRFlOQU1JQ19ST0xFX1NXSVRDSCwgJmJkX2FkZHIsIDMpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2FjbF9yb2xlX2NoYW5nZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoYW4gYSBsaW5rJ3MgY2VudHJhbC9wZXJpcGhlcmFsCi0gKnJvbGUgY2hhbmdlIGV2ZW50IG9yIGNvbW1hbmQgc3RhdHVzIGV2ZW50ICh3aXRoIGVycm9yKSBpcyByZWNlaXZlZC4gSXQgdXBkYXRlcwotICp0aGUgbGluayBjb250cm9sIGJsb2NrLCBhbmQgY2FsbHMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCBzdGF0dXMgYW5kIHJvbGUKLSAqKGlmIHJlZ2lzdGVyZWQpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFN0YWNrQWNsQnRtQWNsOjpidG1fYWNsX3JvbGVfY2hhbmdlZCh0SENJX1NUQVRVUyBoY2lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSBuZXdfcm9sZSkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIC8vIElmIHdlIGdldCBhIHJvbGUgY2hhbmdlIGJlZm9yZSBjb25uZWN0aW9uIGNvbXBsZXRlLCB3ZSBjYWNoZSB0aGUgbmV3Ci0gICAgLy8gcm9sZSBoZXJlIGFuZCB0aGVuIHByb3BhZ2F0ZSBpdCB3aGVuIEFDTCBMaW5rIGlzIGNyZWF0ZWQuCi0gICAgUm9sZUNoYW5nZVZpZXcgcm9sZV9jaGFuZ2U7Ci0gICAgcm9sZV9jaGFuZ2UubmV3X3JvbGUgPSBuZXdfcm9sZTsKLSAgICByb2xlX2NoYW5nZS5iZF9hZGRyID0gYmRfYWRkcjsKLSAgICBkZWxheWVkX3JvbGVfY2hhbmdlXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Um9sZUNoYW5nZVZpZXc+KHN0ZDo6bW92ZShyb2xlX2NoYW5nZSkpOwotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUTV9ST0xFX1NXSVRDSF9DTVBMKiBwX3N3aXRjaF9yb2xlID0gJmJ0bV9jYi5hY2xfY2JfLnN3aXRjaF9yb2xlX3JlZl9kYXRhOwotICBMT0dfREVCVUcoIlJvbGUgY2hhbmdlIGV2ZW50IHJlY2VpdmVkIHBlZXI6JXMgaGNpX3N0YXR1czolcyBuZXdfcm9sZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIGhjaV9lcnJvcl9jb2RlX3RleHQoaGNpX3N0YXR1cykuY19zdHIoKSwKLSAgICAgICAgICAgIFJvbGVUZXh0KG5ld19yb2xlKS5jX3N0cigpKTsKLQotICBwX3N3aXRjaF9yb2xlLT5oY2lfc3RhdHVzID0gaGNpX3N0YXR1czsKLSAgaWYgKGhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBwX3N3aXRjaF9yb2xlLT5yb2xlID0gbmV3X3JvbGU7Ci0gICAgcF9zd2l0Y2hfcm9sZS0+cmVtb3RlX2JkX2FkZHIgPSBiZF9hZGRyOwotCi0gICAgLyogVXBkYXRlIGNhY2hlZCB2YWx1ZSAqLwotICAgIHBfYWNsLT5saW5rX3JvbGUgPSBuZXdfcm9sZTsKLQotICAgIC8qIFJlbG9hZCBMU1RPOiBsaW5rIHN1cGVydmlzaW9uIHRpbWVvdXQgaXMgcmVzZXQgaW4gdGhlIExNIGFmdGVyIGEgcm9sZQotICAgICAqIHN3aXRjaCAqLwotICAgIGlmIChuZXdfcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgICBjb25zdGV4cHIgdWludDE2X3QgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0ID0gODAwMDsKLSAgICAgIEJUTV9TZXRMaW5rU3VwZXJUb3V0KGJkX2FkZHIsIGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG5ld19yb2xlID0gcF9hY2wtPmxpbmtfcm9sZTsKLSAgfQotCi0gIC8qIENoZWNrIGlmIGFueSBTQ08gcmVxIGlzIHBlbmRpbmcgZm9yIHJvbGUgY2hhbmdlICovCi0gIGJ0bV9zY29fY2hrX3BlbmRfcm9sZWNoYW5nZShwX2FjbC0+aGNpX2hhbmRsZSk7Ci0KLSAgLyogaWYgc3dpdGNoaW5nIHN0YXRlIGlzIHN3aXRjaGluZyB3ZSBuZWVkIHRvIHR1cm4gZW5jcnlwdGlvbiBvbiAqLwotICAvKiBpZiBpZGxlLCB3ZSBkaWQgbm90IGNoYW5nZSBlbmNyeXB0aW9uICovCi0gIGlmIChwX2FjbC0+aXNfc3dpdGNoX3JvbGVfc3dpdGNoaW5nKCkpIHsKLSAgICBwX2FjbC0+c2V0X2VuY3J5cHRpb25fb24oKTsKLSAgICBwX2FjbC0+c2V0X3N3aXRjaF9yb2xlX2VuY3J5cHRpb25fb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBTZXQgdGhlIHN3aXRjaF9yb2xlX3N0YXRlIHRvIElETEUgc2luY2UgdGhlIHJlcGx5IHJlY2VpdmVkIGZyb20gSENJICovCi0gIC8qIHJlZ2FyZGxlc3Mgb2YgaXRzIHJlc3VsdCBlaXRoZXIgc3VjY2VzcyBvciBmYWlsZWQuICovCi0gIGlmIChwX2FjbC0+aXNfc3dpdGNoX3JvbGVfaW5fcHJvZ3Jlc3MoKSkgewotICAgIHBfYWNsLT5zZXRfZW5jcnlwdGlvbl9pZGxlKCk7Ci0gICAgcF9hY2wtPnJlc2V0X3N3aXRjaF9yb2xlKCk7Ci0gIH0KLQotICBCVEFfZG1fcmVwb3J0X3JvbGVfY2hhbmdlKGJkX2FkZHIsIG5ld19yb2xlLCBoY2lfc3RhdHVzKTsKLQotICAvKiBJZiBhIGRpc2Nvbm5lY3QgaXMgcGVuZGluZywgaXNzdWUgaXQgbm93IHRoYXQgcm9sZSBzd2l0Y2ggaGFzIGNvbXBsZXRlZCAqLwotICBpZiAocF9hY2wtPnJzX2Rpc2NfcGVuZGluZyA9PSBCVE1fU0VDX0RJU0NfUEVORElORykgewotICAgIGhjaV9idHNuZF9oY2ljX2Rpc2Nvbm5lY3QoKnBfYWNsLCBIQ0lfRVJSX1BFRVJfVVNFUik7Ci0gIH0KLSAgcF9hY2wtPnJzX2Rpc2NfcGVuZGluZyA9IEJUTV9TRUNfUlNfTk9UX1BFTkRJTkc7IC8qIHJlc2V0IGZsYWcgKi8KLX0KLQotdm9pZCBidG1fYWNsX3JvbGVfY2hhbmdlZCh0SENJX1NUQVRVUyBoY2lfc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbmV3X3JvbGUpIHsKLSAgaWYgKGhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBsMmNfbGlua19yb2xlX2NoYW5nZWQoJmJkX2FkZHIsIG5ld19yb2xlLCBoY2lfc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBsMmNfbGlua19yb2xlX2NoYW5nZWQobnVsbHB0ciwgSENJX1JPTEVfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VSUl9DT01NQU5EX0RJU0FMTE9XRUQpOwotICB9Ci0gIGludGVybmFsXy5idG1fYWNsX3JvbGVfY2hhbmdlZChoY2lfc3RhdHVzLCBiZF9hZGRyLCBuZXdfcm9sZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBjaGFuZ2VfY29ubmVjdGlvbl9wYWNrZXRfdHlwZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcGFja2V0IHR5cGVzIHVzZWQgZm9yIGEgc3BlY2lmaWMKLSAqICAgICAgICAgICAgICAgICAgQUNMIGNvbm5lY3Rpb24uIEl0IGlzIGNhbGxlZCBpbnRlcm5hbGx5IGJ5IGJ0bV9hY2xfY3JlYXRlZAotICogICAgICAgICAgICAgICAgICBvciBieSBhbiBhcHBsaWNhdGlvbi9wcm9maWxlIGJ5IEJUTV9TZXRQYWNrZXRUeXBlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU3RhY2tBY2xCdG1BY2w6OmNoYW5nZV9jb25uZWN0aW9uX3BhY2tldF90eXBlcygKLSAgICB0QUNMX0NPTk4mIGxpbmssIGNvbnN0IHVpbnQxNl90IG5ld19wYWNrZXRfdHlwZV9tYXNrKSB7Ci0gIC8vIFN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgY29uZmlndXJlZCBwYWNrZXQgdHlwZXMKLSAgY29uc3QgdWludDE2X3QgZGVmYXVsdF9wYWNrZXRfdHlwZV9tYXNrID0gYnRtX2NiLmFjbF9jYl8uRGVmYXVsdFBhY2tldFR5cGVzKCk7Ci0KLSAgdWludDE2X3QgcGFja2V0X3R5cGVfbWFzayA9Ci0gICAgICBkZWZhdWx0X3BhY2tldF90eXBlX21hc2sgJgotICAgICAgKG5ld19wYWNrZXRfdHlwZV9tYXNrICYgQlRNX0FDTF9TVVBQT1JURURfUEtUU19NQVNLKTsKLQotICAvKiBPUiBpbiBhbnkgZXhjZXB0aW9uIHBhY2tldCB0eXBlcyBpZiBhdCBsZWFzdCAyLjAgdmVyc2lvbiBvZiBzcGVjICovCi0gIHBhY2tldF90eXBlX21hc2sgfD0KLSAgICAgICgobmV3X3BhY2tldF90eXBlX21hc2sgJiBCVE1fQUNMX0VYQ0VQVElPTl9QS1RTX01BU0spIHwKLSAgICAgICAoQlRNX0FDTF9FWENFUFRJT05fUEtUU19NQVNLICYgZGVmYXVsdF9wYWNrZXRfdHlwZV9tYXNrKSk7Ci0KLSAgLyogRXhjbHVkZSBwYWNrZXQgdHlwZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcGVlciAqLwotICBpZiAobGluay5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkWzBdKSB7Ci0gICAgUGVlclBhY2tldFR5cGVzIHBlZXJfcGFja2V0X3R5cGVzKGxpbmsucGVlcl9sbXBfZmVhdHVyZV9wYWdlc1swXSk7Ci0gICAgcGFja2V0X3R5cGVfbWFzayAmPSBwZWVyX3BhY2tldF90eXBlcy5hY2wuc3VwcG9ydGVkOwotICAgIHBhY2tldF90eXBlX21hc2sgfD0gcGVlcl9wYWNrZXRfdHlwZXMuYWNsLnVuc3VwcG9ydGVkOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKAotICAgICAgICAiVW5hYmxlIHRvIGluY2x1ZGUgcmVtb3RlIHN1cHBvcnRlZCBwYWNrZXQgdHlwZXMgYXMgcmVhZCBmZWF0dXJlICIKLSAgICAgICAgImluY29tcGxldGUiKTsKLSAgICBMT0dfSU5GTygiVElQOiBNYXliZSB3YWl0IHVudGlsIHJlYWQgZmVhdHVyZSBjb21wbGV0ZSBiZWZvcmVoYW5kIik7Ci0gIH0KLQotICBpZiAocGFja2V0X3R5cGVfbWFzayA9PSAwKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBzZW5kIGNvbnRyb2xsZXIgaWxsZWdhbCBjaGFuZ2UgcGFja2V0IG1hc2s6MHglMDR4IiwKLSAgICAgICAgICAgICBwYWNrZXRfdHlwZV9tYXNrKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBsaW5rLnBrdF90eXBlc19tYXNrID0gcGFja2V0X3R5cGVfbWFzazsKLSAgYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6R2V0SW50ZXJmYWNlKCkuQ2hhbmdlQ29ubmVjdGlvblBhY2tldFR5cGUoCi0gICAgICBsaW5rLkhhbmRsZSgpLCBsaW5rLnBrdF90eXBlc19tYXNrKTsKLSAgTE9HX0RFQlVHKCJTdGFydGVkIGNoYW5nZSBjb25uZWN0aW9uIHBhY2tldCB0eXBlOjB4JTA0eCBhZGRyZXNzOiVzIiwKLSAgICAgICAgICAgIGxpbmsucGt0X3R5cGVzX21hc2ssIFBSSVZBVEVfQUREUkVTUyhsaW5rLlJlbW90ZUFkZHJlc3MoKSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBidG1fc2V0X3BhY2tldF90eXBlc19mcm9tX2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBrdF90eXBlcykgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFpbnRlcm5hbF8uY2hhbmdlX2Nvbm5lY3Rpb25fcGFja2V0X3R5cGVzKCpwX2FjbCwgcGt0X3R5cGVzKSkgewotICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGNoYW5nZSBjb25uZWN0aW9uIHBhY2tldCB0eXBlIHR5cGVzOiUwNHggYWRkcmVzczolcyIsCi0gICAgICAgICAgICAgIHBrdF90eXBlcywgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldE1heFBhY2tldFNpemUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgbWF4aW11bSBwYWNrZXQgc2l6ZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIDAgaWYgY29ubmVjdGlvbiBpcyBub3QgZXN0YWJsaXNoZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQlRNX0dldE1heFBhY2tldFNpemUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICB0QUNMX0NPTk4qIHAgPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2woYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIHVpbnQxNl90IHBrdF90eXBlcyA9IDA7Ci0gIHVpbnQxNl90IHBrdF9zaXplID0gMDsKLSAgaWYgKHAgIT0gTlVMTCkgewotICAgIHBrdF90eXBlcyA9IHAtPnBrdF90eXBlc19tYXNrOwotICB9IGVsc2UgewotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3Igd2hlbiBpbmZvIGZvciB0aGUgbG9jYWwgZGV2aWNlIGlzIHJlcXVlc3RlZCAqLwotICAgIGlmIChhZGRyID09ICpjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FkZHJlc3MoKSkgewotICAgICAgcGt0X3R5cGVzID0gYnRtX2NiLmFjbF9jYl8uRGVmYXVsdFBhY2tldFR5cGVzKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBrdF90eXBlcykgewotICAgIGlmICghKHBrdF90eXBlcyAmIEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RINSkpCi0gICAgICBwa3Rfc2l6ZSA9IEhDSV9FRFIzX0RINV9QQUNLRVRfU0laRTsKLSAgICBlbHNlIGlmICghKHBrdF90eXBlcyAmIEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RINSkpCi0gICAgICBwa3Rfc2l6ZSA9IEhDSV9FRFIyX0RINV9QQUNLRVRfU0laRTsKLSAgICBlbHNlIGlmICghKHBrdF90eXBlcyAmIEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RIMykpCi0gICAgICBwa3Rfc2l6ZSA9IEhDSV9FRFIzX0RIM19QQUNLRVRfU0laRTsKLSAgICBlbHNlIGlmIChwa3RfdHlwZXMgJiBIQ0lfUEtUX1RZUEVTX01BU0tfREg1KQotICAgICAgcGt0X3NpemUgPSBIQ0lfREg1X1BBQ0tFVF9TSVpFOwotICAgIGVsc2UgaWYgKCEocGt0X3R5cGVzICYgSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREgzKSkKLSAgICAgIHBrdF9zaXplID0gSENJX0VEUjJfREgzX1BBQ0tFVF9TSVpFOwotICAgIGVsc2UgaWYgKHBrdF90eXBlcyAmIEhDSV9QS1RfVFlQRVNfTUFTS19ETTUpCi0gICAgICBwa3Rfc2l6ZSA9IEhDSV9ETTVfUEFDS0VUX1NJWkU7Ci0gICAgZWxzZSBpZiAocGt0X3R5cGVzICYgSENJX1BLVF9UWVBFU19NQVNLX0RIMykKLSAgICAgIHBrdF9zaXplID0gSENJX0RIM19QQUNLRVRfU0laRTsKLSAgICBlbHNlIGlmIChwa3RfdHlwZXMgJiBIQ0lfUEtUX1RZUEVTX01BU0tfRE0zKQotICAgICAgcGt0X3NpemUgPSBIQ0lfRE0zX1BBQ0tFVF9TSVpFOwotICAgIGVsc2UgaWYgKCEocGt0X3R5cGVzICYgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREgxKSkKLSAgICAgIHBrdF9zaXplID0gSENJX0VEUjNfREgxX1BBQ0tFVF9TSVpFOwotICAgIGVsc2UgaWYgKCEocGt0X3R5cGVzICYgSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREgxKSkKLSAgICAgIHBrdF9zaXplID0gSENJX0VEUjJfREgxX1BBQ0tFVF9TSVpFOwotICAgIGVsc2UgaWYgKHBrdF90eXBlcyAmIEhDSV9QS1RfVFlQRVNfTUFTS19ESDEpCi0gICAgICBwa3Rfc2l6ZSA9IEhDSV9ESDFfUEFDS0VUX1NJWkU7Ci0gICAgZWxzZSBpZiAocGt0X3R5cGVzICYgSENJX1BLVF9UWVBFU19NQVNLX0RNMSkKLSAgICAgIHBrdF9zaXplID0gSENJX0RNMV9QQUNLRVRfU0laRTsKLSAgfQotCi0gIHJldHVybiAocGt0X3NpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRSZW1vdGVWZXJzaW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBJZiBjb25uZWN0ZWQgcmVwb3J0IHBlZXIgZGV2aWNlIGluZm8KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fUmVhZFJlbW90ZVZlcnNpb24oY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCogbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbWFudWZhY3R1cmVyLCB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVhZFJlbW90ZVZlcnNpb24oCi0gICAgICAgIGFkZHIsIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXIsIGxtcF9zdWJfdmVyc2lvbik7Ci0gIH0KLQotICBjb25zdCB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGFkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGFkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwX2FjbC0+cmVtb3RlX3ZlcnNpb25faW5mby52YWxpZCkgewotICAgIExPR19XQVJOKCJSZW1vdGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBpbnZhbGlkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGxtcF92ZXJzaW9uKSAqbG1wX3ZlcnNpb24gPSBwX2FjbC0+cmVtb3RlX3ZlcnNpb25faW5mby5sbXBfdmVyc2lvbjsKLQotICBpZiAobWFudWZhY3R1cmVyKSAqbWFudWZhY3R1cmVyID0gcF9hY2wtPnJlbW90ZV92ZXJzaW9uX2luZm8ubWFudWZhY3R1cmVyOwotCi0gIGlmIChsbXBfc3ViX3ZlcnNpb24pCi0gICAgKmxtcF9zdWJfdmVyc2lvbiA9IHBfYWNsLT5yZW1vdGVfdmVyc2lvbl9pbmZvLmxtcF9zdWJ2ZXJzaW9uOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRSZW1vdGVGZWF0dXJlcwotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgcmVtb3RlIHN1cHBvcnRlZCBmZWF0dXJlcyBtYXNrICg4IGJ5dGVzKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90KiBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZWFkUmVtb3RlRmVhdHVyZXMoYWRkcik7Ci0gIH0KLSAgdEFDTF9DT05OKiBwID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGFkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm4gKE5VTEwpOwotICB9Ci0KLSAgcmV0dXJuIChwLT5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzWzBdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUlNTSQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgbGluayBwb2xpY3kgc2V0dGluZ3MuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhZGRyZXNzIG9mIGxpbmsgcG9saWN5IHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICBjYWxsYmFjay4KLSAqICAgICAgICAgICAgICAgICAgKHRCVE1fUlNTSV9SRVNVTFQpCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCBvciBlcnJvciBjb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkUlNTSShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgdEFDTF9DT05OKiBwID0gTlVMTDsKLSAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlOwotICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGU7Ci0KLSAgLyogSWYgc29tZW9uZSBhbHJlYWR5IHdhaXRpbmcgb24gdGhlIHZlcnNpb24sIGRvIG5vdCBhbGxvdyBhbm90aGVyICovCi0gIGlmIChidG1fY2IuZGV2Y2IucF9yc3NpX2NtcGxfY2IpIHJldHVybiAoQlRNX0JVU1kpOwotCi0gIEJUTV9SZWFkRGV2SW5mbyhyZW1vdGVfYmRhLCAmZGV2X3R5cGUsICZhZGRyX3R5cGUpOwotCi0gIGlmIChkZXZfdHlwZSAmIEJUX0RFVklDRV9UWVBFX0JMRSkgewotICAgIHAgPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocmVtb3RlX2JkYSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgfQotCi0gIGlmIChwID09IE5VTEwgJiYgZGV2X3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CUkVEUikgewotICAgIHAgPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocmVtb3RlX2JkYSwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIH0KLQotICBpZiAocCkgewotICAgIGJ0bV9jYi5kZXZjYi5wX3Jzc2lfY21wbF9jYiA9IHBfY2I7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKGJ0bV9jYi5kZXZjYi5yZWFkX3Jzc2lfdGltZXIsIEJUTV9ERVZfUkVQTFlfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgYnRtX3JlYWRfcnNzaV90aW1lb3V0LCBOVUxMKTsKLQotICAgIGJ0c25kX2hjaWNfcmVhZF9yc3NpKHAtPmhjaV9oYW5kbGUpOwotICAgIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLSAgfQotICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotCi0gIC8qIElmIGhlcmUsIG5vIEJEIEFkZHIgZm91bmQgKi8KLSAgcmV0dXJuIChCVE1fVU5LTk9XTl9BRERSKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGZhaWxlZCBjb250YWN0IGNvdW50ZXIuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW4gdGhlIGNhbGxiYWNrLgotICogICAgICAgICAgICAgICAgICAodEJUTV9GQUlMRURfQ09OVEFDVF9DT1VOVEVSX1JFU1VMVCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkIG9yIGVycm9yIGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRGYWlsZWRDb250YWN0Q291bnRlcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgdEFDTF9DT05OKiBwOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0gIHRCVF9ERVZJQ0VfVFlQRSBkZXZfdHlwZTsKLSAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlOwotCi0gIC8qIElmIHNvbWVvbmUgYWxyZWFkeSB3YWl0aW5nIG9uIHRoZSByZXN1bHQsIGRvIG5vdCBhbGxvdyBhbm90aGVyICovCi0gIGlmIChidG1fY2IuZGV2Y2IucF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NtcGxfY2IpIHJldHVybiAoQlRNX0JVU1kpOwotCi0gIEJUTV9SZWFkRGV2SW5mbyhyZW1vdGVfYmRhLCAmZGV2X3R5cGUsICZhZGRyX3R5cGUpOwotICBpZiAoZGV2X3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfQkxFKSB0cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfTEU7Ci0KLSAgcCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICBpZiAocCAhPSAodEFDTF9DT05OKilOVUxMKSB7Ci0gICAgYnRtX2NiLmRldmNiLnBfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jbXBsX2NiID0gcF9jYjsKLSAgICBhbGFybV9zZXRfb25fbWxvb3AoYnRtX2NiLmRldmNiLnJlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgQlRNX0RFVl9SRVBMWV9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQsIE5VTEwpOwotCi0gICAgYnRzbmRfaGNpY19yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXIocC0+aGNpX2hhbmRsZSk7Ci0gICAgcmV0dXJuIChCVE1fQ01EX1NUQVJURUQpOwotICB9Ci0gIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0KLSAgLyogSWYgaGVyZSwgbm8gQkQgQWRkciBmb3VuZCAqLwotICByZXR1cm4gKEJUTV9VTktOT1dOX0FERFIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRUeFBvd2VyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgIFRYIHBvd2VyIG9mIHRoZSBjb25uZWN0aW9uLiBUaGUgdHggcG93ZXIgbGV2ZWwgcmVzdWx0cwotICogICAgICAgICAgICAgICAgICBhcmUgcmV0dXJuZWQgaW4gdGhlIGNhbGxiYWNrLgotICogICAgICAgICAgICAgICAgICAodEJUTV9SU1NJX1JFU1VMVCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkIG9yIGVycm9yIGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRUeFBvd2VyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVE1fQ01QTF9DQiogcF9jYikgewotICB0QUNMX0NPTk4qIHA7Ci0jZGVmaW5lIEJUTV9SRUFEX1JTU0lfVFlQRV9DVVIgMHgwMAotI2RlZmluZSBCVE1fUkVBRF9SU1NJX1RZUEVfTUFYIDBYMDEKLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IFJlbUJkQWRkcjogIiA8PCByZW1vdGVfYmRhOwotCi0gIC8qIElmIHNvbWVvbmUgYWxyZWFkeSB3YWl0aW5nIG9uIHRoZSB2ZXJzaW9uLCBkbyBub3QgYWxsb3cgYW5vdGhlciAqLwotICBpZiAoYnRtX2NiLmRldmNiLnBfdHhfcG93ZXJfY21wbF9jYikgcmV0dXJuIChCVE1fQlVTWSk7Ci0KLSAgcCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICBpZiAocCAhPSAodEFDTF9DT05OKilOVUxMKSB7Ci0gICAgYnRtX2NiLmRldmNiLnBfdHhfcG93ZXJfY21wbF9jYiA9IHBfY2I7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKGJ0bV9jYi5kZXZjYi5yZWFkX3R4X3Bvd2VyX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICBCVE1fREVWX1JFUExZX1RJTUVPVVRfTVMsIGJ0bV9yZWFkX3R4X3Bvd2VyX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgaWYgKHAtPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIGJ0bV9jYi5kZXZjYi5yZWFkX3R4X3B3cl9hZGRyID0gcmVtb3RlX2JkYTsKLSAgICAgIGJ0c25kX2hjaWNfYmxlX3JlYWRfYWR2X2NobmxfdHhfcG93ZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgYnRzbmRfaGNpY19yZWFkX3R4X3Bvd2VyKHAtPmhjaV9oYW5kbGUsIEJUTV9SRUFEX1JTU0lfVFlQRV9DVVIpOwotICAgIH0KLQotICAgIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLSAgfQotCi0gIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0KLSAgLyogSWYgaGVyZSwgbm8gQkQgQWRkciBmb3VuZCAqLwotICByZXR1cm4gKEJUTV9VTktOT1dOX0FERFIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JlYWRfdHhfcG93ZXJfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgd2hlbiByZWFkaW5nIHRoZSB0eCBwb3dlciB0aW1lcyBvdXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfdHhfcG93ZXJfdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIHRCVE1fQ01QTF9DQiogcF9jYiA9IGJ0bV9jYi5kZXZjYi5wX3R4X3Bvd2VyX2NtcGxfY2I7Ci0gIGJ0bV9jYi5kZXZjYi5wX3R4X3Bvd2VyX2NtcGxfY2IgPSBOVUxMOwotICBpZiAocF9jYikgKCpwX2NiKSgodm9pZCopTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVhZF90eF9wb3dlcl9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZSBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIGlzIHJlY2VpdmVkIGZyb20gdGhlIEhDSSBmb3IgdGhlIHJlYWQgdHggcG93ZXIgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVhZF90eF9wb3dlcl9jb21wbGV0ZSh1aW50OF90KiBwLCBib29sIGlzX2JsZSkgewotICB0QlRNX0NNUExfQ0IqIHBfY2IgPSBidG1fY2IuZGV2Y2IucF90eF9wb3dlcl9jbXBsX2NiOwotICB0QlRNX1RYX1BPV0VSX1JFU1VMVCByZXN1bHQ7Ci0KLSAgYWxhcm1fY2FuY2VsKGJ0bV9jYi5kZXZjYi5yZWFkX3R4X3Bvd2VyX3RpbWVyKTsKLSAgYnRtX2NiLmRldmNiLnBfdHhfcG93ZXJfY21wbF9jYiA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlcmUgd2FzIGEgcmVnaXN0ZXJlZCBjYWxsYmFjaywgY2FsbCBpdCAqLwotICBpZiAocF9jYikgewotICAgIFNUUkVBTV9UT19VSU5UOChyZXN1bHQuaGNpX3N0YXR1cywgcCk7Ci0KLSAgICBpZiAocmVzdWx0LmhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIHJlc3VsdC5zdGF0dXMgPSBCVE1fU1VDQ0VTUzsKLQotICAgICAgaWYgKCFpc19ibGUpIHsKLSAgICAgICAgdWludDE2X3QgaGFuZGxlOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChyZXN1bHQudHhfcG93ZXIsIHApOwotCi0gICAgICAgIHRBQ0xfQ09OTiogcF9hY2xfY2IgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIGlmIChwX2FjbF9jYiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgcmVzdWx0LnJlbV9iZGEgPSBwX2FjbF9jYi0+cmVtb3RlX2FkZHI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOChyZXN1bHQudHhfcG93ZXIsIHApOwotICAgICAgICByZXN1bHQucmVtX2JkYSA9IGJ0bV9jYi5kZXZjYi5yZWFkX3R4X3B3cl9hZGRyOwotICAgICAgfQotICAgICAgTE9HX0RFQlVHKCJUcmFuc21pdCBwb3dlciBjb21wbGV0ZTogdHhfcG93ZXI6JWQgaGNpIHN0YXR1czolcyIsCi0gICAgICAgICAgICAgICAgcmVzdWx0LnR4X3Bvd2VyLAotICAgICAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHJlc3VsdC5oY2lfc3RhdHVzKSkKLSAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQuc3RhdHVzID0gQlRNX0VSUl9QUk9DRVNTSU5HOwotICAgIH0KLQotICAgICgqcF9jYikoJnJlc3VsdCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX3Jzc2lfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgd2hlbiByZWFkaW5nIHRoZSBSU1NJIHRpbWVzIG91dC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVhZF9yc3NpX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICB0QlRNX1JTU0lfUkVTVUxUIHJlc3VsdDsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfcnNzaV9jbXBsX2NiOwotICBidG1fY2IuZGV2Y2IucF9yc3NpX2NtcGxfY2IgPSBOVUxMOwotICByZXN1bHQuc3RhdHVzID0gQlRNX0RFVklDRV9USU1FT1VUOwotICBpZiAocF9jYikgKCpwX2NiKSgmcmVzdWx0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX3Jzc2lfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSByZWFkIHJzc2kgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVhZF9yc3NpX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfcnNzaV9jbXBsX2NiOwotICB0QlRNX1JTU0lfUkVTVUxUIHJlc3VsdDsKLQotICBhbGFybV9jYW5jZWwoYnRtX2NiLmRldmNiLnJlYWRfcnNzaV90aW1lcik7Ci0gIGJ0bV9jYi5kZXZjYi5wX3Jzc2lfY21wbF9jYiA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlcmUgd2FzIGEgcmVnaXN0ZXJlZCBjYWxsYmFjaywgY2FsbCBpdCAqLwotICBpZiAocF9jYikgewotICAgIFNUUkVBTV9UT19VSU5UOChyZXN1bHQuaGNpX3N0YXR1cywgcCk7Ci0gICAgcmVzdWx0LnN0YXR1cyA9IEJUTV9FUlJfUFJPQ0VTU0lORzsKLQotICAgIGlmIChyZXN1bHQuaGNpX3N0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgICAgdWludDE2X3QgaGFuZGxlOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotCi0gICAgICBTVFJFQU1fVE9fVUlOVDgocmVzdWx0LnJzc2ksIHApOwotICAgICAgTE9HX0RFQlVHKCJSZWFkIHJyc2kgY29tcGxldGUgcnNzaTolaGhkIGhjaSBzdGF0dXM6JXMiLCByZXN1bHQucnNzaSwKLSAgICAgICAgICAgICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihyZXN1bHQuaGNpX3N0YXR1cykpCi0gICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKLQotICAgICAgdEFDTF9DT05OKiBwX2FjbF9jYiA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgICAgIGlmIChwX2FjbF9jYiAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlc3VsdC5yZW1fYmRhID0gcF9hY2xfY2ItPnJlbW90ZV9hZGRyOwotICAgICAgICByZXN1bHQuc3RhdHVzID0gQlRNX1NVQ0NFU1M7Ci0gICAgICB9Ci0gICAgfQotICAgICgqcF9jYikoJnJlc3VsdCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgd2hlbiByZWFkaW5nIHRoZSBmYWlsZWQgY29udGFjdCBjb3VudGVyIHRpbWVzIG91dC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICB0QlRNX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfUkVTVUxUIHJlc3VsdDsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jbXBsX2NiOwotICBidG1fY2IuZGV2Y2IucF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NtcGxfY2IgPSBOVUxMOwotICByZXN1bHQuc3RhdHVzID0gQlRNX0RFVklDRV9USU1FT1VUOwotICBpZiAocF9jYikgKCpwX2NiKSgmcmVzdWx0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSByZWFkIGZhaWxlZCBjb250YWN0Ci0gKiAgICAgICAgICAgICAgICAgIGNvdW50ZXIgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jbXBsX2NiOwotICB0QlRNX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfUkVTVUxUIHJlc3VsdDsKLQotICBhbGFybV9jYW5jZWwoYnRtX2NiLmRldmNiLnJlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl90aW1lcik7Ci0gIGJ0bV9jYi5kZXZjYi5wX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY21wbF9jYiA9IE5VTEw7Ci0KLSAgLyogSWYgdGhlcmUgd2FzIGEgcmVnaXN0ZXJlZCBjYWxsYmFjaywgY2FsbCBpdCAqLwotICBpZiAocF9jYikgewotICAgIHVpbnQxNl90IGhhbmRsZTsKLSAgICBTVFJFQU1fVE9fVUlOVDgocmVzdWx0LmhjaV9zdGF0dXMsIHApOwotCi0gICAgaWYgKHJlc3VsdC5oY2lfc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgICByZXN1bHQuc3RhdHVzID0gQlRNX1NVQ0NFU1M7Ci0KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLQotICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZXN1bHQuZmFpbGVkX2NvbnRhY3RfY291bnRlciwgcCk7Ci0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIkZhaWxlZCBjb250YWN0IGNvdW50ZXIgY29tcGxldGU6IGNvdW50ZXIgJXUsIGhjaSBzdGF0dXM6JXMiLAotICAgICAgICAgIHJlc3VsdC5mYWlsZWRfY29udGFjdF9jb3VudGVyLAotICAgICAgICAgIGhjaV9zdGF0dXNfY29kZV90ZXh0KHRvX2hjaV9zdGF0dXNfY29kZShyZXN1bHQuaGNpX3N0YXR1cykpLmNfc3RyKCkpOwotCi0gICAgICB0QUNMX0NPTk4qIHBfYWNsX2NiID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoYW5kbGUpOwotICAgICAgaWYgKHBfYWNsX2NiICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzdWx0LnJlbV9iZGEgPSBwX2FjbF9jYi0+cmVtb3RlX2FkZHI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdC5zdGF0dXMgPSBCVE1fRVJSX1BST0NFU1NJTkc7Ci0gICAgfQotCi0gICAgKCpwX2NiKSgmcmVzdWx0KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSByZWFkIGF1dG9tYXRpYyBmbHVzaAotICogICAgICAgICAgICAgICAgICB0aW1lb3V0IHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUodWludDhfdCogcCkgewotICB0QlRNX0NNUExfQ0IqIHBfY2IgPSBidG1fY2IuZGV2Y2IucF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jbXBsX2NiOwotICB0QlRNX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUX1JFU1VMVCByZXN1bHQ7Ci0KLSAgYWxhcm1fY2FuY2VsKGJ0bV9jYi5kZXZjYi5yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X3RpbWVyKTsKLSAgYnRtX2NiLmRldmNiLnBfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY21wbF9jYiA9IG51bGxwdHI7Ci0KLSAgLyogSWYgdGhlcmUgd2FzIGEgcmVnaXN0ZXJlZCBjYWxsYmFjaywgY2FsbCBpdCAqLwotICBpZiAocF9jYikgewotICAgIHVpbnQxNl90IGhhbmRsZTsKLSAgICBTVFJFQU1fVE9fVUlOVDgocmVzdWx0LmhjaV9zdGF0dXMsIHApOwotICAgIHJlc3VsdC5zdGF0dXMgPSBCVE1fRVJSX1BST0NFU1NJTkc7Ci0KLSAgICBpZiAocmVzdWx0LmhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIHJlc3VsdC5zdGF0dXMgPSBCVE1fU1VDQ0VTUzsKLQotICAgICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZXN1bHQuYXV0b21hdGljX2ZsdXNoX3RpbWVvdXQsIHApOwotICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICJSZWFkIGF1dG9tYXRpYyBmbHVzaCB0aW1lb3V0IGNvbXBsZXRlIHRpbWVvdXQ6JWh1IGhjaV9zdGF0dXM6JXMiLAotICAgICAgICAgIHJlc3VsdC5hdXRvbWF0aWNfZmx1c2hfdGltZW91dCwKLSAgICAgICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihyZXN1bHQuaGNpX3N0YXR1cykpCi0gICAgICAgICAgICAgIC5jX3N0cigpKTsKLQotICAgICAgdEFDTF9DT05OKiBwX2FjbF9jYiA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgICAgIGlmIChwX2FjbF9jYiAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlc3VsdC5yZW1fYmRhID0gcF9hY2xfY2ItPnJlbW90ZV9hZGRyOwotICAgICAgfQotICAgIH0KLSAgICAoKnBfY2IpKCZyZXN1bHQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgd2hlbiByZWFkaW5nIHRoZSBsaW5rIHF1YWxpdHkgdGltZXMgb3V0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV90aW1lb3V0KFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfbGlua19xdWFsX2NtcGxfY2I7Ci0gIGJ0bV9jYi5kZXZjYi5wX2xpbmtfcXVhbF9jbXBsX2NiID0gTlVMTDsKLSAgaWYgKHBfY2IpICgqcF9jYikoKHZvaWQqKU5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JlYWRfbGlua19xdWFsaXR5X2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgSENJIGZvciB0aGUgcmVhZCBsaW5rIHF1YWxpdHkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfbGlua19xdWFsaXR5X2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfbGlua19xdWFsX2NtcGxfY2I7Ci0gIHRCVE1fTElOS19RVUFMSVRZX1JFU1VMVCByZXN1bHQ7Ci0KLSAgYWxhcm1fY2FuY2VsKGJ0bV9jYi5kZXZjYi5yZWFkX2xpbmtfcXVhbGl0eV90aW1lcik7Ci0gIGJ0bV9jYi5kZXZjYi5wX2xpbmtfcXVhbF9jbXBsX2NiID0gTlVMTDsKLQotICAvKiBJZiB0aGVyZSB3YXMgYSByZWdpc3RlcmVkIGNhbGxiYWNrLCBjYWxsIGl0ICovCi0gIGlmIChwX2NiKSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHJlc3VsdC5oY2lfc3RhdHVzLCBwKTsKLQotICAgIGlmIChyZXN1bHQuaGNpX3N0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgICAgdWludDE2X3QgaGFuZGxlOwotICAgICAgcmVzdWx0LnN0YXR1cyA9IEJUTV9TVUNDRVNTOwotCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0KLSAgICAgIFNUUkVBTV9UT19VSU5UOChyZXN1bHQubGlua19xdWFsaXR5LCBwKTsKLSAgICAgIExPR19ERUJVRygiQlRNIExpbmsgUXVhbGl0eSBDb21wbGV0ZTogTGluayBRdWFsaXR5ICVkLCBoY2kgc3RhdHVzOiVzIiwKLSAgICAgICAgICAgICAgICByZXN1bHQubGlua19xdWFsaXR5LAotICAgICAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHJlc3VsdC5oY2lfc3RhdHVzKSkKLSAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwotCi0gICAgICB0QUNMX0NPTk4qIHBfYWNsX2NiID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoYW5kbGUpOwotICAgICAgaWYgKHBfYWNsX2NiICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzdWx0LnJlbV9iZGEgPSBwX2FjbF9jYi0+cmVtb3RlX2FkZHI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdC5zdGF0dXMgPSBCVE1fRVJSX1BST0NFU1NJTkc7Ci0gICAgfQotCi0gICAgKCpwX2NiKSgmcmVzdWx0KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JlbW92ZV9hY2wKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRpc2Nvbm5lY3QgYW4gQUNMIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQsIG90aGVyd2lzZQotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fcmVtb3ZlX2FjbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbnN1cHBvcnRlZCI7Ci0gICAgfQotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9EaXNjb25uZWN0TGluayhiZF9hZGRyKTsKLSAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gIH0KLQotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm4gQlRNX1VOS05PV05fQUREUjsKLSAgfQotCi0gIGlmIChwX2FjbC0+SGFuZGxlKCkgPT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgTE9HX1dBUk4oIkNhbm5vdCByZW1vdmUgdW5rbm93biBhY2wgYmRfYWRkcjolcyB0cmFuc3BvcnQ6JXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSwgYnRfdHJhbnNwb3J0X3RleHQodHJhbnNwb3J0KS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRNX1VOS05PV05fQUREUjsKLSAgfQotCi0gIGlmIChwX2FjbC0+cnNfZGlzY19wZW5kaW5nID09IEJUTV9TRUNfUlNfUEVORElORykgewotICAgIExPR19ERUJVRygKLSAgICAgICAgIkRlbGF5IGRpc2Nvbm5lY3QgdW50aWwgcm9sZSBzd2l0Y2ggaXMgY29tcGxldGUgYmRfYWRkcjolcyAiCi0gICAgICAgICJ0cmFuc3BvcnQ6JXMiLAotICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIGJ0X3RyYW5zcG9ydF90ZXh0KHRyYW5zcG9ydCkuY19zdHIoKSk7Ci0gICAgcF9hY2wtPnJzX2Rpc2NfcGVuZGluZyA9IEJUTV9TRUNfRElTQ19QRU5ESU5HOwotICAgIHJldHVybiBCVE1fU1VDQ0VTUzsKLSAgfQotCi0gIGhjaV9idHNuZF9oY2ljX2Rpc2Nvbm5lY3QoKnBfYWNsLCBIQ0lfRVJSX1BFRVJfVVNFUik7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBCVE0uICBJZiBjYWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDB4RkYsIGl0IHNpbXBseSByZXR1cm5zIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG5ldyBvciBjdXJyZW50IHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQlRNX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBidG1fY2IudHJhY2VfbGV2ZWwgPSBuZXdfbGV2ZWw7Ci0KLSAgcmV0dXJuIChidG1fY2IudHJhY2VfbGV2ZWwpOwotfQotCi12b2lkIGJ0bV9jb250X3Jzd2l0Y2hfZnJvbV9oYW5kbGUodWludDE2X3QgaGNpX2hhbmRsZSkgewotICB0QUNMX0NPTk4qIHAgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhjaV9oYW5kbGUpOwotICBpZiAocCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlJvbGUgc3dpdGNoIHJlY2VpdmVkIGJ1dCB3aXRoIG5vIGFjdGl2ZSBBQ0wiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBDaGVjayB0byBzZWUgaWYgZW5jcnlwdGlvbiBuZWVkcyB0byBiZSB0dXJuZWQgb2ZmIGlmIHBlbmRpbmcKLSAgIGNoYW5nZSBvZiBsaW5rIGtleSBvciByb2xlIHN3aXRjaCAqLwotICBpZiAocC0+aXNfc3dpdGNoX3JvbGVfbW9kZV9jaGFuZ2UoKSkgewotICAgIC8qIE11c3QgdHVybiBvZmYgRW5jcnlwdGlvbiBmaXJzdCBpZiBuZWNlc3NhcnkgKi8KLSAgICAvKiBTb21lIGRldmljZXMgZG8gbm90IHN1cHBvcnQgc3dpdGNoIG9yIGNoYW5nZSBvZiBsaW5rIGtleSB3aGlsZSBlbmNyeXB0aW9uCi0gICAgICogaXMgb24gKi8KLSAgICBpZiAocC0+aXNfZW5jcnlwdGVkICYmICFJc0VwckF2YWlsYWJsZSgqcCkpIHsKLSAgICAgIHAtPnNldF9lbmNyeXB0aW9uX29mZigpOwotICAgICAgaWYgKHAtPmlzX3N3aXRjaF9yb2xlX21vZGVfY2hhbmdlKCkpIHsKLSAgICAgICAgcC0+c2V0X3N3aXRjaF9yb2xlX2VuY3J5cHRpb25fb2ZmKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIC8qIEVuY3J5cHRpb24gbm90IHVzZWQgb3IgRVBSIHN1cHBvcnRlZCwgY29udGludWUgd2l0aCBzd2l0Y2gKLSAgICAgICAgICAgICAgYW5kL29yIGNoYW5nZSBvZiBsaW5rIGtleSAqLwotICAgIHsKLSAgICAgIGlmIChwLT5pc19zd2l0Y2hfcm9sZV9tb2RlX2NoYW5nZSgpKSB7Ci0gICAgICAgIGludGVybmFsXy5oY2lfc3RhcnRfcm9sZV9zd2l0Y2hfdG9fY2VudHJhbCgqcCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYWNsX3Jlc3VibWl0X3BhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmQgcGVuZGluZyBwYWdlIHJlcXVlc3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYWNsX3Jlc3VibWl0X3BhZ2Uodm9pZCkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwcDsKLSAgLyogSWYgdGhlcmUgd2VyZSBvdGhlciBwYWdlIHJlcXVlc3Qgc2NoZWR1bGUgY2FuIHN0YXJ0IHRoZSBuZXh0IG9uZSAqLwotICBwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKGJ0bV9jYi5wYWdlX3F1ZXVlKTsKLSAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICAvKiBza2lwIDMgKDIgYnl0ZXMgb3Bjb2RlIGFuZCAxIGJ5dGUgbGVuKSB0byBnZXQgdG8gdGhlIGJkX2FkZHIKLSAgICAgKiBmb3IgYm90aCBjcmVhdGVfY29ubiBhbmQgcm10X25hbWUgKi8KLSAgICBwcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQgKyAzOwotCi0gICAgUmF3QWRkcmVzcyBiZGE7Ci0gICAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHBwKTsKLQotICAgIGJ0bV9jYi5jb25uZWN0aW5nX2JkYSA9IGJkYTsKLSAgICBtZW1jcHkoYnRtX2NiLmNvbm5lY3RpbmdfZGMsIGJ0bV9nZXRfZGV2X2NsYXNzKGJkYSksIERFVl9DTEFTU19MRU4pOwotCi0gICAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHBfYnVmKTsKLSAgfSBlbHNlIHsKLSAgICBidG1fY2IucGFnaW5nID0gZmFsc2U7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9hY2xfcmVzZXRfcGFnaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZXQgcGFnaW5nIHRvIGZhbHNlIGFuZCBmcmVlIHRoZSBwYWdlIHF1ZXVlIC0gY2FsbGVkIGF0Ci0gKiAgICAgICAgICAgICAgICAgIGhjaV9yZXNldAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9hY2xfcmVzZXRfcGFnaW5nKHZvaWQpIHsKLSAgQlRfSERSKiBwOwotICAvKiBJZiB3ZSBzZW50IHJlc2V0IHdlIGFyZSBkZWZpbml0ZWx5IG5vdCBwYWdpbmcgYW55IG1vcmUgKi8KLSAgd2hpbGUgKChwID0gKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoYnRtX2NiLnBhZ2VfcXVldWUpKSAhPSBOVUxMKQotICAgIG9zaV9mcmVlKHApOwotCi0gIGJ0bV9jYi5wYWdpbmcgPSBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9hY2xfcGFnaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIGEgcGFnaW5nIGNvbW1hbmQgb3IgcXVldWUgaXQgaW4gYnRtX2NiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2FjbF9wYWdpbmcoQlRfSERSKiBwLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGRldmljZSBpbml0aWF0aW5nIHRoZSBjb25uZWN0aW9uLgotICAvLyBJZiBubyByb2xlIGNoYW5nZSBpcyByZXF1ZXN0ZWQgZnJvbSB0aGUgcmVtb3RlIGRldmljZSwgd2Ugd2FudAotICAvLyB0byBjbGFzc2lmeSB0aGUgY29ubmVjdGlvbiBpbml0aWF0b3IgYXMgdGhlIGNlbnRyYWwgZGV2aWNlLgotICBpZiAoZGVsYXllZF9yb2xlX2NoYW5nZV8gPT0gbnVsbHB0cikgewotICAgIFJvbGVDaGFuZ2VWaWV3IHJvbGVfY2hhbmdlOwotICAgIHJvbGVfY2hhbmdlLmJkX2FkZHIgPSBiZGE7Ci0gICAgcm9sZV9jaGFuZ2UubmV3X3JvbGUgPSBIQ0lfUk9MRV9DRU5UUkFMOwotICAgIGRlbGF5ZWRfcm9sZV9jaGFuZ2VfID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxSb2xlQ2hhbmdlVmlldz4oc3RkOjptb3ZlKHJvbGVfY2hhbmdlKSk7Ci0gIH0KLSAgaWYgKCFCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRhLCBCVF9UUkFOU1BPUlRfQlJfRURSKSkgewotICAgIFZMT0coMSkgPDwgImNvbm5lY3RpbmdfYmRhOiAiIDw8IGJ0bV9jYi5jb25uZWN0aW5nX2JkYTsKLSAgICBpZiAoYnRtX2NiLnBhZ2luZyAmJiBiZGEgPT0gYnRtX2NiLmNvbm5lY3RpbmdfYmRhKSB7Ci0gICAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKGJ0bV9jYi5wYWdlX3F1ZXVlLCBwKTsKLSAgICB9IGVsc2UgewotICAgICAgYnRtX2NiLmNvbm5lY3RpbmdfYmRhID0gYmRhOwotICAgICAgbWVtY3B5KGJ0bV9jYi5jb25uZWN0aW5nX2RjLCBidG1fZ2V0X2Rldl9jbGFzcyhiZGEpLCBERVZfQ0xBU1NfTEVOKTsKLQotICAgICAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotICAgIH0KLQotICAgIGJ0bV9jYi5wYWdpbmcgPSB0cnVlOwotICB9IGVsc2UgLyogQUNMIGlzIGFscmVhZHkgdXAgKi8KLSAgewotICAgIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2FjbF9ub3RpZl9jb25uX2NvbGxpc2lvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBjb25uZWN0aW9uIGNvbGxpc2lvbiBldmVudCB0byB1cHBlciBsYXllciBpZiByZWdpc3RlcmVkCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9hY2xfbm90aWZfY29ubl9jb2xsaXNpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIGRvX2luX21haW5fdGhyZWFkKEZST01fSEVSRSwgYmFzZTo6QmluZChidGFfc3lzX25vdGlmeV9jb2xsaXNpb24sIGJkYSkpOwotfQotCi1ib29sIEJUTV9CTEVfSVNfUkVTT0xWRV9CREEoY29uc3QgUmF3QWRkcmVzcyYgeCkgewotICByZXR1cm4gKCh4LmFkZHJlc3MpWzBdICYgQkxFX1JFU09MVkVfQUREUl9NQVNLKSA9PSBCTEVfUkVTT0xWRV9BRERSX01TQjsKLX0KLQotYm9vbCBhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBpZGVudGl0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBpZGVudGl0eV9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJMRV9BRERSX1RZUEUgcnJhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJwYSkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkYSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChycmFfdHlwZSA9PSB0QlRNX1NFQ19CTEU6OkJUTV9CTEVfQUREUl9QU0VVRE8pIHsKLSAgICAvKiB1c2UgaWRlbnRpdHkgYWRkcmVzcywgcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIgaXMgZW1wdHkgKi8KLSAgICBpZiAocnBhLklzRW1wdHkoKSkgewotICAgICAgcF9hY2wtPmFjdGl2ZV9yZW1vdGVfYWRkcl90eXBlID0gaWRlbnRpdHlfYWRkcmVzc190eXBlOwotICAgICAgcF9hY2wtPmFjdGl2ZV9yZW1vdGVfYWRkciA9IGlkZW50aXR5X2FkZHJlc3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfYWNsLT5hY3RpdmVfcmVtb3RlX2FkZHJfdHlwZSA9IEJMRV9BRERSX1JBTkRPTTsKLSAgICAgIHBfYWNsLT5hY3RpdmVfcmVtb3RlX2FkZHIgPSBycGE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHBfYWNsLT5hY3RpdmVfcmVtb3RlX2FkZHJfdHlwZSA9IHJyYV90eXBlOwotICAgIHBfYWNsLT5hY3RpdmVfcmVtb3RlX2FkZHIgPSBycGE7Ci0gIH0KLQotICBMT0dfREVCVUcoImFjdGl2ZV9yZW1vdGVfYWRkcl90eXBlOiAlZCAiLCBwX2FjbC0+YWN0aXZlX3JlbW90ZV9hZGRyX3R5cGUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFwX2FjbC0+cGVlcl9sZV9mZWF0dXJlc192YWxpZCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiQ2hlY2tpbmcgcmVtb3RlIGZlYXR1cmVzIGJ1dCByZW1vdGUgZmVhdHVyZSByZWFkIGlzICIKLSAgICAgICAgImluY29tcGxldGUiKTsKLSAgfQotICByZXR1cm4gSENJX0xFX0NPTk5fUEFSQU1fUkVRX1NVUFBPUlRFRChwX2FjbC0+cGVlcl9sZV9mZWF0dXJlcyk7Ci19Ci0KLWJvb2wgYWNsX3BlZXJfc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChyZW1vdGVfYmRhLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIXBfYWNsLT5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkWzBdKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJDaGVja2luZyByZW1vdGUgZmVhdHVyZXMgYnV0IHJlbW90ZSBmZWF0dXJlIHJlYWQgaXMgIgotICAgICAgICAiaW5jb21wbGV0ZSIpOwotICB9Ci0gIHJldHVybiBIQ0lfU05JRkZfU1VCX1JBVEVfU1VQUE9SVEVEKHBfYWNsLT5wZWVyX2xtcF9mZWF0dXJlX3BhZ2VzWzBdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkQ29ubmVjdGlvbkFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgbG9jYWwgZGV2aWNlIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1JlYWRDb25uZWN0aW9uQWRkcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGxvY2FsX2Nvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVhZENvbm5lY3Rpb25BZGRyKHJlbW90ZV9iZGEsIGxvY2FsX2Nvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWRkcl90eXBlKTsKLSAgfQotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZWFkQ29ubmVjdGlvbkFkZHIocmVtb3RlX2JkYSwgbG9jYWxfY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hZGRyX3R5cGUpOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NjYW5uaW5nX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QUNMX1JlYWRDb25uZWN0aW9uQWRkcmVzcyhyZW1vdGVfYmRhLCBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWRkcl90eXBlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKHJlbW90ZV9iZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgaWYgKHBfYWNsID09IE5VTEwpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotICBsb2NhbF9jb25uX2FkZHIgPSBwX2FjbC0+Y29ubl9hZGRyOwotICAqcF9hZGRyX3R5cGUgPSBwX2FjbC0+Y29ubl9hZGRyX3R5cGU7Ci0KLSAgTE9HX0RFQlVHKCJCVE1fUmVhZENvbm5lY3Rpb25BZGRyIGFkZHJlc3MgdHlwZTogJWQgYWRkcjogMHglMDJ4IiwKLSAgICAgICAgICAgIHBfYWNsLT5jb25uX2FkZHJfdHlwZSwgcF9hY2wtPmNvbm5fYWRkci5hZGRyZXNzWzBdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Jc0JsZUNvbm5lY3Rpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGhhbmRsZQotICogICAgICAgICAgICAgICAgICBmb3IgYW4gTEUgbGluawotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIExFIGxpbmssIG90aGVyd2lzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fSXNCbGVDb25uZWN0aW9uKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICBBU1NFUlRfTE9HKGZhbHNlLCAiVGhpcyBzaG91bGQgbm90IGJlIGludm9rZWQgZnJvbSBjb2RlIHBhdGgiKTsKLSAgfQotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfSXNMZUxpbmsoaGNpX2hhbmRsZSk7Ci0gIH0KLQotICBjb25zdCB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoY2lfaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHBfYWNsLT5pc190cmFuc3BvcnRfYmxlKCk7Ci19Ci0KLWNvbnN0IFJhd0FkZHJlc3MgYWNsX2FkZHJlc3NfZnJvbV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gUmF3QWRkcmVzczo6a0VtcHR5OwotICB9Ci0gIHJldHVybiBwX2FjbC0+cmVtb3RlX2FkZHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3JlZnJlc2hfbG9jYWxfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVmcmVzaCB0aGUgY3VycmVudGx5IHVzZWQgcmVzb2x2YWJsZSBwcml2YXRlCi0gKiAgICAgICAgICAgICAgICAgIGFkZHJlc3MgZm9yIHRoZSBhY3RpdmUgbGluayB0byB0aGUgcmVtb3RlIGRldmljZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfcmVmcmVzaF9sb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocHNldWRvX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYnRtX2NiLmJsZV9jdHJfY2IucHJpdmFjeV9tb2RlID09IEJUTV9QUklWQUNZX05PTkUpIHsKLSAgICBwX2FjbC0+Y29ubl9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gICAgcF9hY2wtPmNvbm5fYWRkciA9ICpjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FkZHJlc3MoKTsKLSAgfSBlbHNlIHsKLSAgICBwX2FjbC0+Y29ubl9hZGRyX3R5cGUgPSBCTEVfQUREUl9SQU5ET007Ci0gICAgaWYgKGxvY2FsX3JwYS5Jc0VtcHR5KCkpIHsKLSAgICAgIHBfYWNsLT5jb25uX2FkZHIgPSBidG1fY2IuYmxlX2N0cl9jYi5hZGRyX21nbnRfY2IucHJpdmF0ZV9hZGRyOwotICAgIH0gZWxzZSB7Ci0gICAgICBwX2FjbC0+Y29ubl9hZGRyID0gbG9jYWxfcnBhOwotICAgIH0KLSAgfQotfQotCi1ib29sIHNjb19wZWVyX3N1cHBvcnRzX2VzY29fMm1fcGh5KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgdWludDhfdCogZmVhdHVyZXMgPSBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzKHJlbW90ZV9iZGEpOwotICBpZiAoZmVhdHVyZXMgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKAotICAgICAgICAiQ2hlY2tpbmcgcmVtb3RlIGZlYXR1cmVzIGJ1dCByZW1vdGUgZmVhdHVyZSByZWFkIGlzICIKLSAgICAgICAgImluY29tcGxldGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIEhDSV9FRFJfRVNDT18yTVBTX1NVUFBPUlRFRChmZWF0dXJlcyk7Ci19Ci0KLWJvb2wgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB1aW50OF90KiBmZWF0dXJlcyA9IEJUTV9SZWFkUmVtb3RlRmVhdHVyZXMocmVtb3RlX2JkYSk7Ci0gIGlmIChmZWF0dXJlcyA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJDaGVja2luZyByZW1vdGUgZmVhdHVyZXMgYnV0IHJlbW90ZSBmZWF0dXJlIHJlYWQgaXMgIgotICAgICAgICAiaW5jb21wbGV0ZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gSENJX0VEUl9FU0NPXzNNUFNfU1VQUE9SVEVEKGZlYXR1cmVzKTsKLX0KLQotYm9vbCBhY2xfaXNfc3dpdGNoX3JvbGVfaWRsZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHBfYWNsLT5pc19zd2l0Y2hfcm9sZV9pZGxlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgQlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVhZCB0aGUgcmVtb3RlIGRldmljZSBhZGRyZXNzIGN1cnJlbnRseSB1c2VkCi0gKgotICogUGFyYW1ldGVycyAgICAgcHNldWRvX2FkZHI6IHBzZXVkbyByYW5kb20gYWRkcmVzcyBhdmFpbGFibGUKLSAqICAgICAgICAgICAgICAgIGNvbm5fYWRkcjpjb25uZWN0aW9uIGFkZHJlc3MgdXNlZAotICogICAgICAgICAgICAgICAgcF9hZGRyX3R5cGUgOiBCRCBBZGRyZXNzIHR5cGUsIFB1YmxpYyBvciBSYW5kb20gb2YgdGhlIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZAotICoKLSAqIFJldHVybnMgICAgICAgIGJvb2wsIHRydWUgaWYgY29ubmVjdGlvbiB0byByZW1vdGUgZGV2aWNlIGV4aXN0cywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIoY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIocHNldWRvX2FkZHIsIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWRkcl90eXBlKTsKLSAgfQotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKAotICAgICAgICBwc2V1ZG9fYWRkciwgY29ubl9hZGRyLCBwX2FkZHJfdHlwZSk7Ci0gIH0KLQotICBib29sIHN0ID0gdHJ1ZTsKLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChwc2V1ZG9fYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLQotICBpZiAocF9hY2wgPT0gTlVMTCkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29ubl9hZGRyID0gcF9hY2wtPmFjdGl2ZV9yZW1vdGVfYWRkcjsKLSAgKnBfYWRkcl90eXBlID0gcF9hY2wtPmFjdGl2ZV9yZW1vdGVfYWRkcl90eXBlOwotICByZXR1cm4gc3Q7Ci19Ci0KLXVpbnQ4X3QgYWNsX2xpbmtfcm9sZV9mcm9tX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gSENJX1JPTEVfVU5LTk9XTjsKLSAgfQotICByZXR1cm4gcF9hY2wtPmxpbmtfcm9sZTsKLX0KLQotYm9vbCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfcGFja2V0X2V4dGVuc2lvbih1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhjaV9oYW5kbGUpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIXBfYWNsLT5wZWVyX2xlX2ZlYXR1cmVzX3ZhbGlkKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJDaGVja2luZyByZW1vdGUgZmVhdHVyZXMgYnV0IHJlbW90ZSBmZWF0dXJlIHJlYWQgaXMgIgotICAgICAgICAiaW5jb21wbGV0ZSIpOwotICB9Ci0gIHJldHVybiBIQ0lfTEVfREFUQV9MRU5fRVhUX1NVUFBPUlRFRChwX2FjbC0+cGVlcl9sZV9mZWF0dXJlcyk7Ci19Ci0KLWJvb2wgYWNsX3BlZXJfc3VwcG9ydHNfYmxlXzJtX3BoeSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhjaV9oYW5kbGUpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIXBfYWNsLT5wZWVyX2xlX2ZlYXR1cmVzX3ZhbGlkKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJDaGVja2luZyByZW1vdGUgZmVhdHVyZXMgYnV0IHJlbW90ZSBmZWF0dXJlIHJlYWQgaXMgIgotICAgICAgICAiaW5jb21wbGV0ZSIpOwotICB9Ci0gIHJldHVybiBIQ0lfTEVfMk1fUEhZX1NVUFBPUlRFRChwX2FjbC0+cGVlcl9sZV9mZWF0dXJlcyk7Ci19Ci0KLWJvb2wgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2NvZGVkX3BoeSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhjaV9oYW5kbGUpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIXBfYWNsLT5wZWVyX2xlX2ZlYXR1cmVzX3ZhbGlkKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJDaGVja2luZyByZW1vdGUgZmVhdHVyZXMgYnV0IHJlbW90ZSBmZWF0dXJlIHJlYWQgaXMgIgotICAgICAgICAiaW5jb21wbGV0ZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gSENJX0xFX0NPREVEX1BIWV9TVVBQT1JURUQocF9hY2wtPnBlZXJfbGVfZmVhdHVyZXMpOwotfQotCi12b2lkIGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb24odEhDSV9TVEFUVVMgYWNsX2Rpc2NfcmVhc29uKSB7Ci0gIGJ0bV9jYi5hY2xfY2JfLnNldF9kaXNjb25uZWN0X3JlYXNvbihhY2xfZGlzY19yZWFzb24pOwotfQotCi1ib29sIGFjbF9pc19yb2xlX3N3aXRjaF9hbGxvd2VkKCkgewotICByZXR1cm4gYnRtX2NiLmFjbF9jYl8uRGVmYXVsdExpbmtQb2xpY3koKSAmCi0gICAgICAgICBIQ0lfRU5BQkxFX0NFTlRSQUxfUEVSSVBIRVJBTF9TV0lUQ0g7Ci19Ci0KLXVpbnQxNl90IGFjbF9nZXRfc3VwcG9ydGVkX3BhY2tldF90eXBlcygpIHsKLSAgcmV0dXJuIGJ0bV9jYi5hY2xfY2JfLkRlZmF1bHRQYWNrZXRUeXBlcygpOwotfQotCi1ib29sIGFjbF9zZXRfcGVlcl9sZV9mZWF0dXJlc19mcm9tX2hhbmRsZSh1aW50MTZfdCBoY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcCkgewotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoY2lfaGFuZGxlKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU1RSRUFNX1RPX0FSUkFZKHBfYWNsLT5wZWVyX2xlX2ZlYXR1cmVzLCBwLCBCRF9GRUFUVVJFU19MRU4pOwotICBwX2FjbC0+cGVlcl9sZV9mZWF0dXJlc192YWxpZCA9IHRydWU7Ci0gIExPR19ERUJVRygiQ29tcGxldGVkIGxlIGZlYXR1cmUgcmVhZCByZXF1ZXN0Iik7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIG9uX2FjbF9icl9lZHJfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuY19tb2RlKSB7Ci0gIGlmIChkZWxheWVkX3JvbGVfY2hhbmdlXyAhPSBudWxscHRyICYmIGRlbGF5ZWRfcm9sZV9jaGFuZ2VfLT5iZF9hZGRyID09IGJkYSkgewotICAgIGJ0bV9zZWNfY29ubmVjdGVkKGJkYSwgaGFuZGxlLCBIQ0lfU1VDQ0VTUywgZW5jX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgZGVsYXllZF9yb2xlX2NoYW5nZV8tPm5ld19yb2xlKTsKLSAgfSBlbHNlIHsKLSAgICBidG1fc2VjX2Nvbm5lY3RlZChiZGEsIGhhbmRsZSwgSENJX1NVQ0NFU1MsIGVuY19tb2RlKTsKLSAgfQotICBkZWxheWVkX3JvbGVfY2hhbmdlXyA9IG51bGxwdHI7Ci0gIGJ0bV9hY2xfc2V0X3BhZ2luZyhmYWxzZSk7Ci0gIGwyY19saW5rX2hjaV9jb25uX2NvbXAoSENJX1NVQ0NFU1MsIGhhbmRsZSwgYmRhKTsKLSAgY29uc3RleHByIHVpbnQxNl90IGxpbmtfc3VwZXJ2aXNpb25fdGltZW91dCA9IDgwMDA7Ci0gIEJUTV9TZXRMaW5rU3VwZXJUb3V0KGJkYSwgbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KTsKLQotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyoKLSAgICogVGhlIGxlZ2FjeSBjb2RlIHBhdGggaW5mb3JtcyB0aGUgdXBwZXIgbGF5ZXIgdmlhIHRoZSBCVEEKLSAgICogbGF5ZXIgYWZ0ZXIgYWxsIHJlbGV2YW50IHJlYWRfcmVtb3RlXyBjb21tYW5kcyBhcmUgY29tcGxldGUuCi0gICAqIFRoZSBHRCBjb2RlIHBhdGggaGFzIG93bmVyc2hpcCBvZiB0aGUgcmVhZF9yZW1vdGVfIGNvbW1hbmRzCi0gICAqIGFuZCB0aHVzIG1heSBpbmZvcm0gdGhlIHVwcGVyIGxheWVycyBhYm91dCB0aGUgY29ubmVjdGlvbi4KLSAgICovCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICBOb3RpZnlBY2xMaW5rVXAoKnBfYWNsKTsKLSAgfQotfQotCi12b2lkIG9uX2FjbF9icl9lZHJfZmFpbGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIEFTU0VSVF9MT0coc3RhdHVzICE9IEhDSV9TVUNDRVNTLAotICAgICAgICAgICAgICJTdWNjZXNzZnVsIGNvbm5lY3Rpb24gZW50ZXJpbmcgZmFpbGluZyBjb2RlIHBhdGgiKTsKLSAgaWYgKGRlbGF5ZWRfcm9sZV9jaGFuZ2VfICE9IG51bGxwdHIgJiYgZGVsYXllZF9yb2xlX2NoYW5nZV8tPmJkX2FkZHIgPT0gYmRhKSB7Ci0gICAgYnRtX3NlY19jb25uZWN0ZWQoYmRhLCBIQ0lfSU5WQUxJRF9IQU5ETEUsIHN0YXR1cywgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgZGVsYXllZF9yb2xlX2NoYW5nZV8tPm5ld19yb2xlKTsKLSAgfSBlbHNlIHsKLSAgICBidG1fc2VjX2Nvbm5lY3RlZChiZGEsIEhDSV9JTlZBTElEX0hBTkRMRSwgc3RhdHVzLCBmYWxzZSk7Ci0gIH0KLSAgZGVsYXllZF9yb2xlX2NoYW5nZV8gPSBudWxscHRyOwotICBidG1fYWNsX3NldF9wYWdpbmcoZmFsc2UpOwotICBsMmNfbGlua19oY2lfY29ubl9jb21wKHN0YXR1cywgSENJX0lOVkFMSURfSEFORExFLCBiZGEpOwotfQotCi12b2lkIGJ0bV9hY2xfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgZW5jX21vZGUpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIEhDSV9TVUNDRVNTOgotICAgICAgcmV0dXJuIG9uX2FjbF9icl9lZHJfY29ubmVjdGVkKGJkYSwgaGFuZGxlLCBlbmNfbW9kZSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBvbl9hY2xfYnJfZWRyX2ZhaWxlZChiZGEsIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQodWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgTE9HX0lORk8oIklTTyBkaXNjb25uZWN0aW9uIGZyb20gR0QsIGhhbmRsZTogMHglMDJ4LCByZWFzb246IDB4JTAyeCIsIGhhbmRsZSwKLSAgICAgICAgICAgcmVhc29uKTsKLSAgYmx1ZXRvb3RoOjpoY2k6Oklzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoaGFuZGxlLCByZWFzb24pOwotfQotCi12b2lkIGJ0bV9hY2xfZGlzY29ubmVjdGVkKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBkaXNjb25uZWN0IHdpdGggZXJyb3I6JXMiLAotICAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgfQotCi0gIC8qIFRoZXJlIGNhbiBiZSBhIGNhc2Ugd2hlbiB3ZSByZWplY3RlZCBQSU4gY29kZSBhdXRoZW50aWNhdGlvbiAqLwotICAvKiBvdGhlcndpc2Ugc2F2ZSBhIG5ldyByZWFzb24gKi8KLSAgaWYgKGJ0bV9nZXRfYWNsX2Rpc2NfcmVhc29uX2NvZGUoKSAhPSBIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZKSB7Ci0gICAgYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4ocmVhc29uKSk7Ci0gIH0KLQotICAvKiBJZiBMMkNBUCBvciBTQ08gZG9lc24ndCBrbm93IGFib3V0IGl0LCBzZW5kIGl0IHRvIElTTyAqLwotICBpZiAoIWwyY19saW5rX2hjaV9kaXNjX2NvbXAoaGFuZGxlLCByZWFzb24pICYmCi0gICAgICAhYnRtX3Njb19yZW1vdmVkKGhhbmRsZSwgcmVhc29uKSkgewotICAgIGJsdWV0b290aDo6aGNpOjpJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVEaXNjb25uZWN0KGhhbmRsZSwgcmVhc29uKTsKLSAgfQotCi0gIC8qIE5vdGlmeSBzZWN1cml0eSBtYW5hZ2VyICovCi0gIGJ0bV9zZWNfZGlzY29ubmVjdGVkKGhhbmRsZSwgcmVhc29uKTsKLX0KLQotY29uc3RleHByIHVpbnQxNl90IGtEZWZhdWx0UGFja2V0VHlwZXMgPQotICAgIEhDSV9QS1RfVFlQRVNfTUFTS19ETTEgfCBIQ0lfUEtUX1RZUEVTX01BU0tfREgxIHwgSENJX1BLVF9UWVBFU19NQVNLX0RNMyB8Ci0gICAgSENJX1BLVF9UWVBFU19NQVNLX0RIMyB8IEhDSV9QS1RfVFlQRVNfTUFTS19ETTUgfCBIQ0lfUEtUX1RZUEVTX01BU0tfREg1OwotCi12b2lkIGFjbF9jcmVhdGVfY2xhc3NpY19jb25uZWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhlcmVfYXJlX2hpZ2hfcHJpb3JpdHlfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYm9uZGluZykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QUNMX0NyZWF0ZUNsYXNzaWNDb25uZWN0aW9uKGJkX2FkZHIpOwotICB9Ci0KLSAgY29uc3QgYm9vbCBjb250cm9sbGVyX3N1cHBvcnRzX3JvbGVfc3dpdGNoID0KLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19yb2xlX3N3aXRjaCgpOwotICBjb25zdCBib29sIGFjbF9hbGxvd3Nfcm9sZV9zd2l0Y2ggPSBhY2xfaXNfcm9sZV9zd2l0Y2hfYWxsb3dlZCgpOwotCi0gIC8qIEZXIHRlYW0gc2F5cyB0aGF0IHdlIGNhbiBwYXJ0aWNpcGFudCBpbiA0IHBpY29uZXRzCi0gICAqIHR5cGljYWxseSAzIHBpY29uZXQgKyAxIGZvciBzY2FubmluZy4KLSAgICogV2UgY2FuIGVuaGFuY2UgdGhlIGNvZGUgdG8gY291bnQgdGhlIG51bWJlciBvZiBwaWNvbmV0cyBsYXRlci4gKi8KLSAgdWludDhfdCBhbGxvd19yb2xlX3N3aXRjaCA9IEhDSV9DUl9DT05OX05PVF9BTExPV19TV0lUQ0g7Ci0gIGlmICgoKGFjbF9hbGxvd3Nfcm9sZV9zd2l0Y2ggJiYgKEJUTV9HZXROdW1BY2xMaW5rcygpIDwgMykpIHx8Ci0gICAgICAgKGlzX2JvbmRpbmcgJiYgIXRoZXJlX2FyZV9oaWdoX3ByaW9yaXR5X2NoYW5uZWxzICYmCi0gICAgICAgIGNvbnRyb2xsZXJfc3VwcG9ydHNfcm9sZV9zd2l0Y2gpKSkKLSAgICBhbGxvd19yb2xlX3N3aXRjaCA9IEhDSV9DUl9DT05OX0FMTE9XX1NXSVRDSDsKLQotICAvKiBDaGVjayB3aXRoIHRoZSBCVCBtYW5hZ2VyIGlmIGRldGFpbHMgYWJvdXQgcmVtb3RlIGRldmljZSBhcmUga25vd24gKi8KLSAgdWludDhfdCBwYWdlX3NjYW5fcmVwX21vZGV7SENJX1BBR0VfU0NBTl9SRVBfTU9ERV9SMX07Ci0gIHVpbnQ4X3QgcGFnZV9zY2FuX21vZGV7SENJX01BTkRBVEFSWV9QQUdFX1NDQU5fTU9ERX07Ci0gIHVpbnQxNl90IGNsb2NrX29mZnNldCA9IEJUTV9HZXRDbG9ja09mZnNldChiZF9hZGRyKTsKLQotICB0QlRNX0lOUV9JTkZPKiBwX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChiZF9hZGRyKTsKLSAgaWYgKHBfaW5xX2luZm8gIT0gbnVsbHB0ciAmJgotICAgICAgKHBfaW5xX2luZm8tPnJlc3VsdHMuaW5xX3Jlc3VsdF90eXBlICYgQlRNX0lOUV9SRVNVTFRfQlIpKSB7Ci0gICAgcGFnZV9zY2FuX3JlcF9tb2RlID0gcF9pbnFfaW5mby0+cmVzdWx0cy5wYWdlX3NjYW5fcmVwX21vZGU7Ci0gICAgcGFnZV9zY2FuX21vZGUgPSBwX2lucV9pbmZvLT5yZXN1bHRzLnBhZ2Vfc2Nhbl9tb2RlOwotICAgIGNsb2NrX29mZnNldCA9IHBfaW5xX2luZm8tPnJlc3VsdHMuY2xvY2tfb2Zmc2V0OwotICB9Ci0KLSAgYnRzbmRfaGNpY19jcmVhdGVfY29ubihiZF9hZGRyLCBrRGVmYXVsdFBhY2tldFR5cGVzLCBwYWdlX3NjYW5fcmVwX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zY2FuX21vZGUsIGNsb2NrX29mZnNldCwgYWxsb3dfcm9sZV9zd2l0Y2gpOwotICBidG1fYWNsX3NldF9wYWdpbmcodHJ1ZSk7Ci19Ci0KLXZvaWQgYnRtX2FjbF9jb25uZWN0aW9uX3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90KiBkYykgewotICBidG1fc2VjX2Nvbm5fcmVxKGJkYSwgZGMpOwotICBsMmNfbGlua19oY2lfY29ubl9yZXEoYmRhKTsKLX0KLQotdm9pZCBhY2xfYWNjZXB0X2Nvbm5lY3Rpb25fcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJvbGUpIHsKLSAgYnRzbmRfaGNpY19hY2NlcHRfY29ubihiZF9hZGRyLCByb2xlKTsKLX0KLQotdm9pZCBhY2xfcmVqZWN0X2Nvbm5lY3Rpb25fcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlYXNvbikgewotICBidHNuZF9oY2ljX3JlamVjdF9jb25uKGJkX2FkZHIsIHJlYXNvbik7Ci19Ci0KLXZvaWQgYWNsX2Rpc2Nvbm5lY3RfZnJvbV9oYW5kbGUodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pIHsKLSAgYWNsX2Rpc2Nvbm5lY3RfYWZ0ZXJfcm9sZV9zd2l0Y2goaGFuZGxlLCByZWFzb24pOwotfQotCi12b2lkIGFjbF9kaXNjb25uZWN0X2FmdGVyX3JvbGVfc3dpdGNoKHVpbnQxNl90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyByZWFzb24pIHsKLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5hY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoY29ubl9oYW5kbGUpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19FUlJPUigiU2VuZGluZyBkaXNjb25uZWN0IGZvciB1bmtub3duIGFjbDolaHUgUExFQVNFIEZJWCIsIGNvbm5faGFuZGxlKTsKLSAgICBHZXRMZWdhY3lIY2lJbnRlcmZhY2UoKS5EaXNjb25uZWN0KGNvbm5faGFuZGxlLCByZWFzb24pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIGEgcm9sZSBzd2l0Y2ggaXMgaW4gcHJvZ3Jlc3MsIGRlbGF5IHRoZSBIQ0kgRGlzY29ubmVjdCB0byBhdm9pZAotICAgKiBjb250cm9sbGVyIHByb2JsZW0gKi8KLSAgaWYgKHBfYWNsLT5yc19kaXNjX3BlbmRpbmcgPT0gQlRNX1NFQ19SU19QRU5ESU5HKSB7Ci0gICAgTE9HX0RFQlVHKAotICAgICAgICAiUm9sZSBzd2l0Y2ggaW4gcHJvZ3Jlc3MgLSBTZXQgRElTQyBQZW5kaW5nIGZsYWcgaW4gIgotICAgICAgICAiYnRtX3NlY19zZW5kX2hjaV9kaXNjb25uZWN0ICIKLSAgICAgICAgInRvIGRlbGF5IGRpc2Nvbm5lY3QiKTsKLSAgICBwX2FjbC0+cnNfZGlzY19wZW5kaW5nID0gQlRNX1NFQ19ESVNDX1BFTkRJTkc7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0RFQlVHKCJTZW5kaW5nIGFjbCBkaXNjb25uZWN0IHJlYXNvbjolcyBbJWh1XSIsCi0gICAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQocmVhc29uKS5jX3N0cigpLCByZWFzb24pOwotICAgIGhjaV9idHNuZF9oY2ljX2Rpc2Nvbm5lY3QoKnBfYWNsLCByZWFzb24pOwotICB9Ci19Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrRGF0YVBhY2tldEV2ZW50QnJFZHIgPSAoQlRfRVZUX1RPX0xNX0hDSV9BQ0wpOwotY29uc3RleHByIHVpbnQxNl90IGtEYXRhUGFja2V0RXZlbnRCbGUgPQotICAgIChCVF9FVlRfVE9fTE1fSENJX0FDTCB8IExPQ0FMX0JMRV9DT05UUk9MTEVSX0lEKTsKLQotdm9pZCBhY2xfc2VuZF9kYXRhX3BhY2tldF9icl9lZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgQlRfSERSKiBwX2J1ZikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIkFjbCBicl9lZHIgZGF0YSB3cml0ZSBmb3IgdW5rbm93biBkZXZpY2U6JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QUNMX1dyaXRlRGF0YShwX2FjbC0+aGNpX2hhbmRsZSwgcF9idWYpOwotICB9Ci0gIGJ0ZV9tYWluX2hjaV9zZW5kKHBfYnVmLCBrRGF0YVBhY2tldEV2ZW50QnJFZHIpOwotfQotCi12b2lkIGFjbF9zZW5kX2RhdGFfcGFja2V0X2JsZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmJ0bV9iZGFfdG9fYWNsKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICAgIExPR19XQVJOKCJBY2wgbGUgZGF0YSB3cml0ZSBmb3IgdW5rbm93biBkZXZpY2U6JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QUNMX1dyaXRlRGF0YShwX2FjbC0+aGNpX2hhbmRsZSwgcF9idWYpOwotICB9Ci0gIGJ0ZV9tYWluX2hjaV9zZW5kKHBfYnVmLCBrRGF0YVBhY2tldEV2ZW50QmxlKTsKLX0KLQotdm9pZCBhY2xfd3JpdGVfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZsdXNoX3RpbWVvdXRfaW5fdGlja3MpIHsKLSAgdEFDTF9DT05OKiBwX2FjbCA9IGludGVybmFsXy5idG1fYmRhX3RvX2FjbChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocF9hY2wtPmZsdXNoX3RpbWVvdXRfaW5fdGlja3MgPT0gZmx1c2hfdGltZW91dF9pbl90aWNrcykgewotICAgIExPR19JTkZPKAotICAgICAgICAiSWdub3Jpbmcgc2luY2UgY2FjaGVkIHZhbHVlIGlzIHNhbWUgYXMgcmVxdWVzdGVkIGZsdXNoX3RpbWVvdXQ6JWhkIiwKLSAgICAgICAgZmx1c2hfdGltZW91dF9pbl90aWNrcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZsdXNoX3RpbWVvdXRfaW5fdGlja3MgJj0gSENJX01BWF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVDsKLSAgcF9hY2wtPmZsdXNoX3RpbWVvdXRfaW5fdGlja3MgPSBmbHVzaF90aW1lb3V0X2luX3RpY2tzOwotICBidHNuZF9oY2ljX3dyaXRlX2F1dG9fZmx1c2hfdG91dChwX2FjbC0+aGNpX2hhbmRsZSwgZmx1c2hfdGltZW91dF9pbl90aWNrcyk7Ci19Ci0KLWJvb2wgYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uX3dpdGhfaWQodWludDhfdCBpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgdEJMRV9CRF9BRERSIGFkZHJlc3Nfd2l0aF90eXBlewotICAgICAgICAuYmRhID0gYmRfYWRkciwKLSAgICAgICAgLnR5cGUgPSBCTEVfQUREUl9SQU5ET00sCi0gICAgfTsKLSAgICBnYXR0X2ZpbmRfaW5fZGV2aWNlX3JlY29yZChiZF9hZGRyLCAmYWRkcmVzc193aXRoX3R5cGUpOwotICAgIExPR19ERUJVRygiQ3JlYXRpbmcgbGUgY29ubmVjdGlvbiB0bzolcyIsCi0gICAgICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfQWNjZXB0TGVDb25uZWN0aW9uRnJvbShhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzX2RpcmVjdCAqLyB0cnVlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gY29ubmVjdGlvbl9tYW5hZ2VyOjpkaXJlY3RfY29ubmVjdF9hZGQoaWQsIGJkX2FkZHIpOwotfQotCi1ib29sIGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb25fd2l0aF9pZChDT05OX01HUl9JRF9MMkNBUCwgYmRfYWRkcik7Ci19Ci0KLXZvaWQgYWNsX3Jjdl9hY2xfZGF0YShCVF9IRFIqIHBfbXNnKSB7Ci0gIGFjbF9oZWFkZXJfdCBhY2xfaGVhZGVyewotICAgICAgLmhhbmRsZSA9IEhDSV9JTlZBTElEX0hBTkRMRSwKLSAgICAgIC5oY2lfbGVuID0gMCwKLSAgfTsKLSAgY29uc3QgdWludDhfdCogcCA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0KLSAgU1RSRUFNX1RPX1VJTlQxNihhY2xfaGVhZGVyLmhhbmRsZSwgcCk7Ci0gIGFjbF9oZWFkZXIuaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGFjbF9oZWFkZXIuaGFuZGxlKTsKLQotICBTVFJFQU1fVE9fVUlOVDE2KGFjbF9oZWFkZXIuaGNpX2xlbiwgcCk7Ci0gIGlmIChhY2xfaGVhZGVyLmhjaV9sZW4gPCBMMkNBUF9QS1RfT1ZFUkhFQUQgfHwKLSAgICAgIGFjbF9oZWFkZXIuaGNpX2xlbiAhPSBwX21zZy0+bGVuIC0gc2l6ZW9mKGFjbF9oZWFkZXIpKSB7Ci0gICAgTE9HX1dBUk4oIlJlY2VpdmVkIG1pc21hdGNoZWQgaGNpIGhlYWRlciBsZW5ndGg6JXUgZGF0YV9sZW46JXp1IiwKLSAgICAgICAgICAgICBhY2xfaGVhZGVyLmhjaV9sZW4sIHBfbXNnLT5sZW4gLSBzaXplb2YoYWNsX2hlYWRlcikpOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbDJjX3Jjdl9hY2xfZGF0YShwX21zZyk7Ci19Ci0KLXZvaWQgYWNsX2xpbmtfc2VnbWVudHNfeG1pdHRlZChCVF9IRFIqIHBfbXNnKSB7Ci0gIGwyY19saW5rX3NlZ21lbnRzX3htaXR0ZWQocF9tc2cpOwotfQotCi12b2lkIGFjbF9wYWNrZXRzX2NvbXBsZXRlZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGNyZWRpdHMpIHsKLSAgbDJjX3BhY2tldHNfY29tcGxldGVkKGhhbmRsZSwgY3JlZGl0cyk7Ci0gIGJsdWV0b290aDo6aGNpOjpJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVHZE51bUNvbXBsRGF0YVBrdHMoaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRpdHMpOwotfQotCi1zdGF0aWMgdm9pZCBhY2xfcGFyc2VfbnVtX2NvbXBsZXRlZF9wa3RzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbikgewotICBpZiAoZXZ0X2xlbiA9PSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBudW0gY29tcGxldGVkIHBhY2tldHMgd2l0aCB6ZXJvIGxlbmd0aCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgbnVtX2hhbmRsZXN7MH07Ci0gIFNUUkVBTV9UT19VSU5UOChudW1faGFuZGxlcywgcCk7Ci0KLSAgaWYgKG51bV9oYW5kbGVzID4gZXZ0X2xlbiAvICgyICogc2l6ZW9mKHVpbnQxNl90KSkpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE0MTYxNzYwMSIpOwotICAgIG51bV9oYW5kbGVzID0gZXZ0X2xlbiAvICgyICogc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIH0KLQotICBmb3IgKHVpbnQ4X3QgeHggPSAwOyB4eCA8IG51bV9oYW5kbGVzOyB4eCsrKSB7Ci0gICAgdWludDE2X3QgaGFuZGxlezB9OwotICAgIHVpbnQxNl90IG51bV9wYWNrZXRzezB9OwotICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLSAgICBoYW5kbGUgPSBIQ0lEX0dFVF9IQU5ETEUoaGFuZGxlKTsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KG51bV9wYWNrZXRzLCBwKTsKLSAgICBhY2xfcGFja2V0c19jb21wbGV0ZWQoaGFuZGxlLCBudW1fcGFja2V0cyk7Ci0gIH0KLX0KLQotdm9pZCBhY2xfcHJvY2Vzc19udW1fY29tcGxldGVkX3BrdHModWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICBhY2xfcGFyc2VfbnVtX2NvbXBsZXRlZF9wa3RzKHAsIGV2dF9sZW4pOwotICB9IGVsc2UgewotICAgIGwyY19saW5rX3Byb2Nlc3NfbnVtX2NvbXBsZXRlZF9wa3RzKHAsIGV2dF9sZW4pOwotICB9Ci0gIGJsdWV0b290aDo6aGNpOjpJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVOdW1Db21wbERhdGFQa3RzKHAsIGV2dF9sZW4pOwotfQotCi12b2lkIGFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ2NF90IGZlYXR1cmVzKSB7Ci0gIEFTU0VSVF9MT0coYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpLAotICAgICAgICAgICAgICJTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBnZF9hY2wgZW5hYmxlZCIpOwotCi0gIHRBQ0xfQ09OTiogcF9hY2wgPSBpbnRlcm5hbF8uYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgdWludDhfdCBjdXJyZW50X3BhZ2VfbnVtYmVyID0gMDsKLQotICBtZW1jcHkocF9hY2wtPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbY3VycmVudF9wYWdlX251bWJlcl0sCi0gICAgICAgICAodWludDhfdCopJmZlYXR1cmVzLCBzaXplb2YodWludDY0X3QpKTsKLSAgcF9hY2wtPnBlZXJfbG1wX2ZlYXR1cmVfdmFsaWRbY3VycmVudF9wYWdlX251bWJlcl0gPSB0cnVlOwotCi0gIExPR19ERUJVRygKLSAgICAgICJDb3BpZWQgc3VwcG9ydGVkIGZlYXR1cmUgcGFnZXMgaGFuZGxlOiVodSBjdXJyZW50X3BhZ2VfbnVtYmVyOiVoaHUgIgotICAgICAgImZlYXR1cmVzOiVzIiwKLSAgICAgIGhhbmRsZSwgY3VycmVudF9wYWdlX251bWJlciwKLSAgICAgIGJkX2ZlYXR1cmVzX3RleHQocF9hY2wtPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbY3VycmVudF9wYWdlX251bWJlcl0pCi0gICAgICAgICAgLmNfc3RyKCkpOwotCi0gIGlmICgoSENJX0xNUF9FWFRFTkRFRF9TVVBQT1JURUQocF9hY2wtPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbMF0pKSAmJgotICAgICAgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgIC0+c3VwcG9ydHNfcmVhZGluZ19yZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZXMoKSkpIHsKLSAgICBMT0dfREVCVUcoIldhaXRpbmcgZm9yIHJlbW90ZSBleHRlbmRlZCBmZWF0dXJlIHJlc3BvbnNlIHRvIGFycml2ZSIpOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiTm8gbW9yZSByZW1vdGUgZmVhdHVyZXMgb3V0c3RhbmRpbmcgc28gbm90aWZ5IHVwcGVyIGxheWVyIik7Ci0gICAgTm90aWZ5QWNsRmVhdHVyZXNSZWFkQ29tcGxldGUoKnBfYWNsLCBjdXJyZW50X3BhZ2VfbnVtYmVyKTsKLSAgfQotfQotCi12b2lkIGFjbF9wcm9jZXNzX2V4dGVuZGVkX2ZlYXR1cmVzKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBjdXJyZW50X3BhZ2VfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9wYWdlX251bWJlciwgdWludDY0X3QgZmVhdHVyZXMpIHsKLSAgQVNTRVJUX0xPRyhibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCksCi0gICAgICAgICAgICAgIlNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGdkX2FjbCBlbmFibGVkIik7Ci0KLSAgaWYgKGN1cnJlbnRfcGFnZV9udW1iZXIgPiBIQ0lfRVhUX0ZFQVRVUkVTX1BBR0VfTUFYKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBwcm9jZXNzIGN1cnJlbnRfcGFnZV9udW1iZXI6JWhodSIsIGN1cnJlbnRfcGFnZV9udW1iZXIpOwotICAgIHJldHVybjsKLSAgfQotICB0QUNMX0NPTk4qIHBfYWNsID0gaW50ZXJuYWxfLmFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9hY2wgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBhY3RpdmUgYWNsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1lbWNweShwX2FjbC0+cGVlcl9sbXBfZmVhdHVyZV9wYWdlc1tjdXJyZW50X3BhZ2VfbnVtYmVyXSwKLSAgICAgICAgICh1aW50OF90KikmZmVhdHVyZXMsIHNpemVvZih1aW50NjRfdCkpOwotICBwX2FjbC0+cGVlcl9sbXBfZmVhdHVyZV92YWxpZFtjdXJyZW50X3BhZ2VfbnVtYmVyXSA9IHRydWU7Ci0KLSAgTE9HX0RFQlVHKAotICAgICAgIkNvcGllZCBleHRlbmRlZCBmZWF0dXJlIHBhZ2VzIGhhbmRsZTolaHUgY3VycmVudF9wYWdlX251bWJlcjolaGh1ICIKLSAgICAgICJtYXhfcGFnZV9udW1iZXI6JWhodSBmZWF0dXJlczolcyIsCi0gICAgICBoYW5kbGUsIGN1cnJlbnRfcGFnZV9udW1iZXIsIG1heF9wYWdlX251bWJlciwKLSAgICAgIGJkX2ZlYXR1cmVzX3RleHQocF9hY2wtPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbY3VycmVudF9wYWdlX251bWJlcl0pCi0gICAgICAgICAgLmNfc3RyKCkpOwotCi0gIGlmIChtYXhfcGFnZV9udW1iZXIgPT0gY3VycmVudF9wYWdlX251bWJlcikgewotICAgIE5vdGlmeUFjbEZlYXR1cmVzUmVhZENvbXBsZXRlKCpwX2FjbCwgbWF4X3BhZ2VfbnVtYmVyKTsKLSAgfQotfQotCi12b2lkIEFDTF9SZWdpc3RlckNsaWVudChzdHJ1Y3QgYWNsX2NsaWVudF9jYWxsYmFja19zKiBjYWxsYmFja3MpIHsKLSAgTE9HX0RFQlVHKCJVTklNUExFTUVOVEVEIik7Ci19Ci0KLXZvaWQgQUNMX1VucmVnaXN0ZXJDbGllbnQoc3RydWN0IGFjbF9jbGllbnRfY2FsbGJhY2tfcyogY2FsbGJhY2tzKSB7Ci0gIExPR19ERUJVRygiVU5JTVBMRU1FTlRFRCIpOwotfQotCi1ib29sIEFDTF9TdXBwb3J0VHJhbnNwYXJlbnRTeW5jaHJvbm91c0RhdGEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBjb25zdCB0QUNMX0NPTk4qIHBfYWNsID0KLSAgICAgIGludGVybmFsXy5idG1fYmRhX3RvX2FjbChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfYWNsID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBIQ0lfTE1QX1RSQU5TUE5UX1NVUFBPUlRFRChwX2FjbC0+cGVlcl9sbXBfZmVhdHVyZV9wYWdlc1swXSk7Ci19Ci0KLS8qKgotICogQ29uZnVzaW5nbHksIGltbXV0YWJsZSBkZXZpY2UgZmVhdHVyZXMgYXJlIHN0b3JlZCBpbiB0aGUKLSAqIGVwaGVtZXJhbCBjb25uZWN0aW9uIGRhdGEgc3RydWN0dXJlIHdoaWxlIGNvbm5lY3Rpb24gc2VjdXJpdHkKLSAqIGlzIHN0b3JlZCBpbiB0aGUgZGV2aWNlIHJlY29yZC4KLSAqCi0gKiBUaGlzIEhBQ0sgYWxsb3dzIGxlZ2FjeSBzZWN1cml0eSBwcm90b2NvbHMgdG8gd29yayBhcyBpbnRlbmRlZCB1bmRlcgotICogdGhvc2UgY29uZGl0aW9ucy4KLSAqLwotdm9pZCBIQUNLX2FjbF9jaGVja19zbTQodEJUTV9TRUNfREVWX1JFQyYgcmVjb3JkKSB7Ci0gIC8vIFJldHVybiBpZiB3ZSBhbHJlYWR5IGtub3cgdGhpcyBpbmZvCi0gIGlmICgocmVjb3JkLnNtNCAmIEJUTV9TTTRfVFJVRSkgIT0gQlRNX1NNNF9VTktOT1dOKSByZXR1cm47Ci0KLSAgdEFDTF9DT05OKiBwX2FjbCA9Ci0gICAgICBpbnRlcm5hbF8uYnRtX2JkYV90b19hY2wocmVjb3JkLlJlbW90ZUFkZHJlc3MoKSwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIGlmIChwX2FjbCA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSBhY2wgZm9yIGF1dGhlbnRpY2F0aW9uIGRldmljZTolcyIsCi0gICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHJlY29yZC5SZW1vdGVBZGRyZXNzKCkpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBJZiB3ZSBoYXZlIG5vdCByZWNlaXZlZCB0aGUgU1NQIGZlYXR1cmUgcmVjb3JkCi0gIC8vIHdlIGhhdmUgdG8gd2FpdAotICBpZiAoIXBfYWNsLT5wZWVyX2xtcF9mZWF0dXJlX3ZhbGlkWzFdKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJBdXRoZW50aWNhdGlvbiBzdGFydGVkIHdpdGhvdXQgZXh0ZW5kZWQgZmVhdHVyZSBwYWdlIDEgcmVxdWVzdCAiCi0gICAgICAgICJyZXNwb25zZSIpOwotICAgIHJldHVybjsKLSAgfQotICByZWNvcmQuc200ID0gKEhDSV9TU1BfSE9TVF9TVVBQT1JURUQocF9hY2wtPnBlZXJfbG1wX2ZlYXR1cmVfcGFnZXNbMV0pKQotICAgICAgICAgICAgICAgICAgID8gQlRNX1NNNF9UUlVFCi0gICAgICAgICAgICAgICAgICAgOiBCVE1fU000X0tOT1dOOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYWNsL2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50LmNjIGIvc3RhY2svYWNsL2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVlZTVlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2FjbC9idG1fYmxlX2Nvbm5lY3Rpb25fZXN0YWJsaXNobWVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0KLSNpbmNsdWRlIDxiaXRzZXQ+Ci0KLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9nYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYmxlX2FjbF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2JsZV9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2FwX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc3RhY2tfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLWV4dGVybiB2b2lkIGJ0bV9ibGVfYWR2ZXJ0aXNlcl9ub3RpZnlfdGVybWluYXRlZF9sZWdhY3koCi0gICAgdWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlKTsKLQotZXh0ZXJuIGJvb2wgYnRtX2JsZV9pbml0X3BzZXVkb19hZGRyKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBuZXdfcHNldWRvX2FkZHIpOwotdm9pZCBidG1fc2VuZF9oY2lfY3JlYXRlX2Nvbm5lY3Rpb24oCi0gICAgdWludDE2X3Qgc2Nhbl9pbnQsIHVpbnQxNl90IHNjYW5fd2luLCB1aW50OF90IGluaXRfZmlsdGVyX3BvbGljeSwKLSAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGVfcGVlciwgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsCi0gICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlX293biwgdWludDE2X3QgY29ubl9pbnRfbWluLCB1aW50MTZfdCBjb25uX2ludF9tYXgsCi0gICAgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgdWludDE2X3QgbWF4X2NlX2xlbiwgdWludDhfdCBpbml0aWF0aW5nX3BoeXMpIHsKLSAgQVNTRVJUX0xPRyghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpLAotICAgICAgICAgICAgICJXaGVuIGdkX2FjbCBlbmFibGVkIHRoaXMgY29kZSBwYXRoIHNob3VsZCBub3QgYmUgZXhlcmNpc2VkIik7Ci0KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmcoKSkgewotICAgIEVYVF9DT05OX1BIWV9DRkcgcGh5X2NmZ1szXTsgIC8vIG1heGltdW0gdGhyZWUgcGh5cwotCi0gICAgaW50IHBoeV9jbnQgPQotICAgICAgICBzdGQ6OmJpdHNldDxzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjpkaWdpdHM+KGluaXRpYXRpbmdfcGh5cykKLSAgICAgICAgICAgIC5jb3VudCgpOwotCi0gICAgTE9HX0FTU0VSVChwaHlfY250IDw9IDMpIDw8ICJNb3JlIHRoYW4gdGhyZWUgcGh5cyBwcm92aWRlZCI7Ci0gICAgLy8gVE9ETyhqcGF3bG93c2tpKTogdHVuZSBwYXJhbWV0ZXJzIGZvciBkaWZmZXJlbnQgdHJhbnNwb3J0cwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGh5X2NudDsgaSsrKSB7Ci0gICAgICBwaHlfY2ZnW2ldLnNjYW5faW50ID0gc2Nhbl9pbnQ7Ci0gICAgICBwaHlfY2ZnW2ldLnNjYW5fd2luID0gc2Nhbl93aW47Ci0gICAgICBwaHlfY2ZnW2ldLmNvbm5faW50X21pbiA9IGNvbm5faW50X21pbjsKLSAgICAgIHBoeV9jZmdbaV0uY29ubl9pbnRfbWF4ID0gY29ubl9pbnRfbWF4OwotICAgICAgcGh5X2NmZ1tpXS5jb25uX2xhdGVuY3kgPSBjb25uX2xhdGVuY3k7Ci0gICAgICBwaHlfY2ZnW2ldLnN1cF90aW1lb3V0ID0gY29ubl90aW1lb3V0OwotICAgICAgcGh5X2NmZ1tpXS5taW5fY2VfbGVuID0gbWluX2NlX2xlbjsKLSAgICAgIHBoeV9jZmdbaV0ubWF4X2NlX2xlbiA9IG1heF9jZV9sZW47Ci0gICAgfQotCi0gICAgYWRkcl90eXBlX3BlZXIgJj0gfkJMRV9BRERSX1RZUEVfSURfQklUOwotICAgIGJ0c25kX2hjaWNfYmxlX2V4dF9jcmVhdGVfY29ubihpbml0X2ZpbHRlcl9wb2xpY3ksIGFkZHJfdHlwZV9vd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfdHlwZV9wZWVyLCBiZGFfcGVlciwgaW5pdGlhdGluZ19waHlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfY2ZnKTsKLSAgfSBlbHNlIHsKLSAgICBidHNuZF9oY2ljX2JsZV9jcmVhdGVfbGxfY29ubihzY2FuX2ludCwgc2Nhbl93aW4sIGluaXRfZmlsdGVyX3BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyX3R5cGVfcGVlciwgYmRhX3BlZXIsIGFkZHJfdHlwZV9vd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9pbnRfbWluLCBjb25uX2ludF9tYXgsIGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3RpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotICB9Ci0KLSAgYnRtX2NiLmJsZV9jdHJfY2Iuc2V0X2Nvbm5lY3Rpb25fc3RhdGVfY29ubmVjdGluZygpOwotICBidG1fYmxlX3NldF90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfSU5JVF9CSVQpOwotfQotCi0vKiogTEUgY29ubmVjdGlvbiBjb21wbGV0ZS4gKi8KLXZvaWQgYnRtX2JsZV9jcmVhdGVfbGxfY29ubl9jb21wbGV0ZSh0SENJX1NUQVRVUyBzdGF0dXMpIHsKLSAgaWYgKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgcmV0dXJuOwotCi0gIExPRyhXQVJOSU5HKSA8PCAiTEUgQ3JlYXRlIENvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQsIHN0YXR1cz0iCi0gICAgICAgICAgICAgICA8PCBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBIQ0lfRVJSX0NPTU1BTkRfRElTQUxMT1dFRCkgewotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnNldF9jb25uZWN0aW9uX3N0YXRlX2Nvbm5lY3RpbmcoKTsKLSAgICBidG1fYmxlX3NldF90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfSU5JVF9CSVQpOwotICAgIExPRyhFUlJPUikgPDwgIkxFIENyZWF0ZSBDb25uZWN0aW9uIC0gY29tbWFuZCBkaXNhbGxvd2VkIjsKLSAgfSBlbHNlIHsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5zZXRfY29ubmVjdGlvbl9zdGF0ZV9pZGxlKCk7Ci0gICAgYnRtX2JsZV9jbGVhcl90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfSU5JVF9CSVQpOwotICAgIGJ0bV9ibGVfdXBkYXRlX21vZGVfb3BlcmF0aW9uKEhDSV9ST0xFX1VOS05PV04sIE5VTEwsIHN0YXR1cyk7Ci0gIH0KLX0KLQotYm9vbCBtYXliZV9yZXNvbHZlX2FkZHJlc3MoUmF3QWRkcmVzcyogYmRhLCB0QkxFX0FERFJfVFlQRSogYmRhX3R5cGUpIHsKLSAgYm9vbCBpc19pbl9zZWN1cml0eV9kYiA9IGZhbHNlOwotICB0QkxFX0FERFJfVFlQRSBwZWVyX2FkZHJfdHlwZSA9ICpiZGFfdHlwZTsKLSAgYm9vbCBhZGRyX2lzX3JwYSA9Ci0gICAgICAocGVlcl9hZGRyX3R5cGUgPT0gQkxFX0FERFJfUkFORE9NICYmIEJUTV9CTEVfSVNfUkVTT0xWRV9CREEoKmJkYSkpOwotCi0gIC8qIFdlIG11c3QgdHJhbnNsYXRlIHdoYXRldmVyIGFkZHJlc3Mgd2UgcmVjZWl2ZWQgaW50byB0aGUgInBzZXVkbyIgYWRkcmVzcy4KLSAgICogaS5lLiBpZiB3ZSBib25kZWQgd2l0aCBkZXZpY2UgdGhhdCB3YXMgdXNpbmcgUlBBIGZvciBmaXJzdCBjb25uZWN0aW9uLAotICAgKiAicHNldWRvIiBhZGRyZXNzIGlzIGVxdWFsIHRvIHRoaXMgUlBBLiBJZiBpdCBsYXRlciBkZWNpZGVzIHRvIHVzZSBQdWJsaWMKLSAgICogYWRkcmVzcywgb3IgUmFuZG9tIFN0YXRpYyBBZGRyZXNzLCB3ZSBjb252ZXJ0IGl0IGludG8gdGhlICJwc2V1ZG8iCi0gICAqIGFkZHJlc3MgaGVyZS4gKi8KLSAgaWYgKCFhZGRyX2lzX3JwYSB8fCBwZWVyX2FkZHJfdHlwZSAmIEJMRV9BRERSX1RZUEVfSURfQklUKSB7Ci0gICAgaXNfaW5fc2VjdXJpdHlfZGIgPSBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvKGJkYSwgYmRhX3R5cGUsIHRydWUpOwotICB9Ci0KLSAgLyogcG9zc2libGx5IHJlY2VpdmUgY29ubmVjdGlvbiBjb21wbGV0ZSB3aXRoIHJlc29sdmFibGUgcmFuZG9tIHdoaWxlCi0gICAgIHRoZSBkZXZpY2UgaGFzIGJlZW4gcGFpcmVkICovCi0gIGlmICghaXNfaW5fc2VjdXJpdHlfZGIgJiYgYWRkcl9pc19ycGEpIHsKLSAgICB0QlRNX1NFQ19ERVZfUkVDKiBtYXRjaF9yZWMgPSBidG1fYmxlX3Jlc29sdmVfcmFuZG9tX2FkZHIoKmJkYSk7Ci0gICAgaWYgKG1hdGNoX3JlYykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG1hdGNoZWQgYW5kIHJlc29sdmVkIHJhbmRvbSBhZGRyZXNzIjsKLSAgICAgIGlzX2luX3NlY3VyaXR5X2RiID0gdHJ1ZTsKLSAgICAgIG1hdGNoX3JlYy0+YmxlLmFjdGl2ZV9hZGRyX3R5cGUgPSB0QlRNX1NFQ19CTEU6OkJUTV9CTEVfQUREUl9SUkE7Ci0gICAgICBtYXRjaF9yZWMtPmJsZS5jdXJfcmFuZF9hZGRyID0gKmJkYTsKLSAgICAgIGlmICghYnRtX2JsZV9pbml0X3BzZXVkb19hZGRyKG1hdGNoX3JlYywgKmJkYSkpIHsKLSAgICAgICAgLyogYXNzaWduIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIGJlIHRoZSBjdXJyZW50IHJlcG9ydCBhZGRyZXNzICovCi0gICAgICAgICpiZGEgPSBtYXRjaF9yZWMtPmJsZS5wc2V1ZG9fYWRkcjsKLSAgICAgICAgKmJkYV90eXBlID0gbWF0Y2hfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpiZGEgPSBtYXRjaF9yZWMtPmJkX2FkZHI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gbWF0Y2ggYW5kIHJlc29sdmUgcmFuZG9tIGFkZHJlc3MiOwotICAgIH0KLSAgfQotICByZXR1cm4gaXNfaW5fc2VjdXJpdHlfZGI7Ci19Ci0KLS8qKiBMRSBjb25uZWN0aW9uIGNvbXBsZXRlLiAqLwotdm9pZCBidG1fYmxlX2Nvbm5fY29tcGxldGUodWludDhfdCogcCwgVU5VU0VEX0FUVFIgdWludDE2X3QgZXZ0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5oYW5jZWQpIHsKLSAgUmF3QWRkcmVzcyBsb2NhbF9ycGEsIHBlZXJfcnBhOwotICB1aW50OF90IHJhd19yb2xlLCBzdGF0dXM7Ci0gIHRCTEVfQUREUl9UWVBFIGJkYV90eXBlOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB1aW50MTZfdCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksIGNvbm5fdGltZW91dDsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgocmF3X3JvbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoYmRhX3R5cGUsIHApOwotICBTVFJFQU1fVE9fQkRBRERSKGJkYSwgcCk7Ci0gIGlmIChlbmhhbmNlZCkgewotICAgIFNUUkVBTV9UT19CREFERFIobG9jYWxfcnBhLCBwKTsKLSAgICBTVFJFQU1fVE9fQkRBRERSKHBlZXJfcnBhLCBwKTsKLSAgfQotICBTVFJFQU1fVE9fVUlOVDE2KGNvbm5faW50ZXJ2YWwsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGNvbm5fbGF0ZW5jeSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYoY29ubl90aW1lb3V0LCBwKTsKLSAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci0KLSAgdWludDMyX3QgaGNpX2JsZV9ldmVudCA9Ci0gICAgICBlbmhhbmNlZCA/IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpCTEVfRVZUX0VOSEFOQ0VEX0NPTk5fQ09NUExFVEVfRVZUCi0gICAgICAgICAgICAgICA6IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpCTEVfRVZUX0NPTk5fQ09NUExFVEVfRVZUOwotCi0gIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICB0QkxFX0FERFJfVFlQRSBwZWVyX2FkZHJfdHlwZSA9IGJkYV90eXBlOwotICAgIGJvb2wgaXNfaW5fc2VjdXJpdHlfZGIgPSBtYXliZV9yZXNvbHZlX2FkZHJlc3MoJmJkYSwgJmJkYV90eXBlKTsKLQotICAgIC8vIExvZyBmb3IgdGhlIEhDSSBzdWNjZXNzIGNhc2UgYWZ0ZXIgbWF5YmUgcmVzb2x2aW5nIEJsdWV0b290aCBhZGRyZXNzCi0gICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgJmJkYSwgaGFuZGxlLCBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9VTktOT1dOLAotICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0wsIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpDTURfVU5LTk9XTiwKLSAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkVWVF9CTEVfTUVUQSwgaGNpX2JsZV9ldmVudCwgc3RhdHVzLAotICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04pOwotCi0gICAgdEJMRV9CRF9BRERSIGFkZHJlc3Nfd2l0aF90eXBley5iZGEgPSBiZGEsIC50eXBlID0gYmRhX3R5cGV9OwotICAgIHRIQ0lfUk9MRSByb2xlID0gdG9faGNpX3JvbGUocmF3X3JvbGUpOwotICAgIGlmIChlbmhhbmNlZCkgewotICAgICAgYWNsX2JsZV9lbmhhbmNlZF9jb25uZWN0aW9uX2NvbXBsZXRlKAotICAgICAgICAgIGFkZHJlc3Nfd2l0aF90eXBlLCBoYW5kbGUsIHJvbGUsIGlzX2luX3NlY3VyaXR5X2RiLCBjb25uX2ludGVydmFsLAotICAgICAgICAgIGNvbm5fbGF0ZW5jeSwgY29ubl90aW1lb3V0LCBsb2NhbF9ycGEsIHBlZXJfcnBhLCBwZWVyX2FkZHJfdHlwZSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgYWNsX2JsZV9jb25uZWN0aW9uX2NvbXBsZXRlKGFkZHJlc3Nfd2l0aF90eXBlLCBoYW5kbGUsIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaW5fc2VjdXJpdHlfZGIsIGNvbm5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubl9sYXRlbmN5LCBjb25uX3RpbWVvdXQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAmYmRhLCBoYW5kbGUsIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX1VOS05PV04sCi0gICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTCwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkNNRF9VTktOT1dOLAotICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6RVZUX0JMRV9NRVRBLCBoY2lfYmxlX2V2ZW50LCBzdGF0dXMsCi0gICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTik7Ci0KLSAgICB0QkxFX0JEX0FERFIgYWRkcmVzc193aXRoX3R5cGV7LmJkYSA9IGJkYSwgLnR5cGUgPSBiZGFfdHlwZX07Ci0gICAgYWNsX2JsZV9jb25uZWN0aW9uX2ZhaWwoYWRkcmVzc193aXRoX3R5cGUsIGhhbmRsZSwgZW5oYW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpOwotICB9Ci19Ci0KLXZvaWQgYnRtX2JsZV9jcmVhdGVfY29ubl9jYW5jZWwoKSB7Ci0gIEFTU0VSVF9MT0coIWJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSwKLSAgICAgICAgICAgICAiV2hlbiBnZF9hY2wgZW5hYmxlZCB0aGlzIGNvZGUgcGF0aCBzaG91bGQgbm90IGJlIGV4ZXJjaXNlZCIpOwotCi0gIGJ0c25kX2hjaWNfYmxlX2NyZWF0ZV9jb25uX2NhbmNlbCgpOwotICBidG1fY2IuYmxlX2N0cl9jYi5zZXRfY29ubmVjdGlvbl9zdGF0ZV9jYW5jZWxsZWQoKTsKLSAgYnRtX2JsZV9jbGVhcl90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfSU5JVF9CSVQpOwotfQotCi12b2lkIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgLy8gT25seSBsb2cgZXJyb3JzIHRvIHByZXZlbnQgbG9nIHNwYW0gZHVlIHRvIGFjY2VwdGxpc3QgY29ubmVjdGlvbnMKLSAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICBudWxscHRyLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9PVVRHT0lORywKLSAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMLAotICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6Q01EX0JMRV9DUkVBVEVfQ09OTl9DQU5DRUwsCi0gICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpFVlRfQ09NTUFORF9DT01QTEVURSwKLSAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkJMRV9FVlRfVU5LTk9XTiwgc3RhdHVzLAotICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04pOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBIQ0lfRVJSX0NPTU1BTkRfRElTQUxMT1dFRCkgewotICAgIC8qIFRoaXMgaXMgYSBzaWduIHRoYXQgbG9naWMgYXJvdW5kIGtlZXBpbmcgY29ubmVjdGlvbiBzdGF0ZSBpcyBicm9rZW4gKi8KLSAgICBMT0coRVJST1IpCi0gICAgICAgIDw8ICJBdHRlbXB0IHRvIGNhbmNlbCBMRSBjb25uZWN0aW9uLCB3aGVuIG5vIGNvbm5lY3Rpb24gaXMgcGVuZGluZy4iOwotICAgIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pc19jb25uZWN0aW9uX3N0YXRlX2NhbmNlbGxlZCgpKSB7Ci0gICAgICBidG1fY2IuYmxlX2N0cl9jYi5zZXRfY29ubmVjdGlvbl9zdGF0ZV9pZGxlKCk7Ci0gICAgICBidG1fYmxlX2NsZWFyX3RvcG9sb2d5X21hc2soQlRNX0JMRV9TVEFURV9JTklUX0JJVCk7Ci0gICAgICBidG1fYmxlX3VwZGF0ZV9tb2RlX29wZXJhdGlvbihIQ0lfUk9MRV9VTktOT1dOLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYWNsL2J0bV9wbS5jYyBiL3N0YWNrL2FjbC9idG1fcG0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZTRhZjQuLjAwMDAwMDAKLS0tIGEvc3RhY2svYWNsL2J0bV9wbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDkxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAwLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZXMgQUNMIGxpbmsgbW9kZXMuCi0gKiAgVGhpcyBpbmNsdWRlcyBvcGVyYXRpb25zIHN1Y2ggYXMgYWN0aXZlLCBob2xkLAotICogIHBhcmsgYW5kIHNuaWZmIG1vZGVzLgotICoKLSAqICBUaGlzIG1vZHVsZSBjb250YWlucyBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCAoQVBJKQotICogIGZ1bmN0aW9ucy4gRXh0ZXJuYWwgKEFQSSkgZnVuY3Rpb25zIGFyZSBkaXN0aW5ndWlzaGFibGUKLSAqICBieSB0aGVpciBuYW1lcyBiZWdpbm5pbmcgd2l0aCB1cHBlcmNhc2UgQlRNLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idG1fcG0iCi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9saW5rX3BvbGljeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBsMmNfT25IY2lNb2RlQ2hhbmdlU2VuZFBlbmRpbmdQYWNrZXRzKFJhd0FkZHJlc3MgcmVtb3RlKTsKLXZvaWQgYnRtX3Njb19jaGtfcGVuZF91bnBhcmsodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUpOwotdm9pZCBidG1fY29udF9yc3dpdGNoX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUpOwotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi1uYW1lc3BhY2UgewotdWludDE2X3QgcG1fcGVuZF9saW5rID0gMDsKLQotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90IC8qIGhhbmRsZSAqLywgdEJUTV9QTV9NQ0I+IHBtX21vZGVfZGI7Ci0KLXRCVE1fUE1fTUNCKiBidG1fcG1fZ2V0X3Bvd2VyX21hbmFnZXJfZnJvbV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBmb3IgKGF1dG8mIGVudHJ5IDogcG1fbW9kZV9kYikgewotICAgIGlmIChlbnRyeS5zZWNvbmQuYmRhXyA9PSBiZGEpIHsKLSAgICAgIHJldHVybiAmZW50cnkuc2Vjb25kOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdEJUTV9QTV9SQ0IgcG1fcmVnX2RiOyAvKiBwZXIgYXBwbGljYXRpb24vbW9kdWxlICovCi0KLXVpbnQ4X3QgcG1fcGVuZF9pZCA9IDA7IC8qIHRoZSBpZCBwZiB0aGUgbW9kdWxlLCB3aGljaCBoYXMgYSBwZW5kaW5nIFBNIGNtZCAqLwotCi1jb25zdGV4cHIgY2hhciBrQnRtTG9nVGFnW10gPSAiQUNMIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICB0byBoYW5kbGUgZGlmZmVyZW50IG1vZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBCVE1fUE1fTlVNX1NFVF9NT0RFUyAzICAvKiBvbmx5IGhvbGQsIHNuaWZmICYgcGFyayAqLwotCi0jZGVmaW5lIEJUTV9QTV9HRVRfTUQxIDEKLSNkZWZpbmUgQlRNX1BNX0dFVF9NRDIgMgotI2RlZmluZSBCVE1fUE1fR0VUX0NPTVAgMwotCi1jb25zdCB1aW50OF90Ci0gICAgYnRtX3BtX21kX2NvbXBfbWF0cml4W0JUTV9QTV9OVU1fU0VUX01PREVTICogQlRNX1BNX05VTV9TRVRfTU9ERVNdID0gewotICAgICAgICBCVE1fUE1fR0VUX0NPTVAsIEJUTV9QTV9HRVRfTUQyLCAgQlRNX1BNX0dFVF9NRDIsCi0KLSAgICAgICAgQlRNX1BNX0dFVF9NRDEsICBCVE1fUE1fR0VUX0NPTVAsIEJUTV9QTV9HRVRfTUQxLAotCi0gICAgICAgIEJUTV9QTV9HRVRfTUQxLCAgQlRNX1BNX0dFVF9NRDIsICBCVE1fUE1fR0VUX0NPTVB9OwotCi1zdGF0aWMgdm9pZCBzZW5kX3NuaWZmX3N1YnJhdGluZyh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfbGF0LCB1aW50MTZfdCBtaW5fcm10X3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2xvY190bykgewotICBidHNuZF9oY2ljX3NuaWZmX3N1Yl9yYXRlKGhhbmRsZSwgbWF4X2xhdCwgbWluX3JtdF90bywgbWluX2xvY190byk7Ci0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIGFkZHIsICJTbmlmZiBzdWJyYXRpbmciLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAibWF4X2xhdGVuY3k6JS4yZiBwZWVyX3RpbWVvdXQ6JS4yZiBsb2NhbF90aW1lb3V0OiUuMmYiLAotICAgICAgICAgICAgICAgICAgICAgdGlja3NfdG9fc2Vjb25kcyhtYXhfbGF0KSwgdGlja3NfdG9fc2Vjb25kcyhtaW5fcm10X3RvKSwKLSAgICAgICAgICAgICAgICAgICAgIHRpY2tzX3RvX3NlY29uZHMobWluX2xvY190bykpKTsKLX0KLQotc3RhdGljIHRCVE1fU1RBVFVTIGJ0bV9wbV9zbmRfbWRfcmVxKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUTV9QTV9QV1JfTUQqIHBfbW9kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgUCBVIEIgTCBJIEMgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUG1SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmVnaXN0ZXIgb3IgZGVyZWdpc3RlciB3aXRoIHBvd2VyIG1hbmFnZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgbm8gcm9vbSB0byBob2xkIHJlZ2lzdHJhdGlvbgotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUG1SZWdpc3Rlcih1aW50OF90IG1hc2ssIHVpbnQ4X3QqIHBfcG1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9saW5rX3BvbGljeV9lbmFibGVkKCkpIHsKLSAgICBBU1NFUlQocF9wbV9pZCAhPSBudWxscHRyKTsKLSAgICBBU1NFUlQocF9jYiAhPSBudWxscHRyKTsKLSAgICBpZiAobWFzayAmIEJUTV9QTV9ERVJFRykgewotICAgICAgcmV0dXJuIChibHVldG9vdGg6OnNoaW06OlVucmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50KHBfY2IpKQotICAgICAgICAgICAgICAgICA/IChCVE1fU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgOiAoQlRNX05PX1JFU09VUkNFUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpwX3BtX2lkID0gMDsKLSAgICAgIHJldHVybiAoYmx1ZXRvb3RoOjpzaGltOjpSZWdpc3RlckxpbmtQb2xpY3lDbGllbnQocF9jYikpCi0gICAgICAgICAgICAgICAgID8gKEJUTV9TVUNDRVNTKQotICAgICAgICAgICAgICAgICA6IChCVE1fTk9fUkVTT1VSQ0VTKTsKLSAgICB9Ci0gIH0KLQotICAvKiBkZS1yZWdpc3RlciAqLwotICBpZiAobWFzayAmIEJUTV9QTV9ERVJFRykgewotICAgIGlmICgqcF9wbV9pZCA+PSBCVE1fTUFYX1BNX1JFQ09SRFMpIHJldHVybiBCVE1fSUxMRUdBTF9WQUxVRTsKLSAgICBwbV9yZWdfZGIubWFzayA9IEJUTV9QTV9SRUNfTk9UX1VTRUQ7Ci0gICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICB9Ci0KLSAgaWYgKHBtX3JlZ19kYi5tYXNrID09IEJUTV9QTV9SRUNfTk9UX1VTRUQpIHsKLSAgICAvKiBpZiByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uLCBzaG91bGQgcHJvdmlkZSBjYWxsYmFjayByb3V0aW5lICovCi0gICAgaWYgKHBfY2IgPT0gTlVMTCkgcmV0dXJuIEJUTV9JTExFR0FMX1ZBTFVFOwotICAgIHBtX3JlZ19kYi5jYmFjayA9IHBfY2I7Ci0gICAgcG1fcmVnX2RiLm1hc2sgPSBtYXNrOwotICAgICpwX3BtX2lkID0gMDsKLSAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gIH0KLQotICByZXR1cm4gQlRNX05PX1JFU09VUkNFUzsKLX0KLQotdm9pZCBCVE1fUE1fT25Db25uZWN0ZWQodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKSB7Ci0gIHBtX21vZGVfZGJbaGFuZGxlXSA9IHt9OwotICBwbV9tb2RlX2RiW2hhbmRsZV0uSW5pdChyZW1vdGVfYmRhLCBoYW5kbGUpOwotfQotCi12b2lkIEJUTV9QTV9PbkRpc2Nvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgcG1fbW9kZV9kYi5lcmFzZShoYW5kbGUpOwotICBpZiAoaGFuZGxlID09IHBtX3BlbmRfbGluaykgewotICAgIHBtX3BlbmRfbGluayA9IDA7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRQb3dlck1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHN0b3JlIHRoZSBtb2RlIGluIGNvbnRyb2wgYmxvY2sgb3IKLSAqICAgICAgICAgICAgICAgICAgYWx0ZXIgQUNMIGNvbm5lY3Rpb24gYmVoYXZpb3IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIGJkIGFkZHIgaXMgbm90IGFjdGl2ZSBvciBiYWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldFBvd2VyTW9kZSh1aW50OF90IHBtX2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRNX1BNX1BXUl9NRCogcF9tb2RlKSB7Ci0gIGlmIChwbV9pZCA+PSBCVE1fTUFYX1BNX1JFQ09SRFMpIHsKLSAgICBwbV9pZCA9IEJUTV9QTV9TRVRfT05MWV9JRDsKLSAgfQotCi0gIGlmICghcF9tb2RlKSB7Ci0gICAgTE9HX0VSUk9SKCJwbV9pZDogJXUsIHBfbW9kZSBpcyBudWxsIGZvciAlcyIsIHVuc2lnbmVkKHBtX2lkKSwKLSAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHJlbW90ZV9iZGEpKTsKLSAgICByZXR1cm4gQlRNX0lMTEVHQUxfVkFMVUU7Ci0gIH0KLQotICAvLyBwZXIgQUNMIGxpbmsKLSAgYXV0byogcF9jYiA9IGJ0bV9wbV9nZXRfcG93ZXJfbWFuYWdlcl9mcm9tX2FkZHJlc3MocmVtb3RlX2JkYSk7Ci0gIGlmIChwX2NiID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgcG93ZXIgbWFuYWdlciBmb3IgcGVlcjogJXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYmRhKSk7Ci0gICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gIH0KLSAgdWludDE2X3QgaGFuZGxlID0gcF9jYi0+aGFuZGxlXzsKLQotICB0QlRNX1BNX01PREUgbW9kZSA9IHBfbW9kZS0+bW9kZTsKLSAgaWYgKCFpc19sZWdhbF9wb3dlcl9tb2RlKG1vZGUpKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gc2V0IGlsbGVnYWwgcG93ZXIgbW9kZSB2YWx1ZToweCUwMngiLCBtb2RlKTsKLSAgICByZXR1cm4gQlRNX0lMTEVHQUxfVkFMVUU7Ci0gIH0KLQotICBpZiAocF9tb2RlLT5tb2RlICYgQlRNX1BNX01EX0ZPUkNFKSB7Ci0gICAgTE9HX0lORk8oIkF0dGVtcHRpbmcgdG8gZm9yY2UgaW50byB0aGlzIHBvd2VyIG1vZGUiKTsKLSAgICAvKiB0YWtlIG91dCB0aGUgZm9yY2UgYml0ICovCi0gICAgbW9kZSAmPSAofkJUTV9QTV9NRF9GT1JDRSk7Ci0gIH0KLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9saW5rX3BvbGljeV9lbmFibGVkKCkpIHsKLSAgICB0QlRNX1BNX1BXUl9NRCBwb3dlcl9tb2RlX3JlcXVlc3QgPSAqcF9tb2RlOwotICAgIHBvd2VyX21vZGVfcmVxdWVzdC5tb2RlICY9ICh+QlRNX1BNX01EX0ZPUkNFKTsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0UG93ZXJNb2RlKGhhbmRsZSwgcG93ZXJfbW9kZV9yZXF1ZXN0KTsKLSAgfQotCi0gIGlmIChtb2RlICE9IEJUTV9QTV9NRF9BQ1RJVkUpIHsKLSAgICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLSAgICBpZiAoKG1vZGUgPT0gQlRNX1BNX01EX0hPTEQgJiYgIWNvbnRyb2xsZXItPnN1cHBvcnRzX2hvbGRfbW9kZSgpKSB8fAotICAgICAgICAobW9kZSA9PSBCVE1fUE1fTURfU05JRkYgJiYgIWNvbnRyb2xsZXItPnN1cHBvcnRzX3NuaWZmX21vZGUoKSkgfHwKLSAgICAgICAgKG1vZGUgPT0gQlRNX1BNX01EX1BBUksgJiYgIWNvbnRyb2xsZXItPnN1cHBvcnRzX3BhcmtfbW9kZSgpKSB8fAotICAgICAgICBpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9ESVNBQkxFX1NOSUZGLCAmcmVtb3RlX2JkYSkpIHsKLSAgICAgIExPR19FUlJPUigicG1faWQgJXUgbW9kZSAldSBpcyBub3Qgc3VwcG9ydGVkIGZvciAlcyIsIHBtX2lkLCBtb2RlLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYmRhKSk7Ci0gICAgICByZXR1cm4gQlRNX01PREVfVU5TVVBQT1JURUQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1vZGUgPT0gcF9jYi0+c3RhdGUpIHsKLSAgICAvKiBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgbW9kZSBhbmQgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgaGFzIGxlc3MgbGF0ZW5jeQotICAgICAqIHRoYW4gdGhlIG1heCAqLwotICAgIGlmICgobW9kZSA9PSBCVE1fUE1fTURfQUNUSVZFKSB8fAotICAgICAgICAoKHBfbW9kZS0+bW9kZSAmIEJUTV9QTV9NRF9GT1JDRSkgJiYgKHBfbW9kZS0+bWF4ID49IHBfY2ItPmludGVydmFsKSAmJgotICAgICAgICAgKHBfbW9kZS0+bWluIDw9IHBfY2ItPmludGVydmFsKSkgfHwKLSAgICAgICAgKChwX21vZGUtPm1vZGUgJiBCVE1fUE1fTURfRk9SQ0UpID09IDAgJiYKLSAgICAgICAgIChwX21vZGUtPm1heCA+PSBwX2NiLT5pbnRlcnZhbCkpKSB7Ci0gICAgICBMT0dfSU5GTygKLSAgICAgICAgICAiRGV2aWNlIGlzIGFscmVhZHkgaW4gcmVxdWVzdGVkIG1vZGUgJWQsIGludGVydmFsOiAlZCwgbWF4OiAlZCwgbWluOiAiCi0gICAgICAgICAgIiVkIiwKLSAgICAgICAgICBwX21vZGUtPm1vZGUsIHBfY2ItPmludGVydmFsLCBwX21vZGUtPm1heCwgcF9tb2RlLT5taW4pOwotICAgICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICAgIH0KLSAgfQotCi0gIC8qIHVwZGF0ZSBtb2RlIGRhdGFiYXNlICovCi0gIGlmICgoKHBtX2lkICE9IEJUTV9QTV9TRVRfT05MWV9JRCkgJiYgKHBtX3JlZ19kYi5tYXNrICYgQlRNX1BNX1JFR19TRVQpKSB8fAotICAgICAgKChwbV9pZCA9PSBCVE1fUE1fU0VUX09OTFlfSUQpICYmIChwbV9wZW5kX2xpbmsgIT0gMCkpKSB7Ci0gICAgLyogTWFrZSBzdXJlIG1hc2sgaXMgc2V0IHRvIEJUTV9QTV9SRUdfU0VUICovCi0gICAgcG1fcmVnX2RiLm1hc2sgfD0gQlRNX1BNX1JFR19TRVQ7Ci0gICAgKigmcF9jYi0+cmVxX21vZGUpID0gKnBfbW9kZTsKLSAgICBwX2NiLT5jaGdfaW5kID0gdHJ1ZTsKLSAgfQotCi0gIC8qIGlmIG1vZGUgPT0gaG9sZCBvciBwZW5kaW5nLCByZXR1cm4gKi8KLSAgaWYgKChwX2NiLT5zdGF0ZSA9PSBCVE1fUE1fU1RTX0hPTEQpIHx8IChwX2NiLT5zdGF0ZSA9PSBCVE1fUE1fU1RTX1BFTkRJTkcpIHx8Ci0gICAgICAocG1fcGVuZF9saW5rICE9IDApKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJDdXJyZW50IHBvd2VyIG1vZGUgaXMgaG9sZCBvciBwZW5kaW5nIHN0YXR1cyBvciBwZW5kaW5nIGxpbmtzIgotICAgICAgICAiIHN0YXRlOiVzWyVoaHVdIHBtX3BlbmRpbmdfbGluazolaHUiLAotICAgICAgICBwb3dlcl9tb2RlX3N0YXRlX3RleHQocF9jYi0+c3RhdGUpLmNfc3RyKCksIHBfY2ItPnN0YXRlLCBwbV9wZW5kX2xpbmspOwotICAgIC8qIGNvbW1hbmQgcGVuZGluZyAqLwotICAgIGlmIChoYW5kbGUgIT0gcG1fcGVuZF9saW5rKSB7Ci0gICAgICBwX2NiLT5zdGF0ZSB8PSBCVE1fUE1fU1RPUkVEX01BU0s7Ci0gICAgICBMT0dfSU5GTygiU2V0dGluZyBzdG9yZWQgYml0bWFzayBmb3IgcGVlcjolcyIsCi0gICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocmVtb3RlX2JkYSkpOwotICAgIH0KLSAgICByZXR1cm4gQlRNX0NNRF9TVE9SRUQ7Ci0gIH0KLQotICBMT0dfSU5GTygKLSAgICAgICJTZXR0aW5nIHBvd2VyIG1vZGUgZm9yIHBlZXI6JXMgY3VycmVudF9tb2RlOiVzWyVoaHVdIG5ld19tb2RlOiVzWyVoaHVdIiwKLSAgICAgIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYmRhKSwgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KHBfY2ItPnN0YXRlKS5jX3N0cigpLAotICAgICAgcF9jYi0+c3RhdGUsIHBvd2VyX21vZGVfdGV4dChwX21vZGUtPm1vZGUpLmNfc3RyKCksIHBfbW9kZS0+bW9kZSk7Ci0KLSAgcmV0dXJuIGJ0bV9wbV9zbmRfbWRfcmVxKHBfY2ItPmhhbmRsZV8sIHBtX2lkLCBwX2NiLT5oYW5kbGVfLCBwX21vZGUpOwotfQotCi1ib29sIEJUTV9TZXRMaW5rUG9saWN5QWN0aXZlTW9kZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKSB7Ci0gIHRCVE1fUE1fUFdSX01EIHNldHRpbmdzOwotICBtZW1zZXQoKHZvaWQqKSZzZXR0aW5ncywgMCwgc2l6ZW9mKHNldHRpbmdzKSk7Ci0gIHNldHRpbmdzLm1vZGUgPSBCVE1fUE1fTURfQUNUSVZFOwotCi0gIHN3aXRjaCAoQlRNX1NldFBvd2VyTW9kZShCVE1fUE1fU0VUX09OTFlfSUQsIHJlbW90ZV9iZGEsICZzZXR0aW5ncykpIHsKLSAgICBjYXNlIEJUTV9DTURfU1RPUkVEOgotICAgIGNhc2UgQlRNX1NVQ0NFU1M6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgQlRNX1JlYWRQb3dlck1vZGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9QTV9NT0RFKiBwX21vZGUpIHsKLSAgaWYgKHBfbW9kZSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCJwb3dlciBtb2RlIGlzIG51bGxwdHIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdEJUTV9QTV9NQ0IqIHBfbWNiID0gYnRtX3BtX2dldF9wb3dlcl9tYW5hZ2VyX2Zyb21fYWRkcmVzcyhyZW1vdGVfYmRhKTsKLSAgaWYgKHBfbWNiID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5rbm93biBkZXZpY2U6JXMiLCBQUklWQVRFX0FERFJFU1MocmVtb3RlX2JkYSkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqcF9tb2RlID0gc3RhdGljX2Nhc3Q8dEJUTV9QTV9NT0RFPihwX21jYi0+c3RhdGUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRTc3JQYXJhbXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgc2VuZHMgdGhlIGdpdmVuIFNTUiBwYXJhbWV0ZXJzIGZvciB0aGUgZ2l2ZW4gQUNMCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gaWYgaXQgaXMgaW4gQUNUSVZFIG1vZGUuCi0gKgotICogSW5wdXQgUGFyYW0gICAgICByZW1vdGVfYmRhIC0gZGV2aWNlIGFkZHJlc3Mgb2YgZGVzaXJlZCBBQ0wgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBtYXhfbGF0ICAgIC0gbWF4aW11bSBsYXRlbmN5IChpbiAwLjYyNW1zKSgwLTB4RkZGRSkKLSAqICAgICAgICAgICAgICAgICAgbWluX3JtdF90byAtIG1pbmltdW0gcmVtb3RlIHRpbWVvdXQKLSAqICAgICAgICAgICAgICAgICAgbWluX2xvY190byAtIG1pbmltdW0gbG9jYWwgdGltZW91dAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHRoZSBIQ0kgY29tbWFuZCBpcyBpc3N1ZWQgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRNX1VOS05PV05fQUREUiBpZiBiZCBhZGRyIGlzIG5vdCBhY3RpdmUgb3IgYmFkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RPUkVEIGlmIHRoZSBjb21tYW5kIGlzIHN0b3JlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0U3NyUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sIHVpbnQxNl90IG1pbl9sb2NfdG8pIHsKLSAgdEJUTV9QTV9NQ0IqIHBfY2IgPSBidG1fcG1fZ2V0X3Bvd2VyX21hbmFnZXJfZnJvbV9hZGRyZXNzKHJlbW90ZV9iZGEpOwotICBpZiAocF9jYiA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIHBvd2VyIG1hbmFnZXIgZm9yIHBlZXI6JXMiLAotICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhyZW1vdGVfYmRhKSk7Ci0gICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gIH0KLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9saW5rX3BvbGljeV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0U3NyUGFyYW1zKHBfY2ItPmhhbmRsZV8sIG1heF9sYXQsIG1pbl9ybXRfdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbG9jX3RvKTsKLSAgfQotCi0gIGlmIChwX2NiLT5zdGF0ZSA9PSBCVE1fUE1fU1RfQUNUSVZFIHx8IHBfY2ItPnN0YXRlID09IEJUTV9QTV9TVF9TTklGRikgewotICAgIExPR19JTkZPKAotICAgICAgICAiU2V0IHNuaWZmIHN1YnJhdGluZyBzdGF0ZTolc1slZF0gbWF4X2xhdGVuY3k6MHglMDR4ICIKLSAgICAgICAgIm1pbl9yZW1vdGVfdGltZW91dDoweCUwNHgiCi0gICAgICAgICIgbWluX2xvY2FsX3RpbWVvdXQ6MHglMDR4IiwKLSAgICAgICAgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KHBfY2ItPnN0YXRlKS5jX3N0cigpLCBwX2NiLT5zdGF0ZSwgbWF4X2xhdCwKLSAgICAgICAgbWluX3JtdF90bywgbWluX2xvY190byk7Ci0gICAgc2VuZF9zbmlmZl9zdWJyYXRpbmcocF9jYi0+aGFuZGxlXywgcmVtb3RlX2JkYSwgbWF4X2xhdCwgbWluX3JtdF90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbG9jX3RvKTsKLSAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gIH0KLSAgTE9HX0lORk8oInBtX21vZGVfZGIgc3RhdGU6ICVkIiwgcF9jYi0+c3RhdGUpOwotICBwX2NiLT5tYXhfbGF0ID0gbWF4X2xhdDsKLSAgcF9jYi0+bWluX3JtdF90byA9IG1pbl9ybXRfdG87Ci0gIHBfY2ItPm1pbl9sb2NfdG8gPSBtaW5fbG9jX3RvOwotICByZXR1cm4gQlRNX0NNRF9TVE9SRUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcG1fcmVzZXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFzIGEgcGFydCBvZiB0aGUgQlRNIHJlc2V0IHByb2Nlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3BtX3Jlc2V0KHZvaWQpIHsKLSAgdEJUTV9QTV9TVEFUVVNfQ0JBQ0sqIGNiID0gTlVMTDsKLQotICAvKiBjbGVhciB0aGUgcGVuZGluZyByZXF1ZXN0IGZvciBhcHBsaWNhdGlvbiAqLwotICBpZiAoKHBtX3BlbmRfaWQgIT0gQlRNX1BNX1NFVF9PTkxZX0lEKSAmJiAocG1fcmVnX2RiLm1hc2sgJiBCVE1fUE1fUkVHX1NFVCkpIHsKLSAgICBjYiA9IHBtX3JlZ19kYi5jYmFjazsKLSAgfQotCi0gIHBtX3JlZ19kYi5tYXNrID0gQlRNX1BNX1JFQ19OT1RfVVNFRDsKLQotICBpZiAoY2IgIT0gTlVMTCAmJiBwbV9wZW5kX2xpbmsgIT0gMCkgewotICAgIGNvbnN0IFJhd0FkZHJlc3MgcmF3X2FkZHJlc3MgPSBwbV9tb2RlX2RiW3BtX3BlbmRfbGlua10uYmRhXzsKLSAgICAoKmNiKShyYXdfYWRkcmVzcywgQlRNX1BNX1NUU19FUlJPUiwgQlRNX0RFVl9SRVNFVCwgSENJX1NVQ0NFU1MpOwotICB9Ci0gIC8qIG5vIGNvbW1hbmQgcGVuZGluZyAqLwotICBwbV9wZW5kX2xpbmsgPSAwOwotICBwbV9tb2RlX2RiLmNsZWFyKCk7Ci0gIHBtX3BlbmRfaWQgPSAwOwotICBtZW1zZXQoJnBtX3JlZ19kYiwgMCwgc2l6ZW9mKHBtX3JlZ19kYikpOwotICBMT0dfSU5GTygicmVzZXQgcG0iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgYnRtX3BtX2NvbXBhcmVfbW9kZXMKLSAqIERlc2NyaXB0aW9uICBnZXQgdGhlICJtb3JlIGFjdGl2ZSIgbW9kZSBvZiB0aGUgMgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVE1fUE1fUFdSX01EKiBidG1fcG1fY29tcGFyZV9tb2Rlcyhjb25zdCB0QlRNX1BNX1BXUl9NRCogcF9tZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fUE1fUFdSX01EKiBwX21kMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9QTV9QV1JfTUQqIHBfcmVzKSB7Ci0gIHVpbnQ4X3QgcmVzOwotCi0gIGlmIChwX21kMSA9PSBOVUxMKSB7Ci0gICAgKnBfcmVzID0gKnBfbWQyOwotICAgIHBfcmVzLT5tb2RlICY9IH5CVE1fUE1fTURfRk9SQ0U7Ci0KLSAgICByZXR1cm4gcF9yZXM7Ci0gIH0KLQotICBpZiAocF9tZDItPm1vZGUgPT0gQlRNX1BNX01EX0FDVElWRSB8fCBwX21kMS0+bW9kZSA9PSBCVE1fUE1fTURfQUNUSVZFKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvKiBjaGVjayBpZiBmb3JjZSBiaXQgaXMgaW52b2x2ZWQgKi8KLSAgaWYgKHBfbWQxLT5tb2RlICYgQlRNX1BNX01EX0ZPUkNFKSB7Ci0gICAgKnBfcmVzID0gKnBfbWQxOwotICAgIHBfcmVzLT5tb2RlICY9IH5CVE1fUE1fTURfRk9SQ0U7Ci0gICAgcmV0dXJuIHBfcmVzOwotICB9Ci0KLSAgaWYgKHBfbWQyLT5tb2RlICYgQlRNX1BNX01EX0ZPUkNFKSB7Ci0gICAgKnBfcmVzID0gKnBfbWQyOwotICAgIHBfcmVzLT5tb2RlICY9IH5CVE1fUE1fTURfRk9SQ0U7Ci0gICAgcmV0dXJuIHBfcmVzOwotICB9Ci0KLSAgcmVzID0gKHBfbWQxLT5tb2RlIC0gMSkgKiBCVE1fUE1fTlVNX1NFVF9NT0RFUyArIChwX21kMi0+bW9kZSAtIDEpOwotICByZXMgPSBidG1fcG1fbWRfY29tcF9tYXRyaXhbcmVzXTsKLSAgc3dpdGNoIChyZXMpIHsKLSAgICBjYXNlIEJUTV9QTV9HRVRfTUQxOgotICAgICAgKnBfcmVzID0gKnBfbWQxOwotICAgICAgcmV0dXJuIHBfcmVzOwotCi0gICAgY2FzZSBCVE1fUE1fR0VUX01EMjoKLSAgICAgICpwX3JlcyA9ICpwX21kMjsKLSAgICAgIHJldHVybiBwX3JlczsKLQotICAgIGNhc2UgQlRNX1BNX0dFVF9DT01QOgotICAgICAgcF9yZXMtPm1vZGUgPSBwX21kMS0+bW9kZTsKLSAgICAgIC8qIG1pbiBvZiB0aGUgdHdvICovCi0gICAgICBwX3Jlcy0+bWF4ID0gKHBfbWQxLT5tYXggPCBwX21kMi0+bWF4KSA/IChwX21kMS0+bWF4KSA6IChwX21kMi0+bWF4KTsKLSAgICAgIC8qIG1heCBvZiB0aGUgdHdvICovCi0gICAgICBwX3Jlcy0+bWluID0gKHBfbWQxLT5taW4gPiBwX21kMi0+bWluKSA/IChwX21kMS0+bWluKSA6IChwX21kMi0+bWluKTsKLQotICAgICAgLyogdGhlIGludGVyc2VjdGlvbiBpcyBOVUxMICovCi0gICAgICBpZiAocF9yZXMtPm1heCA8IHBfcmVzLT5taW4pIHJldHVybiBOVUxMOwotCi0gICAgICBpZiAocF9yZXMtPm1vZGUgPT0gQlRNX1BNX01EX1NOSUZGKSB7Ci0gICAgICAgIC8qIG1heCBvZiB0aGUgdHdvICovCi0gICAgICAgIHBfcmVzLT5hdHRlbXB0ID0gKHBfbWQxLT5hdHRlbXB0ID4gcF9tZDItPmF0dGVtcHQpID8gKHBfbWQxLT5hdHRlbXB0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwX21kMi0+YXR0ZW1wdCk7Ci0gICAgICAgIHBfcmVzLT50aW1lb3V0ID0gKHBfbWQxLT50aW1lb3V0ID4gcF9tZDItPnRpbWVvdXQpID8gKHBfbWQxLT50aW1lb3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwX21kMi0+dGltZW91dCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcF9yZXM7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0bV9wbV9nZXRfc2V0X21vZGUKLSAqIERlc2NyaXB0aW9uICBnZXQgdGhlIHJlc3VsdGluZyBtb2RlIGZyb20gdGhlIHJlZ2lzdGVyZWQgcGFydGllcywgdGhlbiBjb21wYXJlCi0gKiAgICAgICAgICAgICAgaXQgd2l0aCB0aGUgcmVxdWVzdGVkIG1vZGUsIGlmIHRoZSBjb21tYW5kIGlzIGZyb20gYW4KLSAqICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWQgcGFydHkuCi0gKgotICogUmV0dXJucyAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVE1fUE1fTU9ERSBidG1fcG1fZ2V0X3NldF9tb2RlKHVpbnQ4X3QgcG1faWQsIHRCVE1fUE1fTUNCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fUE1fUFdSX01EKiBwX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9QTV9QV1JfTUQqIHBfcmVzKSB7Ci0gIHRCVE1fUE1fUFdSX01EKiBwX21kID0gTlVMTDsKLQotICBpZiAocF9tb2RlICE9IE5VTEwgJiYgcF9tb2RlLT5tb2RlICYgQlRNX1BNX01EX0ZPUkNFKSB7Ci0gICAgKnBfcmVzID0gKnBfbW9kZTsKLSAgICBwX3Jlcy0+bW9kZSAmPSB+QlRNX1BNX01EX0ZPUkNFOwotICAgIHJldHVybiBwX3Jlcy0+bW9kZTsKLSAgfQotCi0gIC8qIGcgdGhyb3VnaCBhbGwgdGhlIHJlZ2lzdGVyZWQgInNldCIgcGFydGllcyAqLwotICBpZiAocG1fcmVnX2RiLm1hc2sgJiBCVE1fUE1fUkVHX1NFVCkgewotICAgIGlmIChwX2NiLT5yZXFfbW9kZS5tb2RlID09IEJUTV9QTV9NRF9BQ1RJVkUpIHsKLSAgICAgIC8qIGlmIGF0IGxlYXN0IG9uZSByZWdpc3RlcmVkIChTRVQpIHBhcnR5IHNheXMgQUNUSVZFLCBzdGF5IGFjdGl2ZSAqLwotICAgICAgcmV0dXJuIEJUTV9QTV9NRF9BQ1RJVkU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIHJlZ2lzdGVyZWQgcGFydGllcyBnaXZlIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uLCBzdGF5IGFjdGl2ZSAqLwotICAgICAgaWYgKChidG1fcG1fY29tcGFyZV9tb2RlcyhwX21kLCAmcF9jYi0+cmVxX21vZGUsIHBfcmVzKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEJUTV9QTV9NRF9BQ1RJVkU7Ci0gICAgICBwX21kID0gcF9yZXM7Ci0gICAgfQotICB9Ci0KLSAgLyogaWYgdGhlIHJlc3VsdGluZyBtb2RlIGlzIE5VTEwobm9ib2R5IHJlZ2lzdGVycyBTRVQpLCB1c2UgdGhlIHJlcXVlc3RlZCBtb2RlCi0gICAqLwotICBpZiAocF9tZCA9PSBOVUxMKSB7Ci0gICAgaWYgKHBfbW9kZSkKLSAgICAgICpwX3JlcyA9ICooKHRCVE1fUE1fUFdSX01EKilwX21vZGUpOwotICAgIGVsc2UgLyogcF9tb2RlIGlzIE5VTEwgd2hlbiBidG1fcG1fc25kX21kX3JlcSBpcyBjYWxsZWQgZnJvbQotICAgICAgICAgICAgYnRtX3BtX3Byb2NfbW9kZV9jaGFuZ2UgKi8KLSAgICAgIHJldHVybiBCVE1fUE1fTURfQUNUSVZFOwotICB9IGVsc2UgewotICAgIC8qIGlmIHRoZSBjb21tYW5kIGlzIGZyb20gdW5yZWdpc3RlcmVkIHBhcnR5LAotICAgICAgIGNvbXBhcmUgdGhlIHJlc3VsdGluZyBtb2RlIGZyb20gcmVnaXN0ZXJlZCBwYXJ0eSovCi0gICAgaWYgKChwbV9pZCA9PSBCVE1fUE1fU0VUX09OTFlfSUQpICYmCi0gICAgICAgICgoYnRtX3BtX2NvbXBhcmVfbW9kZXMocF9tb2RlLCBwX21kLCBwX3JlcykpID09IE5VTEwpKQotICAgICAgcmV0dXJuIEJUTV9QTV9NRF9BQ1RJVkU7Ci0gIH0KLQotICByZXR1cm4gcF9yZXMtPm1vZGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGJ0bV9wbV9zbmRfbWRfcmVxCi0gKiBEZXNjcmlwdGlvbiAgZ2V0IHRoZSByZXN1bHRpbmcgbW9kZSBhbmQgc2VuZCB0aGUgcmVzdWVzdCB0byBob3N0IGNvbnRyb2xsZXIKLSAqIFJldHVybnMgICAgICB0QlRNX1NUQVRVUwotICosIGJvb2wgICAgKnBfY2hnX2luZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRNX1NUQVRVUyBidG1fcG1fc25kX21kX3JlcSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcG1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fUE1fUFdSX01EKiBwX21vZGUpIHsKLSAgQVNTRVJUX0xPRyhwbV9tb2RlX2RiLmNvdW50KGhhbmRsZSkgIT0gMCwKLSAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCBmb3IgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgdEJUTV9QTV9QV1JfTUQgbWRfcmVzOwotICB0QlRNX1BNX01PREUgbW9kZTsKLSAgdEJUTV9QTV9NQ0IqIHBfY2IgPSAmcG1fbW9kZV9kYltoYW5kbGVdOwotICBib29sIGNoZ19pbmQgPSBmYWxzZTsKLQotICBtb2RlID0gYnRtX3BtX2dldF9zZXRfbW9kZShwbV9pZCwgcF9jYiwgcF9tb2RlLCAmbWRfcmVzKTsKLSAgbWRfcmVzLm1vZGUgPSBtb2RlOwotCi0gIExPR19ERUJVRygiRm91bmQgY29udHJvbGxlciBpbiBtb2RlOiVzIiwgcG93ZXJfbW9kZV90ZXh0KG1vZGUpLmNfc3RyKCkpOwotCi0gIGlmIChwX2NiLT5zdGF0ZSA9PSBtb2RlKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJMaW5rIGFscmVhZHkgaW4gcmVxdWVzdGVkIG1vZGUgcG1faWQ6JWhodSBsaW5rX2luZDolZCBtb2RlOiVzWyVoaHVdIiwKLSAgICAgICAgcG1faWQsIGxpbmtfaW5kLCBwb3dlcl9tb2RlX3RleHQobW9kZSkuY19zdHIoKSwgbW9kZSk7Ci0KLSAgICAvKiBhbHJlYWR5IGluIHRoZSByZXN1bHRpbmcgbW9kZSAqLwotICAgIGlmICgobW9kZSA9PSBCVE1fUE1fTURfQUNUSVZFKSB8fAotICAgICAgICAoKG1kX3Jlcy5tYXggPj0gcF9jYi0+aW50ZXJ2YWwpICYmIChtZF9yZXMubWluIDw9IHBfY2ItPmludGVydmFsKSkpIHsKLSAgICAgIExPR19ERUJVRygiU3RvcmluZyBjb21tYW5kIik7Ci0gICAgICByZXR1cm4gQlRNX0NNRF9TVE9SRUQ7Ci0gICAgfQotICAgIExPR19ERUJVRygiTmVlZCB0byB3YWtlIHRoZW4gc2xlZXAiKTsKLSAgICBjaGdfaW5kID0gdHJ1ZTsKLSAgfQotICBwX2NiLT5jaGdfaW5kID0gY2hnX2luZDsKLQotICAvKiBjYW5ub3QgZ28gZGlyZWN0bHkgZnJvbSBjdXJyZW50IG1vZGUgdG8gcmVzdWx0aW5nIG1vZGUuICovCi0gIGlmIChtb2RlICE9IEJUTV9QTV9NRF9BQ1RJVkUgJiYgcF9jYi0+c3RhdGUgIT0gQlRNX1BNX01EX0FDVElWRSkgewotICAgIExPR19ERUJVRygiUG93ZXIgbW9kZSBjaGFuZ2UgZGVsYXkgcmVxdWlyZWQiKTsKLSAgICBwX2NiLT5jaGdfaW5kID0gdHJ1ZTsgLyogbmVlZHMgdG8gd2FrZSwgdGhlbiBzbGVlcCAqLwotICB9Ci0KLSAgaWYgKHBfY2ItPmNoZ19pbmQpIHsKLSAgICBMT0dfREVCVUcoIk5lZWQgdG8gd2FrZSBmaXJzdCIpOwotICAgIG1kX3Jlcy5tb2RlID0gQlRNX1BNX01EX0FDVElWRTsKLSAgfSBlbHNlIGlmIChCVE1fUE1fTURfU05JRkYgPT0gbWRfcmVzLm1vZGUgJiYgcF9jYi0+bWF4X2xhdCkgewotICAgIExPR19ERUJVRygiU2VuZGluZyBzbmlmZiBzdWJyYXRpbmcgdG8gY29udHJvbGxlciIpOwotICAgIHNlbmRfc25pZmZfc3VicmF0aW5nKGhhbmRsZSwgcF9jYi0+YmRhXywgcF9jYi0+bWF4X2xhdCwgcF9jYi0+bWluX3JtdF90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5taW5fbG9jX3RvKTsKLSAgICBwX2NiLT5tYXhfbGF0ID0gMDsKLSAgfQotICAvKiBEZWZhdWx0IGlzIGZhaWx1cmUgKi8KLSAgcG1fcGVuZF9saW5rID0gMDsKLQotICAvKiBzZW5kIHRoZSBhcHByb3ByaWF0ZSBIQ0kgY29tbWFuZCAqLwotICBwbV9wZW5kX2lkID0gcG1faWQ7Ci0KLSAgTE9HX0lORk8oIlN3aXRjaGluZyBmcm9tICVzWzB4JTAyeF0gdG8gJXNbMHglMDJ4XSIsCi0gICAgICAgICAgIHBvd2VyX21vZGVfc3RhdGVfdGV4dChwX2NiLT5zdGF0ZSkuY19zdHIoKSwgcF9jYi0+c3RhdGUsCi0gICAgICAgICAgIHBvd2VyX21vZGVfc3RhdGVfdGV4dChtZF9yZXMubW9kZSkuY19zdHIoKSwgbWRfcmVzLm1vZGUpOwotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBwX2NiLT5iZGFfLCAiUG93ZXIgbW9kZSBjaGFuZ2UiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAiJXNbMHglMDJ4XSA9PT4gJXNbMHglMDJ4XSIsCi0gICAgICAgICAgICAgICAgICAgICBwb3dlcl9tb2RlX3N0YXRlX3RleHQocF9jYi0+c3RhdGUpLmNfc3RyKCksIHBfY2ItPnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KG1kX3Jlcy5tb2RlKS5jX3N0cigpLCBtZF9yZXMubW9kZSkpOwotCi0gIHN3aXRjaCAobWRfcmVzLm1vZGUpIHsKLSAgICBjYXNlIEJUTV9QTV9NRF9BQ1RJVkU6Ci0gICAgICBzd2l0Y2ggKHBfY2ItPnN0YXRlKSB7Ci0gICAgICAgIGNhc2UgQlRNX1BNX01EX1NOSUZGOgotICAgICAgICAgIGJ0c25kX2hjaWNfZXhpdF9zbmlmZl9tb2RlKGhhbmRsZSk7Ci0gICAgICAgICAgcG1fcGVuZF9saW5rID0gaGFuZGxlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJUTV9QTV9NRF9QQVJLOgotICAgICAgICAgIGJ0c25kX2hjaWNfZXhpdF9wYXJrX21vZGUoaGFuZGxlKTsKLSAgICAgICAgICBwbV9wZW5kX2xpbmsgPSBoYW5kbGU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLyogRmFpbHVyZSBwbV9wZW5kX2xpbmsgPSBNQVhfTDJDQVBfTElOS1MgKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fUE1fTURfSE9MRDoKLSAgICAgIGJ0c25kX2hjaWNfaG9sZF9tb2RlKGhhbmRsZSwgbWRfcmVzLm1heCwgbWRfcmVzLm1pbik7Ci0gICAgICBwbV9wZW5kX2xpbmsgPSBoYW5kbGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BNX01EX1NOSUZGOgotICAgICAgYnRzbmRfaGNpY19zbmlmZl9tb2RlKGhhbmRsZSwgbWRfcmVzLm1heCwgbWRfcmVzLm1pbiwgbWRfcmVzLmF0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRfcmVzLnRpbWVvdXQpOwotICAgICAgcG1fcGVuZF9saW5rID0gaGFuZGxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9QTV9NRF9QQVJLOgotICAgICAgYnRzbmRfaGNpY19wYXJrX21vZGUoaGFuZGxlLCBtZF9yZXMubWF4LCBtZF9yZXMubWluKTsKLSAgICAgIHBtX3BlbmRfbGluayA9IGhhbmRsZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBGYWlsdXJlIHBtX3BlbmRfbGluayA9IE1BWF9MMkNBUF9MSU5LUyAqLwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAocG1fcGVuZF9saW5rID09IDApIHsKLSAgICAvKiB0aGUgY29tbWFuZCB3YXMgbm90IHNlbnQgKi8KLSAgICBMT0dfRVJST1IoInBtX3BlbmRpbmdfbGluayBtYXhlZCBvdXQiKTsKLSAgICByZXR1cm4gKEJUTV9OT19SRVNPVVJDRVMpOwotICB9Ci0KLSAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLX0KLQotc3RhdGljIHZvaWQgYnRtX3BtX2NvbnRpbnVlX3BlbmRpbmdfbW9kZV9jaGFuZ2VzKCkgewotICBmb3IgKGF1dG8mIGVudHJ5IDogcG1fbW9kZV9kYikgewotICAgIGlmIChlbnRyeS5zZWNvbmQuc3RhdGUgJiBCVE1fUE1fU1RPUkVEX01BU0spIHsKLSAgICAgIGVudHJ5LnNlY29uZC5zdGF0ZSAmPSB+QlRNX1BNX1NUT1JFRF9NQVNLOwotICAgICAgTE9HX0lORk8oIkZvdW5kIGFub3RoZXIgbGluayByZXF1aXJpbmcgcG93ZXIgbW9kZSBjaGFuZ2U6JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGVudHJ5LnNlY29uZC5iZGFfKSk7Ci0gICAgICBidG1fcG1fc25kX21kX3JlcShlbnRyeS5zZWNvbmQuaGFuZGxlXywgQlRNX1BNX1NFVF9PTkxZX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc2Vjb25kLmhhbmRsZV8sIE5VTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3BtX3Byb2NfY21kX3N0YXR1cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBIQ0kgY29tbWFuZCBzdGF0dXMgZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgb2NjdXJzIGZvciBwb3dlciBtYW5hZ2VyIHJlbGF0ZWQgY29tbWFuZHMuCi0gKgotICogSW5wdXQgUGFybXMgICAgICBzdGF0dXMgLSBzdGF0dXMgb2YgdGhlIGV2ZW50IChIQ0lfU1VDQ0VTUyBpZiBubyBlcnJvcnMpCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9wbV9wcm9jX2NtZF9zdGF0dXModEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIGlmIChwbV9wZW5kX2xpbmsgPT0gMCkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIlRoZXJlIGFyZSBubyBsaW5rcyBwZW5kaW5nIHBvd2VyIG1vZGUgY2hhbmdlczsgdHJ5IHRvIGZpbmQgb3RoZXIgIgotICAgICAgICAicGVuZGluZyBjaGFuZ2VzIik7Ci0gICAgYnRtX3BtX2NvbnRpbnVlX3BlbmRpbmdfbW9kZV9jaGFuZ2VzKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwbV9tb2RlX2RiLmNvdW50KHBtX3BlbmRfbGluaykgPT0gMCkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIkdvdCBQTSBjaGFuZ2Ugc3RhdHVzIGZvciBkaXNjb25uZWN0ZWQgbGluayAlZDsgZm9yZ290IHRvIGNsZWFuIHVwICIKLSAgICAgICAgInBtX3BlbmRfbGluaz8iLAotICAgICAgICBwbV9wZW5kX2xpbmspOwotICAgIGJ0bV9wbV9jb250aW51ZV9wZW5kaW5nX21vZGVfY2hhbmdlcygpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVE1fUE1fTUNCKiBwX2NiID0gJnBtX21vZGVfZGJbcG1fcGVuZF9saW5rXTsKLQotICAvLyBpZiB0aGUgY29tbWFuZCB3YXMgbm90IHN1Y2Nlc3NmdWwuIFN0YXkgaW4gdGhlIHNhbWUgc3RhdGUKLSAgdEJUTV9QTV9TVEFUVVMgcG1fc3RhdHVzID0gQlRNX1BNX1NUU19FUlJPUjsKLQotICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgcF9jYi0+c3RhdGUgPSBCVE1fUE1fU1RfUEVORElORzsKLSAgICBwbV9zdGF0dXMgPSBCVE1fUE1fU1RTX1BFTkRJTkc7Ci0gIH0KLQotICAvKiBub3RpZnkgdGhlIGNhbGxlciBpcyBhcHByb3ByaWF0ZSAqLwotICBpZiAoKHBtX3BlbmRfaWQgIT0gQlRNX1BNX1NFVF9PTkxZX0lEKSAmJiAocG1fcmVnX2RiLm1hc2sgJiBCVE1fUE1fUkVHX1NFVCkpIHsKLSAgICBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIgPSBwbV9tb2RlX2RiW3BtX3BlbmRfbGlua10uYmRhXzsKLSAgICBMT0dfREVCVUcoIk5vdGlmeWluZyBjYWxsYmFjayB0aGF0IGxpbmsgcG93ZXIgbW9kZSBpcyBjb21wbGV0ZSBwZWVyOiVzIiwKLSAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICAoKnBtX3JlZ19kYi5jYmFjaykoYmRfYWRkciwgcG1fc3RhdHVzLCAwLCBzdGF0dXMpOwotICB9Ci0KLSAgTE9HX0lORk8oIkNsZWFyaW5nIHBlbmRpbmcgcG93ZXIgbW9kZSBsaW5rIHN0YXRlOiVzIiwKLSAgICAgICAgICAgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KHBfY2ItPnN0YXRlKS5jX3N0cigpKTsKLSAgcG1fcGVuZF9saW5rID0gMDsKLQotICBidG1fcG1fY29udGludWVfcGVuZGluZ19tb2RlX2NoYW5nZXMoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9wcm9jZXNzX21vZGVfY2hhbmdlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIEhDSSBtb2RlIGNoYW5nZSBldmVudAotICogICAgICAgICAgICAgICAgICBvY2N1cnMuCi0gKgotICogSW5wdXQgUGFybXMgICAgICBoY2lfc3RhdHVzIC0gc3RhdHVzIG9mIHRoZSBldmVudCAoSENJX1NVQ0NFU1MgaWYgbm8gZXJyb3JzKQotICogICAgICAgICAgICAgICAgICBoY2lfaGFuZGxlIC0gY29ubmVjdGlvbiBoYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFuZ2UKLSAqICAgICAgICAgICAgICAgICAgbW9kZSAtIEhDSV9NT0RFX0FDVElWRSwgSENJX01PREVfSE9MRCwgSENJX01PREVfU05JRkYsIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfTU9ERV9QQVJLCi0gKiAgICAgICAgICAgICAgICAgIGludGVydmFsIC0gbnVtYmVyIG9mIGJhc2ViYW5kIHNsb3RzIChtZWFuaW5nIGRlcGVuZHMgb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9wbV9wcm9jX21vZGVfY2hhbmdlKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIHVpbnQxNl90IGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfTU9ERSBoY2lfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpIHsKLSAgdEJUTV9QTV9TVEFUVVMgbW9kZSA9IHN0YXRpY19jYXN0PHRCVE1fUE1fU1RBVFVTPihoY2lfbW9kZSk7Ci0gIHRCVE1fUE1fU1RBVEUgb2xkX3N0YXRlOwotCi0gIC8qIHVwZGF0ZSBjb250cm9sIGJsb2NrICovCi0gIGlmIChwbV9tb2RlX2RiLmNvdW50KGhjaV9oYW5kbGUpID09IDApIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgYWN0aXZlIGFjbCBmb3IgaGFuZGxlICVkIiwgaGNpX2hhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHRCVE1fUE1fTUNCKiBwX2NiID0gJnBtX21vZGVfZGJbaGNpX2hhbmRsZV07Ci0KLSAgb2xkX3N0YXRlID0gcF9jYi0+c3RhdGU7Ci0gIHBfY2ItPnN0YXRlID0gbW9kZTsKLSAgcF9jYi0+aW50ZXJ2YWwgPSBpbnRlcnZhbDsKLQotICBMT0dfSU5GTygiUG93ZXIgbW9kZSBzd2l0Y2hlZCBmcm9tICVzWyVoaHVdIHRvICVzWyVoaHVdIiwKLSAgICAgICAgICAgcG93ZXJfbW9kZV9zdGF0ZV90ZXh0KG9sZF9zdGF0ZSkuY19zdHIoKSwgb2xkX3N0YXRlLAotICAgICAgICAgICBwb3dlcl9tb2RlX3N0YXRlX3RleHQocF9jYi0+c3RhdGUpLmNfc3RyKCksIHBfY2ItPnN0YXRlKTsKLQotICBpZiAoKHBfY2ItPnN0YXRlID09IEJUTV9QTV9TVF9BQ1RJVkUpIHx8IChwX2NiLT5zdGF0ZSA9PSBCVE1fUE1fU1RfU05JRkYpKSB7Ci0gICAgbDJjX09uSGNpTW9kZUNoYW5nZVNlbmRQZW5kaW5nUGFja2V0cyhwX2NiLT5iZGFfKTsKLSAgfQotCi0gIC8qIHNldCByZXFfbW9kZSAgSE9MRCBtb2RlLT5BQ1RJVkUgKi8KLSAgaWYgKChtb2RlID09IEJUTV9QTV9NRF9BQ1RJVkUpICYmIChwX2NiLT5yZXFfbW9kZS5tb2RlID09IEJUTV9QTV9NRF9IT0xEKSkKLSAgICBwX2NiLT5yZXFfbW9kZS5tb2RlID0gQlRNX1BNX01EX0FDVElWRTsKLQotICAvKiBuZXcgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLiAtIHBvc3QgYSBtZXNzYWdlIHRvIEJUVSB0YXNrICovCi0gIGlmIChvbGRfc3RhdGUgJiBCVE1fUE1fU1RPUkVEX01BU0spIHsKLSAgICBidG1fcG1fc25kX21kX3JlcShoY2lfaGFuZGxlLCBCVE1fUE1fU0VUX09OTFlfSUQsIGhjaV9oYW5kbGUsIE5VTEwpOwotICB9IGVsc2UgewotICAgIGZvciAoYXV0byYgZW50cnkgOiBwbV9tb2RlX2RiKSB7Ci0gICAgICBpZiAoZW50cnkuc2Vjb25kLmNoZ19pbmQpIHsKLSAgICAgICAgYnRtX3BtX3NuZF9tZF9yZXEoZW50cnkuc2Vjb25kLmhhbmRsZV8sIEJUTV9QTV9TRVRfT05MWV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc2Vjb25kLmhhbmRsZV8sIE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBub3RpZnkgcmVnaXN0ZXJlZCBwYXJ0aWVzICovCi0gIGlmIChwbV9yZWdfZGIubWFzayAmIEJUTV9QTV9SRUdfU0VUKSB7Ci0gICAgKCpwbV9yZWdfZGIuY2JhY2spKHBfY2ItPmJkYV8sIG1vZGUsIGludGVydmFsLCBoY2lfc3RhdHVzKTsKLSAgfQotICAvKmNoZWNrIGlmIHNjbyBkaXNjb25uZWN0ICBpcyB3YWl0aW5nIGZvciB0aGUgbW9kZSBjaGFuZ2UgKi8KLSAgYnRtX3Njb19kaXNjX2Noa19wZW5kX2Zvcl9tb2RlY2hhbmdlKGhjaV9oYW5kbGUpOwotCi0gIC8qIElmIG1vZGUgY2hhbmdlIHdhcyBiZWNhdXNlIG9mIGFuIGFjdGl2ZSByb2xlIHN3aXRjaCBvciBjaGFuZ2UgbGluayBrZXkgKi8KLSAgYnRtX2NvbnRfcnN3aXRjaF9mcm9tX2hhbmRsZShoY2lfaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9wbV9wcm9jX3Nzcl9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gSENJIHNuaWZmIHN1YnJhdGluZyBldmVudAotICogICAgICAgICAgICAgICAgICBvY2N1cnMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHByb2Nlc3Nfc3NyX2V2ZW50KHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBtYXhfdHhfbGF0LCB1aW50MTZfdCBtYXhfcnhfbGF0KSB7Ci0gIGlmIChwbV9tb2RlX2RiLmNvdW50KGhhbmRsZSkgPT0gMCkgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBzbmlmZiBzdWJyYXRpbmcgZXZlbnQgd2l0aCBubyBhY3RpdmUgQUNMIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHRCVE1fUE1fTUNCKiBwX2NiID0gJnBtX21vZGVfZGJbaGFuZGxlXTsKLSAgYXV0byBiZF9hZGRyID0gcF9jYi0+YmRhXzsKLQotICBib29sIHVzZV9zc3IgPSB0cnVlOwotICBpZiAocF9jYi0+aW50ZXJ2YWwgPT0gbWF4X3J4X2xhdCkgewotICAgIExPR19ERUJVRygiU25pZmYgc3VicmF0aW5nIHVuc3VwcG9ydGVkIHNvIGRyb3BwaW5nIHRvIGxlZ2FjeSBzbmlmZiBtb2RlIik7Ci0gICAgdXNlX3NzciA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiU25pZmYgc3VicmF0aW5nIGVuYWJsZWQiKTsKLSAgfQotCi0gIGludCBjbnQgPSAwOwotICBpZiAocG1fcmVnX2RiLm1hc2sgJiBCVE1fUE1fUkVHX1NFVCkgewotICAgICgqcG1fcmVnX2RiLmNiYWNrKShiZF9hZGRyLCBCVE1fUE1fU1RTX1NTUiwgKHVzZV9zc3IpID8gMSA6IDAsIHN0YXR1cyk7Ci0gICAgY250Kys7Ci0gIH0KLSAgTE9HX0RFQlVHKAotICAgICAgIk5vdGlmaWVkIHNuaWZmIHN1YnJhdGluZyByZWdpc3RlcmVkIGNsaWVudHMgY250OiVkIHBlZXI6JXMgdXNlX3NzcjolcyAiCi0gICAgICAic3RhdHVzOiVzIiwKLSAgICAgIGNudCwgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpLCBsb2dib29sKHVzZV9zc3IpLmNfc3RyKCksCi0gICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXR1cykuY19zdHIoKSk7Ci19Ci0KLXZvaWQgYnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZyh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbGlua19wb2xpY3lfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6YnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZygKLSAgICAgICAgc3RhdHVzLCBoYW5kbGUsIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgIG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsIG1pbmltdW1fbG9jYWxfdGltZW91dCk7Ci0gIH0KLSAgcHJvY2Vzc19zc3JfZXZlbnQoc3RhdHVzLCBoYW5kbGUsIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3kpOwotfQotCi12b2lkIGJ0bV9wbV9wcm9jX3Nzcl9ldnQodWludDhfdCogcCwgVU5VU0VEX0FUVFIgdWludDE2X3QgZXZ0X2xlbikgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBtYXhfdHhfbGF0OwotICB1aW50MTZfdCBtYXhfcnhfbGF0OwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYobWF4X3R4X2xhdCwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYobWF4X3J4X2xhdCwgcCk7Ci0KLSAgcHJvY2Vzc19zc3JfZXZlbnQoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cyksIGhhbmRsZSwgbWF4X3R4X2xhdCwKLSAgICAgICAgICAgICAgICAgICAgbWF4X3J4X2xhdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcG1fZGV2aWNlX2luX2FjdGl2ZV9vcl9zbmlmZl9tb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiBpbiBhY3RpdmUgb3Igc25pZmYgbW9kZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgaW4gYWN0aXZlIG9yIHNuaWZmIG1vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRtX3BtX2RldmljZV9pbl9hY3RpdmVfb3Jfc25pZmZfbW9kZSh2b2lkKSB7Ci0gIC8qIFRoZSBhY3RpdmUgc3RhdGUgaXMgdGhlIGhpZ2hlc3Qgc3RhdGUtaW5jbHVkZXMgY29ubmVjdGVkIGRldmljZSBhbmQgc25pZmYKLSAgICogbW9kZSovCi0KLSAgLyogQ292ZXJzIGFjdGl2ZSBhbmQgc25pZmYgbW9kZXMgKi8KLSAgaWYgKCFwbV9tb2RlX2RiLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIENoZWNrIEJMRSBzdGF0ZXMgKi8KLSAgaWYgKCFidG1fY2IuYmxlX2N0cl9jYi5pc19jb25uZWN0aW9uX3N0YXRlX2lkbGUoKSkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgLSBCTEUgc3RhdGUgaXMgbm90IGlkbGUiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcG1fZGV2aWNlX2luX3NjYW5fc3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGluIHBhZ2luZywgaW5xdWlyeSBvcgotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW5nIG1vZGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUsIGlmIGluIHBhZ2luZywgaW5xdWlyeSBvciBjb25uZWN0aW5nIG1vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRtX3BtX2RldmljZV9pbl9zY2FuX3N0YXRlKHZvaWQpIHsKLSAgLyogU2NhbiBzdGF0ZS1wYWdpbmcsIGlucXVpcnksIGFuZCB0cnlpbmcgdG8gY29ubmVjdCAqLwotCi0gIC8qIENoZWNrIGZvciBwYWdpbmcgKi8KLSAgaWYgKGJ0bV9jYi5pc19wYWdpbmcgfHwgIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KGJ0bV9jYi5wYWdlX3F1ZXVlKSkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiYnRtX3BtX2RldmljZV9pbl9zY2FuX3N0YXRlLSBwYWdpbmciKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIENoZWNrIGZvciBpbnF1aXJ5ICovCi0gIGlmICgoYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlICYKLSAgICAgICAoQlRNX0JSX0lOUV9BQ1RJVkVfTUFTSyB8IEJUTV9CTEVfSU5RX0FDVElWRV9NQVNLKSkgIT0gMCkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiYnRtX3BtX2RldmljZV9pbl9zY2FuX3N0YXRlLSBJbnEgYWN0aXZlIik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUE1fUmVhZENvbnRyb2xsZXJTdGF0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSBjb250cm9sbGVyIHN0YXRlCi0gKgotICogUmV0dXJucyAgICAgICAgICBDb250cm9sbGVyIFN0YXRlLUJUTV9DT05UUkxfQUNUSVZFLCBCVE1fQ09OVFJMX1NDQU4sIGFuZAotICogICAgICAgICAgICAgICAgICBCVE1fQ09OVFJMX0lETEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9DT05UUkxfU1RBVEUgQlRNX1BNX1JlYWRDb250cm9sbGVyU3RhdGUodm9pZCkgewotICBpZiAoYnRtX3BtX2RldmljZV9pbl9hY3RpdmVfb3Jfc25pZmZfbW9kZSgpKQotICAgIHJldHVybiBCVE1fQ09OVFJMX0FDVElWRTsKLSAgZWxzZSBpZiAoYnRtX3BtX2RldmljZV9pbl9zY2FuX3N0YXRlKCkpCi0gICAgcmV0dXJuIEJUTV9DT05UUkxfU0NBTjsKLSAgZWxzZQotICAgIHJldHVybiBCVE1fQ09OVFJMX0lETEU7Ci19Ci0KLXZvaWQgYnRtX3BtX29uX21vZGVfY2hhbmdlKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGN1cnJlbnRfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbGlua19wb2xpY3lfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6YnRtX3BtX29uX21vZGVfY2hhbmdlKHN0YXR1cywgaGFuZGxlLCBjdXJyZW50X21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsKTsKLSAgfQotCi0gIGJ0bV9zY29fY2hrX3BlbmRfdW5wYXJrKHN0YXR1cywgaGFuZGxlKTsKLSAgYnRtX3BtX3Byb2NfbW9kZV9jaGFuZ2Uoc3RhdHVzLCBoYW5kbGUsIGN1cnJlbnRfbW9kZSwgaW50ZXJ2YWwpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYWNsL3BlZXJfcGFja2V0X3R5cGVzLmggYi9zdGFjay9hY2wvcGVlcl9wYWNrZXRfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyY2Y2My4uMDAwMDAwMAotLS0gYS9zdGFjay9hY2wvcGVlcl9wYWNrZXRfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpZGVmcy5oIgotCi0jZGVmaW5lIEJEX0ZFQVRVUkVTX0xFTiA4Ci10eXBlZGVmIHVpbnQ4X3QKLSAgICBCRF9GRUFUVVJFU1tCRF9GRUFUVVJFU19MRU5dOyAvKiBMTVAgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IGRldmljZSAqLwotCi0vLyBCaXQgb3JkZXIgWzBdOjAtNyBbMV06OC0xNSAuLi4gWzddOjU2LTYzCi1pbmxpbmUgc3RkOjpzdHJpbmcgYmRfZmVhdHVyZXNfdGV4dChjb25zdCBCRF9GRUFUVVJFUyYgZmVhdHVyZXMpIHsKLSAgdWludDhfdCBsZW4gPSBCRF9GRUFUVVJFU19MRU47Ci0gIGNoYXIgYnVmWzI1NV07Ci0gIGNoYXIqIHBidWYgPSBidWY7Ci0gIGNvbnN0IHVpbnQ4X3QqIGIgPSBmZWF0dXJlczsKLSAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIweCUwMnggIiwgKmIrKyk7Ci0gIH0KLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1Zik7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgYml0bWFzayBvZiBwYWNrZXQgdHlwZXMgZnJvbSB0aGUgcmVtb3RlIGZlYXR1cmUKLSAqLwotY2xhc3MgUGVlclBhY2tldFR5cGVzIHsKLSBwdWJsaWM6Ci0gIHN0cnVjdCB7Ci0gICAgdWludDE2X3Qgc3VwcG9ydGVkezB9OwotICAgIHVpbnQxNl90IHVuc3VwcG9ydGVkezB9OwotICB9IGFjbHsuc3VwcG9ydGVkID0gKEhDSV9QS1RfVFlQRVNfTUFTS19ETTEgfCBIQ0lfUEtUX1RZUEVTX01BU0tfREgxKX0sIHNjb3t9OwotCi0gIFBlZXJQYWNrZXRUeXBlcyhjb25zdCBCRF9GRUFUVVJFUyYgZmVhdHVyZXMpIHsKLSAgICAvKiAzIGFuZCA1IHNsb3QgcGFja2V0cz8gKi8KLSAgICBpZiAoSENJXzNfU0xPVF9QQUNLRVRTX1NVUFBPUlRFRChmZWF0dXJlcykpCi0gICAgICBhY2wuc3VwcG9ydGVkIHw9IChIQ0lfUEtUX1RZUEVTX01BU0tfREgzIHwgSENJX1BLVF9UWVBFU19NQVNLX0RNMyk7Ci0KLSAgICBpZiAoSENJXzVfU0xPVF9QQUNLRVRTX1NVUFBPUlRFRChmZWF0dXJlcykpCi0gICAgICBhY2wuc3VwcG9ydGVkIHw9IEhDSV9QS1RfVFlQRVNfTUFTS19ESDUgfCBIQ0lfUEtUX1RZUEVTX01BU0tfRE01OwotCi0gICAgLyogMiBhbmQgMyBNUFMgc3VwcG9ydD8gKi8KLSAgICBpZiAoIUhDSV9FRFJfQUNMXzJNUFNfU1VQUE9SVEVEKGZlYXR1cmVzKSkKLSAgICAgIC8qIE5vdCBzdXBwb3J0ZWQuIEFkZCAnbm90X3N1cHBvcnRlZCcgbWFzayBmb3IgYWxsIDJNUFMgcGFja2V0IHR5cGVzICovCi0gICAgICBhY2wudW5zdXBwb3J0ZWQgfD0KLSAgICAgICAgICAoSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREgxIHwgSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREgzIHwKLSAgICAgICAgICAgSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREg1KTsKLQotICAgIGlmICghSENJX0VEUl9BQ0xfM01QU19TVVBQT1JURUQoZmVhdHVyZXMpKQotICAgICAgLyogTm90IHN1cHBvcnRlZC4gQWRkICdub3Rfc3VwcG9ydGVkJyBtYXNrIGZvciBhbGwgM01QUyBwYWNrZXQgdHlwZXMgKi8KLSAgICAgIGFjbC51bnN1cHBvcnRlZCB8PQotICAgICAgICAgIChIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDEgfCBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDMgfAotICAgICAgICAgICBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDUpOwotCi0gICAgLyogRURSIDMgYW5kIDUgc2xvdCBzdXBwb3J0PyAqLwotICAgIGlmIChIQ0lfRURSX0FDTF8yTVBTX1NVUFBPUlRFRChmZWF0dXJlcykgfHwKLSAgICAgICAgSENJX0VEUl9BQ0xfM01QU19TVVBQT1JURUQoZmVhdHVyZXMpKSB7Ci0gICAgICBpZiAoIUhDSV8zX1NMT1RfRURSX0FDTF9TVVBQT1JURUQoZmVhdHVyZXMpKQotICAgICAgICAvKiBOb3Qgc3VwcG9ydGVkLiBBZGQgJ25vdF9zdXBwb3J0ZWQnIG1hc2sgZm9yIGFsbCAzLXNsb3QgRURSIHBhY2tldAotICAgICAgICAgKiB0eXBlcwotICAgICAgICAgKi8KLSAgICAgICAgYWNsLnVuc3VwcG9ydGVkIHw9Ci0gICAgICAgICAgICAoSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREgzIHwgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREgzKTsKLQotICAgICAgaWYgKCFIQ0lfNV9TTE9UX0VEUl9BQ0xfU1VQUE9SVEVEKGZlYXR1cmVzKSkKLSAgICAgICAgLyogTm90IHN1cHBvcnRlZC4gQWRkICdub3Rfc3VwcG9ydGVkJyBtYXNrIGZvciBhbGwgNS1zbG90IEVEUiBwYWNrZXQKLSAgICAgICAgICogdHlwZXMKLSAgICAgICAgICovCi0gICAgICAgIGFjbC51bnN1cHBvcnRlZCB8PQotICAgICAgICAgICAgKEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RINSB8IEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RINSk7Ci0gICAgfQotICB9Ci19OwpkaWZmIC0tZ2l0IGEvc3RhY2svYXZjdC9hdmN0X2FwaS5jYyBiL3N0YWNrL2F2Y3QvYXZjdF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjBlZjQuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZjdC9hdmN0X2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTYgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIEFQSSBvZiB0aGUgYXVkaW8vdmlkZW8gY29udHJvbCB0cmFuc3BvcnQgcHJvdG9jb2wuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImF2Y3RfYXBpLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2Y3RfaW50LmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIENvbnRyb2wgYmxvY2sgZm9yIEFWQ1QgKi8KLXRBVkNUX0NCIGF2Y3RfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkNUX1JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBzeXN0ZW0gbGV2ZWwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgQVZDVFAgcHJvdG9jb2wuICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIEFWQ1RQIGFuZAotICogICAgICAgICAgICAgICAgICBwcmVwYXJlcyB0aGUgcHJvdG9jb2wgc3RhY2sgZm9yIGl0cyB1c2UuICBUaGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG11c3QgYmUgY2FsbGVkIG9uY2UgYnkgdGhlIHN5c3RlbSBvciBwbGF0Zm9ybSB1c2luZyBBVkNUUAotICogICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIG90aGVyIGZ1bmN0aW9ucyBvZiB0aGUgQVBJIGFuIGJlIHVzZWQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFWQ1RfUmVnaXN0ZXIoKSB7Ci0gIEFWQ1RfVFJBQ0VfQVBJKCJBVkNUX1JlZ2lzdGVyIik7Ci0KLSAgLyogaW5pdGlhbGl6ZSBBVkNUUCBkYXRhIHN0cnVjdHVyZXMgKi8KLSAgbWVtc2V0KCZhdmN0X2NiLCAwLCBzaXplb2YodEFWQ1RfQ0IpKTsKLQotICAvKiByZWdpc3RlciBQU00gd2l0aCBMMkNBUCAqLwotICBMMkNBX1JlZ2lzdGVyMihBVkNUX1BTTSwgYXZjdF9sMmNfYXBwbCwgdHJ1ZSAvKiBlbmFibGVfc25vb3AgKi8sIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgIGtBdnJjTXR1LCAwLCBCVEFfU0VDX0FVVEhFTlRJQ0FURSk7Ci0KLSAgLyogSW5jbHVkZSB0aGUgYnJvd3NpbmcgY2hhbm5lbCB3aGljaCB1c2VzIGVGQ1IgKi8KLSAgdEwyQ0FQX0VSVE1fSU5GTyBlcnRtX2luZm87Ci0gIGVydG1faW5mby5wcmVmZXJyZWRfbW9kZSA9IEwyQ0FQX0ZDUl9FUlRNX01PREU7Ci0KLSAgTDJDQV9SZWdpc3RlcjIoQVZDVF9CUl9QU00sIGF2Y3RfbDJjX2JyX2FwcGwsIHRydWUgLyplbmFibGVfc25vb3AqLywKLSAgICAgICAgICAgICAgICAgJmVydG1faW5mbywga0F2cmNCck10dSwgQVZDVF9NSU5fQlJPV1NFX01UVSwKLSAgICAgICAgICAgICAgICAgQlRBX1NFQ19BVVRIRU5USUNBVEUpOwotCi0jaWYgZGVmaW5lZChBVkNUX0lOSVRJQUxfVFJBQ0VfTEVWRUwpCi0gIGF2Y3RfY2IudHJhY2VfbGV2ZWwgPSBBVkNUX0lOSVRJQUxfVFJBQ0VfTEVWRUw7Ci0jZWxzZQotICBhdmN0X2NiLnRyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfTk9ORTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9EZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZXJlZ2lzdGVyIHVzZSBBVkNUUCBwcm90b2NvbC4KLSAqICAgICAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIHdoZW4gQVZDVFAgaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgYW55Ci0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGluIHRoZSBzeXN0ZW0uICBCZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGVkLCBhbGwgY29ubmVjdGlvbnMgbXVzdCBiZSByZW1vdmVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgQVZDVF9SZW1vdmVDb25uKCkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFWQ1RfRGVyZWdpc3Rlcih2b2lkKSB7Ci0gIEFWQ1RfVFJBQ0VfQVBJKCJBVkNUX0RlcmVnaXN0ZXIiKTsKLQotICAvKiBkZXJlZ2lzdGVyIFBTTSB3aXRoIEwyQ0FQICovCi0gIEwyQ0FfRGVyZWdpc3RlcihBVkNUX1BTTSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkNUX0NyZWF0ZUNvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENyZWF0ZSBhbiBBVkNUUCBjb25uZWN0aW9uLiAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZgotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucywgaW5pdGlhdG9yIGFuZCBhY2NlcHRvciwgYXMgZGV0ZXJtaW5lZCBieQotICogICAgICAgICAgICAgICAgICB0aGUgcF9jYy0+cm9sZSBwYXJhbWV0ZXIuICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZSBhbiBpbml0aWF0b3IgY29ubmVjdGlvbiwgYW4gQVZDVFAgY29ubmVjdGlvbiB0bwotICogICAgICAgICAgICAgICAgICB0aGUgcGVlciBkZXZpY2UgaXMgaW5pdGlhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotICogICAgICAgICAgICAgICAgICBJZiBhbiBhY2NlcHRvciBjb25uZWN0aW9uIGlzIGNyZWF0ZWQsIHRoZSBjb25uZWN0aW9uIHdhaXRzCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NpdmVseSBmb3IgYW4gaW5jb21pbmcgQVZDVFAgY29ubmVjdGlvbiBmcm9tIGEgcGVlcgotICogICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZDVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZDVF9DcmVhdGVDb25uKHVpbnQ4X3QqIHBfaGFuZGxlLCB0QVZDVF9DQyogcF9jYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZDVF9TVUNDRVNTOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotICB0QVZDVF9MQ0IqIHBfbGNiOwotCi0gIEFWQ1RfVFJBQ0VfQVBJKCJBVkNUX0NyZWF0ZUNvbm46ICVkLCBjb250cm9sOiVkIiwgcF9jYy0+cm9sZSwgcF9jYy0+Y29udHJvbCk7Ci0KLSAgLyogQWxsb2NhdGUgY2NiOyBpZiBubyBjY2JzLCByZXR1cm4gZmFpbHVyZSAqLwotICBwX2NjYiA9IGF2Y3RfY2NiX2FsbG9jKHBfY2MpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEFWQ1RfTk9fUkVTT1VSQ0VTOwotICB9IGVsc2UgewotICAgIC8qIGdldCBoYW5kbGUgKi8KLSAgICAqcF9oYW5kbGUgPSBhdmN0X2NjYl90b19pZHgocF9jY2IpOwotCi0gICAgLyogaWYgaW5pdGlhdG9yIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAocF9jYy0+cm9sZSA9PSBBVkNUX0lOVCkgewotICAgICAgLyogZmluZCBsaW5rOyBpZiBub25lIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwotICAgICAgcF9sY2IgPSBhdmN0X2xjYl9ieV9iZChwZWVyX2FkZHIpOwotICAgICAgaWYgKHBfbGNiID09IE5VTEwpIHsKLSAgICAgICAgcF9sY2IgPSBhdmN0X2xjYl9hbGxvYyhwZWVyX2FkZHIpOwotICAgICAgICBpZiAocF9sY2IgPT0gTlVMTCkgewotICAgICAgICAgIC8qIG5vIGxpbmsgcmVzb3VyY2VzOyBmcmVlIGNjYiBhcyB3ZWxsICovCi0gICAgICAgICAgYXZjdF9jY2JfZGVhbGxvYyhwX2NjYiwgQVZDVF9OT19FVlQsIDAsIE5VTEwpOwotICAgICAgICAgIHJlc3VsdCA9IEFWQ1RfTk9fUkVTT1VSQ0VTOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBjaGVjayBpZiBQSUQgYWxyZWFkeSBpbiB1c2UgKi8KLSAgICAgIGVsc2UgaWYgKGF2Y3RfbGNiX2hhc19waWQocF9sY2IsIHBfY2MtPnBpZCkpIHsKLSAgICAgICAgYXZjdF9jY2JfZGVhbGxvYyhwX2NjYiwgQVZDVF9OT19FVlQsIDAsIE5VTEwpOwotICAgICAgICByZXN1bHQgPSBBVkNUX1BJRF9JTl9VU0U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gQVZDVF9TVUNDRVNTKSB7Ci0gICAgICAgIC8qIGJpbmQgbGNiIHRvIGNjYiAqLwotICAgICAgICBwX2NjYi0+cF9sY2IgPSBwX2xjYjsKLSAgICAgICAgQVZDVF9UUkFDRV9ERUJVRygiY2hfc3RhdGU6ICVkIiwgcF9sY2ItPmNoX3N0YXRlKTsKLSAgICAgICAgdEFWQ1RfTENCX0VWVCBhdmN0X2xjYl9ldnQ7Ci0gICAgICAgIGF2Y3RfbGNiX2V2dC5wX2NjYiA9IHBfY2NiOwotICAgICAgICBhdmN0X2xjYl9ldmVudChwX2xjYiwgQVZDVF9MQ0JfVUxfQklORF9FVlQsICZhdmN0X2xjYl9ldnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9SZW1vdmVDb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmUgYW4gQVZDVFAgY29ubmVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uICBJZiB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGlzIHRoZSBsYXN0IGNvbm5lY3Rpb24gdG8gYSBwZWVyIHRoZSBMMkNBUCBjaGFubmVsIGZvciBBVkNUUAotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGNsb3NlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkNUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkNUX1JlbW92ZUNvbm4odWludDhfdCBoYW5kbGUpIHsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZDVF9TVUNDRVNTOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotCi0gIEFWQ1RfVFJBQ0VfQVBJKCJBVkNUX1JlbW92ZUNvbm4iKTsKLQotICAvKiBtYXAgaGFuZGxlIHRvIGNjYiAqLwotICBwX2NjYiA9IGF2Y3RfY2NiX2J5X2lkeChoYW5kbGUpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEFWQ1RfQkFEX0hBTkRMRTsKLSAgfQotICAvKiBpZiBjb25uZWN0aW9uIG5vdCBib3VuZCB0byBsY2IsIGRlYWxsb2MgKi8KLSAgZWxzZSBpZiAocF9jY2ItPnBfbGNiID09IE5VTEwpIHsKLSAgICBhdmN0X2NjYl9kZWFsbG9jKHBfY2NiLCBBVkNUX05PX0VWVCwgMCwgTlVMTCk7Ci0gIH0KLSAgLyogc2VuZCB1bmJpbmQgZXZlbnQgdG8gbGNiICovCi0gIGVsc2UgewotICAgIHRBVkNUX0xDQl9FVlQgYXZjdF9sY2JfZXZ0OwotICAgIGF2Y3RfbGNiX2V2dC5wX2NjYiA9IHBfY2NiOwotICAgIGF2Y3RfbGNiX2V2ZW50KHBfY2NiLT5wX2xjYiwgQVZDVF9MQ0JfVUxfVU5CSU5EX0VWVCwgJmF2Y3RfbGNiX2V2dCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfQ3JlYXRlQnJvd3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGUgYW4gQVZDVFAgQnJvd3NlIGNoYW5uZWwuICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLCBpbml0aWF0b3IgYW5kIGFjY2VwdG9yLCBhcyBkZXRlcm1pbmVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSByb2xlIHBhcmFtZXRlci4gIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgY3JlYXRlIGFuIGluaXRpYXRvciBjb25uZWN0aW9uLCB0aGUgQnJvd3NlIGNoYW5uZWwgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIHBlZXIgZGV2aWNlIGlzIGluaXRpYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLSAqICAgICAgICAgICAgICAgICAgSWYgYW4gYWNjZXB0b3IgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCB0aGUgY29ubmVjdGlvbiB3YWl0cwotICogICAgICAgICAgICAgICAgICBwYXNzaXZlbHkgZm9yIGFuIGluY29taW5nIEFWQ1RQIGNvbm5lY3Rpb24gZnJvbSBhIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWQ1RfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWQ1RfQ3JlYXRlQnJvd3NlKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IHJvbGUpIHsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZDVF9TVUNDRVNTOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotICB0QVZDVF9CQ0IqIHBfYmNiOwotICBpbnQgaW5kZXg7Ci0KLSAgQVZDVF9UUkFDRV9BUEkoIkFWQ1RfQ3JlYXRlQnJvd3NlOiAlZCIsIHJvbGUpOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gY2NiICovCi0gIHBfY2NiID0gYXZjdF9jY2JfYnlfaWR4KGhhbmRsZSk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIEFWQ1RfQkFEX0hBTkRMRTsKLSAgfSBlbHNlIHsKLSAgICAvKiBtYXJrIHRoaXMgQ0NCIGFzIHN1cHBvcnRpbmcgYnJvd3NpbmcgY2hhbm5lbCAqLwotICAgIGlmICgocF9jY2ItPmFsbG9jYXRlZCAmIEFWQ1RfQUxPQ19CQ0IpID09IDApIHsKLSAgICAgIHBfY2NiLT5hbGxvY2F0ZWQgfD0gQVZDVF9BTE9DX0JDQjsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiBpbml0aWF0b3IgY29ubmVjdGlvbiAqLwotICBpZiAocm9sZSA9PSBBVkNUX0lOVCkgewotICAgIC8qIHRoZSBsaW5rIGNvbnRyb2wgYmxvY2sgbXVzdCBleGlzdCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgSU5ULgotICAgICAqLwotICAgIGlmICgocF9jY2ItPnBfbGNiID09IE5VTEwpIHx8IChwX2NjYi0+cF9sY2ItPmFsbG9jYXRlZCA9PSAwKSkgewotICAgICAgcmVzdWx0ID0gQVZDVF9OT1RfT1BFTjsKLSAgICB9IGVsc2UgewotICAgICAgLyogZmluZCBsaW5rOyBpZiBub25lIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwotICAgICAgaW5kZXggPSBwX2NjYi0+cF9sY2ItPmFsbG9jYXRlZDsKLSAgICAgIGlmIChpbmRleCA+IEFWQ1RfTlVNX0xJTktTKSB7Ci0gICAgICAgIHJlc3VsdCA9IEFWQ1RfQkFEX0hBTkRMRTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfYmNiID0gJmF2Y3RfY2IuYmNiW2luZGV4IC0gMV07Ci0gICAgICAgIHBfYmNiLT5hbGxvY2F0ZWQgPSBpbmRleDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEFWQ1RfU1VDQ0VTUykgewotICAgICAgLyogYmluZCBiY2IgdG8gY2NiICovCi0gICAgICBwX2NjYi0+cF9iY2IgPSBwX2JjYjsKLSAgICAgIHBfYmNiLT5wZWVyX2FkZHIgPSBwX2NjYi0+cF9sY2ItPnBlZXJfYWRkcjsKLSAgICAgIEFWQ1RfVFJBQ0VfREVCVUcoImNoX3N0YXRlOiAlZCIsIHBfYmNiLT5jaF9zdGF0ZSk7Ci0gICAgICB0QVZDVF9MQ0JfRVZUIGF2Y3RfbGNiX2V2dDsKLSAgICAgIGF2Y3RfbGNiX2V2dC5wX2NjYiA9IHBfY2NiOwotICAgICAgYXZjdF9iY2JfZXZlbnQocF9iY2IsIEFWQ1RfTENCX1VMX0JJTkRfRVZULCAmYXZjdF9sY2JfZXZ0KTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9SZW1vdmVCcm93c2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZSBhbiBBVkNUUCBCcm93c2UgY2hhbm5lbC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uICBJZgotICogICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBsYXN0IGNvbm5lY3Rpb24gdG8gYSBwZWVyIHRoZSBMMkNBUCBjaGFubmVsIGZvcgotICogICAgICAgICAgICAgICAgICBBVkNUUCB3aWxsIGJlIGNsb3NlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkNUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkNUX1JlbW92ZUJyb3dzZSh1aW50OF90IGhhbmRsZSkgewotICB1aW50MTZfdCByZXN1bHQgPSBBVkNUX1NVQ0NFU1M7Ci0gIHRBVkNUX0NDQiogcF9jY2I7Ci0KLSAgQVZDVF9UUkFDRV9BUEkoIkFWQ1RfUmVtb3ZlQnJvd3NlIik7Ci0KLSAgLyogbWFwIGhhbmRsZSB0byBjY2IgKi8KLSAgcF9jY2IgPSBhdmN0X2NjYl9ieV9pZHgoaGFuZGxlKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICByZXN1bHQgPSBBVkNUX0JBRF9IQU5ETEU7Ci0gIH0gZWxzZSBpZiAocF9jY2ItPnBfYmNiICE9IE5VTEwpCi0gIC8qIHNlbmQgdW5iaW5kIGV2ZW50IHRvIGJjYiAqLwotICB7Ci0gICAgdEFWQ1RfTENCX0VWVCBhdmN0X2xjYl9ldnQ7Ci0gICAgYXZjdF9sY2JfZXZ0LnBfY2NiID0gcF9jY2I7Ci0gICAgYXZjdF9iY2JfZXZlbnQocF9jY2ItPnBfYmNiLCBBVkNUX0xDQl9VTF9VTkJJTkRfRVZULCAmYXZjdF9sY2JfZXZ0KTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkNUX0dldEJyb3dzZU10dQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IHRoZSBwZWVyX210dSBmb3IgdGhlIEFWQ1RQIEJyb3dzZSBjaGFubmVsIG9mIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIHBlZXIgYnJvd3NpbmcgY2hhbm5lbCBNVFUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWQ1RfR2V0QnJvd3NlTXR1KHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIHVpbnQxNl90IHBlZXJfbXR1ID0gQVZDVF9NSU5fQlJPV1NFX01UVTsKLQotICB0QVZDVF9DQ0IqIHBfY2NiID0gYXZjdF9jY2JfYnlfaWR4KGhhbmRsZSk7Ci0KLSAgaWYgKHBfY2NiICE9IE5VTEwgJiYgcF9jY2ItPnBfYmNiICE9IE5VTEwpIHsKLSAgICBwZWVyX210dSA9IHBfY2NiLT5wX2JjYi0+cGVlcl9tdHU7Ci0gIH0KLQotICByZXR1cm4gcGVlcl9tdHU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkNUX0dldFBlZXJNdHUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgcGVlcl9tdHUgZm9yIHRoZSBBVkNUUCBjaGFubmVsIG9mIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIHBlZXIgTVRVIHNpemUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWQ1RfR2V0UGVlck10dSh1aW50OF90IGhhbmRsZSkgewotICB1aW50MTZfdCBwZWVyX210dSA9IEwyQ0FQX0RFRkFVTFRfTVRVOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gY2NiICovCi0gIHBfY2NiID0gYXZjdF9jY2JfYnlfaWR4KGhhbmRsZSk7Ci0gIGlmIChwX2NjYiAhPSBOVUxMKSB7Ci0gICAgaWYgKHBfY2NiLT5wX2xjYikgewotICAgICAgcGVlcl9tdHUgPSBwX2NjYi0+cF9sY2ItPnBlZXJfbXR1OwotICAgIH0KLSAgfQotCi0gIHJldHVybiBwZWVyX210dTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfTXNnUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIEFWQ1RQIG1lc3NhZ2UgdG8gYSBwZWVyIGRldmljZS4gIEluIGNhbGxpbmcKLSAqICAgICAgICAgICAgICAgICAgQVZDVF9Nc2dSZXEoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBrZWVwIHRyYWNrIG9mIHRoZQotICogICAgICAgICAgICAgICAgICBjb25nZXN0aW9uIHN0YXRlIG9mIEFWQ1RQIGFzIGNvbW11bmljYXRlZCB3aXRoIGV2ZW50cwotICogICAgICAgICAgICAgICAgICBBVkNUX0NPTkdfSU5EX0VWVCBhbmQgQVZDVF9VTkNPTkdfSU5EX0VWVC4gICBJZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FsbHMgQVZDVF9Nc2dSZXEoKSB3aGVuIEFWQ1RQIGlzIGNvbmdlc3RlZAotICogICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSBtYXkgYmUgZGlzY2FyZGVkLiAgVGhlIGFwcGxpY2F0aW9uIG1heSBtYWtlIGl0cwotICogICAgICAgICAgICAgICAgICBmaXJzdCBjYWxsIHRvIEFWQ1RfTXNnUmVxKCkgYWZ0ZXIgaXQgcmVjZWl2ZXMgYW4KLSAqICAgICAgICAgICAgICAgICAgQVZDVF9DT05ORUNUX0NGTV9FVlQgb3IgQVZDVF9DT05ORUNUX0lORF9FVlQgb24gY29udHJvbAotICogICAgICAgICAgICAgICAgICBjaGFubmVsIG9yIEFWQ1RfQlJPV1NFX0NPTk5fQ0ZNX0VWVCBvcgotICogICAgICAgICAgICAgICAgICBBVkNUX0JST1dTRV9DT05OX0lORF9FVlQgb24gYnJvd3NpbmcgY2hhbm5lbC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfbXNnLT5sYXllcl9zcGVjaWZpYyBtdXN0IGJlIHNldCB0bwotICogICAgICAgICAgICAgICAgICBBVkNUX0RBVEFfQ1RSTCBmb3IgY29udHJvbCBjaGFubmVsIHRyYWZmaWM7Ci0gKiAgICAgICAgICAgICAgICAgIEFWQ1RfREFUQV9CUk9XU0UgZm9yIGZvciBicm93c2UgY2hhbm5lbCB0cmFmZmljLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZDVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZDVF9Nc2dSZXEodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgY3IsIEJUX0hEUiogcF9tc2cpIHsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZDVF9TVUNDRVNTOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotICB0QVZDVF9VTF9NU0cgdWxfbXNnOwotCi0gIEFWQ1RfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICAvKiB2ZXJpZnkgcF9tc2cgcGFyYW1ldGVyICovCi0gIGlmIChwX21zZyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIEFWQ1RfTk9fUkVTT1VSQ0VTOwotICB9Ci0gIEFWQ1RfVFJBQ0VfQVBJKCIlcyBsZW46ICVkIGxheWVyX3NwZWNpZmljOiAlZCIsIF9fZnVuY19fLCBwX21zZy0+bGVuLAotICAgICAgICAgICAgICAgICBwX21zZy0+bGF5ZXJfc3BlY2lmaWMpOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gY2NiICovCi0gIHBfY2NiID0gYXZjdF9jY2JfYnlfaWR4KGhhbmRsZSk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gQVZDVF9CQURfSEFORExFOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgfQotICAvKiB2ZXJpZnkgY2hhbm5lbCBpcyBib3VuZCB0byBsaW5rICovCi0gIGVsc2UgaWYgKHBfY2NiLT5wX2xjYiA9PSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gQVZDVF9OT1RfT1BFTjsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IEFWQ1RfU1VDQ0VTUykgewotICAgIHVsX21zZy5wX2J1ZiA9IHBfbXNnOwotICAgIHVsX21zZy5wX2NjYiA9IHBfY2NiOwotICAgIHVsX21zZy5sYWJlbCA9IGxhYmVsOwotICAgIHVsX21zZy5jciA9IGNyOwotCi0gICAgLyogc2VuZCBtc2cgZXZlbnQgdG8gYmNiICovCi0gICAgaWYgKHBfbXNnLT5sYXllcl9zcGVjaWZpYyA9PSBBVkNUX0RBVEFfQlJPV1NFKSB7Ci0gICAgICBpZiAocF9jY2ItPnBfYmNiID09IE5VTEwgJiYgKHBfY2NiLT5hbGxvY2F0ZWQgJiBBVkNUX0FMT0NfQkNCKSA9PSAwKSB7Ci0gICAgICAgIC8qIEJDQiBjaGFubmVsIGlzIG5vdCBvcGVuIGFuZCBub3QgYWxsb2NhdGVkICovCi0gICAgICAgIHJlc3VsdCA9IEFWQ1RfQkFEX0hBTkRMRTsKLSAgICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9jY2ItPnBfYmNiID0gYXZjdF9iY2JfYnlfbGNiKHBfY2NiLT5wX2xjYik7Ci0gICAgICAgIHRBVkNUX0xDQl9FVlQgYXZjdF9sY2JfZXZ0OwotICAgICAgICBhdmN0X2xjYl9ldnQudWxfbXNnID0gdWxfbXNnOwotICAgICAgICBhdmN0X2JjYl9ldmVudChwX2NjYi0+cF9iY2IsIEFWQ1RfTENCX1VMX01TR19FVlQsICZhdmN0X2xjYl9ldnQpOwotICAgICAgfQotICAgIH0KLSAgICAvKiBzZW5kIG1zZyBldmVudCB0byBsY2IgKi8KLSAgICBlbHNlIHsKLSAgICAgIHRBVkNUX0xDQl9FVlQgYXZjdF9sY2JfZXZ0OwotICAgICAgYXZjdF9sY2JfZXZ0LnVsX21zZyA9IHVsX21zZzsKLSAgICAgIGF2Y3RfbGNiX2V2ZW50KHBfY2NiLT5wX2xjYiwgQVZDVF9MQ0JfVUxfTVNHX0VWVCwgJmF2Y3RfbGNiX2V2dCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdmN0L2F2Y3RfYmNiX2FjdC5jYyBiL3N0YWNrL2F2Y3QvYXZjdF9iY2JfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc2NzRkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2Y3QvYXZjdF9iY2JfYWN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBOYW1lOiAgICAgICAgICAgYXZjdF9iY2JfYWN0LmNjCi0gKgotICogIERlc2NyaXB0aW9uOiAgICBUaGlzIG1vZHVsZSBjb250YWlucyBhY3Rpb24gZnVuY3Rpb25zIG9mIHRoZSBicm93c2luZwotICogICAgICAgICAgICAgICAgICBjb250cm9sIHN0YXRlIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZjdF9hcGkuaCIKLSNpbmNsdWRlICJhdmN0X2ludC5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8qIGFjdGlvbiBmdW5jdGlvbiBsaXN0ICovCi1jb25zdCB0QVZDVF9CQ0JfQUNUSU9OIGF2Y3RfYmNiX2FjdGlvbltdID0gewotICAgIGF2Y3RfYmNiX2Nobmxfb3BlbiwgICAvKiBBVkNUX0xDQl9DSE5MX09QRU4gKi8KLSAgICBhdmN0X2JjYl9jaG5sX2Rpc2MsICAgLyogQVZDVF9MQ0JfQ0hOTF9ESVNDICovCi0gICAgYXZjdF9iY2Jfc2VuZF9tc2csICAgIC8qIEFWQ1RfTENCX1NFTkRfTVNHICovCi0gICAgYXZjdF9iY2Jfb3Blbl9pbmQsICAgIC8qIEFWQ1RfTENCX09QRU5fSU5EICovCi0gICAgYXZjdF9iY2Jfb3Blbl9mYWlsLCAgIC8qIEFWQ1RfTENCX09QRU5fRkFJTCAqLwotICAgIGF2Y3RfYmNiX2Nsb3NlX2luZCwgICAvKiBBVkNUX0xDQl9DTE9TRV9JTkQgKi8KLSAgICBhdmN0X2JjYl9jbG9zZV9jZm0sICAgLyogQVZDVF9MQ0JfQ0xPU0VfQ0ZNICovCi0gICAgYXZjdF9iY2JfbXNnX2luZCwgICAgIC8qIEFWQ1RfTENCX01TR19JTkQgKi8KLSAgICBhdmN0X2JjYl9jb25nX2luZCwgICAgLyogQVZDVF9MQ0JfQ09OR19JTkQgKi8KLSAgICBhdmN0X2JjYl9iaW5kX2Nvbm4sICAgLyogQVZDVF9MQ0JfQklORF9DT05OICovCi0gICAgYXZjdF9iY2JfYmluZF9mYWlsLCAgIC8qIEFWQ1RfTENCX0JJTkRfRkFJTCAqLwotICAgIGF2Y3RfYmNiX3VuYmluZF9kaXNjLCAvKiBBVkNUX0xDQl9VTkJJTkRfRElTQyAqLwotICAgIGF2Y3RfYmNiX2Noa19kaXNjLCAgICAvKiBBVkNUX0xDQl9DSEtfRElTQyAqLwotICAgIGF2Y3RfYmNiX2Rpc2NhcmRfbXNnLCAvKiBBVkNUX0xDQl9ESVNDQVJEX01TRyAqLwotICAgIGF2Y3RfYmNiX2RlYWxsb2MsICAgICAvKiBBVkNUX0xDQl9ERUFMTE9DICovCi0gICAgYXZjdF9iY2JfZnJlZV9tc2dfaW5kIC8qIEFWQ1RfTENCX0ZSRUVfTVNHX0lORCAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX21zZ19hc21ibAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhc3NlbWJsZSBpbmNvbWluZyBtZXNzYWdlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gcmVhc3NlbWJsZWQgbWVzc2FnZTsgIE5VTEwgaWYgbm8gbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBhdmFpbGFibGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF2Y3RfYmNiX21zZ19hc21ibChVTlVTRURfQVRUUiB0QVZDVF9CQ0IqIHBfYmNiLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQ4X3QgcGt0X3R5cGU7Ci0KLSAgaWYgKHBfYnVmLT5sZW4gPT0gMCkgewotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2J1Zik7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3OTk0NDExMyIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgLyogcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyICovCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBwa3RfdHlwZSA9IEFWQ1RfUEtUX1RZUEUocCk7Ci0KLSAgLyogbXVzdCBiZSBzaW5nbGUgcGFja2V0IC0gY2FuIG5vdCBmcmFnbWVudCAqLwotICBpZiAocGt0X3R5cGUgIT0gQVZDVF9QS1RfVFlQRV9TSU5HTEUpIHsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9idWYpOwotICAgIEFWQ1RfVFJBQ0VfV0FSTklORygiUGt0IHR5cGU9JWQgLSBmcmFnbWVudGF0aW9uIG5vdCBhbGxvd2VkLiBkcm9wIGl0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgcGt0X3R5cGUpOwotICB9Ci0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2Nobmxfb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3BlbiBMMkNBUCBjaGFubmVsIHRvIHBlZXIKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX2Nobmxfb3Blbih0QVZDVF9CQ0IqIHBfYmNiLCBVTlVTRURfQVRUUiB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZDVF9SRVNVTFRfRkFJTDsKLSAgdEFWQ1RfTENCKiBwX2xjYiA9IGF2Y3RfbGNiX2J5X2JjYihwX2JjYik7Ci0gIHRMMkNBUF9FUlRNX0lORk8gZXJ0bV9pbmZvOwotCi0gIC8qIFNldCB0aGUgRkNSIG9wdGlvbnM6IEJyb3dzaW5nIGNoYW5uZWwgbWFuZGF0ZXMgRVJUTSAqLwotICBlcnRtX2luZm8ucHJlZmVycmVkX21vZGUgPSBMMkNBUF9GQ1JfRVJUTV9NT0RFOwotCi0gIC8qIGNhbGwgbDJjYXAgY29ubmVjdCByZXEgKi8KLSAgcF9iY2ItPmNoX3N0YXRlID0gQVZDVF9DSF9DT05OOwotICBwX2JjYi0+Y2hfbGNpZCA9Ci0gICAgICBMMkNBX0Nvbm5lY3RSZXEyKEFWQ1RfQlJfUFNNLCBwX2xjYi0+cGVlcl9hZGRyLCBCVEFfU0VDX0FVVEhFTlRJQ0FURSk7Ci0gIGlmIChwX2JjYi0+Y2hfbGNpZCA9PSAwKSB7Ci0gICAgLyogaWYgY29ubmVjdCByZXEgZmFpbGVkLCBzZW5kIG91cnNlbHZlcyBjbG9zZSBldmVudCAqLwotICAgIHRBVkNUX0xDQl9FVlQgYXZjdF9sY2JfZXZ0OwotICAgIGF2Y3RfbGNiX2V2dC5yZXN1bHQgPSByZXN1bHQ7Ci0gICAgYXZjdF9iY2JfZXZlbnQocF9iY2IsIEFWQ1RfTENCX0xMX0NMT1NFX0VWVCwgJmF2Y3RfbGNiX2V2dCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX3VuYmluZF9kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBjYWxsIGNhbGxiYWNrIHdpdGggZGlzY29ubmVjdCBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX3VuYmluZF9kaXNjKFVOVVNFRF9BVFRSIHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICBwX2RhdGEtPnBfY2NiLT5wX2JjYiA9IE5VTEw7Ci0gICgqcF9kYXRhLT5wX2NjYi0+Y2MucF9jdHJsX2NiYWNrKShhdmN0X2NjYl90b19pZHgocF9kYXRhLT5wX2NjYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNUX0JST1dTRV9ESVNDT05OX0NGTV9FVlQsIDAsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9iY2Jfb3Blbl9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhbiBMTF9PUEVOIGV2ZW50LgotICogICAgICAgICAgICAgICAgICBGb3IgdGhlIGFsbG9jYXRlZCBjY2IgYWxyZWFkeSBib3VuZCB0byB0aGUgYmNiLCBzZW5kIGEKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdCBldmVudC4gRm9yIHRoZSB1bmJvdW5kIGNjYiB3aXRoIGEgbmV3IFBJRCwgYmluZCB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIGNjYiB0byB0aGUgYmNiIHdpdGggdGhlIHNhbWUgYmRfYWRkciBhbmQgc2VuZCBhIGNvbm5lY3QKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2JjYl9vcGVuX2luZCh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWQ1RfQ0NCKiBwX2NjYiA9ICZhdmN0X2NiLmNjYlswXTsKLSAgdEFWQ1RfQ0NCKiBwX2NjYl9iaW5kID0gTlVMTDsKLSAgYm9vbCBiaW5kID0gZmFsc2U7Ci0gIHRBVkNUX1VMX01TRyB1bF9tc2c7Ci0KLSAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgQVZDVF9OVU1fQ09OTjsgaWR4KyssIHBfY2NiKyspIHsKLSAgICAvKiBpZiBjY2IgYWxsb2NhdGVkIGFuZCAqLwotICAgIGlmIChwX2NjYi0+YWxsb2NhdGVkKSB7Ci0gICAgICAvKiBpZiBib3VuZCB0byB0aGlzIGJjYiBzZW5kIGNvbm5lY3QgY29uZmlybSBldmVudCAqLwotICAgICAgaWYgKHBfY2NiLT5wX2JjYiA9PSBwX2JjYikgewotICAgICAgICBiaW5kID0gdHJ1ZTsKLSAgICAgICAgcF9jY2JfYmluZCA9IHBfY2NiOwotICAgICAgICBwX2NjYi0+Y2MucF9jdHJsX2NiYWNrKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksIEFWQ1RfQlJPV1NFX0NPTk5fQ0ZNX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmcF9jY2ItPnBfbGNiLT5wZWVyX2FkZHIpOwotICAgICAgfQotICAgICAgLyogaWYgdW5ib3VuZCBhY2NlcHRvciBhbmQgbGNiIGFsbG9jYXRlZCBhbmQgYmRfYWRkciBhcmUgdGhlIHNhbWUgZm9yIGJjYgotICAgICAgICAgYW5kIGxjYiAqLwotICAgICAgZWxzZSBpZiAoKHBfY2NiLT5wX2JjYiA9PSBOVUxMKSAmJiAocF9jY2ItPmNjLnJvbGUgPT0gQVZDVF9BQ1ApICYmCi0gICAgICAgICAgICAgICAocF9jY2ItPnBfbGNiICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICBwX2JjYi0+cGVlcl9hZGRyID09IHBfY2NiLT5wX2xjYi0+cGVlcl9hZGRyKSB7Ci0gICAgICAgIC8qIGJpbmQgYmNiIHRvIGNjYiBhbmQgc2VuZCBjb25uZWN0IGluZCBldmVudCAqLwotICAgICAgICBiaW5kID0gdHJ1ZTsKLSAgICAgICAgcF9jY2JfYmluZCA9IHBfY2NiOwotICAgICAgICBwX2NjYi0+cF9iY2IgPSBwX2JjYjsKLSAgICAgICAgcF9jY2ItPmNjLnBfY3RybF9jYmFjayhhdmN0X2NjYl90b19pZHgocF9jY2IpLCBBVkNUX0JST1dTRV9DT05OX0lORF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnBfY2NiLT5wX2xjYi0+cGVlcl9hZGRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBpZiBubyBjY2JzIGJvdW5kIHRvIHRoaXMgbGNiLCBkaXNjb25uZWN0ICovCi0gIGlmICghYmluZCkgewotICAgIGF2Y3RfYmNiX2V2ZW50KHBfYmNiLCBBVkNUX0xDQl9JTlRfQ0xPU0VfRVZULCBwX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghcF9iY2ItPnBfdHhfbXNnIHx8ICFwX2NjYl9iaW5kKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWxfbXNnLnBfYnVmID0gcF9iY2ItPnBfdHhfbXNnOwotICB1bF9tc2cucF9jY2IgPSBwX2NjYl9iaW5kOwotICB1bF9tc2cubGFiZWwgPSAodWludDhfdCkocF9iY2ItPnBfdHhfbXNnLT5sYXllcl9zcGVjaWZpYyAmIDB4RkYpOwotICB1bF9tc2cuY3IgPSAodWludDhfdCkoKHBfYmNiLT5wX3R4X21zZy0+bGF5ZXJfc3BlY2lmaWMgJiAweEZGMDApID4+IDgpOwotICBwX2JjYi0+cF90eF9tc2ctPmxheWVyX3NwZWNpZmljID0gQVZDVF9EQVRBX0JST1dTRTsKLSAgcF9iY2ItPnBfdHhfbXNnID0gTlVMTDsKLQotICAvKiBzZW5kIG1zZyBldmVudCB0byBiY2IgKi8KLSAgdEFWQ1RfTENCX0VWVCBhdmN0X2xjYl9ldnQ7Ci0gIGF2Y3RfbGNiX2V2dC51bF9tc2cgPSB1bF9tc2c7Ci0gIGF2Y3RfYmNiX2V2ZW50KHBfYmNiLCBBVkNUX0xDQl9VTF9NU0dfRVZULCAmYXZjdF9sY2JfZXZ0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX29wZW5fZmFpbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTDJDQVAgY2hhbm5lbCBvcGVuIGF0dGVtcHQgZmFpbGVkLiAgTWFyayB0aGUgY2NicwotICogICAgICAgICAgICAgICAgICBhcyBOVUxMIGJjYi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX29wZW5fZmFpbCh0QVZDVF9CQ0IqIHBfYmNiLCBVTlVTRURfQVRUUiB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWQ1RfQ0NCKiBwX2NjYiA9ICZhdmN0X2NiLmNjYlswXTsKLQotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBBVkNUX05VTV9DT05OOyBpZHgrKywgcF9jY2IrKykgewotICAgIGlmIChwX2NjYi0+YWxsb2NhdGVkICYmIChwX2NjYi0+cF9iY2IgPT0gcF9iY2IpKSB7Ci0gICAgICBwX2NjYi0+cF9iY2IgPSBOVUxMOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9iY2JfY2xvc2VfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMMkNBUCBjaGFubmVsIGNsb3NlZCBieSBwZWVyLiAgRGVhbGxvY2F0ZSBhbnkgaW5pdGlhdG9yCi0gKiAgICAgICAgICAgICAgICAgIGNjYnMgb24gdGhpcyBsY2IgYW5kIHNlbmQgZGlzY29ubmVjdCBpbmQgZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2JjYl9jbG9zZV9pbmQodEFWQ1RfQkNCKiBwX2JjYiwgVU5VU0VEX0FUVFIgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIHRBVkNUX0xDQiogcF9sY2IgPSBhdmN0X2xjYl9ieV9iY2IocF9iY2IpOwotCi0gIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IEFWQ1RfTlVNX0NPTk47IGlkeCsrLCBwX2NjYisrKSB7Ci0gICAgaWYgKHBfY2NiLT5hbGxvY2F0ZWQgJiYgKHBfY2NiLT5wX2JjYiA9PSBwX2JjYikpIHsKLSAgICAgIGlmIChwX2NjYi0+Y2Mucm9sZSA9PSBBVkNUX0lOVCkgewotICAgICAgICAoKnBfY2NiLT5jYy5wX2N0cmxfY2JhY2spKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDVF9CUk9XU0VfRElTQ09OTl9DRk1fRVZULCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICgqcF9jY2ItPmNjLnBfY3RybF9jYmFjaykoYXZjdF9jY2JfdG9faWR4KHBfY2NiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNUX0JST1dTRV9ESVNDT05OX0lORF9FVlQsIDAsIE5VTEwpOwotICAgICAgfQotICAgICAgcF9jY2ItPnBfYmNiID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2Nsb3NlX2NmbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTDJDQVAgY2hhbm5lbCBjbG9zZWQgYnkgdXMuICBEZWFsbG9jYXRlIGFueSBpbml0aWF0b3IKLSAqICAgICAgICAgICAgICAgICAgY2NicyBvbiB0aGlzIGxjYiBhbmQgc2VuZCBkaXNjb25uZWN0IGluZCBvciBjZm0gZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2JjYl9jbG9zZV9jZm0odEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIHVpbnQ4X3QgZXZlbnQgPSAwOwotICAvKiBXaGV0aGVyIEJDQiBpbml0aWF0ZWQgY2hhbm5lbCBjbG9zZSAqLwotICBib29sIGNoX2Nsb3NlID0gcF9iY2ItPmNoX2Nsb3NlOwotICB0QVZDVF9DVFJMX0NCQUNLKiBwX2NiYWNrOwotCi0gIHBfYmNiLT5jaF9jbG9zZSA9IGZhbHNlOwotICBwX2JjYi0+YWxsb2NhdGVkID0gMDsKLSAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgQVZDVF9OVU1fQ09OTjsgaWR4KyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmFsbG9jYXRlZCAmJiAocF9jY2ItPnBfYmNiID09IHBfYmNiKSkgewotICAgICAgLyogaWYgdGhpcyBjY2IgaW5pdGlhdGVkIGNsb3NlIHNlbmQgZGlzY29ubmVjdCBjZm0gb3RoZXJ3aXNlIGluZCAqLwotICAgICAgaWYgKGNoX2Nsb3NlKSB7Ci0gICAgICAgIGV2ZW50ID0gQVZDVF9CUk9XU0VfRElTQ09OTl9DRk1fRVZUOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXZlbnQgPSBBVkNUX0JST1dTRV9ESVNDT05OX0lORF9FVlQ7Ci0gICAgICB9Ci0KLSAgICAgIHBfY2JhY2sgPSBwX2NjYi0+Y2MucF9jdHJsX2NiYWNrOwotICAgICAgcF9jY2ItPnBfYmNiID0gTlVMTDsKLSAgICAgIGlmIChwX2NjYi0+cF9sY2IgPT0gTlVMTCkgYXZjdF9jY2JfZGVhbGxvYyhwX2NjYiwgQVZDVF9OT19FVlQsIDAsIE5VTEwpOwotICAgICAgKCpwX2NiYWNrKShhdmN0X2NjYl90b19pZHgocF9jY2IpLCBldmVudCwgcF9kYXRhLT5yZXN1bHQsCi0gICAgICAgICAgICAgICAgICZwX2JjYi0+cGVlcl9hZGRyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2JpbmRfY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQmluZCBjY2IgdG8gbGNiIGFuZCBzZW5kIGNvbm5lY3QgY2ZtIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9iY2JfYmluZF9jb25uKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB0QVZDVF9MQ0IqIHBfbGNiID0gYXZjdF9sY2JfYnlfYmNiKHBfYmNiKTsKLSAgcF9kYXRhLT5wX2NjYi0+cF9iY2IgPSBwX2JjYjsKLSAgKCpwX2RhdGEtPnBfY2NiLT5jYy5wX2N0cmxfY2JhY2spKGF2Y3RfY2NiX3RvX2lkeChwX2RhdGEtPnBfY2NiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ1RfQlJPV1NFX0NPTk5fQ0ZNX0VWVCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2Noa19kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBIGNjYiB3YW50cyB0byBjbG9zZTsgaWYgaXQgaXMgdGhlIGxhc3QgY2NiIG9uIHRoaXMgbGNiLAotICogICAgICAgICAgICAgICAgICBjbG9zZSBjaGFubmVsLiAgT3RoZXJ3aXNlIGp1c3QgZGVhbGxvY2F0ZSBhbmQgY2FsbAotICogICAgICAgICAgICAgICAgICBjYWxsYmFjay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX2Noa19kaXNjKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICBwX2JjYi0+Y2hfY2xvc2UgPSBhdmN0X2JjYl9nZXRfbGFzdF9jY2JfaW5kZXgocF9iY2IsIHBfZGF0YS0+cF9jY2IpOwotICBpZiAocF9iY2ItPmNoX2Nsb3NlKSB7Ci0gICAgYXZjdF9iY2JfZXZlbnQocF9iY2IsIEFWQ1RfTENCX0lOVF9DTE9TRV9FVlQsIHBfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXZjdF9iY2JfdW5iaW5kX2Rpc2MocF9iY2IsIHBfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2JjYl9jaG5sX2Rpc2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2Nvbm5lY3QgTDJDQVAgY2hhbm5lbC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX2NobmxfZGlzYyh0QVZDVF9CQ0IqIHBfYmNiLCBVTlVTRURfQVRUUiB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgYXZjdF9sMmNfYnJfZGlzY29ubmVjdChwX2JjYi0+Y2hfbGNpZCwgMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2JjYl9iaW5kX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlYWxsb2NhdGUgY2NiIGFuZCBjYWxsIGNhbGxiYWNrIHdpdGggY29ubmVjdCBldmVudAotICogICAgICAgICAgICAgICAgICB3aXRoIGZhaWx1cmUgcmVzdWx0LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9iY2JfYmluZF9mYWlsKFVOVVNFRF9BVFRSIHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICBwX2RhdGEtPnBfY2NiLT5wX2JjYiA9IE5VTEw7Ci0gICgqcF9kYXRhLT5wX2NjYi0+Y2MucF9jdHJsX2NiYWNrKShhdmN0X2NjYl90b19pZHgocF9kYXRhLT5wX2NjYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNUX0JST1dTRV9DT05OX0NGTV9FVlQsIEFWQ1RfUkVTVUxUX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2NvbmdfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgY29uZ2VzdGlvbiBpbmRpY2F0aW9uIGZyb20gTDJDQVAuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2JjYl9jb25nX2luZCh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWQ1RfQ0NCKiBwX2NjYiA9ICZhdmN0X2NiLmNjYlswXTsKLSAgdWludDhfdCBldmVudDsKLSAgdEFWQ1RfTENCKiBwX2xjYiA9IGF2Y3RfbGNiX2J5X2JjYihwX2JjYik7Ci0KLSAgLyogc2V0IGV2ZW50ICovCi0gIGV2ZW50ID0KLSAgICAgIChwX2RhdGEtPmNvbmcpID8gQVZDVF9CUk9XU0VfQ09OR19JTkRfRVZUIDogQVZDVF9CUk9XU0VfVU5DT05HX0lORF9FVlQ7Ci0KLSAgLyogc2VuZCBldmVudCB0byBhbGwgY2NicyBvbiB0aGlzIGxjYiAqLwotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBBVkNUX05VTV9DT05OOyBpZHgrKywgcF9jY2IrKykgewotICAgIGlmIChwX2NjYi0+YWxsb2NhdGVkICYmIChwX2NjYi0+cF9iY2IgPT0gcF9iY2IpKSB7Ci0gICAgICAoKnBfY2NiLT5jYy5wX2N0cmxfY2JhY2spKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksIGV2ZW50LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9sY2ItPnBlZXJfYWRkcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2JjYl9kaXNjYXJkX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzY2FyZCBhIG1lc3NhZ2Ugc2VudCBpbiBmcm9tIHRoZSBBUEkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2JjYl9kaXNjYXJkX21zZyh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfYmNiLT5wX3R4X21zZyk7Ci0KLSAgLyogaWYgY29udHJvbCBjaGFubmVsIGlzIHVwLCBzYXZlIHRoZSBtZXNzYWdlIGFuZCBvcGVuIHRoZSBicm93c2luZyBjaGFubmVsICovCi0gIGlmIChwX2RhdGEtPnVsX21zZy5wX2NjYi0+cF9sY2IgPT0gTlVMTCkgewotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnVsX21zZy5wX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfYmNiLT5wX3R4X21zZyA9IHBfZGF0YS0+dWxfbXNnLnBfYnVmOwotCi0gIGlmIChwX2JjYi0+cF90eF9tc2cpIHsKLSAgICBwX2JjYi0+cF90eF9tc2ctPmxheWVyX3NwZWNpZmljID0KLSAgICAgICAgKHBfZGF0YS0+dWxfbXNnLmNyIDw8IDgpICsgcF9kYXRhLT51bF9tc2cubGFiZWw7Ci0KLSAgICAvKiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQsIG9wZW5pbmcgb3IgY2xvc2luZyAtIG9wZW4gaXQgYWdhaW4gKi8KLSAgICBBVkNUX1RSQUNFX0RFQlVHKCJjaF9zdGF0ZTogJWQsIGFsbG9jYXRlZDolZC0+JWQiLCBwX2JjYi0+Y2hfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBwX2JjYi0+YWxsb2NhdGVkLCBwX2RhdGEtPnVsX21zZy5wX2NjYi0+cF9sY2ItPmFsbG9jYXRlZCk7Ci0gICAgcF9iY2ItPmFsbG9jYXRlZCA9IHBfZGF0YS0+dWxfbXNnLnBfY2NiLT5wX2xjYi0+YWxsb2NhdGVkOwotICAgIGF2Y3RfYmNiX2V2ZW50KHBfYmNiLCBBVkNUX0xDQl9VTF9CSU5EX0VWVCwKLSAgICAgICAgICAgICAgICAgICAodEFWQ1RfTENCX0VWVCopcF9kYXRhLT51bF9tc2cucF9jY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2JjYl9zZW5kX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gQVZDVFAgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX3NlbmRfbXNnKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB1aW50MTZfdCBjdXJyX21zZ19sZW47Ci0gIHVpbnQ4X3QgcGt0X3R5cGUgPSBBVkNUX1BLVF9UWVBFX1NJTkdMRTsKLSAgdWludDhfdCBoZHJfbGVuOwotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIC8qIHN0b3JlIG1zZyBsZW4gKi8KLSAgY3Vycl9tc2dfbGVuID0gcF9kYXRhLT51bF9tc2cucF9idWYtPmxlbjsKLQotICAvKiBpbml0aWFsaXplIHBhY2tldCB0eXBlIGFuZCBvdGhlciBzdHVmZiAqLwotICBpZiAoY3Vycl9tc2dfbGVuID4gKHBfYmNiLT5wZWVyX210dSAtIEFWQ1RfSERSX0xFTl9TSU5HTEUpKSB7Ci0gICAgQVZDVF9UUkFDRV9FUlJPUigiJXMgbXNnIGxlbiAoJWQpIGV4Y2VlZHMgcGVlciBtdHUoJWQtJWQpISEiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJfbXNnX2xlbiwgcF9iY2ItPnBlZXJfbXR1LCBBVkNUX0hEUl9MRU5fU0lOR0xFKTsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT51bF9tc2cucF9idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHNldCBoZWFkZXIgbGVuICovCi0gIGhkcl9sZW4gPSBhdmN0X2xjYl9wa3RfdHlwZV9sZW5bcGt0X3R5cGVdOwotICBwX2J1ZiA9IHBfZGF0YS0+dWxfbXNnLnBfYnVmOwotCi0gIC8qIHNldCB1cCB0byBidWlsZCBoZWFkZXIgKi8KLSAgcF9idWYtPmxlbiArPSBoZHJfbGVuOwotICBwX2J1Zi0+b2Zmc2V0IC09IGhkcl9sZW47Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIGJ1aWxkIGhlYWRlciAqLwotICBBVkNUX0JVSUxEX0hEUihwLCBwX2RhdGEtPnVsX21zZy5sYWJlbCwgcGt0X3R5cGUsIHBfZGF0YS0+dWxfbXNnLmNyKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwX2RhdGEtPnVsX21zZy5wX2NjYi0+Y2MucGlkKTsKLQotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBBVkNUX0RBVEFfQlJPV1NFOwotCi0gIC8qIHNlbmQgbWVzc2FnZSB0byBMMkNBUCAqLwotICBMMkNBX0RhdGFXcml0ZShwX2JjYi0+Y2hfbGNpZCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9iY2JfZnJlZV9tc2dfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjYXJkIGFuIGluY29taW5nIEFWQ1RQIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2JjYl9mcmVlX21zZ19pbmQoVU5VU0VEX0FUVFIgdEFWQ1RfQkNCKiBwX2JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICBpZiAocF9kYXRhKSBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5wX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2JjYl9tc2dfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYW4gaW5jb21pbmcgQVZDVFAgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX21zZ19pbmQodEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQ4X3QgbGFiZWwsIHR5cGUsIGNyX2lwaWQ7Ci0gIHVpbnQxNl90IHBpZDsKLSAgdEFWQ1RfQ0NCKiBwX2NjYjsKLSAgdEFWQ1RfTENCKiBwX2xjYiA9IGF2Y3RfbGNiX2J5X2JjYihwX2JjYik7Ci0KLSAgaWYgKChwX2RhdGEgPT0gTlVMTCkgfHwgKHBfZGF0YS0+cF9idWYgPT0gTlVMTCkpIHsKLSAgICBBVkNUX1RSQUNFX1dBUk5JTkcoIiVzIHBfZGF0YSBpcyBOVUxMLCByZXR1cm5pbmchIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHRoaXMgcF9idWYgaXMgdG8gYmUgcmVwb3J0ZWQgdGhyb3VnaCBwX21zZ19jYmFjay4gVGhlIGxheWVyX3NwZWNpZmljCi0gICAqIG5lZWRzIHRvIGJlIHNldCBwcm9wZXJseSB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHJlY2VpdmVkIHRocm91Z2gKLSAgICogYnJvd3NpbmcgY2hhbm5lbCAqLwotICBwX2RhdGEtPnBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IEFWQ1RfREFUQV9CUk9XU0U7Ci0KLSAgLyogcmVhc3NlbWJsZSBtZXNzYWdlOyBpZiBubyBtZXNzYWdlIGF2YWlsYWJsZSAod2UgcmVjZWl2ZWQgYSBmcmFnbWVudCkgcmV0dXJuCi0gICAqLwotICBwX2RhdGEtPnBfYnVmID0gYXZjdF9iY2JfbXNnX2FzbWJsKHBfYmNiLCBwX2RhdGEtPnBfYnVmKTsKLSAgaWYgKHBfZGF0YS0+cF9idWYgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX2RhdGEtPnBfYnVmLT5sZW4gPCBBVkNUX0hEUl9MRU5fU0lOR0xFKSB7Ci0gICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJJbnZhbGlkIEFWQ1RQIHBhY2tldCBsZW5ndGggJWQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnBfYnVmLT5sZW4sIEFWQ1RfSERSX0xFTl9TSU5HTEUpOwotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnBfYnVmKTsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc5OTQ0MTEzIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9kYXRhLT5wX2J1ZiArIDEpICsgcF9kYXRhLT5wX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIHBhcnNlIGhlYWRlciBieXRlICovCi0gIEFWQ1RfUEFSU0VfSERSKHAsIGxhYmVsLCB0eXBlLCBjcl9pcGlkKTsKLQotICAvKiBjaGVjayBmb3IgaW52YWxpZCBjcl9pcGlkICovCi0gIGlmIChjcl9pcGlkID09IEFWQ1RfQ1JfSVBJRF9JTlZBTElEKSB7Ci0gICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJJbnZhbGlkIGNyX2lwaWQiLCBjcl9pcGlkKTsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5wX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogcGFyc2UgYW5kIGxvb2t1cCBQSUQgKi8KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihwaWQsIHApOwotICBwX2NjYiA9IGF2Y3RfbGNiX2hhc19waWQocF9sY2IsIHBpZCk7Ci0gIGlmIChwX2NjYikgewotICAgIC8qIFBJRCBmb3VuZDsgc2VuZCBtc2cgdXAsIGFkanVzdCBidCBoZHIgYW5kIGNhbGwgbXNnIGNhbGxiYWNrICovCi0gICAgcF9kYXRhLT5wX2J1Zi0+b2Zmc2V0ICs9IEFWQ1RfSERSX0xFTl9TSU5HTEU7Ci0gICAgcF9kYXRhLT5wX2J1Zi0+bGVuIC09IEFWQ1RfSERSX0xFTl9TSU5HTEU7Ci0gICAgKCpwX2NjYi0+Y2MucF9tc2dfY2JhY2spKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksIGxhYmVsLCBjcl9pcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBQSUQgbm90IGZvdW5kOyBkcm9wIG1lc3NhZ2UgKi8KLSAgQVZDVF9UUkFDRV9XQVJOSU5HKCJObyBjY2IgZm9yIFBJRD0leCIsIHBpZCk7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnBfYnVmKTsKLQotICAvKiBpZiBjb21tYW5kIHNlbmQgcmVqZWN0ICovCi0gIGlmIChjcl9pcGlkID09IEFWQ1RfQ01EKSB7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQVZSQ19DTURfQlVGX1NJWkUpOwotICAgIHBfYnVmLT5sZW4gPSBBVkNUX0hEUl9MRU5fU0lOR0xFOwotICAgIHBfYnVmLT5vZmZzZXQgPSBBVkNUX01TR19PRkZTRVQgLSBBVkNUX0hEUl9MRU5fU0lOR0xFOwotICAgIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICAgIEFWQ1RfQlVJTERfSERSKHAsIGxhYmVsLCBBVkNUX1BLVF9UWVBFX1NJTkdMRSwgQVZDVF9SRUopOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcGlkKTsKLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBBVkNUX0RBVEFfQlJPV1NFOwotICAgIEwyQ0FfRGF0YVdyaXRlKHBfYmNiLT5jaF9sY2lkLCBwX2J1Zik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlYWxsb2NhdGUgYSBicm93c2UgY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX2RlYWxsb2ModEFWQ1RfQkNCKiBwX2JjYiwgVU5VU0VEX0FUVFIgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0KLSAgQVZDVF9UUkFDRV9ERUJVRygiJXMgJWQiLCBfX2Z1bmNfXywgcF9iY2ItPmFsbG9jYXRlZCk7Ci0KLSAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgQVZDVF9OVU1fQ09OTjsgaWR4KyssIHBfY2NiKyspIHsKLSAgICAvKiBpZiBjY2IgYWxsb2NhdGVkIGFuZCAqLwotICAgIGlmICgocF9jY2ItPmFsbG9jYXRlZCkgJiYgKHBfY2NiLT5wX2JjYiA9PSBwX2JjYikpIHsKLSAgICAgIHBfY2NiLT5wX2JjYiA9IE5VTEw7Ci0gICAgICBBVkNUX1RSQUNFX0RFQlVHKCIlcyB1c2VkIGJ5IGNjYjogJWQiLCBfX2Z1bmNfXywgaWR4KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8qIHRoZSBicm93c2luZyBjaGFubmVsIGlzIGRvd24uIENoZWNrIGlmIHdlIGhhdmUgcGVuZGluZyBtZXNzYWdlcyAqLwotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9iY2ItPnBfdHhfbXNnKTsKLSAgbWVtc2V0KHBfYmNiLCAwLCBzaXplb2YodEFWQ1RfQkNCKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2Nsb3NlX2JjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIExDQiBkaXNjb25uZWN0cy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfY2xvc2VfYmNiKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB0QVZDVF9CQ0IqIHBfYmNiID0gYXZjdF9iY2JfYnlfbGNiKHBfbGNiKTsKLSAgaWYgKHBfYmNiLT5hbGxvY2F0ZWQpIHsKLSAgICBhdmN0X2JjYl9ldmVudChwX2JjYiwgQVZDVF9MQ0JfVUxfVU5CSU5EX0VWVCwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfYnlfYmNiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGxvb2t1cCBmdW5jdGlvbiBmaW5kcyB0aGUgbGNiIGZvciBhIGJjYi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGxjYi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEFWQ1RfTENCKiBhdmN0X2xjYl9ieV9iY2IodEFWQ1RfQkNCKiBwX2JjYikgewotICByZXR1cm4gJmF2Y3RfY2IubGNiW3BfYmNiLT5hbGxvY2F0ZWQgLSAxXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2J5X2xjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBsb29rdXAgZnVuY3Rpb24gZmluZHMgdGhlIGJjYiBmb3IgYSBsY2IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBsY2IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVkNUX0JDQiogYXZjdF9iY2JfYnlfbGNiKHRBVkNUX0xDQiogcF9sY2IpIHsKLSAgcmV0dXJuICZhdmN0X2NiLmJjYltwX2xjYi0+YWxsb2NhdGVkIC0gMV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2JjYl9nZXRfbGFzdF9jY2JfaW5kZXgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlZSBpZiBnaXZlbiBjY2IgaXMgb25seSBvbmUgb24gdGhlIGJjYi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICAwLCBpZiBjY2IgaXMgbGFzdCwgIChjY2IgaW5kZXggKyAxKSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYXZjdF9iY2JfZ2V0X2xhc3RfY2NiX2luZGV4KHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0NDQiogcF9jY2JfbGFzdCkgewotICB0QVZDVF9DQ0IqIHBfY2NiID0gJmF2Y3RfY2IuY2NiWzBdOwotICB1aW50OF90IGlkeCA9IDA7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVkNUX05VTV9DT05OOyBpKyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmFsbG9jYXRlZCAmJiAocF9jY2ItPnBfYmNiID09IHBfYmNiKSkgewotICAgICAgaWYgKHBfY2NiICE9IHBfY2NiX2xhc3QpIHJldHVybiAwOwotICAgICAgaWR4ID0gKHVpbnQ4X3QpKGkgKyAxKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2J5X2xjaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgdGhlIEJDQiBhc3NvY2lhdGVkIHdpdGggdGhlIEwyQ0FQIExDSUQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBsY2IsIG9yIE5VTEwgaWYgbm9uZSBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEFWQ1RfQkNCKiBhdmN0X2JjYl9ieV9sY2lkKHVpbnQxNl90IGxjaWQpIHsKLSAgdEFWQ1RfQkNCKiBwX2JjYiA9ICZhdmN0X2NiLmJjYlswXTsKLSAgaW50IGlkeDsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IEFWQ1RfTlVNX0xJTktTOyBpZHgrKywgcF9iY2IrKykgewotICAgIGlmIChwX2JjYi0+YWxsb2NhdGVkICYmIChwX2JjYi0+Y2hfbGNpZCA9PSBsY2lkKSkgewotICAgICAgcmV0dXJuIHBfYmNiOwotICAgIH0KLSAgfQotCi0gIC8qIG91dCBvZiBsY2JzICovCi0gIEFWQ1RfVFJBQ0VfV0FSTklORygiTm8gYmNiIGZvciBsY2lkICV4IiwgbGNpZCk7Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZjdC9hdmN0X2NjYi5jYyBiL3N0YWNrL2F2Y3QvYXZjdF9jY2IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ODcxY2IuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZjdC9hdmN0X2NjYi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB3aGljaCBvcGVyYXRlIG9uIHRoZSBBVkNUUCBjb25uZWN0aW9uCi0gKiAgY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdmN0X2FwaS5oIgotI2luY2x1ZGUgImF2Y3RfaW50LmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfY2NiX2FsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBbGxvY2F0ZSBhIGNvbm5lY3Rpb24gY29udHJvbCBibG9jazsgY29weSBwYXJhbWV0ZXJzIHRvIGNjYi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjY2IsIG9yIE5VTEwgaWYgbm9uZSBjb3VsZCBiZSBhbGxvY2F0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVkNUX0NDQiogYXZjdF9jY2JfYWxsb2ModEFWQ1RfQ0MqIHBfY2MpIHsKLSAgdEFWQ1RfQ0NCKiBwX2NjYiA9ICZhdmN0X2NiLmNjYlswXTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEFWQ1RfTlVNX0NPTk47IGkrKywgcF9jY2IrKykgewotICAgIGlmICghcF9jY2ItPmFsbG9jYXRlZCkgewotICAgICAgcF9jY2ItPmFsbG9jYXRlZCA9IEFWQ1RfQUxPQ19MQ0I7Ci0gICAgICBtZW1jcHkoJnBfY2NiLT5jYywgcF9jYywgc2l6ZW9mKHRBVkNUX0NDKSk7Ci0gICAgICBBVkNUX1RSQUNFX0RFQlVHKCJhdmN0X2NjYl9hbGxvYyAlZCIsIGkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGkgPT0gQVZDVF9OVU1fQ09OTikgewotICAgIC8qIG91dCBvZiBjY2JzICovCi0gICAgcF9jY2IgPSBOVUxMOwotICAgIEFWQ1RfVFJBQ0VfV0FSTklORygiT3V0IG9mIGNjYnMiKTsKLSAgfQotICByZXR1cm4gcF9jY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2NjYl9kZWFsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZWFsbG9jYXRlIGEgY29ubmVjdGlvbiBjb250cm9sIGJsb2NrIGFuZCBjYWxsIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9jY2JfZGVhbGxvYyh0QVZDVF9DQ0IqIHBfY2NiLCB1aW50OF90IGV2ZW50LCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICB0QVZDVF9DVFJMX0NCQUNLKiBwX2NiYWNrID0gcF9jY2ItPmNjLnBfY3RybF9jYmFjazsKLQotICBBVkNUX1RSQUNFX0RFQlVHKCJhdmN0X2NjYl9kZWFsbG9jICVkIiwgYXZjdF9jY2JfdG9faWR4KHBfY2NiKSk7Ci0KLSAgaWYgKHBfY2NiLT5wX2JjYiA9PSBOVUxMKSB7Ci0gICAgbWVtc2V0KHBfY2NiLCAwLCBzaXplb2YodEFWQ1RfQ0NCKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogY29udHJvbCBjaGFubmVsIGlzIGRvd24sIGJ1dCB0aGUgYnJvd3NpbmcgY2hhbm5lbCBpcyBzdGlsbCBjb25uZWN0ZWQgMAotICAgICAqIGRpc2Nvbm5lY3QgaXQgbm93ICovCi0gICAgYXZjdF9iY2JfZXZlbnQocF9jY2ItPnBfYmNiLCBBVkNUX0xDQl9VTF9VTkJJTkRfRVZULAotICAgICAgICAgICAgICAgICAgICh0QVZDVF9MQ0JfRVZUKikmcF9jY2IpOwotICAgIHBfY2NiLT5wX2xjYiA9IE5VTEw7Ci0gIH0KLQotICBpZiAoZXZlbnQgIT0gQVZDVF9OT19FVlQpIHsKLSAgICAoKnBfY2JhY2spKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksIGV2ZW50LCByZXN1bHQsIGJkX2FkZHIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2NjYl90b19pZHgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIGEgcG9pbnRlciB0byBhbiBjY2IsIHJldHVybiBpdHMgaW5kZXguCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgSW5kZXggb2YgY2NiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGF2Y3RfY2NiX3RvX2lkeCh0QVZDVF9DQ0IqIHBfY2NiKSB7Ci0gIC8qIHVzZSBhcnJheSBhcml0aG1ldGljIHRvIGRldGVybWluZSBpbmRleCAqLwotICByZXR1cm4gKHVpbnQ4X3QpKHBfY2NiIC0gYXZjdF9jYi5jY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9jY2JfYnlfaWR4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm4gY2NiIHBvaW50ZXIgYmFzZWQgb24gY2NiIGluZGV4IChvciBoYW5kbGUpLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNjYiwgb3IgTlVMTCBpZiBub25lIGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZDVF9DQ0IqIGF2Y3RfY2NiX2J5X2lkeCh1aW50OF90IGlkeCkgewotICB0QVZDVF9DQ0IqIHBfY2NiOwotCi0gIC8qIHZlcmlmeSBpbmRleCAqLwotICBpZiAoaWR4IDwgQVZDVF9OVU1fQ09OTikgewotICAgIHBfY2NiID0gJmF2Y3RfY2IuY2NiW2lkeF07Ci0KLSAgICAvKiB2ZXJpZnkgY2NiIGlzIGFsbG9jYXRlZCAqLwotICAgIGlmICghcF9jY2ItPmFsbG9jYXRlZCkgewotICAgICAgcF9jY2IgPSBOVUxMOwotICAgICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJjY2IgJWQgbm90IGFsbG9jYXRlZCIsIGlkeCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHBfY2NiID0gTlVMTDsKLSAgICBBVkNUX1RSQUNFX1dBUk5JTkcoIk5vIGNjYiBmb3IgaWR4ICVkIiwgaWR4KTsKLSAgfQotICByZXR1cm4gcF9jY2I7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdmN0L2F2Y3RfZGVmcy5oIGIvc3RhY2svYXZjdC9hdmN0X2RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3NDhjNS4uMDAwMDAwMAotLS0gYS9zdGFjay9hdmN0L2F2Y3RfZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGNvbnRhaW5zIGNvbnN0YW50cyBkZWZpbml0aW9ucyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgQVZDVFAKLSAqICBzcGVjaWZpY2F0aW9uLiAgVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciB1c2UgaW50ZXJuYWwgdG8gQVZDVCBvbmx5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEFWQ1RfREVGU19ICi0jZGVmaW5lIEFWQ1RfREVGU19ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogY29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogcGFja2V0IHR5cGUgKi8KLSNkZWZpbmUgQVZDVF9QS1RfVFlQRV9TSU5HTEUgMCAvKiBzaW5nbGUgcGFja2V0ICovCi0jZGVmaW5lIEFWQ1RfUEtUX1RZUEVfU1RBUlQgMSAgLyogc3RhcnQgcGFja2V0ICovCi0jZGVmaW5lIEFWQ1RfUEtUX1RZUEVfQ09OVCAyICAgLyogY29udGludWUgcGFja2V0ICovCi0jZGVmaW5lIEFWQ1RfUEtUX1RZUEVfRU5EIDMgICAgLyogZW5kIHBhY2tldCAqLwotCi0vKiBoZWFkZXIgbGVuZ3RocyBmb3IgZGlmZmVyZW50IHBhY2tldCB0eXBlcyAqLwotI2RlZmluZSBBVkNUX0hEUl9MRU5fU0lOR0xFIDMKLSNkZWZpbmUgQVZDVF9IRFJfTEVOX1NUQVJUIDQKLSNkZWZpbmUgQVZDVF9IRFJfTEVOX0NPTlQgMQotI2RlZmluZSBBVkNUX0hEUl9MRU5fRU5EIDEKLQotLyogaW52YWxpZCBjcitpcGlkIHZhbHVlICovCi0jZGVmaW5lIEFWQ1RfQ1JfSVBJRF9JTlZBTElEIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBtZXNzYWdlIHBhcnNpbmcgYW5kIGJ1aWxkaW5nIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQVZDVF9CVUlMRF9IRFIocCwgbGFiZWwsIHR5cGUsIGNyX2lwaWQpIFwKLSAgKihwKSsrID0gKChsYWJlbCkgPDwgNCkgfCAoKHR5cGUpIDw8IDIpIHwgKGNyX2lwaWQpOwotCi0jZGVmaW5lIEFWQ1RfUEFSU0VfSERSKHAsIGxhYmVsLCB0eXBlLCBjcl9pcGlkKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGxhYmVsKSA9ICoocCkgPj4gNDsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHR5cGUpID0gKCoocCkgPj4gMikgJiAzOyAgICAgICAgICAgICAgICAgICBcCi0gICAgKGNyX2lwaWQpID0gKihwKSsrICYgMzsgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVZDVF9QS1RfVFlQRShwKSAoKCoocCkgPj4gMikgJiAzKQotCi0jZW5kaWYgLyogQVZDVF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2F2Y3QvYXZjdF9pbnQuaCBiL3N0YWNrL2F2Y3QvYXZjdF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3NTM4MC4uMDAwMDAwMAotLS0gYS9zdGFjay9hdmN0L2F2Y3RfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgaW50ZXJmYWNlcyB3aGljaCBhcmUgaW50ZXJuYWwgdG8gQVZDVFAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVZDVF9JTlRfSAotI2RlZmluZSBBVkNUX0lOVF9ICi0KLSNpbmNsdWRlICJhdmN0X2FwaS5oIgotI2luY2x1ZGUgImF2Y3RfZGVmcy5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBjb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBsY2Igc3RhdGUgbWFjaGluZSBldmVudHMgKi8KLWVudW0gewotICBBVkNUX0xDQl9VTF9CSU5EX0VWVCwKLSAgQVZDVF9MQ0JfVUxfVU5CSU5EX0VWVCwKLSAgQVZDVF9MQ0JfVUxfTVNHX0VWVCwKLSAgQVZDVF9MQ0JfSU5UX0NMT1NFX0VWVCwKLSAgQVZDVF9MQ0JfTExfT1BFTl9FVlQsCi0gIEFWQ1RfTENCX0xMX0NMT1NFX0VWVCwKLSAgQVZDVF9MQ0JfTExfTVNHX0VWVCwKLSAgQVZDVF9MQ0JfTExfQ09OR19FVlQKLX07Ci0KLS8qICJzdGF0ZXMiIHVzZWQgZm9yIEwyQ0FQIGNoYW5uZWwgKi8KLSNkZWZpbmUgQVZDVF9DSF9JRExFIDAgLyogTm8gY29ubmVjdGlvbiAqLwotI2RlZmluZSBBVkNUX0NIX0NPTk4gMSAvKiBXYWl0aW5nIGZvciBjb25uZWN0aW9uIGNvbmZpcm0gKi8KLSNkZWZpbmUgQVZDVF9DSF9DRkcgMiAgLyogV2FpdGluZyBmb3IgY29uZmlndXJhdGlvbiBjb21wbGV0ZSAqLwotI2RlZmluZSBBVkNUX0NIX09QRU4gMyAvKiBDaGFubmVsIG9wZW5lZCAqLwotCi0vKiAibm8gZXZlbnQiIGluZGljYXRvciB1c2VkIGJ5IGNjYiBkZWFsbG9jICovCi0jZGVmaW5lIEFWQ1RfTk9fRVZUIDB4RkYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHN1YiBjb250cm9sIGJsb2NrIHR5cGUgLSBjb21tb24gZGF0YSBtZW1iZXJzIGZvciB0QVZDVF9MQ0IgYW5kIHRBVkNUX0JDQiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBwZWVyX210dTsgIC8qIHBlZXIgbDJjIG10dSAqLwotICB1aW50MTZfdCBjaF9yZXN1bHQ7IC8qIEwyQ0FQIGNvbm5lY3Rpb24gcmVzdWx0IHZhbHVlICovCi0gIHVpbnQxNl90IGNoX2xjaWQ7ICAgLyogTDJDQVAgY2hhbm5lbCBMQ0lEICovCi0gIHVpbnQ4X3QgYWxsb2NhdGVkOyAgLyogMCwgbm90IGFsbG9jYXRlZC4gaW5kZXgrMSwgb3RoZXJ3aXNlLiAqLwotICB1aW50OF90IHN0YXRlOyAgICAgIC8qIFRoZSBzdGF0ZSBtYWNoaW5lIHN0YXRlICovCi0gIHVpbnQ4X3QgY2hfc3RhdGU7ICAgLyogTDJDQVAgY2hhbm5lbCBzdGF0ZSAqLwotfSB0QVZDVF9TQ0I7Ci0KLS8qIGxpbmsgY29udHJvbCBibG9jayB0eXBlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHBlZXJfbXR1OyAgICAgIC8qIHBlZXIgbDJjIG10dSAqLwotICB1aW50MTZfdCBjaF9yZXN1bHQ7ICAgICAvKiBMMkNBUCBjb25uZWN0aW9uIHJlc3VsdCB2YWx1ZSAqLwotICB1aW50MTZfdCBjaF9sY2lkOyAgICAgICAvKiBMMkNBUCBjaGFubmVsIExDSUQgKi8KLSAgdWludDhfdCBhbGxvY2F0ZWQ7ICAgICAgLyogMCwgbm90IGFsbG9jYXRlZC4gaW5kZXgrMSwgb3RoZXJ3aXNlLiAqLwotICB1aW50OF90IHN0YXRlOyAgICAgICAgICAvKiBUaGUgc3RhdGUgbWFjaGluZSBzdGF0ZSAqLwotICB1aW50OF90IGNoX3N0YXRlOyAgICAgICAvKiBMMkNBUCBjaGFubmVsIHN0YXRlICovCi0gIEJUX0hEUiogcF9yeF9tc2c7ICAgICAgIC8qIE1lc3NhZ2UgYmVpbmcgcmVhc3NlbWJsZWQgKi8KLSAgdWludDE2X3QgY29uZmxpY3RfbGNpZDsgLyogTDJDQVAgY2hhbm5lbCBMQ0lEICovCi0gIFJhd0FkZHJlc3MgcGVlcl9hZGRyOyAgIC8qIEJEIGFkZHJlc3Mgb2YgcGVlciAqLwotICBmaXhlZF9xdWV1ZV90KiB0eF9xOyAgICAvKiBUcmFuc21pdCBkYXRhIGJ1ZmZlciBxdWV1ZSAgICAgICAqLwotICBib29sIGNvbmc7ICAgICAgICAgICAgICAvKiB0cnVlLCBpZiBjb25nZXN0ZWQgKi8KLX0gdEFWQ1RfTENCOwotCi0vKiBicm93c2UgY29udHJvbCBibG9jayB0eXBlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHBlZXJfbXR1OyAgLyogcGVlciBsMmMgbXR1ICovCi0gIHVpbnQxNl90IGNoX3Jlc3VsdDsgLyogTDJDQVAgY29ubmVjdGlvbiByZXN1bHQgdmFsdWUgKi8KLSAgdWludDE2X3QgY2hfbGNpZDsgICAvKiBMMkNBUCBjaGFubmVsIExDSUQgKi8KLSAgdWludDhfdCBhbGxvY2F0ZWQ7ICAvKiAwLCBub3QgYWxsb2NhdGVkLiBpbmRleCsxLCBvdGhlcndpc2UuICovCi0gIHVpbnQ4X3Qgc3RhdGU7ICAgICAgLyogVGhlIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KLSAgdWludDhfdCBjaF9zdGF0ZTsgICAvKiBMMkNBUCBjaGFubmVsIHN0YXRlICovCi0gIEJUX0hEUiogcF90eF9tc2c7ICAvKiBNZXNzYWdlIHRvIGJlIHNlbnQgLSBpbiBjYXNlIHRoZSBicm93c2luZyBjaGFubmVsIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiB3aGVuIE1zZ1JlZyBpcyBjYWxsZWQgKi8KLSAgdWludDhfdCBjaF9jbG9zZTsgIC8qIENDQiBpbmRleCsxLCBpZiBDQ0IgaW5pdGlhdGVkIGNoYW5uZWwgY2xvc2UgKi8KLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7IC8qIEJEIGFkZHJlc3Mgb2YgcGVlciAqLwotfSB0QVZDVF9CQ0I7Ci0KLSNkZWZpbmUgQVZDVF9BTE9DX0xDQiAweDAxCi0jZGVmaW5lIEFWQ1RfQUxPQ19CQ0IgMHgwMgotLyogY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVkNUX0NDIGNjOyAgICAgICAvKiBwYXJhbWV0ZXJzIGZyb20gY29ubmVjdGlvbiBjcmVhdGlvbiAqLwotICB0QVZDVF9MQ0IqIHBfbGNiOyAgLyogQXNzb2NpYXRlZCBMQ0IgKi8KLSAgdEFWQ1RfQkNCKiBwX2JjYjsgIC8qIGFzc29jaWF0ZWQgQkNCICovCi0gIGJvb2wgY2hfY2xvc2U7ICAgICAvKiBXaGV0aGVyIENDQiBpbml0aWF0ZWQgY2hhbm5lbCBjbG9zZSAqLwotICB1aW50OF90IGFsbG9jYXRlZDsgLyogV2hldGhlciBMQ0IvQkNCIGlzIGFsbG9jYXRlZCAqLwotfSB0QVZDVF9DQ0I7Ci0KLS8qIGRhdGEgdHlwZSBhc3NvY2lhdGVkIHdpdGggVUxfTVNHX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFIqIHBfYnVmOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotICB1aW50OF90IGxhYmVsOwotICB1aW50OF90IGNyOwotfSB0QVZDVF9VTF9NU0c7Ci0KLS8qIHVuaW9uIGFzc29jaWF0ZWQgd2l0aCBsY2Igc3RhdGUgbWFjaGluZSBldmVudHMgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QVZDVF9VTF9NU0cgdWxfbXNnOwotICBCVF9IRFIqIHBfYnVmOwotICB0QVZDVF9DQ0IqIHBfY2NiOwotICB1aW50MTZfdCByZXN1bHQ7Ci0gIGJvb2wgY29uZzsKLSAgdWludDhfdCBlcnJfY29kZTsKLX0gdEFWQ1RfTENCX0VWVDsKLQotLyogQ29udHJvbCBibG9jayBmb3IgQVZDVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZDVF9MQ0IgbGNiW0FWQ1RfTlVNX0xJTktTXTsgLyogbGluayBjb250cm9sIGJsb2NrcyAqLwotICB0QVZDVF9CQ0IgYmNiW0FWQ1RfTlVNX0xJTktTXTsgLyogYnJvd3NlIGNvbnRyb2wgYmxvY2tzICovCi0gIHRBVkNUX0NDQiBjY2JbQVZDVF9OVU1fQ09OTl07ICAvKiBjb25uZWN0aW9uIGNvbnRyb2wgYmxvY2tzICovCi0gIHVpbnQ4X3QgdHJhY2VfbGV2ZWw7ICAgICAgICAgICAvKiB0cmFjZSBsZXZlbCAqLwotfSB0QVZDVF9DQjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBMQ0IgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi1leHRlcm4gdm9pZCBhdmN0X2xjYl9ldmVudCh0QVZDVF9MQ0IqIHBfbGNiLCB1aW50OF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfYmNiX2V2ZW50KHRBVkNUX0JDQiogcF9iY2IsIHVpbnQ4X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9jbG9zZV9iY2IodEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB0QVZDVF9MQ0IqIGF2Y3RfbGNiX2J5X2JjYih0QVZDVF9CQ0IqIHBfYmNiKTsKLWV4dGVybiB0QVZDVF9CQ0IqIGF2Y3RfYmNiX2J5X2xjYih0QVZDVF9MQ0IqIHBfbGNiKTsKLWV4dGVybiB1aW50OF90IGF2Y3RfYmNiX2dldF9sYXN0X2NjYl9pbmRleCh0QVZDVF9CQ0IqIHBfYmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkNUX0NDQiogcF9jY2JfbGFzdCk7Ci1leHRlcm4gdEFWQ1RfQkNCKiBhdmN0X2JjYl9ieV9sY2lkKHVpbnQxNl90IGxjaWQpOwotZXh0ZXJuIHRBVkNUX0xDQiogYXZjdF9sY2JfYnlfYmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gdEFWQ1RfTENCKiBhdmN0X2xjYl9hbGxvYyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLWV4dGVybiB2b2lkIGF2Y3RfbGNiX2RlYWxsb2ModEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB0QVZDVF9MQ0IqIGF2Y3RfbGNiX2J5X2xjaWQodWludDE2X3QgbGNpZCk7Ci1leHRlcm4gdEFWQ1RfQ0NCKiBhdmN0X2xjYl9oYXNfcGlkKHRBVkNUX0xDQiogcF9sY2IsIHVpbnQxNl90IHBpZCk7Ci1leHRlcm4gYm9vbCBhdmN0X2xjYl9sYXN0X2NjYih0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9DQ0IqIHBfY2NiX2xhc3QpOwotCi0vKiBMQ0IgYWN0aW9uIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYXZjdF9sY2JfY2hubF9vcGVuKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2xjYl91bmJpbmRfZGlzYyh0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9sY2Jfb3Blbl9pbmQodEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfbGNiX29wZW5fZmFpbCh0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9sY2JfY2xvc2VfaW5kKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2xjYl9jbG9zZV9jZm0odEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfbGNiX2JpbmRfY29ubih0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9sY2JfY2hrX2Rpc2ModEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfbGNiX2NobmxfZGlzYyh0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9sY2JfYmluZF9mYWlsKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2xjYl9jb25nX2luZCh0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9sY2JfZGlzY2FyZF9tc2codEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfbGNiX3NlbmRfbXNnKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2xjYl9tc2dfaW5kKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2xjYl9mcmVlX21zZ19pbmQodEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLQotLyogQkNCIGFjdGlvbiBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgdm9pZCAoKnRBVkNUX0JDQl9BQ1RJT04pKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2JjYl9jaG5sX29wZW4odEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfYmNiX3VuYmluZF9kaXNjKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2JjYl9vcGVuX2luZCh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9iY2Jfb3Blbl9mYWlsKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2JjYl9jbG9zZV9pbmQodEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfYmNiX2Nsb3NlX2NmbSh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9iY2JfYmluZF9jb25uKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2JjYl9jaGtfZGlzYyh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9iY2JfY2hubF9kaXNjKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2JjYl9iaW5kX2ZhaWwodEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfYmNiX2NvbmdfaW5kKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmN0X2JjYl9kaXNjYXJkX21zZyh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZjdF9iY2Jfc2VuZF9tc2codEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfYmNiX21zZ19pbmQodEFWQ1RfQkNCKiBwX2JjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2Y3RfYmNiX2ZyZWVfbXNnX2luZCh0QVZDVF9CQ0IqIHBfYmNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpOwotCi1leHRlcm4gdm9pZCBhdmN0X2JjYl9kZWFsbG9jKHRBVkNUX0JDQiogcF9iY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci0KLWV4dGVybiBjb25zdCB0QVZDVF9CQ0JfQUNUSU9OIGF2Y3RfYmNiX2FjdGlvbltdOwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgYXZjdF9sY2JfcGt0X3R5cGVfbGVuW107Ci0KLS8qIENDQiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KLWV4dGVybiB0QVZDVF9DQ0IqIGF2Y3RfY2NiX2FsbG9jKHRBVkNUX0NDKiBwX2NjKTsKLWV4dGVybiB2b2lkIGF2Y3RfY2NiX2RlYWxsb2ModEFWQ1RfQ0NCKiBwX2NjYiwgdWludDhfdCBldmVudCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLWV4dGVybiB1aW50OF90IGF2Y3RfY2NiX3RvX2lkeCh0QVZDVF9DQ0IqIHBfY2NiKTsKLWV4dGVybiB0QVZDVF9DQ0IqIGF2Y3RfY2NiX2J5X2lkeCh1aW50OF90IGlkeCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZ2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBNYWluIGNvbnRyb2wgYmxvY2sgKi8KLWV4dGVybiB0QVZDVF9DQiBhdmN0X2NiOwotCi0vKiBMMkNBUCBjYWxsYmFjayByZWdpc3RyYXRpb24gc3RydWN0dXJlICovCi1leHRlcm4gY29uc3QgdEwyQ0FQX0FQUExfSU5GTyBhdmN0X2wyY19hcHBsOwotZXh0ZXJuIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8gYXZjdF9sMmNfYnJfYXBwbDsKLQotdm9pZCBhdmN0X2wyY19kaXNjb25uZWN0KHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci12b2lkIGF2Y3RfbDJjX2JyX2Rpc2Nvbm5lY3QodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0KTsKLQotY29uc3RleHByIHVpbnQxNl90IGtBdnJjTXR1ID0gNTEyOwotY29uc3RleHByIHVpbnQxNl90IGtBdnJjQnJNdHUgPSAxMDA4OwotCi0jZW5kaWYgLyogQVZDVF9JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svYXZjdC9hdmN0X2wyYy5jYyBiL3N0YWNrL2F2Y3QvYXZjdF9sMmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM0NmUuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZjdC9hdmN0X2wyYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgQVZDVFAgbW9kdWxlIGludGVyZmFjZXMgdG8gTDJDQVAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYXZjdF9hcGkuaCIKLSNpbmNsdWRlICJhdmN0X2ludC5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qIGNhbGxiYWNrIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLwotdm9pZCBhdmN0X2wyY19jb25uZWN0X2luZF9jYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBsY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQ4X3QgaWQpOwotdm9pZCBhdmN0X2wyY19jb25uZWN0X2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpOwotdm9pZCBhdmN0X2wyY19jb25maWdfY2ZtX2NiYWNrKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXZvaWQgYXZjdF9sMmNfY29uZmlnX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXZvaWQgYXZjdF9sMmNfZGlzY29ubmVjdF9pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgYm9vbCBhY2tfbmVlZGVkKTsKLXZvaWQgYXZjdF9sMmNfY29uZ2VzdGlvbl9pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgYm9vbCBpc19jb25nZXN0ZWQpOwotdm9pZCBhdmN0X2wyY19kYXRhX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBCVF9IRFIqIHBfYnVmKTsKLXN0YXRpYyB2b2lkIGF2Y3Rfb25fbDJjYXBfZXJyb3IodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0KTsKLQotLyogTDJDQVAgY2FsbGJhY2sgZnVuY3Rpb24gc3RydWN0dXJlICovCi1jb25zdCB0TDJDQVBfQVBQTF9JTkZPIGF2Y3RfbDJjX2FwcGwgPSB7Ci0gICAgYXZjdF9sMmNfY29ubmVjdF9pbmRfY2JhY2ssCi0gICAgYXZjdF9sMmNfY29ubmVjdF9jZm1fY2JhY2ssCi0gICAgYXZjdF9sMmNfY29uZmlnX2luZF9jYmFjaywKLSAgICBhdmN0X2wyY19jb25maWdfY2ZtX2NiYWNrLAotICAgIGF2Y3RfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrLAotICAgIE5VTEwsCi0gICAgYXZjdF9sMmNfZGF0YV9pbmRfY2JhY2ssCi0gICAgYXZjdF9sMmNfY29uZ2VzdGlvbl9pbmRfY2JhY2ssCi0gICAgTlVMTCwKLSAgICBhdmN0X29uX2wyY2FwX2Vycm9yLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbDJjX2lzX3Bhc3NpdmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrIGlzIHRoZSBDQ0IgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBMQ0Igd2FzIGNyZWF0ZWQKLSAqICAgICAgICAgICAgICAgICAgYXMgcGFzc2l2ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSwgaWYgdGhlIGdpdmVuIExDQiBpcyBjcmVhdGVkIGFzIEFWQ1RfUEFTU0lWRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBhdmN0X2wyY19pc19wYXNzaXZlKHRBVkNUX0xDQiogcF9sY2IpIHsKLSAgYm9vbCBpc19wYXNzaXZlID0gZmFsc2U7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBBVkNUX05VTV9DT05OOyBpKyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmFsbG9jYXRlZCAmJiAocF9jY2ItPnBfbGNiID09IHBfbGNiKSkgewotICAgICAgQVZDVF9UUkFDRV9ERUJVRygiYXZjdF9sMmNfaXNfY3QgY29udHJvbDp4JXgiLCBwX2NjYi0+Y2MuY29udHJvbCk7Ci0gICAgICBpZiAocF9jY2ItPmNjLmNvbnRyb2wgJiBBVkNUX1BBU1NJVkUpIHsKLSAgICAgICAgaXNfcGFzc2l2ZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gaXNfcGFzc2l2ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbDJjX2Nvbm5lY3RfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25uZWN0IGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbDJjX2Nvbm5lY3RfaW5kX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IHBzbSwgdWludDhfdCBpZCkgewotICB0QVZDVF9MQ0IqIHBfbGNiOwotICB1aW50MTZfdCByZXN1bHQgPSBMMkNBUF9DT05OX09LOwotCi0gIC8qIGRvIHdlIGFscmVhZHkgaGF2ZSBhIGNoYW5uZWwgZm9yIHRoaXMgcGVlcj8gKi8KLSAgcF9sY2IgPSBhdmN0X2xjYl9ieV9iZChiZF9hZGRyKTsKLSAgaWYgKHBfbGNiID09IE5VTEwpIHsKLSAgICAvKiBubywgYWxsb2NhdGUgbGNiICovCi0gICAgcF9sY2IgPSBhdmN0X2xjYl9hbGxvYyhiZF9hZGRyKTsKLSAgICBpZiAocF9sY2IgPT0gTlVMTCkgewotICAgICAgLyogbm8gY2NiIGF2YWlsYWJsZSwgcmVqZWN0IEwyQ0FQIGNvbm5lY3Rpb24gKi8KLSAgICAgIHJlc3VsdCA9IEwyQ0FQX0NPTk5fTk9fUkVTT1VSQ0VTOwotICAgIH0KLSAgfQotICAvKiBlbHNlIHdlIGFscmVhZHkgaGF2ZSBhIGNoYW5uZWwgZm9yIHRoaXMgcGVlciAqLwotICBlbHNlIHsKLSAgICBpZiAoIWF2Y3RfbDJjX2lzX3Bhc3NpdmUocF9sY2IpIHx8IChwX2xjYi0+Y2hfc3RhdGUgPT0gQVZDVF9DSF9PUEVOKSkgewotICAgICAgLyogdGhpcyBMQ0IgaW5jbHVkZWQgQ1Qgcm9sZSAtIHJlamVjdCAqLwotICAgICAgcmVzdWx0ID0gTDJDQVBfQ09OTl9OT19SRVNPVVJDRVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFRHIHJvbGUgb25seSAtIGFjY2VwdCB0aGUgY29ubmVjdGlvbiBmcm9tIENULiBtb3ZlIHRoZSBjaGFubmVsIElEIHRvCi0gICAgICAgKiB0aGUgY29uZmxpY3QgbGlzdCAqLwotICAgICAgcF9sY2ItPmNvbmZsaWN0X2xjaWQgPSBwX2xjYi0+Y2hfbGNpZDsKLSAgICAgIEFWQ1RfVFJBQ0VfREVCVUcoImF2Y3RfbDJjX2Nvbm5lY3RfaW5kX2NiYWNrIGNvbmZsaWN0X2xjaWQ6MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfbGNiLT5jb25mbGljdF9sY2lkKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocF9sY2IpIHsKLSAgICBBVkNUX1RSQUNFX0RFQlVHKCJhdmN0X2wyY19jb25uZWN0X2luZF9jYmFjazogMHgleCwgcmVzOiAlZCwgY2hfc3RhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGxjaWQsIHJlc3VsdCwgcF9sY2ItPmNoX3N0YXRlKTsKLSAgfQotCi0gIC8qIElmIHdlIHJlamVjdCB0aGUgY29ubmVjdGlvbiwgc2VuZCBEaXNjb25uZWN0UmVxICovCi0gIGlmIChyZXN1bHQgIT0gTDJDQVBfQ09OTl9PSykgewotICAgIEwyQ0FfRGlzY29ubmVjdFJlcShsY2lkKTsKLSAgfQotCi0gIC8qIGlmIHJlc3VsdCBvaywgcHJvY2VlZCB3aXRoIGNvbm5lY3Rpb24gKi8KLSAgaWYgKHJlc3VsdCA9PSBMMkNBUF9DT05OX09LKSB7Ci0gICAgLyogc3RvcmUgTENJRCAqLwotICAgIHBfbGNiLT5jaF9sY2lkID0gbGNpZDsKLQotICAgIC8qIHRyYW5zaXRpb24gdG8gY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotICAgIHBfbGNiLT5jaF9zdGF0ZSA9IEFWQ1RfQ0hfQ0ZHOwotICB9Ci0KLSAgaWYgKHBfbGNiKSBBVkNUX1RSQUNFX0RFQlVHKCJjaF9zdGF0ZSBjbmk6ICVkICIsIHBfbGNiLT5jaF9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y3Rfb25fbDJjYXBfZXJyb3IodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0KSB7Ci0gIHRBVkNUX0xDQiogcF9sY2IgPSBhdmN0X2xjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAocF9sY2IgPT0gbnVsbHB0cikgcmV0dXJuOwotICBpZiAocF9sY2ItPmNoX3N0YXRlID09IEFWQ1RfQ0hfQ09OTikgewotICAgIEFWQ1RfVFJBQ0VfREVCVUcoImF2Y3RfbDJjX2Nvbm5lY3RfY2ZtX2NiYWNrIGNvbmZsaWN0X2xjaWQ6MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICBwX2xjYi0+Y29uZmxpY3RfbGNpZCk7Ci0gICAgaWYgKHBfbGNiLT5jb25mbGljdF9sY2lkID09IGxjaWQpIHsKLSAgICAgIHBfbGNiLT5jb25mbGljdF9sY2lkID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgdEFWQ1RfTENCX0VWVCBhdmN0X2xjYl9ldnQ7Ci0gICAgICBhdmN0X2xjYl9ldnQucmVzdWx0ID0gcmVzdWx0OwotICAgICAgYXZjdF9sY2JfZXZlbnQocF9sY2IsIEFWQ1RfTENCX0xMX0NMT1NFX0VWVCwgJmF2Y3RfbGNiX2V2dCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHBfbGNiLT5jaF9zdGF0ZSA9PSBBVkNUX0NIX0NGRykgewotICAgIEFWQ1RfVFJBQ0VfREVCVUcoIkVSUk9SIGF2Y3RfbDJjX2NvbmZpZ19jZm1fY2JhY2sgTDJDQV9EaXNjb25uZWN0UmVxICVkICIsCi0gICAgICAgICAgICAgICAgICAgICBwX2xjYi0+Y2hfc3RhdGUpOwotICAgIC8qIHN0b3JlIHJlc3VsdCB2YWx1ZSAqLwotICAgIHBfbGNiLT5jaF9yZXN1bHQgPSByZXN1bHQ7Ci0KLSAgICAvKiBTZW5kIEwyQ0FQIGRpc2Nvbm5lY3QgcmVxICovCi0gICAgTDJDQV9EaXNjb25uZWN0UmVxKGxjaWQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2wyY19jb25uZWN0X2NmbV9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgTDJDQVAgY29ubmVjdCBjb25maXJtIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2wyY19jb25uZWN0X2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgdEFWQ1RfTENCKiBwX2xjYjsKLQotICAvKiBsb29rIHVwIGxjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfbGNiID0gYXZjdF9sY2JfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfbGNiICE9IE5VTEwpIHsKLSAgICBBVkNUX1RSQUNFX0RFQlVHKAotICAgICAgICAiYXZjdF9sMmNfY29ubmVjdF9jZm1fY2JhY2sgbGNpZDoweCV4IHJlc3VsdDogJWQgY2hfc3RhdGU6ICVkLCAiCi0gICAgICAgICJjb25mbGljdF9sY2lkOjB4JXgiLAotICAgICAgICBsY2lkLCByZXN1bHQsIHBfbGNiLT5jaF9zdGF0ZSwgcF9sY2ItPmNvbmZsaWN0X2xjaWQpOwotICAgIC8qIGlmIGluIGNvcnJlY3Qgc3RhdGUgKi8KLSAgICBpZiAocF9sY2ItPmNoX3N0YXRlID09IEFWQ1RfQ0hfQ09OTikgewotICAgICAgLyogaWYgcmVzdWx0IHN1Y2Nlc3NmdWwgKi8KLSAgICAgIGlmIChyZXN1bHQgPT0gTDJDQVBfQ09OTl9PSykgewotICAgICAgICAvKiBzZXQgY2hhbm5lbCBzdGF0ZSAqLwotICAgICAgICBwX2xjYi0+Y2hfc3RhdGUgPSBBVkNUX0NIX0NGRzsKLSAgICAgIH0KLSAgICAgIC8qIGVsc2UgZmFpbHVyZSAqLwotICAgICAgZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogaW52b2tlZCB3aXRoIG5vbiBPSyBzdGF0dXMiOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocF9sY2ItPmNvbmZsaWN0X2xjaWQgPT0gbGNpZCkgewotICAgICAgLyogd2UgbXVzdCBiZSBpbiBBVkNUX0NIX0NGRyBzdGF0ZSBmb3IgdGhlIGNoX2xjaWQgY2hhbm5lbCAqLwotICAgICAgQVZDVF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiYXZjdF9sMmNfY29ubmVjdF9jZm1fY2JhY2sgY2hfc3RhdGU6ICVkLCBjb25mbGljdF9sY2lkOjB4JXgiLAotICAgICAgICAgIHBfbGNiLT5jaF9zdGF0ZSwgcF9sY2ItPmNvbmZsaWN0X2xjaWQpOwotICAgICAgaWYgKHJlc3VsdCA9PSBMMkNBUF9DT05OX09LKSB7Ci0gICAgICAgIC8qIGp1c3QgaW4gY2FzZSB0aGUgcGVlciBhbHNvIGFjY2VwdHMgb3VyIGNvbm5lY3Rpb24gLSBTZW5kIEwyQ0FQCi0gICAgICAgICAqIGRpc2Nvbm5lY3QgcmVxICovCi0gICAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShsY2lkKTsKLSAgICAgIH0KLSAgICAgIHBfbGNiLT5jb25mbGljdF9sY2lkID0gMDsKLSAgICB9Ci0gICAgQVZDVF9UUkFDRV9ERUJVRygiY2hfc3RhdGUgY25jOiAlZCAiLCBwX2xjYi0+Y2hfc3RhdGUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2wyY19jb25maWdfY2ZtX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25maWcgY29uZmlybSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sMmNfY29uZmlnX2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBhdmN0X2wyY19jb25maWdfaW5kX2NiYWNrKGxjaWQsIHBfY2ZnKTsKLQotICB0QVZDVF9MQ0IqIHBfbGNiOwotCi0gIC8qIGxvb2sgdXAgbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF9sY2IgPSBhdmN0X2xjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAocF9sY2IgIT0gTlVMTCkgewotICAgIEFWQ1RfVFJBQ0VfREVCVUcoImF2Y3RfbDJjX2NvbmZpZ19jZm1fY2JhY2s6IDB4JXgsIGNoX3N0YXRlOiAlZCwiLCBsY2lkLAotICAgICAgICAgICAgICAgICAgICAgcF9sY2ItPmNoX3N0YXRlKTsKLSAgICAvKiBpZiBpbiBjb3JyZWN0IHN0YXRlICovCi0gICAgaWYgKHBfbGNiLT5jaF9zdGF0ZSA9PSBBVkNUX0NIX0NGRykgewotICAgICAgcF9sY2ItPmNoX3N0YXRlID0gQVZDVF9DSF9PUEVOOwotICAgICAgYXZjdF9sY2JfZXZlbnQocF9sY2IsIEFWQ1RfTENCX0xMX09QRU5fRVZULCBOVUxMKTsKLSAgICB9Ci0gICAgQVZDVF9UUkFDRV9ERUJVRygiY2hfc3RhdGUgY2ZjOiAlZCAiLCBwX2xjYi0+Y2hfc3RhdGUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2wyY19jb25maWdfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25maWcgaW5kaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sMmNfY29uZmlnX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIHRBVkNUX0xDQiogcF9sY2I7Ci0KLSAgLyogbG9vayB1cCBsY2IgZm9yIHRoaXMgY2hhbm5lbCAqLwotICBwX2xjYiA9IGF2Y3RfbGNiX2J5X2xjaWQobGNpZCk7Ci0gIGlmIChwX2xjYiAhPSBOVUxMKSB7Ci0gICAgQVZDVF9UUkFDRV9ERUJVRygiYXZjdF9sMmNfY29uZmlnX2luZF9jYmFjazogMHgleCwgY2hfc3RhdGU6ICVkIiwgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgIHBfbGNiLT5jaF9zdGF0ZSk7Ci0gICAgLyogc3RvcmUgdGhlIG10dSBpbiB0YmwgKi8KLSAgICBpZiAocF9jZmctPm10dV9wcmVzZW50KSB7Ci0gICAgICBwX2xjYi0+cGVlcl9tdHUgPSBwX2NmZy0+bXR1OwotICAgIH0gZWxzZSB7Ci0gICAgICBwX2xjYi0+cGVlcl9tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBkaXNjb25uZWN0IGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICB0QVZDVF9MQ0IqIHBfbGNiOwotICB1aW50MTZfdCByZXN1bHQgPSBBVkNUX1JFU1VMVF9GQUlMOwotCi0gIC8qIGxvb2sgdXAgbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF9sY2IgPSBhdmN0X2xjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAocF9sY2IgIT0gTlVMTCkgewotICAgIEFWQ1RfVFJBQ0VfREVCVUcoImF2Y3RfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrOiAweCV4LCBjaF9zdGF0ZTogJWQiLCBsY2lkLAotICAgICAgICAgICAgICAgICAgICAgcF9sY2ItPmNoX3N0YXRlKTsKLSAgICB0QVZDVF9MQ0JfRVZUIGF2Y3RfbGNiX2V2dDsKLSAgICBhdmN0X2xjYl9ldnQucmVzdWx0ID0gcmVzdWx0OwotICAgIGF2Y3RfbGNiX2V2ZW50KHBfbGNiLCBBVkNUX0xDQl9MTF9DTE9TRV9FVlQsICZhdmN0X2xjYl9ldnQpOwotICAgIEFWQ1RfVFJBQ0VfREVCVUcoImNoX3N0YXRlIGRpOiAlZCAiLCBwX2xjYi0+Y2hfc3RhdGUpOwotICB9Ci19Ci0KLXZvaWQgYXZjdF9sMmNfZGlzY29ubmVjdCh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgTDJDQV9EaXNjb25uZWN0UmVxKGxjaWQpOwotCi0gIHRBVkNUX0xDQiogcF9sY2I7Ci0gIHVpbnQxNl90IHJlczsKLQotICAvKiBsb29rIHVwIGxjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfbGNiID0gYXZjdF9sY2JfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfbGNiICE9IE5VTEwpIHsKLSAgICBBVkNUX1RSQUNFX0RFQlVHKAotICAgICAgICAiYXZjdF9sMmNfZGlzY29ubmVjdF9jZm1fY2JhY2s6IDB4JXgsIGNoX3N0YXRlOiAlZCwgcmVzOiAlZCIsIGxjaWQsCi0gICAgICAgIHBfbGNiLT5jaF9zdGF0ZSwgcmVzdWx0KTsKLSAgICAvKiByZXN1bHQgdmFsdWUgbWF5IGJlIHByZXZpb3VzbHkgc3RvcmVkICovCi0gICAgcmVzID0gKHBfbGNiLT5jaF9yZXN1bHQgIT0gMCkgPyBwX2xjYi0+Y2hfcmVzdWx0IDogcmVzdWx0OwotICAgIHBfbGNiLT5jaF9yZXN1bHQgPSAwOwotCi0gICAgdEFWQ1RfTENCX0VWVCBhdmN0X2xjYl9ldnQ7Ci0gICAgYXZjdF9sY2JfZXZ0LnJlc3VsdCA9IHJlczsKLSAgICBhdmN0X2xjYl9ldmVudChwX2xjYiwgQVZDVF9MQ0JfTExfQ0xPU0VfRVZULCAmYXZjdF9sY2JfZXZ0KTsKLSAgICBBVkNUX1RSQUNFX0RFQlVHKCJjaF9zdGF0ZSBkYzogJWQgIiwgcF9sY2ItPmNoX3N0YXRlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sMmNfY29uZ2VzdGlvbl9pbmRfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIEwyQ0FQIGNvbmdlc3Rpb24gaW5kaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sMmNfY29uZ2VzdGlvbl9pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgYm9vbCBpc19jb25nZXN0ZWQpIHsKLSAgdEFWQ1RfTENCKiBwX2xjYjsKLQotICBBVkNUX1RSQUNFX0RFQlVHKCJhdmN0X2wyY19jb25nZXN0aW9uX2luZF9jYmFjazogMHgleCIsIGxjaWQpOwotICAvKiBsb29rIHVwIGxjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfbGNiID0gYXZjdF9sY2JfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfbGNiICE9IE5VTEwpIHsKLSAgICB0QVZDVF9MQ0JfRVZUIGF2Y3RfbGNiX2V2dDsKLSAgICBhdmN0X2xjYl9ldnQuY29uZyA9IGlzX2Nvbmdlc3RlZDsKLSAgICBhdmN0X2xjYl9ldmVudChwX2xjYiwgQVZDVF9MQ0JfTExfQ09OR19FVlQsICZhdmN0X2xjYl9ldnQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2wyY19kYXRhX2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgTDJDQVAgZGF0YSBpbmRpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2wyY19kYXRhX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIHRBVkNUX0xDQiogcF9sY2I7Ci0KLSAgQVZDVF9UUkFDRV9ERUJVRygiYXZjdF9sMmNfZGF0YV9pbmRfY2JhY2s6IDB4JXgiLCBsY2lkKTsKLSAgLyogbG9vayB1cCBsY2IgZm9yIHRoaXMgY2hhbm5lbCAqLwotICBwX2xjYiA9IGF2Y3RfbGNiX2J5X2xjaWQobGNpZCk7Ci0gIGlmIChwX2xjYiAhPSBOVUxMKSB7Ci0gICAgYXZjdF9sY2JfZXZlbnQocF9sY2IsIEFWQ1RfTENCX0xMX01TR19FVlQsICh0QVZDVF9MQ0JfRVZUKikmcF9idWYpOwotICB9IGVsc2UgLyogcHJldmVudCBidWZmZXIgbGVhayAqLwotICB7Ci0gICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJFUlJPUiAtPiBhdmN0X2wyY19kYXRhX2luZF9jYmFjayBkcm9wIGJ1ZmZlciIpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZjdC9hdmN0X2wyY19ici5jYyBiL3N0YWNrL2F2Y3QvYXZjdF9sMmNfYnIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWVmM2MuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZjdC9hdmN0X2wyY19ici5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA4LTIwMTYgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgTmFtZTogICAgICAgICAgIGF2Y3RfbDJjX2JyLmNjCi0gKgotICogIERlc2NyaXB0aW9uOiAgICBUaGlzIEFWQ1RQIG1vZHVsZSBpbnRlcmZhY2VzIHRvIEwyQ0FQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYXZjdF9hcGkuaCIKLSNpbmNsdWRlICJhdmN0X2ludC5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qIGNhbGxiYWNrIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLwotdm9pZCBhdmN0X2wyY19icl9jb25uZWN0X2luZF9jYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBsY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQ4X3QgaWQpOwotdm9pZCBhdmN0X2wyY19icl9jb25uZWN0X2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpOwotdm9pZCBhdmN0X2wyY19icl9jb25maWdfY2ZtX2NiYWNrKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXZvaWQgYXZjdF9sMmNfYnJfY29uZmlnX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXZvaWQgYXZjdF9sMmNfYnJfZGlzY29ubmVjdF9pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgYm9vbCBhY2tfbmVlZGVkKTsKLXZvaWQgYXZjdF9sMmNfYnJfY29uZ2VzdGlvbl9pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgYm9vbCBpc19jb25nZXN0ZWQpOwotdm9pZCBhdmN0X2wyY19icl9kYXRhX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBCVF9IRFIqIHBfYnVmKTsKLXZvaWQgYXZjdF9icl9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpOwotCi0vKiBMMkNBUCBjYWxsYmFjayBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KLWNvbnN0IHRMMkNBUF9BUFBMX0lORk8gYXZjdF9sMmNfYnJfYXBwbCA9IHthdmN0X2wyY19icl9jb25uZWN0X2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0X2wyY19icl9jb25uZWN0X2NmbV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0X2wyY19icl9jb25maWdfaW5kX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3RfbDJjX2JyX2NvbmZpZ19jZm1fY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdF9sMmNfYnJfZGlzY29ubmVjdF9pbmRfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0X2wyY19icl9kYXRhX2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0X2wyY19icl9jb25nZXN0aW9uX2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3RfYnJfb25fbDJjYXBfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sMmNfYnJfY29ubmVjdF9pbmRfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIEwyQ0FQIGNvbm5lY3QgaW5kaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sMmNfYnJfY29ubmVjdF9pbmRfY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgcHNtLCB1aW50OF90IGlkKSB7Ci0gIHRBVkNUX0xDQiogcF9sY2I7Ci0gIHVpbnQxNl90IHJlc3VsdCA9IEwyQ0FQX0NPTk5fTk9fUkVTT1VSQ0VTOwotICB0QVZDVF9CQ0IqIHBfYmNiOwotICB0TDJDQVBfRVJUTV9JTkZPIGVydG1faW5mbzsKLQotICBwX2xjYiA9IGF2Y3RfbGNiX2J5X2JkKGJkX2FkZHIpOwotICBpZiAocF9sY2IgIT0gTlVMTCkgewotICAgIC8qIGNvbnRyb2wgY2hhbm5lbCBleGlzdHMgKi8KLSAgICBwX2JjYiA9IGF2Y3RfYmNiX2J5X2xjYihwX2xjYik7Ci0gICAgcF9iY2ItPnBlZXJfYWRkciA9IGJkX2FkZHI7Ci0KLSAgICBpZiAocF9iY2ItPmFsbG9jYXRlZCA9PSAwKSB7Ci0gICAgICAvKiBicm93c2luZyBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCBhbmQgdGhlIGJyb3dzaW5nIGNoYW5uZWwgaXMKLSAgICAgICAqIHJlZ2lzdGVyZWQKLSAgICAgICAqIC0gYWNjZXB0IGNvbm5lY3Rpb24gKi8KLSAgICAgIHBfYmNiLT5hbGxvY2F0ZWQgPSBwX2xjYi0+YWxsb2NhdGVkOyAvKiBjb3B5IHRoZSBpbmRleCBmcm9tIGxjYiAqLwotCi0gICAgICByZXN1bHQgPSBMMkNBUF9DT05OX09LOwotICAgIH0KLSAgfQotICAvKiBlbHNlIG5vIGNvbnRyb2wgY2hhbm5lbCB5ZXQsIHJlamVjdCAqLwotCi0gIC8qIFNldCB0aGUgRkNSIG9wdGlvbnM6IEJyb3dzaW5nIGNoYW5uZWwgbWFuZGF0ZXMgRVJUTSAqLwotICBlcnRtX2luZm8ucHJlZmVycmVkX21vZGUgPSBMMkNBUF9GQ1JfRVJUTV9NT0RFOwotCi0gIC8qIElmIHdlIHJlamVjdCB0aGUgY29ubmVjdGlvbiwgc2VuZCBEaXNjb25uZWN0UmVxICovCi0gIGlmIChyZXN1bHQgIT0gTDJDQVBfQ09OTl9PSykgewotICAgIEwyQ0FfRGlzY29ubmVjdFJlcShsY2lkKTsKLSAgfQotCi0gIC8qIGlmIHJlc3VsdCBvaywgcHJvY2VlZCB3aXRoIGNvbm5lY3Rpb24gKi8KLSAgaWYgKHJlc3VsdCA9PSBMMkNBUF9DT05OX09LKSB7Ci0gICAgLyogc3RvcmUgTENJRCAqLwotICAgIHBfYmNiLT5jaF9sY2lkID0gbGNpZDsKLQotICAgIC8qIHRyYW5zaXRpb24gdG8gY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotICAgIHBfYmNiLT5jaF9zdGF0ZSA9IEFWQ1RfQ0hfQ0ZHOwotICB9Ci19Ci0KLXZvaWQgYXZjdF9icl9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgdEFWQ1RfQkNCKiBwX2xjYiA9IGF2Y3RfYmNiX2J5X2xjaWQobGNpZCk7Ci0gIGlmIChwX2xjYiA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgLyogc3RvcmUgcmVzdWx0IHZhbHVlICovCi0gIHBfbGNiLT5jaF9yZXN1bHQgPSByZXN1bHQ7Ci0KLSAgLyogU2VuZCBMMkNBUCBkaXNjb25uZWN0IHJlcSAqLwotICBhdmN0X2wyY19icl9kaXNjb25uZWN0KGxjaWQsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sMmNfYnJfY29ubmVjdF9jZm1fY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIEwyQ0FQIGNvbm5lY3QgY29uZmlybSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sMmNfYnJfY29ubmVjdF9jZm1fY2JhY2sodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0KSB7Ci0gIHRBVkNUX0JDQiogcF9sY2I7Ci0KLSAgLyogbG9vayB1cCBsY2IgZm9yIHRoaXMgY2hhbm5lbCAqLwotICBwX2xjYiA9IGF2Y3RfYmNiX2J5X2xjaWQobGNpZCk7Ci0gIGlmICgocF9sY2IgPT0gTlVMTCkgfHwgKHBfbGNiLT5jaF9zdGF0ZSAhPSBBVkNUX0NIX0NPTk4pKSByZXR1cm47Ci0KLSAgaWYgKHJlc3VsdCAhPSBMMkNBUF9DT05OX09LKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBpbnZva2VkIHdpdGggbm9uIE9LIHN0YXR1cyI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogcmVzdWx0IGlzIHN1Y2Nlc3NmdWwgKi8KLSAgLyogc2V0IGNoYW5uZWwgc3RhdGUgKi8KLSAgcF9sY2ItPmNoX3N0YXRlID0gQVZDVF9DSF9DRkc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2wyY19icl9jb25maWdfY2ZtX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25maWcgY29uZmlybSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sMmNfYnJfY29uZmlnX2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBhdmN0X2wyY19icl9jb25maWdfaW5kX2NiYWNrKGxjaWQsIHBfY2ZnKTsKLQotICB0QVZDVF9CQ0IqIHBfbGNiOwotCi0gIC8qIGxvb2sgdXAgbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF9sY2IgPSBhdmN0X2JjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAoKHBfbGNiID09IE5VTEwpIHx8IChwX2xjYi0+Y2hfc3RhdGUgIT0gQVZDVF9DSF9DRkcpKSByZXR1cm47Ci0KLSAgcF9sY2ItPmNoX3N0YXRlID0gQVZDVF9DSF9PUEVOOwotICBhdmN0X2JjYl9ldmVudChwX2xjYiwgQVZDVF9MQ0JfTExfT1BFTl9FVlQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sMmNfYnJfY29uZmlnX2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgTDJDQVAgY29uZmlnIGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbDJjX2JyX2NvbmZpZ19pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICB0QVZDVF9CQ0IqIHBfbGNiOwotICB1aW50MTZfdCBtYXhfbXR1ID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIEwyQ0FQX01JTl9PRkZTRVQgLSBCVF9IRFJfU0laRTsKLQotICAvKiBsb29rIHVwIGxjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfbGNiID0gYXZjdF9iY2JfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfbGNiID09IE5VTEwpIHJldHVybjsKLQotICAvKiBzdG9yZSB0aGUgbXR1IGluIHRibCAqLwotICBwX2xjYi0+cGVlcl9tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKLSAgaWYgKHBfY2ZnLT5tdHVfcHJlc2VudCkgewotICAgIHBfbGNiLT5wZWVyX210dSA9IHBfY2ZnLT5tdHU7Ci0gIH0KLQotICBpZiAocF9sY2ItPnBlZXJfbXR1ID4gbWF4X210dSkgewotICAgIHBfbGNiLT5wZWVyX210dSA9IG1heF9tdHU7Ci0gIH0KLQotICBBVkNUX1RSQUNFX0RFQlVHKCIlcyBwZWVyX210dTolZCB1c2U6JWQiLCBfX2Z1bmNfXywgcF9sY2ItPnBlZXJfbXR1LCBtYXhfbXR1KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbDJjX2JyX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBkaXNjb25uZWN0IGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbDJjX2JyX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICB0QVZDVF9CQ0IqIHBfbGNiOwotICB1aW50MTZfdCByZXN1bHQgPSBBVkNUX1JFU1VMVF9GQUlMOwotCi0gIC8qIGxvb2sgdXAgbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF9sY2IgPSBhdmN0X2JjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAocF9sY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIHRBVkNUX0xDQl9FVlQgYXZjdF9sY2JfZXZ0OwotICBhdmN0X2xjYl9ldnQucmVzdWx0ID0gcmVzdWx0OwotICBhdmN0X2JjYl9ldmVudChwX2xjYiwgQVZDVF9MQ0JfTExfQ0xPU0VfRVZULCAmYXZjdF9sY2JfZXZ0KTsKLX0KLQotdm9pZCBhdmN0X2wyY19icl9kaXNjb25uZWN0KHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICBMMkNBX0Rpc2Nvbm5lY3RSZXEobGNpZCk7Ci0KLSAgdEFWQ1RfQkNCKiBwX2xjYjsKLSAgdWludDE2X3QgcmVzOwotCi0gIC8qIGxvb2sgdXAgbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF9sY2IgPSBhdmN0X2JjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAocF9sY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIC8qIHJlc3VsdCB2YWx1ZSBtYXkgYmUgcHJldmlvdXNseSBzdG9yZWQgKi8KLSAgcmVzID0gKHBfbGNiLT5jaF9yZXN1bHQgIT0gMCkgPyBwX2xjYi0+Y2hfcmVzdWx0IDogcmVzdWx0OwotICBwX2xjYi0+Y2hfcmVzdWx0ID0gMDsKLQotICB0QVZDVF9MQ0JfRVZUIGF2Y3RfbGNiX2V2dDsKLSAgYXZjdF9sY2JfZXZ0LnJlc3VsdCA9IHJlczsKLSAgYXZjdF9iY2JfZXZlbnQocF9sY2IsIEFWQ1RfTENCX0xMX0NMT1NFX0VWVCwgJmF2Y3RfbGNiX2V2dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2wyY19icl9jb25nZXN0aW9uX2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgTDJDQVAgY29uZ2VzdGlvbiBpbmRpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2wyY19icl9jb25nZXN0aW9uX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBib29sIGlzX2Nvbmdlc3RlZCkgewotICB0QVZDVF9CQ0IqIHBfbGNiOwotCi0gIC8qIGxvb2sgdXAgbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF9sY2IgPSBhdmN0X2JjYl9ieV9sY2lkKGxjaWQpOwotICBpZiAocF9sY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIHRBVkNUX0xDQl9FVlQgYXZjdF9sY2JfZXZ0OwotICBhdmN0X2xjYl9ldnQuY29uZyA9IGlzX2Nvbmdlc3RlZDsKLSAgYXZjdF9iY2JfZXZlbnQocF9sY2IsIEFWQ1RfTENCX0xMX0NPTkdfRVZULCAmYXZjdF9sY2JfZXZ0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbDJjX2JyX2RhdGFfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBkYXRhIGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbDJjX2JyX2RhdGFfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIEJUX0hEUiogcF9idWYpIHsKLSAgdEFWQ1RfQkNCKiBwX2xjYjsKLSAgdEFWQ1RfTENCX0VWVCBldnRfZGF0YTsKLQotICAvKiBsb29rIHVwIGxjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfbGNiID0gYXZjdF9iY2JfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfbGNiID09IE5VTEwpIHsKLSAgICAvKiBwcmV2ZW50IGJ1ZmZlciBsZWFrICovCi0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGV2dF9kYXRhLnBfYnVmID0gcF9idWY7Ci0gIGF2Y3RfYmNiX2V2ZW50KHBfbGNiLCBBVkNUX0xDQl9MTF9NU0dfRVZULCAmZXZ0X2RhdGEpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZjdC9hdmN0X2xjYi5jYyBiL3N0YWNrL2F2Y3QvYXZjdF9sY2IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjgyMDEuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZjdC9hdmN0X2xjYi5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBsaW5rIGNvbnRyb2wgc3RhdGUgbWFjaGluZSBhbmQgZnVuY3Rpb25zIHdoaWNoCi0gKiAgb3BlcmF0ZSBvbiB0aGUgbGluayBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2Y3RfYXBpLmgiCi0jaW5jbHVkZSAiYXZjdF9pbnQuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RhdGUgbWFjaGluZSBjb25zdGFudHMgYW5kIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdmVyYm9zZSBzdGF0ZSBzdHJpbmdzIGZvciB0cmFjZSAqLwotY29uc3QgY2hhciogY29uc3QgYXZjdF9sY2Jfc3Rfc3RyW10gPSB7IkxDQl9JRExFX1NUIiwgIkxDQl9PUEVOSU5HX1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQ0JfT1BFTl9TVCIsICJMQ0JfQ0xPU0lOR19TVCJ9OwotCi0vKiB2ZXJib3NlIGV2ZW50IHN0cmluZ3MgZm9yIHRyYWNlICovCi1jb25zdCBjaGFyKiBjb25zdCBhdmN0X2xjYl9ldnRfc3RyW10gPSB7Ci0gICAgIlVMX0JJTkRfRVZUIiwgIlVMX1VOQklORF9FVlQiLCAiVUxfTVNHX0VWVCIsICJJTlRfQ0xPU0VfRVZUIiwKLSAgICAiTExfT1BFTl9FVlQiLCAiTExfQ0xPU0VfRVZUIiwgICJMTF9NU0dfRVZUIiwgIkxMX0NPTkdfRVZUIn07Ci0KLS8qIGxjYiBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSB7Ci0gIEFWQ1RfTENCX0lETEVfU1QsCi0gIEFWQ1RfTENCX09QRU5JTkdfU1QsCi0gIEFWQ1RfTENCX09QRU5fU1QsCi0gIEFWQ1RfTENCX0NMT1NJTkdfU1QKLX07Ci0KLS8qIHN0YXRlIG1hY2hpbmUgYWN0aW9uIGVudW1lcmF0aW9uIGxpc3QgKi8KLWVudW0gewotICBBVkNUX0xDQl9DSE5MX09QRU4sCi0gIEFWQ1RfTENCX0NITkxfRElTQywKLSAgQVZDVF9MQ0JfU0VORF9NU0csCi0gIEFWQ1RfTENCX09QRU5fSU5ELAotICBBVkNUX0xDQl9PUEVOX0ZBSUwsCi0gIEFWQ1RfTENCX0NMT1NFX0lORCwKLSAgQVZDVF9MQ0JfQ0xPU0VfQ0ZNLAotICBBVkNUX0xDQl9NU0dfSU5ELAotICBBVkNUX0xDQl9DT05HX0lORCwKLSAgQVZDVF9MQ0JfQklORF9DT05OLAotICBBVkNUX0xDQl9CSU5EX0ZBSUwsCi0gIEFWQ1RfTENCX1VOQklORF9ESVNDLAotICBBVkNUX0xDQl9DSEtfRElTQywKLSAgQVZDVF9MQ0JfRElTQ0FSRF9NU0csCi0gIEFWQ1RfTENCX0RFQUxMT0MsCi0gIEFWQ1RfTENCX0ZSRUVfTVNHX0lORCwKLSAgQVZDVF9MQ0JfTlVNX0FDVElPTlMKLX07Ci0KLSNkZWZpbmUgQVZDVF9MQ0JfSUdOT1JFIEFWQ1RfTENCX05VTV9BQ1RJT05TCi0KLS8qIHR5cGUgZm9yIGFjdGlvbiBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgdm9pZCAoKnRBVkNUX0xDQl9BQ1RJT04pKHRBVkNUX0xDQiogcF9jY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSk7Ci0KLS8qIGFjdGlvbiBmdW5jdGlvbiBsaXN0ICovCi1jb25zdCB0QVZDVF9MQ0JfQUNUSU9OIGF2Y3RfbGNiX2FjdGlvbltdID0gewotICAgIGF2Y3RfbGNiX2Nobmxfb3BlbiwgICBhdmN0X2xjYl9jaG5sX2Rpc2MsICAgYXZjdF9sY2Jfc2VuZF9tc2csCi0gICAgYXZjdF9sY2Jfb3Blbl9pbmQsICAgIGF2Y3RfbGNiX29wZW5fZmFpbCwgICBhdmN0X2xjYl9jbG9zZV9pbmQsCi0gICAgYXZjdF9sY2JfY2xvc2VfY2ZtLCAgIGF2Y3RfbGNiX21zZ19pbmQsICAgICBhdmN0X2xjYl9jb25nX2luZCwKLSAgICBhdmN0X2xjYl9iaW5kX2Nvbm4sICAgYXZjdF9sY2JfYmluZF9mYWlsLCAgIGF2Y3RfbGNiX3VuYmluZF9kaXNjLAotICAgIGF2Y3RfbGNiX2Noa19kaXNjLCAgICBhdmN0X2xjYl9kaXNjYXJkX21zZywgYXZjdF9sY2JfZGVhbGxvYywKLSAgICBhdmN0X2xjYl9mcmVlX21zZ19pbmR9OwotCi0vKiBzdGF0ZSB0YWJsZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBBVkNUX0xDQl9BQ1RJT05TIDIgICAgLyogbnVtYmVyIG9mIGFjdGlvbnMgKi8KLSNkZWZpbmUgQVZDVF9MQ0JfTkVYVF9TVEFURSAyIC8qIHBvc2l0aW9uIG9mIG5leHQgc3RhdGUgKi8KLSNkZWZpbmUgQVZDVF9MQ0JfTlVNX0NPTFMgMyAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwotCi0vKiBzdGF0ZSB0YWJsZSBmb3IgaWRsZSBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBhdmN0X2xjYl9zdF9pZGxlW11bQVZDVF9MQ0JfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogVUxfQklORCAqLyB7QVZDVF9MQ0JfQ0hOTF9PUEVOLCBBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX09QRU5JTkdfU1R9LAotICAgIC8qIFVMX1VOQklORCAqLyB7QVZDVF9MQ0JfVU5CSU5EX0RJU0MsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfSURMRV9TVH0sCi0gICAgLyogVUxfTVNHICovIHtBVkNUX0xDQl9ESVNDQVJEX01TRywgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9JRExFX1NUfSwKLSAgICAvKiBJTlRfQ0xPU0UgKi8ge0FWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9JRExFX1NUfSwKLSAgICAvKiBMTF9PUEVOICovIHtBVkNUX0xDQl9PUEVOX0lORCwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9PUEVOX1NUfSwKLSAgICAvKiBMTF9DTE9TRSAqLyB7QVZDVF9MQ0JfQ0xPU0VfSU5ELCBBVkNUX0xDQl9ERUFMTE9DLCBBVkNUX0xDQl9JRExFX1NUfSwKLSAgICAvKiBMTF9NU0cgKi8ge0FWQ1RfTENCX0ZSRUVfTVNHX0lORCwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9JRExFX1NUfSwKLSAgICAvKiBMTF9DT05HICovIHtBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfSURMRV9TVH19OwotCi0vKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbmluZyBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBhdmN0X2xjYl9zdF9vcGVuaW5nW11bQVZDVF9MQ0JfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogVUxfQklORCAqLyB7QVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX09QRU5JTkdfU1R9LAotICAgIC8qIFVMX1VOQklORCAqLyB7QVZDVF9MQ0JfVU5CSU5EX0RJU0MsIEFWQ1RfTENCX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgIEFWQ1RfTENCX09QRU5JTkdfU1R9LAotICAgIC8qIFVMX01TRyAqLyB7QVZDVF9MQ0JfRElTQ0FSRF9NU0csIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfT1BFTklOR19TVH0sCi0gICAgLyogSU5UX0NMT1NFICovIHtBVkNUX0xDQl9DSE5MX0RJU0MsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTExfT1BFTiAqLyB7QVZDVF9MQ0JfT1BFTl9JTkQsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfT1BFTl9TVH0sCi0gICAgLyogTExfQ0xPU0UgKi8ge0FWQ1RfTENCX09QRU5fRkFJTCwgQVZDVF9MQ0JfREVBTExPQywgQVZDVF9MQ0JfSURMRV9TVH0sCi0gICAgLyogTExfTVNHICovIHtBVkNUX0xDQl9GUkVFX01TR19JTkQsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTExfQ09ORyAqLyB7QVZDVF9MQ0JfQ09OR19JTkQsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfT1BFTklOR19TVH19OwotCi0vKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBhdmN0X2xjYl9zdF9vcGVuW11bQVZDVF9MQ0JfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIFVMX0JJTkQgKi8ge0FWQ1RfTENCX0JJTkRfQ09OTiwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9PUEVOX1NUfSwKLSAgICAvKiBVTF9VTkJJTkQgKi8ge0FWQ1RfTENCX0NIS19ESVNDLCBBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX09QRU5fU1R9LAotICAgIC8qIFVMX01TRyAqLyB7QVZDVF9MQ0JfU0VORF9NU0csIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfT1BFTl9TVH0sCi0gICAgLyogSU5UX0NMT1NFICovIHtBVkNUX0xDQl9DSE5MX0RJU0MsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTExfT1BFTiAqLyB7QVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX09QRU5fU1R9LAotICAgIC8qIExMX0NMT1NFICovIHtBVkNUX0xDQl9DTE9TRV9JTkQsIEFWQ1RfTENCX0RFQUxMT0MsIEFWQ1RfTENCX0lETEVfU1R9LAotICAgIC8qIExMX01TRyAqLyB7QVZDVF9MQ0JfTVNHX0lORCwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9PUEVOX1NUfSwKLSAgICAvKiBMTF9DT05HICovIHtBVkNUX0xDQl9DT05HX0lORCwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9PUEVOX1NUfX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciBjbG9zaW5nIHN0YXRlICovCi1jb25zdCB1aW50OF90IGF2Y3RfbGNiX3N0X2Nsb3NpbmdbXVtBVkNUX0xDQl9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBVTF9CSU5EICovIHtBVkNUX0xDQl9CSU5EX0ZBSUwsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogVUxfVU5CSU5EICovIHtBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogVUxfTVNHICovIHtBVkNUX0xDQl9ESVNDQVJEX01TRywgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBJTlRfQ0xPU0UgKi8ge0FWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBMTF9PUEVOICovIHtBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTExfQ0xPU0UgKi8ge0FWQ1RfTENCX0NMT1NFX0NGTSwgQVZDVF9MQ0JfREVBTExPQywgQVZDVF9MQ0JfSURMRV9TVH0sCi0gICAgLyogTExfTVNHICovIHtBVkNUX0xDQl9GUkVFX01TR19JTkQsIEFWQ1RfTENCX0lHTk9SRSwgQVZDVF9MQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTExfQ09ORyAqLyB7QVZDVF9MQ0JfSUdOT1JFLCBBVkNUX0xDQl9JR05PUkUsIEFWQ1RfTENCX0NMT1NJTkdfU1R9fTsKLQotLyogdHlwZSBmb3Igc3RhdGUgdGFibGUgKi8KLXR5cGVkZWYgY29uc3QgdWludDhfdCAoKnRBVkNUX0xDQl9TVF9UQkwpW0FWQ1RfTENCX05VTV9DT0xTXTsKLQotLyogc3RhdGUgdGFibGUgKi8KLWNvbnN0IHRBVkNUX0xDQl9TVF9UQkwgYXZjdF9sY2Jfc3RfdGJsW10gPSB7Ci0gICAgYXZjdF9sY2Jfc3RfaWRsZSwgYXZjdF9sY2Jfc3Rfb3BlbmluZywgYXZjdF9sY2Jfc3Rfb3BlbiwKLSAgICBhdmN0X2xjYl9zdF9jbG9zaW5nfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2V2ZW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGF0ZSBtYWNoaW5lIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciBsY2IKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX2V2ZW50KHRBVkNUX0xDQiogcF9sY2IsIHVpbnQ4X3QgZXZlbnQsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB0QVZDVF9MQ0JfU1RfVEJMIHN0YXRlX3RhYmxlOwotICB1aW50OF90IGFjdGlvbjsKLSAgaW50IGk7Ci0KLSAgQVZDVF9UUkFDRV9FVkVOVCgiTENCIGxjYj0lZCBldmVudD0lcyBzdGF0ZT0lcyIsIHBfbGNiLT5hbGxvY2F0ZWQsCi0gICAgICAgICAgICAgICAgICAgYXZjdF9sY2JfZXZ0X3N0cltldmVudF0sIGF2Y3RfbGNiX3N0X3N0cltwX2xjYi0+c3RhdGVdKTsKLQotICAvKiBsb29rIHVwIHRoZSBzdGF0ZSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgc3RhdGVfdGFibGUgPSBhdmN0X2xjYl9zdF90YmxbcF9sY2ItPnN0YXRlXTsKLQotICAvKiBzZXQgbmV4dCBzdGF0ZSAqLwotICBwX2xjYi0+c3RhdGUgPSBzdGF0ZV90YWJsZVtldmVudF1bQVZDVF9MQ0JfTkVYVF9TVEFURV07Ci0KLSAgLyogZXhlY3V0ZSBhY3Rpb24gZnVuY3Rpb25zICovCi0gIGZvciAoaSA9IDA7IGkgPCBBVkNUX0xDQl9BQ1RJT05TOyBpKyspIHsKLSAgICBhY3Rpb24gPSBzdGF0ZV90YWJsZVtldmVudF1baV07Ci0gICAgaWYgKGFjdGlvbiAhPSBBVkNUX0xDQl9JR05PUkUpIHsKLSAgICAgICgqYXZjdF9sY2JfYWN0aW9uW2FjdGlvbl0pKHBfbGNiLCBwX2RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfYmNiX2V2ZW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGF0ZSBtYWNoaW5lIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciBsY2IKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfYmNiX2V2ZW50KHRBVkNUX0JDQiogcF9iY2IsIHVpbnQ4X3QgZXZlbnQsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB0QVZDVF9MQ0JfU1RfVEJMIHN0YXRlX3RhYmxlOwotICB1aW50OF90IGFjdGlvbjsKLSAgaW50IGk7Ci0KLSAgQVZDVF9UUkFDRV9FVkVOVCgiQkNCIGxjYj0lZCBldmVudD0lcyBzdGF0ZT0lcyIsIHBfYmNiLT5hbGxvY2F0ZWQsCi0gICAgICAgICAgICAgICAgICAgYXZjdF9sY2JfZXZ0X3N0cltldmVudF0sIGF2Y3RfbGNiX3N0X3N0cltwX2JjYi0+c3RhdGVdKTsKLQotICAvKiBsb29rIHVwIHRoZSBzdGF0ZSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgc3RhdGVfdGFibGUgPSBhdmN0X2xjYl9zdF90YmxbcF9iY2ItPnN0YXRlXTsKLQotICAvKiBzZXQgbmV4dCBzdGF0ZSAqLwotICBwX2JjYi0+c3RhdGUgPSBzdGF0ZV90YWJsZVtldmVudF1bQVZDVF9MQ0JfTkVYVF9TVEFURV07Ci0KLSAgLyogZXhlY3V0ZSBhY3Rpb24gZnVuY3Rpb25zICovCi0gIGZvciAoaSA9IDA7IGkgPCBBVkNUX0xDQl9BQ1RJT05TOyBpKyspIHsKLSAgICBhY3Rpb24gPSBzdGF0ZV90YWJsZVtldmVudF1baV07Ci0gICAgaWYgKGFjdGlvbiAhPSBBVkNUX0xDQl9JR05PUkUpIHsKLSAgICAgICgqYXZjdF9iY2JfYWN0aW9uW2FjdGlvbl0pKHBfYmNiLCBwX2RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2J5X2JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGxvb2t1cCBmdW5jdGlvbiBmaW5kcyB0aGUgbGNiIGZvciBhIEJEIGFkZHJlc3MuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgbGNiLCBvciBOVUxMIGlmIG5vbmUgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVkNUX0xDQiogYXZjdF9sY2JfYnlfYmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QVZDVF9MQ0IqIHBfbGNiID0gJmF2Y3RfY2IubGNiWzBdOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQVZDVF9OVU1fTElOS1M7IGkrKywgcF9sY2IrKykgewotICAgIC8qIGlmIGFsbG9jYXRlZCBsY2IgaGFzIG1hdGNoaW5nIGxjYiAqLwotICAgIGlmIChwX2xjYi0+YWxsb2NhdGVkICYmIHBfbGNiLT5wZWVyX2FkZHIgPT0gYmRfYWRkcikgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGkgPT0gQVZDVF9OVU1fTElOS1MpIHsKLSAgICAvKiBpZiBubyBsY2IgZm91bmQgKi8KLSAgICBwX2xjYiA9IE5VTEw7Ci0KLSAgICBWTE9HKDEpIDw8ICJObyBsY2IgZm9yIGFkZHIgIiA8PCBiZF9hZGRyOwotICB9Ci0gIHJldHVybiBwX2xjYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2FsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBbGxvY2F0ZSBhIGxpbmsgY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBsY2IsIG9yIE5VTEwgaWYgbm9uZSBjb3VsZCBiZSBhbGxvY2F0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVkNUX0xDQiogYXZjdF9sY2JfYWxsb2MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QVZDVF9MQ0IqIHBfbGNiID0gJmF2Y3RfY2IubGNiWzBdOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQVZDVF9OVU1fTElOS1M7IGkrKywgcF9sY2IrKykgewotICAgIGlmICghcF9sY2ItPmFsbG9jYXRlZCkgewotICAgICAgcF9sY2ItPmFsbG9jYXRlZCA9ICh1aW50OF90KShpICsgMSk7Ci0gICAgICBwX2xjYi0+cGVlcl9hZGRyID0gYmRfYWRkcjsKLSAgICAgIEFWQ1RfVFJBQ0VfREVCVUcoImF2Y3RfbGNiX2FsbG9jICVkIiwgcF9sY2ItPmFsbG9jYXRlZCk7Ci0gICAgICBwX2xjYi0+dHhfcSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gICAgICBwX2xjYi0+cGVlcl9tdHUgPSBMMkNBUF9MRV9NSU5fTVRVOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGkgPT0gQVZDVF9OVU1fTElOS1MpIHsKLSAgICAvKiBvdXQgb2YgbGNicyAqLwotICAgIHBfbGNiID0gTlVMTDsKLSAgICBBVkNUX1RSQUNFX1dBUk5JTkcoIk91dCBvZiBsY2JzIik7Ci0gIH0KLSAgcmV0dXJuIHBfbGNiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfZGVhbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVhbGxvY2F0ZSBhIGxpbmsgY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX2RlYWxsb2ModEFWQ1RfTENCKiBwX2xjYiwgVU5VU0VEX0FUVFIgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIEFWQ1RfVFJBQ0VfREVCVUcoIiVzIGFsbG9jYXRlZDogJWQiLCBfX2Z1bmNfXywgcF9sY2ItPmFsbG9jYXRlZCk7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlIExDQiBpcyBzdGlsbCByZWZlcmVuY2VkCi0KLSAgdEFWQ1RfQ0NCKiBwX2NjYiA9ICZhdmN0X2NiLmNjYlswXTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVkNUX05VTV9DT05OOyBpKyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmFsbG9jYXRlZCAmJiBwX2NjYi0+cF9sY2IgPT0gcF9sY2IpIHsKLSAgICAgIEFWQ1RfVFJBQ0VfREVCVUcoIiVzIExDQiBpbiB1c2U7IGxjYiBpbmRleDogJWQiLCBfX2Z1bmNfXywgaSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgbm90LCBkZS1hbGxvY2F0ZSBub3cuLi4KLQotICBBVkNUX1RSQUNFX0RFQlVHKCIlcyBGcmVlaW5nIExDQiIsIF9fZnVuY19fKTsKLSAgb3NpX2ZyZWUocF9sY2ItPnBfcnhfbXNnKTsKLSAgZml4ZWRfcXVldWVfZnJlZShwX2xjYi0+dHhfcSwgTlVMTCk7Ci0gIG1lbXNldChwX2xjYiwgMCwgc2l6ZW9mKHRBVkNUX0xDQikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfYnlfbGNpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZCB0aGUgTENCIGFzc29jaWF0ZWQgd2l0aCB0aGUgTDJDQVAgTENJRAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGxjYiwgb3IgTlVMTCBpZiBub25lIGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZDVF9MQ0IqIGF2Y3RfbGNiX2J5X2xjaWQodWludDE2X3QgbGNpZCkgewotICB0QVZDVF9MQ0IqIHBfbGNiID0gJmF2Y3RfY2IubGNiWzBdOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQVZDVF9OVU1fTElOS1M7IGkrKywgcF9sY2IrKykgewotICAgIGlmIChwX2xjYi0+YWxsb2NhdGVkICYmCi0gICAgICAgICgocF9sY2ItPmNoX2xjaWQgPT0gbGNpZCkgfHwgKHBfbGNiLT5jb25mbGljdF9sY2lkID09IGxjaWQpKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGkgPT0gQVZDVF9OVU1fTElOS1MpIHsKLSAgICAvKiBvdXQgb2YgbGNicyAqLwotICAgIHBfbGNiID0gTlVMTDsKLSAgICBBVkNUX1RSQUNFX1dBUk5JTkcoIk5vIGxjYiBmb3IgbGNpZCAleCIsIGxjaWQpOwotICB9Ci0KLSAgcmV0dXJuIHBfbGNiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfaGFzX3BpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VlIGlmIGFueSBjY2JzIG9uIHRoaXMgbGNiIGhhdmUgYSBwYXJ0aWN1bGFyIHBpZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIENDQiBpZiBQSUQgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZDVF9DQ0IqIGF2Y3RfbGNiX2hhc19waWQodEFWQ1RfTENCKiBwX2xjYiwgdWludDE2X3QgcGlkKSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBBVkNUX05VTV9DT05OOyBpKyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmFsbG9jYXRlZCAmJiAocF9jY2ItPnBfbGNiID09IHBfbGNiKSAmJiAocF9jY2ItPmNjLnBpZCA9PSBwaWQpKSB7Ci0gICAgICByZXR1cm4gcF9jY2I7Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfbGFzdF9jY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlZSBpZiBnaXZlbiBjY2IgaXMgb25seSBvbmUgb24gdGhlIGxjYi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNjYiBpcyBsYXN0LCBmYWxzZSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYXZjdF9sY2JfbGFzdF9jY2IodEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfQ0NCKiBwX2NjYl9sYXN0KSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIGludCBpOwotCi0gIEFWQ1RfVFJBQ0VfV0FSTklORygiYXZjdF9sY2JfbGFzdF9jY2IiKTsKLSAgZm9yIChpID0gMDsgaSA8IEFWQ1RfTlVNX0NPTk47IGkrKywgcF9jY2IrKykgewotICAgIEFWQ1RfVFJBQ0VfV0FSTklORygiJXg6IGFsb2M6JWQsIGxjYjoweCV4LzB4JXgsIGNjYjoweCV4LzB4JXgiLCBpLAotICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+YWxsb2NhdGVkLCBwX2NjYi0+cF9sY2IsIHBfbGNiLCBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9jY2JfbGFzdCk7Ci0gICAgaWYgKHBfY2NiLT5hbGxvY2F0ZWQgJiYgKHBfY2NiLT5wX2xjYiA9PSBwX2xjYikgJiYgKHBfY2NiICE9IHBfY2NiX2xhc3QpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZjdC9hdmN0X2xjYl9hY3QuY2MgYi9zdGFjay9hdmN0L2F2Y3RfbGNiX2FjdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiZTllNi4uMDAwMDAwMAotLS0gYS9zdGFjay9hdmN0L2F2Y3RfbGNiX2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFjdGlvbiBmdW5jdGlvbnMgb2YgdGhlIGxpbmsgY29udHJvbCBzdGF0ZSBtYWNoaW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2Y3RfYXBpLmgiCi0jaW5jbHVkZSAiYXZjdF9pbnQuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcGkuaCIKLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vKiBwYWNrZXQgaGVhZGVyIGxlbmd0aCBsb29rdXAgdGFibGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZjdF9sY2JfcGt0X3R5cGVfbGVuW10gPSB7QVZDVF9IRFJfTEVOX1NJTkdMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDVF9IRFJfTEVOX1NUQVJULCBBVkNUX0hEUl9MRU5fQ09OVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDVF9IRFJfTEVOX0VORH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2xjYl9tc2dfYXNtYmwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYXNzZW1ibGUgaW5jb21pbmcgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHJlYXNzZW1ibGVkIG1lc3NhZ2U7ICBOVUxMIGlmIG5vIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdmN0X2xjYl9tc2dfYXNtYmwodEFWQ1RfTENCKiBwX2xjYiwgQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90KiBwOwotICB1aW50OF90IHBrdF90eXBlOwotICBCVF9IRFIqIHBfcmV0OwotCi0gIGlmIChwX2J1Zi0+bGVuIDwgMSkgewotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICBwX3JldCA9IE5VTEw7Ci0gICAgcmV0dXJuIHBfcmV0OwotICB9Ci0KLSAgLyogcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyICovCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBwa3RfdHlwZSA9IEFWQ1RfUEtUX1RZUEUocCk7Ci0KLSAgLyogcXVpY2sgc2FuaXR5IGNoZWNrIG9uIGxlbmd0aCAqLwotICBpZiAocF9idWYtPmxlbiA8IGF2Y3RfbGNiX3BrdF90eXBlX2xlbltwa3RfdHlwZV0pIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJCYWQgbGVuZ3RoIGR1cmluZyByZWFzc2VtYmx5Iik7Ci0gICAgcF9yZXQgPSBOVUxMOwotICB9Ci0gIC8qIHNpbmdsZSBwYWNrZXQgKi8KLSAgZWxzZSBpZiAocGt0X3R5cGUgPT0gQVZDVF9QS1RfVFlQRV9TSU5HTEUpIHsKLSAgICAvKiBpZiByZWFzc2VtYmx5IGluIHByb2dyZXNzIGRyb3AgbWVzc2FnZSBhbmQgcHJvY2VzcyBuZXcgc2luZ2xlICovCi0gICAgaWYgKHBfbGNiLT5wX3J4X21zZyAhPSBOVUxMKQotICAgICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJHb3Qgc2luZ2xlIGR1cmluZyByZWFzc2VtYmx5Iik7Ci0KLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9sY2ItPnBfcnhfbXNnKTsKLQotICAgIHBfcmV0ID0gcF9idWY7Ci0gIH0KLSAgLyogc3RhcnQgcGFja2V0ICovCi0gIGVsc2UgaWYgKHBrdF90eXBlID09IEFWQ1RfUEtUX1RZUEVfU1RBUlQpIHsKLSAgICAvKiBpZiByZWFzc2VtYmx5IGluIHByb2dyZXNzIGRyb3AgbWVzc2FnZSBhbmQgcHJvY2VzcyBuZXcgc3RhcnQgKi8KLSAgICBpZiAocF9sY2ItPnBfcnhfbXNnICE9IE5VTEwpCi0gICAgICBBVkNUX1RSQUNFX1dBUk5JTkcoIkdvdCBzdGFydCBkdXJpbmcgcmVhc3NlbWJseSIpOwotCi0gICAgb3NpX2ZyZWUocF9sY2ItPnBfcnhfbXNnKTsKLQotICAgIC8qCi0gICAgICogQWxsb2NhdGUgYmlnZ2VyIGJ1ZmZlciBmb3IgcmVhc3NlbWJseS4gQXMgbG93ZXIgbGF5ZXJzIGFyZQotICAgICAqIG5vdCBhd2FyZSBvZiBwb3NzaWJsZSBwYWNrZXQgc2l6ZSBhZnRlciByZWFzc2VtYmx5LCB0aGV5Ci0gICAgICogd291bGQgaGF2ZSBhbGxvY2F0ZWQgc21hbGxlciBidWZmZXIuCi0gICAgICovCi0gICAgcF9sY2ItPnBfcnhfbXNnID0gKEJUX0hEUiopb3NpX21hbGxvYyhCVF9ERUZBVUxUX0JVRkZFUl9TSVpFKTsKLSAgICBtZW1jcHkocF9sY2ItPnBfcnhfbXNnLCBwX2J1Ziwgc2l6ZW9mKEJUX0hEUikgKyBwX2J1Zi0+b2Zmc2V0ICsgcF9idWYtPmxlbik7Ci0KLSAgICAvKiBGcmVlIG9yaWdpbmFsIGJ1ZmZlciAqLwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgIC8qIHVwZGF0ZSBwIHRvIHBvaW50IHRvIG5ldyBidWZmZXIgKi8KLSAgICBwID0gKHVpbnQ4X3QqKShwX2xjYi0+cF9yeF9tc2cgKyAxKSArIHBfbGNiLT5wX3J4X21zZy0+b2Zmc2V0OwotCi0gICAgLyogY29weSBmaXJzdCBoZWFkZXIgYnl0ZSBvdmVyIG5vc3AgKi8KLSAgICAqKHAgKyAxKSA9ICpwOwotCi0gICAgLyogc2V0IG9mZnNldCB0byBwb2ludCB0byB3aGVyZSB0byBjb3B5IG5leHQgKi8KLSAgICBwX2xjYi0+cF9yeF9tc2ctPm9mZnNldCArPSBwX2xjYi0+cF9yeF9tc2ctPmxlbjsKLQotICAgIC8qIGFkanVzdCBsZW5ndGggZm9yIHBhY2tldCBoZWFkZXIgKi8KLSAgICBwX2xjYi0+cF9yeF9tc2ctPmxlbiAtPSAxOwotCi0gICAgcF9yZXQgPSBOVUxMOwotICB9Ci0gIC8qIGNvbnRpbnVlIG9yIGVuZCAqLwotICBlbHNlIHsKLSAgICAvKiBpZiBubyByZWFzc2VtYmx5IGluIHByb2dyZXNzIGRyb3AgbWVzc2FnZSAqLwotICAgIGlmIChwX2xjYi0+cF9yeF9tc2cgPT0gTlVMTCkgewotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJQa3QgdHlwZT0lZCBvdXQgb2Ygb3JkZXIiLCBwa3RfdHlwZSk7Ci0gICAgICBwX3JldCA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGdldCBzaXplIG9mIGJ1ZmZlciBob2xkaW5nIGFzc2VtYmxlZCBtZXNzYWdlICovCi0gICAgICAvKgotICAgICAgICogTk9URTogVGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYWJvdmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAqIHJlYXNzZW1ibHksIGFuZCBpcyBhbHdheXMgb2Ygc2l6ZSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFLgotICAgICAgICovCi0gICAgICB1aW50MTZfdCBidWZfbGVuID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIHNpemVvZihCVF9IRFIpOwotCi0gICAgICAvKiBhZGp1c3Qgb2Zmc2V0IGFuZCBsZW4gb2YgZnJhZ21lbnQgZm9yIGhlYWRlciBieXRlICovCi0gICAgICBwX2J1Zi0+b2Zmc2V0ICs9IEFWQ1RfSERSX0xFTl9DT05UOwotICAgICAgcF9idWYtPmxlbiAtPSBBVkNUX0hEUl9MRU5fQ09OVDsKLQotICAgICAgLyogdmVyaWZ5IGxlbmd0aCAqLwotICAgICAgaWYgKChwX2xjYi0+cF9yeF9tc2ctPm9mZnNldCArIHBfYnVmLT5sZW4pID4gYnVmX2xlbikgewotICAgICAgICAvKiB3b24ndCBmaXQ7IGZyZWUgZXZlcnl0aGluZyAqLwotICAgICAgICBBVkNUX1RSQUNFX1dBUk5JTkcoIiVzOiBGcmFnbWVudGVkIG1lc3NhZ2UgdG9vIGJpZyEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2xjYi0+cF9yeF9tc2cpOwotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICAgIHBfcmV0ID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGNvcHkgY29udGVudHMgb2YgcF9idWYgdG8gcF9yeF9tc2cgKi8KLSAgICAgICAgbWVtY3B5KCh1aW50OF90KikocF9sY2ItPnBfcnhfbXNnICsgMSkgKyBwX2xjYi0+cF9yeF9tc2ctPm9mZnNldCwKLSAgICAgICAgICAgICAgICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQsIHBfYnVmLT5sZW4pOwotCi0gICAgICAgIGlmIChwa3RfdHlwZSA9PSBBVkNUX1BLVF9UWVBFX0VORCkgewotICAgICAgICAgIHBfbGNiLT5wX3J4X21zZy0+b2Zmc2V0IC09IHBfbGNiLT5wX3J4X21zZy0+bGVuOwotICAgICAgICAgIHBfbGNiLT5wX3J4X21zZy0+bGVuICs9IHBfYnVmLT5sZW47Ci0gICAgICAgICAgcF9yZXQgPSBwX2xjYi0+cF9yeF9tc2c7Ci0gICAgICAgICAgcF9sY2ItPnBfcnhfbXNnID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwX2xjYi0+cF9yeF9tc2ctPm9mZnNldCArPSBwX2J1Zi0+bGVuOwotICAgICAgICAgIHBfbGNiLT5wX3J4X21zZy0+bGVuICs9IHBfYnVmLT5sZW47Ci0gICAgICAgICAgcF9yZXQgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBfcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfY2hubF9vcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPcGVuIEwyQ0FQIGNoYW5uZWwgdG8gcGVlcgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfY2hubF9vcGVuKHRBVkNUX0xDQiogcF9sY2IsIFVOVVNFRF9BVFRSIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB1aW50MTZfdCByZXN1bHQgPSBBVkNUX1JFU1VMVF9GQUlMOwotCi0gIHBfbGNiLT5jaF9zdGF0ZSA9IEFWQ1RfQ0hfQ09OTjsKLSAgcF9sY2ItPmNoX2xjaWQgPQotICAgICAgTDJDQV9Db25uZWN0UmVxMihBVkNUX1BTTSwgcF9sY2ItPnBlZXJfYWRkciwgQlRBX1NFQ19BVVRIRU5USUNBVEUpOwotICBpZiAocF9sY2ItPmNoX2xjaWQgPT0gMCkgewotICAgIC8qIGlmIGNvbm5lY3QgcmVxIGZhaWxlZCwgc2VuZCBvdXJzZWx2ZXMgY2xvc2UgZXZlbnQgKi8KLSAgICB0QVZDVF9MQ0JfRVZUIGF2Y3RfbGNiX2V2dDsKLSAgICBhdmN0X2xjYl9ldnQucmVzdWx0ID0gcmVzdWx0OwotICAgIGF2Y3RfbGNiX2V2ZW50KHBfbGNiLCBBVkNUX0xDQl9MTF9DTE9TRV9FVlQsICZhdmN0X2xjYl9ldnQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2xjYl91bmJpbmRfZGlzYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVhbGxvY2F0ZSBjY2IgYW5kIGNhbGwgY2FsbGJhY2sgd2l0aCBkaXNjb25uZWN0IGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfdW5iaW5kX2Rpc2MoVU5VU0VEX0FUVFIgdEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIGF2Y3RfY2NiX2RlYWxsb2MocF9kYXRhLT5wX2NjYiwgQVZDVF9ESVNDT05ORUNUX0NGTV9FVlQsIDAsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2Jfb3Blbl9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhbiBMTF9PUEVOIGV2ZW50LiAgRm9yIGVhY2ggYWxsb2NhdGVkIGNjYiBhbHJlYWR5Ci0gKiAgICAgICAgICAgICAgICAgIGJvdW5kIHRvIHRoaXMgbGNiLCBzZW5kIGEgY29ubmVjdCBldmVudC4gIEZvciBlYWNoCi0gKiAgICAgICAgICAgICAgICAgIHVuYm91bmQgY2NiIHdpdGggYSBuZXcgUElELCBiaW5kIHRoYXQgY2NiIHRvIHRoaXMgbGNiIGFuZAotICogICAgICAgICAgICAgICAgICBzZW5kIGEgY29ubmVjdCBldmVudC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX29wZW5faW5kKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB0QVZDVF9DQ0IqIHBfY2NiID0gJmF2Y3RfY2IuY2NiWzBdOwotICBpbnQgaTsKLSAgYm9vbCBiaW5kID0gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEFWQ1RfTlVNX0NPTk47IGkrKywgcF9jY2IrKykgewotICAgIC8qIGlmIGNjYiBhbGxvY2F0ZWQgYW5kICovCi0gICAgaWYgKHBfY2NiLT5hbGxvY2F0ZWQpIHsKLSAgICAgIC8qIGlmIGJvdW5kIHRvIHRoaXMgbGNiIHNlbmQgY29ubmVjdCBjb25maXJtIGV2ZW50ICovCi0gICAgICBpZiAocF9jY2ItPnBfbGNiID09IHBfbGNiKSB7Ci0gICAgICAgIGJpbmQgPSB0cnVlOwotICAgICAgICBMMkNBX1NldFR4UHJpb3JpdHkocF9sY2ItPmNoX2xjaWQsIEwyQ0FQX0NITkxfUFJJT1JJVFlfSElHSCk7Ci0gICAgICAgIHBfY2NiLT5jYy5wX2N0cmxfY2JhY2soYXZjdF9jY2JfdG9faWR4KHBfY2NiKSwgQVZDVF9DT05ORUNUX0NGTV9FVlQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfbGNiLT5wZWVyX2FkZHIpOwotICAgICAgfQotICAgICAgLyogaWYgdW5ib3VuZCBhY2NlcHRvciBhbmQgbGNiIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgY2NiIGZvciB0aGlzIFBJRCAqLwotICAgICAgZWxzZSBpZiAoKHBfY2NiLT5wX2xjYiA9PSBOVUxMKSAmJiAocF9jY2ItPmNjLnJvbGUgPT0gQVZDVF9BQ1ApICYmCi0gICAgICAgICAgICAgICAoYXZjdF9sY2JfaGFzX3BpZChwX2xjYiwgcF9jY2ItPmNjLnBpZCkgPT0gTlVMTCkpIHsKLSAgICAgICAgLyogYmluZCBjY2IgdG8gbGNiIGFuZCBzZW5kIGNvbm5lY3QgaW5kIGV2ZW50ICovCi0gICAgICAgIGJpbmQgPSB0cnVlOwotICAgICAgICBwX2NjYi0+cF9sY2IgPSBwX2xjYjsKLSAgICAgICAgTDJDQV9TZXRUeFByaW9yaXR5KHBfbGNiLT5jaF9sY2lkLCBMMkNBUF9DSE5MX1BSSU9SSVRZX0hJR0gpOwotICAgICAgICBwX2NjYi0+Y2MucF9jdHJsX2NiYWNrKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksIEFWQ1RfQ09OTkVDVF9JTkRfRVZULCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBpZiBubyBjY2JzIGJvdW5kIHRvIHRoaXMgbGNiLCBkaXNjb25uZWN0ICovCi0gIGlmICghYmluZCkgewotICAgIGF2Y3RfbGNiX2V2ZW50KHBfbGNiLCBBVkNUX0xDQl9JTlRfQ0xPU0VfRVZULCBwX2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2xjYl9vcGVuX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEwyQ0FQIGNoYW5uZWwgb3BlbiBhdHRlbXB0IGZhaWxlZC4gIERlYWxsb2NhdGUgYW55IGNjYnMKLSAqICAgICAgICAgICAgICAgICAgb24gdGhpcyBsY2IgYW5kIHNlbmQgY29ubmVjdCBjb25maXJtIGV2ZW50IHdpdGggZmFpbHVyZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX29wZW5fZmFpbCh0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWQ1RfQ0NCKiBwX2NjYiA9ICZhdmN0X2NiLmNjYlswXTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEFWQ1RfTlVNX0NPTk47IGkrKywgcF9jY2IrKykgewotICAgIGlmIChwX2NjYi0+YWxsb2NhdGVkICYmIChwX2NjYi0+cF9sY2IgPT0gcF9sY2IpKSB7Ci0gICAgICBhdmN0X2NjYl9kZWFsbG9jKHBfY2NiLCBBVkNUX0NPTk5FQ1RfQ0ZNX0VWVCwgcF9kYXRhLT5yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2Nsb3NlX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTDJDQVAgY2hhbm5lbCBjbG9zZWQgYnkgcGVlci4gIERlYWxsb2NhdGUgYW55IGluaXRpYXRvcgotICogICAgICAgICAgICAgICAgICBjY2JzIG9uIHRoaXMgbGNiIGFuZCBzZW5kIGRpc2Nvbm5lY3QgaW5kIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfY2xvc2VfaW5kKHRBVkNUX0xDQiogcF9sY2IsIFVOVVNFRF9BVFRSIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB0QVZDVF9DQ0IqIHBfY2NiID0gJmF2Y3RfY2IuY2NiWzBdOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQVZDVF9OVU1fQ09OTjsgaSsrLCBwX2NjYisrKSB7Ci0gICAgaWYgKHBfY2NiLT5hbGxvY2F0ZWQgJiYgKHBfY2NiLT5wX2xjYiA9PSBwX2xjYikpIHsKLSAgICAgIGlmIChwX2NjYi0+Y2Mucm9sZSA9PSBBVkNUX0lOVCkgewotICAgICAgICBhdmN0X2NjYl9kZWFsbG9jKHBfY2NiLCBBVkNUX0RJU0NPTk5FQ1RfSU5EX0VWVCwgMCwgJnBfbGNiLT5wZWVyX2FkZHIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9jY2ItPnBfbGNiID0gTlVMTDsKLSAgICAgICAgKCpwX2NjYi0+Y2MucF9jdHJsX2NiYWNrKShhdmN0X2NjYl90b19pZHgocF9jY2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ1RfRElTQ09OTkVDVF9JTkRfRVZULCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2Nsb3NlX2NmbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTDJDQVAgY2hhbm5lbCBjbG9zZWQgYnkgdXMuICBEZWFsbG9jYXRlIGFueSBpbml0aWF0b3IKLSAqICAgICAgICAgICAgICAgICAgY2NicyBvbiB0aGlzIGxjYiBhbmQgc2VuZCBkaXNjb25uZWN0IGluZCBvciBjZm0gZXZlbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2xjYl9jbG9zZV9jZm0odEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIGludCBpOwotICB1aW50OF90IGV2ZW50OwotCi0gIGZvciAoaSA9IDA7IGkgPCBBVkNUX05VTV9DT05OOyBpKyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmFsbG9jYXRlZCAmJiAocF9jY2ItPnBfbGNiID09IHBfbGNiKSkgewotICAgICAgLyogaWYgdGhpcyBjY2IgaW5pdGlhdGVkIGNsb3NlIHNlbmQgZGlzY29ubmVjdCBjZm0gb3RoZXJ3aXNlIGluZCAqLwotICAgICAgaWYgKHBfY2NiLT5jaF9jbG9zZSkgewotICAgICAgICBwX2NjYi0+Y2hfY2xvc2UgPSBmYWxzZTsKLSAgICAgICAgZXZlbnQgPSBBVkNUX0RJU0NPTk5FQ1RfQ0ZNX0VWVDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV2ZW50ID0gQVZDVF9ESVNDT05ORUNUX0lORF9FVlQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX2NjYi0+Y2Mucm9sZSA9PSBBVkNUX0lOVCkgewotICAgICAgICBhdmN0X2NjYl9kZWFsbG9jKHBfY2NiLCBldmVudCwgcF9kYXRhLT5yZXN1bHQsICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfY2NiLT5wX2xjYiA9IE5VTEw7Ci0gICAgICAgICgqcF9jY2ItPmNjLnBfY3RybF9jYmFjaykoYXZjdF9jY2JfdG9faWR4KHBfY2NiKSwgZXZlbnQsIHBfZGF0YS0+cmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2JpbmRfY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQmluZCBjY2IgdG8gbGNiIGFuZCBzZW5kIGNvbm5lY3QgY2ZtIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfYmluZF9jb25uKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICBwX2RhdGEtPnBfY2NiLT5wX2xjYiA9IHBfbGNiOwotICAoKnBfZGF0YS0+cF9jY2ItPmNjLnBfY3RybF9jYmFjaykoYXZjdF9jY2JfdG9faWR4KHBfZGF0YS0+cF9jY2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDVF9DT05ORUNUX0NGTV9FVlQsIDAsICZwX2xjYi0+cGVlcl9hZGRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2Noa19kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBIGNjYiB3YW50cyB0byBjbG9zZTsgaWYgaXQgaXMgdGhlIGxhc3QgY2NiIG9uIHRoaXMgbGNiLAotICogICAgICAgICAgICAgICAgICBjbG9zZSBjaGFubmVsLiAgT3RoZXJ3aXNlIGp1c3QgZGVhbGxvY2F0ZSBhbmQgY2FsbAotICogICAgICAgICAgICAgICAgICBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfY2hrX2Rpc2ModEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIGF2Y3RfY2xvc2VfYmNiKHBfbGNiLCBwX2RhdGEpOwotICBpZiAoYXZjdF9sY2JfbGFzdF9jY2IocF9sY2IsIHBfZGF0YS0+cF9jY2IpKSB7Ci0gICAgTE9HX0lORk8oIkNsb3NpbmcgbGFzdCBhdmN0IGNoYW5uZWwgdG8gZGV2aWNlIik7Ci0gICAgcF9kYXRhLT5wX2NjYi0+Y2hfY2xvc2UgPSB0cnVlOwotICAgIGF2Y3RfbGNiX2V2ZW50KHBfbGNiLCBBVkNUX0xDQl9JTlRfQ0xPU0VfRVZULCBwX2RhdGEpOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJDbG9zaW5nIGF2Y3QgY2hhbm5lbCB3aXRoIGFjdGl2ZSByZW1haW5pbmcgY2hhbm5lbHMiKTsKLSAgICBhdmN0X2xjYl91bmJpbmRfZGlzYyhwX2xjYiwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfY2hubF9kaXNjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjb25uZWN0IEwyQ0FQIGNoYW5uZWwuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2xjYl9jaG5sX2Rpc2ModEFWQ1RfTENCKiBwX2xjYiwgVU5VU0VEX0FUVFIgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIGF2Y3RfbDJjX2Rpc2Nvbm5lY3QocF9sY2ItPmNoX2xjaWQsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfYmluZF9mYWlsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZWFsbG9jYXRlIGNjYiBhbmQgY2FsbCBjYWxsYmFjayB3aXRoIGNvbm5lY3QgZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBmYWlsdXJlIHJlc3VsdC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX2JpbmRfZmFpbChVTlVTRURfQVRUUiB0QVZDVF9MQ0IqIHBfbGNiLCB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgYXZjdF9jY2JfZGVhbGxvYyhwX2RhdGEtPnBfY2NiLCBBVkNUX0NPTk5FQ1RfQ0ZNX0VWVCwgQVZDVF9SRVNVTFRfRkFJTCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2xjYl9jb25nX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGNvbmdlc3Rpb24gaW5kaWNhdGlvbiBmcm9tIEwyQ0FQLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfY29uZ19pbmQodEFWQ1RfTENCKiBwX2xjYiwgdEFWQ1RfTENCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkNUX0NDQiogcF9jY2IgPSAmYXZjdF9jYi5jY2JbMF07Ci0gIGludCBpOwotICB1aW50OF90IGV2ZW50OwotICBCVF9IRFIqIHBfYnVmOwotCi0gIC8qIHNldCBldmVudCAqLwotICBldmVudCA9IChwX2RhdGEtPmNvbmcpID8gQVZDVF9DT05HX0lORF9FVlQgOiBBVkNUX1VOQ09OR19JTkRfRVZUOwotICBwX2xjYi0+Y29uZyA9IHBfZGF0YS0+Y29uZzsKLSAgaWYgKCFwX2xjYi0+Y29uZyAmJiAhZml4ZWRfcXVldWVfaXNfZW1wdHkocF9sY2ItPnR4X3EpKSB7Ci0gICAgd2hpbGUgKCFwX2xjYi0+Y29uZyAmJgotICAgICAgICAgICAocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2xjYi0+dHhfcSkpICE9IE5VTEwpIHsKLSAgICAgIGlmIChMMkNBX0RhdGFXcml0ZShwX2xjYi0+Y2hfbGNpZCwgcF9idWYpID09IEwyQ0FQX0RXX0NPTkdFU1RFRCkgewotICAgICAgICBwX2xjYi0+Y29uZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc2VuZCBldmVudCB0byBhbGwgY2NicyBvbiB0aGlzIGxjYiAqLwotICBmb3IgKGkgPSAwOyBpIDwgQVZDVF9OVU1fQ09OTjsgaSsrLCBwX2NjYisrKSB7Ci0gICAgaWYgKHBfY2NiLT5hbGxvY2F0ZWQgJiYgKHBfY2NiLT5wX2xjYiA9PSBwX2xjYikpIHsKLSAgICAgICgqcF9jY2ItPmNjLnBfY3RybF9jYmFjaykoYXZjdF9jY2JfdG9faWR4KHBfY2NiKSwgZXZlbnQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2xjYi0+cGVlcl9hZGRyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2Rpc2NhcmRfbXNnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjYXJkIGEgbWVzc2FnZSBzZW50IGluIGZyb20gdGhlIEFQSS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX2Rpc2NhcmRfbXNnKFVOVVNFRF9BVFRSIHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICBBVkNUX1RSQUNFX1dBUk5JTkcoIiVzIERyb3BwaW5nIG1lc3NhZ2UiLCBfX2Z1bmNfXyk7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnVsX21zZy5wX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmN0X2xjYl9zZW5kX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gQVZDVFAgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2Y3RfbGNiX3NlbmRfbXNnKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB1aW50MTZfdCBjdXJyX21zZ19sZW47Ci0gIHVpbnQ4X3QgcGt0X3R5cGU7Ci0gIHVpbnQ4X3QgaGRyX2xlbjsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCBub3NwID0gMDsgLyogbnVtYmVyIG9mIHN1YnNlcXVlbnQgcGFja2V0cyAqLwotICB1aW50MTZfdCB0ZW1wOwotICB1aW50MTZfdCBidWZfc2l6ZSA9IHBfbGNiLT5wZWVyX210dSArIEwyQ0FQX01JTl9PRkZTRVQgKyBCVF9IRFJfU0laRTsKLQotICAvKiBzdG9yZSBtc2cgbGVuICovCi0gIGN1cnJfbXNnX2xlbiA9IHBfZGF0YS0+dWxfbXNnLnBfYnVmLT5sZW47Ci0KLSAgLyogaW5pdGlhbGl6ZSBwYWNrZXQgdHlwZSBhbmQgb3RoZXIgc3R1ZmYgKi8KLSAgaWYgKGN1cnJfbXNnX2xlbiA8PSAocF9sY2ItPnBlZXJfbXR1IC0gQVZDVF9IRFJfTEVOX1NJTkdMRSkpIHsKLSAgICBwa3RfdHlwZSA9IEFWQ1RfUEtUX1RZUEVfU0lOR0xFOwotICB9IGVsc2UgewotICAgIHBrdF90eXBlID0gQVZDVF9QS1RfVFlQRV9TVEFSVDsKLSAgICB0ZW1wID0gKGN1cnJfbXNnX2xlbiArIEFWQ1RfSERSX0xFTl9TVEFSVCAtIHBfbGNiLT5wZWVyX210dSk7Ci0gICAgbm9zcCA9IHRlbXAgLyAocF9sY2ItPnBlZXJfbXR1IC0gMSkgKyAxOwotICAgIGlmICgodGVtcCAlIChwX2xjYi0+cGVlcl9tdHUgLSAxKSkgIT0gMCkgbm9zcCsrOwotICB9Ci0KLSAgLyogd2hpbGUgd2UgaGF2ZW4ndCBzZW50IGFsbCBwYWNrZXRzICovCi0gIHdoaWxlIChjdXJyX21zZ19sZW4gIT0gMCkgewotICAgIEJUX0hEUiogcF9idWY7Ci0KLSAgICAvKiBzZXQgaGVhZGVyIGxlbiAqLwotICAgIGhkcl9sZW4gPSBhdmN0X2xjYl9wa3RfdHlwZV9sZW5bcGt0X3R5cGVdOwotCi0gICAgLyogaWYgcmVtYWluaW5nIG1zZyBtdXN0IGJlIGZyYWdtZW50ZWQgKi8KLSAgICBpZiAocF9kYXRhLT51bF9tc2cucF9idWYtPmxlbiA+IChwX2xjYi0+cGVlcl9tdHUgLSBoZHJfbGVuKSkgewotICAgICAgLyogZ2V0IGEgbmV3IGJ1ZmZlciBmb3IgZnJhZ21lbnQgd2UgYXJlIHNlbmRpbmcgKi8KLSAgICAgIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhidWZfc2l6ZSk7Ci0KLSAgICAgIC8qIGNvcHkgcG9ydGlvbiBvZiBkYXRhIGZyb20gY3VycmVudCBtZXNzYWdlIHRvIG5ldyBidWZmZXIgKi8KLSAgICAgIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUICsgaGRyX2xlbjsKLSAgICAgIHBfYnVmLT5sZW4gPSBwX2xjYi0+cGVlcl9tdHUgLSBoZHJfbGVuOwotCi0gICAgICBtZW1jcHkoCi0gICAgICAgICAgKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwKLSAgICAgICAgICAodWludDhfdCopKHBfZGF0YS0+dWxfbXNnLnBfYnVmICsgMSkgKyBwX2RhdGEtPnVsX21zZy5wX2J1Zi0+b2Zmc2V0LAotICAgICAgICAgIHBfYnVmLT5sZW4pOwotCi0gICAgICBwX2RhdGEtPnVsX21zZy5wX2J1Zi0+b2Zmc2V0ICs9IHBfYnVmLT5sZW47Ci0gICAgICBwX2RhdGEtPnVsX21zZy5wX2J1Zi0+bGVuIC09IHBfYnVmLT5sZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfYnVmID0gcF9kYXRhLT51bF9tc2cucF9idWY7Ci0gICAgfQotCi0gICAgY3Vycl9tc2dfbGVuIC09IHBfYnVmLT5sZW47Ci0KLSAgICAvKiBzZXQgdXAgdG8gYnVpbGQgaGVhZGVyICovCi0gICAgcF9idWYtPmxlbiArPSBoZHJfbGVuOwotICAgIHBfYnVmLT5vZmZzZXQgLT0gaGRyX2xlbjsKLSAgICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAgIC8qIGJ1aWxkIGhlYWRlciAqLwotICAgIEFWQ1RfQlVJTERfSERSKHAsIHBfZGF0YS0+dWxfbXNnLmxhYmVsLCBwa3RfdHlwZSwgcF9kYXRhLT51bF9tc2cuY3IpOwotICAgIGlmIChwa3RfdHlwZSA9PSBBVkNUX1BLVF9UWVBFX1NUQVJUKSB7Ci0gICAgICBVSU5UOF9UT19TVFJFQU0ocCwgbm9zcCk7Ci0gICAgfQotICAgIGlmICgocGt0X3R5cGUgPT0gQVZDVF9QS1RfVFlQRV9TVEFSVCkgfHwKLSAgICAgICAgKHBrdF90eXBlID09IEFWQ1RfUEtUX1RZUEVfU0lOR0xFKSkgewotICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwX2RhdGEtPnVsX21zZy5wX2NjYi0+Y2MucGlkKTsKLSAgICB9Ci0KLSAgICBpZiAocF9sY2ItPmNvbmcpIHsKLSAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUocF9sY2ItPnR4X3EsIHBfYnVmKTsKLSAgICB9Ci0KLSAgICAvKiBzZW5kIG1lc3NhZ2UgdG8gTDJDQVAgKi8KLSAgICBlbHNlIHsKLSAgICAgIGlmIChMMkNBX0RhdGFXcml0ZShwX2xjYi0+Y2hfbGNpZCwgcF9idWYpID09IEwyQ0FQX0RXX0NPTkdFU1RFRCkgewotICAgICAgICBwX2xjYi0+Y29uZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogdXBkYXRlIHBrdCB0eXBlIGZvciBuZXh0IHBhY2tldCAqLwotICAgIGlmIChjdXJyX21zZ19sZW4gPiAocF9sY2ItPnBlZXJfbXR1IC0gQVZDVF9IRFJfTEVOX0VORCkpIHsKLSAgICAgIHBrdF90eXBlID0gQVZDVF9QS1RfVFlQRV9DT05UOwotICAgIH0gZWxzZSB7Ci0gICAgICBwa3RfdHlwZSA9IEFWQ1RfUEtUX1RZUEVfRU5EOwotICAgIH0KLSAgfQotICBBVkNUX1RSQUNFX0RFQlVHKCIlcyB0eF9xX2NvdW50OiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgZml4ZWRfcXVldWVfbGVuZ3RoKHBfbGNiLT50eF9xKSk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2Y3RfbGNiX2ZyZWVfbXNnX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzY2FyZCBhbiBpbmNvbWluZyBBVkNUUCBtZXNzYWdlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZjdF9sY2JfZnJlZV9tc2dfaW5kKFVOVVNFRF9BVFRSIHRBVkNUX0xDQiogcF9sY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZDVF9MQ0JfRVZUKiBwX2RhdGEpIHsKLSAgaWYgKHBfZGF0YSA9PSBOVUxMKSByZXR1cm47Ci0KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZGF0YS0+cF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZjdF9sY2JfbXNnX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIGluY29taW5nIEFWQ1RQIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmN0X2xjYl9tc2dfaW5kKHRBVkNUX0xDQiogcF9sY2IsIHRBVkNUX0xDQl9FVlQqIHBfZGF0YSkgewotICB1aW50OF90KiBwOwotICB1aW50OF90IGxhYmVsLCB0eXBlLCBjcl9pcGlkOwotICB1aW50MTZfdCBwaWQ7Ci0gIHRBVkNUX0NDQiogcF9jY2I7Ci0KLSAgLyogdGhpcyBwX2J1ZiBpcyB0byBiZSByZXBvcnRlZCB0aHJvdWdoIHBfbXNnX2NiYWNrLiBUaGUgbGF5ZXJfc3BlY2lmaWMKLSAgICogbmVlZHMgdG8gYmUgc2V0IHByb3Blcmx5IHRvIGluZGljYXRlIHRoYXQgaXQgaXMgcmVjZWl2ZWQgdGhyb3VnaAotICAgKiBjb250cm9sIGNoYW5uZWwgKi8KLSAgcF9kYXRhLT5wX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBBVkNUX0RBVEFfQ1RSTDsKLQotICAvKiByZWFzc2VtYmxlIG1lc3NhZ2U7IGlmIG5vIG1lc3NhZ2UgYXZhaWxhYmxlICh3ZSByZWNlaXZlZCBhIGZyYWdtZW50KSByZXR1cm4KLSAgICovCi0gIHBfZGF0YS0+cF9idWYgPSBhdmN0X2xjYl9tc2dfYXNtYmwocF9sY2IsIHBfZGF0YS0+cF9idWYpOwotICBpZiAocF9kYXRhLT5wX2J1ZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9kYXRhLT5wX2J1ZiArIDEpICsgcF9kYXRhLT5wX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIHBhcnNlIGhlYWRlciBieXRlICovCi0gIEFWQ1RfUEFSU0VfSERSKHAsIGxhYmVsLCB0eXBlLCBjcl9pcGlkKTsKLQotICAvKiBjaGVjayBmb3IgaW52YWxpZCBjcl9pcGlkICovCi0gIGlmIChjcl9pcGlkID09IEFWQ1RfQ1JfSVBJRF9JTlZBTElEKSB7Ci0gICAgQVZDVF9UUkFDRV9XQVJOSU5HKCJJbnZhbGlkIGNyX2lwaWQiLCBjcl9pcGlkKTsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5wX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogcGFyc2UgYW5kIGxvb2t1cCBQSUQgKi8KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihwaWQsIHApOwotICBwX2NjYiA9IGF2Y3RfbGNiX2hhc19waWQocF9sY2IsIHBpZCk7Ci0gIGlmIChwX2NjYikgewotICAgIC8qIFBJRCBmb3VuZDsgc2VuZCBtc2cgdXAsIGFkanVzdCBidCBoZHIgYW5kIGNhbGwgbXNnIGNhbGxiYWNrICovCi0gICAgcF9kYXRhLT5wX2J1Zi0+b2Zmc2V0ICs9IEFWQ1RfSERSX0xFTl9TSU5HTEU7Ci0gICAgcF9kYXRhLT5wX2J1Zi0+bGVuIC09IEFWQ1RfSERSX0xFTl9TSU5HTEU7Ci0gICAgKCpwX2NjYi0+Y2MucF9tc2dfY2JhY2spKGF2Y3RfY2NiX3RvX2lkeChwX2NjYiksIGxhYmVsLCBjcl9pcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPnBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBQSUQgbm90IGZvdW5kOyBkcm9wIG1lc3NhZ2UgKi8KLSAgQVZDVF9UUkFDRV9XQVJOSU5HKCJObyBjY2IgZm9yIFBJRD0leCIsIHBpZCk7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnBfYnVmKTsKLQotICAvKiBpZiBjb21tYW5kIHNlbmQgcmVqZWN0ICovCi0gIGlmIChjcl9pcGlkID09IEFWQ1RfQ01EKSB7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQVZDVF9DTURfQlVGX1NJWkUpOwotICAgIHBfYnVmLT5sZW4gPSBBVkNUX0hEUl9MRU5fU0lOR0xFOwotICAgIHBfYnVmLT5vZmZzZXQgPSBBVkNUX01TR19PRkZTRVQgLSBBVkNUX0hEUl9MRU5fU0lOR0xFOwotICAgIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICAgIEFWQ1RfQlVJTERfSERSKHAsIGxhYmVsLCBBVkNUX1BLVF9UWVBFX1NJTkdMRSwgQVZDVF9SRUopOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcGlkKTsKLSAgICBMMkNBX0RhdGFXcml0ZShwX2xjYi0+Y2hfbGNpZCwgcF9idWYpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdmR0L2F2ZHRfYWQuY2MgYi9zdGFjay9hdmR0L2F2ZHRfYWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmIxMjkuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZkdC9hdmR0X2FkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIEFWRFRQIGFkYXB0aW9uIGxheWVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2ZHRfYXBpLmgiCi0jaW5jbHVkZSAiYXZkdF9pbnQuaCIKLSNpbmNsdWRlICJhdmR0Y19hcGkuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1BdmR0cFNjYiogQXZkdHBBZGFwdGF0aW9uTGF5ZXI6Okxvb2t1cEF2ZHRwU2NiKAotICAgIGNvbnN0IEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCYgdGMpIHsKLSAgaWYgKHRjLmNjYl9pZHggPj0gQVZEVF9OVU1fTElOS1MpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogQXZkdHBTY2IgZW50cnkgbm90IGZvdW5kOiBpbnZhbGlkIGNjYl9pZHg6JWQiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRjLmNjYl9pZHgpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmICh0Yy50Y2lkID49IEFWRFRfTlVNX1JUX1RCTCkgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiBBdmR0cFNjYiBlbnRyeSBub3QgZm91bmQ6IGludmFsaWQgdGNpZDolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgdGMudGNpZCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgY29uc3QgQXZkdHBSb3V0aW5nRW50cnkmIHJlID0gcnRfdGJsW3RjLmNjYl9pZHhdW3RjLnRjaWRdOwotICBBVkRUX1RSQUNFX0RFQlVHKCIlczogY2NiX2lkeDolZCB0Y2lkOiVkIHNjYl9oZGw6JWQiLCBfX2Z1bmNfXywgdGMuY2NiX2lkeCwKLSAgICAgICAgICAgICAgICAgICB0Yy50Y2lkLCByZS5zY2JfaGRsKTsKLSAgcmV0dXJuIGF2ZHRfc2NiX2J5X2hkbChyZS5zY2JfaGRsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfYWRfdHlwZV90b190Y2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZXJpdmVzIHRoZSBUQ0lEIGZyb20gdGhlIGNoYW5uZWwgdHlwZSBhbmQgU0NCLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRDSUQgdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYXZkdF9hZF90eXBlX3RvX3RjaWQodWludDhfdCB0eXBlLCBBdmR0cFNjYiogcF9zY2IpIHsKLSAgaWYgKHR5cGUgPT0gQVZEVF9DSEFOX1NJRykgewotICAgIHJldHVybiAwOwotICB9Ci0gIC8vIFRoZSBTQ0IgSGFuZGxlIGlzIHVuaXF1ZSBpbiB0aGUgWzEsIEFWRFRfTlVNX0xJTktTICogQVZEVF9OVU1fU0VQU10KLSAgLy8gcmFuZ2UuIFRoZSBzY2JfaWR4IGNvbXB1dGVkIGhlcmUgaXMgdGhlIFNDQiBpbmRleCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKLSAgLy8gU0VQLCBhbmQgaXQgaXMgaW4gdGhlIHJhbmdlIFswLCBBVkRUX05VTV9TRVBTKSBmb3IgYSBwYXJ0aWN1bGFyIGxpbmsuCi0gIHVpbnQ4X3Qgc2NiX2lkeCA9IChhdmR0X3NjYl90b19oZGwocF9zY2IpIC0gMSkgJSBBVkRUX05VTV9MSU5LUzsKLSAgLy8gVGhlcmUgYXJlIEFWRFRfQ0hBTl9OVU1fVFlQRVMgY2hhbm5lbCB0eXBlcyBwZXIgU0VQLiBIZXJlIHdlIGNvbXB1dGUKLSAgLy8gdGhlIHR5cGUgaW5kZXggKFRDSUQpIGZyb20gdGhlIFNFUCBpbmRleCBhbmQgdGhlIHR5cGUgaXRzZWxmLgotICB1aW50OF90IHRjaWQgPSAoc2NiX2lkeCAqIChBVkRUX0NIQU5fTlVNX1RZUEVTIC0gMSkpICsgdHlwZTsKLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IHR5cGU6JWQsIHRjaWQ6ICVkIiwgX19mdW5jX18sIHR5cGUsIHRjaWQpOwotICByZXR1cm4gdGNpZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfYWRfdGNpZF90b190eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZXJpdmVzIHRoZSBjaGFubmVsIHR5cGUgZnJvbSB0aGUgVENJRC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBDaGFubmVsIHR5cGUgdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGF2ZHRfYWRfdGNpZF90b190eXBlKHVpbnQ4X3QgdGNpZCkgewotICB1aW50OF90IHR5cGU7Ci0KLSAgaWYgKHRjaWQgPT0gMCkgewotICAgIHR5cGUgPSBBVkRUX0NIQU5fU0lHOwotICB9IGVsc2UgewotICAgIC8qIHRjaWQgdHJhbnNsYXRlcyB0byB0eXBlIGJhc2VkIG9uIG51bWJlciBvZiBjaGFubmVscywgYXMgZm9sbG93czoKLSAgICAqKiBvbmx5IG1lZGlhIGNoYW5uZWwgICA6ICB0Y2lkPTEsMiwzLDQsNSw2Li4uICB0eXBlPTEsMSwxLDEsMSwxLi4uCi0gICAgKiogbWVkaWEgYW5kIHJlcG9ydCAgICAgOiAgdGNpZD0xLDIsMyw0LDUsNi4uLiAgdHlwZT0xLDIsMSwyLDEsMi4uLgotICAgICoqIG1lZGlhLCByZXBvcnQsIHJlY292IDogIHRjaWQ9MSwyLDMsNCw1LDYuLi4gIHR5cGU9MSwyLDMsMSwyLDMuLi4KLSAgICAqLwotICAgIHR5cGUgPSAoKHRjaWQgKyBBVkRUX0NIQU5fTlVNX1RZUEVTIC0gMikgJSAoQVZEVF9DSEFOX05VTV9UWVBFUyAtIDEpKSArIDE7Ci0gIH0KLSAgQVZEVF9UUkFDRV9ERUJVRygidGNpZDogJWQsIHR5cGU6ICVkIiwgdGNpZCwgdHlwZSk7Ci0gIHJldHVybiB0eXBlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9hZF9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplIGFkYXB0aW9uIGxheWVyLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9hZF9pbml0KHZvaWQpIHsKLSAgaW50IGk7Ci0gIEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwgPSBhdmR0cF9jYi5hZC50Y190Ymw7Ci0gIGF2ZHRwX2NiLmFkLlJlc2V0KCk7Ci0KLSAgLyogbWFrZSBzdXJlIHRoZSBwZWVyX210dSBpcyBhIHZhbGlkIHZhbHVlICovCi0gIGZvciAoaSA9IDA7IGkgPCBBVkRUX05VTV9UQ19UQkw7IGkrKywgcF90YmwrKykgewotICAgIHBfdGJsLT5wZWVyX210dSA9IEwyQ0FQX0RFRkFVTFRfTVRVOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3RjX3RibF9ieV9zdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRmluZCBhZGFwdGlvbiBsYXllciB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSBlbnRyeSBtYXRjaGluZwotICogICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gc3RhdGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byBtYXRjaGluZyBlbnRyeS4gIEZvciBjb250cm9sIGNoYW5uZWwgaXQgcmV0dXJucwotICogICAgICAgICAgICAgICAgICB0aGUgbWF0Y2hpbmcgZW50cnkuICBGb3IgbWVkaWEgb3Igb3RoZXIgaXQgcmV0dXJucyB0aGUKLSAqICAgICAgICAgICAgICAgICAgZmlyc3QgbWF0Y2hpbmcgZW50cnkgKHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BdmR0cFRyYW5zcG9ydENoYW5uZWwqIGF2ZHRfYWRfdGNfdGJsX2J5X3N0KHVpbnQ4X3QgdHlwZSwgQXZkdHBDY2IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXRlKSB7Ci0gIGludCBpOwotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsID0gYXZkdHBfY2IuYWQudGNfdGJsOwotICB1aW50OF90IGNjYl9pZHg7Ci0KLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICAvKiByZXNlbmRpbmcgc2VjdXJpdHkgcmVxICovCi0gICAgZm9yIChpID0gMDsgaSA8IEFWRFRfTlVNX1RDX1RCTDsgaSsrLCBwX3RibCsrKSB7Ci0gICAgICAvKiBtdXN0IGJlIEFWRFRfQ0hBTl9TSUcgLSB0Y2lkIGFsd2F5cyB6ZXJvICovCi0gICAgICBpZiAoKHBfdGJsLT50Y2lkID09IDApICYmIChwX3RibC0+c3RhdGUgPT0gc3RhdGUpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjY2JfaWR4ID0gYXZkdF9jY2JfdG9faWR4KHBfY2NiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBBVkRUX05VTV9UQ19UQkw7IGkrKywgcF90YmwrKykgewotICAgICAgaWYgKHR5cGUgPT0gQVZEVF9DSEFOX1NJRykgewotICAgICAgICAvKiBpZiBjb250cm9sIGNoYW5uZWwsIHRjaWQgYWx3YXlzIHplcm8gKi8KLSAgICAgICAgaWYgKChwX3RibC0+dGNpZCA9PSAwKSAmJiAocF90YmwtPmNjYl9pZHggPT0gY2NiX2lkeCkgJiYKLSAgICAgICAgICAgIChwX3RibC0+c3RhdGUgPT0gc3RhdGUpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGlmIG90aGVyIGNoYW5uZWwsIHRjaWQgaXMgYWx3YXlzID4gemVybyAqLwotICAgICAgICBpZiAoKHBfdGJsLT50Y2lkID4gMCkgJiYgKHBfdGJsLT5jY2JfaWR4ID09IGNjYl9pZHgpICYmCi0gICAgICAgICAgICAocF90YmwtPnN0YXRlID09IHN0YXRlKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogaWYgbm90aGluZyBmb3VuZCByZXR1cm4gbnVsbCAqLwotICBpZiAoaSA9PSBBVkRUX05VTV9UQ19UQkwpIHsKLSAgICBwX3RibCA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4gcF90Ymw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3RjX3RibF9ieV9sY2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGaW5kIGFkYXB0aW9uIGxheWVyIHRyYW5zcG9ydCBjaGFubmVsIHRhYmxlIGVudHJ5IGJ5IExDSUQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byBlbnRyeS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBhdmR0X2FkX3RjX3RibF9ieV9sY2lkKHVpbnQxNl90IGxjaWQpIHsKLSAgaWYgKGF2ZHRwX2NiLmFkLmxjaWRfdGJsLmNvdW50KGxjaWQpICE9IDApIHsKLSAgICB1aW50OF90IGlkeCA9IGF2ZHRwX2NiLmFkLmxjaWRfdGJsW2xjaWRdOwotICAgIHJldHVybiAmYXZkdHBfY2IuYWQudGNfdGJsW2lkeF07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfYWRfdGNfdGJsX2J5X3R5cGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSBlbnRyeQotICogICAgICAgICAgICAgICAgICBmb3IgYSBwYXJ0aWN1bGFyIGNoYW5uZWwuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSBlbnRyeS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBhdmR0X2FkX3RjX3RibF9ieV90eXBlKHVpbnQ4X3QgdHlwZSwgQXZkdHBDY2IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZHRwU2NiKiBwX3NjYikgewotICB1aW50OF90IHRjaWQ7Ci0gIGludCBpOwotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsID0gYXZkdHBfY2IuYWQudGNfdGJsOwotICB1aW50OF90IGNjYl9pZHggPSBhdmR0X2NjYl90b19pZHgocF9jY2IpOwotCi0gIC8qIGdldCB0Y2lkIGZyb20gdHlwZSwgc2NiICovCi0gIHRjaWQgPSBhdmR0X2FkX3R5cGVfdG9fdGNpZCh0eXBlLCBwX3NjYik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEFWRFRfTlVNX1RDX1RCTDsgaSsrLCBwX3RibCsrKSB7Ci0gICAgaWYgKChwX3RibC0+dGNpZCA9PSB0Y2lkKSAmJiAocF90YmwtPmNjYl9pZHggPT0gY2NiX2lkeCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIENIRUNLKGkgIT0gQVZEVF9OVU1fVENfVEJMKTsKLQotICByZXR1cm4gcF90Ymw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3RjX3RibF9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWxsb2NhdGUgYW4gZW50cnkgaW4gdGhlIHRyYWZmaWMgY2hhbm5lbCB0YWJsZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIGVudHJ5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BdmR0cFRyYW5zcG9ydENoYW5uZWwqIGF2ZHRfYWRfdGNfdGJsX2FsbG9jKEF2ZHRwQ2NiKiBwX2NjYikgewotICBpbnQgaTsKLSAgQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBwX3RibCA9IGF2ZHRwX2NiLmFkLnRjX3RibDsKLQotICAvKiBmaW5kIG5leHQgZnJlZSBlbnRyeSBpbiB0YyB0YWJsZSAqLwotICBmb3IgKGkgPSAwOyBpIDwgQVZEVF9OVU1fVENfVEJMOyBpKyssIHBfdGJsKyspIHsKLSAgICBpZiAocF90YmwtPnN0YXRlID09IEFWRFRfQURfU1RfVU5VU0VEKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgQ0hFQ0soaSAhPSBBVkRUX05VTV9UQ19UQkwpOwotCi0gIC8qIGluaXRpYWxpemUgZW50cnkgKi8KLSAgcF90YmwtPnBlZXJfbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7Ci0gIHBfdGJsLT5jZmdfZmxhZ3MgPSAwOwotICBwX3RibC0+Y2NiX2lkeCA9IGF2ZHRfY2NiX3RvX2lkeChwX2NjYik7Ci0gIHBfdGJsLT5zdGF0ZSA9IEFWRFRfQURfU1RfSURMRTsKLSAgcmV0dXJuIHBfdGJsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9hZF90Y190YmxfdG9faWR4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDb252ZXJ0IGEgdHJhbnNwb3J0IGNoYW5uZWwgdGFibGUgZW50cnkgdG8gYW4gaW5kZXguCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgSW5kZXggdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYXZkdF9hZF90Y190YmxfdG9faWR4KEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwpIHsKLSAgQVZEVF9UUkFDRV9ERUJVRygiYXZkdF9hZF90Y190YmxfdG9faWR4OiAlZCIsIChwX3RibCAtIGF2ZHRwX2NiLmFkLnRjX3RibCkpOwotICAvKiB1c2UgYXJyYXkgYXJpdGhtZXRpYyB0byBkZXRlcm1pbmUgaW5kZXggKi8KLSAgcmV0dXJuICh1aW50OF90KShwX3RibCAtIGF2ZHRwX2NiLmFkLnRjX3RibCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3RjX2Nsb3NlX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEwyQ0FQIGludGVyZmFjZSB3aGVuIHRoZQotICogICAgICAgICAgICAgICAgICBMMkNBUCBjaGFubmVsIGlzIGNsb3NlZC4gIEl0IGxvb2tzIHVwIHRoZSBDQ0Igb3IgU0NCIGZvcgotICogICAgICAgICAgICAgICAgICB0aGUgY2hhbm5lbCBhbmQgc2VuZHMgaXQgYSBjbG9zZSBldmVudC4gIFRoZSByZWFzb24KLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHRoZSBzYW1lIHZhbHVlIHBhc3NlZCBieSB0aGUgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2FkX3RjX2Nsb3NlX2luZChBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYjsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICB0QVZEVF9TQ0JfVENfQ0xPU0UgY2xvc2U7Ci0KLSAgY2xvc2Uub2xkX3RjX3N0YXRlID0gcF90YmwtPnN0YXRlOwotICAvKiBjbGVhciBhdmR0X2FkX3RjX3RibCBlbnRyeSAqLwotICBwX3RibC0+c3RhdGUgPSBBVkRUX0FEX1NUX1VOVVNFRDsKLSAgcF90YmwtPmNmZ19mbGFncyA9IDA7Ci0gIHBfdGJsLT5wZWVyX210dSA9IEwyQ0FQX0RFRkFVTFRfTVRVOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiB0Y2lkOiAlZCwgb2xkOiAlZCIsIF9fZnVuY19fLCBwX3RibC0+dGNpZCwKLSAgICAgICAgICAgICAgICAgICBjbG9zZS5vbGRfdGNfc3RhdGUpOwotICAvKiBpZiBzaWduYWxpbmcgY2hhbm5lbCwgbm90aWZ5IGNjYiB0aGF0IGNoYW5uZWwgb3BlbiAqLwotICBpZiAocF90YmwtPnRjaWQgPT0gMCkgewotICAgIHBfY2NiID0gYXZkdF9jY2JfYnlfaWR4KHBfdGJsLT5jY2JfaWR4KTsKLSAgICBhdmR0X2NjYl9ldmVudChwX2NjYiwgQVZEVF9DQ0JfTExfQ0xPU0VfRVZULCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogaWYgbWVkaWEgb3Igb3RoZXIgY2hhbm5lbCwgbm90aWZ5IHNjYiB0aGF0IGNoYW5uZWwgY2xvc2UgKi8KLSAgLyogbG9vayB1cCBzY2IgaW4gc3RyZWFtIHJvdXRpbmcgdGFibGUgYnkgY2NiLCB0Y2lkICovCi0gIHBfc2NiID0gYXZkdHBfY2IuYWQuTG9va3VwQXZkdHBTY2IoKnBfdGJsKTsKLSAgaWYgKHBfc2NiID09IG51bGxwdHIpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IGZpbmQgQXZkdFNjYiBlbnRyeTogY2NiX2lkeDolZCB0Y2lkOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3RibC0+Y2NiX2lkeCwgcF90YmwtPnRjaWQpOwotICAgIHJldHVybjsKLSAgfQotICBjbG9zZS50Y2lkID0gcF90YmwtPnRjaWQ7Ci0gIGNsb3NlLnR5cGUgPSBhdmR0X2FkX3RjaWRfdG9fdHlwZShwX3RibC0+dGNpZCk7Ci0gIHRBVkRUX1NDQl9FVlQgYXZkdF9zY2JfZXZ0OwotICBhdmR0X3NjYl9ldnQuY2xvc2UgPSBjbG9zZTsKLSAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX1RDX0NMT1NFX0VWVCwgJmF2ZHRfc2NiX2V2dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3RjX29wZW5faW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgTDJDQVAgaW50ZXJmYWNlIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIEwyQ0FQIGNoYW5uZWwgaXMgb3BlbmVkLiAgSXQgbG9va3MgdXAgdGhlIENDQiBvciBTQ0IKLSAqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBjaGFubmVsIGFuZCBzZW5kcyBpdCBhbiBvcGVuIGV2ZW50LgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9hZF90Y19vcGVuX2luZChBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYjsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICB0QVZEVF9PUEVOIG9wZW47Ci0gIHRBVkRUX0VWVF9IRFIgZXZ0OwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBwX3RibDolcCBzdGF0ZTolZCBjY2JfaWR4OiVkIHRjaWQ6JWQgc2NiX2hkbDolZCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfdGJsLCBwX3RibC0+c3RhdGUsIHBfdGJsLT5jY2JfaWR4LCBwX3RibC0+dGNpZCwKLSAgICAgICAgICAgICAgICAgICBhdmR0cF9jYi5hZC5ydF90YmxbcF90YmwtPmNjYl9pZHhdW3BfdGJsLT50Y2lkXS5zY2JfaGRsKTsKLQotICBwX3RibC0+c3RhdGUgPSBBVkRUX0FEX1NUX09QRU47Ci0KLSAgLyogaWYgc2lnbmFsaW5nIGNoYW5uZWwsIG5vdGlmeSBjY2IgdGhhdCBjaGFubmVsIG9wZW4gKi8KLSAgaWYgKHBfdGJsLT50Y2lkID09IDApIHsKLSAgICAvKiBzZXQgdGhlIHNpZ25hbCBjaGFubmVsIHRvIHVzZSBoaWdoIHByaW9yaXR5IHdpdGhpbiB0aGUgQUNMIGxpbmsgKi8KLSAgICBMMkNBX1NldFR4UHJpb3JpdHkoYXZkdHBfY2IuYWQucnRfdGJsW3BfdGJsLT5jY2JfaWR4XVtBVkRUX0NIQU5fU0lHXS5sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DSE5MX1BSSU9SSVRZX0hJR0gpOwotCi0gICAgcF9jY2IgPSBhdmR0X2NjYl9ieV9pZHgocF90YmwtPmNjYl9pZHgpOwotICAgIC8qIHVzZSBlcnJfcGFyYW0gdG8gaW5kaWNhdGUgdGhlIHJvbGUgb2YgY29ubmVjdGlvbi4KLSAgICAgKiBBVkRUX0FDUCwgaWYgQUNQICovCi0gICAgZXZ0LmVycl9wYXJhbSA9IEFWRFRfSU5UOwotICAgIGlmIChwX3RibC0+Y2ZnX2ZsYWdzICYgQVZEVF9MMkNfQ0ZHX0NPTk5fQUNQKSB7Ci0gICAgICBldnQuZXJyX3BhcmFtID0gQVZEVF9BQ1A7Ci0gICAgfQotICAgIHRBVkRUX0NDQl9FVlQgYXZkdF9jY2JfZXZ0OwotICAgIGF2ZHRfY2NiX2V2dC5tc2cuaGRyID0gZXZ0OwotICAgIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9MTF9PUEVOX0VWVCwgJmF2ZHRfY2NiX2V2dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIGlmIG1lZGlhIG9yIG90aGVyIGNoYW5uZWwsIG5vdGlmeSBzY2IgdGhhdCBjaGFubmVsIG9wZW4gKi8KLSAgLyogbG9vayB1cCBzY2IgaW4gc3RyZWFtIHJvdXRpbmcgdGFibGUgYnkgY2NiLCB0Y2lkICovCi0gIHBfc2NiID0gYXZkdHBfY2IuYWQuTG9va3VwQXZkdHBTY2IoKnBfdGJsKTsKLSAgaWYgKHBfc2NiID09IG51bGxwdHIpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogQ2Fubm90IGZpbmQgQXZkdFNjYiBlbnRyeTogY2NiX2lkeDolZCB0Y2lkOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3RibC0+Y2NiX2lkeCwgcF90YmwtPnRjaWQpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBwdXQgbGNpZCBpbiBldmVudCBkYXRhICovCi0gIG9wZW4ucGVlcl9tdHUgPSBwX3RibC0+cGVlcl9tdHU7Ci0gIG9wZW4ubGNpZCA9IGF2ZHRwX2NiLmFkLnJ0X3RibFtwX3RibC0+Y2NiX2lkeF1bcF90YmwtPnRjaWRdLmxjaWQ7Ci0gIG9wZW4uaGRyLmVycl9jb2RlID0gYXZkdF9hZF90Y2lkX3RvX3R5cGUocF90YmwtPnRjaWQpOwotICB0QVZEVF9TQ0JfRVZUIGF2ZHRfc2NiX2V2dDsKLSAgYXZkdF9zY2JfZXZ0Lm9wZW4gPSBvcGVuOwotICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfVENfT1BFTl9FVlQsICZhdmR0X3NjYl9ldnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9hZF90Y19jb25nX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEwyQ0FQIGludGVyZmFjZSBsYXllciB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQIGNhbGxzIHRoZSBjb25nZXN0aW9uIGNhbGxiYWNrLiAgSXQgbG9va3MgdXAgdGhlIENDQgotICogICAgICAgICAgICAgICAgICBvciBTQ0IgZm9yIHRoZSBjaGFubmVsIGFuZCBzZW5kcyBpdCBhIGNvbmdlc3Rpb24gZXZlbnQuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBpc19jb25nZXN0ZWQgcGFyYW1ldGVyIGlzIHRoZSBzYW1lIHZhbHVlIHBhc3NlZCBieQotICogICAgICAgICAgICAgICAgICB0aGUgTDJDQVAgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2FkX3RjX2NvbmdfaW5kKEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwsIGJvb2wgaXNfY29uZ2VzdGVkKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYjsKLSAgQXZkdHBTY2IqIHBfc2NiOwotCi0gIC8qIGlmIHNpZ25hbGluZyBjaGFubmVsLCBub3RpZnkgY2NiIG9mIGNvbmdlc3Rpb24gKi8KLSAgaWYgKHBfdGJsLT50Y2lkID09IDApIHsKLSAgICBwX2NjYiA9IGF2ZHRfY2NiX2J5X2lkeChwX3RibC0+Y2NiX2lkeCk7Ci0gICAgdEFWRFRfQ0NCX0VWVCBhdmR0X2NjYl9ldnQ7Ci0gICAgYXZkdF9jY2JfZXZ0LmxsY29uZyA9IGlzX2Nvbmdlc3RlZDsKLSAgICBhdmR0X2NjYl9ldmVudChwX2NjYiwgQVZEVF9DQ0JfTExfQ09OR19FVlQsICZhdmR0X2NjYl9ldnQpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBpZiBtZWRpYSBvciBvdGhlciBjaGFubmVsLCBub3RpZnkgc2NiIHRoYXQgY2hhbm5lbCBvcGVuICovCi0gIC8qIGxvb2sgdXAgc2NiIGluIHN0cmVhbSByb3V0aW5nIHRhYmxlIGJ5IGNjYiwgdGNpZCAqLwotICBwX3NjYiA9IGF2ZHRwX2NiLmFkLkxvb2t1cEF2ZHRwU2NiKCpwX3RibCk7Ci0gIGlmIChwX3NjYiA9PSBudWxscHRyKSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IENhbm5vdCBmaW5kIEF2ZHRTY2IgZW50cnk6IGNjYl9pZHg6JWQgdGNpZDolZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF90YmwtPmNjYl9pZHgsIHBfdGJsLT50Y2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdEFWRFRfU0NCX0VWVCBhdmR0X3NjYl9ldnQ7Ci0gIGF2ZHRfc2NiX2V2dC5sbGNvbmcgPSBpc19jb25nZXN0ZWQ7Ci0gIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9UQ19DT05HX0VWVCwgJmF2ZHRfc2NiX2V2dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3RjX2RhdGFfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgTDJDQVAgaW50ZXJmYWNlIGxheWVyIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgaW5jb21pbmcgZGF0YSBpcyByZWNlaXZlZCBmcm9tIEwyQ0FQLiAgSXQgbG9va3MgdXAgdGhlIENDQgotICogICAgICAgICAgICAgICAgICBvciBTQ0IgZm9yIHRoZSBjaGFubmVsIGFuZCByb3V0ZXMgdGhlIGRhdGEgYWNjb3JkaW5nbHkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2FkX3RjX2RhdGFfaW5kKEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwsIEJUX0hEUiogcF9idWYpIHsKLSAgQXZkdHBDY2IqIHBfY2NiOwotICBBdmR0cFNjYiogcF9zY2I7Ci0KLSAgLyogc3RvcmUgdHlwZSAobWVkaWEsIHJlY292ZXJ5LCByZXBvcnRpbmcpICovCi0gIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGF2ZHRfYWRfdGNpZF90b190eXBlKHBfdGJsLT50Y2lkKTsKLQotICAvKiBpZiBzaWduYWxpbmcgY2hhbm5lbCwgaGFuZGxlIGNvbnRyb2wgbWVzc2FnZSAqLwotICBpZiAocF90YmwtPnRjaWQgPT0gMCkgewotICAgIHBfY2NiID0gYXZkdF9jY2JfYnlfaWR4KHBfdGJsLT5jY2JfaWR4KTsKLSAgICBhdmR0X21zZ19pbmQocF9jY2IsIHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogaWYgbWVkaWEgb3Igb3RoZXIgY2hhbm5lbCwgc2VuZCBldmVudCB0byBzY2IgKi8KLSAgcF9zY2IgPSBhdmR0cF9jYi5hZC5Mb29rdXBBdmR0cFNjYigqcF90YmwpOwotICBpZiAocF9zY2IgPT0gbnVsbHB0cikgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiBDYW5ub3QgZmluZCBBdmR0U2NiIGVudHJ5OiBjY2JfaWR4OiVkIHRjaWQ6JWQiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfdGJsLT5jY2JfaWR4LCBwX3RibC0+dGNpZCk7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiBidWZmZXIgZnJlZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9UQ19EQVRBX0VWVCwgKHRBVkRUX1NDQl9FVlQqKSZwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX3dyaXRlX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBDQ0Igb3IgU0NCIHRvIHNlbmQgZGF0YSB0byBhCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBjaGFubmVsLiAgSXQgbG9va3MgdXAgdGhlIExDSUQgb2YgdGhlIGNoYW5uZWwKLSAqICAgICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIHR5cGUsIENDQiwgYW5kIFNDQiAoaWYgcHJlc2VudCkuICBUaGVuIGl0Ci0gKiAgICAgICAgICAgICAgICAgIHBhc3NlcyB0aGUgZGF0YSB0byBMMkNBX0RhdGFXcml0ZSgpLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfQURfU1VDQ0VTUywgaWYgZGF0YSBhY2NlcHRlZAotICogICAgICAgICAgICAgICAgICBBVkRUX0FEX0NPTkdFU1RFRCwgaWYgZGF0YSBhY2NlcHRlZCBhbmQgdGhlIGNoYW5uZWwgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmdlc3RlZAotICogICAgICAgICAgICAgICAgICBBVkRUX0FEX0ZBSUxFRCwgaWYgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBhdmR0X2FkX3dyaXRlX3JlcSh1aW50OF90IHR5cGUsIEF2ZHRwQ2NiKiBwX2NjYiwgQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKSB7Ci0gIHVpbnQ4X3QgdGNpZDsKLQotICAvKiBnZXQgdGNpZCBmcm9tIHR5cGUsIHNjYiAqLwotICB0Y2lkID0gYXZkdF9hZF90eXBlX3RvX3RjaWQodHlwZSwgcF9zY2IpOwotCi0gIHJldHVybiBMMkNBX0RhdGFXcml0ZShhdmR0cF9jYi5hZC5ydF90YmxbYXZkdF9jY2JfdG9faWR4KHBfY2NiKV1bdGNpZF0ubGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfYWRfb3Blbl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgQ0NCIG9yIFNDQiB0byBvcGVuIGEgdHJhbnNwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIGNoYW5uZWwuICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYQotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSBlbnRyeS4gIFRoZSBjaGFubmVsIGNhbiBiZSBvcGVuZWQKLSAqICAgICAgICAgICAgICAgICAgaW4gdHdvIHJvbGVzOiAgYXMgYW4gaW5pdGlhdG9yIG9yIGFjY2VwdG9yLiAgV2hlbiBvcGVuZWQKLSAqICAgICAgICAgICAgICAgICAgYXMgYW4gaW5pdGlhdG9yIHRoZSBmdW5jdGlvbiB3aWxsIHN0YXJ0IGFuIEwyQ0FQIGNvbm5lY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gb3BlbmVkIGFzIGFuIGFjY2VwdG9yIHRoZSBmdW5jdGlvbiBzaW1wbHkgY29uZmlndXJlcwotICogICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZW50cnkgdG8gbGlzdGVuIGZvciBhbiBpbmNvbWluZyBjaGFubmVsLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9hZF9vcGVuX3JlcSh1aW50OF90IHR5cGUsIEF2ZHRwQ2NiKiBwX2NjYiwgQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm9sZSkgewotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotICB1aW50MTZfdCBsY2lkOwotCi0gIHBfdGJsID0gYXZkdF9hZF90Y190YmxfYWxsb2MocF9jY2IpOwotICBpZiAocF90YmwgPT0gTlVMTCkgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoImF2ZHRfYWRfb3Blbl9yZXE6IENhbm5vdCBhbGxvY2F0ZSBwX3RibCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfdGJsLT50Y2lkID0gYXZkdF9hZF90eXBlX3RvX3RjaWQodHlwZSwgcF9zY2IpOwotICBBVkRUX1RSQUNFX0RFQlVHKCJhdmR0X2FkX29wZW5fcmVxOiB0eXBlOiAlZCwgcm9sZTogJWQsIHRjaWQ6JWQiLCB0eXBlLCByb2xlLAotICAgICAgICAgICAgICAgICAgIHBfdGJsLT50Y2lkKTsKLQotICBpZiAodHlwZSA9PSBBVkRUX0NIQU5fU0lHKSB7Ci0gICAgLyogaWYgc2lnbmFsaW5nLCBnZXQgbXR1IGZyb20gcmVnaXN0cmF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KLSAgICBwX3RibC0+bXlfbXR1ID0ga0F2ZHRwTXR1OwotICB9IGVsc2UgewotICAgIC8qIG90aGVyd2lzZSBnZXQgbXR1IGZyb20gc2NiICovCi0gICAgcF90YmwtPm15X210dSA9IGtBdmR0cE10dTsKLQotICAgIC8qIGFsc28gc2V0IHNjYl9oZGwgaW4gcnRfdGJsICovCi0gICAgYXZkdHBfY2IuYWQucnRfdGJsW2F2ZHRfY2NiX3RvX2lkeChwX2NjYildW3BfdGJsLT50Y2lkXS5zY2JfaGRsID0KLSAgICAgICAgYXZkdF9zY2JfdG9faGRsKHBfc2NiKTsKLSAgICBBVkRUX1RSQUNFX0RFQlVHKCJhdmR0cF9jYi5hZC5ydF90YmxbJWRdWyVkXS5zY2JfaGRsID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgYXZkdF9jY2JfdG9faWR4KHBfY2NiKSwgcF90YmwtPnRjaWQsCi0gICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpKTsKLSAgfQotCi0gIC8qIGlmIHdlJ3JlIGFjY2VwdG9yLCB3ZSdyZSBkb25lOyBqdXN0IHNpdCBiYWNrIGFuZCBsaXN0ZW4gKi8KLSAgaWYgKHJvbGUgPT0gQVZEVF9BQ1ApIHsKLSAgICBwX3RibC0+c3RhdGUgPSBBVkRUX0FEX1NUX0FDUDsKLSAgfQotICAvKiBlbHNlIHdlJ3JlIGluaXRpdGF0b3IsIHN0YXJ0IHRoZSBMMkNBUCBjb25uZWN0aW9uICovCi0gIGVsc2UgewotICAgIHBfdGJsLT5zdGF0ZSA9IEFWRFRfQURfU1RfQ09OTjsKLQotICAgIC8qIGNhbGwgbDJjYXAgY29ubmVjdCByZXEgKi8KLSAgICBsY2lkID0KLSAgICAgICAgTDJDQV9Db25uZWN0UmVxMihBVkRUX1BTTSwgcF9jY2ItPnBlZXJfYWRkciwgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFKTsKLSAgICBpZiAobGNpZCAhPSAwKSB7Ci0gICAgICAvKiBpZiBjb25uZWN0IHJlcSBvaywgc3RvcmUgdGNpZCBpbiBsY2lkIHRhYmxlICAqLwotICAgICAgYXZkdHBfY2IuYWQubGNpZF90YmxbbGNpZF0gPSBhdmR0X2FkX3RjX3RibF90b19pZHgocF90YmwpOwotICAgICAgQVZEVF9UUkFDRV9ERUJVRygiYXZkdHBfY2IuYWQubGNpZF90YmxbJWRdID0gJWQiLCAobGNpZCksCi0gICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfYWRfdGNfdGJsX3RvX2lkeChwX3RibCkpOwotCi0gICAgICBhdmR0cF9jYi5hZC5ydF90YmxbYXZkdF9jY2JfdG9faWR4KHBfY2NiKV1bcF90YmwtPnRjaWRdLmxjaWQgPSBsY2lkOwotICAgICAgQVZEVF9UUkFDRV9ERUJVRygiYXZkdHBfY2IuYWQucnRfdGJsWyVkXVslZF0ubGNpZCA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2NjYl90b19pZHgocF9jY2IpLCBwX3RibC0+dGNpZCwgbGNpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIGNvbm5lY3QgcmVxIGZhaWxlZCwgY2FsbCBhdmR0X2FkX3RjX2Nsb3NlX2luZCgpICovCi0gICAgICBhdmR0X2FkX3RjX2Nsb3NlX2luZChwX3RibCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2FkX2Nsb3NlX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBDQ0Igb3IgU0NCIHRvIGNsb3NlIGEKLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGNoYW5uZWwuICBUaGUgZnVuY3Rpb24gbG9va3MgdXAgdGhlIExDSUQgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBjaGFubmVsIGFuZCBjYWxscyBMMkNBX0Rpc2Nvbm5lY3RSZXEoKS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfYWRfY2xvc2VfcmVxKHVpbnQ4X3QgdHlwZSwgQXZkdHBDY2IqIHBfY2NiLCBBdmR0cFNjYiogcF9zY2IpIHsKLSAgdWludDhfdCB0Y2lkOwotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotCi0gIHBfdGJsID0gYXZkdF9hZF90Y190YmxfYnlfdHlwZSh0eXBlLCBwX2NjYiwgcF9zY2IpOwotICBBVkRUX1RSQUNFX0RFQlVHKCJhdmR0X2FkX2Nsb3NlX3JlcSBzdGF0ZTogJWQiLCBwX3RibC0+c3RhdGUpOwotCi0gIHN3aXRjaCAocF90YmwtPnN0YXRlKSB7Ci0gICAgY2FzZSBBVkRUX0FEX1NUX1VOVVNFRDoKLSAgICAgIC8qIHByb2JhYmx5IGZvciByZXBvcnRpbmcgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZEVF9BRF9TVF9BQ1A6Ci0gICAgICAvKiBpZiB3ZSdyZSBsaXN0ZW5pbmcgb24gdGhpcyBjaGFubmVsLCBzZW5kIG91cnNlbHZlcyBhIGNsb3NlIGluZCAqLwotICAgICAgYXZkdF9hZF90Y19jbG9zZV9pbmQocF90YmwpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIGdldCB0Y2lkIGZyb20gdHlwZSwgc2NiICovCi0gICAgICB0Y2lkID0gYXZkdF9hZF90eXBlX3RvX3RjaWQodHlwZSwgcF9zY2IpOwotCi0gICAgICAvKiBjYWxsIGwyY2FwIGRpc2Nvbm5lY3QgcmVxICovCi0gICAgICBhdmR0X2wyY19kaXNjb25uZWN0KAotICAgICAgICAgIGF2ZHRwX2NiLmFkLnJ0X3RibFthdmR0X2NjYl90b19pZHgocF9jY2IpXVt0Y2lkXS5sY2lkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZkdC9hdmR0X2FwaS5jYyBiL3N0YWNrL2F2ZHQvYXZkdF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjUzODguLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZkdC9hdmR0X2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIG1vZHVsZSBjb250YWlucyBBUEkgb2YgdGhlIGF1ZGlvL3ZpZGVvIGRpc3RyaWJ1dGlvbiB0cmFuc3BvcnQKLSAqICBwcm90b2NvbC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZkdF9pbnQuaCIKLSNpbmNsdWRlICJhdmR0Y19hcGkuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyogQ29udHJvbCBibG9jayBmb3IgQVZEVFAgKi8KLUF2ZHRwQ2IgYXZkdHBfY2I7Ci0KLXZvaWQgYXZkdF9jY2JfaWRsZV9jY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYiA9IChBdmR0cENjYiopZGF0YTsKLSAgdWludDhfdCBhdmR0X2V2ZW50ID0gQVZEVF9DQ0JfSURMRV9UT1VUX0VWVDsKLSAgdWludDhfdCBlcnJfY29kZSA9IEFWRFRfRVJSX1RJTUVPVVQ7Ci0KLSAgdEFWRFRfQ0NCX0VWVCBhdmR0X2NjYl9ldnQ7Ci0gIGF2ZHRfY2NiX2V2dC5lcnJfY29kZSA9IGVycl9jb2RlOwotICBhdmR0X2NjYl9ldmVudChwX2NjYiwgYXZkdF9ldmVudCwgJmF2ZHRfY2NiX2V2dCk7Ci19Ci0KLXZvaWQgYXZkdF9jY2JfcmV0X2NjYl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgQXZkdHBDY2IqIHBfY2NiID0gKEF2ZHRwQ2NiKilkYXRhOwotICB1aW50OF90IGF2ZHRfZXZlbnQgPSBBVkRUX0NDQl9SRVRfVE9VVF9FVlQ7Ci0gIHVpbnQ4X3QgZXJyX2NvZGUgPSBBVkRUX0VSUl9USU1FT1VUOwotCi0gIHRBVkRUX0NDQl9FVlQgYXZkdF9jY2JfZXZ0OwotICBhdmR0X2NjYl9ldnQuZXJyX2NvZGUgPSBlcnJfY29kZTsKLSAgYXZkdF9jY2JfZXZlbnQocF9jY2IsIGF2ZHRfZXZlbnQsICZhdmR0X2NjYl9ldnQpOwotfQotCi12b2lkIGF2ZHRfY2NiX3JzcF9jY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYiA9IChBdmR0cENjYiopZGF0YTsKLSAgdWludDhfdCBhdmR0X2V2ZW50ID0gQVZEVF9DQ0JfUlNQX1RPVVRfRVZUOwotICB1aW50OF90IGVycl9jb2RlID0gQVZEVF9FUlJfVElNRU9VVDsKLQotICB0QVZEVF9DQ0JfRVZUIGF2ZHRfY2NiX2V2dDsKLSAgYXZkdF9jY2JfZXZ0LmVycl9jb2RlID0gZXJyX2NvZGU7Ci0gIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBhdmR0X2V2ZW50LCAmYXZkdF9jY2JfZXZ0KTsKLX0KLQotdm9pZCBhdmR0X3NjYl90cmFuc3BvcnRfY2hhbm5lbF90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgQXZkdHBTY2IqIHBfc2NiID0gKEF2ZHRwU2NiKilkYXRhOwotICB1aW50OF90IGF2ZHRfZXZlbnQgPSBBVkRUX1NDQl9UQ19UT1VUX0VWVDsKLQotICBhdmR0X3NjYl9ldmVudChwX3NjYiwgYXZkdF9ldmVudCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX1JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBzeXN0ZW0gbGV2ZWwgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgQVZEVFAgcHJvdG9jb2wuICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIEFWRFRQIGFuZAotICogICAgICAgICAgICAgICAgICBwcmVwYXJlcyB0aGUgcHJvdG9jb2wgc3RhY2sgZm9yIGl0cyB1c2UuICBUaGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG11c3QgYmUgY2FsbGVkIG9uY2UgYnkgdGhlIHN5c3RlbSBvciBwbGF0Zm9ybSB1c2luZyBBVkRUUAotICogICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIG90aGVyIGZ1bmN0aW9ucyBvZiB0aGUgQVBJIGFuIGJlIHVzZWQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFWRFRfUmVnaXN0ZXIoQXZkdHBSY2IqIHBfcmVnLCB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIC8qIHJlZ2lzdGVyIFBTTSB3aXRoIEwyQ0FQICovCi0gIEwyQ0FfUmVnaXN0ZXIyKEFWRFRfUFNNLCBhdmR0X2wyY19hcHBsLCB0cnVlIC8qIGVuYWJsZV9zbm9vcCAqLywgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAga0F2ZHRwTXR1LCAwLCBCVEFfU0VDX0FVVEhFTlRJQ0FURSk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBBVkRUUCBkYXRhIHN0cnVjdHVyZXMgKi8KLSAgYXZkdF9zY2JfaW5pdCgpOwotICBhdmR0X2NjYl9pbml0KCk7Ci0gIGF2ZHRfYWRfaW5pdCgpOwotCi0gIC8qIGNvcHkgcmVnaXN0cmF0aW9uIHN0cnVjdCAqLwotICBhdmR0cF9jYi5yY2IgPSAqcF9yZWc7Ci0gIGF2ZHRwX2NiLnBfY29ubl9jYmFjayA9IHBfY2JhY2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlcmVnaXN0ZXIgdXNlIEFWRFRQIHByb3RvY29sLgotICogICAgICAgICAgICAgICAgICBJdCBpcyBjYWxsZWQgd2hlbiBBVkRUUCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZCBieSBhbnkKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaW4gdGhlIHN5c3RlbS4gIEJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQotICogICAgICAgICAgICAgICAgICBjYWxsZWQsIGFsbCBzdHJlYW1zIG11c3QgYmUgcmVtb3ZlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIEFWRFRfUmVtb3ZlU3RyZWFtKCkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFWRFRfRGVyZWdpc3Rlcih2b2lkKSB7Ci0gIC8qIGRlcmVnaXN0ZXIgUFNNIHdpdGggTDJDQVAgKi8KLSAgTDJDQV9EZXJlZ2lzdGVyKEFWRFRfUFNNKTsKLX0KLQotdm9pZCBBVkRUX0Fib3J0UmVxKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIEFWRFRfVFJBQ0VfV0FSTklORygiJXM6IGF2ZHRfaGFuZGxlPSVkIiwgX19mdW5jX18sIGhhbmRsZSk7Ci0KLSAgQXZkdHBTY2IqIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKGhhbmRsZSk7Ci0gIGlmIChwX3NjYiAhPSBOVUxMKSB7Ci0gICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9BQk9SVF9SRVFfRVZULCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlcyBJbXByb3BlciBhdmRwX2hhbmRsZT0lZCwgY2FuIG5vdCBhYm9ydCB0aGUgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBoYW5kbGUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0NyZWF0ZVN0cmVhbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGEgc3RyZWFtIGVuZHBvaW50LiAgQWZ0ZXIgYSBzdHJlYW0gZW5kcG9pbnQgaXMKLSAqICAgICAgICAgICAgICAgICAgY3JlYXRlZCBhbiBhcHBsaWNhdGlvbiBjYW4gaW5pdGlhdGUgYSBjb25uZWN0aW9uIGJldHdlZW4KLSAqICAgICAgICAgICAgICAgICAgdGhpcyBlbmRwb2ludCBhbmQgYW4gZW5kcG9pbnQgb24gYSBwZWVyIGRldmljZS4gIEluCi0gKiAgICAgICAgICAgICAgICAgIGFkZGl0aW9uLCBhIHBlZXIgZGV2aWNlIGNhbiBkaXNjb3ZlciwgZ2V0IHRoZSBjYXBhYmlsaXRpZXMsCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBjb25uZWN0IHRvIHRoaXMgZW5kcG9pbnQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZEVF9DcmVhdGVTdHJlYW0odWludDhfdCBwZWVyX2lkLCB1aW50OF90KiBwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF2ZHRwU3RyZWFtQ29uZmlnJiBhdmR0cF9zdHJlYW1fY29uZmlnKSB7Ci0gIHRBVkRUX1JFU1VMVCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLQotICAvKiBWZXJpZnkgcGFyYW1ldGVyczsgaWYgaW52YWxpZCwgcmV0dXJuIGZhaWx1cmUgKi8KLSAgaWYgKCgoYXZkdHBfc3RyZWFtX2NvbmZpZy5jZmcucHNjX21hc2sgJiAofkFWRFRfUFNDKSkgIT0gMCkgfHwKLSAgICAgIChhdmR0cF9zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrID09IE5VTEwpKSB7Ci0gICAgcmVzdWx0ID0gQVZEVF9CQURfUEFSQU1TOwotICAgIExPR19FUlJPUigiSW52YWxpZCBBVkRUIHN0cmVhbSBlbmRwb2ludCBwYXJhbWV0ZXJzIHBlZXJfaWQ9JWQgc2NiX2luZGV4PSVkIiwKLSAgICAgICAgICAgICAgcGVlcl9pZCwgYXZkdHBfc3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotICB9Ci0KLSAgLyogQWxsb2NhdGUgc2NiOyBpZiBubyBzY2JzLCByZXR1cm4gZmFpbHVyZSAqLwotICBlbHNlIHsKLSAgICBwX3NjYiA9IGF2ZHRfc2NiX2FsbG9jKHBlZXJfaWQsIGF2ZHRwX3N0cmVhbV9jb25maWcpOwotICAgIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgQVZEVCBzdHJlYW0gZW5kcG9pbnQgcGVlcl9pZD0lZCBzY2JfaW5kZXg9JWQiLAotICAgICAgICAgICAgICAgIHBlZXJfaWQsIGF2ZHRwX3N0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLSAgICAgIHJlc3VsdCA9IEFWRFRfTk9fUkVTT1VSQ0VTOwotICAgIH0gZWxzZSB7Ci0gICAgICAqcF9oYW5kbGUgPSBhdmR0X3NjYl90b19oZGwocF9zY2IpOwotICAgICAgTE9HX0RFQlVHKCJDcmVhdGVkIHN0cmVhbSBlbmRwb2ludCBwZWVyX2lkPSVkIGhhbmRsZT0laGh1IiwgcGVlcl9pZCwKLSAgICAgICAgICAgICAgICAqcF9oYW5kbGUpOwotICAgIH0KLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHJlc3VsdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX1JlbW92ZVN0cmVhbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlIGEgc3RyZWFtIGVuZHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbgotICogICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gaXMgbm8gbG9uZ2VyIHVzaW5nIGEgc3RyZWFtIGVuZHBvaW50LgotICogICAgICAgICAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBlbmRwb2ludCBpcyBjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFuZCB0aGVuIHRoZSBzdHJlYW0gZW5kcG9pbnQKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVtb3ZlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX1JlbW92ZVN0cmVhbSh1aW50OF90IGhhbmRsZSkgewotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLQotICBBVkRUX1RSQUNFX0RFQlVHKCIlczogYXZkdF9oYW5kbGU9JWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKLQotICAvKiBsb29rIHVwIHNjYiAqLwotICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChoYW5kbGUpOwotICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEFWRFRfQkFEX0hBTkRMRTsKLSAgfSBlbHNlIHsKLSAgICAvKiBzZW5kIHJlbW92ZSBldmVudCB0byBzY2IgKi8KLSAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQVBJX1JFTU9WRV9FVlQsIE5VTEwpOwotICB9Ci0KLSAgaWYgKHJlc3VsdCAhPSBBVkRUX1NVQ0NFU1MpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogcmVzdWx0PSVkIGF2ZHRfaGFuZGxlPSVkIiwgX19mdW5jX18sIHJlc3VsdCwgaGFuZGxlKTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0Rpc2NvdmVyUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIEFWRFRQIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgb24gdGhlIHBlZXIgZGV2aWNlLCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBhbmQgZGlzY292ZXJzCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gZW5kcG9pbnRzIG9uIHRoZSBwZWVyIGRldmljZS4gIChQbGVhc2Ugbm90ZQotICogICAgICAgICAgICAgICAgICB0aGF0IEFWRFRQIGRpc2NvdmVyeSBpcyB1bnJlbGF0ZWQgdG8gU0RQIGRpc2NvdmVyeSkuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSByZWdhcmRsZXNzIG9mCi0gKiAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlcmUgaXMgYW4gQVZEVFAgY29ubmVjdGlvbiB0byB0aGUgcGVlciBkZXZpY2UuCi0gKgotICogICAgICAgICAgICAgICAgICBXaGVuIGRpc2NvdmVyeSBpcyBjb21wbGV0ZSwgYW4gQVZEVF9ESVNDT1ZFUl9DRk1fRVZUCi0gKiAgICAgICAgICAgICAgICAgIGlzIHNlbnQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYSBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdCBjYWxsIEFWRFRfR2V0Q2FwUmVxKCkgb3IKLSAqICAgICAgICAgICAgICAgICAgQVZEVF9EaXNjb3ZlclJlcSgpIGFnYWluIHRvIHRoZSBzYW1lIGRldmljZSB1bnRpbAotICogICAgICAgICAgICAgICAgICBkaXNjb3ZlcnkgaXMgY29tcGxldGUuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IGFkZHJlc3NlZCBieSBzZXBfaW5mbyBpcyBhbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLiAgVGhpcyBtZW1vcnkgaXMgd3JpdHRlbiB0byBieSBBVkRUUCBhcyBwYXJ0Ci0gKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBkaXNjb3ZlcnkgcHJvY2VkdXJlLiAgVGhpcyBtZW1vcnkgbXVzdCByZW1haW4KLSAqICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgYXBwbGljYXRpb24gcmVjZWl2ZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIEFWRFRfRElTQ09WRVJfQ0ZNX0VWVC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWRFRfRGlzY292ZXJSZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBjaGFubmVsX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9TRVBfSU5GTyogcF9zZXBfaW5mbywgdWludDhfdCBtYXhfc2VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfQ1RSTF9DQkFDSyogcF9jYmFjaykgewotICBBdmR0cENjYiogcF9jY2I7Ci0gIHVpbnQxNl90IHJlc3VsdCA9IEFWRFRfU1VDQ0VTUzsKLSAgdEFWRFRfQ0NCX0VWVCBldnQ7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogZmluZCBjaGFubmVsIGNvbnRyb2wgYmxvY2sgZm9yIHRoaXMgYmQgYWRkcjsgaWYgbm9uZSwgYWxsb2NhdGUgb25lICovCi0gIHBfY2NiID0gYXZkdF9jY2JfYnlfYmQoYmRfYWRkcik7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgcF9jY2IgPSBhdmR0X2NjYl9hbGxvY19ieV9jaGFubmVsX2luZGV4KGJkX2FkZHIsIGNoYW5uZWxfaW5kZXgpOwotICAgIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgICAvKiBjb3VsZCBub3QgYWxsb2NhdGUgY2hhbm5lbCBjb250cm9sIGJsb2NrICovCi0gICAgICByZXN1bHQgPSBBVkRUX05PX1JFU09VUkNFUzsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IEFWRFRfU1VDQ0VTUykgewotICAgIC8qIG1ha2Ugc3VyZSBubyBkaXNjb3Zlcnkgb3IgZ2V0IGNhcGFiaWxpdGllcyByZXEgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLwotICAgIGlmIChwX2NjYi0+cHJvY19idXN5KSB7Ci0gICAgICByZXN1bHQgPSBBVkRUX0JVU1k7Ci0gICAgfQotICAgIC8qIHNlbmQgZXZlbnQgdG8gY2NiICovCi0gICAgZWxzZSB7Ci0gICAgICBldnQuZGlzY292ZXIucF9zZXBfaW5mbyA9IHBfc2VwX2luZm87Ci0gICAgICBldnQuZGlzY292ZXIubnVtX3NlcHMgPSBtYXhfc2VwczsKLSAgICAgIGV2dC5kaXNjb3Zlci5wX2NiYWNrID0gcF9jYmFjazsKLSAgICAgIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9BUElfRElTQ09WRVJfUkVRX0VWVCwgJmV2dCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJlc3VsdCAhPSBBVkRUX1NVQ0NFU1MpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogcmVzdWx0PSVkIGFkZHJlc3M9JXMiLCBfX2Z1bmNfXywgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2dldF9jYXBfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBpbnRlcm5hbCBmdW5jdGlvbiB0byBzZXJ2ZSBBVkRUX0dldENhcFJlcQotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQxNl90IGF2ZHRfZ2V0X2NhcF9yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX0NDQl9BUElfR0VUQ0FQKiBwX2V2dCkgewotICBBdmR0cENjYiogcF9jY2IgPSBOVUxMOwotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogdmVyaWZ5IFNFSUQgKi8KLSAgaWYgKChwX2V2dC0+c2luZ2xlLnNlaWQgPCBBVkRUX1NFSURfTUlOKSB8fAotICAgICAgKHBfZXZ0LT5zaW5nbGUuc2VpZCA+IEFWRFRfU0VJRF9NQVgpKSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigic2VpZDogJWQiLCBwX2V2dC0+c2luZ2xlLnNlaWQpOwotICAgIHJlc3VsdCA9IEFWRFRfQkFEX1BBUkFNUzsKLSAgfQotICAvKiBmaW5kIGNoYW5uZWwgY29udHJvbCBibG9jayBmb3IgdGhpcyBiZCBhZGRyOyBpZiBub25lLCBhbGxvY2F0ZSBvbmUgKi8KLSAgZWxzZSB7Ci0gICAgcF9jY2IgPSBhdmR0X2NjYl9ieV9iZChiZF9hZGRyKTsKLSAgICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgICAgcF9jY2IgPSBhdmR0X2NjYl9hbGxvY19ieV9jaGFubmVsX2luZGV4KGJkX2FkZHIsIGNoYW5uZWxfaW5kZXgpOwotICAgICAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICAgICAgLyogY291bGQgbm90IGFsbG9jYXRlIGNoYW5uZWwgY29udHJvbCBibG9jayAqLwotICAgICAgICByZXN1bHQgPSBBVkRUX05PX1JFU09VUkNFUzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IEFWRFRfU1VDQ0VTUykgewotICAgIC8qIG1ha2Ugc3VyZSBubyBkaXNjb3Zlcnkgb3IgZ2V0IGNhcGFiaWxpdGllcyByZXEgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLwotICAgIGlmIChwX2NjYi0+cHJvY19idXN5KSB7Ci0gICAgICByZXN1bHQgPSBBVkRUX0JVU1k7Ci0gICAgfQotICAgIC8qIHNlbmQgZXZlbnQgdG8gY2NiICovCi0gICAgZWxzZSB7Ci0gICAgICBhdmR0X2NjYl9ldmVudChwX2NjYiwgQVZEVF9DQ0JfQVBJX0dFVENBUF9SRVFfRVZULCAodEFWRFRfQ0NCX0VWVCopcF9ldnQpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IHJlc3VsdD0lZCBhZGRyZXNzPSVzIiwgX19mdW5jX18sIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9HZXRDYXBSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgQVZEVFAgc2VydmljZQotICogICAgICAgICAgICAgICAgICBvbiB0aGUgcGVlciBkZXZpY2UsIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsIGFuZCBnZXRzIHRoZQotICogICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgb2YgYSBzdHJlYW0gZW5kcG9pbnQgb24gdGhlIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgcmVnYXJkbGVzcyBvZgotICogICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZXJlIGlzIGFuIEFWRFRQIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXIgZGV2aWNlLgotICoKLSAqICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgcHJvY2VkdXJlIGlzIGNvbXBsZXRlLCBhbiBBVkRUX0dFVENBUF9DRk1fRVZUIGlzCi0gKiAgICAgICAgICAgICAgICAgIHNlbnQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYSBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gbXVzdCBub3QgY2FsbCBBVkRUX0dldENhcFJlcSgpIG9yCi0gKiAgICAgICAgICAgICAgICAgIEFWRFRfRGlzY292ZXJSZXEoKSBhZ2FpbiB1bnRpbCB0aGUgcHJvY2VkdXJlIGlzIGNvbXBsZXRlLgotICoKLSAqICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHBfY2ZnIGlzIGFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24uICBUaGlzIG1lbW9yeSBpcyB3cml0dGVuIHRvIGJ5IEFWRFRQIGFzIHBhcnQKLSAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGdldCBjYXBhYmlsaXRpZXMgcHJvY2VkdXJlLiAgVGhpcyBtZW1vcnkgbXVzdAotICogICAgICAgICAgICAgICAgICByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB0aGUgYXBwbGljYXRpb24gcmVjZWl2ZXMKLSAqICAgICAgICAgICAgICAgICAgdGhlIEFWRFRfR0VUQ0FQX0NGTV9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX0dldENhcFJlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGNoYW5uZWxfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlaWQsIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2ssIGJvb2wgZ2V0X2FsbF9jYXApIHsKLSAgdEFWRFRfQ0NCX0FQSV9HRVRDQVAgZ2V0Y2FwOwotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgZ2V0Y2FwLnNpbmdsZS5zZWlkID0gc2VpZDsKLSAgaWYgKGdldF9hbGxfY2FwKSB7Ci0gICAgZ2V0Y2FwLnNpbmdsZS5zaWdfaWQgPSBBVkRUX1NJR19HRVRfQUxMQ0FQOwotICB9IGVsc2UgewotICAgIGdldGNhcC5zaW5nbGUuc2lnX2lkID0gQVZEVF9TSUdfR0VUQ0FQOwotICB9Ci0gIGdldGNhcC5wX2NmZyA9IHBfY2ZnOwotICBnZXRjYXAucF9jYmFjayA9IHBfY2JhY2s7Ci0gIHJlc3VsdCA9IGF2ZHRfZ2V0X2NhcF9yZXEoYmRfYWRkciwgY2hhbm5lbF9pbmRleCwgJmdldGNhcCk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBBVkRUX1NVQ0NFU1MpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogcmVzdWx0PSVkIGFkZHJlc3M9JXMiLCBfX2Z1bmNfXywgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0RlbGF5UmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9ucyBzZW5kcyBhIERlbGF5IFJlcG9ydCB0byB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIFNFSUQuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFNOSyBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX0RlbGF5UmVwb3J0KHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IHNlaWQsIHVpbnQxNl90IGRlbGF5KSB7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZEVF9TVUNDRVNTOwotICB0QVZEVF9TQ0JfRVZUIGV2dDsKLQotICBBVkRUX1RSQUNFX0RFQlVHKCIlczogYXZkdF9oYW5kbGU9JWQgc2VpZD0lZCBkZWxheT0lZCIsIF9fZnVuY19fLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgc2VpZCwgZGVsYXkpOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gc2NiICovCi0gIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKGhhbmRsZSk7Ci0gIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gQVZEVF9CQURfSEFORExFOwotICB9IGVsc2UKLSAgLyogc2VuZCBldmVudCB0byBzY2IgKi8KLSAgewotICAgIGV2dC5hcGlkZWxheS5oZHIuc2VpZCA9IHNlaWQ7Ci0gICAgZXZ0LmFwaWRlbGF5LmRlbGF5ID0gZGVsYXk7Ci0gICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9ERUxBWV9SUFRfUkVRX0VWVCwgJmV2dCk7Ci0gIH0KLQotICBpZiAocmVzdWx0ICE9IEFWRFRfU1VDQ0VTUykgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiByZXN1bHQ9JWQgYXZkdF9oYW5kbGU9JWQgc2VpZD0lZCIsIF9fZnVuY19fLCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIHNlaWQpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX09wZW5SZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgQVZEVFAgc2VydmljZQotICogICAgICAgICAgICAgICAgICBvbiB0aGUgcGVlciBkZXZpY2UsIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsIGFuZCBjb25uZWN0cwotICogICAgICAgICAgICAgICAgICB0byBhIHN0cmVhbSBlbmRwb2ludCBvbiBhIHBlZXIgZGV2aWNlLiAgV2hlbiB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBpcyBjb21wbGV0ZWQsIGFuIEFWRFRfT1BFTl9DRk1fRVZUIGlzIHNlbnQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHZpYSB0aGUgY29udHJvbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICBoYW5kbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX09wZW5SZXEodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2luZGV4LCB1aW50OF90IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgQXZkdHBTZXBDb25maWcqIHBfY2ZnKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYiA9IE5VTEw7Ci0gIEF2ZHRwU2NiKiBwX3NjYiA9IE5VTEw7Ci0gIHVpbnQxNl90IHJlc3VsdCA9IEFWRFRfU1VDQ0VTUzsKLSAgdEFWRFRfU0NCX0VWVCBldnQ7Ci0KLSAgQVZEVF9UUkFDRV9BUEkoIiVzOiBhZGRyZXNzPSVzIGF2ZHRfaGFuZGxlPSVkIHNlaWQ9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGhhbmRsZSwgc2VpZCk7Ci0KLSAgLyogdmVyaWZ5IFNFSUQgKi8KLSAgaWYgKChzZWlkIDwgQVZEVF9TRUlEX01JTikgfHwgKHNlaWQgPiBBVkRUX1NFSURfTUFYKSkgewotICAgIHJlc3VsdCA9IEFWRFRfQkFEX1BBUkFNUzsKLSAgfQotICAvKiBtYXAgaGFuZGxlIHRvIHNjYiAqLwotICBlbHNlIHsKLSAgICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChoYW5kbGUpOwotICAgIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgICByZXN1bHQgPSBBVkRUX0JBRF9IQU5ETEU7Ci0gICAgfQotICAgIC8qIGZpbmQgY2hhbm5lbCBjb250cm9sIGJsb2NrIGZvciB0aGlzIGJkIGFkZHI7IGlmIG5vbmUsIGFsbG9jYXRlIG9uZSAqLwotICAgIGVsc2UgewotICAgICAgcF9jY2IgPSBhdmR0X2NjYl9ieV9iZChiZF9hZGRyKTsKLSAgICAgIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgICAgIHBfY2NiID0gYXZkdF9jY2JfYWxsb2NfYnlfY2hhbm5lbF9pbmRleChiZF9hZGRyLCBjaGFubmVsX2luZGV4KTsKLSAgICAgICAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICAgICAgICAvKiBjb3VsZCBub3QgYWxsb2NhdGUgY2hhbm5lbCBjb250cm9sIGJsb2NrICovCi0gICAgICAgICAgcmVzdWx0ID0gQVZEVF9OT19SRVNPVVJDRVM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBzZW5kIGV2ZW50IHRvIHNjYiAqLwotICBpZiAocmVzdWx0ID09IEFWRFRfU1VDQ0VTUykgewotICAgIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBjb2RlYzogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfY2ZnLT5jb2RlY19pbmZvKS5jX3N0cigpKTsKLQotICAgIGV2dC5tc2cuY29uZmlnX2NtZC5oZHIuc2VpZCA9IHNlaWQ7Ci0gICAgZXZ0Lm1zZy5jb25maWdfY21kLmhkci5jY2JfaWR4ID0gYXZkdF9jY2JfdG9faWR4KHBfY2NiKTsKLSAgICBldnQubXNnLmNvbmZpZ19jbWQuaW50X3NlaWQgPSBoYW5kbGU7Ci0gICAgZXZ0Lm1zZy5jb25maWdfY21kLnBfY2ZnID0gcF9jZmc7Ci0gICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9TRVRDT05GSUdfUkVRX0VWVCwgJmV2dCk7Ci0gIH0gZWxzZSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IHJlc3VsdD0lZCBhZGRyZXNzPSVzIGF2ZHRfaGFuZGxlPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICByZXN1bHQsIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBoYW5kbGUpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfQ29uZmlnUnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXNwb25kIHRvIGEgY29uZmlndXJlIHJlcXVlc3QgZnJvbSB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGlmIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcyBhbgotICogICAgICAgICAgICAgICAgICBBVkRUX0NPTkZJR19JTkRfRVZUIHRocm91Z2ggaXRzIGNvbnRyb2wgY2FsbGJhY2suCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZEVF9Db25maWdSc3AodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2F0ZWdvcnkpIHsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICB0QVZEVF9TQ0JfRVZUIGV2dDsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZEVF9TVUNDRVNTOwotICB1aW50OF90IGV2ZW50X2NvZGU7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IGF2ZHRfaGFuZGxlPSVkIGxhYmVsPSVkIGVycm9yX2NvZGU9MHgleCBjYXRlZ29yeT0lZCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGhhbmRsZSwgbGFiZWwsIGVycm9yX2NvZGUsIGNhdGVnb3J5KTsKLQotICAvKiBtYXAgaGFuZGxlIHRvIHNjYiAqLwotICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChoYW5kbGUpOwotICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEFWRFRfQkFEX0hBTkRMRTsKLSAgfQotICAvKiBoYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnV0IHBlZXIgaGFzIG5vdCBzZW5kCi0gICoqIGEgY29uZmlndXJhdGlvbiBjbWQ7IGlnbm9yZSBhbmQgcmV0dXJuIGVycm9yIHJlc3VsdAotICAqLwotICBlbHNlIGlmICghcF9zY2ItPmluX3VzZSkgewotICAgIHJlc3VsdCA9IEFWRFRfQkFEX0hBTkRMRTsKLSAgfQotICAvKiBzZW5kIGV2ZW50IHRvIHNjYiAqLwotICBlbHNlIHsKLSAgICBldnQubXNnLmhkci5lcnJfY29kZSA9IGVycm9yX2NvZGU7Ci0gICAgZXZ0Lm1zZy5oZHIuZXJyX3BhcmFtID0gY2F0ZWdvcnk7Ci0gICAgZXZ0Lm1zZy5oZHIubGFiZWwgPSBsYWJlbDsKLSAgICBpZiAoZXJyb3JfY29kZSA9PSAwKSB7Ci0gICAgICBldmVudF9jb2RlID0gQVZEVF9TQ0JfQVBJX1NFVENPTkZJR19SU1BfRVZUOwotICAgIH0gZWxzZSB7Ci0gICAgICBldmVudF9jb2RlID0gQVZEVF9TQ0JfQVBJX1NFVENPTkZJR19SRUpfRVZUOwotICAgIH0KLSAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgZXZlbnRfY29kZSwgJmV2dCk7Ci0gIH0KLQotICBpZiAocmVzdWx0ICE9IEFWRFRfU1VDQ0VTUykgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiByZXN1bHQ9JWQgYXZkdF9oYW5kbGU9JWQiLCBfX2Z1bmNfXywgcmVzdWx0LCBoYW5kbGUpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX1N0YXJ0UmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBvbmUgb3IgbW9yZSBzdHJlYW0gZW5kcG9pbnRzLiAgVGhpcyBpbml0aWF0ZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIG9mIG1lZGlhIHBhY2tldHMgZm9yIHRoZSBzdHJlYW1zLiAgQWxsIHN0cmVhbQotICogICAgICAgICAgICAgICAgICBlbmRwb2ludHMgbXVzdCBwcmV2aW91c2x5IGJlIG9wZW5lZC4gIFdoZW4gdGhlIHN0cmVhbXMKLSAqICAgICAgICAgICAgICAgICAgYXJlIHN0YXJ0ZWQsIGFuIEFWRFRfU1RBUlRfQ0ZNX0VWVCBpcyBzZW50IHRvIHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB2aWEgdGhlIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVhY2gKLSAqICAgICAgICAgICAgICAgICAgc3RyZWFtLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWRFRfU3RhcnRSZXEodWludDhfdCogcF9oYW5kbGVzLCB1aW50OF90IG51bV9oYW5kbGVzKSB7Ci0gIEF2ZHRwU2NiKiBwX3NjYiA9IE5VTEw7Ci0gIHRBVkRUX0NDQl9FVlQgZXZ0OwotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIGludCBpOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBudW1faGFuZGxlcz0lZCIsIF9fZnVuY19fLCBudW1faGFuZGxlcyk7Ci0KLSAgaWYgKChudW1faGFuZGxlcyA9PSAwKSB8fCAobnVtX2hhbmRsZXMgPiBBVkRUX05VTV9TRVBTKSkgewotICAgIHJlc3VsdCA9IEFWRFRfQkFEX1BBUkFNUzsKLSAgfSBlbHNlIHsKLSAgICAvKiB2ZXJpZnkgaGFuZGxlcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1faGFuZGxlczsgaSsrKSB7Ci0gICAgICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChwX2hhbmRsZXNbaV0pOwotICAgICAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICAgICAgcmVzdWx0ID0gQVZEVF9CQURfSEFORExFOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IEFWRFRfU1VDQ0VTUykgewotICAgIGlmIChwX3NjYi0+cF9jY2IgPT0gTlVMTCkgewotICAgICAgcmVzdWx0ID0gQVZEVF9CQURfSEFORExFOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBzZW5kIGV2ZW50IHRvIGNjYiAqLwotICAgICAgbWVtY3B5KGV2dC5tc2cubXVsdGkuc2VpZF9saXN0LCBwX2hhbmRsZXMsIG51bV9oYW5kbGVzKTsKLSAgICAgIGV2dC5tc2cubXVsdGkubnVtX3NlcHMgPSBudW1faGFuZGxlczsKLSAgICAgIGF2ZHRfY2NiX2V2ZW50KHBfc2NiLT5wX2NjYiwgQVZEVF9DQ0JfQVBJX1NUQVJUX1JFUV9FVlQsICZldnQpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgaWYgKChudW1faGFuZGxlcyA9PSAwKSB8fCAobnVtX2hhbmRsZXMgPiBBVkRUX05VTV9TRVBTKSkgewotICAgICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IHJlc3VsdD0lZCBudW1faGFuZGxlcz0lZCBpbnZhbGlkIiwgX19mdW5jX18sIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX2hhbmRsZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBVkRUX1RSQUNFX0VSUk9SKAotICAgICAgICAgICIlczogcmVzdWx0PSVkIGF2ZHRfaGFuZGxlPSVkIiwgX19mdW5jX18sIHJlc3VsdCwKLSAgICAgICAgICAoaSA8IG51bV9oYW5kbGVzID8gcF9oYW5kbGVzW2ldIDogcF9oYW5kbGVzW251bV9oYW5kbGVzIC0gMV0pKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfU3VzcGVuZFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3VzcGVuZCBvbmUgb3IgbW9yZSBzdHJlYW0gZW5kcG9pbnRzLiBUaGlzIHN1c3BlbmRzIHRoZQotICogICAgICAgICAgICAgICAgICB0cmFuc2ZlciBvZiBtZWRpYSBwYWNrZXRzIGZvciB0aGUgc3RyZWFtcy4gIEFsbCBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzIG11c3QgcHJldmlvdXNseSBiZSBvcGVuIGFuZCBzdGFydGVkLiAgV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3RyZWFtcyBhcmUgc3VzcGVuZGVkLCBhbiBBVkRUX1NVU1BFTkRfQ0ZNX0VWVCBpcyBzZW50IHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24gZm9yCi0gKiAgICAgICAgICAgICAgICAgIGVhY2ggc3RyZWFtLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWRFRfU3VzcGVuZFJlcSh1aW50OF90KiBwX2hhbmRsZXMsIHVpbnQ4X3QgbnVtX2hhbmRsZXMpIHsKLSAgQXZkdHBTY2IqIHBfc2NiID0gTlVMTDsKLSAgdEFWRFRfQ0NCX0VWVCBldnQ7Ci0gIHVpbnQxNl90IHJlc3VsdCA9IEFWRFRfU1VDQ0VTUzsKLSAgaW50IGk7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IG51bV9oYW5kbGVzPSVkIiwgX19mdW5jX18sIG51bV9oYW5kbGVzKTsKLQotICBpZiAoKG51bV9oYW5kbGVzID09IDApIHx8IChudW1faGFuZGxlcyA+IEFWRFRfTlVNX1NFUFMpKSB7Ci0gICAgcmVzdWx0ID0gQVZEVF9CQURfUEFSQU1TOwotICB9IGVsc2UgewotICAgIC8qIHZlcmlmeSBoYW5kbGVzICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9oYW5kbGVzOyBpKyspIHsKLSAgICAgIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKHBfaGFuZGxlc1tpXSk7Ci0gICAgICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgICAgICByZXN1bHQgPSBBVkRUX0JBRF9IQU5ETEU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChyZXN1bHQgPT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgaWYgKHBfc2NiLT5wX2NjYiA9PSBOVUxMKSB7Ci0gICAgICByZXN1bHQgPSBBVkRUX0JBRF9IQU5ETEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHNlbmQgZXZlbnQgdG8gY2NiICovCi0gICAgICBtZW1jcHkoZXZ0Lm1zZy5tdWx0aS5zZWlkX2xpc3QsIHBfaGFuZGxlcywgbnVtX2hhbmRsZXMpOwotICAgICAgZXZ0Lm1zZy5tdWx0aS5udW1fc2VwcyA9IG51bV9oYW5kbGVzOwotICAgICAgYXZkdF9jY2JfZXZlbnQocF9zY2ItPnBfY2NiLCBBVkRUX0NDQl9BUElfU1VTUEVORF9SRVFfRVZULCAmZXZ0KTsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzdWx0ICE9IEFWRFRfU1VDQ0VTUykgewotICAgIGlmICgobnVtX2hhbmRsZXMgPT0gMCkgfHwgKG51bV9oYW5kbGVzID4gQVZEVF9OVU1fU0VQUykpIHsKLSAgICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiByZXN1bHQ9JWQgbnVtX2hhbmRsZXM9JWQgaW52YWxpZCIsIF9fZnVuY19fLCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgIG51bV9oYW5kbGVzKTsKLSAgICB9IGVsc2UgewotICAgICAgQVZEVF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiJXM6IHJlc3VsdD0lZCBhdmR0X2hhbmRsZT0lZCIsIF9fZnVuY19fLCByZXN1bHQsCi0gICAgICAgICAgKGkgPCBudW1faGFuZGxlcyA/IHBfaGFuZGxlc1tpXSA6IHBfaGFuZGxlc1tudW1faGFuZGxlcyAtIDFdKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0Nsb3NlUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIHN0cmVhbSBlbmRwb2ludC4gIFRoaXMgc3RvcHMgdGhlIHRyYW5zZmVyIG9mIG1lZGlhCi0gKiAgICAgICAgICAgICAgICAgIHBhY2tldHMgYW5kIGNsb3NlcyB0aGUgdHJhbnNwb3J0IGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgc3RyZWFtIGVuZHBvaW50LiAgV2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZCwgYW4KLSAqICAgICAgICAgICAgICAgICAgQVZEVF9DTE9TRV9DRk1fRVZUIGlzIHNlbnQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYSB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhpcyBoYW5kbGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZEVF9DbG9zZVJlcSh1aW50OF90IGhhbmRsZSkgewotICBBdmR0cFNjYiogcF9zY2I7Ci0gIHVpbnQxNl90IHJlc3VsdCA9IEFWRFRfU1VDQ0VTUzsKLQotICBBVkRUX1RSQUNFX0FQSSgiJXM6IGF2ZHRfaGFuZGxlPSVkIiwgX19mdW5jX18sIGhhbmRsZSk7Ci0KLSAgLyogbWFwIGhhbmRsZSB0byBzY2IgKi8KLSAgcF9zY2IgPSBhdmR0X3NjYl9ieV9oZGwoaGFuZGxlKTsKLSAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICByZXN1bHQgPSBBVkRUX0JBRF9IQU5ETEU7Ci0gIH0gZWxzZQotICAvKiBzZW5kIGV2ZW50IHRvIHNjYiAqLwotICB7Ci0gICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9DTE9TRV9SRVFfRVZULCBOVUxMKTsKLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IHJlc3VsdD0lZCBhdmR0X2hhbmRsZT0lZCIsIF9fZnVuY19fLCByZXN1bHQsIGhhbmRsZSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfUmVjb25maWdSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlY29uZmlndXJlIGEgc3RyZWFtIGVuZHBvaW50LiAgVGhpcyBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRvIGNoYW5nZSB0aGUgY29kZWMgb3IgY29udGVudCBwcm90ZWN0aW9uIGNhcGFiaWxpdGllcyBvZgotICogICAgICAgICAgICAgICAgICBhIHN0cmVhbSBlbmRwb2ludCBhZnRlciBpdCBoYXMgYmVlbiBvcGVuZWQuICBUaGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBidXQgbm90IHN0YXJ0ZWQKLSAqICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBzdXNwZW5kZWQuICBXaGVuIHRoZSBwcm9jZWR1cmUKLSAqICAgICAgICAgICAgICAgICAgaXMgY29tcGxldGVkLCBhbiBBVkRUX1JFQ09ORklHX0NGTV9FVlQgaXMgc2VudCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdmlhIHRoZSBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX1JlY29uZmlnUmVxKHVpbnQ4X3QgaGFuZGxlLCBBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIHRBVkRUX1NDQl9FVlQgZXZ0OwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBhdmR0X2hhbmRsZT0lZCIsIF9fZnVuY19fLCBoYW5kbGUpOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gc2NiICovCi0gIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKGhhbmRsZSk7Ci0gIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gQVZEVF9CQURfSEFORExFOwotICB9Ci0gIC8qIHNlbmQgZXZlbnQgdG8gc2NiICovCi0gIGVsc2UgewotICAgIC8qIGZvcmNlIHBzY19tYXNrIHRvIHplcm8gKi8KLSAgICBwX2NmZy0+cHNjX21hc2sgPSAwOwotICAgIGV2dC5tc2cucmVjb25maWdfY21kLnBfY2ZnID0gcF9jZmc7Ci0gICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9SRUNPTkZJR19SRVFfRVZULCAmZXZ0KTsKLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IHJlc3VsdD0lZCBhdmR0X2hhbmRsZT0lZCIsIF9fZnVuY19fLCByZXN1bHQsIGhhbmRsZSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfU2VjdXJpdHlSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBzZWN1cml0eSByZXF1ZXN0IHRvIHRoZSBwZWVyIGRldmljZS4gIFdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IHByb2NlZHVyZSBpcyBjb21wbGV0ZWQsIGFuIEFWRFRfU0VDVVJJVFlfQ0ZNX0VWVAotICogICAgICAgICAgICAgICAgICBpcyBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgaGFuZGxlLiAgKFBsZWFzZSBub3RlIHRoYXQgQVZEVFAgc2VjdXJpdHkKLSAqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlcyBhcmUgdW5yZWxhdGVkIHRvIEJsdWV0b290aCBsaW5rIGxldmVsIHNlY3VyaXR5LikKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX1NlY3VyaXR5UmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbikgewotICBBdmR0cFNjYiogcF9zY2I7Ci0gIHVpbnQxNl90IHJlc3VsdCA9IEFWRFRfU1VDQ0VTUzsKLSAgdEFWRFRfU0NCX0VWVCBldnQ7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IGF2ZHRfaGFuZGxlPSVkIGxlbj0lZCIsIF9fZnVuY19fLCBoYW5kbGUsIGxlbik7Ci0KLSAgLyogbWFwIGhhbmRsZSB0byBzY2IgKi8KLSAgcF9zY2IgPSBhdmR0X3NjYl9ieV9oZGwoaGFuZGxlKTsKLSAgaWYgKHBfc2NiID09IE5VTEwpIHsKLSAgICByZXN1bHQgPSBBVkRUX0JBRF9IQU5ETEU7Ci0gIH0KLSAgLyogc2VuZCBldmVudCB0byBzY2IgKi8KLSAgZWxzZSB7Ci0gICAgZXZ0Lm1zZy5zZWN1cml0eV9yc3AucF9kYXRhID0gcF9kYXRhOwotICAgIGV2dC5tc2cuc2VjdXJpdHlfcnNwLmxlbiA9IGxlbjsKLSAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQVBJX1NFQ1VSSVRZX1JFUV9FVlQsICZldnQpOwotICB9Ci0KLSAgaWYgKHJlc3VsdCAhPSBBVkRUX1NVQ0NFU1MpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogcmVzdWx0PSVkIGF2ZHRfaGFuZGxlPSVkIiwgX19mdW5jX18sIHJlc3VsdCwgaGFuZGxlKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9TZWN1cml0eVJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzcG9uZCB0byBhIHNlY3VyaXR5IHJlcXVlc3QgZnJvbSB0aGUgcGVlciBkZXZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVzCi0gKiAgICAgICAgICAgICAgICAgIGFuIEFWRFRfU0VDVVJJVFlfSU5EX0VWVCB0aHJvdWdoIGl0cyBjb250cm9sIGNhbGxiYWNrLgotICogICAgICAgICAgICAgICAgICAoUGxlYXNlIG5vdGUgdGhhdCBBVkRUUCBzZWN1cml0eSBwcm9jZWR1cmVzIGFyZSB1bnJlbGF0ZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gQmx1ZXRvb3RoIGxpbmsgbGV2ZWwgc2VjdXJpdHkuKQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWRFRfU2VjdXJpdHlSc3AodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4pIHsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIHRBVkRUX1NDQl9FVlQgZXZ0OwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBhdmR0X2hhbmRsZT0lZCBsYWJlbD0lZCBlcnJvcl9jb2RlPTB4JXggbGVuPSVkIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaGFuZGxlLCBsYWJlbCwgZXJyb3JfY29kZSwgbGVuKTsKLQotICAvKiBtYXAgaGFuZGxlIHRvIHNjYiAqLwotICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChoYW5kbGUpOwotICBpZiAocF9zY2IgPT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEFWRFRfQkFEX0hBTkRMRTsKLSAgfQotICAvKiBzZW5kIGV2ZW50IHRvIHNjYiAqLwotICBlbHNlIHsKLSAgICBldnQubXNnLnNlY3VyaXR5X3JzcC5oZHIuZXJyX2NvZGUgPSBlcnJvcl9jb2RlOwotICAgIGV2dC5tc2cuc2VjdXJpdHlfcnNwLmhkci5sYWJlbCA9IGxhYmVsOwotICAgIGV2dC5tc2cuc2VjdXJpdHlfcnNwLnBfZGF0YSA9IHBfZGF0YTsKLSAgICBldnQubXNnLnNlY3VyaXR5X3JzcC5sZW4gPSBsZW47Ci0gICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9TRUNVUklUWV9SU1BfRVZULCAmZXZ0KTsKLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gQVZEVF9TVUNDRVNTKSB7Ci0gICAgQVZEVF9UUkFDRV9FUlJPUigiJXM6IHJlc3VsdD0lZCBhdmR0X2hhbmRsZT0lZCIsIF9fZnVuY19fLCByZXN1bHQsIGhhbmRsZSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfV3JpdGVSZXFPcHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBtZWRpYSBwYWNrZXQgdG8gdGhlIHBlZXIgZGV2aWNlLiAgVGhlIHN0cmVhbSBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGJlIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgQWxzbywgdGhpcwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHN0cmVhbSBpcyBhIFNSQy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gQVZEVFAgaGFzIHNlbnQgdGhlIG1lZGlhIHBhY2tldCBhbmQgaXMgcmVhZHkgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBuZXh0IHBhY2tldCwgYW4gQVZEVF9XUklURV9DRk1fRVZUIGlzIHNlbnQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHZpYSB0aGUgY29udHJvbCBjYWxsYmFjay4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIHRoZSBBVkRUX1dSSVRFX0NGTV9FVlQgYmVmb3JlIGl0IG1ha2VzIHRoZSBuZXh0Ci0gKiAgICAgICAgICAgICAgICAgIGNhbGwgdG8gQVZEVF9Xcml0ZVJlcSgpLiAgSWYgdGhlIGFwcGxpY2F0aW9ucyBjYWxscwotICogICAgICAgICAgICAgICAgICBBVkRUX1dyaXRlUmVxKCkgYmVmb3JlIGl0IHJlY2VpdmVzIHRoZSBldmVudCB0aGUgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIHdpbGwgbm90IGJlIHNlbnQuICBUaGUgYXBwbGljYXRpb24gbWF5IG1ha2UgaXRzIGZpcnN0IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgdG8gQVZEVF9Xcml0ZVJlcSgpIGFmdGVyIGl0IHJlY2VpdmVzIGFuIEFWRFRfU1RBUlRfQ0ZNX0VWVAotICogICAgICAgICAgICAgICAgICBvciBBVkRUX1NUQVJUX0lORF9FVlQuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gcGFzc2VzIHRoZSBwYWNrZXQgdXNpbmcgdGhlIEJUX0hEUgotICogICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDIuMS4gIFRoZSBvZmZzZXQKLSAqICAgICAgICAgICAgICAgICAgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gQVZEVF9NRURJQV9PRkZTRVQKLSAqICAgICAgICAgICAgICAgICAgKGlmIE5PX1JUUCBpcyBzcGVjaWZpZWQsIEwyQ0FQX01JTl9PRkZTRVQgY2FuIGJlIHVzZWQpLgotICogICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgdGhlIEwyQ0FQIGFuZAotICogICAgICAgICAgICAgICAgICBBVkRUUCBoZWFkZXJzLgotICoKLSAqICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHBfcGt0IG11c3QgYmUgYSBHS0kgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGlzIGJ1ZmZlciB3aWxsIGJlIGZyZWVkCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHRoZSBwcm90b2NvbCBzdGFjazsgdGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGZyZWUKLSAqICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGUgb3B0IHBhcmFtZXRlciBhbGxvd3MgcGFzc2luZyBzcGVjaWZpYyBvcHRpb25zIGxpa2U6Ci0gKiAgICAgICAgICAgICAgICAgIC0gTk9fUlRQIDogZG8gbm90IGFkZCB0aGUgUlRQIGhlYWRlciB0byBidWZmZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWRFRfV3JpdGVSZXFPcHQodWludDhfdCBoYW5kbGUsIEJUX0hEUiogcF9wa3QsIHVpbnQzMl90IHRpbWVfc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbV9wdCwgdEFWRFRfREFUQV9PUFRfTUFTSyBvcHQpIHsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICB0QVZEVF9TQ0JfRVZUIGV2dDsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZEVF9TVUNDRVNTOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBhdmR0X2hhbmRsZT0lZCB0aW1lc3RhbXA9JWQgbV9wdD0weCV4IG9wdD0weCV4IiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaGFuZGxlLCB0aW1lX3N0YW1wLCBtX3B0LCBvcHQpOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gc2NiICovCi0gIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKGhhbmRsZSk7Ci0gIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gQVZEVF9CQURfSEFORExFOwotICB9IGVsc2UgewotICAgIGV2dC5hcGl3cml0ZS5wX2J1ZiA9IHBfcGt0OwotICAgIGV2dC5hcGl3cml0ZS50aW1lX3N0YW1wID0gdGltZV9zdGFtcDsKLSAgICBldnQuYXBpd3JpdGUubV9wdCA9IG1fcHQ7Ci0gICAgZXZ0LmFwaXdyaXRlLm9wdCA9IG9wdDsKLSAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQVBJX1dSSVRFX1JFUV9FVlQsICZldnQpOwotICB9Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IHJlc3VsdD0lZCBhdmR0X2hhbmRsZT0lZCIsIF9fZnVuY19fLCByZXN1bHQsIGhhbmRsZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0Nvbm5lY3RSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGFuIEFWRFRQIHNpZ25hbGluZyBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyIGRldmljZS4gIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLCBhbgotICogICAgICAgICAgICAgICAgICBBVkRUX0NPTk5FQ1RfSU5EX0VWVCBpcyBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgaXRzCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24uICBJZiB0aGUgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxzCi0gKiAgICAgICAgICAgICAgICAgIGFuIEFWRFRfRElTQ09OTkVDVF9JTkRfRVZUIGlzIHNlbnQuICBUaGUgc2VjdXJpdHkgbWFzawotICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgb3ZlcnJpZGVzIHRoZSBvdXRnb2luZyBzZWN1cml0eSBtYXNrIHNldCBpbgotICogICAgICAgICAgICAgICAgICBBVkRUX1JlZ2lzdGVyKCkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX0Nvbm5lY3RSZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBjaGFubmVsX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgQXZkdHBDY2IqIHBfY2NiID0gTlVMTDsKLSAgdWludDE2X3QgcmVzdWx0ID0gQVZEVF9TVUNDRVNTOwotICB0QVZEVF9DQ0JfRVZUIGV2dDsKLQotICBBVkRUX1RSQUNFX1dBUk5JTkcoIiVzOiBhZGRyZXNzPSVzIGNoYW5uZWxfaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBjaGFubmVsX2luZGV4KTsKLQotICAvKiBmaW5kIGNoYW5uZWwgY29udHJvbCBibG9jayBmb3IgdGhpcyBiZCBhZGRyOyBpZiBub25lLCBhbGxvY2F0ZSBvbmUgKi8KLSAgcF9jY2IgPSBhdmR0X2NjYl9ieV9iZChiZF9hZGRyKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICBwX2NjYiA9IGF2ZHRfY2NiX2FsbG9jX2J5X2NoYW5uZWxfaW5kZXgoYmRfYWRkciwgY2hhbm5lbF9pbmRleCk7Ci0gICAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICAgIC8qIGNvdWxkIG5vdCBhbGxvY2F0ZSBjaGFubmVsIGNvbnRyb2wgYmxvY2sgKi8KLSAgICAgIHJlc3VsdCA9IEFWRFRfTk9fUkVTT1VSQ0VTOwotICAgIH0KLSAgfSBlbHNlIGlmICghcF9jY2ItPmxsX29wZW5lZCkgewotICAgIEFWRFRfVFJBQ0VfV0FSTklORygiQVZEVF9Db25uZWN0UmVxOiBDQ0IgTEwgaXMgaW4gdGhlIG1pZGRsZSBvZiBvcGVuaW5nIik7Ci0KLSAgICAvKiBjY2Igd2FzIGFscmVhZHkgYWxsb2NhdGVkIGZvciB0aGUgaW5jb21pbmcgc2lnbmFsbGluZy4gKi8KLSAgICByZXN1bHQgPSBBVkRUX0JVU1k7Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IEFWRFRfU1VDQ0VTUykgewotICAgIC8qIHNlbmQgZXZlbnQgdG8gY2NiICovCi0gICAgZXZ0LmNvbm5lY3QucF9jYmFjayA9IHBfY2JhY2s7Ci0gICAgYXZkdF9jY2JfZXZlbnQocF9jY2IsIEFWRFRfQ0NCX0FQSV9DT05ORUNUX1JFUV9FVlQsICZldnQpOwotICB9Ci0KLSAgQVZEVF9UUkFDRV9XQVJOSU5HKCIlczogYWRkcmVzcz0lcyByZXN1bHQ9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCByZXN1bHQpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX0Rpc2Nvbm5lY3RSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGlzY29ubmVjdCBhbiBBVkRUUCBzaWduYWxpbmcgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlciBkZXZpY2UuICBXaGVuIGRpc2Nvbm5lY3RlZCBhbgotICogICAgICAgICAgICAgICAgICBBVkRUX0RJU0NPTk5FQ1RfSU5EX0VWVCBpcyBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgaXRzCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVkRUX0Rpc2Nvbm5lY3RSZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYiA9IE5VTEw7Ci0gIHRBVkRUX1JFU1VMVCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIHRBVkRUX0NDQl9FVlQgZXZ0OwotCi0gIC8qIGZpbmQgY2hhbm5lbCBjb250cm9sIGJsb2NrIGZvciB0aGlzIGJkIGFkZHI7IGlmIG5vbmUsIGVycm9yICovCi0gIHBfY2NiID0gYXZkdF9jY2JfYnlfYmQoYmRfYWRkcik7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZmluZCBBVkRUIHN0cmVhbSBlbmRwb2ludCBwZWVyOiVzIiwKLSAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICByZXN1bHQgPSBBVkRUX0JBRF9QQVJBTVM7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0RFQlVHKCJTZW5kaW5nIGRpc2Nvbm5lY3QgcmVxdWVzdCB0byBjY2IgcGVlcjolcyIsCi0gICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSk7Ci0gICAgZXZ0LmRpc2Nvbm5lY3QucF9jYmFjayA9IHBfY2JhY2s7Ci0gICAgYXZkdF9jY2JfZXZlbnQocF9jY2IsIEFWRFRfQ0NCX0FQSV9ESVNDT05ORUNUX1JFUV9FVlQsICZldnQpOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4ocmVzdWx0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfR2V0TDJDYXBDaGFubmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIEwyQ0FQIENJRCB1c2VkIGJ5IHRoZSBoYW5kbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBDSUQgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIDAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWRFRfR2V0TDJDYXBDaGFubmVsKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLSAgQXZkdHBDY2IqIHBfY2NiOwotICB1aW50OF90IHRjaWQ7Ci0gIHVpbnQxNl90IGxjaWQgPSAwOwotCi0gIC8qIG1hcCBoYW5kbGUgdG8gc2NiICovCi0gIGlmICgoKHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKGhhbmRsZSkpICE9IE5VTEwpICYmCi0gICAgICAoKHBfY2NiID0gcF9zY2ItPnBfY2NiKSAhPSBOVUxMKSkgewotICAgIC8qIGdldCB0Y2lkIGZyb20gdHlwZSwgc2NiICovCi0gICAgdGNpZCA9IGF2ZHRfYWRfdHlwZV90b190Y2lkKEFWRFRfQ0hBTl9NRURJQSwgcF9zY2IpOwotCi0gICAgbGNpZCA9IGF2ZHRwX2NiLmFkLnJ0X3RibFthdmR0X2NjYl90b19pZHgocF9jY2IpXVt0Y2lkXS5sY2lkOwotICB9Ci0KLSAgcmV0dXJuIChsY2lkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgQVZEVC4gSWYgMHhmZiBpcyBwYXNzZWQsIHRoZQotICogICAgICAgICAgICAgICAgICBjdXJyZW50IHRyYWNlIGxldmVsIGlzIHJldHVybmVkLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIG5ld19sZXZlbDogIFRoZSBsZXZlbCB0byBzZXQgdGhlIEFWRFQgdHJhY2luZyB0bzoKLSAqICAgICAgICAgICAgICAgICAgICAgIDB4ZmYtcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nLgotICogICAgICAgICAgICAgICAgICAgICAgMC10dXJucyBvZmYgdHJhY2luZy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDEtRXJyb3JzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMi1XYXJuaW5ncy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDMtQVBJcy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDQtRXZlbnRzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gNS1EZWJ1Zy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBuZXcgdHJhY2UgbGV2ZWwgb3IgY3VycmVudCB0cmFjZSBsZXZlbCBpZgotICogICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIDB4ZmYuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBBVkRUX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBhdmR0cF9jYi5TZXRUcmFjZUxldmVsKG5ld19sZXZlbCk7Ci0KLSAgcmV0dXJuIGF2ZHRwX2NiLlRyYWNlTGV2ZWwoKTsKLX0KLQotdm9pZCBzdGFja19kZWJ1Z19hdmR0cF9hcGlfZHVtcChpbnQgZmQpIHsKLSAgaWYgKGFwcGxfdHJhY2VfbGV2ZWwgPCBCVF9UUkFDRV9MRVZFTF9ERUJVRykgcmV0dXJuOwotCi0gIGRwcmludGYoZmQsICJcbkFWRFRQIFN0YWNrIFN0YXRlOlxuIik7Ci0gIGRwcmludGYoZmQsICIgIEFWRFRQIHNpZ25hbGxpbmcgTDJDQVAgY2hhbm5lbCBNVFU6ICVkXG4iLAotICAgICAgICAgIGF2ZHRwX2NiLnJjYi5jdHJsX210dSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVkRUX05VTV9MSU5LUzsgaSsrKSB7Ci0gICAgY29uc3QgQXZkdHBDY2ImIGNjYiA9IGF2ZHRwX2NiLmNjYltpXTsKLSAgICBpZiAoY2NiLnBlZXJfYWRkci5Jc0VtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBkcHJpbnRmKGZkLCAiXG4gIENoYW5uZWwgY29udHJvbCBibG9jazogJXp1IHBlZXI6ICVzXG4iLCBpLAotICAgICAgICAgICAgY2NiLnBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIGRwcmludGYoZmQsICIgICAgQWxsb2NhdGVkOiAlc1xuIiwgY2NiLmFsbG9jYXRlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGRwcmludGYoZmQsICIgICAgU3RhdGU6ICVkXG4iLCBjY2Iuc3RhdGUpOwotICAgIGRwcmludGYoZmQsICIgICAgTGluay1sYXllciBvcGVuZWQ6ICVzXG4iLAotICAgICAgICAgICAgY2NiLmxsX29wZW5lZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGRwcmludGYoZmQsICIgICAgRGlzY292ZXIgaW4gcHJvZ3Jlc3M6ICVzXG4iLAotICAgICAgICAgICAgY2NiLnByb2NfYnVzeSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGRwcmludGYoZmQsICIgICAgQ29uZ2VzdGVkOiAlc1xuIiwgY2NiLmNvbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIFJlaW5pdGlhdGUgY29ubmVjdGlvbiBvbiBpZGxlOiAlc1xuIiwKLSAgICAgICAgICAgIGNjYi5yZWNvbm4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIENvbW1hbmQgcmV0cmFuc21pc3Npb24gY291bnQ6ICVkXG4iLCBjY2IucmV0X2NvdW50KTsKLSAgICBkcHJpbnRmKGZkLCAiICAgIEJUQSBBViBTQ0IgaW5kZXg6ICVkXG4iLCBjY2IuQnRhQXZTY2JJbmRleCgpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVZEVF9OVU1fU0VQUzsgaSsrKSB7Ci0gICAgICBjb25zdCBBdmR0cFNjYiYgc2NiID0gY2NiLnNjYltpXTsKLSAgICAgIGlmICghc2NiLmluX3VzZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGRwcmludGYoZmQsICJcbiAgICBTdHJlYW0gY29udHJvbCBibG9jazogJXp1XG4iLCBpKTsKLSAgICAgIGRwcmludGYoZmQsICIgICAgICBTRVAgY29kZWM6ICVzXG4iLAotICAgICAgICAgICAgICBBMkRQX0NvZGVjTmFtZShzY2Iuc3RyZWFtX2NvbmZpZy5jZmcuY29kZWNfaW5mbykpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIFNFUCBwcm90b2NvbCBzZXJ2aWNlIGNhcGFiaWxpdGllczogMHgleFxuIiwKLSAgICAgICAgICAgICAgc2NiLnN0cmVhbV9jb25maWcuY2ZnLnBzY19tYXNrKTsKLSAgICAgIGRwcmludGYoZmQsICIgICAgICBTRVAgdHlwZTogMHgleFxuIiwgc2NiLnN0cmVhbV9jb25maWcudHNlcCk7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgTWVkaWEgdHlwZTogMHgleFxuIiwgc2NiLnN0cmVhbV9jb25maWcubWVkaWFfdHlwZSk7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgTVRVOiAlZFxuIiwgc2NiLnN0cmVhbV9jb25maWcubXR1KTsKLSAgICAgIGRwcmludGYoZmQsICIgICAgICBBVkRUIFNDQiBoYW5kbGU6ICVkXG4iLCBzY2IuU2NiSGFuZGxlKCkpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIFNDQiBpbmRleDogJWRcbiIsIHNjYi5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgQ29uZmlndXJlZCBjb2RlYzogJXNcbiIsCi0gICAgICAgICAgICAgIEEyRFBfQ29kZWNOYW1lKHNjYi5jdXJyX2NmZy5jb2RlY19pbmZvKSk7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgUmVxdWVzdGVkIGNvZGVjOiAlc1xuIiwKLSAgICAgICAgICAgICAgQTJEUF9Db2RlY05hbWUoc2NiLnJlcV9jZmcuY29kZWNfaW5mbykpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIFRyYW5zcG9ydCBjaGFubmVsIGNvbm5lY3QgdGltZXI6ICVzXG4iLAotICAgICAgICAgICAgICBhbGFybV9pc19zY2hlZHVsZWQoc2NiLnRyYW5zcG9ydF9jaGFubmVsX3RpbWVyKQotICAgICAgICAgICAgICAgICAgPyAiU2NoZWR1bGVkIgotICAgICAgICAgICAgICAgICAgOiAiTm90IHNjaGVkdWxlZCIpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIENoYW5uZWwgY29udHJvbCBibG9jayBwZWVyOiAlc1xuIiwKLSAgICAgICAgICAgICAgKHNjYi5wX2NjYiAhPSBudWxscHRyKSA/IHNjYi5wX2NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm51bGwiKTsKLSAgICAgIGRwcmludGYoZmQsICIgICAgICBBbGxvY2F0ZWQ6ICVzXG4iLCBzY2IuYWxsb2NhdGVkID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgSW4gdXNlOiAlc1xuIiwgc2NiLmluX3VzZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIFJvbGU6IDB4JXhcbiIsIHNjYi5yb2xlKTsKLSAgICAgIGRwcmludGYoZmQsICIgICAgICBSZW1vdmU6ICVzXG4iLCBzY2IucmVtb3ZlID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgU3RhdGU6ICVkXG4iLCBzY2Iuc3RhdGUpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIFBlZXIgU0VJRDogJWRcbiIsIHNjYi5wZWVyX3NlaWQpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIEN1cnJlbnQgZXZlbnQ6ICVkXG4iLCBzY2IuY3Vycl9ldnQpOwotICAgICAgZHByaW50ZihmZCwgIiAgICAgIENvbmdlc3RlZDogJXNcbiIsIHNjYi5jb25nID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBkcHJpbnRmKGZkLCAiICAgICAgQ2xvc2UgcmVzcG9uc2UgY29kZTogJWRcbiIsIHNjYi5jbG9zZV9jb2RlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2ZHQvYXZkdF9jY2IuY2MgYi9zdGFjay9hdmR0L2F2ZHRfY2NiLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODIyMGNkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2ZHQvYXZkdF9jY2IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY2hhbm5lbCBjb250cm9sIGJsb2NrIHN0YXRlIG1hY2hpbmUgYW5kCi0gKiAgZnVuY3Rpb25zIHdoaWNoIG9wZXJhdGUgb24gdGhlIGNoYW5uZWwgY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgImF2ZHRfaW50LmgiCi0jaW5jbHVkZSAiYXZkdGNfYXBpLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RhdGUgbWFjaGluZSBjb25zdGFudHMgYW5kIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdmVyYm9zZSBzdGF0ZSBzdHJpbmdzIGZvciB0cmFjZSAqLwotY29uc3QgY2hhciogY29uc3QgYXZkdF9jY2Jfc3Rfc3RyW10gPSB7IkNDQl9JRExFX1NUIiwgIkNDQl9PUEVOSU5HX1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQ0JfT1BFTl9TVCIsICJDQ0JfQ0xPU0lOR19TVCJ9OwotCi0vKiB2ZXJib3NlIGV2ZW50IHN0cmluZ3MgZm9yIHRyYWNlICovCi1jb25zdCBjaGFyKiBjb25zdCBhdmR0X2NjYl9ldnRfc3RyW10gPSB7Ci0gICAgIkFQSV9ESVNDT1ZFUl9SRVFfRVZUIiwgIkFQSV9HRVRDQVBfUkVRX0VWVCIsCi0gICAgIkFQSV9TVEFSVF9SRVFfRVZUIiwgICAgIkFQSV9TVVNQRU5EX1JFUV9FVlQiLAotICAgICJBUElfRElTQ09WRVJfUlNQX0VWVCIsICJBUElfR0VUQ0FQX1JTUF9FVlQiLAotICAgICJBUElfU1RBUlRfUlNQX0VWVCIsICAgICJBUElfU1VTUEVORF9SU1BfRVZUIiwKLSAgICAiQVBJX0NPTk5FQ1RfUkVRX0VWVCIsICAiQVBJX0RJU0NPTk5FQ1RfUkVRX0VWVCIsCi0gICAgIk1TR19ESVNDT1ZFUl9DTURfRVZUIiwgIk1TR19HRVRDQVBfQ01EX0VWVCIsCi0gICAgIk1TR19TVEFSVF9DTURfRVZUIiwgICAgIk1TR19TVVNQRU5EX0NNRF9FVlQiLAotICAgICJNU0dfRElTQ09WRVJfUlNQX0VWVCIsICJNU0dfR0VUQ0FQX1JTUF9FVlQiLAotICAgICJNU0dfU1RBUlRfUlNQX0VWVCIsICAgICJNU0dfU1VTUEVORF9SU1BfRVZUIiwKLSAgICAiUkNWUlNQX0VWVCIsICAgICAgICAgICAiU0VORE1TR19FVlQiLAotICAgICJSRVRfVE9VVF9FVlQiLCAgICAgICAgICJSU1BfVE9VVF9FVlQiLAotICAgICJJRExFX1RPVVRfRVZUIiwgICAgICAgICJVTF9PUEVOX0VWVCIsCi0gICAgIlVMX0NMT1NFX0VWVCIsICAgICAgICAgIkxMX09QRU5fRVZUIiwKLSAgICAiTExfQ0xPU0VfRVZUIiwgICAgICAgICAiTExfQ09OR19FVlQifTsKLQotLyogYWN0aW9uIGZ1bmN0aW9uIGxpc3QgKi8KLWNvbnN0IHRBVkRUX0NDQl9BQ1RJT04gYXZkdF9jY2JfYWN0aW9uW10gPSB7Ci0gICAgYXZkdF9jY2JfY2hhbl9vcGVuLCAgICAgICAgYXZkdF9jY2JfY2hhbl9jbG9zZSwKLSAgICBhdmR0X2NjYl9jaGtfY2xvc2UsICAgICAgICBhdmR0X2NjYl9oZGxfZGlzY292ZXJfY21kLAotICAgIGF2ZHRfY2NiX2hkbF9kaXNjb3Zlcl9yc3AsIGF2ZHRfY2NiX2hkbF9nZXRjYXBfY21kLAotICAgIGF2ZHRfY2NiX2hkbF9nZXRjYXBfcnNwLCAgIGF2ZHRfY2NiX2hkbF9zdGFydF9jbWQsCi0gICAgYXZkdF9jY2JfaGRsX3N0YXJ0X3JzcCwgICAgYXZkdF9jY2JfaGRsX3N1c3BlbmRfY21kLAotICAgIGF2ZHRfY2NiX2hkbF9zdXNwZW5kX3JzcCwgIGF2ZHRfY2NiX3NuZF9kaXNjb3Zlcl9jbWQsCi0gICAgYXZkdF9jY2Jfc25kX2Rpc2NvdmVyX3JzcCwgYXZkdF9jY2Jfc25kX2dldGNhcF9jbWQsCi0gICAgYXZkdF9jY2Jfc25kX2dldGNhcF9yc3AsICAgYXZkdF9jY2Jfc25kX3N0YXJ0X2NtZCwKLSAgICBhdmR0X2NjYl9zbmRfc3RhcnRfcnNwLCAgICBhdmR0X2NjYl9zbmRfc3VzcGVuZF9jbWQsCi0gICAgYXZkdF9jY2Jfc25kX3N1c3BlbmRfcnNwLCAgYXZkdF9jY2JfY2xlYXJfY21kcywKLSAgICBhdmR0X2NjYl9jbWRfZmFpbCwgICAgICAgICBhdmR0X2NjYl9mcmVlX2NtZCwKLSAgICBhdmR0X2NjYl9jb25nX3N0YXRlLCAgICAgICBhdmR0X2NjYl9yZXRfY21kLAotICAgIGF2ZHRfY2NiX3NuZF9jbWQsICAgICAgICAgIGF2ZHRfY2NiX3NuZF9tc2csCi0gICAgYXZkdF9jY2Jfc2V0X3JlY29ubiwgICAgICAgYXZkdF9jY2JfY2xyX3JlY29ubiwKLSAgICBhdmR0X2NjYl9jaGtfcmVjb25uLCAgICAgICBhdmR0X2NjYl9jaGtfdGltZXIsCi0gICAgYXZkdF9jY2Jfc2V0X2Nvbm4sICAgICAgICAgYXZkdF9jY2Jfc2V0X2Rpc2Nvbm4sCi0gICAgYXZkdF9jY2JfZG9fZGlzY29ubiwgICAgICAgYXZkdF9jY2JfbGxfY2xvc2VkLAotICAgIGF2ZHRfY2NiX2xsX29wZW5lZCwgICAgICAgIGF2ZHRfY2NiX2RlYWxsb2N9OwotCi0vKiBzdGF0ZSB0YWJsZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBBVkRUX0NDQl9BQ1RJT05TIDIgICAgLyogbnVtYmVyIG9mIGFjdGlvbnMgKi8KLSNkZWZpbmUgQVZEVF9DQ0JfTkVYVF9TVEFURSAyIC8qIHBvc2l0aW9uIG9mIG5leHQgc3RhdGUgKi8KLSNkZWZpbmUgQVZEVF9DQ0JfTlVNX0NPTFMgMyAgIC8qIG51bWJlciBvZiBjb2x1bW5zIGluIHN0YXRlIHRhYmxlcyAqLwotCi0vKiBzdGF0ZSB0YWJsZSBmb3IgaWRsZSBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBhdmR0X2NjYl9zdF9pZGxlW11bQVZEVF9DQ0JfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICovCi0gICAgLyogQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogQVBJX0RJU0NPVkVSX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU05EX0RJU0NPVkVSX0NNRCwgQVZEVF9DQ0JfQ0hBTl9PUEVOLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfR0VUQ0FQX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU05EX0dFVENBUF9DTUQsIEFWRFRfQ0NCX0NIQU5fT1BFTiwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX1NUQVJUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9TVVNQRU5EX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9ESVNDT1ZFUl9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfR0VUQ0FQX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9TVEFSVF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfU1VTUEVORF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfQ09OTkVDVF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX1NFVF9DT05OLCBBVkRUX0NDQl9DSEFOX09QRU4sIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9ESVNDT05ORUNUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19ESVNDT1ZFUl9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfR0VUQ0FQX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19TVEFSVF9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfU1VTUEVORF9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfRElTQ09WRVJfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9IRExfRElTQ09WRVJfUlNQLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19HRVRDQVBfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9IRExfR0VUQ0FQX1JTUCwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9IRExfU1RBUlRfUlNQLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSERMX1NVU1BFTkRfUlNQLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIFJDVlJTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIFNFTkRNU0dfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBSRVRfVE9VVF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9LAotICAgIC8qIFJTUF9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSURMRV9TVH0sCi0gICAgLyogSURMRV9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSURMRV9TVH0sCi0gICAgLyogVUxfT1BFTl9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfQ0hBTl9PUEVOLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIFVMX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSURMRV9TVH0sCi0gICAgLyogTExfT1BFTl9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfTExfT1BFTkVELCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIExMX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX0NDQl9MTF9DTE9TRUQsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSURMRV9TVH0sCi0gICAgLyogTExfQ09OR19FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lETEVfU1R9fTsKLQotLyogc3RhdGUgdGFibGUgZm9yIG9wZW5pbmcgc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9jY2Jfc3Rfb3BlbmluZ1tdW0FWRFRfQ0NCX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAqLwotICAgIC8qIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEFQSV9ESVNDT1ZFUl9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX1NORF9ESVNDT1ZFUl9DTUQsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX0dFVENBUF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX1NORF9HRVRDQVBfQ01ELCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9TVEFSVF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfU1VTUEVORF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfRElTQ09WRVJfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX0dFVENBUF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX1NVU1BFTkRfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX0NPTk5FQ1RfUkVRX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TRVRfQ09OTiwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfRElTQ09OTkVDVF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX1NFVF9ESVNDT05OLCBBVkRUX0NDQl9ET19ESVNDT05OLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfRElTQ09WRVJfQ01EX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX0dFVENBUF9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfQ01EX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfQ01EX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX0RJU0NPVkVSX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19HRVRDQVBfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NUQVJUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIFJDVlJTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIFNFTkRNU0dfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBSRVRfVE9VVF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIFJTUF9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogSURMRV9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTklOR19TVH0sCi0gICAgLyogVUxfT1BFTl9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5JTkdfU1R9LAotICAgIC8qIFVMX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DTEVBUl9DTURTLCBBVkRUX0NDQl9DSEFOX0NMT1NFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBMTF9PUEVOX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TTkRfQ01ELCBBVkRUX0NDQl9MTF9PUEVORUQsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIExMX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX0NDQl9MTF9DTE9TRUQsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSURMRV9TVH0sCi0gICAgLyogTExfQ09OR19FVlQgKi8KLSAgICB7QVZEVF9DQ0JfQ09OR19TVEFURSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOSU5HX1NUfX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciBvcGVuIHN0YXRlICovCi1jb25zdCB1aW50OF90IGF2ZHRfY2NiX3N0X29wZW5bXVtBVkRUX0NDQl9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgKi8KLSAgICAvKiBBY3Rpb24gMSAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBBUElfRElTQ09WRVJfUkVRX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TTkRfRElTQ09WRVJfQ01ELCBBVkRUX0NDQl9TTkRfQ01ELCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfR0VUQ0FQX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU05EX0dFVENBUF9DTUQsIEFWRFRfQ0NCX1NORF9DTUQsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9TVEFSVF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX1NORF9TVEFSVF9DTUQsIEFWRFRfQ0NCX1NORF9DTUQsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9TVVNQRU5EX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU05EX1NVU1BFTkRfQ01ELCBBVkRUX0NDQl9TTkRfQ01ELCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfRElTQ09WRVJfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TTkRfRElTQ09WRVJfUlNQLCBBVkRUX0NDQl9TTkRfQ01ELCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfR0VUQ0FQX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU05EX0dFVENBUF9SU1AsIEFWRFRfQ0NCX1NORF9DTUQsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9TVEFSVF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX1NORF9TVEFSVF9SU1AsIEFWRFRfQ0NCX1NORF9DTUQsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9TVVNQRU5EX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU05EX1NVU1BFTkRfUlNQLCBBVkRUX0NDQl9TTkRfQ01ELCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfQ09OTkVDVF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX1NFVF9DT05OLCBBVkRUX0NDQl9MTF9PUEVORUQsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9ESVNDT05ORUNUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU0VUX0RJU0NPTk4sIEFWRFRfQ0NCX0RPX0RJU0NPTk4sIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19ESVNDT1ZFUl9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9ESVNDT1ZFUl9DTUQsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX0dFVENBUF9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9HRVRDQVBfQ01ELCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19TVEFSVF9DTURfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9TVEFSVF9DTUQsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfQ01EX0VWVCAqLwotICAgIHtBVkRUX0NDQl9IRExfU1VTUEVORF9DTUQsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX0RJU0NPVkVSX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfQ0hLX0NMT1NFLCBBVkRUX0NDQl9IRExfRElTQ09WRVJfUlNQLCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfR0VUQ0FQX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfQ0hLX0NMT1NFLCBBVkRUX0NDQl9IRExfR0VUQ0FQX1JTUCwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX1NUQVJUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSERMX1NUQVJUX1JTUCwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfU1VTUEVORF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9TVVNQRU5EX1JTUCwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBSQ1ZSU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0ZSRUVfQ01ELCBBVkRUX0NDQl9TTkRfQ01ELCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBTRU5ETVNHX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TTkRfTVNHLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIFJFVF9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9SRVRfQ01ELCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX09QRU5fU1R9LAotICAgIC8qIFJTUF9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DTURfRkFJTCwgQVZEVF9DQ0JfU05EX0NNRCwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogSURMRV9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DTEVBUl9DTURTLCBBVkRUX0NDQl9DSEFOX0NMT1NFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBVTF9PUEVOX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DSEtfVElNRVIsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogVUxfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfQ0NCX0NIS19DTE9TRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9PUEVOX1NUfSwKLSAgICAvKiBMTF9PUEVOX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfT1BFTl9TVH0sCi0gICAgLyogTExfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfQ0NCX0xMX0NMT1NFRCwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBMTF9DT05HX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DT05HX1NUQVRFLCBBVkRUX0NDQl9TTkRfTVNHLCBBVkRUX0NDQl9PUEVOX1NUfX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciBjbG9zaW5nIHN0YXRlICovCi1jb25zdCB1aW50OF90IGF2ZHRfY2NiX3N0X2Nsb3NpbmdbXVtBVkRUX0NDQl9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgKi8KLSAgICAvKiBBY3Rpb24gMSAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBBUElfRElTQ09WRVJfUkVRX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TRVRfUkVDT05OLCBBVkRUX0NDQl9TTkRfRElTQ09WRVJfQ01ELCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfR0VUQ0FQX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfU0VUX1JFQ09OTiwgQVZEVF9DQ0JfU05EX0dFVENBUF9DTUQsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9TVEFSVF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfU1VTUEVORF9SRVFfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfRElTQ09WRVJfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX0dFVENBUF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1NVU1BFTkRfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX0NPTk5FQ1RfUkVRX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TRVRfUkVDT05OLCBBVkRUX0NDQl9TRVRfQ09OTiwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX0RJU0NPTk5FQ1RfUkVRX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DTFJfUkVDT05OLCBBVkRUX0NDQl9TRVRfRElTQ09OTiwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX0RJU0NPVkVSX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19HRVRDQVBfQ01EX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NUQVJUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19ESVNDT1ZFUl9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9ESVNDT1ZFUl9SU1AsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX0dFVENBUF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9HRVRDQVBfUlNQLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19TVEFSVF9SU1BfRVZUICovCi0gICAge0FWRFRfQ0NCX0hETF9TVEFSVF9SU1AsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9IRExfU1VTUEVORF9SU1AsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogUkNWUlNQX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogU0VORE1TR19FVlQgKi8KLSAgICB7QVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIFJFVF9UT1VUX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogUlNQX1RPVVRfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBJRExFX1RPVVRfRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBVTF9PUEVOX0VWVCAqLwotICAgIHtBVkRUX0NDQl9TRVRfUkVDT05OLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIFVMX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX0NDQl9DTFJfUkVDT05OLCBBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIExMX09QRU5fRVZUICovCi0gICAge0FWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBMTF9DTE9TRV9FVlQgKi8KLSAgICB7QVZEVF9DQ0JfQ0hLX1JFQ09OTiwgQVZEVF9DQ0JfSUdOT1JFLCBBVkRUX0NDQl9JRExFX1NUfSwKLSAgICAvKiBMTF9DT05HX0VWVCAqLwotICAgIHtBVkRUX0NDQl9JR05PUkUsIEFWRFRfQ0NCX0lHTk9SRSwgQVZEVF9DQ0JfQ0xPU0lOR19TVH19OwotCi0vKiB0eXBlIGZvciBzdGF0ZSB0YWJsZSAqLwotdHlwZWRlZiBjb25zdCB1aW50OF90ICgqdEFWRFRfQ0NCX1NUX1RCTClbQVZEVF9DQ0JfTlVNX0NPTFNdOwotCi0vKiBzdGF0ZSB0YWJsZSAqLwotY29uc3QgdEFWRFRfQ0NCX1NUX1RCTCBhdmR0X2NjYl9zdF90YmxbXSA9IHsKLSAgICBhdmR0X2NjYl9zdF9pZGxlLCBhdmR0X2NjYl9zdF9vcGVuaW5nLCBhdmR0X2NjYl9zdF9vcGVuLAotICAgIGF2ZHRfY2NiX3N0X2Nsb3Npbmd9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSBjaGFubmVsIGNvbnRyb2wgYmxvY2sgbW9kdWxlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfaW5pdCh2b2lkKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVZEVF9OVU1fTElOS1M7IGkrKykgewotICAgIGF2ZHRwX2NiLmNjYltpXS5SZXNldChpKTsKLSAgfQotICBhdmR0cF9jYi5wX2NjYl9hY3QgPSBhdmR0X2NjYl9hY3Rpb247Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhdGUgbWFjaGluZSBldmVudCBoYW5kbGluZyBmdW5jdGlvbiBmb3IgY2NiCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9ldmVudChBdmR0cENjYiogcF9jY2IsIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9DQ0JfU1RfVEJMIHN0YXRlX3RhYmxlOwotICB1aW50OF90IGFjdGlvbjsKLSAgaW50IGk7Ci0KLSNpZiAoQVZEVF9ERUJVRyA9PSBUUlVFKQotICBBVkRUX1RSQUNFX0VWRU5UKCIlczogQ0NCIGNjYj0lZCBldmVudD0lcyBzdGF0ZT0lcyBwX2NjYj0lcCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGF2ZHRfY2NiX3RvX2lkeChwX2NjYiksIGF2ZHRfY2NiX2V2dF9zdHJbZXZlbnRdLAotICAgICAgICAgICAgICAgICAgIGF2ZHRfY2NiX3N0X3N0cltwX2NjYi0+c3RhdGVdLCBwX2NjYik7Ci0jZW5kaWYKLQotICAvKiBsb29rIHVwIHRoZSBzdGF0ZSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgc3RhdGVfdGFibGUgPSBhdmR0X2NjYl9zdF90YmxbcF9jY2ItPnN0YXRlXTsKLQotICAvKiBzZXQgbmV4dCBzdGF0ZSAqLwotICBpZiAocF9jY2ItPnN0YXRlICE9IHN0YXRlX3RhYmxlW2V2ZW50XVtBVkRUX0NDQl9ORVhUX1NUQVRFXSkgewotICAgIHBfY2NiLT5zdGF0ZSA9IHN0YXRlX3RhYmxlW2V2ZW50XVtBVkRUX0NDQl9ORVhUX1NUQVRFXTsKLSAgfQotCi0gIC8qIGV4ZWN1dGUgYWN0aW9uIGZ1bmN0aW9ucyAqLwotICBmb3IgKGkgPSAwOyBpIDwgQVZEVF9DQ0JfQUNUSU9OUzsgaSsrKSB7Ci0gICAgYWN0aW9uID0gc3RhdGVfdGFibGVbZXZlbnRdW2ldOwotICAgIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBldmVudD0lcyBzdGF0ZT0lcyBhY3Rpb249JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGF2ZHRfY2NiX2V2dF9zdHJbZXZlbnRdLCBhdmR0X2NjYl9zdF9zdHJbcF9jY2ItPnN0YXRlXSwKLSAgICAgICAgICAgICAgICAgICAgIGFjdGlvbik7Ci0gICAgaWYgKGFjdGlvbiAhPSBBVkRUX0NDQl9JR05PUkUpIHsKLSAgICAgICgqYXZkdHBfY2IucF9jY2JfYWN0W2FjdGlvbl0pKHBfY2NiLCBwX2RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2J5X2JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGxvb2t1cCBmdW5jdGlvbiBmaW5kcyB0aGUgY2NiIGZvciBhIEJEIGFkZHJlc3MuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2NiLCBvciBOVUxMIGlmIG5vbmUgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUF2ZHRwQ2NiKiBhdmR0X2NjYl9ieV9iZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYiA9ICZhdmR0cF9jYi5jY2JbMF07Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBBVkRUX05VTV9MSU5LUzsgaSsrLCBwX2NjYisrKSB7Ci0gICAgLyogaWYgYWxsb2NhdGVkIGNjYiBoYXMgbWF0Y2hpbmcgY2NiICovCi0gICAgaWYgKHBfY2NiLT5hbGxvY2F0ZWQgJiYgcF9jY2ItPnBlZXJfYWRkciA9PSBiZF9hZGRyKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoaSA9PSBBVkRUX05VTV9MSU5LUykgewotICAgIC8qIGlmIG5vIGNjYiBmb3VuZCAqLwotICAgIHBfY2NiID0gTlVMTDsKLQotICAgIFZMT0coMSkgPDwgIk5vIGNjYiBmb3IgYWRkciAiIDw8IGJkX2FkZHI7Ci0gIH0KLSAgcmV0dXJuIHBfY2NiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFsbG9jYXRlIGEgY2hhbm5lbCBjb250cm9sIGJsb2NrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNjYiwgb3IgTlVMTCBpZiBub25lIGNvdWxkIGJlIGFsbG9jYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQXZkdHBDY2IqIGF2ZHRfY2NiX2FsbG9jKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgLy8gRmluZCBhdmFpbGFibGUgZW50cnkKLSAgQXZkdHBDY2IqIHBfY2NiID0gJmF2ZHRwX2NiLmNjYlswXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVkRUX05VTV9MSU5LUzsgaSsrLCBwX2NjYisrKSB7Ci0gICAgaWYgKCFwX2NjYi0+YWxsb2NhdGVkKSB7Ci0gICAgICBwX2NjYi0+QWxsb2NhdGUoYmRfYWRkcik7Ci0gICAgICBBVkRUX1RSQUNFX0RFQlVHKCIlczogYWxsb2NhdGVkIChpbmRleCAlZCkgZm9yIHBlZXIgJXMiLCBfX2Z1bmNfXywgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHBfY2NiOwotICAgIH0KLSAgfQotCi0gIEFWRFRfVFJBQ0VfV0FSTklORygiJXM6IG91dCBvZiBBdmR0cENjYiBlbnRyaWVzIiwgX19mdW5jX18pOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQXZkdHBDY2IqIGF2ZHRfY2NiX2FsbG9jX2J5X2NoYW5uZWxfaW5kZXgoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9pbmRleCkgewotICAvLyBBbGxvY2F0ZSB0aGUgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBpbmRleAotICBpZiAoY2hhbm5lbF9pbmRleCA+PSBBVkRUX05VTV9MSU5LUykgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiBwZWVyICVzIGludmFsaWQgY2hhbm5lbCBpbmRleCAlZCAobWF4ICVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIGNoYW5uZWxfaW5kZXgsIEFWRFRfTlVNX0xJTktTKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBBdmR0cENjYiogcF9jY2IgPSAmYXZkdHBfY2IuY2NiW2NoYW5uZWxfaW5kZXhdOwotICBpZiAocF9jY2ItPmFsbG9jYXRlZCkgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoIiVzOiBwZWVyICVzIGNoYW5uZWwgaW5kZXggJWQgYWxyZWFkeSBhbGxvY2F0ZWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBjaGFubmVsX2luZGV4KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBwX2NjYi0+QWxsb2NhdGUoYmRfYWRkcik7Ci0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBhbGxvY2F0ZWQgKGluZGV4ICVkKSBwZWVyPSVzIHBfY2NiPSVwIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleCwgcF9jY2ItPnBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksIHBfY2NiKTsKLSAgcmV0dXJuIHBfY2NiOwotfQotCi12b2lkIEF2ZHRwQ2NiOjpBbGxvY2F0ZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHJlc3MpIHsKLSAgUmVzZXRDY2IoKTsKLSAgcGVlcl9hZGRyID0gcGVlcl9hZGRyZXNzOwotICBjbWRfcSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIHJzcF9xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgaWRsZV9jY2JfdGltZXIgPSBhbGFybV9uZXcoImF2ZHRwX2NjYi5pZGxlX2NjYl90aW1lciIpOwotICByZXRfY2NiX3RpbWVyID0gYWxhcm1fbmV3KCJhdmR0cF9jY2IucmV0X2NjYl90aW1lciIpOwotICByc3BfY2NiX3RpbWVyID0gYWxhcm1fbmV3KCJhdmR0cF9jY2IucnNwX2NjYl90aW1lciIpOwotICBhbGxvY2F0ZWQgPSB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfZGVhbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVhbGxvY2F0ZSBhIHN0cmVhbSBjb250cm9sIGJsb2NrLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfZGVhbGxvYyhBdmR0cENjYiogcF9jY2IsIFVOVVNFRF9BVFRSIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICBBVkRUX1RSQUNFX0RFQlVHKCIlczogZGVhbGxvY2F0ZWQgKGluZGV4ICVkKSBwZWVyPSVzIHBfY2NiPSVwIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgYXZkdF9jY2JfdG9faWR4KHBfY2NiKSwgcF9jY2ItPnBlZXJfYWRkci5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcF9jY2IpOwotICBwX2NjYi0+UmVzZXRDY2IoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3RvX2lkeAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gYSBwb2ludGVyIHRvIGFuIGNjYiwgcmV0dXJuIGl0cyBpbmRleC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBJbmRleCBvZiBjY2IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYXZkdF9jY2JfdG9faWR4KEF2ZHRwQ2NiKiBwX2NjYikgewotICAvKiB1c2UgYXJyYXkgYXJpdGhtZXRpYyB0byBkZXRlcm1pbmUgaW5kZXggKi8KLSAgcmV0dXJuICh1aW50OF90KShwX2NjYiAtIGF2ZHRwX2NiLmNjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9ieV9pZHgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybiBjY2IgcG9pbnRlciBiYXNlZCBvbiBjY2IgaW5kZXguCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY2NiLCBvciBOVUxMIGlmIG5vbmUgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUF2ZHRwQ2NiKiBhdmR0X2NjYl9ieV9pZHgodWludDhfdCBpZHgpIHsKLSAgQXZkdHBDY2IqIHBfY2NiOwotCi0gIC8qIHZlcmlmeSBpbmRleCAqLwotICBpZiAoaWR4IDwgQVZEVF9OVU1fTElOS1MpIHsKLSAgICBwX2NjYiA9ICZhdmR0cF9jYi5jY2JbaWR4XTsKLSAgfSBlbHNlIHsKLSAgICBwX2NjYiA9IE5VTEw7Ci0gICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJObyBjY2IgZm9yIGlkeCAlZCIsIGlkeCk7Ci0gIH0KLSAgcmV0dXJuIHBfY2NiOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZkdC9hdmR0X2NjYl9hY3QuY2MgYi9zdGFjay9hdmR0L2F2ZHRfY2NiX2FjdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmODgxNy4uMDAwMDAwMAotLS0gYS9zdGFjay9hdmR0L2F2ZHRfY2NiX2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgYWN0aW9uIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYW5uZWwKLSAqICBjb250cm9sIGJsb2NrIHN0YXRlIG1hY2hpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJhdmR0X2ludC5oIgotI2luY2x1ZGUgImF2ZHRjX2FwaS5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfY2xlYXJfY2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyBvdXQgY2VydGFpbiBidWZmZXJzLCBxdWV1ZXMsIGFuZAotICogICAgICAgICAgICAgICAgICBvdGhlciBkYXRhIGVsZW1lbnRzIG9mIGEgY2NiLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGF2ZHRfY2NiX2NsZWFyX2NjYihBdmR0cENjYiogcF9jY2IpIHsKLSAgQlRfSERSKiBwX2J1ZjsKLQotICAvKiBjbGVhciBjZXJ0YWluIGNjYiB2YXJpYWJsZXMgKi8KLSAgcF9jY2ItPmNvbmcgPSBmYWxzZTsKLSAgcF9jY2ItPnJldF9jb3VudCA9IDA7Ci0KLSAgLyogZnJlZSBtZXNzYWdlIGJlaW5nIGZyYWdtZW50ZWQgKi8KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfY2NiLT5wX2N1cnJfbXNnKTsKLQotICAvKiBmcmVlIG1lc3NhZ2UgYmVpbmcgcmVhc3NlbWJsZWQgKi8KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfY2NiLT5wX3J4X21zZyk7Ci0KLSAgLyogY2xlYXIgb3V0IHJlc3BvbnNlIHF1ZXVlICovCi0gIHdoaWxlICgocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2NjYi0+cnNwX3EpKSAhPSBOVUxMKQotICAgIG9zaV9mcmVlKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2NoYW5fb3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyBhdmR0X2FkX29wZW5fcmVxKCkgdG8KLSAqICAgICAgICAgICAgICAgICAgaW5pdGlhdGUgYSBzaWduYWxpbmcgY2hhbm5lbCBjb25uZWN0aW9uLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfY2hhbl9vcGVuKEF2ZHRwQ2NiKiBwX2NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIGF2ZHRfYWRfb3Blbl9yZXEoQVZEVF9DSEFOX1NJRywgcF9jY2IsIE5VTEwsIEFWRFRfSU5UKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2NoYW5fY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgYXZkdF9hZF9jbG9zZV9yZXEoKSB0byBjbG9zZSBhCi0gKiAgICAgICAgICAgICAgICAgIHNpZ25hbGluZyBjaGFubmVsIGNvbm5lY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9jaGFuX2Nsb3NlKEF2ZHRwQ2NiKiBwX2NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIC8qIGNsb3NlIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCB1c2VkIGJ5IHRoaXMgQ0NCICovCi0gIGF2ZHRfYWRfY2xvc2VfcmVxKEFWRFRfQ0hBTl9TSUcsIHBfY2NiLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2Noa19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIGFjdGl2ZSBzdHJlYW1zIG9uIHRoaXMgQ0NCLgotICogICAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbm9uZSwgaXQgc3RhcnRzIGFuIGlkbGUgdGltZXIuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9jaGtfY2xvc2UoQXZkdHBDY2IqIHBfY2NiLCBVTlVTRURfQVRUUiB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgaW50IGk7Ci0gIEF2ZHRwU2NiKiBwX3NjYiA9ICYocF9jY2ItPnNjYlswXSk7Ci0KLSAgLyogc2VlIGlmIHRoZXJlIGFyZSBhbnkgYWN0aXZlIHNjYnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2NiICovCi0gIGZvciAoaSA9IDA7IGkgPCBBVkRUX05VTV9TRVBTOyBpKyssIHBfc2NiKyspIHsKLSAgICBpZiAoKHBfc2NiLT5hbGxvY2F0ZWQpICYmIChwX3NjYi0+cF9jY2IgPT0gcF9jY2IpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiBubyBhY3RpdmUgc2NicyBzdGFydCBpZGxlIHRpbWVyICovCi0gIGlmIChpID09IEFWRFRfTlVNX1NFUFMpIHsKLSAgICBhbGFybV9jYW5jZWwocF9jY2ItPnJldF9jY2JfdGltZXIpOwotICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+cnNwX2NjYl90aW1lcik7Ci0gICAgdWludDY0X3QgaW50ZXJ2YWxfbXMgPSBhdmR0cF9jYi5yY2IuaWRsZV90b3V0ICogMTAwMDsKLSAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmlkbGVfY2NiX3RpbWVyLCBpbnRlcnZhbF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9jY2JfaWRsZV9jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9oZGxfZGlzY292ZXJfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGlzY292ZXIgY29tbWFuZCBpcwotICogICAgICAgICAgICAgICAgICByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLiAgSXQgZ2F0aGVycyB1cCB0aGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciBhbGwgYWxsb2NhdGVkIHN0cmVhbXMgYW5kIGluaXRpYXRlcwotICogICAgICAgICAgICAgICAgICBzZW5kaW5nIG9mIGEgZGlzY292ZXIgcmVzcG9uc2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9oZGxfZGlzY292ZXJfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkRUX1NFUF9JTkZPIHNlcF9pbmZvW0FWRFRfTlVNX1NFUFNdOwotICBBdmR0cFNjYiogcF9zY2IgPSAmKHBfY2NiLT5zY2JbMF0pOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBwX2NjYiBpbmRleD0lZCIsIF9fZnVuY19fLCBhdmR0X2NjYl90b19pZHgocF9jY2IpKTsKLQotICBwX2RhdGEtPm1zZy5kaXNjb3Zlcl9yc3AucF9zZXBfaW5mbyA9IHNlcF9pbmZvOwotICBwX2RhdGEtPm1zZy5kaXNjb3Zlcl9yc3AubnVtX3NlcHMgPSAwOwotCi0gIC8qIGZvciBhbGwgYWxsb2NhdGVkIHNjYnMgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVkRUX05VTV9TRVBTOyBpKyssIHBfc2NiKyspIHsKLSAgICBpZiAocF9zY2ItPmFsbG9jYXRlZCkgewotICAgICAgLyogY29weSBzZXAgaW5mbyAqLwotICAgICAgc2VwX2luZm9bcF9kYXRhLT5tc2cuZGlzY292ZXJfcnNwLm51bV9zZXBzXS5pbl91c2UgPSBwX3NjYi0+aW5fdXNlOwotICAgICAgc2VwX2luZm9bcF9kYXRhLT5tc2cuZGlzY292ZXJfcnNwLm51bV9zZXBzXS5zZWlkID0gcF9zY2ItPlNjYkhhbmRsZSgpOwotICAgICAgc2VwX2luZm9bcF9kYXRhLT5tc2cuZGlzY292ZXJfcnNwLm51bV9zZXBzXS5tZWRpYV90eXBlID0KLSAgICAgICAgICBwX3NjYi0+c3RyZWFtX2NvbmZpZy5tZWRpYV90eXBlOwotICAgICAgc2VwX2luZm9bcF9kYXRhLT5tc2cuZGlzY292ZXJfcnNwLm51bV9zZXBzXS50c2VwID0KLSAgICAgICAgICBwX3NjYi0+c3RyZWFtX2NvbmZpZy50c2VwOwotCi0gICAgICBwX2RhdGEtPm1zZy5kaXNjb3Zlcl9yc3AubnVtX3NlcHMrKzsKLSAgICB9Ci0gIH0KLQotICAvKiBzZW5kIHJlc3BvbnNlICovCi0gIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9BUElfRElTQ09WRVJfUlNQX0VWVCwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2hkbF9kaXNjb3Zlcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBkaXNjb3ZlciByZXNwb25zZSBvcgotICogICAgICAgICAgICAgICAgICByZWplY3QgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4gIEl0IGNhbGxzIHRoZSBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSByZXN1bHRzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfaGRsX2Rpc2NvdmVyX3JzcChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICAvKiB3ZSdyZSBkb25lIHdpdGggcHJvY2VkdXJlICovCi0gIHBfY2NiLT5wcm9jX2J1c3kgPSBmYWxzZTsKLQotICAvKiBjYWxsIGFwcCBjYWxsYmFjayB3aXRoIHJlc3VsdHMgKi8KLSAgKCpwX2NjYi0+cHJvY19jYmFjaykoMCwgcF9jY2ItPnBlZXJfYWRkciwgQVZEVF9ESVNDT1ZFUl9DRk1fRVZULAotICAgICAgICAgICAgICAgICAgICAgICAodEFWRFRfQ1RSTCopKCZwX2RhdGEtPm1zZy5kaXNjb3Zlcl9yc3ApLAotICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+QnRhQXZTY2JJbmRleCgpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2hkbF9nZXRjYXBfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZ2V0IGNhcGFiaWxpdGllcyBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIGlzIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIuICBJdCByZXRyaWV2ZXMgdGhlIHN0cmVhbQotICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHN0cmVhbSBhbmQgaW5pdGlhdGVzCi0gKiAgICAgICAgICAgICAgICAgIHNlbmRpbmcgb2YgYSBnZXQgY2FwYWJpbGl0aWVzIHJlc3BvbnNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfaGRsX2dldGNhcF9jbWQoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgLyogbG9vayB1cCBzY2IgZm9yIHNlaWQgc2VudCB0byB1cyAqLwotICBBdmR0cFNjYiogcF9zY2IgPSBhdmR0X3NjYl9ieV9oZGwocF9kYXRhLT5tc2cuc2luZ2xlLnNlaWQpOwotCi0gIGlmIChwX3NjYiA9PSBudWxscHRyKSB7Ci0gICAgLyogbm90IG9rLCBzZW5kIHJlamVjdCAqLwotICAgIHBfZGF0YS0+bXNnLmhkci5lcnJfY29kZSA9IEFWRFRfRVJSX0JBRF9TVEFURTsKLSAgICBwX2RhdGEtPm1zZy5oZHIuZXJyX3BhcmFtID0gcF9kYXRhLT5tc2cuc2luZ2xlLnNlaWQ7Ci0gICAgYXZkdF9tc2dfc2VuZF9yZWoocF9jY2IsIEFWRFRfU0lHX1NUQVJULCAmcF9kYXRhLT5tc2cpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfZGF0YS0+bXNnLnN2Y2NhcC5wX2NmZyA9ICZwX3NjYi0+c3RyZWFtX2NvbmZpZy5jZmc7Ci0KLSAgYXZkdF9jY2JfZXZlbnQocF9jY2IsIEFWRFRfQ0NCX0FQSV9HRVRDQVBfUlNQX0VWVCwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2hkbF9nZXRjYXBfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEgZ2V0IGNhcGFiaWxpdGllcyByZXNwb25zZQotICogICAgICAgICAgICAgICAgICBvciByZWplY3QgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4gIEl0IGNhbGxzIHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSByZXN1bHRzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfaGRsX2dldGNhcF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgLyogd2UncmUgZG9uZSB3aXRoIHByb2NlZHVyZSAqLwotICBwX2NjYi0+cHJvY19idXN5ID0gZmFsc2U7Ci0KLSAgLyogY2FsbCBhcHAgY2FsbGJhY2sgd2l0aCByZXN1bHRzICovCi0gICgqcF9jY2ItPnByb2NfY2JhY2spKDAsIHBfY2NiLT5wZWVyX2FkZHIsIEFWRFRfR0VUQ0FQX0NGTV9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICh0QVZEVF9DVFJMKikoJnBfZGF0YS0+bXNnLnN2Y2NhcCksCi0gICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5CdGFBdlNjYkluZGV4KCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfaGRsX3N0YXJ0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHN0YXJ0IGNvbW1hbmQgaXMgcmVjZWl2ZWQKLSAqICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcGVlci4gIEl0IHZlcmlmaWVzIHRoYXQgYWxsIHJlcXVlc3RlZCBzdHJlYW1zCi0gKiAgICAgICAgICAgICAgICAgIGFyZSBpbiB0aGUgcHJvcGVyIHN0YXRlLiAgSWYgc28sIGl0IGluaXRpYXRlcyBzZW5kaW5nIG9mCi0gKiAgICAgICAgICAgICAgICAgIGEgc3RhcnQgcmVzcG9uc2UuICBPdGhlcndpc2UgaXQgc2VuZHMgYSBzdGFydCByZWplY3QuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9oZGxfc3RhcnRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QgZXJyX2NvZGUgPSAwOwotCi0gIC8qIHZlcmlmeSBhbGwgc3RyZWFtcyBpbiB0aGUgcmlnaHQgc3RhdGUgKi8KLSAgdWludDhfdCBzZWlkID0KLSAgICAgIGF2ZHRfc2NiX3ZlcmlmeShwX2NjYiwgQVZEVF9WRVJJRllfU1RBUlQsIHBfZGF0YS0+bXNnLm11bHRpLnNlaWRfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm1zZy5tdWx0aS5udW1fc2VwcywgJmVycl9jb2RlKTsKLSAgaWYgKHNlaWQgPT0gMCAmJiBlcnJfY29kZSA9PSAwKSB7Ci0gICAgLyogd2UncmUgb2ssIHNlbmQgcmVzcG9uc2UgKi8KLSAgICBhdmR0X2NjYl9ldmVudChwX2NjYiwgQVZEVF9DQ0JfQVBJX1NUQVJUX1JTUF9FVlQsIHBfZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogbm90IG9rLCBzZW5kIHJlamVjdCAqLwotICAgIHBfZGF0YS0+bXNnLmhkci5lcnJfY29kZSA9IGVycl9jb2RlOwotICAgIHBfZGF0YS0+bXNnLmhkci5lcnJfcGFyYW0gPSBzZWlkOwotICAgIGF2ZHRfbXNnX3NlbmRfcmVqKHBfY2NiLCBBVkRUX1NJR19TVEFSVCwgJnBfZGF0YS0+bXNnKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfaGRsX3N0YXJ0X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHN0YXJ0IHJlc3BvbnNlIG9yIHJlamVjdAotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLiAgVXNpbmcgdGhlIFNFSURzIHN0b3JlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgY3VycmVudCBjb21tYW5kIG1lc3NhZ2UsIGl0IHNlbmRzIGEgc3RhcnQgcmVzcG9uc2Ugb3Igc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgcmVqZWN0IGV2ZW50IHRvIGVhY2ggU0NCIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2hkbF9zdGFydF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdWludDhfdCBldmVudDsKLSAgaW50IGk7Ci0gIHVpbnQ4X3QqIHA7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLQotICAvKiBkZXRlcm1pbmUgcnNwIG9yIHJlaiBldmVudCAqLwotICBldmVudCA9IChwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPT0gMCkgPyBBVkRUX1NDQl9NU0dfU1RBUlRfUlNQX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVkRUX1NDQl9NU0dfU1RBUlRfUkVKX0VWVDsKLQotICAvKiBnZXQgdG8gd2hlcmUgc2VpZCdzIGFyZSBzdGFzaGVkIGluIGN1cnJlbnQgY21kICovCi0gIHAgPSAodWludDhfdCopKHBfY2NiLT5wX2N1cnJfY21kICsgMSk7Ci0KLSAgLyogbGl0dGxlIHRyaWNrIGhlcmU7IGxlbmd0aCBvZiBjdXJyZW50IGNvbW1hbmQgZXF1YWxzIG51bWJlciBvZiBzdHJlYW1zICovCi0gIGZvciAoaSA9IDA7IGkgPCBwX2NjYi0+cF9jdXJyX2NtZC0+bGVuOyBpKyspIHsKLSAgICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChwW2ldKTsKLSAgICBpZiAocF9zY2IgIT0gTlVMTCkgewotICAgICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIGV2ZW50LCAodEFWRFRfU0NCX0VWVCopJnBfZGF0YS0+bXNnKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2hkbF9zdXNwZW5kX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHN1c3BlbmQgY29tbWFuZCBpcyByZWNlaXZlZAotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBwZWVyLiAgSXQgdmVyaWZpZXMgdGhhdCBhbGwgcmVxdWVzdGVkIHN0cmVhbXMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSBwcm9wZXIgc3RhdGUuICBJZiBzbywgaXQgaW5pdGlhdGVzIHNlbmRpbmcgb2YgYQotICogICAgICAgICAgICAgICAgICBzdXNwZW5kIHJlc3BvbnNlLiAgT3RoZXJ3aXNlIGl0IHNlbmRzIGEgc3VzcGVuZCByZWplY3QuCi0KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2hkbF9zdXNwZW5kX2NtZChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICB1aW50OF90IHNlaWQ7Ci0gIHVpbnQ4X3QgZXJyX2NvZGUgPSAwOwotCi0gIC8qIHZlcmlmeSBhbGwgc3RyZWFtcyBpbiB0aGUgcmlnaHQgc3RhdGUgKi8KLSAgaWYgKChzZWlkID0gYXZkdF9zY2JfdmVyaWZ5KHBfY2NiLCBBVkRUX1ZFUklGWV9TVVNQRU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5tc2cubXVsdGkuc2VpZF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5tc2cubXVsdGkubnVtX3NlcHMsICZlcnJfY29kZSkpID09IDAgJiYKLSAgICAgIGVycl9jb2RlID09IDApIHsKLSAgICAvKiB3ZSdyZSBvaywgc2VuZCByZXNwb25zZSAqLwotICAgIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9BUElfU1VTUEVORF9SU1BfRVZULCBwX2RhdGEpOwotICB9IGVsc2UgewotICAgIC8qIG5vdCBvaywgc2VuZCByZWplY3QgKi8KLSAgICBwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPSBlcnJfY29kZTsKLSAgICBwX2RhdGEtPm1zZy5oZHIuZXJyX3BhcmFtID0gc2VpZDsKLSAgICBhdmR0X21zZ19zZW5kX3JlaihwX2NjYiwgQVZEVF9TSUdfU1VTUEVORCwgJnBfZGF0YS0+bXNnKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfaGRsX3N1c3BlbmRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgc3VzcGVuZCByZXNwb25zZSBvciByZWplY3QKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4gIFVzaW5nIHRoZSBTRUlEcyBzdG9yZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgY29tbWFuZCBtZXNzYWdlLCBpdCBzZW5kcyBhIHN1c3BlbmQgcmVzcG9uc2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgc3VzcGVuZCByZWplY3QgZXZlbnQgdG8gZWFjaCBTQ0IgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogICAgICAgICAgICAgICAgICBjb21tYW5kLgotICoKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2hkbF9zdXNwZW5kX3JzcChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICB1aW50OF90IGV2ZW50OwotICBpbnQgaTsKLSAgdWludDhfdCogcDsKLSAgQXZkdHBTY2IqIHBfc2NiOwotCi0gIC8qIGRldGVybWluZSByc3Agb3IgcmVqIGV2ZW50ICovCi0gIGV2ZW50ID0gKHBfZGF0YS0+bXNnLmhkci5lcnJfY29kZSA9PSAwKSA/IEFWRFRfU0NCX01TR19TVVNQRU5EX1JTUF9FVlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZEVF9TQ0JfTVNHX1NVU1BFTkRfUkVKX0VWVDsKLQotICAvKiBnZXQgdG8gd2hlcmUgc2VpZCdzIGFyZSBzdGFzaGVkIGluIGN1cnJlbnQgY21kICovCi0gIHAgPSAodWludDhfdCopKHBfY2NiLT5wX2N1cnJfY21kICsgMSk7Ci0KLSAgLyogbGl0dGxlIHRyaWNrIGhlcmU7IGxlbmd0aCBvZiBjdXJyZW50IGNvbW1hbmQgZXF1YWxzIG51bWJlciBvZiBzdHJlYW1zICovCi0gIGZvciAoaSA9IDA7IGkgPCBwX2NjYi0+cF9jdXJyX2NtZC0+bGVuOyBpKyspIHsKLSAgICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChwW2ldKTsKLSAgICBpZiAocF9zY2IgIT0gTlVMTCkgewotICAgICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIGV2ZW50LCAodEFWRFRfU0NCX0VWVCopJnBfZGF0YS0+bXNnKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NuZF9kaXNjb3Zlcl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYSBkaXNjb3ZlciBjb21tYW5kIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBwZWVyLiAgSXQgY29waWVzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSBwcm9jZWR1cmUgZnJvbQotICogICAgICAgICAgICAgICAgICB0aGUgZXZlbnQgdG8gdGhlIENDQi4gIEl0IG1hcmtzIHRoZSBDQ0IgYXMgYnVzeSBhbmQgdGhlbgotICogICAgICAgICAgICAgICAgICBzZW5kcyBhIGRpc2NvdmVyIGNvbW1hbmQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zbmRfZGlzY292ZXJfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIC8qIHN0b3JlIGluZm8gaW4gY2NiIHN0cnVjdCAqLwotICBwX2NjYi0+cF9wcm9jX2RhdGEgPSBwX2RhdGEtPmRpc2NvdmVyLnBfc2VwX2luZm87Ci0gIHBfY2NiLT5wcm9jX2NiYWNrID0gcF9kYXRhLT5kaXNjb3Zlci5wX2NiYWNrOwotICBwX2NjYi0+cHJvY19wYXJhbSA9IHBfZGF0YS0+ZGlzY292ZXIubnVtX3NlcHM7Ci0KLSAgLyogd2UncmUgYnVzeSAqLwotICBwX2NjYi0+cHJvY19idXN5ID0gdHJ1ZTsKLQotICAvKiBidWlsZCBhbmQgcXVldWUgZGlzY292ZXIgcmVxICovCi0gIGF2ZHRfbXNnX3NlbmRfY21kKHBfY2NiLCBOVUxMLCBBVkRUX1NJR19ESVNDT1ZFUiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9zbmRfZGlzY292ZXJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgZGlzY292ZXIgcmVzcG9uc2UgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIHBlZXIuICBJdCB0YWtlcyB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHBhc3NlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQgYW5kIHNlbmRzIGEgZGlzY292ZXIgcmVzcG9uc2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zbmRfZGlzY292ZXJfcnNwKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIC8qIHNlbmQgcmVzcG9uc2UgKi8KLSAgYXZkdF9tc2dfc2VuZF9yc3AocF9jY2IsIEFWRFRfU0lHX0RJU0NPVkVSLCAmcF9kYXRhLT5tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2Jfc25kX2dldGNhcF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYSBnZXQgY2FwYWJpbGl0aWVzIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHBlZXIuICBJdCBjb3BpZXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHByb2NlZHVyZQotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBldmVudCB0byB0aGUgQ0NCLiAgSXQgbWFya3MgdGhlIENDQiBhcyBidXN5IGFuZAotICogICAgICAgICAgICAgICAgICB0aGVuIHNlbmRzIGEgZ2V0IGNhcGFiaWxpdGllcyBjb21tYW5kLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2Jfc25kX2dldGNhcF9jbWQoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdWludDhfdCBzaWdfaWQgPSBBVkRUX1NJR19HRVRDQVA7Ci0KLSAgLyogc3RvcmUgaW5mbyBpbiBjY2Igc3RydWN0ICovCi0gIHBfY2NiLT5wX3Byb2NfZGF0YSA9IHBfZGF0YS0+Z2V0Y2FwLnBfY2ZnOwotICBwX2NjYi0+cHJvY19jYmFjayA9IHBfZGF0YS0+Z2V0Y2FwLnBfY2JhY2s7Ci0KLSAgLyogd2UncmUgYnVzeSAqLwotICBwX2NjYi0+cHJvY19idXN5ID0gdHJ1ZTsKLQotICAvKiBidWlsZCBhbmQgcXVldWUgZGlzY292ZXIgcmVxICovCi0gIGlmIChwX2RhdGEtPm1zZy5oZHIuc2lnX2lkID09IEFWRFRfU0lHX0dFVF9BTExDQVApCi0gICAgc2lnX2lkID0gQVZEVF9TSUdfR0VUX0FMTENBUDsKLQotICBhdmR0X21zZ19zZW5kX2NtZChwX2NjYiwgTlVMTCwgc2lnX2lkLCAodEFWRFRfTVNHKikmcF9kYXRhLT5nZXRjYXAuc2luZ2xlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NuZF9nZXRjYXBfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgZ2V0IGNhcGFiaWxpdGllcyByZXNwb25zZQotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlci4gIEl0IHRha2VzIHRoZSBzdHJlYW0gaW5mb3JtYXRpb24gcGFzc2VkIGluIHRoZQotICogICAgICAgICAgICAgICAgICBldmVudCBhbmQgc2VuZHMgYSBnZXQgY2FwYWJpbGl0aWVzIHJlc3BvbnNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2Jfc25kX2dldGNhcF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdWludDhfdCBzaWdfaWQgPSBBVkRUX1NJR19HRVRDQVA7Ci0KLSAgaWYgKHBfZGF0YS0+bXNnLmhkci5zaWdfaWQgPT0gQVZEVF9TSUdfR0VUX0FMTENBUCkKLSAgICBzaWdfaWQgPSBBVkRUX1NJR19HRVRfQUxMQ0FQOwotCi0gIC8qIHNlbmQgcmVzcG9uc2UgKi8KLSAgYXZkdF9tc2dfc2VuZF9yc3AocF9jY2IsIHNpZ19pZCwgJnBfZGF0YS0+bXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NuZF9zdGFydF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYSBzdGFydCBjb21tYW5kIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBwZWVyLiAgSXQgdmVyaWZpZXMgdGhhdCBhbGwgcmVxdWVzdGVkIHN0cmVhbXMgYXJlIGluIHRoZQotICogICAgICAgICAgICAgICAgICBwcm9wZXIgc3RhdGUuICBJZiBzbywgaXQgc2VuZHMgYSBzdGFydCBjb21tYW5kLiAgT3RoZXJ3aXNlCi0gKiAgICAgICAgICAgICAgICAgIHNlbmQgb3Vyc2VsdmVzIGJhY2sgYSBzdGFydCByZWplY3QuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zbmRfc3RhcnRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIGludCBpOwotICBBdmR0cFNjYiogcF9zY2I7Ci0gIHRBVkRUX01TRyBhdmR0X21zZzsKLSAgdWludDhfdCBzZWlkX2xpc3RbQVZEVF9OVU1fU0VQU107Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogbWFrZSBjb3B5IG9mIG91ciBzZWlkIGxpc3QgKi8KLSAgbWVtY3B5KHNlaWRfbGlzdCwgcF9kYXRhLT5tc2cubXVsdGkuc2VpZF9saXN0LCBwX2RhdGEtPm1zZy5tdWx0aS5udW1fc2Vwcyk7Ci0KLSAgLyogdmVyaWZ5IGFsbCBzdHJlYW1zIGluIHRoZSByaWdodCBzdGF0ZSAqLwotICBhdmR0X21zZy5oZHIuZXJyX3BhcmFtID0KLSAgICAgIGF2ZHRfc2NiX3ZlcmlmeShwX2NjYiwgQVZEVF9WRVJJRllfT1BFTiwgcF9kYXRhLT5tc2cubXVsdGkuc2VpZF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bXNnLm11bHRpLm51bV9zZXBzLCAmYXZkdF9tc2cuaGRyLmVycl9jb2RlKTsKLSAgaWYgKGF2ZHRfbXNnLmhkci5lcnJfcGFyYW0gPT0gMCkgewotICAgIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBBVkRUX1NJR19TVEFSVCIsIF9fZnVuY19fKTsKLQotICAgIC8qIHNldCBwZWVyIHNlaWQgbGlzdCBpbiBtZXNzc2FnZSAqLwotICAgIGF2ZHRfc2NiX3BlZXJfc2VpZF9saXN0KCZwX2RhdGEtPm1zZy5tdWx0aSk7Ci0KLSAgICAvKiBzZW5kIGNvbW1hbmQgKi8KLSAgICBhdmR0X21zZ19zZW5kX2NtZChwX2NjYiwgc2VpZF9saXN0LCBBVkRUX1NJR19TVEFSVCwgJnBfZGF0YS0+bXNnKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBmYWlsZWQ7IHNlbmQgb3Vyc2VsdmVzIGEgcmVqZWN0IGZvciBlYWNoIHN0cmVhbSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBwX2RhdGEtPm1zZy5tdWx0aS5udW1fc2VwczsgaSsrKSB7Ci0gICAgICBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChzZWlkX2xpc3RbaV0pOwotICAgICAgaWYgKHBfc2NiICE9IE5VTEwpIHsKLSAgICAgICAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IEFWRFRfU0NCX01TR19TVEFSVF9SRUpfRVZUOiBpPSVkIiwgX19mdW5jX18sIGkpOwotICAgICAgICB0QVZEVF9TQ0JfRVZUIGF2ZHRfc2NiX2V2dDsKLSAgICAgICAgYXZkdF9zY2JfZXZ0Lm1zZy5oZHIgPSBhdmR0X21zZy5oZHI7Ci0gICAgICAgIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9NU0dfU1RBUlRfUkVKX0VWVCwgJmF2ZHRfc2NiX2V2dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9zbmRfc3RhcnRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgc3RhcnQgcmVzcG9uc2UgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBlZXIuICBJdCB0YWtlcyB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHBhc3NlZCBpbiB0aGUgZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgYW5kIHNlbmRzIGEgc3RhcnQgcmVzcG9uc2UuICBUaGVuIGl0IHNlbmRzIGEgc3RhcnQgZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIFNDQiBmb3IgZWFjaCBzdHJlYW0uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zbmRfc3RhcnRfcnNwKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLSAgaW50IGk7Ci0KLSAgLyogc2VuZCByZXNwb25zZSBtZXNzYWdlICovCi0gIGF2ZHRfbXNnX3NlbmRfcnNwKHBfY2NiLCBBVkRUX1NJR19TVEFSVCwgJnBfZGF0YS0+bXNnKTsKLQotICAvKiBzZW5kIHN0YXJ0IGV2ZW50IHRvIGVhY2ggc2NiICovCi0gIGZvciAoaSA9IDA7IGkgPCBwX2RhdGEtPm1zZy5tdWx0aS5udW1fc2VwczsgaSsrKSB7Ci0gICAgcF9zY2IgPSBhdmR0X3NjYl9ieV9oZGwocF9kYXRhLT5tc2cubXVsdGkuc2VpZF9saXN0W2ldKTsKLSAgICBpZiAocF9zY2IgIT0gTlVMTCkgewotICAgICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX01TR19TVEFSVF9DTURfRVZULCBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NuZF9zdXNwZW5kX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhIHN1c3BlbmQgY29tbWFuZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGVlci4gIEl0IHZlcmlmaWVzIHRoYXQgYWxsIHJlcXVlc3RlZCBzdHJlYW1zIGFyZSBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcHJvcGVyIHN0YXRlLiAgSWYgc28sIGl0IHNlbmRzIGEgc3VzcGVuZCBjb21tYW5kLgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UgaXQgY2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIHJlcXVlc3RlZAotICogICAgICAgICAgICAgICAgICBzdHJlYW0gYW5kIHNlbmRzIGEgc3VzcGVuZCBjb25maXJtYXRpb24gd2l0aCBmYWlsdXJlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2Jfc25kX3N1c3BlbmRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIGludCBpOwotICBBdmR0cFNjYiogcF9zY2I7Ci0gIHRBVkRUX01TRyBhdmR0X21zZzsKLSAgdWludDhfdCBzZWlkX2xpc3RbQVZEVF9OVU1fU0VQU107Ci0KLSAgLyogbWFrZSBjb3B5IG9mIG91ciBzZWlkIGxpc3QgKi8KLSAgbWVtY3B5KHNlaWRfbGlzdCwgcF9kYXRhLT5tc2cubXVsdGkuc2VpZF9saXN0LCBwX2RhdGEtPm1zZy5tdWx0aS5udW1fc2Vwcyk7Ci0KLSAgLyogdmVyaWZ5IGFsbCBzdHJlYW1zIGluIHRoZSByaWdodCBzdGF0ZSAqLwotICBhdmR0X21zZy5oZHIuZXJyX3BhcmFtID0KLSAgICAgIGF2ZHRfc2NiX3ZlcmlmeShwX2NjYiwgQVZEVF9WRVJJRllfU1RSRUFNSU5HLCBwX2RhdGEtPm1zZy5tdWx0aS5zZWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5tc2cubXVsdGkubnVtX3NlcHMsICZhdmR0X21zZy5oZHIuZXJyX2NvZGUpOwotICBpZiAoYXZkdF9tc2cuaGRyLmVycl9wYXJhbSA9PSAwKSB7Ci0gICAgLyogc2V0IHBlZXIgc2VpZCBsaXN0IGluIG1lc3NzYWdlICovCi0gICAgYXZkdF9zY2JfcGVlcl9zZWlkX2xpc3QoJnBfZGF0YS0+bXNnLm11bHRpKTsKLQotICAgIC8qIHNlbmQgY29tbWFuZCAqLwotICAgIGF2ZHRfbXNnX3NlbmRfY21kKHBfY2NiLCBzZWlkX2xpc3QsIEFWRFRfU0lHX1NVU1BFTkQsICZwX2RhdGEtPm1zZyk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZmFpbGVkOyBzZW5kIG91cnNlbHZlcyBhIHJlamVjdCBmb3IgZWFjaCBzdHJlYW0gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLT5tc2cubXVsdGkubnVtX3NlcHM7IGkrKykgewotICAgICAgcF9zY2IgPSBhdmR0X3NjYl9ieV9oZGwoc2VpZF9saXN0W2ldKTsKLSAgICAgIGlmIChwX3NjYiAhPSBOVUxMKSB7Ci0gICAgICAgIHRBVkRUX1NDQl9FVlQgYXZkdF9zY2JfZXZ0OwotICAgICAgICBhdmR0X3NjYl9ldnQubXNnLmhkciA9IGF2ZHRfbXNnLmhkcjsKLSAgICAgICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX01TR19TVVNQRU5EX1JFSl9FVlQsICZhdmR0X3NjYl9ldnQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2Jfc25kX3N1c3BlbmRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgc3VzcGVuZCByZXNwb25zZSB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGVlci4gIEl0IHRha2VzIHRoZSBzdHJlYW0gaW5mb3JtYXRpb24gcGFzc2VkIGluIHRoZSBldmVudAotICogICAgICAgICAgICAgICAgICBhbmQgc2VuZHMgYSBzdXNwZW5kIHJlc3BvbnNlLiAgVGhlbiBpdCBzZW5kcyBhIHN1c3BlbmQgZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIFNDQiBmb3IgZWFjaCBzdHJlYW0uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zbmRfc3VzcGVuZF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgQXZkdHBTY2IqIHBfc2NiOwotICBpbnQgaTsKLQotICAvKiBzZW5kIHJlc3BvbnNlIG1lc3NhZ2UgKi8KLSAgYXZkdF9tc2dfc2VuZF9yc3AocF9jY2IsIEFWRFRfU0lHX1NVU1BFTkQsICZwX2RhdGEtPm1zZyk7Ci0KLSAgLyogc2VuZCBzdGFydCBldmVudCB0byBlYWNoIHNjYiAqLwotICBmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLT5tc2cubXVsdGkubnVtX3NlcHM7IGkrKykgewotICAgIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKHBfZGF0YS0+bXNnLm11bHRpLnNlaWRfbGlzdFtpXSk7Ci0gICAgaWYgKHBfc2NiICE9IE5VTEwpIHsKLSAgICAgIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9NU0dfU1VTUEVORF9DTURfRVZULCBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2NsZWFyX2NtZHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNpZ25hbGluZyBjaGFubmVsIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNsb3NlZCB0byBjbGVhbiB1cCBhbnkgcGVuZGluZyBjb21tYW5kcy4gIEZvciBlYWNoIHBlbmRpbmcKLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBxdWV1ZSwgaXQgZnJlZXMgdGhlIGNvbW1hbmQgYW5kCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxzIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiBpbmRpY2F0aW5nIGZhaWx1cmUuCi0gKiAgICAgICAgICAgICAgICAgIENlcnRhaW4gQ0NCIHZhcmlhYmxlcyBhcmUgYWxzbyBpbml0aWFsaXplZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2NsZWFyX2NtZHMoQXZkdHBDY2IqIHBfY2NiLCBVTlVTRURfQVRUUiB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgaW50IGk7Ci0gIEF2ZHRwU2NiKiBwX3NjYiA9ICYocF9jY2ItPnNjYlswXSk7Ci0gIHVpbnQ4X3QgZXJyX2NvZGUgPSBBVkRUX0VSUl9DT05ORUNUOwotCi0gIC8qIGNsZWFyIHRoZSBjY2IgKi8KLSAgYXZkdF9jY2JfY2xlYXJfY2NiKHBfY2NiKTsKLQotICAvKiBjbGVhciBvdXQgY29tbWFuZCBxdWV1ZTsgdGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgaGVyZTsgd2UgbmVlZAotICAqKiB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSBjb21tYW5kIG9uIGRlY2sgaW4gcF9jdXJyX2NtZCwKLSAgKiogcGx1cyB3ZSBuZWVkIHRvIGNsZWFyIG91dCB0aGUgcXVldWUKLSAgKi8KLSAgZG8gewotICAgIC8qIHdlIGtub3cgcF9jdXJyX2NtZCA9IE5VTEwgYWZ0ZXIgdGhpcyAqLwotICAgIHRBVkRUX0NDQl9FVlQgYXZkdF9jY2JfZXZ0OwotICAgIGF2ZHRfY2NiX2V2dC5lcnJfY29kZSA9IGVycl9jb2RlOwotICAgIGF2ZHRfY2NiX2NtZF9mYWlsKHBfY2NiLCAmYXZkdF9jY2JfZXZ0KTsKLQotICAgIC8qIHNldCB1cCBuZXh0IG1lc3NhZ2UgKi8KLSAgICBwX2NjYi0+cF9jdXJyX2NtZCA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT5jbWRfcSk7Ci0KLSAgfSB3aGlsZSAocF9jY2ItPnBfY3Vycl9jbWQgIT0gTlVMTCk7Ci0KLSAgLyogc2VuZCBhIENDX0NMT1NFX0VWVCBhbnkgYWN0aXZlIHNjYnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2NiICovCi0gIGZvciAoaSA9IDA7IGkgPCBBVkRUX05VTV9TRVBTOyBpKyssIHBfc2NiKyspIHsKLSAgICBpZiAoKHBfc2NiLT5hbGxvY2F0ZWQpICYmIChwX3NjYi0+cF9jY2IgPT0gcF9jY2IpKSB7Ci0gICAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQ0NfQ0xPU0VfRVZULCBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX2NtZF9mYWlsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcmVzcG9uc2UgdGltZW91dC4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGN1cnJlbnRseSBwZW5kaW5nIGNvbW1hbmQgaXMgZnJlZWQgYW5kIHdlIGZha2UgYQotICogICAgICAgICAgICAgICAgICByZWplY3QgbWVzc2FnZSBiYWNrIHRvIG91cnNlbHZlcy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2NtZF9mYWlsKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkRUX01TRyBtc2c7Ci0gIHVpbnQ4X3QgZXZ0OwotICBBdmR0cFNjYiogcF9zY2I7Ci0KLSAgaWYgKHBfY2NiLT5wX2N1cnJfY21kICE9IE5VTEwpIHsKLSAgICAvKiBzZXQgdXAgZGF0YSAqLwotICAgIG1zZy5oZHIuZXJyX2NvZGUgPSBwX2RhdGEtPmVycl9jb2RlOwotICAgIG1zZy5oZHIuZXJyX3BhcmFtID0gMDsKLSAgICBtc2cuaGRyLmNjYl9pZHggPSBhdmR0X2NjYl90b19pZHgocF9jY2IpOwotCi0gICAgLyogcHJldGVuZCB0aGF0IHdlIHJlY2VpdmVkIGEgcmVqIG1lc3NhZ2UgKi8KLSAgICBldnQgPSBhdmR0X21zZ19yZWpfMl9ldnRbcF9jY2ItPnBfY3Vycl9jbWQtPmV2ZW50IC0gMV07Ci0KLSAgICBpZiAoZXZ0ICYgQVZEVF9DQ0JfTUtSKSB7Ci0gICAgICB0QVZEVF9DQ0JfRVZUIGF2ZHRfY2NiX2V2dDsKLSAgICAgIGF2ZHRfY2NiX2V2dC5tc2cgPSBtc2c7Ci0gICAgICBhdmR0X2NjYl9ldmVudChwX2NjYiwgKHVpbnQ4X3QpKGV2dCAmIH5BVkRUX0NDQl9NS1IpLCAmYXZkdF9jY2JfZXZ0KTsKLSAgICB9IGVsc2UgewotICAgICAgLyogd2UgZ2V0IHRoZSBzY2Igb3V0IG9mIHRoZSBjdXJyZW50IGNtZCAqLwotICAgICAgcF9zY2IgPSBhdmR0X3NjYl9ieV9oZGwoKigodWludDhfdCopKHBfY2NiLT5wX2N1cnJfY21kICsgMSkpKTsKLSAgICAgIGlmIChwX3NjYiAhPSBOVUxMKSB7Ci0gICAgICAgIHRBVkRUX1NDQl9FVlQgYXZkdF9zY2JfZXZ0OwotICAgICAgICBhdmR0X3NjYl9ldnQubXNnID0gbXNnOwotICAgICAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgZXZ0LCAmYXZkdF9zY2JfZXZ0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jY2ItPnBfY3Vycl9jbWQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9mcmVlX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZvciBhCi0gKiAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGNvbW1hbmQuICBUaGUgY29tbWFuZCBpcyBmcmVlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2ZyZWVfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2NjYi0+cF9jdXJyX2NtZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9jb25nX3N0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIGNvbmdlc3Rpb24gc3RhdGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBDQ0IuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9jb25nX3N0YXRlKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIHBfY2NiLT5jb25nID0gcF9kYXRhLT5sbGNvbmc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9yZXRfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyYW5zbWl0IHRoZSBjdXJyZW50bHkKLSAqICAgICAgICAgICAgICAgICAgcGVuZGluZyBjb21tYW5kLiAgVGhlIHJldHJhbnNtaXNzaW9uIGNvdW50IGlzIGluY3JlbWVudGVkLgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgY291bnQgcmVhY2hlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zLAotICogICAgICAgICAgICAgICAgICB0aGUgZXZlbnQgaXMgdHJlYXRlZCBhcyBhIHJlc3BvbnNlIHRpbWVvdXQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9yZXRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIHBfY2NiLT5yZXRfY291bnQrKzsKLSAgaWYgKHBfY2NiLT5yZXRfY291bnQgPT0gQVZEVF9SRVRfTUFYKSB7Ci0gICAgLyogY29tbWFuZCBmYWlsZWQgKi8KLSAgICBwX2NjYi0+cmV0X2NvdW50ID0gMDsKLSAgICB0QVZEVF9DQ0JfRVZUIGF2ZHRfY2NiX2V2dDsKLSAgICBhdmR0X2NjYl9ldnQuZXJyX2NvZGUgPSBBVkRUX0VSUl9USU1FT1VUOwotICAgIGF2ZHRfY2NiX2NtZF9mYWlsKHBfY2NiLCAmYXZkdF9jY2JfZXZ0KTsKLQotICAgIC8qIGdvIHRvIG5leHQgcXVldWVkIGNvbW1hbmQgKi8KLSAgICBhdmR0X2NjYl9zbmRfY21kKHBfY2NiLCBwX2RhdGEpOwotICB9IGVsc2UgewotICAgIC8qIGlmIGNvbW1hbmQgcGVuZGluZyBhbmQgd2UncmUgbm90IGNvbmdlc3RlZCBhbmQgbm90IHNlbmRpbmcgYSBmcmFnbWVudCAqLwotICAgIGlmICgoIXBfY2NiLT5jb25nKSAmJiAocF9jY2ItPnBfY3Vycl9tc2cgPT0gTlVMTCkgJiYKLSAgICAgICAgKHBfY2NiLT5wX2N1cnJfY21kICE9IE5VTEwpKSB7Ci0gICAgICAvKiBtYWtlIGNvcHkgb2YgbWVzc2FnZSBpbiBwX2N1cnJfY21kIGFuZCBzZW5kIGl0ICovCi0gICAgICBCVF9IRFIqIHBfbXNnID0gKEJUX0hEUiopb3NpX21hbGxvYyhBVkRUX0NNRF9CVUZfU0laRSk7Ci0gICAgICBtZW1jcHkocF9tc2csIHBfY2NiLT5wX2N1cnJfY21kLAotICAgICAgICAgICAgIChzaXplb2YoQlRfSERSKSArIHBfY2NiLT5wX2N1cnJfY21kLT5vZmZzZXQgKwotICAgICAgICAgICAgICBwX2NjYi0+cF9jdXJyX2NtZC0+bGVuKSk7Ci0gICAgICBhdmR0X21zZ19zZW5kKHBfY2NiLCBwX21zZyk7Ci0gICAgfQotCi0gICAgLyogcmVzdGFydCByZXQgdGltZXIgKi8KLSAgICBhbGFybV9jYW5jZWwocF9jY2ItPmlkbGVfY2NiX3RpbWVyKTsKLSAgICBhbGFybV9jYW5jZWwocF9jY2ItPnJzcF9jY2JfdGltZXIpOwotICAgIHVpbnQ2NF90IGludGVydmFsX21zID0gYXZkdHBfY2IucmNiLnJldF90b3V0ICogMTAwMDsKLSAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPnJldF9jY2JfdGltZXIsIGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2NjYl9yZXRfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2Jfc25kX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhlIHNlbmQgdGhlIG5leHQgY29tbWFuZCwKLSAqICAgICAgICAgICAgICAgICAgaWYgYW55LCBpbiB0aGUgY29tbWFuZCBxdWV1ZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX3NuZF9jbWQoQXZkdHBDY2IqIHBfY2NiLCBVTlVTRURfQVRUUiB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgQlRfSERSKiBwX21zZzsKLQotICAvKiBkbyB3ZSBoYXZlIGNvbW1hbmRzIHRvIHNlbmQ/ICBzZW5kIG5leHQgY29tbWFuZDsgIG1ha2Ugc3VyZSB3ZSdyZSBjbGVhcjsKLSAgKiogbm90IGNvbmdlc3RlZCwgbm90IHNlbmRpbmcgZnJhZ21lbnQsIG5vdCB3YWl0aW5nIGZvciByZXNwb25zZQotICAqLwotICBpZiAoKCFwX2NjYi0+Y29uZykgJiYgKHBfY2NiLT5wX2N1cnJfbXNnID09IE5VTEwpICYmCi0gICAgICAocF9jY2ItPnBfY3Vycl9jbWQgPT0gTlVMTCkpIHsKLSAgICBwX21zZyA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT5jbWRfcSk7Ci0gICAgaWYgKHBfbXNnICE9IE5VTEwpIHsKLSAgICAgIC8qIG1ha2UgYSBjb3B5IG9mIGJ1ZmZlciBpbiBwX2N1cnJfY21kICovCi0gICAgICBwX2NjYi0+cF9jdXJyX2NtZCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQVZEVF9DTURfQlVGX1NJWkUpOwotICAgICAgbWVtY3B5KHBfY2NiLT5wX2N1cnJfY21kLCBwX21zZywKLSAgICAgICAgICAgICAoc2l6ZW9mKEJUX0hEUikgKyBwX21zZy0+b2Zmc2V0ICsgcF9tc2ctPmxlbikpOwotICAgICAgYXZkdF9tc2dfc2VuZChwX2NjYiwgcF9tc2cpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2Jfc25kX21zZwotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zbmRfbXNnKEF2ZHRwQ2NiKiBwX2NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIEJUX0hEUiogcF9tc2c7Ci0KLSAgLyogaWYgbm90IGNvbmdlc3RlZCAqLwotICBpZiAoIXBfY2NiLT5jb25nKSB7Ci0gICAgLyogYXJlIHdlIHNlbmRpbmcgYSBmcmFnbWVudGVkIG1lc3NhZ2U/IGNvbnRpbnVlIHNlbmRpbmcgZnJhZ21lbnQgKi8KLSAgICBpZiAocF9jY2ItPnBfY3Vycl9tc2cgIT0gTlVMTCkgewotICAgICAgYXZkdF9tc2dfc2VuZChwX2NjYiwgTlVMTCk7Ci0gICAgfQotICAgIC8qIGRvIHdlIGhhdmUgcmVzcG9uc2VzIHRvIHNlbmQ/ICBzZW5kIHRoZW0gKi8KLSAgICBlbHNlIGlmICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnJzcF9xKSkgewotICAgICAgd2hpbGUgKChwX21zZyA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT5yc3BfcSkpICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGF2ZHRfbXNnX3NlbmQocF9jY2IsIHBfbXNnKSkgewotICAgICAgICAgIC8qIGJyZWFrIG91dCBpZiBjb25nZXN0ZWQgKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGRvIHdlIGhhdmUgY29tbWFuZHMgdG8gc2VuZD8gIHNlbmQgbmV4dCBjb21tYW5kICovCi0gICAgYXZkdF9jY2Jfc25kX2NtZChwX2NjYiwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NldF9yZWNvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVuYWJsZSBhIHJlY29ubmVjdCBhdHRlbXB0IHdoZW4KLSAqICAgICAgICAgICAgICAgICAgYSBjaGFubmVsIHRyYW5zaXRpb25zIGZyb20gY2xvc2luZyB0byBpZGxlIHN0YXRlLiAgSXQgc2V0cwotICogICAgICAgICAgICAgICAgICB0aGUgcmVjb25uIHZhcmlhYmxlIHRvIHRydWUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zZXRfcmVjb25uKEF2ZHRwQ2NiKiBwX2NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKSB7Ci0gIHBfY2NiLT5yZWNvbm4gPSB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfY2xyX3JlY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2xlYXIgdGhlIHJlY29ubiB2YXJpYWJsZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2Nscl9yZWNvbm4oQXZkdHBDY2IqIHBfY2NiLCBVTlVTRURfQVRUUiB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpIHsKLSAgcF9jY2ItPnJlY29ubiA9IGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfY2hrX3JlY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgYSByZWNvbm5lY3QgYXR0ZW1wdAotICogICAgICAgICAgICAgICAgICBpcyBlbmFibGVkLiAgSWYgZW5hYmxlZCwgaXQgc2VuZHMgYW4gQVZEVF9DQ0JfVUxfT1BFTl9FVlQKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIENDQi4gIElmIGRpc2FibGVkLCB0aGUgQ0NCIGlzIGRlYWxsb2NhdGVkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfY2hrX3JlY29ubihBdmR0cENjYiogcF9jY2IsIFVOVVNFRF9BVFRSIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICBpZiAocF9jY2ItPnJlY29ubikgewotICAgIHBfY2NiLT5yZWNvbm4gPSBmYWxzZTsKLQotICAgIC8qIGNsZWFyIG91dCBjY2IgKi8KLSAgICBhdmR0X2NjYl9jbGVhcl9jY2IocF9jY2IpOwotCi0gICAgLyogY2xlYXIgb3V0IGN1cnJlbnQgY29tbWFuZCwgaWYgYW55ICovCi0gICAgdWludDhfdCBlcnJfY29kZSA9IEFWRFRfRVJSX0NPTk5FQ1Q7Ci0gICAgdEFWRFRfQ0NCX0VWVCBhdmR0X2NjYl9ldnQ7Ci0gICAgYXZkdF9jY2JfZXZ0LmVycl9jb2RlID0gZXJyX2NvZGU7Ci0gICAgYXZkdF9jY2JfY21kX2ZhaWwocF9jY2IsICZhdmR0X2NjYl9ldnQpOwotCi0gICAgLyogcmVvcGVuIHRoZSBzaWduYWxpbmcgY2hhbm5lbCAqLwotICAgIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9VTF9PUEVOX0VWVCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXZkdF9jY2JfbGxfY2xvc2VkKHBfY2NiLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfY2hrX3RpbWVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0b3BzIHRoZSBDQ0IgdGltZXIgaWYgdGhlIGlkbGUgdGltZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgcnVubmluZy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2Noa190aW1lcihBdmR0cENjYiogcF9jY2IsIFVOVVNFRF9BVFRSIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICBhbGFybV9jYW5jZWwocF9jY2ItPmlkbGVfY2NiX3RpbWVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NldF9jb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgQ0NCIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggQVZEVF9Db25uZWN0UmVxKCkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zZXRfY29ubihBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICAvKiBzYXZlIGNhbGxiYWNrICovCi0gIHBfY2NiLT5wX2Nvbm5fY2JhY2sgPSBwX2RhdGEtPmNvbm5lY3QucF9jYmFjazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfY2NiX3NldF9kaXNjb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgQ0NCIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggQVZEVF9EaXNjb25uZWN0UmVxKCkuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X2NjYl9zZXRfZGlzY29ubihBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICAvKgotICBBVkRUX1RSQUNFX0VWRU5UKCJhdmR0X2NjYl9zZXRfZGlzY29ubjpjb25uOngleCwgYXBpOngleCIsCi0gICAgICBwX2NjYi0+cF9jb25uX2NiYWNrLCBwX2RhdGEtPmRpc2Nvbm5lY3QucF9jYmFjayk7Ci0gICAgICAqLwotICAvKiBzYXZlIGNhbGxiYWNrICovCi0gIGlmIChwX2RhdGEtPmRpc2Nvbm5lY3QucF9jYmFjaykKLSAgICBwX2NjYi0+cF9jb25uX2NiYWNrID0gcF9kYXRhLT5kaXNjb25uZWN0LnBfY2JhY2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9kb19kaXNjb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEbyBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIEFWRFRfRGlzY29ubmVjdFJlcSgpLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9jY2JfZG9fZGlzY29ubihBdmR0cENjYiogcF9jY2IsIFVOVVNFRF9BVFRSIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICAvKiBjbGVhciBhbnkgcGVuZGluZyBjb21tYW5kcyAqLwotICBhdmR0X2NjYl9jbGVhcl9jbWRzKHBfY2NiLCBOVUxMKTsKLQotICAvKiBjbG9zZSBjaGFubmVsICovCi0gIGF2ZHRfY2NiX2NoYW5fY2xvc2UocF9jY2IsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9jY2JfbGxfY2xvc2VkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbGVhciBjb21tYW5kcyBmcm9tIGFuZCBkZWFsbG9jYXRlIENDQi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2xsX2Nsb3NlZChBdmR0cENjYiogcF9jY2IsIFVOVVNFRF9BVFRSIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrOwotICB0QVZEVF9DVFJMIGF2ZHRfY3RybDsKLQotICBBVkRUX1RSQUNFX0RFQlVHKCIlcyBwZWVyICVzIiwgX19mdW5jX18sIHBfY2NiLT5wZWVyX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvKiBjbGVhciBhbnkgcGVuZGluZyBjb21tYW5kcyAqLwotICBhdmR0X2NjYl9jbGVhcl9jbWRzKHBfY2NiLCBOVUxMKTsKLQotICAvKiBzYXZlIGNhbGxiYWNrIHBvaW50ZXIsIGJkIGFkZHIgKi8KLSAgcF9jYmFjayA9IHBfY2NiLT5wX2Nvbm5fY2JhY2s7Ci0gIGlmICghcF9jYmFjaykgcF9jYmFjayA9IGF2ZHRwX2NiLnBfY29ubl9jYmFjazsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0gcF9jY2ItPnBlZXJfYWRkcjsKLSAgdWludDhfdCBidGFfYXZfc2NiX2luZGV4ID0gcF9jY2ItPkJ0YUF2U2NiSW5kZXgoKTsKLQotICAvKiBkZWFsbG9jIGNjYiAqLwotICBhdmR0X2NjYl9kZWFsbG9jKHBfY2NiLCBOVUxMKTsKLQotICAvKiBjYWxsIGNhbGxiYWNrICovCi0gIGlmIChwX2NiYWNrKSB7Ci0gICAgYXZkdF9jdHJsLmhkci5lcnJfY29kZSA9IDA7Ci0gICAgKCpwX2NiYWNrKSgwLCBiZF9hZGRyLCBBVkRUX0RJU0NPTk5FQ1RfSU5EX0VWVCwgJmF2ZHRfY3RybCwKLSAgICAgICAgICAgICAgIGJ0YV9hdl9zY2JfaW5kZXgpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2NjYl9sbF9vcGVuZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGwgY2FsbGJhY2sgb24gb3Blbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfY2NiX2xsX29wZW5lZChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9DVFJMIGF2ZHRfY3RybDsKLQotICBBVkRUX1RSQUNFX0RFQlVHKCIlcyBwZWVyICVzIEJ0YUF2U2NiSW5kZXg9JWQgcF9jY2I9JXAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX2NjYi0+cGVlcl9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgcF9jY2ItPkJ0YUF2U2NiSW5kZXgoKSwKLSAgICAgICAgICAgICAgICAgICBwX2NjYik7Ci0gIHBfY2NiLT5sbF9vcGVuZWQgPSB0cnVlOwotCi0gIGlmICghcF9jY2ItPnBfY29ubl9jYmFjaykgcF9jY2ItPnBfY29ubl9jYmFjayA9IGF2ZHRwX2NiLnBfY29ubl9jYmFjazsKLQotICAvKiBjYWxsIGNhbGxiYWNrICovCi0gIGlmIChwX2NjYi0+cF9jb25uX2NiYWNrKSB7Ci0gICAgYXZkdF9jdHJsLmhkci5lcnJfY29kZSA9IDA7Ci0gICAgYXZkdF9jdHJsLmhkci5lcnJfcGFyYW0gPSBwX2RhdGEtPm1zZy5oZHIuZXJyX3BhcmFtOwotICAgICgqcF9jY2ItPnBfY29ubl9jYmFjaykoMCwgcF9jY2ItPnBlZXJfYWRkciwgQVZEVF9DT05ORUNUX0lORF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZkdF9jdHJsLCBwX2NjYi0+QnRhQXZTY2JJbmRleCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZkdC9hdmR0X2RlZnMuaCBiL3N0YWNrL2F2ZHQvYXZkdF9kZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZWQ5MmUuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZkdC9hdmR0X2RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgY29udGFpbnMgY29uc3RhbnRzIGRlZmluaXRpb25zIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBVkRUUAotICogIHNwZWNpZmljYXRpb24uICBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbnRlcm5hbCB0byBBVkRUIG9ubHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVZEVF9ERUZTX0gKLSNkZWZpbmUgQVZEVF9ERUZTX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBjb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBzaWduYWxsaW5nIHBhY2tldCB0eXBlICovCi0jZGVmaW5lIEFWRFRfUEtUX1RZUEVfU0lOR0xFIDAgLyogc2luZ2xlIHBhY2tldCAqLwotI2RlZmluZSBBVkRUX1BLVF9UWVBFX1NUQVJUIDEgIC8qIHN0YXJ0IHBhY2tldCAqLwotI2RlZmluZSBBVkRUX1BLVF9UWVBFX0NPTlQgMiAgIC8qIGNvbnRpbnVlIHBhY2tldCAqLwotI2RlZmluZSBBVkRUX1BLVF9UWVBFX0VORCAzICAgIC8qIGVuZCBwYWNrZXQgKi8KLQotLyogc2lnbmFsbGluZyBtZXNzYWdlIHR5cGUgKi8KLSNkZWZpbmUgQVZEVF9NU0dfVFlQRV9DTUQgMCAvKiBjb21tYW5kICovCi0jZGVmaW5lIEFWRFRfTVNHX1RZUEVfR1JKIDEgLyogZ2VuZXJhbCByZWplY3QgKi8KLSNkZWZpbmUgQVZEVF9NU0dfVFlQRV9SU1AgMiAvKiByZXNwb25zZSBhY2NlcHQgKi8KLSNkZWZpbmUgQVZEVF9NU0dfVFlQRV9SRUogMyAvKiByZXNwb25zZSByZWplY3QgKi8KLQotLyogc2lnbmFsbGluZyBtZXNzYWdlcyAqLwotI2RlZmluZSBBVkRUX1NJR19ESVNDT1ZFUiAxICAgIC8qIGRpc2NvdmVyICovCi0jZGVmaW5lIEFWRFRfU0lHX0dFVENBUCAyICAgICAgLyogZ2V0IGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSBBVkRUX1NJR19TRVRDT05GSUcgMyAgIC8qIHNldCBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIEFWRFRfU0lHX0dFVENPTkZJRyA0ICAgLyogZ2V0IGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgQVZEVF9TSUdfUkVDT05GSUcgNSAgICAvKiByZWNvbmZpZ3VyZSAqLwotI2RlZmluZSBBVkRUX1NJR19PUEVOIDYgICAgICAgIC8qIG9wZW4gKi8KLSNkZWZpbmUgQVZEVF9TSUdfU1RBUlQgNyAgICAgICAvKiBzdGFydCAqLwotI2RlZmluZSBBVkRUX1NJR19DTE9TRSA4ICAgICAgIC8qIGNsb3NlICovCi0jZGVmaW5lIEFWRFRfU0lHX1NVU1BFTkQgOSAgICAgLyogc3VzcGVuZCAqLwotI2RlZmluZSBBVkRUX1NJR19BQk9SVCAxMCAgICAgIC8qIGFib3J0ICovCi0jZGVmaW5lIEFWRFRfU0lHX1NFQ1VSSVRZIDExICAgLyogc2VjdXJpdHkgY29udHJvbCAqLwotI2RlZmluZSBBVkRUX1NJR19HRVRfQUxMQ0FQIDEyIC8qIGdldCBhbGwgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEFWRFRfU0lHX0RFTEFZX1JQVCAxMyAgLyogZGVsYXkgcmVwb3J0ICovCi0KLS8qIG1heGltdW0gc2lnbmFsIHZhbHVlICovCi0jZGVmaW5lIEFWRFRfU0lHX01BWCBBVkRUX1NJR19ERUxBWV9SUFQKLQotLyogdXNlZCBmb3IgZ2VuZXJhbCByZWplY3QgKi8KLSNkZWZpbmUgQVZEVF9TSUdfTk9ORSAwCi0KLS8qIHNlcnZpY2UgY2F0ZWdvcnkgaW5mb3JtYXRpb24gZWxlbWVudCBmaWVsZCB2YWx1ZXMgKi8KLSNkZWZpbmUgQVZEVF9DQVRfVFJBTlMgMSAgICAgLyogTWVkaWEgVHJhbnNwb3J0ICovCi0jZGVmaW5lIEFWRFRfQ0FUX1JFUE9SVCAyICAgIC8qIFJlcG9ydGluZyAqLwotI2RlZmluZSBBVkRUX0NBVF9SRUNPViAzICAgICAvKiBSZWNvdmVyeSAqLwotI2RlZmluZSBBVkRUX0NBVF9QUk9URUNUIDQgICAvKiBDb250ZW50IFByb3RlY3Rpb24gKi8KLSNkZWZpbmUgQVZEVF9DQVRfSERSQ01QIDUgICAgLyogSGVhZGVyIENvbXByZXNzaW9uICovCi0jZGVmaW5lIEFWRFRfQ0FUX01VWCA2ICAgICAgIC8qIE11bHRpcGxleGluZyAqLwotI2RlZmluZSBBVkRUX0NBVF9DT0RFQyA3ICAgICAvKiBNZWRpYSBDb2RlYyAqLwotI2RlZmluZSBBVkRUX0NBVF9ERUxBWV9SUFQgOCAvKiBEZWxheSBSZXBvcnRpbmcgKi8KLSNkZWZpbmUgQVZEVF9DQVRfTUFYX0NVUiBBVkRUX0NBVF9ERUxBWV9SUFQKLQotLyogbWluL21heCBsZW5ndGhzIG9mIHNlcnZpY2UgY2F0ZWdvcnkgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KLSNkZWZpbmUgQVZEVF9MRU5fVFJBTlNfTUlOIDAKLSNkZWZpbmUgQVZEVF9MRU5fUkVQT1JUX01JTiAwCi0jZGVmaW5lIEFWRFRfTEVOX1JFQ09WX01JTiAzCi0jZGVmaW5lIEFWRFRfTEVOX1BST1RFQ1RfTUlOIDIKLSNkZWZpbmUgQVZEVF9MRU5fSERSQ01QX01JTiAxCi0jZGVmaW5lIEFWRFRfTEVOX01VWF9NSU4gMwotI2RlZmluZSBBVkRUX0xFTl9DT0RFQ19NSU4gMgotI2RlZmluZSBBVkRUX0xFTl9ERUxBWV9SUFRfTUlOIDAKLQotI2RlZmluZSBBVkRUX0xFTl9UUkFOU19NQVggMAotI2RlZmluZSBBVkRUX0xFTl9SRVBPUlRfTUFYIDAKLSNkZWZpbmUgQVZEVF9MRU5fUkVDT1ZfTUFYIDMKLSNkZWZpbmUgQVZEVF9MRU5fUFJPVEVDVF9NQVggMjU1Ci0jZGVmaW5lIEFWRFRfTEVOX0hEUkNNUF9NQVggMQotI2RlZmluZSBBVkRUX0xFTl9NVVhfTUFYIDcKLSNkZWZpbmUgQVZEVF9MRU5fQ09ERUNfTUFYIDI1NQotI2RlZmluZSBBVkRUX0xFTl9ERUxBWV9SUFRfTUFYIDAKLQotLyogbWluaW11bSBwb3NzaWJsZSBzaXplIG9mIGNvbmZpZ3VyYXRpb24gb3IgY2FwYWJpbGl0aWVzIGRhdGEgKi8KLSNkZWZpbmUgQVZEVF9MRU5fQ0ZHX01JTiAyCi0KLS8qIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RocyBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZXMgKi8KLSNkZWZpbmUgQVZEVF9MRU5fU0lOR0xFIDEKLSNkZWZpbmUgQVZEVF9MRU5fU0VUQ09ORklHX01JTiAyCi0jZGVmaW5lIEFWRFRfTEVOX1JFQ09ORklHX01JTiAxCi0jZGVmaW5lIEFWRFRfTEVOX01VTFRJX01JTiAxCi0jZGVmaW5lIEFWRFRfTEVOX1NFQ1VSSVRZX01JTiAxCi0jZGVmaW5lIEFWRFRfTEVOX0RFTEFZX1JQVCAzCi0KLS8qIGhlYWRlciBsZW5ndGhzIGZvciBkaWZmZXJlbnQgcGFja2V0IHR5cGVzICovCi0jZGVmaW5lIEFWRFRfTEVOX1RZUEVfU0lOR0xFIDIgLyogc2luZ2xlIHBhY2tldCAqLwotI2RlZmluZSBBVkRUX0xFTl9UWVBFX1NUQVJUIDMgIC8qIHN0YXJ0IHBhY2tldCAqLwotI2RlZmluZSBBVkRUX0xFTl9UWVBFX0NPTlQgMSAgIC8qIGNvbnRpbnVlIHBhY2tldCAqLwotI2RlZmluZSBBVkRUX0xFTl9UWVBFX0VORCAxICAgIC8qIGVuZCBwYWNrZXQgKi8KLQotLyogbGVuZ3RoIG9mIGdlbmVyYWwgcmVqZWN0IG1lc3NhZ2UgKi8KLSNkZWZpbmUgQVZEVF9MRU5fR0VOX1JFSiAyCi0KLS8qIHJlY292ZXJ5IHNlcnZpY2UgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIGVsZW1lbnRzICovCi0vKiBtaW4gdmFsdWUgZm9yIG1heGltdW0gcmVjb3Zlcnkgd2luZG93ICovCi0jZGVmaW5lIEFWRFRfUkVDT1ZfTVJXU19NSU4gMHgwMQotLyogbWF4IHZhbHVlIGZvciBtYXhpbXVtIHJlY292ZXJ5IHdpbmRvdyAqLwotI2RlZmluZSBBVkRUX1JFQ09WX01SV1NfTUFYIDB4MTgKLS8qIG1pbiB2YWx1ZSBmb3IgbWF4aW11bSBudW1iZXIgb2YgbWVkaWEgcGFja2V0cyAqLwotI2RlZmluZSBBVkRUX1JFQ09WX01OTVBfTUlOIDB4MDEKLS8qIG1heCB2YWx1ZSBmb3IgbWF4aW11bSBudW1iZXIgb2YgbWVkaWEgcGFja2V0cyAqLwotI2RlZmluZSBBVkRUX1JFQ09WX01OTVBfTUFYIDB4MTgKLQotLyogU0VJRCB2YWx1ZSByYW5nZSAqLwotI2RlZmluZSBBVkRUX1NFSURfTUlOIDB4MDEKLSNkZWZpbmUgQVZEVF9TRUlEX01BWCAweDNFCi0KLS8qIGZpcnN0IGJ5dGUgb2YgbWVkaWEgcGFja2V0IGhlYWRlciAqLwotI2RlZmluZSBBVkRUX01FRElBX09DVEVUMSAweDgwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogbWVzc2FnZSBwYXJzaW5nIGFuZCBidWlsZGluZyBtYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFWRFRfTVNHX1BSU19IRFIocCwgbGJsLCBwa3QsIG1zZykgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAobGJsKSA9ICgqKHApID4+IDQpICYgMHgwRjsgICAgICAgICAgICBcCi0gICAgKHBrdCkgPSAoKihwKSA+PiAyKSAmIDB4MDM7ICAgICAgICAgICAgXAotICAgIChtc2cpID0gKihwKSsrICYgMHgwMzsgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBVkRUX01TR19QUlNfRElTQyhwLCBzZWlkLCBpbl91c2UsIHR5cGUsIHRzZXApIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHNlaWQpID0gKihwKSA+PiAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChpbl91c2UpID0gKCoocCkrKyA+PiAxKSAmIDB4MDE7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAodHlwZSkgPSAoKihwKSA+PiA0KSAmIDB4MEY7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHRzZXApID0gKCoocCkrKyA+PiAzKSAmIDB4MDE7ICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEFWRFRfTVNHX1BSU19TSUcocCwgc2lnKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHNpZykgPSAoKihwKSsrKSAmIDB4M0Y7ICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVZEVF9NU0dfUFJTX1NFSUQocCwgc2VpZCkgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChzZWlkKSA9ICgoKihwKSsrKSA+PiAyKSAmIDB4M0Y7IFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBVkRUX01TR19QUlNfUEtUX1RZUEUocCwgcGt0KSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocGt0KSA9ICgqKHApID4+IDIpICYgMHgwMzsgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEFWRFRfTVNHX1BSU19PQ1RFVDEocCwgb192LCBvX3AsIG9feCwgb19jYykgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAob192KSA9ICgqKHApID4+IDYpICYgMHgwMjsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKG9fcCkgPSAoKihwKSA+PiA1KSAmIDB4MDE7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIChvX3gpID0gKCoocCkgPj4gNCkgJiAweDAxOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAob19jYykgPSAoKihwKSsrKSAmIDB4MEY7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVZEVF9NU0dfUFJTX1JQVF9PQ1RFVDEocCwgb192LCBvX3AsIG9fY2MpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAob192KSA9ICgqKHApID4+IDYpICYgMHgwMjsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAob19wKSA9ICgqKHApID4+IDUpICYgMHgwMTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAob19jYykgPSAoKihwKSsrKSAmIDB4MUY7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBVkRUX01TR19QUlNfTV9QVChwLCBtX3B0LCBtYXJrZXIpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKG1hcmtlcikgPSAoKihwKSA+PiA3KSAmIDB4MDE7ICAgICAgICAgXAotICAgIChtX3B0KSA9ICgqKHApKyspICYgMHg3RjsgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBVkRUX01TR19CTERfSERSKHAsIGxibCwgcGt0LCBtc2cpICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKGxibCkgPDwgNCkgfCAoKHBrdCkgPDwgMikgfCAobXNnKTsgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEFWRFRfTVNHX0JMRF9ESVNDKHAsIHNlaWQsIGluX3VzZSwgdHlwZSwgdHNlcCkgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCgoc2VpZCkgPDwgMikgfCAoKGluX3VzZSkgPDwgMSkpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCgodHlwZSkgPDwgNCkgfCAoKHRzZXApIDw8IDMpKTsgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVZEVF9NU0dfQkxEX1NJRyhwLCBzaWcpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkoc2lnKTsgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBVkRUX01TR19CTERfU0VJRChwLCBzZWlkKSAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKChzZWlkKSA8PCAyKTsgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEFWRFRfTVNHX0JMRF9FUlIocCwgZXJyKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKGVycik7ICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVZEVF9NU0dfQkxEX1BBUkFNKHAsIHBhcmFtKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KShwYXJhbSk7ICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBVkRUX01TR19CTERfTk9TUChwLCBub3NwKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkobm9zcCk7ICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZW5kaWYgLyogQVZEVF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2F2ZHQvYXZkdF9pbnQuaCBiL3N0YWNrL2F2ZHQvYXZkdF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1MGFjNS4uMDAwMDAwMAotLS0gYS9zdGFjay9hdmR0L2F2ZHRfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGludGVyZmFjZXMgd2hpY2ggYXJlIGludGVybmFsIHRvIEFWRFRQLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEFWRFRfSU5UX0gKLSNkZWZpbmUgQVZEVF9JTlRfSAotCi0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImF2ZHRfYXBpLmgiCi0jaW5jbHVkZSAiYXZkdF9kZWZzLmgiCi0jaW5jbHVkZSAiYXZkdGNfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIEFWRFRfREVCVUcKLSNkZWZpbmUgQVZEVF9ERUJVRyBGQUxTRQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogY29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogY2hhbm5lbCB0eXBlcyAqLwotZW51bSB7Ci0gIEFWRFRfQ0hBTl9TSUcsICAgLyogc2lnbmFsaW5nIGNoYW5uZWwgKi8KLSAgQVZEVF9DSEFOX01FRElBLCAvKiBtZWRpYSBjaGFubmVsICovCi0gIEFWRFRfQ0hBTl9SRVBPUlQsIC8qIHJlcG9ydGluZyBjaGFubmVsICovCi0gIEFWRFRfQ0hBTl9OVU1fVFlQRVMKLX07Ci0KLS8qIHByb3RvY29sIHNlcnZpY2UgY2FwYWJpbGl0aWVzIG9mIHRoaXMgQVZEVFAgaW1wbGVtZW50YXRpb24gKi8KLSNkZWZpbmUgQVZEVF9QU0MgKEFWRFRfUFNDX1RSQU5TIHwgQVZEVF9QU0NfUkVQT1JUIHwgQVZEVF9QU0NfREVMQVlfUlBUKQotI2RlZmluZSBBVkRUX0xFR19QU0MgKEFWRFRfUFNDX1RSQU5TIHwgQVZEVF9QU0NfUkVQT1JUKQotCi0vKiBpbml0aWF0b3IvYWNjZXB0b3Igc2lnbmFsaW5nIHJvbGVzICovCi0jZGVmaW5lIEFWRFRfQ0xPU0VfQUNQIDAKLSNkZWZpbmUgQVZEVF9DTE9TRV9JTlQgMQotI2RlZmluZSBBVkRUX09QRU5fQUNQIDIKLSNkZWZpbmUgQVZEVF9PUEVOX0lOVCAzCi0KLS8qIHN0YXRlcyBmb3IgYXZkdF9zY2JfdmVyaWZ5ICovCi0jZGVmaW5lIEFWRFRfVkVSSUZZX09QRU4gMAotI2RlZmluZSBBVkRUX1ZFUklGWV9TVFJFQU1JTkcgMQotI2RlZmluZSBBVkRUX1ZFUklGWV9TVVNQRU5EIDIKLSNkZWZpbmUgQVZEVF9WRVJJRllfU1RBUlQgMwotCi0vKiB0byBkaXN0aW5ndWlzaCBDQ0IgZXZlbnRzIGZyb20gU0NCIGV2ZW50cyAqLwotI2RlZmluZSBBVkRUX0NDQl9NS1IgMHg4MAotCi0vKiBvZmZzZXQgd2hlcmUgQVZEVFAgc2lnbmFsaW5nIG1lc3NhZ2UgY29udGVudCBzdGFydHM7Ci0gKiB1c2UgdGhlIHNpemUgb2YgYSBzdGFydCBoZWFkZXIgc2luY2UgaXQncyB0aGUgbGFyZ2VzdCBwb3NzaWJsZQotICogbGF5b3V0IG9mIHNpZ25hbGluZyBtZXNzYWdlIGluIGEgYnVmZmVyIGlzOgotICoKLSAqIHwgIEJUX0hEUiAgfCBTQ0IgaGFuZGxlcyB8IEwyQ0FQICsgSENJIGhlYWRlciB8IEFWRFRQIGhlYWRlciB8IGRhdGEgLi4uIHwKLSAqCi0gKiBOb3RlIHRoYXQgd2UgImhpZGUiIHRoZSBzY2IgaGFuZGxlcyBhdCB0aGUgdG9wIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlci4KLSovCi0jZGVmaW5lIEFWRFRfTVNHX09GRlNFVCAoTDJDQVBfTUlOX09GRlNFVCArIEFWRFRfTlVNX1NFUFMgKyBBVkRUX0xFTl9UWVBFX1NUQVJUKQotCi0vKiBzY2IgdHJhbnNwb3J0IGNoYW5uZWwgY29ubmVjdCB0aW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpICovCi0jZGVmaW5lIEFWRFRfU0NCX1RDX0NPTk5fVElNRU9VVF9NUyAoMTAgKiAxMDAwKQotCi0vKiBzY2IgdHJhbnNwb3J0IGNoYW5uZWwgZGlzY29ubmVjdCB0aW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpICovCi0jZGVmaW5lIEFWRFRfU0NCX1RDX0RJU0NfVElNRU9VVF9NUyAoMTAgKiAxMDAwKQotCi0vKiBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kIHJldHJhbnNtaXNzaW9ucyAqLwotI2lmbmRlZiBBVkRUX1JFVF9NQVgKLSNkZWZpbmUgQVZEVF9SRVRfTUFYIDEKLSNlbmRpZgotCi0vKiBjY2Igc3RhdGUgbWFjaGluZSBzdGF0ZXMgKi8KLWVudW0gewotICBBVkRUX0NDQl9JRExFX1NULAotICBBVkRUX0NDQl9PUEVOSU5HX1NULAotICBBVkRUX0NDQl9PUEVOX1NULAotICBBVkRUX0NDQl9DTE9TSU5HX1NUCi19OwotCi0vKiBzdGF0ZSBtYWNoaW5lIGFjdGlvbiBlbnVtZXJhdGlvbiBsaXN0ICovCi1lbnVtIDogdWludDhfdCB7Ci0gIEFWRFRfQ0NCX0NIQU5fT1BFTiwKLSAgQVZEVF9DQ0JfQ0hBTl9DTE9TRSwKLSAgQVZEVF9DQ0JfQ0hLX0NMT1NFLAotICBBVkRUX0NDQl9IRExfRElTQ09WRVJfQ01ELAotICBBVkRUX0NDQl9IRExfRElTQ09WRVJfUlNQLAotICBBVkRUX0NDQl9IRExfR0VUQ0FQX0NNRCwKLSAgQVZEVF9DQ0JfSERMX0dFVENBUF9SU1AsCi0gIEFWRFRfQ0NCX0hETF9TVEFSVF9DTUQsCi0gIEFWRFRfQ0NCX0hETF9TVEFSVF9SU1AsCi0gIEFWRFRfQ0NCX0hETF9TVVNQRU5EX0NNRCwKLSAgQVZEVF9DQ0JfSERMX1NVU1BFTkRfUlNQLAotICBBVkRUX0NDQl9TTkRfRElTQ09WRVJfQ01ELAotICBBVkRUX0NDQl9TTkRfRElTQ09WRVJfUlNQLAotICBBVkRUX0NDQl9TTkRfR0VUQ0FQX0NNRCwKLSAgQVZEVF9DQ0JfU05EX0dFVENBUF9SU1AsCi0gIEFWRFRfQ0NCX1NORF9TVEFSVF9DTUQsCi0gIEFWRFRfQ0NCX1NORF9TVEFSVF9SU1AsCi0gIEFWRFRfQ0NCX1NORF9TVVNQRU5EX0NNRCwKLSAgQVZEVF9DQ0JfU05EX1NVU1BFTkRfUlNQLAotICBBVkRUX0NDQl9DTEVBUl9DTURTLAotICBBVkRUX0NDQl9DTURfRkFJTCwKLSAgQVZEVF9DQ0JfRlJFRV9DTUQsCi0gIEFWRFRfQ0NCX0NPTkdfU1RBVEUsCi0gIEFWRFRfQ0NCX1JFVF9DTUQsCi0gIEFWRFRfQ0NCX1NORF9DTUQsCi0gIEFWRFRfQ0NCX1NORF9NU0csCi0gIEFWRFRfQ0NCX1NFVF9SRUNPTk4sCi0gIEFWRFRfQ0NCX0NMUl9SRUNPTk4sCi0gIEFWRFRfQ0NCX0NIS19SRUNPTk4sCi0gIEFWRFRfQ0NCX0NIS19USU1FUiwKLSAgQVZEVF9DQ0JfU0VUX0NPTk4sCi0gIEFWRFRfQ0NCX1NFVF9ESVNDT05OLAotICBBVkRUX0NDQl9ET19ESVNDT05OLAotICBBVkRUX0NDQl9MTF9DTE9TRUQsCi0gIEFWRFRfQ0NCX0xMX09QRU5FRCwKLSAgQVZEVF9DQ0JfREVBTExPQywKLSAgQVZEVF9DQ0JfTlVNX0FDVElPTlMKLX07Ci0KLSNkZWZpbmUgQVZEVF9DQ0JfSUdOT1JFIEFWRFRfQ0NCX05VTV9BQ1RJT05TCi0KLS8qIGNjYiBzdGF0ZSBtYWNoaW5lIGV2ZW50cyAqLwotZW51bSB7Ci0gIEFWRFRfQ0NCX0FQSV9ESVNDT1ZFUl9SRVFfRVZULAotICBBVkRUX0NDQl9BUElfR0VUQ0FQX1JFUV9FVlQsCi0gIEFWRFRfQ0NCX0FQSV9TVEFSVF9SRVFfRVZULAotICBBVkRUX0NDQl9BUElfU1VTUEVORF9SRVFfRVZULAotICBBVkRUX0NDQl9BUElfRElTQ09WRVJfUlNQX0VWVCwKLSAgQVZEVF9DQ0JfQVBJX0dFVENBUF9SU1BfRVZULAotICBBVkRUX0NDQl9BUElfU1RBUlRfUlNQX0VWVCwKLSAgQVZEVF9DQ0JfQVBJX1NVU1BFTkRfUlNQX0VWVCwKLSAgQVZEVF9DQ0JfQVBJX0NPTk5FQ1RfUkVRX0VWVCwKLSAgQVZEVF9DQ0JfQVBJX0RJU0NPTk5FQ1RfUkVRX0VWVCwKLSAgQVZEVF9DQ0JfTVNHX0RJU0NPVkVSX0NNRF9FVlQsCi0gIEFWRFRfQ0NCX01TR19HRVRDQVBfQ01EX0VWVCwKLSAgQVZEVF9DQ0JfTVNHX1NUQVJUX0NNRF9FVlQsCi0gIEFWRFRfQ0NCX01TR19TVVNQRU5EX0NNRF9FVlQsCi0gIEFWRFRfQ0NCX01TR19ESVNDT1ZFUl9SU1BfRVZULAotICBBVkRUX0NDQl9NU0dfR0VUQ0FQX1JTUF9FVlQsCi0gIEFWRFRfQ0NCX01TR19TVEFSVF9SU1BfRVZULAotICBBVkRUX0NDQl9NU0dfU1VTUEVORF9SU1BfRVZULAotICBBVkRUX0NDQl9SQ1ZSU1BfRVZULAotICBBVkRUX0NDQl9TRU5ETVNHX0VWVCwKLSAgQVZEVF9DQ0JfUkVUX1RPVVRfRVZULAotICBBVkRUX0NDQl9SU1BfVE9VVF9FVlQsCi0gIEFWRFRfQ0NCX0lETEVfVE9VVF9FVlQsCi0gIEFWRFRfQ0NCX1VMX09QRU5fRVZULAotICBBVkRUX0NDQl9VTF9DTE9TRV9FVlQsCi0gIEFWRFRfQ0NCX0xMX09QRU5fRVZULAotICBBVkRUX0NDQl9MTF9DTE9TRV9FVlQsCi0gIEFWRFRfQ0NCX0xMX0NPTkdfRVZUCi19OwotCi0vKiBzY2Igc3RhdGUgbWFjaGluZSBzdGF0ZXM7IHRoZXNlIHN0YXRlIHZhbHVlcyBhcmUgcHJpdmF0ZSB0byB0aGlzIG1vZHVsZSBzbwotICogdGhlIHNjYiBzdGF0ZSBjYW5ub3QgYmUgcmVhZCBvciBzZXQgYnkgYWN0aW9ucyBmdW5jdGlvbnMKLSovCi1lbnVtIHsKLSAgQVZEVF9TQ0JfSURMRV9TVCwKLSAgQVZEVF9TQ0JfQ09ORl9TVCwKLSAgQVZEVF9TQ0JfT1BFTklOR19TVCwKLSAgQVZEVF9TQ0JfT1BFTl9TVCwKLSAgQVZEVF9TQ0JfU1RSRUFNX1NULAotICBBVkRUX1NDQl9DTE9TSU5HX1NUCi19OwotCi0vKiBzdGF0ZSBtYWNoaW5lIGFjdGlvbiBlbnVtZXJhdGlvbiBsaXN0ICovCi1lbnVtIHsKLSAgQVZEVF9TQ0JfSERMX0FCT1JUX0NNRCwKLSAgQVZEVF9TQ0JfSERMX0FCT1JUX1JTUCwKLSAgQVZEVF9TQ0JfSERMX0NMT1NFX0NNRCwKLSAgQVZEVF9TQ0JfSERMX0NMT1NFX1JTUCwKLSAgQVZEVF9TQ0JfSERMX0dFVENPTkZJR19DTUQsCi0gIEFWRFRfU0NCX0hETF9HRVRDT05GSUdfUlNQLAotICBBVkRUX1NDQl9IRExfT1BFTl9DTUQsCi0gIEFWRFRfU0NCX0hETF9PUEVOX1JFSiwKLSAgQVZEVF9TQ0JfSERMX09QRU5fUlNQLAotICBBVkRUX1NDQl9IRExfUEtULAotICBBVkRUX1NDQl9EUk9QX1BLVCwKLSAgQVZEVF9TQ0JfSERMX1JFQ09ORklHX0NNRCwKLSAgQVZEVF9TQ0JfSERMX1JFQ09ORklHX1JTUCwKLSAgQVZEVF9TQ0JfSERMX1NFQ1VSSVRZX0NNRCwKLSAgQVZEVF9TQ0JfSERMX1NFQ1VSSVRZX1JTUCwKLSAgQVZEVF9TQ0JfSERMX1NFVENPTkZJR19DTUQsCi0gIEFWRFRfU0NCX0hETF9TRVRDT05GSUdfUkVKLAotICBBVkRUX1NDQl9IRExfU0VUQ09ORklHX1JTUCwKLSAgQVZEVF9TQ0JfSERMX1NUQVJUX0NNRCwKLSAgQVZEVF9TQ0JfSERMX1NUQVJUX1JTUCwKLSAgQVZEVF9TQ0JfSERMX1NVU1BFTkRfQ01ELAotICBBVkRUX1NDQl9IRExfU1VTUEVORF9SU1AsCi0gIEFWRFRfU0NCX0hETF9UQ19DTE9TRSwKLSAgQVZEVF9TQ0JfSERMX1RDX0NMT1NFX1NUTywKLSAgQVZEVF9TQ0JfSERMX1RDX09QRU4sCi0gIEFWRFRfU0NCX0hETF9UQ19PUEVOX1NUTywKLSAgQVZEVF9TQ0JfU05EX0RFTEFZX1JQVF9SRVEsCi0gIEFWRFRfU0NCX0hETF9ERUxBWV9SUFRfQ01ELAotICBBVkRUX1NDQl9IRExfREVMQVlfUlBUX1JTUCwKLSAgQVZEVF9TQ0JfSERMX1dSSVRFX1JFUSwKLSAgQVZEVF9TQ0JfU05EX0FCT1JUX1JFUSwKLSAgQVZEVF9TQ0JfU05EX0FCT1JUX1JTUCwKLSAgQVZEVF9TQ0JfU05EX0NMT1NFX1JFUSwKLSAgQVZEVF9TQ0JfU05EX1NUUkVBTV9DTE9TRSwKLSAgQVZEVF9TQ0JfU05EX0NMT1NFX1JTUCwKLSAgQVZEVF9TQ0JfU05EX0dFVENPTkZJR19SRVEsCi0gIEFWRFRfU0NCX1NORF9HRVRDT05GSUdfUlNQLAotICBBVkRUX1NDQl9TTkRfT1BFTl9SRVEsCi0gIEFWRFRfU0NCX1NORF9PUEVOX1JTUCwKLSAgQVZEVF9TQ0JfU05EX1JFQ09ORklHX1JFUSwKLSAgQVZEVF9TQ0JfU05EX1JFQ09ORklHX1JTUCwKLSAgQVZEVF9TQ0JfU05EX1NFQ1VSSVRZX1JFUSwKLSAgQVZEVF9TQ0JfU05EX1NFQ1VSSVRZX1JTUCwKLSAgQVZEVF9TQ0JfU05EX1NFVENPTkZJR19SRVEsCi0gIEFWRFRfU0NCX1NORF9TRVRDT05GSUdfUkVKLAotICBBVkRUX1NDQl9TTkRfU0VUQ09ORklHX1JTUCwKLSAgQVZEVF9TQ0JfU05EX1NOS19ERUxBWV9SUFRfUkVRLAotICBBVkRUX1NDQl9TTkRfVENfQ0xPU0UsCi0gIEFWRFRfU0NCX0NCX0VSUiwKLSAgQVZEVF9TQ0JfQ09OR19TVEFURSwKLSAgQVZEVF9TQ0JfUkVKX1NUQVRFLAotICBBVkRUX1NDQl9SRUpfSU5fVVNFLAotICBBVkRUX1NDQl9SRUpfTk9UX0lOX1VTRSwKLSAgQVZEVF9TQ0JfU0VUX1JFTU9WRSwKLSAgQVZEVF9TQ0JfRlJFRV9QS1QsCi0gIEFWRFRfU0NCX0NMUl9QS1QsCi0gIEFWRFRfU0NCX0NIS19TTkRfUEtULAotICBBVkRUX1NDQl9UQ19USU1FUiwKLSAgQVZEVF9TQ0JfQ0xSX1ZBUlMsCi0gIEFWRFRfU0NCX0RFQUxMT0MsCi0gIEFWRFRfU0NCX05VTV9BQ1RJT05TCi19OwotCi0jZGVmaW5lIEFWRFRfU0NCX0lHTk9SRSBBVkRUX1NDQl9OVU1fQUNUSU9OUwotCi0vKiBzY2Igc3RhdGUgbWFjaGluZSBldmVudHMgKi8KLWVudW0gewotICBBVkRUX1NDQl9BUElfUkVNT1ZFX0VWVCwKLSAgQVZEVF9TQ0JfQVBJX1dSSVRFX1JFUV9FVlQsCi0gIEFWRFRfU0NCX0FQSV9HRVRDT05GSUdfUkVRX0VWVCwKLSAgQVZEVF9TQ0JfQVBJX0RFTEFZX1JQVF9SRVFfRVZULAotICBBVkRUX1NDQl9BUElfU0VUQ09ORklHX1JFUV9FVlQsCi0gIEFWRFRfU0NCX0FQSV9PUEVOX1JFUV9FVlQsCi0gIEFWRFRfU0NCX0FQSV9DTE9TRV9SRVFfRVZULAotICBBVkRUX1NDQl9BUElfUkVDT05GSUdfUkVRX0VWVCwKLSAgQVZEVF9TQ0JfQVBJX1NFQ1VSSVRZX1JFUV9FVlQsCi0gIEFWRFRfU0NCX0FQSV9BQk9SVF9SRVFfRVZULAotICBBVkRUX1NDQl9BUElfR0VUQ09ORklHX1JTUF9FVlQsCi0gIEFWRFRfU0NCX0FQSV9TRVRDT05GSUdfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfQVBJX1NFVENPTkZJR19SRUpfRVZULAotICBBVkRUX1NDQl9BUElfT1BFTl9SU1BfRVZULAotICBBVkRUX1NDQl9BUElfQ0xPU0VfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfQVBJX1JFQ09ORklHX1JTUF9FVlQsCi0gIEFWRFRfU0NCX0FQSV9TRUNVUklUWV9SU1BfRVZULAotICBBVkRUX1NDQl9BUElfQUJPUlRfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX1NFVENPTkZJR19DTURfRVZULAotICBBVkRUX1NDQl9NU0dfR0VUQ09ORklHX0NNRF9FVlQsCi0gIEFWRFRfU0NCX01TR19PUEVOX0NNRF9FVlQsCi0gIEFWRFRfU0NCX01TR19TVEFSVF9DTURfRVZULAotICBBVkRUX1NDQl9NU0dfU1VTUEVORF9DTURfRVZULAotICBBVkRUX1NDQl9NU0dfQ0xPU0VfQ01EX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX0FCT1JUX0NNRF9FVlQsCi0gIEFWRFRfU0NCX01TR19SRUNPTkZJR19DTURfRVZULAotICBBVkRUX1NDQl9NU0dfU0VDVVJJVFlfQ01EX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX0RFTEFZX1JQVF9DTURfRVZULAotICBBVkRUX1NDQl9NU0dfREVMQVlfUlBUX1JTUF9FVlQsCi0gIEFWRFRfU0NCX01TR19TRVRDT05GSUdfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX0dFVENPTkZJR19SU1BfRVZULAotICBBVkRUX1NDQl9NU0dfT1BFTl9SU1BfRVZULAotICBBVkRUX1NDQl9NU0dfU1RBUlRfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX1NVU1BFTkRfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX0NMT1NFX1JTUF9FVlQsCi0gIEFWRFRfU0NCX01TR19BQk9SVF9SU1BfRVZULAotICBBVkRUX1NDQl9NU0dfUkVDT05GSUdfUlNQX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX1NFQ1VSSVRZX1JTUF9FVlQsCi0gIEFWRFRfU0NCX01TR19TRVRDT05GSUdfUkVKX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX09QRU5fUkVKX0VWVCwKLSAgQVZEVF9TQ0JfTVNHX1NUQVJUX1JFSl9FVlQsCi0gIEFWRFRfU0NCX01TR19TVVNQRU5EX1JFSl9FVlQsCi0gIEFWRFRfU0NCX1RDX1RPVVRfRVZULAotICBBVkRUX1NDQl9UQ19PUEVOX0VWVCwKLSAgQVZEVF9TQ0JfVENfQ0xPU0VfRVZULAotICBBVkRUX1NDQl9UQ19DT05HX0VWVCwKLSAgQVZEVF9TQ0JfVENfREFUQV9FVlQsCi0gIEFWRFRfU0NCX0NDX0NMT1NFX0VWVAotfTsKLQotLyogYWRhcHRpb24gbGF5ZXIgbnVtYmVyIG9mIHN0cmVhbSByb3V0aW5nIHRhYmxlIGVudHJpZXMgKi8KLS8qIDIgY2hhbm5lbHMoMSBtZWRpYSwgMSByZXBvcnQpIGZvciBlYWNoIFNFUCBhbmQgb25lIGZvciBzaWduYWxsaW5nICovCi0jZGVmaW5lIEFWRFRfTlVNX1JUX1RCTCAoQVZEVF9OVU1fU0VQUyAqIEFWRFRfQ0hBTl9OVU1fVFlQRVMgKyAxKQotCi0vKiBhZGFwdGlvbiBsYXllciBudW1iZXIgb2YgdHJhbnNwb3J0IGNoYW5uZWwgdGFibGUgZW50cmllcyAtIG1vdmVkIHRvIHRhcmdldC5oCi0jZGVmaW5lIEFWRFRfTlVNX1RDX1RCTCAgICAgKEFWRFRfTlVNX1NFUFMgKyBBVkRUX05VTV9MSU5LUykgKi8KLQotLyogInN0YXRlcyIgdXNlZCBpbiB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSAqLwotI2RlZmluZSBBVkRUX0FEX1NUX1VOVVNFRCAwICAvKiBVbnVzZWQgLSB1bmFsbG9jYXRlZCAqLwotI2RlZmluZSBBVkRUX0FEX1NUX0lETEUgMSAgICAvKiBObyBjb25uZWN0aW9uICovCi0jZGVmaW5lIEFWRFRfQURfU1RfQUNQIDIgICAgIC8qIFdhaXRpbmcgdG8gYWNjZXB0IGEgY29ubmVjdGlvbiAqLwotI2RlZmluZSBBVkRUX0FEX1NUX0NPTk4gNCAgICAvKiBXYWl0aW5nIGZvciBjb25uZWN0aW9uIGNvbmZpcm0gKi8KLSNkZWZpbmUgQVZEVF9BRF9TVF9DRkcgNSAgICAgLyogV2FpdGluZyBmb3IgY29uZmlndXJhdGlvbiBjb21wbGV0ZSAqLwotI2RlZmluZSBBVkRUX0FEX1NUX09QRU4gNiAgICAvKiBDaGFubmVsIG9wZW5lZCAqLwotI2RlZmluZSBBVkRUX0FEX1NUX1NFQ19JTlQgNyAvKiBTZWN1cml0eSBwcm9jZXNzIGFzIElOVCAqLwotI2RlZmluZSBBVkRUX0FEX1NUX1NFQ19BQ1AgOCAvKiBTZWN1cml0eSBwcm9jZXNzIGFzIEFDUCAqLwotCi0vKiBDb25maWd1cmF0aW9uIGZsYWdzLiBBdmR0cFRyYW5zcG9ydENoYW5uZWwuY2ZnX2ZsYWdzICovCi0jZGVmaW5lIEFWRFRfTDJDX0NGR19DT05OX0lOVCAoMSA8PCAyKQotI2RlZmluZSBBVkRUX0wyQ19DRkdfQ09OTl9BQ1AgKDEgPDwgMykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkYXRhIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogbXNnIHVuaW9uIG9mIGFsbCBtZXNzYWdlIHBhcmFtZXRlciB0eXBlcyAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHRBVkRUX0VWVF9IRFIgaGRyOwotICB0QVZEVF9FVlRfSERSIHNpbmdsZTsKLSAgdEFWRFRfU0VUQ09ORklHIGNvbmZpZ19jbWQ7Ci0gIHRBVkRUX0NPTkZJRyByZWNvbmZpZ19jbWQ7Ci0gIHRBVkRUX01VTFRJIG11bHRpOwotICB0QVZEVF9TRUNVUklUWSBzZWN1cml0eV9jbWQ7Ci0gIHRBVkRUX0RJU0NPVkVSIGRpc2NvdmVyX3JzcDsKLSAgdEFWRFRfQ09ORklHIHN2Y2NhcDsKLSAgdEFWRFRfU0VDVVJJVFkgc2VjdXJpdHlfcnNwOwotICB0QVZEVF9ERUxBWV9SUFQgZGVsYXlfcnB0X2NtZDsKLX0gdEFWRFRfTVNHOwotCi0vKiBkYXRhIHR5cGUgZm9yIEFWRFRfQ0NCX0FQSV9ESVNDT1ZFUl9SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2s7Ci0gIHRBVkRUX1NFUF9JTkZPKiBwX3NlcF9pbmZvOwotICB1aW50OF90IG51bV9zZXBzOwotfSB0QVZEVF9DQ0JfQVBJX0RJU0NPVkVSOwotCi0vKiBkYXRhIHR5cGUgZm9yIEFWRFRfQ0NCX0FQSV9HRVRDQVBfUkVRX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZEVF9FVlRfSERSIHNpbmdsZTsKLSAgdEFWRFRfQ1RSTF9DQkFDSyogcF9jYmFjazsKLSAgQXZkdHBTZXBDb25maWcqIHBfY2ZnOwotfSB0QVZEVF9DQ0JfQVBJX0dFVENBUDsKLQotLyogZGF0YSB0eXBlIGZvciBBVkRUX0NDQl9BUElfQ09OTkVDVF9SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2s7Ci19IHRBVkRUX0NDQl9BUElfQ09OTkVDVDsKLQotLyogZGF0YSB0eXBlIGZvciBBVkRUX0NDQl9BUElfRElTQ09OTkVDVF9SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7IHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2s7IH0gdEFWRFRfQ0NCX0FQSV9ESVNDT05ORUNUOwotCi0vKiB1bmlvbiBhc3NvY2lhdGVkIHdpdGggY2NiIHN0YXRlIG1hY2hpbmUgZXZlbnRzICovCi10eXBlZGVmIHVuaW9uIHsKLSAgdEFWRFRfQ0NCX0FQSV9ESVNDT1ZFUiBkaXNjb3ZlcjsKLSAgdEFWRFRfQ0NCX0FQSV9HRVRDQVAgZ2V0Y2FwOwotICB0QVZEVF9DQ0JfQVBJX0NPTk5FQ1QgY29ubmVjdDsKLSAgdEFWRFRfQ0NCX0FQSV9ESVNDT05ORUNUIGRpc2Nvbm5lY3Q7Ci0gIHRBVkRUX01TRyBtc2c7Ci0gIGJvb2wgbGxjb25nOwotICB1aW50OF90IGVycl9jb2RlOwotfSB0QVZEVF9DQ0JfRVZUOwotCi0vKiB0eXBlIGZvciBBVkRUX1NDQl9BUElfV1JJVEVfUkVRX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50MzJfdCB0aW1lX3N0YW1wOwotICB1aW50OF90IG1fcHQ7Ci0gIHRBVkRUX0RBVEFfT1BUX01BU0sgb3B0OwotfSB0QVZEVF9TQ0JfQVBJV1JJVEU7Ci0KLS8qIHR5cGUgZm9yIEFWRFRfU0NCX1RDX0NMT1NFX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG9sZF90Y19zdGF0ZTsgLyogY2hhbm5lbCBzdGF0ZSBiZWZvcmUgY2xvc2VkICovCi0gIHVpbnQ4X3QgdGNpZDsgICAgICAgICAvKiBUQ0lEICAqLwotICB1aW50OF90IHR5cGU7ICAgICAgICAgLyogY2hhbm5lbCB0eXBlICovCi19IHRBVkRUX1NDQl9UQ19DTE9TRTsKLQotLyogdHlwZSBmb3Igc2NiIGV2ZW50IGRhdGEgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QVZEVF9NU0cgbXNnOwotICB0QVZEVF9TQ0JfQVBJV1JJVEUgYXBpd3JpdGU7Ci0gIHRBVkRUX0RFTEFZX1JQVCBhcGlkZWxheTsKLSAgdEFWRFRfT1BFTiBvcGVuOwotICB0QVZEVF9TQ0JfVENfQ0xPU0UgY2xvc2U7Ci0gIGJvb2wgbGxjb25nOwotICBCVF9IRFIqIHBfcGt0OwotfSB0QVZEVF9TQ0JfRVZUOwotCi1jbGFzcyBBdmR0cENjYjsKLQotLyoqCi0gKiBBVkRUUCBTdHJlYW0gQ29udHJvbCBCbG9jay4KLSAqLwotY2xhc3MgQXZkdHBTY2IgewotIHB1YmxpYzoKLSAgQXZkdHBTY2IoKQotICAgICAgOiB0cmFuc3BvcnRfY2hhbm5lbF90aW1lcihudWxscHRyKSwKLSAgICAgICAgcF9wa3QobnVsbHB0ciksCi0gICAgICAgIHBfY2NiKG51bGxwdHIpLAotICAgICAgICBtZWRpYV9zZXEoMCksCi0gICAgICAgIGFsbG9jYXRlZChmYWxzZSksCi0gICAgICAgIGluX3VzZShmYWxzZSksCi0gICAgICAgIG5lZWRfb3BlbihmYWxzZSksCi0gICAgICAgIHJvbGUoMCksCi0gICAgICAgIHJlbW92ZShmYWxzZSksCi0gICAgICAgIHN0YXRlKDApLAotICAgICAgICBwZWVyX3NlaWQoMCksCi0gICAgICAgIGN1cnJfZXZ0KDApLAotICAgICAgICBjb25nKGZhbHNlKSwKLSAgICAgICAgY2xvc2VfY29kZSgwKSwKLSAgICAgICAgc2NiX2hhbmRsZV8oMCkge30KLQotICAvKioKLSAgICogQWxsb2NhdGUgdGhlIGVudHJ5IGZvciB1c2FnZS4KLSAgICogUHJldmlvdXMgc3RhdGUgd2lsbCBiZSByZXNldCBhbmQgaW5pdGlhbGl6ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBwX2F2ZHRwX2NjYiB0aGUgQXZkdENjYiBlbnRyeSB0byB1c2UKLSAgICogQHBhcmFtIGF2ZHRwX3N0cmVhbV9jb25maWcgdGhlIHN0cmVhbSBjb25maWcgdG8gdXNlCi0gICAqLwotICB2b2lkIEFsbG9jYXRlKEF2ZHRwQ2NiKiBwX2F2ZHRwX2NjYiwKLSAgICAgICAgICAgICAgICBjb25zdCBBdmR0cFN0cmVhbUNvbmZpZyYgYXZkdHBfc3RyZWFtX2NvbmZpZyk7Ci0KLSAgLyoqCi0gICAqIFJlY3ljbGUgdGhlIGVudHJ5IGJ5IHJlc2V0dGluZyBpdCwgbWFyayBpdCBhcyBhbGxvY2F0ZWQgYW5kIGtlZXBpbmcKLSAgICogdGhlIGZvbGxvd2luZyBzdGF0ZToKLSAgICogIC0gc3RyZWFtX2NvbmZpZwotICAgKiAgLSBwX2NjYgotICAgKi8KLSAgdm9pZCBSZWN5Y2xlKCkgewotICAgIEF2ZHRwU3RyZWFtQ29uZmlnIHN0cmVhbV9jb25maWdfc2F2ZWQgPSBzdHJlYW1fY29uZmlnOwotICAgIEF2ZHRwQ2NiKiBwX2NjYl9zYXZlZCA9IHBfY2NiOwotICAgIEFsbG9jYXRlKHBfY2NiX3NhdmVkLCBzdHJlYW1fY29uZmlnX3NhdmVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCBhbGwgdGhlIHN0YXRlLgotICAgKgotICAgKiBAcGFyYW0gc2NiX2hhbmRsZSB0aGUgQVZEVFAgU0NCIGhhbmRsZSB0byB1c2UKLSAgICovCi0gIHZvaWQgUmVzZXQodWludDhfdCBzY2JfaGFuZGxlKSB7Ci0gICAgc3RyZWFtX2NvbmZpZy5SZXNldCgpOwotICAgIGN1cnJfY2ZnLlJlc2V0KCk7Ci0gICAgcmVxX2NmZy5SZXNldCgpOwotCi0gICAgYWxhcm1fZnJlZSh0cmFuc3BvcnRfY2hhbm5lbF90aW1lcik7Ci0gICAgdHJhbnNwb3J0X2NoYW5uZWxfdGltZXIgPSBudWxscHRyOwotCi0gICAgcF9wa3QgPSBudWxscHRyOwotICAgIHBfY2NiID0gbnVsbHB0cjsKLSAgICBtZWRpYV9zZXEgPSAwOwotICAgIGFsbG9jYXRlZCA9IGZhbHNlOwotICAgIGluX3VzZSA9IGZhbHNlOwotICAgIG5lZWRfb3BlbiA9IGZhbHNlOwotICAgIHJvbGUgPSAwOwotICAgIHJlbW92ZSA9IGZhbHNlOwotICAgIHN0YXRlID0gMDsKLSAgICBwZWVyX3NlaWQgPSAwOwotICAgIGN1cnJfZXZ0ID0gMDsKLSAgICBjb25nID0gZmFsc2U7Ci0gICAgY2xvc2VfY29kZSA9IDA7Ci0gICAgc2NiX2hhbmRsZV8gPSBzY2JfaGFuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgQVZEVFAgU0NCIGhhbmRsZSBmb3IgdGhpcyBlbnRyeS4KLSAgICovCi0gIHVpbnQ4X3QgU2NiSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gc2NiX2hhbmRsZV87IH0KLQotICBBdmR0cFN0cmVhbUNvbmZpZyBzdHJlYW1fY29uZmlnOyAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uCi0gIEF2ZHRwU2VwQ29uZmlnIGN1cnJfY2ZnOyAgICAgICAgICAgLy8gQ3VycmVudCBjb25maWd1cmF0aW9uCi0gIEF2ZHRwU2VwQ29uZmlnIHJlcV9jZmc7ICAgICAgICAgICAgLy8gUmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24KLSAgYWxhcm1fdCogdHJhbnNwb3J0X2NoYW5uZWxfdGltZXI7ICAvLyBUcmFuc3BvcnQgY2hhbm5lbCBjb25uZWN0IHRpbWVyCi0gIEJUX0hEUiogcF9wa3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gUGFja2V0IHdhaXRpbmcgdG8gYmUgc2VudAotICBBdmR0cENjYiogcF9jY2I7ICAgICAgICAgICAgICAgICAgIC8vIENDQiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTQ0IKLSAgdWludDE2X3QgbWVkaWFfc2VxOyAgICAgICAgICAgICAgICAvLyBNZWRpYSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyCi0gIGJvb2wgYWxsb2NhdGVkOyAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGUgU0NCIGlzIGFsbG9jYXRlZAotICBib29sIGluX3VzZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRydWUgaWYgdXNlZCBieSBwZWVyCi0gIGJvb2wgbmVlZF9vcGVuOyAgICAgIC8vIFRydWUgaWYgbmVlZCBvcGVuIGFmdGVyIHJlY2VpdmluZyBkZWxheSByZXBvcnQgKEFWRFQgMV8zKQotICB1aW50OF90IHJvbGU7ICAgICAgICAvLyBJbml0aWF0b3IvYWNjZXB0b3Igcm9sZSBpbiBjdXJyZW50IHByb2NlZHVyZQotICBib29sIHJlbW92ZTsgICAgICAgICAvLyBUcnVlIGlmIHRoZSBTQ0IgaXMgbWFya2VkIGZvciByZW1vdmFsCi0gIHVpbnQ4X3Qgc3RhdGU7ICAgICAgIC8vIFN0YXRlIG1hY2hpbmUgc3RhdGUKLSAgdWludDhfdCBwZWVyX3NlaWQ7ICAgLy8gU0VJRCBvZiBwZWVyIHN0cmVhbQotICB1aW50OF90IGN1cnJfZXZ0OyAgICAvLyBjdXJyZW50IGV2ZW50OyBzZXQgb25seSBieSB0aGUgc3RhdGUgbWFjaGluZQotICBib29sIGNvbmc7ICAgICAgICAgICAvLyBUcnVlIGlmIHRoZSBtZWRpYSB0cmFuc3BvcnQgY2hhbm5lbCBpcyBjb25nZXN0ZWQKLSAgdWludDhfdCBjbG9zZV9jb2RlOyAgLy8gRXJyb3IgY29kZSByZWNlaXZlZCBpbiBjbG9zZSByZXNwb25zZQotICBib29sIGN1cnJfc3RyZWFtOyAgICAvLyBUcnVlIGlmIHRoZSBTQ0IgaXMgdGhlIGN1cnJlbnQgc3RyZWFtLCBGYWxzZSBvdGhlcndpc2UKLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3Qgc2NiX2hhbmRsZV87ICAvLyBVbmlxdWUgaGFuZGxlIGZvciB0aGlzIEF2ZHRwU2NiIGVudHJ5Ci19OwotCi0vKioKLSAqIEFWRFRQIENoYW5uZWwgQ29udHJvbCBCbG9jay4KLSAqLwotY2xhc3MgQXZkdHBDY2IgewotIHB1YmxpYzoKLSAgQXZkdHBDY2IoKQotICAgICAgOiBwZWVyX2FkZHIoUmF3QWRkcmVzczo6a0VtcHR5KSwKLSAgICAgICAgc2Nie30sCi0gICAgICAgIGlkbGVfY2NiX3RpbWVyKG51bGxwdHIpLAotICAgICAgICByZXRfY2NiX3RpbWVyKG51bGxwdHIpLAotICAgICAgICByc3BfY2NiX3RpbWVyKG51bGxwdHIpLAotICAgICAgICBjbWRfcShudWxscHRyKSwKLSAgICAgICAgcnNwX3EobnVsbHB0ciksCi0gICAgICAgIHByb2NfY2JhY2sobnVsbHB0ciksCi0gICAgICAgIHBfY29ubl9jYmFjayhudWxscHRyKSwKLSAgICAgICAgcF9wcm9jX2RhdGEobnVsbHB0ciksCi0gICAgICAgIHBfY3Vycl9jbWQobnVsbHB0ciksCi0gICAgICAgIHBfY3Vycl9tc2cobnVsbHB0ciksCi0gICAgICAgIHBfcnhfbXNnKG51bGxwdHIpLAotICAgICAgICBhbGxvY2F0ZWQoZmFsc2UpLAotICAgICAgICBzdGF0ZSgwKSwKLSAgICAgICAgbGxfb3BlbmVkKGZhbHNlKSwKLSAgICAgICAgcHJvY19idXN5KGZhbHNlKSwKLSAgICAgICAgcHJvY19wYXJhbSgwKSwKLSAgICAgICAgY29uZyhmYWxzZSksCi0gICAgICAgIGxhYmVsKDApLAotICAgICAgICByZWNvbm4oZmFsc2UpLAotICAgICAgICByZXRfY291bnQoMCksCi0gICAgICAgIGJ0YV9hdl9zY2JfaW5kZXhfKDApIHt9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHRoZSBlbnRyeSBmb3IgdXNhZ2UuCi0gICAqCi0gICAqIE5PVEU6IFRoZSBjb3JyZXNwb25kaW5nIEF2ZHRwU2NiIGVudHJpZXMgYXJlIGFsbG9jYXRlZCBpbmRlcGVuZGVudGx5LgotICAgKiBAcGFyYW0gcGVlcl9hZGRyZXNzIHRoZSBwZWVyIGFkZHJlc3MKLSAgICovCi0gIHZvaWQgQWxsb2NhdGUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKTsKLQotICAvKioKLSAgICogUmVzZXQgYWxsIHRoZSBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGJ0YV9hdl9zY2JfaW5kZXggdGhlIEJUQSBBViBTQ0IgaW5kZXggdG8gdXNlCi0gICAqLwotICB2b2lkIFJlc2V0KHVpbnQ4X3QgYnRhX2F2X3NjYl9pbmRleCkgewotICAgIGJ0YV9hdl9zY2JfaW5kZXhfID0gYnRhX2F2X3NjYl9pbmRleDsKLSAgICBSZXNldENjYigpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVZEVF9OVU1fU0VQUzsgaSsrKSB7Ci0gICAgICBzY2JbaV0uUmVzZXQoMCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IG9ubHkgdGhlIENoYW5uZWwgQ29udHJvbCBCbG9jayBzdGF0ZSB3aXRob3V0IHRoZSBTdHJlYW0KLSAgICogQ29udHJvbCBCbG9jayBlbnRyaWVzLiBUaGUgYnRhX2F2X3NjYl9pbmRleF8gaXMgYWxzbyBwcmVzZXJ2ZWQuCi0gICAqLwotICB2b2lkIFJlc2V0Q2NiKCkgewotICAgIHBlZXJfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLQotICAgIGFsYXJtX2ZyZWUoaWRsZV9jY2JfdGltZXIpOwotICAgIGlkbGVfY2NiX3RpbWVyID0gbnVsbHB0cjsKLQotICAgIGFsYXJtX2ZyZWUocmV0X2NjYl90aW1lcik7Ci0gICAgcmV0X2NjYl90aW1lciA9IG51bGxwdHI7Ci0KLSAgICBhbGFybV9mcmVlKHJzcF9jY2JfdGltZXIpOwotICAgIHJzcF9jY2JfdGltZXIgPSBudWxscHRyOwotCi0gICAgZml4ZWRfcXVldWVfZnJlZShjbWRfcSwgbnVsbHB0cik7Ci0gICAgY21kX3EgPSBudWxscHRyOwotCi0gICAgZml4ZWRfcXVldWVfZnJlZShyc3BfcSwgbnVsbHB0cik7Ci0gICAgcnNwX3EgPSBudWxscHRyOwotCi0gICAgcHJvY19jYmFjayA9IG51bGxwdHI7Ci0gICAgcF9jb25uX2NiYWNrID0gbnVsbHB0cjsKLSAgICBwX3Byb2NfZGF0YSA9IG51bGxwdHI7Ci0gICAgcF9jdXJyX2NtZCA9IG51bGxwdHI7Ci0gICAgcF9jdXJyX21zZyA9IG51bGxwdHI7Ci0gICAgcF9yeF9tc2cgPSBudWxscHRyOwotICAgIGFsbG9jYXRlZCA9IGZhbHNlOwotICAgIHN0YXRlID0gMDsKLSAgICBsbF9vcGVuZWQgPSBmYWxzZTsKLSAgICBwcm9jX2J1c3kgPSBmYWxzZTsKLSAgICBwcm9jX3BhcmFtID0gMDsKLSAgICBjb25nID0gZmFsc2U7Ci0gICAgbGFiZWwgPSAwOwotICAgIHJlY29ubiA9IGZhbHNlOwotICAgIHJldF9jb3VudCA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb3JyZXNwb25kaW5nIEJUQSBBViBzdHJlYW0gY29udHJvbCBibG9jayBpbmRleCBmb3IgdGhpcyBlbnRyeS4KLSAgICovCi0gIHVpbnQ4X3QgQnRhQXZTY2JJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGJ0YV9hdl9zY2JfaW5kZXhfOyB9Ci0KLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7ICAgICAgICAgLy8gQmx1ZXRvb3RoIGFkZHJlc3Mgb2YgcGVlcgotICBBdmR0cFNjYiBzY2JbQVZEVF9OVU1fU0VQU107ICAvLyBUaGUgQVZEVFAgc3RyZWFtIGNvbnRyb2wgYmxvY2tzCi0KLSAgLyoKLSAgICogTk9URTogaWRsZV9jY2JfdGltZXIsIHJldF9jY2JfdGltZXIgYW5kIHJzcF9jY2JfdGltZXIgYXJlIG11dHVhbGx5Ci0gICAqIGV4Y2x1c2l2ZSAtIG5vIG1vcmUgdGhhbiBvbmUgdGltZXIgc2hvdWxkIGJlIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KLSAgICovCi0gIGFsYXJtX3QqIGlkbGVfY2NiX3RpbWVyOyAgLy8gSWRsZSBDQ0IgdGltZXIgZW50cnkKLSAgYWxhcm1fdCogcmV0X2NjYl90aW1lcjsgICAvLyBSZXQgQ0NCIHRpbWVyIGVudHJ5Ci0gIGFsYXJtX3QqIHJzcF9jY2JfdGltZXI7ICAgLy8gUnNwIENDQiB0aW1lciBlbnRyeQotICBmaXhlZF9xdWV1ZV90KiBjbWRfcTsgICAgIC8vIFF1ZXVlIGZvciBvdXRnb2luZyBjb21tYW5kIG1lc3NhZ2VzCi0gIGZpeGVkX3F1ZXVlX3QqIHJzcF9xOyAgICAgLy8gUXVldWUgZm9yIG91dGdvaW5nIHJlc3BvbnNlIGFuZCByZWplY3QgbWVzc2FnZXMKLSAgdEFWRFRfQ1RSTF9DQkFDSyogcHJvY19jYmFjazsgICAgLy8gUHJvY2VkdXJlIGNhbGxiYWNrIGZ1bmN0aW9uCi0gIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY29ubl9jYmFjazsgIC8vIENvbm5lY3Rpb24vZGlzY29ubmVjdGlvbiBjYWxsYmFjayBmdW5jdGlvbgotICB2b2lkKiBwX3Byb2NfZGF0YTsgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIGRhdGEgc3RvcmFnZSBmb3IgcHJvY2VkdXJlCi0gIEJUX0hEUiogcF9jdXJyX2NtZDsgIC8vIEN1cnJlbnQgY29tbWFuZCBiZWluZyBzZW50IGF3YWl0aW5nIHJlc3BvbnNlCi0gIEJUX0hEUiogcF9jdXJyX21zZzsgIC8vIEN1cnJlbnQgbWVzc2FnZSBiZWluZyBzZW50Ci0gIEJUX0hEUiogcF9yeF9tc2c7ICAgIC8vIEN1cnJlbnQgbWVzc2FnZSBiZWluZyByZWNlaXZlZAotICBib29sIGFsbG9jYXRlZDsgICAgICAvLyBXaGV0aGVyIGNjYiBpcyBhbGxvY2F0ZWQKLSAgdWludDhfdCBzdGF0ZTsgICAgICAgLy8gVGhlIENDQiBzdGF0ZSBtYWNoaW5lIHN0YXRlCi0gIGJvb2wgbGxfb3BlbmVkOyAgICAgIC8vIFRydWUgaWYgTEwgaXMgb3BlbmVkCi0gIGJvb2wgcHJvY19idXN5OyAgICAgIC8vIFRydWUgd2hlbiBhIGRpc2NvdmVyIG9yIGdldCBjYXBhYmlsaXRpZXMgcHJvY2VkdXJlIGluCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2dyZXNzCi0gIHVpbnQ4X3QgcHJvY19wYXJhbTsgIC8vIFByb2NlZHVyZSBwYXJhbWV0ZXI7IGVpdGhlciBTRUlEIGZvciBnZXQgY2FwYWJpbGl0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG51bWJlciBvZiBTRVBTIGZvciBkaXNjb3ZlcgotICBib29sIGNvbmc7ICAgICAgICAgICAvLyBUcnVlIGlmIHRoZSBzaWduYWxpbmcgY2hhbm5lbCBpcyBjb25nZXN0ZWQKLSAgdWludDhfdCBsYWJlbDsgICAgICAgLy8gTWVzc2FnZSBoZWFkZXIgImxhYmVsIiAoc2VxdWVuY2UgbnVtYmVyKQotICBib29sIHJlY29ubjsgICAgICAgIC8vIElmIHRydWUsIHJlaW5pdGlhdGUgY29ubmVjdGlvbiBhZnRlciB0cmFuc2l0aW9uaW5nIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAvLyBDTE9TSU5HIHRvIElETEUgc3RhdGUKLSAgdWludDhfdCByZXRfY291bnQ7ICAvLyBDb21tYW5kIHJldHJhbnNtaXNzaW9uIGNvdW50Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgY29ycmVzcG9uZGluZyBCVEEgQVYgc3RyZWFtIGNvbnRyb2wgYmxvY2sgaW5kZXggZm9yIHRoaXMgZW50cnkKLSAgdWludDhfdCBidGFfYXZfc2NiX2luZGV4XzsKLX07Ci0KLS8qKgotICogQVZEVFAgdHJhbnNwb3J0IGNoYW5uZWwgZW50cnkuCi0gKiBVc2VkIGluIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSBpbiB0aGUgYWRhcHRhdGlvbiBsYXllci4KLSAqLwotY2xhc3MgQXZkdHBUcmFuc3BvcnRDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCgpCi0gICAgICA6IHBlZXJfbXR1KDApLAotICAgICAgICBteV9tdHUoMCksCi0gICAgICAgIGxjaWQoMCksCi0gICAgICAgIHRjaWQoMCksCi0gICAgICAgIGNjYl9pZHgoMCksCi0gICAgICAgIHN0YXRlKDApLAotICAgICAgICBjZmdfZmxhZ3MoMCkge30KLQotICB2b2lkIFJlc2V0KCkgewotICAgIHBlZXJfbXR1ID0gMDsKLSAgICBteV9tdHUgPSAwOwotICAgIGxjaWQgPSAwOwotICAgIHRjaWQgPSAwOwotICAgIGNjYl9pZHggPSAwOwotICAgIHN0YXRlID0gMDsKLSAgICBjZmdfZmxhZ3MgPSAwOwotICB9Ci0KLSAgdWludDE2X3QgcGVlcl9tdHU7ICAgICAvLyBMMkNBUCBNVFUgb2YgdGhlIHBlZXIgZGV2aWNlCi0gIHVpbnQxNl90IG15X210dTsgICAgICAgLy8gT3VyIE1UVSBmb3IgdGhpcyBjaGFubmVsCi0gIHVpbnQxNl90IGxjaWQ7Ci0gIHVpbnQ4X3QgdGNpZDsgICAgICAgLy8gVHJhbnNwb3J0IGNoYW5uZWwgSUQKLSAgdWludDhfdCBjY2JfaWR4OyAgICAvLyBDaGFubmVsIGNvbnRyb2wgYmxvY2sgZm9yIHdpdGggdGhpcyB0cmFuc3BvcnQgY2hhbm5lbAotICB1aW50OF90IHN0YXRlOyAgICAgIC8vIFRyYW5zcG9ydCBjaGFubmVsIHN0YXRlCi0gIHVpbnQ4X3QgY2ZnX2ZsYWdzOyAgLy8gTDJDQVAgY29uZmlndXJhdGlvbiBmbGFncwotfTsKLQotLyoqCi0gKiBBVkRUUCBzdHJlYW0gcm91dGluZyBlbnRyeS4KLSAqIFVzZWQgaW4gdGhlIHJvdXRpbmcgdGFibGUgaW4gdGhlIGFkYXB0aW9uIGxheWVyLgotICovCi1jbGFzcyBBdmR0cFJvdXRpbmdFbnRyeSB7Ci0gcHVibGljOgotICBBdmR0cFJvdXRpbmdFbnRyeSgpIDogbGNpZCgwKSwgc2NiX2hkbCgwKSB7fQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgbGNpZCA9IDA7Ci0gICAgc2NiX2hkbCA9IDA7Ci0gIH0KLQotICB1aW50MTZfdCBsY2lkOyAgICAvLyBMMkNBUCBMQ0lEIG9mIHRoZSBhc3NvY2lhdGVkIHRyYW5zcG9ydCBjaGFubmVsCi0gIHVpbnQ4X3Qgc2NiX2hkbDsgIC8vIFN0cmVhbSBjb250cm9sIGJsb2NrIGZvciB0aGlzIHRyYW5zcG9ydCBjaGFubmVsCi19OwotCi0vKioKLSAqIEFWRFRQIGFkYXB0aW9uIGxheWVyIGNvbnRyb2wgYmxvY2suCi0gKi8KLWNsYXNzIEF2ZHRwQWRhcHRhdGlvbkxheWVyIHsKLSBwdWJsaWM6Ci0gIEF2ZHRwQWRhcHRhdGlvbkxheWVyKCkge30KLQotICB2b2lkIFJlc2V0KCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVZEVF9OVU1fTElOS1M7IGkrKykgewotICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBBVkRUX05VTV9SVF9UQkw7IGorKykgewotICAgICAgICBydF90YmxbaV1bal0uUmVzZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVkRUX05VTV9UQ19UQkw7IGkrKykgewotICAgICAgdGNfdGJsW2ldLlJlc2V0KCk7Ci0gICAgfQotICAgIGxjaWRfdGJsLmNsZWFyKCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9va3VwIEF2ZHRwU2NiIGVudHJ5IGZvciBhIHRyYW5zcG9ydCBjaGFubmVsLgotICAgKgotICAgKiBAcGFyYW0gdGMgdGhlIHRyYW5zcG9ydCBjaGFubmVsCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQXZkdHBTY2IgZW50cnkgb3IgbnVsbCBvZiB0aGUgdHJhbnNwb3J0Ci0gICAqIGNoYW5uZWwgaXMgaW52YWxpZC4KLSAgICovCi0gIEF2ZHRwU2NiKiBMb29rdXBBdmR0cFNjYihjb25zdCBBdmR0cFRyYW5zcG9ydENoYW5uZWwmIHRjKTsKLQotICBBdmR0cFJvdXRpbmdFbnRyeSBydF90YmxbQVZEVF9OVU1fTElOS1NdW0FWRFRfTlVNX1JUX1RCTF07Ci0gIEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCB0Y190YmxbQVZEVF9OVU1fVENfVEJMXTsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QsIHVpbnQ4X3Q+IGxjaWRfdGJsOyAgLy8gTWFwIExDSUQgdG8gdGNfdGJsIGluZGV4Ci19OwotCi0vKioKLSAqIFR5cGVzIGZvciBhY3Rpb24gZnVuY3Rpb25zLgotICovCi10eXBlZGVmIHZvaWQgKCp0QVZEVF9DQ0JfQUNUSU9OKShBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci10eXBlZGVmIHZvaWQgKCp0QVZEVF9TQ0JfQUNUSU9OKShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci0KLS8qKgotICogQ29udHJvbCBibG9jayBmb3IgQVZEVFAuCi0gKi8KLWNsYXNzIEF2ZHRwQ2IgewotIHB1YmxpYzoKLSAgQXZkdHBDYigpCi0gICAgICA6IHBfY29uZl9jYmFjayhudWxscHRyKSwKLSAgICAgICAgcF9jY2JfYWN0KG51bGxwdHIpLAotICAgICAgICBwX3NjYl9hY3QobnVsbHB0ciksCi0gICAgICAgIHBfY29ubl9jYmFjayhudWxscHRyKSwKLSAgICAgICAgdHJhY2VfbGV2ZWxfKDApIHt9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICByY2IuUmVzZXQoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFWRFRfTlVNX0xJTktTOyBpKyspIHsKLSAgICAgIGNjYltpXS5SZXNldChpKTsKLSAgICB9Ci0gICAgYWQuUmVzZXQoKTsKLSAgICBwX2NvbmZfY2JhY2sgPSBudWxscHRyOwotICAgIHBfY2NiX2FjdCA9IG51bGxwdHI7Ci0gICAgcF9zY2JfYWN0ID0gbnVsbHB0cjsKLSAgICBwX2Nvbm5fY2JhY2sgPSBudWxscHRyOwotICAgIHRyYWNlX2xldmVsXyA9IDA7Ci0gIH0KLQotICBBdmR0cFJjYiByY2I7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RyYXRpb24gY29udHJvbCBibG9jawotICBBdmR0cENjYiBjY2JbQVZEVF9OVU1fTElOS1NdOyAgICAgICAvLyBDaGFubmVsIGNvbnRyb2wgYmxvY2tzCi0gIEF2ZHRwQWRhcHRhdGlvbkxheWVyIGFkOyAgICAgICAgICAgIC8vIEFkYXB0aW9uIGxheWVyIGNvbnRyb2wgYmxvY2sKLSAgdEFWRFRDX0NUUkxfQ0JBQ0sqIHBfY29uZl9jYmFjazsgICAgLy8gQ29uZm9ybWFuY2UgY2FsbGJhY2sgZnVuY3Rpb24KLSAgY29uc3QgdEFWRFRfQ0NCX0FDVElPTiogcF9jY2JfYWN0OyAgLy8gUG9pbnRlciB0byBDQ0IgYWN0aW9uIGZ1bmN0aW9ucwotICBjb25zdCB0QVZEVF9TQ0JfQUNUSU9OKiBwX3NjYl9hY3Q7ICAvLyBQb2ludGVyIHRvIFNDQiBhY3Rpb24gZnVuY3Rpb25zCi0gIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY29ubl9jYmFjazsgICAgIC8vIENvbm5lY3Rpb24gY2FsbGJhY2sgZnVuY3Rpb24KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgU0NCIGhhbmRsZSBmb3IgYSBnaXZlbiBBdmR0cFNjYiBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIHBfc2NiIHRoZSBlbnRyeSB0byB1c2UKLSAgICogQHJldHVybiB0aGUgY29tcHV0ZWQgU0NCIGhhbmRsZSBvciAwIGlmIHRoZSBlbnRyeSBpcyBpbnZhbGlkLgotICAgKi8KLSAgdWludDhfdCBDb21wdXRlU2NiSGFuZGxlKGNvbnN0IEF2ZHRwU2NiKiBwX3NjYikgY29uc3QgewotICAgIHVpbnQ4X3Qgc2NiX2hhbmRsZSA9IDA7Ci0KLSAgICAvLyBGaW5kIHRoZSBlbnRyeSBhbmQgaW4gdGhlIHByb2Nlc3MgY29tcHV0ZSB0aGUgdW5pcXVlIGluZGV4Ci0gICAgLy8gVE9ETzogVGhpcyBtZWNoYW5pc20gaXMgc3ViLWVmZmljaWVudCBhbmQgc2hvdWxkIGJlIHJlZmFjdG9yZWQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVkRUX05VTV9MSU5LUzsgaSsrKSB7Ci0gICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFWRFRfTlVNX1NFUFM7IGorKykgewotICAgICAgICBzY2JfaGFuZGxlKys7Ci0gICAgICAgIGlmICgmY2NiW2ldLnNjYltqXSA9PSBwX3NjYikgewotICAgICAgICAgIHJldHVybiBzY2JfaGFuZGxlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOyAgLy8gTm90IGZvdW5kCi0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHRyYWNlIGxldmVsIHVzZWQgZm9yIGxvZ2dpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKLSAgICovCi0gIHVpbnQ4X3QgVHJhY2VMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIHRyYWNlX2xldmVsXzsgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwgdXNlZCBmb3IgbG9nZ2luZy4KLSAgICoKLSAgICogQHBhcmFtIHRyYWNlX2xldmVsIHRoZSB0cmFjZSBsZXZlbCB0byBzZXQuIFNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgWzEsIDZdLgotICAgKi8KLSAgdm9pZCBTZXRUcmFjZUxldmVsKHVpbnQ4X3QgdHJhY2VfbGV2ZWwpIHsgdHJhY2VfbGV2ZWxfID0gdHJhY2VfbGV2ZWw7IH0KLQotIHByaXZhdGU6Ci0gIHVpbnQ4X3QgdHJhY2VfbGV2ZWxfOyAvKiB0cmFjZSBsZXZlbCAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDQ0IgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi1leHRlcm4gdm9pZCBhdmR0X2NjYl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfZXZlbnQoQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiBBdmR0cENjYiogYXZkdF9jY2JfYnlfYmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gQXZkdHBDY2IqIGF2ZHRfY2NiX2FsbG9jKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotZXh0ZXJuIEF2ZHRwQ2NiKiBhdmR0X2NjYl9hbGxvY19ieV9jaGFubmVsX2luZGV4KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2luZGV4KTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2RlYWxsb2MoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHVpbnQ4X3QgYXZkdF9jY2JfdG9faWR4KEF2ZHRwQ2NiKiBwX2NjYik7Ci1leHRlcm4gQXZkdHBDY2IqIGF2ZHRfY2NiX2J5X2lkeCh1aW50OF90IGlkeCk7Ci0KLS8qIENDQiBhY3Rpb24gZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBhdmR0X2NjYl9jaGFuX29wZW4oQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfY2hhbl9jbG9zZShBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9jaGtfY2xvc2UoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfaGRsX2Rpc2NvdmVyX2NtZChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9oZGxfZGlzY292ZXJfcnNwKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2hkbF9nZXRjYXBfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2hkbF9nZXRjYXBfcnNwKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2hkbF9zdGFydF9jbWQoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfaGRsX3N0YXJ0X3JzcChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9oZGxfc3VzcGVuZF9jbWQoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfaGRsX3N1c3BlbmRfcnNwKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX3NuZF9kaXNjb3Zlcl9jbWQoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2Jfc25kX2Rpc2NvdmVyX3JzcChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9zbmRfZ2V0Y2FwX2NtZChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9zbmRfZ2V0Y2FwX3JzcChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9zbmRfc3RhcnRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX3NuZF9zdGFydF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2Jfc25kX3N1c3BlbmRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX3NuZF9zdXNwZW5kX3JzcChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9jbGVhcl9jbWRzKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2NtZF9mYWlsKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2ZyZWVfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2Nvbmdfc3RhdGUoQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfcmV0X2NtZChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9zbmRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX3NuZF9tc2coQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2Jfc2V0X3JlY29ubihBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X2NjYl9jbHJfcmVjb25uKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2Noa19yZWNvbm4oQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfY2hrX3RpbWVyKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX3NldF9jb25uKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX3NldF9kaXNjb25uKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2RvX2Rpc2Nvbm4oQXZkdHBDY2IqIHBfY2NiLCB0QVZEVF9DQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfbGxfY2xvc2VkKEF2ZHRwQ2NiKiBwX2NjYiwgdEFWRFRfQ0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfY2NiX2xsX29wZW5lZChBdmR0cENjYiogcF9jY2IsIHRBVkRUX0NDQl9FVlQqIHBfZGF0YSk7Ci0KLS8qIFNDQiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1leHRlcm4gdm9pZCBhdmR0X3NjYl9ldmVudChBdmR0cFNjYiogcF9zY2IsIHVpbnQ4X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaW5pdCh2b2lkKTsKLWV4dGVybiBBdmR0cFNjYiogYXZkdF9zY2JfYWxsb2ModWludDhfdCBwZWVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmR0cFN0cmVhbUNvbmZpZyYgYXZkdHBfc3RyZWFtX2NvbmZpZyk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9kZWFsbG9jKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB1aW50OF90IGF2ZHRfc2NiX3RvX2hkbChBdmR0cFNjYiogcF9zY2IpOwotZXh0ZXJuIEF2ZHRwU2NiKiBhdmR0X3NjYl9ieV9oZGwodWludDhfdCBoZGwpOwotZXh0ZXJuIHVpbnQ4X3QgYXZkdF9zY2JfdmVyaWZ5KEF2ZHRwQ2NiKiBwX2NjYiwgdWludDhfdCBzdGF0ZSwgdWludDhfdCogcF9zZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9zZWlkLCB1aW50OF90KiBwX2Vycl9jb2RlKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3BlZXJfc2VpZF9saXN0KHRBVkRUX01VTFRJKiBwX211bHRpKTsKLWV4dGVybiB1aW50MzJfdCBhdmR0X3NjYl9nZW5fc3NyYyhBdmR0cFNjYiogcF9zY2IpOwotCi0vKiBTQ0IgYWN0aW9uIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX2Fib3J0X2NtZChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfYWJvcnRfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF9jbG9zZV9jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX2Nsb3NlX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfZ2V0Y29uZmlnX2NtZChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfZ2V0Y29uZmlnX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfb3Blbl9jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX29wZW5fcmVqKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF9vcGVuX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfcGt0KEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2Ryb3BfcGt0KEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF9yZWNvbmZpZ19jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3JlY29uZmlnX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfc2VjdXJpdHlfY21kKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF9zZWN1cml0eV9yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3NldGNvbmZpZ19jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3NldGNvbmZpZ19yZWooQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3NldGNvbmZpZ19yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3N0YXJ0X2NtZChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfc3RhcnRfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF9zdXNwZW5kX2NtZChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9oZGxfc3VzcGVuZF9yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2Jfc25kX2RlbGF5X3JwdF9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX2RlbGF5X3JwdF9jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX2RlbGF5X3JwdF9yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3RjX2Nsb3NlKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF90Y19vcGVuKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF90Y19jbG9zZV9zdG8oQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfaGRsX3RjX29wZW5fc3RvKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2hkbF93cml0ZV9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2Jfc25kX2Fib3J0X3JlcShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfYWJvcnRfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3NuZF9jbG9zZV9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2Jfc25kX3N0cmVhbV9jbG9zZShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfY2xvc2VfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3NuZF9nZXRjb25maWdfcmVxKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3NuZF9nZXRjb25maWdfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3NuZF9vcGVuX3JlcShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfb3Blbl9yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2Jfc25kX3JlY29uZmlnX3JlcShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfcmVjb25maWdfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3NuZF9zZWN1cml0eV9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2Jfc25kX3NlY3VyaXR5X3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JlcShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JlaihBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9zbmRfc25rX2RlbGF5X3JwdF9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2Jfc25kX3RjX2Nsb3NlKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX2NiX2VycihBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9jb25nX3N0YXRlKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3Jlal9zdGF0ZShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl9yZWpfaW5fdXNlKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3Jlal9ub3RfaW5fdXNlKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGF2ZHRfc2NiX3NldF9yZW1vdmUoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfZnJlZV9wa3QoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfY2hrX3NuZF9wa3QoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfY2xyX3BrdChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBhdmR0X3NjYl90cmFuc3BvcnRfY2hhbm5lbF90aW1lcihBdmR0cFNjYiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfY2xyX3ZhcnMoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpOwotCi0vKiBtc2cgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi1leHRlcm4gYm9vbCBhdmR0X21zZ19zZW5kKEF2ZHRwQ2NiKiBwX2NjYiwgQlRfSERSKiBwX21zZyk7Ci1leHRlcm4gdm9pZCBhdmR0X21zZ19zZW5kX2NtZChBdmR0cENjYiogcF9jY2IsIHZvaWQqIHBfc2NiLCB1aW50OF90IHNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX01TRyogcF9wYXJhbXMpOwotZXh0ZXJuIHZvaWQgYXZkdF9tc2dfc2VuZF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IHNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX01TRyogcF9wYXJhbXMpOwotZXh0ZXJuIHZvaWQgYXZkdF9tc2dfc2VuZF9yZWooQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IHNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX01TRyogcF9wYXJhbXMpOwotZXh0ZXJuIHZvaWQgYXZkdF9tc2dfc2VuZF9ncmVqKEF2ZHRwQ2NiKiBwX2NjYiwgdWludDhfdCBzaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfTVNHKiBwX3BhcmFtcyk7Ci1leHRlcm4gdm9pZCBhdmR0X21zZ19pbmQoQXZkdHBDY2IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmKTsKLQotLyogYWRhcHRpb24gbGF5ZXIgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi1leHRlcm4gdm9pZCBhdmR0X2FkX2luaXQodm9pZCk7Ci1leHRlcm4gdWludDhfdCBhdmR0X2FkX3R5cGVfdG9fdGNpZCh1aW50OF90IHR5cGUsIEF2ZHRwU2NiKiBwX3NjYik7Ci1leHRlcm4gQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBhdmR0X2FkX3RjX3RibF9ieV9zdCh1aW50OF90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cENjYiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXRlKTsKLWV4dGVybiBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIGF2ZHRfYWRfdGNfdGJsX2J5X2xjaWQodWludDE2X3QgbGNpZCk7Ci1leHRlcm4gQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBhdmR0X2FkX3RjX3RibF9hbGxvYyhBdmR0cENjYiogcF9jY2IpOwotZXh0ZXJuIHVpbnQ4X3QgYXZkdF9hZF90Y190YmxfdG9faWR4KEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwpOwotZXh0ZXJuIHZvaWQgYXZkdF9hZF90Y19jbG9zZV9pbmQoQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBwX3RibCk7Ci1leHRlcm4gdm9pZCBhdmR0X2FkX3RjX29wZW5faW5kKEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwpOwotZXh0ZXJuIHZvaWQgYXZkdF9hZF90Y19jb25nX2luZChBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Nvbmdlc3RlZCk7Ci1leHRlcm4gdm9pZCBhdmR0X2FkX3RjX2RhdGFfaW5kKEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90YmwsIEJUX0hEUiogcF9idWYpOwotZXh0ZXJuIEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogYXZkdF9hZF90Y190YmxfYnlfdHlwZSh1aW50OF90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZHRwQ2NiKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkdHBTY2IqIHBfc2NiKTsKLWV4dGVybiB1aW50OF90IGF2ZHRfYWRfd3JpdGVfcmVxKHVpbnQ4X3QgdHlwZSwgQXZkdHBDY2IqIHBfY2NiLCBBdmR0cFNjYiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKTsKLWV4dGVybiB2b2lkIGF2ZHRfYWRfb3Blbl9yZXEodWludDhfdCB0eXBlLCBBdmR0cENjYiogcF9jY2IsIEF2ZHRwU2NiKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByb2xlKTsKLWV4dGVybiB2b2lkIGF2ZHRfYWRfY2xvc2VfcmVxKHVpbnQ4X3QgdHlwZSwgQXZkdHBDY2IqIHBfY2NiLCBBdmR0cFNjYiogcF9zY2IpOwotCi1leHRlcm4gdm9pZCBhdmR0X2NjYl9pZGxlX2NjYl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfcmV0X2NjYl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9jY2JfcnNwX2NjYl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotZXh0ZXJuIHZvaWQgYXZkdF9zY2JfdHJhbnNwb3J0X2NoYW5uZWxfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBtYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiB3ZSBzdG9yZSB0aGUgc2NiIGFuZCB0aGUgbGFiZWwgaW4gdGhlIGxheWVyX3NwZWNpZmljIGZpZWxkIG9mIHRoZQotICogY3VycmVudCBjbWQKLSovCi0jZGVmaW5lIEFWRFRfQkxEX0xBWUVSU1BFQyhscywgbXNnLCBsYWJlbCkgbHMgPSAoKChsYWJlbCkgPDwgNCkgfCAobXNnKSkKLQotI2RlZmluZSBBVkRUX0xBWUVSU1BFQ19MQUJFTChscykgKCh1aW50OF90KSgobHMpID4+IDQpKQotCi0jZGVmaW5lIEFWRFRfTEFZRVJTUEVDX01TRyhscykgKCh1aW50OF90KSgobHMpJjB4MDAwRikpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZ2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYWluIENvbnRyb2wgQmxvY2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gQXZkdHBDYiBhdmR0cF9jYjsKLQotLyogTDJDQVAgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHN0cnVjdHVyZSAqLwotZXh0ZXJuIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8gYXZkdF9sMmNfYXBwbDsKLQotLyogcmVqZWN0IG1lc3NhZ2UgZXZlbnQgbG9va3VwIHRhYmxlICovCi1leHRlcm4gY29uc3QgdWludDhfdCBhdmR0X21zZ19yZWpfMl9ldnRbXTsKLQotdm9pZCBhdmR0X2wyY19kaXNjb25uZWN0KHVpbnQxNl90IGxjaWQpOwotCi1jb25zdGV4cHIgdWludDE2X3Qga0F2ZHRwTXR1ID0gMTAyNDsKLQotI2VuZGlmIC8qIEFWRFRfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2F2ZHQvYXZkdF9sMmMuY2MgYi9zdGFjay9hdmR0L2F2ZHRfbDJjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA3Y2MxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2ZHQvYXZkdF9sMmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIEFWRFRQIGFkYXB0aW9uIGxheWVyIG1vZHVsZSBpbnRlcmZhY2VzIHRvIEwyQ0FQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImF2ZHRfaW50LmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2F2X2FwaS5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgImwyY2RlZnMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyogY2FsbGJhY2sgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi12b2lkIGF2ZHRfbDJjX2Nvbm5lY3RfaW5kX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBzbSwgdWludDhfdCBpZCk7Ci12b2lkIGF2ZHRfbDJjX2Nvbm5lY3RfY2ZtX2NiYWNrKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci12b2lkIGF2ZHRfbDJjX2NvbmZpZ19jZm1fY2JhY2sodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotdm9pZCBhdmR0X2wyY19jb25maWdfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotdm9pZCBhdmR0X2wyY19kaXNjb25uZWN0X2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBib29sIGFja19uZWVkZWQpOwotdm9pZCBhdmR0X2wyY19jb25nZXN0aW9uX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBib29sIGlzX2Nvbmdlc3RlZCk7Ci12b2lkIGF2ZHRfbDJjX2RhdGFfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIEJUX0hEUiogcF9idWYpOwotc3RhdGljIHZvaWQgYXZkdF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpOwotCi0vKiBMMkNBUCBjYWxsYmFjayBmdW5jdGlvbiBzdHJ1Y3R1cmUgKi8KLWNvbnN0IHRMMkNBUF9BUFBMX0lORk8gYXZkdF9sMmNfYXBwbCA9IHthdmR0X2wyY19jb25uZWN0X2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2wyY19jb25uZWN0X2NmbV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2wyY19jb25maWdfaW5kX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfbDJjX2NvbmZpZ19jZm1fY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9sMmNfZGlzY29ubmVjdF9pbmRfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2wyY19kYXRhX2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2wyY19jb25nZXN0aW9uX2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfb25fbDJjYXBfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zZWNfY2hlY2tfY29tcGxldGVfdGVybQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIFNlY3VyaXR5IE1hbmFnZXIgZmluaXNoZXMKLSAqICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uIG9mIHRoZSBzZXJ2aWNlIHNpZGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X3NlY19jaGVja19jb21wbGV0ZV90ZXJtKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYiA9IE5VTEw7Ci0gIEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90Ymw7Ci0KLSAgcF9jY2IgPSBhdmR0X2NjYl9ieV9iZCgqYmRfYWRkcik7Ci0KLSAgcF90YmwgPSBhdmR0X2FkX3RjX3RibF9ieV9zdChBVkRUX0NIQU5fU0lHLCBwX2NjYiwgQVZEVF9BRF9TVF9TRUNfQUNQKTsKLSAgaWYgKHBfdGJsID09IE5VTEwpIHJldHVybjsKLQotICAvKiBzdG9yZSBpZHggaW4gTENJRCB0YWJsZSwgc3RvcmUgTENJRCBpbiByb3V0aW5nIHRhYmxlICovCi0gIGF2ZHRwX2NiLmFkLmxjaWRfdGJsW3BfdGJsLT5sY2lkXSA9IGF2ZHRfYWRfdGNfdGJsX3RvX2lkeChwX3RibCk7Ci0gIGF2ZHRwX2NiLmFkLnJ0X3RibFthdmR0X2NjYl90b19pZHgocF9jY2IpXVtwX3RibC0+dGNpZF0ubGNpZCA9IHBfdGJsLT5sY2lkOwotCi0gIC8qIHRyYW5zaXRpb24gdG8gY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotICBwX3RibC0+c3RhdGUgPSBBVkRUX0FEX1NUX0NGRzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2VjX2NoZWNrX2NvbXBsZXRlX29yaWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBjYWxsZWQgd2hlbiBTZWN1cml0eSBNYW5hZ2VyIGZpbmlzaGVzCi0gKiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2VydmljZSBzaWRlIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZkdF9zZWNfY2hlY2tfY29tcGxldGVfb3JpZyhjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYXNucG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXMpIHsKLSAgQXZkdHBDY2IqIHBfY2NiID0gTlVMTDsKLSAgQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBwX3RibDsKLQotICBBVkRUX1RSQUNFX0RFQlVHKCJhdmR0X3NlY19jaGVja19jb21wbGV0ZV9vcmlnIHJlczogJWQiLCByZXMpOwotICBpZiAoYmRfYWRkcikgcF9jY2IgPSBhdmR0X2NjYl9ieV9iZCgqYmRfYWRkcik7Ci0gIHBfdGJsID0gYXZkdF9hZF90Y190YmxfYnlfc3QoQVZEVF9DSEFOX1NJRywgcF9jY2IsIEFWRFRfQURfU1RfU0VDX0lOVCk7Ci0gIGlmIChwX3RibCA9PSBOVUxMKSByZXR1cm47Ci0KLSAgaWYgKHJlcyA9PSBCVE1fU1VDQ0VTUykgewotICAgIC8qIHNldCBjaGFubmVsIHN0YXRlICovCi0gICAgcF90YmwtPnN0YXRlID0gQVZEVF9BRF9TVF9DRkc7Ci0gIH0gZWxzZSB7Ci0gICAgYXZkdF9sMmNfZGlzY29ubmVjdChwX3RibC0+bGNpZCk7Ci0gICAgYXZkdF9hZF90Y19jbG9zZV9pbmQocF90YmwpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9sMmNfY29ubmVjdF9pbmRfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIEwyQ0FQIGNvbm5lY3QgaW5kaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9sMmNfY29ubmVjdF9pbmRfY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgcHNtLCB1aW50OF90IGlkKSB7Ci0gIEF2ZHRwQ2NiKiBwX2NjYjsKLSAgQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBwX3RibCA9IE5VTEw7Ci0gIHVpbnQxNl90IHJlc3VsdDsKLQotICAvKiBkbyB3ZSBhbHJlYWR5IGhhdmUgYSBjb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgcGVlcj8gKi8KLSAgcF9jY2IgPSBhdmR0X2NjYl9ieV9iZChiZF9hZGRyKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICAvKiBubywgYWxsb2NhdGUgY2NiICovCi0gICAgaW50IGNoYW5uZWxfaW5kZXggPSBCVEFfQXZPYnRhaW5QZWVyQ2hhbm5lbEluZGV4KGJkX2FkZHIpOwotICAgIGlmIChjaGFubmVsX2luZGV4ID49IDApIHsKLSAgICAgIHBfY2NiID0gYXZkdF9jY2JfYWxsb2NfYnlfY2hhbm5lbF9pbmRleChiZF9hZGRyLCBjaGFubmVsX2luZGV4KTsKLSAgICB9Ci0gICAgaWYgKHBfY2NiID09IG51bGxwdHIpIHsKLSAgICAgIHBfY2NiID0gYXZkdF9jY2JfYWxsb2MoYmRfYWRkcik7Ci0gICAgfQotICAgIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgICAvKiBubyBjY2IgYXZhaWxhYmxlLCByZWplY3QgTDJDQVAgY29ubmVjdGlvbiAqLwotICAgICAgcmVzdWx0ID0gTDJDQVBfQ09OTl9OT19SRVNPVVJDRVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGFsbG9jYXRlIGFuZCBzZXQgdXAgZW50cnk7IGZpcnN0IGNoYW5uZWwgaXMgYWx3YXlzIHNpZ25hbGluZyAqLwotICAgICAgcF90YmwgPSBhdmR0X2FkX3RjX3RibF9hbGxvYyhwX2NjYik7Ci0gICAgICBwX3RibC0+bXlfbXR1ID0ga0F2ZHRwTXR1OwotICAgICAgcF90YmwtPnRjaWQgPSBBVkRUX0NIQU5fU0lHOwotICAgICAgcF90YmwtPmxjaWQgPSBsY2lkOwotICAgICAgcF90YmwtPnN0YXRlID0gQVZEVF9BRF9TVF9TRUNfQUNQOwotICAgICAgcF90YmwtPmNmZ19mbGFncyA9IEFWRFRfTDJDX0NGR19DT05OX0FDUDsKLQotICAgICAgaWYgKGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QXzJNQlBTX0xJTktfT05MWSwgJmJkX2FkZHIpKSB7Ci0gICAgICAgIC8vIERpc2FibGUgM0RIIHBhY2tldHMgZm9yIEFWRFQgQUNMIHRvIGltcHJvdmUgc2Vuc2l0aXZpdHkgb24gSFMKLSAgICAgICAgYnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzKAotICAgICAgICAgICAgYmRfYWRkciwKLSAgICAgICAgICAgIChhY2xfZ2V0X3N1cHBvcnRlZF9wYWNrZXRfdHlwZXMoKSB8IEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RIMSB8Ci0gICAgICAgICAgICAgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREgzIHwgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREg1KSk7Ci0gICAgICB9Ci0gICAgICAvKiBBc3N1bWUgc2VjdXJpdHkgY2hlY2sgaXMgY29tcGxldGUgKi8KLSAgICAgIGF2ZHRfc2VjX2NoZWNrX2NvbXBsZXRlX3Rlcm0oJnBfY2NiLT5wZWVyX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBkZWFsIHdpdGggc2ltdWx0YW5lb3VzIGNvbnRyb2wgY2hhbm5lbCBjb25uZWN0IGNhc2UgKi8KLSAgICBwX3RibCA9IGF2ZHRfYWRfdGNfdGJsX2J5X3N0KEFWRFRfQ0hBTl9TSUcsIHBfY2NiLCBBVkRUX0FEX1NUX0NPTk4pOwotICAgIGlmIChwX3RibCAhPSBOVUxMKSB7Ci0gICAgICAvKiByZWplY3QgdGhlaXIgY29ubmVjdGlvbiAqLwotICAgICAgcmVzdWx0ID0gTDJDQVBfQ09OTl9OT19SRVNPVVJDRVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIHRyYWZmaWMgY2hhbm5lbDsgYXJlIHdlIGFjY2VwdGluZyBhIHRyYWZmaWMgY2hhbm5lbAotICAgICAgICogZm9yIHRoaXMgY2NiPwotICAgICAgICovCi0gICAgICBwX3RibCA9IGF2ZHRfYWRfdGNfdGJsX2J5X3N0KEFWRFRfQ0hBTl9NRURJQSwgcF9jY2IsIEFWRFRfQURfU1RfQUNQKTsKLSAgICAgIGlmIChwX3RibCAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIHllczsgcHJvY2VlZCB3aXRoIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgcmVzdWx0ID0gTDJDQVBfQ09OTl9PSzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHRoaXMgbXVzdCBiZSBhIHJlcG9ydGluZyBjaGFubmVsOyBhcmUgd2UgYWNjZXB0aW5nIGEgcmVwb3J0aW5nCi0gICAgICAgICAqIGNoYW5uZWwgZm9yIHRoaXMgY2NiPwotICAgICAgICAgKi8KLSAgICAgICAgcF90YmwgPSBhdmR0X2FkX3RjX3RibF9ieV9zdChBVkRUX0NIQU5fUkVQT1JULCBwX2NjYiwgQVZEVF9BRF9TVF9BQ1ApOwotICAgICAgICBpZiAocF90YmwgIT0gTlVMTCkgewotICAgICAgICAgIC8qIHllczsgcHJvY2VlZCB3aXRoIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICByZXN1bHQgPSBMMkNBUF9DT05OX09LOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIGVsc2Ugd2UncmUgbm90IGxpc3RlbmluZyBmb3IgdHJhZmZpYyBjaGFubmVsOyByZWplY3QgKi8KLSAgICAgICAgICByZXN1bHQgPSBMMkNBUF9DT05OX05PX1BTTTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIElmIHdlIHJlamVjdCB0aGUgY29ubmVjdGlvbiwgc2VuZCBEaXNjb25uZWN0UmVxICovCi0gIGlmIChyZXN1bHQgIT0gTDJDQVBfQ09OTl9PSykgewotICAgIEwyQ0FfRGlzY29ubmVjdFJlcShsY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBpZiByZXN1bHQgb2ssIHByb2NlZWQgd2l0aCBjb25uZWN0aW9uICovCi0gIC8qIHN0b3JlIGlkeCBpbiBMQ0lEIHRhYmxlLCBzdG9yZSBMQ0lEIGluIHJvdXRpbmcgdGFibGUgKi8KLSAgYXZkdHBfY2IuYWQubGNpZF90YmxbbGNpZF0gPSBhdmR0X2FkX3RjX3RibF90b19pZHgocF90YmwpOwotICBhdmR0cF9jYi5hZC5ydF90YmxbYXZkdF9jY2JfdG9faWR4KHBfY2NiKV1bcF90YmwtPnRjaWRdLmxjaWQgPSBsY2lkOwotCi0gIC8qIHRyYW5zaXRpb24gdG8gY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotICBwX3RibC0+c3RhdGUgPSBBVkRUX0FEX1NUX0NGRzsKLX0KLQotc3RhdGljIHZvaWQgYXZkdF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgYXZkdF9sMmNfZGlzY29ubmVjdChsY2lkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbDJjX2Nvbm5lY3RfY2ZtX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25uZWN0IGNvbmZpcm0gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfbDJjX2Nvbm5lY3RfY2ZtX2NiYWNrKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotICBBdmR0cENjYiogcF9jY2I7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiYXZkdF9sMmNfY29ubmVjdF9jZm1fY2JhY2sgbGNpZDogJWQsIHJlc3VsdDogJWQiLCBsY2lkLAotICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gIC8qIGxvb2sgdXAgaW5mbyBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfdGJsID0gYXZkdF9hZF90Y190YmxfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfdGJsICE9IE5VTEwpIHsKLSAgICAvKiBpZiBpbiBjb3JyZWN0IHN0YXRlICovCi0gICAgaWYgKHBfdGJsLT5zdGF0ZSA9PSBBVkRUX0FEX1NUX0NPTk4pIHsKLSAgICAgIC8qIGlmIHJlc3VsdCBzdWNjZXNzZnVsICovCi0gICAgICBpZiAocmVzdWx0ID09IEwyQ0FQX0NPTk5fT0spIHsKLSAgICAgICAgaWYgKHBfdGJsLT50Y2lkICE9IEFWRFRfQ0hBTl9TSUcpIHsKLSAgICAgICAgICAvKiBzZXQgY2hhbm5lbCBzdGF0ZSAqLwotICAgICAgICAgIHBfdGJsLT5zdGF0ZSA9IEFWRFRfQURfU1RfQ0ZHOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfY2NiID0gYXZkdF9jY2JfYnlfaWR4KHBfdGJsLT5jY2JfaWR4KTsKLSAgICAgICAgICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgICAgICAgICAgcmVzdWx0ID0gTDJDQVBfQ09OTl9OT19SRVNPVVJDRVM7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIHNldCBjaGFubmVsIHN0YXRlICovCi0gICAgICAgICAgICBwX3RibC0+c3RhdGUgPSBBVkRUX0FEX1NUX1NFQ19JTlQ7Ci0gICAgICAgICAgICBwX3RibC0+bGNpZCA9IGxjaWQ7Ci0gICAgICAgICAgICBwX3RibC0+Y2ZnX2ZsYWdzID0gQVZEVF9MMkNfQ0ZHX0NPTk5fSU5UOwotCi0gICAgICAgICAgICBpZiAoaW50ZXJvcF9tYXRjaF9hZGRyKElOVEVST1BfMk1CUFNfTElOS19PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyopJnBfY2NiLT5wZWVyX2FkZHIpKSB7Ci0gICAgICAgICAgICAgIC8vIERpc2FibGUgM0RIIHBhY2tldHMgZm9yIEFWRFQgQUNMIHRvIGltcHJvdmUgc2Vuc2l0aXZpdHkgb24gSFMKLSAgICAgICAgICAgICAgYnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzKAotICAgICAgICAgICAgICAgICAgcF9jY2ItPnBlZXJfYWRkciwKLSAgICAgICAgICAgICAgICAgIChhY2xfZ2V0X3N1cHBvcnRlZF9wYWNrZXRfdHlwZXMoKSB8Ci0gICAgICAgICAgICAgICAgICAgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREgxIHwgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREgzIHwKLSAgICAgICAgICAgICAgICAgICBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQXNzdW1lIHNlY3VyaXR5IGNoZWNrIGlzIGNvbXBsZXRlICovCi0gICAgICAgICAgICBhdmR0X3NlY19jaGVja19jb21wbGV0ZV9vcmlnKCZwX2NjYi0+cGVlcl9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBCVE1fU1VDQ0VTUyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGZhaWx1cmU7IG5vdGlmeSBhZGFwdGlvbiB0aGF0IGNoYW5uZWwgY2xvc2VkICovCi0gICAgICBpZiAocmVzdWx0ICE9IEwyQ0FQX0NPTk5fT0spIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBpbnZva2VkIHdpdGggbm9uIE9LIHN0YXR1cyI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X2wyY19jb25maWdfY2ZtX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25maWcgY29uZmlybSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9sMmNfY29uZmlnX2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBhdmR0X2wyY19jb25maWdfaW5kX2NiYWNrKGxjaWQsIHBfY2ZnKTsKLQotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBsY2lkOiAlZCIsIF9fZnVuY19fLCBsY2lkKTsKLQotICAvKiBsb29rIHVwIGluZm8gZm9yIHRoaXMgY2hhbm5lbCAqLwotICBwX3RibCA9IGF2ZHRfYWRfdGNfdGJsX2J5X2xjaWQobGNpZCk7Ci0gIGlmIChwX3RibCAhPSBOVUxMKSB7Ci0gICAgcF90YmwtPmxjaWQgPSBsY2lkOwotCi0gICAgLyogaWYgaW4gY29ycmVjdCBzdGF0ZSAqLwotICAgIGlmIChwX3RibC0+c3RhdGUgPT0gQVZEVF9BRF9TVF9DRkcpIHsKLSAgICAgIGF2ZHRfYWRfdGNfb3Blbl9pbmQocF90YmwpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9sMmNfY29uZmlnX2luZF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgTDJDQVAgY29uZmlnIGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfbDJjX2NvbmZpZ19pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBsY2lkOiAlZCIsIF9fZnVuY19fLCBsY2lkKTsKLQotICAvKiBsb29rIHVwIGluZm8gZm9yIHRoaXMgY2hhbm5lbCAqLwotICBwX3RibCA9IGF2ZHRfYWRfdGNfdGJsX2J5X2xjaWQobGNpZCk7Ci0gIGlmIChwX3RibCAhPSBOVUxMKSB7Ci0gICAgLyogc3RvcmUgdGhlIG10dSBpbiB0YmwgKi8KLSAgICBpZiAocF9jZmctPm10dV9wcmVzZW50KSB7Ci0gICAgICBwX3RibC0+cGVlcl9tdHUgPSBwX2NmZy0+bXR1OwotICAgIH0gZWxzZSB7Ci0gICAgICBwX3RibC0+cGVlcl9tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKLSAgICB9Ci0gICAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IHBlZXJfbXR1OiAlZCwgbGNpZDogJWQiLCBfX2Z1bmNfXywgcF90YmwtPnBlZXJfbXR1LAotICAgICAgICAgICAgICAgICAgICAgbGNpZCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBkaXNjb25uZWN0IGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoImF2ZHRfbDJjX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrIGxjaWQ6ICVkLCBhY2tfbmVlZGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgbGNpZCwgYWNrX25lZWRlZCk7Ci0gIC8qIGxvb2sgdXAgaW5mbyBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfdGJsID0gYXZkdF9hZF90Y190YmxfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfdGJsICE9IE5VTEwpIHsKLSAgICBhdmR0X2FkX3RjX2Nsb3NlX2luZChwX3RibCk7Ci0gIH0KLX0KLQotdm9pZCBhdmR0X2wyY19kaXNjb25uZWN0KHVpbnQxNl90IGxjaWQpIHsKLSAgTDJDQV9EaXNjb25uZWN0UmVxKGxjaWQpOwotICBBdmR0cFRyYW5zcG9ydENoYW5uZWwqIHBfdGJsOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoImF2ZHRfbDJjX2Rpc2Nvbm5lY3RfY2ZtX2NiYWNrIGxjaWQ6ICVkIiwgbGNpZCk7Ci0gIC8qIGxvb2sgdXAgaW5mbyBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfdGJsID0gYXZkdF9hZF90Y190YmxfYnlfbGNpZChsY2lkKTsKLSAgaWYgKHBfdGJsICE9IE5VTEwpIHsKLSAgICBhdmR0X2FkX3RjX2Nsb3NlX2luZChwX3RibCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbDJjX2Nvbmdlc3Rpb25faW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBjb25nZXN0aW9uIGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfbDJjX2Nvbmdlc3Rpb25faW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIGJvb2wgaXNfY29uZ2VzdGVkKSB7Ci0gIEF2ZHRwVHJhbnNwb3J0Q2hhbm5lbCogcF90Ymw7Ci0KLSAgLyogbG9vayB1cCBpbmZvIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgcF90YmwgPSBhdmR0X2FkX3RjX3RibF9ieV9sY2lkKGxjaWQpOwotICBpZiAocF90YmwgIT0gTlVMTCkgewotICAgIGF2ZHRfYWRfdGNfY29uZ19pbmQocF90YmwsIGlzX2Nvbmdlc3RlZCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbDJjX2RhdGFfaW5kX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBMMkNBUCBkYXRhIGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfbDJjX2RhdGFfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIEJUX0hEUiogcF9idWYpIHsKLSAgQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBwX3RibDsKLQotICAvKiBsb29rIHVwIGluZm8gZm9yIHRoaXMgY2hhbm5lbCAqLwotICBwX3RibCA9IGF2ZHRfYWRfdGNfdGJsX2J5X2xjaWQobGNpZCk7Ci0gIGlmIChwX3RibCAhPSBOVUxMKSB7Ci0gICAgYXZkdF9hZF90Y19kYXRhX2luZChwX3RibCwgcF9idWYpOwotICB9IGVsc2UgLyogcHJldmVudCBidWZmZXIgbGVhayAqLwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2ZHQvYXZkdF9tc2cuY2MgYi9zdGFjay9hdmR0L2F2ZHRfbXNnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U3MWM4Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2ZHQvYXZkdF9tc2cuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwYXJzaW5nIGFuZCBidWlsZGluZyBBVkRUUCBzaWduYWxpbmcKLSAqICBtZXNzYWdlcy4gIEl0IGFsc28gY29udGFpbnMgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgU0NCIG9yIENDQiBzdGF0ZQotICogIG1hY2hpbmVzIGZvciBzZW5kaW5nIGNvbW1hbmQsIHJlc3BvbnNlLCBhbmQgcmVqZWN0IG1lc3NhZ2VzLiAgSXQgYWxzbwotICogIGNvbnRhaW5zIGEgZnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgaW5jb21pbmcgbWVzc2FnZXMgYW5kIGRpc3BhdGNoZXMgdGhlbQotICogIHRvIHRoZSBhcHByb3ByaWF0ZSBTQ0Igb3IgQ0NCLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgImF2ZHRfaW50LmgiCi0jaW5jbHVkZSAiYXZkdGNfYXBpLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBjb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBtYXNrIG9mIGFsbCBwc2MgdmFsdWVzICovCi0jZGVmaW5lIEFWRFRfTVNHX1BTQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQVZEVF9QU0NfVFJBTlMgfCBBVkRUX1BTQ19SRVBPUlQgfCBBVkRUX1BTQ19ERUxBWV9SUFQgfCBBVkRUX1BTQ19SRUNPViB8IFwKLSAgIEFWRFRfUFNDX0hEUkNNUCB8IEFWRFRfUFNDX01VWCkKLSNkZWZpbmUgQVZEVF9QU0NfUFJPVEVDVCAoMSA8PCA0KSAvKiBDb250ZW50IFByb3RlY3Rpb24gKi8KLSNkZWZpbmUgQVZEVF9QU0NfQ09ERUMgKDEgPDwgNykgICAvKiBjb2RlYyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiB0eXBlIGZvciBtZXNzYWdlIGJ1aWxkaW5nIGZ1bmN0aW9ucyAqLwotdHlwZWRlZiB2b2lkICgqdEFWRFRfTVNHX0JMRCkodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpOwotCi0vKiB0eXBlIGZvciBtZXNzYWdlIHBhcnNpbmcgZnVuY3Rpb25zICovCi10eXBlZGVmIHVpbnQ4X3QgKCp0QVZEVF9NU0dfUFJTKSh0QVZEVF9NU0cqIHBfbXNnLCB1aW50OF90KiBwLCB1aW50MTZfdCBsZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9ub25lKHVpbnQ4X3QqKiBwLCB0QVZEVF9NU0cqIHBfbXNnKTsKLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9zaW5nbGUodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpOwotc3RhdGljIHZvaWQgYXZkdF9tc2dfYmxkX3NldGNvbmZpZ19jbWQodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpOwotc3RhdGljIHZvaWQgYXZkdF9tc2dfYmxkX3JlY29uZmlnX2NtZCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfbXVsdGkodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpOwotc3RhdGljIHZvaWQgYXZkdF9tc2dfYmxkX3NlY3VyaXR5X2NtZCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfZGlzY292ZXJfcnNwKHVpbnQ4X3QqKiBwLCB0QVZEVF9NU0cqIHBfbXNnKTsKLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9zdmNjYXAodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpOwotc3RhdGljIHZvaWQgYXZkdF9tc2dfYmxkX3NlY3VyaXR5X3JzcCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfYWxsX3N2Y2NhcCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfZGVsYXlfcnB0KHVpbnQ4X3QqKiBwLCB0QVZEVF9NU0cqIHBfbXNnKTsKLQotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX25vbmUodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwgdWludDE2X3QgbGVuKTsKLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19zaW5nbGUodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwgdWludDE2X3QgbGVuKTsKLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19zZXRjb25maWdfY21kKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pOwotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX3JlY29uZmlnX2NtZCh0QVZEVF9NU0cqIHBfbXNnLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pOwotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX211bHRpKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbik7Ci1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfc2VjdXJpdHlfY21kKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbik7Ci1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfZGlzY292ZXJfcnNwKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbik7Ci1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfc3ZjY2FwKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbik7Ci1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfYWxsX3N2Y2NhcCh0QVZEVF9NU0cqIHBfbXNnLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKTsKLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19zZWN1cml0eV9yc3AodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKTsKLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19kZWxheV9ycHQodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBjb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiB0YWJsZSBvZiBpbmZvcm1hdGlvbiBlbGVtZW50IG1pbmltdW0gbGVuZ3RocyB1c2VkIGZvciBwYXJzaW5nICovCi1jb25zdCB1aW50OF90IGF2ZHRfbXNnX2llX2xlbl9taW5bXSA9IHsKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgIEFWRFRfTEVOX1RSQU5TX01JTiwgICAgLyogbWVkaWEgdHJhbnNwb3J0ICovCi0gICAgQVZEVF9MRU5fUkVQT1JUX01JTiwgICAvKiByZXBvcnRpbmcgKi8KLSAgICBBVkRUX0xFTl9SRUNPVl9NSU4sICAgIC8qIHJlY292ZXJ5ICovCi0gICAgQVZEVF9MRU5fUFJPVEVDVF9NSU4sICAvKiBjb250ZW50IHByb3RlY3Rpb24gKi8KLSAgICBBVkRUX0xFTl9IRFJDTVBfTUlOLCAgIC8qIGhlYWRlciBjb21wcmVzc2lvbiAqLwotICAgIEFWRFRfTEVOX01VWF9NSU4sICAgICAgLyogbXVsdGlwbGV4aW5nICovCi0gICAgQVZEVF9MRU5fQ09ERUNfTUlOLCAgICAvKiBjb2RlYyAqLwotICAgIEFWRFRfTEVOX0RFTEFZX1JQVF9NSU4gLyogZGVsYXkgcmVwb3J0ICovCi19OwotCi0vKiB0YWJsZSBvZiBpbmZvcm1hdGlvbiBlbGVtZW50IG1pbmltdW0gbGVuZ3RocyB1c2VkIGZvciBwYXJzaW5nICovCi1jb25zdCB1aW50OF90IGF2ZHRfbXNnX2llX2xlbl9tYXhbXSA9IHsKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgIEFWRFRfTEVOX1RSQU5TX01BWCwgICAgLyogbWVkaWEgdHJhbnNwb3J0ICovCi0gICAgQVZEVF9MRU5fUkVQT1JUX01BWCwgICAvKiByZXBvcnRpbmcgKi8KLSAgICBBVkRUX0xFTl9SRUNPVl9NQVgsICAgIC8qIHJlY292ZXJ5ICovCi0gICAgQVZEVF9MRU5fUFJPVEVDVF9NQVgsICAvKiBjb250ZW50IHByb3RlY3Rpb24gKi8KLSAgICBBVkRUX0xFTl9IRFJDTVBfTUFYLCAgIC8qIGhlYWRlciBjb21wcmVzc2lvbiAqLwotICAgIEFWRFRfTEVOX01VWF9NQVgsICAgICAgLyogbXVsdGlwbGV4aW5nICovCi0gICAgQVZEVF9MRU5fQ09ERUNfTUFYLCAgICAvKiBjb2RlYyAqLwotICAgIEFWRFRfTEVOX0RFTEFZX1JQVF9NQVggLyogZGVsYXkgcmVwb3J0ICovCi19OwotCi0vKiB0YWJsZSBvZiBlcnJvciBjb2RlcyB1c2VkIHdoZW4gZGVjb2RpbmcgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9tc2dfaWVfZXJyW10gPSB7Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgIEFWRFRfRVJSX01FRElBX1RSQU5TLCAvKiBtZWRpYSB0cmFuc3BvcnQgKi8KLSAgICBBVkRUX0VSUl9MRU5HVEgsICAgICAgLyogcmVwb3J0aW5nICovCi0gICAgQVZEVF9FUlJfUkVDT1ZfRk1ULCAgIC8qIHJlY292ZXJ5ICovCi0gICAgQVZEVF9FUlJfQ1BfRk1ULCAgICAgIC8qIGNvbnRlbnQgcHJvdGVjdGlvbiAqLwotICAgIEFWRFRfRVJSX1JPSENfRk1ULCAgICAvKiBoZWFkZXIgY29tcHJlc3Npb24gKi8KLSAgICBBVkRUX0VSUl9NVVhfRk1ULCAgICAgLyogbXVsdGlwbGV4aW5nICovCi0gICAgQVZEVF9FUlJfU0VSVklDRSwgICAgIC8qIGNvZGVjICovCi0gICAgQVZEVF9FUlJfU0VSVklDRSAgICAgIC8qIGRlbGF5IHJlcG9ydCA/PyAqLwotfTsKLQotLyogdGFibGUgb2YgcGFja2V0IHR5cGUgbWluaW11bSBsZW5ndGhzICovCi1zdGF0aWMgY29uc3QgdWludDhfdCBhdmR0X21zZ19wa3RfdHlwZV9sZW5bXSA9IHsKLSAgICBBVkRUX0xFTl9UWVBFX1NJTkdMRSwgQVZEVF9MRU5fVFlQRV9TVEFSVCwgQVZEVF9MRU5fVFlQRV9DT05ULAotICAgIEFWRFRfTEVOX1RZUEVfRU5EfTsKLQotLyogZnVuY3Rpb24gdGFibGUgZm9yIGJ1aWxkaW5nIGNvbW1hbmQgbWVzc2FnZXMgKi8KLWNvbnN0IHRBVkRUX01TR19CTEQgYXZkdF9tc2dfYmxkX2NtZFtdID0gewotICAgIGF2ZHRfbXNnX2JsZF9ub25lLCAgICAgICAgICAvKiBkaXNjb3ZlciAqLwotICAgIGF2ZHRfbXNnX2JsZF9zaW5nbGUsICAgICAgICAvKiBnZXQgY2FwYWJpbGl0aWVzICovCi0gICAgYXZkdF9tc2dfYmxkX3NldGNvbmZpZ19jbWQsIC8qIHNldCBjb25maWd1cmF0aW9uICovCi0gICAgYXZkdF9tc2dfYmxkX3NpbmdsZSwgICAgICAgIC8qIGdldCBjb25maWd1cmF0aW9uICovCi0gICAgYXZkdF9tc2dfYmxkX3JlY29uZmlnX2NtZCwgIC8qIHJlY29uZmlndXJlICovCi0gICAgYXZkdF9tc2dfYmxkX3NpbmdsZSwgICAgICAgIC8qIG9wZW4gKi8KLSAgICBhdmR0X21zZ19ibGRfbXVsdGksICAgICAgICAgLyogc3RhcnQgKi8KLSAgICBhdmR0X21zZ19ibGRfc2luZ2xlLCAgICAgICAgLyogY2xvc2UgKi8KLSAgICBhdmR0X21zZ19ibGRfbXVsdGksICAgICAgICAgLyogc3VzcGVuZCAqLwotICAgIGF2ZHRfbXNnX2JsZF9zaW5nbGUsICAgICAgICAvKiBhYm9ydCAqLwotICAgIGF2ZHRfbXNnX2JsZF9zZWN1cml0eV9jbWQsICAvKiBzZWN1cml0eSBjb250cm9sICovCi0gICAgYXZkdF9tc2dfYmxkX3NpbmdsZSwgICAgICAgIC8qIGdldCBhbGwgY2FwYWJpbGl0aWVzICovCi0gICAgYXZkdF9tc2dfYmxkX2RlbGF5X3JwdCAgICAgIC8qIGRlbGF5IHJlcG9ydCAqLwotfTsKLQotLyogZnVuY3Rpb24gdGFibGUgZm9yIGJ1aWxkaW5nIHJlc3BvbnNlIG1lc3NhZ2VzICovCi1jb25zdCB0QVZEVF9NU0dfQkxEIGF2ZHRfbXNnX2JsZF9yc3BbXSA9IHsKLSAgICBhdmR0X21zZ19ibGRfZGlzY292ZXJfcnNwLCAvKiBkaXNjb3ZlciAqLwotICAgIGF2ZHRfbXNnX2JsZF9zdmNjYXAsICAgICAgIC8qIGdldCBjYXBhYmlsaXRpZXMgKi8KLSAgICBhdmR0X21zZ19ibGRfbm9uZSwgICAgICAgICAvKiBzZXQgY29uZmlndXJhdGlvbiAqLwotICAgIGF2ZHRfbXNnX2JsZF9hbGxfc3ZjY2FwLCAgIC8qIGdldCBjb25maWd1cmF0aW9uICovCi0gICAgYXZkdF9tc2dfYmxkX25vbmUsICAgICAgICAgLyogcmVjb25maWd1cmUgKi8KLSAgICBhdmR0X21zZ19ibGRfbm9uZSwgICAgICAgICAvKiBvcGVuICovCi0gICAgYXZkdF9tc2dfYmxkX25vbmUsICAgICAgICAgLyogc3RhcnQgKi8KLSAgICBhdmR0X21zZ19ibGRfbm9uZSwgICAgICAgICAvKiBjbG9zZSAqLwotICAgIGF2ZHRfbXNnX2JsZF9ub25lLCAgICAgICAgIC8qIHN1c3BlbmQgKi8KLSAgICBhdmR0X21zZ19ibGRfbm9uZSwgICAgICAgICAvKiBhYm9ydCAqLwotICAgIGF2ZHRfbXNnX2JsZF9zZWN1cml0eV9yc3AsIC8qIHNlY3VyaXR5IGNvbnRyb2wgKi8KLSAgICBhdmR0X21zZ19ibGRfYWxsX3N2Y2NhcCwgICAvKiBnZXQgYWxsIGNhcGFiaWxpdGllcyAqLwotICAgIGF2ZHRfbXNnX2JsZF9ub25lICAgICAgICAgIC8qIGRlbGF5IHJlcG9ydCAqLwotfTsKLQotLyogZnVuY3Rpb24gdGFibGUgZm9yIHBhcnNpbmcgY29tbWFuZCBtZXNzYWdlcyAqLwotY29uc3QgdEFWRFRfTVNHX1BSUyBhdmR0X21zZ19wcnNfY21kW10gPSB7Ci0gICAgYXZkdF9tc2dfcHJzX25vbmUsICAgICAgICAgIC8qIGRpc2NvdmVyICovCi0gICAgYXZkdF9tc2dfcHJzX3NpbmdsZSwgICAgICAgIC8qIGdldCBjYXBhYmlsaXRpZXMgKi8KLSAgICBhdmR0X21zZ19wcnNfc2V0Y29uZmlnX2NtZCwgLyogc2V0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBhdmR0X21zZ19wcnNfc2luZ2xlLCAgICAgICAgLyogZ2V0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBhdmR0X21zZ19wcnNfcmVjb25maWdfY21kLCAgLyogcmVjb25maWd1cmUgKi8KLSAgICBhdmR0X21zZ19wcnNfc2luZ2xlLCAgICAgICAgLyogb3BlbiAqLwotICAgIGF2ZHRfbXNnX3Byc19tdWx0aSwgICAgICAgICAvKiBzdGFydCAqLwotICAgIGF2ZHRfbXNnX3Byc19zaW5nbGUsICAgICAgICAvKiBjbG9zZSAqLwotICAgIGF2ZHRfbXNnX3Byc19tdWx0aSwgICAgICAgICAvKiBzdXNwZW5kICovCi0gICAgYXZkdF9tc2dfcHJzX3NpbmdsZSwgICAgICAgIC8qIGFib3J0ICovCi0gICAgYXZkdF9tc2dfcHJzX3NlY3VyaXR5X2NtZCwgIC8qIHNlY3VyaXR5IGNvbnRyb2wgKi8KLSAgICBhdmR0X21zZ19wcnNfc2luZ2xlLCAgICAgICAgLyogZ2V0IGFsbCBjYXBhYmlsaXRpZXMgKi8KLSAgICBhdmR0X21zZ19wcnNfZGVsYXlfcnB0ICAgICAgLyogZGVsYXkgcmVwb3J0ICovCi19OwotCi0vKiBmdW5jdGlvbiB0YWJsZSBmb3IgcGFyc2luZyByZXNwb25zZSBtZXNzYWdlcyAqLwotY29uc3QgdEFWRFRfTVNHX1BSUyBhdmR0X21zZ19wcnNfcnNwW10gPSB7Ci0gICAgYXZkdF9tc2dfcHJzX2Rpc2NvdmVyX3JzcCwgLyogZGlzY292ZXIgKi8KLSAgICBhdmR0X21zZ19wcnNfc3ZjY2FwLCAgICAgICAvKiBnZXQgY2FwYWJpbGl0aWVzICovCi0gICAgYXZkdF9tc2dfcHJzX25vbmUsICAgICAgICAgLyogc2V0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBhdmR0X21zZ19wcnNfYWxsX3N2Y2NhcCwgICAvKiBnZXQgY29uZmlndXJhdGlvbiAqLwotICAgIGF2ZHRfbXNnX3Byc19ub25lLCAgICAgICAgIC8qIHJlY29uZmlndXJlICovCi0gICAgYXZkdF9tc2dfcHJzX25vbmUsICAgICAgICAgLyogb3BlbiAqLwotICAgIGF2ZHRfbXNnX3Byc19ub25lLCAgICAgICAgIC8qIHN0YXJ0ICovCi0gICAgYXZkdF9tc2dfcHJzX25vbmUsICAgICAgICAgLyogY2xvc2UgKi8KLSAgICBhdmR0X21zZ19wcnNfbm9uZSwgICAgICAgICAvKiBzdXNwZW5kICovCi0gICAgYXZkdF9tc2dfcHJzX25vbmUsICAgICAgICAgLyogYWJvcnQgKi8KLSAgICBhdmR0X21zZ19wcnNfc2VjdXJpdHlfcnNwLCAvKiBzZWN1cml0eSBjb250cm9sICovCi0gICAgYXZkdF9tc2dfcHJzX2FsbF9zdmNjYXAsICAgLyogZ2V0IGFsbCBjYXBhYmlsaXRpZXMgKi8KLSAgICBhdmR0X21zZ19wcnNfbm9uZSAgICAgICAgICAvKiBkZWxheSByZXBvcnQgKi8KLX07Ci0KLS8qIGNvbW1hbmQgbWVzc2FnZS10by1ldmVudCBsb29rdXAgdGFibGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9tc2dfY21kXzJfZXZ0W10gPSB7Ci0gICAgQVZEVF9DQ0JfTVNHX0RJU0NPVkVSX0NNRF9FVlQgKyBBVkRUX0NDQl9NS1IsIC8qIGRpc2NvdmVyICovCi0gICAgQVZEVF9DQ0JfTVNHX0dFVENBUF9DTURfRVZUICsgQVZEVF9DQ0JfTUtSLCAgIC8qIGdldCBjYXBhYmlsaXRpZXMgKi8KLSAgICBBVkRUX1NDQl9NU0dfU0VUQ09ORklHX0NNRF9FVlQsICAgICAgICAgICAgICAgLyogc2V0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBBVkRUX1NDQl9NU0dfR0VUQ09ORklHX0NNRF9FVlQsICAgICAgICAgICAgICAgLyogZ2V0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBBVkRUX1NDQl9NU0dfUkVDT05GSUdfQ01EX0VWVCwgICAgICAgICAgICAgICAgLyogcmVjb25maWd1cmUgKi8KLSAgICBBVkRUX1NDQl9NU0dfT1BFTl9DTURfRVZULCAgICAgICAgICAgICAgICAgICAgLyogb3BlbiAqLwotICAgIEFWRFRfQ0NCX01TR19TVEFSVF9DTURfRVZUICsgQVZEVF9DQ0JfTUtSLCAgICAvKiBzdGFydCAqLwotICAgIEFWRFRfU0NCX01TR19DTE9TRV9DTURfRVZULCAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSAqLwotICAgIEFWRFRfQ0NCX01TR19TVVNQRU5EX0NNRF9FVlQgKyBBVkRUX0NDQl9NS1IsICAvKiBzdXNwZW5kICovCi0gICAgQVZEVF9TQ0JfTVNHX0FCT1JUX0NNRF9FVlQsICAgICAgICAgICAgICAgICAgIC8qIGFib3J0ICovCi0gICAgQVZEVF9TQ0JfTVNHX1NFQ1VSSVRZX0NNRF9FVlQsICAgICAgICAgICAgICAgIC8qIHNlY3VyaXR5IGNvbnRyb2wgKi8KLSAgICBBVkRUX0NDQl9NU0dfR0VUQ0FQX0NNRF9FVlQgKyBBVkRUX0NDQl9NS1IsICAgLyogZ2V0IGFsbCBjYXBhYmlsaXRpZXMgKi8KLSAgICBBVkRUX1NDQl9NU0dfREVMQVlfUlBUX0NNRF9FVlQgICAgICAgICAgICAgICAgLyogZGVsYXkgcmVwb3J0ICovCi19OwotCi0vKiByZXNwb25zZSBtZXNzYWdlLXRvLWV2ZW50IGxvb2t1cCB0YWJsZSAqLwotY29uc3QgdWludDhfdCBhdmR0X21zZ19yc3BfMl9ldnRbXSA9IHsKLSAgICBBVkRUX0NDQl9NU0dfRElTQ09WRVJfUlNQX0VWVCArIEFWRFRfQ0NCX01LUiwgLyogZGlzY292ZXIgKi8KLSAgICBBVkRUX0NDQl9NU0dfR0VUQ0FQX1JTUF9FVlQgKyBBVkRUX0NDQl9NS1IsICAgLyogZ2V0IGNhcGFiaWxpdGllcyAqLwotICAgIEFWRFRfU0NCX01TR19TRVRDT05GSUdfUlNQX0VWVCwgICAgICAgICAgICAgICAvKiBzZXQgY29uZmlndXJhdGlvbiAqLwotICAgIEFWRFRfU0NCX01TR19HRVRDT05GSUdfUlNQX0VWVCwgICAgICAgICAgICAgICAvKiBnZXQgY29uZmlndXJhdGlvbiAqLwotICAgIEFWRFRfU0NCX01TR19SRUNPTkZJR19SU1BfRVZULCAgICAgICAgICAgICAgICAvKiByZWNvbmZpZ3VyZSAqLwotICAgIEFWRFRfU0NCX01TR19PUEVOX1JTUF9FVlQsICAgICAgICAgICAgICAgICAgICAvKiBvcGVuICovCi0gICAgQVZEVF9DQ0JfTVNHX1NUQVJUX1JTUF9FVlQgKyBBVkRUX0NDQl9NS1IsICAgIC8qIHN0YXJ0ICovCi0gICAgQVZEVF9TQ0JfTVNHX0NMT1NFX1JTUF9FVlQsICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlICovCi0gICAgQVZEVF9DQ0JfTVNHX1NVU1BFTkRfUlNQX0VWVCArIEFWRFRfQ0NCX01LUiwgIC8qIHN1c3BlbmQgKi8KLSAgICBBVkRUX1NDQl9NU0dfQUJPUlRfUlNQX0VWVCwgICAgICAgICAgICAgICAgICAgLyogYWJvcnQgKi8KLSAgICBBVkRUX1NDQl9NU0dfU0VDVVJJVFlfUlNQX0VWVCwgICAgICAgICAgICAgICAgLyogc2VjdXJpdHkgY29udHJvbCAqLwotICAgIEFWRFRfQ0NCX01TR19HRVRDQVBfUlNQX0VWVCArIEFWRFRfQ0NCX01LUiwgICAvKiBnZXQgYWxsIGNhcGFiaWxpdGllcyAqLwotICAgIEFWRFRfU0NCX01TR19ERUxBWV9SUFRfUlNQX0VWVCAgICAgICAgICAgICAgICAvKiBkZWxheSByZXBvcnQgKi8KLX07Ci0KLS8qIHJlamVjdCBtZXNzYWdlLXRvLWV2ZW50IGxvb2t1cCB0YWJsZSAqLwotY29uc3QgdWludDhfdCBhdmR0X21zZ19yZWpfMl9ldnRbXSA9IHsKLSAgICBBVkRUX0NDQl9NU0dfRElTQ09WRVJfUlNQX0VWVCArIEFWRFRfQ0NCX01LUiwgLyogZGlzY292ZXIgKi8KLSAgICBBVkRUX0NDQl9NU0dfR0VUQ0FQX1JTUF9FVlQgKyBBVkRUX0NDQl9NS1IsICAgLyogZ2V0IGNhcGFiaWxpdGllcyAqLwotICAgIEFWRFRfU0NCX01TR19TRVRDT05GSUdfUkVKX0VWVCwgICAgICAgICAgICAgICAvKiBzZXQgY29uZmlndXJhdGlvbiAqLwotICAgIEFWRFRfU0NCX01TR19HRVRDT05GSUdfUlNQX0VWVCwgICAgICAgICAgICAgICAvKiBnZXQgY29uZmlndXJhdGlvbiAqLwotICAgIEFWRFRfU0NCX01TR19SRUNPTkZJR19SU1BfRVZULCAgICAgICAgICAgICAgICAvKiByZWNvbmZpZ3VyZSAqLwotICAgIEFWRFRfU0NCX01TR19PUEVOX1JFSl9FVlQsICAgICAgICAgICAgICAgICAgICAvKiBvcGVuICovCi0gICAgQVZEVF9DQ0JfTVNHX1NUQVJUX1JTUF9FVlQgKyBBVkRUX0NDQl9NS1IsICAgIC8qIHN0YXJ0ICovCi0gICAgQVZEVF9TQ0JfTVNHX0NMT1NFX1JTUF9FVlQsICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlICovCi0gICAgQVZEVF9DQ0JfTVNHX1NVU1BFTkRfUlNQX0VWVCArIEFWRFRfQ0NCX01LUiwgIC8qIHN1c3BlbmQgKi8KLSAgICBBVkRUX1NDQl9NU0dfQUJPUlRfUlNQX0VWVCwgICAgICAgICAgICAgICAgICAgLyogYWJvcnQgKi8KLSAgICBBVkRUX1NDQl9NU0dfU0VDVVJJVFlfUlNQX0VWVCwgICAgICAgICAgICAgICAgLyogc2VjdXJpdHkgY29udHJvbCAqLwotICAgIEFWRFRfQ0NCX01TR19HRVRDQVBfUlNQX0VWVCArIEFWRFRfQ0NCX01LUiwgICAvKiBnZXQgYWxsIGNhcGFiaWxpdGllcyAqLwotICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSByZXBvcnQgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19ibGRfY2ZnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5lZAotICogICAgICAgICAgICAgICAgICBpbiBhIGNvbW1hbmQgb3IgcmVzcG9uc2UgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfY2ZnKHVpbnQ4X3QqKiBwLCBBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgdWludDhfdCBsZW47Ci0KLSAgLyogZm9yIG5vdywganVzdCBidWlsZCBtZWRpYSB0cmFuc3BvcnQsIGNvZGVjLCBhbmQgY29udGVudCBwcm90ZWN0aW9uLCBhbmQKLSAgICogbXVsdGlwbGV4aW5nICovCi0KLSAgLyogbWVkaWEgdHJhbnNwb3J0ICovCi0gIGlmIChwX2NmZy0+cHNjX21hc2sgJiBBVkRUX1BTQ19UUkFOUykgewotICAgICooKnApKysgPSBBVkRUX0NBVF9UUkFOUzsKLSAgICAqKCpwKSsrID0gMDsgLyogbGVuZ3RoICovCi0gIH0KLQotICAvKiByZXBvcnRpbmcgdHJhbnNwb3J0ICovCi0gIGlmIChwX2NmZy0+cHNjX21hc2sgJiBBVkRUX1BTQ19SRVBPUlQpIHsKLSAgICAqKCpwKSsrID0gQVZEVF9DQVRfUkVQT1JUOwotICAgICooKnApKysgPSAwOyAvKiBsZW5ndGggKi8KLSAgfQotCi0gIC8qIGNvZGVjICovCi0gIGlmIChwX2NmZy0+bnVtX2NvZGVjICE9IDApIHsKLSAgICAqKCpwKSsrID0gQVZEVF9DQVRfQ09ERUM7Ci0gICAgbGVuID0gcF9jZmctPmNvZGVjX2luZm9bMF0gKyAxOwotICAgIGlmIChsZW4gPiBBVkRUX0NPREVDX1NJWkUpIGxlbiA9IEFWRFRfQ09ERUNfU0laRTsKLQotICAgIG1lbWNweSgqcCwgcF9jZmctPmNvZGVjX2luZm8sIGxlbik7Ci0gICAgKnAgKz0gbGVuOwotICB9Ci0KLSAgLyogY29udGVudCBwcm90ZWN0aW9uICovCi0gIGlmIChwX2NmZy0+bnVtX3Byb3RlY3QgIT0gMCkgewotICAgICooKnApKysgPSBBVkRUX0NBVF9QUk9URUNUOwotICAgIGxlbiA9IHBfY2ZnLT5wcm90ZWN0X2luZm9bMF0gKyAxOwotICAgIGlmIChsZW4gPiBBVkRUX1BST1RFQ1RfU0laRSkgbGVuID0gQVZEVF9QUk9URUNUX1NJWkU7Ci0KLSAgICBtZW1jcHkoKnAsIHBfY2ZnLT5wcm90ZWN0X2luZm8sIGxlbik7Ci0gICAgKnAgKz0gbGVuOwotICB9Ci0KLSAgLyogZGVsYXkgcmVwb3J0ICovCi0gIGlmIChwX2NmZy0+cHNjX21hc2sgJiBBVkRUX1BTQ19ERUxBWV9SUFQpIHsKLSAgICAqKCpwKSsrID0gQVZEVF9DQVRfREVMQVlfUlBUOwotICAgICooKnApKysgPSAwOyAvKiBsZW5ndGggKi8KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfYmxkX25vbmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBidWlsZGluZyBmdW5jdGlvbiBidWlsZHMgYW4gZW1wdHkgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfbm9uZShVTlVTRURfQVRUUiB1aW50OF90KiogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRBVkRUX01TRyogcF9tc2cpIHsKLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfYmxkX3NpbmdsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIGJ1aWxkaW5nIGZ1bmN0aW9uIGJ1aWxkcyBhIG1lc3NhZ2UgY29udGFpbmluZwotICogICAgICAgICAgICAgICAgICBhIHNpbmdsZSBTRUlELgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9zaW5nbGUodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpIHsKLSAgQVZEVF9NU0dfQkxEX1NFSUQoKnAsIHBfbXNnLT5zaW5nbGUuc2VpZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19ibGRfc2V0Y29uZmlnX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIGJ1aWxkaW5nIGZ1bmN0aW9uIGJ1aWxkcyBhIHNldCBjb25maWd1cmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfc2V0Y29uZmlnX2NtZCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZykgewotICBBVkRUX01TR19CTERfU0VJRCgqcCwgcF9tc2ctPmNvbmZpZ19jbWQuaGRyLnNlaWQpOwotICBBVkRUX01TR19CTERfU0VJRCgqcCwgcF9tc2ctPmNvbmZpZ19jbWQuaW50X3NlaWQpOwotICBhdmR0X21zZ19ibGRfY2ZnKHAsIHBfbXNnLT5jb25maWdfY21kLnBfY2ZnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX2JsZF9yZWNvbmZpZ19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBidWlsZGluZyBmdW5jdGlvbiBidWlsZHMgYSByZWNvbmZpZ3VyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZCBtZXNzYWdlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9yZWNvbmZpZ19jbWQodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpIHsKLSAgQVZEVF9NU0dfQkxEX1NFSUQoKnAsIHBfbXNnLT5yZWNvbmZpZ19jbWQuaGRyLnNlaWQpOwotCi0gIC8qIGZvcmNlIHBzYyBtYXNrIHplcm8gdG8gYnVpbGQgb25seSBjb2RlYyBhbmQgc2VjdXJpdHkgKi8KLSAgcF9tc2ctPnJlY29uZmlnX2NtZC5wX2NmZy0+cHNjX21hc2sgPSAwOwotICBhdmR0X21zZ19ibGRfY2ZnKHAsIHBfbXNnLT5yZWNvbmZpZ19jbWQucF9jZmcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfYmxkX211bHRpCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgYnVpbGRpbmcgZnVuY3Rpb24gYnVpbGRzIGEgbWVzc2FnZSBjb250YWluaW5nCi0gKiAgICAgICAgICAgICAgICAgIG11bHRpcGxlIFNFSUQncy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfbXVsdGkodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpIHsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHBfbXNnLT5tdWx0aS5udW1fc2VwczsgaSsrKSB7Ci0gICAgQVZEVF9NU0dfQkxEX1NFSUQoKnAsIHBfbXNnLT5tdWx0aS5zZWlkX2xpc3RbaV0pOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19ibGRfc2VjdXJpdHlfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgYnVpbGRpbmcgZnVuY3Rpb24gYnVpbGRzIGEgc2VjdXJpdHkKLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZCBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZkdF9tc2dfYmxkX3NlY3VyaXR5X2NtZCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZykgewotICBBVkRUX01TR19CTERfU0VJRCgqcCwgcF9tc2ctPnNlY3VyaXR5X2NtZC5oZHIuc2VpZCk7Ci0gIG1lbWNweSgqcCwgcF9tc2ctPnNlY3VyaXR5X2NtZC5wX2RhdGEsIHBfbXNnLT5zZWN1cml0eV9jbWQubGVuKTsKLSAgKnAgKz0gcF9tc2ctPnNlY3VyaXR5X2NtZC5sZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19ibGRfZGVsYXlfcnB0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgYnVpbGRpbmcgZnVuY3Rpb24gYnVpbGRzIGEgZGVsYXkgcmVwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbWVzc2FnZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9kZWxheV9ycHQodWludDhfdCoqIHAsIHRBVkRUX01TRyogcF9tc2cpIHsKLSAgQVZEVF9NU0dfQkxEX1NFSUQoKnAsIHBfbXNnLT5kZWxheV9ycHRfY21kLmhkci5zZWlkKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTSgqcCwgcF9tc2ctPmRlbGF5X3JwdF9jbWQuZGVsYXkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfYmxkX2Rpc2NvdmVyX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIGJ1aWxkaW5nIGZ1bmN0aW9uIGJ1aWxkcyBhIGRpc2NvdmVyCi0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZkdF9tc2dfYmxkX2Rpc2NvdmVyX3JzcCh1aW50OF90KiogcCwgdEFWRFRfTVNHKiBwX21zZykgewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcF9tc2ctPmRpc2NvdmVyX3JzcC5udW1fc2VwczsgaSsrKSB7Ci0gICAgLyogYnVpbGQgZGlzY292ZXIgcnNwIGluZm8gKi8KLSAgICBBVkRUX01TR19CTERfRElTQygqcCwgcF9tc2ctPmRpc2NvdmVyX3JzcC5wX3NlcF9pbmZvW2ldLnNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmRpc2NvdmVyX3JzcC5wX3NlcF9pbmZvW2ldLmluX3VzZSwKLSAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+ZGlzY292ZXJfcnNwLnBfc2VwX2luZm9baV0ubWVkaWFfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+ZGlzY292ZXJfcnNwLnBfc2VwX2luZm9baV0udHNlcCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX2JsZF9zdmNjYXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBidWlsZGluZyBmdW5jdGlvbiBidWlsZHMgYSBtZXNzYWdlIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZSBjYXBhYmlsaXRpZXMgcGFyYW1ldGVycy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfc3ZjY2FwKHVpbnQ4X3QqKiBwLCB0QVZEVF9NU0cqIHBfbXNnKSB7Ci0gIEF2ZHRwU2VwQ29uZmlnIGNmZyA9ICpwX21zZy0+c3ZjY2FwLnBfY2ZnOwotCi0gIC8vIEluY2x1ZGUgb25seSB0aGUgQmFzaWMgQ2FwYWJpbGl0eQotICBjZmcucHNjX21hc2sgJj0gQVZEVF9MRUdfUFNDOwotCi0gIGF2ZHRfbXNnX2JsZF9jZmcocCwgJmNmZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19ibGRfYWxsX3N2Y2NhcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIGJ1aWxkaW5nIGZ1bmN0aW9uIGJ1aWxkcyBhIG1lc3NhZ2UgY29udGFpbmluZwotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIGNhcGFiaWxpdGllcyBwYXJhbWV0ZXJzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGF2ZHRfbXNnX2JsZF9hbGxfc3ZjY2FwKHVpbnQ4X3QqKiBwLCB0QVZEVF9NU0cqIHBfbXNnKSB7Ci0gIGF2ZHRfbXNnX2JsZF9jZmcocCwgcF9tc2ctPnN2Y2NhcC5wX2NmZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19ibGRfc2VjdXJpdHlfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgYnVpbGRpbmcgZnVuY3Rpb24gYnVpbGRzIGEgc2VjdXJpdHkKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhdmR0X21zZ19ibGRfc2VjdXJpdHlfcnNwKHVpbnQ4X3QqKiBwLCB0QVZEVF9NU0cqIHBfbXNnKSB7Ci0gIG1lbWNweSgqcCwgcF9tc2ctPnNlY3VyaXR5X3JzcC5wX2RhdGEsIHBfbXNnLT5zZWN1cml0eV9yc3AubGVuKTsKLSAgKnAgKz0gcF9tc2ctPnNlY3VyaXR5X3JzcC5sZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19wcnNfY2ZnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgcGFyc2luZyBmdW5jdGlvbiBwYXJzZXMgdGhlIGNvbmZpZ3VyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBmaWVsZCBvZiBhIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgRXJyb3IgY29kZSBvciB6ZXJvIGlmIG5vIGVycm9yLCBhbmQgZWxlbWVudCB0aGF0IGZhaWxlZAotICogICAgICAgICAgICAgICAgICBpbiBwX2VsZW0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19jZmcoQXZkdHBTZXBDb25maWcqIHBfY2ZnLCB1aW50OF90KiBwLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZWxlbSwgdWludDhfdCBzaWdfaWQpIHsKLSAgdWludDhfdCogcF9lbmQ7Ci0gIHVpbnQ4X3QgZWxlbSA9IDA7Ci0gIHVpbnQ4X3QgZWxlbV9sZW47Ci0gIHVpbnQ4X3QgdG1wOwotICB1aW50OF90IGVyciA9IDA7Ci0gIHVpbnQ4X3QgcHJvdGVjdF9vZmZzZXQgPSAwOwotCi0gIGlmICghcF9jZmcpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCJub3QgZXhwZWN0aW5nIHRoaXMgY2ZnIik7Ci0gICAgcmV0dXJuIEFWRFRfRVJSX0JBRF9TVEFURTsKLSAgfQotCi0gIHBfY2ZnLT5wc2NfbWFzayA9IDA7Ci0gIHBfY2ZnLT5udW1fY29kZWMgPSAwOwotICBwX2NmZy0+bnVtX3Byb3RlY3QgPSAwOwotCi0gIC8qIHdoaWxlIHRoZXJlIGlzIHN0aWxsIGRhdGEgdG8gcGFyc2UgKi8KLSAgcF9lbmQgPSBwICsgbGVuOwotICB3aGlsZSAoKHAgPCBwX2VuZCkgJiYgKGVyciA9PSAwKSkgewotICAgIC8qIHZlcmlmeSBvdmVyYWxsIGxlbmd0aCAqLwotICAgIGlmICgocF9lbmQgLSBwKSA8IEFWRFRfTEVOX0NGR19NSU4pIHsKLSAgICAgIGVyciA9IEFWRFRfRVJSX1BBWUxPQUQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBnZXQgYW5kIHZlcmlmeSBpbmZvIGVsZW0gaWQsIGxlbmd0aCAqLwotICAgIGVsZW0gPSAqcCsrOwotICAgIGVsZW1fbGVuID0gKnArKzsKLQotICAgIGlmICgoZWxlbSA9PSAwKSB8fCAoZWxlbSA+IEFWRFRfQ0FUX01BWF9DVVIpKSB7Ci0gICAgICAvKiB0aGlzIG1heSBub3QgYmUgcmVhbGx5IGJhZC4KLSAgICAgICAqIEl0IG1heSBiZSBhIHNlcnZpY2UgY2F0ZWdvcnkgdGhhdCBpcyB0b28gbmV3IGZvciB1cy4KLSAgICAgICAqIGFsbG93IHRoZXNlIHRvIGJlIHBhcnNlZCB3aXRob3V0IHJlcG9ydGluZyBhbiBlcnJvci4KLSAgICAgICAqIElmIHRoaXMgaXMgYSAiY2FwYWJpbGl0eSIgKGFzIGluIEdldENhcFJzcCAmIEdldENvbmZpZ1JzcCksIHRoaXMgaXMKLSAgICAgICAqIGZpbHRlcmVkIG91dC4KLSAgICAgICAqIElmIHRoaXMgaXMgYSBDb25maWd1cmF0aW9uIChhcyBpbiBTZXRDb25maWdDbWQgJiBSZWNvbmZpZ0NtZCksCi0gICAgICAgKiAgICB0aGlzIHdpbGwgYmUgbWFya2VkIGFzIGFuIGVycm9yIGluIHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiAqLwotICAgICAgaWYgKChzaWdfaWQgPT0gQVZEVF9TSUdfU0VUQ09ORklHKSB8fCAoc2lnX2lkID09IEFWRFRfU0lHX1JFQ09ORklHKSkgewotICAgICAgICAvKiBDYW5ub3QgYWNjZXB0IHVua25vd24gY2F0ZWdvcnkuICovCi0gICAgICAgIGVyciA9IEFWRFRfRVJSX0NBVEVHT1JZOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSAvKiBHRVRDQVAgb3IgR0VUX0FMTENBUCAqLwotICAgICAgewotICAgICAgICAvKiBTa2lwIHVua25vd24gY2F0ZWdvcmllcy4gKi8KLSAgICAgICAgcCArPSBlbGVtX2xlbjsKLSAgICAgICAgQVZEVF9UUkFDRV9ERUJVRygic2tpcHBpbmcgdW5rbm93biBzZXJ2aWNlIGNhdGVnb3J5PSVkIGxlbjogJWQiLCBlbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fbGVuKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChlbGVtX2xlbiA+IGF2ZHRfbXNnX2llX2xlbl9tYXhbZWxlbV0pIHx8Ci0gICAgICAgIChlbGVtX2xlbiA8IGF2ZHRfbXNnX2llX2xlbl9taW5bZWxlbV0pKSB7Ci0gICAgICBlcnIgPSBhdmR0X21zZ19pZV9lcnJbZWxlbV07Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBhZGQgZWxlbWVudCB0byBwc2MgbWFzaywgYnV0IG1hc2sgb3V0IGNvZGVjIG9yIHByb3RlY3QgKi8KLSAgICBwX2NmZy0+cHNjX21hc2sgfD0gKDEgPDwgZWxlbSk7Ci0gICAgQVZEVF9UUkFDRV9ERUJVRygiZWxlbT0lZCBlbGVtX2xlbjogJWQgcHNjX21hc2s9MHgleCIsIGVsZW0sIGVsZW1fbGVuLAotICAgICAgICAgICAgICAgICAgICAgcF9jZmctPnBzY19tYXNrKTsKLQotICAgIC8qIHBhcnNlIGluZGl2aWR1YWwgaW5mb3JtYXRpb24gZWxlbWVudHMgd2l0aCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgKi8KLSAgICBzd2l0Y2ggKGVsZW0pIHsKLSAgICAgIGNhc2UgQVZEVF9DQVRfUkVDT1Y6Ci0gICAgICAgIGlmICgocF9lbmQgLSBwKSA8IDMpIHsKLSAgICAgICAgICBlcnIgPSBBVkRUX0VSUl9QQVlMT0FEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBfY2ZnLT5yZWNvdl90eXBlID0gKnArKzsKLSAgICAgICAgcF9jZmctPnJlY292X21yd3MgPSAqcCsrOwotICAgICAgICBwX2NmZy0+cmVjb3ZfbW5tcCA9ICpwKys7Ci0gICAgICAgIGlmIChwX2NmZy0+cmVjb3ZfdHlwZSAhPSBBVkRUX1JFQ09WX1JGQzI3MzMpIHsKLSAgICAgICAgICBlcnIgPSBBVkRUX0VSUl9SRUNPVl9UWVBFOwotICAgICAgICB9IGVsc2UgaWYgKChwX2NmZy0+cmVjb3ZfbXJ3cyA8IEFWRFRfUkVDT1ZfTVJXU19NSU4pIHx8Ci0gICAgICAgICAgICAgICAgICAgKHBfY2ZnLT5yZWNvdl9tcndzID4gQVZEVF9SRUNPVl9NUldTX01BWCkgfHwKLSAgICAgICAgICAgICAgICAgICAocF9jZmctPnJlY292X21ubXAgPCBBVkRUX1JFQ09WX01OTVBfTUlOKSB8fAotICAgICAgICAgICAgICAgICAgIChwX2NmZy0+cmVjb3ZfbW5tcCA+IEFWRFRfUkVDT1ZfTU5NUF9NQVgpKSB7Ci0gICAgICAgICAgZXJyID0gQVZEVF9FUlJfUkVDT1ZfRk1UOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWRFRfQ0FUX1BST1RFQ1Q6Ci0gICAgICAgIHBfY2ZnLT5wc2NfbWFzayAmPSB+QVZEVF9QU0NfUFJPVEVDVDsKLSAgICAgICAgaWYgKHAgKyBlbGVtX2xlbiA+IHBfZW5kKSB7Ci0gICAgICAgICAgZXJyID0gQVZEVF9FUlJfTEVOR1RIOwotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzgyODgzNzgiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGVsZW1fbGVuICsgcHJvdGVjdF9vZmZzZXQpIDwgQVZEVF9QUk9URUNUX1NJWkUpIHsKLSAgICAgICAgICBwX2NmZy0+bnVtX3Byb3RlY3QrKzsKLSAgICAgICAgICBwX2NmZy0+cHJvdGVjdF9pbmZvW3Byb3RlY3Rfb2Zmc2V0XSA9IGVsZW1fbGVuOwotICAgICAgICAgIHByb3RlY3Rfb2Zmc2V0Kys7Ci0gICAgICAgICAgbWVtY3B5KCZwX2NmZy0+cHJvdGVjdF9pbmZvW3Byb3RlY3Rfb2Zmc2V0XSwgcCwgZWxlbV9sZW4pOwotICAgICAgICAgIHByb3RlY3Rfb2Zmc2V0ICs9IGVsZW1fbGVuOwotICAgICAgICB9Ci0gICAgICAgIHAgKz0gZWxlbV9sZW47Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWRFRfQ0FUX0hEUkNNUDoKLSAgICAgICAgaWYgKChwX2VuZCAtIHApIDwgMSkgewotICAgICAgICAgIGVyciA9IEFWRFRfRVJSX1BBWUxPQUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcF9jZmctPmhkcmNtcF9tYXNrID0gKnArKzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZEVF9DQVRfQ09ERUM6Ci0gICAgICAgIHBfY2ZnLT5wc2NfbWFzayAmPSB+QVZEVF9QU0NfQ09ERUM7Ci0gICAgICAgIHRtcCA9IGVsZW1fbGVuOwotICAgICAgICBpZiAoZWxlbV9sZW4gPj0gQVZEVF9DT0RFQ19TSVpFKSB7Ci0gICAgICAgICAgdG1wID0gQVZEVF9DT0RFQ19TSVpFIC0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocCArIHRtcCA+IHBfZW5kKSB7Ci0gICAgICAgICAgZXJyID0gQVZEVF9FUlJfTEVOR1RIOwotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzgyODgzNzgiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwX2NmZy0+bnVtX2NvZGVjKys7Ci0gICAgICAgIHBfY2ZnLT5jb2RlY19pbmZvWzBdID0gZWxlbV9sZW47Ci0gICAgICAgIG1lbWNweSgmcF9jZmctPmNvZGVjX2luZm9bMV0sIHAsIHRtcCk7Ci0gICAgICAgIHAgKz0gZWxlbV9sZW47Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWRFRfQ0FUX0RFTEFZX1JQVDoKLSAgICAgICAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IFJlbW90ZSBkZXZpY2Ugc3VwcG9ydHMgZGVsYXkgcmVwb3J0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBwICs9IGVsZW1fbGVuOwotICAgICAgICBicmVhazsKLSAgICB9IC8qIHN3aXRjaCAqLwotICB9ICAgLyogd2hpbGUgISBlcnIsICFlbmQqLwotICAqcF9lbGVtID0gZWxlbTsKLSAgQVZEVF9UUkFDRV9ERUJVRygiZXJyPTB4JXgsIGVsZW06MHgleCBwc2NfbWFzaz0weCV4IiwgZXJyLCBlbGVtLAotICAgICAgICAgICAgICAgICAgIHBfY2ZnLT5wc2NfbWFzayk7Ci0KLSAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3Byc19ub25lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgcGFyc2luZyBmdW5jdGlvbiBwYXJzZXMgYSBtZXNzYWdlIHdpdGggbm8KLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBFcnJvciBjb2RlIG9yIHplcm8gaWYgbm8gZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19ub25lKFVOVVNFRF9BVFRSIHRBVkRUX01TRyogcF9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuKSB7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfcHJzX3NpbmdsZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIHBhcnNpbmcgZnVuY3Rpb24gcGFyc2VzIGEgbWVzc2FnZSB3aXRoIGEKLSAqICAgICAgICAgICAgICAgICAgc2luZ2xlIFNFSUQuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgRXJyb3IgY29kZSBvciB6ZXJvIGlmIG5vIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfc2luZ2xlKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbikgewotICB1aW50OF90IGVyciA9IDA7Ci0KLSAgLyogdmVyaWZ5IGxlbiAqLwotICBpZiAobGVuICE9IEFWRFRfTEVOX1NJTkdMRSkgewotICAgIGVyciA9IEFWRFRfRVJSX0xFTkdUSDsKLSAgfSBlbHNlIHsKLSAgICBBVkRUX01TR19QUlNfU0VJRChwLCBwX21zZy0+c2luZ2xlLnNlaWQpOwotCi0gICAgaWYgKGF2ZHRfc2NiX2J5X2hkbChwX21zZy0+c2luZ2xlLnNlaWQpID09IE5VTEwpIHsKLSAgICAgIGVyciA9IEFWRFRfRVJSX1NFSUQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19wcnNfc2V0Y29uZmlnX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIHBhcnNpbmcgZnVuY3Rpb24gcGFyc2VzIGEgc2V0IGNvbmZpZ3VyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZCBtZXNzYWdlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEVycm9yIGNvZGUgb3IgemVybyBpZiBubyBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX3NldGNvbmZpZ19jbWQodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbikgewotICB1aW50OF90IGVyciA9IDA7Ci0KLSAgcF9tc2ctPmhkci5lcnJfcGFyYW0gPSAwOwotCi0gIC8qIHZlcmlmeSBsZW4gKi8KLSAgaWYgKGxlbiA8IEFWRFRfTEVOX1NFVENPTkZJR19NSU4pIHsKLSAgICBlcnIgPSBBVkRUX0VSUl9MRU5HVEg7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZ2V0IHNlaWRzICovCi0gICAgQVZEVF9NU0dfUFJTX1NFSUQocCwgcF9tc2ctPmNvbmZpZ19jbWQuaGRyLnNlaWQpOwotICAgIGlmIChhdmR0X3NjYl9ieV9oZGwocF9tc2ctPmNvbmZpZ19jbWQuaGRyLnNlaWQpID09IE5VTEwpIHsKLSAgICAgIGVyciA9IEFWRFRfRVJSX1NFSUQ7Ci0gICAgfQotCi0gICAgQVZEVF9NU0dfUFJTX1NFSUQocCwgcF9tc2ctPmNvbmZpZ19jbWQuaW50X3NlaWQpOwotICAgIGlmICgocF9tc2ctPmNvbmZpZ19jbWQuaW50X3NlaWQgPCBBVkRUX1NFSURfTUlOKSB8fAotICAgICAgICAocF9tc2ctPmNvbmZpZ19jbWQuaW50X3NlaWQgPiBBVkRUX1NFSURfTUFYKSkgewotICAgICAgZXJyID0gQVZEVF9FUlJfU0VJRDsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWVycikgewotICAgIC8qIHBhcnNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwotICAgIGxlbiAtPSAyOwotICAgIGVyciA9IGF2ZHRfbXNnX3Byc19jZmcocF9tc2ctPmNvbmZpZ19jbWQucF9jZmcsIHAsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX21zZy0+aGRyLmVycl9wYXJhbSwgQVZEVF9TSUdfU0VUQ09ORklHKTsKLQotICAgIGlmICghZXJyKSB7Ci0gICAgICAvKiB2ZXJpZnkgcHJvdG9jb2wgc2VydmljZSBjYXBhYmlsaXRpZXMgYXJlIHN1cHBvcnRlZCAqLwotICAgICAgaWYgKCgocF9tc2ctPmNvbmZpZ19jbWQucF9jZmctPnBzY19tYXNrICYgKH5BVkRUX1BTQykpICE9IDApIHx8Ci0gICAgICAgICAgKHBfbXNnLT5jb25maWdfY21kLnBfY2ZnLT5udW1fY29kZWMgPT0gMCkpIHsKLSAgICAgICAgZXJyID0gQVZEVF9FUlJfSU5WQUxJRF9DQVA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3Byc19yZWNvbmZpZ19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBwYXJzaW5nIGZ1bmN0aW9uIHBhcnNlcyBhIHJlY29uZmlndXJhdGlvbgotICogICAgICAgICAgICAgICAgICBjb21tYW5kIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgRXJyb3IgY29kZSBvciB6ZXJvIGlmIG5vIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfcmVjb25maWdfY21kKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbikgewotICB1aW50OF90IGVyciA9IDA7Ci0KLSAgcF9tc2ctPmhkci5lcnJfcGFyYW0gPSAwOwotCi0gIC8qIHZlcmlmeSBsZW4gKi8KLSAgaWYgKGxlbiA8IEFWRFRfTEVOX1JFQ09ORklHX01JTikgewotICAgIGVyciA9IEFWRFRfRVJSX0xFTkdUSDsKLSAgfSBlbHNlIHsKLSAgICAvKiBnZXQgc2VpZCAqLwotICAgIEFWRFRfTVNHX1BSU19TRUlEKHAsIHBfbXNnLT5yZWNvbmZpZ19jbWQuaGRyLnNlaWQpOwotICAgIGlmIChhdmR0X3NjYl9ieV9oZGwocF9tc2ctPnJlY29uZmlnX2NtZC5oZHIuc2VpZCkgPT0gTlVMTCkgewotICAgICAgZXJyID0gQVZEVF9FUlJfU0VJRDsKLSAgICB9IGVsc2UgewotICAgICAgLyogcGFyc2UgY29uZmlnIHBhcmFtZXRlcnMgKi8KLSAgICAgIGxlbi0tOwotICAgICAgZXJyID0gYXZkdF9tc2dfcHJzX2NmZyhwX21zZy0+Y29uZmlnX2NtZC5wX2NmZywgcCwgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9tc2ctPmhkci5lcnJfcGFyYW0sIEFWRFRfU0lHX1JFQ09ORklHKTsKLQotICAgICAgLyogdmVyaWZ5IG5vIHByb3RvY29sIHNlcnZpY2UgY2FwYWJpbGl0aWVzIGluIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmICghZXJyKSB7Ci0gICAgICAgIEFWRFRfVFJBQ0VfREVCVUcoImF2ZHRfbXNnX3Byc19yZWNvbmZpZ19jbWQgcHNjX21hc2s9MHgleC8weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+Y29uZmlnX2NtZC5wX2NmZy0+cHNjX21hc2ssIEFWRFRfTVNHX1BTQ19NQVNLKTsKLSAgICAgICAgaWYgKChwX21zZy0+Y29uZmlnX2NtZC5wX2NmZy0+cHNjX21hc2sgIT0gMCkgfHwKLSAgICAgICAgICAgIChwX21zZy0+Y29uZmlnX2NtZC5wX2NmZy0+bnVtX2NvZGVjID09IDAgJiYKLSAgICAgICAgICAgICBwX21zZy0+Y29uZmlnX2NtZC5wX2NmZy0+bnVtX3Byb3RlY3QgPT0gMCkpIHsKLSAgICAgICAgICBlcnIgPSBBVkRUX0VSUl9JTlZBTElEX0NBUDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfcHJzX211bHRpCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgcGFyc2luZyBmdW5jdGlvbiBwYXJzZXMgYSBtZXNzYWdlIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgU0VJRCdzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEVycm9yIGNvZGUgb3IgemVybyBpZiBubyBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX211bHRpKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbikgewotICBpbnQgaTsKLSAgdWludDhfdCBlcnIgPSAwOwotCi0gIHBfbXNnLT5oZHIuZXJyX3BhcmFtID0gMDsKLQotICAvKiB2ZXJpZnkgbGVuICovCi0gIGlmIChsZW4gPCBBVkRUX0xFTl9NVUxUSV9NSU4gfHwgKGxlbiA+IEFWRFRfTlVNX1NFUFMpKSB7Ci0gICAgZXJyID0gQVZEVF9FUlJfTEVOR1RIOwotICB9IGVsc2UgewotICAgIC8qIGdldCBhbmQgdmVyaWZ5IGFsbCBzZXBzICovCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBBVkRUX01TR19QUlNfU0VJRChwLCBwX21zZy0+bXVsdGkuc2VpZF9saXN0W2ldKTsKLSAgICAgIGlmIChhdmR0X3NjYl9ieV9oZGwocF9tc2ctPm11bHRpLnNlaWRfbGlzdFtpXSkgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSBBVkRUX0VSUl9TRUlEOwotICAgICAgICBwX21zZy0+aGRyLmVycl9wYXJhbSA9IHBfbXNnLT5tdWx0aS5zZWlkX2xpc3RbaV07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBwX21zZy0+bXVsdGkubnVtX3NlcHMgPSAodWludDhfdClpOwotICB9Ci0KLSAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3Byc19zZWN1cml0eV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBwYXJzaW5nIGZ1bmN0aW9uIHBhcnNlcyBhIHNlY3VyaXR5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBFcnJvciBjb2RlIG9yIHplcm8gaWYgbm8gZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19zZWN1cml0eV9jbWQodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIHVpbnQ4X3QgZXJyID0gMDsKLQotICAvKiB2ZXJpZnkgbGVuICovCi0gIGlmIChsZW4gPCBBVkRUX0xFTl9TRUNVUklUWV9NSU4pIHsKLSAgICBlcnIgPSBBVkRUX0VSUl9MRU5HVEg7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZ2V0IHNlaWQgKi8KLSAgICBBVkRUX01TR19QUlNfU0VJRChwLCBwX21zZy0+c2VjdXJpdHlfY21kLmhkci5zZWlkKTsKLSAgICBpZiAoYXZkdF9zY2JfYnlfaGRsKHBfbXNnLT5zZWN1cml0eV9jbWQuaGRyLnNlaWQpID09IE5VTEwpIHsKLSAgICAgIGVyciA9IEFWRFRfRVJSX1NFSUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfbXNnLT5zZWN1cml0eV9jbWQucF9kYXRhID0gcDsKLSAgICAgIHBfbXNnLT5zZWN1cml0eV9jbWQubGVuID0gbGVuIC0gMTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3Byc19kaXNjb3Zlcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBwYXJzaW5nIGZ1bmN0aW9uIHBhcnNlcyBhIGRpc2NvdmVyCi0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgRXJyb3IgY29kZSBvciB6ZXJvIGlmIG5vIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfZGlzY292ZXJfcnNwKHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbikgewotICBpbnQgaTsKLSAgdWludDhfdCBlcnIgPSAwOwotCi0gIC8qIGRldGVybWluZSBudW1iZXIgb2Ygc2Vwczsgc2VwcyBpbiBtc2cgaXMgbGVuLzIsIGJ1dCBzZXQgdG8gbWluaW11bQotICAqKiBvZiBzZXBzIGFwcCBoYXMgc3VwcGxpZWQgbWVtb3J5IGZvciBhbmQgc2VwcyBpbiBtc2cKLSAgKi8KLSAgaWYgKHBfbXNnLT5kaXNjb3Zlcl9yc3AubnVtX3NlcHMgPiAobGVuIC8gMikpIHsKLSAgICBwX21zZy0+ZGlzY292ZXJfcnNwLm51bV9zZXBzID0gKGxlbiAvIDIpOwotICB9Ci0KLSAgLyogcGFyc2Ugb3V0IHNlcCBpbmZvICovCi0gIGZvciAoaSA9IDA7IGkgPCBwX21zZy0+ZGlzY292ZXJfcnNwLm51bV9zZXBzOyBpKyspIHsKLSAgICAvKiBwYXJzZSBkaXNjb3ZlciByc3AgaW5mbyAqLwotICAgIEFWRFRfTVNHX1BSU19ESVNDKHAsIHBfbXNnLT5kaXNjb3Zlcl9yc3AucF9zZXBfaW5mb1tpXS5zZWlkLAotICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5kaXNjb3Zlcl9yc3AucF9zZXBfaW5mb1tpXS5pbl91c2UsCi0gICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmRpc2NvdmVyX3JzcC5wX3NlcF9pbmZvW2ldLm1lZGlhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmRpc2NvdmVyX3JzcC5wX3NlcF9pbmZvW2ldLnRzZXApOwotCi0gICAgLyogdmVyaWZ5IHRoYXQgc2VpZCBpcyB2YWxpZCAqLwotICAgIGlmICgocF9tc2ctPmRpc2NvdmVyX3JzcC5wX3NlcF9pbmZvW2ldLnNlaWQgPCBBVkRUX1NFSURfTUlOKSB8fAotICAgICAgICAocF9tc2ctPmRpc2NvdmVyX3JzcC5wX3NlcF9pbmZvW2ldLnNlaWQgPiBBVkRUX1NFSURfTUFYKSkgewotICAgICAgZXJyID0gQVZEVF9FUlJfU0VJRDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19wcnNfc3ZjY2FwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgcGFyc2luZyBmdW5jdGlvbiBwYXJzZXMgYSBtZXNzYWdlIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZSBjYXBhYmlsaXRpZXMgcGFyYW1ldGVycy4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBFcnJvciBjb2RlIG9yIHplcm8gaWYgbm8gZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGF2ZHRfbXNnX3Byc19zdmNjYXAodEFWRFRfTVNHKiBwX21zZywgdWludDhfdCogcCwgdWludDE2X3QgbGVuKSB7Ci0gIC8qIHBhcnNlIHBhcmFtZXRlcnMgKi8KLSAgdWludDhfdCBlcnIgPSBhdmR0X21zZ19wcnNfY2ZnKHBfbXNnLT5zdmNjYXAucF9jZmcsIHAsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX21zZy0+aGRyLmVycl9wYXJhbSwgQVZEVF9TSUdfR0VUQ0FQKTsKLSAgaWYgKHBfbXNnLT5zdmNjYXAucF9jZmcpIHsKLSAgICBwX21zZy0+c3ZjY2FwLnBfY2ZnLT5wc2NfbWFzayAmPSBBVkRUX0xFR19QU0M7Ci0gIH0KLQotICByZXR1cm4gKGVycik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19wcnNfYWxsX3N2Y2NhcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBtZXNzYWdlIHBhcnNpbmcgZnVuY3Rpb24gcGFyc2VzIGEgbWVzc2FnZSBjb250YWluaW5nCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UgY2FwYWJpbGl0aWVzIHBhcmFtZXRlcnMuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgRXJyb3IgY29kZSBvciB6ZXJvIGlmIG5vIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfYWxsX3N2Y2NhcCh0QVZEVF9NU0cqIHBfbXNnLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIHVpbnQ4X3QgZXJyID0gYXZkdF9tc2dfcHJzX2NmZyhwX21zZy0+c3ZjY2FwLnBfY2ZnLCBwLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9tc2ctPmhkci5lcnJfcGFyYW0sIEFWRFRfU0lHX0dFVF9BTExDQVApOwotICBpZiAocF9tc2ctPnN2Y2NhcC5wX2NmZykgewotICAgIHBfbXNnLT5zdmNjYXAucF9jZmctPnBzY19tYXNrICY9IEFWRFRfTVNHX1BTQ19NQVNLOwotICB9Ci0gIHJldHVybiAoZXJyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3Byc19zZWN1cml0eV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgbWVzc2FnZSBwYXJzaW5nIGZ1bmN0aW9uIHBhcnNpbmcgYSBzZWN1cml0eQotICogICAgICAgICAgICAgICAgICByZXNwb25zZSBtZXNzYWdlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEVycm9yIGNvZGUgb3IgemVybyBpZiBubyBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX3NlY3VyaXR5X3JzcCh0QVZEVF9NU0cqIHBfbXNnLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgcF9tc2ctPnNlY3VyaXR5X3JzcC5wX2RhdGEgPSBwOwotICBwX21zZy0+c2VjdXJpdHlfcnNwLmxlbiA9IGxlbjsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3Byc19yZWoKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEVycm9yIGNvZGUgb3IgemVybyBpZiBubyBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYXZkdF9tc2dfcHJzX3Jlaih0QVZEVF9NU0cqIHBfbXNnLCB1aW50OF90KiBwLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2lnKSB7Ci0gIHVpbnQ4X3QgZXJyb3IgPSAwOwotCi0gIGlmIChsZW4gPiAwKSB7Ci0gICAgaWYgKChzaWcgPT0gQVZEVF9TSUdfU0VUQ09ORklHKSB8fCAoc2lnID09IEFWRFRfU0lHX1JFQ09ORklHKSkgewotICAgICAgcF9tc2ctPmhkci5lcnJfcGFyYW0gPSAqcCsrOwotICAgICAgbGVuLS07Ci0gICAgfSBlbHNlIGlmICgoc2lnID09IEFWRFRfU0lHX1NUQVJUKSB8fCAoc2lnID09IEFWRFRfU0lHX1NVU1BFTkQpKSB7Ci0gICAgICBBVkRUX01TR19QUlNfU0VJRChwLCBwX21zZy0+aGRyLmVycl9wYXJhbSk7Ci0gICAgICBsZW4tLTsKLSAgICB9Ci0gIH0KLQotICBpZiAobGVuIDwgMSkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzk3MDI0ODQiKTsKLSAgICBlcnJvciA9IEFWRFRfRVJSX0xFTkdUSDsKLSAgfSBlbHNlIHsKLSAgICBwX21zZy0+aGRyLmVycl9jb2RlID0gKnA7Ci0gIH0KLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19wcnNfZGVsYXlfcnB0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIG1lc3NhZ2UgcGFyc2luZyBmdW5jdGlvbiBwYXJzZXMgYSBzZWN1cml0eQotICogICAgICAgICAgICAgICAgICBjb21tYW5kIG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgRXJyb3IgY29kZSBvciB6ZXJvIGlmIG5vIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBhdmR0X21zZ19wcnNfZGVsYXlfcnB0KHRBVkRUX01TRyogcF9tc2csIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbikgewotICB1aW50OF90IGVyciA9IDA7Ci0KLSAgLyogdmVyaWZ5IGxlbiAqLwotICBpZiAobGVuICE9IEFWRFRfTEVOX0RFTEFZX1JQVCkgewotICAgIEFWRFRfVFJBQ0VfV0FSTklORygiYXZkdF9tc2dfcHJzX2RlbGF5X3JwdCBleHBlY3RlZCBsZW46ICV1ICBnb3Q6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgQVZEVF9MRU5fREVMQVlfUlBULCBsZW4pOwotICAgIGVyciA9IEFWRFRfRVJSX0xFTkdUSDsKLSAgfSBlbHNlIHsKLSAgICAvKiBnZXQgc2VpZCAqLwotICAgIEFWRFRfTVNHX1BSU19TRUlEKHAsIHBfbXNnLT5kZWxheV9ycHRfY21kLmhkci5zZWlkKTsKLQotICAgIGlmIChhdmR0X3NjYl9ieV9oZGwocF9tc2ctPmRlbGF5X3JwdF9jbWQuaGRyLnNlaWQpID09IE5VTEwpIHsKLSAgICAgIGVyciA9IEFWRFRfRVJSX1NFSUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9tc2ctPmRlbGF5X3JwdF9jbWQuZGVsYXksIHApOwotICAgICAgQVZEVF9UUkFDRV9ERUJVRygiYXZkdF9tc2dfcHJzX2RlbGF5X3JwdCBkZWxheTogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+ZGVsYXlfcnB0X2NtZC5kZWxheSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19zZW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kLCBhbmQgaWYgbmVjZXNzYXJ5IGZyYWdtZW50IHRoZSBuZXh0IG1lc3NhZ2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQ29uZ2VzdGVkIHN0YXRlOyB0cnVlIGlmIENDQiBjb25nZXN0ZWQsIGZhbHNlIGlmIG5vdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBhdmR0X21zZ19zZW5kKEF2ZHRwQ2NiKiBwX2NjYiwgQlRfSERSKiBwX21zZykgewotICB1aW50MTZfdCBjdXJyX21zZ19sZW47Ci0gIHVpbnQ4X3QgcGt0X3R5cGU7Ci0gIHVpbnQ4X3QgaGRyX2xlbjsKLSAgQXZkdHBUcmFuc3BvcnRDaGFubmVsKiBwX3RibDsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCBsYWJlbDsKLSAgdWludDhfdCBtc2c7Ci0gIHVpbnQ4X3Qgc2lnOwotICB1aW50OF90IG5vc3AgPSAwOyAvKiBudW1iZXIgb2Ygc3Vic2VxdWVudCBwYWNrZXRzICovCi0KLSAgLyogbG9vayB1cCB0cmFuc3BvcnQgY2hhbm5lbCB0YWJsZSBlbnRyeSB0byBnZXQgcGVlciBtdHUgKi8KLSAgcF90YmwgPSBhdmR0X2FkX3RjX3RibF9ieV90eXBlKEFWRFRfQ0hBTl9TSUcsIHBfY2NiLCBOVUxMKTsKLQotICAvKiBzZXQgdGhlIGN1cnJlbnQgbWVzc2FnZSBpZiB0aGVyZSBpcyBhIG1lc3NhZ2UgcGFzc2VkIGluICovCi0gIGlmIChwX21zZyAhPSBOVUxMKSB7Ci0gICAgcF9jY2ItPnBfY3Vycl9tc2cgPSBwX21zZzsKLSAgfQotCi0gIC8qIHN0b3JlIGNvcHkgb2YgY3Vycl9tc2ctPmxlbiAqLwotICBjdXJyX21zZ19sZW4gPSBwX2NjYi0+cF9jdXJyX21zZy0+bGVuOwotCi0gIC8qIHdoaWxlIG5vdCBjb25nZXN0ZWQgYW5kIHdlIGhhdmVuJ3Qgc2VudCBpdCBhbGwgKi8KLSAgd2hpbGUgKCghcF9jY2ItPmNvbmcpICYmIChwX2NjYi0+cF9jdXJyX21zZyAhPSBOVUxMKSkgewotICAgIC8qIGNoZWNrIHdoYXQga2luZCBvZiBtZXNzYWdlIHdlJ3ZlIGdvdCBoZXJlOyB3ZSBhcmUgdXNpbmcgdGhlIG9mZnNldAotICAgICoqIHRvIGluZGljYXRlIHRoYXQgYSBtZXNzYWdlIGlzIGJlaW5nIGZyYWdtZW50ZWQKLSAgICAqLwotCi0gICAgLyogaWYgbWVzc2FnZSBpc24ndCBiZWluZyBmcmFnbWVudGVkIGFuZCBpdCBmaXRzIGluIG10dSAqLwotICAgIGlmICgocF9jY2ItPnBfY3Vycl9tc2ctPm9mZnNldCA9PSBBVkRUX01TR19PRkZTRVQpICYmCi0gICAgICAgIChwX2NjYi0+cF9jdXJyX21zZy0+bGVuIDw9IHBfdGJsLT5wZWVyX210dSAtIEFWRFRfTEVOX1RZUEVfU0lOR0xFKSkgewotICAgICAgcGt0X3R5cGUgPSBBVkRUX1BLVF9UWVBFX1NJTkdMRTsKLSAgICAgIGhkcl9sZW4gPSBBVkRUX0xFTl9UWVBFX1NJTkdMRTsKLSAgICAgIHBfYnVmID0gcF9jY2ItPnBfY3Vycl9tc2c7Ci0gICAgfQotICAgIC8qIGlmIG1lc3NhZ2UgaXNuJ3QgYmVpbmcgZnJhZ21lbnRlZCBhbmQgaXQgZG9lc24ndCBmaXQgaW4gbXR1ICovCi0gICAgZWxzZSBpZiAoKHBfY2NiLT5wX2N1cnJfbXNnLT5vZmZzZXQgPT0gQVZEVF9NU0dfT0ZGU0VUKSAmJgotICAgICAgICAgICAgIChwX2NjYi0+cF9jdXJyX21zZy0+bGVuID4KLSAgICAgICAgICAgICAgcF90YmwtPnBlZXJfbXR1IC0gQVZEVF9MRU5fVFlQRV9TSU5HTEUpKSB7Ci0gICAgICBwa3RfdHlwZSA9IEFWRFRfUEtUX1RZUEVfU1RBUlQ7Ci0gICAgICBoZHJfbGVuID0gQVZEVF9MRU5fVFlQRV9TVEFSVDsKLSAgICAgIG5vc3AgPSAocF9jY2ItPnBfY3Vycl9tc2ctPmxlbiArIEFWRFRfTEVOX1RZUEVfU1RBUlQgLSBwX3RibC0+cGVlcl9tdHUpIC8KLSAgICAgICAgICAgICAgICAgKHBfdGJsLT5wZWVyX210dSAtIDEpICsKLSAgICAgICAgICAgICAyOwotCi0gICAgICAvKiBnZXQgYSBuZXcgYnVmZmVyIGZvciBmcmFnbWVudCB3ZSBhcmUgc2VuZGluZyAqLwotICAgICAgcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEFWRFRfQ01EX0JVRl9TSVpFKTsKLQotICAgICAgLyogY29weSBwb3J0aW9uIG9mIGRhdGEgZnJvbSBjdXJyZW50IG1lc3NhZ2UgdG8gbmV3IGJ1ZmZlciAqLwotICAgICAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQgKyBoZHJfbGVuOwotICAgICAgcF9idWYtPmxlbiA9IHBfdGJsLT5wZWVyX210dSAtIGhkcl9sZW47Ci0gICAgICBtZW1jcHkoKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwKLSAgICAgICAgICAgICAodWludDhfdCopKHBfY2NiLT5wX2N1cnJfbXNnICsgMSkgKyBwX2NjYi0+cF9jdXJyX21zZy0+b2Zmc2V0LAotICAgICAgICAgICAgIHBfYnVmLT5sZW4pOwotICAgIH0KLSAgICAvKiBpZiBtZXNzYWdlIGlzIGJlaW5nIGZyYWdtZW50ZWQgYW5kIHJlbWFpbmluZyBieXRlcyBkb24ndCBmaXQgaW4gbXR1ICovCi0gICAgZWxzZSBpZiAoKHBfY2NiLT5wX2N1cnJfbXNnLT5vZmZzZXQgPiBBVkRUX01TR19PRkZTRVQpICYmCi0gICAgICAgICAgICAgKHBfY2NiLT5wX2N1cnJfbXNnLT5sZW4gPgotICAgICAgICAgICAgICAocF90YmwtPnBlZXJfbXR1IC0gQVZEVF9MRU5fVFlQRV9DT05UKSkpIHsKLSAgICAgIHBrdF90eXBlID0gQVZEVF9QS1RfVFlQRV9DT05UOwotICAgICAgaGRyX2xlbiA9IEFWRFRfTEVOX1RZUEVfQ09OVDsKLQotICAgICAgLyogZ2V0IGEgbmV3IGJ1ZmZlciBmb3IgZnJhZ21lbnQgd2UgYXJlIHNlbmRpbmcgKi8KLSAgICAgIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhBVkRUX0NNRF9CVUZfU0laRSk7Ci0KLSAgICAgIC8qIGNvcHkgcG9ydGlvbiBvZiBkYXRhIGZyb20gY3VycmVudCBtZXNzYWdlIHRvIG5ldyBidWZmZXIgKi8KLSAgICAgIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUICsgaGRyX2xlbjsKLSAgICAgIHBfYnVmLT5sZW4gPSBwX3RibC0+cGVlcl9tdHUgLSBoZHJfbGVuOwotICAgICAgbWVtY3B5KCh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQsCi0gICAgICAgICAgICAgKHVpbnQ4X3QqKShwX2NjYi0+cF9jdXJyX21zZyArIDEpICsgcF9jY2ItPnBfY3Vycl9tc2ctPm9mZnNldCwKLSAgICAgICAgICAgICBwX2J1Zi0+bGVuKTsKLSAgICB9Ci0gICAgLyogaWYgbWVzc2FnZSBpcyBiZWluZyBmcmFnbWVudGVkIGFuZCByZW1haW5pbmcgYnl0ZXMgZG8gZml0IGluIG10dSAqLwotICAgIGVsc2UgewotICAgICAgcGt0X3R5cGUgPSBBVkRUX1BLVF9UWVBFX0VORDsKLSAgICAgIGhkcl9sZW4gPSBBVkRUX0xFTl9UWVBFX0VORDsKLSAgICAgIHBfYnVmID0gcF9jY2ItPnBfY3Vycl9tc2c7Ci0gICAgfQotCi0gICAgLyogbGFiZWwsIHNpZyBpZCwgbXNnIHR5cGUgYXJlIGluIGhkciBvZiBwX2N1cnJfbXNnICovCi0gICAgbGFiZWwgPSBBVkRUX0xBWUVSU1BFQ19MQUJFTChwX2NjYi0+cF9jdXJyX21zZy0+bGF5ZXJfc3BlY2lmaWMpOwotICAgIG1zZyA9IEFWRFRfTEFZRVJTUEVDX01TRyhwX2NjYi0+cF9jdXJyX21zZy0+bGF5ZXJfc3BlY2lmaWMpOwotICAgIHNpZyA9ICh1aW50OF90KXBfY2NiLT5wX2N1cnJfbXNnLT5ldmVudDsKLSAgICBBVkRUX1RSQUNFX0RFQlVHKCJhdmR0X21zZ19zZW5kIGxhYmVsOiVkLCBtc2c6JWQsIHNpZzolZCIsIGxhYmVsLCBtc2csIHNpZyk7Ci0KLSAgICAvKiBrZWVwIHRyYWNrIG9mIGhvdyBtdWNoIG9mIG1zZyB3ZSd2ZSBzZW50ICovCi0gICAgY3Vycl9tc2dfbGVuIC09IHBfYnVmLT5sZW47Ci0gICAgaWYgKGN1cnJfbXNnX2xlbiA9PSAwKSB7Ci0gICAgICAvKiBlbnRpcmUgbWVzc2FnZSBzZW50OyBtYXJrIGFzIGZpbmlzaGVkICovCi0gICAgICBwX2NjYi0+cF9jdXJyX21zZyA9IE5VTEw7Ci0KLSAgICAgIC8qIHN0YXJ0IHRpbWVyIGhlcmUgZm9yIGNvbW1hbmRzICovCi0gICAgICBpZiAobXNnID09IEFWRFRfTVNHX1RZUEVfQ01EKSB7Ci0gICAgICAgIC8qIGlmIHJldHJhbnNtaXQgdGltZW91dCBzZXQgdG8gemVybywgc2lnIGRvZXNuJ3QgdXNlIHJldHJhbnNtaXQgKi8KLSAgICAgICAgaWYgKChzaWcgPT0gQVZEVF9TSUdfRElTQ09WRVIpIHx8IChzaWcgPT0gQVZEVF9TSUdfR0VUQ0FQKSB8fAotICAgICAgICAgICAgKHNpZyA9PSBBVkRUX1NJR19TRUNVUklUWSkgfHwgKGF2ZHRwX2NiLnJjYi5yZXRfdG91dCA9PSAwKSkgewotICAgICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+aWRsZV9jY2JfdGltZXIpOwotICAgICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+cmV0X2NjYl90aW1lcik7Ci0gICAgICAgICAgdWludDY0X3QgaW50ZXJ2YWxfbXMgPSBhdmR0cF9jYi5yY2Iuc2lnX3RvdXQgKiAxMDAwOwotICAgICAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NjYi0+cnNwX2NjYl90aW1lciwgaW50ZXJ2YWxfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfY2NiX3JzcF9jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgICB9IGVsc2UgaWYgKHNpZyAhPSBBVkRUX1NJR19ERUxBWV9SUFQpIHsKLSAgICAgICAgICBhbGFybV9jYW5jZWwocF9jY2ItPmlkbGVfY2NiX3RpbWVyKTsKLSAgICAgICAgICBhbGFybV9jYW5jZWwocF9jY2ItPnJzcF9jY2JfdGltZXIpOwotICAgICAgICAgIHVpbnQ2NF90IGludGVydmFsX21zID0gYXZkdHBfY2IucmNiLnJldF90b3V0ICogMTAwMDsKLSAgICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPnJldF9jY2JfdGltZXIsIGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X2NjYl9yZXRfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBtZXNzYWdlIGJlaW5nIGZyYWdtZW50ZWQgYW5kIG5vdCBjb21wbGV0ZWx5IHNlbnQgKi8KLSAgICAgIHBfY2NiLT5wX2N1cnJfbXNnLT5sZW4gLT0gcF9idWYtPmxlbjsKLSAgICAgIHBfY2NiLT5wX2N1cnJfbXNnLT5vZmZzZXQgKz0gcF9idWYtPmxlbjsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdXAgdG8gYnVpbGQgaGVhZGVyICovCi0gICAgcF9idWYtPmxlbiArPSBoZHJfbGVuOwotICAgIHBfYnVmLT5vZmZzZXQgLT0gaGRyX2xlbjsKLSAgICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAgIC8qIGJ1aWxkIGhlYWRlciAqLwotICAgIEFWRFRfTVNHX0JMRF9IRFIocCwgbGFiZWwsIHBrdF90eXBlLCBtc2cpOwotICAgIGlmIChwa3RfdHlwZSA9PSBBVkRUX1BLVF9UWVBFX1NUQVJUKSB7Ci0gICAgICBBVkRUX01TR19CTERfTk9TUChwLCBub3NwKTsKLSAgICB9Ci0gICAgaWYgKChwa3RfdHlwZSA9PSBBVkRUX1BLVF9UWVBFX1NUQVJUKSB8fAotICAgICAgICAocGt0X3R5cGUgPT0gQVZEVF9QS1RfVFlQRV9TSU5HTEUpKSB7Ci0gICAgICBBVkRUX01TR19CTERfU0lHKHAsIHNpZyk7Ci0gICAgfQotCi0gICAgLyogc2VuZCBtc2cgYnVmZmVyIGRvd24gKi8KLSAgICBhdmR0X2FkX3dyaXRlX3JlcShBVkRUX0NIQU5fU0lHLCBwX2NjYiwgTlVMTCwgcF9idWYpOwotICB9Ci0gIHJldHVybiAocF9jY2ItPmNvbmcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfYXNtYmwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYXNzZW1ibGUgaW5jb21pbmcgbWVzc2FnZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHJlYXNzZW1ibGVkIG1lc3NhZ2U7ICBOVUxMIGlmIG5vIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CVF9IRFIqIGF2ZHRfbXNnX2FzbWJsKEF2ZHRwQ2NiKiBwX2NjYiwgQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90KiBwOwotICB1aW50OF90IHBrdF90eXBlOwotICBCVF9IRFIqIHBfcmV0OwotCi0gIC8qIHBhcnNlIHRoZSBtZXNzYWdlIGhlYWRlciAqLwotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAvKiBDaGVjayBpZiBpcyB2YWxpZCBsZW5ndGggKi8KLSAgaWYgKHBfYnVmLT5sZW4gPCAxKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3ODI4NzA4NCIpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICBwX3JldCA9IE5VTEw7Ci0gICAgcmV0dXJuIHBfcmV0OwotICB9Ci0gIEFWRFRfTVNHX1BSU19QS1RfVFlQRShwLCBwa3RfdHlwZSk7Ci0KLSAgLyogcXVpY2sgc2FuaXR5IGNoZWNrIG9uIGxlbmd0aCAqLwotICBpZiAocF9idWYtPmxlbiA8IGF2ZHRfbXNnX3BrdF90eXBlX2xlbltwa3RfdHlwZV0pIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJCYWQgbGVuZ3RoIGR1cmluZyByZWFzc2VtYmx5Iik7Ci0gICAgcF9yZXQgPSBOVUxMOwotICB9Ci0gIC8qIHNpbmdsZSBwYWNrZXQgKi8KLSAgZWxzZSBpZiAocGt0X3R5cGUgPT0gQVZEVF9QS1RfVFlQRV9TSU5HTEUpIHsKLSAgICAvKiBpZiByZWFzc2VtYmx5IGluIHByb2dyZXNzIGRyb3AgbWVzc2FnZSBhbmQgcHJvY2VzcyBuZXcgc2luZ2xlICovCi0gICAgaWYgKHBfY2NiLT5wX3J4X21zZyAhPSBOVUxMKQotICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJHb3Qgc2luZ2xlIGR1cmluZyByZWFzc2VtYmx5Iik7Ci0KLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jY2ItPnBfcnhfbXNnKTsKLQotICAgIHBfcmV0ID0gcF9idWY7Ci0gIH0KLSAgLyogc3RhcnQgcGFja2V0ICovCi0gIGVsc2UgaWYgKHBrdF90eXBlID09IEFWRFRfUEtUX1RZUEVfU1RBUlQpIHsKLSAgICAvKiBpZiByZWFzc2VtYmx5IGluIHByb2dyZXNzIGRyb3AgbWVzc2FnZSBhbmQgcHJvY2VzcyBuZXcgc2luZ2xlICovCi0gICAgaWYgKHBfY2NiLT5wX3J4X21zZyAhPSBOVUxMKQotICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJHb3Qgc3RhcnQgZHVyaW5nIHJlYXNzZW1ibHkiKTsKLQotICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2NjYi0+cF9yeF9tc2cpOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSBiaWdnZXIgYnVmZmVyIGZvciByZWFzc2VtYmx5LiBBcyBsb3dlciBsYXllcnMgYXJlCi0gICAgICogbm90IGF3YXJlIG9mIHBvc3NpYmxlIHBhY2tldCBzaXplIGFmdGVyIHJlYXNzZW1ibHksIHRoZXkKLSAgICAgKiB3b3VsZCBoYXZlIGFsbG9jYXRlZCBzbWFsbGVyIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwX2NjYi0+cF9yeF9tc2cgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUpOwotICAgIG1lbWNweShwX2NjYi0+cF9yeF9tc2csIHBfYnVmLCBzaXplb2YoQlRfSERSKSArIHBfYnVmLT5vZmZzZXQgKyBwX2J1Zi0+bGVuKTsKLQotICAgIC8qIEZyZWUgb3JpZ2luYWwgYnVmZmVyICovCi0gICAgb3NpX2ZyZWUocF9idWYpOwotCi0gICAgLyogdXBkYXRlIHAgdG8gcG9pbnQgdG8gbmV3IGJ1ZmZlciAqLwotICAgIHAgPSAodWludDhfdCopKHBfY2NiLT5wX3J4X21zZyArIDEpICsgcF9jY2ItPnBfcnhfbXNnLT5vZmZzZXQ7Ci0KLSAgICAvKiBjb3B5IGZpcnN0IGhlYWRlciBieXRlIG92ZXIgbm9zcCAqLwotICAgICoocCArIDEpID0gKnA7Ci0KLSAgICAvKiBzZXQgb2Zmc2V0IHRvIHBvaW50IHRvIHdoZXJlIHRvIGNvcHkgbmV4dCAqLwotICAgIHBfY2NiLT5wX3J4X21zZy0+b2Zmc2V0ICs9IHBfY2NiLT5wX3J4X21zZy0+bGVuOwotCi0gICAgLyogYWRqdXN0IGxlbmd0aCBmb3IgcGFja2V0IGhlYWRlciAqLwotICAgIHBfY2NiLT5wX3J4X21zZy0+bGVuIC09IDE7Ci0KLSAgICBwX3JldCA9IE5VTEw7Ci0gIH0KLSAgLyogY29udGludWUgb3IgZW5kICovCi0gIGVsc2UgewotICAgIC8qIGlmIG5vIHJlYXNzZW1ibHkgaW4gcHJvZ3Jlc3MgZHJvcCBtZXNzYWdlICovCi0gICAgaWYgKHBfY2NiLT5wX3J4X21zZyA9PSBOVUxMKSB7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICBBVkRUX1RSQUNFX1dBUk5JTkcoIlBrdCB0eXBlPSVkIG91dCBvZiBvcmRlciIsIHBrdF90eXBlKTsKLSAgICAgIHBfcmV0ID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgLyogZ2V0IHNpemUgb2YgYnVmZmVyIGhvbGRpbmcgYXNzZW1ibGVkIG1lc3NhZ2UgKi8KLSAgICAgIC8qCi0gICAgICAgKiBOT1RFOiBUaGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBhYm92ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAgICogcmVhc3NlbWJseSwgYW5kIGlzIGFsd2F5cyBvZiBzaXplIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUuCi0gICAgICAgKi8KLSAgICAgIHVpbnQxNl90IGJ1Zl9sZW4gPSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFIC0gc2l6ZW9mKEJUX0hEUik7Ci0KLSAgICAgIC8qIGFkanVzdCBvZmZzZXQgYW5kIGxlbiBvZiBmcmFnbWVudCBmb3IgaGVhZGVyIGJ5dGUgKi8KLSAgICAgIHBfYnVmLT5vZmZzZXQgKz0gQVZEVF9MRU5fVFlQRV9DT05UOwotICAgICAgcF9idWYtPmxlbiAtPSBBVkRUX0xFTl9UWVBFX0NPTlQ7Ci0KLSAgICAgIC8qIHZlcmlmeSBsZW5ndGggKi8KLSAgICAgIGlmICgocF9jY2ItPnBfcnhfbXNnLT5vZmZzZXQgKyBwX2J1Zi0+bGVuKSA+IGJ1Zl9sZW4pIHsKLSAgICAgICAgLyogd29uJ3QgZml0OyBmcmVlIGV2ZXJ5dGhpbmcgKi8KLSAgICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKCIlczogRnJhZ21lbnRlZCBtZXNzYWdlIHRvbyBiaWchIiwgX19mdW5jX18pOwotICAgICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jY2ItPnBfcnhfbXNnKTsKLSAgICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgICBwX3JldCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBjb3B5IGNvbnRlbnRzIG9mIHBfYnVmIHRvIHBfcnhfbXNnICovCi0gICAgICAgIG1lbWNweSgodWludDhfdCopKHBfY2NiLT5wX3J4X21zZyArIDEpICsgcF9jY2ItPnBfcnhfbXNnLT5vZmZzZXQsCi0gICAgICAgICAgICAgICAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBwX2J1Zi0+bGVuKTsKLQotICAgICAgICBpZiAocGt0X3R5cGUgPT0gQVZEVF9QS1RfVFlQRV9FTkQpIHsKLSAgICAgICAgICBwX2NjYi0+cF9yeF9tc2ctPm9mZnNldCAtPSBwX2NjYi0+cF9yeF9tc2ctPmxlbjsKLSAgICAgICAgICBwX2NjYi0+cF9yeF9tc2ctPmxlbiArPSBwX2J1Zi0+bGVuOwotICAgICAgICAgIHBfcmV0ID0gcF9jY2ItPnBfcnhfbXNnOwotICAgICAgICAgIHBfY2NiLT5wX3J4X21zZyA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcF9jY2ItPnBfcnhfbXNnLT5vZmZzZXQgKz0gcF9idWYtPmxlbjsKLSAgICAgICAgICBwX2NjYi0+cF9yeF9tc2ctPmxlbiArPSBwX2J1Zi0+bGVuOwotICAgICAgICAgIHBfcmV0ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBwX3JldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX3NlbmRfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgY29tbWFuZCBtZXNzYWdlLiAgVGhlCi0gKiAgICAgICAgICAgICAgICAgIHNpZ19pZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHR5cGUsIHBfcGFyYW1zCi0gKiAgICAgICAgICAgICAgICAgIHBvaW50cyB0byB0aGUgbWVzc2FnZSBwYXJhbWV0ZXJzLCBpZiBhbnkuICBJdCBnZXRzIGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIEFWRFRQIGNvbW1hbmQgcG9vbCwgZXhlY3V0ZXMgdGhlIG1lc3NhZ2UgYnVpbGRpbmcKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9yIHRoaXMgbWVzc2FnZSB0eXBlLiAgSXQgdGhlbiBxdWV1ZXMgdGhlIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIGNvbW1hbmQgcXVldWUgZm9yIHRoaXMgQ0NCLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9tc2dfc2VuZF9jbWQoQXZkdHBDY2IqIHBfY2NiLCB2b2lkKiBwX3NjYiwgdWludDhfdCBzaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX01TRyogcF9wYXJhbXMpIHsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCogcF9zdGFydDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQVZEVF9DTURfQlVGX1NJWkUpOwotCi0gIC8qIHNldCB1cCBidWYgcG9pbnRlciBhbmQgb2Zmc2V0ICovCi0gIHBfYnVmLT5vZmZzZXQgPSBBVkRUX01TR19PRkZTRVQ7Ci0gIHBfc3RhcnQgPSBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAvKiBleGVjdXRlIHBhcmFtZXRlciBidWlsZGluZyBmdW5jdGlvbiB0byBidWlsZCBtZXNzYWdlICovCi0gICgqYXZkdF9tc2dfYmxkX2NtZFtzaWdfaWQgLSAxXSkoJnAsIHBfcGFyYW1zKTsKLQotICAvKiBzZXQgbGVuICovCi0gIHBfYnVmLT5sZW4gPSAodWludDE2X3QpKHAgLSBwX3N0YXJ0KTsKLQotICAvKiBub3cgc3RvcmUgc2NiIGhkbHMsIGlmIGFueSwgaW4gYnVmICovCi0gIGlmIChwX3NjYiAhPSBOVUxMKSB7Ci0gICAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKTsKLQotICAgIC8qIGZvciBzdGFydCBhbmQgc3VzcGVuZCwgcF9zY2IgcG9pbnRzIHRvIGFycmF5IG9mIGhhbmRsZXMgKi8KLSAgICBpZiAoKHNpZ19pZCA9PSBBVkRUX1NJR19TVEFSVCkgfHwgKHNpZ19pZCA9PSBBVkRUX1NJR19TVVNQRU5EKSkgewotICAgICAgbWVtY3B5KHAsICh1aW50OF90KilwX3NjYiwgcF9idWYtPmxlbik7Ci0gICAgfQotICAgIC8qIGZvciBhbGwgb3RoZXJzLCBwX3NjYiBwb2ludHMgdG8gc2NiIGFzIHVzdWFsICovCi0gICAgZWxzZSB7Ci0gICAgICAqcCA9IGF2ZHRfc2NiX3RvX2hkbCgoQXZkdHBTY2IqKXBfc2NiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBzdGFzaCBzaWcsIGxhYmVsLCBhbmQgbWVzc2FnZSB0eXBlIGluIGJ1ZiAqLwotICBwX2J1Zi0+ZXZlbnQgPSBzaWdfaWQ7Ci0gIEFWRFRfQkxEX0xBWUVSU1BFQyhwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMsIEFWRFRfTVNHX1RZUEVfQ01ELCBwX2NjYi0+bGFiZWwpOwotCi0gIC8qIGluY3JlbWVudCBsYWJlbCAqLwotICBwX2NjYi0+bGFiZWwgPSAocF9jY2ItPmxhYmVsICsgMSkgJSAxNjsKLQotICAvKiBxdWV1ZSBtZXNzYWdlIGFuZCB0cmlnZ2VyIGNjYiB0byBzZW5kIGl0ICovCi0gIGZpeGVkX3F1ZXVlX2VucXVldWUocF9jY2ItPmNtZF9xLCBwX2J1Zik7Ci0gIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9TRU5ETVNHX0VWVCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19zZW5kX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhIHJlc3BvbnNlIG1lc3NhZ2UuICBUaGUKLSAqICAgICAgICAgICAgICAgICAgc2lnX2lkIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgdHlwZSwgcF9wYXJhbXMKLSAqICAgICAgICAgICAgICAgICAgcG9pbnRzIHRvIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMsIGlmIGFueS4gIEl0IGdldHMgYSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQVZEVFAgY29tbWFuZCBwb29sLCBleGVjdXRlcyB0aGUgbWVzc2FnZSBidWlsZGluZwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuICBJdCB0aGVuIHF1ZXVlcyB0aGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVzcG9uc2UgcXVldWUgZm9yIHRoaXMgQ0NCLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9tc2dfc2VuZF9yc3AoQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IHNpZ19pZCwgdEFWRFRfTVNHKiBwX3BhcmFtcykgewotICB1aW50OF90KiBwOwotICB1aW50OF90KiBwX3N0YXJ0OwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhBVkRUX0NNRF9CVUZfU0laRSk7Ci0KLSAgLyogc2V0IHVwIGJ1ZiBwb2ludGVyIGFuZCBvZmZzZXQgKi8KLSAgcF9idWYtPm9mZnNldCA9IEFWRFRfTVNHX09GRlNFVDsKLSAgcF9zdGFydCA9IHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIGV4ZWN1dGUgcGFyYW1ldGVyIGJ1aWxkaW5nIGZ1bmN0aW9uIHRvIGJ1aWxkIG1lc3NhZ2UgKi8KLSAgKCphdmR0X21zZ19ibGRfcnNwW3NpZ19pZCAtIDFdKSgmcCwgcF9wYXJhbXMpOwotCi0gIC8qIHNldCBsZW5ndGggKi8KLSAgcF9idWYtPmxlbiA9ICh1aW50MTZfdCkocCAtIHBfc3RhcnQpOwotCi0gIC8qIHN0YXNoIHNpZywgbGFiZWwsIGFuZCBtZXNzYWdlIHR5cGUgaW4gYnVmICovCi0gIHBfYnVmLT5ldmVudCA9IHNpZ19pZDsKLSAgQVZEVF9CTERfTEFZRVJTUEVDKHBfYnVmLT5sYXllcl9zcGVjaWZpYywgQVZEVF9NU0dfVFlQRV9SU1AsCi0gICAgICAgICAgICAgICAgICAgICBwX3BhcmFtcy0+aGRyLmxhYmVsKTsKLQotICAvKiBxdWV1ZSBtZXNzYWdlIGFuZCB0cmlnZ2VyIGNjYiB0byBzZW5kIGl0ICovCi0gIGZpeGVkX3F1ZXVlX2VucXVldWUocF9jY2ItPnJzcF9xLCBwX2J1Zik7Ci0gIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9TRU5ETVNHX0VWVCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X21zZ19zZW5kX3JlagotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhIHJlamVjdCBtZXNzYWdlLiAgVGhlCi0gKiAgICAgICAgICAgICAgICAgIHNpZ19pZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHR5cGUuICBJdCBnZXRzCi0gKiAgICAgICAgICAgICAgICAgIGEgYnVmZmVyIGZyb20gdGhlIEFWRFRQIGNvbW1hbmQgcG9vbCBhbmQgYnVpbGRzIHRoZQotICogICAgICAgICAgICAgICAgICBtZXNzYWdlIGJhc2VkIG9uIHRoZSBtZXNzYWdlIHR5cGUgYW5kIHRoZSBlcnJvciBjb2RlLgotICogICAgICAgICAgICAgICAgICBJdCB0aGVuIHF1ZXVlcyB0aGUgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UgcXVldWUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgQ0NCLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9tc2dfc2VuZF9yZWooQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IHNpZ19pZCwgdEFWRFRfTVNHKiBwX3BhcmFtcykgewotICB1aW50OF90KiBwOwotICB1aW50OF90KiBwX3N0YXJ0OwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhBVkRUX0NNRF9CVUZfU0laRSk7Ci0KLSAgLyogc2V0IHVwIGJ1ZiBwb2ludGVyIGFuZCBvZmZzZXQgKi8KLSAgcF9idWYtPm9mZnNldCA9IEFWRFRfTVNHX09GRlNFVDsKLSAgcF9zdGFydCA9IHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIGlmIHNpZyBpZCBpbmNsdWRlZCwgYnVpbGQgaW50byBtZXNzYWdlICovCi0gIGlmIChzaWdfaWQgIT0gQVZEVF9TSUdfTk9ORSkgewotICAgIC8qIGlmIHRoaXMgc2lnIGhhcyBhIHBhcmFtZXRlciwgYWRkIHRoZSBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoKHNpZ19pZCA9PSBBVkRUX1NJR19TRVRDT05GSUcpIHx8IChzaWdfaWQgPT0gQVZEVF9TSUdfUkVDT05GSUcpKSB7Ci0gICAgICBBVkRUX01TR19CTERfUEFSQU0ocCwgcF9wYXJhbXMtPmhkci5lcnJfcGFyYW0pOwotICAgIH0gZWxzZSBpZiAoKHNpZ19pZCA9PSBBVkRUX1NJR19TVEFSVCkgfHwgKHNpZ19pZCA9PSBBVkRUX1NJR19TVVNQRU5EKSkgewotICAgICAgQVZEVF9NU0dfQkxEX1NFSUQocCwgcF9wYXJhbXMtPmhkci5lcnJfcGFyYW0pOwotICAgIH0KLQotICAgIC8qIGFkZCB0aGUgZXJyb3IgY29kZSAqLwotICAgIEFWRFRfTVNHX0JMRF9FUlIocCwgcF9wYXJhbXMtPmhkci5lcnJfY29kZSk7Ci0gIH0KLSAgQVZEVF9UUkFDRV9ERUJVRygiYXZkdF9tc2dfc2VuZF9yZWoiKTsKLQotICAvKiBjYWxjdWxhdGUgbGVuZ3RoICovCi0gIHBfYnVmLT5sZW4gPSAodWludDE2X3QpKHAgLSBwX3N0YXJ0KTsKLQotICAvKiBzdGFzaCBzaWcsIGxhYmVsLCBhbmQgbWVzc2FnZSB0eXBlIGluIGJ1ZiAqLwotICBwX2J1Zi0+ZXZlbnQgPSBzaWdfaWQ7Ci0gIEFWRFRfQkxEX0xBWUVSU1BFQyhwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMsIEFWRFRfTVNHX1RZUEVfUkVKLAotICAgICAgICAgICAgICAgICAgICAgcF9wYXJhbXMtPmhkci5sYWJlbCk7Ci0KLSAgLyogcXVldWUgbWVzc2FnZSBhbmQgdHJpZ2dlciBjY2IgdG8gc2VuZCBpdCAqLwotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfY2NiLT5yc3BfcSwgcF9idWYpOwotICBhdmR0X2NjYl9ldmVudChwX2NjYiwgQVZEVF9DQ0JfU0VORE1TR19FVlQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9tc2dfc2VuZF9ncmVqCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgZ2VuZXJhbCByZWplY3QgbWVzc2FnZS4KLSAqICAgICAgICAgICAgICAgICAgVGhlIHNpZ19pZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHR5cGUuICBJdCBnZXRzCi0gKiAgICAgICAgICAgICAgICAgIGEgYnVmZmVyIGZyb20gdGhlIEFWRFRQIGNvbW1hbmQgcG9vbCBhbmQgYnVpbGRzIHRoZQotICogICAgICAgICAgICAgICAgICBtZXNzYWdlIGJhc2VkIG9uIHRoZSBtZXNzYWdlIHR5cGUgYW5kIHRoZSBlcnJvciBjb2RlLgotICogICAgICAgICAgICAgICAgICBJdCB0aGVuIHF1ZXVlcyB0aGUgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UgcXVldWUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgQ0NCLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9tc2dfc2VuZF9ncmVqKEF2ZHRwQ2NiKiBwX2NjYiwgdWludDhfdCBzaWdfaWQsIHRBVkRUX01TRyogcF9wYXJhbXMpIHsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCogcF9zdGFydDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQVZEVF9DTURfQlVGX1NJWkUpOwotCi0gIC8qIHNldCB1cCBidWYgcG9pbnRlciBhbmQgb2Zmc2V0ICovCi0gIHBfYnVmLT5vZmZzZXQgPSBBVkRUX01TR19PRkZTRVQ7Ci0gIHBfc3RhcnQgPSBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAvKiBjYWxjdWxhdGUgbGVuZ3RoICovCi0gIHBfYnVmLT5sZW4gPSAodWludDE2X3QpKHAgLSBwX3N0YXJ0KTsKLQotICAvKiBzdGFzaCBzaWcsIGxhYmVsLCBhbmQgbWVzc2FnZSB0eXBlIGluIGJ1ZiAqLwotICBwX2J1Zi0+ZXZlbnQgPSBzaWdfaWQ7Ci0gIEFWRFRfQkxEX0xBWUVSU1BFQyhwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMsIEFWRFRfTVNHX1RZUEVfR1JKLAotICAgICAgICAgICAgICAgICAgICAgcF9wYXJhbXMtPmhkci5sYWJlbCk7Ci0gIEFWRFRfVFJBQ0VfREVCVUcoX19mdW5jX18pOwotCi0gIC8qIHF1ZXVlIG1lc3NhZ2UgYW5kIHRyaWdnZXIgY2NiIHRvIHNlbmQgaXQgKi8KLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX2NjYi0+cnNwX3EsIHBfYnVmKTsKLSAgYXZkdF9jY2JfZXZlbnQocF9jY2IsIEFWRFRfQ0NCX1NFTkRNU0dfRVZULCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfbXNnX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFkYXB0aW9uIGxheWVyIHdoZW4gYW4KLSAqICAgICAgICAgICAgICAgICAgaW5jb21pbmcgbWVzc2FnZSBpcyByZWNlaXZlZCBvbiB0aGUgc2lnbmFsaW5nIGNoYW5uZWwuCi0gKiAgICAgICAgICAgICAgICAgIEl0IHBhcnNlcyB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgYW4gZXZlbnQgdG8gdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICAgICAgICAgICAgIFNDQiBvciBDQ0IgZm9yIHRoZSBtZXNzYWdlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9tc2dfaW5kKEF2ZHRwQ2NiKiBwX2NjYiwgQlRfSERSKiBwX2J1ZikgewotICBBdmR0cFNjYiogcF9zY2I7Ci0gIHVpbnQ4X3QqIHA7Ci0gIGJvb2wgb2sgPSB0cnVlOwotICBib29sIGhhbmRsZV9yc3AgPSBmYWxzZTsKLSAgYm9vbCBnZW5fcmVqID0gZmFsc2U7Ci0gIHVpbnQ4X3QgbGFiZWw7Ci0gIHVpbnQ4X3QgcGt0X3R5cGU7Ci0gIHVpbnQ4X3QgbXNnX3R5cGU7Ci0gIHVpbnQ4X3Qgc2lnID0gMDsKLSAgdEFWRFRfTVNHIG1zZ3t9OwotICBBdmR0cFNlcENvbmZpZyBjZmd7fTsKLSAgdWludDhfdCBlcnI7Ci0gIHVpbnQ4X3QgZXZ0ID0gMDsKLSAgdWludDhfdCBzY2JfaGRsOwotCi0gIC8qIHJlYXNzZW1ibGUgbWVzc2FnZTsgaWYgbm8gbWVzc2FnZSBhdmFpbGFibGUgKHdlIHJlY2VpdmVkIGEgZnJhZ21lbnQpIHJldHVybgotICAgKi8KLSAgcF9idWYgPSBhdmR0X21zZ19hc21ibChwX2NjYiwgcF9idWYpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIHBhcnNlIHRoZSBtZXNzYWdlIGhlYWRlciAqLwotICBBVkRUX01TR19QUlNfSERSKHAsIGxhYmVsLCBwa3RfdHlwZSwgbXNnX3R5cGUpOwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIm1zZ190eXBlPSVkLCBzaWc9JWQiLCBtc2dfdHlwZSwgc2lnKTsKLSAgLyogc2V0IHVwIGxhYmVsIGFuZCBjY2JfaWR4IGluIG1lc3NhZ2UgaGRyICovCi0gIG1zZy5oZHIubGFiZWwgPSBsYWJlbDsKLSAgbXNnLmhkci5jY2JfaWR4ID0gYXZkdF9jY2JfdG9faWR4KHBfY2NiKTsKLQotICAvKiB2ZXJpZnkgbXNnIHR5cGUgKi8KLSAgaWYgKG1zZ190eXBlID09IEFWRFRfTVNHX1RZUEVfR1JKKSB7Ci0gICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJEcm9wcGluZyBtc2cgbXNnX3R5cGU9JWQiLCBtc2dfdHlwZSk7Ci0gICAgb2sgPSBmYWxzZTsKLSAgfQotICAvKiBjaGVjayBmb3IgZ2VuZXJhbCByZWplY3QgKi8KLSAgZWxzZSBpZiAoKG1zZ190eXBlID09IEFWRFRfTVNHX1RZUEVfUkVKKSAmJgotICAgICAgICAgICAocF9idWYtPmxlbiA9PSBBVkRUX0xFTl9HRU5fUkVKKSkgewotICAgIGdlbl9yZWogPSB0cnVlOwotICAgIGlmIChwX2NjYi0+cF9jdXJyX2NtZCAhPSBOVUxMKSB7Ci0gICAgICBtc2cuaGRyLnNpZ19pZCA9IHNpZyA9ICh1aW50OF90KXBfY2NiLT5wX2N1cnJfY21kLT5ldmVudDsKLSAgICAgIGV2dCA9IGF2ZHRfbXNnX3Jlal8yX2V2dFtzaWcgLSAxXTsKLSAgICAgIG1zZy5oZHIuZXJyX2NvZGUgPSBBVkRUX0VSUl9OU0M7Ci0gICAgICBtc2cuaGRyLmVycl9wYXJhbSA9IDA7Ci0gICAgfQotICB9IGVsc2UgLyogbm90IGEgZ2VuZXJhbCByZWplY3QgKi8KLSAgewotICAgIC8qIGdldCBhbmQgdmVyaWZ5IHNpZ25hbCAqLwotICAgIEFWRFRfTVNHX1BSU19TSUcocCwgc2lnKTsKLSAgICBtc2cuaGRyLnNpZ19pZCA9IHNpZzsKLSAgICBpZiAoKHNpZyA9PSAwKSB8fCAoc2lnID4gQVZEVF9TSUdfTUFYKSkgewotICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJEcm9wcGluZyBtc2cgc2lnPSVkIG1zZ190eXBlOiVkIiwgc2lnLCBtc2dfdHlwZSk7Ci0gICAgICBvayA9IGZhbHNlOwotCi0gICAgICAvKiBzZW5kIGEgZ2VuZXJhbCByZWplY3QgKi8KLSAgICAgIGlmIChtc2dfdHlwZSA9PSBBVkRUX01TR19UWVBFX0NNRCkgewotICAgICAgICBhdmR0X21zZ19zZW5kX2dyZWoocF9jY2IsIHNpZywgJm1zZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9rICYmICFnZW5fcmVqKSB7Ci0gICAgLyogc2tpcCBvdmVyIGhlYWRlciAobXNnIGxlbmd0aCBhbHJlYWR5IHZlcmlmaWVkIGR1cmluZyByZWFzc2VtYmx5KSAqLwotICAgIHBfYnVmLT5sZW4gLT0gQVZEVF9MRU5fVFlQRV9TSU5HTEU7Ci0KLSAgICAvKiBzZXQgdXAgdG8gcGFyc2UgbWVzc2FnZSAqLwotICAgIGlmICgobXNnX3R5cGUgPT0gQVZEVF9NU0dfVFlQRV9SU1ApICYmIChzaWcgPT0gQVZEVF9TSUdfRElTQ09WRVIpKSB7Ci0gICAgICAvKiBwYXJzZSBkaXNjb3ZlciByc3AgbWVzc2FnZSB0byBzdHJ1Y3Qgc3VwcGxpZWQgYnkgYXBwICovCi0gICAgICBtc2cuZGlzY292ZXJfcnNwLnBfc2VwX2luZm8gPSAodEFWRFRfU0VQX0lORk8qKXBfY2NiLT5wX3Byb2NfZGF0YTsKLSAgICAgIG1zZy5kaXNjb3Zlcl9yc3AubnVtX3NlcHMgPSBwX2NjYi0+cHJvY19wYXJhbTsKLSAgICB9IGVsc2UgaWYgKChtc2dfdHlwZSA9PSBBVkRUX01TR19UWVBFX1JTUCkgJiYKLSAgICAgICAgICAgICAgICgoc2lnID09IEFWRFRfU0lHX0dFVENBUCkgfHwgKHNpZyA9PSBBVkRUX1NJR19HRVRfQUxMQ0FQKSkpIHsKLSAgICAgIC8qIHBhcnNlIGRpc2NvdmVyIHJzcCBtZXNzYWdlIHRvIHN0cnVjdCBzdXBwbGllZCBieSBhcHAgKi8KLSAgICAgIG1zZy5zdmNjYXAucF9jZmcgPSAoQXZkdHBTZXBDb25maWcqKXBfY2NiLT5wX3Byb2NfZGF0YTsKLSAgICB9IGVsc2UgaWYgKChtc2dfdHlwZSA9PSBBVkRUX01TR19UWVBFX1JTUCkgJiYgKHNpZyA9PSBBVkRUX1NJR19HRVRDT05GSUcpKSB7Ci0gICAgICAvKiBwYXJzZSBnZXQgY29uZmlnIHJzcCBtZXNzYWdlIHRvIHN0cnVjdCBhbGxvY2F0ZWQgbG9jYWxseSAqLwotICAgICAgbXNnLnN2Y2NhcC5wX2NmZyA9ICZjZmc7Ci0gICAgfSBlbHNlIGlmICgobXNnX3R5cGUgPT0gQVZEVF9NU0dfVFlQRV9DTUQpICYmIChzaWcgPT0gQVZEVF9TSUdfU0VUQ09ORklHKSkgewotICAgICAgLyogcGFyc2UgY29uZmlnIGNtZCBtZXNzYWdlIHRvIHN0cnVjdCBhbGxvY2F0ZWQgbG9jYWxseSAqLwotICAgICAgbXNnLmNvbmZpZ19jbWQucF9jZmcgPSAmY2ZnOwotICAgIH0gZWxzZSBpZiAoKG1zZ190eXBlID09IEFWRFRfTVNHX1RZUEVfQ01EKSAmJiAoc2lnID09IEFWRFRfU0lHX1JFQ09ORklHKSkgewotICAgICAgLyogcGFyc2UgcmVjb25maWcgY21kIG1lc3NhZ2UgdG8gc3RydWN0IGFsbG9jYXRlZCBsb2NhbGx5ICovCi0gICAgICBtc2cucmVjb25maWdfY21kLnBfY2ZnID0gJmNmZzsKLSAgICB9Ci0KLSAgICAvKiBwYXJzZSBtZXNzYWdlOyB3aGlsZSB3ZSdyZSBhdCBpdCBtYXAgbWVzc2FnZSBzaWcgdG8gZXZlbnQgKi8KLSAgICBpZiAobXNnX3R5cGUgPT0gQVZEVF9NU0dfVFlQRV9DTUQpIHsKLSAgICAgIG1zZy5oZHIuZXJyX2NvZGUgPSBlcnIgPQotICAgICAgICAgICgqYXZkdF9tc2dfcHJzX2NtZFtzaWcgLSAxXSkoJm1zZywgcCwgcF9idWYtPmxlbik7Ci0gICAgICBldnQgPSBhdmR0X21zZ19jbWRfMl9ldnRbc2lnIC0gMV07Ci0gICAgfSBlbHNlIGlmIChtc2dfdHlwZSA9PSBBVkRUX01TR19UWVBFX1JTUCkgewotICAgICAgbXNnLmhkci5lcnJfY29kZSA9IGVyciA9Ci0gICAgICAgICAgKCphdmR0X21zZ19wcnNfcnNwW3NpZyAtIDFdKSgmbXNnLCBwLCBwX2J1Zi0+bGVuKTsKLSAgICAgIGV2dCA9IGF2ZHRfbXNnX3JzcF8yX2V2dFtzaWcgLSAxXTsKLSAgICB9IGVsc2UgLyogbXNnX3R5cGUgPT0gQVZEVF9NU0dfVFlQRV9SRUogKi8KLSAgICB7Ci0gICAgICBlcnIgPSBhdmR0X21zZ19wcnNfcmVqKCZtc2csIHAsIHBfYnVmLT5sZW4sIHNpZyk7Ci0gICAgICBldnQgPSBhdmR0X21zZ19yZWpfMl9ldnRbc2lnIC0gMV07Ci0gICAgfQotCi0gICAgLyogaWYgcGFyc2luZyBmYWlsZWQgKi8KLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgIEFWRFRfVFJBQ0VfV0FSTklORygiUGFyc2luZyBmYWlsZWQgc2lnPSVkIGVycj0weCV4Iiwgc2lnLCBlcnIpOwotCi0gICAgICAvKiBpZiBpdHMgYSByc3Agb3IgcmVqLCBkcm9wIGl0OyBpZiBpdHMgYSBjbWQsIHNlbmQgYSByZWo7Ci0gICAgICAqKiBub3RlIHNwZWNpYWwgY2FzZSBmb3IgYWJvcnQ7IG5ldmVyIHNlbmQgYWJvcnQgcmVqZWN0Ci0gICAgICAqLwotICAgICAgb2sgPSBmYWxzZTsKLSAgICAgIGlmICgobXNnX3R5cGUgPT0gQVZEVF9NU0dfVFlQRV9DTUQpICYmIChzaWcgIT0gQVZEVF9TSUdfQUJPUlQpKSB7Ci0gICAgICAgIGF2ZHRfbXNnX3NlbmRfcmVqKHBfY2NiLCBzaWcsICZtc2cpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIGlmIGl0cyBhIHJzcCBvciByZWosIGNoZWNrIHNlbnQgY21kIHRvIHNlZSBpZiB3ZSdyZSB3YWl0aW5nIGZvcgotICAqKiB0aGUgcnNwIG9yIHJlai4gIElmIHdlIGRpZG4ndCBzZW5kIGEgY21kIGZvciBpdCwgZHJvcCBpdC4gIElmCi0gICoqIGl0IGRvZXMgbWF0Y2ggYSBjbWQsIHN0b3AgdGltZXIgZm9yIHRoZSBjbWQuCi0gICovCi0gIGlmIChvaykgewotICAgIGlmICgobXNnX3R5cGUgPT0gQVZEVF9NU0dfVFlQRV9SU1ApIHx8IChtc2dfdHlwZSA9PSBBVkRUX01TR19UWVBFX1JFSikpIHsKLSAgICAgIGlmICgocF9jY2ItPnBfY3Vycl9jbWQgIT0gTlVMTCkgJiYgKHBfY2NiLT5wX2N1cnJfY21kLT5ldmVudCA9PSBzaWcpICYmCi0gICAgICAgICAgKEFWRFRfTEFZRVJTUEVDX0xBQkVMKHBfY2NiLT5wX2N1cnJfY21kLT5sYXllcl9zcGVjaWZpYykgPT0gbGFiZWwpKSB7Ci0gICAgICAgIC8qIHN0b3AgdGltZXIgKi8KLSAgICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5pZGxlX2NjYl90aW1lcik7Ci0gICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+cmV0X2NjYl90aW1lcik7Ci0gICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+cnNwX2NjYl90aW1lcik7Ci0KLSAgICAgICAgLyogY2xlYXIgcmV0cmFuc21pc3Npb24gY291bnQgKi8KLSAgICAgICAgcF9jY2ItPnJldF9jb3VudCA9IDA7Ci0KLSAgICAgICAgLyogbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbiBoYW5kbGUgY2NiIGV2ZW50ICovCi0gICAgICAgIGhhbmRsZV9yc3AgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2sgPSBmYWxzZTsKLSAgICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKCJDbWQgbm90IGZvdW5kIGZvciByc3Agc2lnPSVkIGxhYmVsPSVkIiwgc2lnLCBsYWJlbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9rKSB7Ci0gICAgLyogaWYgaXQncyBhIGNjYiBldmVudCBzZW5kIHRvIGNjYiAqLwotICAgIGlmIChldnQgJiBBVkRUX0NDQl9NS1IpIHsKLSAgICAgIHRBVkRUX0NDQl9FVlQgYXZkdF9jY2JfZXZ0OwotICAgICAgYXZkdF9jY2JfZXZ0Lm1zZyA9IG1zZzsKLSAgICAgIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCAodWludDhfdCkoZXZ0ICYgfkFWRFRfQ0NCX01LUiksICZhdmR0X2NjYl9ldnQpOwotICAgIH0KLSAgICAvKiBpZiBpdCdzIGEgc2NiIGV2ZW50ICovCi0gICAgZWxzZSB7Ci0gICAgICAvKiBTY2IgZXZlbnRzIGFsd2F5cyBoYXZlIGEgc2luZ2xlIHNlaWQuICBGb3IgY21kLCBnZXQgc2VpZCBmcm9tCi0gICAgICAqKiBtZXNzYWdlLiAgRm9yIHJlaiBhbmQgcnNwLCBnZXQgc2VpZCBmcm9tIHBfY3Vycl9jbWQuCi0gICAgICAqLwotICAgICAgaWYgKG1zZ190eXBlID09IEFWRFRfTVNHX1RZUEVfQ01EKSB7Ci0gICAgICAgIHNjYl9oZGwgPSBtc2cuc2luZ2xlLnNlaWQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzY2JfaGRsID0gKigodWludDhfdCopKHBfY2NiLT5wX2N1cnJfY21kICsgMSkpOwotICAgICAgfQotCi0gICAgICAvKiBNYXAgc2VpZCB0byB0aGUgc2NiIGFuZCBzZW5kIGl0IHRoZSBldmVudC4gIEZvciBjbWQsIHNlaWQgaGFzCi0gICAgICAqKiBhbHJlYWR5IGJlZW4gdmVyaWZpZWQgYnkgcGFyc2luZyBmdW5jdGlvbi4KLSAgICAgICovCi0gICAgICBpZiAoZXZ0KSB7Ci0gICAgICAgIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKHNjYl9oZGwpOwotICAgICAgICBpZiAocF9zY2IgIT0gTlVMTCkgewotICAgICAgICAgIHRBVkRUX1NDQl9FVlQgYXZkdF9zY2JfZXZ0OwotICAgICAgICAgIGF2ZHRfc2NiX2V2dC5tc2cgPSBtc2c7Ci0gICAgICAgICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIGV2dCwgJmF2ZHRfc2NiX2V2dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBmcmVlIG1lc3NhZ2UgYnVmZmVyICovCi0gIG9zaV9mcmVlKHBfYnVmKTsKLQotICAvKiBpZiBpdHMgYSByc3Agb3IgcmVqLCBzZW5kIGV2ZW50IHRvIGNjYiB0byBmcmVlIGFzc29jaWF0ZWQKLSAgKiogY21kIG1zZyBidWZmZXIgYW5kIGhhbmRsZSBjbWQgcXVldWUKLSAgKi8KLSAgaWYgKGhhbmRsZV9yc3ApIHsKLSAgICBhdmR0X2NjYl9ldmVudChwX2NjYiwgQVZEVF9DQ0JfUkNWUlNQX0VWVCwgTlVMTCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2ZHQvYXZkdF9zY2IuY2MgYi9zdGFjay9hdmR0L2F2ZHRfc2NiLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2I4YTFhLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2ZHQvYXZkdF9zY2IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHN0cmVhbSBjb250cm9sIGJsb2NrIGFuZCBmdW5jdGlvbnMgd2hpY2gKLSAqICBvcGVyYXRlIG9uIHRoZSBzdHJlYW0gY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJhdmR0X2ludC5oIgotI2luY2x1ZGUgImF2ZHRjX2FwaS5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RhdGUgbWFjaGluZSBjb25zdGFudHMgYW5kIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQVZEVF9ERUJVRyA9PSBUUlVFKQotCi0vKiB2ZXJib3NlIHN0YXRlIHN0cmluZ3MgZm9yIHRyYWNlICovCi1jb25zdCBjaGFyKiBjb25zdCBhdmR0X3NjYl9zdF9zdHJbXSA9IHsiU0NCX0lETEVfU1QiLCAgICAiU0NCX0NPTkZfU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDQl9PUEVOSU5HX1NUIiwgIlNDQl9PUEVOX1NUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQ0JfU1RSRUFNX1NUIiwgICJTQ0JfQ0xPU0lOR19TVCJ9OwotCi0vKiB2ZXJib3NlIGV2ZW50IHN0cmluZ3MgZm9yIHRyYWNlICovCi1jb25zdCBjaGFyKiBjb25zdCBhdmR0X3NjYl9ldnRfc3RyW10gPSB7Ci0gICAgIkFQSV9SRU1PVkVfRVZUIiwgICAgICAgICJBUElfV1JJVEVfUkVRX0VWVCIsICAgICAiQVBJX0dFVENPTkZJR19SRVFfRVZUIiwKLSAgICAiQVBJX0RFTEFZX1JQVF9SRVEiLCAgICAgIkFQSV9TRVRDT05GSUdfUkVRX0VWVCIsICJBUElfT1BFTl9SRVFfRVZUIiwKLSAgICAiQVBJX0NMT1NFX1JFUV9FVlQiLCAgICAgIkFQSV9SRUNPTkZJR19SRVFfRVZUIiwgICJBUElfU0VDVVJJVFlfUkVRX0VWVCIsCi0gICAgIkFQSV9BQk9SVF9SRVFfRVZUIiwgICAgICJBUElfR0VUQ09ORklHX1JTUF9FVlQiLCAiQVBJX1NFVENPTkZJR19SU1BfRVZUIiwKLSAgICAiQVBJX1NFVENPTkZJR19SRUpfRVZUIiwgIkFQSV9PUEVOX1JTUF9FVlQiLCAgICAgICJBUElfQ0xPU0VfUlNQX0VWVCIsCi0gICAgIkFQSV9SRUNPTkZJR19SU1BfRVZUIiwgICJBUElfU0VDVVJJVFlfUlNQX0VWVCIsICAiQVBJX0FCT1JUX1JTUF9FVlQiLAotICAgICJNU0dfU0VUQ09ORklHX0NNRF9FVlQiLCAiTVNHX0dFVENPTkZJR19DTURfRVZUIiwgIk1TR19PUEVOX0NNRF9FVlQiLAotICAgICJNU0dfU1RBUlRfQ01EX0VWVCIsICAgICAiTVNHX1NVU1BFTkRfQ01EX0VWVCIsICAgIk1TR19DTE9TRV9DTURfRVZUIiwKLSAgICAiTVNHX0FCT1JUX0NNRF9FVlQiLCAgICAgIk1TR19SRUNPTkZJR19DTURfRVZUIiwgICJNU0dfU0VDVVJJVFlfQ01EX0VWVCIsCi0gICAgIk1TR19ERUxBWV9SUFRfQ01EX0VWVCIsICJNU0dfREVMQVlfUlBUX1JTUF9FVlQiLCAiTVNHX1NFVENPTkZJR19SU1BfRVZUIiwKLSAgICAiTVNHX0dFVENPTkZJR19SU1BfRVZUIiwgIk1TR19PUEVOX1JTUF9FVlQiLCAgICAgICJNU0dfU1RBUlRfUlNQX0VWVCIsCi0gICAgIk1TR19TVVNQRU5EX1JTUF9FVlQiLCAgICJNU0dfQ0xPU0VfUlNQX0VWVCIsICAgICAiTVNHX0FCT1JUX1JTUF9FVlQiLAotICAgICJNU0dfUkVDT05GSUdfUlNQX0VWVCIsICAiTVNHX1NFQ1VSSVRZX1JTUF9FVlQiLCAgIk1TR19TRVRDT05GSUdfUkVKX0VWVCIsCi0gICAgIk1TR19PUEVOX1JFSl9FVlQiLCAgICAgICJNU0dfU1RBUlRfUkVKX0VWVCIsICAgICAiTVNHX1NVU1BFTkRfUkVKX0VWVCIsCi0gICAgIlRDX1RPVVRfRVZUIiwgICAgICAgICAgICJUQ19PUEVOX0VWVCIsICAgICAgICAgICAiVENfQ0xPU0VfRVZUIiwKLSAgICAiVENfQ09OR19FVlQiLCAgICAgICAgICAgIlRDX0RBVEFfRVZUIiwgICAgICAgICAgICJDQ19DTE9TRV9FVlQifTsKLQotI2VuZGlmCi0KLS8qIGFjdGlvbiBmdW5jdGlvbiBsaXN0ICovCi1jb25zdCB0QVZEVF9TQ0JfQUNUSU9OIGF2ZHRfc2NiX2FjdGlvbltdID0ge2F2ZHRfc2NiX2hkbF9hYm9ydF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9hYm9ydF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9jbG9zZV9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9jbG9zZV9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9nZXRjb25maWdfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9oZGxfZ2V0Y29uZmlnX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfaGRsX29wZW5fY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9oZGxfb3Blbl9yZWosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9vcGVuX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfaGRsX3BrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfZHJvcF9wa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9yZWNvbmZpZ19jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9yZWNvbmZpZ19yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9zZWN1cml0eV9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9zZWN1cml0eV9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9zZXRjb25maWdfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9oZGxfc2V0Y29uZmlnX3JlaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfaGRsX3NldGNvbmZpZ19yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9zdGFydF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9zdGFydF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF9zdXNwZW5kX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfaGRsX3N1c3BlbmRfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9oZGxfdGNfY2xvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF90Y19jbG9zZV9zdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF90Y19vcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9oZGxfdGNfb3Blbl9zdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9kZWxheV9ycHRfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9oZGxfZGVsYXlfcnB0X2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfaGRsX2RlbGF5X3JwdF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2hkbF93cml0ZV9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9hYm9ydF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9hYm9ydF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9jbG9zZV9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9zdHJlYW1fY2xvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9jbG9zZV9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9nZXRjb25maWdfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9zbmRfZ2V0Y29uZmlnX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2Jfc25kX29wZW5fcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9zbmRfb3Blbl9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9yZWNvbmZpZ19yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9yZWNvbmZpZ19yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9zZWN1cml0eV9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9zZWN1cml0eV9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9zZXRjb25maWdfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JlaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2Jfc25kX3NldGNvbmZpZ19yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NuZF9zbmtfZGVsYXlfcnB0X3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2Jfc25kX3RjX2Nsb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9jYl9lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2Nvbmdfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3Jlal9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfcmVqX2luX3VzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfcmVqX25vdF9pbl91c2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3NldF9yZW1vdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2ZyZWVfcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9jbHJfcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9jaGtfc25kX3BrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfdHJhbnNwb3J0X2NoYW5uZWxfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX2Nscl92YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl9kZWFsbG9jfTsKLQotLyogc3RhdGUgdGFibGUgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgQVZEVF9TQ0JfQUNUSU9OUyAyICAgIC8qIG51bWJlciBvZiBhY3Rpb25zICovCi0jZGVmaW5lIEFWRFRfU0NCX05FWFRfU1RBVEUgMiAvKiBwb3NpdGlvbiBvZiBuZXh0IHN0YXRlICovCi0jZGVmaW5lIEFWRFRfU0NCX05VTV9DT0xTIDMgICAvKiBudW1iZXIgb2YgY29sdW1ucyBpbiBzdGF0ZSB0YWJsZXMgKi8KLQotLyogc3RhdGUgdGFibGUgZm9yIGlkbGUgc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9zY2Jfc3RfaWRsZVtdW0FWRFRfU0NCX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAqLwotICAgIC8qIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEFQSV9SRU1PVkVfRVZUICovCi0gICAge0FWRFRfU0NCX0RFQUxMT0MsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogQVBJX1dSSVRFX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfRlJFRV9QS1QsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogQVBJX0dFVENPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfREVMQVlfUlBUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9TRVRDT05GSUdfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfU0VUQ09ORklHX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfT1BFTl9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfQ0xPU0VfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogQVBJX1JFQ09ORklHX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ0JfRVJSLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9TRUNVUklUWV9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfQUJPUlRfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogQVBJX0dFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1NFVENPTkZJR19SU1AsIEFWRFRfU0NCX1NORF9TTktfREVMQVlfUlBUX1JFUSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9TRVRDT05GSUdfUkVKLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9PUEVOX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBBUElfUkVDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogQVBJX1NFQ1VSSVRZX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIEFQSV9BQk9SVF9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9BQk9SVF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TRVRDT05GSUdfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19HRVRDT05GSUdfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9SRUpfU1RBVEUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX09QRU5fQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9SRUpfU1RBVEUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX1NUQVJUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19DTE9TRV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfQUJPUlRfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9OT1RfSU5fVVNFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19TRUNVUklUWV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfREVMQVlfUlBUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX1NUQVRFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19ERUxBWV9SUFRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfREVMQVlfUlBUX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfU0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NFVENPTkZJR19SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogTVNHX0dFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX0NMT1NFX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19BQk9SVF9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfUkVDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX1NFQ1VSSVRZX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19TRVRDT05GSUdfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU0VUQ09ORklHX1JFSiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1RBUlRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NVU1BFTkRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIFRDX1RPVVRfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBUQ19PUEVOX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogVENfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBUQ19DT05HX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogVENfREFUQV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfRFJPUF9QS1QsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogQ0NfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfU0NCX0NMUl9WQVJTLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9fTsKLQotLyogc3RhdGUgdGFibGUgZm9yIGNvbmZpZ3VyZWQgc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9zY2Jfc3RfY29uZltdW0FWRFRfU0NCX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAqLwotICAgIC8qIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEFQSV9SRU1PVkVfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9BQk9SVF9SRVEsIEFWRFRfU0NCX1NFVF9SRU1PVkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIEFQSV9XUklURV9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0ZSRUVfUEtULCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIEFQSV9HRVRDT05GSUdfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfR0VUQ09ORklHX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBBUElfREVMQVlfUlBUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0RFTEFZX1JQVF9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBBUElfT1BFTl9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9PUEVOX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBBUElfQ0xPU0VfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQUJPUlRfUkVRLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIEFQSV9SRUNPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBBUElfU0VDVVJJVFlfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfU0VDVVJJVFlfUkVRLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIEFQSV9BQk9SVF9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9BQk9SVF9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogQVBJX0dFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9HRVRDT05GSUdfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIEFQSV9TRVRDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBBUElfT1BFTl9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9PUEVOX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfQ0xPU0VfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogQVBJX1JFQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIEFQSV9TRUNVUklUWV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9TRUNVUklUWV9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogQVBJX0FCT1JUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0FCT1JUX1JTUCwgQVZEVF9TQ0JfSERMX1RDX0NMT1NFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfU0VUQ09ORklHX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX0lOX1VTRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfR0VUQ09ORklHX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0dFVENPTkZJR19DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogTVNHX09QRU5fQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfT1BFTl9DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogTVNHX1NUQVJUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19DTE9TRV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfQUJPUlRfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfU0VDVVJJVFlfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU0VDVVJJVFlfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19ERUxBWV9SUFRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfREVMQVlfUlBUX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfREVMQVlfUlBUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0RFTEFZX1JQVF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfR0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0dFVENPTkZJR19SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogTVNHX09QRU5fUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfT1BFTl9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NUQVJUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19DTE9TRV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfQUJPUlRfUlNQLCBBVkRUX1NDQl9IRExfVENfQ0xPU0UsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfU0VDVVJJVFlfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU0VDVVJJVFlfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIE1TR19TRVRDT05GSUdfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogTVNHX09QRU5fUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfT1BFTl9SRUosIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogTVNHX1NUQVJUX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NUQVJUX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBNU0dfU1VTUEVORF9SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TVVNQRU5EX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DT05GX1NUfSwKLSAgICAvKiBUQ19UT1VUX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogVENfT1BFTl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIFRDX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ09ORl9TVH0sCi0gICAgLyogVENfQ09OR19FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIFRDX0RBVEFfRVZUICovCi0gICAge0FWRFRfU0NCX0RST1BfUEtULCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NPTkZfU1R9LAotICAgIC8qIENDX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfVENfQ0xPU0UsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH19OwotCi0vKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbmluZyBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBhdmR0X3NjYl9zdF9vcGVuaW5nW11bQVZEVF9TQ0JfTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICovCi0gICAgLyogQWN0aW9uIDEgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCi0gICAgLyogQVBJX1JFTU9WRV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0NMT1NFX1JFUSwgQVZEVF9TQ0JfU0VUX1JFTU9WRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1dSSVRFX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfRlJFRV9QS1QsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX0dFVENPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9HRVRDT05GSUdfUkVRLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9ERUxBWV9SUFRfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfREVMQVlfUlBUX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ0JfRVJSLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9PUEVOX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ0JfRVJSLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9DTE9TRV9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1JFQ09ORklHX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ0JfRVJSLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9TRUNVUklUWV9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9TRUNVUklUWV9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX0FCT1JUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0FCT1JUX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfR0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0dFVENPTkZJR19SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9PUEVOX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9DTE9TRV9SU1AsIEFWRFRfU0NCX1NORF9UQ19DTE9TRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1JFQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIEFQSV9TRUNVUklUWV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9TRUNVUklUWV9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogQVBJX0FCT1JUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0FCT1JUX1JTUCwgQVZEVF9TQ0JfU05EX1RDX0NMT1NFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfU0VUQ09ORklHX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX1NUQVRFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19HRVRDT05GSUdfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfR0VUQ09ORklHX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX0NMT1NFX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0NMT1NFX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfQUJPUlRfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfU0VDVVJJVFlfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU0VDVVJJVFlfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19ERUxBWV9SUFRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfREVMQVlfUlBUX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfREVMQVlfUlBUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0RFTEFZX1JQVF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfR0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0dFVENPTkZJR19SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX09QRU5fUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NUQVJUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19DTE9TRV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfVENfQ0xPU0UsIEFWRFRfU0NCX0hETF9BQk9SVF9SU1AsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfU0VDVVJJVFlfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU0VDVVJJVFlfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5JTkdfU1R9LAotICAgIC8qIE1TR19TRVRDT05GSUdfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX09QRU5fUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTklOR19TVH0sCi0gICAgLyogTVNHX1NUQVJUX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NUQVJUX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBNU0dfU1VTUEVORF9SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TVVNQRU5EX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBUQ19UT1VUX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQUJPUlRfUkVRLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIFRDX09QRU5fRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9UQ19PUEVOLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIFRDX0NMT1NFX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfVENfQ0xPU0UsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSURMRV9TVH0sCi0gICAgLyogVENfQ09OR19FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ09OR19TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBUQ19EQVRBX0VWVCAqLwotICAgIHtBVkRUX1NDQl9EUk9QX1BLVCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOSU5HX1NUfSwKLSAgICAvKiBDQ19DTE9TRV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1RDX0NMT1NFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9fTsKLQotLyogc3RhdGUgdGFibGUgZm9yIG9wZW4gc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9zY2Jfc3Rfb3BlbltdW0FWRFRfU0NCX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAqLwotICAgIC8qIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEFQSV9SRU1PVkVfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9DTE9TRV9SRVEsIEFWRFRfU0NCX1NFVF9SRU1PVkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9XUklURV9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0ZSRUVfUEtULCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9HRVRDT05GSUdfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfR0VUQ09ORklHX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfREVMQVlfUlBUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0RFTEFZX1JQVF9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfT1BFTl9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfQ0xPU0VfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQ0xPU0VfUkVRLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9SRUNPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9SRUNPTkZJR19SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogQVBJX1NFQ1VSSVRZX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1NFQ1VSSVRZX1JFUSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfQUJPUlRfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQUJPUlRfUkVRLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9HRVRDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfR0VUQ09ORklHX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIEFQSV9TRVRDT05GSUdfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogQVBJX09QRU5fUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogQVBJX0NMT1NFX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0NMT1NFX1JTUCwgQVZEVF9TQ0JfVENfVElNRVIsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9SRUNPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9SRUNPTkZJR19SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogQVBJX1NFQ1VSSVRZX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1NFQ1VSSVRZX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBBUElfQUJPUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQUJPUlRfUlNQLCBBVkRUX1NDQl9UQ19USU1FUiwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfR0VUQ09ORklHX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0dFVENPTkZJR19DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX09QRU5fQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9SRUpfU1RBVEUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX1NUQVJUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NUQVJUX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19DTE9TRV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9DTE9TRV9DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX0FCT1JUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0FCT1JUX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfUkVDT05GSUdfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfUkVDT05GSUdfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19TRUNVUklUWV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TRUNVUklUWV9DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX0RFTEFZX1JQVF9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9ERUxBWV9SUFRfQ01ELCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19ERUxBWV9SUFRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfREVMQVlfUlBUX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfU0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19HRVRDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfR0VUQ09ORklHX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1RBUlRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1VTUEVORF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX0NMT1NFX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19BQk9SVF9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBNU0dfUkVDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfUkVDT05GSUdfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19TRUNVUklUWV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TRUNVUklUWV9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1RBUlRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NVU1BFTkRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIFRDX1RPVVRfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBUQ19PUEVOX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfVENfT1BFTl9TVE8sIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogVENfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9UQ19DTE9TRV9TVE8sIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogVENfQ09OR19FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ09OR19TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBUQ19EQVRBX0VWVCAqLwotICAgIHtBVkRUX1NDQl9EUk9QX1BLVCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9PUEVOX1NUfSwKLSAgICAvKiBDQ19DTE9TRV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1RDX0NMT1NFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9fTsKLQotLyogc3RhdGUgdGFibGUgZm9yIHN0cmVhbWluZyBzdGF0ZSAqLwotY29uc3QgdWludDhfdCBhdmR0X3NjYl9zdF9zdHJlYW1bXVtBVkRUX1NDQl9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgKi8KLSAgICAvKiBBY3Rpb24gMSAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KLSAgICAvKiBBUElfUkVNT1ZFX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfU1RSRUFNX0NMT1NFLCBBVkRUX1NDQl9TRVRfUkVNT1ZFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfV1JJVEVfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfV1JJVEVfUkVRLCBBVkRUX1NDQl9DSEtfU05EX1BLVCwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfR0VUQ09ORklHX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0dFVENPTkZJR19SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfREVMQVlfUlBUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0RFTEFZX1JQVF9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfQ0JfRVJSLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogQVBJX09QRU5fUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9DQl9FUlIsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfQ0xPU0VfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfU1RSRUFNX0NMT1NFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9SRUNPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIEFQSV9TRUNVUklUWV9SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9TRUNVUklUWV9SRVEsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfQUJPUlRfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQUJPUlRfUkVRLCBBVkRUX1NDQl9DTFJfUEtULCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfR0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0dFVENPTkZJR19SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIEFQSV9PUEVOX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogQVBJX0NMT1NFX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX0NMT1NFX1JTUCwgQVZEVF9TQ0JfVENfVElNRVIsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9SRUNPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIEFQSV9TRUNVUklUWV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9TRUNVUklUWV9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBBUElfQUJPUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfQUJPUlRfUlNQLCBBVkRUX1NDQl9UQ19USU1FUiwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIE1TR19HRVRDT05GSUdfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfR0VUQ09ORklHX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIE1TR19PUEVOX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX1NUQVRFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX1NUQVJUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1VTUEVORF9DTUQsIEFWRFRfU0NCX0NMUl9QS1QsIEFWRFRfU0NCX09QRU5fU1R9LAotICAgIC8qIE1TR19DTE9TRV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9DTE9TRV9DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfQUJPUlRfQ01ELCBBVkRUX1NDQl9DTFJfUEtULCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIE1TR19TRUNVUklUWV9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TRUNVUklUWV9DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfREVMQVlfUlBUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0RFTEFZX1JQVF9DTUQsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfREVMQVlfUlBUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0RFTEFZX1JQVF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfU0VUQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX0dFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9HRVRDT05GSUdfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX09QRU5fUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfU1VTUEVORF9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TVVNQRU5EX1JTUCwgQVZEVF9TQ0JfQ0xSX1BLVCwgQVZEVF9TQ0JfT1BFTl9TVH0sCi0gICAgLyogTVNHX0NMT1NFX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX0FCT1JUX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX1JFQ09ORklHX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1JFQ09ORklHX1JTUCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIE1TR19TRUNVUklUWV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9TRUNVUklUWV9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfU0VUQ09ORklHX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX09QRU5fUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1RBUlRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX1NUUkVBTV9TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1VTUEVORF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBUQ19UT1VUX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBUQ19PUEVOX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBUQ19DTE9TRV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1RDX0NMT1NFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lETEVfU1R9LAotICAgIC8qIFRDX0NPTkdfRVZUICovCi0gICAge0FWRFRfU0NCX0NPTkdfU1RBVEUsIEFWRFRfU0NCX0NIS19TTkRfUEtULCBBVkRUX1NDQl9TVFJFQU1fU1R9LAotICAgIC8qIFRDX0RBVEFfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9QS1QsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfU1RSRUFNX1NUfSwKLSAgICAvKiBDQ19DTE9TRV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1RDX0NMT1NFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9fTsKLQotLyogc3RhdGUgdGFibGUgZm9yIGNsb3Npbmcgc3RhdGUgKi8KLWNvbnN0IHVpbnQ4X3QgYXZkdF9zY2Jfc3RfY2xvc2luZ1tdW0FWRFRfU0NCX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAqLwotICAgIC8qIEFjdGlvbiAxICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLwotICAgIC8qIEFQSV9SRU1PVkVfRVZUICovCi0gICAge0FWRFRfU0NCX1NFVF9SRU1PVkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1dSSVRFX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfRlJFRV9QS1QsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX0dFVENPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfREVMQVlfUlBUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9TRVRDT05GSUdfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9DQl9FUlIsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX09QRU5fUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX0NMT1NFX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9SRUNPTkZJR19SRVFfRVZUICovCi0gICAge0FWRFRfU0NCX0NCX0VSUiwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfU0VDVVJJVFlfUkVRX0VWVCAqLwotICAgIHtBVkRUX1NDQl9DQl9FUlIsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX0FCT1JUX1JFUV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9HRVRDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1NFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfU0VUQ09ORklHX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9PUEVOX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9DTE9TRV9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBBUElfUkVDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQVBJX1NFQ1VSSVRZX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIEFQSV9BQk9SVF9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9BQk9SVF9SU1AsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19DTURfRVZUICovCi0gICAge0FWRFRfU0NCX1JFSl9TVEFURSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfR0VUQ09ORklHX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX1NUQVRFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19PUEVOX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX1NUQVRFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19TVEFSVF9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfU1VTUEVORF9DTURfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfQ0xPU0VfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9SRUpfU1RBVEUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX0FCT1JUX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX0FCT1JUX0NNRCwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfUkVDT05GSUdfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9SRUpfU1RBVEUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NFQ1VSSVRZX0NNRF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfUkVKX1NUQVRFLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19ERUxBWV9SUFRfQ01EX0VWVCAqLwotICAgIHtBVkRUX1NDQl9SRUpfU1RBVEUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX0RFTEFZX1JQVF9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9ERUxBWV9SUFRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19TRVRDT05GSUdfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX0dFVENPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NVU1BFTkRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX0NMT1NFX1JTUF9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfU05EX1RDX0NMT1NFLCBBVkRUX1NDQl9IRExfQ0xPU0VfUlNQLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfQUJPUlRfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfVENfQ0xPU0UsIEFWRFRfU0NCX0hETF9BQk9SVF9SU1AsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19SRUNPTkZJR19SU1BfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfU0VDVVJJVFlfUlNQX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogTVNHX1NFVENPTkZJR19SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfT1BFTl9SRUpfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBNU0dfU1RBUlRfUkVKX0VWVCAqLwotICAgIHtBVkRUX1NDQl9IRExfU1RBUlRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIE1TR19TVVNQRU5EX1JFSl9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfSERMX1NVU1BFTkRfUlNQLCBBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0NMT1NJTkdfU1R9LAotICAgIC8qIFRDX1RPVVRfRVZUICovCi0gICAge0FWRFRfU0NCX1NORF9UQ19DTE9TRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfSwKLSAgICAvKiBUQ19PUEVOX0VWVCAqLwotICAgIHtBVkRUX1NDQl9TTkRfVENfQ0xPU0UsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogVENfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfU0NCX0hETF9UQ19DTE9TRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9JRExFX1NUfSwKLSAgICAvKiBUQ19DT05HX0VWVCAqLwotICAgIHtBVkRUX1NDQl9JR05PUkUsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogVENfREFUQV9FVlQgKi8KLSAgICB7QVZEVF9TQ0JfRFJPUF9QS1QsIEFWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfQ0xPU0lOR19TVH0sCi0gICAgLyogQ0NfQ0xPU0VfRVZUICovCi0gICAge0FWRFRfU0NCX0lHTk9SRSwgQVZEVF9TQ0JfSUdOT1JFLCBBVkRUX1NDQl9DTE9TSU5HX1NUfX07Ci0KLS8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0QVZEVF9TQ0JfU1RfVEJMKVtBVkRUX1NDQl9OVU1fQ09MU107Ci0KLS8qIHN0YXRlIHRhYmxlICovCi1jb25zdCB0QVZEVF9TQ0JfU1RfVEJMIGF2ZHRfc2NiX3N0X3RibFtdID0gewotICAgIGF2ZHRfc2NiX3N0X2lkbGUsIGF2ZHRfc2NiX3N0X2NvbmYsICAgYXZkdF9zY2Jfc3Rfb3BlbmluZywKLSAgICBhdmR0X3NjYl9zdF9vcGVuLCBhdmR0X3NjYl9zdF9zdHJlYW0sIGF2ZHRfc2NiX3N0X2Nsb3Npbmd9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfZXZlbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXRlIG1hY2hpbmUgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24gZm9yIHNjYgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfZXZlbnQoQXZkdHBTY2IqIHBfc2NiLCB1aW50OF90IGV2ZW50LCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWRFRfU0NCX1NUX1RCTCBzdGF0ZV90YWJsZTsKLSAgdWludDhfdCBhY3Rpb247Ci0KLSNpZiAoQVZEVF9ERUJVRyA9PSBUUlVFKQotICBBVkRUX1RSQUNFX0VWRU5UKAotICAgICAgIiVzOiBTQ0IgaGRsPSVkIGV2ZW50PSVkLyVzIHN0YXRlPSVzIHBfYXZkdF9zY2I9JXAgc2NiX2luZGV4PSVkIiwKLSAgICAgIF9fZnVuY19fLCBhdmR0X3NjYl90b19oZGwocF9zY2IpLCBldmVudCwgYXZkdF9zY2JfZXZ0X3N0cltldmVudF0sCi0gICAgICBhdmR0X3NjYl9zdF9zdHJbcF9zY2ItPnN0YXRlXSwgcF9zY2IsIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci0jZW5kaWYKLQotICAvKiBDaGVjayB0aGF0IHdlIG9ubHkgc2VuZCBBVkRUX1NDQl9BUElfV1JJVEVfUkVRX0VWVCB0byB0aGUgYWN0aXZlIHN0cmVhbQotICAgKiBkZXZpY2UgKi8KLSAgdWludDhfdCBudW1fc3Rfc3RyZWFtcyA9IDA7Ci0gIGludCBjY2JfaW5kZXggPSAtMTsKLSAgaW50IHNjYl9pbmRleCA9IC0xOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQVZEVF9OVU1fTElOS1M7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVZEVF9OVU1fU0VQUzsgaisrKSB7Ci0gICAgICBBdmR0cFNjYiogcF9hdmR0X3NjYiA9ICZhdmR0cF9jYi5jY2JbaV0uc2NiW2pdOwotICAgICAgaWYgKHBfYXZkdF9zY2ItPmFsbG9jYXRlZCAmJgotICAgICAgICAgIGF2ZHRfc2NiX3N0X3RibFtwX2F2ZHRfc2NiLT5zdGF0ZV0gPT0gYXZkdF9zY2Jfc3Rfc3RyZWFtKSB7Ci0gICAgICAgIG51bV9zdF9zdHJlYW1zKys7Ci0gICAgICAgIGNjYl9pbmRleCA9IGk7Ci0gICAgICAgIHNjYl9pbmRleCA9IGo7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX2F2ZHRfc2NiLT5jdXJyX3N0cmVhbSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChudW1fc3Rfc3RyZWFtcyA9PSAxKSB7Ci0gICAgYXZkdHBfY2IuY2NiW2NjYl9pbmRleF0uc2NiW3NjYl9pbmRleF0uY3Vycl9zdHJlYW0gPSB0cnVlOwotICB9IGVsc2UgaWYgKG51bV9zdF9zdHJlYW1zID4gMSAmJiAhcF9zY2ItPmN1cnJfc3RyZWFtICYmCi0gICAgICAgICAgICAgZXZlbnQgPT0gQVZEVF9TQ0JfQVBJX1dSSVRFX1JFUV9FVlQpIHsKLSAgICBBVkRUX1RSQUNFX0VSUk9SKCIlczogaWdub3JlIEFWRFRfU0NCX0FQSV9XUklURV9SRVFfRVZUIiwgX19mdW5jX18pOwotICAgIGF2ZHRfc2NiX2ZyZWVfcGt0KHBfc2NiLCBwX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHNldCBjdXJyZW50IGV2ZW50ICovCi0gIHBfc2NiLT5jdXJyX2V2dCA9IGV2ZW50OwotCi0gIC8qIGxvb2sgdXAgdGhlIHN0YXRlIHRhYmxlIGZvciB0aGUgY3VycmVudCBzdGF0ZSAqLwotICBzdGF0ZV90YWJsZSA9IGF2ZHRfc2NiX3N0X3RibFtwX3NjYi0+c3RhdGVdOwotCi0gIC8qIHNldCBuZXh0IHN0YXRlICovCi0gIGlmIChwX3NjYi0+c3RhdGUgIT0gc3RhdGVfdGFibGVbZXZlbnRdW0FWRFRfU0NCX05FWFRfU1RBVEVdKSB7Ci0gICAgcF9zY2ItPnN0YXRlID0gc3RhdGVfdGFibGVbZXZlbnRdW0FWRFRfU0NCX05FWFRfU1RBVEVdOwotICB9Ci0KLSAgLyogZXhlY3V0ZSBhY3Rpb24gZnVuY3Rpb25zICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQVZEVF9TQ0JfQUNUSU9OUzsgaSsrKSB7Ci0gICAgYWN0aW9uID0gc3RhdGVfdGFibGVbZXZlbnRdW2ldOwotICAgIGlmIChhY3Rpb24gIT0gQVZEVF9TQ0JfSUdOT1JFKSB7Ci0gICAgICAoKmF2ZHRwX2NiLnBfc2NiX2FjdFthY3Rpb25dKShwX3NjYiwgcF9kYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplIHN0cmVhbSBjb250cm9sIGJsb2NrIG1vZHVsZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2luaXQodm9pZCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFWRFRfTlVNX0xJTktTOyBpKyspIHsKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFWRFRfTlVNX1NFUFM7IGorKykgewotICAgICAgYXZkdHBfY2IuY2NiW2ldLnNjYltqXS5SZXNldCgwKTsKLSAgICB9Ci0gIH0KLQotICBhdmR0cF9jYi5wX3NjYl9hY3QgPSBhdmR0X3NjYl9hY3Rpb247Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWxsb2NhdGUgYSBzdHJlYW0gY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzY2IsIG9yIE5VTEwgaWYgbm9uZSBjb3VsZCBiZSBhbGxvY2F0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUF2ZHRwU2NiKiBhdmR0X3NjYl9hbGxvYyh1aW50OF90IHBlZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXZkdHBTdHJlYW1Db25maWcmIGF2ZHRwX3N0cmVhbV9jb25maWcpIHsKLSAgQ0hFQ0socGVlcl9pZCA8IEFWRFRfTlVNX0xJTktTKTsKLQotICAvLyBGaW5kIGF2YWlsYWJsZSBlbnRyeQotICBBdmR0cFNjYiogcF9zY2IgPSAmYXZkdHBfY2IuY2NiW3BlZXJfaWRdLnNjYlswXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVkRUX05VTV9TRVBTOyBpKyssIHBfc2NiKyspIHsKLSAgICBpZiAoIXBfc2NiLT5hbGxvY2F0ZWQpIHsKLSAgICAgIHBfc2NiLT5BbGxvY2F0ZSgmYXZkdHBfY2IuY2NiW3BlZXJfaWRdLCBhdmR0cF9zdHJlYW1fY29uZmlnKTsKLSAgICAgIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBhbGxvY2F0ZWQgKGhhbmRsZT0lZCwgcHNjX21hc2s6MHgleCkiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPlNjYkhhbmRsZSgpLCBhdmR0cF9zdHJlYW1fY29uZmlnLmNmZy5wc2NfbWFzayk7Ci0gICAgICByZXR1cm4gcF9zY2I7Ci0gICAgfQotICB9Ci0KLSAgQVZEVF9UUkFDRV9XQVJOSU5HKCIlczogb3V0IG9mIEF2ZHRTY2IgZW50cmllcyBmb3IgcGVlcl9pZCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcGVlcl9pZCk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIEF2ZHRwU2NiOjpBbGxvY2F0ZShBdmR0cENjYiogcF9hdmR0cF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmR0cFN0cmVhbUNvbmZpZyYgYXZkdHBfc3RyZWFtX2NvbmZpZykgewotICB1aW50OF90IHNjYl9oYW5kbGUgPSBhdmR0cF9jYi5Db21wdXRlU2NiSGFuZGxlKHRoaXMpOwotICBSZXNldChzY2JfaGFuZGxlKTsKLSAgcF9jY2IgPSBwX2F2ZHRwX2NjYjsKLSAgc3RyZWFtX2NvbmZpZyA9IGF2ZHRwX3N0cmVhbV9jb25maWc7Ci0gIHRyYW5zcG9ydF9jaGFubmVsX3RpbWVyID0gYWxhcm1fbmV3KCJhdmR0cF9zY2IudHJhbnNwb3J0X2NoYW5uZWxfdGltZXIiKTsKLSAgYWxsb2NhdGVkID0gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlYWxsb2NhdGUgYSBzdHJlYW0gY29udHJvbCBibG9jay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2RlYWxsb2MoQXZkdHBTY2IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IGhkbD0lZCIsIF9fZnVuY19fLCBhdmR0X3NjYl90b19oZGwocF9zY2IpKTsKLSAgcF9zY2ItPlJlY3ljbGUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3RvX2hkbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gYSBwb2ludGVyIHRvIGFuIHNjYiwgcmV0dXJuIGl0cyBoYW5kbGUgKG9yIHNlaWQpLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEluZGV4IG9mIHNjYi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBhdmR0X3NjYl90b19oZGwoQXZkdHBTY2IqIHBfc2NiKSB7IHJldHVybiBwX3NjYi0+U2NiSGFuZGxlKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2J5X2hkbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gYW4gc2NiIGhhbmRsZSAob3Igc2VpZCksIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHNjYi4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHNjYiBvciBOVUxMIGlmIGluZGV4IGlzIG91dCBvZiByYW5nZSBvciBzY2IKLSAqICAgICAgICAgICAgICAgICAgaXMgbm90IGFsbG9jYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQXZkdHBTY2IqIGF2ZHRfc2NiX2J5X2hkbCh1aW50OF90IGhkbCkgewotICAvLyBWZXJpZnkgdGhlIGluZGV4Ci0gIGlmICgoaGRsIDwgMSkgfHwgKGhkbCA+IEFWRFRfTlVNX0xJTktTICogQVZEVF9OVU1fU0VQUykpIHsKLSAgICBBVkRUX1RSQUNFX1dBUk5JTkcoIiVzOiBTQ0IgaGFuZGxlICVkIG91dCBvZiByYW5nZSIsIF9fZnVuY19fLCBoZGwpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgdWludDhfdCBpbmRleCA9IGhkbCAtIDE7Ci0gIHNpemVfdCBpID0gaW5kZXggLyBBVkRUX05VTV9TRVBTOwotICBzaXplX3QgaiA9IGluZGV4ICUgQVZEVF9OVU1fU0VQUzsKLQotICBBdmR0cFNjYiogcF9zY2IgPSAmYXZkdHBfY2IuY2NiW2ldLnNjYltqXTsKLSAgLy8gVmVyaWZ5IHRoZSB3aGV0aGVyIHRoZSBzY2IgaXMgYWxsb2NhdGVkCi0gIGlmICghcF9zY2ItPmFsbG9jYXRlZCkgewotICAgIEFWRFRfVFJBQ0VfV0FSTklORygiJXM6IFNDQiBoYW5kbGUgJWQgbm90IGFsbG9jYXRlZCIsIF9fZnVuY19fLCBoZGwpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IFNDQiBmb3IgaGFuZGxlICVkIGZvdW5kOiBwX3NjYj0lcCBzY2JfaW5kZXg9JWQiLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBoZGwsIHBfc2NiLCBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotICByZXR1cm4gcF9zY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl92ZXJpZnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFZlcmlmeSB0aGUgY29uZGl0aW9uIG9mIGEgbGlzdCBvZiBzY2JzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFNFSUQgdGhhdCBmYWlsZWQsIG9yIDAgaWYgc3VjY2Vzcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBhdmR0X3NjYl92ZXJpZnkoQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IHN0YXRlLCB1aW50OF90KiBwX3NlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fc2VpZCwgdWludDhfdCogcF9lcnJfY29kZSkgewotICBBVkRUX1RSQUNFX0RFQlVHKCJhdmR0X3NjYl92ZXJpZnkgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gIC8qIHNldCBub25zdXBwb3J0ZWQgY29tbWFuZCBtYXNrICovCi0gIC8qIHRyYW5zbGF0ZSBwdWJsaWMgc3RhdGUgaW50byBwcml2YXRlIHN0YXRlICovCi0gIHVpbnQ4X3QgbnNjX21hc2sgPSAwOwotICBpZiAoc3RhdGUgPT0gQVZEVF9WRVJJRllfU1VTUEVORCkgewotICAgIG5zY19tYXNrID0gQXZkdHBTdHJlYW1Db25maWc6OkFWRFRfTlNDX1NVU1BFTkQ7Ci0gIH0KLQotICAvKiB2ZXJpZnkgZXZlcnkgc2NiICovCi0gICpwX2Vycl9jb2RlID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IChpIDwgbnVtX3NlaWQpICYmIChpIDwgQVZEVF9OVU1fU0VQUyk7IGkrKykgewotICAgIEF2ZHRwU2NiKiBwX3NjYiA9IGF2ZHRfc2NiX2J5X2hkbChwX3NlaWRbaV0pOwotICAgIGlmIChwX3NjYiA9PSBOVUxMKSB7Ci0gICAgICAqcF9lcnJfY29kZSA9IEFWRFRfRVJSX0JBRF9TVEFURTsKLSAgICAgIHJldHVybiBwX3NlaWRbaV07Ci0gICAgfQotCi0gICAgaWYgKHBfc2NiLT5wX2NjYiAhPSBwX2NjYikgewotICAgICAgKnBfZXJyX2NvZGUgPSBBVkRUX0VSUl9CQURfU1RBVEU7Ci0gICAgICByZXR1cm4gcF9zZWlkW2ldOwotICAgIH0KLQotICAgIGlmIChwX3NjYi0+c3RyZWFtX2NvbmZpZy5uc2NfbWFzayAmIG5zY19tYXNrKSB7Ci0gICAgICAqcF9lcnJfY29kZSA9IEFWRFRfRVJSX05TQzsKLSAgICAgIHJldHVybiBwX3NlaWRbaV07Ci0gICAgfQotCi0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgY2FzZSBBVkRUX1ZFUklGWV9PUEVOOgotICAgICAgY2FzZSBBVkRUX1ZFUklGWV9TVEFSVDoKLSAgICAgICAgaWYgKHBfc2NiLT5zdGF0ZSAhPSBBVkRUX1NDQl9PUEVOX1NUICYmCi0gICAgICAgICAgICBwX3NjYi0+c3RhdGUgIT0gQVZEVF9TQ0JfU1RSRUFNX1NUKSB7Ci0gICAgICAgICAgKnBfZXJyX2NvZGUgPSBBVkRUX0VSUl9CQURfU1RBVEU7Ci0gICAgICAgICAgcmV0dXJuIHBfc2VpZFtpXTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVkRUX1ZFUklGWV9TVVNQRU5EOgotICAgICAgY2FzZSBBVkRUX1ZFUklGWV9TVFJFQU1JTkc6Ci0gICAgICAgIGlmIChwX3NjYi0+c3RhdGUgIT0gQVZEVF9TQ0JfU1RSRUFNX1NUKSB7Ci0gICAgICAgICAgKnBfZXJyX2NvZGUgPSBBVkRUX0VSUl9CQURfU1RBVEU7Ci0gICAgICAgICAgcmV0dXJuIHBfc2VpZFtpXTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3BlZXJfc2VpZF9saXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiBhIGxpc3Qgb2YgU0NCIGhhbmRsZXMsIHJldHVybiBhIGxpc3Qgb2YgcGVlciBTRUlEcwotICogICAgICAgICAgICAgICAgICBmb3IgdGhlIGhhbmRsZXMsIGNvcGllZCBpbiBwbGFjZSBpbnRvIHRoZSBzdHJ1Y3QgcGFzc2VkIGluLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfcGVlcl9zZWlkX2xpc3QodEFWRFRfTVVMVEkqIHBfbXVsdGkpIHsKLSAgaW50IGk7Ci0gIEF2ZHRwU2NiKiBwX3NjYjsKLQotICBmb3IgKGkgPSAwOyBpIDwgcF9tdWx0aS0+bnVtX3NlcHM7IGkrKykgewotICAgIHBfc2NiID0gYXZkdF9zY2JfYnlfaGRsKHBfbXVsdGktPnNlaWRfbGlzdFtpXSk7Ci0gICAgaWYgKHBfc2NiICE9IE5VTEwpIHsKLSAgICAgIHBfbXVsdGktPnNlaWRfbGlzdFtpXSA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdmR0L2F2ZHRfc2NiX2FjdC5jYyBiL3N0YWNrL2F2ZHQvYXZkdF9zY2JfYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWE0NzA4NC4uMDAwMDAwMAotLS0gYS9zdGFjay9hdmR0L2F2ZHRfc2NiX2FjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgYWN0aW9uIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbQotICogIGNvbnRyb2wgYmxvY2sgc3RhdGUgbWFjaGluZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgImF2ZHRfaW50LmgiCi0jaW5jbHVkZSAiYXZkdGNfYXBpLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBjYWxsYmFjayBldmVudCB0aGF0IG1hdGNoZXMgYSBwYXJ0aWN1bGFyCi0gKiBzdGF0ZSBtYWNoaW5lIEFQSSByZXF1ZXN0IGV2ZW50LiAgTm90ZSB0aGF0IHN0YXRlIG1hY2hpbmUgQVBJIHJlcXVlc3QKLSAqIGV2ZW50cyBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXZlbnQgbGlzdCBzdGFydGluZyBhdCB6ZXJvLCB0aHVzCi0gKiBhbGxvd2luZyBmb3IgdGhpcyB0YWJsZS4KLSAqLwotY29uc3QgdWludDhfdCBhdmR0X3NjYl9jYmFja19ldnRbXSA9IHsKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIEFQSV9SRU1PVkVfRVZUIChubyBldmVudCkgKi8KLSAgICBBVkRUX1dSSVRFX0NGTV9FVlQsICAgIC8qIEFQSV9XUklURV9SRVFfRVZUICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBBUElfR0VUQ09ORklHX1JFUV9FVlQgKG5vIGV2ZW50KSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogQVBJX0RFTEFZX1JQVF9SRVFfRVZUIChubyBldmVudCkgKi8KLSAgICBBVkRUX09QRU5fQ0ZNX0VWVCwgICAgIC8qIEFQSV9TRVRDT05GSUdfUkVRX0VWVCAqLwotICAgIEFWRFRfT1BFTl9DRk1fRVZULCAgICAgLyogQVBJX09QRU5fUkVRX0VWVCAqLwotICAgIEFWRFRfQ0xPU0VfQ0ZNX0VWVCwgICAgLyogQVBJX0NMT1NFX1JFUV9FVlQgKi8KLSAgICBBVkRUX1JFQ09ORklHX0NGTV9FVlQsIC8qIEFQSV9SRUNPTkZJR19SRVFfRVZUICovCi0gICAgQVZEVF9TRUNVUklUWV9DRk1fRVZULCAvKiBBUElfU0VDVVJJVFlfUkVRX0VWVCAqLwotICAgIDAgICAgICAgICAgICAgICAgICAgICAgLyogQVBJX0FCT1JUX1JFUV9FVlQgKG5vIGV2ZW50KSAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2dlbl9zc3JjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIFNTUkMgbnVtYmVyIHVuaXF1ZSB0byB0aGUgc3RyZWFtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgU1NSQyB2YWx1ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDMyX3QgYXZkdF9zY2JfZ2VuX3NzcmMoQXZkdHBTY2IqIHBfc2NiKSB7Ci0gIC8qIGNvbWJpbmUgdGhlIHZhbHVlIG9mIHRoZSBtZWRpYSB0eXBlIGFuZCBjb2RlYyB0eXBlIG9mIHRoZSBTQ0IgKi8KLSAgcmV0dXJuICgodWludDMyX3QpKHBfc2NiLT5zdHJlYW1fY29uZmlnLmNmZy5jb2RlY19pbmZvWzFdIHwKLSAgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zdHJlYW1fY29uZmlnLmNmZy5jb2RlY19pbmZvWzJdKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfYWJvcnRfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBTQ0IgYW4gQVZEVF9TQ0JfQVBJX0FCT1JUX1JTUF9FVlQKLSAqICAgICAgICAgICAgICAgICAgdG8gaW5pdGlhdGUgc2VuZGluZyBvZiBhbiBhYm9ydCByZXNwb25zZSBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfYWJvcnRfY21kKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIHBfc2NiLT5yb2xlID0gQVZEVF9DTE9TRV9BQ1A7Ci0gIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9BUElfQUJPUlRfUlNQX0VWVCwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9hYm9ydF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYW4gZW1wdHkgZnVuY3Rpb247IGl0IHNlcnZlcyBhcyBhCi0gKiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyIGZvciBhIGNvbmZvcm1hbmNlIEFQSSBhY3Rpb24gZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9hYm9ydF9yc3AoVU5VU0VEX0FUVFIgQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfY2xvc2VfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBTQ0IgYW4gQVZEVF9TQ0JfQVBJX0NMT1NFX1JTUF9FVlQKLSAqICAgICAgICAgICAgICAgICAgdG8gaW5pdGlhdGUgc2VuZGluZyBvZiBhIGNsb3NlIHJlc3BvbnNlIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9jbG9zZV9jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgcF9zY2ItPnJvbGUgPSBBVkRUX0NMT1NFX0FDUDsKLSAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9DTE9TRV9SU1BfRVZULCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX2Nsb3NlX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjbG9zZV9jb2RlIHZhcmlhYmxlIHRvIHRoZSBlcnJvcgotICogICAgICAgICAgICAgICAgICBjb2RlIHJldHVybmVkIGluIHRoZSBjbG9zZSByZXNwb25zZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX2Nsb3NlX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBwX3NjYi0+Y2xvc2VfY29kZSA9IHBfZGF0YS0+bXNnLmhkci5lcnJfY29kZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9nZXRjb25maWdfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG9mCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBTQ0IgYW5kIHNlbmRzIHRoZSBTQ0IgYW4gQVZEVF9TQ0JfQVBJX0dFVENPTkZJR19SU1BfRVZUCi0gKiAgICAgICAgICAgICAgICAgIHRvIGluaXRpYXRlIHNlbmRpbmcgb2YgYSBnZXQgY29uZmlndXJhdGlvbiByZXNwb25zZSBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfZ2V0Y29uZmlnX2NtZChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBwX2RhdGEtPm1zZy5zdmNjYXAucF9jZmcgPSAmcF9zY2ItPmN1cnJfY2ZnOwotCi0gIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9BUElfR0VUQ09ORklHX1JTUF9FVlQsIHBfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfZ2V0Y29uZmlnX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBhbiBlbXB0eSBmdW5jdGlvbjsgaXQgc2VydmVzIGFzIGEKLSAqICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIgZm9yIGEgY29uZm9ybWFuY2UgQVBJIGFjdGlvbiBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX2dldGNvbmZpZ19yc3AoVU5VU0VEX0FUVFIgQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX29wZW5fY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBTQ0IgYW4gQVZEVF9TQ0JfQVBJX09QRU5fUlNQX0VWVAotICogICAgICAgICAgICAgICAgICB0byBpbml0aWF0ZSBzZW5kaW5nIG9mIGFuIG9wZW4gcmVzcG9uc2UgbWVzc2FnZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX29wZW5fY21kKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9BUElfT1BFTl9SU1BfRVZULCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX29wZW5fcmVqCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBvcGVuIHJlcXVlc3QgaGFzIGZhaWxlZC4gIEl0IGluaXRpYWxpemVzCi0gKiAgICAgICAgICAgICAgICAgIGNlcnRhaW4gU0NCIHZhcmlhYmxlcyBhbmQgc2VuZHMgYSBBVkRUX0NDQl9VTF9DTE9TRV9FVlQKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIENDQi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX29wZW5fcmVqKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIC8qIGRvIGV4YWN0bHkgc2FtZSBhcyBzZXRjb25maWcgcmVqZWN0ICovCi0gIGF2ZHRfc2NiX2hkbF9zZXRjb25maWdfcmVqKHBfc2NiLCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX29wZW5fcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIGF2ZHRfYWRfb3Blbl9yZXEoKSB0byBpbml0aWF0ZQotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIG9mIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCBmb3IgdGhpcyBzdHJlYW0uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9vcGVuX3JzcChBdmR0cFNjYiogcF9zY2IsIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICAvKiBpbml0aWF0ZSBvcGVuaW5nIG9mIHRyYW5zIGNoYW5uZWxzIGZvciB0aGlzIFNFSUQgKi8KLSAgcF9zY2ItPnJvbGUgPSBBVkRUX09QRU5fSU5UOwotICBhdmR0X2FkX29wZW5fcmVxKEFWRFRfQ0hBTl9NRURJQSwgcF9zY2ItPnBfY2NiLCBwX3NjYiwgQVZEVF9JTlQpOwotCi0gIC8qIHN0YXJ0IHRjIGNvbm5lY3QgdGltZXIgKi8KLSAgYWxhcm1fc2V0X29uX21sb29wKHBfc2NiLT50cmFuc3BvcnRfY2hhbm5lbF90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgIEFWRFRfU0NCX1RDX0NPTk5fVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGF2ZHRfc2NiX3RyYW5zcG9ydF9jaGFubmVsX3RpbWVyX3RpbWVvdXQsIHBfc2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9wa3Rfbm9fZnJhZwotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9wa3Rfbm9fZnJhZyhBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICB1aW50OF90ICpwLCAqcF9zdGFydDsKLSAgdWludDhfdCBvX3YsIG9fcCwgb194LCBvX2NjOwotICB1aW50OF90IG1fcHQ7Ci0gIHVpbnQ4X3QgbWFya2VyOwotICB1aW50MTZfdCBzZXE7Ci0gIHVpbnQzMl90IHRpbWVfc3RhbXA7Ci0gIHVpbnQxNl90IG9mZnNldDsKLSAgdWludDE2X3QgZXhfbGVuOwotICB1aW50OF90IHBhZF9sZW4gPSAwOwotICB1aW50MTZfdCBsZW4gPSBwX2RhdGEtPnBfcGt0LT5sZW47Ci0KLSAgcCA9IHBfc3RhcnQgPSAodWludDhfdCopKHBfZGF0YS0+cF9wa3QgKyAxKSArIHBfZGF0YS0+cF9wa3QtPm9mZnNldDsKLQotICAvKiBwYXJzZSBtZWRpYSBwYWNrZXQgaGVhZGVyICovCi0gIG9mZnNldCA9IDEyOwotICAvLyBBVkRUX01TR19QUlNfT0NURVQxKDEpICsgQVZEVF9NU0dfUFJTX01fUFQoMSkgKyBVSU5UMTYoMikgKyBVSU5UMzIoNCkgKyA0Ci0gIGlmIChvZmZzZXQgPiBsZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICBBVkRUX01TR19QUlNfT0NURVQxKHAsIG9fdiwgb19wLCBvX3gsIG9fY2MpOwotICBBVkRUX01TR19QUlNfTV9QVChwLCBtX3B0LCBtYXJrZXIpOwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KHNlcSwgcCk7Ci0gIEJFX1NUUkVBTV9UT19VSU5UMzIodGltZV9zdGFtcCwgcCk7Ci0gIHAgKz0gNDsKLQotICAvKiBza2lwIG92ZXIgYW55IGNzcmMncyBpbiBwYWNrZXQgKi8KLSAgb2Zmc2V0ICs9IG9fY2MgKiA0OwotICBwICs9IG9fY2MgKiA0OwotCi0gIC8qIGNoZWNrIGZvciBhbmQgc2tpcCBvdmVyIGV4dGVuc2lvbiBoZWFkZXIgKi8KLSAgaWYgKG9feCkgewotICAgIG9mZnNldCArPSA0OwotICAgIGlmIChvZmZzZXQgPiBsZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgIHAgKz0gMjsKLSAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGV4X2xlbiwgcCk7Ci0gICAgb2Zmc2V0ICs9IGV4X2xlbiAqIDQ7Ci0gICAgcCArPSBleF9sZW4gKiA0OwotICB9Ci0KLSAgLyogYWRqdXN0IGxlbmd0aCBmb3IgYW55IHBhZGRpbmcgYXQgZW5kIG9mIHBhY2tldCAqLwotICBpZiAob19wKSB7Ci0gICAgLyogcGFkZGluZyBsZW5ndGggaW4gbGFzdCBieXRlIG9mIHBhY2tldCAqLwotICAgIHBhZF9sZW4gPSAqKHBfc3RhcnQgKyBwX2RhdGEtPnBfcGt0LT5sZW4pOwotICB9Ci0KLSAgLyogZG8gc2FuaXR5IGNoZWNrICovCi0gIGlmICgob2Zmc2V0ID4gcF9kYXRhLT5wX3BrdC0+bGVuKSB8fAotICAgICAgKChwYWRfbGVuICsgb2Zmc2V0KSA+IHBfZGF0YS0+cF9wa3QtPmxlbikpIHsKLSAgICBBVkRUX1RSQUNFX1dBUk5JTkcoIkdvdCBiYWQgbWVkaWEgcGFja2V0Iik7Ci0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZGF0YS0+cF9wa3QpOwotICB9Ci0gIC8qIGFkanVzdCBvZmZzZXQgYW5kIGxlbmd0aCBhbmQgc2VuZCBpdCB1cCAqLwotICBlbHNlIHsKLSAgICBwX2RhdGEtPnBfcGt0LT5sZW4gLT0gKG9mZnNldCArIHBhZF9sZW4pOwotICAgIHBfZGF0YS0+cF9wa3QtPm9mZnNldCArPSBvZmZzZXQ7Ci0KLSAgICBpZiAocF9zY2ItPnN0cmVhbV9jb25maWcucF9zaW5rX2RhdGFfY2JhY2sgIT0gTlVMTCkgewotICAgICAgLyogcmVwb3J0IHNlcXVlbmNlIG51bWJlciAqLwotICAgICAgcF9kYXRhLT5wX3BrdC0+bGF5ZXJfc3BlY2lmaWMgPSBzZXE7Ci0gICAgICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfc2lua19kYXRhX2NiYWNrKSgKLSAgICAgICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLCBwX2RhdGEtPnBfcGt0LCB0aW1lX3N0YW1wLAotICAgICAgICAgICh1aW50OF90KShtX3B0IHwgKG1hcmtlciA8PCA3KSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9kYXRhLT5wX3BrdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybjsKLWxlbmd0aF9lcnJvcjoKLSAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE0NTAxNTYiKTsKLSAgQVZEVF9UUkFDRV9XQVJOSU5HKCIlczogaGRsIHBhY2tldCBsZW5ndGggJWQgdG9vIHNob3J0OiBtdXN0IGJlIGF0IGxlYXN0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsZW4sIG9mZnNldCk7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPnBfcGt0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9yZXBvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCogYXZkdF9zY2JfaGRsX3JlcG9ydChBdmR0cFNjYiogcF9zY2IsIHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbikgewotICB1aW50MTZfdCByZXN1bHQgPSBBVkRUX1NVQ0NFU1M7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSBwOwotICB1aW50MzJfdCBzc3JjOwotICB1aW50OF90IG9fdiwgb19wLCBvX2NjOwotICB1aW50MTZfdCBtaW5fbGVuID0gMDsKLSAgQVZEVF9SRVBPUlRfVFlQRSBwdDsKLSAgdEFWRFRfUkVQT1JUX0RBVEEgcmVwb3J0OwotCi0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBpZiAocF9zY2ItPnN0cmVhbV9jb25maWcucF9yZXBvcnRfY2JhY2spIHsKLSAgICAvKiBwYXJzZSByZXBvcnQgcGFja2V0IGhlYWRlciAqLwotICAgIG1pbl9sZW4gKz0gODsKLSAgICBpZiAobWluX2xlbiA+IGxlbikgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE0NTAxNTYiKTsKLSAgICAgIEFWRFRfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiJXM6IGhkbCBwYWNrZXQgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgIGxlbiwgbWluX2xlbik7Ci0gICAgICBnb3RvIGF2ZHRfc2NiX2hkbF9yZXBvcnRfZXhpdDsKLSAgICB9Ci0gICAgQVZEVF9NU0dfUFJTX1JQVF9PQ1RFVDEocCwgb192LCBvX3AsIG9fY2MpOwotICAgIHB0ID0gKnArKzsKLSAgICBwICs9IDI7Ci0gICAgQkVfU1RSRUFNX1RPX1VJTlQzMihzc3JjLCBwKTsKLQotICAgIHN3aXRjaCAocHQpIHsKLSAgICAgIGNhc2UgQVZEVF9SVENQX1BUX1NSOiAvKiB0aGUgcGFja2V0IHR5cGUgLSBTUiAoU2VuZGVyIFJlcG9ydCkgKi8KLSAgICAgICAgbWluX2xlbiArPSAyMDsKLSAgICAgICAgaWYgKG1pbl9sZW4gPiBsZW4pIHsKLSAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTQ1MDE1NiIpOwotICAgICAgICAgIEFWRFRfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIiVzOiBoZGwgcGFja2V0IGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVuLCBtaW5fbGVuKTsKLSAgICAgICAgICBnb3RvIGF2ZHRfc2NiX2hkbF9yZXBvcnRfZXhpdDsKLSAgICAgICAgfQotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHJlcG9ydC5zci5udHBfc2VjLCBwKTsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihyZXBvcnQuc3IubnRwX2ZyYWMsIHApOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHJlcG9ydC5zci5ydHBfdGltZSwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocmVwb3J0LnNyLnBrdF9jb3VudCwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocmVwb3J0LnNyLm9jdGV0X2NvdW50LCBwKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZEVF9SVENQX1BUX1JSOiAvKiB0aGUgcGFja2V0IHR5cGUgLSBSUiAoUmVjZWl2ZXIgUmVwb3J0KSAqLwotICAgICAgICBtaW5fbGVuICs9IDIwOwotICAgICAgICBpZiAobWluX2xlbiA+IGxlbikgewotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwMTU2Iik7Ci0gICAgICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiJXM6IGhkbCBwYWNrZXQgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAlZCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBsZW4sIG1pbl9sZW4pOwotICAgICAgICAgIGdvdG8gYXZkdF9zY2JfaGRsX3JlcG9ydF9leGl0OwotICAgICAgICB9Ci0gICAgICAgIHJlcG9ydC5yci5mcmFnX2xvc3QgPSAqcDsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihyZXBvcnQucnIucGFja2V0X2xvc3QsIHApOwotICAgICAgICByZXBvcnQucnIucGFja2V0X2xvc3QgJj0gMHhGRkZGRkY7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocmVwb3J0LnJyLnNlcV9udW1fcmN2ZCwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocmVwb3J0LnJyLmppdHRlciwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocmVwb3J0LnJyLmxzciwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocmVwb3J0LnJyLmRsc3IsIHApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVkRUX1JUQ1BfUFRfU0RFUzogLyogdGhlIHBhY2tldCB0eXBlIC0gU0RFUyAoU291cmNlIERlc2NyaXB0aW9uKSAqLwotICAgICAgICB1aW50OF90IHNkZXNfdHlwZTsKLSAgICAgICAgbWluX2xlbiArPSAxOwotICAgICAgICBpZiAobWluX2xlbiA+IGxlbikgewotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwMTU2Iik7Ci0gICAgICAgICAgQVZEVF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiJXM6IGhkbCBwYWNrZXQgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAlZCIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBsZW4sIG1pbl9sZW4pOwotICAgICAgICAgIGdvdG8gYXZkdF9zY2JfaGRsX3JlcG9ydF9leGl0OwotICAgICAgICB9Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChzZGVzX3R5cGUsIHApOwotICAgICAgICBpZiAoc2Rlc190eXBlID09IEFWRFRfUlRDUF9TREVTX0NOQU1FKSB7Ci0gICAgICAgICAgdWludDhfdCBuYW1lX2xlbmd0aDsKLSAgICAgICAgICBtaW5fbGVuICs9IDE7Ci0gICAgICAgICAgaWYgKG1pbl9sZW4gPiBsZW4pIHsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwMTU2Iik7Ci0gICAgICAgICAgICBBVkRUX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICAgIiVzOiBoZGwgcGFja2V0IGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsZW4sIG1pbl9sZW4pOwotICAgICAgICAgICAgZ290byBhdmR0X3NjYl9oZGxfcmVwb3J0X2V4aXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChuYW1lX2xlbmd0aCwgcCk7Ci0gICAgICAgICAgaWYgKG5hbWVfbGVuZ3RoID4gbGVuIC0gMiB8fCBuYW1lX2xlbmd0aCA+IEFWRFRfTUFYX0NOQU1FX1NJWkUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFWRFRfQkFEX1BBUkFNUzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQkVfU1RSRUFNX1RPX0FSUkFZKHAsICYocmVwb3J0LmNuYW1lWzBdKSwgbmFtZV9sZW5ndGgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAobWluX2xlbiArIDEgPiBsZW4pIHsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwMTU2Iik7Ci0gICAgICAgICAgICBBVkRUX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICAgIiVzOiBoZGwgcGFja2V0IGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsZW4sIG1pbl9sZW4pOwotICAgICAgICAgICAgZ290byBhdmR0X3NjYl9oZGxfcmVwb3J0X2V4aXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIEFWRFRfVFJBQ0VfV0FSTklORygiIC0gU0RFUyBTU1JDPTB4JTA4eCBzYz0lZCAlZCBsZW49JWQgJXMiLCBzc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvX2NjLCAqcCwgKihwICsgMSksIHAgKyAyKTsKLSAgICAgICAgICByZXN1bHQgPSBBVkRUX0JVU1k7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFWRFRfVFJBQ0VfRVJST1IoIkJhZCBSZXBvcnQgcGt0IC0gcGFja2V0IHR5cGU6ICVkIiwgcHQpOwotICAgICAgICByZXN1bHQgPSBBVkRUX0JBRF9QQVJBTVM7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCA9PSBBVkRUX1NVQ0NFU1MpCi0gICAgICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfcmVwb3J0X2NiYWNrKShhdmR0X3NjYl90b19oZGwocF9zY2IpLCBwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBvcnQpOwotICB9Ci1hdmR0X3NjYl9oZGxfcmVwb3J0X2V4aXQ6Ci0gIHBfc3RhcnQgKz0gbGVuOwotICByZXR1cm4gcF9zdGFydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9wa3QKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfcGt0KEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGlmIChwX2RhdGEtPnBfcGt0LT5sYXllcl9zcGVjaWZpYyA9PSBBVkRUX0NIQU5fUkVQT1JUKSB7Ci0gICAgdWludDhfdCogcCA9ICh1aW50OF90KikocF9kYXRhLT5wX3BrdCArIDEpICsgcF9kYXRhLT5wX3BrdC0+b2Zmc2V0OwotICAgIGF2ZHRfc2NiX2hkbF9yZXBvcnQocF9zY2IsIHAsIHBfZGF0YS0+cF9wa3QtPmxlbik7Ci0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZGF0YS0+cF9wa3QpOwotICB9IGVsc2UgewotICAgIGF2ZHRfc2NiX2hkbF9wa3Rfbm9fZnJhZyhwX3NjYiwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfZHJvcF9wa3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERyb3AgYW4gaW5jb21pbmcgbWVkaWEgcGFja2V0LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYKLSAqICAgICAgICAgICAgICAgICAgYSBtZWRpYSBwYWNrZXQgaXMgcmVjZWl2ZWQgaW4gYW55IHN0YXRlIGJlc2lkZXMgc3RyZWFtaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9kcm9wX3BrdChVTlVTRURfQVRUUiBBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBBVkRUX1RSQUNFX0VSUk9SKCIlcyBkcm9wcGVkIGluY29taW5nIG1lZGlhIHBhY2tldCIsIF9fZnVuY19fKTsKLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZGF0YS0+cF9wa3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3JlY29uZmlnX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIHJlY29uZmlndXJhdGlvbiBpbmRpY2F0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfcmVjb25maWdfY21kKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIC8qIGlmIGNvbW1hbmQgbm90IHN1cHBvcnRlZCAqLwotICBpZiAocF9zY2ItPnN0cmVhbV9jb25maWcubnNjX21hc2sgJiBBdmR0cFN0cmVhbUNvbmZpZzo6QVZEVF9OU0NfUkVDT05GSUcpIHsKLSAgICAvKiBzZW5kIHJlamVjdCAqLwotICAgIHBfZGF0YS0+bXNnLmhkci5lcnJfY29kZSA9IEFWRFRfRVJSX05TQzsKLSAgICBwX2RhdGEtPm1zZy5oZHIuZXJyX3BhcmFtID0gMDsKLSAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQVBJX1JFQ09ORklHX1JTUF9FVlQsIHBfZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogc3RvcmUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBwX3NjYi0+cmVxX2NmZyA9ICpwX2RhdGEtPm1zZy5yZWNvbmZpZ19jbWQucF9jZmc7Ci0KLSAgICAvKiBjYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrICovCi0gICAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksIFJhd0FkZHJlc3M6OmtFbXB0eSwgQVZEVF9SRUNPTkZJR19JTkRfRVZULAotICAgICAgICAodEFWRFRfQ1RSTCopJnBfZGF0YS0+bXNnLnJlY29uZmlnX2NtZCwgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3JlY29uZmlnX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIHJlY29uZmlndXJhdGlvbiBjb25maXJtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfcmVjb25maWdfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGlmIChwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPT0gMCkgewotICAgIC8qIHN0b3JlIG5ldyBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKHBfc2NiLT5yZXFfY2ZnLm51bV9jb2RlYyA+IDApIHsKLSAgICAgIHBfc2NiLT5jdXJyX2NmZy5udW1fY29kZWMgPSBwX3NjYi0+cmVxX2NmZy5udW1fY29kZWM7Ci0gICAgICBtZW1jcHkocF9zY2ItPmN1cnJfY2ZnLmNvZGVjX2luZm8sIHBfc2NiLT5yZXFfY2ZnLmNvZGVjX2luZm8sCi0gICAgICAgICAgICAgQVZEVF9DT0RFQ19TSVpFKTsKLSAgICB9Ci0gICAgaWYgKHBfc2NiLT5yZXFfY2ZnLm51bV9wcm90ZWN0ID4gMCkgewotICAgICAgcF9zY2ItPmN1cnJfY2ZnLm51bV9wcm90ZWN0ID0gcF9zY2ItPnJlcV9jZmcubnVtX3Byb3RlY3Q7Ci0gICAgICBtZW1jcHkocF9zY2ItPmN1cnJfY2ZnLnByb3RlY3RfaW5mbywgcF9zY2ItPnJlcV9jZmcucHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgIEFWRFRfUFJPVEVDVF9TSVpFKTsKLSAgICB9Ci0gIH0KLQotICBwX2RhdGEtPm1zZy5zdmNjYXAucF9jZmcgPSAmcF9zY2ItPmN1cnJfY2ZnOwotCi0gIC8qIGNhbGwgYXBwbGljYXRpb24gY2FsbGJhY2sgKi8KLSAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLCBSYXdBZGRyZXNzOjprRW1wdHksIEFWRFRfUkVDT05GSUdfQ0ZNX0VWVCwKLSAgICAgICh0QVZEVF9DVFJMKikmcF9kYXRhLT5tc2cuc3ZjY2FwLCBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3NlY3VyaXR5X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgd2l0aCBhCi0gKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IGluZGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9zZWN1cml0eV9jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgLyogaWYgY29tbWFuZCBub3Qgc3VwcG9ydGVkICovCi0gIGlmIChwX3NjYi0+c3RyZWFtX2NvbmZpZy5uc2NfbWFzayAmIEF2ZHRwU3RyZWFtQ29uZmlnOjpBVkRUX05TQ19TRUNVUklUWSkgewotICAgIC8qIHNlbmQgcmVqZWN0ICovCi0gICAgcF9kYXRhLT5tc2cuaGRyLmVycl9jb2RlID0gQVZEVF9FUlJfTlNDOwotICAgIGF2ZHRfc2NiX2V2ZW50KHBfc2NiLCBBVkRUX1NDQl9BUElfU0VDVVJJVFlfUlNQX0VWVCwgcF9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBjYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrICovCi0gICAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksIFJhd0FkZHJlc3M6OmtFbXB0eSwgQVZEVF9TRUNVUklUWV9JTkRfRVZULAotICAgICAgICAodEFWRFRfQ1RSTCopJnBfZGF0YS0+bXNnLnNlY3VyaXR5X2NtZCwgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3NlY3VyaXR5X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgd2l0aCBhCi0gKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IGNvbmZpcm0uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9zZWN1cml0eV9yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgLyogY2FsbCBhcHBsaWNhdGlvbiBjYWxsYmFjayAqLwotICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrKSgKLSAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksIFJhd0FkZHJlc3M6OmtFbXB0eSwgQVZEVF9TRUNVUklUWV9DRk1fRVZULAotICAgICAgKHRBVkRUX0NUUkwqKSZwX2RhdGEtPm1zZy5zZWN1cml0eV9jbWQsIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfc2V0Y29uZmlnX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBtYXJrcyB0aGUgU0NCIGFzIGluIHVzZSBhbmQgY29waWVzIHRoZQotICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGFuZCBwZWVyIFNFSUQgdG8gdGhlIFNDQi4gIEl0IHRoZW4gY2FsbHMKLSAqICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIHdpdGggYSBjb25maWd1cmF0aW9uIGluZGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9zZXRjb25maWdfY21kKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIEFWRFRfVFJBQ0VfREVCVUcoIiVzOiBwX3NjYi0+aW5fdXNlPSVkIHBfYXZkdF9zY2I9JXAgc2NiX2luZGV4PSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9zY2ItPmluX3VzZSwgcF9zY2IsIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci0KLSAgaWYgKCFwX3NjYi0+aW5fdXNlKSB7Ci0gICAgQVZEVF9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBjb2RlYzogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgQTJEUF9Db2RlY0luZm9TdHJpbmcocF9zY2ItPnN0cmVhbV9jb25maWcuY2ZnLmNvZGVjX2luZm8pLmNfc3RyKCkpOwotICAgIEFWRFRfVFJBQ0VfREVCVUcoCi0gICAgICAgICIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfZGF0YS0+bXNnLmNvbmZpZ19jbWQucF9jZmctPmNvZGVjX2luZm8pLmNfc3RyKCkpOwotICAgIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyA9IHBfZGF0YS0+bXNnLmNvbmZpZ19jbWQucF9jZmc7Ci0gICAgaWYgKEEyRFBfR2V0Q29kZWNUeXBlKHBfc2NiLT5zdHJlYW1fY29uZmlnLmNmZy5jb2RlY19pbmZvKSA9PQotICAgICAgICBBMkRQX0dldENvZGVjVHlwZShwX2NmZy0+Y29kZWNfaW5mbykpIHsKLSAgICAgIC8qIGNvcHkgaW5mbyB0byBzY2IgKi8KLSAgICAgIEF2ZHRwQ2NiKiBwX2NjYiA9IGF2ZHRfY2NiX2J5X2lkeChwX2RhdGEtPm1zZy5jb25maWdfY21kLmhkci5jY2JfaWR4KTsKLSAgICAgIGlmIChwX3NjYi0+cF9jY2IgIT0gcF9jY2IpIHsKLSAgICAgICAgQVZEVF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICIlczogbWlzbWF0Y2ggaW4gQVZEVFAgU0NCL0NDQiBzdGF0ZTogKHBfc2NiLT5wX2NjYj0lcCAhPSAiCi0gICAgICAgICAgICAicF9jY2I9JXApOiAiCi0gICAgICAgICAgICAicF9zY2I9JXAgc2NiX2hhbmRsZT0lZCBjY2JfaWR4PSVkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwX3NjYi0+cF9jY2IsIHBfY2NiLCBwX3NjYiwgcF9zY2ItPlNjYkhhbmRsZSgpLAotICAgICAgICAgICAgcF9kYXRhLT5tc2cuY29uZmlnX2NtZC5oZHIuY2NiX2lkeCk7Ci0gICAgICAgIGF2ZHRfc2NiX3Jlal9ub3RfaW5fdXNlKHBfc2NiLCBwX2RhdGEpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvKiBzZXQgc2VwIGFzIGluIHVzZSAqLwotICAgICAgcF9zY2ItPmluX3VzZSA9IHRydWU7Ci0KLSAgICAgIHBfc2NiLT5wZWVyX3NlaWQgPSBwX2RhdGEtPm1zZy5jb25maWdfY21kLmludF9zZWlkOwotICAgICAgcF9zY2ItPnJlcV9jZmcgPSAqcF9jZmc7Ci0gICAgICAvKiBjYWxsIGFwcCBjYWxsYmFjayAqLwotICAgICAgLyogaGFuZGxlIG9mIHNjYi0gd2hpY2ggaXMgc2FtZSBhcyBzZXAgaGFuZGxlIG9mIGJ0YV9hdl9jYi5wX3NjYiovCi0gICAgICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrKSgKLSAgICAgICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLAotICAgICAgICAgIHBfc2NiLT5wX2NjYiA/IHBfc2NiLT5wX2NjYi0+cGVlcl9hZGRyIDogUmF3QWRkcmVzczo6a0VtcHR5LAotICAgICAgICAgIEFWRFRfQ09ORklHX0lORF9FVlQsICh0QVZEVF9DVFJMKikmcF9kYXRhLT5tc2cuY29uZmlnX2NtZCwKLSAgICAgICAgICBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPSBBVkRUX0VSUl9VTlNVUF9DRkc7Ci0gICAgICBwX2RhdGEtPm1zZy5oZHIuZXJyX3BhcmFtID0gMDsKLSAgICAgIGF2ZHRfbXNnX3NlbmRfcmVqKGF2ZHRfY2NiX2J5X2lkeChwX2RhdGEtPm1zZy5oZHIuY2NiX2lkeCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm1zZy5oZHIuc2lnX2lkLCAmcF9kYXRhLT5tc2cpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBBVkRUX1RSQUNFX0RFQlVHKCIlczogY2FsbGluZyBhdmR0X3NjYl9yZWpfaW5fdXNlKCkiLCBfX2Z1bmNfXyk7Ci0gICAgYXZkdF9zY2JfcmVqX2luX3VzZShwX3NjYiwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3NldGNvbmZpZ19yZWoKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbWFya3MgdGhlIFNDQiBhcyBub3QgaW4gdXNlIGFuZCBjYWxscyB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FsbGJhY2sgd2l0aCBhbiBvcGVuIGNvbmZpcm0gaW5kaWNhdGluZwotICogICAgICAgICAgICAgICAgICBmYWlsdXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfc2V0Y29uZmlnX3JlaihBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICAvKiBjbGVhciBzY2IgdmFyaWFibGVzICovCi0gIGF2ZHRfc2NiX2Nscl92YXJzKHBfc2NiLCBwX2RhdGEpOwotCi0gIC8qIHRlbGwgY2NiIHdlJ3JlIGRvbmUgd2l0aCBzaWduYWxpbmcgY2hhbm5lbCAqLwotICBhdmR0X2NjYl9ldmVudChhdmR0X2NjYl9ieV9pZHgocF9kYXRhLT5tc2cuaGRyLmNjYl9pZHgpLAotICAgICAgICAgICAgICAgICBBVkRUX0NDQl9VTF9DTE9TRV9FVlQsIE5VTEwpOwotCi0gIC8qIGNhbGwgYXBwbGljYXRpb24gY2FsbGJhY2sgKi8KLSAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLCBSYXdBZGRyZXNzOjprRW1wdHksIEFWRFRfT1BFTl9DRk1fRVZULAotICAgICAgKHRBVkRUX0NUUkwqKSZwX2RhdGEtPm1zZy5oZHIsIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfc25rX2RlbGF5X3JwdF9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIGRlbGF5IHJlcG9ydCByZXF1ZXN0IG9uY2UgaXQgaXMgc2luawotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfc25rX2RlbGF5X3JwdF9yZXEoQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGlmIChwX3NjYi0+cF9jY2IgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEluIHNpbmsgbW9kZSwgcmVwb3J0IGEgZml4ZWQgZGVsYXkgdmFsdWUgd2hlbiB0aGlzIGRldmljZSBpcyB0aGUgc2luawotICAvLyBzaWRlLiBEZWxheSB2YWx1ZSBpbiB0aGlzIGZ1bmN0aW9uIGlzIGluIHVuaXQgb2YgMS8xMG1zLgotICBpZiAocF9zY2ItPnN0cmVhbV9jb25maWcudHNlcCAhPSBBVkRUX1RTRVBfU05LKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEFWRFRfU0NCX0VWVCBldnQ7Ci0gIGV2dC5hcGlkZWxheS5oZHIuc2VpZCA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0gIGV2dC5hcGlkZWxheS5kZWxheSA9IEFWRFRfU0lOS19ERUxBWV9NUyAqIDEwOwotICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQVBJX0RFTEFZX1JQVF9SRVFfRVZULCAmZXZ0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9zZXRjb25maWdfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBTQ0IgYW4gQVZEVF9TQ0JfQVBJX09QRU5fUkVRX0VWVAotICogICAgICAgICAgICAgICAgICB0byBpbml0aWF0ZSBzZW5kaW5nIG9mIGFuIG9wZW4gY29tbWFuZCBtZXNzYWdlLgotICoKLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgU0NCIGFuIEFWRFRfU0NCX0FQSV9ERUxBWV9SUFRfUkVRX0VWVAotICogICAgICAgICAgICAgICAgICB0byBpbml0aWF0ZSBzZW5kaW5nIG9mIGRlbGF5IHJlcG9ydCBjb21tYW5kIG1lc3NhZ2Ugb25seQotICogICAgICAgICAgICAgICAgICB3aGVuIHRoZSBlbmRwb2ludCB0YWtlcyBzaW5rIHJvbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9zZXRjb25maWdfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0KLSAgaWYgKHBfc2NiLT5wX2NjYiAhPSBOVUxMKSB7Ci0gICAgLyogc2F2ZSBjb25maWd1cmF0aW9uICovCi0gICAgcF9zY2ItPmN1cnJfY2ZnID0gcF9zY2ItPnJlcV9jZmc7Ci0KLSAgICAvLyBJbiBzaW5rIG1vZGUsIHJlcG9ydCBkZWxheSB2YWx1ZSB3aGVuIHRoaXMgZGV2aWNlIGluaXRpYXRlcyB0aGUgY29ubmVjdGlvbi4KLSAgICAvLyBEZWxheSByZXBvcnRpbmcgaXMgc2VudCBiZWZvcmUgb3BlbiByZXF1ZXN0IChpLmUuLCBpbiBjb25maWd1cmVkIHN0YXRlKS4KLSAgICBhdmR0X3NjYl9zbmRfc25rX2RlbGF5X3JwdF9yZXEocF9zY2IsIHBfZGF0YSk7Ci0KLSAgICBwX3NjYi0+bmVlZF9vcGVuID0gZmFsc2U7Ci0gICAgLyogQ2hlY2sgaWYgYm90aCBsb2NhbCBhbmQgU0VQIHN1cHBvcnQgQVZEVCB2ZXJzaW9uIDEuMyovCi0gICAgaWYgKEEyRFBfR2V0QXZkdHBWZXJzaW9uKCkgPj0gQVZEVF9WRVJTSU9OXzFfMyAmJgotICAgICAgKHBfc2NiLT5zdHJlYW1fY29uZmlnLmNmZy5wc2NfbWFzayAmIEFWRFRfUFNDX0RFTEFZX1JQVCkpIHsKLSAgICAgICBwX3NjYi0+bmVlZF9vcGVuID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgLyogSW5pdGlhdGUgb3BlbiAqLwotICAgICAgdEFWRFRfRVZUX0hEUiBzaW5nbGU7Ci0gICAgICBzaW5nbGUuc2VpZCA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0gICAgICB0QVZEVF9TQ0JfRVZUIGF2ZHRfc2NiX2V2dDsKLSAgICAgIGF2ZHRfc2NiX2V2dC5tc2cuc2luZ2xlID0gc2luZ2xlOwotICAgICAgYXZkdF9zY2JfZXZlbnQocF9zY2IsIEFWRFRfU0NCX0FQSV9PUEVOX1JFUV9FVlQsICZhdmR0X3NjYl9ldnQpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3N0YXJ0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgd2l0aCBhCi0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0IGluZGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9zdGFydF9jbWQoQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrKSgKLSAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksCi0gICAgICBwX3NjYi0+cF9jY2IgPyBwX3NjYi0+cF9jY2ItPnBlZXJfYWRkciA6IFJhd0FkZHJlc3M6OmtFbXB0eSwKLSAgICAgIEFWRFRfU1RBUlRfSU5EX0VWVCwgTlVMTCwgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9zdGFydF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIHdpdGggYQotICogICAgICAgICAgICAgICAgICBzdGFydCBjb25maXJtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfc3RhcnRfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gICgqcF9zY2ItPnN0cmVhbV9jb25maWcucF9hdmR0X2N0cmxfY2JhY2spKAotICAgICAgYXZkdF9zY2JfdG9faGRsKHBfc2NiKSwKLSAgICAgIHBfc2NiLT5wX2NjYiA/IHBfc2NiLT5wX2NjYi0+cGVlcl9hZGRyIDogUmF3QWRkcmVzczo6a0VtcHR5LAotICAgICAgQVZEVF9TVEFSVF9DRk1fRVZULCAodEFWRFRfQ1RSTCopJnBfZGF0YS0+bXNnLmhkciwKLSAgICAgIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfc3VzcGVuZF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIHdpdGggYSBzdXNwZW5kCi0gKiAgICAgICAgICAgICAgICAgIGluZGljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF9zdXNwZW5kX2NtZChBdmR0cFNjYiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLAotICAgICAgcF9zY2ItPnBfY2NiID8gcF9zY2ItPnBfY2NiLT5wZWVyX2FkZHIgOiBSYXdBZGRyZXNzOjprRW1wdHksCi0gICAgICBBVkRUX1NVU1BFTkRfSU5EX0VWVCwgTlVMTCwgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9zdXNwZW5kX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgd2l0aCBhIHN1c3BlbmQKLSAqICAgICAgICAgICAgICAgICAgY29uZmlybS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX3N1c3BlbmRfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gICgqcF9zY2ItPnN0cmVhbV9jb25maWcucF9hdmR0X2N0cmxfY2JhY2spKAotICAgICAgYXZkdF9zY2JfdG9faGRsKHBfc2NiKSwKLSAgICAgIHBfc2NiLT5wX2NjYiA/IHBfc2NiLT5wX2NjYi0+cGVlcl9hZGRyIDogUmF3QWRkcmVzczo6a0VtcHR5LAotICAgICAgQVZEVF9TVVNQRU5EX0NGTV9FVlQsICh0QVZEVF9DVFJMKikmcF9kYXRhLT5tc2cuaGRyLAotICAgICAgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF90Y19jbG9zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNwb3J0IGNoYW5uZWwgaXMKLSAqICAgICAgICAgICAgICAgICAgY2xvc2VkLiAgSXQgbWFya3MgdGhlIFNDQiBhcyBub3QgaW4gdXNlIGFuZAotICogICAgICAgICAgICAgICAgICBpbml0aWFsaXplcyBjZXJ0YWluIFNDQiBwYXJhbWV0ZXJzLiAgSXQgdGhlbiBzZW5kcwotICogICAgICAgICAgICAgICAgICBhbiBBVkRUX0NDQl9VTF9DTE9TRV9FVlQgdG8gdGhlIENDQiBpZiB0aGUgU0NCCi0gKiAgICAgICAgICAgICAgICAgIGluaXRpYXRlZCB0aGUgY2xvc2UuICBJdCB0aGVuIGNoZWNrcyB0byBzZWUgaWYgdGhlIFNDQgotICogICAgICAgICAgICAgICAgICBpcyB0byBiZSByZW1vdmVkLiAgSWYgaXQgaXMgaXQgZGVhbGxvY2F0ZXMgdGhlIFNDQi4KLSAqICAgICAgICAgICAgICAgICAgRmluYWxseSwgaXQgY2FsbHMgdGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIHdpdGggYSBjbG9zZQotICogICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfdGNfY2xvc2UoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdWludDhfdCBoZGwgPSBhdmR0X3NjYl90b19oZGwocF9zY2IpOwotICB0QVZEVF9DVFJMX0NCQUNLKiBwX2F2ZHRfY3RybF9jYmFjayA9IHBfc2NiLT5zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrOwotICB0QVZEVF9DVFJMIGF2ZHRfY3RybDsKLSAgdWludDhfdCBldmVudDsKLSAgQXZkdHBDY2IqIHBfY2NiID0gcF9zY2ItPnBfY2NiOwotICBSYXdBZGRyZXNzIHJlbW90ZV9hZGRyID0gcF9jY2ItPnBlZXJfYWRkcjsKLSAgdWludDhfdCBzY2JfaW5kZXggPSBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXg7Ci0KLSAgLyogc2V0IHVwIGhkciAqLwotICBhdmR0X2N0cmwuaGRyLmVycl9jb2RlID0gcF9zY2ItPmNsb3NlX2NvZGU7Ci0KLSAgLyogY2xlYXIgc2VwIHZhcmlhYmxlcyAqLwotICBhdmR0X3NjYl9jbHJfdmFycyhwX3NjYiwgcF9kYXRhKTsKLSAgcF9zY2ItPm1lZGlhX3NlcSA9IDA7Ci0gIHBfc2NiLT5jb25nID0gZmFsc2U7Ci0KLSAgLyogZnJlZSBwa3Qgd2UncmUgaG9sZGluZywgaWYgYW55ICovCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3NjYi0+cF9wa3QpOwotCi0gIGFsYXJtX2NhbmNlbChwX3NjYi0+dHJhbnNwb3J0X2NoYW5uZWxfdGltZXIpOwotCi0gIGlmICgocF9zY2ItPnJvbGUgPT0gQVZEVF9DTE9TRV9JTlQpIHx8IChwX3NjYi0+cm9sZSA9PSBBVkRUX09QRU5fSU5UKSkgewotICAgIC8qIHRlbGwgY2NiIHdlJ3JlIGRvbmUgd2l0aCBzaWduYWxpbmcgY2hhbm5lbCAqLwotICAgIGF2ZHRfY2NiX2V2ZW50KHBfY2NiLCBBVkRUX0NDQl9VTF9DTE9TRV9FVlQsIE5VTEwpOwotICB9Ci0gIGV2ZW50ID0KLSAgICAgIChwX3NjYi0+cm9sZSA9PSBBVkRUX0NMT1NFX0lOVCkgPyBBVkRUX0NMT1NFX0NGTV9FVlQgOiBBVkRUX0NMT1NFX0lORF9FVlQ7Ci0gIHBfc2NiLT5yb2xlID0gQVZEVF9DTE9TRV9BQ1A7Ci0KLSAgaWYgKHBfc2NiLT5yZW1vdmUpIHsKLSAgICBhdmR0X3NjYl9kZWFsbG9jKHBfc2NiLCBOVUxMKTsKLSAgfQotCi0gIC8qIGNhbGwgYXBwIGNhbGxiYWNrICovCi0gICgqcF9hdmR0X2N0cmxfY2JhY2spKGhkbCwgcmVtb3RlX2FkZHIsIGV2ZW50LCAmYXZkdF9jdHJsLCBzY2JfaW5kZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2Jfc25kX2RlbGF5X3JwdF9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIHdpdGggYSBkZWxheQotICogICAgICAgICAgICAgICAgICByZXBvcnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3NuZF9kZWxheV9ycHRfcmVxKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGlmIChwX3NjYi0+c3RyZWFtX2NvbmZpZy5jZmcucHNjX21hc2sgJiBBVkRUX1BTQ19ERUxBWV9SUFQpIHsKLSAgICBhdmR0X21zZ19zZW5kX2NtZChwX3NjYi0+cF9jY2IsIHBfc2NiLCBBVkRUX1NJR19ERUxBWV9SUFQsCi0gICAgICAgICAgICAgICAgICAgICAgKHRBVkRUX01TRyopJnBfZGF0YS0+YXBpZGVsYXkpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfZGVsYXlfcnB0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgd2l0aCBhIGRlbGF5Ci0gKiAgICAgICAgICAgICAgICAgIHJlcG9ydC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX2RlbGF5X3JwdF9jbWQoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLAotICAgICAgcF9zY2ItPnBfY2NiID8gcF9zY2ItPnBfY2NiLT5wZWVyX2FkZHIgOiBSYXdBZGRyZXNzOjprRW1wdHksCi0gICAgICBBVkRUX0RFTEFZX1JFUE9SVF9FVlQsICh0QVZEVF9DVFJMKikmcF9kYXRhLT5tc2cuaGRyLAotICAgICAgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLSAgaWYgKHBfc2NiLT5wX2NjYikgewotICAgIGF2ZHRfbXNnX3NlbmRfcnNwKHBfc2NiLT5wX2NjYiwgQVZEVF9TSUdfREVMQVlfUlBULCAmcF9kYXRhLT5tc2cpOwotICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgb3BlbiBzdHJlYW0gYWZ0ZXIgc2V0X2NvbmZpZyAqLwotICAgIGlmIChwX3NjYi0+bmVlZF9vcGVuKSB7Ci0gICAgICAvKiBJbml0aWF0ZSBvcGVuICovCi0gICAgICB0QVZEVF9FVlRfSERSIHNpbmdsZTsKLSAgICAgIHNpbmdsZS5zZWlkID0gcF9zY2ItPnBlZXJfc2VpZDsKLSAgICAgIHRBVkRUX1NDQl9FVlQgYXZkdF9zY2JfZXZ0OwotICAgICAgYXZkdF9zY2JfZXZ0Lm1zZy5zaW5nbGUgPSBzaW5nbGU7Ci0gICAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfQVBJX09QRU5fUkVRX0VWVCwgJmF2ZHRfc2NiX2V2dCk7Ci0gICAgICAvKiBDbGVhciBmbGFnICovCi0gICAgICBwX3NjYi0+bmVlZF9vcGVuID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgICBhdmR0X3NjYl9yZWpfbm90X2luX3VzZShwX3NjYiwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF9kZWxheV9ycHRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayB3aXRoIGEgZGVsYXkKLSAqICAgICAgICAgICAgICAgICAgcmVwb3J0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfZGVsYXlfcnB0X3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrKSgKLSAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksCi0gICAgICBwX3NjYi0+cF9jY2IgPyBwX3NjYi0+cF9jY2ItPnBlZXJfYWRkciA6IFJhd0FkZHJlc3M6OmtFbXB0eSwKLSAgICAgIEFWRFRfREVMQVlfUkVQT1JUX0NGTV9FVlQsICh0QVZEVF9DVFJMKikmcF9kYXRhLT5tc2cuaGRyLAotICAgICAgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2hkbF90Y19jbG9zZV9zdG8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBjaGFubmVsIGlzIGNsb3NlZCBpbiBPUEVOCi0gKiAgICAgICAgICAgICAgICAgIHN0YXRlLiAgQ2hlY2sgdGhlIGNoYW5uZWwgdHlwZSBhbmQgcHJvY2VzcyBhY2NvcmRpbmdseS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfaGRsX3RjX2Nsb3NlX3N0byhBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9DVFJMIGF2ZHRfY3RybDsKLSAgLyogQVZEVF9DSEFOX1NJRyBkb2VzIG5vdCB2aXNpdCB0aGlzIGFjdGlvbiAqLwotICBpZiAocF9kYXRhICYmIHBfZGF0YS0+Y2xvc2UudHlwZSAhPSBBVkRUX0NIQU5fTUVESUEpIHsKLSAgICAvKiBpdCdzIHJlcG9ydGluZyBvciByZWNvdmVyeSBjaGFubmVsLAotICAgICAqIHRoZSBjaGFubmVsIGNsb3NlIGluIG9wZW4gc3RhdGUgbWVhbnMgdGhlIHBlZXIgZG9lcyBub3Qgc3VwcG9ydCBpdCAqLwotICAgIGlmIChwX2RhdGEtPmNsb3NlLm9sZF90Y19zdGF0ZSA9PSBBVkRUX0FEX1NUX09QRU4pIHsKLSAgICAgIGF2ZHRfY3RybC5oZHIuZXJyX2NvZGUgPSAwOwotICAgICAgYXZkdF9jdHJsLmhkci5lcnJfcGFyYW0gPSAwOwotICAgICAgLyogY2FsbCBhcHAgY2FsbGJhY2sgKi8KLSAgICAgICgqcF9zY2ItPnN0cmVhbV9jb25maWcucF9hdmR0X2N0cmxfY2JhY2spKAotICAgICAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksCi0gICAgICAgICAgcF9zY2ItPnBfY2NiID8gcF9zY2ItPnBfY2NiLT5wZWVyX2FkZHIgOiBSYXdBZGRyZXNzOjprRW1wdHksCi0gICAgICAgICAgQVZEVF9SRVBPUlRfRElTQ09OTl9FVlQsICZhdmR0X2N0cmwsIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIG11c3QgYmUgaW4gT1BFTiBzdGF0ZS4gbmVlZCB0byBnbyBiYWNrIHRvIGlkbGUgKi8KLSAgICBhdmR0X3NjYl9ldmVudChwX3NjYiwgQVZEVF9TQ0JfTVNHX0FCT1JUX1JTUF9FVlQsIE5VTEwpOwotICAgIGF2ZHRfc2NiX2hkbF90Y19jbG9zZShwX3NjYiwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3RjX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHRyYW5zcG9ydCBjaGFubmVsIGlzCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5lZCB3aGlsZSBpbiB0aGUgb3BlbmluZyBzdGF0ZS4gIEl0IGNhbGxzIHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYWxsYmFjayB3aXRoIGFuIG9wZW4gaW5kaWNhdGlvbiBvciBvcGVuCi0gKiAgICAgICAgICAgICAgICAgIGNvbmZpcm0gZGVwZW5kaW5nIG9uIHdobyBpbml0aWF0ZWQgdGhlIG9wZW4gcHJvY2VkdXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfdGNfb3BlbihBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICB1aW50OF90IGV2ZW50OwotICB1aW50OF90IHJvbGU7Ci0KLSAgYWxhcm1fY2FuY2VsKHBfc2NiLT50cmFuc3BvcnRfY2hhbm5lbF90aW1lcik7Ci0KLSAgZXZlbnQgPQotICAgICAgKHBfc2NiLT5yb2xlID09IEFWRFRfT1BFTl9JTlQpID8gQVZEVF9PUEVOX0NGTV9FVlQgOiBBVkRUX09QRU5fSU5EX0VWVDsKLSAgcF9kYXRhLT5vcGVuLmhkci5lcnJfY29kZSA9IDA7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IHBzY19tYXNrOiBjZmc6IDB4JXgsIHJlcToweCV4LCBjdXI6IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBwX3NjYi0+c3RyZWFtX2NvbmZpZy5jZmcucHNjX21hc2ssIHBfc2NiLT5yZXFfY2ZnLnBzY19tYXNrLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5jdXJyX2NmZy5wc2NfbWFzayk7Ci0gIGlmIChwX3NjYi0+Y3Vycl9jZmcucHNjX21hc2sgJiBBVkRUX1BTQ19SRVBPUlQpIHsKLSAgICAvKiBvcGVuIHRoZSByZXBvcnRpbmcgY2hhbm5lbCwgaWYgYm90aCBkZXZpY2VzIHN1cHBvcnQgaXQgKi8KLSAgICByb2xlID0gKHBfc2NiLT5yb2xlID09IEFWRFRfT1BFTl9JTlQpID8gQVZEVF9JTlQgOiBBVkRUX0FDUDsKLSAgICBhdmR0X2FkX29wZW5fcmVxKEFWRFRfQ0hBTl9SRVBPUlQsIHBfc2NiLT5wX2NjYiwgcF9zY2IsIHJvbGUpOwotICB9Ci0KLSAgLyogY2FsbCBhcHAgY2FsbGJhY2sgKi8KLSAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLAotICAgICAgcF9zY2ItPnBfY2NiID8gcF9zY2ItPnBfY2NiLT5wZWVyX2FkZHIgOiBSYXdBZGRyZXNzOjprRW1wdHksIGV2ZW50LAotICAgICAgKHRBVkRUX0NUUkwqKSZwX2RhdGEtPm9wZW4sIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9oZGxfdGNfb3Blbl9zdG8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHRyYW5zcG9ydCBjaGFubmVsIGlzCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5lZCB3aGlsZSBpbiB0aGUgb3BlbmluZyBzdGF0ZS4gIEl0IGNhbGxzIHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYWxsYmFjayB3aXRoIGFuIG9wZW4gaW5kaWNhdGlvbiBvciBvcGVuCi0gKiAgICAgICAgICAgICAgICAgIGNvbmZpcm0gZGVwZW5kaW5nIG9uIHdobyBpbml0aWF0ZWQgdGhlIG9wZW4gcHJvY2VkdXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9oZGxfdGNfb3Blbl9zdG8oQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWRFRfQ1RSTCBhdmR0X2N0cmw7Ci0gIC8qIG9wZW4gcmVwb3J0aW5nIGNoYW5uZWwgaGVyZSwgd2hlbiBpdCBpcyBpbXBsZW1lbnRlZCAqLwotCi0gIC8qIGNhbGwgYXBwIGNhbGxiYWNrICovCi0gIGlmIChwX2RhdGEtPm9wZW4uaGRyLmVycl9jb2RlID09IEFWRFRfQ0hBTl9SRVBPUlQpIHsKLSAgICBhdmR0X2N0cmwuaGRyLmVycl9jb2RlID0gMDsKLSAgICBhdmR0X2N0cmwuaGRyLmVycl9wYXJhbSA9IDE7Ci0gICAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksCi0gICAgICAgIHBfc2NiLT5wX2NjYiA/IHBfc2NiLT5wX2NjYi0+cGVlcl9hZGRyIDogUmF3QWRkcmVzczo6a0VtcHR5LAotICAgICAgICBBVkRUX1JFUE9SVF9DT05OX0VWVCwgJmF2ZHRfY3RybCwgcF9zY2ItPnN0cmVhbV9jb25maWcuc2NiX2luZGV4KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfaGRsX3dyaXRlX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgbWVkaWEgcGFja2V0IGN1cnJlbnRseSBzdG9yZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIFNDQiwgaWYgYW55LiAgVGhlbiBpdCBidWlsZHMgYSBuZXcgbWVkaWEgcGFja2V0IGZyb20KLSAqICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgcGFzc2VkIGluIGJ1ZmZlciBhbmQgc3RvcmVzIGl0IGluIHRoZSBTQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2hkbF93cml0ZV9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcDsKLSAgdWludDMyX3Qgc3NyYzsKLSAgYm9vbCBhZGRfcnRwX2hlYWRlciA9ICEocF9kYXRhLT5hcGl3cml0ZS5vcHQgJiBBVkRUX0RBVEFfT1BUX05PX1JUUCk7Ci0KLSAgLyogZnJlZSBwYWNrZXQgd2UncmUgaG9sZGluZywgaWYgYW55OyB0byBiZSByZXBsYWNlZCB3aXRoIG5ldyAqLwotICBpZiAocF9zY2ItPnBfcGt0ICE9IE5VTEwpIHsKLSAgICAvKiB0aGlzIHNob3VsZG4ndCBiZSBoYXBwZW5pbmcgKi8KLSAgICBBVkRUX1RSQUNFX1dBUk5JTkcoIkRyb3BwZWQgbWVkaWEgcGFja2V0OyBjb25nZXN0ZWQiKTsKLSAgfQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9zY2ItPnBfcGt0KTsKLQotICAvKiBSZWNvbXB1dGUgb25seSBpZiB0aGUgUlRQIGhlYWRlciB3YXNuJ3QgZGlzYWJsZWQgYnkgdGhlIEFQSSAqLwotICBpZiAoYWRkX3J0cF9oZWFkZXIpIHsKLSAgICBib29sIGlzX2NvbnRlbnRfcHJvdGVjdGlvbiA9IChwX3NjYi0+Y3Vycl9jZmcubnVtX3Byb3RlY3QgPiAwKTsKLSAgICBhZGRfcnRwX2hlYWRlciA9Ci0gICAgICAgIEEyRFBfVXNlc1J0cEhlYWRlcihpc19jb250ZW50X3Byb3RlY3Rpb24sIHBfc2NiLT5jdXJyX2NmZy5jb2RlY19pbmZvKTsKLSAgfQotCi0gIC8qIEJ1aWxkIGEgbWVkaWEgcGFja2V0LCBhbmQgYWRkIGFuIFJUUCBoZWFkZXIgaWYgcmVxdWlyZWQuICovCi0gIGlmIChhZGRfcnRwX2hlYWRlcikgewotICAgIHNzcmMgPSBhdmR0X3NjYl9nZW5fc3NyYyhwX3NjYik7Ci0KLSAgICBwX2RhdGEtPmFwaXdyaXRlLnBfYnVmLT5sZW4gKz0gQVZEVF9NRURJQV9IRFJfU0laRTsKLSAgICBwX2RhdGEtPmFwaXdyaXRlLnBfYnVmLT5vZmZzZXQgLT0gQVZEVF9NRURJQV9IRFJfU0laRTsKLSAgICBwX3NjYi0+bWVkaWFfc2VxKys7Ci0gICAgcCA9ICh1aW50OF90KikocF9kYXRhLT5hcGl3cml0ZS5wX2J1ZiArIDEpICsgcF9kYXRhLT5hcGl3cml0ZS5wX2J1Zi0+b2Zmc2V0OwotCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEFWRFRfTUVESUFfT0NURVQxKTsKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgcF9kYXRhLT5hcGl3cml0ZS5tX3B0KTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIHBfc2NiLT5tZWRpYV9zZXEpOwotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocCwgcF9kYXRhLT5hcGl3cml0ZS50aW1lX3N0YW1wKTsKLSAgICBVSU5UMzJfVE9fQkVfU1RSRUFNKHAsIHNzcmMpOwotICB9Ci0KLSAgLyogc3RvcmUgaXQgKi8KLSAgcF9zY2ItPnBfcGt0ID0gcF9kYXRhLT5hcGl3cml0ZS5wX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3NuZF9hYm9ydF9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gYWJvcnQgY29tbWFuZCBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfYWJvcnRfcmVxKEF2ZHRwU2NiKiBwX3NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgdEFWRFRfRVZUX0hEUiBoZHI7Ci0KLSAgQVZEVF9UUkFDRV9ERUJVRygiJXM6IHBfc2NiLT5wX2NjYj0lcCIsIF9fZnVuY19fLCBwX3NjYi0+cF9jY2IpOwotCi0gIGlmIChwX3NjYi0+cF9jY2IgIT0gTlVMTCkgewotICAgIHBfc2NiLT5yb2xlID0gQVZEVF9DTE9TRV9JTlQ7Ci0KLSAgICBoZHIuc2VpZCA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0KLSAgICB0QVZEVF9NU0cgYXZkdF9tc2c7Ci0gICAgYXZkdF9tc2cuaGRyID0gaGRyOwotICAgIGF2ZHRfbXNnX3NlbmRfY21kKHBfc2NiLT5wX2NjYiwgcF9zY2IsIEFWRFRfU0lHX0FCT1JULCAmYXZkdF9tc2cpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfYWJvcnRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIGFib3J0IHJlc3BvbnNlIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3NuZF9hYm9ydF9yc3AoVU5VU0VEX0FUVFIgQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBhdmR0X21zZ19zZW5kX3JzcChhdmR0X2NjYl9ieV9pZHgocF9kYXRhLT5tc2cuaGRyLmNjYl9pZHgpLCBBVkRUX1NJR19BQk9SVCwKLSAgICAgICAgICAgICAgICAgICAgJnBfZGF0YS0+bXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3NuZF9jbG9zZV9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBjbG9zZSBjb21tYW5kIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3NuZF9jbG9zZV9yZXEoQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9FVlRfSERSIGhkcjsKLQotICBwX3NjYi0+cm9sZSA9IEFWRFRfQ0xPU0VfSU5UOwotCi0gIGhkci5zZWlkID0gcF9zY2ItPnBlZXJfc2VpZDsKLQotICB0QVZEVF9NU0cgYXZkdF9tc2c7Ci0gIGF2ZHRfbXNnLmhkciA9IGhkcjsKLSAgYXZkdF9tc2dfc2VuZF9jbWQocF9zY2ItPnBfY2NiLCBwX3NjYiwgQVZEVF9TSUdfQ0xPU0UsICZhdmR0X21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfc3RyZWFtX2Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgY2xvc2UgY29tbWFuZCBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfc3RyZWFtX2Nsb3NlKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3NjYi0+cF9wa3QpOwotICBhdmR0X3NjYl9zbmRfY2xvc2VfcmVxKHBfc2NiLCBwX2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2Jfc25kX2Nsb3NlX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGNsb3NlIHJlc3BvbnNlIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3NuZF9jbG9zZV9yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgYXZkdF9tc2dfc2VuZF9yc3AocF9zY2ItPnBfY2NiLCBBVkRUX1NJR19DTE9TRSwgJnBfZGF0YS0+bXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3NuZF9nZXRjb25maWdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZ2V0IGNvbmZpZ3VyYXRpb24gY29tbWFuZCBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfZ2V0Y29uZmlnX3JlcShBdmR0cFNjYiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9FVlRfSERSIGhkcjsKLQotICBoZHIuc2VpZCA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0KLSAgdEFWRFRfTVNHIGF2ZHRfbXNnOwotICBhdmR0X21zZy5oZHIgPSBoZHI7Ci0gIGF2ZHRfbXNnX3NlbmRfY21kKHBfc2NiLT5wX2NjYiwgcF9zY2IsIEFWRFRfU0lHX0dFVENPTkZJRywgJmF2ZHRfbXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3NuZF9nZXRjb25maWdfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZ2V0IGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgbWVzc2FnZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2Jfc25kX2dldGNvbmZpZ19yc3AoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgYXZkdF9tc2dfc2VuZF9yc3AocF9zY2ItPnBfY2NiLCBBVkRUX1NJR19HRVRDT05GSUcsICZwX2RhdGEtPm1zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfb3Blbl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gb3BlbiBjb21tYW5kIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3NuZF9vcGVuX3JlcShBdmR0cFNjYiogcF9zY2IsIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICB0QVZEVF9FVlRfSERSIGhkcjsKLQotICBoZHIuc2VpZCA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0KLSAgdEFWRFRfTVNHIGF2ZHRfbXNnOwotICBhdmR0X21zZy5oZHIgPSBoZHI7Ci0gIGF2ZHRfbXNnX3NlbmRfY21kKHBfc2NiLT5wX2NjYiwgcF9zY2IsIEFWRFRfU0lHX09QRU4sICZhdmR0X21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfb3Blbl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gb3BlbiByZXNwb25zZSBtZXNzYWdlLiAgSXQgYWxzbwotICogICAgICAgICAgICAgICAgICBjYWxscyBhdmR0X2FkX29wZW5fcmVxKCkgdG8gYWNjZXB0IGEgdHJhbnNwb3J0IGNoYW5uZWwKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2Jfc25kX29wZW5fcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIC8qIG5vdGlmeSBhZGFwdGlvbiB0aGF0IHdlJ3JlIHdhaXRpbmcgZm9yIHRyYW5zcG9ydCBjaGFubmVsIG9wZW4gKi8KLSAgcF9zY2ItPnJvbGUgPSBBVkRUX09QRU5fQUNQOwotICBhdmR0X2FkX29wZW5fcmVxKEFWRFRfQ0hBTl9NRURJQSwgcF9zY2ItPnBfY2NiLCBwX3NjYiwgQVZEVF9BQ1ApOwotCi0gIC8qIHNlbmQgcmVzcG9uc2UgKi8KLSAgYXZkdF9tc2dfc2VuZF9yc3AocF9zY2ItPnBfY2NiLCBBVkRUX1NJR19PUEVOLCAmcF9kYXRhLT5tc2cpOwotCi0gIGFsYXJtX3NldF9vbl9tbG9vcChwX3NjYi0+dHJhbnNwb3J0X2NoYW5uZWxfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICBBVkRUX1NDQl9UQ19DT05OX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICBhdmR0X3NjYl90cmFuc3BvcnRfY2hhbm5lbF90aW1lcl90aW1lb3V0LCBwX3NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfcmVjb25maWdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0b3JlcyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluIHRoZQotICogICAgICAgICAgICAgICAgICBTQ0IgYW5kIHNlbmRzIGEgcmVjb25maWd1cmF0aW9uIGNvbW1hbmQgbWVzc2FnZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2Jfc25kX3JlY29uZmlnX3JlcShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBBVkRUX1RSQUNFX0RFQlVHKCIlczogcF9zY2ItPnBlZXJfc2VpZD0lZCBwX2RhdGEtPm1zZy5oZHIuc2VpZD0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHBfc2NiLT5wZWVyX3NlaWQsIHBfZGF0YS0+bXNnLmhkci5zZWlkKTsKLSAgQVZEVF9UUkFDRV9ERUJVRygKLSAgICAgICIlczogY29kZWM6ICVzIiwgX19mdW5jX18sCi0gICAgICBBMkRQX0NvZGVjSW5mb1N0cmluZyhwX2RhdGEtPm1zZy5jb25maWdfY21kLnBfY2ZnLT5jb2RlY19pbmZvKS5jX3N0cigpKTsKLQotICBwX3NjYi0+cmVxX2NmZyA9ICpwX2RhdGEtPm1zZy5jb25maWdfY21kLnBfY2ZnOwotICBwX2RhdGEtPm1zZy5oZHIuc2VpZCA9IHBfc2NiLT5wZWVyX3NlaWQ7Ci0gIGF2ZHRfbXNnX3NlbmRfY21kKHBfc2NiLT5wX2NjYiwgcF9zY2IsIEFWRFRfU0lHX1JFQ09ORklHLCAmcF9kYXRhLT5tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2Jfc25kX3JlY29uZmlnX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgU0NCIGFuZCBzZW5kcyBhIHJlY29uZmlndXJhdGlvbiByZXNwb25zZSBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfcmVjb25maWdfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGlmIChwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPT0gMCkgewotICAgIC8qIHN0b3JlIG5ldyBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKHBfc2NiLT5yZXFfY2ZnLm51bV9jb2RlYyA+IDApIHsKLSAgICAgIHBfc2NiLT5jdXJyX2NmZy5udW1fY29kZWMgPSBwX3NjYi0+cmVxX2NmZy5udW1fY29kZWM7Ci0gICAgICBtZW1jcHkocF9zY2ItPmN1cnJfY2ZnLmNvZGVjX2luZm8sIHBfc2NiLT5yZXFfY2ZnLmNvZGVjX2luZm8sCi0gICAgICAgICAgICAgQVZEVF9DT0RFQ19TSVpFKTsKLSAgICB9Ci0gICAgaWYgKHBfc2NiLT5yZXFfY2ZnLm51bV9wcm90ZWN0ID4gMCkgewotICAgICAgcF9zY2ItPmN1cnJfY2ZnLm51bV9wcm90ZWN0ID0gcF9zY2ItPnJlcV9jZmcubnVtX3Byb3RlY3Q7Ci0gICAgICBtZW1jcHkocF9zY2ItPmN1cnJfY2ZnLnByb3RlY3RfaW5mbywgcF9zY2ItPnJlcV9jZmcucHJvdGVjdF9pbmZvLAotICAgICAgICAgICAgIEFWRFRfUFJPVEVDVF9TSVpFKTsKLSAgICB9Ci0KLSAgICAvKiBzZW5kIHJlc3BvbnNlICovCi0gICAgYXZkdF9tc2dfc2VuZF9yc3AocF9zY2ItPnBfY2NiLCBBVkRUX1NJR19SRUNPTkZJRywgJnBfZGF0YS0+bXNnKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBzZW5kIHJlamVjdCAqLwotICAgIGF2ZHRfbXNnX3NlbmRfcmVqKHBfc2NiLT5wX2NjYiwgQVZEVF9TSUdfUkVDT05GSUcsICZwX2RhdGEtPm1zZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3NuZF9zZWN1cml0eV9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzZWN1cml0eSBjb21tYW5kIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3NuZF9zZWN1cml0eV9yZXEoQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgcF9kYXRhLT5tc2cuaGRyLnNlaWQgPSBwX3NjYi0+cGVlcl9zZWlkOwotICBhdmR0X21zZ19zZW5kX2NtZChwX3NjYi0+cF9jY2IsIHBfc2NiLCBBVkRUX1NJR19TRUNVUklUWSwgJnBfZGF0YS0+bXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3NuZF9zZWN1cml0eV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzZWN1cml0eSByZXNwb25zZSBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfc2VjdXJpdHlfcnNwKEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIGlmIChwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPT0gMCkgewotICAgIGF2ZHRfbXNnX3NlbmRfcnNwKHBfc2NiLT5wX2NjYiwgQVZEVF9TSUdfU0VDVVJJVFksICZwX2RhdGEtPm1zZyk7Ci0gIH0gZWxzZSB7Ci0gICAgYXZkdF9tc2dfc2VuZF9yZWoocF9zY2ItPnBfY2NiLCBBVkRUX1NJR19TRUNVUklUWSwgJnBfZGF0YS0+bXNnKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2Jfc25kX3NldGNvbmZpZ19yZWoKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbWFya3MgdGhlIFNDQiBhcyBub3QgaW4gdXNlIGFuZCBzZW5kcyBhCi0gKiAgICAgICAgICAgICAgICAgIHNldCBjb25maWd1cmF0aW9uIHJlamVjdCBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JlaihBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBpZiAocF9zY2ItPnBfY2NiICE9IE5VTEwpIHsKLSAgICBhdmR0X21zZ19zZW5kX3JlaihwX3NjYi0+cF9jY2IsIEFWRFRfU0lHX1NFVENPTkZJRywgJnBfZGF0YS0+bXNnKTsKLQotICAgIC8qIGNsZWFyIHNjYiB2YXJpYWJsZXMgKi8KLSAgICBhdmR0X3NjYl9jbHJfdmFycyhwX3NjYiwgcF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2Jfc25kX3NldGNvbmZpZ19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbWFya3MgdGhlIFNDQiBhcyBpbiB1c2UgYW5kIGNvcGllcyB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHRvIHRoZSBTQ0IuICBUaGVuIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBzZW5kcyBhIHNldCBjb25maWd1cmF0aW9uIGNvbW1hbmQgbWVzc2FnZSBhbmQgaW5pdGlhdGVzCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5pbmcgb2YgdGhlIHNpZ25hbGluZyBjaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JlcShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBBVkRUX1RSQUNFX0RFQlVHKAotICAgICAgIiVzOiBjb2RlYzogJXMiLCBfX2Z1bmNfXywKLSAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKHBfZGF0YS0+bXNnLmNvbmZpZ19jbWQucF9jZmctPmNvZGVjX2luZm8pLmNfc3RyKCkpOwotCi0gIC8qIGNvcHkgQVBJIHBhcmFtZXRlcnMgdG8gc2NiLCBzZXQgc2NiIGFzIGluIHVzZSAqLwotCi0gIEF2ZHRwQ2NiKiBwX2NjYiA9IGF2ZHRfY2NiX2J5X2lkeChwX2RhdGEtPm1zZy5jb25maWdfY21kLmhkci5jY2JfaWR4KTsKLSAgaWYgKHBfc2NiLT5wX2NjYiAhPSBwX2NjYikgewotICAgIEFWRFRfVFJBQ0VfRVJST1IoCi0gICAgICAgICIlczogbWlzbWF0Y2ggaW4gQVZEVFAgU0NCL0NDQiBzdGF0ZTogKHBfc2NiLT5wX2NjYj0lcCAhPSBwX2NjYj0lcCk6ICIKLSAgICAgICAgInBfc2NiPSVwIHNjYl9oYW5kbGU9JWQgY2NiX2lkeD0lZCIsCi0gICAgICAgIF9fZnVuY19fLCBwX3NjYi0+cF9jY2IsIHBfY2NiLCBwX3NjYiwgcF9zY2ItPlNjYkhhbmRsZSgpLAotICAgICAgICBwX2RhdGEtPm1zZy5jb25maWdfY21kLmhkci5jY2JfaWR4KTsKLSAgICBhdmR0X3NjYl9yZWpfbm90X2luX3VzZShwX3NjYiwgcF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcF9zY2ItPmluX3VzZSA9IHRydWU7Ci0gIHBfc2NiLT5wZWVyX3NlaWQgPSBwX2RhdGEtPm1zZy5jb25maWdfY21kLmhkci5zZWlkOwotICBwX3NjYi0+cmVxX2NmZyA9ICpwX2RhdGEtPm1zZy5jb25maWdfY21kLnBfY2ZnOwotCi0gIGF2ZHRfbXNnX3NlbmRfY21kKHBfc2NiLT5wX2NjYiwgcF9zY2IsIEFWRFRfU0lHX1NFVENPTkZJRywgJnBfZGF0YS0+bXNnKTsKLQotICAvKiB0ZWxsIGNjYiB0byBvcGVuIGNoYW5uZWwgKi8KLSAgYXZkdF9jY2JfZXZlbnQocF9zY2ItPnBfY2NiLCBBVkRUX0NDQl9VTF9PUEVOX0VWVCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGludG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgc2VuZHMgYSBzZXQgY29uZmlndXJhdGlvbgotICogICAgICAgICAgICAgICAgICByZXNwb25zZSBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfc2V0Y29uZmlnX3JzcChBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBpZiAocF9zY2ItPnBfY2NiICE9IE5VTEwpIHsKLSAgICBwX3NjYi0+Y3Vycl9jZmcgPSBwX3NjYi0+cmVxX2NmZzsKLQotICAgIGF2ZHRfbXNnX3NlbmRfcnNwKHBfc2NiLT5wX2NjYiwgQVZEVF9TSUdfU0VUQ09ORklHLCAmcF9kYXRhLT5tc2cpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zbmRfdGNfY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgYXZkdF9hZF9jbG9zZV9yZXEoKSB0byBjbG9zZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGNoYW5uZWwgZm9yIHRoaXMgU0NCLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zbmRfdGNfY2xvc2UoQXZkdHBTY2IqIHBfc2NiLCBVTlVTRURfQVRUUiB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgaWYgKHBfc2NiLT5jdXJyX2NmZy5wc2NfbWFzayAmIEFWRFRfUFNDX1JFUE9SVCkKLSAgICBhdmR0X2FkX2Nsb3NlX3JlcShBVkRUX0NIQU5fUkVQT1JULCBwX3NjYi0+cF9jY2IsIHBfc2NiKTsKLSAgYXZkdF9hZF9jbG9zZV9yZXEoQVZEVF9DSEFOX01FRElBLCBwX3NjYi0+cF9jY2IsIHBfc2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX2NiX2VycgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgaW5kaWNhdGluZyBhbiBlcnJvci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfY2JfZXJyKEF2ZHRwU2NiKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkRUX0NUUkwgYXZkdF9jdHJsOwotCi0gIC8qIHNldCBlcnJvciBjb2RlIGFuZCBwYXJhbWV0ZXIgKi8KLSAgYXZkdF9jdHJsLmhkci5lcnJfY29kZSA9IEFWRFRfRVJSX0JBRF9TVEFURTsKLSAgYXZkdF9jdHJsLmhkci5lcnJfcGFyYW0gPSAwOwotCi0gIC8qIGNhbGwgY2FsbGJhY2ssIHVzaW5nIGxvb2t1cCB0YWJsZSB0byBnZXQgY2FsbGJhY2sgZXZlbnQgKi8KLSAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLCBSYXdBZGRyZXNzOjprRW1wdHksCi0gICAgICBhdmR0X3NjYl9jYmFja19ldnRbcF9zY2ItPmN1cnJfZXZ0XSwgJmF2ZHRfY3RybCwKLSAgICAgIHBfc2NiLT5zdHJlYW1fY29uZmlnLnNjYl9pbmRleCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9jb25nX3N0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGNvbmdlc3Rpb24gc3RhdGUgb2YgdGhlIFNDQiBtZWRpYQotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgY2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfY29uZ19zdGF0ZShBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBwX3NjYi0+Y29uZyA9IHBfZGF0YS0+bGxjb25nOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfcmVqX3N0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgcmVqZWN0IG1lc3NhZ2UgdG8gdGhlIHBlZXIgaW5kaWNhdGluZwotICogICAgICAgICAgICAgICAgICBpbmNvcnJlY3Qgc3RhdGUgZm9yIHRoZSByZWNlaXZlZCBjb21tYW5kIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3Jlal9zdGF0ZShVTlVTRURfQVRUUiBBdmR0cFNjYiogcF9zY2IsIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBwX2RhdGEtPm1zZy5oZHIuZXJyX2NvZGUgPSBBVkRUX0VSUl9CQURfU1RBVEU7Ci0gIHBfZGF0YS0+bXNnLmhkci5lcnJfcGFyYW0gPSAwOwotICBhdmR0X21zZ19zZW5kX3JlaihhdmR0X2NjYl9ieV9pZHgocF9kYXRhLT5tc2cuaGRyLmNjYl9pZHgpLAotICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPm1zZy5oZHIuc2lnX2lkLCAmcF9kYXRhLT5tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfcmVqX2luX3VzZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHJlamVjdCBtZXNzYWdlIHRvIHRoZSBwZWVyIGluZGljYXRpbmcKLSAqICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSBpcyBpbiB1c2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX3Jlal9pbl91c2UoVU5VU0VEX0FUVFIgQXZkdHBTY2IqIHBfc2NiLCB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgcF9kYXRhLT5tc2cuaGRyLmVycl9jb2RlID0gQVZEVF9FUlJfSU5fVVNFOwotICBwX2RhdGEtPm1zZy5oZHIuZXJyX3BhcmFtID0gMDsKLSAgYXZkdF9tc2dfc2VuZF9yZWooYXZkdF9jY2JfYnlfaWR4KHBfZGF0YS0+bXNnLmhkci5jY2JfaWR4KSwKLSAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5tc2cuaGRyLnNpZ19pZCwgJnBfZGF0YS0+bXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2ZHRfc2NiX3Jlal9ub3RfaW5fdXNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgcmVqZWN0IG1lc3NhZ2UgdG8gdGhlIHBlZXIgaW5kaWNhdGluZwotICogICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIGlzIGluIHVzZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZkdF9zY2JfcmVqX25vdF9pbl91c2UoVU5VU0VEX0FUVFIgQXZkdHBTY2IqIHBfc2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9TQ0JfRVZUKiBwX2RhdGEpIHsKLSAgcF9kYXRhLT5tc2cuaGRyLmVycl9jb2RlID0gQVZEVF9FUlJfTk9UX0lOX1VTRTsKLSAgcF9kYXRhLT5tc2cuaGRyLmVycl9wYXJhbSA9IDA7Ci0gIGF2ZHRfbXNnX3NlbmRfcmVqKGF2ZHRfY2NiX2J5X2lkeChwX2RhdGEtPm1zZy5oZHIuY2NiX2lkeCksCi0gICAgICAgICAgICAgICAgICAgIHBfZGF0YS0+bXNnLmhkci5zaWdfaWQsICZwX2RhdGEtPm1zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9zZXRfcmVtb3ZlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIG1hcmtzIGFuIFNDQiB0byBiZSByZW1vdmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9zZXRfcmVtb3ZlKEF2ZHRwU2NiKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIHBfc2NiLT5yZW1vdmUgPSB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfZnJlZV9wa3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lZGlhIHBhY2tldCBwYXNzZWQgaW4uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2ZyZWVfcGt0KEF2ZHRwU2NiKiBwX3NjYiwgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkRUX0NUUkwgYXZkdF9jdHJsOwotCi0gIC8qIHNldCBlcnJvciBjb2RlIGFuZCBwYXJhbWV0ZXIgKi8KLSAgYXZkdF9jdHJsLmhkci5lcnJfY29kZSA9IEFWRFRfRVJSX0JBRF9TVEFURTsKLSAgYXZkdF9jdHJsLmhkci5lcnJfcGFyYW0gPSAwOwotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2RhdGEtPmFwaXdyaXRlLnBfYnVmKTsKLQotICBBVkRUX1RSQUNFX1dBUk5JTkcoIkRyb3BwZWQgbWVkaWEgcGFja2V0Iik7Ci0KLSAgLyogd2UgbmVlZCB0byBjYWxsIGNhbGxiYWNrIHRvIGtlZXAgZGF0YSBmbG93IGdvaW5nICovCi0gICgqcF9zY2ItPnN0cmVhbV9jb25maWcucF9hdmR0X2N0cmxfY2JhY2spKAotICAgICAgYXZkdF9zY2JfdG9faGRsKHBfc2NiKSwgUmF3QWRkcmVzczo6a0VtcHR5LCBBVkRUX1dSSVRFX0NGTV9FVlQsCi0gICAgICAmYXZkdF9jdHJsLCBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfY2xyX3BrdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgbWVkaWEgcGFja2V0IHN0b3JlZCBpbiB0aGUgU0NCLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9jbHJfcGt0KEF2ZHRwU2NiKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkRUX0NUUkwgYXZkdF9jdHJsOwotICBBdmR0cENjYiogcF9jY2I7Ci0gIHVpbnQ4X3QgdGNpZDsKLSAgdWludDE2X3QgbGNpZDsKLQotICAvKiBzZXQgZXJyb3IgY29kZSBhbmQgcGFyYW1ldGVyICovCi0gIGF2ZHRfY3RybC5oZHIuZXJyX2NvZGUgPSBBVkRUX0VSUl9CQURfU1RBVEU7Ci0gIGF2ZHRfY3RybC5oZHIuZXJyX3BhcmFtID0gMDsKLSAgLyogZmx1c2ggdGhlIG1lZGlhIGRhdGEgcXVldWVkIGF0IEwyQ0FQICovCi0gIHBfY2NiID0gcF9zY2ItPnBfY2NiOwotICBpZiAocF9jY2IgIT0gTlVMTCkgewotICAgIC8qIGdldCB0Y2lkIGZyb20gdHlwZSwgc2NiICovCi0gICAgdGNpZCA9IGF2ZHRfYWRfdHlwZV90b190Y2lkKEFWRFRfQ0hBTl9NRURJQSwgcF9zY2IpOwotCi0gICAgbGNpZCA9IGF2ZHRwX2NiLmFkLnJ0X3RibFthdmR0X2NjYl90b19pZHgocF9jY2IpXVt0Y2lkXS5sY2lkOwotICAgIEwyQ0FfRmx1c2hDaGFubmVsKGxjaWQsIEwyQ0FQX0ZMVVNIX0NIQU5TX0FMTCk7Ci0gIH0KLQotICBpZiAocF9zY2ItPnBfcGt0ICE9IE5VTEwpIHsKLSAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9zY2ItPnBfcGt0KTsKLQotICAgIEFWRFRfVFJBQ0VfREVCVUcoIkRyb3BwZWQgc3RvcmVkIG1lZGlhIHBhY2tldCIpOwotCi0gICAgLyogd2UgbmVlZCB0byBjYWxsIGNhbGxiYWNrIHRvIGtlZXAgZGF0YSBmbG93IGdvaW5nICovCi0gICAgKCpwX3NjYi0+c3RyZWFtX2NvbmZpZy5wX2F2ZHRfY3RybF9jYmFjaykoCi0gICAgICAgIGF2ZHRfc2NiX3RvX2hkbChwX3NjYiksIFJhd0FkZHJlc3M6OmtFbXB0eSwgQVZEVF9XUklURV9DRk1fRVZULAotICAgICAgICAmYXZkdF9jdHJsLCBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdmR0X3NjYl9jaGtfc25kX3BrdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIFNDQiBpcyBjb25nZXN0ZWQsIGFuZCBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgY29uZ2VzdGVkIGl0IHNlbmRzIGEgc3RvcmVkIG1lZGlhIHBhY2tldCwgaWYgYW55LiAgQWZ0ZXIgaXQKLSAqICAgICAgICAgICAgICAgICAgc2VuZHMgdGhlIHBhY2tldCBpdCBjYWxscyB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgd2l0aCBhIHdyaXRlIGNvbmZpcm0uCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGF2ZHRfc2NiX2Noa19zbmRfcGt0KEF2ZHRwU2NiKiBwX3NjYiwgVU5VU0VEX0FUVFIgdEFWRFRfU0NCX0VWVCogcF9kYXRhKSB7Ci0gIHRBVkRUX0NUUkwgYXZkdF9jdHJsOwotICBCVF9IRFIqIHBfcGt0OwotCi0gIGF2ZHRfY3RybC5oZHIuZXJyX2NvZGUgPSAwOwotCi0gIGlmICghcF9zY2ItPmNvbmcpIHsKLSAgICBpZiAocF9zY2ItPnBfcGt0ICE9IE5VTEwpIHsKLSAgICAgIHBfcGt0ID0gcF9zY2ItPnBfcGt0OwotICAgICAgcF9zY2ItPnBfcGt0ID0gTlVMTDsKLSAgICAgIGF2ZHRfYWRfd3JpdGVfcmVxKEFWRFRfQ0hBTl9NRURJQSwgcF9zY2ItPnBfY2NiLCBwX3NjYiwgcF9wa3QpOwotCi0gICAgICAoKnBfc2NiLT5zdHJlYW1fY29uZmlnLnBfYXZkdF9jdHJsX2NiYWNrKSgKLSAgICAgICAgICBhdmR0X3NjYl90b19oZGwocF9zY2IpLCBSYXdBZGRyZXNzOjprRW1wdHksIEFWRFRfV1JJVEVfQ0ZNX0VWVCwKLSAgICAgICAgICAmYXZkdF9jdHJsLCBwX3NjYi0+c3RyZWFtX2NvbmZpZy5zY2JfaW5kZXgpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfdHJhbnNwb3J0X2NoYW5uZWxfdGltZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IGEgdGltZXIgd2hlbiB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBpbml0aWF0ZXMgY2xvc2luZyBvZiB0aGUgc3RyZWFtLiAgVGhlIHRpbWVyIHZlcmlmaWVzIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgdGhlIHBlZXIgZGlzY29ubmVjdHMgdGhlIHRyYW5zcG9ydCBjaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl90cmFuc3BvcnRfY2hhbm5lbF90aW1lcihBdmR0cFNjYiogcF9zY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBhbGFybV9zZXRfb25fbWxvb3AocF9zY2ItPnRyYW5zcG9ydF9jaGFubmVsX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgQVZEVF9TQ0JfVENfRElTQ19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgYXZkdF9zY2JfdHJhbnNwb3J0X2NoYW5uZWxfdGltZXJfdGltZW91dCwgcF9zY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZkdF9zY2JfY2xyX3ZhcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgY2VydGFpbiBTQ0IgdmFyaWFibGVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm90aGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdmR0X3NjYl9jbHJfdmFycyhBdmR0cFNjYiogcF9zY2IsIFVOVVNFRF9BVFRSIHRBVkRUX1NDQl9FVlQqIHBfZGF0YSkgewotICBwX3NjYi0+aW5fdXNlID0gZmFsc2U7Ci0gIHBfc2NiLT5wZWVyX3NlaWQgPSAwOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYXZyYy9hdnJjX2FwaS5jYyBiL3N0YWNrL2F2cmMvYXZyY19hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjI4NmIuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZyYy9hdnJjX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBJbnRlcmZhY2UgdG8gQVZSQ1AgbWFuZGF0b3J5IGNvbW1hbmRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJhdnJjX2FwaS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdnJjX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFWUkNfTUFYX1JDVl9DVFJMX0VWVCBBVkNUX0JST1dTRV9VTkNPTkdfSU5EX0VWVAotCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgdWludDhfdCBhdnJjX2N0cmxfZXZlbnRfbWFwW10gPSB7Ci0gICAgQVZSQ19PUEVOX0lORF9FVlQsICAgICAgICAgLyogQVZDVF9DT05ORUNUX0NGTV9FVlQgKi8KLSAgICBBVlJDX09QRU5fSU5EX0VWVCwgICAgICAgICAvKiBBVkNUX0NPTk5FQ1RfSU5EX0VWVCAqLwotICAgIEFWUkNfQ0xPU0VfSU5EX0VWVCwgICAgICAgIC8qIEFWQ1RfRElTQ09OTkVDVF9DRk1fRVZUICovCi0gICAgQVZSQ19DTE9TRV9JTkRfRVZULCAgICAgICAgLyogQVZDVF9ESVNDT05ORUNUX0lORF9FVlQgKi8KLSAgICBBVlJDX0NPTkdfSU5EX0VWVCwgICAgICAgICAvKiBBVkNUX0NPTkdfSU5EX0VWVCAqLwotICAgIEFWUkNfVU5DT05HX0lORF9FVlQsICAgICAgIC8qIEFWQ1RfVU5DT05HX0lORF9FVlQgKi8KLSAgICBBVlJDX0JST1dTRV9PUEVOX0lORF9FVlQsICAvKiBBVkNUX0JST1dTRV9DT05OX0NGTV9FVlQgICAqLwotICAgIEFWUkNfQlJPV1NFX09QRU5fSU5EX0VWVCwgIC8qIEFWQ1RfQlJPV1NFX0NPTk5fSU5EX0VWVCAgICovCi0gICAgQVZSQ19CUk9XU0VfQ0xPU0VfSU5EX0VWVCwgLyogQVZDVF9CUk9XU0VfRElTQ09OTl9DRk1fRVZUICovCi0gICAgQVZSQ19CUk9XU0VfQ0xPU0VfSU5EX0VWVCwgLyogQVZDVF9CUk9XU0VfRElTQ09OTl9JTkRfRVZUICovCi0gICAgQVZSQ19CUk9XU0VfQ09OR19JTkRfRVZULCAgLyogQVZDVF9CUk9XU0VfQ09OR19JTkRfRVZUICAgICovCi0gICAgQVZSQ19CUk9XU0VfVU5DT05HX0lORF9FVlQgLyogQVZDVF9CUk9XU0VfVU5DT05HX0lORF9FVlQgICovCi19OwotCi0vKiB1c2UgdGhpcyB1bnVzZWQgb3Bjb2RlIHRvIGluZGljYXRpb24gbm8gbmVlZCB0byBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotI2RlZmluZSBBVlJDX09QX0RST1AgMHhGRQotLyogdXNlIHRoaXMgdW51c2VkIG9wY29kZSB0byBpbmRpY2F0aW9uIG5vIG5lZWQgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gJgotICogZnJlZSBidWZmZXIgKi8KLSNkZWZpbmUgQVZSQ19PUF9EUk9QX05fRlJFRSAweEZECi0KLSNkZWZpbmUgQVZSQ19PUF9VTklUX0lORk9fUlNQX0xFTiA4Ci0jZGVmaW5lIEFWUkNfT1BfU1VCX1VOSVRfSU5GT19SU1BfTEVOIDgKLSNkZWZpbmUgQVZSQ19PUF9SRUpfTVNHX0xFTiAxMQotCi0vKiBGbGFncyBkZWZpbml0aW9ucyBmb3IgQVZSQ19Nc2dSZXEgKi8KLSNkZWZpbmUgQVZSQ19NU0dfTUFTS19JU19WRU5ET1JfQ01EIDB4MDEKLSNkZWZpbmUgQVZSQ19NU0dfTUFTS19JU19DT05USU5VQVRJT05fUlNQIDB4MDIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19jdHJsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IEFWQ1RQIHRvIHJlcG9ydAotICogICAgICAgICAgICAgICAgICByZWNlaXZlZCBsaW5rIGV2ZW50cy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZyY19jdHJsX2NiYWNrKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGV2ZW50LCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogcGVlcl9hZGRyKSB7Ci0gIHVpbnQ4X3QgYXZyY19ldmVudDsKLQotICBpZiAoZXZlbnQgPD0gQVZSQ19NQVhfUkNWX0NUUkxfRVZUICYmIGF2cmNfY2IuY2NiW2hhbmRsZV0uY3RybF9jYmFjaykgewotICAgIGF2cmNfZXZlbnQgPSBhdnJjX2N0cmxfZXZlbnRfbWFwW2V2ZW50XTsKLSAgICBpZiAoZXZlbnQgPT0gQVZDVF9DT05ORUNUX0NGTV9FVlQpIHsKLSAgICAgIGlmIChyZXN1bHQgIT0gMCkgLyogZmFpbGVkICovCi0gICAgICAgIGF2cmNfZXZlbnQgPSBBVlJDX0NMT1NFX0lORF9FVlQ7Ci0gICAgfQotICAgIGF2cmNfY2IuY2NiW2hhbmRsZV0uY3RybF9jYmFjay5SdW4oaGFuZGxlLCBhdnJjX2V2ZW50LCByZXN1bHQsIHBlZXJfYWRkcik7Ci0gIH0KLQotICBpZiAoKGV2ZW50ID09IEFWQ1RfRElTQ09OTkVDVF9DRk1fRVZUKSB8fAotICAgICAgKGV2ZW50ID09IEFWQ1RfRElTQ09OTkVDVF9JTkRfRVZUKSkgewotICAgIGF2cmNfZmx1c2hfY21kX3EoaGFuZGxlKTsKLSAgICBhbGFybV9mcmVlKGF2cmNfY2IuY2NiX2ludFtoYW5kbGVdLnRsZSk7Ci0gICAgYXZyY19jYi5jY2JfaW50W2hhbmRsZV0udGxlID0gTlVMTDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2ZsdXNoX2NtZF9xCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGbHVzaCBjb21tYW5kIHF1ZXVlIGZvciB0aGUgc3BlY2lmaWVkIGF2cmMgaGFuZGxlCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZyY19mbHVzaF9jbWRfcSh1aW50OF90IGhhbmRsZSkgewotICBBVlJDX1RSQUNFX0RFQlVHKCJBVlJDOiBGbHVzaGluZyBjb21tYW5kIHF1ZXVlIGZvciBoYW5kbGU9MHglMDJ4IiwgaGFuZGxlKTsKLSAgYXZyY19jYi5jY2JfaW50W2hhbmRsZV0uZmxhZ3MgJj0gfkFWUkNfQ0JfRkxBR1NfUlNQX1BFTkRJTkc7Ci0KLSAgYWxhcm1fY2FuY2VsKGF2cmNfY2IuY2NiX2ludFtoYW5kbGVdLnRsZSk7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUoYXZyY19jYi5jY2JfaW50W2hhbmRsZV0uY21kX3EsIG9zaV9mcmVlKTsKLSAgYXZyY19jYi5jY2JfaW50W2hhbmRsZV0uY21kX3EgPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX3Byb2Nlc3NfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGF2cmMgY29tbWFuZCB0aW1lb3V0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZyY19wcm9jZXNzX3RpbWVvdXQodm9pZCogZGF0YSkgewotICB0QVZSQ19QQVJBTSogcGFyYW0gPSAodEFWUkNfUEFSQU0qKWRhdGE7Ci0KLSAgQVZSQ19UUkFDRV9ERUJVRygiQVZSQzogY29tbWFuZCB0aW1lb3V0IChoYW5kbGU9MHglMDJ4LCBsYWJlbD0weCUwMngpIiwKLSAgICAgICAgICAgICAgICAgICBwYXJhbS0+aGFuZGxlLCBwYXJhbS0+bGFiZWwpOwotCi0gIC8qIE5vdGlmeSBhcHAgKi8KLSAgaWYgKGF2cmNfY2IuY2NiW3BhcmFtLT5oYW5kbGVdLmN0cmxfY2JhY2spIHsKLSAgICBhdnJjX2NiLmNjYltwYXJhbS0+aGFuZGxlXS5jdHJsX2NiYWNrLlJ1bigKLSAgICAgICAgcGFyYW0tPmhhbmRsZSwgQVZSQ19DTURfVElNRU9VVF9FVlQsIHBhcmFtLT5sYWJlbCwgTlVMTCk7Ci0gIH0KLQotICAvKiBJZiB2ZW5kb3IgY29tbWFuZCB0aW1lZC1vdXQsIHRoZW4gc2VuZCBuZXh0IGNvbW1hbmQgaW4gdGhlIHF1ZXVlICovCi0gIGlmIChwYXJhbS0+bXNnX21hc2sgJiBBVlJDX01TR19NQVNLX0lTX1ZFTkRPUl9DTUQpIHsKLSAgICBhdnJjX3NlbmRfbmV4dF92ZW5kb3JfY21kKHBhcmFtLT5oYW5kbGUpOwotICB9Ci0gIG9zaV9mcmVlKHBhcmFtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19zZW5kX25leHRfdmVuZG9yX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVxdWV1ZSBhbmQgc2VuZCBuZXh0IHZlbmRvciBjb21tYW5kIGZvciBnaXZlbiBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhdnJjX3NlbmRfbmV4dF92ZW5kb3JfY21kKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcF9uZXh0X2NtZDsKLSAgdWludDhfdCBuZXh0X2xhYmVsOwotCi0gIHdoaWxlICgocF9uZXh0X2NtZCA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKAotICAgICAgICAgICAgICBhdnJjX2NiLmNjYl9pbnRbaGFuZGxlXS5jbWRfcSkpICE9IE5VTEwpIHsKLSAgICBwX25leHRfY21kLT5ldmVudCAmPSAweEZGOyAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgKi8KLSAgICBuZXh0X2xhYmVsID0gKHBfbmV4dF9jbWQtPmxheWVyX3NwZWNpZmljKSA+PiA4OyAvKiBleHRyYWN0IGxhYmVsICovCi0gICAgcF9uZXh0X2NtZC0+bGF5ZXJfc3BlY2lmaWMgJj0gMHhGRjsgLyogQVZDVF9EQVRBX0NUUkwgb3IgQVZDVF9EQVRBX0JST1dTRSAqLwotCi0gICAgQVZSQ19UUkFDRV9ERUJVRygKLSAgICAgICAgIkFWUkM6IERlcXVldWluZyBjb21tYW5kIDB4JTA4eCAoaGFuZGxlPTB4JTAyeCwgbGFiZWw9MHglMDJ4KSIsCi0gICAgICAgIHBfbmV4dF9jbWQsIGhhbmRsZSwgbmV4dF9sYWJlbCk7Ci0KLSAgICAvKiBTZW5kIHRoZSBtZXNzYWdlICovCi0gICAgaWYgKChBVkNUX01zZ1JlcShoYW5kbGUsIG5leHRfbGFiZWwsIEFWQ1RfQ01ELCBwX25leHRfY21kKSkgPT0KLSAgICAgICAgQVZDVF9TVUNDRVNTKSB7Ci0gICAgICAvKiBTdGFydCBjb21tYW5kIHRpbWVyIHRvIHdhaXQgZm9yIHJlc3BvbnNlICovCi0gICAgICBhdnJjX3N0YXJ0X2NtZF90aW1lcihoYW5kbGUsIG5leHRfbGFiZWwsIEFWUkNfTVNHX01BU0tfSVNfVkVORE9SX0NNRCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBfbmV4dF9jbWQgPT0gTlVMTCkgewotICAgIC8qIGNtZCBxdWV1ZSBlbXB0eSAqLwotICAgIGF2cmNfY2IuY2NiX2ludFtoYW5kbGVdLmZsYWdzICY9IH5BVlJDX0NCX0ZMQUdTX1JTUF9QRU5ESU5HOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfc3RhcnRfY21kX3RpbWVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCB0aW1lciBmb3Igd2FpdGluZyBmb3IgcmVzcG9uc2VzCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYXZyY19zdGFydF9jbWRfdGltZXIodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgbXNnX21hc2spIHsKLSAgdEFWUkNfUEFSQU0qIHBhcmFtID0KLSAgICAgIHN0YXRpY19jYXN0PHRBVlJDX1BBUkFNKj4ob3NpX21hbGxvYyhzaXplb2YodEFWUkNfUEFSQU0pKSk7Ci0gIHBhcmFtLT5oYW5kbGUgPSBoYW5kbGU7Ci0gIHBhcmFtLT5sYWJlbCA9IGxhYmVsOwotICBwYXJhbS0+bXNnX21hc2sgPSBtc2dfbWFzazsKLQotICBBVlJDX1RSQUNFX0RFQlVHKCJBVlJDOiBzdGFydGluZyB0aW1lciAoaGFuZGxlPTB4JTAyeCwgbGFiZWw9MHglMDJ4KSIsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICBsYWJlbCk7Ci0KLSAgYWxhcm1fc2V0X29uX21sb29wKGF2cmNfY2IuY2NiX2ludFtoYW5kbGVdLnRsZSwgQVZSQ19DTURfVE9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGF2cmNfcHJvY2Vzc190aW1lb3V0LCBwYXJhbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfZ2V0X2RhdGFfcHRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXRzIGEgcG9pbnRlciB0byB0aGUgZGF0YSBwYXlsb2FkIGluIHRoZSBwYWNrZXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGRhdGEgcGF5bG9hZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCogYXZyY19nZXRfZGF0YV9wdHIoQlRfSERSKiBwX3BrdCkgewotICByZXR1cm4gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19jb3B5X3BhY2tldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29waWVzIGFuIEFWUkMgcGFja2V0IHRvIGEgbmV3IGJ1ZmZlci4gSW4gdGhlIG5ldyBidWZmZXIsCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBwYXlsb2FkIG9mZnNldCBpcyBhdCBsZWFzdCBBVkNUX01TR19PRkZTRVQgb2N0ZXRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIGJ1ZmZlciB3aXRoIHRoZSBjb3BpZWQgZGF0YS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdnJjX2NvcHlfcGFja2V0KEJUX0hEUiogcF9wa3QsIGludCByc3BfcGt0X2xlbikgewotICBjb25zdCBpbnQgb2Zmc2V0ID0gTUFYKEFWQ1RfTVNHX09GRlNFVCwgcF9wa3QtPm9mZnNldCk7Ci0gIGNvbnN0IGludCBwa3RfbGVuID0gTUFYKHJzcF9wa3RfbGVuLCBwX3BrdC0+bGVuKTsKLSAgQlRfSERSKiBwX3BrdF9jb3B5ID0gKEJUX0hEUiopb3NpX2NhbGxvYyhCVF9IRFJfU0laRSArIG9mZnNldCArIHBrdF9sZW4pOwotCi0gIC8qIENvcHkgdGhlIHBhY2tldCBoZWFkZXIsIHNldCB0aGUgbmV3IG9mZnNldCwgYW5kIGNvcHkgdGhlIHBheWxvYWQgKi8KLSAgbWVtY3B5KHBfcGt0X2NvcHksIHBfcGt0LCBCVF9IRFJfU0laRSk7Ci0gIHBfcGt0X2NvcHktPm9mZnNldCA9IG9mZnNldDsKLSAgdWludDhfdCogcF9kYXRhID0gYXZyY19nZXRfZGF0YV9wdHIocF9wa3QpOwotICB1aW50OF90KiBwX2RhdGFfY29weSA9IGF2cmNfZ2V0X2RhdGFfcHRyKHBfcGt0X2NvcHkpOwotICBtZW1jcHkocF9kYXRhX2NvcHksIHBfZGF0YSwgcF9wa3QtPmxlbik7Ci0KLSAgcmV0dXJuIHBfcGt0X2NvcHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfcHJlcF9lbmRfZnJhZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBhbiBlbmQgcmVzcG9uc2UgZnJhZ21lbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZyY19wcmVwX2VuZF9mcmFnKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIHRBVlJDX0ZSQUdfQ0IqIHBfZmNiOwotICBCVF9IRFIqIHBfcGt0X25ldzsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9vcmlnX2RhdGE7Ci0gIHVpbnQ4X3QgcnNwX3R5cGU7Ci0KLSAgQVZSQ19UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHBfZmNiID0gJmF2cmNfY2IuZmNiW2hhbmRsZV07Ci0KLSAgLyogVGhlIHJlc3BvbnNlIHR5cGUgb2YgdGhlIGVuZCBmcmFnbWVudCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHRoZSBQRFUgb2YKLSAgICogIkVuZCBGcmFnbWVudCBSZXNwb25zZSIgRXJyYXRhOgotICAgKiBodHRwczovL3d3dy5ibHVldG9vdGgub3JnL2VycmF0YS9lcnJhdGFfdmlldy5jZm0/ZXJyYXRhX2lkPTQzODMKLSAgICovCi0gIHBfb3JpZ19kYXRhID0gKCh1aW50OF90KikocF9mY2ItPnBfZm1zZyArIDEpICsgcF9mY2ItPnBfZm1zZy0+b2Zmc2V0KTsKLSAgcnNwX3R5cGUgPSAoKCpwX29yaWdfZGF0YSkgJiBBVlJDX0NUWVBFX01BU0spOwotCi0gIHBfcGt0X25ldyA9IHBfZmNiLT5wX2Ztc2c7Ci0gIHBfcGt0X25ldy0+bGVuIC09Ci0gICAgICAoQVZSQ19NQVhfQ1RSTF9EQVRBX0xFTiAtIEFWUkNfVkVORE9SX0hEUl9TSVpFIC0gQVZSQ19NSU5fTUVUQV9IRFJfU0laRSk7Ci0gIHBfcGt0X25ldy0+b2Zmc2V0ICs9Ci0gICAgICAoQVZSQ19NQVhfQ1RSTF9EQVRBX0xFTiAtIEFWUkNfVkVORE9SX0hEUl9TSVpFIC0gQVZSQ19NSU5fTUVUQV9IRFJfU0laRSk7Ci0gIHBfZGF0YSA9ICh1aW50OF90KikocF9wa3RfbmV3ICsgMSkgKyBwX3BrdF9uZXctPm9mZnNldDsKLSAgKnBfZGF0YSsrID0gcnNwX3R5cGU7Ci0gICpwX2RhdGErKyA9IChBVlJDX1NVQl9QQU5FTCA8PCBBVlJDX1NVQlRZUEVfU0hJRlQpOwotICAqcF9kYXRhKysgPSBBVlJDX09QX1ZFTkRPUjsKLSAgQVZSQ19DT19JRF9UT19CRV9TVFJFQU0ocF9kYXRhLCBBVlJDX0NPX01FVEFEQVRBKTsKLSAgKnBfZGF0YSsrID0gcF9mY2ItPmZyYWdfcGR1OwotICAqcF9kYXRhKysgPSBBVlJDX1BLVF9FTkQ7Ci0KLSAgLyogND1wZHUsIHBrdF90eXBlICYgbGVuICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0oCi0gICAgICBwX2RhdGEsIChwX3BrdF9uZXctPmxlbiAtIEFWUkNfVkVORE9SX0hEUl9TSVpFIC0gQVZSQ19NSU5fTUVUQV9IRFJfU0laRSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX3NlbmRfY29udGludWVfZnJhZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGNvbnRpbnVlIHJlc3BvbnNlIGZyYWdtZW50Ci0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19CQURfSEFORExFIGlmIGhhbmRsZSBpcyBpbnZhbGlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50MTZfdCBhdnJjX3NlbmRfY29udGludWVfZnJhZyh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCkgewotICB0QVZSQ19GUkFHX0NCKiBwX2ZjYjsKLSAgQlRfSERSICpwX3BrdF9vbGQsICpwX3BrdDsKLSAgdWludDhfdCAqcF9vbGQsICpwX2RhdGE7Ci0gIHVpbnQ4X3QgY3IgPSBBVkNUX1JTUDsKLQotICBwX2ZjYiA9ICZhdnJjX2NiLmZjYltoYW5kbGVdOwotICBwX3BrdCA9IHBfZmNiLT5wX2Ztc2c7Ci0KLSAgQVZSQ19UUkFDRV9ERUJVRygiJXMgaGFuZGxlID0gJXUgbGFiZWwgPSAldSBsZW4gPSAlZCIsIF9fZnVuY19fLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgbGFiZWwsIHBfcGt0LT5sZW4pOwotICBpZiAocF9wa3QtPmxlbiA+IEFWUkNfTUFYX0NUUkxfREFUQV9MRU4pIHsKLSAgICBpbnQgb2Zmc2V0X2xlbiA9IE1BWChBVkNUX01TR19PRkZTRVQsIHBfcGt0LT5vZmZzZXQpOwotICAgIHBfcGt0X29sZCA9IHBfZmNiLT5wX2Ztc2c7Ci0gICAgcF9wa3QgPSAoQlRfSERSKilvc2lfY2FsbG9jKEFWUkNfUEFDS0VUX0xFTiArIG9mZnNldF9sZW4gKyBCVF9IRFJfU0laRSk7Ci0gICAgcF9wa3QtPmxlbiA9IEFWUkNfTUFYX0NUUkxfREFUQV9MRU47Ci0gICAgcF9wa3QtPm9mZnNldCA9IEFWQ1RfTVNHX09GRlNFVDsKLSAgICBwX3BrdC0+bGF5ZXJfc3BlY2lmaWMgPSBwX3BrdF9vbGQtPmxheWVyX3NwZWNpZmljOwotICAgIHBfcGt0LT5ldmVudCA9IHBfcGt0X29sZC0+ZXZlbnQ7Ci0gICAgcF9vbGQgPSAodWludDhfdCopKHBfcGt0X29sZCArIDEpICsgcF9wa3Rfb2xkLT5vZmZzZXQ7Ci0gICAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgICBtZW1jcHkocF9kYXRhLCBwX29sZCwgQVZSQ19NQVhfQ1RSTF9EQVRBX0xFTik7Ci0gICAgLyogdXNlIEFWUkMgY29udGludWUgcGFja2V0IHR5cGUgKi8KLSAgICBwX2RhdGEgKz0gQVZSQ19WRU5ET1JfSERSX1NJWkU7Ci0gICAgcF9kYXRhKys7IC8qIHBkdSAqLwotICAgICpwX2RhdGErKyA9IEFWUkNfUEtUX0NPTlRJTlVFOwotICAgIC8qIDQ9cGR1LCBwa3RfdHlwZSAmIGxlbiAqLwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKEFWUkNfTUFYX0NUUkxfREFUQV9MRU4gLSBBVlJDX1ZFTkRPUl9IRFJfU0laRSAtIDQpKTsKLQotICAgIC8qIHByZXBhcmUgdGhlIGxlZnQgb3ZlciBmb3IgYXMgYW4gZW5kIGZyYWdtZW50ICovCi0gICAgYXZyY19wcmVwX2VuZF9mcmFnKGhhbmRsZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZW5kIGZyYWdtZW50LiBjbGVhbiB0aGUgY29udHJvbCBibG9jayAqLwotICAgIHBfZmNiLT5mcmFnX2VuYWJsZWQgPSBmYWxzZTsKLSAgICBwX2ZjYi0+cF9mbXNnID0gTlVMTDsKLSAgfQotICByZXR1cm4gQVZDVF9Nc2dSZXEoaGFuZGxlLCBsYWJlbCwgY3IsIHBfcGt0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19wcm9jX3ZlbmRvcl9jb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyByZWNlaXZlZCB2ZW5kb3IgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGlmIG5vdCBOVUxMLCB0aGUgcmVzcG9uc2UgdG8gc2VuZCByaWdodCBhd2F5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF2cmNfcHJvY192ZW5kb3JfY29tbWFuZCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX01TR19WRU5ET1IqIHBfbXNnKSB7Ci0gIEJUX0hEUiogcF9yc3AgPSBOVUxMOwotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQ4X3QqIHBfYmVnaW47Ci0gIHVpbnQ4X3QgcGt0X3R5cGU7Ci0gIGJvb2wgYWJvcnRfZnJhZyA9IGZhbHNlOwotICB0QVZSQ19TVFMgc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIHRBVlJDX0ZSQUdfQ0IqIHBfZmNiOwotCi0gIHBfYmVnaW4gPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX2RhdGEgPSBwX2JlZ2luICsgQVZSQ19WRU5ET1JfSERSX1NJWkU7Ci0gIHBrdF90eXBlID0gKihwX2RhdGEgKyAxKSAmIEFWUkNfUEtUX1RZUEVfTUFTSzsKLQotICBpZiAocGt0X3R5cGUgIT0gQVZSQ19QS1RfU0lOR0xFKSB7Ci0gICAgLyogcmVqZWN0IC0gY29tbWFuZHMgY2FuIG9ubHkgYmUgaW4gc2luZ2xlIHBhY2tldHMgYXQgQVZSQ1AgbGV2ZWwgKi8KLSAgICBBVlJDX1RSQUNFX0VSUk9SKCJjb21tYW5kcyBtdXN0IGJlIGluIHNpbmdsZSBwYWNrZXQgcGR1OjB4JXgiLCAqcF9kYXRhKTsKLSAgICAvKiB1c2UgdGhlIGN1cnJlbnQgR0tJIGJ1ZmZlciB0byBzZW5kIHRoZSByZWplY3QgKi8KLSAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfQ01EOwotICB9Ci0gIC8qIGNoZWNrIGlmIHRoZXJlIGFyZSBmcmFnbWVudHMgd2FpdGluZyB0byBiZSBzZW50ICovCi0gIGVsc2UgaWYgKGF2cmNfY2IuZmNiW2hhbmRsZV0uZnJhZ19lbmFibGVkKSB7Ci0gICAgcF9mY2IgPSAmYXZyY19jYi5mY2JbaGFuZGxlXTsKLSAgICBpZiAocF9tc2ctPmNvbXBhbnlfaWQgPT0gQVZSQ19DT19NRVRBREFUQSkgewotICAgICAgc3dpdGNoICgqcF9kYXRhKSB7Ci0gICAgICAgIGNhc2UgQVZSQ19QRFVfQUJPUlRfQ09OVElOVUFUSU9OX1JTUDoKLSAgICAgICAgICAvKiBhYm9ydGVkIGJ5IENUIC0gc2VuZCBhY2NlcHQgcmVzcG9uc2UgKi8KLSAgICAgICAgICBhYm9ydF9mcmFnID0gdHJ1ZTsKLSAgICAgICAgICBwX2JlZ2luID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgICAgICAgICAqcF9iZWdpbiA9IChBVlJDX1JTUF9BQ0NFUFQgJiBBVlJDX0NUWVBFX01BU0spOwotICAgICAgICAgIGlmICgqKHBfZGF0YSArIDQpICE9IHBfZmNiLT5mcmFnX3BkdSkgewotICAgICAgICAgICAgKnBfYmVnaW4gPSAoQVZSQ19SU1BfUkVKICYgQVZSQ19DVFlQRV9NQVNLKTsKLSAgICAgICAgICAgICoocF9kYXRhICsgNCkgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBfZGF0YSA9IChwX2JlZ2luICsgQVZSQ19WRU5ET1JfSERSX1NJWkUgKyAyKTsKLSAgICAgICAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAwKTsKLSAgICAgICAgICAgIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9iZWdpbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIEFWQ1RfTXNnUmVxKGhhbmRsZSwgbGFiZWwsIEFWQ1RfUlNQLCBwX3BrdCk7Ci0gICAgICAgICAgcF9tc2ctPmhkci5vcGNvZGUgPQotICAgICAgICAgICAgICBBVlJDX09QX0RST1A7IC8qIHVzZWQgdGhlIHBfcGt0IHRvIHNlbmQgcmVzcG9uc2UgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUDoKLSAgICAgICAgICBpZiAoKihwX2RhdGEgKyA0KSA9PSBwX2ZjYi0+ZnJhZ19wZHUpIHsKLSAgICAgICAgICAgIGF2cmNfc2VuZF9jb250aW51ZV9mcmFnKGhhbmRsZSwgbGFiZWwpOwotICAgICAgICAgICAgcF9tc2ctPmhkci5vcGNvZGUgPSBBVlJDX09QX0RST1BfTl9GUkVFOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiB0aGUgcGR1IGlkIGRvZXMgbm90IG1hdGNoIC0gcmVqZWN0IHRoZSBjb21tYW5kIHVzaW5nIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgKiBHS0kgYnVmZmVyICovCi0gICAgICAgICAgICBBVlJDX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgICAgICIlcyBjb250aW51ZSBwZHU6IDB4JXggZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgcGR1OiAweCV4IiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKihwX2RhdGEgKyA0KSwgcF9mY2ItPmZyYWdfcGR1KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgICAgICAgICAgIGFib3J0X2ZyYWcgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIC8qIGltcGxpY2l0IGFib3J0ICovCi0gICAgICAgICAgYWJvcnRfZnJhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFib3J0X2ZyYWcgPSB0cnVlOwotICAgICAgLyogaW1wbGljaXQgYWJvcnQgKi8KLSAgICB9Ci0KLSAgICBpZiAoYWJvcnRfZnJhZykgewotICAgICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZmNiLT5wX2Ztc2cpOwotICAgICAgcF9mY2ItPmZyYWdfZW5hYmxlZCA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICBwX3JzcCA9IChCVF9IRFIqKW9zaV9jYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0gICAgcF9yc3AtPm9mZnNldCA9IHBfcGt0LT5vZmZzZXQ7Ci0gICAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3JzcCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgICAqcF9kYXRhKysgPSBBVlJDX1JTUF9SRUo7Ci0gICAgcF9kYXRhICs9IEFWUkNfVkVORE9SX0hEUl9TSVpFOyAvKiBwZHUgKi8KLSAgICAqcF9kYXRhKysgPSAwOyAgICAgICAgICAgICAgICAgIC8qIHBrdF90eXBlICovCi0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDEpOyAvKiBsZW4gKi8KLSAgICAqcF9kYXRhKysgPSBzdGF0dXM7ICAgICAgICAgICAgIC8qIGVycm9yIGNvZGUgKi8KLSAgICBwX3JzcC0+bGVuID0gQVZSQ19WRU5ET1JfSERSX1NJWkUgKyA1OwotICB9Ci0KLSAgcmV0dXJuIHBfcnNwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX3Byb2NfZmFyX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgbWV0YWRhdGEgZnJhZ21lbmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGFuZCByZWFzc2VtYmx5Ci0gKgotICogUmV0dXJucyAgICAgICAgICAwLCB0byByZXBvcnQgdGhlIG1lc3NhZ2Ugd2l0aCBtc2dfY2JhY2sgLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IGF2cmNfcHJvY19mYXJfbXNnKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiogcHBfcGt0LCB0QVZSQ19NU0dfVkVORE9SKiBwX21zZykgewotICBCVF9IRFIqIHBfcGt0ID0gKnBwX3BrdDsKLSAgdWludDhfdCogcF9kYXRhOwotICB1aW50OF90IGRyb3BfY29kZSA9IDA7Ci0gIGJvb2wgYnVmX292ZXJmbG93ID0gZmFsc2U7Ci0gIEJUX0hEUiogcF9yc3AgPSBOVUxMOwotICBCVF9IRFIqIHBfY21kID0gTlVMTDsKLSAgYm9vbCByZXFfY29udGludWUgPSBmYWxzZTsKLSAgQlRfSERSKiBwX3BrdF9uZXcgPSBOVUxMOwotICB1aW50OF90IHBrdF90eXBlOwotICB0QVZSQ19SQVNNX0NCKiBwX3JjYjsKLSAgdEFWUkNfTkVYVF9DTUQgYXZyY19jbWQ7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0KLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLQotICAvKiBTa2lwIG92ZXIgdmVuZG9yIGhlYWRlciAoY3R5cGUsIHN1YnVuaXQqLCBvcGNvZGUsIENPX0lEKSAqLwotICBwX2RhdGEgKz0gQVZSQ19WRU5ET1JfSERSX1NJWkU7Ci0KLSAgcGt0X3R5cGUgPSAqKHBfZGF0YSArIDEpICYgQVZSQ19QS1RfVFlQRV9NQVNLOwotICBBVlJDX1RSQUNFX0RFQlVHKCJwa3RfdHlwZSAlZCIsIHBrdF90eXBlKTsKLSAgcF9yY2IgPSAmYXZyY19jYi5yY2JbaGFuZGxlXTsKLQotICAvKiBjaGVjayBpZiB0aGUgbWVzc2FnZSBuZWVkcyB0byBiZSByZS1hc3NlbWJsZWQgKi8KLSAgaWYgKHBrdF90eXBlID09IEFWUkNfUEtUX1NJTkdMRSB8fCBwa3RfdHlwZSA9PSBBVlJDX1BLVF9TVEFSVCkgewotICAgIC8qIHByZXZpb3VzIGZyYWdtZW50cyBuZWVkIHRvIGJlIGRyb3BwZWQsIHdoZW4gcmVjZWl2ZWQgYW5vdGhlciBuZXcgbWVzc2FnZQotICAgICAqLwotICAgIHBfcmNiLT5yYXNtX29mZnNldCA9IDA7Ci0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfcmNiLT5wX3Jtc2cpOwotICB9Ci0KLSAgaWYgKHBrdF90eXBlICE9IEFWUkNfUEtUX1NJTkdMRSAmJiBjciA9PSBBVkNUX1JTUCkgewotICAgIC8qIG5vdCBhIHNpbmdsZSByZXNwb25zZSBwYWNrZXQgLSBuZWVkIHRvIHJlLWFzc2VtYmxlIG1ldGFkYXRhIG1lc3NhZ2VzICovCi0gICAgaWYgKHBrdF90eXBlID09IEFWUkNfUEtUX1NUQVJUKSB7Ci0gICAgICAvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHJlLWFzc2VtYmx5ICovCi0gICAgICBwX3JjYi0+cmFzbV9wZHUgPSAqcF9kYXRhOwotICAgICAgcF9yY2ItPnBfcm1zZyA9IChCVF9IRFIqKW9zaV9jYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0gICAgICAvKiBDb3B5IFNUQVJUIHBhY2tldCB0byBidWZmZXIgZm9yIHJlLWFzc2VtYmxpbmcgZnJhZ21lbnRzICovCi0gICAgICBtZW1jcHkocF9yY2ItPnBfcm1zZywgcF9wa3QsIHNpemVvZihCVF9IRFIpKTsgLyogQ29weSBidCBoZHIgKi8KLQotICAgICAgLyogQ29weSBtZXRhZGF0YSBtZXNzYWdlICovCi0gICAgICBtZW1jcHkoKHVpbnQ4X3QqKShwX3JjYi0+cF9ybXNnICsgMSksCi0gICAgICAgICAgICAgKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldCwgcF9wa3QtPmxlbik7Ci0KLSAgICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBtZXRhZGF0YSByZXNwb25zZSBpbiByZWFzc2VtYmx5IGJ1ZmZlciAqLwotICAgICAgcF9yY2ItPnBfcm1zZy0+b2Zmc2V0ID0gcF9yY2ItPnJhc21fb2Zmc2V0ID0gMDsKLQotICAgICAgLyoKLSAgICAgICAqIEZyZWUgb3JpZ2luYWwgU1RBUlQgcGFja2V0LCByZXBsYWNlIHdpdGggcG9pbnRlciB0bwotICAgICAgICogcmVhc3NlbWJseSBidWZmZXIuCi0gICAgICAgKi8KLSAgICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICAgICpwcF9wa3QgPSBwX3JjYi0+cF9ybXNnOwotCi0gICAgICAvKgotICAgICAgICogU2V0IG9mZnNldCB0byBwb2ludCB0byB3aGVyZSB0byBjb3B5IG5leHQgLSB1c2UgdGhlIHNhbWUKLSAgICAgICAqIHJlYXNzZW1ibHkgbG9naWMgYXMgQVZDVC4KLSAgICAgICAqLwotICAgICAgcF9yY2ItPnBfcm1zZy0+b2Zmc2V0ICs9IHBfcmNiLT5wX3Jtc2ctPmxlbjsKLSAgICAgIHJlcV9jb250aW51ZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChwX3JjYi0+cF9ybXNnID09IE5VTEwpIHsKLSAgICAgIC8qIFJlY2VpdmVkIGEgQ09OVElOVUUvRU5ELCBidXQgbm8gY29ycmVzcG9uZGluZyBTVEFSVAotICAgICAgICAgICAgICAgICAgICAgIChvciBwcmV2aW91cyBmcmFnbWVudGVkIHJlc3BvbnNlIHdhcyBkcm9wcGVkKSAqLwotICAgICAgQVZSQ19UUkFDRV9ERUJVRygKLSAgICAgICAgICAiUmVjZWl2ZWQgYSBDT05USU5VRS9FTkQgd2l0aG91dCBubyBjb3JyZXNwb25kaW5nIFNUQVJUIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIHByZXZpb3VzIGZyYWdtZW50ZWQgcmVzcG9uc2Ugd2FzIGRyb3BwZWQpIik7Ci0gICAgICBkcm9wX2NvZGUgPSA1OwotICAgICAgb3NpX2ZyZWUocF9wa3QpOwotICAgICAgKnBwX3BrdCA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGdldCBzaXplIG9mIGJ1ZmZlciBob2xkaW5nIGFzc2VtYmxlZCBtZXNzYWdlICovCi0gICAgICAvKgotICAgICAgICogTk9URTogVGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYWJvdmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAqIHJlYXNzZW1ibHksIGFuZCBpcyBhbHdheXMgb2Ygc2l6ZSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFLgotICAgICAgICovCi0gICAgICB1aW50MTZfdCBidWZfbGVuID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIHNpemVvZihCVF9IRFIpOwotICAgICAgLyogYWRqdXN0IG9mZnNldCBhbmQgbGVuIG9mIGZyYWdtZW50IGZvciBoZWFkZXIgYnl0ZSAqLwotICAgICAgcF9wa3QtPm9mZnNldCArPSAoQVZSQ19WRU5ET1JfSERSX1NJWkUgKyBBVlJDX01JTl9NRVRBX0hEUl9TSVpFKTsKLSAgICAgIHBfcGt0LT5sZW4gLT0gKEFWUkNfVkVORE9SX0hEUl9TSVpFICsgQVZSQ19NSU5fTUVUQV9IRFJfU0laRSk7Ci0gICAgICAvKiB2ZXJpZnkgbGVuZ3RoICovCi0gICAgICBpZiAoKHBfcmNiLT5wX3Jtc2ctPm9mZnNldCArIHBfcGt0LT5sZW4pID4gYnVmX2xlbikgewotICAgICAgICBBVlJDX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAiRnJhZ21lbnRlZCBtZXNzYWdlIHRvbyBiaWchIC0gcmVwb3J0IHRoZSBwYXJ0aWFsIG1lc3NhZ2UiKTsKLSAgICAgICAgcF9wa3QtPmxlbiA9IGJ1Zl9sZW4gLSBwX3JjYi0+cF9ybXNnLT5vZmZzZXQ7Ci0gICAgICAgIHBrdF90eXBlID0gQVZSQ19QS1RfRU5EOwotICAgICAgICBidWZfb3ZlcmZsb3cgPSB0cnVlOwotICAgICAgfQotCi0gICAgICAvKiBjb3B5IGNvbnRlbnRzIG9mIHBfcGt0IHRvIHBfcnhfbXNnICovCi0gICAgICBtZW1jcHkoKHVpbnQ4X3QqKShwX3JjYi0+cF9ybXNnICsgMSkgKyBwX3JjYi0+cF9ybXNnLT5vZmZzZXQsCi0gICAgICAgICAgICAgKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldCwgcF9wa3QtPmxlbik7Ci0KLSAgICAgIGlmIChwa3RfdHlwZSA9PSBBVlJDX1BLVF9FTkQpIHsKLSAgICAgICAgcF9yY2ItPnBfcm1zZy0+b2Zmc2V0ID0gcF9yY2ItPnJhc21fb2Zmc2V0OwotICAgICAgICBwX3JjYi0+cF9ybXNnLT5sZW4gKz0gcF9wa3QtPmxlbjsKLSAgICAgICAgcF9wa3RfbmV3ID0gcF9yY2ItPnBfcm1zZzsKLSAgICAgICAgcF9yY2ItPnJhc21fb2Zmc2V0ID0gMDsKLSAgICAgICAgcF9yY2ItPnBfcm1zZyA9IE5VTEw7Ci0gICAgICAgIHBfbXNnLT5wX3ZlbmRvcl9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdF9uZXcgKyAxKSArIHBfcGt0X25ldy0+b2Zmc2V0OwotICAgICAgICBwX21zZy0+aGRyLmN0eXBlID0gcF9tc2ctPnBfdmVuZG9yX2RhdGFbMF0gJiBBVlJDX0NUWVBFX01BU0s7Ci0gICAgICAgIC8qIDYgPSBjdHlwZSwgc3VidW5pdCosIG9wY29kZSAmIENPX0lEICovCi0gICAgICAgIHBfbXNnLT5wX3ZlbmRvcl9kYXRhICs9IEFWUkNfVkVORE9SX0hEUl9TSVpFOwotICAgICAgICBwX21zZy0+dmVuZG9yX2xlbiA9IHBfcGt0X25ldy0+bGVuIC0gQVZSQ19WRU5ET1JfSERSX1NJWkU7Ci0gICAgICAgIHBfZGF0YSA9IHBfbXNnLT5wX3ZlbmRvcl9kYXRhICsgMTsgLyogc2tpcCBwZHUgKi8KLSAgICAgICAgKnBfZGF0YSsrID0gQVZSQ19QS1RfU0lOR0xFOwotICAgICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9tc2ctPnZlbmRvcl9sZW4gLSBBVlJDX01JTl9NRVRBX0hEUl9TSVpFKSk7Ci0gICAgICAgIEFWUkNfVFJBQ0VfREVCVUcoImVuZCBmcmFnOiVkLCB0b3RhbCBsZW46JWQsIG9mZnNldDolZCIsIHBfcGt0LT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9wa3RfbmV3LT5sZW4sIHBfcGt0X25ldy0+b2Zmc2V0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfcmNiLT5wX3Jtc2ctPm9mZnNldCArPSBwX3BrdC0+bGVuOwotICAgICAgICBwX3JjYi0+cF9ybXNnLT5sZW4gKz0gcF9wa3QtPmxlbjsKLSAgICAgICAgcF9wa3RfbmV3ID0gTlVMTDsKLSAgICAgICAgcmVxX2NvbnRpbnVlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICAgICpwcF9wa3QgPSBwX3BrdF9uZXc7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNyID09IEFWQ1RfQ01EKSB7Ci0gICAgcF9yc3AgPSBhdnJjX3Byb2NfdmVuZG9yX2NvbW1hbmQoaGFuZGxlLCBsYWJlbCwgKnBwX3BrdCwgcF9tc2cpOwotICAgIGlmIChwX3JzcCkgewotICAgICAgQVZDVF9Nc2dSZXEoaGFuZGxlLCBsYWJlbCwgQVZDVF9SU1AsIHBfcnNwKTsKLSAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKXBwX3BrdCk7Ci0gICAgICBkcm9wX2NvZGUgPSAzOwotICAgIH0gZWxzZSBpZiAocF9tc2ctPmhkci5vcGNvZGUgPT0gQVZSQ19PUF9EUk9QKSB7Ci0gICAgICBkcm9wX2NvZGUgPSAxOwotICAgIH0gZWxzZSBpZiAocF9tc2ctPmhkci5vcGNvZGUgPT0gQVZSQ19PUF9EUk9QX05fRlJFRSkKLSAgICAgIGRyb3BfY29kZSA9IDQ7Ci0KLSAgfSBlbHNlIGlmIChjciA9PSBBVkNUX1JTUCkgewotICAgIGlmIChyZXFfY29udGludWUpIHsKLSAgICAgIGF2cmNfY21kLnBkdSA9IEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUDsKLSAgICAgIGRyb3BfY29kZSA9IDI7Ci0gICAgfSBlbHNlIGlmIChidWZfb3ZlcmZsb3cpIHsKLSAgICAgIC8qIEluY29taW5nIG1lc3NhZ2UgdG9vIGJpZyB0byBmaXQgaW4gQlRfREVGQVVMVF9CVUZGRVJfU0laRS4gU2VuZCBhYm9ydAotICAgICAgICogdG8gcGVlciAgKi8KLSAgICAgIGF2cmNfY21kLnBkdSA9IEFWUkNfUERVX0FCT1JUX0NPTlRJTlVBVElPTl9SU1A7Ci0gICAgICBkcm9wX2NvZGUgPSA0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZHJvcF9jb2RlOwotICAgIH0KLSAgICBhdnJjX2NtZC5zdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgICBhdnJjX2NtZC50YXJnZXRfcGR1ID0gcF9yY2ItPnJhc21fcGR1OwotCi0gICAgdEFWUkNfQ09NTUFORCBhdnJjX2NvbW1hbmQ7Ci0gICAgYXZyY19jb21tYW5kLmNvbnRpbnUgPSBhdnJjX2NtZDsKLSAgICBzdGF0dXMgPSBBVlJDX0JsZENvbW1hbmQoJmF2cmNfY29tbWFuZCwgJnBfY21kKTsKLSAgICBpZiAoc3RhdHVzID09IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgICBBVlJDX01zZ1JlcShoYW5kbGUsICh1aW50OF90KShsYWJlbCksIEFWUkNfQ01EX0NUUkwsIHBfY21kKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZHJvcF9jb2RlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX21zZ19jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSBBVkNUUCB0byByZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgQVYgY29udHJvbCBtZXNzYWdlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZyY19tc2dfY2JhY2sodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOwotICB0QVZSQ19NU0cgbXNnOwotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQ4X3QqIHBfYmVnaW47Ci0gIGJvb2wgZHJvcCA9IGZhbHNlOwotICBib29sIGRvX2ZyZWUgPSB0cnVlOwotICBCVF9IRFIqIHBfcnNwID0gTlVMTDsKLSAgdWludDhfdCogcF9yc3BfZGF0YTsKLSAgaW50IHh4OwotICBib29sIHJlamVjdCA9IGZhbHNlOwotICBjb25zdCBjaGFyKiBwX2Ryb3BfbXNnID0gImRyb3BwZWQiOwotICB0QVZSQ19NU0dfVkVORE9SKiBwX21zZyA9ICZtc2cudmVuZG9yOwotCi0gIGlmIChjciA9PSBBVkNUX0NNRCAmJiAocF9wa3QtPmxheWVyX3NwZWNpZmljICYgQVZDVF9EQVRBX0NUUkwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX3BrdC0+bGVuID4gQVZSQ19QQUNLRVRfTEVOKSkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc3NjExOTU4Iik7Ci0gICAgQVZSQ19UUkFDRV9XQVJOSU5HKCIlczogQ29tbWFuZCBsZW5ndGggJWQgdG9vIGxvbmc6IG11c3QgYmUgYXQgbW9zdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3BrdC0+bGVuLCBBVlJDX1BBQ0tFVF9MRU4pOwotICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY3IgPT0gQVZDVF9SRUopIHsKLSAgICAvKiBUaGUgcGVlciB0aGlua3MgdGhhdCB0aGlzIFBJRCBpcyBubyBsb25nZXIgb3BlbiAtIHJlbW92ZSB0aGlzIGhhbmRsZSAqLwotICAgIC8qICAqLwotICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICBBVkNUX1JlbW92ZUNvbm4oaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAoY3IgPT0gQVZDVF9SU1ApIHsKLSAgICAvKiBSZWNlaXZlZCByZXNwb25zZS4gU3RvcCBjb21tYW5kIHRpbWVvdXQgdGltZXIgKi8KLSAgICBBVlJDX1RSQUNFX0RFQlVHKCJBVlJDOiBzdG9wcGluZyB0aW1lciAoaGFuZGxlPTB4JTAyeCkiLCBoYW5kbGUpOwotICAgIGFsYXJtX2NhbmNlbChhdnJjX2NiLmNjYl9pbnRbaGFuZGxlXS50bGUpOwotICB9Ci0KLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgbWVtc2V0KCZtc2csIDAsIHNpemVvZih0QVZSQ19NU0cpKTsKLQotICBpZiAocF9wa3QtPmxheWVyX3NwZWNpZmljID09IEFWQ1RfREFUQV9CUk9XU0UpIHsKLSAgICBvcGNvZGUgPSBBVlJDX09QX0JST1dTRTsKLSAgICBtc2cuYnJvd3NlLmhkci5jdHlwZSA9IGNyOwotICAgIG1zZy5icm93c2UucF9icm93c2VfZGF0YSA9IHBfZGF0YTsKLSAgICBtc2cuYnJvd3NlLmJyb3dzZV9sZW4gPSBwX3BrdC0+bGVuOwotICAgIG1zZy5icm93c2UucF9icm93c2VfcGt0ID0gcF9wa3Q7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHBfcGt0LT5sZW4gPCBBVlJDX0FWQ19IRFJfU0laRSkgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE4MDM5MjUiKTsKLSAgICAgIEFWUkNfVFJBQ0VfV0FSTklORygiJXM6IG1lc3NhZ2UgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcGt0LT5sZW4sIEFWUkNfQVZDX0hEUl9TSVpFKTsKLSAgICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbXNnLmhkci5jdHlwZSA9IHBfZGF0YVswXSAmIEFWUkNfQ1RZUEVfTUFTSzsKLSAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBoYW5kbGU6JWQsIGN0eXBlOiVkLCBvZmZzZXQ6JWQsIGxlbjogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgbXNnLmhkci5jdHlwZSwgcF9wa3QtPm9mZnNldCwgcF9wa3QtPmxlbik7Ci0gICAgbXNnLmhkci5zdWJ1bml0X3R5cGUgPQotICAgICAgICAocF9kYXRhWzFdICYgQVZSQ19TVUJUWVBFX01BU0spID4+IEFWUkNfU1VCVFlQRV9TSElGVDsKLSAgICBtc2cuaGRyLnN1YnVuaXRfaWQgPSBwX2RhdGFbMV0gJiBBVlJDX1NVQklEX01BU0s7Ci0gICAgb3Bjb2RlID0gcF9kYXRhWzJdOwotICB9Ci0KLSAgaWYgKCgoYXZyY19jYi5jY2JbaGFuZGxlXS5jb250cm9sICYgQVZSQ19DVF9UQVJHRVQpICYmIChjciA9PSBBVkNUX0NNRCkpIHx8Ci0gICAgICAoKGF2cmNfY2IuY2NiW2hhbmRsZV0uY29udHJvbCAmIEFWUkNfQ1RfQ09OVFJPTCkgJiYgKGNyID09IEFWQ1RfUlNQKSkpIHsKLSAgICBzd2l0Y2ggKG9wY29kZSkgewotICAgICAgY2FzZSBBVlJDX09QX1VOSVRfSU5GTzoKLSAgICAgICAgaWYgKGNyID09IEFWQ1RfQ01EKSB7Ci0gICAgICAgICAgLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHBlZXIgKi8KLSAgICAgICAgICBwX3JzcCA9IGF2cmNfY29weV9wYWNrZXQocF9wa3QsIEFWUkNfT1BfVU5JVF9JTkZPX1JTUF9MRU4pOwotICAgICAgICAgIHBfcnNwX2RhdGEgPSBhdnJjX2dldF9kYXRhX3B0cihwX3JzcCk7Ci0gICAgICAgICAgKnBfcnNwX2RhdGEgPSBBVlJDX1JTUF9JTVBMX1NUQkw7Ci0gICAgICAgICAgLyogY2hlY2sgJiBzZXQgdGhlIG9mZnNldC4gc2V0IHJlc3BvbnNlIGNvZGUsIHNldCBzdWJ1bml0X3R5cGUgJgotICAgICAgICAgICAgIHN1YnVuaXRfaWQsCi0gICAgICAgICAgICAgc2V0IEFWUkNfT1BfVU5JVF9JTkZPICovCi0gICAgICAgICAgLyogMyBieXRlczogY3R5cGUsIHN1YnVuaXQqLCBvcGNvZGUgKi8KLSAgICAgICAgICBwX3JzcF9kYXRhICs9IEFWUkNfQVZDX0hEUl9TSVpFOwotICAgICAgICAgICpwX3JzcF9kYXRhKysgPSA3OwotICAgICAgICAgIC8qIFBhbmVsIHN1YnVuaXQgJiBpZD0wICovCi0gICAgICAgICAgKnBfcnNwX2RhdGErKyA9IChBVlJDX1NVQl9QQU5FTCA8PCBBVlJDX1NVQlRZUEVfU0hJRlQpOwotICAgICAgICAgIEFWUkNfQ09fSURfVE9fQkVfU1RSRUFNKHBfcnNwX2RhdGEsIGF2cmNfY2IuY2NiW2hhbmRsZV0uY29tcGFueV9pZCk7Ci0gICAgICAgICAgcF9yc3AtPmxlbiA9Ci0gICAgICAgICAgICAgICh1aW50MTZfdCkocF9yc3BfZGF0YSAtICh1aW50OF90KikocF9yc3AgKyAxKSAtIHBfcnNwLT5vZmZzZXQpOwotICAgICAgICAgIGNyID0gQVZDVF9SU1A7Ci0gICAgICAgICAgcF9kcm9wX21zZyA9ICJhdXRvIHJlc3BvbmQiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIHBhcnNlIHJlc3BvbnNlICovCi0gICAgICAgICAgaWYgKHBfcGt0LT5sZW4gPCBBVlJDX09QX1VOSVRfSU5GT19SU1BfTEVOKSB7Ci0gICAgICAgICAgICBBVlJDX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICAgIiVzOiBtZXNzYWdlIGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3BrdC0+bGVuLCBBVlJDX09QX1VOSVRfSU5GT19SU1BfTEVOKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzk4ODM4MjQiKTsKLSAgICAgICAgICAgIGRyb3AgPSB0cnVlOwotICAgICAgICAgICAgcF9kcm9wX21zZyA9ICJVTklUX0lORk9fUlNQIHRvbyBzaG9ydCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcF9kYXRhICs9IDQ7IC8qIDMgYnl0ZXM6IGN0eXBlLCBzdWJ1bml0Kiwgb3Bjb2RlICsgb2N0ZXQgMyAoaXMgNykqLwotICAgICAgICAgIG1zZy51bml0LnVuaXRfdHlwZSA9Ci0gICAgICAgICAgICAgICgqcF9kYXRhICYgQVZSQ19TVUJUWVBFX01BU0spID4+IEFWUkNfU1VCVFlQRV9TSElGVDsKLSAgICAgICAgICBtc2cudW5pdC51bml0ID0gKnBfZGF0YSAmIEFWUkNfU1VCSURfTUFTSzsKLSAgICAgICAgICBwX2RhdGErKzsKLSAgICAgICAgICBBVlJDX0JFX1NUUkVBTV9UT19DT19JRChtc2cudW5pdC5jb21wYW55X2lkLCBwX2RhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfT1BfU1VCX0lORk86Ci0gICAgICAgIGlmIChjciA9PSBBVkNUX0NNRCkgewotICAgICAgICAgIC8qIHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBwZWVyICovCi0gICAgICAgICAgcF9yc3AgPSBhdnJjX2NvcHlfcGFja2V0KHBfcGt0LCBBVlJDX09QX1NVQl9VTklUX0lORk9fUlNQX0xFTik7Ci0gICAgICAgICAgcF9yc3BfZGF0YSA9IGF2cmNfZ2V0X2RhdGFfcHRyKHBfcnNwKTsKLSAgICAgICAgICAqcF9yc3BfZGF0YSA9IEFWUkNfUlNQX0lNUExfU1RCTDsKLSAgICAgICAgICAvKiBjaGVjayAmIHNldCB0aGUgb2Zmc2V0LiBzZXQgcmVzcG9uc2UgY29kZSwgc2V0IChzdWJ1bml0X3R5cGUgJgotICAgICAgICAgICAgIHN1YnVuaXRfaWQpLAotICAgICAgICAgICAgIHNldCBBVlJDX09QX1NVQl9JTkZPLCBzZXQgKHBhZ2UgJiBleHRlbnRpb24gY29kZSkgKi8KLSAgICAgICAgICBwX3JzcF9kYXRhICs9IDQ7Ci0gICAgICAgICAgLyogUGFuZWwgc3VidW5pdCAmIGlkPTAgKi8KLSAgICAgICAgICAqcF9yc3BfZGF0YSsrID0gKEFWUkNfU1VCX1BBTkVMIDw8IEFWUkNfU1VCVFlQRV9TSElGVCk7Ci0gICAgICAgICAgbWVtc2V0KHBfcnNwX2RhdGEsIEFWUkNfQ01EX09QUk5EX1BBRCwgQVZSQ19TVUJSU1BfT1BSTkRfQllURVMpOwotICAgICAgICAgIHBfcnNwX2RhdGEgKz0gQVZSQ19TVUJSU1BfT1BSTkRfQllURVM7Ci0gICAgICAgICAgcF9yc3AtPmxlbiA9Ci0gICAgICAgICAgICAgICh1aW50MTZfdCkocF9yc3BfZGF0YSAtICh1aW50OF90KikocF9yc3AgKyAxKSAtIHBfcnNwLT5vZmZzZXQpOwotICAgICAgICAgIGNyID0gQVZDVF9SU1A7Ci0gICAgICAgICAgcF9kcm9wX21zZyA9ICJhdXRvIHJlc3BvbmRlZCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLyogcGFyc2UgcmVzcG9uc2UgKi8KLSAgICAgICAgICBpZiAocF9wa3QtPmxlbiA8IEFWUkNfT1BfU1VCX1VOSVRfSU5GT19SU1BfTEVOKSB7Ci0gICAgICAgICAgICBBVlJDX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICAgIiVzOiBtZXNzYWdlIGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX3BrdC0+bGVuLCBBVlJDX09QX1NVQl9VTklUX0lORk9fUlNQX0xFTik7Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc5ODgzODI0Iik7Ci0gICAgICAgICAgICBkcm9wID0gdHJ1ZTsKLSAgICAgICAgICAgIHBfZHJvcF9tc2cgPSAiU1VCX1VOSVRfSU5GT19SU1AgdG9vIHNob3J0IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBwX2RhdGEgKz0gQVZSQ19BVkNfSERSX1NJWkU7IC8qIDMgYnl0ZXM6IGN0eXBlLCBzdWJ1bml0Kiwgb3Bjb2RlICovCi0gICAgICAgICAgbXNnLnN1Yi5wYWdlID0KLSAgICAgICAgICAgICAgKCpwX2RhdGErKyA+PiBBVlJDX1NVQl9QQUdFX1NISUZUKSAmIEFWUkNfU1VCX1BBR0VfTUFTSzsKLSAgICAgICAgICB4eCA9IDA7Ci0gICAgICAgICAgd2hpbGUgKCpwX2RhdGEgIT0gQVZSQ19DTURfT1BSTkRfUEFEICYmIHh4IDwgQVZSQ19TVUJfVFlQRV9MRU4pIHsKLSAgICAgICAgICAgIG1zZy5zdWIuc3VidW5pdF90eXBlW3h4XSA9ICpwX2RhdGErKyA+PiBBVlJDX1NVQlRZUEVfU0hJRlQ7Ci0gICAgICAgICAgICBpZiAobXNnLnN1Yi5zdWJ1bml0X3R5cGVbeHhdID09IEFWUkNfU1VCX1BBTkVMKQotICAgICAgICAgICAgICBtc2cuc3ViLnBhbmVsID0gdHJ1ZTsKLSAgICAgICAgICAgIHh4Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfT1BfVkVORE9SOiB7Ci0gICAgICAgIHBfZGF0YSA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gICAgICAgIHBfYmVnaW4gPSBwX2RhdGE7Ci0gICAgICAgIGlmIChwX3BrdC0+bGVuIDwKLSAgICAgICAgICAgIEFWUkNfVkVORE9SX0hEUl9TSVpFKSAvKiA2ID0gY3R5cGUsIHN1YnVuaXQqLCBvcGNvZGUgJiBDT19JRCAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNyID09IEFWQ1RfQ01EKQotICAgICAgICAgICAgcmVqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcm9wID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwX2RhdGEgKz0gQVZSQ19BVkNfSERSX1NJWkU7IC8qIHNraXAgdGhlIGZpcnN0IDMgYnl0ZXM6IGN0eXBlLCBzdWJ1bml0KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgKi8KLSAgICAgICAgQVZSQ19CRV9TVFJFQU1fVE9fQ09fSUQocF9tc2ctPmNvbXBhbnlfaWQsIHBfZGF0YSk7Ci0gICAgICAgIHBfbXNnLT5wX3ZlbmRvcl9kYXRhID0gcF9kYXRhOwotICAgICAgICBwX21zZy0+dmVuZG9yX2xlbiA9IHBfcGt0LT5sZW4gLSAocF9kYXRhIC0gcF9iZWdpbik7Ci0KLSAgICAgICAgdWludDhfdCBkcm9wX2NvZGUgPSAwOwotICAgICAgICBpZiAocF9tc2ctPmNvbXBhbnlfaWQgPT0gQVZSQ19DT19NRVRBREFUQSkgewotICAgICAgICAgIC8qIFZhbGlkYXRlIGxlbmd0aCBmb3IgbWV0YWRhdGEgbWVzc2FnZSAqLwotICAgICAgICAgIGlmIChwX3BrdC0+bGVuIDwgKEFWUkNfVkVORE9SX0hEUl9TSVpFICsgQVZSQ19NSU5fTUVUQV9IRFJfU0laRSkpIHsKLSAgICAgICAgICAgIGlmIChjciA9PSBBVkNUX0NNRCkKLSAgICAgICAgICAgICAgcmVqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZHJvcCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBDaGVjaytoYW5kbGUgZnJhZ21lbnRlZCBtZXNzYWdlcyAqLwotICAgICAgICAgIGRyb3BfY29kZSA9IGF2cmNfcHJvY19mYXJfbXNnKGhhbmRsZSwgbGFiZWwsIGNyLCAmcF9wa3QsIHBfbXNnKTsKLSAgICAgICAgICBpZiAoZHJvcF9jb2RlID4gMCkgZHJvcCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRyb3BfY29kZSA+IDApIHsKLSAgICAgICAgICBpZiAoZHJvcF9jb2RlICE9IDQpIGRvX2ZyZWUgPSBmYWxzZTsKLSAgICAgICAgICBzd2l0Y2ggKGRyb3BfY29kZSkgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBwX2Ryb3BfbXNnID0gInNlbnRfZnJhZyI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBwX2Ryb3BfbXNnID0gInJlcV9jb250IjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHBfZHJvcF9tc2cgPSAic2VudF9mcmFnMyI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBwX2Ryb3BfbXNnID0gInNlbnRfZnJhZ19mcmVlIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBwX2Ryb3BfbXNnID0gInNlbnRfZnJhZ2QiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBJZiB2ZW5kb3IgcmVzcG9uc2UgcmVjZWl2ZWQsIGFuZCBkaWQgbm90IGFzayBmb3IgY29udGludWF0aW9uICovCi0gICAgICAgIC8qIHRoZW4gY2hlY2sgcXVldWUgZm9yIGFkZGl0aW9uIGNvbW1hbmRzIHRvIHNlbmQgKi8KLSAgICAgICAgaWYgKChjciA9PSBBVkNUX1JTUCkgJiYgKGRyb3BfY29kZSAhPSAyKSkgewotICAgICAgICAgIGF2cmNfc2VuZF9uZXh0X3ZlbmRvcl9jbWQoaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX09QX1BBU1NfVEhSVToKLSAgICAgICAgaWYgKHBfcGt0LT5sZW4gPCA1KSAvKiAzIGJ5dGVzOiBjdHlwZSwgc3VidW5pdCosIG9wY29kZSAmIG9wX2lkICYgbGVuICovCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3IgPT0gQVZDVF9DTUQpCi0gICAgICAgICAgICByZWplY3QgPSB0cnVlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRyb3AgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBfZGF0YSArPSBBVlJDX0FWQ19IRFJfU0laRTsgLyogc2tpcCB0aGUgZmlyc3QgMyBieXRlczogY3R5cGUsIHN1YnVuaXQqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSAqLwotICAgICAgICBtc2cucGFzcy5vcF9pZCA9IChBVlJDX1BBU1NfT1BfSURfTUFTSyAmICpwX2RhdGEpOwotICAgICAgICBpZiAoQVZSQ19QQVNTX1NUQVRFX01BU0sgJiAqcF9kYXRhKQotICAgICAgICAgIG1zZy5wYXNzLnN0YXRlID0gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1zZy5wYXNzLnN0YXRlID0gZmFsc2U7Ci0gICAgICAgIHBfZGF0YSsrOwotICAgICAgICBtc2cucGFzcy5wYXNzX2xlbiA9ICpwX2RhdGErKzsKLSAgICAgICAgaWYgKG1zZy5wYXNzLnBhc3NfbGVuICE9IHBfcGt0LT5sZW4gLSA1KQotICAgICAgICAgIG1zZy5wYXNzLnBhc3NfbGVuID0gcF9wa3QtPmxlbiAtIDU7Ci0gICAgICAgIGlmIChtc2cucGFzcy5wYXNzX2xlbikKLSAgICAgICAgICBtc2cucGFzcy5wX3Bhc3NfZGF0YSA9IHBfZGF0YTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1zZy5wYXNzLnBfcGFzc19kYXRhID0gTlVMTDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19PUF9CUk9XU0U6Ci0gICAgICAgIC8qIElmIGJyb3dzZSByZXNwb25zZSByZWNlaXZlZCwgdGhlbiBjaGVjayBxdWV1ZSBmb3IgYWRkaXRpb24gY29tbWFuZHMKLSAgICAgICAgICogdG8gc2VuZCAqLwotICAgICAgICBpZiAoY3IgPT0gQVZDVF9SU1ApIHsKLSAgICAgICAgICBhdnJjX3NlbmRfbmV4dF92ZW5kb3JfY21kKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICgoYXZyY19jYi5jY2JbaGFuZGxlXS5jb250cm9sICYgQVZSQ19DVF9UQVJHRVQpICYmCi0gICAgICAgICAgICAoY3IgPT0gQVZDVF9DTUQpKSB7Ci0gICAgICAgICAgLyogcmVqZWN0IHVuc3VwcG9ydGVkIG9wY29kZSAqLwotICAgICAgICAgIHJlamVjdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZHJvcCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIC8qIGRyb3AgdGhlIGV2ZW50ICovCi0gIHsKLSAgICBpZiAob3Bjb2RlICE9IEFWUkNfT1BfQlJPV1NFKSBkcm9wID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChyZWplY3QpIHsKLSAgICAvKiByZWplY3QgdW5zdXBwb3J0ZWQgb3Bjb2RlICovCi0gICAgcF9yc3AgPSBhdnJjX2NvcHlfcGFja2V0KHBfcGt0LCBBVlJDX09QX1JFSl9NU0dfTEVOKTsKLSAgICBwX3JzcF9kYXRhID0gYXZyY19nZXRfZGF0YV9wdHIocF9yc3ApOwotICAgICpwX3JzcF9kYXRhID0gQVZSQ19SU1BfUkVKOwotICAgIHBfZHJvcF9tc2cgPSAicmVqZWN0ZWQiOwotICAgIGNyID0gQVZDVF9SU1A7Ci0gICAgZHJvcCA9IHRydWU7Ci0gIH0KLQotICBpZiAocF9yc3ApIHsKLSAgICAvKiBzZXQgdG8gc2VuZCByZXNwb25zZSByaWdodCBhd2F5ICovCi0gICAgQVZDVF9Nc2dSZXEoaGFuZGxlLCBsYWJlbCwgY3IsIHBfcnNwKTsKLSAgICBkcm9wID0gdHJ1ZTsKLSAgfQotCi0gIGlmICghZHJvcCkgewotICAgIG1zZy5oZHIub3Bjb2RlID0gb3Bjb2RlOwotICAgIGF2cmNfY2IuY2NiW2hhbmRsZV0ubXNnX2NiYWNrLlJ1bihoYW5kbGUsIGxhYmVsLCBvcGNvZGUsICZtc2cpOwotICB9IGVsc2UgewotICAgIEFWUkNfVFJBQ0VfV0FSTklORygiJXMgJXMgbXNnIGhhbmRsZTolZCwgY29udHJvbDolZCwgY3I6JWQsIG9wY29kZTp4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kcm9wX21zZywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBhdnJjX2NiLmNjYltoYW5kbGVdLmNvbnRyb2wsIGNyLCBvcGNvZGUpOwotICB9Ci0KLSAgaWYgKG9wY29kZSA9PSBBVlJDX09QX0JST1dTRSAmJiBtc2cuYnJvd3NlLnBfYnJvd3NlX3BrdCA9PSBOVUxMKSB7Ci0gICAgZG9fZnJlZSA9IGZhbHNlOwotICB9Ci0KLSAgaWYgKGRvX2ZyZWUpIG9zaV9mcmVlKHBfcGt0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19wYXNzX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29tcG9zZSBhIFBBU1MgVEhST1VHSCBjb21tYW5kIGFjY29yZGluZyB0byBwX21zZwotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFBBU1MgVEhST1VHSCBtZXNzYWdlIHN0cnVjdHVyZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gYSB2YWxpZCBHS0kgYnVmZmVyIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIE5VTEwgaWYgcF9tc2cgaXMgTlVMTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdnJjX3Bhc3NfbXNnKHRBVlJDX01TR19QQVNTKiBwX21zZykgewotICBDSEVDSyhwX21zZyAhPSBOVUxMKTsKLSAgQ0hFQ0soQVZSQ19DTURfQlVGX1NJWkUgPiAoQVZSQ19NSU5fQ01EX0xFTiArIHBfbXNnLT5wYXNzX2xlbikpOwotCi0gIEJUX0hEUiogcF9jbWQgPSAoQlRfSERSKilvc2lfY2FsbG9jKEFWUkNfQ01EX0JVRl9TSVpFKTsKLSAgcF9jbWQtPm9mZnNldCA9IEFWQ1RfTVNHX09GRlNFVDsKLSAgcF9jbWQtPmxheWVyX3NwZWNpZmljID0gQVZDVF9EQVRBX0NUUkw7Ci0KLSAgdWludDhfdCogcF9kYXRhID0gKHVpbnQ4X3QqKShwX2NtZCArIDEpICsgcF9jbWQtPm9mZnNldDsKLSAgKnBfZGF0YSsrID0gKHBfbXNnLT5oZHIuY3R5cGUgJiBBVlJDX0NUWVBFX01BU0spOwotICAqcF9kYXRhKysgPSAoQVZSQ19TVUJfUEFORUwgPDwgQVZSQ19TVUJUWVBFX1NISUZUKTsgLyogUGFuZWwgc3VidW5pdCAmIGlkPTAgKi8KLSAgKnBfZGF0YSsrID0gQVZSQ19PUF9QQVNTX1RIUlU7Ci0gICpwX2RhdGEgPSAoQVZSQ19QQVNTX09QX0lEX01BU0sgJiBwX21zZy0+b3BfaWQpOwotICBpZiAocF9tc2ctPnN0YXRlKSAqcF9kYXRhIHw9IEFWUkNfUEFTU19TVEFURV9NQVNLOwotICBwX2RhdGErKzsKLQotICBpZiAocF9tc2ctPm9wX2lkID09IEFWUkNfSURfVkVORE9SKSB7Ci0gICAgKnBfZGF0YSsrID0gcF9tc2ctPnBhc3NfbGVuOwotICAgIGlmIChwX21zZy0+cGFzc19sZW4gJiYgcF9tc2ctPnBfcGFzc19kYXRhKSB7Ci0gICAgICBtZW1jcHkocF9kYXRhLCBwX21zZy0+cF9wYXNzX2RhdGEsIHBfbXNnLT5wYXNzX2xlbik7Ci0gICAgICBwX2RhdGEgKz0gcF9tc2ctPnBhc3NfbGVuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBzZXQgbXNnIGxlbiB0byAwIGZvciBvdGhlciBvcF9pZCAqLwotICAgICpwX2RhdGErKyA9IDA7Ci0gIH0KLSAgcF9jbWQtPmxlbiA9ICh1aW50MTZfdCkocF9kYXRhIC0gKHVpbnQ4X3QqKShwX2NtZCArIDEpIC0gcF9jbWQtPm9mZnNldCk7Ci0KLSAgcmV0dXJuIHBfY21kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBUlZDX0dldFByb2ZpbGVWZXJzaW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIHVzZXIgYXNzaWduZWQgQVZSQ1AgcHJvZmlsZSB2ZXJzaW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBUaGUgQVZSQ1AgcHJvZmlsZSB2ZXJzaW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19HZXRQcm9maWxlVmVyc2lvbigpIHsKLSAgdWludDE2X3QgcHJvZmlsZV92ZXJzaW9uID0gQVZSQ19SRVZfMV80OwotICBjaGFyIGF2cmNwX3ZlcnNpb25bUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgb3NpX3Byb3BlcnR5X2dldChBVlJDX1ZFUlNJT05fUFJPUEVSVFksIGF2cmNwX3ZlcnNpb24sIEFWUkNfREVGQVVMVF9WRVJTSU9OKTsKLQotICBpZiAoIXN0cm5jbXAoQVZSQ18xXzZfU1RSSU5HLCBhdnJjcF92ZXJzaW9uLCBzaXplb2YoQVZSQ18xXzZfU1RSSU5HKSkpIHsKLSAgICBwcm9maWxlX3ZlcnNpb24gPSBBVlJDX1JFVl8xXzY7Ci0gIH0gZWxzZSBpZiAoIXN0cm5jbXAoQVZSQ18xXzVfU1RSSU5HLCBhdnJjcF92ZXJzaW9uLAotICAgICAgICAgICAgIHNpemVvZihBVlJDXzFfNV9TVFJJTkcpKSkgewotICAgIHByb2ZpbGVfdmVyc2lvbiA9IEFWUkNfUkVWXzFfNTsKLSAgfSBlbHNlIGlmICghc3RybmNtcChBVlJDXzFfM19TVFJJTkcsIGF2cmNwX3ZlcnNpb24sCi0gICAgICAgICAgICAgc2l6ZW9mKEFWUkNfMV8zX1NUUklORykpKSB7Ci0gICAgcHJvZmlsZV92ZXJzaW9uID0gQVZSQ19SRVZfMV8zOwotICB9Ci0KLSAgcmV0dXJuIHByb2ZpbGVfdmVyc2lvbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvcGVuIGEgY29ubmVjdGlvbiB0byBBVkNUUC4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24gY2FuIGJlIGVpdGhlciBhbiBpbml0aWF0b3Igb3IgYWNjZXB0b3IsIGFzCi0gKiAgICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIHBfY2NiLT5zdHJlYW0gcGFyYW1ldGVyLgotICogICAgICAgICAgICAgICAgICBUaGUgY29ubmVjdGlvbiBjYW4gYmUgYSB0YXJnZXQsIGEgY29udHJvbGxlciBvciBmb3IgYm90aAotICogICAgICAgICAgICAgICAgICByb2xlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBwX2NjYi0+Y29udHJvbCBwYXJhbWV0ZXIuCi0gKiAgICAgICAgICAgICAgICAgIEJ5IGRlZmluaXRpb24sIGEgdGFyZ2V0IGNvbm5lY3Rpb24gaXMgYW4gYWNjZXB0b3IgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICB0aGF0IHdhaXRzIGZvciBhbiBpbmNvbWluZyBBVkNUUCBjb25uZWN0aW9uIGZyb20gdGhlIHBlZXIuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBjb25uZWN0aW9uIHJlbWFpbnMgYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB1bnRpbAotICogICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gY2xvc2VzIGl0IGJ5IGNhbGxpbmcgQVZSQ19DbG9zZSgpLiAgVGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRvZXMgbm90IG5lZWQgdG8gcmVvcGVuIHRoZSBjb25uZWN0aW9uIGFmdGVyIGFuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQ0xPU0VfSU5EX0VWVCBpcyByZWNlaXZlZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+Y29tcGFueV9pZDogQ29tcGFueSBJZGVudGlmaWVyLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5wX2N0cmxfY2JhY2s6ICBQb2ludGVyIHRvIGNvbnRyb2wgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+cF9tc2dfY2JhY2s6ICBQb2ludGVyIHRvIG1lc3NhZ2UgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+Y29ubjogQVZDVFAgY29ubmVjdGlvbiByb2xlLiAgVGhpcyBpcyBzZXQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgIEFWQ1RQX0lOVCBmb3IgaW5pdGlhdG9yIGNvbm5lY3Rpb25zIGFuZCBBVkNUUF9BQ1AKLSAqICAgICAgICAgICAgICAgICAgICAgIGZvciBhY2NlcHRvciBjb25uZWN0aW9ucy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+Y29udHJvbDogQ29udHJvbCByb2xlLiAgVGhpcyBpcyBzZXQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgIEFWUkNfQ1RfVEFSR0VUIGZvciB0YXJnZXQgY29ubmVjdGlvbnMsIEFWUkNfQ1RfQ09OVFJPTAotICogICAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnRyb2wgY29ubmVjdGlvbnMgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIChBVlJDX0NUX1RBUkdFVHxBVlJDX0NUX0NPTlRST0wpCi0gKiAgICAgICAgICAgICAgICAgICAgICBmb3IgY29ubmVjdGlvbnMgdGhhdCBzdXBwb3J0IGJvdGggcm9sZXMuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyOiBCRCBhZGRyZXNzIG9mIHBlZXIgZGV2aWNlLiAgVGhpcyB2YWx1ZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgb25seSB1c2VkIGZvciBpbml0aWF0b3IgY29ubmVjdGlvbnM7IGZvciBhY2NlcHRvcgotICogICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgaXQgY2FuIGJlIHNldCB0byBOVUxMLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBwX2hhbmRsZTogUG9pbnRlciB0byBoYW5kbGUuICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaWYgQVZSQ19TVUNDRVNTIGlzIHJldHVybmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfTk9fUkVTT1VSQ0VTIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBvcGVuCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWUkNfT3Blbih1aW50OF90KiBwX2hhbmRsZSwgdEFWUkNfQ09OTl9DQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIHVpbnQxNl90IHN0YXR1czsKLSAgdEFWQ1RfQ0MgY2M7Ci0KLSAgY2MucF9jdHJsX2NiYWNrID0gYXZyY19jdHJsX2NiYWNrOyAgICAgICAgIC8qIENvbnRyb2wgY2FsbGJhY2sgKi8KLSAgY2MucF9tc2dfY2JhY2sgPSBhdnJjX21zZ19jYmFjazsgICAgICAgICAgIC8qIE1lc3NhZ2UgY2FsbGJhY2sgKi8KLSAgY2MucGlkID0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0w7IC8qIFByb2ZpbGUgSUQgKi8KLSAgY2Mucm9sZSA9IHBfY2NiLT5jb25uOyAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYXRvci9hY2NlcHRvciByb2xlICovCi0gIGNjLmNvbnRyb2wgPSBwX2NjYi0+Y29udHJvbDsgICAgICAgICAgICAgICAvKiBDb250cm9sIHJvbGUgKENvbnRyb2wvVGFyZ2V0KSAqLwotCi0gIHN0YXR1cyA9IEFWQ1RfQ3JlYXRlQ29ubihwX2hhbmRsZSwgJmNjLCBwZWVyX2FkZHIpOwotICBpZiAoc3RhdHVzID09IEFWQ1RfU1VDQ0VTUykgewotICAgIGF2cmNfY2IuY2NiWypwX2hhbmRsZV0gPSAqcF9jY2I7Ci0gICAgbWVtc2V0KCZhdnJjX2NiLmNjYl9pbnRbKnBfaGFuZGxlXSwgMCwgc2l6ZW9mKHRBVlJDX0NPTk5fSU5UX0NCKSk7Ci0gICAgbWVtc2V0KCZhdnJjX2NiLmZjYlsqcF9oYW5kbGVdLCAwLCBzaXplb2YodEFWUkNfRlJBR19DQikpOwotICAgIG1lbXNldCgmYXZyY19jYi5yY2JbKnBfaGFuZGxlXSwgMCwgc2l6ZW9mKHRBVlJDX1JBU01fQ0IpKTsKLSAgICBhdnJjX2NiLmNjYl9pbnRbKnBfaGFuZGxlXS50bGUgPSBhbGFybV9uZXcoImF2cmNwLmNvbW1hbmRUaW1lciIpOwotICAgIGF2cmNfY2IuY2NiX2ludFsqcF9oYW5kbGVdLmNtZF9xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgfQotICBBVlJDX1RSQUNFX0RFQlVHKCIlcyByb2xlOiAlZCwgY29udHJvbDolZCBzdGF0dXM6JWQsIGhhbmRsZTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIGNjLnJvbGUsIGNjLmNvbnRyb2wsIHN0YXR1cywgKnBfaGFuZGxlKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIGNvbm5lY3Rpb24gb3BlbmVkIHdpdGggQVZSQ19PcGVuKCkuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiBIYW5kbGUgb2YgdGhpcyBjb25uZWN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQkFEX0hBTkRMRSBpZiBoYW5kbGUgaXMgaW52YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVlJDX0Nsb3NlKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIEFWUkNfVFJBQ0VfREVCVUcoIiVzIGhhbmRsZTolZCIsIF9fZnVuY19fLCBoYW5kbGUpOwotICBhdnJjX2ZsdXNoX2NtZF9xKGhhbmRsZSk7Ci0gIHJldHVybiBBVkNUX1JlbW92ZUNvbm4oaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19PcGVuQnJvd3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvcGVuIGEgYnJvd3NpbmcgY29ubmVjdGlvbiB0bwotICogICAgICAgICAgICAgICAgICBBVkNUUC4gVGhlIGNvbm5lY3Rpb24gY2FuIGJlIGVpdGhlciBhbiBpbml0aWF0b3Igb3IKLSAqICAgICAgICAgICAgICAgICAgYWNjZXB0b3IsIGFzIGRldGVybWluZWQgYnkgdGhlIHBfY29ubl9yb2xlLgotICogICAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIGlzIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBBVlJDX09wZW4uCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19OT19SRVNPVVJDRVMgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIG9wZW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIGNvbm5lY3Rpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19PcGVuQnJvd3NlKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGNvbm5fcm9sZSkgewotICByZXR1cm4gQVZDVF9DcmVhdGVCcm93c2UoaGFuZGxlLCBjb25uX3JvbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0Nsb3NlQnJvd3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIGNvbm5lY3Rpb24gb3BlbmVkIHdpdGggQVZSQ19PcGVuQnJvd3NlKCkuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19CQURfSEFORExFIGlmIGhhbmRsZSBpcyBpbnZhbGlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWUkNfQ2xvc2VCcm93c2UodWludDhfdCBoYW5kbGUpIHsgcmV0dXJuIEFWQ1RfUmVtb3ZlQnJvd3NlKGhhbmRsZSk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19Nc2dSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIHRoZSBBVlJDUCBieXRlIHN0cmVhbSBpbiBwX3BrdAotICogICAgICAgICAgICAgICAgICBkb3duIHRvIEFWQ1RQLgotICoKLSAqICAgICAgICAgICAgICAgICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBwX3BrdC0+b2Zmc2V0IGlzIGF0IGxlYXN0Ci0gKiAgICAgICAgICAgICAgICAgIEFWQ1RfTVNHX09GRlNFVAotICogICAgICAgICAgICAgICAgICBwX3BrdC0+bGF5ZXJfc3BlY2lmaWMgaXMgQVZDVF9EQVRBX0NUUkwgb3IgQVZDVF9EQVRBX0JST1dTRQotICogICAgICAgICAgICAgICAgICBwX3BrdC0+ZXZlbnQgaXMgQVZSQ19PUF9WRU5ET1IsIEFWUkNfT1BfUEFTU19USFJVIG9yCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfT1BfQlJPV1NFCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhYm92ZSBCVF9IRFIgc2V0dGluZ3MgYXJlIHNldCBieSB0aGUgQVZSQ19CbGQqCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19Nc2dSZXEodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgdWludDhfdCBjciA9IEFWQ1RfQ01EOwotICBib29sIGNoa19mcmFnID0gdHJ1ZTsKLSAgdWludDhfdCogcF9zdGFydCA9IE5VTEw7Ci0gIHRBVlJDX0ZSQUdfQ0IqIHBfZmNiOwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQxNl90IHN0YXR1czsKLSAgdWludDhfdCBtc2dfbWFzayA9IDA7Ci0gIHVpbnQxNl90IHBlZXJfbXR1OwotCi0gIGlmICghcF9wa3QpIHJldHVybiBBVlJDX0JBRF9QQVJBTTsKLQotICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBoYW5kbGUgPSAldSBsYWJlbCA9ICV1IGN0eXBlID0gJXUgbGVuID0gJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICBoYW5kbGUsIGxhYmVsLCBjdHlwZSwgcF9wa3QtPmxlbik7Ci0gIC8qIEhhbmRsZSBmb3IgQVZSQ1AgZnJhZ21lbnQgKi8KLSAgYm9vbCBpc19uZXdfYXZyY3AgPSBvc2lfcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmVuYWJsZW5ld2F2cmNwIiwgdHJ1ZSk7Ci0gIGlmIChjdHlwZSA+PSBBVlJDX1JTUF9OT1RfSU1QTCkgY3IgPSBBVkNUX1JTUDsKLQotICBpZiAocF9wa3QtPmV2ZW50ID09IEFWUkNfT1BfVkVORE9SKSB7Ci0gICAgaWYgKGlzX25ld19hdnJjcCkgewotICAgICAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQgKyBBVlJDX1ZFTkRPUl9IRFJfU0laRTsKLSAgICB9IGVsc2UgewotICAgICAgLyogYWRkIEFWUkNQIFZlbmRvciBEZXBlbmRlbnQgaGVhZGVycyAqLwotICAgICAgcF9zdGFydCA9ICgodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0KTsKLSAgICAgIHBfcGt0LT5vZmZzZXQgLT0gQVZSQ19WRU5ET1JfSERSX1NJWkU7Ci0gICAgICBwX3BrdC0+bGVuICs9IEFWUkNfVkVORE9SX0hEUl9TSVpFOwotICAgICAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgICAgICpwX2RhdGErKyA9IChjdHlwZSAmIEFWUkNfQ1RZUEVfTUFTSyk7Ci0gICAgICAqcF9kYXRhKysgPSAoQVZSQ19TVUJfUEFORUwgPDwgQVZSQ19TVUJUWVBFX1NISUZUKTsKLSAgICAgICpwX2RhdGErKyA9IEFWUkNfT1BfVkVORE9SOwotICAgICAgQVZSQ19DT19JRF9UT19CRV9TVFJFQU0ocF9kYXRhLCBBVlJDX0NPX01FVEFEQVRBKTsKLQotICAgICAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUCAqLwotICAgICAgaWYgKGNyID09IEFWQ1RfQ01EKSB7Ci0gICAgICAgIG1zZ19tYXNrIHw9IEFWUkNfTVNHX01BU0tfSVNfVkVORE9SX0NNRDsKLQotICAgICAgICBpZiAoKCpwX3N0YXJ0ID09IEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUCkgfHwKLSAgICAgICAgICAgICgqcF9zdGFydCA9PSBBVlJDX1BEVV9BQk9SVF9DT05USU5VQVRJT05fUlNQKSkgewotICAgICAgICAgIG1zZ19tYXNrIHw9IEFWUkNfTVNHX01BU0tfSVNfQ09OVElOVUFUSU9OX1JTUDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIChwX3BrdC0+ZXZlbnQgPT0gQVZSQ19PUF9QQVNTX1RIUlUpIHsKLSAgICAvKiBhZGQgQVZSQ1AgUGFzcyBUaHJvdWdoIGhlYWRlcnMgKi8KLSAgICBwX3N0YXJ0ID0gKCh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQpOwotICAgIHBfcGt0LT5vZmZzZXQgLT0gQVZSQ19QQVNTX1RIUlVfU0laRTsKLSAgICBwX3BrdC0+bGVuICs9IEFWUkNfUEFTU19USFJVX1NJWkU7Ci0gICAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgICAqcF9kYXRhKysgPSAoY3R5cGUgJiBBVlJDX0NUWVBFX01BU0spOwotICAgICpwX2RhdGErKyA9IChBVlJDX1NVQl9QQU5FTCA8PCBBVlJDX1NVQlRZUEVfU0hJRlQpOwotICAgICpwX2RhdGErKyA9IEFWUkNfT1BfUEFTU19USFJVOyAvKiBvcGNvZGUgKi8KLSAgICAqcF9kYXRhKysgPSBBVlJDX0lEX1ZFTkRPUjsgICAgLyogb3BlcmF0aW9uIGlkICovCi0gICAgKnBfZGF0YSsrID0gNTsgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiBkYXRhIGxlbiAqLwotICAgIEFWUkNfQ09fSURfVE9fQkVfU1RSRUFNKHBfZGF0YSwgQVZSQ19DT19NRVRBREFUQSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2hrX2ZyYWcgPSBmYWxzZTsKLSAgICBpZiAocF9wa3QtPmxheWVyX3NwZWNpZmljID09IEFWQ1RfREFUQV9CUk9XU0UpIHsKLSAgICAgIHBlZXJfbXR1ID0gQVZDVF9HZXRCcm93c2VNdHUoaGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgcGVlcl9tdHUgPSBBVkNUX0dldFBlZXJNdHUoaGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKHBfcGt0LT5sZW4gPiAocGVlcl9tdHUgLSBBVkNUX0hEUl9MRU5fU0lOR0xFKSkgewotICAgICAgQVZSQ19UUkFDRV9FUlJPUigKLSAgICAgICAgICAiJXMgYmlnZ2VyIHRoYW4gcGVlciBtdHUgKHBfcGt0LT5sZW4oJWQpID4gcGVlcl9tdHUoJWQtJWQpKSIsCi0gICAgICAgICAgX19mdW5jX18sIHBfcGt0LT5sZW4sIHBlZXJfbXR1LCBBVkNUX0hEUl9MRU5fU0lOR0xFKTsKLSAgICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICAgIHJldHVybiBBVlJDX01TR19UT09fQklHOwotICAgIH0KLSAgfQotCi0gIC8qIGFiYW5kb24gcHJldmlvdXMgZnJhZ21lbnRzICovCi0gIHBfZmNiID0gJmF2cmNfY2IuZmNiW2hhbmRsZV07Ci0KLSAgaWYgKHBfZmNiID09IE5VTEwpIHsKLSAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyBwX2ZjYiBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgIG9zaV9mcmVlKHBfcGt0KTsKLSAgICByZXR1cm4gQVZSQ19OT1RfT1BFTjsKLSAgfQotCi0gIGlmIChwX2ZjYi0+ZnJhZ19lbmFibGVkKSBwX2ZjYi0+ZnJhZ19lbmFibGVkID0gZmFsc2U7Ci0KLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfZmNiLT5wX2Ztc2cpOwotCi0gIC8qIEFWUkNQIHNwZWMgaGFzIG5vdCBkZWZpbmVkIGFueSBjb250cm9sIGNoYW5uZWwgY29tbWFuZHMgdGhhdCBuZWVkcwotICAgKiBmcmFnbWVudGF0aW9uIGF0IHRoaXMgbGV2ZWwKLSAgICogY2hlY2sgZm9yIGZyYWdtZW50YXRpb24gb25seSBvbiB0aGUgcmVzcG9uc2UgKi8KLSAgaWYgKChjciA9PSBBVkNUX1JTUCkgJiYgKGNoa19mcmFnKSkgewotICAgIGlmIChwX3BrdC0+bGVuID4gQVZSQ19NQVhfQ1RSTF9EQVRBX0xFTikgewotICAgICAgaW50IG9mZnNldF9sZW4gPSBNQVgoQVZDVF9NU0dfT0ZGU0VULCBwX3BrdC0+b2Zmc2V0KTsKLSAgICAgIEJUX0hEUiogcF9wa3RfbmV3ID0KLSAgICAgICAgICAoQlRfSERSKilvc2lfY2FsbG9jKEFWUkNfUEFDS0VUX0xFTiArIG9mZnNldF9sZW4gKyBCVF9IRFJfU0laRSk7Ci0gICAgICBpZiAocF9zdGFydCAhPSBOVUxMKSB7Ci0gICAgICAgIHBfZmNiLT5mcmFnX2VuYWJsZWQgPSB0cnVlOwotICAgICAgICBwX2ZjYi0+cF9mbXNnID0gcF9wa3Q7Ci0gICAgICAgIHBfZmNiLT5mcmFnX3BkdSA9ICpwX3N0YXJ0OwotICAgICAgICBwX3BrdCA9IHBfcGt0X25ldzsKLSAgICAgICAgcF9wa3RfbmV3ID0gcF9mY2ItPnBfZm1zZzsKLSAgICAgICAgcF9wa3QtPmxlbiA9IEFWUkNfTUFYX0NUUkxfREFUQV9MRU47Ci0gICAgICAgIHBfcGt0LT5vZmZzZXQgPSBwX3BrdF9uZXctPm9mZnNldDsKLSAgICAgICAgcF9wa3QtPmxheWVyX3NwZWNpZmljID0gcF9wa3RfbmV3LT5sYXllcl9zcGVjaWZpYzsKLSAgICAgICAgcF9wa3QtPmV2ZW50ID0gcF9wa3RfbmV3LT5ldmVudDsKLSAgICAgICAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgICAgICAgcF9zdGFydCAtPSBBVlJDX1ZFTkRPUl9IRFJfU0laRTsKLSAgICAgICAgbWVtY3B5KHBfZGF0YSwgcF9zdGFydCwgQVZSQ19NQVhfQ1RSTF9EQVRBX0xFTik7Ci0gICAgICAgIC8qIHVzZSBBVlJDIHN0YXJ0IHBhY2tldCB0eXBlICovCi0gICAgICAgIHBfZGF0YSArPSBBVlJDX1ZFTkRPUl9IRFJfU0laRTsKLSAgICAgICAgcF9kYXRhKys7IC8qIHBkdSAqLwotICAgICAgICAqcF9kYXRhKysgPSBBVlJDX1BLVF9TVEFSVDsKLQotICAgICAgICAvKiA0IHBkdSwgcGt0X3R5cGUgJiBsZW4gKi8KLSAgICAgICAgbGVuID0gKEFWUkNfTUFYX0NUUkxfREFUQV9MRU4gLSBBVlJDX1ZFTkRPUl9IRFJfU0laRSAtCi0gICAgICAgICAgICAgICBBVlJDX01JTl9NRVRBX0hEUl9TSVpFKTsKLSAgICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIGxlbik7Ci0KLSAgICAgICAgLyogcHJlcGFyZSB0aGUgbGVmdCBvdmVyIGZvciBhcyBhbiBlbmQgZnJhZ21lbnQgKi8KLSAgICAgICAgYXZyY19wcmVwX2VuZF9mcmFnKGhhbmRsZSk7Ci0gICAgICAgIEFWUkNfVFJBQ0VfREVCVUcoIiVzIHBfcGt0IGxlbjolZC8lZCwgbmV4dCBsZW46JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX3BrdC0+bGVuLCBsZW4sIHBfZmNiLT5wX2Ztc2ctPmxlbik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBUT0RPOiBJcyB0aGlzICJlbHNlIiBibG9jayB2YWxpZD8gUmVtb3ZlIGl0PyAqLwotICAgICAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyBubyBidWZmZXJzIGZvciBmcmFnbWVudGF0aW9uIiwgX19mdW5jX18pOwotICAgICAgICBvc2lfZnJlZShwX3BrdCk7Ci0gICAgICAgIHJldHVybiBBVlJDX05PX1JFU09VUkNFUzsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoKHBfcGt0LT5ldmVudCA9PSBBVlJDX09QX1ZFTkRPUikgJiYgKGNyID09IEFWQ1RfQ01EKSAmJgotICAgICAgICAgICAgIChhdnJjX2NiLmNjYl9pbnRbaGFuZGxlXS5mbGFncyAmIEFWUkNfQ0JfRkxBR1NfUlNQX1BFTkRJTkcpICYmCi0gICAgICAgICAgICAgIShtc2dfbWFzayAmIEFWUkNfTVNHX01BU0tfSVNfQ09OVElOVUFUSU9OX1JTUCkpIHsKLSAgICAvKiBJZiB3ZSBhcmUgc2VuZGluZyBhIHZlbmRvciBzcGVjaWZpYyBjb21tYW5kLCBhbmQgYSByZXNwb25zZSBpcyBwZW5kaW5nLAotICAgICAqIHRoZW4gZW5xdWV1ZSB0aGUgY29tbWFuZCB1bnRpbCB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICogVGhpcyBpcyB0byBpbnRlcm9wIHdpdGggVEdzIHRoYXQgYWJvcnQgc2VuZGluZyByZXNwb25zZXMgd2hlbmV2ZXIgYSBuZXcKLSAgICAgKiBjb21tYW5kCi0gICAgICogaXMgcmVjZWl2ZWQgKGV4Y2VwdGlvbiBpcyBjb250aW51YXRpb24gcmVxdWVzdCBjb21tYW5kCi0gICAgICogbXVzdCBzZW50IHRoYXQgdG8gZ2V0IGFkZGl0aW9uYWwgcmVzcG9uc2UgZnJhZ3MpICovCi0gICAgQVZSQ19UUkFDRV9ERUJVRygKLSAgICAgICAgIkFWUkM6IEVucXVldWluZyBjb21tYW5kIDB4JTA4eCAoaGFuZGxlPTB4JTAyeCwgbGFiZWw9MHglMDJ4KSIsIHBfcGt0LAotICAgICAgICBoYW5kbGUsIGxhYmVsKTsKLQotICAgIC8qIGxhYmVsIGluIEJUX0hEUiAod2lsbCBuZWVkIHRoaXMgbGF0ZXIgd2hlbiB0aGUgY29tbWFuZCBpcyBkZXF1ZXVlZCkgKi8KLSAgICBwX3BrdC0+bGF5ZXJfc3BlY2lmaWMgPSAobGFiZWwgPDwgOCkgfCAocF9wa3QtPmxheWVyX3NwZWNpZmljICYgMHhGRik7Ci0KLSAgICAvKiBFbnF1ZXVlIHRoZSBjb21tYW5kICovCi0gICAgZml4ZWRfcXVldWVfZW5xdWV1ZShhdnJjX2NiLmNjYl9pbnRbaGFuZGxlXS5jbWRfcSwgcF9wa3QpOwotICAgIHJldHVybiBBVlJDX1NVQ0NFU1M7Ci0gIH0KLQotICAvKiBTZW5kIHRoZSBtZXNzYWdlICovCi0gIHN0YXR1cyA9IEFWQ1RfTXNnUmVxKGhhbmRsZSwgbGFiZWwsIGNyLCBwX3BrdCk7Ci0gIGlmICgoc3RhdHVzID09IEFWQ1RfU1VDQ0VTUykgJiYgKGNyID09IEFWQ1RfQ01EKSkgewotICAgIC8qIElmIGEgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIGluZGljYXRlIHRoYXQgYSByZXNwb25zZSBpcyBwZW5kaW5nCi0gICAgICovCi0gICAgYXZyY19jYi5jY2JfaW50W2hhbmRsZV0uZmxhZ3MgfD0gQVZSQ19DQl9GTEFHU19SU1BfUEVORElORzsKLQotICAgIC8qIFN0YXJ0IGNvbW1hbmQgdGltZXIgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKi8KLSAgICBhdnJjX3N0YXJ0X2NtZF90aW1lcihoYW5kbGUsIGxhYmVsLCBtc2dfbWFzayk7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1Bhc3NDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBQQVNTIFRIUk9VR0ggY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFBBU1MgVEhST1VHSCBtZXNzYWdlIHN0cnVjdHVyZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19QYXNzQ21kKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QVZSQ19NU0dfUEFTUyogcF9tc2cpIHsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgdWludDE2X3Qgc3RhdHVzID0gQVZSQ19OT19SRVNPVVJDRVM7Ci0gIGlmICghcF9tc2cpIHJldHVybiBBVlJDX0JBRF9QQVJBTTsKLQotICBwX21zZy0+aGRyLmN0eXBlID0gQVZSQ19DTURfQ1RSTDsKLSAgcF9idWYgPSBhdnJjX3Bhc3NfbXNnKHBfbXNnKTsKLSAgaWYgKHBfYnVmKSB7Ci0gICAgc3RhdHVzID0gQVZDVF9Nc2dSZXEoaGFuZGxlLCBsYWJlbCwgQVZDVF9DTUQsIHBfYnVmKTsKLSAgICBpZiAoc3RhdHVzID09IEFWQ1RfU1VDQ0VTUykgewotICAgICAgLyogU3RhcnQgY29tbWFuZCB0aW1lciB0byB3YWl0IGZvciByZXNwb25zZSAqLwotICAgICAgYXZyY19zdGFydF9jbWRfdGltZXIoaGFuZGxlLCBsYWJlbCwgMCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19QYXNzUnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgUEFTUyBUSFJPVUdIIHJlc3BvbnNlIHRvIHRoZSBwZWVyIGRldmljZS4gIFRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGZvciB0YXJnZXQgcm9sZSBjb25uZWN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIGEgUEFTUyBUSFJPVUdIIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBwZWVyIHRocm91Z2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLiAgTXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcwotICogICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHdpdGggdGhlIGNvbW1hbmQgbWVzc2FnZSBpbiB0aGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFBBU1MgVEhST1VHSCBtZXNzYWdlIHN0cnVjdHVyZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19QYXNzUnNwKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB0QVZSQ19NU0dfUEFTUyogcF9tc2cpIHsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgaWYgKCFwX21zZykgcmV0dXJuIEFWUkNfQkFEX1BBUkFNOwotCi0gIHBfYnVmID0gYXZyY19wYXNzX21zZyhwX21zZyk7Ci0gIGlmIChwX2J1ZikgcmV0dXJuIEFWQ1RfTXNnUmVxKGhhbmRsZSwgbGFiZWwsIEFWQ1RfUlNQLCBwX2J1Zik7Ci0gIHJldHVybiBBVlJDX05PX1JFU09VUkNFUzsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2cmMvYXZyY19ibGRfY3QuY2MgYi9zdGFjay9hdnJjL2F2cmNfYmxkX2N0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFkZDI5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2cmMvYXZyY19ibGRfY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2cmNfYXBpLmgiCi0jaW5jbHVkZSAiYXZyY19kZWZzLmgiCi0jaW5jbHVkZSAiYXZyY19pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9uZXh0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIFJlcXVlc3QgQ29udGludWUgb3IgQWJvcnQgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgY29tbWFuZCBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9uZXh0X2NtZCh0QVZSQ19ORVhUX0NNRCogcF9jbWQsIEJUX0hEUiogcF9wa3QpIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydDsKLQotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfbmV4dF9jbWQiKTsKLQotICAvKiBnZXQgdGhlIGV4aXN0aW5nIGxlbmd0aCwgaWYgYW55LCBhbmQgYWxzbyB0aGUgbnVtIGF0dHJpYnV0ZXMgKi8KLSAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfZGF0YSA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0KLSAgLyogYWRkIGZpeGVkIGxlbnRoIDEgLSBwZHVfaWQgKDEpICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAxKTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9jbWQtPnRhcmdldF9wZHUpOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotCi0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgaW50cm9kdWNlZCBpbiBBVlJDUCAxLjQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgKEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9zZXRfYWJzX3ZvbHVtZV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBTZXQgQWJzb2x1dGUgVm9sdW1lIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIGNvbW1hbmQgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfc2V0X2Fic192b2x1bWVfY21kKHRBVlJDX1NFVF9WT0xVTUVfQ01EKiBwX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydDsKLQotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfc2V0X2Fic192b2x1bWVfY21kIik7Ci0gIC8qIGdldCB0aGUgZXhpc3RpbmcgbGVuZ3RoLCBpZiBhbnksIGFuZCBhbHNvIHRoZSBudW0gYXR0cmlidXRlcyAqLwotICBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgcF9kYXRhID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLSAgLyogYWRkIGZpeGVkIGxlbnRoIDEgLSB2b2x1bWUgKDEpICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAxKTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgKEFWUkNfTUFYX1ZPTFVNRSAmIHBfY21kLT52b2x1bWUpKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfcmVnaXN0ZXJfbm90aWZuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgcmVnaXN0ZXIgbm90aWZpY2F0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX3JlZ2lzdGVyX25vdGlmbihCVF9IRFIqIHBfcGt0LCB1aW50OF90IGV2ZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXZlbnRfcGFyYW0pIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydDsKLQotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfcmVnaXN0ZXJfbm90aWZuIik7Ci0gIC8qIGdldCB0aGUgZXhpc3RpbmcgbGVuZ3RoLCBpZiBhbnksIGFuZCBhbHNvIHRoZSBudW0gYXR0cmlidXRlcyAqLwotICAvLyBTZXQgdGhlIG5vdGlmeSB2YWx1ZQotICBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgcF9kYXRhID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLSAgLyogYWRkIGZpeGVkIGxlbmd0aCA1IC0qLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgNSk7Ci0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIGV2ZW50X2lkKTsKLSAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIGV2ZW50X3BhcmFtKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfY2FwYWJpbGl0eV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBnZXQgY2FwYWJpbGl0eSBjb21tYW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2dldF9jYXBhYmlsaXR5X2NtZChCVF9IRFIqIHBfcGt0LCB1aW50OF90IGNhcF9pZCkgewotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfZ2V0X2NhcGFiaWxpdHlfY21kIik7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotICAvKiBhZGQgZml4ZWQgbGVuZ3RoIDEgLSovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAxKTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgY2FwX2lkKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfbGlzdF9wbGF5ZXJfYXBwX2F0dHJfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgbGlzdCBwbGF5ZXIgYXBwIGF0dHJpYiBjb21tYW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2xpc3RfcGxheWVyX2FwcF9hdHRyX2NtZChCVF9IRFIqIHBfcGt0KSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCJhdnJjX2JsZF9saXN0X3BsYXllcl9hcHBfYXR0cl9jbWQiKTsKLSAgdWludDhfdCogcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0gIC8qIGFkZCBmaXhlZCBsZW5ndGggMSAtKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDApOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9saXN0X3BsYXllcl9hcHBfdmFsdWVzX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIGxpc3QgcGxheWVyIGFwcCB2YWx1ZXMgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgY29tbWFuZCBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9saXN0X3BsYXllcl9hcHBfdmFsdWVzX2NtZChCVF9IRFIqIHBfcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGF0dHJpYl9pZCkgewotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfbGlzdF9wbGF5ZXJfYXBwX3ZhbHVlc19jbWQiKTsKLSAgdWludDhfdCogcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0gIC8qIGFkZCBmaXhlZCBsZW5ndGggMSAtKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDEpOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBhdHRyaWJfaWQpOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfY3VycmVudF9wbGF5ZXJfYXBwX3ZhbHVlc19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBnZXQgY3VycmVudCBwbGF5ZXIgYXBwIHNldHRpbmcKLSAqICAgICAgICAgICAgICAgICAgdmFsdWVzIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIGNvbW1hbmQgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfZ2V0X2N1cnJlbnRfcGxheWVyX2FwcF92YWx1ZXNfY21kKAotICAgIEJUX0hEUiogcF9wa3QsIHVpbnQ4X3QgbnVtX2F0dHJpYl9pZCwgdWludDhfdCogYXR0cmliX2lkcykgewotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfZ2V0X2N1cnJlbnRfcGxheWVyX2FwcF92YWx1ZXNfY21kIik7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotICB1aW50OF90IHBhcmFtX2xlbiA9Ci0gICAgICBudW1fYXR0cmliX2lkICsgMTsgIC8vIDEgYWRkaXRpb25hbCB0byBob2xkIG51bSBhdHRyaWJ1dGVzIGZlaWxkCi0gIC8qIGFkZCBsZW5ndGggLSovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwYXJhbV9sZW4pOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBudW1fYXR0cmliX2lkKTsKLSAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IG51bV9hdHRyaWJfaWQ7IGNvdW50KyspIHsKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBhdHRyaWJfaWRzW2NvdW50XSk7Ci0gIH0KLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfc2V0X2N1cnJlbnRfcGxheWVyX2FwcF92YWx1ZXNfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgc2V0IGN1cnJlbnQgcGxheWVyIGFwcCBzZXR0aW5nCi0gKiAgICAgICAgICAgICAgICAgIHZhbHVlcyBjb21tYW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX3NldF9jdXJyZW50X3BsYXllcl9hcHBfdmFsdWVzX2NtZCgKLSAgICBCVF9IRFIqIHBfcGt0LCB1aW50OF90IG51bV9hdHRyaWJfaWQsIHRBVlJDX0FQUF9TRVRUSU5HKiBwX3ZhbCkgewotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfc2V0X2N1cnJlbnRfcGxheWVyX2FwcF92YWx1ZXNfY21kIik7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotICAvKiB3ZSBoYXZlIHRvIHN0b3JlIGF0dHJpYi0gdmFsdWUgcGFpcgotICAgKiAxIGFkZGl0aW9uYWwgdG8gc3RvcmUgbnVtIGVsZW1lbnRzCi0gICAqLwotICB1aW50OF90IHBhcmFtX2xlbiA9ICgyICogbnVtX2F0dHJpYl9pZCkgKyAxOwotICAvKiBhZGQgbGVuZ3RoICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwYXJhbV9sZW4pOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBudW1fYXR0cmliX2lkKTsKLSAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IG51bV9hdHRyaWJfaWQ7IGNvdW50KyspIHsKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3ZhbFtjb3VudF0uYXR0cl9pZCk7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF92YWxbY291bnRdLmF0dHJfdmFsKTsKLSAgfQotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJfdGV4dF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBnZXQgcGxheWVyIGFwcCBzZXR0aW5nIGF0dHJpYnV0ZQotICogICAgICAgICAgICAgICAgICB0ZXh0IGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIGNvbW1hbmQgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfZ2V0X3BsYXllcl9hcHBfc2V0dGluZ19hdHRyX3RleHRfY21kKAotICAgIEJUX0hEUiogcF9wa3QsIHRBVlJDX0dFVF9BUFBfQVRUUl9UWFRfQ01EKiBwX2NtZCkgewotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgdWludDhfdCogcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0KLSAgdWludDhfdCBwYXJhbV9sZW4gPSBwX2NtZC0+bnVtX2F0dHIgKyAxOwotICAvKiBhZGQgbGVuZ3RoICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwYXJhbV9sZW4pOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2NtZC0+bnVtX2F0dHIpOwotICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgcF9jbWQtPm51bV9hdHRyOyBjb3VudCsrKSB7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9jbWQtPmF0dHJzW2NvdW50XSk7Ci0gIH0KLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfZ2V0X3BsYXllcl9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIGdldCBwbGF5ZXIgYXBwIHNldHRpbmcgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgdGV4dCBjb21tYW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2dldF9wbGF5ZXJfYXBwX3NldHRpbmdfdmFsdWVfdGV4dF9jbWQoCi0gICAgQlRfSERSKiBwX3BrdCwgdEFWUkNfR0VUX0FQUF9WQUxfVFhUX0NNRCogcF9jbWQpIHsKLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotCi0gIHVpbnQ4X3QgcGFyYW1fbGVuID0gcF9jbWQtPm51bV92YWwgKyAxOwotICAvKiBhZGQgbGVuZ3RoICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwYXJhbV9sZW4pOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2NtZC0+bnVtX3ZhbCk7Ci0gIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBwX2NtZC0+bnVtX3ZhbDsgY291bnQrKykgewotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfY21kLT52YWxzW2NvdW50XSk7Ci0gIH0KLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfZ2V0X2VsZW1lbnRfYXR0cl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBnZXQgZWxlbWVudCBhdHRyaWJ1dGUgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgY29tbWFuZCBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfZWxlbWVudF9hdHRyX2NtZChCVF9IRFIqIHBfcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9hdHRyaWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhdHRyaWJfaWRzKSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCJhdnJjX2JsZF9nZXRfZWxlbWVudF9hdHRyX2NtZCIpOwotICB1aW50OF90KiBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgdWludDhfdCogcF9kYXRhID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLSAgLyogd2UgaGF2ZSB0byBzdG9yZSBhdHRyaWItIHZhbHVlIHBhaXIKLSAgICogMSBhZGRpdGlvbmFsIHRvIHN0b3JlIG51bSBlbGVtZW50cwotICAgKi8KLSAgdWludDhfdCBwYXJhbV9sZW4gPSAoNCAqIG51bV9hdHRyaWIpICsgOTsKLSAgLyogYWRkIGxlbmd0aCAqLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcGFyYW1fbGVuKTsKLSAgLyogOCBieXRlcyBvZiBpZGVudGlmaWVyIGFzIDAgKHBsYXlpbmcpKi8KLSAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIDApOwotICBVSU5UMzJfVE9fQkVfU1RSRUFNKHBfZGF0YSwgMCk7Ci0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIG51bV9hdHRyaWIpOwotICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgbnVtX2F0dHJpYjsgY291bnQrKykgewotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9kYXRhLCBhdHRyaWJfaWRzW2NvdW50XSk7Ci0gIH0KLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfcGxheV9pdGVtX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIHBsYXkgaXRlbSBjbWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgY29tbWFuZCBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9wbGF5X2l0ZW1fY21kKEJUX0hEUiogcF9wa3QsIHVpbnQ4X3Qgc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdWlkLCB1aW50MTZfdCB1aWRfY291bnRlcikgewotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfZ2V0X2VsZW1lbnRfYXR0cl9jbWQiKTsKLSAgdWludDhfdCogcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0gIC8qIGFkZCBmaXhlZCBsZW5ndGggMTEgKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDB4Yik7Ci0gIC8qIEFkZCBzY29wZSAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBzY29wZSk7Ci0gIC8qIEFkZCBVSUQgKi8KLSAgQVJSQVlfVE9fQkVfU1RSRUFNKHBfZGF0YSwgdWlkLCBBVlJDX1VJRF9TSVpFKTsKLSAgLyogQWRkIFVJRCBDb3VudGVyICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCB1aWRfY291bnRlcik7Ci0gIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2dldF9wbGF5X3N0YXR1c19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBnZXQgcGxheSBzdGF0dXMgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgY29tbWFuZCBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfcGxheV9zdGF0dXNfY21kKEJUX0hEUiogcF9wa3QpIHsKLSAgQVZSQ19UUkFDRV9BUEkoImF2cmNfYmxkX2xpc3RfcGxheWVyX2FwcF9hdHRyX2NtZCIpOwotICB1aW50OF90KiBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgdWludDhfdCogcF9kYXRhID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLSAgLyogYWRkIGZpeGVkIGxlbmd0aCAwIC0qLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgMCk7Ci0gIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2dldF9mb2xkZXJfaXRlbXNfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgZ2V0IGZvbGRlciBpdGVtcyBjbWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIGNvbW1hbmQgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfZ2V0X2ZvbGRlcl9pdGVtc19jbWQoQlRfSERSKiBwX3BrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEFWUkNfR0VUX0lURU1TX0NNRCogY21kKSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKAotICAgICAgImF2cmNfYmxkX2dldF9mb2xkZXJfaXRlbXNfY21kIHNjb3BlICVkLCBzdGFydF9pdGVtICVkLCBlbmRfaXRlbSAlZCIsCi0gICAgICBjbWQtPnNjb3BlLCBjbWQtPnN0YXJ0X2l0ZW0sIGNtZC0+ZW5kX2l0ZW0pOwotICB1aW50OF90KiBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgLyogVGhpcyBpcyB3aGVyZSB0aGUgUERVIHNwZWNpZmljIGZvciBBVlJDIHN0YXJ0cwotICAgKiBBVlJDUCBTcGVjIDEuNCBzZWN0aW9uIDIyLjE5ICovCi0gIHVpbnQ4X3QqIHBfZGF0YSA9IHBfc3RhcnQgKyAxOyAvKiBwZHUgKi8KLQotICAvKiBUbyBnZXQgdGhlIGxpc3Qgb2YgYWxsIG1lZGlhIHBsYXllcnMgd2Ugc2ltcGx5IG5lZWQgdG8gdXNlIHRoZSBwcmVkZWZpbmVkCi0gICAqIFBEVSBtZW50aW9uZWQgaW4gYWJvdmUgc3BlYy4gKi8KLSAgLyogc2NvcGUgKDEpICsgc3QgaXRlbSAoNCkgKyBlbmQgaXRlbSAoNCkgKyBhdHRyICgxKSAqLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgMTApOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBjbWQtPnNjb3BlKTsgICAgICAgLyogc2NvcGUgKDFieXRlcykgKi8KLSAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIGNtZC0+c3RhcnRfaXRlbSk7IC8qIHN0YXJ0IGl0ZW0gKDRieXRlcykgKi8KLSAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIGNtZC0+ZW5kX2l0ZW0pOyAgIC8qIGVuZCBpdGVtICg0Ynl0ZXMpICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIDApOyAvKiBhdHRyaWJ1dGUgY291bnQgPSAwICgxYnl0ZXMpICovCi0gIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2NoYW5nZV9mb2xkZXJfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgY2hhbmdlIGZvbGRlciBjb21tYW5kCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIGNvbW1hbmQgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfY2hhbmdlX2ZvbGRlcl9jbWQoQlRfSERSKiBwX3BrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEFWUkNfQ0hHX1BBVEhfQ01EKiBjbWQpIHsKLSAgQVZSQ19UUkFDRV9BUEkoImF2cmNfYmxkX2NoYW5nZV9mb2xkZXJfY21kIik7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBQRFUgc3BlY2lmaWMgZm9yIEFWUkMgc3RhcnRzCi0gICAqIEFWUkNQIFNwZWMgMS40IHNlY3Rpb24gMjIuMTkgKi8KLSAgdWludDhfdCogcF9kYXRhID0gcF9zdGFydCArIDE7IC8qIHBkdSAqLwotCi0gIC8qIFRvIGNoYW5nZSBmb2xkZXIgd2UgbmVlZCB0byBwcm92aWRlIHRoZSBmb2xsb3dpbmc6Ci0gICAqIFVJRCBDb3VudGVyICgyKSArIERpcmVjdGlvbiAoMSkgKyBVSUQgKDgpID0gMTFieXRlcwotICAgKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDExKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIGNtZC0+dWlkX2NvdW50ZXIpOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBjbWQtPmRpcmVjdGlvbik7Ci0gIEFSUkFZX1RPX0JFX1NUUkVBTShwX2RhdGEsIGNtZC0+Zm9sZGVyX3VpZCwgQVZSQ19VSURfU0laRSk7Ci0gIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfZ2V0X2l0ZW1fYXR0cmlidXRlc19jbWQoCi0gICAgQlRfSERSKiBwX3BrdCwgY29uc3QgdEFWUkNfR0VUX0FUVFJTX0NNRCogY21kKSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgdWludDhfdCogcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIC8qIFRoaXMgaXMgd2hlcmUgdGhlIFBEVSBzcGVjaWZpYyBmb3IgQVZSQyBzdGFydHMKLSAgICogQVZSQ1AgU3BlYyAxLjQgc2VjdGlvbiAyMi4xOSAqLwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMTsgLyogcGR1ICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAxMiArIDQgKiBjbWQtPmF0dHJfY291bnQpOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBjbWQtPnNjb3BlKTsKLSAgdWludDY0X3QgdWlkOwotICBtZW1jcHkoJnVpZCwgY21kLT51aWQsIDgpOwotICBVSU5UNjRfVE9fQkVfU1RSRUFNKHBfZGF0YSwgdWlkKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIGNtZC0+dWlkX2NvdW50ZXIpOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBjbWQtPmF0dHJfY291bnQpOwotICBBUlJBWV9UT19CRV9TVFJFQU0ocF9kYXRhLCBjbWQtPnBfYXR0cl9saXN0LCA0ICogY21kLT5hdHRyX2NvdW50KTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX3NldF9icm93c2VkX3BsYXllcl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBzZXQgYnJvd3NlZCBwbGF5ZXIgY21kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX3NldF9icm93c2VkX3BsYXllcl9jbWQoCi0gICAgQlRfSERSKiBwX3BrdCwgY29uc3QgdEFWUkNfU0VUX0JSX1BMQVlFUl9DTUQqIGNtZCkgewotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBQRFUgc3BlY2lmaWMgZm9yIEFWUkMgc3RhcnRzCi0gICAqIEFWUkNQIFNwZWMgMS40IHNlY3Rpb24gMjIuMTkgKi8KLSAgdWludDhfdCogcF9kYXRhID0gcF9zdGFydCArIDE7IC8qIHBkdSAqLwotCi0gIC8qIFRvIGNoYW5nZSBicm93c2VkIHBsYXllciB0aGUgZm9sbG93aW5nIGlzIHRoZSB0b3RhbCBsZW5ndGg6Ci0gICAqIFBsYXllciBJRCAoMikKLSAgICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAyKTsgLyogZml4ZWQgbGVuZ3RoICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBjbWQtPnBsYXllcl9pZCk7Ci0gIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX3NldF9hZGRyZXNzZWRfcGxheWVyX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIHNldCBhZGRyZXNzZWQgcGxheWVyIGNtZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgY29tbWFuZCBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9zZXRfYWRkcmVzc2VkX3BsYXllcl9jbWQoCi0gICAgQlRfSERSKiBwX3BrdCwgY29uc3QgdEFWUkNfU0VUX0FERFJfUExBWUVSX0NNRCogY21kKSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgLyogZ2V0IHRoZSBleGlzdGluZyBsZW5ndGgsIGlmIGFueSwgYW5kIGFsc28gdGhlIG51bSBhdHRyaWJ1dGVzICovCi0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotCi0gIC8qIFRvIGNoYW5nZSBhZGRyZXNzZWQgcGxheWVyIHRoZSBmb2xsb3dpbmcgaXMgdGhlIHRvdGFsIGxlbmd0aDoKLSAgICogUGxheWVyIElEICgyKQotICAgKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDIpOyAvKiBmaXhlZCBsZW5ndGggKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIGNtZC0+cGxheWVyX2lkKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfaW5pdF9jbWRfYnVmZmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjb21tYW5kIGJ1ZmZlciBiYXNlZCBvbiBQRFUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5VTEwsIGlmIG5vIEdLSSBidWZmZXIgb3IgZmFpbHVyZSB0byBidWlsZCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgR0tJIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBpbml0aWFsaXplZAotICogICAgICAgICAgICAgICAgICBtZXNzYWdlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdnJjX2JsZF9pbml0X2NtZF9idWZmZXIodEFWUkNfQ09NTUFORCogcF9jbWQpIHsKLSAgdWludDE2X3QgY2hubCA9IEFWQ1RfREFUQV9DVFJMOwotICB1aW50OF90IG9wY29kZSA9IGF2cmNfb3Bjb2RlX2Zyb21fcGR1KHBfY21kLT5wZHUpOwotICBBVlJDX1RSQUNFX0FQSSgiYXZyY19ibGRfaW5pdF9jbWRfYnVmZmVyOiBwZHU9JXgsIG9wY29kZT0leCIsIHBfY21kLT5wZHUsCi0gICAgICAgICAgICAgICAgIG9wY29kZSk7Ci0KLSAgdWludDE2X3Qgb2Zmc2V0ID0gMDsKLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBjYXNlIEFWUkNfT1BfQlJPV1NFOgotICAgICAgY2hubCA9IEFWQ1RfREFUQV9CUk9XU0U7Ci0gICAgICBvZmZzZXQgPSBBVkNUX0JST1dTRV9PRkZTRVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19PUF9QQVNTX1RIUlU6Ci0gICAgICBvZmZzZXQgPSBBVlJDX01TR19QQVNTX1RIUlVfT0ZGU0VUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfT1BfVkVORE9SOgotICAgICAgb2Zmc2V0ID0gQVZSQ19NU0dfVkVORE9SX09GRlNFVDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGJ1ZmZlciAqLwotICBCVF9IRFIqIHBfcGt0ID0gKEJUX0hEUiopb3NpX2NhbGxvYyhBVlJDX01FVEFfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydDsKLQotICBwX3BrdC0+bGF5ZXJfc3BlY2lmaWMgPSBjaG5sOwotICBwX3BrdC0+ZXZlbnQgPSBvcGNvZGU7Ci0gIHBfcGt0LT5vZmZzZXQgPSBvZmZzZXQ7Ci0gIHBfZGF0YSA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfc3RhcnQgPSBwX2RhdGE7Ci0KLSAgLyogcGFzcyB0aHJ1IC0gZ3JvdXAgbmF2aWdhdGlvbiAtIGhhcyBhIHR3byBieXRlIG9wX2lkLCBzbyBkb250IGRvIGl0IGhlcmUgKi8KLSAgaWYgKG9wY29kZSAhPSBBVlJDX09QX1BBU1NfVEhSVSkgKnBfZGF0YSsrID0gcF9jbWQtPnBkdTsKLQotICBzd2l0Y2ggKG9wY29kZSkgewotICAgIGNhc2UgQVZSQ19PUF9WRU5ET1I6Ci0gICAgICAvKiByZXNlcnZlZCAwLCBwYWNrZXRfdHlwZSAwICovCi0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCAwKTsKLSAgICAgIC8qIGNvbnRpbnVlIHRvIHRoZSBuZXh0ICJjYXNlIHRvIGFkZCBsZW5ndGggKi8KLSAgICAgIC8qIGFkZCBmaXhlZCBsZW50aCAtIDAgKi8KLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAwKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcF9jbWQtPmNtZC5vcGNvZGUgPSBvcGNvZGU7Ci0KLSAgcmV0dXJuIHBfcGt0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19CbGRDb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgZ2l2ZW4gQVZSQ1AgY29tbWFuZCB0byB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgR0tJIGJ1ZmZlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZSQ19TVFMgQVZSQ19CbGRDb21tYW5kKHRBVlJDX0NPTU1BTkQqIHBfY21kLCBCVF9IRFIqKiBwcF9wa3QpIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgYm9vbCBhbGxvYyA9IGZhbHNlOwotICBBVlJDX1RSQUNFX0FQSSgiQVZSQ19CbGRDb21tYW5kOiBwZHU9JXggc3RhdHVzPSV4IiwgcF9jbWQtPmNtZC5wZHUsCi0gICAgICAgICAgICAgICAgIHBfY21kLT5jbWQuc3RhdHVzKTsKLSAgaWYgKCFwX2NtZCB8fCAhcHBfcGt0KSB7Ci0gICAgQVZSQ19UUkFDRV9BUEkoCi0gICAgICAgICJBVlJDX0JsZENvbW1hbmQuIEludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuIHBfY21kPSVwLCBwcF9wa3Q9JXAiLAotICAgICAgICBwX2NtZCwgcHBfcGt0KTsKLSAgICByZXR1cm4gQVZSQ19TVFNfQkFEX1BBUkFNOwotICB9Ci0KLSAgaWYgKCpwcF9wa3QgPT0gTlVMTCkgewotICAgICpwcF9wa3QgPSBhdnJjX2JsZF9pbml0X2NtZF9idWZmZXIocF9jbWQpOwotICAgIGlmICgqcHBfcGt0ID09IE5VTEwpIHsKLSAgICAgIEFWUkNfVFJBQ0VfQVBJKCJBVlJDX0JsZENvbW1hbmQ6IEZhaWxlZCB0byBpbml0aWFsaXplIGNvbW1hbmQgYnVmZmVyIik7Ci0gICAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgIH0KLSAgICBhbGxvYyA9IHRydWU7Ci0gIH0KLSAgc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIEJUX0hEUiogcF9wa3QgPSAqcHBfcGt0OwotCi0gIHN3aXRjaCAocF9jbWQtPnBkdSkgewotICAgIGNhc2UgQVZSQ19QRFVfUkVRVUVTVF9DT05USU5VQVRJT05fUlNQOiAvKiAgICAgICAgMHg0MCAqLwotICAgICAgc3RhdHVzID0gYXZyY19ibGRfbmV4dF9jbWQoJnBfY21kLT5jb250aW51LCBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfQUJPUlRfQ09OVElOVUFUSU9OX1JTUDogLyogICAgICAgICAgMHg0MSAqLwotICAgICAgc3RhdHVzID0gYXZyY19ibGRfbmV4dF9jbWQoJnBfY21kLT5hYm9ydCwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0jaWYgKEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkKLSAgICBjYXNlIEFWUkNfUERVX1NFVF9BQlNPTFVURV9WT0xVTUU6IC8qIDB4NTAgKi8KLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3NldF9hYnNfdm9sdW1lX2NtZCgmcF9jbWQtPnZvbHVtZSwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjogLyogMHgzMSAqLwotI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCi0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9yZWdpc3Rlcl9ub3RpZm4ocF9wa3QsIHBfY21kLT5yZWdfbm90aWYuZXZlbnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jbWQtPnJlZ19ub3RpZi5wYXJhbSk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0NBUEFCSUxJVElFUzoKLSAgICAgIHN0YXR1cyA9Ci0gICAgICAgICAgYXZyY19ibGRfZ2V0X2NhcGFiaWxpdHlfY21kKHBfcGt0LCBwX2NtZC0+Z2V0X2NhcHMuY2FwYWJpbGl0eV9pZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX0xJU1RfUExBWUVSX0FQUF9BVFRSOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfbGlzdF9wbGF5ZXJfYXBwX2F0dHJfY21kKHBfcGt0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX1ZBTFVFUzoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2xpc3RfcGxheWVyX2FwcF92YWx1ZXNfY21kKAotICAgICAgICAgIHBfcGt0LCBwX2NtZC0+bGlzdF9hcHBfdmFsdWVzLmF0dHJfaWQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX1BEVV9HRVRfQ1VSX1BMQVlFUl9BUFBfVkFMVUU6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9nZXRfY3VycmVudF9wbGF5ZXJfYXBwX3ZhbHVlc19jbWQoCi0gICAgICAgICAgcF9wa3QsIHBfY21kLT5nZXRfY3VyX2FwcF92YWwubnVtX2F0dHIsIHBfY21kLT5nZXRfY3VyX2FwcF92YWwuYXR0cnMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX1BEVV9TRVRfUExBWUVSX0FQUF9WQUxVRToKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3NldF9jdXJyZW50X3BsYXllcl9hcHBfdmFsdWVzX2NtZCgKLSAgICAgICAgICBwX3BrdCwgcF9jbWQtPnNldF9hcHBfdmFsLm51bV92YWwsIHBfY21kLT5zZXRfYXBwX3ZhbC5wX3ZhbHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9BVFRSX1RFWFQ6Ci0gICAgICBhdnJjX2JsZF9nZXRfcGxheWVyX2FwcF9zZXR0aW5nX2F0dHJfdGV4dF9jbWQocF9wa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfY21kLT5nZXRfYXBwX2F0dHJfdHh0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlFUl9BUFBfVkFMVUVfVEVYVDoKLSAgICAgIGF2cmNfYmxkX2dldF9wbGF5ZXJfYXBwX3NldHRpbmdfdmFsdWVfdGV4dF9jbWQocF9wa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2NtZC0+Z2V0X2FwcF92YWxfdHh0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0VMRU1FTlRfQVRUUjoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2dldF9lbGVtZW50X2F0dHJfY21kKAotICAgICAgICAgIHBfcGt0LCBwX2NtZC0+Z2V0X2VsZW1fYXR0cnMubnVtX2F0dHIsIHBfY21kLT5nZXRfZWxlbV9hdHRycy5hdHRycyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX1BMQVlfSVRFTToKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3BsYXlfaXRlbV9jbWQocF9wa3QsIHBfY21kLT5wbGF5X2l0ZW0uc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY21kLT5wbGF5X2l0ZW0udWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NtZC0+cGxheV9pdGVtLnVpZF9jb3VudGVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfZ2V0X3BsYXlfc3RhdHVzX2NtZChwX3BrdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVM6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9nZXRfZm9sZGVyX2l0ZW1zX2NtZChwX3BrdCwgJihwX2NtZC0+Z2V0X2l0ZW1zKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX0NIQU5HRV9QQVRIOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfY2hhbmdlX2ZvbGRlcl9jbWQocF9wa3QsICYocF9jbWQtPmNoZ19wYXRoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9JVEVNX0FUVFJJQlVURVM6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9nZXRfaXRlbV9hdHRyaWJ1dGVzX2NtZChwX3BrdCwgJihwX2NtZC0+Z2V0X2F0dHJzKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUjoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3NldF9icm93c2VkX3BsYXllcl9jbWQocF9wa3QsICYocF9jbWQtPmJyX3BsYXllcikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVlJDX1BEVV9TRVRfQUREUkVTU0VEX1BMQVlFUjoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3NldF9hZGRyZXNzZWRfcGxheWVyX2NtZChwX3BrdCwgJihwX2NtZC0+YWRkcl9wbGF5ZXIpKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGFsbG9jICYmIChzdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IpKSB7Ci0gICAgb3NpX2ZyZWUocF9wa3QpOwotICAgICpwcF9wa3QgPSBOVUxMOwotICB9Ci0gIEFWUkNfVFJBQ0VfQVBJKCJBVlJDX0JsZENvbW1hbmQ6IHJldHVybmluZyAlZCIsIHN0YXR1cyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdnJjL2F2cmNfYmxkX3RnLmNjIGIvc3RhY2svYXZyYy9hdnJjX2JsZF90Zy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkYmM1ZS4uMDAwMDAwMAotLS0gYS9zdGFjay9hdnJjL2F2cmNfYmxkX3RnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTYgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZyY19hcGkuaCIKLSNpbmNsdWRlICJhdnJjX2RlZnMuaCIKLSNpbmNsdWRlICJhdnJjX2ludC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBVlJDX0lURU1fUExBWUVSX0lTX1ZBTElEKF9wX3BsYXllcikgICAgICAgICAgICAgICAgIFwKLSAgKChfcF9wbGF5ZXIpLT5uYW1lLnBfc3RyICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAoKF9wX3BsYXllciktPm1ham9yX3R5cGUgJiBBVlJDX01KX1RZUEVfSU5WQUxJRCkgPT0gMCAmJiAgXAotICAgKChfcF9wbGF5ZXIpLT5zdWJfdHlwZSAmIEFWUkNfU1VCX1RZUEVfSU5WQUxJRCkgPT0gMCAmJiAgIFwKLSAgICgoKF9wX3BsYXllciktPnBsYXlfc3RhdHVzIDw9IEFWUkNfUExBWVNUQVRFX1JFVl9TRUVLKSB8fCBcCi0gICAgKChfcF9wbGF5ZXIpLT5wbGF5X3N0YXR1cyA9PSBBVlJDX1BMQVlTVEFURV9FUlJPUikpKQotCi0vKiAxNyA9IGl0ZW1fdHlwZSgxKSArIGl0ZW0gbGVuKDIpICsgbWluIGl0ZW0gKDE0KSAqLwotI2RlZmluZSBBVlJDX01JTl9MRU5fR0VUX0ZPTERFUl9JVEVNU19SU1AgMTcKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2dldF9jYXBhYmlsaXR5X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdldCBDYXBhYmlsaXR5IHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfY2FwYWJpbGl0eV9yc3AodEFWUkNfR0VUX0NBUFNfUlNQKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydCwgKnBfbGVuLCAqcF9jb3VudDsKLSAgdWludDE2X3QgbGVuID0gMDsKLSAgdWludDhfdCB4eDsKLSAgdWludDMyX3QqIHBfY29tcGFueV9pZDsKLSAgdWludDhfdCogcF9ldmVudF9pZDsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotCi0gIGlmICghKEFWUkNfSVNfVkFMSURfQ0FQX0lEKHBfcnNwLT5jYXBhYmlsaXR5X2lkKSkpIHsKLSAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyBiYWQgcGFyYW1ldGVyLiBwX3JzcDogJXgiLCBfX2Z1bmNfXywgcF9yc3ApOwotICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICAvKiBnZXQgdGhlIGV4aXN0aW5nIGxlbmd0aCwgaWYgYW55LCBhbmQgYWxzbyB0aGUgbnVtIGF0dHJpYnV0ZXMgKi8KLSAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfZGF0YSA9IHBfbGVuID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLQotICBCRV9TVFJFQU1fVE9fVUlOVDE2KGxlbiwgcF9kYXRhKTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPmNhcGFiaWxpdHlfaWQpOwotICBwX2NvdW50ID0gcF9kYXRhOwotCi0gIGlmIChsZW4gPT0gMCkgewotICAgICpwX2NvdW50ID0gcF9yc3AtPmNvdW50OwotICAgIHBfZGF0YSsrOwotICAgIGxlbiA9IDI7IC8qIG1vdmUgcGFzdCB0aGUgY2FwYWJpbGl0eV9pZCBhbmQgY291bnQgKi8KLSAgfSBlbHNlIHsKLSAgICBwX2RhdGEgPSBwX3N0YXJ0ICsgcF9wa3QtPmxlbjsKLSAgICAqcF9jb3VudCArPSBwX3JzcC0+Y291bnQ7Ci0gIH0KLQotICBpZiAocF9yc3AtPmNhcGFiaWxpdHlfaWQgPT0gQVZSQ19DQVBfQ09NUEFOWV9JRCkgewotICAgIHBfY29tcGFueV9pZCA9IHBfcnNwLT5wYXJhbS5jb21wYW55X2lkOwotICAgIGZvciAoeHggPSAwOyB4eCA8IHBfcnNwLT5jb3VudDsgeHgrKykgewotICAgICAgVUlOVDI0X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfY29tcGFueV9pZFt4eF0pOwotICAgIH0KLSAgICBsZW4gKz0gcF9yc3AtPmNvdW50ICogMzsKLSAgfSBlbHNlIHsKLSAgICBwX2V2ZW50X2lkID0gcF9yc3AtPnBhcmFtLmV2ZW50X2lkOwotICAgICpwX2NvdW50ID0gMDsKLSAgICBmb3IgKHh4ID0gMDsgeHggPCBwX3JzcC0+Y291bnQ7IHh4KyspIHsKLSAgICAgIGlmIChBVlJDX0lTX1ZBTElEX0VWRU5UX0lEKHBfZXZlbnRfaWRbeHhdKSkgewotICAgICAgICAoKnBfY291bnQpKys7Ci0gICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfZXZlbnRfaWRbeHhdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbGVuICs9ICgqcF9jb3VudCk7Ci0gIH0KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2xlbiwgbGVuKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2xpc3RfYXBwX3NldHRpbmdzX2F0dHJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgTGlzdCBBcHBsaWNhdGlvbiBTZXR0aW5ncyBBdHRyaWJ1dGUKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2xpc3RfYXBwX3NldHRpbmdzX2F0dHJfcnNwKAotICAgIHRBVlJDX0xJU1RfQVBQX0FUVFJfUlNQKiBwX3JzcCwgQlRfSERSKiBwX3BrdCkgewotICB1aW50OF90ICpwX2RhdGEsICpwX3N0YXJ0LCAqcF9sZW4sICpwX251bTsKLSAgdWludDE2X3QgbGVuID0gMDsKLSAgdWludDhfdCB4eDsKLQotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIC8qIGdldCB0aGUgZXhpc3RpbmcgbGVuZ3RoLCBpZiBhbnksIGFuZCBhbHNvIHRoZSBudW0gYXR0cmlidXRlcyAqLwotICBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgcF9kYXRhID0gcF9sZW4gPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotCi0gIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwX2RhdGEpOwotICBwX251bSA9IHBfZGF0YTsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgLyogZmlyc3QgdGltZSBpbml0aWFsaXplIHRoZSBhdHRyaWJ1dGUgY291bnQgKi8KLSAgICAqcF9udW0gPSAwOwotICAgIHBfZGF0YSsrOwotICB9IGVsc2UgewotICAgIHBfZGF0YSA9IHBfc3RhcnQgKyBwX3BrdC0+bGVuOwotICB9Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgcF9yc3AtPm51bV9hdHRyOyB4eCsrKSB7Ci0gICAgaWYgKEFWUkNfSXNWYWxpZFBsYXllckF0dHIocF9yc3AtPmF0dHJzW3h4XSkpIHsKLSAgICAgICgqcF9udW0pKys7Ci0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+YXR0cnNbeHhdKTsKLSAgICB9Ci0gIH0KLQotICBsZW4gPSAqcF9udW0gKyAxOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfbGVuLCBsZW4pOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotCi0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2xpc3RfYXBwX3NldHRpbmdzX3ZhbHVlc19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBMaXN0IEFwcGxpY2F0aW9uIFNldHRpbmcgVmFsdWVzCi0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9saXN0X2FwcF9zZXR0aW5nc192YWx1ZXNfcnNwKAotICAgIHRBVlJDX0xJU1RfQVBQX1ZBTFVFU19SU1AqIHBfcnNwLCBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QgKnBfZGF0YSwgKnBfc3RhcnQsICpwX2xlbiwgKnBfbnVtOwotICB1aW50OF90IHh4OwotICB1aW50MTZfdCBsZW47Ci0KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX2RhdGEgPSBwX2xlbiA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0KLSAgLyogZ2V0IHRoZSBleGlzdGluZyBsZW5ndGgsIGlmIGFueSwgYW5kIGFsc28gdGhlIG51bSBhdHRyaWJ1dGVzICovCi0gIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwX2RhdGEpOwotICBwX251bSA9IHBfZGF0YTsKLSAgLyogZmlyc3QgdGltZSBpbml0aWFsaXplIHRoZSBhdHRyaWJ1dGUgY291bnQgKi8KLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgKnBfbnVtID0gcF9yc3AtPm51bV92YWw7Ci0gICAgcF9kYXRhKys7Ci0gIH0gZWxzZSB7Ci0gICAgcF9kYXRhID0gcF9zdGFydCArIHBfcGt0LT5sZW47Ci0gICAgKnBfbnVtICs9IHBfcnNwLT5udW1fdmFsOwotICB9Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgcF9yc3AtPm51bV92YWw7IHh4KyspIHsKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+dmFsc1t4eF0pOwotICB9Ci0KLSAgbGVuID0gKnBfbnVtICsgMTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2xlbiwgbGVuKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfZ2V0X2N1cl9hcHBfc2V0dGluZ192YWx1ZV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBHZXQgQ3VycmVudCBBcHBsaWNhdGlvbiBTZXR0aW5nCi0gKiAgICAgICAgICAgICAgICAgIFZhbHVlIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfY3VyX2FwcF9zZXR0aW5nX3ZhbHVlX3JzcCgKLSAgICB0QVZSQ19HRVRfQ1VSX0FQUF9WQUxVRV9SU1AqIHBfcnNwLCBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QgKnBfZGF0YSwgKnBfc3RhcnQsICpwX2xlbiwgKnBfY291bnQ7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCB4eDsKLQotICBpZiAoIXBfcnNwLT5wX3ZhbHMpIHsKLSAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyBOVUxMIHBhcmFtZXRlciIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQVZSQ19TVFNfQkFEX1BBUkFNOwotICB9Ci0KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICAvKiBnZXQgdGhlIGV4aXN0aW5nIGxlbmd0aCwgaWYgYW55LCBhbmQgYWxzbyB0aGUgbnVtIGF0dHJpYnV0ZXMgKi8KLSAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfZGF0YSA9IHBfbGVuID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLQotICBCRV9TVFJFQU1fVE9fVUlOVDE2KGxlbiwgcF9kYXRhKTsKLSAgcF9jb3VudCA9IHBfZGF0YTsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgLyogZmlyc3QgdGltZSBpbml0aWFsaXplIHRoZSBhdHRyaWJ1dGUgY291bnQgKi8KLSAgICAqcF9jb3VudCA9IDA7Ci0gICAgcF9kYXRhKys7Ci0gIH0gZWxzZSB7Ci0gICAgcF9kYXRhID0gcF9zdGFydCArIHBfcGt0LT5sZW47Ci0gIH0KLQotICBmb3IgKHh4ID0gMDsgeHggPCBwX3JzcC0+bnVtX3ZhbDsgeHgrKykgewotICAgIGlmIChhdnJjX2lzX3ZhbGlkX3BsYXllcl9hdHRyaWJfdmFsdWUocF9yc3AtPnBfdmFsc1t4eF0uYXR0cl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcnNwLT5wX3ZhbHNbeHhdLmF0dHJfdmFsKSkgewotICAgICAgKCpwX2NvdW50KSsrOwotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBfdmFsc1t4eF0uYXR0cl9pZCk7Ci0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cF92YWxzW3h4XS5hdHRyX3ZhbCk7Ci0gICAgfQotICB9Ci0gIGxlbiA9ICgoKnBfY291bnQpIDw8IDEpICsgMTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2xlbiwgbGVuKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLQotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9zZXRfYXBwX3NldHRpbmdfdmFsdWVfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgU2V0IEFwcGxpY2F0aW9uIFNldHRpbmcgVmFsdWUKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX3NldF9hcHBfc2V0dGluZ192YWx1ZV9yc3AoCi0gICAgVU5VU0VEX0FUVFIgdEFWUkNfUlNQKiBwX3JzcCwgVU5VU0VEX0FUVFIgQlRfSERSKiBwX3BrdCkgewotICAvKiBub3RoaW5nIHRvIGJlIGFkZGVkLiAqLwotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2FwcF9zZXR0aW5nX3RleHRfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgR2V0IEFwcGxpY2F0aW9uIFNldHRpbmdzIEF0dHJpYnV0ZQotICogICAgICAgICAgICAgICAgICBUZXh0IG9yIEdldCBBcHBsaWNhdGlvbiBTZXR0aW5ncyBWYWx1ZSBUZXh0IHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9hcHBfc2V0dGluZ190ZXh0X3JzcCgKLSAgICB0QVZSQ19HRVRfQVBQX0FUVFJfVFhUX1JTUCogcF9yc3AsIEJUX0hEUiogcF9wa3QpIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydCwgKnBfbGVuLCAqcF9jb3VudDsKLSAgdWludDE2X3QgbGVuLCBsZW5fbGVmdDsKLSAgdWludDhfdCB4eDsKLSAgdEFWUkNfU1RTIHN0cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICB1aW50OF90IG51bV9hZGRlZCA9IDA7Ci0KLSAgaWYgKCFwX3JzcC0+cF9hdHRycykgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIE5VTEwgcGFyYW1ldGVyIiwgX19mdW5jX18pOwotICAgIHJldHVybiBBVlJDX1NUU19CQURfUEFSQU07Ci0gIH0KLSAgLyogZ2V0IHRoZSBleGlzdGluZyBsZW5ndGgsIGlmIGFueSwgYW5kIGFsc28gdGhlIG51bSBhdHRyaWJ1dGVzICovCi0gIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX2RhdGEgPSBwX2xlbiA9IHBfc3RhcnQgKyAyOyAvKiBwZHUgKyByc3ZkICovCi0KLSAgLyoKLSAgICogTk9URTogVGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgd2l0aGluIGF2cmNfYmxkX2luaXRfcnNwX2J1ZmZlcigpLCBhbmQgaXMKLSAgICogYWx3YXlzIG9mIHNpemUgQlRfREVGQVVMVF9CVUZGRVJfU0laRS4KLSAgICovCi0gIGxlbl9sZWZ0ID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIEJUX0hEUl9TSVpFIC0gcF9wa3QtPm9mZnNldCAtIHBfcGt0LT5sZW47Ci0KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihsZW4sIHBfZGF0YSk7Ci0gIHBfY291bnQgPSBwX2RhdGE7Ci0KLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgKnBfY291bnQgPSAwOwotICAgIHBfZGF0YSsrOwotICB9IGVsc2UgewotICAgIHBfZGF0YSA9IHBfc3RhcnQgKyBwX3BrdC0+bGVuOwotICB9Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgcF9yc3AtPm51bV9hdHRyOyB4eCsrKSB7Ci0gICAgaWYgKGxlbl9sZWZ0IDwgKHBfcnNwLT5wX2F0dHJzW3h4XS5zdHJfbGVuICsgNCkpIHsKLSAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIG91dCBvZiByb29tIChzdHJfbGVuOiVkLCBsZWZ0OiVkKSIsIF9fZnVuY19fLCB4eCwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnBfYXR0cnNbeHhdLnN0cl9sZW4sIGxlbl9sZWZ0KTsKLSAgICAgIHBfcnNwLT5udW1fYXR0ciA9IG51bV9hZGRlZDsKLSAgICAgIHN0cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoIXBfcnNwLT5wX2F0dHJzW3h4XS5zdHJfbGVuIHx8ICFwX3JzcC0+cF9hdHRyc1t4eF0ucF9zdHIpIHsKLSAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIE5VTEwgYXR0ciB0ZXh0WyVkXSIsIF9fZnVuY19fLCB4eCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBfYXR0cnNbeHhdLmF0dHJfaWQpOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cF9hdHRyc1t4eF0uY2hhcnNldF9pZCk7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBfYXR0cnNbeHhdLnN0cl9sZW4pOwotICAgIEFSUkFZX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT5wX2F0dHJzW3h4XS5wX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnBfYXR0cnNbeHhdLnN0cl9sZW4pOwotICAgICgqcF9jb3VudCkrKzsKLSAgICBudW1fYWRkZWQrKzsKLSAgfQotICBsZW4gPSBwX2RhdGEgLSBwX2NvdW50OwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfbGVuLCBsZW4pOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotCi0gIHJldHVybiBzdHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfYXBwX3NldHRpbmdfYXR0cl90ZXh0X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdldCBBcHBsaWNhdGlvbiBTZXR0aW5nIEF0dHJpYnV0ZQotICogICAgICAgICAgICAgICAgICBUZXh0IHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfYXBwX3NldHRpbmdfYXR0cl90ZXh0X3JzcCgKLSAgICB0QVZSQ19HRVRfQVBQX0FUVFJfVFhUX1JTUCogcF9yc3AsIEJUX0hEUiogcF9wa3QpIHsKLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYXZyY19ibGRfYXBwX3NldHRpbmdfdGV4dF9yc3AocF9yc3AsIHBfcGt0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2dldF9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdldCBBcHBsaWNhdGlvbiBTZXR0aW5nIFZhbHVlIFRleHQKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2dldF9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X3JzcCgKLSAgICB0QVZSQ19HRVRfQVBQX0FUVFJfVFhUX1JTUCogcF9yc3AsIEJUX0hEUiogcF9wa3QpIHsKLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYXZyY19ibGRfYXBwX3NldHRpbmdfdGV4dF9yc3AocF9yc3AsIHBfcGt0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2luZm9ybV9jaGFyc2V0X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEluZm9ybSBEaXNwbGF5YWJsZSBDaGFyYWN0ZXIgU2V0Ci0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9pbmZvcm1fY2hhcnNldF9yc3AoVU5VU0VEX0FUVFIgdEFWUkNfUlNQKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIEJUX0hEUiogcF9wa3QpIHsKLSAgLyogbm90aGluZyB0byBiZSBhZGRlZC4gKi8KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9pbmZvcm1fYmF0dGVyeV9zdGF0dXNfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgSW5mb3JtIEJhdHRlcnkgU3RhdHVzCi0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9pbmZvcm1fYmF0dGVyeV9zdGF0dXNfcnNwKAotICAgIFVOVVNFRF9BVFRSIHRBVlJDX1JTUCogcF9yc3AsIFVOVVNFRF9BVFRSIEJUX0hEUiogcF9wa3QpIHsKLSAgLyogbm90aGluZyB0byBiZSBhZGRlZC4gKi8KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2cmNfYnVpbGRfYXR0cmlidXRlX2VudHJpZXMoaW50IG51bV9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfQVRUUl9FTlRSWSogcF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBwcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2F0dHJpYnV0ZV9jb3VudCkgewotICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBudW1fYXR0cnM6ICVkLCByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5OiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIG51bV9hdHRycywgcmVtYWluaW5nX2J1ZmZlcl9jYXBhY2l0eSk7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9ICpwcF9kYXRhOwotICAvKiBGaWxsIGluIHRoZSBBdHRyaWJ1dGUgSUQsIENoYXJhY3RlciBTZXQsIExlbmd0aCBhbmQgVmFsdWVzICovCi0gIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBudW1fYXR0cnM7IGluZGV4KyspIHsKLSAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBhdHRyIGlkWyVkXTogJWQiLCBfX2Z1bmNfXywgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBwX2F0dHJzW2luZGV4XS5hdHRyX2lkKTsKLSAgICBDSEVDSyhBVlJDX0lTX1ZBTElEX01FRElBX0FUVFJJQlVURShwX2F0dHJzW2luZGV4XS5hdHRyX2lkKSk7Ci0gICAgaWYgKCFwX2F0dHJzW2luZGV4XS5uYW1lLnBfc3RyKSB7Ci0gICAgICBwX2F0dHJzW2luZGV4XS5uYW1lLnN0cl9sZW4gPSAwOwotICAgIH0KLSAgICAvKiA4IGlzIHRoZSBzaXplIG9mIGF0dHJfaWQsIGNoYXIgc2V0IGFuZCBzdHJfbGVuICovCi0gICAgcmVtYWluaW5nX2J1ZmZlcl9jYXBhY2l0eSAtPSA4OwotICAgIGlmIChyZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5IDwgMCkgewotICAgICAgQVZSQ19UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICIlcyBub3QgZW5vdWdoIGJ1ZmZlciBzcGFjZSBmb3IgYXR0cl9pZFslZF06ICVkLCIKLSAgICAgICAgICAiIHNraXBwaW5nICVkIGF0dHJpYnV0ZXMiLAotICAgICAgICAgIF9fZnVuY19fLCBpbmRleCwgcF9hdHRyc1tpbmRleF0uYXR0cl9pZCwgbnVtX2F0dHJzIC0gaW5kZXgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChyZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5IDwgcF9hdHRyc1tpbmRleF0ubmFtZS5zdHJfbGVuKSB7Ci0gICAgICBBVlJDX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgIiVzIG5vdCBlbm91Z2ggYnVmZmVyIHNwYWNlIGZvciBhdHRyX2lkWyVkXTogJWQsIgotICAgICAgICAgICIgdHJ1bmNhdGluZyBhdHRyaWJ1dGUiLAotICAgICAgICAgIF9fZnVuY19fLCBpbmRleCwgcF9hdHRyc1tpbmRleF0uYXR0cl9pZCk7Ci0gICAgICBwX2F0dHJzW2luZGV4XS5uYW1lLnN0cl9sZW4gPSByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5OwotICAgICAgcmVtYWluaW5nX2J1ZmZlcl9jYXBhY2l0eSA9IDA7Ci0gICAgfQotICAgIHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHkgLT0gcF9hdHRyc1tpbmRleF0ubmFtZS5zdHJfbGVuOwotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2F0dHJzW2luZGV4XS5hdHRyX2lkKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9hdHRyc1tpbmRleF0ubmFtZS5jaGFyc2V0X2lkKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9hdHRyc1tpbmRleF0ubmFtZS5zdHJfbGVuKTsKLSAgICBBUlJBWV9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2F0dHJzW2luZGV4XS5uYW1lLnBfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICBwX2F0dHJzW2luZGV4XS5uYW1lLnN0cl9sZW4pOwotICAgICgqcF9hdHRyaWJ1dGVfY291bnQpKys7Ci0gIH0KLSAgKnBwX2RhdGEgPSBwX2RhdGE7Ci0gIEFWUkNfVFJBQ0VfREVCVUcoIiVzIGZpbGxlZCBhdHRyaWJ1dGVzLCByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5OiAlZCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG51bV9hdHRycywgcmVtYWluaW5nX2J1ZmZlcl9jYXBhY2l0eSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfZWxlbV9hdHRyc19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBHZXQgRWxlbWVudCBBdHRyaWJ1dGVzCi0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfZWxlbV9hdHRyc19yc3AodEFWUkNfR0VUX0FUVFJTX1JTUCogcF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKCFwX3JzcC0+cF9hdHRycykgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIE5VTEwgcF9hdHRycyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gQVZSQ19TVFNfQkFEX1BBUkFNOwotICB9Ci0gIC8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgaGF2ZSBsZWZ0IGluIGN1cnJlbnQgYnVmZmVyICovCi0gIGludCByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5ID0KLSAgICAgIEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUgLSBCVF9IRFJfU0laRSAtIHBfcGt0LT5vZmZzZXQ7Ci0gIGlmIChyZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5IDwgNSkgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIG5vdCBlbm91Z2ggYnVmZmVyIGZvciBwYWNrZXQgaGVhZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHkpOwotICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gIH0KLSAgLyogR2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgUERVICovCi0gIHVpbnQ4X3QqIHBfcGR1X3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgLyogU2tpcCBQRFUgSUQgYW5kIFJlc2VydmVkIGJ5dGUgdG8gZ2V0IHBvaW50ZXIgdG8gUGFyYW1ldGVyIExlbmd0aCAqLwotICB1aW50OF90ICpwX2RhdGEsICpwX3BhcmFtZXRlcl9sZW47Ci0gIHBfZGF0YSA9IHBfcGFyYW1ldGVyX2xlbiA9IHBfcGR1X3N0YXJ0ICsgMjsKLSAgLyogUGFyc2UgcGFyYW1ldGVyIGxlbmd0aCAqLwotICB1aW50MTZfdCBwYXJhbWV0ZXJfbGVuOwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KHBhcmFtZXRlcl9sZW4sIHBfZGF0YSk7Ci0gIC8qIEdldCBwb2ludGVyIHRvIEF0dHJpYnV0ZSBDb3VudCAqLwotICB1aW50OF90KiBwX2F0dHJpYnV0ZV9jb3VudCA9IHBfZGF0YTsKLSAgLyogSW5pdGlhbGl6ZSBmaWVsZCB2YWx1ZXMgd2hlbiBQYXJhbWV0ZXIgTGVuZ3RoIGlzIDAgKi8KLSAgaWYgKHBhcmFtZXRlcl9sZW4gPT0gMCkgewotICAgICpwX2F0dHJpYnV0ZV9jb3VudCA9IDA7Ci0gICAgcF9kYXRhKys7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVE9ETzogV2h5IGRvIHdlIG5lZWQgdGhpcyBjYXNlPwotICAgIHBfZGF0YSA9IHBfcGR1X3N0YXJ0ICsgcF9wa3QtPmxlbjsKLSAgfQotICByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5IC09IHBfZGF0YSAtIHBfcGR1X3N0YXJ0OwotICA7Ci0gIGlmIChyZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5IDwgMCkgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIG5vdCBlbm91Z2ggYnVmZmVyIGNhcGFjaXR5IGZvciByZXNwb25zZSIpOwotICAgIHJldHVybiBBVlJDX1NUU19CQURfUEFSQU07Ci0gIH0KLSAgLyogRmlsbCBpbiB0aGUgQXR0cmlidXRlIElELCBDaGFyYWN0ZXIgU2V0LCBMZW5ndGggYW5kIFZhbHVlcyAqLwotICBhdnJjX2J1aWxkX2F0dHJpYnV0ZV9lbnRyaWVzKHBfcnNwLT5udW1fYXR0cnMsIHBfcnNwLT5wX2F0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHksICZwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hdHRyaWJ1dGVfY291bnQpOwotICBwYXJhbWV0ZXJfbGVuID0gcF9kYXRhIC0gcF9hdHRyaWJ1dGVfY291bnQ7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9wYXJhbWV0ZXJfbGVuLCBwYXJhbWV0ZXJfbGVuKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3BkdV9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2dldF9wbGF5X3N0YXR1c19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBHZXQgUGxheSBTdGF0dXMKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2dldF9wbGF5X3N0YXR1c19yc3AodEFWUkNfR0VUX1BMQVlfU1RBVFVTX1JTUCogcF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgewotICB1aW50OF90ICpwX2RhdGEsICpwX3N0YXJ0OwotCi0gIEFWUkNfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfZGF0YSA9IHBfc3RhcnQgKyAyOwotCi0gIC8qIGFkZCBmaXhlZCBsZW50aCAtIHNvbmcgbGVuKDQpICsgc29uZyBwb3NpdGlvbig0KSArIHN0YXR1cygxKSAqLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgOSk7Ci0gIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+c29uZ19sZW4pOwotICBVSU5UMzJfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnNvbmdfcG9zKTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBsYXlfc3RhdHVzKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLQotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9ub3RpZnlfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgTm90aWZpY2F0aW9uIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9ub3RpZnlfcnNwKHRBVlJDX1JFR19OT1RJRl9SU1AqIHBfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydDsKLSAgdWludDhfdCogcF9sZW47Ci0gIHVpbnQxNl90IGxlbiA9IDA7Ci0gIHVpbnQ4X3QgeHg7Ci0gIHRBVlJDX1NUUyBzdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLQotICBBVlJDX1RSQUNFX0FQSSgiJXMgZXZlbnRfaWQgJWQiLCBfX2Z1bmNfXywgcF9yc3AtPmV2ZW50X2lkKTsKLQotICBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgcF9kYXRhID0gcF9sZW4gPSBwX3N0YXJ0ICsgMjsgLyogcGR1ICsgcnN2ZCAqLwotICBwX2RhdGEgKz0gMjsKLQotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+ZXZlbnRfaWQpOwotICBzd2l0Y2ggKHBfcnNwLT5ldmVudF9pZCkgewotICAgIGNhc2UgQVZSQ19FVlRfUExBWV9TVEFUVVNfQ0hBTkdFOiAvKiAweDAxICovCi0gICAgICAvKiBwX3JzcC0+cGFyYW0ucGxheV9zdGF0dXMgPj0gQVZSQ19QTEFZU1RBVEVfU1RPUFBFRCBpcyBhbHdheXMgdHJ1ZSAqLwotICAgICAgaWYgKChwX3JzcC0+cGFyYW0ucGxheV9zdGF0dXMgPD0gQVZSQ19QTEFZU1RBVEVfUkVWX1NFRUspIHx8Ci0gICAgICAgICAgKHBfcnNwLT5wYXJhbS5wbGF5X3N0YXR1cyA9PSBBVlJDX1BMQVlTVEFURV9FUlJPUikpIHsKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBhcmFtLnBsYXlfc3RhdHVzKTsKLSAgICAgICAgbGVuID0gMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIGJhZCBwbGF5IHN0YXRlIiwgX19mdW5jX18pOwotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19FVlRfVFJBQ0tfQ0hBTkdFOiAvKiAweDAyICovCi0gICAgICBBUlJBWV9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cGFyYW0udHJhY2ssIEFWUkNfVUlEX1NJWkUpOwotICAgICAgbGVuID0gKHVpbnQ4X3QpKEFWUkNfVUlEX1NJWkUgKyAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9UUkFDS19SRUFDSEVEX0VORDogICAvKiAweDAzICovCi0gICAgY2FzZSBBVlJDX0VWVF9UUkFDS19SRUFDSEVEX1NUQVJUOiAvKiAweDA0ICovCi0gICAgY2FzZSBBVlJDX0VWVF9OT1dfUExBWUlOR19DSEFOR0U6ICAvKiAweDA5ICovCi0gICAgY2FzZSBBVlJDX0VWVF9BVkFMX1BMQVlFUlNfQ0hBTkdFOiAvKiAweDBhICovCi0gICAgICBsZW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQ6IC8qIDB4MDUgKi8KLSAgICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cGFyYW0ucGxheV9wb3MpOwotICAgICAgbGVuID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9CQVRURVJZX1NUQVRVU19DSEFOR0U6IC8qIDB4MDYgKi8KLSAgICAgIGlmIChBVlJDX0lTX1ZBTElEX0JBVFRFUllfU1RBVFVTKHBfcnNwLT5wYXJhbS5iYXR0ZXJ5X3N0YXR1cykpIHsKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBhcmFtLmJhdHRlcnlfc3RhdHVzKTsKLSAgICAgICAgbGVuID0gMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIGJhZCBiYXR0ZXJ5IHN0YXR1cyIsIF9fZnVuY19fKTsKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfRVZUX1NZU1RFTV9TVEFUVVNfQ0hBTkdFOiAvKiAweDA3ICovCi0gICAgICBpZiAoQVZSQ19JU19WQUxJRF9TWVNURU1fU1RBVFVTKHBfcnNwLT5wYXJhbS5zeXN0ZW1fc3RhdHVzKSkgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cGFyYW0uc3lzdGVtX3N0YXR1cyk7Ci0gICAgICAgIGxlbiA9IDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyBiYWQgc3lzdGVtIHN0YXR1cyIsIF9fZnVuY19fKTsKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfRVZUX0FQUF9TRVRUSU5HX0NIQU5HRTogLyogMHgwOCAqLwotICAgICAgaWYgKHBfcnNwLT5wYXJhbS5wbGF5ZXJfc2V0dGluZy5udW1fYXR0ciA+IEFWUkNfTUFYX0FQUF9TRVRUSU5HUykKLSAgICAgICAgcF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLm51bV9hdHRyID0gQVZSQ19NQVhfQVBQX1NFVFRJTkdTOwotCi0gICAgICBpZiAocF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLm51bV9hdHRyID4gMCkgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cGFyYW0ucGxheWVyX3NldHRpbmcubnVtX2F0dHIpOwotICAgICAgICBsZW4gPSAyOwotICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCBwX3JzcC0+cGFyYW0ucGxheWVyX3NldHRpbmcubnVtX2F0dHI7IHh4KyspIHsKLSAgICAgICAgICBpZiAoYXZyY19pc192YWxpZF9wbGF5ZXJfYXR0cmliX3ZhbHVlKAotICAgICAgICAgICAgICAgICAgcF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLmF0dHJfaWRbeHhdLAotICAgICAgICAgICAgICAgICAgcF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLmF0dHJfdmFsdWVbeHhdKSkgewotICAgICAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLmF0dHJfaWRbeHhdKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLmF0dHJfdmFsdWVbeHhdKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgYmFkIHBsYXllciBhcHAgc2VldGluZyBhdHRyaWJ1dGUgb3IgdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGVuICs9IDI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19FVlRfVk9MVU1FX0NIQU5HRTogLyogMHgwZCAqLwotICAgICAgbGVuID0gMjsKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIChBVlJDX01BWF9WT0xVTUUgJiBwX3JzcC0+cGFyYW0udm9sdW1lKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19FVlRfQUREUl9QTEFZRVJfQ0hBTkdFOiAvKiAweDBiICovCi0gICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBhcmFtLmFkZHJfcGxheWVyLnBsYXllcl9pZCk7Ci0gICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnBhcmFtLmFkZHJfcGxheWVyLnVpZF9jb3VudGVyKTsKLSAgICAgIGxlbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19FVlRfVUlEU19DSEFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MGMgKi8KLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+cGFyYW0udWlkX2NvdW50ZXIpOyAvKiB1aWQgY291bnRlciAqLwotICAgICAgbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIHVua25vd24gZXZlbnRfaWQiLCBfX2Z1bmNfXyk7Ci0gIH0KLQotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfbGVuLCBsZW4pOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9uZXh0X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIFJlcXVlc3QgQ29udGludWUgb3IgQWJvcnQKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX25leHRfcnNwKHRBVlJDX05FWFRfUlNQKiBwX3JzcCwgQlRfSERSKiBwX3BrdCkgewotICB1aW50OF90KiBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgdWludDhfdCogcF9kYXRhID0gKHBfc3RhcnQgKyAyKTsgLyogU2tpcCB0aGUgcGR1IGFuZCByZXNlcnZlZCBiaXRzICovCi0KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDB4MDAwMSk7IC8qIG9ubHkgb25lIGF0dHJpYnV0ZSB0byBiZSBzZW50ICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT50YXJnZXRfcGR1KTsKLQotICBBVlJDX1RSQUNFX0FQSSgiJXM6IHRhcmdldF9wZHU6IDB4JTAyeCIsIF9fZnVuY19fLCBwX3JzcC0+dGFyZ2V0X3BkdSk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICBhdnJjX2JsZF9zZXRfYWJzb2x1dGVfdm9sdW1lX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIHNldCBhYnNvbHV0ZSB2b2x1bWUgcmVzcG9uc2UKLSAqCi0gKiBSZXR1cm5zICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgcmVzcG9uc2UgaXMgYnVpbGQgc3VjY2Vzc2Z1bGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9zZXRfYWJzb2x1dGVfdm9sdW1lX3JzcCh1aW50OF90IGFic192b2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICB1aW50OF90KiBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX3BrdCArIDEpICsgcF9wa3QtPm9mZnNldDsKLSAgLyogVG8gY2FsY3VsYXRlIGxlbmd0aCAqLwotICB1aW50OF90KiBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsKLSAgLyogYWRkIGZpeGVkIGxlbnRoIHN0YXR1cygxKSAqLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgMSk7Ci0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIGFic192b2wpOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9ncm91cF9uYXZpZ2F0aW9uX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdyb3VwIE5hdmlnYXRpb24KLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZSQ19TVFMgYXZyY19ibGRfZ3JvdXBfbmF2aWdhdGlvbl9yc3AodWludDE2X3QgbmF2aV9pZCwgQlRfSERSKiBwX3BrdCkgewotICBpZiAoIUFWUkNfSVNfVkFMSURfR1JPVVAobmF2aV9pZCkpIHsKLSAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyBiYWQgbmF2aWdhdGlvbiBvcCBpZDogJWQiLCBfX2Z1bmNfXywgbmF2aV9pZCk7Ci0gICAgcmV0dXJuIEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgfQotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBuYXZpX2lkKTsKLSAgcF9wa3QtPmxlbiA9IDI7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX3JlamVjdGVkX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdlbmVyYWwgUmVzcG9uc2UgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX3JlamVjdGVkX3JzcCh0QVZSQ19SU1AqIHBfcnNwLCBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQ4X3Qgb3Bjb2RlID0gcF9yc3AtPm9wY29kZTsKLQotICBBVlJDX1RSQUNFX0FQSSgiJXM6IHN0YXR1cz0lZCwgcGR1OngleCwgb3Bjb2RlPSV4IiwgX19mdW5jX18sIHBfcnNwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgIHBfcnNwLT5wZHUsIG9wY29kZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBBVlJDX09QX0JST1dTRSkgewotICAgIHBfZGF0YSA9IHBfc3RhcnQgKyAxOwotICAgIGlmICgoQVZSQ19QRFVfSU5WQUxJRCA9PSAqcF9zdGFydCkgfHwKLSAgICAgICAgKGF2cmNfb3Bjb2RlX2Zyb21fcGR1KCpwX3N0YXJ0KSAhPSBBVlJDX09QX0JST1dTRSkpIHsKLSAgICAgIC8qIGlmIGludmFsaWQgb3IgdGhlIGdpdmVuIG9wY29kZSBpcyBub3QgcmVjb2duaXplZCBhcyBhIGJyb3dzaW5nIGNvbW1hbmQKLSAgICAgICAqIG9wY29kZSwgKi8KLSAgICAgIC8qIHVzZSBnZW5lcmFsIHJlamVjdCBjb21tYW5kICovCi0gICAgICAqcF9zdGFydCA9IEFWUkNfUERVX0dFTkVSQUxfUkVKRUNUOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwX2RhdGEgPSBwX3N0YXJ0ICsgMjsKLSAgfQotICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBwZHU6eCV4LCBPcGNvZGU6JXgiLCBfX2Z1bmNfXywgKnBfc3RhcnQsIG9wY29kZSk7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAxKTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnN0YXR1cyk7Ci0gIHBfcGt0LT5sZW4gPSBwX2RhdGEgLSBwX3N0YXJ0OwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGludHJvZHVjZWQgaW4gQVZSQ1AgMS40Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2N0cmxfc3RhdHVzX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIHJlc3BvbnNlcyB3aXRoIGEgdWludDhfdCBwYXJhbWV0ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2N0cmxfc3RhdHVzX3JzcCh0QVZSQ19SU1AqIHBfcnNwLCBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBBVlJDX1RSQUNFX0RFQlVHKCJwZHU6eCV4IiwgKnBfc3RhcnQpOwotCi0gIC8qIFRvIGNhbGN1bGF0ZSBsZW5ndGggKi8KLSAgdWludDhfdCogcF9kYXRhID0gcF9zdGFydCArIDI7IC8qIHBkdSArIHJzdmQgKi8KLQotICAvKiBhZGQgZml4ZWQgbGVudGggLSBzdGF0dXMoMSkgKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDEpOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+c3RhdHVzKTsKLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfc2V0X2FkZHJfcGxheWVyX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIFNldCBBZGRyZXNzZXMgUGxheWVyIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9zZXRfYWRkcl9wbGF5ZXJfcnNwKHRBVlJDX1JTUCogcF9yc3AsIEJUX0hEUiogcF9wa3QpIHsKLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICByZXR1cm4gYXZyY19ibGRfY3RybF9zdGF0dXNfcnNwKHBfcnNwLCBwX3BrdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9zZXRfYnJvd3NlZF9wbGF5ZXJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgU2V0IEJyb3dzZWQgUGxheWVyIHJlc3BvbnNlLgotICoKLSAqICAgICAgICAgICAgICAgICAgVGhpcyBtZXNzYWdlIGdvZXMgdGhyb3VnaCB0aGUgQnJvd3NpbmcgY2hhbm5lbAotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9zZXRfYnJvd3NlZF9wbGF5ZXJfcnNwKHRBVlJDX1NFVF9CUl9QTEFZRVJfUlNQKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QgKnBfZGF0YSwgKnBfc3RhcnQ7Ci0gIHVpbnQ4X3QqIHBfbGVuOwotICB1aW50MTZfdCBsZW47Ci0gIHRBVlJDX05BTUUqIHBfZm9sZGVycyA9IHBfcnNwLT5wX2ZvbGRlcnM7Ci0gIHVpbnQxNl90IGxlbl9sZWZ0OwotICB1aW50OF90KiBwX2ZvbGRlcl9kZXB0aDsKLSAgdWludDE2X3QgbXR1OwotCi0gIC8qIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gYnVmZmVyIGNhbiBhY2NvbW9kYXRlIHRoaXMgcmVzcG9uc2UgKi8KLSAgbGVuX2xlZnQgPSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFIC0gQlRfSERSX1NJWkU7Ci0gIHBfZGF0YSA9ICh1aW50OF90KikocF9wa3QgKyAxKTsKLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihtdHUsIHBfZGF0YSk7Ci0gIGlmIChsZW5fbGVmdCA+IG10dSkgewotICAgIGxlbl9sZWZ0ID0gbXR1OwotICB9Ci0gIGxlbl9sZWZ0ID0gbGVuX2xlZnQgLSBwX3BrdC0+b2Zmc2V0IC0gcF9wa3QtPmxlbjsKLSAgQVZSQ19UUkFDRV9ERUJVRygibGVuX2xlZnQ6JWQsIG10dTolZCAiLCBsZW5fbGVmdCwgbXR1KTsKLQotICAvKiBnZXQgdGhlIGV4aXN0aW5nIGxlbmd0aCwgaWYgYW55LCBhbmQgYWxzbyB0aGUgbnVtIGF0dHJpYnV0ZXMgKi8KLSAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfZGF0YSA9IHBfbGVuID0gcF9zdGFydCArIDE7IC8qIHBkdSAqLwotCi0gIC8qIHRoZSBleGlzdGluZyBsZW4gKi8KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihsZW4sIHBfZGF0YSk7Ci0gIC8qIGZpbmQgdGhlIHBvc2l0aW9uIHRvIGFkZCB0aGUgZm9sZGVyIGRlcHRoLgotICAgKiA5IGlzIHNpemVvZiAoc3RhdHVzICsgdWlkX2NvdW50ZXIgKyBudW1faXRlbXMgKyBjaGFyc2V0X2lkKSAqLwotICBwX2ZvbGRlcl9kZXB0aCA9IHBfZGF0YSArIDk7Ci0gIGlmIChsZW4gPT0gMCkgewotICAgIC8qIGZpcnN0IHRpbWUgaW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlIGNvdW50ICovCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnN0YXR1cyk7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT51aWRfY291bnRlcik7Ci0gICAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT5udW1faXRlbXMpOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+Y2hhcnNldF9pZCk7Ci0gICAgKnBfZm9sZGVyX2RlcHRoID0gMDsKLSAgICBwX2RhdGErKzsKLSAgICBsZW4gPSAxMDsKLSAgICAvKiBhc3N1bWluZyB0aGF0IHdlIHdvdWxkIG5ldmVyIHVzZSBhIGJ1ZmZlciB0aGF0IGlzIHRvbyBzbWFsbCBmb3IgaGVhZGVycwotICAgICAqLwotICAgIGxlbl9sZWZ0IC09IDEyOwotICB9IGVsc2UgewotICAgIHBfZGF0YSA9IHBfc3RhcnQgKyBwX3BrdC0+bGVuOwotICB9Ci0KLSAgZm9yICh1aW50OF90IHh4ID0gMDsKLSAgICAgICAoeHggPCBwX3JzcC0+Zm9sZGVyX2RlcHRoKSAmJiAobGVuX2xlZnQgPiAocF9mb2xkZXJzW3h4XS5zdHJfbGVuICsgMikpOwotICAgICAgIHh4KyspIHsKLSAgICAoKnBfZm9sZGVyX2RlcHRoKSsrOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2ZvbGRlcnNbeHhdLnN0cl9sZW4pOwotICAgIEFSUkFZX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfZm9sZGVyc1t4eF0ucF9zdHIsIHBfZm9sZGVyc1t4eF0uc3RyX2xlbik7Ci0gICAgbGVuICs9IChwX2ZvbGRlcnNbeHhdLnN0cl9sZW4gKyAyKTsKLSAgfQotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfbGVuLCBsZW4pOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfZm9sZGVyX2l0ZW1zX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdldCBGb2xkZXIgSXRlbXMgcmVzcG9uc2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIGluICpwX3N0YXR1cy4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19TVFNfSU5URVJOQUxfRVJSIG1lYW5zIG5vIGJ1ZmZlcnMuCi0gKiAgICAgICAgICAgICAgICAgIFRyeSBhZ2FpbiBsYXRlciBvciB3aXRoIHNtYWxsZXIgaXRlbV9jb3VudAotICoKLSAqICAgICAgICAgICAgICAgICAgVGhpcyBtZXNzYWdlIGdvZXMgdGhyb3VnaCB0aGUgQnJvd3NpbmcgY2hhbm5lbAotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgQVZSQ19TVFNfSU5URVJOQUxfRVJSLCBpZiB0aGUgZ2l2ZW4gYnVmZmVyIGRvZXMgbm90IGhhdmUKLSAqICAgICAgICAgICAgICAgICAgZW5vdWdoIHJvb20KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2JsZF9nZXRfZm9sZGVyX2l0ZW1zX3JzcCh0QVZSQ19HRVRfSVRFTVNfUlNQKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgewotICB1aW50OF90ICpwX2RhdGEsICpwX3N0YXJ0OwotICB1aW50OF90ICpwX2xlbiwgeHg7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDE2X3QgaXRlbV9sZW47Ci0gIHVpbnQ4X3QgKnBfaXRlbV9sZW4sIHl5OwotICB0QVZSQ19JVEVNX1BMQVlFUiogcF9wbGF5ZXI7Ci0gIHRBVlJDX0lURU1fRk9MREVSKiBwX2ZvbGRlcjsKLSAgdEFWUkNfSVRFTV9NRURJQSogcF9tZWRpYTsKLSAgdEFWUkNfQVRUUl9FTlRSWSogcF9hdHRyOwotICB0QVZSQ19JVEVNKiBwX2l0ZW1fbGlzdCA9IHBfcnNwLT5wX2l0ZW1fbGlzdDsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICB1aW50MTZfdCBsZW5fbGVmdDsKLSAgdWludDhfdCAqcF9udW0sICpwOwotICB1aW50OF90ICpwX2l0ZW1fc3RhcnQsICpwX2F0dHJfY291bnQ7Ci0gIHVpbnQxNl90IGl0ZW1fY291bnQ7Ci0gIHVpbnQxNl90IG10dTsKLSAgYm9vbCBtdWx0aV9pdGVtc19hZGRfZmFpbCA9IGZhbHNlOwotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogbWFrZSBzdXJlIHRoZSBnaXZlbiBidWZmZXIgY2FuIGFjY29tb2RhdGUgdGhpcyByZXNwb25zZSAqLwotICBsZW5fbGVmdCA9IEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUgLSBCVF9IRFJfU0laRTsKLSAgcCA9ICh1aW50OF90KikocF9wa3QgKyAxKTsKLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihtdHUsIHApOwotICBpZiAobGVuX2xlZnQgPiBtdHUpIGxlbl9sZWZ0ID0gbXR1OwotICBsZW5fbGVmdCA9IGxlbl9sZWZ0IC0gcF9wa3QtPm9mZnNldCAtIHBfcGt0LT5sZW47Ci0KLSAgLyogZ2V0IHRoZSBleGlzdGluZyBsZW5ndGgsIGlmIGFueSwgYW5kIGFsc28gdGhlIG51bSBhdHRyaWJ1dGVzICovCi0gIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX2RhdGEgPSBwX2xlbiA9IHBfc3RhcnQgKyAxOyAvKiBwZHUgKi8KLQotICAvKiB0aGUgZXhpc3RpbmcgbGVuICovCi0gIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwX2RhdGEpOwotICBwX251bSA9IHBfZGF0YSArIDM7Ci0gIGlmIChsZW4gPT0gMCkgewotICAgIC8qIGZpcnN0IHRpbWUgaW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlIGNvdW50ICovCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnN0YXR1cyk7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT51aWRfY291bnRlcik7Ci0gICAgaXRlbV9jb3VudCA9IDA7Ci0gICAgcF9kYXRhICs9IDI7Ci0gICAgbGVuID0gNTsKLSAgICBsZW5fbGVmdCAtPSA1OwotICB9IGVsc2UgewotICAgIHBfZGF0YSA9IHBfc3RhcnQgKyBwX3BrdC0+bGVuOwotICAgIHAgPSBwX251bTsKLSAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGl0ZW1fY291bnQsIHApOwotICB9Ci0gIEFWUkNfVFJBQ0VfREVCVUcoImxlbjolZCwgbGVuX2xlZnQ6JWQsIG51bTolZCIsIGxlbiwgbGVuX2xlZnQsIGl0ZW1fY291bnQpOwotCi0gIC8qIG1pbiBsZW4gcmVxdWlyZWQgPSBpdGVtX3R5cGUoMSkgKyBpdGVtIGxlbigyKSArIG1pbiBpdGVtICgxNCkgPSAxNyAqLwotICBmb3IgKHh4ID0gMDsKLSAgICAgICB4eCA8IHBfcnNwLT5pdGVtX2NvdW50ICYmIGxlbl9sZWZ0ID4gQVZSQ19NSU5fTEVOX0dFVF9GT0xERVJfSVRFTVNfUlNQICYmCi0gICAgICAgIW11bHRpX2l0ZW1zX2FkZF9mYWlsOwotICAgICAgIHh4KyspIHsKLSAgICBwX2l0ZW1fc3RhcnQgPSBwX2RhdGE7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9pdGVtX2xpc3RbeHhdLml0ZW1fdHlwZSk7Ci0gICAgLyogdmFyaWFibGUgaXRlbSBsZW50aCAtIHNhdmUgdGhlIGxvY2F0aW9uIHRvIGFkZCBsZW5ndGggKi8KLSAgICBwX2l0ZW1fbGVuID0gcF9kYXRhOwotICAgIHBfZGF0YSArPSAyOwotICAgIGl0ZW1fbGVuID0gMDsKLSAgICBjb25zdCB1aW50MTZfdCBpdGVtX2hlYWRlcl9sZW4gPSAzOyAvKiBpdGVtX3R5cGUoMSkgKyBpdGVtIGxlbigyKSAqLwotICAgIHVpbnQxNl90IGl0ZW1fbGVuX2xlZnQgPSBsZW5fbGVmdCAtIGl0ZW1faGVhZGVyX2xlbjsKLSAgICBzd2l0Y2ggKHBfaXRlbV9saXN0W3h4XS5pdGVtX3R5cGUpIHsKLSAgICAgIGNhc2UgQVZSQ19JVEVNX1BMQVlFUjoKLSAgICAgICAgLyogbWluIGxlbiByZXF1aXJlZDogMiArIDEgKyA0ICsgMSArIDE2ICsgMiArIDIgPSAzMCArIHN0cl9sZW4gKi8KLSAgICAgICAgcF9wbGF5ZXIgPSAmcF9pdGVtX2xpc3RbeHhdLnUucGxheWVyOwotICAgICAgICBpdGVtX2xlbiA9IEFWUkNfRkVBVFVSRV9NQVNLX1NJWkUgKyBwX3BsYXllci0+bmFtZS5zdHJfbGVuICsgMTI7Ci0KLSAgICAgICAgaWYgKChpdGVtX2xlbl9sZWZ0IDwgaXRlbV9sZW4pIHx8Ci0gICAgICAgICAgICAhQVZSQ19JVEVNX1BMQVlFUl9JU19WQUxJRChwX3BsYXllcikpIHsKLSAgICAgICAgICBpZiAoaXRlbV9sZW5fbGVmdCA8IGl0ZW1fbGVuICYmIGl0ZW1fY291bnQgPiAwKSB7Ci0gICAgICAgICAgICBtdWx0aV9pdGVtc19hZGRfZmFpbCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBfZGF0YSA9IHBfaXRlbV9zdGFydDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9wbGF5ZXItPnBsYXllcl9pZCk7Ci0gICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcGxheWVyLT5tYWpvcl90eXBlKTsKLSAgICAgICAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcGxheWVyLT5zdWJfdHlwZSk7Ci0gICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcGxheWVyLT5wbGF5X3N0YXR1cyk7Ci0gICAgICAgIEFSUkFZX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcGxheWVyLT5mZWF0dXJlcywgQVZSQ19GRUFUVVJFX01BU0tfU0laRSk7Ci0gICAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3BsYXllci0+bmFtZS5jaGFyc2V0X2lkKTsKLSAgICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcGxheWVyLT5uYW1lLnN0cl9sZW4pOwotICAgICAgICBBUlJBWV9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3BsYXllci0+bmFtZS5wX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGxheWVyLT5uYW1lLnN0cl9sZW4pOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX0lURU1fRk9MREVSOgotICAgICAgICAvKiBtaW4gbGVuIHJlcXVpcmVkOiA4ICsgMSArIDEgKyAyICsgMiA9IDE0ICsgc3RyX2xlbiAqLwotICAgICAgICBwX2ZvbGRlciA9ICZwX2l0ZW1fbGlzdFt4eF0udS5mb2xkZXI7Ci0gICAgICAgIGl0ZW1fbGVuID0gQVZSQ19VSURfU0laRSArIHBfZm9sZGVyLT5uYW1lLnN0cl9sZW4gKyA2OwotCi0gICAgICAgIGlmICgoaXRlbV9sZW5fbGVmdCA8IGl0ZW1fbGVuKSB8fCAhcF9mb2xkZXItPm5hbWUucF9zdHIgfHwKLSAgICAgICAgICAgIHBfZm9sZGVyLT50eXBlID4gQVZSQ19GT0xERVJfVFlQRV9ZRUFSUykgewotICAgICAgICAgIGlmIChpdGVtX2xlbl9sZWZ0IDwgaXRlbV9sZW4gJiYgaXRlbV9jb3VudCA+IDApIHsKLSAgICAgICAgICAgIG11bHRpX2l0ZW1zX2FkZF9mYWlsID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcF9kYXRhID0gcF9pdGVtX3N0YXJ0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEFSUkFZX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfZm9sZGVyLT51aWQsIEFWUkNfVUlEX1NJWkUpOwotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2ZvbGRlci0+dHlwZSk7Ci0gICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfZm9sZGVyLT5wbGF5YWJsZSk7Ci0gICAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2ZvbGRlci0+bmFtZS5jaGFyc2V0X2lkKTsKLSAgICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfZm9sZGVyLT5uYW1lLnN0cl9sZW4pOwotICAgICAgICBBUlJBWV9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX2ZvbGRlci0+bmFtZS5wX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZm9sZGVyLT5uYW1lLnN0cl9sZW4pOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX0lURU1fTUVESUE6Ci0gICAgICAgIC8qIG1pbiBsZW4gcmVxdWlyZWQ6IDggKyAxICsgMiArIDIgKyAxID0gMTQgKyBzdHJfbGVuICovCi0gICAgICAgIHBfbWVkaWEgPSAmcF9pdGVtX2xpc3RbeHhdLnUubWVkaWE7Ci0gICAgICAgIGl0ZW1fbGVuID0gQVZSQ19VSURfU0laRSArIHBfbWVkaWEtPm5hbWUuc3RyX2xlbiArIDY7Ci0KLSAgICAgICAgaWYgKChpdGVtX2xlbl9sZWZ0IDwgaXRlbV9sZW4pIHx8ICFwX21lZGlhLT5uYW1lLnBfc3RyIHx8Ci0gICAgICAgICAgICBwX21lZGlhLT50eXBlID4gQVZSQ19NRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgaWYgKGl0ZW1fbGVuX2xlZnQgPCBpdGVtX2xlbiAmJiBpdGVtX2NvdW50ID4gMCkgewotICAgICAgICAgICAgbXVsdGlfaXRlbXNfYWRkX2ZhaWwgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBwX2RhdGEgPSBwX2l0ZW1fc3RhcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgQVJSQVlfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9tZWRpYS0+dWlkLCBBVlJDX1VJRF9TSVpFKTsKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9tZWRpYS0+dHlwZSk7Ci0gICAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX21lZGlhLT5uYW1lLmNoYXJzZXRfaWQpOwotICAgICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9tZWRpYS0+bmFtZS5zdHJfbGVuKTsKLSAgICAgICAgQVJSQVlfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9tZWRpYS0+bmFtZS5wX3N0ciwgcF9tZWRpYS0+bmFtZS5zdHJfbGVuKTsKLSAgICAgICAgcF9hdHRyX2NvdW50ID0gcF9kYXRhKys7Ci0gICAgICAgICpwX2F0dHJfY291bnQgPSAwOwotICAgICAgICB1aW50MTZfdCBhdHRyaWJ1dGVfbGVuX2xlZnQgPSBpdGVtX2xlbl9sZWZ0IC0gaXRlbV9sZW47Ci0gICAgICAgIHBfYXR0ciA9IHBfbWVkaWEtPnBfYXR0cl9saXN0OwotICAgICAgICBmb3IgKHl5ID0gMDsgeXkgPCBwX21lZGlhLT5hdHRyX2NvdW50OyB5eSsrKSB7Ci0gICAgICAgICAgLyogbGVuIHJlcXVpcmVkOiA0ICsgMiArIDIgKyBzdHJfbGVuICovCi0gICAgICAgICAgY29uc3QgdWludDE2X3QgYXR0cmlidXRlX2xlbiA9IHBfYXR0clt5eV0ubmFtZS5zdHJfbGVuICsgODsKLSAgICAgICAgICBpZiAoaXRlbV9sZW5fbGVmdCA8IGF0dHJpYnV0ZV9sZW4gfHwgIXBfYXR0clt5eV0ubmFtZS5wX3N0ciB8fAotICAgICAgICAgICAgICBBVlJDX0lTX1ZBTElEX01FRElBX0FUVFJJQlVURShwX2F0dHJbeXldLmF0dHJfaWQpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlX2xlbl9sZWZ0IDwgYXR0cmlidXRlX2xlbiAmJiBpdGVtX2NvdW50ID4gMCkgewotICAgICAgICAgICAgICBtdWx0aV9pdGVtc19hZGRfZmFpbCA9IHRydWU7Ci0gICAgICAgICAgICAgIHBfZGF0YSA9IHBfaXRlbV9zdGFydDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKCpwX2F0dHJfY291bnQpKys7Ci0gICAgICAgICAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfYXR0clt5eV0uYXR0cl9pZCk7Ci0gICAgICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfYXR0clt5eV0ubmFtZS5jaGFyc2V0X2lkKTsKLSAgICAgICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9hdHRyW3l5XS5uYW1lLnN0cl9sZW4pOwotICAgICAgICAgIEFSUkFZX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfYXR0clt5eV0ubmFtZS5wX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hdHRyW3l5XS5uYW1lLnN0cl9sZW4pOwotICAgICAgICAgIGl0ZW1fbGVuICs9IGF0dHJpYnV0ZV9sZW47Ci0gICAgICAgICAgYXR0cmlidXRlX2xlbl9sZWZ0IC09IGF0dHJpYnV0ZV9sZW47Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfSAvKiBzd2l0Y2ggaXRlbV90eXBlICovCi0KLSAgICBpZiAocF9pdGVtX3N0YXJ0ICE9IHBfZGF0YSkgewotICAgICAgLyogc3VjY2Vzc2Z1bGx5IGFkZGVkIHRoZSBpdGVtICovCi0gICAgICBpdGVtX2NvdW50Kys7Ci0gICAgICAvKiBmaWxsIGluIHZhcmlhYmxlIGl0ZW0gbGVudGggKi8KLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9pdGVtX2xlbiwgaXRlbV9sZW4pOwotICAgICAgbGVuX2xlZnQgLT0gaXRlbV9sZW4gKyBpdGVtX2hlYWRlcl9sZW47Ci0gICAgICBsZW4gKz0gaXRlbV9sZW4gKyBpdGVtX2hlYWRlcl9sZW47Ci0gICAgfSBlbHNlIGlmICghbXVsdGlfaXRlbXNfYWRkX2ZhaWwpIHsKLSAgICAgIC8qIHNvbWUgaXRlbSBpcyBub3QgYWRkZWQgcHJvcGVybHkgLSBzZXQgYW4gZXJyb3Igc3RhdHVzICovCi0gICAgICBpZiAoaXRlbV9sZW5fbGVmdCA8IGl0ZW1fbGVuKQotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICBlbHNlCi0gICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBVlJDX1RSQUNFX0RFQlVHKCJsZW46JWQsIGxlbl9sZWZ0OiVkLCBudW06JWQsIGl0ZW1fbGVuOiVkIiwgbGVuLCBsZW5fbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIGl0ZW1fY291bnQsIGl0ZW1fbGVuKTsKLSAgfSAvKiBmb3IgaXRlbV9jb3VudCAqLwotCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9udW0sIGl0ZW1fY291bnQpOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfbGVuLCBsZW4pOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9jaGFuZ2VfcGF0aF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBDaGFuZ2UgUGF0aCByZXNwb25zZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgbWVzc2FnZSBnb2VzIHRocm91Z2ggdGhlIEJyb3dzaW5nIGNoYW5uZWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgcmVzcG9uc2UgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfY2hhbmdlX3BhdGhfcnNwKHRBVlJDX0NIR19QQVRIX1JTUCogcF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIHVpbnQ4X3QgKnBfZGF0YSwgKnBfc3RhcnQ7Ci0KLSAgLyogZ2V0IHRoZSBleGlzdGluZyBsZW5ndGgsIGlmIGFueSwgYW5kIGFsc28gdGhlIG51bSBhdHRyaWJ1dGVzICovCi0gIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX2RhdGEgPSBwX3N0YXJ0ICsgMTsgLyogcGR1ICovCi0gIC8qIGFkZCBmaXhlZCBsZW5ndGggLSBzdGF0dXMoMSkgKyBudW1faXRlbXMoNCkgKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDUpOwotICBVSU5UOF9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+c3RhdHVzKTsKLSAgVUlOVDMyX1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT5udW1faXRlbXMpOwotICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX2JsZF9nZXRfYXR0cnNfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgR2V0SXRlbUF0dHJpYnV0ZXMgcmVzcG9uc2UsCi0gKgotICogICAgICAgICAgICAgICAgICBUaGUgR2V0IEl0ZW0gQXR0cmlidXRlcyBtZXNzYWdlIGdvZXMgdGhyb3VnaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgQnJvd3NpbmcgY2hhbm5lbCAoYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHxwX3BrdHwpCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBBVlJDX1NUU19JTlRFUk5BTF9FUlIsIGlmIHRoZSBnaXZlbiBidWZmZXIgZG9lcyBub3QgaGF2ZQotICogICAgICAgICAgICAgICAgICBlbm91Z2ggcm9vbQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2dldF9pdGVtX2F0dHJzX3JzcCh0QVZSQ19HRVRfQVRUUlNfUlNQKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICBpZiAoIXBfcnNwLT5wX2F0dHJzKSB7Ci0gICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgTlVMTCBwX2F0dHJzIiwgX19mdW5jX18pOwotICAgIHJldHVybiBBVlJDX1NUU19CQURfUEFSQU07Ci0gIH0KLSAgLyogRmlndXJlIG91dCBob3cgbXVjaCB3ZSBoYXZlIGxlZnQgaW4gY3VycmVudCBidWZmZXIgKi8KLSAgaW50IHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHkgPQotICAgICAgQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIEJUX0hEUl9TSVpFIC0gcF9wa3QtPm9mZnNldDsKLSAgLyogR2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgZGF0YSBzZWN0aW9uIGluIGJ1ZmZlciAqLwotICB1aW50OF90KiBwX2RhdGEgPSAodWludDhfdCopKHBfcGt0ICsgMSk7Ci0gIC8qIEdldCB0aGUgTVRVIHNpemUgdGhhdCBpcyBmaWxsZWQgaW4gZWFybGllciAqLwotICB1aW50MTZfdCBtdHU7Ci0gIEJFX1NUUkVBTV9UT19VSU5UMTYobXR1LCBwX2RhdGEpOwotICBpZiAocmVtYWluaW5nX2J1ZmZlcl9jYXBhY2l0eSA+IG10dSkgewotICAgIHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHkgPSBtdHU7Ci0gIH0KLSAgQVZSQ19UUkFDRV9ERUJVRygiJXM6IHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHk6JWQsIG10dTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHksIG10dSk7Ci0gIGlmIChyZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5IDwgNSkgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzOiBub3QgZW5vdWdoIHNwYWNlIGZvciBwYWNrZXQgaGVhZGVyLCByZW1haW5pbmc6JWQgPCA1IiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5KTsKLSAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICB9Ci0gIC8qIEdldCB0byB0aGUgYmVnaW5uaW5nIG9mIFBEVSAqLwotICB1aW50OF90KiBwX3BkdV9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIC8qIFNraXAgUERVIElEIHRvIGdldCBwb2ludGVyIHRvIFBhcmFtZXRlciBsZW5ndGggKi8KLSAgdWludDhfdCogcF9wYXJhbWV0ZXJfbGVuOwotICBwX2RhdGEgPSBwX3BhcmFtZXRlcl9sZW4gPSBwX3BkdV9zdGFydCArIDE7Ci0gIC8qIFBhcnNlIGV4aXN0aW5nIHBhcmFtZXRlciBsZW5ndGggKi8KLSAgdWludDE2X3QgcGFyYW1ldGVyX2xlbjsKLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihwYXJhbWV0ZXJfbGVuLCBwX2RhdGEpOwotICAvKiBTa2lwIG9uZSBieXRlIHRvIE51bWJlciBvZiBBdHRyaWJ1dGVzICovCi0gIHVpbnQ4X3QqIHBfc3RhdHVzID0gcF9kYXRhKys7Ci0gIHVpbnQ4X3QqIHBfYXR0cmlidXRlX2NvdW50ID0gcF9kYXRhKys7Ci0gIGlmIChwYXJhbWV0ZXJfbGVuID09IDApIHsKLSAgICAvKiBGaXJzdCB0aW1lLCBpbml0aWFsaXplIHRoZSBzdGF0dXMgYnl0ZSAqLwotICAgICpwX3N0YXR1cyA9IHBfcnNwLT5zdGF0dXM7Ci0gICAgaWYgKHBfcnNwLT5zdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IpIHsKLSAgICAgIC8vIFRPRE8oc2l5dWFuaCk6IFRoaXMgaXMgYSBoYWNrCi0gICAgICBwYXJhbWV0ZXJfbGVuID0gMTsKLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9wYXJhbWV0ZXJfbGVuLCBwYXJhbWV0ZXJfbGVuKTsKLSAgICAgIHBfcGt0LT5sZW4gPSBwX3N0YXR1cyAtIHBfcGR1X3N0YXJ0OwotICAgICAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotICAgIH0KLSAgICAqcF9hdHRyaWJ1dGVfY291bnQgPSAwOwotICB9IGVsc2UgewotICAgIC8vIFRPRE8oc2l5dWFuaCk6IFdoeSBkbyB3ZWUgbmVlZCB0aGlzIGNhc2U/Ci0gICAgcF9kYXRhID0gcF9wZHVfc3RhcnQgKyBwX3BrdC0+bGVuOwotICB9Ci0gIHJlbWFpbmluZ19idWZmZXJfY2FwYWNpdHkgLT0gcF9kYXRhIC0gcF9wZHVfc3RhcnQ7Ci0gIC8qIEZpbGwgaW4gdGhlIEF0dHJpYnV0ZSBJRCwgQ2hhcmFjdGVyIFNldCwgTGVuZ3RoIGFuZCBWYWx1ZXMgKi8KLSAgYXZyY19idWlsZF9hdHRyaWJ1dGVfZW50cmllcyhwX3JzcC0+bnVtX2F0dHJzLCBwX3JzcC0+cF9hdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdfYnVmZmVyX2NhcGFjaXR5LCAmcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYXR0cmlidXRlX2NvdW50KTsKLSAgcGFyYW1ldGVyX2xlbiA9IHBfZGF0YSAtIHBfc3RhdHVzOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcGFyYW1ldGVyX2xlbiwgcGFyYW1ldGVyX2xlbik7Ci0gIHBfcGt0LT5sZW4gPSBwX2RhdGEgLSBwX3BkdV9zdGFydDsKLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfZ2V0X251bV9vZl9pdGVtX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIEdldCBUb3RhbCBOdW1iZXIgb2YgSXRlbXMgcmVzcG9uc2UuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgZ29lcyB0aHJvdWdoIHRoZSBCcm93c2luZyBjaGFubmVsCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBBVlJDX1NUU19JTlRFUk5BTF9FUlIsIGlmIHRoZSBnaXZlbiBidWZmZXIgZG9lcyBub3QgaGF2ZQotICogICAgICAgICAgICAgICAgICBlbm91Z2ggcm9vbQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2dldF9udW1fb2ZfaXRlbV9yc3AodEFWUkNfR0VUX05VTV9PRl9JVEVNU19SU1AqIHBfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgdWludDhfdCAqcF9kYXRhLCAqcF9zdGFydCwgKnBfbGVuOwotCi0gIEFWUkNfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgLyogZ2V0IHRoZSBleGlzdGluZyBsZW5ndGgsIGlmIGFueSwgYW5kIGFsc28gdGhlIG51bSBhdHRyaWJ1dGVzICovCi0gIHBfc3RhcnQgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX2RhdGEgPSBwX2xlbiA9IHBfc3RhcnQgKyAxOyAvKiBwZHUgKi8KLQotICBpZiAocF9yc3AtPnN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUikgewotICAgIC8qIGFkZCBmaXhlZCBsZW50aCAtIHN0YXR1cygxKSArIHVpZF9jb3VudGVyKDIpICsgbnVtX2l0ZW1zKDQpICovCi0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX2RhdGEsIDcpOwotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2RhdGEsIHBfcnNwLT5zdGF0dXMpOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+dWlkX2NvdW50ZXIpOwotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+bnVtX2l0ZW1zKTsKLSAgICBwX3BrdC0+bGVuID0gKHBfZGF0YSAtIHBfc3RhcnQpOwotICAgIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLSAgfSBlbHNlIHsKLSAgICAvKiBhZGQgZml4ZWQgbGVudGggLSBzdGF0dXMoMSkgKi8KLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfZGF0YSwgNyk7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnN0YXR1cyk7Ci0gICAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgICByZXR1cm4gcF9yc3AtPnN0YXR1czsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfc2VhcmNoX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIFNlYXJjaCByZXNwb25zZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgbWVzc2FnZSBnb2VzIHRocm91Z2ggdGhlIEJyb3dzaW5nIGNoYW5uZWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgcmVzcG9uc2UgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19ibGRfc2VhcmNoX3JzcCh0QVZSQ19TRUFSQ0hfUlNQKiBwX3JzcCwgQlRfSERSKiBwX3BrdCkgewotICB1aW50OF90ICpwX2RhdGEsICpwX3N0YXJ0LCAqcF9sZW47Ci0KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotICAvKiBnZXQgdGhlIGV4aXN0aW5nIGxlbmd0aCwgaWYgYW55LCBhbmQgYWxzbyB0aGUgbnVtIGF0dHJpYnV0ZXMgKi8KLSAgcF9zdGFydCA9ICh1aW50OF90KikocF9wa3QgKyAxKSArIHBfcGt0LT5vZmZzZXQ7Ci0gIHBfZGF0YSA9IHBfbGVuID0gcF9zdGFydCArIDE7IC8qIHBkdSAqLwotCi0gIC8qIGFkZCBmaXhlZCBsZW50aCAtIHN0YXR1cygxKSArIHVpZF9jb3VudGVyKDIpICsgbnVtX2l0ZW1zKDQpICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCA3KTsKLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPnN0YXR1cyk7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCBwX3JzcC0+dWlkX2NvdW50ZXIpOwotICBVSU5UMzJfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9yc3AtPm51bV9pdGVtcyk7Ci0gIHBfcGt0LT5sZW4gPSAocF9kYXRhIC0gcF9zdGFydCk7Ci0gIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX3BsYXlfaXRlbV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBQbGF5IEl0ZW0gcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX3BsYXlfaXRlbV9yc3AodEFWUkNfUlNQKiBwX3JzcCwgQlRfSERSKiBwX3BrdCkgewotICBBVlJDX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBhdnJjX2JsZF9jdHJsX3N0YXR1c19yc3AocF9yc3AsIHBfcGt0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfYmxkX2FkZF90b19ub3dfcGxheWluZ19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBBZGQgdG8gTm93IFBsYXlpbmcgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIHJlc3BvbnNlIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfYmxkX2FkZF90b19ub3dfcGxheWluZ19yc3AodEFWUkNfUlNQKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfcGt0KSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIGF2cmNfYmxkX2N0cmxfc3RhdHVzX3JzcChwX3JzcCwgcF9wa3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19ibGRfaW5pdF9yc3BfYnVmZmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSByZXNwb25zZSBidWZmZXIgYmFzZWQgb24gUERVCi0gKgotICogUmV0dXJucyAgICAgICAgICBOVUxMLCBpZiBubyBidWZmZXIgb3IgZmFpbHVyZSB0byBidWlsZCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGluaXRpYWxpemVkIG1lc3NhZ2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF2cmNfYmxkX2luaXRfcnNwX2J1ZmZlcih0QVZSQ19SRVNQT05TRSogcF9yc3ApIHsKLSAgdWludDE2X3Qgb2Zmc2V0ID0gMDsKLSAgdWludDE2X3QgY2hubCA9IEFWQ1RfREFUQV9DVFJMOwotICB1aW50OF90IG9wY29kZSA9IGF2cmNfb3Bjb2RlX2Zyb21fcGR1KHBfcnNwLT5wZHUpOwotCi0gIEFWUkNfVFJBQ0VfQVBJKCIlczogcGR1PSV4LCBvcGNvZGU9JXgvJXgiLCBfX2Z1bmNfXywgcF9yc3AtPnBkdSwgb3Bjb2RlLAotICAgICAgICAgICAgICAgICBwX3JzcC0+cnNwLm9wY29kZSk7Ci0gIGlmIChvcGNvZGUgIT0gcF9yc3AtPnJzcC5vcGNvZGUgJiYgcF9yc3AtPnJzcC5zdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IgJiYKLSAgICAgIGF2cmNfaXNfdmFsaWRfb3Bjb2RlKHBfcnNwLT5yc3Aub3Bjb2RlKSkgewotICAgIG9wY29kZSA9IHBfcnNwLT5yc3Aub3Bjb2RlOwotICAgIEFWUkNfVFJBQ0VfQVBJKCIlcyBvcGNvZGU9JXgiLCBfX2Z1bmNfXywgb3Bjb2RlKTsKLSAgfQotCi0gIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgY2FzZSBBVlJDX09QX0JST1dTRToKLSAgICAgIGNobmwgPSBBVkNUX0RBVEFfQlJPV1NFOwotICAgICAgb2Zmc2V0ID0gQVZDVF9CUk9XU0VfT0ZGU0VUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfT1BfUEFTU19USFJVOgotICAgICAgb2Zmc2V0ID0gQVZSQ19NU0dfUEFTU19USFJVX09GRlNFVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX09QX1ZFTkRPUjoKLSAgICAgIG9mZnNldCA9IEFWUkNfTVNHX1ZFTkRPUl9PRkZTRVQ7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBidWZmZXIgKi8KLSAgQlRfSERSKiBwX3BrdCA9IChCVF9IRFIqKW9zaV9jYWxsb2MoQlRfREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0gIHVpbnQ4X3QgKnBfZGF0YSwgKnBfc3RhcnQ7Ci0KLSAgcF9wa3QtPmxheWVyX3NwZWNpZmljID0gY2hubDsKLSAgcF9wa3QtPmV2ZW50ID0gb3Bjb2RlOwotICBwX3BrdC0+b2Zmc2V0ID0gb2Zmc2V0OwotICBwX2RhdGEgPSAodWludDhfdCopKHBfcGt0ICsgMSkgKyBwX3BrdC0+b2Zmc2V0OwotICBwX3N0YXJ0ID0gcF9kYXRhOwotCi0gIC8qIHBhc3MgdGhydSAtIGdyb3VwIG5hdmlnYXRpb24gLSBoYXMgYSB0d28gYnl0ZSBvcF9pZCwgc28gZG9udCBkbyBpdCBoZXJlICovCi0gIGlmIChvcGNvZGUgIT0gQVZSQ19PUF9QQVNTX1RIUlUpICpwX2RhdGErKyA9IHBfcnNwLT5wZHU7Ci0KLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBjYXNlIEFWUkNfT1BfVkVORE9SOgotICAgICAgLyogcmVzZXJ2ZWQgMCwgcGFja2V0X3R5cGUgMCAqLwotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfZGF0YSwgMCk7Ci0gICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgY2FzZSBBVlJDX09QX0JST1dTRToKLSAgICAgIC8qIGFkZCBmaXhlZCBsZW50aCAtIDAgKi8KLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9kYXRhLCAwKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcF9wa3QtPmxlbiA9IChwX2RhdGEgLSBwX3N0YXJ0KTsKLSAgcF9yc3AtPnJzcC5vcGNvZGUgPSBvcGNvZGU7Ci0KLSAgcmV0dXJuIHBfcGt0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19CbGRSZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIGdpdmVuIEFWUkNQIHJlc3BvbnNlIHRvIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgICBidWZmZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgcmVzcG9uc2UgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVlJDX1NUUyBBVlJDX0JsZFJlc3BvbnNlKHVpbnQ4X3QgaGFuZGxlLCB0QVZSQ19SRVNQT05TRSogcF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqKiBwcF9wa3QpIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgQlRfSERSKiBwX3BrdDsKLSAgYm9vbCBhbGxvYyA9IGZhbHNlOwotICB1aW50OF90KiBwOwotICB1aW50MTZfdCBwZWVyX210dTsKLQotICBpZiAoIXBfcnNwIHx8ICFwcF9wa3QpIHsKLSAgICBBVlJDX1RSQUNFX0FQSSgiJXMgSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZC4gcF9yc3A9JXAsIHBwX3BrdD0lcCIsCi0gICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcnNwLCBwcF9wa3QpOwotICAgIHJldHVybiBBVlJDX1NUU19CQURfUEFSQU07Ci0gIH0KLQotICBpZiAoKnBwX3BrdCA9PSBOVUxMKSB7Ci0gICAgKnBwX3BrdCA9IGF2cmNfYmxkX2luaXRfcnNwX2J1ZmZlcihwX3JzcCk7Ci0gICAgaWYgKCpwcF9wa3QgPT0gTlVMTCkgewotICAgICAgQVZSQ19UUkFDRV9BUEkoIiVzIEZhaWxlZCB0byBpbml0aWFsaXplIHJlc3BvbnNlIGJ1ZmZlciIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgfQotCi0gICAgaWYgKCgqcHBfcGt0KS0+bGF5ZXJfc3BlY2lmaWMgPT0gQVZDVF9EQVRBX0JST1dTRSkgewotICAgICAgcCA9ICh1aW50OF90KikoKCpwcF9wa3QpICsgMSk7Ci0gICAgICBwZWVyX210dSA9IEFWQ1RfR2V0QnJvd3NlTXR1KGhhbmRsZSkgLSBBVkNUX0hEUl9MRU5fU0lOR0xFOwotICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwZWVyX210dSk7Ci0gICAgfQotCi0gICAgYWxsb2MgPSB0cnVlOwotICB9Ci0gIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICBwX3BrdCA9ICpwcF9wa3Q7Ci0KLSAgQVZSQ19UUkFDRV9BUEkoIiVzIHBkdT0leCBzdGF0dXM9JXgiLCBfX2Z1bmNfXywgcF9yc3AtPnJzcC5wZHUsCi0gICAgICAgICAgICAgICAgIHBfcnNwLT5yc3Auc3RhdHVzKTsKLSAgaWYgKHBfcnNwLT5yc3Auc3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgcmV0dXJuIChhdnJjX2JsZF9yZWplY3RlZF9yc3AoJnBfcnNwLT5yc3AsIHBfcGt0KSk7Ci0gIH0KLQotICBzd2l0Y2ggKHBfcnNwLT5wZHUpIHsKLSAgICBjYXNlIEFWUkNfUERVX05FWFRfR1JPVVA6Ci0gICAgY2FzZSBBVlJDX1BEVV9QUkVWX0dST1VQOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfZ3JvdXBfbmF2aWdhdGlvbl9yc3AocF9yc3AtPnBkdSwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9DQVBBQklMSVRJRVM6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9nZXRfY2FwYWJpbGl0eV9yc3AoJnBfcnNwLT5nZXRfY2FwcywgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0xJU1RfUExBWUVSX0FQUF9BVFRSOgotICAgICAgc3RhdHVzID0KLSAgICAgICAgICBhdnJjX2JsZF9saXN0X2FwcF9zZXR0aW5nc19hdHRyX3JzcCgmcF9yc3AtPmxpc3RfYXBwX2F0dHIsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfVkFMVUVTOgotICAgICAgc3RhdHVzID0KLSAgICAgICAgICBhdnJjX2JsZF9saXN0X2FwcF9zZXR0aW5nc192YWx1ZXNfcnNwKCZwX3JzcC0+bGlzdF9hcHBfdmFsdWVzLCBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0NVUl9QTEFZRVJfQVBQX1ZBTFVFOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfZ2V0X2N1cl9hcHBfc2V0dGluZ192YWx1ZV9yc3AoJnBfcnNwLT5nZXRfY3VyX2FwcF92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUU6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9zZXRfYXBwX3NldHRpbmdfdmFsdWVfcnNwKCZwX3JzcC0+c2V0X2FwcF92YWwsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9BVFRSX1RFWFQ6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9nZXRfYXBwX3NldHRpbmdfYXR0cl90ZXh0X3JzcCgmcF9yc3AtPmdldF9hcHBfYXR0cl90eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlFUl9BUFBfVkFMVUVfVEVYVDoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2dldF9hcHBfc2V0dGluZ192YWx1ZV90ZXh0X3JzcCgmcF9yc3AtPmdldF9hcHBfdmFsX3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfSU5GT1JNX0RJU1BMQVlfQ0hBUlNFVDoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2luZm9ybV9jaGFyc2V0X3JzcCgmcF9yc3AtPmluZm9ybV9jaGFyc2V0LCBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfSU5GT1JNX0JBVFRFUllfU1RBVF9PRl9DVDoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2luZm9ybV9iYXR0ZXJ5X3N0YXR1c19yc3AoJnBfcnNwLT5pbmZvcm1fYmF0dGVyeV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfZ2V0X2VsZW1fYXR0cnNfcnNwKCZwX3JzcC0+Z2V0X2F0dHJzLCBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfZ2V0X3BsYXlfc3RhdHVzX3JzcCgmcF9yc3AtPmdldF9wbGF5X3N0YXR1cywgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX25vdGlmeV9yc3AoJnBfcnNwLT5yZWdfbm90aWYsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9SRVFVRVNUX0NPTlRJTlVBVElPTl9SU1A6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9uZXh0X3JzcCgmcF9yc3AtPmNvbnRpbnUsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9BQk9SVF9DT05USU5VQVRJT05fUlNQOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfbmV4dF9yc3AoJnBfcnNwLT5hYm9ydCwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9BRERSRVNTRURfUExBWUVSOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfc2V0X2FkZHJfcGxheWVyX3JzcCgmcF9yc3AtPmFkZHJfcGxheWVyLCBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfUExBWV9JVEVNOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfcGxheV9pdGVtX3JzcCgmcF9yc3AtPnBsYXlfaXRlbSwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9BQlNPTFVURV9WT0xVTUU6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9zZXRfYWJzb2x1dGVfdm9sdW1lX3JzcChwX3JzcC0+dm9sdW1lLnZvbHVtZSwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0FERF9UT19OT1dfUExBWUlORzoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2FkZF90b19ub3dfcGxheWluZ19yc3AoJnBfcnNwLT5hZGRfdG9fcGxheSwgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUjoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3NldF9icm93c2VkX3BsYXllcl9yc3AoJnBfcnNwLT5icl9wbGF5ZXIsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfRk9MREVSX0lURU1TOgotICAgICAgc3RhdHVzID0gYXZyY19ibGRfZ2V0X2ZvbGRlcl9pdGVtc19yc3AoJnBfcnNwLT5nZXRfaXRlbXMsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9DSEFOR0VfUEFUSDoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2NoYW5nZV9wYXRoX3JzcCgmcF9yc3AtPmNoZ19wYXRoLCBwX3BrdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0lURU1fQVRUUklCVVRFUzoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX2dldF9pdGVtX2F0dHJzX3JzcCgmcF9yc3AtPmdldF9hdHRycywgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVM6Ci0gICAgICBzdGF0dXMgPSBhdnJjX2JsZF9nZXRfbnVtX29mX2l0ZW1fcnNwKCZwX3JzcC0+Z2V0X251bV9vZl9pdGVtcywgcF9wa3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1NFQVJDSDoKLSAgICAgIHN0YXR1cyA9IGF2cmNfYmxkX3NlYXJjaF9yc3AoJnBfcnNwLT5zZWFyY2gsIHBfcGt0KTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGFsbG9jICYmIChzdGF0dXMgIT0gQVZSQ19TVFNfTk9fRVJST1IpKSB7Ci0gICAgb3NpX2ZyZWUocF9wa3QpOwotICAgICpwcF9wa3QgPSBOVUxMOwotICB9Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2cmMvYXZyY19pbnQuaCBiL3N0YWNrL2F2cmMvYXZyY19pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzYmYwNC4uMDAwMDAwMAotLS0gYS9zdGFjay9hdnJjL2F2cmNfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBWUkNQIGludGVybmFsIGhlYWRlciBmaWxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQVZSQ19JTlRfSAotI2RlZmluZSBBVlJDX0lOVF9ICi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAic3RhY2svYXZjdC9hdmN0X2RlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2cmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLyogICAgICBERUJVRyBGTEFHUwotICoKLSAqICNkZWZpbmUgTUVUQV9ERUJVR19FTkFCTEVECi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE51bWJlciBvZiBhdHRyaWJ1dGVzIGluIEFWUkMgU0RQIHJlY29yZC4gKi8KLSNkZWZpbmUgQVZSQ19OVU1fQVRUUiA2Ci0KLS8qIE51bWJlciBvZiBwcm90b2NvbCBlbGVtZW50cyBpbiBwcm90b2NvbCBlbGVtZW50IGxpc3QuICovCi0jZGVmaW5lIEFWUkNfTlVNX1BST1RPX0VMRU1TIDIKLQotI2lmbmRlZiBBVlJDX01JTl9DTURfTEVOCi0jZGVmaW5lIEFWUkNfTUlOX0NNRF9MRU4gMjAKLSNlbmRpZgotCi0jZGVmaW5lIEFWUkNfVU5JVF9PUFJORF9CWVRFUyA1Ci0jZGVmaW5lIEFWUkNfU1VCX09QUk5EX0JZVEVTIDQKLSNkZWZpbmUgQVZSQ19TVUJSU1BfT1BSTkRfQllURVMgMwotI2RlZmluZSBBVlJDX1NVQl9QQUdFX01BU0sgNwotI2RlZmluZSBBVlJDX1NVQl9QQUdFX1NISUZUIDQKLSNkZWZpbmUgQVZSQ19TVUJfRVhUX0NPREUgNwotI2RlZmluZSBBVlJDX1BBU1NfT1BfSURfTUFTSyAweDdGCi0jZGVmaW5lIEFWUkNfUEFTU19TVEFURV9NQVNLIDB4ODAKLSNkZWZpbmUgQVZSQ19DTURfT1BSTkRfUEFEIDB4RkYKLQotI2RlZmluZSBBVlJDX0NUWVBFX01BU0sgMHgwRgotI2RlZmluZSBBVlJDX1NVQlRZUEVfTUFTSyAweEY4Ci0jZGVmaW5lIEFWUkNfU1VCVFlQRV9TSElGVCAzCi0jZGVmaW5lIEFWUkNfU1VCSURfTUFTSyAweDA3Ci0jZGVmaW5lIEFWUkNfU1VCSURfSUdOT1JFIDB4MDcKLQotI2RlZmluZSBBVlJDX1NJTkdMRV9QQVJBTV9TSVpFIDEKLSNkZWZpbmUgQVZSQ19NRVRBREFUQV9QS1RfVFlQRV9NQVNLIDB4MDMKLSNkZWZpbmUgQVZSQ19QQVNTX1RIT1VHSF9NU0dfTUFTSyBcCi0gIDB4ODAgLyogTVNCIG9mIG1zZ190eXBlIGluZGljYXRlcyB0aGUgUEFTIFRIUk9VR0ggbXNnICovCi0jZGVmaW5lIEFWUkNfVkVORE9SX1VOSVFVRV9NQVNLIDB4NzAgLyogdmVuZG9yIHVuaXF1ZSBpZCAqLwotCi0vKiBDb21wYW55IElEIGlzIDI0LWJpdCBpbnRlZ2VyIFdlIGNhbiBub3QgdXNlIHRoZSBtYWNyb3MgaW4gYnRfdHlwZXMuaCAqLwotI2RlZmluZSBBVlJDX0NPX0lEX1RPX0JFX1NUUkVBTShwLCB1MzIpIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1MzIpID4+IDE2KTsgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTMyKSA+PiA4KTsgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkodTMyKTsgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgQVZSQ19CRV9TVFJFQU1fVE9fQ09fSUQodTMyLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHUzMikgPSAoKCh1aW50MzJfdCkoKigocCkgKyAyKSkpICsgKCgodWludDMyX3QpKCooKHApICsgMSkpKSA8PCA4KSArIFwKLSAgICAgICAgICAgICAoKCh1aW50MzJfdCkoKihwKSkpIDw8IDE2KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKSArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBBVlJDX0FWQ19IRFJfU0laRSAzIC8qIGN0eXBlLCBzdWJ1bml0Kiwgb3Bjb2RlICovCi0KLSNkZWZpbmUgQVZSQ19NSU5fTUVUQV9IRFJfU0laRSA0ICAgLyogcGR1IGlkKDEpLCBwYWNrZXQgdHlwZSgxKSwgcGFyYW0gbGVuKDIpICovCi0jZGVmaW5lIEFWUkNfTUlOX0JST1dTRV9IRFJfU0laRSAzIC8qIHBkdSBpZCgxKSwgcGFyYW0gbGVuKDIpICovCi0KLSNkZWZpbmUgQVZSQ19WRU5ET1JfSERSX1NJWkUgNiAvKiBjdHlwZSwgc3VidW5pdCosIG9wY29kZSwgQ09fSUQgKi8KLSNkZWZpbmUgQVZSQ19NU0dfVkVORE9SX09GRlNFVCAyMwotI2RlZmluZSBBVlJDX01JTl9WRU5ET1JfU0laRSBcCi0gIChBVlJDX01TR19WRU5ET1JfT0ZGU0VUICsgQlRfSERSX1NJWkUgKyBBVlJDX01JTl9NRVRBX0hEUl9TSVpFKQotCi0jZGVmaW5lIEFWUkNfUEFTU19USFJVX1NJWkUgOAotI2RlZmluZSBBVlJDX01TR19QQVNTX1RIUlVfT0ZGU0VUIDI1Ci0jZGVmaW5lIEFWUkNfTUlOX1BBU1NfVEhSVV9TSVpFIChBVlJDX01TR19QQVNTX1RIUlVfT0ZGU0VUICsgQlRfSERSX1NJWkUgKyA0KQotCi0jZGVmaW5lIEFWUkNfTUlOX0JST1dTRV9TSVpFIFwKLSAgKEFWQ1RfQlJPV1NFX09GRlNFVCArIEJUX0hEUl9TSVpFICsgQVZSQ19NSU5fQlJPV1NFX0hEUl9TSVpFKQotCi0jZGVmaW5lIEFWUkNfQ1RSTF9QS1RfTEVOKHBmLCBwaykgXAotICB7IChwZikgPSAodWludDhfdCopKChwaykgKyAxKSArIChwayktPm9mZnNldCArIDI7IH0KLQotI2RlZmluZSBBVlJDX01BWF9DVFJMX0RBVEFfTEVOIChBVlJDX1BBQ0tFVF9MRU4pCi0KLS8qIFRpbWVvdXQgZm9yIHdhaXRpbmcgZm9yIGF2cmMgY29tbWFuZCByZXNwb25zZXMgKGluIG1pbGxpc2Vjb25kcykgKi8KLSNpZm5kZWYgQVZSQ19DTURfVE9VVF9NUwotI2RlZmluZSBBVlJDX0NNRF9UT1VUX01TICgyICogMTAwMCkKLSNlbmRpZgotCi0vKiBGbGFncyBmb3IgYXZyY19jYi5jY2JfaW50W10uZmxhZ3MgKi8KLSNkZWZpbmUgQVZSQ19DQl9GTEFHU19SU1BfUEVORElORyAweDAxIC8qIFdhaXRpbmcgZm9yIEFWUkMgcmVzcG9uc2UgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHR5cGUgZm9yIE1ldGFkYXRhIGZyYWdtZW50YXRpb24gY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFIqIHBfZm1zZzsgICAgLyogdGhlIGZyYWdtZW50ZWQgbWVzc2FnZSAqLwotICB1aW50OF90IGZyYWdfcGR1OyAgLyogdGhlIFBEVSBJRCBmb3IgZnJhZ21lbnRhdGlvbiAqLwotICBib29sIGZyYWdfZW5hYmxlZDsgLyogZnJhZ21lbnRhdGlvbiBmbGFnICovCi19IHRBVlJDX0ZSQUdfQ0I7Ci0KLS8qIHR5cGUgZm9yIE1ldGFkYXRhIHJlLWFzc2VtYmx5IGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfSERSKiBwX3Jtc2c7ICAgICAgIC8qIHRoZSByZWNlaXZlZCBtZXNzYWdlICovCi0gIHVpbnQxNl90IHJhc21fb2Zmc2V0OyAvKiByZS1hc3NlbWJseSBmbGFnLCB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBmcmFnbWVudCAqLwotICB1aW50OF90IHJhc21fcGR1OyAgICAgLyogdGhlIFBEVSBJRCBmb3IgcmUtYXNzZW1ibHkgKi8KLX0gdEFWUkNfUkFTTV9DQjsKLQotLyogQVZSQyBpbnRlcm5hbCBjb25uZWN0aW9uIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgZml4ZWRfcXVldWVfdCoKLSAgICAgIGNtZF9xOyAgICAgLyogQ29tbWFuZCBxdWV1ZSBmb3Igc2VyaWFsaXppbmcgdmVuZG9yIHNwZWNpZmljIGNvbW1hbmRzICovCi0gIHVpbnQ4X3QgZmxhZ3M7IC8qIFNlZSBBVlJDX0NCX0ZMQUdTXyogZGVmaW5pdGlvbnMgKi8KLSAgYWxhcm1fdCogdGxlOyAgLyogQ29tbWFuZCB0aW1lb3V0IHRpbWVyICovCi19IHRBVlJDX0NPTk5fSU5UX0NCOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVlJDX0NPTk5fQ0IKLSAgICAgIGNjYltBVkNUX05VTV9DT05OXTsgLyogQ29ubmVjdGlvbiBjb250cm9sIGJsb2NrIGZyb20gQVZSQ19PcGVuIEFQSSAqLwotICB0QVZSQ19DT05OX0lOVF9DQgotICAgICAgY2NiX2ludFtBVkNUX05VTV9DT05OXTsgLyogSW50ZXJuYWwgY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICAqLwotICB0QVZSQ19GUkFHX0NCIGZjYltBVkNUX05VTV9DT05OXTsKLSAgdEFWUkNfUkFTTV9DQiByY2JbQVZDVF9OVU1fQ09OTl07Ci0gIHRBVlJDX0ZJTkRfQ0JBQ0sgZmluZF9jYmFjazsgLyogc2RwIGRpc2NvdmVyeSBjYWxsYmFjayAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYjsgICAvKiBwb2ludGVyIHRvIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQ7ICAgICAvKiBzZXJ2aWNlIFVVSUQgdG8gc2VhcmNoICovCi0gIHVpbnQ4X3QgdHJhY2VfbGV2ZWw7Ci19IHRBVlJDX0NCOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYWluIENvbnRyb2wgQmxvY2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEFWUkNfQ0IgYXZyY19jYjsKLQotZXh0ZXJuIGJvb2wgYXZyY19pc192YWxpZF9wZHVfaWQodWludDhfdCBwZHVfaWQpOwotZXh0ZXJuIGJvb2wgYXZyY19pc192YWxpZF9wbGF5ZXJfYXR0cmliX3ZhbHVlKHVpbnQ4X3QgYXR0cmliLCB1aW50OF90IHZhbHVlKTsKLWV4dGVybiBCVF9IRFIqIGF2cmNfYWxsb2NfY3RybF9wa3QodWludDhfdCBwZHUpOwotZXh0ZXJuIHRBVlJDX1NUUyBhdnJjX3BhcnNfcGFzc190aHJ1KHRBVlJDX01TR19QQVNTKiBwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF92ZW5kb3JfdW5pcXVlX2lkKTsKLWV4dGVybiB1aW50OF90IGF2cmNfb3Bjb2RlX2Zyb21fcGR1KHVpbnQ4X3QgcGR1KTsKLWV4dGVybiBib29sIGF2cmNfaXNfdmFsaWRfb3Bjb2RlKHVpbnQ4X3Qgb3Bjb2RlKTsKLWV4dGVybiB2b2lkIGF2cmNfZmx1c2hfY21kX3EodWludDhfdCBoYW5kbGUpOwotdm9pZCBhdnJjX3N0YXJ0X2NtZF90aW1lcih1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgdWludDhfdCBtc2dfbWFzayk7Ci12b2lkIGF2cmNfc2VuZF9uZXh0X3ZlbmRvcl9jbWQodWludDhfdCBoYW5kbGUpOwotCi0jZW5kaWYgLyogQVZSQ19JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svYXZyYy9hdnJjX29wdC5jYyBiL3N0YWNrL2F2cmMvYXZyY19vcHQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTFlM2YuLjAwMDAwMDAKLS0tIGEvc3RhY2svYXZyYy9hdnJjX29wdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEludGVyZmFjZSB0byBBVlJDUCBvcHRpb25hbCBjb21tYW5kcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdnJjX2FwaS5oIgotI2luY2x1ZGUgImF2cmNfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY192ZW5kb3JfbXNnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb21wb3NlIGEgVkVORE9SIERFUEVOREVOVCBjb21tYW5kIGFjY29yZGluZyB0byBwX21zZwotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFZFTkRPUiBERVBFTkRFTlQgbWVzc2FnZSBzdHJ1Y3R1cmUuCi0gKgotICogICAgICAgICAgICAgICAgICBPdXRwdXQgUGFyYW1ldGVyczoKLSogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gYSB2YWxpZCBHS0kgYnVmZmVyIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIE5VTEwgaWYgcF9tc2cgaXMgTlVMTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdnJjX3ZlbmRvcl9tc2codEFWUkNfTVNHX1ZFTkRPUiogcF9tc2cpIHsKLSAgQlRfSERSKiBwX2NtZDsKLSAgdWludDhfdCogcF9kYXRhOwotCi0gIENIRUNLKHBfbXNnICE9IE5VTEwpOwotCi0gIENIRUNLKEFWUkNfTUVUQV9DTURfQlVGX1NJWkUgPiAoQVZSQ19NSU5fQ01EX0xFTiArIHBfbXNnLT52ZW5kb3JfbGVuKSk7Ci0gIHBfY21kID0gKEJUX0hEUiopb3NpX2NhbGxvYyhBVlJDX01FVEFfQ01EX0JVRl9TSVpFKTsKLQotICBwX2NtZC0+b2Zmc2V0ID0gQVZDVF9NU0dfT0ZGU0VUOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfY21kICsgMSkgKyBwX2NtZC0+b2Zmc2V0OwotICAqcF9kYXRhKysgPSAocF9tc2ctPmhkci5jdHlwZSAmIEFWUkNfQ1RZUEVfTUFTSyk7Ci0gICpwX2RhdGErKyA9Ci0gICAgICAocF9tc2ctPmhkci5zdWJ1bml0X3R5cGUgPDwgQVZSQ19TVUJUWVBFX1NISUZUKSB8IHBfbXNnLT5oZHIuc3VidW5pdF9pZDsKLSAgKnBfZGF0YSsrID0gQVZSQ19PUF9WRU5ET1I7Ci0gIEFWUkNfQ09fSURfVE9fQkVfU1RSRUFNKHBfZGF0YSwgcF9tc2ctPmNvbXBhbnlfaWQpOwotICBpZiAocF9tc2ctPnZlbmRvcl9sZW4gJiYgcF9tc2ctPnBfdmVuZG9yX2RhdGEpCi0gICAgbWVtY3B5KHBfZGF0YSwgcF9tc2ctPnBfdmVuZG9yX2RhdGEsIHBfbXNnLT52ZW5kb3JfbGVuKTsKLSAgcF9jbWQtPmxlbiA9ICh1aW50MTZfdCkocF9kYXRhICsgcF9tc2ctPnZlbmRvcl9sZW4gLSAodWludDhfdCopKHBfY21kICsgMSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NtZC0+b2Zmc2V0KTsKLSAgcF9jbWQtPmxheWVyX3NwZWNpZmljID0gQVZDVF9EQVRBX0NUUkw7Ci0KLSAgcmV0dXJuIHBfY21kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1VuaXRDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBVTklUIElORk8gY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQkFEX0hBTkRMRSBpZiBoYW5kbGUgaXMgaW52YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVlJDX1VuaXRDbWQodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwpIHsKLSAgQlRfSERSKiBwX2NtZCA9IChCVF9IRFIqKW9zaV9jYWxsb2MoQVZSQ19DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwX2RhdGE7Ci0KLSAgcF9jbWQtPm9mZnNldCA9IEFWQ1RfTVNHX09GRlNFVDsKLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2NtZCArIDEpICsgcF9jbWQtPm9mZnNldDsKLSAgKnBfZGF0YSsrID0gQVZSQ19DTURfU1RBVFVTOwotICAvKiB1bml0ICYgaWQgaWdub3JlICovCi0gICpwX2RhdGErKyA9IChBVlJDX1NVQl9VTklUIDw8IEFWUkNfU1VCVFlQRV9TSElGVCkgfCBBVlJDX1NVQklEX0lHTk9SRTsKLSAgKnBfZGF0YSsrID0gQVZSQ19PUF9VTklUX0lORk87Ci0gIG1lbXNldChwX2RhdGEsIEFWUkNfQ01EX09QUk5EX1BBRCwgQVZSQ19VTklUX09QUk5EX0JZVEVTKTsKLSAgcF9jbWQtPmxlbiA9Ci0gICAgICBwX2RhdGEgKyBBVlJDX1VOSVRfT1BSTkRfQllURVMgLSAodWludDhfdCopKHBfY21kICsgMSkgLSBwX2NtZC0+b2Zmc2V0OwotICBwX2NtZC0+bGF5ZXJfc3BlY2lmaWMgPSBBVkNUX0RBVEFfQ1RSTDsKLQotICByZXR1cm4gQVZDVF9Nc2dSZXEoaGFuZGxlLCBsYWJlbCwgQVZDVF9DTUQsIHBfY21kKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19TdWJDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBTVUJVTklUIElORk8gY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IFNwZWNpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBzdWJ1bml0IHR5cGUgdGFibGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGlzIHJlcXVlc3RlZC4gIEZvciBBVlJDUCBpdCBpcyB0eXBpY2FsbHkgemVyby4KLSAqICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHJhbmdlIGlzIDAtNy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19TdWJDbWQodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgcGFnZSkgewotICBCVF9IRFIqIHBfY21kID0gKEJUX0hEUiopb3NpX2NhbGxvYyhBVlJDX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLQotICBwX2NtZC0+b2Zmc2V0ID0gQVZDVF9NU0dfT0ZGU0VUOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfY21kICsgMSkgKyBwX2NtZC0+b2Zmc2V0OwotICAqcF9kYXRhKysgPSBBVlJDX0NNRF9TVEFUVVM7Ci0gIC8qIHVuaXQgJiBpZCBpZ25vcmUgKi8KLSAgKnBfZGF0YSsrID0gKEFWUkNfU1VCX1VOSVQgPDwgQVZSQ19TVUJUWVBFX1NISUZUKSB8IEFWUkNfU1VCSURfSUdOT1JFOwotICAqcF9kYXRhKysgPSBBVlJDX09QX1NVQl9JTkZPOwotICAqcF9kYXRhKysgPQotICAgICAgKChwYWdlICYgQVZSQ19TVUJfUEFHRV9NQVNLKSA8PCBBVlJDX1NVQl9QQUdFX1NISUZUKSB8IEFWUkNfU1VCX0VYVF9DT0RFOwotICBtZW1zZXQocF9kYXRhLCBBVlJDX0NNRF9PUFJORF9QQUQsIEFWUkNfU1VCX09QUk5EX0JZVEVTKTsKLSAgcF9jbWQtPmxlbiA9Ci0gICAgICBwX2RhdGEgKyBBVlJDX1NVQl9PUFJORF9CWVRFUyAtICh1aW50OF90KikocF9jbWQgKyAxKSAtIHBfY21kLT5vZmZzZXQ7Ci0gIHBfY21kLT5sYXllcl9zcGVjaWZpYyA9IEFWQ1RfREFUQV9DVFJMOwotCi0gIHJldHVybiBBVkNUX01zZ1JlcShoYW5kbGUsIGxhYmVsLCBBVkNUX0NNRCwgcF9jbWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1ZlbmRvckNtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIFZFTkRPUiBERVBFTkRFTlQgY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFZFTkRPUiBERVBFTkRFTlQgbWVzc2FnZSBzdHJ1Y3R1cmUuCi0gKgotICogICAgICAgICAgICAgICAgICBPdXRwdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19CQURfSEFORExFIGlmIGhhbmRsZSBpcyBpbnZhbGlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWUkNfVmVuZG9yQ21kKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTVNHX1ZFTkRPUiogcF9tc2cpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IGF2cmNfdmVuZG9yX21zZyhwX21zZyk7Ci0gIGlmIChwX2J1ZikKLSAgICByZXR1cm4gQVZDVF9Nc2dSZXEoaGFuZGxlLCBsYWJlbCwgQVZDVF9DTUQsIHBfYnVmKTsKLSAgZWxzZQotICAgIHJldHVybiBBVkNUX05PX1JFU09VUkNFUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19WZW5kb3JSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBWRU5ET1IgREVQRU5ERU5UIHJlc3BvbnNlIHRvIHRoZSBwZWVyIGRldmljZS4gIFRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGZvciB0YXJnZXQgcm9sZSBjb25uZWN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIGEgVkVORE9SIERFUEVOREVOVAotICogICAgICAgICAgICAgICAgICBjb21tYW5kIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlciB0aHJvdWdoIHRoZQotICogICAgICAgICAgICAgICAgICB0QVZSQ19NU0dfQ0JBQ0sgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiBIYW5kbGUgb2YgdGhpcyBjb25uZWN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBUcmFuc2FjdGlvbiBsYWJlbC4gIE11c3QgYmUgdGhlIHNhbWUgdmFsdWUgYXMKLSAqICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB3aXRoIHRoZSBjb21tYW5kIG1lc3NhZ2UgaW4gdGhlIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX21zZzogUG9pbnRlciB0byBWRU5ET1IgREVQRU5ERU5UIG1lc3NhZ2Ugc3RydWN0dXJlLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQkFEX0hBTkRMRSBpZiBoYW5kbGUgaXMgaW52YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVlJDX1ZlbmRvclJzcCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX01TR19WRU5ET1IqIHBfbXNnKSB7Ci0gIEJUX0hEUiogcF9idWYgPSBhdnJjX3ZlbmRvcl9tc2cocF9tc2cpOwotICBpZiAocF9idWYpCi0gICAgcmV0dXJuIEFWQ1RfTXNnUmVxKGhhbmRsZSwgbGFiZWwsIEFWQ1RfUlNQLCBwX2J1Zik7Ci0gIGVsc2UKLSAgICByZXR1cm4gQVZDVF9OT19SRVNPVVJDRVM7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdnJjL2F2cmNfcGFyc19jdC5jYyBiL3N0YWNrL2F2cmMvYXZyY19wYXJzX2N0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOThmNmVlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2cmMvYXZyY19wYXJzX2N0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdnJjX2FwaS5oIgotI2luY2x1ZGUgImF2cmNfZGVmcy5oIgotI2luY2x1ZGUgImF2cmNfaW50LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE1JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19wYXJzX3ZlbmRvcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSB2ZW5kb3Igc3BlY2lmaWMgY29tbWFuZHMgZGVmaW5lZCBieQotICogICAgICAgICAgICAgICAgICBCbHVldG9vdGggU0lHCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCi0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUgZGVmaW5lZCBieSBBVlJDUCAxLjQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX3BhcnNfdmVuZG9yX3JzcCh0QVZSQ19NU0dfVkVORE9SKiBwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfUkVTUE9OU0UqIHBfcmVzdWx0KSB7Ci0gIHRBVlJDX1NUUyBzdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgdWludDhfdCogcDsKLSAgdWludDE2X3QgbGVuOwotI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCi0gIHVpbnQ4X3QgZXZlbnRpZCA9IDA7Ci0jZW5kaWYKLQotICAvKiBDaGVjayB0aGUgdmVuZG9yIGRhdGEgKi8KLSAgaWYgKHBfbXNnLT52ZW5kb3JfbGVuID09IDApIHJldHVybiBBVlJDX1NUU19OT19FUlJPUjsKLSAgaWYgKHBfbXNnLT5wX3ZlbmRvcl9kYXRhID09IE5VTEwpIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0KLSAgaWYgKHBfbXNnLT52ZW5kb3JfbGVuIDwgNCkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwNTMxIik7Ci0gICAgQVZSQ19UUkFDRV9XQVJOSU5HKCIlczogbWVzc2FnZSBsZW5ndGggJWQgdG9vIHNob3J0OiBtdXN0IGJlIGF0IGxlYXN0IDQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9tc2ctPnZlbmRvcl9sZW4pOwotICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gIH0KLSAgcCA9IHBfbXNnLT5wX3ZlbmRvcl9kYXRhOwotICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPnBkdSwgcCk7Ci0gIHArKzsgLyogc2tpcCB0aGUgcmVzZXJ2ZWQvcGFja2VfdHlwZSBieXRlICovCi0gIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwKTsKLSAgQVZSQ19UUkFDRV9ERUJVRygiJXMgY3R5cGU6MHgleCBwZHU6MHgleCwgbGVuOiVkLzB4JXggdmVuZG9yX2xlbj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9tc2ctPmhkci5jdHlwZSwgcF9yZXN1bHQtPnBkdSwgbGVuLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgcF9tc2ctPnZlbmRvcl9sZW4pOwotICBpZiAocF9tc2ctPnZlbmRvcl9sZW4gPCBsZW4gKyA0KSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE0NTA1MzEiKTsKLSAgICBBVlJDX1RSQUNFX1dBUk5JTkcoIiVzOiBtZXNzYWdlIGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9tc2ctPnZlbmRvcl9sZW4sIGxlbiArIDQpOwotICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gIH0KLQotICBpZiAocF9tc2ctPmhkci5jdHlwZSA9PSBBVlJDX1JTUF9SRUopIHsKLSAgICBpZiAobGVuIDwgMSkgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE0NTA1MzEiKTsKLSAgICAgIEFWUkNfVFJBQ0VfV0FSTklORygiJXM6IGludmFsaWQgcGFyYW1ldGVyIGxlbmd0aCAlZDogbXVzdCBiZSBhdCBsZWFzdCAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVuKTsKLSAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgfQotICAgIHBfcmVzdWx0LT5yc3Auc3RhdHVzID0gKnA7Ci0gICAgcmV0dXJuIHBfcmVzdWx0LT5yc3Auc3RhdHVzOwotICB9Ci0KLSAgc3dpdGNoIChwX3Jlc3VsdC0+cGR1KSB7Ci0vKiBjYXNlIEFWUkNfUERVX1JFUVVFU1RfQ09OVElOVUFUSU9OX1JTUDogMHg0MCAqLwotLyogY2FzZSBBVlJDX1BEVV9BQk9SVF9DT05USU5VQVRJT05fUlNQOiAgIDB4NDEgKi8KLQotI2lmIChBVlJDX0FEVl9DVFJMX0lOQ0xVREVEID09IFRSVUUpCi0gICAgY2FzZSBBVlJDX1BEVV9TRVRfQUJTT0xVVEVfVk9MVU1FOiAvKiAweDUwICovCi0gICAgICBpZiAobGVuICE9IDEpCi0gICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIGVsc2UgewotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPnZvbHVtZS52b2x1bWUsIHApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogKEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkgKi8KLQotICAgIGNhc2UgQVZSQ19QRFVfUkVHSVNURVJfTk9USUZJQ0FUSU9OOiAvKiAweDMxICovCi0jaWYgKEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkKLSAgICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwNTMxIik7Ci0gICAgICAgIEFWUkNfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICIlczogaW52YWxpZCBwYXJhbWV0ZXIgbGVuZ3RoICVkOiBtdXN0IGJlIGF0IGxlYXN0IDEiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgIGxlbik7Ci0gICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICB9Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoZXZlbnRpZCwgcCk7Ci0gICAgICBpZiAoQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSA9PSBldmVudGlkICYmCi0gICAgICAgICAgKEFWUkNfUlNQX0NIQU5HRUQgPT0gcF9tc2ctPmhkci5jdHlwZSB8fAotICAgICAgICAgICBBVlJDX1JTUF9JTlRFUklNID09IHBfbXNnLT5oZHIuY3R5cGUgfHwKLSAgICAgICAgICAgQVZSQ19SU1BfUkVKID09IHBfbXNnLT5oZHIuY3R5cGUgfHwKLSAgICAgICAgICAgQVZSQ19SU1BfTk9UX0lNUEwgPT0gcF9tc2ctPmhkci5jdHlwZSkpIHsKLSAgICAgICAgaWYgKGxlbiA8IDIpIHsKLSAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTQ1MDUzMSIpOwotICAgICAgICAgIEFWUkNfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIiVzOiBpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGggJWQ6IG11c3QgYmUgYXQgbGVhc3QgMiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICBsZW4pOwotICAgICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICAgIH0KLSAgICAgICAgcF9yZXN1bHQtPnJlZ19ub3RpZi5zdGF0dXMgPSBwX21zZy0+aGRyLmN0eXBlOwotICAgICAgICBwX3Jlc3VsdC0+cmVnX25vdGlmLmV2ZW50X2lkID0gZXZlbnRpZDsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5yZWdfbm90aWYucGFyYW0udm9sdW1lLCBwKTsKLSAgICAgIH0KLSAgICAgIEFWUkNfVFJBQ0VfREVCVUcoIiVzIFBEVSByZWcgbm90aWYgcmVzcG9uc2U6ZXZlbnQgJXgsIHZvbHVtZSAleCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBldmVudGlkLCBwX3Jlc3VsdC0+cmVnX25vdGlmLnBhcmFtLnZvbHVtZSk7Ci0jZW5kaWYgLyogKEFWUkNfQURWX0NUUkxfSU5DTFVERUQgPT0gVFJVRSkgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfQ01EOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi10QVZSQ19TVFMgYXZyY19wYXJzZV9ub3RpZmljYXRpb25fcnNwKHVpbnQ4X3QqIHBfc3RyZWFtLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1JFR19OT1RJRl9SU1AqIHBfcnNwKSB7Ci0gIHVpbnQxNl90IG1pbl9sZW4gPSAxOwotCi0gIGlmIChsZW4gPCBtaW5fbGVuKSBnb3RvIGxlbmd0aF9lcnJvcjsKLSAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcnNwLT5ldmVudF9pZCwgcF9zdHJlYW0pOwotICBzd2l0Y2ggKHBfcnNwLT5ldmVudF9pZCkgewotICAgIGNhc2UgQVZSQ19FVlRfUExBWV9TVEFUVVNfQ0hBTkdFOgotICAgICAgbWluX2xlbiArPSAxOwotICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcnNwLT5wYXJhbS5wbGF5X3N0YXR1cywgcF9zdHJlYW0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfRVZUX1RSQUNLX0NIQU5HRToKLSAgICAgIG1pbl9sZW4gKz0gODsKLSAgICAgIGlmIChsZW4gPCBtaW5fbGVuKSBnb3RvIGxlbmd0aF9lcnJvcjsKLSAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwX3N0cmVhbSwgcF9yc3AtPnBhcmFtLnRyYWNrLCA4KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9BUFBfU0VUVElOR19DSEFOR0U6Ci0gICAgICBtaW5fbGVuICs9IDE7Ci0gICAgICBpZiAobGVuIDwgbWluX2xlbikgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLm51bV9hdHRyLCBwX3N0cmVhbSk7Ci0gICAgICBpZiAocF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLm51bV9hdHRyID4gQVZSQ19NQVhfQVBQX1NFVFRJTkdTKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzM3ODIwODIiKTsKLSAgICAgICAgcF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLm51bV9hdHRyID0gQVZSQ19NQVhfQVBQX1NFVFRJTkdTOwotICAgICAgfQotICAgICAgbWluX2xlbiArPSBwX3JzcC0+cGFyYW0ucGxheWVyX3NldHRpbmcubnVtX2F0dHIgKiAyOwotICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBfcnNwLT5wYXJhbS5wbGF5ZXJfc2V0dGluZy5udW1fYXR0cjsKLSAgICAgICAgICAgaW5kZXgrKykgewotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLmF0dHJfaWRbaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0pOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yc3AtPnBhcmFtLnBsYXllcl9zZXR0aW5nLmF0dHJfdmFsdWVbaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfRVZUX05PV19QTEFZSU5HX0NIQU5HRToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9BVkFMX1BMQVlFUlNfQ0hBTkdFOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfRVZUX0FERFJfUExBWUVSX0NIQU5HRToKLSAgICAgIG1pbl9sZW4gKz0gNDsKLSAgICAgIGlmIChsZW4gPCBtaW5fbGVuKSBnb3RvIGxlbmd0aF9lcnJvcjsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9yc3AtPnBhcmFtLmFkZHJfcGxheWVyLnBsYXllcl9pZCwgcF9zdHJlYW0pOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX3JzcC0+cGFyYW0uYWRkcl9wbGF5ZXIudWlkX2NvdW50ZXIsIHBfc3RyZWFtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9QTEFZX1BPU19DSEFOR0VEOgotICAgICAgbWluX2xlbiArPSA0OwotICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihwX3JzcC0+cGFyYW0ucGxheV9wb3MsIHBfc3RyZWFtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9VSURTX0NIQU5HRToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX0VWVF9UUkFDS19SRUFDSEVEX0VORDoKLSAgICBjYXNlIEFWUkNfRVZUX1RSQUNLX1JFQUNIRURfU1RBUlQ6Ci0gICAgY2FzZSBBVlJDX0VWVF9CQVRURVJZX1NUQVRVU19DSEFOR0U6Ci0gICAgY2FzZSBBVlJDX0VWVF9TWVNURU1fU1RBVFVTX0NIQU5HRToKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci0KLWxlbmd0aF9lcnJvcjoKLSAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE0NTA0MTciKTsKLSAgQVZSQ19UUkFDRV9XQVJOSU5HKCIlczogaW52YWxpZCBwYXJhbWV0ZXIgbGVuZ3RoICVkOiBtdXN0IGJlIGF0IGxlYXN0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsZW4sIG1pbl9sZW4pOwotICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotfQotCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfcGFyc19icm93c2VfcnNwKHRBVlJDX01TR19CUk9XU0UqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19SRVNQT05TRSogcF9yc3ApIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICB1aW50OF90IHBkdTsKLQotICBpZiAocF9tc2ctPmJyb3dzZV9sZW4gPT0gMCkgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIGxlbmd0aCAiLCBwX21zZy0+YnJvd3NlX2xlbik7Ci0gICAgcmV0dXJuIEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgfQotCi0gIHVpbnQ4X3QqIHAgPSBwX21zZy0+cF9icm93c2VfZGF0YTsKLQotICAvKiByZWFkIHRoZSBwZHUgKi8KLSAgaWYgKHBfbXNnLT5icm93c2VfbGVuIDwgMykgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUxMDY2Iik7Ci0gICAgQVZSQ19UUkFDRV9XQVJOSU5HKCIlczogbWVzc2FnZSBsZW5ndGggJWQgdG9vIHNob3J0OiBtdXN0IGJlIGF0IGxlYXN0IDMiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9tc2ctPmJyb3dzZV9sZW4pOwotICAgIHJldHVybiBBVlJDX1NUU19CQURfUEFSQU07Ci0gIH0KLSAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBkdSwgcCk7Ci0gIHVpbnQxNl90IHBrdF9sZW47Ci0gIGludCBtaW5fbGVuID0gMDsKLSAgLyogcmVhZCB0aGUgZW50aXJlIHBhY2tldCBsZW4gKi8KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihwa3RfbGVuLCBwKTsKLQotICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBwZHU6JWQsIHBrdF9sZW46JWQiLCBfX2Z1bmNfXywgcGR1LCBwa3RfbGVuKTsKLQotICBpZiAocF9tc2ctPmJyb3dzZV9sZW4gPCAocGt0X2xlbiArIDMpKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE0NTEwNjYiKTsKLSAgICBBVlJDX1RSQUNFX1dBUk5JTkcoIiVzOiBtZXNzYWdlIGxlbmd0aCAlZCB0b28gc2hvcnQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9tc2ctPmJyb3dzZV9sZW4sIHBrdF9sZW4gKyAzKTsKLSAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICB9Ci0KLSAgc3dpdGNoIChwZHUpIHsKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVM6IHsKLSAgICAgIHRBVlJDX0dFVF9JVEVNU19SU1AqIGdldF9pdGVtX3JzcCA9ICYocF9yc3AtPmdldF9pdGVtcyk7Ci0gICAgICAvKiBDb3B5IGJhY2sgdGhlIFBEVSAqLwotICAgICAgZ2V0X2l0ZW1fcnNwLT5wZHUgPSBwZHU7Ci0KLSAgICAgIG1pbl9sZW4gKz0gMTsKLSAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgLyogcmVhZCB0aGUgc3RhdHVzICovCi0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoZ2V0X2l0ZW1fcnNwLT5zdGF0dXMsIHApOwotICAgICAgaWYgKGdldF9pdGVtX3JzcC0+c3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgICAgIEFWUkNfVFJBQ0VfV0FSTklORygiJXMgcmV0dXJuaW5nIGVycm9yICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaXRlbV9yc3AtPnN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBnZXRfaXRlbV9yc3AtPnN0YXR1czsKLSAgICAgIH0KLQotICAgICAgbWluX2xlbiArPSA0OwotICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAvKiByZWFkIHRoZSBVSUQgY291bnRlciAqLwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihnZXRfaXRlbV9yc3AtPnVpZF9jb3VudGVyLCBwKTsKLSAgICAgIC8qIHJlYWQgdGhlIG51bWJlciBvZiBpdGVtcyAqLwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihnZXRfaXRlbV9yc3AtPml0ZW1fY291bnQsIHApOwotCi0gICAgICBBVlJDX1RSQUNFX0RFQlVHKAotICAgICAgICAgICIlcyBwZHUgJWQgc3RhdHVzICVkIHBrdF9sZW4gJWQgdWlkIGNvdW50ZXIgJWQgaXRlbSBjb3VudCAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIGdldF9pdGVtX3JzcC0+cGR1LCBnZXRfaXRlbV9yc3AtPnN0YXR1cywgcGt0X2xlbiwKLSAgICAgICAgICBnZXRfaXRlbV9yc3AtPnVpZF9jb3VudGVyLCBnZXRfaXRlbV9yc3AtPml0ZW1fY291bnQpOwotCi0gICAgICAvKiBnZXQgZWFjaCBvZiB0aGUgaXRlbXMgKi8KLSAgICAgIGdldF9pdGVtX3JzcC0+cF9pdGVtX2xpc3QgPSAodEFWUkNfSVRFTSopb3NpX21hbGxvYygKLSAgICAgICAgICBnZXRfaXRlbV9yc3AtPml0ZW1fY291bnQgKiAoc2l6ZW9mKHRBVlJDX0lURU0pKSk7Ci0gICAgICB0QVZSQ19JVEVNKiBjdXJyX2l0ZW0gPSBnZXRfaXRlbV9yc3AtPnBfaXRlbV9saXN0OwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRfaXRlbV9yc3AtPml0ZW1fY291bnQ7IGkrKykgewotICAgICAgICBtaW5fbGVuICs9IDE7Ci0gICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoY3Vycl9pdGVtLT5pdGVtX3R5cGUsIHApOwotICAgICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBpdGVtIHR5cGUgJWQiLCBfX2Z1bmNfXywgY3Vycl9pdGVtLT5pdGVtX3R5cGUpOwotICAgICAgICBzd2l0Y2ggKGN1cnJfaXRlbS0+aXRlbV90eXBlKSB7Ci0gICAgICAgICAgY2FzZSBBVlJDX0lURU1fUExBWUVSOiB7Ci0gICAgICAgICAgICAvKiBIYW5kbGUgcGxheWVyICovCi0gICAgICAgICAgICB0QVZSQ19JVEVNX1BMQVlFUiogcGxheWVyID0gJihjdXJyX2l0ZW0tPnUucGxheWVyKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgcGxheWVyX2xlbjsKLSAgICAgICAgICAgIG1pbl9sZW4gKz0gMTAgKyBBVlJDX0ZFQVRVUkVfTUFTS19TSVpFOwotICAgICAgICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHBsYXllcl9sZW4sIHApOwotICAgICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwbGF5ZXItPnBsYXllcl9pZCwgcCk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocGxheWVyLT5tYWpvcl90eXBlLCBwKTsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocGxheWVyLT5zdWJfdHlwZSwgcCk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocGxheWVyLT5wbGF5X3N0YXR1cywgcCk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgcGxheWVyLT5mZWF0dXJlcywgQVZSQ19GRUFUVVJFX01BU0tfU0laRSk7Ci0KLSAgICAgICAgICAgIC8qIHJlYWQgc3RyICovCi0gICAgICAgICAgICBtaW5fbGVuICs9IDQ7Ci0gICAgICAgICAgICBpZiAocGt0X2xlbiA8IG1pbl9sZW4pIGdvdG8gYnJvd3NlX2xlbmd0aF9lcnJvcjsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocGxheWVyLT5uYW1lLmNoYXJzZXRfaWQsIHApOwotICAgICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwbGF5ZXItPm5hbWUuc3RyX2xlbiwgcCk7Ci0gICAgICAgICAgICBtaW5fbGVuICs9IHBsYXllci0+bmFtZS5zdHJfbGVuOwotICAgICAgICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAgICAgICBwbGF5ZXItPm5hbWUucF9zdHIgPSAodWludDhfdCopb3NpX2NhbGxvYygKLSAgICAgICAgICAgICAgICAocGxheWVyLT5uYW1lLnN0cl9sZW4gKyAxKSAqIHNpemVvZih1aW50OF90KSk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgcGxheWVyLT5uYW1lLnBfc3RyLCBwbGF5ZXItPm5hbWUuc3RyX2xlbik7Ci0gICAgICAgICAgICBBVlJDX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgICAgICIlcyB0eXBlICVkIGlkICVkIG10eXBlICVkIHN0eXBlICVkIHBzICVkIGNzICVkIG5hbWUgbGVuICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY3Vycl9pdGVtLT5pdGVtX3R5cGUsIHBsYXllci0+cGxheWVyX2lkLAotICAgICAgICAgICAgICAgIHBsYXllci0+bWFqb3JfdHlwZSwgcGxheWVyLT5zdWJfdHlwZSwgcGxheWVyLT5wbGF5X3N0YXR1cywKLSAgICAgICAgICAgICAgICBwbGF5ZXItPm5hbWUuY2hhcnNldF9pZCwgcGxheWVyLT5uYW1lLnN0cl9sZW4pOwotICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEFWUkNfSVRFTV9GT0xERVI6IHsKLSAgICAgICAgICAgIHRBVlJDX0lURU1fRk9MREVSKiBmb2xkZXIgPSAmKGN1cnJfaXRlbS0+dS5mb2xkZXIpOwotICAgICAgICAgICAgdWludDE2X3QgZm9sZGVyX2xlbjsKLSAgICAgICAgICAgIG1pbl9sZW4gKz0gNCArIEFWUkNfVUlEX1NJWkU7Ci0gICAgICAgICAgICBpZiAocGt0X2xlbiA8IG1pbl9sZW4pIGdvdG8gYnJvd3NlX2xlbmd0aF9lcnJvcjsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoZm9sZGVyX2xlbiwgcCk7Ci0KLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwLCBmb2xkZXItPnVpZCwgQVZSQ19VSURfU0laRSk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoZm9sZGVyLT50eXBlLCBwKTsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChmb2xkZXItPnBsYXlhYmxlLCBwKTsKLQotICAgICAgICAgICAgLyogcmVhZCBzdHIsIGVuY29kaW5nIHRvIGJlIGhhbmRsZWQgYnkgdXBwZXIgbGF5ZXJzICovCi0gICAgICAgICAgICBtaW5fbGVuICs9IDQ7Ci0gICAgICAgICAgICBpZiAocGt0X2xlbiA8IG1pbl9sZW4pIGdvdG8gYnJvd3NlX2xlbmd0aF9lcnJvcjsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoZm9sZGVyLT5uYW1lLmNoYXJzZXRfaWQsIHApOwotICAgICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihmb2xkZXItPm5hbWUuc3RyX2xlbiwgcCk7Ci0gICAgICAgICAgICBtaW5fbGVuICs9IGZvbGRlci0+bmFtZS5zdHJfbGVuOwotICAgICAgICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAgICAgICBmb2xkZXItPm5hbWUucF9zdHIgPSAodWludDhfdCopb3NpX2NhbGxvYygKLSAgICAgICAgICAgICAgICAoZm9sZGVyLT5uYW1lLnN0cl9sZW4gKyAxKSAqIHNpemVvZih1aW50OF90KSk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgZm9sZGVyLT5uYW1lLnBfc3RyLCBmb2xkZXItPm5hbWUuc3RyX2xlbik7Ci0gICAgICAgICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyB0eXBlICVkIHBsYXlhYmxlICVkIGNzICVkIG5hbWUgbGVuICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGZvbGRlci0+dHlwZSwgZm9sZGVyLT5wbGF5YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyLT5uYW1lLmNoYXJzZXRfaWQsIGZvbGRlci0+bmFtZS5zdHJfbGVuKTsKLSAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBBVlJDX0lURU1fTUVESUE6IHsKLSAgICAgICAgICAgIHRBVlJDX0lURU1fTUVESUEqIG1lZGlhID0gJihjdXJyX2l0ZW0tPnUubWVkaWEpOwotICAgICAgICAgICAgdWludDhfdCBtZWRpYV9sZW47Ci0gICAgICAgICAgICBtaW5fbGVuICs9IDMgKyBBVlJDX1VJRF9TSVpFOwotICAgICAgICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KG1lZGlhX2xlbiwgcCk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgbWVkaWEtPnVpZCwgQVZSQ19VSURfU0laRSk7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgobWVkaWEtPnR5cGUsIHApOwotCi0gICAgICAgICAgICAvKiByZWFkIHN0ciwgZW5jb2RpbmcgdG8gYmUgaGFuZGxlZCBieSB1cHBlciBsYXllcnMgKi8KLSAgICAgICAgICAgIG1pbl9sZW4gKz0gNDsKLSAgICAgICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihtZWRpYS0+bmFtZS5jaGFyc2V0X2lkLCBwKTsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYobWVkaWEtPm5hbWUuc3RyX2xlbiwgcCk7Ci0gICAgICAgICAgICBtaW5fbGVuICs9IDEgKyBtZWRpYS0+bmFtZS5zdHJfbGVuOwotICAgICAgICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAgICAgICBtZWRpYS0+bmFtZS5wX3N0ciA9Ci0gICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW9zaV9tYWxsb2MoKG1lZGlhLT5uYW1lLnN0cl9sZW4pICogc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwLCBtZWRpYS0+bmFtZS5wX3N0ciwgbWVkaWEtPm5hbWUuc3RyX2xlbik7Ci0KLSAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChtZWRpYS0+YXR0cl9jb3VudCwgcCk7Ci0gICAgICAgICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBtZWRpYSB0eXBlICVkIGNoYXJzZXQgaWQgJWQgbGVuICVkIGF0dHIgY3QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbWVkaWEtPnR5cGUsIG1lZGlhLT5uYW1lLmNoYXJzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhLT5uYW1lLnN0cl9sZW4sIG1lZGlhLT5hdHRyX2NvdW50KTsKLQotICAgICAgICAgICAgbWVkaWEtPnBfYXR0cl9saXN0ID0gKHRBVlJDX0FUVFJfRU5UUlkqKW9zaV9tYWxsb2MoCi0gICAgICAgICAgICAgICAgbWVkaWEtPmF0dHJfY291bnQgKiBzaXplb2YodEFWUkNfQVRUUl9FTlRSWSkpOwotICAgICAgICAgICAgZm9yIChpbnQgamsgPSAwOyBqayA8IG1lZGlhLT5hdHRyX2NvdW50OyBqaysrKSB7Ci0gICAgICAgICAgICAgIHRBVlJDX0FUVFJfRU5UUlkqIGF0dHJfZW50cnkgPSAmKG1lZGlhLT5wX2F0dHJfbGlzdFtqa10pOwotICAgICAgICAgICAgICBtaW5fbGVuICs9IDg7Ci0gICAgICAgICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKGF0dHJfZW50cnktPmF0dHJfaWQsIHApOwotCi0gICAgICAgICAgICAgIC8qIFBhcnNlIHRoZSBuYW1lIG5vdyAqLwotICAgICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGF0dHJfZW50cnktPm5hbWUuY2hhcnNldF9pZCwgcCk7Ci0gICAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoYXR0cl9lbnRyeS0+bmFtZS5zdHJfbGVuLCBwKTsKLSAgICAgICAgICAgICAgbWluX2xlbiArPSBhdHRyX2VudHJ5LT5uYW1lLnN0cl9sZW47Ci0gICAgICAgICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICAgICAgICBhdHRyX2VudHJ5LT5uYW1lLnBfc3RyID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MoCi0gICAgICAgICAgICAgICAgICBhdHRyX2VudHJ5LT5uYW1lLnN0cl9sZW4gKiBzaXplb2YodWludDhfdCkpOwotICAgICAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgYXR0cl9lbnRyeS0+bmFtZS5wX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfZW50cnktPm5hbWUuc3RyX2xlbik7Ci0gICAgICAgICAgICAgIEFWUkNfVFJBQ0VfREVCVUcoIiVzIG1lZGlhIGF0dHIgaWQgJWQgY3MgJWQgbmFtZSBsZW4gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhdHRyX2VudHJ5LT5hdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfZW50cnktPm5hbWUuY2hhcnNldF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX2VudHJ5LT5uYW1lLnN0cl9sZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgaXRlbSB0eXBlIG5vdCBoYW5kbGVkICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJfaXRlbS0+aXRlbV90eXBlKTsKLSAgICAgICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICAgIH0KLQotICAgICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBwa3RfbGVuICVkIG1pbl9sZW4gJWQiLCBfX2Z1bmNfXywgcGt0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbGVuKTsKLQotICAgICAgICAvKiBhZHZhbmNlIHRvIHBvcHVsYXRlIHRoZSBuZXh0IGl0ZW0gKi8KLSAgICAgICAgY3Vycl9pdGVtKys7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEFWUkNfUERVX0NIQU5HRV9QQVRIOiB7Ci0gICAgICB0QVZSQ19DSEdfUEFUSF9SU1AqIGNoYW5nZV9wYXRoX3JzcCA9ICYocF9yc3AtPmNoZ19wYXRoKTsKLSAgICAgIG1pbl9sZW4gKz0gNTsKLSAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgLyogQ29weWJhY2sgdGhlIFBEVSAqLwotICAgICAgY2hhbmdlX3BhdGhfcnNwLT5wZHUgPSBwZHU7Ci0gICAgICAvKiBSZWFkIHRoZSBzdGF0dXMgKi8KLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChjaGFuZ2VfcGF0aF9yc3AtPnN0YXR1cywgcCk7Ci0gICAgICAvKiBSZWFkIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gZm9sZGVyICovCi0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKGNoYW5nZV9wYXRoX3JzcC0+bnVtX2l0ZW1zLCBwKTsKLQotICAgICAgQVZSQ19UUkFDRV9ERUJVRygiJXMgcGR1ICVkIHN0YXR1cyAlZCBpdGVtIGNvdW50ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZV9wYXRoX3JzcC0+cGR1LCBjaGFuZ2VfcGF0aF9yc3AtPnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlX3BhdGhfcnNwLT5udW1faXRlbXMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfSVRFTV9BVFRSSUJVVEVTOiB7Ci0gICAgICB0QVZSQ19HRVRfQVRUUlNfUlNQKiBnZXRfYXR0cl9yc3AgPSAmKHBfcnNwLT5nZXRfYXR0cnMpOwotICAgICAgZ2V0X2F0dHJfcnNwLT5wZHUgPSBwZHU7Ci0gICAgICBtaW5fbGVuICs9IDI7Ci0gICAgICBpZiAocGt0X2xlbiA8IG1pbl9sZW4pIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNzkxNjI2NjUiKTsKLSAgICAgICAgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgfQotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KGdldF9hdHRyX3JzcC0+c3RhdHVzLCBwKQotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KGdldF9hdHRyX3JzcC0+bnVtX2F0dHJzLCBwKTsKLSAgICAgIGdldF9hdHRyX3JzcC0+cF9hdHRycyA9ICh0QVZSQ19BVFRSX0VOVFJZKilvc2lfbWFsbG9jKAotICAgICAgICAgIGdldF9hdHRyX3JzcC0+bnVtX2F0dHJzICogc2l6ZW9mKHRBVlJDX0FUVFJfRU5UUlkpKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0X2F0dHJfcnNwLT5udW1fYXR0cnM7IGkrKykgewotICAgICAgICB0QVZSQ19BVFRSX0VOVFJZKiBhdHRyX2VudHJ5ID0gJihnZXRfYXR0cl9yc3AtPnBfYXR0cnNbaV0pOwotICAgICAgICBtaW5fbGVuICs9IDg7Ci0gICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKGF0dHJfZW50cnktPmF0dHJfaWQsIHApOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGF0dHJfZW50cnktPm5hbWUuY2hhcnNldF9pZCwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoYXR0cl9lbnRyeS0+bmFtZS5zdHJfbGVuLCBwKTsKLSAgICAgICAgbWluX2xlbiArPSBhdHRyX2VudHJ5LT5uYW1lLnN0cl9sZW47Ci0gICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICBhdHRyX2VudHJ5LT5uYW1lLnBfc3RyID0KLSAgICAgICAgICAgICh1aW50OF90Kilvc2lfbWFsbG9jKGF0dHJfZW50cnktPm5hbWUuc3RyX2xlbiAqIHNpemVvZih1aW50OF90KSk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwLCBhdHRyX2VudHJ5LT5uYW1lLnBfc3RyLCBhdHRyX2VudHJ5LT5uYW1lLnN0cl9sZW4pOwotICAgICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBtZWRpYSBhdHRyIGlkICVkIGNzICVkIG5hbWUgbGVuICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9lbnRyeS0+YXR0cl9pZCwgYXR0cl9lbnRyeS0+bmFtZS5jaGFyc2V0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfZW50cnktPm5hbWUuc3RyX2xlbik7Ci0gICAgICB9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUjogewotICAgICAgdEFWUkNfU0VUX0JSX1BMQVlFUl9SU1AqIHNldF9icl9wbF9yc3AgPSAmKHBfcnNwLT5icl9wbGF5ZXIpOwotICAgICAgLyogQ29weWJhY2sgdGhlIFBEVSAqLwotICAgICAgc2V0X2JyX3BsX3JzcC0+cGR1ID0gcGR1OwotCi0gICAgICAvKiBSZWFkIHRoZSBzdGF0dXMgKi8KLSAgICAgIG1pbl9sZW4gKz0gMTA7Ci0gICAgICBpZiAocGt0X2xlbiA8IG1pbl9sZW4pIGdvdG8gYnJvd3NlX2xlbmd0aF9lcnJvcjsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChzZXRfYnJfcGxfcnNwLT5zdGF0dXMsIHApOwotCi0gICAgICBpZiAoc2V0X2JyX3BsX3JzcC0+c3RhdHVzICE9IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgICAgIEFWUkNfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiJXMgU3RvcHBpbmcgZnVydGhlciBwYXJzaW5nIGJlY2F1c2UgcGxheWVyIG5vdCBicm93c2FibGUgc3RzICVkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBzZXRfYnJfcGxfcnNwLT5zdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoc2V0X2JyX3BsX3JzcC0+dWlkX2NvdW50ZXIsIHApOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihzZXRfYnJfcGxfcnNwLT5udW1faXRlbXMsIHApOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihzZXRfYnJfcGxfcnNwLT5jaGFyc2V0X2lkLCBwKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChzZXRfYnJfcGxfcnNwLT5mb2xkZXJfZGVwdGgsIHApOwotICAgICAgQVZSQ19UUkFDRV9ERUJVRygKLSAgICAgICAgICAiJXMgQVZSQ19QRFVfU0VUX0JST1dTRURfUExBWUVSIHN0YXR1cyAlZCBpdGVtcyAlZCBjcyAlZCBkZXB0aCAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIHNldF9icl9wbF9yc3AtPnN0YXR1cywgc2V0X2JyX3BsX3JzcC0+bnVtX2l0ZW1zLAotICAgICAgICAgIHNldF9icl9wbF9yc3AtPmNoYXJzZXRfaWQsIHNldF9icl9wbF9yc3AtPmZvbGRlcl9kZXB0aCk7Ci0KLSAgICAgIHNldF9icl9wbF9yc3AtPnBfZm9sZGVycyA9ICh0QVZSQ19OQU1FKilvc2lfbWFsbG9jKAotICAgICAgICAgIHNldF9icl9wbF9yc3AtPmZvbGRlcl9kZXB0aCAqIHNpemVvZih0QVZSQ19OQU1FKSk7Ci0KLSAgICAgIC8qIFJlYWQgZWFjaCBvZiB0aGUgZm9sZGVyIGluIHRoZSBkZXB0aCAqLwotICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNldF9icl9wbF9yc3AtPmZvbGRlcl9kZXB0aDsgaSsrKSB7Ci0gICAgICAgIHRBVlJDX05BTUUqIGZvbGRlcl9uYW1lID0gJihzZXRfYnJfcGxfcnNwLT5wX2ZvbGRlcnNbaV0pOwotICAgICAgICBtaW5fbGVuICs9IDI7Ci0gICAgICAgIGlmIChwa3RfbGVuIDwgbWluX2xlbikgZ290byBicm93c2VfbGVuZ3RoX2Vycm9yOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGZvbGRlcl9uYW1lLT5zdHJfbGVuLCBwKTsKLSAgICAgICAgbWluX2xlbiArPSBmb2xkZXJfbmFtZS0+c3RyX2xlbjsKLSAgICAgICAgaWYgKHBrdF9sZW4gPCBtaW5fbGVuKSBnb3RvIGJyb3dzZV9sZW5ndGhfZXJyb3I7Ci0gICAgICAgIEFWUkNfVFJBQ0VfREVCVUcoIiVzIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUiBpdGVtOiAlZCBsZW46ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaSwgZm9sZGVyX25hbWUtPnN0cl9sZW4pOwotICAgICAgICBmb2xkZXJfbmFtZS0+cF9zdHIgPQotICAgICAgICAgICAgKHVpbnQ4X3QqKW9zaV9jYWxsb2MoKGZvbGRlcl9uYW1lLT5zdHJfbGVuICsgMSkgKiBzaXplb2YodWludDhfdCkpOwotICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgZm9sZGVyX25hbWUtPnBfc3RyLCBmb2xkZXJfbmFtZS0+c3RyX2xlbik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgcGR1ICVkIG5vdCBoYW5kbGVkIiwgX19mdW5jX18sIHBkdSk7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotCi1icm93c2VfbGVuZ3RoX2Vycm9yOgotICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTQ1MTA2NiIpOwotICBBVlJDX1RSQUNFX1dBUk5JTkcoIiVzOiBpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGggJWQ6IG11c3QgYmUgYXQgbGVhc3QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBrdF9sZW4sIG1pbl9sZW4pOwotICByZXR1cm4gQVZSQ19TVFNfQkFEX0NNRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfY3RybF9wYXJzX3ZlbmRvcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSB2ZW5kb3Igc3BlY2lmaWMgY29tbWFuZHMgZGVmaW5lZCBieQotICogICAgICAgICAgICAgICAgICBCbHVldG9vdGggU0lHCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCi0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUgZGVmaW5lZCBieSBBVlJDUCAxLjQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRBVlJDX1NUUyBhdnJjX2N0cmxfcGFyc192ZW5kb3JfcnNwKHRBVlJDX01TR19WRU5ET1IqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1JFU1BPTlNFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2J1ZiwgdWludDE2X3QqIGJ1Zl9sZW4pIHsKLSAgaWYgKHBfbXNnLT52ZW5kb3JfbGVuIDwgNCkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwNDE3Iik7Ci0gICAgQVZSQ19UUkFDRV9XQVJOSU5HKCIlczogbWVzc2FnZSBsZW5ndGggJWQgdG9vIHNob3J0OiBtdXN0IGJlIGF0IGxlYXN0IDQiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9tc2ctPnZlbmRvcl9sZW4pOwotICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gIH0KLQotICB1aW50OF90KiBwID0gcF9tc2ctPnBfdmVuZG9yX2RhdGE7Ci0gIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+cGR1LCBwKTsKLSAgcCsrOyAvKiBza2lwIHRoZSByZXNlcnZlZC9wYWNrZV90eXBlIGJ5dGUgKi8KLQotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQxNl90IG1pbl9sZW4gPSAwOwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KGxlbiwgcCk7Ci0gIEFWUkNfVFJBQ0VfREVCVUcoIiVzIGN0eXBlOjB4JXggcGR1OjB4JXgsIGxlbjolZCAgdmVuZG9yX2xlbj0weCV4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9tc2ctPmhkci5jdHlwZSwgcF9yZXN1bHQtPnBkdSwgbGVuLCBwX21zZy0+dmVuZG9yX2xlbik7Ci0gIGlmIChwX21zZy0+dmVuZG9yX2xlbiA8IGxlbiArIDQpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTQ1MDQxNyIpOwotICAgIEFWUkNfVFJBQ0VfV0FSTklORygiJXM6IG1lc3NhZ2UgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX21zZy0+dmVuZG9yX2xlbiwgbGVuICsgNCk7Ci0gICAgcmV0dXJuIEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgfQotICAvKiBUb2RvOiBJc3N1ZSBpbiBoYW5kbGluZyByZWplY3QsIGNoZWNrICovCi0gIGlmIChwX21zZy0+aGRyLmN0eXBlID09IEFWUkNfUlNQX1JFSikgewotICAgIG1pbl9sZW4gKz0gMTsKLSAgICBpZiAobGVuIDwgbWluX2xlbikgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgcF9yZXN1bHQtPnJzcC5zdGF0dXMgPSAqcDsKLSAgICByZXR1cm4gcF9yZXN1bHQtPnJzcC5zdGF0dXM7Ci0gIH0KLQotICAvKiBUT0RPOiBCcmVhayB0aGUgYmlnIHN3aXRjaCBpbnRvIGZ1bmN0aW9ucy4gKi8KLSAgc3dpdGNoIChwX3Jlc3VsdC0+cGR1KSB7Ci0gICAgLyogY2FzZSBBVlJDX1BEVV9SRVFVRVNUX0NPTlRJTlVBVElPTl9SU1A6IDB4NDAgKi8KLSAgICAvKiBjYXNlIEFWUkNfUERVX0FCT1JUX0NPTlRJTlVBVElPTl9SU1A6ICAgMHg0MSAqLwotCi0gICAgY2FzZSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT046Ci0gICAgICByZXR1cm4gYXZyY19wYXJzZV9ub3RpZmljYXRpb25fcnNwKHAsIGxlbiwgJnBfcmVzdWx0LT5yZWdfbm90aWYpOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfQ0FQQUJJTElUSUVTOgotICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfY2Fwcy5jb3VudCA9IDA7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfY2Fwcy5jYXBhYmlsaXR5X2lkID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtaW5fbGVuICs9IDI7Ci0gICAgICBpZiAobGVuIDwgbWluX2xlbikgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9jYXBzLmNhcGFiaWxpdHlfaWQsIHApOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5nZXRfY2Fwcy5jb3VudCwgcCk7Ci0gICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBjYXAgaWQgPSAlZCwgY2FwX2NvdW50ID0gJWQgIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfY2Fwcy5jYXBhYmlsaXR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2NhcHMuY291bnQpOwotICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfY2Fwcy5jYXBhYmlsaXR5X2lkID09IEFWUkNfQ0FQX0NPTVBBTllfSUQpIHsKLSAgICAgICAgbWluX2xlbiArPSBNSU4ocF9yZXN1bHQtPmdldF9jYXBzLmNvdW50LCBBVlJDX0NBUF9NQVhfTlVNX0NPTVBfSUQpICogMzsKLSAgICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgICBmb3IgKGludCB4eCA9IDA7ICgoeHggPCBwX3Jlc3VsdC0+Z2V0X2NhcHMuY291bnQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh4eCA8IEFWUkNfQ0FQX01BWF9OVU1fQ09NUF9JRCkpOwotICAgICAgICAgICAgIHh4KyspIHsKLSAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDI0KHBfcmVzdWx0LT5nZXRfY2Fwcy5wYXJhbS5jb21wYW55X2lkW3h4XSwgcCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9yZXN1bHQtPmdldF9jYXBzLmNhcGFiaWxpdHlfaWQgPT0KLSAgICAgICAgICAgICAgICAgQVZSQ19DQVBfRVZFTlRTX1NVUFBPUlRFRCkgewotICAgICAgICBtaW5fbGVuICs9IE1JTihwX3Jlc3VsdC0+Z2V0X2NhcHMuY291bnQsIEFWUkNfQ0FQX01BWF9OVU1fRVZUX0lEKTsKLSAgICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgICBmb3IgKGludCB4eCA9IDA7ICgoeHggPCBwX3Jlc3VsdC0+Z2V0X2NhcHMuY291bnQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh4eCA8IEFWUkNfQ0FQX01BWF9OVU1fRVZUX0lEKSk7Ci0gICAgICAgICAgICAgeHgrKykgewotICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+Z2V0X2NhcHMucGFyYW0uZXZlbnRfaWRbeHhdLCBwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0xJU1RfUExBWUVSX0FQUF9BVFRSOgotICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5saXN0X2FwcF9hdHRyLm51bV9hdHRyID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtaW5fbGVuICs9IDE7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmxpc3RfYXBwX2F0dHIubnVtX2F0dHIsIHApOwotICAgICAgQVZSQ19UUkFDRV9ERUJVRygiJXMgYXR0ciBjb3VudCA9ICVkICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdC0+bGlzdF9hcHBfYXR0ci5udW1fYXR0cik7Ci0KLSAgICAgIGlmIChwX3Jlc3VsdC0+bGlzdF9hcHBfYXR0ci5udW1fYXR0ciA+IEFWUkNfTUFYX0FQUF9BVFRSX1NJWkUpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2MzE0NjIzNyIpOwotICAgICAgICBwX3Jlc3VsdC0+bGlzdF9hcHBfYXR0ci5udW1fYXR0ciA9IEFWUkNfTUFYX0FQUF9BVFRSX1NJWkU7Ci0gICAgICB9Ci0KLSAgICAgIG1pbl9sZW4gKz0gcF9yZXN1bHQtPmxpc3RfYXBwX2F0dHIubnVtX2F0dHI7Ci0gICAgICBpZiAobGVuIDwgbWluX2xlbikgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICBmb3IgKGludCB4eCA9IDA7IHh4IDwgcF9yZXN1bHQtPmxpc3RfYXBwX2F0dHIubnVtX2F0dHI7IHh4KyspIHsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5saXN0X2FwcF9hdHRyLmF0dHJzW3h4XSwgcCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX1ZBTFVFUzoKLSAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICBwX3Jlc3VsdC0+bGlzdF9hcHBfdmFsdWVzLm51bV92YWwgPSAwOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG1pbl9sZW4gKz0gMTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+bGlzdF9hcHBfdmFsdWVzLm51bV92YWwsIHApOwotICAgICAgaWYgKHBfcmVzdWx0LT5saXN0X2FwcF92YWx1ZXMubnVtX3ZhbCA+IEFWUkNfTUFYX0FQUF9BVFRSX1NJWkUpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3ODUyNjQyMyIpOwotICAgICAgICBwX3Jlc3VsdC0+bGlzdF9hcHBfdmFsdWVzLm51bV92YWwgPSBBVlJDX01BWF9BUFBfQVRUUl9TSVpFOwotICAgICAgfQotCi0gICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyB2YWx1ZSBjb3VudCA9ICVkICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdC0+bGlzdF9hcHBfdmFsdWVzLm51bV92YWwpOwotICAgICAgbWluX2xlbiArPSBwX3Jlc3VsdC0+bGlzdF9hcHBfdmFsdWVzLm51bV92YWw7Ci0gICAgICBpZiAobGVuIDwgbWluX2xlbikgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICBmb3IgKGludCB4eCA9IDA7IHh4IDwgcF9yZXN1bHQtPmxpc3RfYXBwX3ZhbHVlcy5udW1fdmFsOyB4eCsrKSB7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+bGlzdF9hcHBfdmFsdWVzLnZhbHNbeHhdLCBwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfQ1VSX1BMQVlFUl9BUFBfVkFMVUU6IHsKLSAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICBwX3Jlc3VsdC0+Z2V0X2N1cl9hcHBfdmFsLm51bV92YWwgPSAwOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG1pbl9sZW4gKz0gMTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+Z2V0X2N1cl9hcHBfdmFsLm51bV92YWwsIHApOwotICAgICAgQVZSQ19UUkFDRV9ERUJVRygiJXMgYXR0ciBjb3VudCA9ICVkICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2N1cl9hcHBfdmFsLm51bV92YWwpOwotCi0gICAgICBpZiAocF9yZXN1bHQtPmdldF9jdXJfYXBwX3ZhbC5udW1fdmFsID4gQVZSQ19NQVhfQVBQX0FUVFJfU0laRSkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYzMTQ2MjM3Iik7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwubnVtX3ZhbCA9IEFWUkNfTUFYX0FQUF9BVFRSX1NJWkU7Ci0gICAgICB9Ci0KLSAgICAgIG1pbl9sZW4gKz0gcF9yZXN1bHQtPmdldF9jdXJfYXBwX3ZhbC5udW1fdmFsICogMjsKLSAgICAgIGlmIChsZW4gPCBtaW5fbGVuKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwubnVtX3ZhbCA9IDA7Ci0gICAgICAgIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgfQotICAgICAgdEFWUkNfQVBQX1NFVFRJTkcqIGFwcF9zZXR0ID0gKHRBVlJDX0FQUF9TRVRUSU5HKilvc2lfY2FsbG9jKAotICAgICAgICAgIHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwubnVtX3ZhbCAqIHNpemVvZih0QVZSQ19BUFBfU0VUVElORykpOwotICAgICAgZm9yIChpbnQgeHggPSAwOyB4eCA8IHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwubnVtX3ZhbDsgeHgrKykgewotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoYXBwX3NldHRbeHhdLmF0dHJfaWQsIHApOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoYXBwX3NldHRbeHhdLmF0dHJfdmFsLCBwKTsKLSAgICAgIH0KLSAgICAgIHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwucF92YWxzID0gYXBwX3NldHQ7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlFUl9BUFBfQVRUUl9URVhUOiB7Ci0gICAgICB1aW50OF90IG51bV9hdHRyczsKLQotICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0Lm51bV9hdHRyID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtaW5fbGVuICs9IDE7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgobnVtX2F0dHJzLCBwKTsKLSAgICAgIGlmIChudW1fYXR0cnMgPiBBVlJDX01BWF9BUFBfQVRUUl9TSVpFKSB7Ci0gICAgICAgIG51bV9hdHRycyA9IEFWUkNfTUFYX0FQUF9BVFRSX1NJWkU7Ci0gICAgICB9Ci0gICAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBhdHRyIGNvdW50ID0gJWQgIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0Lm51bV9hdHRyKTsKLSAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0Lm51bV9hdHRyID0gbnVtX2F0dHJzOwotCi0gICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5wX2F0dHJzID0gKHRBVlJDX0FQUF9TRVRUSU5HX1RFWFQqKW9zaV9jYWxsb2MoCi0gICAgICAgICAgbnVtX2F0dHJzICogc2l6ZW9mKHRBVlJDX0FQUF9TRVRUSU5HX1RFWFQpKTsKLSAgICAgIGZvciAoaW50IHh4ID0gMDsgeHggPCBudW1fYXR0cnM7IHh4KyspIHsKLSAgICAgICAgbWluX2xlbiArPSA0OwotICAgICAgICBpZiAobGVuIDwgbWluX2xlbikgewotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgeHg7IGorKykgewotICAgICAgICAgICAgb3NpX2ZyZWUocF9yZXN1bHQtPmdldF9hcHBfYXR0cl90eHQucF9hdHRyc1tqXS5wX3N0cik7Ci0gICAgICAgICAgfQotICAgICAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5wX2F0dHJzKTsKLSAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5udW1fYXR0ciA9IDA7Ci0gICAgICAgICAgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0LnBfYXR0cnNbeHhdLmF0dHJfaWQsIHApOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0LnBfYXR0cnNbeHhdLmNoYXJzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5wX2F0dHJzW3h4XS5zdHJfbGVuLCBwKTsKLSAgICAgICAgbWluX2xlbiArPSBwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5wX2F0dHJzW3h4XS5zdHJfbGVuOwotICAgICAgICBpZiAobGVuIDwgbWluX2xlbikgewotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgeHg7IGorKykgewotICAgICAgICAgICAgb3NpX2ZyZWUocF9yZXN1bHQtPmdldF9hcHBfYXR0cl90eHQucF9hdHRyc1tqXS5wX3N0cik7Ci0gICAgICAgICAgfQotICAgICAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5wX2F0dHJzKTsKLSAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5udW1fYXR0ciA9IDA7Ci0gICAgICAgICAgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0LnBfYXR0cnNbeHhdLnN0cl9sZW4gIT0gMCkgewotICAgICAgICAgIHVpbnQ4X3QqIHBfc3RyID0gKHVpbnQ4X3QqKW9zaV9jYWxsb2MoCi0gICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX2F0dHJfdHh0LnBfYXR0cnNbeHhdLnN0cl9sZW4pOwotICAgICAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwLCBwX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHQtPmdldF9hcHBfYXR0cl90eHQucF9hdHRyc1t4eF0uc3RyX2xlbik7Ci0gICAgICAgICAgcF9yZXN1bHQtPmdldF9hcHBfYXR0cl90eHQucF9hdHRyc1t4eF0ucF9zdHIgPSBwX3N0cjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF9hdHRyX3R4dC5wX2F0dHJzW3h4XS5wX3N0ciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9WQUxVRV9URVhUOiB7Ci0gICAgICB1aW50OF90IG51bV92YWxzOwotCi0gICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgcF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5udW1fYXR0ciA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbWluX2xlbiArPSAxOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KG51bV92YWxzLCBwKTsKLSAgICAgIGlmIChudW1fdmFscyA+IEFWUkNfTUFYX0FQUF9BVFRSX1NJWkUpIHsKLSAgICAgICAgbnVtX3ZhbHMgPSBBVlJDX01BWF9BUFBfQVRUUl9TSVpFOwotICAgICAgfQotICAgICAgcF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5udW1fYXR0ciA9IG51bV92YWxzOwotICAgICAgQVZSQ19UUkFDRV9ERUJVRygiJXMgdmFsdWUgY291bnQgPSAlZCAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5udW1fYXR0cik7Ci0KLSAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQucF9hdHRycyA9ICh0QVZSQ19BUFBfU0VUVElOR19URVhUKilvc2lfY2FsbG9jKAotICAgICAgICAgIG51bV92YWxzICogc2l6ZW9mKHRBVlJDX0FQUF9TRVRUSU5HX1RFWFQpKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3ZhbHM7IGkrKykgewotICAgICAgICBtaW5fbGVuICs9IDQ7Ci0gICAgICAgIGlmIChsZW4gPCBtaW5fbGVuKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgICAgIG9zaV9mcmVlKHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQucF9hdHRyc1tqXS5wX3N0cik7Ci0gICAgICAgICAgfQotICAgICAgICAgIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0LnBfYXR0cnMpOwotICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQubnVtX2F0dHIgPSAwOwotICAgICAgICAgIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0LnBfYXR0cnNbaV0uYXR0cl9pZCwgcCk7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5wX2F0dHJzW2ldLmNoYXJzZXRfaWQsIHApOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5wX2F0dHJzW2ldLnN0cl9sZW4sIHApOwotICAgICAgICBtaW5fbGVuICs9IHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQucF9hdHRyc1tpXS5zdHJfbGVuOwotICAgICAgICBpZiAobGVuIDwgbWluX2xlbikgewotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0gICAgICAgICAgICBvc2lfZnJlZShwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0LnBfYXR0cnNbal0ucF9zdHIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5wX2F0dHJzKTsKLSAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0Lm51bV9hdHRyID0gMDsKLSAgICAgICAgICBnb3RvIGxlbmd0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAocF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5wX2F0dHJzW2ldLnN0cl9sZW4gIT0gMCkgewotICAgICAgICAgIHVpbnQ4X3QqIHBfc3RyID0gKHVpbnQ4X3QqKW9zaV9jYWxsb2MoCi0gICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQucF9hdHRyc1tpXS5zdHJfbGVuKTsKLSAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgcF9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQucF9hdHRyc1tpXS5zdHJfbGVuKTsKLSAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0LnBfYXR0cnNbaV0ucF9zdHIgPSBwX3N0cjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0LnBfYXR0cnNbaV0ucF9zdHIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUU6Ci0gICAgICAvKiBub3RoaW5nIGNvbWVzIGFzIHBhcnQgb2YgdGhpcyByc3AgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSOiB7Ci0gICAgICB1aW50OF90IG51bV9hdHRyczsKLQotICAgICAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMubnVtX2F0dHJzID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtaW5fbGVuICs9IDE7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgobnVtX2F0dHJzLCBwKTsKLSAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMubnVtX2F0dHJzID0gbnVtX2F0dHJzOwotICAgICAgaWYgKG51bV9hdHRycykgewotICAgICAgICB0QVZSQ19BVFRSX0VOVFJZKiBwX2F0dHJzID0KLSAgICAgICAgICAgICh0QVZSQ19BVFRSX0VOVFJZKilvc2lfY2FsbG9jKG51bV9hdHRycyAqIHNpemVvZih0QVZSQ19BVFRSX0VOVFJZKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2F0dHJzOyBpKyspIHsKLSAgICAgICAgICBtaW5fbGVuICs9IDg7Ci0gICAgICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7Ci0gICAgICAgICAgICAgIG9zaV9mcmVlKHBfYXR0cnNbal0ubmFtZS5wX3N0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvc2lfZnJlZShwX2F0dHJzKTsKLSAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMubnVtX2F0dHJzID0gMDsKLSAgICAgICAgICAgIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgICAgIH0KLSAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHBfYXR0cnNbaV0uYXR0cl9pZCwgcCk7Ci0gICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX2F0dHJzW2ldLm5hbWUuY2hhcnNldF9pZCwgcCk7Ci0gICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX2F0dHJzW2ldLm5hbWUuc3RyX2xlbiwgcCk7Ci0gICAgICAgICAgbWluX2xlbiArPSBwX2F0dHJzW2ldLm5hbWUuc3RyX2xlbjsKLSAgICAgICAgICBpZiAobGVuIDwgbWluX2xlbikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgICAgICAgb3NpX2ZyZWUocF9hdHRyc1tqXS5uYW1lLnBfc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9zaV9mcmVlKHBfYXR0cnMpOwotICAgICAgICAgICAgcF9yZXN1bHQtPmdldF9hdHRycy5udW1fYXR0cnMgPSAwOwotICAgICAgICAgICAgZ290byBsZW5ndGhfZXJyb3I7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwX2F0dHJzW2ldLm5hbWUuc3RyX2xlbiA+IDApIHsKLSAgICAgICAgICAgIHBfYXR0cnNbaV0ubmFtZS5wX3N0ciA9Ci0gICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW9zaV9jYWxsb2MocF9hdHRyc1tpXS5uYW1lLnN0cl9sZW4pOwotICAgICAgICAgICAgQkVfU1RSRUFNX1RPX0FSUkFZKHAsIHBfYXR0cnNbaV0ubmFtZS5wX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2F0dHJzW2ldLm5hbWUuc3RyX2xlbik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBfYXR0cnNbaV0ubmFtZS5wX3N0ciA9IE5VTEw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMucF9hdHRycyA9IHBfYXR0cnM7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOgotICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbWluX2xlbiArPSA5OwotICAgICAgaWYgKGxlbiA8IG1pbl9sZW4pIGdvdG8gbGVuZ3RoX2Vycm9yOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihwX3Jlc3VsdC0+Z2V0X3BsYXlfc3RhdHVzLnNvbmdfbGVuLCBwKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9yZXN1bHQtPmdldF9wbGF5X3N0YXR1cy5zb25nX3BvcywgcCk7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9wbGF5X3N0YXR1cy5wbGF5X3N0YXR1cywgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfU0VUX0FERFJFU1NFRF9QTEFZRVI6Ci0gICAgICBpZiAobGVuICE9IDEpIHsKLSAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgcGR1OiAlZCBsZW4gJWQiLCBfX2Z1bmNfXywgcF9yZXN1bHQtPnBkdSwgbGVuKTsKLSAgICAgICAgcmV0dXJuIEFWUkNfU1RTX0JBRF9DTUQ7Ci0gICAgICB9Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPnJzcC5zdGF0dXMsIHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEFWUkNfU1RTX0JBRF9DTUQ7Ci0gIH0KLSAgcmV0dXJuIEFWUkNfU1RTX05PX0VSUk9SOwotCi1sZW5ndGhfZXJyb3I6Ci0gIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExNDUwNDE3Iik7Ci0gIEFWUkNfVFJBQ0VfV0FSTklORygiJXM6IGludmFsaWQgcGFyYW1ldGVyIGxlbmd0aCAlZDogbXVzdCBiZSBhdCBsZWFzdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVuLCBtaW5fbGVuKTsKLSAgcmV0dXJuIEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfQ3RybF9QYXJzUmVzcG9uc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwYXJzZSByZXNwb25zZSBmb3IgQVZSQ1AgQ29udHJvbGxlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgbWVzc2FnZSBpbiBwX2RhdGEgaXMgcGFyc2VkCi0gKiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZSBkZWZpbmVkIGJ5IEFWUkNQIDEuNAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZSQ19TVFMgQVZSQ19DdHJsX1BhcnNSZXNwb25zZSh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19SRVNQT05TRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2J1ZiwgdWludDE2X3QqIGJ1Zl9sZW4pIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgaWYgKHBfbXNnICYmIHBfcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChwX21zZy0+aGRyLm9wY29kZSkgewotICAgICAgY2FzZSBBVlJDX09QX1ZFTkRPUjogLyogIDB4MDAgICAgVmVuZG9yLWRlcGVuZGVudCBjb21tYW5kcyAqLwotICAgICAgICBzdGF0dXMgPQotICAgICAgICAgICAgYXZyY19jdHJsX3BhcnNfdmVuZG9yX3JzcCgmcF9tc2ctPnZlbmRvciwgcF9yZXN1bHQsIHBfYnVmLCBidWZfbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19PUF9CUk9XU0U6IC8qIDB4ZmYgQnJvd3NlIGNvbW1hbmRzICovCi0gICAgICAgIHN0YXR1cyA9IGF2cmNfcGFyc19icm93c2VfcnNwKCZwX21zZy0+YnJvd3NlLCBwX3Jlc3VsdCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBBVlJDX1RSQUNFX0VSUk9SKCIlcyB1bmtub3duIG9wY29kZToweCV4IiwgX19mdW5jX18sIHBfbXNnLT5oZHIub3Bjb2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBfcmVzdWx0LT5yc3Aub3Bjb2RlID0gcF9tc2ctPmhkci5vcGNvZGU7Ci0gICAgcF9yZXN1bHQtPnJzcC5zdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfUGFyc1Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGEgc3VwZXJzZXQgb2YgQVZSQ19QYXJzTWV0YWRhdGEgdG8gcGFyc2UKLSAqICAgICAgICAgICAgICAgICAgdGhlIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBtZXNzYWdlIGluIHBfZGF0YSBpcyBwYXJzZWQKLSAqICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlIGRlZmluZWQgYnkgQVZSQ1AgMS40Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVlJDX1NUUyBBVlJDX1BhcnNSZXNwb25zZSh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19SRVNQT05TRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgYnVmX2xlbikgewotICB0QVZSQ19TVFMgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICB1aW50MTZfdCBpZDsKLQotICBpZiAocF9tc2cgJiYgcF9yZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHBfbXNnLT5oZHIub3Bjb2RlKSB7Ci0gICAgICBjYXNlIEFWUkNfT1BfVkVORE9SOiAvKiAgMHgwMCAgICBWZW5kb3ItZGVwZW5kZW50IGNvbW1hbmRzICovCi0gICAgICAgIHN0YXR1cyA9IGF2cmNfcGFyc192ZW5kb3JfcnNwKCZwX21zZy0+dmVuZG9yLCBwX3Jlc3VsdCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfT1BfUEFTU19USFJVOiAvKiAgMHg3QyAgICBwYW5lbCBzdWJ1bml0IG9wY29kZSAqLwotICAgICAgICBzdGF0dXMgPSBhdnJjX3BhcnNfcGFzc190aHJ1KCZwX21zZy0+cGFzcywgJmlkKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBBVlJDX1NUU19OT19FUlJPUikgewotICAgICAgICAgIHBfcmVzdWx0LT5wZHUgPSAodWludDhfdClpZDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgdW5rbm93biBvcGNvZGU6MHgleCIsIF9fZnVuY19fLCBwX21zZy0+aGRyLm9wY29kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwX3Jlc3VsdC0+cnNwLm9wY29kZSA9IHBfbXNnLT5oZHIub3Bjb2RlOwotICAgIHBfcmVzdWx0LT5yc3Auc3RhdHVzID0gc3RhdHVzOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9hdnJjL2F2cmNfcGFyc190Zy5jYyBiL3N0YWNrL2F2cmMvYXZyY19wYXJzX3RnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWNlYmVmLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2cmMvYXZyY19wYXJzX3RnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdnJjX2FwaS5oIgotI2luY2x1ZGUgImF2cmNfZGVmcy5oIgotI2luY2x1ZGUgImF2cmNfaW50LmgiCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgR2xvYmFsIGRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19jdHJsX3BhcnNfdmVuZG9yX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHZlbmRvciBzcGVjaWZpYyBjb21tYW5kcyBkZWZpbmVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgIEJsdWV0b290aCBTSUcgZm9yIEFWUkNQIENvbnJvbGxlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgbWVzc2FnZSBpbiBwX2RhdGEgaXMgcGFyc2VkCi0gKiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZSBkZWZpbmVkIGJ5IEFWUkNQIDEuNAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfY3RybF9wYXJzX3ZlbmRvcl9jbWQodEFWUkNfTVNHX1ZFTkRPUiogcF9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfQ09NTUFORCogcF9yZXN1bHQpIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotCi0gIHVpbnQ4X3QqIHAgPSBwX21zZy0+cF92ZW5kb3JfZGF0YTsKLSAgcF9yZXN1bHQtPnBkdSA9ICpwKys7Ci0gIEFWUkNfVFJBQ0VfREVCVUcoIiVzIHBkdToweCV4IiwgX19mdW5jX18sIHBfcmVzdWx0LT5wZHUpOwotICBpZiAoIUFWUkNfSXNWYWxpZEF2Y1R5cGUocF9yZXN1bHQtPnBkdSwgcF9tc2ctPmhkci5jdHlwZSkpIHsKLSAgICBBVlJDX1RSQUNFX0RFQlVHKCIlcyBkZXRlY3RzIHdyb25nIEFWL0MgdHlwZSEiLCBfX2Z1bmNfXyk7Ci0gICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX0NNRDsKLSAgfQotCi0gIHArKzsgLyogc2tpcCB0aGUgcmVzZXJ2ZWQgYnl0ZSAqLwotICB1aW50MTZfdCBsZW47Ci0gIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwKTsKLSAgaWYgKChsZW4gKyA0KSAhPSAocF9tc2ctPnZlbmRvcl9sZW4pKSB7Ci0gICAgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLQotICBzd2l0Y2ggKHBfcmVzdWx0LT5wZHUpIHsKLSAgICBjYXNlIEFWUkNfUERVX1NFVF9BQlNPTFVURV9WT0xVTUU6IHsKLSAgICAgIGlmIChsZW4gIT0gMSkKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgZWxzZSB7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+dm9sdW1lLnZvbHVtZSwgcCk7Ci0gICAgICAgIHBfcmVzdWx0LT52b2x1bWUudm9sdW1lID0gQVZSQ19NQVhfVk9MVU1FICYgcF9yZXN1bHQtPnZvbHVtZS52b2x1bWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT046IC8qIDB4MzEgKi8KLSAgICAgIGlmIChsZW4gPCA1KSByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotCi0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPnJlZ19ub3RpZi5ldmVudF9pZCwgcCk7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHBfcmVzdWx0LT5yZWdfbm90aWYucGFyYW0sIHApOwotCi0gICAgICBpZiAocF9yZXN1bHQtPnJlZ19ub3RpZi5ldmVudF9pZCA9PSAwIHx8Ci0gICAgICAgICAgcF9yZXN1bHQtPnJlZ19ub3RpZi5ldmVudF9pZCA+IEFWUkNfTlVNX05PVElGX0VWRU5UUykgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE4MTg2MDA0MiIpOwotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX0NNRDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX3BhcnNfdmVuZG9yX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHZlbmRvciBzcGVjaWZpYyBjb21tYW5kcyBkZWZpbmVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgIEJsdWV0b290aCBTSUcKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SLCBpZiB0aGUgbWVzc2FnZSBpbiBwX2RhdGEgaXMgcGFyc2VkCi0gKiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZSBkZWZpbmVkIGJ5IEFWUkNQIDEuNAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEFWUkNfU1RTIGF2cmNfcGFyc192ZW5kb3JfY21kKHRBVlJDX01TR19WRU5ET1IqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19DT01NQU5EKiBwX3Jlc3VsdCwgdWludDhfdCogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJ1Zl9sZW4pIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX05PX0VSUk9SOwotICB1aW50OF90KiBwOwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QgeHgsIHl5OwotICB1aW50OF90KiBwX3U4OwotICB1aW50MTZfdCogcF91MTY7Ci0gIHVpbnQzMl90IHUzMiwgdTMyXzIsICpwX3UzMjsKLSAgdEFWUkNfQVBQX1NFVFRJTkcqIHBfYXBwX3NldDsKLSAgdWludDE2X3Qgc2l6ZV9uZWVkZWQ7Ci0KLSAgLyogQ2hlY2sgdGhlIHZlbmRvciBkYXRhICovCi0gIGlmIChwX21zZy0+dmVuZG9yX2xlbiA9PSAwKSByZXR1cm4gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIGlmIChwX21zZy0+cF92ZW5kb3JfZGF0YSA9PSBOVUxMKSByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotCi0gIGlmIChwX21zZy0+dmVuZG9yX2xlbiA8IDQpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE2ODcxMjM4MiIpOwotICAgIEFWUkNfVFJBQ0VfV0FSTklORygiJXM6IG1lc3NhZ2UgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCA0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfbXNnLT52ZW5kb3JfbGVuKTsKLSAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICB9Ci0KLSAgcCA9IHBfbXNnLT5wX3ZlbmRvcl9kYXRhOwotICBwX3Jlc3VsdC0+cGR1ID0gKnArKzsKLSAgQVZSQ19UUkFDRV9ERUJVRygiJXMgcGR1OjB4JXgiLCBfX2Z1bmNfXywgcF9yZXN1bHQtPnBkdSk7Ci0gIGlmICghQVZSQ19Jc1ZhbGlkQXZjVHlwZShwX3Jlc3VsdC0+cGR1LCBwX21zZy0+aGRyLmN0eXBlKSkgewotICAgIEFWUkNfVFJBQ0VfREVCVUcoIiVzIGRldGVjdHMgd3JvbmcgQVYvQyB0eXBlKDB4JXgpISIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmhkci5jdHlwZSk7Ci0gICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX0NNRDsKLSAgfQotCi0gIHArKzsgLyogc2tpcCB0aGUgcmVzZXJ2ZWQgYnl0ZSAqLwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KGxlbiwgcCk7Ci0gIGlmICgobGVuICsgNCkgIT0gKHBfbXNnLT52ZW5kb3JfbGVuKSkgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIGluY29ycmVjdCBsZW5ndGggOiVkLCAlZCIsIF9fZnVuY19fLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICBwX21zZy0+dmVuZG9yX2xlbik7Ci0gICAgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBBVlJDX1NUU19OT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLQotICBzd2l0Y2ggKHBfcmVzdWx0LT5wZHUpIHsKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9DQVBBQklMSVRJRVM6IC8qIDB4MTAgKi8KLSAgICAgIHBfcmVzdWx0LT5nZXRfY2Fwcy5jYXBhYmlsaXR5X2lkID0gKnArKzsKLSAgICAgIGlmICghQVZSQ19JU19WQUxJRF9DQVBfSUQocF9yZXN1bHQtPmdldF9jYXBzLmNhcGFiaWxpdHlfaWQpKQotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICBlbHNlIGlmIChsZW4gIT0gMSkKLSAgICAgICAgcmV0dXJuIEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfQVRUUjogLyogMHgxMSAqLwotICAgICAgLyogbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAobGVuICE9IDApIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX1ZBTFVFUzogLyogMHgxMiAqLwotICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgcF9yZXN1bHQtPmxpc3RfYXBwX3ZhbHVlcy5hdHRyX2lkID0gKnArKzsKLSAgICAgIGlmICghQVZSQ19JU19WQUxJRF9BVFRSSUJVVEUocF9yZXN1bHQtPmxpc3RfYXBwX3ZhbHVlcy5hdHRyX2lkKSkKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgZWxzZSBpZiAobGVuICE9IDEpCi0gICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9HRVRfQ1VSX1BMQVlFUl9BUFBfVkFMVUU6IC8qIDB4MTMgKi8KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZRVJfQVBQX0FUVFJfVEVYVDogLyogMHgxNSAqLwotICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwubnVtX2F0dHIsIHApOwotICAgICAgaWYgKGxlbiAhPSAocF9yZXN1bHQtPmdldF9jdXJfYXBwX3ZhbC5udW1fYXR0ciArIDEpKSB7Ci0gICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX3Jlc3VsdC0+Z2V0X2N1cl9hcHBfdmFsLm51bV9hdHRyID4gQVZSQ19NQVhfQVBQX0FUVFJfU0laRSkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYzMTQ2MjM3Iik7Ci0gICAgICAgIHBfcmVzdWx0LT5nZXRfY3VyX2FwcF92YWwubnVtX2F0dHIgPSBBVlJDX01BWF9BUFBfQVRUUl9TSVpFOwotICAgICAgfQotCi0gICAgICBwX3U4ID0gcF9yZXN1bHQtPmdldF9jdXJfYXBwX3ZhbC5hdHRyczsKLSAgICAgIGZvciAoeHggPSAwLCB5eSA9IDA7IHh4IDwgcF9yZXN1bHQtPmdldF9jdXJfYXBwX3ZhbC5udW1fYXR0cjsgeHgrKykgewotICAgICAgICAvKiBvbmx5IHJlcG9ydCB0aGUgdmFsaWQgcGxheWVyIGFwcCBhdHRyaWJ1dGVzICovCi0gICAgICAgIGlmIChBVlJDX0lzVmFsaWRQbGF5ZXJBdHRyKCpwKSkgcF91OFt5eSsrXSA9ICpwOwotICAgICAgICBwKys7Ci0gICAgICB9Ci0gICAgICBwX3Jlc3VsdC0+Z2V0X2N1cl9hcHBfdmFsLm51bV9hdHRyID0geXk7Ci0gICAgICBpZiAoeXkgPT0gMCkgewotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUU6IC8qIDB4MTQgKi8KLSAgICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+c2V0X2FwcF92YWwubnVtX3ZhbCwgcCk7Ci0gICAgICBzaXplX25lZWRlZCA9IHNpemVvZih0QVZSQ19BUFBfU0VUVElORyk7Ci0gICAgICBpZiAocF9idWYgJiYgKGxlbiA9PSAoKHBfcmVzdWx0LT5zZXRfYXBwX3ZhbC5udW1fdmFsIDw8IDEpICsgMSkpKSB7Ci0gICAgICAgIHBfcmVzdWx0LT5zZXRfYXBwX3ZhbC5wX3ZhbHMgPSAodEFWUkNfQVBQX1NFVFRJTkcqKXBfYnVmOwotICAgICAgICBwX2FwcF9zZXQgPSBwX3Jlc3VsdC0+c2V0X2FwcF92YWwucF92YWxzOwotICAgICAgICBmb3IgKHh4ID0gMDsKLSAgICAgICAgICAgICAoKHh4IDwgcF9yZXN1bHQtPnNldF9hcHBfdmFsLm51bV92YWwpICYmIChidWZfbGVuID4gc2l6ZV9uZWVkZWQpKTsKLSAgICAgICAgICAgICB4eCsrKSB7Ci0gICAgICAgICAgcF9hcHBfc2V0W3h4XS5hdHRyX2lkID0gKnArKzsKLSAgICAgICAgICBwX2FwcF9zZXRbeHhdLmF0dHJfdmFsID0gKnArKzsKLSAgICAgICAgICBpZiAoIWF2cmNfaXNfdmFsaWRfcGxheWVyX2F0dHJpYl92YWx1ZShwX2FwcF9zZXRbeHhdLmF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hcHBfc2V0W3h4XS5hdHRyX3ZhbCkpCi0gICAgICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUEFSQU07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHh4ICE9IHBfcmVzdWx0LT5zZXRfYXBwX3ZhbC5udW1fdmFsKSB7Ci0gICAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICAgIiVzIEFWUkNfUERVX1NFVF9QTEFZRVJfQVBQX1ZBTFVFIG5vdCBlbm91Z2ggcm9vbTolZCBvcmlnICIKLSAgICAgICAgICAgICAgIm51bV92YWw6JWQiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgeHgsIHBfcmVzdWx0LT5zZXRfYXBwX3ZhbC5udW1fdmFsKTsKLSAgICAgICAgICBwX3Jlc3VsdC0+c2V0X2FwcF92YWwubnVtX3ZhbCA9IHh4OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBVlJDX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzIEFWUkNfUERVX1NFVF9QTEFZRVJfQVBQX1ZBTFVFIE5VTEwgZGVjb2RlIGJ1ZmZlciBvciBiYWQgbGVuIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9QTEFZRVJfQVBQX1ZBTFVFX1RFWFQ6IC8qIDB4MTYgKi8KLSAgICAgIGlmIChsZW4gPCAzKQotICAgICAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgZWxzZSB7Ci0gICAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0LmF0dHJfaWQsIHApOwotICAgICAgICBpZiAoIUFWUkNfSVNfVkFMSURfQVRUUklCVVRFKHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQuYXR0cl9pZCkpCi0gICAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5udW1fdmFsLCBwKTsKLSAgICAgICAgICBpZiAoKGxlbiAtIDIgLyogYXR0cl9pZCAmIG51bV92YWwgKi8pICE9Ci0gICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQubnVtX3ZhbCkKLSAgICAgICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+Z2V0X2FwcF92YWxfdHh0Lm51bV92YWwgPiBBVlJDX01BWF9BUFBfQVRUUl9TSVpFKSB7Ci0gICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjMxNDYyMzciKTsKLSAgICAgICAgICAgICAgcF9yZXN1bHQtPmdldF9hcHBfdmFsX3R4dC5udW1fdmFsID0gQVZSQ19NQVhfQVBQX0FUVFJfU0laRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcF91OCA9IHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQudmFsczsKLSAgICAgICAgICAgIGZvciAoeHggPSAwOyB4eCA8IHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQubnVtX3ZhbDsgeHgrKykgewotICAgICAgICAgICAgICBwX3U4W3h4XSA9ICpwKys7Ci0gICAgICAgICAgICAgIGlmICghYXZyY19pc192YWxpZF9wbGF5ZXJfYXR0cmliX3ZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXBwX3ZhbF90eHQuYXR0cl9pZCwgcF91OFt4eF0pKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfSU5GT1JNX0RJU1BMQVlfQ0hBUlNFVDogLyogMHgxNyAqLwotICAgICAgaWYgKGxlbiA8IDMpCi0gICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5pbmZvcm1fY2hhcnNldC5udW1faWQsIHApOwotICAgICAgICBpZiAoKGxlbiAtIDEgLyogbnVtX2lkICovKSAhPSBwX3Jlc3VsdC0+aW5mb3JtX2NoYXJzZXQubnVtX2lkICogMikKLSAgICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHBfdTE2ID0gcF9yZXN1bHQtPmluZm9ybV9jaGFyc2V0LmNoYXJzZXRzOwotICAgICAgICAgIGlmIChwX3Jlc3VsdC0+aW5mb3JtX2NoYXJzZXQubnVtX2lkID4gQVZSQ19NQVhfQ0hBUlNFVF9TSVpFKQotICAgICAgICAgICAgcF9yZXN1bHQtPmluZm9ybV9jaGFyc2V0Lm51bV9pZCA9IEFWUkNfTUFYX0NIQVJTRVRfU0laRTsKLSAgICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCBwX3Jlc3VsdC0+aW5mb3JtX2NoYXJzZXQubnVtX2lkOyB4eCsrKSB7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHBfdTE2W3h4XSwgcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfSU5GT1JNX0JBVFRFUllfU1RBVF9PRl9DVDogLyogMHgxOCAqLwotICAgICAgaWYgKGxlbiAhPSAxKQotICAgICAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgZWxzZSB7Ci0gICAgICAgIHBfcmVzdWx0LT5pbmZvcm1fYmF0dGVyeV9zdGF0dXMuYmF0dGVyeV9zdGF0dXMgPSAqcCsrOwotICAgICAgICBpZiAoIUFWUkNfSVNfVkFMSURfQkFUVEVSWV9TVEFUVVMoCi0gICAgICAgICAgICAgICAgcF9yZXN1bHQtPmluZm9ybV9iYXR0ZXJ5X3N0YXR1cy5iYXR0ZXJ5X3N0YXR1cykpCi0gICAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9FTEVNRU5UX0FUVFI6IC8qIDB4MjAgKi8KLSAgICAgIGlmIChsZW4gPCA5KSAgICAgICAgICAgICAgICAgIC8qIFVJRC84IGFuZCBudW1fYXR0ci8xICovCi0gICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMih1MzIsIHApOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHUzMl8yLCBwKTsKLSAgICAgICAgaWYgKHUzMiA9PSAwICYmIHUzMl8yID09IDApIHsKLSAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9lbGVtX2F0dHJzLm51bV9hdHRyLCBwKTsKLSAgICAgICAgICBpZiAoKGxlbiAtIDkgLyogVUlELzggYW5kIG51bV9hdHRyLzEgKi8pICE9Ci0gICAgICAgICAgICAgIChwX3Jlc3VsdC0+Z2V0X2VsZW1fYXR0cnMubnVtX2F0dHIgKiA0KSkKLSAgICAgICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBfdTMyID0gcF9yZXN1bHQtPmdldF9lbGVtX2F0dHJzLmF0dHJzOwotICAgICAgICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfZWxlbV9hdHRycy5udW1fYXR0ciA+IEFWUkNfTUFYX0VMRU1fQVRUUl9TSVpFKQotICAgICAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2VsZW1fYXR0cnMubnVtX2F0dHIgPSBBVlJDX01BWF9FTEVNX0FUVFJfU0laRTsKLSAgICAgICAgICAgIGZvciAoeHggPSAwOyB4eCA8IHBfcmVzdWx0LT5nZXRfZWxlbV9hdHRycy5udW1fYXR0cjsgeHgrKykgewotICAgICAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHBfdTMyW3h4XSwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19OT1RfRk9VTkQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOiAvKiAweDMwICovCi0gICAgICAvKiBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmIChsZW4gIT0gMCkgcmV0dXJuIEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT046IC8qIDB4MzEgKi8KLSAgICAgIGlmIChsZW4gIT0gNSkKLSAgICAgICAgcmV0dXJuIEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIGVsc2UgewotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPnJlZ19ub3RpZi5ldmVudF9pZCwgcCk7Ci0gICAgICAgIGlmICghQVZSQ19JU19WQUxJRF9FVkVOVF9JRChwX3Jlc3VsdC0+cmVnX25vdGlmLmV2ZW50X2lkKSkgewotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTY4ODAyOTkwIik7Ci0gICAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgZXZlbnQgaWQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdC0+cmVnX25vdGlmLmV2ZW50X2lkKTsKLSAgICAgICAgICByZXR1cm4gQVZSQ19TVFNfQkFEX1BBUkFNOwotICAgICAgICB9Ci0KLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihwX3Jlc3VsdC0+cmVnX25vdGlmLnBhcmFtLCBwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9TRVRfQUJTT0xVVEVfVk9MVU1FOiAvKiAweDUwICovCi0gICAgICBpZiAobGVuICE9IDEpCi0gICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICBlbHNlCi0gICAgICAgIHBfcmVzdWx0LT52b2x1bWUudm9sdW1lID0gKnArKzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9SRVFVRVNUX0NPTlRJTlVBVElPTl9SU1A6IC8qIDB4NDAgKi8KLSAgICAgIGlmIChsZW4gIT0gMSkgewotICAgICAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgfQotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5jb250aW51LnRhcmdldF9wZHUsIHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0FCT1JUX0NPTlRJTlVBVElPTl9SU1A6IC8qIDB4NDEgKi8KLSAgICAgIGlmIChsZW4gIT0gMSkgewotICAgICAgICByZXR1cm4gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotICAgICAgfQotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5hYm9ydC50YXJnZXRfcGR1LCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9TRVRfQUREUkVTU0VEX1BMQVlFUjogLyogMHg2MCAqLwotICAgICAgaWYgKGxlbiAhPSAyKSB7Ci0gICAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIkFWUkNfUERVX1NFVF9BRERSRVNTRURfUExBWUVSIGxlbmd0aCBpcyBpbmNvcnJlY3Q6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0gICAgICAgIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICB9Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHBfcmVzdWx0LT5hZGRyX3BsYXllci5wbGF5ZXJfaWQsIHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX1BMQVlfSVRFTTogICAgICAgICAgLyogMHg3NCAqLwotICAgIGNhc2UgQVZSQ19QRFVfQUREX1RPX05PV19QTEFZSU5HOiAvKiAweDkwICovCi0gICAgICBpZiAobGVuICE9IChBVlJDX1VJRF9TSVpFICsgMykpIHJldHVybiBBVlJDX1NUU19JTlRFUk5BTF9FUlI7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPnBsYXlfaXRlbS5zY29wZSwgcCk7Ci0gICAgICBpZiAocF9yZXN1bHQtPnBsYXlfaXRlbS5zY29wZSA+IEFWUkNfU0NPUEVfTk9XX1BMQVlJTkcpIHsKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX1NDT1BFOwotICAgICAgfQotICAgICAgQkVfU1RSRUFNX1RPX0FSUkFZKHAsIHBfcmVzdWx0LT5wbGF5X2l0ZW0udWlkLCBBVlJDX1VJRF9TSVpFKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9yZXN1bHQtPnBsYXlfaXRlbS51aWRfY291bnRlciwgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfQ01EOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19DdHJsX1BhcnNDb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFyc2UgY21kcyByZWNlaXZlZCBmb3IgQ1RSTAotICogICAgICAgICAgICAgICAgICBDdXJyZW50bHkgaXQgaXMgZm9yIFNldEFic1ZvbHVtZSBhbmQgVm9sdW1lIENoYW5nZQotICogICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCi0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUgZGVmaW5lZCBieSBBVlJDUCAxLjQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEFWUkNfU1RTIEFWUkNfQ3RybF9QYXJzQ29tbWFuZCh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19DT01NQU5EKiBwX3Jlc3VsdCkgewotICB0QVZSQ19TVFMgc3RhdHVzID0gQVZSQ19TVFNfSU5URVJOQUxfRVJSOwotCi0gIGlmIChwX21zZyAmJiBwX3Jlc3VsdCkgewotICAgIHN3aXRjaCAocF9tc2ctPmhkci5vcGNvZGUpIHsKLSAgICAgIGNhc2UgQVZSQ19PUF9WRU5ET1I6IC8qICAweDAwICAgIFZlbmRvci1kZXBlbmRlbnQgY29tbWFuZHMgKi8KLSAgICAgICAgc3RhdHVzID0gYXZyY19jdHJsX3BhcnNfdmVuZG9yX2NtZCgmcF9tc2ctPnZlbmRvciwgcF9yZXN1bHQpOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXMgdW5rbm93biBvcGNvZGU6MHgleCIsIF9fZnVuY19fLCBwX21zZy0+aGRyLm9wY29kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwX3Jlc3VsdC0+Y21kLm9wY29kZSA9IHBfbXNnLT5oZHIub3Bjb2RlOwotICAgIHBfcmVzdWx0LT5jbWQuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0gIEFWUkNfVFJBQ0VfREVCVUcoIiVzIHJldHVybiBzdGF0dXM6MHgleCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICByZXR1cm4gc3RhdHVzOwotfQotCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRkFMU0UoX3N0YXR1c18sIF9iXywgX21zZ18sIC4uLikgXAotICBpZiAoIShfYl8pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBVlJDX1RSQUNFX0RFQlVHKF9tc2dfLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIF9zdGF0dXNfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdnJjX3BhcnNfYnJvd3NpbmdfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgY29tbWFuZHMgdGhhdCBnbyB0aHJvdWdoIHRoZQotICogICAgICAgICAgICAgICAgICBicm93c2luZyBjaGFubmVsCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCi0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGVycm9yIGNvZGUgZGVmaW5lZCBieSBBVlJDUCsxCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QVZSQ19TVFMgYXZyY19wYXJzX2Jyb3dzaW5nX2NtZCh0QVZSQ19NU0dfQlJPV1NFKiBwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19DT01NQU5EKiBwX3Jlc3VsdCwgdWludDhfdCogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnVmX2xlbikgewotICB0QVZSQ19TVFMgc3RhdHVzID0gQVZSQ19TVFNfTk9fRVJST1I7Ci0gIHVpbnQ4X3QqIHAgPSBwX21zZy0+cF9icm93c2VfZGF0YTsKLSAgaW50IGNvdW50OwotCi0gIHVpbnQxNl90IG1pbl9sZW4gPSAzOwotICBSRVRVUk5fU1RBVFVTX0lGX0ZBTFNFKEFWUkNfU1RTX0JBRF9DTUQsIChwX21zZy0+YnJvd3NlX2xlbiA+PSBtaW5fbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIHRvbyBzaG9ydCIpOwotCi0gIHBfcmVzdWx0LT5wZHUgPSAqcCsrOwotICBBVlJDX1RSQUNFX0RFQlVHKCJhdnJjX3BhcnNfYnJvd3NpbmdfY21kKCkgcGR1OjB4JXgiLCBwX3Jlc3VsdC0+cGR1KTsKLSAgLyogc2tpcCBvdmVyIGxlbiAqLwotICBwICs9IDI7Ci0KLSAgc3dpdGNoIChwX3Jlc3VsdC0+cGR1KSB7Ci0gICAgY2FzZSBBVlJDX1BEVV9TRVRfQlJPV1NFRF9QTEFZRVI6IC8qIDB4NzAgKi8KLSAgICAgIG1pbl9sZW4gKz0gMjsKLSAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRkFMU0UoQVZSQ19TVFNfQkFEX0NNRCwgKHBfbXNnLT5icm93c2VfbGVuID49IG1pbl9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIHRvbyBzaG9ydCIpOwotCi0gICAgICAvLyBGb3IgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbGwgcGxheWVycyBhcmUgYnJvd3NhYmxlLgotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX3Jlc3VsdC0+YnJfcGxheWVyLnBsYXllcl9pZCwgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0ZPTERFUl9JVEVNUzogLyogMHg3MSAqLwotCi0gICAgICBtaW5fbGVuICs9IDEwOwotICAgICAgUkVUVVJOX1NUQVRVU19JRl9GQUxTRShBVlJDX1NUU19CQURfQ01ELCAocF9tc2ctPmJyb3dzZV9sZW4gPj0gbWluX2xlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cgdG9vIHNob3J0Iik7Ci0KLSAgICAgIFNUUkVBTV9UT19VSU5UOChwX3Jlc3VsdC0+Z2V0X2l0ZW1zLnNjb3BlLCBwKTsKLSAgICAgIC8vIFRvIGJlIG1vZGlmaWVkIGxhdGVyIGhlcmUgKFNjb3BlKSB3aGVuIGFsbCBicm93c2luZyBjb21tYW5kcyBhcmUKLSAgICAgIC8vIHN1cHBvcnRlZAotICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfaXRlbXMuc2NvcGUgPiBBVlJDX1NDT1BFX05PV19QTEFZSU5HKSB7Ci0gICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9TQ09QRTsKLSAgICAgIH0KLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9yZXN1bHQtPmdldF9pdGVtcy5zdGFydF9pdGVtLCBwKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9yZXN1bHQtPmdldF9pdGVtcy5lbmRfaXRlbSwgcCk7Ci0gICAgICBpZiAocF9yZXN1bHQtPmdldF9pdGVtcy5zdGFydF9pdGVtID4gcF9yZXN1bHQtPmdldF9pdGVtcy5lbmRfaXRlbSkgewotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfUkFOR0U7Ci0gICAgICB9Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9pdGVtcy5hdHRyX2NvdW50LCBwKTsKLSAgICAgIHBfcmVzdWx0LT5nZXRfaXRlbXMucF9hdHRyX2xpc3QgPSBOVUxMOwotICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfaXRlbXMuYXR0cl9jb3VudCAmJiBwX2J1ZiAmJgotICAgICAgICAgIChwX3Jlc3VsdC0+Z2V0X2l0ZW1zLmF0dHJfY291bnQgIT0gQVZSQ19GT0xERVJfSVRFTV9DT1VOVF9OT05FKSkgewotICAgICAgICBwX3Jlc3VsdC0+Z2V0X2l0ZW1zLnBfYXR0cl9saXN0ID0gKHVpbnQzMl90KilwX2J1ZjsKLSAgICAgICAgY291bnQgPSBwX3Jlc3VsdC0+Z2V0X2l0ZW1zLmF0dHJfY291bnQ7Ci0gICAgICAgIGlmIChidWZfbGVuIDwgKGNvdW50IDw8IDIpKQotICAgICAgICAgIHBfcmVzdWx0LT5nZXRfaXRlbXMuYXR0cl9jb3VudCA9IGNvdW50ID0gKGJ1Zl9sZW4gPj4gMik7Ci0gICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgewotICAgICAgICAgIG1pbl9sZW4gKz0gNDsKLSAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0ZBTFNFKEFWUkNfU1RTX0JBRF9DTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9tc2ctPmJyb3dzZV9sZW4gPj0gbWluX2xlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIHRvbyBzaG9ydCIpOwotCi0gICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihwX3Jlc3VsdC0+Z2V0X2l0ZW1zLnBfYXR0cl9saXN0W2lkeF0sIHApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfQ0hBTkdFX1BBVEg6IC8qIDB4NzIgKi8KLSAgICAgIG1pbl9sZW4gKz0gMTE7Ci0gICAgICBSRVRVUk5fU1RBVFVTX0lGX0ZBTFNFKEFWUkNfU1RTX0JBRF9DTUQsIChwX21zZy0+YnJvd3NlX2xlbiA+PSBtaW5fbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyB0b28gc2hvcnQiKTsKLQotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX3Jlc3VsdC0+Y2hnX3BhdGgudWlkX2NvdW50ZXIsIHApOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHBfcmVzdWx0LT5jaGdfcGF0aC5kaXJlY3Rpb24sIHApOwotICAgICAgaWYgKHBfcmVzdWx0LT5jaGdfcGF0aC5kaXJlY3Rpb24gIT0gQVZSQ19ESVJfVVAgJiYKLSAgICAgICAgICBwX3Jlc3VsdC0+Y2hnX3BhdGguZGlyZWN0aW9uICE9IEFWUkNfRElSX0RPV04pIHsKLSAgICAgICAgc3RhdHVzID0gQVZSQ19TVFNfQkFEX0RJUjsKLSAgICAgIH0KLSAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwLCBwX3Jlc3VsdC0+Y2hnX3BhdGguZm9sZGVyX3VpZCwgQVZSQ19VSURfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfR0VUX0lURU1fQVRUUklCVVRFUzogLyogMHg3MyAqLwotICAgICAgbWluX2xlbiArPSAxMjsKLSAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRkFMU0UoQVZSQ19TVFNfQkFEX0NNRCwgKHBfbXNnLT5icm93c2VfbGVuID49IG1pbl9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIHRvbyBzaG9ydCIpOwotCi0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9hdHRycy5zY29wZSwgcCk7Ci0KLSAgICAgIGlmIChwX3Jlc3VsdC0+Z2V0X2F0dHJzLnNjb3BlID4gQVZSQ19TQ09QRV9OT1dfUExBWUlORykgewotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfU0NPUEU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgQkVfU1RSRUFNX1RPX0FSUkFZKHAsIHBfcmVzdWx0LT5nZXRfYXR0cnMudWlkLCBBVlJDX1VJRF9TSVpFKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9yZXN1bHQtPmdldF9hdHRycy51aWRfY291bnRlciwgcCk7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9hdHRycy5hdHRyX2NvdW50LCBwKTsKLSAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMucF9hdHRyX2xpc3QgPSBOVUxMOwotICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfYXR0cnMuYXR0cl9jb3VudCAmJiBwX2J1ZikgewotICAgICAgICBwX3Jlc3VsdC0+Z2V0X2F0dHJzLnBfYXR0cl9saXN0ID0gKHVpbnQzMl90KilwX2J1ZjsKLSAgICAgICAgY291bnQgPSBwX3Jlc3VsdC0+Z2V0X2F0dHJzLmF0dHJfY291bnQ7Ci0gICAgICAgIGlmIChidWZfbGVuIDwgKGNvdW50IDw8IDIpKQotICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMuYXR0cl9jb3VudCA9IGNvdW50ID0gKGJ1Zl9sZW4gPj4gMik7Ci0gICAgICAgIGZvciAoaW50IGlkeCA9IDAsIGNvdW50ID0gMDsgaWR4IDwgcF9yZXN1bHQtPmdldF9hdHRycy5hdHRyX2NvdW50OwotICAgICAgICAgICAgIGlkeCsrKSB7Ci0gICAgICAgICAgbWluX2xlbiArPSA0OwotICAgICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRkFMU0UoQVZSQ19TVFNfQkFEX0NNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX21zZy0+YnJvd3NlX2xlbiA+PSBtaW5fbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cgdG9vIHNob3J0Iik7Ci0KLSAgICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHBfcmVzdWx0LT5nZXRfYXR0cnMucF9hdHRyX2xpc3RbY291bnRdLCBwKTsKLSAgICAgICAgICBpZiAoQVZSQ19JU19WQUxJRF9NRURJQV9BVFRSSUJVVEUoCi0gICAgICAgICAgICAgICAgICBwX3Jlc3VsdC0+Z2V0X2F0dHJzLnBfYXR0cl9saXN0W2NvdW50XSkpIHsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfYXR0cnMuYXR0cl9jb3VudCAhPSBjb3VudCAmJiBjb3VudCA9PSAwKQotICAgICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9QQVJBTTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBfcmVzdWx0LT5nZXRfYXR0cnMuYXR0cl9jb3VudCA9IGNvdW50OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUERVX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVM6IC8qIDB4NzUgKi8KLSAgICAgICsrbWluX2xlbjsKLSAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRkFMU0UoQVZSQ19TVFNfQkFEX0NNRCwgKHBfbXNnLT5icm93c2VfbGVuID49IG1pbl9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIHRvbyBzaG9ydCIpOwotCi0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgocF9yZXN1bHQtPmdldF9udW1fb2ZfaXRlbXMuc2NvcGUsIHApOwotICAgICAgaWYgKHBfcmVzdWx0LT5nZXRfbnVtX29mX2l0ZW1zLnNjb3BlID4gQVZSQ19TQ09QRV9OT1dfUExBWUlORykgewotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19CQURfU0NPUEU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVZSQ19QRFVfU0VBUkNIOiAvKiAweDgwICovCi0gICAgICBtaW5fbGVuICs9IDQ7Ci0gICAgICBSRVRVUk5fU1RBVFVTX0lGX0ZBTFNFKEFWUkNfU1RTX0JBRF9DTUQsIChwX21zZy0+YnJvd3NlX2xlbiA+PSBtaW5fbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyB0b28gc2hvcnQiKTsKLQotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX3Jlc3VsdC0+c2VhcmNoLnN0cmluZy5jaGFyc2V0X2lkLCBwKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9yZXN1bHQtPnNlYXJjaC5zdHJpbmcuc3RyX2xlbiwgcCk7Ci0gICAgICBwX3Jlc3VsdC0+c2VhcmNoLnN0cmluZy5wX3N0ciA9IHBfYnVmOwotICAgICAgaWYgKHBfYnVmKSB7Ci0gICAgICAgIGlmIChwX3Jlc3VsdC0+c2VhcmNoLnN0cmluZy5zdHJfbGVuID4gYnVmX2xlbikgewotICAgICAgICAgIHBfcmVzdWx0LT5zZWFyY2guc3RyaW5nLnN0cl9sZW4gPSBidWZfbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjMxNDYyMzciKTsKLSAgICAgICAgfQotICAgICAgICBtaW5fbGVuICs9IHBfcmVzdWx0LT5zZWFyY2guc3RyaW5nLnN0cl9sZW47Ci0gICAgICAgIFJFVFVSTl9TVEFUVVNfSUZfRkFMU0UoQVZSQ19TVFNfQkFEX0NNRCwgKHBfbXNnLT5icm93c2VfbGVuID49IG1pbl9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cgdG9vIHNob3J0Iik7Ci0KLSAgICAgICAgQkVfU1RSRUFNX1RPX0FSUkFZKHAsIHBfYnVmLCBwX3Jlc3VsdC0+c2VhcmNoLnN0cmluZy5zdHJfbGVuKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YXR1cyA9IEFWUkNfU1RTX0JBRF9DTUQ7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19QYXJzQ29tbWFuZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBhIHN1cGVyc2V0IG9mIEFWUkNfUGFyc01ldGFkYXRhIHRvIHBhcnNlCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBtZXNzYWdlIGluIHBfZGF0YSBpcyBwYXJzZWQKLSAqICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlIGRlZmluZWQgYnkgQVZSQ1AgMS40Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVlJDX1NUUyBBVlJDX1BhcnNDb21tYW5kKHRBVlJDX01TRyogcF9tc2csIHRBVlJDX0NPTU1BTkQqIHBfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9idWYsIHVpbnQxNl90IGJ1Zl9sZW4pIHsKLSAgdEFWUkNfU1RTIHN0YXR1cyA9IEFWUkNfU1RTX0lOVEVSTkFMX0VSUjsKLSAgdWludDE2X3QgaWQ7Ci0KLSAgaWYgKHBfbXNnICYmIHBfcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChwX21zZy0+aGRyLm9wY29kZSkgewotICAgICAgY2FzZSBBVlJDX09QX1ZFTkRPUjogLyogIDB4MDAgICAgVmVuZG9yLWRlcGVuZGVudCBjb21tYW5kcyAqLwotICAgICAgICBzdGF0dXMgPSBhdnJjX3BhcnNfdmVuZG9yX2NtZCgmcF9tc2ctPnZlbmRvciwgcF9yZXN1bHQsIHBfYnVmLCBidWZfbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19PUF9QQVNTX1RIUlU6IC8qICAweDdDICAgIHBhbmVsIHN1YnVuaXQgb3Bjb2RlICovCi0gICAgICAgIHN0YXR1cyA9IGF2cmNfcGFyc19wYXNzX3RocnUoJnBfbXNnLT5wYXNzLCAmaWQpOwotICAgICAgICBpZiAoc3RhdHVzID09IEFWUkNfU1RTX05PX0VSUk9SKSB7Ci0gICAgICAgICAgcF9yZXN1bHQtPnBkdSA9ICh1aW50OF90KWlkOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfT1BfQlJPV1NFOgotICAgICAgICBzdGF0dXMgPQotICAgICAgICAgICAgYXZyY19wYXJzX2Jyb3dzaW5nX2NtZCgmcF9tc2ctPmJyb3dzZSwgcF9yZXN1bHQsIHBfYnVmLCBidWZfbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFWUkNfVFJBQ0VfRVJST1IoIiVzIHVua25vd24gb3Bjb2RlOjB4JXgiLCBfX2Z1bmNfXywgcF9tc2ctPmhkci5vcGNvZGUpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcF9yZXN1bHQtPmNtZC5vcGNvZGUgPSBwX21zZy0+aGRyLm9wY29kZTsKLSAgICBwX3Jlc3VsdC0+Y21kLnN0YXR1cyA9IHN0YXR1czsKLSAgfQotICBBVlJDX1RSQUNFX0RFQlVHKCIlcyByZXR1cm4gc3RhdHVzOjB4JXgiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2cmMvYXZyY19zZHAuY2MgYi9zdGFjay9hdnJjL2F2cmNfc2RwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE2NTY0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2F2cmMvYXZyY19zZHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBBVlJDUCBTRFAgcmVsYXRlZCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZyY19hcGkuaCIKLSNpbmNsdWRlICJhdnJjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBHbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QVZSQ19DQiBhdnJjX2NiOwotc3RhdGljIHVpbnQxNl90IGEyZHBfYXR0cl9saXN0X3NkcFtdID0gewotICAgIEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNULCAvKiB1cGRhdGUgQTJEUF9OVU1fQVRUUiwgaWYgY2hhbmdlZCAqLwotICAgIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1QsICBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICBBVFRSX0lEX1NFUlZJQ0VfTkFNRSwgICAgICAgICAgQVRUUl9JRF9QUk9UT0NPTF9ERVNDX0xJU1QsCi0gICAgQVRUUl9JRF9QUk9WSURFUl9OQU1FfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXZyY19zZHBfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIFNEUCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IEEyRFBfRmluZFNlcnZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCBieSBTRFAgd2hlbiB0aGUgc2VydmljZQotICogICAgICAgICAgICAgICAgICBzZWFyY2ggaXMgY29tcGxldGVkLiAgSWYgdGhlIHNlYXJjaCBpcyBzdWNjZXNzZnVsLCBpdAotICogICAgICAgICAgICAgICAgICBmaW5kcyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBkYXRhYmFzZSB0aGF0IG1hdGNoZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIFVVSUQgb2YgdGhlIHNlYXJjaC4gIFRoZW4gcmV0cmlldmVzIHZhcmlvdXMgcGFyYW1ldGVycwotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSByZWNvcmQuICBXaGVuIGl0IGlzIGZpbmlzaGVkIGl0IGNhbGxzIHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXZyY19zZHBfY2JhY2sodFNEUF9TVEFUVVMgc3RhdHVzKSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlcyBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0KLSAgLyogcmVzZXQgc2VydmljZV91dWlkLCBzbyBjYW4gc3RhcnQgYW5vdGhlciBmaW5kIHNlcnZpY2UgKi8KLSAgYXZyY19jYi5zZXJ2aWNlX3V1aWQgPSAwOwotCi0gIC8qIHJldHVybiBpbmZvIGZyb20gc2RwIHJlY29yZCBpbiBhcHAgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgYXZyY19jYi5maW5kX2NiYWNrLlJ1bihzdGF0dXMpOwotCi0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19GaW5kU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgc2VydmljZSBkaXNjb3ZlcnkgYW5kIHJldHJpZXZlIEFWUkNQIFNEUCByZWNvcmQgaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICAgICAgZnJvbSBhIHBlZXIgZGV2aWNlLiAgSW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZm9yIHRoZSBmaXJzdAotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIHJlY29yZCBmb3VuZCBvbiB0aGUgc2VydmVyIHRoYXQgbWF0Y2hlcyB0aGUgc2VydmljZQotICogICAgICAgICAgICAgICAgICBVVUlELiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgZGlzY292ZXJ5IGlzIGNvbXBsZXRlLiAgVGhlcmUgY2FuIG9ubHkgYmUgb25lIG91dHN0YW5kaW5nCi0gKiAgICAgICAgICAgICAgICAgIGNhbGwgdG8gQVZSQ19GaW5kU2VydmljZSgpIGF0IGEgdGltZTsgdGhlIGFwcGxpY2F0aW9uIG11c3QKLSAqICAgICAgICAgICAgICAgICAgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIGJlZm9yZSBpdCBtYWtlcyBhbm90aGVyIGNhbGwgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nCi0gKiAgICAgICAgICAgICAgICAgIG1lbW9yeSBmb3IgdGhlIGRpc2NvdmVyeSBkYXRhYmFzZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGRpc2NvdmVyeSBkYXRhYmFzZSBiZSBhdCBsZWFzdCAzMDAgYnl0ZXMuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBjYW4gZGVhbGxvY2F0ZSB0aGUgbWVtb3J5IGFmdGVyIHRoZQotICogICAgICAgICAgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiBoYXMgZXhlY3V0ZWQuCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgc2VydmljZV91dWlkOiBJbmRpY2F0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEcoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciBDVChVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCkKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyOiAgQkQgYWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcF9kYjogIFNEUCBkaXNjb3ZlcnkgZGF0YWJhc2UgcGFyYW1ldGVycy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NiYWNrOiAgUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBPdXRwdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19CQURfUEFSQU1TIGlmIGRpc2NvdmVyeSBkYXRhYmFzZSBwYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgICAgICBpbnZhbGlkLgotICogICAgICAgICAgICAgICAgICBBVlJDX05PX1JFU09VUkNFUyBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCByZXNvdXJjZXMgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSB0aGUgc2VydmljZSBzZWFyY2guCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQVZSQ19GaW5kU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1NEUF9EQl9QQVJBTVMqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBVlJDX0ZJTkRfQ0JBQ0smIGZpbmRfY2JhY2spIHsKLSAgYm9vbCByZXN1bHQgPSB0cnVlOwotCi0gIEFWUkNfVFJBQ0VfQVBJKCIlcyB1dWlkOiAleCIsIF9fZnVuY19fLCBzZXJ2aWNlX3V1aWQpOwotICBpZiAoKHNlcnZpY2VfdXVpZCAhPSBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQgJiYKLSAgICAgICBzZXJ2aWNlX3V1aWQgIT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpIHx8Ci0gICAgICBwX2RiID09IE5VTEwgfHwgcF9kYi0+cF9kYiA9PSBOVUxMIHx8IGZpbmRfY2JhY2suaXNfbnVsbCgpKQotICAgIHJldHVybiBBVlJDX0JBRF9QQVJBTTsKLQotICAvKiBjaGVjayBpZiBpdCBpcyBidXN5ICovCi0gIGlmIChhdnJjX2NiLnNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQgfHwKLSAgICAgIGF2cmNfY2Iuc2VydmljZV91dWlkID09IFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MKQotICAgIHJldHVybiBBVlJDX05PX1JFU09VUkNFUzsKLQotCi0gIGlmIChwX2RiLT5wX2F0dHJzID09IE5VTEwgfHwgcF9kYi0+bnVtX2F0dHIgPT0gMCkgewotICAgIHBfZGItPnBfYXR0cnMgPSBhMmRwX2F0dHJfbGlzdF9zZHA7Ci0gICAgcF9kYi0+bnVtX2F0dHIgPSBBVlJDX05VTV9BVFRSOwotICB9Ci0KLSAgVXVpZCB1dWlkX2xpc3QgPSBVdWlkOjpGcm9tMTZCaXQoc2VydmljZV91dWlkKTsKLSAgcmVzdWx0ID0gU0RQX0luaXREaXNjb3ZlcnlEYihwX2RiLT5wX2RiLCBwX2RiLT5kYl9sZW4sIDEsICZ1dWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYi0+bnVtX2F0dHIsIHBfZGItPnBfYXR0cnMpOwotCi0gIGlmIChyZXN1bHQpIHsKLSAgICAvKiBzdG9yZSBzZXJ2aWNlX3V1aWQgYW5kIGRpc2NvdmVyeSBkYiBwb2ludGVyICovCi0gICAgYXZyY19jYi5wX2RiID0gcF9kYi0+cF9kYjsKLSAgICBhdnJjX2NiLnNlcnZpY2VfdXVpZCA9IHNlcnZpY2VfdXVpZDsKLSAgICBhdnJjX2NiLmZpbmRfY2JhY2sgPSBmaW5kX2NiYWNrOwotCi0gICAgLyogcGVyZm9ybSBzZXJ2aWNlIHNlYXJjaCAqLwotICAgIHJlc3VsdCA9Ci0gICAgICAgIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdChiZF9hZGRyLCBwX2RiLT5wX2RiLCBhdnJjX3NkcF9jYmFjayk7Ci0KLSAgICBpZiAoIXJlc3VsdCkgewotICAgICAgQVZSQ19UUkFDRV9FUlJPUigiJXM6IEZhaWxlZCB0byBpbml0IFNEUCBmb3IgcGVlciAlcyIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBhdnJjX3NkcF9jYmFjayhTRFBfR0VORVJJQ19FUlJPUik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChyZXN1bHQgPyBBVlJDX1NVQ0NFU1MgOiBBVlJDX0ZBSUwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0FkZFJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYnVpbGQgYW4gQVZSQ1AgU0RQIHJlY29yZC4KLSAqICAgICAgICAgICAgICAgICAgUHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGNhbGwgU0RQX0NyZWF0ZVJlY29yZCgpIHRvIGNyZWF0ZSBhbiBTRFAgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZDogIEluZGljYXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEcoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgQ1QoVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX25hbWU6ICBQb2ludGVyIHRvIGEgbnVsbC10ZXJtaW5hdGVkIGNoYXJhY3RlcgotICogICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNlcnZpY2UgbmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHNlcnZpY2UgbmFtZSBpcyBub3QgdXNlZCBzZXQgdGhpcyB0byBOVUxMLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfcHJvdmlkZXJfbmFtZTogIFBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgcHJvdmlkZXIgbmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHByb3ZpZGVyIG5hbWUgaXMgbm90IHVzZWQgc2V0IHRoaXMgdG8gTlVMTC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOiAgU3VwcG9ydGVkIGNhdGVnb3JpZXMuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgc2RwX2hhbmRsZTogIFNEUCBoYW5kbGUgcmV0dXJuZWQgYnkgU0RQX0NyZWF0ZVJlY29yZCgpLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZV9zdXBwb3J0ZWQ6ICBicm93c2Ugc3VwcG9ydCBpbmZvLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfdmVyc2lvbjogIHByb2ZpbGUgdmVyc2lvbiBvZiBhdnJjcCByZWNvcmQuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgY292ZXJfYXJ0X3BzbTogVGhlIFBTTSBvZiBhIGNvdmVyIGFydCBzZXJ2aWNlLCBpZgotICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLiBVc2UgMCBPdGhlcndpc2UuIElnbm9yZWQgb24gY29udHJvbGxlcgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfTk9fUkVTT1VSQ0VTIGlmIG5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGJ1aWxkIHRoZSBTRFAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEFWUkNfQWRkUmVjb3JkKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgY29uc3QgY2hhciogcF9zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX3Byb3ZpZGVyX25hbWUsIHVpbnQxNl90IGNhdGVnb3JpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlLCBib29sIGJyb3dzZV9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9maWxlX3ZlcnNpb24sIHVpbnQxNl90IGNvdmVyX2FydF9wc20pIHsKLSAgdWludDE2X3QgYnJvd3NlX2xpc3RbMV07Ci0gIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKLSAgdWludDhfdCB0ZW1wWzhdOwotICB1aW50OF90KiBwOwotICB1aW50MTZfdCBjb3VudCA9IDE7Ci0gIHVpbnQ4X3QgaW5kZXggPSAwOwotICB1aW50MTZfdCBjbGFzc19saXN0WzJdOwotCi0gIEFWUkNfVFJBQ0VfQVBJKCIlczogQWRkIEFWUkNQIFNEUCByZWNvcmQsIHV1aWQ6ICV4LCBwcm9maWxlX3ZlcnNpb246IDB4JXgsICIKLSAgICAgICJzdXBwb3J0ZWRfZmVhdHVyZXM6IDB4JXgsIHBzbTogMHgleCIsIF9fZnVuY19fLCBzZXJ2aWNlX3V1aWQsCi0gICAgICBwcm9maWxlX3ZlcnNpb24sIGNhdGVnb3JpZXMsIGNvdmVyX2FydF9wc20pOwotCi0gIGlmIChzZXJ2aWNlX3V1aWQgIT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUICYmCi0gICAgICBzZXJ2aWNlX3V1aWQgIT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpCi0gICAgcmV0dXJuIEFWUkNfQkFEX1BBUkFNOwotCi0gIC8qIGFkZCBzZXJ2aWNlIGNsYXNzIGlkIGxpc3QgKi8KLSAgY2xhc3NfbGlzdFswXSA9IHNlcnZpY2VfdXVpZDsKLSAgaWYgKChzZXJ2aWNlX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wpICYmCi0gICAgICAocHJvZmlsZV92ZXJzaW9uID4gQVZSQ19SRVZfMV8zKSkgewotICAgIGNsYXNzX2xpc3RbMV0gPSBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9DT05UUk9MOwotICAgIGNvdW50ID0gMjsKLSAgfQotICByZXN1bHQgJj0gU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChzZHBfaGFuZGxlLCBjb3VudCwgY2xhc3NfbGlzdCk7Ci0KLSAgdWludDE2X3QgcHJvdG9jb2xfcmVwb3J0ZWRfdmVyc2lvbjsKLSAgLyogQVZSQ1AgdmVyc2lvbnMgMS4zIHRvIDEuNSByZXBvcnQgKHZlcnNpb24gLSAxKSBpbiB0aGUgcHJvdG9jb2wKLSAgICAgZGVzY3JpcHRvciBsaXN0LiBPaCwgYW5kIDEuNiBhbmQgMS42LjEgcmVwb3J0IHZlcnNpb24gMS40LgotICAgICAvYmVjYXVzZS13ZS1zbWFydCAqLwotICBpZiAocHJvZmlsZV92ZXJzaW9uIDwgQVZSQ19SRVZfMV82KSB7Ci0gICAgcHJvdG9jb2xfcmVwb3J0ZWRfdmVyc2lvbiA9IHByb2ZpbGVfdmVyc2lvbiAtIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcHJvdG9jb2xfcmVwb3J0ZWRfdmVyc2lvbiA9IEFWQ1RfUkVWXzFfNDsKLSAgfQotCi0gIC8qIGFkZCBwcm90b2NvbCBkZXNjcmlwdG9yIGxpc3QgKi8KLSAgdFNEUF9QUk9UT0NPTF9FTEVNIGF2cmNfcHJvdG9fZGVzY19saXN0W0FWUkNfTlVNX1BST1RPX0VMRU1TXTsKLSAgYXZyY19wcm90b19kZXNjX2xpc3RbMF0ubnVtX3BhcmFtcyA9IDE7Ci0gIGF2cmNfcHJvdG9fZGVzY19saXN0WzBdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0wyQ0FQOwotICBhdnJjX3Byb3RvX2Rlc2NfbGlzdFswXS5wYXJhbXNbMF0gPSBBVkNUX1BTTTsKLSAgYXZyY19wcm90b19kZXNjX2xpc3RbMF0ucGFyYW1zWzFdID0gMDsKLSAgZm9yIChpbmRleCA9IDE7IGluZGV4IDwgQVZSQ19OVU1fUFJPVE9fRUxFTVM7IGluZGV4KyspIHsKLSAgICBhdnJjX3Byb3RvX2Rlc2NfbGlzdFtpbmRleF0ubnVtX3BhcmFtcyA9IDE7Ci0gICAgYXZyY19wcm90b19kZXNjX2xpc3RbaW5kZXhdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0FWQ1RQOwotICAgIGF2cmNfcHJvdG9fZGVzY19saXN0W2luZGV4XS5wYXJhbXNbMF0gPSBwcm90b2NvbF9yZXBvcnRlZF92ZXJzaW9uOwotICAgIGF2cmNfcHJvdG9fZGVzY19saXN0W2luZGV4XS5wYXJhbXNbMV0gPSAwOwotICB9Ci0gIHJlc3VsdCAmPSBTRFBfQWRkUHJvdG9jb2xMaXN0KHNkcF9oYW5kbGUsIEFWUkNfTlVNX1BST1RPX0VMRU1TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZyY19wcm90b19kZXNjX2xpc3RbMF0pOwotCi0gIC8qIGFkZGl0aW9uYWwgcHJvdG9jYWwgZGVzY3JpcHRvciwgcmVxdWlyZWQgb25seSBmb3IgdmVyc2lvbiA+IDEuMyAqLwotICBpZiAocHJvZmlsZV92ZXJzaW9uID4gQVZSQ19SRVZfMV8zKSB7Ci0gICAgaW50IG51bV9hZGRpdGlvbmFsX3Byb3RvY29scyA9IDA7Ci0gICAgaW50IGkgPSAwOwotICAgIHRTRFBfUFJPVE9fTElTVF9FTEVNIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbMl07Ci0KLSAgICAvKiBJZiB3ZSBzdXBwb3J0IGJyb3dzaW5nIHRoZW4gYWRkIHRoZSBsaXN0ICovCi0gICAgaWYgKGJyb3dzZV9zdXBwb3J0ZWQpIHsKLSAgICAgIEFWUkNfVFJBQ0VfQVBJKCIlczogQWRkIEJyb3dzaW5nIFBTTSB0byBhZGRpdG9uYWwgcHJvdG9jb2wgZGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgICAgICAgICIgbGlzdHMiLCBfX2Z1bmNfXyk7Ci0gICAgICBudW1fYWRkaXRpb25hbF9wcm90b2NvbHMrKzsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubnVtX2VsZW1zID0gMjsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzBdLm51bV9wYXJhbXMgPSAxOwotICAgICAgYXZyY19hZGRfcHJvdG9fZGVzY19saXN0c1tpXS5saXN0X2VsZW1bMF0ucHJvdG9jb2xfdXVpZCA9Ci0gICAgICAgICAgVVVJRF9QUk9UT0NPTF9MMkNBUDsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzBdLnBhcmFtc1swXSA9IEFWQ1RfQlJfUFNNOwotICAgICAgYXZyY19hZGRfcHJvdG9fZGVzY19saXN0c1tpXS5saXN0X2VsZW1bMF0ucGFyYW1zWzFdID0gMDsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzFdLm51bV9wYXJhbXMgPSAxOwotICAgICAgYXZyY19hZGRfcHJvdG9fZGVzY19saXN0c1tpXS5saXN0X2VsZW1bMV0ucHJvdG9jb2xfdXVpZCA9Ci0gICAgICAgICAgVVVJRF9QUk9UT0NPTF9BVkNUUDsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzFdLnBhcmFtc1swXSA9Ci0gICAgICAgICAgcHJvdG9jb2xfcmVwb3J0ZWRfdmVyc2lvbjsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzFdLnBhcmFtc1sxXSA9IDA7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gICAgLyogQWRkIHRoZSBCSVAgUFNNIGZvciBjb3ZlciBhcnQgb24gMS42KyB0YXJnZXQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgaXQgKi8KLSAgICBpZiAocHJvZmlsZV92ZXJzaW9uID49IEFWUkNfUkVWXzFfNiAmJgotICAgICAgICBzZXJ2aWNlX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfVEFSR0VUICYmCi0gICAgICAgIGNvdmVyX2FydF9wc20gPiAwKSB7Ci0gICAgICBBVlJDX1RSQUNFX0FQSSgiJXM6IEFkZCBBVlJDUCBCSVAgUFNNIHRvIGFkZGl0b25hbCBwcm90b2NvbCBkZXNjcmlwdG9yIgotICAgICAgICAgICAgICAgICAgICAgIiBsaXN0cywgcHNtOiAweCV4IiwgX19mdW5jX18sIGNvdmVyX2FydF9wc20pOwotICAgICAgbnVtX2FkZGl0aW9uYWxfcHJvdG9jb2xzKys7Ci0gICAgICBhdnJjX2FkZF9wcm90b19kZXNjX2xpc3RzW2ldLm51bV9lbGVtcyA9IDI7Ci0gICAgICBhdnJjX2FkZF9wcm90b19kZXNjX2xpc3RzW2ldLmxpc3RfZWxlbVswXS5udW1fcGFyYW1zID0gMTsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzBdLnByb3RvY29sX3V1aWQgPQotICAgICAgICAgIFVVSURfUFJPVE9DT0xfTDJDQVA7Ci0gICAgICBhdnJjX2FkZF9wcm90b19kZXNjX2xpc3RzW2ldLmxpc3RfZWxlbVswXS5wYXJhbXNbMF0gPSBjb3Zlcl9hcnRfcHNtOwotICAgICAgYXZyY19hZGRfcHJvdG9fZGVzY19saXN0c1tpXS5saXN0X2VsZW1bMF0ucGFyYW1zWzFdID0gMDsKLSAgICAgIGF2cmNfYWRkX3Byb3RvX2Rlc2NfbGlzdHNbaV0ubGlzdF9lbGVtWzFdLm51bV9wYXJhbXMgPSAwOwotICAgICAgYXZyY19hZGRfcHJvdG9fZGVzY19saXN0c1tpXS5saXN0X2VsZW1bMV0ucHJvdG9jb2xfdXVpZCA9Ci0gICAgICAgICAgVVVJRF9QUk9UT0NPTF9PQkVYOwotICAgICAgYXZyY19hZGRfcHJvdG9fZGVzY19saXN0c1tpXS5saXN0X2VsZW1bMV0ucGFyYW1zWzBdID0gMDsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICAvKiBBZGQgdGhlIGFkZGl0aW9uYWwgbGlzdHMgaWYgd2Ugc3VwcG9ydCBhbnkgKi8KLSAgICBpZiAobnVtX2FkZGl0aW9uYWxfcHJvdG9jb2xzID4gMCkgewotICAgICAgQVZSQ19UUkFDRV9BUEkoIiVzOiBBZGQgJWQgYWRkaXRvbmFsIHByb3RvY29sIGRlc2NyaXB0b3IgbGlzdHMiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG51bV9hZGRpdGlvbmFsX3Byb3RvY29scyk7Ci0gICAgICByZXN1bHQgJj0gU0RQX0FkZEFkZGl0aW9uUHJvdG9MaXN0cyhzZHBfaGFuZGxlLCBudW1fYWRkaXRpb25hbF9wcm90b2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnJjX2FkZF9wcm90b19kZXNjX2xpc3RzKTsKLSAgICB9Ci0gIH0KLSAgLyogYWRkIHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ICAgKi8KLSAgcmVzdWx0ICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoCi0gICAgICBzZHBfaGFuZGxlLCBVVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCwgcHJvZmlsZV92ZXJzaW9uKTsKLQotICAvKiBhZGQgc3VwcG9ydGVkIGNhdGVnb3JpZXMgKi8KLSAgcCA9IHRlbXA7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgY2F0ZWdvcmllcyk7Ci0gIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgKHVpbnQzMl90KTIsICh1aW50OF90Kil0ZW1wKTsKLQotICAvKiBhZGQgcHJvdmlkZXIgbmFtZSAqLwotICBpZiAocF9wcm92aWRlcl9uYW1lICE9IE5VTEwpIHsKLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZSgKLSAgICAgICAgc2RwX2hhbmRsZSwgQVRUUl9JRF9QUk9WSURFUl9OQU1FLCBURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfcHJvdmlkZXJfbmFtZSkgKyAxKSwgKHVpbnQ4X3QqKXBfcHJvdmlkZXJfbmFtZSk7Ci0gIH0KLQotICAvKiBhZGQgc2VydmljZSBuYW1lICovCi0gIGlmIChwX3NlcnZpY2VfbmFtZSAhPSBOVUxMKSB7Ci0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoCi0gICAgICAgIHNkcF9oYW5kbGUsIEFUVFJfSURfU0VSVklDRV9OQU1FLCBURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfc2VydmljZV9uYW1lKSArIDEpLCAodWludDhfdCopcF9zZXJ2aWNlX25hbWUpOwotICB9Ci0KLSAgLyogYWRkIGJyb3dzZSBncm91cCBsaXN0ICovCi0gIGJyb3dzZV9saXN0WzBdID0gVVVJRF9TRVJWQ0xBU1NfUFVCTElDX0JST1dTRV9HUk9VUDsKLSAgcmVzdWx0ICY9IFNEUF9BZGRVdWlkU2VxdWVuY2Uoc2RwX2hhbmRsZSwgQVRUUl9JRF9CUk9XU0VfR1JPVVBfTElTVCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlX2xpc3QpOwotCi0gIHJldHVybiAocmVzdWx0ID8gQVZSQ19TVUNDRVNTIDogQVZSQ19GQUlMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgICBBVlJDX1JlbW92ZVJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhbiBBVlJDUCBTRFAgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgc2RwX2hhbmRsZTogIEhhbmRsZSB5b3UgdXNlZCB3aXRoIEFWUkNfQWRkUmVjb3JkCi0gKgotICogUmV0dXJucyAgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgICBBVlJDX0ZBSUwgb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBBVlJDX1JlbW92ZVJlY29yZCh1aW50MzJfdCBzZHBfaGFuZGxlKSB7Ci0gIEFWUkNfVFJBQ0VfQVBJKCIlczogcmVtb3ZlIEFWUkNQIFNEUCByZWNvcmQiLCBfX2Z1bmNfXyk7Ci0gIGJvb2wgcmVzdWx0ID0gU0RQX0RlbGV0ZVJlY29yZChzZHBfaGFuZGxlKTsKLSAgcmV0dXJuIChyZXN1bHQgPyBBVlJDX1NVQ0NFU1MgOiBBVlJDX0ZBSUwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBBVlJDLiBJZiAweGZmIGlzIHBhc3NlZCwgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdHJhY2UgbGV2ZWwgaXMgcmV0dXJuZWQuCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgbmV3X2xldmVsOiAgVGhlIGxldmVsIHRvIHNldCB0aGUgQVZSQyB0cmFjaW5nIHRvOgotICogICAgICAgICAgICAgICAgICAgICAgMHhmZi1yZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcuCi0gKiAgICAgICAgICAgICAgICAgICAgICAwLXR1cm5zIG9mZiB0cmFjaW5nLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMS1FcnJvcnMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAyLVdhcm5pbmdzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMy1BUElzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gNC1FdmVudHMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSA1LURlYnVnLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG5ldyB0cmFjZSBsZXZlbCBvciBjdXJyZW50IHRyYWNlIGxldmVsIGlmCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgMHhmZi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEFWUkNfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBpZiAobmV3X2xldmVsICE9IDB4RkYpIGF2cmNfY2IudHJhY2VfbGV2ZWwgPSBuZXdfbGV2ZWw7Ci0KLSAgcmV0dXJuIChhdnJjX2NiLnRyYWNlX2xldmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfSW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgc3RhY2sgc3RhcnR1cCB0byBhbGxvY2F0ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayAoaWYgdXNpbmcgZHluYW1pYyBtZW1vcnkpLCBhbmQgaW5pdGlhbGl6ZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgYW5kIHRyYWNpbmcgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQVZSQ19Jbml0KHZvaWQpIHsKLSAgbWVtc2V0KCZhdnJjX2NiLCAwLCBzaXplb2YodEFWUkNfQ0IpKTsKLQotI2lmIGRlZmluZWQoQVZSQ19JTklUSUFMX1RSQUNFX0xFVkVMKQotICBhdnJjX2NiLnRyYWNlX2xldmVsID0gQVZSQ19JTklUSUFMX1RSQUNFX0xFVkVMOwotI2Vsc2UKLSAgYXZyY19jYi50cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX05PTkU7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2F2cmMvYXZyY191dGlscy5jYyBiL3N0YWNrL2F2cmMvYXZyY191dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4NDM1NC4uMDAwMDAwMAotLS0gYS9zdGFjay9hdnJjL2F2cmNfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMy0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2cmNfYXBpLmgiCi0jaW5jbHVkZSAiYXZyY19pbnQuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0lzVmFsaWRBdmNUeXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiBjb3JyZWN0IEFWQyB0eXBlIGlzIHNwZWNpZmllZAotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyB0cnVlIGlmIGl0IGlzIHZhbGlkCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEFWUkNfSXNWYWxpZEF2Y1R5cGUodWludDhfdCBwZHVfaWQsIHVpbnQ4X3QgYXZjX3R5cGUpIHsKLSAgYm9vbCByZXN1bHQgPSBmYWxzZTsKLQotICBpZiAoYXZjX3R5cGUgPCBBVlJDX1JTUF9OT1RfSU1QTCkgLyogY29tbWFuZCBtc2cgKi8KLSAgewotICAgIHN3aXRjaCAocGR1X2lkKSB7Ci0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9DQVBBQklMSVRJRVM6ICAgICAgICAgIC8qIDB4MTAgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX0FUVFI6ICAgICAgLyogMHgxMSAqLwotICAgICAgY2FzZSBBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfVkFMVUVTOiAgICAvKiAweDEyICovCi0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9DVVJfUExBWUVSX0FQUF9WQUxVRTogIC8qIDB4MTMgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlFUl9BUFBfQVRUUl9URVhUOiAgLyogMHgxNSAqLwotICAgICAgY2FzZSBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9WQUxVRV9URVhUOiAvKiAweDE2ICovCi0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9FTEVNRU5UX0FUVFI6ICAgICAgICAgIC8qIDB4MjAgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTOiAgICAgICAgICAgLyogMHgzMCAqLwotICAgICAgICBpZiAoYXZjX3R5cGUgPT0gQVZSQ19DTURfU1RBVFVTKSByZXN1bHQgPSB0cnVlOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBVlJDX1BEVV9TRVRfUExBWUVSX0FQUF9WQUxVRTogICAgICAvKiAweDE0ICovCi0gICAgICBjYXNlIEFWUkNfUERVX0lORk9STV9ESVNQTEFZX0NIQVJTRVQ6ICAgIC8qIDB4MTcgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfSU5GT1JNX0JBVFRFUllfU1RBVF9PRl9DVDogLyogMHgxOCAqLwotICAgICAgY2FzZSBBVlJDX1BEVV9SRVFVRVNUX0NPTlRJTlVBVElPTl9SU1A6ICAvKiAweDQwICovCi0gICAgICBjYXNlIEFWUkNfUERVX0FCT1JUX0NPTlRJTlVBVElPTl9SU1A6ICAgIC8qIDB4NDEgKi8KLSAgICAgICAgaWYgKGF2Y190eXBlID09IEFWUkNfQ01EX0NUUkwpIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVM6IC8qIDB4NzEgKi8KLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQVZSQ19QRFVfU0VUX0FCU09MVVRFX1ZPTFVNRTogIC8qIDB4NTAgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfU0VUX0FERFJFU1NFRF9QTEFZRVI6IC8qIDB4NjAgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfUExBWV9JVEVNOiAgICAgICAgICAgIC8qIDB4NzQgKi8KLSAgICAgIGNhc2UgQVZSQ19QRFVfQUREX1RPX05PV19QTEFZSU5HOiAgIC8qIDB4OTAgKi8KLSAgICAgICAgaWYgKGF2Y190eXBlID09IEFWUkNfQ01EX0NUUkwpIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFWUkNfUERVX1JFR0lTVEVSX05PVElGSUNBVElPTjogLyogMHgzMSAqLwotICAgICAgICBpZiAoYXZjX3R5cGUgPT0gQVZSQ19DTURfTk9USUYpIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIC8qIHJlc3BvbnNlIG1zZyAqLwotICB7Ci0gICAgaWYgKGF2Y190eXBlID49IEFWUkNfUlNQX05PVF9JTVBMICYmIGF2Y190eXBlIDw9IEFWUkNfUlNQX0lOVEVSSU0pCi0gICAgICByZXN1bHQgPSB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfaXNfdmFsaWRfcGxheWVyX2F0dHJpYl92YWx1ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgdGhlIGdpdmVuIGF0dHJpYiB2YWx1ZSBpcyB2YWxpZCBmb3IgaXRzIGF0dHJpYnV0ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyB0cnVlIGlmIGl0IGlzIHZhbGlkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYXZyY19pc192YWxpZF9wbGF5ZXJfYXR0cmliX3ZhbHVlKHVpbnQ4X3QgYXR0cmliLCB1aW50OF90IHZhbHVlKSB7Ci0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgc3dpdGNoIChhdHRyaWIpIHsKLSAgICBjYXNlIEFWUkNfUExBWUVSX1NFVFRJTkdfRVFVQUxJWkVSOgotICAgICAgaWYgKCh2YWx1ZSA+IDApICYmICh2YWx1ZSA8PSBBVlJDX1BMQVlFUl9WQUxfT04pKSByZXN1bHQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFWUkNfUExBWUVSX1NFVFRJTkdfUkVQRUFUOgotICAgICAgaWYgKCh2YWx1ZSA+IDApICYmICh2YWx1ZSA8PSBBVlJDX1BMQVlFUl9WQUxfR1JPVVBfUkVQRUFUKSkgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BMQVlFUl9TRVRUSU5HX1NIVUZGTEU6Ci0gICAgY2FzZSBBVlJDX1BMQVlFUl9TRVRUSU5HX1NDQU46Ci0gICAgICBpZiAoKHZhbHVlID4gMCkgJiYgKHZhbHVlIDw9IEFWUkNfUExBWUVSX1ZBTF9HUk9VUF9TSFVGRkxFKSkKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGF0dHJpYiA+PSBBVlJDX1BMQVlFUl9TRVRUSU5HX0xPV19NRU5VX0VYVCkgcmVzdWx0ID0gdHJ1ZTsKLQotICBpZiAoIXJlc3VsdCkgewotICAgIEFWUkNfVFJBQ0VfRVJST1IoIiAlcyBmb3VuZCBub3QgbWF0Y2hpbmcgYXR0cmliKHgleCktdmFsdWUoeCV4KSBwYWlyISIsCi0gICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYXR0cmliLCB2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfSXNWYWxpZFBsYXllckF0dHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIGlmIHRoZSBnaXZlbiBhdHRyaWIgdmFsdWUgaXMgYSB2YWxpZCBvbmUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHJldHVybnMgdHJ1ZSBpZiBpdCBpcyB2YWxpZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEFWUkNfSXNWYWxpZFBsYXllckF0dHIodWludDhfdCBhdHRyKSB7Ci0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgaWYgKChhdHRyID49IEFWUkNfUExBWUVSX1NFVFRJTkdfRVFVQUxJWkVSICYmCi0gICAgICAgYXR0ciA8PSBBVlJDX1BMQVlFUl9TRVRUSU5HX1NDQU4pIHx8Ci0gICAgICAoYXR0ciA+PSBBVlJDX1BMQVlFUl9TRVRUSU5HX0xPV19NRU5VX0VYVCkpIHsKLSAgICByZXN1bHQgPSB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfcGFyc19wYXNzX3RocnUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBwYXNzIHRocnUgY29tbWFuZHMgZGVmaW5lZCBieQotICogICAgICAgICAgICAgICAgICBCbHVldG9vdGggU0lHCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlIGRlZmluZWQgYnkgQVZSQ1AgMS40Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRBVlJDX1NUUyBhdnJjX3BhcnNfcGFzc190aHJ1KHRBVlJDX01TR19QQVNTKiBwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3ZlbmRvcl91bmlxdWVfaWQpIHsKLSAgdWludDhfdCogcF9kYXRhOwotICB1aW50MzJfdCBjb19pZDsKLSAgdWludDE2X3QgaWQ7Ci0gIHRBVlJDX1NUUyBzdGF0dXMgPSBBVlJDX1NUU19CQURfQ01EOwotCi0gIGlmIChwX21zZy0+b3BfaWQgPT0gQVZSQ19JRF9WRU5ET1IgJiYKLSAgICAgIHBfbXNnLT5wYXNzX2xlbiA9PSBBVlJDX1BBU1NfVEhSVV9HUk9VUF9MRU4pIHsKLSAgICBwX2RhdGEgPSBwX21zZy0+cF9wYXNzX2RhdGE7Ci0gICAgQVZSQ19CRV9TVFJFQU1fVE9fQ09fSUQoY29faWQsIHBfZGF0YSk7Ci0gICAgaWYgKGNvX2lkID09IEFWUkNfQ09fTUVUQURBVEEpIHsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoaWQsIHBfZGF0YSk7Ci0gICAgICBpZiAoQVZSQ19JU19WQUxJRF9HUk9VUChpZCkpIHsKLSAgICAgICAgKnBfdmVuZG9yX3VuaXF1ZV9pZCA9IGlkOwotICAgICAgICBzdGF0dXMgPSBBVlJDX1NUU19OT19FUlJPUjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfb3Bjb2RlX2Zyb21fcGR1Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9wY29kZSBvZiB0aGUgZ2l2ZW4gcGR1Ci0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX09QX1ZFTkRPUiwgQVZSQ19PUF9QQVNTX1RIUlUgb3IgQVZSQ19PUF9CUk9XU0UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBhdnJjX29wY29kZV9mcm9tX3BkdSh1aW50OF90IHBkdSkgewotICB1aW50OF90IG9wY29kZSA9IDA7Ci0KLSAgc3dpdGNoIChwZHUpIHsKLSAgICBjYXNlIEFWUkNfUERVX1NFVF9CUk9XU0VEX1BMQVlFUjoKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVM6Ci0gICAgY2FzZSBBVlJDX1BEVV9DSEFOR0VfUEFUSDoKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9JVEVNX0FUVFJJQlVURVM6Ci0gICAgY2FzZSBBVlJDX1BEVV9TRUFSQ0g6Ci0gICAgY2FzZSBBVlJDX1BEVV9HRU5FUkFMX1JFSkVDVDoKLSAgICBjYXNlIEFWUkNfUERVX0dFVF9UT1RBTF9OVU1fT0ZfSVRFTVM6Ci0gICAgICBvcGNvZGUgPSBBVlJDX09QX0JST1dTRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVlJDX1BEVV9ORVhUX0dST1VQOgotICAgIGNhc2UgQVZSQ19QRFVfUFJFVl9HUk9VUDogLyogcGFzcyB0aHJ1ICovCi0gICAgICBvcGNvZGUgPSBBVlJDX09QX1BBU1NfVEhSVTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogLyogdmVuZG9yICovCi0gICAgICBvcGNvZGUgPSBBVlJDX09QX1ZFTkRPUjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIG9wY29kZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF2cmNfaXNfdmFsaWRfb3Bjb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9wY29kZSBvZiB0aGUgZ2l2ZW4gcGR1Ci0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX09QX1ZFTkRPUiwgQVZSQ19PUF9QQVNTX1RIUlUgb3IgQVZSQ19PUF9CUk9XU0UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBhdnJjX2lzX3ZhbGlkX29wY29kZSh1aW50OF90IG9wY29kZSkgewotICBib29sIGlzX3ZhbGlkID0gZmFsc2U7Ci0gIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgY2FzZSBBVlJDX09QX0JST1dTRToKLSAgICBjYXNlIEFWUkNfT1BfUEFTU19USFJVOgotICAgIGNhc2UgQVZSQ19PUF9WRU5ET1I6Ci0gICAgICBpc192YWxpZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gaXNfdmFsaWQ7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9ibmVwL2JuZXBfYXBpLmNjIGIvc3RhY2svYm5lcC9ibmVwX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzNWRjYy4uMDAwMDAwMAotLS0gYS9zdGFjay9ibmVwL2JuZXBfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCTkVQIEFQSSBjb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJuZXBfYXBpLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJuZXBfaW50LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9Jbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBCTkVQIHVuaXQuIEl0IHNob3VsZCBiZSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgYmVmb3JlIGFjY2Vzc2luZyBhbnkgb3RoZXIgQVBJcyB0byBpbml0aWFsaXplIHRoZSBjb250cm9sCi0gKiAgICAgICAgICAgICAgICAgIGJsb2NrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJORVBfSW5pdCh2b2lkKSB7Ci0gIG1lbXNldCgmYm5lcF9jYiwgMCwgc2l6ZW9mKHRCTkVQX0NCKSk7Ci0KLSNpZiBkZWZpbmVkKEJORVBfSU5JVElBTF9UUkFDRV9MRVZFTCkKLSAgYm5lcF9jYi50cmFjZV9sZXZlbCA9IEJORVBfSU5JVElBTF9UUkFDRV9MRVZFTDsKLSNlbHNlCi0gIGJuZXBfY2IudHJhY2VfbGV2ZWwgPSBCVF9UUkFDRV9MRVZFTF9OT05FOyAvKiBObyB0cmFjZXMgKi8KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyIGxheWVyIHRvIHJlZ2lzdGVyCi0gKiAgICAgICAgICAgICAgICAgIGl0cyBjYWxsYmFja3Mgd2l0aCBCTkVQCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX3JlZ19pbmZvIC0gY29udGFpbnMgYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICBpZiByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBCTkVQX0ZBSUxVUkUgICAgICAgIGlmIGNvbm5lY3Rpb24gc3RhdGUgY2FsbGJhY2sgaXMgbWlzc2luZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Qk5FUF9SRVNVTFQgQk5FUF9SZWdpc3Rlcih0Qk5FUF9SRUdJU1RFUiogcF9yZWdfaW5mbykgewotICAvKiBUaGVyZSBzaG91bGQgYmUgY29ubmVjdGlvbiBzdGF0ZSBjYWxsIGJhY2sgcmVnaXN0ZXJlZCAqLwotICBpZiAoKCFwX3JlZ19pbmZvKSB8fCAoIShwX3JlZ19pbmZvLT5wX2Nvbm5fc3RhdGVfY2IpKSkKLSAgICByZXR1cm4gQk5FUF9TRUNVUklUWV9GQUlMOwotCi0gIGJuZXBfY2IucF9jb25uX2luZF9jYiA9IHBfcmVnX2luZm8tPnBfY29ubl9pbmRfY2I7Ci0gIGJuZXBfY2IucF9jb25uX3N0YXRlX2NiID0gcF9yZWdfaW5mby0+cF9jb25uX3N0YXRlX2NiOwotICBibmVwX2NiLnBfZGF0YV9pbmRfY2IgPSBwX3JlZ19pbmZvLT5wX2RhdGFfaW5kX2NiOwotICBibmVwX2NiLnBfZGF0YV9idWZfY2IgPSBwX3JlZ19pbmZvLT5wX2RhdGFfYnVmX2NiOwotICBibmVwX2NiLnBfZmlsdGVyX2luZF9jYiA9IHBfcmVnX2luZm8tPnBfZmlsdGVyX2luZF9jYjsKLSAgYm5lcF9jYi5wX21maWx0ZXJfaW5kX2NiID0gcF9yZWdfaW5mby0+cF9tZmlsdGVyX2luZF9jYjsKLSAgYm5lcF9jYi5wX3R4X2RhdGFfZmxvd19jYiA9IHBfcmVnX2luZm8tPnBfdHhfZGF0YV9mbG93X2NiOwotCi0gIGlmIChibmVwX3JlZ2lzdGVyX3dpdGhfbDJjYXAoKSkgcmV0dXJuIEJORVBfU0VDVVJJVFlfRkFJTDsKLQotICBibmVwX2NiLnByb2ZpbGVfcmVnaXN0ZXJlZCA9IHRydWU7Ci0gIHJldHVybiBCTkVQX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX0RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB1cHBlciBsYXllciB0byBkZS1yZWdpc3RlcgotICogICAgICAgICAgICAgICAgICBpdHMgY2FsbGJhY2tzLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgdm9pZAotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCTkVQX0RlcmVnaXN0ZXIodm9pZCkgewotICAvKiBDbGVhciBhbGwgdGhlIGNhbGwgYmFja3MgcmVnaXN0ZXJlZCAqLwotICBibmVwX2NiLnBfY29ubl9pbmRfY2IgPSBOVUxMOwotICBibmVwX2NiLnBfY29ubl9zdGF0ZV9jYiA9IE5VTEw7Ci0gIGJuZXBfY2IucF9kYXRhX2luZF9jYiA9IE5VTEw7Ci0gIGJuZXBfY2IucF9kYXRhX2J1Zl9jYiA9IE5VTEw7Ci0gIGJuZXBfY2IucF9maWx0ZXJfaW5kX2NiID0gTlVMTDsKLSAgYm5lcF9jYi5wX21maWx0ZXJfaW5kX2NiID0gTlVMTDsKLQotICBibmVwX2NiLnByb2ZpbGVfcmVnaXN0ZXJlZCA9IGZhbHNlOwotICBMMkNBX0RlcmVnaXN0ZXIoQlRfUFNNX0JORVApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9Db25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBCTkVQIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcF9yZW1fYWRkciAgLSBCRF9BRERSIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIHNyY191dWlkICAgIC0gc291cmNlIHV1aWQgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGRzdF91dWlkICAgIC0gZGVzdGluYXRpb24gdXVpZCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcF9oYW5kbGUgICAgLSBwb2ludGVyIHRvIHJldHVybiB0aGUgaGFuZGxlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbiBzdGFydGVkCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfTk9fUkVTT1VSQ0VTICAgICAgICAgICBpZiBubyByZXNvdXJjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJORVBfUkVTVUxUIEJORVBfQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBwX3JlbV9iZGEsIGNvbnN0IFV1aWQmIHNyY191dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVdWlkJiBkc3RfdXVpZCwgdWludDE2X3QqIHBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBteF9jaGFuX2lkKSB7Ci0gIHVpbnQxNl90IGNpZDsKLSAgdEJORVBfQ09OTiogcF9iY2IgPSBibmVwdV9maW5kX2JjYl9ieV9iZF9hZGRyKHBfcmVtX2JkYSk7Ci0KLSAgVkxPRygwKSA8PCBfX2Z1bmNfXyA8PCAiIEJEQToiIDw8IHBfcmVtX2JkYTsKLQotICBpZiAoIWJuZXBfY2IucHJvZmlsZV9yZWdpc3RlcmVkKSByZXR1cm4gQk5FUF9XUk9OR19TVEFURTsKLQotICBpZiAoIXBfYmNiKSB7Ci0gICAgcF9iY2IgPSBibmVwdV9hbGxvY2F0ZV9iY2IocF9yZW1fYmRhKTsKLSAgICBpZiAocF9iY2IgPT0gTlVMTCkgcmV0dXJuIChCTkVQX05PX1JFU09VUkNFUyk7Ci0gIH0gZWxzZSBpZiAocF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRCkKLSAgICByZXR1cm4gQk5FUF9XUk9OR19TVEFURTsKLSAgZWxzZSB7Ci0gICAgLyogQmFja3VwIGN1cnJlbnQgVVVJRCB2YWx1ZXMgdG8gcmVzdG9yZSBpZiByb2xlIGNoYW5nZSBmYWlscyAqLwotICAgIHBfYmNiLT5wcnZfc3JjX3V1aWQgPSBwX2JjYi0+c3JjX3V1aWQ7Ci0gICAgcF9iY2ItPnBydl9kc3RfdXVpZCA9IHBfYmNiLT5kc3RfdXVpZDsKLSAgfQotCi0gIC8qIFdlIGFyZSB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIGNvbm5lY3Rpb24gKi8KLSAgcF9iY2ItPmNvbl9mbGFncyB8PSBCTkVQX0ZMQUdTX0lTX09SSUc7Ci0KLSAgcF9iY2ItPnNyY191dWlkID0gc3JjX3V1aWQ7Ci0gIHBfYmNiLT5kc3RfdXVpZCA9IGRzdF91dWlkOwotCi0gIGlmIChwX2JjYi0+Y29uX3N0YXRlID09IEJORVBfU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgLyogVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBhcHByb3ByaWF0ZSBzdGF0ZSwgd2FpdGluZyBmb3IgY29ubmVjdGlvbiBjb25maXJtLgotICAgICAqLwotICAgIHBfYmNiLT5jb25fc3RhdGUgPSBCTkVQX1NUQVRFX1NFQ19DSEVDS0lORzsKLQotICAgIEJORVBfVFJBQ0VfQVBJKCJCTkVQIGluaXRpYXRpbmcgc2VjdXJpdHkgcHJvY2VkdXJlcyBmb3Igc3JjIHV1aWQgJXMiLAotICAgICAgICAgICAgICAgICAgIHBfYmNiLT5zcmNfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgYm5lcF9zZWNfY2hlY2tfY29tcGxldGUoJnBfYmNiLT5yZW1fYmRhLCBCVF9UUkFOU1BPUlRfQlJfRURSLCBwX2JjYik7Ci0gIH0gZWxzZSB7Ci0gICAgLyogVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBhcHByb3ByaWF0ZSBzdGF0ZSwgd2FpdGluZyBmb3IgY29ubmVjdGlvbiBjb25maXJtLgotICAgICAqLwotICAgIHBfYmNiLT5jb25fc3RhdGUgPSBCTkVQX1NUQVRFX0NPTk5fU1RBUlQ7Ci0KLSAgICBjaWQgPSBMMkNBX0Nvbm5lY3RSZXEyKEJUX1BTTV9CTkVQLCBwX2JjYi0+cmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9TRUNfQVVUSEVOVElDQVRFIHwgQlRBX1NFQ19FTkNSWVBUKTsKLSAgICBpZiAoY2lkICE9IDApIHsKLSAgICAgIHBfYmNiLT5sMmNhcF9jaWQgPSBjaWQ7Ci0KLSAgICB9IGVsc2UgewotICAgICAgQk5FUF9UUkFDRV9FUlJPUigiQk5FUCAtIE9yaWdpbmF0ZSBmYWlsZWQiKTsKLSAgICAgIGlmIChibmVwX2NiLnBfY29ubl9zdGF0ZV9jYikKLSAgICAgICAgKCpibmVwX2NiLnBfY29ubl9zdGF0ZV9jYikocF9iY2ItPmhhbmRsZSwgcF9iY2ItPnJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJORVBfQ09OTl9GQUlMRUQsIGZhbHNlKTsKLSAgICAgIGJuZXB1X3JlbGVhc2VfYmNiKHBfYmNiKTsKLSAgICAgIHJldHVybiBCTkVQX0NPTk5fRkFJTEVEOwotICAgIH0KLQotICAgIC8qIFN0YXJ0IHRpbWVyIHdhaXRpbmcgZm9yIGNvbm5lY3QgKi8KLSAgICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfQ09OTl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBibmVwX2Nvbm5fdGltZXJfdGltZW91dCwgcF9iY2IpOwotICB9Ci0KLSAgKnBfaGFuZGxlID0gcF9iY2ItPmhhbmRsZTsKLSAgcmV0dXJuIChCTkVQX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9Db25uZWN0UmVzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gcmVzcG9uY2UgdG8gY29ubmVjdGlvbiBpbmRpY2F0aW9uCi0gKgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAtIGhhbmRsZSBnaXZlbiBpbiB0aGUgY29ubmVjdGlvbiBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHJlc3AgICAgLSByZXNwb25jZSBmb3IgdGhlIGNvbm5lY3Rpb24gaW5kaWNhdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24gc3RhcnRlZAotICogICAgICAgICAgICAgICAgICBCTkVQX1dST05HX0hBTkRMRSAgICAgICAgICAgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfV1JPTkdfU1RBVEUgICAgICAgICAgICBpZiB0aGUgcmVzcG9uY2UgaXMgbm90IGV4cGVjdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCTkVQX1JFU1VMVCBCTkVQX0Nvbm5lY3RSZXNwKHVpbnQxNl90IGhhbmRsZSwgdEJORVBfUkVTVUxUIHJlc3ApIHsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0gIHVpbnQxNl90IHJlc3BfY29kZSA9IEJORVBfU0VUVVBfQ09OTl9PSzsKLQotICBpZiAoKCFoYW5kbGUpIHx8IChoYW5kbGUgPiBCTkVQX01BWF9DT05ORUNUSU9OUykpIHJldHVybiAoQk5FUF9XUk9OR19IQU5ETEUpOwotCi0gIHBfYmNiID0gJihibmVwX2NiLmJjYltoYW5kbGUgLSAxXSk7Ci0KLSAgaWYgKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9DT05OX1NFVFVQIHx8Ci0gICAgICAoIShwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19TRVRVUF9SQ1ZEKSkpCi0gICAgcmV0dXJuIChCTkVQX1dST05HX1NUQVRFKTsKLQotICBMT0dfREVCVUcoImhhbmRsZSAlZCwgcmVzcG9uY2UgJWQiLCBoYW5kbGUsIHJlc3ApOwotCi0gIC8qIEZvcm0gYXBwcm9wcmlhdGUgcmVzcG9uY2UgYmFzZWQgb24gcHJvZmlsZSByZXNwb25jZSAqLwotICBpZiAocmVzcCA9PSBCTkVQX0NPTk5fRkFJTEVEX1NSQ19VVUlEKQotICAgIHJlc3BfY29kZSA9IEJORVBfU0VUVVBfSU5WQUxJRF9TUkNfVVVJRDsKLSAgZWxzZSBpZiAocmVzcCA9PSBCTkVQX0NPTk5fRkFJTEVEX0RTVF9VVUlEKQotICAgIHJlc3BfY29kZSA9IEJORVBfU0VUVVBfSU5WQUxJRF9ERVNUX1VVSUQ7Ci0gIGVsc2UgaWYgKHJlc3AgPT0gQk5FUF9DT05OX0ZBSUxFRF9VVUlEX1NJWkUpCi0gICAgcmVzcF9jb2RlID0gQk5FUF9TRVRVUF9JTlZBTElEX1VVSURfU0laRTsKLSAgZWxzZSBpZiAocmVzcCA9PSBCTkVQX1NVQ0NFU1MpCi0gICAgcmVzcF9jb2RlID0gQk5FUF9TRVRVUF9DT05OX09LOwotICBlbHNlCi0gICAgcmVzcF9jb2RlID0gQk5FUF9TRVRVUF9DT05OX05PVF9BTExPV0VEOwotCi0gIGJuZXBfc2VuZF9jb25uX3Jlc3BvbmNlKHBfYmNiLCByZXNwX2NvZGUpOwotICBwX2JjYi0+Y29uX2ZsYWdzICY9ICh+Qk5FUF9GTEFHU19TRVRVUF9SQ1ZEKTsKLQotICBpZiAocmVzcCA9PSBCTkVQX1NVQ0NFU1MpCi0gICAgYm5lcF9jb25uZWN0ZWQocF9iY2IpOwotICBlbHNlIGlmIChwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19DT05OX0NPTVBMRVRFRCkgewotICAgIC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMgKi8KLSAgICBwX2JjYi0+Y29uX3N0YXRlID0gQk5FUF9TVEFURV9DT05ORUNURUQ7Ci0gICAgcF9iY2ItPmNvbl9mbGFncyAmPSAofkJORVBfRkxBR1NfU0VUVVBfUkNWRCk7Ci0KLSAgICBwX2JjYi0+c3JjX3V1aWQgPSBwX2JjYi0+cHJ2X3NyY191dWlkOwotICAgIHBfYmNiLT5kc3RfdXVpZCA9IHBfYmNiLT5wcnZfZHN0X3V1aWQ7Ci0gIH0KLQotICAvKiBQcm9jZXNzIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBzZXR1cCBtZXNzYWdlIChleHRlbnNpb24gaGVhZGVycykgKi8KLSAgaWYgKHBfYmNiLT5wX3BlbmRpbmdfZGF0YSkgewotICAgIHVpbnQ4X3QgZXh0ZW5zaW9uX3ByZXNlbnQgPSB0cnVlLCAqcCwgZXh0X3R5cGU7Ci0gICAgdWludDE2X3QgcmVtX2xlbjsKLQotICAgIHJlbV9sZW4gPSBwX2JjYi0+cF9wZW5kaW5nX2RhdGEtPmxlbjsKLSAgICBwID0gKHVpbnQ4X3QqKShwX2JjYi0+cF9wZW5kaW5nX2RhdGEgKyAxKSArIHBfYmNiLT5wX3BlbmRpbmdfZGF0YS0+b2Zmc2V0OwotICAgIHdoaWxlIChleHRlbnNpb25fcHJlc2VudCAmJiBwICYmIHJlbV9sZW4pIHsKLSAgICAgIGV4dF90eXBlID0gKnArKzsKLSAgICAgIGV4dGVuc2lvbl9wcmVzZW50ID0gZXh0X3R5cGUgPj4gNzsKLSAgICAgIGV4dF90eXBlICY9IDB4N0Y7Ci0KLSAgICAgIC8qIGlmIHVua25vd24gZXh0ZW5zaW9uIHByZXNlbnQgc3RvcCBwcm9jZXNzaW5nICovCi0gICAgICBpZiAoZXh0X3R5cGUpIGJyZWFrOwotCi0gICAgICBwID0gYm5lcF9wcm9jZXNzX2NvbnRyb2xfcGFja2V0KHBfYmNiLCBwLCAmcmVtX2xlbiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfYmNiLT5wX3BlbmRpbmdfZGF0YSk7Ci0gIH0KLSAgcmV0dXJuIChCTkVQX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9EaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbG9zZSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAtIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfV1JPTkdfSEFORExFICAgICAgICAgICBpZiBubyBjb25uZWN0aW9uIGlzIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Qk5FUF9SRVNVTFQgQk5FUF9EaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSkgewotICB0Qk5FUF9DT05OKiBwX2JjYjsKLQotICBpZiAoKCFoYW5kbGUpIHx8IChoYW5kbGUgPiBCTkVQX01BWF9DT05ORUNUSU9OUykpIHJldHVybiAoQk5FUF9XUk9OR19IQU5ETEUpOwotCi0gIHBfYmNiID0gJihibmVwX2NiLmJjYltoYW5kbGUgLSAxXSk7Ci0KLSAgaWYgKHBfYmNiLT5jb25fc3RhdGUgPT0gQk5FUF9TVEFURV9JRExFKSByZXR1cm4gKEJORVBfV1JPTkdfSEFORExFKTsKLQotICBCTkVQX1RSQUNFX0FQSSgiQk5FUF9EaXNjb25uZWN0KCkgIGZvciBoYW5kbGUgJWQiLCBoYW5kbGUpOwotCi0gIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICBibmVwdV9yZWxlYXNlX2JjYihwX2JjYik7Ci0KLSAgcmV0dXJuIChCTkVQX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9Xcml0ZUJ1ZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBkYXRhIGluIGEgR0tJIGJ1ZmZlciBvbiBCTkVQIGNvbm5lY3Rpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgICAtIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiB0byB3cml0ZQotICogICAgICAgICAgICAgICAgICBwX2Rlc3RfYWRkciAgLSBCRF9BRERSL0V0aGVybmV0IGFkZHIgb2YgdGhlIGRlc3RpbmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfYnVmICAgICAgICAtIHBvaW50ZXIgdG8gYWRkcmVzcyBvZiBidWZmZXIgd2l0aCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHByb3RvY29sICAgICAtIHByb3RvY29sIHR5cGUgb2YgdGhlIHBhY2tldAotICogICAgICAgICAgICAgICAgICBwX3NyY19hZGRyICAgLSAob3B0aW9uYWwpIEJEX0FERFIvZXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaG91bGQgYmUgTlVMTCBpZiBpdCBpcyBsb2NhbCBCRCBBZGRyKQotICogICAgICAgICAgICAgICAgICBmd19leHRfcHJlc2VudCAtIGZvcndhcmRlZCBleHRlbnNpb25zIHByZXNlbnQKLSAqCi0gKiBSZXR1cm5zOiAgICAgICAgIEJORVBfV1JPTkdfSEFORExFICAgICAgIC0gaWYgcGFzc2VkIGhhbmRsZSBpcyBub3QgdmFsaWQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9NVFVfRVhDRURFRCAgICAgICAgLSBJZiB0aGUgZGF0YSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1UVQotICogICAgICAgICAgICAgICAgICBCTkVQX0lHTk9SRV9DTUQgICAgICAgICAtIElmIHRoZSBwYWNrZXQgaXMgZmlsdGVyZWQgb3V0Ci0gKiAgICAgICAgICAgICAgICAgIEJORVBfUV9TSVpFX0VYQ0VFREVEICAgIC0gSWYgdGhlIFR4IFEgaXMgZnVsbAotICogICAgICAgICAgICAgICAgICBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAtIElmIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCTkVQX1JFU1VMVCBCTkVQX1dyaXRlQnVmKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcF9kZXN0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHBfc3JjX2FkZHIsIGJvb2wgZndfZXh0X3ByZXNlbnQpIHsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLQotICBpZiAoKCFoYW5kbGUpIHx8IChoYW5kbGUgPiBCTkVQX01BWF9DT05ORUNUSU9OUykpIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIChCTkVQX1dST05HX0hBTkRMRSk7Ci0gIH0KLQotICBwX2JjYiA9ICYoYm5lcF9jYi5iY2JbaGFuZGxlIC0gMV0pOwotICAvKiBDaGVjayBNVFUgc2l6ZSAqLwotICBpZiAocF9idWYtPmxlbiA+IEJORVBfTVRVX1NJWkUpIHsKLSAgICBCTkVQX1RSQUNFX0VSUk9SKCIlcyBsZW5ndGggJWQgZXhjZWVkZWQgTVRVICVkIiwgX19mdW5jX18sIHBfYnVmLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICBCTkVQX01UVV9TSVpFKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIChCTkVQX01UVV9FWENFREVEKTsKLSAgfQotCi0gIC8qIENoZWNrIGlmIHRoZSBwYWNrZXQgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCAqLwotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBpZiAoYm5lcF9pc19wYWNrZXRfYWxsb3dlZChwX2JjYiwgcF9kZXN0X2FkZHIsIHByb3RvY29sLCBmd19leHRfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLCBwX2J1Zi0+bGVuKSAhPSBCTkVQX1NVQ0NFU1MpIHsKLSAgICAvKgotICAgICoqIElmIHBhY2tldCBpcyBmaWx0ZXJlZCBhbmQgZXh0IGhlYWRlcnMgYXJlIHByZXNlbnQKLSAgICAqKiBkcm9wIHRoZSBkYXRhIGFuZCBmb3J3YXJkIHRoZSBleHQgaGVhZGVycwotICAgICovCi0gICAgaWYgKGZ3X2V4dF9wcmVzZW50KSB7Ci0gICAgICB1aW50OF90IGV4dCwgbGVuZ3RoOwotICAgICAgdWludDE2X3Qgb3JnX2xlbiwgbmV3X2xlbjsKLSAgICAgIC8qIHBhcnNlIHRoZSBleHRlbnNpb24gaGVhZGVycyBhbmQgZmluZG91dCB0aGUgbmV3IHBhY2tldCBsZW4gKi8KLSAgICAgIG9yZ19sZW4gPSBwX2J1Zi0+bGVuOwotICAgICAgbmV3X2xlbiA9IDA7Ci0gICAgICBkbyB7Ci0gICAgICAgIGlmICgobmV3X2xlbiArIDIpID4gb3JnX2xlbikgewotICAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgICAgICByZXR1cm4gQk5FUF9JR05PUkVfQ01EOwotICAgICAgICB9Ci0KLSAgICAgICAgZXh0ID0gKnBfZGF0YSsrOwotICAgICAgICBsZW5ndGggPSAqcF9kYXRhKys7Ci0gICAgICAgIHBfZGF0YSArPSBsZW5ndGg7Ci0KLSAgICAgICAgbmV3X2xlbiArPSAobGVuZ3RoICsgMik7Ci0KLSAgICAgICAgaWYgKG5ld19sZW4gPiBvcmdfbGVuKSB7Ci0gICAgICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgICAgIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0gICAgICAgIH0KLQotICAgICAgfSB3aGlsZSAoZXh0ICYgMHg4MCk7Ci0KLSAgICAgIGlmIChwcm90b2NvbCAhPSBCTkVQXzgwMl8xX1BfUFJPVE9DT0wpCi0gICAgICAgIHByb3RvY29sID0gMDsKLSAgICAgIGVsc2UgewotICAgICAgICBuZXdfbGVuICs9IDQ7Ci0gICAgICAgIGlmIChuZXdfbGVuID4gb3JnX2xlbikgcmV0dXJuIEJORVBfSUdOT1JFX0NNRDsKLSAgICAgICAgcF9kYXRhWzJdID0gMDsKLSAgICAgICAgcF9kYXRhWzNdID0gMDsKLSAgICAgIH0KLSAgICAgIHBfYnVmLT5sZW4gPSBuZXdfbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICByZXR1cm4gQk5FUF9JR05PUkVfQ01EOwotICAgIH0KLSAgfQotCi0gIC8qIENoZWNrIHRyYW5zbWl0IHF1ZXVlICovCi0gIGlmIChmaXhlZF9xdWV1ZV9sZW5ndGgocF9iY2ItPnhtaXRfcSkgPj0gQk5FUF9NQVhfWE1JVFFfREVQVEgpIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIChCTkVQX1FfU0laRV9FWENFRURFRCk7Ci0gIH0KLQotICAvKiBCdWlsZCB0aGUgQk5FUCBoZWFkZXIgKi8KLSAgYm5lcHVfYnVpbGRfYm5lcF9oZHIocF9iY2IsIHBfYnVmLCBwcm90b2NvbCwgcF9zcmNfYWRkciwgJnBfZGVzdF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICBmd19leHRfcHJlc2VudCk7Ci0KLSAgLyogU2VuZCB0aGUgZGF0YSBvciBxdWV1ZSBpdCB1cCAqLwotICBibmVwdV9jaGVja19zZW5kX3BhY2tldChwX2JjYiwgcF9idWYpOwotCi0gIHJldHVybiAoQk5FUF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJORVBfV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgZGF0YSBvdmVyIGEgQk5FUCBjb25uZWN0aW9uCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAgLSBoYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gd3JpdGUKLSAqICAgICAgICAgICAgICAgICAgcF9kZXN0X2FkZHIgIC0gQkRfQUREUi9FdGhlcm5ldCBhZGRyIG9mIHRoZSBkZXN0aW5hdGlvbgotICogICAgICAgICAgICAgICAgICBwX2RhdGEgICAgICAgLSBwb2ludGVyIHRvIGRhdGEgc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgICAgIC0gcHJvdG9jb2wgdHlwZSBvZiB0aGUgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIHBfc3JjX2FkZHIgICAtIChvcHRpb25hbCkgQkRfQUREUi9ldGhlcm5ldCBhZGRyZXNzIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNob3VsZCBiZSBOVUxMIGlmIGl0IGlzIGxvY2FsIEJEIEFkZHIpCi0gKiAgICAgICAgICAgICAgICAgIGZ3X2V4dF9wcmVzZW50IC0gZm9yd2FyZGVkIGV4dGVuc2lvbnMgcHJlc2VudAotICoKLSAqIFJldHVybnM6ICAgICAgICAgQk5FUF9XUk9OR19IQU5ETEUgICAgICAgLSBpZiBwYXNzZWQgaGFuZGxlIGlzIG5vdCB2YWxpZAotICogICAgICAgICAgICAgICAgICBCTkVQX01UVV9FWENFREVEICAgICAgICAtIElmIHRoZSBkYXRhIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTVRVCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfSUdOT1JFX0NNRCAgICAgICAgIC0gSWYgdGhlIHBhY2tldCBpcyBmaWx0ZXJlZCBvdXQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9RX1NJWkVfRVhDRUVERUQgICAgLSBJZiB0aGUgVHggUSBpcyBmdWxsCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfTk9fUkVTT1VSQ0VTICAgICAgIC0gSWYgbm90IGFibGUgdG8gYWxsb2NhdGUgYSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICAgICAgLSBJZiB3cml0dGVuIHN1Y2Nlc3NmdWxseQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Qk5FUF9SRVNVTFQgQk5FUF9Xcml0ZSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBfZGVzdF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4sIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogcF9zcmNfYWRkciwgYm9vbCBmd19leHRfcHJlc2VudCkgewotICB0Qk5FUF9DT05OKiBwX2JjYjsKLSAgdWludDhfdCogcDsKLQotICAvKiBDaGVjayBNVFUgc2l6ZS4gQ29uc2lkZXIgdGhlIHBvc3NpYmlsaXR5IG9mIGhhdmluZyBleHRlbnNpb24gaGVhZGVycyAqLwotICBpZiAobGVuID4gQk5FUF9NVFVfU0laRSkgewotICAgIEJORVBfVFJBQ0VfRVJST1IoIiVzIGxlbmd0aCAlZCBleGNlZWRlZCBNVFUgJWQiLCBfX2Z1bmNfXywgbGVuLAotICAgICAgICAgICAgICAgICAgICAgQk5FUF9NVFVfU0laRSk7Ci0gICAgcmV0dXJuIChCTkVQX01UVV9FWENFREVEKTsKLSAgfQotCi0gIGlmICgoIWhhbmRsZSkgfHwgKGhhbmRsZSA+IEJORVBfTUFYX0NPTk5FQ1RJT05TKSkgcmV0dXJuIChCTkVQX1dST05HX0hBTkRMRSk7Ci0KLSAgcF9iY2IgPSAmKGJuZXBfY2IuYmNiW2hhbmRsZSAtIDFdKTsKLQotICAvKiBDaGVjayBpZiB0aGUgcGFja2V0IHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQgKi8KLSAgaWYgKGJuZXBfaXNfcGFja2V0X2FsbG93ZWQocF9iY2IsIHBfZGVzdF9hZGRyLCBwcm90b2NvbCwgZndfZXh0X3ByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSwgbGVuKSAhPSBCTkVQX1NVQ0NFU1MpIHsKLSAgICAvKgotICAgICoqIElmIHBhY2tldCBpcyBmaWx0ZXJlZCBhbmQgZXh0IGhlYWRlcnMgYXJlIHByZXNlbnQKLSAgICAqKiBkcm9wIHRoZSBkYXRhIGFuZCBmb3J3YXJkIHRoZSBleHQgaGVhZGVycwotICAgICovCi0gICAgaWYgKGZ3X2V4dF9wcmVzZW50KSB7Ci0gICAgICB1aW50OF90IGV4dCwgbGVuZ3RoOwotICAgICAgdWludDE2X3Qgb3JnX2xlbiwgbmV3X2xlbjsKLSAgICAgIC8qIHBhcnNlIHRoZSBleHRlbnNpb24gaGVhZGVycyBhbmQgZmluZG91dCB0aGUgbmV3IHBhY2tldCBsZW4gKi8KLSAgICAgIG9yZ19sZW4gPSBsZW47Ci0gICAgICBuZXdfbGVuID0gMDsKLSAgICAgIHAgPSBwX2RhdGE7Ci0gICAgICBkbyB7Ci0gICAgICAgIGlmICgobmV3X2xlbiArIDIpID4gb3JnX2xlbikgewotICAgICAgICAgIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBleHQgPSAqcF9kYXRhKys7Ci0gICAgICAgIGxlbmd0aCA9ICpwX2RhdGErKzsKLSAgICAgICAgcF9kYXRhICs9IGxlbmd0aDsKLQotICAgICAgICBuZXdfbGVuICs9IChsZW5ndGggKyAyKTsKLQotICAgICAgICBpZiAobmV3X2xlbiA+IG9yZ19sZW4pIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0KLSAgICAgIH0gd2hpbGUgKGV4dCAmIDB4ODApOwotCi0gICAgICBpZiAocHJvdG9jb2wgIT0gQk5FUF84MDJfMV9QX1BST1RPQ09MKQotICAgICAgICBwcm90b2NvbCA9IDA7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbmV3X2xlbiArPSA0OwotICAgICAgICBpZiAobmV3X2xlbiA+IG9yZ19sZW4pIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0gICAgICAgIHBfZGF0YVsyXSA9IDA7Ci0gICAgICAgIHBfZGF0YVszXSA9IDA7Ci0gICAgICB9Ci0gICAgICBsZW4gPSBuZXdfbGVuOwotICAgICAgcF9kYXRhID0gcDsKLSAgICB9IGVsc2UKLSAgICAgIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0gIH0KLQotICAvKiBDaGVjayB0cmFuc21pdCBxdWV1ZSAqLwotICBpZiAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfYmNiLT54bWl0X3EpID49IEJORVBfTUFYX1hNSVRRX0RFUFRIKQotICAgIHJldHVybiAoQk5FUF9RX1NJWkVfRVhDRUVERUQpOwotCi0gIC8qIEdldCBhIGJ1ZmZlciB0byBjb3B5IHRoZSBkYXRhIGludG8gKi8KLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQk5FUF9CVUZfU0laRSk7Ci0KLSAgcF9idWYtPmxlbiA9IGxlbjsKLSAgcF9idWYtPm9mZnNldCA9IEJORVBfTUlOSU1VTV9PRkZTRVQ7Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBCTkVQX01JTklNVU1fT0ZGU0VUOwotCi0gIG1lbWNweShwLCBwX2RhdGEsIGxlbik7Ci0KLSAgLyogQnVpbGQgdGhlIEJORVAgaGVhZGVyICovCi0gIGJuZXB1X2J1aWxkX2JuZXBfaGRyKHBfYmNiLCBwX2J1ZiwgcHJvdG9jb2wsIHBfc3JjX2FkZHIsICZwX2Rlc3RfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgZndfZXh0X3ByZXNlbnQpOwotCi0gIC8qIFNlbmQgdGhlIGRhdGEgb3IgcXVldWUgaXQgdXAgKi8KLSAgYm5lcHVfY2hlY2tfc2VuZF9wYWNrZXQocF9iY2IsIHBfYnVmKTsKLQotICByZXR1cm4gKEJORVBfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX1NldFByb3RvY29sRmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwcm90b2NvbCBmaWx0ZXJzIG9uIHBlZXIgZGV2aWNlCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAgIC0gSGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBudW1fZmlsdGVycyAgIC0gdG90YWwgbnVtYmVyIG9mIGZpbHRlciByYW5nZXMKLSAqICAgICAgICAgICAgICAgICAgcF9zdGFydF9hcnJheSAtIEFycmF5IG9mIGJlZ2luaW5ncyBvZiBhbGwgcHJvdG9jb2wgcmFuZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHBfZW5kX2FycmF5ICAgLSBBcnJheSBvZiBlbmRzIG9mIGFsbCBwcm90b2NvbCByYW5nZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJORVBfV1JPTkdfSEFORExFICAgICAgICAgICAtIGlmIHRoZSBjb25uZWN0aW9uIGhhbmRsZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdmFsaWQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TRVRfRklMVEVSX0ZBSUwgICAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gd3JvbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9UT09fTUFOWV9GSUxURVJTICAgICAgIC0gaWYgdG9vIG1hbnkgZmlsdGVycwotICogICAgICAgICAgICAgICAgICBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAgICAgLSBpZiByZXF1ZXN0IHNlbnQgc3VjY2Vzc2Z1bGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCTkVQX1JFU1VMVCBCTkVQX1NldFByb3RvY29sRmlsdGVycyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3N0YXJ0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2VuZF9hcnJheSkgewotICB1aW50MTZfdCB4eDsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0KLSAgaWYgKCghaGFuZGxlKSB8fCAoaGFuZGxlID4gQk5FUF9NQVhfQ09OTkVDVElPTlMpKSByZXR1cm4gKEJORVBfV1JPTkdfSEFORExFKTsKLQotICBwX2JjYiA9ICYoYm5lcF9jYi5iY2JbaGFuZGxlIC0gMV0pOwotCi0gIC8qIENoZWNrIHRoZSBjb25uZWN0aW9uIHN0YXRlICovCi0gIGlmICgocF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLSAgICAgICghKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0NPTk5fQ09NUExFVEVEKSkpCi0gICAgcmV0dXJuIChCTkVQX1dST05HX1NUQVRFKTsKLQotICAvKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycyAqLwotICBpZiAobnVtX2ZpbHRlcnMgJiYgKCFwX3N0YXJ0X2FycmF5IHx8ICFwX2VuZF9hcnJheSkpCi0gICAgcmV0dXJuIChCTkVQX1NFVF9GSUxURVJfRkFJTCk7Ci0KLSAgaWYgKG51bV9maWx0ZXJzID4gQk5FUF9NQVhfUFJPVF9GSUxURVJTKSByZXR1cm4gKEJORVBfVE9PX01BTllfRklMVEVSUyk7Ci0KLSAgLyogRmlsbCB0aGUgZmlsdGVyIHZhbHVlcyBpbiBjb25ubmVjdGlvbiBibG9jayAqLwotICBmb3IgKHh4ID0gMDsgeHggPCBudW1fZmlsdGVyczsgeHgrKykgewotICAgIHBfYmNiLT5zZW50X3Byb3RfZmlsdGVyX3N0YXJ0W3h4XSA9ICpwX3N0YXJ0X2FycmF5Kys7Ci0gICAgcF9iY2ItPnNlbnRfcHJvdF9maWx0ZXJfZW5kW3h4XSA9ICpwX2VuZF9hcnJheSsrOwotICB9Ci0KLSAgcF9iY2ItPnNlbnRfbnVtX2ZpbHRlcnMgPSBudW1fZmlsdGVyczsKLQotICBibmVwdV9zZW5kX3BlZXJfb3VyX2ZpbHRlcnMocF9iY2IpOwotCi0gIHJldHVybiAoQk5FUF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJORVBfU2V0TXVsdGljYXN0RmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWx0ZXJzIGZvciBtdWx0aWNhc3QgYWRkcmVzc2VzIGZvcgotICogICAgICAgICAgICAgICAgICBCTkVQLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgICAtIEhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgICAtIHRvdGFsIG51bWJlciBvZiBmaWx0ZXIgcmFuZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHBfc3RhcnRfYXJyYXkgLSBQb2ludGVyIHRvIHNlcXVlbmNlIG9mIGJlZ2luaW5ncyBvZiBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgYWRkcmVzcyByYW5nZXMKLSAqICAgICAgICAgICAgICAgICAgcF9lbmRfYXJyYXkgICAtIFBvaW50ZXIgdG8gc2VxdWVuY2Ugb2YgZW5kcyBvZiBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgYWRkcmVzcyByYW5nZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJORVBfV1JPTkdfSEFORExFICAgICAgICAgICAtIGlmIHRoZSBjb25uZWN0aW9uIGhhbmRsZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdmFsaWQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TRVRfRklMVEVSX0ZBSUwgICAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gd3JvbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9UT09fTUFOWV9GSUxURVJTICAgICAgIC0gaWYgdG9vIG1hbnkgZmlsdGVycwotICogICAgICAgICAgICAgICAgICBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAgICAgLSBpZiByZXF1ZXN0IHNlbnQgc3VjY2Vzc2Z1bGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCTkVQX1JFU1VMVCBCTkVQX1NldE11bHRpY2FzdEZpbHRlcnModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zdGFydF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9lbmRfYXJyYXkpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHRCTkVQX0NPTk4qIHBfYmNiOwotCi0gIGlmICgoIWhhbmRsZSkgfHwgKGhhbmRsZSA+IEJORVBfTUFYX0NPTk5FQ1RJT05TKSkgcmV0dXJuIChCTkVQX1dST05HX0hBTkRMRSk7Ci0KLSAgcF9iY2IgPSAmKGJuZXBfY2IuYmNiW2hhbmRsZSAtIDFdKTsKLQotICAvKiBDaGVjayB0aGUgY29ubmVjdGlvbiBzdGF0ZSAqLwotICBpZiAoKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9DT05ORUNURUQpICYmCi0gICAgICAoIShwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19DT05OX0NPTVBMRVRFRCkpKQotICAgIHJldHVybiAoQk5FUF9XUk9OR19TVEFURSk7Ci0KLSAgLyogVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgKi8KLSAgaWYgKG51bV9maWx0ZXJzICYmICghcF9zdGFydF9hcnJheSB8fCAhcF9lbmRfYXJyYXkpKQotICAgIHJldHVybiAoQk5FUF9TRVRfRklMVEVSX0ZBSUwpOwotCi0gIGlmIChudW1fZmlsdGVycyA+IEJORVBfTUFYX01VTFRJX0ZJTFRFUlMpIHJldHVybiAoQk5FUF9UT09fTUFOWV9GSUxURVJTKTsKLQotICAvKiBGaWxsIHRoZSBtdWx0aWNhc3QgZmlsdGVyIHZhbHVlcyBpbiBjb25ubmVjdGlvbiBibG9jayAqLwotICBmb3IgKHh4ID0gMDsgeHggPCBudW1fZmlsdGVyczsgeHgrKykgewotICAgIG1lbWNweShwX2JjYi0+c2VudF9tY2FzdF9maWx0ZXJfc3RhcnRbeHhdLmFkZHJlc3MsIHBfc3RhcnRfYXJyYXksCi0gICAgICAgICAgIEJEX0FERFJfTEVOKTsKLSAgICBtZW1jcHkocF9iY2ItPnNlbnRfbWNhc3RfZmlsdGVyX2VuZFt4eF0uYWRkcmVzcywgcF9lbmRfYXJyYXksIEJEX0FERFJfTEVOKTsKLQotICAgIHBfc3RhcnRfYXJyYXkgKz0gQkRfQUREUl9MRU47Ci0gICAgcF9lbmRfYXJyYXkgKz0gQkRfQUREUl9MRU47Ci0gIH0KLQotICBwX2JjYi0+c2VudF9tY2FzdF9maWx0ZXJzID0gbnVtX2ZpbHRlcnM7Ci0KLSAgYm5lcHVfc2VuZF9wZWVyX291cl9tdWx0aV9maWx0ZXJzKHBfYmNiKTsKLQotICByZXR1cm4gKEJORVBfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEJORVAuIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMHhGRiwgaXQgc2ltcGx5IHJlYWRzIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIG5ldyAoY3VycmVudCkgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCTkVQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBibmVwX2NiLnRyYWNlX2xldmVsID0gbmV3X2xldmVsOwotCi0gIHJldHVybiAoYm5lcF9jYi50cmFjZV9sZXZlbCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3N0YWNrL2JuZXAvYm5lcF9pbnQuaCBiL3N0YWNrL2JuZXAvYm5lcF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzMjA1Ny4uMDAwMDAwMAotLS0gYS9zdGFjay9ibmVwL2JuZXBfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgaW50ZXJuYWxseSB1c2VkIEJORVAgZGVmaW5pdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJORVBfSU5UX0gKLSNkZWZpbmUgQk5FUF9JTlRfSAotCi0jaW5jbHVkZSAiYm5lcF9hcGkuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIEJORVAgZnJhbWUgdHlwZXMKLSovCi0jZGVmaW5lIEJORVBfRlJBTUVfR0VORVJBTF9FVEhFUk5FVCAweDAwCi0jZGVmaW5lIEJORVBfRlJBTUVfQ09OVFJPTCAweDAxCi0jZGVmaW5lIEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVCAweDAyCi0jZGVmaW5lIEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVF9TUkNfT05MWSAweDAzCi0jZGVmaW5lIEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVF9ERVNUX09OTFkgMHgwNAotCi0vKiBCTkVQIGZpbHRlciBjb250cm9sIG1lc3NhZ2UgdHlwZXMKLSovCi0jZGVmaW5lIEJORVBfQ09OVFJPTF9DT01NQU5EX05PVF9VTkRFUlNUT09EIDB4MDAKLSNkZWZpbmUgQk5FUF9TRVRVUF9DT05ORUNUSU9OX1JFUVVFU1RfTVNHIDB4MDEKLSNkZWZpbmUgQk5FUF9TRVRVUF9DT05ORUNUSU9OX1JFU1BPTlNFX01TRyAweDAyCi0jZGVmaW5lIEJORVBfRklMVEVSX05FVF9UWVBFX1NFVF9NU0cgMHgwMwotI2RlZmluZSBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9SRVNQT05TRV9NU0cgMHgwNAotI2RlZmluZSBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1NFVF9NU0cgMHgwNQotI2RlZmluZSBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JFU1BPTlNFX01TRyAweDA2Ci0KLS8qIEJORVAgaGVhZGVyIGV4dGVuc2lvbiB0eXBlcwotKi8KLSNkZWZpbmUgQk5FUF9FWFRFTlNJT05fRklMVEVSX0NPTlRST0wgMHgwMAotCi0vKiBCTkVQIFNldHVwIENvbm5lY3Rpb24gcmVzcG9uc2UgY29kZXMKLSovCi0jZGVmaW5lIEJORVBfU0VUVVBfQ09OTl9PSyAweDAwMDAKLSNkZWZpbmUgQk5FUF9TRVRVUF9JTlZBTElEX0RFU1RfVVVJRCAweDAwMDEKLSNkZWZpbmUgQk5FUF9TRVRVUF9JTlZBTElEX1NSQ19VVUlEIDB4MDAwMgotI2RlZmluZSBCTkVQX1NFVFVQX0lOVkFMSURfVVVJRF9TSVpFIDB4MDAwMwotI2RlZmluZSBCTkVQX1NFVFVQX0NPTk5fTk9UX0FMTE9XRUQgMHgwMDA0Ci0KLS8qIEJORVAgZmlsdGVyIGNvbnRyb2wgcmVzcG9uc2UgY29kZXMKLSovCi0jZGVmaW5lIEJORVBfRklMVEVSX0NSTF9PSyAweDAwMDAKLSNkZWZpbmUgQk5FUF9GSUxURVJfQ1JMX1VOU1VQUE9SVEVEIDB4MDAwMQotI2RlZmluZSBCTkVQX0ZJTFRFUl9DUkxfQkFEX1JBTkdFIDB4MDAwMgotI2RlZmluZSBCTkVQX0ZJTFRFUl9DUkxfTUFYX1JFQUNIRUQgMHgwMDAzCi0jZGVmaW5lIEJORVBfRklMVEVSX0NSTF9TRUNVUklUWV9FUlIgMHgwMDA0Ci0KLS8qIDgwMi4xcCBwcm90b2NvbCBwYWNrZXQgd2lsbCBoYXZlIGFjdHVhbCBwcm90b2NvbCBmaWVsZCBpbiBzaWRlIHRoZSBwYXlsb2FkICovCi0jZGVmaW5lIEJORVBfODAyXzFfUF9QUk9UT0NPTCAweDgxMDAKLQotLyogVGltZW91dCBkZWZpbml0aW9ucy4gICovCi0vKiBDb25uZWN0aW9uIHJlbGF0ZWQgdGltZW91dCAqLwotI2RlZmluZSBCTkVQX0NPTk5fVElNRU9VVF9NUyAoMjAgKiAxMDAwKQotLyogaG9zdCByZXNwb25zZSB0aW1lb3V0ICovCi0jZGVmaW5lIEJORVBfSE9TVF9USU1FT1VUX01TICgyMDAgKiAxMDAwKQotI2RlZmluZSBCTkVQX0ZJTFRFUl9TRVRfVElNRU9VVF9NUyAoMTAgKiAxMDAwKQotCi0jZGVmaW5lIEJORVBfTUFYX1JFVFJBTlNNSVRTIDMKLQotLyogRGVmaW5lIHRoZSBCTkVQIENvbm5lY3Rpb24gQ29udHJvbCBCbG9jawotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSNkZWZpbmUgQk5FUF9TVEFURV9JRExFIDAKLSNkZWZpbmUgQk5FUF9TVEFURV9DT05OX1NUQVJUIDEKLSNkZWZpbmUgQk5FUF9TVEFURV9DRkdfU0VUVVAgMgotI2RlZmluZSBCTkVQX1NUQVRFX0NPTk5fU0VUVVAgMwotI2RlZmluZSBCTkVQX1NUQVRFX1NFQ19DSEVDS0lORyA0Ci0jZGVmaW5lIEJORVBfU1RBVEVfU0VUVVBfUkNWRCA1Ci0jZGVmaW5lIEJORVBfU1RBVEVfQ09OTkVDVEVEIDYKLSAgdWludDhfdCBjb25fc3RhdGU7Ci0KLSNkZWZpbmUgQk5FUF9GTEFHU19JU19PUklHIDB4MDEKLSNkZWZpbmUgQk5FUF9GTEFHU19ISVNfQ0ZHX0RPTkUgMHgwMgotI2RlZmluZSBCTkVQX0ZMQUdTX01ZX0NGR19ET05FIDB4MDQKLSNkZWZpbmUgQk5FUF9GTEFHU19MMkNBUF9DT05HRVNURUQgMHgwOAotI2RlZmluZSBCTkVQX0ZMQUdTX0ZJTFRFUl9SRVNQX1BFTkQgMHgxMAotI2RlZmluZSBCTkVQX0ZMQUdTX01VTFRJX1JFU1BfUEVORCAweDIwCi0jZGVmaW5lIEJORVBfRkxBR1NfU0VUVVBfUkNWRCAweDQwCi0jZGVmaW5lIEJORVBfRkxBR1NfQ09OTl9DT01QTEVURUQgMHg4MAotICB1aW50OF90IGNvbl9mbGFnczsKLSAgQlRfSERSKiBwX3BlbmRpbmdfZGF0YTsKLQotICB1aW50MTZfdCBsMmNhcF9jaWQ7Ci0gIFJhd0FkZHJlc3MgcmVtX2JkYTsKLSAgYWxhcm1fdCogY29ubl90aW1lcjsKLSAgZml4ZWRfcXVldWVfdCogeG1pdF9xOwotCi0gIHVpbnQxNl90IHNlbnRfbnVtX2ZpbHRlcnM7Ci0gIHVpbnQxNl90IHNlbnRfcHJvdF9maWx0ZXJfc3RhcnRbQk5FUF9NQVhfUFJPVF9GSUxURVJTXTsKLSAgdWludDE2X3Qgc2VudF9wcm90X2ZpbHRlcl9lbmRbQk5FUF9NQVhfUFJPVF9GSUxURVJTXTsKLQotICB1aW50MTZfdCBzZW50X21jYXN0X2ZpbHRlcnM7Ci0gIFJhd0FkZHJlc3Mgc2VudF9tY2FzdF9maWx0ZXJfc3RhcnRbQk5FUF9NQVhfTVVMVElfRklMVEVSU107Ci0gIFJhd0FkZHJlc3Mgc2VudF9tY2FzdF9maWx0ZXJfZW5kW0JORVBfTUFYX01VTFRJX0ZJTFRFUlNdOwotCi0gIHVpbnQxNl90IHJjdmRfbnVtX2ZpbHRlcnM7Ci0gIHVpbnQxNl90IHJjdmRfcHJvdF9maWx0ZXJfc3RhcnRbQk5FUF9NQVhfUFJPVF9GSUxURVJTXTsKLSAgdWludDE2X3QgcmN2ZF9wcm90X2ZpbHRlcl9lbmRbQk5FUF9NQVhfUFJPVF9GSUxURVJTXTsKLQotICB1aW50MTZfdCByY3ZkX21jYXN0X2ZpbHRlcnM7Ci0gIFJhd0FkZHJlc3MgcmN2ZF9tY2FzdF9maWx0ZXJfc3RhcnRbQk5FUF9NQVhfTVVMVElfRklMVEVSU107Ci0gIFJhd0FkZHJlc3MgcmN2ZF9tY2FzdF9maWx0ZXJfZW5kW0JORVBfTUFYX01VTFRJX0ZJTFRFUlNdOwotCi0gIHVpbnQxNl90IGJhZF9wa3RzX3JjdmQ7Ci0gIHVpbnQ4X3QgcmVfdHJhbnNtaXRzOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIGJsdWV0b290aDo6VXVpZCBwcnZfc3JjX3V1aWQ7Ci0gIGJsdWV0b290aDo6VXVpZCBwcnZfZHN0X3V1aWQ7Ci0gIGJsdWV0b290aDo6VXVpZCBzcmNfdXVpZDsKLSAgYmx1ZXRvb3RoOjpVdWlkIGRzdF91dWlkOwotCi19IHRCTkVQX0NPTk47Ci0KLS8qICBUaGUgbWFpbiBCTkVQIGNvbnRyb2wgYmxvY2sKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRMMkNBUF9DRkdfSU5GTyBsMmNhcF9teV9jZmc7IC8qIE15IEwyQ0FQIGNvbmZpZyAgICAgKi8KLSAgdEJORVBfQ09OTiBiY2JbQk5FUF9NQVhfQ09OTkVDVElPTlNdOwotCi0gIHRCTkVQX0NPTk5FQ1RfSU5EX0NCKiBwX2Nvbm5faW5kX2NiOwotICB0Qk5FUF9DT05OX1NUQVRFX0NCKiBwX2Nvbm5fc3RhdGVfY2I7Ci0gIHRCTkVQX0RBVEFfSU5EX0NCKiBwX2RhdGFfaW5kX2NiOwotICB0Qk5FUF9EQVRBX0JVRl9DQiogcF9kYXRhX2J1Zl9jYjsKLSAgdEJORVBfRklMVEVSX0lORF9DQiogcF9maWx0ZXJfaW5kX2NiOwotICB0Qk5FUF9NRklMVEVSX0lORF9DQiogcF9tZmlsdGVyX2luZF9jYjsKLSAgdEJORVBfVFhfREFUQV9GTE9XX0NCKiBwX3R4X2RhdGFfZmxvd19jYjsKLQotICB0TDJDQVBfQVBQTF9JTkZPIHJlZ19pbmZvOwotCi0gIGJvb2wgcHJvZmlsZV9yZWdpc3RlcmVkOyAvKiB0cnVlIHdoZW4gd2UgZ290IG91ciBCRCBhZGRyICovCi0gIHVpbnQ4X3QgdHJhY2VfbGV2ZWw7Ci0KLX0gdEJORVBfQ0I7Ci0KLS8qIEdsb2JhbCBCTkVQIGRhdGEKLSovCi1leHRlcm4gdEJORVBfQ0IgYm5lcF9jYjsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGJuZXBfbWFpbi5jYwotKi8KLWV4dGVybiB0Qk5FUF9SRVNVTFQgYm5lcF9yZWdpc3Rlcl93aXRoX2wyY2FwKHZvaWQpOwotZXh0ZXJuIHZvaWQgYm5lcF9kaXNjb25uZWN0KHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50MTZfdCByZWFzb24pOwotZXh0ZXJuIHRCTkVQX0NPTk4qIGJuZXBfY29ubl9vcmlnaW5hdGUodWludDhfdCogcF9iZF9hZGRyKTsKLWV4dGVybiB2b2lkIGJuZXBfY29ubl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotZXh0ZXJuIHZvaWQgYm5lcF9jb25uZWN0ZWQodEJORVBfQ09OTiogcF9iY2IpOwotCi0vKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgYm5lcF91dGlscy5jYwotKi8KLWV4dGVybiB0Qk5FUF9DT05OKiBibmVwdV9maW5kX2JjYl9ieV9jaWQodWludDE2X3QgY2lkKTsKLWV4dGVybiB0Qk5FUF9DT05OKiBibmVwdV9maW5kX2JjYl9ieV9iZF9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKTsKLWV4dGVybiB0Qk5FUF9DT05OKiBibmVwdV9hbGxvY2F0ZV9iY2IoY29uc3QgUmF3QWRkcmVzcyYgcF9yZW1fYmRhKTsKLWV4dGVybiB2b2lkIGJuZXB1X3JlbGVhc2VfYmNiKHRCTkVQX0NPTk4qIHBfYmNiKTsKLWV4dGVybiB2b2lkIGJuZXB1X3NlbmRfcGVlcl9vdXJfZmlsdGVycyh0Qk5FUF9DT05OKiBwX2JjYik7Ci1leHRlcm4gdm9pZCBibmVwdV9zZW5kX3BlZXJfb3VyX211bHRpX2ZpbHRlcnModEJORVBfQ09OTiogcF9iY2IpOwotZXh0ZXJuIGJvb2wgYm5lcHVfZG9lc19kZXN0X3N1cHBvcnRfcHJvdCh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDE2X3QgcHJvdG9jb2wpOwotZXh0ZXJuIHZvaWQgYm5lcHVfYnVpbGRfYm5lcF9oZHIodEJORVBfQ09OTiogcF9iY2IsIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHBfc3JjX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwX2Rlc3RfYWRkciwgYm9vbCBleHRfYml0KTsKLWV4dGVybiB2b2lkIHRlc3RfYm5lcHVfYnVpbGRfYm5lcF9oZHIodEJORVBfQ09OTiogcF9iY2IsIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvY29sLCB1aW50OF90KiBwX3NyY19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2Rlc3RfYWRkciwgdWludDhfdCB0eXBlKTsKLQotZXh0ZXJuIHRCTkVQX0NPTk4qIGJuZXB1X2dldF9yb3V0ZV90b19kZXN0KHVpbnQ4X3QqIHBfYmRhKTsKLWV4dGVybiB2b2lkIGJuZXB1X2NoZWNrX3NlbmRfcGFja2V0KHRCTkVQX0NPTk4qIHBfYmNiLCBCVF9IRFIqIHBfYnVmKTsKLWV4dGVybiB2b2lkIGJuZXBfc2VuZF9jb21tYW5kX25vdF91bmRlcnN0b29kKHRCTkVQX0NPTk4qIHBfYmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjbWRfY29kZSk7Ci1leHRlcm4gdm9pZCBibmVwdV9wcm9jZXNzX3BlZXJfZmlsdGVyX3NldCh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDhfdCogcF9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKTsKLWV4dGVybiB2b2lkIGJuZXB1X3Byb2Nlc3NfcGVlcl9maWx0ZXJfcnNwKHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50OF90KiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgYm5lcHVfcHJvY2Vzc19tdWx0aWNhc3RfZmlsdGVyX3JzcCh0Qk5FUF9DT05OKiBwX2JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGJuZXBfc2VuZF9jb25uX3JlcSh0Qk5FUF9DT05OKiBwX2JjYik7Ci1leHRlcm4gdm9pZCBibmVwX3NlbmRfY29ubl9yZXNwb25jZSh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDE2X3QgcmVzcF9jb2RlKTsKLWV4dGVybiB2b2lkIGJuZXBfcHJvY2Vzc19zZXR1cF9jb25uX3JlcSh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDhfdCogcF9zZXR1cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxlbik7Ci1leHRlcm4gdm9pZCBibmVwX3Byb2Nlc3Nfc2V0dXBfY29ubl9yZXNwb25jZSh0Qk5FUF9DT05OKiBwX2JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2V0dXApOwotZXh0ZXJuIHVpbnQ4X3QqIGJuZXBfcHJvY2Vzc19jb250cm9sX3BhY2tldCh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGxlbiwgYm9vbCBpc19leHQpOwotZXh0ZXJuIHZvaWQgYm5lcF9zZWNfY2hlY2tfY29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhc25wb3J0LCB2b2lkKiBwX3JlZl9kYXRhKTsKLWV4dGVybiB0Qk5FUF9SRVNVTFQgYm5lcF9pc19wYWNrZXRfYWxsb3dlZCh0Qk5FUF9DT05OKiBwX2JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2Rlc3RfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZ3X2V4dF9wcmVzZW50LCB1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb3JnX2xlbik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svYm5lcC9ibmVwX21haW4uY2MgYi9zdGFjay9ibmVwL2JuZXBfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjYTJiNy4uMDAwMDAwMAotLS0gYS9zdGFjay9ibmVwL2JuZXBfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAxLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBCTkVQIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJibmVwX2FwaS5oIgotI2luY2x1ZGUgImJuZXBfaW50LmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgImwyY2RlZnMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgRyBMIE8gQiBBIEwgICAgQiBOIEUgUCAgICAgICBEIEEgVCBBICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJORVBfQ0IgYm5lcF9jYjsKLQotY29uc3QgdWludDE2X3QgYm5lcF9mcmFtZV9oZHJfc2l6ZXNbXSA9IHsxNCwgMSwgMiwgOCwgOH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJuZXBfY29ubmVjdF9pbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbDJjYXBfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQ4X3QgbDJjYXBfaWQpOwotc3RhdGljIHZvaWQgYm5lcF9jb25uZWN0X2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci1zdGF0aWMgdm9pZCBibmVwX2NvbmZpZ19jZm0odWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1zdGF0aWMgdm9pZCBibmVwX2Rpc2Nvbm5lY3RfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgYm9vbCBhY2tfbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGJuZXBfZGF0YV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCBCVF9IRFIqIHBfbXNnKTsKLXN0YXRpYyB2b2lkIGJuZXBfY29uZ2VzdGlvbl9pbmQodWludDE2X3QgbGNpZCwgYm9vbCBpc19jb25nZXN0ZWQpOwotc3RhdGljIHZvaWQgYm5lcF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9yZWdpc3Rlcl93aXRoX2wyY2FwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBCTkVQIFBTTSB3aXRoIEwyQ0FQCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCTkVQX1JFU1VMVCBibmVwX3JlZ2lzdGVyX3dpdGhfbDJjYXAodm9pZCkgewotICAvKiBJbml0aWFsaXplIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uLiBXZSBvbmx5IGNhcmUgYWJvdXQgTVRVIGFuZCBmbHVzaCAqLwotICBtZW1zZXQoJmJuZXBfY2IubDJjYXBfbXlfY2ZnLCAwLCBzaXplb2YodEwyQ0FQX0NGR19JTkZPKSk7Ci0KLSAgYm5lcF9jYi5sMmNhcF9teV9jZmcubXR1X3ByZXNlbnQgPSB0cnVlOwotICBibmVwX2NiLmwyY2FwX215X2NmZy5tdHUgPSBCTkVQX01UVV9TSVpFOwotCi0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfQ29ubmVjdEluZF9DYiA9IGJuZXBfY29ubmVjdF9pbmQ7Ci0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfQ29ubmVjdENmbV9DYiA9IGJuZXBfY29ubmVjdF9jZm07Ci0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfQ29uZmlnSW5kX0NiID0gbnVsbHB0cjsKLSAgYm5lcF9jYi5yZWdfaW5mby5wTDJDQV9Db25maWdDZm1fQ2IgPSBibmVwX2NvbmZpZ19jZm07Ci0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfRGlzY29ubmVjdEluZF9DYiA9IGJuZXBfZGlzY29ubmVjdF9pbmQ7Ci0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfRGF0YUluZF9DYiA9IGJuZXBfZGF0YV9pbmQ7Ci0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfQ29uZ2VzdGlvblN0YXR1c19DYiA9IGJuZXBfY29uZ2VzdGlvbl9pbmQ7Ci0gIGJuZXBfY2IucmVnX2luZm8ucEwyQ0FfRXJyb3JfQ2IgPSBibmVwX29uX2wyY2FwX2Vycm9yOwotCi0gIC8qIE5vdywgcmVnaXN0ZXIgd2l0aCBMMkNBUCAqLwotICBpZiAoIUwyQ0FfUmVnaXN0ZXIyKEJUX1BTTV9CTkVQLCBibmVwX2NiLnJlZ19pbmZvLCBmYWxzZSAvKiBlbmFibGVfc25vb3AgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgQk5FUF9NVFVfU0laRSwgQk5FUF9NVFVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCkpIHsKLSAgICBCTkVQX1RSQUNFX0VSUk9SKCJCTkVQIC0gUmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotICAgIHJldHVybiBCTkVQX1NFQ1VSSVRZX0ZBSUw7Ci0gIH0KLQotICByZXR1cm4gQk5FUF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9jb25uZWN0X2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFuIGluYm91bmQgY29ubmVjdGlvbiBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gTDJDQVAuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGFjdGluZyBhcyBhCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYm5lcF9jb25uZWN0X2luZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IHBzbSwgdWludDhfdCBsMmNhcF9pZCkgewotICB0Qk5FUF9DT05OKiBwX2JjYiA9IGJuZXB1X2ZpbmRfYmNiX2J5X2JkX2FkZHIoYmRfYWRkcik7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBhY3RpbmcgYXMgc2VydmVyLCBvciBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uLCBvciBoYXZlICovCi0gIC8qIG5vIG1vcmUgcmVzb3VyY2VzIHRvIGhhbmRsZSB0aGUgY29ubmVjdGlvbiwgcmVqZWN0IHRoZSBjb25uZWN0aW9uLiAgICAqLwotICBpZiAoIShibmVwX2NiLnByb2ZpbGVfcmVnaXN0ZXJlZCkgfHwgKHBfYmNiKSB8fAotICAgICAgKChwX2JjYiA9IGJuZXB1X2FsbG9jYXRlX2JjYihiZF9hZGRyKSkgPT0gTlVMTCkpIHsKLSAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEobDJjYXBfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN0YXRlLCB3YWl0aW5nIGZvciBjb25maWcgc2V0dXAuICovCi0gIHBfYmNiLT5jb25fc3RhdGUgPSBCTkVQX1NUQVRFX0NGR19TRVRVUDsKLQotICAvKiBTYXZlIHRoZSBMMkNBUCBDaGFubmVsIElELiAqLwotICBwX2JjYi0+bDJjYXBfY2lkID0gbDJjYXBfY2lkOwotCi0gIC8qIFN0YXJ0IHRpbWVyIHdhaXRpbmcgZm9yIGNvbmZpZyBzZXR1cCAqLwotICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfQ09OTl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgYm5lcF9jb25uX3RpbWVyX3RpbWVvdXQsIHBfYmNiKTsKLQotICBMT0dfREVCVUcoIkJORVAgLSBSY3ZkIEwyQ0FQIGNvbm4gaW5kLCBDSUQ6IDB4JXgiLCBwX2JjYi0+bDJjYXBfY2lkKTsKLX0KLQotc3RhdGljIHZvaWQgYm5lcF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0Qk5FUF9DT05OKiBwX2JjYiA9IGJuZXB1X2ZpbmRfYmNiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9iY2IgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIC8qIFRlbGwgdGhlIHVwcGVyIGxheWVyLCBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gIGlmICgocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfSVNfT1JJRykgJiYgKGJuZXBfY2IucF9jb25uX3N0YXRlX2NiKSkgewotICAgICgqYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKHBfYmNiLT5oYW5kbGUsIHBfYmNiLT5yZW1fYmRhLCBCTkVQX0NPTk5fRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotCi0gIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICBibmVwdV9yZWxlYXNlX2JjYihwX2JjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwX2Nvbm5lY3RfY2ZtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNvbm5lY3QgY29uZmlybSBldmVudHMKLSAqICAgICAgICAgICAgICAgICAgZnJvbSBMMkNBUC4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHdlIGFyZSBhY3RpbmcgYXMgYQotICogICAgICAgICAgICAgICAgICBjbGllbnQgYW5kIGhhdmUgc2VudCBhIGNvbm5lY3QgcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYm5lcF9jb25uZWN0X2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0Qk5FUF9DT05OKiBwX2JjYjsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9iY2IgPSBibmVwdV9maW5kX2JjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfYmNiID09IE5VTEwpIHsKLSAgICBMT0dfV0FSTigiQk5FUCAtIFJjdmQgY29ubiBjbmYgZm9yIHVua25vd24gQ0lEIDB4JXgiLCBsMmNhcF9jaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIHRoZSBjb25uZWN0aW9uIHJlc3BvbnNlIGNvbnRhaW5zIHN1Y2Nlc3Mgc3RhdHVzLCB0aGVuICovCi0gIC8qIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUgYW5kIHN0YXJ0dXAgdGhlIHRpbWVyLiAgICAgICovCi0gIGlmICgocmVzdWx0ID09IEwyQ0FQX0NPTk5fT0spICYmCi0gICAgICAocF9iY2ItPmNvbl9zdGF0ZSA9PSBCTkVQX1NUQVRFX0NPTk5fU1RBUlQpKSB7Ci0gICAgcF9iY2ItPmNvbl9zdGF0ZSA9IEJORVBfU1RBVEVfQ0ZHX1NFVFVQOwotCi0gICAgLyogU3RhcnQgdGltZXIgd2FpdGluZyBmb3IgY29uZmlnIHJlc3VsdHMgKi8KLSAgICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfQ09OTl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBibmVwX2Nvbm5fdGltZXJfdGltZW91dCwgcF9iY2IpOwotCi0gICAgTE9HX0RFQlVHKCJCTkVQIC0gZ290IGNvbm4gY25mLCBzZW50IGNmZyByZXEsIENJRDogMHgleCIsIHBfYmNiLT5sMmNhcF9jaWQpOwotICB9IGVsc2UgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogaW52b2tlZCB3aXRoIG5vbiBPSyBzdGF0dXMiOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwX2NvbmZpZ19jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uIGNvbmZpcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBldmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYm5lcF9jb25maWdfY2ZtKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgaW5pdGlhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0KLSAgTE9HX0RFQlVHKCJCTkVQIC0gUmN2ZCBjZmcgY2ZtLCBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotCi0gIC8qIEZpbmQgQ0NCIGJhc2VkIG9uIENJRCAqLwotICBwX2JjYiA9IGJuZXB1X2ZpbmRfYmNiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9iY2IgPT0gTlVMTCkgewotICAgIExPR19XQVJOKCJCTkVQIC0gUmN2ZCBMMkNBUCBjZmcgaW5kLCB1bmtub3duIENJRDogMHgleCIsIGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogRm9yIG5vdywgYWx3YXlzIGFjY2VwdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIG90aGVyIHNpZGUgKi8KLSAgcF9iY2ItPmNvbl9zdGF0ZSA9IEJORVBfU1RBVEVfU0VDX0NIRUNLSU5HOwotCi0gIC8qIFN0YXJ0IHRpbWVyIHdhaXRpbmcgZm9yIHNldHVwIG9yIHJlc3BvbnNlICovCi0gIGFsYXJtX3NldF9vbl9tbG9vcChwX2JjYi0+Y29ubl90aW1lciwgQk5FUF9IT1NUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICBibmVwX2Nvbm5fdGltZXJfdGltZW91dCwgcF9iY2IpOwotCi0gIGlmIChwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19JU19PUklHKSB7Ci0gICAgYm5lcF9zZWNfY2hlY2tfY29tcGxldGUoJnBfYmNiLT5yZW1fYmRhLCBCVF9UUkFOU1BPUlRfQlJfRURSLCBwX2JjYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXBfZGlzY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2Nvbm5lY3QgZXZlbnQgZnJvbSBMMkNBUC4gSWYKLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIHRvLCB3ZSBhY2sgdGhlIGRpc2Nvbm5lY3QgYmVmb3JlIGRyb3BwaW5nIHRoZSBDQ0IKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYm5lcF9kaXNjb25uZWN0X2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICB0Qk5FUF9DT05OKiBwX2JjYjsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9iY2IgPSBibmVwdV9maW5kX2JjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfYmNiID09IE5VTEwpIHsKLSAgICBMT0dfV0FSTigiQk5FUCAtIFJjdmQgTDJDQVAgZGlzYywgdW5rbm93biBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19ERUJVRygiQk5FUCAtIFJjdmQgTDJDQVAgZGlzYywgQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLQotICAvKiBUZWxsIHRoZSB1c2VyIGlmIHRoZXJlIGlzIGEgY2FsbGJhY2sgKi8KLSAgaWYgKHBfYmNiLT5jb25fc3RhdGUgPT0gQk5FUF9TVEFURV9DT05ORUNURUQpIHsKLSAgICBpZiAoYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpCi0gICAgICAoKmJuZXBfY2IucF9jb25uX3N0YXRlX2NiKShwX2JjYi0+aGFuZGxlLCBwX2JjYi0+cmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJORVBfQ09OTl9ESVNDT05ORUNURUQsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoKGJuZXBfY2IucF9jb25uX3N0YXRlX2NiKSAmJgotICAgICAgICAoKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0lTX09SSUcpIHx8Ci0gICAgICAgICAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfQ09OTl9DT01QTEVURUQpKSkKLSAgICAgICgqYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKHBfYmNiLT5oYW5kbGUsIHBfYmNiLT5yZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5FUF9DT05OX0ZBSUxFRCwgZmFsc2UpOwotICB9Ci0KLSAgYm5lcHVfcmVsZWFzZV9iY2IocF9iY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9jb25nZXN0aW9uX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBMMkNBUCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIGNvbmdlc3Rpb24gc3RhdHVzIGNoYW5nZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYm5lcF9jb25nZXN0aW9uX2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIGJvb2wgaXNfY29uZ2VzdGVkKSB7Ci0gIHRCTkVQX0NPTk4qIHBfYmNiOwotCi0gIC8qIEZpbmQgQkNCIGJhc2VkIG9uIENJRCAqLwotICBwX2JjYiA9IGJuZXB1X2ZpbmRfYmNiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9iY2IgPT0gTlVMTCkgewotICAgIExPR19XQVJOKCJCTkVQIC0gUmN2ZCBMMkNBUCBjb25nLCB1bmtub3duIENJRDogMHgleCIsIGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGlzX2Nvbmdlc3RlZCkgewotICAgIHBfYmNiLT5jb25fZmxhZ3MgfD0gQk5FUF9GTEFHU19MMkNBUF9DT05HRVNURUQ7Ci0gICAgaWYgKGJuZXBfY2IucF90eF9kYXRhX2Zsb3dfY2IpIHsKLSAgICAgIGJuZXBfY2IucF90eF9kYXRhX2Zsb3dfY2IocF9iY2ItPmhhbmRsZSwgQk5FUF9UWF9GTE9XX09GRik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHBfYmNiLT5jb25fZmxhZ3MgJj0gfkJORVBfRkxBR1NfTDJDQVBfQ09OR0VTVEVEOwotCi0gICAgaWYgKGJuZXBfY2IucF90eF9kYXRhX2Zsb3dfY2IpIHsKLSAgICAgIGJuZXBfY2IucF90eF9kYXRhX2Zsb3dfY2IocF9iY2ItPmhhbmRsZSwgQk5FUF9UWF9GTE9XX09OKTsKLSAgICB9Ci0KLSAgICAvKiBXaGlsZSBub3QgY29uZ2VzdGVkLCBzZW5kIGFzIG1hbnkgYnVmZmVycyBhcyB3ZSBjYW4gKi8KLSAgICB3aGlsZSAoIShwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19MMkNBUF9DT05HRVNURUQpKSB7Ci0gICAgICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUocF9iY2ItPnhtaXRfcSk7Ci0KLSAgICAgIGlmICghcF9idWYpIGJyZWFrOwotCi0gICAgICBMMkNBX0RhdGFXcml0ZShsMmNhcF9jaWQsIHBfYnVmKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXBfZGF0YV9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZGF0YSBpcyByZWNlaXZlZCBmcm9tIEwyQ0FQLgotICogICAgICAgICAgICAgICAgICBpZiB3ZSBhcmUgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIGNvbm5lY3Rpb24sIHdlIGFyZSB0aGUgU0RQCi0gKiAgICAgICAgICAgICAgICAgIGNsaWVudCwgYW5kIHRoZSByZWNlaXZlZCBtZXNzYWdlIGlzIHF1ZXVlZCBmb3IgdGhlIGNsaWVudC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElmIHdlIGFyZSB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNvbm5lY3Rpb24sIHdlIGFyZSB0aGUgU0RQCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZlciwgc28gdGhlIG1lc3NhZ2UgaXMgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIgcHJvY2Vzc2luZwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYm5lcF9kYXRhX2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIEJUX0hEUiogcF9idWYpIHsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICB1aW50MTZfdCByZW1fbGVuID0gcF9idWYtPmxlbjsKLSAgaWYgKHJlbV9sZW4gPT0gMCkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzgyODYxMTgiKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQ4X3QgdHlwZSwgY3RybF90eXBlLCBleHRfdHlwZSA9IDA7Ci0gIGJvb2wgZXh0ZW5zaW9uX3ByZXNlbnQsIGZ3X2V4dF9wcmVzZW50OwotICB1aW50MTZfdCBwcm90b2NvbCA9IDA7Ci0KLSAgLyogRmluZCBDQ0IgYmFzZWQgb24gQ0lEICovCi0gIHBfYmNiID0gYm5lcHVfZmluZF9iY2JfYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChwX2JjYiA9PSBOVUxMKSB7Ci0gICAgTE9HX1dBUk4oIkJORVAgLSBSY3ZkIEwyQ0FQIGRhdGEsIHVua25vd24gQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogR2V0IHRoZSB0eXBlIGFuZCBleHRlbnNpb24gYml0cyAqLwotICB0eXBlID0gKnArKzsKLSAgZXh0ZW5zaW9uX3ByZXNlbnQgPSB0eXBlID4+IDc7Ci0gIHR5cGUgJj0gMHg3ZjsKLSAgaWYgKHR5cGUgPj0gc2l6ZW9mKGJuZXBfZnJhbWVfaGRyX3NpemVzKSAvIHNpemVvZihibmVwX2ZyYW1lX2hkcl9zaXplc1swXSkpIHsKLSAgICBMT0dfSU5GTygiQk5FUCAtIHJjdmQgZnJhbWUsIGJhZCB0eXBlOiAweCUwMngiLCB0eXBlKTsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY4ODE4MDM0Iik7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoKHJlbV9sZW4gPD0gYm5lcF9mcmFtZV9oZHJfc2l6ZXNbdHlwZV0pIHx8IChyZW1fbGVuID4gQk5FUF9NVFVfU0laRSkpIHsKLSAgICBMT0dfREVCVUcoIkJORVAgLSByY3ZkIGZyYW1lLCBiYWQgbGVuOiAlZCAgdHlwZTogMHglMDJ4IiwgcF9idWYtPmxlbiwgdHlwZSk7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHJlbV9sZW4tLTsKLQotICBpZiAoKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9DT05ORUNURUQpICYmCi0gICAgICAoIShwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19DT05OX0NPTVBMRVRFRCkpICYmCi0gICAgICAodHlwZSAhPSBCTkVQX0ZSQU1FX0NPTlRST0wpKSB7Ci0gICAgTE9HX1dBUk4oIkJORVAgLSBJZ25vcmVkIEwyQ0FQIGRhdGEgd2hpbGUgaW4gc3RhdGU6ICVkLCBDSUQ6IDB4JXgiLAotICAgICAgICAgICAgIHBfYmNiLT5jb25fc3RhdGUsIGwyY2FwX2NpZCk7Ci0KLSAgICBpZiAoZXh0ZW5zaW9uX3ByZXNlbnQpIHsKLSAgICAgIC8qCi0gICAgICAqKiBXaGVuIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24gaWYgYSBkYXRhIHBhY2tldCBpcyByZWNlaXZlZAotICAgICAgKiogd2l0aCB1bmtub3duIGNvbnRyb2wgZXh0ZW5zaW9uIGhlYWRlcnMgdGhlbiB0aG9zZSBzaG91bGQgYmUgcHJvY2Vzc2VkCi0gICAgICAqKiBhY2NvcmRpbmcgdG8gY29tcGxhaW4vaWdub3JlIGxhdwotICAgICAgKi8KLSAgICAgIHVpbnQ4X3QgZXh0LCBsZW5ndGg7Ci0gICAgICB1aW50MTZfdCBvcmdfbGVuLCBuZXdfbGVuOwotICAgICAgLyogcGFyc2UgdGhlIGV4dGVuc2lvbiBoZWFkZXJzIGFuZCBwcm9jZXNzIHVua25vd24gY29udHJvbCBoZWFkZXJzICovCi0gICAgICBvcmdfbGVuID0gcmVtX2xlbjsKLSAgICAgIGRvIHsKLSAgICAgICAgaWYgKG9yZ19sZW4gPCAyKSB7Ci0gICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2Nzg2Mzc1NSIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGV4dCA9ICpwKys7Ci0gICAgICAgIGxlbmd0aCA9ICpwKys7Ci0KLSAgICAgICAgbmV3X2xlbiA9IChsZW5ndGggKyAyKTsKLSAgICAgICAgaWYgKG5ld19sZW4gPiBvcmdfbGVuKSB7Ci0gICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2Nzg2Mzc1NSIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChleHQgJiAweDdGKSA9PSBCTkVQX0VYVEVOU0lPTl9GSUxURVJfQ09OVFJPTCkgewotICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3OTE2NDcyMiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgqcCA+IEJORVBfRklMVEVSX01VTFRJX0FERFJfUkVTUE9OU0VfTVNHKSB7Ci0gICAgICAgICAgICBibmVwX3NlbmRfY29tbWFuZF9ub3RfdW5kZXJzdG9vZChwX2JjYiwgKnApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHAgKz0gbGVuZ3RoOwotCi0gICAgICAgIG9yZ19sZW4gLT0gbmV3X2xlbjsKLSAgICAgIH0gd2hpbGUgKGV4dCAmIDB4ODApOwotICAgIH0KLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHR5cGUgPiBCTkVQX0ZSQU1FX0NPTVBSRVNTRURfRVRIRVJORVRfREVTVF9PTkxZKSB7Ci0gICAgTE9HX0RFQlVHKCJCTkVQIC0gcmN2ZCBmcmFtZSwgdW5rbm93biB0eXBlOiAweCUwMngiLCB0eXBlKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HX0RFQlVHKCJCTkVQIC0gcmN2IGZyYW1lLCB0eXBlOiAlZCBsZW46ICVkIEV4dDogJWQiLCB0eXBlLCBwX2J1Zi0+bGVuLAotICAgICAgICAgICAgZXh0ZW5zaW9uX3ByZXNlbnQpOwotCi0gIC8qIEluaXRpYWxpemUgYWRkcmVzc2VzIHRvICdub3Qgc3VwcGxpZWQnICovCi0gIGNvbnN0IFJhd0FkZHJlc3MgKnBfc3JjX2FkZHIsICpwX2RzdF9hZGRyOwotICBwX3NyY19hZGRyID0gcF9kc3RfYWRkciA9IE5VTEw7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCTkVQX0ZSQU1FX0dFTkVSQUxfRVRIRVJORVQ6Ci0gICAgICBwX2RzdF9hZGRyID0gKFJhd0FkZHJlc3MqKXA7Ci0gICAgICBwICs9IEJEX0FERFJfTEVOOwotICAgICAgcF9zcmNfYWRkciA9IChSYXdBZGRyZXNzKilwOwotICAgICAgcCArPSBCRF9BRERSX0xFTjsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocHJvdG9jb2wsIHApOwotICAgICAgcmVtX2xlbiAtPSAxNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCTkVQX0ZSQU1FX0NPTlRST0w6Ci0gICAgICBjdHJsX3R5cGUgPSAqcDsKLSAgICAgIHAgPSBibmVwX3Byb2Nlc3NfY29udHJvbF9wYWNrZXQocF9iY2IsIHAsICZyZW1fbGVuLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChjdHJsX3R5cGUgPT0gQk5FUF9TRVRVUF9DT05ORUNUSU9OX1JFUVVFU1RfTVNHICYmCi0gICAgICAgICAgcF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRCAmJiBleHRlbnNpb25fcHJlc2VudCAmJiBwICYmCi0gICAgICAgICAgcmVtX2xlbikgewotICAgICAgICBvc2lfZnJlZShwX2JjYi0+cF9wZW5kaW5nX2RhdGEpOwotICAgICAgICBwX2JjYi0+cF9wZW5kaW5nX2RhdGEgPSAoQlRfSERSKilvc2lfbWFsbG9jKHJlbV9sZW4gKyBzaXplb2YoQlRfSERSKSk7Ci0gICAgICAgIG1lbWNweSgodWludDhfdCopKHBfYmNiLT5wX3BlbmRpbmdfZGF0YSArIDEpLCBwLCByZW1fbGVuKTsKLSAgICAgICAgcF9iY2ItPnBfcGVuZGluZ19kYXRhLT5sZW4gPSByZW1fbGVuOwotICAgICAgICBwX2JjYi0+cF9wZW5kaW5nX2RhdGEtPm9mZnNldCA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAoZXh0ZW5zaW9uX3ByZXNlbnQgJiYgcCAmJiByZW1fbGVuKSB7Ci0gICAgICAgICAgZXh0X3R5cGUgPSAqcCsrOwotICAgICAgICAgIHJlbV9sZW4tLTsKLSAgICAgICAgICBleHRlbnNpb25fcHJlc2VudCA9IGV4dF90eXBlID4+IDc7Ci0gICAgICAgICAgZXh0X3R5cGUgJj0gMHg3RjsKLQotICAgICAgICAgIC8qIGlmIHVua25vd24gZXh0ZW5zaW9uIHByZXNlbnQgc3RvcCBwcm9jZXNzaW5nICovCi0gICAgICAgICAgaWYgKGV4dF90eXBlICE9IEJORVBfRVhURU5TSU9OX0ZJTFRFUl9DT05UUk9MKSBicmVhazsKLQotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjkyNzEyODQiKTsKLSAgICAgICAgICBwID0gYm5lcF9wcm9jZXNzX2NvbnRyb2xfcGFja2V0KHBfYmNiLCBwLCAmcmVtX2xlbiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgQk5FUF9GUkFNRV9DT01QUkVTU0VEX0VUSEVSTkVUOgotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwcm90b2NvbCwgcCk7Ci0gICAgICByZW1fbGVuIC09IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9GUkFNRV9DT01QUkVTU0VEX0VUSEVSTkVUX1NSQ19PTkxZOgotICAgICAgcF9zcmNfYWRkciA9IChSYXdBZGRyZXNzKilwOwotICAgICAgcCArPSBCRF9BRERSX0xFTjsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocHJvdG9jb2wsIHApOwotICAgICAgcmVtX2xlbiAtPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVF9ERVNUX09OTFk6Ci0gICAgICBwX2RzdF9hZGRyID0gKFJhd0FkZHJlc3MqKXA7Ci0gICAgICBwICs9IEJEX0FERFJfTEVOOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwcm90b2NvbCwgcCk7Ci0gICAgICByZW1fbGVuIC09IDg7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIFByb2Nlc3MgdGhlIGhlYWRlciBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lICovCi0gIHdoaWxlIChleHRlbnNpb25fcHJlc2VudCAmJiBwICYmIHJlbV9sZW4pIHsKLSAgICBleHRfdHlwZSA9ICpwOwotICAgIGV4dGVuc2lvbl9wcmVzZW50ID0gZXh0X3R5cGUgPj4gNzsKLSAgICBleHRfdHlwZSAmPSAweDdGOwotCi0gICAgLyogaWYgdW5rbm93biBleHRlbnNpb24gcHJlc2VudCBzdG9wIHByb2Nlc3NpbmcgKi8KLSAgICBpZiAoZXh0X3R5cGUpIHsKLSAgICAgIExPR19ERUJVRygiRGF0YSBleHRlbnNpb24gdHlwZSAweCV4IGZvdW5kIiwgZXh0X3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcCsrOwotICAgIHJlbV9sZW4tLTsKLSAgICBwID0gYm5lcF9wcm9jZXNzX2NvbnRyb2xfcGFja2V0KHBfYmNiLCBwLCAmcmVtX2xlbiwgdHJ1ZSk7Ci0gIH0KLQotICBwX2J1Zi0+b2Zmc2V0ICs9IHBfYnVmLT5sZW4gLSByZW1fbGVuOwotICBwX2J1Zi0+bGVuID0gcmVtX2xlbjsKLQotICAvKiBBbHdheXMgZ2l2ZSB0aGUgdXBwZXIgbGF5ZXIgTUFDIGFkZHJlc3NlcyAqLwotICBpZiAoIXBfc3JjX2FkZHIpIHBfc3JjX2FkZHIgPSAmcF9iY2ItPnJlbV9iZGE7Ci0KLSAgaWYgKCFwX2RzdF9hZGRyKSBwX2RzdF9hZGRyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9hZGRyZXNzKCk7Ci0KLSAgLyogY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IGV4dGVuc2lvbnMgdG8gYmUgZm9yd2FyZGVkICovCi0gIGlmIChleHRfdHlwZSkKLSAgICBmd19leHRfcHJlc2VudCA9IHRydWU7Ci0gIGVsc2UKLSAgICBmd19leHRfcHJlc2VudCA9IGZhbHNlOwotCi0gIGlmIChibmVwX2NiLnBfZGF0YV9idWZfY2IpIHsKLSAgICAoKmJuZXBfY2IucF9kYXRhX2J1Zl9jYikocF9iY2ItPmhhbmRsZSwgKnBfc3JjX2FkZHIsICpwX2RzdF9hZGRyLCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYsIGZ3X2V4dF9wcmVzZW50KTsKLSAgfSBlbHNlIGlmIChibmVwX2NiLnBfZGF0YV9pbmRfY2IpIHsKLSAgICAoKmJuZXBfY2IucF9kYXRhX2luZF9jYikocF9iY2ItPmhhbmRsZSwgKnBfc3JjX2FkZHIsICpwX2RzdF9hZGRyLCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgcmVtX2xlbiwgZndfZXh0X3ByZXNlbnQpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9jb25uX3RpbWVyX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgdGltZW91dC4gSWYgaXQgaXMgYSBzdGFydHVwCi0gKiAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIHdlIGNoZWNrIGZvciByZWFkaW5nIG91ciBCRCBhZGRyZXNzLiBJZiBpdAotICogICAgICAgICAgICAgICAgICBpcyBhbiBMMkNBUCB0aW1lb3V0LCB3ZSBzZW5kIGEgZGlzY29ubmVjdCByZXEgdG8gTDJDQVAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcF9jb25uX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgewotICB0Qk5FUF9DT05OKiBwX2JjYiA9ICh0Qk5FUF9DT05OKilkYXRhOwotCi0gIExPR19ERUJVRygKLSAgICAgICJCTkVQIC0gQ0NCIHRpbWVvdXQgaW4gc3RhdGU6ICVkICBDSUQ6IDB4JXggZmxhZ3MgJXgsIHJlX3RyYW5zbWl0ICVkIiwKLSAgICAgIHBfYmNiLT5jb25fc3RhdGUsIHBfYmNiLT5sMmNhcF9jaWQsIHBfYmNiLT5jb25fZmxhZ3MsCi0gICAgICBwX2JjYi0+cmVfdHJhbnNtaXRzKTsKLQotICBpZiAocF9iY2ItPmNvbl9zdGF0ZSA9PSBCTkVQX1NUQVRFX0NPTk5fU0VUVVApIHsKLSAgICBMT0dfREVCVUcoIkJORVAgLSBDQ0IgdGltZW91dCBpbiBzdGF0ZTogJWQgIENJRDogMHgleCIsIHBfYmNiLT5jb25fc3RhdGUsCi0gICAgICAgICAgICAgIHBfYmNiLT5sMmNhcF9jaWQpOwotCi0gICAgaWYgKCEocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfSVNfT1JJRykpIHsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICAgICAgYm5lcHVfcmVsZWFzZV9iY2IocF9iY2IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwX2JjYi0+cmVfdHJhbnNtaXRzKysgIT0gQk5FUF9NQVhfUkVUUkFOU01JVFMpIHsKLSAgICAgIGJuZXBfc2VuZF9jb25uX3JlcShwX2JjYik7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfQ09OTl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJuZXBfY29ubl90aW1lcl90aW1lb3V0LCBwX2JjYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICAgICAgaWYgKChwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19JU19PUklHKSAmJiAoYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKQotICAgICAgICAoKmJuZXBfY2IucF9jb25uX3N0YXRlX2NiKShwX2JjYi0+aGFuZGxlLCBwX2JjYi0+cmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5FUF9DT05OX0ZBSUxFRCwgZmFsc2UpOwotCi0gICAgICBibmVwdV9yZWxlYXNlX2JjYihwX2JjYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgaWYgKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9DT05ORUNURUQpIHsKLSAgICBMT0dfREVCVUcoIkJORVAgLSBDQ0IgdGltZW91dCBpbiBzdGF0ZTogJWQgIENJRDogMHgleCIsIHBfYmNiLT5jb25fc3RhdGUsCi0gICAgICAgICAgICAgIHBfYmNiLT5sMmNhcF9jaWQpOwotCi0gICAgTDJDQV9EaXNjb25uZWN0UmVxKHBfYmNiLT5sMmNhcF9jaWQpOwotCi0gICAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gICAgaWYgKChwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19JU19PUklHKSAmJiAoYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKQotICAgICAgKCpibmVwX2NiLnBfY29ubl9zdGF0ZV9jYikocF9iY2ItPmhhbmRsZSwgcF9iY2ItPnJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTkVQX0NPTk5fRkFJTEVELCBmYWxzZSk7Ci0KLSAgICBibmVwdV9yZWxlYXNlX2JjYihwX2JjYik7Ci0gIH0gZWxzZSBpZiAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfRklMVEVSX1JFU1BfUEVORCkgewotICAgIGlmIChwX2JjYi0+cmVfdHJhbnNtaXRzKysgIT0gQk5FUF9NQVhfUkVUUkFOU01JVFMpIHsKLSAgICAgIGJuZXB1X3NlbmRfcGVlcl9vdXJfZmlsdGVycyhwX2JjYik7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfRklMVEVSX1NFVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJuZXBfY29ubl90aW1lcl90aW1lb3V0LCBwX2JjYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICAgICAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gICAgICBpZiAoYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpCi0gICAgICAgICgqYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKHBfYmNiLT5oYW5kbGUsIHBfYmNiLT5yZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTkVQX1NFVF9GSUxURVJfRkFJTCwgZmFsc2UpOwotCi0gICAgICBibmVwdV9yZWxlYXNlX2JjYihwX2JjYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgaWYgKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX01VTFRJX1JFU1BfUEVORCkgewotICAgIGlmIChwX2JjYi0+cmVfdHJhbnNtaXRzKysgIT0gQk5FUF9NQVhfUkVUUkFOU01JVFMpIHsKLSAgICAgIGJuZXB1X3NlbmRfcGVlcl9vdXJfbXVsdGlfZmlsdGVycyhwX2JjYik7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfRklMVEVSX1NFVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJuZXBfY29ubl90aW1lcl90aW1lb3V0LCBwX2JjYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICAgICAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gICAgICBpZiAoYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpCi0gICAgICAgICgqYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKHBfYmNiLT5oYW5kbGUsIHBfYmNiLT5yZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTkVQX1NFVF9GSUxURVJfRkFJTCwgZmFsc2UpOwotCi0gICAgICBibmVwdV9yZWxlYXNlX2JjYihwX2JjYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwX2Nvbm5lY3RlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQKLSAqICAgICAgICAgICAgICAgICAgKGFmdGVyIGNvbmZpZykuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcF9jb25uZWN0ZWQodEJORVBfQ09OTiogcF9iY2IpIHsKLSAgYm9vbCBpc19yb2xlX2NoYW5nZTsKLQotICBpZiAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfQ09OTl9DT01QTEVURUQpCi0gICAgaXNfcm9sZV9jaGFuZ2UgPSB0cnVlOwotICBlbHNlCi0gICAgaXNfcm9sZV9jaGFuZ2UgPSBmYWxzZTsKLQotICBwX2JjYi0+Y29uX3N0YXRlID0gQk5FUF9TVEFURV9DT05ORUNURUQ7Ci0gIHBfYmNiLT5jb25fZmxhZ3MgfD0gQk5FUF9GTEFHU19DT05OX0NPTVBMRVRFRDsKLSAgcF9iY2ItPmNvbl9mbGFncyAmPSAofkJORVBfRkxBR1NfU0VUVVBfUkNWRCk7Ci0KLSAgLyogRW5zdXJlIHRpbWVyIGlzIHN0b3BwZWQgKi8KLSAgYWxhcm1fY2FuY2VsKHBfYmNiLT5jb25uX3RpbWVyKTsKLSAgcF9iY2ItPnJlX3RyYW5zbWl0cyA9IDA7Ci0KLSAgLyogVGVsbCB0aGUgdXBwZXIgbGF5ZXIsIGlmIHRoZXJlIGlzIGEgY2FsbGJhY2sgKi8KLSAgaWYgKGJuZXBfY2IucF9jb25uX3N0YXRlX2NiKQotICAgICgqYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKHBfYmNiLT5oYW5kbGUsIHBfYmNiLT5yZW1fYmRhLCBCTkVQX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcm9sZV9jaGFuZ2UpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYm5lcC9ibmVwX3V0aWxzLmNjIGIvc3RhY2svYm5lcC9ibmVwX3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJjN2RlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2JuZXAvYm5lcF91dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgQk5FUCB1dGlsaXR5IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYm5lcF9pbnQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICBMIE8gQyBBIEwgICAgRiBVIE4gQyBUIEkgTyBOICAgICBQIFIgTyBUIE8gVCBZIFAgRSBTICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCogYm5lcHVfaW5pdF9oZHIoQlRfSERSKiBwX2J1ZiwgdWludDE2X3QgaGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBrdF90eXBlKTsKLQotdm9pZCBibmVwdV9wcm9jZXNzX3BlZXJfbXVsdGljYXN0X2ZpbHRlcl9zZXQodEJORVBfQ09OTiogcF9iY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMsIHVpbnQxNl90IGxlbik7Ci12b2lkIGJuZXB1X3NlbmRfcGVlcl9tdWx0aWNhc3RfZmlsdGVyX3JzcCh0Qk5FUF9DT05OKiBwX2JjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3BvbnNlX2NvZGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcHVfZmluZF9iY2JfYnlfY2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBiY2IgdGFibGUgZm9yIGFuIGVudHJ5IHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NlZCBDSUQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgQkNCIGFkZHJlc3MsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Qk5FUF9DT05OKiBibmVwdV9maW5kX2JjYl9ieV9jaWQodWludDE2X3QgY2lkKSB7Ci0gIHVpbnQxNl90IHh4OwotICB0Qk5FUF9DT05OKiBwX2JjYjsKLQotICAvKiBMb29rIHRocm91Z2ggZWFjaCBjb25uZWN0aW9uIGNvbnRyb2wgYmxvY2sgKi8KLSAgZm9yICh4eCA9IDAsIHBfYmNiID0gYm5lcF9jYi5iY2I7IHh4IDwgQk5FUF9NQVhfQ09OTkVDVElPTlM7IHh4KyssIHBfYmNiKyspIHsKLSAgICBpZiAoKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9JRExFKSAmJiAocF9iY2ItPmwyY2FwX2NpZCA9PSBjaWQpKQotICAgICAgcmV0dXJuIChwX2JjYik7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBub3QgZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXB1X2ZpbmRfYmNiX2J5X2JkX2FkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIEJDQiB0YWJsZSBmb3IgYW4gZW50cnkgd2l0aCB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGFzc2VkIEJsdWV0b290aCBBZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIEJDQiBhZGRyZXNzLCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJORVBfQ09OTiogYm5lcHVfZmluZF9iY2JfYnlfYmRfYWRkcihjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSkgewotICB1aW50MTZfdCB4eDsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGVhY2ggY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICovCi0gIGZvciAoeHggPSAwLCBwX2JjYiA9IGJuZXBfY2IuYmNiOyB4eCA8IEJORVBfTUFYX0NPTk5FQ1RJT05TOyB4eCsrLCBwX2JjYisrKSB7Ci0gICAgaWYgKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9JRExFKSB7Ci0gICAgICBpZiAocF9iY2ItPnJlbV9iZGEgPT0gcF9iZGEpIHJldHVybiAocF9iY2IpOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGhlcmUsIG5vdCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcHVfYWxsb2NhdGVfYmNiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBCQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCQ0IgYWRkcmVzcywgb3IgTlVMTCBpZiBub25lIGF2YWlsYWJsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJORVBfQ09OTiogYm5lcHVfYWxsb2NhdGVfYmNiKGNvbnN0IFJhd0FkZHJlc3MmIHBfcmVtX2JkYSkgewotICB1aW50MTZfdCB4eDsKLSAgdEJORVBfQ09OTiogcF9iY2I7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGVhY2ggY29ubmVjdGlvbiBjb250cm9sIGJsb2NrIGZvciBhIGZyZWUgb25lICovCi0gIGZvciAoeHggPSAwLCBwX2JjYiA9IGJuZXBfY2IuYmNiOyB4eCA8IEJORVBfTUFYX0NPTk5FQ1RJT05TOyB4eCsrLCBwX2JjYisrKSB7Ci0gICAgaWYgKHBfYmNiLT5jb25fc3RhdGUgPT0gQk5FUF9TVEFURV9JRExFKSB7Ci0gICAgICBhbGFybV9mcmVlKHBfYmNiLT5jb25uX3RpbWVyKTsKLSAgICAgIG1lbXNldCgodWludDhfdCopcF9iY2IsIDAsIHNpemVvZih0Qk5FUF9DT05OKSk7Ci0gICAgICBwX2JjYi0+Y29ubl90aW1lciA9IGFsYXJtX25ldygiYm5lcC5jb25uX3RpbWVyIik7Ci0KLSAgICAgIHBfYmNiLT5yZW1fYmRhID0gcF9yZW1fYmRhOwotICAgICAgcF9iY2ItPmhhbmRsZSA9IHh4ICsgMTsKLSAgICAgIHBfYmNiLT54bWl0X3EgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotCi0gICAgICByZXR1cm4gKHBfYmNiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBmcmVlIEJDQiBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcHVfcmVsZWFzZV9iY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYSBCQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfcmVsZWFzZV9iY2IodEJORVBfQ09OTiogcF9iY2IpIHsKLSAgLyogRW5zdXJlIHRpbWVyIGlzIHN0b3BwZWQgKi8KLSAgYWxhcm1fZnJlZShwX2JjYi0+Y29ubl90aW1lcik7Ci0gIHBfYmNiLT5jb25uX3RpbWVyID0gTlVMTDsKLQotICAvKiBEcm9wIGFueSByZXNwb25zZSBwb2ludGVyIHdlIG1heSBiZSBob2xkaW5nICovCi0gIHBfYmNiLT5jb25fc3RhdGUgPSBCTkVQX1NUQVRFX0lETEU7Ci0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2JjYi0+cF9wZW5kaW5nX2RhdGEpOwotCi0gIC8qIEZyZWUgdHJhbnNtaXQgcXVldWUgKi8KLSAgd2hpbGUgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2JjYi0+eG1pdF9xKSkgewotICAgIG9zaV9mcmVlKGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfYmNiLT54bWl0X3EpKTsKLSAgfQotICBmaXhlZF9xdWV1ZV9mcmVlKHBfYmNiLT54bWl0X3EsIE5VTEwpOwotICBwX2JjYi0+eG1pdF9xID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXBfc2VuZF9jb25uX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIEJORVAgY29ubmVjdGlvbiByZXF1ZXN0IHRvIHBlZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBibmVwX3NlbmRfY29ubl9yZXEodEJORVBfQ09OTiogcF9iY2IpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQk5FUF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QgKnAsICpwX3N0YXJ0OwotCi0gIEJORVBfVFJBQ0VfREVCVUcoIiVzOiBzZW5kaW5nIHNldHVwIHJlcSB3aXRoIGRzdCB1dWlkICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgcF9iY2ItPmRzdF91dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHAgPSBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBQdXQgaW4gQk5FUCBmcmFtZSB0eXBlIC0gZmlsdGVyIGNvbnRyb2wgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEJORVBfRlJBTUVfQ09OVFJPTCk7Ci0KLSAgLyogUHV0IGluIGZpbHRlciBtZXNzYWdlIHR5cGUgLSBzZXQgZmlsdGVycyAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgQk5FUF9TRVRVUF9DT05ORUNUSU9OX1JFUVVFU1RfTVNHKTsKLQotICBpbnQgbGVuID0gc3RkOjptYXgocF9iY2ItPmRzdF91dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCksCi0gICAgICAgICAgICAgICAgICAgICBwX2JjYi0+c3JjX3V1aWQuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSk7Ci0KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIGxlbik7Ci0KLSAgaWYgKGxlbiA9PSBVdWlkOjprTnVtQnl0ZXMxNikgewotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcF9iY2ItPmRzdF91dWlkLkFzMTZCaXQoKSk7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwX2JjYi0+c3JjX3V1aWQuQXMxNkJpdCgpKTsKLSAgfSBlbHNlIGlmIChsZW4gPT0gVXVpZDo6a051bUJ5dGVzMzIpIHsKLSAgICBVSU5UMzJfVE9fQkVfU1RSRUFNKHAsIHBfYmNiLT5kc3RfdXVpZC5BczMyQml0KCkpOwotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocCwgcF9iY2ItPnNyY191dWlkLkFzMzJCaXQoKSk7Ci0gIH0gZWxzZSBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgIG1lbWNweShwLCBwX2JjYi0+ZHN0X3V1aWQuVG8xMjhCaXRCRSgpLmRhdGEoKSwgVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICBwICs9IFV1aWQ6OmtOdW1CeXRlczEyODsKLSAgICBtZW1jcHkocCwgcF9iY2ItPnNyY191dWlkLlRvMTI4Qml0QkUoKS5kYXRhKCksIFV1aWQ6OmtOdW1CeXRlczEyOCk7Ci0gICAgcCArPSBVdWlkOjprTnVtQnl0ZXMxMjg7Ci0gIH0gZWxzZSB7Ci0gICAgQk5FUF9UUkFDRV9FUlJPUigiJXM6IHV1aWQ6ICVzLCBpbnZhbGlkIGxlbmd0aDogJXp1IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBwX2JjYi0+ZHN0X3V1aWQuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgcF9iY2ItPmRzdF91dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkpOwotICB9Ci0KLSAgcF9idWYtPmxlbiA9ICh1aW50MTZfdCkocCAtIHBfc3RhcnQpOwotCi0gIGJuZXB1X2NoZWNrX3NlbmRfcGFja2V0KHBfYmNiLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwX3NlbmRfY29ubl9yZXNwb25jZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIEJORVAgc2V0dXAgcmVzcG9uc2UgdG8gcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJuZXBfc2VuZF9jb25uX3Jlc3BvbmNlKHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50MTZfdCByZXNwX2NvZGUpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQk5FUF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgTE9HX0RFQlVHKCJCTkVQIC0gYm5lcF9zZW5kX2Nvbm5fcmVzcG9uY2UgZm9yIENJRDogMHgleCIsIHBfYmNiLT5sMmNhcF9jaWQpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBQdXQgaW4gQk5FUCBmcmFtZSB0eXBlIC0gZmlsdGVyIGNvbnRyb2wgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEJORVBfRlJBTUVfQ09OVFJPTCk7Ci0KLSAgLyogUHV0IGluIGZpbHRlciBtZXNzYWdlIHR5cGUgLSBzZXQgZmlsdGVycyAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgQk5FUF9TRVRVUF9DT05ORUNUSU9OX1JFU1BPTlNFX01TRyk7Ci0KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCByZXNwX2NvZGUpOwotCi0gIHBfYnVmLT5sZW4gPSA0OwotCi0gIGJuZXB1X2NoZWNrX3NlbmRfcGFja2V0KHBfYmNiLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9zZW5kX3BlZXJfb3VyX2ZpbHRlcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgb3VyIGZpbHRlcnMgdG8gYSBwZWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfc2VuZF9wZWVyX291cl9maWx0ZXJzKHRCTkVQX0NPTk4qIHBfYmNiKSB7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJORVBfQlVGX1NJWkUpOwotICB1aW50OF90KiBwOwotICB1aW50MTZfdCB4eDsKLQotICBCTkVQX1RSQUNFX0RFQlVHKCJCTkVQIHNlbmRpbmcgcGVlciBvdXIgZmlsdGVycyIpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBQdXQgaW4gQk5FUCBmcmFtZSB0eXBlIC0gZmlsdGVyIGNvbnRyb2wgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEJORVBfRlJBTUVfQ09OVFJPTCk7Ci0KLSAgLyogUHV0IGluIGZpbHRlciBtZXNzYWdlIHR5cGUgLSBzZXQgZmlsdGVycyAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgQk5FUF9GSUxURVJfTkVUX1RZUEVfU0VUX01TRyk7Ci0KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCAoNCAqIHBfYmNiLT5zZW50X251bV9maWx0ZXJzKSk7Ci0gIGZvciAoeHggPSAwOyB4eCA8IHBfYmNiLT5zZW50X251bV9maWx0ZXJzOyB4eCsrKSB7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwX2JjYi0+c2VudF9wcm90X2ZpbHRlcl9zdGFydFt4eF0pOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcF9iY2ItPnNlbnRfcHJvdF9maWx0ZXJfZW5kW3h4XSk7Ci0gIH0KLQotICBwX2J1Zi0+bGVuID0gNCArICg0ICogcF9iY2ItPnNlbnRfbnVtX2ZpbHRlcnMpOwotCi0gIGJuZXB1X2NoZWNrX3NlbmRfcGFja2V0KHBfYmNiLCBwX2J1Zik7Ci0KLSAgcF9iY2ItPmNvbl9mbGFncyB8PSBCTkVQX0ZMQUdTX0ZJTFRFUl9SRVNQX1BFTkQ7Ci0KLSAgLyogU3RhcnQgdGltZXIgd2FpdGluZyBmb3Igc2V0dXAgcmVzcG9uc2UgKi8KLSAgYWxhcm1fc2V0X29uX21sb29wKHBfYmNiLT5jb25uX3RpbWVyLCBCTkVQX0ZJTFRFUl9TRVRfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGJuZXBfY29ubl90aW1lcl90aW1lb3V0LCBwX2JjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9zZW5kX3BlZXJfb3VyX211bHRpX2ZpbHRlcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgb3VyIG11bHRpY2FzdCBmaWx0ZXJzIHRvIGEgcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJuZXB1X3NlbmRfcGVlcl9vdXJfbXVsdGlfZmlsdGVycyh0Qk5FUF9DT05OKiBwX2JjYikgewotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhCTkVQX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcDsKLSAgdWludDE2X3QgeHg7Ci0KLSAgQk5FUF9UUkFDRV9ERUJVRygiQk5FUCBzZW5kaW5nIHBlZXIgb3VyIG11bHRpY2FzdCBmaWx0ZXJzIik7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIC8qIFB1dCBpbiBCTkVQIGZyYW1lIHR5cGUgLSBmaWx0ZXIgY29udHJvbCAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgQk5FUF9GUkFNRV9DT05UUk9MKTsKLQotICAvKiBQdXQgaW4gZmlsdGVyIG1lc3NhZ2UgdHlwZSAtIHNldCBmaWx0ZXJzICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1NFVF9NU0cpOwotCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgKDIgKiBCRF9BRERSX0xFTiAqIHBfYmNiLT5zZW50X21jYXN0X2ZpbHRlcnMpKTsKLSAgZm9yICh4eCA9IDA7IHh4IDwgcF9iY2ItPnNlbnRfbWNhc3RfZmlsdGVyczsgeHgrKykgewotICAgIG1lbWNweShwLCBwX2JjYi0+c2VudF9tY2FzdF9maWx0ZXJfc3RhcnRbeHhdLmFkZHJlc3MsIEJEX0FERFJfTEVOKTsKLSAgICBwICs9IEJEX0FERFJfTEVOOwotICAgIG1lbWNweShwLCBwX2JjYi0+c2VudF9tY2FzdF9maWx0ZXJfZW5kW3h4XS5hZGRyZXNzLCBCRF9BRERSX0xFTik7Ci0gICAgcCArPSBCRF9BRERSX0xFTjsKLSAgfQotCi0gIHBfYnVmLT5sZW4gPSA0ICsgKDIgKiBCRF9BRERSX0xFTiAqIHBfYmNiLT5zZW50X21jYXN0X2ZpbHRlcnMpOwotCi0gIGJuZXB1X2NoZWNrX3NlbmRfcGFja2V0KHBfYmNiLCBwX2J1Zik7Ci0KLSAgcF9iY2ItPmNvbl9mbGFncyB8PSBCTkVQX0ZMQUdTX01VTFRJX1JFU1BfUEVORDsKLQotICAvKiBTdGFydCB0aW1lciB3YWl0aW5nIGZvciBzZXR1cCByZXNwb25zZSAqLwotICBhbGFybV9zZXRfb25fbWxvb3AocF9iY2ItPmNvbm5fdGltZXIsIEJORVBfRklMVEVSX1NFVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgYm5lcF9jb25uX3RpbWVyX3RpbWVvdXQsIHBfYmNiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXB1X3NlbmRfcGVlcl9maWx0ZXJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZmlsdGVyIHJlc3BvbnNlIHRvIGEgcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJuZXB1X3NlbmRfcGVlcl9maWx0ZXJfcnNwKHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50MTZfdCByZXNwb25zZV9jb2RlKSB7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJORVBfQlVGX1NJWkUpOwotICB1aW50OF90KiBwOwotCi0gIEJORVBfVFJBQ0VfREVCVUcoIkJORVAgc2VuZGluZyBmaWx0ZXIgcmVzcG9uc2UiKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgLyogUHV0IGluIEJORVAgZnJhbWUgdHlwZSAtIGZpbHRlciBjb250cm9sICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBCTkVQX0ZSQU1FX0NPTlRST0wpOwotCi0gIC8qIFB1dCBpbiBmaWx0ZXIgbWVzc2FnZSB0eXBlIC0gc2V0IGZpbHRlcnMgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEJORVBfRklMVEVSX05FVF9UWVBFX1JFU1BPTlNFX01TRyk7Ci0KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCByZXNwb25zZV9jb2RlKTsKLQotICBwX2J1Zi0+bGVuID0gNDsKLQotICBibmVwdV9jaGVja19zZW5kX3BhY2tldChwX2JjYiwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9zZW5kX2NvbW1hbmRfbm90X3VuZGVyc3Rvb2QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBCTkVQIGNvbW1hbmQgbm90IHVuZGVyc3Rvb2QgbWVzc2FnZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJuZXBfc2VuZF9jb21tYW5kX25vdF91bmRlcnN0b29kKHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50OF90IGNtZF9jb2RlKSB7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEJORVBfQlVGX1NJWkUpOwotICB1aW50OF90KiBwOwotCi0gIEJORVBfVFJBQ0VfRVZFTlQoCi0gICAgICAiQk5FUCAtIGJuZXBfc2VuZF9jb21tYW5kX25vdF91bmRlcnN0b29kIGZvciBDSUQ6IDB4JXgsIGNtZCAweCV4IiwKLSAgICAgIHBfYmNiLT5sMmNhcF9jaWQsIGNtZF9jb2RlKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgLyogUHV0IGluIEJORVAgZnJhbWUgdHlwZSAtIGZpbHRlciBjb250cm9sICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBCTkVQX0ZSQU1FX0NPTlRST0wpOwotCi0gIC8qIFB1dCBpbiBmaWx0ZXIgbWVzc2FnZSB0eXBlIC0gc2V0IGZpbHRlcnMgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEJORVBfQ09OVFJPTF9DT01NQU5EX05PVF9VTkRFUlNUT09EKTsKLQotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgY21kX2NvZGUpOwotCi0gIHBfYnVmLT5sZW4gPSAzOwotCi0gIGJuZXB1X2NoZWNrX3NlbmRfcGFja2V0KHBfYmNiLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9jaGVja19zZW5kX3BhY2tldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiB0cmllcyB0byBzZW5kIGEgcGFja2V0IHRvIEwyQ0FQLgotICogICAgICAgICAgICAgICAgICBJZiBMMkNBUCBpcyBmbG93IGNvbnRyb2xsZWQsIGl0IGVucXVldWVzIHRoZQotICogICAgICAgICAgICAgICAgICBwYWNrZXQgdG8gdGhlIHRyYW5zbWl0IHF1ZXVlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfY2hlY2tfc2VuZF9wYWNrZXQodEJORVBfQ09OTiogcF9iY2IsIEJUX0hEUiogcF9idWYpIHsKLSAgTE9HX0RFQlVHKCJCTkVQIC0gYm5lcHVfY2hlY2tfc2VuZF9wYWNrZXQgZm9yIENJRDogMHgleCIsIHBfYmNiLT5sMmNhcF9jaWQpOwotICBpZiAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfTDJDQVBfQ09OR0VTVEVEKSB7Ci0gICAgaWYgKGZpeGVkX3F1ZXVlX2xlbmd0aChwX2JjYi0+eG1pdF9xKSA+PSBCTkVQX01BWF9YTUlUUV9ERVBUSCkgewotICAgICAgTE9HX1dBUk4oIkJORVAgLSBjb25nZXN0ZWQsIGRyb3BwaW5nIGJ1ZiwgQ0lEOiAweCV4IiwgcF9iY2ItPmwyY2FwX2NpZCk7Ci0KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX2JjYi0+eG1pdF9xLCBwX2J1Zik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEwyQ0FfRGF0YVdyaXRlKHBfYmNiLT5sMmNhcF9jaWQsIHBfYnVmKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcHVfYnVpbGRfYm5lcF9oZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBCTkVQIGhlYWRlciBmb3IgYSBwYWNrZXQKLSAqICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGhlYWRlcnMgYXJlIG5vdCBzZW50IHlldCwgc28gdGhlcmUgaXMgbm8KLSAqICAgICAgICAgICAgICAgICAgY2hlY2sgZm9yIHRoYXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfYnVpbGRfYm5lcF9oZHIodEJORVBfQ09OTiogcF9iY2IsIEJUX0hEUiogcF9idWYsIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwX3NyY19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwX2Rlc3RfYWRkciwgYm9vbCBmd19leHRfcHJlc2VudCkgewotICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLSAgdWludDhfdCBleHRfYml0LCAqcCA9ICh1aW50OF90KilOVUxMOwotICB1aW50OF90IHR5cGUgPSBCTkVQX0ZSQU1FX0NPTVBSRVNTRURfRVRIRVJORVQ7Ci0KLSAgZXh0X2JpdCA9IGZ3X2V4dF9wcmVzZW50ID8gMHg4MCA6IDB4MDA7Ci0KLSAgaWYgKHBfc3JjX2FkZHIgJiYgKnBfc3JjX2FkZHIgIT0gKmNvbnRyb2xsZXItPmdldF9hZGRyZXNzKCkpCi0gICAgdHlwZSA9IEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVF9TUkNfT05MWTsKLQotICBpZiAoKnBfZGVzdF9hZGRyICE9IHBfYmNiLT5yZW1fYmRhKQotICAgIHR5cGUgPSAodHlwZSA9PSBCTkVQX0ZSQU1FX0NPTVBSRVNTRURfRVRIRVJORVQpCi0gICAgICAgICAgICAgICA/IEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVF9ERVNUX09OTFkKLSAgICAgICAgICAgICAgIDogQk5FUF9GUkFNRV9HRU5FUkFMX0VUSEVSTkVUOwotCi0gIGlmICghcF9zcmNfYWRkcikgcF9zcmNfYWRkciA9IGNvbnRyb2xsZXItPmdldF9hZGRyZXNzKCk7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCTkVQX0ZSQU1FX0dFTkVSQUxfRVRIRVJORVQ6Ci0gICAgICBwID0gYm5lcHVfaW5pdF9oZHIocF9idWYsIDE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KShleHRfYml0IHwgQk5FUF9GUkFNRV9HRU5FUkFMX0VUSEVSTkVUKSk7Ci0KLSAgICAgIG1lbWNweShwLCBwX2Rlc3RfYWRkci0+YWRkcmVzcywgQkRfQUREUl9MRU4pOwotICAgICAgcCArPSBCRF9BRERSX0xFTjsKLQotICAgICAgbWVtY3B5KHAsIHBfc3JjX2FkZHItPmFkZHJlc3MsIEJEX0FERFJfTEVOKTsKLSAgICAgIHAgKz0gQkRfQUREUl9MRU47Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9GUkFNRV9DT01QUkVTU0VEX0VUSEVSTkVUOgotICAgICAgcCA9IGJuZXB1X2luaXRfaGRyKHBfYnVmLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KShleHRfYml0IHwgQk5FUF9GUkFNRV9DT01QUkVTU0VEX0VUSEVSTkVUKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9GUkFNRV9DT01QUkVTU0VEX0VUSEVSTkVUX1NSQ19PTkxZOgotICAgICAgcCA9IGJuZXB1X2luaXRfaGRyKAotICAgICAgICAgIHBfYnVmLCA5LAotICAgICAgICAgICh1aW50OF90KShleHRfYml0IHwgQk5FUF9GUkFNRV9DT01QUkVTU0VEX0VUSEVSTkVUX1NSQ19PTkxZKSk7Ci0KLSAgICAgIG1lbWNweShwLCBwX3NyY19hZGRyLT5hZGRyZXNzLCBCRF9BRERSX0xFTik7Ci0gICAgICBwICs9IEJEX0FERFJfTEVOOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJORVBfRlJBTUVfQ09NUFJFU1NFRF9FVEhFUk5FVF9ERVNUX09OTFk6Ci0gICAgICBwID0gYm5lcHVfaW5pdF9oZHIoCi0gICAgICAgICAgcF9idWYsIDksCi0gICAgICAgICAgKHVpbnQ4X3QpKGV4dF9iaXQgfCBCTkVQX0ZSQU1FX0NPTVBSRVNTRURfRVRIRVJORVRfREVTVF9PTkxZKSk7Ci0KLSAgICAgIG1lbWNweShwLCBwX2Rlc3RfYWRkci0+YWRkcmVzcywgQkRfQUREUl9MRU4pOwotICAgICAgcCArPSBCRF9BRERSX0xFTjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwcm90b2NvbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9pbml0X2hkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQk5FUCBoZWFkZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gaGVhZGVyIGluIGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCogYm5lcHVfaW5pdF9oZHIoQlRfSERSKiBwX2J1ZiwgdWludDE2X3QgaGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBrdF90eXBlKSB7Ci0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIG1ha2Ugc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLwotICBpZiAocF9idWYtPm9mZnNldCA8IChoZHJfbGVuICsgTDJDQVBfTUlOX09GRlNFVCkpIHsKLSAgICB1aW50MTZfdCB4eCwgZGlmZiA9IEJORVBfTUlOSU1VTV9PRkZTRVQgLSBwX2J1Zi0+b2Zmc2V0OwotICAgIHAgPSBwICsgcF9idWYtPmxlbiAtIDE7Ci0gICAgZm9yICh4eCA9IDA7IHh4IDwgcF9idWYtPmxlbjsgeHgrKywgcC0tKSBwW2RpZmZdID0gKnA7Ci0KLSAgICBwX2J1Zi0+b2Zmc2V0ID0gQk5FUF9NSU5JTVVNX09GRlNFVDsKLSAgICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLSAgfQotCi0gIHBfYnVmLT5sZW4gKz0gaGRyX2xlbjsKLSAgcF9idWYtPm9mZnNldCAtPSBoZHJfbGVuOwotICBwIC09IGhkcl9sZW47Ci0KLSAgKnArKyA9IHBrdF90eXBlOwotCi0gIHJldHVybiAocCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwX3Byb2Nlc3Nfc2V0dXBfY29ubl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgcGVlcidzIHNldHVwIGNvbm5lY3Rpb24gcmVxdWVzdAotICogICAgICAgICAgICAgICAgICBtZXNzYWdlLiBUaGUgZGVzdGluYXRpb24gVVVJRCBpcyB2ZXJpZmllZCBhbmQgcmVzcG9uc2Ugc2VudAotICogICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIG9wZW4gaW5kaWNhdGlvbiB3aWxsIGJlIGdpdmVuIHRvIFBBTiBwcm9maWxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcF9wcm9jZXNzX3NldHVwX2Nvbm5fcmVxKHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50OF90KiBwX3NldHVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZW4pIHsKLSAgTE9HX0RFQlVHKCJCTkVQIC0gZm9yIENJRDogMHgleCIsIHBfYmNiLT5sMmNhcF9jaWQpOwotCi0gIGlmIChwX2JjYi0+Y29uX3N0YXRlICE9IEJORVBfU1RBVEVfQ09OTl9TRVRVUCAmJgotICAgICAgcF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX1NFQ19DSEVDS0lORyAmJgotICAgICAgcF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgIExPR19FUlJPUigiQk5FUCAtIHNldHVwIHJlcXVlc3QgaW4gYmFkIHN0YXRlICVkIiwgcF9iY2ItPmNvbl9zdGF0ZSk7Ci0gICAgYm5lcF9zZW5kX2Nvbm5fcmVzcG9uY2UocF9iY2IsIEJORVBfU0VUVVBfQ09OTl9OT1RfQUxMT1dFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgd2UgYWxyZWFkeSBpbml0aWF0ZWQgc2VjdXJpdHkgY2hlY2sgb3IgaWYgd2FpdGluZyBmb3IgdXNlcgotICAgKiByZXNwb25jZSAqLwotICBpZiAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfU0VUVVBfUkNWRCkgewotICAgIExPR19XQVJOKAotICAgICAgICAiQk5FUCAtIER1cGxpY2F0ZSBTZXR1cCBtZXNzYWdlIHJlY2VpdmVkIHdoaWxlIGRvaW5nIHNlY3VyaXR5IGNoZWNrIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgcGVlciBpcyB0aGUgb3JpZ2luYXRvciAqLwotICBpZiAocF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRCAmJgotICAgICAgKCEocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfU0VUVVBfUkNWRCkpICYmCi0gICAgICAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfSVNfT1JJRykpIHsKLSAgICBMT0dfRVJST1IoIkJORVAgLSBzZXR1cCByZXF1ZXN0IHdoZW4gd2UgYXJlIG9yaWdpbmF0b3Igc3RhdGU6JWh1IiwKLSAgICAgICAgICAgICAgcF9iY2ItPmNvbl9zdGF0ZSk7Ci0gICAgYm5lcF9zZW5kX2Nvbm5fcmVzcG9uY2UocF9iY2IsIEJORVBfU0VUVVBfQ09OTl9OT1RfQUxMT1dFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfYmNiLT5jb25fc3RhdGUgPT0gQk5FUF9TVEFURV9DT05ORUNURUQpIHsKLSAgICBwX2JjYi0+cHJ2X3NyY191dWlkID0gcF9iY2ItPnNyY191dWlkOwotICAgIHBfYmNiLT5wcnZfZHN0X3V1aWQgPSBwX2JjYi0+ZHN0X3V1aWQ7Ci0gIH0KLQotICBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgLyogYmVjYXVzZSBwZWVyIGluaXRpYXRlZCBjb25uZWN0aW9uIGtlZXAgc3JjIHV1aWQgYXMgZHN0IHV1aWQgKi8KLSAgICB1aW50MTZfdCB0bXA7Ci0KLSAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHRtcCwgcF9zZXR1cCk7Ci0gICAgcF9iY2ItPnNyY191dWlkID0gVXVpZDo6RnJvbTE2Qml0KHRtcCk7Ci0KLSAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHRtcCwgcF9zZXR1cCk7Ci0gICAgcF9iY2ItPmRzdF91dWlkID0gVXVpZDo6RnJvbTE2Qml0KHRtcCk7Ci0KLSAgICAvKiBJZiBub3RoaW5nIGhhcyBjaGFuZ2VkIGRvbid0IGJvdGhlciB0aGUgcHJvZmlsZSAqLwotICAgIGlmIChwX2JjYi0+Y29uX3N0YXRlID09IEJORVBfU1RBVEVfQ09OTkVDVEVEICYmCi0gICAgICAgIHBfYmNiLT5zcmNfdXVpZCA9PSBwX2JjYi0+cHJ2X3NyY191dWlkICYmCi0gICAgICAgIHBfYmNiLT5kc3RfdXVpZCA9PSBwX2JjYi0+cHJ2X2RzdF91dWlkKSB7Ci0gICAgICBibmVwX3NlbmRfY29ubl9yZXNwb25jZShwX2JjYiwgQk5FUF9TRVRVUF9DT05OX09LKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczMyKSB7Ci0gICAgdWludDMyX3QgdG1wOwotCi0gICAgQkVfU1RSRUFNX1RPX1VJTlQzMih0bXAsIHBfc2V0dXApOwotICAgIHBfYmNiLT5zcmNfdXVpZCA9IFV1aWQ6OkZyb20zMkJpdCh0bXApOwotCi0gICAgQkVfU1RSRUFNX1RPX1VJTlQzMih0bXAsIHBfc2V0dXApOwotICAgIHBfYmNiLT5kc3RfdXVpZCA9IFV1aWQ6OkZyb20zMkJpdCh0bXApOwotICB9IGVsc2UgaWYgKGxlbiA9PSBVdWlkOjprTnVtQnl0ZXMxMjgpIHsKLSAgICBwX2JjYi0+c3JjX3V1aWQgPSBVdWlkOjpGcm9tMTI4Qml0QkUocF9zZXR1cCk7Ci0gICAgcF9zZXR1cCArPSBsZW47Ci0KLSAgICBwX2JjYi0+ZHN0X3V1aWQgPSBVdWlkOjpGcm9tMTI4Qml0QkUocF9zZXR1cCk7Ci0gICAgcF9zZXR1cCArPSBsZW47Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0VSUk9SKCJCTkVQIC0gQmFkIFVJRCBsZW4gJWQgaW4gQ29ublJlcSIsIGxlbik7Ci0gICAgYm5lcF9zZW5kX2Nvbm5fcmVzcG9uY2UocF9iY2IsIEJORVBfU0VUVVBfSU5WQUxJRF9VVUlEX1NJWkUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfYmNiLT5jb25fc3RhdGUgPSBCTkVQX1NUQVRFX1NFQ19DSEVDS0lORzsKLSAgcF9iY2ItPmNvbl9mbGFncyB8PSBCTkVQX0ZMQUdTX1NFVFVQX1JDVkQ7Ci0KLSAgTE9HX0RFQlVHKCJCTkVQIGluaXRpYXRpbmcgc2VjdXJpdHkgY2hlY2sgZm9yIGluY29taW5nIGNhbGwgZm9yIHV1aWQgJXMiLAotICAgICAgICAgICAgcF9iY2ItPnNyY191dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGJuZXBfc2VjX2NoZWNrX2NvbXBsZXRlKCZwX2JjYi0+cmVtX2JkYSwgQlRfVFJBTlNQT1JUX0JSX0VEUiwgcF9iY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9wcm9jZXNzX3NldHVwX2Nvbm5fcmVzcG9uY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgcGVlcidzIHNldHVwIGNvbm5lY3Rpb24gcmVzcG9uc2UKLSAqICAgICAgICAgICAgICAgICAgbWVzc2FnZS4gVGhlIHJlc3BvbnNlIGNvZGUgaXMgdmVyaWZpZWQgYW5kCi0gKiAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gb3BlbiBpbmRpY2F0aW9uIHdpbGwgYmUgZ2l2ZW4gdG8gUEFOIHByb2ZpbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBibmVwX3Byb2Nlc3Nfc2V0dXBfY29ubl9yZXNwb25jZSh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDhfdCogcF9zZXR1cCkgewotICB0Qk5FUF9SRVNVTFQgcmVzcDsKLSAgdWludDE2X3QgcmVzcF9jb2RlOwotCi0gIEJORVBfVFJBQ0VfREVCVUcoIkJORVAgcmVjZWl2ZWQgc2V0dXAgcmVzcG9uY2UiKTsKLSAgLyogVGhlIHN0YXRlIHNob3VsZCBiZSBlaXRoZXIgU0VUVVAgb3IgQ09OTkVDVEVEICovCi0gIGlmIChwX2JjYi0+Y29uX3N0YXRlICE9IEJORVBfU1RBVEVfQ09OTl9TRVRVUCkgewotICAgIC8qIFNob3VsZCB3ZSBkaXNjb25uZWN0ID8gKi8KLSAgICBCTkVQX1RSQUNFX0VSUk9SKCJCTkVQIC0gc2V0dXAgcmVzcG9uc2UgaW4gYmFkIHN0YXRlICVkIiwgcF9iY2ItPmNvbl9zdGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgd2UgYXJlIHRoZSBvcmlnaW5hdG9yICovCi0gIGlmICghKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0lTX09SSUcpKSB7Ci0gICAgQk5FUF9UUkFDRV9FUlJPUigiQk5FUCAtIHNldHVwIHJlc3BvbnNlIHdoZW4gd2UgYXJlIG5vdCBvcmlnaW5hdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgIHBfYmNiLT5jb25fc3RhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJFX1NUUkVBTV9UT19VSU5UMTYocmVzcF9jb2RlLCBwX3NldHVwKTsKLQotICBzd2l0Y2ggKHJlc3BfY29kZSkgewotICAgIGNhc2UgQk5FUF9TRVRVUF9JTlZBTElEX1NSQ19VVUlEOgotICAgICAgcmVzcCA9IEJORVBfQ09OTl9GQUlMRURfU1JDX1VVSUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9TRVRVUF9JTlZBTElEX0RFU1RfVVVJRDoKLSAgICAgIHJlc3AgPSBCTkVQX0NPTk5fRkFJTEVEX0RTVF9VVUlEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJORVBfU0VUVVBfSU5WQUxJRF9VVUlEX1NJWkU6Ci0gICAgICByZXNwID0gQk5FUF9DT05OX0ZBSUxFRF9VVUlEX1NJWkU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9TRVRVUF9DT05OX05PVF9BTExPV0VEOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXNwID0gQk5FUF9DT05OX0ZBSUxFRDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ2hlY2sgdGhlIHJlc3BvbmNlIGNvZGUgKi8KLSAgaWYgKHJlc3BfY29kZSAhPSBCTkVQX1NFVFVQX0NPTk5fT0spIHsKLSAgICBpZiAocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfQ09OTl9DT01QTEVURUQpIHsKLSAgICAgIEJORVBfVFJBQ0VfRVZFTlQoIkJORVAgLSByb2xlIGNoYW5nZSByZXNwb25zZSBpcyAlZCIsIHJlc3BfY29kZSk7Ci0KLSAgICAgIC8qIFJlc3RvcmUgdGhlIGVhcmxpZXIgQk5FUCBzdGF0dXMgKi8KLSAgICAgIHBfYmNiLT5jb25fc3RhdGUgPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgIHBfYmNiLT5jb25fZmxhZ3MgJj0gKH5CTkVQX0ZMQUdTX1NFVFVQX1JDVkQpOwotICAgICAgcF9iY2ItPnNyY191dWlkID0gcF9iY2ItPnBydl9zcmNfdXVpZDsKLSAgICAgIHBfYmNiLT5kc3RfdXVpZCA9IHBfYmNiLT5wcnZfZHN0X3V1aWQ7Ci0KLSAgICAgIC8qIEVuc3VyZSB0aW1lciBpcyBzdG9wcGVkICovCi0gICAgICBhbGFybV9jYW5jZWwocF9iY2ItPmNvbm5fdGltZXIpOwotICAgICAgcF9iY2ItPnJlX3RyYW5zbWl0cyA9IDA7Ci0KLSAgICAgIC8qIFRlbGwgdGhlIHVzZXIgaWYgdGhlcmUgaXMgYSBjYWxsYmFjayAqLwotICAgICAgaWYgKGJuZXBfY2IucF9jb25uX3N0YXRlX2NiKQotICAgICAgICAoKmJuZXBfY2IucF9jb25uX3N0YXRlX2NiKShwX2JjYi0+aGFuZGxlLCBwX2JjYi0+cmVtX2JkYSwgcmVzcCwgdHJ1ZSk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgQk5FUF9UUkFDRV9FUlJPUigiQk5FUCAtIHNldHVwIHJlc3BvbnNlICVkIGlzIG5vdCBPSyIsIHJlc3BfY29kZSk7Ci0KLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX2JjYi0+bDJjYXBfY2lkKTsKLQotICAgICAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gICAgICBpZiAoKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0lTX09SSUcpICYmIChibmVwX2NiLnBfY29ubl9zdGF0ZV9jYikpCi0gICAgICAgICgqYm5lcF9jYi5wX2Nvbm5fc3RhdGVfY2IpKHBfYmNiLT5oYW5kbGUsIHBfYmNiLT5yZW1fYmRhLCByZXNwLCBmYWxzZSk7Ci0KLSAgICAgIGJuZXB1X3JlbGVhc2VfYmNiKHBfYmNiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvKiBSZWNlaXZlZCBzdWNjZXNzZnVsIHJlc3BvbmNlICovCi0gIGJuZXBfY29ubmVjdGVkKHBfYmNiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXBfcHJvY2Vzc19jb250cm9sX3BhY2tldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSBwZWVyJ3Mgc2V0dXAgY29ubmVjdGlvbiByZXF1ZXN0Ci0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuIFRoZSBkZXN0aW5hdGlvbiBVVUlEIGlzIHZlcmlmaWVkIGFuZCByZXNwb25zZSBzZW50Ci0gKiAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gb3BlbiBpbmRpY2F0aW9uIHdpbGwgYmUgZ2l2ZW4gdG8gUEFOIHByb2ZpbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCogYm5lcF9wcm9jZXNzX2NvbnRyb2xfcGFja2V0KHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiByZW1fbGVuLCBib29sIGlzX2V4dCkgewotICB1aW50OF90IGNvbnRyb2xfdHlwZTsKLSAgdWludDE2X3QgbGVuLCBleHRfbGVuID0gMDsKLQotICBpZiAocCA9PSBOVUxMIHx8IHJlbV9sZW4gPT0gTlVMTCkgewotICAgIGlmIChyZW1fbGVuICE9IE5VTEwpICpyZW1fbGVuID0gMDsKLSAgICBCTkVQX1RSQUNFX0RFQlVHKCIlczogaW52YWxpZCBwYWNrZXQ6IHAgPSAlcCByZW1fbGVuID0gJXAiLCBfX2Z1bmNfXywgcCwKLSAgICAgICAgICAgICAgICAgICAgIHJlbV9sZW4pOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHVpbnQxNl90IHJlbV9sZW5fb3JpZyA9ICpyZW1fbGVuOwotCi0gIGlmIChpc19leHQpIHsKLSAgICBpZiAoKnJlbV9sZW4gPCAxKSBnb3RvIGJhZF9wYWNrZXRfbGVuZ3RoOwotICAgIGV4dF9sZW4gPSAqcCsrOwotICAgICpyZW1fbGVuID0gKnJlbV9sZW4gLSAxOwotICB9Ci0KLSAgaWYgKCpyZW1fbGVuIDwgMSkgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgY29udHJvbF90eXBlID0gKnArKzsKLSAgKnJlbV9sZW4gPSAqcmVtX2xlbiAtIDE7Ci0KLSAgQk5FUF9UUkFDRV9FVkVOVCgKLSAgICAgICIlczogQk5FUCBwcm9jZXNzaW5nIGNvbnRyb2wgcGFja2V0IHJlbV9sZW4gJWQsIGlzX2V4dCAlZCwgY3RybF90eXBlICVkIiwKLSAgICAgIF9fZnVuY19fLCAqcmVtX2xlbiwgaXNfZXh0LCBjb250cm9sX3R5cGUpOwotCi0gIHN3aXRjaCAoY29udHJvbF90eXBlKSB7Ci0gICAgY2FzZSBCTkVQX0NPTlRST0xfQ09NTUFORF9OT1RfVU5ERVJTVE9PRDoKLSAgICAgIGlmICgqcmVtX2xlbiA8IDEpIHsKLSAgICAgICAgQk5FUF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICIlczogUmVjZWl2ZWQgQk5FUF9DT05UUk9MX0NPTU1BTkRfTk9UX1VOREVSU1RPT0Qgd2l0aCBiYWQgbGVuZ3RoIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIEJORVBfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX0NPTlRST0xfQ09NTUFORF9OT1RfVU5ERVJTVE9PRCBmb3IgcGt0IHR5cGU6ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgKnApOwotICAgICAgcCsrOwotICAgICAgKnJlbV9sZW4gPSAqcmVtX2xlbiAtIDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9TRVRVUF9DT05ORUNUSU9OX1JFUVVFU1RfTVNHOgotICAgICAgaWYgKCpyZW1fbGVuIDwgMSkgewotICAgICAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX1NFVFVQX0NPTk5FQ1RJT05fUkVRVUVTVF9NU0cgd2l0aCBiYWQgbGVuZ3RoIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2OTE3NzI5MiIpOwotICAgICAgICBnb3RvIGJhZF9wYWNrZXRfbGVuZ3RoOwotICAgICAgfQotICAgICAgbGVuID0gKnArKzsKLSAgICAgIGlmICgqcmVtX2xlbiA8ICgoMiAqIGxlbikgKyAxKSkgewotICAgICAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX1NFVFVQX0NPTk5FQ1RJT05fUkVRVUVTVF9NU0cgd2l0aCBiYWQgbGVuZ3RoIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIGlmICghaXNfZXh0KSBibmVwX3Byb2Nlc3Nfc2V0dXBfY29ubl9yZXEocF9iY2IsIHAsICh1aW50OF90KWxlbik7Ci0gICAgICBwICs9ICgyICogbGVuKTsKLSAgICAgICpyZW1fbGVuID0gKnJlbV9sZW4gLSAoMiAqIGxlbikgLSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJORVBfU0VUVVBfQ09OTkVDVElPTl9SRVNQT05TRV9NU0c6Ci0gICAgICBpZiAoKnJlbV9sZW4gPCAyKSB7Ci0gICAgICAgIEJORVBfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiJXM6IFJlY2VpdmVkIEJORVBfU0VUVVBfQ09OTkVDVElPTl9SRVNQT05TRV9NU0cgd2l0aCBiYWQgbGVuZ3RoIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIGlmICghaXNfZXh0KSBibmVwX3Byb2Nlc3Nfc2V0dXBfY29ubl9yZXNwb25jZShwX2JjYiwgcCk7Ci0gICAgICBwICs9IDI7Ci0gICAgICAqcmVtX2xlbiA9ICpyZW1fbGVuIC0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9TRVRfTVNHOgotICAgICAgaWYgKCpyZW1fbGVuIDwgMikgewotICAgICAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9TRVRfTVNHIHdpdGggYmFkIGxlbmd0aCIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjkxNzcyOTIiKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwKTsKLSAgICAgIGlmICgqcmVtX2xlbiA8IChsZW4gKyAyKSkgewotICAgICAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9TRVRfTVNHIHdpdGggYmFkIGxlbmd0aCIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGdvdG8gYmFkX3BhY2tldF9sZW5ndGg7Ci0gICAgICB9Ci0gICAgICBibmVwdV9wcm9jZXNzX3BlZXJfZmlsdGVyX3NldChwX2JjYiwgcCwgbGVuKTsKLSAgICAgIHAgKz0gbGVuOwotICAgICAgKnJlbV9sZW4gPSAqcmVtX2xlbiAtIGxlbiAtIDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9GSUxURVJfTkVUX1RZUEVfUkVTUE9OU0VfTVNHOgotICAgICAgaWYgKCpyZW1fbGVuIDwgMikgewotICAgICAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9SRVNQT05TRV9NU0cgd2l0aCBiYWQgbGVuZ3RoIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIGJuZXB1X3Byb2Nlc3NfcGVlcl9maWx0ZXJfcnNwKHBfYmNiLCBwKTsKLSAgICAgIHAgKz0gMjsKLSAgICAgICpyZW1fbGVuID0gKnJlbV9sZW4gLSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJORVBfRklMVEVSX01VTFRJX0FERFJfU0VUX01TRzoKLSAgICAgIGlmICgqcmVtX2xlbiA8IDIpIHsKLSAgICAgICAgQk5FUF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICIlczogUmVjZWl2ZWQgQk5FUF9GSUxURVJfTVVMVElfQUREUl9TRVRfTVNHIHdpdGggYmFkIGxlbmd0aCIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjkxNzcyOTIiKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYobGVuLCBwKTsKLSAgICAgIGlmICgqcmVtX2xlbiA8IChsZW4gKyAyKSkgewotICAgICAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBSZWNlaXZlZCBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1NFVF9NU0cgd2l0aCBiYWQgbGVuZ3RoIiwKLSAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgZ290byBiYWRfcGFja2V0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIGJuZXB1X3Byb2Nlc3NfcGVlcl9tdWx0aWNhc3RfZmlsdGVyX3NldChwX2JjYiwgcCwgbGVuKTsKLSAgICAgIHAgKz0gbGVuOwotICAgICAgKnJlbV9sZW4gPSAqcmVtX2xlbiAtIGxlbiAtIDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQk5FUF9GSUxURVJfTVVMVElfQUREUl9SRVNQT05TRV9NU0c6Ci0gICAgICBpZiAoKnJlbV9sZW4gPCAyKSB7Ci0gICAgICAgIEJORVBfVFJBQ0VfRVJST1IoCi0gICAgICAgICAgICAiJXM6IFJlY2VpdmVkIEJORVBfRklMVEVSX01VTFRJX0FERFJfUkVTUE9OU0VfTVNHIHdpdGggYmFkIGxlbmd0aCIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIGdvdG8gYmFkX3BhY2tldF9sZW5ndGg7Ci0gICAgICB9Ci0gICAgICBibmVwdV9wcm9jZXNzX211bHRpY2FzdF9maWx0ZXJfcnNwKHBfYmNiLCBwKTsKLSAgICAgIHAgKz0gMjsKLSAgICAgICpyZW1fbGVuID0gKnJlbV9sZW4gLSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQk5FUF9UUkFDRV9FUlJPUigiJXM6IEJORVAgLSBiYWQgY3RsIHBrdCB0eXBlOiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX3R5cGUpOwotICAgICAgYm5lcF9zZW5kX2NvbW1hbmRfbm90X3VuZGVyc3Rvb2QocF9iY2IsIGNvbnRyb2xfdHlwZSk7Ci0gICAgICBpZiAoaXNfZXh0ICYmIChleHRfbGVuID4gMCkpIHsKLSAgICAgICAgaWYgKCpyZW1fbGVuIDwgKGV4dF9sZW4gLSAxKSkgewotICAgICAgICAgIGdvdG8gYmFkX3BhY2tldF9sZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgcCArPSAoZXh0X2xlbiAtIDEpOwotICAgICAgICAqcmVtX2xlbiAtPSAoZXh0X2xlbiAtIDEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHA7Ci0KLWJhZF9wYWNrZXRfbGVuZ3RoOgotICBCTkVQX1RSQUNFX0VSUk9SKCIlczogYmFkIGNvbnRyb2wgcGFja2V0IGxlbmd0aDogb3JpZ2luYWw9JWQgcmVtYWluaW5nPSVkIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVtX2xlbl9vcmlnLCAqcmVtX2xlbik7Ci0gICpyZW1fbGVuID0gMDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9wcm9jZXNzX3BlZXJfZmlsdGVyX3NldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSBwZWVyJ3MgZmlsdGVyIGNvbnRyb2wKLSAqICAgICAgICAgICAgICAgICAgJ3NldCcgbWVzc2FnZS4gVGhlIGZpbHRlcnMgYXJlIHN0b3JlZCBpbiB0aGUgQkNCLAotICogICAgICAgICAgICAgICAgICBhbmQgYW4gYXBwcm9wcmlhdGUgZmlsdGVyIHJlc3BvbnNlIG1lc3NhZ2Ugc2VudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBibmVwdV9wcm9jZXNzX3BlZXJfZmlsdGVyX3NldCh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDhfdCogcF9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgdWludDE2X3QgbnVtX2ZpbHRlcnMgPSAwOwotICB1aW50MTZfdCB4eCwgcmVzcF9jb2RlID0gQk5FUF9GSUxURVJfQ1JMX09LOwotICB1aW50MTZfdCBzdGFydCwgZW5kOwotICB1aW50OF90KiBwX3RlbXBfZmlsdGVyczsKLQotICBpZiAoKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9DT05ORUNURUQpICYmCi0gICAgICAoIShwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19DT05OX0NPTVBMRVRFRCkpKSB7Ci0gICAgQk5FUF9UUkFDRV9ERUJVRygKLSAgICAgICAgIkJORVAgcmVjZWl2ZWQgZmlsdGVyIHNldCBmcm9tIHBlZXIgd2hlbiB0aGVyZSBpcyBubyBjb25uZWN0aW9uIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQk5FUF9UUkFDRV9ERUJVRygiQk5FUCByZWNlaXZlZCBmaWx0ZXIgc2V0IGZyb20gcGVlciIpOwotICAvKiBDaGVjayBmb3IgbGVuZ3RoIG5vdCBhIG11bHRpcGxlIG9mIDQgKi8KLSAgaWYgKGxlbiAmIDMpIHsKLSAgICBCTkVQX1RSQUNFX0VWRU5UKCJCTkVQIC0gYmFkIGZpbHRlciBsZW46ICVkIiwgbGVuKTsKLSAgICBibmVwdV9zZW5kX3BlZXJfZmlsdGVyX3JzcChwX2JjYiwgQk5FUF9GSUxURVJfQ1JMX0JBRF9SQU5HRSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxlbikgbnVtX2ZpbHRlcnMgPSAodWludDE2X3QpKGxlbiA+PiAyKTsKLQotICAvKiBWYWxpZGF0ZSBmaWx0ZXIgdmFsdWVzICovCi0gIGlmIChudW1fZmlsdGVycyA8PSBCTkVQX01BWF9QUk9UX0ZJTFRFUlMpIHsKLSAgICBwX3RlbXBfZmlsdGVycyA9IHBfZmlsdGVyczsKLSAgICBmb3IgKHh4ID0gMDsgeHggPCBudW1fZmlsdGVyczsgeHgrKykgewotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihzdGFydCwgcF90ZW1wX2ZpbHRlcnMpOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihlbmQsIHBfdGVtcF9maWx0ZXJzKTsKLQotICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7Ci0gICAgICAgIHJlc3BfY29kZSA9IEJORVBfRklMVEVSX0NSTF9CQURfUkFOR0U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlCi0gICAgcmVzcF9jb2RlID0gQk5FUF9GSUxURVJfQ1JMX01BWF9SRUFDSEVEOwotCi0gIGlmIChyZXNwX2NvZGUgIT0gQk5FUF9GSUxURVJfQ1JMX09LKSB7Ci0gICAgYm5lcHVfc2VuZF9wZWVyX2ZpbHRlcl9yc3AocF9iY2IsIHJlc3BfY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJuZXBfY2IucF9maWx0ZXJfaW5kX2NiKQotICAgICgqYm5lcF9jYi5wX2ZpbHRlcl9pbmRfY2IpKHBfYmNiLT5oYW5kbGUsIHRydWUsIDAsIGxlbiwgcF9maWx0ZXJzKTsKLQotICBwX2JjYi0+cmN2ZF9udW1fZmlsdGVycyA9IG51bV9maWx0ZXJzOwotICBmb3IgKHh4ID0gMDsgeHggPCBudW1fZmlsdGVyczsgeHgrKykgewotICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoc3RhcnQsIHBfZmlsdGVycyk7Ci0gICAgQkVfU1RSRUFNX1RPX1VJTlQxNihlbmQsIHBfZmlsdGVycyk7Ci0KLSAgICBwX2JjYi0+cmN2ZF9wcm90X2ZpbHRlcl9zdGFydFt4eF0gPSBzdGFydDsKLSAgICBwX2JjYi0+cmN2ZF9wcm90X2ZpbHRlcl9lbmRbeHhdID0gZW5kOwotICB9Ci0KLSAgYm5lcHVfc2VuZF9wZWVyX2ZpbHRlcl9yc3AocF9iY2IsIHJlc3BfY29kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9wcm9jZXNzX3BlZXJfZmlsdGVyX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSBwZWVyJ3MgZmlsdGVyIGNvbnRyb2wKLSAqICAgICAgICAgICAgICAgICAgJ3Jlc3BvbnNlJyBtZXNzYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJuZXB1X3Byb2Nlc3NfcGVlcl9maWx0ZXJfcnNwKHRCTkVQX0NPTk4qIHBfYmNiLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDE2X3QgcmVzcF9jb2RlOwotICB0Qk5FUF9SRVNVTFQgcmVzdWx0OwotCi0gIEJORVBfVFJBQ0VfREVCVUcoIkJORVAgcmVjZWl2ZWQgZmlsdGVyIHJlc3BvbmNlIik7Ci0gIC8qIFRoZSBzdGF0ZSBzaG91bGQgYmUgIENPTk5FQ1RFRCAqLwotICBpZiAoKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9DT05ORUNURUQpICYmCi0gICAgICAoIShwX2JjYi0+Y29uX2ZsYWdzICYgQk5FUF9GTEFHU19DT05OX0NPTVBMRVRFRCkpKSB7Ci0gICAgQk5FUF9UUkFDRV9FUlJPUigiQk5FUCAtIGZpbHRlciByZXNwb25zZSBpbiBiYWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgcF9iY2ItPmNvbl9zdGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgd2UgYXJlIHRoZSBvcmlnaW5hdG9yICovCi0gIGlmICghKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0ZJTFRFUl9SRVNQX1BFTkQpKSB7Ci0gICAgQk5FUF9UUkFDRV9FUlJPUigiQk5FUCAtIGZpbHRlciByZXNwb25zZSB3aGVuIG5vdCBleHBlY3RpbmciKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBFbnN1cmUgdGltZXIgaXMgc3RvcHBlZCAqLwotICBhbGFybV9jYW5jZWwocF9iY2ItPmNvbm5fdGltZXIpOwotICBwX2JjYi0+Y29uX2ZsYWdzICY9IH5CTkVQX0ZMQUdTX0ZJTFRFUl9SRVNQX1BFTkQ7Ci0gIHBfYmNiLT5yZV90cmFuc21pdHMgPSAwOwotCi0gIEJFX1NUUkVBTV9UT19VSU5UMTYocmVzcF9jb2RlLCBwX2RhdGEpOwotCi0gIHJlc3VsdCA9IEJORVBfU1VDQ0VTUzsKLSAgaWYgKHJlc3BfY29kZSAhPSBCTkVQX0ZJTFRFUl9DUkxfT0spIHJlc3VsdCA9IEJORVBfU0VUX0ZJTFRFUl9GQUlMOwotCi0gIGlmIChibmVwX2NiLnBfZmlsdGVyX2luZF9jYikKLSAgICAoKmJuZXBfY2IucF9maWx0ZXJfaW5kX2NiKShwX2JjYi0+aGFuZGxlLCBmYWxzZSwgcmVzdWx0LCAwLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXB1X3Byb2Nlc3NfbXVsdGljYXN0X2ZpbHRlcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIG11bHRpY2FzdCBmaWx0ZXIgY29udHJvbAotICogICAgICAgICAgICAgICAgICAncmVzcG9uc2UnIG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfcHJvY2Vzc19tdWx0aWNhc3RfZmlsdGVyX3JzcCh0Qk5FUF9DT05OKiBwX2JjYiwgdWludDhfdCogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IHJlc3BfY29kZTsKLSAgdEJORVBfUkVTVUxUIHJlc3VsdDsKLQotICBCTkVQX1RSQUNFX0RFQlVHKCJCTkVQIHJlY2VpdmVkIG11bHRpY2FzdCBmaWx0ZXIgcmVzcG9uY2UiKTsKLSAgLyogVGhlIHN0YXRlIHNob3VsZCBiZSAgQ09OTkVDVEVEICovCi0gIGlmICgocF9iY2ItPmNvbl9zdGF0ZSAhPSBCTkVQX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLSAgICAgICghKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0NPTk5fQ09NUExFVEVEKSkpIHsKLSAgICBCTkVQX1RSQUNFX0VSUk9SKCJCTkVQIC0gbXVsdGljYXN0IGZpbHRlciByZXNwb25zZSBpbiBiYWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgcF9iY2ItPmNvbl9zdGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgd2UgYXJlIHRoZSBvcmlnaW5hdG9yICovCi0gIGlmICghKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX01VTFRJX1JFU1BfUEVORCkpIHsKLSAgICBCTkVQX1RSQUNFX0VSUk9SKCJCTkVQIC0gbXVsdGljYXN0IGZpbHRlciByZXNwb25zZSB3aGVuIG5vdCBleHBlY3RpbmciKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBFbnN1cmUgdGltZXIgaXMgc3RvcHBlZCAqLwotICBhbGFybV9jYW5jZWwocF9iY2ItPmNvbm5fdGltZXIpOwotICBwX2JjYi0+Y29uX2ZsYWdzICY9IH5CTkVQX0ZMQUdTX01VTFRJX1JFU1BfUEVORDsKLSAgcF9iY2ItPnJlX3RyYW5zbWl0cyA9IDA7Ci0KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihyZXNwX2NvZGUsIHBfZGF0YSk7Ci0KLSAgcmVzdWx0ID0gQk5FUF9TVUNDRVNTOwotICBpZiAocmVzcF9jb2RlICE9IEJORVBfRklMVEVSX0NSTF9PSykgcmVzdWx0ID0gQk5FUF9TRVRfRklMVEVSX0ZBSUw7Ci0KLSAgaWYgKGJuZXBfY2IucF9tZmlsdGVyX2luZF9jYikKLSAgICAoKmJuZXBfY2IucF9tZmlsdGVyX2luZF9jYikocF9iY2ItPmhhbmRsZSwgZmFsc2UsIHJlc3VsdCwgMCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9wcm9jZXNzX3BlZXJfbXVsdGljYXN0X2ZpbHRlcl9zZXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgcGVlcidzIGZpbHRlciBjb250cm9sCi0gKiAgICAgICAgICAgICAgICAgICdzZXQnIG1lc3NhZ2UuIFRoZSBmaWx0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIEJDQiwKLSAqICAgICAgICAgICAgICAgICAgYW5kIGFuIGFwcHJvcHJpYXRlIGZpbHRlciByZXNwb25zZSBtZXNzYWdlIHNlbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfcHJvY2Vzc19wZWVyX211bHRpY2FzdF9maWx0ZXJfc2V0KHRCTkVQX0NPTk4qIHBfYmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9maWx0ZXJzLCB1aW50MTZfdCBsZW4pIHsKLSAgdWludDE2X3QgcmVzcF9jb2RlID0gQk5FUF9GSUxURVJfQ1JMX09LOwotICB1aW50MTZfdCBudW1fZmlsdGVycywgeHg7Ci0gIHVpbnQ4X3QgKnBfdGVtcF9maWx0ZXJzLCBudWxsX2JkYVtCRF9BRERSX0xFTl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07Ci0KLSAgaWYgKChwX2JjYi0+Y29uX3N0YXRlICE9IEJORVBfU1RBVEVfQ09OTkVDVEVEKSAmJgotICAgICAgKCEocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfQ09OTl9DT01QTEVURUQpKSkgewotICAgIEJORVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICJCTkVQIHJlY2VpdmVkIG11bHRpY2FzdCBmaWx0ZXIgc2V0IGZyb20gcGVlciB3aGVuIHRoZXJlIGlzIG5vICIKLSAgICAgICAgImNvbm5lY3Rpb24iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobGVuICUgMTIpIHsKLSAgICBCTkVQX1RSQUNFX0VWRU5UKCJCTkVQIC0gYmFkIGZpbHRlciBsZW46ICVkIiwgbGVuKTsKLSAgICBibmVwdV9zZW5kX3BlZXJfbXVsdGljYXN0X2ZpbHRlcl9yc3AocF9iY2IsIEJORVBfRklMVEVSX0NSTF9CQURfUkFOR0UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChsZW4gPiAoQk5FUF9NQVhfTVVMVElfRklMVEVSUyAqIDIgKiBCRF9BRERSX0xFTikpIHsKLSAgICBCTkVQX1RSQUNFX0VWRU5UKCJCTkVQIC0gVG9vIG1hbnkgZmlsdGVycyIpOwotICAgIGJuZXB1X3NlbmRfcGVlcl9tdWx0aWNhc3RfZmlsdGVyX3JzcChwX2JjYiwgQk5FUF9GSUxURVJfQ1JMX01BWF9SRUFDSEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBudW1fZmlsdGVycyA9IDA7Ci0gIGlmIChsZW4pIG51bV9maWx0ZXJzID0gKHVpbnQxNl90KShsZW4gLyAxMik7Ci0KLSAgLyogVmFsaWRhdGUgZmlsdGVyIHZhbHVlcyAqLwotICBpZiAobnVtX2ZpbHRlcnMgPD0gQk5FUF9NQVhfTVVMVElfRklMVEVSUykgewotICAgIHBfdGVtcF9maWx0ZXJzID0gcF9maWx0ZXJzOwotICAgIGZvciAoeHggPSAwOyB4eCA8IG51bV9maWx0ZXJzOyB4eCsrKSB7Ci0gICAgICBpZiAobWVtY21wKHBfdGVtcF9maWx0ZXJzLCBwX3RlbXBfZmlsdGVycyArIEJEX0FERFJfTEVOLCBCRF9BRERSX0xFTikgPgotICAgICAgICAgIDApIHsKLSAgICAgICAgYm5lcHVfc2VuZF9wZWVyX211bHRpY2FzdF9maWx0ZXJfcnNwKHBfYmNiLCBCTkVQX0ZJTFRFUl9DUkxfQkFEX1JBTkdFKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwX3RlbXBfZmlsdGVycyArPSAoQkRfQUREUl9MRU4gKiAyKTsKLSAgICB9Ci0gIH0KLQotICBwX2JjYi0+cmN2ZF9tY2FzdF9maWx0ZXJzID0gbnVtX2ZpbHRlcnM7Ci0gIGZvciAoeHggPSAwOyB4eCA8IG51bV9maWx0ZXJzOyB4eCsrKSB7Ci0gICAgbWVtY3B5KHBfYmNiLT5yY3ZkX21jYXN0X2ZpbHRlcl9zdGFydFt4eF0uYWRkcmVzcywgcF9maWx0ZXJzLCBCRF9BRERSX0xFTik7Ci0gICAgbWVtY3B5KHBfYmNiLT5yY3ZkX21jYXN0X2ZpbHRlcl9lbmRbeHhdLmFkZHJlc3MsIHBfZmlsdGVycyArIEJEX0FERFJfTEVOLAotICAgICAgICAgICBCRF9BRERSX0xFTik7Ci0gICAgcF9maWx0ZXJzICs9IChCRF9BRERSX0xFTiAqIDIpOwotCi0gICAgLyogQ2hlY2sgaWYgYW55IG9mIHRoZSByYW5nZXMgaGF2ZSBhbGwgemVyb3MgYXMgYm90aCBzdGFydGluZyBhbmQgZW5kaW5nCi0gICAgICogYWRkcmVzc2VzICovCi0gICAgaWYgKChtZW1jbXAobnVsbF9iZGEsIHBfYmNiLT5yY3ZkX21jYXN0X2ZpbHRlcl9zdGFydFt4eF0uYWRkcmVzcywKLSAgICAgICAgICAgICAgICBCRF9BRERSX0xFTikgPT0gMCkgJiYKLSAgICAgICAgKG1lbWNtcChudWxsX2JkYSwgcF9iY2ItPnJjdmRfbWNhc3RfZmlsdGVyX2VuZFt4eF0uYWRkcmVzcywKLSAgICAgICAgICAgICAgICBCRF9BRERSX0xFTikgPT0gMCkpIHsKLSAgICAgIHBfYmNiLT5yY3ZkX21jYXN0X2ZpbHRlcnMgPSAweEZGRkY7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBCTkVQX1RSQUNFX0VWRU5UKCJCTkVQIG11bHRpY2FzdCBmaWx0ZXJzICVkIiwgcF9iY2ItPnJjdmRfbWNhc3RfZmlsdGVycyk7Ci0gIGJuZXB1X3NlbmRfcGVlcl9tdWx0aWNhc3RfZmlsdGVyX3JzcChwX2JjYiwgcmVzcF9jb2RlKTsKLQotICBpZiAoYm5lcF9jYi5wX21maWx0ZXJfaW5kX2NiKQotICAgICgqYm5lcF9jYi5wX21maWx0ZXJfaW5kX2NiKShwX2JjYi0+aGFuZGxlLCB0cnVlLCAwLCBsZW4sIHBfZmlsdGVycyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBibmVwdV9zZW5kX3BlZXJfbXVsdGljYXN0X2ZpbHRlcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBmaWx0ZXIgcmVzcG9uc2UgdG8gYSBwZWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm5lcHVfc2VuZF9wZWVyX211bHRpY2FzdF9maWx0ZXJfcnNwKHRCTkVQX0NPTk4qIHBfYmNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzcG9uc2VfY29kZSkgewotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhCTkVQX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcDsKLQotICBCTkVQX1RSQUNFX0RFQlVHKCJCTkVQIHNlbmRpbmcgbXVsdGljYXN0IGZpbHRlciByZXNwb25zZSAlZCIsIHJlc3BvbnNlX2NvZGUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBQdXQgaW4gQk5FUCBmcmFtZSB0eXBlIC0gZmlsdGVyIGNvbnRyb2wgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIEJORVBfRlJBTUVfQ09OVFJPTCk7Ci0KLSAgLyogUHV0IGluIGZpbHRlciBtZXNzYWdlIHR5cGUgLSBzZXQgZmlsdGVycyAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgQk5FUF9GSUxURVJfTVVMVElfQUREUl9SRVNQT05TRV9NU0cpOwotCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcmVzcG9uc2VfY29kZSk7Ci0KLSAgcF9idWYtPmxlbiA9IDQ7Ci0KLSAgYm5lcHVfY2hlY2tfc2VuZF9wYWNrZXQocF9iY2IsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJuZXBfc2VjX2NoZWNrX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCBCVE0gYW5kIHdpbGwgYmUgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHNlY3VyaXR5IHByb2NlZHVyZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBibmVwX3NlY19jaGVja19jb21wbGV0ZShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYXNucG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSkgewotICB0Qk5FUF9DT05OKiBwX2JjYiA9ICh0Qk5FUF9DT05OKilwX3JlZl9kYXRhOwotICB1aW50MTZfdCByZXNwX2NvZGUgPSBCTkVQX1NFVFVQX0NPTk5fT0s7Ci0gIGJvb2wgaXNfcm9sZV9jaGFuZ2U7Ci0KLSAgaWYgKHBfYmNiLT5jb25fZmxhZ3MgJiBCTkVQX0ZMQUdTX0NPTk5fQ09NUExFVEVEKQotICAgIGlzX3JvbGVfY2hhbmdlID0gdHJ1ZTsKLSAgZWxzZQotICAgIGlzX3JvbGVfY2hhbmdlID0gZmFsc2U7Ci0KLSAgLyogY2hlY2sgaWYgdGhlIHBvcnQgaXMgc3RpbGwgd2FpdGluZyBmb3Igc2VjdXJpdHkgdG8gY29tcGxldGUgKi8KLSAgaWYgKHBfYmNiLT5jb25fc3RhdGUgIT0gQk5FUF9TVEFURV9TRUNfQ0hFQ0tJTkcpIHsKLSAgICBCTkVQX1RSQUNFX0VSUk9SKAotICAgICAgICAiQk5FUCBDb25uZWN0aW9uIGluIHdyb25nIHN0YXRlICVkIHdoZW4gc2VjdXJpdHkgaXMgY29tcGxldGVkIiwKLSAgICAgICAgcF9iY2ItPmNvbl9zdGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogaWYgaXQgaXMgb3V0Z29pbmcgY2FsbCBhbmQgcmVzdWx0IGlzIEZBSUxVUkUgcmV0dXJuIHNlY3VyaXR5IGZhaWwgZXJyb3IgKi8KLSAgaWYgKCEocF9iY2ItPmNvbl9mbGFncyAmIEJORVBfRkxBR1NfU0VUVVBfUkNWRCkpIHsKLSAgICAvKiBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN0YXRlLCB3YWl0aW5nIGZvciBjb25uZWN0aW9uIGNvbmZpcm0uCi0gICAgICovCi0gICAgcF9iY2ItPmNvbl9zdGF0ZSA9IEJORVBfU1RBVEVfQ09OTl9TRVRVUDsKLQotICAgIGJuZXBfc2VuZF9jb25uX3JlcShwX2JjYik7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfYmNiLT5jb25uX3RpbWVyLCBCTkVQX0NPTk5fVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgYm5lcF9jb25uX3RpbWVyX3RpbWVvdXQsIHBfYmNiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYm5lcF9jYi5wX2Nvbm5faW5kX2NiKSB7Ci0gICAgcF9iY2ItPmNvbl9zdGF0ZSA9IEJORVBfU1RBVEVfQ09OTl9TRVRVUDsKLSAgICAoKmJuZXBfY2IucF9jb25uX2luZF9jYikocF9iY2ItPmhhbmRsZSwgcF9iY2ItPnJlbV9iZGEsIHBfYmNiLT5kc3RfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9iY2ItPnNyY191dWlkLCBpc19yb2xlX2NoYW5nZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogUHJvZmlsZSBkaWRuJ3QgcmVnaXN0ZXIgY29ubmVjdGlvbiBpbmRpY2F0aW9uIGNhbGwgYmFjayAqLwotICAgIGJuZXBfc2VuZF9jb25uX3Jlc3BvbmNlKHBfYmNiLCByZXNwX2NvZGUpOwotICAgIGJuZXBfY29ubmVjdGVkKHBfYmNiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYm5lcF9pc19wYWNrZXRfYWxsb3dlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB3aGV0aGVyIHRoZSBwcm90b2NvbCBwYXNzZXMgdGhyb3VnaAotICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgZmlsdGVycyBzZXQgYnkgdGhlIHBlZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJORVBfU1VDQ0VTUyAgICAgICAgICAtIGlmIHRoZSBwcm90b2NvbCBpcyBhbGxvd2VkCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfSUdOT1JFX0NNRCAgICAgICAtIGlmIHRoZSBwcm90b2NvbCBpcyBmaWx0ZXJlZCBvdXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJORVBfUkVTVUxUIGJuZXBfaXNfcGFja2V0X2FsbG93ZWQodEJORVBfQ09OTiogcF9iY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2Rlc3RfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvY29sLCBib29sIGZ3X2V4dF9wcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBvcmdfbGVuKSB7Ci0gIGlmIChwX2JjYi0+cmN2ZF9udW1fZmlsdGVycykgewotICAgIHVpbnQxNl90IGksIHByb3RvOwotCi0gICAgLyogRmluZG91dCB0aGUgYWN0dWFsIHByb3RvY29sIHRvIGNoZWNrIGZvciB0aGUgZmlsdGVyaW5nICovCi0gICAgcHJvdG8gPSBwcm90b2NvbDsKLSAgICBpZiAocHJvdG8gPT0gQk5FUF84MDJfMV9QX1BST1RPQ09MKSB7Ci0gICAgICB1aW50MTZfdCBuZXdfbGVuID0gMDsKLSAgICAgIGlmIChmd19leHRfcHJlc2VudCkgewotICAgICAgICB1aW50OF90IGxlbiwgZXh0OwotICAgICAgICAvKiBwYXJzZSB0aGUgZXh0ZW5zaW9uIGhlYWRlcnMgYW5kIGZpbmRvdXQgYWN0dWFsIHByb3RvY29sICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICBpZiAoKG5ld19sZW4gKyAyKSA+IG9yZ19sZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZXh0ID0gKnBfZGF0YSsrOwotICAgICAgICAgIGxlbiA9ICpwX2RhdGErKzsKLSAgICAgICAgICBwX2RhdGEgKz0gbGVuOwotCi0gICAgICAgICAgbmV3X2xlbiArPSAobGVuICsgMik7Ci0KLSAgICAgICAgfSB3aGlsZSAoZXh0ICYgMHg4MCk7Ci0gICAgICB9Ci0gICAgICBpZiAoKG5ld19sZW4gKyA0KSA+IG9yZ19sZW4pIHsKLSAgICAgICAgcmV0dXJuIEJORVBfSUdOT1JFX0NNRDsKLSAgICAgIH0KLSAgICAgIHBfZGF0YSArPSAyOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwcm90bywgcF9kYXRhKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcF9iY2ItPnJjdmRfbnVtX2ZpbHRlcnM7IGkrKykgewotICAgICAgaWYgKChwX2JjYi0+cmN2ZF9wcm90X2ZpbHRlcl9zdGFydFtpXSA8PSBwcm90bykgJiYKLSAgICAgICAgICAocHJvdG8gPD0gcF9iY2ItPnJjdmRfcHJvdF9maWx0ZXJfZW5kW2ldKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gcF9iY2ItPnJjdmRfbnVtX2ZpbHRlcnMpIHsKLSAgICAgIEJORVBfVFJBQ0VfREVCVUcoIklnbm9yaW5nIHByb3RvY29sIDB4JXggaW4gQk5FUCBkYXRhIHdyaXRlIiwgcHJvdG8pOwotICAgICAgcmV0dXJuIEJORVBfSUdOT1JFX0NNRDsKLSAgICB9Ci0gIH0KLQotICAvKiBDa2VjayBmb3IgbXVsdGljYXN0IGFkZHJlc3MgZmlsdGVyaW5nICovCi0gIGlmICgocF9kZXN0X2FkZHIuYWRkcmVzc1swXSAmIDB4MDEpICYmIHBfYmNiLT5yY3ZkX21jYXN0X2ZpbHRlcnMpIHsKLSAgICB1aW50MTZfdCBpOwotCi0gICAgLyogQ2hlY2sgaWYgZXZlcnkgbXVsdGljYXN0IHNob3VsZCBiZSBmaWx0ZXJlZCAqLwotICAgIGlmIChwX2JjYi0+cmN2ZF9tY2FzdF9maWx0ZXJzICE9IDB4RkZGRikgewotICAgICAgLyogQ2hlY2sgaWYgdGhlIGFkZHJlc3MgaXMgbWVudGlvbmVkIGluIHRoZSBmaWx0ZXIgcmFuZ2UgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwX2JjYi0+cmN2ZF9tY2FzdF9maWx0ZXJzOyBpKyspIHsKLSAgICAgICAgaWYgKChtZW1jbXAocF9iY2ItPnJjdmRfbWNhc3RfZmlsdGVyX3N0YXJ0W2ldLmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBfZGVzdF9hZGRyLmFkZHJlc3MsIEJEX0FERFJfTEVOKSA8PSAwKSAmJgotICAgICAgICAgICAgKG1lbWNtcChwX2JjYi0+cmN2ZF9tY2FzdF9maWx0ZXJfZW5kW2ldLmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBfZGVzdF9hZGRyLmFkZHJlc3MsIEJEX0FERFJfTEVOKSA+PSAwKSkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICoqIElmIGV2ZXJ5IG11bHRpY2FzdCBzaG91bGQgYmUgZmlsdGVyZWQgb3IgdGhlIGFkZHJlc3MgaXMgbm90IGluIHRoZSBmaWx0ZXIKLSAgICAqcmFuZ2UKLSAgICAqKiBkcm9wIHRoZSBwYWNrZXQKLSAgICAqLwotICAgIGlmICgocF9iY2ItPnJjdmRfbWNhc3RfZmlsdGVycyA9PSAweEZGRkYpIHx8Ci0gICAgICAgIChpID09IHBfYmNiLT5yY3ZkX21jYXN0X2ZpbHRlcnMpKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJJZ25vcmluZyBtdWx0aWNhc3QgYWRkcmVzcyAiIDw8IHBfZGVzdF9hZGRyCi0gICAgICAgICAgICAgIDw8ICIgaW4gQk5FUCBkYXRhIHdyaXRlIjsKLSAgICAgIHJldHVybiBCTkVQX0lHTk9SRV9DTUQ7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEJORVBfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlLmNjIGIvc3RhY2svYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Yjg1MmMuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9ibGVfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jZGVmaW5lIEJUTV9CTEVfTVVMVElfQURWX1NFVF9SQU5ET01fQUREUl9MRU4gOAotI2RlZmluZSBCVE1fQkxFX01VTFRJX0FEVl9FTkJfTEVOIDMKLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfU0VUX1BBUkFNX0xFTiAyNAotI2RlZmluZSBCVE1fQkxFX0FEX0RBVEFfTEVOIDMxCi0jZGVmaW5lIEJUTV9CTEVfTVVMVElfQURWX1dSSVRFX0RBVEFfTEVOIChCVE1fQkxFX0FEX0RBVEFfTEVOICsgMykKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfQURWX0VOQUJMRSAxCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9SQU5ET01fQUREUl9DTUQgNgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9QQVJBTVMgMTUKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX1JTUCAzMQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBIDMxCi0KLXVzaW5nIHN0YXR1c19jYiA9IEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OnN0YXR1c19jYjsKLQotdXNpbmcgaGNpX2NtZF9jYiA9IGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKAotICAgIHVpbnQ4X3QqIC8qIHJldHVybl9wYXJhbWV0ZXJzICovLCB1aW50MTZfdCAvKiByZXR1cm5fcGFyYW1ldGVyc19sZW5ndGgqLyk+OwotZXh0ZXJuIHZvaWQgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihjb25zdCBiYXNlOjpMb2NhdGlvbiYgcG9zdGVkX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhcmFtc19sZW4sIGhjaV9jbWRfY2IgY2IpOwotCi1uYW1lc3BhY2UgewotQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSogaW5zdGFuY2UgPSBudWxscHRyOwotCi12b2lkIGJ0bV9ibGVfbXVsdGlfYWR2X3ZzY19jbXBsX2NiYWNrKHVpbnQ4X3QgZXhwZWN0ZWRfb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcGFyYW0sIHVpbnQxNl90IHBhcmFtX2xlbikgewotICB1aW50OF90IHN0YXR1cywgc3ViY29kZTsKLQotICAvLyBBbGwgbXVsdGktYWR2IGNvbW1hbmRzIHJlc3BvbmQgd2l0aCBzdGF0dXMgYW5kIGluc3RfaWQuCi0gIExPR19BU1NFUlQocGFyYW1fbGVuID09IDIpIDw8ICJSZWNlaXZlZCBiYWQgcmVzcG9uc2UgbGVuZ3RoIHRvIG11bHRpLWFkdiBWU0MiOwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBhcmFtKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN1YmNvZGUsIHBhcmFtKTsKLQotICBWTE9HKDEpIDw8ICJzdWJjb2RlID0gIiA8PCArc3ViY29kZSA8PCAiLCBzdGF0dXM6ICIgPDwgK3N0YXR1czsKLQotICBpZiAoZXhwZWN0ZWRfb3Bjb2RlICE9IHN1YmNvZGUpIHsKLSAgICBMT0coRVJST1IpIDw8ICJ1bmV4cGVjdGVkIFZTQyBjbXBsLCBleHBlY3Q6ICIgPDwgK3N1YmNvZGUKLSAgICAgICAgICAgICAgIDw8ICIgZ2V0OiAiIDw8ICtleHBlY3RlZF9vcGNvZGU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29tbWFuZF9jb21wbGV0ZS5SdW4oc3RhdHVzKTsKLX0KLQotdm9pZCBwYXJhbWV0ZXJzX3Jlc3BvbnNlX3BhcnNlcihCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpwYXJhbWV0ZXJzX2NiIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZXRfcGFyYW1zLCB1aW50MTZfdCByZXRfcGFyYW1zX2xlbikgewotICB1aW50OF90IHN0YXR1czsKLSAgaW50OF90IHR4X3Bvd2VyOwotCi0gIHVpbnQ4X3QqIHBwID0gcmV0X3BhcmFtczsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcHApOwotICBTVFJFQU1fVE9fSU5UOCh0eF9wb3dlciwgcHApOwotCi0gIGNiLlJ1bihzdGF0dXMsIHR4X3Bvd2VyKTsKLX0KLQotdm9pZCBrbm93bl90eF9wd3IoQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6cGFyYW1ldGVyc19jYiBjYiwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgY2IuUnVuKHN0YXR1cywgdHhfcG93ZXIpOwotfQotCi1jbGFzcyBCbGVBZHZlcnRpc2VyVnNjSGNpSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlIHsKLSAgdm9pZCBTZW5kQWR2Q21kKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBwb3N0ZWRfZnJvbSwgdWludDhfdCBwYXJhbV9sZW4sCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiBwYXJhbV9idWYsIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSB7Ci0gICAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihwb3N0ZWRfZnJvbSwgSENJX0JMRV9NVUxUSV9BRFYsIHBhcmFtX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0bV9ibGVfbXVsdGlfYWR2X3ZzY19jbXBsX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9idWZbMF0sIGNvbW1hbmRfY29tcGxldGUpKTsKLSAgfQotCi0gIHZvaWQgUmVhZEluc3RhbmNlQ291bnQoCi0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogaW5zdF9jbnQqLyk+IGNiKSBvdmVycmlkZSB7Ci0gICAgY2IuUnVuKEJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQoKSk7Ci0gIH0KLQotICB2b2lkIFNldEFkdmVydGlzaW5nRXZlbnRPYnNlcnZlcigKLSAgICAgIEFkdmVydGlzaW5nRXZlbnRPYnNlcnZlciogb2JzZXJ2ZXIpIG92ZXJyaWRlIHsKLSAgICB0aGlzLT5hZHZlcnRpc2luZ19ldmVudF9vYnNlcnZlciA9IG9ic2VydmVyOwotICB9Ci0KLSAgdm9pZCBTZXRQYXJhbWV0ZXJzKHVpbnQ4X3QgaGFuZGxlLCB1aW50MTZfdCBwcm9wZXJ0aWVzLCB1aW50MzJfdCBhZHZfaW50X21pbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkdl9pbnRfbWF4LCB1aW50OF90IGNoYW5uZWxfbWFwLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvd25fYWRkcmVzc190eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBvd25fYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGVlcl9hZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdGVyX3BvbGljeSwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcmltYXJ5X3BoeSwgdWludDhfdCBzZWNvbmRhcnlfbWF4X3NraXAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY29uZGFyeV9waHksIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX3JlcXVlc3Rfbm90aWZ5X2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgdWludDhfdCBwYXJhbVtCVE1fQkxFX01VTFRJX0FEVl9TRVRfUEFSQU1fTEVOXTsKLSAgICBtZW1zZXQocGFyYW0sIDAsIEJUTV9CTEVfTVVMVElfQURWX1NFVF9QQVJBTV9MRU4pOwotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIEJUTV9CTEVfTVVMVElfQURWX1NFVF9QQVJBTSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgYWR2X2ludF9taW4pOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIGFkdl9pbnRfbWF4KTsKLQotICAgIGlmIChwcm9wZXJ0aWVzID09IDB4MDAxMykgewotICAgICAgVUlOVDhfVE9fU1RSRUFNKHBwLCAweDAwKTsgIC8vIEFEVl9JTkQKLSAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMgPT0gMHgwMDEyKSB7Ci0gICAgICBVSU5UOF9UT19TVFJFQU0ocHAsIDB4MDIpOyAgLy8gQURWX1NDQU5fSU5ECi0gICAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzID09IDB4MDAxMCkgewotICAgICAgVUlOVDhfVE9fU1RSRUFNKHBwLCAweDAzKTsgIC8vIEFEVl9OT05DT05OX0lORAotICAgIH0gZWxzZSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBhZHZlcnRpc2VtZW50IHR5cGUgc2VsZWN0ZWQ6IiA8PCBzdGQ6OmhleAotICAgICAgICAgICAgICAgICA8PCBwcm9wZXJ0aWVzOwotICAgICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX1BBUkFNRVRFUl9GTVQsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgb3duX2FkZHJlc3NfdHlwZSk7Ci0gICAgQkRBRERSX1RPX1NUUkVBTShwcCwgb3duX2FkZHJlc3MpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGVlcl9hZGRyZXNzX3R5cGUpOwotICAgIEJEQUREUl9UT19TVFJFQU0ocHAsIHBlZXJfYWRkcmVzcyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaGFubmVsX21hcCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBmaWx0ZXJfcG9saWN5KTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gICAgSU5UOF9UT19TVFJFQU0ocHAsIHR4X3Bvd2VyKTsKLQotICAgIFNlbmRBZHZDbWQoCi0gICAgICAgIEZST01fSEVSRSwgQlRNX0JMRV9NVUxUSV9BRFZfU0VUX1BBUkFNX0xFTiwgcGFyYW0sCi0gICAgICAgIGJhc2U6OkJpbmQoJmtub3duX3R4X3B3ciwgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpLCB0eF9wb3dlcikpOwotICB9Ci0KLSAgdm9pZCBTZXRBZHZlcnRpc2luZ0RhdGEodWludDhfdCBoYW5kbGUsIHVpbnQ4X3Qgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZyYWdtZW50X3ByZWZlcmVuY2UsIHVpbnQ4X3QgZGF0YV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEsIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICB1aW50OF90IHBhcmFtW0JUTV9CTEVfTVVMVElfQURWX1dSSVRFX0RBVEFfTEVOXTsKLSAgICBtZW1zZXQocGFyYW0sIDAsIEJUTV9CTEVfTVVMVElfQURWX1dSSVRFX0RBVEFfTEVOKTsKLQotICAgIGlmIChkYXRhX2xlbmd0aCA+IEJUTV9CTEVfQURfREFUQV9MRU4pIHsKLSAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTIxMTQ1NjI3Iik7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IGRhdGFfbGVuZ3RoPSIgPDwgc3RhdGljX2Nhc3Q8aW50PihkYXRhX2xlbmd0aCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgaXMgbG9uZ2VyIHRoYW4gc2l6ZSBsaW1pdCAiIDw8IEJUTV9CTEVfQURfREFUQV9MRU47Ci0gICAgICBkYXRhX2xlbmd0aCA9IEJUTV9CTEVfQURfREFUQV9MRU47Ci0gICAgfQotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIEJUTV9CTEVfTVVMVElfQURWX1dSSVRFX0FEVl9EQVRBKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGRhdGFfbGVuZ3RoKTsKLSAgICBBUlJBWV9UT19TVFJFQU0ocHAsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKLSAgICBwYXJhbVtCVE1fQkxFX01VTFRJX0FEVl9XUklURV9EQVRBX0xFTiAtIDFdID0gaGFuZGxlOwotCi0gICAgU2VuZEFkdkNtZChGUk9NX0hFUkUsICh1aW50OF90KUJUTV9CTEVfTVVMVElfQURWX1dSSVRFX0RBVEFfTEVOLCBwYXJhbSwKLSAgICAgICAgICAgICAgIGNvbW1hbmRfY29tcGxldGUpOwotICB9Ci0KLSAgdm9pZCBTZXRTY2FuUmVzcG9uc2VEYXRhKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZnJhZ21lbnRfcHJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Nhbl9yZXNwb25zZV9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNjYW5fcmVzcG9uc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICB1aW50OF90IHBhcmFtW0JUTV9CTEVfTVVMVElfQURWX1dSSVRFX0RBVEFfTEVOXTsKLSAgICBtZW1zZXQocGFyYW0sIDAsIEJUTV9CTEVfTVVMVElfQURWX1dSSVRFX0RBVEFfTEVOKTsKLQotICAgIGlmIChzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoID4gQlRNX0JMRV9BRF9EQVRBX0xFTikgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjExNDU2MjciKTsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogc2Nhbl9yZXNwb25zZV9kYXRhX2xlbmd0aD0iCi0gICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oc2Nhbl9yZXNwb25zZV9kYXRhX2xlbmd0aCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgaXMgbG9uZ2VyIHRoYW4gc2l6ZSBsaW1pdCAiIDw8IEJUTV9CTEVfQURfREFUQV9MRU47Ci0gICAgICBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoID0gQlRNX0JMRV9BRF9EQVRBX0xFTjsKLSAgICB9Ci0KLSAgICB1aW50OF90KiBwcCA9IHBhcmFtOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgQlRNX0JMRV9NVUxUSV9BRFZfV1JJVEVfU0NBTl9SU1BfREFUQSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoKTsKLSAgICBBUlJBWV9UT19TVFJFQU0ocHAsIHNjYW5fcmVzcG9uc2VfZGF0YSwgc2Nhbl9yZXNwb25zZV9kYXRhX2xlbmd0aCk7Ci0gICAgcGFyYW1bQlRNX0JMRV9NVUxUSV9BRFZfV1JJVEVfREFUQV9MRU4gLSAxXSA9IGhhbmRsZTsKLQotICAgIFNlbmRBZHZDbWQoRlJPTV9IRVJFLCAodWludDhfdClCVE1fQkxFX01VTFRJX0FEVl9XUklURV9EQVRBX0xFTiwgcGFyYW0sCi0gICAgICAgICAgICAgICBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgU2V0UmFuZG9tQWRkcmVzcyh1aW50OF90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcmFuZG9tX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgdWludDhfdCBwYXJhbVtCVE1fQkxFX01VTFRJX0FEVl9TRVRfUkFORE9NX0FERFJfTEVOXTsKLSAgICBtZW1zZXQocGFyYW0sIDAsIEJUTV9CTEVfTVVMVElfQURWX1NFVF9SQU5ET01fQUREUl9MRU4pOwotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIEJUTV9CTEVfTVVMVElfQURWX1NFVF9SQU5ET01fQUREUik7Ci0gICAgQkRBRERSX1RPX1NUUkVBTShwcCwgcmFuZG9tX2FkZHJlc3MpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICAgIFNlbmRBZHZDbWQoRlJPTV9IRVJFLCAodWludDhfdClCVE1fQkxFX01VTFRJX0FEVl9TRVRfUkFORE9NX0FERFJfTEVOLCBwYXJhbSwKLSAgICAgICAgICAgICAgIGNvbW1hbmRfY29tcGxldGUpOwotICB9Ci0KLSAgdm9pZCBFbmFibGUodWludDhfdCBlbmFibGUsIHN0ZDo6dmVjdG9yPFNldEVuYWJsZURhdGE+IHNldHMsCi0gICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICAgIGlmIChzZXRzLnNpemUoKSAhPSAxKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJUcnlpbmcgdG8gZW5hYmxlIG11bHRpcGxlIHNldHMgaW4gVlNDIGltcGxlbWVuZXRhdGlvbiEiOwotICAgICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX1BBUkFNRVRFUl9GTVQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTZXRFbmFibGVEYXRhJiBzZXQgPSBzZXRzWzBdOwotCi0gICAgaWYgKHNldC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzKSB7Ci0gICAgICBjb21tYW5kX2NvbXBsZXRlLlJ1bihIQ0lfRVJSX0lMTEVHQUxfUEFSQU1FVEVSX0ZNVCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdWludDhfdCBwYXJhbVtCVE1fQkxFX01VTFRJX0FEVl9FTkJfTEVOXTsKLSAgICBtZW1zZXQocGFyYW0sIDAsIEJUTV9CTEVfTVVMVElfQURWX0VOQl9MRU4pOwotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIEJUTV9CTEVfTVVMVElfQURWX0VOQik7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBlbmFibGUpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2V0LmhhbmRsZSk7Ci0KLSAgICBTZW5kQWR2Q21kKEZST01fSEVSRSwgKHVpbnQ4X3QpQlRNX0JMRV9NVUxUSV9BRFZfRU5CX0xFTiwgcGFyYW0sCi0gICAgICAgICAgICAgICBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnModWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50MTZfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFZTQyBjYW4ndCBkbyBwZXJpb2RpYyBhZHZlcnRpc2luZyI7Ci0gICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX0NPTU1BTkQpOwotICB9Ci0KLSAgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YSh1aW50OF90LCB1aW50OF90LCB1aW50OF90LCB1aW50OF90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFZTQyBjYW4ndCBkbyBwZXJpb2RpYyBhZHZlcnRpc2luZyI7Ci0gICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX0NPTU1BTkQpOwotICB9Ci0KLSAgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlKHVpbnQ4X3QsIHVpbnQ4X3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIFZTQyBjYW4ndCBkbyBwZXJpb2RpYyBhZHZlcnRpc2luZyI7Ci0gICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX0NPTU1BTkQpOwotICB9Ci0KLSAgYm9vbCBRdWlya0FkdmVydGlzZXJaZXJvSGFuZGxlKCkgb3ZlcnJpZGUgewotICAgIC8vIEFuZHJvaWQgQlQgSENJIFJlcXVpcmVtZW50cyB2ZXJzaW9uIDAuOTYgYW5kIGJlbG93IHNwZWNpZnkgdGhhdCBoYW5kbGUgMAotICAgIC8vIGlzIGVxdWFsIHRvIHN0YW5kYXJkIEhDSSBpbnRlcmZhY2UsIGFuZCBzaG91bGQgYmUgYWNjZXNzZWQgdXNpbmcgbm9uLVZTQwotICAgIC8vIGNvbW1hbmRzLgotICAgIExPRyhJTkZPKSA8PCAiUXVpcmtBZHZlcnRpc2VyWmVyb0hhbmRsZSBpbiB1c2UiOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVBZHZlcnRpc2luZ1NldCh1aW50OF90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIC8vIFZTQyBBZHZlcnRpc2luZyBkb24ndCBoYXZlIHJlbW92ZSBtZXRob2QuCi0gICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oMCk7Ci0gIH0KLQotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgVmVuZG9yU3BlY2lmaWNFdmVudENiYWNrKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwKSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICAgIExPR19BU1NFUlQocCk7Ci0gICAgdWludDhfdCBzdWJfZXZlbnQsIGFkdl9pbnN0LCBjaGFuZ2VfcmVhc29uOwotICAgIHVpbnQxNl90IGNvbm5faGFuZGxlOwotCi0gICAgU1RSRUFNX1RPX1VJTlQ4KHN1Yl9ldmVudCwgcCk7Ci0gICAgbGVuZ3RoLS07Ci0KLSAgICBpZiAoc3ViX2V2ZW50ICE9IEhDSV9WU0VfU1VCQ09ERV9CTEVfTVVMVElfQURWX1NUX0NIRyB8fCBsZW5ndGggIT0gNCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNUUkVBTV9UT19VSU5UOChhZHZfaW5zdCwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGNoYW5nZV9yZWFzb24sIHApOwotICAgIFNUUkVBTV9UT19VSU5UMTYoY29ubl9oYW5kbGUsIHApOwotCi0gICAgQWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKiBvYnNlcnZlciA9Ci0gICAgICAgICgoQmxlQWR2ZXJ0aXNlclZzY0hjaUludGVyZmFjZUltcGwqKUJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OkdldCgpKQotICAgICAgICAgICAgLT5hZHZlcnRpc2luZ19ldmVudF9vYnNlcnZlcjsKLSAgICBpZiAob2JzZXJ2ZXIpCi0gICAgICBvYnNlcnZlci0+T25BZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWQoY2hhbmdlX3JlYXNvbiwgYWR2X2luc3QsIGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDApOwotICB9Ci0KLSBwcml2YXRlOgotICBBZHZlcnRpc2luZ0V2ZW50T2JzZXJ2ZXIqIGFkdmVydGlzaW5nX2V2ZW50X29ic2VydmVyID0gbnVsbHB0cjsKLX07Ci0KLXZvaWQgYWR2X2NtZF9jbXBsX2NiYWNrKHN0YXR1c19jYiBjYiwgdWludDhfdCogcmV0dXJuX3BhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXR1cm5fcGFyYW1ldGVyc19sZW5ndGgpIHsKLSAgdWludDhfdCBzdGF0dXMgPSAqcmV0dXJuX3BhcmFtZXRlcnM7Ci0gIGNiLlJ1bihzdGF0dXMpOwotfQotCi1jbGFzcyBCbGVBZHZlcnRpc2VyTGVnYWN5SGNpSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlIHsKLSAgdm9pZCBTZW5kQWR2Q21kKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBwb3N0ZWRfZnJvbSwgdWludDE2X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogcGFyYW1fYnVmLCB1aW50OF90IHBhcmFtX2J1Zl9sZW4sCi0gICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgewotICAgIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoCi0gICAgICAgIHBvc3RlZF9mcm9tLCBvcGNvZGUsIHBhcmFtX2J1ZiwgcGFyYW1fYnVmX2xlbiwKLSAgICAgICAgYmFzZTo6QmluZCgmYWR2X2NtZF9jbXBsX2NiYWNrLCBjb21tYW5kX2NvbXBsZXRlKSk7Ci0gIH0KLQotICB2b2lkIFJlYWRJbnN0YW5jZUNvdW50KAotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGluc3RfY250Ki8pPiBjYikgb3ZlcnJpZGUgewotICAgIGNiLlJ1bigxKTsKLSAgfQotCi0gIHZvaWQgU2V0QWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKAotICAgICAgQWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHRoaXMtPmFkdmVydGlzaW5nX2V2ZW50X29ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gIH0KLQotICB2b2lkIFNldFBhcmFtZXRlcnModWludDhfdCBoYW5kbGUsIHVpbnQxNl90IHByb3BlcnRpZXMsIHVpbnQzMl90IGFkdl9pbnRfbWluLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWR2X2ludF9tYXgsIHVpbnQ4X3QgY2hhbm5lbF9tYXAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IG93bl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBvd25fYWRkcmVzcyAqLywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGVlcl9hZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdGVyX3BvbGljeSwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcmltYXJ5X3BoeSwgdWludDhfdCBzZWNvbmRhcnlfbWF4X3NraXAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY29uZGFyeV9waHksIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX3JlcXVlc3Rfbm90aWZ5X2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICB1aW50OF90IHBhcmFtW0hDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfQURWX1BBUkFNU107Ci0KLSAgICB1aW50OF90KiBwcCA9IHBhcmFtOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIGFkdl9pbnRfbWluKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBhZHZfaW50X21heCk7Ci0KLSAgICBpZiAocHJvcGVydGllcyA9PSAweDAwMTMpIHsKLSAgICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgMHgwMCk7ICAvLyBBRFZfSU5ECi0gICAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzID09IDB4MDAxMikgewotICAgICAgVUlOVDhfVE9fU1RSRUFNKHBwLCAweDAyKTsgIC8vIEFEVl9TQ0FOX0lORAotICAgIH0gZWxzZSBpZiAocHJvcGVydGllcyA9PSAweDAwMTApIHsKLSAgICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgMHgwMyk7ICAvLyBBRFZfTk9OQ09OTl9JTkQKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYWR2ZXJ0aXNlbWVudCB0eXBlIHNlbGVjdGVkOiIgPDwgc3RkOjpoZXgKLSAgICAgICAgICAgICAgICAgPDwgcHJvcGVydGllczsKLSAgICAgIGNvbW1hbmRfY29tcGxldGUuUnVuKEhDSV9FUlJfSUxMRUdBTF9QQVJBTUVURVJfRk1ULCAwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIG93bl9hZGRyZXNzX3R5cGUpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGVlcl9hZGRyZXNzX3R5cGUpOwotICAgIEJEQUREUl9UT19TVFJFQU0ocHAsIHBlZXJfYWRkcmVzcyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaGFubmVsX21hcCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBmaWx0ZXJfcG9saWN5KTsKLQotICAgIFNlbmRBZHZDbWQoCi0gICAgICAgIEZST01fSEVSRSwgSENJX0JMRV9XUklURV9BRFZfUEFSQU1TLCBwYXJhbSwKLSAgICAgICAgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9BRFZfUEFSQU1TLAotICAgICAgICBiYXNlOjpCaW5kKCZrbm93bl90eF9wd3IsIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSwgKGludDhfdCkwKSk7Ci0gIH0KLQotICB2b2lkIFNldEFkdmVydGlzaW5nRGF0YSh1aW50OF90IGhhbmRsZSwgdWludDhfdCBvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZnJhZ21lbnRfcHJlZmVyZW5jZSwgdWludDhfdCBkYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSwgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gICAgdWludDhfdCBwYXJhbVtIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBICsgMV07Ci0KLSAgICBpZiAoZGF0YV9sZW5ndGggPiBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyMTE0NTYyNyIpOwotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBkYXRhX2xlbmd0aD0iIDw8IHN0YXRpY19jYXN0PGludD4oZGF0YV9sZW5ndGgpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGlzIGxvbmdlciB0aGFuIHNpemUgbGltaXQgIgotICAgICAgICAgICAgICAgICA8PCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBOwotICAgICAgZGF0YV9sZW5ndGggPSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBOwotICAgIH0KLQotICAgIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0gICAgbWVtc2V0KHBwLCAwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBICsgMSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBkYXRhX2xlbmd0aCk7Ci0gICAgQVJSQVlfVE9fU1RSRUFNKHBwLCBkYXRhLCBkYXRhX2xlbmd0aCk7Ci0KLSAgICBTZW5kQWR2Q21kKEZST01fSEVSRSwgSENJX0JMRV9XUklURV9BRFZfREFUQSwgcGFyYW0sCi0gICAgICAgICAgICAgICBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBICsgMSwgY29tbWFuZF9jb21wbGV0ZSk7Ci0gIH0KLQotICB2b2lkIFNldFNjYW5SZXNwb25zZURhdGEodWludDhfdCBoYW5kbGUsIHVpbnQ4X3Qgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmcmFnbWVudF9wcmVmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIHVpbnQ4X3QgcGFyYW1bSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9BRFZfREFUQSArIDFdOwotCi0gICAgaWYgKHNjYW5fcmVzcG9uc2VfZGF0YV9sZW5ndGggPiBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyMTE0NTYyNyIpOwotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoPSIKLSAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoKQotICAgICAgICAgICAgICAgICA8PCAiLCBpcyBsb25nZXIgdGhhbiBzaXplIGxpbWl0ICIKLSAgICAgICAgICAgICAgICAgPDwgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9BRFZfREFUQTsKLSAgICAgIHNjYW5fcmVzcG9uc2VfZGF0YV9sZW5ndGggPSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBOwotICAgIH0KLQotICAgIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0gICAgbWVtc2V0KHBwLCAwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBICsgMSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoKTsKLSAgICBBUlJBWV9UT19TVFJFQU0ocHAsIHNjYW5fcmVzcG9uc2VfZGF0YSwgc2Nhbl9yZXNwb25zZV9kYXRhX2xlbmd0aCk7Ci0KLSAgICBTZW5kQWR2Q21kKEZST01fSEVSRSwgSENJX0JMRV9XUklURV9TQ0FOX1JTUF9EQVRBLCBwYXJhbSwKLSAgICAgICAgICAgICAgIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfQURWX0RBVEEgKyAxLCBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgU2V0UmFuZG9tQWRkcmVzcyh1aW50OF90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcmFuZG9tX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICB1aW50OF90IHBhcmFtW0hDSUNfUEFSQU1fU0laRV9XUklURV9SQU5ET01fQUREUl9DTURdOwotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBCREFERFJfVE9fU1RSRUFNKHBwLCByYW5kb21fYWRkcmVzcyk7Ci0KLSAgICBTZW5kQWR2Q21kKEZST01fSEVSRSwgSENJX0JMRV9XUklURV9SQU5ET01fQUREUiwgcGFyYW0sCi0gICAgICAgICAgICAgICBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUkFORE9NX0FERFJfQ01ELCBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgRW5hYmxlKHVpbnQ4X3QgZW5hYmxlLCBzdGQ6OnZlY3RvcjxTZXRFbmFibGVEYXRhPiBzZXRzLAotICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICBpZiAoc2V0cy5zaXplKCkgIT0gMSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVHJ5aW5nIHRvIGVuYWJsZSBtdWx0aXBsZSBzZXRzIGluIGxlZ2FjeSBpbXBsZW1lbmV0YXRpb24hIjsKLSAgICAgIGNvbW1hbmRfY29tcGxldGUuUnVuKEhDSV9FUlJfSUxMRUdBTF9QQVJBTUVURVJfRk1UKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTZXRFbmFibGVEYXRhJiBzZXQgPSBzZXRzWzBdOwotICAgIGlmIChzZXQubWF4X2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50cykgewotICAgICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX1BBUkFNRVRFUl9GTVQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQ4X3QgcGFyYW1bSENJQ19QQVJBTV9TSVpFX1dSSVRFX0FEVl9FTkFCTEVdOwotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGVuYWJsZSk7Ci0KLSAgICBTZW5kQWR2Q21kKEZST01fSEVSRSwgSENJX0JMRV9XUklURV9BRFZfRU5BQkxFLCBwYXJhbSwKLSAgICAgICAgICAgICAgIEhDSUNfUEFSQU1fU0laRV9XUklURV9BRFZfRU5BQkxFLCBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnModWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50MTZfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiTGVnYWN5IGNhbid0IGRvIHBlcmlvZGljIGFkdmVydGlzaW5nIjsKLSAgICBjb21tYW5kX2NvbXBsZXRlLlJ1bihIQ0lfRVJSX0lMTEVHQUxfQ09NTUFORCk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhKHVpbnQ4X3QsIHVpbnQ4X3QsIHVpbnQ4X3QsIHVpbnQ4X3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICJMZWdhY3kgY2FuJ3QgZG8gcGVyaW9kaWMgYWR2ZXJ0aXNpbmciOwotICAgIGNvbW1hbmRfY29tcGxldGUuUnVuKEhDSV9FUlJfSUxMRUdBTF9DT01NQU5EKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZSh1aW50OF90LCB1aW50OF90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIkxlZ2FjeSBjYW4ndCBkbyBwZXJpb2RpYyBhZHZlcnRpc2luZyI7Ci0gICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oSENJX0VSUl9JTExFR0FMX0NPTU1BTkQpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVBZHZlcnRpc2luZ1NldCh1aW50OF90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIC8vIExlZ2FjeSBBZHZlcnRpc2luZyBkb24ndCBoYXZlIHJlbW92ZSBtZXRob2QuCi0gICAgY29tbWFuZF9jb21wbGV0ZS5SdW4oMCk7Ci0gIH0KLQotIHB1YmxpYzoKLSAgdm9pZCBPbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gICAgQWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKiBvYnNlcnZlciA9IHRoaXMtPmFkdmVydGlzaW5nX2V2ZW50X29ic2VydmVyOwotICAgIGlmIChvYnNlcnZlcikKLSAgICAgIG9ic2VydmVyLT5PbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZChzdGF0dXMsIDAgLyphZHZlcnRpc2luZ19oYW5kbGUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX2hhbmRsZSwgMCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEFkdmVydGlzaW5nRXZlbnRPYnNlcnZlciogYWR2ZXJ0aXNpbmdfZXZlbnRfb2JzZXJ2ZXIgPSBudWxscHRyOwotfTsKLQotY2xhc3MgQmxlQWR2ZXJ0aXNlckhjaUV4dGVuZGVkSW1wbCA6IHB1YmxpYyBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlIHsKLSAgdm9pZCBTZW5kQWR2Q21kKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBwb3N0ZWRfZnJvbSwgdWludDE2X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogcGFyYW1fYnVmLCB1aW50OF90IHBhcmFtX2J1Zl9sZW4sCi0gICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgewotICAgIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoCi0gICAgICAgIHBvc3RlZF9mcm9tLCBvcGNvZGUsIHBhcmFtX2J1ZiwgcGFyYW1fYnVmX2xlbiwKLSAgICAgICAgYmFzZTo6QmluZCgmYWR2X2NtZF9jbXBsX2NiYWNrLCBjb21tYW5kX2NvbXBsZXRlKSk7Ci0gIH0KLQotICB2b2lkIFJlYWRJbnN0YW5jZUNvdW50KAotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGluc3RfY250Ki8pPiBjYikgb3ZlcnJpZGUgewotICAgIGNiLlJ1bihjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgLT5nZXRfYmxlX251bWJlcl9vZl9zdXBwb3J0ZWRfYWR2ZXJ0aXNpbmdfc2V0cygpKTsKLSAgfQotCi0gIHZvaWQgU2V0QWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKAotICAgICAgQWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKiBvYnNlcnZlcikgb3ZlcnJpZGUgewotICAgIHRoaXMtPmFkdmVydGlzaW5nX2V2ZW50X29ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gIH0KLQotICB2b2lkIFNldFBhcmFtZXRlcnModWludDhfdCBoYW5kbGUsIHVpbnQxNl90IHByb3BlcnRpZXMsIHVpbnQzMl90IGFkdl9pbnRfbWluLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWR2X2ludF9tYXgsIHVpbnQ4X3QgY2hhbm5lbF9tYXAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IG93bl9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiAvKiBvd25fYWRkcmVzcyAqLywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGVlcl9hZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdGVyX3BvbGljeSwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcmltYXJ5X3BoeSwgdWludDhfdCBzZWNvbmRhcnlfbWF4X3NraXAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY29uZGFyeV9waHksIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfc2lkLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX3JlcXVlc3Rfbm90aWZ5X2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgY29uc3QgdWludDE2X3QgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfUEFSQU1fTEVOID0gMjU7Ci0gICAgdWludDhfdCBwYXJhbVtIQ0lfTEVfU0VUX0VYVF9BRFZFUlRJU0lOR19QQVJBTV9MRU5dOwotICAgIG1lbXNldChwYXJhbSwgMCwgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfUEFSQU1fTEVOKTsKLQotICAgIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIHByb3BlcnRpZXMpOwotICAgIFVJTlQyNF9UT19TVFJFQU0ocHAsIGFkdl9pbnRfbWluKTsKLSAgICBVSU5UMjRfVE9fU1RSRUFNKHBwLCBhZHZfaW50X21heCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaGFubmVsX21hcCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBvd25fYWRkcmVzc190eXBlKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHBlZXJfYWRkcmVzc190eXBlKTsKLSAgICBCREFERFJfVE9fU1RSRUFNKHBwLCBwZWVyX2FkZHJlc3MpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZmlsdGVyX3BvbGljeSk7Ci0gICAgSU5UOF9UT19TVFJFQU0ocHAsIHR4X3Bvd2VyKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHByaW1hcnlfcGh5KTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHNlY29uZGFyeV9tYXhfc2tpcCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzZWNvbmRhcnlfcGh5KTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkdmVydGlzaW5nX3NpZCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzY2FuX3JlcXVlc3Rfbm90aWZ5X2VuYWJsZSk7Ci0KLSAgICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgICBGUk9NX0hFUkUsIEhDSV9MRV9TRVRfRVhUX0FEVkVSVElTSU5HX1BBUkFNLCBwYXJhbSwKLSAgICAgICAgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfUEFSQU1fTEVOLAotICAgICAgICBiYXNlOjpCaW5kKHBhcmFtZXRlcnNfcmVzcG9uc2VfcGFyc2VyLCBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZSkpKTsKLSAgfQotCi0gIHZvaWQgU2V0QWR2ZXJ0aXNpbmdEYXRhKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmcmFnbWVudF9wcmVmZXJlbmNlLCB1aW50OF90IGRhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhLCBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICBjb25zdCB1aW50MTZfdCBjbWRfbGVuZ3RoID0gNCArIGRhdGFfbGVuZ3RoOwotICAgIHVpbnQ4X3QgcGFyYW1bY21kX2xlbmd0aF07Ci0gICAgbWVtc2V0KHBhcmFtLCAwLCBjbWRfbGVuZ3RoKTsKLQotICAgIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgb3BlcmF0aW9uKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGZyYWdtZW50X3ByZWZlcmVuY2UpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZGF0YV9sZW5ndGgpOwotICAgIEFSUkFZX1RPX1NUUkVBTShwcCwgZGF0YSwgZGF0YV9sZW5ndGgpOwotCi0gICAgU2VuZEFkdkNtZChGUk9NX0hFUkUsIEhDSV9MRV9TRVRfRVhUX0FEVkVSVElTSU5HX0RBVEEsIHBhcmFtLCBjbWRfbGVuZ3RoLAotICAgICAgICAgICAgICAgY29tbWFuZF9jb21wbGV0ZSk7Ci0gIH0KLQotICB2b2lkIFNldFNjYW5SZXNwb25zZURhdGEodWludDhfdCBoYW5kbGUsIHVpbnQ4X3Qgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmcmFnbWVudF9wcmVmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gICAgY29uc3QgdWludDE2X3QgY21kX2xlbmd0aCA9IDQgKyBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoOwotICAgIHVpbnQ4X3QgcGFyYW1bY21kX2xlbmd0aF07Ci0gICAgbWVtc2V0KHBhcmFtLCAwLCBjbWRfbGVuZ3RoKTsKLQotICAgIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgb3BlcmF0aW9uKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGZyYWdtZW50X3ByZWZlcmVuY2UpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2Nhbl9yZXNwb25zZV9kYXRhX2xlbmd0aCk7Ci0gICAgQVJSQVlfVE9fU1RSRUFNKHBwLCBzY2FuX3Jlc3BvbnNlX2RhdGEsIHNjYW5fcmVzcG9uc2VfZGF0YV9sZW5ndGgpOwotCi0gICAgU2VuZEFkdkNtZChGUk9NX0hFUkUsIEhDSV9MRV9TRVRfRVhUX0FEVkVSVElTSU5HX1NDQU5fUkVTUCwgcGFyYW0sCi0gICAgICAgICAgICAgICBjbWRfbGVuZ3RoLCBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgU2V0UmFuZG9tQWRkcmVzcyh1aW50OF90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcmFuZG9tX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgY29uc3QgaW50IExFX1NFVF9BRFZFUlRJU0lOR19TRVRfUkFORE9NX0FERFJFU1NfTEVOID0gNzsKLQotICAgIHVpbnQ4X3QgcGFyYW1bTEVfU0VUX0FEVkVSVElTSU5HX1NFVF9SQU5ET01fQUREUkVTU19MRU5dOwotICAgIG1lbXNldChwYXJhbSwgMCwgTEVfU0VUX0FEVkVSVElTSU5HX1NFVF9SQU5ET01fQUREUkVTU19MRU4pOwotCi0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gICAgQkRBRERSX1RPX1NUUkVBTShwcCwgcmFuZG9tX2FkZHJlc3MpOwotCi0gICAgU2VuZEFkdkNtZChGUk9NX0hFUkUsIEhDSV9MRV9TRVRfRVhUX0FEVkVSVElTSU5HX1JBTkRPTV9BRERSRVNTLCBwYXJhbSwKLSAgICAgICAgICAgICAgIExFX1NFVF9BRFZFUlRJU0lOR19TRVRfUkFORE9NX0FERFJFU1NfTEVOLCBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gIHZvaWQgRW5hYmxlKHVpbnQ4X3QgZW5hYmxlLCBzdGQ6OnZlY3RvcjxTZXRFbmFibGVEYXRhPiBzZXRzLAotICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICAvKiBjbWRfbGVuZ3RoID0gaGVhZGVyX3NpemUgKyBudW1fb2Zfb2ZfYWR2ZXJ0aXNlciAqIHNpemVfcGVyX2FkdmVydGlzZXIgKi8KLSAgICBjb25zdCB1aW50MTZfdCBjbWRfbGVuZ3RoID0gMiArIHNldHMuc2l6ZSgpICogNDsKLSAgICB1aW50OF90IHBhcmFtW2NtZF9sZW5ndGhdOwotICAgIG1lbXNldChwYXJhbSwgMCwgY21kX2xlbmd0aCk7Ci0KLSAgICB1aW50OF90KiBwcCA9IHBhcmFtOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZW5hYmxlKTsKLQotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2V0cy5zaXplKCkpOwotICAgIGZvciAoY29uc3QgU2V0RW5hYmxlRGF0YSYgc2V0IDogc2V0cykgewotICAgICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzZXQuaGFuZGxlKTsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIHNldC5kdXJhdGlvbik7Ci0gICAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHNldC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzKTsKLSAgICB9Ci0KLSAgICBTZW5kQWR2Q21kKEZST01fSEVSRSwgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfRU5BQkxFLCBwYXJhbSwgY21kX2xlbmd0aCwKLSAgICAgICAgICAgICAgIGNvbW1hbmRfY29tcGxldGUpOwotICB9Ci0KLSAgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyh1aW50OF90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50X21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpb2RpY19wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICBjb25zdCB1aW50MTZfdCBIQ0lfTEVfU0VUX1BSSU9ESUNfQURWRVJUSVNJTkdfUEFSQU1fTEVOID0gNzsKLSAgICB1aW50OF90IHBhcmFtW0hDSV9MRV9TRVRfUFJJT0RJQ19BRFZFUlRJU0lOR19QQVJBTV9MRU5dOwotICAgIG1lbXNldChwYXJhbSwgMCwgSENJX0xFX1NFVF9QUklPRElDX0FEVkVSVElTSU5HX1BBUkFNX0xFTik7Ci0KLSAgICB1aW50OF90KiBwcCA9IHBhcmFtOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwZXJpb2RpY19hZHZfaW50X21pbik7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGVyaW9kaWNfYWR2X2ludF9tYXgpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBlcmlvZGljX3Byb3BlcnRpZXMpOwotCi0gICAgU2VuZEFkdkNtZChGUk9NX0hFUkUsIEhDSV9MRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfUEFSQU0sIHBhcmFtLAotICAgICAgICAgICAgICAgSENJX0xFX1NFVF9QUklPRElDX0FEVkVSVElTSU5HX1BBUkFNX0xFTiwgY29tbWFuZF9jb21wbGV0ZSk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkdl9kYXRhX2xlbmd0aCwgdWludDhfdCogYWR2X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIGNvbnN0IHVpbnQxNl90IEhDSV9MRV9TRVRfUFJJT0RJQ19BRFZFUlRJU0lOR19EQVRBX0xFTiA9Ci0gICAgICAgIDMgKyBhZHZfZGF0YV9sZW5ndGg7Ci0gICAgdWludDhfdCBwYXJhbVtIQ0lfTEVfU0VUX1BSSU9ESUNfQURWRVJUSVNJTkdfREFUQV9MRU5dOwotICAgIG1lbXNldChwYXJhbSwgMCwgSENJX0xFX1NFVF9QUklPRElDX0FEVkVSVElTSU5HX0RBVEFfTEVOKTsKLSAgICB1aW50OF90KiBwcCA9IHBhcmFtOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIG9wZXJhdGlvbik7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZHZfZGF0YV9sZW5ndGgpOwotICAgIEFSUkFZX1RPX1NUUkVBTShwcCwgYWR2X2RhdGEsIGFkdl9kYXRhX2xlbmd0aCk7Ci0gICAgU2VuZEFkdkNtZChGUk9NX0hFUkUsIEhDSV9MRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfREFUQSwgcGFyYW0sCi0gICAgICAgICAgICAgICBIQ0lfTEVfU0VUX1BSSU9ESUNfQURWRVJUSVNJTkdfREFUQV9MRU4sIGNvbW1hbmRfY29tcGxldGUpOwotICB9Ci0KLSAgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlKHVpbnQ4X3QgZW5hYmxlLCB1aW50OF90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICBjb25zdCB1aW50MTZfdCBIQ0lfTEVfRU5BQkxFX1BSSU9ESUNfQURWRVJUSVNFTUVOVF9MRU4gPSAyOwotICAgIHVpbnQ4X3QgcGFyYW1bSENJX0xFX0VOQUJMRV9QUklPRElDX0FEVkVSVElTRU1FTlRfTEVOXTsKLSAgICBtZW1zZXQocGFyYW0sIDAsIEhDSV9MRV9FTkFCTEVfUFJJT0RJQ19BRFZFUlRJU0VNRU5UX0xFTik7Ci0gICAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGVuYWJsZSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICAgIFNlbmRBZHZDbWQoRlJPTV9IRVJFLCBIQ0lfTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSwgcGFyYW0sCi0gICAgICAgICAgICAgICBIQ0lfTEVfRU5BQkxFX1BSSU9ESUNfQURWRVJUSVNFTUVOVF9MRU4sIGNvbW1hbmRfY29tcGxldGUpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVBZHZlcnRpc2luZ1NldCh1aW50OF90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgICBjb25zdCB1aW50MTZfdCBjbWRfbGVuZ3RoID0gMTsKLSAgICB1aW50OF90IHBhcmFtW2NtZF9sZW5ndGhdOwotICAgIG1lbXNldChwYXJhbSwgMCwgY21kX2xlbmd0aCk7Ci0KLSAgICB1aW50OF90KiBwcCA9IHBhcmFtOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICAgIFNlbmRBZHZDbWQoRlJPTV9IRVJFLCBIQ0lfTEVfUkVNT1ZFX0FEVkVSVElTSU5HX1NFVCwgcGFyYW0sIGNtZF9sZW5ndGgsCi0gICAgICAgICAgICAgICBjb21tYW5kX2NvbXBsZXRlKTsKLSAgfQotCi0gcHVibGljOgotICB2b2lkIE9uQWR2ZXJ0aXNpbmdTZXRUZXJtaW5hdGVkKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwKSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICBMT0dfQVNTRVJUKHApOwotICAgIHVpbnQ4X3Qgc3RhdHVzLCBhZHZlcnRpc2luZ19oYW5kbGUsIG51bV9jb21wbGV0ZWRfZXh0ZW5kZWRfYWR2X2V2ZW50czsKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZTsKLQotICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICAgIFNUUkVBTV9UT19VSU5UOChhZHZlcnRpc2luZ19oYW5kbGUsIHApOwotICAgIFNUUkVBTV9UT19VSU5UMTYoY29ubl9oYW5kbGUsIHApOwotICAgIFNUUkVBTV9UT19VSU5UOChudW1fY29tcGxldGVkX2V4dGVuZGVkX2Fkdl9ldmVudHMsIHApOwotCi0gICAgY29ubl9oYW5kbGUgPSBjb25uX2hhbmRsZSAmIDB4MEZGRjsgIC8vIG9ubHkgMTIgYml0cyBtZWFuaW5nZnVsCi0KLSAgICBBZHZlcnRpc2luZ0V2ZW50T2JzZXJ2ZXIqIG9ic2VydmVyID0gdGhpcy0+YWR2ZXJ0aXNpbmdfZXZlbnRfb2JzZXJ2ZXI7Ci0gICAgaWYgKG9ic2VydmVyKQotICAgICAgb2JzZXJ2ZXItPk9uQWR2ZXJ0aXNpbmdTZXRUZXJtaW5hdGVkKHN0YXR1cywgYWR2ZXJ0aXNpbmdfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21wbGV0ZWRfZXh0ZW5kZWRfYWR2X2V2ZW50cyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEFkdmVydGlzaW5nRXZlbnRPYnNlcnZlciogYWR2ZXJ0aXNpbmdfZXZlbnRfb2JzZXJ2ZXIgPSBudWxscHRyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgYnRtX2xlX29uX2FkdmVydGlzaW5nX3NldF90ZXJtaW5hdGVkKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbmd0aCkgewotICBpZiAoQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6R2V0KCkpIHsKLSAgICAoKEJsZUFkdmVydGlzZXJIY2lFeHRlbmRlZEltcGwqKUJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OkdldCgpKQotICAgICAgICAtPk9uQWR2ZXJ0aXNpbmdTZXRUZXJtaW5hdGVkKGxlbmd0aCwgcCk7Ci0gIH0KLX0KLQotYm9vbCBsZWdhY3lfYWR2ZXJ0aXNpbmdfaW5fdXNlID0gZmFsc2U7Ci12b2lkIGJ0bV9ibGVfYWR2ZXJ0aXNlcl9ub3RpZnlfdGVybWluYXRlZF9sZWdhY3kodWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUpIHsKLSAgaWYgKEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OkdldCgpICYmIGxlZ2FjeV9hZHZlcnRpc2luZ19pbl91c2UpIHsKLSAgICAoKEJsZUFkdmVydGlzZXJMZWdhY3lIY2lJbnRlcmZhY2VJbXBsKilCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpHZXQoKSkKLSAgICAgICAgLT5PbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZChzdGF0dXMsIGNvbm5lY3Rpb25faGFuZGxlKTsKLSAgfQotfQotCi12b2lkIEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OkluaXRpYWxpemUoKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0gIExPR19BU1NFUlQoaW5zdGFuY2UgPT0gbnVsbHB0cikgPDwgIldhcyBhbHJlYWR5IGluaXRpYWxpemVkLiI7Ci0KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmcoKSkgewotICAgIExPRyhJTkZPKSA8PCAiRXh0ZW5kZWQgYWR2ZXJ0aXNpbmcgd2lsbCBiZSBpbiB1c2UiOwotICAgIGluc3RhbmNlID0gbmV3IEJsZUFkdmVydGlzZXJIY2lFeHRlbmRlZEltcGwoKTsKLSAgfSBlbHNlIGlmIChCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KCkpIHsKLSAgICBMT0coSU5GTykgPDwgIlZTQyBhZHZlcnRpc2luZyB3aWxsIGJlIGluIHVzZSI7Ci0gICAgaW5zdGFuY2UgPSBuZXcgQmxlQWR2ZXJ0aXNlclZzY0hjaUludGVyZmFjZUltcGwoKTsKLSAgICBCVE1fUmVnaXN0ZXJGb3JWU0V2ZW50cygKLSAgICAgICAgQmxlQWR2ZXJ0aXNlclZzY0hjaUludGVyZmFjZUltcGw6OlZlbmRvclNwZWNpZmljRXZlbnRDYmFjaywgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKElORk8pIDw8ICJMZWdhY3kgYWR2ZXJ0aXNpbmcgd2lsbCBiZSBpbiB1c2UiOwotICAgIGluc3RhbmNlID0gbmV3IEJsZUFkdmVydGlzZXJMZWdhY3lIY2lJbnRlcmZhY2VJbXBsKCk7Ci0gICAgbGVnYWN5X2FkdmVydGlzaW5nX2luX3VzZSA9IHRydWU7Ci0gIH0KLX0KLQotQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSogQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6R2V0KCkgeyByZXR1cm4gaW5zdGFuY2U7IH0KLQotdm9pZCBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpDbGVhblVwKCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIGlmIChCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KCkpIHsKLSAgICBCVE1fUmVnaXN0ZXJGb3JWU0V2ZW50cygKLSAgICAgICAgQmxlQWR2ZXJ0aXNlclZzY0hjaUludGVyZmFjZUltcGw6OlZlbmRvclNwZWNpZmljRXZlbnRDYmFjaywgZmFsc2UpOwotICB9Ci0KLSAgZGVsZXRlIGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYmxlX2FkdmVydGlzZXJfaGNpX2ludGVyZmFjZS5oIGIvc3RhY2svYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzODIwMi4uMDAwMDAwMAotLS0gYS9zdGFjay9idG0vYmxlX2FkdmVydGlzZXJfaGNpX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQkxFX0FEVkVSVElTRVJfSENJX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEJMRV9BRFZFUlRJU0VSX0hDSV9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIFRoaXMgY2xhc3MgaXMgYW4gYWJzdHJhY3Rpb24gb2YgSENJIGNvbW1hbmRzIHVzZWQgZm9yIG1hbmFnaW5nCi0gKiBhZHZlcnRpc2VtZW50cy4gUGxlYXNlIHNlZSBWU0MgSENJIFNQRUMgYXQKLSAqIGh0dHBzOi8vc3RhdGljLmdvb2dsZXVzZXJjb250ZW50LmNvbS9tZWRpYS9zb3VyY2UuYW5kcm9pZC5jb20vZW4vL2RldmljZXMvQW5kcm9pZC02LjAtQmx1ZXRvb3RoLUhDSS1SZXFzLnBkZgotICogYW5kIEJsdWV0b290aCA1LjAgIkFkdmVydGlzaW5nIEV4dGVuc2lvbiIgZmVhdHVyZSBmb3IgbW9yZSBkZXRhaWxzICAqLwotY2xhc3MgQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSB7Ci0gcHVibGljOgotICB1c2luZyBzdGF0dXNfY2IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogc3RhdHVzICovKT47Ci0gIHVzaW5nIHBhcmFtZXRlcnNfY2IgPQotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLywgaW50OF90IC8qIHR4X3Bvd2VyICovKT47Ci0KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOwotICBzdGF0aWMgQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSogR2V0KCk7Ci0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLQotICB2aXJ0dWFsIH5CbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIGNsYXNzIEFkdmVydGlzaW5nRXZlbnRPYnNlcnZlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+QWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKCkgPSBkZWZhdWx0OwotICAgIHZpcnR1YWwgdm9pZCBPbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZCgKLSAgICAgICAgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfaGFuZGxlLCB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgICAgdWludDhfdCBudW1fY29tcGxldGVkX2V4dGVuZGVkX2Fkdl9ldmVudHMpID0gMDsKLSAgfTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0QWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKAotICAgICAgQWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKiBvYnNlcnZlcikgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVhZEluc3RhbmNlQ291bnQoCi0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogaW5zdF9jbnQqLyk+IGNiKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRQYXJhbWV0ZXJzKAotICAgICAgdWludDhfdCBoYW5kbGUsIHVpbnQxNl90IHByb3BlcnRpZXMsIHVpbnQzMl90IGFkdl9pbnRfbWluLAotICAgICAgdWludDMyX3QgYWR2X2ludF9tYXgsIHVpbnQ4X3QgY2hhbm5lbF9tYXAsIHVpbnQ4X3Qgb3duX2FkZHJlc3NfdHlwZSwKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIG93bl9hZGRyZXNzLCB1aW50OF90IHBlZXJfYWRkcmVzc190eXBlLAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLCB1aW50OF90IGZpbHRlcl9wb2xpY3ksIGludDhfdCB0eF9wb3dlciwKLSAgICAgIHVpbnQ4X3QgcHJpbWFyeV9waHksIHVpbnQ4X3Qgc2Vjb25kYXJ5X21heF9za2lwLCB1aW50OF90IHNlY29uZGFyeV9waHksCi0gICAgICB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwgdWludDhfdCBzY2FuX3JlcXVlc3Rfbm90aWZ5X2VuYWJsZSwKLSAgICAgIHBhcmFtZXRlcnNfY2IgY29tbWFuZF9jb21wbGV0ZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0QWR2ZXJ0aXNpbmdEYXRhKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZyYWdtZW50X3ByZWZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhX2xlbmd0aCwgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0U2NhblJlc3BvbnNlRGF0YSh1aW50OF90IGhhbmRsZSwgdWludDhfdCBvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZnJhZ21lbnRfcHJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX3Jlc3BvbnNlX2RhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzY2FuX3Jlc3BvbnNlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSYW5kb21BZGRyZXNzKHVpbnQ4X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpID0gMDsKLQotICBzdHJ1Y3QgU2V0RW5hYmxlRGF0YSB7Ci0gICAgdWludDhfdCBoYW5kbGU7Ci0gICAgdWludDE2X3QgZHVyYXRpb247Ci0gICAgdWludDhfdCBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzOwotICB9OwotICB2aXJ0dWFsIHZvaWQgRW5hYmxlKHVpbnQ4X3QgZW5hYmxlLCBzdGQ6OnZlY3RvcjxTZXRFbmFibGVEYXRhPiBzZXRzLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSA9IDA7Ci0KLSAgdm9pZCBFbmFibGUodWludDhfdCBlbmFibGUsIHVpbnQ4X3QgaGFuZGxlLCB1aW50MTZfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgdWludDhfdCBtYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzLAotICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgewotICAgIHN0ZDo6dmVjdG9yPFNldEVuYWJsZURhdGE+IGVuYWJsZURhdGE7Ci0gICAgZW5hYmxlRGF0YS5lbXBsYWNlX2JhY2soU2V0RW5hYmxlRGF0YXsKLSAgICAgICAgLmhhbmRsZSA9IGhhbmRsZSwKLSAgICAgICAgLmR1cmF0aW9uID0gZHVyYXRpb24sCi0gICAgICAgIC5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzID0gbWF4X2V4dGVuZGVkX2FkdmVydGlzaW5nX2V2ZW50c30pOwotICAgIEVuYWJsZShlbmFibGUsIGVuYWJsZURhdGEsIGNvbW1hbmRfY29tcGxldGUpOwotICB9OwotICB2aXJ0dWFsIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnModWludDhfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBlcmlvZGljX2Fkdl9pbnRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaW9kaWNfcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YSh1aW50OF90IGhhbmRsZSwgdWludDhfdCBvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkdl9kYXRhX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFkdl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUodWludDhfdCBlbmFibGUsIHVpbnQ4X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQWR2ZXJ0aXNpbmdTZXQodWludDhfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgPSAwOwotCi0gIC8vIFNvbWUgaW1wbGVtZW50YXRpb24gZG9uJ3QgYmVoYXZlIHdlbGwgd2hlbiBoYW5kbGUgdmFsdWUgMCBpcyB1c2VkLgotICB2aXJ0dWFsIGJvb2wgUXVpcmtBZHZlcnRpc2VyWmVyb0hhbmRsZSgpIHsgcmV0dXJuIDA7IH0KLX07Ci0KLSNlbmRpZiAgLy8gQkxFX0FEVkVSVElTRVJfSENJX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zdGFjay9idG0vYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5jYyBiL3N0YWNrL2J0bS9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmExOTI0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImFjbF9hcGkuaCIKLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSB7Ci1CbGVTY2FubmVySGNpSW50ZXJmYWNlKiBpbnN0YW5jZSA9IG51bGxwdHI7Ci0KLXN0YXRpYyB2b2lkIHN0YXR1c19jYWxsYmFjayhiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPiBjYiwgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0KLSAgTE9HX0FTU0VSVChsZW4gPT0gMSkgPDwgIlJlY2VpdmVkIGJhZCByZXNwb25zZSBsZW5ndGg6ICIgPDwgbGVuOwotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBkYXRhKTsKLQotICBEVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIFJlY2VpdmVkIHN0YXR1c19jYiI7Ci0gIGNiLlJ1bihzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBzdGF0dXNfaGFuZGxlX2NhbGxiYWNrKGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCwgdWludDE2X3QpPiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSwgdWludDE2X3QgbGVuKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MTZfdCBoYW5kbGUgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0KLSAgTE9HX0FTU0VSVCgobGVuID4gMCkgJiYgKGxlbiA8IDQpKSA8PCAiUmVjZWl2ZWQgYmFkIHJlc3BvbnNlIGxlbmd0aDogIiA8PCBsZW47Ci0gIHVpbnQ4X3QqIHBwID0gZGF0YTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcHApOwotCi0gIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBMT0dfQVNTRVJUKGxlbiA9PSAzKSA8PCAiUmVjZWl2ZWQgYmFkIHJlc3BvbnNlIGxlbmd0aDogIiA8PCBsZW47Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcHApOwotICAgIGhhbmRsZSA9IGhhbmRsZSAmIDB4MEVGRjsKLQotICAgIERWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgUmVjZWl2ZWQgc3RhdHVzX2hhbmRsZV9jYWxsYmFjayI7Ci0gIH0gZWxzZSB7Ci0gICAgRFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBoY2kgcmVzcG9uc2UgZXJyb3IgY29kZTogIiA8PCBpbnR7c3RhdHVzfTsKLSAgfQotICBjYi5SdW4oc3RhdHVzLCBoYW5kbGUpOwotfQotCi0vKioKLSAqIEJsZVNjYW5uZXJIY2lJbnRlcmZhY2UgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3luYyB0byBhIHBlcmlvZGljIGFkdmVydGlzaW5nCi0gKiB0cmFpbiBhbmQgcmVjZWl2ZSBwZXJpb2RpYyBhZHZlcnRpc2luZyBkYXRhIGV2ZW50cyB0aHJvdWdoIGEgcmVnaXN0ZXJlZAotICogb2JzZXJ2ZXIncyBjYWxsYmFja3MuIEl0IGFsc28gcHJvdmlkZXMgYSBzeW5jaHJvbmlzYXRpb24gdHJhbnNmZXIgQVBJLAotICogaW5jbHVkaW5nIGluLWNvbnRyb2xsZXIgYWxsb3cgbGlzdCBzdXBwb3J0LiBUaGUgcmlnaHQgZmVhdHVyZS1jb21wbGV0ZQotICogaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGlzIGNob3NlbiBkdXJpbmcgdGhlIGluaXQgcGhhc2UgYmFzZWQgb24gdGhlCi0gKiBjb250cm9sbGVyJ3MgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZXMuCi0gKi8KLWNsYXNzIEJsZVNjYW5uZXJJbXBsQmFzZSA6IHB1YmxpYyBCbGVTY2FubmVySGNpSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgU2V0U2NhbkV2ZW50T2JzZXJ2ZXIoU2NhbkV2ZW50T2JzZXJ2ZXIqIG9ic2VydmVyKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICAvLyBUT0RPOiBTdXBwb3J0IG11bHRpcGxlIG9ic2VydmVycyBpZiBldmVyIG5lZWRlZC4KLSAgICBzY2FuX2V2ZW50X29ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gIH0KLQotICB2b2lkIFBlcmlvZGljU2NhblN0YXJ0KHVpbnQ4X3Qgb3B0aW9ucywgdWludDhfdCBzZXRfaWQsIHVpbnQ4X3QgYWR2X2FkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDE2X3Qgc2tpcF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3luY190aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3luY19jdGVfdHlwZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfY3JlYXRlX3N5bmMoCi0gICAgICAgIG9wdGlvbnMsIHNldF9pZCwgYWR2X2FkZHJfdHlwZSwgYWR2X2FkZHIsIHNraXBfbnVtLCBzeW5jX3RpbWVvdXQsCi0gICAgICAgIHN5bmNfY3RlX3R5cGUpOwotICB9Ci0KLSAgdm9pZCBQZXJpb2RpY1NjYW5DYW5jZWxTdGFydChzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfY3JlYXRlX3N5bmNfY2FuY2VsKAotICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfY2FsbGJhY2ssIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSkpOwotICB9Ci0KLSAgdm9pZCBQZXJpb2RpY1NjYW5UZXJtaW5hdGUodWludDE2X3Qgc3luY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ190ZXJtaW5hdGVfc3luYygKLSAgICAgICAgc3luY19oYW5kbGUsIGJhc2U6OkJpbmQoJnN0YXR1c19jYWxsYmFjaywgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKSk7Ci0gIH0KLQotICB2b2lkIFBlcmlvZGljU2NhblJlc3VsdEV2dEVuYWJsZSh1aW50MTZfdCBzeW5jX2hhbmRsZSwgYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgICBidHNuZF9oY2ljX2JsZV9zZXRfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfcmVjZWl2ZV9lbmFibGUoCi0gICAgICAgIHN5bmNfaGFuZGxlLCBlbmFibGUsCi0gICAgICAgIGJhc2U6OkJpbmQoJnN0YXR1c19jYWxsYmFjaywgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKSk7Ci0gIH0KLQotICB2b2lkIFBlcmlvZGljQWR2ZXJ0aXNlckxpc3RHZXRTaXplKAotICAgICAgQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6bGlzdF9zaXplX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIGNvbW1hbmRfY29tcGxldGUuUnVuKAotICAgICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZSgpKTsKLSAgfQotCi0gIHZvaWQgUGVyaW9kaWNBZHZlcnRpc2VyTGlzdEFkZERldmljZSh1aW50OF90IGFkdl9hZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgYnRzbmRfaGNpX2JsZV9hZGRfZGV2aWNlX3RvX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdCgKLSAgICAgICAgYWR2X2FkZHJfdHlwZSwgYWR2X2FkZHIsIHNldF9pZCwKLSAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2NhbGxiYWNrLCBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZSkpKTsKLSAgfQotCi0gIHZvaWQgUGVyaW9kaWNBZHZlcnRpc2VyTGlzdFJlbW92ZURldmljZSh1aW50OF90IGFkdl9hZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgYnRzbmRfaGNpX2JsZV9yZW1vdmVfZGV2aWNlX2Zyb21fcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgICAgICBhZHZfYWRkcl90eXBlLCBhZHZfYWRkciwgc2V0X2lkLAotICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfY2FsbGJhY2ssIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSkpOwotICB9Ci0KLSAgdm9pZCBQZXJpb2RpY0FkdmVydGlzZXJMaXN0Q2xlYXIoc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIGJ0c25kX2hjaV9ibGVfY2xlYXJfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfY2FsbGJhY2ssIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSkpOwotICB9OwotCi0gIHZvaWQgUGVyaW9kaWNBZHZTeW5jVHJhbnNmZXIoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBzZXJ2aWNlX2RhdGEsIHVpbnQxNl90IHN5bmNfaGFuZGxlLAotICAgICAgQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6aGFuZGxlX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIHVpbnQxNl90IGFjbF9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgaWYgKGFjbF9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IFdyb25nIG1vZGU6IG5vIExFIGxpbmsgZXhpc3Qgb3IgTEUgbm90IHN1cHBvcnRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2ZlcigKLSAgICAgICAgYWNsX2hhbmRsZSwgc2VydmljZV9kYXRhLCBzeW5jX2hhbmRsZSwKLSAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2hhbmRsZV9jYWxsYmFjaywgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKSk7Ci0gIH0KLQotICB2b2lkIFBlcmlvZGljQWR2U2V0SW5mb1RyYW5zZmVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV9kYXRhLCB1aW50OF90IGFkdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIHVpbnQxNl90IGFjbF9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgaWYgKGFjbF9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IFdyb25nIG1vZGU6IG5vIExFIGxpbmsgZXhpc3Qgb3IgTEUgbm90IHN1cHBvcnRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc2V0X2luZm9fdHJhbnNmZXIoCi0gICAgICAgIGFjbF9oYW5kbGUsIHNlcnZpY2VfZGF0YSwgYWR2X2hhbmRsZSwKLSAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2hhbmRsZV9jYWxsYmFjaywgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKSk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2U3luY1RyYW5zZmVyUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBza2lwLCB1aW50MTZfdCBzeW5jX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjdGVfdHlwZSwgYm9vbCBzZXRfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIHVpbnQxNl90IGFjbF9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgaWYgKGFjbF9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IFdyb25nIG1vZGU6IG5vIExFIGxpbmsgZXhpc3Qgb3IgTEUgbm90IHN1cHBvcnRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHNldF9kZWZhdWx0cykKLSAgICAgIGJ0c25kX2hjaWNfYmxlX3NldF9kZWZhdWx0X3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcGFyYW1zKAotICAgICAgICAgIGFjbF9oYW5kbGUsIG1vZGUsIHNraXAsIHN5bmNfdGltZW91dCwgY3RlX3R5cGUsCi0gICAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2NhbGxiYWNrLCBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZSkpKTsKLSAgICBlbHNlCi0gICAgICBidHNuZF9oY2ljX2JsZV9zZXRfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9wYXJhbXMoCi0gICAgICAgICAgYWNsX2hhbmRsZSwgbW9kZSwgc2tpcCwgc3luY190aW1lb3V0LCBjdGVfdHlwZSwKLSAgICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfY2FsbGJhY2ssIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSkpOwotICB9Ci0KLSAgdm9pZCBPblBlcmlvZGljQWR2U3luY0VzdGFibGlzaGVkKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBzeW5jX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2X3NpZCwgdWludDhfdCBhZHZfYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyBhZHZfYWRkciwgdWludDhfdCBhZHZfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYWR2X2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZfY2xvY2tfYWNjdXJhY3kpIHsKLSAgICBpZiAoc2Nhbl9ldmVudF9vYnNlcnZlcikgewotICAgICAgc2Nhbl9ldmVudF9vYnNlcnZlci0+T25QZXJpb2RpY1NjYW5Fc3RhYmxpc2hlZCgKLSAgICAgICAgICBzdGF0dXMsIHN5bmNfaGFuZGxlLCBhZHZfc2lkLCBhZHZfYWRkcl90eXBlLCBhZHZfYWRkciwgYWR2X3BoeSwKLSAgICAgICAgICBhZHZfaW50ZXJ2YWwsIGFkdl9jbG9ja19hY2N1cmFjeSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPblBlcmlvZGljU2NhblJlc3VsdCh1aW50MTZfdCBzeW5jX2hhbmRsZSwgdWludDhfdCB0eF9wb3dlciwgaW50OF90IHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjdGVfdHlwZSwgdWludDhfdCBwa3RfZGF0YV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwa3RfZGF0YV9sZW4sIHVpbnQ4X3QqIHBfcGt0X2RhdGEpIHsKLSAgICAvLyBUaGUgb2JzZXJ2ZXIgc2hvdWxkIGhhbmRsZSB0aGUgY2FjaGluZyBhbmQgcmVhc3NlbWJseSBvZiB0aGUgZnJhZ21lbnRlZAotICAgIC8vIHBhY2tldC4KLSAgICBpZiAoc2Nhbl9ldmVudF9vYnNlcnZlcikgewotICAgICAgc2Nhbl9ldmVudF9vYnNlcnZlci0+T25QZXJpb2RpY1NjYW5SZXN1bHQoc3luY19oYW5kbGUsIHR4X3Bvd2VyLCByc3NpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RlX3R5cGUsIHBrdF9kYXRhX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kYXRhX2xlbiwgcF9wa3RfZGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBPblBlcmlvZGljU3luY0xvc3QodWludDE2X3Qgc3luY19oYW5kbGUpIHsKLSAgICBpZiAoc2Nhbl9ldmVudF9vYnNlcnZlcikKLSAgICAgIHNjYW5fZXZlbnRfb2JzZXJ2ZXItPk9uUGVyaW9kaWNTY2FuTG9zdChzeW5jX2hhbmRsZSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFNjYW5FdmVudE9ic2VydmVyKiBzY2FuX2V2ZW50X29ic2VydmVyID0gbnVsbHB0cjsKLX07Ci0KLWNsYXNzIEJsZVNjYW5uZXJMaXN0SW1wbCA6IHB1YmxpYyB2aXJ0dWFsIEJsZVNjYW5uZXJJbXBsQmFzZSB7Ci0gIHZvaWQgUGVyaW9kaWNBZHZlcnRpc2VyTGlzdEFkZERldmljZSh1aW50OF90IGFkdl9hZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgYnRzbmRfaGNpX2JsZV9hZGRfZGV2aWNlX3RvX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdCgKLSAgICAgICAgYWR2X2FkZHJfdHlwZSwgYWR2X2FkZHIsIHNldF9pZCwKLSAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2NhbGxiYWNrLCBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZSkpKTsKLSAgfQotCi0gIHZvaWQgUGVyaW9kaWNBZHZlcnRpc2VyTGlzdFJlbW92ZURldmljZSh1aW50OF90IGFkdl9hZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX187Ci0gICAgYnRzbmRfaGNpX2JsZV9yZW1vdmVfZGV2aWNlX2Zyb21fcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgICAgICBhZHZfYWRkcl90eXBlLCBhZHZfYWRkciwgc2V0X2lkLAotICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfY2FsbGJhY2ssIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSkpOwotICB9Ci0KLSAgdm9pZCBQZXJpb2RpY0FkdmVydGlzZXJMaXN0Q2xlYXIoc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAgIGJ0c25kX2hjaV9ibGVfY2xlYXJfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfY2FsbGJhY2ssIHN0ZDo6bW92ZShjb21tYW5kX2NvbXBsZXRlKSkpOwotICB9OwotfTsKLQotY2xhc3MgQmxlU2Nhbm5lclN5bmNUcmFuc2ZlckltcGwgOiBwdWJsaWMgdmlydHVhbCBCbGVTY2FubmVySW1wbEJhc2UgewotICB2b2lkIFBlcmlvZGljQWR2U3luY1RyYW5zZmVyKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3Qgc2VydmljZV9kYXRhLCB1aW50MTZfdCBzeW5jX2hhbmRsZSwKLSAgICAgIEJsZVNjYW5uZXJIY2lJbnRlcmZhY2U6OmhhbmRsZV9jYiBjb21tYW5kX2NvbXBsZXRlKSBvdmVycmlkZSB7Ci0gICAgdWludDE2X3QgYWNsX2hhbmRsZSA9IEJUTV9HZXRIQ0lDb25uSGFuZGxlKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgICBpZiAoYWNsX2hhbmRsZSA9PSBIQ0lfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIjogV3JvbmcgbW9kZTogbm8gTEUgbGluayBleGlzdCBvciBMRSBub3Qgc3VwcG9ydGVkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyKAotICAgICAgICBhY2xfaGFuZGxlLCBzZXJ2aWNlX2RhdGEsIHN5bmNfaGFuZGxlLAotICAgICAgICBiYXNlOjpCaW5kKCZzdGF0dXNfaGFuZGxlX2NhbGxiYWNrLCBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZSkpKTsKLSAgfQotCi0gIHZvaWQgUGVyaW9kaWNBZHZTZXRJbmZvVHJhbnNmZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX2RhdGEsIHVpbnQ4X3QgYWR2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfY2IgY29tbWFuZF9jb21wbGV0ZSkgb3ZlcnJpZGUgewotICAgIHVpbnQxNl90IGFjbF9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgaWYgKGFjbF9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IFdyb25nIG1vZGU6IG5vIExFIGxpbmsgZXhpc3Qgb3IgTEUgbm90IHN1cHBvcnRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc2V0X2luZm9fdHJhbnNmZXIoCi0gICAgICAgIGFjbF9oYW5kbGUsIHNlcnZpY2VfZGF0YSwgYWR2X2hhbmRsZSwKLSAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2hhbmRsZV9jYWxsYmFjaywgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKSk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2U3luY1RyYW5zZmVyUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBza2lwLCB1aW50MTZfdCBzeW5jX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjdGVfdHlwZSwgYm9vbCBzZXRfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNvbW1hbmRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICB1aW50MTZfdCBhY2xfaGFuZGxlID0gQlRNX0dldEhDSUNvbm5IYW5kbGUoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLQotICAgIGlmIChhY2xfaGFuZGxlID09IEhDSV9JTlZBTElEX0hBTkRMRSkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBXcm9uZyBtb2RlOiBubyBMRSBsaW5rIGV4aXN0IG9yIExFIG5vdCBzdXBwb3J0ZWQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzZXRfZGVmYXVsdHMpCi0gICAgICBidHNuZF9oY2ljX2JsZV9zZXRfZGVmYXVsdF9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3BhcmFtcygKLSAgICAgICAgICBhY2xfaGFuZGxlLCBtb2RlLCBza2lwLCBzeW5jX3RpbWVvdXQsIGN0ZV90eXBlLAotICAgICAgICAgIGJhc2U6OkJpbmQoJnN0YXR1c19jYWxsYmFjaywgc3RkOjptb3ZlKGNvbW1hbmRfY29tcGxldGUpKSk7Ci0gICAgZWxzZQotICAgICAgYnRzbmRfaGNpY19ibGVfc2V0X3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcGFyYW1zKAotICAgICAgICAgIGFjbF9oYW5kbGUsIG1vZGUsIHNraXAsIHN5bmNfdGltZW91dCwgY3RlX3R5cGUsCi0gICAgICAgICAgYmFzZTo6QmluZCgmc3RhdHVzX2NhbGxiYWNrLCBzdGQ6Om1vdmUoY29tbWFuZF9jb21wbGV0ZSkpKTsKLSAgfQotfTsKLQotY2xhc3MgQmxlU2Nhbm5lckNvbXBsZXRlSW1wbCA6IHB1YmxpYyBCbGVTY2FubmVyTGlzdEltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJsZVNjYW5uZXJTeW5jVHJhbnNmZXJJbXBsIHsKLSAgLy8gTm90IG11Y2ggdG8gZG8gaGVyZSA6KQotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6SW5pdGlhbGl6ZSgpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgTE9HX0FTU0VSVChpbnN0YW5jZSA9PSBudWxscHRyKSA8PCAiV2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIjsKLQotICBpZiAoKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplKCkpICYmCi0gICAgICAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkKLSAgICAgICAgICAgLT5zdXBwb3J0c19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9zZW5kZXIoKSkpIHsKLSAgICBMT0coSU5GTykgPDwgIkFkdmVydGlzZXIgbGlzdCBpbiBjb250cm9sbGVyIGNhbiBiZSB1c2VkIjsKLSAgICBMT0coSU5GTykgPDwgIlBlcmlvZGljIEFkdiBTeW5jIFRyYW5zZmVyIFNlbmRlciByb2xlIGlzIHN1cHBvcnRlZCI7Ci0gICAgaW5zdGFuY2UgPSBuZXcgQmxlU2Nhbm5lckNvbXBsZXRlSW1wbCgpOwotICB9IGVsc2UgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgIC0+c3VwcG9ydHNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfc2VuZGVyKCkpIHsKLSAgICBMT0coSU5GTykgPDwgIlBlcmlvZGljIEFkdiBTeW5jIFRyYW5zZmVyIFNlbmRlciByb2xlIGlzIHN1cHBvcnRlZCI7Ci0gICAgaW5zdGFuY2UgPSBuZXcgQmxlU2Nhbm5lclN5bmNUcmFuc2ZlckltcGwoKTsKLSAgfSBlbHNlIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAtPmdldF9ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemUoKSkgewotICAgIExPRyhJTkZPKSA8PCAiUGVyaW9kaWMgQWR2IFN5bmMgVHJhbnNmZXIgUmVjaXBpZW50IHJvbGUgaXMgc3VwcG9ydGVkIjsKLSAgICBpbnN0YW5jZSA9IG5ldyBCbGVTY2FubmVyTGlzdEltcGwoKTsKLSAgfQotICAvLyBUT0RPOiBJbXBsZW1lbnQgcGVyaW9kaWMgYWR2LiBzeW5jLiByZWNpcGllbnQgcm9sZSBpZiBldmVyIG5lZWRlZC4KLX0KLQotQmxlU2Nhbm5lckhjaUludGVyZmFjZSogQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6R2V0KCkgeyByZXR1cm4gaW5zdGFuY2U7IH0KLQotdm9pZCBCbGVTY2FubmVySGNpSW50ZXJmYWNlOjpDbGVhblVwKCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIGRlbGV0ZSBpbnN0YW5jZTsKLSAgaW5zdGFuY2UgPSBudWxscHRyOwotfQotCi12b2lkIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0KHVpbnQ4X3QgZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEpIHsKLSAgdWludDE2X3Qgc3luY19oYW5kbGUsIGFkdl9pbnRlcnZhbDsKLSAgdWludDhfdCBzdGF0dXMsIGFkdl9zaWQsIGFkdl9hZGRyX3R5cGUsIGFkdl9waHksIGFkdl9jbG9ja19hY2N1cmFjeTsKLSAgUmF3QWRkcmVzcyBhZHZfYWRkcjsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIExPR19BU1NFUlQoZGF0YV9sZW4gPT0gMTUpCi0gICAgICA8PCAiTWFsZm9ybWVkIExFIFBlcmlvZGljIEFkdmVydGlzaW5nIFN5bmMgRXN0LiBFdmVudCBmcm9tIGNvbnRyb2xsZXIiOwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIGRhdGEpOwotICBTVFJFQU1fVE9fVUlOVDE2KHN5bmNfaGFuZGxlLCBkYXRhKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGFkdl9zaWQsIGRhdGEpOwotICBTVFJFQU1fVE9fVUlOVDgoYWR2X2FkZHJfdHlwZSwgZGF0YSk7Ci0gIFNUUkVBTV9UT19CREFERFIoYWR2X2FkZHIsIGRhdGEpOwotICBTVFJFQU1fVE9fVUlOVDgoYWR2X3BoeSwgZGF0YSk7Ci0gIFNUUkVBTV9UT19VSU5UMTYoYWR2X2ludGVydmFsLCBkYXRhKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGFkdl9jbG9ja19hY2N1cmFjeSwgZGF0YSk7Ci0KLSAgaWYgKEJsZVNjYW5uZXJIY2lJbnRlcmZhY2U6OkdldCgpKSB7Ci0gICAgc3RhdGljX2Nhc3Q8QmxlU2Nhbm5lckltcGxCYXNlKj4oQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6R2V0KCkpCi0gICAgICAgIC0+T25QZXJpb2RpY0FkdlN5bmNFc3RhYmxpc2hlZChzdGF0dXMsIHN5bmNfaGFuZGxlLCBhZHZfc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2FkZHJfdHlwZSwgYWR2X2FkZHIsIGFkdl9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZfaW50ZXJ2YWwsIGFkdl9jbG9ja19hY2N1cmFjeSk7Ci0gIH0KLX0KLQotdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3BrdCh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBkYXRhKSB7Ci0gIHVpbnQ4X3QqIHAgPSBkYXRhOwotICB1aW50MTZfdCBzeW5jX2hhbmRsZTsKLSAgdWludDhfdCB0eF9wb3dlciwgY3RlX3R5cGUsIHBrdF9kYXRhX3N0YXR1cywgcGt0X2RhdGFfbGVuOwotICBpbnQ4X3QgcnNzaTsKLQotICBMT0dfQVNTRVJUKGRhdGFfbGVuID49IDcpCi0gICAgICA8PCAiTWFsZm9ybWVkIExFIFBlcmlvZGljIEFkdmVydGlzaW5nIFJlcG9ydCBFdmVudCBmcm9tIGNvbnRyb2xsZXIiOwotCi0gIFNUUkVBTV9UT19VSU5UMTYoc3luY19oYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgodHhfcG93ZXIsIHApOwotICBTVFJFQU1fVE9fSU5UOChyc3NpLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGN0ZV90eXBlLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHBrdF9kYXRhX3N0YXR1cywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChwa3RfZGF0YV9sZW4sIHApOwotCi0gIHVpbnQ4X3QqIHBrdF9kYXRhID0gcDsKLSAgcCArPSBwa3RfZGF0YV9sZW47Ci0KLSAgaWYgKHAgPiBkYXRhICsgZGF0YV9sZW4pIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgSW52YWxpZCBwa3RfZGF0YV9sZW46ICIgPDwgaW50e3BrdF9kYXRhX2xlbn07Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJzc2kgPj0gMjEgJiYgcnNzaSA8PSAxMjYpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiIGJhZCByc3NpIHZhbHVlIGluIGFkdmVydGlzaW5nIHJlcG9ydDogIiA8PCBpbnR7cnNzaX07Ci0gIH0KLQotICBpZiAoQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6R2V0KCkpIHsKLSAgICBzdGF0aWNfY2FzdDxCbGVTY2FubmVySW1wbEJhc2UqPihCbGVTY2FubmVySGNpSW50ZXJmYWNlOjpHZXQoKSkKLSAgICAgICAgLT5PblBlcmlvZGljU2NhblJlc3VsdChzeW5jX2hhbmRsZSwgdHhfcG93ZXIsIHJzc2ksIGN0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kYXRhX3N0YXR1cywgcGt0X2RhdGFfbGVuLCBwa3RfZGF0YSk7Ci0gIH0KLX0KLQotdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfbG9zdF9ldnQodWludDhfdCBkYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEpIHsKLSAgdWludDE2X3Qgc3luY19oYW5kbGU7Ci0KLSAgU1RSRUFNX1RPX1VJTlQxNihzeW5jX2hhbmRsZSwgZGF0YSk7Ci0KLSAgaWYgKEJsZVNjYW5uZXJIY2lJbnRlcmZhY2U6OkdldCgpKSB7Ci0gICAgc3RhdGljX2Nhc3Q8QmxlU2Nhbm5lckltcGxCYXNlKj4oQmxlU2Nhbm5lckhjaUludGVyZmFjZTo6R2V0KCkpCi0gICAgICAgIC0+T25QZXJpb2RpY1N5bmNMb3N0KHN5bmNfaGFuZGxlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2JsZV9zY2FubmVyX2hjaV9pbnRlcmZhY2UuaCBiL3N0YWNrL2J0bS9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMDU0MWMuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2JsZV9zY2FubmVyX2hjaV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJMRV9TQ0FOTkVSX0hDSV9JTlRFUkZBQ0VfSAotI2RlZmluZSBCTEVfU0NBTk5FUl9IQ0lfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1jbGFzcyBCbGVTY2FubmVySGNpSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIHN0YXR1c19jYiA9IGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPjsKLSAgdXNpbmcgbGlzdF9zaXplX2NiID0gYmFzZTo6Q2FsbGJhY2s8dm9pZChpbnQ4X3QgLyogbGlzdF9zaXplICovKT47Ci0gIHVzaW5nIGhhbmRsZV9jYiA9Ci0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogc3RhdHVzICovLCB1aW50MTZfdCAvKiBhZHZfaGFuZGxlICovKT47Ci0KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOwotICBzdGF0aWMgQmxlU2Nhbm5lckhjaUludGVyZmFjZSogR2V0KCk7Ci0gIHN0YXRpYyB2b2lkIENsZWFuVXAoKTsKLQotICB2aXJ0dWFsIH5CbGVTY2FubmVySGNpSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotCi0gIGNsYXNzIFNjYW5FdmVudE9ic2VydmVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5TY2FuRXZlbnRPYnNlcnZlcigpID0gZGVmYXVsdDsKLSAgICB2aXJ0dWFsIHZvaWQgT25QZXJpb2RpY1NjYW5SZXN1bHQodWludDE2X3Qgc3luY19oYW5kbGUsIHVpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByc3NpLCB1aW50OF90IGN0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBrdF9kYXRhX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwa3RfZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBrdF9kYXRhKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIE9uUGVyaW9kaWNTY2FuRXN0YWJsaXNoZWQoCi0gICAgICAgIHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBzeW5jX2hhbmRsZSwgdWludDhfdCBzZXRfaWQsCi0gICAgICAgIHVpbnQ4X3QgYWR2X2FkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWR2X2FkZHIsIHVpbnQ4X3QgYWR2X3BoeSwKLSAgICAgICAgdWludDE2X3QgYWR2X2ludGVydmFsLCB1aW50OF90IGFkdl9jbG9ja19hY2N1cmFjeSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBPblBlcmlvZGljU2Nhbkxvc3QodWludDE2X3Qgc3luY19oYW5kbGUpID0gMDsKLSAgfTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0U2NhbkV2ZW50T2JzZXJ2ZXIoU2NhbkV2ZW50T2JzZXJ2ZXIqIG9ic2VydmVyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFVzZWQgdG8gc3luY2hyb25pemUgd2l0aCBhIHBlcmlvZGljIGFkdmVydGlzaW5nIHRyYWluIGZyb20gYW4gYWR2ZXJ0aXNlcgotICAgKiBhbmQgYmVnaW4gcmVjZWl2aW5nIHBlcmlvZGljIGFkdmVydGlzaW5nIHBhY2tldHMuCi0gICAqCi0gICAqIEBwYXJhbSBvcHRpb25zIGJpdCAwOiB3aGV0aGVyIHRvIHVzZSBhZHZlcnRpc2VyIGxpc3QsIGFkdl9zaWQsCi0gICAqIGFkdl9hZGRyX3R5cGUgYW5kIGFkdl9hZGRyIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHVzZWQgb3RoZXJ3aXNlLCBiaXQgMToKLSAgICogd2hldGhlciByZXBvcnRpbmcgaXMgaW5pdGlhbGx5IGRpc2FibGVkLCBhbGwgb3RoZXIgYml0czogUmVzZXJ2ZWQgZm9yCi0gICAqIGZ1dHVyZSB1c2UKLSAgICogQHBhcmFtIGFkdl9zaWQgYWR2ZXJ0aXNpbmcgc2V0IElECi0gICAqIEBwYXJhbSBhZHZfYWRkcl90eXBlIGFkdmVydGlzZXIgZGV2aWNlIGFkZHJlc3MgdHlwZQotICAgKiBAcGFyYW0gYWR2X2FkZHIgYWR2ZXJ0aXNlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gc2tpcF9udW0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBlcmlvZGljIGFkdmVydGlzaW5nIGV2ZW50cyB0aGF0IGNhbgotICAgKiBiZSBza2lwcGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCByZWNlaXZlLiBSYW5nZTogMHgwMDAwIHRvIDB4MDFGMy4KLSAgICogQHBhcmFtIHN5bmNfdGltZW91dCBzeW5jaHJvbml6YXRpb24gdGltZW91dCBmb3IgdGhlIHBlcmlvZGljIGFkdmVydGlzaW5nCi0gICAqIHRyYWluLCBSYW5nZTogMHgwMDBBIHRvIDB4NDAwMCwgVGltZSA9IE4qMTAgbXMsIFJhbmdlOiAxMDAgbXMgdG8gMTYzLjg0cwotICAgKiBAcGFyYW0gc3luY19jdGVfdHlwZSBiaXQgMDogZG8gbm90IHN5bmMgdG8gcGFja2V0cyB3aXRoIGFuIEFvQSBDb25zdGFudAotICAgKiBUb25lIEV4dGVuc2lvbiwgYml0IDE6IGRvIG5vdCBzeW5jIHRvIHBhY2tldHMgd2l0aCBhbiBBb0QgQ29uc3RhbnQgVG9uZQotICAgKiBFeHRlbnNpb24gd2l0aCAxIM68cyBzbG90cywgYml0IDI6IGRvIG5vdCBzeW5jIHRvIHBhY2tldHMgd2l0aCBhbiBBb0QKLSAgICogQ29uc3RhbnQgVG9uZSBFeHRlbnNpb24gd2l0aCAyIM68cyBzbG90cywgYml0IDM6IGRvIG5vdCBzeW5jIHRvIHBhY2tldHMgd2l0aAotICAgKiBhIHR5cGUgMyBDb25zdGFudCBUb25lIEV4dGVuc2lvbiAoY3VycmVudGx5IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlKSwKLSAgICogYml0IDQ6IGRvIG5vdCBzeW5jIHRvIHBhY2tldHMgd2l0aG91dCBhIENvbnN0YW50IFRvbmUgRXh0ZW5zaW9uLCBhbGwgb3RoZXIKLSAgICogYml0czogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUGVyaW9kaWNTY2FuU3RhcnQodWludDhfdCBvcHRpb25zLCB1aW50OF90IHNldF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2X2FkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkdl9hZGRyLCB1aW50MTZfdCBza2lwX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN5bmNfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3luY19jdGVfdHlwZSkgPSAwOwotCi0gIC8qKgotICAgKiBVc2VkIHRvIGNhbmNlbCB0aGUgSENJX0xFX1BlcmlvZGljX0FkdmVydGlzaW5nX0NyZWF0ZV9TeW5jIGNvbW1hbmQgd2hpbGUgaXQKLSAgICogaXMgcGVuZGluZy4KLSAgICoKLSAgICogQHBhcmFtIGNiIHN0YXR1cyBjYWxsYmFjawotICAgKi8KLSAgdmlydHVhbCB2b2lkIFBlcmlvZGljU2NhbkNhbmNlbFN0YXJ0KHN0YXR1c19jYiBjYikgPSAwOwotCi0gIC8qKgotICAgKiBVc2VkIHRvIHN0b3AgcmVjZXB0aW9uIG9mIHRoZSBwZXJpb2RpYyBhZHZlcnRpc2luZyB0cmFpbiBpZGVudGlmaWVkIGJ5IHRoZQotICAgKiBTeW5jX0hhbmRsZSBwYXJhbWV0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzeW5jX2hhbmRsZSBzeW5jZWQgYWR2ZXJ0aXNpbmcgaGFuZGxlCi0gICAqIEBwYXJhbSBjYiBzdGF0dXMgY2FsbGJhY2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBQZXJpb2RpY1NjYW5UZXJtaW5hdGUodWludDE2X3Qgc3luY19oYW5kbGUsIHN0YXR1c19jYiBjYikgPSAwOwotCi0gIC8qKgotICAgKiBFbmFibGUgb3IgZGlzYWJsZSByZXBvcnRzIGZvciB0aGUgcGVyaW9kaWMgYWR2ZXJ0aXNpbmcgdHJhaW4gZGVmaW5lZCBieSB0aGUKLSAgICogc3luY19oYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBzeW5jX2hhbmRsZSBzeW5jZWQgYWR2ZXdydGlzaW5nIGhhbmRsZQotICAgKiBAcGFyYW0gZW5hYmxlIHdoZXRoZXIgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFkdmVydGlzaW5nIHJlcG9ydHMKLSAgICogQHBhcmFtIGNiICBzdGF0dXMgY2FsbGJhY2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBQZXJpb2RpY1NjYW5SZXN1bHRFdnRFbmFibGUodWludDE2X3Qgc3luY19oYW5kbGUsIGJvb2wgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19jYiBjYikgPSAwOwotCi0gIC8qKgotICAgKiBVc2VkIHRvIGFkZCBhbiBlbnRyeSwgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBkZXZpY2UgYWRkcmVzcyBhbmQgU0lELCB0byB0aGUKLSAgICogUGVyaW9kaWMgQWR2ZXJ0aXNlciBsaXN0IHN0b3JlZCBpbiB0aGUgQ29udHJvbGxlci4gQW55IGFkZGl0aW9ucyB0byB0aGUKLSAgICogUGVyaW9kaWMgQWR2ZXJ0aXNlciBsaXN0IHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LiBJZiB0aGUgZW50cnkgaXMgYWxyZWFkeQotICAgKiBvbiB0aGUgbGlzdCwgdGhlIENvbnRyb2xsZXIgc2hhbGwgcmV0dXJuIHRoZSBlcnJvciBjb2RlIEludmFsaWQgSENJIENvbW1hbmQKLSAgICogUGFyYW1ldGVycyAoMHgxMikuCi0gICAqCi0gICAqIEBwYXJhbSBhZHZfYWRkcl90eXBlIGFkdmVydGlzZXIgZGV2aWNlIGFkZHJlc3MgdHlwZQotICAgKiBAcGFyYW0gYWR2X2FkZHIgYWR2ZXJ0aXNlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gYWR2X3NpZCBhZHZlcnRpc2luZyBzZXQgSUQKLSAgICogQHBhcmFtIGNiIHN0YXR1cyBjYWxsYmFjawotICAgKi8KLSAgdmlydHVhbCB2b2lkIFBlcmlvZGljQWR2ZXJ0aXNlckxpc3RBZGREZXZpY2UodWludDhfdCBhZHZfYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBhZHZfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZfc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY2IpID0gMDsKLSAgLyoqCi0gICAqIFJlbW92ZSBvbmUgZW50cnkgZnJvbSB0aGUgbGlzdCBvZiBQZXJpb2RpYyBBZHZlcnRpc2VycyBzdG9yZWQgaW4gdGhlCi0gICAqIENvbnRyb2xsZXIuIFJlbW92YWxzIGZyb20gdGhlIFBlcmlvZGljIEFkdmVydGlzZXJzIExpc3QgdGFrZSBlZmZlY3QKLSAgICogaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBhZHZfYWRkcl90eXBlIGFkdmVydGlzZXIgZGV2aWNlIGFkZHJlc3MgdHlwZQotICAgKiBAcGFyYW0gYWR2X2FkZHIgYWR2ZXJ0aXNlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gYWR2X3NpZCBhZHZlcnRpc2luZyBzZXQgSUQKLSAgICogQHBhcmFtIGNiIHN0YXR1cyBjYWxsYmFjawotICAgKi8KLSAgdmlydHVhbCB2b2lkIFBlcmlvZGljQWR2ZXJ0aXNlckxpc3RSZW1vdmVEZXZpY2UodWludDhfdCBhZHZfYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBhZHZfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZfc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY2IgY2IpID0gMDsKLQotICAvKioKLSAgICogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIGxpc3Qgb2YgUGVyaW9kaWMgQWR2ZXJ0aXNlcnMgaW4gdGhlIENvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBjYiBzdGF0dXMgY2FsbGJhY2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBQZXJpb2RpY0FkdmVydGlzZXJMaXN0Q2xlYXIoc3RhdHVzX2NiIGNiKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHRvdGFsIG51bWJlciBvZiBQZXJpb2RpYyBBZHZlcnRpc2VyIGxpc3QgZW50cmllcyB0aGF0IGNhbiBiZQotICAgKiBzdG9yZWQgaW4gdGhlIENvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBjYiBzdGF0dXMgYW5kIGFkdmVydGlzZXIgbGlzdCBzaXplIGNhbGxiYWNrCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUGVyaW9kaWNBZHZlcnRpc2VyTGlzdEdldFNpemUobGlzdF9zaXplX2NiIGNiKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgc3luY2hyb25pemF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwZXJpb2RpYyBhZHZlcnRpc2luZyB0cmFpbgotICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzeW5jX2hhbmRsZSBwYXJhbWV0ZXIgdG8gYSBjb25uZWN0ZWQgZGV2aWNlLgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBjb25uZWN0ZWQgcGVlciBkZXZpY2UgYWRkcmVzcyB0byB3aG9tIHN5bmMgZGF0YSBpcwotICAgKiB0cmFuc2ZlcnJlZAotICAgKiBAcGFyYW0gc2VydmljZV9kYXRhIGEgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIEhvc3QKLSAgICogQHBhcmFtIHN5bmNfaGFuZGxlIHN5bmNlZCBhZHZld3J0aXNpbmcgaGFuZGxlCi0gICAqIEBwYXJhbSBjYiBzdGF0dXMgYW5kIGNvbm5lY3Rpb24gaGFuZGxlIGNhbGxiYWNrCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUGVyaW9kaWNBZHZTeW5jVHJhbnNmZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN5bmNfaGFuZGxlLCBoYW5kbGVfY2IgY2IpID0gMDsKLQotICAvKioKLSAgICogU2VuZCBzeW5jaHJvbml6YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBlcmlvZGljIGFkdmVydGlzaW5nIGluIGFuCi0gICAqIGFkdmVydGlzaW5nIHNldCB0byBhIGNvbm5lY3RlZCBkZXZpY2UuCi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIGNvbm5lY3RlZCBwZWVyIGRldmljZSBhZGRyZXNzIHRvIHdob20gc2V0IGluZm8gaXMKLSAgICogdHJhbnNmZXJyZWQKLSAgICogQHBhcmFtIHNlcnZpY2VfZGF0YSBhIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBIb3N0Ci0gICAqIEBwYXJhbSBzeW5jX2hhbmRsZSBzeW5jZWQgYWR2ZXJ0aXNpbmcgaGFuZGxlCi0gICAqIEBwYXJhbSBjYiBzdGF0dXMgYW5kIGNvbm5lY3Rpb24gaGFuZGxlIGNhbGxiYWNrCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUGVyaW9kaWNBZHZTZXRJbmZvVHJhbnNmZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3luY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfY2IgY2IpID0gMDsKLQotICAvKioKLSAgICogU3BlY2lmeSBob3cgdGhlIENvbnRyb2xsZXIgd2lsbCBwcm9jZXNzIHBlcmlvZGljIGFkdmVydGlzaW5nCi0gICAqIHN5bmNocm9uaXphdGlvbiBpbmZvcm1hdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UgaWRlbnRpZmllZCBieSB0aGUKLSAgICogYmRfYWRkcgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBjb25uZWN0ZWQgcGVlciBkZXZpY2UgYWRkcmVzcyB3aG8gdHJhbnNmZXJzIHRoZSBzeW5jIGRhdGEKLSAgICogQHBhcmFtIG1vZGUgMHgwMDogTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIHN5bmNocm9uaXplIHRvIHRoZSBwZXJpb2RpYwotICAgKiBhZHZlcnRpc2luZyBhbmQgbm8gSENJX0xFX1BlcmlvZGljX0FkdmVydGlzaW5nX1N5bmNfVHJhbnNmZXJfUmVjZWl2ZWQgZXZlbnQKLSAgICogaXMgc2VudCB0byB0aGUgSG9zdC4gMHgwMTogQW4KLSAgICogSENJX0xFX1BlcmlvZGljX0FkdmVydGlzaW5nX1N5bmNfVHJhbnNmZXJfUmVjZWl2ZWQgZXZlbnQgaXMgc2VudCB0byB0aGUKLSAgICogSG9zdC4gSENJX0xFX1BlcmlvZGljX0FkdmVydGlzaW5nX1JlcG9ydCBldmVudHMgd2lsbCBiZSBkaXNhYmxlZC4gMHgwMjogQW4KLSAgICogSENJX0xFX1BlcmlvZGljX0FkdmVydGlzaW5nX1N5bmNfVHJhbnNmZXJfUmVjZWl2ZWQgZXZlbnQgaXMgc2VudCB0byB0aGUKLSAgICogSG9zdC4gSENJX0xFX1BlcmlvZGljX0FkdmVydGlzaW5nX1JlcG9ydCBldmVudHMgd2lsbCBiZSBlbmFibGVkLiBBbGwgb3RoZXIKLSAgICogdmFsdWVzOiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSAgICogQHBhcmFtIHNraXAgVGhlIG51bWJlciBvZiBwZXJpb2RpYyBhZHZlcnRpc2luZyBwYWNrZXRzIHRoYXQgY2FuIGJlIHNraXBwZWQKLSAgICogYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlY2VpdmUsIFJhbmdlOiAweDAwMDAgdG8gMHgwMUYzCi0gICAqIEBwYXJhbSBzeW5jX3RpbWVvdXQgU3luY2hyb25pemF0aW9uIHRpbWVvdXQgZm9yIHRoZSBwZXJpb2RpYyBhZHZlcnRpc2luZwotICAgKiB0cmFpbi4gUmFuZ2U6IDB4MDAwQSB0byAweDQwMDAuIFRpbWUgPSBOKjEwIG1zLiBUaW1lIFJhbmdlOiAxMDAgbXMgdG8KLSAgICogMTYzLjg0IHMKLSAgICogQHBhcmFtIGN0ZV90eXBlIGJpdCAwOiBkbyBub3Qgc3luYyB0byBwYWNrZXRzIHdpdGggYW4gQW9BIENvbnN0YW50IFRvbmUKLSAgICogRXh0ZW5zaW9uLCBiaXQgMTogZG8gbm90IHN5bmMgdG8gcGFja2V0cyB3aXRoIGFuIEFvRCBDb25zdGFudCBUb25lCi0gICAqIEV4dGVuc2lvbiB3aXRoIDEgzrxzIHNsb3RzLCBiaXQgMjogZG8gbm90IHN5bmMgdG8gcGFja2V0cyB3aXRoIGFuIEFvRAotICAgKiBDb25zdGFudCBUb25lIEV4dGVuc2lvbiB3aXRoIDIgzrxzIHNsb3RzLCBiaXQgNDogZG8gbm90IHN5bmMgdG8gcGFja2V0cwotICAgKiB3aXRob3V0IGEgQ29uc3RhbnQgVG9uZSBFeHRlbnNpb24sIGFsbCBvdGhlciB2YWx1ZXM6IHJlc2VydmVkIGZvciBmdXR1cmUKLSAgICogdXNlLgotICAgKiBAcGFyYW0gc2V0X2RlZmF1bHRzIHdoZXRoZXIgdG8gc2VuZAotICAgKiBIQ0lfTEVfU0VUX0RFRkFVTFRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTSBvcgotICAgKiBIQ0lfTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU0uCi0gICAqIEBwYXJhbSBjYiBzdGF0dXMgY2FsbGJhY2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRQZXJpb2RpY0FkdlN5bmNUcmFuc2ZlclBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb2RlLCB1aW50MTZfdCBza2lwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3luY190aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0X2RlZmF1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NiIGNiKSA9IDA7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtPcHRVc2VBZHZlcnRpc2VyTGlzdCA9IDB4MDE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrT3B0UmVwb3J0c0luaXRpYWxseUVuYWJsZWQgPSAweDAyOwotfTsKLQotI2VuZGlmICAvLyBCTEVfU0NBTk5FUl9IQ0lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fYmxlLmNjIGIvc3RhY2svYnRtL2J0bV9ibGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDIyOGQuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9ibGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgQkxFIGRldmljZSBjb250cm9sIHV0aWxpdGllcywgYW5kIExFCi0gKiAgc2VjdXJpdHkgZnVuY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRtX2JsZSIKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbDJjX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9zZWN1cml0eV9kZXZpY2VfcmVjb3JkLmgiCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0dS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2FwX3NlY3VyaXR5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc21wX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi1leHRlcm4gYm9vbCBidG1fYmxlX2luaXRfcHNldWRvX2FkZHIodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIG5ld19wc2V1ZG9fYWRkcik7Ci1leHRlcm4gdm9pZCBnYXR0X25vdGlmeV9waHlfdXBkYXRlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXh0ZXJuYWwgRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IG90aGVyIG1vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZWNBZGRCbGVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNBZGRCbGVEZXZpY2UoYmRfYWRkciwgZGV2X3R5cGUsIGFkZHJfdHlwZSk7Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBkZXZfdHlwZT0weCV4IiwgX19mdW5jX18sIGRldl90eXBlKTsKLQotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgcF9kZXZfcmVjID0gYnRtX3NlY19hbGxvY2F0ZV9kZXZfcmVjKCk7Ci0KLSAgICBwX2Rldl9yZWMtPmJkX2FkZHIgPSBiZF9hZGRyOwotICAgIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSA9IEJUTV9HZXRIQ0lDb25uSGFuZGxlKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgIHBfZGV2X3JlYy0+YmxlX2hjaV9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgLyogdXBkYXRlIGNvbm4gcGFyYW1zLCB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgYmFja2dyb3VuZCBjb25uZWN0aW9uIHBhcmFtcyAqLwotICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMubWluX2Nvbm5faW50ID0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGOwotICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMubWF4X2Nvbm5faW50ID0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGOwotICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMuc3VwZXJ2aXNpb25fdG91dCA9IEJUTV9CTEVfQ09OTl9QQVJBTV9VTkRFRjsKLSAgICBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLnBlcmlwaGVyYWxfbGF0ZW5jeSA9IEJUTV9CTEVfQ09OTl9QQVJBTV9VTkRFRjsKLQotICAgIEJUTV9UUkFDRV9ERUJVRygiJXM6IERldmljZSBhZGRlZCwgaGFuZGxlPTB4JXgsIHBfZGV2X3JlYz0lcCwgYmRfYWRkcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2Rldl9yZWMtPmJsZV9oY2lfaGFuZGxlLCBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotCi0gIG1lbXNldChwX2Rldl9yZWMtPnNlY19iZF9uYW1lLCAwLCBzaXplb2YodEJUTV9CRF9OQU1FKSk7Ci0KLSAgcF9kZXZfcmVjLT5kZXZpY2VfdHlwZSB8PSBkZXZfdHlwZTsKLSAgcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZSA9IGFkZHJfdHlwZTsKLQotICBwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciA9IGJkX2FkZHI7Ci0gIC8qIHN5bmMgdXAgd2l0aCB0aGUgSW5xIERhdGEgYmFzZSovCi0gIHRCVE1fSU5RX0lORk8qIHBfaW5mbyA9IEJUTV9JbnFEYlJlYWQoYmRfYWRkcik7Ci0gIGlmIChwX2luZm8pIHsKLSAgICBwX2luZm8tPnJlc3VsdHMuYmxlX2FkZHJfdHlwZSA9IHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGU7Ci0gICAgcF9pbmZvLT5yZXN1bHRzLmRldmljZV90eXBlID0gcF9kZXZfcmVjLT5kZXZpY2VfdHlwZTsKLSAgICBCVE1fVFJBQ0VfREVCVUcoIklucURiICBkZXZpY2VfdHlwZSA9MHgleCAgYWRkcl90eXBlPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICBwX2luZm8tPnJlc3VsdHMuZGV2aWNlX3R5cGUsIHBfaW5mby0+cmVzdWx0cy5ibGVfYWRkcl90eXBlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0FkZEJsZUtleQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkL21vZGlmeSBMRSBkZXZpY2UgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgbm9ybWFsbHkgY2FsbGVkIGR1cmluZyBob3N0IHN0YXJ0dXAgdG8gcmVzdG9yZSBhbGwgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgICAgLSBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVfa2V5ICAgICAgICAgLSBMRSBrZXkgdmFsdWVzLgotICogICAgICAgICAgICAgICAgICBrZXlfdHlwZSAgICAgICAgIC0gTEUgU01QIGtleSB0eXBlLgotKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1NlY0FkZEJsZUtleShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRNX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNBZGRCbGVLZXkoYmRfYWRkciwgcF9sZV9rZXksIGtleV90eXBlKTsKLSAgfQotCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgQlRNX1RSQUNFX0RFQlVHKCJCVE1fU2VjQWRkQmxlS2V5Iik7Ci0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKCFwX2Rldl9yZWMgfHwgIXBfbGVfa2V5IHx8Ci0gICAgICAoa2V5X3R5cGUgIT0gQlRNX0xFX0tFWV9QRU5DICYmIGtleV90eXBlICE9IEJUTV9MRV9LRVlfUElEICYmCi0gICAgICAga2V5X3R5cGUgIT0gQlRNX0xFX0tFWV9QQ1NSSyAmJiBrZXlfdHlwZSAhPSBCVE1fTEVfS0VZX0xFTkMgJiYKLSAgICAgICBrZXlfdHlwZSAhPSBCVE1fTEVfS0VZX0xDU1JLICYmIGtleV90eXBlICE9IEJUTV9MRV9LRVlfTElEKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiIFdyb25nIFR5cGUsIG9yIE5vIERldmljZSByZWNvcmQgZm9yIGJkYWRkcjogIiA8PCBiZF9hZGRyCi0gICAgICAgICAgICAgICAgIDw8ICIsIFR5cGU6ICIgPDwga2V5X3R5cGU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIEJEQTogIiA8PCBiZF9hZGRyIDw8ICIsIFR5cGU6ICIgPDwga2V5X3R5cGU7Ci0KLSAgYnRtX3NlY19zYXZlX2xlX2tleShiZF9hZGRyLCBrZXlfdHlwZSwgcF9sZV9rZXksIGZhbHNlKTsKLQotICBpZiAoa2V5X3R5cGUgPT0gQlRNX0xFX0tFWV9QSUQgfHwga2V5X3R5cGUgPT0gQlRNX0xFX0tFWV9MSUQpIHsKLSAgICBidG1fYmxlX3Jlc29sdmluZ19saXN0X2xvYWRfZGV2KHBfZGV2X3JlYyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVMb2FkTG9jYWxLZXlzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb2NhbCBsb2NhbCBpZGVudGl0eSBrZXksIGVuY3J5cHRpb24gcm9vdCBvciBzaWduIGNvdW50ZXIuCi0gKgotICogUGFyYW1ldGVyczogICAgICBrZXlfdHlwZTogdHlwZSBvZiBrZXksIGNhbiBiZSBCVE1fQkxFX0tFWV9UWVBFX0lELAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX0tFWV9UWVBFX0VSCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEJUTV9CTEVfS0VZX1RZUEVfQ09VTlRFUi4KLSAqICAgICAgICAgICAgICAgICAgcF9rZXk6IHBvaW50ZXIgdG8gdGhlIGtleS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbjIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZUxvYWRMb2NhbEtleXModWludDhfdCBrZXlfdHlwZSwgdEJUTV9CTEVfTE9DQUxfS0VZUyogcF9rZXkpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlTG9hZExvY2FsS2V5cyhrZXlfdHlwZSwgcF9rZXkpOwotICB9Ci0KLSAgdEJUTV9ERVZDQiogcF9kZXZjYiA9ICZidG1fY2IuZGV2Y2I7Ci0gIEJUTV9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX2tleSAhPSBOVUxMKSB7Ci0gICAgc3dpdGNoIChrZXlfdHlwZSkgewotICAgICAgY2FzZSBCVE1fQkxFX0tFWV9UWVBFX0lEOgotICAgICAgICBtZW1jcHkoJnBfZGV2Y2ItPmlkX2tleXMsICZwX2tleS0+aWRfa2V5cywKLSAgICAgICAgICAgICAgIHNpemVvZih0QlRNX0JMRV9MT0NBTF9JRF9LRVlTKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUTV9CTEVfS0VZX1RZUEVfRVI6Ci0gICAgICAgIHBfZGV2Y2ItPmJsZV9lbmNyeXB0aW9uX2tleV92YWx1ZSA9IHBfa2V5LT5lcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEJUTV9UUkFDRV9FUlJPUigidW5rbm93IGxvY2FsIGtleSB0eXBlOiAlZCIsIGtleV90eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8qKiBSZXR1cm5zIGxvY2FsIGRldmljZSBlbmNyeXB0aW9uIHJvb3QgKEVSKSAqLwotY29uc3QgT2N0ZXQxNiYgQlRNX0dldERldmljZUVuY1Jvb3QoKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZUVuY1Jvb3QoKTsKLSAgfQotICByZXR1cm4gYnRtX2NiLmRldmNiLmJsZV9lbmNyeXB0aW9uX2tleV92YWx1ZTsKLX0KLQotLyoqIFJldHVybnMgbG9jYWwgZGV2aWNlIGlkZW50aXR5IHJvb3QgKElSKS4gKi8KLWNvbnN0IE9jdGV0MTYmIEJUTV9HZXREZXZpY2VJRFJvb3QoKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZUlEUm9vdCgpOwotICB9Ci0gIHJldHVybiBidG1fY2IuZGV2Y2IuaWRfa2V5cy5pcms7Ci19Ci0KLS8qKiBSZXR1cm4gbG9jYWwgZGV2aWNlIERISy4gKi8KLWNvbnN0IE9jdGV0MTYmIEJUTV9HZXREZXZpY2VESEsoKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZURISygpOwotICB9Ci0gIHJldHVybiBidG1fY2IuZGV2Y2IuaWRfa2V5cy5kaGs7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWN1cml0eUdyYW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBncmFudCBzZWN1cml0eSBwcm9jZXNzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAtIHBlZXIgZGV2aWNlIGJkIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIHJlcyAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBCVE1fUkVQRUFURURfQVRURU1QVFMgaWYgdG9vIG1hbnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY3VyaXR5R3JhbnQoYmRfYWRkciwgcmVzKTsKLSAgfQotICB0U01QX1NUQVRVUyByZXNfc21wID0KLSAgICAgIChyZXMgPT0gQlRNX1NVQ0NFU1MpID8gU01QX1NVQ0NFU1MgOiBTTVBfUkVQRUFURURfQVRURU1QVFM7Ci0gIEJUTV9UUkFDRV9ERUJVRygiQlRNX1NlY3VyaXR5R3JhbnQiKTsKLSAgU01QX1NlY3VyaXR5R3JhbnQoYmRfYWRkciwgcmVzX3NtcCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlUGFzc2tleVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBTZWN1cml0eSBNYW5hZ2VyIHN1Ym1pdHRlZAotICogICAgICAgICAgICAgICAgICBwYXNza2V5IHJlcXVlc3QgdG8gdGhlIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3Igd2hpY2ggcGFzc2tleSB3YXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZAotICogICAgICAgICAgICAgICAgICByZXMgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYgc3VjY2VzcwotICogICAgICAgICAgICAgICAgICBrZXlfbGVuIC0gbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBQYXNza2V5Ci0gKiAgICAgICAgICAgICAgICAgIHBfcGFzc2tleSAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCB0aGUgcGFzc2tleQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVQYXNza2V5UmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc2tleSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIEFTU0VSVF9MT0coZmFsc2UsICJUaGlzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmcm9tIGNvZGUgcGF0aCIpOwotICB9Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgdFNNUF9TVEFUVVMgcmVzX3NtcCA9Ci0gICAgICAocmVzID09IEJUTV9TVUNDRVNTKSA/IFNNUF9TVUNDRVNTIDogU01QX1BBU1NLRVlfRU5UUllfRkFJTDsKLQotICBpZiAocF9kZXZfcmVjID09IE5VTEwpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIlBhc3NrZXkgcmVwbHkgdG8gVW5rbm93biBkZXZpY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2Rldl9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDX0xFX0FVVEhFTlRJQ0FURUQ7Ci0gIEJUTV9UUkFDRV9ERUJVRygiQlRNX0JsZVBhc3NrZXlSZXBseSIpOwotICBTTVBfUGFzc2tleVJlcGx5KGJkX2FkZHIsIHJlc19zbXAsIHBhc3NrZXkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUNvbmZpcm1SZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgU2VjdXJpdHkgTWFuYWdlciBzdWJtaXR0ZWQKLSAqICAgICAgICAgICAgICAgICAgbnVtZXJpYyBjb21wYXJpc29uIHJlcXVlc3QgdG8gdGhlIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgIC0gQWRkcmVzcyBvZiB0aGUgZGV2aWNlIHdpdGggd2hpY2ggbnVtZXJpYwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uIHdhcyByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgIC0gY29tcGFyaXNvbiByZXN1bHQgQlRNX1NVQ0NFU1MgaWYgc3VjY2VzcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVDb25maXJtUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICBBU1NFUlRfTE9HKGZhbHNlLCAiVGhpcyBzaG91bGQgbm90IGJlIGludm9rZWQgZnJvbSBjb2RlIHBhdGgiKTsKLSAgfQotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIHRTTVBfU1RBVFVTIHJlc19zbXAgPQotICAgICAgKHJlcyA9PSBCVE1fU1VDQ0VTUykgPyBTTVBfU1VDQ0VTUyA6IFNNUF9QQVNTS0VZX0VOVFJZX0ZBSUw7Ci0KLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJQYXNza2V5IHJlcGx5IHRvIFVua25vd24gZGV2aWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0gQlRNX1NFQ19MRV9BVVRIRU5USUNBVEVEOwotICBCVE1fVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBTTVBfQ29uZmlybVJlcGx5KGJkX2FkZHIsIHJlc19zbXApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZU9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBCVE1fTEVfT09CX1JFUV9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAgICAgIC0gb29iIGRhdGEsIGRlcGVuZGluZyBvbiB0cmFuc3BvcnQgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pZ2h0IGJlICJTaW1wbGUgUGFpcmluZyBSYW5kb21pemVyIiwgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VjdXJpdHkgTWFuYWdlciBUSyBWYWx1ZSIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZU9vYkRhdGFSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcywgdWludDhfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZU9vYkRhdGFSZXBseShiZF9hZGRyLCByZXMsIGxlbiwgcF9kYXRhKTsKLSAgfQotICB0U01QX1NUQVRVUyByZXNfc21wID0gKHJlcyA9PSBCVE1fU1VDQ0VTUykgPyBTTVBfU1VDQ0VTUyA6IFNNUF9PT0JfRkFJTDsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXM6IiwgX19mdW5jX18pOwotCi0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IFVua25vd24gZGV2aWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRDsKLSAgU01QX09vYkRhdGFSZXBseShiZF9hZGRyLCByZXNfc21wLCBsZW4sIHBfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBCVE1fTEVfT09CX1JFUV9FVlQgd2hlbiBzZWN1cmUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBkYXRhIGlzIGF2YWlsYWJsZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBwX2MgICAgICAgICAtIHBvaW50ZXIgdG8gQ29uZmlybWF0aW9uLgotICogICAgICAgICAgICAgICAgICBwX3IgICAgICAgICAtIHBvaW50ZXIgdG8gUmFuZG9taXplcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVTZWN1cmVDb25uZWN0aW9uT29iRGF0YVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYywgdWludDhfdCogcF9yKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNlY3VyZUNvbm5lY3Rpb25Pb2JEYXRhUmVwbHkoYmRfYWRkciwgcF9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcik7Ci0gIH0KLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXM6IiwgX19mdW5jX18pOwotCi0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IFVua25vd24gZGV2aWNlIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRDsKLQotICB0U01QX1NDX09PQl9EQVRBIG9vYjsKLSAgbWVtc2V0KCZvb2IsIDAsIHNpemVvZih0U01QX1NDX09PQl9EQVRBKSk7Ci0KLSAgb29iLnBlZXJfb29iX2RhdGEucHJlc2VudCA9IHRydWU7Ci0gIG1lbWNweSgmb29iLnBlZXJfb29iX2RhdGEucmFuZG9taXplciwgcF9yLCBPQ1RFVDE2X0xFTik7Ci0gIG1lbWNweSgmb29iLnBlZXJfb29iX2RhdGEuY29tbWl0bWVudCwgcF9jLCBPQ1RFVDE2X0xFTik7Ci0gIG9vYi5wZWVyX29vYl9kYXRhLmFkZHJfcmN2ZF9mcm9tLnR5cGUgPSBwX2Rldl9yZWMtPmJsZS5ibGVfYWRkcl90eXBlOwotICBvb2IucGVlcl9vb2JfZGF0YS5hZGRyX3JjdmRfZnJvbS5iZGEgPSBiZF9hZGRyOwotCi0gIFNNUF9TZWN1cmVDb25uZWN0aW9uT29iRGF0YVJlcGx5KCh1aW50OF90Kikmb29iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2V0UHJlZkNvbm5QYXJhbXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCBhIHBlcmlwaGVyYWwncyBwcmVmZXJyZWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgICAgIC0gQkQgYWRkcmVzcyBvZiB0aGUgcGVyaXBoZXJhbAotICogICAgICAgICAgICAgICAgICBzY2FuX2ludGVydmFsOiBzY2FuIGludGVydmFsCi0gKiAgICAgICAgICAgICAgICAgIHNjYW5fd2luZG93OiBzY2FuIHdpbmRvdwotICogICAgICAgICAgICAgICAgICBtaW5fY29ubl9pbnQgICAgIC0gbWluaW11bSBwcmVmZXJyZWQgY29ubmVjdGlvbiBpbnRlcnZhbAotICogICAgICAgICAgICAgICAgICBtYXhfY29ubl9pbnQgICAgIC0gbWF4aW11bSBwcmVmZXJyZWQgY29ubmVjdGlvbiBpbnRlcnZhbAotICogICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsX2xhdGVuY3kgICAgLSBwcmVmZXJyZWQgcGVyaXBoZXJhbCBsYXRlbmN5Ci0gKiAgICAgICAgICAgICAgICAgIHN1cGVydmlzaW9uX3RvdXQgLSBwcmVmZXJyZWQgc3VwZXJ2aXNpb24gdGltZW91dAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVTZXRQcmVmQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5fY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0KSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNldFByZWZDb25uUGFyYW1zKAotICAgICAgICBiZF9hZGRyLCBtaW5fY29ubl9pbnQsIG1heF9jb25uX2ludCwgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICBzdXBlcnZpc2lvbl90b3V0KTsKLSAgfQotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0KLSAgQlRNX1RSQUNFX0FQSSgKLSAgICAgICJCVE1fQmxlU2V0UHJlZkNvbm5QYXJhbXMgbWluOiAldSAgbWF4OiAldSAgbGF0ZW5jeTogJXUgIFwKLSAgICAgICAgICAgICAgICAgICAgdG91dDogJXUiLAotICAgICAgbWluX2Nvbm5faW50LCBtYXhfY29ubl9pbnQsIHBlcmlwaGVyYWxfbGF0ZW5jeSwgc3VwZXJ2aXNpb25fdG91dCk7Ci0KLSAgaWYgKEJUTV9CTEVfSVNWQUxJRF9QQVJBTShtaW5fY29ubl9pbnQsIEJUTV9CTEVfQ09OTl9JTlRfTUlOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfQ09OTl9JTlRfTUFYKSAmJgotICAgICAgQlRNX0JMRV9JU1ZBTElEX1BBUkFNKG1heF9jb25uX2ludCwgQlRNX0JMRV9DT05OX0lOVF9NSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9DT05OX0lOVF9NQVgpICYmCi0gICAgICBCVE1fQkxFX0lTVkFMSURfUEFSQU0oc3VwZXJ2aXNpb25fdG91dCwgQlRNX0JMRV9DT05OX1NVUF9UT1VUX01JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX0NPTk5fU1VQX1RPVVRfTUFYKSAmJgotICAgICAgKHBlcmlwaGVyYWxfbGF0ZW5jeSA8PSBCVE1fQkxFX0NPTk5fTEFURU5DWV9NQVggfHwKLSAgICAgICBwZXJpcGhlcmFsX2xhdGVuY3kgPT0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGKSkgewotICAgIGlmIChwX2Rldl9yZWMpIHsKLSAgICAgIC8qIGV4cGVjdCBjb25uIGludCBhbmQgc3RvdXQgYW5kIHBlcmlwaGVyYWwgbGF0ZW5jeSB0byBiZSB1cGRhdGVkIGFsbAotICAgICAgICogdG9nZXRoZXIKLSAgICAgICAqLwotICAgICAgaWYgKG1pbl9jb25uX2ludCAhPSBCVE1fQkxFX0NPTk5fUEFSQU1fVU5ERUYgfHwKLSAgICAgICAgICBtYXhfY29ubl9pbnQgIT0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGKSB7Ci0gICAgICAgIGlmIChtaW5fY29ubl9pbnQgIT0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGKQotICAgICAgICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMubWluX2Nvbm5faW50ID0gbWluX2Nvbm5faW50OwotICAgICAgICBlbHNlCi0gICAgICAgICAgcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5taW5fY29ubl9pbnQgPSBtYXhfY29ubl9pbnQ7Ci0KLSAgICAgICAgaWYgKG1heF9jb25uX2ludCAhPSBCVE1fQkxFX0NPTk5fUEFSQU1fVU5ERUYpCi0gICAgICAgICAgcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5tYXhfY29ubl9pbnQgPSBtYXhfY29ubl9pbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLm1heF9jb25uX2ludCA9IG1pbl9jb25uX2ludDsKLQotICAgICAgICBpZiAocGVyaXBoZXJhbF9sYXRlbmN5ICE9IEJUTV9CTEVfQ09OTl9QQVJBTV9VTkRFRikKLSAgICAgICAgICBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLnBlcmlwaGVyYWxfbGF0ZW5jeSA9IHBlcmlwaGVyYWxfbGF0ZW5jeTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMucGVyaXBoZXJhbF9sYXRlbmN5ID0KLSAgICAgICAgICAgICAgQlRNX0JMRV9DT05OX1BFUklQSEVSQUxfTEFURU5DWV9ERUY7Ci0KLSAgICAgICAgaWYgKHN1cGVydmlzaW9uX3RvdXQgIT0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGKQotICAgICAgICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMuc3VwZXJ2aXNpb25fdG91dCA9IHN1cGVydmlzaW9uX3RvdXQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLnN1cGVydmlzaW9uX3RvdXQgPSBCVE1fQkxFX0NPTk5fVElNRU9VVF9ERUY7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgQlRNX1RSQUNFX0VSUk9SKCJVbmtub3duIERldmljZSwgc2V0dGluZyByZWplY3RlZCIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIklsbGVnYWwgQ29ubmVjdGlvbiBQYXJhbWV0ZXJzIik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkRGV2SW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgZGV2aWNlL2FkZHJlc3MgdHlwZQotICogICAgICAgICAgICAgICAgICBvZiBCRCBhZGRyZXNzLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcmVtb3RlX2JkYTogcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfZGV2X3R5cGU6IG91dHB1dCBwYXJhbWV0ZXIgdG8gcmVhZCB0aGUgZGV2aWNlIHR5cGUuCi0gKiAgICAgICAgICAgICAgICAgIHBfYWRkcl90eXBlOiBvdXRwdXQgcGFyYW1ldGVyIHRvIHJlYWQgdGhlIGFkZHJlc3MgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVhZERldkluZm8oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX0RFVklDRV9UWVBFKiBwX2Rldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihyZW1vdGVfYmRhKTsKLSAgdEJUTV9JTlFfSU5GTyogcF9pbnFfaW5mbyA9IEJUTV9JbnFEYlJlYWQocmVtb3RlX2JkYSk7Ci0KLSAgKnBfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotCi0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgKnBfZGV2X3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgICAvKiBDaGVjayB3aXRoIHRoZSBCVCBtYW5hZ2VyIGlmIGRldGFpbHMgYWJvdXQgcmVtb3RlIGRldmljZSBhcmUga25vd24gKi8KLSAgICBpZiAocF9pbnFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgICAqcF9kZXZfdHlwZSA9IHBfaW5xX2luZm8tPnJlc3VsdHMuZGV2aWNlX3R5cGU7Ci0gICAgICAqcF9hZGRyX3R5cGUgPSBwX2lucV9pbmZvLT5yZXN1bHRzLmJsZV9hZGRyX3R5cGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHVua25vd24gZGV2aWNlLCBhc3N1bWUgQlIvRURSICovCi0gICAgICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9maW5kX2Rldl90eXBlIC0gdW5rbm93biBkZXZpY2UsIEJSL0VEUiBhc3N1bWVkIik7Ci0gICAgfQotICB9IGVsc2UgLyogdGhlcmUgaXMgYSBzZWN1cml0eSBkZXZpY2UgcmVjb3JkIGV4aXNpdG5nICovCi0gIHsKLSAgICAvKiBuZXcgaW5xdWlyeSByZXN1bHQsIG92ZXJ3cml0ZSBkZXZpY2UgdHlwZSBpbiBzZWN1cml0eSBkZXZpY2UgcmVjb3JkICovCi0gICAgaWYgKHBfaW5xX2luZm8pIHsKLSAgICAgIHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGUgPSBwX2lucV9pbmZvLT5yZXN1bHRzLmRldmljZV90eXBlOwotICAgICAgcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZSA9IHBfaW5xX2luZm8tPnJlc3VsdHMuYmxlX2FkZHJfdHlwZTsKLSAgICB9Ci0KLSAgICBpZiAocF9kZXZfcmVjLT5iZF9hZGRyID09IHJlbW90ZV9iZGEgJiYKLSAgICAgICAgcF9kZXZfcmVjLT5ibGUucHNldWRvX2FkZHIgPT0gcmVtb3RlX2JkYSkgewotICAgICAgKnBfZGV2X3R5cGUgPSBwX2Rldl9yZWMtPmRldmljZV90eXBlOwotICAgICAgKnBfYWRkcl90eXBlID0gcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZTsKLSAgICB9IGVsc2UgaWYgKHBfZGV2X3JlYy0+YmxlLnBzZXVkb19hZGRyID09IHJlbW90ZV9iZGEpIHsKLSAgICAgICpwX2Rldl90eXBlID0gQlRfREVWSUNFX1RZUEVfQkxFOwotICAgICAgKnBfYWRkcl90eXBlID0gcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZTsKLSAgICB9IGVsc2UgLyogbWF0Y2hpbmcgc3RhdGljIGFkZGRyZXNzIG9ubHkgKi8gewotICAgICAgaWYgKHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGUgIT0gQlRfREVWSUNFX1RZUEVfVU5LTk9XTikgewotICAgICAgICAqcF9kZXZfdHlwZSA9IHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dfV0FSTigiZGV2aWNlX3R5cGUgbm90IHNldDsgYXNzdW1pbmcgQlIvRURSIik7Ci0gICAgICAgICpwX2Rldl90eXBlID0gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci0gICAgICB9Ci0gICAgICAqcF9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gICAgfQotICB9Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fZmluZF9kZXZfdHlwZSAtIGRldmljZV90eXBlID0gJWQgYWRkcl90eXBlID0gJWQiLAotICAgICAgICAgICAgICAgICAgKnBfZGV2X3R5cGUsICpwX2FkZHJfdHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZENvbm5lY3RlZFRyYW5zcG9ydEFkZHJlc3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIHBhaXJlZCBkZXZpY2UvYWRkcmVzcwotICogICAgICAgICAgICAgICAgICB0eXBlIG9mIG90aGVyIGRldmljZSBwYWlyZWQgY29ycmVzcG9uZGluZyB0byB0aGUgQkRfYWRkcmVzcwotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcmVtb3RlX2JkYTogcmVtb3RlIGRldmljZSBhZGRyZXNzLCBjYXJyeSBvdXQgdGhlIHRyYW5zcG9ydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydDogYWN0aXZlIHRyYW5zcG9ydAotICoKLSAqIFJldHVybiAgICAgICAgICAgdHJ1ZSBpZiBhbiBhY3RpdmUgbGluayBpcyBpZGVudGlmaWVkOyBmYWxzZSBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fUmVhZENvbm5lY3RlZFRyYW5zcG9ydEFkZHJlc3MoUmF3QWRkcmVzcyogcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzKHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Ci0gIH0KLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KCpyZW1vdGVfYmRhKTsKLQotICAvKiBpZiBubyBkZXZpY2UgY2FuIGJlIGxvY2F0ZWQsIHJldHVybiAqLwotICBpZiAocF9kZXZfcmVjID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICBpZiAoQlRNX0lzQWNsQ29ubmVjdGlvblVwKHBfZGV2X3JlYy0+YmRfYWRkciwgdHJhbnNwb3J0KSkgewotICAgICAgKnJlbW90ZV9iZGEgPSBwX2Rldl9yZWMtPmJkX2FkZHI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CUkVEUikgewotICAgICAgKnJlbW90ZV9iZGEgPSBwX2Rldl9yZWMtPmJkX2FkZHI7Ci0gICAgfSBlbHNlCi0gICAgICAqcmVtb3RlX2JkYSA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICpyZW1vdGVfYmRhID0gcF9kZXZfcmVjLT5ibGUucHNldWRvX2FkZHI7Ci0gICAgaWYgKEJUTV9Jc0FjbENvbm5lY3Rpb25VcChwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciwgdHJhbnNwb3J0KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVSZWNlaXZlclRlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IHRoZSBMRSBSZWNlaXZlciB0ZXN0Ci0gKgotICogUGFyYW1ldGVyICAgICAgIHJ4X2ZyZXEgLSBGcmVxdWVuY3kgUmFuZ2UKLSAqICAgICAgICAgICAgICAgcF9jbWRfY21wbF9jYmFjayAtIENvbW1hbmQgQ29tcGxldGUgY2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlUmVjZWl2ZXJUZXN0KHVpbnQ4X3QgcnhfZnJlcSwgdEJUTV9DTVBMX0NCKiBwX2NtZF9jbXBsX2NiYWNrKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVJlY2VpdmVyVGVzdChyeF9mcmVxLCBwX2NtZF9jbXBsX2NiYWNrKTsKLSAgfQotICBidG1fY2IuZGV2Y2IucF9sZV90ZXN0X2NtZF9jbXBsX2NiID0gcF9jbWRfY21wbF9jYmFjazsKLQotICBidHNuZF9oY2ljX2JsZV9yZWNlaXZlcl90ZXN0KHJ4X2ZyZXEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVRyYW5zbWl0dGVyVGVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgdGhlIExFIFRyYW5zbWl0dGVyIHRlc3QKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgdHhfZnJlcSAtIEZyZXF1ZW5jeSBSYW5nZQotICogICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZGF0YV9sZW4gLSBMZW5ndGggaW4gYnl0ZXMgb2YgcGF5bG9hZCBkYXRhIGluIGVhY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X3BheWxvYWQgLSBQYXR0ZXJuIHRvIHVzZSBpbiB0aGUgcGF5bG9hZAotICogICAgICAgICAgICAgICAgICAgICAgIHBfY21kX2NtcGxfY2JhY2sgLSBDb21tYW5kIENvbXBsZXRlIGNhbGxiYWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVRyYW5zbWl0dGVyVGVzdCh1aW50OF90IHR4X2ZyZXEsIHVpbnQ4X3QgdGVzdF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhY2tldF9wYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVUcmFuc21pdHRlclRlc3QoCi0gICAgICAgIHR4X2ZyZXEsIHRlc3RfZGF0YV9sZW4sIHBhY2tldF9wYXlsb2FkLCBwX2NtZF9jbXBsX2NiYWNrKTsKLSAgfQotICBidG1fY2IuZGV2Y2IucF9sZV90ZXN0X2NtZF9jbXBsX2NiID0gcF9jbWRfY21wbF9jYmFjazsKLSAgYnRzbmRfaGNpY19ibGVfdHJhbnNtaXR0ZXJfdGVzdCh0eF9mcmVxLCB0ZXN0X2RhdGFfbGVuLCBwYWNrZXRfcGF5bG9hZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlVGVzdEVuZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgaW4tcHJvZ3Jlc3MgVFggb3IgUlgKLSAqICAgICAgICAgICAgICAgICAgdGVzdAotICoKLSAqIFBhcmFtZXRlciAgICAgICBwX2NtZF9jbXBsX2NiYWNrIC0gQ29tbWFuZCBjb21wbGV0ZSBjYWxsYmFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9CbGVUZXN0RW5kKHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVUZXN0RW5kKHBfY21kX2NtcGxfY2JhY2spOwotICB9Ci0gIGJ0bV9jYi5kZXZjYi5wX2xlX3Rlc3RfY21kX2NtcGxfY2IgPSBwX2NtZF9jbXBsX2NiYWNrOwotCi0gIGJ0c25kX2hjaWNfYmxlX3Rlc3RfZW5kKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbnRlcm5hbCBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfdGVzdF9jb21tYW5kX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfbGVfdGVzdF9jbWRfY21wbF9jYjsKLQotICBidG1fY2IuZGV2Y2IucF9sZV90ZXN0X2NtZF9jbXBsX2NiID0gTlVMTDsKLQotICBpZiAocF9jYikgewotICAgICgqcF9jYikocCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Vc2VMZUxpbmsKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gc2VsZWN0IHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGxpbmsgdG8KLSAqICAgICAgICAgICAgICAgICAgdXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSB0byB1c2UgTEUsIGZhbHNlIHVzZSBCUi9FRFIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1VzZUxlTGluayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX1VzZUxlTGluayhiZF9hZGRyKTsKLSAgfQotCi0gIGlmIChCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAoQlRNX0lzQWNsQ29ubmVjdGlvblVwKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHRCVF9ERVZJQ0VfVFlQRSBkZXZfdHlwZTsKLSAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlOwotICBCVE1fUmVhZERldkluZm8oYmRfYWRkciwgJmRldl90eXBlLCAmYWRkcl90eXBlKTsKLSAgcmV0dXJuIChkZXZfdHlwZSA9PSBCVF9ERVZJQ0VfVFlQRV9CTEUpOwotfQotCi10QlRNX1NUQVRVUyBCVE1fU2V0QmxlRGF0YUxlbmd0aChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHhfcGR1X2xlbmd0aCkgewotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcGFja2V0X2V4dGVuc2lvbigpKSB7Ci0gICAgTE9HX0lORk8oIkxvY2FsIGNvbnRyb2xsZXIgdW5hYmxlIHRvIHN1cHBvcnQgbGUgcGFja2V0IGV4dGVuc2lvbiIpOwotICAgIHJldHVybiBCVE1fSUxMRUdBTF9WQUxVRTsKLSAgfQotCi0gIGlmICh0eF9wZHVfbGVuZ3RoID4gQlRNX0JMRV9EQVRBX1NJWkVfTUFYKQotICAgIHR4X3BkdV9sZW5ndGggPSBCVE1fQkxFX0RBVEFfU0laRV9NQVg7Ci0gIGVsc2UgaWYgKHR4X3BkdV9sZW5ndGggPCBCVE1fQkxFX0RBVEFfU0laRV9NSU4pCi0gICAgdHhfcGR1X2xlbmd0aCA9IEJUTV9CTEVfREFUQV9TSVpFX01JTjsKLQotICB1aW50MTZfdCB0eF90aW1lID0gQlRNX0JMRV9EQVRBX1RYX1RJTUVfTUFYX0xFR0FDWTsKLQotICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9idF92ZXJzaW9uKCktPmhjaV92ZXJzaW9uID49Ci0gICAgICBIQ0lfUFJPVE9fVkVSU0lPTl81XzApCi0gICAgdHhfdGltZSA9IEJUTV9CTEVfREFUQV9UWF9USU1FX01BWDsKLQotICBpZiAoIUJUTV9Jc0FjbENvbm5lY3Rpb25VcChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJVbmFibGUgdG8gc2V0IGRhdGEgbGVuZ3RoIGJlY2F1c2Ugbm8gbGUgYWNsIGxpbmsgY29ubmVjdGVkIHRvIGRldmljZSIpOwotICAgIHJldHVybiBCVE1fV1JPTkdfTU9ERTsKLSAgfQotCi0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHVpbnQxNl90IGhhbmRsZSA9IGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRMZUhhbmRsZShiZF9hZGRyKTsKLSAgICBidHNuZF9oY2ljX2JsZV9zZXRfZGF0YV9sZW5ndGgoaGFuZGxlLCB0eF9wZHVfbGVuZ3RoLCB0eF90aW1lKTsKLSAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gIH0KLQotICB1aW50MTZfdCBoY2lfaGFuZGxlID0gQlRNX0dldEhDSUNvbm5IYW5kbGUoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLQotICBpZiAoIWFjbF9wZWVyX3N1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uKGhjaV9oYW5kbGUpKSB7Ci0gICAgTE9HX0lORk8oIlJlbW90ZSBkZXZpY2UgdW5hYmxlIHRvIHN1cHBvcnQgbGUgcGFja2V0IGV4dGVuc2lvbiIpOwotICAgIHJldHVybiBCVE1fSUxMRUdBTF9WQUxVRTsKLSAgfQotCi0gIHR4X3BkdV9sZW5ndGggPSBzdGQ6Om1pbjx1aW50MTZfdD4oCi0gICAgICB0eF9wZHVfbGVuZ3RoLAotICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfbWF4aW11bV90eF9kYXRhX2xlbmd0aCgpKTsKLSAgdHhfdGltZSA9IHN0ZDo6bWluPHVpbnQxNl90PigKLSAgICAgIHR4X3RpbWUsIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX21heGltdW1fdHhfdGltZSgpKTsKLQotICBidHNuZF9oY2ljX2JsZV9zZXRfZGF0YV9sZW5ndGgoaGNpX2hhbmRsZSwgdHhfcGR1X2xlbmd0aCwgdHhfdGltZSk7Ci0KLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi12b2lkIHJlYWRfcGh5X2NiKAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+IGNiLAotICAgIHVpbnQ4X3QqIGRhdGEsIHVpbnQxNl90IGxlbikgewotICB1aW50OF90IHN0YXR1cywgdHhfcGh5LCByeF9waHk7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLQotICBMT0dfQVNTRVJUKGxlbiA9PSA1KSA8PCAiUmVjZWl2ZWQgYmFkIHJlc3BvbnNlIGxlbmd0aDogIiA8PCBsZW47Ci0gIHVpbnQ4X3QqIHBwID0gZGF0YTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcHApOwotICBoYW5kbGUgPSBoYW5kbGUgJiAweDBGRkY7Ci0gIFNUUkVBTV9UT19VSU5UOCh0eF9waHksIHBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJ4X3BoeSwgcHApOwotCi0gIERWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgUmVjZWl2ZWQgcmVhZF9waHlfY2IiOwotICBjYi5SdW4odHhfcGh5LCByeF9waHksIHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlUmVhZFBoeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVG8gcmVhZCB0aGUgY3VycmVudCBQSFlzIGZvciBzcGVjaWZpZWQgTEUgY29ubmVjdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gY29udHJvbGxlciwKLSAqICAgICAgICAgICAgICAgICAgQlRNX01PREVfVU5TVVBQT1JURUQgaWYgbG9jYWwgY29udHJvbGxlciBkb2Vzbid0IHN1cHBvcnQgTEUKLSAqICAgICAgICAgICAgICAgICAgMk0gb3IgTEUgQ29kZWQgUEhZLAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiBEZXZpY2UgaW4gd3JvbmcgbW9kZSBmb3IgcmVxdWVzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlUmVhZFBoeSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+IGNiKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVJlYWRQaHkoYmRfYWRkciwgY2IpOwotICB9Ci0gIEJUTV9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKCFCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IFdyb25nIG1vZGU6IG5vIExFIGxpbmsgZXhpc3Qgb3IgTEUgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBjYi5SdW4oMCwgMCwgSENJX0VSUl9OT19DT05ORUNUSU9OKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjaGVja2luZyBpZiBsb2NhbCBjb250cm9sbGVyIHN1cHBvcnRzIGl0IQotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfMm1fcGh5KCkgJiYKLSAgICAgICFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX2NvZGVkX3BoeSgpKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlcyBmYWlsZWQsIHJlcXVlc3Qgbm90IHN1cHBvcnRlZCBpbiBsb2NhbCBjb250cm9sbGVyISIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBjYi5SdW4oMCwgMCwgR0FUVF9SRVFfTk9UX1NVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgaGFuZGxlID0gQlRNX0dldEhDSUNvbm5IYW5kbGUoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLQotICBjb25zdCB1aW50OF90IGxlbiA9IEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9QSFk7Ci0gIHVpbnQ4X3QgZGF0YVtsZW5dOwotICB1aW50OF90KiBwcCA9IGRhdGE7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfQkxFX1JFQURfUEhZLCBkYXRhLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmcmVhZF9waHlfY2IsIHN0ZDo6bW92ZShjYikpKTsKLSAgcmV0dXJuOwotfQotCi12b2lkIGRvTm90aGluZyh1aW50OF90KiBkYXRhLCB1aW50MTZfdCBsZW4pIHt9Ci0KLXZvaWQgQlRNX0JsZVNldFBoeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHR4X3BoeXMsIHVpbnQ4X3QgcnhfcGh5cywKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfb3B0aW9ucykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVTZXRQaHkoYmRfYWRkciwgdHhfcGh5cywgcnhfcGh5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9vcHRpb25zKTsKLSAgfQotICBpZiAoIUJUTV9Jc0FjbENvbm5lY3Rpb25VcChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJVbmFibGUgdG8gc2V0IHBoeSBwcmVmZXJlbmNlcyBiZWNhdXNlIG5vIGxlIGFjbCBpcyBjb25uZWN0ZWQgdG8gIgotICAgICAgICAiZGV2aWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBhbGxfcGh5cyA9IDA7Ci0gIGlmICh0eF9waHlzID09IDApIGFsbF9waHlzICY9IDB4MDE7Ci0gIGlmIChyeF9waHlzID09IDApIGFsbF9waHlzICY9IDB4MDI7Ci0KLSAgdWludDE2X3QgaGFuZGxlID0gQlRNX0dldEhDSUNvbm5IYW5kbGUoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLQotICAvLyBjaGVja2luZyBpZiBsb2NhbCBjb250cm9sbGVyIHN1cHBvcnRzIGl0IQotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfMm1fcGh5KCkgJiYKLSAgICAgICFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX2NvZGVkX3BoeSgpKSB7Ci0gICAgTE9HX0lORk8oIkxvY2FsIGNvbnRyb2xsZXIgdW5hYmxlIHRvIHN1cHBvcnQgc2V0dGluZyBvZiBsZSBwaHkgcGFyYW1ldGVycyIpOwotICAgIGdhdHRfbm90aWZ5X3BoeV91cGRhdGVkKEdBVFRfUkVRX05PVF9TVVBQT1JURUQsIGhhbmRsZSwgdHhfcGh5cywgcnhfcGh5cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFhY2xfcGVlcl9zdXBwb3J0c19ibGVfMm1fcGh5KGhhbmRsZSkgJiYKLSAgICAgICFhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29kZWRfcGh5KGhhbmRsZSkpIHsKLSAgICBMT0dfSU5GTygiUmVtb3RlIGRldmljZSB1bmFibGUgdG8gc3VwcG9ydCBzZXR0aW5nIG9mIGxlIHBoeSBwYXJhbWV0ZXIiKTsKLSAgICBnYXR0X25vdGlmeV9waHlfdXBkYXRlZChHQVRUX1JFUV9OT1RfU1VQUE9SVEVELCBoYW5kbGUsIHR4X3BoeXMsIHJ4X3BoeXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QgbGVuID0gSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUEhZOwotICB1aW50OF90IGRhdGFbbGVuXTsKLSAgdWludDhfdCogcHAgPSBkYXRhOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFsbF9waHlzKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCB0eF9waHlzKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByeF9waHlzKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGh5X29wdGlvbnMpOwotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9TRVRfUEhZLCBkYXRhLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZChkb05vdGhpbmcpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfZGV0ZXJtaW5lX3NlY3VyaXR5X2FjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHNlY3VyaXR5IG9mIGN1cnJlbnQgTEUgbGluawotICogICAgICAgICAgICAgICAgICBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgdGFrZW4gdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgc2VjdXJpdHkuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBpc19vcmlnaW5hdG9yIC0gVHJ1ZSBpZiBvdXRnb2luZyBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGJkYWRkcjogcmVtb3RlIGRldmljZSBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X3JlcXVpcmVkOiBTZWN1cml0eSByZXF1aXJlZCBmb3IgdGhlIHNlcnZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBUaGUgYXBwcm9wcmlhdGUgc2VjdXJpdHkgYWN0aW9uIHJlcXVpcmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19BQ1RJT04gYnRtX2JsZV9kZXRlcm1pbmVfc2VjdXJpdHlfYWN0KGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlZCkgewotICB0QlRNX0xFX0FVVEhfUkVRIGF1dGhfcmVxID0gMHgwMDsKLQotICBpZiAoaXNfb3JpZ2luYXRvcikgewotICAgIGlmICgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9GTEFHUykgPT0gMCAmJgotICAgICAgICAoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9NSVRNKSA9PSAwKSB7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoIiVzIE5vIHNlY3VyaXR5IHJlcXVpcmVkIGZvciBvdXRnb2luZyBjb25uZWN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4gQlRNX1NFQ19PSzsKLSAgICB9Ci0KLSAgICBpZiAoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9NSVRNKSBhdXRoX3JlcSB8PSBCVE1fTEVfQVVUSF9SRVFfTUlUTTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19JTl9GTEFHUykgPT0gMCAmJgotICAgICAgICAoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX0lOX01JVE0pID09IDApIHsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgTm8gc2VjdXJpdHkgcmVxdWlyZWQgZm9yIGluY29taW5nIGNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBCVE1fU0VDX09LOwotICAgIH0KLQotICAgIGlmIChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fTUlUTSkgYXV0aF9yZXEgfD0gQlRNX0xFX0FVVEhfUkVRX01JVE07Ci0gIH0KLQotICB0QlRNX0JMRV9TRUNfUkVRX0FDVCBibGVfc2VjX2FjdDsKLSAgYnRtX2JsZV9saW5rX3NlY19jaGVjayhiZGFkZHIsIGF1dGhfcmVxLCAmYmxlX3NlY19hY3QpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXMgYmxlX3NlY19hY3QgJWQiLCBfX2Z1bmNfXywgYmxlX3NlY19hY3QpOwotCi0gIGlmIChibGVfc2VjX2FjdCA9PSBCVE1fQkxFX1NFQ19SRVFfQUNUX0RJU0NBUkQpIHJldHVybiBCVE1fU0VDX0VOQ19QRU5ESU5HOwotCi0gIGlmIChibGVfc2VjX2FjdCA9PSBCVE1fQkxFX1NFQ19SRVFfQUNUX05PTkUpIHJldHVybiBCVE1fU0VDX09LOwotCi0gIGJvb2wgaXNfbGlua19lbmNyeXB0ZWQgPSBCVE1fSXNFbmNyeXB0ZWQoYmRhZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBib29sIGlzX2tleV9taXRtID0gQlRNX0lzTGlua0tleUF1dGhlZChiZGFkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgaWYgKGF1dGhfcmVxICYgQlRNX0xFX0FVVEhfUkVRX01JVE0pIHsKLSAgICBpZiAoIWlzX2tleV9taXRtKSB7Ci0gICAgICByZXR1cm4gQlRNX1NFQ19FTkNSWVBUX01JVE07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpc19saW5rX2VuY3J5cHRlZCkKLSAgICAgICAgcmV0dXJuIEJUTV9TRUNfT0s7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBCVE1fU0VDX0VOQ1JZUFQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChpc19saW5rX2VuY3J5cHRlZCkKLSAgICAgIHJldHVybiBCVE1fU0VDX09LOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBCVE1fU0VDX0VOQ1JZUFRfTk9fTUlUTTsKLSAgfQotCi0gIHJldHVybiBCVE1fU0VDX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zdGFydF9zZWNfY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gY2hlY2sgYW5kIHNldCB0aGUgc2VjdXJpdHkgcmVxdWlyZWQgZm9yCi0gKiAgICAgICAgICAgICAgICAgIExFIGxpbmsgZm9yIExFIENPQy4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGJkYWRkcjogcmVtb3RlIGRldmljZSBhZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBwc20gOiBQU00gb2YgdGhlIExFIENPQyBzZXZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIGlzX29yaWdpbmF0b3I6IHRydWUgaWYgb3V0Z29pbmcgY29ubmVjdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayA6IFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICBwX3JlZl9kYXRhIDogUG9pbnRlciB0byBiZSByZXR1cm5lZCBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgIC0gTDJDQVAgTEUgQ29ubmVjdGlvbiBSZXNwb25zZSBSZXN1bHQgQ29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEwyQ0FQX0xFX1JFU1VMVF9DT0RFIGJ0bV9ibGVfc3RhcnRfc2VjX2NoZWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHNtLCBib29sIGlzX29yaWdpbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSkgewotICAvKiBGaW5kIHRoZSBzZXJ2aWNlIHJlY29yZCBmb3IgdGhlIFBTTSAqLwotICB0QlRNX1NFQ19TRVJWX1JFQyogcF9zZXJ2X3JlYyA9IGJ0bV9zZWNfZmluZF9maXJzdF9zZXJ2KGlzX29yaWdpbmF0b3IsIHBzbSk7Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gYXBwbGljYXRpb24gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgUFNNIGRvIG5vdCBhbGxvdyBjb25uZWN0aW9uCi0gICAqLwotICBpZiAoIXBfc2Vydl9yZWMpIHsKLSAgICBMT0dfV0FSTigiUFNNOiAlZCBubyBhcHBsaWNhdGlvbiByZWdpc3RlcmVkIiwgcHNtKTsKLSAgICAoKnBfY2FsbGJhY2spKCZiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUsIHBfcmVmX2RhdGEsIEJUTV9NT0RFX1VOU1VQUE9SVEVEKTsKLSAgICByZXR1cm4gTDJDQVBfTEVfUkVTVUxUX05PX1BTTTsKLSAgfQotCi0gIGJvb2wgaXNfZW5jcnlwdGVkID0gQlRNX0lzRW5jcnlwdGVkKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGJvb2wgaXNfbGlua19rZXlfYXV0aGVkID0gQlRNX0lzTGlua0tleUF1dGhlZChiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBib29sIGlzX2F1dGhlbnRpY2F0ZWQgPSBCVE1fSXNBdXRoZW50aWNhdGVkKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgaWYgKCFpc19vcmlnaW5hdG9yKSB7Ci0gICAgaWYgKChwX3NlcnZfcmVjLT5zZWN1cml0eV9mbGFncyAmIEJUTV9TRUNfSU5fRU5DUllQVCkgJiYgIWlzX2VuY3J5cHRlZCkgewotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0VOQ1JZUC4gc2VydmljZSAiCi0gICAgICAgICAgInNlY3VyaXR5X2ZsYWdzPTB4JXgsICIsCi0gICAgICAgICAgcF9zZXJ2X3JlYy0+c2VjdXJpdHlfZmxhZ3MpOwotICAgICAgcmV0dXJuIEwyQ0FQX0xFX1JFU1VMVF9JTlNVRkZJQ0lFTlRfRU5DUllQOwotICAgIH0gZWxzZSBpZiAoKHBfc2Vydl9yZWMtPnNlY3VyaXR5X2ZsYWdzICYgQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUpICYmCi0gICAgICAgICAgICAgICAhKGlzX2xpbmtfa2V5X2F1dGhlZCB8fCBpc19hdXRoZW50aWNhdGVkKSkgewotICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICJMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0FVVEhFTlRJQ0FUSU9OLiBzZXJ2aWNlICIKLSAgICAgICAgICAic2VjdXJpdHlfZmxhZ3M9MHgleCwgIiwKLSAgICAgICAgICBwX3NlcnZfcmVjLT5zZWN1cml0eV9mbGFncyk7Ci0gICAgICByZXR1cm4gTDJDQVBfTEVfUkVTVUxUX0lOU1VGRklDSUVOVF9BVVRIRU5USUNBVElPTjsKLSAgICB9Ci0gICAgLyogVE9ETzogV2hlbiBzZWN1cml0eSBpcyByZXF1aXJlZCwgdGhlbiBtdXN0IGNoZWNrIHRoYXQgdGhlIGtleSBzaXplIG9mIG91cgotICAgICAgIHNlcnZpY2UgaXMgZXF1YWwgb3Igc21hbGxlciB0aGFuIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGtleSBzaXplLiAqLwotICB9Ci0KLSAgdEJUTV9TRUNfQUNUSU9OIHNlY19hY3QgPSBidG1fYmxlX2RldGVybWluZV9zZWN1cml0eV9hY3QoCi0gICAgICBpc19vcmlnaW5hdG9yLCBiZF9hZGRyLCBwX3NlcnZfcmVjLT5zZWN1cml0eV9mbGFncyk7Ci0KLSAgdEJUTV9CTEVfU0VDX0FDVCBibGVfc2VjX2FjdCA9IEJUTV9CTEVfU0VDX05PTkU7Ci0gIHRMMkNBUF9MRV9SRVNVTFRfQ09ERSByZXN1bHQgPSBMMkNBUF9MRV9SRVNVTFRfQ09OTl9PSzsKLQotICBzd2l0Y2ggKHNlY19hY3QpIHsKLSAgICBjYXNlIEJUTV9TRUNfT0s6Ci0gICAgICBMT0dfREVCVUcoIlNlY3VyaXR5IG1ldCIpOwotICAgICAgcF9jYWxsYmFjaygmYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFLCBwX3JlZl9kYXRhLCBCVE1fU1VDQ0VTUyk7Ci0gICAgICByZXN1bHQgPSBMMkNBUF9MRV9SRVNVTFRfQ09OTl9PSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fU0VDX0VOQ1JZUFQ6Ci0gICAgICBMT0dfREVCVUcoIkVuY3J5cHRpb24gbmVlZHMgdG8gYmUgZG9uZSIpOwotICAgICAgYmxlX3NlY19hY3QgPSBCVE1fQkxFX1NFQ19FTkNSWVBUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9TRUNfRU5DUllQVF9NSVRNOgotICAgICAgTE9HX0RFQlVHKCJQYWlyaW5nIHdpdGggTUlUTSBuZWVkcyB0byBiZSBkb25lIik7Ci0gICAgICBibGVfc2VjX2FjdCA9IEJUTV9CTEVfU0VDX0VOQ1JZUFRfTUlUTTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fU0VDX0VOQ1JZUFRfTk9fTUlUTToKLSAgICAgIExPR19ERUJVRygiUGFpcmluZyB3aXRoIE5vIE1JVE0gbmVlZHMgdG8gYmUgZG9uZSIpOwotICAgICAgYmxlX3NlY19hY3QgPSBCVE1fQkxFX1NFQ19FTkNSWVBUX05PX01JVE07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1NFQ19FTkNfUEVORElORzoKLSAgICAgIExPR19ERUJVRygiRWNyeXB0aW9uIHBlbmRpbmciKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGJsZV9zZWNfYWN0ID09IEJUTV9CTEVfU0VDX05PTkUpIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgbDJjYmxlX3VwZGF0ZV9zZWNfYWN0KGJkX2FkZHIsIHNlY19hY3QpOwotICBCVE1fU2V0RW5jcnlwdGlvbihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUsIHBfY2FsbGJhY2ssIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIGJsZV9zZWNfYWN0KTsKLQotICByZXR1cm4gTDJDQVBfTEVfUkVTVUxUX0NPTk5fT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3JhbmRfZW5jX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIEhDSV9SYW5kIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgYW5kIEhDSV9FbmNyeXB0IGNvbW1hbmQgaXMgY29tcGxldGVkLgotICogICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgSENJLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfcmFuZF9lbmNfY29tcGxldGUodWludDhfdCogcCwgdWludDE2X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1JBTkRfRU5DX0NCKiBwX2VuY19jcGx0X2NiYWNrKSB7Ci0gIHRCVE1fUkFORF9FTkMgcGFyYW1zOwotICB1aW50OF90KiBwX2Rlc3QgPSBwYXJhbXMucGFyYW1fYnVmOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiYnRtX2JsZV9yYW5kX2VuY19jb21wbGV0ZSIpOwotCi0gIG1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YodEJUTV9SQU5EX0VOQykpOwotCi0gIC8qIElmIHRoZXJlIHdhcyBhIGNhbGxiYWNrIGFkZHJlc3MgZm9yIHZjcyBjb21wbGV0ZSwgY2FsbCBpdCAqLwotICBpZiAocF9lbmNfY3BsdF9jYmFjayAmJiBwKSB7Ci0gICAgLyogUGFzcyBwYXJhbXRlcnMgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgU1RSRUFNX1RPX1VJTlQ4KHBhcmFtcy5zdGF0dXMsIHApOyAvKiBjb21tYW5kIHN0YXR1cyAqLwotCi0gICAgaWYgKHBhcmFtcy5zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIHBhcmFtcy5vcGNvZGUgPSBvcF9jb2RlOwotCi0gICAgICBpZiAob3BfY29kZSA9PSBIQ0lfQkxFX1JBTkQpCi0gICAgICAgIHBhcmFtcy5wYXJhbV9sZW4gPSBCVF9PQ1RFVDhfTEVOOwotICAgICAgZWxzZQotICAgICAgICBwYXJhbXMucGFyYW1fbGVuID0gT0NURVQxNl9MRU47Ci0KLSAgICAgIC8qIEZldGNoIHJldHVybiBpbmZvIGZyb20gSENJIGV2ZW50IG1lc3NhZ2UgKi8KLSAgICAgIG1lbWNweShwX2Rlc3QsIHAsIHBhcmFtcy5wYXJhbV9sZW4pOwotICAgIH0KLSAgICBpZiAocF9lbmNfY3BsdF9jYmFjaykgLyogQ2FsbCB0aGUgRW5jcnlwdGlvbiBjb21wbGV0ZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotICAgICAgKCpwX2VuY19jcGx0X2NiYWNrKSgmcGFyYW1zKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9nZXRfZW5jX2tleV90eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGluY3JlbWVudCBsb2NhbCBzaWduIGNvdW50ZXIKLSAqIFJldHVybnMgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9pbmNyZW1lbnRfc2lnbl9jdHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBpc19sb2NhbCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX2luY3JlbWVudF9zaWduX2N0ciBpc19sb2NhbD0lZCIsIGlzX2xvY2FsKTsKLQotICBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX2Rldl9yZWMgIT0gTlVMTCkgewotICAgIGlmIChpc19sb2NhbCkKLSAgICAgIHBfZGV2X3JlYy0+YmxlLmtleXMubG9jYWxfY291bnRlcisrOwotICAgIGVsc2UKLSAgICAgIHBfZGV2X3JlYy0+YmxlLmtleXMuY291bnRlcisrOwotICAgIEJUTV9UUkFDRV9ERUJVRygiaXNfbG9jYWw9JWQgbG9jYWwgc2lnbiBjb3VudGVyPSVkIHBlZXIgc2lnbiBjb3VudGVyPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgaXNfbG9jYWwsIHBfZGV2X3JlYy0+YmxlLmtleXMubG9jYWxfY291bnRlciwKLSAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5ibGUua2V5cy5jb3VudGVyKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9nZXRfZW5jX2tleV90eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGdldCB0aGUgQkxFIGtleSB0eXBlIHRoYXQgaGFzIGJlZW4KLSAqICAgICAgICAgICAgICAgICAgZXhjaGFuZ2VkIGJldHdlZW0gdGhlIGxvY2FsIGRldmljZSBhbmQgdGhlIHBlZXIgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcF9rZXlfdHlwZTogb3V0cHV0IHBhcmFtZXRlciB0byBjYXJyeSB0aGUga2V5IHR5cGUgdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2JsZV9nZXRfZW5jX2tleV90eXBlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QqIHBfa2V5X3R5cGVzKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ibGVfZ2V0X2VuY19rZXlfdHlwZSIpOwotCi0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKHBfZGV2X3JlYyAhPSBOVUxMKSB7Ci0gICAgKnBfa2V5X3R5cGVzID0gcF9kZXZfcmVjLT5ibGUua2V5X3R5cGU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2dldF9sb2NhbF9kaXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGxvY2FsIERJVgotICoKLSAqIFJldHVybnMgICAgICAgICAgVFVSRSAtIGlmIGEgdmFsaWQgRElWIGlzIGF2YWlsYXZsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2dldF9sb2NhbF9kaXYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QqIHBfZGl2KSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgYm9vbCBzdGF0dXMgPSBmYWxzZTsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGJkX2FkZHI6ICIgPDwgYmRfYWRkcjsKLQotICAqcF9kaXYgPSAwOwotICBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0KLSAgaWYgKHBfZGV2X3JlYyAmJiBwX2Rldl9yZWMtPmJsZS5rZXlzLmRpdikgewotICAgIHN0YXR1cyA9IHRydWU7Ci0gICAgKnBfZGl2ID0gcF9kZXZfcmVjLT5ibGUua2V5cy5kaXY7Ci0gIH0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fZ2V0X2xvY2FsX2RpdiBzdGF0dXM9JWQgKDEtT0spIERJVj0weCV4Iiwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgKnBfZGl2KTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfc2F2ZV9sZV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBTTVAgdG8gdXBkYXRlCi0gKiAgICAgICAgICAgICAgICAgIGFuICBCTEUga2V5LiAgU01QIGlzIGludGVybmFsLCB3aGVyZWFzIGFsbCB0aGUga2V5cyBzaGFsbAotICogICAgICAgICAgICAgICAgICBiZSBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZAotICogICAgICAgICAgICAgICAgICB3aGVuIGFwcGxpY2F0aW9uIHBhc3NlcyBibGUga2V5IHN0b3JlZCBpbiBOVlJBTSB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgYnRtX3NlYy4KLSAqICAgICAgICAgICAgICAgICAgcGFzc190b19hcHBsaWNhdGlvbiBwYXJhbWV0ZXIgaXMgZmFsc2UgaW4gdGhpcyBjYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfc2F2ZV9sZV9rZXkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9WQUxVRSogcF9rZXlzLCBib29sIHBhc3NfdG9fYXBwbGljYXRpb24pIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9yZWM7Ci0gIHRCVE1fTEVfRVZUX0RBVEEgY2JfZGF0YTsKLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9zZWNfc2F2ZV9sZV9rZXkga2V5X3R5cGU9MHgleCBwYXNzX3RvX2FwcGxpY2F0aW9uPSVkIiwKLSAgICAgICAgICAgICAgICAgIGtleV90eXBlLCBwYXNzX3RvX2FwcGxpY2F0aW9uKTsKLSAgLyogU3RvcmUgdGhlIHVwZGF0ZWQga2V5IGluIHRoZSBkZXZpY2UgZGF0YWJhc2UgKi8KLQotICBWTE9HKDEpIDw8ICJiZF9hZGRyOiIgPDwgYmRfYWRkcjsKLQotICBpZiAoKHBfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpKSAhPSBOVUxMICYmCi0gICAgICAocF9rZXlzIHx8IGtleV90eXBlID09IEJUTV9MRV9LRVlfTElEKSkgewotICAgIGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkcihwX3JlYywgYmRfYWRkcik7Ci0KLSAgICBzd2l0Y2ggKGtleV90eXBlKSB7Ci0gICAgICBjYXNlIEJUTV9MRV9LRVlfUEVOQzoKLSAgICAgICAgcF9yZWMtPmJsZS5rZXlzLnBsdGsgPSBwX2tleXMtPnBlbmNfa2V5Lmx0azsKLSAgICAgICAgbWVtY3B5KHBfcmVjLT5ibGUua2V5cy5yYW5kLCBwX2tleXMtPnBlbmNfa2V5LnJhbmQsIEJUX09DVEVUOF9MRU4pOwotICAgICAgICBwX3JlYy0+YmxlLmtleXMuc2VjX2xldmVsID0gcF9rZXlzLT5wZW5jX2tleS5zZWNfbGV2ZWw7Ci0gICAgICAgIHBfcmVjLT5ibGUua2V5cy5lZGl2ID0gcF9rZXlzLT5wZW5jX2tleS5lZGl2OwotICAgICAgICBwX3JlYy0+YmxlLmtleXMua2V5X3NpemUgPSBwX2tleXMtPnBlbmNfa2V5LmtleV9zaXplOwotICAgICAgICBwX3JlYy0+YmxlLmtleV90eXBlIHw9IEJUTV9MRV9LRVlfUEVOQzsKLSAgICAgICAgcF9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDX0xFX0xJTktfS0VZX0tOT1dOOwotICAgICAgICBpZiAocF9rZXlzLT5wZW5jX2tleS5zZWNfbGV2ZWwgPT0gU01QX1NFQ19BVVRIRU5USUNBVEVEKQotICAgICAgICAgIHBfcmVjLT5zZWNfZmxhZ3MgfD0gQlRNX1NFQ19MRV9MSU5LX0tFWV9BVVRIRUQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwX3JlYy0+c2VjX2ZsYWdzICY9IH5CVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRDsKLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIkJUTV9MRV9LRVlfUEVOQyBrZXlfdHlwZT0weCV4IHNlY19mbGFncz0weCV4IHNlY19sZXZlPTB4JXgiLAotICAgICAgICAgICAgcF9yZWMtPmJsZS5rZXlfdHlwZSwgcF9yZWMtPnNlY19mbGFncywgcF9yZWMtPmJsZS5rZXlzLnNlY19sZXZlbCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUTV9MRV9LRVlfUElEOgotICAgICAgICBwX3JlYy0+YmxlLmtleXMuaXJrID0gcF9rZXlzLT5waWRfa2V5LmlyazsKLSAgICAgICAgcF9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEgPQotICAgICAgICAgICAgcF9rZXlzLT5waWRfa2V5LmlkZW50aXR5X2FkZHI7Ci0gICAgICAgIHBfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZSA9Ci0gICAgICAgICAgICBwX2tleXMtPnBpZF9rZXkuaWRlbnRpdHlfYWRkcl90eXBlOwotICAgICAgICBwX3JlYy0+YmxlLmtleV90eXBlIHw9IEJUTV9MRV9LRVlfUElEOwotICAgICAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiJXM6IEJUTV9MRV9LRVlfUElEIGtleV90eXBlPTB4JXggc2F2ZSBwZWVyIElSSywgY2hhbmdlIGJkX2FkZHI9JXMgIgotICAgICAgICAgICAgInRvIGlkX2FkZHI9JXMgaWRfYWRkcl90eXBlPTB4JXgiLAotICAgICAgICAgICAgX19mdW5jX18sIHBfcmVjLT5ibGUua2V5X3R5cGUsIHBfcmVjLT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgIHBfa2V5cy0+cGlkX2tleS5pZGVudGl0eV9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgIHBfa2V5cy0+cGlkX2tleS5pZGVudGl0eV9hZGRyX3R5cGUpOwotICAgICAgICAvKiB1cGRhdGUgZGV2aWNlIHJlY29yZCBhZGRyZXNzIGFzIGlkZW50aXR5IGFkZHJlc3MgKi8KLSAgICAgICAgcF9yZWMtPmJkX2FkZHIgPSBwX2tleXMtPnBpZF9rZXkuaWRlbnRpdHlfYWRkcjsKLSAgICAgICAgLyogY29tYmluZSBEVU1PIGRldmljZSBzZWN1cml0eSByZWNvcmQgaWYgbmVlZGVkICovCi0gICAgICAgIGJ0bV9jb25zb2xpZGF0ZV9kZXYocF9yZWMpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVE1fTEVfS0VZX1BDU1JLOgotICAgICAgICBwX3JlYy0+YmxlLmtleXMucGNzcmsgPSBwX2tleXMtPnBjc3JrX2tleS5jc3JrOwotICAgICAgICBwX3JlYy0+YmxlLmtleXMuc3JrX3NlY19sZXZlbCA9IHBfa2V5cy0+cGNzcmtfa2V5LnNlY19sZXZlbDsKLSAgICAgICAgcF9yZWMtPmJsZS5rZXlzLmNvdW50ZXIgPSBwX2tleXMtPnBjc3JrX2tleS5jb3VudGVyOwotICAgICAgICBwX3JlYy0+YmxlLmtleV90eXBlIHw9IEJUTV9MRV9LRVlfUENTUks7Ci0gICAgICAgIHBfcmVjLT5zZWNfZmxhZ3MgfD0gQlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTjsKLSAgICAgICAgaWYgKHBfa2V5cy0+cGNzcmtfa2V5LnNlY19sZXZlbCA9PSBTTVBfU0VDX0FVVEhFTlRJQ0FURUQpCi0gICAgICAgICAgcF9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBfcmVjLT5zZWNfZmxhZ3MgJj0gfkJUTV9TRUNfTEVfTElOS19LRVlfQVVUSEVEOwotCi0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICJCVE1fTEVfS0VZX1BDU1JLIGtleV90eXBlPTB4JXggc2VjX2ZsYWdzPTB4JXggc2VjX2xldmVsPTB4JXggIgotICAgICAgICAgICAgInBlZXJfY291bnRlcj0lZCIsCi0gICAgICAgICAgICBwX3JlYy0+YmxlLmtleV90eXBlLCBwX3JlYy0+c2VjX2ZsYWdzLAotICAgICAgICAgICAgcF9yZWMtPmJsZS5rZXlzLnNya19zZWNfbGV2ZWwsIHBfcmVjLT5ibGUua2V5cy5jb3VudGVyKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRNX0xFX0tFWV9MRU5DOgotICAgICAgICBwX3JlYy0+YmxlLmtleXMubGx0ayA9IHBfa2V5cy0+bGVuY19rZXkubHRrOwotICAgICAgICBwX3JlYy0+YmxlLmtleXMuZGl2ID0gcF9rZXlzLT5sZW5jX2tleS5kaXY7IC8qIHVwZGF0ZSBESVYgKi8KLSAgICAgICAgcF9yZWMtPmJsZS5rZXlzLnNlY19sZXZlbCA9IHBfa2V5cy0+bGVuY19rZXkuc2VjX2xldmVsOwotICAgICAgICBwX3JlYy0+YmxlLmtleXMua2V5X3NpemUgPSBwX2tleXMtPmxlbmNfa2V5LmtleV9zaXplOwotICAgICAgICBwX3JlYy0+YmxlLmtleV90eXBlIHw9IEJUTV9MRV9LRVlfTEVOQzsKLQotICAgICAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiQlRNX0xFX0tFWV9MRU5DIGtleV90eXBlPTB4JXggRElWPTB4JXgga2V5X3NpemU9MHgleCAiCi0gICAgICAgICAgICAic2VjX2xldmVsPTB4JXgiLAotICAgICAgICAgICAgcF9yZWMtPmJsZS5rZXlfdHlwZSwgcF9yZWMtPmJsZS5rZXlzLmRpdiwgcF9yZWMtPmJsZS5rZXlzLmtleV9zaXplLAotICAgICAgICAgICAgcF9yZWMtPmJsZS5rZXlzLnNlY19sZXZlbCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUTV9MRV9LRVlfTENTUks6IC8qIGxvY2FsIENTUksgaGFzIGJlZW4gZGVsaXZlcmVkICovCi0gICAgICAgIHBfcmVjLT5ibGUua2V5cy5sY3NyayA9IHBfa2V5cy0+bGNzcmtfa2V5LmNzcms7Ci0gICAgICAgIHBfcmVjLT5ibGUua2V5cy5kaXYgPSBwX2tleXMtPmxjc3JrX2tleS5kaXY7IC8qIHVwZGF0ZSBESVYgKi8KLSAgICAgICAgcF9yZWMtPmJsZS5rZXlzLmxvY2FsX2Nzcmtfc2VjX2xldmVsID0gcF9rZXlzLT5sY3Nya19rZXkuc2VjX2xldmVsOwotICAgICAgICBwX3JlYy0+YmxlLmtleXMubG9jYWxfY291bnRlciA9IHBfa2V5cy0+bGNzcmtfa2V5LmNvdW50ZXI7Ci0gICAgICAgIHBfcmVjLT5ibGUua2V5X3R5cGUgfD0gQlRNX0xFX0tFWV9MQ1NSSzsKLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIkJUTV9MRV9LRVlfTENTUksga2V5X3R5cGU9MHgleCBESVY9MHgleCBzY3JrX3NlY19sZXZlbD0weCV4ICIKLSAgICAgICAgICAgICJsb2NhbF9jb3VudGVyPSVkIiwKLSAgICAgICAgICAgIHBfcmVjLT5ibGUua2V5X3R5cGUsIHBfcmVjLT5ibGUua2V5cy5kaXYsCi0gICAgICAgICAgICBwX3JlYy0+YmxlLmtleXMubG9jYWxfY3Nya19zZWNfbGV2ZWwsCi0gICAgICAgICAgICBwX3JlYy0+YmxlLmtleXMubG9jYWxfY291bnRlcik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUTV9MRV9LRVlfTElEOgotICAgICAgICBwX3JlYy0+YmxlLmtleV90eXBlIHw9IEJUTV9MRV9LRVlfTElEOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEJUTV9UUkFDRV9XQVJOSU5HKCJidG1fc2VjX3NhdmVfbGVfa2V5IChCYWQga2V5X3R5cGUgMHglMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZMT0coMSkgPDwgIkJMRSBrZXkgdHlwZSAweCIgPDwgbG9naGV4KGtleV90eXBlKQotICAgICAgICAgICAgPDwgIiB1cGRhdGVkIGZvciBCREE6ICIgPDwgYmRfYWRkciA8PCAiIChidG1fc2VjX3NhdmVfbGVfa2V5KSI7Ci0KLSAgICAvKiBOb3RpZnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb25lIG9mIHRoZSBCTEUga2V5cyBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgSWYgbGluayBrZXkgaXMgaW4gcHJvZ3Jlc3MsIGl0IHdpbGwgZ2V0IHNlbnQgbGF0ZXIuKi8KLSAgICBpZiAocGFzc190b19hcHBsaWNhdGlvbiAmJiBidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2spIHsKLSAgICAgIGNiX2RhdGEua2V5LnBfa2V5X3ZhbHVlID0gcF9rZXlzOwotICAgICAgY2JfZGF0YS5rZXkua2V5X3R5cGUgPSBrZXlfdHlwZTsKLQotICAgICAgKCpidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2spKEJUTV9MRV9LRVlfRVZULCBiZF9hZGRyLCAmY2JfZGF0YSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIExPRyhXQVJOSU5HKSA8PCAiQkxFIGtleSB0eXBlIDB4IiA8PCBsb2doZXgoa2V5X3R5cGUpCi0gICAgICAgICAgICAgICA8PCAiIGNhbGxlZCBmb3IgVW5rbm93biBCREEgb3IgdHlwZTogIiA8PCBiZF9hZGRyCi0gICAgICAgICAgICAgICA8PCAiKGJ0bV9zZWNfc2F2ZV9sZV9rZXkpIjsKLQotICBpZiAocF9yZWMpIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoInNlY19mbGFncz0weCV4IiwgcF9yZWMtPnNlY19mbGFncyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfdXBkYXRlX3NlY19rZXlfc2l6ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgdXBkYXRlIHRoZSBjdXJyZW50IGxpbiBrZW5jcnlwdGlvbiBrZXkgc2l6ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfdXBkYXRlX3NlY19rZXlfc2l6ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNfa2V5X3NpemUpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9yZWM7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX3VwZGF0ZV9zZWNfa2V5X3NpemUgZW5jX2tleV9zaXplID0gJWQiLAotICAgICAgICAgICAgICAgICAgZW5jX2tleV9zaXplKTsKLQotICBwX3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKHBfcmVjICE9IE5VTEwpIHsKLSAgICBwX3JlYy0+ZW5jX2tleV9zaXplID0gZW5jX2tleV9zaXplOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3JlYWRfc2VjX2tleV9zaXplCi0gKgotICogRGVzY3JpcHRpb24gICAgICB1cGRhdGUgdGhlIGN1cnJlbnQgbGluIGtlbmNyeXB0aW9uIGtleSBzaXplCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRtX2JsZV9yZWFkX3NlY19rZXlfc2l6ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfcmVjOwotCi0gIHBfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICBpZiAocF9yZWMgIT0gTlVMTCkgewotICAgIHJldHVybiBwX3JlYy0+ZW5jX2tleV9zaXplOwotICB9IGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfbGlua19zZWNfY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIEJMRSBsaW5rIHNlY3VyaXR5IGxldmVsIG1hdGNoLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZTogY2hlY2sgaXMgT0sgYW5kIHRoZSAqcF9zZWNfcmVxX2FjdCBjb250YWluIHRoZSBhY3Rpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYmxlX2xpbmtfc2VjX2NoZWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfUkVRX0FDVCogcF9zZWNfcmVxX2FjdCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIHVpbnQ4X3QgcmVxX3NlY19sZXZlbCA9IEJUTV9MRV9TRUNfTk9ORSwgY3VyX3NlY19sZXZlbCA9IEJUTV9MRV9TRUNfTk9ORTsKLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ibGVfbGlua19zZWNfY2hlY2sgYXV0aF9yZXEgPTB4JXgiLCBhdXRoX3JlcSk7Ci0KLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJidG1fYmxlX2xpbmtfc2VjX2NoZWNrIHJlY2VpdmVkIGZvciB1bmtub3duIGRldmljZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX2Rldl9yZWMtPnNlY19zdGF0ZSA9PSBCVE1fU0VDX1NUQVRFX0VOQ1JZUFRJTkcgfHwKLSAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkcpIHsKLSAgICAvKiByYWNlIGNvbmRpdGlvbjogZGlzY2FyZCB0aGUgc2VjdXJpdHkgcmVxdWVzdCB3aGlsZSBjZW50cmFsIGlzIGVuY3J5cHRpbmcKLSAgICAgKiB0aGUgbGluayAqLwotICAgICpwX3NlY19yZXFfYWN0ID0gQlRNX0JMRV9TRUNfUkVRX0FDVF9ESVNDQVJEOwotICB9IGVsc2UgewotICAgIHJlcV9zZWNfbGV2ZWwgPSBCVE1fTEVfU0VDX1VOQVVUSEVOVElDQVRFOwotICAgIGlmIChhdXRoX3JlcSAmIEJUTV9MRV9BVVRIX1JFUV9NSVRNKSB7Ci0gICAgICByZXFfc2VjX2xldmVsID0gQlRNX0xFX1NFQ19BVVRIRU5USUNBVEVEOwotICAgIH0KLQotICAgIEJUTV9UUkFDRV9ERUJVRygiZGV2X3JlYyBzZWNfZmxhZ3M9MHgleCIsIHBfZGV2X3JlYy0+c2VjX2ZsYWdzKTsKLQotICAgIC8qIGN1cnJlbnRseSBlbmNycHRlZCAgKi8KLSAgICBpZiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0VOQ1JZUFRFRCkgewotICAgICAgaWYgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MRV9BVVRIRU5USUNBVEVEKQotICAgICAgICBjdXJfc2VjX2xldmVsID0gQlRNX0xFX1NFQ19BVVRIRU5USUNBVEVEOwotICAgICAgZWxzZQotICAgICAgICBjdXJfc2VjX2xldmVsID0gQlRNX0xFX1NFQ19VTkFVVEhFTlRJQ0FURTsKLSAgICB9IGVsc2UgLyogdW5lbmNyeXB0ZWQgbGluayAqLwotICAgIHsKLSAgICAgIC8qIGlmIGJvbmRlZCwgZ2V0IHRoZSBrZXkgc2VjdXJpdHkgbGV2ZWwgKi8KLSAgICAgIGlmIChwX2Rldl9yZWMtPmJsZS5rZXlfdHlwZSAmIEJUTV9MRV9LRVlfUEVOQykKLSAgICAgICAgY3VyX3NlY19sZXZlbCA9IHBfZGV2X3JlYy0+YmxlLmtleXMuc2VjX2xldmVsOwotICAgICAgZWxzZQotICAgICAgICBjdXJfc2VjX2xldmVsID0gQlRNX0xFX1NFQ19OT05FOwotICAgIH0KLQotICAgIGlmIChjdXJfc2VjX2xldmVsID49IHJlcV9zZWNfbGV2ZWwpIHsKLSAgICAgIC8qIFRvIGF2b2lkIHJlLWVuY3J5cHRpb24gb24gYW4gZW5jcnlwdGVkIGxpbmsgZm9yIGFuIGVxdWFsIGNvbmRpdGlvbgotICAgICAgICogZW5jcnlwdGlvbiAqLwotICAgICAgKnBfc2VjX3JlcV9hY3QgPSBCVE1fQkxFX1NFQ19SRVFfQUNUX0VOQ1JZUFQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHN0YXJ0IHRoZSBwYXJpcmluZyBwcm9jZXNzIHRvIHVwZ3JhZGUgdGhlIGtleXMqLwotICAgICAgKnBfc2VjX3JlcV9hY3QgPSBCVE1fQkxFX1NFQ19SRVFfQUNUX1BBSVI7Ci0gICAgfQotICB9Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJjdXJfc2VjX2xldmVsPSVkIHJlcV9zZWNfbGV2ZWw9JWQgc2VjX3JlcV9hY3Q9JWQiLAotICAgICAgICAgICAgICAgICAgY3VyX3NlY19sZXZlbCwgcmVxX3NlY19sZXZlbCwgKnBfc2VjX3JlcV9hY3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zZXRfZW5jcnlwdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5zdXJlIHRoYXQgTEUgY29ubmVjdGlvbiBpcwotICogICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQuICBTaG91bGQgYmUgY2FsbGVkIG9ubHkgb24gYW4gb3BlbiBjb25uZWN0aW9uLgotICogICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgb25seSBuZWVkZWQgZm9yIGNvbm5lY3Rpb25zIHRoYXQgZmlyc3Qgd2FudCB0bwotICogICAgICAgICAgICAgICAgICBicmluZyB1cCB1bmVuY3J5cHRlZCBsaW5rcywgdGhlbiBsYXRlciBlbmNyeXB0IHRoZW0uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBsb2NhbCBkZXZpY2UgRVIgaXMgY29waWVkIGludG8gZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfZW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGlua19yb2xlKSB7Ci0gIHRCVE1fU1RBVFVTIGNtZCA9IEJUTV9OT19SRVNPVVJDRVM7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICB0QlRNX0JMRV9TRUNfUkVRX0FDVCBzZWNfcmVxX2FjdDsKLSAgdEJUTV9MRV9BVVRIX1JFUSBhdXRoX3JlcTsKLQotICBpZiAocF9yZWMgPT0gTlVMTCkgewotICAgIEJUTV9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiYnRtX2JsZV9zZXRfZW5jcnlwdGlvbiAoTlVMTCBkZXZpY2UgcmVjb3JkISEgc2VjX2FjdD0weCV4Iiwgc2VjX2FjdCk7Ci0gICAgcmV0dXJuIChCVE1fV1JPTkdfTU9ERSk7Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ibGVfc2V0X2VuY3J5cHRpb24gc2VjX2FjdD0weCV4IHJvbGVfY2VudHJhbD0lZCIsCi0gICAgICAgICAgICAgICAgICBzZWNfYWN0LCBwX3JlYy0+cm9sZV9jZW50cmFsKTsKLQotICBpZiAoc2VjX2FjdCA9PSBCVE1fQkxFX1NFQ19FTkNSWVBUX01JVE0pIHsKLSAgICBwX3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgfD0gQlRNX1NFQ19JTl9NSVRNOwotICB9Ci0KLSAgc3dpdGNoIChzZWNfYWN0KSB7Ci0gICAgY2FzZSBCVE1fQkxFX1NFQ19FTkNSWVBUOgotICAgICAgaWYgKGxpbmtfcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgICAgIC8qIHN0YXJ0IGxpbmsgbGF5ZXIgZW5jcnlwdGlvbiB1c2luZyB0aGUgc2VjdXJpdHkgaW5mbyBzdG9yZWQgKi8KLSAgICAgICAgY21kID0gYnRtX2JsZV9zdGFydF9lbmNyeXB0KGJkX2FkZHIsIGZhbHNlLCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvKiBpZiBzYWx2ZSByb2xlIHRoZW4gZmFsbCB0aHJvdWdoIHRvIGNhbGwgU01QX1BhaXIgYmVsb3cgd2hpY2ggd2lsbCBzZW5kCi0gICAgICAgICBhIHNlY19yZXF1ZXN0IHRvIHJlcXVlc3QgdGhlIGNlbnRyYWwgdG8gZW5jcnlwdCB0aGUgbGluayAqLwotICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBCVE1fQkxFX1NFQ19FTkNSWVBUX05PX01JVE06Ci0gICAgY2FzZSBCVE1fQkxFX1NFQ19FTkNSWVBUX01JVE06Ci0gICAgICBhdXRoX3JlcSA9IChzZWNfYWN0ID09IEJUTV9CTEVfU0VDX0VOQ1JZUFRfTk9fTUlUTSkKLSAgICAgICAgICAgICAgICAgICAgID8gU01QX0FVVEhfQk9ORAotICAgICAgICAgICAgICAgICAgICAgOiAoU01QX0FVVEhfQk9ORCB8IFNNUF9BVVRIX1lOX0JJVCk7Ci0gICAgICBidG1fYmxlX2xpbmtfc2VjX2NoZWNrKGJkX2FkZHIsIGF1dGhfcmVxLCAmc2VjX3JlcV9hY3QpOwotICAgICAgaWYgKHNlY19yZXFfYWN0ID09IEJUTV9CTEVfU0VDX1JFUV9BQ1RfTk9ORSB8fAotICAgICAgICAgIHNlY19yZXFfYWN0ID09IEJUTV9CTEVfU0VDX1JFUV9BQ1RfRElTQ0FSRCkgewotICAgICAgICBCVE1fVFJBQ0VfREVCVUcoIiVzLCBubyBhY3Rpb24gbmVlZGVkLiBJZ25vcmUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGNtZCA9IEJUTV9TVUNDRVNTOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChsaW5rX3JvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgICAgICBpZiAoc2VjX3JlcV9hY3QgPT0gQlRNX0JMRV9TRUNfUkVRX0FDVF9FTkNSWVBUKSB7Ci0gICAgICAgICAgY21kID0gYnRtX2JsZV9zdGFydF9lbmNyeXB0KGJkX2FkZHIsIGZhbHNlLCBOVUxMKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoU01QX1BhaXIoYmRfYWRkcikgPT0gU01QX1NUQVJURUQpIHsKLSAgICAgICAgY21kID0gQlRNX0NNRF9TVEFSVEVEOwotICAgICAgICBwX3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGNtZCA9IEJUTV9XUk9OR19NT0RFOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGNtZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfbHRrX3JlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZW5jcnlwdGlvbiByZXF1ZXN0IGlzIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIG9uIGEgcGVyaXBoZXJhbCBkZXZpY2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfbHRrX3JlcXVlc3QodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJhbmRbOF0sIHVpbnQxNl90IGVkaXYpIHsKLSAgdEJUTV9DQiogcF9jYiA9ICZidG1fY2I7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUoaGFuZGxlKTsKLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ibGVfbHRrX3JlcXVlc3QiKTsKLQotICBwX2NiLT5lZGl2ID0gZWRpdjsKLQotICBtZW1jcHkocF9jYi0+ZW5jX3JhbmQsIHJhbmQsIEJUX09DVEVUOF9MRU4pOwotCi0gIGlmIChwX2Rldl9yZWMgIT0gTlVMTCkgewotICAgIGlmICghc21wX3Byb2NfbHRrX3JlcXVlc3QocF9kZXZfcmVjLT5iZF9hZGRyKSkgewotICAgICAgYnRtX2JsZV9sdGtfcmVxdWVzdF9yZXBseShwX2Rldl9yZWMtPmJkX2FkZHIsIGZhbHNlLCBPY3RldDE2ezB9KTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IExFIGVuY3J5cHRpb24uCi0gKiBSZXR1cm5zIEJUTV9TVUNDRVNTIGlmIGVuY3J5cHRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5Ci0gKi8KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfc3RhcnRfZW5jcnlwdChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGJvb2wgdXNlX3N0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPY3RldDE2KiBwX3N0aykgewotICB0QlRNX0NCKiBwX2NiID0gJmJ0bV9jYjsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9yZWMgPSBidG1fZmluZF9kZXYoYmRhKTsKLSAgQlRfT0NURVQ4IGR1bW15X3JhbmQgPSB7MH07Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX3N0YXJ0X2VuY3J5cHQiKTsKLQotICBpZiAoIXBfcmVjKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJMaW5rIGlzIG5vdCBhY3RpdmUsIGNhbiBub3QgZW5jcnlwdCEiKTsKLSAgICByZXR1cm4gQlRNX1dST05HX01PREU7Ci0gIH0KLQotICBpZiAocF9yZWMtPnNlY19zdGF0ZSA9PSBCVE1fU0VDX1NUQVRFX0VOQ1JZUFRJTkcpIHsKLSAgICBCVE1fVFJBQ0VfV0FSTklORygiTGluayBFbmNyeXB0aW9uIGlzIGFjdGl2ZSwgQnVzeSEiKTsKLSAgICByZXR1cm4gQlRNX0JVU1k7Ci0gIH0KLQotICBwX2NiLT5lbmNfaGFuZGxlID0gcF9yZWMtPmJsZV9oY2lfaGFuZGxlOwotCi0gIGlmICh1c2Vfc3RrKSB7Ci0gICAgYnRzbmRfaGNpY19ibGVfc3RhcnRfZW5jKHBfcmVjLT5ibGVfaGNpX2hhbmRsZSwgZHVtbXlfcmFuZCwgMCwgKnBfc3RrKTsKLSAgfSBlbHNlIGlmIChwX3JlYy0+YmxlLmtleV90eXBlICYgQlRNX0xFX0tFWV9QRU5DKSB7Ci0gICAgYnRzbmRfaGNpY19ibGVfc3RhcnRfZW5jKHBfcmVjLT5ibGVfaGNpX2hhbmRsZSwgcF9yZWMtPmJsZS5rZXlzLnJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVjLT5ibGUua2V5cy5lZGl2LCBwX3JlYy0+YmxlLmtleXMucGx0ayk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJObyBrZXkgYXZhaWxhYmxlIHRvIGVuY3J5cHQgdGhlIGxpbmsiKTsKLSAgICByZXR1cm4gQlRNX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIGlmIChwX3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfSURMRSkKLSAgICBwX3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9FTkNSWVBUSU5HOwotCi0gIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2xpbmtfZW5jcnlwdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIExFIGxpbmsgZW5jcnB0aW9uIHN0YXR1cyBpcwotICogICAgICAgICAgICAgICAgICBjaGFuZ2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfbGlua19lbmNyeXB0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBlbmNyX2VuYWJsZSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGJvb2wgZW5jX2NiYWNrOwotCi0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICJidG1fYmxlX2xpbmtfZW5jcnlwdGVkIChObyBEZXZpY2UgRm91bmQhKSBlbmNyX2VuYWJsZT0lZCIsCi0gICAgICAgIGVuY3JfZW5hYmxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ibGVfbGlua19lbmNyeXB0ZWQgZW5jcl9lbmFibGU9JWQiLCBlbmNyX2VuYWJsZSk7Ci0KLSAgZW5jX2NiYWNrID0gKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfRU5DUllQVElORyk7Ci0KLSAgc21wX2xpbmtfZW5jcnlwdGVkKGJkX2FkZHIsIGVuY3JfZW5hYmxlKTsKLQotICBCVE1fVFJBQ0VfREVCVUcoIiBwX2Rldl9yZWMtPnNlY19mbGFncz0weCV4IiwgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotCi0gIGlmIChlbmNyX2VuYWJsZSAmJiBwX2Rldl9yZWMtPmVuY19rZXlfc2l6ZSA9PSAwKQotICAgIHBfZGV2X3JlYy0+ZW5jX2tleV9zaXplID0gcF9kZXZfcmVjLT5ibGUua2V5cy5rZXlfc2l6ZTsKLQotICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfSURMRTsKLSAgaWYgKHBfZGV2X3JlYy0+cF9jYWxsYmFjayAmJiBlbmNfY2JhY2spIHsKLSAgICBpZiAoZW5jcl9lbmFibGUpCi0gICAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBCVE1fU1VDQ0VTUywgdHJ1ZSk7Ci0gICAgZWxzZSBpZiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiB+QlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTikgewotICAgICAgYnRtX3NlY19kZXZfcmVjX2NiYWNrX2V2ZW50KHBfZGV2X3JlYywgQlRNX0ZBSUxFRF9PTl9TRUNVUklUWSwgdHJ1ZSk7Ci0gICAgfSBlbHNlIGlmIChwX2Rldl9yZWMtPnJvbGVfY2VudHJhbCkKLSAgICAgIGJ0bV9zZWNfZGV2X3JlY19jYmFja19ldmVudChwX2Rldl9yZWMsIEJUTV9FUlJfUFJPQ0VTU0lORywgdHJ1ZSk7Ci0gIH0KLSAgLyogdG8gbm90aWZ5IEdBVFQgdG8gc2VuZCBkYXRhIGlmIGFueSByZXF1ZXN0IGlzIHBlbmRpbmcgKi8KLSAgZ2F0dF9ub3RpZnlfZW5jX2NtcGwocF9kZXZfcmVjLT5ibGUucHNldWRvX2FkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9sdGtfcmVxdWVzdF9yZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhIExUSyByZXF1ZXN0IHJlcGx5IG9uIGEKLSAqICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbAotICogICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9sdGtfcmVxdWVzdF9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGJvb2wgdXNlX3N0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBzdGspIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9yZWMgPSBidG1fZmluZF9kZXYoYmRhKTsKLSAgdEJUTV9DQiogcF9jYiA9ICZidG1fY2I7Ci0KLSAgaWYgKHBfcmVjID09IE5VTEwpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoImJ0bV9ibGVfbHRrX3JlcXVlc3RfcmVwbHkgcmVjZWl2ZWQgZm9yIHVua25vd24gZGV2aWNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX2x0a19yZXF1ZXN0X3JlcGx5Iik7Ci0gIHBfY2ItPmVuY19oYW5kbGUgPSBwX3JlYy0+YmxlX2hjaV9oYW5kbGU7Ci0gIHBfY2ItPmtleV9zaXplID0gcF9yZWMtPmJsZS5rZXlzLmtleV9zaXplOwotCi0gIEJUTV9UUkFDRV9FUlJPUigia2V5IHNpemUgPSAlZCIsIHBfcmVjLT5ibGUua2V5cy5rZXlfc2l6ZSk7Ci0gIGlmICh1c2Vfc3RrKSB7Ci0gICAgYnRzbmRfaGNpY19ibGVfbHRrX3JlcV9yZXBseShidG1fY2IuZW5jX2hhbmRsZSwgc3RrKTsKLSAgfSBlbHNlIC8qIGNhbGN1bGF0ZSBMVEsgdXNpbmcgcGVlciBkZXZpY2UgICovCi0gIHsKLSAgICBpZiAocF9yZWMtPmJsZS5rZXlfdHlwZSAmIEJUTV9MRV9LRVlfTEVOQykKLSAgICAgIGJ0c25kX2hjaWNfYmxlX2x0a19yZXFfcmVwbHkoYnRtX2NiLmVuY19oYW5kbGUsIHBfcmVjLT5ibGUua2V5cy5sbHRrKTsKLSAgICBlbHNlCi0gICAgICBidHNuZF9oY2ljX2JsZV9sdGtfcmVxX25lZ19yZXBseShidG1fY2IuZW5jX2hhbmRsZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfaW9fY2FwYWJpbGl0aWVzX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaGFuZGxlIFNNUCBnZXQgSU8gY2FwYWJpbGl0eQotICogICAgICAgICAgICAgICAgICByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGJ0bV9ibGVfaW9fY2FwYWJpbGl0aWVzX3JlcSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0lPX1JFUSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QgY2FsbGJhY2tfcmMgPSBCVE1fU1VDQ0VTUzsKLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX2lvX2NhcGFiaWxpdGllc19yZXEiKTsKLSAgaWYgKGJ0bV9jYi5hcGkucF9sZV9jYWxsYmFjaykgewotICAgIC8qIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIHRoZSBJTyBjYXBhYmlsaXR5Li4uICovCi0gICAgY2FsbGJhY2tfcmMgPSAoKmJ0bV9jYi5hcGkucF9sZV9jYWxsYmFjaykoCi0gICAgICAgIEJUTV9MRV9JT19SRVFfRVZULCBwX2Rldl9yZWMtPmJkX2FkZHIsICh0QlRNX0xFX0VWVF9EQVRBKilwX2RhdGEpOwotICB9Ci0gIGlmICgoY2FsbGJhY2tfcmMgPT0gQlRNX1NVQ0NFU1MpIHx8IChCVE1fT09CX1VOS05PV04gIT0gcF9kYXRhLT5vb2JfZGF0YSkpIHsKLSNpZiAoQlRNX0JMRV9DT05GT1JNQU5DRV9URVNUSU5HID09IFRSVUUpCi0gICAgaWYgKGJ0bV9jYi5kZXZjYi5rZWVwX3JmdV9pbl9hdXRoX3JlcSkgewotICAgICAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX2lvX2NhcGFiaWxpdGllc19yZXEga2VlcF9yZnVfaW5fYXV0aF9yZXEgPSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgYnRtX2NiLmRldmNiLmtlZXBfcmZ1X2luX2F1dGhfcmVxKTsKLSAgICAgIHBfZGF0YS0+YXV0aF9yZXEgJj0gQlRNX0xFX0FVVEhfUkVRX01BU0tfS0VFUF9SRlU7Ci0gICAgICBidG1fY2IuZGV2Y2Iua2VlcF9yZnVfaW5fYXV0aF9yZXEgPSBmYWxzZTsKLSAgICB9IGVsc2UgeyAvKiBkZWZhdWx0ICovCi0gICAgICBwX2RhdGEtPmF1dGhfcmVxICY9IEJUTV9MRV9BVVRIX1JFUV9NQVNLOwotICAgIH0KLSNlbHNlCi0gICAgcF9kYXRhLT5hdXRoX3JlcSAmPSBCVE1fTEVfQVVUSF9SRVFfTUFTSzsKLSNlbmRpZgotCi0gICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAiYnRtX2JsZV9pb19jYXBhYmlsaXRpZXNfcmVxIDE6IHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgPSAlZCAiCi0gICAgICAgICJhdXRoX3JlcTolZCIsCi0gICAgICAgIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQsIHBfZGF0YS0+YXV0aF9yZXEpOwotICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgImJ0bV9ibGVfaW9fY2FwYWJpbGl0aWVzX3JlcSAyOiBpX2tleXM9MHgleCByX2tleXM9MHgleCAoYml0IDAtTFRLICIKLSAgICAgICAgIjEtSVJLIDItQ1NSSykiLAotICAgICAgICBwX2RhdGEtPmluaXRfa2V5cywgcF9kYXRhLT5yZXNwX2tleXMpOwotCi0gICAgLyogaWYgYXV0aGVudGljYXRpb24gcmVxdWlyZXMgTUlUTSBwcm90ZWN0aW9uLCBwdXQgb24gdGhlIG1hc2sgKi8KLSAgICBpZiAocF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fTUlUTSkKLSAgICAgIHBfZGF0YS0+YXV0aF9yZXEgfD0gQlRNX0xFX0FVVEhfUkVRX01JVE07Ci0KLSAgICBpZiAoIShwX2RhdGEtPmF1dGhfcmVxICYgU01QX0FVVEhfQk9ORCkpIHsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiTm9uIGJvbmRpbmc6IE5vIGtleXMgc2hvdWxkIGJlIGV4Y2hhbmdlZCIpOwotICAgICAgcF9kYXRhLT5pbml0X2tleXMgPSAwOwotICAgICAgcF9kYXRhLT5yZXNwX2tleXMgPSAwOwotICAgIH0KLQotICAgIEJUTV9UUkFDRV9ERUJVRygiYnRtX2JsZV9pb19jYXBhYmlsaXRpZXNfcmVxIDM6IGF1dGhfcmVxOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5hdXRoX3JlcSk7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX2lvX2NhcGFiaWxpdGllc19yZXEgNDogaV9rZXlzPTB4JXggcl9rZXlzPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmluaXRfa2V5cywgcF9kYXRhLT5yZXNwX2tleXMpOwotCi0gICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAiYnRtX2JsZV9pb19jYXBhYmlsaXRpZXNfcmVxIDU6IHBfZGF0YS0+aW9fY2FwID0gJWQgYXV0aF9yZXE6JWQiLAotICAgICAgICBwX2RhdGEtPmlvX2NhcCwgcF9kYXRhLT5hdXRoX3JlcSk7Ci0KLSAgICAvKiByZW1vdmUgTUlUTSBwcm90ZWN0aW9uIHJlcXVpcmVtZW50IGlmIElPIGNhcCBkb2VzIG5vdCBhbGxvdyBpdCAqLwotICAgIGlmICgocF9kYXRhLT5pb19jYXAgPT0gQlRNX0lPX0NBUF9OT05FKSAmJiBwX2RhdGEtPm9vYl9kYXRhID09IFNNUF9PT0JfTk9ORSkKLSAgICAgIHBfZGF0YS0+YXV0aF9yZXEgJj0gfkJUTV9MRV9BVVRIX1JFUV9NSVRNOwotCi0gICAgaWYgKCEocF9kYXRhLT5hdXRoX3JlcSAmIFNNUF9TQ19TVVBQT1JUX0JJVCkpIHsKLSAgICAgIC8qIGlmIFNlY3VyZSBDb25uZWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCB0aGVuIHJlbW92ZSBMSyBkZXJpdmF0aW9uLAotICAgICAgKiogYW5kIGtleXByZXNzIG5vdGlmaWNhdGlvbnMuCi0gICAgICAqLwotICAgICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAgICIlcy1TQyBub3Qgc3VwcG9ydGVkIC0+IE5vIExLIGRlcml2YXRpb24sIG5vIGtleXByZXNzIG5vdGlmaWNhdGlvbnMiLAotICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIHBfZGF0YS0+YXV0aF9yZXEgJj0gflNNUF9LUF9TVVBQT1JUX0JJVDsKLSAgICAgIHBfZGF0YS0+aW5pdF9rZXlzICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotICAgICAgcF9kYXRhLT5yZXNwX2tleXMgJj0gflNNUF9TRUNfS0VZX1RZUEVfTEs7Ci0gICAgfQotCi0gICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAiYnRtX2JsZV9pb19jYXBhYmlsaXRpZXNfcmVxIDY6IElPX0NBUDolZCBvb2JfZGF0YTolZCBhdXRoX3JlcToweCUwMngiLAotICAgICAgICBwX2RhdGEtPmlvX2NhcCwgcF9kYXRhLT5vb2JfZGF0YSwgcF9kYXRhLT5hdXRoX3JlcSk7Ci0gIH0KLSAgcmV0dXJuIGNhbGxiYWNrX3JjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9icl9rZXlzX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaGFuZGxlIFNNUCByZXF1ZXN0IGZvciBrZXlzIHNlbnQKLSAqICAgICAgICAgICAgICAgICAgb3ZlciBCUi9FRFIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgYnRtX2JsZV9icl9rZXlzX3JlcSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9JT19SRVEqIHBfZGF0YSkgewotICB1aW50OF90IGNhbGxiYWNrX3JjID0gQlRNX1NVQ0NFU1M7Ci0gIEJUTV9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2spIHsKLSAgICAvKiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSB0aGUgSU8gY2FwYWJpbGl0eS4uLiAqLwotICAgIGNhbGxiYWNrX3JjID0gKCpidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2spKAotICAgICAgICBCVE1fTEVfSU9fUkVRX0VWVCwgcF9kZXZfcmVjLT5iZF9hZGRyLCAodEJUTV9MRV9FVlRfREFUQSopcF9kYXRhKTsKLSAgfQotCi0gIHJldHVybiBjYWxsYmFja19yYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfY29ubmVjdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHdoZW4gYSBMRSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIGRldmljZSBpcwotICogICAgICAgICAgICAgICAgICBlc3RhYmxzaWhlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGVuY19tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJvbGUsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRyX21hdGNoZWQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkYSk7Ci0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgTE9HX0lORk8oIkNyZWF0aW5nIG5ldyBkZXZpY2UgcmVjb3JkIGZvciBuZXcgYmxlIGNvbm5lY3Rpb24iKTsKLSAgICBwX2Rldl9yZWMgPSBidG1fc2VjX2FsbG9jX2RldihiZGEpOwotICAgIGlmIChwX2Rldl9yZWMgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBjcmVhdGUgZGV2aWNlIHJlY29yZCBmb3IgbmV3IGJsZSBjb25uZWN0aW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJVcGRhdGluZyBkZXZpY2UgcmVjb3JkIHRpbWVzdGFtcCBmb3IgZXhpc3RpbmcgYmxlIGNvbm5lY3Rpb24iKTsKLSAgICAvLyBUT0RPKCkgV2h5IGlzIHRpbWVzdGFtcCBhIGNvdW50ZXIgPwotICAgIHBfZGV2X3JlYy0+dGltZXN0YW1wID0gYnRtX2NiLmRldl9yZWNfY291bnQrKzsKLSAgfQotCi0gIHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGUgPSBhZGRyX3R5cGU7Ci0gIHBfZGV2X3JlYy0+YmxlLnBzZXVkb19hZGRyID0gYmRhOwotICBwX2Rldl9yZWMtPmJsZV9oY2lfaGFuZGxlID0gaGFuZGxlOwotICBwX2Rldl9yZWMtPmRldmljZV90eXBlIHw9IEJUX0RFVklDRV9UWVBFX0JMRTsKLSAgcF9kZXZfcmVjLT5yb2xlX2NlbnRyYWwgPSAocm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSA/IHRydWUgOiBmYWxzZTsKLQotICBpZiAoIWFkZHJfbWF0Y2hlZCkgewotICAgIHBfZGV2X3JlYy0+YmxlLmFjdGl2ZV9hZGRyX3R5cGUgPSB0QlRNX1NFQ19CTEU6OkJUTV9CTEVfQUREUl9QU0VVRE87Ci0gICAgaWYgKHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGUgPT0gQkxFX0FERFJfUkFORE9NKSB7Ci0gICAgICBwX2Rldl9yZWMtPmJsZS5jdXJfcmFuZF9hZGRyID0gYmRhOwotICAgIH0KLSAgfQotICBidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmRpcmVjdGVkX2Nvbm4gPSBCVE1fQkxFX0FEVl9JTkRfRVZUOwotfQotCi12b2lkIGJ0bV9ibGVfY29ubmVjdGVkX2Zyb21fYWRkcmVzc193aXRoX3R5cGUoCi0gICAgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGVuY19tb2RlLAotICAgIHVpbnQ4X3Qgcm9sZSwgYm9vbCBhZGRyX21hdGNoZWQpIHsKLSAgYnRtX2JsZV9jb25uZWN0ZWQoYWRkcmVzc193aXRoX3R5cGUuYmRhLCBoYW5kbGUsIGVuY19tb2RlLCByb2xlLAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZS50eXBlLCBhZGRyX21hdGNoZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBGdW5jdGlvbiAgICAgICAgYnRtX3Byb2Nfc21wX2NiYWNrCi0gKgotICogIERlc2NyaXB0aW9uICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBTTVAgY2FsbGJhY2sgaGFuZGxlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fcHJvY19zbXBfY2JhY2sodFNNUF9FVlQgZXZlbnQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9FVlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgdEJUTV9TVEFUVVMgcmVzID0gQlRNX1NVQ0NFU1M7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fcHJvY19zbXBfY2JhY2sgZXZlbnQgPSAlZCIsIGV2ZW50KTsKLQotICBpZiAocF9kZXZfcmVjICE9IE5VTEwpIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICBjYXNlIFNNUF9JT19DQVBfUkVRX0VWVDoKLSAgICAgICAgYnRtX2JsZV9pb19jYXBhYmlsaXRpZXNfcmVxKHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRNX0xFX0lPX1JFUSopJnBfZGF0YS0+aW9fcmVxKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgU01QX0JSX0tFWVNfUkVRX0VWVDoKLSAgICAgICAgYnRtX2JsZV9icl9rZXlzX3JlcShwX2Rldl9yZWMsICh0QlRNX0xFX0lPX1JFUSopJnBfZGF0YS0+aW9fcmVxKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgU01QX1BBU1NLRVlfUkVRX0VWVDoKLSAgICAgIGNhc2UgU01QX1BBU1NLRVlfTk9USUZfRVZUOgotICAgICAgY2FzZSBTTVBfT09CX1JFUV9FVlQ6Ci0gICAgICBjYXNlIFNNUF9OQ19SRVFfRVZUOgotICAgICAgY2FzZSBTTVBfU0NfT09CX1JFUV9FVlQ6Ci0gICAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRDsKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0KLSAgICAgIGNhc2UgU01QX0NPTlNFTlRfUkVRX0VWVDoKLSAgICAgIGNhc2UgU01QX1NFQ19SRVFVRVNUX0VWVDoKLSAgICAgICAgaWYgKGV2ZW50ID09IFNNUF9TRUNfUkVRVUVTVF9FVlQgJiYKLSAgICAgICAgICAgIGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpIHsKLSAgICAgICAgICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBJZ25vcmluZyBTTVAgU2VjdXJpdHkgcmVxdWVzdCIsIF9fZnVuY19fKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBidG1fY2IucGFpcmluZ19iZGEgPSBiZF9hZGRyOwotICAgICAgICBpZiAoZXZlbnQgIT0gU01QX0NPTlNFTlRfUkVRX0VWVCkgewotICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORzsKLSAgICAgICAgfQotICAgICAgICBidG1fY2IucGFpcmluZ19mbGFncyB8PSBCVE1fUEFJUl9GTEFHU19MRV9BQ1RJVkU7Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotCi0gICAgICBjYXNlIFNNUF9DT01QTFRfRVZUOgotICAgICAgICBpZiAoYnRtX2NiLmFwaS5wX2xlX2NhbGxiYWNrKSB7Ci0gICAgICAgICAgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgdGhlIElPCi0gICAgICAgICAgICogY2FwYWJpbGl0eS4uLiAqLwotICAgICAgICAgIEJUTV9UUkFDRV9ERUJVRygiYnRtX2NiLmFwaS5wX2xlX2NhbGxiYWNrPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2spOwotICAgICAgICAgICgqYnRtX2NiLmFwaS5wX2xlX2NhbGxiYWNrKShldmVudCwgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVE1fTEVfRVZUX0RBVEEqKXBfZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXZlbnQgPT0gU01QX0NPTVBMVF9FVlQpIHsKLSAgICAgICAgICBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gICAgICAgICAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBwX2Rldl9yZWMgaXMgTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTIwNjEyNzQ0Iik7Ci0gICAgICAgICAgICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICAgImV2dD1TTVBfQ09NUExUX0VWVCBiZWZvcmUgdXBkYXRlIHNlY19sZXZlbD0weCV4IHNlY19mbGFncz0weCV4IiwKLSAgICAgICAgICAgICAgcF9kYXRhLT5jbXBsdC5zZWNfbGV2ZWwsIHBfZGV2X3JlYy0+c2VjX2ZsYWdzKTsKLQotICAgICAgICAgIHJlcyA9IChwX2RhdGEtPmNtcGx0LnJlYXNvbiA9PSBTTVBfU1VDQ0VTUykgPyBCVE1fU1VDQ0VTUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVE1fRVJSX1BST0NFU1NJTkc7Ci0KLSAgICAgICAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICJhZnRlciB1cGRhdGUgcmVzdWx0PSVkIHNlY19sZXZlbD0weCV4IHNlY19mbGFncz0weCV4IiwgcmVzLAotICAgICAgICAgICAgICBwX2RhdGEtPmNtcGx0LnNlY19sZXZlbCwgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotCi0gICAgICAgICAgaWYgKHBfZGF0YS0+Y21wbHQuaXNfcGFpcl9jYW5jZWwgJiYKLSAgICAgICAgICAgICAgYnRtX2NiLmFwaS5wX2JvbmRfY2FuY2VsX2NtcGxfY2FsbGJhY2spIHsKLSAgICAgICAgICAgIEJUTV9UUkFDRV9ERUJVRygiUGFpcmluZyBDYW5jZWwgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAoKmJ0bV9jYi5hcGkucF9ib25kX2NhbmNlbF9jbXBsX2NhbGxiYWNrKShCVE1fU1VDQ0VTUyk7Ci0gICAgICAgICAgfQotI2lmIChCVE1fQkxFX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRSkKLSAgICAgICAgICBpZiAocmVzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBpZiAoIWJ0bV9jYi5kZXZjYi5ub19kaXNjX2lmX3BhaXJfZmFpbCAmJgotICAgICAgICAgICAgICAgIHBfZGF0YS0+Y21wbHQucmVhc29uICE9IFNNUF9DT05OX1RPVVQpIHsKLSAgICAgICAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCJQYWlyaW5nIGZhaWxlZCAtIHByZXBhcmUgdG8gcmVtb3ZlIEFDTCIpOwotICAgICAgICAgICAgICBsMmN1X3N0YXJ0X3Bvc3RfYm9uZF90aW1lcihwX2Rldl9yZWMtPmJsZV9oY2lfaGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIEJUTV9UUkFDRV9ERUJVRygiUGFpcmluZyBmYWlsZWQgLSBOb3QgUmVtb3ZpbmcgQUNMIik7Ci0gICAgICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9JRExFOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgaWYgKHJlcyAhPSBCVE1fU1VDQ0VTUyAmJiBwX2RhdGEtPmNtcGx0LnJlYXNvbiAhPSBTTVBfQ09OTl9UT1VUKSB7Ci0gICAgICAgICAgICBCVE1fVFJBQ0VfREVCVUcoIlBhaXJpbmcgZmFpbGVkIC0gcHJlcGFyZSB0byByZW1vdmUgQUNMIik7Ci0gICAgICAgICAgICBsMmN1X3N0YXJ0X3Bvc3RfYm9uZF90aW1lcihwX2Rldl9yZWMtPmJsZV9oY2lfaGFuZGxlKTsKLSAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICAgImJ0bV9jYiBwYWlyaW5nX3N0YXRlPSV4IHBhaXJpbmdfZmxhZ3M9JXggcGluX2NvZGVfbGVuPSV4IiwKLSAgICAgICAgICAgICAgYnRtX2NiLnBhaXJpbmdfc3RhdGUsIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzLCBidG1fY2IucGluX2NvZGVfbGVuKTsKLSAgICAgICAgICBWTE9HKDEpIDw8ICJidG1fY2IucGFpcmluZ19iZGE6ICIgPDwgYnRtX2NiLnBhaXJpbmdfYmRhOwotCi0gICAgICAgICAgLyogUmVzZXQgYnRtIHN0YXRlIG9ubHkgaWYgdGhlIGNhbGxiYWNrIGFkZHJlc3MgbWF0Y2hlcyBwYWlyaW5nCi0gICAgICAgICAgICogYWRkcmVzcyovCi0gICAgICAgICAgaWYgKGJkX2FkZHIgPT0gYnRtX2NiLnBhaXJpbmdfYmRhKSB7Ci0gICAgICAgICAgICBidG1fY2IucGFpcmluZ19iZGEgPSBSYXdBZGRyZXNzOjprQW55OwotICAgICAgICAgICAgYnRtX2NiLnBhaXJpbmdfc3RhdGUgPSBCVE1fUEFJUl9TVEFURV9JRExFOwotICAgICAgICAgICAgYnRtX2NiLnBhaXJpbmdfZmxhZ3MgPSAwOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChyZXMgPT0gQlRNX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9JRExFOwotICAgICAgICAgICAgLyogYWRkIGFsbCBib25kZWQgZGV2aWNlIGludG8gcmVzb2x2aW5nIGxpc3QgaWYgSVJLIGlzIGF2YWlsYWJsZSovCi0gICAgICAgICAgICBidG1fYmxlX3Jlc29sdmluZ19saXN0X2xvYWRfZGV2KHBfZGV2X3JlYyk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnRtX3NlY19kZXZfcmVjX2NiYWNrX2V2ZW50KHBfZGV2X3JlYywgcmVzLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCJ1bmtub3duIGV2ZW50ID0gJWQiLCBldmVudCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBJZiB3ZSBhcmUgYmVpbmcgcGFpcmVkIHdpdGggdmlhIE9PQiB3ZSBoYXZlbid0IGNyZWF0ZWQgYSBkZXYgcmVjIGZvcgotICAgIC8vIHRoZSBkZXZpY2UgeWV0Ci0gICAgaWYgKGV2ZW50ID09IFNNUF9TQ19MT0NfT09CX0RBVEFfVVBfRVZUKSB7Ci0gICAgICBidG1fc2VjX2NyX2xvY19vb2JfZGF0YV9jYmFja19ldmVudChiZF9hZGRyLCBwX2RhdGEtPmxvY19vb2JfZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19XQVJOKCJVbmV4cGVjdGVkIGV2ZW50ICclZCcgd2l0aG91dCBwX2Rldl9yZWMiLCBldmVudCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZURhdGFTaWduYXR1cmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNpZ24gdGhlIGRhdGEgdXNpbmcgQUVTMTI4IENNQUMKLSAqICAgICAgICAgICAgICAgICAgYWxnb3JpdGguCi0gKgotICogUGFyYW1ldGVyICAgICAgICBiZF9hZGRyOiB0YXJnZXQgZGV2aWNlIHRoZSBkYXRhIHRvIGJlIHNpZ25lZCBmb3IuCi0gKiAgICAgICAgICAgICAgICAgIHBfdGV4dDogc2luZ2luZyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIGxlbjogbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHNpZ25lZC4KLSAqICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOiBvdXRwdXQgcGFyYW1ldGVyIHdoZXJlIGRhdGEgc2lnbmF0dXJlIGlzIGdvaW5nIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzaWduaW5nIHN1Y2Vzc3VsLCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0JsZURhdGFTaWduYXR1cmUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCogcF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIEJMRV9TSUdOQVRVUkUgc2lnbmF0dXJlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZURhdGFTaWduYXR1cmUoYmRfYWRkciwgcF90ZXh0LCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlKTsKLSAgfQotICB0QlRNX1NFQ19ERVZfUkVDKiBwX3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLQotICBCVE1fVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBpZiAocF9yZWMgPT0gTlVMTCkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXMtZGF0YSBzaWduaW5nIGNhbiBub3QgYmUgZG9uZSBmcm9tIHVua25vd24gZGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ4X3QqIHBfbWFjID0gKHVpbnQ4X3QqKXNpZ25hdHVyZTsKLSAgdWludDhfdCogcHA7Ci0gIHVpbnQ4X3QqIHBfYnVmID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MobGVuICsgNCk7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlcy1TdGFydCB0byBnZW5lcmF0ZSBMb2NhbCBDU1JLIiwgX19mdW5jX18pOwotICBwcCA9IHBfYnVmOwotICAvKiBwcmVwYXJlIHBsYWluIHRleHQgKi8KLSAgaWYgKHBfdGV4dCkgewotICAgIG1lbWNweShwX2J1ZiwgcF90ZXh0LCBsZW4pOwotICAgIHBwID0gKHBfYnVmICsgbGVuKTsKLSAgfQotCi0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHBfcmVjLT5ibGUua2V5cy5sb2NhbF9jb3VudGVyKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwX21hYywgcF9yZWMtPmJsZS5rZXlzLmxvY2FsX2NvdW50ZXIpOwotCi0gIGNyeXB0b190b29sYm94OjphZXNfY21hYyhwX3JlYy0+YmxlLmtleXMubGNzcmssIHBfYnVmLCAodWludDE2X3QpKGxlbiArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0NNQUNfVExFTl9TSVpFLCBwX21hYyk7Ci0gIGJ0bV9ibGVfaW5jcmVtZW50X3NpZ25fY3RyKGJkX2FkZHIsIHRydWUpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXMgcF9tYWMgPSAlZCIsIF9fZnVuY19fLCBwX21hYyk7Ci0gIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICJwX21hY1swXSA9IDB4JTAyeCBwX21hY1sxXSA9IDB4JTAyeCBwX21hY1syXSA9IDB4JTAyeCBwX21hY1szXSA9ICIKLSAgICAgICIweCUwMngiLAotICAgICAgKnBfbWFjLCAqKHBfbWFjICsgMSksICoocF9tYWMgKyAyKSwgKihwX21hYyArIDMpKTsKLSAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgInBfbWFjWzRdID0gMHglMDJ4IHBfbWFjWzVdID0gMHglMDJ4IHBfbWFjWzZdID0gMHglMDJ4IHBfbWFjWzddID0gIgotICAgICAgIjB4JTAyeCIsCi0gICAgICAqKHBfbWFjICsgNCksICoocF9tYWMgKyA1KSwgKihwX21hYyArIDYpLCAqKHBfbWFjICsgNykpOwotICBvc2lfZnJlZShwX2J1Zik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVZlcmlmeVNpZ25hdHVyZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IHRoZSBkYXRhIHNpZ25hdHVyZQotICoKLSAqIFBhcmFtZXRlciAgICAgICAgYmRfYWRkcjogdGFyZ2V0IGRldmljZSB0aGUgZGF0YSB0byBiZSBzaWduZWQgZm9yLgotICogICAgICAgICAgICAgICAgICBwX29yaWc6ICBvcmlnaW5hbCBkYXRhIGJlZm9yZSBzaWduYXR1cmUuCi0gKiAgICAgICAgICAgICAgICAgIGxlbjogbGVuZ3RoIG9mIHRoZSBzaWduaW5nIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlciB1c2VkIHdoZW4gZG9pbmcgZGF0YSBzaWduaW5nCi0gKiAgICAgICAgICAgICAgICAgIHBfY29tcDogc2lnbmF0dXJlIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QuCi0KLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzaWduYXR1cmUgdmVyaWZpZWQgY29ycmVjdGx5OyBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0JsZVZlcmlmeVNpZ25hdHVyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90KiBwX29yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50MzJfdCBjb3VudGVyLCB1aW50OF90KiBwX2NvbXApIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlVmVyaWZ5U2lnbmF0dXJlKGJkX2FkZHIsIHBfb3JpZywgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciwgcF9jb21wKTsKLSAgfQotICBib29sIHZlcmlmaWVkID0gZmFsc2U7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICB1aW50OF90IHBfbWFjW0JUTV9DTUFDX1RMRU5fU0laRV07Ci0KLSAgaWYgKHBfcmVjID09IE5VTEwgfHwgKHBfcmVjICYmICEocF9yZWMtPmJsZS5rZXlfdHlwZSAmIEJUTV9MRV9LRVlfUENTUkspKSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiY2FuIG5vdCB2ZXJpZnkgc2lnbmF0dXJlIGZvciB1bmtub3duIGRldmljZSIpOwotICB9IGVsc2UgaWYgKGNvdW50ZXIgPCBwX3JlYy0+YmxlLmtleXMuY291bnRlcikgewotICAgIEJUTV9UUkFDRV9FUlJPUigic2lnbmF0dXJlIHJlY2VpdmVkIHdpdGggb3V0IGRhdGVkIHNpZ24gY291bnRlciIpOwotICB9IGVsc2UgaWYgKHBfb3JpZyA9PSBOVUxMKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJObyBzaWduYXR1cmUgdG8gdmVyaWZ5Iik7Ci0gIH0gZWxzZSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlcyByY3ZfY250PSVkID49IGV4cGVjdGVkX2NudD0lZCIsIF9fZnVuY19fLCBjb3VudGVyLAotICAgICAgICAgICAgICAgICAgICBwX3JlYy0+YmxlLmtleXMuY291bnRlcik7Ci0KLSAgICBjcnlwdG9fdG9vbGJveDo6YWVzX2NtYWMocF9yZWMtPmJsZS5rZXlzLnBjc3JrLCBwX29yaWcsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0NNQUNfVExFTl9TSVpFLCBwX21hYyk7Ci0gICAgaWYgKG1lbWNtcChwX21hYywgcF9jb21wLCBCVE1fQ01BQ19UTEVOX1NJWkUpID09IDApIHsKLSAgICAgIGJ0bV9ibGVfaW5jcmVtZW50X3NpZ25fY3RyKGJkX2FkZHIsIGZhbHNlKTsKLSAgICAgIHZlcmlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZlcmlmaWVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBMRSBkZXZpY2UgSVIvRVIgZ2VuZXJhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIG5vdGlmeSBhcHBsaWNhdGlvbiBuZXcga2V5cyBoYXZlIGJlZW4gZ2VuZXJhdGVkLiAqLwotc3RhdGljIHZvaWQgYnRtX25vdGlmeV9uZXdfa2V5KHVpbnQ4X3Qga2V5X3R5cGUpIHsKLSAgdEJUTV9CTEVfTE9DQUxfS0VZUyogcF9sb2NhbF9rZXlzID0gTlVMTDsKLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ub3RpZnlfbmV3X2tleSBrZXlfdHlwZT0lZCIsIGtleV90eXBlKTsKLQotICBpZiAoYnRtX2NiLmFwaS5wX2xlX2tleV9jYWxsYmFjaykgewotICAgIHN3aXRjaCAoa2V5X3R5cGUpIHsKLSAgICAgIGNhc2UgQlRNX0JMRV9LRVlfVFlQRV9JRDoKLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCJCVE1fQkxFX0tFWV9UWVBFX0lEIik7Ci0gICAgICAgIHBfbG9jYWxfa2V5cyA9ICh0QlRNX0JMRV9MT0NBTF9LRVlTKikmYnRtX2NiLmRldmNiLmlkX2tleXM7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJUTV9CTEVfS0VZX1RZUEVfRVI6Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygiQlRNX0JMRV9LRVlfVFlQRV9FUiIpOwotICAgICAgICBwX2xvY2FsX2tleXMgPQotICAgICAgICAgICAgKHRCVE1fQkxFX0xPQ0FMX0tFWVMqKSZidG1fY2IuZGV2Y2IuYmxlX2VuY3J5cHRpb25fa2V5X3ZhbHVlOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQlRNX1RSQUNFX0VSUk9SKCJ1bmtub3duIGtleSB0eXBlOiAlZCIsIGtleV90eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChwX2xvY2FsX2tleXMgIT0gTlVMTCkKLSAgICAgICgqYnRtX2NiLmFwaS5wX2xlX2tleV9jYWxsYmFjaykoa2V5X3R5cGUsIHBfbG9jYWxfa2V5cyk7Ci0gIH0KLX0KLQotLyoqIGltcGxlbWVudGF0aW9uIG9mIGJ0bV9ibGVfcmVzZXRfaWQgKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfcmVzZXRfaWRfaW1wbChjb25zdCBPY3RldDE2JiByYW5kMSwgY29uc3QgT2N0ZXQxNiYgcmFuZDIpIHsKLSAgLyogUmVnZW5lcmF0ZSBJZGVudGl0eSBSb290ICovCi0gIGJ0bV9jYi5kZXZjYi5pZF9rZXlzLmlyID0gcmFuZDE7Ci0gIHVpbnQ4X3QgYnRtX2JsZV9kaGtfcHQgPSAweDAzOwotCi0gIC8qIGdlbmVyYXRlIERISz0gRWlyKHsweDAzLCAweDAwLCAweDAwIC4uLn0pICovCi0gIGJ0bV9jYi5kZXZjYi5pZF9rZXlzLmRoayA9Ci0gICAgICBjcnlwdG9fdG9vbGJveDo6YWVzXzEyOChidG1fY2IuZGV2Y2IuaWRfa2V5cy5pciwgJmJ0bV9ibGVfZGhrX3B0LCAxKTsKLQotICB1aW50OF90IGJ0bV9ibGVfaXJrX3B0ID0gMHgwMTsKLSAgLyogSVJLID0gRDEoSVIsIDEpICovCi0gIGJ0bV9jYi5kZXZjYi5pZF9rZXlzLmlyayA9Ci0gICAgICBjcnlwdG9fdG9vbGJveDo6YWVzXzEyOChidG1fY2IuZGV2Y2IuaWRfa2V5cy5pciwgJmJ0bV9ibGVfaXJrX3B0LCAxKTsKLQotICBidG1fbm90aWZ5X25ld19rZXkoQlRNX0JMRV9LRVlfVFlQRV9JRCk7Ci0KLSAgLyogaWYgcHJpdmFjeSBpcyBlbmFibGVkLCBuZXcgUlBBIHNob3VsZCBiZSBjYWxjdWxhdGVkICovCi0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5wcml2YWN5X21vZGUgIT0gQlRNX1BSSVZBQ1lfTk9ORSkgewotICAgIGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoYmFzZTo6QmluZCgmYnRtX2dlbl9yZXNvbHZlX3BhZGRyX2xvdykpOwotICB9Ci0KLSAgLyogcHJvY2VlZCBnZW5lcmF0ZSBFUiAqLwotICBidG1fY2IuZGV2Y2IuYmxlX2VuY3J5cHRpb25fa2V5X3ZhbHVlID0gcmFuZDI7Ci0gIGJ0bV9ub3RpZnlfbmV3X2tleShCVE1fQkxFX0tFWV9UWVBFX0VSKTsKLX0KLQotc3RydWN0IHJlc2V0X2lkX2RhdGEgewotICBPY3RldDE2IHJhbmQxOwotICBPY3RldDE2IHJhbmQyOwotfTsKLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlc2V0IExFIGRldmljZSBpZGVudGl0eS4gKi8KLXZvaWQgYnRtX2JsZV9yZXNldF9pZCh2b2lkKSB7Ci0gIEJUTV9UUkFDRV9ERUJVRygiYnRtX2JsZV9yZXNldF9pZCIpOwotCi0gIC8qIEluIG9yZGVyIHRvIHJlc2V0IGlkZW50aXR5LCB3ZSBuZWVkIGZvdXIgcmFuZG9tIG51bWJlcnMuIE1ha2UgZm91ciBuZXN0ZWQKLSAgICogY2FsbHMgdG8gZ2VuZXJhdGUgdGhlbSBmaXJzdCwgdGhlbiBwcm9jZWVkIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCByZXNldCBpbgotICAgKiBidG1fYmxlX3Jlc2V0X2lkX2ltcGwuICovCi0gIGJ0c25kX2hjaWNfYmxlX3JhbmQoYmFzZTo6QmluZChbXShCVF9PQ1RFVDggcmFuZCkgewotICAgIHJlc2V0X2lkX2RhdGEgdG1wOwotICAgIG1lbWNweSh0bXAucmFuZDEuZGF0YSgpLCByYW5kLCBCVF9PQ1RFVDhfTEVOKTsKLSAgICBidHNuZF9oY2ljX2JsZV9yYW5kKGJhc2U6OkJpbmQoCi0gICAgICAgIFtdKHJlc2V0X2lkX2RhdGEgdG1wLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICAgIG1lbWNweSh0bXAucmFuZDEuZGF0YSgpICsgOCwgcmFuZCwgQlRfT0NURVQ4X0xFTik7Ci0gICAgICAgICAgYnRzbmRfaGNpY19ibGVfcmFuZChiYXNlOjpCaW5kKAotICAgICAgICAgICAgICBbXShyZXNldF9pZF9kYXRhIHRtcCwgQlRfT0NURVQ4IHJhbmQpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkodG1wLnJhbmQyLmRhdGEoKSwgcmFuZCwgQlRfT0NURVQ4X0xFTik7Ci0gICAgICAgICAgICAgICAgYnRzbmRfaGNpY19ibGVfcmFuZChiYXNlOjpCaW5kKAotICAgICAgICAgICAgICAgICAgICBbXShyZXNldF9pZF9kYXRhIHRtcCwgQlRfT0NURVQ4IHJhbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkodG1wLnJhbmQyLmRhdGEoKSArIDgsIHJhbmQsIEJUX09DVEVUOF9MRU4pOwotICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYWxsIHJhbmRvbSBudW1iZXJzIGFyZSByZWFkeSwgZG8gdGhlIGFjdHVhbCByZXNldC4KLSAgICAgICAgICAgICAgICAgICAgICBidG1fYmxlX3Jlc2V0X2lkX2ltcGwodG1wLnJhbmQxLCB0bXAucmFuZDIpOwotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICB0bXApKTsKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgdG1wKSk7Ci0gICAgICAgIH0sCi0gICAgICAgIHRtcCkpOwotICB9KSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2V0IGEgcmFuZG9tIGFkZHJlc3MgdG8gbG9jYWwgY29udHJvbGxlci4gSXQgYWxzbyB0ZW1wb3JhcmlseQotICogZGlzYWJsZSBzY2FucyBhbmQgYWR2IGJlZm9yZSBzZW5kaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLiAqLwotdm9pZCBidG1fYmxlX3NldF9yYW5kb21fYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYmRhKSB7Ci0gIHRCVE1fTEVfUkFORE9NX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiLmFkZHJfbWdudF9jYjsKLSAgdEJUTV9CTEVfQ0IqIHBfYmxlX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotICBjb25zdCBib29sIGFkdl9tb2RlID0gYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3Zhci5hZHZfbW9kZTsKLQotICBpZiAoYWR2X21vZGUgPT0gQlRNX0JMRV9BRFZfRU5BQkxFKQotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZW5hYmxlKEJUTV9CTEVfQURWX0RJU0FCTEUpOwotICBpZiAocF9ibGVfY2ItPmlzX2JsZV9zY2FuX2FjdGl2ZSgpKSB7Ci0gICAgYnRtX2JsZV9zdG9wX3NjYW4oKTsKLSAgfQotICBidG1fYmxlX3N1c3BlbmRfYmdfY29ubigpOwotCi0gIHBfY2ItPnByaXZhdGVfYWRkciA9IHJhbmRvbV9iZGE7Ci0gIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kb21fYWRkcihwX2NiLT5wcml2YXRlX2FkZHIpOwotICBMT0dfREVCVUcoIlVwZGF0aW5nIGxvY2FsIHJhbmRvbSBhZGRyZXNzOiVzIiwgUFJJVkFURV9BRERSRVNTKHJhbmRvbV9iZGEpKTsKLQotICBpZiAoYWR2X21vZGUgPT0gQlRNX0JMRV9BRFZfRU5BQkxFKQotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZW5hYmxlKEJUTV9CTEVfQURWX0VOQUJMRSk7Ci0gIGlmIChwX2JsZV9jYi0+aXNfYmxlX3NjYW5fYWN0aXZlKCkpIHsKLSAgICBidG1fYmxlX3N0YXJ0X3NjYW4oKTsKLSAgfQotICBidG1fYmxlX3Jlc3VtZV9iZ19jb25uKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2dldF9hY2xfcmVtb3RlX2FkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGFjdGl2ZSByZW1vdGUgYWRkcmVzcyB1c2VkIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN1Y2Nlc3MgcmV0dXJuIHRydWUsIG90aGVyd2lzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fYmxlX2dldF9hY2xfcmVtb3RlX2FkZHIodWludDE2X3QgaGNpX2hhbmRsZSwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUoaGNpX2hhbmRsZSk7Ci0gIGlmIChwX2Rldl9yZWMgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBzZWN1cml0eSBkZXZpY2UgcmVjb3JkIGhjaV9oYW5kbGU6JWh1IiwKLSAgICAgICAgICAgICBoY2lfaGFuZGxlKTsKLSAgICAvLyBUT0RPIFJlbGVhc2UgYWNsIHJlc291cmNlCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBzdCA9IHRydWU7Ci0KLSAgc3dpdGNoIChwX2Rldl9yZWMtPmJsZS5hY3RpdmVfYWRkcl90eXBlKSB7Ci0gICAgY2FzZSB0QlRNX1NFQ19CTEU6OkJUTV9CTEVfQUREUl9QU0VVRE86Ci0gICAgICBjb25uX2FkZHIgPSBwX2Rldl9yZWMtPmJkX2FkZHI7Ci0gICAgICAqcF9hZGRyX3R5cGUgPSBwX2Rldl9yZWMtPmJsZS5ibGVfYWRkcl90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHRCVE1fU0VDX0JMRTo6QlRNX0JMRV9BRERSX1JSQToKLSAgICAgIGNvbm5fYWRkciA9IHBfZGV2X3JlYy0+YmxlLmN1cl9yYW5kX2FkZHI7Ci0gICAgICAqcF9hZGRyX3R5cGUgPSBCTEVfQUREUl9SQU5ET007Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdEJUTV9TRUNfQkxFOjpCVE1fQkxFX0FERFJfU1RBVElDOgotICAgICAgY29ubl9hZGRyID0gcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhOwotICAgICAgKnBfYWRkcl90eXBlID0gcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCByZWNvcmQgd2l0aCBhY3RpdmUgYWRkcmVzcyB0eXBlOiAlZCIsCi0gICAgICAgICAgICAgICBwX2Rldl9yZWMtPmJsZS5hY3RpdmVfYWRkcl90eXBlKTsKLSAgICAgIHN0ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gc3Q7Ci19Ci0KLSNpZiBCVE1fQkxFX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc2V0X25vX2Rpc2NfaWZfcGFpcl9mYWlsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyB3aGV0aGVyIG5vIGRpc2Nvbm5lY3Qgb2YgdGhlIEFDTAotICogICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpZiBwYWlyaW5nIGZhaWxlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfc2V0X25vX2Rpc2NfaWZfcGFpcl9mYWlsKGJvb2wgZGlzYWJsZV9kaXNjKSB7Ci0gIEJUTV9UUkFDRV9ERUJVRygiYnRtX2JsZV9zZXRfZGlzY19lbmFibGVfaWZfcGFpcl9mYWlsIGRpc2FibGVfZGlzYz0lZCIsCi0gICAgICAgICAgICAgICAgICBkaXNhYmxlX2Rpc2MpOwotICBidG1fY2IuZGV2Y2Iubm9fZGlzY19pZl9wYWlyX2ZhaWwgPSBkaXNhYmxlX2Rpc2M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3NldF90ZXN0X21hY192YWx1ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXQgdGVzdCBNQUMgdmFsdWUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYmxlX3NldF90ZXN0X21hY192YWx1ZShib29sIGVuYWJsZSwgdWludDhfdCogcF90ZXN0X21hY192YWwpIHsKLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX3NldF90ZXN0X21hY192YWx1ZSBlbmFibGU9JWQiLCBlbmFibGUpOwotICBidG1fY2IuZGV2Y2IuZW5hYmxlX3Rlc3RfbWFjX3ZhbCA9IGVuYWJsZTsKLSAgbWVtY3B5KGJ0bV9jYi5kZXZjYi50ZXN0X21hYywgcF90ZXN0X21hY192YWwsIEJUX09DVEVUOF9MRU4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zZXRfdGVzdF9sb2NhbF9zaWduX2NudHJfdmFsdWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0IHRlc3QgbG9jYWwgc2lnbiBjb3VudGVyIHZhbHVlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9zZXRfdGVzdF9sb2NhbF9zaWduX2NudHJfdmFsdWUoYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlc3RfbG9jYWxfc2lnbl9jbnRyKSB7Ci0gIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICJidG1fYmxlX3NldF90ZXN0X2xvY2FsX3NpZ25fY250cl92YWx1ZSBlbmFibGU9JWQgbG9jYWxfc2lnbl9jbnRyPSVkIiwKLSAgICAgIGVuYWJsZSwgdGVzdF9sb2NhbF9zaWduX2NudHIpOwotICBidG1fY2IuZGV2Y2IuZW5hYmxlX3Rlc3RfbG9jYWxfc2lnbl9jbnRyID0gZW5hYmxlOwotICBidG1fY2IuZGV2Y2IudGVzdF9sb2NhbF9zaWduX2NudHIgPSB0ZXN0X2xvY2FsX3NpZ25fY250cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc2V0X2tlZXBfcmZ1X2luX2F1dGhfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyBpZiBSRlUgYml0cyBoYXZlIHRvIGJlIGtlcHQgYXMgaXMKLSAqICAgICAgICAgICAgICAgICAgKGJ5IGRlZmF1bHQgdGhleSBoYXZlIHRvIGJlIHNldCB0byAwIGJ5IHRoZSBzZW5kZXIpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfc2V0X2tlZXBfcmZ1X2luX2F1dGhfcmVxKGJvb2wga2VlcF9yZnUpIHsKLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX3NldF9rZWVwX3JmdV9pbl9hdXRoX3JlcSBrZWVwX3JmdXM9JWQiLCBrZWVwX3JmdSk7Ci0gIGJ0bV9jYi5kZXZjYi5rZWVwX3JmdV9pbl9hdXRoX3JlcSA9IGtlZXBfcmZ1OwotfQotCi0jZW5kaWYgLyogQlRNX0JMRV9DT05GT1JNQU5DRV9URVNUSU5HICovCmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX2JsZV9hZGRyLmNjIGIvc3RhY2svYnRtL2J0bV9ibGVfYWRkci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYjI1MC4uMDAwMDAwMAotLS0gYS9zdGFjay9idG0vYnRtX2JsZV9hZGRyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgQkxFIGFkZHJlc3MgbWFuYWdlbWVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidG1fYmxlX2ludC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJnYXBfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi12b2lkIGJ0bV9ibGVfc2V0X3JhbmRvbV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIHJhbmRvbV9iZGEpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBSZXNvbHZhYmxlIFByaXZhdGUgQWRkcmVzcyAoUlBBKSBmcm9tIElkZW50aXR5Ci0gKiBSZXNvbHZpbmcgS2V5IHxpcmt8IGFuZCB8cmFuZG9tfCovCi1zdGF0aWMgUmF3QWRkcmVzcyBnZW5lcmF0ZV9ycGFfZnJvbV9pcmtfYW5kX3JhbmQoY29uc3QgT2N0ZXQxNiYgaXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX09DVEVUOCByYW5kb20pIHsKLSAgcmFuZG9tWzJdICY9ICh+QkxFX1JFU09MVkVfQUREUl9NQVNLKTsKLSAgcmFuZG9tWzJdIHw9IEJMRV9SRVNPTFZFX0FERFJfTVNCOwotCi0gIFJhd0FkZHJlc3MgYWRkcmVzczsKLSAgYWRkcmVzcy5hZGRyZXNzWzJdID0gcmFuZG9tWzBdOwotICBhZGRyZXNzLmFkZHJlc3NbMV0gPSByYW5kb21bMV07Ci0gIGFkZHJlc3MuYWRkcmVzc1swXSA9IHJhbmRvbVsyXTsKLQotICAvKiBlbmNyeXB0IHdpdGggSVJLICovCi0gIE9jdGV0MTYgcCA9IGNyeXB0b190b29sYm94OjphZXNfMTI4KGlyaywgcmFuZG9tLCAzKTsKLQotICAvKiBzZXQgaGFzaCB0byBiZSBMU0Igb2YgcnBBZGRyZXNzICovCi0gIGFkZHJlc3MuYWRkcmVzc1s1XSA9IHBbMF07Ci0gIGFkZHJlc3MuYWRkcmVzc1s0XSA9IHBbMV07Ci0gIGFkZHJlc3MuYWRkcmVzc1szXSA9IHBbMl07Ci0gIHJldHVybiBhZGRyZXNzOwotfQotCi1zdGF0aWMgdm9pZCBidG1fYmxlX3JlZnJlc2hfcmFkZHJfdGltZXJfdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5hZGRyX21nbnRfY2Iub3duX2FkZHJfdHlwZSA9PSBCTEVfQUREUl9SQU5ET00pIHsKLSAgICAvKiByZWZyZXNoIHRoZSByYW5kb20gYWRkciAqLwotICAgIGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoYmFzZTo6QmluZCgmYnRtX2dlbl9yZXNvbHZlX3BhZGRyX2xvdykpOwotICB9Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJhbmRvbSBhZGRyZXNzIGZvciBsb2NhbCBjb250cm9sbGVyIHdhcwotICogZ2VuZXJhdGVkICovCi12b2lkIGJ0bV9nZW5fcmVzb2x2ZV9wYWRkcl9sb3coY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAvKiB3aGVuIEdEIGFkdmVydGlzaW5nIGFuZCBzY2FubmluZyBtb2R1bGVzIGFyZSBlbmFibGVkLCBzZXQgcmFuZG9tIGFkZHJlc3MKLSAgICogdmlhIGFkZHJlc3MgbWFuYWdlciBpbiBHRCAqLwotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hZHZlcnRpc2luZ19lbmFibGVkKCkgJiYKLSAgICAgIGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2Nhbm5pbmdfZW5hYmxlZCgpKSB7Ci0gICAgTE9HX0lORk8oIkdEIGFkdmVydGlzaW5nIGFuZCBzY2FubmluZyBtb2R1bGVzIGFyZSBlbmFibGVkLCBza2lwIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUTV9MRV9SQU5ET01fQ0IqIHBfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2IuYWRkcl9tZ250X2NiOwotICBwX2NiLT5wcml2YXRlX2FkZHIgPSBhZGRyZXNzOwotCi0gIC8qIHNldCBpdCB0byBjb250cm9sbGVyICovCi0gIGJ0bV9ibGVfc2V0X3JhbmRvbV9hZGRyZXNzKHBfY2ItPnByaXZhdGVfYWRkcik7Ci0KLSAgcF9jYi0+b3duX2FkZHJfdHlwZSA9IEJMRV9BRERSX1JBTkRPTTsKLQotICAvKiBzdGFydCBhIHBlcmlvZGljYWwgdGltZXIgdG8gcmVmcmVzaCByYW5kb20gYWRkciAqLwotICB1aW50NjRfdCBpbnRlcnZhbF9tcyA9IGJ0bV9nZXRfbmV4dF9wcml2YXRlX2FkZHJyZXNzX2ludGVydmFsX21zKCk7Ci0jaWYgKEJUTV9CTEVfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotICBpbnRlcnZhbF9tcyA9IGJ0bV9jYi5ibGVfY3RyX2NiLnJwYV90b3V0ICogMTAwMDsKLSNlbmRpZgotICBhbGFybV9zZXRfb25fbWxvb3AocF9jYi0+cmVmcmVzaF9yYWRkcl90aW1lciwgaW50ZXJ2YWxfbXMsCi0gICAgICAgICAgICAgICAgICAgICBidG1fYmxlX3JlZnJlc2hfcmFkZHJfdGltZXJfdGltZW91dCwgTlVMTCk7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlIGEgcmVzb2x2YWJsZSBwcml2YXRlIGFkZHJlc3MgdXNpbmcgbG9jYWwgSVJLICovCi12b2lkIGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJik+IGNiKSB7Ci0gIC8qIGdlbmVyYXRlIDNCIHJhbmQgYXMgQkQgTFNCLCBTUksgd2l0aCBpdCwgZ2V0IEJEIE1TQiAqLwotICBidHNuZF9oY2ljX2JsZV9yYW5kKGJhc2U6OkJpbmQoCi0gICAgICBbXShiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmKT4gY2IsIEJUX09DVEVUOCByYW5kb20pIHsKLSAgICAgICAgY29uc3QgT2N0ZXQxNiYgaXJrID0gQlRNX0dldERldmljZUlEUm9vdCgpOwotICAgICAgICBjYi5SdW4oZ2VuZXJhdGVfcnBhX2Zyb21faXJrX2FuZF9yYW5kKGlyaywgcmFuZG9tKSk7Ci0gICAgICB9LAotICAgICAgc3RkOjptb3ZlKGNiKSkpOwotfQotCi11aW50NjRfdCBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tcygpIHsKLSAgLyogNyBtaW51dGVzIG1pbmltdW0sIDE1IG1pbnV0ZXMgbWF4aW11bSBmb3IgcmFuZG9tIGFkZHJlc3MgcmVmcmVzaGluZyAqLwotICBjb25zdCB1aW50NjRfdCBpbnRlcnZhbF9taW5fbXMgPSAoNyAqIDYwICogMTAwMCk7Ci0gIGNvbnN0IHVpbnQ2NF90IGludGVydmFsX3JhbmRvbV9wYXJ0X21heF9tcyA9ICg4ICogNjAgKiAxMDAwKTsKLQotICByZXR1cm4gaW50ZXJ2YWxfbWluX21zICsgc3RkOjpyYW5kKCkgJSBpbnRlcnZhbF9yYW5kb21fcGFydF9tYXhfbXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIFJhbmRvbSBhZGRyZXNzIHJlc29sdmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgcHNldWRvIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIElmIHBzZXVkbyBhZGRyZXNzIGlzIG5vdCBhdmFpbGFibGUsIHVzZSBkdW1teSBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlzIHVwZGF0ZWQ7IGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fYmxlX2luaXRfcHNldWRvX2FkZHIodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbmV3X3BzZXVkb19hZGRyKSB7Ci0gIGlmIChwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkci5Jc0VtcHR5KCkpIHsKLSAgICBwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciA9IG5ld19wc2V1ZG9fYWRkcjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgZ2l2ZW4gUmVzb2x2YWJsZSBQcml2YWUgQWRkcmVzcyB8cnBhfCBtYXRjaGVzIElkZW50aXR5Ci0gKiBSZXNvbHZpbmcgS2V5IHxpcmt8ICovCi1zdGF0aWMgYm9vbCBycGFfbWF0Y2hlc19pcmsoY29uc3QgUmF3QWRkcmVzcyYgcnBhLCBjb25zdCBPY3RldDE2JiBpcmspIHsKLSAgLyogdXNlIHRoZSAzIE1TQiBvZiBiZCBhZGRyZXNzIGFzIHByYW5kICovCi0gIHVpbnQ4X3QgcmFuZFszXTsKLSAgcmFuZFswXSA9IHJwYS5hZGRyZXNzWzJdOwotICByYW5kWzFdID0gcnBhLmFkZHJlc3NbMV07Ci0gIHJhbmRbMl0gPSBycGEuYWRkcmVzc1swXTsKLQotICAvKiBnZW5lcmF0ZSBYID0gRSBpcmsoUjAsIFIxLCBSMikgYW5kIFIgaXMgcmFuZG9tIGFkZHJlc3MgMyBMU08gKi8KLSAgT2N0ZXQxNiB4ID0gY3J5cHRvX3Rvb2xib3g6OmFlc18xMjgoaXJrLCAmcmFuZFswXSwgMyk7Ci0KLSAgcmFuZFswXSA9IHJwYS5hZGRyZXNzWzVdOwotICByYW5kWzFdID0gcnBhLmFkZHJlc3NbNF07Ci0gIHJhbmRbMl0gPSBycGEuYWRkcmVzc1szXTsKLQotICBpZiAobWVtY21wKHguZGF0YSgpLCAmcmFuZFswXSwgMykgPT0gMCkgewotICAgIC8vIG1hdGNoCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgLy8gbm90IGEgbWF0Y2gKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBSUEEgaXMgcmVzb2x2YWJsZSBieSB0aGUgZGV2aWNlIGtleS4KLSAqICBSZXR1cm5zIHRydWUgaXMgcmVzb2x2YWJsZTsgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1ib29sIGJ0bV9ibGVfYWRkcl9yZXNvbHZhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIGlmICghQlRNX0JMRV9JU19SRVNPTFZFX0JEQShycGEpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChwX2Rldl9yZWMtPmRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSAmJgotICAgICAgKHBfZGV2X3JlYy0+YmxlLmtleV90eXBlICYgQlRNX0xFX0tFWV9QSUQpKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlcyB0cnkgdG8gcmVzb2x2ZSIsIF9fZnVuY19fKTsKLQotICAgIGlmIChycGFfbWF0Y2hlc19pcmsocnBhLCBwX2Rldl9yZWMtPmJsZS5rZXlzLmlyaykpIHsKLSAgICAgIGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkcihwX2Rldl9yZWMsIHJwYSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBtYXRjaCB0aGUgcmFuZG9tIGFkZHJlc3MgdG8gdGhlIGFwcG9pbnRlZCBkZXZpY2UgcmVjb3JkLAotICogc3RhcnRpbmcgZnJvbSBjYWxjdWxhdGluZyBJUksuIElmIHRoZSByZWNvcmQgaW5kZXggZXhjZWVkcyB0aGUgbWF4aW11bSByZWNvcmQKLSAqIG51bWJlciwgbWF0Y2hpbmcgZmFpbGVkIGFuZCBzZW5kIGEgY2FsbGJhY2suICovCi1zdGF0aWMgYm9vbCBidG1fYmxlX21hdGNoX3JhbmRvbV9iZGEodm9pZCogZGF0YSwgdm9pZCogY29udGV4dCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4oZGF0YSk7Ci0gIFJhd0FkZHJlc3MqIHJhbmRvbV9iZGEgPSBzdGF0aWNfY2FzdDxSYXdBZGRyZXNzKj4oY29udGV4dCk7Ci0KLSAgaWYgKCEocF9kZXZfcmVjLT5kZXZpY2VfdHlwZSAmIEJUX0RFVklDRV9UWVBFX0JMRSkgfHwKLSAgICAgICEocF9kZXZfcmVjLT5ibGUua2V5X3R5cGUgJiBCVE1fTEVfS0VZX1BJRCkpCi0gICAgLy8gTWF0Y2ggZmFpbHMgcHJlY29uZGl0aW9ucwotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChycGFfbWF0Y2hlc19pcmsoKnJhbmRvbV9iZGEsIHBfZGV2X3JlYy0+YmxlLmtleXMuaXJrKSkgewotICAgIC8vIE1hdGNoZWQKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUaGlzIGl0ZW0gbm90IGEgbWF0Y2gsIGNvbnRpbnVlIGl0ZXJhdGlvbgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlc29sdmUgYSByYW5kb20gYWRkcmVzcy4KLSAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgc2VjdXJpdHkgcmVjb3JkIG9mIHRoZSBkZXZpY2Ugd2hvbSBhIHJhbmRvbSBhZGRyZXNzIGlzCi0gKiBtYXRjaGVkIHRvLgotICovCi10QlRNX1NFQ19ERVZfUkVDKiBidG1fYmxlX3Jlc29sdmVfcmFuZG9tX2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgcmFuZG9tX2JkYSkgewotICBsaXN0X25vZGVfdCogbiA9IGxpc3RfZm9yZWFjaChidG1fY2Iuc2VjX2Rldl9yZWMsIGJ0bV9ibGVfbWF0Y2hfcmFuZG9tX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZyYW5kb21fYmRhKTsKLSAgcmV0dXJuIChuID09IG51bGxwdHIpID8gKG51bGxwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4obGlzdF9ub2RlKG4pKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgYWRkcmVzcyBtYXBwaW5nIGJldHdlZW4gcHNldWRvIGFkZHJlc3MgYW5kIHJlYWwgY29ubmVjdGlvbiBhZGRyZXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqIEZpbmQgdGhlIHNlY3VyaXR5IHJlY29yZCB3aG9zZSBMRSBpZGVudGl0eSBhZGRyZXNzIGlzIG1hdGNoaW5nICovCi1zdGF0aWMgdEJUTV9TRUNfREVWX1JFQyogYnRtX2ZpbmRfZGV2X2J5X2lkZW50aXR5X2FkZHIoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBhZGRyX3R5cGUpIHsKLSAgbGlzdF9ub2RlX3QqIGVuZCA9IGxpc3RfZW5kKGJ0bV9jYi5zZWNfZGV2X3JlYyk7Ci0gIGZvciAobGlzdF9ub2RlX3QqIG5vZGUgPSBsaXN0X2JlZ2luKGJ0bV9jYi5zZWNfZGV2X3JlYyk7IG5vZGUgIT0gZW5kOwotICAgICAgIG5vZGUgPSBsaXN0X25leHQobm9kZSkpIHsKLSAgICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPQotICAgICAgICBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4obGlzdF9ub2RlKG5vZGUpKTsKLSAgICBpZiAocF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhID09IGJkX2FkZHIpIHsKLSAgICAgIGlmICgocF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZSAmCi0gICAgICAgICAgICh+QkxFX0FERFJfVFlQRV9JRF9CSVQpKSAhPSAoYWRkcl90eXBlICYgKH5CTEVfQUREUl9UWVBFX0lEX0JJVCkpKQotICAgICAgICBCVE1fVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICIlcyBmaW5kIHBzZXVkby0+cmFuZG9tIG1hdGNoIHdpdGggZGlmZiBhZGRyIHR5cGU6ICVkIHZzICVkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlLAotICAgICAgICAgICAgYWRkcl90eXBlKTsKLQotICAgICAgLyogZm91bmQgdGhlIG1hdGNoICovCi0gICAgICByZXR1cm4gcF9kZXZfcmVjOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBtYXAgYSBzdGF0aWMgQkQgYWRkcmVzcyB0byBhIHBzZXVkbyByYW5kb20KLSAqICAgICAgICAgICAgICAgICAgYWRkcmVzcyBpbiBzZWN1cml0eSBkYXRhYmFzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvKFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9hZGRyX3R5cGUsIGJvb2wgcmVmcmVzaCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPQotICAgICAgYnRtX2ZpbmRfZGV2X2J5X2lkZW50aXR5X2FkZHIoKmJkX2FkZHIsICpwX2FkZHJfdHlwZSk7Ci0gIGlmIChwX2Rldl9yZWMgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIGV2dCByZXBvcnRlZCBvbiBzdGF0aWMgYWRkcmVzcywgbWFwIHN0YXRpYyBhZGRyZXNzIHRvIHJhbmRvbSBwc2V1ZG8gKi8KLSAgLyogaWYgUlBBIG9mZmxvYWRpbmcgaXMgc3VwcG9ydGVkLCBvciA0LjIgY29udHJvbGxlciwgZG8gUlBBIHJlZnJlc2ggKi8KLSAgaWYgKHJlZnJlc2ggJiYKLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgIT0gMCkgewotICAgIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeShwX2Rldl9yZWMpOwotICB9Ci0KLSAgLyogYXNzaWduIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIGJlIHRoZSBjdXJyZW50IHJlcG9ydCBhZGRyZXNzICovCi0gIGlmICghYnRtX2JsZV9pbml0X3BzZXVkb19hZGRyKHBfZGV2X3JlYywgKmJkX2FkZHIpKSB7Ci0gICAgKmJkX2FkZHIgPSBwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkcjsKLSAgfQotCi0gICpwX2FkZHJfdHlwZSA9IHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG9fZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICB0QkxFX0JEX0FERFIqIGFkZHJlc3Nfd2l0aF90eXBlLCBib29sIHJlZnJlc2gpIHsKLSAgcmV0dXJuIGJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG8oCi0gICAgICAmKGFkZHJlc3Nfd2l0aF90eXBlLT5iZGEpLCAmKGFkZHJlc3Nfd2l0aF90eXBlLT50eXBlKSwgcmVmcmVzaCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmFuZG9tX3BzZXVkb190b19pZGVudGl0eV9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIG1hcCBhIHJhbmRvbSBwc2V1ZG8gYWRkcmVzcyB0byBhIHB1YmxpYwotICogICAgICAgICAgICAgICAgICBhZGRyZXNzLiByYW5kb21fcHNldWRvIGlzIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX3JhbmRvbV9wc2V1ZG9fdG9faWRlbnRpdHlfYWRkcihSYXdBZGRyZXNzKiByYW5kb21fcHNldWRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfaWRlbnRpdHlfYWRkcl90eXBlKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldigqcmFuZG9tX3BzZXVkbyk7Ci0KLSAgaWYgKHBfZGV2X3JlYyAhPSBOVUxMKSB7Ci0gICAgaWYgKHBfZGV2X3JlYy0+YmxlLmluX2NvbnRyb2xsZXJfbGlzdCAmIEJUTV9SRVNPTFZJTkdfTElTVF9CSVQpIHsKLSAgICAgICpwX2lkZW50aXR5X2FkZHJfdHlwZSA9IHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLnR5cGU7Ci0gICAgICAqcmFuZG9tX3BzZXVkbyA9IHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYTsKLSAgICAgIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX3ByaXZhY3koKSkKLSAgICAgICAgKnBfaWRlbnRpdHlfYWRkcl90eXBlIHw9IEJMRV9BRERSX1RZUEVfSURfQklUOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVmcmVzaF9wZWVyX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlZnJlc2ggdGhlIGN1cnJlbnRseSB1c2VkIHJlc29sdmFibGUgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIHByaXZhdGUgYWRkcmVzcyBpbnRvIHNlY3VyaXR5IGRhdGFiYXNlIGFuZCBzZXQgYWN0aXZlCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYWRkcmVzcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYmxlX3JlZnJlc2hfcGVlcl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYmRhLCBjb25zdCBSYXdBZGRyZXNzJiBycGEsCi0gICAgdEJUTV9TRUNfQkxFOjp0QUREUkVTU19UWVBFIHJyYV90eXBlKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfc2VjX3JlYyA9IGJ0bV9maW5kX2Rldihwc2V1ZG9fYmRhKTsKLSAgaWYgKHBfc2VjX3JlYyA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIiVzIE5vIG1hdGNoaW5nIGtub3duIGRldmljZSBpbiByZWNvcmQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9zZWNfcmVjLT5ibGUuY3VyX3JhbmRfYWRkciA9IHJwYTsKLQotICBpZiAocnJhX3R5cGUgPT0gdEJUTV9TRUNfQkxFOjpCVE1fQkxFX0FERFJfUFNFVURPKSB7Ci0gICAgcF9zZWNfcmVjLT5ibGUuYWN0aXZlX2FkZHJfdHlwZSA9IHJwYS5Jc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdEJUTV9TRUNfQkxFOjpCVE1fQkxFX0FERFJfU1RBVElDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRCVE1fU0VDX0JMRTo6QlRNX0JMRV9BRERSX1JSQTsKLSAgfSBlbHNlIHsKLSAgICBwX3NlY19yZWMtPmJsZS5hY3RpdmVfYWRkcl90eXBlID0gcnJhX3R5cGU7Ci0gIH0KLQotICAvKiBjb25uZWN0aW9uIHJlZnJlc2ggcmVtb3RlIGFkZHJlc3MgKi8KLSAgY29uc3QgYXV0byYgaWRlbnRpdHlfYWRkcmVzcyA9IHBfc2VjX3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYTsKLSAgYXV0byBpZGVudGl0eV9hZGRyZXNzX3R5cGUgPSBwX3NlY19yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlOwotCi0gIGlmICghYWNsX3JlZnJlc2hfcmVtb3RlX2FkZHJlc3MoaWRlbnRpdHlfYWRkcmVzcywgaWRlbnRpdHlfYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VjX3JlYy0+YmRfYWRkciwgcnJhX3R5cGUsIHJwYSkpIHsKLSAgICAvLyBUcnkgbG9va2luZyB1cCB0aGUgcHNldWRvIHJhbmRvbSBhZGRyZXNzCi0gICAgaWYgKCFhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzcyhpZGVudGl0eV9hZGRyZXNzLCBpZGVudGl0eV9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NlY19yZWMtPmJsZS5wc2V1ZG9fYWRkciwgcnJhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycGEpKSB7Ci0gICAgICBMT0dfRVJST1IoIiVzIFVua25vd24gZGV2aWNlIHRvIHJlZnJlc2ggcmVtb3RlIGRldmljZSIsIF9fZnVuY19fKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fYmxlX2Fkdl9maWx0ZXIuY2MgYi9zdGFjay9idG0vYnRtX2JsZV9hZHZfZmlsdGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTNiNDVkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fYmxlX2Fkdl9maWx0ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0bV9ibGUiCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9kZXYuaCIKLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLXVzaW5nIGJhc2U6OkJpbmQ7Ci11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLSNkZWZpbmUgQlRNX0JMRV9BRFZfRklMVF9NRVRBX0hEUl9MRU5HVEggMwotI2RlZmluZSBCVE1fQkxFX0FEVl9GSUxUX0ZFQVRfU0VMTl9MRU4gMTMKLSNkZWZpbmUgQlRNX0JMRV9BRFZfRklMVF9UUkFDS19OVU0gMgotCi0jZGVmaW5lIEJUTV9CTEVfUEZfU0VMRUNUX05PTkUgMAotCi0vKiBCTEUgbWV0YSB2c2MgaGVhZGVyOiAxIGJ5dGVzIG9mIHN1Yl9jb2RlLCAxIGJ5dGUgb2YgUENGIGFjdGlvbiAqLwotI2RlZmluZSBCVE1fQkxFX01FVEFfSERSX0xFTkdUSCAzCi0jZGVmaW5lIEJUTV9CTEVfUEZfRkVBVF9TRUxfTEVOIDE4Ci0jZGVmaW5lIEJUTV9CTEVfUENGX0VOQUJMRV9MRU4gMgotCi0jZGVmaW5lIEJUTV9CTEVfTUVUQV9BRERSX0xFTiA3Ci0jZGVmaW5lIEJUTV9CTEVfTUVUQV9VVUlEX0xFTiA0MAotCi0jZGVmaW5lIEJUTV9CTEVfUEZfQklUX1RPX01BU0soeCkgKHVpbnQxNl90KSgxIDw8ICh4KSkKLQotdEJUTV9CTEVfQURWX0ZJTFRFUl9DQiBidG1fYmxlX2Fkdl9maWx0X2NiOwotdEJUTV9CTEVfVlNDX0NCIGNtbl9ibGVfdnNjX2NiOwotCi1zdGF0aWMgdWludDhfdCBidG1fYmxlX2NzX3VwZGF0ZV9wZl9jb3VudGVyKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY29uZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0JEX0FERFIqIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXZhaWxhYmxlKTsKLQotI2RlZmluZSBCVE1fQkxFX1NFVF9TQ0FOX1BGX09QQ09ERSh4LCB5KSAoKCh4KSA8PCA0KSB8ICh5KSkKLSNkZWZpbmUgQlRNX0JMRV9HRVRfU0NBTl9QRl9TVUJDT0RFKHgpICgoeCkgPj4gNCkKLSNkZWZpbmUgQlRNX0JMRV9HRVRfU0NBTl9QRl9BQ1RJT04oeCkgKCh4KSYweDBmKQotI2RlZmluZSBCVE1fQkxFX0lOVkFMSURfQ09VTlRFUiAweGZmCi0KLS8qIGxlbmd0aCBvZiBlYWNoIG11bHRpIGFkdiBzdWIgY29tbWFuZCAqLwotI2RlZmluZSBCVE1fQkxFX0FEVl9GSUxURVJfRU5CX0xFTiAzCi0KLS8qIGxlbmd0aCBvZiBlYWNoIGJhdGNoIHNjYW4gY29tbWFuZCAqLwotI2RlZmluZSBCVE1fQkxFX0FEVl9GSUxURVJfQ0xFQVJfTEVOIDMKLSNkZWZpbmUgQlRNX0JMRV9BRFZfRklMVEVSX0xFTiAyCi0KLSNkZWZpbmUgQlRNX0JMRV9BRFZfRklMVF9DQl9FVlRfTUFTSyAweEYwCi0jZGVmaW5lIEJUTV9CTEVfQURWX0ZJTFRfU1VCQ09ERV9NQVNLIDB4MEYKLQotc3RhdGljIGJvb2wgaXNfZmlsdGVyaW5nX3N1cHBvcnRlZCgpIHsKLSAgcmV0dXJuIGNtbl9ibGVfdnNjX2NiLmZpbHRlcl9zdXBwb3J0ICE9IDAgJiYgY21uX2JsZV92c2NfY2IubWF4X2ZpbHRlciAhPSAwOwotfQotCi1zdGF0aWMgYm9vbCBpc19lbXB0eV8xMjhiaXQoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4gZGF0YSkgewotICBpbnQgaSwgbGVuID0gMTY7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChkYXRhW2ldICE9ICh1aW50OF90KTApIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfb2NmX3RvX2NvbmR0eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb252ZXJ0IE9DRiB0byBjb25kIHR5cGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgY29uZHR5cGUgdmFsdWUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRtX2JsZV9vY2ZfdG9fY29uZHR5cGUodWludDhfdCBvY2YpIHsKLSAgdWludDhfdCBjb25kX3R5cGUgPSAwOwotCi0gIHN3aXRjaCAob2NmKSB7Ci0gICAgY2FzZSBCVE1fQkxFX01FVEFfUEZfRkVBVF9TRUw6Ci0gICAgICBjb25kX3R5cGUgPSBCVE1fQkxFX01FVEFfUEZfRkVBVF9TRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9CTEVfTUVUQV9QRl9BRERSOgotICAgICAgY29uZF90eXBlID0gQlRNX0JMRV9QRl9BRERSX0ZJTFRFUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9NRVRBX1BGX1VVSUQ6Ci0gICAgICBjb25kX3R5cGUgPSBCVE1fQkxFX1BGX1NSVkNfVVVJRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9NRVRBX1BGX1NPTF9VVUlEOgotICAgICAgY29uZF90eXBlID0gQlRNX0JMRV9QRl9TUlZDX1NPTF9VVUlEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX01FVEFfUEZfTE9DQUxfTkFNRToKLSAgICAgIGNvbmRfdHlwZSA9IEJUTV9CTEVfUEZfTE9DQUxfTkFNRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9NRVRBX1BGX01BTlVfREFUQToKLSAgICAgIGNvbmRfdHlwZSA9IEJUTV9CTEVfUEZfTUFOVV9EQVRBOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX01FVEFfUEZfU1JWQ19EQVRBOgotICAgICAgY29uZF90eXBlID0gQlRNX0JMRV9QRl9TUlZDX0RBVEFfUEFUVEVSTjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9NRVRBX1BGX0FMTDoKLSAgICAgIGNvbmRfdHlwZSA9IEJUTV9CTEVfUEZfVFlQRV9BTEw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgY29uZF90eXBlID0gQlRNX0JMRV9QRl9UWVBFX01BWDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBjb25kX3R5cGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV9mbHRfdXBkYXRlX2NiKHVpbnQ4X3QgZXhwZWN0ZWRfb2NmLCB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIGlmIChldnRfbGVuICE9IDQpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBiYWQgbGVuZ3RoOiAlZCIsIF9fZnVuY19fLCBldnRfbGVuKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IHN0YXR1cywgb3Bfc3ViY29kZSwgYWN0aW9uLCBudW1fYXZhaWw7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgob3Bfc3ViY29kZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChhY3Rpb24sIHApOwotICBTVFJFQU1fVE9fVUlOVDgobnVtX2F2YWlsLCBwKTsKLQotICBpZiAoZXhwZWN0ZWRfb2NmICE9IG9wX3N1YmNvZGUpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBJbmNvcnJlY3Qgb3Bjb2RlOiAweCUwMngsIGV4cGVjdGVkOiAweCUwMngiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb2NmLCBvcF9zdWJjb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRNX1NUQVRVUyBidG1fc3RhdHVzID0gKHN0YXR1cyA9PSAwKSA/IEJUTV9TVUNDRVNTIDogQlRNX0VSUl9QUk9DRVNTSU5HOwotCi0gIGlmIChvcF9zdWJjb2RlID09IEJUTV9CTEVfTUVUQV9QRl9GRUFUX1NFTCkgewotICAgIGNiLlJ1bihudW1fYXZhaWwsIHN0YXRpY19jYXN0PHRCVE1fQkxFX1NDQU5fQ09ORF9PUD4oYWN0aW9uKSwgYnRtX3N0YXR1cyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBjb25kX3R5cGUgPSBidG1fYmxlX29jZl90b19jb25kdHlwZShleHBlY3RlZF9vY2YpOwotICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBSZWNkOiAlZCwgJWQsICVkLCAlZCwgJWQiLCBfX2Z1bmNfXywgb3Bfc3ViY29kZSwKLSAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX29jZiwgYWN0aW9uLCBzdGF0dXMsIG51bV9hdmFpbCk7Ci0gIGlmIChIQ0lfU1VDQ0VTUyA9PSBzdGF0dXMpIHsKLSAgICBpZiAoYnRtX2JsZV9hZHZfZmlsdF9jYi5jdXJfZmlsdGVyX3RhcmdldC5iZGEuSXNFbXB0eSgpKQotICAgICAgYnRtX2JsZV9jc191cGRhdGVfcGZfY291bnRlcihzdGF0aWNfY2FzdDx0QlRNX0JMRV9TQ0FOX0NPTkRfT1A+KGFjdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRfdHlwZSwgTlVMTCwgbnVtX2F2YWlsKTsKLSAgICBlbHNlCi0gICAgICBidG1fYmxlX2NzX3VwZGF0ZV9wZl9jb3VudGVyKAotICAgICAgICAgIHN0YXRpY19jYXN0PHRCVE1fQkxFX1NDQU5fQ09ORF9PUD4oYWN0aW9uKSwgY29uZF90eXBlLAotICAgICAgICAgICZidG1fYmxlX2Fkdl9maWx0X2NiLmN1cl9maWx0ZXJfdGFyZ2V0LCBudW1fYXZhaWwpOwotICB9Ci0KLSAgLyogc2VuZCBBRFYgUEYgb3BlcmF0aW9uIGNvbXBsZXRlICovCi0gIGJ0bV9ibGVfYWR2X2ZpbHRfY2Iub3BfdHlwZSA9IDA7Ci0KLSAgY2IuUnVuKG51bV9hdmFpbCwgc3RhdGljX2Nhc3Q8dEJUTV9CTEVfU0NBTl9DT05EX09QPihhY3Rpb24pLCBidG1fc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfZmluZF9hZGRyX2ZpbHRlcl9jb3VudGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIHRoZSBwZXIgYmQgYWRkcmVzcyBBRFYgcGF5bG9hZCBmaWx0ZXIgY291bnRlciBieQotICogICAgICAgICAgICAgICAgICBCRF9BRERSLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY291bnRlciBpZiBmb3VuZDsgTlVMTCBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRNX0JMRV9QRl9DT1VOVCogYnRtX2JsZV9maW5kX2FkZHJfZmlsdGVyX2NvdW50ZXIoCi0gICAgdEJMRV9CRF9BRERSKiBwX2xlX2JkYSkgewotICB1aW50OF90IGk7Ci0gIHRCVE1fQkxFX1BGX0NPVU5UKiBwX2FkZHJfZmlsdGVyID0KLSAgICAgICZidG1fYmxlX2Fkdl9maWx0X2NiLnBfYWRkcl9maWx0ZXJfY291bnRbMV07Ci0KLSAgaWYgKHBfbGVfYmRhID09IE5VTEwpIHJldHVybiAmYnRtX2JsZV9hZHZfZmlsdF9jYi5wX2FkZHJfZmlsdGVyX2NvdW50WzBdOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjbW5fYmxlX3ZzY19jYi5tYXhfZmlsdGVyOyBpKyssIHBfYWRkcl9maWx0ZXIrKykgewotICAgIGlmIChwX2FkZHJfZmlsdGVyLT5pbl91c2UgJiYgcF9sZV9iZGEtPmJkYSA9PSBwX2FkZHJfZmlsdGVyLT5iZF9hZGRyKSB7Ci0gICAgICByZXR1cm4gcF9hZGRyX2ZpbHRlcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2FsbG9jX2FkZHJfZmlsdGVyX2NvdW50ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGFsbG9jYXRlIHRoZSBwZXIgZGV2aWNlIGFkdiBwYXlsb2FkIGZpbHRlciBjb3VudGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY291bnRlciBpZiBhbGxvY2F0aW9uIHN1Y2NlZWQ7IE5VTEwKLSAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUTV9CTEVfUEZfQ09VTlQqIGJ0bV9ibGVfYWxsb2NfYWRkcl9maWx0ZXJfY291bnRlcigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHVpbnQ4X3QgaTsKLSAgdEJUTV9CTEVfUEZfQ09VTlQqIHBfYWRkcl9maWx0ZXIgPQotICAgICAgJmJ0bV9ibGVfYWR2X2ZpbHRfY2IucF9hZGRyX2ZpbHRlcl9jb3VudFsxXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY21uX2JsZV92c2NfY2IubWF4X2ZpbHRlcjsgaSsrLCBwX2FkZHJfZmlsdGVyKyspIHsKLSAgICBpZiAocF9hZGRyX2ZpbHRlci0+YmRfYWRkci5Jc0VtcHR5KCkpIHsKLSAgICAgIHBfYWRkcl9maWx0ZXItPmJkX2FkZHIgPSBiZF9hZGRyOwotICAgICAgcF9hZGRyX2ZpbHRlci0+aW5fdXNlID0gdHJ1ZTsKLSAgICAgIHJldHVybiBwX2FkZHJfZmlsdGVyOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2RlYWxsb2NfYWRkcl9maWx0ZXJfY291bnRlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZGUtYWxsb2NhdGUgdGhlIHBlciBkZXZpY2UgYWR2IHBheWxvYWQgZmlsdGVyIGNvdW50ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGRlYWxsb2NhdGlvbiBzdWNjZWVkOyBmYWxzZSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0bV9ibGVfZGVhbGxvY19hZGRyX2ZpbHRlcl9jb3VudGVyKHRCTEVfQkRfQUREUiogcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmaWx0ZXJfdHlwZSkgewotICB1aW50OF90IGk7Ci0gIHRCVE1fQkxFX1BGX0NPVU5UKiBwX2FkZHJfZmlsdGVyID0KLSAgICAgICZidG1fYmxlX2Fkdl9maWx0X2NiLnBfYWRkcl9maWx0ZXJfY291bnRbMV07Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICBpZiAoQlRNX0JMRV9QRl9UWVBFX0FMTCA9PSBmaWx0ZXJfdHlwZSAmJiBOVUxMID09IHBfYmRfYWRkcikKLSAgICBtZW1zZXQoJmJ0bV9ibGVfYWR2X2ZpbHRfY2IucF9hZGRyX2ZpbHRlcl9jb3VudFswXSwgMCwKLSAgICAgICAgICAgc2l6ZW9mKHRCVE1fQkxFX1BGX0NPVU5UKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNtbl9ibGVfdnNjX2NiLm1heF9maWx0ZXI7IGkrKywgcF9hZGRyX2ZpbHRlcisrKSB7Ci0gICAgaWYgKHBfYWRkcl9maWx0ZXItPmluX3VzZSAmJgotICAgICAgICAoIXBfYmRfYWRkciB8fCBwX2JkX2FkZHItPmJkYSA9PSBwX2FkZHJfZmlsdGVyLT5iZF9hZGRyKSkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgbWVtc2V0KHBfYWRkcl9maWx0ZXIsIDAsIHNpemVvZih0QlRNX0JMRV9QRl9DT1VOVCkpOwotCi0gICAgICBpZiAocF9iZF9hZGRyKSBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZvdW5kOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlKGFkZCxkZWxldGUgb3IgY2xlYXIpIHRoZSBhZHYgbG9jYWwgbmFtZSBmaWx0ZXJpbmcKLSAqIGNvbmRpdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgQlRNX0xFX1BGX2xvY2FsX25hbWUodEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgdWludDhfdCBsZW4gPSBCVE1fQkxFX0FEVl9GSUxUX01FVEFfSERSX0xFTkdUSDsKLQotICB1aW50OF90IGxlbl9tYXggPSBsZW4gKyBCVE1fQkxFX1BGX1NUUl9MRU5fTUFYOwotICB1aW50OF90IHBhcmFtW2xlbl9tYXhdOwotICBtZW1zZXQocGFyYW0sIDAsIGxlbl9tYXgpOwotCi0gIHVpbnQ4X3QqIHAgPSBwYXJhbTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfTUVUQV9QRl9MT0NBTF9OQU1FKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGFjdGlvbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBmaWx0X2luZGV4KTsKLQotICBpZiAoYWN0aW9uICE9IEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSKSB7Ci0gICAgaW50IHNpemUgPSBzdGQ6Om1pbihuYW1lLnNpemUoKSwgKHNpemVfdClCVE1fQkxFX1BGX1NUUl9MRU5fTUFYKTsKLSAgICBBUlJBWV9UT19TVFJFQU0ocCwgbmFtZS5kYXRhKCksIHNpemUpOwotICAgIGxlbiArPSBzaXplOwotICB9Ci0KLSAgLyogc2VuZCBsb2NhbCBuYW1lIGZpbHRlciAqLwotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgRlJPTV9IRVJFLCBIQ0lfQkxFX0FEVl9GSUxURVIsIHBhcmFtLCBsZW4sCi0gICAgICBiYXNlOjpCaW5kKCZidG1fZmx0X3VwZGF0ZV9jYiwgQlRNX0JMRV9NRVRBX1BGX0xPQ0FMX05BTUUsIGNiKSk7Ci0KLSAgbWVtc2V0KCZidG1fYmxlX2Fkdl9maWx0X2NiLmN1cl9maWx0ZXJfdGFyZ2V0LCAwLCBzaXplb2YodEJMRV9CRF9BRERSKSk7Ci19Ci0KLS8qKgotICogdGhpcyBmdW5jdGlvbiB1cGRhdGUoYWRkL3JlbW92ZSkgc2VydmljZSBkYXRhIGNoYW5nZSBmaWx0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIEJUTV9MRV9QRl9zcnZjX2RhdGEodEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4KSB7Ci0gIHVpbnQ4X3QgbnVtX2F2YWlsID0gKGFjdGlvbiA9PSBCVE1fQkxFX1NDQU5fQ09ORF9BREQpID8gMCA6IDE7Ci0KLSAgYnRtX2JsZV9jc191cGRhdGVfcGZfY291bnRlcihhY3Rpb24sIEJUTV9CTEVfUEZfU1JWQ19EQVRBLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hdmFpbCk7Ci19Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiB1cGRhdGUoYWRkLGRlbGV0ZSBvciBjbGVhcikgdGhlIGFkdiBtYW51ZmFjdHVyZXIgZGF0YSBmaWx0ZXJpbmcKLSAqIGNvbmRpdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgQlRNX0xFX1BGX21hbnVfZGF0YSh0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbXBhbnlfaWQsIHVpbnQxNl90IGNvbXBhbnlfaWRfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgdWludDhfdCBsZW4gPSBCVE1fQkxFX0FEVl9GSUxUX01FVEFfSERSX0xFTkdUSDsKLSAgaW50IGxlbl9tYXggPSBsZW4gKyBCVE1fQkxFX1BGX1NUUl9MRU5fTUFYICsgQlRNX0JMRV9QRl9TVFJfTEVOX01BWDsKLQotICB1aW50OF90IHBhcmFtW2xlbl9tYXhdOwotICBtZW1zZXQocGFyYW0sIDAsIGxlbl9tYXgpOwotCi0gIHVpbnQ4X3QqIHAgPSBwYXJhbTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfTUVUQV9QRl9NQU5VX0RBVEEpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgYWN0aW9uKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGZpbHRfaW5kZXgpOwotCi0gIGlmIChhY3Rpb24gIT0gQlRNX0JMRV9TQ0FOX0NPTkRfQ0xFQVIpIHsKLSAgICB1aW50OF90IHNpemUgPSBzdGQ6Om1pbihkYXRhLnNpemUoKSwgKHNpemVfdCkoQlRNX0JMRV9QRl9TVFJfTEVOX01BWCAtIDIpKTsKLQotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgY29tcGFueV9pZCk7Ci0gICAgaWYgKHNpemUgPiAwICYmIGRhdGFfbWFzay5zaXplKCkgIT0gMCkgewotICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIGRhdGEuZGF0YSgpLCBzaXplKTsKLSAgICAgIGxlbiArPSBzaXplICsgMjsKLSAgICB9IGVsc2UKLSAgICAgIGxlbiArPSAyOwotCi0gICAgaWYgKGNvbXBhbnlfaWRfbWFzayAhPSAwKSB7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNvbXBhbnlfaWRfbWFzayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgKHVpbnQxNl90KTB4RkZGRik7Ci0gICAgfQotICAgIGxlbiArPSAyOwotCi0gICAgaWYgKHNpemUgPiAwICYmIGRhdGFfbWFzay5zaXplKCkgIT0gMCkgewotICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIGRhdGFfbWFzay5kYXRhKCksIHNpemUpOwotICAgICAgbGVuICs9IChzaXplKTsKLSAgICB9Ci0KLSAgICBCVE1fVFJBQ0VfREVCVUcoIk1hbnVmIGRhdGEgbGVuZ3RoOiAlZCIsIGxlbik7Ci0gIH0KLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgRlJPTV9IRVJFLCBIQ0lfQkxFX0FEVl9GSUxURVIsIHBhcmFtLCBsZW4sCi0gICAgICBiYXNlOjpCaW5kKCZidG1fZmx0X3VwZGF0ZV9jYiwgQlRNX0JMRV9NRVRBX1BGX01BTlVfREFUQSwgY2IpKTsKLQotICBtZW1zZXQoJmJ0bV9ibGVfYWR2X2ZpbHRfY2IuY3VyX2ZpbHRlcl90YXJnZXQsIDAsIHNpemVvZih0QkxFX0JEX0FERFIpKTsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZShhZGQsZGVsZXRlIG9yIGNsZWFyKSB0aGUgc2VydmljZSBkYXRhIGZpbHRlcmluZwotICogY29uZGl0aW9uLgotICoqLwotc3RhdGljIHZvaWQgQlRNX0xFX1BGX3NydmNfZGF0YV9wYXR0ZXJuKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICB1aW50OF90IGxlbiA9IEJUTV9CTEVfQURWX0ZJTFRfTUVUQV9IRFJfTEVOR1RIOwotICBpbnQgbGVuX21heCA9IGxlbiArIEJUTV9CTEVfUEZfU1RSX0xFTl9NQVggKyBCVE1fQkxFX1BGX1NUUl9MRU5fTUFYOwotCi0gIHVpbnQ4X3QgcGFyYW1bbGVuX21heF07Ci0gIG1lbXNldChwYXJhbSwgMCwgbGVuX21heCk7Ci0KLSAgdWludDhfdCogcCA9IHBhcmFtOwotICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9NRVRBX1BGX1NSVkNfREFUQSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBhY3Rpb24pOwotICBVSU5UOF9UT19TVFJFQU0ocCwgZmlsdF9pbmRleCk7Ci0KLSAgaWYgKGFjdGlvbiAhPSBCVE1fQkxFX1NDQU5fQ09ORF9DTEVBUikgewotICAgIHVpbnQ4X3Qgc2l6ZSA9IHN0ZDo6bWluKGRhdGEuc2l6ZSgpLCAoc2l6ZV90KShCVE1fQkxFX1BGX1NUUl9MRU5fTUFYIC0gMikpOwotCi0gICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICBBUlJBWV9UT19TVFJFQU0ocCwgZGF0YS5kYXRhKCksIHNpemUpOwotICAgICAgbGVuICs9IHNpemU7Ci0gICAgICBBUlJBWV9UT19TVFJFQU0ocCwgZGF0YV9tYXNrLmRhdGEoKSwgc2l6ZSk7Ci0gICAgICBsZW4gKz0gc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgRlJPTV9IRVJFLCBIQ0lfQkxFX0FEVl9GSUxURVIsIHBhcmFtLCBsZW4sCi0gICAgICBiYXNlOjpCaW5kKCZidG1fZmx0X3VwZGF0ZV9jYiwgQlRNX0JMRV9NRVRBX1BGX1NSVkNfREFUQSwgY2IpKTsKLQotICBtZW1zZXQoJmJ0bV9ibGVfYWR2X2ZpbHRfY2IuY3VyX2ZpbHRlcl90YXJnZXQsIDAsIHNpemVvZih0QkxFX0JEX0FERFIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfY3NfdXBkYXRlX3BmX2NvdW50ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHRoaXMgZnVuY3Rpb24gaXMgdG8gdXBkYXRlIHRoZSBhZHYgZGF0YSBwYXlsb2FkIGZpbHRlcgotICogICAgICAgICAgICAgICAgICBjb3VudGVyCi0gKgotICogUmV0dXJucyAgICAgICAgICBjdXJyZW50IG51bWJlciBvZiB0aGUgY291bnRlcjsgQlRNX0JMRV9JTlZBTElEX0NPVU5URVIgaWYKLSAqICAgICAgICAgICAgICAgICAgY291bnRlciB1cGRhdGUgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidG1fYmxlX2NzX3VwZGF0ZV9wZl9jb3VudGVyKHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY29uZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0JEX0FERFIqIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYXZhaWxhYmxlKSB7Ci0gIHRCVE1fQkxFX1BGX0NPVU5UKiBwX2FkZHJfZmlsdGVyID0gTlVMTDsKLSAgdWludDhfdCogcF9jb3VudGVyID0gTlVMTDsKLQotICBpZiAoY29uZF90eXBlID4gQlRNX0JMRV9QRl9UWVBFX0FMTCkgewotICAgIEJUTV9UUkFDRV9FUlJPUigidW5rbm93biBQRiBmaWx0ZXIgY29uZGl0aW9uIHR5cGUgJWQiLCBjb25kX3R5cGUpOwotICAgIHJldHVybiBCVE1fQkxFX0lOVkFMSURfQ09VTlRFUjsKLSAgfQotCi0gIC8qIGZvciB0aGVzZSB0aHJlZSB0eXBlcyBvZiBmaWx0ZXIsIGFsd2F5cyBnZW5lcmljICovCi0gIGlmIChCVE1fQkxFX1BGX0FERFJfRklMVEVSID09IGNvbmRfdHlwZSB8fAotICAgICAgQlRNX0JMRV9QRl9NQU5VX0RBVEEgPT0gY29uZF90eXBlIHx8IEJUTV9CTEVfUEZfTE9DQUxfTkFNRSA9PSBjb25kX3R5cGUgfHwKLSAgICAgIEJUTV9CTEVfUEZfU1JWQ19EQVRBX1BBVFRFUk4gPT0gY29uZF90eXBlKQotICAgIHBfYmRfYWRkciA9IE5VTEw7Ci0KLSAgaWYgKChwX2FkZHJfZmlsdGVyID0gYnRtX2JsZV9maW5kX2FkZHJfZmlsdGVyX2NvdW50ZXIocF9iZF9hZGRyKSkgPT0gTlVMTCAmJgotICAgICAgQlRNX0JMRV9TQ0FOX0NPTkRfQUREID09IGFjdGlvbikgewotICAgIHBfYWRkcl9maWx0ZXIgPSBidG1fYmxlX2FsbG9jX2FkZHJfZmlsdGVyX2NvdW50ZXIocF9iZF9hZGRyLT5iZGEpOwotICB9Ci0KLSAgaWYgKE5VTEwgIT0gcF9hZGRyX2ZpbHRlcikgewotICAgIC8qIGFsbCBmaWx0ZXIganVzdCBjbGVhcmVkICovCi0gICAgaWYgKChCVE1fQkxFX1BGX1RZUEVfQUxMID09IGNvbmRfdHlwZSAmJgotICAgICAgICAgQlRNX0JMRV9TQ0FOX0NPTkRfQ0xFQVIgPT0gYWN0aW9uKSB8fAotICAgICAgICAvKiBvciBiZCBhZGRyZXNzIGZpbHRlciBiZWVuIGRlbGV0ZWQgKi8KLSAgICAgICAgKEJUTV9CTEVfUEZfQUREUl9GSUxURVIgPT0gY29uZF90eXBlICYmCi0gICAgICAgICAoQlRNX0JMRV9TQ0FOX0NPTkRfREVMRVRFID09IGFjdGlvbiB8fAotICAgICAgICAgIEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSID09IGFjdGlvbikpKSB7Ci0gICAgICBidG1fYmxlX2RlYWxsb2NfYWRkcl9maWx0ZXJfY291bnRlcihwX2JkX2FkZHIsIGNvbmRfdHlwZSk7Ci0gICAgfQotICAgIC8qIGlmIG5vdCBmZWF0dXJlIHNlbGVjdGlvbiwgdXBkYXRlIG5ldyBhZGRpdGlvbi9yZWR1Y3Rpb24gb2YgdGhlIGZpbHRlcgotICAgICAgIGNvdW50ZXIgKi8KLSAgICBlbHNlIGlmIChjb25kX3R5cGUgIT0gQlRNX0JMRV9QRl9UWVBFX0FMTCkgewotICAgICAgcF9jb3VudGVyID0gcF9hZGRyX2ZpbHRlci0+cGZfY291bnRlcjsKLSAgICAgIGlmIChudW1fYXZhaWxhYmxlID4gMCkgcF9jb3VudGVyW2NvbmRfdHlwZV0gKz0gMTsKLQotICAgICAgQlRNX1RSQUNFX0RFQlVHKCJjb3VudGVyID0gJWQsIG1heGZpbHQgPSAlZCwgbnVtX2F2Ymw9JWQiLAotICAgICAgICAgICAgICAgICAgICAgIHBfY291bnRlcltjb25kX3R5cGVdLCBjbW5fYmxlX3ZzY19jYi5tYXhfZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgIG51bV9hdmFpbGFibGUpOwotICAgICAgcmV0dXJuIHBfY291bnRlcltjb25kX3R5cGVdOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIm5vIG1hdGNoaW5nIGZpbHRlciBjb3VudGVyIGZvdW5kIik7Ci0gIH0KLSAgLyogbm8gbWF0Y2hpbmcgZmlsdGVyIGxvY2F0ZWQgYW5kIHVwZGF0ZWQgKi8KLSAgcmV0dXJuIEJUTV9CTEVfSU5WQUxJRF9DT1VOVEVSOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgYWRkcmVzcyBmaWx0ZXIgb2YgYWR2LgotICovCi1zdGF0aWMgdm9pZCBCVE1fTEVfUEZfYWRkcl9maWx0ZXIodEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9CRF9BRERSIGFkZHIsIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBjb25zdCB1aW50OF90IGxlbiA9IEJUTV9CTEVfQURWX0ZJTFRfTUVUQV9IRFJfTEVOR1RIICsgQlRNX0JMRV9NRVRBX0FERFJfTEVOOwotCi0gIHVpbnQ4X3QgcGFyYW1bbGVuXTsKLSAgbWVtc2V0KHBhcmFtLCAwLCBsZW4pOwotCi0gIHVpbnQ4X3QqIHAgPSBwYXJhbTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfTUVUQV9QRl9BRERSKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGFjdGlvbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBmaWx0X2luZGV4KTsKLQotICBpZiAoYWN0aW9uICE9IEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSKSB7Ci0gICAgaWYgKGFkZHIudHlwZSA9PSAyIC8qIERFVklDRV9UWVBFX0FMTCBpbiBTY2FuRmlsdGVyUXVldWUuamF2YSAqLykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgRmlsdGVyIGFkZHJlc3MgIiA8PCBhZGRyLmJkYQotICAgICAgICAgICAgICAgIDw8ICIgaGFzIERFVklDRV9UWVBFX0FMTCwgdHJ5IHRvIGdldCBpZGVudGl0eSBhZGRyZXNzIjsKLSAgICAgIC8qIElmIG5vIG1hdGNoaW5nIGlkZW50aXR5IGFkZHJlc3MgaXMgZm91bmQgZm9yIHRoZSBpbnB1dCBhZGRyZXNzLAotICAgICAgICogdGhpcyBjYWxsIHdpbGwgaGF2ZSBubyBlZmZlY3QuICovCi0gICAgICB1aW50OF90IGR1bW15X2FkZHJfdHlwZTsKLSAgICAgIGJ0bV9yYW5kb21fcHNldWRvX3RvX2lkZW50aXR5X2FkZHIoJmFkZHIuYmRhLCAmZHVtbXlfYWRkcl90eXBlKTsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIiBBZGRpbmcgc2NhbiBmaWx0ZXIgd2l0aCBwZWVyIGFkZHJlc3M6ICIgPDwgYWRkci5iZGE7Ci0KLSAgICBCREFERFJfVE9fU1RSRUFNKHAsIGFkZHIuYmRhKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgYWRkci50eXBlKTsKLSAgfQotCi0gIC8qIHNlbmQgYWRkcmVzcyBmaWx0ZXIgKi8KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0JMRV9BRFZfRklMVEVSLCBwYXJhbSwgbGVuLAotICAgICAgYmFzZTo6QmluZCgmYnRtX2ZsdF91cGRhdGVfY2IsIEJUTV9CTEVfTUVUQV9QRl9BRERSLCBjYikpOwotCi0gIG1lbXNldCgmYnRtX2JsZV9hZHZfZmlsdF9jYi5jdXJfZmlsdGVyX3RhcmdldCwgMCwgc2l6ZW9mKHRCTEVfQkRfQUREUikpOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyhhZGRzLCBkZWxldGVzIG9yIGNsZWFycykgdGhlIHNlcnZpY2UgVVVJRCBmaWx0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIEJUTV9MRV9QRl91dWlkX2ZpbHRlcih0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DT05EX1RZUEUgZmlsdGVyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0xPR0lDX1RZUEUgY29uZF9sb2dpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWRfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgdWludDhfdCBldnRfdHlwZTsKLQotICBpZiAoQlRNX0JMRV9QRl9TUlZDX1VVSUQgPT0gZmlsdGVyX3R5cGUpIHsKLSAgICBldnRfdHlwZSA9IEJUTV9CTEVfTUVUQV9QRl9VVUlEOwotICB9IGVsc2UgewotICAgIGV2dF90eXBlID0gQlRNX0JMRV9NRVRBX1BGX1NPTF9VVUlEOwotICB9Ci0KLSAgdWludDhfdCBsZW4gPSBCVE1fQkxFX0FEVl9GSUxUX01FVEFfSERSX0xFTkdUSDsKLSAgdWludDhfdCBtYXhfbGVuID0gbGVuICsgQlRNX0JMRV9NRVRBX1VVSURfTEVOOwotICB1aW50OF90IHBhcmFtW21heF9sZW5dOwotICBtZW1zZXQocGFyYW0sIDAsIG1heF9sZW4pOwotICB1aW50OF90KiBwID0gcGFyYW07Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGV2dF90eXBlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGFjdGlvbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBmaWx0X2luZGV4KTsKLQotICB1aW50OF90IHV1aWRfbGVuID0gdXVpZC5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpOwotICBpZiAoYWN0aW9uICE9IEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSKSB7Ci0gICAgaWYgKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHV1aWQuQXMxNkJpdCgpKTsKLSAgICAgIGxlbiArPSBVdWlkOjprTnVtQnl0ZXMxNjsKLSAgICB9IGVsc2UgaWYgKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczMyKSB7Ci0gICAgICBVSU5UMzJfVE9fU1RSRUFNKHAsIHV1aWQuQXMzMkJpdCgpKTsKLSAgICAgIGxlbiArPSBVdWlkOjprTnVtQnl0ZXMzMjsKLSAgICB9IGVsc2UgaWYgKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgY29uc3QgYXV0byYgdG1wID0gdXVpZC5UbzEyOEJpdExFKCk7Ci0gICAgICBBUlJBWV9UT19TVFJFQU0ocCwgdG1wLmRhdGEoKSwgKGludClVdWlkOjprTnVtQnl0ZXMxMjgpOwotICAgICAgbGVuICs9IFV1aWQ6OmtOdW1CeXRlczEyODsKLSAgICB9IGVsc2UgewotICAgICAgQlRNX1RSQUNFX0VSUk9SKCJpbGxlZ2FsIFVVSUQgbGVuZ3RoOiAlZCIsIHV1aWRfbGVuKTsKLSAgICAgIGNiLlJ1bigwLCBCVE1fQkxFX1BGX0NPTkZJRywgQlRNX0lMTEVHQUxfVkFMVUUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghdXVpZF9tYXNrLklzRW1wdHkoKSkgewotICAgICAgaWYgKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgdXVpZF9tYXNrLkFzMTZCaXQoKSk7Ci0gICAgICAgIGxlbiArPSBVdWlkOjprTnVtQnl0ZXMxNjsKLSAgICAgIH0gZWxzZSBpZiAodXVpZF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMzIpIHsKLSAgICAgICAgVUlOVDMyX1RPX1NUUkVBTShwLCB1dWlkX21hc2suQXMzMkJpdCgpKTsKLSAgICAgICAgbGVuICs9IFV1aWQ6OmtOdW1CeXRlczMyOwotICAgICAgfSBlbHNlIGlmICh1dWlkX2xlbiA9PSBVdWlkOjprTnVtQnl0ZXMxMjgpIHsKLSAgICAgICAgY29uc3QgYXV0byYgdG1wID0gdXVpZF9tYXNrLlRvMTI4Qml0TEUoKTsKLSAgICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIHRtcC5kYXRhKCksIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICAgICAgbGVuICs9IFV1aWQ6OmtOdW1CeXRlczEyODsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbWVtc2V0KHAsIDB4ZmYsIHV1aWRfbGVuKTsKLSAgICAgIGxlbiArPSB1dWlkX2xlbjsKLSAgICB9Ci0gIH0KLQotICAvKiBzZW5kIFVVSUQgZmlsdGVyIHVwZGF0ZSAqLwotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9BRFZfRklMVEVSLCBwYXJhbSwgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJmJ0bV9mbHRfdXBkYXRlX2NiLCBldnRfdHlwZSwgY2IpKTsKLSAgbWVtc2V0KCZidG1fYmxlX2Fkdl9maWx0X2NiLmN1cl9maWx0ZXJfdGFyZ2V0LCAwLCBzaXplb2YodEJMRV9CRF9BRERSKSk7Ci19Ci0KLS8qCi0gKiBVc2VkIHRvIHJlbW92ZSBkZXZpY2UgcmVjb3JkcyBmb3IgZGV2aWNlcyBzZXR0aW5nIHNjYW4gZmlsdGVycyB3aXRoIGFkZHJlc3MsCi0gKiB0eXBlIGFuZCBJUksuIEZsb3c6Ci0gKiAgIC0gU2NhbkZpbHRlciBjb21lcyBpbiB3aXRoIElSSy4KLSAqICAgLSBDaGVjayBJUksgZm9yIGVtcHR5LCBpZiBlbXB0eSBpZ25vcmUgc2V0dGluZyB0byByZXNvbHZpbmcgbGlzdC4KLSAqICAgLSBPdGhlcndpc2Ugd2Ugc2V0IGl0IHRvIHRoZSByZXNvbHZpbmcgbGlzdCB2aWEgQlRNX1NlY0FkZEJsZUtleS4KLSAqICAgLSBUaGVuIG9uIGNsZWFyIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBwYWlyZWQgYW5kIGlmIGl0IGlzbid0IHdlCi0gKiByZW1vdmUgaXQgcmVmZXJlbmNpbmcgdGhpcyBtYXAuCi0gKgotICovCi1zdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVgsIFJhd0FkZHJlc3M+Ci0gICAgcmVtb3ZlX21lX2xhdGVyX21hcDsKLQotdm9pZCBCVE1fTEVfUEZfc2V0KHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBcGNmQ29tbWFuZD4gY29tbWFuZHMsCi0gICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIGlmICghaXNfZmlsdGVyaW5nX3N1cHBvcnRlZCgpKSB7Ci0gICAgY2IuUnVuKDAsIEJUTV9CTEVfUEZfRU5BQkxFLCBCVE1fTU9ERV9VTlNVUFBPUlRFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiA9IEJUTV9CTEVfU0NBTl9DT05EX0FERDsKLSAgZm9yIChjb25zdCBBcGNmQ29tbWFuZCYgY21kIDogY29tbWFuZHMpIHsKLSAgICAvKiBJZiBkYXRhIGlzIHBhc3NlZCwgYm90aCBtYXNrIGFuZCBkYXRhIGhhdmUgdG8gYmUgdGhlIHNhbWUgbGVuZ3RoICovCi0gICAgaWYgKGNtZC5kYXRhLnNpemUoKSAhPSBjbWQuZGF0YV9tYXNrLnNpemUoKSAmJiBjbWQuZGF0YS5zaXplKCkgIT0gMCAmJgotICAgICAgICBjbWQuZGF0YV9tYXNrLnNpemUoKSAhPSAwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgZGF0YSgiIDw8IGNtZC5kYXRhLnNpemUoKSA8PCAiKSBhbmQgbWFzaygiCi0gICAgICAgICAgICAgICAgIDw8IGNtZC5kYXRhX21hc2suc2l6ZSgpIDw8ICIpIGFyZSBvZiBkaWZmZXJlbnQgc2l6ZSI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGNtZC50eXBlKSB7Ci0gICAgICBjYXNlIEJUTV9CTEVfUEZfQUREUl9GSUxURVI6IHsKLSAgICAgICAgdEJMRV9CRF9BRERSIHRhcmdldF9hZGRyOwotICAgICAgICB0YXJnZXRfYWRkci5iZGEgPSBjbWQuYWRkcmVzczsKLSAgICAgICAgdGFyZ2V0X2FkZHIudHlwZSA9IGNtZC5hZGRyX3R5cGU7Ci0KLSAgICAgICAgQlRNX0xFX1BGX2FkZHJfZmlsdGVyKGFjdGlvbiwgZmlsdF9pbmRleCwgdGFyZ2V0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gICAgICAgIGlmICghaXNfZW1wdHlfMTI4Yml0KGNtZC5pcmspKSB7Ci0gICAgICAgICAgLy8gU2F2ZSBpbmRleCBhbmQgYWRkcgotICAgICAgICAgIGF1dG8gZW50cnkgPSByZW1vdmVfbWVfbGF0ZXJfbWFwLmZpbmQoZmlsdF9pbmRleCk7Ci0gICAgICAgICAgaWYgKGVudHJ5ICE9IHJlbW92ZV9tZV9sYXRlcl9tYXAuZW5kKCkpIHsKLSAgICAgICAgICAgIExPR19XQVJOKCJSZXBsYWNpbmcgZXhpc3RpbmcgZmlsdGVyIGluZGV4IGVudHJ5IHdpdGggbmV3IGFkZHJlc3MiKTsKLSAgICAgICAgICAgIC8vIElmIGRldmljZSBpcyBub3QgYm9uZGVkLCB0aGVuIHRyeSByZW1vdmluZyB0aGUgZGV2aWNlCi0gICAgICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGRvZXNuJ3QgZ2V0IHJlbW92ZWQgdGhlbiBpdCBpcyBjdXJyZW50bHkgY29ubmVjdGVkCi0gICAgICAgICAgICAvLyAobWF5IGJlIHBhaXJpbmc/KSBJZiB3ZSBkbyBkZWxldGUgdGhlIGRldmljZSB3ZSB3YW50IHRvIGVyYXNlIHRoZQotICAgICAgICAgICAgLy8gZmlsdGVyIGluZGV4IHNvIHdlIGNhbiByZXBsYWNlIGl0IElmIHRoZSBkZXZpY2UgaXMgYm9uZGVkLCB3ZQotICAgICAgICAgICAgLy8gd2FudCB0byBlcmFzZSB0aGUgZmlsdGVyIGluZGV4IHNvIHdlIGRvbid0IGRlbGV0ZSBpdCBpbiB0aGUgbGF0ZXIKLSAgICAgICAgICAgIC8vIEJUTV9MRV9QRl9jbGVhciBjYWxsLgotICAgICAgICAgICAgaWYgKCFidG1fc2VjX2lzX2FfYm9uZGVkX2RldihlbnRyeS0+c2Vjb25kKSkgewotICAgICAgICAgICAgICBpZiAoIUJUTV9TZWNEZWxldGVEZXZpY2UoZW50cnktPnNlY29uZCkpIHsKLSAgICAgICAgICAgICAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHJlbW92ZSBkZXZpY2UsIHN0aWxsIGNvbm5lY3RlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbW92ZV9tZV9sYXRlcl9tYXAuZXJhc2UoZmlsdF9pbmRleCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChidG1fZmluZF9kZXYoY21kLmFkZHJlc3MpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIFVubGVzcyB0aGUgdXNlciB0cmllcyB0byBib25kIHdpdGggYSBkZXZpY2UgaW4gYmV0d2VlbiB0aGUKLSAgICAgICAgICAgIC8vIHNjYW5uZXIgYXBwIHN0YXJ0aW5nIGEgc2NhbiwgdGhlbiBjcmFzaGluZywgdGhlbiBiZWluZyByZXN0YXJ0ZWQKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBnZXQgdG8gdGhpcyBzYW1lIHBvaW50IHdpdGggdGhlIHNhbWUgZmlsdF9pbmRleCAod2hvc2UKLSAgICAgICAgICAgIC8vIHZhbHVlIGlzIG1hbmFnZWQgYnkgdGhlIEphdmEgbGF5ZXIpIHRoZW4gd2UgbWlnaHQgaGF2ZSBhIGRldmljZQotICAgICAgICAgICAgLy8gcmVjb3JkIGhlcmUsIGluIHdoaWNoIGNhc2Ugc29tZXRoaW5nIGVsc2UgaXMgbWFuYWdpbmcgdGhlIGRldmljZQotICAgICAgICAgICAgLy8gYW5kIHdlIGRvIG5vdCB3YW50IHRvIGludGVyZmVyZSB3aXRoIHRoYXQgZXhwZXJpZW5jZS4KLSAgICAgICAgICAgIExPR19XQVJOKCJBZGRyZXNzIHJlY29yZCBhbHJlYWR5IGV4aXN0cy4uLnRoaXMgaXMgdW5leHBlY3RlZC4uLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyAidGVtcG9yYXJ5IiBkZXZpY2UgcmVjb3JkCi0gICAgICAgICAgYnRtX3NlY19hbGxvY19kZXYoY21kLmFkZHJlc3MpOwotICAgICAgICAgIHJlbW92ZV9tZV9sYXRlcl9tYXAuZW1wbGFjZShmaWx0X2luZGV4LCBjbWQuYWRkcmVzcyk7Ci0gICAgICAgICAgLy8gU2V0IHRoZSBJUksKLSAgICAgICAgICB0QlRNX0xFX1BJRF9LRVlTIHBpZF9rZXlzOwotICAgICAgICAgIHBpZF9rZXlzLmlyayA9IGNtZC5pcms7Ci0gICAgICAgICAgcGlkX2tleXMuaWRlbnRpdHlfYWRkcl90eXBlID0gY21kLmFkZHJfdHlwZTsKLSAgICAgICAgICBwaWRfa2V5cy5pZGVudGl0eV9hZGRyID0gY21kLmFkZHJlc3M7Ci0gICAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSB1bmlvbiB0byBwYXNzIHRvIFNlY0FkZEJsZUtleQotICAgICAgICAgIHRCVE1fTEVfS0VZX1ZBTFVFIGxlX2tleTsKLSAgICAgICAgICBsZV9rZXkucGlkX2tleSA9IHBpZF9rZXlzOwotICAgICAgICAgIEJUTV9TZWNBZGRCbGVLZXkoY21kLmFkZHJlc3MsICZsZV9rZXksIEJUTV9MRV9LRVlfUElEKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBCVE1fQkxFX1BGX1NSVkNfREFUQToKLSAgICAgICAgQlRNX0xFX1BGX3NydmNfZGF0YShhY3Rpb24sIGZpbHRfaW5kZXgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVE1fQkxFX1BGX1NSVkNfVVVJRDoKLSAgICAgIGNhc2UgQlRNX0JMRV9QRl9TUlZDX1NPTF9VVUlEOiB7Ci0gICAgICAgIEJUTV9MRV9QRl91dWlkX2ZpbHRlcihhY3Rpb24sIGZpbHRfaW5kZXgsIGNtZC50eXBlLCBjbWQudXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfUEZfTE9HSUNfQU5ELCBjbWQudXVpZF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBCVE1fQkxFX1BGX0xPQ0FMX05BTUU6IHsKLSAgICAgICAgQlRNX0xFX1BGX2xvY2FsX25hbWUoYWN0aW9uLCBmaWx0X2luZGV4LCBjbWQubmFtZSwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBCVE1fQkxFX1BGX01BTlVfREFUQTogewotICAgICAgICBCVE1fTEVfUEZfbWFudV9kYXRhKGFjdGlvbiwgZmlsdF9pbmRleCwgY21kLmNvbXBhbnksIGNtZC5jb21wYW55X21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmRhdGEsIGNtZC5kYXRhX21hc2ssIGJhc2U6OkRvTm90aGluZygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQlRNX0JMRV9QRl9TUlZDX0RBVEFfUEFUVEVSTjogewotICAgICAgICBCVE1fTEVfUEZfc3J2Y19kYXRhX3BhdHRlcm4oYWN0aW9uLCBmaWx0X2luZGV4LCBjbWQuZGF0YSwgY21kLmRhdGFfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkRvTm90aGluZygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBmaWx0ZXIgdHlwZTogIiA8PCArY21kLnR5cGU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBjYi5SdW4oMCwgMCwgQlRNX1NVQ0NFU1MpOwotfQotCi0vKioKLSAqIGFsbCBhZHYgcGF5bG9hZCBmaWx0ZXIgYnkgZGUtc2VsZWN0aW5nIGFsbCB0aGUgYWR2IHBmIGZlYXR1cmUgYml0cwotICovCi12b2lkIEJUTV9MRV9QRl9jbGVhcih0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgaWYgKCFpc19maWx0ZXJpbmdfc3VwcG9ydGVkKCkpIHsKLSAgICBjYi5SdW4oMCwgQlRNX0JMRV9QRl9FTkFCTEUsIEJUTV9NT0RFX1VOU1VQUE9SVEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBjbGVhciB0aGUgZ2VuZXJhbCBmaWx0ZXIgZW50cnkgKi8KLSAgewotICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBmRG9Ob3RoaW5nOwotCi0gICAgLyogY2xlYXIgbWFudWZhY3R1ZXIgZGF0YSBmaWx0ZXIgKi8KLSAgICBCVE1fTEVfUEZfbWFudV9kYXRhKEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSLCBmaWx0X2luZGV4LCAwLCAwLCB7fSwge30sCi0gICAgICAgICAgICAgICAgICAgICAgICBmRG9Ob3RoaW5nKTsKLQotICAgIC8qIGNsZWFyIGxvY2FsIG5hbWUgZmlsdGVyICovCi0gICAgQlRNX0xFX1BGX2xvY2FsX25hbWUoQlRNX0JMRV9TQ0FOX0NPTkRfQ0xFQVIsIGZpbHRfaW5kZXgsIHt9LCBmRG9Ob3RoaW5nKTsKLQotICAgIC8qIHVwZGF0ZSB0aGUgY291bnRlciBmb3Igc2VydmljZSBkYXRhICovCi0gICAgQlRNX0xFX1BGX3NydmNfZGF0YShCVE1fQkxFX1NDQU5fQ09ORF9DTEVBUiwgZmlsdF9pbmRleCk7Ci0KLSAgICAvKiBjbGVhciBVVUlEIGZpbHRlciAqLwotICAgIEJUTV9MRV9QRl91dWlkX2ZpbHRlcihCVE1fQkxFX1NDQU5fQ09ORF9DTEVBUiwgZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9QRl9TUlZDX1VVSUQsIHt9LCAwLCBVdWlkOjprRW1wdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZEb05vdGhpbmcpOwotCi0gICAgQlRNX0xFX1BGX3V1aWRfZmlsdGVyKEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSLCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX1BGX1NSVkNfU09MX1VVSUQsIHt9LCAwLCBVdWlkOjprRW1wdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZEb05vdGhpbmcpOwotCi0gICAgLyogY2xlYXIgc2VydmljZSBkYXRhIGZpbHRlciAqLwotICAgIEJUTV9MRV9QRl9zcnZjX2RhdGFfcGF0dGVybihCVE1fQkxFX1NDQU5fQ09ORF9DTEVBUiwgZmlsdF9pbmRleCwge30sIHt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRG9Ob3RoaW5nKTsKLQotICAgIC8vIElmIHdlIGhhdmUgYW4gZW50cnksIGxldHMgcmVtb3ZlIHRoZSBkZXZpY2UgaWYgaXQgaXNuJ3QgYm9uZGVkCi0gICAgYXV0byBlbnRyeSA9IHJlbW92ZV9tZV9sYXRlcl9tYXAuZmluZChmaWx0X2luZGV4KTsKLSAgICBpZiAoZW50cnkgIT0gcmVtb3ZlX21lX2xhdGVyX21hcC5lbmQoKSkgewotICAgICAgYXV0byBlbnRyeSA9IHJlbW92ZV9tZV9sYXRlcl9tYXAuZmluZChmaWx0X2luZGV4KTsKLSAgICAgIGlmICghYnRtX3NlY19pc19hX2JvbmRlZF9kZXYoZW50cnktPnNlY29uZCkpIHsKLSAgICAgICAgQlRNX1NlY0RlbGV0ZURldmljZShlbnRyeS0+c2Vjb25kKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB1aW50OF90IGxlbiA9IEJUTV9CTEVfQURWX0ZJTFRfTUVUQV9IRFJfTEVOR1RIICsgQlRNX0JMRV9QRl9GRUFUX1NFTF9MRU47Ci0gIHVpbnQ4X3QgcGFyYW1bbGVuXTsKLSAgbWVtc2V0KHBhcmFtLCAwLCBsZW4pOwotCi0gIHVpbnQ4X3QqIHAgPSBwYXJhbTsKLQotICAvKiBzZWxlY3QgZmVhdHVyZSBiYXNlZCBvbiBjb250cm9sIGJsb2NrIHNldHRpbmdzICovCi0gIFVJTlQ4X1RPX1NUUkVBTShwLCBCVE1fQkxFX01FVEFfUEZfRkVBVF9TRUwpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9TQ0FOX0NPTkRfQ0xFQVIpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgZmlsdF9pbmRleCk7Ci0gIC8qIHNldCBQQ0Ygc2VsZWN0aW9uICovCi0gIFVJTlQzMl9UT19TVFJFQU0ocCwgQlRNX0JMRV9QRl9TRUxFQ1RfTk9ORSk7Ci0gIC8qIHNldCBsb2dpYyBjb25kaXRpb24gYXMgT1IgYXMgZGVmYXVsdCAqLwotICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9QRl9MT0dJQ19PUik7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0JMRV9BRFZfRklMVEVSLCBwYXJhbSwgbGVuLAotICAgICAgYmFzZTo6QmluZCgmYnRtX2ZsdF91cGRhdGVfY2IsIEJUTV9CTEVfTUVUQV9QRl9GRUFUX1NFTCwgY2IpKTsKLQotICBtZW1zZXQoJmJ0bV9ibGVfYWR2X2ZpbHRfY2IuY3VyX2ZpbHRlcl90YXJnZXQsIDAsIHNpemVvZih0QkxFX0JEX0FERFIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXR1cCB0aGUgYWR2IGRhdGEgcGF5bG9hZCBmaWx0ZXIKLSAqICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYWN0aW9uIC0gVHlwZSBvZiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9pbmRleCAtIEZpbHRlciBpbmRleAotICogICAgICAgICAgICAgICAgICAgICAgIHBfZmlsdF9wYXJhbXMgLSBGaWx0ZXIgcGFyYW1ldGVycwotICogICAgICAgICAgICAgICAgICAgICAgIGNiIC0gQ2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlQWR2RmlsdGVyUGFyYW1TZXR1cCgKLSAgICB0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLCB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgc3RkOjp1bmlxdWVfcHRyPGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q+IHBfZmlsdF9wYXJhbXMsCi0gICAgdEJUTV9CTEVfUEZfUEFSQU1fQ0IgY2IpIHsKLSAgdEJUTV9CTEVfUEZfQ09VTlQqIHBfYmRhX2ZpbHRlciA9IE5VTEw7Ci0gIHVpbnQ4X3QgbGVuID0gQlRNX0JMRV9BRFZfRklMVF9NRVRBX0hEUl9MRU5HVEggKwotICAgICAgICAgICAgICAgIEJUTV9CTEVfQURWX0ZJTFRfRkVBVF9TRUxOX0xFTiArIEJUTV9CTEVfQURWX0ZJTFRfVFJBQ0tfTlVNOwotICB1aW50OF90IHBhcmFtW2xlbl0sICpwOwotCi0gIGlmICghaXNfZmlsdGVyaW5nX3N1cHBvcnRlZCgpKSB7Ci0gICAgY2IuUnVuKDAsIEJUTV9CTEVfUEZfRU5BQkxFLCBidG1fc3RhdHVzX3ZhbHVlKEJUTV9NT0RFX1VOU1VQUE9SVEVEKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9IHBhcmFtOwotICBtZW1zZXQocGFyYW0sIDAsIGxlbik7Ci0gIEJUTV9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKEJUTV9CTEVfU0NBTl9DT05EX0FERCA9PSBhY3Rpb24pIHsKLSAgICBwX2JkYV9maWx0ZXIgPSBidG1fYmxlX2ZpbmRfYWRkcl9maWx0ZXJfY291bnRlcihudWxscHRyKTsKLSAgICBpZiAoTlVMTCA9PSBwX2JkYV9maWx0ZXIpIHsKLSAgICAgIEJUTV9UUkFDRV9FUlJPUigiQkQgQWRkcmVzcyBub3QgZm91bmQhIik7Ci0gICAgICBjYi5SdW4oMCwgQlRNX0JMRV9QRl9FTkFCTEUsIGJ0bV9zdGF0dXNfdmFsdWUoQlRNX1VOS05PV05fQUREUikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgOiBGZWF0IG1hc2s6JWQiLCBfX2Z1bmNfXywgcF9maWx0X3BhcmFtcy0+ZmVhdF9zZWxuKTsKLSAgICAvKiBzZWxlY3QgZmVhdHVyZSBiYXNlZCBvbiBjb250cm9sIGJsb2NrIHNldHRpbmdzICovCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfTUVUQV9QRl9GRUFUX1NFTCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfU0NBTl9DT05EX0FERCk7Ci0KLSAgICAvKiBGaWx0ZXIgaW5kZXggKi8KLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgZmlsdF9pbmRleCk7Ci0KLSAgICAvKiBzZXQgUENGIHNlbGVjdGlvbiAqLwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9maWx0X3BhcmFtcy0+ZmVhdF9zZWxuKTsKLSAgICAvKiBzZXQgbG9naWMgdHlwZSAqLwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9maWx0X3BhcmFtcy0+bGlzdF9sb2dpY190eXBlKTsKLSAgICAvKiBzZXQgbG9naWMgY29uZGl0aW9uICovCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfZmlsdF9wYXJhbXMtPmZpbHRfbG9naWNfdHlwZSk7Ci0gICAgLyogc2V0IFJTU0kgaGlnaCB0aHJlc2hvbGQgKi8KLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9maWx0X3BhcmFtcy0+cnNzaV9oaWdoX3RocmVzKTsKLSAgICAvKiBzZXQgZGVsaXZlcnkgbW9kZSAqLwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2ZpbHRfcGFyYW1zLT5kZWx5X21vZGUpOwotCi0gICAgaWYgKDB4MDEgPT0gcF9maWx0X3BhcmFtcy0+ZGVseV9tb2RlKSB7Ci0gICAgICAvKiBzZXQgb25mb3VuZCB0aW1lb3V0ICovCi0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfZmlsdF9wYXJhbXMtPmZvdW5kX3RpbWVvdXQpOwotICAgICAgLyogc2V0IG9uZm91bmQgdGltZW91dCBjb3VudCovCi0gICAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9maWx0X3BhcmFtcy0+Zm91bmRfdGltZW91dF9jbnQpOwotICAgICAgLyogc2V0IFJTU0kgbG93IHRocmVzaG9sZCAqLwotICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfZmlsdF9wYXJhbXMtPnJzc2lfbG93X3RocmVzKTsKLSAgICAgIC8qIHNldCBvbmxvc3QgdGltZW91dCAqLwotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2ZpbHRfcGFyYW1zLT5sb3N0X3RpbWVvdXQpOwotICAgICAgLyogc2V0IG51bV9vZl90cmFja19lbnRyaWVzIGZvciBmaXJtd2FyZSBncmVhdGVyIHRoYW4gTC1yZWxlYXNlIHZlcnNpb24gKi8KLSAgICAgIGlmIChjbW5fYmxlX3ZzY19jYi52ZXJzaW9uX3N1cHBvcnRlZCA+IEJUTV9WU0NfQ0hJUF9DQVBBQklMSVRZX0xfVkVSU0lPTikKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2ZpbHRfcGFyYW1zLT5udW1fb2ZfdHJhY2tpbmdfZW50cmllcyk7Ci0gICAgfQotCi0gICAgaWYgKGNtbl9ibGVfdnNjX2NiLnZlcnNpb25fc3VwcG9ydGVkID09IEJUTV9WU0NfQ0hJUF9DQVBBQklMSVRZX0xfVkVSU0lPTikKLSAgICAgIGxlbiA9IEJUTV9CTEVfQURWX0ZJTFRfTUVUQV9IRFJfTEVOR1RIICsgQlRNX0JMRV9BRFZfRklMVF9GRUFUX1NFTE5fTEVOOwotICAgIGVsc2UKLSAgICAgIGxlbiA9IEJUTV9CTEVfQURWX0ZJTFRfTUVUQV9IRFJfTEVOR1RIICsgQlRNX0JMRV9BRFZfRklMVF9GRUFUX1NFTE5fTEVOICsKLSAgICAgICAgICAgIEJUTV9CTEVfQURWX0ZJTFRfVFJBQ0tfTlVNOwotCi0gICAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgICAgRlJPTV9IRVJFLCBIQ0lfQkxFX0FEVl9GSUxURVIsIHBhcmFtLCBsZW4sCi0gICAgICAgIGJhc2U6OkJpbmQoJmJ0bV9mbHRfdXBkYXRlX2NiLCBCVE1fQkxFX01FVEFfUEZfRkVBVF9TRUwsIGNiKSk7Ci0gIH0gZWxzZSBpZiAoQlRNX0JMRV9TQ0FOX0NPTkRfREVMRVRFID09IGFjdGlvbikgewotICAgIC8qIHNlbGVjdCBmZWF0dXJlIGJhc2VkIG9uIGNvbnRyb2wgYmxvY2sgc2V0dGluZ3MgKi8KLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9NRVRBX1BGX0ZFQVRfU0VMKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9TQ0FOX0NPTkRfREVMRVRFKTsKLSAgICAvKiBGaWx0ZXIgaW5kZXggKi8KLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgZmlsdF9pbmRleCk7Ci0KLSAgICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgICBGUk9NX0hFUkUsIEhDSV9CTEVfQURWX0ZJTFRFUiwgcGFyYW0sCi0gICAgICAgICh1aW50OF90KShCVE1fQkxFX0FEVl9GSUxUX01FVEFfSERSX0xFTkdUSCksCi0gICAgICAgIGJhc2U6OkJpbmQoJmJ0bV9mbHRfdXBkYXRlX2NiLCBCVE1fQkxFX01FVEFfUEZfRkVBVF9TRUwsIGNiKSk7Ci0KLSAgICBhdXRvIGVudHJ5ID0gcmVtb3ZlX21lX2xhdGVyX21hcC5maW5kKGZpbHRfaW5kZXgpOwotICAgIGlmIChlbnRyeSAhPSByZW1vdmVfbWVfbGF0ZXJfbWFwLmVuZCgpKSB7Ci0gICAgICBMT0dfV0FSTigiUmVwbGFjaW5nIGV4aXN0aW5nIGZpbHRlciBpbmRleCBlbnRyeSB3aXRoIG5ldyBhZGRyZXNzIik7Ci0gICAgICAvLyBJZiBkZXZpY2UgaXMgbm90IGJvbmRlZCwgdGhlbiB0cnkgcmVtb3ZpbmcgdGhlIGRldmljZQotICAgICAgLy8gSWYgdGhlIGRldmljZSBkb2Vzbid0IGdldCByZW1vdmVkIHRoZW4gaXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZAotICAgICAgLy8gKG1heSBiZSBwYWlyaW5nPykgSWYgd2UgZG8gZGVsZXRlIHRoZSBkZXZpY2Ugd2Ugd2FudCB0byBlcmFzZSB0aGUKLSAgICAgIC8vIGZpbHRlciBpbmRleCBzbyB3ZSBjYW4gcmVwbGFjZSBpdCBJZiB0aGUgZGV2aWNlIGlzIGJvbmRlZCwgd2UKLSAgICAgIC8vIHdhbnQgdG8gZXJhc2UgdGhlIGZpbHRlciBpbmRleCBzbyB3ZSBkb24ndCBkZWxldGUgaXQgaW4gdGhlIGxhdGVyCi0gICAgICAvLyBCVE1fTEVfUEZfY2xlYXIgY2FsbC4KLSAgICAgIGlmICghYnRtX3NlY19pc19hX2JvbmRlZF9kZXYoZW50cnktPnNlY29uZCkpIHsKLSAgICAgICAgaWYgKCFCVE1fU2VjRGVsZXRlRGV2aWNlKGVudHJ5LT5zZWNvbmQpKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byByZW1vdmUgZGV2aWNlLCBzdGlsbCBjb25uZWN0ZWQuIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZW1vdmVfbWVfbGF0ZXJfbWFwLmVyYXNlKGZpbHRfaW5kZXgpOwotICAgIH0KLQotICB9IGVsc2UgaWYgKEJUTV9CTEVfU0NBTl9DT05EX0NMRUFSID09IGFjdGlvbikgewotICAgIC8qIERlYWxsb2NhdGUgYWxsIGZpbHRlcnMgaGVyZSAqLwotICAgIGJ0bV9ibGVfZGVhbGxvY19hZGRyX2ZpbHRlcl9jb3VudGVyKE5VTEwsIEJUTV9CTEVfUEZfVFlQRV9BTEwpOwotCi0gICAgLyogc2VsZWN0IGZlYXR1cmUgYmFzZWQgb24gY29udHJvbCBibG9jayBzZXR0aW5ncyAqLwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBCVE1fQkxFX01FVEFfUEZfRkVBVF9TRUwpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBCVE1fQkxFX1NDQU5fQ09ORF9DTEVBUik7Ci0KLSAgICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgICBGUk9NX0hFUkUsIEhDSV9CTEVfQURWX0ZJTFRFUiwgcGFyYW0sCi0gICAgICAgICh1aW50OF90KShCVE1fQkxFX0FEVl9GSUxUX01FVEFfSERSX0xFTkdUSCAtIDEpLAotICAgICAgICBiYXNlOjpCaW5kKCZidG1fZmx0X3VwZGF0ZV9jYiwgQlRNX0JMRV9NRVRBX1BGX0ZFQVRfU0VMLCBjYikpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9jbXBsX2NiYWNrKHRCVE1fQkxFX1BGX1NUQVRVU19DQkFDSyBwX3N0YXRfY2JhY2ssIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzLCBvcF9zdWJjb2RlLCBhY3Rpb247Ci0KLSAgaWYgKGV2dF9sZW4gIT0gMykgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IEFQQ0YgY2FsbGJhY2sgbGVuZ3RoID0gJWQiLCBfX2Z1bmNfXywgZXZ0X2xlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChvcF9zdWJjb2RlLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGFjdGlvbiwgcCk7Ci0KLSAgaWYgKG9wX3N1YmNvZGUgIT0gQlRNX0JMRV9NRVRBX1BGX0VOQUJMRSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXMgOmJhZCBzdWJjb2RlOiAweCUwMngiLCBfX2Z1bmNfXywgb3Bfc3ViY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1cyA9IChzdGF0dXMgPT0gMCkgPyBCVE1fU1VDQ0VTUyA6IEJUTV9FUlJfUFJPQ0VTU0lORzsKLSAgcF9zdGF0X2NiYWNrLlJ1bihhY3Rpb24sIGJ0bV9zdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUVuYWJsZURpc2FibGVGaWx0ZXJGZWF0dXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlbmFibGUgLyBkaXNhYmxlIHRoZSBBUENGIGZlYXR1cmUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGVuYWJsZTogZW5hYmxlIG9yIGRpc2FibGUgdGhlIGZpbHRlciBjb25kaXRpb24KLSAqICAgICAgICAgICAgICAgICAgcF9zdGF0X2NiYWNrIC0gU3RhdHVzIGNhbGxiYWNrIHBvaW50ZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUodWludDhfdCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9TVEFUVVNfQ0JBQ0sgcF9zdGF0X2NiYWNrKSB7Ci0gIGlmICghaXNfZmlsdGVyaW5nX3N1cHBvcnRlZCgpKSB7Ci0gICAgaWYgKHBfc3RhdF9jYmFjaykKLSAgICAgIHBfc3RhdF9jYmFjay5SdW4oQlRNX0JMRV9QRl9FTkFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJUTV9NT0RFX1VOU1VQUE9SVEVEIC8qIEJUQV9GQUlMVVJFICovKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IHBhcmFtWzIwXTsKLSAgbWVtc2V0KHBhcmFtLCAwLCAyMCk7Ci0KLSAgdWludDhfdCogcCA9IHBhcmFtOwotICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9NRVRBX1BGX0VOQUJMRSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBlbmFibGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfQkxFX0FEVl9GSUxURVIsIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfUENGX0VOQUJMRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmZW5hYmxlX2NtcGxfY2JhY2ssIHBfc3RhdF9jYmFjaykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9hZHZfZmlsdGVyX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGFkdiBmaWx0ZXIgY29udHJvbCBibG9jawotICoKLSAqIFBhcmFtZXRlcnMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfYWR2X2ZpbHRlcl9pbml0KHZvaWQpIHsKLSAgbWVtc2V0KCZidG1fYmxlX2Fkdl9maWx0X2NiLCAwLCBzaXplb2YodEJUTV9CTEVfQURWX0ZJTFRFUl9DQikpOwotCi0gIEJUTV9CbGVHZXRWZW5kb3JDYXBhYmlsaXRpZXMoJmNtbl9ibGVfdnNjX2NiKTsKLQotICBpZiAoIWlzX2ZpbHRlcmluZ19zdXBwb3J0ZWQoKSkgcmV0dXJuOwotCi0gIGlmIChjbW5fYmxlX3ZzY19jYi5tYXhfZmlsdGVyID4gMCkgewotICAgIGJ0bV9ibGVfYWR2X2ZpbHRfY2IucF9hZGRyX2ZpbHRlcl9jb3VudCA9ICh0QlRNX0JMRV9QRl9DT1VOVCopb3NpX21hbGxvYygKLSAgICAgICAgc2l6ZW9mKHRCVE1fQkxFX1BGX0NPVU5UKSAqIGNtbl9ibGVfdnNjX2NiLm1heF9maWx0ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX2JsZV9iYXRjaHNjYW4uY2MgYi9zdGFjay9idG0vYnRtX2JsZV9iYXRjaHNjYW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYWFjZTUuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9ibGVfYmF0Y2hzY2FuLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotCi0jaW5jbHVkZSAiYnRtX2JsZV9hcGkuaCIKLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLXVzaW5nIGJhc2U6OkJpbmQ7Ci11c2luZyBiYXNlOjpDYWxsYmFjazsKLXVzaW5nIGhjaV9jbWRfY2IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QqIC8qIHJldHVybl9wYXJhbWV0ZXJzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgLyogcmV0dXJuX3BhcmFtZXRlcnNfbGVuZ3RoKi8pPjsKLQotdEJUTV9CTEVfQkFUQ0hfU0NBTl9DQiBibGVfYmF0Y2hzY2FuX2NiOwotdEJUTV9CTEVfQURWX1RSQUNLX0NCIGJsZV9hZHZ0cmFja19jYjsKLQotLyogbGVuZ3RoIG9mIGVhY2ggYmF0Y2ggc2NhbiBjb21tYW5kICovCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfU0NBTl9TVE9SQUdFX0NGR19MRU4gNAotI2RlZmluZSBCVE1fQkxFX0JBVENIX1NDQU5fUEFSQU1fQ09ORklHX0xFTiAxMgotI2RlZmluZSBCVE1fQkxFX0JBVENIX1NDQU5fRU5CX0RJU0JfTEVOIDIKLSNkZWZpbmUgQlRNX0JMRV9CQVRDSF9TQ0FOX1JFQURfUkVTVUxUU19MRU4gMgotCi1uYW1lc3BhY2UgewotCi1ib29sIGNhbl9kb19iYXRjaF9zY2FuKCkgewotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGUoKSkgcmV0dXJuIGZhbHNlOwotCi0gIHRCVE1fQkxFX1ZTQ19DQiBjbW5fYmxlX3ZzY19jYjsKLSAgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcygmY21uX2JsZV92c2NfY2IpOwotCi0gIGlmIChjbW5fYmxlX3ZzY19jYi50b3Rfc2Nhbl9yZXN1bHRzX3N0cmcgPT0gMCkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBWU0UgY2FsbGJhY2sgZm9yIGJhdGNoIHNjYW4sIGZpbHRlciwgYW5kIHRyYWNraW5nIGV2ZW50cyAqLwotdm9pZCBidG1fYmxlX2JhdGNoc2Nhbl9maWx0ZXJfdHJhY2tfYWR2X3ZzZV9jYmFjayh1aW50OF90IGxlbiwgdWludDhfdCogcCkgewotICB0QlRNX0JMRV9UUkFDS19BRFZfREFUQSBhZHZfZGF0YTsKLQotICB1aW50OF90IHN1Yl9ldmVudCA9IDA7Ci0gIHRCVE1fQkxFX1ZTQ19DQiBjbW5fYmxlX3ZzY19jYjsKLSAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gIFNUUkVBTV9UT19VSU5UOChzdWJfZXZlbnQsIHApOwotCi0gIEJUTV9UUkFDRV9FVkVOVCgKLSAgICAgICJidG1fYmxlX2JhdGNoc2Nhbl9maWx0ZXJfdHJhY2tfYWR2X3ZzZV9jYmFjayBjYWxsZWQgd2l0aCBldmVudDoleCIsCi0gICAgICBzdWJfZXZlbnQpOwotICBpZiAoSENJX1ZTRV9TVUJDT0RFX0JMRV9USFJFU0hPTERfU1VCX0VWVCA9PSBzdWJfZXZlbnQgJiYKLSAgICAgIE5VTEwgIT0gYmxlX2JhdGNoc2Nhbl9jYi5wX3RocmVzX2NiYWNrKSB7Ci0gICAgYmxlX2JhdGNoc2Nhbl9jYi5wX3RocmVzX2NiYWNrKGJsZV9iYXRjaHNjYW5fY2IucmVmX3ZhbHVlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoSENJX1ZTRV9TVUJDT0RFX0JMRV9UUkFDS0lOR19TVUJfRVZUID09IHN1Yl9ldmVudCAmJgotICAgICAgTlVMTCAhPSBibGVfYWR2dHJhY2tfY2IucF90cmFja19jYmFjaykgewotICAgIGlmIChsZW4gPCAxMCkgcmV0dXJuOwotCi0gICAgbWVtc2V0KCZhZHZfZGF0YSwgMCwgc2l6ZW9mKHRCVE1fQkxFX1RSQUNLX0FEVl9EQVRBKSk7Ci0gICAgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcygmY21uX2JsZV92c2NfY2IpOwotICAgIGFkdl9kYXRhLmNsaWVudF9pZiA9ICh1aW50OF90KWJsZV9hZHZ0cmFja19jYi5yZWZfdmFsdWU7Ci0gICAgaWYgKGNtbl9ibGVfdnNjX2NiLnZlcnNpb25fc3VwcG9ydGVkID4gQlRNX1ZTQ19DSElQX0NBUEFCSUxJVFlfTF9WRVJTSU9OKSB7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoYWR2X2RhdGEuZmlsdF9pbmRleCwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoYWR2X2RhdGEuYWR2ZXJ0aXNlcl9zdGF0ZSwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoYWR2X2RhdGEuYWR2ZXJ0aXNlcl9pbmZvX3ByZXNlbnQsIHApOwotICAgICAgU1RSRUFNX1RPX0JEQUREUihhZHZfZGF0YS5iZF9hZGRyLCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChhZHZfZGF0YS5hZGRyX3R5cGUsIHApOwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSBhZHYgaW5mbyBkZXRhaWxzICovCi0gICAgICBpZiAoQURWX0lORk9fUFJFU0VOVCA9PSBhZHZfZGF0YS5hZHZlcnRpc2VyX2luZm9fcHJlc2VudCkgewotICAgICAgICBpZiAobGVuIDwgMTUpIHJldHVybjsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGFkdl9kYXRhLnR4X3Bvd2VyLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGFkdl9kYXRhLnJzc2lfdmFsdWUsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGFkdl9kYXRhLnRpbWVfc3RhbXAsIHApOwotCi0gICAgICAgIFNUUkVBTV9UT19VSU5UOChhZHZfZGF0YS5hZHZfcGt0X2xlbiwgcCk7Ci0gICAgICAgIGlmIChhZHZfZGF0YS5hZHZfcGt0X2xlbiA+IDApIHsKLSAgICAgICAgICBhZHZfZGF0YS5wX2Fkdl9wa3RfZGF0YSA9Ci0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihvc2lfbWFsbG9jKGFkdl9kYXRhLmFkdl9wa3RfbGVuKSk7Ci0gICAgICAgICAgbWVtY3B5KGFkdl9kYXRhLnBfYWR2X3BrdF9kYXRhLCBwLCBhZHZfZGF0YS5hZHZfcGt0X2xlbik7Ci0gICAgICAgICAgcCArPSBhZHZfZGF0YS5hZHZfcGt0X2xlbjsKLSAgICAgICAgfQotCi0gICAgICAgIFNUUkVBTV9UT19VSU5UOChhZHZfZGF0YS5zY2FuX3JzcF9sZW4sIHApOwotICAgICAgICBpZiAoYWR2X2RhdGEuc2Nhbl9yc3BfbGVuID4gMCkgewotICAgICAgICAgIGFkdl9kYXRhLnBfc2Nhbl9yc3BfZGF0YSA9Ci0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihvc2lfbWFsbG9jKGFkdl9kYXRhLnNjYW5fcnNwX2xlbikpOwotICAgICAgICAgIG1lbWNweShhZHZfZGF0YS5wX3NjYW5fcnNwX2RhdGEsIHAsIGFkdl9kYXRhLnNjYW5fcnNwX2xlbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogQmFzZWQgb24gTC1yZWxlYXNlIHZlcnNpb24gKi8KLSAgICAgIFNUUkVBTV9UT19VSU5UOChhZHZfZGF0YS5maWx0X2luZGV4LCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChhZHZfZGF0YS5hZGRyX3R5cGUsIHApOwotICAgICAgU1RSRUFNX1RPX0JEQUREUihhZHZfZGF0YS5iZF9hZGRyLCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChhZHZfZGF0YS5hZHZlcnRpc2VyX3N0YXRlLCBwKTsKLSAgICB9Ci0KLSAgICBCVE1fVFJBQ0VfRVZFTlQoInRyYWNrX2Fkdl92c2VfY2JhY2sgY2FsbGVkOiAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYWR2X2RhdGEuZmlsdF9pbmRleCwgYWR2X2RhdGEuYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICBhZHZfZGF0YS5hZHZlcnRpc2VyX3N0YXRlKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGV2aWNlIGlzIGtub3duCi0gICAgQlRNX1NlY0FkZEJsZURldmljZShhZHZfZGF0YS5iZF9hZGRyLCBCVF9ERVZJQ0VfVFlQRV9CTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZGF0YS5hZGRyX3R5cGUpOwotCi0gICAgYmxlX2FkdnRyYWNrX2NiLnBfdHJhY2tfY2JhY2soJmFkdl9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBmZWF0X2VuYWJsZV9jYih1aW50OF90KiBwLCB1aW50MTZfdCBsZW4pIHsKLSAgaWYgKGxlbiA8IDIpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBsZW5ndGgiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzdGF0dXMsIHN1YmNvZGU7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoc3ViY29kZSwgcCk7Ci0KLSAgdWludDhfdCBleHBlY3RlZF9vcGNvZGUgPSBCVE1fQkxFX0JBVENIX1NDQU5fRU5CX0RJU0FCX0NVU1RfRkVBVFVSRTsKLSAgaWYgKHN1YmNvZGUgIT0gZXhwZWN0ZWRfb3Bjb2RlKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlczogYmFkIHN1YmNvZGUsIGV4cGVjdGVkOiAlZCBnb3Q6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX29wY29kZSwgc3ViY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlICE9IEJUTV9CTEVfU0NBTl9FTkFCTEVfQ0FMTEVEKQotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IHN0YXRlIHNob3VsZCBiZSBFTkFCTEVfQ0FMTEVEIiwgX19mdW5jX18pOwotCi0gIGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlID0gQlRNX0JMRV9TQ0FOX0VOQUJMRURfU1RBVEU7Ci19Ci0KLXZvaWQgc3RvcmFnZV9jb25maWdfY2IoQ2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLyk+IGNiLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgaWYgKGxlbiA8IDIpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBsZW5ndGgiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzdGF0dXMsIHN1YmNvZGU7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoc3ViY29kZSwgcCk7Ci0KLSAgdWludDhfdCBleHBlY3RlZF9vcGNvZGUgPSBCVE1fQkxFX0JBVENIX1NDQU5fU0VUX1NUT1JBR0VfUEFSQU07Ci0gIGlmIChzdWJjb2RlICE9IGV4cGVjdGVkX29wY29kZSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IGJhZCBzdWJjb2RlLCBleHBlY3RlZDogJWQgZ290OiAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vcGNvZGUsIHN1YmNvZGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNiLlJ1bihzdGF0dXMpOwotfQotCi12b2lkIHBhcmFtX2VuYWJsZV9jYihDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogc3RhdHVzICovKT4gY2IsIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgaWYgKGxlbiA8IDIpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBsZW5ndGgiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzdGF0dXMsIHN1YmNvZGU7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoc3ViY29kZSwgcCk7Ci0KLSAgdWludDhfdCBleHBlY3RlZF9vcGNvZGUgPSBCVE1fQkxFX0JBVENIX1NDQU5fU0VUX1BBUkFNUzsKLSAgaWYgKHN1YmNvZGUgIT0gZXhwZWN0ZWRfb3Bjb2RlKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlczogYmFkIHN1YmNvZGU6IDB4JTAyeCAweCUwMngiLCBfX2Z1bmNfXywgZXhwZWN0ZWRfb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICBzdWJjb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjYi5SdW4oc3RhdHVzKTsKLX0KLQotdm9pZCBkaXNhYmxlX2NiKGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYiwgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgaWYgKGxlbiA8IDIpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBsZW5ndGgiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzdGF0dXMsIHN1YmNvZGU7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoc3ViY29kZSwgcCk7Ci0KLSAgdWludDhfdCBleHBlY3RlZF9vcGNvZGUgPSBCVE1fQkxFX0JBVENIX1NDQU5fU0VUX1BBUkFNUzsKLSAgaWYgKHN1YmNvZGUgIT0gZXhwZWN0ZWRfb3Bjb2RlKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlczogYmFkIHN1YmNvZGU6IDB4JTAyeCAweCUwMngiLCBfX2Z1bmNfXywgZXhwZWN0ZWRfb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICBzdWJjb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYmxlX2JhdGNoc2Nhbl9jYi5jdXJfc3RhdGUgIT0gQlRNX0JMRV9TQ0FOX0RJU0FCTEVfQ0FMTEVEKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlczogc3RhdGUgc2hvdWxkIGJlIERJU0FCTEVfQ0FMTEVEIiwgX19mdW5jX18pOwotICB9Ci0KLSAgaWYgKEJUTV9TVUNDRVNTID09IHN0YXR1cykgewotICAgIGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlID0gQlRNX0JMRV9TQ0FOX0RJU0FCTEVEX1NUQVRFOwotICB9IGVsc2UgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgc3RhdGUgYWZ0ZXIgZGlzYWJsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgYmxlX2JhdGNoc2Nhbl9jYi5jdXJfc3RhdGUgPSBCVE1fQkxFX1NDQU5fSU5WQUxJRF9TVEFURTsKLSAgfQotCi0gIGNiLlJ1bihzdGF0dXMpOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHJlcG9ydHMgZnJvbSBjb250cm9sbGVyLiB8c2Nhbl9tb2RlfCBpcyB0aGUgbW9kZSBmb3IKLSAqIHdoaWNoIHRoZSByZXBvcnRzIGFyZSB0byBiZSByZWFkCi0gKi8KLXZvaWQgYnRtX2JsZV9yZWFkX2JhdGNoc2Nhbl9yZXBvcnRzKHRCVE1fQkxFX0JBVENIX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfY21kX2NiIGNiKSB7Ci0gIHVpbnQ4X3QgbGVuID0gQlRNX0JMRV9CQVRDSF9TQ0FOX1JFQURfUkVTVUxUU19MRU47Ci0gIHVpbnQ4X3QgcGFyYW1bbGVuXTsKLSAgbWVtc2V0KHBhcmFtLCAwLCBsZW4pOwotCi0gIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgQlRNX0JMRV9CQVRDSF9TQ0FOX1JFQURfUkVTVUxUUyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2Nhbl9tb2RlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9CQVRDSF9TQ0FOLCBwYXJhbSwgbGVuLCBjYik7Ci19Ci0KLS8qIHJlYWQgcmVwb3J0cy4gZGF0YSBpcyBhY2N1bXVsYXRlZCBpbiB8ZGF0YV9hbGx8LCBudW1iZXIgb2YgcmVjb3JkcyBpcwotICogYWNjdW11bGF0ZWQgaW4gfG51bV9yZWNvcmRzX2FsbHwgKi8KLXZvaWQgcmVhZF9yZXBvcnRzX2NiKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfYWxsLCB1aW50OF90IG51bV9yZWNvcmRzX2FsbCwKLSAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NDQU5fUkVQX0NCQUNLIGNiLCB1aW50OF90KiBwLCB1aW50MTZfdCBsZW4pIHsKLSAgaWYgKGxlbiA8IDIpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiB3cm9uZyBsZW5ndGgiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzdGF0dXMsIHN1YmNvZGU7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoc3ViY29kZSwgcCk7Ci0KLSAgdWludDhfdCBleHBlY3RlZF9vcGNvZGUgPSBCVE1fQkxFX0JBVENIX1NDQU5fUkVBRF9SRVNVTFRTOwotICBpZiAoc3ViY29kZSAhPSBleHBlY3RlZF9vcGNvZGUpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBiYWQgc3ViY29kZSwgZXhwZWN0ZWQ6ICVkIGdvdDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3Bjb2RlLCBzdWJjb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobGVuIDwgNCkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IHdyb25nIGxlbmd0aCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IHJlcG9ydF9mb3JtYXQsIG51bV9yZWNvcmRzOwotICBTVFJFQU1fVE9fVUlOVDgocmVwb3J0X2Zvcm1hdCwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChudW1fcmVjb3JkcywgcCk7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlczogc3RhdHVzPSVkLGxlbj0lZCxyZWM9JWQiLCBfX2Z1bmNfXywgc3RhdHVzLCBsZW4gLSA0LAotICAgICAgICAgICAgICAgICAgbnVtX3JlY29yZHMpOwotCi0gIGlmIChudW1fcmVjb3JkcyA9PSAwKSB7Ci0gICAgY2IuUnVuKEJUTV9TVUNDRVNTLCByZXBvcnRfZm9ybWF0LCBudW1fcmVjb3Jkc19hbGwsIGRhdGFfYWxsKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobGVuID4gNCkgewotICAgIGRhdGFfYWxsLmluc2VydChkYXRhX2FsbC5lbmQoKSwgcCwgcCArIGxlbiAtIDQpOwotICAgIG51bV9yZWNvcmRzX2FsbCArPSBudW1fcmVjb3JkczsKLQotICAgIC8qIE1vcmUgcmVjb3JkcyBjb3VsZCBiZSBpbiB0aGUgYnVmZmVyIGFuZCBuZWVkcyB0byBiZSBwdWxsZWQgb3V0ICovCi0gICAgYnRtX2JsZV9yZWFkX2JhdGNoc2Nhbl9yZXBvcnRzKAotICAgICAgICByZXBvcnRfZm9ybWF0LCBiYXNlOjpCaW5kKCZyZWFkX3JlcG9ydHNfY2IsIHN0ZDo6bW92ZShkYXRhX2FsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3JlY29yZHNfYWxsLCBzdGQ6Om1vdmUoY2IpKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgc3RvcmFnZSBjb25maWd1cmF0aW9uIGluIGNvbnRyb2xsZXIKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGJhdGNoX3NjYW5fZnVsbF9tYXggLSBNYXggc3RvcmFnZSBzcGFjZSAoaW4gJSkgYWxsb2NhdGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIHNjYW5uaW5nCi0gKiAgICAgICAgICAgICAgICAgIGJhdGNoX3NjYW5fdHJ1bmNfbWF4IC0gTWF4IHN0b3JhZ2Ugc3BhY2UgKGluICUpIGFsbG9jYXRlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlZCBzY2FubmluZwotICogICAgICAgICAgICAgICAgICBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQgLSBTZXQgdXAgbm90aWZpY2F0aW9uIGxldmVsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRvdGFsIHNwYWNlCi0gKgotICoqLwotdm9pZCBidG1fYmxlX3NldF9zdG9yYWdlX2NvbmZpZyh1aW50OF90IGJhdGNoX3NjYW5fZnVsbF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfY21kX2NiIGNiKSB7Ci0gIHVpbnQ4X3QgbGVuID0gQlRNX0JMRV9CQVRDSF9TQ0FOX1NUT1JBR0VfQ0ZHX0xFTjsKLSAgdWludDhfdCBwYXJhbVtsZW5dOwotICBtZW1zZXQocGFyYW0sIDAsIGxlbik7Ci0KLSAgdWludDhfdCogcHAgPSBwYXJhbTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBCVE1fQkxFX0JBVENIX1NDQU5fU0VUX1NUT1JBR0VfUEFSQU0pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGJhdGNoX3NjYW5fZnVsbF9tYXgpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGJhdGNoX3NjYW5fdHJ1bmNfbWF4KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfQkxFX0JBVENIX1NDQU4sIHBhcmFtLCBsZW4sIGNiKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGJhdGNoIHNjYW4gcGFyYW1zIGluIGNvbnRyb2xsZXIgKi8KLXZvaWQgYnRtX2JsZV9zZXRfYmF0Y2hzY2FuX3BhcmFtKHRCVE1fQkxFX0JBVENIX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FuX2ludGVydmFsLCB1aW50MzJfdCBzY2FuX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0RJU0NBUkRfUlVMRSBkaXNjYXJkX3J1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfY21kX2NiIGNiKSB7Ci0gIC8vIE92ZXJyaWRlIHBhcmFtIGFuZCBkZWNpZGUgYWRkcl90eXBlIGJhc2VkIG9uIG93biBhZGRyIHR5cGUKLSAgLy8gVE9ETzogUmVtb3ZlIHVwcGVyIGxheWVyIHBhcmFtZXRlcj8KLSAgYWRkcl90eXBlID0gYnRtX2NiLmJsZV9jdHJfY2IuYWRkcl9tZ250X2NiLm93bl9hZGRyX3R5cGU7Ci0KLSAgdWludDhfdCBsZW4gPSBCVE1fQkxFX0JBVENIX1NDQU5fUEFSQU1fQ09ORklHX0xFTjsKLSAgdWludDhfdCBwYXJhbVtsZW5dOwotICBtZW1zZXQocGFyYW0sIDAsIGxlbik7Ci0KLSAgdWludDhfdCogcCA9IHBhcmFtOwotICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9CQVRDSF9TQ0FOX1NFVF9QQVJBTVMpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgc2Nhbl9tb2RlKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwLCBzY2FuX3dpbmRvdyk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocCwgc2Nhbl9pbnRlcnZhbCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBhZGRyX3R5cGUpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgZGlzY2FyZF9ydWxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9CQVRDSF9TQ0FOLCBwYXJhbSwgbGVuLCBjYik7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgY3VzdG9tZXIgc3BlY2lmaWMgZmVhdHVyZSBpbiBjb250cm9sbGVyICovCi12b2lkIGJ0bV9ibGVfZW5hYmxlX2JhdGNoc2NhbihoY2lfY21kX2NiIGNiKSB7Ci0gIHVpbnQ4X3QgbGVuID0gQlRNX0JMRV9CQVRDSF9TQ0FOX0VOQl9ESVNCX0xFTjsKLSAgdWludDhfdCBwYXJhbVtsZW5dOwotICBtZW1zZXQocGFyYW0sIDAsIGxlbik7Ci0KLSAgdWludDhfdCogcCA9IHBhcmFtOwotICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9CQVRDSF9TQ0FOX0VOQl9ESVNBQl9DVVNUX0ZFQVRVUkUpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwMSAvKiBlbmFibGUgKi8pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfQkxFX0JBVENIX1NDQU4sIHBhcmFtLCBsZW4sIGNiKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB3cml0ZSBzdG9yYWdlIGNvbmZpZyBwYXJhbXMuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiYXRjaF9zY2FuX2Z1bGxfbWF4IC0gTWF4IHN0b3JhZ2Ugc3BhY2UgKGluICUpIGFsbG9jYXRlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCBzdHlsZQotICogICAgICAgICAgICAgICAgICBiYXRjaF9zY2FuX3RydW5jX21heCAtIE1heCBzdG9yYWdlIHNwYWNlIChpbiAlKSBhbGxvY2F0ZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuYyBzdHlsZQotICogICAgICAgICAgICAgICAgICBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQgLSBTZXR1cCBub3RpZmljYXRpb24gbGV2ZWwgYmFzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdG90YWwgc3BhY2UKLSAqICAgICAgICAgICAgICAgICAgY2IgLSBTZXR1cCBjYWxsYmFjayBwb2ludGVyCi0gKiAgICAgICAgICAgICAgICAgIHBfdGhyZXNfY2JhY2sgLSBUaHJlc2hvbGQgY2FsbGJhY2sgcG9pbnRlcgotICogICAgICAgICAgICAgICAgICByZWZfdmFsdWUgLSBSZWZlcmVuY2UgdmFsdWUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlU2V0U3RvcmFnZUNvbmZpZyh1aW50OF90IGJhdGNoX3NjYW5fZnVsbF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogc3RhdHVzICovKT4gY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NDQU5fVEhSRVNIT0xEX0NCQUNLKiBwX3RocmVzX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlKSB7Ci0gIGlmICghY2FuX2RvX2JhdGNoX3NjYW4oKSkgewotICAgIGNiLlJ1bihCVE1fRVJSX1BST0NFU1NJTkcpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUTV9UUkFDRV9FVkVOVCgiJXM6ICVkLCAlZCwgJWQsICVkLCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgYmxlX2JhdGNoc2Nhbl9jYi5jdXJfc3RhdGUsIHJlZl92YWx1ZSwgYmF0Y2hfc2Nhbl9mdWxsX21heCwKLSAgICAgICAgICAgICAgICAgIGJhdGNoX3NjYW5fdHJ1bmNfbWF4LCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQpOwotCi0gIGJsZV9iYXRjaHNjYW5fY2IucF90aHJlc19jYmFjayA9IHBfdGhyZXNfY2JhY2s7Ci0gIGJsZV9iYXRjaHNjYW5fY2IucmVmX3ZhbHVlID0gcmVmX3ZhbHVlOwotCi0gIGlmIChiYXRjaF9zY2FuX2Z1bGxfbWF4ID4gQlRNX0JMRV9BRFZfU0NBTl9GVUxMX01BWCB8fAotICAgICAgYmF0Y2hfc2Nhbl90cnVuY19tYXggPiBCVE1fQkxFX0FEVl9TQ0FOX1RSVU5DX01BWCB8fAotICAgICAgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkID4gQlRNX0JMRV9BRFZfU0NBTl9USFJfTUFYKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJJbGxlZ2FsIHNldCBzdG9yYWdlIGNvbmZpZyBwYXJhbXMiKTsKLSAgICBjYi5SdW4oQlRNX0lMTEVHQUxfVkFMVUUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChCVE1fQkxFX1NDQU5fSU5WQUxJRF9TVEFURSA9PSBibGVfYmF0Y2hzY2FuX2NiLmN1cl9zdGF0ZSB8fAotICAgICAgQlRNX0JMRV9TQ0FOX0RJU0FCTEVEX1NUQVRFID09IGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlIHx8Ci0gICAgICBCVE1fQkxFX1NDQU5fRElTQUJMRV9DQUxMRUQgPT0gYmxlX2JhdGNoc2Nhbl9jYi5jdXJfc3RhdGUpIHsKLSAgICBidG1fYmxlX2VuYWJsZV9iYXRjaHNjYW4oQmluZCgmZmVhdF9lbmFibGVfY2IpKTsKLSAgICBibGVfYmF0Y2hzY2FuX2NiLmN1cl9zdGF0ZSA9IEJUTV9CTEVfU0NBTl9FTkFCTEVfQ0FMTEVEOwotICB9Ci0KLSAgYnRtX2JsZV9zZXRfc3RvcmFnZV9jb25maWcoYmF0Y2hfc2Nhbl9mdWxsX21heCwgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoX3NjYW5fbm90aWZ5X3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZCgmc3RvcmFnZV9jb25maWdfY2IsIGNiKSk7Ci0gIHJldHVybjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgYmF0Y2ggc2Nhbm5pbmcgKi8KLXZvaWQgQlRNX0JsZUVuYWJsZUJhdGNoU2Nhbih0QlRNX0JMRV9CQVRDSF9TQ0FOX01PREUgc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9ESVNDQVJEX1JVTEUgZGlzY2FyZF9ydWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYikgewotICBCVE1fVFJBQ0VfRVZFTlQoIiVzOiAlZCwgJWQsICVkLCAlZCwgJWQsICVkIiwgX19mdW5jX18sIHNjYW5fbW9kZSwKLSAgICAgICAgICAgICAgICAgIHNjYW5faW50ZXJ2YWwsIHNjYW5fd2luZG93LCBhZGRyX3R5cGUsIGRpc2NhcmRfcnVsZSk7Ci0KLSAgaWYgKCFjYW5fZG9fYmF0Y2hfc2NhbigpKSB7Ci0gICAgY2IuUnVuKEJUTV9FUlJfUFJPQ0VTU0lORyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlczogJWQsICV4LCAleCwgJWQsICVkIiwgX19mdW5jX18sIHNjYW5fbW9kZSwgc2Nhbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgIHNjYW5fd2luZG93LCBkaXNjYXJkX3J1bGUsIGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlKTsKLQotICAvKiBPbmx5IDE2IGJpdHMgd2lsbCBiZSB1c2VkIGZvciBzY2FuIGludGVydmFsIGFuZCBzY2FuIHdpbmRvdyBhcyBwZXIKLSAgICogYWdyZWVtZW50IHdpdGggR29vZ2xlICovCi0gIC8qIFNvIHRoZSBzdGFuZGFyZCBMRSByYW5nZSB3b3VsZCBzdWZmaWNlIGZvciBzY2FuIGludGVydmFsIGFuZCBzY2FuIHdpbmRvdyAqLwotICBpZiAoKEJUTV9CTEVfSVNWQUxJRF9QQVJBTShzY2FuX2ludGVydmFsLCBCVE1fQkxFX1NDQU5fSU5UX01JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9TQ0FOX0lOVF9NQVgpIHx8Ci0gICAgICAgQlRNX0JMRV9JU1ZBTElEX1BBUkFNKHNjYW5fd2luZG93LCBCVE1fQkxFX1NDQU5fV0lOX01JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9TQ0FOX1dJTl9NQVgpKSAmJgotICAgICAgKEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFX1BBU1MgPT0gc2Nhbl9tb2RlIHx8Ci0gICAgICAgQlRNX0JMRV9CQVRDSF9TQ0FOX01PREVfQUNUSSA9PSBzY2FuX21vZGUgfHwKLSAgICAgICBCVE1fQkxFX0JBVENIX1NDQU5fTU9ERV9QQVNTX0FDVEkgPT0gc2Nhbl9tb2RlKSAmJgotICAgICAgKEJUTV9CTEVfRElTQ0FSRF9PTERfSVRFTVMgPT0gZGlzY2FyZF9ydWxlIHx8Ci0gICAgICAgQlRNX0JMRV9ESVNDQVJEX0xPV0VSX1JTU0lfSVRFTVMgPT0gZGlzY2FyZF9ydWxlKSkgewotICB9IGVsc2UgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IElsbGVnYWwgZW5hYmxlIHNjYW4gcGFyYW1zIiwgX19mdW5jX18pOwotICAgIGNiLlJ1bihCVE1fSUxMRUdBTF9WQUxVRSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKEJUTV9CTEVfU0NBTl9JTlZBTElEX1NUQVRFID09IGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlIHx8Ci0gICAgICBCVE1fQkxFX1NDQU5fRElTQUJMRURfU1RBVEUgPT0gYmxlX2JhdGNoc2Nhbl9jYi5jdXJfc3RhdGUgfHwKLSAgICAgIEJUTV9CTEVfU0NBTl9ESVNBQkxFX0NBTExFRCA9PSBibGVfYmF0Y2hzY2FuX2NiLmN1cl9zdGF0ZSkgewotICAgIGJ0bV9ibGVfZW5hYmxlX2JhdGNoc2NhbihCaW5kKCZmZWF0X2VuYWJsZV9jYikpOwotICAgIGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlID0gQlRNX0JMRV9TQ0FOX0VOQUJMRV9DQUxMRUQ7Ci0gIH0KLQotICBibGVfYmF0Y2hzY2FuX2NiLnNjYW5fbW9kZSA9IHNjYW5fbW9kZTsKLSAgYmxlX2JhdGNoc2Nhbl9jYi5zY2FuX2ludGVydmFsID0gc2Nhbl9pbnRlcnZhbDsKLSAgYmxlX2JhdGNoc2Nhbl9jYi5zY2FuX3dpbmRvdyA9IHNjYW5fd2luZG93OwotICBibGVfYmF0Y2hzY2FuX2NiLmFkZHJfdHlwZSA9IGFkZHJfdHlwZTsKLSAgYmxlX2JhdGNoc2Nhbl9jYi5kaXNjYXJkX3J1bGUgPSBkaXNjYXJkX3J1bGU7Ci0gIC8qIFRoaXMgY29tbWFuZCBzdGFydHMgYmF0Y2ggc2Nhbm5pbmcsIGlmIGVuYWJsZWQgKi8KLSAgYnRtX2JsZV9zZXRfYmF0Y2hzY2FuX3BhcmFtKHNjYW5fbW9kZSwgc2Nhbl9pbnRlcnZhbCwgc2Nhbl93aW5kb3csIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRfcnVsZSwgQmluZCgmcGFyYW1fZW5hYmxlX2NiLCBjYikpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkaXNhYmxlIGJhdGNoIHNjYW5uaW5nICovCi12b2lkIEJUTV9CbGVEaXNhYmxlQmF0Y2hTY2FuKGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYikgewotICBCVE1fVFJBQ0VfRVZFTlQoIiBCVE1fQmxlRGlzYWJsZUJhdGNoU2NhbiIpOwotCi0gIGlmICghY2FuX2RvX2JhdGNoX3NjYW4oKSkgewotICAgIGNiLlJ1bihCVE1fRVJSX1BST0NFU1NJTkcpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0bV9ibGVfc2V0X2JhdGNoc2Nhbl9wYXJhbSgKLSAgICAgIEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFX0RJU0FCTEUsIGJsZV9iYXRjaHNjYW5fY2Iuc2Nhbl9pbnRlcnZhbCwKLSAgICAgIGJsZV9iYXRjaHNjYW5fY2Iuc2Nhbl93aW5kb3csIGJsZV9iYXRjaHNjYW5fY2IuYWRkcl90eXBlLAotICAgICAgYmxlX2JhdGNoc2Nhbl9jYi5kaXNjYXJkX3J1bGUsIEJpbmQoJmRpc2FibGVfY2IsIGNiKSk7Ci0gIGJsZV9iYXRjaHNjYW5fY2IuY3VyX3N0YXRlID0gQlRNX0JMRV9TQ0FOX0RJU0FCTEVfQ0FMTEVEOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdGFydCByZWFkaW5nIGJhdGNoIHNjYW4gcmVwb3J0cyAqLwotdm9pZCBCVE1fQmxlUmVhZFNjYW5SZXBvcnRzKHRCVE1fQkxFX0JBVENIX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0NBTl9SRVBfQ0JBQ0sgY2IpIHsKLSAgdWludDhfdCByZWFkX3NjYW5fbW9kZSA9IDA7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCIlczsgJWQiLCBfX2Z1bmNfXywgc2Nhbl9tb2RlKTsKLQotICBpZiAoIWNhbl9kb19iYXRjaF9zY2FuKCkpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaCBzY2FuIik7Ci0gICAgY2IuUnVuKEJUTV9FUlJfUFJPQ0VTU0lORywgMCwgMCwge30pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qICBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHNjYW4gbW9kZSBoYXMgYWxyZWFkeSBiZWVuIHNldHVwIGJ5IHRoZSB1c2VyICovCi0gIHJlYWRfc2Nhbl9tb2RlID0gYmxlX2JhdGNoc2Nhbl9jYi5zY2FuX21vZGUgJiBCVE1fQkxFX0JBVENIX1NDQU5fTU9ERV9BQ1RJOwotICBpZiAoMCA9PSByZWFkX3NjYW5fbW9kZSkKLSAgICByZWFkX3NjYW5fbW9kZSA9IGJsZV9iYXRjaHNjYW5fY2Iuc2Nhbl9tb2RlICYgQlRNX0JMRV9CQVRDSF9TQ0FOX01PREVfUEFTUzsKLQotICAvKiBDaGVjayBvbmx5IGZvciBtb2RlcywgYXMgc2NhbiByZXBvcnRzIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGlzYWJsaW5nIGJhdGNoCi0gICAqIHNjYW4gKi8KLSAgaWYgKHNjYW5fbW9kZSAhPSBCVE1fQkxFX0JBVENIX1NDQU5fTU9ERV9QQVNTICYmCi0gICAgICBzY2FuX21vZGUgIT0gQlRNX0JMRV9CQVRDSF9TQ0FOX01PREVfQUNUSSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiSWxsZWdhbCByZWFkIHNjYW4gcGFyYW1zOiAlZCwgJWQsICVkIiwgcmVhZF9zY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgIHNjYW5fbW9kZSwgYmxlX2JhdGNoc2Nhbl9jYi5jdXJfc3RhdGUpOwotICAgIGNiLlJ1bihCVE1fSUxMRUdBTF9WQUxVRSwgMCwgMCwge30pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0bV9ibGVfcmVhZF9iYXRjaHNjYW5fcmVwb3J0cygKLSAgICAgIHNjYW5fbW9kZSwgYmFzZTo6QmluZCgmcmVhZF9yZXBvcnRzX2NiLCBzdGQ6OnZlY3Rvcjx1aW50OF90PigpLCAwLCBjYikpOwotICByZXR1cm47Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldHVwIHRoZSBjYWxsYmFjayBmb3IgdHJhY2tpbmcgKi8KLXZvaWQgQlRNX0JsZVRyYWNrQWR2ZXJ0aXNlcih0QlRNX0JMRV9UUkFDS19BRFZfQ0JBQ0sqIHBfdHJhY2tfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSkgewotICBCVE1fVFJBQ0VfRVZFTlQoIiVzOiIsIF9fZnVuY19fKTsKLQotICBpZiAoIWNhbl9kb19iYXRjaF9zY2FuKCkpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaCBzY2FuIik7Ci0KLSAgICB0QlRNX0JMRV9UUkFDS19BRFZfREFUQSB0cmFja19hZHZfZGF0YTsKLSAgICBtZW1zZXQoJnRyYWNrX2Fkdl9kYXRhLCAwLCBzaXplb2YodEJUTV9CTEVfVFJBQ0tfQURWX0RBVEEpKTsKLSAgICB0cmFja19hZHZfZGF0YS5hZHZlcnRpc2VyX2luZm9fcHJlc2VudCA9Ci0gICAgICAgIE5PX0FEVl9JTkZPX1BSRVNFTlQ7IC8qIEluZGljYXRlcyBmYWlsdXJlICovCi0gICAgdHJhY2tfYWR2X2RhdGEuY2xpZW50X2lmID0gKHVpbnQ4X3QpcmVmX3ZhbHVlOwotICAgIHBfdHJhY2tfY2JhY2soJnRyYWNrX2Fkdl9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBibGVfYWR2dHJhY2tfY2IucF90cmFja19jYmFjayA9IHBfdHJhY2tfY2JhY2s7Ci0gIGJsZV9hZHZ0cmFja19jYi5yZWZfdmFsdWUgPSByZWZfdmFsdWU7Ci0gIHJldHVybjsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIGJhdGNoIHNjYW4gY29udHJvbCBibG9jay4KLSAqKi8KLXZvaWQgYnRtX2JsZV9iYXRjaHNjYW5faW5pdCh2b2lkKSB7Ci0gIEJUTV9UUkFDRV9FVkVOVCgiIGJ0bV9ibGVfYmF0Y2hzY2FuX2luaXQiKTsKLSAgbWVtc2V0KCZibGVfYmF0Y2hzY2FuX2NiLCAwLCBzaXplb2YodEJUTV9CTEVfQkFUQ0hfU0NBTl9DQikpOwotICBtZW1zZXQoJmJsZV9hZHZ0cmFja19jYiwgMCwgc2l6ZW9mKHRCVE1fQkxFX0FEVl9UUkFDS19DQikpOwotICBCVE1fUmVnaXN0ZXJGb3JWU0V2ZW50cyhidG1fYmxlX2JhdGNoc2Nhbl9maWx0ZXJfdHJhY2tfYWR2X3ZzZV9jYmFjaywgdHJ1ZSk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX2JsZV9iZ2Nvbm4uY2MgYi9zdGFjay9idG0vYnRtX2JsZV9iZ2Nvbm4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzBjMjAuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9ibGVfYmdjb25uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgQkxFIGFjY2VwdGxpc3Qgb3BlcmF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fZGV2LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLWV4dGVybiB2b2lkIGJ0bV9zZW5kX2hjaV9jcmVhdGVfY29ubmVjdGlvbigKLSAgICB1aW50MTZfdCBzY2FuX2ludCwgdWludDE2X3Qgc2Nhbl93aW4sIHVpbnQ4X3QgaW5pdF9maWx0ZXJfcG9saWN5LAotICAgIHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLCB1aW50OF90IGFkZHJfdHlwZV9vd24sCi0gICAgdWludDE2X3QgY29ubl9pbnRfbWluLCB1aW50MTZfdCBjb25uX2ludF9tYXgsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICB1aW50MTZfdCBjb25uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4sCi0gICAgdWludDhfdCBwaHkpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9jcmVhdGVfY29ubl9jYW5jZWwoKTsKLQotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIGNoYXIga0FjY2VwdGxpc3RBZGRbXSA9ICJBY2NlcHRsaXN0QWRkIjsKLWNvbnN0ZXhwciBjaGFyIGtBY2NlcHRsaXN0UmVtb3ZlW10gPSAiQWNjZXB0bGlzdFJlbW92ZSI7Ci1jb25zdGV4cHIgY2hhciBrQWNjZXB0bGlzdENsZWFyW10gPSAiQWNjZXB0bGlzdENsZWFyIjsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIFVuZm9ydHVuYXRlbHkgKGZvciBub3c/KSB3ZSBoYXZlIHRvIG1haW50YWluIGEgY29weSBvZiB0aGUgZGV2aWNlIGFjY2VwdGxpc3QKLS8vIG9uIHRoZSBob3N0IHRvIGRldGVybWluZSBpZiBhIGRldmljZSBpcyBwZW5kaW5nIHRvIGJlIGNvbm5lY3RlZCBvciBub3QuIFRoaXMKLS8vIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGhvc3Qgc2hvdWxkIGtlZXAgdHJ5aW5nIHRvIHNjYW4gZm9yIGFjY2VwdGxpc3RlZAotLy8gcGVyaXBoZXJhbHMgb3Igbm90LgotLy8gVE9ETzogTW92ZSBhbGwgb2YgdGhpcyB0byBjb250cm9sbGVyL2xlL2JhY2tncm91bmRfbGlzdCBvciBzaW1pbGFyPwotc3RydWN0IEJhY2tncm91bmRDb25uZWN0aW9uIHsKLSAgUmF3QWRkcmVzcyBhZGRyZXNzOwotICB1aW50OF90IGFkZHJfdHlwZTsKLSAgYm9vbCBpbl9jb250cm9sbGVyX3dsOwotICB1aW50OF90IGFkZHJfdHlwZV9pbl93bDsKLSAgYm9vbCBwZW5kaW5nX3JlbW92YWw7Ci19OwotCi1zdHJ1Y3QgQmdDb25uSGFzaCB7Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgeCkgY29uc3QgewotICAgIGNvbnN0IHVpbnQ4X3QqIGEgPSB4LmFkZHJlc3M7Ci0gICAgcmV0dXJuIGFbMF0gXiAoYVsxXSA8PCA4KSBeIChhWzJdIDw8IDE2KSBeIChhWzNdIDw8IDI0KSBeIGFbNF0gXgotICAgICAgICAgICAoYVs1XSA8PCA4KTsKLSAgfQotfTsKLQotc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBCYWNrZ3JvdW5kQ29ubmVjdGlvbiwgQmdDb25uSGFzaD4KLSAgICBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRsaXN0X2NvbW1hbmRfY29tcGxldGUodEhDSV9TVEFUVVMgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIEhDSV9TVUNDRVNTOgotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigKLSAgICAgICAgICAiUmVjZWl2ZWQgdW5leHBlY3RlZCBhY2NlcHQgbGlzdCBjb21wbGV0aW9uIGNvbW1hbmQ6JXMgc3RhdHVzOiVzIiwKLSAgICAgICAgICBtc2csIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRsaXN0X2FkZF9jb21tYW5kX2NvbXBsZXRlKHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgZXZ0X2xlbikgewotICBpZiAoZXZ0X2xlbiA8IHNpemVvZih1aW50OF90KSkgewotICAgIExPR19FUlJPUigiUmVjZWl2ZWQgYm9ndXMgYWNjZXB0bGlzdCBhZGQgY29tcGxldGUgbGVuZ3RoOiVodSIsIGV2dF9sZW4pOwotICAgIHJldHVybjsKLSAgfQotICB1aW50OF90IHN0YXR1czsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9kYXRhKTsKLSAgYWNjZXB0bGlzdF9jb21tYW5kX2NvbXBsZXRlKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLCBrQWNjZXB0bGlzdEFkZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdGxpc3RfcmVtb3ZlX2NvbW1hbmRfY29tcGxldGUodWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIGlmIChldnRfbGVuIDwgc2l6ZW9mKHVpbnQ4X3QpKSB7Ci0gICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBib2d1cyBhY2NlcHRsaXN0IHJlbW92ZSBjb21wbGV0ZSBsZW5ndGg6JWh1IiwgZXZ0X2xlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwX2RhdGEpOwotICBhY2NlcHRsaXN0X2NvbW1hbmRfY29tcGxldGUoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQWNjZXB0bGlzdFJlbW92ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdGxpc3RfY2xlYXJfY29tbWFuZF9jb21wbGV0ZSh1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZ0X2xlbikgewotICBpZiAoZXZ0X2xlbiA8IHNpemVvZih1aW50OF90KSkgewotICAgIExPR19FUlJPUigiUmVjZWl2ZWQgYm9ndXMgYWNjZXB0bGlzdCByZW1vdmUgY29tcGxldGUgbGVuZ3RoOiVodSIsIGV2dF9sZW4pOwotICAgIHJldHVybjsKLSAgfQotICB1aW50OF90IHN0YXR1czsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9kYXRhKTsKLSAgYWNjZXB0bGlzdF9jb21tYW5kX2NvbXBsZXRlKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0FjY2VwdGxpc3RDbGVhcik7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHN0b3AgYXV0byBjb25uZWN0aW9uIHByb2NlZHVyZSAqLwotc3RhdGljIGJvb2wgYnRtX2JsZV9zdG9wX2F1dG9fY29ubigpIHsKLSAgQlRNX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoIWJ0bV9jYi5ibGVfY3RyX2NiLmlzX2Nvbm5lY3Rpb25fc3RhdGVfY29ubmVjdGluZygpKSB7Ci0gICAgTE9HX0RFQlVHKAotICAgICAgICAiTm8gbmVlZCB0byBzdG9wIGF1dG8gY29ubmVjdGlvbiBwcm9jZWR1cmUgdGhhdCBpcyBub3QgY29ubmVjdGluZyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsKCk7Ci0KLSAgYnRtX2NiLmJsZV9jdHJfY2IucmVzZXRfYWNjZXB0bGlzdF9wcm9jZXNzX2luX3Byb2dyZXNzKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fYWRkKHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBhdXRvIG1hcF9pdGVyID0gYmFja2dyb3VuZF9jb25uZWN0aW9ucy5maW5kKGFkZHJlc3MpOwotICBpZiAobWFwX2l0ZXIgPT0gYmFja2dyb3VuZF9jb25uZWN0aW9ucy5lbmQoKSkgewotICAgIGJhY2tncm91bmRfY29ubmVjdGlvbnNbYWRkcmVzc10gPQotICAgICAgICBCYWNrZ3JvdW5kQ29ubmVjdGlvbnthZGRyZXNzLCBhZGRyX3R5cGUsIGZhbHNlLCAwLCBmYWxzZX07Ci0gIH0gZWxzZSB7Ci0gICAgQmFja2dyb3VuZENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSAmbWFwX2l0ZXItPnNlY29uZDsKLSAgICBpZiAoYWRkcl90eXBlICE9IGNvbm5lY3Rpb24tPmFkZHJfdHlwZSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQWRkciB0eXBlIG1pc21hdGNoICIgPDwgYWRkcmVzczsKLSAgICAgIGJ0c25kX2hjaWNfYmxlX3JlbW92ZV9mcm9tX2FjY2VwdGxpc3QoCi0gICAgICAgICAgY29ubmVjdGlvbi0+YWRkcl90eXBlX2luX3dsLCBjb25uZWN0aW9uLT5hZGRyZXNzLAotICAgICAgICAgIGJhc2U6OkJpbmQoJmFjY2VwdGxpc3RfcmVtb3ZlX2NvbW1hbmRfY29tcGxldGUpKTsKLSAgICAgIGNvbm5lY3Rpb24tPmFkZHJfdHlwZSA9IGFkZHJfdHlwZTsKLSAgICAgIGNvbm5lY3Rpb24tPmluX2NvbnRyb2xsZXJfd2wgPSBmYWxzZTsKLSAgICB9Ci0gICAgY29ubmVjdGlvbi0+cGVuZGluZ19yZW1vdmFsID0gZmFsc2U7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYmFja2dyb3VuZF9jb25uZWN0aW9uX3JlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGF1dG8gbWFwX2l0ZXIgPSBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zLmZpbmQoYWRkcmVzcyk7Ci0gIGlmIChtYXBfaXRlciAhPSBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zLmVuZCgpKSB7Ci0gICAgaWYgKG1hcF9pdGVyLT5zZWNvbmQuaW5fY29udHJvbGxlcl93bCkgewotICAgICAgbWFwX2l0ZXItPnNlY29uZC5wZW5kaW5nX3JlbW92YWwgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zLmVyYXNlKG1hcF9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYmFja2dyb3VuZF9jb25uZWN0aW9uc19jbGVhcigpIHsgYmFja2dyb3VuZF9jb25uZWN0aW9ucy5jbGVhcigpOyB9Ci0KLXN0YXRpYyBib29sIGJhY2tncm91bmRfY29ubmVjdGlvbnNfcGVuZGluZygpIHsKLSAgZm9yIChhdXRvJiBtYXBfZWwgOiBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zKSB7Ci0gICAgQmFja2dyb3VuZENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSAmbWFwX2VsLnNlY29uZDsKLSAgICBpZiAoY29ubmVjdGlvbi0+cGVuZGluZ19yZW1vdmFsKSBjb250aW51ZTsKLSAgICBjb25zdCBib29sIGNvbm5lY3RlZCA9Ci0gICAgICAgIEJUTV9Jc0FjbENvbm5lY3Rpb25VcChjb25uZWN0aW9uLT5hZGRyZXNzLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgIGlmICghY29ubmVjdGVkKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IGJhY2tncm91bmRfY29ubmVjdGlvbnNfY291bnQoKSB7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGZvciAoYXV0byYgbWFwX2VsIDogYmFja2dyb3VuZF9jb25uZWN0aW9ucykgewotICAgIGlmICghbWFwX2VsLnNlY29uZC5wZW5kaW5nX3JlbW92YWwpICsrY291bnQ7Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi1jb25zdCB0QkxFX0JEX0FERFIgY29udmVydF90b19hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgaWYgKHBfZGV2X3JlYyA9PSBudWxscHRyIHx8ICFwX2Rldl9yZWMtPmlzX2RldmljZV90eXBlX2hhc19ibGUoKSkgewotICAgIHJldHVybiB7Ci0gICAgICAgIC50eXBlID0gQkxFX0FERFJfUFVCTElDLAotICAgICAgICAuYmRhID0gYmRfYWRkciwKLSAgICB9OwotICB9Ci0KLSAgaWYgKHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYS5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gewotICAgICAgICAudHlwZSA9IHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGUsCi0gICAgICAgIC5iZGEgPSBiZF9hZGRyLAotICAgIH07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYWRkX2Rldl90b19jb250cm9sbGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvYWQgdGhlIGRldmljZSBpbnRvIGNvbnRyb2xsZXIgYWNjZXB0bGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0bV9hZGRfZGV2X3RvX2NvbnRyb2xsZXIoYm9vbCB0b19hZGQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotCi0gIGlmIChwX2Rldl9yZWMgIT0gTlVMTCAmJiBwX2Rldl9yZWMtPmRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSB7Ci0gICAgaWYgKHRvX2FkZCkgewotICAgICAgaWYgKCFwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAgICJBZGRpbmcga25vd24gZGV2aWNlIHJlY29yZCBpbnRvIGFjY2VwdGxpc3Qgd2l0aCBpZGVudGl0eSAiCi0gICAgICAgICAgICAiZGV2aWNlOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZSkpOwotICAgICAgICBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fYWRkKAotICAgICAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZSwKLSAgICAgICAgICAgIHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgICAiQWRkaW5nIGtub3duIGRldmljZSByZWNvcmQgaW50byBhY2NlcHRsaXN0IHdpdGhvdXQgaWRlbnRpdHkgIgotICAgICAgICAgICAgImRldmljZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkcikpOwotICAgICAgICBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fYWRkKHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGUsIGJkX2FkZHIpOwotCi0gICAgICAgIGlmIChwX2Rldl9yZWMtPmJsZS5ibGVfYWRkcl90eXBlID09IEJMRV9BRERSX1JBTkRPTSAmJgotICAgICAgICAgICAgQlRNX0JMRV9JU19SRVNPTFZFX0JEQShiZF9hZGRyKSkgewotICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGFkZGluZyBSUEEgaW50byBhY2NlcHRsaXN0IjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwX2Rldl9yZWMtPmJsZS5pbl9jb250cm9sbGVyX2xpc3QgfD0gQlRNX0FDQ0VQVExJU1RfQklUOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIXBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgIlJlbW92aW5nIGtub3duIGRldmljZSByZWNvcmQgaW50byBhY2NlcHRsaXN0IHdpdGggaWRlbnRpdHkgIgotICAgICAgICAgICAgImRldmljZTolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUpKTsKLSAgICAgICAgYmFja2dyb3VuZF9jb25uZWN0aW9uX3JlbW92ZSgKLSAgICAgICAgICAgIHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgICAiUmVtb3Zpbmcga25vd24gZGV2aWNlIHJlY29yZCBpbnRvIGFjY2VwdGxpc3Qgd2l0aG91dCBpZGVudGl0eSAiCi0gICAgICAgICAgICAiZGV2aWNlOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSk7Ci0gICAgICAgIGJhY2tncm91bmRfY29ubmVjdGlvbl9yZW1vdmUoYmRfYWRkcik7Ci0KLSAgICAgICAgaWYgKHBfZGV2X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGUgPT0gQkxFX0FERFJfUkFORE9NICYmCi0gICAgICAgICAgICBCVE1fQkxFX0lTX1JFU09MVkVfQkRBKGJkX2FkZHIpKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcmVtb3ZpbmcgUlBBIGZyb20gYWNjZXB0bGlzdCI7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcF9kZXZfcmVjLT5ibGUuaW5fY29udHJvbGxlcl9saXN0ICY9IH5CVE1fQUNDRVBUTElTVF9CSVQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIG5vdCBhIGtub3duIGRldmljZSwgaS5lLiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZGV2aWNlIG5ldmVyIHNlZW4gYmVmb3JlCi0gICAgICovCi0gICAgaWYgKHRvX2FkZCkgewotICAgICAgYmFja2dyb3VuZF9jb25uZWN0aW9uX2FkZChCTEVfQUREUl9QVUJMSUMsIGJkX2FkZHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fcmVtb3ZlKGJkX2FkZHIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2V4ZWN1dGVfd2xfZGV2X29wZXJhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZXhlY3V0ZSB0aGUgcGVuZGluZyBhY2NlcHRsaXN0IGRldmljZSBvcGVyYXRpb24gKGxvYWRpbmcgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRtX2V4ZWN1dGVfd2xfZGV2X29wZXJhdGlvbih2b2lkKSB7Ci0gIC8vIGhhbmRsZSByZW1vdmFscyBmaXJzdCB0byBhdm9pZCBmaWxsaW5nIHVwIGNvbnRyb2xsZXIncyBhY2NlcHRsaXN0Ci0gIGZvciAoYXV0byBtYXBfaXQgPSBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zLmJlZ2luKCk7Ci0gICAgICAgbWFwX2l0ICE9IGJhY2tncm91bmRfY29ubmVjdGlvbnMuZW5kKCk7KSB7Ci0gICAgQmFja2dyb3VuZENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSAmbWFwX2l0LT5zZWNvbmQ7Ci0gICAgaWYgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVtb3ZhbCkgewotICAgICAgYnRzbmRfaGNpY19ibGVfcmVtb3ZlX2Zyb21fYWNjZXB0bGlzdCgKLSAgICAgICAgICBjb25uZWN0aW9uLT5hZGRyX3R5cGVfaW5fd2wsIGNvbm5lY3Rpb24tPmFkZHJlc3MsCi0gICAgICAgICAgYmFzZTo6QmluZE9uY2UoJmFjY2VwdGxpc3RfcmVtb3ZlX2NvbW1hbmRfY29tcGxldGUpKTsKLSAgICAgIG1hcF9pdCA9IGJhY2tncm91bmRfY29ubmVjdGlvbnMuZXJhc2UobWFwX2l0KTsKLSAgICB9IGVsc2UKLSAgICAgICsrbWFwX2l0OwotICB9Ci0gIGZvciAoYXV0byYgbWFwX2VsIDogYmFja2dyb3VuZF9jb25uZWN0aW9ucykgewotICAgIEJhY2tncm91bmRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gJm1hcF9lbC5zZWNvbmQ7Ci0gICAgY29uc3QgYm9vbCBjb25uZWN0ZWQgPQotICAgICAgICBCVE1fSXNBY2xDb25uZWN0aW9uVXAoY29ubmVjdGlvbi0+YWRkcmVzcywgQlRfVFJBTlNQT1JUX0xFKTsKLSAgICBpZiAoIWNvbm5lY3Rpb24tPmluX2NvbnRyb2xsZXJfd2wgJiYgIWNvbm5lY3RlZCkgewotICAgICAgYnRzbmRfaGNpY19ibGVfYWRkX2FjY2VwdGxpc3QoCi0gICAgICAgICAgY29ubmVjdGlvbi0+YWRkcl90eXBlLCBjb25uZWN0aW9uLT5hZGRyZXNzLAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZhY2NlcHRsaXN0X2FkZF9jb21tYW5kX2NvbXBsZXRlKSk7Ci0gICAgICBjb25uZWN0aW9uLT5pbl9jb250cm9sbGVyX3dsID0gdHJ1ZTsKLSAgICAgIGNvbm5lY3Rpb24tPmFkZHJfdHlwZV9pbl93bCA9IGNvbm5lY3Rpb24tPmFkZHJfdHlwZTsKLSAgICB9IGVsc2UgaWYgKGNvbm5lY3Rpb24tPmluX2NvbnRyb2xsZXJfd2wgJiYgY29ubmVjdGVkKSB7Ci0gICAgICAvKiBCbHVldG9vdGggQ29yZSA0LjIgYXMgd2VsbCBhcyBFU1IwOCBkaXNhbGxvd3MgbW9yZSB0aGFuIG9uZQotICAgICAgICAgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBMRSBhZGRyZXNzZXMuIE5vdCBhbGwgY29udHJvbGxlcnMgaGFuZGxlIHRoaXMKLSAgICAgICAgIGNvcnJlY3RseSwgdGhlcmVmb3JlIHdlIG11c3QgbWFrZSBzdXJlIGNvbm5lY3RlZCBkZXZpY2VzIGFyZSBub3QgaW4KLSAgICAgICAgIHRoZSBhY2NlcHRsaXN0IHdoZW4gYmcgY29ubmVjdGlvbiBhdHRlbXB0IGlzIGFjdGl2ZS4gKi8KLSAgICAgIGJ0c25kX2hjaWNfYmxlX3JlbW92ZV9mcm9tX2FjY2VwdGxpc3QoCi0gICAgICAgICAgY29ubmVjdGlvbi0+YWRkcl90eXBlX2luX3dsLCBjb25uZWN0aW9uLT5hZGRyZXNzLAotICAgICAgICAgIGJhc2U6OkJpbmRPbmNlKCZhY2NlcHRsaXN0X3JlbW92ZV9jb21tYW5kX2NvbXBsZXRlKSk7Ci0gICAgICBjb25uZWN0aW9uLT5pbl9jb250cm9sbGVyX3dsID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpcyB0byBzdGFydCBhdXRvIGNvbm5lY3Rpb24gcHJvY2VkdXJlICovCi1zdGF0aWMgYm9vbCBidG1fYmxlX3N0YXJ0X2F1dG9fY29ubigpIHsKLSAgdEJUTV9CTEVfQ0IqIHBfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2I7Ci0gIEFTU0VSVChwX2NiICE9IG51bGxwdHIpOwotCi0gIGNvbnN0IHVpbnQxNl90IHNjYW5faW50ID0gKHBfY2ItPnNjYW5faW50ID09IEJUTV9CTEVfU0NBTl9QQVJBTV9VTkRFRikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCVE1fQkxFX1NDQU5fU0xPV19JTlRfMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBfY2ItPnNjYW5faW50OwotICBjb25zdCB1aW50MTZfdCBzY2FuX3dpbiA9IChwX2NiLT5zY2FuX3dpbiA9PSBCVE1fQkxFX1NDQU5fUEFSQU1fVU5ERUYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQlRNX0JMRV9TQ0FOX1NMT1dfV0lOXzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwX2NiLT5zY2FuX3dpbjsKLSAgdEJMRV9BRERSX1RZUEUgb3duX2FkZHJfdHlwZSA9IHBfY2ItPmFkZHJfbWdudF9jYi5vd25fYWRkcl90eXBlOwotICB0QkxFX0FERFJfVFlQRSBwZWVyX2FkZHJfdHlwZSA9IEJMRV9BRERSX1BVQkxJQzsKLQotICB1aW50OF90IHBoeSA9IFBIWV9MRV8xTTsKLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfMm1fcGh5KCkpIHBoeSB8PSBQSFlfTEVfMk07Ci0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX2NvZGVkX3BoeSgpKSBwaHkgfD0gUEhZX0xFX0NPREVEOwotCi0gIGlmICghYnRtX2JsZV90b3BvbG9neV9jaGVjayhCVE1fQkxFX1NUQVRFX0lOSVQpKSB7Ci0gICAgTE9HX0lORk8oCi0gICAgICAgICJVbmFibGUgdG8gaW5pdGlhdGUgYmFja2dyb3VuZCBjb25uZWN0aW9uIGR1ZSB0byB0b3BvbG9neSBsaW1pdGF0aW9uIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFidG1fY2IuYmxlX2N0cl9jYi5pc19jb25uZWN0aW9uX3N0YXRlX2lkbGUoKSB8fAotICAgICAgIWJhY2tncm91bmRfY29ubmVjdGlvbnNfcGVuZGluZygpKSB7Ci0gICAgTE9HX0RFQlVHKAotICAgICAgICAiQ29ubmVjdGlvbiBzdGF0ZSBub3QgaWRsZSBvciBhbHJlYWR5IGhhdmUgYmFja2dyb3VuZCBjb25uZWN0aW9uICIKLSAgICAgICAgInBlbmRpbmciKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwX2NiLT53bF9zdGF0ZSB8PSBCVE1fQkxFX0FDQ0VQVExJU1RfSU5JVDsKLQotICBidG1fZXhlY3V0ZV93bF9kZXZfb3BlcmF0aW9uKCk7Ci0KLSAgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3RfZm9yX3BsYXRmb3JtKEJUTV9CTEVfUkxfSU5JVCk7Ci0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5ybF9zdGF0ZSAhPSBCVE1fQkxFX1JMX0lETEUgJiYKLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpKSB7Ci0jaWYgKEJMRV9MT0NBTF9QUklWQUNZX0VOQUJMRUQgPT0gVFJVRSkKLSAgICBvd25fYWRkcl90eXBlIHw9IEJMRV9BRERSX1RZUEVfSURfQklUOwotI2VuZGlmCi0gICAgcGVlcl9hZGRyX3R5cGUgfD0gQkxFX0FERFJfVFlQRV9JRF9CSVQ7Ci0gIH0KLQotICBidG1fc2VuZF9oY2lfY3JlYXRlX2Nvbm5lY3Rpb24oCi0gICAgICBzY2FuX2ludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHVpbnQxNl90IHNjYW5faW50ICAgICAgKi8KLSAgICAgIHNjYW5fd2luLCAgICAgICAgICAgICAgICAgICAgICAgLyogdWludDE2X3Qgc2Nhbl93aW4gICAgICAqLwotICAgICAgMHgwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1aW50OF90IGFjY2VwdGxpc3QgICAgICovCi0gICAgICBwZWVyX2FkZHJfdHlwZSwgICAgICAgICAgICAgICAgIC8qIHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIgKi8KLSAgICAgIFJhd0FkZHJlc3M6OmtFbXB0eSwgICAgICAgICAgICAgLyogQkRfQUREUiBiZGFfcGVlciAgICAgKi8KLSAgICAgIG93bl9hZGRyX3R5cGUsICAgICAgICAgICAgICAgICAgLyogdWludDhfdCBhZGRyX3R5cGVfb3duICovCi0gICAgICBCVE1fQkxFX0NPTk5fSU5UX01JTl9ERUYsICAgICAgIC8qIHVpbnQxNl90IGNvbm5faW50X21pbiAgKi8KLSAgICAgIEJUTV9CTEVfQ09OTl9JTlRfTUFYX0RFRiwgICAgICAgLyogdWludDE2X3QgY29ubl9pbnRfbWF4ICAqLwotICAgICAgQlRNX0JMRV9DT05OX1BFUklQSEVSQUxfTEFURU5DWV9ERUYsIC8qIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSAgKi8KLSAgICAgIEJUTV9CTEVfQ09OTl9USU1FT1VUX0RFRiwgICAgICAgLyogdWludDE2X3QgY29ubl90aW1lb3V0ICAqLwotICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1aW50MTZfdCBtaW5fbGVuICAgICAgICovCi0gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVpbnQxNl90IG1heF9sZW4gICAgICAgKi8KLSAgICAgIHBoeSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3VwZGF0ZV9zY2FubmVyX2ZpbHRlcl9wb2xpY3kKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgZmlsdGVyIHBvbGljeSBvZiBzY2FubmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fdXBkYXRlX3NjYW5uZXJfZmlsdGVyX3BvbGljeSh0QlRNX0JMRV9TRlAgc2Nhbl9wb2xpY3kpIHsKLSAgdEJUTV9CTEVfSU5RX0NCKiBwX2lucSA9ICZidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyOwotCi0gIHVpbnQzMl90IHNjYW5faW50ZXJ2YWwgPQotICAgICAgIXBfaW5xLT5zY2FuX2ludGVydmFsID8gQlRNX0JMRV9HQVBfRElTQ19TQ0FOX0lOVCA6IHBfaW5xLT5zY2FuX2ludGVydmFsOwotICB1aW50MzJfdCBzY2FuX3dpbmRvdyA9Ci0gICAgICAhcF9pbnEtPnNjYW5fd2luZG93ID8gQlRNX0JMRV9HQVBfRElTQ19TQ0FOX1dJTiA6IHBfaW5xLT5zY2FuX3dpbmRvdzsKLQotICBCVE1fVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHBfaW5xLT5zZnAgPSBzY2FuX3BvbGljeTsKLSAgcF9pbnEtPnNjYW5fdHlwZSA9IHBfaW5xLT5zY2FuX3R5cGUgPT0gQlRNX0JMRV9TQ0FOX01PREVfTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgID8gQlRNX0JMRV9TQ0FOX01PREVfQUNUSQotICAgICAgICAgICAgICAgICAgICAgICAgIDogcF9pbnEtPnNjYW5fdHlwZTsKLQotICBidG1fc2VuZF9oY2lfc2V0X3NjYW5fcGFyYW1zKAotICAgICAgcF9pbnEtPnNjYW5fdHlwZSwgKHVpbnQxNl90KXNjYW5faW50ZXJ2YWwsICh1aW50MTZfdClzY2FuX3dpbmRvdywKLSAgICAgIGJ0bV9jYi5ibGVfY3RyX2NiLmFkZHJfbWdudF9jYi5vd25fYWRkcl90eXBlLCBzY2FuX3BvbGljeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2JnY29ubl9jYW5jZWxfaWZfZGlzY29ubmVjdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBJZiBhIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQsIGl0IG11c3QgYmUgcmUtYWRkZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIGFjY2VwdGxpc3QuIElmIG5lZWRlZCwgdGhpcyBmdW5jdGlvbiBjYW5jZWxzIGEgcGVuZGluZwotICogICAgICAgICAgICAgICAgICBpbml0aWF0ZSBjb21tYW5kIGluIG9yZGVyIHRvIHRyaWdnZXIgcmVzdGFydCBvZiB0aGUgaW5pdGlhdGUKLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZCB3aGljaCBpbiB0dXJuIHVwZGF0ZXMgdGhlIGFjY2VwdGxpc3QuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyOiB1cGRhdGVkIGRldmljZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfYmdjb25uX2NhbmNlbF9pZl9kaXNjb25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBpZiAoIWJ0bV9jYi5ibGVfY3RyX2NiLmlzX2Nvbm5lY3Rpb25fc3RhdGVfY29ubmVjdGluZygpKSByZXR1cm47Ci0KLSAgYXV0byBtYXBfaXQgPSBiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zLmZpbmQoYmRfYWRkcik7Ci0gIGlmIChtYXBfaXQgIT0gYmFja2dyb3VuZF9jb25uZWN0aW9ucy5lbmQoKSkgewotICAgIEJhY2tncm91bmRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gJm1hcF9pdC0+c2Vjb25kOwotICAgIGlmICghY29ubmVjdGlvbi0+aW5fY29udHJvbGxlcl93bCAmJiAhY29ubmVjdGlvbi0+cGVuZGluZ19yZW1vdmFsICYmCi0gICAgICAgICFCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSkgewotICAgICAgYnRtX2JsZV9zdG9wX2F1dG9fY29ubigpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zdXNwZW5kX2JnX2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gc3VzcGVuZCBhbiBhY3RpdmUgYmFja2dyb3VuZCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHByb2NlZHVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIG5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9ibGVfc3VzcGVuZF9iZ19jb25uKHZvaWQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgIExPR19ERUJVRygiR2QgYWNsX21hbmFnZXIgaGFuZGxlcyBzeW5jIG9mIGJhY2tncm91bmQgY29ubmVjdGlvbnMiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gYnRtX2JsZV9zdG9wX2F1dG9fY29ubigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9yZXN1bWVfYmdfY29ubgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0byByZXN1bWUgYSBiYWNrZ3JvdW5kIGF1dG8gY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwcm9jZWR1cmUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBub25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fYmxlX3Jlc3VtZV9iZ19jb25uKHZvaWQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgIExPR19ERUJVRygiR2QgYWNsX21hbmFnZXIgaGFuZGxlcyBzeW5jIG9mIGJhY2tncm91bmQgY29ubmVjdGlvbnMiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gYnRtX2JsZV9zdGFydF9hdXRvX2Nvbm4oKTsKLX0KLQotYm9vbCBCVE1fQmFja2dyb3VuZENvbm5lY3RBZGRyZXNzS25vd24oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYWRkcmVzcyk7Ci0KLSAgLy8gIG5vdCBhIGtub3duIGRldmljZSwgb3IgYSBjbGFzc2ljIGRldmljZSwgd2UgYXNzdW1lIHB1YmxpYyBhZGRyZXNzCi0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCB8fCAocF9kZXZfcmVjLT5kZXZpY2VfdHlwZSAmIEJUX0RFVklDRV9UWVBFX0JMRSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvLyBib25kZWQgZGV2aWNlIHdpdGggaWRlbnRpdHkgYWRkcmVzcyBrbm93bgotICBpZiAoIXBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLmJkYS5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFB1YmxpYyBhZGRyZXNzLCBSYW5kb20gU3RhdGljLCBvciBSYW5kb20gTm9uLVJlc29sdmFibGUgQWRkcmVzcyBrbm93bgotICBpZiAocF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZSA9PSBCTEVfQUREUl9QVUJMSUMgfHwKLSAgICAgICFCVE1fQkxFX0lTX1JFU09MVkVfQkRBKGFkZHJlc3MpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBPbmx5IFJlc29sdmFibGUgUHJpdmF0ZSBBZGRyZXNzIChSUEEpIGlzIGtub3duLCB3ZSBkb24ndCBhbGxvdyBpdCBpbnRvCi0gIC8vIHRoZSBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gcHJvY2VkdXJlLgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQlRNX1NldExlQ29ubmVjdGlvbk1vZGVUb0Zhc3QoKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIHRCVE1fQkxFX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotICBpZiAoKHBfY2ItPnNjYW5faW50ID09IEJUTV9CTEVfU0NBTl9QQVJBTV9VTkRFRiAmJgotICAgICAgIHBfY2ItPnNjYW5fd2luID09IEJUTV9CTEVfU0NBTl9QQVJBTV9VTkRFRikgfHwKLSAgICAgIChwX2NiLT5zY2FuX2ludCA9PSBCVE1fQkxFX1NDQU5fU0xPV19JTlRfMSAmJgotICAgICAgIHBfY2ItPnNjYW5fd2luID09IEJUTV9CTEVfU0NBTl9TTE9XX1dJTl8xKSkgewotICAgIHBfY2ItPnNjYW5faW50ID0gQlRNX0JMRV9TQ0FOX0ZBU1RfSU5UOwotICAgIHBfY2ItPnNjYW5fd2luID0gQlRNX0JMRV9TQ0FOX0ZBU1RfV0lOOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpIHsKLSAgVkxPRygyKSA8PCBfX2Z1bmNfXzsKLSAgdEJUTV9CTEVfQ0IqIHBfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2I7Ci0gIGlmICgocF9jYi0+c2Nhbl9pbnQgPT0gQlRNX0JMRV9TQ0FOX1BBUkFNX1VOREVGICYmCi0gICAgICAgcF9jYi0+c2Nhbl93aW4gPT0gQlRNX0JMRV9TQ0FOX1BBUkFNX1VOREVGKSB8fAotICAgICAgKHBfY2ItPnNjYW5faW50ID09IEJUTV9CTEVfU0NBTl9GQVNUX0lOVCAmJgotICAgICAgIHBfY2ItPnNjYW5fd2luID09IEJUTV9CTEVfU0NBTl9GQVNUX1dJTikpIHsKLSAgICBwX2NiLT5zY2FuX2ludCA9IEJUTV9CTEVfU0NBTl9TTE9XX0lOVF8xOwotICAgIHBfY2ItPnNjYW5fd2luID0gQlRNX0JMRV9TQ0FOX1NMT1dfV0lOXzE7Ci0gIH0KLX0KLQotLyoqIEFkZHMgdGhlIGRldmljZSBpbnRvIGFjY2VwdGxpc3QuIFJldHVybnMgZmFsc2UgaWYgYWNjZXB0bGlzdCBpcyBmdWxsIGFuZAotICogZGV2aWNlIGNhbid0IGJlIGFkZGVkLCB0cnVlIG90aGVyd2lzZS4gKi8KLWJvb2wgQlRNX0FjY2VwdGxpc3RBZGQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGUoKSkgewotICAgIExPR19XQVJOKCJDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgTGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QUNMX0FjY2VwdExlQ29ubmVjdGlvbkZyb20oCi0gICAgICAgIGNvbnZlcnRfdG9fYWRkcmVzc193aXRoX3R5cGUoYWRkcmVzcywgYnRtX2ZpbmRfZGV2KGFkZHJlc3MpKSwKLSAgICAgICAgLyogaXNfZGlyZWN0ICovIGZhbHNlKTsKLSAgfQotCi0gIGlmIChiYWNrZ3JvdW5kX2Nvbm5lY3Rpb25zX2NvdW50KCkgPT0KLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX2FjY2VwdGxpc3Rfc2l6ZSgpKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gYWRkIGRldmljZSB0byBhY2NlcHRsaXN0IHNpbmNlIGl0IGlzIGZ1bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYnRtX2NiLmJsZV9jdHJfY2Iud2xfc3RhdGUgJiBCVE1fQkxFX0FDQ0VQVExJU1RfSU5JVCkgewotICAgIGJ0bV9ibGVfc3RvcF9hdXRvX2Nvbm4oKTsKLSAgfQotICBidG1fYWRkX2Rldl90b19jb250cm9sbGVyKHRydWUsIGFkZHJlc3MpOwotICBidG1fYmxlX3Jlc3VtZV9iZ19jb25uKCk7Ci0gIExPR19ERUJVRygiQWRkZWQgdG8gTGUgYWNjZXB0bGlzdCBkZXZpY2U6JXMiLCBQUklWQVRFX0FERFJFU1MoYWRkcmVzcykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqIFJlbW92ZXMgdGhlIGRldmljZSBmcm9tIGFjY2VwdGxpc3QgKi8KLXZvaWQgQlRNX0FjY2VwdGxpc3RSZW1vdmUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGUoKSkgewotICAgIExPR19XQVJOKCJDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgTGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfSWdub3JlTGVDb25uZWN0aW9uRnJvbSgKLSAgICAgICAgY29udmVydF90b19hZGRyZXNzX3dpdGhfdHlwZShhZGRyZXNzLCBidG1fZmluZF9kZXYoYWRkcmVzcykpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYnRtX2NiLmJsZV9jdHJfY2Iud2xfc3RhdGUgJiBCVE1fQkxFX0FDQ0VQVExJU1RfSU5JVCkgewotICAgIGJ0bV9ibGVfc3RvcF9hdXRvX2Nvbm4oKTsKLSAgfQotICBidG1fYWRkX2Rldl90b19jb250cm9sbGVyKGZhbHNlLCBhZGRyZXNzKTsKLSAgYnRtX2JsZV9yZXN1bWVfYmdfY29ubigpOwotICBMT0dfREVCVUcoIlJlbW92ZWQgZnJvbSBMZSBhY2NlcHRsaXN0IGRldmljZTolcyIsIFBSSVZBVEVfQUREUkVTUyhhZGRyZXNzKSk7Ci19Ci0KLS8qKiBDbGVhciB0aGUgYWNjZXB0bGlzdCwgZW5kIGFueSBwZW5kaW5nIGFjY2VwdGxpc3QgY29ubmVjdGlvbnMgKi8KLXZvaWQgQlRNX0FjY2VwdGxpc3RDbGVhcigpIHsKLSAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlKCkpIHsKLSAgICBMT0dfV0FSTigiQ29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IExlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfYWNsX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QUNMX0lnbm9yZUFsbExlQ29ubmVjdGlvbnMoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidG1fYmxlX3N0b3BfYXV0b19jb25uKCk7Ci0gIGJ0c25kX2hjaWNfYmxlX2NsZWFyX2FjY2VwdGxpc3QoCi0gICAgICBiYXNlOjpCaW5kT25jZSgmYWNjZXB0bGlzdF9jbGVhcl9jb21tYW5kX2NvbXBsZXRlKSk7Ci0gIGJhY2tncm91bmRfY29ubmVjdGlvbnNfY2xlYXIoKTsKLSAgTE9HX0RFQlVHKCJDbGVhcmVkIExlIGFjY2VwdGxpc3QiKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fYmxlX2JnY29ubi5oIGIvc3RhY2svYnRtL2J0bV9ibGVfYmdjb25uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGFjOTQuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9ibGVfYmdjb25uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqIEFkZHMgdGhlIGRldmljZSBpbnRvIGFjY2VwdGxpc3QuIFJldHVybnMgZmFsc2UgaWYgYWNjZXB0bGlzdCBpcyBmdWxsIGFuZAotICogZGV2aWNlIGNhbid0IGJlIGFkZGVkLCB0cnVlIG90aGVyd2lzZS4gKi8KLWV4dGVybiBib29sIEJUTV9BY2NlcHRsaXN0QWRkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi0vKiogUmVtb3ZlcyB0aGUgZGV2aWNlIGZyb20gYWNjZXB0bGlzdCAqLwotZXh0ZXJuIHZvaWQgQlRNX0FjY2VwdGxpc3RSZW1vdmUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLS8qKiBDbGVhciB0aGUgYWNjZXB0bGlzdCwgZW5kIGFueSBwZW5kaW5nIGFjY2VwdGxpc3QgY29ubmVjdGlvbnMgKi8KLWV4dGVybiB2b2lkIEJUTV9BY2NlcHRsaXN0Q2xlYXIoKTsKLQotLyogVXNlIGZhc3Qgc2NhbiB3aW5kb3cvaW50ZXJ2YWwgZm9yIExFIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudC4KLSAqIFRoaXMgZG9lcyBub3Qgc2VuZCBhbnkgcmVxdWVzdHMgdG8gY29udHJvbGxlciwgaW5zdGVhZCBpdCBjaGFuZ2VzIHRoZQotICogcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgdXNlZCBhZnRlciBuZXh0IGFkZC9yZW1vdmUgcmVxdWVzdC4KLSAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNoYW5nZSBpcyBzY2hlZHVsZWQsIGZhbHNlIG90aGVyd2lzZS4gKi8KLWV4dGVybiBib29sIEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0KCk7Ci0KLS8qIFVzZSBzbG93IHNjYW4gd2luZG93L2ludGVydmFsIGZvciBMRSBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuCi0gKiBUaGlzIGRvZXMgbm90IHNlbmQgYW55IHJlcXVlc3RzIHRvIGNvbnRyb2xsZXIsIGluc3RlYWQgaXQgY2hhbmdlcyB0aGUKLSAqIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIHVzZWQgYWZ0ZXIgbmV4dCBhZGQvcmVtb3ZlIHJlcXVlc3QgKi8KLWV4dGVybiB2b2lkIEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9TbG93KCk7CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX2JsZV9jb250X2VuZXJneS5jYyBiL3N0YWNrL2J0bS9idG1fYmxlX2NvbnRfZW5lcmd5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdkNTk5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fYmxlX2NvbnRfZW5lcmd5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQgIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotCi0jaW5jbHVkZSAiYnRtX2JsZV9hcGkuaCIKLSNpbmNsdWRlICJidG1faW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ1dGlscy9pbmNsdWRlL2J0X3V0aWxzLmgiCi0KLWV4dGVybiB0QlRNX0NCIGJ0bV9jYjsKLQotdEJUTV9CTEVfRU5FUkdZX0lORk9fQ0IgYmxlX2VuZXJneV9pbmZvX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9jb250X2VuZXJneV9jbXBsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb250cm9sbGVyIFZTQyBjb21wbGV0ZSBjYWxsYmFjawotICoKLSAqIFBhcmFtZXRlcnMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX2JsZV9jb250X2VuZXJneV9jbXBsX2NiYWNrKHRCVE1fVlNDX0NNUEwqIHBfcGFyYW1zKSB7Ci0gIHVpbnQ4X3QqIHAgPSBwX3BhcmFtcy0+cF9wYXJhbV9idWY7Ci0gIHVpbnQxNl90IGxlbiA9IHBfcGFyYW1zLT5wYXJhbV9sZW47Ci0gIHVpbnQzMl90IHRvdGFsX3R4X3RpbWUgPSAwLCB0b3RhbF9yeF90aW1lID0gMCwgdG90YWxfaWRsZV90aW1lID0gMCwKLSAgICAgICAgICAgdG90YWxfZW5lcmd5X3VzZWQgPSAwOwotCi0gIGlmIChsZW4gPCAxNykgewotICAgIEJUTV9UUkFDRV9FUlJPUigid3JvbmcgbGVuZ3RoIGZvciBidG1fYmxlX2NvbnRfZW5lcmd5X2NtcGxfY2JhY2siKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IHJhd19zdGF0dXM7Ci0gIFNUUkVBTV9UT19VSU5UOChyYXdfc3RhdHVzLCBwKTsKLSAgdEhDSV9TVEFUVVMgc3RhdHVzID0gdG9faGNpX3N0YXR1c19jb2RlKHJhd19zdGF0dXMpOwotICBTVFJFQU1fVE9fVUlOVDMyKHRvdGFsX3R4X3RpbWUsIHApOwotICBTVFJFQU1fVE9fVUlOVDMyKHRvdGFsX3J4X3RpbWUsIHApOwotICBTVFJFQU1fVE9fVUlOVDMyKHRvdGFsX2lkbGVfdGltZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMzIodG90YWxfZW5lcmd5X3VzZWQsIHApOwotCi0gIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICJlbmVyZ3lfaW5mbyBzdGF0dXM9JWQsdHhfdD0lbGQsIHJ4X3Q9JWxkLCBlbmVyX3VzZWQ9JWxkLCBpZGxlX3Q9JWxkIiwKLSAgICAgIHN0YXR1cywgdG90YWxfdHhfdGltZSwgdG90YWxfcnhfdGltZSwgdG90YWxfZW5lcmd5X3VzZWQsIHRvdGFsX2lkbGVfdGltZSk7Ci0KLSAgaWYgKE5VTEwgIT0gYmxlX2VuZXJneV9pbmZvX2NiLnBfZW5lcl9jYmFjaykKLSAgICBibGVfZW5lcmd5X2luZm9fY2IucF9lbmVyX2NiYWNrKHRvdGFsX3R4X3RpbWUsIHRvdGFsX3J4X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9pZGxlX3RpbWUsIHRvdGFsX2VuZXJneV91c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpOwotCi0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVHZXRFbmVyZ3lJbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIG9idGFpbnMgdGhlIGVuZXJneSBpbmZvCi0gKgotICogUGFyYW1ldGVycyAgICAgIHBfZW5lcl9jYmFjayAtIENhbGxiYWNrIHBvaW50ZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQmxlR2V0RW5lcmd5SW5mbyh0QlRNX0JMRV9FTkVSR1lfSU5GT19DQkFDSyogcF9lbmVyX2NiYWNrKSB7Ci0gIHRCVE1fQkxFX1ZTQ19DQiBjbW5fYmxlX3ZzY19jYjsKLQotICBCVE1fQmxlR2V0VmVuZG9yQ2FwYWJpbGl0aWVzKCZjbW5fYmxlX3ZzY19jYik7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCJCVE1fQmxlR2V0RW5lcmd5SW5mbyIpOwotCi0gIGlmICgwID09IGNtbl9ibGVfdnNjX2NiLmVuZXJneV9zdXBwb3J0KSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgZ2V0IGVuZXJneSBpbmZvIik7Ci0gICAgcmV0dXJuIEJUTV9FUlJfUFJPQ0VTU0lORzsKLSAgfQotCi0gIGJsZV9lbmVyZ3lfaW5mb19jYi5wX2VuZXJfY2JhY2sgPSBwX2VuZXJfY2JhY2s7Ci0gIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQoSENJX0JMRV9FTkVSR1lfSU5GTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG1fYmxlX2NvbnRfZW5lcmd5X2NtcGxfY2JhY2spOwotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9ibGVfZ2FwLmNjIGIvc3RhY2svYnRtL2J0bV9ibGVfZ2FwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I5NTViLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fYmxlX2dhcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOC0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBCTEUgR0FQLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfYnRtX2JsZSIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYnRtX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fZGV2LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9nYXR0L2dhdHRfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hZHZlcnRpc2VfZGF0YV9wYXJzZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaW5xX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLWV4dGVybiB0QlRNX0NCIGJ0bV9jYjsKLQotZXh0ZXJuIHZvaWQgYnRtX2lucV9yZW1vdGVfbmFtZV90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotZXh0ZXJuIGJvb2wgYnRtX2JsZV9pbml0X3BzZXVkb19hZGRyKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBuZXdfcHNldWRvX2FkZHIpOwotZXh0ZXJuIGJvb2wgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkbyhSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2FkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZyZXNoKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfYmF0Y2hzY2FuX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX2Fkdl9maWx0ZXJfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9jbGVhcl9hbGxfcGVuZGluZ19sZV9lbnRyeSh2b2lkKTsKLWV4dGVybiBjb25zdCB0QkxFX0JEX0FERFIgY29udmVydF90b19hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpOwotCi0jZGVmaW5lIEJUTV9FWFRfQkxFX1JNVF9OQU1FX1RJTUVPVVRfTVMgKDMwICogMTAwMCkKLSNkZWZpbmUgTUlOX0FEVl9MRU5HVEggMgotI2RlZmluZSBCVE1fVlNDX0NISVBfQ0FQQUJJTElUWV9SU1BfTEVOIDkKLSNkZWZpbmUgQlRNX1ZTQ19DSElQX0NBUEFCSUxJVFlfUlNQX0xFTl9MX1JFTEVBU0UgXAotICBCVE1fVlNDX0NISVBfQ0FQQUJJTElUWV9SU1BfTEVOCi0jZGVmaW5lIEJUTV9WU0NfQ0hJUF9DQVBBQklMSVRZX1JTUF9MRU5fTV9SRUxFQVNFIDE1Ci0jZGVmaW5lIEJUTV9WU0NfQ0hJUF9DQVBBQklMSVRZX1JTUF9MRU5fU19SRUxFQVNFIDI1Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIEFkdmVydGlzaW5nQ2FjaGUgewotIHB1YmxpYzoKLSAgLyogU2V0IHRoZSBkYXRhIHRvIHxkYXRhfCBmb3IgZGV2aWNlIHxhZGRyX3R5cGUsIGFkZHJ8ICovCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBTZXQodWludDhfdCBhZGRyX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICAgIGF1dG8gaXQgPSBGaW5kKGFkZHJfdHlwZSwgYWRkcik7Ci0gICAgaWYgKGl0ICE9IGl0ZW1zLmVuZCgpKSB7Ci0gICAgICBpdC0+ZGF0YSA9IHN0ZDo6bW92ZShkYXRhKTsKLSAgICAgIHJldHVybiBpdC0+ZGF0YTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbXMuc2l6ZSgpID4gY2FjaGVfbWF4KSB7Ci0gICAgICBpdGVtcy5wb3BfYmFjaygpOwotICAgIH0KLQotICAgIGl0ZW1zLmVtcGxhY2VfZnJvbnQoYWRkcl90eXBlLCBhZGRyLCBzdGQ6Om1vdmUoZGF0YSkpOwotICAgIHJldHVybiBpdGVtcy5mcm9udCgpLmRhdGE7Ci0gIH0KLQotICBib29sIEV4aXN0KHVpbnQ4X3QgYWRkcl90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gICAgYXV0byBpdCA9IEZpbmQoYWRkcl90eXBlLCBhZGRyKTsKLSAgICBpZiAoaXQgIT0gaXRlbXMuZW5kKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBBcHBlbmQgfGRhdGF8IGZvciBkZXZpY2UgfGFkZHJfdHlwZSwgYWRkcnwgKi8KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIEFwcGVuZCh1aW50OF90IGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKSB7Ci0gICAgYXV0byBpdCA9IEZpbmQoYWRkcl90eXBlLCBhZGRyKTsKLSAgICBpZiAoaXQgIT0gaXRlbXMuZW5kKCkpIHsKLSAgICAgIGl0LT5kYXRhLmluc2VydChpdC0+ZGF0YS5lbmQoKSwgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICAgIHJldHVybiBpdC0+ZGF0YTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbXMuc2l6ZSgpID4gY2FjaGVfbWF4KSB7Ci0gICAgICBpdGVtcy5wb3BfYmFjaygpOwotICAgIH0KLQotICAgIGl0ZW1zLmVtcGxhY2VfZnJvbnQoYWRkcl90eXBlLCBhZGRyLCBzdGQ6Om1vdmUoZGF0YSkpOwotICAgIHJldHVybiBpdGVtcy5mcm9udCgpLmRhdGE7Ci0gIH0KLQotICAvKiBDbGVhciBkYXRhIGZvciBkZXZpY2UgfGFkZHJfdHlwZSwgYWRkcnwgKi8KLSAgdm9pZCBDbGVhcih1aW50OF90IGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICAgIGF1dG8gaXQgPSBGaW5kKGFkZHJfdHlwZSwgYWRkcik7Ci0gICAgaWYgKGl0ICE9IGl0ZW1zLmVuZCgpKSB7Ci0gICAgICBpdGVtcy5lcmFzZShpdCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDbGVhckFsbCgpIHsgaXRlbXMuY2xlYXIoKTsgfQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IEl0ZW0gewotICAgIHVpbnQ4X3QgYWRkcl90eXBlOwotICAgIFJhd0FkZHJlc3MgYWRkcjsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOwotCi0gICAgSXRlbSh1aW50OF90IGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkKLSAgICAgICAgOiBhZGRyX3R5cGUoYWRkcl90eXBlKSwgYWRkcihhZGRyKSwgZGF0YShkYXRhKSB7fQotICB9OwotCi0gIHN0ZDo6bGlzdDxJdGVtPjo6aXRlcmF0b3IgRmluZCh1aW50OF90IGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICAgIGZvciAoYXV0byBpdCA9IGl0ZW1zLmJlZ2luKCk7IGl0ICE9IGl0ZW1zLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBpZiAoaXQtPmFkZHJfdHlwZSA9PSBhZGRyX3R5cGUgJiYgaXQtPmFkZHIgPT0gYWRkcikgewotICAgICAgICByZXR1cm4gaXQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtcy5lbmQoKTsKLSAgfQotCi0gIC8qIHdlIGtlZXAgbWF4aW11bSA3IGRldmljZXMgaW4gdGhlIGNhY2hlICovCi0gIGNvbnN0IHNpemVfdCBjYWNoZV9tYXggPSA3OwotICBzdGQ6Omxpc3Q8SXRlbT4gaXRlbXM7Ci19OwotCi0vKiBEZXZpY2VzIGluIHRoaXMgY2FjaGUgYXJlIHdhaXRpbmcgZm9yIGVpdGVyIHNjYW4gcmVzcG9uc2UsIG9yIGNoYWluZWQgcGFja2V0cwotICogb24gc2Vjb25kYXJ5IGNoYW5uZWwgKi8KLUFkdmVydGlzaW5nQ2FjaGUgY2FjaGU7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0jaWYgKEJMRV9WTkRfSU5DTFVERUQgPT0gVFJVRSkKLXN0YXRpYyB0QlRNX0JMRV9DVFJMX0ZFQVRVUkVTX0NCQUNLKiBwX2N0cmxfbGVfZmVhdHVyZV9yZF9jbXBsX2NiYWNrID0gTlVMTDsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExvY2FsIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfdXBkYXRlX2Fkdl9mbGFnKHVpbnQ4X3QgZmxhZyk7Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0X2NvbnQodWludDE2X3QgZXZ0X3R5cGUsIHVpbnQ4X3QgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDhfdCBwcmltYXJ5X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY29uZGFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsIGludDhfdCB0eF9wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnNzaSwgdWludDE2X3QgcGVyaW9kaWNfYWR2X2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBkYXRhKTsKLXN0YXRpYyB1aW50OF90IGJ0bV9zZXRfY29ubl9tb2RlX2Fkdl9pbml0X2FkZHIoUmF3QWRkcmVzcyYgcF9wZWVyX2FkZHJfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9wZWVyX2FkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfb3duX2FkZHJfdHlwZSk7Ci1zdGF0aWMgdm9pZCBidG1fYmxlX3N0b3Bfb2JzZXJ2ZSh2b2lkKTsKLXN0YXRpYyB2b2lkIGJ0bV9ibGVfZmFzdF9hZHZfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLXN0YXRpYyB2b2lkIGJ0bV9ibGVfc3RhcnRfc2xvd19hZHYodm9pZCk7Ci1zdGF0aWMgdm9pZCBidG1fYmxlX2lucXVpcnlfdGltZXJfZ2FwX2xpbWl0ZWRfZGlzY292ZXJ5X3RpbWVvdXQodm9pZCogZGF0YSk7Ci1zdGF0aWMgdm9pZCBidG1fYmxlX2lucXVpcnlfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLXN0YXRpYyB2b2lkIGJ0bV9ibGVfb2JzZXJ2ZXJfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLQotZW51bSA6IHVpbnQ4X3QgewotICBCVE1fQkxFX05PVF9TQ0FOTklORyA9IDB4MDAsCi0gIEJUTV9CTEVfSU5RX1JFU1VMVCA9IDB4MDEsCi0gIEJUTV9CTEVfT0JTX1JFU1VMVCA9IDB4MDIsCi19OwotCi1zdGF0aWMgYm9vbCBibGVfZXZ0X3R5cGVfaXNfY29ubmVjdGFibGUodWludDE2X3QgZXZ0X3R5cGUpIHsKLSAgcmV0dXJuIGV2dF90eXBlICYgKDEgPDwgQkxFX0VWVF9DT05ORUNUQUJMRV9CSVQpOwotfQotCi1zdGF0aWMgYm9vbCBibGVfZXZ0X3R5cGVfaXNfc2Nhbm5hYmxlKHVpbnQxNl90IGV2dF90eXBlKSB7Ci0gIHJldHVybiBldnRfdHlwZSAmICgxIDw8IEJMRV9FVlRfU0NBTk5BQkxFX0JJVCk7Ci19Ci0KLXN0YXRpYyBib29sIGJsZV9ldnRfdHlwZV9pc19kaXJlY3RlZCh1aW50MTZfdCBldnRfdHlwZSkgewotICByZXR1cm4gZXZ0X3R5cGUgJiAoMSA8PCBCTEVfRVZUX0RJUkVDVEVEX0JJVCk7Ci19Ci0KLXN0YXRpYyBib29sIGJsZV9ldnRfdHlwZV9pc19zY2FuX3Jlc3AodWludDE2X3QgZXZ0X3R5cGUpIHsKLSAgcmV0dXJuIGV2dF90eXBlICYgKDEgPDwgQkxFX0VWVF9TQ0FOX1JFU1BPTlNFX0JJVCk7Ci19Ci0KLXN0YXRpYyBib29sIGJsZV9ldnRfdHlwZV9pc19sZWdhY3kodWludDE2X3QgZXZ0X3R5cGUpIHsKLSAgcmV0dXJuIGV2dF90eXBlICYgKDEgPDwgQkxFX0VWVF9MRUdBQ1lfQklUKTsKLX0KLQotc3RhdGljIHVpbnQ4X3QgYmxlX2V2dF90eXBlX2RhdGFfc3RhdHVzKHVpbnQxNl90IGV2dF90eXBlKSB7Ci0gIHJldHVybiAoZXZ0X3R5cGUgPj4gNSkgJiAzOwotfQotCi1jb25zdGV4cHIgdWludDhfdCBVTlNVUFBPUlRFRCA9IDI1NTsKLQotLyogTEUgc3RhdGVzIGNvbWJvIGJpdCB0byBjaGVjayAqLwotY29uc3QgdWludDhfdCBidG1fbGVfc3RhdGVfY29tYm9fdGJsW0JUTV9CTEVfU1RBVEVfTUFYXVtCVE1fQkxFX1NUQVRFX01BWF0gPSB7Ci0gICAgewotICAgICAgICAvKiBzaW5nbGUgc3RhdGUgc3VwcG9ydCAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX0JJVCwgICAvKiBjb25uX2FkdiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0lOSVRfQklULCAgICAgICAvKiBpbml0ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9CSVQsICAgICAgIC8qIGNlbnRyYWwgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19QRVJJUEhFUkFMX0JJVCwgLyogcGVyaXBoZXJhbCAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAvKiB0b2RvOiBsbyBkdSBkaXIgYWR2LCBub3QgY292ZXJlZCA/ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX0JJVCwgLyogaGkgZHV0eSBkaXIgYWR2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfTk9OX0NPTk5fQURWX0JJVCwgICAgLyogbm9uIGNvbm5lY3RhYmxlIGFkdiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX1BBU1NfU0NBTl9CSVQsICAgICAgIC8qICBwYXNzaXZlIHNjYW4gKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19BQ1RJVkVfU0NBTl9CSVQsICAgICAvKiAgIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfQklUICAgICAgICAgLyogc2NhbmFibGUgYWR2ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qIGNvbm5fYWR2ID0wICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uX2FkdiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX0lOSVRfQklULCAgICAgICAgLyogaW5pdDogMzIgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19DT05OX0FEVl9DRU5UUkFMX0JJVCwgICAgIC8qIGNlbnRyYWw6IDM1ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfUEVSSVBIRVJBTF9CSVQsICAvKiBwZXJpcGhlcmFsOiAzOCwqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG8gZHUgZGlyIGFkdiAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGkgZHV0eSBkaXIgYWR2ICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub24gY29ubmVjdGFibGUgYWR2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfUEFTU19TQ0FOX0JJVCwgICAvKiAgcGFzc2l2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfQUNUSVZFX1NDQU5fQklULCAvKiAgIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIFVOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FuYWJsZSBhZHYgKi8KLSAgICB9LAotICAgIHsKLSAgICAgICAgLyogaW5pdCAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX0lOSVRfQklULCAgICAgICAgICAgLyogY29ubl9hZHY6IDMyICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9DRU5UUkFMX0JJVCwgICAgICAgICAgICAvKiBjZW50cmFsIDI4ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9DRU5UUkFMX1BFUklQSEVSQUxfQklULCAvKiBwZXJpcGhlcmFsIDQxICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfTE9fRFVUWV9ESVJfQURWX0lOSVRfQklULCAgICAvKiBsbyBkdSBkaXIgYWR2IDM0ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX0lOSVRfQklULCAgICAvKiBoaSBkdXR5IGRpciBhZHYgMzMgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19OT05fQ09OTl9JTklUX0JJVCwgICAgICAgICAgIC8qICBub24gY29ubmVjdGFibGUgYWR2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfUEFTU19TQ0FOX0lOSVRfQklULCAgICAgICAgICAvKiBwYXNzaXZlIHNjYW4gKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19BQ1RJVkVfU0NBTl9JTklUX0JJVCwgICAgICAgIC8qICBhY3RpdmUgc2NhbiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX1NDQU5fQURWX0lOSVRfQklUICAgICAgICAgICAgLyogc2NhbmFibGUgYWR2ICovCi0KLSAgICB9LAotICAgIHsKLSAgICAgICAgLyogY2VudHJhbCAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX0NFTlRSQUxfQklULCAgICAgICAgLyogY29ubl9hZHY6IDM1ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9DRU5UUkFMX0JJVCwgICAgICAgICAgICAvKiBpbml0IDI4ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9DRU5UUkFMX0JJVCwgICAgICAgICAgICAvKiBjZW50cmFsIDI4ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfSU5JVF9CSVQsICAgICAgICAgICAvKiBwZXJpcGhlcmFsOiAzMiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0xPX0RVVFlfRElSX0FEVl9DRU5UUkFMX0JJVCwgLyogbG8gZHV0eSBjeWNsZSBhZHYgMzcgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfQ0VOVFJBTF9CSVQsIC8qIGhpIGR1dHkgY3ljbGUgYWR2IDM2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfTk9OX0NPTk5fQURWX0NFTlRSQUxfQklULCAgICAvKiAgbm9uIGNvbm5lY3RhYmxlIGFkdiovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfUEFTU19TQ0FOX0NFTlRSQUxfQklULCAgICAgICAvKiAgcGFzc2l2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQUNUSVZFX1NDQU5fQ0VOVFJBTF9CSVQsICAgICAvKiAgIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfQ0VOVFJBTF9CSVQgICAgICAgICAvKiAgc2NhbmFibGUgYWR2ICovCi0KLSAgICB9LAotICAgIHsKLSAgICAgICAgLyogcGVyaXBoZXJhbCAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX1BFUklQSEVSQUxfQklULCAgICAgICAgLyogY29ubl9hZHY6IDM4LCovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9DRU5UUkFMX1BFUklQSEVSQUxfQklULCAgICAvKiBpbml0IDQxICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSU5JVF9DRU5UUkFMX1BFUklQSEVSQUxfQklULCAgICAvKiBjZW50cmFsIDQxICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfUEVSSVBIRVJBTF9CSVQsICAgICAgICAvKiBwZXJpcGhlcmFsOiAzOCwqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0xPX0RVVFlfRElSX0FEVl9QRVJJUEhFUkFMX0JJVCwgLyogbG8gZHV0eSBjeWNsZSBhZHYgNDAgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfUEVSSVBIRVJBTF9CSVQsIC8qIGhpIGR1dHkgY3ljbGUgYWR2IDM5ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfTk9OX0NPTk5fQURWX1BFUklQSEVSQUxfQklULCAgICAvKiBub24gY29ubmVjdGFibGUgYWR2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfUEFTU19TQ0FOX1BFUklQSEVSQUxfQklULCAgICAgICAvKiBwYXNzaXZlIHNjYW4gKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19BQ1RJVkVfU0NBTl9QRVJJUEhFUkFMX0JJVCwgICAgIC8qICBhY3RpdmUgc2NhbiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX1NDQU5fQURWX1BFUklQSEVSQUxfQklUICAgICAgICAgLyogc2NhbmFibGUgYWR2ICovCi0KLSAgICB9LAotICAgIHsKLSAgICAgICAgLyogbG8gZHV0eSBjeWNsZSBhZHYgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5fYWR2OiAzOCwqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0xPX0RVVFlfRElSX0FEVl9JTklUX0JJVCwgICAgICAgLyogaW5pdCAzNCAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0xPX0RVVFlfRElSX0FEVl9DRU5UUkFMX0JJVCwgICAgLyogY2VudHJhbCAzNyAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0xPX0RVVFlfRElSX0FEVl9QRVJJUEhFUkFMX0JJVCwgLyogcGVyaXBoZXJhbDogNDAgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvIGR1dHkgY3ljbGUgYWR2IDQwICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaSBkdXR5IGN5Y2xlIGFkdiAzOSAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIG5vbiBjb25uZWN0YWJsZSBhZHYgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsIC8qIFRPRE86IHBhc3NpdmUgc2Nhbiwgbm90IGNvdmVyZWQ/ICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAvKiBUT0RPOiAgYWN0aXZlIHNjYW4sIG5vdCBjb3ZlcmVkPyAqLwotICAgICAgICBVTlNVUFBPUlRFRCAgLyogIHNjYW5hYmxlIGFkdiAqLwotICAgIH0sCi0gICAgewotICAgICAgICAvKiBoaSBkdXR5IGN5Y2xlIGFkdiAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ubl9hZHY6IDM4LCovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX0lOSVRfQklULCAgICAgICAvKiBpbml0IDMzICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX0NFTlRSQUxfQklULCAgICAvKiBjZW50cmFsIDM2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX1BFUklQSEVSQUxfQklULCAvKiBwZXJpcGhlcmFsOiAzOSovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsbyBkdXR5IGN5Y2xlIGFkdiA0MCAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGkgZHV0eSBjeWNsZSBhZHYgMzkgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vbiBjb25uZWN0YWJsZSBhZHYgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfUEFTU19TQ0FOX0JJVCwgIC8qIHBhc3NpdmUgc2NhbiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0hJX0RVVFlfRElSX0FEVl9BQ1RJVkVfU0NBTl9CSVQsIC8qIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIFVOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbmFibGUgYWR2ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qIG5vbiBjb25uZWN0YWJsZSBhZHYgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25uX2FkdjogKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19OT05fQ09OTl9JTklUX0JJVCwgICAgICAgICAgICAvKiBpbml0ICAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX05PTl9DT05OX0FEVl9DRU5UUkFMX0JJVCwgICAgIC8qIGNlbnRyYWwgICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfTk9OX0NPTk5fQURWX1BFUklQSEVSQUxfQklULCAgLyogcGVyaXBoZXJhbDogKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsbyBkdXR5IGN5Y2xlIGFkdiAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpIGR1dHkgY3ljbGUgYWR2ICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9uIGNvbm5lY3RhYmxlIGFkdiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX05PTl9DT05OX0FEVl9QQVNTX1NDQU5fQklULCAgIC8qIHBhc3NpdmUgc2NhbiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX05PTl9DT05OX0FEVl9BQ1RJVkVfU0NBTl9CSVQsIC8qIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIFVOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbmFibGUgYWR2ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qIHBhc3NpdmUgc2NhbiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX1BBU1NfU0NBTl9CSVQsICAgICAgICAvKiBjb25uX2FkdjogKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19QQVNTX1NDQU5fSU5JVF9CSVQsICAgICAgICAgICAgLyogaW5pdCAgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19QQVNTX1NDQU5fQ0VOVFJBTF9CSVQsICAgICAgICAgLyogY2VudHJhbCAgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19QQVNTX1NDQU5fUEVSSVBIRVJBTF9CSVQsICAgICAgLyogcGVyaXBoZXJhbDogKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG8gZHV0eSBjeWNsZSBhZHYgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfUEFTU19TQ0FOX0JJVCwgLyogaGkgZHV0eSBjeWNsZSBhZHYgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19OT05fQ09OTl9BRFZfUEFTU19TQ0FOX0JJVCwgICAgLyogbm9uIGNvbm5lY3RhYmxlIGFkdiAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXNzaXZlIHNjYW4gKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWN0aXZlIHNjYW4gKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19TQ0FOX0FEVl9QQVNTX1NDQU5fQklUICAgICAgICAgLyogc2NhbmFibGUgYWR2ICovCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfQUNUSVZFX1NDQU5fQklULCAgICAgICAgLyogY29ubl9hZHY6ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfQUNUSVZFX1NDQU5fSU5JVF9CSVQsICAgICAgICAgICAgLyogaW5pdCAgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19BQ1RJVkVfU0NBTl9DRU5UUkFMX0JJVCwgICAgICAgICAvKiBjZW50cmFsICAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX0FDVElWRV9TQ0FOX1BFUklQSEVSQUxfQklULCAgICAgIC8qIHBlcmlwaGVyYWw6ICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG8gZHV0eSBjeWNsZSBhZHYgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfQUNUSVZFX1NDQU5fQklULCAvKiBoaSBkdXR5IGN5Y2xlIGFkdiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX05PTl9DT05OX0FEVl9BQ1RJVkVfU0NBTl9CSVQsIC8qICBub24gY29ubmVjdGFibGUgYWR2ICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogcGFzc2l2ZSBzY2FuICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogIGFjdGl2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfQUNUSVZFX1NDQU5fQklUICAgICAgLyogIHNjYW5hYmxlIGFkdiAqLwotICAgIH0sCi0gICAgewotICAgICAgICAvKiBzY2FuYWJsZSBhZHYgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbm5fYWR2OiAqLwotICAgICAgICBIQ0lfTEVfU1RBVEVTX1NDQU5fQURWX0lOSVRfQklULCAgICAgICAgLyogaW5pdCAgKi8KLSAgICAgICAgSENJX0xFX1NUQVRFU19TQ0FOX0FEVl9DRU5UUkFMX0JJVCwgICAgIC8qIGNlbnRyYWwgICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfUEVSSVBIRVJBTF9CSVQsICAvKiBwZXJpcGhlcmFsOiAqLwotICAgICAgICBVTlNVUFBPUlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG8gZHV0eSBjeWNsZSBhZHYgKi8KLSAgICAgICAgVU5TVVBQT1JURUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpIGR1dHkgY3ljbGUgYWR2ICovCi0gICAgICAgIFVOU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub24gY29ubmVjdGFibGUgYWR2ICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfUEFTU19TQ0FOX0JJVCwgICAvKiAgcGFzc2l2ZSBzY2FuICovCi0gICAgICAgIEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfQUNUSVZFX1NDQU5fQklULCAvKiAgYWN0aXZlIHNjYW4gKi8KLSAgICAgICAgVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYW5hYmxlIGFkdiAqLwotICAgIH19OwotCi0vKiBjaGVjayBMRSBjb21ibyBzdGF0ZSBzdXBwb3J0ZWQgKi8KLWlubGluZSBib29sIEJUTV9MRV9TVEFURVNfU1VQUE9SVEVEKGNvbnN0IHVpbnQ4X3QqIHgsIHVpbnQ4X3QgYml0X251bSkgewotICB1aW50OF90IG1hc2sgPSAxIDw8IChiaXRfbnVtICUgOCk7Ci0gIHVpbnQ4X3Qgb2Zmc2V0ID0gYml0X251bSAvIDg7Ci0gIHJldHVybiAoKHgpW29mZnNldF0gJiBtYXNrKTsKLX0KLQotdm9pZCBCVE1fQmxlT3Bwb3J0dW5pc3RpY09ic2VydmUoYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVPcHBvcnR1bmlzdGljT2JzZXJ2ZShlbmFibGUsIHBfcmVzdWx0c19jYik7Ci0gICAgLy8gTk9URTogcGFzc3Rocm91Z2gsIG5vIHJldHVybiBoZXJlLiBHRCB3b3VsZCBzZW5kIHRoZSByZXN1bHRzIGJhY2sgdG8gQlRNLAotICAgIC8vIGFuZCBpdCBuZWVkcyB0aGUgY2FsbGJhY2tzIHNldCBwcm9wZXJseS4KLSAgfQotCi0gIGlmIChlbmFibGUpIHsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5wX29wcG9ydHVuaXN0aWNfb2JzX3Jlc3VsdHNfY2IgPSBwX3Jlc3VsdHNfY2I7Ci0gIH0gZWxzZSB7Ci0gICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vcHBvcnR1bmlzdGljX29ic19yZXN1bHRzX2NiID0gTlVMTDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZU9ic2VydmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgcHJvY2VkdXJlIGtlZXAgdGhlIGRldmljZSBsaXN0ZW5pbmcgZm9yIGFkdmVydGlzaW5nCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50cyBmcm9tIGEgYnJvYWRjYXN0IGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHN0YXJ0OiBzdGFydCBvciBzdG9wIG9ic2VydmUuCi0gKiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBob3cgbG9uZyB0aGUgc2NhbiBzaG91bGQgbGFzdCwgaW4gc2Vjb25kcy4gMCBtZWFucwotICogICAgICAgICAgICAgICAgICBzY2FuIHdpdGhvdXQgdGltZW91dC4gU3RhcnRpbmcgdGhlIHNjYW4gc2Vjb25kIHRpbWUgd2l0aG91dAotICogICAgICAgICAgICAgICAgICB0aW1lb3V0IHdpbGwgZGlzYWJsZSB0aGUgdGltZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9CbGVPYnNlcnZlKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY21wbF9jYikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVPYnNlcnZlKHN0YXJ0LCBkdXJhdGlvbiwgcF9yZXN1bHRzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY21wbF9jYik7Ci0gIH0KLQotICB0QlRNX0JMRV9JTlFfQ0IqIHBfaW5xID0gJmJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXI7Ci0gIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9XUk9OR19NT0RFOwotCi0gIHVpbnQzMl90IHNjYW5faW50ZXJ2YWwgPQotICAgICAgIXBfaW5xLT5zY2FuX2ludGVydmFsID8gQlRNX0JMRV9HQVBfRElTQ19TQ0FOX0lOVCA6IHBfaW5xLT5zY2FuX2ludGVydmFsOwotICB1aW50MzJfdCBzY2FuX3dpbmRvdyA9Ci0gICAgICAhcF9pbnEtPnNjYW5fd2luZG93ID8gQlRNX0JMRV9HQVBfRElTQ19TQ0FOX1dJTiA6IHBfaW5xLT5zY2FuX3dpbmRvdzsKLQotICBCVE1fVFJBQ0VfRVZFTlQoIiVzIDogc2Nhbl90eXBlOiVkLCAlZCwgJWQiLCBfX2Z1bmNfXywgcF9pbnEtPnNjYW5fdHlwZSwKLSAgICAgICAgICAgICAgICAgIHBfaW5xLT5zY2FuX2ludGVydmFsLCBwX2lucS0+c2Nhbl93aW5kb3cpOwotCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZSgpKSByZXR1cm4gQlRNX0lMTEVHQUxfVkFMVUU7Ci0KLSAgaWYgKHN0YXJ0KSB7Ci0gICAgLyogc2hhcmVkIGlucXVpcnkgZGF0YWJhc2UsIGRvIG5vdCBhbGxvdyBvYnNlcnZlIGlmIGFueSBpbnF1aXJ5IGlzIGFjdGl2ZSAqLwotICAgIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pc19ibGVfb2JzZXJ2ZV9hY3RpdmUoKSkgewotICAgICAgaWYgKGR1cmF0aW9uID09IDApIHsKLSAgICAgICAgaWYgKGFsYXJtX2lzX3NjaGVkdWxlZChidG1fY2IuYmxlX2N0cl9jYi5vYnNlcnZlcl90aW1lcikpIHsKLSAgICAgICAgICBhbGFybV9jYW5jZWwoYnRtX2NiLmJsZV9jdHJfY2Iub2JzZXJ2ZXJfdGltZXIpOwotICAgICAgICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEJUTV9UUkFDRV9FUlJPUigiJXMgT2JzZXJ2ZSBBbHJlYWR5IEFjdGl2ZSIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vYnNfcmVzdWx0c19jYiA9IHBfcmVzdWx0c19jYjsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5wX29ic19jbXBsX2NiID0gcF9jbXBsX2NiOwotICAgIHN0YXR1cyA9IEJUTV9DTURfU1RBUlRFRDsKLQotICAgIC8qIHNjYW4gaXMgbm90IHN0YXJ0ZWQgKi8KLSAgICBpZiAoIWJ0bV9jYi5ibGVfY3RyX2NiLmlzX2JsZV9zY2FuX2FjdGl2ZSgpKSB7Ci0gICAgICAvKiBhbGxvdyBjb25maWcgb2Ygc2NhbiB0eXBlICovCi0gICAgICBjYWNoZS5DbGVhckFsbCgpOwotICAgICAgcF9pbnEtPnNjYW5fdHlwZSA9IChwX2lucS0+c2Nhbl90eXBlID09IEJUTV9CTEVfU0NBTl9NT0RFX05PTkUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQlRNX0JMRV9TQ0FOX01PREVfQUNUSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBfaW5xLT5zY2FuX3R5cGU7Ci0gICAgICAvKiBhc3N1bWUgb2JzZXJ2ZSBhbHdheXMgbm90IHVzaW5nIGFjY2VwdGxpc3QgKi8KLSAgICAgIC8qIGVuYWJsZSByZXNvbHZpbmcgbGlzdCAqLwotICAgICAgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3RfZm9yX3BsYXRmb3JtKEJUTV9CTEVfUkxfU0NBTik7Ci0KLSAgICAgIGJ0bV9zZW5kX2hjaV9zZXRfc2Nhbl9wYXJhbXMoCi0gICAgICAgICAgcF9pbnEtPnNjYW5fdHlwZSwgKHVpbnQxNl90KXNjYW5faW50ZXJ2YWwsICh1aW50MTZfdClzY2FuX3dpbmRvdywKLSAgICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5hZGRyX21nbnRfY2Iub3duX2FkZHJfdHlwZSwgQlRNX0JMRV9ERUZBVUxUX1NGUCk7Ci0KLSAgICAgIGJ0bV9ibGVfc3RhcnRfc2NhbigpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICBidG1fY2IuYmxlX2N0cl9jYi5zZXRfYmxlX29ic2VydmVfYWN0aXZlKCk7Ci0gICAgICBpZiAoZHVyYXRpb24gIT0gMCkgewotICAgICAgICAvKiBzdGFydCBvYnNlcnZlciB0aW1lciAqLwotICAgICAgICB1aW50NjRfdCBkdXJhdGlvbl9tcyA9IGR1cmF0aW9uICogMTAwMDsKLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKGJ0bV9jYi5ibGVfY3RyX2NiLm9ic2VydmVyX3RpbWVyLCBkdXJhdGlvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9ibGVfb2JzZXJ2ZXJfdGltZXJfdGltZW91dCwgTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLmlzX2JsZV9vYnNlcnZlX2FjdGl2ZSgpKSB7Ci0gICAgc3RhdHVzID0gQlRNX0NNRF9TVEFSVEVEOwotICAgIGJ0bV9ibGVfc3RvcF9vYnNlcnZlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlcyBPYnNlcnZlIG5vdCBhY3RpdmUiLCBfX2Z1bmNfXyk7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0jaWYgKEJMRV9WTkRfSU5DTFVERUQgPT0gVFJVRSkKLQotc3RhdGljIHZvaWQgYnRtX2dldF9keW5hbWljX2F1ZGlvX2J1ZmZlcl92c2NfY21wbF9jYmFjaygKLSAgICB0QlRNX1ZTQ19DTVBMKiBwX3ZzY19jbXBsX3BhcmFtcykgewotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgaWYgKHBfdnNjX2NtcGxfcGFyYW1zLT5wYXJhbV9sZW4gPCAxKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIjogVGhlIGxlbmd0aCBvZiByZXR1cm5lZCBwYXJhbWV0ZXJzIGlzIGxlc3MgdGhhbiAxIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCogcF9ldmVudF9wYXJhbV9idWYgPSBwX3ZzY19jbXBsX3BhcmFtcy0+cF9wYXJhbV9idWY7Ci0gIHVpbnQ4X3Qgc3RhdHVzID0gMHhmZjsKLSAgdWludDhfdCBvcGNvZGUgPSAweGZmOwotICB1aW50MzJfdCBjb2RlY19tYXNrID0gMHhmZmZmZmZmZjsKLQotICAvLyBbUmV0dXJuIFBhcmFtZXRlcl0gICAgICAgICB8IFtTaXplXSAgIHwgW1B1cnBvc2VdCi0gIC8vIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgIHwgMSBvY3RldCAgfCBDb21tYW5kIGNvbXBsZXRlIHN0YXR1cwotICAvLyBEeW5hbWljX0F1ZGlvX0J1ZmZlcl9vcGNvZGV8IDEgb2N0ZXQgIHwgMHgwMSAtIEdldCBidWZmZXIgdGltZQotICAvLyBBdWRpb19Db2RlZGNfVHlwZV9TdXBwb3J0ZWR8IDQgb2N0ZXQgIHwgQml0IG1hc2tzIGZvciBzZWxlY3RlZCBjb2RlYyB0eXBlcwotICAvLyBBdWRpb19Db2RlY19CdWZmZXJfVGltZSAgICB8IDE5MiBvY3RldHwgRGVmYXVsdC9NYXgvTWluIGJ1ZmZlciB0aW1lCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfZXZlbnRfcGFyYW1fYnVmKTsKLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IEZhaWwgdG8gY29uZmlndXJlIERGVEIuIHN0YXR1czogIiA8PCBsb2doZXgoc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF92c2NfY21wbF9wYXJhbXMtPnBhcmFtX2xlbiAhPSAxOTgpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBUaGUgbGVuZ3RoIG9mIHJldHVybmVkIHBhcmFtZXRlcnMgaXMgbm90IGVxdWFsIHRvIDE5ODogIgotICAgICAgICAgICAgICAgPDwgc3RkOjp0b19zdHJpbmcocF92c2NfY21wbF9wYXJhbXMtPnBhcmFtX2xlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KG9wY29kZSwgcF9ldmVudF9wYXJhbV9idWYpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogb3Bjb2RlID0gIiA8PCBsb2doZXgob3Bjb2RlKTsKLQotICBpZiAob3Bjb2RlID09IDB4MDEpIHsKLSAgICBTVFJFQU1fVE9fVUlOVDMyKGNvZGVjX21hc2ssIHBfZXZlbnRfcGFyYW1fYnVmKTsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogY29kZWNfbWFzayA9ICIgPDwgbG9naGV4KGNvZGVjX21hc2spOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCVE1fQ09ERUNfVFlQRV9NQVhfUkVDT1JEUzsgaSsrKSB7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGJ0bV9jYi5keW5hbWljX2F1ZGlvX2J1ZmZlcl9jYltpXS5kZWZhdWx0X2J1ZmZlcl90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBwX2V2ZW50X3BhcmFtX2J1Zik7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGJ0bV9jYi5keW5hbWljX2F1ZGlvX2J1ZmZlcl9jYltpXS5tYXhpbXVtX2J1ZmZlcl90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBwX2V2ZW50X3BhcmFtX2J1Zik7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGJ0bV9jYi5keW5hbWljX2F1ZGlvX2J1ZmZlcl9jYltpXS5taW5pbXVtX2J1ZmZlcl90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBwX2V2ZW50X3BhcmFtX2J1Zik7Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFN1Y2NlZWQgdG8gcmVjZWl2ZSBNZWRpYSBUeCBCdWZmZXIuIjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3ZzY19icmNtX2ZlYXR1cmVzX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDb21tYW5kIENvbXBsZXRlIGNhbGxiYWNrIGZvciBIQ0lfQkxFX1ZFTkRPUl9DQVAKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX2JsZV92ZW5kb3JfY2FwYWJpbGl0eV92c2NfY21wbF9jYmFjaygKLSAgICB0QlRNX1ZTQ19DTVBMKiBwX3Zjc19jcGx0X3BhcmFtcykgewotICBCVE1fVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIC8qIENoZWNrIHN0YXR1cyBvZiBjb21tYW5kIGNvbXBsZXRlIGV2ZW50ICovCi0gIENIRUNLKHBfdmNzX2NwbHRfcGFyYW1zLT5vcGNvZGUgPT0gSENJX0JMRV9WRU5ET1JfQ0FQKTsKLSAgQ0hFQ0socF92Y3NfY3BsdF9wYXJhbXMtPnBhcmFtX2xlbiA+IDApOwotCi0gIGNvbnN0IHVpbnQ4X3QqIHAgPSBwX3Zjc19jcGx0X3BhcmFtcy0+cF9wYXJhbV9idWY7Ci0gIHVpbnQ4X3QgcmF3X3N0YXR1czsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJhd19zdGF0dXMsIHApOwotICB0SENJX1NUQVRVUyBzdGF0dXMgPSB0b19oY2lfc3RhdHVzX2NvZGUocmF3X3N0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIEJUTV9UUkFDRV9ERUJVRygiJXM6IFN0YXR1cyA9IDB4JTAyeCAoMCBpcyBzdWNjZXNzKSIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotICBDSEVDSyhwX3Zjc19jcGx0X3BhcmFtcy0+cGFyYW1fbGVuID49IEJUTV9WU0NfQ0hJUF9DQVBBQklMSVRZX1JTUF9MRU4pOwotICBTVFJFQU1fVE9fVUlOVDgoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLmFkdl9pbnN0X21heCwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChidG1fY2IuY21uX2JsZV92c2NfY2IucnBhX29mZmxvYWRpbmcsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi50b3Rfc2Nhbl9yZXN1bHRzX3N0cmcsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLm1heF9pcmtfbGlzdF9zeiwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChidG1fY2IuY21uX2JsZV92c2NfY2IuZmlsdGVyX3N1cHBvcnQsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLm1heF9maWx0ZXIsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLmVuZXJneV9zdXBwb3J0LCBwKTsKLQotICBpZiAocF92Y3NfY3BsdF9wYXJhbXMtPnBhcmFtX2xlbiA+Ci0gICAgICBCVE1fVlNDX0NISVBfQ0FQQUJJTElUWV9SU1BfTEVOX0xfUkVMRUFTRSkgewotICAgIFNUUkVBTV9UT19VSU5UMTYoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLnZlcnNpb25fc3VwcG9ydGVkLCBwKTsKLSAgfSBlbHNlIHsKLSAgICBidG1fY2IuY21uX2JsZV92c2NfY2IudmVyc2lvbl9zdXBwb3J0ZWQgPSBCVE1fVlNDX0NISVBfQ0FQQUJJTElUWV9MX1ZFUlNJT047Ci0gIH0KLQotICBpZiAoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLnZlcnNpb25fc3VwcG9ydGVkID49Ci0gICAgICBCVE1fVlNDX0NISVBfQ0FQQUJJTElUWV9NX1ZFUlNJT04pIHsKLSAgICBDSEVDSyhwX3Zjc19jcGx0X3BhcmFtcy0+cGFyYW1fbGVuID49Ci0gICAgICAgICAgQlRNX1ZTQ19DSElQX0NBUEFCSUxJVFlfUlNQX0xFTl9NX1JFTEVBU0UpOwotICAgIFNUUkVBTV9UT19VSU5UMTYoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLnRvdGFsX3RyYWNrYWJsZV9hZHZlcnRpc2VycywgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi5leHRlbmRlZF9zY2FuX3N1cHBvcnQsIHApOwotICAgIFNUUkVBTV9UT19VSU5UOChidG1fY2IuY21uX2JsZV92c2NfY2IuZGVidWdfbG9nZ2luZ19zdXBwb3J0ZWQsIHApOwotICB9Ci0KLSAgaWYgKGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi52ZXJzaW9uX3N1cHBvcnRlZCA+PQotICAgICAgQlRNX1ZTQ19DSElQX0NBUEFCSUxJVFlfU19WRVJTSU9OKSB7Ci0gICAgaWYgKHBfdmNzX2NwbHRfcGFyYW1zLT5wYXJhbV9sZW4gPj0KLSAgICAgICAgQlRNX1ZTQ19DSElQX0NBUEFCSUxJVFlfUlNQX0xFTl9TX1JFTEVBU0UpIHsKLSAgICAgIFNUUkVBTV9UT19VSU5UOCgKLSAgICAgICAgICBidG1fY2IuY21uX2JsZV92c2NfY2IubGVfYWRkcmVzc19nZW5lcmF0aW9uX29mZmxvYWRpbmdfc3VwcG9ydCwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDMyKAotICAgICAgICAgIGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi5hMmRwX3NvdXJjZV9vZmZsb2FkX2NhcGFiaWxpdHlfbWFzaywgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLnF1YWxpdHlfcmVwb3J0X3N1cHBvcnQsIHApOwotICAgICAgU1RSRUFNX1RPX1VJTlQzMihidG1fY2IuY21uX2JsZV92c2NfY2IuZHluYW1pY19hdWRpb19idWZmZXJfc3VwcG9ydCwgcCk7Ci0KLSAgICAgIGlmIChidG1fY2IuY21uX2JsZV92c2NfY2IuZHluYW1pY19hdWRpb19idWZmZXJfc3VwcG9ydCAhPSAwKSB7Ci0gICAgICAgIHVpbnQ4X3QgcGFyYW1bM10gPSB7MH07Ci0gICAgICAgIHVpbnQ4X3QqIHBfcGFyYW0gPSBwYXJhbTsKLQotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocF9wYXJhbSwgSENJX0NPTlRST0xMRVJfREFCX0dFVF9CVUZGRVJfVElNRSk7Ci0gICAgICAgIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQoSENJX0NPTlRST0xMRVJfREFCLCBwX3BhcmFtIC0gcGFyYW0sIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9nZXRfZHluYW1pY19hdWRpb19idWZmZXJfdnNjX2NtcGxfY2JhY2spOwotICAgICAgfQotICAgIH0KLSAgfQotICBidG1fY2IuY21uX2JsZV92c2NfY2IudmFsdWVzX3JlYWQgPSB0cnVlOwotCi0gIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICIlczogc3RhdD0lZCwgaXJrPSVkLCBBRFYgaW5zOiVkLCBycGE9JWQsIGVuZXI9JWQsIGV4dF9zY2FuPSVkIiwgX19mdW5jX18sCi0gICAgICBzdGF0dXMsIGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi5tYXhfaXJrX2xpc3Rfc3osCi0gICAgICBidG1fY2IuY21uX2JsZV92c2NfY2IuYWR2X2luc3RfbWF4LCBidG1fY2IuY21uX2JsZV92c2NfY2IucnBhX29mZmxvYWRpbmcsCi0gICAgICBidG1fY2IuY21uX2JsZV92c2NfY2IuZW5lcmd5X3N1cHBvcnQsCi0gICAgICBidG1fY2IuY21uX2JsZV92c2NfY2IuZXh0ZW5kZWRfc2Nhbl9zdXBwb3J0KTsKLQotICBidG1fYmxlX2Fkdl9pbml0KCk7Ci0KLSAgaWYgKGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi5tYXhfZmlsdGVyID4gMCkgYnRtX2JsZV9hZHZfZmlsdGVyX2luaXQoKTsKLQotICAvKiBWUyBjYXBhYmlsaXR5IGluY2x1ZGVkIGFuZCBub24tNC4yIGRldmljZSAqLwotICBpZiAoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLm1heF9pcmtfbGlzdF9zeiA+IDAgJiYKLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgPT0gMCkKLSAgICBidG1fYmxlX3Jlc29sdmluZ19saXN0X2luaXQoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLm1heF9pcmtfbGlzdF9zeik7Ci0KLSAgaWYgKGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi50b3Rfc2Nhbl9yZXN1bHRzX3N0cmcgPiAwKSBidG1fYmxlX2JhdGNoc2Nhbl9pbml0KCk7Ci0KLSAgaWYgKHBfY3RybF9sZV9mZWF0dXJlX3JkX2NtcGxfY2JhY2sgIT0gTlVMTCkKLSAgICBwX2N0cmxfbGVfZmVhdHVyZV9yZF9jbXBsX2NiYWNrKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpKTsKLX0KLSNlbmRpZiAvKiAoQkxFX1ZORF9JTkNMVURFRCA9PSBUUlVFKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBsb2NhbCBMRSBmZWF0dXJlcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9jbW5fdnNjX2NiIDogTG9jYWxhIExFIGNhcGFiaWxpdHkgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcyh0QlRNX0JMRV9WU0NfQ0IqIHBfY21uX3ZzY19jYikgewotICBpZiAoTlVMTCAhPSBwX2Ntbl92c2NfY2IpIHsKLSAgICAqcF9jbW5fdnNjX2NiID0gYnRtX2NiLmNtbl9ibGVfdnNjX2NiOwotICB9Ci19Ci0KLXZvaWQgQlRNX0JsZUdldER5bmFtaWNBdWRpb0J1ZmZlcigKLSAgICB0QlRNX0JUX0RZTkFNSUNfQVVESU9fQlVGRkVSX0NCIHBfZHluYW1pY19hdWRpb19idWZmZXJfY2JbXSkgewotICBCVE1fVFJBQ0VfREVCVUcoIkJUTV9CbGVHZXREeW5hbWljQXVkaW9CdWZmZXIiKTsKLQotICBpZiAoTlVMTCAhPSBwX2R5bmFtaWNfYXVkaW9fYnVmZmVyX2NiKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgICBwX2R5bmFtaWNfYXVkaW9fYnVmZmVyX2NiW2ldID0gYnRtX2NiLmR5bmFtaWNfYXVkaW9fYnVmZmVyX2NiW2ldOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlUmVhZENvbnRyb2xsZXJGZWF0dXJlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZHMgQkxFIHNwZWNpZmljIGNvbnRyb2xsZXIgZmVhdHVyZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHRCVE1fQkxFX0NUUkxfRkVBVFVSRVNfQ0JBQ0sgOiBDYWxsYmFjayB0byBub3RpZnkgd2hlbgotICogICAgICAgICAgICAgICAgICBmZWF0dXJlcyBhcmUgcmVhZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKEJMRV9WTkRfSU5DTFVERUQgPT0gVFJVRSkKLXZvaWQgQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXModEJUTV9CTEVfQ1RSTF9GRUFUVVJFU19DQkFDSyogcF92c2NfY2JhY2spIHsKLSAgaWYgKGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi52YWx1ZXNfcmVhZCkgcmV0dXJuOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXMiKTsKLQotICBwX2N0cmxfbGVfZmVhdHVyZV9yZF9jbXBsX2NiYWNrID0gcF92c2NfY2JhY2s7Ci0gIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQoSENJX0JMRV9WRU5ET1JfQ0FQLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9ibGVfdmVuZG9yX2NhcGFiaWxpdHlfdnNjX2NtcGxfY2JhY2spOwotfQotI2Vsc2UKLXZvaWQgQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXMoCi0gICAgVU5VU0VEX0FUVFIgdEJUTV9CTEVfQ1RSTF9GRUFUVVJFU19DQkFDSyogcF92c2NfY2JhY2spIHt9Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVDb25maWdQcml2YWN5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgcHJpdmFjeSBpbgotICogICAgICAgICAgICAgICAgICAgTEUgY2hhbm5lbCBvZiB0aGUgbG9jYWwgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcHJpdmFjeV9tb2RlOiAgcHJpdmFjeSBtb2RlIG9uIG9yIG9mZi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wgICAgcHJpdmFjeSBtb2RlIHNldCBzdWNjZXNzOyBvdGhlcndpc2UgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9CbGVDb25maWdQcml2YWN5KGJvb2wgcHJpdmFjeV9tb2RlKSB7Ci0gIHRCVE1fQkxFX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotCi0gIEJUTV9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLyogaWYgTEUgaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJuIGVycm9yICovCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgdEdBUF9CTEVfQVRUUl9WQUxVRSBnYXBfYmxlX2F0dHJfdmFsdWU7Ci0gIGdhcF9ibGVfYXR0cl92YWx1ZS5hZGRyX3Jlc29sdXRpb24gPSAwOwotICBpZiAoIXByaXZhY3lfbW9kZSkgLyogaWYgcHJpdmFjeSBkaXNhYmxlZCwgYWx3YXlzIHVzZSBwdWJsaWMgYWRkcmVzcyAqLwotICB7Ci0gICAgcF9jYi0+YWRkcl9tZ250X2NiLm93bl9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gICAgcF9jYi0+cHJpdmFjeV9tb2RlID0gQlRNX1BSSVZBQ1lfTk9ORTsKLSAgfSBlbHNlIC8qIHByaXZhY3kgaXMgdHVybmVkIG9uKi8KLSAgewotICAgIC8qIGFsd2F5cyBzZXQgaG9zdCByYW5kb20gYWRkcmVzcywgdXNlZCB3aGVuIHByaXZhY3kgMS4xIG9yIHByaWF2Y3kgMS4yIGlzCi0gICAgICogZGlzYWJsZWQgKi8KLSAgICBwX2NiLT5hZGRyX21nbnRfY2Iub3duX2FkZHJfdHlwZSA9IEJMRV9BRERSX1JBTkRPTTsKLSAgICBidG1fZ2VuX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyKGJhc2U6OkJpbmQoJmJ0bV9nZW5fcmVzb2x2ZV9wYWRkcl9sb3cpKTsKLQotICAgIC8qIDQuMiBjb250cm9sbGVyIG9ubHkgYWxsb3cgcHJpdmFjeSAxLjIgb3IgbWl4ZWQgbW9kZSwgcmVzb2x2YWJsZSBwcml2YXRlCi0gICAgICogYWRkcmVzcyBpbiBjb250cm9sbGVyICovCi0gICAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpKSB7Ci0gICAgICBnYXBfYmxlX2F0dHJfdmFsdWUuYWRkcl9yZXNvbHV0aW9uID0gMTsKLSAgICAgIHBfY2ItPnByaXZhY3lfbW9kZSA9IEJUTV9QUklWQUNZXzFfMjsKLSAgICB9IGVsc2UgLyogNC4xLzQuMCBjb250cm9sbGVyICovCi0gICAgICBwX2NiLT5wcml2YWN5X21vZGUgPSBCVE1fUFJJVkFDWV8xXzE7Ci0gIH0KLQotICBHQVBfQmxlQXR0ckRCVXBkYXRlKEdBVFRfVVVJRF9HQVBfQ0VOVFJBTF9BRERSX1JFU09MLCAmZ2FwX2JsZV9hdHRyX3ZhbHVlKTsKLQotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpIHx8Ci0gICAgICBibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QUNMX0NvbmZpZ3VyZUxlUHJpdmFjeShwcml2YWN5X21vZGUpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgIEJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgICAgUmV0dXJucyBtYXggbnVtYmVyIG9mIG11bHRpIGFkdiBpbnN0YW5jZXMgc3VwcG9ydGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE1heCBtdWx0aSBhZHYgaW5zdGFuY2UgY291bnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KHZvaWQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KCk7Ci0gIH0KLSAgcmV0dXJuIGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi5hZHZfaW5zdF9tYXggPCBCVE1fQkxFX01VTFRJX0FEVl9NQVgKLSAgICAgICAgICAgICA/IGJ0bV9jYi5jbW5fYmxlX3ZzY19jYi5hZHZfaW5zdF9tYXgKLSAgICAgICAgICAgICA6IEJUTV9CTEVfTVVMVElfQURWX01BWDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVMb2NhbFByaXZhY3lFbmFibGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICAgIENoZWNrcyBpZiBsb2NhbCBkZXZpY2Ugc3VwcG9ydHMgcHJpdmF0ZSBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZXR1cm4gdHJ1ZSBpZiBsb2NhbCBwcml2YWN5IGlzIGVuYWJsZWQgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9CbGVMb2NhbFByaXZhY3lFbmFibGVkKHZvaWQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlTG9jYWxQcml2YWN5RW5hYmxlZCgpOwotICB9Ci0gIHJldHVybiAoYnRtX2NiLmJsZV9jdHJfY2IucHJpdmFjeV9tb2RlICE9IEJUTV9QUklWQUNZX05PTkUpOwotfQotCi1zdGF0aWMgYm9vbCBpc19yZXNvbHZpbmdfbGlzdF9iaXRfc2V0KHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGRhdGEpOwotCi0gIGlmICgocF9kZXZfcmVjLT5ibGUuaW5fY29udHJvbGxlcl9saXN0ICYgQlRNX1JFU09MVklOR19MSVNUX0JJVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2V0X2Nvbm5fbW9kZV9hZHZfaW5pdF9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZXQgaW5pdGF0b3IgYWRkcmVzcyB0eXBlIGFuZCBsb2NhbCBhZGRyZXNzIHR5cGUgYmFzZWQgb24KLSAqICAgICAgICAgICAgICAgICAgYWR2IG1vZGUuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBidG1fc2V0X2Nvbm5fbW9kZV9hZHZfaW5pdF9hZGRyKAotICAgIFJhd0FkZHJlc3MmIHBfcGVlcl9hZGRyX3B0ciwgdEJMRV9BRERSX1RZUEUqIHBfcGVlcl9hZGRyX3R5cGUsCi0gICAgdEJMRV9BRERSX1RZUEUqIHBfb3duX2FkZHJfdHlwZSkgewotICB0QlRNX0JMRV9JTlFfQ0IqIHBfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3ZhcjsKLSAgdWludDhfdCBldnRfdHlwZTsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjOwotCi0gIGlmIChwX2NiLT5jb25uZWN0YWJsZV9tb2RlID09IEJUTV9CTEVfTk9OX0NPTk5FQ1RBQkxFKSB7Ci0gICAgaWYgKHBfY2ItPnNjYW5fcnNwKSB7Ci0gICAgICBldnRfdHlwZSA9IEJUTV9CTEVfRElTQ09WRVJfRVZUOwotICAgIH0gZWxzZSB7Ci0gICAgICBldnRfdHlwZSA9IEJUTV9CTEVfTk9OX0NPTk5FQ1RfRVZUOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBldnRfdHlwZSA9IEJUTV9CTEVfQ09OTkVDVF9FVlQ7Ci0gIH0KLQotICBpZiAoZXZ0X3R5cGUgPT0gQlRNX0JMRV9DT05ORUNUX0VWVCkgewotICAgIGV2dF90eXBlID0gcF9jYi0+ZGlyZWN0ZWRfY29ubjsKLQotICAgIGlmIChwX2NiLT5kaXJlY3RlZF9jb25uID09IEJUTV9CTEVfQ09OTkVDVF9ESVJfRVZUIHx8Ci0gICAgICAgIHBfY2ItPmRpcmVjdGVkX2Nvbm4gPT0gQlRNX0JMRV9DT05ORUNUX0xPX0RVVFlfRElSX0VWVCkgewotICAgICAgLyogZm9yIHByaXZhY3kgMS4yLCBjb252ZXJ0IHBlZXIgYWRkcmVzcyBhcyBzdGF0aWMsIG93biBhZGRyZXNzIHNldCBhcyBJRAotICAgICAgICogYWRkciAqLwotICAgICAgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLnByaXZhY3lfbW9kZSA9PSBCVE1fUFJJVkFDWV8xXzIgfHwKLSAgICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5wcml2YWN5X21vZGUgPT0gQlRNX1BSSVZBQ1lfTUlYRUQpIHsKLSAgICAgICAgLyogb25seSBkbyBzbyBmb3IgYm9uZGVkIGRldmljZSAqLwotICAgICAgICBpZiAoKHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihwX2NiLT5kaXJlY3RfYmRhLmJkYSkpICE9IE5VTEwgJiYKLSAgICAgICAgICAgIHBfZGV2X3JlYy0+YmxlLmluX2NvbnRyb2xsZXJfbGlzdCAmIEJUTV9SRVNPTFZJTkdfTElTVF9CSVQpIHsKLSAgICAgICAgICBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdChCVE1fQkxFX1JMX0FEVik7Ci0gICAgICAgICAgcF9wZWVyX2FkZHJfcHRyID0gcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhOwotICAgICAgICAgICpwX3BlZXJfYWRkcl90eXBlID0gcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZTsKLSAgICAgICAgICAqcF9vd25fYWRkcl90eXBlID0gQkxFX0FERFJfUkFORE9NX0lEOwotICAgICAgICAgIHJldHVybiBldnRfdHlwZTsKLSAgICAgICAgfQotICAgICAgICAvKiBvdGhlcndpc2UgZmFsbCB0aG91Z2ggYXMgbm9ybWFsIGRpcmVjdGVkIGFkdiAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBidG1fYmxlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QoQlRNX0JMRV9STF9BRFYsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBkaXJlY3QgYWR2IG1vZGUgZG9lcyBub3QgaGF2ZSBwcml2YWN5LCBpZiBwcml2YWN5IGlzIG5vdCBlbmFibGVkICAqLwotICAgICAgKnBfcGVlcl9hZGRyX3R5cGUgPSBwX2NiLT5kaXJlY3RfYmRhLnR5cGU7Ci0gICAgICBwX3BlZXJfYWRkcl9wdHIgPSBwX2NiLT5kaXJlY3RfYmRhLmJkYTsKLSAgICAgIHJldHVybiBldnRfdHlwZTsKLSAgICB9Ci0gIH0KLQotICAvKiB1bmRpcmVjdCBhZHYgbW9kZSBvciBub24tY29ubmVjdGFibGUgbW9kZSovCi0gIC8qIHdoZW4gcHJpdmFjeSAxLjIgcHJpdmFjeSBvbmx5IG1vZGUgaXMgdXNlZCwgb3IgbWl4ZWQgbW9kZSAqLwotICBpZiAoKGJ0bV9jYi5ibGVfY3RyX2NiLnByaXZhY3lfbW9kZSA9PSBCVE1fUFJJVkFDWV8xXzIgJiYKLSAgICAgICBwX2NiLT5hZnAgIT0gQVBfU0NBTl9DT05OX0FMTCkgfHwKLSAgICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnByaXZhY3lfbW9kZSA9PSBCVE1fUFJJVkFDWV9NSVhFRCkgewotICAgIGxpc3Rfbm9kZV90KiBuID0KLSAgICAgICAgbGlzdF9mb3JlYWNoKGJ0bV9jYi5zZWNfZGV2X3JlYywgaXNfcmVzb2x2aW5nX2xpc3RfYml0X3NldCwgTlVMTCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgIC8qIGlmIGVuaGFuY2VkIHByaXZhY3kgaXMgcmVxdWlyZWQsIHNldCBJZGVudGl0eSBhZGRyZXNzIGFuZCBtYXRjaGluZyBJUksKLSAgICAgICAqIHBlZXIgKi8KLSAgICAgIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGxpc3Rfbm9kZShuKSk7Ci0gICAgICBwX3BlZXJfYWRkcl9wdHIgPSBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGE7Ci0gICAgICAqcF9wZWVyX2FkZHJfdHlwZSA9IHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLnR5cGU7Ci0KLSAgICAgICpwX293bl9hZGRyX3R5cGUgPSBCTEVfQUREUl9SQU5ET01fSUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHJlc29sdmluZyBsaXN0IGlzIGVtcHR5LCBub3QgZW5hYmxlZCAqLwotICAgICAgKnBfb3duX2FkZHJfdHlwZSA9IEJMRV9BRERSX1JBTkRPTTsKLSAgICB9Ci0gIH0KLSAgLyogcHJpdmFjeSAxLjEsIG9yIHByaXZhY3kgMS4yLCBnZW5lcmFsIGRpc2NvdmVyYWJsZS9jb25uZWN0YWJsZSBtb2RlLCBkaXNhYmxlCi0gICAgIHByaXZhY3kgaW4gKi8KLSAgLyogY29udHJvbGxlciBmYWxsIGJhY2sgdG8gaG9zdCBiYXNlZCBwcml2YWN5ICovCi0gIGVsc2UgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLnByaXZhY3lfbW9kZSAhPSBCVE1fUFJJVkFDWV9OT05FKSB7Ci0gICAgKnBfb3duX2FkZHJfdHlwZSA9IEJMRV9BRERSX1JBTkRPTTsKLSAgfQotCi0gIC8qIGlmIG5vIHByaXZhY3ksZG8gbm90IHNldCBhbnkgcGVlciBhZGRyZXNzLCovCi0gIC8qIGxvY2FsIGFkZHJlc3MgdHlwZSBnbyBieSBnbG9iYWwgcHJpdmFjeSBzZXR0aW5nICovCi0gIHJldHVybiBldnRfdHlwZTsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgc2NhbiBwYXJhbWV0ZXJzLiB8Y2J8IGlzIGNhbGxlZCB3aXRoIG9wZXJhdGlvbgotICogc3RhdHVzCi0gKiovCi12b2lkIEJUTV9CbGVTZXRTY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCk+IGNiKSB7Ci0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZSgpKSB7Ci0gICAgTE9HX0lORk8oIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBibGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MzJfdCBtYXhfc2Nhbl9pbnRlcnZhbCA9IEJUTV9CTEVfRVhUX1NDQU5fSU5UX01BWDsKLSAgdWludDMyX3QgbWF4X3NjYW5fd2luZG93ID0gQlRNX0JMRV9FWFRfU0NBTl9XSU5fTUFYOwotICBpZiAoYnRtX2NiLmNtbl9ibGVfdnNjX2NiLmV4dGVuZGVkX3NjYW5fc3VwcG9ydCA9PSAwKSB7Ci0gICAgbWF4X3NjYW5faW50ZXJ2YWwgPSBCVE1fQkxFX1NDQU5fSU5UX01BWDsKLSAgICBtYXhfc2Nhbl93aW5kb3cgPSBCVE1fQkxFX1NDQU5fV0lOX01BWDsKLSAgfQotCi0gIHRCVE1fQkxFX0lOUV9DQiogcF9jYiA9ICZidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyOwotICBpZiAoQlRNX0JMRV9JU1ZBTElEX1BBUkFNKHNjYW5faW50ZXJ2YWwsIEJUTV9CTEVfU0NBTl9JTlRfTUlOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zY2FuX2ludGVydmFsKSAmJgotICAgICAgQlRNX0JMRV9JU1ZBTElEX1BBUkFNKHNjYW5fd2luZG93LCBCVE1fQkxFX1NDQU5fV0lOX01JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2Nhbl93aW5kb3cpICYmCi0gICAgICAoc2Nhbl9tb2RlID09IEJUTV9CTEVfU0NBTl9NT0RFX0FDVEkgfHwKLSAgICAgICBzY2FuX21vZGUgPT0gQlRNX0JMRV9TQ0FOX01PREVfUEFTUykpIHsKLSAgICBwX2NiLT5zY2FuX3R5cGUgPSBzY2FuX21vZGU7Ci0gICAgcF9jYi0+c2Nhbl9pbnRlcnZhbCA9IHNjYW5faW50ZXJ2YWw7Ci0gICAgcF9jYi0+c2Nhbl93aW5kb3cgPSBzY2FuX3dpbmRvdzsKLQotICAgIGNiLlJ1bihCVE1fU1VDQ0VTUyk7Ci0gIH0gZWxzZSB7Ci0gICAgY2IuUnVuKEJUTV9JTExFR0FMX1ZBTFVFKTsKLSAgICBMT0dfV0FSTigiSWxsZWdhbCBwYXJhbXM6IHNjYW5faW50ZXJ2YWwgPSAlZCBzY2FuX3dpbmRvdyA9ICVkIiwKLSAgICAgICAgICAgICBzY2FuX2ludGVydmFsLCBzY2FuX3dpbmRvdyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9fQkxFUmVhZERpc2NvdmVyYWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgY3VycmVudCBMRQotICogICAgICAgICAgICAgICAgICBkaXNjb3ZlcmFiaWxpdHkgbW9kZSBvZiB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0JMRV9OT05fRElTQ09WRVJBQkxFICxCVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfR0VOUkFMX0RJU0NPVkVSQUJMRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBCVE1fQmxlUmVhZERpc2NvdmVyYWJpbGl0eSgpIHsKLSAgQlRNX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcmV0dXJuIChidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmRpc2NvdmVyYWJsZV9tb2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9fQkxFUmVhZENvbm5lY3RhYmlsaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBjdXJyZW50IExFCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3RhYmlsaXR5IG1vZGUgb2YgdGhlIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9CTEVfTk9OX0NPTk5FQ1RBQkxFIG9yIEJUTV9CTEVfQ09OTkVDVEFCTEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgQlRNX0JsZVJlYWRDb25uZWN0YWJpbGl0eSgpIHsKLSAgQlRNX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcmV0dXJuIChidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmNvbm5lY3RhYmxlX21vZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zZWxlY3RfYWR2X2ludGVydmFsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZWxlY3QgYWR2IGludGVydmFsIGJhc2VkIG9uIGRldmljZSBtb2RlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfc2VsZWN0X2Fkdl9pbnRlcnZhbCh1aW50OF90IGV2dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2Fkdl9pbnRfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2Fkdl9pbnRfbWF4KSB7Ci0gIHN3aXRjaCAoZXZ0X3R5cGUpIHsKLSAgICBjYXNlIEJUTV9CTEVfQ09OTkVDVF9FVlQ6Ci0gICAgY2FzZSBCVE1fQkxFX0NPTk5FQ1RfTE9fRFVUWV9ESVJfRVZUOgotICAgICAgKnBfYWR2X2ludF9taW4gPSAqcF9hZHZfaW50X21heCA9IEJUTV9CTEVfR0FQX0FEVl9GQVNUX0lOVF8xOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9CTEVfTk9OX0NPTk5FQ1RfRVZUOgotICAgIGNhc2UgQlRNX0JMRV9ESVNDT1ZFUl9FVlQ6Ci0gICAgICAqcF9hZHZfaW50X21pbiA9ICpwX2Fkdl9pbnRfbWF4ID0gQlRNX0JMRV9HQVBfQURWX0ZBU1RfSU5UXzI7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogY29ubmVjdGFibGUgZGlyZWN0ZWQgZXZlbnQgKi8KLSAgICBjYXNlIEJUTV9CTEVfQ09OTkVDVF9ESVJfRVZUOgotICAgICAgKnBfYWR2X2ludF9taW4gPSBCVE1fQkxFX0dBUF9BRFZfRElSX01JTl9JTlQ7Ci0gICAgICAqcF9hZHZfaW50X21heCA9IEJUTV9CTEVfR0FQX0FEVl9ESVJfTUFYX0lOVDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpwX2Fkdl9pbnRfbWluID0gKnBfYWR2X2ludF9tYXggPSBCVE1fQkxFX0dBUF9BRFZfU0xPV19JTlQ7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV91cGRhdGVfZG10X2ZsYWdfYml0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT2J0YWluIHVwZGF0ZWQgYWR2IGZsYWcgdmFsdWUgYmFzZWQgb24gY29ubmVjdCBhbmQKLSAqICAgICAgICAgICAgICAgICAgZGlzY292ZXJhYmlsaXR5IG1vZGUuIEFsc28sIHNldHVwIERNVCBzdXBwb3J0IHZhbHVlIGluIHRoZQotICogICAgICAgICAgICAgICAgICBmbGFnIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgc3VwcG9ydHMgYm90aCBMRSBhbmQKLSAqICAgICAgICAgICAgICAgICAgQlIvRURSLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgZmxhZ192YWx1ZSAoSW5wdXQgLyBPdXRwdXQpIC0gZmxhZyB2YWx1ZQotICogICAgICAgICAgICAgICAgICBjb25uZWN0X21vZGUgKElucHV0KSAtIENvbm5lY3QgbW9kZSB2YWx1ZQotICogICAgICAgICAgICAgICAgICBkaXNjX21vZGUgKElucHV0KSAtIGRpc2NvdmVyYWJpbGl0eSBtb2RlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV91cGRhdGVfZG10X2ZsYWdfYml0cyh1aW50OF90KiBhZHZfZmxhZ192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBjb25uZWN0X21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgZGlzY19tb2RlKSB7Ci0gIC8qIEJSL0VEUiBub24tZGlzY292ZXJhYmxlICwgbm9uLWNvbm5lY3RhYmxlICovCi0gIGlmICgoZGlzY19tb2RlICYgQlRNX0RJU0NPVkVSQUJMRV9NQVNLKSA9PSAwICYmCi0gICAgICAoY29ubmVjdF9tb2RlICYgQlRNX0NPTk5FQ1RBQkxFX01BU0spID09IDApCi0gICAgKmFkdl9mbGFnX3ZhbHVlIHw9IEJUTV9CTEVfQlJFRFJfTk9UX1NQVDsKLSAgZWxzZQotICAgICphZHZfZmxhZ192YWx1ZSAmPSB+QlRNX0JMRV9CUkVEUl9OT1RfU1BUOwotCi0gIC8qIGlmIGxvY2FsIGNvbnRyb2xsZXIgc3VwcG9ydCwgbWFyayBib3RoIGNvbnRyb2xsZXIgYW5kIGhvc3Qgc3VwcG9ydCBpbiBmbGFnCi0gICAqLwotICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NpbXVsdGFuZW91c19sZV9icmVkcigpKQotICAgICphZHZfZmxhZ192YWx1ZSB8PSAoQlRNX0JMRV9ETVRfQ09OVFJPTExFUl9TUFQgfCBCVE1fQkxFX0RNVF9IT1NUX1NQVCk7Ci0gIGVsc2UKLSAgICAqYWR2X2ZsYWdfdmFsdWUgJj0gfihCVE1fQkxFX0RNVF9DT05UUk9MTEVSX1NQVCB8IEJUTV9CTEVfRE1UX0hPU1RfU1BUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc2V0X2Fkdl9mbGFnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgYWR2IGZsYWcgaW4gYWR2IGRhdGEuCi0gKgotICogUGFyYW1ldGVyczogICAgICBjb25uZWN0X21vZGUgKElucHV0KS0gQ29ubmVjdCBtb2RlIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgIGRpc2NfbW9kZSAoSW5wdXQpIC0gZGlzY292ZXJhYmlsaXR5IG1vZGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYmxlX3NldF9hZHZfZmxhZyh1aW50MTZfdCBjb25uZWN0X21vZGUsIHVpbnQxNl90IGRpc2NfbW9kZSkgewotICB1aW50OF90IGZsYWcgPSAwLCBvbGRfZmxhZyA9IDA7Ci0gIHRCVE1fQkxFX0xPQ0FMX0FEVl9EQVRBKiBwX2Fkdl9kYXRhID0gJmJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXIuYWR2X2RhdGE7Ci0KLSAgaWYgKHBfYWR2X2RhdGEtPnBfZmxhZ3MgIT0gTlVMTCkgZmxhZyA9IG9sZF9mbGFnID0gKihwX2Fkdl9kYXRhLT5wX2ZsYWdzKTsKLQotICBidG1fYmxlX3VwZGF0ZV9kbXRfZmxhZ19iaXRzKCZmbGFnLCBjb25uZWN0X21vZGUsIGRpc2NfbW9kZSk7Ci0KLSAgTE9HX0lORk8oImRpc2NfbW9kZSAlMDR4IiwgZGlzY19tb2RlKTsKLSAgLyogdXBkYXRlIGRpc2NvdmVyYWJsZSBmbGFnICovCi0gIGlmIChkaXNjX21vZGUgJiBCVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFKSB7Ci0gICAgZmxhZyAmPSB+QlRNX0JMRV9HRU5fRElTQ19GTEFHOwotICAgIGZsYWcgfD0gQlRNX0JMRV9MSU1JVF9ESVNDX0ZMQUc7Ci0gIH0gZWxzZSBpZiAoZGlzY19tb2RlICYgQlRNX0JMRV9HRU5FUkFMX0RJU0NPVkVSQUJMRSkgewotICAgIGZsYWcgfD0gQlRNX0JMRV9HRU5fRElTQ19GTEFHOwotICAgIGZsYWcgJj0gfkJUTV9CTEVfTElNSVRfRElTQ19GTEFHOwotICB9IGVsc2UgLyogcmVtb3ZlIGFsbCBkaXNjb3ZlcmFibGUgZmxhZ3MgKi8KLSAgewotICAgIGZsYWcgJj0gfihCVE1fQkxFX0xJTUlUX0RJU0NfRkxBRyB8IEJUTV9CTEVfR0VOX0RJU0NfRkxBRyk7Ci0gIH0KLQotICBpZiAoZmxhZyAhPSBvbGRfZmxhZykgewotICAgIGJ0bV9ibGVfdXBkYXRlX2Fkdl9mbGFnKGZsYWcpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zZXRfZGlzY292ZXJhYmlsaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgQkxFIGRpc2NvdmVyYWJsZSBtb2RlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgY29tYmluZWRfbW9kZTogZGlzY292ZXJhYmlsaXR5IG1vZGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpcyBzdGF0dXMgc2V0IHN1Y2Nlc3NmdWxseTsgb3RoZXJ3aXNlIGZhaWx1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfc2V0X2Rpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCBjb21iaW5lZF9tb2RlKSB7Ci0gIHRCVE1fTEVfUkFORE9NX0NCKiBwX2FkZHJfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2IuYWRkcl9tZ250X2NiOwotICB0QlRNX0JMRV9JTlFfQ0IqIHBfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3ZhcjsKLSAgdWludDE2X3QgbW9kZSA9IChjb21iaW5lZF9tb2RlICYgQlRNX0JMRV9ESVNDT1ZFUkFCTEVfTUFTSyk7Ci0gIHVpbnQ4X3QgbmV3X21vZGUgPSBCVE1fQkxFX0FEVl9FTkFCTEU7Ci0gIHVpbnQ4X3QgZXZ0X3R5cGU7Ci0gIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9TVUNDRVNTOwotICBSYXdBZGRyZXNzIGFkZHJlc3MgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIHRCTEVfQUREUl9UWVBFIGluaXRfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDLAotICAgICAgICAgICAgICAgICBvd25fYWRkcl90eXBlID0gcF9hZGRyX2NiLT5vd25fYWRkcl90eXBlOwotICB1aW50MTZfdCBhZHZfaW50X21pbiwgYWR2X2ludF9tYXg7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCIlcyBtb2RlPTB4JTB4IGNvbWJpbmVkX21vZGU9MHgleCIsIF9fZnVuY19fLCBtb2RlLAotICAgICAgICAgICAgICAgICAgY29tYmluZWRfbW9kZSk7Ci0KLSAgLyoqKiBDaGVjayBtb2RlIHBhcmFtZXRlciAqKiovCi0gIGlmIChtb2RlID4gQlRNX0JMRV9NQVhfRElTQ09WRVJBQkxFKSByZXR1cm4gKEJUTV9JTExFR0FMX1ZBTFVFKTsKLQotICBwX2NiLT5kaXNjb3ZlcmFibGVfbW9kZSA9IG1vZGU7Ci0KLSAgZXZ0X3R5cGUgPQotICAgICAgYnRtX3NldF9jb25uX21vZGVfYWR2X2luaXRfYWRkcihhZGRyZXNzLCAmaW5pdF9hZGRyX3R5cGUsICZvd25fYWRkcl90eXBlKTsKLQotICBpZiAocF9jYi0+Y29ubmVjdGFibGVfbW9kZSA9PSBCVE1fQkxFX05PTl9DT05ORUNUQUJMRSAmJgotICAgICAgbW9kZSA9PSBCVE1fQkxFX05PTl9ESVNDT1ZFUkFCTEUpCi0gICAgbmV3X21vZGUgPSBCVE1fQkxFX0FEVl9ESVNBQkxFOwotCi0gIGJ0bV9ibGVfc2VsZWN0X2Fkdl9pbnRlcnZhbChldnRfdHlwZSwgJmFkdl9pbnRfbWluLCAmYWR2X2ludF9tYXgpOwotCi0gIGFsYXJtX2NhbmNlbChwX2NiLT5mYXN0X2Fkdl90aW1lcik7Ci0KLSAgLyogdXBkYXRlIGFkdiBwYXJhbXMgaWYgc3RhcnQgYWR2ZXJ0aXNpbmcgKi8KLSAgQlRNX1RSQUNFX0VWRU5UKCJldnRfdHlwZT0weCV4IHAtY2ItPmV2dF90eXBlPTB4JXggIiwgZXZ0X3R5cGUsCi0gICAgICAgICAgICAgICAgICBwX2NiLT5ldnRfdHlwZSk7Ci0KLSAgaWYgKG5ld19tb2RlID09IEJUTV9CTEVfQURWX0VOQUJMRSkgewotICAgIGJ0bV9ibGVfc2V0X2Fkdl9mbGFnKGJ0bV9jYi5idG1faW5xX3ZhcnMuY29ubmVjdGFibGVfbW9kZSwgY29tYmluZWRfbW9kZSk7Ci0KLSAgICBpZiAoZXZ0X3R5cGUgIT0gcF9jYi0+ZXZ0X3R5cGUgfHwgcF9jYi0+YWR2X2FkZHJfdHlwZSAhPSBvd25fYWRkcl90eXBlIHx8Ci0gICAgICAgICFwX2NiLT5mYXN0X2Fkdl9vbikgewotICAgICAgYnRtX2JsZV9zdG9wX2FkdigpOwotCi0gICAgICAvKiB1cGRhdGUgYWR2IHBhcmFtcyAqLwotICAgICAgYnRzbmRfaGNpY19ibGVfd3JpdGVfYWR2X3BhcmFtcyhhZHZfaW50X21pbiwgYWR2X2ludF9tYXgsIGV2dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25fYWRkcl90eXBlLCBpbml0X2FkZHJfdHlwZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+YWR2X2NobmxfbWFwLCBwX2NiLT5hZnApOwotICAgICAgcF9jYi0+ZXZ0X3R5cGUgPSBldnRfdHlwZTsKLSAgICAgIHBfY2ItPmFkdl9hZGRyX3R5cGUgPSBvd25fYWRkcl90eXBlOwotICAgIH0KLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gQlRNX1NVQ0NFU1MgJiYgcF9jYi0+YWR2X21vZGUgIT0gbmV3X21vZGUpIHsKLSAgICBpZiAobmV3X21vZGUgPT0gQlRNX0JMRV9BRFZfRU5BQkxFKQotICAgICAgc3RhdHVzID0gYnRtX2JsZV9zdGFydF9hZHYoKTsKLSAgICBlbHNlCi0gICAgICBzdGF0dXMgPSBidG1fYmxlX3N0b3BfYWR2KCk7Ci0gIH0KLQotICBpZiAocF9jYi0+YWR2X21vZGUgPT0gQlRNX0JMRV9BRFZfRU5BQkxFKSB7Ci0gICAgcF9jYi0+ZmFzdF9hZHZfb24gPSB0cnVlOwotICAgIC8qIHN0YXJ0IGluaXRpYWwgR0FQIG1vZGUgYWR2IHRpbWVyICovCi0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2ItPmZhc3RfYWR2X3RpbWVyLCBCVE1fQkxFX0dBUF9GQVNUX0FEVl9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBidG1fYmxlX2Zhc3RfYWR2X3RpbWVyX3RpbWVvdXQsIE5VTEwpOwotICB9IGVsc2UgewotICAgIGJ0bV9ibGVfZGlzYWJsZV9yZXNvbHZpbmdfbGlzdChCVE1fQkxFX1JMX0FEViwgdHJ1ZSk7Ci0gIH0KLQotICAvKiBzZXQgdXAgc3RvcCBhZHZlcnRpc2luZyB0aW1lciAqLwotICBpZiAoc3RhdHVzID09IEJUTV9TVUNDRVNTICYmIG1vZGUgPT0gQlRNX0JMRV9MSU1JVEVEX0RJU0NPVkVSQUJMRSkgewotICAgIEJUTV9UUkFDRV9FVkVOVCgic3RhcnQgdGltZXIgZm9yIGxpbWl0ZWQgZGlzYyBtb2RlIGR1cmF0aW9uPSVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9HQVBfTElNX1RJTUVPVVRfTVMpOwotICAgIC8qIHN0YXJ0IFRnYXAobGltX3RpbWVvdXQpICovCi0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2ItPmlucXVpcnlfdGltZXIsIEJUTV9CTEVfR0FQX0xJTV9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBidG1fYmxlX2lucXVpcnlfdGltZXJfZ2FwX2xpbWl0ZWRfZGlzY292ZXJ5X3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3NldF9jb25uZWN0YWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IEJMRSBjb25uZWN0YWJpbGl0eSBtb2RlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgY29tYmluZWRfbW9kZTogY29ubmVjdGFiaWxpdHkgbW9kZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlzIHN0YXR1cyBzZXQgc3VjY2Vzc2Z1bGx5OyBvdGhlcndpc2UgZmFpbHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfY29ubmVjdGFiaWxpdHkodWludDE2X3QgY29tYmluZWRfbW9kZSkgewotICB0QlRNX0xFX1JBTkRPTV9DQiogcF9hZGRyX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiLmFkZHJfbWdudF9jYjsKLSAgdEJUTV9CTEVfSU5RX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXI7Ci0gIHVpbnQxNl90IG1vZGUgPSAoY29tYmluZWRfbW9kZSAmIEJUTV9CTEVfQ09OTkVDVEFCTEVfTUFTSyk7Ci0gIHVpbnQ4X3QgbmV3X21vZGUgPSBCVE1fQkxFX0FEVl9FTkFCTEU7Ci0gIHVpbnQ4X3QgZXZ0X3R5cGU7Ci0gIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9TVUNDRVNTOwotICBSYXdBZGRyZXNzIGFkZHJlc3MgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIHRCTEVfQUREUl9UWVBFIHBlZXJfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDLAotICAgICAgICAgICAgICAgICBvd25fYWRkcl90eXBlID0gcF9hZGRyX2NiLT5vd25fYWRkcl90eXBlOwotICB1aW50MTZfdCBhZHZfaW50X21pbiwgYWR2X2ludF9tYXg7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCIlcyBtb2RlPTB4JTB4IGNvbWJpbmVkX21vZGU9MHgleCIsIF9fZnVuY19fLCBtb2RlLAotICAgICAgICAgICAgICAgICAgY29tYmluZWRfbW9kZSk7Ci0KLSAgLyoqKiBDaGVjayBtb2RlIHBhcmFtZXRlciAqKiovCi0gIGlmIChtb2RlID4gQlRNX0JMRV9NQVhfQ09OTkVDVEFCTEUpIHJldHVybiAoQlRNX0lMTEVHQUxfVkFMVUUpOwotCi0gIHBfY2ItPmNvbm5lY3RhYmxlX21vZGUgPSBtb2RlOwotCi0gIGV2dF90eXBlID0KLSAgICAgIGJ0bV9zZXRfY29ubl9tb2RlX2Fkdl9pbml0X2FkZHIoYWRkcmVzcywgJnBlZXJfYWRkcl90eXBlLCAmb3duX2FkZHJfdHlwZSk7Ci0KLSAgaWYgKG1vZGUgPT0gQlRNX0JMRV9OT05fQ09OTkVDVEFCTEUgJiYKLSAgICAgIHBfY2ItPmRpc2NvdmVyYWJsZV9tb2RlID09IEJUTV9CTEVfTk9OX0RJU0NPVkVSQUJMRSkKLSAgICBuZXdfbW9kZSA9IEJUTV9CTEVfQURWX0RJU0FCTEU7Ci0KLSAgYnRtX2JsZV9zZWxlY3RfYWR2X2ludGVydmFsKGV2dF90eXBlLCAmYWR2X2ludF9taW4sICZhZHZfaW50X21heCk7Ci0KLSAgYWxhcm1fY2FuY2VsKHBfY2ItPmZhc3RfYWR2X3RpbWVyKTsKLSAgLyogdXBkYXRlIGFkdiBwYXJhbXMgaWYgbmVlZGVkICovCi0gIGlmIChuZXdfbW9kZSA9PSBCVE1fQkxFX0FEVl9FTkFCTEUpIHsKLSAgICBidG1fYmxlX3NldF9hZHZfZmxhZyhjb21iaW5lZF9tb2RlLCBidG1fY2IuYnRtX2lucV92YXJzLmRpc2NvdmVyYWJsZV9tb2RlKTsKLSAgICBpZiAocF9jYi0+ZXZ0X3R5cGUgIT0gZXZ0X3R5cGUgfHwKLSAgICAgICAgcF9jYi0+YWR2X2FkZHJfdHlwZSAhPSBwX2FkZHJfY2ItPm93bl9hZGRyX3R5cGUgfHwgIXBfY2ItPmZhc3RfYWR2X29uKSB7Ci0gICAgICBidG1fYmxlX3N0b3BfYWR2KCk7Ci0KLSAgICAgIGJ0c25kX2hjaWNfYmxlX3dyaXRlX2Fkdl9wYXJhbXMoYWR2X2ludF9taW4sIGFkdl9pbnRfbWF4LCBldnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duX2FkZHJfdHlwZSwgcGVlcl9hZGRyX3R5cGUsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPmFkdl9jaG5sX21hcCwgcF9jYi0+YWZwKTsKLSAgICAgIHBfY2ItPmV2dF90eXBlID0gZXZ0X3R5cGU7Ci0gICAgICBwX2NiLT5hZHZfYWRkcl90eXBlID0gb3duX2FkZHJfdHlwZTsKLSAgICB9Ci0gIH0KLQotICAvKiB1cGRhdGUgYWR2ZXJ0aXNpbmcgbW9kZSAqLwotICBpZiAoc3RhdHVzID09IEJUTV9TVUNDRVNTICYmIG5ld19tb2RlICE9IHBfY2ItPmFkdl9tb2RlKSB7Ci0gICAgaWYgKG5ld19tb2RlID09IEJUTV9CTEVfQURWX0VOQUJMRSkKLSAgICAgIHN0YXR1cyA9IGJ0bV9ibGVfc3RhcnRfYWR2KCk7Ci0gICAgZWxzZQotICAgICAgc3RhdHVzID0gYnRtX2JsZV9zdG9wX2FkdigpOwotICB9Ci0KLSAgaWYgKHBfY2ItPmFkdl9tb2RlID09IEJUTV9CTEVfQURWX0VOQUJMRSkgewotICAgIHBfY2ItPmZhc3RfYWR2X29uID0gdHJ1ZTsKLSAgICAvKiBzdGFydCBpbml0aWFsIEdBUCBtb2RlIGFkdiB0aW1lciAqLwotICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NiLT5mYXN0X2Fkdl90aW1lciwgQlRNX0JMRV9HQVBfRkFTVF9BRFZfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgYnRtX2JsZV9mYXN0X2Fkdl90aW1lcl90aW1lb3V0LCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBidG1fYmxlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QoQlRNX0JMRV9STF9BRFYsIHRydWUpOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV9zZW5kX2hjaV9zY2FuX2VuYWJsZSh1aW50OF90IGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZpbHRlcl9kdXBsaWNhdGVzKSB7Ci0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX2V4dGVuZGVkX2FkdmVydGlzaW5nKCkpIHsKLSAgICBidHNuZF9oY2ljX2JsZV9zZXRfZXh0ZW5kZWRfc2Nhbl9lbmFibGUoZW5hYmxlLCBmaWx0ZXJfZHVwbGljYXRlcywgMHgwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDApOwotICB9IGVsc2UgewotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX2VuYWJsZShlbmFibGUsIGZpbHRlcl9kdXBsaWNhdGVzKTsKLSAgfQotfQotCi12b2lkIGJ0bV9zZW5kX2hjaV9zZXRfc2Nhbl9wYXJhbXModWludDhfdCBzY2FuX3R5cGUsIHVpbnQxNl90IHNjYW5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNjYW5fd2luLCB1aW50OF90IGFkZHJfdHlwZV9vd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX2ZpbHRlcl9wb2xpY3kpIHsKLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmcoKSkgewotICAgIHNjYW5uaW5nX3BoeV9jZmcgcGh5X2NmZzsKLSAgICBwaHlfY2ZnLnNjYW5fdHlwZSA9IHNjYW5fdHlwZTsKLSAgICBwaHlfY2ZnLnNjYW5faW50ID0gc2Nhbl9pbnQ7Ci0gICAgcGh5X2NmZy5zY2FuX3dpbiA9IHNjYW5fd2luOwotCi0gICAgYnRzbmRfaGNpY19ibGVfc2V0X2V4dGVuZGVkX3NjYW5fcGFyYW1zKGFkZHJfdHlwZV9vd24sIHNjYW5fZmlsdGVyX3BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnBoeV9jZmcpOwotICB9IGVsc2UgewotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX3BhcmFtcyhzY2FuX3R5cGUsIHNjYW5faW50LCBzY2FuX3dpbiwgYWRkcl90eXBlX293biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9maWx0ZXJfcG9saWN5KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zdGFydF9pbnF1aXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdGFydCBCTEUgaW5xdWlyeSBwcm9jZWR1cmUuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgcGVyaW9kaWMgaW5xdWlyeSBtb2RlIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIG1vZGUgLSBHRU5FUkFMIG9yIExJTUlURUQgaW5xdWlyeQotICogICAgICAgICAgICAgICAgICBwX2lucV9wYXJhbXMgLSBwb2ludGVyIHRvIHRoZSBCTEUgaW5xdWlyeSBwYXJhbWV0ZXIuCi0gKiAgICAgICAgICAgICAgICAgIHBfcmVzdWx0c19jYiAtIGNhbGxiYWNrIHJldHVybmluZyBwb2ludGVyIHRvIHJlc3VsdHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRCVE1fSU5RX1JFU1VMVFMpCi0gKiAgICAgICAgICAgICAgICAgIHBfY21wbF9jYiAtIGNhbGxiYWNrIGluZGljYXRpbmcgdGhlIGVuZCBvZiBhbiBpbnF1aXJ5Ci0gKgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIGNvdWxkIG5vdCBhbGxvY2F0ZSBhIG1lc3NhZ2UgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIC0gaWYgYW4gaW5xdWlyeSBpcyBhbHJlYWR5IGFjdGl2ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fYmxlX3N0YXJ0X2lucXVpcnkodWludDhfdCBkdXJhdGlvbikgewotICB0QlRNX1NUQVRVUyBzdGF0dXMgPSBCVE1fQ01EX1NUQVJURUQ7Ci0gIHRCVE1fQkxFX0NCKiBwX2JsZV9jYiA9ICZidG1fY2IuYmxlX2N0cl9jYjsKLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9ibGVfc3RhcnRfaW5xdWlyeTogaW5xX2FjdGl2ZSA9IDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9hY3RpdmUpOwotCi0gIC8qIGlmIHNlbGVjdGl2ZSBjb25uZWN0aW9uIGlzIGFjdGl2ZSwgb3IgaW5xdWlyeSBpcyBhbHJlYWR5IGFjdGl2ZSwgcmVqZWN0IGl0Ci0gICAqLwotICBpZiAocF9ibGVfY2ItPmlzX2JsZV9pbnF1aXJ5X2FjdGl2ZSgpKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJMRSBJbnF1aXJ5IGlzIGFjdGl2ZSwgY2FuIG5vdCBzdGFydCBpbnF1aXJ5Iik7Ci0gICAgcmV0dXJuIChCVE1fQlVTWSk7Ci0gIH0KLQotICBpZiAoIXBfYmxlX2NiLT5pc19ibGVfc2Nhbl9hY3RpdmUoKSkgewotICAgIGNhY2hlLkNsZWFyQWxsKCk7Ci0gICAgYnRtX3NlbmRfaGNpX3NldF9zY2FuX3BhcmFtcygKLSAgICAgICAgQlRNX0JMRV9TQ0FOX01PREVfQUNUSSwgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX0lOVCwKLSAgICAgICAgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX1dJTiwKLSAgICAgICAgYnRtX2NiLmJsZV9jdHJfY2IuYWRkcl9tZ250X2NiLm93bl9hZGRyX3R5cGUsIFNQX0FEVl9BTEwpOwotICAgIC8qIGVuYWJsZSBJUksgbGlzdCAqLwotICAgIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0X2Zvcl9wbGF0Zm9ybShCVE1fQkxFX1JMX1NDQU4pOwotICAgIHBfYmxlX2NiLT5pbnFfdmFyLnNjYW5fdHlwZSA9IEJUTV9CTEVfU0NBTl9NT0RFX0FDVEk7Ci0gICAgYnRtX2JsZV9zdGFydF9zY2FuKCk7Ci0gIH0gZWxzZSBpZiAoKHBfYmxlX2NiLT5pbnFfdmFyLnNjYW5faW50ZXJ2YWwgIT0KLSAgICAgICAgICAgICAgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX0lOVCkgfHwKLSAgICAgICAgICAgICAocF9ibGVfY2ItPmlucV92YXIuc2Nhbl93aW5kb3cgIT0gQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX1dJTikpIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoIiVzLCByZXN0YXJ0IExFIHNjYW4gd2l0aCBsb3cgbGF0ZW5jeSBzY2FuIHBhcmFtcyIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBidG1fc2VuZF9oY2lfc2Nhbl9lbmFibGUoQlRNX0JMRV9TQ0FOX0RJU0FCTEUsIEJUTV9CTEVfRFVQTElDQVRFX0VOQUJMRSk7Ci0gICAgYnRtX3NlbmRfaGNpX3NldF9zY2FuX3BhcmFtcygKLSAgICAgICAgQlRNX0JMRV9TQ0FOX01PREVfQUNUSSwgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX0lOVCwKLSAgICAgICAgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX1dJTiwKLSAgICAgICAgYnRtX2NiLmJsZV9jdHJfY2IuYWRkcl9tZ250X2NiLm93bl9hZGRyX3R5cGUsIFNQX0FEVl9BTEwpOwotICAgIGJ0bV9zZW5kX2hjaV9zY2FuX2VuYWJsZShCVE1fQkxFX1NDQU5fRU5BQkxFLCBCVE1fQkxFX0RVUExJQ0FURV9ESVNBQkxFKTsKLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgcF9pbnEtPmlucV9hY3RpdmUgfD0gQlRNX0JMRV9HRU5FUkFMX0lOUVVJUlk7Ci0gICAgcF9ibGVfY2ItPnNldF9ibGVfaW5xdWlyeV9hY3RpdmUoKTsKLQotICAgIEJUTV9UUkFDRV9ERUJVRygiYnRtX2JsZV9zdGFydF9pbnF1aXJ5IGlucV9hY3RpdmUgPSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICBwX2lucS0+aW5xX2FjdGl2ZSk7Ci0KLSAgICBpZiAoZHVyYXRpb24gIT0gMCkgewotICAgICAgLyogc3RhcnQgaW5xdWlyeSB0aW1lciAqLwotICAgICAgdWludDY0X3QgZHVyYXRpb25fbXMgPSBkdXJhdGlvbiAqIDEwMDA7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9ibGVfY2ItPmlucV92YXIuaW5xdWlyeV90aW1lciwgZHVyYXRpb25fbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnRtX2JsZV9pbnF1aXJ5X3RpbWVyX3RpbWVvdXQsIE5VTEwpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3JlYWRfcmVtb3RlX25hbWVfY21wbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBCTEUgcmVtb3RlIG5hbWUgaXMgcmVjZWl2ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9yZWFkX3JlbW90ZV9uYW1lX2NtcGwoYm9vbCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoLCBjaGFyKiBwX25hbWUpIHsKLSAgdEhDSV9TVEFUVVMgaGNpX3N0YXR1cyA9IEhDSV9TVUNDRVNTOwotICBCRF9OQU1FIGJkX25hbWU7Ci0KLSAgbWVtc2V0KGJkX25hbWUsIDAsIChCRF9OQU1FX0xFTiArIDEpKTsKLSAgaWYgKGxlbmd0aCA+IEJEX05BTUVfTEVOKSB7Ci0gICAgbGVuZ3RoID0gQkRfTkFNRV9MRU47Ci0gIH0KLSAgbWVtY3B5KCh1aW50OF90KiliZF9uYW1lLCBwX25hbWUsIGxlbmd0aCk7Ci0KLSAgaWYgKCghc3RhdHVzKSB8fCAobGVuZ3RoID09IDApKSB7Ci0gICAgaGNpX3N0YXR1cyA9IEhDSV9FUlJfSE9TVF9USU1FT1VUOwotICB9Ci0KLSAgYnRtX3Byb2Nlc3NfcmVtb3RlX25hbWUoJmJkYSwgYmRfbmFtZSwgbGVuZ3RoICsgMSwgaGNpX3N0YXR1cyk7Ci0gIGJ0bV9zZWNfcm10X25hbWVfcmVxdWVzdF9jb21wbGV0ZSgmYmRhLCAodWludDhfdCopcF9uYW1lLCBoY2lfc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVhZF9yZW1vdGVfbmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWFkIHJlbW90ZSBMRSBkZXZpY2UgbmFtZSB1c2luZyBHQVRUIHJlYWQKLSAqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfcmVhZF9yZW1vdGVfbmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYikgewotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZSgpKSByZXR1cm4gQlRNX0VSUl9QUk9DRVNTSU5HOwotCi0gIHRJTlFfREJfRU5UKiBwX2kgPSBidG1faW5xX2RiX2ZpbmQocmVtb3RlX2JkYSk7Ci0gIGlmIChwX2kgJiYgIWJsZV9ldnRfdHlwZV9pc19jb25uZWN0YWJsZShwX2ktPmlucV9pbmZvLnJlc3VsdHMuYmxlX2V2dF90eXBlKSkgewotICAgIEJUTV9UUkFDRV9ERUJVRygibmFtZSByZXF1ZXN0IHRvIG5vbi1jb25uZWN0YWJsZSBkZXZpY2UgZmFpbGVkLiIpOwotICAgIHJldHVybiBCVE1fRVJSX1BST0NFU1NJTkc7Ci0gIH0KLQotICAvKiByZWFkIHJlbW90ZSBkZXZpY2UgbmFtZSB1c2luZyBHQVRUIHByb2NlZHVyZSAqLwotICBpZiAocF9pbnEtPnJlbW5hbWVfYWN0aXZlKSByZXR1cm4gQlRNX0JVU1k7Ci0KLSAgaWYgKCFHQVBfQmxlUmVhZFBlZXJEZXZOYW1lKHJlbW90ZV9iZGEsIGJ0bV9ibGVfcmVhZF9yZW1vdGVfbmFtZV9jbXBsKSkKLSAgICByZXR1cm4gQlRNX0JVU1k7Ci0KLSAgcF9pbnEtPnBfcmVtbmFtZV9jbXBsX2NiID0gcF9jYjsKLSAgcF9pbnEtPnJlbW5hbWVfYWN0aXZlID0gdHJ1ZTsKLSAgcF9pbnEtPnJlbW5hbWVfYmRhID0gcmVtb3RlX2JkYTsKLQotICBhbGFybV9zZXRfb25fbWxvb3AocF9pbnEtPnJlbW90ZV9uYW1lX3RpbWVyLCBCVE1fRVhUX0JMRV9STVRfTkFNRV9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgYnRtX2lucV9yZW1vdGVfbmFtZV90aW1lcl90aW1lb3V0LCBOVUxMKTsKLQotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9jYW5jZWxfcmVtb3RlX25hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FuY2VsIHJlYWQgcmVtb3RlIExFIGRldmljZSBuYW1lLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2JsZV9jYW5jZWxfcmVtb3RlX25hbWUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotICBib29sIHN0YXR1czsKLQotICBzdGF0dXMgPSBHQVBfQmxlQ2FuY2VsUmVhZFBlZXJEZXZOYW1lKHJlbW90ZV9iZGEpOwotCi0gIHBfaW5xLT5yZW1uYW1lX2FjdGl2ZSA9IGZhbHNlOwotICBwX2lucS0+cmVtbmFtZV9iZGEgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIGFsYXJtX2NhbmNlbChwX2lucS0+cmVtb3RlX25hbWVfdGltZXIpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3VwZGF0ZV9hZHZfZmxhZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGUgdGhlIGxpbWl0ZWQgZGlzY292ZXJhYmxlIGZsYWcgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFkdiBkYXRhLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfdXBkYXRlX2Fkdl9mbGFnKHVpbnQ4X3QgZmxhZykgewotICB0QlRNX0JMRV9MT0NBTF9BRFZfREFUQSogcF9hZHZfZGF0YSA9ICZidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmFkdl9kYXRhOwotICB1aW50OF90KiBwOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiYnRtX2JsZV91cGRhdGVfYWR2X2ZsYWcgbmV3PTB4JXgiLCBmbGFnKTsKLQotICBpZiAocF9hZHZfZGF0YS0+cF9mbGFncyAhPSBOVUxMKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCJidG1fYmxlX3VwZGF0ZV9hZHZfZmxhZyBvbGQ9MHgleCIsICpwX2Fkdl9kYXRhLT5wX2ZsYWdzKTsKLSAgICAqcF9hZHZfZGF0YS0+cF9mbGFncyA9IGZsYWc7Ci0gIH0gZWxzZSAvKiBubyBGTEFHUyBpbiBBRFYgZGF0YSovCi0gIHsKLSAgICBwID0gKHBfYWR2X2RhdGEtPnBfcGFkID09IE5VTEwpID8gcF9hZHZfZGF0YS0+YWRfZGF0YSA6IHBfYWR2X2RhdGEtPnBfcGFkOwotICAgIC8qIG5lZWQgMyBieXRlcyBzcGFjZSB0byBzdHVmZiBpbiB0aGUgZmxhZ3MsIGlmIG5vdCAqLwotICAgIC8qIGVyYXNlIGFsbCB3cml0dGVuIGRhdGEsIGp1c3QgZm9yIGZsYWdzICovCi0gICAgaWYgKChCVE1fQkxFX0FEX0RBVEFfTEVOIC0gKHAgLSBwX2Fkdl9kYXRhLT5hZF9kYXRhKSkgPCAzKSB7Ci0gICAgICBwID0gcF9hZHZfZGF0YS0+cF9wYWQgPSBwX2Fkdl9kYXRhLT5hZF9kYXRhOwotICAgICAgbWVtc2V0KHBfYWR2X2RhdGEtPmFkX2RhdGEsIDAsIEJUTV9CTEVfQURfREFUQV9MRU4pOwotICAgIH0KLQotICAgICpwKysgPSAyOwotICAgICpwKysgPSBCVE1fQkxFX0FEX1RZUEVfRkxBRzsKLSAgICBwX2Fkdl9kYXRhLT5wX2ZsYWdzID0gcDsKLSAgICAqcCsrID0gZmxhZzsKLSAgICBwX2Fkdl9kYXRhLT5wX3BhZCA9IHA7Ci0gIH0KLQotICBidHNuZF9oY2ljX2JsZV9zZXRfYWR2X2RhdGEoCi0gICAgICAodWludDhfdCkocF9hZHZfZGF0YS0+cF9wYWQgLSBwX2Fkdl9kYXRhLT5hZF9kYXRhKSwgcF9hZHZfZGF0YS0+YWRfZGF0YSk7Ci0gIHBfYWR2X2RhdGEtPmRhdGFfbWFzayB8PSBCVE1fQkxFX0FEX0JJVF9GTEFHUzsKLX0KLQotLyoqCi0gKiBDaGVjayBBRFYgZmxhZyB0byBtYWtlIHN1cmUgZGV2aWNlIGlzIGRpc2NvdmVyYWJsZSBhbmQgbWF0Y2ggdGhlIHNlYXJjaAotICogY29uZGl0aW9uCi0gKi8KLXN0YXRpYyB1aW50OF90IGJ0bV9ibGVfaXNfZGlzY292ZXJhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBhZHZfZGF0YSkgewotICB1aW50OF90IHNjYW5fc3RhdGUgPSBCVE1fQkxFX05PVF9TQ0FOTklORzsKLQotICAvKiBmb3Igb2JzZXJ2ZXIsIGFsd2F5cyAiZGlzY292ZXJhYmxlICovCi0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pc19ibGVfb2JzZXJ2ZV9hY3RpdmUoKSkKLSAgICBzY2FuX3N0YXRlIHw9IEJUTV9CTEVfT0JTX1JFU1VMVDsKLQotICBpZiAoIWFkdl9kYXRhLmVtcHR5KCkpIHsKLSAgICB1aW50OF90IGZsYWcgPSAwOwotICAgIHVpbnQ4X3QgZGF0YV9sZW47Ci0gICAgY29uc3QgdWludDhfdCogcF9mbGFnID0gQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6R2V0RmllbGRCeVR5cGUoCi0gICAgICAgIGFkdl9kYXRhLCBCVE1fQkxFX0FEX1RZUEVfRkxBRywgJmRhdGFfbGVuKTsKLSAgICBpZiAocF9mbGFnICE9IE5VTEwgJiYgZGF0YV9sZW4gIT0gMCkgewotICAgICAgZmxhZyA9ICpwX2ZsYWc7Ci0KLSAgICAgIGlmICgoYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlICYgQlRNX0JMRV9HRU5FUkFMX0lOUVVJUlkpICYmCi0gICAgICAgICAgKGZsYWcgJiAoQlRNX0JMRV9MSU1JVF9ESVNDX0ZMQUcgfCBCVE1fQkxFX0dFTl9ESVNDX0ZMQUcpKSAhPSAwKSB7Ci0gICAgICAgIHNjYW5fc3RhdGUgfD0gQlRNX0JMRV9JTlFfUkVTVUxUOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2Nhbl9zdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgYnRtX2JsZV9hcHBlYXJhbmNlX3RvX2NvZCh1aW50MTZfdCBhcHBlYXJhbmNlLCB1aW50OF90KiBkZXZfY2xhc3MpIHsKLSAgZGV2X2NsYXNzWzBdID0gMDsKLQotICBzd2l0Y2ggKGFwcGVhcmFuY2UpIHsKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX1BIT05FOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9QSE9ORTsKLSAgICAgIGRldl9jbGFzc1syXSA9IEJUTV9DT0RfTUlOT1JfVU5DTEFTU0lGSUVEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19DT01QVVRFUjoKLSAgICAgIGRldl9jbGFzc1sxXSA9IEJUTV9DT0RfTUFKT1JfQ09NUFVURVI7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1VOQ0xBU1NJRklFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfUkVNT1RFOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9QRVJJUEhFUkFMOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9SRU1PVEVfQ09OVFJPTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfVEhFUk1PTUVURVI6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfVEhFUk1PTUVURVJfRUFSOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9IRUFMVEg7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1RIRVJNT01FVEVSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19IRUFSVF9SQVRFOgotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0hFQVJUX1JBVEVfQkVMVDoKLSAgICAgIGRldl9jbGFzc1sxXSA9IEJUTV9DT0RfTUFKT1JfSEVBTFRIOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9IRUFSVF9QVUxTRV9NT05JVE9SOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19CTE9PRF9QUkVTU1VSRToKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9CTE9PRF9QUkVTU1VSRV9BUk06Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfQkxPT0RfUFJFU1NVUkVfV1JJU1Q6Ci0gICAgICBkZXZfY2xhc3NbMV0gPSBCVE1fQ09EX01BSk9SX0hFQUxUSDsKLSAgICAgIGRldl9jbGFzc1syXSA9IEJUTV9DT0RfTUlOT1JfQkxPT0RfTU9OSVRPUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfUFVMU0VfT1hJTUVURVI6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfUFVMU0VfT1hJTUVURVJfRklOR0VSVElQOgotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX1BVTFNFX09YSU1FVEVSX1dSSVNUOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9IRUFMVEg7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1BVTFNFX09YSU1FVEVSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19HTFVDT1NFOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9IRUFMVEg7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX0dMVUNPU0VfTUVURVI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX1dFSUdIVDoKLSAgICAgIGRldl9jbGFzc1sxXSA9IEJUTV9DT0RfTUFKT1JfSEVBTFRIOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9XRUlHSElOR19TQ0FMRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfV0FMS0lORzoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9XQUxLSU5HX0lOX1NIT0U6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfV0FMS0lOR19PTl9TSE9FOgotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX1dBTEtJTkdfT05fSElQOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9IRUFMVEg7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1NURVBfQ09VTlRFUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfV0FUQ0g6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfU1BPUlRTX1dBVENIOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9XRUFSQUJMRTsKLSAgICAgIGRldl9jbGFzc1syXSA9IEJUTV9DT0RfTUlOT1JfV1JJU1RfV0FUQ0g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX0VZRUdMQVNTRVM6Ci0gICAgICBkZXZfY2xhc3NbMV0gPSBCVE1fQ09EX01BSk9SX1dFQVJBQkxFOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9HTEFTU0VTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19ESVNQTEFZOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9JTUFHSU5HOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9ESVNQTEFZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19NRURJQV9QTEFZRVI6Ci0gICAgICBkZXZfY2xhc3NbMV0gPSBCVE1fQ09EX01BSk9SX0FVRElPOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9VTkNMQVNTSUZJRUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9XRUFSQUJMRV9BVURJT19ERVZJQ0VfRUFSQlVEOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9BVURJTzsKLSAgICAgIGRldl9jbGFzc1syXSA9IEJUTV9DT0RfTUlOT1JfV0VBUkFCTEVfSEVBRFNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfQkFSQ09ERV9TQ0FOTkVSOgotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0hJRF9CQVJDT0RFX1NDQU5ORVI6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19ISUQ6Ci0gICAgICBkZXZfY2xhc3NbMV0gPSBCVE1fQ09EX01BSk9SX1BFUklQSEVSQUw7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1VOQ0xBU1NJRklFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0hJRF9LRVlCT0FSRDoKLSAgICAgIGRldl9jbGFzc1sxXSA9IEJUTV9DT0RfTUFKT1JfUEVSSVBIRVJBTDsKLSAgICAgIGRldl9jbGFzc1syXSA9IEJUTV9DT0RfTUlOT1JfS0VZQk9BUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9ISURfTU9VU0U6Ci0gICAgICBkZXZfY2xhc3NbMV0gPSBCVE1fQ09EX01BSk9SX1BFUklQSEVSQUw7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1BPSU5USU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSElEX0pPWVNUSUNLOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9QRVJJUEhFUkFMOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9KT1lTVElDSzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0hJRF9HQU1FUEFEOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9QRVJJUEhFUkFMOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9HQU1FUEFEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSElEX0RJR0lUSVpFUl9UQUJMRVQ6Ci0gICAgICBkZXZfY2xhc3NbMV0gPSBCVE1fQ09EX01BSk9SX1BFUklQSEVSQUw7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX0RJR0lUSVpJTkdfVEFCTEVUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSElEX0NBUkRfUkVBREVSOgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9QRVJJUEhFUkFMOwotICAgICAgZGV2X2NsYXNzWzJdID0gQlRNX0NPRF9NSU5PUl9DQVJEX1JFQURFUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0hJRF9ESUdJVEFMX1BFTjoKLSAgICAgIGRldl9jbGFzc1sxXSA9IEJUTV9DT0RfTUFKT1JfUEVSSVBIRVJBTDsKLSAgICAgIGRldl9jbGFzc1syXSA9IEJUTV9DT0RfTUlOT1JfRElHSVRBTF9QQU47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9VS05PV046Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19DTE9DSzoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX1RBRzoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX0tFWVJJTkc6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19DWUNMSU5HOgotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX0NZQ0xJTkdfQ09NUFVURVI6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfQ1lDTElOR19TUEVFRDoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9DWUNMSU5HX0NBREVOQ0U6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfQ1lDTElOR19QT1dFUjoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9DWUNMSU5HX1NQRUVEX0NBREVOQ0U6Ci0gICAgY2FzZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19PVVRET09SX1NQT1JUUzoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9PVVRET09SX1NQT1JUU19MT0NBVElPTjoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9PVVRET09SX1NQT1JUU19MT0NBVElPTl9BTkRfTkFWOgotICAgIGNhc2UgQlRNX0JMRV9BUFBFQVJBTkNFX09VVERPT1JfU1BPUlRTX0xPQ0FUSU9OX1BPRDoKLSAgICBjYXNlIEJUTV9CTEVfQVBQRUFSQU5DRV9PVVRET09SX1NQT1JUU19MT0NBVElPTl9QT0RfQU5EX05BVjoKLSAgICBkZWZhdWx0OgotICAgICAgZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9VTkNMQVNTSUZJRUQ7Ci0gICAgICBkZXZfY2xhc3NbMl0gPSBCVE1fQ09EX01JTk9SX1VOQ0xBU1NJRklFRDsKLSAgfTsKLX0KLQotLyoqCi0gKiBVcGRhdGUgYWR2IHBhY2tldCBpbmZvcm1hdGlvbiBpbnRvIGlucXVpcnkgcmVzdWx0LgotICovCi12b2lkIGJ0bV9ibGVfdXBkYXRlX2lucV9yZXN1bHQodElOUV9EQl9FTlQqIHBfaSwgdWludDhfdCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBldnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByaW1hcnlfcGh5LCB1aW50OF90IHNlY29uZGFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsIGludDhfdCB0eF9wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnNzaSwgdWludDE2X3QgcGVyaW9kaWNfYWR2X2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25zdCYgZGF0YSkgewotICB0QlRNX0lOUV9SRVNVTFRTKiBwX2N1ciA9ICZwX2ktPmlucV9pbmZvLnJlc3VsdHM7Ci0gIHVpbnQ4X3QgbGVuOwotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotCi0gIC8qIFNhdmUgdGhlIGluZm8gKi8KLSAgcF9jdXItPmlucV9yZXN1bHRfdHlwZSB8PSBCVE1fSU5RX1JFU1VMVF9CTEU7Ci0gIHBfY3VyLT5ibGVfYWRkcl90eXBlID0gc3RhdGljX2Nhc3Q8dEJMRV9BRERSX1RZUEU+KGFkZHJfdHlwZSk7Ci0gIHBfY3VyLT5yc3NpID0gcnNzaTsKLSAgcF9jdXItPmJsZV9wcmltYXJ5X3BoeSA9IHByaW1hcnlfcGh5OwotICBwX2N1ci0+YmxlX3NlY29uZGFyeV9waHkgPSBzZWNvbmRhcnlfcGh5OwotICBwX2N1ci0+YmxlX2FkdmVydGlzaW5nX3NpZCA9IGFkdmVydGlzaW5nX3NpZDsKLSAgcF9jdXItPmJsZV90eF9wb3dlciA9IHR4X3Bvd2VyOwotICBwX2N1ci0+YmxlX3BlcmlvZGljX2Fkdl9pbnQgPSBwZXJpb2RpY19hZHZfaW50OwotCi0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLnNjYW5fdHlwZSA9PSBCVE1fQkxFX1NDQU5fTU9ERV9BQ1RJICYmCi0gICAgICBibGVfZXZ0X3R5cGVfaXNfc2Nhbm5hYmxlKGV2dF90eXBlKSAmJgotICAgICAgIWJsZV9ldnRfdHlwZV9pc19zY2FuX3Jlc3AoZXZ0X3R5cGUpKSB7Ci0gICAgcF9pLT5zY2FuX3JzcCA9IGZhbHNlOwotICB9IGVsc2UKLSAgICBwX2ktPnNjYW5fcnNwID0gdHJ1ZTsKLQotICBpZiAocF9pLT5pbnFfY291bnQgIT0gcF9pbnEtPmlucV9jb3VudGVyKQotICAgIHBfY3VyLT5kZXZpY2VfdHlwZSA9IEJUX0RFVklDRV9UWVBFX0JMRTsKLSAgZWxzZQotICAgIHBfY3VyLT5kZXZpY2VfdHlwZSB8PSBCVF9ERVZJQ0VfVFlQRV9CTEU7Ci0KLSAgaWYgKGV2dF90eXBlICE9IEJUTV9CTEVfU0NBTl9SU1BfRVZUKSBwX2N1ci0+YmxlX2V2dF90eXBlID0gZXZ0X3R5cGU7Ci0KLSAgcF9pLT5pbnFfY291bnQgPSBwX2lucS0+aW5xX2NvdW50ZXI7IC8qIE1hcmsgZW50cnkgZm9yIGN1cnJlbnQgaW5xdWlyeSAqLwotCi0gIGJvb2wgaGFzX2FkdmVydGlzaW5nX2ZsYWdzID0gZmFsc2U7Ci0gIGlmICghZGF0YS5lbXB0eSgpKSB7Ci0gICAgY29uc3QgdWludDhfdCogcF9mbGFnID0KLSAgICAgICAgQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6R2V0RmllbGRCeVR5cGUoZGF0YSwgQlRNX0JMRV9BRF9UWVBFX0ZMQUcsICZsZW4pOwotICAgIGlmIChwX2ZsYWcgIT0gTlVMTCAmJiBsZW4gIT0gMCkgewotICAgICAgaGFzX2FkdmVydGlzaW5nX2ZsYWdzID0gdHJ1ZTsKLSAgICAgIHBfY3VyLT5mbGFnID0gKnBfZmxhZzsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWRhdGEuZW1wdHkoKSkgewotICAgIC8qIENoZWNrIHRvIHNlZSB0aGUgQkxFIGRldmljZSBoYXMgdGhlIEFwcGVhcmFuY2UgVVVJRCBpbiB0aGUgYWR2ZXJ0aXNpbmcKLSAgICAgKiBkYXRhLiAgSWYgaXQgZG9lcwotICAgICAqIHRoZW4gdHJ5IHRvIGNvbnZlcnQgdGhlIGFwcGVhcmFuY2UgdmFsdWUgdG8gYSBjbGFzcyBvZiBkZXZpY2UgdmFsdWUKLSAgICAgKiBCbHVlZHJvaWQgY2FuIHVzZS4KLSAgICAgKiBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRyeWluZyB0byBpbmZlciBpZiBpdCBpcyBhIEhJRCBkZXZpY2UgYmFzZWQgb24gdGhlCi0gICAgICogc2VydmljZSBjbGFzcy4KLSAgICAgKi8KLSAgICBjb25zdCB1aW50OF90KiBwX3V1aWQxNiA9IEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKAotICAgICAgICBkYXRhLCBCVE1fQkxFX0FEX1RZUEVfQVBQRUFSQU5DRSwgJmxlbik7Ci0gICAgaWYgKHBfdXVpZDE2ICYmIGxlbiA9PSAyKSB7Ci0gICAgICBidG1fYmxlX2FwcGVhcmFuY2VfdG9fY29kKCh1aW50MTZfdClwX3V1aWQxNlswXSB8IChwX3V1aWQxNlsxXSA8PCA4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXItPmRldl9jbGFzcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfdXVpZDE2ID0gQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6R2V0RmllbGRCeVR5cGUoCi0gICAgICAgICAgZGF0YSwgQlRNX0JMRV9BRF9UWVBFXzE2U1JWX0NNUEwsICZsZW4pOwotICAgICAgaWYgKHBfdXVpZDE2ICE9IE5VTEwpIHsKLSAgICAgICAgdWludDhfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpICsgMiA8PSBsZW47IGkgPSBpICsgMikgewotICAgICAgICAgIC8qIGlmIHRoaXMgQkxFIGRldmljZSBzdXBwb3J0IEhJRCBvdmVyIExFLCBzZXQgSElEIE1ham9yIGluIGNsYXNzIG9mCi0gICAgICAgICAgICogZGV2aWNlICovCi0gICAgICAgICAgaWYgKChwX3V1aWQxNltpXSB8IChwX3V1aWQxNltpICsgMV0gPDwgOCkpID09IFVVSURfU0VSVkNMQVNTX0xFX0hJRCkgewotICAgICAgICAgICAgcF9jdXItPmRldl9jbGFzc1swXSA9IDA7Ci0gICAgICAgICAgICBwX2N1ci0+ZGV2X2NsYXNzWzFdID0gQlRNX0NPRF9NQUpPUl9QRVJJUEhFUkFMOwotICAgICAgICAgICAgcF9jdXItPmRldl9jbGFzc1syXSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBOb24tY29ubmVjdGFibGUgcGFja2V0cyBtYXkgb21pdCBmbGFncyBlbnRpcmVseSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nCi0gIC8vIHNob3VsZCBiZSBhc3N1bWVkIGFib3V0IHRoZWlyIHZhbHVlcyAoQ1NTdjEwLCAxLjMuMSkuIFRodXMsIGRvIG5vdAotICAvLyBpbnRlcnByZXQgdGhlIGRldmljZSB0eXBlIHVubGVzcyB0aGlzIHBhY2tldCBoYXMgdGhlIGZsYWdzIHNldCBvciBpcwotICAvLyBjb25uZWN0YWJsZS4KLSAgYm9vbCBzaG91bGRfcHJvY2Vzc19mbGFncyA9Ci0gICAgICBoYXNfYWR2ZXJ0aXNpbmdfZmxhZ3MgfHwgYmxlX2V2dF90eXBlX2lzX2Nvbm5lY3RhYmxlKGV2dF90eXBlKTsKLSAgaWYgKHNob3VsZF9wcm9jZXNzX2ZsYWdzICYmIChwX2N1ci0+ZmxhZyAmIEJUTV9CTEVfQlJFRFJfTk9UX1NQVCkgPT0gMCAmJgotICAgICAgIWJsZV9ldnRfdHlwZV9pc19kaXJlY3RlZChldnRfdHlwZSkpIHsKLSAgICBpZiAocF9jdXItPmJsZV9hZGRyX3R5cGUgIT0gQkxFX0FERFJfUkFORE9NKSB7Ci0gICAgICBMT0dfVkVSQk9TRSgiTk9UX0JSX0VEUiBzdXBwb3J0IGJpdCBub3Qgc2V0LCB0cmVhdCBkZXZpY2UgYXMgRFVNTyIpOwotICAgICAgcF9jdXItPmRldmljZV90eXBlIHw9IEJUX0RFVklDRV9UWVBFX0RVTU87Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19WRVJCT1NFKCJSYW5kb20gYWRkcmVzcywgdHJlYXQgZGV2aWNlIGFzIExFIG9ubHkiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX1ZFUkJPU0UoIk5PVF9CUi9FRFIgc3VwcG9ydCBiaXQgc2V0LCB0cmVhdCBkZXZpY2UgYXMgTEUgb25seSIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fY2xlYXJfYWxsX3BlbmRpbmdfbGVfZW50cnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFyIGFsbCBMRSBwZW5kaW5nIGVudHJ5IGluCi0gKiAgICAgICAgICAgICAgICAgIGlucXVpcnkgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2NsZWFyX2FsbF9wZW5kaW5nX2xlX2VudHJ5KHZvaWQpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHRJTlFfREJfRU5UKiBwX2VudCA9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2RiOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUTV9JTlFfREJfU0laRTsgeHgrKywgcF9lbnQrKykgewotICAgIC8qIG1hcmsgYWxsIHBlbmRpbmcgTEUgZW50cnkgYXMgdW51c2VkIGlmIGFuIExFIG9ubHkgZGV2aWNlIGhhcyBzY2FuCi0gICAgICogcmVzcG9uc2Ugb3V0c3RhbmRpbmcgKi8KLSAgICBpZiAoKHBfZW50LT5pbl91c2UpICYmCi0gICAgICAgIChwX2VudC0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSA9PSBCVF9ERVZJQ0VfVFlQRV9CTEUpICYmCi0gICAgICAgICFwX2VudC0+c2Nhbl9yc3ApCi0gICAgICBwX2VudC0+aW5fdXNlID0gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBidG1fYmxlX3Byb2Nlc3NfYWR2X2FkZHIoUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90KiBhZGRyX3R5cGUpIHsKLSAgLyogbWFwIGFkZHJlc3MgdG8gc2VjdXJpdHkgcmVjb3JkICovCi0gIGJvb2wgbWF0Y2ggPSBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvKCZiZGEsIGFkZHJfdHlwZSwgZmFsc2UpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogYmRhPSIgPDwgYmRhOwotICAvKiBhbHdheXMgZG8gUlJBIHJlc29sdXRpb24gb24gaG9zdCAqLwotICBpZiAoIW1hdGNoICYmIEJUTV9CTEVfSVNfUkVTT0xWRV9CREEoYmRhKSkgewotICAgIHRCVE1fU0VDX0RFVl9SRUMqIG1hdGNoX3JlYyA9IGJ0bV9ibGVfcmVzb2x2ZV9yYW5kb21fYWRkcihiZGEpOwotICAgIGlmIChtYXRjaF9yZWMpIHsKLSAgICAgIG1hdGNoX3JlYy0+YmxlLmFjdGl2ZV9hZGRyX3R5cGUgPSB0QlRNX1NFQ19CTEU6OkJUTV9CTEVfQUREUl9SUkE7Ci0gICAgICBtYXRjaF9yZWMtPmJsZS5jdXJfcmFuZF9hZGRyID0gYmRhOwotCi0gICAgICBpZiAoYnRtX2JsZV9pbml0X3BzZXVkb19hZGRyKG1hdGNoX3JlYywgYmRhKSkgewotICAgICAgICBiZGEgPSBtYXRjaF9yZWMtPmJkX2FkZHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBBc3NpZ24gdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gYmUgdGhlIGN1cnJlbnQgcmVwb3J0IGFkZHJlc3MKLSAgICAgICAgYmRhID0gbWF0Y2hfcmVjLT5ibGUucHNldWRvX2FkZHI7Ci0gICAgICAgICphZGRyX3R5cGUgPSBtYXRjaF9yZWMtPmJsZS5ibGVfYWRkcl90eXBlOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZXh0ZW5kZWQgYWR2ZXJ0aXNpbmcgcmVwb3J0IGV2ZW50IGlzIHJlY2VpdmVkIC4KLSAqIEl0IHVwZGF0ZXMgdGhlIGlucXVpcnkgZGF0YWJhc2UuIElmIHRoZSBpbnF1aXJ5IGRhdGFiYXNlIGlzIGZ1bGwsIHRoZSBvbGRlc3QKLSAqIGVudHJ5IGlzIGRpc2NhcmRlZC4KLSAqLwotdm9pZCBidG1fYmxlX3Byb2Nlc3NfZXh0X2Fkdl9wa3QodWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSkgewotICBSYXdBZGRyZXNzIGJkYSwgZGlyZWN0X2FkZHJlc3M7Ci0gIHVpbnQ4X3QqIHAgPSBkYXRhOwotICB1aW50OF90IGFkZHJfdHlwZSwgbnVtX3JlcG9ydHMsIHBrdF9kYXRhX2xlbiwgcHJpbWFyeV9waHksIHNlY29uZGFyeV9waHksCi0gICAgICBhZHZlcnRpc2luZ19zaWQ7Ci0gIGludDhfdCByc3NpLCB0eF9wb3dlcjsKLSAgdWludDE2X3QgZXZlbnRfdHlwZSwgcGVyaW9kaWNfYWR2X2ludCwgZGlyZWN0X2FkZHJlc3NfdHlwZTsKLQotICAvKiBPbmx5IHByb2Nlc3MgdGhlIHJlc3VsdHMgaWYgdGhlIGlucXVpcnkgaXMgc3RpbGwgYWN0aXZlICovCi0gIGlmICghYnRtX2NiLmJsZV9jdHJfY2IuaXNfYmxlX3NjYW5fYWN0aXZlKCkpIHJldHVybjsKLQotICAvKiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgcmVwb3J0cyBpbiB0aGlzIGV2ZW50LiAqLwotICBTVFJFQU1fVE9fVUlOVDgobnVtX3JlcG9ydHMsIHApOwotCi0gIGNvbnN0ZXhwciBpbnQgZXh0ZW5kZWRfcmVwb3J0X2hlYWRlcl9zaXplID0gMjQ7Ci0gIHdoaWxlIChudW1fcmVwb3J0cy0tKSB7Ci0gICAgaWYgKHAgKyBleHRlbmRlZF9yZXBvcnRfaGVhZGVyX3NpemUgPiBkYXRhICsgZGF0YV9sZW4pIHsKLSAgICAgIC8vIFRPRE8oanBhd2xvd3NraSk6IHdlIHNob3VsZCBjcmFzaCB0aGUgc3RhY2sgaGVyZQotICAgICAgQlRNX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJNYWxmb3JtZWQgTEUgRXh0ZW5kZWQgQWR2ZXJ0aXNpbmcgUmVwb3J0IEV2ZW50IGZyb20gY29udHJvbGxlciAtICIKLSAgICAgICAgICAiY2FuJ3QgbG9vcCB0aGUgZGF0YSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEV4dHJhY3QgaW5xdWlyeSByZXN1bHRzICovCi0gICAgU1RSRUFNX1RPX1VJTlQxNihldmVudF90eXBlLCBwKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoYWRkcl90eXBlLCBwKTsKLSAgICBTVFJFQU1fVE9fQkRBRERSKGJkYSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHByaW1hcnlfcGh5LCBwKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoc2Vjb25kYXJ5X3BoeSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGFkdmVydGlzaW5nX3NpZCwgcCk7Ci0gICAgU1RSRUFNX1RPX0lOVDgodHhfcG93ZXIsIHApOwotICAgIFNUUkVBTV9UT19JTlQ4KHJzc2ksIHApOwotICAgIFNUUkVBTV9UT19VSU5UMTYocGVyaW9kaWNfYWR2X2ludCwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGRpcmVjdF9hZGRyZXNzX3R5cGUsIHApOwotICAgIFNUUkVBTV9UT19CREFERFIoZGlyZWN0X2FkZHJlc3MsIHApOwotICAgIFNUUkVBTV9UT19VSU5UOChwa3RfZGF0YV9sZW4sIHApOwotCi0gICAgdWludDhfdCogcGt0X2RhdGEgPSBwOwotICAgIHAgKz0gcGt0X2RhdGFfbGVuOyAvKiBBZHZhbmNlIHRvIHRoZSB0aGUgbmV4dCBwYWNrZXQqLwotICAgIGlmIChwID4gZGF0YSArIGRhdGFfbGVuKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBrdF9kYXRhX2xlbjogIiA8PCArcGt0X2RhdGFfbGVuOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyc3NpID49IDIxICYmIHJzc2kgPD0gMTI2KSB7Ci0gICAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBiYWQgcnNzaSB2YWx1ZSBpbiBhZHZlcnRpc2luZyByZXBvcnQ6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgcnNzaSk7Ci0gICAgfQotCi0gICAgaWYgKGFkZHJfdHlwZSAhPSBCTEVfQUREUl9BTk9OWU1PVVMpIHsKLSAgICAgIGJ0bV9ibGVfcHJvY2Vzc19hZHZfYWRkcihiZGEsICZhZGRyX3R5cGUpOwotICAgIH0KLQotICAgIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0X2NvbnQoZXZlbnRfdHlwZSwgYWRkcl90eXBlLCBiZGEsIHByaW1hcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5X3BoeSwgYWR2ZXJ0aXNpbmdfc2lkLCB0eF9wb3dlciwgcnNzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljX2Fkdl9pbnQsIHBrdF9kYXRhX2xlbiwgcGt0X2RhdGEpOwotICB9Ci19Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhZHZlcnRpc2luZyByZXBvcnQgZXZlbnQgaXMgcmVjZWl2ZWQuIEl0IHVwZGF0ZXMKLSAqIHRoZSBpbnF1aXJ5IGRhdGFiYXNlLiBJZiB0aGUgaW5xdWlyeSBkYXRhYmFzZSBpcyBmdWxsLCB0aGUgb2xkZXN0IGVudHJ5IGlzCi0gKiBkaXNjYXJkZWQuCi0gKi8KLXZvaWQgYnRtX2JsZV9wcm9jZXNzX2Fkdl9wa3QodWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSkgewotICBSYXdBZGRyZXNzIGJkYTsKLSAgdWludDhfdCogcCA9IGRhdGE7Ci0gIHVpbnQ4X3QgbGVnYWN5X2V2dF90eXBlLCBhZGRyX3R5cGUsIG51bV9yZXBvcnRzLCBwa3RfZGF0YV9sZW47Ci0gIGludDhfdCByc3NpOwotCi0gIC8qIE9ubHkgcHJvY2VzcyB0aGUgcmVzdWx0cyBpZiB0aGUgaW5xdWlyeSBpcyBzdGlsbCBhY3RpdmUgKi8KLSAgaWYgKCFidG1fY2IuYmxlX2N0cl9jYi5pc19ibGVfc2Nhbl9hY3RpdmUoKSkgcmV0dXJuOwotCi0gIC8qIEV4dHJhY3QgdGhlIG51bWJlciBvZiByZXBvcnRzIGluIHRoaXMgZXZlbnQuICovCi0gIFNUUkVBTV9UT19VSU5UOChudW1fcmVwb3J0cywgcCk7Ci0KLSAgY29uc3RleHByIGludCByZXBvcnRfaGVhZGVyX3NpemUgPSAxMDsKLSAgd2hpbGUgKG51bV9yZXBvcnRzLS0pIHsKLSAgICBpZiAocCArIHJlcG9ydF9oZWFkZXJfc2l6ZSA+IGRhdGEgKyBkYXRhX2xlbikgewotICAgICAgLy8gVE9ETyhqcGF3bG93c2tpKTogd2Ugc2hvdWxkIGNyYXNoIHRoZSBzdGFjayBoZXJlCi0gICAgICBCVE1fVFJBQ0VfRVJST1IoIk1hbGZvcm1lZCBMRSBBZHZlcnRpc2luZyBSZXBvcnQgRXZlbnQgZnJvbSBjb250cm9sbGVyIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogRXh0cmFjdCBpbnF1aXJ5IHJlc3VsdHMgKi8KLSAgICBTVFJFQU1fVE9fVUlOVDgobGVnYWN5X2V2dF90eXBlLCBwKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoYWRkcl90eXBlLCBwKTsKLSAgICBTVFJFQU1fVE9fQkRBRERSKGJkYSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHBrdF9kYXRhX2xlbiwgcCk7Ci0KLSAgICB1aW50OF90KiBwa3RfZGF0YSA9IHA7Ci0gICAgcCArPSBwa3RfZGF0YV9sZW47IC8qIEFkdmFuY2UgdG8gdGhlIHRoZSByc3NpIGJ5dGUgKi8KLSAgICBpZiAocCA+IGRhdGEgKyBkYXRhX2xlbiAtIHNpemVvZihyc3NpKSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBwa3RfZGF0YV9sZW46ICIgPDwgK3BrdF9kYXRhX2xlbjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTVFJFQU1fVE9fSU5UOChyc3NpLCBwKTsKLQotICAgIGlmIChyc3NpID49IDIxICYmIHJzc2kgPD0gMTI2KSB7Ci0gICAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBiYWQgcnNzaSB2YWx1ZSBpbiBhZHZlcnRpc2luZyByZXBvcnQ6ICIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIHBrdF9kYXRhX2xlbiwgcnNzaSk7Ci0gICAgfQotCi0gICAgYnRtX2JsZV9wcm9jZXNzX2Fkdl9hZGRyKGJkYSwgJmFkZHJfdHlwZSk7Ci0KLSAgICB1aW50MTZfdCBldmVudF90eXBlOwotICAgIGV2ZW50X3R5cGUgPSAxIDw8IEJMRV9FVlRfTEVHQUNZX0JJVDsKLSAgICBpZiAobGVnYWN5X2V2dF90eXBlID09IEJUTV9CTEVfQURWX0lORF9FVlQpIHsKLSAgICAgIGV2ZW50X3R5cGUgfD0KLSAgICAgICAgICAoMSA8PCBCTEVfRVZUX0NPTk5FQ1RBQkxFX0JJVCkgfCAoMSA8PCBCTEVfRVZUX1NDQU5OQUJMRV9CSVQpOwotICAgIH0gZWxzZSBpZiAobGVnYWN5X2V2dF90eXBlID09IEJUTV9CTEVfQURWX0RJUkVDVF9JTkRfRVZUKSB7Ci0gICAgICBldmVudF90eXBlIHw9Ci0gICAgICAgICAgKDEgPDwgQkxFX0VWVF9DT05ORUNUQUJMRV9CSVQpIHwgKDEgPDwgQkxFX0VWVF9ESVJFQ1RFRF9CSVQpOwotICAgIH0gZWxzZSBpZiAobGVnYWN5X2V2dF90eXBlID09IEJUTV9CTEVfQURWX1NDQU5fSU5EX0VWVCkgewotICAgICAgZXZlbnRfdHlwZSB8PSAoMSA8PCBCTEVfRVZUX1NDQU5OQUJMRV9CSVQpOwotICAgIH0gZWxzZSBpZiAobGVnYWN5X2V2dF90eXBlID09IEJUTV9CTEVfQURWX05PTkNPTk5fSU5EX0VWVCkgewotICAgICAgZXZlbnRfdHlwZSA9ICgxIDw8IEJMRV9FVlRfTEVHQUNZX0JJVCk7ICAgICAgICAgICAgICAvLyAweDAwMTA7Ci0gICAgfSBlbHNlIGlmIChsZWdhY3lfZXZ0X3R5cGUgPT0gQlRNX0JMRV9TQ0FOX1JTUF9FVlQpIHsgIC8vIFNDQU5fUlNQOwotICAgICAgLy8gV2UgY2FuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiAiU0NBTl9SU1AgdG8gYW4gQURWX0lORCIsIGFuZCAiU0NBTl9SU1AgdG8KLSAgICAgIC8vIGFuIEFEVl9TQ0FOX0lORCIsIHNvIGFsd2F5cyByZXR1cm4gIlNDQU5fUlNQIHRvIGFuIEFEVl9JTkQiCi0gICAgICBldmVudF90eXBlIHw9ICgxIDw8IEJMRV9FVlRfQ09OTkVDVEFCTEVfQklUKSB8Ci0gICAgICAgICAgICAgICAgICAgICgxIDw8IEJMRV9FVlRfU0NBTk5BQkxFX0JJVCkgfAotICAgICAgICAgICAgICAgICAgICAoMSA8PCBCTEVfRVZUX1NDQU5fUkVTUE9OU0VfQklUKTsKLSAgICB9IGVsc2UgewotICAgICAgQlRNX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJNYWxmb3JtZWQgTEUgQWR2ZXJ0aXNpbmcgUmVwb3J0IEV2ZW50IC0gdW5zdXBwb3J0ZWQgIgotICAgICAgICAgICJsZWdhY3lfZXZlbnRfdHlwZSAweCUwMngiLAotICAgICAgICAgIGxlZ2FjeV9ldnRfdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnRtX2JsZV9wcm9jZXNzX2Fkdl9wa3RfY29udCgKLSAgICAgICAgZXZlbnRfdHlwZSwgYWRkcl90eXBlLCBiZGEsIFBIWV9MRV8xTSwgUEhZX0xFX05PX1BBQ0tFVCwgTk9fQURJX1BSRVNFTlQsCi0gICAgICAgIFRYX1BPV0VSX05PVF9QUkVTRU5ULCByc3NpLCAweDAwIC8qIG5vIHBlcmlvZGljIGFkdiAqLywgcGt0X2RhdGFfbGVuLAotICAgICAgICBwa3RfZGF0YSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciByYW5kb20gYWRkcmVzcyByZXNvbHV0aW9uIGlzIGRvbmUsIGFuZCBwcm9jZWVkCi0gKiB0byBwcm9jZXNzIGFkdiBwYWNrZXQuCi0gKi8KLXZvaWQgYnRtX2JsZV9wcm9jZXNzX2Fkdl9wa3RfY29udCh1aW50MTZfdCBldnRfdHlwZSwgdWludDhfdCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90IHByaW1hcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByc3NpLCB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEpIHsKLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLSAgYm9vbCB1cGRhdGUgPSB0cnVlOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRtcDsKLSAgaWYgKGRhdGFfbGVuICE9IDApIHRtcC5pbnNlcnQodG1wLmJlZ2luKCksIGRhdGEsIGRhdGEgKyBkYXRhX2xlbik7Ci0KLSAgYm9vbCBpc19zY2FubmFibGUgPSBibGVfZXZ0X3R5cGVfaXNfc2Nhbm5hYmxlKGV2dF90eXBlKTsKLSAgYm9vbCBpc19zY2FuX3Jlc3AgPSBibGVfZXZ0X3R5cGVfaXNfc2Nhbl9yZXNwKGV2dF90eXBlKTsKLSAgYm9vbCBpc19sZWdhY3kgPSBibGVfZXZ0X3R5cGVfaXNfbGVnYWN5KGV2dF90eXBlKTsKLQotICAvLyBXZSBtaWdodCByZWNlaXZlIGEgbGVnYWN5IHNjYW4gcmVzcG9uc2Ugd2l0aG91dCByZWNldmluZyBhIEFEVl9JTkQKLSAgLy8gb3IgQURWX1NDQU5fSU5EIGJlZm9yZS4gT25seSBwYXJzaW5nIHRoZSBzY2FuIHJlc3BvbnNlIGRhdGEgd2hpY2gKLSAgLy8gaGFzIG5vIGFkIGZsYWcsIHRoZSBkZXZpY2Ugd2lsbCBiZSBzZXQgdG8gRFVNTyBtb2RlLiBUaGUgY3JlYXRlYm9uZAotICAvLyBwcm9jZWR1cmUgd2lsbCB1c2UgdGhlIHdyb25nIGRldmljZSBtb2RlLgotICAvLyBJbiBzdWNoIGNhc2Ugbm8gbmVjZXNzYXJ5IHRvIHJlcG9ydCBzY2FuIHJlc3BvbnNlCi0gIGlmIChpc19sZWdhY3kgJiYgaXNfc2Nhbl9yZXNwICYmICFjYWNoZS5FeGlzdChhZGRyX3R5cGUsIGJkYSkpIHJldHVybjsKLQotICBib29sIGlzX3N0YXJ0ID0gaXNfbGVnYWN5ICYmIGlzX3NjYW5uYWJsZSAmJiAhaXNfc2Nhbl9yZXNwOwotCi0gIGlmIChpc19sZWdhY3kpIEFkdmVydGlzZURhdGFQYXJzZXI6OlJlbW92ZVRyYWlsaW5nWmVyb3ModG1wKTsKLQotICAvLyBXZSBtaWdodCBoYXZlIHNlbmQgc2NhbiByZXF1ZXN0IHRvIHRoaXMgZGV2aWNlIGJlZm9yZSwgYnV0IGRpZG4ndCBnZXQgdGhlCi0gIC8vIHJlc3BvbnNlLiBJbiBzdWNoIGNhc2UgbWFrZSBzdXJlIGRhdGEgaXMgcHV0IGF0IHN0YXJ0LCBub3QgYXBwZW5kZWQgdG8KLSAgLy8gYWxyZWFkeSBleGlzdGluZyBkYXRhLgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25zdCYgYWR2X2RhdGEgPQotICAgICAgaXNfc3RhcnQgPyBjYWNoZS5TZXQoYWRkcl90eXBlLCBiZGEsIHN0ZDo6bW92ZSh0bXApKQotICAgICAgICAgICAgICAgOiBjYWNoZS5BcHBlbmQoYWRkcl90eXBlLCBiZGEsIHN0ZDo6bW92ZSh0bXApKTsKLQotICBib29sIGRhdGFfY29tcGxldGUgPSAoYmxlX2V2dF90eXBlX2RhdGFfc3RhdHVzKGV2dF90eXBlKSAhPSAweDAxKTsKLQotICBpZiAoIWRhdGFfY29tcGxldGUpIHsKLSAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZSB3aG9sZSBhZHYgZGF0YSB5ZXQsIGRvbid0IHJlcG9ydCB0aGUgZGV2aWNlLgotICAgIERWTE9HKDEpIDw8ICJEYXRhIG5vdCBjb21wbGV0ZSB5ZXQsIHdhaXRpbmcgZm9yIG1vcmUgIiA8PCBiZGE7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBpc19hY3RpdmVfc2NhbiA9Ci0gICAgICBidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLnNjYW5fdHlwZSA9PSBCVE1fQkxFX1NDQU5fTU9ERV9BQ1RJOwotICBpZiAoaXNfYWN0aXZlX3NjYW4gJiYgaXNfc2Nhbm5hYmxlICYmICFpc19zY2FuX3Jlc3ApIHsKLSAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZSBzY2FuIHJlc3BvbnNlIHlldCwgZG9uJ3QgcmVwb3J0IHRoZSBkZXZpY2UuCi0gICAgRFZMT0coMSkgPDwgIiBXYWl0aW5nIGZvciBzY2FuIHJlc3BvbnNlICIgPDwgYmRhOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChhZHZfZGF0YSkpIHsKLSAgICBEVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiRHJvcHBpbmcgYmFkIGFkdmVydGlzZW1lbnQgcGFja2V0OiAiCi0gICAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKGFkdl9kYXRhLmRhdGEoKSwgYWR2X2RhdGEuc2l6ZSgpKTsKLSAgICBjYWNoZS5DbGVhcihhZGRyX3R5cGUsIGJkYSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBpbmNsdWRlX3JzaSA9IGZhbHNlOwotICB1aW50OF90IGxlbjsKLSAgaWYgKEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKGFkdl9kYXRhLCBCVE1fQkxFX0FEX1RZUEVfUlNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpIHsKLSAgICBpbmNsdWRlX3JzaSA9IHRydWU7Ci0gIH0KLQotICB0SU5RX0RCX0VOVCogcF9pID0gYnRtX2lucV9kYl9maW5kKGJkYSk7Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBhZGRyZXNzIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGZvciB0aGlzIGlucXVpcnkgKi8KLSAgaWYgKGJ0bV9pbnFfZmluZF9iZGFkZHIoYmRhKSkgewotICAgIC8qIG5ldmVyIGJlZW4gcmVwb3J0IGFzIGFuIExFIGRldmljZSAqLwotICAgIGlmIChwX2kgJiYgKCEocF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSB8fAotICAgICAgICAgICAgICAgIC8qIHNjYW4gcmVzcG9uc2UgdG8gYmUgdXBkYXRlZCAqLwotICAgICAgICAgICAgICAgICghcF9pLT5zY2FuX3JzcCkgfHwKLSAgICAgICAgICAgICAgICAoIXBfaS0+aW5xX2luZm8ucmVzdWx0cy5pbmNsdWRlX3JzaSAmJiBpbmNsdWRlX3JzaSkpKSB7Ci0gICAgICB1cGRhdGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYnRtX2NiLmJsZV9jdHJfY2IuaXNfYmxlX29ic2VydmVfYWN0aXZlKCkpIHsKLSAgICAgIHVwZGF0ZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBpZiB5ZXMsIHNraXAgaXQgKi8KLSAgICAgIGNhY2hlLkNsZWFyKGFkZHJfdHlwZSwgYmRhKTsKLSAgICAgIHJldHVybjsgLyogYXNzdW1wdGlvbjogb25lIHJlc3VsdCBwZXIgZXZlbnQgKi8KLSAgICB9Ci0gIH0KLSAgLyogSWYgZXhpc3RpbmcgZW50cnksIHVzZSB0aGF0LCBlbHNlIGdldCAgYSBuZXcgb25lIChwb3NzaWJseSByZXVzaW5nIHRoZQotICAgKiBvbGRlc3QpICovCi0gIGlmIChwX2kgPT0gTlVMTCkgewotICAgIHBfaSA9IGJ0bV9pbnFfZGJfbmV3KGJkYSk7Ci0gICAgaWYgKHBfaSAhPSBOVUxMKSB7Ci0gICAgICBwX2lucS0+aW5xX2NtcGxfaW5mby5udW1fcmVzcCsrOwotICAgICAgcF9pLT50aW1lX29mX3Jlc3AgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKTsKLSAgICB9IGVsc2UKLSAgICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChwX2ktPmlucV9jb3VudCAhPQotICAgICAgICAgICAgIHBfaW5xLT5pbnFfY291bnRlcikgLyogZmlyc3QgdGltZSBzZWVuIGluIHRoaXMgaW5xdWlyeSAqLwotICB7Ci0gICAgcF9pLT50aW1lX29mX3Jlc3AgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKTsKLSAgICBwX2lucS0+aW5xX2NtcGxfaW5mby5udW1fcmVzcCsrOwotICB9Ci0KLSAgLyogdXBkYXRlIHRoZSBMRSBkZXZpY2UgaW5mb3JtYXRpb24gaW4gaW5xdWlyeSBkYXRhYmFzZSAqLwotICBidG1fYmxlX3VwZGF0ZV9pbnFfcmVzdWx0KHBfaSwgYWRkcl90eXBlLCBiZGEsIGV2dF90eXBlLCBwcmltYXJ5X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlfcGh5LCBhZHZlcnRpc2luZ19zaWQsIHR4X3Bvd2VyLCByc3NpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljX2Fkdl9pbnQsIGFkdl9kYXRhKTsKLQotICBpZiAoaW5jbHVkZV9yc2kpIHsKLSAgICAoJnBfaS0+aW5xX2luZm8ucmVzdWx0cyktPmluY2x1ZGVfcnNpID0gdHJ1ZTsKLSAgfQotCi0gIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfb3Bwb3J0dW5pc3RpY19vYnNfcmVzdWx0c19jYiA9Ci0gICAgICBidG1fY2IuYmxlX2N0cl9jYi5wX29wcG9ydHVuaXN0aWNfb2JzX3Jlc3VsdHNfY2I7Ci0gIGlmIChwX29wcG9ydHVuaXN0aWNfb2JzX3Jlc3VsdHNfY2IpIHsKLSAgICAocF9vcHBvcnR1bmlzdGljX29ic19yZXN1bHRzX2NiKSgodEJUTV9JTlFfUkVTVUxUUyopJnBfaS0+aW5xX2luZm8ucmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihhZHZfZGF0YS5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kYXRhLnNpemUoKSk7Ci0gIH0KLQotICB1aW50OF90IHJlc3VsdCA9IGJ0bV9ibGVfaXNfZGlzY292ZXJhYmxlKGJkYSwgYWR2X2RhdGEpOwotICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAvLyBEZXZpY2Ugbm8gbG9uZ2VyIGRpc2NvdmVyYWJsZSBzbyBkaXNjYXJkIG91dHN0YW5kaW5nIGFkdmVydGlzaW5nIHBhY2tldAotICAgIGNhY2hlLkNsZWFyKGFkZHJfdHlwZSwgYmRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXVwZGF0ZSkgcmVzdWx0ICY9IH5CVE1fQkxFX0lOUV9SRVNVTFQ7Ci0KLSAgdEJUTV9JTlFfUkVTVUxUU19DQiogcF9pbnFfcmVzdWx0c19jYiA9IHBfaW5xLT5wX2lucV9yZXN1bHRzX2NiOwotICBpZiAocF9pbnFfcmVzdWx0c19jYiAmJiAocmVzdWx0ICYgQlRNX0JMRV9JTlFfUkVTVUxUKSkgewotICAgIChwX2lucV9yZXN1bHRzX2NiKSgodEJUTV9JTlFfUkVTVUxUUyopJnBfaS0+aW5xX2luZm8ucmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oYWR2X2RhdGEuZGF0YSgpKSwgYWR2X2RhdGEuc2l6ZSgpKTsKLSAgfQotCi0gIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfb2JzX3Jlc3VsdHNfY2IgPSBidG1fY2IuYmxlX2N0cl9jYi5wX29ic19yZXN1bHRzX2NiOwotICBpZiAocF9vYnNfcmVzdWx0c19jYiAmJiAocmVzdWx0ICYgQlRNX0JMRV9PQlNfUkVTVUxUKSkgewotICAgIChwX29ic19yZXN1bHRzX2NiKSgodEJUTV9JTlFfUkVTVUxUUyopJnBfaS0+aW5xX2luZm8ucmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oYWR2X2RhdGEuZGF0YSgpKSwgYWR2X2RhdGEuc2l6ZSgpKTsKLSAgfQotCi0gIGNhY2hlLkNsZWFyKGFkZHJfdHlwZSwgYmRhKTsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGNvcHkgZnJvbSBidG1fYmxlX3Byb2Nlc3NfYWR2X3BrdF9jb250IHRvIHByb2Nlc3MgYWR2IHBhY2tldAotICogZnJvbSBnZCBzY2FubmluZyBtb2R1bGUgdG8gaGFuZGxlIGlucXVpcnkgcmVzdWx0IGNhbGxiYWNrLgotICovCi12b2lkIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0X2NvbnRfZm9yX2lucXVpcnkoCi0gICAgdWludDE2X3QgZXZ0X3R5cGUsIHVpbnQ4X3QgYWRkcl90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgdWludDhfdCBwcmltYXJ5X3BoeSwgdWludDhfdCBzZWNvbmRhcnlfcGh5LCB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwKLSAgICBpbnQ4X3QgdHhfcG93ZXIsIGludDhfdCByc3NpLCB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50LAotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEpIHsKLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLSAgYm9vbCB1cGRhdGUgPSB0cnVlOwotCi0gIGJvb2wgaW5jbHVkZV9yc2kgPSBmYWxzZTsKLSAgdWludDhfdCBsZW47Ci0gIGlmIChBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZShhZHZlcnRpc2luZ19kYXRhLCBCVE1fQkxFX0FEX1RZUEVfUlNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpIHsKLSAgICBpbmNsdWRlX3JzaSA9IHRydWU7Ci0gIH0KLQotICB0SU5RX0RCX0VOVCogcF9pID0gYnRtX2lucV9kYl9maW5kKGJkYSk7Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBhZGRyZXNzIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGZvciB0aGlzIGlucXVpcnkgKi8KLSAgaWYgKGJ0bV9pbnFfZmluZF9iZGFkZHIoYmRhKSkgewotICAgIC8qIG5ldmVyIGJlZW4gcmVwb3J0IGFzIGFuIExFIGRldmljZSAqLwotICAgIGlmIChwX2kgJiYgKCEocF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldmljZV90eXBlICYgQlRfREVWSUNFX1RZUEVfQkxFKSB8fAotICAgICAgICAgICAgICAgIC8qIHNjYW4gcmVzcG9uc2UgdG8gYmUgdXBkYXRlZCAqLwotICAgICAgICAgICAgICAgICghcF9pLT5zY2FuX3JzcCkgfHwKLSAgICAgICAgICAgICAgICAoIXBfaS0+aW5xX2luZm8ucmVzdWx0cy5pbmNsdWRlX3JzaSAmJiBpbmNsdWRlX3JzaSkpKSB7Ci0gICAgICB1cGRhdGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYnRtX2NiLmJsZV9jdHJfY2IuaXNfYmxlX29ic2VydmVfYWN0aXZlKCkpIHsKLSAgICAgIHVwZGF0ZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBpZiB5ZXMsIHNraXAgaXQgKi8KLSAgICAgIHJldHVybjsgLyogYXNzdW1wdGlvbjogb25lIHJlc3VsdCBwZXIgZXZlbnQgKi8KLSAgICB9Ci0gIH0KLQotICAvKiBJZiBleGlzdGluZyBlbnRyeSwgdXNlIHRoYXQsIGVsc2UgZ2V0ICBhIG5ldyBvbmUgKHBvc3NpYmx5IHJldXNpbmcgdGhlCi0gICAqIG9sZGVzdCkgKi8KLSAgaWYgKHBfaSA9PSBOVUxMKSB7Ci0gICAgcF9pID0gYnRtX2lucV9kYl9uZXcoYmRhKTsKLSAgICBpZiAocF9pICE9IE5VTEwpIHsKLSAgICAgIHBfaW5xLT5pbnFfY21wbF9pbmZvLm51bV9yZXNwKys7Ci0gICAgICBwX2ktPnRpbWVfb2ZfcmVzcCA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICAgIH0gZWxzZQotICAgICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKHBfaS0+aW5xX2NvdW50ICE9Ci0gICAgICAgICAgICAgcF9pbnEtPmlucV9jb3VudGVyKSAvKiBmaXJzdCB0aW1lIHNlZW4gaW4gdGhpcyBpbnF1aXJ5ICovCi0gIHsKLSAgICBwX2ktPnRpbWVfb2ZfcmVzcCA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpOwotICAgIHBfaW5xLT5pbnFfY21wbF9pbmZvLm51bV9yZXNwKys7Ci0gIH0KLQotICAvKiB1cGRhdGUgdGhlIExFIGRldmljZSBpbmZvcm1hdGlvbiBpbiBpbnF1aXJ5IGRhdGFiYXNlICovCi0gIGJ0bV9ibGVfdXBkYXRlX2lucV9yZXN1bHQocF9pLCBhZGRyX3R5cGUsIGJkYSwgZXZ0X3R5cGUsIHByaW1hcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeV9waHksIGFkdmVydGlzaW5nX3NpZCwgdHhfcG93ZXIsIHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNfYWR2X2ludCwgYWR2ZXJ0aXNpbmdfZGF0YSk7Ci0KLSAgaWYgKGluY2x1ZGVfcnNpKSB7Ci0gICAgKCZwX2ktPmlucV9pbmZvLnJlc3VsdHMpLT5pbmNsdWRlX3JzaSA9IHRydWU7Ci0gIH0KLQotICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX29wcG9ydHVuaXN0aWNfb2JzX3Jlc3VsdHNfY2IgPQotICAgICAgYnRtX2NiLmJsZV9jdHJfY2IucF9vcHBvcnR1bmlzdGljX29ic19yZXN1bHRzX2NiOwotICBpZiAocF9vcHBvcnR1bmlzdGljX29ic19yZXN1bHRzX2NiKSB7Ci0gICAgKHBfb3Bwb3J0dW5pc3RpY19vYnNfcmVzdWx0c19jYikoCi0gICAgICAgICh0QlRNX0lOUV9SRVNVTFRTKikmcF9pLT5pbnFfaW5mby5yZXN1bHRzLAotICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihhZHZlcnRpc2luZ19kYXRhLmRhdGEoKSksIGFkdmVydGlzaW5nX2RhdGEuc2l6ZSgpKTsKLSAgfQotCi0gIHVpbnQ4X3QgcmVzdWx0ID0gYnRtX2JsZV9pc19kaXNjb3ZlcmFibGUoYmRhLCBhZHZlcnRpc2luZ19kYXRhKTsKLSAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCF1cGRhdGUpIHJlc3VsdCAmPSB+QlRNX0JMRV9JTlFfUkVTVUxUOwotCi0gIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfaW5xX3Jlc3VsdHNfY2IgPSBwX2lucS0+cF9pbnFfcmVzdWx0c19jYjsKLSAgaWYgKHBfaW5xX3Jlc3VsdHNfY2IgJiYgKHJlc3VsdCAmIEJUTV9CTEVfSU5RX1JFU1VMVCkpIHsKLSAgICAocF9pbnFfcmVzdWx0c19jYikoKHRCVE1fSU5RX1JFU1VMVFMqKSZwX2ktPmlucV9pbmZvLnJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGFkdmVydGlzaW5nX2RhdGEuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNpbmdfZGF0YS5zaXplKCkpOwotICB9Ci19Ci0KLXZvaWQgYnRtX2JsZV9wcm9jZXNzX3BoeV91cGRhdGVfcGt0KHVpbnQ4X3QgbGVuLCB1aW50OF90KiBkYXRhKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzLCB0eF9waHksIHJ4X3BoeTsKLSAgdWludDE2X3QgaGFuZGxlOwotCi0gIExPR19BU1NFUlQobGVuID09IDUpOwotICB1aW50OF90KiBwID0gZGF0YTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLSAgaGFuZGxlID0gaGFuZGxlICYgMHgwRkZGOwotICBTVFJFQU1fVE9fVUlOVDgodHhfcGh5LCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJ4X3BoeSwgcCk7Ci0KLSAgZ2F0dF9ub3RpZnlfcGh5X3VwZGF0ZWQoc3RhdGljX2Nhc3Q8dEdBVFRfU1RBVFVTPihzdGF0dXMpLCBoYW5kbGUsIHR4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfcGh5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc3RhcnRfc2NhbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgdGhlIEJMRSBzY2FuLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfc3RhcnRfc2NhbigpIHsKLSAgdEJUTV9CTEVfSU5RX0NCKiBwX2lucSA9ICZidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyOwotICAvKiBzdGFydCBzY2FuLCBkaXNhYmxlIGR1cGxpY2F0ZSBmaWx0ZXJpbmcgKi8KLSAgYnRtX3NlbmRfaGNpX3NjYW5fZW5hYmxlKEJUTV9CTEVfU0NBTl9FTkFCTEUsIEJUTV9CTEVfRFVQTElDQVRFX0RJU0FCTEUpOwotCi0gIGlmIChwX2lucS0+c2Nhbl90eXBlID09IEJUTV9CTEVfU0NBTl9NT0RFX0FDVEkpCi0gICAgYnRtX2JsZV9zZXRfdG9wb2xvZ3lfbWFzayhCVE1fQkxFX1NUQVRFX0FDVElWRV9TQ0FOX0JJVCk7Ci0gIGVsc2UKLSAgICBidG1fYmxlX3NldF90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfUEFTU0lWRV9TQ0FOX0JJVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3N0b3Bfc2NhbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RvcCB0aGUgQkxFIHNjYW4uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9zdG9wX3NjYW4odm9pZCkgewotICBCVE1fVFJBQ0VfRVZFTlQoImJ0bV9ibGVfc3RvcF9zY2FuICIpOwotCi0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLnNjYW5fdHlwZSA9PSBCVE1fQkxFX1NDQU5fTU9ERV9BQ1RJKQotICAgIGJ0bV9ibGVfY2xlYXJfdG9wb2xvZ3lfbWFzayhCVE1fQkxFX1NUQVRFX0FDVElWRV9TQ0FOX0JJVCk7Ci0gIGVsc2UKLSAgICBidG1fYmxlX2NsZWFyX3RvcG9sb2d5X21hc2soQlRNX0JMRV9TVEFURV9QQVNTSVZFX1NDQU5fQklUKTsKLQotICAvKiBDbGVhciB0aGUgaW5xdWlyeSBjYWxsYmFjayBpZiBzZXQgKi8KLSAgYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3Zhci5zY2FuX3R5cGUgPSBCVE1fQkxFX1NDQU5fTU9ERV9OT05FOwotCi0gIC8qIHN0b3AgZGlzY292ZXJ5IG5vdyAqLwotICBidG1fc2VuZF9oY2lfc2Nhbl9lbmFibGUoQlRNX0JMRV9TQ0FOX0RJU0FCTEUsIEJUTV9CTEVfRFVQTElDQVRFX0VOQUJMRSk7Ci0KLSAgYnRtX3VwZGF0ZV9zY2FubmVyX2ZpbHRlcl9wb2xpY3koU1BfQURWX0FMTCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zdG9wX2lucXVpcnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0b3AgdGhlIEJMRSBJbnF1aXJ5LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfc3RvcF9pbnF1aXJ5KHZvaWQpIHsKLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLSAgdEJUTV9CTEVfQ0IqIHBfYmxlX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotCi0gIGFsYXJtX2NhbmNlbChwX2JsZV9jYi0+aW5xX3Zhci5pbnF1aXJ5X3RpbWVyKTsKLQotICBwX2JsZV9jYi0+cmVzZXRfYmxlX2lucXVpcnkoKTsKLQotICAvKiBJZiBubyBtb3JlIHNjYW4gYWN0aXZpdHksIHN0b3AgTEUgc2NhbiBub3cgKi8KLSAgaWYgKCFwX2JsZV9jYi0+aXNfYmxlX3NjYW5fYWN0aXZlKCkpIHsKLSAgICBidG1fYmxlX3N0b3Bfc2NhbigpOwotICB9IGVsc2UgaWYgKChwX2JsZV9jYi0+aW5xX3Zhci5zY2FuX2ludGVydmFsICE9Ci0gICAgICAgICAgICAgIEJUTV9CTEVfTE9XX0xBVEVOQ1lfU0NBTl9JTlQpIHx8Ci0gICAgICAgICAgICAgKHBfYmxlX2NiLT5pbnFfdmFyLnNjYW5fd2luZG93ICE9IEJUTV9CTEVfTE9XX0xBVEVOQ1lfU0NBTl9XSU4pKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlczogc2V0dGluZyBkZWZhdWx0IHBhcmFtcyBmb3Igb25nb2luZyBvYnNlcnZlIiwgX19mdW5jX18pOwotICAgIGJ0bV9ibGVfc3RvcF9zY2FuKCk7Ci0gICAgYnRtX2JsZV9zdGFydF9zY2FuKCk7Ci0gIH0KLQotICAvKiBJZiB3ZSBoYXZlIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCBmb3IgaW5xdWlyeSBjb21wbGV0ZSwgY2FsbCBpdCAqLwotICBCVE1fVFJBQ0VfREVCVUcoIkJUTSBJbnEgQ29tcGwgQ2FsbGJhY2s6IHN0YXR1cyAweCUwMngsIG51bSByZXN1bHRzICVkIiwKLSAgICAgICAgICAgICAgICAgIHBfaW5xLT5pbnFfY21wbF9pbmZvLnN0YXR1cywgcF9pbnEtPmlucV9jbXBsX2luZm8ubnVtX3Jlc3ApOwotCi0gIGJ0bV9wcm9jZXNzX2lucV9jb21wbGV0ZSgKLSAgICAgIEhDSV9TVUNDRVNTLCAodWludDhfdCkocF9pbnEtPmlucXBhcm1zLm1vZGUgJiBCVE1fQkxFX0lOUVVJUllfTUFTSykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zdG9wX29ic2VydmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0b3AgdGhlIEJMRSBPYnNlcnZlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fYmxlX3N0b3Bfb2JzZXJ2ZSh2b2lkKSB7Ci0gIHRCVE1fQkxFX0NCKiBwX2JsZV9jYiA9ICZidG1fY2IuYmxlX2N0cl9jYjsKLSAgdEJUTV9DTVBMX0NCKiBwX29ic19jYiA9IHBfYmxlX2NiLT5wX29ic19jbXBsX2NiOwotCi0gIGFsYXJtX2NhbmNlbChwX2JsZV9jYi0+b2JzZXJ2ZXJfdGltZXIpOwotCi0gIHBfYmxlX2NiLT5yZXNldF9ibGVfb2JzZXJ2ZSgpOwotCi0gIHBfYmxlX2NiLT5wX29ic19yZXN1bHRzX2NiID0gTlVMTDsKLSAgcF9ibGVfY2ItPnBfb2JzX2NtcGxfY2IgPSBOVUxMOwotCi0gIGlmICghcF9ibGVfY2ItPmlzX2JsZV9zY2FuX2FjdGl2ZSgpKSB7Ci0gICAgYnRtX2JsZV9zdG9wX3NjYW4oKTsKLSAgfQotCi0gIGlmIChwX29ic19jYikgKHBfb2JzX2NiKSgmYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfY21wbF9pbmZvKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2Fkdl9zdGF0ZXNfb3BlcmF0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgb3IgY2xlYXIgYWR2IHN0YXRlcyBpbiB0b3BvbG9neSBtYXNrCi0gKgotICogUmV0dXJucyAgICAgICAgICBvcGVyYXRpb24gc3RhdHVzLiB0cnVlIGlmIHN1Y2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGJvb2woQlRNX1RPUE9MT0dZX0ZVTkNfUFRSKSh0QlRNX0JMRV9TVEFURV9NQVNLKTsKLXN0YXRpYyBib29sIGJ0bV9ibGVfYWR2X3N0YXRlc19vcGVyYXRpb24oQlRNX1RPUE9MT0dZX0ZVTkNfUFRSKiBwX2hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2X2V2dCkgewotICBib29sIHJ0ID0gZmFsc2U7Ci0KLSAgc3dpdGNoIChhZHZfZXZ0KSB7Ci0gICAgY2FzZSBCVE1fQkxFX0NPTk5FQ1RfRVZUOgotICAgICAgcnQgPSAoKnBfaGFuZGxlcikoQlRNX0JMRV9TVEFURV9DT05OX0FEVl9CSVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9CTEVfTk9OX0NPTk5FQ1RfRVZUOgotICAgICAgcnQgPSAoKnBfaGFuZGxlcikoQlRNX0JMRV9TVEFURV9OT05fQ09OTl9BRFZfQklUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRNX0JMRV9DT05ORUNUX0RJUl9FVlQ6Ci0gICAgICBydCA9ICgqcF9oYW5kbGVyKShCVE1fQkxFX1NUQVRFX0hJX0RVVFlfRElSX0FEVl9CSVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9CTEVfRElTQ09WRVJfRVZUOgotICAgICAgcnQgPSAoKnBfaGFuZGxlcikoQlRNX0JMRV9TVEFURV9TQ0FOX0FEVl9CSVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9CTEVfQ09OTkVDVF9MT19EVVRZX0RJUl9FVlQ6Ci0gICAgICBydCA9ICgqcF9oYW5kbGVyKShCVE1fQkxFX1NUQVRFX0xPX0RVVFlfRElSX0FEVl9CSVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQlRNX1RSQUNFX0VSUk9SKCJ1bmtub3duIGFkdiBldmVudCA6ICVkIiwgYWR2X2V2dCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc3RhcnRfYWR2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBzdGFydCB0aGUgQkxFIGFkdmVydGlzaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fYmxlX3N0YXJ0X2Fkdih2b2lkKSB7Ci0gIHRCVE1fQkxFX0lOUV9DQiogcF9jYiA9ICZidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyOwotCi0gIGlmICghYnRtX2JsZV9hZHZfc3RhdGVzX29wZXJhdGlvbihidG1fYmxlX3RvcG9sb2d5X2NoZWNrLCBwX2NiLT5ldnRfdHlwZSkpCi0gICAgcmV0dXJuIEJUTV9XUk9OR19NT0RFOwotCi0gIC8qIFRvIHJlbGF4IHJlc29sdmluZyBsaXN0LCAgYWx3YXlzIGhhdmUgcmVzb2x2aW5nIGxpc3QgZW5hYmxlZCwgdW5sZXNzCi0gICAqIGRpcmVjdGVkIGFkdiAqLwotICBpZiAocF9jYi0+ZXZ0X3R5cGUgIT0gQlRNX0JMRV9DT05ORUNUX0xPX0RVVFlfRElSX0VWVCAmJgotICAgICAgcF9jYi0+ZXZ0X3R5cGUgIT0gQlRNX0JMRV9DT05ORUNUX0RJUl9FVlQpCi0gICAgLyogZW5hYmxlIHJlc29sdmluZyBsaXN0IGlzIGRlc2lyZWQgKi8KLSAgICBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm0oQlRNX0JMRV9STF9BRFYpOwotCi0gIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZW5hYmxlKEJUTV9CTEVfQURWX0VOQUJMRSk7Ci0gIHBfY2ItPmFkdl9tb2RlID0gQlRNX0JMRV9BRFZfRU5BQkxFOwotICBidG1fYmxlX2Fkdl9zdGF0ZXNfb3BlcmF0aW9uKGJ0bV9ibGVfc2V0X3RvcG9sb2d5X21hc2ssIHBfY2ItPmV2dF90eXBlKTsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9zdG9wX2FkdgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RvcCB0aGUgQkxFIGFkdmVydGlzaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fYmxlX3N0b3BfYWR2KHZvaWQpIHsKLSAgdEJUTV9CTEVfSU5RX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXI7Ci0KLSAgaWYgKHBfY2ItPmFkdl9tb2RlID09IEJUTV9CTEVfQURWX0VOQUJMRSkgewotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZW5hYmxlKEJUTV9CTEVfQURWX0RJU0FCTEUpOwotCi0gICAgcF9jYi0+ZmFzdF9hZHZfb24gPSBmYWxzZTsKLSAgICBwX2NiLT5hZHZfbW9kZSA9IEJUTV9CTEVfQURWX0RJU0FCTEU7Ci0KLSAgICAvKiBjbGVhciBhbGwgYWR2IHN0YXRlcyAqLwotICAgIGJ0bV9ibGVfY2xlYXJfdG9wb2xvZ3lfbWFzayhCVE1fQkxFX1NUQVRFX0FMTF9BRFZfTUFTSyk7Ci0gIH0KLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBidG1fYmxlX2Zhc3RfYWR2X3RpbWVyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICAvKiBmYXN0IGFkdiBpcyBjb21wbGV0ZWQsIGZhbGwgYmFjayB0byBzbG93IGFkdiBpbnRlcnZhbCAqLwotICBidG1fYmxlX3N0YXJ0X3Nsb3dfYWR2KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3N0YXJ0X3Nsb3dfYWR2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXN0YXJ0IGFkdiB3aXRoIHNsb3cgYWR2IGludGVydmFsCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfc3RhcnRfc2xvd19hZHYodm9pZCkgewotICB0QlRNX0JMRV9JTlFfQ0IqIHBfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3ZhcjsKLQotICBpZiAocF9jYi0+YWR2X21vZGUgPT0gQlRNX0JMRV9BRFZfRU5BQkxFKSB7Ci0gICAgdEJUTV9MRV9SQU5ET01fQ0IqIHBfYWRkcl9jYiA9ICZidG1fY2IuYmxlX2N0cl9jYi5hZGRyX21nbnRfY2I7Ci0gICAgUmF3QWRkcmVzcyBhZGRyZXNzID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICAgIHRCTEVfQUREUl9UWVBFIGluaXRfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICAgIHRCTEVfQUREUl9UWVBFIG93bl9hZGRyX3R5cGUgPSBwX2FkZHJfY2ItPm93bl9hZGRyX3R5cGU7Ci0KLSAgICBidG1fYmxlX3N0b3BfYWR2KCk7Ci0KLSAgICBwX2NiLT5ldnRfdHlwZSA9IGJ0bV9zZXRfY29ubl9tb2RlX2Fkdl9pbml0X2FkZHIoYWRkcmVzcywgJmluaXRfYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3duX2FkZHJfdHlwZSk7Ci0KLSAgICAvKiBzbG93IGFkdiBtb2RlIG5ldmVyIGdvZXMgaW50byBkaXJlY3RlZCBhZHYgKi8KLSAgICBidHNuZF9oY2ljX2JsZV93cml0ZV9hZHZfcGFyYW1zKAotICAgICAgICBCVE1fQkxFX0dBUF9BRFZfU0xPV19JTlQsIEJUTV9CTEVfR0FQX0FEVl9TTE9XX0lOVCwgcF9jYi0+ZXZ0X3R5cGUsCi0gICAgICAgIG93bl9hZGRyX3R5cGUsIGluaXRfYWRkcl90eXBlLCBhZGRyZXNzLCBwX2NiLT5hZHZfY2hubF9tYXAsIHBfY2ItPmFmcCk7Ci0KLSAgICBidG1fYmxlX3N0YXJ0X2FkdigpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfaW5xdWlyeV90aW1lcl9nYXBfbGltaXRlZF9kaXNjb3ZlcnlfdGltZW91dCgKLSAgICBVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIC8qIGxpbV90aW1lb3V0IGV4cGlyZWQsIGxpbWl0ZWQgZGlzY292ZXJ5IHNob3VsZCBleGl0IG5vdyAqLwotICBidG1fY2IuYnRtX2lucV92YXJzLmRpc2NvdmVyYWJsZV9tb2RlICY9IH5CVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFOwotICBidG1fYmxlX3NldF9hZHZfZmxhZyhidG1fY2IuYnRtX2lucV92YXJzLmNvbm5lY3RhYmxlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuZGlzY292ZXJhYmxlX21vZGUpOwotfQotCi1zdGF0aWMgdm9pZCBidG1fYmxlX2lucXVpcnlfdGltZXJfdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIGJ0bV9ibGVfc3RvcF9pbnF1aXJ5KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfb2JzZXJ2ZXJfdGltZXJfdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIGJ0bV9ibGVfc3RvcF9vYnNlcnZlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgSENJIGZvciB0aGUgcmVhZCBMRSByZW1vdGUgZmVhdHVyZQotICogICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgY29tcGxldGUgZXZlbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9yZWFkX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZSh1aW50OF90KiBwKSB7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIGhhbmRsZSA9IGhhbmRsZSAmIDB4MEZGRjsgIC8vIG9ubHkgMTIgYml0cyBtZWFuaW5nZnVsCi0KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIGlmIChzdGF0dXMgIT0gSENJX0VSUl9VTlNVUFBPUlRFRF9SRU1fRkVBVFVSRSkgewotICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCByZW1vdGUgZmVhdHVyZXMgc3RhdHVzOiVzIiwKLSAgICAgICAgICAgICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpKS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX1dBUk4oIlJlbW90ZSBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgcmVtb3RlIGZlYXR1cmUiKTsKLSAgfQotCi0gIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBpZiAoIWFjbF9zZXRfcGVlcl9sZV9mZWF0dXJlc19mcm9tX2hhbmRsZShoYW5kbGUsIHApKSB7Ci0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGV4aXN0aW5nIGNvbm5lY3Rpb24gYWZ0ZXIgcmVhZCByZW1vdGUgZmVhdHVyZXMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBidHNuZF9oY2ljX3JtdF92ZXJfcmVxKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3dyaXRlX2Fkdl9lbmFibGVfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgd3JpdGUgYWR2IGVuYWJsZSBjb21tYW5kIGNvbXBsZXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfd3JpdGVfYWR2X2VuYWJsZV9jb21wbGV0ZSh1aW50OF90KiBwKSB7Ci0gIHRCVE1fQkxFX0lOUV9DQiogcF9jYiA9ICZidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyOwotCi0gIC8qIGlmIHdyaXRlIGFkdiBlbmFibGUvZGlzYmFsZSBub3Qgc3VjY2VlZCAqLwotICBpZiAoKnAgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAvKiB0b2dnbGUgYmFjayB0aGUgYWR2IG1vZGUgKi8KLSAgICBwX2NiLT5hZHZfbW9kZSA9ICFwX2NiLT5hZHZfbW9kZTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9kaXJfYWR2X3RvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHdoZW4gZGlyZWN0ZWQgYWR2IHRpbWUgb3V0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9kaXJfYWR2X3RvdXQodm9pZCkgewotICBidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmFkdl9tb2RlID0gQlRNX0JMRV9BRFZfRElTQUJMRTsKLQotICAvKiBtYWtlIGRldmljZSBmYWxsIGJhY2sgaW50byB1bmRpcmVjdGVkIGFkdiBtb2RlIGJ5IGRlZmF1bHQgKi8KLSAgYnRtX2NiLmJsZV9jdHJfY2IuaW5xX3Zhci5kaXJlY3RlZF9jb25uID0gQlRNX0JMRV9BRFZfSU5EX0VWVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc2V0X3RvcG9sb2d5X21hc2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNldCBCTEUgdG9wb2xvZ3kgbWFzawotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpcyByZXF1ZXN0IGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fYmxlX3NldF90b3BvbG9neV9tYXNrKHRCVE1fQkxFX1NUQVRFX01BU0sgcmVxdWVzdF9zdGF0ZV9tYXNrKSB7Ci0gIHJlcXVlc3Rfc3RhdGVfbWFzayAmPSBCVE1fQkxFX1NUQVRFX0FMTF9NQVNLOwotICBidG1fY2IuYmxlX2N0cl9jYi5jdXJfc3RhdGVzIHw9IChyZXF1ZXN0X3N0YXRlX21hc2sgJiBCVE1fQkxFX1NUQVRFX0FMTF9NQVNLKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2NsZWFyX3RvcG9sb2d5X21hc2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsZWFyIEJMRSB0b3BvbG9neSBiaXQgbWFzawotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpcyByZXF1ZXN0IGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fYmxlX2NsZWFyX3RvcG9sb2d5X21hc2sodEJUTV9CTEVfU1RBVEVfTUFTSyByZXF1ZXN0X3N0YXRlX21hc2spIHsKLSAgcmVxdWVzdF9zdGF0ZV9tYXNrICY9IEJUTV9CTEVfU1RBVEVfQUxMX01BU0s7Ci0gIGJ0bV9jYi5ibGVfY3RyX2NiLmN1cl9zdGF0ZXMgJj0gfnJlcXVlc3Rfc3RhdGVfbWFzazsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3VwZGF0ZV9saW5rX3RvcG9sb2d5X21hc2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlIHRoZSBsaW5rIHRvcG9sb2d5IG1hc2sKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX2JsZV91cGRhdGVfbGlua190b3BvbG9neV9tYXNrKHVpbnQ4X3QgbGlua19yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jcmVhc2UpIHsKLSAgYnRtX2JsZV9jbGVhcl90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfQUxMX0NPTk5fTUFTSyk7Ci0KLSAgaWYgKGluY3JlYXNlKQotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLmxpbmtfY291bnRbbGlua19yb2xlXSsrOwotICBlbHNlIGlmIChidG1fY2IuYmxlX2N0cl9jYi5saW5rX2NvdW50W2xpbmtfcm9sZV0gPiAwKQotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLmxpbmtfY291bnRbbGlua19yb2xlXS0tOwotCi0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5saW5rX2NvdW50W0hDSV9ST0xFX0NFTlRSQUxdKQotICAgIGJ0bV9ibGVfc2V0X3RvcG9sb2d5X21hc2soQlRNX0JMRV9TVEFURV9DRU5UUkFMX0JJVCk7Ci0KLSAgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLmxpbmtfY291bnRbSENJX1JPTEVfUEVSSVBIRVJBTF0pCi0gICAgYnRtX2JsZV9zZXRfdG9wb2xvZ3lfbWFzayhCVE1fQkxFX1NUQVRFX1BFUklQSEVSQUxfQklUKTsKLQotICBpZiAobGlua19yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwgJiYgaW5jcmVhc2UpIHsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmFkdl9tb2RlID0gQlRNX0JMRV9BRFZfRElTQUJMRTsKLSAgICAvKiBtYWtlIGRldmljZSBmYWxsIGJhY2sgaW50byB1bmRpcmVjdGVkIGFkdiBtb2RlIGJ5IGRlZmF1bHQgKi8KLSAgICBidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmRpcmVjdGVkX2Nvbm4gPSBCVE1fQkxFX0FEVl9JTkRfRVZUOwotICAgIC8qIGNsZWFyIGFsbCBhZHYgc3RhdGVzICovCi0gICAgYnRtX2JsZV9jbGVhcl90b3BvbG9neV9tYXNrKEJUTV9CTEVfU1RBVEVfQUxMX0FEVl9NQVNLKTsKLSAgfQotfQotCi12b2lkIGJ0bV9ibGVfaW5jcmVtZW50X2xpbmtfdG9wb2xvZ3lfbWFzayh1aW50OF90IGxpbmtfcm9sZSkgewotICBidG1fYmxlX3VwZGF0ZV9saW5rX3RvcG9sb2d5X21hc2sobGlua19yb2xlLCB0cnVlKTsKLX0KLQotdm9pZCBidG1fYmxlX2RlY3JlbWVudF9saW5rX3RvcG9sb2d5X21hc2sodWludDhfdCBsaW5rX3JvbGUpIHsKLSAgYnRtX2JsZV91cGRhdGVfbGlua190b3BvbG9neV9tYXNrKGxpbmtfcm9sZSwgZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV91cGRhdGVfbW9kZV9vcGVyYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlIHRoZSBHQVAgcm9sZSBvcGVyYXRpb24gd2hlbiBhIGxpbmsKLSAqICAgICAgICAgICAgICAgICAgc3RhdHVzIGlzIHVwZGF0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV91cGRhdGVfbW9kZV9vcGVyYXRpb24odWludDhfdCBsaW5rX3JvbGUsIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBpZiAoc3RhdHVzID09IEhDSV9FUlJfQURWRVJUSVNJTkdfVElNRU9VVCkgewotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXIuYWR2X21vZGUgPSBCVE1fQkxFX0FEVl9ESVNBQkxFOwotICAgIC8qIG1ha2UgZGV2aWNlIGZhbGwgYmFjayBpbnRvIHVuZGlyZWN0ZWQgYWR2IG1vZGUgYnkgZGVmYXVsdCAqLwotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXIuZGlyZWN0ZWRfY29ubiA9IEJUTV9CTEVfQURWX0lORF9FVlQ7Ci0gICAgLyogY2xlYXIgYWxsIGFkdiBzdGF0ZXMgKi8KLSAgICBidG1fYmxlX2NsZWFyX3RvcG9sb2d5X21hc2soQlRNX0JMRV9TVEFURV9BTExfQURWX01BU0spOwotICB9Ci0KLSAgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLmlucV92YXIuY29ubmVjdGFibGVfbW9kZSA9PSBCVE1fQkxFX0NPTk5FQ1RBQkxFKSB7Ci0gICAgYnRtX2JsZV9zZXRfY29ubmVjdGFiaWxpdHkoYnRtX2NiLmJ0bV9pbnFfdmFycy5jb25uZWN0YWJsZV9tb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5pbnFfdmFyLmNvbm5lY3RhYmxlX21vZGUpOwotICB9Ci0KLSAgLyogaW4gY2FzZSBvZiBkaXNjb25uZWN0ZWQsIHdlIG11c3QgY2FuY2VsIGJnY29ubiBhbmQgcmVzdGFydAotICAgICBpbiBvcmRlciB0byBhZGQgYmFjayBkZXZpY2UgdG8gYWNjZXB0bGlzdCBpbiBvcmRlciB0byByZWNvbm5lY3QgKi8KLSAgaWYgKGJkX2FkZHIgIT0gbnVsbHB0cikgewotICAgIGNvbnN0IFJhd0FkZHJlc3MgYmRhKCpiZF9hZGRyKTsKLSAgICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpKSB7Ci0gICAgICBMT0dfREVCVUcoImdkX2FjbCBlbmFibGVkIHNvIHNraXAgYmFja2dyb3VuZCBjb25uZWN0aW9uIGxvZ2ljIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ0bV9ibGVfYmdjb25uX2NhbmNlbF9pZl9kaXNjb25uZWN0ZWQoYmRhKTsKLSAgICB9Ci0gIH0KLQotICAvKiB3aGVuIG5vIGNvbm5lY3Rpb24gaXMgYXR0ZW1wdGVkLCBhbmQgY29udHJvbGxlciBpcyBub3QgcmVqZWN0aW5nIGxhc3QKLSAgICAgcmVxdWVzdAotICAgICBkdWUgdG8gcmVzb3VyY2UgbGltaXRhdGlvbiwgc3RhcnQgbmV4dCBkaXJlY3QgY29ubmVjdGlvbiBvciBiYWNrZ3JvdW5kCi0gICAgIGNvbm5lY3Rpb24KLSAgICAgbm93IGluIG9yZGVyICovCi0gIGlmIChidG1fY2IuYmxlX2N0cl9jYi5pc19jb25uZWN0aW9uX3N0YXRlX2lkbGUoKSAmJgotICAgICAgc3RhdHVzICE9IEhDSV9FUlJfSE9TVF9SRUpFQ1RfUkVTT1VSQ0VTICYmCi0gICAgICBzdGF0dXMgIT0gSENJX0VSUl9NQVhfTlVNX09GX0NPTk5FQ1RJT05TKSB7Ci0gICAgTE9HX0RFQlVHKCJSZXN1bWluZyBsZSBiYWNrZ3JvdW5kIGNvbm5lY3Rpb25zIik7Ci0gICAgYnRtX2JsZV9yZXN1bWVfYmdfY29ubigpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgYmxvY2sgdmFyaWFibGUgdmFsdWVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfaW5pdCh2b2lkKSB7Ci0gIHRCVE1fQkxFX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYWxhcm1fZnJlZShwX2NiLT5vYnNlcnZlcl90aW1lcik7Ci0gIGFsYXJtX2ZyZWUocF9jYi0+aW5xX3Zhci5mYXN0X2Fkdl90aW1lcik7Ci0gIG1lbXNldChwX2NiLCAwLCBzaXplb2YodEJUTV9CTEVfQ0IpKTsKLSAgbWVtc2V0KCYoYnRtX2NiLmNtbl9ibGVfdnNjX2NiKSwgMCwgc2l6ZW9mKHRCVE1fQkxFX1ZTQ19DQikpOwotICBidG1fY2IuY21uX2JsZV92c2NfY2IudmFsdWVzX3JlYWQgPSBmYWxzZTsKLQotICBwX2NiLT5vYnNlcnZlcl90aW1lciA9IGFsYXJtX25ldygiYnRtX2JsZS5vYnNlcnZlcl90aW1lciIpOwotICBwX2NiLT5jdXJfc3RhdGVzID0gMDsKLQotICBwX2NiLT5pbnFfdmFyLmFkdl9tb2RlID0gQlRNX0JMRV9BRFZfRElTQUJMRTsKLSAgcF9jYi0+aW5xX3Zhci5zY2FuX3R5cGUgPSBCVE1fQkxFX1NDQU5fTU9ERV9OT05FOwotICBwX2NiLT5pbnFfdmFyLmFkdl9jaG5sX21hcCA9IEJUTV9CTEVfREVGQVVMVF9BRFZfQ0hOTF9NQVA7Ci0gIHBfY2ItPmlucV92YXIuYWZwID0gQlRNX0JMRV9ERUZBVUxUX0FGUDsKLSAgcF9jYi0+aW5xX3Zhci5zZnAgPSBCVE1fQkxFX0RFRkFVTFRfU0ZQOwotICBwX2NiLT5pbnFfdmFyLmNvbm5lY3RhYmxlX21vZGUgPSBCVE1fQkxFX05PTl9DT05ORUNUQUJMRTsKLSAgcF9jYi0+aW5xX3Zhci5kaXNjb3ZlcmFibGVfbW9kZSA9IEJUTV9CTEVfTk9OX0RJU0NPVkVSQUJMRTsKLSAgcF9jYi0+aW5xX3Zhci5mYXN0X2Fkdl90aW1lciA9IGFsYXJtX25ldygiYnRtX2JsZV9pbnEuZmFzdF9hZHZfdGltZXIiKTsKLSAgcF9jYi0+aW5xX3Zhci5pbnF1aXJ5X3RpbWVyID0gYWxhcm1fbmV3KCJidG1fYmxlX2lucS5pbnF1aXJ5X3RpbWVyIik7Ci0KLSAgLyogZm9yIGJhY2tncm91bmQgY29ubmVjdGlvbiwgcmVzZXQgY29ubmVjdGlvbiBwYXJhbXMgdG8gYmUgdW5kZWZpbmVkICovCi0gIHBfY2ItPnNjYW5faW50ID0gcF9jYi0+c2Nhbl93aW4gPSBCVE1fQkxFX1NDQU5fUEFSQU1fVU5ERUY7Ci0KLSAgcF9jYi0+aW5xX3Zhci5ldnRfdHlwZSA9IEJUTV9CTEVfTk9OX0NPTk5FQ1RfRVZUOwotCi0gIHBfY2ItPmFkZHJfbWdudF9jYi5yZWZyZXNoX3JhZGRyX3RpbWVyID0KLSAgICAgIGFsYXJtX25ldygiYnRtX2JsZV9hZGRyLnJlZnJlc2hfcmFkZHJfdGltZXIiKTsKLQotI2lmIChCTEVfVk5EX0lOQ0xVREVEID09IEZBTFNFKQotICBidG1fYmxlX2Fkdl9maWx0ZXJfaW5pdCgpOwotI2VuZGlmCi19Ci0KLS8vIENsZWFuIHVwIGJ0bSBibGUgY29udHJvbCBibG9jawotdm9pZCBidG1fYmxlX2ZyZWUoKSB7Ci0gIHRCVE1fQkxFX0NCKiBwX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotICBhbGFybV9mcmVlKHBfY2ItPmFkZHJfbWdudF9jYi5yZWZyZXNoX3JhZGRyX3RpbWVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfdG9wb2xvZ3lfY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrIHRvIHNlZSByZXF1ZXN0ZWQgc3RhdGUgaXMgc3VwcG9ydGVkLiBPbmUgc3RhdGUgY2hlY2sKLSAqICAgICAgICAgICAgICAgICAgYXQgYSB0aW1lIGlzIHN1cHBvcnRlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpcyByZXF1ZXN0IGlzIGFsbG93ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fYmxlX3RvcG9sb2d5X2NoZWNrKHRCVE1fQkxFX1NUQVRFX01BU0sgcmVxdWVzdF9zdGF0ZV9tYXNrKSB7Ci0gIGJvb2wgcnQgPSBmYWxzZTsKLQotICB1aW50OF90IHN0YXRlX29mZnNldCA9IDA7Ci0gIHVpbnQxNl90IGN1cl9zdGF0ZXMgPSBidG1fY2IuYmxlX2N0cl9jYi5jdXJfc3RhdGVzOwotICB1aW50OF90IHJlcXVlc3Rfc3RhdGUgPSAwOwotCi0gIC8qIGNoZWNrIG9ubHkgb25lIGJpdCBpcyBzZXQgYW5kIHdpdGhpbiB2YWxpZCByYW5nZSAqLwotICBpZiAocmVxdWVzdF9zdGF0ZV9tYXNrID09IEJUTV9CTEVfU1RBVEVfSU5WQUxJRCB8fAotICAgICAgcmVxdWVzdF9zdGF0ZV9tYXNrID4gQlRNX0JMRV9TVEFURV9TQ0FOX0FEVl9CSVQgfHwKLSAgICAgIChyZXF1ZXN0X3N0YXRlX21hc2sgJiAocmVxdWVzdF9zdGF0ZV9tYXNrIC0gMSkpICE9IDApIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoImlsbGVnYWwgc3RhdGUgcmVxdWVzdGVkOiAlZCIsIHJlcXVlc3Rfc3RhdGVfbWFzayk7Ci0gICAgcmV0dXJuIHJ0OwotICB9Ci0KLSAgd2hpbGUgKHJlcXVlc3Rfc3RhdGVfbWFzaykgewotICAgIHJlcXVlc3Rfc3RhdGVfbWFzayA+Pj0gMTsKLSAgICByZXF1ZXN0X3N0YXRlKys7Ci0gIH0KLQotICAvKiBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIHN0YXRlIGlzIHN1cHBvcnRlZCBvciBub3QgKi8KLSAgdWludDhfdCBiaXRfbnVtID0gYnRtX2xlX3N0YXRlX2NvbWJvX3RibFswXVtyZXF1ZXN0X3N0YXRlIC0gMV07Ci0gIGNvbnN0IHVpbnQ4X3QqIGJsZV9zdXBwb3J0ZWRfc3RhdGVzID0KLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3N1cHBvcnRlZF9zdGF0ZXMoKTsKLQotICBpZiAoIUJUTV9MRV9TVEFURVNfU1VQUE9SVEVEKGJsZV9zdXBwb3J0ZWRfc3RhdGVzLCBiaXRfbnVtKSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigic3RhdGUgcmVxdWVzdGVkIG5vdCBzdXBwb3J0ZWQ6ICVkIiwgcmVxdWVzdF9zdGF0ZSk7Ci0gICAgcmV0dXJuIHJ0OwotICB9Ci0KLSAgcnQgPSB0cnVlOwotICAvKiBtYWtlIHN1cmUgY3VycmVudGx5IGFjdGl2ZSBzdGF0ZXMgYXJlIGFsbCBzdXBwb3J0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICAgcmVxdWVzdGVkIHN0YXRlLiBJZiB0aGUgYml0IGluIHRhYmxlIGlzIFVOU1VQUE9SVEVELCB0aGUgY29tYmluYXRpb24gaXMgbm90Ci0gICAgIHN1cHBvcnRlZCAqLwotICB3aGlsZSAoY3VyX3N0YXRlcyAhPSAwKSB7Ci0gICAgaWYgKGN1cl9zdGF0ZXMgJiAweDAxKSB7Ci0gICAgICB1aW50OF90IGJpdF9udW0gPSBidG1fbGVfc3RhdGVfY29tYm9fdGJsW3JlcXVlc3Rfc3RhdGVdW3N0YXRlX29mZnNldF07Ci0gICAgICBpZiAoYml0X251bSAhPSBVTlNVUFBPUlRFRCkgewotICAgICAgICBpZiAoIUJUTV9MRV9TVEFURVNfU1VQUE9SVEVEKGJsZV9zdXBwb3J0ZWRfc3RhdGVzLCBiaXRfbnVtKSkgewotICAgICAgICAgIHJ0ID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY3VyX3N0YXRlcyA+Pj0gMTsKLSAgICBzdGF0ZV9vZmZzZXQrKzsKLSAgfQotICByZXR1cm4gcnQ7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX2JsZV9pbnQuaCBiL3N0YWNrL2J0bS9idG1fYmxlX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTIyMjNiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fYmxlX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgdGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIEJsdWV0b290aCBNYW5hZ2VyIChCVE0pIGludGVybmFsCi0gKiAgZGVmaW5pdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVE1fQkxFX0lOVF9ICi0jZGVmaW5lIEJUTV9CTEVfSU5UX0gKLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0bV9ibGVfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2JsZV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJidG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic21wX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfZXN0X2V2dCh1aW50OF90IGxlbiwgdWludDhfdCogcCk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogcCk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfbG9zdF9ldnQodWludDhfdCBsZW4sIHVpbnQ4X3QqIHApOwotZXh0ZXJuIHZvaWQgYnRtX3NlbmRfaGNpX3NldF9zY2FuX3BhcmFtcyh1aW50OF90IHNjYW5fdHlwZSwgdWludDE2X3Qgc2Nhbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNjYW5fd2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYW5fZmlsdGVyX3BvbGljeSk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3N0b3Bfc2Nhbih2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9jbGVhcl9hbGxfcGVuZGluZ19sZV9lbnRyeSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYnRtX2JsZV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9mcmVlKCk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jX21vZGUsIHVpbnQ4X3Qgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwgYm9vbCBhZGRyX21hdGNoZWQpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9jb25uZWN0ZWRfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZW5jX21vZGUsCi0gICAgdWludDhfdCByb2xlLCBib29sIGFkZHJfbWF0Y2hlZCk7Ci0KLWV4dGVybiB0QlRNX1NUQVRVUyBidG1fYmxlX3N0YXJ0X2Fkdih2b2lkKTsKLWV4dGVybiB0QlRNX1NUQVRVUyBidG1fYmxlX3N0b3BfYWR2KHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9zdGFydF9zY2FuKHZvaWQpOwotCi0vKiBMRSBzZWN1cml0eSBmdW5jdGlvbiBmcm9tIGJ0bV9zZWMuY2MgKi8KLWV4dGVybiB2b2lkIGJ0bV9ibGVfbGlua19zZWNfY2hlY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX1JFUV9BQ1QqIHBfc2VjX3JlcV9hY3QpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9sdGtfcmVxdWVzdF9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGJvb2wgdXNlX3N0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgc3RrKTsKLWV4dGVybiB0QlRNX1NUQVRVUyBidG1fcHJvY19zbXBfY2JhY2sodFNNUF9FVlQgZXZlbnQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfRVZUX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfZW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsaW5rX3JvbGUpOwotZXh0ZXJuIHRCVE1fU1RBVFVTIGJ0bV9ibGVfc3RhcnRfZW5jcnlwdChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGJvb2wgdXNlX3N0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0ZXQxNiogcF9zdGspOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9saW5rX2VuY3J5cHRlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuY3JfZW5hYmxlKTsKLQotLyogTEUgZGV2aWNlIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBidG1fYmxlX3Jlc2V0X2lkKHZvaWQpOwotCi1leHRlcm4gYm9vbCBidG1fZ2V0X2xvY2FsX2Rpdihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCogcF9kaXYpOwotZXh0ZXJuIGJvb2wgYnRtX2JsZV9nZXRfZW5jX2tleV90eXBlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9rZXlfdHlwZXMpOwotCi1leHRlcm4gdm9pZCBidG1fc2VjX3NhdmVfbGVfa2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1ZBTFVFKiBwX2tleXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGFzc190b19hcHBsaWNhdGlvbik7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3VwZGF0ZV9zZWNfa2V5X3NpemUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuY19rZXlfc2l6ZSk7Ci1leHRlcm4gdWludDhfdCBidG1fYmxlX3JlYWRfc2VjX2tleV9zaXplKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiBhY2NlcHRsaXN0IGZ1bmN0aW9uICovCi1leHRlcm4gdm9pZCBidG1fdXBkYXRlX3NjYW5uZXJfZmlsdGVyX3BvbGljeSh0QlRNX0JMRV9TRlAgc2Nhbl9wb2xpY3kpOwotCi0vKiBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gZnVuY3Rpb24gKi8KLWV4dGVybiBib29sIGJ0bV9ibGVfc3VzcGVuZF9iZ19jb25uKHZvaWQpOwotZXh0ZXJuIGJvb2wgYnRtX2JsZV9yZXN1bWVfYmdfY29ubih2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfdXBkYXRlX21vZGVfb3BlcmF0aW9uKHVpbnQ4X3QgbGlua19yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyogYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfYmdjb25uX2NhbmNlbF9pZl9kaXNjb25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qIEJMRSBhZGRyZXNzIG1hbmFnZW1lbnQgKi8KLWV4dGVybiB2b2lkIGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJiBycGEpPiBjYik7Ci0KLWV4dGVybiB0QlRNX1NFQ19ERVZfUkVDKiBidG1fYmxlX3Jlc29sdmVfcmFuZG9tX2FkZHIoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmFuZG9tX2JkYSk7Ci1leHRlcm4gdm9pZCBidG1fZ2VuX3Jlc29sdmVfcGFkZHJfbG93KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotZXh0ZXJuIHVpbnQ2NF90IGJ0bV9nZXRfbmV4dF9wcml2YXRlX2FkZHJyZXNzX2ludGVydmFsX21zKCk7Ci0KLS8qICBwcml2YWN5IGZ1bmN0aW9uICovCi0vKiBCTEUgYWRkcmVzcyBtYXBwaW5nIHdpdGggQ1MgZmVhdHVyZSAqLwotZXh0ZXJuIGJvb2wgYnRtX3JhbmRvbV9wc2V1ZG9fdG9faWRlbnRpdHlfYWRkcihSYXdBZGRyZXNzKiByYW5kb21fcHNldWRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2lkZW50aXR5X2FkZHJfdHlwZSk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3JlZnJlc2hfcGVlcl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYmRhLCBjb25zdCBSYXdBZGRyZXNzJiBycmEsCi0gICAgdEJUTV9TRUNfQkxFOjp0QUREUkVTU19UWVBFIHR5cGUpOwotZXh0ZXJuIGJvb2wgYnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5KHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk7Ci0KLWV4dGVybiBib29sIGJ0bV9ibGVfYWRkcl9yZXNvbHZhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk7Ci0KLWV4dGVybiBib29sIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfbG9hZF9kZXYodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfcmVtb3ZlX2Rldih0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QodWludDhfdCk7Ci1leHRlcm4gYm9vbCBidG1fYmxlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QodWludDhfdCBybF9tYXNrLCBib29sIHRvX3Jlc3VtZSk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm0odWludDhfdCBybF9tYXNrKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdCh1aW50OF90IG1heF9pcmtfbGlzdF9zeik7Ci0KLWV4dGVybiB2b2lkIGJ0bV9ibGVfYWR2X2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX211bHRpX2Fkdl9jbGVhbnVwKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9iYXRjaHNjYW5faW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfYWR2X2ZpbHRlcl9pbml0KHZvaWQpOwotZXh0ZXJuIGJvb2wgYnRtX2JsZV90b3BvbG9neV9jaGVjayh0QlRNX0JMRV9TVEFURV9NQVNLIHJlcXVlc3QpOwotZXh0ZXJuIGJvb2wgYnRtX2JsZV9jbGVhcl90b3BvbG9neV9tYXNrKHRCVE1fQkxFX1NUQVRFX01BU0sgcmVxdWVzdF9zdGF0ZSk7Ci1leHRlcm4gYm9vbCBidG1fYmxlX3NldF90b3BvbG9neV9tYXNrKHRCVE1fQkxFX1NUQVRFX01BU0sgcmVxdWVzdF9zdGF0ZSk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3NldF9yYW5kb21fYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYmRhKTsKLQotI2lmIChCVE1fQkxFX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRSkKLWV4dGVybiB2b2lkIGJ0bV9ibGVfc2V0X25vX2Rpc2NfaWZfcGFpcl9mYWlsKGJvb2wgZGlzYmxlX2Rpc2MpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9zZXRfdGVzdF9tYWNfdmFsdWUoYm9vbCBlbmFibGUsIHVpbnQ4X3QqIHBfdGVzdF9tYWNfdmFsKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfc2V0X3Rlc3RfbG9jYWxfc2lnbl9jbnRyX3ZhbHVlKAotICAgIGJvb2wgZW5hYmxlLCB1aW50MzJfdCB0ZXN0X2xvY2FsX3NpZ25fY250cik7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3NldF9rZWVwX3JmdV9pbl9hdXRoX3JlcShib29sIGtlZXBfcmZ1KTsKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fYmxlX2ludF90eXBlcy5oIGIvc3RhY2svYnRtL2J0bV9ibGVfaW50X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2RjYWYuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9ibGVfaW50X3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVE1fQkxFX0lOVF9UWVBFU19ICi0jZGVmaW5lIEJUTV9CTEVfSU5UX1RZUEVTX0gKLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL25laWdoYm9yX2lucXVpcnkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9ibGVfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyogc2Nhbm5pbmcgZW5hYmxlIHN0YXR1cyAqLwotI2RlZmluZSBCVE1fQkxFX1NDQU5fRU5BQkxFIDB4MDEKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX0RJU0FCTEUgMHgwMAotCi0vKiBhZHZlcnRpc2luZyBlbmFibGUgc3RhdHVzICovCi0jZGVmaW5lIEJUTV9CTEVfQURWX0VOQUJMRSAweDAxCi0jZGVmaW5lIEJUTV9CTEVfQURWX0RJU0FCTEUgMHgwMAotCi0jZGVmaW5lIEJUTV9CTEVfQURfREFUQV9MRU4gMzEKLQotI2RlZmluZSBCVE1fQkxFX0RVUExJQ0FURV9FTkFCTEUgMQotI2RlZmluZSBCVE1fQkxFX0RVUExJQ0FURV9ESVNBQkxFIDAKLQotLyogSW50ZXJ2YWwoc2Nhbl9pbnQpID0gMTEuMjUgbXM9IDB4MDAxMCAqIDAuNjI1IG1zICovCi0jZGVmaW5lIEJUTV9CTEVfR0FQX0RJU0NfU0NBTl9JTlQgMTgKLS8qIHNjYW5fd2luZG93ID0gMTEuMjUgbXM9IDB4MDAxMCAqIDAuNjI1IG1zICovCi0jZGVmaW5lIEJUTV9CTEVfR0FQX0RJU0NfU0NBTl9XSU4gMTgKLS8qIFRnYXAoZ2VuX2Rpc2MpID0gMS4yOCBzPSA1MTIgKiAwLjYyNSBtcyAqLwotI2RlZmluZSBCVE1fQkxFX0dBUF9BRFZfSU5UIDUxMgotLyogVGdhcChsaW1fdGltZW91dCkgPSAxODBzIG1heCAqLwotI2RlZmluZSBCVE1fQkxFX0dBUF9MSU1fVElNRU9VVF9NUyAoMTgwICogMTAwMCkKLS8qIEludGVydmFsKHNjYW5faW50KSA9IDVzPSA4MDAwICogMC42MjUgbXMgKi8KLSNkZWZpbmUgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX0lOVCA4MDAwCi0vKiBzY2FuX3dpbmRvdyA9IDVzPSA4MDAwICogMC42MjUgbXMgKi8KLSNkZWZpbmUgQlRNX0JMRV9MT1dfTEFURU5DWV9TQ0FOX1dJTiA4MDAwCi0KLS8qIFRHQVAoYWR2X2Zhc3RfaW50ZXJ2YWwxKSA9IDMwKHVzZWQpIH4gNjAgbXMgID0gNDggKjAuNjI1ICovCi0jZGVmaW5lIEJUTV9CTEVfR0FQX0FEVl9GQVNUX0lOVF8xIDQ4Ci0vKiBUR0FQKGFkdl9mYXN0X2ludGVydmFsMikgPSAxMDAodXNlZCkgfiAxNTAgbXMgPSAxNjAgKiAwLjYyNSBtcyAqLwotI2RlZmluZSBCVE1fQkxFX0dBUF9BRFZfRkFTVF9JTlRfMiAxNjAKLS8qIFRnYXAoYWR2X3Nsb3dfaW50ZXJ2YWwpID0gMS4yOCBzPSA1MTIgKiAwLjYyNSBtcyAqLwotI2RlZmluZSBCVE1fQkxFX0dBUF9BRFZfU0xPV19JTlQgMjA0OAotLyogVGdhcChkaXJfY29ubl9hZHZfaW50X21heCkgPSA1MDAgbXMgPSA4MDAgKiAwLjYyNSBtcyAqLwotI2RlZmluZSBCVE1fQkxFX0dBUF9BRFZfRElSX01BWF9JTlQgODAwCi0vKiBUZ2FwKGRpcl9jb25uX2Fkdl9pbnRfbWluKSA9IDI1MCBtcyA9IDQwMCAqIDAuNjI1IG1zICovCi0jZGVmaW5lIEJUTV9CTEVfR0FQX0FEVl9ESVJfTUlOX0lOVCA0MDAKLQotI2RlZmluZSBCVE1fQkxFX0dBUF9GQVNUX0FEVl9USU1FT1VUX01TICgzMCAqIDEwMDApCi0KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBCVE1fQkxFX1NFQ19SRVFfQUNUX05PTkUgPSAwLAotICAvKiBlbmNyeXB0IHRoZSBsaW5rIHVzaW5nIGN1cnJlbnQga2V5IG9yIGtleSByZWZyZXNoICovCi0gIEJUTV9CTEVfU0VDX1JFUV9BQ1RfRU5DUllQVCA9IDEsCi0gIEJUTV9CTEVfU0VDX1JFUV9BQ1RfUEFJUiA9IDIsCi0gIC8qIGRpc2NhcmQgdGhlIHNlYyByZXF1ZXN0IHdoaWxlIGVuY3J5cHRpb24gaXMgc3RhcnRlZCBidXQgbm90IGNvbXBsZXRlZCAqLwotICBCVE1fQkxFX1NFQ19SRVFfQUNUX0RJU0NBUkQgPSAzLAotfSB0QlRNX0JMRV9TRUNfUkVRX0FDVDsKLQotI2RlZmluZSBCVE1fVlNDX0NISVBfQ0FQQUJJTElUWV9MX1ZFUlNJT04gNTUKLSNkZWZpbmUgQlRNX1ZTQ19DSElQX0NBUEFCSUxJVFlfTV9WRVJTSU9OIDk1Ci0jZGVmaW5lIEJUTV9WU0NfQ0hJUF9DQVBBQklMSVRZX1NfVkVSU0lPTiA5OAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGRhdGFfbWFzazsKLSAgdWludDhfdCogcF9mbGFnczsKLSAgdWludDhfdCBhZF9kYXRhW0JUTV9CTEVfQURfREFUQV9MRU5dOwotICB1aW50OF90KiBwX3BhZDsKLX0gdEJUTV9CTEVfTE9DQUxfQURWX0RBVEE7Ci0KLSNkZWZpbmUgQlRNX0JMRV9JU1ZBTElEX1BBUkFNKHgsIG1pbiwgbWF4KSBcCi0gICgoKHgpID49IChtaW4pICYmICh4KSA8PSAobWF4KSkgfHwgKCh4KSA9PSBCVE1fQkxFX0NPTk5fUEFSQU1fVU5ERUYpKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGRpc2NvdmVyYWJsZV9tb2RlOwotICB1aW50MTZfdCBjb25uZWN0YWJsZV9tb2RlOwotICB1aW50MzJfdCBzY2FuX3dpbmRvdzsKLSAgdWludDMyX3Qgc2Nhbl9pbnRlcnZhbDsKLSAgdWludDhfdCBzY2FuX3R5cGU7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgc2NhbiB0eXBlOiBhY3RpdmUgb3IgcGFzc2l2ZSAqLwotCi0gIHRCVE1fQkxFX0FGUCBhZnA7IC8qIGFkdmVydGlzaW5nIGZpbHRlciBwb2xpY3kgKi8KLSAgdEJUTV9CTEVfU0ZQIHNmcDsgLyogc2Nhbm5pbmcgZmlsdGVyIHBvbGljeSAqLwotCi0gIHRCTEVfQUREUl9UWVBFIGFkdl9hZGRyX3R5cGU7Ci0gIHVpbnQ4X3QgZXZ0X3R5cGU7Ci0KLSAgdWludDhfdCBhZHZfbW9kZTsKLSAgdm9pZCBlbmFibGVfYWR2ZXJ0aXNpbmdfbW9kZSgpIHsgYWR2X21vZGUgPSBCVE1fQkxFX0FEVl9FTkFCTEU7IH0KLSAgdm9pZCBkaXNhYmxlX2FkdmVydGlzaW5nX21vZGUoKSB7IGFkdl9tb2RlID0gQlRNX0JMRV9BRFZfRElTQUJMRTsgfQotICBib29sIGlzX2FkdmVydGlzaW5nX21vZGVfZW5hYmxlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGFkdl9tb2RlID09IEJUTV9CTEVfQURWX0VOQUJMRSk7Ci0gIH0KLQotICB0QkxFX0JEX0FERFIgZGlyZWN0X2JkYTsKLSAgdEJUTV9CTEVfRVZUIGRpcmVjdGVkX2Nvbm47Ci0gIGJvb2wgZmFzdF9hZHZfb247Ci0gIGFsYXJtX3QqIGZhc3RfYWR2X3RpbWVyOwotCi0gIC8qIGlucXVpcnkgQkQgYWRkciBkYXRhYmFzZSAqLwotICB0QlRNX0JMRV9MT0NBTF9BRFZfREFUQSBhZHZfZGF0YTsKLSAgdEJUTV9CTEVfQURWX0NITkxfTUFQIGFkdl9jaG5sX21hcDsKLQotICBhbGFybV90KiBpbnF1aXJ5X3RpbWVyOwotICBib29sIHNjYW5fcnNwOwotICB1aW50OF90IHN0YXRlOyAvKiBDdXJyZW50IHN0YXRlIHRoYXQgdGhlIGlucXVpcnkgcHJvY2VzcyBpcyBpbiAqLwotfSB0QlRNX0JMRV9JTlFfQ0I7Ci0KLS8qIHJhbmRvbSBhZGRyZXNzIHJlc29sdmluZyBjb21wbGV0ZSBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkKHRCVE1fQkxFX1JFU09MVkVfQ0JBQ0spKHZvaWQqIG1hdGNoX3JlYywgdm9pZCogcCk7Ci0KLXR5cGVkZWYgdm9pZCh0QlRNX0JMRV9BRERSX0NCQUNLKShjb25zdCBSYXdBZGRyZXNzJiBzdGF0aWNfcmFuZG9tLCB2b2lkKiBwKTsKLQotLyogcmFuZG9tIGFkZHJlc3MgbWFuYWdlbWVudCBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCTEVfQUREUl9UWVBFIG93bl9hZGRyX3R5cGU7IC8qIGxvY2FsIGRldmljZSBMRSBhZGRyZXNzIHR5cGUgKi8KLSAgUmF3QWRkcmVzcyBwcml2YXRlX2FkZHI7Ci0gIGFsYXJtX3QqIHJlZnJlc2hfcmFkZHJfdGltZXI7Ci19IHRCVE1fTEVfUkFORE9NX0NCOwotCi0vKiBhY2NlcHRsaXN0IHVzaW5nIHN0YXRlIGFzIGEgYml0IG1hc2sgKi8KLWNvbnN0ZXhwciB1aW50OF90IEJUTV9CTEVfV0xfSURMRSA9IDA7Ci1jb25zdGV4cHIgdWludDhfdCBCVE1fQkxFX0FDQ0VQVExJU1RfSU5JVCA9IDE7Ci0KLS8qIHJlc29sdmluZyBsaXN0IHVzaW5nIHN0YXRlIGFzIGEgYml0IG1hc2sgKi8KLWVudW0gOiB1aW50OF90IHsKLSAgQlRNX0JMRV9STF9JRExFID0gMCwKLSAgQlRNX0JMRV9STF9JTklUID0gKDEgPDwgMCksCi0gIEJUTV9CTEVfUkxfU0NBTiA9ICgxIDw8IDEpLAotICBCVE1fQkxFX1JMX0FEViA9ICgxIDw8IDIpLAotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRNX0JMRV9STF9TVEFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgeyB2b2lkKiBwX3BhcmFtOyB9IHRCVE1fQkxFX0NPTk5fUkVROwotCi0vKiBMRSBzdGF0ZSByZXF1ZXN0ICovCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfSU5WQUxJRCAwCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfSU5JVCAyCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfTUFYIDExCi0KLSNkZWZpbmUgQlRNX0JMRV9TVEFURV9DT05OX0FEVl9CSVQgMHgwMDAxCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfSU5JVF9CSVQgMHgwMDAyCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfQ0VOVFJBTF9CSVQgMHgwMDA0Ci0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfUEVSSVBIRVJBTF9CSVQgMHgwMDA4Ci0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfTE9fRFVUWV9ESVJfQURWX0JJVCAweDAwMTAKLSNkZWZpbmUgQlRNX0JMRV9TVEFURV9ISV9EVVRZX0RJUl9BRFZfQklUIDB4MDAyMAotI2RlZmluZSBCVE1fQkxFX1NUQVRFX05PTl9DT05OX0FEVl9CSVQgMHgwMDQwCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfUEFTU0lWRV9TQ0FOX0JJVCAweDAwODAKLSNkZWZpbmUgQlRNX0JMRV9TVEFURV9BQ1RJVkVfU0NBTl9CSVQgMHgwMTAwCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfU0NBTl9BRFZfQklUIDB4MDIwMAotdHlwZWRlZiB1aW50MTZfdCB0QlRNX0JMRV9TVEFURV9NQVNLOwotCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfQUxMX01BU0sgMHgwM2ZmCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfQUxMX0FEVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEJUTV9CTEVfU1RBVEVfQ09OTl9BRFZfQklUIHwgQlRNX0JMRV9TVEFURV9MT19EVVRZX0RJUl9BRFZfQklUIHwgXAotICAgQlRNX0JMRV9TVEFURV9ISV9EVVRZX0RJUl9BRFZfQklUIHwgQlRNX0JMRV9TVEFURV9TQ0FOX0FEVl9CSVQpCi0jZGVmaW5lIEJUTV9CTEVfU1RBVEVfQUxMX0NPTk5fTUFTSyBcCi0gIChCVE1fQkxFX1NUQVRFX0NFTlRSQUxfQklUIHwgQlRNX0JMRV9TVEFURV9QRVJJUEhFUkFMX0JJVCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzKiByZXNvbHZlX3FfcmFuZG9tX3BzZXVkbzsKLSAgdWludDhfdCogcmVzb2x2ZV9xX2FjdGlvbjsKLSAgdWludDhfdCBxX25leHQ7Ci0gIHVpbnQ4X3QgcV9wZW5kaW5nOwotfSB0QlRNX0JMRV9SRVNPTFZFX1E7Ci0KLS8qIEJMRSBwcml2YWN5IG1vZGUgKi8KLSNkZWZpbmUgQlRNX1BSSVZBQ1lfTk9ORSAwIC8qIEJMRSBubyBwcml2YWN5ICovCi0jZGVmaW5lIEJUTV9QUklWQUNZXzFfMSAxICAvKiBCTEUgcHJpdmFjeSAxLjEsIGRvIG5vdCBzdXBwb3J0IHByaXZhY3kgMS4wICovCi0jZGVmaW5lIEJUTV9QUklWQUNZXzFfMiAyICAvKiBCTEUgcHJpdmFjeSAxLjIgKi8KLSNkZWZpbmUgQlRNX1BSSVZBQ1lfTUlYRUQgXAotICAzIC8qIEJMRSBwcml2YWN5IG1peGVkIG1vZGUsIGJyb2FkY29tIHByb3BpZXRhcnkgbW9kZSAqLwotdHlwZWRlZiB1aW50OF90IHRCVE1fUFJJVkFDWV9NT0RFOwotCi0vKiBEZWZpbmUgQkxFIERldmljZSBNYW5hZ2VtZW50IGNvbnRyb2wgc3RydWN0dXJlCi0qLwotY29uc3RleHByIHVpbnQ4X3Qga0JUTV9CTEVfSU5RVUlSWV9BQ1RJVkUgPSAweDEwOwotY29uc3RleHByIHVpbnQ4X3Qga0JUTV9CTEVfT0JTRVJWRV9BQ1RJVkUgPSAweDgwOwotY29uc3RleHByIHNpemVfdCBrQ2VudHJhbEFuZFBlcmlwaGVyYWxDb3VudCA9IDI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSBwcml2YXRlOgotICB1aW50OF90IHNjYW5fYWN0aXZpdHlfOyAvKiBMRSBzY2FuIGFjdGl2aXR5IG1hc2sgKi8KLQotIHB1YmxpYzoKLSAgYm9vbCBpc19ibGVfaW5xdWlyeV9hY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChzY2FuX2FjdGl2aXR5XyAmIGtCVE1fQkxFX0lOUVVJUllfQUNUSVZFKTsKLSAgfQotICBib29sIGlzX2JsZV9vYnNlcnZlX2FjdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKHNjYW5fYWN0aXZpdHlfICYga0JUTV9CTEVfT0JTRVJWRV9BQ1RJVkUpOwotICB9Ci0KLSAgdm9pZCBzZXRfYmxlX2lucXVpcnlfYWN0aXZlKCkgeyBzY2FuX2FjdGl2aXR5XyB8PSBrQlRNX0JMRV9JTlFVSVJZX0FDVElWRTsgfQotICB2b2lkIHNldF9ibGVfb2JzZXJ2ZV9hY3RpdmUoKSB7IHNjYW5fYWN0aXZpdHlfIHw9IGtCVE1fQkxFX09CU0VSVkVfQUNUSVZFOyB9Ci0KLSAgdm9pZCByZXNldF9ibGVfaW5xdWlyeSgpIHsgc2Nhbl9hY3Rpdml0eV8gJj0gfmtCVE1fQkxFX0lOUVVJUllfQUNUSVZFOyB9Ci0gIHZvaWQgcmVzZXRfYmxlX29ic2VydmUoKSB7IHNjYW5fYWN0aXZpdHlfICY9IH5rQlRNX0JMRV9PQlNFUlZFX0FDVElWRTsgfQotCi0gIGJvb2wgaXNfYmxlX3NjYW5fYWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybiAoaXNfYmxlX2lucXVpcnlfYWN0aXZlKCkgfHwgaXNfYmxlX29ic2VydmVfYWN0aXZlKCkpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoqICAgICAgQkxFIElucXVpcnkKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHRCVE1fQkxFX0lOUV9DQiBpbnFfdmFyOwotCi0gIC8qIG9ic2VydmVyIGNhbGxiYWNrIGFuZCB0aW1lciAqLwotICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX29ic19yZXN1bHRzX2NiOwotICB0QlRNX0NNUExfQ0IqIHBfb2JzX2NtcGxfY2I7Ci0gIGFsYXJtX3QqIG9ic2VydmVyX3RpbWVyOwotCi0gIC8qIG9wcG9ydHVuaXN0aWMgb2JzZXJ2ZXIgKi8KLSAgdEJUTV9JTlFfUkVTVUxUU19DQiogcF9vcHBvcnR1bmlzdGljX29ic19yZXN1bHRzX2NiOwotCi0gIC8qIGJhY2tncm91bmQgY29ubmVjdGlvbiBwcm9jZWR1cmUgY2IgdmFsdWUgKi8KLSAgdWludDE2X3Qgc2Nhbl9pbnQ7Ci0gIHVpbnQxNl90IHNjYW5fd2luOwotCi0gIC8qIGFjY2VwdGxpc3QgaW5mb3JtYXRpb24gKi8KLSAgdWludDhfdCB3bF9zdGF0ZTsKLSAgdm9pZCBzZXRfYWNjZXB0bGlzdF9wcm9jZXNzX2luX3Byb2dyZXNzKCkgewotICAgIHdsX3N0YXRlIHw9IEJUTV9CTEVfQUNDRVBUTElTVF9JTklUOwotICB9Ci0gIHZvaWQgcmVzZXRfYWNjZXB0bGlzdF9wcm9jZXNzX2luX3Byb2dyZXNzKCkgewotICAgIHdsX3N0YXRlICY9IH5CVE1fQkxFX0FDQ0VQVExJU1RfSU5JVDsKLSAgfQotICBib29sIGlzX2FjY2VwdGxpc3RfaW5fcHJvZ3Jlc3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHdsX3N0YXRlICYgQlRNX0JMRV9BQ0NFUFRMSVNUX0lOSVQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGVudW0gOiB1aW50OF90IHsgLyogQkxFIGNvbm5lY3Rpb24gc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICBCTEVfQ09OTl9JRExFID0gMCwKLSAgICAgICAgICAgICAgICAgICBCTEVfQ09OTkVDVElORyA9IDIsCi0gICAgICAgICAgICAgICAgICAgQkxFX0NPTk5fQ0FOQ0VMID0gMywKLSAgfSBjb25uX3N0YXRlX3tCTEVfQ09OTl9JRExFfTsKLQotIHB1YmxpYzoKLSAgYm9vbCBpc19jb25uZWN0aW9uX3N0YXRlX2lkbGUoKSBjb25zdCB7IHJldHVybiBjb25uX3N0YXRlXyA9PSBCTEVfQ09OTl9JRExFOyB9Ci0gIGJvb2wgaXNfY29ubmVjdGlvbl9zdGF0ZV9jb25uZWN0aW5nKCkgY29uc3QgewotICAgIHJldHVybiBjb25uX3N0YXRlXyA9PSBCTEVfQ09OTkVDVElORzsKLSAgfQotICBib29sIGlzX2Nvbm5lY3Rpb25fc3RhdGVfY2FuY2VsbGVkKCkgY29uc3QgewotICAgIHJldHVybiBjb25uX3N0YXRlXyA9PSBCTEVfQ09OTl9DQU5DRUw7Ci0gIH0KLSAgdm9pZCBzZXRfY29ubmVjdGlvbl9zdGF0ZV9pZGxlKCkgeyBjb25uX3N0YXRlXyA9IEJMRV9DT05OX0lETEU7IH0KLSAgdm9pZCBzZXRfY29ubmVjdGlvbl9zdGF0ZV9jb25uZWN0aW5nKCkgeyBjb25uX3N0YXRlXyA9IEJMRV9DT05ORUNUSU5HOyB9Ci0gIHZvaWQgc2V0X2Nvbm5lY3Rpb25fc3RhdGVfY2FuY2VsbGVkKCkgeyBjb25uX3N0YXRlXyA9IEJMRV9DT05OX0NBTkNFTDsgfQotCi0gIC8qIHJhbmRvbSBhZGRyZXNzIG1hbmFnZW1lbnQgY29udHJvbCBibG9jayAqLwotICB0QlRNX0xFX1JBTkRPTV9DQiBhZGRyX21nbnRfY2I7Ci0KLSAgdEJUTV9QUklWQUNZX01PREUgcHJpdmFjeV9tb2RlOyAgICAvKiBwcml2YWN5IG1vZGUgKi8KLSAgdWludDhfdCByZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplOyAvKiByZXNvbHZpbmcgbGlzdCBhdmFpbGFibGUgc2l6ZSAqLwotICB0QlRNX0JMRV9SRVNPTFZFX1EgcmVzb2x2aW5nX2xpc3RfcGVuZF9xOyAvKiBSZXNvbHZpbmcgbGlzdCBxdWV1ZSAqLwotICB0QlRNX0JMRV9STF9TVEFURSBzdXNwZW5kZWRfcmxfc3RhdGU7ICAgICAvKiBTdXNwZW5kZWQgcmVzb2x2aW5nIGxpc3Qgc3RhdGUgKi8KLSAgdWludDhfdCogaXJrX2xpc3RfbWFzazsgLyogSVJLIGxpc3QgYXZhaWxhYmlsaXR5IG1hc2ssIHVwIHRvIG1heCBlbnRyeSBiaXRzICovCi0gIHRCVE1fQkxFX1JMX1NUQVRFIHJsX3N0YXRlOyAvKiBSZXNvbHZpbmcgbGlzdCBzdGF0ZSAqLwotCi0gIC8qIGN1cnJlbnQgQkxFIGxpbmsgc3RhdGUgKi8KLSAgdEJUTV9CTEVfU1RBVEVfTUFTSyBjdXJfc3RhdGVzOyAvKiBiaXQgbWFzayBvZiB0QlRNX0JMRV9TVEFURSAqLwotCi0gIHVpbnQ4X3QgbGlua19jb3VudFtrQ2VudHJhbEFuZFBlcmlwaGVyYWxDb3VudF07IC8qIHRvdGFsIGxpbmsgY291bnQgY2VudHJhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcGVyaXBoZXJhbCovCi19IHRCVE1fQkxFX0NCOwotCi0jZW5kaWYgIC8vIEJUTV9CTEVfSU5UX1RZUEVTX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fYmxlX211bHRpX2Fkdi5jYyBiL3N0YWNrL2J0bS9idG1fYmxlX211bHRpX2Fkdi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhZjU3NS4uMDAwMDAwMAotLS0gYS9zdGFjay9idG0vYnRtX2JsZV9tdWx0aV9hZHYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTcgIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAxNCAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2UvbWVtb3J5L3dlYWtfcHRyLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaD4KLSNpbmNsdWRlIDxiYXNlL3RpbWUvdGltZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiYmxlX2FkdmVydGlzZXIuaCIKLSNpbmNsdWRlICJibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJhc2U6OkJpbmQ7Ci11c2luZyBiYXNlOjpUaW1lRGVsdGE7Ci11c2luZyBiYXNlOjpUaW1lVGlja3M7Ci11c2luZyBSZWdpc3RlckNiID0KLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogaW5zdF9pZCAqLywgdWludDhfdCAvKiBzdGF0dXMgKi8pPjsKLXVzaW5nIElkVHhQb3dlclN0YXR1c0NiID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCgKLSAgICB1aW50OF90IC8qIGluc3RfaWQgKi8sIGludDhfdCAvKiB0eF9wb3dlciAqLywgdWludDhfdCAvKiBzdGF0dXMgKi8pPjsKLXVzaW5nIFNldEVuYWJsZURhdGEgPSBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpTZXRFbmFibGVEYXRhOwotZXh0ZXJuIHZvaWQgYnRtX2dlbl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJwYSk+IGNiKTsKLQotY29uc3RleHByIGludCBBRFZfREFUQV9MRU5fTUFYID0gMjUxOwotCi1uYW1lc3BhY2UgewotCi1ib29sIGlzX2Nvbm5lY3RhYmxlKHVpbnQxNl90IGFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMpIHsKLSAgcmV0dXJuIGFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgJiAweDAxOwotfQotCi1zdHJ1Y3QgQWR2ZXJ0aXNpbmdJbnN0YW5jZSB7Ci0gIHVpbnQ4X3QgaW5zdF9pZDsKLSAgYm9vbCBpbl91c2U7Ci0gIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllczsKLSAgYWxhcm1fdCogYWR2X3JhZGRyX3RpbWVyOwotICBpbnQ4X3QgdHhfcG93ZXI7Ci0gIHVpbnQxNl90IGR1cmF0aW9uOyAgLy8gMSB1bml0IGlzIDEwbXMKLSAgdWludDhfdCBtYXhFeHRBZHZFdmVudHM7Ci0gIGFsYXJtX3QqIHRpbWVvdXRfdGltZXI7Ci0gIHVpbnQ4X3Qgb3duX2FkZHJlc3NfdHlwZTsKLSAgUmF3QWRkcmVzcyBvd25fYWRkcmVzczsKLSAgTXVsdGlBZHZDYiB0aW1lb3V0X2NiOwotICBib29sIGFkZHJlc3NfdXBkYXRlX3JlcXVpcmVkOwotICBib29sIHBlcmlvZGljX2VuYWJsZWQ7Ci0gIHVpbnQzMl90IGFkdmVydGlzaW5nX2ludGVydmFsOyAgLy8gMSB1bml0IGlzIDAuNjI1IG1zCi0KLSAgLyogV2hlbiB0cnVlLCBhZHZlcnRpc2luZyBzZXQgaXMgZW5hYmxlZCwgb3IgbGFzdCBzY2hlZHVsZWQgY2FsbCB0byAiTEUgU2V0Ci0gICAqIEV4dGVuZGVkIEFkdmVydGlzaW5nIFNldCBFbmFibGUiIGlzIHRvIGVuYWJsZSB0aGlzIGFkdmVydGlzaW5nIHNldC4gQW55Ci0gICAqIGNvbW1hbmQgc2NoZWR1bGVkIHdoZW4gaW4gdGhpcyBzdGF0ZSB3aWxsIGV4ZWN1dGUgd2hlbiB0aGUgc2V0IGlzIGVuYWJsZWQsCi0gICAqIHVubGVzcyBlbmFibGluZyBmYWlscy4KLSAgICoKLSAgICogV2hlbiBmYWxzZSwgYWR2ZXJ0aXNpbmcgc2V0IGlzIGRpc2FibGVkLCBvciBsYXN0IHNjaGVkdWxlZCBjYWxsIHRvICJMRSBTZXQKLSAgICogRXh0ZW5kZWQgQWR2ZXJ0aXNpbmcgU2V0IEVuYWJsZSIgaXMgdG8gZGlzYWJsZSB0aGlzIGFkdmVydGlzaW5nIHNldC4gQW55Ci0gICAqIGNvbW1hbmQgc2NoZWR1bGVkIHdoZW4gaW4gdGhpcyBzdGF0ZSB3aWxsIGV4ZWN1dGUgd2hlbiB0aGUgc2V0IGlzIGRpc2FibGVkLgotICAgKi8KLSAgYm9vbCBlbmFibGVfc3RhdHVzOwotICBUaW1lVGlja3MgZW5hYmxlX3RpbWU7Ci0KLSAgYm9vbCBJc0VuYWJsZWQoKSB7IHJldHVybiBlbmFibGVfc3RhdHVzOyB9Ci0KLSAgYm9vbCBJc0Nvbm5lY3RhYmxlKCkgeyByZXR1cm4gaXNfY29ubmVjdGFibGUoYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyk7IH0KLQotICBBZHZlcnRpc2luZ0luc3RhbmNlKGludCBpbnN0X2lkKQotICAgICAgOiBpbnN0X2lkKGluc3RfaWQpLAotICAgICAgICBpbl91c2UoZmFsc2UpLAotICAgICAgICBhZHZlcnRpc2luZ19ldmVudF9wcm9wZXJ0aWVzKDApLAotICAgICAgICB0eF9wb3dlcigwKSwKLSAgICAgICAgZHVyYXRpb24oMCksCi0gICAgICAgIHRpbWVvdXRfdGltZXIobnVsbHB0ciksCi0gICAgICAgIG93bl9hZGRyZXNzX3R5cGUoMCksCi0gICAgICAgIG93bl9hZGRyZXNzKFJhd0FkZHJlc3M6OmtFbXB0eSksCi0gICAgICAgIGFkZHJlc3NfdXBkYXRlX3JlcXVpcmVkKGZhbHNlKSwKLSAgICAgICAgcGVyaW9kaWNfZW5hYmxlZChmYWxzZSksCi0gICAgICAgIGVuYWJsZV9zdGF0dXMoZmFsc2UpIHsKLSAgICBhZHZfcmFkZHJfdGltZXIgPSBhbGFybV9uZXdfcGVyaW9kaWMoImJ0bV9ibGUuYWR2X3JhZGRyX3RpbWVyIik7Ci0gIH0KLQotICB+QWR2ZXJ0aXNpbmdJbnN0YW5jZSgpIHsKLSAgICBhbGFybV9mcmVlKGFkdl9yYWRkcl90aW1lcik7Ci0gICAgYWR2X3JhZGRyX3RpbWVyID0gbnVsbHB0cjsKLSAgICBpZiAodGltZW91dF90aW1lcikgewotICAgICAgYWxhcm1fZnJlZSh0aW1lb3V0X3RpbWVyKTsKLSAgICAgIHRpbWVvdXRfdGltZXIgPSBudWxscHRyOwotICAgIH0KLSAgfQotfTsKLQotdm9pZCBidG1fYmxlX2Fkdl9yYWRkcl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotCi1zdHJ1Y3QgY2xvc3VyZV9kYXRhIHsKLSAgYmFzZTo6Q2xvc3VyZSB1c2VyX3Rhc2s7Ci0gIGJhc2U6OkxvY2F0aW9uIHBvc3RlZF9mcm9tOwotfTsKLQotc3RhdGljIHZvaWQgYWxhcm1fY2xvc3VyZV9jYih2b2lkKiBwKSB7Ci0gIGNsb3N1cmVfZGF0YSogZGF0YSA9IChjbG9zdXJlX2RhdGEqKXA7Ci0gIFZMT0coMSkgPDwgImV4ZWN1dGluZyB0aW1lciBzY2hlZHVsZWQgYXQgJXMiIDw8IGRhdGEtPnBvc3RlZF9mcm9tLlRvU3RyaW5nKCk7Ci0gIGRhdGEtPnVzZXJfdGFzay5SdW4oKTsKLSAgZGVsZXRlIGRhdGE7Ci19Ci0KLS8vIFBlcmlvZGljIGFsYXJtcyBhcmUgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSB3ZSBjbGVhbiB1cCBkYXRhIGluIGNhbGxiYWNrCi1zdGF0aWMgdm9pZCBhbGFybV9zZXRfY2xvc3VyZShjb25zdCBiYXNlOjpMb2NhdGlvbiYgcG9zdGVkX2Zyb20sIGFsYXJtX3QqIGFsYXJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaW50ZXJ2YWxfbXMsIGJhc2U6OkNsb3N1cmUgdXNlcl90YXNrKSB7Ci0gIGNsb3N1cmVfZGF0YSogZGF0YSA9IG5ldyBjbG9zdXJlX2RhdGE7Ci0gIGRhdGEtPnBvc3RlZF9mcm9tID0gcG9zdGVkX2Zyb207Ci0gIGRhdGEtPnVzZXJfdGFzayA9IHN0ZDo6bW92ZSh1c2VyX3Rhc2spOwotICBWTE9HKDEpIDw8ICJzY2hlZHVsaW5nIHRpbWVyICVzIiA8PCBkYXRhLT5wb3N0ZWRfZnJvbS5Ub1N0cmluZygpOwotICBhbGFybV9zZXRfb25fbWxvb3AoYWxhcm0sIGludGVydmFsX21zLCBhbGFybV9jbG9zdXJlX2NiLCBkYXRhKTsKLX0KLQotY2xhc3MgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbDsKLQotLyogYSB0ZW1wb3JhcnkgdHlwZSBmb3IgaG9sZGluZyBhbGwgdGhlIGRhdGEgbmVlZGVkIGluIGNhbGxiYWNrcyBiZWxvdyovCi1zdHJ1Y3QgQ3JlYXRvclBhcmFtcyB7Ci0gIHVpbnQ4X3QgaW5zdF9pZDsKLSAgYmFzZTo6V2Vha1B0cjxCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsPiBzZWxmOwotICBJZFR4UG93ZXJTdGF0dXNDYiBjYjsKLSAgdEJUTV9CTEVfQURWX1BBUkFNUyBwYXJhbXM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3BvbnNlX2RhdGE7Ci0gIHRCTEVfUEVSSU9ESUNfQURWX1BBUkFNUyBwZXJpb2RpY19wYXJhbXM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlcmlvZGljX2RhdGE7Ci0gIHVpbnQxNl90IGR1cmF0aW9uOwotICB1aW50OF90IG1heEV4dEFkdkV2ZW50czsKLSAgUmVnaXN0ZXJDYiB0aW1lb3V0X2NiOwotfTsKLQotdXNpbmcgY190eXBlID0gc3RkOjp1bmlxdWVfcHRyPENyZWF0b3JQYXJhbXM+OwotCi1CbGVBZHZlcnRpc2luZ01hbmFnZXIqIGluc3RhbmNlOwotYmFzZTo6V2Vha1B0cjxCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsPiBpbnN0YW5jZV93ZWFrcHRyOwotCi1jbGFzcyBCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsCi0gICAgOiBwdWJsaWMgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyLAotICAgICAgcHVibGljIEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OkFkdmVydGlzaW5nRXZlbnRPYnNlcnZlciB7Ci0gcHVibGljOgotICBCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsKEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2UqIGludGVyZmFjZSkKLSAgICAgIDogaGNpX2ludGVyZmFjZShpbnRlcmZhY2UpLCB3ZWFrX2ZhY3RvcnlfKHRoaXMpIHsKLSAgICBoY2lfaW50ZXJmYWNlLT5SZWFkSW5zdGFuY2VDb3VudCgKLSAgICAgICAgYmFzZTo6QmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbDo6UmVhZEluc3RhbmNlQ291bnRDYiwKLSAgICAgICAgICAgICAgICAgICB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSkpOwotICB9Ci0KLSAgfkJsZUFkdmVydGlzaW5nTWFuYWdlckltcGwoKSBvdmVycmlkZSB7IGFkdl9pbnN0LmNsZWFyKCk7IH0KLQotICB2b2lkIEdldE93bkFkZHJlc3ModWludDhfdCBpbnN0X2lkLCBHZXRBZGRyZXNzQ2FsbGJhY2sgY2IpIG92ZXJyaWRlIHsKLSAgICBjYi5SdW4oYWR2X2luc3RbaW5zdF9pZF0ub3duX2FkZHJlc3NfdHlwZSwgYWR2X2luc3RbaW5zdF9pZF0ub3duX2FkZHJlc3MpOwotICB9Ci0KLSAgdm9pZCBSZWFkSW5zdGFuY2VDb3VudENiKHVpbnQ4X3QgaW5zdGFuY2VfY291bnQpIHsKLSAgICB0aGlzLT5pbnN0X2NvdW50ID0gaW5zdGFuY2VfY291bnQ7Ci0gICAgYWR2X2luc3QucmVzZXJ2ZShpbnN0X2NvdW50KTsKLSAgICAvKiBJbml0aWFsaXplIGFkdiBpbnN0YW5jZSBpbmRpY2VzIGFuZCBJRHMuICovCi0gICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgaW5zdF9jb3VudDsgaSsrKSB7Ci0gICAgICBhZHZfaW5zdC5lbXBsYWNlX2JhY2soaSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBHZW5lcmF0ZVJwYShiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmKT4gY2IpIHsKLSAgICBidG1fZ2VuX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyKHN0ZDo6bW92ZShjYikpOwotICB9Ci0KLSAgdm9pZCBDb25maWd1cmVScGEoQWR2ZXJ0aXNpbmdJbnN0YW5jZSogcF9pbnN0LCBNdWx0aUFkdkNiIGNvbmZpZ3VyZWRDYikgewotICAgIC8qIENvbm5lY3RhYmxlIGFkdmVydGlzaW5nIHNldCBtdXN0IGJlIGRpc2FibGVkIHdoZW4gdXBkYXRpbmcgUlBBICovCi0gICAgYm9vbCByZXN0YXJ0ID0gcF9pbnN0LT5Jc0VuYWJsZWQoKSAmJiBwX2luc3QtPklzQ29ubmVjdGFibGUoKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIGFueSBmb3JtIG9mIHRpbWVvdXQgb24gdGhlIHNldCwgc2NoZWR1bGUgYWRkcmVzcyB1cGRhdGUgd2hlbgotICAgIC8vIHRoZSBzZXQgc3RvcHMsIGJlY2F1c2UgdGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gY29tcHV0ZSBuZXcgdGltZW91dCB2YWx1ZS4KLSAgICAvLyBNYXhpbXVtIGR1cmF0aW9uIHZhbHVlIGlzIGFyb3VuZCAxMCBtaW51dGVzLCBzbyB0aGlzIGlzIHNhZmUuCi0gICAgaWYgKHJlc3RhcnQgJiYgKHBfaW5zdC0+ZHVyYXRpb24gfHwgcF9pbnN0LT5tYXhFeHRBZHZFdmVudHMpKSB7Ci0gICAgICBwX2luc3QtPmFkZHJlc3NfdXBkYXRlX3JlcXVpcmVkID0gdHJ1ZTsKLSAgICAgIGNvbmZpZ3VyZWRDYi5SdW4oMHgwMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR2VuZXJhdGVScGEoQmluZCgKLSAgICAgICAgW10oQWR2ZXJ0aXNpbmdJbnN0YW5jZSogcF9pbnN0LCBNdWx0aUFkdkNiIGNvbmZpZ3VyZWRDYiwKLSAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gICAgICAgICAgLyogQ29ubmVjdGFibGUgYWR2ZXJ0aXNpbmcgc2V0IG11c3QgYmUgZGlzYWJsZWQgd2hlbiB1cGRhdGluZyBSUEEgKi8KLSAgICAgICAgICBib29sIHJlc3RhcnQgPSBwX2luc3QtPklzRW5hYmxlZCgpICYmIHBfaW5zdC0+SXNDb25uZWN0YWJsZSgpOwotCi0gICAgICAgICAgaWYgKCFpbnN0YW5jZV93ZWFrcHRyLmdldCgpKSByZXR1cm47Ci0gICAgICAgICAgYXV0byBoY2lfaW50ZXJmYWNlID0gaW5zdGFuY2Vfd2Vha3B0ci5nZXQoKS0+R2V0SGNpSW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgICBpZiAocmVzdGFydCkgewotICAgICAgICAgICAgcF9pbnN0LT5lbmFibGVfc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICBoY2lfaW50ZXJmYWNlLT5FbmFibGUoZmFsc2UsIHBfaW5zdC0+aW5zdF9pZCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogc2V0IGl0IHRvIGNvbnRyb2xsZXIgKi8KLSAgICAgICAgICBoY2lfaW50ZXJmYWNlLT5TZXRSYW5kb21BZGRyZXNzKAotICAgICAgICAgICAgICBwX2luc3QtPmluc3RfaWQsIGJkYSwKLSAgICAgICAgICAgICAgQmluZCgKLSAgICAgICAgICAgICAgICAgIFtdKEFkdmVydGlzaW5nSW5zdGFuY2UqIHBfaW5zdCwgUmF3QWRkcmVzcyBiZGEsCi0gICAgICAgICAgICAgICAgICAgICBNdWx0aUFkdkNiIGNvbmZpZ3VyZWRDYiwgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcF9pbnN0LT5vd25fYWRkcmVzcyA9IGJkYTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZENiLlJ1bigweDAwKTsKLSAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICBwX2luc3QsIGJkYSwgY29uZmlndXJlZENiKSk7Ci0KLSAgICAgICAgICBpZiAocmVzdGFydCkgewotICAgICAgICAgICAgcF9pbnN0LT5lbmFibGVfc3RhdHVzID0gdHJ1ZTsKLSAgICAgICAgICAgIGhjaV9pbnRlcmZhY2UtPkVuYWJsZSh0cnVlLCBwX2luc3QtPmluc3RfaWQsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgcF9pbnN0LCBzdGQ6Om1vdmUoY29uZmlndXJlZENiKSkpOwotICB9Ci0KLSAgdm9pZCBSZWdpc3RlckFkdmVydGlzZXIoCi0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogaW5zdF9pZCAqLywgdWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYikKLSAgICAgIG92ZXJyaWRlIHsKLSAgICBBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QgPSAmYWR2X2luc3RbMF07Ci0gICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgaW5zdF9jb3VudDsgaSsrLCBwX2luc3QrKykgewotICAgICAgaWYgKHBfaW5zdC0+aW5fdXNlKSBjb250aW51ZTsKLQotICAgICAgcF9pbnN0LT5pbl91c2UgPSB0cnVlOwotCi0gICAgICAvLyBzZXQgdXAgcGVyaW9kaWMgdGltZXIgdG8gdXBkYXRlIGFkZHJlc3MuCi0gICAgICBpZiAoQlRNX0JsZUxvY2FsUHJpdmFjeUVuYWJsZWQoKSkgewotICAgICAgICBwX2luc3QtPm93bl9hZGRyZXNzX3R5cGUgPSBCTEVfQUREUl9SQU5ET007Ci0gICAgICAgIEdlbmVyYXRlUnBhKEJpbmQoCi0gICAgICAgICAgICBbXShBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QsCi0gICAgICAgICAgICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogaW5zdF9pZCAqLywgdWludDhfdCAvKiBzdGF0dXMgKi8pPgotICAgICAgICAgICAgICAgICAgIGNiLAotICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gICAgICAgICAgICAgIHBfaW5zdC0+b3duX2FkZHJlc3MgPSBiZGE7Ci0KLSAgICAgICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfaW5zdC0+YWR2X3JhZGRyX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRtX2dldF9uZXh0X3ByaXZhdGVfYWRkcnJlc3NfaW50ZXJ2YWxfbXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9ibGVfYWR2X3JhZGRyX3RpbWVyX3RpbWVvdXQsIHBfaW5zdCk7Ci0gICAgICAgICAgICAgIGNiLlJ1bihwX2luc3QtPmluc3RfaWQsIEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MpOwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHBfaW5zdCwgY2IpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfaW5zdC0+b3duX2FkZHJlc3NfdHlwZSA9IEJMRV9BRERSX1BVQkxJQzsKLSAgICAgICAgcF9pbnN0LT5vd25fYWRkcmVzcyA9ICpjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FkZHJlc3MoKTsKLQotICAgICAgICBjYi5SdW4ocF9pbnN0LT5pbnN0X2lkLCBCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgIm5vIGZyZWUgYWR2ZXJ0aXNlciBpbnN0YW5jZSI7Ci0gICAgY2IuUnVuKDB4RkYsIEFEVkVSVElTRV9GQUlMRURfVE9PX01BTllfQURWRVJUSVNFUlMpOwotICB9Ci0KLSAgdm9pZCBTdGFydEFkdmVydGlzaW5nKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgTXVsdGlBZHZDYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0FEVl9QQVJBTVMqIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLCBpbnQgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUFkdkNiIHRpbWVvdXRfY2IpIG92ZXJyaWRlIHsKLSAgICAvKiBhIHRlbXBvcmFyeSB0eXBlIGZvciBob2xkaW5nIGFsbCB0aGUgZGF0YSBuZWVkZWQgaW4gY2FsbGJhY2tzIGJlbG93Ki8KLSAgICBzdHJ1Y3QgQ3JlYXRvclBhcmFtcyB7Ci0gICAgICB1aW50OF90IGluc3RfaWQ7Ci0gICAgICBiYXNlOjpXZWFrUHRyPEJsZUFkdmVydGlzaW5nTWFuYWdlckltcGw+IHNlbGY7Ci0gICAgICBNdWx0aUFkdkNiIGNiOwotICAgICAgdEJUTV9CTEVfQURWX1BBUkFNUyBwYXJhbXM7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YTsKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2VfZGF0YTsKLSAgICAgIGludCBkdXJhdGlvbjsKLSAgICAgIE11bHRpQWR2Q2IgdGltZW91dF9jYjsKLSAgICB9OwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENyZWF0b3JQYXJhbXM+IGM7Ci0gICAgYy5yZXNldChuZXcgQ3JlYXRvclBhcmFtcygpKTsKLQotICAgIGMtPnNlbGYgPSB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKLSAgICBjLT5jYiA9IHN0ZDo6bW92ZShjYik7Ci0gICAgYy0+cGFyYW1zID0gKnBhcmFtczsKLSAgICBjLT5hZHZlcnRpc2VfZGF0YSA9IHN0ZDo6bW92ZShhZHZlcnRpc2VfZGF0YSk7Ci0gICAgYy0+c2Nhbl9yZXNwb25zZV9kYXRhID0gc3RkOjptb3ZlKHNjYW5fcmVzcG9uc2VfZGF0YSk7Ci0gICAgYy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICBjLT50aW1lb3V0X2NiID0gc3RkOjptb3ZlKHRpbWVvdXRfY2IpOwotICAgIGMtPmluc3RfaWQgPSBhZHZlcnRpc2VyX2lkOwotCi0gICAgdXNpbmcgY190eXBlID0gc3RkOjp1bmlxdWVfcHRyPENyZWF0b3JQYXJhbXM+OwotCi0gICAgLy8gdGhpcyBjb2RlIGlzIGludGVudGlvbmFsbHkgbGVmdCBmb3JtYXR0ZWQgdGhpcyB3YXkgdG8gaGlnaGxpZ2h0IHRoZQotICAgIC8vIGFzeW5jaHJvbm91cyBmbG93Ci0gICAgLy8gY2xhbmctZm9ybWF0IG9mZgotICAgIGMtPnNlbGYtPlNldFBhcmFtZXRlcnMoYy0+aW5zdF9pZCwgJmMtPnBhcmFtcywgQmluZCgKLSAgICAgIFtdKGNfdHlwZSBjLCB1aW50OF90IHN0YXR1cywgaW50OF90IHR4X3Bvd2VyKSB7Ci0gICAgICAgIGlmICghYy0+c2VsZikgewotICAgICAgICAgIExPRyhJTkZPKSA8PCAiU3RhY2sgd2FzIHNodXQgZG93biI7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgInNldHRpbmcgcGFyYW1ldGVycyBmYWlsZWQsIHN0YXR1czogIiA8PCArc3RhdHVzOwotICAgICAgICAgIGMtPmNiLlJ1bihzdGF0dXMpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGMtPnNlbGYtPmFkdl9pbnN0W2MtPmluc3RfaWRdLnR4X3Bvd2VyID0gdHhfcG93ZXI7Ci0KLSAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcnBhID0gYy0+c2VsZi0+YWR2X2luc3RbYy0+aW5zdF9pZF0ub3duX2FkZHJlc3M7Ci0gICAgICAgIGMtPnNlbGYtPkdldEhjaUludGVyZmFjZSgpLT5TZXRSYW5kb21BZGRyZXNzKGMtPmluc3RfaWQsIHJwYSwgQmluZCgKLSAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmICghYy0+c2VsZikgewotICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YWNrIHdhcyBzaHV0IGRvd24iOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZXR0aW5nIHJhbmRvbSBhZGRyZXNzIGZhaWxlZCwgc3RhdHVzOiAiIDw8ICtzdGF0dXM7Ci0gICAgICAgICAgICAgIGMtPmNiLlJ1bihzdGF0dXMpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGMtPnNlbGYtPlNldERhdGEoYy0+aW5zdF9pZCwgZmFsc2UsIHN0ZDo6bW92ZShjLT5hZHZlcnRpc2VfZGF0YSksIEJpbmQoCi0gICAgICAgICAgICAgIFtdKGNfdHlwZSBjLCB1aW50OF90IHN0YXR1cykgewotICAgICAgICAgICAgICAgIGlmICghYy0+c2VsZikgewotICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTdGFjayB3YXMgc2h1dCBkb3duIjsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInNldHRpbmcgYWR2ZXJ0aXNlIGRhdGEgZmFpbGVkLCBzdGF0dXM6ICIgPDwgK3N0YXR1czsKLSAgICAgICAgICAgICAgICAgIGMtPmNiLlJ1bihzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGMtPnNlbGYtPlNldERhdGEoYy0+aW5zdF9pZCwgdHJ1ZSwgc3RkOjptb3ZlKGMtPnNjYW5fcmVzcG9uc2VfZGF0YSksIEJpbmQoCi0gICAgICAgICAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjLT5zZWxmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTdGFjayB3YXMgc2h1dCBkb3duIjsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZXR0aW5nIHNjYW4gcmVzcG9uc2UgZGF0YSBmYWlsZWQsIHN0YXR1czogIiA8PCArc3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgIGMtPmNiLlJ1bihzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGMtPnNlbGYtPkVuYWJsZShjLT5pbnN0X2lkLCB0cnVlLCBjLT5jYiwgYy0+ZHVyYXRpb24sIDAsIHN0ZDo6bW92ZShjLT50aW1lb3V0X2NiKSk7Ci0KLSAgICAgICAgICAgICAgICB9LCBiYXNlOjpQYXNzZWQoJmMpKSk7Ci0gICAgICAgICAgICB9LCBiYXNlOjpQYXNzZWQoJmMpKSk7Ci0gICAgICAgIH0sIGJhc2U6OlBhc3NlZCgmYykpKTsKLSAgICB9LCBiYXNlOjpQYXNzZWQoJmMpKSk7Ci0gICAgLy8gY2xhbmctZm9ybWF0IG9uCi0gIH0KLQotICB2b2lkIFN0YXJ0QWR2ZXJ0aXNpbmdTZXQoSWRUeFBvd2VyU3RhdHVzQ2IgY2IsIHRCVE1fQkxFX0FEVl9QQVJBTVMqIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9QRVJJT0RJQ19BRFZfUEFSQU1TKiBwZXJpb2RpY19wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwZXJpb2RpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb24sIHVpbnQ4X3QgbWF4RXh0QWR2RXZlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJDYiB0aW1lb3V0X2NiKSBvdmVycmlkZSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENyZWF0b3JQYXJhbXM+IGM7Ci0gICAgYy5yZXNldChuZXcgQ3JlYXRvclBhcmFtcygpKTsKLQotICAgIGMtPnNlbGYgPSB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKLSAgICBjLT5jYiA9IHN0ZDo6bW92ZShjYik7Ci0gICAgYy0+cGFyYW1zID0gKnBhcmFtczsKLSAgICBjLT5hZHZlcnRpc2VfZGF0YSA9IHN0ZDo6bW92ZShhZHZlcnRpc2VfZGF0YSk7Ci0gICAgYy0+c2Nhbl9yZXNwb25zZV9kYXRhID0gc3RkOjptb3ZlKHNjYW5fcmVzcG9uc2VfZGF0YSk7Ci0gICAgYy0+cGVyaW9kaWNfcGFyYW1zID0gKnBlcmlvZGljX3BhcmFtczsKLSAgICBjLT5wZXJpb2RpY19kYXRhID0gc3RkOjptb3ZlKHBlcmlvZGljX2RhdGEpOwotICAgIGMtPmR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgYy0+bWF4RXh0QWR2RXZlbnRzID0gbWF4RXh0QWR2RXZlbnRzOwotICAgIGMtPnRpbWVvdXRfY2IgPSBzdGQ6Om1vdmUodGltZW91dF9jYik7Ci0KLSAgICAvLyB0aGlzIGNvZGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGZvcm1hdHRlZCB0aGlzIHdheSB0byBoaWdobGlnaHQgdGhlCi0gICAgLy8gYXN5bmNocm9ub3VzIGZsb3cKLSAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCi0gICAgYy0+c2VsZi0+UmVnaXN0ZXJBZHZlcnRpc2VyKEJpbmQoCi0gICAgICBbXShjX3R5cGUgYywgdWludDhfdCBhZHZlcnRpc2VyX2lkLCB1aW50OF90IHN0YXR1cykgewotICAgICAgICBpZiAoIWMtPnNlbGYpIHsKLSAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YWNrIHdhcyBzaHV0IGRvd24iOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgIiBmYWlsZWQsIHN0YXR1czogIiA8PCArc3RhdHVzOwotICAgICAgICAgIGMtPmNiLlJ1bigwLCAwLCBzdGF0dXMpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGMtPmluc3RfaWQgPSBhZHZlcnRpc2VyX2lkOwotCi0gICAgICAgIGMtPnNlbGYtPlNldFBhcmFtZXRlcnMoYy0+aW5zdF9pZCwgJmMtPnBhcmFtcywgQmluZCgKLSAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMsIGludDhfdCB0eF9wb3dlcikgewotICAgICAgICAgICAgaWYgKCFjLT5zZWxmKSB7Ci0gICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiU3RhY2sgd2FzIHNodXQgZG93biI7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICAgICAgIGMtPnNlbGYtPlVucmVnaXN0ZXIoYy0+aW5zdF9pZCk7Ci0gICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInNldHRpbmcgcGFyYW1ldGVycyBmYWlsZWQsIHN0YXR1czogIiA8PCArc3RhdHVzOwotICAgICAgICAgICAgICBjLT5jYi5SdW4oMCwgMCwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjLT5zZWxmLT5hZHZfaW5zdFtjLT5pbnN0X2lkXS50eF9wb3dlciA9IHR4X3Bvd2VyOwotCi0gICAgICAgICAgICBpZiAoYy0+c2VsZi0+YWR2X2luc3RbYy0+aW5zdF9pZF0ub3duX2FkZHJlc3NfdHlwZSA9PSBCTEVfQUREUl9QVUJMSUMpIHsKLSAgICAgICAgICAgICAgYXV0byBzZWxmID0gYy0+c2VsZjsKLSAgICAgICAgICAgICAgc2VsZi0+U3RhcnRBZHZlcnRpc2luZ1NldEFmdGVyQWRkcmVzc1BhcnQoc3RkOjptb3ZlKGMpKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL293bl9hZGRyZXNzX3R5cGUgPT0gQkxFX0FERFJfUkFORE9NCi0gICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBycGEgPSBjLT5zZWxmLT5hZHZfaW5zdFtjLT5pbnN0X2lkXS5vd25fYWRkcmVzczsKLSAgICAgICAgICAgIGMtPnNlbGYtPkdldEhjaUludGVyZmFjZSgpLT5TZXRSYW5kb21BZGRyZXNzKGMtPmluc3RfaWQsIHJwYSwgQmluZCgKLSAgICAgICAgICAgICAgW10oY190eXBlIGMsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjLT5zZWxmKSB7Ci0gICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YWNrIHdhcyBzaHV0IGRvd24iOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgYy0+c2VsZi0+VW5yZWdpc3RlcihjLT5pbnN0X2lkKTsKLSAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInNldHRpbmcgcmFuZG9tIGFkZHJlc3MgZmFpbGVkLCBzdGF0dXM6ICIgPDwgK3N0YXR1czsKLSAgICAgICAgICAgICAgICAgIGMtPmNiLlJ1bigwLCAwLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF1dG8gc2VsZiA9IGMtPnNlbGY7Ci0gICAgICAgICAgICAgICAgc2VsZi0+U3RhcnRBZHZlcnRpc2luZ1NldEFmdGVyQWRkcmVzc1BhcnQoc3RkOjptb3ZlKGMpKTsKLSAgICAgICAgICB9LCBiYXNlOjpQYXNzZWQoJmMpKSk7Ci0gICAgICAgIH0sIGJhc2U6OlBhc3NlZCgmYykpKTsKLSAgICB9LCBiYXNlOjpQYXNzZWQoJmMpKSk7Ci0gICAgLy8gY2xhbmctZm9ybWF0IG9uCi0gIH0KLQotICB2b2lkIFN0YXJ0QWR2ZXJ0aXNpbmdTZXRBZnRlckFkZHJlc3NQYXJ0KGNfdHlwZSBjKSB7Ci0gICAgYy0+c2VsZi0+U2V0RGF0YSgKLSAgICAgICAgYy0+aW5zdF9pZCwgZmFsc2UsIHN0ZDo6bW92ZShjLT5hZHZlcnRpc2VfZGF0YSksCi0gICAgICAgIEJpbmQoCi0gICAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgaWYgKCFjLT5zZWxmKSB7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTdGFjayB3YXMgc2h1dCBkb3duIjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgICAgICBjLT5zZWxmLT5VbnJlZ2lzdGVyKGMtPmluc3RfaWQpOwotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInNldHRpbmcgYWR2ZXJ0aXNlIGRhdGEgZmFpbGVkLCBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICtzdGF0dXM7Ci0gICAgICAgICAgICAgICAgYy0+Y2IuUnVuKDAsIDAsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgYy0+c2VsZi0+U2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgIGMtPmluc3RfaWQsIHRydWUsIHN0ZDo6bW92ZShjLT5zY2FuX3Jlc3BvbnNlX2RhdGEpLAotICAgICAgICAgICAgICAgICAgQmluZCgKLSAgICAgICAgICAgICAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy0+c2VsZikgewotICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YWNrIHdhcyBzaHV0IGRvd24iOwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zZWxmLT5VbnJlZ2lzdGVyKGMtPmluc3RfaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic2V0dGluZyBzY2FuIHJlc3BvbnNlIGRhdGEgZmFpbGVkLCBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICtzdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNiLlJ1bigwLCAwLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gc2VsZiA9IGMtPnNlbGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy0+cGVyaW9kaWNfcGFyYW1zLmVuYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5TdGFydEFkdmVydGlzaW5nU2V0UGVyaW9kaWNQYXJ0KHN0ZDo6bW92ZShjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5TdGFydEFkdmVydGlzaW5nU2V0RmluaXNoKHN0ZDo6bW92ZShjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpQYXNzZWQoJmMpKSk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZjKSkpOwotICB9Ci0KLSAgdm9pZCBTdGFydEFkdmVydGlzaW5nU2V0UGVyaW9kaWNQYXJ0KGNfdHlwZSBjKSB7Ci0gICAgLy8gdGhpcyBjb2RlIGlzIGludGVudGlvbmFsbHkgbGVmdCBmb3JtYXR0ZWQgdGhpcyB3YXkgdG8gaGlnaGxpZ2h0IHRoZQotICAgIC8vIGFzeW5jaHJvbm91cyBmbG93Ci0gICAgLy8gY2xhbmctZm9ybWF0IG9mZgotICAgIGMtPnNlbGYtPlNldFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKGMtPmluc3RfaWQsICZjLT5wZXJpb2RpY19wYXJhbXMsIEJpbmQoCi0gICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgaWYgKCFjLT5zZWxmKSB7Ci0gICAgICAgICAgTE9HKElORk8pIDw8ICJTdGFjayB3YXMgc2h1dCBkb3duIjsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICBjLT5zZWxmLT5VbnJlZ2lzdGVyKGMtPmluc3RfaWQpOwotICAgICAgICAgIExPRyhFUlJPUikgPDwgInNldHRpbmcgcGVyaW9kaWMgcGFyYW1ldGVycyBmYWlsZWQsIHN0YXR1czogIiA8PCArc3RhdHVzOwotICAgICAgICAgIGMtPmNiLlJ1bigwLCAwLCBzdGF0dXMpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGMtPnNlbGYtPlNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhKGMtPmluc3RfaWQsIHN0ZDo6bW92ZShjLT5wZXJpb2RpY19kYXRhKSwgQmluZCgKLSAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmICghYy0+c2VsZikgewotICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YWNrIHdhcyBzaHV0IGRvd24iOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgICBjLT5zZWxmLT5VbnJlZ2lzdGVyKGMtPmluc3RfaWQpOwotICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZXR0aW5nIHBlcmlvZGljIHBhcmFtZXRlcnMgZmFpbGVkLCBzdGF0dXM6ICIgPDwgK3N0YXR1czsKLSAgICAgICAgICAgICAgYy0+Y2IuUnVuKDAsIDAsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYy0+c2VsZi0+U2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZShjLT5pbnN0X2lkLCB0cnVlLCBCaW5kKAotICAgICAgICAgICAgICBbXShjX3R5cGUgYywgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWMtPnNlbGYpIHsKLSAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiU3RhY2sgd2FzIHNodXQgZG93biI7Ci0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICBjLT5zZWxmLT5VbnJlZ2lzdGVyKGMtPmluc3RfaWQpOwotICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZW5hYmxpbmcgcGVyaW9kaWMgYWR2ZXJ0aXNpbmcgZmFpbGVkLCBzdGF0dXM6ICIgPDwgK3N0YXR1czsKLSAgICAgICAgICAgICAgICAgIGMtPmNiLlJ1bigwLCAwLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF1dG8gc2VsZiA9IGMtPnNlbGY7Ci0gICAgICAgICAgICAgICAgc2VsZi0+U3RhcnRBZHZlcnRpc2luZ1NldEZpbmlzaChzdGQ6Om1vdmUoYykpOwotCi0gICAgICAgICAgICAgIH0sIGJhc2U6OlBhc3NlZCgmYykpKTsKLSAgICAgICAgfSwgYmFzZTo6UGFzc2VkKCZjKSkpOwotICAgIH0sIGJhc2U6OlBhc3NlZCgmYykpKTsKLSAgICAvLyBjbGFuZy1mb3JtYXQgb24KLSAgfQotCi0gIHZvaWQgU3RhcnRBZHZlcnRpc2luZ1NldEZpbmlzaChjX3R5cGUgYykgewotICAgIHVpbnQ4X3QgaW5zdF9pZCA9IGMtPmluc3RfaWQ7Ci0gICAgdWludDE2X3QgZHVyYXRpb24gPSBjLT5kdXJhdGlvbjsKLSAgICB1aW50OF90IG1heEV4dEFkdkV2ZW50cyA9IGMtPm1heEV4dEFkdkV2ZW50czsKLSAgICBSZWdpc3RlckNiIHRpbWVvdXRfY2IgPSBzdGQ6Om1vdmUoYy0+dGltZW91dF9jYik7Ci0gICAgYmFzZTo6V2Vha1B0cjxCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsPiBzZWxmID0gYy0+c2VsZjsKLSAgICBNdWx0aUFkdkNiIGVuYWJsZV9jYiA9IEJpbmQoCi0gICAgICAgIFtdKGNfdHlwZSBjLCB1aW50OF90IHN0YXR1cykgewotICAgICAgICAgIGlmICghYy0+c2VsZikgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTdGFjayB3YXMgc2h1dCBkb3duIjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgIGMtPnNlbGYtPlVucmVnaXN0ZXIoYy0+aW5zdF9pZCk7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJlbmFibGluZyBhZHZlcnRpc2VyIGZhaWxlZCwgc3RhdHVzOiAiIDw8ICtzdGF0dXM7Ci0gICAgICAgICAgICBjLT5jYi5SdW4oMCwgMCwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50OF90IHR4X3Bvd2VyID0gYy0+c2VsZi0+YWR2X2luc3RbYy0+aW5zdF9pZF0udHhfcG93ZXI7Ci0gICAgICAgICAgYy0+Y2IuUnVuKGMtPmluc3RfaWQsIHR4X3Bvd2VyLCBzdGF0dXMpOwotICAgICAgICB9LAotICAgICAgICBiYXNlOjpQYXNzZWQoJmMpKTsKLQotICAgIHNlbGYtPkVuYWJsZShpbnN0X2lkLCB0cnVlLCBzdGQ6Om1vdmUoZW5hYmxlX2NiKSwgZHVyYXRpb24sIG1heEV4dEFkdkV2ZW50cywKLSAgICAgICAgICAgICAgICAgQmluZChzdGQ6Om1vdmUodGltZW91dF9jYiksIGluc3RfaWQpKTsKLSAgfQotCi0gIHZvaWQgRW5hYmxlV2l0aFRpbWVyQ2IodWludDhfdCBpbnN0X2lkLCBNdWx0aUFkdkNiIGVuYWJsZV9jYiwgaW50IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgdGltZW91dF9jYiwgdWludDhfdCBzdGF0dXMpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdF9pZDogIiA8PCAraW5zdF9pZDsKLSAgICBBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QgPSAmYWR2X2luc3RbaW5zdF9pZF07Ci0KLSAgICAvLyBSdW4gdGhlIHJlZ3VsYXIgZW5hYmxlIGNhbGxiYWNrCi0gICAgZW5hYmxlX2NiLlJ1bihzdGF0dXMpOwotCi0gICAgcF9pbnN0LT50aW1lb3V0X3RpbWVyID0gYWxhcm1fbmV3KCJidG1fYmxlLmFkdl90aW1lb3V0Iik7Ci0KLSAgICBiYXNlOjpDbG9zdXJlIGNiID0gQmluZCgKLSAgICAgICAgJkJsZUFkdmVydGlzaW5nTWFuYWdlckltcGw6OkVuYWJsZSwgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIGluc3RfaWQsCi0gICAgICAgIDAgLyogZGlzYWJsZSAqLywgc3RkOjptb3ZlKHRpbWVvdXRfY2IpLCAwLCAwLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci0KLSAgICAvLyBzY2hlZHVsZSBkaXNhYmxlIHdoZW4gdGhlIHRpbWVvdXQgcGFzc2VzCi0gICAgYWxhcm1fc2V0X2Nsb3N1cmUoRlJPTV9IRVJFLCBwX2luc3QtPnRpbWVvdXRfdGltZXIsIGR1cmF0aW9uICogMTAsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSk7Ci0gIH0KLQotICB2b2lkIEVuYWJsZSh1aW50OF90IGluc3RfaWQsIGJvb2wgZW5hYmxlLCBNdWx0aUFkdkNiIGNiLCB1aW50MTZfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgdWludDhfdCBtYXhFeHRBZHZFdmVudHMsIE11bHRpQWR2Q2IgdGltZW91dF9jYikgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBpbnN0X2lkOiAiIDw8ICtpbnN0X2lkOwotICAgIGlmIChpbnN0X2lkID49IGluc3RfY291bnQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgImJhZCBpbnN0YW5jZSBpZCAiIDw8ICtpbnN0X2lkOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFkdmVydGlzaW5nSW5zdGFuY2UqIHBfaW5zdCA9ICZhZHZfaW5zdFtpbnN0X2lkXTsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgZW5hYmxlOiAiIDw8IGVuYWJsZSA8PCAiLCBkdXJhdGlvbjogIiA8PCArZHVyYXRpb247Ci0gICAgaWYgKCFwX2luc3QtPmluX3VzZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBvciBubyBhY3RpdmUgaW5zdGFuY2UiOwotICAgICAgY2IuUnVuKEJUTV9CTEVfTVVMVElfQURWX0ZBSUxVUkUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChlbmFibGUgJiYgKGR1cmF0aW9uIHx8IG1heEV4dEFkdkV2ZW50cykpIHsKLSAgICAgIHBfaW5zdC0+dGltZW91dF9jYiA9IHN0ZDo6bW92ZSh0aW1lb3V0X2NiKTsKLSAgICB9Ci0KLSAgICBwX2luc3QtPmR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgcF9pbnN0LT5tYXhFeHRBZHZFdmVudHMgPSBtYXhFeHRBZHZFdmVudHM7Ci0KLSAgICBpZiAoZW5hYmxlICYmIHBfaW5zdC0+YWRkcmVzc191cGRhdGVfcmVxdWlyZWQpIHsKLSAgICAgIHBfaW5zdC0+YWRkcmVzc191cGRhdGVfcmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgIENvbmZpZ3VyZVJwYShwX2luc3QsIGJhc2U6OkJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlckltcGw6OkVuYWJsZUZpbmlzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCksIHBfaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlLCBzdGQ6Om1vdmUoY2IpKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRW5hYmxlRmluaXNoKHBfaW5zdCwgZW5hYmxlLCBzdGQ6Om1vdmUoY2IpLCAwKTsKLSAgfQotCi0gIHZvaWQgRW5hYmxlRmluaXNoKEFkdmVydGlzaW5nSW5zdGFuY2UqIHBfaW5zdCwgYm9vbCBlbmFibGUsIE11bHRpQWR2Q2IgY2IsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgTXVsdGlBZHZDYiBteUNiOwotICAgIGlmIChlbmFibGUgJiYgcF9pbnN0LT5kdXJhdGlvbikgewotICAgICAgLy8gVE9ETyhqcGF3bG93c2tpKTogSENJIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuJ3QgZG8gZHVyYXRpb24gc2hvdWxkCi0gICAgICAvLyBlbXVsYXRlIGl0LCBub3QgRW5hYmxlV2l0aFRpbWVyQ2IuCi0gICAgICBteUNiID0gQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbDo6RW5hYmxlV2l0aFRpbWVyQ2IsCi0gICAgICAgICAgICAgICAgICB3ZWFrX2ZhY3RvcnlfLkdldFdlYWtQdHIoKSwgcF9pbnN0LT5pbnN0X2lkLCBzdGQ6Om1vdmUoY2IpLAotICAgICAgICAgICAgICAgICAgcF9pbnN0LT5kdXJhdGlvbiwgcF9pbnN0LT50aW1lb3V0X2NiKTsKLSAgICB9IGVsc2UgewotICAgICAgbXlDYiA9IHN0ZDo6bW92ZShjYik7Ci0KLSAgICAgIGlmIChwX2luc3QtPnRpbWVvdXRfdGltZXIpIHsKLSAgICAgICAgYWxhcm1fY2FuY2VsKHBfaW5zdC0+dGltZW91dF90aW1lcik7Ci0gICAgICAgIGFsYXJtX2ZyZWUocF9pbnN0LT50aW1lb3V0X3RpbWVyKTsKLSAgICAgICAgcF9pbnN0LT50aW1lb3V0X3RpbWVyID0gbnVsbHB0cjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlKSBwX2luc3QtPmVuYWJsZV90aW1lID0gVGltZVRpY2tzOjpOb3coKTsKLSAgICBwX2luc3QtPmVuYWJsZV9zdGF0dXMgPSBlbmFibGU7Ci0gICAgR2V0SGNpSW50ZXJmYWNlKCktPkVuYWJsZShlbmFibGUsIHBfaW5zdC0+aW5zdF9pZCwgcF9pbnN0LT5kdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaW5zdC0+bWF4RXh0QWR2RXZlbnRzLCBzdGQ6Om1vdmUobXlDYikpOwotICB9Ci0KLSAgdm9pZCBTZXRQYXJhbWV0ZXJzKHVpbnQ4X3QgaW5zdF9pZCwgdEJUTV9CTEVfQURWX1BBUkFNUyogcF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzQ2IgY2IpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdF9pZDogIiA8PCAraW5zdF9pZDsKLSAgICBpZiAoaW5zdF9pZCA+PSBpbnN0X2NvdW50KSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJiYWQgaW5zdGFuY2UgaWQgIiA8PCAraW5zdF9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QgPSAmYWR2X2luc3RbaW5zdF9pZF07Ci0gICAgaWYgKCFwX2luc3QtPmluX3VzZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiYWR2IGluc3RhbmNlIG5vdCBpbiB1c2UiIDw8ICtpbnN0X2lkOwotICAgICAgY2IuUnVuKEJUTV9CTEVfTVVMVElfQURWX0ZBSUxVUkUsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRPRE86IGRpc2FibGUgb25seSBpZiB3YXMgZW5hYmxlZCwgY3VycmVudGx5IG5vIHVzZSBzY2VuYXJpbyBuZWVkcwotICAgIC8vIHRoYXQsCi0gICAgLy8gd2UgYWx3YXlzIHNldCBwYXJhbWV0ZXJzIGJlZm9yZSBlbmFibGluZwotICAgIC8vIEdldEhjaUludGVyZmFjZSgpLT5FbmFibGUoZmFsc2UsIGluc3RfaWQsIGJhc2U6OkRvTm90aGluZygpKTsKLSAgICBwX2luc3QtPmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgPQotICAgICAgICBwX3BhcmFtcy0+YWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllczsKLSAgICBwX2luc3QtPnR4X3Bvd2VyID0gcF9wYXJhbXMtPnR4X3Bvd2VyOwotICAgIHBfaW5zdC0+YWR2ZXJ0aXNpbmdfaW50ZXJ2YWwgPSBwX3BhcmFtcy0+YWR2X2ludF9taW47Ci0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzID0gUmF3QWRkcmVzczo6a0VtcHR5OwotCi0gICAgLy8gc2lkIG11c3QgYmUgaW4gcmFuZ2UgMHgwMCB0byAweDBGLiBTaW5jZSBubyBjb250cm9sbGVyIHN1cHBvcnRzIG1vcmUgdGhhbgotICAgIC8vIDE2IGFkdmVydGlzZXJzLCBpdCdzIHNhZmUgdG8gbWFrZSBzaWQgZXF1YWwgdG8gaW5zdF9pZC4KLSAgICB1aW50OF90IHNpZCA9IHBfaW5zdC0+aW5zdF9pZCAlIDB4MEY7Ci0KLSAgICBHZXRIY2lJbnRlcmZhY2UoKS0+U2V0UGFyYW1ldGVycygKLSAgICAgICAgcF9pbnN0LT5pbnN0X2lkLCBwX3BhcmFtcy0+YWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcywKLSAgICAgICAgcF9wYXJhbXMtPmFkdl9pbnRfbWluLCBwX3BhcmFtcy0+YWR2X2ludF9tYXgsIHBfcGFyYW1zLT5jaGFubmVsX21hcCwKLSAgICAgICAgcF9pbnN0LT5vd25fYWRkcmVzc190eXBlLCBwX2luc3QtPm93bl9hZGRyZXNzLCAweDAwLCBwZWVyX2FkZHJlc3MsCi0gICAgICAgIHBfcGFyYW1zLT5hZHZfZmlsdGVyX3BvbGljeSwgcF9pbnN0LT50eF9wb3dlciwKLSAgICAgICAgcF9wYXJhbXMtPnByaW1hcnlfYWR2ZXJ0aXNpbmdfcGh5LCAweDAwLAotICAgICAgICBwX3BhcmFtcy0+c2Vjb25kYXJ5X2FkdmVydGlzaW5nX3BoeSwgc2lkLAotICAgICAgICBwX3BhcmFtcy0+c2Nhbl9yZXF1ZXN0X25vdGlmaWNhdGlvbl9lbmFibGUsIGNiKTsKLQotICAgIC8vIFRPRE86IHJlLWVuYWJsZSBvbmx5IGlmIGl0IHdhcyBlbmFibGVkLCBwcm9wZXJseSBjYWxsCi0gICAgLy8gU2V0UGFyYW1zQ2FsbGJhY2sKLSAgICAvLyBjdXJyZW50bHkgbm8gdXNlIHNjZW5hcmlvIG5lZWRzIHRoYXQKLSAgICAvLyBHZXRIY2lJbnRlcmZhY2UoKS0+RW5hYmxlKHRydWUsIGluc3RfaWQsIEJUTV9CbGVVcGRhdGVBZHZJbnN0UGFyYW1DYik7Ci0gIH0KLQotICB2b2lkIFNldERhdGEodWludDhfdCBpbnN0X2lkLCBib29sIGlzX3NjYW5fcnNwLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgICAgICAgICAgTXVsdGlBZHZDYiBjYikgb3ZlcnJpZGUgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBpbnN0X2lkOiAiIDw8ICtpbnN0X2lkOwotICAgIGlmIChpbnN0X2lkID49IGluc3RfY291bnQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgImJhZCBpbnN0YW5jZSBpZCAiIDw8ICtpbnN0X2lkOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFkdmVydGlzaW5nSW5zdGFuY2UqIHBfaW5zdCA9ICZhZHZfaW5zdFtpbnN0X2lkXTsKLSAgICBWTE9HKDEpIDw8ICJpc19zY2FuX3JzcCA9ICIgPDwgaXNfc2Nhbl9yc3A7Ci0KLSAgICBpZiAoIWlzX3NjYW5fcnNwICYmIGlzX2Nvbm5lY3RhYmxlKHBfaW5zdC0+YWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcykpIHsKLSAgICAgIHVpbnQ4X3QgZmxhZ3NfdmFsID0gQlRNX0dFTkVSQUxfRElTQ09WRVJBQkxFOwotCi0gICAgICBpZiAocF9pbnN0LT5kdXJhdGlvbikgZmxhZ3NfdmFsID0gQlRNX0xJTUlURURfRElTQ09WRVJBQkxFOwotCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBmbGFnczsKLSAgICAgIGZsYWdzLnB1c2hfYmFjaygyKTsgIC8vIGxlbmd0aAotICAgICAgZmxhZ3MucHVzaF9iYWNrKEhDSV9FSVJfRkxBR1NfVFlQRSk7Ci0gICAgICBmbGFncy5wdXNoX2JhY2soZmxhZ3NfdmFsKTsKLQotICAgICAgZGF0YS5pbnNlcnQoZGF0YS5iZWdpbigpLCBmbGFncy5iZWdpbigpLCBmbGFncy5lbmQoKSk7Ci0gICAgfQotCi0gICAgLy8gRmluZCBhbmQgZmlsbCBUWCBQb3dlciB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLgotICAgIC8vIFRoZSBUWCBQb3dlciBzZWN0aW9uIGlzIGEgMyBieXRlIHNlY3Rpb24uCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IChpICsgMikgPCBkYXRhLnNpemUoKTspIHsKLSAgICAgIGlmIChkYXRhW2kgKyAxXSA9PSBIQ0lfRUlSX1RYX1BPV0VSX0xFVkVMX1RZUEUpIHsKLSAgICAgICAgZGF0YVtpICsgMl0gPSBhZHZfaW5zdFtpbnN0X2lkXS50eF9wb3dlcjsKLSAgICAgIH0KLSAgICAgIGkgKz0gZGF0YVtpXSArIDE7Ci0gICAgfQotCi0gICAgVkxPRygxKSA8PCAiZGF0YSBpczogIiA8PCBiYXNlOjpIZXhFbmNvZGUoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgICBEaXZpZGVBbmRTZW5kRGF0YSgKLSAgICAgICAgaW5zdF9pZCwgZGF0YSwgY2IsCi0gICAgICAgIGJhc2U6OkJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlckltcGw6OlNldERhdGFBZHZEYXRhU2VuZGVyLAotICAgICAgICAgICAgICAgICAgIHdlYWtfZmFjdG9yeV8uR2V0V2Vha1B0cigpLCBpc19zY2FuX3JzcCkpOwotICB9Ci0KLSAgdm9pZCBTZXREYXRhQWR2RGF0YVNlbmRlcih1aW50OF90IGlzX3NjYW5fcnNwLCB1aW50OF90IGluc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcGVyYXRpb24sIHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgY2IpIHsKLSAgICBpZiAoaXNfc2Nhbl9yc3ApCi0gICAgICBHZXRIY2lJbnRlcmZhY2UoKS0+U2V0U2NhblJlc3BvbnNlRGF0YShpbnN0X2lkLCBvcGVyYXRpb24sIDB4MDEsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGNiKTsKLSAgICBlbHNlCi0gICAgICBHZXRIY2lJbnRlcmZhY2UoKS0+U2V0QWR2ZXJ0aXNpbmdEYXRhKGluc3RfaWQsIG9wZXJhdGlvbiwgMHgwMSwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBjYik7Ci0gIH0KLQotICB1c2luZyBEYXRhU2VuZGVyID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCgKLSAgICAgIHVpbnQ4X3QgLyppbnN0X2lkKi8sIHVpbnQ4X3QgLyogb3BlcmF0aW9uICovLCB1aW50OF90IC8qIGxlbmd0aCAqLywKLSAgICAgIHVpbnQ4X3QqIC8qIGRhdGEgKi8sIE11bHRpQWR2Q2IgLyogZG9uZSAqLyk+OwotCi0gIHZvaWQgRGl2aWRlQW5kU2VuZERhdGEoaW50IGluc3RfaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlBZHZDYiBkb25lX2NiLCBEYXRhU2VuZGVyIHNlbmRlcikgewotICAgIERpdmlkZUFuZFNlbmREYXRhUmVjdXJzaXZlbHkodHJ1ZSwgaW5zdF9pZCwgc3RkOjptb3ZlKGRhdGEpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRvbmVfY2IpLCBzdGQ6Om1vdmUoc2VuZGVyKSwgMCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBEaXZpZGVBbmRTZW5kRGF0YVJlY3Vyc2l2ZWx5KGJvb2wgaXNGaXJzdCwgaW50IGluc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBNdWx0aUFkdkNiIGRvbmVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNlbmRlciBzZW5kZXIsIHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gICAgY29uc3RleHByIHVpbnQ4X3QgSU5URVJNRURJQVRFID0KLSAgICAgICAgMHgwMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgZnJhZ21lbnQgb2YgZnJhZ21lbnRlZCBkYXRhCi0gICAgY29uc3RleHByIHVpbnQ4X3QgRklSU1QgPSAweDAxOyAgLy8gRmlyc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRlZCBkYXRhCi0gICAgY29uc3RleHByIHVpbnQ4X3QgTEFTVCA9IDB4MDI7ICAgLy8gTGFzdCBmcmFnbWVudCBvZiBmcmFnbWVudGVkIGRhdGEKLSAgICBjb25zdGV4cHIgdWludDhfdCBDT01QTEVURSA9IDB4MDM7ICAvLyBDb21wbGV0ZSBleHRlbmRlZCBhZHZlcnRpc2luZyBkYXRhCi0KLSAgICBpbnQgZGF0YVNpemUgPSAoaW50KWRhdGEuc2l6ZSgpOwotICAgIGlmIChzdGF0dXMgIT0gMCB8fCAoIWlzRmlyc3QgJiYgb2Zmc2V0ID09IGRhdGFTaXplKSkgewotICAgICAgLyogaWYgd2UgZ290IGVycm9yIHdyaXRpbmcgZGF0YSwgb3IgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGEgKi8KLSAgICAgIGRvbmVfY2IuUnVuKHN0YXR1cyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBtb3JlVGhhbk9uZVBhY2tldCA9IGRhdGFTaXplIC0gb2Zmc2V0ID4gQURWX0RBVEFfTEVOX01BWDsKLSAgICB1aW50OF90IG9wZXJhdGlvbiA9IGlzRmlyc3QgPyBtb3JlVGhhbk9uZVBhY2tldCA/IEZJUlNUIDogQ09NUExFVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtb3JlVGhhbk9uZVBhY2tldCA/IElOVEVSTUVESUFURSA6IExBU1Q7Ci0gICAgaW50IGxlbmd0aCA9IG1vcmVUaGFuT25lUGFja2V0ID8gQURWX0RBVEFfTEVOX01BWCA6IGRhdGFTaXplIC0gb2Zmc2V0OwotICAgIGludCBuZXdPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0KLSAgICBhdXRvIGRhdGFEYXRhID0gZGF0YS5kYXRhKCk7Ci0gICAgc2VuZGVyLlJ1bigKLSAgICAgICAgaW5zdF9pZCwgb3BlcmF0aW9uLCBsZW5ndGgsIGRhdGFEYXRhICsgb2Zmc2V0LAotICAgICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsOjpEaXZpZGVBbmRTZW5kRGF0YVJlY3Vyc2l2ZWx5LCBmYWxzZSwKLSAgICAgICAgICAgICBpbnN0X2lkLCBzdGQ6Om1vdmUoZGF0YSksIG5ld09mZnNldCwgc3RkOjptb3ZlKGRvbmVfY2IpLCBzZW5kZXIpKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnModWludDhfdCBpbnN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfUEVSSU9ESUNfQURWX1BBUkFNUyogcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgY2IpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdF9pZDogIiA8PCAraW5zdF9pZDsKLQotICAgIEdldEhjaUludGVyZmFjZSgpLT5TZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycygKLSAgICAgICAgaW5zdF9pZCwgcGFyYW1zLT5taW5faW50ZXJ2YWwsIHBhcmFtcy0+bWF4X2ludGVydmFsLAotICAgICAgICBwYXJhbXMtPnBlcmlvZGljX2FkdmVydGlzaW5nX3Byb3BlcnRpZXMsIGNiKTsKLSAgfQotCi0gIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGEodWludDhfdCBpbnN0X2lkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgY2IpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdF9pZDogIiA8PCAraW5zdF9pZDsKLQotICAgIFZMT0coMSkgPDwgImRhdGEgaXM6ICIgPDwgYmFzZTo6SGV4RW5jb2RlKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0KLSAgICBEaXZpZGVBbmRTZW5kRGF0YSgKLSAgICAgICAgaW5zdF9pZCwgZGF0YSwgY2IsCi0gICAgICAgIGJhc2U6OkJpbmQoJkJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OlNldFBlcmlvZGljQWR2ZXJ0aXNpbmdEYXRhLAotICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoR2V0SGNpSW50ZXJmYWNlKCkpKSk7Ci0gIH0KLQotICB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUodWludDhfdCBpbnN0X2lkLCB1aW50OF90IGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgY2IpIG92ZXJyaWRlIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdF9pZDogIiA8PCAraW5zdF9pZCA8PCAiLCBlbmFibGU6ICIgPDwgK2VuYWJsZTsKLQotICAgIEFkdmVydGlzaW5nSW5zdGFuY2UqIHBfaW5zdCA9ICZhZHZfaW5zdFtpbnN0X2lkXTsKLSAgICBpZiAoIXBfaW5zdC0+aW5fdXNlKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIG9yIG5vdCBhY3RpdmUgaW5zdGFuY2UiOwotICAgICAgY2IuUnVuKEJUTV9CTEVfTVVMVElfQURWX0ZBSUxVUkUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE11bHRpQWR2Q2IgZW5hYmxlX2NiID0gQmluZCgKLSAgICAgICAgW10oQWR2ZXJ0aXNpbmdJbnN0YW5jZSogcF9pbnN0LCB1aW50OF90IGVuYWJsZSwgTXVsdGlBZHZDYiBjYiwKLSAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgICAgICAgICBWTE9HKDEpIDw8ICJwZXJpb2RjIGFkdiBlbmFibGUgY2I6IGluc3RfaWQ6ICIgPDwgK3BfaW5zdC0+aW5zdF9pZAotICAgICAgICAgICAgICAgICAgPDwgIiwgZW5hYmxlOiAiIDw8ICtlbmFibGUgPDwgIiwgc3RhdHVzOiAiIDw8IHN0ZDo6aGV4Ci0gICAgICAgICAgICAgICAgICA8PCArc3RhdHVzOwotICAgICAgICAgIGlmICghc3RhdHVzKSBwX2luc3QtPnBlcmlvZGljX2VuYWJsZWQgPSBlbmFibGU7Ci0KLSAgICAgICAgICBjYi5SdW4oc3RhdHVzKTsKLSAgICAgICAgfSwKLSAgICAgICAgcF9pbnN0LCBlbmFibGUsIHN0ZDo6bW92ZShjYikpOwotCi0gICAgR2V0SGNpSW50ZXJmYWNlKCktPlNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUoZW5hYmxlLCBpbnN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShlbmFibGVfY2IpKTsKLSAgfQotCi0gIHZvaWQgVW5yZWdpc3Rlcih1aW50OF90IGluc3RfaWQpIG92ZXJyaWRlIHsKLSAgICBBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QgPSAmYWR2X2luc3RbaW5zdF9pZF07Ci0KLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaW5zdF9pZDogIiA8PCAraW5zdF9pZDsKLSAgICBpZiAoaW5zdF9pZCA+PSBpbnN0X2NvdW50KSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJiYWQgaW5zdGFuY2UgaWQgIiA8PCAraW5zdF9pZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYWR2X2luc3RbaW5zdF9pZF0uSXNFbmFibGVkKCkpIHsKLSAgICAgIHBfaW5zdC0+ZW5hYmxlX3N0YXR1cyA9IGZhbHNlOwotICAgICAgR2V0SGNpSW50ZXJmYWNlKCktPkVuYWJsZShmYWxzZSwgaW5zdF9pZCwgMHgwMCwgMHgwMCwgYmFzZTo6RG9Ob3RoaW5nKCkpOwotICAgIH0KLQotICAgIGlmIChwX2luc3QtPnBlcmlvZGljX2VuYWJsZWQpIHsKLSAgICAgIHBfaW5zdC0+cGVyaW9kaWNfZW5hYmxlZCA9IGZhbHNlOwotICAgICAgR2V0SGNpSW50ZXJmYWNlKCktPlNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUoZmFsc2UsIGluc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gICAgfQotCi0gICAgYWxhcm1fY2FuY2VsKHBfaW5zdC0+YWR2X3JhZGRyX3RpbWVyKTsKLSAgICBwX2luc3QtPmluX3VzZSA9IGZhbHNlOwotICAgIEdldEhjaUludGVyZmFjZSgpLT5SZW1vdmVBZHZlcnRpc2luZ1NldChpbnN0X2lkLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gICAgcF9pbnN0LT5hZGRyZXNzX3VwZGF0ZV9yZXF1aXJlZCA9IGZhbHNlOwotICB9Ci0KLSAgdm9pZCBSZWNvbXB1dGVUaW1lb3V0KEFkdmVydGlzaW5nSW5zdGFuY2UqIGluc3QsIFRpbWVUaWNrcyBub3cpIHsKLSAgICBUaW1lRGVsdGEgZHVyYXRpb24gPSBub3cgLSBpbnN0LT5lbmFibGVfdGltZTsKLSAgICBib29sIGNiX2ZpcmVkID0gZmFsc2U7Ci0gICAgaWYgKGluc3QtPmR1cmF0aW9uKSB7Ci0gICAgICBpbnQgZHVyYXRpb25Eb25lID0gKGR1cmF0aW9uLkluTWlsbGlzZWNvbmRzKCkgLyAxMCk7Ci0gICAgICBpZiAoZHVyYXRpb25Eb25lICsgMSA+PSBpbnN0LT5kdXJhdGlvbikgewotICAgICAgICBpbnN0LT5lbmFibGVfc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgIGluc3QtPnRpbWVvdXRfY2IuUnVuKDAgLyogVE9ETzogU1RBVFVTIEhFUkU/Ki8pOwotICAgICAgICBjYl9maXJlZCA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnN0LT5kdXJhdGlvbiA9IGluc3QtPmR1cmF0aW9uIC0gZHVyYXRpb25Eb25lOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpbnN0LT5tYXhFeHRBZHZFdmVudHMgJiYgIWNiX2ZpcmVkKSB7Ci0gICAgICBpbnQgZXZlbnRzRG9uZSA9Ci0gICAgICAgICAgKGR1cmF0aW9uLkluTWlsbGlzZWNvbmRzKCkgLyAoaW5zdC0+YWR2ZXJ0aXNpbmdfaW50ZXJ2YWwgKiA1IC8gOCkpOwotCi0gICAgICBpZiAoZXZlbnRzRG9uZSArIDEgPj0gaW5zdC0+bWF4RXh0QWR2RXZlbnRzKSB7Ci0gICAgICAgIGluc3QtPmVuYWJsZV9zdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgaW5zdC0+dGltZW91dF9jYi5SdW4oMCAvKiBUT0RPOiBTVEFUVVMgSEVSRT8qLyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnN0LT5tYXhFeHRBZHZFdmVudHMgPSBpbnN0LT5tYXhFeHRBZHZFdmVudHMgLSBldmVudHNEb25lOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgU3VzcGVuZCgpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3RvcjxTZXRFbmFibGVEYXRhPiBzZXRzOwotCi0gICAgZm9yIChBZHZlcnRpc2luZ0luc3RhbmNlJiBpbnN0IDogYWR2X2luc3QpIHsKLSAgICAgIGlmICghaW5zdC5pbl91c2UgfHwgIWluc3QuZW5hYmxlX3N0YXR1cykgY29udGludWU7Ci0KLSAgICAgIGlmIChpbnN0LmR1cmF0aW9uIHx8IGluc3QubWF4RXh0QWR2RXZlbnRzKQotICAgICAgICBSZWNvbXB1dGVUaW1lb3V0KCZpbnN0LCBUaW1lVGlja3M6Ok5vdygpKTsKLQotICAgICAgc2V0cy5lbXBsYWNlX2JhY2soU2V0RW5hYmxlRGF0YXsuaGFuZGxlID0gaW5zdC5pbnN0X2lkfSk7Ci0gICAgfQotCi0gICAgaWYgKCFzZXRzLmVtcHR5KCkpCi0gICAgICBHZXRIY2lJbnRlcmZhY2UoKS0+RW5hYmxlKGZhbHNlLCBzZXRzLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci0gIH0KLQotICB2b2lkIFJlc3VtZSgpIG92ZXJyaWRlIHsKLSAgICBzdGQ6OnZlY3RvcjxTZXRFbmFibGVEYXRhPiBzZXRzOwotCi0gICAgZm9yIChjb25zdCBBZHZlcnRpc2luZ0luc3RhbmNlJiBpbnN0IDogYWR2X2luc3QpIHsKLSAgICAgIGlmIChpbnN0LmluX3VzZSAmJiBpbnN0LmVuYWJsZV9zdGF0dXMpIHsKLSAgICAgICAgc2V0cy5lbXBsYWNlX2JhY2soU2V0RW5hYmxlRGF0YXsKLSAgICAgICAgICAgIC5oYW5kbGUgPSBpbnN0Lmluc3RfaWQsCi0gICAgICAgICAgICAuZHVyYXRpb24gPSBpbnN0LmR1cmF0aW9uLAotICAgICAgICAgICAgLm1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMgPSBpbnN0Lm1heEV4dEFkdkV2ZW50c30pOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghc2V0cy5lbXB0eSgpKSBHZXRIY2lJbnRlcmZhY2UoKS0+RW5hYmxlKHRydWUsIHNldHMsIGJhc2U6OkRvTm90aGluZygpKTsKLSAgfQotCi0gIHZvaWQgT25BZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWQoCi0gICAgICB1aW50OF90IHN0YXR1cywgdWludDhfdCBhZHZlcnRpc2luZ19oYW5kbGUsIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgdWludDhfdCBudW1fY29tcGxldGVkX2V4dGVuZGVkX2Fkdl9ldmVudHMpIG92ZXJyaWRlIHsKLSAgICBBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QgPSAmYWR2X2luc3RbYWR2ZXJ0aXNpbmdfaGFuZGxlXTsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICJzdGF0dXM6ICIgPDwgbG9naGV4KHN0YXR1cykKLSAgICAgICAgICAgIDw8ICIsIGFkdmVydGlzaW5nX2hhbmRsZTogIiA8PCBsb2doZXgoYWR2ZXJ0aXNpbmdfaGFuZGxlKQotICAgICAgICAgICAgPDwgIiwgY29ubmVjdGlvbl9oYW5kbGU6ICIgPDwgbG9naGV4KGNvbm5lY3Rpb25faGFuZGxlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gSENJX0VSUl9MSU1JVF9SRUFDSEVEIHx8Ci0gICAgICAgIHN0YXR1cyA9PSBIQ0lfRVJSX0FEVkVSVElTSU5HX1RJTUVPVVQpIHsKLSAgICAgIC8vIGVpdGhlciBkdXJhdGlvbiBlbGFwc2VkLCBvciBtYXhFeHRBZHZFdmVudHMgcmVhY2hlZAotICAgICAgcF9pbnN0LT5lbmFibGVfc3RhdHVzID0gZmFsc2U7Ci0KLSAgICAgIGlmIChwX2luc3QtPnRpbWVvdXRfY2IuaXNfbnVsbCgpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiTm8gdGltZW91dCBjYWxsYmFjayI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcF9pbnN0LT50aW1lb3V0X2NiLlJ1bihzdGF0dXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChCVE1fQmxlTG9jYWxQcml2YWN5RW5hYmxlZCgpICYmCi0gICAgICAgIGFkdmVydGlzaW5nX2hhbmRsZSA8PSBCVE1fQkxFX01VTFRJX0FEVl9NQVgpIHsKLSAgICAgIGJ0bV9hY2xfdXBkYXRlX2Nvbm5fYWRkcihjb25uZWN0aW9uX2hhbmRsZSwgcF9pbnN0LT5vd25fYWRkcmVzcyk7Ci0gICAgfQotCi0gICAgVkxPRygxKSA8PCAicmVuZWFibGluZyBhZHZlcnRpc2luZyI7Ci0KLSAgICBpZiAocF9pbnN0LT5pbl91c2UpIHsKLSAgICAgIC8vIFRPRE8oanBhd2xvd3NraSk6IHdlIGRvbid0IHJlYWxseSBhbGxvdyB0byBkbyBkaXJlY3RlZCBhZHZlcnRpc2luZwotICAgICAgLy8gcmlnaHQgbm93LiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkLCBjaGVjayB3aXRoIEFuZHJlLgotICAgICAgaWYgKChwX2luc3QtPmFkdmVydGlzaW5nX2V2ZW50X3Byb3BlcnRpZXMgJiAweDBDKSA9PSAwKSB7Ci0gICAgICAgIC8qIGRpcmVjdGVkIGFkdmVydGlzaW5nIGJpdHMgbm90IHNldCAqLwotCi0gICAgICAgIFJlY29tcHV0ZVRpbWVvdXQocF9pbnN0LCBUaW1lVGlja3M6Ok5vdygpKTsKLSAgICAgICAgaWYgKHBfaW5zdC0+ZW5hYmxlX3N0YXR1cykgewotICAgICAgICAgIEdldEhjaUludGVyZmFjZSgpLT5FbmFibGUodHJ1ZSwgYWR2ZXJ0aXNpbmdfaGFuZGxlLCBwX2luc3QtPmR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9pbnN0LT5tYXhFeHRBZHZFdmVudHMsIGJhc2U6OkRvTm90aGluZygpKTsKLSAgICAgICAgfQotCi0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBtYXJrIGRpcmVjdGVkIGFkdiBhcyBkaXNhYmxlZCBpZiBhZHYgaGFzIGJlZW4gc3RvcHBlZCAqLwotICAgICAgICBwX2luc3QtPmluX3VzZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGJhc2U6OldlYWtQdHI8QmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbD4gR2V0V2Vha1B0cigpIHsKLSAgICByZXR1cm4gd2Vha19mYWN0b3J5Xy5HZXRXZWFrUHRyKCk7Ci0gIH0KLQotICB2b2lkIENhbmNlbEFkdkFsYXJtcygpIHsKLSAgICBBZHZlcnRpc2luZ0luc3RhbmNlKiBwX2luc3QgPSAmYWR2X2luc3RbMF07Ci0gICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgaW5zdF9jb3VudDsgaSsrLCBwX2luc3QrKykgewotICAgICAgaWYgKHBfaW5zdC0+dGltZW91dF90aW1lcikgewotICAgICAgICBhbGFybV9jYW5jZWwocF9pbnN0LT50aW1lb3V0X3RpbWVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChwX2luc3QtPmFkdl9yYWRkcl90aW1lcikgewotICAgICAgICBhbGFybV9jYW5jZWwocF9pbnN0LT5hZHZfcmFkZHJfdGltZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSogR2V0SGNpSW50ZXJmYWNlKCkgeyByZXR1cm4gaGNpX2ludGVyZmFjZTsgfQotCi0gIEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2UqIGhjaV9pbnRlcmZhY2UgPSBudWxscHRyOwotICBzdGQ6OnZlY3RvcjxBZHZlcnRpc2luZ0luc3RhbmNlPiBhZHZfaW5zdDsKLSAgdWludDhfdCBpbnN0X2NvdW50OwotCi0gIC8vIE1lbWJlciB2YXJpYWJsZXMgc2hvdWxkIGFwcGVhciBiZWZvcmUgdGhlIFdlYWtQdHJGYWN0b3J5LCB0byBlbnN1cmUKLSAgLy8gdGhhdCBhbnkgV2Vha1B0cnMgYXJlIGludmFsaWRhdGVkIGJlZm9yZSBpdHMgbWVtYmVycwotICAvLyB2YXJpYWJsZSdzIGRlc3RydWN0b3JzIGFyZSBleGVjdXRlZCwgcmVuZGVyaW5nIHRoZW0gaW52YWxpZC4KLSAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8QmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbD4gd2Vha19mYWN0b3J5XzsKLX07Ci0KLXZvaWQgYnRtX2JsZV9hZHZfcmFkZHJfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlckltcGwqIHB0ciA9IGluc3RhbmNlX3dlYWtwdHIuZ2V0KCk7Ci0gIGlmIChwdHIpIHB0ci0+Q29uZmlndXJlUnBhKChBZHZlcnRpc2luZ0luc3RhbmNlKilkYXRhLCBiYXNlOjpEb05vdGhpbmcoKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkluaXRpYWxpemUoQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSogaW50ZXJmYWNlKSB7Ci0gIGluc3RhbmNlID0gbmV3IEJsZUFkdmVydGlzaW5nTWFuYWdlckltcGwoaW50ZXJmYWNlKTsKLSAgaW5zdGFuY2Vfd2Vha3B0ciA9ICgoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbCopaW5zdGFuY2UpLT5HZXRXZWFrUHRyKCk7Ci19Ci0KLWJvb2wgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gaW5zdGFuY2U7IH0KLQotYmFzZTo6V2Vha1B0cjxCbGVBZHZlcnRpc2luZ01hbmFnZXI+IEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCkgewotICByZXR1cm4gaW5zdGFuY2Vfd2Vha3B0cjsKLX07Ci0KLXZvaWQgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpDbGVhblVwKCkgewotICBpZiAoaW5zdGFuY2Vfd2Vha3B0ci5nZXQoKSkgaW5zdGFuY2Vfd2Vha3B0ci5nZXQoKS0+Q2FuY2VsQWR2QWxhcm1zKCk7Ci0KLSAgZGVsZXRlIGluc3RhbmNlOwotICBpbnN0YW5jZSA9IG51bGxwdHI7Ci19OwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgYWR2ZXJ0aXNpbmcgbWFuYWdlci4KLSAqKi8KLXZvaWQgYnRtX2JsZV9hZHZfaW5pdCgpIHsKLSAgQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6SW5pdGlhbGl6ZSgpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkluaXRpYWxpemUoQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6R2V0KCkpOwotICBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpHZXQoKS0+U2V0QWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKAotICAgICAgKEJsZUFkdmVydGlzaW5nTWFuYWdlckltcGwqKUJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCkuZ2V0KCkpOwotCi0gIGlmIChCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpHZXQoKS0+UXVpcmtBZHZlcnRpc2VyWmVyb0hhbmRsZSgpKSB7Ci0gICAgLy8gSWYgaGFuZGxlIDAgY2FuJ3QgYmUgdXNlZCwgcmVnaXN0ZXIgYWR2ZXJ0aXNlciBmb3IgaXQsIGJ1dCBuZXZlciB1c2UgaXQuCi0gICAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS5nZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKGJhc2U6OkRvTm90aGluZygpKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9tdWx0aV9hZHZfY2xlYW51cAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgbXVsdGkgYWR2IGNvbnRyb2wgYmxvY2suCi0gKgotICogUGFyYW1ldGVycwotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9tdWx0aV9hZHZfY2xlYW51cCh2b2lkKSB7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6Q2xlYW5VcCgpOwotICBCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlOjpDbGVhblVwKCk7Ci19Ci0KLS8vIFRPRE8oanBhd2xvd3NraSk6IEZpbmQgYSBuaWNlciB3YXkgdG8gdGVzdCBSZWNvbXB1dGVUaW1lb3V0IHdpdGhvdXQgZXhwb3NpbmcKLS8vIEFkdmVydGlzaW5nSW5zdGFuY2UKLWJvb2wgdGltZW91dF90cmlnZ2VyZWQgPSBmYWxzZTsKLXZvaWQgdGVzdF90aW1lb3V0X2NiKHVpbnQ4X3Qgc3RhdHVzKSB7IHRpbWVvdXRfdHJpZ2dlcmVkID0gdHJ1ZTsgfQotCi0vLyB2ZXJpZnkgdGhhdCBpZiBkdXJhdGlvbiBwYXNzZWQsIG9yIGlzIGFib3V0IHRvIHBhc3MsIHJlY29tcHV0YXRpb24gd2lsbCBzaHV0Ci0vLyBkb3duIHRoZSBhZHZlcnRpc2VyIGNvbXBsZXRseQotdm9pZCB0ZXN0UmVjb21wdXRlVGltZW91dDEoKSB7Ci0gIGF1dG8gbWFuYWdlciA9IChCbGVBZHZlcnRpc2luZ01hbmFnZXJJbXBsKilCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLmdldCgpOwotCi0gIFRpbWVUaWNrcyBzdGFydCA9IFRpbWVUaWNrczo6Tm93KCk7Ci0gIFRpbWVUaWNrcyBlbmQgPSBzdGFydCArIFRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygxMTEpOwotICBBZHZlcnRpc2luZ0luc3RhbmNlIHRlc3QxKDApOwotICB0ZXN0MS5lbmFibGVfc3RhdHVzID0gdHJ1ZTsKLSAgdGVzdDEuZW5hYmxlX3RpbWUgPSBzdGFydDsKLSAgdGVzdDEuZHVyYXRpb24gPSAxMiAvKjEyMG1zKi87Ci0gIHRlc3QxLnRpbWVvdXRfY2IgPSBCaW5kKCZ0ZXN0X3RpbWVvdXRfY2IpOwotCi0gIG1hbmFnZXItPlJlY29tcHV0ZVRpbWVvdXQoJnRlc3QxLCBlbmQpOwotCi0gIENIRUNLKHRpbWVvdXRfdHJpZ2dlcmVkKTsKLSAgdGltZW91dF90cmlnZ2VyZWQgPSBmYWxzZTsKLSAgQ0hFQ0soIXRlc3QxLmVuYWJsZV9zdGF0dXMpOwotfQotCi0vLyB2ZXJpZnkgdGhhdCBkdXJhdGlvbiBhbmQgbWF4RXh0QWR2RXZlbnRzIGFyZSBwcm9wZXJseSBhZGp1c3RlZCB3aGVuCi0vLyByZWNvbXB1dGluZy4KLXZvaWQgdGVzdFJlY29tcHV0ZVRpbWVvdXQyKCkgewotICBhdXRvIG1hbmFnZXIgPSAoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbCopQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS5nZXQoKTsKLQotICBUaW1lVGlja3Mgc3RhcnQgPSBUaW1lVGlja3M6Ok5vdygpOwotICBUaW1lVGlja3MgZW5kID0gc3RhcnQgKyBUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoMjUwKTsKLSAgQWR2ZXJ0aXNpbmdJbnN0YW5jZSB0ZXN0MSgwKTsKLSAgdGVzdDEuZW5hYmxlX3N0YXR1cyA9IHRydWU7Ci0gIHRlc3QxLmVuYWJsZV90aW1lID0gc3RhcnQ7Ci0gIHRlc3QxLmR1cmF0aW9uID0gNTAgLyo1MDBtcyovOwotICB0ZXN0MS5tYXhFeHRBZHZFdmVudHMgPSA1MDsKLSAgdGVzdDEuYWR2ZXJ0aXNpbmdfaW50ZXJ2YWwgPSAxNiAvKiAxMCBtcyAqLzsKLSAgdGVzdDEudGltZW91dF9jYiA9IEJpbmQoJnRlc3RfdGltZW91dF9jYik7Ci0KLSAgbWFuYWdlci0+UmVjb21wdXRlVGltZW91dCgmdGVzdDEsIGVuZCk7Ci0KLSAgQ0hFQ0soIXRpbWVvdXRfdHJpZ2dlcmVkKTsKLSAgQ0hFQ0sodGVzdDEuZW5hYmxlX3N0YXR1cyk7Ci0gIENIRUNLKHRlc3QxLmR1cmF0aW9uID09IDI1KTsKLSAgQ0hFQ0sodGVzdDEubWF4RXh0QWR2RXZlbnRzID09IDI1KTsKLX0KLQotLy8gdmVyaWZ5IHRoYXQgaWYgbWF4RXh0QWR2RXZlbnRzIHdlcmUgc2VudCwgb3IgYXJlIGNsb3NlIHRvIGVuZCwgcmVjb21wdXRhdGlvbgotLy8gd2lsIHNodXQgZG93biB0aGUgYWR2ZXJ0aXNlciBjb21wbGV0bHkKLXZvaWQgdGVzdFJlY29tcHV0ZVRpbWVvdXQzKCkgewotICBhdXRvIG1hbmFnZXIgPSAoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VySW1wbCopQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS5nZXQoKTsKLQotICBUaW1lVGlja3Mgc3RhcnQgPSBUaW1lVGlja3M6Ok5vdygpOwotICBUaW1lVGlja3MgZW5kID0gc3RhcnQgKyBUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoNDk1KTsKLSAgQWR2ZXJ0aXNpbmdJbnN0YW5jZSB0ZXN0MSgwKTsKLSAgdGVzdDEuZW5hYmxlX3N0YXR1cyA9IHRydWU7Ci0gIHRlc3QxLmVuYWJsZV90aW1lID0gc3RhcnQ7Ci0gIHRlc3QxLm1heEV4dEFkdkV2ZW50cyA9IDUwOwotICB0ZXN0MS5hZHZlcnRpc2luZ19pbnRlcnZhbCA9IDE2IC8qIDEwIG1zICovOwotICB0ZXN0MS50aW1lb3V0X2NiID0gQmluZCgmdGVzdF90aW1lb3V0X2NiKTsKLQotICBtYW5hZ2VyLT5SZWNvbXB1dGVUaW1lb3V0KCZ0ZXN0MSwgZW5kKTsKLQotICBDSEVDSyh0aW1lb3V0X3RyaWdnZXJlZCk7Ci0gIHRpbWVvdXRfdHJpZ2dlcmVkID0gZmFsc2U7Ci0gIENIRUNLKCF0ZXN0MS5lbmFibGVfc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fYmxlX3ByaXZhY3kuY2MgYi9zdGFjay9idG0vYnRtX2JsZV9wcml2YWN5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhmZmQwLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fYmxlX3ByaXZhY3kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBCTEUgY29udHJvbGxlciBiYXNlZCBwcml2YWN5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJibGVfYWR2ZXJ0aXNlci5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0bV9pbnQuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidmVuZG9yX2hjaWRlZnMuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLS8qIFJQQSBvZmZsb2FkIFZTQyBzcGVjaWZpY3MgKi8KLSNkZWZpbmUgQlRNX0JMRV9NRVRBX0lSS19FTkFCTEUgMHgwMQotI2RlZmluZSBCVE1fQkxFX01FVEFfQUREX0lSS19FTlRSWSAweDAyCi0jZGVmaW5lIEJUTV9CTEVfTUVUQV9SRU1PVkVfSVJLX0VOVFJZIDB4MDMKLSNkZWZpbmUgQlRNX0JMRV9NRVRBX0NMRUFSX0lSS19MSVNUIDB4MDQKLSNkZWZpbmUgQlRNX0JMRV9NRVRBX1JFQURfSVJLX0VOVFJZIDB4MDUKLSNkZWZpbmUgQlRNX0JMRV9NRVRBX0NTX1JFU09MVkVfQUREUiAweDAwMDAwMDAxCi0jZGVmaW5lIEJUTV9CTEVfSVJLX0VOQUJMRV9MRU4gMgotCi0jZGVmaW5lIEJUTV9CTEVfTUVUQV9BRERfSVJLX0xFTiAyNAotI2RlZmluZSBCVE1fQkxFX01FVEFfUkVNT1ZFX0lSS19MRU4gOAotI2RlZmluZSBCVE1fQkxFX01FVEFfQ0xFQVJfSVJLX0xFTiAxCi0jZGVmaW5lIEJUTV9CTEVfTUVUQV9SRUFEX0lSS19MRU4gMgotI2RlZmluZSBCVE1fQkxFX01FVEFfQUREX1dMX0FUVFJfTEVOIDkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgRnVuY3Rpb25zIGltcGxlbWVudGVkIGNvbnRyb2xsZXIgYmFzZWQgcHJpdmFjeSB1c2luZyBSZXNvbHZpbmcgTGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2VucV9yZXNvbHZpbmdfbGlzdF9wZW5kaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBhZGQgdGFyZ2V0IGFkZHJlc3MgaW50byByZXNvbHZpbmcgcGVuZGluZyBvcGVyYXRpb24gcXVldWUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHRhcmdldF9iZGE6IHRhcmdldCBkZXZpY2UgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICBhZGRfZW50cnk6IHRydWUgZm9yIGFkZCBlbnRyeSwgZmFsc2UgZm9yIHJlbW92ZSBlbnRyeQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fYmxlX2VucV9yZXNvbHZpbmdfbGlzdF9wZW5kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSkgewotICB0QlRNX0JMRV9SRVNPTFZFX1EqIHBfcSA9ICZidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9wZW5kX3E7Ci0KLSAgcF9xLT5yZXNvbHZlX3FfcmFuZG9tX3BzZXVkb1twX3EtPnFfbmV4dF0gPSBwc2V1ZG9fYmRhOwotICBwX3EtPnJlc29sdmVfcV9hY3Rpb25bcF9xLT5xX25leHRdID0gb3BfY29kZTsKLSAgcF9xLT5xX25leHQrKzsKLSAgcF9xLT5xX25leHQgJT0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfYnJjbV9maW5kX3Jlc29sdmluZ19wZW5kaW5nX2VudHJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBjaGVjayB0byBzZWUgaWYgdGhlIGFjdGlvbiBpcyBpbiBwZW5kaW5nIGxpc3QKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHRydWU6IGFjdGlvbiBwZW5kaW5nOwotICogICAgICAgICAgICAgICAgICBmYWxzZTogbmV3IGFjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidG1fYmxlX2JyY21fZmluZF9yZXNvbHZpbmdfcGVuZGluZ19lbnRyeSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgdWludDhfdCBhY3Rpb24pIHsKLSAgdEJUTV9CTEVfUkVTT0xWRV9RKiBwX3EgPSAmYnRtX2NiLmJsZV9jdHJfY2IucmVzb2x2aW5nX2xpc3RfcGVuZF9xOwotCi0gIGZvciAodWludDhfdCBpID0gcF9xLT5xX3BlbmRpbmc7IGkgIT0gcF9xLT5xX25leHQ7KSB7Ci0gICAgaWYgKHBfcS0+cmVzb2x2ZV9xX3JhbmRvbV9wc2V1ZG9baV0gPT0gcHNldWRvX2FkZHIgJiYKLSAgICAgICAgYWN0aW9uID09IHBfcS0+cmVzb2x2ZV9xX2FjdGlvbltpXSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaSsrOwotICAgIGkgJT0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2RlcV9yZXNvbHZpbmdfcGVuZGluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZGVxdWV1ZSB0YXJnZXQgYWRkcmVzcyBmcm9tIHJlc29sdmluZyBwZW5kaW5nIG9wZXJhdGlvbgotICogICAgICAgICAgICAgICAgICBxdWV1ZQotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcHNldWRvX2FkZHI6IHBzZXVkb19hZGRyIGRldmljZSBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0bV9ibGVfZGVxX3Jlc29sdmluZ19wZW5kaW5nKFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyKSB7Ci0gIHRCVE1fQkxFX1JFU09MVkVfUSogcF9xID0gJmJ0bV9jYi5ibGVfY3RyX2NiLnJlc29sdmluZ19saXN0X3BlbmRfcTsKLQotICBpZiAocF9xLT5xX25leHQgIT0gcF9xLT5xX3BlbmRpbmcpIHsKLSAgICBwc2V1ZG9fYWRkciA9IHBfcS0+cmVzb2x2ZV9xX3JhbmRvbV9wc2V1ZG9bcF9xLT5xX3BlbmRpbmddOwotICAgIHBfcS0+cmVzb2x2ZV9xX3JhbmRvbV9wc2V1ZG9bcF9xLT5xX3BlbmRpbmddID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICAgIHBfcS0+cV9wZW5kaW5nKys7Ci0gICAgcF9xLT5xX3BlbmRpbmcgJT0KLSAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfY2xlYXJfaXJrX2luZGV4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBjbGVhciBJUksgbGlzdCBpbmRleCBtYXNrIGZvciBhdmFpbGFiaWxpdHkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX2JsZV9jbGVhcl9pcmtfaW5kZXgodWludDhfdCBpbmRleCkgewotICB1aW50OF90IGJ5dGU7Ci0gIHVpbnQ4X3QgYml0OwotCi0gIGlmIChpbmRleCA8IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkpIHsKLSAgICBieXRlID0gaW5kZXggLyA4OwotICAgIGJpdCA9IGluZGV4ICUgODsKLSAgICBidG1fY2IuYmxlX2N0cl9jYi5pcmtfbGlzdF9tYXNrW2J5dGVdICY9ICh+KDEgPDwgYml0KSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfZmluZF9pcmtfaW5kZXgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBJUksgbGlzdCBpbmRleAotICoKLSAqIFJldHVybnMgICAgICAgICAgaW5kZXggZnJvbSAwIH4gbWF4ICgxMjcgZGVmYXVsdCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRtX2JsZV9maW5kX2lya19pbmRleCh2b2lkKSB7Ci0gIHVpbnQ4X3QgaSA9IDA7Ci0gIHVpbnQ4X3QgYnl0ZTsKLSAgdWludDhfdCBiaXQ7Ci0KLSAgd2hpbGUgKGkgPCBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZSgpKSB7Ci0gICAgYnl0ZSA9IGkgLyA4OwotICAgIGJpdCA9IGkgJSA4OwotCi0gICAgaWYgKChidG1fY2IuYmxlX2N0cl9jYi5pcmtfbGlzdF9tYXNrW2J5dGVdICYgKDEgPDwgYml0KSkgPT0gMCkgewotICAgICAgYnRtX2NiLmJsZV9jdHJfY2IuaXJrX2xpc3RfbWFza1tieXRlXSB8PSAoMSA8PCBiaXQpOwotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIGkrKzsKLSAgfQotCi0gIEJUTV9UUkFDRV9FUlJPUigiJXMgZmFpbGVkLCBsaXN0IGZ1bGwiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiBpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV91cGRhdGVfcmVzb2x2aW5nX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHVwZGF0ZSByZXNvbHZpbmcgbGlzdCBlbnRyeSBpbiBob3N0IG1haW50YWluZWQgcmVjb3JkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfdXBkYXRlX3Jlc29sdmluZ19saXN0KGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYocHNldWRvX2JkYSk7Ci0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgcmV0dXJuOwotCi0gIGlmIChhZGQpIHsKLSAgICBwX2Rldl9yZWMtPmJsZS5pbl9jb250cm9sbGVyX2xpc3QgfD0gQlRNX1JFU09MVklOR19MSVNUX0JJVDsKLSAgICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpKQotICAgICAgcF9kZXZfcmVjLT5ibGUucmVzb2x2aW5nX2xpc3RfaW5kZXggPSBidG1fYmxlX2ZpbmRfaXJrX2luZGV4KCk7Ci0gIH0gZWxzZSB7Ci0gICAgcF9kZXZfcmVjLT5ibGUuaW5fY29udHJvbGxlcl9saXN0ICY9IH5CVE1fUkVTT0xWSU5HX0xJU1RfQklUOwotICAgIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9wcml2YWN5KCkpIHsKLSAgICAgIC8qIGNsZWFyIElSSyBsaXN0IGluZGV4IG1hc2sgKi8KLSAgICAgIGJ0bV9ibGVfY2xlYXJfaXJrX2luZGV4KHBfZGV2X3JlYy0+YmxlLnJlc29sdmluZ19saXN0X2luZGV4KTsKLSAgICAgIHBfZGV2X3JlYy0+YmxlLnJlc29sdmluZ19saXN0X2luZGV4ID0gMDsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgY2xlYXJfcmVzb2x2aW5nX2xpc3RfYml0KHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGRhdGEpOwotICBwX2Rldl9yZWMtPmJsZS5pbl9jb250cm9sbGVyX2xpc3QgJj0gfkJUTV9SRVNPTFZJTkdfTElTVF9CSVQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdF9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBjb21tYW5kIGNvbXBsZXRlIGZvcgotICogICAgICAgICAgICAgICAgICBjbGVhciByZXNvbHZpbmcgbGlzdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3RfY29tcGxldGUodWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbikgewotICB1aW50OF90IHN0YXR1cyA9IDA7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXMgc3RhdHVzPSVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgIGlmIChldnRfbGVuID49IDMpIHsKLSAgICAgIC8qIFZTQyBjb21wbGV0ZSBoYXMgb25lIGV4dHJhIGJ5dGUgZm9yIG9wIGNvZGUgYW5kIGxpc3Qgc2l6ZSwgc2tpcCBpdCBoZXJlCi0gICAgICAgKi8KLSAgICAgIHArKzsKLQotICAgICAgLyogdXBkYXRlZCB0aGUgYXZhaWxhYmxlIGxpc3Qgc2l6ZSwgYW5kIGN1cnJlbnQgbGlzdCBzaXplICovCi0gICAgICB1aW50OF90IGlya19saXN0X3N6X21heCA9IDA7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoaXJrX2xpc3Rfc3pfbWF4LCBwKTsKLQotICAgICAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgPT0gMCkKLSAgICAgICAgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9pbml0KGlya19saXN0X3N6X21heCk7Ci0KLSAgICAgIHVpbnQ4X3QgaXJrX21hc2tfc2l6ZSA9IChpcmtfbGlzdF9zel9tYXggJSA4KSA/IChpcmtfbGlzdF9zel9tYXggLyA4ICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpcmtfbGlzdF9zel9tYXggLyA4KTsKLSAgICAgIG1lbXNldChidG1fY2IuYmxlX2N0cl9jYi5pcmtfbGlzdF9tYXNrLCAwLCBpcmtfbWFza19zaXplKTsKLSAgICB9Ci0KLSAgICBidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplID0KLSAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoKTsKLQotICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgcmVzb2x2aW5nX2xpc3RfYXZhaWxfc2l6ZT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplKTsKLQotICAgIGxpc3RfZm9yZWFjaChidG1fY2Iuc2VjX2Rldl9yZWMsIGNsZWFyX3Jlc29sdmluZ19saXN0X2JpdCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfYWRkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNvbW1hbmQgY29tcGxldGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIGFkZCByZXNvbHZpbmcgbGlzdCBlbnRyeQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfYWRkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXMgc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQotICBSYXdBZGRyZXNzIHBzZXVkb19iZGE7Ci0gIGlmICghYnRtX2JsZV9kZXFfcmVzb2x2aW5nX3BlbmRpbmcocHNldWRvX2JkYSkpIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoIm5vIHBlbmRpbmcgcmVzb2x2aW5nIGxpc3Qgb3BlcmF0aW9uIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgIGJ0bV9ibGVfdXBkYXRlX3Jlc29sdmluZ19saXN0KHBzZXVkb19iZGEsIHRydWUpOwotICAgIC8qIHByaXZhY3kgMS4yIGNvbW1hbmQgY29tcGxldGUgZG9lcyBub3QgaGF2ZSB0aGVzZSBleHRyYSBieXRlICovCi0gICAgaWYgKGV2dF9sZW4gPiAyKSB7Ci0gICAgICAvKiBWU0MgY29tcGxldGUgaGFzIG9uZSBleHRyYSBieXRlIGZvciBvcCBjb2RlLCBza2lwIGl0IGhlcmUgKi8KLSAgICAgIHArKzsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplLCBwKTsKLSAgICB9IGVsc2UKLSAgICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnJlc29sdmluZ19saXN0X2F2YWlsX3NpemUtLTsKLSAgfSBlbHNlIGlmIChzdGF0dXMgPT0KLSAgICAgICAgICAgICBIQ0lfRVJSX01FTU9SWV9GVUxMKSAvKiBCVF9FUlJPUl9DT0RFX01FTU9SWV9DQVBBQ0lUWV9FWENFRURFRCAgKi8KLSAgewotICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnJlc29sdmluZ19saXN0X2F2YWlsX3NpemUgPSAwOwotICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgUmVzb2x2aW5nIGxpc3QgRnVsbCAiLCBfX2Z1bmNfXyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNvbW1hbmQgY29tcGxldGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIHJlbW92ZSByZXNvbHZpbmcgbGlzdCBlbnRyeQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgUmF3QWRkcmVzcyBwc2V1ZG9fYmRhOwotICB1aW50OF90IHN0YXR1czsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLQotICBCVE1fVFJBQ0VfREVCVUcoIiVzIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0KLSAgaWYgKCFidG1fYmxlX2RlcV9yZXNvbHZpbmdfcGVuZGluZyhwc2V1ZG9fYmRhKSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXMgbm8gcGVuZGluZyByZXNvbHZpbmcgbGlzdCBvcGVyYXRpb24iLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgIC8qIHByb3ByaWV0YXJ5OiBzcGVjIGRvZXMgbm90IGhhdmUgdGhlc2UgZXh0cmEgYnl0ZXMgKi8KLSAgICBpZiAoZXZ0X2xlbiA+IDIpIHsKLSAgICAgIHArKzsgLyogc2tpcCBvcGNvZGUgKi8KLSAgICAgIFNUUkVBTV9UT19VSU5UOChidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplLCBwKTsKLSAgICB9IGVsc2UKLSAgICAgIGJ0bV9jYi5ibGVfY3RyX2NiLnJlc29sdmluZ19saXN0X2F2YWlsX3NpemUrKzsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNvbW1hbmQgY29tcGxldGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIHJlbW92ZSByZXNvbHZpbmcgbGlzdCBlbnRyeQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZSh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICBSYXdBZGRyZXNzIHJyYSwgcHNldWRvX2JkYTsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLQotICBCVE1fVFJBQ0VfREVCVUcoIiVzIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0KLSAgaWYgKCFidG1fYmxlX2RlcV9yZXNvbHZpbmdfcGVuZGluZyhwc2V1ZG9fYmRhKSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigibm8gcGVuZGluZyByZXNvbHZpbmcgbGlzdCBvcGVyYXRpb24iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgLyogcHJvcHJpZXRhcnkgc3BlYyBoYXMgZXh0cmEgYnl0ZXMgKi8KLSAgICBpZiAoZXZ0X2xlbiA+IDgpIHsKLSAgICAgIC8qIHNraXAgc3ViY29kZSwgaW5kZXgsIElSSyB2YWx1ZSwgYWRkcmVzcyB0eXBlLCBpZGVudGl0eSBhZGRyIHR5cGUgKi8KLSAgICAgIHAgKz0gKDIgKyAxNiArIDEgKyA2KTsKLSAgICAgIFNUUkVBTV9UT19CREFERFIocnJhLCBwKTsKLQotICAgICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIHBlZXJfYWRkcjogIiA8PCBycmE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNUUkVBTV9UT19CREFERFIocnJhLCBwKTsKLSAgICB9Ci0gICAgYnRtX2JsZV9yZWZyZXNoX3BlZXJfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgICAgIHBzZXVkb19iZGEsIHJyYSwgdEJUTV9TRUNfQkxFOjp0QUREUkVTU19UWVBFOjpCVE1fQkxFX0FERFJfUFNFVURPKTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICBWU0MgdGhhdCBpbXBsZW1lbnQgY29udHJvbGxlciBiYXNlZCBwcml2YWN5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfdnNjX29wX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIElSSyBvcGVyYXRpb24gVlNDIGNvbXBsZXRlIGhhbmRsZXIKLSAqCi0gKiBQYXJhbWV0ZXJzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfdnNjX29wX2NtcGwodEJUTV9WU0NfQ01QTCogcF9wYXJhbXMpIHsKLSAgdWludDhfdCAqcCA9IHBfcGFyYW1zLT5wX3BhcmFtX2J1Ziwgb3Bfc3ViY29kZTsKLSAgdWludDE2X3QgZXZ0X2xlbiA9IHBfcGFyYW1zLT5wYXJhbV9sZW47Ci0KLSAgb3Bfc3ViY29kZSA9ICoocCArIDEpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXMgb3Bfc3ViY29kZSA9ICVkIiwgX19mdW5jX18sIG9wX3N1YmNvZGUpOwotCi0gIGlmIChvcF9zdWJjb2RlID09IEJUTV9CTEVfTUVUQV9DTEVBUl9JUktfTElTVCkgewotICAgIGJ0bV9ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3RfY29tcGxldGUocCwgZXZ0X2xlbik7Ci0gIH0gZWxzZSBpZiAob3Bfc3ViY29kZSA9PSBCVE1fQkxFX01FVEFfQUREX0lSS19FTlRSWSkgewotICAgIGJ0bV9ibGVfYWRkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKHAsIGV2dF9sZW4pOwotICB9IGVsc2UgaWYgKG9wX3N1YmNvZGUgPT0gQlRNX0JMRV9NRVRBX1JFTU9WRV9JUktfRU5UUlkpIHsKLSAgICBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZShwLCBldnRfbGVuKTsKLSAgfSBlbHNlIGlmIChvcF9zdWJjb2RlID09IEJUTV9CTEVfTUVUQV9SRUFEX0lSS19FTlRSWSkgewotICAgIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZShwLCBldnRfbGVuKTsKLSAgfSBlbHNlIGlmIChvcF9zdWJjb2RlID09IEJUTV9CTEVfTUVUQV9JUktfRU5BQkxFKSB7Ci0gICAgLyogUlBBIG9mZmxvYWRpbmcgZW5hYmxlL2Rpc2FibGVkICovCi0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbiBJUksgZW50cnkgZnJvbSB0aGUgbGlzdAotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmxlX2FkZHJfdHlwZTogYWRkcmVzcyB0eXBlCi0gKiAgICAgICAgICAgICAgICAgIGJsZV9hZGRyOiBMRSBhZGRkcmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RhdHVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5KHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICAvKiBpZiBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgUlBBIG9mZmxvYWRpbmcgb3IgcHJpdmFjeSAxLjIsIHNraXAgKi8KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgPT0gMCkKLSAgICByZXR1cm4gQlRNX1dST05HX01PREU7Ci0KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpKSB7Ci0gICAgYnRzbmRfaGNpY19ibGVfcm1fZGV2aWNlX3Jlc29sdmluZ19saXN0KAotICAgICAgICBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlLAotICAgICAgICBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEpOwotICB9IGVsc2UgewotICAgIHVpbnQ4X3QgcGFyYW1bMjBdID0gezB9OwotICAgIHVpbnQ4X3QqIHAgPSBwYXJhbTsKLQotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBCVE1fQkxFX01FVEFfUkVNT1ZFX0lSS19FTlRSWSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLnR5cGUpOwotICAgIEJEQUREUl9UT19TVFJFQU0ocCwgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhKTsKLQotICAgIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQoSENJX1ZFTkRPUl9CTEVfUlBBX1ZTQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfTUVUQV9SRU1PVkVfSVJLX0xFTiwgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG1fYmxlX3Jlc29sdmluZ19saXN0X3ZzY19vcF9jbXBsKTsKLSAgfQotCi0gIGJ0bV9ibGVfZW5xX3Jlc29sdmluZ19saXN0X3BlbmRpbmcocF9kZXZfcmVjLT5iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfTUVUQV9SRU1PVkVfSVJLX0VOVFJZKTsKLSAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSByZXNvbHZpbmcgIGxpc3QKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdCh2b2lkKSB7Ci0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX3ByaXZhY3koKSkgewotICAgIGJ0c25kX2hjaWNfYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDhfdCBwYXJhbVsyMF0gPSB7MH07Ci0gICAgdWludDhfdCogcCA9IHBhcmFtOwotCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfTUVUQV9DTEVBUl9JUktfTElTVCk7Ci0gICAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZChIQ0lfVkVORE9SX0JMRV9SUEFfVlNDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9NRVRBX0NMRUFSX0lSS19MRU4sIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF92c2Nfb3BfY21wbCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWFkIGFuIElSSyBlbnRyeSBieSBpbmRleAotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgZW50cnkgaW5kZXguCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IHNlbnQsIGZhbHNlIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgaWYgKCEocF9kZXZfcmVjLT5ibGUuaW5fY29udHJvbGxlcl9saXN0ICYgQlRNX1JFU09MVklOR19MSVNUX0JJVCkpIHsKLSAgICBMT0dfSU5GTygiJXMgVW5hYmxlIHRvIHJlYWQgcmVzb2x2aW5nIGxpc3QgZW50cnkgYXMgcmVzb2x2aW5nIGJpdCBub3Qgc2V0IiwKLSAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpKSB7Ci0gICAgYnRzbmRfaGNpY19ibGVfcmVhZF9yZXNvbHZhYmxlX2FkZHJfcGVlcigKLSAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZSwKLSAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90IHBhcmFtWzIwXSA9IHswfTsKLSAgICB1aW50OF90KiBwID0gcGFyYW07Ci0KLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgQlRNX0JMRV9NRVRBX1JFQURfSVJLX0VOVFJZKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9kZXZfcmVjLT5ibGUucmVzb2x2aW5nX2xpc3RfaW5kZXgpOwotCi0gICAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZChIQ0lfVkVORE9SX0JMRV9SUEFfVlNDLCBCVE1fQkxFX01FVEFfUkVBRF9JUktfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0sIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfdnNjX29wX2NtcGwpOwotICB9Ci0KLSAgYnRtX2JsZV9lbnFfcmVzb2x2aW5nX2xpc3RfcGVuZGluZyhwX2Rldl9yZWMtPmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9NRVRBX1JFQURfSVJLX0VOVFJZKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfc3VzcGVuZF9yZXNvbHZpbmdfbGlzdF9hY3Rpdml0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzdXNwZW5kcyBhbGwgcmVzb2x2aW5nIGxpc3QgYWN0aXZpdHksCi0gKiAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBzY2FubmluZywgaW5pdGlhdGluZywgYW5kIGFkdmVydGlzaW5nLCBpZgotICogICAgICAgICAgICAgICAgICByZXNvbHZpbmcgbGlzdCBpcyBiZWluZyBlbmFibGVkLgotICoKLSAqIFBhcmFtZXRlcnMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VzcGVuZGVkOyBmYWxzZSBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRtX2JsZV9zdXNwZW5kX3Jlc29sdmluZ19saXN0X2FjdGl2aXR5KHZvaWQpIHsKLSAgdEJUTV9CTEVfQ0IqIHBfYmxlX2NiID0gJmJ0bV9jYi5ibGVfY3RyX2NiOwotCi0gIC8qIGlmIHJlc29sdmluZyBsaXN0IGlzIG5vdCBlbmFibGVkLCBkbyBub3QgbmVlZCB0byB0ZXJtaW5hdGUgYW55IGFjdGl2aXR5ICovCi0gIC8qIGlmIGFza2luZyBmb3Igc3RvcCBhbGwgYWN0aXZpdHkgKi8KLSAgLyogaWYgYWxyZWFkeSBzdXNwZW5kZWQgKi8KLSAgaWYgKHBfYmxlX2NiLT5zdXNwZW5kZWRfcmxfc3RhdGUgIT0gQlRNX0JMRV9STF9JRExFKSByZXR1cm4gdHJ1ZTsKLQotICBwX2JsZV9jYi0+c3VzcGVuZGVkX3JsX3N0YXRlID0gQlRNX0JMRV9STF9JRExFOwotCi0gIGlmIChwX2JsZV9jYi0+aW5xX3Zhci5hZHZfbW9kZSA9PSBCVE1fQkxFX0FEVl9FTkFCTEUpIHsKLSAgICBidG1fYmxlX3N0b3BfYWR2KCk7Ci0gICAgcF9ibGVfY2ItPnN1c3BlbmRlZF9ybF9zdGF0ZSB8PSBCVE1fQkxFX1JMX0FEVjsKLSAgfQotCi0gIC8vIElmIGl0J3Mgbm9uLVZTQyBpbXBsZW1lbnRhdGlvbiwgc3VzcGVuZAotICBpZiAoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpJc0luaXRpYWxpemVkKCkgJiYKLSAgICAgIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX2V4dGVuZGVkX2FkdmVydGlzaW5nKCkgfHwKLSAgICAgICBCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KCkgPT0gMCkpIHsKLSAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TdXNwZW5kKCk7Ci0gIH0KLQotICBpZiAocF9ibGVfY2ItPmlzX2JsZV9zY2FuX2FjdGl2ZSgpKSB7Ci0gICAgYnRtX2JsZV9zdG9wX3NjYW4oKTsKLSAgICBwX2JsZV9jYi0+c3VzcGVuZGVkX3JsX3N0YXRlIHw9IEJUTV9CTEVfUkxfU0NBTjsKLSAgfQotCi0gIGlmIChidG1fYmxlX3N1c3BlbmRfYmdfY29ubigpKQotICAgIHBfYmxlX2NiLT5zdXNwZW5kZWRfcmxfc3RhdGUgfD0gQlRNX0JMRV9STF9JTklUOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9yZXN1bWVfcmVzb2x2aW5nX2xpc3RfYWN0aXZpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzdW1lcyB0aGUgcmVzb2x2aW5nIGxpc3QgYWN0aXZpdHksIGluY2x1ZGluZwotICogICAgICAgICAgICAgICAgICBzY2FubmluZywgaW5pdGlhdGluZywgYW5kIGFkdmVydGlzaW5nLCBpZiBhbnkgb2YgdGhlc2UKLSAqICAgICAgICAgICAgICAgICAgYWN0aXZpdGllcyBoYXMgYmVlbiBzdXNwZW5kZWQgZWFybGllci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX2JsZV9yZXN1bWVfcmVzb2x2aW5nX2xpc3RfYWN0aXZpdHkodm9pZCkgewotICB0QlRNX0JMRV9DQiogcF9ibGVfY2IgPSAmYnRtX2NiLmJsZV9jdHJfY2I7Ci0KLSAgaWYgKHBfYmxlX2NiLT5zdXNwZW5kZWRfcmxfc3RhdGUgJiBCVE1fQkxFX1JMX0FEVikgewotICAgIGJ0bV9ibGVfc3RhcnRfYWR2KCk7Ci0gICAgTE9HX0RFQlVHKCJTdGFydGVkIGJsZSBhZHZlcnRpc2luZyIpOwotICB9Ci0KLSAgLy8gSWYgaXQncyBub24tVlNDIGltcGxlbWVudGF0aW9uLCByZXN1bWUKLSAgaWYgKEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6SXNJbml0aWFsaXplZCgpICYmCi0gICAgICAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9leHRlbmRlZF9hZHZlcnRpc2luZygpIHx8Ci0gICAgICAgQlRNX0JsZU1heE11bHRpQWR2SW5zdGFuY2VDb3VudCgpID09IDApKSB7Ci0gICAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVzdW1lKCk7Ci0gICAgTE9HX0RFQlVHKCJSZXN1bWVkIGJsZSBhZHZlcnRpc2luZyBtYW5hZ2VyIik7Ci0gIH0KLQotICBpZiAocF9ibGVfY2ItPnN1c3BlbmRlZF9ybF9zdGF0ZSAmIEJUTV9CTEVfUkxfU0NBTikgewotICAgIGJ0bV9ibGVfc3RhcnRfc2NhbigpOwotICAgIExPR19ERUJVRygiU3RhcnRlZCByZXNvbHZpbmcgbGlzdCBzY2FuIik7Ci0gIH0KLQotICBpZiAocF9ibGVfY2ItPnN1c3BlbmRlZF9ybF9zdGF0ZSAmIEJUTV9CTEVfUkxfSU5JVCkgewotICAgIGJ0bV9ibGVfcmVzdW1lX2JnX2Nvbm4oKTsKLSAgICBMT0dfREVCVUcoIlJlc3VtZWQgYmFja2dyb3VuZCBjb25uZWN0aW9ucyIpOwotICB9Ci0KLSAgcF9ibGVfY2ItPnN1c3BlbmRlZF9ybF9zdGF0ZSA9IEJUTV9CTEVfUkxfSURMRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfdmVuZG9yX2VuYWJsZV9pcmtfZmVhdHVyZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIFJSQQotICogICAgICAgICAgICAgICAgICBvZmZsb2FkaW5nIGZlYXR1cmUuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBlbmFibGU6IGVuYWJsZSBvciBkaXNhYmxlIHRoZSBSUkEgb2ZmbG9hZGluZyBmZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfdmVuZG9yX2VuYWJsZV9pcmtfZmVhdHVyZShib29sIGVuYWJsZSkgewotICB1aW50OF90IHBhcmFtWzIwXSwgKnA7Ci0KLSAgcCA9IHBhcmFtOwotICBtZW1zZXQocGFyYW0sIDAsIDIwKTsKLQotICAvKiBzZWxlY3QgZmVhdHVyZSBiYXNlZCBvbiBjb250cm9sIGJsb2NrIHNldHRpbmdzICovCi0gIFVJTlQ4X1RPX1NUUkVBTShwLCBCVE1fQkxFX01FVEFfSVJLX0VOQUJMRSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBlbmFibGUgPyAweDAxIDogMHgwMCk7Ci0KLSAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZChIQ0lfVkVORE9SX0JMRV9SUEFfVlNDLCBCVE1fQkxFX0lSS19FTkFCTEVfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLCBidG1fYmxlX3Jlc29sdmluZ19saXN0X3ZzY19vcF9jbXBsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfZXhlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGV4ZWN1dGUgcmVzb2x2aW5nIGxpc3QgZGlzYWJsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidG1fYmxlX2V4ZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0KHZvaWQpIHsKLSAgaWYgKCFidG1fYmxlX3N1c3BlbmRfcmVzb2x2aW5nX2xpc3RfYWN0aXZpdHkoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9wcml2YWN5KCkpCi0gICAgYnRtX2JsZV92ZW5kb3JfZW5hYmxlX2lya19mZWF0dXJlKGZhbHNlKTsKLSAgZWxzZQotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9hZGRyX3Jlc29sdXRpb25fZW5hYmxlKGZhbHNlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfZXhlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZW5hYmxlIExFIHJlc29sdmUgYWRkcmVzcyBsaXN0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9ibGVfZXhlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdCh2b2lkKSB7Ci0gIGlmICghYnRtX2JsZV9zdXNwZW5kX3Jlc29sdmluZ19saXN0X2FjdGl2aXR5KCkpIHJldHVybjsKLQotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpKQotICAgIGJ0bV9ibGVfdmVuZG9yX2VuYWJsZV9pcmtfZmVhdHVyZSh0cnVlKTsKLSAgZWxzZQotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9hZGRyX3Jlc29sdXRpb25fZW5hYmxlKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNhYmxlIExFIEFkZHJlc3MgcmVzb2x1dGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9ibGVfZGlzYWJsZV9yZXNvbHZpbmdfbGlzdCh1aW50OF90IHJsX21hc2ssIGJvb2wgdG9fcmVzdW1lKSB7Ci0gIHVpbnQ4X3Qgcmxfc3RhdGUgPSBidG1fY2IuYmxlX2N0cl9jYi5ybF9zdGF0ZTsKLQotICAvKiBpZiBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgUlBBIG9mZmxvYWRpbmcgb3IgcHJpdmFjeSAxLjIsIHNraXAgKi8KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYnRtX2NiLmJsZV9jdHJfY2Iucmxfc3RhdGUgJj0gfnJsX21hc2s7Ci0KLSAgaWYgKHJsX3N0YXRlICE9IEJUTV9CTEVfUkxfSURMRSAmJgotICAgICAgYnRtX2NiLmJsZV9jdHJfY2Iucmxfc3RhdGUgPT0gQlRNX0JMRV9STF9JRExFKSB7Ci0gICAgaWYgKGJ0bV9ibGVfZXhlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QoKSkgewotICAgICAgaWYgKHRvX3Jlc3VtZSkgYnRtX2JsZV9yZXN1bWVfcmVzb2x2aW5nX2xpc3RfYWN0aXZpdHkoKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfbG9hZF9kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkcyBhIGRldmljZSB3aGljaCBpcyB1c2luZyBSUEEgaW50byB0aGUKLSAqICAgICAgICAgICAgICAgICAgYWNjZXB0bGlzdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBvaW50ZXIgdG8gZGV2aWNlIHNlY3VyaXR5IHJlY29yZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZXZpY2UgYWRkZWQsIG90aGVyd2lzZSBmYWxhc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9sb2FkX2Rldih0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgY29uc3QgdWludDhfdCBybF9zdGF0ZSA9IGJ0bV9jYi5ibGVfY3RyX2NiLnJsX3N0YXRlOwotCi0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZSgpID09IDApIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICIlczogQ29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IFJQQSBvZmZsb2FkaW5nIG9yIHByaXZhY3kgMS4yIiwKLSAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXM6IGJ0bV9jYi5ibGVfY3RyX2NiLnByaXZhY3lfbW9kZSA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5wcml2YWN5X21vZGUpOwotCi0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlczogTm8gZGV2aWNlIHNlY3VyaXR5IHJlY29yZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBvbmx5IGFkZCBSUEEgZW5hYmxlZCBkZXZpY2UgaW50byByZXNvbHZpbmcgbGlzdCAqLwotICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9wcml2YWN5KCkpIHsKLSAgICBpZiAoKHBfZGV2X3JlYy0+YmxlLmtleV90eXBlICYgKEJUTV9MRV9LRVlfUElEIHwgQlRNX0xFX0tFWV9MSUQpKSA9PSAwKSB7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBwcml2YWN5IDEuMjogRGV2aWNlIG5vdCBhIFJQQSBlbmFibGVkIGRldmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIGlmICgocF9kZXZfcmVjLT5ibGUua2V5X3R5cGUgJiBCVE1fTEVfS0VZX1BJRCkgPT0gMCkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiJXM6IFJQQSBvZmZsb2FkaW5nOiBEZXZpY2Ugbm90IGEgUlBBIGVuYWJsZWQgZGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICgocF9kZXZfcmVjLT5ibGUuaW5fY29udHJvbGxlcl9saXN0ICYgQlRNX1JFU09MVklOR19MSVNUX0JJVCkgfHwKLSAgICAgIGJ0bV9ibGVfYnJjbV9maW5kX3Jlc29sdmluZ19wZW5kaW5nX2VudHJ5KHBfZGV2X3JlYy0+YmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfTUVUQV9BRERfSVJLX0VOVFJZKSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IERldmljZSBhbHJlYWR5IGluIFJlc29sdmluZyBsaXN0IiwgX19mdW5jX18pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKGJ0bV9jYi5ibGVfY3RyX2NiLnJlc29sdmluZ19saXN0X2F2YWlsX3NpemUgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChybF9zdGF0ZSAmJiAhYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0KHJsX3N0YXRlLCBmYWxzZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9wcml2YWN5KCkpIHsKLSAgICBjb25zdCBPY3RldDE2JiBwZWVyX2lyayA9IHBfZGV2X3JlYy0+YmxlLmtleXMuaXJrOwotICAgIGNvbnN0IE9jdGV0MTYmIGxvY2FsX2lyayA9IGJ0bV9jYi5kZXZjYi5pZF9rZXlzLmlyazsKLQotICAgIGlmIChwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEuSXNFbXB0eSgpKSB7Ci0gICAgICBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEgPSBwX2Rldl9yZWMtPmJkX2FkZHI7Ci0gICAgICBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS50eXBlID0KLSAgICAgICAgICBwX2Rldl9yZWMtPmJsZS5ibGVfYWRkcl90eXBlOwotICAgIH0KLQotICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBhZGRpbmcgZGV2aWNlICVzIHRvIGNvbnRyb2xsZXIgcmVzb2x2aW5nIGxpc3QiLCBfX2Z1bmNfXywKLSAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAvLyB1c2UgaWRlbnRpY2FsIElSSyBmb3Igbm93Ci0gICAgYnRzbmRfaGNpY19ibGVfYWRkX2RldmljZV9yZXNvbHZpbmdfbGlzdCgKLSAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZSwKLSAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhLCBwZWVyX2lyaywgbG9jYWxfaXJrKTsKLQotICAgIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlX3NldF9wcml2YWN5X21vZGUoKSkgewotICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlczogYWRkaW5nIGRldmljZSBwcml2YWN5IG1vZGUiLCBfX2Z1bmNfXyk7Ci0gICAgICBidHNuZF9oY2ljX2JsZV9zZXRfcHJpdmFjeV9tb2RlKAotICAgICAgICAgIHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlLnR5cGUsCi0gICAgICAgICAgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhLCAweDAxKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdWludDhfdCBwYXJhbVs0MF0gPSB7MH07Ci0gICAgdWludDhfdCogcCA9IHBhcmFtOwotCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEJUTV9CTEVfTUVUQV9BRERfSVJLX0VOVFJZKTsKLSAgICBBUlJBWV9UT19TVFJFQU0ocCwgcF9kZXZfcmVjLT5ibGUua2V5cy5pcmssIE9DVEVUMTZfTEVOKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUudHlwZSk7Ci0gICAgQkRBRERSX1RPX1NUUkVBTShwLCBwX2Rldl9yZWMtPmJsZS5pZGVudGl0eV9hZGRyZXNzX3dpdGhfdHlwZS5iZGEpOwotCi0gICAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZChIQ0lfVkVORE9SX0JMRV9SUEFfVlNDLCBCVE1fQkxFX01FVEFfQUREX0lSS19MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF92c2Nfb3BfY21wbCk7Ci0gIH0KLQotICBidG1fYmxlX2VucV9yZXNvbHZpbmdfbGlzdF9wZW5kaW5nKHBfZGV2X3JlYy0+YmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX01FVEFfQUREX0lSS19FTlRSWSk7Ci0KLSAgLyogaWYgcmVzb2x2aW5nIGxpc3QgaGFzIGJlZW4gdHVybmVkIG9uLCByZS1lbmFibGUgaXQgKi8KLSAgaWYgKHJsX3N0YXRlKQotICAgIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0KHJsX3N0YXRlKTsKLSAgZWxzZQotICAgIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0KEJUTV9CTEVfUkxfSU5JVCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX3Jlc29sdmluZ19saXN0X3JlbW92ZV9kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgZGV2aWNlIGZyb20gcmVzb2x2aW5nIGxpc3QKLSAqCi0gKiBQYXJhbWV0ZXJzCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdGF0dXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYmxlX3Jlc29sdmluZ19saXN0X3JlbW92ZV9kZXYodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIHVpbnQ4X3QgcmxfbWFzayA9IGJ0bV9jYi5ibGVfY3RyX2NiLnJsX3N0YXRlOwotCi0gIEJUTV9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChybF9tYXNrKSB7Ci0gICAgaWYgKCFidG1fYmxlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QocmxfbWFzaywgZmFsc2UpKSByZXR1cm47Ci0gIH0KLQotICBpZiAoKHBfZGV2X3JlYy0+YmxlLmluX2NvbnRyb2xsZXJfbGlzdCAmIEJUTV9SRVNPTFZJTkdfTElTVF9CSVQpICYmCi0gICAgICAhYnRtX2JsZV9icmNtX2ZpbmRfcmVzb2x2aW5nX3BlbmRpbmdfZW50cnkoCi0gICAgICAgICAgcF9kZXZfcmVjLT5iZF9hZGRyLCBCVE1fQkxFX01FVEFfUkVNT1ZFX0lSS19FTlRSWSkpIHsKLSAgICBidG1fYmxlX3VwZGF0ZV9yZXNvbHZpbmdfbGlzdChwX2Rldl9yZWMtPmJkX2FkZHIsIGZhbHNlKTsKLSAgICBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeShwX2Rldl9yZWMpOwotICB9IGVsc2UgewotICAgIEJUTV9UUkFDRV9ERUJVRygiRGV2aWNlIG5vdCBpbiByZXNvbHZpbmcgbGlzdCIpOwotICB9Ci0KLSAgLyogaWYgcmVzb2x2aW5nIGxpc3QgaGFzIGJlZW4gdHVybmVkIG9uLCByZS1lbmFibGUgaXQgKi8KLSAgaWYgKHJsX21hc2spIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0KHJsX21hc2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGVuYWJsZSBMRSByZXNvbHZlIGFkZHJlc3MgbGlzdAotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0KHVpbnQ4X3QgcmxfbWFzaykgewotICB1aW50OF90IHJsX3N0YXRlID0gYnRtX2NiLmJsZV9jdHJfY2Iucmxfc3RhdGU7Ci0KLSAgYnRtX2NiLmJsZV9jdHJfY2Iucmxfc3RhdGUgfD0gcmxfbWFzazsKLSAgaWYgKHJsX3N0YXRlID09IEJUTV9CTEVfUkxfSURMRSAmJgotICAgICAgYnRtX2NiLmJsZV9jdHJfY2Iucmxfc3RhdGUgIT0gQlRNX0JMRV9STF9JRExFICYmCi0gICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZSgpICE9IDApIHsKLSAgICBidG1fYmxlX2V4ZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QoKTsKLSAgICBidG1fYmxlX3Jlc3VtZV9yZXNvbHZpbmdfbGlzdF9hY3Rpdml0eSgpOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGlzX29uX3Jlc29sdmluZ19saXN0KHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXYgPSBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4oZGF0YSk7Ci0gIGlmICgocF9kZXYtPmJsZS5pbl9jb250cm9sbGVyX2xpc3QgJiBCVE1fUkVTT0xWSU5HX0xJU1RfQklUKSAmJgotICAgICAgKHBfZGV2LT5ibGUuaW5fY29udHJvbGxlcl9saXN0ICYgQlRNX0FDQ0VQVExJU1RfQklUKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGVuYWJsZS9kaXNhYmxlIHJlc29sdmluZyBsaXN0IGZlYXR1cmUgZGVwZW5kaW5nIG9uIGlmIGFueQotICogICAgICAgICAgICAgICAgICByZXNvbHZpbmcgbGlzdCBpcyBlbXB0eSBhbmQgYWNjZXB0bGlzdCBpcyBpbnZvbG92ZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm0odWludDhfdCBybF9tYXNrKSB7Ci0gIC8qIGlmIGNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCwgc2tpcCAqLwotICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoKSA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoYnRtX2NiLmJsZV9jdHJfY2Iud2xfc3RhdGUgPT0gQlRNX0JMRV9XTF9JRExFKSB7Ci0gICAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgPgotICAgICAgICBidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplKQotICAgICAgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QocmxfbWFzayk7Ci0gICAgZWxzZQotICAgICAgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0KHJsX21hc2ssIHRydWUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxpc3Rfbm9kZV90KiBuID0gbGlzdF9mb3JlYWNoKGJ0bV9jYi5zZWNfZGV2X3JlYywgaXNfb25fcmVzb2x2aW5nX2xpc3QsIE5VTEwpOwotICBpZiAobikKLSAgICBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdChybF9tYXNrKTsKLSAgZWxzZQotICAgIGJ0bV9ibGVfZGlzYWJsZV9yZXNvbHZpbmdfbGlzdChybF9tYXNrLCB0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSByZXNvbHZpbmcgbGlzdCBpbiBob3N0IHN0YWNrCi0gKgotICogUGFyYW1ldGVycyAgICAgICBNYXggcmVzb2x2aW5nIGxpc3Qgc2l6ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdCh1aW50OF90IG1heF9pcmtfbGlzdF9zeikgewotICB0QlRNX0JMRV9SRVNPTFZFX1EqIHBfcSA9ICZidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9wZW5kX3E7Ci0gIHVpbnQ4X3QgaXJrX21hc2tfc2l6ZSA9Ci0gICAgICAobWF4X2lya19saXN0X3N6ICUgOCkgPyAobWF4X2lya19saXN0X3N6IC8gOCArIDEpIDogKG1heF9pcmtfbGlzdF9zeiAvIDgpOwotCi0gIGlmIChtYXhfaXJrX2xpc3Rfc3ogPiAwKSB7Ci0gICAgcF9xLT5yZXNvbHZlX3FfcmFuZG9tX3BzZXVkbyA9Ci0gICAgICAgIChSYXdBZGRyZXNzKilvc2lfbWFsbG9jKHNpemVvZihSYXdBZGRyZXNzKSAqIG1heF9pcmtfbGlzdF9zeik7Ci0gICAgcF9xLT5yZXNvbHZlX3FfYWN0aW9uID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MobWF4X2lya19saXN0X3N6KTsKLQotICAgIC8qIFJQQSBvZmZsb2FkaW5nIGZlYXR1cmUgKi8KLSAgICBpZiAoYnRtX2NiLmJsZV9jdHJfY2IuaXJrX2xpc3RfbWFzayA9PSBOVUxMKQotICAgICAgYnRtX2NiLmJsZV9jdHJfY2IuaXJrX2xpc3RfbWFzayA9ICh1aW50OF90Kilvc2lfbWFsbG9jKGlya19tYXNrX3NpemUpOwotCi0gICAgQlRNX1RSQUNFX0RFQlVHKCIlcyBtYXhfaXJrX2xpc3Rfc3ogPSAlZCIsIF9fZnVuY19fLCBtYXhfaXJrX2xpc3Rfc3opOwotICB9Ci0KLSAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnNldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUobWF4X2lya19saXN0X3N6KTsKLSAgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdCgpOwotICBidG1fY2IuYmxlX2N0cl9jYi5yZXNvbHZpbmdfbGlzdF9hdmFpbF9zaXplID0gbWF4X2lya19saXN0X3N6OwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9jbGllbnRfaW50ZXJmYWNlLmNjIGIvc3RhY2svYnRtL2J0bV9jbGllbnRfaW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ZlMzJlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fY2xpZW50X2ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdHJ1Y3QgYnRtX2NsaWVudF9pbnRlcmZhY2VfcyBidG1fY2xpZW50X2ludGVyZmFjZSA9IHsKLSAgICAubGlmZWN5Y2xlID0KLSAgICAgICAgewotICAgICAgICAgICAgLkJUTV9HZXRIQ0lDb25uSGFuZGxlID0gQlRNX0dldEhDSUNvbm5IYW5kbGUsCi0gICAgICAgICAgICAuQlRNX1BtUmVnaXN0ZXIgPSBCVE1fUG1SZWdpc3RlciwKLSAgICAgICAgICAgIC5CVE1fVmVuZG9yU3BlY2lmaWNDb21tYW5kID0gQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZCwKLSAgICAgICAgICAgIC5BQ0xfUmVnaXN0ZXJDbGllbnQgPSBBQ0xfUmVnaXN0ZXJDbGllbnQsCi0gICAgICAgICAgICAuQUNMX1VucmVnaXN0ZXJDbGllbnQgPSBBQ0xfVW5yZWdpc3RlckNsaWVudCwKLSAgICAgICAgICAgIC5idG1faW5pdCA9IGJ0bV9pbml0LAotICAgICAgICAgICAgLmJ0bV9mcmVlID0gYnRtX2ZyZWUsCi0gICAgICAgICAgICAuYnRtX2JsZV9pbml0ID0gYnRtX2JsZV9pbml0LAotICAgICAgICAgICAgLmJ0bV9ibGVfZnJlZSA9IGJ0bV9ibGVfZnJlZSwKLSAgICAgICAgICAgIC5CVE1fcmVzZXRfY29tcGxldGUgPSBCVE1fcmVzZXRfY29tcGxldGUsCi0gICAgICAgIH0sCi0KLSAgICAuc2NuID0KLSAgICAgICAgewotICAgICAgICAgICAgLkJUTV9BbGxvY2F0ZVNDTiA9IEJUTV9BbGxvY2F0ZVNDTiwKLSAgICAgICAgICAgIC5CVE1fVHJ5QWxsb2NhdGVTQ04gPSBCVE1fVHJ5QWxsb2NhdGVTQ04sCi0gICAgICAgICAgICAuQlRNX0ZyZWVTQ04gPSBCVE1fRnJlZVNDTiwKLSAgICAgICAgfSwKLQotICAgIC5uZWlnaGJvciA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC5CVE1fQ2FuY2VsSW5xdWlyeSA9IEJUTV9DYW5jZWxJbnF1aXJ5LAotICAgICAgICAgICAgLkJUTV9DbGVhcklucURiID0gQlRNX0NsZWFySW5xRGIsCi0gICAgICAgICAgICAuQlRNX0lucURiTmV4dCA9IEJUTV9JbnFEYk5leHQsCi0gICAgICAgICAgICAuQlRNX1NldENvbm5lY3RhYmlsaXR5ID0gQlRNX1NldENvbm5lY3RhYmlsaXR5LAotICAgICAgICAgICAgLkJUTV9TZXREaXNjb3ZlcmFiaWxpdHkgPSBCVE1fU2V0RGlzY292ZXJhYmlsaXR5LAotICAgICAgICAgICAgLkJUTV9TdGFydElucXVpcnkgPSBCVE1fU3RhcnRJbnF1aXJ5LAotICAgICAgICAgICAgLkJUTV9Jc0lucXVpcnlBY3RpdmUgPSBCVE1fSXNJbnF1aXJ5QWN0aXZlLAotICAgICAgICAgICAgLkJUTV9TZXRJbnF1aXJ5TW9kZSA9IEJUTV9TZXRJbnF1aXJ5TW9kZSwKLSAgICAgICAgICAgIC5CVE1fRW5hYmxlSW50ZXJsYWNlZElucXVpcnlTY2FuID0gQlRNX0VuYWJsZUludGVybGFjZWRJbnF1aXJ5U2NhbiwKLSAgICAgICAgICAgIC5CVE1fRW5hYmxlSW50ZXJsYWNlZFBhZ2VTY2FuID0gQlRNX0VuYWJsZUludGVybGFjZWRQYWdlU2NhbiwKLSAgICAgICAgfSwKLQotICAgIC8vIEFjbCBwZWVyIGFuZCBsaWZlY3ljbGUKLSAgICAucGVlciA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC5mZWF0dXJlcyA9Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAuU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDTF9TdXBwb3J0VHJhbnNwYXJlbnRTeW5jaHJvbm91c0RhdGEsCi0gICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgLkJUTV9DYW5jZWxSZW1vdGVEZXZpY2VOYW1lID0gQlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUsCi0gICAgICAgICAgICAuQlRNX0lzQWNsQ29ubmVjdGlvblVwID0gQlRNX0lzQWNsQ29ubmVjdGlvblVwLAotICAgICAgICAgICAgLkJUTV9SZWFkQ29ubmVjdGVkVHJhbnNwb3J0QWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgQlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzLAotICAgICAgICAgICAgLkJUTV9SZWFkRGV2SW5mbyA9IEJUTV9SZWFkRGV2SW5mbywKLSAgICAgICAgICAgIC5CVE1fUmVhZFJlbW90ZURldmljZU5hbWUgPSBCVE1fUmVhZFJlbW90ZURldmljZU5hbWUsCi0gICAgICAgICAgICAuQlRNX1JlYWRSZW1vdGVGZWF0dXJlcyA9IEJUTV9SZWFkUmVtb3RlRmVhdHVyZXMsCi0gICAgICAgICAgICAuQlRNX0dldE1heFBhY2tldFNpemUgPSBCVE1fR2V0TWF4UGFja2V0U2l6ZSwKLSAgICAgICAgICAgIC5CVE1fUmVhZFJlbW90ZVZlcnNpb24gPSBCVE1fUmVhZFJlbW90ZVZlcnNpb24sCi0gICAgICAgIH0sCi0KLSAgICAubGlua19wb2xpY3kgPQotICAgICAgICB7Ci0gICAgICAgICAgICAuQlRNX0dldFJvbGUgPSBCVE1fR2V0Um9sZSwKLSAgICAgICAgICAgIC5CVE1fU2V0UG93ZXJNb2RlID0gQlRNX1NldFBvd2VyTW9kZSwKLSAgICAgICAgICAgIC5CVE1fU2V0U3NyUGFyYW1zID0gQlRNX1NldFNzclBhcmFtcywKLSAgICAgICAgICAgIC5CVE1fU3dpdGNoUm9sZVRvQ2VudHJhbCA9IEJUTV9Td2l0Y2hSb2xlVG9DZW50cmFsLAotICAgICAgICAgICAgLkJUTV9Xcml0ZVBhZ2VUaW1lb3V0ID0gQlRNX1dyaXRlUGFnZVRpbWVvdXQsCi0gICAgICAgICAgICAuQlRNX2Jsb2NrX3JvbGVfc3dpdGNoX2ZvciA9IEJUTV9ibG9ja19yb2xlX3N3aXRjaF9mb3IsCi0gICAgICAgICAgICAuQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yID0gQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yLAotICAgICAgICAgICAgLkJUTV9kZWZhdWx0X3VuYmxvY2tfcm9sZV9zd2l0Y2ggPSBCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoLAotICAgICAgICAgICAgLkJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2ZvciA9IEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2ZvciwKLSAgICAgICAgICAgIC5CVE1fdW5ibG9ja19zbmlmZl9tb2RlX2ZvciA9IEJUTV91bmJsb2NrX3NuaWZmX21vZGVfZm9yLAotICAgICAgICB9LAotCi0gICAgLmxpbmtfY29udHJvbGxlciA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC5CVE1fR2V0TGlua1N1cGVyVG91dCA9IEJUTV9HZXRMaW5rU3VwZXJUb3V0LAotICAgICAgICAgICAgLkJUTV9SZWFkUlNTSSA9IEJUTV9SZWFkUlNTSSwKLSAgICAgICAgfSwKLQotICAgIC5zZWN1cml0eSA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC5CVE1fQ29uZmlybVJlcVJlcGx5ID0gQlRNX0NvbmZpcm1SZXFSZXBseSwKLSAgICAgICAgICAgIC5CVE1fUElOQ29kZVJlcGx5ID0gQlRNX1BJTkNvZGVSZXBseSwKLSAgICAgICAgICAgIC5CVE1fUmVtb3RlT29iRGF0YVJlcGx5ID0gQlRNX1JlbW90ZU9vYkRhdGFSZXBseSwKLSAgICAgICAgICAgIC5CVE1fU2VjQWRkQmxlRGV2aWNlID0gQlRNX1NlY0FkZEJsZURldmljZSwKLSAgICAgICAgICAgIC5CVE1fU2VjQWRkQmxlS2V5ID0gQlRNX1NlY0FkZEJsZUtleSwKLSAgICAgICAgICAgIC5CVE1fU2VjQWRkRGV2aWNlID0gQlRNX1NlY0FkZERldmljZSwKLSAgICAgICAgICAgIC5CVE1fU2VjQWRkUm10TmFtZU5vdGlmeUNhbGxiYWNrID0gQlRNX1NlY0FkZFJtdE5hbWVOb3RpZnlDYWxsYmFjaywKLSAgICAgICAgICAgIC5CVE1fU2VjQm9uZCA9IEJUTV9TZWNCb25kLAotICAgICAgICAgICAgLkJUTV9TZWNCb25kQ2FuY2VsID0gQlRNX1NlY0JvbmRDYW5jZWwsCi0gICAgICAgICAgICAuQlRNX1NlY0NsZWFyU2VjdXJpdHlGbGFncyA9IEJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MsCi0gICAgICAgICAgICAuQlRNX1NlY0NsclNlcnZpY2UgPSBCVE1fU2VjQ2xyU2VydmljZSwKLSAgICAgICAgICAgIC5CVE1fU2VjQ2xyU2VydmljZUJ5UHNtID0gQlRNX1NlY0NsclNlcnZpY2VCeVBzbSwKLSAgICAgICAgICAgIC5CVE1fU2VjRGVsZXRlRGV2aWNlID0gQlRNX1NlY0RlbGV0ZURldmljZSwKLSAgICAgICAgICAgIC5CVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrID0KLSAgICAgICAgICAgICAgICBCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrLAotICAgICAgICAgICAgLkJUTV9TZWNSZWFkRGV2TmFtZSA9IEJUTV9TZWNSZWFkRGV2TmFtZSwKLSAgICAgICAgICAgIC5CVE1fU2VjUmVnaXN0ZXIgPSBCVE1fU2VjUmVnaXN0ZXIsCi0gICAgICAgICAgICAuQlRNX1NldEVuY3J5cHRpb24gPSBCVE1fU2V0RW5jcnlwdGlvbiwKLSAgICAgICAgICAgIC5CVE1fSXNFbmNyeXB0ZWQgPSBCVE1fSXNFbmNyeXB0ZWQsCi0gICAgICAgICAgICAuQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nID0gQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nLAotICAgICAgICAgICAgLkJUTV9Jc0xpbmtLZXlLbm93biA9IEJUTV9Jc0xpbmtLZXlLbm93biwKLSAgICAgICAgfSwKLQotICAgIC5ibGUgPQotICAgICAgICB7Ci0gICAgICAgICAgICAuQlRNX0JsZUNvbmZpcm1SZXBseSA9IEJUTV9CbGVDb25maXJtUmVwbHksCi0gICAgICAgICAgICAuQlRNX0JsZUdldEVuZXJneUluZm8gPSBCVE1fQmxlR2V0RW5lcmd5SW5mbywKLSAgICAgICAgICAgIC5CVE1fQmxlTG9hZExvY2FsS2V5cyA9IEJUTV9CbGVMb2FkTG9jYWxLZXlzLAotICAgICAgICAgICAgLkJUTV9CbGVPYnNlcnZlID0gQlRNX0JsZU9ic2VydmUsCi0gICAgICAgICAgICAuQlRNX0JsZVBhc3NrZXlSZXBseSA9IEJUTV9CbGVQYXNza2V5UmVwbHksCi0gICAgICAgICAgICAuQlRNX0JsZVJlYWRDb250cm9sbGVyRmVhdHVyZXMgPSBCVE1fQmxlUmVhZENvbnRyb2xsZXJGZWF0dXJlcywKLSAgICAgICAgICAgIC5CVE1fQmxlU2V0UGh5ID0gQlRNX0JsZVNldFBoeSwKLSAgICAgICAgICAgIC5CVE1fQmxlU2V0UHJlZkNvbm5QYXJhbXMgPSBCVE1fQmxlU2V0UHJlZkNvbm5QYXJhbXMsCi0gICAgICAgICAgICAuQlRNX1NldEJsZURhdGFMZW5ndGggPSBCVE1fU2V0QmxlRGF0YUxlbmd0aCwKLSAgICAgICAgICAgIC5CVE1fVXNlTGVMaW5rID0gQlRNX1VzZUxlTGluaywKLSAgICAgICAgfSwKLQotICAgIC5zY28gPQotICAgICAgICB7Ci0gICAgICAgICAgICAuQlRNX0NyZWF0ZVNjbyA9IEJUTV9DcmVhdGVTY28sCi0gICAgICAgICAgICAuQlRNX0VTY29Db25uUnNwID0gQlRNX0VTY29Db25uUnNwLAotICAgICAgICAgICAgLkJUTV9HZXROdW1TY29MaW5rcyA9IEJUTV9HZXROdW1TY29MaW5rcywKLSAgICAgICAgICAgIC5CVE1fUmVnRm9yRVNjb0V2dHMgPSBCVE1fUmVnRm9yRVNjb0V2dHMsCi0gICAgICAgICAgICAuQlRNX1JlbW92ZVNjbyA9IEJUTV9SZW1vdmVTY28sCi0gICAgICAgICAgICAuQlRNX1NldEVTY29Nb2RlID0gQlRNX1NldEVTY29Nb2RlLAotICAgICAgICAgICAgLkJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MgPSBCVE1fV3JpdGVWb2ljZVNldHRpbmdzLAotICAgICAgICB9LAotCi0gICAgLmxvY2FsID0KLSAgICAgICAgewotICAgICAgICAgICAgLkJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lRnJvbUNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lRnJvbUNvbnRyb2xsZXIsCi0gICAgICAgICAgICAuQlRNX1NldERldmljZUNsYXNzID0gQlRNX1NldERldmljZUNsYXNzLAotICAgICAgICAgICAgLkJUTV9TZXRMb2NhbERldmljZU5hbWUgPSBCVE1fU2V0TG9jYWxEZXZpY2VOYW1lLAotICAgICAgICAgICAgLkJUTV9Jc0RldmljZVVwID0gQlRNX0lzRGV2aWNlVXAsCi0gICAgICAgICAgICAuQlRNX1JlYWREZXZpY2VDbGFzcyA9IEJUTV9SZWFkRGV2aWNlQ2xhc3MsCi0gICAgICAgIH0sCi0KLSAgICAuZWlyID0KLSAgICAgICAgewotICAgICAgICAgICAgLkJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcyA9IEJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcywKLSAgICAgICAgICAgIC5CVE1fR2V0RWlyVXVpZExpc3QgPSBCVE1fR2V0RWlyVXVpZExpc3QsCi0gICAgICAgICAgICAuQlRNX0FkZEVpclNlcnZpY2UgPSBCVE1fQWRkRWlyU2VydmljZSwKLSAgICAgICAgICAgIC5CVE1fUmVtb3ZlRWlyU2VydmljZSA9IEJUTV9SZW1vdmVFaXJTZXJ2aWNlLAotICAgICAgICAgICAgLkJUTV9Xcml0ZUVJUiA9IEJUTV9Xcml0ZUVJUiwKLSAgICAgICAgfSwKLSAgICAuZGIgPQotICAgICAgICB7Ci0gICAgICAgICAgICAuQlRNX0lucURiUmVhZCA9IEJUTV9JbnFEYlJlYWQsCi0gICAgICAgICAgICAuQlRNX0lucURiRmlyc3QgPSBCVE1fSW5xRGJGaXJzdCwKLSAgICAgICAgICAgIC5CVE1fSW5xRGJOZXh0ID0gQlRNX0lucURiTmV4dCwKLSAgICAgICAgICAgIC5CVE1fQ2xlYXJJbnFEYiA9IEJUTV9DbGVhcklucURiLAotICAgICAgICB9LAotfTsKLQotc3RydWN0IGJ0bV9jbGllbnRfaW50ZXJmYWNlX3MmIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpIHsKLSAgcmV0dXJuIGJ0bV9jbGllbnRfaW50ZXJmYWNlOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9kZXYuY2MgYi9zdGFjay9idG0vYnRtX2Rldi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMmNiYy4uMDAwMDAwMAotLS0gYS9zdGFjay9idG0vYnRtX2Rldi5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHRoZSBCbHVldG9vdGggRGV2aWNlIE1hbmFnZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYnRtX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IGRldmljZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBub3JtYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgZGV2X2NsYXNzICAgICAgICAtIERldmljZSBDbGFzcwotICogICAgICAgICAgICAgICAgICBiZF9uYW1lICAgICAgICAgIC0gTmFtZSBvZiB0aGUgcGVlciBkZXZpY2UuIE5VTEwgaWYgdW5rbm93bi4KLSAqICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgICAgICAgICAtIFJlbW90ZSBkZXZpY2UncyBmZWF0dXJlcyAodXAgdG8gMyBwYWdlcykuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG5vdCBrbm93bgotICogICAgICAgICAgICAgICAgICBsaW5rX2tleSAgICAgICAgIC0gQ29ubmVjdGlvbiBsaW5rIGtleS4gTlVMTCBpZiB1bmtub3duLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsIHVpbnQ4X3QqIGZlYXR1cmVzLCBMaW5rS2V5KiBwX2xpbmtfa2V5LAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsIHVpbnQ4X3QgcGluX2xlbmd0aCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgcF9kZXZfcmVjID0gYnRtX3NlY19hbGxvY2F0ZV9kZXZfcmVjKCk7Ci0gICAgTE9HX0RFQlVHKAotICAgICAgICAiQ2FjaGluZyBuZXcgcmVjb3JkIGZyb20gY29uZmlnIGZpbGUgZGV2aWNlOiVzIGxpbmtfa2V5X3R5cGU6JXggIgotICAgICAgICAibmFtZTolcyIsCi0gICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSwga2V5X3R5cGUsIGJkX25hbWUpOwotCi0gICAgcF9kZXZfcmVjLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgICBwX2Rldl9yZWMtPmhjaV9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICAgIC8qIHVzZSBkZWZhdWx0IHZhbHVlIGZvciBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gcGFyYW1zICovCi0gICAgLyogdXBkYXRlIGNvbm4gcGFyYW1zLCB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgYmFja2dyb3VuZCBjb25uZWN0aW9uIHBhcmFtcyAqLwotICAgIG1lbXNldCgmcF9kZXZfcmVjLT5jb25uX3BhcmFtcywgMHhmZiwgc2l6ZW9mKHRCVE1fTEVfQ09OTl9QUkFNUykpOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygKLSAgICAgICAgIkNhY2hpbmcgZXhpc3RpbmcgcmVjb3JkIGZyb20gY29uZmlnIGZpbGUgZGV2aWNlOiVzIGxpbmtfa2V5X3R5cGU6JXgiLAotICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIGtleV90eXBlKTsKLQotICAgIC8qICJCdW1wIiB0aW1lc3RhbXAgZm9yIGV4aXN0aW5nIHJlY29yZCAqLwotICAgIHBfZGV2X3JlYy0+dGltZXN0YW1wID0gYnRtX2NiLmRldl9yZWNfY291bnQrKzsKLQotICAgIC8qIFRPRE8oZWlzZW5iYWNoKToKLSAgICAgKiBTbWFsbCByZWZhY3RvciwgYnV0IGxlYXZpbmcgb3JpZ2luYWwgbG9naWMgZm9yIG5vdy4KLSAgICAgKiBPbiB0aGUgc3VyZmFjZSwgdGhpcyBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZSBhdCBhbGwuIFdoeSBjaGFuZ2UgdGhlCi0gICAgICogYm9uZCBzdGF0ZSBmb3IgYW4gZXhpc3RpbmcgZGV2aWNlIGhlcmU/IFRoaXMgbG9naWMgc2hvdWxkIGJlIHZlcmlmaWVkCi0gICAgICogYXMgcGFydCBvZiBhIGxhcmdlciByZWZhY3Rvci4KLSAgICAgKi8KLSAgICBwX2Rldl9yZWMtPmJvbmRfdHlwZSA9IHRCVE1fU0VDX0RFVl9SRUM6OkJPTkRfVFlQRV9VTktOT1dOOwotICB9Ci0KLSAgaWYgKGRldl9jbGFzcykgbWVtY3B5KHBfZGV2X3JlYy0+ZGV2X2NsYXNzLCBkZXZfY2xhc3MsIERFVl9DTEFTU19MRU4pOwotCi0gIG1lbXNldChwX2Rldl9yZWMtPnNlY19iZF9uYW1lLCAwLCBzaXplb2YodEJUTV9CRF9OQU1FKSk7Ci0KLSAgaWYgKGJkX25hbWUgJiYgYmRfbmFtZVswXSkgewotICAgIExPR19ERUJVRygiICBSZW1vdGUgbmFtZSBrbm93biBmb3IgZGV2aWNlOiVzIG5hbWU6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIGJkX25hbWUpOwotICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfTkFNRV9LTk9XTjsKLSAgICBzdHJsY3B5KChjaGFyKilwX2Rldl9yZWMtPnNlY19iZF9uYW1lLCAoY2hhciopYmRfbmFtZSwKLSAgICAgICAgICAgIEJUTV9NQVhfUkVNX0JEX05BTUVfTEVOICsgMSk7Ci0gIH0KLQotICBpZiAocF9saW5rX2tleSkgewotICAgIExPR19ERUJVRygiICBMaW5rIGtleSBrbm93biBmb3IgZGV2aWNlOiVzIiwgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDX0xJTktfS0VZX0tOT1dOOwotICAgIHBfZGV2X3JlYy0+bGlua19rZXkgPSAqcF9saW5rX2tleTsKLSAgICBwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPSBrZXlfdHlwZTsKLSAgICBwX2Rldl9yZWMtPnBpbl9jb2RlX2xlbmd0aCA9IHBpbl9sZW5ndGg7Ci0KLSAgICBpZiAocGluX2xlbmd0aCA+PSAxNiB8fCBrZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQiB8fAotICAgICAgICBrZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikgewotICAgICAgLy8gU2V0IHRoZSBmbGFnIGlmIHRoZSBsaW5rIGtleSB3YXMgbWFkZSBieSB1c2luZyBlaXRoZXIgYSAxNiBkaWdpdAotICAgICAgLy8gcGluIG9yIE1JVE0uCi0gICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyB8PQotICAgICAgICAgIEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRCB8IEJUTV9TRUNfTElOS19LRVlfQVVUSEVEOwotICAgIH0KLSAgfQotCi0gIHBfZGV2X3JlYy0+cm10X2lvX2NhcHMgPSBCVE1fSU9fQ0FQX09VVDsKLSAgcF9kZXZfcmVjLT5kZXZpY2VfdHlwZSB8PSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCB3aXBlX3NlY3JldHNfYW5kX3JlbW92ZSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgcF9kZXZfcmVjLT5saW5rX2tleS5maWxsKDApOwotICBtZW1zZXQoJnBfZGV2X3JlYy0+YmxlLmtleXMsIDAsIHNpemVvZih0QlRNX1NFQ19CTEVfS0VZUykpOwotICBsaXN0X3JlbW92ZShidG1fY2Iuc2VjX2Rldl9yZWMsIHBfZGV2X3JlYyk7Ci19Ci0KLS8qKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggfGJkX2FkZHJ8IGFkZHJlc3MuCi0gKgotICogKioqIFdBUk5JTkcgKioqCi0gKiB0QlRNX1NFQ19ERVZfUkVDIGFzc29jaWF0ZWQgd2l0aCBiZF9hZGRyIGJlY29tZXMgaW52YWxpZCBhZnRlciB0aGlzIGZ1bmN0aW9uCi0gKiBpcyBjYWxsZWQsIGFsc28gYW55IG9mIGl0J3MgZmllbGRzLiBpLmUuIGlmIHlvdSB1c2UgcF9kZXZfcmVjLT5iZF9hZGRyLCBpdCBpcwotICogbm8gbG9uZ2VyIHZhbGlkIQotICogKioqIFdBUk5JTkcgKioqCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHJlbW92ZWQgT0ssIGZhbHNlIGlmIG5vdCBmb3VuZCBvciBBQ0wgbGluayBpcyBhY3RpdmUuCi0gKi8KLWJvb2wgQlRNX1NlY0RlbGV0ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0RlbGV0ZURldmljZShiZF9hZGRyKTsKLSAgfQotCi0gIGlmIChCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSB8fAotICAgICAgQlRNX0lzQWNsQ29ubmVjdGlvblVwKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoIiVzIEZBSUxFRDogQ2Fubm90IERlbGV0ZSB3aGVuIGNvbm5lY3Rpb24gaXMgYWN0aXZlIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICBpZiAocF9kZXZfcmVjICE9IE5VTEwpIHsKLSAgICBSYXdBZGRyZXNzIGJkYSA9IHBfZGV2X3JlYy0+YmRfYWRkcjsKLQotICAgIC8qIENsZWFyIG91dCBhbnkgc2F2ZWQgQkxFIGtleXMgKi8KLSAgICBidG1fc2VjX2NsZWFyX2JsZV9rZXlzKHBfZGV2X3JlYyk7Ci0gICAgd2lwZV9zZWNyZXRzX2FuZF9yZW1vdmUocF9kZXZfcmVjKTsKLSAgICAvKiBUZWxsIGNvbnRyb2xsZXIgdG8gZ2V0IHJpZCBvZiB0aGUgbGluayBrZXksIGlmIGl0IGhhcyBvbmUgc3RvcmVkICovCi0gICAgQlRNX0RlbGV0ZVN0b3JlZExpbmtLZXkoJmJkYSwgTlVMTCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc2V0IHRoZSBzZWN1cml0eSBmbGFncyAobWFyayBhcyBub3QtcGFpcmVkKSBmb3IgYSBnaXZlbgotICogICAgICAgICAgICAgICAgICByZW1vdmUgZGV2aWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgcmV0dXJuOwotCi0gIHBfZGV2X3JlYy0+c2VjX2ZsYWdzID0gMDsKLSAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0lETEU7Ci0gIHBfZGV2X3JlYy0+c200ID0gQlRNX1NNNF9VTktOT1dOOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY1JlYWREZXZOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rcyBmb3IgdGhlIGRldmljZSBuYW1lIGluIHRoZSBzZWN1cml0eSBkYXRhYmFzZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBCRCBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgbmFtZSBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIqIEJUTV9TZWNSZWFkRGV2TmFtZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGNoYXIqIHBfbmFtZSA9IE5VTEw7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfc3JlYzsKLQotICBwX3NyZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX3NyZWMgIT0gTlVMTCkgcF9uYW1lID0gKGNoYXIqKXBfc3JlYy0+c2VjX2JkX25hbWU7Ci0KLSAgcmV0dXJuIChwX25hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19hbGxvY19kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSByZWNvcmQgaW4gdGhlIGRldmljZSBkYXRhYmFzZSBmb3IgdGhlIHJlY29yZAotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19ERVZfUkVDKiBidG1fc2VjX2FsbG9jX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHRCVE1fSU5RX0lORk8qIHBfaW5xX2luZm87Ci0KLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX3NlY19hbGxvY2F0ZV9kZXZfcmVjKCk7Ci0KLSAgTE9HX0RFQlVHKCJBbGxvY2F0ZWQgZGV2aWNlIHJlY29yZCBiZF9hZGRyOiVzIiwgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLQotICAvKiBDaGVjayB3aXRoIHRoZSBCVCBtYW5hZ2VyIGlmIGRldGFpbHMgYWJvdXQgcmVtb3RlIGRldmljZSBhcmUga25vd24gKi8KLSAgLyogb3V0Z29pbmcgY29ubmVjdGlvbiAqLwotICBwX2lucV9pbmZvID0gQlRNX0lucURiUmVhZChiZF9hZGRyKTsKLSAgaWYgKHBfaW5xX2luZm8gIT0gTlVMTCkgewotICAgIG1lbWNweShwX2Rldl9yZWMtPmRldl9jbGFzcywgcF9pbnFfaW5mby0+cmVzdWx0cy5kZXZfY2xhc3MsIERFVl9DTEFTU19MRU4pOwotCi0gICAgcF9kZXZfcmVjLT5kZXZpY2VfdHlwZSA9IHBfaW5xX2luZm8tPnJlc3VsdHMuZGV2aWNlX3R5cGU7Ci0gICAgcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZSA9IHBfaW5xX2luZm8tPnJlc3VsdHMuYmxlX2FkZHJfdHlwZTsKLSAgfSBlbHNlIGlmIChiZF9hZGRyID09IGJ0bV9jYi5jb25uZWN0aW5nX2JkYSkKLSAgICBtZW1jcHkocF9kZXZfcmVjLT5kZXZfY2xhc3MsIGJ0bV9jYi5jb25uZWN0aW5nX2RjLCBERVZfQ0xBU1NfTEVOKTsKLQotICAvKiB1cGRhdGUgY29ubiBwYXJhbXMsIHVzZSBkZWZhdWx0IHZhbHVlIGZvciBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gcGFyYW1zICovCi0gIG1lbXNldCgmcF9kZXZfcmVjLT5jb25uX3BhcmFtcywgMHhmZiwgc2l6ZW9mKHRCVE1fTEVfQ09OTl9QUkFNUykpOwotCi0gIHBfZGV2X3JlYy0+YmRfYWRkciA9IGJkX2FkZHI7Ci0KLSAgcF9kZXZfcmVjLT5ibGVfaGNpX2hhbmRsZSA9IEJUTV9HZXRIQ0lDb25uSGFuZGxlKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSA9IEJUTV9HZXRIQ0lDb25uSGFuZGxlKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotCi0gIHJldHVybiAocF9kZXZfcmVjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9kZXZfc3VwcG9ydF9yb2xlX3N3aXRjaAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEwyQ0FQIHRvIGNoZWNrIGlmIHJlbW90ZQotICogICAgICAgICAgICAgICAgICBkZXZpY2Ugc3VwcG9ydHMgcm9sZSBzd2l0Y2gKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZXZpY2UgaXMga25vd24gYW5kIHJvbGUgc3dpdGNoIGlzIHN1cHBvcnRlZAotICogICAgICAgICAgICAgICAgICBmb3IgdGhlIGxpbmsuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2Rldl9zdXBwb3J0X3JvbGVfc3dpdGNoKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgaWYgKEJUTV9Jc1Njb0FjdGl2ZUJ5QmRhZGRyKGJkX2FkZHIpKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlcyBSb2xlIHN3aXRjaCBpcyBub3QgYWxsb3dlZCBpZiBhIFNDTyBpcyB1cCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX2Rldl9yZWMgPT0gbnVsbHB0cikgewotICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgVW5rbm93biBhZGRyZXNzIGZvciByb2xlIHN3aXRjaCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19jZW50cmFsX3BlcmlwaGVyYWxfcm9sZV9zd2l0Y2goKSkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiJXMgTG9jYWwgY29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IHJvbGUgc3dpdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChwX2Rldl9yZWMtPnJlbW90ZV9zdXBwb3J0c19oY2lfcm9sZV9zd2l0Y2gpIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoIiVzIFBlZXIgY29udHJvbGxlciBzdXBwb3J0cyByb2xlIHN3aXRjaCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmICghcF9kZXZfcmVjLT5yZW1vdGVfZmVhdHVyZV9yZWNlaXZlZCkgewotICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzIFVua25vd24gcGVlciBjYXBhYmlsaXRpZXMsIGFzc3VtaW5nIHBlZXIgc3VwcG9ydHMgcm9sZSBzd2l0Y2giLAotICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoIiVzIFBlZXIgY29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IHJvbGUgc3dpdGNoIiwgX19mdW5jX18pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgaXNfaGFuZGxlX2VxdWFsKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGRhdGEpOwotICB1aW50MTZfdCogaGFuZGxlID0gc3RhdGljX2Nhc3Q8dWludDE2X3QqPihjb250ZXh0KTsKLQotICBpZiAocF9kZXZfcmVjLT5oY2lfaGFuZGxlID09ICpoYW5kbGUgfHwgcF9kZXZfcmVjLT5ibGVfaGNpX2hhbmRsZSA9PSAqaGFuZGxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSByZWNvcmQgaW4gdGhlIGRldmljZSBkYXRhYmFzZSBmb3IgdGhlIHJlY29yZAotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY29yZCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIGxpc3Rfbm9kZV90KiBuID0gbGlzdF9mb3JlYWNoKGJ0bV9jYi5zZWNfZGV2X3JlYywgaXNfaGFuZGxlX2VxdWFsLCAmaGFuZGxlKTsKLSAgaWYgKG4pIHJldHVybiBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4obGlzdF9ub2RlKG4pKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbCBpc19hZGRyZXNzX2VxdWFsKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGRhdGEpOwotICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyID0gKChSYXdBZGRyZXNzKiljb250ZXh0KTsKLQotICBpZiAocF9kZXZfcmVjLT5iZF9hZGRyID09ICpiZF9hZGRyKSByZXR1cm4gZmFsc2U7Ci0gIC8vIElmIGEgTEUgcmFuZG9tIGFkZHJlc3MgaXMgbG9va2luZyBmb3IgZGV2aWNlIHJlY29yZAotICBpZiAocF9kZXZfcmVjLT5ibGUucHNldWRvX2FkZHIgPT0gKmJkX2FkZHIpIHJldHVybiBmYWxzZTsKLQotICBpZiAoYnRtX2JsZV9hZGRyX3Jlc29sdmFibGUoKmJkX2FkZHIsIHBfZGV2X3JlYykpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZmluZF9kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSByZWNvcmQgaW4gdGhlIGRldmljZSBkYXRhYmFzZSBmb3IgdGhlIHJlY29yZAotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBCRCBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19ERVZfUkVDKiBidG1fZmluZF9kZXYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBpZiAoYnRtX2NiLnNlY19kZXZfcmVjID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOwotCi0gIGxpc3Rfbm9kZV90KiBuID0KLSAgICAgIGxpc3RfZm9yZWFjaChidG1fY2Iuc2VjX2Rldl9yZWMsIGlzX2FkZHJlc3NfZXF1YWwsICh2b2lkKikmYmRfYWRkcik7Ci0gIGlmIChuKSByZXR1cm4gc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGxpc3Rfbm9kZShuKSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fY29uc29saWRhdGVfZGV2Ci01KioKLSAqIERlc2NyaXB0aW9uICAgICAgY29tYmluZSBzZWN1cml0eSByZWNvcmRzIGlmIGlkZW50aWZpZWQgYXMgc2FtZSBwZWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2NvbnNvbGlkYXRlX2Rldih0QlRNX1NFQ19ERVZfUkVDKiBwX3RhcmdldF9yZWMpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyB0ZW1wX3JlYyA9ICpwX3RhcmdldF9yZWM7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBsaXN0X25vZGVfdCogZW5kID0gbGlzdF9lbmQoYnRtX2NiLnNlY19kZXZfcmVjKTsKLSAgbGlzdF9ub2RlX3QqIG5vZGUgPSBsaXN0X2JlZ2luKGJ0bV9jYi5zZWNfZGV2X3JlYyk7Ci0gIHdoaWxlIChub2RlICE9IGVuZCkgewotICAgIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9Ci0gICAgICAgIHN0YXRpY19jYXN0PHRCVE1fU0VDX0RFVl9SRUMqPihsaXN0X25vZGUobm9kZSkpOwotCi0gICAgLy8gd2UgZG8gbGlzdF9yZW1vdmUgaW4gc29tZSBjYXNlcywgbXVzdCBncmFiIG5leHQgYmVmb3JlIHJlbW92aW5nCi0gICAgbm9kZSA9IGxpc3RfbmV4dChub2RlKTsKLQotICAgIGlmIChwX3RhcmdldF9yZWMgPT0gcF9kZXZfcmVjKSBjb250aW51ZTsKLQotICAgIGlmIChwX2Rldl9yZWMtPmJkX2FkZHIgPT0gcF90YXJnZXRfcmVjLT5iZF9hZGRyKSB7Ci0gICAgICBtZW1jcHkocF90YXJnZXRfcmVjLCBwX2Rldl9yZWMsIHNpemVvZih0QlRNX1NFQ19ERVZfUkVDKSk7Ci0gICAgICBwX3RhcmdldF9yZWMtPmJsZSA9IHRlbXBfcmVjLmJsZTsKLSAgICAgIHBfdGFyZ2V0X3JlYy0+YmxlX2hjaV9oYW5kbGUgPSB0ZW1wX3JlYy5ibGVfaGNpX2hhbmRsZTsKLSAgICAgIHBfdGFyZ2V0X3JlYy0+ZW5jX2tleV9zaXplID0gdGVtcF9yZWMuZW5jX2tleV9zaXplOwotICAgICAgcF90YXJnZXRfcmVjLT5jb25uX3BhcmFtcyA9IHRlbXBfcmVjLmNvbm5fcGFyYW1zOwotICAgICAgcF90YXJnZXRfcmVjLT5kZXZpY2VfdHlwZSB8PSB0ZW1wX3JlYy5kZXZpY2VfdHlwZTsKLSAgICAgIHBfdGFyZ2V0X3JlYy0+c2VjX2ZsYWdzIHw9IHRlbXBfcmVjLnNlY19mbGFnczsKLQotICAgICAgcF90YXJnZXRfcmVjLT5uZXdfZW5jcnlwdGlvbl9rZXlfaXNfcDI1NiA9Ci0gICAgICAgICAgdGVtcF9yZWMubmV3X2VuY3J5cHRpb25fa2V5X2lzX3AyNTY7Ci0gICAgICBwX3RhcmdldF9yZWMtPmJvbmRfdHlwZSA9IHRlbXBfcmVjLmJvbmRfdHlwZTsKLQotICAgICAgLyogcmVtb3ZlIHRoZSBjb21iaW5lZCByZWNvcmQgKi8KLSAgICAgIHdpcGVfc2VjcmV0c19hbmRfcmVtb3ZlKHBfZGV2X3JlYyk7Ci0gICAgICAvLyBwX2Rldl9yZWMgZ2V0cyBmcmVlZCBpbiBsaXN0X3JlbW92ZSwgd2Ugc2hvdWxkIG5vdCAgYWNjZXNzIGl0IGZ1cnRoZXIKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIGFuIFJQQSBkZXZpY2UgZW50cnkgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIHRhcmdldCByZWNvcmQgKi8KLSAgICBpZiAoYnRtX2JsZV9hZGRyX3Jlc29sdmFibGUocF9kZXZfcmVjLT5iZF9hZGRyLCBwX3RhcmdldF9yZWMpKSB7Ci0gICAgICBpZiAocF90YXJnZXRfcmVjLT5ibGUucHNldWRvX2FkZHIgPT0gcF9kZXZfcmVjLT5iZF9hZGRyKSB7Ci0gICAgICAgIHBfdGFyZ2V0X3JlYy0+YmxlLmJsZV9hZGRyX3R5cGUgPSBwX2Rldl9yZWMtPmJsZS5ibGVfYWRkcl90eXBlOwotICAgICAgICBwX3RhcmdldF9yZWMtPmRldmljZV90eXBlIHw9IHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGU7Ci0KLSAgICAgICAgLyogcmVtb3ZlIHRoZSBjb21iaW5lZCByZWNvcmQgKi8KLSAgICAgICAgd2lwZV9zZWNyZXRzX2FuZF9yZW1vdmUocF9kZXZfcmVjKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9maW5kX29yX2FsbG9jX2RldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vayBmb3IgdGhlIHJlY29yZCBpbiB0aGUgZGV2aWNlIGRhdGFiYXNlIGZvciB0aGUgcmVjb3JkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggc3BlY2lmaWVkIEJEIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY29yZCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX29yX2FsbG9jX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgQlRNX1RSQUNFX0VWRU5UKCJidG1fZmluZF9vcl9hbGxvY19kZXYiKTsKLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICBpZiAocF9kZXZfcmVjID09IE5VTEwpIHsKLSAgICAvKiBBbGxvY2F0ZSBhIG5ldyBkZXZpY2UgcmVjb3JkIG9yIHJldXNlIHRoZSBvbGRlc3Qgb25lICovCi0gICAgcF9kZXZfcmVjID0gYnRtX3NlY19hbGxvY19kZXYoYmRfYWRkcik7Ci0gIH0KLSAgcmV0dXJuIChwX2Rldl9yZWMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2ZpbmRfb2xkZXN0X2Rldl9yZWMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvY2F0ZXMgdGhlIG9sZGVzdCBkZXZpY2UgaW4gdXNlLiBJdCBmaXJzdCBsb29rcyBmb3IKLSAqICAgICAgICAgICAgICAgICAgdGhlIG9sZGVzdCBub24tcGFpcmVkIGRldmljZS4gIElmIGFsbCBkZXZpY2VzIGFyZSBwYWlyZWQgaXQKLSAqICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgb2xkZXN0IHBhaXJlZCBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUTV9TRUNfREVWX1JFQyogYnRtX2ZpbmRfb2xkZXN0X2Rldl9yZWModm9pZCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX29sZGVzdCA9IE5VTEw7Ci0gIHVpbnQzMl90IHRzX29sZGVzdCA9IDB4RkZGRkZGRkY7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfb2xkZXN0X3BhaXJlZCA9IE5VTEw7Ci0gIHVpbnQzMl90IHRzX29sZGVzdF9wYWlyZWQgPSAweEZGRkZGRkZGOwotCi0gIGxpc3Rfbm9kZV90KiBlbmQgPSBsaXN0X2VuZChidG1fY2Iuc2VjX2Rldl9yZWMpOwotICBmb3IgKGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihidG1fY2Iuc2VjX2Rldl9yZWMpOyBub2RlICE9IGVuZDsKLSAgICAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpKSB7Ci0gICAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGxpc3Rfbm9kZShub2RlKSk7Ci0KLSAgICBpZiAoKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYKLSAgICAgICAgIChCVE1fU0VDX0xJTktfS0VZX0tOT1dOIHwgQlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTikpID09IDApIHsKLSAgICAgIC8vIERldmljZSBpcyBub3QgcGFpcmVkCi0gICAgICBpZiAocF9kZXZfcmVjLT50aW1lc3RhbXAgPCB0c19vbGRlc3QpIHsKLSAgICAgICAgcF9vbGRlc3QgPSBwX2Rldl9yZWM7Ci0gICAgICAgIHRzX29sZGVzdCA9IHBfZGV2X3JlYy0+dGltZXN0YW1wOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBQYWlyZWQgZGV2aWNlCi0gICAgICBpZiAocF9kZXZfcmVjLT50aW1lc3RhbXAgPCB0c19vbGRlc3RfcGFpcmVkKSB7Ci0gICAgICAgIHBfb2xkZXN0X3BhaXJlZCA9IHBfZGV2X3JlYzsKLSAgICAgICAgdHNfb2xkZXN0X3BhaXJlZCA9IHBfZGV2X3JlYy0+dGltZXN0YW1wOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIElmIHdlIGRpZCBub3QgZmluZCBhbnkgbm9uLXBhaXJlZCBkZXZpY2VzLCB1c2UgdGhlIG9sZGVzdCBwYWlyZWQgb25lLi4uCi0gIGlmICh0c19vbGRlc3QgPT0gMHhGRkZGRkZGRikgcF9vbGRlc3QgPSBwX29sZGVzdF9wYWlyZWQ7Ci0KLSAgcmV0dXJuIHBfb2xkZXN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19hbGxvY2F0ZV9kZXZfcmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBdHRlbXB0cyB0byBhbGxvY2F0ZSBhIG5ldyBkZXZpY2UgcmVjb3JkLiBJZiB3ZSBoYXZlCi0gKiAgICAgICAgICAgICAgICAgIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2FibGUgcmVjb3JkcyB0bwotICogICAgICAgICAgICAgICAgICBhbGxvY2F0ZSwgdGhlIG9sZGVzdCByZWNvcmQgd2lsbCBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbQotICogICAgICAgICAgICAgICAgICBmb3IgdGhlIG5ldyByZWNvcmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmVjb3JkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9zZWNfYWxsb2NhdGVfZGV2X3JlYyh2b2lkKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IE5VTEw7Ci0KLSAgaWYgKGxpc3RfbGVuZ3RoKGJ0bV9jYi5zZWNfZGV2X3JlYykgPiBCVE1fU0VDX01BWF9ERVZJQ0VfUkVDT1JEUykgewotICAgIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29sZGVzdF9kZXZfcmVjKCk7Ci0gICAgd2lwZV9zZWNyZXRzX2FuZF9yZW1vdmUocF9kZXZfcmVjKTsKLSAgfQotCi0gIHBfZGV2X3JlYyA9Ci0gICAgICBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4ob3NpX2NhbGxvYyhzaXplb2YodEJUTV9TRUNfREVWX1JFQykpKTsKLSAgbGlzdF9hcHBlbmQoYnRtX2NiLnNlY19kZXZfcmVjLCBwX2Rldl9yZWMpOwotCi0gIC8vIEluaXRpYWxpemUgZGVmYXVsdHMKLSAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgPSBCVE1fU0VDX0lOX1VTRTsKLSAgcF9kZXZfcmVjLT5ib25kX3R5cGUgPSB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVU5LTk9XTjsKLSAgcF9kZXZfcmVjLT50aW1lc3RhbXAgPSBidG1fY2IuZGV2X3JlY19jb3VudCsrOwotICBwX2Rldl9yZWMtPnJtdF9pb19jYXBzID0gQlRNX0lPX0NBUF9VTktOT1dOOwotCi0gIHJldHVybiBwX2Rldl9yZWM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZ2V0X2JvbmRfdHlwZV9kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgYm9uZCB0eXBlIGZvciBhIGRldmljZSBpbiB0aGUgZGV2aWNlIGRhdGFiYXNlCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggc3BlY2lmaWVkIEJEIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBkZXZpY2UgYm9uZCB0eXBlIGlmIGtub3duLCBvdGhlcndpc2UgQk9ORF9UWVBFX1VOS05PV04KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TRUNfREVWX1JFQzo6dEJUTV9CT05EX1RZUEUgYnRtX2dldF9ib25kX3R5cGVfZGV2KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotCi0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgcmV0dXJuIHRCVE1fU0VDX0RFVl9SRUM6OkJPTkRfVFlQRV9VTktOT1dOOwotCi0gIHJldHVybiBwX2Rldl9yZWMtPmJvbmRfdHlwZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZXRfYm9uZF90eXBlX2RldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IHRoZSBib25kIHR5cGUgZm9yIGEgZGV2aWNlIGluIHRoZSBkZXZpY2UgZGF0YWJhc2UKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBzcGVjaWZpZWQgQkQgYWRkcmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fc2V0X2JvbmRfdHlwZV9kZXYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0RFVl9SRUM6OnRCVE1fQk9ORF9UWVBFIGJvbmRfdHlwZSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0KLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgcF9kZXZfcmVjLT5ib25kX3R5cGUgPSBib25kX3R5cGU7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9kZXYuaCBiL3N0YWNrL2J0bS9idG1fZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZmE2MjguLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9kZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL3NlY3VyaXR5X2RldmljZV9yZWNvcmQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IGRldmljZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBub3JtYWxseSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgZGV2X2NsYXNzICAgICAgICAtIERldmljZSBDbGFzcwotICogICAgICAgICAgICAgICAgICBiZF9uYW1lICAgICAgICAgIC0gTmFtZSBvZiB0aGUgcGVlciBkZXZpY2UuIE5VTEwgaWYgdW5rbm93bi4KLSAqICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgICAgICAgICAtIFJlbW90ZSBkZXZpY2UncyBmZWF0dXJlcyAodXAgdG8gMyBwYWdlcykuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG5vdCBrbm93bgotICogICAgICAgICAgICAgICAgICBsaW5rX2tleSAgICAgICAgIC0gQ29ubmVjdGlvbiBsaW5rIGtleS4gTlVMTCBpZiB1bmtub3duLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsIHVpbnQ4X3QqIGZlYXR1cmVzLCBMaW5rS2V5KiBwX2xpbmtfa2V5LAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsIHVpbnQ4X3QgcGluX2xlbmd0aCk7Ci12b2lkIHdpcGVfc2VjcmV0c19hbmRfcmVtb3ZlKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk7Ci0KLS8qKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggfGJkX2FkZHJ8IGFkZHJlc3MuCi0gKgotICogKioqIFdBUk5JTkcgKioqCi0gKiB0QlRNX1NFQ19ERVZfUkVDIGFzc29jaWF0ZWQgd2l0aCBiZF9hZGRyIGJlY29tZXMgaW52YWxpZCBhZnRlciB0aGlzIGZ1bmN0aW9uCi0gKiBpcyBjYWxsZWQsIGFsc28gYW55IG9mIGl0J3MgZmllbGRzLiBpLmUuIGlmIHlvdSB1c2UgcF9kZXZfcmVjLT5iZF9hZGRyLCBpdCBpcwotICogbm8gbG9uZ2VyIHZhbGlkIQotICogKioqIFdBUk5JTkcgKioqCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHJlbW92ZWQgT0ssIGZhbHNlIGlmIG5vdCBmb3VuZCBvciBBQ0wgbGluayBpcyBhY3RpdmUuCi0gKi8KLWJvb2wgQlRNX1NlY0RlbGV0ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc2V0IHRoZSBzZWN1cml0eSBmbGFncyAobWFyayBhcyBub3QtcGFpcmVkKSBmb3IgYSBnaXZlbgotICogICAgICAgICAgICAgICAgICByZW1vdmUgZGV2aWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjUmVhZERldk5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2tzIGZvciB0aGUgZGV2aWNlIG5hbWUgaW4gdGhlIHNlY3VyaXR5IGRhdGFiYXNlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIEJEIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuYW1lIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciogQlRNX1NlY1JlYWREZXZOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19hbGxvY19kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSByZWNvcmQgaW4gdGhlIGRldmljZSBkYXRhYmFzZSBmb3IgdGhlIHJlY29yZAotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19ERVZfUkVDKiBidG1fc2VjX2FsbG9jX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9kZXZfc3VwcG9ydF9yb2xlX3N3aXRjaAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEwyQ0FQIHRvIGNoZWNrIGlmIHJlbW90ZQotICogICAgICAgICAgICAgICAgICBkZXZpY2Ugc3VwcG9ydHMgcm9sZSBzd2l0Y2gKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZXZpY2UgaXMga25vd24gYW5kIHJvbGUgc3dpdGNoIGlzIHN1cHBvcnRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9kZXZfc3VwcG9ydF9yb2xlX3N3aXRjaChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSByZWNvcmQgaW4gdGhlIGRldmljZSBkYXRhYmFzZSBmb3IgdGhlIHJlY29yZAotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY29yZCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKTsKLQotYm9vbCBpc19hZGRyZXNzX2VxdWFsKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2ZpbmRfZGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIGZvciB0aGUgcmVjb3JkIGluIHRoZSBkZXZpY2UgZGF0YWJhc2UgZm9yIHRoZSByZWNvcmQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBzcGVjaWZpZWQgQkQgYWRkcmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjb3JkIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TRUNfREVWX1JFQyogYnRtX2ZpbmRfZGV2KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2NvbnNvbGlkYXRlX2RldgotNSoqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNvbWJpbmUgc2VjdXJpdHkgcmVjb3JkcyBpZiBpZGVudGlmaWVkIGFzIHNhbWUgcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9jb25zb2xpZGF0ZV9kZXYodEJUTV9TRUNfREVWX1JFQyogcF90YXJnZXRfcmVjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9maW5kX29yX2FsbG9jX2RldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vayBmb3IgdGhlIHJlY29yZCBpbiB0aGUgZGV2aWNlIGRhdGFiYXNlIGZvciB0aGUgcmVjb3JkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggc3BlY2lmaWVkIEJEIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY29yZCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX29yX2FsbG9jX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfYWxsb2NhdGVfZGV2X3JlYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQXR0ZW1wdHMgdG8gYWxsb2NhdGUgYSBuZXcgZGV2aWNlIHJlY29yZC4gSWYgd2UgaGF2ZQotICogICAgICAgICAgICAgICAgICBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWxsb3dhYmxlIHJlY29yZHMgdG8KLSAqICAgICAgICAgICAgICAgICAgYWxsb2NhdGUsIHRoZSBvbGRlc3QgcmVjb3JkIHdpbGwgYmUgZGVsZXRlZCB0byBtYWtlIHJvb20KLSAqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBuZXcgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHJlY29yZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19ERVZfUkVDKiBidG1fc2VjX2FsbG9jYXRlX2Rldl9yZWModm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZ2V0X2JvbmRfdHlwZV9kZXYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgYm9uZCB0eXBlIGZvciBhIGRldmljZSBpbiB0aGUgZGV2aWNlIGRhdGFiYXNlCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggc3BlY2lmaWVkIEJEIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBkZXZpY2UgYm9uZCB0eXBlIGlmIGtub3duLCBvdGhlcndpc2UgQk9ORF9UWVBFX1VOS05PV04KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TRUNfREVWX1JFQzo6dEJUTV9CT05EX1RZUEUgYnRtX2dldF9ib25kX3R5cGVfZGV2KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NldF9ib25kX3R5cGVfZGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgdGhlIGJvbmQgdHlwZSBmb3IgYSBkZXZpY2UgaW4gdGhlIGRldmljZSBkYXRhYmFzZQotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBCRCBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9zZXRfYm9uZF90eXBlX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfREVWX1JFQzo6dEJUTV9CT05EX1RZUEUgYm9uZF90eXBlKTsKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fZGV2Y3RsLmNjIGIvc3RhY2svYnRtL2J0bV9kZXZjdGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTU2OGEuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9kZXZjdGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIEJUTSBpbnRlcmZhY2UgZnVuY3Rpb25zIGZvciB0aGUKLSAqICBCbHVldG9vdGggZGV2aWNlIGluY2x1ZGluZyBSZXN0LCBIQ0kgYnVmZmVyIHNpemUgYW5kIG90aGVycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0YS9kbS9idGFfZG1faW50LmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvbW9kdWxlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYnFyLmgiCi0jaW5jbHVkZSAiYnRtX2ludC5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvaGNpX3BhY2tldF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9lbnRyeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2FwX2NvbnRyb2xsZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi1leHRlcm4gdm9pZCBidG1faW5xX2RiX3Jlc2V0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRtX3BtX3Jlc2V0KHZvaWQpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgTCBPIEMgQSBMICAgIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUTV9ERVZfUkVTRVRfVElNRU9VVAotI2RlZmluZSBCVE1fREVWX1JFU0VUX1RJTUVPVVQgNAotI2VuZGlmCi0KLS8vIFRPRE86IFJlZXZhbHVhdGUgdGhpcyB2YWx1ZSBpbiB0aGUgY29udGV4dCBvZiB0aW1lcnMgd2l0aCBtcyBncmFudWxhcml0eQotI2RlZmluZSBCVE1fREVWX05BTUVfUkVQTFlfVElNRU9VVF9NUyAgICBcCi0gICgyICogMTAwMCkgLyogMiBzZWNvbmRzIGZvciBuYW1lIHJlcGx5IFwKLSAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEJUTV9JTkZPX1RJTUVPVVQgNSAvKiA1IHNlY29uZHMgZm9yIGluZm8gcmVzcG9uc2UgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBkZWNvZGVfY29udHJvbGxlcl9zdXBwb3J0KCk7Ci1zdGF0aWMgdm9pZCBCVE1fQlRfUXVhbGl0eV9SZXBvcnRfVlNFX0NCYWNrKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX3N0cmVhbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZGV2X2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgb24gdGhlIEJUTSBzdGFydHVwCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2Rldl9pbml0KCkgewotICAvKiBJbml0aWFsaXplIG5vbnplcm8gZGVmYXVsdHMgKi8KLSAgbWVtc2V0KGJ0bV9jYi5jZmcuYmRfbmFtZSwgMCwgc2l6ZW9mKHRCVE1fTE9DX0JEX05BTUUpKTsKLQotICBidG1fY2IuZGV2Y2IucmVhZF9sb2NhbF9uYW1lX3RpbWVyID0gYWxhcm1fbmV3KCJidG0ucmVhZF9sb2NhbF9uYW1lX3RpbWVyIik7Ci0gIGJ0bV9jYi5kZXZjYi5yZWFkX3Jzc2lfdGltZXIgPSBhbGFybV9uZXcoImJ0bS5yZWFkX3Jzc2lfdGltZXIiKTsKLSAgYnRtX2NiLmRldmNiLnJlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl90aW1lciA9Ci0gICAgICBhbGFybV9uZXcoImJ0bS5yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZXIiKTsKLSAgYnRtX2NiLmRldmNiLnJlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfdGltZXIgPQotICAgICAgYWxhcm1fbmV3KCJidG0ucmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF90aW1lciIpOwotICBidG1fY2IuZGV2Y2IucmVhZF9saW5rX3F1YWxpdHlfdGltZXIgPQotICAgICAgYWxhcm1fbmV3KCJidG0ucmVhZF9saW5rX3F1YWxpdHlfdGltZXIiKTsKLSAgYnRtX2NiLmRldmNiLnJlYWRfdHhfcG93ZXJfdGltZXIgPSBhbGFybV9uZXcoImJ0bS5yZWFkX3R4X3Bvd2VyX3RpbWVyIik7Ci19Ci0KLXZvaWQgYnRtX2Rldl9mcmVlKCkgewotICBhbGFybV9mcmVlKGJ0bV9jYi5kZXZjYi5yZWFkX2xvY2FsX25hbWVfdGltZXIpOwotICBhbGFybV9mcmVlKGJ0bV9jYi5kZXZjYi5yZWFkX3Jzc2lfdGltZXIpOwotICBhbGFybV9mcmVlKGJ0bV9jYi5kZXZjYi5yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZXIpOwotICBhbGFybV9mcmVlKGJ0bV9jYi5kZXZjYi5yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X3RpbWVyKTsKLSAgYWxhcm1fZnJlZShidG1fY2IuZGV2Y2IucmVhZF9saW5rX3F1YWxpdHlfdGltZXIpOwotICBhbGFybV9mcmVlKGJ0bV9jYi5kZXZjYi5yZWFkX3R4X3Bvd2VyX3RpbWVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9kYl9yZXNldAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9kYl9yZXNldCh2b2lkKSB7Ci0gIHRCVE1fQ01QTF9DQiogcF9jYjsKLQotICBidG1faW5xX2RiX3Jlc2V0KCk7Ci0KLSAgaWYgKGJ0bV9jYi5kZXZjYi5wX3Jsbl9jbXBsX2NiKSB7Ci0gICAgcF9jYiA9IGJ0bV9jYi5kZXZjYi5wX3Jsbl9jbXBsX2NiOwotICAgIGJ0bV9jYi5kZXZjYi5wX3Jsbl9jbXBsX2NiID0gTlVMTDsKLQotICAgIGlmIChwX2NiKSAoKnBfY2IpKCh2b2lkKilOVUxMKTsKLSAgfQotCi0gIGlmIChidG1fY2IuZGV2Y2IucF9yc3NpX2NtcGxfY2IpIHsKLSAgICBwX2NiID0gYnRtX2NiLmRldmNiLnBfcnNzaV9jbXBsX2NiOwotICAgIGJ0bV9jYi5kZXZjYi5wX3Jzc2lfY21wbF9jYiA9IE5VTEw7Ci0KLSAgICBpZiAocF9jYikgewotICAgICAgdEJUTV9SU1NJX1JFU1VMVCBidG1fcnNzaV9yZXN1bHQ7Ci0gICAgICBidG1fcnNzaV9yZXN1bHQuc3RhdHVzID0gQlRNX0RFVl9SRVNFVDsKLSAgICAgICgqcF9jYikoJmJ0bV9yc3NpX3Jlc3VsdCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJ0bV9jYi5kZXZjYi5wX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY21wbF9jYikgewotICAgIHBfY2IgPSBidG1fY2IuZGV2Y2IucF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NtcGxfY2I7Ci0gICAgYnRtX2NiLmRldmNiLnBfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jbXBsX2NiID0gTlVMTDsKLQotICAgIGlmIChwX2NiKSB7Ci0gICAgICB0QlRNX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfUkVTVUxUIGJ0bV9mYWlsZWRfY29udGFjdF9jb3VudGVyX3Jlc3VsdDsKLSAgICAgIGJ0bV9mYWlsZWRfY29udGFjdF9jb3VudGVyX3Jlc3VsdC5zdGF0dXMgPSBCVE1fREVWX1JFU0VUOwotICAgICAgKCpwX2NiKSgmYnRtX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfcmVzdWx0KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoYnRtX2NiLmRldmNiLnBfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY21wbF9jYikgewotICAgIHBfY2IgPSBidG1fY2IuZGV2Y2IucF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jbXBsX2NiOwotICAgIGJ0bV9jYi5kZXZjYi5wX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NtcGxfY2IgPSBOVUxMOwotCi0gICAgaWYgKHBfY2IpIHsKLSAgICAgIHRCVE1fQVVUT01BVElDX0ZMVVNIX1RJTUVPVVRfUkVTVUxUIGJ0bV9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9yZXN1bHQ7Ci0gICAgICBidG1fYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfcmVzdWx0LnN0YXR1cyA9IEJUTV9ERVZfUkVTRVQ7Ci0gICAgICAoKnBfY2IpKCZidG1fYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfcmVzdWx0KTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgc2V0X3NlY19zdGF0ZV9pZGxlKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gc3RhdGljX2Nhc3Q8dEJUTV9TRUNfREVWX1JFQyo+KGRhdGEpOwotICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfSURMRTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQlRNX3Jlc2V0X2NvbXBsZXRlKCkgewotICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLQotICAvKiBUZWxsIEwyQ0FQIHRoYXQgYWxsIGNvbm5lY3Rpb25zIGFyZSBnb25lICovCi0gIGwyY3VfZGV2aWNlX3Jlc2V0KCk7Ci0KLSAgLyogQ2xlYXIgY3VycmVudCBzZWN1cml0eSBzdGF0ZSAqLwotICBsaXN0X2ZvcmVhY2goYnRtX2NiLnNlY19kZXZfcmVjLCBzZXRfc2VjX3N0YXRlX2lkbGUsIE5VTEwpOwotCi0gIC8qIEFmdGVyIHRoZSByZXNldCBjb250cm9sbGVyIHNob3VsZCByZXN0b3JlIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHRzLiAqLwotICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jb3VudGVyID0gMTsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfc2Nhbl93aW5kb3cgPSBIQ0lfREVGX0lOUVVJUllTQ0FOX1dJTkRPVzsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfc2Nhbl9wZXJpb2QgPSBIQ0lfREVGX0lOUVVJUllTQ0FOX0lOVEVSVkFMOwotICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9zY2FuX3R5cGUgPSBIQ0lfREVGX1NDQU5fVFlQRTsKLQotICBidG1fY2IuYnRtX2lucV92YXJzLnBhZ2Vfc2Nhbl93aW5kb3cgPSBIQ0lfREVGX1BBR0VTQ0FOX1dJTkRPVzsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5wYWdlX3NjYW5fcGVyaW9kID0gSENJX0RFRl9QQUdFU0NBTl9JTlRFUlZBTDsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5wYWdlX3NjYW5fdHlwZSA9IEhDSV9ERUZfU0NBTl9UWVBFOwotCi0gIGJ0bV9jYi5ibGVfY3RyX2NiLnNldF9jb25uZWN0aW9uX3N0YXRlX2lkbGUoKTsKLSAgY29ubmVjdGlvbl9tYW5hZ2VyOjpyZXNldCh0cnVlKTsKLQotICBidG1fcG1fcmVzZXQoKTsKLQotICBsMmNfbGlua19pbml0KCk7Ci0KLSAgLy8gc2V0dXAgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi0gIHN0ZDo6c3JhbmQoc3RkOjp0aW1lKG51bGxwdHIpKTsKLQotICAvKiBTZXQgdXAgdGhlIEJMRSBwcml2YWN5IHNldHRpbmdzICovCi0gIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19ibGUoKSAmJiBjb250cm9sbGVyLT5zdXBwb3J0c19ibGVfcHJpdmFjeSgpICYmCi0gICAgICBjb250cm9sbGVyLT5nZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplKCkgPiAwKSB7Ci0gICAgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9pbml0KGNvbnRyb2xsZXItPmdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoKSk7Ci0gICAgLyogc2V0IHRoZSBkZWZhdWx0IHJhbmRvbSBwcml2YXRlIGFkZHJlc3MgdGltZW91dCAqLwotICAgIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kX3ByaXZfYWRkcl90aW1lb3V0KAotICAgICAgICBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tcygpIC8gMTAwMCk7Ci0gIH0KLQotICBpZiAoY29udHJvbGxlci0+c3VwcG9ydHNfYmxlKCkpIHsKLSAgICBsMmNfbGlua19wcm9jZXNzc19ibGVfbnVtX2J1ZnMoY29udHJvbGxlci0+Z2V0X2FjbF9idWZmZXJfY291bnRfYmxlKCkpOwotICB9Ci0KLSAgQlRNX1NldFBpblR5cGUoYnRtX2NiLmNmZy5waW5fdHlwZSwgYnRtX2NiLmNmZy5waW5fY29kZSwKLSAgICAgICAgICAgICAgICAgYnRtX2NiLmNmZy5waW5fY29kZV9sZW4pOwotCi0gIGRlY29kZV9jb250cm9sbGVyX3N1cHBvcnQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Jc0RldmljZVVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHVwLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZXZpY2UgaXMgdXAsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fSXNEZXZpY2VVcCh2b2lkKSB7IHJldHVybiBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2lzX3JlYWR5KCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX2xvY2FsX25hbWVfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgd2hlbiByZWFkaW5nIHRoZSBsb2NhbCBuYW1lIHRpbWVzIG91dC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX3JlYWRfbG9jYWxfbmFtZV90aW1lb3V0KFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gYnRtX2NiLmRldmNiLnBfcmxuX2NtcGxfY2I7Ci0gIGJ0bV9jYi5kZXZjYi5wX3Jsbl9jbXBsX2NiID0gTlVMTDsKLSAgaWYgKHBfY2IpICgqcF9jYikoKHZvaWQqKU5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBkZWNvZGVfY29udHJvbGxlcl9zdXBwb3J0KCkgewotICBjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKTsKLQotICAvKiBDcmVhdGUgKGUpU0NPIHN1cHBvcnRlZCBwYWNrZXQgdHlwZXMgbWFzayAqLwotICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkID0gMDsKLSAgYnRtX2NiLnNjb19jYi5lc2NvX3N1cHBvcnRlZCA9IGZhbHNlOwotICBpZiAoY29udHJvbGxlci0+c3VwcG9ydHNfc2NvKCkpIHsKLSAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkID0gRVNDT19QS1RfVFlQRVNfTUFTS19IVjE7Ci0KLSAgICBpZiAoY29udHJvbGxlci0+c3VwcG9ydHNfaHYyX3BhY2tldHMoKSkKLSAgICAgIGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgfD0gRVNDT19QS1RfVFlQRVNfTUFTS19IVjI7Ci0KLSAgICBpZiAoY29udHJvbGxlci0+c3VwcG9ydHNfaHYzX3BhY2tldHMoKSkKLSAgICAgIGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgfD0gRVNDT19QS1RfVFlQRVNfTUFTS19IVjM7Ci0gIH0KLQotICBpZiAoY29udHJvbGxlci0+c3VwcG9ydHNfZXYzX3BhY2tldHMoKSkKLSAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkIHw9IEVTQ09fUEtUX1RZUEVTX01BU0tfRVYzOwotCi0gIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19ldjRfcGFja2V0cygpKQotICAgIGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgfD0gRVNDT19QS1RfVFlQRVNfTUFTS19FVjQ7Ci0KLSAgaWYgKGNvbnRyb2xsZXItPnN1cHBvcnRzX2V2NV9wYWNrZXRzKCkpCi0gICAgYnRtX2NiLmJ0bV9zY29fcGt0X3R5cGVzX3N1cHBvcnRlZCB8PSBFU0NPX1BLVF9UWVBFU19NQVNLX0VWNTsKLQotICBpZiAoYnRtX2NiLmJ0bV9zY29fcGt0X3R5cGVzX3N1cHBvcnRlZCAmIEJUTV9FU0NPX0xJTktfT05MWV9NQVNLKSB7Ci0gICAgYnRtX2NiLnNjb19jYi5lc2NvX3N1cHBvcnRlZCA9IHRydWU7Ci0KLSAgICAvKiBBZGQgaW4gRURSIHJlbGF0ZWQgZVNDTyB0eXBlcyAqLwotICAgIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19lc2NvXzJtX3BoeSgpKSB7Ci0gICAgICBpZiAoIWNvbnRyb2xsZXItPnN1cHBvcnRzXzNfc2xvdF9lZHJfcGFja2V0cygpKQotICAgICAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkIHw9IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgfD0KLSAgICAgICAgICAoRVNDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWMyArIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUpOwotICAgIH0KLQotICAgIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19lc2NvXzNtX3BoeSgpKSB7Ci0gICAgICBpZiAoIWNvbnRyb2xsZXItPnN1cHBvcnRzXzNfc2xvdF9lZHJfcGFja2V0cygpKQotICAgICAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkIHw9IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgfD0KLSAgICAgICAgICAoRVNDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWMyArIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpOwotICAgIH0KLSAgfQotCi0gIEJUTV9UUkFDRV9ERUJVRygiTG9jYWwgc3VwcG9ydGVkIFNDTyBwYWNrZXQgdHlwZXM6IDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkKTsKLQotICBCVE1fYWNsX2FmdGVyX2NvbnRyb2xsZXJfc3RhcnRlZChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKSk7Ci0gIGJ0bV9zZWNfZGV2X3Jlc2V0KCk7Ci0KLSAgaWYgKGNvbnRyb2xsZXItPnN1cHBvcnRzX3Jzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMoKSkgewotICAgIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19leHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlKCkpCi0gICAgICBCVE1fU2V0SW5xdWlyeU1vZGUoQlRNX0lOUV9SRVNVTFRfRVhURU5ERUQpOwotICAgIGVsc2UKLSAgICAgIEJUTV9TZXRJbnF1aXJ5TW9kZShCVE1fSU5RX1JFU1VMVF9XSVRIX1JTU0kpOwotICB9Ci0KLSAgbDJjdV9zZXRfbm9uX2ZsdXNoYWJsZV9wYmYoY29udHJvbGxlci0+c3VwcG9ydHNfbm9uX2ZsdXNoYWJsZV9wYigpKTsKLSAgQlRNX0VuYWJsZUludGVybGFjZWRQYWdlU2NhbigpOwotICBCVE1fRW5hYmxlSW50ZXJsYWNlZElucXVpcnlTY2FuKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0TG9jYWxEZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIGxvY2FsIGRldmljZSBuYW1lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldExvY2FsRGV2aWNlTmFtZShjb25zdCBjaGFyKiBwX25hbWUpIHsKLSAgdWludDhfdCogcDsKLQotICBpZiAoIXBfbmFtZSB8fCAhcF9uYW1lWzBdIHx8IChzdHJsZW4oKGNoYXIqKXBfbmFtZSkgPiBCRF9OQU1FX0xFTikpCi0gICAgcmV0dXJuIChCVE1fSUxMRUdBTF9WQUxVRSk7Ci0KLSAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2lzX3JlYWR5KCkpIHJldHVybiAoQlRNX0RFVl9SRVNFVCk7Ci0gIC8qIFNhdmUgdGhlIGRldmljZSBuYW1lIGlmIGxvY2FsIHN0b3JhZ2UgaXMgZW5hYmxlZCAqLwotICBwID0gKHVpbnQ4X3QqKWJ0bV9jYi5jZmcuYmRfbmFtZTsKLSAgaWYgKHAgIT0gKHVpbnQ4X3QqKXBfbmFtZSkKLSAgICBzdHJsY3B5KGJ0bV9jYi5jZmcuYmRfbmFtZSwgcF9uYW1lLCBCVE1fTUFYX0xPQ19CRF9OQU1FX0xFTiArIDEpOwotCi0gIGJ0c25kX2hjaWNfY2hhbmdlX25hbWUocCk7Ci0gIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBsb2NhbCBkZXZpY2UgbmFtZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIElmIHN1Y2Nlc3MsIEJUTV9TVUNDRVNTIGlzIHJldHVybmVkIGFuZCBwX25hbWUgcG9pbnRzIHN0b3JlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBkZXZpY2UgbmFtZQotICogICAgICAgICAgICAgICAgICBJZiBCVE0gZG9lc24ndCBzdG9yZSBsb2NhbCBkZXZpY2UgbmFtZSwgQlRNX05PX1JFU09VUkNFUyBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZXR1cm5lZCBhbmQgcF9uYW1lIGlzIHNldCB0byBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lKGNoYXIqKiBwX25hbWUpIHsKLSAgKnBfbmFtZSA9IGJ0bV9jYi5jZmcuYmRfbmFtZTsKLSAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZExvY2FsRGV2aWNlTmFtZUZyb21Db250cm9sbGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgbG9jYWwgZGV2aWNlIG5hbWUgZnJvbSBjb250cm9sbGVyLiBEbyBub3QgdXNlIGNhY2hlZAotICogICAgICAgICAgICAgICAgICBuYW1lICh1c2VkIHRvIGdldCBjaGlwLWlkIHByaW9yIHRvIGJ0bSByZXNldCBjb21wbGV0ZSkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGFuIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lRnJvbUNvbnRyb2xsZXIoCi0gICAgdEJUTV9DTVBMX0NCKiBwX3Jsbl9jbXBsX2NiYWNrKSB7Ci0gIC8qIENoZWNrIGlmIHJsbiBhbHJlYWR5IGluIHByb2dyZXNzICovCi0gIGlmIChidG1fY2IuZGV2Y2IucF9ybG5fY21wbF9jYikgcmV0dXJuIChCVE1fTk9fUkVTT1VSQ0VTKTsKLQotICAvKiBTYXZlIGNhbGxiYWNrICovCi0gIGJ0bV9jYi5kZXZjYi5wX3Jsbl9jbXBsX2NiID0gcF9ybG5fY21wbF9jYmFjazsKLQotICBidHNuZF9oY2ljX3JlYWRfbmFtZSgpOwotICBhbGFybV9zZXRfb25fbWxvb3AoYnRtX2NiLmRldmNiLnJlYWRfbG9jYWxfbmFtZV90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgIEJUTV9ERVZfTkFNRV9SRVBMWV9USU1FT1VUX01TLCBidG1fcmVhZF9sb2NhbF9uYW1lX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JlYWRfbG9jYWxfbmFtZV9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBsb2NhbCBuYW1lIHJlYWQgY29tcGxldGUuCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgSENJLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9yZWFkX2xvY2FsX25hbWVfY29tcGxldGUodWludDhfdCogcCwgVU5VU0VEX0FUVFIgdWludDE2X3QgZXZ0X2xlbikgewotICB0QlRNX0NNUExfQ0IqIHBfY2IgPSBidG1fY2IuZGV2Y2IucF9ybG5fY21wbF9jYjsKLSAgdWludDhfdCBzdGF0dXM7Ci0KLSAgYWxhcm1fY2FuY2VsKGJ0bV9jYi5kZXZjYi5yZWFkX2xvY2FsX25hbWVfdGltZXIpOwotCi0gIC8qIElmIHRoZXJlIHdhcyBhIGNhbGxiYWNrIGFkZHJlc3MgZm9yIHJlYWQgbG9jYWwgbmFtZSwgY2FsbCBpdCAqLwotICBidG1fY2IuZGV2Y2IucF9ybG5fY21wbF9jYiA9IE5VTEw7Ci0KLSAgaWYgKHBfY2IpIHsKLSAgICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLQotICAgIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpCi0gICAgICAoKnBfY2IpKHApOwotICAgIGVsc2UKLSAgICAgICgqcF9jYikoTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXREZXZpY2VDbGFzcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHRoZSBsb2NhbCBkZXZpY2UgY2xhc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXREZXZpY2VDbGFzcyhERVZfQ0xBU1MgZGV2X2NsYXNzKSB7Ci0gIGlmICghbWVtY21wKGJ0bV9jYi5kZXZjYi5kZXZfY2xhc3MsIGRldl9jbGFzcywgREVWX0NMQVNTX0xFTikpCi0gICAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci0KLSAgbWVtY3B5KGJ0bV9jYi5kZXZjYi5kZXZfY2xhc3MsIGRldl9jbGFzcywgREVWX0NMQVNTX0xFTik7Ci0KLSAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2lzX3JlYWR5KCkpIHJldHVybiAoQlRNX0RFVl9SRVNFVCk7Ci0KLSAgYnRzbmRfaGNpY193cml0ZV9kZXZfY2xhc3MoZGV2X2NsYXNzKTsKLQotICByZXR1cm4gKEJUTV9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkRGV2aWNlQ2xhc3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGxvY2FsIGRldmljZSBjbGFzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGV2aWNlIGNsYXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QqIEJUTV9SZWFkRGV2aWNlQ2xhc3Modm9pZCkgewotICByZXR1cm4gKCh1aW50OF90KilidG1fY2IuZGV2Y2IuZGV2X2NsYXNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSB2ZW5kb3Igc3BlY2lmaWMgSENJIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gKgotICogTm90ZXMKLSAqICAgICAgT3Bjb2RlIHdpbGwgYmUgT1InZCB3aXRoIEhDSV9HUlBfVkVORE9SX1NQRUNJRklDLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3BhcmFtX2J1ZiwgdEJUTV9WU0NfQ01QTF9DQiogcF9jYikgewotICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIEhDSSBjb21tYW5kIHBsdXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIHZvaWQqIHBfYnVmID0gb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSArIHNpemVvZih0QlRNX0NNUExfQ0IqKSArIHBhcmFtX2xlbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lDX1BSRUFNQkxFX1NJWkUpOwotCi0gIEJUTV9UUkFDRV9FVkVOVCgiQlRNOiAlczogT3Bjb2RlOiAweCUwNFgsIFBhcmFtTGVuOiAlaS4iLCBfX2Z1bmNfXywgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgcGFyYW1fbGVuKTsKLQotICAvKiBTZW5kIHRoZSBIQ0kgY29tbWFuZCAob3Bjb2RlIHdpbGwgYmUgT1InZCB3aXRoIEhDSV9HUlBfVkVORE9SX1NQRUNJRklDKSAqLwotICBidHNuZF9oY2ljX3ZlbmRvcl9zcGVjX2NtZChwX2J1Ziwgb3Bjb2RlLCBwYXJhbV9sZW4sIHBfcGFyYW1fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopcF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fdnNjX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGxvY2FsIEhDSSBWZW5kb3IgU3BlY2lmaWMKLSAqICAgICAgICAgICAgICAgICAgQ29tbWFuZCBjb21wbGV0ZSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIEhDSS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fdnNjX2NvbXBsZXRlKHVpbnQ4X3QqIHAsIHVpbnQxNl90IG9wY29kZSwgdWludDE2X3QgZXZ0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICB0QlRNX1ZTQ19DTVBMX0NCKiBwX3ZzY19jcGx0X2NiYWNrKSB7Ci0gIHRCVE1fVlNDX0NNUEwgdmNzX2NwbHRfcGFyYW1zOwotCi0gIC8qIElmIHRoZXJlIHdhcyBhIGNhbGxiYWNrIGFkZHJlc3MgZm9yIHZjcyBjb21wbGV0ZSwgY2FsbCBpdCAqLwotICBpZiAocF92c2NfY3BsdF9jYmFjaykgewotICAgIC8qIFBhc3MgcGFyYW10ZXJzIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotICAgIHZjc19jcGx0X3BhcmFtcy5vcGNvZGUgPSBvcGNvZGU7ICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gcmV0dXJuIGluZm8gKi8KLSAgICB2Y3NfY3BsdF9wYXJhbXMucGFyYW1fbGVuID0gZXZ0X2xlbjsgLyogTnVtYmVyIG9mIGJ5dGVzIGluIHJldHVybiBpbmZvICovCi0gICAgdmNzX2NwbHRfcGFyYW1zLnBfcGFyYW1fYnVmID0gcDsKLSAgICAoKnBfdnNjX2NwbHRfY2JhY2spKAotICAgICAgICAmdmNzX2NwbHRfcGFyYW1zKTsgLyogQ2FsbCB0aGUgVlNDIGNvbXBsZXRlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWdpc3RlckZvclZTRXZlbnRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWdpc3Rlci9kZXJlZ2lzdGVyIGZvciB2ZW5kb3IKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgSENJIGV2ZW50cy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElmIGlzX3JlZ2lzdGVyPXRydWUsIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgYmUgcmVnaXN0ZXJlZDsKLSAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCB0aGUgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgZGVyZWdpc3RlcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgbWF4aW11bSBudW1iZXIgb2YgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWdpc3RlckZvclZTRXZlbnRzKHRCVE1fVlNfRVZUX0NCKiBwX2NiLCBib29sIGlzX3JlZ2lzdGVyKSB7Ci0gIHRCVE1fU1RBVFVTIHJldHZhbCA9IEJUTV9TVUNDRVNTOwotICB1aW50OF90IGksIGZyZWVfaWR4ID0gQlRNX01BWF9WU0VfQ0FMTEJBQ0tTOwotCi0gIC8qIFNlZSBpZiBjYWxsYmFjayBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KLSAgZm9yIChpID0gMDsgaSA8IEJUTV9NQVhfVlNFX0NBTExCQUNLUzsgaSsrKSB7Ci0gICAgaWYgKGJ0bV9jYi5kZXZjYi5wX3ZlbmRfc3BlY19jYltpXSA9PSBOVUxMKSB7Ci0gICAgICAvKiBGb3VuZCBhIGZyZWUgc2xvdC4gU3RvcmUgaW5kZXggKi8KLSAgICAgIGZyZWVfaWR4ID0gaTsKLSAgICB9IGVsc2UgaWYgKGJ0bV9jYi5kZXZjYi5wX3ZlbmRfc3BlY19jYltpXSA9PSBwX2NiKSB7Ci0gICAgICAvKiBGb3VuZCBjYWxsYmFjayBpbiBsb29rdXAgdGFibGUuIElmIGRlcmVnaXN0ZXJpbmcsIGNsZWFyIHRoZSBlbnRyeS4gKi8KLSAgICAgIGlmICghaXNfcmVnaXN0ZXIpIHsKLSAgICAgICAgYnRtX2NiLmRldmNiLnBfdmVuZF9zcGVjX2NiW2ldID0gTlVMTDsKLSAgICAgICAgQlRNX1RSQUNFX0VWRU5UKCJCVE0gRGVyZWdpc3RlciBGb3IgVlNFdmVudHMgaXMgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKEJUTV9TVUNDRVNTKTsKLSAgICB9Ci0gIH0KLQotICAvKiBEaWRuJ3QgZmluZCBjYWxsYmFjay4gQWRkIGNhbGxiYWNrIHRvIGZyZWUgc2xvdCBpZiByZWdpc3RlcmluZyAqLwotICBpZiAoaXNfcmVnaXN0ZXIpIHsKLSAgICBpZiAoZnJlZV9pZHggPCBCVE1fTUFYX1ZTRV9DQUxMQkFDS1MpIHsKLSAgICAgIGJ0bV9jYi5kZXZjYi5wX3ZlbmRfc3BlY19jYltmcmVlX2lkeF0gPSBwX2NiOwotICAgICAgQlRNX1RSQUNFX0VWRU5UKCJCVE0gUmVnaXN0ZXIgRm9yIFZTRXZlbnRzIGlzIHN1Y2Nlc3NmdWxseSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBObyBmcmVlIGVudHJpZXMgYXZhaWxhYmxlICovCi0gICAgICBCVE1fVFJBQ0VfRVJST1IoIkJUTV9SZWdpc3RlckZvclZTRXZlbnRzOiB0b28gbWFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCIpOwotCi0gICAgICByZXR2YWwgPSBCVE1fTk9fUkVTT1VSQ0VTOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV92ZW5kb3Jfc3BlY2lmaWNfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGV2ZW50IEhDSV9WRU5ET1JfU1BFQ0lGSUNfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3ZlbmRvcl9zcGVjaWZpY19ldnQodWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7Ci0gIHVpbnQ4X3QgaTsKLQotICBCVE1fVFJBQ0VfREVCVUcoIkJUTSBFdmVudDogVmVuZG9yIFNwZWNpZmljIGV2ZW50IGZyb20gY29udHJvbGxlciIpOwotCi0gIC8vIEhhbmRsZSBCUVIgZXZlbnRzCi0gIHVpbnQ4X3QqIGJxcl9wdHIgPSBwOwotICB1aW50OF90IGV2ZW50X2NvZGU7Ci0gIHVpbnQ4X3QgbGVuOwotICBTVFJFQU1fVE9fVUlOVDgoZXZlbnRfY29kZSwgYnFyX3B0cik7Ci0gIFNUUkVBTV9UT19VSU5UOChsZW4sIGJxcl9wdHIpOwotICAvLyBDaGVjayBpZiB0aGVyZSdzIGF0IGxlYXN0IGEgc3ViZXZlbnQgY29kZQotICBpZiAobGVuID4gMSAmJiBldnRfbGVuID4gMSAmJiBldmVudF9jb2RlID09IEhDSV9WRU5ET1JfU1BFQ0lGSUNfRVZUKSB7Ci0gICAgdWludDhfdCBzdWJfZXZlbnRfY29kZTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoc3ViX2V2ZW50X2NvZGUsIGJxcl9wdHIpOwotICAgIGlmIChzdWJfZXZlbnRfY29kZSA9PSBIQ0lfVlNFX1NVQkNPREVfQlFSX1NVQl9FVlQpIHsKLSAgICAgIC8vIEV4Y2x1ZGluZyB0aGUgSENJIEV2ZW50IHBhY2tldCBoZWFkZXIgYW5kIDEgb2N0ZXQgc3ViLWV2ZW50IGNvZGUKLSAgICAgIGludDE2X3QgYnFyX3BhcmFtZXRlcl9sZW5ndGggPSBldnRfbGVuIC0gSENJRV9QUkVBTUJMRV9TSVpFIC0gMTsKLSAgICAgIHVpbnQ4X3QqIHBfYnFyX2V2ZW50ID0gYnFyX3B0cjsKLSAgICAgIC8vIFRoZSBzdHJlYW0gY3VycmVudGx5IHBvaW50cyB0byB0aGUgQlFSIHN1Yi1ldmVudCBwYXJhbWV0ZXJzCi0gICAgICBzd2l0Y2ggKHN1Yl9ldmVudF9jb2RlKSB7Ci0gICAgICAgIGNhc2UgYmx1ZXRvb3RoOjpicXI6OlFVQUxJVFlfUkVQT1JUX0lEX0xNUF9MTF9NRVNTQUdFX1RSQUNFOgotICAgICAgICAgIGlmIChicXJfcGFyYW1ldGVyX2xlbmd0aCA+PSBibHVldG9vdGg6OmJxcjo6a0xvZ0R1bXBQYXJhbVRvdGFsTGVuKSB7Ci0gICAgICAgICAgICBibHVldG9vdGg6OmJxcjo6RHVtcExtcExsTWVzc2FnZShicXJfcGFyYW1ldGVyX2xlbmd0aCwgcF9icXJfZXZlbnQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dfSU5GTygiTWFsZm9ybWVkIExNUCBldmVudCBvZiBsZW5ndGggJWhkIiwgYnFyX3BhcmFtZXRlcl9sZW5ndGgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgYmx1ZXRvb3RoOjpicXI6OlFVQUxJVFlfUkVQT1JUX0lEX0JUX1NDSEVEVUxJTkdfVFJBQ0U6Ci0gICAgICAgICAgaWYgKGJxcl9wYXJhbWV0ZXJfbGVuZ3RoID49IGJsdWV0b290aDo6YnFyOjprTG9nRHVtcFBhcmFtVG90YWxMZW4pIHsKLSAgICAgICAgICAgIGJsdWV0b290aDo6YnFyOjpEdW1wQnRTY2hlZHVsaW5nKGJxcl9wYXJhbWV0ZXJfbGVuZ3RoLCBwX2Jxcl9ldmVudCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR19JTkZPKCJNYWxmb3JtZWQgVFJBQ0UgZXZlbnQgb2YgbGVuZ3RoICVoZCIsCi0gICAgICAgICAgICAgICAgICAgICBicXJfcGFyYW1ldGVyX2xlbmd0aCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTE9HX0lORk8oIlVuaGFuZGxlZCBCUVIgc3ViZXZlbnQgMHglMDJoeHgiLCBzdWJfZXZlbnRfY29kZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUTV9NQVhfVlNFX0NBTExCQUNLUzsgaSsrKSB7Ci0gICAgaWYgKGJ0bV9jYi5kZXZjYi5wX3ZlbmRfc3BlY19jYltpXSkKLSAgICAgICgqYnRtX2NiLmRldmNiLnBfdmVuZF9zcGVjX2NiW2ldKShldnRfbGVuLCBwKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1dyaXRlUGFnZVRpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgSENJIFdyaXRlIFBhZ2UgVGltZW91dC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fV3JpdGVQYWdlVGltZW91dCh1aW50MTZfdCB0aW1lb3V0KSB7Ci0gIEJUTV9UUkFDRV9FVkVOVCgiQlRNOiBCVE1fV3JpdGVQYWdlVGltZW91dDogVGltZW91dDogJWQuIiwgdGltZW91dCk7Ci0KLSAgLyogU2VuZCB0aGUgSENJIGNvbW1hbmQgKi8KLSAgYnRzbmRfaGNpY193cml0ZV9wYWdlX3RvdXQodGltZW91dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fV3JpdGVWb2ljZVNldHRpbmdzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIEhDSSBXcml0ZSBWb2ljZSBTZXR0aW5ncyBjb21tYW5kLgotICogICAgICAgICAgICAgICAgICBTZWUgaGNpZGVmcy5oIGZvciBzZXR0aW5ncyBiaXRtYXNrIHZhbHVlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fV3JpdGVWb2ljZVNldHRpbmdzKHVpbnQxNl90IHNldHRpbmdzKSB7Ci0gIEJUTV9UUkFDRV9FVkVOVCgiQlRNOiBCVE1fV3JpdGVWb2ljZVNldHRpbmdzOiBTZXR0aW5nczogMHglMDR4LiIsIHNldHRpbmdzKTsKLQotICAvKiBTZW5kIHRoZSBIQ0kgY29tbWFuZCAqLwotICBidHNuZF9oY2ljX3dyaXRlX3ZvaWNlX3NldHRpbmdzKCh1aW50MTZfdCkoc2V0dGluZ3MgJiAweDAzZmYpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9FbmFibGVUZXN0TW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBIQ0kgdGhlIGVuYWJsZSBkZXZpY2UgdW5kZXIgdGVzdCBjb21tYW5kLgotICoKLSAqICAgICAgICAgICAgICAgICAgTm90ZTogQ29udHJvbGxlciBjYW4gb25seSBiZSB0YWtlbiBvdXQgb2YgdGhpcyBtb2RlIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICByZXNldHRpbmcgdGhlIGNvbnRyb2xsZXIuCi0gKgotICogUmV0dXJucwotICogICAgICBCVE1fU1VDQ0VTUyAgICAgICAgIENvbW1hbmQgc2VudC4KLSAqICAgICAgQlRNX05PX1JFU09VUkNFUyAgICBJZiBvdXQgb2YgcmVzb3VyY2VzIHRvIHNlbmQgdGhlIGNvbW1hbmQuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fRW5hYmxlVGVzdE1vZGUodm9pZCkgewotICB1aW50OF90IGNvbmQ7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCJCVE06IEJUTV9FbmFibGVUZXN0TW9kZSIpOwotCi0gIC8qIHNldCBhdXRvIGFjY2VwdCBjb25uZWN0aW9uIGFzIHRoaXMgaXMgbmVlZGVkIGR1cmluZyB0ZXN0IG1vZGUgKi8KLSAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCBIQ0kgY29tbWFuZCAqLwotICBjb25kID0gSENJX0RPX0FVVE9fQUNDRVBUX0NPTk5FQ1Q7Ci0gIGJ0c25kX2hjaWNfc2V0X2V2ZW50X2ZpbHRlcihIQ0lfRklMVEVSX0NPTk5FQ1RJT05fU0VUVVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfRklMVEVSX0NPTkRfTkVXX0RFVklDRSwgJmNvbmQsIHNpemVvZihjb25kKSk7Ci0KLSAgLyogcHV0IGRldmljZSB0byBjb25uZWN0YWJsZSBtb2RlICovCi0gIGlmIChCVE1fU2V0Q29ubmVjdGFiaWxpdHkoQlRNX0NPTk5FQ1RBQkxFKSAhPSBCVE1fU1VDQ0VTUykgewotICAgIHJldHVybiBCVE1fTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgLyogcHV0IGRldmljZSB0byBkaXNjb3ZlcmFibGUgbW9kZSAqLwotICBpZiAoQlRNX1NldERpc2NvdmVyYWJpbGl0eShCVE1fR0VORVJBTF9ESVNDT1ZFUkFCTEUpICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgcmV0dXJuIEJUTV9OT19SRVNPVVJDRVM7Ci0gIH0KLQotICAvKiBtYXNrIG9mZiBhbGwgb2YgZXZlbnQgZnJvbSBjb250cm9sbGVyICovCi0gIGJsdWV0b290aDo6c2hpbTo6Y29udHJvbGxlcl9jbGVhcl9ldmVudF9tYXNrKCk7Ci0KLSAgLyogU2VuZCB0aGUgSENJIGNvbW1hbmQgKi8KLSAgYnRzbmRfaGNpY19lbmFibGVfdGVzdF9tb2RlKCk7Ci0gIHJldHVybiAoQlRNX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0RlbGV0ZVN0b3JlZExpbmtLZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBsaW5rIGtleSBmb3IgdGhlIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBkZXZpY2UgYWRkcmVzc2VzIGZyb20gdGhlIE5WUkFNIHN0b3JhZ2UgYXR0YWNoZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIEJsdWV0b290aCBjb250cm9sbGVyLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgIC0gQWRkcmVzc2VzIG9mIHRoZSBkZXZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIHBfY2IgICAgICAgICAtIENhbGwgYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gcmV0dXJuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9EZWxldGVTdG9yZWRMaW5rS2V5KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgLyogQ2hlY2sgaWYgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgY29tcGxldGVkICovCi0gIGlmIChidG1fY2IuZGV2Y2IucF9zdG9yZWRfbGlua19rZXlfY21wbF9jYikgcmV0dXJuIChCVE1fQlVTWSk7Ci0KLSAgYm9vbCBkZWxldGVfYWxsX2ZsYWcgPSAhYmRfYWRkcjsKLQotICBCVE1fVFJBQ0VfRVZFTlQoIkJUTTogQlRNX0RlbGV0ZVN0b3JlZExpbmtLZXk6IGRlbGV0ZV9hbGxfZmxhZzogJXMiLAotICAgICAgICAgICAgICAgICAgZGVsZXRlX2FsbF9mbGFnID8gInRydWUiIDogImZhbHNlIik7Ci0KLSAgYnRtX2NiLmRldmNiLnBfc3RvcmVkX2xpbmtfa2V5X2NtcGxfY2IgPSBwX2NiOwotICBpZiAoIWJkX2FkZHIpIHsKLSAgICAvKiBUaGlzIGlzIHRvIGRlbGV0ZSBhbGwgbGluayBrZXlzICovCi0gICAgLyogV2UgZG9uJ3QgY2FyZSB0aGUgQkQgYWRkcmVzcy4gSnVzdCBwYXNzIGEgbm9uIHplcm8gcG9pbnRlciAqLwotICAgIFJhd0FkZHJlc3MgbG9jYWxfYmRfYWRkciA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgICBidHNuZF9oY2ljX2RlbGV0ZV9zdG9yZWRfa2V5KGxvY2FsX2JkX2FkZHIsIGRlbGV0ZV9hbGxfZmxhZyk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRzbmRfaGNpY19kZWxldGVfc3RvcmVkX2tleSgqYmRfYWRkciwgZGVsZXRlX2FsbF9mbGFnKTsKLSAgfQotCi0gIHJldHVybiAoQlRNX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2RlbGV0ZV9zdG9yZWRfbGlua19rZXlfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSBkZWxldGUgc3RvcmVkIGxpbmsga2V5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2RlbGV0ZV9zdG9yZWRfbGlua19rZXlfY29tcGxldGUodWludDhfdCogcCkgewotICB0QlRNX0NNUExfQ0IqIHBfY2IgPSBidG1fY2IuZGV2Y2IucF9zdG9yZWRfbGlua19rZXlfY21wbF9jYjsKLSAgdEJUTV9ERUxFVEVfU1RPUkVEX0xJTktfS0VZX0NPTVBMRVRFIHJlc3VsdDsKLQotICAvKiBJZiB0aGVyZSB3YXMgYSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciByZWFkIHN0b3JlZCBsaW5rIGtleSwgY2FsbCBpdCAqLwotICBidG1fY2IuZGV2Y2IucF9zdG9yZWRfbGlua19rZXlfY21wbF9jYiA9IE5VTEw7Ci0KLSAgaWYgKHBfY2IpIHsKLSAgICAvKiBTZXQgdGhlIGNhbGwgYmFjayBldmVudCB0byBpbmRpY2F0ZSBjb21tYW5kIGNvbXBsZXRlICovCi0gICAgcmVzdWx0LmV2ZW50ID0gQlRNX0NCX0VWVF9ERUxFVEVfU1RPUkVEX0xJTktfS0VZUzsKLQotICAgIC8qIEV4dHJhY3QgdGhlIHJlc3VsdCBmaWVsZHMgZnJvbSB0aGUgSENJIGV2ZW50ICovCi0gICAgU1RSRUFNX1RPX1VJTlQ4KHJlc3VsdC5zdGF0dXMsIHApOwotICAgIFNUUkVBTV9UT19VSU5UMTYocmVzdWx0Lm51bV9rZXlzLCBwKTsKLQotICAgIC8qIENhbGwgdGhlIGNhbGwgYmFjayBhbmQgcGFzcyB0aGUgcmVzdWx0ICovCi0gICAgKCpwX2NiKSgmcmVzdWx0KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JUX1F1YWxpdHlfUmVwb3J0X1ZTRV9DQmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgaW52b2tlZCBvbiByZWNlaXZpbmcgb2YgVmVuZG9yIFNwZWNpZmljIEV2ZW50cy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgcmVnaXN0ZXJlZCBCUVIgcmVwb3J0IHJlY2VpdmVyIGlmCi0gKiAgICAgICAgICAgICAgICAgIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCBzdWItZXZlbnQgaXMgaWRlbnRpZmllZC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGxlbmd0aCAtIExlbmd0aHMgb2YgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICBWZW5kb3IgU3BlY2lmaWMgRXZlbnQuCi0gKiAgICAgICAgICAgICAgICAgIHBfc3RyZWFtIC0gQSBwb2ludGVyIHRvIHRoZSBxdWFsaXR5IHJlcG9ydCB3aGljaCBpcyBzZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQmx1ZXRvb3RoIGNvbnRyb2xsZXIgdmlhIFZlbmRvciBTcGVjaWZpYyBFdmVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQlRNX0JUX1F1YWxpdHlfUmVwb3J0X1ZTRV9DQmFjayh1aW50OF90IGxlbmd0aCwgdWludDhfdCogcF9zdHJlYW0pIHsKLSAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IExlbmd0aHMgb2YgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSB6ZXJvLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCBzdWJfZXZlbnQgPSAwOwotICBTVFJFQU1fVE9fVUlOVDgoc3ViX2V2ZW50LCBwX3N0cmVhbSk7Ci0gIGxlbmd0aC0tOwotCi0gIGlmIChzdWJfZXZlbnQgPT0gSENJX1ZTRV9TVUJDT0RFX0JRUl9TVUJfRVZUKSB7Ci0gICAgaWYgKGJ0bV9jYi5wX2Jxcl9yZXBvcnRfcmVjZWl2ZXIgPT0gbnVsbHB0cikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IE5vIHJlZ2lzdGVyZWQgcmVwb3J0IHJlY2VpdmVyLiI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnRtX2NiLnBfYnFyX3JlcG9ydF9yZWNlaXZlcihsZW5ndGgsIHBfc3RyZWFtKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JUX1F1YWxpdHlfUmVwb3J0X1ZTRV9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXIvRGVyZWdpc3RlciBmb3IgQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0IFZTRSBzdWIKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQgQ2FsbGJhY2suCi0gKgotICogUGFyYW1ldGVyczogICAgICBpc19yZWdpc3RlciAtIFRydWUvRmFsc2UgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb3IgVlNFLgotICogICAgICAgICAgICAgICAgICBwX2Jxcl9yZXBvcnRfcmVjZWl2ZXIgLSBUaGUgcmVjZWl2ZXIgZm9yIHJlY2VpdmluZyBCbHVldG9vdGgKLSAqICAgICAgICAgICAgICAgICAgICBRdWFsaXR5IFJlcG9ydCBWU0Ugc3ViIGV2ZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQlRfUXVhbGl0eV9SZXBvcnRfVlNFX1JlZ2lzdGVyKAotICAgIGJvb2wgaXNfcmVnaXN0ZXIsIHRCVE1fQlRfUVVBTElUWV9SRVBPUlRfUkVDRUlWRVIqIHBfYnFyX3JlcG9ydF9yZWNlaXZlcikgewotICB0QlRNX1NUQVRVUyByZXR2YWwgPQotICAgICAgQlRNX1JlZ2lzdGVyRm9yVlNFdmVudHMoQlRNX0JUX1F1YWxpdHlfUmVwb3J0X1ZTRV9DQmFjaywgaXNfcmVnaXN0ZXIpOwotCi0gIGlmIChyZXR2YWwgIT0gQlRNX1NVQ0NFU1MpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogRmFpbCB0byAodW4pcmVnaXN0ZXIgVlNFdmVudHM6ICIgPDwgcmV0dmFsCi0gICAgICAgICAgICAgICAgIDw8ICIsIGlzX3JlZ2lzdGVyOiAiIDw8IGxvZ2Jvb2woaXNfcmVnaXN0ZXIpOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KLQotICBpZiAoaXNfcmVnaXN0ZXIpIHsKLSAgICBidG1fY2IucF9icXJfcmVwb3J0X3JlY2VpdmVyID0gcF9icXJfcmVwb3J0X3JlY2VpdmVyOwotICB9IGVsc2UgewotICAgIGJ0bV9jYi5wX2Jxcl9yZXBvcnRfcmVjZWl2ZXIgPSBudWxscHRyOwotICB9Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IFN1Y2Nlc3MgdG8gKHVuKXJlZ2lzdGVyIFZTRXZlbnRzLiIKLSAgICAgICAgICAgIDw8ICIgaXNfcmVnaXN0ZXI6ICIgPDwgbG9nYm9vbChpc19yZWdpc3Rlcik7Ci0gIHJldHVybiByZXR2YWw7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX2lucS5jYyBiL3N0YWNrL2J0bS9idG1faW5xLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ5NzNjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1faW5xLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgaW5xdWlyaWVzLiBUaGVzZSBpbmNsdWRlCi0gKiAgc2V0dGluZyBkaXNjb3ZlcmFibGUgbW9kZSwgY29udHJvbGxpbmcgdGhlIG1vZGUgb2YgdGhlIEJhc2ViYW5kLCBhbmQKLSAqICBtYWludGFpbmluZyBhIHNtYWxsIGRhdGFiYXNlIG9mIGlucXVpcnkgcmVzcG9uc2VzLCB3aXRoIEFQSSBmb3IgcGVvcGxlCi0gKiAgdG8gYnJvd3NlIGl0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoIgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImFkdmVydGlzZV9kYXRhX3BhcnNlci5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2lucV9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi1leHRlcm4gdm9pZCBidG1faW5xX3JlbW90ZV9uYW1lX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSk7Ci1leHRlcm4gdEJUTV9TVEFUVVMgYnRtX2JsZV9yZWFkX3JlbW90ZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYik7Ci1leHRlcm4gYm9vbCBidG1fYmxlX2NhbmNlbF9yZW1vdGVfbmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLWV4dGVybiB0QlRNX1NUQVRVUyBidG1fYmxlX3NldF9kaXNjb3ZlcmFiaWxpdHkodWludDE2X3QgY29tYmluZWRfbW9kZSk7Ci1leHRlcm4gdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfY29ubmVjdGFiaWxpdHkodWludDE2X3QgY29tYmluZWRfbW9kZSk7Ci0KLWV4dGVybiB0QlRNX1NUQVRVUyBidG1fYmxlX3N0YXJ0X2lucXVpcnkodWludDhfdCBkdXJhdGlvbik7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3N0b3BfaW5xdWlyeSh2b2lkKTsKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKiAzIHNlY29uZCB0aW1lb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlcyAqLwotI2RlZmluZSBCVE1fSU5RX1JFUExZX1RJTUVPVVRfTVMgKDMgKiAxMDAwKQotCi0vKiBUUlVFIHRvIGVuYWJsZSBERUJVRyB0cmFjZXMgZm9yIGJ0bV9pbnEgKi8KLSNpZm5kZWYgQlRNX0lOUV9ERUJVRwotI2RlZmluZSBCVE1fSU5RX0RFQlVHIEZBTFNFCi0jZW5kaWYKLQotI2RlZmluZSBCVElGX0RNX0RFRkFVTFRfSU5RX01BWF9EVVJBVElPTiAxMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICBMIE8gQyBBIEwgICAgRCBBIFQgQSAgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgTEFQIGdlbmVyYWxfaW5xX2xhcCA9IHsweDllLCAweDhiLCAweDMzfTsKLXN0YXRpYyBjb25zdCBMQVAgbGltaXRlZF9pbnFfbGFwID0gezB4OWUsIDB4OGIsIDB4MDB9OwotCi1jb25zdCB1aW50MTZfdCBCVE1fRUlSX1VVSURfTEtVUF9UQkxbQlRNX0VJUl9NQVhfU0VSVklDRVNdID0gewotICAgIFVVSURfU0VSVkNMQVNTX1NFUlZJQ0VfRElTQ09WRVJZX1NFUlZFUiwKLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19CUk9XU0VfR1JPVVBfREVTQ1JJUFRPUiwgICAqLwotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVAsICAgICAgICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfU0VSSUFMX1BPUlQsIFVVSURfU0VSVkNMQVNTX0xBTl9BQ0NFU1NfVVNJTkdfUFBQLAotICAgIFVVSURfU0VSVkNMQVNTX0RJQUxVUF9ORVRXT1JLSU5HLCBVVUlEX1NFUlZDTEFTU19JUk1DX1NZTkMsCi0gICAgVVVJRF9TRVJWQ0xBU1NfT0JFWF9PQkpFQ1RfUFVTSCwgVVVJRF9TRVJWQ0xBU1NfT0JFWF9GSUxFX1RSQU5TRkVSLAotICAgIFVVSURfU0VSVkNMQVNTX0lSTUNfU1lOQ19DT01NQU5ELCBVVUlEX1NFUlZDTEFTU19IRUFEU0VULAotICAgIFVVSURfU0VSVkNMQVNTX0NPUkRMRVNTX1RFTEVQSE9OWSwgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFLAotICAgIFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTkssIFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCwKLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19BRFZfQVVESU9fRElTVFJJQlVUSU9OLCAgICAqLwotICAgIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MLAotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX1ZJREVPX0NPTkZFUkVOQ0lORywgICAgICAgICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfSU5URVJDT00sIFVVSURfU0VSVkNMQVNTX0ZBWCwKLSAgICBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVksCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfV0FQLCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19XQVBfQ0xJRU5ULCAgICAgICAgICAgICAgICAqLwotICAgIFVVSURfU0VSVkNMQVNTX1BBTlUsIFVVSURfU0VSVkNMQVNTX05BUCwgVVVJRF9TRVJWQ0xBU1NfR04sCi0gICAgVVVJRF9TRVJWQ0xBU1NfRElSRUNUX1BSSU5USU5HLAotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX1JFRkVSRU5DRV9QUklOVElORywgICAgICAgICovCi0gICAgVVVJRF9TRVJWQ0xBU1NfSU1BR0lORywgVVVJRF9TRVJWQ0xBU1NfSU1BR0lOR19SRVNQT05ERVIsCi0gICAgVVVJRF9TRVJWQ0xBU1NfSU1BR0lOR19BVVRPX0FSQ0hJVkUsIFVVSURfU0VSVkNMQVNTX0lNQUdJTkdfUkVGX09CSkVDVFMsCi0gICAgVVVJRF9TRVJWQ0xBU1NfSEZfSEFORFNGUkVFLCBVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUsCi0gICAgVVVJRF9TRVJWQ0xBU1NfRElSX1BSVF9SRUZfT0JKX1NFUlZJQ0UsCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfUkVGTEVDVEVEX1VJLCAgICAgICAgICAgICAgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19CQVNJQ19QUklOVElORywgVVVJRF9TRVJWQ0xBU1NfUFJJTlRJTkdfU1RBVFVTLAotICAgIFVVSURfU0VSVkNMQVNTX0hVTUFOX0lOVEVSRkFDRSwgVVVJRF9TRVJWQ0xBU1NfQ0FCTEVfUkVQTEFDRU1FTlQsCi0gICAgVVVJRF9TRVJWQ0xBU1NfSENSUF9QUklOVCwgVVVJRF9TRVJWQ0xBU1NfSENSUF9TQ0FOLAotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX0NPTU1PTl9JU0ROX0FDQ0VTUywgICAgICAgICovCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfVklERU9fQ09ORkVSRU5DSU5HX0dXLCAgICAgKi8KLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19VRElfTVQsICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX1VESV9UQSwgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfVkNQLCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBVVUlEX1NFUlZDTEFTU19TQVAsIFVVSURfU0VSVkNMQVNTX1BCQVBfUENFLCBVVUlEX1NFUlZDTEFTU19QQkFQX1BTRSwKLSAgICBVVUlEX1NFUlZDTEFTU19QSE9ORV9BQ0NFU1MsIFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFMsCi0gICAgVVVJRF9TRVJWQ0xBU1NfUE5QX0lORk9STUFUSU9OLAotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX0dFTkVSSUNfTkVUV09SS0lORywgICAgICAgICovCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfR0VORVJJQ19GSUxFVFJBTlNGRVIsICAgICAgKi8KLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19HRU5FUklDX0FVRElPLCAgICAgICAgICAgICAqLwotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX0dFTkVSSUNfVEVMRVBIT05ZLCAgICAgICAgICovCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfVVBOUF9TRVJWSUNFLCAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19VUE5QX0lQX1NFUlZJQ0UsICAgICAgICAgICAqLwotICAgIC8qICAgIFVVSURfU0VSVkNMQVNTX0VTRFBfVVBOUF9JUF9QQU4sICAgICAgICAgICovCi0gICAgLyogICAgVVVJRF9TRVJWQ0xBU1NfRVNEUF9VUE5QX0lQX0xBUCwgICAgICAgICAgKi8KLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19FU0RQX1VQTlBfSVBfTDJDQVAsICAgICAgICAqLwotICAgIFVVSURfU0VSVkNMQVNTX1ZJREVPX1NPVVJDRSwgVVVJRF9TRVJWQ0xBU1NfVklERU9fU0lOSywKLSAgICAvKiAgICBVVUlEX1NFUlZDTEFTU19WSURFT19ESVNUUklCVVRJT04gICAgICAgICAqLwotICAgIFVVSURfU0VSVkNMQVNTX01FU1NBR0VfQUNDRVNTLCBVVUlEX1NFUlZDTEFTU19NRVNTQUdFX05PVElGSUNBVElPTiwKLSAgICBVVUlEX1NFUlZDTEFTU19IRFBfU09VUkNFLCBVVUlEX1NFUlZDTEFTU19IRFBfU0lOS307Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9jbHJfaW5xX2RiKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRhKTsKLXZvaWQgYnRtX2Nscl9pbnFfcmVzdWx0X2ZsdCh2b2lkKTsKLXN0YXRpYyB2b2lkIGJ0bV9pbnFfcm10X25hbWVfZmFpbGVkX2NhbmNlbGxlZCh2b2lkKTsKLXN0YXRpYyB0QlRNX1NUQVRVUyBidG1faW5pdGlhdGVfcmVtX25hbWUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcmlnaW4sIHVpbnQ2NF90IHRpbWVvdXRfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYik7Ci0KLXN0YXRpYyB1aW50OF90IGJ0bV9jb252ZXJ0X3V1aWRfdG9fZWlyX3NlcnZpY2UodWludDE2X3QgdXVpZDE2KTsKLXZvaWQgYnRtX3NldF9laXJfdXVpZCh1aW50OF90KiBwX2VpciwgdEJUTV9JTlFfUkVTVUxUUyogcF9yZXN1bHRzKTsKLXN0YXRpYyBjb25zdCB1aW50OF90KiBidG1fZWlyX2dldF91dWlkX2xpc3QoY29uc3QgdWludDhfdCogcF9laXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlaXJfbGVuLCB1aW50OF90IHV1aWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF91dWlkX2xpc3RfdHlwZSk7Ci0KLXZvaWQgU2VuZFJlbW90ZU5hbWVSZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6U2VuZFJlbW90ZU5hbWVSZXF1ZXN0KHJhd19hZGRyZXNzKTsKLSAgfSBlbHNlIHsKLSAgICBidHNuZF9oY2ljX3JtdF9uYW1lX3JlcShyYXdfYWRkcmVzcywgSENJX1BBR0VfU0NBTl9SRVBfTU9ERV9SMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfTUFOREFUQVJZX1BBR0VfU0NBTl9NT0RFLCAwKTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXREaXNjb3ZlcmFiaWxpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgZGV2aWNlIGludG8gb3Igb3V0IG9mCi0gKiAgICAgICAgICAgICAgICAgIGRpc2NvdmVyYWJsZSBtb2RlLiBEaXNjb3ZlcmFibGUgbW9kZSBtZWFucyBpbnF1aXJ5Ci0gKiAgICAgICAgICAgICAgICAgIHNjYW5zIGFyZSBlbmFibGVkLiAgSWYgYSB2YWx1ZSBvZiAnMCcgaXMgZW50ZXJlZCBmb3Igd2luZG93Ci0gKiAgICAgICAgICAgICAgICAgIG9yIGludGVydmFsLCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIGEgc2V0dGluZyBvZiB0aGUgZmlsdGVyIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZG4ndCBnZXQgYSBtZW1vcnkgcG9vbCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgYSBiYWQgcGFyYW1ldGVyIHdhcyBkZXRlY3RlZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCBpbnFfbW9kZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9TZXREaXNjb3ZlcmFiaWxpdHkoaW5xX21vZGUsIDAsIDApOwotICB9Ci0KLSAgdWludDhfdCBzY2FuX21vZGUgPSAwOwotICB1aW50MTZfdCBzZXJ2aWNlX2NsYXNzOwotICB1aW50OF90KiBwX2NvZDsKLSAgdWludDhfdCBtYWpvciwgbWlub3I7Ci0gIERFVl9DTEFTUyBjb2Q7Ci0gIExBUCB0ZW1wX2xhcFsyXTsKLSAgYm9vbCBpc19saW1pdGVkOwotICBib29sIGNvZF9saW1pdGVkOwotICB1aW50MTZfdCB3aW5kb3cgPSBCVE1fREVGQVVMVF9ESVNDX1dJTkRPVzsKLSAgdWludDE2X3QgaW50ZXJ2YWwgPSBCVE1fREVGQVVMVF9ESVNDX0lOVEVSVkFMOwotCi0gIEJUTV9UUkFDRV9BUEkoIkJUTV9TZXREaXNjb3ZlcmFiaWxpdHkiKTsKLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19ibGUoKSkgewotICAgIGlmIChidG1fYmxlX3NldF9kaXNjb3ZlcmFiaWxpdHkoKHVpbnQxNl90KShpbnFfbW9kZSkpID09IEJUTV9TVUNDRVNTKSB7Ci0gICAgICBidG1fY2IuYnRtX2lucV92YXJzLmRpc2NvdmVyYWJsZV9tb2RlICY9ICh+QlRNX0JMRV9ESVNDT1ZFUkFCTEVfTUFTSyk7Ci0gICAgICBidG1fY2IuYnRtX2lucV92YXJzLmRpc2NvdmVyYWJsZV9tb2RlIHw9Ci0gICAgICAgICAgKGlucV9tb2RlICYgQlRNX0JMRV9ESVNDT1ZFUkFCTEVfTUFTSyk7Ci0gICAgfQotICB9Ci0gIGlucV9tb2RlICY9IH5CVE1fQkxFX0RJU0NPVkVSQUJMRV9NQVNLOwotCi0gIC8qKiogQ2hlY2sgbW9kZSBwYXJhbWV0ZXIgKioqLwotICBpZiAoaW5xX21vZGUgPiBCVE1fTUFYX0RJU0NPVkVSQUJMRSkgcmV0dXJuIChCVE1fSUxMRUdBTF9WQUxVRSk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzIGFjdGl2ZSAqLwotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfaXNfcmVhZHkoKSkgcmV0dXJuIChCVE1fREVWX1JFU0VUKTsKLQotICAvKiBJZiB0aGUgd2luZG93IGFuZC9vciBpbnRlcnZhbCBpcyAnMCcsIHNldCB0byBkZWZhdWx0IHZhbHVlcyAqLwotICBCVE1fVFJBQ0VfQVBJKCJCVE1fU2V0RGlzY292ZXJhYmlsaXR5OiBtb2RlICVkIFtOb25EaXNjLTAsIExpbS0xLCBHZW4tMl0iLAotICAgICAgICAgICAgICAgIGlucV9tb2RlKTsKLQotICAvKiBTZXQgdGhlIElBQyBpZiBuZWVkZWQgKi8KLSAgaWYgKGlucV9tb2RlICE9IEJUTV9OT05fRElTQ09WRVJBQkxFKSB7Ci0gICAgaWYgKGlucV9tb2RlICYgQlRNX0xJTUlURURfRElTQ09WRVJBQkxFKSB7Ci0gICAgICAvKiBVc2UgdGhlIEdJQUMgYW5kIExJQUMgY29kZXMgZm9yIGxpbWl0ZWQgZGlzY292ZXJhYmxlIG1vZGUgKi8KLSAgICAgIG1lbWNweSh0ZW1wX2xhcFswXSwgbGltaXRlZF9pbnFfbGFwLCBMQVBfTEVOKTsKLSAgICAgIG1lbWNweSh0ZW1wX2xhcFsxXSwgZ2VuZXJhbF9pbnFfbGFwLCBMQVBfTEVOKTsKLQotICAgICAgYnRzbmRfaGNpY193cml0ZV9jdXJfaWFjX2xhcCgyLCAoTEFQICogY29uc3QpdGVtcF9sYXApOwotICAgIH0gZWxzZSB7Ci0gICAgICBidHNuZF9oY2ljX3dyaXRlX2N1cl9pYWNfbGFwKDEsIChMQVAgKiBjb25zdCkgJiBnZW5lcmFsX2lucV9sYXApOwotICAgIH0KLQotICAgIHNjYW5fbW9kZSB8PSBIQ0lfSU5RVUlSWV9TQ0FOX0VOQUJMRUQ7Ci0gIH0KLQotICAvKiBTZW5kIGRvd24gdGhlIGlucXVpcnkgc2NhbiB3aW5kb3cgYW5kIHBlcmlvZCBpZiBjaGFuZ2VkICovCi0gIGlmICgod2luZG93ICE9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX3NjYW5fd2luZG93KSB8fAotICAgICAgKGludGVydmFsICE9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX3NjYW5fcGVyaW9kKSkgewotICAgIGJ0c25kX2hjaWNfd3JpdGVfaW5xc2Nhbl9jZmcoaW50ZXJ2YWwsIHdpbmRvdyk7Ci0gICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfc2Nhbl93aW5kb3cgPSB3aW5kb3c7Ci0gICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfc2Nhbl9wZXJpb2QgPSBpbnRlcnZhbDsKLSAgfQotCi0gIGlmIChidG1fY2IuYnRtX2lucV92YXJzLmNvbm5lY3RhYmxlX21vZGUgJiBCVE1fQ09OTkVDVEFCTEVfTUFTSykKLSAgICBzY2FuX21vZGUgfD0gSENJX1BBR0VfU0NBTl9FTkFCTEVEOwotCi0gIGJ0c25kX2hjaWNfd3JpdGVfc2Nhbl9lbmFibGUoc2Nhbl9tb2RlKTsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5kaXNjb3ZlcmFibGVfbW9kZSAmPSAofkJUTV9ESVNDT1ZFUkFCTEVfTUFTSyk7Ci0gIGJ0bV9jYi5idG1faW5xX3ZhcnMuZGlzY292ZXJhYmxlX21vZGUgfD0gaW5xX21vZGU7Ci0KLSAgLyogQ2hhbmdlIHRoZSBzZXJ2aWNlIGNsYXNzIGJpdCBpZiBtb2RlIGhhcyBjaGFuZ2VkICovCi0gIHBfY29kID0gQlRNX1JlYWREZXZpY2VDbGFzcygpOwotICBCVE1fQ09EX1NFUlZJQ0VfQ0xBU1Moc2VydmljZV9jbGFzcywgcF9jb2QpOwotICBpc19saW1pdGVkID0gKGlucV9tb2RlICYgQlRNX0xJTUlURURfRElTQ09WRVJBQkxFKSA/IHRydWUgOiBmYWxzZTsKLSAgY29kX2xpbWl0ZWQgPSAoc2VydmljZV9jbGFzcyAmIEJUTV9DT0RfU0VSVklDRV9MTVREX0RJU0NPVkVSKSA/IHRydWUgOiBmYWxzZTsKLSAgaWYgKGlzX2xpbWl0ZWQgXiBjb2RfbGltaXRlZCkgewotICAgIEJUTV9DT0RfTUlOT1JfQ0xBU1MobWlub3IsIHBfY29kKTsKLSAgICBCVE1fQ09EX01BSk9SX0NMQVNTKG1ham9yLCBwX2NvZCk7Ci0gICAgaWYgKGlzX2xpbWl0ZWQpCi0gICAgICBzZXJ2aWNlX2NsYXNzIHw9IEJUTV9DT0RfU0VSVklDRV9MTVREX0RJU0NPVkVSOwotICAgIGVsc2UKLSAgICAgIHNlcnZpY2VfY2xhc3MgJj0gfkJUTV9DT0RfU0VSVklDRV9MTVREX0RJU0NPVkVSOwotCi0gICAgRklFTERTX1RPX0NPRChjb2QsIG1pbm9yLCBtYWpvciwgc2VydmljZV9jbGFzcyk7Ci0gICAgKHZvaWQpQlRNX1NldERldmljZUNsYXNzKGNvZCk7Ci0gIH0KLQotICByZXR1cm4gKEJUTV9TVUNDRVNTKTsKLX0KLQotdm9pZCBCVE1fRW5hYmxlSW50ZXJsYWNlZElucXVpcnlTY2FuKCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QlRNX0VuYWJsZUludGVybGFjZWRJbnF1aXJ5U2NhbigpOwotICB9Ci0KLSAgQlRNX1RSQUNFX0FQSSgiQlRNX0VuYWJsZUludGVybGFjZWRJbnF1aXJ5U2NhbiIpOwotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19pbnRlcmxhY2VkX2lucXVpcnlfc2NhbigpIHx8Ci0gICAgICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9zY2FuX3R5cGUgPT0gQlRNX1NDQU5fVFlQRV9JTlRFUkxBQ0VEKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnRzbmRfaGNpY193cml0ZV9pbnFzY2FuX3R5cGUoQlRNX1NDQU5fVFlQRV9JTlRFUkxBQ0VEKTsKLSAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfc2Nhbl90eXBlID0gQlRNX1NDQU5fVFlQRV9JTlRFUkxBQ0VEOwotfQotCi12b2lkIEJUTV9FbmFibGVJbnRlcmxhY2VkUGFnZVNjYW4oKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpCVE1fRW5hYmxlSW50ZXJsYWNlZFBhZ2VTY2FuKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRNX1RSQUNFX0FQSSgiQlRNX0VuYWJsZUludGVybGFjZWRQYWdlU2NhbiIpOwotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19pbnRlcmxhY2VkX2lucXVpcnlfc2NhbigpIHx8Ci0gICAgICBidG1fY2IuYnRtX2lucV92YXJzLnBhZ2Vfc2Nhbl90eXBlID09IEJUTV9TQ0FOX1RZUEVfSU5URVJMQUNFRCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGJ0c25kX2hjaWNfd3JpdGVfcGFnZXNjYW5fdHlwZShCVE1fU0NBTl9UWVBFX0lOVEVSTEFDRUQpOwotICBidG1fY2IuYnRtX2lucV92YXJzLnBhZ2Vfc2Nhbl90eXBlID0gQlRNX1NDQU5fVFlQRV9JTlRFUkxBQ0VEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldElucXVpcnlNb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgc3RhbmRhcmQgb3Igd2l0aCBSU1NJCi0gKiAgICAgICAgICAgICAgICAgIG1vZGUgb2YgdGhlIGlucXVpcnkgZm9yIGxvY2FsIGRldmljZS4KLSAqCi0gKiBPdXRwdXQgUGFyYW1zOiAgIG1vZGUgLSBzdGFuZGFyZCwgd2l0aCBSU1NJLCBleHRlbmRlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIGNvdWxkbid0IGdldCBhIG1lbW9yeSBwb29sIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiBhIGJhZCBwYXJhbWV0ZXIgd2FzIGRldGVjdGVkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9XUk9OR19NT0RFIGlmIHRoZSBkZXZpY2UgaXMgbm90IHVwLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0SW5xdWlyeU1vZGUodWludDhfdCBtb2RlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX1NldElucXVpcnlNb2RlKG1vZGUpOwotICB9Ci0KLSAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7Ci0gIEJUTV9UUkFDRV9BUEkoIkJUTV9TZXRJbnF1aXJ5TW9kZSIpOwotICBpZiAobW9kZSA9PSBCVE1fSU5RX1JFU1VMVF9TVEFOREFSRCkgewotICAgIC8qIG1hbmRhdG9yeSBtb2RlICovCi0gIH0gZWxzZSBpZiAobW9kZSA9PSBCVE1fSU5RX1JFU1VMVF9XSVRIX1JTU0kpIHsKLSAgICBpZiAoIWNvbnRyb2xsZXItPnN1cHBvcnRzX3Jzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMoKSkKLSAgICAgIHJldHVybiAoQlRNX01PREVfVU5TVVBQT1JURUQpOwotICB9IGVsc2UgaWYgKG1vZGUgPT0gQlRNX0lOUV9SRVNVTFRfRVhURU5ERUQpIHsKLSAgICBpZiAoIWNvbnRyb2xsZXItPnN1cHBvcnRzX2V4dGVuZGVkX2lucXVpcnlfcmVzcG9uc2UoKSkKLSAgICAgIHJldHVybiAoQlRNX01PREVfVU5TVVBQT1JURUQpOwotICB9IGVsc2UKLSAgICByZXR1cm4gKEJUTV9JTExFR0FMX1ZBTFVFKTsKLQotICBpZiAoIUJUTV9Jc0RldmljZVVwKCkpIHJldHVybiAoQlRNX1dST05HX01PREUpOwotCi0gIGJ0c25kX2hjaWNfd3JpdGVfaW5xdWlyeV9tb2RlKG1vZGUpOwotCi0gIHJldHVybiAoQlRNX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldENvbm5lY3RhYmlsaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIGRldmljZSBpbnRvIG9yIG91dCBvZgotICogICAgICAgICAgICAgICAgICBjb25uZWN0YWJsZSBtb2RlLiBEaXNjb3ZlcmFibGUgbW9kZSBtZWFucyBwYWdlIHNjYW5zIGFyZQotICogICAgICAgICAgICAgICAgICBlbmFibGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiBhIGJhZCBwYXJhbWV0ZXIgaXMgZGV0ZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZCBub3QgYWxsb2NhdGUgYSBtZXNzYWdlIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldENvbm5lY3RhYmlsaXR5KHVpbnQxNl90IHBhZ2VfbW9kZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9TZXRDb25uZWN0YWJpbGl0eShwYWdlX21vZGUsIDAsIDApOwotICB9Ci0KLSAgdWludDhfdCBzY2FuX21vZGUgPSAwOwotICB1aW50MTZfdCB3aW5kb3cgPSBCVE1fREVGQVVMVF9DT05OX1dJTkRPVzsKLSAgdWludDE2X3QgaW50ZXJ2YWwgPSBCVE1fREVGQVVMVF9DT05OX0lOVEVSVkFMOwotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotCi0gIEJUTV9UUkFDRV9BUEkoIkJUTV9TZXRDb25uZWN0YWJpbGl0eSIpOwotCi0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlKCkpIHsKLSAgICBpZiAoYnRtX2JsZV9zZXRfY29ubmVjdGFiaWxpdHkocGFnZV9tb2RlKSAhPSBCVE1fU1VDQ0VTUykgewotICAgICAgcmV0dXJuIEJUTV9OT19SRVNPVVJDRVM7Ci0gICAgfQotICAgIHBfaW5xLT5jb25uZWN0YWJsZV9tb2RlICY9ICh+QlRNX0JMRV9DT05ORUNUQUJMRV9NQVNLKTsKLSAgICBwX2lucS0+Y29ubmVjdGFibGVfbW9kZSB8PSAocGFnZV9tb2RlICYgQlRNX0JMRV9DT05ORUNUQUJMRV9NQVNLKTsKLSAgfQotICBwYWdlX21vZGUgJj0gfkJUTV9CTEVfQ09OTkVDVEFCTEVfTUFTSzsKLQotICAvKioqIENoZWNrIG1vZGUgcGFyYW1ldGVyICoqKi8KLSAgaWYgKHBhZ2VfbW9kZSAhPSBCVE1fTk9OX0NPTk5FQ1RBQkxFICYmIHBhZ2VfbW9kZSAhPSBCVE1fQ09OTkVDVEFCTEUpCi0gICAgcmV0dXJuIChCVE1fSUxMRUdBTF9WQUxVRSk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzIGFjdGl2ZSAqLwotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfaXNfcmVhZHkoKSkgcmV0dXJuIChCVE1fREVWX1JFU0VUKTsKLQotICBCVE1fVFJBQ0VfQVBJKCJCVE1fU2V0Q29ubmVjdGFiaWxpdHk6IG1vZGUgJWQgW05vbkNvbm4tMCwgQ29ubi0xXSIsCi0gICAgICAgICAgICAgICAgcGFnZV9tb2RlKTsKLQotICAvKioqIE9ubHkgY2hlY2sgd2luZG93IGFuZCBkdXJhdGlvbiBpZiBtb2RlIGlzIGNvbm5lY3RhYmxlICoqKi8KLSAgaWYgKHBhZ2VfbW9kZSA9PSBCVE1fQ09OTkVDVEFCTEUpIHsKLSAgICBzY2FuX21vZGUgfD0gSENJX1BBR0VfU0NBTl9FTkFCTEVEOwotICB9Ci0KLSAgaWYgKCh3aW5kb3cgIT0gcF9pbnEtPnBhZ2Vfc2Nhbl93aW5kb3cpIHx8Ci0gICAgICAoaW50ZXJ2YWwgIT0gcF9pbnEtPnBhZ2Vfc2Nhbl9wZXJpb2QpKSB7Ci0gICAgcF9pbnEtPnBhZ2Vfc2Nhbl93aW5kb3cgPSB3aW5kb3c7Ci0gICAgcF9pbnEtPnBhZ2Vfc2Nhbl9wZXJpb2QgPSBpbnRlcnZhbDsKLSAgICBidHNuZF9oY2ljX3dyaXRlX3BhZ2VzY2FuX2NmZyhpbnRlcnZhbCwgd2luZG93KTsKLSAgfQotCi0gIC8qIEtlZXAgdGhlIGlucXVpcnkgc2NhbiBhcyBwcmV2aW91b3NseSBzZXQgKi8KLSAgaWYgKHBfaW5xLT5kaXNjb3ZlcmFibGVfbW9kZSAmIEJUTV9ESVNDT1ZFUkFCTEVfTUFTSykKLSAgICBzY2FuX21vZGUgfD0gSENJX0lOUVVJUllfU0NBTl9FTkFCTEVEOwotCi0gIGJ0c25kX2hjaWNfd3JpdGVfc2Nhbl9lbmFibGUoc2Nhbl9tb2RlKTsKLSAgcF9pbnEtPmNvbm5lY3RhYmxlX21vZGUgJj0gKH5CVE1fQ09OTkVDVEFCTEVfTUFTSyk7Ci0gIHBfaW5xLT5jb25uZWN0YWJsZV9tb2RlIHw9IHBhZ2VfbW9kZTsKLSAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSXNJbnF1aXJ5QWN0aXZlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBiaXQgbWFzayBvZiB0aGUgY3VycmVudCBpbnF1aXJ5Ci0gKiAgICAgICAgICAgICAgICAgIHN0YXRlCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fSU5RVUlSWV9JTkFDVElWRSBpZiBpbmFjdGl2ZSAoMCkKLSAqICAgICAgICAgICAgICAgICAgQlRNX0dFTkVSQUxfSU5RVUlSWV9BQ1RJVkUgaWYgYSBnZW5lcmFsIGlucXVpcnkgaXMgYWN0aXZlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUTV9Jc0lucXVpcnlBY3RpdmUodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9Jc0lucXVpcnlBY3RpdmUoKTsKLSAgfQotCi0gIEJUTV9UUkFDRV9BUEkoIkJUTV9Jc0lucXVpcnlBY3RpdmUiKTsKLQotICByZXR1cm4gKGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2FjdGl2ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ2FuY2VsSW5xdWlyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYW5jZWxzIGFuIGlucXVpcnkgaWYgYWN0aXZlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0NhbmNlbElucXVpcnkodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6QlRNX0NhbmNlbElucXVpcnkoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidG1fY2IuaGlzdG9yeV8tPlB1c2goIiUtMzJzIiwgIklucXVpcnkgc2NhbiBzdG9wcGVkIik7Ci0KLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLSAgQlRNX1RSQUNFX0FQSSgiQlRNX0NhbmNlbElucXVpcnkgY2FsbGVkIik7Ci0KLSAgQ0hFQ0soQlRNX0lzRGV2aWNlVXAoKSk7Ci0KLSAgLyogT25seSBjYW5jZWwgaWYgbm90IGluIHBlcmlvZGljIG1vZGUsIG90aGVyd2lzZSB0aGUgY2FsbGVyIHNob3VsZCBjYWxsCi0gICAqIEJUTV9DYW5jZWxQZXJpb2RpY01vZGUgKi8KLSAgaWYgKChwX2lucS0+aW5xX2FjdGl2ZSAmIEJUTV9JTlFVSVJZX0FDVElWRV9NQVNLKSAhPSAwKSB7Ci0gICAgcF9pbnEtPmlucV9hY3RpdmUgPSBCVE1fSU5RVUlSWV9JTkFDVElWRTsKLSAgICBwX2lucS0+c3RhdGUgPSBCVE1fSU5RX0lOQUNUSVZFX1NUQVRFOwotICAgIHBfaW5xLT5wX2lucV9yZXN1bHRzX2NiID0gTlVMTDsgLyogRG8gbm90IG5vdGlmeSBjYWxsZXIgYW55bW9yZSAqLwotICAgIHBfaW5xLT5wX2lucV9jbXBsX2NiID0gTlVMTDsgICAgLyogRG8gbm90IG5vdGlmeSBjYWxsZXIgYW55bW9yZSAqLwotCi0gICAgaWYgKChwX2lucS0+aW5xcGFybXMubW9kZSAmIEJUTV9CUl9JTlFVSVJZX01BU0spICE9IDApIHsKLSAgICAgIGJsdWV0b290aDo6bGVnYWN5OjpoY2k6OkdldEludGVyZmFjZSgpLklucXVpcnlDYW5jZWwoKTsKLSAgICB9Ci0gICAgaWYgKChwX2lucS0+aW5xcGFybXMubW9kZSAmIEJUTV9CTEVfSU5RVUlSWV9NQVNLKSAhPSAwKQotICAgICAgYnRtX2JsZV9zdG9wX2lucXVpcnkoKTsKLQotICAgIHBfaW5xLT5pbnFfY291bnRlcisrOwotICAgIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQoKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1N0YXJ0SW5xdWlyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgYW4gaW5xdWlyeS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHBfaW5xcGFybXMgLSBwb2ludGVyIHRvIHRoZSBpbnF1aXJ5IGluZm9ybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICBtb2RlIC0gR0VORVJBTCBvciBMSU1JVEVEIGlucXVpcnksIEJSL0xFIGJpdCBtYXNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwZXJhdGVseQotICogICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gLSBsZW5ndGggaW4gMS4yOCBzZWMgaW50ZXJ2YWxzIChJZiAnMCcsIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnF1aXJ5IGlzIENBTkNFTExFRCkKLSAqICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9jb25kX3R5cGUgLSBCVE1fQ0xSX0lOUVVJUllfRklMVEVSLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9GSUxURVJfQ09ORF9ERVZJQ0VfQ0xBU1MsIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0ZJTFRFUl9DT05EX0JEX0FERFIKLSAqICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9jb25kIC0gdmFsdWUgZm9yIHRoZSBmaWx0ZXIgKGJhc2VkIG9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY29uZF90eXBlKQotICoKLSAqICAgICAgICAgICAgICAgICAgcF9yZXN1bHRzX2NiICAgLSBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lIHdoaWNoIGdldHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgdXBvbiByZWNlaXB0IG9mIGFuIGlucXVpcnkgcmVzdWx0LiBJZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkLgotICoKLSAqICAgICAgICAgICAgICAgICAgcF9jbXBsX2NiICAgLSBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lIHdoaWNoIGdldHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLiAgSWYgdGhpcyBmaWVsZCBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHRoZSBhcHBsaWNhdGlvbiBpcyBub3Qgbm90aWZpZWQgd2hlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC4KLSAqIFJldHVybnMgICAgICAgICAgdEJUTV9TVEFUVVMKLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgYWxyZWFkeSBpbiBwcm9ncmVzcwotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiBwYXJhbWV0ZXIocykgYXJlIG91dCBvZiByYW5nZQotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIGNvdWxkIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgdG8gc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1N0YXJ0SW5xdWlyeSh0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKSB7Ci0gIHRCVE1fSU5RVUlSWV9WQVJfU1QqIHBfaW5xID0gJmJ0bV9jYi5idG1faW5xX3ZhcnM7Ci0KLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU3RhcnRJbnF1aXJ5KHBfcmVzdWx0c19jYiwgcF9jbXBsX2NiKTsKLSAgfQotCi0gIC8qIE9ubHkgb25lIGFjdGl2ZSBpbnF1aXJ5IGlzIGFsbG93ZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgQWxzbyBkbyBub3QgYWxsb3cgYW4gaW5xdWlyeSBpZiB0aGUgaW5xdWlyeSBmaWx0ZXIgaXMgYmVpbmcgdXBkYXRlZCAqLwotICBpZiAocF9pbnEtPmlucV9hY3RpdmUpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJUTV9CVVNZIjsKLSAgICByZXR1cm4gKEJUTV9CVVNZKTsKLSAgfQotCi0gIC8qKiogTWFrZSBzdXJlIHRoZSBkZXZpY2UgaXMgcmVhZHkgKioqLwotICBpZiAoIUJUTV9Jc0RldmljZVVwKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGFkYXB0ZXIgaXMgbm90IHVwIjsKLSAgICByZXR1cm4gQlRNX1dST05HX01PREU7Ci0gIH0KLQotICBidG1fY2IuaGlzdG9yeV8tPlB1c2goIiUtMzJzIiwgIklucXVpcnkgc2NhbiBzdGFydGVkIik7Ci0KLSAgLyogU2F2ZSB0aGUgaW5xdWlyeSBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgdXBvbiB0aGUgY29tcGxldGlvbiBvZgotICAgKiBzZXR0aW5nL2NsZWFyaW5nIHRoZSBpbnF1aXJ5IGZpbHRlciAqLwotICBwX2lucS0+aW5xcGFybXMgPSB7fTsKLSAgcF9pbnEtPmlucXBhcm1zLm1vZGUgPSBCVE1fR0VORVJBTF9JTlFVSVJZIHwgQlRNX0JMRV9HRU5FUkFMX0lOUVVJUlk7Ci0gIHBfaW5xLT5pbnFwYXJtcy5kdXJhdGlvbiA9IEJUSUZfRE1fREVGQVVMVF9JTlFfTUFYX0RVUkFUSU9OOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGlucXVpcnkgdmFyaWFibGVzICovCi0gIHBfaW5xLT5zdGF0ZSA9IEJUTV9JTlFfQUNUSVZFX1NUQVRFOwotICBwX2lucS0+cF9pbnFfY21wbF9jYiA9IHBfY21wbF9jYjsKLSAgcF9pbnEtPnBfaW5xX3Jlc3VsdHNfY2IgPSBwX3Jlc3VsdHNfY2I7Ci0gIHBfaW5xLT5pbnFfY21wbF9pbmZvLm51bV9yZXNwID0gMDsgLyogQ2xlYXIgdGhlIHJlc3VsdHMgY291bnRlciAqLwotICBwX2lucS0+aW5xX2FjdGl2ZSA9IHBfaW5xLT5pbnFwYXJtcy5tb2RlOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiQlRNX1N0YXJ0SW5xdWlyeTogcF9pbnEtPmlucV9hY3RpdmUgPSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgcF9pbnEtPmlucV9hY3RpdmUpOwotCi0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfYmxlKCkpIHsKLSAgICBidG1fYmxlX3N0YXJ0X2lucXVpcnkocF9pbnEtPmlucXBhcm1zLmR1cmF0aW9uKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfV0FSTigiVHJ5aW5nIHRvIGRvIExFIHNjYW4gb24gYSBub24tTEUgYWRhcHRlciIpOwotICAgIHBfaW5xLT5pbnFwYXJtcy5tb2RlICY9IH5CVE1fQkxFX0lOUVVJUllfTUFTSzsKLSAgfQotCi0gIGJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzKEJUTV9JTlFVSVJZX1NUQVJURUQpOwotCi0gIGlmIChwX2lucS0+aW5xX2FjdGl2ZSAmIEJUTV9TU1BfSU5RVUlSWV9BQ1RJVkUpIHsKLSAgICBidG1fcHJvY2Vzc19pbnFfY29tcGxldGUoQlRNX05PX1JFU09VUkNFUywgQlRNX0dFTkVSQUxfSU5RVUlSWSk7Ci0gICAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLSAgfQotCi0gIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQoKTsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCBiZF9hZGRycyByZXNwb25kaW5nICovCi0gIHBfaW5xLT5wX2JkX2RiID0gKHRJTlFfQkRBRERSKilvc2lfY2FsbG9jKEJUX0RFRkFVTFRfQlVGRkVSX1NJWkUpOwotICBwX2lucS0+bWF4X2JkX2VudHJpZXMgPQotICAgICAgKHVpbnQxNl90KShCVF9ERUZBVUxUX0JVRkZFUl9TSVpFIC8gc2l6ZW9mKHRJTlFfQkRBRERSKSk7Ci0KLSAgYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6R2V0SW50ZXJmYWNlKCkuU3RhcnRJbnF1aXJ5KAotICAgICAgZ2VuZXJhbF9pbnFfbGFwLCBwX2lucS0+aW5xcGFybXMuZHVyYXRpb24sIDApOwotICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhIHJlbW90ZSBkZXZpY2UgSENJIGNvbW1hbmQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgYW5kIGNhbGxzIHRoZSBjYWxsYmFjayB3aGVuIHRoZSBwcm9jZXNzIGhhcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZWQuCi0gKgotICogSW5wdXQgUGFyYW1zOiAgICByZW1vdGVfYmRhICAgICAgLSBkZXZpY2UgYWRkcmVzcyBvZiBuYW1lIHRvIHJldHJpZXZlCi0gKiAgICAgICAgICAgICAgICAgIHBfY2IgICAgICAgICAgICAtIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRCVE1fUkVNT1RFX0RFVl9OQU1FIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suCi0gKgotICogUmV0dXJucwotICogICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaXMgcmV0dXJuZWQgaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudCB0byBIQ0kuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqICAgICAgICAgICAgICAgICAgQlRNX1VOS05PV05fQUREUiBpZiBkZXZpY2UgYWRkcmVzcyBpcyBiYWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZCBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIHRvIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUgaWYgdGhlIGRldmljZSBpcyBub3QgdXAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShyZW1vdGVfYmRhLCBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOwotICB9Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBiZCBhZGRyICIgPDwgcmVtb3RlX2JkYTsKLSAgLyogVXNlIExFIHRyYW5zcG9ydCB3aGVuIExFIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSBvcHRpb24gKi8KLSAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICByZXR1cm4gYnRtX2JsZV9yZWFkX3JlbW90ZV9uYW1lKHJlbW90ZV9iZGEsIHBfY2IpOwotICB9Ci0gIC8qIFVzZSBjbGFzc2ljIHRyYW5zcG9ydCBmb3IgQlIvRURSIGFuZCBEdWFsIE1vZGUgZGV2aWNlcyAqLwotICByZXR1cm4gYnRtX2luaXRpYXRlX3JlbV9uYW1lKHJlbW90ZV9iZGEsIEJUTV9STVRfTkFNRV9FWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0VYVF9STVRfTkFNRV9USU1FT1VUX01TLCBwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9DYW5jZWxSZW1vdGVEZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyB0aGUgY2FuY2VsIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGRldmljZS4KLSAqCi0gKiBJbnB1dCBQYXJhbXM6ICAgIE5vbmUKLSAqCi0gKiBSZXR1cm5zCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50IHRvIEhDSS4KLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZCBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIHRvIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUgaWYgdGhlcmUgaXMgbm90IGFuIGFjdGl2ZSByZW1vdGUgbmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQ2FuY2VsUmVtb3RlRGV2aWNlTmFtZSh2b2lkKSB7Ci0gIHRCVE1fSU5RVUlSWV9WQVJfU1QqIHBfaW5xID0gJmJ0bV9jYi5idG1faW5xX3ZhcnM7Ci0KLSAgQlRNX1RSQUNFX0FQSSgiQlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUoKSIpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYWxyZWFkeSBvbmUgaW4gcHJvZ3Jlc3MgKi8KLSAgaWYgKHBfaW5xLT5yZW1uYW1lX2FjdGl2ZSkgewotICAgIGlmIChCVE1fVXNlTGVMaW5rKHBfaW5xLT5yZW1uYW1lX2JkYSkpIHsKLSAgICAgIC8qIENhbmNlbCByZW1vdGUgbmFtZSByZXF1ZXN0IGZvciBMRSBkZXZpY2UsIGFuZCBwcm9jZXNzIHJlbW90ZSBuYW1lCi0gICAgICAgKiBjYWxsYmFjay4gKi8KLSAgICAgIGJ0bV9pbnFfcm10X25hbWVfZmFpbGVkX2NhbmNlbGxlZCgpOwotICAgIH0gZWxzZQotICAgICAgYnRzbmRfaGNpY19ybXRfbmFtZV9yZXFfY2FuY2VsKHBfaW5xLT5yZW1uYW1lX2JkYSk7Ci0gICAgcmV0dXJuIChCVE1fQ01EX1NUQVJURUQpOwotICB9IGVsc2UKLSAgICByZXR1cm4gKEJUTV9XUk9OR19NT0RFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9JbnFEYlJlYWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgaW5xdWlyeSBkYXRhYmFzZSBmb3IgYSBtYXRjaAotICogICAgICAgICAgICAgICAgICBiYXNlZCBvbiBCbHVldG9vdGggRGV2aWNlIEFkZHJlc3MuIFRoaXMgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKLSAqICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIHRvIGdldCB0aGUgaW5xdWlyeSBkZXRhaWxzIG9mIGEgc3BlY2lmaWMgQkQKLSAqICAgICAgICAgICAgICAgICAgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gZW50cnksIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fSU5RX0lORk8qIEJUTV9JbnFEYlJlYWQoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgdElOUV9EQl9FTlQqIHBfZW50ID0gYnRtX2lucV9kYl9maW5kKHBfYmRhKTsKLSAgcmV0dXJuIChwX2VudCA9PSBudWxscHRyKSA/IG51bGxwdHIgOiAmcF9lbnQtPmlucV9pbmZvOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0lucURiRmlyc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgaW5xdWlyeSBkYXRhYmFzZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGZpcnN0IHVzZWQgZW50cnksIGFuZCByZXR1cm5zIHRoYXQuIFRoaXMgaXMgdXNlZCBpbgotICogICAgICAgICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9JbnFEYk5leHQgYnkgYXBwbGljYXRpb25zIGFzIGEgd2F5IHRvIHdhbGsgdGhyb3VnaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgaW5xdWlyeSBkYXRhYmFzZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gZmlyc3QgaW4tdXNlIGVudHJ5LCBvciBOVUxMIGlmIERCIGlzIGVtcHR5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fSU5RX0lORk8qIEJUTV9JbnFEYkZpcnN0KHZvaWQpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHRJTlFfREJfRU5UKiBwX2VudCA9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2RiOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUTV9JTlFfREJfU0laRTsgeHgrKywgcF9lbnQrKykgewotICAgIGlmIChwX2VudC0+aW5fdXNlKSByZXR1cm4gKCZwX2VudC0+aW5xX2luZm8pOwotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm8gdXNlZCBlbnRyeSBmb3VuZCAqLwotICByZXR1cm4gKCh0QlRNX0lOUV9JTkZPKilOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9JbnFEYk5leHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgaW5xdWlyeSBkYXRhYmFzZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIG5leHQgdXNlZCBlbnRyeSwgYW5kIHJldHVybnMgdGhhdC4gIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgaXMgTlVMTCwgdGhlIGZpcnN0IGVudHJ5IGlzIHJldHVybmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBuZXh0IGluLXVzZSBlbnRyeSwgb3IgTlVMTCBpZiBubyBtb3JlIGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX0lOUV9JTkZPKiBCVE1fSW5xRGJOZXh0KHRCVE1fSU5RX0lORk8qIHBfY3VyKSB7Ci0gIHRJTlFfREJfRU5UKiBwX2VudDsKLSAgdWludDE2X3QgaW54OwotCi0gIGlmIChwX2N1cikgewotICAgIHBfZW50ID0gKHRJTlFfREJfRU5UKikoKHVpbnQ4X3QqKXBfY3VyIC0gb2Zmc2V0b2YodElOUV9EQl9FTlQsIGlucV9pbmZvKSk7Ci0gICAgaW54ID0gKHVpbnQxNl90KSgocF9lbnQgLSBidG1fY2IuYnRtX2lucV92YXJzLmlucV9kYikgKyAxKTsKLQotICAgIGZvciAocF9lbnQgPSAmYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfZGJbaW54XTsgaW54IDwgQlRNX0lOUV9EQl9TSVpFOwotICAgICAgICAgaW54KyssIHBfZW50KyspIHsKLSAgICAgIGlmIChwX2VudC0+aW5fdXNlKSByZXR1cm4gKCZwX2VudC0+aW5xX2luZm8pOwotICAgIH0KLQotICAgIC8qIElmIGhlcmUsIG1vcmUgZW50cmllcyBmb3VuZCAqLwotICAgIHJldHVybiAoKHRCVE1fSU5RX0lORk8qKU5VTEwpOwotICB9IGVsc2UKLSAgICByZXR1cm4gKEJUTV9JbnFEYkZpcnN0KCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0NsZWFySW5xRGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFyIG91dCBhIGRldmljZSBvciBhbGwgZGV2aWNlcwotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBpbnF1aXJ5IGRhdGFiYXNlLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF9iZGEgLSAoaW5wdXQpIEJEX0FERFIgLT4gIEFkZHJlc3Mgb2YgZGV2aWNlIHRvIGNsZWFyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBjbGVhcnMgYWxsIGVudHJpZXMpCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQlVTWSBpZiBhbiBpbnF1aXJ5LCBnZXQgcmVtb3RlIG5hbWUsIG9yIGV2ZW50IGZpbHRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFjdGl2ZSwgb3RoZXJ3aXNlIEJUTV9TVUNDRVNTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9DbGVhcklucURiKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRhKSB7Ci0gIHRCVE1fSU5RVUlSWV9WQVJfU1QqIHBfaW5xID0gJmJ0bV9jYi5idG1faW5xX3ZhcnM7Ci0KLSAgLyogSWYgYW4gaW5xdWlyeSBvciByZW1vdGUgbmFtZSBpcyBpbiBwcm9ncmVzcyByZXR1cm4gYnVzeSAqLwotICBpZiAocF9pbnEtPmlucV9hY3RpdmUgIT0gQlRNX0lOUVVJUllfSU5BQ1RJVkUpIHJldHVybiAoQlRNX0JVU1kpOwotCi0gIGJ0bV9jbHJfaW5xX2RiKHBfYmRhKTsKLQotICByZXR1cm4gKEJUTV9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICogICAgICAgICAgICAgICAgICAgIEJUTSBJbnRlcm5hbCBJbnF1aXJ5IEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1faW5xX2RiX3Jlc2V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBhdCByZXNldCB0byBjbGVhciB0aGUgaW5xdWlyeQotICogICAgICAgICAgICAgICAgICBkYXRhYmFzZSAmIHBlbmRpbmcgY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2lucV9kYl9yZXNldCh2b2lkKSB7Ci0gIHRCVE1fUkVNT1RFX0RFVl9OQU1FIHJlbV9uYW1lOwotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotICB1aW50OF90IG51bV9yZXNwb25zZXM7Ci0gIHVpbnQ4X3QgdGVtcF9pbnFfYWN0aXZlOwotCi0gIC8qIElmIGFuIGlucXVpcnkgb3IgcGVyaW9kaWMgaW5xdWlyeSBpcyBhY3RpdmUsIHJlc2V0IHRoZSBtb2RlIHRvIGluYWN0aXZlICovCi0gIGlmIChwX2lucS0+aW5xX2FjdGl2ZSAhPSBCVE1fSU5RVUlSWV9JTkFDVElWRSkgewotICAgIHRlbXBfaW5xX2FjdGl2ZSA9IHBfaW5xLT5pbnFfYWN0aXZlOyAvKiBTYXZlIHNvIHN0YXRlIGNhbiBjaGFuZ2UgQkVGT1JFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayBpcyBjYWxsZWQgKi8KLSAgICBwX2lucS0+aW5xX2FjdGl2ZSA9IEJUTV9JTlFVSVJZX0lOQUNUSVZFOwotCi0gICAgLyogSWYgbm90IGEgcGVyaW9kaWMgaW5xdWlyeSwgdGhlIGNvbXBsZXRlIGNhbGxiYWNrIG11c3QgYmUgY2FsbGVkIHRvIG5vdGlmeQotICAgICAqIGNhbGxlciAqLwotICAgIGlmICh0ZW1wX2lucV9hY3RpdmUgPT0gQlRNX0dFTkVSQUxfSU5RVUlSWV9BQ1RJVkUpIHsKLSAgICAgIGlmIChwX2lucS0+cF9pbnFfY21wbF9jYikgewotICAgICAgICBudW1fcmVzcG9uc2VzID0gMDsKLSAgICAgICAgKCpwX2lucS0+cF9pbnFfY21wbF9jYikoJm51bV9yZXNwb25zZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIENhbmNlbCBhIHJlbW90ZSBuYW1lIHJlcXVlc3QgaWYgYWN0aXZlLCBhbmQgbm90aWZ5IHRoZSBjYWxsZXIgKGlmIHdhaXRpbmcpCi0gICAqLwotICBpZiAocF9pbnEtPnJlbW5hbWVfYWN0aXZlKSB7Ci0gICAgYWxhcm1fY2FuY2VsKHBfaW5xLT5yZW1vdGVfbmFtZV90aW1lcik7Ci0gICAgcF9pbnEtPnJlbW5hbWVfYWN0aXZlID0gZmFsc2U7Ci0gICAgcF9pbnEtPnJlbW5hbWVfYmRhID0gUmF3QWRkcmVzczo6a0VtcHR5OwotCi0gICAgaWYgKHBfaW5xLT5wX3JlbW5hbWVfY21wbF9jYikgewotICAgICAgcmVtX25hbWUuc3RhdHVzID0gQlRNX0RFVl9SRVNFVDsKLQotICAgICAgKCpwX2lucS0+cF9yZW1uYW1lX2NtcGxfY2IpKCZyZW1fbmFtZSk7Ci0gICAgICBwX2lucS0+cF9yZW1uYW1lX2NtcGxfY2IgPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIHBfaW5xLT5zdGF0ZSA9IEJUTV9JTlFfSU5BQ1RJVkVfU1RBVEU7Ci0gIHBfaW5xLT5wX2lucV9yZXN1bHRzX2NiID0gTlVMTDsKLSAgYnRtX2Nscl9pbnFfZGIoTlVMTCk7IC8qIENsZWFyIG91dCBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGRhdGFiYXNlICovCi0gIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQoKTsKLQotICBwX2lucS0+ZGlzY292ZXJhYmxlX21vZGUgPSBCVE1fTk9OX0RJU0NPVkVSQUJMRTsKLSAgcF9pbnEtPmNvbm5lY3RhYmxlX21vZGUgPSBCVE1fTk9OX0NPTk5FQ1RBQkxFOwotICBwX2lucS0+cGFnZV9zY2FuX3R5cGUgPSBCVE1fU0NBTl9UWVBFX1NUQU5EQVJEOwotICBwX2lucS0+aW5xX3NjYW5fdHlwZSA9IEJUTV9TQ0FOX1RZUEVfU1RBTkRBUkQ7Ci0KLSAgcF9pbnEtPmRpc2NvdmVyYWJsZV9tb2RlIHw9IEJUTV9CTEVfTk9OX0RJU0NPVkVSQUJMRTsKLSAgcF9pbnEtPmNvbm5lY3RhYmxlX21vZGUgfD0gQlRNX0JMRV9OT05fQ09OTkVDVEFCTEU7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9pbnFfZGJfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgc3RhcnR1cCB0byBpbml0aWFsaXplIHRoZSBpbnF1aXJ5Ci0gKiAgICAgICAgICAgICAgICAgIGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9pbnFfZGJfaW5pdCh2b2lkKSB7Ci0gIGFsYXJtX2ZyZWUoYnRtX2NiLmJ0bV9pbnFfdmFycy5yZW1vdGVfbmFtZV90aW1lcik7Ci0gIGJ0bV9jYi5idG1faW5xX3ZhcnMucmVtb3RlX25hbWVfdGltZXIgPQotICAgICAgYWxhcm1fbmV3KCJidG1faW5xLnJlbW90ZV9uYW1lX3RpbWVyIik7Ci0gIGJ0bV9jYi5idG1faW5xX3ZhcnMubm9faW5jX3NzcCA9IEJUTV9OT19TU1BfT05fSU5RVUlSWTsKLX0KLQotdm9pZCBidG1faW5xX2RiX2ZyZWUodm9pZCkgewotICBhbGFybV9mcmVlKGJ0bV9jYi5idG1faW5xX3ZhcnMucmVtb3RlX25hbWVfdGltZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2lucV9zdG9wX29uX3NzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaW5jb21pbmcgU1NQCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2lucV9zdG9wX29uX3NzcCh2b2lkKSB7Ci0gIHVpbnQ4X3Qgbm9ybWFsX2FjdGl2ZSA9IChCVE1fR0VORVJBTF9JTlFVSVJZX0FDVElWRSk7Ci0KLSNpZiAoQlRNX0lOUV9ERUJVRyA9PSBUUlVFKQotICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAiYnRtX2lucV9zdG9wX29uX3NzcDogbm9faW5jX3NzcD0lZCBpbnFfYWN0aXZlOjB4JXggc3RhdGU6JWQgIiwKLSAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMubm9faW5jX3NzcCwgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlLAotICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5zdGF0ZSk7Ci0jZW5kaWYKLSAgaWYgKGJ0bV9jYi5idG1faW5xX3ZhcnMubm9faW5jX3NzcCkgewotICAgIGlmIChidG1fY2IuYnRtX2lucV92YXJzLnN0YXRlID09IEJUTV9JTlFfQUNUSVZFX1NUQVRFKSB7Ci0gICAgICBpZiAoYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlICYgbm9ybWFsX2FjdGl2ZSkgewotICAgICAgICAvKiBjYW4gbm90IGNhbGwgQlRNX0NhbmNlbElucXVpcnkoKSBoZXJlLiBXZSBuZWVkIHRvIHJlcG9ydCBpbnF1aXJ5Ci0gICAgICAgICAqIGNvbXBsZXRlIGV2dCAqLwotICAgICAgICBibHVldG9vdGg6OmxlZ2FjeTo6aGNpOjpHZXRJbnRlcmZhY2UoKS5JbnF1aXJ5Q2FuY2VsKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIGRvIG5vdCBhbGxvdyBpbnF1aXJ5IHRvIHN0YXJ0ICovCi0gICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlIHw9IEJUTV9TU1BfSU5RVUlSWV9BQ1RJVkU7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9pbnFfY2xlYXJfc3NwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHBhaXJpbmdfc3RhdGUgYmVjb21lcyBpZGxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2lucV9jbGVhcl9zc3Aodm9pZCkgewotICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9hY3RpdmUgJj0gfkJUTV9TU1BfSU5RVUlSWV9BQ1RJVkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fY2xyX2lucV9kYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2xlYXIgb3V0IGEgZGV2aWNlIG9yIGFsbCBkZXZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGlucXVpcnkgZGF0YWJhc2UuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBwX2JkYSAtIChpbnB1dCkgQkRfQUREUiAtPiAgQWRkcmVzcyBvZiBkZXZpY2UgdG8gY2xlYXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVUxMIGNsZWFycyBhbGwgZW50cmllcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fY2xyX2lucV9kYihjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSkgewotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotICB0SU5RX0RCX0VOVCogcF9lbnQgPSBwX2lucS0+aW5xX2RiOwotICB1aW50MTZfdCB4eDsKLQotI2lmIChCVE1fSU5RX0RFQlVHID09IFRSVUUpCi0gIEJUTV9UUkFDRV9ERUJVRygiYnRtX2Nscl9pbnFfZGI6IGlucV9hY3RpdmU6MHgleCBzdGF0ZTolZCIsCi0gICAgICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLmlucV9hY3RpdmUsIGJ0bV9jYi5idG1faW5xX3ZhcnMuc3RhdGUpOwotI2VuZGlmCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUTV9JTlFfREJfU0laRTsgeHgrKywgcF9lbnQrKykgewotICAgIGlmIChwX2VudC0+aW5fdXNlKSB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBzcGVjaWZpZWQgQkRfQUREUiBvciBjbGVhcmluZyBhbGwgZGV2aWNlcyAqLwotICAgICAgaWYgKHBfYmRhID09IE5VTEwgfHwgKHBfZW50LT5pbnFfaW5mby5yZXN1bHRzLnJlbW90ZV9iZF9hZGRyID09ICpwX2JkYSkpIHsKLSAgICAgICAgcF9lbnQtPmluX3VzZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotI2lmIChCVE1fSU5RX0RFQlVHID09IFRSVUUpCi0gIEJUTV9UUkFDRV9ERUJVRygiaW5xX2FjdGl2ZToweCV4IHN0YXRlOiVkIiwgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlLAotICAgICAgICAgICAgICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5zdGF0ZSk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgYmRhZGRyIGRhdGFiYXNlIGZvciBhIG1hdGNoCi0gKiAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIEJsdWV0b290aCBEZXZpY2UgQWRkcmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBmb3VuZCwgZWxzZSBmYWxzZSAobmV3IGVudHJ5KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQodm9pZCkgewotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotCi0gIG9zaV9mcmVlX2FuZF9yZXNldCgodm9pZCoqKSZwX2lucS0+cF9iZF9kYik7Ci0gIHBfaW5xLT5udW1fYmRfZW50cmllcyA9IDA7Ci0gIHBfaW5xLT5tYXhfYmRfZW50cmllcyA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1faW5xX2ZpbmRfYmRhZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIHRocm91Z2ggdGhlIGJkYWRkciBkYXRhYmFzZSBmb3IgYSBtYXRjaAotICogICAgICAgICAgICAgICAgICBiYXNlZCBvbiBCbHVldG9vdGggRGV2aWNlIEFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZm91bmQsIGVsc2UgZmFsc2UgKG5ldyBlbnRyeSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1faW5xX2ZpbmRfYmRhZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKSB7Ci0gIHRCVE1fSU5RVUlSWV9WQVJfU1QqIHBfaW5xID0gJmJ0bV9jYi5idG1faW5xX3ZhcnM7Ci0gIHRJTlFfQkRBRERSKiBwX2RiID0gJnBfaW5xLT5wX2JkX2RiWzBdOwotICB1aW50MTZfdCB4eDsKLQotICAvKiBEb24ndCBib3RoZXIgc2VhcmNoaW5nLCBkYXRhYmFzZSBkb2Vzbid0IGV4aXN0IG9yIHBlcmlvZGljIG1vZGUgKi8KLSAgaWYgKCFwX2RiKSByZXR1cm4gKGZhbHNlKTsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBwX2lucS0+bnVtX2JkX2VudHJpZXM7IHh4KyssIHBfZGIrKykgewotICAgIGlmIChwX2RiLT5iZF9hZGRyID09IHBfYmRhICYmIHBfZGItPmlucV9jb3VudCA9PSBwX2lucS0+aW5xX2NvdW50ZXIpCi0gICAgICByZXR1cm4gKHRydWUpOwotICB9Ci0KLSAgaWYgKHh4IDwgcF9pbnEtPm1heF9iZF9lbnRyaWVzKSB7Ci0gICAgcF9kYi0+aW5xX2NvdW50ID0gcF9pbnEtPmlucV9jb3VudGVyOwotICAgIHBfZGItPmJkX2FkZHIgPSBwX2JkYTsKLSAgICBwX2lucS0+bnVtX2JkX2VudHJpZXMrKzsKLSAgfQotCi0gIC8qIElmIGhlcmUsIE5ldyBFbnRyeSAqLwotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9pbnFfZGJfZmluZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBsb29rcyB0aHJvdWdoIHRoZSBpbnF1aXJ5IGRhdGFiYXNlIGZvciBhIG1hdGNoCi0gKiAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIEJsdWV0b290aCBEZXZpY2UgQWRkcmVzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBlbnRyeSwgb3IgTlVMTCBpZiBub3QgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdElOUV9EQl9FTlQqIGJ0bV9pbnFfZGJfZmluZChjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSkgewotICB1aW50MTZfdCB4eDsKLSAgdElOUV9EQl9FTlQqIHBfZW50ID0gYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfZGI7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRNX0lOUV9EQl9TSVpFOyB4eCsrLCBwX2VudCsrKSB7Ci0gICAgaWYgKHBfZW50LT5pbl91c2UgJiYgcF9lbnQtPmlucV9pbmZvLnJlc3VsdHMucmVtb3RlX2JkX2FkZHIgPT0gcF9iZGEpCi0gICAgICByZXR1cm4gKHBfZW50KTsKLSAgfQotCi0gIC8qIElmIGhlcmUsIG5vdCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2lucV9kYl9uZXcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgdGhyb3VnaCB0aGUgaW5xdWlyeSBkYXRhYmFzZSBmb3IgYW4KLSAqICAgICAgICAgICAgICAgICAgdW51c2VkIGVudHJ5LiBJZiBubyBlbnRyeSBpcyBmcmVlLCBpdCBhbGxvY2F0ZXMgdGhlIG9sZGVzdAotICogICAgICAgICAgICAgICAgICBlbnRyeS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gZW50cnkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdElOUV9EQl9FTlQqIGJ0bV9pbnFfZGJfbmV3KGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKSB7Ci0gIHVpbnQxNl90IHh4OwotICB0SU5RX0RCX0VOVCogcF9lbnQgPSBidG1fY2IuYnRtX2lucV92YXJzLmlucV9kYjsKLSAgdElOUV9EQl9FTlQqIHBfb2xkID0gYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfZGI7Ci0gIHVpbnQ2NF90IG90ID0gVUlOVDY0X01BWDsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBCVE1fSU5RX0RCX1NJWkU7IHh4KyssIHBfZW50KyspIHsKLSAgICBpZiAoIXBfZW50LT5pbl91c2UpIHsKLSAgICAgIG1lbXNldChwX2VudCwgMCwgc2l6ZW9mKHRJTlFfREJfRU5UKSk7Ci0gICAgICBwX2VudC0+aW5xX2luZm8ucmVzdWx0cy5yZW1vdGVfYmRfYWRkciA9IHBfYmRhOwotICAgICAgcF9lbnQtPmluX3VzZSA9IHRydWU7Ci0KLSAgICAgIHJldHVybiAocF9lbnQpOwotICAgIH0KLQotICAgIGlmIChwX2VudC0+dGltZV9vZl9yZXNwIDwgb3QpIHsKLSAgICAgIHBfb2xkID0gcF9lbnQ7Ci0gICAgICBvdCA9IHBfZW50LT50aW1lX29mX3Jlc3A7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm8gZnJlZSBlbnRyeSBmb3VuZC4gUmV0dXJuIHRoZSBvbGRlc3QuICovCi0KLSAgbWVtc2V0KHBfb2xkLCAwLCBzaXplb2YodElOUV9EQl9FTlQpKTsKLSAgcF9vbGQtPmlucV9pbmZvLnJlc3VsdHMucmVtb3RlX2JkX2FkZHIgPSBwX2JkYTsKLSAgcF9vbGQtPmluX3VzZSA9IHRydWU7Ci0KLSAgcmV0dXJuIChwX29sZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcHJvY2Vzc19pbnFfcmVzdWx0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBpbnF1aXJ5IHJlc3VsdHMgYXJlIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRldmljZS4gSXQgdXBkYXRlcyB0aGUgaW5xdWlyeSBkYXRhYmFzZS4gSWYgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGlucXVpcnkgZGF0YWJhc2UgaXMgZnVsbCwgdGhlIG9sZGVzdCBlbnRyeSBpcyBkaXNjYXJkZWQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBpbnFfcmVzX21vZGUgLSBCVE1fSU5RX1JFU1VMVF9TVEFOREFSRAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fSU5RX1JFU1VMVF9XSVRIX1JTU0kKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0lOUV9SRVNVTFRfRVhURU5ERUQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcHJvY2Vzc19pbnFfcmVzdWx0cyh1aW50OF90KiBwLCB1aW50OF90IGhjaV9ldnRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlucV9yZXNfbW9kZSkgewotICB1aW50OF90IG51bV9yZXNwLCB4eDsKLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIHRJTlFfREJfRU5UKiBwX2k7Ci0gIHRCVE1fSU5RX1JFU1VMVFMqIHBfY3VyID0gTlVMTDsKLSAgYm9vbCBpc19uZXcgPSB0cnVlOwotICBib29sIHVwZGF0ZSA9IGZhbHNlOwotICBpbnQ4X3QgaV9yc3NpOwotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX2lucV9yZXN1bHRzX2NiID0gcF9pbnEtPnBfaW5xX3Jlc3VsdHNfY2I7Ci0gIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlID0gMDsKLSAgdWludDhfdCBwYWdlX3NjYW5fcGVyX21vZGUgPSAwOwotICB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlID0gMDsKLSAgdWludDhfdCByc3NpID0gMDsKLSAgREVWX0NMQVNTIGRjOwotICB1aW50MTZfdCBjbG9ja19vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZWlyX2RhdGEgPSBOVUxMOwotCi0jaWYgKEJUTV9JTlFfREVCVUcgPT0gVFJVRSkKLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fcHJvY2Vzc19pbnFfcmVzdWx0cyBpbnFfYWN0aXZlOjB4JXggc3RhdGU6JWQiLAotICAgICAgICAgICAgICAgICAgYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfYWN0aXZlLCBidG1fY2IuYnRtX2lucV92YXJzLnN0YXRlKTsKLSNlbmRpZgotICAvKiBPbmx5IHByb2Nlc3MgdGhlIHJlc3VsdHMgaWYgdGhlIEJSIGlucXVpcnkgaXMgc3RpbGwgYWN0aXZlICovCi0gIGlmICghKHBfaW5xLT5pbnFfYWN0aXZlICYgQlRNX0JSX0lOUV9BQ1RJVkVfTUFTSykpIHJldHVybjsKLQotICBTVFJFQU1fVE9fVUlOVDgobnVtX3Jlc3AsIHApOwotCi0gIGlmIChpbnFfcmVzX21vZGUgPT0gQlRNX0lOUV9SRVNVTFRfRVhURU5ERUQpIHsKLSAgICBpZiAobnVtX3Jlc3AgPiAxKSB7Ci0gICAgICBCVE1fVFJBQ0VfRVJST1IoImJ0bV9wcm9jZXNzX2lucV9yZXN1bHRzKCkgZXh0ZW5kZWQgcmVzdWx0cyAoJWQpID4gMSIsCi0gICAgICAgICAgICAgICAgICAgICAgbnVtX3Jlc3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0ZXhwciB1aW50MTZfdCBleHRlbmRlZF9pbnF1aXJ5X3Jlc3VsdF9zaXplID0gMjU0OwotICAgIGlmIChoY2lfZXZ0X2xlbiAtIDEgIT0gZXh0ZW5kZWRfaW5xdWlyeV9yZXN1bHRfc2l6ZSkgewotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNDE2MjAyNzEiKTsKLSAgICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IGNhbid0IGZpdCAlZCByZXN1bHRzIGluICVkIGJ5dGVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgbnVtX3Jlc3AsIGhjaV9ldnRfbGVuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoaW5xX3Jlc19tb2RlID09IEJUTV9JTlFfUkVTVUxUX1NUQU5EQVJEIHx8Ci0gICAgICAgICAgICAgaW5xX3Jlc19tb2RlID09IEJUTV9JTlFfUkVTVUxUX1dJVEhfUlNTSSkgewotICAgIGNvbnN0ZXhwciB1aW50MTZfdCBpbnF1aXJ5X3Jlc3VsdF9zaXplID0gMTQ7Ci0gICAgaWYgKGhjaV9ldnRfbGVuIDwgbnVtX3Jlc3AgKiBpbnF1aXJ5X3Jlc3VsdF9zaXplKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE0MTYyMDI3MSIpOwotICAgICAgQlRNX1RSQUNFX0VSUk9SKCIlczogY2FuJ3QgZml0ICVkIHJlc3VsdHMgaW4gJWQgYnl0ZXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICBudW1fcmVzcCwgaGNpX2V2dF9sZW4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIGZvciAoeHggPSAwOyB4eCA8IG51bV9yZXNwOyB4eCsrKSB7Ci0gICAgdXBkYXRlID0gZmFsc2U7Ci0gICAgLyogRXh0cmFjdCBpbnF1aXJ5IHJlc3VsdHMgKi8KLSAgICBTVFJFQU1fVE9fQkRBRERSKGJkYSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHBhZ2Vfc2Nhbl9yZXBfbW9kZSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHBhZ2Vfc2Nhbl9wZXJfbW9kZSwgcCk7Ci0KLSAgICBpZiAoaW5xX3Jlc19tb2RlID09IEJUTV9JTlFfUkVTVUxUX1NUQU5EQVJEKSB7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgocGFnZV9zY2FuX21vZGUsIHApOwotICAgIH0KLQotICAgIFNUUkVBTV9UT19ERVZDTEFTUyhkYywgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihjbG9ja19vZmZzZXQsIHApOwotICAgIGlmIChpbnFfcmVzX21vZGUgIT0gQlRNX0lOUV9SRVNVTFRfU1RBTkRBUkQpIHsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChyc3NpLCBwKTsKLSAgICB9Ci0KLSAgICBwX2kgPSBidG1faW5xX2RiX2ZpbmQoYmRhKTsKLQotICAgIC8qIENoZWNrIGlmIHRoaXMgYWRkcmVzcyBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBmb3IgdGhpcyBpbnF1aXJ5ICovCi0gICAgaWYgKGJ0bV9pbnFfZmluZF9iZGFkZHIoYmRhKSkgewotICAgICAgLyogQlRNX1RSQUNFX0RFQlVHKCJCREEgc2VlbiBiZWZvcmUgJXMiLCBiZGEuVG9TdHJpbmcoKS5jX3N0cigpKTsgKi8KLQotICAgICAgLyogQnkgZGVmYXVsdCBzdXBwb3NlIG5vIHVwZGF0ZSBuZWVkZWQgKi8KLSAgICAgIGlfcnNzaSA9IChpbnQ4X3QpcnNzaTsKLQotICAgICAgLyogSWYgdGhpcyBuZXcgUlNTSSBpcyBoaWdoZXIgdGhhbiB0aGUgbGFzdCBvbmUgKi8KLSAgICAgIGlmICgocnNzaSAhPSAwKSAmJiBwX2kgJiYKLSAgICAgICAgICAoaV9yc3NpID4gcF9pLT5pbnFfaW5mby5yZXN1bHRzLnJzc2kgfHwKLSAgICAgICAgICAgcF9pLT5pbnFfaW5mby5yZXN1bHRzLnJzc2kgPT0gMAotICAgICAgICAgICAvKiBCUi9FRFIgaW5xdWlyeSBpbmZvcm1hdGlvbiB1cGRhdGUgKi8KLSAgICAgICAgICAgfHwKLSAgICAgICAgICAgKHBfaS0+aW5xX2luZm8ucmVzdWx0cy5kZXZpY2VfdHlwZSAmIEJUX0RFVklDRV9UWVBFX0JSRURSKSAhPSAwKSkgewotICAgICAgICBwX2N1ciA9ICZwX2ktPmlucV9pbmZvLnJlc3VsdHM7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygidXBkYXRlIFJTU0kgbmV3OiVkLCBvbGQ6JWQiLCBpX3Jzc2ksIHBfY3VyLT5yc3NpKTsKLSAgICAgICAgcF9jdXItPnJzc2kgPSBpX3Jzc2k7Ci0gICAgICAgIHVwZGF0ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICAvKiBJZiB3ZSByZWNlaXZlZCBhIHNlY29uZCBFeHRlbmRlZCBJbnEgRXZlbnQgZm9yIGFuIGFscmVhZHkgKi8KLSAgICAgIC8qIGRpc2NvdmVyZWQgZGV2aWNlLCB0aGlzIGlzIGJlY2F1c2UgZm9yIHRoZSBmaXJzdCBvbmUgRUlSIHdhcyBub3QKLSAgICAgICAgIHJlY2VpdmVkICovCi0gICAgICBlbHNlIGlmICgoaW5xX3Jlc19tb2RlID09IEJUTV9JTlFfUkVTVUxUX0VYVEVOREVEKSAmJiAocF9pKSkgewotICAgICAgICBwX2N1ciA9ICZwX2ktPmlucV9pbmZvLnJlc3VsdHM7Ci0gICAgICAgIHVwZGF0ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICAvKiBJZiBubyB1cGRhdGUgbmVlZGVkIGNvbnRpbnVlIHdpdGggbmV4dCByZXNwb25zZSAoaWYgYW55KSAqLwotICAgICAgZWxzZQotICAgICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBJZiBleGlzdGluZyBlbnRyeSwgdXNlIHRoYXQsIGVsc2UgZ2V0IGEgbmV3IG9uZSAocG9zc2libHkgcmV1c2luZyB0aGUKLSAgICAgKiBvbGRlc3QpICovCi0gICAgaWYgKHBfaSA9PSBOVUxMKSB7Ci0gICAgICBwX2kgPSBidG1faW5xX2RiX25ldyhiZGEpOwotICAgICAgaXNfbmV3ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiBJZiBhbiBlbnRyeSBmb3IgdGhlIGRldmljZSBhbHJlYWR5IGV4aXN0cywgb3ZlcndyaXRlIGl0IE9OTFkgaWYgaXQgaXMKLSAgICAgICBmcm9tCi0gICAgICAgYSBwcmV2aW91cyBpbnF1aXJ5LiAoSWdub3JlIGl0IGlmIGl0IGlzIGEgZHVwbGljYXRlIHJlc3BvbnNlIGZyb20gdGhlCi0gICAgICAgc2FtZQotICAgICAgIGlucXVpcnkuCi0gICAgKi8KLSAgICBlbHNlIGlmIChwX2ktPmlucV9jb3VudCA9PSBwX2lucS0+aW5xX2NvdW50ZXIgJiYKLSAgICAgICAgICAgICAocF9pLT5pbnFfaW5mby5yZXN1bHRzLmRldmljZV90eXBlID09IEJUX0RFVklDRV9UWVBFX0JSRURSKSkKLSAgICAgIGlzX25ldyA9IGZhbHNlOwotCi0gICAgLyoga2VlcCB1cGRhdGluZyBSU1NJIHRvIGhhdmUgbGF0ZXN0IHZhbHVlICovCi0gICAgaWYgKGlucV9yZXNfbW9kZSAhPSBCVE1fSU5RX1JFU1VMVF9TVEFOREFSRCkKLSAgICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5yc3NpID0gKGludDhfdClyc3NpOwotICAgIGVsc2UKLSAgICAgIHBfaS0+aW5xX2luZm8ucmVzdWx0cy5yc3NpID0gQlRNX0lOUV9SRVNfSUdOT1JFX1JTU0k7Ci0KLSAgICBpZiAoaXNfbmV3KSB7Ci0gICAgICAvKiBTYXZlIHRoZSBpbmZvICovCi0gICAgICBwX2N1ciA9ICZwX2ktPmlucV9pbmZvLnJlc3VsdHM7Ci0gICAgICBwX2N1ci0+cGFnZV9zY2FuX3JlcF9tb2RlID0gcGFnZV9zY2FuX3JlcF9tb2RlOwotICAgICAgcF9jdXItPnBhZ2Vfc2Nhbl9wZXJfbW9kZSA9IHBhZ2Vfc2Nhbl9wZXJfbW9kZTsKLSAgICAgIHBfY3VyLT5wYWdlX3NjYW5fbW9kZSA9IHBhZ2Vfc2Nhbl9tb2RlOwotICAgICAgcF9jdXItPmRldl9jbGFzc1swXSA9IGRjWzBdOwotICAgICAgcF9jdXItPmRldl9jbGFzc1sxXSA9IGRjWzFdOwotICAgICAgcF9jdXItPmRldl9jbGFzc1syXSA9IGRjWzJdOwotICAgICAgcF9jdXItPmNsb2NrX29mZnNldCA9IGNsb2NrX29mZnNldCB8IEJUTV9DTE9DS19PRkZTRVRfVkFMSUQ7Ci0KLSAgICAgIHBfaS0+dGltZV9vZl9yZXNwID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCk7Ci0KLSAgICAgIGlmIChwX2ktPmlucV9jb3VudCAhPSBwX2lucS0+aW5xX2NvdW50ZXIpCi0gICAgICAgIHBfaW5xLT5pbnFfY21wbF9pbmZvLm51bV9yZXNwKys7IC8qIEEgbmV3IHJlc3BvbnNlIHdhcyBmb3VuZCAqLwotCi0gICAgICBwX2N1ci0+aW5xX3Jlc3VsdF90eXBlIHw9IEJUTV9JTlFfUkVTVUxUX0JSOwotICAgICAgaWYgKHBfaS0+aW5xX2NvdW50ICE9IHBfaW5xLT5pbnFfY291bnRlcikgewotICAgICAgICBwX2N1ci0+ZGV2aWNlX3R5cGUgPSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgICAgICAgcF9pLT5zY2FuX3JzcCA9IGZhbHNlOwotICAgICAgfSBlbHNlCi0gICAgICAgIHBfY3VyLT5kZXZpY2VfdHlwZSB8PSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgICAgIHBfaS0+aW5xX2NvdW50ID0gcF9pbnEtPmlucV9jb3VudGVyOyAvKiBNYXJrIGVudHJ5IGZvciBjdXJyZW50IGlucXVpcnkgKi8KLQotICAgICAgLyogSW5pdGlhbGl6ZSBmbGFnIHRvIGZhbHNlLiBUaGlzIGZsYWcgaXMgc2V0L3VzZWQgYnkgYXBwbGljYXRpb24gKi8KLSAgICAgIHBfaS0+aW5xX2luZm8uYXBwbF9rbm93c19yZW1fbmFtZSA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChpc19uZXcgfHwgdXBkYXRlKSB7Ci0gICAgICBpZiAoaW5xX3Jlc19tb2RlID09IEJUTV9JTlFfUkVTVUxUX0VYVEVOREVEKSB7Ci0gICAgICAgIG1lbXNldChwX2N1ci0+ZWlyX3V1aWQsIDAsCi0gICAgICAgICAgICAgICBCVE1fRUlSX1NFUlZJQ0VfQVJSQVlfU0laRSAqIChCVE1fRUlSX0FSUkFZX0JJVFMgLyA4KSk7Ci0gICAgICAgIC8qIHNldCBiaXQgbWFwIG9mIFVVSUQgbGlzdCBmcm9tIHJlY2VpdmVkIEVJUiAqLwotICAgICAgICBidG1fc2V0X2Vpcl91dWlkKHAsIHBfY3VyKTsKLSAgICAgICAgcF9laXJfZGF0YSA9IHA7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgcF9laXJfZGF0YSA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIGEgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgY2FsbCBpdCB3aXRoIHRoZSByZXN1bHRzICovCi0gICAgICBpZiAocF9pbnFfcmVzdWx0c19jYikgewotICAgICAgICAocF9pbnFfcmVzdWx0c19jYikoKHRCVE1fSU5RX1JFU1VMVFMqKXBfY3VyLCBwX2Vpcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VYVF9JTlFfUkVTUE9OU0VfTEVOKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygiTm8gY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NvcnRfaW5xX3Jlc3VsdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBpbnF1aXJ5IGNvbXBsZXRlIGlzIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRldmljZSB0byBzb3J0IGlucXVpcnkgcmVzdWx0cyBiYXNlZCBvbiByc3NpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zb3J0X2lucV9yZXN1bHQodm9pZCkgewotICB1aW50OF90IHh4LCB5eSwgbnVtX3Jlc3A7Ci0gIHRJTlFfREJfRU5UKiBwX2VudCA9IGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2RiOwotICB0SU5RX0RCX0VOVCogcF9uZXh0ID0gYnRtX2NiLmJ0bV9pbnFfdmFycy5pbnFfZGIgKyAxOwotICBpbnQgc2l6ZTsKLSAgdElOUV9EQl9FTlQqIHBfdG1wID0gKHRJTlFfREJfRU5UKilvc2lfbWFsbG9jKHNpemVvZih0SU5RX0RCX0VOVCkpOwotCi0gIG51bV9yZXNwID0gKGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2NtcGxfaW5mby5udW1fcmVzcCA8IEJUTV9JTlFfREJfU0laRSkKLSAgICAgICAgICAgICAgICAgPyBidG1fY2IuYnRtX2lucV92YXJzLmlucV9jbXBsX2luZm8ubnVtX3Jlc3AKLSAgICAgICAgICAgICAgICAgOiBCVE1fSU5RX0RCX1NJWkU7Ci0KLSAgc2l6ZSA9IHNpemVvZih0SU5RX0RCX0VOVCk7Ci0gIGZvciAoeHggPSAwOyB4eCA8IG51bV9yZXNwIC0gMTsgeHgrKywgcF9lbnQrKykgewotICAgIGZvciAoeXkgPSB4eCArIDEsIHBfbmV4dCA9IHBfZW50ICsgMTsgeXkgPCBudW1fcmVzcDsgeXkrKywgcF9uZXh0KyspIHsKLSAgICAgIGlmIChwX2VudC0+aW5xX2luZm8ucmVzdWx0cy5yc3NpIDwgcF9uZXh0LT5pbnFfaW5mby5yZXN1bHRzLnJzc2kpIHsKLSAgICAgICAgbWVtY3B5KHBfdG1wLCBwX25leHQsIHNpemUpOwotICAgICAgICBtZW1jcHkocF9uZXh0LCBwX2VudCwgc2l6ZSk7Ci0gICAgICAgIG1lbWNweShwX2VudCwgcF90bXAsIHNpemUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIG9zaV9mcmVlKHBfdG1wKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9wcm9jZXNzX2lucV9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBpbnF1aXJ5IGNvbXBsZXRlIGlzIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRldmljZS4gIENhbGwgdGhlIGNhbGxiYWNrIGlmIG5vdCBpbiBwZXJpb2RpYwotICogICAgICAgICAgICAgICAgICBpbnF1aXJ5IG1vZGUgQU5EIGl0IGlzIG5vdCBOVUxMCi0gKiAgICAgICAgICAgICAgICAgIChUaGUgY2FsbGVyIHdhbnRzIHRoZSBldmVudCkuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGUgY2FsbGJhY2sgcGFzcyBiYWNrIHRoZSBzdGF0dXMgYW5kIHRoZSBudW1iZXIgb2YKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3Byb2Nlc3NfaW5xX2NvbXBsZXRlKHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IG1vZGUpIHsKLSAgdEJUTV9DTVBMX0NCKiBwX2lucV9jYiA9IGJ0bV9jYi5idG1faW5xX3ZhcnMucF9pbnFfY21wbF9jYjsKLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLQotICBwX2lucS0+aW5xcGFybXMubW9kZSAmPSB+KG1vZGUpOwotCi0jaWYgKEJUTV9JTlFfREVCVUcgPT0gVFJVRSkKLSAgQlRNX1RSQUNFX0RFQlVHKCJidG1fcHJvY2Vzc19pbnFfY29tcGxldGUgaW5xX2FjdGl2ZToweCV4IHN0YXRlOiVkIiwKLSAgICAgICAgICAgICAgICAgIGJ0bV9jYi5idG1faW5xX3ZhcnMuaW5xX2FjdGl2ZSwgYnRtX2NiLmJ0bV9pbnFfdmFycy5zdGF0ZSk7Ci0jZW5kaWYKLSAgYnRtX2FjbF91cGRhdGVfaW5xdWlyeV9zdGF0dXMoQlRNX0lOUVVJUllfQ09NUExFVEUpOwotICAvKiBJZ25vcmUgYW55IHN0cmF5IG9yIGxhdGUgY29tcGxldGUgbWVzc2FnZXMgaWYgdGhlIGlucXVpcnkgaXMgbm90IGFjdGl2ZSAqLwotICBpZiAocF9pbnEtPmlucV9hY3RpdmUpIHsKLSAgICBwX2lucS0+aW5xX2NtcGxfaW5mby5zdGF0dXMgPSAodEJUTV9TVEFUVVMpKAotICAgICAgICAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSA/IEJUTV9TVUNDRVNTIDogQlRNX0VSUl9QUk9DRVNTSU5HKTsKLQotICAgIC8qIE5vdGlmeSBjYWxsZXIgdGhhdCB0aGUgaW5xdWlyeSBoYXMgY29tcGxldGVkOyAocGVyaW9kaWMgaW5xdWlyaWVzIGRvIG5vdAotICAgICAqIHNlbmQgY29tcGxldGlvbiBldmVudHMgKi8KLSAgICBpZiAocF9pbnEtPmlucXBhcm1zLm1vZGUgPT0gMCkgewotICAgICAgYnRtX2NsZWFyX2FsbF9wZW5kaW5nX2xlX2VudHJ5KCk7Ci0gICAgICBwX2lucS0+c3RhdGUgPSBCVE1fSU5RX0lOQUNUSVZFX1NUQVRFOwotCi0gICAgICAvKiBJbmNyZW1lbnQgc28gdGhlIHN0YXJ0IG9mIGEgbmV4dCBpbnF1aXJ5IGhhcyBhIG5ldyBjb3VudCAqLwotICAgICAgcF9pbnEtPmlucV9jb3VudGVyKys7Ci0KLSAgICAgIGJ0bV9jbHJfaW5xX3Jlc3VsdF9mbHQoKTsKLQotICAgICAgaWYgKChwX2lucS0+aW5xX2NtcGxfaW5mby5zdGF0dXMgPT0gQlRNX1NVQ0NFU1MpICYmCi0gICAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3Jzc2lfd2l0aF9pbnF1aXJ5X3Jlc3VsdHMoKSkgewotICAgICAgICBidG1fc29ydF9pbnFfcmVzdWx0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIENsZWFyIHRoZSByZXN1bHRzIGNhbGxiYWNrIGlmIHNldCAqLwotICAgICAgcF9pbnEtPnBfaW5xX3Jlc3VsdHNfY2IgPSBOVUxMOwotICAgICAgcF9pbnEtPmlucV9hY3RpdmUgPSBCVE1fSU5RVUlSWV9JTkFDVElWRTsKLSAgICAgIHBfaW5xLT5wX2lucV9jbXBsX2NiID0gTlVMTDsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBhIGNhbGxiYWNrIHJlZ2lzdGVyZWQgZm9yIGlucXVpcnkgY29tcGxldGUsIGNhbGwgaXQgKi8KLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiQlRNIElucSBDb21wbCBDYWxsYmFjazogc3RhdHVzIDB4JTAyeCwgbnVtIHJlc3VsdHMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIHBfaW5xLT5pbnFfY21wbF9pbmZvLnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICBwX2lucS0+aW5xX2NtcGxfaW5mby5udW1fcmVzcCk7Ci0KLSAgICAgIGlmIChwX2lucV9jYikgKHBfaW5xX2NiKSgodEJUTV9JTlFVSVJZX0NNUEwqKSZwX2lucS0+aW5xX2NtcGxfaW5mbyk7Ci0gICAgfQotICB9Ci0jaWYgKEJUTV9JTlFfREVCVUcgPT0gVFJVRSkKLSAgQlRNX1RSQUNFX0RFQlVHKCJpbnFfYWN0aXZlOjB4JXggc3RhdGU6JWQiLCBidG1fY2IuYnRtX2lucV92YXJzLmlucV9hY3RpdmUsCi0gICAgICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLnN0YXRlKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Byb2Nlc3NfY2FuY2VsX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGlucXVpcnkgY2FuY2VsIGNvbXBsZXRlIGlzCi0gKiAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gY2FsbCB0aGUKLSAqICAgICAgICAgICAgICAgICAgYnRtX3Byb2Nlc3NfaW5xX2NvbXBsZXRlLiBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCB0bwotICogICAgICAgICAgICAgICAgICBkaWZmZXJlbnRpYXRlIGEgY2FuY2VsX2NtcGxfZXZ0IGZyb20gdGhlIGlucV9jbXBsX2V2dC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcHJvY2Vzc19jYW5jZWxfY29tcGxldGUodWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgbW9kZSkgewotICBidG1fYWNsX3VwZGF0ZV9pbnF1aXJ5X3N0YXR1cyhCVE1fSU5RVUlSWV9DQU5DRUxMRUQpOwotICBidG1fcHJvY2Vzc19pbnFfY29tcGxldGUoc3RhdHVzLCBtb2RlKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1faW5pdGlhdGVfcmVtX25hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gbG9va3MgaW5pdGlhdGVzIGEgcmVtb3RlIG5hbWUgcmVxdWVzdC4gIEl0IGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCBlaXRoZXIgYnkgR0FQIG9yIGJ5IHRoZSBBUEkgY2FsbAotICogICAgICAgICAgICAgICAgICBCVE1fUmVhZFJlbW90ZURldmljZU5hbWUuCi0gKgotICogSW5wdXQgUGFyYW1zOiAgICBwX2NiICAgICAgICAgICAgLSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0QlRNX1JFTU9URV9ERVZfTkFNRSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMKLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlzIHJldHVybmVkIGlmIHRoZSByZXF1ZXN0IHdhcyBzZW50IHRvIEhDSS4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgYWxyZWFkeSBpbiBwcm9ncmVzcwotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIGNvdWxkIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgdG8gc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgYnRtX2luaXRpYXRlX3JlbV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQ4X3Qgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVvdXRfbXMsIHRCVE1fQ01QTF9DQiogcF9jYikgewotICB0QlRNX0lOUVVJUllfVkFSX1NUKiBwX2lucSA9ICZidG1fY2IuYnRtX2lucV92YXJzOwotCi0gIC8qKiogTWFrZSBzdXJlIHRoZSBkZXZpY2UgaXMgcmVhZHkgKioqLwotICBpZiAoIUJUTV9Jc0RldmljZVVwKCkpIHJldHVybiAoQlRNX1dST05HX01PREUpOwotICBpZiAob3JpZ2luID09IEJUTV9STVRfTkFNRV9FWFQpIHsKLSAgICBpZiAocF9pbnEtPnJlbW5hbWVfYWN0aXZlKSB7Ci0gICAgICByZXR1cm4gKEJUTV9CVVNZKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogSWYgdGhlcmUgaXMgbm8gcmVtb3RlIG5hbWUgcmVxdWVzdCBydW5uaW5nLGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgICAgKiBhbmQgc3RhcnQgdGltZXIgKi8KLSAgICAgIHBfaW5xLT5wX3JlbW5hbWVfY21wbF9jYiA9IHBfY2I7Ci0gICAgICBwX2lucS0+cmVtbmFtZV9iZGEgPSByZW1vdGVfYmRhOwotCi0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9pbnEtPnJlbW90ZV9uYW1lX3RpbWVyLCB0aW1lb3V0X21zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9pbnFfcmVtb3RlX25hbWVfdGltZXJfdGltZW91dCwgTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoZSBkYXRhYmFzZSBlbnRyeSBleGlzdHMgZm9yIHRoZSBkZXZpY2UsIHVzZSBpdHMgY2xvY2sgb2Zmc2V0ICovCi0gICAgICB0SU5RX0RCX0VOVCogcF9pID0gYnRtX2lucV9kYl9maW5kKHJlbW90ZV9iZGEpOwotICAgICAgaWYgKHBfaSAmJiAocF9pLT5pbnFfaW5mby5yZXN1bHRzLmlucV9yZXN1bHRfdHlwZSAmIEJUTV9JTlFfUkVTVUxUX0JSKSkgewotICAgICAgICB0QlRNX0lOUV9JTkZPKiBwX2N1ciA9ICZwX2ktPmlucV9pbmZvOwotICAgICAgICBidHNuZF9oY2ljX3JtdF9uYW1lX3JlcSgKLSAgICAgICAgICAgIHJlbW90ZV9iZGEsIHBfY3VyLT5yZXN1bHRzLnBhZ2Vfc2Nhbl9yZXBfbW9kZSwKLSAgICAgICAgICAgIHBfY3VyLT5yZXN1bHRzLnBhZ2Vfc2Nhbl9tb2RlLAotICAgICAgICAgICAgKHVpbnQxNl90KShwX2N1ci0+cmVzdWx0cy5jbG9ja19vZmZzZXQgfCBCVE1fQ0xPQ0tfT0ZGU0VUX1ZBTElEKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBPdGhlcndpc2UgdXNlIGRlZmF1bHRzIGFuZCBtYXJrIHRoZSBjbG9jayBvZmZzZXQgYXMgaW52YWxpZCAqLwotICAgICAgICBidHNuZF9oY2ljX3JtdF9uYW1lX3JlcShyZW1vdGVfYmRhLCBIQ0lfUEFHRV9TQ0FOX1JFUF9NT0RFX1IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfTUFOREFUQVJZX1BBR0VfU0NBTl9NT0RFLCAwKTsKLSAgICAgIH0KLQotICAgICAgcF9pbnEtPnJlbW5hbWVfYWN0aXZlID0gdHJ1ZTsKLSAgICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBCVE1fSUxMRUdBTF9WQUxVRTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Byb2Nlc3NfcmVtb3RlX25hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZW1vdGUgbmFtZSBpcyByZWNlaXZlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBkZXZpY2UuIElmIHJlbW90ZSBuYW1lcyBhcmUgY2FjaGVkLCBpdCB1cGRhdGVzIHRoZQotICogICAgICAgICAgICAgICAgICBpbnF1aXJ5IGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9wcm9jZXNzX3JlbW90ZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MqIGJkYSwgQkRfTkFNRSBiZG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4sIHVpbnQ4X3QgaGNpX3N0YXR1cykgewotICB0QlRNX1JFTU9URV9ERVZfTkFNRSByZW1fbmFtZTsKLSAgdEJUTV9JTlFVSVJZX1ZBUl9TVCogcF9pbnEgPSAmYnRtX2NiLmJ0bV9pbnFfdmFyczsKLSAgdEJUTV9DTVBMX0NCKiBwX2NiID0gcF9pbnEtPnBfcmVtbmFtZV9jbXBsX2NiOwotICB1aW50OF90KiBwX24xOwotCi0gIHVpbnQxNl90IHRlbXBfZXZ0X2xlbjsKLQotICBpZiAoYmRhKSB7Ci0gICAgVkxPRygyKSA8PCAiQkRBICIgPDwgKmJkYTsKLSAgfQotCi0gIFZMT0coMikgPDwgIklucXVpcmUgQkRBICIgPDwgcF9pbnEtPnJlbW5hbWVfYmRhOwotCi0gIC8qIElmIHRoZSBpbnF1aXJlIEJEQSBhbmQgcmVtb3RlIERCQSBhcmUgdGhlIHNhbWUsIHRoZW4gc3RvcCB0aGUgdGltZXIgYW5kIHNldAotICAgKiB0aGUgYWN0aXZlIHRvIGZhbHNlICovCi0gIGlmICgocF9pbnEtPnJlbW5hbWVfYWN0aXZlKSAmJiAoIWJkYSB8fCAoKmJkYSA9PSBwX2lucS0+cmVtbmFtZV9iZGEpKSkgewotICAgIGlmIChCVE1fVXNlTGVMaW5rKHBfaW5xLT5yZW1uYW1lX2JkYSkpIHsKLSAgICAgIGlmIChoY2lfc3RhdHVzID09IEhDSV9FUlJfVU5TUEVDSUZJRUQpCi0gICAgICAgIGJ0bV9ibGVfY2FuY2VsX3JlbW90ZV9uYW1lKHBfaW5xLT5yZW1uYW1lX2JkYSk7Ci0gICAgfQotICAgIGFsYXJtX2NhbmNlbChwX2lucS0+cmVtb3RlX25hbWVfdGltZXIpOwotICAgIHBfaW5xLT5yZW1uYW1lX2FjdGl2ZSA9IGZhbHNlOwotICAgIC8qIENsZWFuIHVwIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBpZiB0aGUgY29tbWFuZCB3YXMgbm90IHN1Y2Nlc3NmdWwgKi8KLSAgICAvKiBOb3RlOiBJZiBwYXJ0IG9mIHRoZSBpbnF1aXJ5LCB0aGUgbmFtZSBpcyBub3Qgc3RvcmVkLCBhbmQgdGhlICAgICovCi0gICAgLyogICAgICAgaW5xdWlyeSBjb21wbGV0ZSBjYWxsYmFjayBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKGhjaV9zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIC8qIENvcHkgdGhlIG5hbWUgZnJvbSB0aGUgZGF0YSBzdHJlYW0gaW50byB0aGUgcmV0dXJuIHN0cnVjdHVyZSAqLwotICAgICAgLyogTm90ZSB0aGF0IGV2ZW4gaWYgaXQgaXMgbm90IGJlaW5nIHJldHVybmVkLCBpdCBpcyB1c2VkIGFzIGEgICovCi0gICAgICAvKiAgICAgIHRlbXBvcmFyeSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHBfbjEgPSAodWludDhfdCopcmVtX25hbWUucmVtb3RlX2JkX25hbWU7Ci0gICAgICByZW1fbmFtZS5sZW5ndGggPSAoZXZ0X2xlbiA8IEJEX05BTUVfTEVOKSA/IGV2dF9sZW4gOiBCRF9OQU1FX0xFTjsKLSAgICAgIHJlbV9uYW1lLnJlbW90ZV9iZF9uYW1lW3JlbV9uYW1lLmxlbmd0aF0gPSAwOwotICAgICAgcmVtX25hbWUuc3RhdHVzID0gQlRNX1NVQ0NFU1M7Ci0gICAgICB0ZW1wX2V2dF9sZW4gPSByZW1fbmFtZS5sZW5ndGg7Ci0KLSAgICAgIHdoaWxlICh0ZW1wX2V2dF9sZW4gPiAwKSB7Ci0gICAgICAgICpwX24xKysgPSAqYmRuKys7Ci0gICAgICAgIHRlbXBfZXZ0X2xlbi0tOwotICAgICAgfQotICAgICAgcmVtX25hbWUucmVtb3RlX2JkX25hbWVbcmVtX25hbWUubGVuZ3RoXSA9IDA7Ci0gICAgfQotCi0gICAgLyogSWYgcHJvY2Vzc2luZyBhIHN0YW5kIGFsb25lIHJlbW90ZSBuYW1lIHRoZW4gcmVwb3J0IHRoZSBlcnJvciBpbiB0aGUKLSAgICAgICBjYWxsYmFjayAqLwotICAgIGVsc2UgewotICAgICAgcmVtX25hbWUuc3RhdHVzID0gQlRNX0JBRF9WQUxVRV9SRVQ7Ci0gICAgICByZW1fbmFtZS5sZW5ndGggPSAwOwotICAgICAgcmVtX25hbWUucmVtb3RlX2JkX25hbWVbMF0gPSAwOwotICAgIH0KLSAgICAvKiBSZXNldCB0aGUgcmVtb3RlIEJBRCB0byB6ZXJvIGFuZCBjYWxsIGNhbGxiYWNrIGlmIHBvc3NpYmxlICovCi0gICAgcF9pbnEtPnJlbW5hbWVfYmRhID0gUmF3QWRkcmVzczo6a0VtcHR5OwotCi0gICAgcF9pbnEtPnBfcmVtbmFtZV9jbXBsX2NiID0gTlVMTDsKLSAgICBpZiAocF9jYikgKHBfY2IpKCZyZW1fbmFtZSk7Ci0gIH0KLX0KLQotdm9pZCBidG1faW5xX3JlbW90ZV9uYW1lX3RpbWVyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBidG1faW5xX3JtdF9uYW1lX2ZhaWxlZF9jYW5jZWxsZWQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9pbnFfcm10X25hbWVfZmFpbGVkX2NhbmNlbGxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBpZiB0aW1lb3V0IGV4cGlyZXMgb3IgcmVxdWVzdCBpcyBjYW5jZWxsZWQKLSAqICAgICAgICAgICAgICAgICAgd2hpbGUgZ2V0dGluZyByZW1vdGUgbmFtZS4gIFRoaXMgaXMgZG9uZSBmb3IgZGV2aWNlcyB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIGluY29ycmVjdGx5IGRvIG5vdCByZXBvcnQgb3BlcmF0aW9uIGZhaWx1cmUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1faW5xX3JtdF9uYW1lX2ZhaWxlZF9jYW5jZWxsZWQodm9pZCkgewotICBCVE1fVFJBQ0VfRVJST1IoImJ0bV9pbnFfcm10X25hbWVfZmFpbGVkX2NhbmNlbGxlZCgpICByZW1uYW1lX2FjdGl2ZT0lZCIsCi0gICAgICAgICAgICAgICAgICBidG1fY2IuYnRtX2lucV92YXJzLnJlbW5hbWVfYWN0aXZlKTsKLQotICBpZiAoYnRtX2NiLmJ0bV9pbnFfdmFycy5yZW1uYW1lX2FjdGl2ZSkgewotICAgIGJ0bV9wcm9jZXNzX3JlbW90ZV9uYW1lKCZidG1fY2IuYnRtX2lucV92YXJzLnJlbW5hbWVfYmRhLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDSV9FUlJfVU5TUEVDSUZJRUQpOwotICB9Ci0KLSAgYnRtX3NlY19ybXRfbmFtZV9yZXF1ZXN0X2NvbXBsZXRlKE5VTEwsIE5VTEwsIEhDSV9FUlJfVU5TUEVDSUZJRUQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1dyaXRlRUlSCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB3cml0ZSBFSVIgZGF0YSB0byBjb250cm9sbGVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9idWZmIC0gYWxsb2NhdGVkIEhDSSBjb21tYW5kIGJ1ZmZlciBpbmNsdWRpbmcgZXh0ZW5kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5xdXJpcnkgcmVzcG9uc2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTICAtIGlmIHN1Y2Nlc3NmdWwKLSAqICAgICAgICAgICAgICAgICAgQlRNX01PREVfVU5TVVBQT1JURUQgLSBpZiBsb2NhbCBkZXZpY2UgY2Fubm90IHN1cHBvcnQgaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1dyaXRlRUlSKEJUX0hEUiogcF9idWZmKSB7Ci0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZSgpKSB7Ci0gICAgQlRNX1RSQUNFX0FQSSgiV3JpdGUgRXh0ZW5kZWQgSW5xdWlyeSBSZXNwb25zZSB0byBjb250cm9sbGVyIik7Ci0gICAgYnRzbmRfaGNpY193cml0ZV9leHRfaW5xdWlyeV9yZXNwb25zZShwX2J1ZmYsIEJUTV9FSVJfREVGQVVMVF9GRUNfUkVRVUlSRUQpOwotICAgIHJldHVybiBCVE1fU1VDQ0VTUzsKLSAgfSBlbHNlIHsKLSAgICBvc2lfZnJlZShwX2J1ZmYpOwotICAgIHJldHVybiBCVE1fTU9ERV9VTlNVUFBPUlRFRDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2NvbnZlcnRfdXVpZF90b19laXJfc2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgVVVJRC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHV1aWQxNiAtIFVVSUQgMTYtYml0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBCVE0gRUlSIHNlcnZpY2UgSUQgaWYgZm91bmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0VJUl9NQVhfU0VSVklDRVMgLSBpZiBub3QgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QgYnRtX2NvbnZlcnRfdXVpZF90b19laXJfc2VydmljZSh1aW50MTZfdCB1dWlkMTYpIHsKLSAgdWludDhfdCB4eDsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBCVE1fRUlSX01BWF9TRVJWSUNFUzsgeHgrKykgewotICAgIGlmICh1dWlkMTYgPT0gQlRNX0VJUl9VVUlEX0xLVVBfVEJMW3h4XSkgewotICAgICAgcmV0dXJuIHh4OwotICAgIH0KLSAgfQotICByZXR1cm4gQlRNX0VJUl9NQVhfU0VSVklDRVM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSGFzRWlyU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8ga25vdyBpZiBVVUlEIGluIGJpdCBtYXAgb2YgVVVJRC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZWlyX3V1aWQgLSBiaXQgbWFwIG9mIFVVSUQgbGlzdAotICogICAgICAgICAgICAgICAgICB1dWlkMTYgLSBVVUlEIDE2LWJpdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSAtIGlmIGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIGZhbHNlIC0gaWYgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0hhc0VpclNlcnZpY2UoY29uc3QgdWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNikgewotICB1aW50OF90IHNlcnZpY2VfaWQ7Ci0KLSAgc2VydmljZV9pZCA9IGJ0bV9jb252ZXJ0X3V1aWRfdG9fZWlyX3NlcnZpY2UodXVpZDE2KTsKLSAgaWYgKHNlcnZpY2VfaWQgPCBCVE1fRUlSX01BWF9TRVJWSUNFUykKLSAgICByZXR1cm4gKEJUTV9FSVJfSEFTX1NFUlZJQ0UocF9laXJfdXVpZCwgc2VydmljZV9pZCkpOwotICBlbHNlCi0gICAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSGFzSW5xdWlyeUVpclNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGtub3cgaWYgVVVJRCBpbiBiaXQgbWFwIG9mIFVVSUQKLSAqICAgICAgICAgICAgICAgICAgbGlzdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfcmVzdWx0cyAtIGlucXVpcnkgcmVzdWx0cwotICogICAgICAgICAgICAgICAgICB1dWlkMTYgLSBVVUlEIDE2LWJpdAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0VJUl9GT1VORCAtIGlmIGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9FSVJfTk9UX0ZPVU5EIC0gaWYgbm90IGZvdW5kIGFuZCBpdCBpcyBjb21wbGV0ZSBsaXN0Ci0gKiAgICAgICAgICAgICAgICAgIEJUTV9FSVJfVU5LTk9XTiAtIGlmIG5vdCBmb3VuZCBhbmQgaXQgaXMgbm90IGNvbXBsZXRlIGxpc3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9FSVJfU0VBUkNIX1JFU1VMVCBCVE1fSGFzSW5xdWlyeUVpclNlcnZpY2UodEJUTV9JTlFfUkVTVUxUUyogcF9yZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdXVpZDE2KSB7Ci0gIGlmIChCVE1fSGFzRWlyU2VydmljZShwX3Jlc3VsdHMtPmVpcl91dWlkLCB1dWlkMTYpKSB7Ci0gICAgcmV0dXJuIEJUTV9FSVJfRk9VTkQ7Ci0gIH0gZWxzZSBpZiAocF9yZXN1bHRzLT5laXJfY29tcGxldGVfbGlzdCkgewotICAgIHJldHVybiBCVE1fRUlSX05PVF9GT1VORDsKLSAgfSBlbHNlCi0gICAgcmV0dXJuIEJUTV9FSVJfVU5LTk9XTjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9BZGRFaXJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBzZXJ2aWNlIGluIGJpdCBtYXAgb2YgVVVJRAotICogICAgICAgICAgICAgICAgICBsaXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9laXJfdXVpZCAtIGJpdCBtYXNrIG9mIFVVSUQgbGlzdCBmb3IgRUlSCi0gKiAgICAgICAgICAgICAgICAgIHV1aWQxNiAtIFVVSUQgMTYtYml0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0FkZEVpclNlcnZpY2UodWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNikgewotICB1aW50OF90IHNlcnZpY2VfaWQ7Ci0KLSAgc2VydmljZV9pZCA9IGJ0bV9jb252ZXJ0X3V1aWRfdG9fZWlyX3NlcnZpY2UodXVpZDE2KTsKLSAgaWYgKHNlcnZpY2VfaWQgPCBCVE1fRUlSX01BWF9TRVJWSUNFUykKLSAgICBCVE1fRUlSX1NFVF9TRVJWSUNFKHBfZWlyX3V1aWQsIHNlcnZpY2VfaWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlbW92ZUVpclNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIHNlcnZpY2UgaW4gYml0IG1hcCBvZgotICogICAgICAgICAgICAgICAgICBVVUlEIGxpc3QuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2Vpcl91dWlkIC0gYml0IG1hc2sgb2YgVVVJRCBsaXN0IGZvciBFSVIKLSAqICAgICAgICAgICAgICAgICAgdXVpZDE2IC0gVVVJRCAxNi1iaXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVtb3ZlRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDE2X3QgdXVpZDE2KSB7Ci0gIHVpbnQ4X3Qgc2VydmljZV9pZDsKLQotICBzZXJ2aWNlX2lkID0gYnRtX2NvbnZlcnRfdXVpZF90b19laXJfc2VydmljZSh1dWlkMTYpOwotICBpZiAoc2VydmljZV9pZCA8IEJUTV9FSVJfTUFYX1NFUlZJQ0VTKQotICAgIEJUTV9FSVJfQ0xSX1NFUlZJQ0UocF9laXJfdXVpZCwgc2VydmljZV9pZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0RWlyU3VwcG9ydGVkU2VydmljZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBVVUlEIGxpc3QgZnJvbSBiaXQgbWFwIG9mCi0gKiAgICAgICAgICAgICAgICAgIFVVSUQgbGlzdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZWlyX3V1aWQgLSBiaXQgbWFzayBvZiBVVUlEIGxpc3QgZm9yIEVJUgotICogICAgICAgICAgICAgICAgICBwIC0gcmVmZXJlbmNlIG9mIGN1cnJlbnQgcG9pbnRlciBvZiBFSVIKLSAqICAgICAgICAgICAgICAgICAgbWF4X251bV91dWlkMTYgLSBtYXggbnVtYmVyIG9mIFVVSUQgY2FuIGJlIHdyaXR0ZW4gaW4gRUlSCi0gKiAgICAgICAgICAgICAgICAgIG51bV91dWlkMTYgLSBudW1iZXIgb2YgVVVJRCBoYXZlIGJlZW4gd3JpdHRlbiBpbiBFSVIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFLCBpZiBpdCBoYXMgbW9yZSB0aGFuIG1heAotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX0NPTVBMRVRFXzE2QklUU19VVUlEX1RZUEUsIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcyh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDhfdCoqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9udW1fdXVpZDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fdXVpZDE2KSB7Ci0gIHVpbnQ4X3Qgc2VydmljZV9pbmRleDsKLQotICAqcF9udW1fdXVpZDE2ID0gMDsKLQotICBmb3IgKHNlcnZpY2VfaW5kZXggPSAwOyBzZXJ2aWNlX2luZGV4IDwgQlRNX0VJUl9NQVhfU0VSVklDRVM7Ci0gICAgICAgc2VydmljZV9pbmRleCsrKSB7Ci0gICAgaWYgKEJUTV9FSVJfSEFTX1NFUlZJQ0UocF9laXJfdXVpZCwgc2VydmljZV9pbmRleCkpIHsKLSAgICAgIGlmICgqcF9udW1fdXVpZDE2IDwgbWF4X251bV91dWlkMTYpIHsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTSgqcCwgQlRNX0VJUl9VVUlEX0xLVVBfVEJMW3NlcnZpY2VfaW5kZXhdKTsKLSAgICAgICAgKCpwX251bV91dWlkMTYpKys7Ci0gICAgICB9Ci0gICAgICAvKiBpZiBtYXggbnVtYmVyIG9mIFVVSURzIGFyZSBzdG9yZWQgYW5kIGZvdW5kIG9uZSBtb3JlICovCi0gICAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gSENJX0VJUl9DT01QTEVURV8xNkJJVFNfVVVJRF9UWVBFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldEVpclV1aWRMaXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBFSVIgYW5kIHJldHVybnMgVVVJRCBsaXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9laXIgLSBFSVIKLSAqICAgICAgICAgICAgICAgICAgZWlyX2xlbiAtIEVJUiBsZW4KLSAqICAgICAgICAgICAgICAgICAgdXVpZF9zaXplIC0gVXVpZDo6a051bUJ5dGVzMTYsIFV1aWQ6OmtOdW1CeXRlczMyLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdWlkOjprTnVtQnl0ZXMxMjgKLSAqICAgICAgICAgICAgICAgICAgcF9udW1fdXVpZCAtIHJldHVybiBudW1iZXIgb2YgVVVJRCBpbiBmb3VuZCBsaXN0Ci0gKiAgICAgICAgICAgICAgICAgIHBfdXVpZF9saXN0IC0gcmV0dXJuIFVVSUQgbGlzdAotICogICAgICAgICAgICAgICAgICBtYXhfbnVtX3V1aWQgLSBtYXhpbXVtIG51bWJlciBvZiBVVUlEIHRvIGJlIHJldHVybmVkCi0gKgotICogUmV0dXJucyAgICAgICAgICAwIC0gaWYgbm90IGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIEhDSV9FSVJfQ09NUExFVEVfMTZCSVRTX1VVSURfVFlQRQotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX01PUkVfMTZCSVRTX1VVSURfVFlQRQotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX0NPTVBMRVRFXzMyQklUU19VVUlEX1RZUEUKLSAqICAgICAgICAgICAgICAgICAgSENJX0VJUl9NT1JFXzMyQklUU19VVUlEX1RZUEUKLSAqICAgICAgICAgICAgICAgICAgSENJX0VJUl9DT01QTEVURV8xMjhCSVRTX1VVSURfVFlQRQotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX01PUkVfMTI4QklUU19VVUlEX1RZUEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVE1fR2V0RWlyVXVpZExpc3QoY29uc3QgdWludDhfdCogcF9laXIsIHNpemVfdCBlaXJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1dWlkX3NpemUsIHVpbnQ4X3QqIHBfbnVtX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3V1aWRfbGlzdCwgdWludDhfdCBtYXhfbnVtX3V1aWQpIHsKLSAgY29uc3QgdWludDhfdCogcF91dWlkX2RhdGE7Ci0gIHVpbnQ4X3QgdHlwZTsKLSAgdWludDhfdCB5eSwgeHg7Ci0gIHVpbnQxNl90KiBwX3V1aWQxNiA9ICh1aW50MTZfdCopcF91dWlkX2xpc3Q7Ci0gIHVpbnQzMl90KiBwX3V1aWQzMiA9ICh1aW50MzJfdCopcF91dWlkX2xpc3Q7Ci0gIGNoYXIgYnVmZltVdWlkOjprTnVtQnl0ZXMxMjggKiAyICsgMV07Ci0KLSAgcF91dWlkX2RhdGEgPQotICAgICAgYnRtX2Vpcl9nZXRfdXVpZF9saXN0KHBfZWlyLCBlaXJfbGVuLCB1dWlkX3NpemUsIHBfbnVtX3V1aWQsICZ0eXBlKTsKLSAgaWYgKHBfdXVpZF9kYXRhID09IE5VTEwpIHsKLSAgICByZXR1cm4gMHgwMDsKLSAgfQotCi0gIGlmICgqcF9udW1fdXVpZCA+IG1heF9udW1fdXVpZCkgewotICAgIEJUTV9UUkFDRV9XQVJOSU5HKCIlczogbnVtYmVyIG9mIHV1aWQgaW4gRUlSID0gJWQsIHNpemUgb2YgdXVpZCBsaXN0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcF9udW1fdXVpZCwgbWF4X251bV91dWlkKTsKLSAgICAqcF9udW1fdXVpZCA9IG1heF9udW1fdXVpZDsKLSAgfQotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXM6IHR5cGUgPSAlMDJYLCBudW1iZXIgb2YgdXVpZCA9ICVkIiwgX19mdW5jX18sIHR5cGUsCi0gICAgICAgICAgICAgICAgICAqcF9udW1fdXVpZCk7Ci0KLSAgaWYgKHV1aWRfc2l6ZSA9PSBVdWlkOjprTnVtQnl0ZXMxNikgewotICAgIGZvciAoeXkgPSAwOyB5eSA8ICpwX251bV91dWlkOyB5eSsrKSB7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KCoocF91dWlkMTYgKyB5eSksIHBfdXVpZF9kYXRhKTsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiICAgICAgICAgICAgICAgICAgICAgMHglMDRYIiwgKihwX3V1aWQxNiArIHl5KSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHV1aWRfc2l6ZSA9PSBVdWlkOjprTnVtQnl0ZXMzMikgewotICAgIGZvciAoeXkgPSAwOyB5eSA8ICpwX251bV91dWlkOyB5eSsrKSB7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDMyKCoocF91dWlkMzIgKyB5eSksIHBfdXVpZF9kYXRhKTsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiICAgICAgICAgICAgICAgICAgICAgMHglMDhYIiwgKihwX3V1aWQzMiArIHl5KSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHV1aWRfc2l6ZSA9PSBVdWlkOjprTnVtQnl0ZXMxMjgpIHsKLSAgICBmb3IgKHl5ID0gMDsgeXkgPCAqcF9udW1fdXVpZDsgeXkrKykgewotICAgICAgU1RSRUFNX1RPX0FSUkFZMTYocF91dWlkX2xpc3QgKyB5eSAqIFV1aWQ6OmtOdW1CeXRlczEyOCwgcF91dWlkX2RhdGEpOwotICAgICAgZm9yICh4eCA9IDA7IHh4IDwgVXVpZDo6a051bUJ5dGVzMTI4OyB4eCsrKQotICAgICAgICBzbnByaW50ZihidWZmICsgeHggKiAyLCBzaXplb2YoYnVmZikgLSB4eCAqIDIsICIlMDJYIiwKLSAgICAgICAgICAgICAgICAgKihwX3V1aWRfbGlzdCArIHl5ICogVXVpZDo6a051bUJ5dGVzMTI4ICsgeHgpKTsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiICAgICAgICAgICAgICAgICAgICAgMHglcyIsIGJ1ZmYpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0eXBlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2Vpcl9nZXRfdXVpZF9saXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIFVVSUQgbGlzdCBpbiBFSVIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2VpciAtIGFkZHJlc3Mgb2YgRUlSCi0gKiAgICAgICAgICAgICAgICAgIGVpcl9sZW4gLSBFSVIgbGVuZ3RoCi0gKiAgICAgICAgICAgICAgICAgIHV1aWRfc2l6ZSAtIHNpemUgb2YgVVVJRCB0byBmaW5kCi0gKiAgICAgICAgICAgICAgICAgIHBfbnVtX3V1aWQgLSBudW1iZXIgb2YgVVVJRHMgZm91bmQKLSAqICAgICAgICAgICAgICAgICAgcF91dWlkX2xpc3RfdHlwZSAtIEVJUiBkYXRhIHR5cGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5VTEwgLSBpZiBVVUlEIGxpc3Qgd2l0aCB1dWlkX3NpemUgaXMgbm90IGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiBVVUlEIGxpc3QgaW4gRUlSIC0gb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCB1aW50OF90KiBidG1fZWlyX2dldF91dWlkX2xpc3QoY29uc3QgdWludDhfdCogcF9laXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlaXJfbGVuLCB1aW50OF90IHV1aWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF91dWlkX2xpc3RfdHlwZSkgewotICBjb25zdCB1aW50OF90KiBwX3V1aWRfZGF0YTsKLSAgdWludDhfdCBjb21wbGV0ZV90eXBlLCBtb3JlX3R5cGU7Ci0gIHVpbnQ4X3QgdXVpZF9sZW47Ci0KLSAgc3dpdGNoICh1dWlkX3NpemUpIHsKLSAgICBjYXNlIFV1aWQ6OmtOdW1CeXRlczE2OgotICAgICAgY29tcGxldGVfdHlwZSA9IEhDSV9FSVJfQ09NUExFVEVfMTZCSVRTX1VVSURfVFlQRTsKLSAgICAgIG1vcmVfdHlwZSA9IEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVdWlkOjprTnVtQnl0ZXMzMjoKLSAgICAgIGNvbXBsZXRlX3R5cGUgPSBIQ0lfRUlSX0NPTVBMRVRFXzMyQklUU19VVUlEX1RZUEU7Ci0gICAgICBtb3JlX3R5cGUgPSBIQ0lfRUlSX01PUkVfMzJCSVRTX1VVSURfVFlQRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVXVpZDo6a051bUJ5dGVzMTI4OgotICAgICAgY29tcGxldGVfdHlwZSA9IEhDSV9FSVJfQ09NUExFVEVfMTI4QklUU19VVUlEX1RZUEU7Ci0gICAgICBtb3JlX3R5cGUgPSBIQ0lfRUlSX01PUkVfMTI4QklUU19VVUlEX1RZUEU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKnBfbnVtX3V1aWQgPSAwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHBfdXVpZF9kYXRhID0gQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6R2V0RmllbGRCeVR5cGUocF9laXIsIGVpcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVfdHlwZSwgJnV1aWRfbGVuKTsKLSAgaWYgKHBfdXVpZF9kYXRhID09IE5VTEwpIHsKLSAgICBwX3V1aWRfZGF0YSA9IEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKHBfZWlyLCBlaXJfbGVuLCBtb3JlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZF9sZW4pOwotICAgICpwX3V1aWRfbGlzdF90eXBlID0gbW9yZV90eXBlOwotICB9IGVsc2UgewotICAgICpwX3V1aWRfbGlzdF90eXBlID0gY29tcGxldGVfdHlwZTsKLSAgfQotCi0gICpwX251bV91dWlkID0gdXVpZF9sZW4gLyB1dWlkX3NpemU7Ci0gIHJldHVybiBwX3V1aWRfZGF0YTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9jb252ZXJ0X3V1aWRfdG9fdXVpZDE2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIFVVSUQgdG8gVVVJRCAxNi1iaXQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX3V1aWQgLSBhZGRyZXNzIG9mIFVVSUQKLSAqICAgICAgICAgICAgICAgICAgdXVpZF9zaXplIC0gc2l6ZSBvZiBVVUlECi0gKgotICogUmV0dXJucyAgICAgICAgICAwIC0gaWYgVVVJRCBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVVSUQgMTYtYml0Ci0gKiAgICAgICAgICAgICAgICAgIFVVSUQgMTYtYml0IC0gb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50MTZfdCBidG1fY29udmVydF91dWlkX3RvX3V1aWQxNihjb25zdCB1aW50OF90KiBwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1dWlkX3NpemUpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmFzZV91dWlkW1V1aWQ6OmtOdW1CeXRlczEyOF0gPSB7Ci0gICAgICAweEZCLCAweDM0LCAweDlCLCAweDVGLCAweDgwLCAweDAwLCAweDAwLCAweDgwLAotICAgICAgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIHVpbnQxNl90IHV1aWQxNiA9IDA7Ci0gIHVpbnQzMl90IHV1aWQzMjsKLSAgYm9vbCBpc19iYXNlX3V1aWQ7Ci0gIHVpbnQ4X3QgeHg7Ci0KLSAgc3dpdGNoICh1dWlkX3NpemUpIHsKLSAgICBjYXNlIFV1aWQ6OmtOdW1CeXRlczE2OgotICAgICAgU1RSRUFNX1RPX1VJTlQxNih1dWlkMTYsIHBfdXVpZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFV1aWQ6OmtOdW1CeXRlczMyOgotICAgICAgU1RSRUFNX1RPX1VJTlQzMih1dWlkMzIsIHBfdXVpZCk7Ci0gICAgICBpZiAodXVpZDMyIDwgMHgxMDAwMCkgdXVpZDE2ID0gKHVpbnQxNl90KXV1aWQzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVXVpZDo6a051bUJ5dGVzMTI4OgotICAgICAgLyogU2VlIGlmIHdlIGNhbiBjb21wcmVzcyB0aGUgVVVJRCBkb3duIHRvIDE2IG9yIDMyYml0IFVVSURzICovCi0gICAgICBpc19iYXNlX3V1aWQgPSB0cnVlOwotICAgICAgZm9yICh4eCA9IDA7IHh4IDwgVXVpZDo6a051bUJ5dGVzMTI4IC0gNDsgeHgrKykgewotICAgICAgICBpZiAocF91dWlkW3h4XSAhPSBiYXNlX3V1aWRbeHhdKSB7Ci0gICAgICAgICAgaXNfYmFzZV91dWlkID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc19iYXNlX3V1aWQpIHsKLSAgICAgICAgaWYgKChwX3V1aWRbVXVpZDo6a051bUJ5dGVzMTI4IC0gMV0gPT0gMCkgJiYKLSAgICAgICAgICAgIChwX3V1aWRbVXVpZDo6a051bUJ5dGVzMTI4IC0gMl0gPT0gMCkpIHsKLSAgICAgICAgICBwX3V1aWQgKz0gKFV1aWQ6OmtOdW1CeXRlczEyOCAtIDQpOwotICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYodXVpZDE2LCBwX3V1aWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQlRNX1RSQUNFX1dBUk5JTkcoImJ0bV9jb252ZXJ0X3V1aWRfdG9fdXVpZDE2IGludmFsaWQgdXVpZCBzaXplIik7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAodXVpZDE2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZXRfZWlyX3V1aWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0b3JlIHJlY2VpdmVkIFVVSUQgaW50byBpbnF1aXJ5Ci0gKiAgICAgICAgICAgICAgICAgIHJlc3VsdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZWlyIC0gcG9pbnRlciBvZiBFSVIgc2lnbmlmaWNhbnQgcGFydAotICogICAgICAgICAgICAgICAgICBwX3Jlc3VsdHMgLSBwb2ludGVyIG9mIGlucXVpcnkgcmVzdWx0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NldF9laXJfdXVpZCh1aW50OF90KiBwX2VpciwgdEJUTV9JTlFfUkVTVUxUUyogcF9yZXN1bHRzKSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIHBfdXVpZF9kYXRhOwotICB1aW50OF90IG51bV91dWlkOwotICB1aW50MTZfdCB1dWlkMTY7Ci0gIHVpbnQ4X3QgeXk7Ci0gIHVpbnQ4X3QgdHlwZSA9IEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFOwotCi0gIHBfdXVpZF9kYXRhID0gYnRtX2Vpcl9nZXRfdXVpZF9saXN0KHBfZWlyLCBIQ0lfRVhUX0lOUV9SRVNQT05TRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczE2LCAmbnVtX3V1aWQsICZ0eXBlKTsKLQotICBpZiAodHlwZSA9PSBIQ0lfRUlSX0NPTVBMRVRFXzE2QklUU19VVUlEX1RZUEUpIHsKLSAgICBwX3Jlc3VsdHMtPmVpcl9jb21wbGV0ZV9saXN0ID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBwX3Jlc3VsdHMtPmVpcl9jb21wbGV0ZV9saXN0ID0gZmFsc2U7Ci0gIH0KLQotICBCVE1fVFJBQ0VfQVBJKCJidG1fc2V0X2Vpcl91dWlkIGVpcl9jb21wbGV0ZV9saXN0PTB4JTAyWCIsCi0gICAgICAgICAgICAgICAgcF9yZXN1bHRzLT5laXJfY29tcGxldGVfbGlzdCk7Ci0KLSAgaWYgKHBfdXVpZF9kYXRhKSB7Ci0gICAgZm9yICh5eSA9IDA7IHl5IDwgbnVtX3V1aWQ7IHl5KyspIHsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYodXVpZDE2LCBwX3V1aWRfZGF0YSk7Ci0gICAgICBCVE1fQWRkRWlyU2VydmljZShwX3Jlc3VsdHMtPmVpcl91dWlkLCB1dWlkMTYpOwotICAgIH0KLSAgfQotCi0gIHBfdXVpZF9kYXRhID0gYnRtX2Vpcl9nZXRfdXVpZF9saXN0KHBfZWlyLCBIQ0lfRVhUX0lOUV9SRVNQT05TRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczMyLCAmbnVtX3V1aWQsICZ0eXBlKTsKLSAgaWYgKHBfdXVpZF9kYXRhKSB7Ci0gICAgZm9yICh5eSA9IDA7IHl5IDwgbnVtX3V1aWQ7IHl5KyspIHsKLSAgICAgIHV1aWQxNiA9IGJ0bV9jb252ZXJ0X3V1aWRfdG9fdXVpZDE2KHBfdXVpZF9kYXRhLCBVdWlkOjprTnVtQnl0ZXMzMik7Ci0gICAgICBwX3V1aWRfZGF0YSArPSBVdWlkOjprTnVtQnl0ZXMzMjsKLSAgICAgIGlmICh1dWlkMTYpIEJUTV9BZGRFaXJTZXJ2aWNlKHBfcmVzdWx0cy0+ZWlyX3V1aWQsIHV1aWQxNik7Ci0gICAgfQotICB9Ci0KLSAgcF91dWlkX2RhdGEgPSBidG1fZWlyX2dldF91dWlkX2xpc3QocF9laXIsIEhDSV9FWFRfSU5RX1JFU1BPTlNFX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6a051bUJ5dGVzMTI4LCAmbnVtX3V1aWQsICZ0eXBlKTsKLSAgaWYgKHBfdXVpZF9kYXRhKSB7Ci0gICAgZm9yICh5eSA9IDA7IHl5IDwgbnVtX3V1aWQ7IHl5KyspIHsKLSAgICAgIHV1aWQxNiA9IGJ0bV9jb252ZXJ0X3V1aWRfdG9fdXVpZDE2KHBfdXVpZF9kYXRhLCBVdWlkOjprTnVtQnl0ZXMxMjgpOwotICAgICAgcF91dWlkX2RhdGEgKz0gVXVpZDo6a051bUJ5dGVzMTI4OwotICAgICAgaWYgKHV1aWQxNikgQlRNX0FkZEVpclNlcnZpY2UocF9yZXN1bHRzLT5laXJfdXVpZCwgdXVpZDE2KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1faW50LmggYi9zdGFjay9idG0vYnRtX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1faW50LmgKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCBiL3N0YWNrL2J0bS9idG1faW50X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGQ0NmIuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVE1fSU5UX1RZUEVTX0gKLSNkZWZpbmUgQlRNX0lOVF9UWVBFU19ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJnZC9jb21tb24vY2lyY3VsYXJfYnVmZmVyLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9saXN0LmgiCi0jaW5jbHVkZSAic3RhY2svYWNsL2FjbC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2NvLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL25laWdoYm9yX2lucXVpcnkuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2VjdXJpdHlfY2xpZW50X2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgQlRNX01BWF9TQ05fIDMxICAvLyBQT1JUX01BWF9SRkNfUE9SVFMgc3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUvcmZjZGVmcy5oCi0KLWNvbnN0ZXhwciBzaXplX3Qga01heExvZ1NpemUgPSAyNTU7Ci1jbGFzcyBUaW1lc3RhbXBlZFN0cmluZ0NpcmN1bGFyQnVmZmVyCi0gICAgOiBwdWJsaWMgYmx1ZXRvb3RoOjpjb21tb246OlRpbWVzdGFtcGVkQ2lyY3VsYXJCdWZmZXI8c3RkOjpzdHJpbmc+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFRpbWVzdGFtcGVkU3RyaW5nQ2lyY3VsYXJCdWZmZXIoc2l6ZV90IHNpemUpCi0gICAgICA6IGJsdWV0b290aDo6Y29tbW9uOjpUaW1lc3RhbXBlZENpcmN1bGFyQnVmZmVyPHN0ZDo6c3RyaW5nPihzaXplKSB7fQotCi0gIHZvaWQgUHVzaChzdGQ6OnN0cmluZyBzKSB7Ci0gICAgYmx1ZXRvb3RoOjpjb21tb246OlRpbWVzdGFtcGVkQ2lyY3VsYXJCdWZmZXI8c3RkOjpzdHJpbmc+OjpQdXNoKAotICAgICAgICBzLnN1YnN0cigwLCBrTWF4TG9nU2l6ZSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIHZvaWQgUHVzaChBcmdzLi4uIGFyZ3MpIHsKLSAgICBjaGFyIGJ1ZltrTWF4TG9nU2l6ZV07Ci0gICAgc3RkOjpzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBhcmdzLi4uKTsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6VGltZXN0YW1wZWRDaXJjdWxhckJ1ZmZlcjxzdGQ6OnN0cmluZz46OlB1c2goCi0gICAgICAgIHN0ZDo6c3RyaW5nKGJ1ZikpOwotICB9Ci19OwotCi0vKgotICogTG9jYWwgZGV2aWNlIGNvbmZpZ3VyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX0xPQ19CRF9OQU1FIGJkX25hbWU7ICAvKiBsb2NhbCBCbHVldG9vdGggZGV2aWNlIG5hbWUgKi8KLSAgYm9vbCBwaW5fdHlwZTsgICAgICAgICAgICAgLyogdHJ1ZSBpZiBQSU4gdHlwZSBpcyBmaXhlZCAqLwotICB1aW50OF90IHBpbl9jb2RlX2xlbjsgICAgICAvKiBCb25kaW5nIGluZm9ybWF0aW9uICovCi0gIFBJTl9DT0RFIHBpbl9jb2RlOyAgICAgICAgIC8qIFBJTiBDT0RFIGlmIHBpbiB0eXBlIGlzIGZpeGVkICovCi19IHRCVE1fQ0ZHOwotCi0vKiBQYWlyaW5nIFN0YXRlICovCi1lbnVtIHsKLSAgQlRNX1BBSVJfU1RBVEVfSURMRSwgLyogSWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQlRNX1BBSVJfU1RBVEVfR0VUX1JFTV9OQU1FLCAvKiBHZXR0aW5nIHRoZSByZW1vdGUgbmFtZSAodG8gY2hlY2sgZm9yIFNNNCkgKi8KLSAgQlRNX1BBSVJfU1RBVEVfV0FJVF9QSU5fUkVRLCAvKiBTdGFydGVkIGF1dGhlbnRpY2F0aW9uLCB3YWl0aW5nIGZvciBQSU4gcmVxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBJTiBpcyBwcmUtZmV0Y2hlZCkgKi8KLSAgQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9QSU4sICAgICAgIC8qIFdhaXRpbmcgZm9yIGxvY2FsIFBJTiBjb2RlICovCi0gIEJUTV9QQUlSX1NUQVRFX1dBSVRfTlVNRVJJQ19DT05GSVJNLCAvKiBXYWl0aW5nIHVzZXIgJ3llcycgdG8gbnVtZXJpYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uICAgKi8KLSAgQlRNX1BBSVJfU1RBVEVfS0VZX0VOVFJZLCAvKiBLZXkgZW50cnkgc3RhdGUgKHdlIGFyZSBhIGtleWJvYXJkKSAgICAgICAgICAqLwotICBCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX09PQl9SU1AsIC8qIFdhaXRpbmcgZm9yIGxvY2FsIHJlc3BvbnNlIHRvIHBlZXIgT09CCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSAgKi8KLSAgQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9JT0NBUFMsIC8qIFdhaXRpbmcgZm9yIGxvY2FsIElPIGNhcGFiaWxpdGllcyBhbmQgT09CCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICovCi0gIEJUTV9QQUlSX1NUQVRFX0lOQ09NSU5HX1NTUCwgLyogSW5jb21pbmcgU1NQIChnb3QgcGVlciBJTyBjYXBzIHdoZW4gaWRsZSkgKi8KLSAgQlRNX1BBSVJfU1RBVEVfV0FJVF9BVVRIX0NPTVBMRVRFLCAvKiBBbGwgZG9uZSwgd2FpdGluZyBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbXBsZXRlICAgICovCi0gIEJUTV9QQUlSX1NUQVRFX1dBSVRfRElTQ09OTkVDVCAgICAgLyogV2FpdGluZyB0byBkaXNjb25uZWN0IHRoZSBBQ0wgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUTV9QQUlSSU5HX1NUQVRFOwotCi0jZGVmaW5lIEJUTV9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQgXAotICAweDAxIC8qIFdlIHdhbnQgdG8gZG8gZGVkaWNhdGVkIGJvbmRpbmcgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUTV9QQUlSX0ZMQUdTX1BFRVJfU1RBUlRFRF9ERCBcCi0gIDB4MDIgLyogUGVlciBpbml0aWF0ZWQgZGVkaWNhdGVkIGJvbmRpbmcgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRNX1BBSVJfRkxBR1NfRElTQ19XSEVOX0RPTkUgMHgwNCAvKiBEaXNjb25uZWN0IHdoZW4gZG9uZSAgICAgKi8KLSNkZWZpbmUgQlRNX1BBSVJfRkxBR1NfUElOX1JFUUQgXAotICAweDA4IC8qIHNldCB0aGlzIGJpdCB3aGVuIHBpbl9jYWxsYmFjayBpcyBjYWxsZWQgICAgICovCi0jZGVmaW5lIEJUTV9QQUlSX0ZMQUdTX1BSRV9GRVRDSF9QSU4gXAotICAweDEwIC8qIHNldCB0aGlzIGJpdCB3aGVuIHByZS1mZXRjaCBwaW4gICAgICovCi0jZGVmaW5lIEJUTV9QQUlSX0ZMQUdTX1JFSkVDVEVEX0NPTk5FQ1QgXAotICAweDIwIC8qIHNldCB0aGlzIGJpdCB3aGVuIHJlamVjdGVkIGluY29taW5nIGNvbm5lY3Rpb24gICovCi0jZGVmaW5lIEJUTV9QQUlSX0ZMQUdTX1dFX0NBTkNFTF9ERCBcCi0gIDB4NDAgLyogc2V0IHRoaXMgYml0IHdoZW4gY2FuY2VsbGluZyBhIGJvbmRpbmcgcHJvY2VkdXJlICovCi0jZGVmaW5lIEJUTV9QQUlSX0ZMQUdTX0xFX0FDVElWRSBcCi0gIDB4ODAgLyogdXNlIHRoaXMgYml0IHdoZW4gU01QIHBhaXJpbmcgaXMgYWN0aXZlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpc19tdXg7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLSAgdWludDE2X3QgcHNtOwotICBib29sIGlzX29yaWc7Ci0gIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrOwotICB2b2lkKiBwX3JlZl9kYXRhOwotICB1aW50MTZfdCByZmNvbW1fc2VjdXJpdHlfcmVxdWlyZW1lbnQ7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3Q7Ci19IHRCVE1fU0VDX1FVRVVFX0VOVFJZOwotCi0vKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgdGhlIEJUTSBkYXRhCi0qLwotCi0jZGVmaW5lIEJUTV9TVEFURV9CVUZGRVJfU0laRSA1IC8qIHNpemUgb2Ygc3RhdGUgYnVmZmVyICovCi0KLS8qIERlZmluZSB0aGUgRGV2aWNlIE1hbmFnZW1lbnQgY29udHJvbCBzdHJ1Y3R1cmUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgdEJUTV9ERVZDQiB7Ci0gIHRCVE1fVlNfRVZUX0NCKiBwX3ZlbmRfc3BlY19jYltCVE1fTUFYX1ZTRV9DQUxMQkFDS1NdOyAvKiBSZWdpc3RlciBmb3IgdmVuZG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBldmVudHMgICovCi0KLSAgdEJUTV9DTVBMX0NCKgotICAgICAgcF9zdG9yZWRfbGlua19rZXlfY21wbF9jYjsgLyogUmVhZC9Xcml0ZS9EZWxldGUgc3RvcmVkIGxpbmsga2V5ICAgICovCi0KLSAgYWxhcm1fdCogcmVhZF9sb2NhbF9uYW1lX3RpbWVyOyAvKiBSZWFkIGxvY2FsIG5hbWUgdGltZXIgKi8KLSAgdEJUTV9DTVBMX0NCKiBwX3Jsbl9jbXBsX2NiOyAgICAvKiBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGxvY2FsIG5hbWUgZnVuY3Rpb24gY29tcGxldGUgICAgKi8KLQotICBhbGFybV90KiByZWFkX3Jzc2lfdGltZXI7ICAgICAvKiBSZWFkIFJTU0kgdGltZXIgKi8KLSAgdEJUTV9DTVBMX0NCKiBwX3Jzc2lfY21wbF9jYjsgLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQgUlNTSSBmdW5jdGlvbiBjb21wbGV0ZXMgKi8KLQotICBhbGFybV90KiByZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZXI7IC8qIFJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyICovCi0gIHRCVE1fQ01QTF9DQiogcF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NtcGxfY2I7IC8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlICovCi0gIC8qIGNhbGxlZCB3aGVuIHJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnRlciBmdW5jdGlvbiBjb21wbGV0ZXMgKi8KLQotICBhbGFybV90KgotICAgICAgcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF90aW1lcjsgLyogUmVhZCBBdXRvbWF0aWMgRmx1c2ggVGltZW91dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgKi8KLSAgdEJUTV9DTVBMX0NCKiBwX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NtcGxfY2I7IC8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlICovCi0gIC8qIGNhbGxlZCB3aGVuIHJlYWQgQXV0b21hdGljIEZsdXNoIFRpbWVvdXQgZnVuY3Rpb24gY29tcGxldGVzICovCi0KLSAgYWxhcm1fdCogcmVhZF9saW5rX3F1YWxpdHlfdGltZXI7Ci0gIHRCVE1fQ01QTF9DQiogcF9saW5rX3F1YWxfY21wbF9jYjsgLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZCBsaW5rIHF1YWxpdHkgZnVuY3Rpb24gY29tcGxldGVzICovCi0KLSAgYWxhcm1fdCogcmVhZF90eF9wb3dlcl90aW1lcjsgICAgIC8qIFJlYWQgdHggcG93ZXIgdGltZXIgKi8KLSAgdEJUTV9DTVBMX0NCKiBwX3R4X3Bvd2VyX2NtcGxfY2I7IC8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAgICAgICAqLwotCi0gIERFVl9DTEFTUyBkZXZfY2xhc3M7IC8qIExvY2FsIGRldmljZSBjbGFzcyAgICAgICAgICAgICAgICAgICAqLwotCi0gIHRCVE1fQ01QTF9DQioKLSAgICAgIHBfbGVfdGVzdF9jbWRfY21wbF9jYjsgLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEUgdGVzdCBtb2RlIGNvbW1hbmQgaGFzIGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgKi8KLQotICBSYXdBZGRyZXNzIHJlYWRfdHhfcHdyX2FkZHI7IC8qIHJlYWQgVFggcG93ZXIgdGFyZ2V0IGFkZHJlc3MgICAgICovCi0KLSAgdEJUTV9CTEVfTE9DQUxfSURfS0VZUyBpZF9rZXlzOyAgIC8qIGxvY2FsIEJMRSBJRCBrZXlzICovCi0gIE9jdGV0MTYgYmxlX2VuY3J5cHRpb25fa2V5X3ZhbHVlOyAvKiBCTEUgZW5jcnlwdGlvbiBrZXkgKi8KLQotI2lmIChCVE1fQkxFX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRSkKLSAgYm9vbCBub19kaXNjX2lmX3BhaXJfZmFpbDsKLSAgYm9vbCBlbmFibGVfdGVzdF9tYWNfdmFsOwotICBCVF9PQ1RFVDggdGVzdF9tYWM7Ci0gIGJvb2wgZW5hYmxlX3Rlc3RfbG9jYWxfc2lnbl9jbnRyOwotICB1aW50MzJfdCB0ZXN0X2xvY2FsX3NpZ25fY250cjsKLSNlbmRpZgotCi0gIHRCVE1fSU9fQ0FQIGxvY19pb19jYXBzOyAgICAvKiBJTyBjYXBhYmlsaXR5IG9mIHRoZSBsb2NhbCBkZXZpY2UgKi8KLSAgdEJUTV9BVVRIX1JFUSBsb2NfYXV0aF9yZXE7IC8qIHRoZSBhdXRoX3JlcSBmbGFnICAqLwotCi0gIHZvaWQgSW5pdCgpIHsKLSAgICByZWFkX2xvY2FsX25hbWVfdGltZXIgPSBhbGFybV9uZXcoImJ0bS5yZWFkX2xvY2FsX25hbWVfdGltZXIiKTsKLSAgICByZWFkX3Jzc2lfdGltZXIgPSBhbGFybV9uZXcoImJ0bS5yZWFkX3Jzc2lfdGltZXIiKTsKLSAgICByZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZXIgPQotICAgICAgICBhbGFybV9uZXcoImJ0bS5yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZXIiKTsKLSAgICByZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X3RpbWVyID0KLSAgICAgICAgYWxhcm1fbmV3KCJidG0ucmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF90aW1lciIpOwotICAgIHJlYWRfbGlua19xdWFsaXR5X3RpbWVyID0gYWxhcm1fbmV3KCJidG0ucmVhZF9saW5rX3F1YWxpdHlfdGltZXIiKTsKLSAgICByZWFkX3R4X3Bvd2VyX3RpbWVyID0gYWxhcm1fbmV3KCJidG0ucmVhZF90eF9wb3dlcl90aW1lciIpOwotICB9Ci0KLSAgdm9pZCBGcmVlKCkgewotICAgIGFsYXJtX2ZyZWUocmVhZF9sb2NhbF9uYW1lX3RpbWVyKTsKLSAgICBhbGFybV9mcmVlKHJlYWRfcnNzaV90aW1lcik7Ci0gICAgYWxhcm1fZnJlZShyZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZXIpOwotICAgIGFsYXJtX2ZyZWUocmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF90aW1lcik7Ci0gICAgYWxhcm1fZnJlZShyZWFkX2xpbmtfcXVhbGl0eV90aW1lcik7Ci0gICAgYWxhcm1fZnJlZShyZWFkX3R4X3Bvd2VyX3RpbWVyKTsKLSAgfQotfSB0QlRNX0RFVkNCOwotCi10eXBlZGVmIHN0cnVjdCB0QlRNX0NCIHsKLSAgdEJUTV9DRkcgY2ZnOyAvKiBEZXZpY2UgY29uZmlndXJhdGlvbiAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqKiAgICAgIERldmljZSBjb250cm9sCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB0QlRNX0RFVkNCIGRldmNiOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqKiAgICAgIEJMRSBEZXZpY2UgY29udHJvbGxlcnMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHRCVE1fQkxFX0NCIGJsZV9jdHJfY2I7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgdm9pZCBidG1fYmxlX2x0a19yZXF1ZXN0X3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgYm9vbCB1c2Vfc3RrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHN0ayk7Ci0gIGZyaWVuZCB0QlRNX1NUQVRVUyBidG1fYmxlX3N0YXJ0X2VuY3J5cHQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBib29sIHVzZV9zdGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0ZXQxNiogcF9zdGspOwotICBmcmllbmQgdm9pZCBidG1fYmxlX2x0a19yZXF1ZXN0X3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgYm9vbCB1c2Vfc3RrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHN0ayk7Ci0gIHVpbnQxNl90IGVuY19oYW5kbGV7MH07Ci0KLSAgZnJpZW5kIHZvaWQgYnRtX2JsZV9sdGtfcmVxdWVzdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmFuZFs4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlZGl2KTsKLSAgQlRfT0NURVQ4IGVuY19yYW5kOyAvKiByZWNlaXZlZCByYW5kIHZhbHVlIGZyb20gTFRLIHJlcXVlc3QqLwotCi0gIHVpbnQxNl90IGVkaXZ7MH07IC8qIHJlY2VpdmVkIGVkaXYgdmFsdWUgZnJvbSBMVEsgcmVxdWVzdCAqLwotCi0gIHVpbnQ4X3Qga2V5X3NpemV7MH07Ci0KLSBwdWJsaWM6Ci0gIHRCVE1fQkxFX1ZTQ19DQiBjbW5fYmxlX3ZzY19jYjsKLQotICAvKiBQYWNrZXQgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBsb2NhbCBkZXZpY2UgKi8KLSAgdWludDE2X3QgYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkezB9OwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqKiAgICAgIElucXVpcnkKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHRCVE1fSU5RVUlSWV9WQVJfU1QgYnRtX2lucV92YXJzOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqKiAgICAgIFNDTyBNYW5hZ2VtZW50Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB0U0NPX0NCIHNjb19jYjsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiogICAgICBTZWN1cml0eSBNYW5hZ2VtZW50Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB0QlRNX0FQUExfSU5GTyBhcGk7Ci0KLSNkZWZpbmUgQlRNX1NFQ19NQVhfUk1UX05BTUVfQ0FMTEJBQ0tTIDIKLSAgdEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9ybXRfbmFtZV9jYWxsYmFja1tCVE1fU0VDX01BWF9STVRfTkFNRV9DQUxMQkFDS1NdOwotCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfY29sbGlkZWRfZGV2X3JlY3tudWxscHRyfTsKLSAgYWxhcm1fdCogc2VjX2NvbGxpc2lvbl90aW1lcntudWxscHRyfTsKLSAgdWludDY0X3QgY29sbGlzaW9uX3N0YXJ0X3RpbWV7MH07Ci0gIHVpbnQzMl90IGRldl9yZWNfY291bnR7MH07IC8qIENvdW50ZXIgdXNlZCBmb3IgZGV2aWNlIHJlY29yZCB0aW1lc3RhbXAgKi8KLSAgdWludDhfdCBzZWN1cml0eV9tb2RlezB9OwotICBib29sIHBhaXJpbmdfZGlzYWJsZWR7ZmFsc2V9OwotICBib29sIHNlY3VyaXR5X21vZGVfY2hhbmdlZHtmYWxzZX07IC8qIG1vZGUgY2hhbmdlZCBkdXJpbmcgYm9uZGluZyAqLwotICBib29sIHBpbl90eXBlX2NoYW5nZWR7ZmFsc2V9OyAgICAgIC8qIHBpbiB0eXBlIGNoYW5nZWQgZHVyaW5nIGJvbmRpbmcgKi8KLSAgYm9vbCBzZWNfcmVxX3BlbmRpbmd7ZmFsc2V9OyAgICAgICAvKiAgIHRydWUgaWYgYSByZXF1ZXN0IGlzIHBlbmRpbmcgKi8KLQotICB1aW50OF90IHBpbl9jb2RlX2xlbnswfTsgICAgICAgICAgLyogZm9yIGxlZ2FjeSBkZXZpY2VzICovCi0gIFBJTl9DT0RFIHBpbl9jb2RlOyAgICAgICAgICAgICAgICAvKiBmb3IgbGVnYWN5IGRldmljZXMgKi8KLSAgdEJUTV9QQUlSSU5HX1NUQVRFIHBhaXJpbmdfc3RhdGV7Ci0gICAgICBCVE1fUEFJUl9TVEFURV9JRExFfTsgICAgICAgICAvKiBUaGUgY3VycmVudCBwYWlyaW5nIHN0YXRlICAgICovCi0gIHVpbnQ4X3QgcGFpcmluZ19mbGFnc3swfTsgICAgICAgICAvKiBUaGUgY3VycmVudCBwYWlyaW5nIGZsYWdzICAgICovCi0gIFJhd0FkZHJlc3MgcGFpcmluZ19iZGE7ICAgICAgICAgICAvKiBUaGUgZGV2aWNlIGN1cnJlbnRseSBwYWlyaW5nICovCi0gIGFsYXJtX3QqIHBhaXJpbmdfdGltZXJ7bnVsbHB0cn07ICAvKiBUaW1lciBmb3IgcGFpcmluZyBwcm9jZXNzICAgICovCi0gIGFsYXJtX3QqIGV4ZWN1dGlvbl93YWl0X3RpbWVye251bGxwdHJ9OyAvKiBUbyBhdm9pZCBjb25jdXJyZW50IGF1dGggcmVxdWVzdCAqLwotICB1aW50MTZfdCBkaXNjX2hhbmRsZXswfTsgICAgICAgICAgLyogZm9yIGxlZ2FjeSBkZXZpY2VzICovCi0gIHVpbnQ4X3QgZGlzY19yZWFzb257MH07ICAgICAgICAgICAvKiBmb3IgbGVnYWN5IGRldmljZXMgKi8KLSAgdEJUTV9TRUNfU0VSVl9SRUMgc2VjX3NlcnZfcmVjW0JUTV9TRUNfTUFYX1NFUlZJQ0VfUkVDT1JEU107Ci0gIGxpc3RfdCogc2VjX2Rldl9yZWN7bnVsbHB0cn07IC8qIGxpc3Qgb2YgdEJUTV9TRUNfREVWX1JFQyAqLwotICB0QlRNX1NFQ19TRVJWX1JFQyogcF9vdXRfc2VydntudWxscHRyfTsKLSAgdEJUTV9NS0VZX0NBTExCQUNLKiBta2V5X2NiYWNre251bGxwdHJ9OwotCi0gIFJhd0FkZHJlc3MgY29ubmVjdGluZ19iZGE7Ci0gIERFVl9DTEFTUyBjb25uZWN0aW5nX2RjOwotICB1aW50OF90IHRyYWNlX2xldmVsOwotICBib29sIGlzX3BhZ2luZ3tmYWxzZX07ICAvKiB0cnVlLCBpZiBwYWdpbmcgaXMgaW4gcHJvZ2VzcyAqLwotICBib29sIGlzX2lucXVpcnl7ZmFsc2V9OyAvKiB0cnVlLCBpZiBpbnF1aXJ5IGlzIGluIHByb2dlc3MgKi8KLSAgZml4ZWRfcXVldWVfdCogcGFnZV9xdWV1ZXtudWxscHRyfTsKLQotICBib29sIHBhZ2luZ3tmYWxzZX07Ci0gIHZvaWQgc2V0X3BhZ2luZygpIHsgcGFnaW5nID0gdHJ1ZTsgfQotICB2b2lkIHJlc2V0X3BhZ2luZygpIHsgcGFnaW5nID0gZmFsc2U7IH0KLSAgYm9vbCBpc19wYWdpbmdfYWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybiBwYWdpbmc7Ci0gIH0gIC8vIFRPRE8gcmVtb3ZlIGFsbCB0aGlzIHBhZ2luZyBzdGF0ZQotCi0gIGZpeGVkX3F1ZXVlX3QqIHNlY19wZW5kaW5nX3F7bnVsbHB0cn07IC8qIHBlbmRpbmcgc2VxdXJpdHkgcmVxdWVzdHMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfUVVFVUVfRU5UUlkgZm9ybWF0ICovCi0KLSAgLy8gQlFSIFJlY2VpdmVyCi0gIHRCVE1fQlRfUVVBTElUWV9SRVBPUlRfUkVDRUlWRVIqIHBfYnFyX3JlcG9ydF9yZWNlaXZlcntudWxscHRyfTsKLQotI2RlZmluZSBCVE1fQ09ERUNfVFlQRV9NQVhfUkVDT1JEUyAzMgotICB0QlRNX0JUX0RZTkFNSUNfQVVESU9fQlVGRkVSX0NCCi0gICAgICBkeW5hbWljX2F1ZGlvX2J1ZmZlcl9jYltCVE1fQ09ERUNfVFlQRV9NQVhfUkVDT1JEU107Ci0KLSAgdEFDTF9DQiBhY2xfY2JfOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxUaW1lc3RhbXBlZFN0cmluZ0NpcmN1bGFyQnVmZmVyPiBoaXN0b3J5X3tudWxscHRyfTsKLQotICB2b2lkIEluaXQodWludDhfdCBpbml0aWFsX3NlY3VyaXR5X21vZGUpIHsKLSAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotICAgIG1lbXNldCgmZGV2Y2IsIDAsIHNpemVvZihkZXZjYikpOwotICAgIG1lbXNldCgmYmxlX2N0cl9jYiwgMCwgc2l6ZW9mKGJsZV9jdHJfY2IpKTsKLSAgICBtZW1zZXQoJmVuY19yYW5kLCAwLCBzaXplb2YoZW5jX3JhbmQpKTsKLSAgICBtZW1zZXQoJmNtbl9ibGVfdnNjX2NiLCAwLCBzaXplb2YoY21uX2JsZV92c2NfY2IpKTsKLSAgICBtZW1zZXQoJmJ0bV9pbnFfdmFycywgMCwgc2l6ZW9mKGJ0bV9pbnFfdmFycykpOwotICAgIG1lbXNldCgmc2NvX2NiLCAwLCBzaXplb2Yoc2NvX2NiKSk7Ci0gICAgbWVtc2V0KCZhcGksIDAsIHNpemVvZihhcGkpKTsKLSAgICBtZW1zZXQocF9ybXRfbmFtZV9jYWxsYmFjaywgMCwgc2l6ZW9mKHBfcm10X25hbWVfY2FsbGJhY2spKTsKLSAgICBtZW1zZXQoJnBpbl9jb2RlLCAwLCBzaXplb2YocGluX2NvZGUpKTsKLSAgICBtZW1zZXQoc2VjX3NlcnZfcmVjLCAwLCBzaXplb2Yoc2VjX3NlcnZfcmVjKSk7Ci0KLSAgICBjb25uZWN0aW5nX2JkYSA9IFJhd0FkZHJlc3M6OmtFbXB0eTsKLSAgICBtZW1zZXQoJmNvbm5lY3RpbmdfZGMsIDAsIHNpemVvZihjb25uZWN0aW5nX2RjKSk7Ci0KLSAgICBtZW1zZXQoJmFjbF9jYl8sIDAsIHNpemVvZihhY2xfY2JfKSk7Ci0KLSAgICBwYWdlX3F1ZXVlID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgICBzZWNfcGVuZGluZ19xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgICBzZWNfY29sbGlzaW9uX3RpbWVyID0gYWxhcm1fbmV3KCJidG0uc2VjX2NvbGxpc2lvbl90aW1lciIpOwotICAgIHBhaXJpbmdfdGltZXIgPSBhbGFybV9uZXcoImJ0bS5wYWlyaW5nX3RpbWVyIik7Ci0gICAgZXhlY3V0aW9uX3dhaXRfdGltZXIgPSBhbGFybV9uZXcoImJ0bS5leGVjdXRpb25fd2FpdF90aW1lciIpOwotCi0jaWYgZGVmaW5lZChCVE1fSU5JVElBTF9UUkFDRV9MRVZFTCkKLSAgICB0cmFjZV9sZXZlbCA9IEJUTV9JTklUSUFMX1RSQUNFX0xFVkVMOwotI2Vsc2UKLSAgICB0cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX05PTkU7IC8qIE5vIHRyYWNlcyAqLwotI2VuZGlmCi0gICAgc2VjdXJpdHlfbW9kZSA9IGluaXRpYWxfc2VjdXJpdHlfbW9kZTsKLSAgICBwYWlyaW5nX2JkYSA9IFJhd0FkZHJlc3M6OmtBbnk7Ci0gICAgc2VjX2Rldl9yZWMgPSBsaXN0X25ldyhvc2lfZnJlZSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIEJUTSBjb21wb25lbnQgc3RydWN0dXJlcyAqLwotICAgIGJ0bV9pbnFfdmFycy5Jbml0KCk7IC8qIElucXVpcnkgRGF0YWJhc2UgYW5kIFN0cnVjdHVyZXMgKi8KLSAgICBhY2xfY2JfID0ge307Ci0gICAgc2NvX2NiLkluaXQoKTsgICAgICAgLyogU0NPIERhdGFiYXNlIGFuZCBTdHJ1Y3R1cmVzIChJZiBpbmNsdWRlZCkgKi8KLSAgICBkZXZjYi5Jbml0KCk7Ci0KLSAgICBoaXN0b3J5XyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGltZXN0YW1wZWRTdHJpbmdDaXJjdWxhckJ1ZmZlcj4oNDApOwotICAgIENIRUNLKGhpc3RvcnlfICE9IG51bGxwdHIpOwotICAgIGhpc3RvcnlfLT5QdXNoKHN0ZDo6c3RyaW5nKCJJbml0aWFsaXplZCBidG0gaGlzdG9yeSIpKTsKLSAgfQotCi0gIHZvaWQgRnJlZSgpIHsKLSAgICBoaXN0b3J5Xy5yZXNldCgpOwotCi0gICAgZGV2Y2IuRnJlZSgpOwotICAgIGJ0bV9pbnFfdmFycy5GcmVlKCk7Ci0KLSAgICBmaXhlZF9xdWV1ZV9mcmVlKHBhZ2VfcXVldWUsIG51bGxwdHIpOwotICAgIHBhZ2VfcXVldWUgPSBudWxscHRyOwotCi0gICAgZml4ZWRfcXVldWVfZnJlZShzZWNfcGVuZGluZ19xLCBudWxscHRyKTsKLSAgICBzZWNfcGVuZGluZ19xID0gbnVsbHB0cjsKLQotICAgIGxpc3RfZnJlZShzZWNfZGV2X3JlYyk7Ci0gICAgc2VjX2Rldl9yZWMgPSBudWxscHRyOwotCi0gICAgYWxhcm1fZnJlZShzZWNfY29sbGlzaW9uX3RpbWVyKTsKLSAgICBzZWNfY29sbGlzaW9uX3RpbWVyID0gbnVsbHB0cjsKLQotICAgIGFsYXJtX2ZyZWUocGFpcmluZ190aW1lcik7Ci0gICAgcGFpcmluZ190aW1lciA9IG51bGxwdHI7Ci0KLSAgICBhbGFybV9mcmVlKGV4ZWN1dGlvbl93YWl0X3RpbWVyKTsKLSAgICBleGVjdXRpb25fd2FpdF90aW1lciA9IG51bGxwdHI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGZyaWVuZCB1aW50OF90IEJUTV9BbGxvY2F0ZVNDTih2b2lkKTsKLSAgZnJpZW5kIGJvb2wgQlRNX1RyeUFsbG9jYXRlU0NOKHVpbnQ4X3Qgc2NuKTsKLSAgZnJpZW5kIGJvb2wgQlRNX0ZyZWVTQ04odWludDhfdCBzY24pOwotICB1aW50OF90IGJ0bV9zY25bQlRNX01BWF9TQ05fXTsKLX0gdEJUTV9DQjsKLQotLyogc2VjdXJpdHkgYWN0aW9uIGZvciBMMkNBUCBDT0MgY2hhbm5lbHMgKi8KLSNkZWZpbmUgQlRNX1NFQ19PSyAxCi0jZGVmaW5lIEJUTV9TRUNfRU5DUllQVCAyICAgICAgICAgLyogZW5jcnlwdCB0aGUgbGluayB3aXRoIGN1cnJlbnQga2V5ICovCi0jZGVmaW5lIEJUTV9TRUNfRU5DUllQVF9OT19NSVRNIDMgLyogdW5hdXRoZW50aWNhdGVkIGVuY3J5cHRpb24gb3IgYmV0dGVyICovCi0jZGVmaW5lIEJUTV9TRUNfRU5DUllQVF9NSVRNIDQgICAgLyogYXV0aGVudGljYXRlZCBlbmNyeXB0aW9uICovCi0jZGVmaW5lIEJUTV9TRUNfRU5DX1BFTkRJTkcgNSAgICAgLyogd2FpdCBmb3IgbGluayBlbmNyeXB0aW9uIHBlbmRpbmcgKi8KLQotdHlwZWRlZiB1aW50OF90IHRCVE1fU0VDX0FDVElPTjsKLQotI2VuZGlmICAvLyBCVE1fSU5UX1RZUEVTX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1faXNvLmNjIGIvc3RhY2svYnRtL2J0bV9pc28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDU5YmYuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9pc28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImJ0bV9pc29fYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2lzb19pbXBsLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpCaWdDYWxsYmFja3M7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OkNpZ0NhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6aXNvX2ltcGw7Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXN0cnVjdCBJc29NYW5hZ2VyOjppbXBsIHsKLSAgaW1wbChjb25zdCBJc29NYW5hZ2VyJiBpc29fbWFuYWdlcikgOiBpc29fbWFuYWdlcl8oaXNvX21hbmFnZXIpIHt9Ci0KLSAgdm9pZCBTdGFydCgpIHsKLSAgICBMT0dfQVNTRVJUKCFpc29faW1wbF8pOwotICAgIGlzb19pbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aXNvX2ltcGw+KCk7Ci0gIH0KLQotICB2b2lkIFN0b3AoKSB7Ci0gICAgTE9HX0FTU0VSVChpc29faW1wbF8pOwotICAgIGlzb19pbXBsXy5yZXNldCgpOwotICB9Ci0KLSAgYm9vbCBJc1J1bm5pbmcoKSB7IHJldHVybiBpc29faW1wbF8gPyB0cnVlIDogZmFsc2U7IH0KLQotICBjb25zdCBJc29NYW5hZ2VyJiBpc29fbWFuYWdlcl87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxpc29faW1wbD4gaXNvX2ltcGxfOwotfTsKLQotSXNvTWFuYWdlcjo6SXNvTWFuYWdlcigpIDogcGltcGxfKHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oKnRoaXMpKSB7fQotCi12b2lkIElzb01hbmFnZXI6OlJlZ2lzdGVyQ2lnQ2FsbGJhY2tzKENpZ0NhbGxiYWNrcyogY2FsbGJhY2tzKSBjb25zdCB7Ci0gIHBpbXBsXy0+aXNvX2ltcGxfLT5oYW5kbGVfcmVnaXN0ZXJfY2lzX2NhbGxiYWNrcyhjYWxsYmFja3MpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlJlZ2lzdGVyQmlnQ2FsbGJhY2tzKEJpZ0NhbGxiYWNrcyogY2FsbGJhY2tzKSBjb25zdCB7Ci0gIHBpbXBsXy0+aXNvX2ltcGxfLT5oYW5kbGVfcmVnaXN0ZXJfYmlnX2NhbGxiYWNrcyhjYWxsYmFja3MpOwotfQotCi12b2lkIElzb01hbmFnZXI6OkNyZWF0ZUNpZyh1aW50OF90IGNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMgY2lnX3BhcmFtcykgewotICBwaW1wbF8tPmlzb19pbXBsXy0+Y3JlYXRlX2NpZyhjaWdfaWQsIHN0ZDo6bW92ZShjaWdfcGFyYW1zKSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6UmVjb25maWd1cmVDaWcoCi0gICAgdWludDhfdCBjaWdfaWQsIHN0cnVjdCBpc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMgY2lnX3BhcmFtcykgewotICBwaW1wbF8tPmlzb19pbXBsXy0+cmVjb25maWd1cmVfY2lnKGNpZ19pZCwgc3RkOjptb3ZlKGNpZ19wYXJhbXMpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpSZW1vdmVDaWcodWludDhfdCBjaWdfaWQpIHsKLSAgcGltcGxfLT5pc29faW1wbF8tPnJlbW92ZV9jaWcoY2lnX2lkKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpFc3RhYmxpc2hDaXMoCi0gICAgc3RydWN0IGlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX3BhcmFtcyBjb25uX3BhcmFtcykgewotICBwaW1wbF8tPmlzb19pbXBsXy0+ZXN0YWJsaXNoX2NpcyhzdGQ6Om1vdmUoY29ubl9wYXJhbXMpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpEaXNjb25uZWN0Q2lzKHVpbnQxNl90IGNpc19oYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIHBpbXBsXy0+aXNvX2ltcGxfLT5kaXNjb25uZWN0X2NpcyhjaXNfaGFuZGxlLCByZWFzb24pOwotfQotCi12b2lkIElzb01hbmFnZXI6OlNldHVwSXNvRGF0YVBhdGgoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgc3RydWN0IGlzb19tYW5hZ2VyOjppc29fZGF0YV9wYXRoX3BhcmFtcyBwYXRoX3BhcmFtcykgewotICBwaW1wbF8tPmlzb19pbXBsXy0+c2V0dXBfaXNvX2RhdGFfcGF0aChpc29faGFuZGxlLCBzdGQ6Om1vdmUocGF0aF9wYXJhbXMpKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpSZW1vdmVJc29EYXRhUGF0aCh1aW50MTZfdCBpc29faGFuZGxlLCB1aW50OF90IGRhdGFfcGF0aF9kaXIpIHsKLSAgcGltcGxfLT5pc29faW1wbF8tPnJlbW92ZV9pc29fZGF0YV9wYXRoKGlzb19oYW5kbGUsIGRhdGFfcGF0aF9kaXIpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlJlYWRJc29MaW5rUXVhbGl0eSh1aW50MTZfdCBpc29faGFuZGxlKSB7Ci0gIHBpbXBsXy0+aXNvX2ltcGxfLT5yZWFkX2lzb19saW5rX3F1YWxpdHkoaXNvX2hhbmRsZSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6U2VuZElzb0RhdGEodWludDE2X3QgaXNvX2hhbmRsZSwgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZGF0YV9sZW4pIHsKLSAgcGltcGxfLT5pc29faW1wbF8tPnNlbmRfaXNvX2RhdGEoaXNvX2hhbmRsZSwgZGF0YSwgZGF0YV9sZW4pOwotfQotCi12b2lkIElzb01hbmFnZXI6OkNyZWF0ZUJpZyh1aW50OF90IGJpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMgYmlnX3BhcmFtcykgewotICBwaW1wbF8tPmlzb19pbXBsXy0+Y3JlYXRlX2JpZyhiaWdfaWQsIHN0ZDo6bW92ZShiaWdfcGFyYW1zKSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6VGVybWluYXRlQmlnKHVpbnQ4X3QgYmlnX2lkLCB1aW50OF90IHJlYXNvbikgewotICBwaW1wbF8tPmlzb19pbXBsXy0+dGVybWluYXRlX2JpZyhiaWdfaWQsIHJlYXNvbik7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6SGFuZGxlSXNvRGF0YSh2b2lkKiBwX21zZykgewotICBpZiAocGltcGxfLT5Jc1J1bm5pbmcoKSkKLSAgICBwaW1wbF8tPmlzb19pbXBsXy0+aGFuZGxlX2lzb19kYXRhKHN0YXRpY19jYXN0PEJUX0hEUio+KHBfbXNnKSk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6SGFuZGxlRGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIGlmIChwaW1wbF8tPklzUnVubmluZygpKQotICAgIHBpbXBsXy0+aXNvX2ltcGxfLT5kaXNjb25uZWN0aW9uX2NvbXBsZXRlKGhhbmRsZSwgcmVhc29uKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVOdW1Db21wbERhdGFQa3RzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbikgewotICBpZiAocGltcGxfLT5Jc1J1bm5pbmcoKSkKLSAgICBwaW1wbF8tPmlzb19pbXBsXy0+aGFuZGxlX251bV9jb21wbGV0ZWRfcGt0cyhwLCBldnRfbGVuKTsKLX0KLQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVHZE51bUNvbXBsRGF0YVBrdHModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKSB7Ci0gIGlmIChwaW1wbF8tPklzUnVubmluZygpKQotICAgIHBpbXBsXy0+aXNvX2ltcGxfLT5oYW5kbGVfZ2RfbnVtX2NvbXBsZXRlZF9wa3RzKGhhbmRsZSwgY3JlZGl0cyk7Ci19Ci0KLXZvaWQgSXNvTWFuYWdlcjo6SGFuZGxlSGNpRXZlbnQodWludDhfdCBzdWJfY29kZSwgdWludDhfdCogcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgpIHsKLSAgaWYgKHBpbXBsXy0+SXNSdW5uaW5nKCkpCi0gICAgcGltcGxfLT5pc29faW1wbF8tPm9uX2lzb19ldmVudChzdWJfY29kZSwgcGFyYW1zLCBsZW5ndGgpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlN0YXJ0KCkgewotICBpZiAoIXBpbXBsXy0+SXNSdW5uaW5nKCkpCi0gICAgcGltcGxfLT5TdGFydCgpOwotfQotCi12b2lkIElzb01hbmFnZXI6OlN0b3AoKSB7Ci0gIGlmIChwaW1wbF8tPklzUnVubmluZygpKQotICAgIHBpbXBsXy0+U3RvcCgpOwotfQotCi1Jc29NYW5hZ2VyOjp+SXNvTWFuYWdlcigpID0gZGVmYXVsdDsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9pc29faW1wbC5oIGIvc3RhY2svYnRtL2J0bV9pc29faW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI0NWVjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1faXNvX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiYmFzZS9iaW5kLmgiCi0jaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJ0bV9pc29fYXBpLmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaWRlZnMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSBpc29fbWFuYWdlciB7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0lzb0RhdGFJblRzQnRIZHJPZmZzZXQgPSAweDBDOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtJc29IZWFkZXJXaXRoVHNMZW4gPSAxMjsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrSXNvSGVhZGVyV2l0aG91dFRzTGVuID0gODsKLQotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtTdGF0ZUZsYWdzTm9uZSA9IDB4MDA7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1N0YXRlRmxhZ0lzQ29ubmVjdGVkID0gMHgwMTsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrU3RhdGVGbGFnSGFzRGF0YVBhdGhTZXQgPSAweDAyOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtTdGF0ZUZsYWdJc0Jyb2FkY2FzdCA9IDB4MDQ7Ci0KLXN0cnVjdCBpc29fc3luY19pbmZvIHsKLSAgdWludDMyX3QgZmlyc3Rfc3luY190czsKLSAgdWludDE2X3Qgc2VxX25iOwotfTsKLQotc3RydWN0IGlzb19iYXNlIHsKLSAgdW5pb24gewotICAgIHVpbnQ4X3QgY2lnX2lkOwotICAgIHVpbnQ4X3QgYmlnX2hhbmRsZTsKLSAgfTsKLQotICBzdHJ1Y3QgaXNvX3N5bmNfaW5mbyBzeW5jX2luZm87Ci0gIHVpbnQ4X3Qgc3RhdGVfZmxhZ3M7Ci0gIHVpbnQzMl90IHNkdV9pdHY7Ci19OwotCi10eXBlZGVmIGlzb19iYXNlIGlzb19jaXM7Ci10eXBlZGVmIGlzb19iYXNlIGlzb19iaXM7Ci0KLXN0cnVjdCBpc29faW1wbCB7Ci0gIGlzb19pbXBsKCkgewotICAgIGlzb19jcmVkaXRzXyA9IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfaXNvX2J1ZmZlcl9jb3VudCgpOwotICAgIGlzb19idWZmZXJfc2l6ZV8gPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2lzb19kYXRhX3NpemUoKTsKLSAgfQotCi0gIH5pc29faW1wbCgpIHt9Ci0KLSAgdm9pZCBoYW5kbGVfcmVnaXN0ZXJfY2lzX2NhbGxiYWNrcyhDaWdDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIExPR19BU1NFUlQoY2FsbGJhY2tzICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIENJRyBjYWxsYmFja3MiOwotICAgIGNpZ19jYWxsYmFja3NfID0gY2FsbGJhY2tzOwotICB9Ci0KLSAgdm9pZCBoYW5kbGVfcmVnaXN0ZXJfYmlnX2NhbGxiYWNrcyhCaWdDYWxsYmFja3MqIGNhbGxiYWNrcykgewotICAgIExPR19BU1NFUlQoY2FsbGJhY2tzICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIEJJRyBjYWxsYmFja3MiOwotICAgIGJpZ19jYWxsYmFja3NfID0gY2FsbGJhY2tzOwotICB9Ci0KLSAgdm9pZCBvbl9zZXRfY2lnX3BhcmFtcyh1aW50OF90IGNpZ19pZCwgdWludDMyX3Qgc2R1X2l0dl9tdG9zLCB1aW50OF90KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gICAgdWludDhfdCBjaXNfY250OwotICAgIHVpbnQxNl90IGNvbm5faGFuZGxlOwotICAgIGNpZ19jcmVhdGVfY21wbF9ldnQgZXZ0OwotCi0gICAgTE9HX0FTU0VSVChjaWdfY2FsbGJhY2tzXyAhPSBudWxscHRyKSA8PCAiSW52YWxpZCBDSUcgY2FsbGJhY2tzIjsKLSAgICBMT0dfQVNTRVJUKGxlbiA+PSAzKSA8PCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoLiI7Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDgoZXZ0LnN0YXR1cywgc3RyZWFtKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoZXZ0LmNpZ19pZCwgc3RyZWFtKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoY2lzX2NudCwgc3RyZWFtKTsKLQotICAgIHVpbnQ4X3QgZXZ0X2NvZGUgPSBJc0NpZ0tub3duKGNpZ19pZCkgPyBrSXNvRXZlbnRDaWdPblJlY29uZmlndXJlQ21wbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrSXNvRXZlbnRDaWdPbkNyZWF0ZUNtcGw7Ci0KLSAgICBpZiAoZXZ0LnN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgICAgTE9HX0FTU0VSVChsZW4gPj0gKDMpICsgKGNpc19jbnQgKiBzaXplb2YodWludDE2X3QpKSkKLSAgICAgICAgICA8PCAiSW52YWxpZCBDSVMgY291bnQuIjsKLQotICAgICAgLyogUmVtb3ZlIGVudHJpZXMgZm9yIHRoZSByZWNvbmZpZ3VyZWQgQ0lHICovCi0gICAgICBpZiAoZXZ0X2NvZGUgPT0ga0lzb0V2ZW50Q2lnT25SZWNvbmZpZ3VyZUNtcGwpIHsKLSAgICAgICAgYXV0byBjaXNfaXQgPSBjb25uX2hkbF90b19jaXNfbWFwXy5jYmVnaW4oKTsKLSAgICAgICAgd2hpbGUgKGNpc19pdCAhPSBjb25uX2hkbF90b19jaXNfbWFwXy5jZW5kKCkpIHsKLSAgICAgICAgICBpZiAoY2lzX2l0LT5zZWNvbmQtPmNpZ19pZCA9PSBldnQuY2lnX2lkKQotICAgICAgICAgICAgY2lzX2l0ID0gY29ubl9oZGxfdG9fY2lzX21hcF8uZXJhc2UoY2lzX2l0KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICArK2Npc19pdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBldnQuY29ubl9oYW5kbGVzLnJlc2VydmUoY2lzX2NudCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNpc19jbnQ7IGkrKykgewotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNvbm5faGFuZGxlLCBzdHJlYW0pOwotCi0gICAgICAgIGV2dC5jb25uX2hhbmRsZXMucHVzaF9iYWNrKGNvbm5faGFuZGxlKTsKLSAgICAgICAgY29ubl9oZGxfdG9fY2lzX21hcF9bY29ubl9oYW5kbGVdID0gc3RkOjp1bmlxdWVfcHRyPGlzb19jaXM+KAotICAgICAgICAgICAgbmV3IGlzb19jaXMoey5zeW5jX2luZm8gPSB7LmZpcnN0X3N5bmNfdHMgPSAwLCAuc2VxX25iID0gMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmNpZ19pZCA9IGNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdGVfZmxhZ3MgPSBrU3RhdGVGbGFnc05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnNkdV9pdHYgPSBzZHVfaXR2X210b3N9KSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2lnX2NhbGxiYWNrc18tPk9uQ2lnRXZlbnQoZXZ0X2NvZGUsICZldnQpOwotICB9Ci0KLSAgdm9pZCBjcmVhdGVfY2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgc3RydWN0IGlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zKSB7Ci0gICAgTE9HX0FTU0VSVCghSXNDaWdLbm93bihjaWdfaWQpKSA8PCAiSW52YWxpZCBjaWcgLSBhbHJlYWR5IGV4aXN0cy4iOwotCi0gICAgYnRzbmRfaGNpY19zZXRfY2lnX3BhcmFtcygKLSAgICAgICAgY2lnX2lkLCBjaWdfcGFyYW1zLnNkdV9pdHZfbXRvcywgY2lnX3BhcmFtcy5zZHVfaXR2X3N0b20sCi0gICAgICAgIGNpZ19wYXJhbXMuc2NhLCBjaWdfcGFyYW1zLnBhY2tpbmcsIGNpZ19wYXJhbXMuZnJhbWluZywKLSAgICAgICAgY2lnX3BhcmFtcy5tYXhfdHJhbnNfbGF0X3N0b20sIGNpZ19wYXJhbXMubWF4X3RyYW5zX2xhdF9tdG9zLAotICAgICAgICBjaWdfcGFyYW1zLmNpc19jZmdzLnNpemUoKSwgY2lnX3BhcmFtcy5jaXNfY2Zncy5kYXRhKCksCi0gICAgICAgIGJhc2U6OkJpbmRPbmNlKCZpc29faW1wbDo6b25fc2V0X2NpZ19wYXJhbXMsIGJhc2U6OlVucmV0YWluZWQodGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgIGNpZ19pZCwgY2lnX3BhcmFtcy5zZHVfaXR2X210b3MpKTsKLSAgfQotCi0gIHZvaWQgcmVjb25maWd1cmVfY2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfcGFyYW1zIGNpZ19wYXJhbXMpIHsKLSAgICBMT0dfQVNTRVJUKElzQ2lnS25vd24oY2lnX2lkKSkgPDwgIk5vIHN1Y2ggY2lnIjsKLQotICAgIGJ0c25kX2hjaWNfc2V0X2NpZ19wYXJhbXMoCi0gICAgICAgIGNpZ19pZCwgY2lnX3BhcmFtcy5zZHVfaXR2X210b3MsIGNpZ19wYXJhbXMuc2R1X2l0dl9zdG9tLAotICAgICAgICBjaWdfcGFyYW1zLnNjYSwgY2lnX3BhcmFtcy5wYWNraW5nLCBjaWdfcGFyYW1zLmZyYW1pbmcsCi0gICAgICAgIGNpZ19wYXJhbXMubWF4X3RyYW5zX2xhdF9zdG9tLCBjaWdfcGFyYW1zLm1heF90cmFuc19sYXRfbXRvcywKLSAgICAgICAgY2lnX3BhcmFtcy5jaXNfY2Zncy5zaXplKCksIGNpZ19wYXJhbXMuY2lzX2NmZ3MuZGF0YSgpLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmaXNvX2ltcGw6Om9uX3NldF9jaWdfcGFyYW1zLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAotICAgICAgICAgICAgICAgICAgICAgICBjaWdfaWQsIGNpZ19wYXJhbXMuc2R1X2l0dl9tdG9zKSk7Ci0gIH0KLQotICB2b2lkIG9uX3JlbW92ZV9jaWcodWludDhfdCogc3RyZWFtLCB1aW50MTZfdCBsZW4pIHsKLSAgICBjaWdfcmVtb3ZlX2NtcGxfZXZ0IGV2dDsKLQotICAgIExPR19BU1NFUlQoY2lnX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgPDwgIkludmFsaWQgQ0lHIGNhbGxiYWNrcyI7Ci0gICAgTE9HX0FTU0VSVChsZW4gPT0gMikgPDwgIkludmFsaWQgcGFja2V0IGxlbmd0aC4iOwotCi0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5zdGF0dXMsIHN0cmVhbSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5jaWdfaWQsIHN0cmVhbSk7Ci0KLSAgICBpZiAoZXZ0LnN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgewotICAgICAgYXV0byBjaXNfaXQgPSBjb25uX2hkbF90b19jaXNfbWFwXy5jYmVnaW4oKTsKLSAgICAgIHdoaWxlIChjaXNfaXQgIT0gY29ubl9oZGxfdG9fY2lzX21hcF8uY2VuZCgpKSB7Ci0gICAgICAgIGlmIChjaXNfaXQtPnNlY29uZC0+Y2lnX2lkID09IGV2dC5jaWdfaWQpCi0gICAgICAgICAgY2lzX2l0ID0gY29ubl9oZGxfdG9fY2lzX21hcF8uZXJhc2UoY2lzX2l0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICsrY2lzX2l0OwotICAgICAgfQotICAgIH0KLQotICAgIGNpZ19jYWxsYmFja3NfLT5PbkNpZ0V2ZW50KGtJc29FdmVudENpZ09uUmVtb3ZlQ21wbCwgJmV2dCk7Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9jaWcodWludDhfdCBjaWdfaWQpIHsKLSAgICBMT0dfQVNTRVJUKElzQ2lnS25vd24oY2lnX2lkKSkgPDwgIk5vIHN1Y2ggY2lnIjsKLQotICAgIGJ0c25kX2hjaWNfcmVtb3ZlX2NpZyhjaWdfaWQsIGJhc2U6OkJpbmRPbmNlKCZpc29faW1wbDo6b25fcmVtb3ZlX2NpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIH0KLQotICB2b2lkIG9uX3N0YXR1c19lc3RhYmxpc2hfY2lzKAotICAgICAgc3RydWN0IGlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX3BhcmFtcyBjb25uX3BhcmFtcywgdWludDhfdCogc3RyZWFtLAotICAgICAgdWludDE2X3QgbGVuKSB7Ci0gICAgdWludDhfdCBzdGF0dXM7Ci0KLSAgICBMT0dfQVNTRVJUKGxlbiA9PSAyKSA8PCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoOiAiIDw8IGxlbjsKLQotICAgIFNUUkVBTV9UT19VSU5UMTYoc3RhdHVzLCBzdHJlYW0pOwotICAgIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIC8qIFdhaXQgZm9yIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQgZXZlbnQgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gY2lzIDogY29ubl9wYXJhbXMuY29ubl9wYWlycykgewotICAgICAgY2lzX2VzdGFibGlzaF9jbXBsX2V2dCBldnQ7Ci0KLSAgICAgIGV2dC5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICBldnQuY2lzX2Nvbm5faGRsID0gY2lzLmNpc19jb25uX2hhbmRsZTsKLSAgICAgIGV2dC5jaWdfaWQgPSAweEZGOwotICAgICAgY2lnX2NhbGxiYWNrc18tPk9uQ2lzRXZlbnQoa0lzb0V2ZW50Q2lzRXN0YWJsaXNoQ21wbCwgJmV2dCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBlc3RhYmxpc2hfY2lzKHN0cnVjdCBpc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgY29ubl9wYXJhbXMpIHsKLSAgICBmb3IgKGF1dG8mIGVsIDogY29ubl9wYXJhbXMuY29ubl9wYWlycykgewotICAgICAgYXV0byBjaXMgPSBHZXRDaXNJZktub3duKGVsLmNpc19jb25uX2hhbmRsZSk7Ci0gICAgICBMT0dfQVNTRVJUKGNpcykgPDwgIk5vIHN1Y2ggY2lzIjsKLSAgICAgIExPR19BU1NFUlQoIShjaXMtPnN0YXRlX2ZsYWdzICYga1N0YXRlRmxhZ0lzQ29ubmVjdGVkKSkKLSAgICAgICAgICA8PCAiQWxyZWFkeSBjb25uZWN0ZWQiOwotICAgIH0KLSAgICBidHNuZF9oY2ljX2NyZWF0ZV9jaXMoY29ubl9wYXJhbXMuY29ubl9wYWlycy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5fcGFyYW1zLmNvbm5fcGFpcnMuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kT25jZSgmaXNvX2ltcGw6Om9uX3N0YXR1c19lc3RhYmxpc2hfY2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBjb25uX3BhcmFtcykpOwotICB9Ci0KLSAgdm9pZCBkaXNjb25uZWN0X2Npcyh1aW50MTZfdCBjaXNfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICAgIGF1dG8gY2lzID0gR2V0Q2lzSWZLbm93bihjaXNfaGFuZGxlKTsKLSAgICBMT0dfQVNTRVJUKGNpcykgPDwgIk5vIHN1Y2ggY2lzIjsKLSAgICBMT0dfQVNTRVJUKGNpcy0+c3RhdGVfZmxhZ3MgJiBrU3RhdGVGbGFnSXNDb25uZWN0ZWQpIDw8ICJOb3QgY29ubmVjdGVkIjsKLSAgICBibHVldG9vdGg6OmxlZ2FjeTo6aGNpOjpHZXRJbnRlcmZhY2UoKS5EaXNjb25uZWN0KAotICAgICAgICBjaXNfaGFuZGxlLCBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4ocmVhc29uKSk7Ci0gIH0KLQotICB2b2lkIG9uX3NldHVwX2lzb19kYXRhX3BhdGgodWludDhfdCogc3RyZWFtLCB1aW50MTZfdCBsZW4pIHsKLSAgICB1aW50OF90IHN0YXR1czsKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZTsKLQotICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHN0cmVhbSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihjb25uX2hhbmRsZSwgc3RyZWFtKTsKLQotICAgIGlzb19iYXNlKiBpc28gPSBHZXRJc29JZktub3duKGNvbm5faGFuZGxlKTsKLSAgICBpZiAoaXNvID09IG51bGxwdHIpIHsKLSAgICAgIC8qIFRoYXQgY2FuIGhhcHBlbiB3aGVuIEFDTCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgd2hpbGUgSVNPIHBhdGNoIHdhcwotICAgICAgICogY3JlYXRpbmcgKi8KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBjb25uZWN0aW9uIGhhbmRsZTogIiA8PCArY29ubl9oYW5kbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgaXNvLT5zdGF0ZV9mbGFncyB8PSBrU3RhdGVGbGFnSGFzRGF0YVBhdGhTZXQ7Ci0gICAgaWYgKGlzby0+c3RhdGVfZmxhZ3MgJiBrU3RhdGVGbGFnSXNCcm9hZGNhc3QpIHsKLSAgICAgIExPR19BU1NFUlQoYmlnX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgPDwgIkludmFsaWQgQklHIGNhbGxiYWNrcyI7Ci0gICAgICBiaWdfY2FsbGJhY2tzXy0+T25TZXR1cElzb0RhdGFQYXRoKHN0YXR1cywgY29ubl9oYW5kbGUsIGlzby0+YmlnX2hhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19BU1NFUlQoY2lnX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgPDwgIkludmFsaWQgQ0lHIGNhbGxiYWNrcyI7Ci0gICAgICBjaWdfY2FsbGJhY2tzXy0+T25TZXR1cElzb0RhdGFQYXRoKHN0YXR1cywgY29ubl9oYW5kbGUsIGlzby0+Y2lnX2lkKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldHVwX2lzb19kYXRhX3BhdGgoCi0gICAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwKLSAgICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMgcGF0aF9wYXJhbXMpIHsKLSAgICBpc29fYmFzZSogaXNvID0gR2V0SXNvSWZLbm93bihjb25uX2hhbmRsZSk7Ci0gICAgTE9HX0FTU0VSVChpc28gIT0gbnVsbHB0cikgPDwgIk5vIHN1Y2ggaXNvIGNvbm5lY3Rpb246ICIgPDwgK2Nvbm5faGFuZGxlOwotCi0gICAgaWYgKCEoaXNvLT5zdGF0ZV9mbGFncyAmIGtTdGF0ZUZsYWdJc0Jyb2FkY2FzdCkpIHsKLSAgICAgIExPR19BU1NFUlQoaXNvLT5zdGF0ZV9mbGFncyAmIGtTdGF0ZUZsYWdJc0Nvbm5lY3RlZCkKLSAgICAgICAgICA8PCAiQ0lTIG5vdCBlc3RhYmxpc2hlZCI7Ci0gICAgfQotCi0gICAgYnRzbmRfaGNpY19zZXR1cF9pc29fZGF0YV9wYXRoKAotICAgICAgICBjb25uX2hhbmRsZSwgcGF0aF9wYXJhbXMuZGF0YV9wYXRoX2RpciwgcGF0aF9wYXJhbXMuZGF0YV9wYXRoX2lkLAotICAgICAgICBwYXRoX3BhcmFtcy5jb2RlY19pZF9mb3JtYXQsIHBhdGhfcGFyYW1zLmNvZGVjX2lkX2NvbXBhbnksCi0gICAgICAgIHBhdGhfcGFyYW1zLmNvZGVjX2lkX3ZlbmRvciwgcGF0aF9wYXJhbXMuY29udHJvbGxlcl9kZWxheSwKLSAgICAgICAgc3RkOjptb3ZlKHBhdGhfcGFyYW1zLmNvZGVjX2NvbmYpLAotICAgICAgICBiYXNlOjpCaW5kT25jZSgmaXNvX2ltcGw6Om9uX3NldHVwX2lzb19kYXRhX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgfQotCi0gIHZvaWQgb25fcmVtb3ZlX2lzb19kYXRhX3BhdGgodWludDhfdCogc3RyZWFtLCB1aW50MTZfdCBsZW4pIHsKLSAgICB1aW50OF90IHN0YXR1czsKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZTsKLQotICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHN0cmVhbSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihjb25uX2hhbmRsZSwgc3RyZWFtKTsKLQotICAgIGlzb19iYXNlKiBpc28gPSBHZXRJc29JZktub3duKGNvbm5faGFuZGxlKTsKLSAgICBpZiAoaXNvID09IG51bGxwdHIpIHsKLSAgICAgIC8qIFRoYXQgY291bGQgaGFwcGVuIHdoZW4gQUNMIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCB3aGlsZSByZW1vdmluZyBkYXRhCi0gICAgICAgKiBwYXRoICovCi0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIkludmFsaWQgY29ubmVjdGlvbiBoYW5kbGU6ICIgPDwgK2Nvbm5faGFuZGxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIGlzby0+c3RhdGVfZmxhZ3MgJj0gfmtTdGF0ZUZsYWdIYXNEYXRhUGF0aFNldDsKLQotICAgIGlmIChpc28tPnN0YXRlX2ZsYWdzICYga1N0YXRlRmxhZ0lzQnJvYWRjYXN0KSB7Ci0gICAgICBMT0dfQVNTRVJUKGJpZ19jYWxsYmFja3NfICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIEJJRyBjYWxsYmFja3MiOwotICAgICAgYmlnX2NhbGxiYWNrc18tPk9uUmVtb3ZlSXNvRGF0YVBhdGgoc3RhdHVzLCBjb25uX2hhbmRsZSwgaXNvLT5iaWdfaGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX0FTU0VSVChjaWdfY2FsbGJhY2tzXyAhPSBudWxscHRyKSA8PCAiSW52YWxpZCBDSUcgY2FsbGJhY2tzIjsKLSAgICAgIGNpZ19jYWxsYmFja3NfLT5PblJlbW92ZUlzb0RhdGFQYXRoKHN0YXR1cywgY29ubl9oYW5kbGUsIGlzby0+Y2lnX2lkKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9pc29fZGF0YV9wYXRoKHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpcikgewotICAgIGlzb19iYXNlKiBpc28gPSBHZXRJc29JZktub3duKGlzb19oYW5kbGUpOwotICAgIExPR19BU1NFUlQoaXNvICE9IG51bGxwdHIpIDw8ICJObyBzdWNoIGlzbyBjb25uZWN0aW9uIjsKLSAgICBMT0dfQVNTRVJUKChpc28tPnN0YXRlX2ZsYWdzICYga1N0YXRlRmxhZ0hhc0RhdGFQYXRoU2V0KSA9PQotICAgICAgICAgICAgICAga1N0YXRlRmxhZ0hhc0RhdGFQYXRoU2V0KQotICAgICAgICA8PCAiRGF0YSBwYXRoIG5vdCBzZXQiOwotCi0gICAgYnRzbmRfaGNpY19yZW1vdmVfaXNvX2RhdGFfcGF0aCgKLSAgICAgICAgaXNvX2hhbmRsZSwgZGF0YV9wYXRoX2RpciwKLSAgICAgICAgYmFzZTo6QmluZE9uY2UoJmlzb19pbXBsOjpvbl9yZW1vdmVfaXNvX2RhdGFfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgdm9pZCBvbl9pc29fbGlua19xdWFsaXR5X3JlYWQodWludDhfdCogc3RyZWFtLCB1aW50MTZfdCBsZW4pIHsKLSAgICB1aW50OF90IHN0YXR1czsKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZTsKLSAgICB1aW50MzJfdCB0eFVuYWNrZWRQYWNrZXRzOwotICAgIHVpbnQzMl90IHR4Rmx1c2hlZFBhY2tldHM7Ci0gICAgdWludDMyX3QgdHhMYXN0U3ViZXZlbnRQYWNrZXRzOwotICAgIHVpbnQzMl90IHJldHJhbnNtaXR0ZWRQYWNrZXRzOwotICAgIHVpbnQzMl90IGNyY0Vycm9yUGFja2V0czsKLSAgICB1aW50MzJfdCByeFVucmVjZWl2ZWRQYWNrZXRzOwotICAgIHVpbnQzMl90IGR1cGxpY2F0ZVBhY2tldHM7Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBzdHJlYW0pOwotICAgIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBSZWFkIElTTyBMaW5rIFF1YWxpdHksIHN0YXR1czogIgotICAgICAgICAgICAgICAgICA8PCBsb2doZXgoc3RhdHVzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDE2KGNvbm5faGFuZGxlLCBzdHJlYW0pOwotCi0gICAgaXNvX2Jhc2UqIGlzbyA9IEdldElzb0lmS25vd24oY29ubl9oYW5kbGUpOwotICAgIGlmIChpc28gPT0gbnVsbHB0cikgewotICAgICAgLyogVGhhdCBjb3VsZCBoYXBwZW4gd2hlbiBBQ0wgaGFzIGJlZW4gZGlzY29ubmVjdGVkIHdoaWxlIHdhaXRpbmcgb24gdGhlCi0gICAgICAgKiByZWFkIHJlc3Bvc2UgKi8KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBjb25uZWN0aW9uIGhhbmRsZTogIiA8PCArY29ubl9oYW5kbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU1RSRUFNX1RPX1VJTlQzMih0eFVuYWNrZWRQYWNrZXRzLCBzdHJlYW0pOwotICAgIFNUUkVBTV9UT19VSU5UMzIodHhGbHVzaGVkUGFja2V0cywgc3RyZWFtKTsKLSAgICBTVFJFQU1fVE9fVUlOVDMyKHR4TGFzdFN1YmV2ZW50UGFja2V0cywgc3RyZWFtKTsKLSAgICBTVFJFQU1fVE9fVUlOVDMyKHJldHJhbnNtaXR0ZWRQYWNrZXRzLCBzdHJlYW0pOwotICAgIFNUUkVBTV9UT19VSU5UMzIoY3JjRXJyb3JQYWNrZXRzLCBzdHJlYW0pOwotICAgIFNUUkVBTV9UT19VSU5UMzIocnhVbnJlY2VpdmVkUGFja2V0cywgc3RyZWFtKTsKLSAgICBTVFJFQU1fVE9fVUlOVDMyKGR1cGxpY2F0ZVBhY2tldHMsIHN0cmVhbSk7Ci0KLSAgICBMT0dfQVNTRVJUKGNpZ19jYWxsYmFja3NfICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIENJRyBjYWxsYmFja3MiOwotICAgIGNpZ19jYWxsYmFja3NfLT5Pbklzb0xpbmtRdWFsaXR5UmVhZCgKLSAgICAgICAgY29ubl9oYW5kbGUsIGlzby0+Y2lnX2lkLCB0eFVuYWNrZWRQYWNrZXRzLCB0eEZsdXNoZWRQYWNrZXRzLAotICAgICAgICB0eExhc3RTdWJldmVudFBhY2tldHMsIHJldHJhbnNtaXR0ZWRQYWNrZXRzLCBjcmNFcnJvclBhY2tldHMsCi0gICAgICAgIHJ4VW5yZWNlaXZlZFBhY2tldHMsIGR1cGxpY2F0ZVBhY2tldHMpOwotICB9Ci0KLSAgdm9pZCByZWFkX2lzb19saW5rX3F1YWxpdHkodWludDE2X3QgaXNvX2hhbmRsZSkgewotICAgIGlzb19iYXNlKiBpc28gPSBHZXRJc29JZktub3duKGlzb19oYW5kbGUpOwotICAgIGlmIChpc28gPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PF9fZnVuY19fIDw8ICJObyBzdWNoIGlzbyBjb25uZWN0aW9uOiAiIDw8ICtpc29faGFuZGxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJ0c25kX2hjaWNfcmVhZF9pc29fbGlua19xdWFsaXR5KAotICAgICAgICBpc29faGFuZGxlLCBiYXNlOjpCaW5kT25jZSgmaXNvX2ltcGw6Om9uX2lzb19saW5rX3F1YWxpdHlfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICB9Ci0KLSAgQlRfSERSKiBwcmVwYXJlX3RzX2hjaV9wYWNrZXQodWludDE2X3QgaXNvX2hhbmRsZSwgdWludDMyX3QgdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcV9uYiwgdWludDE2X3QgZGF0YV9sZW4pIHsKLSAgICAvKiBBZGQgMiBmb3IgcGFja2V0IHNlcS4sIDIgZm9yIGxlbmd0aCwgNCBmb3IgdGhlIHRpbWVzdGFtcCAqLwotICAgIHVpbnQxNl90IGlzb19kYXRhX2xvYWRfbGVuID0gZGF0YV9sZW4gKyA4OwotCi0gICAgLyogQWRkIDIgZm9yIGhhbmRsZSwgMiBmb3IgbGVuZ3RoICovCi0gICAgdWludDE2X3QgaXNvX2Z1bGxfbGVuID0gaXNvX2RhdGFfbG9hZF9sZW4gKyA0OwotICAgIEJUX0hEUiogcGFja2V0ID0gKEJUX0hEUiopb3NpX21hbGxvYyhpc29fZnVsbF9sZW4gKyBzaXplb2YoQlRfSERSKSk7Ci0gICAgcGFja2V0LT5sZW4gPSBpc29fZnVsbF9sZW47Ci0gICAgcGFja2V0LT5vZmZzZXQgPSAwOwotICAgIHBhY2tldC0+ZXZlbnQgPSBNU0dfU1RBQ0tfVE9fSENfSENJX0lTTzsKLSAgICBwYWNrZXQtPmxheWVyX3NwZWNpZmljID0gMDsKLQotICAgIHVpbnQ4X3QqIHBhY2tldF9kYXRhID0gcGFja2V0LT5kYXRhOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGlzb19oYW5kbGUpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGlzb19kYXRhX2xvYWRfbGVuKTsKLQotICAgIHBhY2tldC0+bGF5ZXJfc3BlY2lmaWMgfD0gQlRfSVNPX0hEUl9DT05UQUlOU19UUzsKLSAgICBVSU5UMzJfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCB0cyk7Ci0KLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBhY2tldF9kYXRhLCBzZXFfbmIpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocGFja2V0X2RhdGEsIGRhdGFfbGVuKTsKLQotICAgIHJldHVybiBwYWNrZXQ7Ci0gIH0KLQotICB2b2lkIHNlbmRfaXNvX2RhdGFfaGNpX3BhY2tldChCVF9IRFIqIHBhY2tldCkgewotICAgIGJ0ZV9tYWluX2hjaV9zZW5kKHBhY2tldCwgTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08gfCAweDAwMDEpOwotICB9Ci0KLSAgdm9pZCBzZW5kX2lzb19kYXRhKHVpbnQxNl90IGlzb19oYW5kbGUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2xlbikgewotICAgIGlzb19iYXNlKiBpc28gPSBHZXRJc29JZktub3duKGlzb19oYW5kbGUpOwotICAgIExPR19BU1NFUlQoaXNvICE9IG51bGxwdHIpCi0gICAgICAgIDw8ICJObyBzdWNoIGlzbyBjb25uZWN0aW9uIGhhbmRsZTogIiA8PCAraXNvX2hhbmRsZTsKLQotICAgIGlmICghKGlzby0+c3RhdGVfZmxhZ3MgJiBrU3RhdGVGbGFnSXNCcm9hZGNhc3QpKSB7Ci0gICAgICBMT0dfQVNTRVJUKGlzby0+c3RhdGVfZmxhZ3MgJiBrU3RhdGVGbGFnSXNDb25uZWN0ZWQpCi0gICAgICAgICAgPDwgIkNJUyBub3QgZXN0YWJsaXNoZWQiOwotICAgIH0KLSAgICBMT0dfQVNTRVJUKGlzby0+c3RhdGVfZmxhZ3MgJiBrU3RhdGVGbGFnSGFzRGF0YVBhdGhTZXQpCi0gICAgICAgIDw8ICJEYXRhIHBhdGggbm90IHNldCBmb3IgaGFuZGxlOiAiIDw8ICtpc29faGFuZGxlOwotCi0gICAgLyogQ2FsY3VsYXRlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIElTTyBkYXRhIHBhY2tldC4KLSAgICAgKiBJdCBzaG91bGQgYmUgaW5jcmVtZW50ZWQgYnkgMSBldmVyeSBTRFUgSW50ZXJ2YWwuCi0gICAgICovCi0gICAgdWludDMyX3QgdHMgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgICBpc28tPnN5bmNfaW5mby5zZXFfbmIgPSAodHMgLSBpc28tPnN5bmNfaW5mby5maXJzdF9zeW5jX3RzKSAvIGlzby0+c2R1X2l0djsKLQotICAgIGlmIChpc29fY3JlZGl0c18gPT0gMCB8fCBkYXRhX2xlbiA+IGlzb19idWZmZXJfc2l6ZV8pIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiLCBkcm9wcGluZyBJU08gcGFja2V0LCBsZW46ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGRhdGFfbGVuKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGlzbyBjcmVkaXRzOiAiIDw8IHN0YXRpY19jYXN0PGludD4oaXNvX2NyZWRpdHNfKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGlzbyBoYW5kbGU6ICIgPDwgbG9naGV4KGlzb19oYW5kbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlzb19jcmVkaXRzXy0tOwotCi0gICAgQlRfSERSKiBwYWNrZXQgPQotICAgICAgICBwcmVwYXJlX3RzX2hjaV9wYWNrZXQoaXNvX2hhbmRsZSwgdHMsIGlzby0+c3luY19pbmZvLnNlcV9uYiwgZGF0YV9sZW4pOwotICAgIG1lbWNweShwYWNrZXQtPmRhdGEgKyBrSXNvRGF0YUluVHNCdEhkck9mZnNldCwgZGF0YSwgZGF0YV9sZW4pOwotICAgIHNlbmRfaXNvX2RhdGFfaGNpX3BhY2tldChwYWNrZXQpOwotICB9Ci0KLSAgdm9pZCBwcm9jZXNzX2Npc19lc3RfcGt0KHVpbnQ4X3QgbGVuLCB1aW50OF90KiBkYXRhKSB7Ci0gICAgY2lzX2VzdGFibGlzaF9jbXBsX2V2dCBldnQ7Ci0KLSAgICBMT0dfQVNTRVJUKGxlbiA9PSAyOCkgPDwgIkludmFsaWQgcGFja2V0IGxlbmd0aCI7Ci0gICAgTE9HX0FTU0VSVChjaWdfY2FsbGJhY2tzXyAhPSBudWxscHRyKSA8PCAiSW52YWxpZCBDSUcgY2FsbGJhY2tzIjsKLQotICAgIFNUUkVBTV9UT19VSU5UOChldnQuc3RhdHVzLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGV2dC5jaXNfY29ubl9oZGwsIGRhdGEpOwotCi0gICAgYXV0byBjaXMgPSBHZXRDaXNJZktub3duKGV2dC5jaXNfY29ubl9oZGwpOwotICAgIExPR19BU1NFUlQoY2lzICE9IG51bGxwdHIpIDw8ICJObyBzdWNoIGNpcyI7Ci0KLSAgICBjaXMtPnN5bmNfaW5mby5maXJzdF9zeW5jX3RzID0gYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX3VzKCk7Ci0KLSAgICBTVFJFQU1fVE9fVUlOVDI0KGV2dC5jaWdfc3luY19kZWxheSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQyNChldnQuY2lzX3N5bmNfZGVsYXksIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UMjQoZXZ0LnRyYW5zX2xhdF9tdG9zLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDI0KGV2dC50cmFuc19sYXRfc3RvbSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5waHlfbXRvcywgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5waHlfc3RvbSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5uc2UsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UOChldnQuYm5fbXRvcywgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5ibl9zdG9tLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoZXZ0LmZ0X210b3MsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UOChldnQuZnRfc3RvbSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihldnQubWF4X3BkdV9tdG9zLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGV2dC5tYXhfcGR1X3N0b20sIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UMTYoZXZ0Lmlzb19pdHYsIGRhdGEpOwotCi0gICAgaWYgKGV2dC5zdGF0dXMgPT0gSENJX1NVQ0NFU1MpIGNpcy0+c3RhdGVfZmxhZ3MgfD0ga1N0YXRlRmxhZ0lzQ29ubmVjdGVkOwotCi0gICAgZXZ0LmNpZ19pZCA9IGNpcy0+Y2lnX2lkOwotICAgIGNpZ19jYWxsYmFja3NfLT5PbkNpc0V2ZW50KGtJc29FdmVudENpc0VzdGFibGlzaENtcGwsICZldnQpOwotICB9Ci0KLSAgdm9pZCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByZWFzb24pIHsKLSAgICAvKiBDaGVjayBpZiB0aGlzIGlzIGFuIElTTyBoYW5kbGUgKi8KLSAgICBhdXRvIGNpcyA9IEdldENpc0lmS25vd24oaGFuZGxlKTsKLSAgICBpZiAoY2lzID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIExPR19BU1NFUlQoY2lnX2NhbGxiYWNrc18gIT0gbnVsbHB0cikgPDwgIkludmFsaWQgQ0lHIGNhbGxiYWNrcyI7Ci0KLSAgICBMT0dfSU5GTygiJXMgZmxhZ3M6ICVkIiwgX19mdW5jX18sICtjaXMtPnN0YXRlX2ZsYWdzKTsKLSAgICBpZiAoY2lzLT5zdGF0ZV9mbGFncyAmIGtTdGF0ZUZsYWdJc0Nvbm5lY3RlZCkgewotICAgICAgY2lzX2Rpc2Nvbm5lY3RlZF9ldnQgZXZ0ID0gewotICAgICAgICAgIC5yZWFzb24gPSByZWFzb24sCi0gICAgICAgICAgLmNpc19jb25uX2hkbCA9IGhhbmRsZSwKLSAgICAgICAgICAuY2lnX2lkID0gY2lzLT5jaWdfaWQsCi0gICAgICB9OwotCi0gICAgICBjaWdfY2FsbGJhY2tzXy0+T25DaXNFdmVudChrSXNvRXZlbnRDaXNEaXNjb25uZWN0ZWQsICZldnQpOwotICAgICAgY2lzLT5zdGF0ZV9mbGFncyAmPSB+a1N0YXRlRmxhZ0lzQ29ubmVjdGVkOwotICAgICAgLyogRGF0YSBwYXRoIGlzIGNvbnNpZGVyZWQgc3RpbGwgdmFsaWQsIGJ1dCBjYW4gYmUgcmVjb25maWd1cmVkIG9ubHkgb25jZQotICAgICAgICogQ0lTIGlzIHJlZXN0YWJsaXNoZWQuCi0gICAgICAgKi8KLSAgICB9Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9udW1fY29tcGxldGVkX3BrdHModWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7Ci0gICAgdWludDhfdCBudW1faGFuZGxlczsKLQotICAgIFNUUkVBTV9UT19VSU5UOChudW1faGFuZGxlcywgcCk7Ci0KLSAgICBMT0dfQVNTRVJUKGV2dF9sZW4gPT0gbnVtX2hhbmRsZXMgKiA0ICsgMSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9oYW5kbGVzOyBpKyspIHsKLSAgICAgIHVpbnQxNl90IGhhbmRsZSwgbnVtX3NlbnQ7Ci0KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYobnVtX3NlbnQsIHApOwotCi0gICAgICBpZiAoKGNvbm5faGRsX3RvX2Npc19tYXBfLmZpbmQoaGFuZGxlKSA9PSBjb25uX2hkbF90b19jaXNfbWFwXy5lbmQoKSkgJiYKLSAgICAgICAgICAoY29ubl9oZGxfdG9fYmlzX21hcF8uZmluZChoYW5kbGUpID09IGNvbm5faGRsX3RvX2Jpc19tYXBfLmVuZCgpKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlzb19jcmVkaXRzXyArPSBudW1fc2VudDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGhhbmRsZV9nZF9udW1fY29tcGxldGVkX3BrdHModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKSB7Ci0gICAgaWYgKChjb25uX2hkbF90b19jaXNfbWFwXy5maW5kKGhhbmRsZSkgPT0gY29ubl9oZGxfdG9fY2lzX21hcF8uZW5kKCkpICYmCi0gICAgICAgIChjb25uX2hkbF90b19iaXNfbWFwXy5maW5kKGhhbmRsZSkgPT0gY29ubl9oZGxfdG9fYmlzX21hcF8uZW5kKCkpKQotICAgICAgcmV0dXJuOwotCi0gICAgaXNvX2NyZWRpdHNfICs9IGNyZWRpdHM7Ci0gIH0KLQotICB2b2lkIHByb2Nlc3NfY3JlYXRlX2JpZ19jbXBsX3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogZGF0YSkgewotICAgIHN0cnVjdCBiaWdfY3JlYXRlX2NtcGxfZXZ0IGV2dDsKLQotICAgIExPR19BU1NFUlQobGVuID49IDE4KSA8PCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoIjsKLSAgICBMT0dfQVNTRVJUKGJpZ19jYWxsYmFja3NfICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIEJJRyBjYWxsYmFja3MiOwotCi0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5zdGF0dXMsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UOChldnQuYmlnX2lkLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDI0KGV2dC5iaWdfc3luY19kZWxheSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQyNChldnQudHJhbnNwb3J0X2xhdGVuY3lfYmlnLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoZXZ0LnBoeSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5uc2UsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UOChldnQuYm4sIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UOChldnQucHRvLCBkYXRhKTsKLSAgICBTVFJFQU1fVE9fVUlOVDgoZXZ0LmlyYywgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihldnQubWF4X3BkdSwgZGF0YSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihldnQuaXNvX2ludGVydmFsLCBkYXRhKTsKLQotICAgIHVpbnQ4X3QgbnVtX2JpczsKLSAgICBTVFJFQU1fVE9fVUlOVDgobnVtX2JpcywgZGF0YSk7Ci0KLSAgICBMT0dfQVNTRVJUKG51bV9iaXMgIT0gMCkgPDwgIkludmFsaWQgYmlzIGNvdW50IjsKLSAgICBMT0dfQVNTRVJUKGxlbiA9PSAoMTggKyBudW1fYmlzICogc2l6ZW9mKHVpbnQxNl90KSkpCi0gICAgICAgIDw8ICJJbnZhbGlkIHBhY2tldCBsZW5ndGgiOwotCi0gICAgdWludDMyX3QgdHMgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfdXMoKTsKLSAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBudW1fYmlzOyArK2kpIHsKLSAgICAgIHVpbnQxNl90IGNvbm5faGFuZGxlOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihjb25uX2hhbmRsZSwgZGF0YSk7Ci0gICAgICBldnQuY29ubl9oYW5kbGVzLnB1c2hfYmFjayhjb25uX2hhbmRsZSk7Ci0gICAgICBMT0dfSU5GTygiIHJlY2VpdmVkIEJJUyBjb25uX2hkbCAlZCIsICtjb25uX2hhbmRsZSk7Ci0KLSAgICAgIGlmIChldnQuc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIGNvbm5faGRsX3RvX2Jpc19tYXBfW2Nvbm5faGFuZGxlXSA9IHN0ZDo6dW5pcXVlX3B0cjxpc29fYmlzPigKLSAgICAgICAgICAgIG5ldyBpc29fYmlzKHsuc3luY19pbmZvID0gey5maXJzdF9zeW5jX3RzID0gdHMsIC5zZXFfbmIgPSAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAuYmlnX2hhbmRsZSA9IGV2dC5iaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXRlX2ZsYWdzID0ga1N0YXRlRmxhZ0lzQnJvYWRjYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIC5zZHVfaXR2ID0gbGFzdF9iaWdfY3JlYXRlX3JlcV9zZHVfaXR2X30pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBiaWdfY2FsbGJhY2tzXy0+T25CaWdFdmVudChrSXNvRXZlbnRCaWdPbkNyZWF0ZUNtcGwsICZldnQpOwotICB9Ci0KLSAgdm9pZCBwcm9jZXNzX3Rlcm1pbmF0ZV9iaWdfY21wbF9wa3QodWludDhfdCBsZW4sIHVpbnQ4X3QqIGRhdGEpIHsKLSAgICBzdHJ1Y3QgYmlnX3Rlcm1pbmF0ZV9jbXBsX2V2dCBldnQ7Ci0KLSAgICBMT0dfQVNTRVJUKGxlbiA9PSAyKSA8PCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoIjsKLSAgICBMT0dfQVNTRVJUKGJpZ19jYWxsYmFja3NfICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIEJJRyBjYWxsYmFja3MiOwotCi0gICAgU1RSRUFNX1RPX1VJTlQ4KGV2dC5iaWdfaWQsIGRhdGEpOwotICAgIFNUUkVBTV9UT19VSU5UOChldnQucmVhc29uLCBkYXRhKTsKLQotICAgIGJvb2wgaXNfa25vd25faGFuZGxlID0gZmFsc2U7Ci0gICAgYXV0byBiaXNfaXQgPSBjb25uX2hkbF90b19iaXNfbWFwXy5jYmVnaW4oKTsKLSAgICB3aGlsZSAoYmlzX2l0ICE9IGNvbm5faGRsX3RvX2Jpc19tYXBfLmNlbmQoKSkgewotICAgICAgaWYgKGJpc19pdC0+c2Vjb25kLT5iaWdfaGFuZGxlID09IGV2dC5iaWdfaWQpIHsKLSAgICAgICAgYmlzX2l0ID0gY29ubl9oZGxfdG9fYmlzX21hcF8uZXJhc2UoYmlzX2l0KTsKLSAgICAgICAgaXNfa25vd25faGFuZGxlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICsrYmlzX2l0OwotICAgICAgfQotICAgIH0KLQotICAgIExPR19BU1NFUlQoaXNfa25vd25faGFuZGxlKSA8PCAiTm8gc3VjaCBiaWciOwotICAgIGJpZ19jYWxsYmFja3NfLT5PbkJpZ0V2ZW50KGtJc29FdmVudEJpZ09uVGVybWluYXRlQ21wbCwgJmV2dCk7Ci0gIH0KLQotICB2b2lkIGNyZWF0ZV9iaWcodWludDhfdCBiaWdfaWQsIHN0cnVjdCBiaWdfY3JlYXRlX3BhcmFtcyBiaWdfcGFyYW1zKSB7Ci0gICAgTE9HX0FTU0VSVCghSXNCaWdLbm93bihiaWdfaWQpKSA8PCAiSW52YWxpZCBiaWcgLSBhbHJlYWR5IGV4aXN0cyI7Ci0KLSAgICBsYXN0X2JpZ19jcmVhdGVfcmVxX3NkdV9pdHZfID0gYmlnX3BhcmFtcy5zZHVfaXR2OwotICAgIGJ0c25kX2hjaWNfY3JlYXRlX2JpZygKLSAgICAgICAgYmlnX2lkLCBiaWdfcGFyYW1zLmFkdl9oYW5kbGUsIGJpZ19wYXJhbXMubnVtX2JpcywgYmlnX3BhcmFtcy5zZHVfaXR2LAotICAgICAgICBiaWdfcGFyYW1zLm1heF9zZHVfc2l6ZSwgYmlnX3BhcmFtcy5tYXhfdHJhbnNwb3J0X2xhdGVuY3ksCi0gICAgICAgIGJpZ19wYXJhbXMucnRuLCBiaWdfcGFyYW1zLnBoeSwgYmlnX3BhcmFtcy5wYWNraW5nLCBiaWdfcGFyYW1zLmZyYW1pbmcsCi0gICAgICAgIGJpZ19wYXJhbXMuZW5jLCBiaWdfcGFyYW1zLmVuY19jb2RlKTsKLSAgfQotCi0gIHZvaWQgdGVybWluYXRlX2JpZyh1aW50OF90IGJpZ19pZCwgdWludDhfdCByZWFzb24pIHsKLSAgICBMT0dfQVNTRVJUKElzQmlnS25vd24oYmlnX2lkKSkgPDwgIk5vIHN1Y2ggYmlnIjsKLQotICAgIGJ0c25kX2hjaWNfdGVybV9iaWcoYmlnX2lkLCByZWFzb24pOwotICB9Ci0KLSAgdm9pZCBvbl9pc29fZXZlbnQodWludDhfdCBjb2RlLCB1aW50OF90KiBwYWNrZXQsIHVpbnQxNl90IHBhY2tldF9sZW4pIHsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgIGNhc2UgSENJX0JMRV9DSVNfRVNUX0VWVDoKLSAgICAgICAgcHJvY2Vzc19jaXNfZXN0X3BrdChwYWNrZXRfbGVuLCBwYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSENJX0JMRV9DUkVBVEVfQklHX0NQTF9FVlQ6Ci0gICAgICAgIHByb2Nlc3NfY3JlYXRlX2JpZ19jbXBsX3BrdChwYWNrZXRfbGVuLCBwYWNrZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSENJX0JMRV9URVJNX0JJR19DUExfRVZUOgotICAgICAgICBwcm9jZXNzX3Rlcm1pbmF0ZV9iaWdfY21wbF9wa3QocGFja2V0X2xlbiwgcGFja2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhDSV9CTEVfQ0lTX1JFUV9FVlQ6Ci0gICAgICAgIC8qIE5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhDSV9CTEVfQklHX1NZTkNfRVNUX0VWVDoKLSAgICAgICAgLyogTm90IHN1cHBvcnRlZCAqLwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSENJX0JMRV9CSUdfU1lOQ19MT1NUX0VWVDoKLSAgICAgICAgLyogTm90IHN1cHBvcnRlZCAqLwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19FUlJPUigiVW5oYW5kbGVkIGV2ZW50IGNvZGUgJWQiLCArY29kZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBoYW5kbGVfaXNvX2RhdGEoQlRfSERSKiBwX21zZykgewotICAgIGNvbnN0IHVpbnQ4X3QqIHN0cmVhbSA9IHBfbXNnLT5kYXRhOwotICAgIGNpc19kYXRhX2V2dCBldnQ7Ci0gICAgdWludDE2X3QgaGFuZGxlLCBzZXFfbmI7Ci0KLSAgICBpZiAocF9tc2ctPmxlbiA8PSAoKHBfbXNnLT5sYXllcl9zcGVjaWZpYyAmIEJUX0lTT19IRFJfQ09OVEFJTlNfVFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IGtJc29IZWFkZXJXaXRoVHNMZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0lzb0hlYWRlcldpdGhvdXRUc0xlbikpCi0gICAgICByZXR1cm47Ci0KLSAgICBMT0dfQVNTRVJUKGNpZ19jYWxsYmFja3NfICE9IG51bGxwdHIpIDw8ICJJbnZhbGlkIENJRyBjYWxsYmFja3MiOwotCi0gICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHN0cmVhbSk7Ci0gICAgZXZ0LmNpc19jb25uX2hkbCA9IEhDSURfR0VUX0hBTkRMRShoYW5kbGUpOwotCi0gICAgaXNvX2Jhc2UqIGlzbyA9IEdldENpc0lmS25vd24oZXZ0LmNpc19jb25uX2hkbCk7Ci0gICAgaWYgKGlzbyA9PSBudWxscHRyKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIsIHJlY2VpdmVkIGRhdGEgZm9yIHRoZSBub24tcmVnaXN0ZXJlZCBDSVMhIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTVFJFQU1fU0tJUF9VSU5UMTYoc3RyZWFtKTsKLSAgICBpZiAocF9tc2ctPmxheWVyX3NwZWNpZmljICYgQlRfSVNPX0hEUl9DT05UQUlOU19UUykKLSAgICAgIFNUUkVBTV9UT19VSU5UMzIoZXZ0LnRzLCBzdHJlYW0pOwotCi0gICAgU1RSRUFNX1RPX1VJTlQxNihzZXFfbmIsIHN0cmVhbSk7Ci0KLSAgICB1aW50MzJfdCB0cyA9IGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV91cygpOwotICAgIHVpbnQzMl90IG5ld19jYWxjX3NlcV9uYiA9Ci0gICAgICAgICh0cyAtIGlzby0+c3luY19pbmZvLmZpcnN0X3N5bmNfdHMpIC8gaXNvLT5zZHVfaXR2OwotICAgIGlmIChuZXdfY2FsY19zZXFfbmIgPD0gaXNvLT5zeW5jX2luZm8uc2VxX25iKQotICAgICAgbmV3X2NhbGNfc2VxX25iID0gaXNvLT5zeW5jX2luZm8uc2VxX25iICsgMTsKLQotICAgIGlmIChpc28tPnN5bmNfaW5mby5zZXFfbmIgPT0gMCkgewotICAgICAgZXZ0LmV2dF9sb3N0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgZXZ0LmV2dF9sb3N0ID0gbmV3X2NhbGNfc2VxX25iIC0gaXNvLT5zeW5jX2luZm8uc2VxX25iIC0gMTsKLSAgICAgIGlmIChldnQuZXZ0X2xvc3QgPiAwKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCBldnQuZXZ0X2xvc3QgPDwgIiBwYWNrZXRzIHBvc3NpYmx5IGxvc3QuIjsKLSAgICAgIH0KLQotICAgICAgaWYgKG5ld19jYWxjX3NlcV9uYiAhPSBzZXFfbmIpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTZXF1ZW5jZSBudW1iZXIgbWlzbWF0Y2guICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJBZGp1c3Rpbmcgb3duIHRpbWUgcmVmZXJlbmNlIHBvaW50LiI7Ci0gICAgICAgIGlzby0+c3luY19pbmZvLmZpcnN0X3N5bmNfdHMgPSB0cyAtIChzZXFfbmIgKiBpc28tPnNkdV9pdHYpOwotICAgICAgICBuZXdfY2FsY19zZXFfbmIgPSBzZXFfbmI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlzby0+c3luY19pbmZvLnNlcV9uYiA9IG5ld19jYWxjX3NlcV9uYjsKLQotICAgIGV2dC5wX21zZyA9IHBfbXNnOwotICAgIGV2dC5jaWdfaWQgPSBpc28tPmNpZ19pZDsKLSAgICBjaWdfY2FsbGJhY2tzXy0+T25DaXNFdmVudChrSXNvRXZlbnRDaXNEYXRhQXZhaWxhYmxlLCAmZXZ0KTsKLSAgfQotCi0gIGlzb19jaXMqIEdldENpc0lmS25vd24odWludDE2X3QgY2lzX2Nvbm5faGFuZGxlKSB7Ci0gICAgYXV0byBjaXNfaXQgPSBjb25uX2hkbF90b19jaXNfbWFwXy5maW5kKGNpc19jb25uX2hhbmRsZSk7Ci0gICAgcmV0dXJuIChjaXNfaXQgIT0gY29ubl9oZGxfdG9fY2lzX21hcF8uZW5kKCkpID8gY2lzX2l0LT5zZWNvbmQuZ2V0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotICB9Ci0KLSAgaXNvX2JpcyogR2V0QmlzSWZLbm93bih1aW50MTZfdCBiaXNfY29ubl9oYW5kbGUpIHsKLSAgICBhdXRvIGJpc19pdCA9IGNvbm5faGRsX3RvX2Jpc19tYXBfLmZpbmQoYmlzX2Nvbm5faGFuZGxlKTsKLSAgICByZXR1cm4gKGJpc19pdCAhPSBjb25uX2hkbF90b19iaXNfbWFwXy5lbmQoKSkgPyBiaXNfaXQtPnNlY29uZC5nZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gIH0KLQotICBpc29fYmFzZSogR2V0SXNvSWZLbm93bih1aW50MTZfdCBpc29faGFuZGxlKSB7Ci0gICAgc3RydWN0IGlzb19iYXNlKiBpc28gPSBHZXRDaXNJZktub3duKGlzb19oYW5kbGUpOwotICAgIHJldHVybiAoaXNvICE9IG51bGxwdHIpID8gaXNvIDogR2V0QmlzSWZLbm93bihpc29faGFuZGxlKTsKLSAgfQotCi0gIGJvb2wgSXNDaWdLbm93bih1aW50OF90IGNpZ19pZCkgY29uc3QgewotICAgIGF1dG8gY29uc3QgY2lzX2l0ID0KLSAgICAgICAgc3RkOjpmaW5kX2lmKGNvbm5faGRsX3RvX2Npc19tYXBfLmNiZWdpbigpLCBjb25uX2hkbF90b19jaXNfbWFwXy5jZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICBbJmNpZ19pZF0oYXV0byYga3ZfcGFpcikgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGt2X3BhaXIuc2Vjb25kLT5jaWdfaWQgPT0gY2lnX2lkKTsKLSAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIHJldHVybiAoY2lzX2l0ICE9IGNvbm5faGRsX3RvX2Npc19tYXBfLmNlbmQoKSk7Ci0gIH0KLQotICBib29sIElzQmlnS25vd24odWludDhfdCBiaWdfaWQpIGNvbnN0IHsKLSAgICBhdXRvIGJpc19pdCA9Ci0gICAgICAgIHN0ZDo6ZmluZF9pZihjb25uX2hkbF90b19iaXNfbWFwXy5jYmVnaW4oKSwgY29ubl9oZGxfdG9fYmlzX21hcF8uY2VuZCgpLAotICAgICAgICAgICAgICAgICAgICAgWyZiaWdfaWRdKGF1dG8mIGt2X3BhaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChrdl9wYWlyLnNlY29uZC0+YmlnX2hhbmRsZSA9PSBiaWdfaWQpOwotICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIChiaXNfaXQgIT0gY29ubl9oZGxfdG9fYmlzX21hcF8uY2VuZCgpKTsKLSAgfQotCi0gIHN0ZDo6bWFwPHVpbnQxNl90LCBzdGQ6OnVuaXF1ZV9wdHI8aXNvX2Npcz4+IGNvbm5faGRsX3RvX2Npc19tYXBfOwotICBzdGQ6Om1hcDx1aW50MTZfdCwgc3RkOjp1bmlxdWVfcHRyPGlzb19iaXM+PiBjb25uX2hkbF90b19iaXNfbWFwXzsKLQotICB1aW50MTZfdCBpc29fY3JlZGl0c187Ci0gIHVpbnQxNl90IGlzb19idWZmZXJfc2l6ZV87Ci0gIHVpbnQzMl90IGxhc3RfYmlnX2NyZWF0ZV9yZXFfc2R1X2l0dl87Ci0KLSAgQ2lnQ2FsbGJhY2tzKiBjaWdfY2FsbGJhY2tzXyA9IG51bGxwdHI7Ci0gIEJpZ0NhbGxiYWNrcyogYmlnX2NhbGxiYWNrc18gPSBudWxscHRyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlzb19tYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgaGNpCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX21haW4uY2MgYi9zdGFjay9idG0vYnRtX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDQ1NjAuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGJ0bSBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKiBHbG9iYWwgQlRNIGNvbnRyb2wgYmxvY2sgc3RydWN0dXJlCi0qLwotdEJUTV9DQiBidG1fY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1faW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgQlRNIHN0YXJ0dXAgdG8gYWxsb2NhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgKGlmIHVzaW5nIGR5bmFtaWMgbWVtb3J5KSwgYW5kIGluaXRpYWxpemVzIHRoZQotICogICAgICAgICAgICAgICAgICB0cmFjaW5nIGxldmVsLiAgSXQgdGhlbiBpbml0aWFsaXplcyB0aGUgdmFyaW91cyBjb21wb25lbnRzCi0gKiAgICAgICAgICAgICAgICAgIG9mIGJ0bS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1faW5pdCh2b2lkKSB7Ci0gIGJ0bV9jYi5Jbml0KHN0YWNrX2NvbmZpZ19nZXRfaW50ZXJmYWNlKCktPmdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSgpCi0gICAgICAgICAgICAgICAgICA/IEJUTV9TRUNfTU9ERV9TQwotICAgICAgICAgICAgICAgICAgOiBCVE1fU0VDX01PREVfU1ApOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZnJlZSBkeW5hbWljIG1lbW9yeSBhbmQgc3lzdGVtIHJlc291cmNlIGFsbG9jYXRlZCBieSBidG1faW5pdCAqLwotdm9pZCBidG1fZnJlZSh2b2lkKSB7Ci0gIGJ0bV9jYi5GcmVlKCk7Ci19Ci0KLWNvbnN0ZXhwciBzaXplX3Qga01heExvZ0hpc3RvcnlUYWdMZW5ndGggPSA2OwotY29uc3RleHByIHNpemVfdCBrTWF4TG9nSGlzdG9yeU1zZ0xlbmd0aCA9IDI1OwotCi1zdGF0aWMgdm9pZCBidG1fbG9nX2hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywgY29uc3QgY2hhciogYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnLCBjb25zdCBzdGQ6OnN0cmluZyYgZXh0cmEpIHsKLSAgYnRtX2NiLmhpc3RvcnlfLT5QdXNoKAotICAgICAgIiUtNnMgJS0yNXM6ICVzICVzIiwgdGFnLnN1YnN0cigwLCBrTWF4TG9nSGlzdG9yeVRhZ0xlbmd0aCkuY19zdHIoKSwKLSAgICAgIG1zZy5zdWJzdHIoMCwga01heExvZ0hpc3RvcnlNc2dMZW5ndGgpLmNfc3RyKCksIGFkZHIsIGV4dHJhLmNfc3RyKCkpOwotfQotCi12b2lkIEJUTV9Mb2dIaXN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0YWcsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2csIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRyYSkgewotICBidG1fbG9nX2hpc3RvcnkodGFnLCBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIG1zZywgZXh0cmEpOwotfQotCi12b2lkIEJUTV9Mb2dIaXN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0YWcsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKLSAgQlRNX0xvZ0hpc3RvcnkodGFnLCBiZF9hZGRyLCBtc2csIHN0ZDo6c3RyaW5nKCkpOwotfQotCi12b2lkIEJUTV9Mb2dIaXN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0YWcsIGNvbnN0IHRCTEVfQkRfQUREUiYgYmxlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2csIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRyYSkgewotICBidG1fbG9nX2hpc3RvcnkodGFnLCBQUklWQVRFX0FERFJFU1MoYmxlX2JkX2FkZHIpLCBtc2csIGV4dHJhKTsKLX0KLQotdm9pZCBCVE1fTG9nSGlzdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgdGFnLCBjb25zdCB0QkxFX0JEX0FERFImIGJsZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7Ci0gIEJUTV9Mb2dIaXN0b3J5KHRhZywgYmxlX2JkX2FkZHIsIG1zZywgc3RkOjpzdHJpbmcoKSk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX3Njbi5jYyBiL3N0YWNrL2J0bS9idG1fc2NuLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWFjNjc2Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fc2NuLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidG0iCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiICAvLyB0QlRNX0NCCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9yZmNkZWZzLmgiICAgIC8vIFBPUlRfTUFYX1JGQ19QT1JUUwotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQWxsb2NhdGVTQ04KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgdGhyb3VnaCB0aGUgU2VydmVyIENoYW5uZWwgTnVtYmVycyBmb3IgYSBmcmVlIG9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFsbG9jYXRlZCBTQ04gbnVtYmVyIG9yIDAgaWYgbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVE1fQWxsb2NhdGVTQ04odm9pZCkgewotICB1aW50OF90IHg7Ci0gIEJUTV9UUkFDRV9ERUJVRygiQlRNX0FsbG9jYXRlU0NOIik7Ci0KLSAgLy8gc3RhY2sgcmVzZXJ2ZXMgc2NuIDEgZm9yIEhGUCwgSFNQIHdlIHN0aWxsIGRvIHRoZSBjb3JyZWN0IHdheQotICBmb3IgKHggPSAxOyB4IDwgUE9SVF9NQVhfUkZDX1BPUlRTOyB4KyspIHsKLSAgICBpZiAoIWJ0bV9jYi5idG1fc2NuW3hdKSB7Ci0gICAgICBidG1fY2IuYnRtX3Njblt4XSA9IHRydWU7Ci0gICAgICByZXR1cm4gKHggKyAxKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKDApOyAvKiBObyBmcmVlIHBvcnRzICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fVHJ5QWxsb2NhdGVTQ04KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRyeSB0byBhbGxvY2F0ZSBhIGZpeGVkIHNlcnZlciBjaGFubmVsCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIHRydWUgaWYgc2VydmVyIGNoYW5uZWwgd2FzIGF2YWlsYWJsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgQlRNX1RyeUFsbG9jYXRlU0NOKHVpbnQ4X3Qgc2NuKSB7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgbWF4IHBvcnQgcmFuZ2UuCi0gICAqIFN0YWNrIHJlc2VydmVzIHNjbiAxIGZvciBIRlAsIEhTUCB3ZSBzdGlsbCBkbyB0aGUgY29ycmVjdCB3YXkuCi0gICAqLwotICBpZiAoKHNjbiA+PSBQT1JUX01BWF9SRkNfUE9SVFMpIHx8IChzY24gPT0gMSkgfHwgKHNjbiA9PSAwKSkgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGNoZWNrIGlmIHRoaXMgcG9ydCBpcyBhdmFpbGFibGUgKi8KLSAgaWYgKCFidG1fY2IuYnRtX3NjbltzY24gLSAxXSkgewotICAgIGJ0bV9jYi5idG1fc2NuW3NjbiAtIDFdID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiAoZmFsc2UpOyAvKiBQb3J0IHdhcyBidXN5ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fRnJlZVNDTgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRnJlZSB0aGUgc3BlY2lmaWVkIFNDTi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgb3IgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fRnJlZVNDTih1aW50OF90IHNjbikgewotICBCVE1fVFJBQ0VfREVCVUcoIkJUTV9GcmVlU0NOICIpOwotICBpZiAoc2NuIDw9IFBPUlRfTUFYX1JGQ19QT1JUUyAmJiBzY24gPiAwKSB7Ci0gICAgYnRtX2NiLmJ0bV9zY25bc2NuIC0gMV0gPSBmYWxzZTsKLSAgICByZXR1cm4gKHRydWUpOwotICB9IGVsc2UgewotICAgIHJldHVybiAoZmFsc2UpOyAvKiBJbGxlZ2FsIFNDTiBwYXNzZWQgaW4gKi8KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9zY24uaCBiL3N0YWNrL2J0bS9idG1fc2NuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWRjYjcuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9zY24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotYm9vbCBCVE1fRnJlZVNDTih1aW50OF90IHNjbik7Ci1ib29sIEJUTV9UcnlBbGxvY2F0ZVNDTih1aW50OF90IHNjbik7Ci1ib29sIEJUTV9UcnlBbGxvY2F0ZVNDTih1aW50OF90IHNjbik7CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX3Njby5jYyBiL3N0YWNrL2J0bS9idG1fc2NvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFlMWVhLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9idG1fc2NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAwLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgU0NPIGNvbm5lY3Rpb25zLiBUaGlzIGluY2x1ZGVzCi0gKiAgb3BlcmF0aW9ucyBzdWNoIGFzIGNvbm5lY3QsIGRpc2Nvbm5lY3QsIGNoYW5nZSBzdXBwb3J0ZWQgcGFja2V0IHR5cGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9zZWN1cml0eV9kZXZpY2VfcmVjb3JkLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi1uYW1lc3BhY2UgewotY29uc3RleHByIGNoYXIga0J0bUxvZ1RhZ1tdID0gIlNDTyI7Ci0KLWNvbnN0IGJsdWV0b290aDo6bGVnYWN5OjpoY2k6OkludGVyZmFjZSYgR2V0TGVnYWN5SGNpSW50ZXJmYWNlKCkgewotICByZXR1cm4gYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6R2V0SW50ZXJmYWNlKCk7Ci19Ci0KLX07ICAvLyBuYW1lc3BhY2UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgTCBPIEMgQSBMICAgIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBNQUNST3MgdG8gY29udmVydCBmcm9tIFNDTyBwYWNrZXQgdHlwZXMgbWFzayB0byBFU0NPIGFuZCBiYWNrICovCi0jZGVmaW5lIEJUTV9TQ09fUEtUX1RZUEVfTUFTSyBcCi0gIChIQ0lfUEtUX1RZUEVTX01BU0tfSFYxIHwgSENJX1BLVF9UWVBFU19NQVNLX0hWMiB8IEhDSV9QS1RfVFlQRVNfTUFTS19IVjMpCi0KLS8qIE1hc2sgZGVmaW5pbmcgb25seSB0aGUgU0NPIHR5cGVzIG9mIGFuIGVzY28gcGFja2V0IHR5cGUgKi8KLSNkZWZpbmUgQlRNX0VTQ09fUEtUX1RZUEVfTUFTSyBcCi0gIChFU0NPX1BLVF9UWVBFU19NQVNLX0hWMSB8IEVTQ09fUEtUX1RZUEVTX01BU0tfSFYyIHwgRVNDT19QS1RfVFlQRVNfTUFTS19IVjMpCi0KLSNkZWZpbmUgQlRNX0VTQ09fMl9TQ08oZXNjb3R5cGUpIFwKLSAgKCh1aW50MTZfdCkoKChlc2NvdHlwZSkmQlRNX0VTQ09fUEtUX1RZUEVfTUFTSykgPDwgNSkpCi0KLS8qIERlZmluZSBtYXNrcyBmb3Igc3VwcG9ydGVkIGFuZCBleGNlcHRpb24gMi4wIFNDTyBwYWNrZXQgdHlwZXMKLSAqLwotI2RlZmluZSBCVE1fU0NPX1NVUFBPUlRFRF9QS1RTX01BU0sgICAgICAgICAgICAgICAgICAgIFwKLSAgKEVTQ09fUEtUX1RZUEVTX01BU0tfSFYxIHwgRVNDT19QS1RfVFlQRVNfTUFTS19IVjIgfCBcCi0gICBFU0NPX1BLVF9UWVBFU19NQVNLX0hWMyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfRVYzIHwgXAotICAgRVNDT19QS1RfVFlQRVNfTUFTS19FVjQgfCBFU0NPX1BLVF9UWVBFU19NQVNLX0VWNSkKLQotI2RlZmluZSBCVE1fU0NPX0VYQ0VQVElPTl9QS1RTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChFU0NPX1BLVF9UWVBFU19NQVNLX05PXzJfRVYzIHwgRVNDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWMyB8IFwKLSAgIEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgfCBFU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVY1KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICBMIE8gQyBBIEwgICAgRiBVIE4gQyBUIEkgTyBOICAgICBQIFIgTyBUIE8gVCBZIFAgRSBTICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUTV9TVEFUVVMgQlRNX0NoYW5nZUVTY29MaW5rUGFybXModWludDE2X3Qgc2NvX2lueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NIR19FU0NPX1BBUkFNUyogcF9wYXJtcyk7Ci0KLXN0YXRpYyB1aW50MTZfdCBidG1fc2NvX3ZvaWNlX3NldHRpbmdzX3RvX2xlZ2FjeShlbmhfZXNjb19wYXJhbXNfdCogcF9wYXJtcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZXNjb19jb25uX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXB0IG9mIGFuIChlKVNDTyBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgZXZlbnQgKEJUTV9FU0NPX0NPTk5fUkVRX0VWVCkgdG8gYWNjZXB0IG9yIHJlamVjdAotICogICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdC4gUGFyYW1ldGVycyB1c2VkIHRvIG5lZ290aWF0ZSBlU0NPIGxpbmtzLgotICogICAgICAgICAgICAgICAgICBJZiBwX3Bhcm1zIGlzIE5VTEwsIHRoZW4gZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBsaW5rIHR5cGUgb2YgdGhlIGluY29taW5nIHJlcXVlc3QgaXMgU0NPLCB0aGVuIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgdGhlIHR4X2J3LCBtYXhfbGF0ZW5jeSwgY29udGVudCBmb3JtYXQsIGFuZCBwYWNrZXRfdHlwZXMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIHZhbGlkLiAgVGhlIGhjaV9zdGF0dXMgcGFyYW1ldGVyIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAoWzB4MF0gdG8gYWNjZXB0LCBbMHgwZC4uMHgwZl0gdG8gcmVqZWN0KQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fZXNjb19jb25uX3JzcCh1aW50MTZfdCBzY29faW54LCB1aW50OF90IGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhfZXNjb19wYXJhbXNfdCogcF9wYXJtcykgewotICB0U0NPX0NPTk4qIHBfc2NvID0gTlVMTDsKLQotICBpZiAoQlRNX01BWF9TQ09fTElOS1MgPT0gMCkgcmV0dXJuOwotCi0gIGlmIChzY29faW54IDwgQlRNX01BWF9TQ09fTElOS1MpIHBfc2NvID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiW3Njb19pbnhdOwotCi0gIC8qIFJlamVjdCB0aGUgY29ubmVjdCByZXF1ZXN0IGlmIHJlZnVzZWQgYnkgY2FsbGVyIG9yIHdyb25nIHN0YXRlICovCi0gIGlmIChoY2lfc3RhdHVzICE9IEhDSV9TVUNDRVNTIHx8IHBfc2NvID09IE5VTEwpIHsKLSAgICBpZiAocF9zY28pIHsKLSAgICAgIHBfc2NvLT5zdGF0ZSA9IChwX3Njby0+c3RhdGUgPT0gU0NPX1NUX1c0X0NPTk5fUlNQKSA/IFNDT19TVF9MSVNURU5JTkcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNDT19TVF9VTlVTRUQ7Ci0gICAgfQotICAgIGlmICghYnRtX2NiLnNjb19jYi5lc2NvX3N1cHBvcnRlZCkgewotICAgICAgYnRzbmRfaGNpY19yZWplY3RfY29ubihiZGEsIGhjaV9zdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBidHNuZF9oY2ljX3JlamVjdF9lc2NvX2Nvbm4oYmRhLCBoY2lfc3RhdHVzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogQ29ubmVjdGlvbiBpcyBiZWluZyBhY2NlcHRlZCAqLwotICAgIHBfc2NvLT5zdGF0ZSA9IFNDT19TVF9DT05ORUNUSU5HOwotICAgIGVuaF9lc2NvX3BhcmFtc190KiBwX3NldHVwID0gJnBfc2NvLT5lc2NvLnNldHVwOwotICAgIC8qIElmIHBhcmFtZXRlcnMgbm90IHNwZWNpZmllZCB1c2UgdGhlIGRlZmF1bHQgKi8KLSAgICBpZiAocF9wYXJtcykgewotICAgICAgKnBfc2V0dXAgPSAqcF9wYXJtczsKLSAgICB9IGVsc2UgewotICAgICAgLyogVXNlIHRoZSBsYXN0IHNldHVwIHBhc3NlZCB0aHJ1IEJUTV9TZXRFc2NvTW9kZSAob3IgZGVmYXVsdHMpICovCi0gICAgICAqcF9zZXR1cCA9IGJ0bV9jYi5zY29fY2IuZGVmX2VzY29fcGFybXM7Ci0gICAgfQotCi0gICAgLyogVXNlIEVuaGFuY2VkIFN5bmNocm9ub3VzIGNvbW1hbmRzIGlmIHN1cHBvcnRlZCAqLwotICAgIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKQotICAgICAgICAgICAgLT5zdXBwb3J0c19lbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uKCkpIHsKLSAgICAgIC8qIFVzZSB0aGUgc2F2ZWQgU0NPIHJvdXRpbmcgKi8KLSAgICAgIHBfc2V0dXAtPmlucHV0X2RhdGFfcGF0aCA9IHBfc2V0dXAtPm91dHB1dF9kYXRhX3BhdGggPSBFU0NPX0RBVEFfUEFUSDsKLQotICAgICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAgICIlczogdHhidyAweCV4LCByeGJ3IDB4JXgsIGxhdCAweCV4LCByZXRyYW5zIDB4JTAyeCwgIgotICAgICAgICAgICJwa3QgMHglMDR4LCBwYXRoICV1IiwKLSAgICAgICAgICBfX2Z1bmNfXywgcF9zZXR1cC0+dHJhbnNtaXRfYmFuZHdpZHRoLCBwX3NldHVwLT5yZWNlaXZlX2JhbmR3aWR0aCwKLSAgICAgICAgICBwX3NldHVwLT5tYXhfbGF0ZW5jeV9tcywgcF9zZXR1cC0+cmV0cmFuc21pc3Npb25fZWZmb3J0LAotICAgICAgICAgIHBfc2V0dXAtPnBhY2tldF90eXBlcywgcF9zZXR1cC0+aW5wdXRfZGF0YV9wYXRoKTsKLQotICAgICAgYnRzbmRfaGNpY19lbmhhbmNlZF9hY2NlcHRfc3luY2hyb25vdXNfY29ubmVjdGlvbihiZGEsIHBfc2V0dXApOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFVzZSBsZWdhY3kgY29tbWFuZCBpZiBlbmhhbmNlZCBTQ08gc2V0dXAgaXMgbm90IHN1cHBvcnRlZCAqLwotICAgICAgdWludDE2X3Qgdm9pY2VfY29udGVudF9mb3JtYXQgPSBidG1fc2NvX3ZvaWNlX3NldHRpbmdzX3RvX2xlZ2FjeShwX3NldHVwKTsKLSAgICAgIGJ0c25kX2hjaWNfYWNjZXB0X2VzY29fY29ubigKLSAgICAgICAgICBiZGEsIHBfc2V0dXAtPnRyYW5zbWl0X2JhbmR3aWR0aCwgcF9zZXR1cC0+cmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgICAgcF9zZXR1cC0+bWF4X2xhdGVuY3lfbXMsIHZvaWNlX2NvbnRlbnRfZm9ybWF0LAotICAgICAgICAgIHBfc2V0dXAtPnJldHJhbnNtaXNzaW9uX2VmZm9ydCwgcF9zZXR1cC0+cGFja2V0X3R5cGVzKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gUmV0dXJuIHRoZSBhY3RpdmUgKGZpcnN0IGNvbm5lY3RlZCkgU0NPIGNvbm5lY3Rpb24gYmxvY2sKLXN0YXRpYyB0U0NPX0NPTk4qIGJ0bV9nZXRfYWN0aXZlX3NjbygpIHsKLSAgZm9yIChhdXRvJiBsaW5rIDogYnRtX2NiLnNjb19jYi5zY29fZGIpIHsKLSAgICBpZiAobGluay5zdGF0ZSA9PSBTQ09fU1RfQ09OTkVDVEVEKSB7Ci0gICAgICByZXR1cm4gJmxpbms7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3JvdXRlX3Njb19kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSb3V0ZSByZWNlaXZlZCBTQ08gZGF0YS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcm91dGVfc2NvX2RhdGEoQlRfSERSKiBwX21zZykgewotICBpZiAocF9tc2ctPmxlbiA8IDMpIHsKLSAgICBMT0dfRVJST1IoIlJlY2VpdmVkIGluY29tcGxldGUgU0NPIGhlYWRlciIpOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCogcGF5bG9hZCA9IHBfbXNnLT5kYXRhOwotICB1aW50MTZfdCBoYW5kbGVfd2l0aF9mbGFncyA9IDA7Ci0gIHVpbnQ4X3QgbGVuZ3RoID0gMDsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGVfd2l0aF9mbGFncywgcGF5bG9hZCk7Ci0gIFNUUkVBTV9UT19VSU5UOChsZW5ndGgsIHBheWxvYWQpOwotICBpZiAocF9tc2ctPmxlbiAhPSBsZW5ndGggKyAzKSB7Ci0gICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBpbnZhbGlkIFNDTyBkYXRhIG9mIHNpemU6ICVoaHUsIGRyb3BwaW5nIiwgbGVuZ3RoKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPR19JTkZPKCJSZWNlaXZlZCBTQ08gcGFja2V0IGZyb20gSENJLiBEcm9wcGluZyBpdCBzaW5jZSBubyBoYW5kbGVyIHNvIGZhciIpOwotICB1aW50MTZfdCBoYW5kbGUgPSBoYW5kbGVfd2l0aF9mbGFncyAmIDB4RkZGOwotICBBU1NFUlRfTE9HKGhhbmRsZSA8PSAweEVGRiwgIlJlcXVpcmUgaGFuZGxlIDw9IDB4RUZGLCBidXQgaXMgMHglWCIsIGhhbmRsZSk7Ci0gIGF1dG8qIGFjdGl2ZV9zY28gPSBidG1fZ2V0X2FjdGl2ZV9zY28oKTsKLSAgaWYgKGFjdGl2ZV9zY28gIT0gbnVsbHB0ciAmJiBhY3RpdmVfc2NvLT5oY2lfaGFuZGxlID09IGhhbmRsZSkgewotICAgIC8vIFRPRE86IEZvciBNU0JDLCB3ZSBuZWVkIHRvIGRlY29kZSBoZXJlCi0gICAgYmx1ZXRvb3RoOjphdWRpbzo6c2NvOjp3cml0ZShwYXlsb2FkLCBsZW5ndGgpOwotICB9Ci0gIG9zaV9mcmVlKHBfbXNnKTsKLSAgLy8gRm9yIENocm9tZSBPUywgd2Ugc2VuZCB0aGUgb3V0Z29pbmcgZGF0YSBhZnRlciByZWNlaXZpbmcgYW4gaW5jb21pbmcgb25lCi0gIHVpbnQ4X3Qgb3V0X2J1ZltCVE1fU0NPX0RBVEFfU0laRV9NQVhdOwotICBhdXRvIHNpemVfcmVhZCA9IGJsdWV0b290aDo6YXVkaW86OnNjbzo6cmVhZChvdXRfYnVmLCBCVE1fU0NPX0RBVEFfU0laRV9NQVgpOwotICBhdXRvIGRhdGEgPSBzdGQ6OnZlY3Rvcjx1aW50OF90PihvdXRfYnVmLCBvdXRfYnVmICsgc2l6ZV9yZWFkKTsKLSAgLy8gVE9ETzogRm9yIE1TQkMsIHdlIG5lZWQgdG8gZW5jb2RlIGhlcmUKLSAgYnRtX3NlbmRfc2NvX3BhY2tldChzdGQ6Om1vdmUoZGF0YSkpOwotfQotCi12b2lkIGJ0bV9zZW5kX3Njb19wYWNrZXQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgewotICBhdXRvKiBhY3RpdmVfc2NvID0gYnRtX2dldF9hY3RpdmVfc2NvKCk7Ci0gIGlmIChhY3RpdmVfc2NvID09IG51bGxwdHIgfHwgZGF0YS5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEJUX0hEUiogcGFja2V0ID0gYnRtX3Njb19tYWtlX3BhY2tldChzdGQ6Om1vdmUoZGF0YSksIGFjdGl2ZV9zY28tPmhjaV9oYW5kbGUpOwotICBidGVfbWFpbl9oY2lfc2VuZChwYWNrZXQsIEJUX0VWVF9UT19MTV9IQ0lfU0NPKTsKLX0KLQotLy8gQnVpbGQgYSBTQ08gcGFja2V0IGZyb20gdWludDgKLUJUX0hEUiogYnRtX3Njb19tYWtlX3BhY2tldChzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLCB1aW50MTZfdCBzY29faGFuZGxlKSB7Ci0gIEFTU0VSVF9MT0coZGF0YS5zaXplKCkgPD0gQlRNX1NDT19EQVRBX1NJWkVfTUFYLCAiSW52YWxpZCBTQ08gZGF0YSBzaXplOiAlenUiLAotICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9jYWxsb2MoQlRfU01BTExfQlVGRkVSX1NJWkUpOwotICBwX2J1Zi0+ZXZlbnQgPSBCVF9FVlRfVE9fTE1fSENJX1NDTzsKLSAgLy8gU0NPIGhlYWRlciBzaXplIGlzIDMgcGVyIENvcmUgNS4yIFZvbCA0IFBhcnQgRSA1LjQuMyBmaWd1cmUgNS4zCi0gIHBfYnVmLT5sZW4gPSBkYXRhLnNpemUoKSArIDM7Ci0gIHVpbnQ4X3QqIHBheWxvYWQgPSBwX2J1Zi0+ZGF0YTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwYXlsb2FkLCBzY29faGFuZGxlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBheWxvYWQsIGRhdGEuc2l6ZSgpKTsKLSAgQVJSQVlfVE9fU1RSRUFNKHBheWxvYWQsIGRhdGEuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KGRhdGEuc2l6ZSgpKSk7Ci0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZW5kX2Nvbm5lY3RfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVzcG9uZCB0byBTQ08gY29ubmVjdAotICogICAgICAgICAgICAgICAgICBpbmRpY2F0aW9ucwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEJUTV9TVEFUVVMgYnRtX3NlbmRfY29ubmVjdF9yZXF1ZXN0KHVpbnQxNl90IGFjbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaF9lc2NvX3BhcmFtc190KiBwX3NldHVwKSB7Ci0gIC8qIFNlbmQgY29ubmVjdCByZXF1ZXN0IGRlcGVuZGluZyBvbiB2ZXJzaW9uIG9mIHNwZWMgKi8KLSAgaWYgKCFidG1fY2Iuc2NvX2NiLmVzY29fc3VwcG9ydGVkKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNlbmRpbmcgbm9uLWVTQ08gcmVxdWVzdCBmb3IgaGFuZGxlPSIKLSAgICAgICAgICAgICAgPDwgdW5zaWduZWQoYWNsX2hhbmRsZSk7Ci0gICAgYnRzbmRfaGNpY19hZGRfU0NPX2Nvbm4oYWNsX2hhbmRsZSwgQlRNX0VTQ09fMl9TQ08ocF9zZXR1cC0+cGFja2V0X3R5cGVzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDE2X3QgdGVtcF9wYWNrZXRfdHlwZXMgPQotICAgICAgICAocF9zZXR1cC0+cGFja2V0X3R5cGVzICYKLSAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihCVE1fU0NPX1NVUFBPUlRFRF9QS1RTX01BU0spICYKLSAgICAgICAgIGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQpOwotCi0gICAgLyogT1IgaW4gYW55IGV4Y2VwdGlvbiBwYWNrZXQgdHlwZXMgKi8KLSAgICB0ZW1wX3BhY2tldF90eXBlcyB8PQotICAgICAgICAoKHBfc2V0dXAtPnBhY2tldF90eXBlcyAmIEJUTV9TQ09fRVhDRVBUSU9OX1BLVFNfTUFTSykgfAotICAgICAgICAgKGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgJiBCVE1fU0NPX0VYQ0VQVElPTl9QS1RTX01BU0spKTsKLQotICAgIC8qIEZpbmFsbHksIHJlbW92ZSBFRFIgZVNDTyBpZiB0aGUgcmVtb3RlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgaXQgKi8KLSAgICAvKiBVUEYyNTogIE9ubHkgU0NPIHdhcyBicm91Z2h0IHVwIGluIHRoaXMgY2FzZSAqLwotICAgIGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciA9IGFjbF9hZGRyZXNzX2Zyb21faGFuZGxlKGFjbF9oYW5kbGUpOwotICAgIGlmIChiZF9hZGRyICE9IFJhd0FkZHJlc3M6OmtFbXB0eSkgewotICAgICAgaWYgKCFzY29fcGVlcl9zdXBwb3J0c19lc2NvXzJtX3BoeShiZF9hZGRyKSkgewotICAgICAgICBCVE1fVFJBQ0VfREVCVUcoIkJUTSBSZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCAyLUVEUiBlU0NPIik7Ci0gICAgICAgIHRlbXBfcGFja2V0X3R5cGVzIHw9Ci0gICAgICAgICAgICAoRVNDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWMyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUpOwotICAgICAgfQotICAgICAgaWYgKCFzY29fcGVlcl9zdXBwb3J0c19lc2NvXzNtX3BoeShiZF9hZGRyKSkgewotICAgICAgICBCVE1fVFJBQ0VfREVCVUcoIkJUTSBSZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCAzLUVEUiBlU0NPIik7Ci0gICAgICAgIHRlbXBfcGFja2V0X3R5cGVzIHw9Ci0gICAgICAgICAgICAoRVNDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWMyB8IEVTQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpOwotICAgICAgfQotCi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgQlIvRURSIFNlY3VyZSBDb25uZWN0aW9ucyBpcyBiZWluZyB1c2VkCi0gICAgICAqKiBJZiBzbywgd2UgY2Fubm90IHVzZSBTQ08tb25seSBwYWNrZXQgdHlwZXMgKEhGUCAxLjcpCi0gICAgICAqLwotICAgICAgY29uc3QgYm9vbCBsb2NhbF9zdXBwb3J0c19zYyA9Ci0gICAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucygpOwotICAgICAgY29uc3QgYm9vbCByZW1vdGVfc3VwcG9ydHNfc2MgPQotICAgICAgICAgIEJUTV9QZWVyU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucyhiZF9hZGRyKTsKLQotICAgICAgaWYgKGxvY2FsX3N1cHBvcnRzX3NjICYmIHJlbW90ZV9zdXBwb3J0c19zYykgewotICAgICAgICB0ZW1wX3BhY2tldF90eXBlcyAmPSB+KEJUTV9TQ09fUEtUX1RZUEVfTUFTSyk7Ci0gICAgICAgIGlmICh0ZW1wX3BhY2tldF90eXBlcyA9PSAwKSB7Ci0gICAgICAgICAgTE9HX0VSUk9SKAotICAgICAgICAgICAgICAiU0NPIGNvbm5lY3Rpb24gY2Fubm90IHN1cHBvcnQgYW55IHBhY2tldCB0eXBlcyBmb3IgIgotICAgICAgICAgICAgICAiYWNsX2hhbmRsZToweCUwNHgiLAotICAgICAgICAgICAgICBhY2xfaGFuZGxlKTsKLSAgICAgICAgICByZXR1cm4gQlRNX1dST05HX01PREU7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgIkJvdGggbG9jYWwgYW5kIHJlbW90ZSBjb250cm9sbGVycyBzdXBwb3J0IFNDTyBzZWN1cmUgY29ubmVjdGlvbnMgIgotICAgICAgICAgICAgImhhbmRsZToweCUwNHggcGt0X3R5cGVzOjB4JTA0eCIsCi0gICAgICAgICAgICBhY2xfaGFuZGxlLCB0ZW1wX3BhY2tldF90eXBlcyk7Ci0KLSAgICAgIH0gZWxzZSBpZiAoIWxvY2FsX3N1cHBvcnRzX3NjICYmICFyZW1vdGVfc3VwcG9ydHNfc2MpIHsKLSAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgIkJvdGggbG9jYWwgYW5kIHJlbW90ZSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBzZWN1cmUgIgotICAgICAgICAgICAgImNvbm5lY3Rpb25zIGZvciBoYW5kbGU6MHglMDR4IiwKLSAgICAgICAgICAgIGFjbF9oYW5kbGUpOwotICAgICAgfSBlbHNlIGlmIChyZW1vdGVfc3VwcG9ydHNfc2MpIHsKLSAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgIk9ubHkgcmVtb3RlIGNvbnRyb2xsZXIgc3VwcG9ydHMgc2VjdXJlIGNvbm5lY3Rpb25zIGZvciAiCi0gICAgICAgICAgICAiaGFuZGxlOjB4JTA0eCIsCi0gICAgICAgICAgICBhY2xfaGFuZGxlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAgICJPbmx5IGxvY2FsIGNvbnRyb2xsZXIgc3VwcG9ydHMgc2VjdXJlIGNvbm5lY3Rpb25zIGZvciAiCi0gICAgICAgICAgICAiaGFuZGxlOjB4JTA0eCIsCi0gICAgICAgICAgICBhY2xfaGFuZGxlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCBTQ08gY29ubmVjdCBmcm9tIHVua25vd24gcGVlcjolcyIsCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHRoZSBwcmV2aW91cyB0eXBlcyBpbiBjYXNlIGNvbW1hbmQgZmFpbHMgKi8KLSAgICB1aW50MTZfdCBzYXZlZF9wYWNrZXRfdHlwZXMgPSBwX3NldHVwLT5wYWNrZXRfdHlwZXM7Ci0gICAgcF9zZXR1cC0+cGFja2V0X3R5cGVzID0gdGVtcF9wYWNrZXRfdHlwZXM7Ci0KLSAgICAvKiBVc2UgRW5oYW5jZWQgU3luY2hyb25vdXMgY29tbWFuZHMgaWYgc3VwcG9ydGVkICovCi0gICAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgICAtPnN1cHBvcnRzX2VuaGFuY2VkX3NldHVwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24oKSkgewotICAgICAgTE9HX0lORk8oIlNlbmRpbmcgZW5oYW5jZWQgU0NPIGNvbm5lY3QgcmVxdWVzdCBvdmVyIGhhbmRsZToweCUwNHgiLAotICAgICAgICAgICAgICAgYWNsX2hhbmRsZSk7Ci0gICAgICAvKiBVc2UgdGhlIHNhdmVkIFNDTyByb3V0aW5nICovCi0gICAgICBwX3NldHVwLT5pbnB1dF9kYXRhX3BhdGggPSBwX3NldHVwLT5vdXRwdXRfZGF0YV9wYXRoID0gRVNDT19EQVRBX1BBVEg7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgc3RkOjpoZXggPDwgIjogZW5oYW5jZWQgcGFyYW1ldGVyIGxpc3QiCi0gICAgICAgICAgICAgICAgPDwgIiB0eGJ3PTB4IiA8PCB1bnNpZ25lZChwX3NldHVwLT50cmFuc21pdF9iYW5kd2lkdGgpCi0gICAgICAgICAgICAgICAgPDwgIiwgcnhidz0weCIgPDwgdW5zaWduZWQocF9zZXR1cC0+cmVjZWl2ZV9iYW5kd2lkdGgpCi0gICAgICAgICAgICAgICAgPDwgIiwgbGF0ZW5jeV9tcz0weCIgPDwgdW5zaWduZWQocF9zZXR1cC0+bWF4X2xhdGVuY3lfbXMpCi0gICAgICAgICAgICAgICAgPDwgIiwgcmV0cmFuc21pdF9lZmZvcnQ9MHgiCi0gICAgICAgICAgICAgICAgPDwgdW5zaWduZWQocF9zZXR1cC0+cmV0cmFuc21pc3Npb25fZWZmb3J0KSA8PCAiLCBwa3RfdHlwZT0weCIKLSAgICAgICAgICAgICAgICA8PCB1bnNpZ25lZChwX3NldHVwLT5wYWNrZXRfdHlwZXMpIDw8ICIsIHBhdGg9MHgiCi0gICAgICAgICAgICAgICAgPDwgdW5zaWduZWQocF9zZXR1cC0+aW5wdXRfZGF0YV9wYXRoKTsKLSAgICAgIGJ0c25kX2hjaWNfZW5oYW5jZWRfc2V0X3VwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24oYWNsX2hhbmRsZSwgcF9zZXR1cCk7Ci0gICAgICBwX3NldHVwLT5wYWNrZXRfdHlwZXMgPSBzYXZlZF9wYWNrZXRfdHlwZXM7Ci0gICAgfSBlbHNlIHsgLyogVXNlIG9sZGVyIGNvbW1hbmQgKi8KLSAgICAgIExPR19JTkZPKCJTZW5kaW5nIGVTQ08gY29ubmVjdCByZXF1ZXN0IG92ZXIgaGFuZGxlOjB4JTA0eCIsIGFjbF9oYW5kbGUpOwotICAgICAgdWludDE2X3Qgdm9pY2VfY29udGVudF9mb3JtYXQgPSBidG1fc2NvX3ZvaWNlX3NldHRpbmdzX3RvX2xlZ2FjeShwX3NldHVwKTsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCBzdGQ6OmhleCA8PCAiOiBsZWdhY3kgcGFyYW1ldGVyIGxpc3QiCi0gICAgICAgICAgICAgICAgPDwgIiB0eGJ3PTB4IiA8PCB1bnNpZ25lZChwX3NldHVwLT50cmFuc21pdF9iYW5kd2lkdGgpCi0gICAgICAgICAgICAgICAgPDwgIiwgcnhidz0weCIgPDwgdW5zaWduZWQocF9zZXR1cC0+cmVjZWl2ZV9iYW5kd2lkdGgpCi0gICAgICAgICAgICAgICAgPDwgIiwgbGF0ZW5jeV9tcz0weCIgPDwgdW5zaWduZWQocF9zZXR1cC0+bWF4X2xhdGVuY3lfbXMpCi0gICAgICAgICAgICAgICAgPDwgIiwgcmV0cmFuc21pdF9lZmZvcnQ9MHgiCi0gICAgICAgICAgICAgICAgPDwgdW5zaWduZWQocF9zZXR1cC0+cmV0cmFuc21pc3Npb25fZWZmb3J0KQotICAgICAgICAgICAgICAgIDw8ICIsIHZvaWNlX2NvbnRlbnRfZm9ybWF0PTB4IiA8PCB1bnNpZ25lZCh2b2ljZV9jb250ZW50X2Zvcm1hdCkKLSAgICAgICAgICAgICAgICA8PCAiLCBwa3RfdHlwZT0weCIgPDwgdW5zaWduZWQocF9zZXR1cC0+cGFja2V0X3R5cGVzKTsKLSAgICAgIGJ0c25kX2hjaWNfc2V0dXBfZXNjb19jb25uKAotICAgICAgICAgIGFjbF9oYW5kbGUsIHBfc2V0dXAtPnRyYW5zbWl0X2JhbmR3aWR0aCwgcF9zZXR1cC0+cmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgICAgcF9zZXR1cC0+bWF4X2xhdGVuY3lfbXMsIHZvaWNlX2NvbnRlbnRfZm9ybWF0LAotICAgICAgICAgIHBfc2V0dXAtPnJldHJhbnNtaXNzaW9uX2VmZm9ydCwgcF9zZXR1cC0+cGFja2V0X3R5cGVzKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKEJUTV9DTURfU1RBUlRFRCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ3JlYXRlU2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjcmVhdGUgYW4gU0NPIGNvbm5lY3Rpb24uIElmIHRoZQotICogICAgICAgICAgICAgICAgICAiaXNfb3JpZyIgZmxhZyBpcyB0cnVlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIG9yaWdpbmF0ZWQsCi0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBCVE0gd2lsbCB3YWl0IGZvciB0aGUgb3RoZXIgc2lkZSB0byBjb25uZWN0LgotICoKLSAqICAgICAgICAgICAgICAgICAgTk9URTogIElmIEJUTV9JR05PUkVfU0NPX1BLVF9UWVBFIGlzIHBhc3NlZCBpbiB0aGUgcGt0X3R5cGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdGhlIGRlZmF1bHQgcGFja2V0IHR5cGVzIGlzIHVzZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIHRoZSBBQ0wgY29ubmVjdGlvbiBpcyBub3QgdXAKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgICAgICAgICBpZiBhbm90aGVyIFNDTyBiZWluZyBzZXQgdXAgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBCRCBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgdGhlIG1heCBTQ08gbGltaXQgaGFzIGJlZW4gcmVhY2hlZAotICogICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgIGlmIHRoZSBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgaXMgc3RhcnRlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsICIqcF9zY29faW54IiBpcyBmaWxsZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBzY28gaW5kZXggdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9DcmVhdGVTY28oY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYSwgYm9vbCBpc19vcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwa3RfdHlwZXMsIHVpbnQxNl90KiBwX3Njb19pbngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0NPX0NCKiBwX2Nvbm5fY2IsIHRCVE1fU0NPX0NCKiBwX2Rpc2NfY2IpIHsKLSAgZW5oX2VzY29fcGFyYW1zX3QqIHBfc2V0dXA7Ci0gIHRTQ09fQ09OTiogcCA9ICZidG1fY2Iuc2NvX2NiLnNjb19kYlswXTsKLSAgdWludDE2X3QgeHg7Ci0gIHVpbnQxNl90IGFjbF9oYW5kbGUgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICpwX3Njb19pbnggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7Ci0KLSAgaWYgKEJUTV9NQVhfU0NPX0xJTktTID09IDApIHsKLSAgICByZXR1cm4gQlRNX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIC8qIElmIG9yaWdpbmF0aW5nLCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhbiBBQ0wgY29ubmVjdGlvbiB0byB0aGUgQkQgQWRkcmVzcyAqLwotCi0gIGlmIChpc19vcmlnKSB7Ci0gICAgaWYgKCFyZW1vdGVfYmRhKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHJlbW90ZV9iZGEgaXMgbnVsbCI7Ci0gICAgICByZXR1cm4gQlRNX0lMTEVHQUxfVkFMVUU7Ci0gICAgfQotICAgIGFjbF9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZSgqcmVtb3RlX2JkYSwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgaWYgKGFjbF9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGNhbm5vdCBmaW5kIEFDTCBoYW5kbGUgZm9yIHJlbW90ZSBkZXZpY2UgIgotICAgICAgICAgICAgICAgICA8PCByZW1vdGVfYmRhOwotICAgICAgcmV0dXJuIEJUTV9VTktOT1dOX0FERFI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJlbW90ZV9iZGEpIHsKLSAgICAvKiBJZiBhbnkgU0NPIGlzIGJlaW5nIGVzdGFibGlzaGVkIHRvIHRoZSByZW1vdGUgQkQgYWRkcmVzcywgcmVmdXNlIHRoaXMgKi8KLSAgICBmb3IgKHh4ID0gMDsgeHggPCBCVE1fTUFYX1NDT19MSU5LUzsgeHgrKywgcCsrKSB7Ci0gICAgICBpZiAoKChwLT5zdGF0ZSA9PSBTQ09fU1RfQ09OTkVDVElORykgfHwgKHAtPnN0YXRlID09IFNDT19TVF9MSVNURU5JTkcpIHx8Ci0gICAgICAgICAgIChwLT5zdGF0ZSA9PSBTQ09fU1RfUEVORF9VTlBBUkspKSAmJgotICAgICAgICAgIChwLT5lc2NvLmRhdGEuYmRfYWRkciA9PSAqcmVtb3RlX2JkYSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBhIHNjbyBjb25uZWN0aW9uIGlzIGFscmVhZHkgZ29pbmcgb24gZm9yICIKLSAgICAgICAgICAgICAgICAgICA8PCAqcmVtb3RlX2JkYSA8PCAiLCBhdCBzdGF0ZSAiIDw8IHVuc2lnbmVkKHAtPnN0YXRlKTsKLSAgICAgICAgcmV0dXJuIEJUTV9CVVNZOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBTdXBwb3J0IG9ubHkgMSB3aWxkY2FyZCBCRCBhZGRyZXNzIGF0IGEgdGltZSAqLwotICAgIGZvciAoeHggPSAwOyB4eCA8IEJUTV9NQVhfU0NPX0xJTktTOyB4eCsrLCBwKyspIHsKLSAgICAgIGlmICgocC0+c3RhdGUgPT0gU0NPX1NUX0xJU1RFTklORykgJiYgKCFwLT5yZW1fYmRfa25vd24pKSB7Ci0gICAgICAgIExPRyhFUlJPUikKLSAgICAgICAgICAgIDw8IF9fZnVuY19fCi0gICAgICAgICAgICA8PCAiOiByZW1vdGVfYmRhIGlzIG51bGwgYW5kIG5vdCBrbm93biBhbmQgd2UgYXJlIHN0aWxsIGxpc3RlbmluZyI7Ci0gICAgICAgIHJldHVybiBCVE1fQlVTWTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBUcnkgdG8gZmluZCBhbiB1bnVzZWQgY29udHJvbCBibG9jaywgYW5kIGtpY2sgb2ZmIHRoZSBTQ08gZXN0YWJsaXNobWVudCAqLwotICBmb3IgKHh4ID0gMCwgcCA9ICZidG1fY2Iuc2NvX2NiLnNjb19kYlswXTsgeHggPCBCVE1fTUFYX1NDT19MSU5LUzsKLSAgICAgICB4eCsrLCBwKyspIHsKLSAgICBpZiAocC0+c3RhdGUgPT0gU0NPX1NUX1VOVVNFRCkgewotICAgICAgaWYgKHJlbW90ZV9iZGEpIHsKLSAgICAgICAgaWYgKGlzX29yaWcpIHsKLSAgICAgICAgICAvLyBjYW4gbm90IGNyZWF0ZSBTQ08gbGluayBpZiBpbiBwYXJrIG1vZGUKLSAgICAgICAgICB0QlRNX1BNX1NUQVRFIHN0YXRlOwotICAgICAgICAgIGlmIChCVE1fUmVhZFBvd2VyTW9kZSgqcmVtb3RlX2JkYSwgJnN0YXRlKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJUTV9QTV9TVF9TTklGRiB8fCBzdGF0ZSA9PSBCVE1fUE1fU1RfUEFSSyB8fAotICAgICAgICAgICAgICAgIHN0YXRlID09IEJUTV9QTV9TVF9QRU5ESU5HKSB7Ci0gICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiAiIDw8ICpyZW1vdGVfYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGluIHNuaWZmLCBwYXJrIG9yIHBlbmRpbmcgbW9kZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCB1bnNpZ25lZChzdGF0ZSk7Ci0gICAgICAgICAgICAgIGlmICghQlRNX1NldExpbmtQb2xpY3lBY3RpdmVNb2RlKCpyZW1vdGVfYmRhKSkgewotICAgICAgICAgICAgICAgIExPR19XQVJOKCJVbmFibGUgdG8gc2V0IGxpbmsgcG9saWN5IGFjdGl2ZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHAtPnN0YXRlID0gU0NPX1NUX1BFTkRfVU5QQVJLOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byByZWFkIHBvd2VyIG1vZGUgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgKnJlbW90ZV9iZGE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHAtPmVzY28uZGF0YS5iZF9hZGRyID0gKnJlbW90ZV9iZGE7Ci0gICAgICAgIHAtPnJlbV9iZF9rbm93biA9IHRydWU7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgcC0+cmVtX2JkX2tub3duID0gZmFsc2U7Ci0KLSAgICAgIHBfc2V0dXAgPSAmcC0+ZXNjby5zZXR1cDsKLSAgICAgICpwX3NldHVwID0gYnRtX2NiLnNjb19jYi5kZWZfZXNjb19wYXJtczsKLQotICAgICAgLyogRGV0ZXJtaW5lIHRoZSBwYWNrZXQgdHlwZXMgKi8KLSAgICAgIHBfc2V0dXAtPnBhY2tldF90eXBlcyA9IHBrdF90eXBlcyAmIEJUTV9TQ09fU1VQUE9SVEVEX1BLVFNfTUFTSyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkOwotICAgICAgLyogT1IgaW4gYW55IGV4Y2VwdGlvbiBwYWNrZXQgdHlwZXMgKi8KLSAgICAgIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2J0X3ZlcnNpb24oKS0+aGNpX3ZlcnNpb24gPj0KLSAgICAgICAgICBIQ0lfUFJPVE9fVkVSU0lPTl8yXzApIHsKLSAgICAgICAgcF9zZXR1cC0+cGFja2V0X3R5cGVzIHw9Ci0gICAgICAgICAgICAocGt0X3R5cGVzICYgQlRNX1NDT19FWENFUFRJT05fUEtUU19NQVNLKSB8Ci0gICAgICAgICAgICAoYnRtX2NiLmJ0bV9zY29fcGt0X3R5cGVzX3N1cHBvcnRlZCAmIEJUTV9TQ09fRVhDRVBUSU9OX1BLVFNfTUFTSyk7Ci0gICAgICB9Ci0KLSAgICAgIHAtPnBfY29ubl9jYiA9IHBfY29ubl9jYjsKLSAgICAgIHAtPnBfZGlzY19jYiA9IHBfZGlzY19jYjsKLSAgICAgIHAtPmhjaV9oYW5kbGUgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICBwLT5pc19vcmlnID0gaXNfb3JpZzsKLQotICAgICAgaWYgKHAtPnN0YXRlICE9IFNDT19TVF9QRU5EX1VOUEFSSykgewotICAgICAgICBpZiAoaXNfb3JpZykgewotICAgICAgICAgIC8qIElmIHJvbGUgY2hhbmdlIGlzIGluIHByb2dyZXNzLCBkbyBub3QgcHJvY2VlZCB3aXRoIFNDTyBzZXR1cAotICAgICAgICAgICAqIFdhaXQgdGlsbCByb2xlIGNoYW5nZSBpcyBjb21wbGV0ZSAqLwotICAgICAgICAgIGlmICghYWNsX2lzX3N3aXRjaF9yb2xlX2lkbGUoKnJlbW90ZV9iZGEsIEJUX1RSQU5TUE9SVF9CUl9FRFIpKSB7Ci0gICAgICAgICAgICBCVE1fVFJBQ0VfQVBJKCJSb2xlIENoYW5nZSBpcyBpbiBwcm9ncmVzcyBmb3IgQUNMIGhhbmRsZSAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhY2xfaGFuZGxlKTsKLSAgICAgICAgICAgIHAtPnN0YXRlID0gU0NPX1NUX1BFTkRfUk9MRUNIQU5HRTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHAtPnN0YXRlICE9IFNDT19TVF9QRU5EX1VOUEFSSyAmJgotICAgICAgICAgIHAtPnN0YXRlICE9IFNDT19TVF9QRU5EX1JPTEVDSEFOR0UpIHsKLSAgICAgICAgaWYgKGlzX29yaWcpIHsKLSAgICAgICAgICBMT0dfREVCVUcoIkluaXRpYXRpbmcgKGUpU0NPIGxpbmsgZm9yIEFDTCBoYW5kbGU6MHglMDR4IiwgYWNsX2hhbmRsZSk7Ci0KLSAgICAgICAgICBpZiAoKGJ0bV9zZW5kX2Nvbm5lY3RfcmVxdWVzdChhY2xfaGFuZGxlLCBwX3NldHVwKSkgIT0KLSAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBzZW5kIGNvbm5lY3QgcmVxdWVzdCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCAqcmVtb3RlX2JkYTsKLSAgICAgICAgICAgIHJldHVybiAoQlRNX05PX1JFU09VUkNFUyk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfQ09OTkVDVElORzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBMT0dfREVCVUcoIkxpc3RlbmluZyBmb3IgKGUpU0NPIG9uIEFDTCBoYW5kbGU6MHglMDR4IiwgYWNsX2hhbmRsZSk7Ci0gICAgICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfTElTVEVOSU5HOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgICpwX3Njb19pbnggPSB4eDsKLSAgICAgIExPR19ERUJVRygiU0NPIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IHJlcXVlc3RlZCIpOwotICAgICAgaWYgKHAtPnN0YXRlID09IFNDT19TVF9DT05ORUNUSU5HKSB7Ci0gICAgICAgIEJUTV9Mb2dIaXN0b3J5KAotICAgICAgICAgICAga0J0bUxvZ1RhZywgKnJlbW90ZV9iZGEsICJDb25uZWN0aW5nIiwKLSAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigibG9jYWwgaW5pdGlhdGVkIGFjbDoweCUwNHgiLCBhY2xfaGFuZGxlKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGhlcmUsIGFsbCBTQ08gYmxvY2tzIGluIHVzZSAqLwotICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGFsbCBTQ08gY29udHJvbCBibG9ja3MgYXJlIGluIHVzZSI7Ci0gIHJldHVybiBCVE1fTk9fUkVTT1VSQ0VTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Njb19jaGtfcGVuZF91bnBhcmsKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEJUSUYgd2hlbiB0aGVyZSBpcyBhIG1vZGUgY2hhbmdlCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50IHRvIHNlZSBpZiB0aGVyZSBhcmUgU0NPIGNvbW1hbmRzIHdhaXRpbmcgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICB1bnBhcmsuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3Njb19jaGtfcGVuZF91bnBhcmsodEhDSV9TVEFUVVMgaGNpX3N0YXR1cywgdWludDE2X3QgaGNpX2hhbmRsZSkgewotICB0U0NPX0NPTk4qIHAgPSAmYnRtX2NiLnNjb19jYi5zY29fZGJbMF07Ci0gIGZvciAodWludDE2X3QgeHggPSAwOyB4eCA8IEJUTV9NQVhfU0NPX0xJTktTOyB4eCsrLCBwKyspIHsKLSAgICB1aW50MTZfdCBhY2xfaGFuZGxlID0KLSAgICAgICAgQlRNX0dldEhDSUNvbm5IYW5kbGUocC0+ZXNjby5kYXRhLmJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgIGlmICgocC0+c3RhdGUgPT0gU0NPX1NUX1BFTkRfVU5QQVJLKSAmJiAoYWNsX2hhbmRsZSA9PSBoY2lfaGFuZGxlKSkgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgcC0+ZXNjby5kYXRhLmJkX2FkZHIKLSAgICAgICAgICAgICAgICA8PCAiIHVucGFya2VkLCBzZW5kaW5nIGNvbm5lY3Rpb24gcmVxdWVzdCwgYWNsX2hhbmRsZT0iCi0gICAgICAgICAgICAgICAgPDwgdW5zaWduZWQoYWNsX2hhbmRsZSkKLSAgICAgICAgICAgICAgICA8PCAiLCBoY2lfc3RhdHVzPSIgPDwgdW5zaWduZWQoaGNpX3N0YXR1cyk7Ci0gICAgICBpZiAoYnRtX3NlbmRfY29ubmVjdF9yZXF1ZXN0KGFjbF9oYW5kbGUsICZwLT5lc2NvLnNldHVwKSA9PQotICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgICBwLT5zdGF0ZSA9IFNDT19TVF9DT05ORUNUSU5HOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgdG8gc2VuZCBjb25uZWN0aW9uIHJlcXVlc3QgZm9yICIKLSAgICAgICAgICAgICAgICAgICA8PCBwLT5lc2NvLmRhdGEuYmRfYWRkcjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zY29fY2hrX3BlbmRfcm9sZWNoYW5nZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQlRJRiB3aGVuIHRoZXJlIGlzIGEgcm9sZSBjaGFuZ2UKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQgdG8gc2VlIGlmIHRoZXJlIGFyZSBTQ08gY29tbWFuZHMgd2FpdGluZyBmb3IgdGhlIHJvbGUKLSAqICAgICAgICAgICAgICAgICAgY2hhbmdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zY29fY2hrX3BlbmRfcm9sZWNoYW5nZSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIHVpbnQxNl90IHh4OwotICB1aW50MTZfdCBhY2xfaGFuZGxlOwotICB0U0NPX0NPTk4qIHAgPSAmYnRtX2NiLnNjb19jYi5zY29fZGJbMF07Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRNX01BWF9TQ09fTElOS1M7IHh4KyssIHArKykgewotICAgIGlmICgocC0+c3RhdGUgPT0gU0NPX1NUX1BFTkRfUk9MRUNIQU5HRSkgJiYKLSAgICAgICAgKChhY2xfaGFuZGxlID0gQlRNX0dldEhDSUNvbm5IYW5kbGUoCi0gICAgICAgICAgICAgIHAtPmVzY28uZGF0YS5iZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKSkgPT0gaGNpX2hhbmRsZSkpCi0KLSAgICB7Ci0gICAgICBCVE1fVFJBQ0VfQVBJKAotICAgICAgICAgICJidG1fc2NvX2Noa19wZW5kX3JvbGVjaGFuZ2UgLT4gKGUpU0NPIExpbmsgZm9yIEFDTCBoYW5kbGUgMHglMDR4IiwKLSAgICAgICAgICBhY2xfaGFuZGxlKTsKLQotICAgICAgaWYgKChidG1fc2VuZF9jb25uZWN0X3JlcXVlc3QoYWNsX2hhbmRsZSwgJnAtPmVzY28uc2V0dXApKSA9PQotICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCkKLSAgICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfQ09OTkVDVElORzsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgYnRtX3Njb19kaXNjX2Noa19wZW5kX2Zvcl9tb2RlY2hhbmdlCi0gKgotICogRGVzY3JpcHRpb24gICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGJ0bSB3aGVuIHRoZXJlIGlzIGEgbW9kZSBjaGFuZ2UKLSAqICAgICAgICAgICAgICAgICBldmVudCB0byBzZWUgaWYgdGhlcmUgYXJlIFNDTyAgZGlzY29ubmVjdCBjb21tYW5kcyB3YWl0aW5nCi0gKiAgICAgICAgICAgICAgICAgZm9yIHRoZSBtb2RlIGNoYW5nZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zY29fZGlzY19jaGtfcGVuZF9mb3JfbW9kZWNoYW5nZSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIHRTQ09fQ09OTiogcCA9ICZidG1fY2Iuc2NvX2NiLnNjb19kYlswXTsKLQotICBMT0dfREVCVUcoCi0gICAgICAiQ2hlY2tpbmcgZm9yIFNDTyBwZW5kaW5nIG1vZGUgY2hhbmdlIGV2ZW50cyBoY2lfaGFuZGxlOjB4JTA0eCAiCi0gICAgICAicC0+c3RhdGU6JXMiLAotICAgICAgaGNpX2hhbmRsZSwgc2NvX3N0YXRlX3RleHQocC0+c3RhdGUpLmNfc3RyKCkpOwotCi0gIGZvciAodWludDE2X3QgeHggPSAwOyB4eCA8IEJUTV9NQVhfU0NPX0xJTktTOyB4eCsrLCBwKyspIHsKLSAgICBpZiAoKHAtPnN0YXRlID09IFNDT19TVF9QRU5EX01PREVDSEFOR0UpICYmCi0gICAgICAgIChCVE1fR2V0SENJQ29ubkhhbmRsZShwLT5lc2NvLmRhdGEuYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUikpID09Ci0gICAgICAgICAgICBoY2lfaGFuZGxlKQotCi0gICAgewotICAgICAgTE9HX0RFQlVHKCJSZW1vdmluZyBTQ08gTGluayBoYW5kbGUgMHglMDR4IiwgcC0+aGNpX2hhbmRsZSk7Ci0gICAgICBCVE1fUmVtb3ZlU2NvKHh4KTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zY29fY29ubl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEJUVSBIQ0lGIHdoZW4gYW4gU0NPIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdCBpcyByZWNlaXZlZCBmcm9tIGEgcmVtb3RlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zY29fY29ubl9yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBjb25zdCBERVZfQ0xBU1MmIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxpbmtfdHlwZSkgewotICB0U0NPX0NCKiBwX3NjbyA9ICZidG1fY2Iuc2NvX2NiOwotICB0U0NPX0NPTk4qIHAgPSAmcF9zY28tPnNjb19kYlswXTsKLSAgdEJUTV9FU0NPX0NPTk5fUkVRX0VWVF9EQVRBIGV2dF9kYXRhID0ge307Ci0KLSAgZm9yICh1aW50MTZfdCBzY29faW5kZXggPSAwOyBzY29faW5kZXggPCBCVE1fTUFYX1NDT19MSU5LUzsKLSAgICAgICBzY29faW5kZXgrKywgcCsrKSB7Ci0gICAgLyoKLSAgICAgKiBJZiB0aGUgc2NvIHN0YXRlIGlzIGluIHRoZSBTQ09fU1RfQ09OTkVDVElORyBzdGF0ZSwgd2Ugc3RpbGwgbmVlZAotICAgICAqIHRvIHJldHVybiBhY2NlcHQgc2NvIHRvIGF2b2lkIHJhY2UgY29uZGl0b24gZm9yIHNjbyBjcmVhdGlvbgotICAgICAqLwotICAgIGJvb2wgcmVtX2JkX21hdGNoZXMgPSBwLT5yZW1fYmRfa25vd24gJiYgcC0+ZXNjby5kYXRhLmJkX2FkZHIgPT0gYmRhOwotICAgIGlmICgoKHAtPnN0YXRlID09IFNDT19TVF9DT05ORUNUSU5HKSAmJiByZW1fYmRfbWF0Y2hlcykgfHwKLSAgICAgICAgKChwLT5zdGF0ZSA9PSBTQ09fU1RfTElTVEVOSU5HKSAmJgotICAgICAgICAgKHJlbV9iZF9tYXRjaGVzIHx8ICFwLT5yZW1fYmRfa25vd24pKSkgewotICAgICAgLyogSWYgdGhpcyB3YXMgYSB3aWxkY2FyZCwgaXQgaXMgbm90IG9uZSBhbnkgbW9yZSAqLwotICAgICAgcC0+cmVtX2JkX2tub3duID0gdHJ1ZTsKLSAgICAgIHAtPmVzY28uZGF0YS5saW5rX3R5cGUgPSBsaW5rX3R5cGU7Ci0gICAgICBwLT5zdGF0ZSA9IFNDT19TVF9XNF9DT05OX1JTUDsKLSAgICAgIHAtPmVzY28uZGF0YS5iZF9hZGRyID0gYmRhOwotCi0gICAgICAvKiBJZiBubyBjYWxsYmFjaywgYXV0by1hY2NlcHQgdGhlIGNvbm5lY3Rpb24gaWYgcGFja2V0IHR5cGVzIG1hdGNoICovCi0gICAgICBpZiAoIXAtPmVzY28ucF9lc2NvX2NiYWNrKSB7Ci0gICAgICAgIC8qIElmIHJlcXVlc3RpbmcgZVNDTyByZWplY3QgaWYgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBTQ08gb25seSAqLwotICAgICAgICBpZiAoKGxpbmtfdHlwZSA9PSBCVE1fTElOS19UWVBFX0VTQ08gJiYKLSAgICAgICAgICAgICAhKHBfc2NvLT5kZWZfZXNjb19wYXJtcy5wYWNrZXRfdHlwZXMgJiBCVE1fRVNDT19MSU5LX09OTFlfTUFTSykgJiYKLSAgICAgICAgICAgICAoKHBfc2NvLT5kZWZfZXNjb19wYXJtcy5wYWNrZXRfdHlwZXMgJgotICAgICAgICAgICAgICAgQlRNX1NDT19FWENFUFRJT05fUEtUU19NQVNLKSA9PSBCVE1fU0NPX0VYQ0VQVElPTl9QS1RTX01BU0spKQotCi0gICAgICAgICAgICAvKiBSZWplY3QgcmVxdWVzdCBpZiBTQ08gaXMgZGVzaXJlZCBidXQgbm8gU0NPIHBhY2tldHMgZGVsZWN0ZWQgKi8KLSAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAobGlua190eXBlID09IEJUTV9MSU5LX1RZUEVfU0NPICYmCi0gICAgICAgICAgICAgIShwX3Njby0+ZGVmX2VzY29fcGFybXMucGFja2V0X3R5cGVzICYgQlRNX1NDT19MSU5LX09OTFlfTUFTSykpKSB7Ci0gICAgICAgICAgYnRtX2VzY29fY29ubl9yc3Aoc2NvX2luZGV4LCBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUywgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIEFjY2VwdCB0aGUgcmVxdWVzdCAqLwotICAgICAgICAgIGJ0bV9lc2NvX2Nvbm5fcnNwKHNjb19pbmRleCwgSENJX1NVQ0NFU1MsIGJkYSwgbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIE5vdGlmeSB1cHBlciBsYXllciBvZiBjb25uZWN0IGluZGljYXRpb24gKi8KLSAgICAgICAgZXZ0X2RhdGEuYmRfYWRkciA9IGJkYTsKLSAgICAgICAgbWVtY3B5KGV2dF9kYXRhLmRldl9jbGFzcywgZGV2X2NsYXNzLCBERVZfQ0xBU1NfTEVOKTsKLSAgICAgICAgZXZ0X2RhdGEubGlua190eXBlID0gbGlua190eXBlOwotICAgICAgICBldnRfZGF0YS5zY29faW54ID0gc2NvX2luZGV4OwotICAgICAgICB0QlRNX0VTQ09fRVZUX0RBVEEgYnRtX2VzY29fZXZ0X2RhdGEgPSB7fTsKLSAgICAgICAgYnRtX2VzY29fZXZ0X2RhdGEuY29ubl9ldnQgPSBldnRfZGF0YTsKLSAgICAgICAgcC0+ZXNjby5wX2VzY29fY2JhY2soQlRNX0VTQ09fQ09OTl9SRVFfRVZULCAmYnRtX2VzY29fZXZ0X2RhdGEpOwotICAgICAgfQotCi0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm8gb25lIHdhbnRzIHRoZSBTQ08gY29ubmVjdGlvbi4gUmVqZWN0IGl0ICovCi0gIEJUTV9UUkFDRV9XQVJOSU5HKCIlczogcmVqZWN0aW5nIFNDTyBmb3IgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgYmRhLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGJ0bV9lc2NvX2Nvbm5fcnNwKEJUTV9NQVhfU0NPX0xJTktTLCBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUywgYmRhLAotICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zY29fY29ubmVjdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBCVElGIHdoZW4gYW4gKGUpU0NPIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgaXMgY29ubmVjdGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zY29fY29ubmVjdGVkKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGNpX2hhbmRsZSwgdEJUTV9FU0NPX0RBVEEqIHBfZXNjb19kYXRhKSB7Ci0gIHRTQ09fQ09OTiogcCA9ICZidG1fY2Iuc2NvX2NiLnNjb19kYlswXTsKLSAgdWludDE2X3QgeHg7Ci0gIGJvb2wgc3B0ID0gZmFsc2U7Ci0gIHRCVE1fQ0hHX0VTQ09fUEFSQU1TIHBhcm1zID0ge307Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRNX01BWF9TQ09fTElOS1M7IHh4KyssIHArKykgewotICAgIGlmICgoKHAtPnN0YXRlID09IFNDT19TVF9DT05ORUNUSU5HKSB8fCAocC0+c3RhdGUgPT0gU0NPX1NUX0xJU1RFTklORykgfHwKLSAgICAgICAgIChwLT5zdGF0ZSA9PSBTQ09fU1RfVzRfQ09OTl9SU1ApKSAmJgotICAgICAgICAocC0+cmVtX2JkX2tub3duKSAmJiAocC0+ZXNjby5kYXRhLmJkX2FkZHIgPT0gYmRhKSkgewotICAgICAgaWYgKGhjaV9zdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciBpZiBvcmlnaW5hdG9yLCBvdGhlcndpc2UgcmVtYWluIGluIExpc3RlbiBtb2RlICovCi0gICAgICAgIGlmIChwLT5pc19vcmlnKSB7Ci0gICAgICAgICAgTE9HX0RFQlVHKCJTQ08gaW5pdGlhdGluZyBjb25uZWN0aW9uIGZhaWxlZCBoYW5kbGU6MHglMDR4IHJlYXNvbjolcyIsCi0gICAgICAgICAgICAgICAgICAgIGhjaV9oYW5kbGUsIGhjaV9lcnJvcl9jb2RlX3RleHQoaGNpX3N0YXR1cykuY19zdHIoKSk7Ci0gICAgICAgICAgc3dpdGNoIChoY2lfc3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIEhDSV9FUlJfUk9MRV9TV0lUQ0hfUEVORElORzoKLSAgICAgICAgICAgICAgLyogSWYgcm9sZSBzd2l0Y2ggaXMgcGVuZGluZywgd2UgbmVlZCB0cnkgYWdhaW4gYWZ0ZXIgcm9sZSBzd2l0Y2gKLSAgICAgICAgICAgICAgICogaXMgY29tcGxldGUgKi8KLSAgICAgICAgICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfUEVORF9ST0xFQ0hBTkdFOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSENJX0VSUl9MTVBfRVJSX1RSQU5TX0NPTExJU0lPTjoKLSAgICAgICAgICAgICAgLyogQXZvaWQgY2FsbGluZyBkaXNjb25uZWN0IGNhbGxiYWNrIGJlY2F1c2Ugb2Ygc2NvIGNyZWF0aW9uIHJhY2UKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogLyogTm90aWZ5IGNsaWVudCBhYm91dCBTQ08gZmFpbHVyZSAqLwotICAgICAgICAgICAgICBwLT5zdGF0ZSA9IFNDT19TVF9VTlVTRUQ7Ci0gICAgICAgICAgICAgICgqcC0+cF9kaXNjX2NiKSh4eCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIEJUTV9Mb2dIaXN0b3J5KAotICAgICAgICAgICAgICBrQnRtTG9nVGFnLCBiZGEsICJDb25uZWN0aW9uIGZhaWxlZCIsCi0gICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICJsb2NhbGx5X2luaXRpYXRlZCByZWFzb246JXMiLAotICAgICAgICAgICAgICAgICAgaGNpX3JlYXNvbl9jb2RlX3RleHQoc3RhdGljX2Nhc3Q8dEhDSV9SRUFTT04+KGhjaV9zdGF0dXMpKQotICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HX0RFQlVHKCJTQ08gdGVybWluYXRpbmcgY29ubmVjdGlvbiBmYWlsZWQgaGFuZGxlOjB4JTA0eCByZWFzb246JXMiLAotICAgICAgICAgICAgICAgICAgICBoY2lfaGFuZGxlLCBoY2lfZXJyb3JfY29kZV90ZXh0KGhjaV9zdGF0dXMpLmNfc3RyKCkpOwotICAgICAgICAgIGlmIChwLT5zdGF0ZSA9PSBTQ09fU1RfQ09OTkVDVElORykgewotICAgICAgICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfVU5VU0VEOwotICAgICAgICAgICAgKCpwLT5wX2Rpc2NfY2IpKHh4KTsKLSAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHAtPnN0YXRlID0gU0NPX1NUX0xJU1RFTklORzsKLSAgICAgICAgICBCVE1fTG9nSGlzdG9yeSgKLSAgICAgICAgICAgICAga0J0bUxvZ1RhZywgYmRhLCAiQ29ubmVjdGlvbiBmYWlsZWQiLAotICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAicmVtb3RlX2luaXRpYXRlZCByZWFzb246JXMiLAotICAgICAgICAgICAgICAgICAgaGNpX3JlYXNvbl9jb2RlX3RleHQoc3RhdGljX2Nhc3Q8dEhDSV9SRUFTT04+KGhjaV9zdGF0dXMpKQotICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBCVE1fTG9nSGlzdG9yeSgKLSAgICAgICAgICBrQnRtTG9nVGFnLCBiZGEsICJDb25uZWN0aW9uIGNyZWF0ZWQiLAotICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50Zigic2NvX2lkeDolaHUgaGFuZGxlOjB4JTA0eCAiLCB4eCwgaGNpX2hhbmRsZSkpOwotCi0gICAgICBpZiAocC0+c3RhdGUgPT0gU0NPX1NUX0xJU1RFTklORykgc3B0ID0gdHJ1ZTsKLQotICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfQ09OTkVDVEVEOwotICAgICAgcC0+aGNpX2hhbmRsZSA9IGhjaV9oYW5kbGU7Ci0KLSAgICAgIGlmIChoY2lfc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIGJkYSwgIkNvbm5lY3Rpb24gc3VjY2VzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiaGFuZGxlOjB4JTA0eCAlcyIsIGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3B0KSA/ICJsaXN0ZW5lciIgOiAiaW5pdGlhdG9yIikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQlRNX0xvZ0hpc3RvcnkoCi0gICAgICAgICAgICBrQnRtTG9nVGFnLCBiZGEsICJDb25uZWN0aW9uIGZhaWxlZCIsCi0gICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgInJlYXNvbjolcyIsCi0gICAgICAgICAgICAgICAgaGNpX3JlYXNvbl9jb2RlX3RleHQoc3RhdGljX2Nhc3Q8dEhDSV9SRUFTT04+KGhjaV9zdGF0dXMpKQotICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSkpOwotICAgICAgfQotCi0gICAgICBpZiAoIWJ0bV9jYi5zY29fY2IuZXNjb19zdXBwb3J0ZWQpIHsKLSAgICAgICAgcC0+ZXNjby5kYXRhLmxpbmtfdHlwZSA9IEJUTV9MSU5LX1RZUEVfU0NPOwotICAgICAgICBpZiAoc3B0KSB7Ci0gICAgICAgICAgcGFybXMucGFja2V0X3R5cGVzID0gcC0+ZXNjby5zZXR1cC5wYWNrZXRfdHlwZXM7Ci0gICAgICAgICAgLyogS2VlcCB0aGUgb3RoZXIgcGFyYW1ldGVycyB0aGUgc2FtZSBmb3IgU0NPICovCi0gICAgICAgICAgcGFybXMubWF4X2xhdGVuY3lfbXMgPSBwLT5lc2NvLnNldHVwLm1heF9sYXRlbmN5X21zOwotICAgICAgICAgIHBhcm1zLnJldHJhbnNtaXNzaW9uX2VmZm9ydCA9IHAtPmVzY28uc2V0dXAucmV0cmFuc21pc3Npb25fZWZmb3J0OwotCi0gICAgICAgICAgQlRNX0NoYW5nZUVTY29MaW5rUGFybXMoeHgsICZwYXJtcyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwX2VzY29fZGF0YSkgcC0+ZXNjby5kYXRhID0gKnBfZXNjb19kYXRhOwotICAgICAgfQotCi0gICAgICAoKnAtPnBfY29ubl9jYikoeHgpOwotCi0gICAgICBibHVldG9vdGg6OmF1ZGlvOjpzY286Om9wZW4oKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlbW92ZVNjbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVtb3ZlIGEgc3BlY2lmaWMgU0NPIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUmVtb3ZlU2NvKHVpbnQxNl90IHNjb19pbngpIHsKLSAgdFNDT19DT05OKiBwID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiW3Njb19pbnhdOwotICB0QlRNX1BNX1NUQVRFIHN0YXRlID0gQlRNX1BNX1NUX0lOVkFMSUQ7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoQlRNX01BWF9TQ09fTElOS1MgPT0gMCkgewotICAgIHJldHVybiBCVE1fTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgLyogVmFsaWRpdHkgY2hlY2sgKi8KLSAgaWYgKChzY29faW54ID49IEJUTV9NQVhfU0NPX0xJTktTKSB8fCAocC0+c3RhdGUgPT0gU0NPX1NUX1VOVVNFRCkpCi0gICAgcmV0dXJuIChCVE1fVU5LTk9XTl9BRERSKTsKLQotICAvKiBJZiBubyBIQ0kgaGFuZGxlLCBzaW1wbHkgZHJvcCB0aGUgY29ubmVjdGlvbiBhbmQgcmV0dXJuICovCi0gIGlmIChwLT5oY2lfaGFuZGxlID09IEhDSV9JTlZBTElEX0hBTkRMRSB8fCBwLT5zdGF0ZSA9PSBTQ09fU1RfUEVORF9VTlBBUkspIHsKLSAgICBwLT5oY2lfaGFuZGxlID0gSENJX0lOVkFMSURfSEFORExFOwotICAgIHAtPnN0YXRlID0gU0NPX1NUX1VOVVNFRDsKLSAgICBwLT5lc2NvLnBfZXNjb19jYmFjayA9IE5VTEw7IC8qIERlcmVnaXN0ZXIgdGhlIGVTQ08gZXZlbnQgY2FsbGJhY2sgKi8KLSAgICByZXR1cm4gKEJUTV9TVUNDRVNTKTsKLSAgfQotCi0gIGlmIChCVE1fUmVhZFBvd2VyTW9kZShwLT5lc2NvLmRhdGEuYmRfYWRkciwgJnN0YXRlKSAmJgotICAgICAgKHN0YXRlID09IEJUTV9QTV9TVF9QRU5ESU5HKSkgewotICAgIEJUTV9UUkFDRV9ERUJVRygiJXM6IEJUTV9QTV9TVF9QRU5ESU5HIGZvciBBQ0wgbWFwcGVkIHdpdGggU0NPIExpbmsgMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHAtPmhjaV9oYW5kbGUpOwotICAgIHAtPnN0YXRlID0gU0NPX1NUX1BFTkRfTU9ERUNIQU5HRTsKLSAgICByZXR1cm4gKEJUTV9DTURfU1RBUlRFRCk7Ci0gIH0KLQotICB0U0NPX1NUQVRFIG9sZF9zdGF0ZSA9IHAtPnN0YXRlOwotICBwLT5zdGF0ZSA9IFNDT19TVF9ESVNDT05ORUNUSU5HOwotCi0gIEdldExlZ2FjeUhjaUludGVyZmFjZSgpLkRpc2Nvbm5lY3QocC0+SGFuZGxlKCksIEhDSV9FUlJfUEVFUl9VU0VSKTsKLQotICBMT0dfREVCVUcoIkRpc2Nvbm5lY3RpbmcgbGluayBzY29faGFuZGxlOjB4JTA0eCBwZWVyOiVzIiwgcC0+SGFuZGxlKCksCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MocC0+ZXNjby5kYXRhLmJkX2FkZHIpKTsKLSAgQlRNX0xvZ0hpc3RvcnkoCi0gICAgICBrQnRtTG9nVGFnLCBwLT5lc2NvLmRhdGEuYmRfYWRkciwgIkRpc2Nvbm5lY3RpbmciLAotICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCJsb2NhbCBpbml0aWF0ZWQgaGFuZGxlOjB4JTA0eCBwcmV2aW91c19zdGF0ZTolcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcC0+SGFuZGxlKCksIHNjb19zdGF0ZV90ZXh0KG9sZF9zdGF0ZSkuY19zdHIoKSkpOwotICByZXR1cm4gKEJUTV9DTURfU1RBUlRFRCk7Ci19Ci0KLXZvaWQgQlRNX1JlbW92ZVNjbyhjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdFNDT19DT05OKiBwID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiWzBdOwotICB1aW50MTZfdCB4eDsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBCVE1fTUFYX1NDT19MSU5LUzsgeHgrKywgcCsrKSB7Ci0gICAgaWYgKHAtPnJlbV9iZF9rbm93biAmJiBwLT5lc2NvLmRhdGEuYmRfYWRkciA9PSBiZGEpIHsKLSAgICAgIEJUTV9SZW1vdmVTY28oeHgpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Njb19yZW1vdmVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsb3dlciBsYXllcnMgd2hlbiBhbgotICogICAgICAgICAgICAgICAgICBkaXNjb25uZWN0IGlzIHJlY2VpdmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0aGUgbGluayBpcyBrbm93biBhYm91dCwgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9zY29fcmVtb3ZlZCh1aW50MTZfdCBoY2lfaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgdFNDT19DT05OKiBwID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiWzBdOwotICB1aW50MTZfdCB4eDsKLQotICBwID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiWzBdOwotICBmb3IgKHh4ID0gMDsgeHggPCBCVE1fTUFYX1NDT19MSU5LUzsgeHgrKywgcCsrKSB7Ci0gICAgaWYgKChwLT5zdGF0ZSAhPSBTQ09fU1RfVU5VU0VEKSAmJiAocC0+c3RhdGUgIT0gU0NPX1NUX0xJU1RFTklORykgJiYKLSAgICAgICAgKHAtPmhjaV9oYW5kbGUgPT0gaGNpX2hhbmRsZSkpIHsKLSAgICAgIHAtPnN0YXRlID0gU0NPX1NUX1VOVVNFRDsKLSAgICAgIHAtPmhjaV9oYW5kbGUgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICBwLT5yZW1fYmRfa25vd24gPSBmYWxzZTsKLSAgICAgIHAtPmVzY28ucF9lc2NvX2NiYWNrID0gTlVMTDsgLyogRGVyZWdpc3RlciBlU0NPIGNhbGxiYWNrICovCi0gICAgICAoKnAtPnBfZGlzY19jYikoeHgpOwotICAgICAgTE9HX0RFQlVHKCJEaXNjb25uZWN0ZWQgU0NPIGxpbmsgaGFuZGxlOiVodSByZWFzb246JXMiLCBoY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgIGhjaV9yZWFzb25fY29kZV90ZXh0KHJlYXNvbikuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGJ0bV9zY29fb25fZXNjb19jb25uZWN0X3JlcXVlc3QoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBjb25zdCBibHVldG9vdGg6OnR5cGVzOjpDbGFzc09mRGV2aWNlJiBjb2QpIHsKLSAgTE9HX0RFQlVHKCJSZW1vdGUgRVNDTyBjb25uZWN0IHJlcXVlc3QgcmVtb3RlOiVzIGNvZDolcyIsCi0gICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRhKSwgY29kLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIGJ0bV9zY29fY29ubl9yZXEoYmRhLCBjb2QuY29kLCBCVE1fTElOS19UWVBFX0VTQ08pOwotfQotCi12b2lkIGJ0bV9zY29fb25fc2NvX2Nvbm5lY3RfcmVxdWVzdCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGNvbnN0IGJsdWV0b290aDo6dHlwZXM6OkNsYXNzT2ZEZXZpY2UmIGNvZCkgewotICBMT0dfREVCVUcoIlJlbW90ZSBTQ08gY29ubmVjdCByZXF1ZXN0IHJlbW90ZTolcyBjb2Q6JXMiLCBQUklWQVRFX0FERFJFU1MoYmRhKSwKLSAgICAgICAgICAgIGNvZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBidG1fc2NvX2Nvbm5fcmVxKGJkYSwgY29kLmNvZCwgQlRNX0xJTktfVFlQRV9TQ08pOwotfQotCi12b2lkIGJ0bV9zY29fb25fZGlzY29ubmVjdGVkKHVpbnQxNl90IGhjaV9oYW5kbGUsIHRIQ0lfUkVBU09OIHJlYXNvbikgewotICB0U0NPX0NPTk4qIHBfc2NvID0gYnRtX2NiLnNjb19jYi5nZXRfc2NvX2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUoaGNpX2hhbmRsZSk7Ci0gIGlmIChwX3NjbyA9PSBudWxscHRyKSB7Ci0gICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gZmluZCBzY28gY29ubmVjdGlvbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghcF9zY28tPmlzX2FjdGl2ZSgpKSB7Ci0gICAgTE9HX0VSUk9SKCJDb25uZWN0aW9uIGlzIG5vdCBhY3RpdmUgaGFuZGxlOjB4JTA0eCByZWFzb246JXMiLCBoY2lfaGFuZGxlLAotICAgICAgICAgICAgICBoY2lfcmVhc29uX2NvZGVfdGV4dChyZWFzb24pLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3Njby0+c3RhdGUgPT0gU0NPX1NUX0xJU1RFTklORykgewotICAgIExPR19FUlJPUigiQ29ubmVjdGlvbiBpcyBpbiBsaXN0ZW5pbmcgc3RhdGUgaGFuZGxlOjB4JTA0eCByZWFzb246JXMiLAotICAgICAgICAgICAgICBoY2lfaGFuZGxlLCBoY2lfcmVhc29uX2NvZGVfdGV4dChyZWFzb24pLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkcihwX3Njby0+ZXNjby5kYXRhLmJkX2FkZHIpOwotCi0gIHBfc2NvLT5zdGF0ZSA9IFNDT19TVF9VTlVTRUQ7Ci0gIHBfc2NvLT5oY2lfaGFuZGxlID0gSENJX0lOVkFMSURfSEFORExFOwotICBwX3Njby0+cmVtX2JkX2tub3duID0gZmFsc2U7Ci0gIHBfc2NvLT5lc2NvLnBfZXNjb19jYmFjayA9IE5VTEw7IC8qIERlcmVnaXN0ZXIgZVNDTyBjYWxsYmFjayAqLwotICAoKnBfc2NvLT5wX2Rpc2NfY2IpKGJ0bV9jYi5zY29fY2IuZ2V0X2luZGV4KHBfc2NvKSk7Ci0gIExPR19ERUJVRygiRGlzY29ubmVjdGVkIFNDTyBsaW5rIGhhbmRsZTolaHUgcmVhc29uOiVzIiwgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgIGhjaV9yZWFzb25fY29kZV90ZXh0KHJlYXNvbikuY19zdHIoKSk7Ci0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIGJkX2FkZHIsICJEaXNjb25uZWN0ZWQiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoImhhbmRsZToweCUwNHggcmVhc29uOiVzIiwgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9yZWFzb25fY29kZV90ZXh0KHJlYXNvbikuY19zdHIoKSkpOwotCi0gIGJsdWV0b290aDo6YXVkaW86OnNjbzo6Y2xlYW51cCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Njb19hY2xfcmVtb3ZlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBBQ0wgY29ubmVjdGlvbiBpcwotICogICAgICAgICAgICAgICAgICByZW1vdmVkLiBJZiB0aGUgQkQgYWRkcmVzcyBpcyBOVUxMLCBpdCBpcyBhc3N1bWVkIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgdGhlIGxvY2FsIGRldmljZSBpcyBkb3duLCBhbmQgYWxsIFNDTyBsaW5rcyBhcmUgcmVtb3ZlZC4KLSAqICAgICAgICAgICAgICAgICAgSWYgYSBzcGVjaWZpYyBCRCBhZGRyZXNzIGlzIHBhc3NlZCwgb25seSBTQ08gY29ubmVjdGlvbnMKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhhdCBCRCBhZGRyZXNzIGFyZSByZW1vdmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zY29fYWNsX3JlbW92ZWQoY29uc3QgUmF3QWRkcmVzcyogYmRhKSB7Ci0gIHRTQ09fQ09OTiogcCA9ICZidG1fY2Iuc2NvX2NiLnNjb19kYlswXTsKLSAgdWludDE2X3QgeHg7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRNX01BWF9TQ09fTElOS1M7IHh4KyssIHArKykgewotICAgIGlmIChwLT5zdGF0ZSAhPSBTQ09fU1RfVU5VU0VEKSB7Ci0gICAgICBpZiAoKCFiZGEpIHx8IChwLT5lc2NvLmRhdGEuYmRfYWRkciA9PSAqYmRhICYmIHAtPnJlbV9iZF9rbm93bikpIHsKLSAgICAgICAgcC0+c3RhdGUgPSBTQ09fU1RfVU5VU0VEOwotICAgICAgICBwLT5lc2NvLnBfZXNjb19jYmFjayA9IE5VTEw7IC8qIERlcmVnaXN0ZXIgZVNDTyBjYWxsYmFjayAqLwotICAgICAgICAoKnAtPnBfZGlzY19jYikoeHgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRTY29CZEFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVhZCB0aGUgcmVtb3RlIEJEIEFkZHJlc3MgZm9yIGEgc3BlY2lmaWMKLSAqICAgICAgICAgICAgICAgICAgU0NPIGNvbm5lY3Rpb24sCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIEJEIGFkZHJlc3Mgb3IgTlVMTCBpZiBub3Qga25vd24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgUmF3QWRkcmVzcyogQlRNX1JlYWRTY29CZEFkZHIodWludDE2X3Qgc2NvX2lueCkgewotICB0U0NPX0NPTk4qIHAgPSAmYnRtX2NiLnNjb19jYi5zY29fZGJbc2NvX2lueF07Ci0KLSAgLyogVmFsaWRpdHkgY2hlY2sgKi8KLSAgaWYgKChzY29faW54IDwgQlRNX01BWF9TQ09fTElOS1MpICYmIChwLT5yZW1fYmRfa25vd24pKQotICAgIHJldHVybiAmKHAtPmVzY28uZGF0YS5iZF9hZGRyKTsKLSAgZWxzZQotICAgIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0RVNjb01vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzIGZvciBTQ08gb3IKLSAqICAgICAgICAgICAgICAgICAgZVNDTywgYW5kIHNldHMgYXMgdGhlIGRlZmF1bHQgbW9kZSB1c2VkIGZvciBvdXRnb2luZyBjYWxscwotICogICAgICAgICAgICAgICAgICB0byBCVE1fQ3JlYXRlU2NvLiAgSXQgZG9lcyBub3QgY2hhbmdlIGFueSBjdXJyZW50bHkgYWN0aXZlCi0gKiAgICAgICAgICAgICAgICAgIChlKVNDTyBsaW5rcy4KLSAqICAgICAgICAgICAgICAgICAgTm90ZTogIEluY29taW5nIChlKVNDTyBjb25uZWN0aW9ucyB3aWxsIGFsd2F5cyB1c2UgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuICBJZiBlU0NPIGlzIG5vdAotICogICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZCB0aGUgZmVhdHVyZSBzaG91bGQgYmUgZGlzYWJsZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyJ3MgZmVhdHVyZSBtYXNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgdGhlIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBhY3RpdmUgKGUpU0NPIGxpbmtzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0RVNjb01vZGUoZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFybXMpIHsKLSAgQVNTRVJUX0xPRyhwX3Bhcm1zICE9IG51bGxwdHIsICJlU0NPIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgdmFsdWUiKTsKLSAgZW5oX2VzY29fcGFyYW1zX3QqIHBfZGVmID0gJmJ0bV9jYi5zY29fY2IuZGVmX2VzY29fcGFybXM7Ci0KLSAgaWYgKGJ0bV9jYi5zY29fY2IuZXNjb19zdXBwb3J0ZWQpIHsKLSAgICAqcF9kZWYgPSAqcF9wYXJtczsKLSAgICBMT0dfREVCVUcoCi0gICAgICAgICJTZXR0aW5nIGVTQ08gbW9kZSBwYXJhbWV0ZXJzIHR4Ync6MHglMDh4IHJ4Ync6MHglMDh4IG1heF9sYXQ6MHglMDR4IgotICAgICAgICAiIHBrdDoweCUwNHggcnR4X2VmZm9ydDoweCUwMngiLAotICAgICAgICBwX2RlZi0+dHJhbnNtaXRfYmFuZHdpZHRoLCBwX2RlZi0+cmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgIHBfZGVmLT5tYXhfbGF0ZW5jeV9tcywgcF9kZWYtPnBhY2tldF90eXBlcywKLSAgICAgICAgcF9kZWYtPnJldHJhbnNtaXNzaW9uX2VmZm9ydCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTG9hZCBkZWZhdWx0cyBmb3IgU0NPIG9ubHkgKi8KLSAgICAqcF9kZWYgPSBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjKFNDT19DT0RFQ19DVlNEX0QxKTsKLSAgICBMT0dfV0FSTigiZVNDTyBub3Qgc3VwcG9ydGVkIHNvIHNldHRpbmcgU0NPIHBhcmFtZXRlcnMgaW5zdGVhZCIpOwotICAgIExPR19ERUJVRygKLSAgICAgICAgIlNldHRpbmcgU0NPIG1vZGUgcGFyYW1ldGVycyB0eGJ3OjB4JTA4eCByeGJ3OjB4JTA4eCBtYXhfbGF0OjB4JTA0eCIKLSAgICAgICAgIiBwa3Q6MHglMDR4IHJ0eF9lZmZvcnQ6MHglMDJ4IiwKLSAgICAgICAgcF9kZWYtPnRyYW5zbWl0X2JhbmR3aWR0aCwgcF9kZWYtPnJlY2VpdmVfYmFuZHdpZHRoLAotICAgICAgICBwX2RlZi0+bWF4X2xhdGVuY3lfbXMsIHBfZGVmLT5wYWNrZXRfdHlwZXMsCi0gICAgICAgIHBfZGVmLT5yZXRyYW5zbWlzc2lvbl9lZmZvcnQpOwotICB9Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWdGb3JFU2NvRXZ0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBTQ08gZXZlbnQgY2FsbGJhY2sgd2l0aCB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluc3RhbmNlLiAgSXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVjZWl2ZWQKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBpbmRpY2F0aW9uIGV2ZW50cyBhbmQgY2hhbmdlIG9mIGxpbmsgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50cy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHRoZSBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiB0aGVyZSBpcyBhbiBpbGxlZ2FsIHNjb19pbngKLSAqICAgICAgICAgICAgICAgICAgQlRNX01PREVfVU5TVVBQT1JURUQgaWYgY29udHJvbGxlciB2ZXJzaW9uIGlzIG5vdCBCVDEuMiBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVyIG9yIGRvZXMgbm90IHN1cHBvcnQgZVNDTy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlZ0ZvckVTY29FdnRzKHVpbnQxNl90IHNjb19pbngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9FU0NPX0NCQUNLKiBwX2VzY29fY2JhY2spIHsKLSAgaWYgKEJUTV9NQVhfU0NPX0xJTktTID09IDApIHsKLSAgICByZXR1cm4gQlRNX01PREVfVU5TVVBQT1JURUQ7Ci0gIH0KLQotICBpZiAoIWJ0bV9jYi5zY29fY2IuZXNjb19zdXBwb3J0ZWQpIHsKLSAgICBidG1fY2Iuc2NvX2NiLnNjb19kYltzY29faW54XS5lc2NvLnBfZXNjb19jYmFjayA9IE5VTEw7Ci0gICAgcmV0dXJuIChCVE1fTU9ERV9VTlNVUFBPUlRFRCk7Ci0gIH0KLQotICBpZiAoc2NvX2lueCA8IEJUTV9NQVhfU0NPX0xJTktTICYmCi0gICAgICBidG1fY2Iuc2NvX2NiLnNjb19kYltzY29faW54XS5zdGF0ZSAhPSBTQ09fU1RfVU5VU0VEKSB7Ci0gICAgYnRtX2NiLnNjb19jYi5zY29fZGJbc2NvX2lueF0uZXNjby5wX2VzY29fY2JhY2sgPSBwX2VzY29fY2JhY2s7Ci0gICAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci0gIH0KLSAgcmV0dXJuIChCVE1fSUxMRUdBTF9WQUxVRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ2hhbmdlRVNjb0xpbmtQYXJtcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXF1ZXN0cyByZW5lZ290aWF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIG9uCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGVTQ08gTGluay4gIElmIGFueSBvZiB0aGUgY2hhbmdlcyBhcmUgYWNjZXB0ZWQKLSAqICAgICAgICAgICAgICAgICAgYnkgdGhlIGNvbnRyb2xsZXJzLCB0aGUgQlRNX0VTQ09fQ0hHX0VWVCBldmVudCBpcyBzZW50IGluCi0gKiAgICAgICAgICAgICAgICAgIHRoZSB0QlRNX0VTQ09fQ0JBQ0sgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBzZXR0aW5ncyBvZgotICogICAgICAgICAgICAgICAgICB0aGUgbGluay4gVGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaCB0aGUgY2FsbCB0bwotICogICAgICAgICAgICAgICAgICBCVE1fU2V0RVNjb01vZGUuCi0gKgotICogICAgICAgICAgICAgICAgICBOb3RlOiBJZiBjYWxsZWQgb3ZlciBhIFNDTyBsaW5rIChpbmNsdWRpbmcgMS4xIGNvbnRyb2xsZXIpLAotICogICAgICAgICAgICAgICAgICAgICAgICBhIGNoYW5nZSBwYWNrZXQgdHlwZSByZXF1ZXN0IGlzIHNlbnQgb3V0IGluc3RlYWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgY29tbWFuZCBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkLgotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIC0gbm90IGVub3VnaCByZXNvdXJjZXMgdG8gaW5pdGlhdGUgY29tbWFuZC4KLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUgaWYgbm8gY29ubmVjdGlvbiB3aXRoIGEgcGVlciBkZXZpY2Ugb3IgYmFkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb19pbnguCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0QlRNX1NUQVRVUyBCVE1fQ2hhbmdlRVNjb0xpbmtQYXJtcyh1aW50MTZfdCBzY29faW54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ0hHX0VTQ09fUEFSQU1TKiBwX3Bhcm1zKSB7Ci0gIC8qIE1ha2Ugc3VyZSBzY28gaGFuZGxlIGlzIHZhbGlkIGFuZCBvbiBhbiBhY3RpdmUgbGluayAqLwotICBpZiAoc2NvX2lueCA+PSBCVE1fTUFYX1NDT19MSU5LUyB8fAotICAgICAgYnRtX2NiLnNjb19jYi5zY29fZGJbc2NvX2lueF0uc3RhdGUgIT0gU0NPX1NUX0NPTk5FQ1RFRCkKLSAgICByZXR1cm4gKEJUTV9XUk9OR19NT0RFKTsKLQotICB0U0NPX0NPTk4qIHBfc2NvID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiW3Njb19pbnhdOwotICBlbmhfZXNjb19wYXJhbXNfdCogcF9zZXR1cCA9ICZwX3Njby0+ZXNjby5zZXR1cDsKLQotICAvKiBTYXZlIHRoZSBwcmV2aW91cyB0eXBlcyBpbiBjYXNlIGNvbW1hbmQgZmFpbHMgKi8KLSAgdWludDE2X3Qgc2F2ZWRfcGFja2V0X3R5cGVzID0gcF9zZXR1cC0+cGFja2V0X3R5cGVzOwotCi0gIC8qIElmIFNDTyBjb25uZWN0aW9uIE9SIGVTQ08gbm90IHN1cHBvcnRlZCBqdXN0IHNlbmQgY2hhbmdlIHBhY2tldCB0eXBlcyAqLwotICBpZiAocF9zY28tPmVzY28uZGF0YS5saW5rX3R5cGUgPT0gQlRNX0xJTktfVFlQRV9TQ08gfHwKLSAgICAgICFidG1fY2Iuc2NvX2NiLmVzY29fc3VwcG9ydGVkKSB7Ci0gICAgcF9zZXR1cC0+cGFja2V0X3R5cGVzID0KLSAgICAgICAgcF9wYXJtcy0+cGFja2V0X3R5cGVzICYKLSAgICAgICAgKGJ0bV9jYi5idG1fc2NvX3BrdF90eXBlc19zdXBwb3J0ZWQgJiBCVE1fU0NPX0xJTktfT05MWV9NQVNLKTsKLQotICAgIEJUTV9UUkFDRV9BUEkoIiVzOiBTQ08gTGluayBmb3IgaGFuZGxlIDB4JTA0eCwgcGt0IDB4JTA0eCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgcF9zY28tPmhjaV9oYW5kbGUsIHBfc2V0dXAtPnBhY2tldF90eXBlcyk7Ci0KLSAgICBCVE1fVFJBQ0VfQVBJKCIlczogU0NPIExpbmsgZm9yIGhhbmRsZSAweCUwNHgsIHBrdCAweCUwNHgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIHBfc2NvLT5oY2lfaGFuZGxlLCBwX3NldHVwLT5wYWNrZXRfdHlwZXMpOwotCi0gICAgYnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlKHBfc2NvLT5oY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fRVNDT18yX1NDTyhwX3NldHVwLT5wYWNrZXRfdHlwZXMpKTsKLSAgfSBlbHNlIC8qIGVTQ08gaXMgc3VwcG9ydGVkIGFuZCB0aGUgbGluayB0eXBlIGlzIGVTQ08gKi8KLSAgewotICAgIHVpbnQxNl90IHRlbXBfcGFja2V0X3R5cGVzID0KLSAgICAgICAgKHBfcGFybXMtPnBhY2tldF90eXBlcyAmIEJUTV9TQ09fU1VQUE9SVEVEX1BLVFNfTUFTSyAmCi0gICAgICAgICBidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkKTsKLQotICAgIC8qIE9SIGluIGFueSBleGNlcHRpb24gcGFja2V0IHR5cGVzICovCi0gICAgdGVtcF9wYWNrZXRfdHlwZXMgfD0KLSAgICAgICAgKChwX3Bhcm1zLT5wYWNrZXRfdHlwZXMgJiBCVE1fU0NPX0VYQ0VQVElPTl9QS1RTX01BU0spIHwKLSAgICAgICAgIChidG1fY2IuYnRtX3Njb19wa3RfdHlwZXNfc3VwcG9ydGVkICYgQlRNX1NDT19FWENFUFRJT05fUEtUU19NQVNLKSk7Ci0gICAgcF9zZXR1cC0+cGFja2V0X3R5cGVzID0gdGVtcF9wYWNrZXRfdHlwZXM7Ci0KLSAgICBCVE1fVFJBQ0VfQVBJKCIlcyAtPiBlU0NPIExpbmsgZm9yIGhhbmRsZSAweCUwNHgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIHBfc2NvLT5oY2lfaGFuZGxlKTsKLSAgICBCVE1fVFJBQ0VfQVBJKAotICAgICAgICAiICAgdHhidyAweCV4LCByeGJ3IDB4JXgsIGxhdCAweCV4LCByZXRyYW5zIDB4JTAyeCwgcGt0IDB4JTA0eCIsCi0gICAgICAgIHBfc2V0dXAtPnRyYW5zbWl0X2JhbmR3aWR0aCwgcF9zZXR1cC0+cmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgIHBfcGFybXMtPm1heF9sYXRlbmN5X21zLCBwX3Bhcm1zLT5yZXRyYW5zbWlzc2lvbl9lZmZvcnQsCi0gICAgICAgIHRlbXBfcGFja2V0X3R5cGVzKTsKLQotICAgIC8qIFVzZSBFbmhhbmNlZCBTeW5jaHJvbm91cyBjb21tYW5kcyBpZiBzdXBwb3J0ZWQgKi8KLSAgICBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkKLSAgICAgICAgICAgIC0+c3VwcG9ydHNfZW5oYW5jZWRfc2V0dXBfc3luY2hyb25vdXNfY29ubmVjdGlvbigpKSB7Ci0gICAgICAvKiBVc2UgdGhlIHNhdmVkIFNDTyByb3V0aW5nICovCi0gICAgICBwX3NldHVwLT5pbnB1dF9kYXRhX3BhdGggPSBwX3NldHVwLT5vdXRwdXRfZGF0YV9wYXRoID0gRVNDT19EQVRBX1BBVEg7Ci0KLSAgICAgIGJ0c25kX2hjaWNfZW5oYW5jZWRfc2V0X3VwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24ocF9zY28tPmhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2V0dXApOwotICAgICAgcF9zZXR1cC0+cGFja2V0X3R5cGVzID0gc2F2ZWRfcGFja2V0X3R5cGVzOwotICAgIH0gZWxzZSB7IC8qIFVzZSBvbGRlciBjb21tYW5kICovCi0gICAgICB1aW50MTZfdCB2b2ljZV9jb250ZW50X2Zvcm1hdCA9IGJ0bV9zY29fdm9pY2Vfc2V0dGluZ3NfdG9fbGVnYWN5KHBfc2V0dXApOwotICAgICAgLyogV2hlbiBjaGFuZ2luZyBhbiBleGlzdGluZyBsaW5rLCBvbmx5IGNoYW5nZSBsYXRlbmN5LCByZXRyYW5zLCBhbmQKLSAgICAgICAqIHBrdHMgKi8KLSAgICAgIGJ0c25kX2hjaWNfc2V0dXBfZXNjb19jb25uKHBfc2NvLT5oY2lfaGFuZGxlLCBwX3NldHVwLT50cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NldHVwLT5yZWNlaXZlX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGFybXMtPm1heF9sYXRlbmN5X21zLCB2b2ljZV9jb250ZW50X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGFybXMtPnJldHJhbnNtaXNzaW9uX2VmZm9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2V0dXAtPnBhY2tldF90eXBlcyk7Ci0gICAgfQotCi0gICAgQlRNX1RSQUNFX0FQSSgKLSAgICAgICAgIiVzOiB0eGJ3IDB4JXgsIHJ4YncgMHgleCwgbGF0IDB4JXgsIHJldHJhbnMgMHglMDJ4LCBwa3QgMHglMDR4IiwKLSAgICAgICAgX19mdW5jX18sIHBfc2V0dXAtPnRyYW5zbWl0X2JhbmR3aWR0aCwgcF9zZXR1cC0+cmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgIHBfcGFybXMtPm1heF9sYXRlbmN5X21zLCBwX3Bhcm1zLT5yZXRyYW5zbWlzc2lvbl9lZmZvcnQsCi0gICAgICAgIHRlbXBfcGFja2V0X3R5cGVzKTsKLSAgfQotCi0gIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9FU2NvQ29ublJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdXBvbiByZWNlaXB0IG9mIGFuIChlKVNDTyBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgZXZlbnQgKEJUTV9FU0NPX0NPTk5fUkVRX0VWVCkgdG8gYWNjZXB0IG9yIHJlamVjdAotICogICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdC4gUGFyYW1ldGVycyB1c2VkIHRvIG5lZ290aWF0ZSBlU0NPIGxpbmtzLgotICogICAgICAgICAgICAgICAgICBJZiBwX3Bhcm1zIGlzIE5VTEwsIHRoZW4gdmFsdWVzIHNldCB0aHJvdWdoIEJUTV9TZXRFU2NvTW9kZQotICogICAgICAgICAgICAgICAgICBhcmUgdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgSWYgdGhlIGxpbmsgdHlwZSBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBpcyBTQ08sIHRoZW4gb25seQotICogICAgICAgICAgICAgICAgICB0aGUgdHhfYncsIG1heF9sYXRlbmN5LCBjb250ZW50IGZvcm1hdCwgYW5kIHBhY2tldF90eXBlcyBhcmUKLSAqICAgICAgICAgICAgICAgICAgdmFsaWQuICBUaGUgaGNpX3N0YXR1cyBwYXJhbWV0ZXIgc2hvdWxkIGJlCi0gKiAgICAgICAgICAgICAgICAgIChbMHgwXSB0byBhY2NlcHQsIFsweDBkLi4weDBmXSB0byByZWplY3QpCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9FU2NvQ29ublJzcCh1aW50MTZfdCBzY29faW54LCB1aW50OF90IGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICBlbmhfZXNjb19wYXJhbXNfdCogcF9wYXJtcykgewotICBpZiAoc2NvX2lueCA8IEJUTV9NQVhfU0NPX0xJTktTICYmCi0gICAgICBidG1fY2Iuc2NvX2NiLnNjb19kYltzY29faW54XS5zdGF0ZSA9PSBTQ09fU1RfVzRfQ09OTl9SU1ApIHsKLSAgICBidG1fZXNjb19jb25uX3JzcChzY29faW54LCBoY2lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgIGJ0bV9jYi5zY29fY2Iuc2NvX2RiW3Njb19pbnhdLmVzY28uZGF0YS5iZF9hZGRyLCBwX3Bhcm1zKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2lzX3Njb19hY3RpdmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlZSBpZiBhIFNDTyBoYW5kbGUgaXMgYWxyZWFkeSBpbgotICogICAgICAgICAgICAgICAgICB1c2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2lzX3Njb19hY3RpdmUodWludDE2X3QgaGFuZGxlKSB7Ci0gIHVpbnQxNl90IHh4OwotICB0U0NPX0NPTk4qIHAgPSAmYnRtX2NiLnNjb19jYi5zY29fZGJbMF07Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQlRNX01BWF9TQ09fTElOS1M7IHh4KyssIHArKykgewotICAgIGlmIChoYW5kbGUgPT0gcC0+aGNpX2hhbmRsZSAmJiBwLT5zdGF0ZSA9PSBTQ09fU1RfQ09OTkVDVEVEKSByZXR1cm4gKHRydWUpOwotICB9Ci0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldE51bVNjb0xpbmtzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgc2NvIGxpbmtzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDhfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9HZXROdW1TY29MaW5rcyh2b2lkKSB7Ci0gIHRTQ09fQ09OTiogcCA9ICZidG1fY2Iuc2NvX2NiLnNjb19kYlswXTsKLSAgdWludDE2X3QgeHg7Ci0gIHVpbnQ4X3QgbnVtX3Njb3MgPSAwOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IEJUTV9NQVhfU0NPX0xJTktTOyB4eCsrLCBwKyspIHsKLSAgICBzd2l0Y2ggKHAtPnN0YXRlKSB7Ci0gICAgICBjYXNlIFNDT19TVF9XNF9DT05OX1JTUDoKLSAgICAgIGNhc2UgU0NPX1NUX0NPTk5FQ1RJTkc6Ci0gICAgICBjYXNlIFNDT19TVF9DT05ORUNURUQ6Ci0gICAgICBjYXNlIFNDT19TVF9ESVNDT05ORUNUSU5HOgotICAgICAgY2FzZSBTQ09fU1RfUEVORF9VTlBBUks6Ci0gICAgICAgIG51bV9zY29zKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAobnVtX3Njb3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0lzU2NvQWN0aXZlQnlCZGFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlZSBpZiBhIFNDTyBjb25uZWN0aW9uIGlzIGFjdGl2ZQotICogICAgICAgICAgICAgICAgICBmb3IgYSBiZCBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9Jc1Njb0FjdGl2ZUJ5QmRhZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgdWludDhfdCB4eDsKLSAgdFNDT19DT05OKiBwID0gJmJ0bV9jYi5zY29fY2Iuc2NvX2RiWzBdOwotCi0gIC8qIElmIGFueSBTQ08gaXMgYmVpbmcgZXN0YWJsaXNoZWQgdG8gdGhlIHJlbW90ZSBCRCBhZGRyZXNzLCByZWZ1c2UgdGhpcyAqLwotICBmb3IgKHh4ID0gMDsgeHggPCBCVE1fTUFYX1NDT19MSU5LUzsgeHgrKywgcCsrKSB7Ci0gICAgaWYgKHAtPmVzY28uZGF0YS5iZF9hZGRyID09IHJlbW90ZV9iZGEgJiYgcC0+c3RhdGUgPT0gU0NPX1NUX0NPTk5FQ1RFRCkgewotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2NvX3ZvaWNlX3NldHRpbmdzXzJfbGVnYWN5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb252ZXJ0IHRoZSBFbmhhbmNlZCBlU0NPCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW50byB2b2ljZSBzZXR0aW5nIHBhcmFtZXRlciBtYXNrIHVzZWQKLSAqICAgICAgICAgICAgICAgICAgZm9yIGxlZ2FjeSBzZXR1cCBzeW5jaHJvbm91cyBjb25uZWN0aW9uIEhDSSBjb21tYW5kcwotICoKLSAqIFJldHVybnMgICAgICAgICAgVUlOVDE2IC0gMTYtYml0IG1hc2sgZm9yIHZvaWNlIHNldHRpbmdzCi0gKgotICogICAgICAgICAgSENJX0lOUF9DT0RJTkdfTElORUFSICAgICAgICAgICAweDAwMDAgKDAwMDAwMDAwMDApCi0gKiAgICAgICAgICBIQ0lfSU5QX0NPRElOR19VX0xBVyAgICAgICAgICAgIDB4MDEwMCAoMDEwMDAwMDAwMCkKLSAqICAgICAgICAgIEhDSV9JTlBfQ09ESU5HX0FfTEFXICAgICAgICAgICAgMHgwMjAwICgxMDAwMDAwMDAwKQotICogICAgICAgICAgSENJX0lOUF9DT0RJTkdfTUFTSyAgICAgICAgICAgICAweDAzMDAgKDExMDAwMDAwMDApCi0gKgotICogICAgICAgICAgSENJX0lOUF9EQVRBX0ZNVF8xU19DT01QTEVNRU5UICAweDAwMDAgKDAwMDAwMDAwMDApCi0gKiAgICAgICAgICBIQ0lfSU5QX0RBVEFfRk1UXzJTX0NPTVBMRU1FTlQgIDB4MDA0MCAoMDAwMTAwMDAwMCkKLSAqICAgICAgICAgIEhDSV9JTlBfREFUQV9GTVRfU0lHTl9NQUdOSVRVREUgMHgwMDgwICgwMDEwMDAwMDAwKQotICogICAgICAgICAgSENJX0lOUF9EQVRBX0ZNVF9VTlNJR05FRCAgICAgICAweDAwYzAgKDAwMTEwMDAwMDApCi0gKiAgICAgICAgICBIQ0lfSU5QX0RBVEFfRk1UX01BU0sgICAgICAgICAgIDB4MDBjMCAoMDAxMTAwMDAwMCkKLSAqCi0gKiAgICAgICAgICBIQ0lfSU5QX1NBTVBMRV9TSVpFXzhCSVQgICAgICAgIDB4MDAwMCAoMDAwMDAwMDAwMCkKLSAqICAgICAgICAgIEhDSV9JTlBfU0FNUExFX1NJWkVfMTZCSVQgICAgICAgMHgwMDIwICgwMDAwMTAwMDAwKQotICogICAgICAgICAgSENJX0lOUF9TQU1QTEVfU0laRV9NQVNLICAgICAgICAweDAwMjAgKDAwMDAxMDAwMDApCi0gKgotICogICAgICAgICAgSENJX0lOUF9MSU5FQVJfUENNX0JJVF9QT1NfTUFTSyAweDAwMWMgKDAwMDAwMTExMDApCi0gKiAgICAgICAgICBIQ0lfSU5QX0xJTkVBUl9QQ01fQklUX1BPU19PRkZTIDIKLSAqCi0gKiAgICAgICAgICBIQ0lfQUlSX0NPRElOR19GT1JNQVRfQ1ZTRCAgICAgIDB4MDAwMCAoMDAwMDAwMDAwMCkKLSAqICAgICAgICAgIEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9VX0xBVyAgICAgMHgwMDAxICgwMDAwMDAwMDAxKQotICogICAgICAgICAgSENJX0FJUl9DT0RJTkdfRk9STUFUX0FfTEFXICAgICAweDAwMDIgKDAwMDAwMDAwMTApCi0gKiAgICAgICAgICBIQ0lfQUlSX0NPRElOR19GT1JNQVRfVFJBTlNQTlQgIDB4MDAwMyAoMDAwMDAwMDAxMSkKLSAqICAgICAgICAgIEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9NQVNLICAgICAgMHgwMDAzICgwMDAwMDAwMDExKQotICoKLSAqICAgICAgICAgIGRlZmF1bHQgKDAwMDExMDAwMDApCi0gKiAgICAgICAgICBIQ0lfREVGQVVMVF9WT0lDRV9TRVRUSU5HUyAgICAoSENJX0lOUF9DT0RJTkdfTElORUFSIFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhDSV9JTlBfREFUQV9GTVRfMlNfQ09NUExFTUVOVCBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIQ0lfSU5QX1NBTVBMRV9TSVpFXzE2QklUIFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9DVlNEKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDE2X3QgYnRtX3Njb192b2ljZV9zZXR0aW5nc190b19sZWdhY3koZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFyYW1zKSB7Ci0gIHVpbnQxNl90IHZvaWNlX3NldHRpbmdzID0gMDsKLQotICAvKiBDb252ZXJ0IElucHV0IENvZGluZyBGb3JtYXQ6IElmIG5vIHVMYXcgb3IgYUxBVyB0aGVuIExpbmVhciB3aWxsIGJlIHVzZWQKLSAgICogKDApICovCi0gIGlmIChwX3BhcmFtcy0+aW5wdXRfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0ID09IEVTQ09fQ09ESU5HX0ZPUk1BVF9VTEFXKQotICAgIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9JTlBfQ09ESU5HX1VfTEFXOwotICBlbHNlIGlmIChwX3BhcmFtcy0+aW5wdXRfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0ID09Ci0gICAgICAgICAgIEVTQ09fQ09ESU5HX0ZPUk1BVF9BTEFXKQotICAgIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9JTlBfQ09ESU5HX0FfTEFXOwotICAvKiBlbHNlIGRlZmF1bHQgdmFsdWUgb2YgJzAgaXMgZ29vZCAnTGluZWFyJyAqLwotCi0gIC8qIENvbnZlcnQgSW5wdXQgRGF0YSBGb3JtYXQuIFVzZSAyJ3MgQ29tcGxpbWVudCBhcyB0aGUgZGVmYXVsdCAqLwotICBzd2l0Y2ggKHBfcGFyYW1zLT5pbnB1dF9wY21fZGF0YV9mb3JtYXQpIHsKLSAgICBjYXNlIEVTQ09fUENNX0RBVEFfRk9STUFUXzFfQ09NUDoKLSAgICAgIC8qIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9JTlBfREFUQV9GTVRfMVNfQ09NUExFTUVOVDsgICAgIHZhbHVlIGlzICcwJwotICAgICAgICogYWxyZWFkeSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVTQ09fUENNX0RBVEFfRk9STUFUX1NJR046Ci0gICAgICB2b2ljZV9zZXR0aW5ncyB8PSBIQ0lfSU5QX0RBVEFfRk1UX1NJR05fTUFHTklUVURFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVTQ09fUENNX0RBVEFfRk9STUFUX1VOU0lHTjoKLSAgICAgIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9JTlBfREFUQV9GTVRfVU5TSUdORUQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6IC8qIDIncyBDb21wbGltZW50ICovCi0gICAgICB2b2ljZV9zZXR0aW5ncyB8PSBIQ0lfSU5QX0RBVEFfRk1UXzJTX0NPTVBMRU1FTlQ7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIENvbnZlcnQgT3ZlciB0aGUgQWlyIENvZGluZy4gVXNlIENWU0QgYXMgdGhlIGRlZmF1bHQgKi8KLSAgc3dpdGNoIChwX3BhcmFtcy0+dHJhbnNtaXRfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0KSB7Ci0gICAgY2FzZSBFU0NPX0NPRElOR19GT1JNQVRfVUxBVzoKLSAgICAgIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9VX0xBVzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFU0NPX0NPRElOR19GT1JNQVRfQUxBVzoKLSAgICAgIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9BX0xBVzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFU0NPX0NPRElOR19GT1JNQVRfTVNCQzoKLSAgICAgIHZvaWNlX3NldHRpbmdzIHw9IEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9UUkFOU1BOVDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogLyogQ1ZTRCAoMCkgKi8KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ29udmVydCBQQ00gcGF5bG9hZCBNU0IgcG9zaXRpb24gKDAwMDAwMTExMDApICovCi0gIHZvaWNlX3NldHRpbmdzIHw9ICh1aW50MTZfdCkoKChwX3BhcmFtcy0+aW5wdXRfcGNtX3BheWxvYWRfbXNiX3Bvc2l0aW9uICYgMHg3KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBIQ0lfSU5QX0xJTkVBUl9QQ01fQklUX1BPU19PRkZTKSk7Ci0KLSAgLyogQ29udmVydCBJbnB1dCBTYW1wbGUgU2l6ZSAoMDAwMDAxMTEwMCkgKi8KLSAgaWYgKHBfcGFyYW1zLT5pbnB1dF9jb2RlZF9kYXRhX3NpemUgPT0gMTYpCi0gICAgdm9pY2Vfc2V0dGluZ3MgfD0gSENJX0lOUF9TQU1QTEVfU0laRV8xNkJJVDsKLSAgZWxzZSAvKiBVc2UgOCBiaXQgZm9yIGFsbCBvdGhlcnMgKi8KLSAgICB2b2ljZV9zZXR0aW5ncyB8PSBIQ0lfSU5QX1NBTVBMRV9TSVpFXzhCSVQ7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlczogdm9pY2Ugc2V0dGluZyBmb3IgbGVnYWN5IDB4JTAzeCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgdm9pY2Vfc2V0dGluZ3MpOwotCi0gIHJldHVybiAodm9pY2Vfc2V0dGluZ3MpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnRtL2J0bV9zY28uaCBiL3N0YWNrL2J0bS9idG1fc2NvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDJhMTQuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9zY28uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvZXNjb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0KLWNvbnN0ZXhwciB1aW50MTZfdCBrTWF4U2NvTGlua3MgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oQlRNX01BWF9TQ09fTElOS1MpOwotCi0jaWZuZGVmIEVTQ09fREFUQV9QQVRICi0jaWZkZWYgT1NfQU5EUk9JRAotI2RlZmluZSBFU0NPX0RBVEFfUEFUSCBFU0NPX0RBVEFfUEFUSF9QQ00KLSNlbHNlCi0jZGVmaW5lIEVTQ09fREFUQV9QQVRIIEVTQ09fREFUQV9QQVRIX0hDSQotI2VuZGlmCi0jZW5kaWYKLQotLy8gU0NPLW92ZXItSENJIGF1ZGlvIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLW5hbWVzcGFjZSBibHVldG9vdGg6OmF1ZGlvOjpzY28gewotCi0vLyBJbml0aWFsaXplIFNDTy1vdmVyLUhDSSBzb2NrZXQgKFVJUEMpOyB0aGUgY2xpZW50IGlzIGF1ZGlvIHNlcnZlci4KLXZvaWQgaW5pdCgpOwotCi0vLyBPcGVuIHRoZSBzb2NrZXQgd2hlbiB0aGVyZSBpcyBTQ08gY29ubmVjdGlvbiBvcGVuCi12b2lkIG9wZW4oKTsKLQotLy8gQ2xlYW4gdXAgdGhlIHNvY2tldCB3aGVuIHRoZSBTQ08gY29ubmVjdGlvbiBpcyBkb25lCi12b2lkIGNsZWFudXAoKTsKLQotLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQgKGF1ZGlvIHNlcnZlcikgZm9yIFNDTyBUeAotc2l6ZV90IHJlYWQodWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbik7Ci0KLS8vIFdyaXRlIHRvIHRoZSBzb2NrZXQgZnJvbSBTQ08gUngKLXNpemVfdCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjphdWRpbzo6c2NvCi0KLS8qIERlZmluZSB0aGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgc2NvCi0gKi8KLQotdHlwZWRlZiBlbnVtIDogdWludDE2X3QgewotICBTQ09fU1RfVU5VU0VEID0gMCwKLSAgU0NPX1NUX0xJU1RFTklORyA9IDEsCi0gIFNDT19TVF9XNF9DT05OX1JTUCA9IDIsCi0gIFNDT19TVF9DT05ORUNUSU5HID0gMywKLSAgU0NPX1NUX0NPTk5FQ1RFRCA9IDQsCi0gIFNDT19TVF9ESVNDT05ORUNUSU5HID0gNSwKLSAgU0NPX1NUX1BFTkRfVU5QQVJLID0gNiwKLSAgU0NPX1NUX1BFTkRfUk9MRUNIQU5HRSA9IDcsCi0gIFNDT19TVF9QRU5EX01PREVDSEFOR0UgPSA4LAotfSB0U0NPX1NUQVRFOwotCi1pbmxpbmUgc3RkOjpzdHJpbmcgc2NvX3N0YXRlX3RleHQoY29uc3QgdFNDT19TVEFURSYgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgU0NPX1NUX1VOVVNFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygidW51c2VkIik7Ci0gICAgY2FzZSBTQ09fU1RfTElTVEVOSU5HOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJsaXN0ZW5pbmciKTsKLSAgICBjYXNlIFNDT19TVF9XNF9DT05OX1JTUDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiY29ubmVjdF9yZXNwb25zZSIpOwotICAgIGNhc2UgU0NPX1NUX0NPTk5FQ1RJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImNvbm5lY3RpbmciKTsKLSAgICBjYXNlIFNDT19TVF9DT05ORUNURUQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImNvbm5lY3RlZCIpOwotICAgIGNhc2UgU0NPX1NUX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImRpc2Nvbm5lY3RpbmciKTsKLSAgICBjYXNlIFNDT19TVF9QRU5EX1VOUEFSSzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygicGVuZGluZ191bnBhcmsiKTsKLSAgICBjYXNlIFNDT19TVF9QRU5EX1JPTEVDSEFOR0U6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInBlbmRpbmdfcm9sZV9jaGFuZ2UiKTsKLSAgICBjYXNlIFNDT19TVF9QRU5EX01PREVDSEFOR0U6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInBlbmRpbmdfbW9kZV9jaGFuZ2UiKTsKLSAgfQotfQotCi0vKiBEZWZpbmUgdGhlIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIChlKVNDTyBkYXRhICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVE1fRVNDT19DQkFDSyogcF9lc2NvX2NiYWNrOyAvKiBDYWxsYmFjayBmb3IgZVNDTyBldmVudHMgICAgICovCi0gIGVuaF9lc2NvX3BhcmFtc190IHNldHVwOwotICB0QlRNX0VTQ09fREFUQSBkYXRhOyAvKiBDb25uZWN0aW9uIGNvbXBsZXRlIGluZm9ybWF0aW9uICovCi0gIHVpbnQ4X3QgaGNpX3N0YXR1czsKLX0gdEJUTV9FU0NPX0lORk87Ci0KLS8qIERlZmluZSB0aGUgc3RydWN0dXJlIHVzZWQgZm9yIFNDTyBNYW5hZ2VtZW50Ci0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUTV9FU0NPX0lORk8gZXNjbzsgICAgLyogQ3VycmVudCBzZXR0aW5ncyAgICAgICAgICAgICAqLwotICB0QlRNX1NDT19DQiogcF9jb25uX2NiOyAvKiBDYWxsYmFjayBmb3Igd2hlbiBjb25uZWN0ZWQgICovCi0gIHRCVE1fU0NPX0NCKiBwX2Rpc2NfY2I7IC8qIENhbGxiYWNrIGZvciB3aGVuIGRpc2Nvbm5lY3QgKi8KLSAgdFNDT19TVEFURSBzdGF0ZTsgICAgICAgLyogVGhlIHN0YXRlIG9mIHRoZSBTQ08gbGluayAgICAqLwotCi0gIHVpbnQxNl90IGhjaV9oYW5kbGU7ICAgIC8qIEhDSSBIYW5kbGUgICAgICAgICAgICAgICAgICAgKi8KLSBwdWJsaWM6Ci0gIGJvb2wgaXNfYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gc3RhdGUgIT0gU0NPX1NUX1VOVVNFRDsgfQotICB1aW50MTZfdCBIYW5kbGUoKSBjb25zdCB7IHJldHVybiBoY2lfaGFuZGxlOyB9Ci0KLSAgYm9vbCBpc19vcmlnOyAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGUgb3JpZ2luYXRvciAgICAgICAqLwotICBib29sIHJlbV9iZF9rbm93bjsgICAgICAvKiB0cnVlIGlmIHJlbW90ZSBCRCBhZGRyIGtub3duICovCi0KLX0gdFNDT19DT05OOwotCi0vKiBTQ08gTWFuYWdlbWVudCBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRTQ09fQ09OTiBzY29fZGJbQlRNX01BWF9TQ09fTElOS1NdOwotICBlbmhfZXNjb19wYXJhbXNfdCBkZWZfZXNjb19wYXJtczsKLSAgYm9vbCBlc2NvX3N1cHBvcnRlZDsgICAgICAgIC8qIHRydWUgaWYgMS4yIGNudGxyIEFORCBzdXBwb3J0cyBlU0NPIGxpbmtzICovCi0KLSAgdFNDT19DT05OKiBnZXRfc2NvX2Nvbm5lY3Rpb25fZnJvbV9pbmRleCh1aW50MTZfdCBpbmRleCkgewotICAgIHJldHVybiAoaW5kZXggPCBrTWF4U2NvTGlua3MpID8gKCZzY29fZGJbaW5kZXhdKSA6IG51bGxwdHI7Ci0gIH0KLQotICB0U0NPX0NPTk4qIGdldF9zY29fY29ubmVjdGlvbl9mcm9tX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgICB0U0NPX0NPTk4qIHBfc2NvID0gc2NvX2RiOwotICAgIGZvciAodWludDE2X3QgeHggPSAwOyB4eCA8IGtNYXhTY29MaW5rczsgeHgrKywgcF9zY28rKykgewotICAgICAgaWYgKHBfc2NvLT5oY2lfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICByZXR1cm4gcF9zY287Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgdm9pZCBJbml0KCkgewotICAgIGRlZl9lc2NvX3Bhcm1zID0gZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhFU0NPX0NPREVDX0NWU0RfUzMpOwotICAgIGJsdWV0b290aDo6YXVkaW86OnNjbzo6aW5pdCgpOwotICB9Ci0KLSAgdWludDE2X3QgZ2V0X2luZGV4KGNvbnN0IHRTQ09fQ09OTiogcF9zY28pIGNvbnN0IHsKLSAgICBDSEVDSyhwX3NjbyAhPSBudWxscHRyKTsKLSAgICBjb25zdCB0U0NPX0NPTk4qIHAgPSBzY29fZGI7Ci0gICAgZm9yICh1aW50MTZfdCB4eCA9IDA7IHh4IDwga01heFNjb0xpbmtzOyB4eCsrLCBwKyspIHsKLSAgICAgIGlmIChwX3NjbyA9PSBwKSB7Ci0gICAgICAgIHJldHVybiB4eDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDB4ZmZmZjsKLSAgfQotCi19IHRTQ09fQ0I7Ci0KLWV4dGVybiB2b2lkIGJ0bV9zY29fY2hrX3BlbmRfcm9sZWNoYW5nZSh1aW50MTZfdCBoY2lfaGFuZGxlKTsKLWV4dGVybiB2b2lkIGJ0bV9zY29fZGlzY19jaGtfcGVuZF9mb3JfbW9kZWNoYW5nZSh1aW50MTZfdCBoY2lfaGFuZGxlKTsKLQotLy8gVmlzaWJsZSBmb3IgdGVzdCBvbmx5Ci1CVF9IRFIqIGJ0bV9zY29fbWFrZV9wYWNrZXQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSwgdWludDE2X3Qgc2NvX2hhbmRsZSk7Ci0KLS8vIFNlbmQgYSBTQ08gcGFja2V0Ci12b2lkIGJ0bV9zZW5kX3Njb19wYWNrZXQoc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSk7CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX3Njb19oY2kuY2MgYi9zdGFjay9idG0vYnRtX3Njb19oY2kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTA5ZjIuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9zY29faGNpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGdycC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3Njby5oIgotI2luY2x1ZGUgInVkcnYvaW5jbHVkZS91aXBjLmgiCi0KLSNpZiBFU0NPX0RBVEFfUEFUSCA9PSBFU0NPX0RBVEFfUEFUSF9QQ00KLS8vIEZvciBoYXJkd2FyZSBlbmNvZGluZyBwYXRoLCBwcm92aWRlIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uCi0KLW5hbWVzcGFjZSBibHVldG9vdGg6OmF1ZGlvOjpzY28gewotdm9pZCBpbml0KCkge30KLXZvaWQgb3BlbigpIHt9Ci12b2lkIGNsZWFudXAoKSB7fQotc2l6ZV90IHJlYWQodWludDhfdCosIHVpbnQzMl90KSB7IHJldHVybiAwOyB9Ci1zaXplX3Qgd3JpdGUoY29uc3QgdWludDhfdCosIHVpbnQzMl90KSB7IHJldHVybiAwOyB9Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjphdWRpbzo6c2NvCi0jZWxzZQotCi0jZGVmaW5lIFNDT19EQVRBX1JFQURfUE9MTF9NUyAxMAotI2RlZmluZSBTQ09fSE9TVF9EQVRBX1BBVEggIi92YXIvcnVuL2JsdWV0b290aC9hdWRpby8uc2NvX2RhdGEiCi0vLyBUT0RPKGIvMTk4MjYwMzc1KTogTWFrZSBTQ08gZGF0YSBvd25lciBncm91cCBjb25maWd1cmFibGUuCi0jZGVmaW5lIFNDT19IT1NUX0RBVEFfR1JPVVAgImJsdWV0b290aC1hdWRpbyIKLQotbmFtZXNwYWNlIHsKLQotc3RkOjp1bmlxdWVfcHRyPHRVSVBDX1NUQVRFPiBzY29fdWlwYyA9IG51bGxwdHI7Ci0KLXZvaWQgc2NvX2RhdGFfY2IodFVJUENfQ0hfSUQsIHRVSVBDX0VWRU5UIGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFVJUENfT1BFTl9FVlQ6Ci0gICAgICAvKgotICAgICAgICogUmVhZCBkaXJlY3RseSBmcm9tIG1lZGlhIHRhc2sgZnJvbSBoZXJlIG9uIChrZWVwIGNhbGxiYWNrIGZvcgotICAgICAgICogY29ubmVjdGlvbiBldmVudHMuCi0gICAgICAgKi8KLSAgICAgIFVJUENfSW9jdGwoKnNjb191aXBjLCBVSVBDX0NIX0lEX0FWX0FVRElPLCBVSVBDX1JFR19SRU1PVkVfQUNUSVZFX1JFQURTRVQsCi0gICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgVUlQQ19Jb2N0bCgqc2NvX3VpcGMsIFVJUENfQ0hfSURfQVZfQVVESU8sIFVJUENfU0VUX1JFQURfUE9MTF9UTU8sCi0gICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KFNDT19EQVRBX1JFQURfUE9MTF9NUykpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdWRpbyB7Ci1uYW1lc3BhY2Ugc2NvIHsKLQotdm9pZCBpbml0KCkgeyBzY29fdWlwYyA9IFVJUENfSW5pdCgpOyB9Ci0KLXZvaWQgb3BlbigpIHsKLSAgVUlQQ19PcGVuKCpzY29fdWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTywgc2NvX2RhdGFfY2IsIFNDT19IT1NUX0RBVEFfUEFUSCk7Ci0gIHN0cnVjdCBncm91cCogZ3JwID0gZ2V0Z3JuYW0oU0NPX0hPU1RfREFUQV9HUk9VUCk7Ci0gIGNobW9kKFNDT19IT1NUX0RBVEFfUEFUSCwgMDc3MCk7Ci0gIGlmIChncnApIHsKLSAgICBpbnQgcmVzID0gY2hvd24oU0NPX0hPU1RfREFUQV9QQVRILCAtMSwgZ3JwLT5ncl9naWQpOwotICAgIGlmIChyZXMgPT0gLTEpIHsKLSAgICAgIExPR19FUlJPUigiJXMgZmFpbGVkOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGNsZWFudXAoKSB7Ci0gIGlmIChzY29fdWlwYyAhPSBudWxscHRyKSB7Ci0gICAgVUlQQ19DbG9zZSgqc2NvX3VpcGMsIFVJUENfQ0hfSURfQUxMKTsKLSAgfQotfQotCi1zaXplX3QgcmVhZCh1aW50OF90KiBwX2J1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzY29fdWlwYyA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIFVJUENfUmVhZCgqc2NvX3VpcGMsIFVJUENfQ0hfSURfQVZfQVVESU8sIHBfYnVmLCBsZW4pOwotfQotCi1zaXplX3Qgd3JpdGUoY29uc3QgdWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbikgewotICByZXR1cm4gVUlQQ19TZW5kKCpzY29fdWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTywgMCwgcF9idWYsIGxlbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzY28KLX0gIC8vIG5hbWVzcGFjZSBhdWRpbwotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9idG1fc2VjLmNjIGIvc3RhY2svYnRtL2J0bV9zZWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZmI2MGUuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnRtL2J0bV9zZWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgdGhlIEJsdWV0b290aCBTZWN1cml0eSBNYW5hZ2VyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idG1fc2VjIgotCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoL2VudW1zLnBiLmg+Ci0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9oY2kvZW51bXMucGIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9idG1fYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fZGV2LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL3NlY3VyaXR5X2RldmljZV9yZWNvcmQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9zdGF0dXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2FwX3NlY3VyaXR5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc3RhY2tfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAic3RhY2svc21wL3NtcF9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdGV4cHIgY2hhciBrQnRtTG9nVGFnW10gPSAiU0VDIjsKLQotfQotCi1leHRlcm4gdEJUTV9DQiBidG1fY2I7Ci0KLSNkZWZpbmUgQlRNX1NFQ19NQVhfQ09MTElTSU9OX0RFTEFZICg1MDAwKQotCi0jZGVmaW5lIEJUTV9TRUNfSVNfU000KHNtKSAoKGJvb2wpKEJUTV9TTTRfVFJVRSA9PSAoKHNtKSZCVE1fU000X1RSVUUpKSkKLSNkZWZpbmUgQlRNX1NFQ19JU19TTTRfTEVHQUNZKHNtKSAoKGJvb2wpKEJUTV9TTTRfS05PV04gPT0gKChzbSkmQlRNX1NNNF9UUlVFKSkpCi0jZGVmaW5lIEJUTV9TRUNfSVNfU000X1VOS05PV04oc20pIFwKLSAgKChib29sKShCVE1fU000X1VOS05PV04gPT0gKChzbSkmQlRNX1NNNF9UUlVFKSkpCi0KLSNkZWZpbmUgQlRNX1NFQ19MRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQlRNX1NFQ19MRV9BVVRIRU5USUNBVEVEIHwgQlRNX1NFQ19MRV9FTkNSWVBURUQgfCBcCi0gICBCVE1fU0VDX0xFX0xJTktfS0VZX0tOT1dOIHwgQlRNX1NFQ19MRV9MSU5LX0tFWV9BVVRIRUQpCi0KLXZvaWQgYnRtX2lucV9zdG9wX29uX3NzcCh2b2lkKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfYWR2ZXJ0aXNlcl9ub3RpZnlfdGVybWluYXRlZF9sZWdhY3koCi0gICAgdWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlKTsKLWV4dGVybiBib29sIGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkcih0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbmV3X3BzZXVkb19hZGRyKTsKLWV4dGVybiB2b2lkIGJ0YV9kbV9yZW1vdmVfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotZXh0ZXJuIHZvaWQgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLWV4dGVybiB2b2lkIGJ0bV9pbnFfY2xlYXJfc3NwKHZvaWQpOwotZXh0ZXJuIHZvaWQgSEFDS19hY2xfY2hlY2tfc200KHRCVE1fU0VDX0RFVl9SRUMmIHBfZGV2X3JlYyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBMIE8gQyBBIEwgICAgRiBVIE4gQyBUIEkgTyBOICAgICBQIFIgTyBUIE8gVCBZIFAgRSBTICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX1NFUlZfUkVDKiBidG1fc2VjX2ZpbmRfZmlyc3Rfc2Vydihib29sIGlzX29yaWdpbmF0b3IsIHVpbnQxNl90IHBzbSk7Ci0KLXN0YXRpYyBib29sIGJ0bV9zZWNfc3RhcnRfZ2V0X25hbWUodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKTsKLXN0YXRpYyB2b2lkIGJ0bV9zZWNfd2FpdF9hbmRfc3RhcnRfYXV0aGVudGljYXRpb24odEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKTsKLXN0YXRpYyB2b2lkIGJ0bV9zZWNfYXV0aF90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotc3RhdGljIHZvaWQgYnRtX3NlY19jb2xsaXNpb25fdGltZW91dCh2b2lkKiBkYXRhKTsKLXN0YXRpYyB2b2lkIGJ0bV9yZXN0b3JlX21vZGUodm9pZCk7Ci1zdGF0aWMgdm9pZCBidG1fc2VjX3BhaXJpbmdfdGltZW91dCh2b2lkKiBkYXRhKTsKLXN0YXRpYyB0QlRNX1NUQVRVUyBidG1fc2VjX2RkX2NyZWF0ZV9jb25uKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk7Ci1zdGF0aWMgdm9pZCBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKHRCVE1fUEFJUklOR19TVEFURSBuZXdfc3RhdGUpOwotCi1zdGF0aWMgY29uc3QgY2hhciogYnRtX3BhaXJfc3RhdGVfZGVzY3IodEJUTV9QQUlSSU5HX1NUQVRFIHN0YXRlKTsKLQotc3RhdGljIHZvaWQgYnRtX3NlY19jaGVja19wZW5kaW5nX3JlcXModm9pZCk7Ci1zdGF0aWMgYm9vbCBidG1fc2VjX3F1ZXVlX214X3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfb3JpZywgdWludDMyX3QgbXhfcHJvdG9faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbXhfY2hhbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKTsKLXN0YXRpYyB2b2lkIGJ0bV9zZWNfYm9uZF9jYW5jZWxfY29tcGxldGUodm9pZCk7Ci1zdGF0aWMgdm9pZCBidG1fc2VuZF9saW5rX2tleV9ub3RpZih0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpOwotc3RhdGljIGJvb2wgYnRtX3NlY19jaGVja19wcmVmZXRjaF9waW4odEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKTsKLQotc3RhdGljIHRCVE1fU1RBVFVTIGJ0bV9zZWNfc2VuZF9oY2lfZGlzY29ubmVjdCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9oYW5kbGUpOwotdEJUTV9TRUNfREVWX1JFQyogYnRtX3NlY19maW5kX2Rldl9ieV9zZWNfc3RhdGUodWludDhfdCBzdGF0ZSk7Ci0KLXN0YXRpYyBib29sIGJ0bV9kZXZfYXV0aGVudGljYXRlZCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpOwotc3RhdGljIGJvb2wgYnRtX2Rldl9lbmNyeXB0ZWQodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKTsKLXN0YXRpYyB1aW50MTZfdCBidG1fc2VjX3NldF9zZXJ2X2xldmVsNF9mbGFncyh1aW50MTZfdCBjdXJfc2VjdXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yKTsKLQotc3RhdGljIGJvb2wgYnRtX3NlY19xdWV1ZV9lbmNyeXB0X3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KTsKLXN0YXRpYyB2b2lkIGJ0bV9zZWNfY2hlY2tfcGVuZGluZ19lbmNfcmVxKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNyX2VuYWJsZSk7Ci0KLXN0YXRpYyBib29sIGJ0bV9zZWNfdXNlX3NtcF9icl9jaG5sKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk7Ci0KLS8qIHRydWUgLSBhdXRoZW50aWNhdGVkIGxpbmsga2V5IGlzIHBvc3NpYmxlICovCi1zdGF0aWMgY29uc3QgYm9vbCBidG1fc2VjX2lvX21hcFtCVE1fSU9fQ0FQX01BWF1bQlRNX0lPX0NBUF9NQVhdID0gewotICAgIC8qICAgT1VULCAgICBJTywgICAgIElOLCAgICAgTk9ORSAqLwotICAgIC8qIE9VVCAgKi8ge2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2V9LAotICAgIC8qIElPICAgKi8ge2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZX0sCi0gICAgLyogSU4gICAqLyB7dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2V9LAotICAgIC8qIE5PTkUgKi8ge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfX07Ci0vKiAgQlRNX0lPX0NBUF9PVVQgICAgICAwICAgRGlzcGxheU9ubHkgKi8KLS8qICBCVE1fSU9fQ0FQX0lPICAgICAgIDEgICBEaXNwbGF5WWVzTm8gKi8KLS8qICBCVE1fSU9fQ0FQX0lOICAgICAgIDIgICBLZXlib2FyZE9ubHkgKi8KLS8qICBCVE1fSU9fQ0FQX05PTkUgICAgIDMgICBOb0lucHV0Tm9PdXRwdXQgKi8KLQotc3RhdGljIHZvaWQgTm90aWZ5Qm9uZGluZ0NoYW5nZSh0QlRNX1NFQ19ERVZfUkVDJiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBpZiAoYnRtX2NiLmFwaS5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2sgIT0gbnVsbHB0cikgewotICAgICgqYnRtX2NiLmFwaS5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2spKAotICAgICAgICBwX2Rldl9yZWMuYmRfYWRkciwgc3RhdGljX2Nhc3Q8dWludDhfdCo+KHBfZGV2X3JlYy5kZXZfY2xhc3MpLAotICAgICAgICBwX2Rldl9yZWMuc2VjX2JkX25hbWUsIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBOb3RpZnlCb25kaW5nQ2FuY2VsZWQodEJUTV9TVEFUVVMgYnRtX3N0YXR1cykgewotICBpZiAoYnRtX2NiLmFwaS5wX2JvbmRfY2FuY2VsX2NtcGxfY2FsbGJhY2spIHsKLSAgICBidG1fY2IuYXBpLnBfYm9uZF9jYW5jZWxfY21wbF9jYWxsYmFjayhCVE1fU1VDQ0VTUyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9kZXZfYXV0aGVudGljYXRlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgZGV2aWNlIGlzIGF1dGhlbnRpY2F0ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGJvb2wgICAgdHJ1ZSBvciBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidG1fZGV2X2F1dGhlbnRpY2F0ZWQodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIGlmIChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfQVVUSEVOVElDQVRFRCkgewotICAgIHJldHVybiAodHJ1ZSk7Ci0gIH0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZGV2X2VuY3J5cHRlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY2hlY2sgZGV2aWNlIGlzIGVuY3J5cHRlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICB0cnVlIG9yIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0bV9kZXZfZW5jcnlwdGVkKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICBpZiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0VOQ1JZUFRFRCkgewotICAgIHJldHVybiAodHJ1ZSk7Ci0gIH0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fZGV2XzE2X2RpZ2l0X2F1dGhlbnRpY2F0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNoZWNrIGRldmljZSBpcyBhdXRoZW50aWNhdGVkIGJ5IHVzaW5nIDE2IGRpZ2l0IHBpbiBvciBNSVRNCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICAgIHRydWUgb3IgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRtX2Rldl8xNl9kaWdpdF9hdXRoZW50aWNhdGVkKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICAvLyBCVE1fU0VDXzE2X0RJR0lUX1BJTl9BVVRIRUQgaXMgc2V0IGlmIE1JVE0gb3IgMTYgZGlnaXQgcGluIGlzIHVzZWQKLSAgaWYgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ18xNl9ESUdJVF9QSU5fQVVUSEVEKSB7Ci0gICAgcmV0dXJuICh0cnVlKTsKLSAgfQotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQXBwbGljYXRpb24gbWFuYWdlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGZvcgotICogICAgICAgICAgICAgICAgICBzZWN1cml0eSBzZXJ2aWNlcy4gIFRoZXJlIGNhbiBiZSBvbmUgYW5kIG9ubHkgb25lCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNhdmluZyBsaW5rIGtleXMuICBCVE0gYWxsb3dzIG9ubHkgZmlyc3QKLSAqICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NlY1JlZ2lzdGVyKGNvbnN0IHRCVE1fQVBQTF9JTkZPKiBwX2NiX2luZm8pIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVnaXN0ZXIocF9jYl9pbmZvKTsKLSAgfQotCi0gIEJUTV9UUkFDRV9FVkVOVCgiJXMgYXBwbGljYXRpb24gcmVnaXN0ZXJlZCIsIF9fZnVuY19fKTsKLQotICBMT0dfSU5GTygiJXMgcF9jYl9pbmZvLT5wX2xlX2NhbGxiYWNrID09IDB4JXAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgcF9jYl9pbmZvLT5wX2xlX2NhbGxiYWNrKTsKLSAgaWYgKHBfY2JfaW5mby0+cF9sZV9jYWxsYmFjaykgewotICAgIEJUTV9UUkFDRV9FVkVOVCgiJXMgU01QX1JlZ2lzdGVyKCBidG1fcHJvY19zbXBfY2JhY2sgKSIsIF9fZnVuY19fKTsKLSAgICBTTVBfUmVnaXN0ZXIoYnRtX3Byb2Nfc21wX2NiYWNrKTsKLSAgICBPY3RldDE2IHplcm97MH07Ci0gICAgLyogaWYgbm8gSVIgaXMgbG9hZGVkLCBuZWVkIHRvIHJlZ2VuZXJhdGUgYWxsIHRoZSBrZXlzICovCi0gICAgaWYgKGJ0bV9jYi5kZXZjYi5pZF9rZXlzLmlyID09IHplcm8pIHsKLSAgICAgIGJ0bV9ibGVfcmVzZXRfaWQoKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX1dBUk4oIiVzIHBfY2JfaW5mby0+cF9sZV9jYWxsYmFjayA9PSBOVUxMIiwgX19mdW5jX18pOwotICB9Ci0KLSAgYnRtX2NiLmFwaSA9ICpwX2NiX2luZm87Ci0gIExPR19JTkZPKCIlcyBidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2sgPSAweCVwICIsIF9fZnVuY19fLAotICAgICAgICAgICBidG1fY2IuYXBpLnBfbGVfY2FsbGJhY2spOwotICBCVE1fVFJBQ0VfRVZFTlQoIiVzIGFwcGxpY2F0aW9uIHJlZ2lzdGVyZWQiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkUm10TmFtZU5vdGlmeUNhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBbnkgcHJvZmlsZSBjYW4gcmVnaXN0ZXIgdG8gYmUgbm90aWZpZWQgd2hlbiBuYW1lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICByZW1vdGUgZGV2aWNlIGlzIHJlc29sdmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NlY0FkZFJtdE5hbWVOb3RpZnlDYWxsYmFjayh0QlRNX1JNVF9OQU1FX0NBTExCQUNLKiBwX2NhbGxiYWNrKSB7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCVE1fU0VDX01BWF9STVRfTkFNRV9DQUxMQkFDS1M7IGkrKykgewotICAgIGlmIChidG1fY2IucF9ybXRfbmFtZV9jYWxsYmFja1tpXSA9PSBOVUxMKSB7Ci0gICAgICBidG1fY2IucF9ybXRfbmFtZV9jYWxsYmFja1tpXSA9IHBfY2FsbGJhY2s7Ci0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0RlbGV0ZVJtdE5hbWVOb3RpZnlDYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQW55IHByb2ZpbGUgY2FuIGRlcmVnaXN0ZXIgbm90aWZpY2F0aW9uIHdoZW4gYSBuZXcgTGluayBLZXkKLSAqICAgICAgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIHBlciBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNEZWxldGVSbXROYW1lTm90aWZ5Q2FsbGJhY2sodEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjaykgewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRNX1NFQ19NQVhfUk1UX05BTUVfQ0FMTEJBQ0tTOyBpKyspIHsKLSAgICBpZiAoYnRtX2NiLnBfcm10X25hbWVfY2FsbGJhY2tbaV0gPT0gcF9jYWxsYmFjaykgewotICAgICAgYnRtX2NiLnBfcm10X25hbWVfY2FsbGJhY2tbaV0gPSBOVUxMOwotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotYm9vbCBCVE1fSXNFbmNyeXB0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdWludDhfdCBmbGFncyA9IDA7Ci0gIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoYmRfYWRkciwgJmZsYWdzLCB0cmFuc3BvcnQpOwotICByZXR1cm4gKGZsYWdzICYgQlRNX1NFQ19GTEFHX0VOQ1JZUFRFRCkgIT0gMDsKLX0KLQotYm9vbCBCVE1fSXNMaW5rS2V5QXV0aGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHVpbnQ4X3QgZmxhZ3MgPSAwOwotICBCVE1fR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0KGJkX2FkZHIsICZmbGFncywgdHJhbnNwb3J0KTsKLSAgcmV0dXJuIChmbGFncyAmIEJUTV9TRUNfRkxBR19MS0VZX0FVVEhFRCkgIT0gMDsKLX0KLQotYm9vbCBCVE1fSXNMaW5rS2V5S25vd24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdWludDhfdCBmbGFncyA9IDA7Ci0gIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoYmRfYWRkciwgJmZsYWdzLCB0cmFuc3BvcnQpOwotICByZXR1cm4gKGZsYWdzICYgQlRNX1NFQ19GTEFHX0xLRVlfS05PV04pICE9IDA7Ci19Ci0KLWJvb2wgQlRNX0lzQXV0aGVudGljYXRlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB1aW50OF90IGZsYWdzID0gMDsKLSAgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChiZF9hZGRyLCAmZmxhZ3MsIHRyYW5zcG9ydCk7Ci0gIHJldHVybiAoZmxhZ3MgJiBCVE1fU0VDX0FVVEhFTlRJQ0FURUQpICE9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0U2VjdXJpdHlGbGFnc0J5VHJhbnNwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgc2VjdXJpdHkgZmxhZ3MgZm9yIHRoZSBkZXZpY2Ugb24gYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydAotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICB0cnVlIG9yIGZhbHNlIGlzIGRldmljZSBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3NlY19mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICBpZiAocF9kZXZfcmVjICE9IE5VTEwpIHsKLSAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpCi0gICAgICAqcF9zZWNfZmxhZ3MgPSAodWludDhfdClwX2Rldl9yZWMtPnNlY19mbGFnczsKLSAgICBlbHNlCi0gICAgICAqcF9zZWNfZmxhZ3MgPSAodWludDhfdCkocF9kZXZfcmVjLT5zZWNfZmxhZ3MgPj4gOCk7Ci0KLSAgICByZXR1cm4gKHRydWUpOwotICB9Ci0gIEJUTV9UUkFDRV9FUlJPUigiQlRNX0dldFNlY3VyaXR5RmxhZ3MgZmFsc2UiKTsKLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0UGluVHlwZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IFBJTiB0eXBlIGZvciB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZXRQaW5UeXBlKHVpbnQ4X3QgcGluX3R5cGUsIFBJTl9DT0RFIHBpbl9jb2RlLCB1aW50OF90IHBpbl9jb2RlX2xlbikgewotICBCVE1fVFJBQ0VfQVBJKAotICAgICAgIkJUTV9TZXRQaW5UeXBlOiBwaW4gdHlwZSAlZCBbdmFyaWFibGUtMCwgZml4ZWQtMV0sIGNvZGUgJXMsIGxlbmd0aCAlZCIsCi0gICAgICBwaW5fdHlwZSwgKGNoYXIqKXBpbl9jb2RlLCBwaW5fY29kZV9sZW4pOwotCi0gIC8qIElmIGRldmljZSBpcyBub3QgdXAgc2VjdXJpdHkgbW9kZSB3aWxsIGJlIHNldCBhcyBhIHBhcnQgb2Ygc3RhcnR1cCAqLwotICBpZiAoKGJ0bV9jYi5jZmcucGluX3R5cGUgIT0gcGluX3R5cGUpICYmCi0gICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2lzX3JlYWR5KCkpIHsKLSAgICBidHNuZF9oY2ljX3dyaXRlX3Bpbl90eXBlKHBpbl90eXBlKTsKLSAgfQotCi0gIGJ0bV9jYi5jZmcucGluX3R5cGUgPSBwaW5fdHlwZTsKLSAgYnRtX2NiLmNmZy5waW5fY29kZV9sZW4gPSBwaW5fY29kZV9sZW47Ci0gIG1lbWNweShidG1fY2IuY2ZnLnBpbl9jb2RlLCBwaW5fY29kZSwgcGluX2NvZGVfbGVuKTsKLX0KLQotI2RlZmluZSBCVE1fTk9fQVZBSUxfU0VDX1NFUlZJQ0VTICgodWludDE2X3QpMHhmZmZmKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVyIHNlcnZpY2Ugc2VjdXJpdHkgbGV2ZWwgd2l0aCBTZWN1cml0eSBNYW5hZ2VyCi0gKgotICogUGFyYW1ldGVyczogICAgICBpc19vcmlnaW5hdG9yIC0gdHJ1ZSBpZiBvcmlnaW5hdGluZyB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgcmVsZXZhbnQgb25seSBpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gd2lsbCBzaG93IHRoaXMgbmFtZSB0byB1c2VyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgaWYgQlRfTUFYX1NFUlZJQ0VfTkFNRV9MRU4gaXMgMC4KLSAqICAgICAgICAgICAgICAgICAgc2VydmljZV9pZCAgLSBzZXJ2aWNlIElEIGZvciB0aGUgc2VydmljZSBwYXNzZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgIHNlY19sZXZlbCAgIC0gYml0IG1hc2sgb2YgdGhlIHNlY3VyaXR5IGZlYXR1cmVzCi0gKiAgICAgICAgICAgICAgICAgIHBzbSAgICAgICAgIC0gTDJDQVAgUFNNCi0gKiAgICAgICAgICAgICAgICAgIG14X3Byb3RvX2lkIC0gcHJvdG9jb2wgSUQgb2YgbXVsdGlwbGV4aW5nIHByb3RvIGJlbG93Ci0gKiAgICAgICAgICAgICAgICAgIG14X2NoYW5faWQgIC0gY2hhbm5lbCBJRCBvZiBtdWx0aXBsZXhpbmcgcHJvdG8gYmVsb3cKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVnaXN0ZXJlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZXRTZWN1cml0eUxldmVsKGJvb2wgaXNfb3JpZ2luYXRvciwgY29uc3QgY2hhciogcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlcnZpY2VfaWQsIHVpbnQxNl90IHNlY19sZXZlbCwgdWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBteF9wcm90b19pZCwgdWludDMyX3QgbXhfY2hhbl9pZCkgewotICB0QlRNX1NFQ19TRVJWX1JFQyogcF9zcmVjOwotICB1aW50MTZfdCBpbmRleDsKLSAgdWludDE2X3QgZmlyc3RfdW51c2VkX3JlY29yZCA9IEJUTV9OT19BVkFJTF9TRUNfU0VSVklDRVM7Ci0gIGJvb2wgcmVjb3JkX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIEJUTV9UUkFDRV9BUEkoIiVzIDogc2VjOiAweCV4IiwgX19mdW5jX18sIHNlY19sZXZlbCk7Ci0KLSAgLyogU2VlIGlmIHRoZSByZWNvcmQgY2FuIGJlIHJldXNlZCAoc2FtZSBzZXJ2aWNlIG5hbWUsIHBzbSwgbXhfcHJvdG9faWQsCi0gICAgIHNlcnZpY2VfaWQsIGFuZCBteF9jaGFuX2lkKSwgb3Igb2J0YWluIHRoZSBuZXh0IHVudXNlZCByZWNvcmQgKi8KLQotICBwX3NyZWMgPSAmYnRtX2NiLnNlY19zZXJ2X3JlY1swXTsKLQotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBCVE1fU0VDX01BWF9TRVJWSUNFX1JFQ09SRFM7IGluZGV4KyssIHBfc3JlYysrKSB7Ci0gICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlY29yZCBmb3IgdGhpcyBzZXJ2aWNlICovCi0gICAgaWYgKHBfc3JlYy0+c2VjdXJpdHlfZmxhZ3MgJiBCVE1fU0VDX0lOX1VTRSkgewotICAgICAgaWYgKHBfc3JlYy0+cHNtID09IHBzbSAmJiBwX3NyZWMtPm14X3Byb3RvX2lkID09IG14X3Byb3RvX2lkICYmCi0gICAgICAgICAgc2VydmljZV9pZCA9PSBwX3NyZWMtPnNlcnZpY2VfaWQgJiYgcF9uYW1lICYmCi0gICAgICAgICAgKCFzdHJuY21wKHBfbmFtZSwgKGNoYXIqKXBfc3JlYy0+b3JpZ19zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIC8qIHN0cmxjcHkgcmVwbGFjZXMgZW5kIGNoYXIgd2l0aCB0ZXJtaW5hdGlvbiBjaGFyKi8KLSAgICAgICAgICAgICAgICAgICAgQlRfTUFYX1NFUlZJQ0VfTkFNRV9MRU4gLSAxKSB8fAotICAgICAgICAgICAhc3RybmNtcChwX25hbWUsIChjaGFyKilwX3NyZWMtPnRlcm1fc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAvKiBzdHJsY3B5IHJlcGxhY2VzIGVuZCBjaGFyIHdpdGggdGVybWluYXRpb24gY2hhciovCi0gICAgICAgICAgICAgICAgICAgIEJUX01BWF9TRVJWSUNFX05BTUVfTEVOIC0gMSkpKSB7Ci0gICAgICAgIHJlY29yZF9hbGxvY2F0ZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogTWFyayB0aGUgZmlyc3QgYXZhaWxhYmxlIHNlcnZpY2UgcmVjb3JkICovCi0gICAgZWxzZSBpZiAoIXJlY29yZF9hbGxvY2F0ZWQpIHsKLSAgICAgIG1lbXNldChwX3NyZWMsIDAsIHNpemVvZih0QlRNX1NFQ19TRVJWX1JFQykpOwotICAgICAgcmVjb3JkX2FsbG9jYXRlZCA9IHRydWU7Ci0gICAgICBmaXJzdF91bnVzZWRfcmVjb3JkID0gaW5kZXg7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFyZWNvcmRfYWxsb2NhdGVkKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoIkJUTV9TRUNfUkVHOiBPdXQgb2YgU2VydmljZSBSZWNvcmRzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgIEJUTV9TRUNfTUFYX1NFUlZJQ0VfUkVDT1JEUyk7Ci0gICAgcmV0dXJuIChyZWNvcmRfYWxsb2NhdGVkKTsKLSAgfQotCi0gIC8qIFByb2Nlc3MgdGhlIHJlcXVlc3QgaWYgc2VydmljZSByZWNvcmQgaXMgdmFsaWQgKi8KLSAgLyogSWYgYSBkdXBsaWNhdGUgc2VydmljZSB3YXNuJ3QgZm91bmQsIHVzZSB0aGUgZmlyc3QgYXZhaWxhYmxlICovCi0gIGlmIChpbmRleCA+PSBCVE1fU0VDX01BWF9TRVJWSUNFX1JFQ09SRFMpIHsKLSAgICBpbmRleCA9IGZpcnN0X3VudXNlZF9yZWNvcmQ7Ci0gICAgcF9zcmVjID0gJmJ0bV9jYi5zZWNfc2Vydl9yZWNbaW5kZXhdOwotICB9Ci0KLSAgcF9zcmVjLT5wc20gPSBwc207Ci0gIHBfc3JlYy0+c2VydmljZV9pZCA9IHNlcnZpY2VfaWQ7Ci0gIHBfc3JlYy0+bXhfcHJvdG9faWQgPSBteF9wcm90b19pZDsKLQotICBpZiAoaXNfb3JpZ2luYXRvcikgewotICAgIHBfc3JlYy0+b3JpZ19teF9jaGFuX2lkID0gbXhfY2hhbl9pZDsKLSAgICBzdHJsY3B5KChjaGFyKilwX3NyZWMtPm9yaWdfc2VydmljZV9uYW1lLCBwX25hbWUsCi0gICAgICAgICAgICBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTiArIDEpOwotICAgIC8qIGNsZWFyIG91dCB0aGUgb2xkIHNldHRpbmcsIGp1c3QgaW4gY2FzZSBpdCBleGlzdHMgKi8KLSAgICB7Ci0gICAgICBwX3NyZWMtPnNlY3VyaXR5X2ZsYWdzICY9Ci0gICAgICAgICAgfihCVE1fU0VDX09VVF9FTkNSWVBUIHwgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19PVVRfTUlUTSk7Ci0gICAgfQotCi0gICAgLyogUGFyYW1ldGVyIHZhbGlkYXRpb24uICBPcmlnaW5hdG9yIHNob3VsZCBub3Qgc2V0IHJlcXVpcmVtZW50cyBmb3IKLSAgICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyAqLwotICAgIHNlY19sZXZlbCAmPSB+KEJUTV9TRUNfSU5fRU5DUllQVCB8IEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFIHwKLSAgICAgICAgICAgICAgICAgICBCVE1fU0VDX0lOX01JVE0gfCBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4pOwotCi0gICAgaWYgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TUCB8fAotICAgICAgICBidG1fY2Iuc2VjdXJpdHlfbW9kZSA9PSBCVE1fU0VDX01PREVfU0MpIHsKLSAgICAgIGlmIChzZWNfbGV2ZWwgJiBCVE1fU0VDX09VVF9BVVRIRU5USUNBVEUpIHNlY19sZXZlbCB8PSBCVE1fU0VDX09VVF9NSVRNOwotICAgIH0KLQotICAgIC8qIE1ha2Ugc3VyZSB0aGUgYXV0aGVudGljYXRlIGJpdCBpcyBzZXQsIHdoZW4gZW5jcnlwdCBiaXQgaXMgc2V0ICovCi0gICAgaWYgKHNlY19sZXZlbCAmIEJUTV9TRUNfT1VUX0VOQ1JZUFQpIHNlY19sZXZlbCB8PSBCVE1fU0VDX09VVF9BVVRIRU5USUNBVEU7Ci0KLSAgICAvKiBvdXRnb2luZyBjb25uZWN0aW9ucyB1c3VhbGx5IHNldCB0aGUgc2VjdXJpdHkgbGV2ZWwgcmlnaHQgYmVmb3JlCi0gICAgICogdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhdGVkLgotICAgICAqIHNldCBpdCB0byBiZSB0aGUgb3V0Z29pbmcgc2VydmljZSAqLwotICAgIGJ0bV9jYi5wX291dF9zZXJ2ID0gcF9zcmVjOwotICB9IGVsc2UgewotICAgIHBfc3JlYy0+dGVybV9teF9jaGFuX2lkID0gbXhfY2hhbl9pZDsKLSAgICBzdHJsY3B5KChjaGFyKilwX3NyZWMtPnRlcm1fc2VydmljZV9uYW1lLCBwX25hbWUsCi0gICAgICAgICAgICBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTiArIDEpOwotICAgIC8qIGNsZWFyIG91dCB0aGUgb2xkIHNldHRpbmcsIGp1c3QgaW4gY2FzZSBpdCBleGlzdHMgKi8KLSAgICB7Ci0gICAgICBwX3NyZWMtPnNlY3VyaXR5X2ZsYWdzICY9Ci0gICAgICAgICAgfihCVE1fU0VDX0lOX0VOQ1JZUFQgfCBCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfSU5fTUlUTSB8Ci0gICAgICAgICAgICBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4pOwotICAgIH0KLQotICAgIC8qIFBhcmFtZXRlciB2YWxpZGF0aW9uLiAgQWNjZXB0b3Igc2hvdWxkIG5vdCBzZXQgcmVxdWlyZW1lbnRzIGZvciBvdXRnb2luZwotICAgICAqIGNvbm5lY3Rpb25zICovCi0gICAgc2VjX2xldmVsICY9Ci0gICAgICAgIH4oQlRNX1NFQ19PVVRfRU5DUllQVCB8IEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfT1VUX01JVE0pOwotCi0gICAgaWYgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TUCB8fAotICAgICAgICBidG1fY2Iuc2VjdXJpdHlfbW9kZSA9PSBCVE1fU0VDX01PREVfU0MpIHsKLSAgICAgIGlmIChzZWNfbGV2ZWwgJiBCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSkgc2VjX2xldmVsIHw9IEJUTV9TRUNfSU5fTUlUTTsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgdGhlIGF1dGhlbnRpY2F0ZSBiaXQgaXMgc2V0LCB3aGVuIGVuY3J5cHQgYml0IGlzIHNldCAqLwotICAgIGlmIChzZWNfbGV2ZWwgJiBCVE1fU0VDX0lOX0VOQ1JZUFQpIHNlY19sZXZlbCB8PSBCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURTsKLSAgfQotCi0gIHBfc3JlYy0+c2VjdXJpdHlfZmxhZ3MgfD0gKHVpbnQxNl90KShzZWNfbGV2ZWwgfCBCVE1fU0VDX0lOX1VTRSk7Ci0KLSAgTE9HX0RFQlVHKAotICAgICAgIlslZF06IGlkOiVkLCBpc19vcmlnOiVzIHBzbToweCUwNHggcHJvdG9faWQ6JWQgY2hhbl9pZDolZCIKLSAgICAgICIgIDogc2VjOjB4JXggc2VydmljZV9uYW1lOlslc10gKHVwIHRvICVkIGNoYXJzIHNhdmVkKSIsCi0gICAgICBpbmRleCwgc2VydmljZV9pZCwgbG9nYm9vbChpc19vcmlnaW5hdG9yKS5jX3N0cigpLCBwc20sIG14X3Byb3RvX2lkLAotICAgICAgbXhfY2hhbl9pZCwgcF9zcmVjLT5zZWN1cml0eV9mbGFncywgcF9uYW1lLCBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTik7Ci0KLSAgcmV0dXJuIChyZWNvcmRfYWxsb2NhdGVkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNDbHJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmVzIHNwZWNpZmllZCBzZXJ2aWNlIHJlY29yZChzKSBmcm9tIHRoZSBzZWN1cml0eQotICogICAgICAgICAgICAgICAgICBkYXRhYmFzZS4gQWxsIHNlcnZpY2UgcmVjb3JkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhcmUKLSAqICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4gVHlwaWNhbGx5IHVzZWQgb25seSBieSBkZXZpY2VzIHdpdGggbGltaXRlZCBSQU0gc28KLSAqICAgICAgICAgICAgICAgICAgdGhhdCBpdCBjYW4gcmV1c2UgYW4gb2xkIHNlY3VyaXR5IHNlcnZpY2UgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgICAgTm90ZTogVW5wcmVkaWN0YWJsZSByZXN1bHRzIG1heSBvY2N1ciBpZiBhIHNlcnZpY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQgdGhhdCBpcyBzdGlsbCBpbiB1c2UgYnkgYW4gYXBwbGljYXRpb24vcHJvZmlsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIFNlcnZpY2UgSUQgLSBJZCBvZiB0aGUgc2VydmljZSB0byByZW1vdmUuICcwJyByZW1vdmVzIGFsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgcmVjb3JkcyAoZXhjZXB0IFNEUCkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOdW1iZXIgb2YgcmVjb3JkcyB0aGF0IHdlcmUgZnJlZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQlRNX1NlY0NsclNlcnZpY2UodWludDhfdCBzZXJ2aWNlX2lkKSB7Ci0gIHRCVE1fU0VDX1NFUlZfUkVDKiBwX3NyZWMgPSAmYnRtX2NiLnNlY19zZXJ2X3JlY1swXTsKLSAgdWludDhfdCBudW1fZnJlZWQgPSAwOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgQlRNX1NFQ19NQVhfU0VSVklDRV9SRUNPUkRTOyBpKyssIHBfc3JlYysrKSB7Ci0gICAgLyogRGVsZXRlIHNlcnZpY2VzIHdpdGggc3BlY2lmaWVkIG5hbWUgKGlmIGluIHVzZSBhbmQgbm90IFNEUCkgKi8KLSAgICBpZiAoKHBfc3JlYy0+c2VjdXJpdHlfZmxhZ3MgJiBCVE1fU0VDX0lOX1VTRSkgJiYKLSAgICAgICAgKHBfc3JlYy0+cHNtICE9IEJUX1BTTV9TRFApICYmCi0gICAgICAgICghc2VydmljZV9pZCB8fCAoc2VydmljZV9pZCA9PSBwX3NyZWMtPnNlcnZpY2VfaWQpKSkgewotICAgICAgQlRNX1RSQUNFX0FQSSgiQlRNX1NFQ19DTFJbJWRdOiBpZCAlZCIsIGksIHNlcnZpY2VfaWQpOwotICAgICAgcF9zcmVjLT5zZWN1cml0eV9mbGFncyA9IDA7Ci0gICAgICBudW1fZnJlZWQrKzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKG51bV9mcmVlZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQ2xyU2VydmljZUJ5UHNtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmVzIHNwZWNpZmllZCBzZXJ2aWNlIHJlY29yZCBmcm9tIHRoZSBzZWN1cml0eSBkYXRhYmFzZS4KLSAqICAgICAgICAgICAgICAgICAgQWxsIHNlcnZpY2UgcmVjb3JkcyB3aXRoIHRoZSBzcGVjaWZpZWQgcHNtIGFyZSByZW1vdmVkLgotICogICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgdXNlZCBieSBMMkNBUCB0byBmcmVlIHVwIHRoZSBzZXJ2aWNlIHJlY29yZCB1c2VkCi0gKiAgICAgICAgICAgICAgICAgIGJ5IGR5bmFtaWMgUFNNIGNsaWVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBjbG9zZWQuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBwc20gbXVzdCBiZSBhIHZpcnR1YWwgcHNtLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgU2VydmljZSBJRCAtIElkIG9mIHRoZSBzZXJ2aWNlIHRvIHJlbW92ZS4gJzAnIHJlbW92ZXMgYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSByZWNvcmRzIChleGNlcHQgU0RQKS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE51bWJlciBvZiByZWNvcmRzIHRoYXQgd2VyZSBmcmVlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVE1fU2VjQ2xyU2VydmljZUJ5UHNtKHVpbnQxNl90IHBzbSkgewotICB0QlRNX1NFQ19TRVJWX1JFQyogcF9zcmVjID0gJmJ0bV9jYi5zZWNfc2Vydl9yZWNbMF07Ci0gIHVpbnQ4X3QgbnVtX2ZyZWVkID0gMDsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJUTV9TRUNfTUFYX1NFUlZJQ0VfUkVDT1JEUzsgaSsrLCBwX3NyZWMrKykgewotICAgIC8qIERlbGV0ZSBzZXJ2aWNlcyB3aXRoIHNwZWNpZmllZCBuYW1lIChpZiBpbiB1c2UgYW5kIG5vdCBTRFApICovCi0gICAgaWYgKChwX3NyZWMtPnNlY3VyaXR5X2ZsYWdzICYgQlRNX1NFQ19JTl9VU0UpICYmIChwX3NyZWMtPnBzbSA9PSBwc20pKSB7Ci0gICAgICBCVE1fVFJBQ0VfQVBJKCJCVE1fU0VDX0NMUlslZF06IGlkICVkICIsIGksIHBfc3JlYy0+c2VydmljZV9pZCk7Ci0gICAgICBwX3NyZWMtPnNlY3VyaXR5X2ZsYWdzID0gMDsKLSAgICAgIG51bV9mcmVlZCsrOwotICAgIH0KLSAgfQotICBCVE1fVFJBQ0VfQVBJKCJCVE1fU2VjQ2xyU2VydmljZUJ5UHNtIHBzbToweCV4IG51bV9mcmVlZDolZCIsIHBzbSwgbnVtX2ZyZWVkKTsKLQotICByZXR1cm4gKG51bV9mcmVlZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUElOQ29kZVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBTZWN1cml0eSBNYW5hZ2VyIHN1Ym1pdHRlZAotICogICAgICAgICAgICAgICAgICBQSU4gY29kZSByZXF1ZXN0IHRvIHRoZSBVSS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3Igd2hpY2ggUElOIHdhcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3VjY2VzcwotICogICAgICAgICAgICAgICAgICBwaW5fbGVuICAgICAgLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIFBJTiBDb2RlCi0gKiAgICAgICAgICAgICAgICAgIHBfcGluICAgICAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCB0aGUgUElOIENvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUElOQ29kZVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVE1fU1RBVFVTIHJlcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIHVpbnQ4X3QqIHBfcGluKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLQotICBCVE1fVFJBQ0VfQVBJKAotICAgICAgIkJUTV9QSU5Db2RlUmVwbHkoKTogUGFpclN0YXRlOiAlcyAgIFBhaXJGbGFnczogMHglMDJ4ICBQaW5MZW46JWQgICIKLSAgICAgICJSZXN1bHQ6JWQiLAotICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpLCBidG1fY2IucGFpcmluZ19mbGFncywgcGluX2xlbiwKLSAgICAgIHJlcyk7Ci0KLSAgLyogSWYgdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb3IgaGFzIGJlZW4gY2FuY2VsZWQsIGlnbm9yZSB0aGUgcmVwbHkgKi8KLSAgaWYgKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX1dBSVRfTE9DQUxfUElOKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoIkJUTV9QSU5Db2RlUmVwbHkoKSAtIFdyb25nIFN0YXRlOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgYnRtX2NiLnBhaXJpbmdfc3RhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChiZF9hZGRyICE9IGJ0bV9jYi5wYWlyaW5nX2JkYSkgewotICAgIEJUTV9UUkFDRV9FUlJPUigiQlRNX1BJTkNvZGVSZXBseSgpIC0gV3JvbmcgQkQgQWRkciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCJCVE1fUElOQ29kZVJlcGx5KCkgLSBubyBkZXYgQ0IiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoKHBpbl9sZW4gPiBQSU5fQ09ERV9MRU4pIHx8IChwaW5fbGVuID09IDApIHx8IChwX3BpbiA9PSBOVUxMKSkKLSAgICByZXMgPSBCVE1fSUxMRUdBTF9WQUxVRTsKLQotICBpZiAocmVzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgLyogaWYgcGVlciBzdGFydGVkIGRkIE9SIHdlIHN0YXJ0ZWQgZGQgYW5kIHByZS1mZXRjaCBwaW4gd2FzIG5vdCB1c2VkIHNlbmQKLSAgICAgKiBuZWdhdGl2ZSByZXBseSAqLwotICAgIGlmICgoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19QRUVSX1NUQVJURURfREQpIHx8Ci0gICAgICAgICgoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSAmJgotICAgICAgICAgKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfRElTQ19XSEVOX0RPTkUpKSkgewotICAgICAgLyogdXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfQVVUSF9DT01QTEVURSB0byByZXBvcnQgYXV0aGVudGljYXRpb24gZmFpbGVkCi0gICAgICAgKiBldmVudCAqLwotICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEUpOwotICAgICAgYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZKTsKLQotICAgICAgYnRzbmRfaGNpY19waW5fY29kZV9uZWdfcmVwbHkoYmRfYWRkcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgPSBCVE1fU0VDX05PTkU7Ci0gICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0gQlRNX1NFQ19MSU5LX0tFWV9BVVRIRUQ7Ci0gIHBfZGV2X3JlYy0+cGluX2NvZGVfbGVuZ3RoID0gcGluX2xlbjsKLSAgaWYgKHBpbl9sZW4gPj0gMTYpIHsKLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDXzE2X0RJR0lUX1BJTl9BVVRIRUQ7Ci0gIH0KLQotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfV0VfU1RBUlRFRF9ERCkgJiYKLSAgICAgIChwX2Rldl9yZWMtPmhjaV9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSAmJgotICAgICAgKCFidG1fY2Iuc2VjdXJpdHlfbW9kZV9jaGFuZ2VkKSkgewotICAgIC8qIFRoaXMgaXMgc3RhcnQgb2YgdGhlIGRlZGljYXRlZCBib25kaW5nIGlmIGxvY2FsIGRldmljZSBpcyAyLjAgKi8KLSAgICBidG1fY2IucGluX2NvZGVfbGVuID0gcGluX2xlbjsKLSAgICBtZW1jcHkoYnRtX2NiLnBpbl9jb2RlLCBwX3BpbiwgcGluX2xlbik7Ci0KLSAgICBidG1fY2Iuc2VjdXJpdHlfbW9kZV9jaGFuZ2VkID0gdHJ1ZTsKLSAgICBidHNuZF9oY2ljX3dyaXRlX2F1dGhfZW5hYmxlKHRydWUpOwotCi0gICAgYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihIQ0lfRVJSX1VOREVGSU5FRCk7Ci0KLSAgICAvKiBpZiB3ZSByZWplY3RlZCBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3QsIHdlIGhhdmUgdG8gd2FpdAotICAgICAqIEhDSV9Db25uZWN0aW9uX0NvbXBsZXRlIGV2ZW50ICovCi0gICAgLyogIGJlZm9yZSBvcmlnaW5hdGluZyAgKi8KLSAgICBpZiAoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19SRUpFQ1RFRF9DT05ORUNUKSB7Ci0gICAgICBCVE1fVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiQlRNX1BJTkNvZGVSZXBseSgpOiB3YWl0aW5nIEhDSV9Db25uZWN0aW9uX0NvbXBsZXRlIGFmdGVyIHJlamVjdGVkICIKLSAgICAgICAgICAiaW5jb21pbmcgY29ubmVjdGlvbiIpOwotICAgICAgLyogd2UgY2hhbmdlIHN0YXRlIGxpdHRsZSBiaXQgZWFybHkgc28gYnRtX3NlY19jb25uZWN0ZWQoKSB3aWxsIG9yaWdpbmF0ZQotICAgICAgICogY29ubmVjdGlvbiAqLwotICAgICAgLyogICB3aGVuIGV4aXN0aW5nIEFDTCBsaW5rIGlzIGRvd24gY29tcGxldGVseSAqLwotICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX1BJTl9SRVEpOwotICAgIH0KLSAgICAvKiBpZiB3ZSBhbHJlYWR5IGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb24gZnJvbSBwYWlyaW5nIGRldmljZSAqLwotICAgIGVsc2UgaWYgKHBfZGV2X3JlYy0+c200ICYgQlRNX1NNNF9DT05OX1BFTkQpIHsKLSAgICAgIEJUTV9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICJCVE1fUElOQ29kZVJlcGx5KCk6IGxpbmsgaXMgY29ubmVjdGluZyBzbyB3YWl0IHBpbiBjb2RlIHJlcXVlc3QgIgotICAgICAgICAgICJmcm9tIHBlZXIiKTsKLSAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfV0FJVF9QSU5fUkVRKTsKLSAgICB9IGVsc2UgaWYgKGJ0bV9zZWNfZGRfY3JlYXRlX2Nvbm4ocF9kZXZfcmVjKSAhPSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+QlRNX1NFQ19MSU5LX0tFWV9BVVRIRUQ7Ci0KLSAgICAgIE5vdGlmeUJvbmRpbmdDaGFuZ2UoKnBfZGV2X3JlYywgSENJX0VSUl9BVVRIX0ZBSUxVUkUpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfQVVUSF9DT01QTEVURSk7Ci0gIGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb24oSENJX1NVQ0NFU1MpOwotCi0gIGJ0c25kX2hjaWNfcGluX2NvZGVfcmVxX3JlcGx5KGJkX2FkZHIsIHBpbl9sZW4sIHBfcGluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfYm9uZF9ieV90cmFuc3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHRoaXMgaXMgdGhlIGJvbmQgZnVuY3Rpb24gdGhhdCB3aWxsIHN0YXJ0IGVpdGhlciBTU1Agb3IgU01QLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgIC0gQWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRvIGJvbmQKLSAqICAgICAgICAgICAgICAgICAgcGluX2xlbiAgICAgIC0gbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBQSU4gQ29kZQotICogICAgICAgICAgICAgICAgICBwX3BpbiAgICAgICAgLSBwb2ludGVyIHRvIGFycmF5IHdpdGggdGhlIFBJTiBDb2RlCi0gKgotICogIE5vdGU6IEFmdGVyIDIuMSBwYXJhbWV0ZXJzIGFyZSBub3QgdXNlZCBhbmQgcHJlc2VydmVkIGhlcmUgbm90IHRvIGNoYW5nZSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fc2VjX2JvbmRfYnlfdHJhbnNwb3J0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB1aW50OF90IHBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcGluKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IGJkX2FkZHI7Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCIlczogVHJhbnNwb3J0IHVzZWQgJWQsIGJkX2FkZHI9JXMiLCBfX2Z1bmNfXywgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8qIE90aGVyIHNlY3VyaXR5IHByb2Nlc3MgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgaWYgKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpIHsKLSAgICBCVE1fVFJBQ0VfRVJST1IoIkJUTV9TZWNCb25kOiBhbHJlYWR5IGJ1c3kgaW4gc3RhdGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpKTsKLSAgICByZXR1cm4gKEJUTV9XUk9OR19NT0RFKTsKLSAgfQotCi0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihiZF9hZGRyKTsKLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIChCVE1fTk9fUkVTT1VSQ0VTKTsKLSAgfQotCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9pc19yZWFkeSgpKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKCIlcyBjb250cm9sbGVyIG1vZHVsZSBpcyBub3QgcmVhZHkiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIChCVE1fTk9fUkVTT1VSQ0VTKTsKLSAgfQotCi0gIEJUTV9UUkFDRV9ERUJVRygiYmVmb3JlIHVwZGF0ZSBzZWNfZmxhZ3M9MHgleCIsIHBfZGV2X3JlYy0+c2VjX2ZsYWdzKTsKLQotICAvKiBGaW5pc2hlZCBpZiBjb25uZWN0aW9uIGlzIGFjdGl2ZSBhbmQgYWxyZWFkeSBwYWlyZWQgKi8KLSAgaWYgKCgocF9kZXZfcmVjLT5oY2lfaGFuZGxlICE9IEhDSV9JTlZBTElEX0hBTkRMRSkgJiYKLSAgICAgICB0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUiAmJgotICAgICAgIChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfQVVUSEVOVElDQVRFRCkpIHx8Ci0gICAgICAoKHBfZGV2X3JlYy0+YmxlX2hjaV9oYW5kbGUgIT0gSENJX0lOVkFMSURfSEFORExFKSAmJgotICAgICAgIHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUgJiYKLSAgICAgICAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0FVVEhFTlRJQ0FURUQpKSkgewotICAgIEJUTV9UUkFDRV9XQVJOSU5HKCJCVE1fU2VjQm9uZCAtPiBBbHJlYWR5IFBhaXJlZCIpOwotICAgIHJldHVybiAoQlRNX1NVQ0NFU1MpOwotICB9Ci0KLSAgLyogVGVsbCBjb250cm9sbGVyIHRvIGdldCByaWQgb2YgdGhlIGxpbmsga2V5IGlmIGl0IGhhcyBvbmUgc3RvcmVkICovCi0gIGlmICgoQlRNX0RlbGV0ZVN0b3JlZExpbmtLZXkoJmJkX2FkZHIsIE5VTEwpKSAhPSBCVE1fU1VDQ0VTUykKLSAgICByZXR1cm4gKEJUTV9OT19SRVNPVVJDRVMpOwotCi0gIC8qIFNhdmUgdGhlIFBJTiBjb2RlIGlmIHdlIGdvdCBhIHZhbGlkIG9uZSAqLwotICBpZiAocF9waW4gJiYgKHBpbl9sZW4gPD0gUElOX0NPREVfTEVOKSAmJiAocGluX2xlbiAhPSAwKSkgewotICAgIGJ0bV9jYi5waW5fY29kZV9sZW4gPSBwaW5fbGVuOwotICAgIHBfZGV2X3JlYy0+cGluX2NvZGVfbGVuZ3RoID0gcGluX2xlbjsKLSAgICBtZW1jcHkoYnRtX2NiLnBpbl9jb2RlLCBwX3BpbiwgUElOX0NPREVfTEVOKTsKLSAgfQotCi0gIGJ0bV9jYi5wYWlyaW5nX2JkYSA9IGJkX2FkZHI7Ci0KLSAgYnRtX2NiLnBhaXJpbmdfZmxhZ3MgPSBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REOwotCi0gIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgPSBCVE1fU0VDX09VVF9BVVRIRU5USUNBVEU7Ci0gIHBfZGV2X3JlYy0+aXNfb3JpZ2luYXRvciA9IHRydWU7Ci0KLSAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgYmRfYWRkciwgIkJvbmRpbmcgaW5pdGlhdGVkIiwKLSAgICAgICAgICAgICAgICAgYnRfdHJhbnNwb3J0X3RleHQodHJhbnNwb3J0KSk7Ci0KLSAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBidG1fYmxlX2luaXRfcHNldWRvX2FkZHIocF9kZXZfcmVjLCBiZF9hZGRyKTsKLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+QlRNX1NFQ19MRV9NQVNLOwotCi0gICAgaWYgKFNNUF9QYWlyKGJkX2FkZHIpID09IFNNUF9TVEFSVEVEKSB7Ci0gICAgICBidG1fY2IucGFpcmluZ19mbGFncyB8PSBCVE1fUEFJUl9GTEFHU19MRV9BQ1RJVkU7Ci0gICAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkc7Ci0gICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfQVVUSF9DT01QTEVURSk7Ci0gICAgICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotICAgIH0KLQotICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzID0gMDsKLSAgICByZXR1cm4gKEJUTV9OT19SRVNPVVJDRVMpOwotICB9Ci0KLSAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0KLSAgICAgIH4oQlRNX1NFQ19MSU5LX0tFWV9LTk9XTiB8IEJUTV9TRUNfQVVUSEVOVElDQVRFRCB8IEJUTV9TRUNfRU5DUllQVEVEIHwKLSAgICAgICAgQlRNX1NFQ19ST0xFX1NXSVRDSEVEIHwgQlRNX1NFQ19MSU5LX0tFWV9BVVRIRUQpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiYWZ0ZXIgdXBkYXRlIHNlY19mbGFncz0weCV4IiwgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotICBpZiAoIWNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19zaW1wbGVfcGFpcmluZygpKSB7Ci0gICAgLyogVGhlIHNwZWNpYWwgY2FzZSB3aGVuIHdlIGF1dGhlbnRpY2F0ZSBrZXlib2FyZC4gIFNldCBwaW4gdHlwZSB0byBmaXhlZCAqLwotICAgIC8qIEl0IHdvdWxkIGJlIHByb2JhYmx5IGJldHRlciB0byBkbyBpdCBmcm9tIHRoZSBhcHBsaWNhdGlvbiwgYnV0IGl0IGlzICovCi0gICAgLyogY29tcGxpY2F0ZWQgKi8KLSAgICBpZiAoKChwX2Rldl9yZWMtPmRldl9jbGFzc1sxXSAmIEJUTV9DT0RfTUFKT1JfQ0xBU1NfTUFTSykgPT0KLSAgICAgICAgIEJUTV9DT0RfTUFKT1JfUEVSSVBIRVJBTCkgJiYKLSAgICAgICAgKHBfZGV2X3JlYy0+ZGV2X2NsYXNzWzJdICYgQlRNX0NPRF9NSU5PUl9LRVlCT0FSRCkgJiYKLSAgICAgICAgKGJ0bV9jYi5jZmcucGluX3R5cGUgIT0gSENJX1BJTl9UWVBFX0ZJWEVEKSkgewotICAgICAgYnRtX2NiLnBpbl90eXBlX2NoYW5nZWQgPSB0cnVlOwotICAgICAgYnRzbmRfaGNpY193cml0ZV9waW5fdHlwZShIQ0lfUElOX1RZUEVfRklYRUQpOwotICAgIH0KLSAgfQotCi0gIEJUTV9UUkFDRV9FVkVOVCgiQlRNX1NlY0JvbmQ6IFJlbW90ZSBzbTQ6IDB4JXggIEhDSSBIYW5kbGU6IDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNtNCwgcF9kZXZfcmVjLT5oY2lfaGFuZGxlKTsKLQotI2lmIChCVE1fU0VDX0ZPUkNFX1JOUl9GT1JfREJPTkQgPT0gVFJVRSkKLSAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0gfkJUTV9TRUNfTkFNRV9LTk9XTjsKLSNlbmRpZgotCi0gIC8qIElmIGNvbm5lY3Rpb24gYWxyZWFkeSBleGlzdHMuLi4gKi8KLSAgaWYgKEJUTV9Jc0FjbENvbm5lY3Rpb25VcEFuZEhhbmRsZVZhbGlkKGJkX2FkZHIsIHRyYW5zcG9ydCkpIHsKLSAgICBidG1fc2VjX3dhaXRfYW5kX3N0YXJ0X2F1dGhlbnRpY2F0aW9uKHBfZGV2X3JlYyk7Ci0KLSAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfUElOX1JFUSk7Ci0KLSAgICAvKiBNYXJrIGxjYiBhcyBib25kaW5nICovCi0gICAgbDJjdV91cGRhdGVfbGNiXzRfYm9uZGluZyhiZF9hZGRyLCB0cnVlKTsKLSAgICByZXR1cm4gKEJUTV9DTURfU1RBUlRFRCk7Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoInNlYyBtb2RlOiAlZCBzbTQ6eCV4IiwgYnRtX2NiLnNlY3VyaXR5X21vZGUsIHBfZGV2X3JlYy0+c200KTsKLSAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfc2ltcGxlX3BhaXJpbmcoKSB8fAotICAgICAgKHBfZGV2X3JlYy0+c200ID09IEJUTV9TTTRfS05PV04pKSB7Ci0gICAgaWYgKGJ0bV9zZWNfY2hlY2tfcHJlZmV0Y2hfcGluKHBfZGV2X3JlYykpIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLSAgfQotICBpZiAoKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TUCB8fAotICAgICAgIGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgJiYKLSAgICAgIEJUTV9TRUNfSVNfU000X1VOS05PV04ocF9kZXZfcmVjLT5zbTQpKSB7Ci0gICAgLyogbG9jYWwgaXMgMi4xIGFuZCBwZWVyIGlzIHVua25vd24gKi8KLSAgICBpZiAoKHBfZGV2X3JlYy0+c200ICYgQlRNX1NNNF9DT05OX1BFTkQpID09IDApIHsKLSAgICAgIC8qIHdlIGFyZSBub3QgYWNjZXB0aW5nIGNvbm5lY3Rpb24gcmVxdWVzdCBmcm9tIHBlZXIKLSAgICAgICAqIC0+IFJOUiAodG8gbGVhcm4gaWYgcGVlciBpcyAyLjEpCi0gICAgICAgKiBSTlIgd2hlbiBubyBBQ0wgY2F1c2VzIEhDSV9STVRfSE9TVF9TVVBfRkVBVF9OT1RJRllfRVZUICovCi0gICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0dFVF9SRU1fTkFNRSk7Ci0gICAgICBzdGF0dXMgPSBCVE1fUmVhZFJlbW90ZURldmljZU5hbWUoYmRfYWRkciwgTlVMTCwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFdlIGFyZSBhY2NlcHRpbmcgY29ubmVjdGlvbiByZXF1ZXN0IGZyb20gcGVlciAqLwotICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX1BJTl9SRVEpOwotICAgICAgc3RhdHVzID0gQlRNX0NNRF9TVEFSVEVEOwotICAgIH0KLSAgICBCVE1fVFJBQ0VfREVCVUcoIlN0YXRlOiVzIHNtNDogMHgleCBzZWNfc3RhdGU6JWQiLAotICAgICAgICAgICAgICAgICAgICBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSksIHBfZGV2X3JlYy0+c200LAotICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogYm90aCBsb2NhbCBhbmQgcGVlciBhcmUgMi4xICAqLwotICAgIHN0YXR1cyA9IGJ0bV9zZWNfZGRfY3JlYXRlX2Nvbm4ocF9kZXZfcmVjKTsKLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgQlRNX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXMgQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lIG9yIGJ0bV9zZWNfZGRfY3JlYXRlX2Nvbm4gZXJyb3I6IDB4JXgiLAotICAgICAgICBfX2Z1bmNfXywgKGludClzdGF0dXMpOwotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0JvbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBlcmZvcm0gYm9uZGluZyB3aXRoIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IHVwLCBidXQgbm90IHNlY3VyZSwgcGFpcmluZwotICogICAgICAgICAgICAgICAgICBpcyBhdHRlbXB0ZWQuICBJZiBhbHJlYWR5IHBhaXJlZCBCVE1fU1VDQ0VTUyBpcyByZXR1cm5lZC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSB0byBib25kCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCAgICAtIGRvaW5nIFNTUCBvdmVyIEJSL0VEUiBvciBTTVAgb3ZlciBMRQotICogICAgICAgICAgICAgICAgICBwaW5fbGVuICAgICAgLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIFBJTiBDb2RlCi0gKiAgICAgICAgICAgICAgICAgIHBfcGluICAgICAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCB0aGUgUElOIENvZGUKLSAqCi0gKiAgTm90ZTogQWZ0ZXIgMi4xIHBhcmFtZXRlcnMgYXJlIG5vdCB1c2VkIGFuZCBwcmVzZXJ2ZWQgaGVyZSBub3QgdG8gY2hhbmdlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZWNCb25kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIHVpbnQ4X3QqIHBfcGluKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0JvbmQoYmRfYWRkciwgYWRkcl90eXBlLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUpOwotICB9Ci0KLSAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQVVUTykgewotICAgIGlmIChhZGRyX3R5cGUgPT0gQkxFX0FERFJfUFVCTElDKSB7Ci0gICAgICB0cmFuc3BvcnQgPQotICAgICAgICAgIEJUTV9Vc2VMZUxpbmsoYmRfYWRkcikgPyBCVF9UUkFOU1BPUlRfTEUgOiBCVF9UUkFOU1BPUlRfQlJfRURSOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfSU5GTygiRm9yY2luZyB0cmFuc3BvcnQgTEUgKHdhcyBhdXRvKSBiZWNhdXNlIG9mIHRoZSBhZGRyZXNzIHR5cGUiKTsKLSAgICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLSAgICB9Ci0gIH0KLSAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlOwotCi0gIEJUTV9SZWFkRGV2SW5mbyhiZF9hZGRyLCAmZGV2X3R5cGUsICZhZGRyX3R5cGUpOwotICAvKiBMRSBkZXZpY2UsIGRvIFNNUCBwYWlyaW5nICovCi0gIGlmICgodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSAmJiAoZGV2X3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CTEUpID09IDApIHx8Ci0gICAgICAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIgJiYKLSAgICAgICAoZGV2X3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CUkVEUikgPT0gMCkpIHsKLSAgICByZXR1cm4gQlRNX0lMTEVHQUxfQUNUSU9OOwotICB9Ci0gIHJldHVybiBidG1fc2VjX2JvbmRfYnlfdHJhbnNwb3J0KGJkX2FkZHIsIHRyYW5zcG9ydCwgcGluX2xlbiwgcF9waW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0JvbmRDYW5jZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNhbmNlbCBvbmdvaW5nIGJvbmRpbmcgcHJvY2VzcwotICogICAgICAgICAgICAgICAgICB3aXRoIHBlZXIgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ICAgIC0gZmFsc2UgZm9yIEJSL0VEUiBsaW5rOyB0cnVlIGZvciBMRSBsaW5rCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZWNCb25kQ2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQm9uZENhbmNlbChiZF9hZGRyKTsKLSAgfQotCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLQotICBCVE1fVFJBQ0VfQVBJKCJCVE1fU2VjQm9uZENhbmNlbCgpICBTdGF0ZTogJXMgZmxhZ3M6MHgleCIsCi0gICAgICAgICAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpLAotICAgICAgICAgICAgICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzKTsKLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICBpZiAoIXBfZGV2X3JlYyB8fCBidG1fY2IucGFpcmluZ19iZGEgIT0gYmRfYWRkcikgewotICAgIHJldHVybiBCVE1fVU5LTk9XTl9BRERSOwotICB9Ci0KLSAgaWYgKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfTEVfQUNUSVZFKSB7Ci0gICAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkcpIHsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiQ2FuY2VsIExFIHBhaXJpbmciKTsKLSAgICAgIGlmIChTTVBfUGFpckNhbmNlbChiZF9hZGRyKSkgewotICAgICAgICByZXR1cm4gQlRNX0NNRF9TVEFSVEVEOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQlRNX1dST05HX01PREU7Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoImhjaV9oYW5kbGU6MHgleCBzZWNfc3RhdGU6JWQiLCBwX2Rldl9yZWMtPmhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSk7Ci0gIGlmIChCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX1BJTiA9PSBidG1fY2IucGFpcmluZ19zdGF0ZSAmJgotICAgICAgQlRNX1BBSVJfRkxBR1NfV0VfU1RBUlRFRF9ERCAmIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzKSB7Ci0gICAgLyogcHJlLWZldGNoaW5nIHBpbiBmb3IgZGVkaWNhdGVkIGJvbmRpbmcgKi8KLSAgICBidG1fc2VjX2JvbmRfY2FuY2VsX2NvbXBsZXRlKCk7Ci0gICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICB9Ci0KLSAgLyogSWYgdGhpcyBCREEgaXMgaW4gYSBib25kaW5nIHByb2NlZHVyZSAqLwotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpICYmCi0gICAgICAoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSkgewotICAgIC8qIElmIHRoZSBIQ0kgbGluayBpcyB1cCAqLwotICAgIGlmIChwX2Rldl9yZWMtPmhjaV9oYW5kbGUgIT0gSENJX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICAvKiBJZiBzb21lIG90aGVyIHRocmVhZCBkaXNjb25uZWN0aW5nLCB3ZSBkbyBub3Qgc2VuZCBzZWNvbmQgY29tbWFuZCAqLwotICAgICAgaWYgKChwX2Rldl9yZWMtPnNlY19zdGF0ZSA9PSBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkcpIHx8Ci0gICAgICAgICAgKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfRElTQ09OTkVDVElOR19CT1RIKSkKLSAgICAgICAgcmV0dXJuIChCVE1fQ01EX1NUQVJURUQpOwotCi0gICAgICAvKiBJZiB0aGUgSENJIGxpbmsgd2FzIHNldCB1cCBieSBCb25kaW5nIHByb2Nlc3MgKi8KLSAgICAgIGlmIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX0RJU0NfV0hFTl9ET05FKQotICAgICAgICByZXR1cm4gYnRtX3NlY19zZW5kX2hjaV9kaXNjb25uZWN0KHBfZGV2X3JlYywgSENJX0VSUl9QRUVSX1VTRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5oY2lfaGFuZGxlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbDJjdV91cGRhdGVfbGNiXzRfYm9uZGluZyhiZF9hZGRyLCBmYWxzZSk7Ci0KLSAgICAgIHJldHVybiBCVE1fTk9UX0FVVEhPUklaRUQ7Ci0gICAgfSBlbHNlIC8qSENJIGxpbmsgaXMgbm90IHVwICovCi0gICAgewotICAgICAgLyogSWYgdGhlIEhDSSBsaW5rIGNyZWF0aW9uIHdhcyBzdGFydGVkIGJ5IEJvbmRpbmcgcHJvY2VzcyAqLwotICAgICAgaWYgKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfRElTQ19XSEVOX0RPTkUpIHsKLSAgICAgICAgYnRzbmRfaGNpY19jcmVhdGVfY29ubl9jYW5jZWwoYmRfYWRkcik7Ci0gICAgICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gICAgICB9Ci0gICAgICBpZiAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgPT0gQlRNX1BBSVJfU1RBVEVfR0VUX1JFTV9OQU1FKSB7Ci0gICAgICAgIEJUTV9DYW5jZWxSZW1vdGVEZXZpY2VOYW1lKCk7Ci0gICAgICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzIHw9IEJUTV9QQUlSX0ZMQUdTX1dFX0NBTkNFTF9ERDsKLSAgICAgICAgcmV0dXJuIEJUTV9DTURfU1RBUlRFRDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBCVE1fTk9UX0FVVEhPUklaRUQ7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIEJUTV9XUk9OR19NT0RFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0dldERldmljZUxpbmtLZXlUeXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvYnRhaW4gbGluayBrZXkgdHlwZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgaXQgcmV0dXJucyBCVE1fU1VDQ0VTUyBpZiBsaW5rIGtleSBpcyBhdmFpbGFibGUsIG9yCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgU2VjdXJpdHkgTWFuYWdlciBkb2VzIG5vdCBrbm93IGFib3V0Ci0gKiAgICAgICAgICAgICAgICAgIHRoZSBkZXZpY2Ugb3IgZGV2aWNlIHJlY29yZCBkb2VzIG5vdCBjb250YWluIGxpbmsga2V5IGluZm8KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9MS0VZX1RZUEVfSUdOT1JFIGlmIGxpbmsga2V5IGlzIHVua25vd24sIGxpbmsgdHlwZQotICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fTElOS19LRVlfVFlQRSBCVE1fU2VjR2V0RGV2aWNlTGlua0tleVR5cGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0KLSAgaWYgKChwX2Rldl9yZWMgIT0gTlVMTCkgJiYgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9LTk9XTikpIHsKLSAgICByZXR1cm4gcF9kZXZfcmVjLT5saW5rX2tleV90eXBlOwotICB9Ci0gIHJldHVybiBCVE1fTEtFWV9UWVBFX0lHTk9SRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXRFbmNyeXB0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlbnN1cmUgdGhhdCBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZC4gIFNob3VsZCBiZSBjYWxsZWQgb25seSBvbiBhbiBvcGVuIGNvbm5lY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFR5cGljYWxseSBvbmx5IG5lZWRlZCBmb3IgY29ubmVjdGlvbnMgdGhhdCBmaXJzdCB3YW50IHRvCi0gKiAgICAgICAgICAgICAgICAgIGJyaW5nIHVwIHVuZW5jcnlwdGVkIGxpbmtzLCB0aGVuIGxhdGVyIGVuY3J5cHQgdGhlbS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgICAgIC0gTGluayB0cmFuc3BvcnQKLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayAgICAtIFBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgUEVORElORyBhZnRlciByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlcyBhcmUgY29tcGxldGVkLiAgQ2FuIGJlIHNldCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBzdGF0dXMgaXMgbm90IGRlc2lyZWQuCi0gKiAgICAgICAgICAgICAgICAgIHBfcmVmX2RhdGEgICAgLSBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBjYWxsZXIgd2lzaGVzIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB1cG9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLiBjYW4gYmUgc2V0IHRvIE5VTEwgaWYgbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgIHNlY19hY3QgICAgICAgLSBMRSBzZWN1cml0eSBhY3Rpb24sIHVudXNlZCBmb3IgQlIvRURSCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyAgIC0gYWxyZWFkeSBlbmNyeXB0ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX1BFTkRJTkcgICAtIGNvbW1hbmQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgQlRNX1dST05HX01PREUtIGNvbm5lY3Rpb24gbm90IHVwLgotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSAgICAgIC0gc2VjdXJpdHkgcHJvY2VkdXJlcyBhcmUgY3VycmVudGx5IGFjdGl2ZQotICogICAgICAgICAgICAgICAgICBCVE1fTU9ERV9VTlNVUFBPUlRFRCAtIGlmIHNlY3VyaXR5IG1hbmFnZXIgbm90IGxpbmtlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldEVuY3J5cHRpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2V0RW5jcnlwdGlvbihiZF9hZGRyLCB0cmFuc3BvcnQsIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZWZfZGF0YSwgc2VjX2FjdCk7Ci0gIH0KLQotICB0QlRNX1NUQVRVUyByYyA9IEJUTV9TVUNDRVNTOwotCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKCFwX2Rldl9yZWMgfHwKLSAgICAgICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUiAmJgotICAgICAgIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSA9PSBIQ0lfSU5WQUxJRF9IQU5ETEUpIHx8Ci0gICAgICAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSAmJgotICAgICAgIHBfZGV2X3JlYy0+YmxlX2hjaV9oYW5kbGUgPT0gSENJX0lOVkFMSURfSEFORExFKSkgewotICAgIC8qIENvbm5lY3Rpb24gc2hvdWxkIGJlIHVwIGFuZCBydW5ubmluZyAqLwotICAgIEJUTV9UUkFDRV9XQVJOSU5HKCJTZWN1cml0eSBNYW5hZ2VyOiBCVE1fU2V0RW5jcnlwdGlvbiBub3QgY29ubmVjdGVkIik7Ci0KLSAgICBpZiAocF9jYWxsYmFjaykKLSAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgQlRNX1dST05HX01PREUpOwotCi0gICAgcmV0dXJuIChCVE1fV1JPTkdfTU9ERSk7Ci0gIH0KLQotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIgJiYKLSAgICAgIChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfRU5DUllQVEVEKSkgewotICAgIEJUTV9UUkFDRV9FVkVOVCgiU2VjdXJpdHkgTWFuYWdlcjogQlRNX1NldEVuY3J5cHRpb24gYWxyZWFkeSBlbmNyeXB0ZWQiKTsKLQotICAgIGlmICgqcF9jYWxsYmFjaykKLSAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgQlRNX1NVQ0NFU1MpOwotCi0gICAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci0gIH0KLQotICAvKiBlbnF1ZXVlIHNlY3VyaXR5IHJlcXVlc3QgaWYgc2VjdXJpdHkgaXMgYWN0aXZlICovCi0gIGlmIChwX2Rldl9yZWMtPnBfY2FsbGJhY2sgfHwgKHBfZGV2X3JlYy0+c2VjX3N0YXRlICE9IEJUTV9TRUNfU1RBVEVfSURMRSkpIHsKLSAgICBCVE1fVFJBQ0VfV0FSTklORygKLSAgICAgICAgIlNlY3VyaXR5IE1hbmFnZXI6IEJUTV9TZXRFbmNyeXB0aW9uIGJ1c3ksIGVucXVldWUgcmVxdWVzdCIpOwotCi0gICAgaWYgKGJ0bV9zZWNfcXVldWVfZW5jcnlwdF9yZXF1ZXN0KGJkX2FkZHIsIHRyYW5zcG9ydCwgcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZWZfZGF0YSwgc2VjX2FjdCkpIHsKLSAgICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChwX2NhbGxiYWNrKQotICAgICAgICAoKnBfY2FsbGJhY2spKCZiZF9hZGRyLCB0cmFuc3BvcnQsIHBfcmVmX2RhdGEsIEJUTV9OT19SRVNPVVJDRVMpOwotICAgICAgcmV0dXJuIEJUTV9OT19SRVNPVVJDRVM7Ci0gICAgfQotICB9Ci0KLSAgcF9kZXZfcmVjLT5wX2NhbGxiYWNrID0gcF9jYWxsYmFjazsKLSAgcF9kZXZfcmVjLT5wX3JlZl9kYXRhID0gcF9yZWZfZGF0YTsKLSAgcF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCB8PQotICAgICAgKEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19JTl9FTkNSWVBUKTsKLSAgcF9kZXZfcmVjLT5pc19vcmlnaW5hdG9yID0gZmFsc2U7Ci0KLSAgQlRNX1RSQUNFX0FQSSgKLSAgICAgICJTZWN1cml0eSBNYW5hZ2VyOiBCVE1fU2V0RW5jcnlwdGlvbiBIYW5kbGU6JWQgU3RhdGU6JWQgRmxhZ3M6MHgleCAiCi0gICAgICAiUmVxdWlyZWQ6MHgleCwgcF9kZXZfcmVjPSVwLCBwX2NhbGxiYWNrPSVwIiwKLSAgICAgIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSwgcF9kZXZfcmVjLT5zZWNfc3RhdGUsIHBfZGV2X3JlYy0+c2VjX2ZsYWdzLAotICAgICAgcF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCwgcF9kZXZfcmVjLCBwX2NhbGxiYWNrKTsKLQotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIGlmIChCVE1fSXNBY2xDb25uZWN0aW9uVXAoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSkgewotICAgICAgcmMgPSBidG1fYmxlX3NldF9lbmNyeXB0aW9uKGJkX2FkZHIsIHNlY19hY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQV9HZXRCbGVDb25uUm9sZShiZF9hZGRyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJjID0gQlRNX1dST05HX01PREU7Ci0gICAgICBCVE1fVFJBQ0VfV0FSTklORygiJXM6IGNhbm5vdCBjYWxsIGJ0bV9ibGVfc2V0X2VuY3J5cHRpb24sIHAgaXMgTlVMTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJjID0gYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZShwX2Rldl9yZWMpOwotICB9Ci0KLSAgaWYgKHJjICE9IEJUTV9DTURfU1RBUlRFRCAmJiByYyAhPSBCVE1fQlVTWSkgewotICAgIGlmIChwX2NhbGxiYWNrKSB7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIiVzOiBjbGVhcmluZyBwX2NhbGxiYWNrPSVwLCBwX2Rldl9yZWM9JXAsIHRyYW5zcG9ydD0lZCwgIgotICAgICAgICAgICJiZF9hZGRyPSVzIiwKLSAgICAgICAgICBfX2Z1bmNfXywgcF9jYWxsYmFjaywgcF9kZXZfcmVjLCB0cmFuc3BvcnQsCi0gICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcF9kZXZfcmVjLT5wX2NhbGxiYWNrID0gTlVMTDsKLSAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9kZXZfcmVjLT5wX3JlZl9kYXRhLCByYyk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChyYyk7Ci19Ci0KLWJvb2wgQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICByZXR1cm4gcF9kZXZfcmVjICYmIChwX2Rldl9yZWMtPnNlY19zdGF0ZSA9PSBCVE1fU0VDX1NUQVRFX0VOQ1JZUFRJTkcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkaXNjb25uZWN0IHRoZSBBQ0wgbGluaywgaWYgaXQncyBub3QgZG9uZSB5ZXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVE1fU1RBVFVTIGJ0bV9zZWNfc2VuZF9oY2lfZGlzY29ubmVjdCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9oYW5kbGUpIHsKLSAgY29uc3QgdFNFQ1VSSVRZX1NUQVRFIG9sZF9zdGF0ZSA9Ci0gICAgICBzdGF0aWNfY2FzdDx0U0VDVVJJVFlfU1RBVEU+KHBfZGV2X3JlYy0+c2VjX3N0YXRlKTsKLSAgY29uc3QgdEJUTV9TVEFUVVMgc3RhdHVzID0gQlRNX0NNRF9TVEFSVEVEOwotCi0gIC8qIHNlbmQgSENJX0Rpc2Nvbm5lY3Qgb24gYSB0cmFuc3BvcnQgb25seSBvbmNlICovCi0gIHN3aXRjaCAob2xkX3N0YXRlKSB7Ci0gICAgY2FzZSBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICBpZiAoY29ubl9oYW5kbGUgPT0gcF9kZXZfcmVjLT5oY2lfaGFuZGxlKSB7Ci0gICAgICAgIC8vIEFscmVhZHkgc2VudCBjbGFzc2ljIGRpc2Nvbm5lY3QKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIC8vIFByZXBhcmUgdG8gc2VuZCBkaXNjb25uZWN0IG9uIGxlIHRyYW5zcG9ydAotICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQk9USDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQkxFOgotICAgICAgaWYgKGNvbm5faGFuZGxlID09IHBfZGV2X3JlYy0+YmxlX2hjaV9oYW5kbGUpIHsKLSAgICAgICAgLy8gQWxyZWFkeSBzZW50IGJsZSBkaXNjb25uZWN0Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICAvLyBQcmVwYXJlIHRvIHNlbmQgZGlzY29ubmVjdCBvbiBjbGFzc2ljIHRyYW5zcG9ydAotICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQk9USDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQk9USDoKLSAgICAgIC8vIEFscmVhZHkgc2VudCBkaXNjb25uZWN0IG9uIGJvdGggdHJhbnNwb3J0cwotICAgICAgcmV0dXJuIHN0YXR1czsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IChjb25uX2hhbmRsZSA9PSBwX2Rldl9yZWMtPmhjaV9oYW5kbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJUTV9TRUNfU1RBVEVfRElTQ09OTkVDVElORwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQkxFOwotCi0gICAgICBicmVhazsKLSAgfQotCi0gIExPR19ERUJVRygiU2VuZCBoY2kgZGlzY29ubmVjdCBoYW5kbGU6MHglMDR4IHJlYXNvbjolcyIsIGNvbm5faGFuZGxlLAotICAgICAgICAgICAgaGNpX3JlYXNvbl9jb2RlX3RleHQocmVhc29uKS5jX3N0cigpKTsKLSAgYWNsX2Rpc2Nvbm5lY3RfYWZ0ZXJfcm9sZV9zd2l0Y2goY29ubl9oYW5kbGUsIHJlYXNvbik7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Db25maXJtUmVxUmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvbmZpcm0gdGhlIG51bWVyaWMgdmFsdWUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNpbXBsZSBQYWlyaW5nIGluIHJlc3BvbnNlIHRvIEJUTV9TUF9DRk1fUkVRX0VWVAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcmVzICAgICAgICAgICAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIEJUTV9TVUNDRVNTIGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9Db25maXJtUmVxUmVwbHkodEJUTV9TVEFUVVMgcmVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIEFTU0VSVF9MT0coIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCksICJVbnJlYWNoYWJsZSBjb2RlIHBhdGgiKTsKLQotICBCVE1fVFJBQ0VfRVZFTlQoIkJUTV9Db25maXJtUmVxUmVwbHkoKSBTdGF0ZTogJXMgIFJlczogJXUiLAotICAgICAgICAgICAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpLCByZXMpOwotCi0gIC8qIElmIHRpbWVvdXQgYWxyZWFkeSBleHBpcmVkIG9yIGhhcyBiZWVuIGNhbmNlbGVkLCBpZ25vcmUgdGhlIHJlcGx5ICovCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfV0FJVF9OVU1FUklDX0NPTkZJUk0pIHx8Ci0gICAgICAoYnRtX2NiLnBhaXJpbmdfYmRhICE9IGJkX2FkZHIpKQotICAgIHJldHVybjsKLQotICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfQVVUSF9DT01QTEVURSk7Ci0KLSAgaWYgKChyZXMgPT0gQlRNX1NVQ0NFU1MpIHx8IChyZXMgPT0gQlRNX1NVQ0NFU1NfTk9fU0VDVVJJVFkpKSB7Ci0gICAgYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihIQ0lfU1VDQ0VTUyk7Ci0KLSAgICBidHNuZF9oY2ljX3VzZXJfY29uZl9yZXBseShiZF9hZGRyLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBSZXBvcnQgYXV0aGVudGljYXRpb24gZmFpbGVkIGV2ZW50IGZyb20gc3RhdGUKLSAgICAgKiBCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEUgKi8KLSAgICBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFkpOwotICAgIGJ0c25kX2hjaWNfdXNlcl9jb25mX3JlcGx5KGJkX2FkZHIsIGZhbHNlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1Bhc3NrZXlSZXFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgcGFzc2tleSBmb3IKLSAqICAgICAgICAgICAgICAgICAgU2ltcGxlIFBhaXJpbmcgaW4gcmVzcG9uc2UgdG8gQlRNX1NQX0tFWV9SRVFfRVZUCi0gKgotICogUGFyYW1ldGVyczogICAgICByZXMgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYgc3VjY2VzcwotICogICAgICAgICAgICAgICAgICBiZF9hZGRyIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcGFzc2tleSAtIG51bWVyaWMgdmFsdWUgaW4gdGhlIHJhbmdlIG9mCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9NSU5fUEFTU0tFWV9WQUwoMCkgLQotICogICAgICAgICAgICAgICAgICBCVE1fTUFYX1BBU1NLRVlfVkFMKDk5OTk5OSgweEY0MjNGKSkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1Bhc3NrZXlSZXFSZXBseSh0QlRNX1NUQVRVUyByZXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc2tleSkgewotICBBU1NFUlRfTE9HKCFibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpLCAiVW5yZWFjaGFibGUgY29kZSBwYXRoIik7Ci0KLSAgQlRNX1RSQUNFX0FQSSgiQlRNX1Bhc3NrZXlSZXFSZXBseTogU3RhdGU6ICVzICByZXM6JWQiLAotICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSwgcmVzKTsKLQotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX3N0YXRlID09IEJUTV9QQUlSX1NUQVRFX0lETEUpIHx8Ci0gICAgICAoYnRtX2NiLnBhaXJpbmdfYmRhICE9IGJkX2FkZHIpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSWYgdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb3IgaGFzIGJlZW4gY2FuY2VsZWQsIGlnbm9yZSB0aGUgcmVwbHkgKi8KLSAgaWYgKChidG1fY2IucGFpcmluZ19zdGF0ZSA9PSBCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEUpICYmCi0gICAgICAocmVzICE9IEJUTV9TVUNDRVNTKSkgewotICAgIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgICBpZiAocF9kZXZfcmVjICE9IE5VTEwpIHsKLSAgICAgIGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb24oSENJX0VSUl9IT1NUX1JFSkVDVF9TRUNVUklUWSk7Ci0KLSAgICAgIGlmIChwX2Rldl9yZWMtPmhjaV9oYW5kbGUgIT0gSENJX0lOVkFMSURfSEFORExFKQotICAgICAgICBidG1fc2VjX3NlbmRfaGNpX2Rpc2Nvbm5lY3QocF9kZXZfcmVjLCBIQ0lfRVJSX0FVVEhfRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIEJUTV9TZWNCb25kQ2FuY2VsKGJkX2FkZHIpOwotCi0gICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPQotICAgICAgICAgIH4oQlRNX1NFQ19MSU5LX0tFWV9BVVRIRUQgfCBCVE1fU0VDX0xJTktfS0VZX0tOT1dOKTsKLQotICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfS0VZX0VOVFJZKQotICAgIHJldHVybjsKLQotICBpZiAocGFzc2tleSA+IEJUTV9NQVhfUEFTU0tFWV9WQUwpIHJlcyA9IEJUTV9JTExFR0FMX1ZBTFVFOwotCi0gIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfV0FJVF9BVVRIX0NPTVBMRVRFKTsKLQotICBpZiAocmVzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgLyogdXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfQVVUSF9DT01QTEVURSB0byByZXBvcnQgYXV0aGVudGljYXRpb24gZmFpbGVkCi0gICAgICogZXZlbnQgKi8KLSAgICBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFkpOwotICAgIGJ0c25kX2hjaWNfdXNlcl9wYXNza2V5X25lZ19yZXBseShiZF9hZGRyKTsKLSAgfSBlbHNlIHsKLSAgICBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKEhDSV9TVUNDRVNTKTsKLSAgICBidHNuZF9oY2ljX3VzZXJfcGFzc2tleV9yZXBseShiZF9hZGRyLCBwYXNza2V5KTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRMb2NhbE9vYkRhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGxvY2FsIE9PQiBkYXRhIGZyb20KLSAqICAgICAgICAgICAgICAgICAgTE0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVhZExvY2FsT29iRGF0YSh2b2lkKSB7IGJ0c25kX2hjaWNfcmVhZF9sb2NhbF9vb2JfZGF0YSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVtb3RlT29iRGF0YVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm92aWRlIHRoZSByZW1vdGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNpbXBsZSBQYWlyaW5nIGluIHJlc3BvbnNlIHRvIEJUTV9TUF9STVRfT09CX0VWVAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBjICAgICAgICAgICAtIHNpbXBsZSBwYWlyaW5nIEhhc2ggQy4KLSAqICAgICAgICAgICAgICAgICAgciAgICAgICAgICAgLSBzaW1wbGUgcGFpcmluZyBSYW5kb21pemVyICBDLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9SZW1vdGVPb2JEYXRhUmVwbHkodEJUTV9TVEFUVVMgcmVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIGMsIGNvbnN0IE9jdGV0MTYmIHIpIHsKLSAgQlRNX1RSQUNFX0VWRU5UKCIlcygpIC0gU3RhdGU6ICVzIHJlczogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSwgcmVzKTsKLQotICAvKiBJZiB0aW1lb3V0IGFscmVhZHkgZXhwaXJlZCBvciBoYXMgYmVlbiBjYW5jZWxlZCwgaWdub3JlIHRoZSByZXBseSAqLwotICBpZiAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9PT0JfUlNQKSByZXR1cm47Ci0KLSAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEUpOwotCi0gIGlmIChyZXMgIT0gQlRNX1NVQ0NFU1MpIHsKLSAgICAvKiB1c2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9BVVRIX0NPTVBMRVRFIHRvIHJlcG9ydCBhdXRoZW50aWNhdGlvbiBmYWlsZWQKLSAgICAgKiBldmVudCAqLwotICAgIGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb24oSENJX0VSUl9IT1NUX1JFSkVDVF9TRUNVUklUWSk7Ci0gICAgYnRzbmRfaGNpY19yZW1fb29iX25lZ19yZXBseShiZF9hZGRyKTsKLSAgfSBlbHNlIHsKLSAgICBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKEhDSV9TVUNDRVNTKTsKLSAgICBidHNuZF9oY2ljX3JlbV9vb2JfcmVwbHkoYmRfYWRkciwgYywgcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgYm90aCB0aGUgbG9jYWwgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcGVlciBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGJkX2FkZHIgc3VwcG9ydCBCUi9FRFIKLSAqICAgICAgICAgICAgICAgICAgU2VjdXJlIENvbm5lY3Rpb25zLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgQlIvRURSIFNlY3VyZSBDb25uZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGJvdGgKLSAqICAgICAgICAgICAgICAgICAgbG9jYWwgYW5kIHRoZSByZW1vdGUgZGV2aWNlLCBlbHNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiAoKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19zZWN1cmVfY29ubmVjdGlvbnMoKSkgJiYKLSAgICAgICAgICAoQlRNX1BlZXJTdXBwb3J0c1NlY3VyZUNvbm5lY3Rpb25zKGJkX2FkZHIpKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUGVlclN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnRzCi0gKiAgICAgICAgICAgICAgICAgIEJSL0VEUiBTZWN1cmUgQ29ubmVjdGlvbnMuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyIC0gYWRkcmVzcyBvZiB0aGUgcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBCUi9FRFIgU2VjdXJlIENvbm5lY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHBlZXIsCi0gKiAgICAgICAgICAgICAgICAgIGVsc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1BlZXJTdXBwb3J0c1NlY3VyZUNvbm5lY3Rpb25zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjOwotCi0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHVua25vd24gQkRBOiAiIDw8IGJkX2FkZHI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIChwX2Rldl9yZWMtPlN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0UGVlckRldmljZVR5cGVGcm9tRmVhdHVyZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBwZWVyIGRldmljZSB0eXBlCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHJlZmVyZW5jaW5nIHRoZSByZW1vdGUgZmVhdHVyZXMuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyIC0gYWRkcmVzcyBvZiB0aGUgcGVlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfREVWSUNFX1RZUEVfRFVNTyBpZiBib3RoIEJSL0VEUiBhbmQgQkxFIHRyYW5zcG9ydHMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgcGVlciwKLSAqICAgICAgICAgICAgICAgICAgQlRfREVWSUNFX1RZUEVfQlJFRFIgaWYgb25seSBCUi9FRFIgdHJhbnNwb3J0IGlzIHN1cHBvcnRlZCwKLSAqICAgICAgICAgICAgICAgICAgQlRfREVWSUNFX1RZUEVfQkxFIGlmIG9ubHkgQkxFIHRyYW5zcG9ydCBpcyBzdXBwb3J0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVF9ERVZJQ0VfVFlQRSBCVE1fR2V0UGVlckRldmljZVR5cGVGcm9tRmVhdHVyZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX2Rldl9yZWMgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmtub3duIEJEQTolcyIsIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHBfZGV2X3JlYy0+cmVtb3RlX3N1cHBvcnRzX2JsZSAmJiBwX2Rldl9yZWMtPnJlbW90ZV9zdXBwb3J0c19icmVkcikgewotICAgICAgcmV0dXJuIEJUX0RFVklDRV9UWVBFX0RVTU87Ci0gICAgfSBlbHNlIGlmIChwX2Rldl9yZWMtPnJlbW90ZV9zdXBwb3J0c19icmVkcikgewotICAgICAgcmV0dXJuIEJUX0RFVklDRV9UWVBFX0JSRURSOwotICAgIH0gZWxzZSBpZiAocF9kZXZfcmVjLT5yZW1vdGVfc3VwcG9ydHNfYmxlKSB7Ci0gICAgICByZXR1cm4gQlRfREVWSUNFX1RZUEVfQkxFOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfV0FSTigiRGV2aWNlIGZlYXR1cmVzIGRvZXMgbm90IHN1cHBvcnQgQlIvRURSIGFuZCBCTEU6JXMiLAotICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEJUX0RFVklDRV9UWVBFX0JSRURSOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgSSBOIFQgRSBSIE4gQSBMICAgICBGIFUgTiBDIFQgSSBPIE4gUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2lzX3VwZ3JhZGVfcG9zc2libGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBleGlzdGluZyBsaW5rIGtleQotICogICAgICAgICAgICAgICAgICBjYW4gYmUgdXBncmFkZWQgb3IgaWYgdGhlIGxpbmsga2V5IGRvZXMgbm90IGV4aXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidG1fc2VjX2lzX3VwZ3JhZGVfcG9zc2libGUodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfb3JpZ2luYXRvcikgewotICB1aW50MTZfdCBtdG1fY2hlY2sgPSBpc19vcmlnaW5hdG9yID8gQlRNX1NFQ19PVVRfTUlUTSA6IEJUTV9TRUNfSU5fTUlUTTsKLSAgYm9vbCBpc19wb3NzaWJsZSA9IHRydWU7Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9LTk9XTikgewotICAgIGlzX3Bvc3NpYmxlID0gZmFsc2U7Ci0gICAgLyogQWxyZWFkeSBoYXZlIGEgbGluayBrZXkgdG8gdGhlIGNvbm5lY3RlZCBwZWVyLiBJcyB0aGUgbGluayBrZXkgc2VjdXJlCi0gICAgICplbm91Z2g/Ci0gICAgICoqIElzIGEgbGluayBrZXkgdXBncmFkZSBldmVuIHBvc3NpYmxlPwotICAgICAqLwotICAgIGlmICgocF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmIG10bV9jaGVjaykgLyogbmVlZHMgTUlUTSAqLwotICAgICAgICAmJiAoKHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX1VOQVVUSF9DT01CKSB8fAotICAgICAgICAgICAgKHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX1VOQVVUSF9DT01CX1BfMjU2KSkKLSAgICAgICAgLyogaGFzIHVuYXV0aGVudGljYXRlZAotICAgICAgICBsaW5rIGtleSAqLwotICAgICAgICAmJiAocF9kZXZfcmVjLT5ybXRfaW9fY2FwcyA8IEJUTV9JT19DQVBfTUFYKSAvKiBhIHZhbGlkIHBlZXIgSU8gY2FwICovCi0gICAgICAgICYmIChidG1fc2VjX2lvX21hcFtwX2Rldl9yZWMtPnJtdF9pb19jYXBzXVtidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHNdKSkKLSAgICAvKiBhdXRoZW50aWNhdGVkCi0gICAgbGluayBrZXkgaXMgcG9zc2libGUgKi8KLSAgICB7Ci0gICAgICAvKiB1cGdyYWRlIGlzIHBvc3NpYmxlOiBjaGVjayBpZiB0aGUgYXBwbGljYXRpb24gd2FudHMgdGhlIHVwZ3JhZGUuCi0gICAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gaXMgY29uZmlndXJlZCB0byB1c2UgYSBnbG9iYWwgTUlUTSBmbGFnLAotICAgICAgICogaXQgcHJvYmFibHkgd291bGQgbm90IHdhbnQgdG8gdXBncmFkZSB0aGUgbGluayBrZXkgYmFzZWQgb24gdGhlCi0gICAgICAgKiBzZWN1cml0eSBsZXZlbCBkYXRhYmFzZSAqLwotICAgICAgaXNfcG9zc2libGUgPSB0cnVlOwotICAgIH0KLSAgfQotICBCVE1fVFJBQ0VfREVCVUcoIiVzKCkgaXNfcG9zc2libGU6ICVkIHNlY19mbGFnczogMHgleCIsIF9fZnVuY19fLCBpc19wb3NzaWJsZSwKLSAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzKTsKLSAgcmV0dXJuIGlzX3Bvc3NpYmxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19jaGVja191cGdyYWRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiB0aGUgZXhpc3RpbmcgbGluayBrZXkKLSAqICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgdXBncmFkZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9zZWNfY2hlY2tfdXBncmFkZSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yKSB7Ci0gIEJUTV9UUkFDRV9ERUJVRygiJXMoKSIsIF9fZnVuY19fKTsKLQotICAvKiBPbmx5IGNoZWNrIGlmIGxpbmsga2V5IGFscmVhZHkgZXhpc3RzICovCi0gIGlmICghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9LTk9XTikpIHJldHVybjsKLQotICBpZiAoYnRtX3NlY19pc191cGdyYWRlX3Bvc3NpYmxlKHBfZGV2X3JlYywgaXNfb3JpZ2luYXRvcikpIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoIm5lZWQgdXBncmFkZSEhIHNlY19mbGFnczoweCV4IiwgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotICAgIC8qIGlmIHRoZSBhcHBsaWNhdGlvbiBjb25maXJtcyB0aGUgdXBncmFkZSwgc2V0IHRoZSB1cGdyYWRlIGJpdCAqLwotICAgIHBfZGV2X3JlYy0+c200IHw9IEJUTV9TTTRfVVBHUkFERTsKLQotICAgIC8qIENsZWFyIHRoZSBsaW5rIGtleSBrbm93biB0byBnbyB0aHJvdWdoIGF1dGhlbnRpY2F0aW9uL3BhaXJpbmcgYWdhaW4gKi8KLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+KEJUTV9TRUNfTElOS19LRVlfS05PV04gfCBCVE1fU0VDX0xJTktfS0VZX0FVVEhFRCk7Ci0gICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0gfkJUTV9TRUNfQVVUSEVOVElDQVRFRDsKLSAgICBCVE1fVFJBQ0VfREVCVUcoInNlY19mbGFnczoweCV4IiwgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotICB9Ci19Ci0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcV9ieV9yZXF1aXJlbWVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlZCwgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLCB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gIExPR19ERUJVRygKLSAgICAgICJDaGVja2luZyBsMmNhcCBhY2Nlc3MgcmVxdWlyZW1lbnRzIHBlZXI6JXMgc2VjdXJpdHk6MHgleCAiCi0gICAgICAiaXNfaW5pdGlhdG9yOiVzIiwKLSAgICAgIFBSSVZBVEVfQUREUkVTUyhiZF9hZGRyKSwgc2VjdXJpdHlfcmVxdWlyZWQsCi0gICAgICBsb2dib29sKGlzX29yaWdpbmF0b3IpLmNfc3RyKCkpOwotCi0gIHRCVE1fU1RBVFVTIHJjID0gQlRNX1NVQ0NFU1M7Ci0gIGJvb2wgY2hrX2FjcF9hdXRoX2RvbmUgPSBmYWxzZTsKLSAgLyogc2hvdWxkIGNoZWNrIFBTTSByYW5nZSBpbiBMRSBjb25uZWN0aW9uIG9yaWVudGVkIEwyQ0FQIGNvbm5lY3Rpb24gKi8KLSAgY29uc3RleHByIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKLQotICAvKiBGaW5kIG9yIGdldCBvbGRlc3QgcmVjb3JkICovCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihiZF9hZGRyKTsKLQotICBwX2Rldl9yZWMtPmhjaV9oYW5kbGUgPSBCVE1fR2V0SENJQ29ubkhhbmRsZShiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICBpZiAoKCFpc19vcmlnaW5hdG9yKSAmJiAoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX01PREU0X0xFVkVMNCkpIHsKLSAgICBib29sIGxvY2FsX3N1cHBvcnRzX3NjID0KLSAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucygpOwotICAgIC8qIGFjY2VwdG9yIHJlY2VpdmVzIEwyQ0FQIENoYW5uZWwgQ29ubmVjdCBSZXF1ZXN0IGZvciBTZWN1cmUgQ29ubmVjdGlvbnMKLSAgICAgKiBPbmx5IHNlcnZpY2UgKi8KLSAgICBpZiAoIWxvY2FsX3N1cHBvcnRzX3NjIHx8ICFwX2Rldl9yZWMtPlN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMoKSkgewotICAgICAgTE9HX1dBUk4oCi0gICAgICAgICAgIlBvbGljeSByZXF1aXJlcyBtb2RlIDQgbGV2ZWwgNCwgYnV0IGxvY2FsX3N1cHBvcnRfZm9yX3NjPSVkLCAiCi0gICAgICAgICAgInJtdF9zdXBwb3J0X2Zvcl9zYz0lcywgZmFpbGluZyBjb25uZWN0aW9uIiwKLSAgICAgICAgICBsb2NhbF9zdXBwb3J0c19zYywKLSAgICAgICAgICBsb2dib29sKHBfZGV2X3JlYy0+U3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucygpKS5jX3N0cigpKTsKLSAgICAgIGlmIChwX2NhbGxiYWNrKSB7Ci0gICAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgKHZvaWQqKXBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgQlRNX01PREU0X0xFVkVMNF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIChCVE1fTU9ERTRfTEVWRUw0X05PVF9TVVBQT1JURUQpOwotICAgIH0KLSAgfQotCi0gIC8qIHRoZXJlIGFyZSBzb21lIGRldmljZXMgKG1vdG8gS1JaUikgd2hpY2ggY29ubmVjdHMgdG8gc2V2ZXJhbCBzZXJ2aWNlcyBhdAotICAgKiB0aGUgc2FtZSB0aW1lICovCi0gIC8qIHdlIHdpbGwgcHJvY2VzcyBvbmUgYWZ0ZXIgYW5vdGhlciAqLwotICBpZiAoKHBfZGV2X3JlYy0+cF9jYWxsYmFjaykgfHwKLSAgICAgIChidG1fY2IucGFpcmluZ19zdGF0ZSAhPSBCVE1fUEFJUl9TVEFURV9JRExFKSkgewotICAgIExPR19ERUJVRygic2VjdXJpdHlfZmxhZ3M6eCV4LCBzZWNfZmxhZ3M6eCV4Iiwgc2VjdXJpdHlfcmVxdWlyZWQsCi0gICAgICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzKTsKLSAgICByYyA9IEJUTV9DTURfU1RBUlRFRDsKLSAgICBpZiAoKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TRVJWSUNFKSB8fAotICAgICAgICAoQlRNX1NNNF9LTk9XTiA9PSBwX2Rldl9yZWMtPnNtNCkgfHwKLSAgICAgICAgKEJUTV9TRUNfSVNfU000KHBfZGV2X3JlYy0+c200KSAmJgotICAgICAgICAgKCFidG1fc2VjX2lzX3VwZ3JhZGVfcG9zc2libGUocF9kZXZfcmVjLCBpc19vcmlnaW5hdG9yKSkpKSB7Ci0gICAgICAvKiBsZWdhY3kgbW9kZSAtIGxvY2FsIGlzIGxlZ2FjeSBvciBsb2NhbCBpcyBsaXNib24vcGVlciBpcyBsZWdhY3kKLSAgICAgICAqIG9yIFNNNCB3aXRoIG5vIHBvc3NpYmlsaXR5IG9mIGxpbmsga2V5IHVwZ3JhZGUgKi8KLSAgICAgIGlmIChpc19vcmlnaW5hdG9yKSB7Ci0gICAgICAgIGlmICgoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19PVVRfRkxBR1MpID09IDApIHx8Ci0gICAgICAgICAgICAoKCgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9GTEFHUykgPT0KLSAgICAgICAgICAgICAgIEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURSkgJiYKLSAgICAgICAgICAgICAgYnRtX2Rldl9hdXRoZW50aWNhdGVkKHBfZGV2X3JlYykpKSB8fAotICAgICAgICAgICAgKCgoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19PVVRfRkxBR1MpID09Ci0gICAgICAgICAgICAgICAoQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19PVVRfRU5DUllQVCkpICYmCi0gICAgICAgICAgICAgIGJ0bV9kZXZfZW5jcnlwdGVkKHBfZGV2X3JlYykpKSkgewotICAgICAgICAgIHJjID0gQlRNX1NVQ0NFU1M7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19JTl9GTEFHUykgPT0gMCkgfHwKLSAgICAgICAgICAgICgoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19JTl9GTEFHUykgPT0KLSAgICAgICAgICAgICAgQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUpICYmCi0gICAgICAgICAgICAgYnRtX2Rldl9hdXRoZW50aWNhdGVkKHBfZGV2X3JlYykpIHx8Ci0gICAgICAgICAgICAoKChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fRkxBR1MpID09Ci0gICAgICAgICAgICAgIChCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfSU5fRU5DUllQVCkpICYmCi0gICAgICAgICAgICAgYnRtX2Rldl9lbmNyeXB0ZWQocF9kZXZfcmVjKSkpIHsKLSAgICAgICAgICAvLyBDaGVjayBmb3IgMTYgZGlnaXRzIChvciBNSVRNKQotICAgICAgICAgIGlmICgoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19JTl9NSU5fMTZfRElHSVRfUElOKSA9PSAwKSB8fAotICAgICAgICAgICAgICAoKChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fTUlOXzE2X0RJR0lUX1BJTikgPT0KLSAgICAgICAgICAgICAgICBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4pICYmCi0gICAgICAgICAgICAgICBidG1fZGV2XzE2X2RpZ2l0X2F1dGhlbnRpY2F0ZWQocF9kZXZfcmVjKSkpIHsKLSAgICAgICAgICAgIHJjID0gQlRNX1NVQ0NFU1M7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgocmMgPT0gQlRNX1NVQ0NFU1MpICYmIChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfTU9ERTRfTEVWRUw0KSAmJgotICAgICAgICAgIChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgIT0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTYpKSB7Ci0gICAgICAgIHJjID0gQlRNX0NNRF9TVEFSVEVEOwotICAgICAgfQotCi0gICAgICBpZiAocmMgPT0gQlRNX1NVQ0NFU1MpIHsKLSAgICAgICAgaWYgKHBfY2FsbGJhY2spCi0gICAgICAgICAgKCpwX2NhbGxiYWNrKSgmYmRfYWRkciwgdHJhbnNwb3J0LCAodm9pZCopcF9yZWZfZGF0YSwgQlRNX1NVQ0NFU1MpOwotICAgICAgICByZXR1cm4gKEJUTV9TVUNDRVNTKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBidG1fY2Iuc2VjX3JlcV9wZW5kaW5nID0gdHJ1ZTsKLSAgICByZXR1cm4gKEJUTV9DTURfU1RBUlRFRCk7Ci0gIH0KLQotICAvKiBTYXZlIHRoZSBzZWN1cml0eSByZXF1aXJlbWVudHMgaW4gY2FzZSBhIHBhaXJpbmcgaXMgbmVlZGVkICovCi0gIHBfZGV2X3JlYy0+cmVxdWlyZWRfc2VjdXJpdHlfZmxhZ3NfZm9yX3BhaXJpbmcgPSBzZWN1cml0eV9yZXF1aXJlZDsKLQotICAvKiBNb2RpZnkgc2VjdXJpdHlfcmVxdWlyZWQgaW4gYnRtX3NlY19sMmNhcF9hY2Nlc3NfcmVxIGZvciBMaXNib24gKi8KLSAgaWYgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TUCB8fAotICAgICAgYnRtX2NiLnNlY3VyaXR5X21vZGUgPT0gQlRNX1NFQ19NT0RFX1NDKSB7Ci0gICAgaWYgKEJUTV9TRUNfSVNfU000KHBfZGV2X3JlYy0+c200KSkgewotICAgICAgaWYgKGlzX29yaWdpbmF0b3IpIHsKLSAgICAgICAgLyogU000IHRvIFNNNCAtPiBhbHdheXMgYXV0aGVudGljYXRlICYgZW5jcnlwdCAqLwotICAgICAgICBzZWN1cml0eV9yZXF1aXJlZCB8PSAoQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19PVVRfRU5DUllQVCk7Ci0gICAgICB9IGVsc2UgLyogYWNjZXB0b3IgKi8KLSAgICAgIHsKLSAgICAgICAgLyogU000IHRvIFNNNDogdGhlIGFjY2VwdG9yIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgYXV0aGVudGljYXRpb24gaXMKLSAgICAgICAgICogYWxyZWFkeSBkb25lICovCi0gICAgICAgIGNoa19hY3BfYXV0aF9kb25lID0gdHJ1ZTsKLSAgICAgICAgLyogU000IHRvIFNNNCAtPiBhbHdheXMgYXV0aGVudGljYXRlICYgZW5jcnlwdCAqLwotICAgICAgICBzZWN1cml0eV9yZXF1aXJlZCB8PSAoQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUgfCBCVE1fU0VDX0lOX0VOQ1JZUFQpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoIShCVE1fU000X0tOT1dOICYgcF9kZXZfcmVjLT5zbTQpKSB7Ci0gICAgICAvKiB0aGUgcmVtb3RlIGZlYXR1cmVzIGFyZSBub3Qga25vd24geWV0ICovCi0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIlJlbW90ZSBmZWF0dXJlcyBoYXZlIG5vdCB5ZXQgYmVlbiByZWNlaXZlZCBzZWNfZmxhZ3M6MHglMDJ4ICVzIiwKLSAgICAgICAgICBwX2Rldl9yZWMtPnNlY19mbGFncywgKGlzX29yaWdpbmF0b3IpID8gImluaXRpYXRvciIgOiAiYWNjZXB0b3IiKTsKLQotICAgICAgcF9kZXZfcmVjLT5zbTQgfD0gQlRNX1NNNF9SRVFfUEVORDsKLSAgICAgIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLSAgICB9Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAiJXMoKSAgc200OjB4JXgsIHNlY19mbGFnczoweCV4LCBzZWN1cml0eV9yZXF1aXJlZDoweCV4IGNoazolZCIsIF9fZnVuY19fLAotICAgICAgcF9kZXZfcmVjLT5zbTQsIHBfZGV2X3JlYy0+c2VjX2ZsYWdzLCBzZWN1cml0eV9yZXF1aXJlZCwKLSAgICAgIGNoa19hY3BfYXV0aF9kb25lKTsKLQotICBwX2Rldl9yZWMtPnNlY3VyaXR5X3JlcXVpcmVkID0gc2VjdXJpdHlfcmVxdWlyZWQ7Ci0gIHBfZGV2X3JlYy0+cF9yZWZfZGF0YSA9IHBfcmVmX2RhdGE7Ci0gIHBfZGV2X3JlYy0+aXNfb3JpZ2luYXRvciA9IGlzX29yaWdpbmF0b3I7Ci0KLSAgaWYgKGNoa19hY3BfYXV0aF9kb25lKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAiKFNNNCB0byBTTTQpIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcSByc3BkLiBhdXRoZW50aWNhdGVkOiB4JXgsIGVuYzogIgotICAgICAgICAieCV4IiwKLSAgICAgICAgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19BVVRIRU5USUNBVEVEKSwKLSAgICAgICAgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19FTkNSWVBURUQpKTsKLSAgICAvKiBTTTQsIGJ1dCB3ZSBkbyBub3Qga25vdyBmb3Igc3VyZSB3aGljaCBsZXZlbCBvZiBzZWN1cml0eSB3ZSBuZWVkLgotICAgICAqIGFzIGxvbmcgYXMgd2UgaGF2ZSBhIGxpbmsga2V5LCBpdCdzIE9LICovCi0gICAgaWYgKCgwID09IChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfQVVUSEVOVElDQVRFRCkpIHx8Ci0gICAgICAgICgwID09IChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfRU5DUllQVEVEKSkpIHsKLSAgICAgIHJjID0gQlRNX0RFTEFZX0NIRUNLOwotICAgICAgLyoKLSAgICAgIDIwNDYgbWF5IHJlcG9ydCBIQ0lfRW5jcnlwdGlvbl9DaGFuZ2UgYW5kIEwyQyBDb25uZWN0aW9uIFJlcXVlc3Qgb3V0IG9mCi0gICAgICBzZXF1ZW5jZQotICAgICAgYmVjYXVzZSBvZiBkYXRhIHBhdGggaXNzdWVzLiBEZWxheSB0aGlzIGRpc2Nvbm5lY3QgYSBsaXR0bGUgYml0Ci0gICAgICAqLwotICAgICAgTE9HX0lORk8oCi0KLSAgICAgICAgICAiJXMgcGVlciBzaG91bGQgaGF2ZSBpbml0aWF0ZWQgc2VjdXJpdHkgcHJvY2VzcyBieSBub3cgKFNNNCB0byBTTTQpIiwKLSAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICBwX2Rldl9yZWMtPnBfY2FsbGJhY2sgPSBwX2NhbGxiYWNrOwotICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0RFTEFZX0ZPUl9FTkM7Ci0gICAgICAoKnBfY2FsbGJhY2spKCZiZF9hZGRyLCB0cmFuc3BvcnQsIHBfcmVmX2RhdGEsIHJjKTsKLQotICAgICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICAgIH0KLSAgfQotCi0gIHBfZGV2X3JlYy0+cF9jYWxsYmFjayA9IHBfY2FsbGJhY2s7Ci0KLSAgaWYgKEJUTV9TRUNfSVNfU000KHBfZGV2X3JlYy0+c200KSkgewotICAgIGlmICgocF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfTU9ERTRfTEVWRUw0KSAmJgotICAgICAgICAocF9kZXZfcmVjLT5saW5rX2tleV90eXBlICE9IEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2KSkgewotICAgICAgLyogQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTYgaXMgdGhlIG9ubHkgYWNjZXB0YWJsZSBrZXkgaW4gdGhpcyBjYXNlCi0gICAgICAgKi8KLSAgICAgIGlmICgocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xJTktfS0VZX0tOT1dOKSAhPSAwKSB7Ci0gICAgICAgIHBfZGV2X3JlYy0+c200IHw9IEJUTV9TTTRfVVBHUkFERTsKLSAgICAgIH0KLSAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzICY9Ci0gICAgICAgICAgfihCVE1fU0VDX0xJTktfS0VZX0tOT1dOIHwgQlRNX1NFQ19MSU5LX0tFWV9BVVRIRUQgfAotICAgICAgICAgICAgQlRNX1NFQ19BVVRIRU5USUNBVEVEKTsKLSAgICAgIEJUTV9UUkFDRV9ERUJVRygiJXM6IHNlY19mbGFnczoweCV4IiwgX19mdW5jX18sIHBfZGV2X3JlYy0+c2VjX2ZsYWdzKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgbGluayBrZXkgdG8gdGhlIGNvbm5lY3RlZCBwZWVyLCBpcyBpdCBzZWN1cmUKLSAgICAgICAqIGVub3VnaD8gKi8KLSAgICAgIGJ0bV9zZWNfY2hlY2tfdXBncmFkZShwX2Rldl9yZWMsIGlzX29yaWdpbmF0b3IpOwotICAgIH0KLSAgfQotCi0gIHJjID0gYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZShwX2Rldl9yZWMpOwotICBpZiAocmMgIT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlczogcF9kZXZfcmVjPSVwLCBjbGVhcmluZyBjYWxsYmFjay4gb2xkIHBfY2FsbGJhY2s9JXAiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kZXZfcmVjLCBwX2Rldl9yZWMtPnBfY2FsbGJhY2spOwotICAgIHBfZGV2X3JlYy0+cF9jYWxsYmFjayA9IE5VTEw7Ci0gICAgKCpwX2NhbGxiYWNrKSgmYmRfYWRkciwgdHJhbnNwb3J0LCBwX2Rldl9yZWMtPnBfcmVmX2RhdGEsIHJjKTsKLSAgfQotCi0gIHJldHVybiAocmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19sMmNhcF9hY2Nlc3NfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgTDJDQVAgdG8gZ3JhbnQgcGVybWlzc2lvbiB0bwotICogICAgICAgICAgICAgICAgICBlc3RhYmxpc2ggTDJDQVAgY29ubmVjdGlvbiB0byBvciBmcm9tIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBwc20gICAgICAgICAgIC0gTDJDQVAgUFNNCi0gKiAgICAgICAgICAgICAgICAgIGlzX29yaWdpbmF0b3IgLSB0cnVlIGlmIHByb3RvY29sIGFib3ZlIEwyQ0FQIG9yaWdpbmF0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayAgICAtIFBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgUEVORElORyBhZnRlciByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlcyBhcmUgY29tcGxldGUuIE1VU1QgTk9UIEJFIE5VTEwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0QlRNX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fc2VjX2wyY2FwX2FjY2Vzc19yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gIC8vIHNob3VsZCBjaGVjayBQU00gcmFuZ2UgaW4gTEUgY29ubmVjdGlvbiBvcmllbnRlZCBMMkNBUCBjb25uZWN0aW9uCi0gIGNvbnN0ZXhwciB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0KLSAgTE9HX0RFQlVHKCJpc19vcmlnaW5hdG9yOiVkLCBwc209MHglMDR4IiwgaXNfb3JpZ2luYXRvciwgcHNtKTsKLQotICAvLyBGaW5kIHRoZSBzZXJ2aWNlIHJlY29yZCBmb3IgdGhlIFBTTQotICB0QlRNX1NFQ19TRVJWX1JFQyogcF9zZXJ2X3JlYyA9IGJ0bV9zZWNfZmluZF9maXJzdF9zZXJ2KGlzX29yaWdpbmF0b3IsIHBzbSk7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgbm8gYXBwbGljYXRpb24gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgUFNNIGRvIG5vdCBhbGxvdyBjb25uZWN0aW9uCi0gIGlmICghcF9zZXJ2X3JlYykgewotICAgIExPR19XQVJOKCJQU006IDB4JTA0eCBubyBhcHBsaWNhdGlvbiByZWdpc3RlcmVkIiwgcHNtKTsKLSAgICAoKnBfY2FsbGJhY2spKCZiZF9hZGRyLCB0cmFuc3BvcnQsIHBfcmVmX2RhdGEsIEJUTV9NT0RFX1VOU1VQUE9SVEVEKTsKLSAgICByZXR1cm4gKEJUTV9NT0RFX1VOU1VQUE9SVEVEKTsKLSAgfQotCi0gIC8qIFNlcnZpY2VzIGxldmVsMCBieSBkZWZhdWx0IGhhdmUgbm8gc2VjdXJpdHkgKi8KLSAgaWYgKHBzbSA9PSBCVF9QU01fU0RQKSB7Ci0gICAgTE9HX0RFQlVHKCJObyBzZWN1cml0eSByZXF1aXJlZCBmb3IgU0RQIik7Ci0gICAgKCpwX2NhbGxiYWNrKSgmYmRfYWRkciwgdHJhbnNwb3J0LCBwX3JlZl9kYXRhLCBCVE1fU1VDQ0VTU19OT19TRUNVUklUWSk7Ci0gICAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci0gIH0KLQotICB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlZDsKLSAgaWYgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgewotICAgIHNlY3VyaXR5X3JlcXVpcmVkID0gYnRtX3NlY19zZXRfc2Vydl9sZXZlbDRfZmxhZ3MoCi0gICAgICAgIHBfc2Vydl9yZWMtPnNlY3VyaXR5X2ZsYWdzLCBpc19vcmlnaW5hdG9yKTsKLSAgfSBlbHNlIHsKLSAgICBzZWN1cml0eV9yZXF1aXJlZCA9IHBfc2Vydl9yZWMtPnNlY3VyaXR5X2ZsYWdzOwotICB9Ci0KLSAgcmV0dXJuIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcV9ieV9yZXF1aXJlbWVudCgKLSAgICAgIGJkX2FkZHIsIHNlY3VyaXR5X3JlcXVpcmVkLCBpc19vcmlnaW5hdG9yLCBwX2NhbGxiYWNrLCBwX3JlZl9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfbXhfYWNjZXNzX3JlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFsbCBNdWx0aXBsZXhpbmcgUHJvdG9jb2xzIGR1cmluZwotICogICAgICAgICAgICAgICAgICBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbiB0byBvciBmcm9tIHBlZXIgZGV2aWNlIHRvIGdyYW50Ci0gKiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gdG8gZXN0YWJsaXNoIGFwcGxpY2F0aW9uIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcHNtICAgICAgICAgICAtIEwyQ0FQIFBTTQotICogICAgICAgICAgICAgICAgICBpc19vcmlnaW5hdG9yIC0gdHJ1ZSBpZiBwcm90b2NvbCBhYm92ZSBMMkNBUCBvcmlnaW5hdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG14X3Byb3RvX2lkICAgLSBwcm90b2NvbCBJRCBvZiB0aGUgbXVsdGlwbGV4ZXIKLSAqICAgICAgICAgICAgICAgICAgbXhfY2hhbl9pZCAgICAtIG11bHRpcGxleGVyIGNoYW5uZWwgdG8gcmVhY2ggYXBwbGljYXRpb24KLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayAgICAtIFBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgUEVORElORyBhZnRlciByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlcyBhcmUgY29tcGxldGVkCi0gKiAgICAgICAgICAgICAgICAgIHBfcmVmX2RhdGEgICAgLSBQb2ludGVyIHRvIGFueSByZWZlcmVuY2UgZGF0YSBuZWVkZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgYnRtX3NlY19teF9hY2Nlc3NfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX29yaWdpbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY3VyaXR5X3JlcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIHRCVE1fU1RBVFVTIHJjOwotICBib29sIHRyYW5zcG9ydCA9IGZhbHNlOyAvKiBzaG91bGQgY2hlY2sgUFNNIHJhbmdlIGluIExFIGNvbm5lY3Rpb24gb3JpZW50ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVAgY29ubmVjdGlvbiAqLwotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OmJ0bV9zZWNfbXhfYWNjZXNzX3JlcXVlc3QoCi0gICAgICAgIGJkX2FkZHIsIGlzX29yaWdpbmF0b3IsIHNlY3VyaXR5X3JlcXVpcmVkLCBwX2NhbGxiYWNrLCBwX3JlZl9kYXRhKTsKLSAgfQotCi0gIC8qIEZpbmQgb3IgZ2V0IG9sZGVzdCByZWNvcmQgKi8KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfb3JfYWxsb2NfZGV2KGJkX2FkZHIpOwotCi0gIC8qIHRoZXJlIGFyZSBzb21lIGRldmljZXMgKG1vdG8gcGhvbmUpIHdoaWNoIGNvbm5lY3RzIHRvIHNldmVyYWwgc2VydmljZXMgYXQKLSAgICogdGhlIHNhbWUgdGltZSAqLwotICAvKiB3ZSB3aWxsIHByb2Nlc3Mgb25lIGFmdGVyIGFub3RoZXIgKi8KLSAgaWYgKChwX2Rldl9yZWMtPnBfY2FsbGJhY2spIHx8Ci0gICAgICAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfSURMRSkpIHsKLSAgICBMT0dfREVCVUcoIlBhaXJpbmcgaW4gcHJvZ3Jlc3MgcGFpcmluZ19zdGF0ZTolcyIsCi0gICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSk7Ci0KLSAgICByYyA9IEJUTV9DTURfU1RBUlRFRDsKLQotICAgIGlmICgoYnRtX2NiLnNlY3VyaXR5X21vZGUgPT0gQlRNX1NFQ19NT0RFX1NFUlZJQ0UpIHx8Ci0gICAgICAgIChCVE1fU000X0tOT1dOID09IHBfZGV2X3JlYy0+c200KSB8fAotICAgICAgICAoQlRNX1NFQ19JU19TTTQocF9kZXZfcmVjLT5zbTQpICYmCi0gICAgICAgICAoIWJ0bV9zZWNfaXNfdXBncmFkZV9wb3NzaWJsZShwX2Rldl9yZWMsIGlzX29yaWdpbmF0b3IpKSkpIHsKLSAgICAgIC8qIGxlZ2FjeSBtb2RlIC0gbG9jYWwgaXMgbGVnYWN5IG9yIGxvY2FsIGlzIGxpc2Jvbi9wZWVyIGlzIGxlZ2FjeQotICAgICAgICogb3IgU000IHdpdGggbm8gcG9zc2liaWxpdHkgb2YgbGluayBrZXkgdXBncmFkZSAqLwotICAgICAgaWYgKGlzX29yaWdpbmF0b3IpIHsKLSAgICAgICAgaWYgKCgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9GTEFHUykgPT0gMCkgfHwKLSAgICAgICAgICAgICgoKChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfT1VUX0ZMQUdTKSA9PQotICAgICAgICAgICAgICAgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFKSAmJgotICAgICAgICAgICAgICBidG1fZGV2X2F1dGhlbnRpY2F0ZWQocF9kZXZfcmVjKSkpIHx8Ci0gICAgICAgICAgICAoKCgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9GTEFHUykgPT0KLSAgICAgICAgICAgICAgIChCVE1fU0VDX09VVF9BVVRIRU5USUNBVEUgfCBCVE1fU0VDX09VVF9FTkNSWVBUKSkgJiYKLSAgICAgICAgICAgICAgYnRtX2Rldl9lbmNyeXB0ZWQocF9kZXZfcmVjKSkpKSB7Ci0gICAgICAgICAgcmMgPSBCVE1fU1VDQ0VTUzsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX0lOX0ZMQUdTKSA9PSAwKSB8fAotICAgICAgICAgICAgKCgoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19JTl9GTEFHUykgPT0KLSAgICAgICAgICAgICAgIEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFKSAmJgotICAgICAgICAgICAgICBidG1fZGV2X2F1dGhlbnRpY2F0ZWQocF9kZXZfcmVjKSkpIHx8Ci0gICAgICAgICAgICAoKCgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX0lOX0ZMQUdTKSA9PQotICAgICAgICAgICAgICAgKEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19JTl9FTkNSWVBUKSkgJiYKLSAgICAgICAgICAgICAgYnRtX2Rldl9lbmNyeXB0ZWQocF9kZXZfcmVjKSkpKSB7Ci0gICAgICAgICAgLy8gQ2hlY2sgZm9yIDE2IGRpZ2l0cyAob3IgTUlUTSkKLSAgICAgICAgICBpZiAoKChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fTUlOXzE2X0RJR0lUX1BJTikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgKCgoc2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4pID09Ci0gICAgICAgICAgICAgICAgQlRNX1NFQ19JTl9NSU5fMTZfRElHSVRfUElOKSAmJgotICAgICAgICAgICAgICAgYnRtX2Rldl8xNl9kaWdpdF9hdXRoZW50aWNhdGVkKHBfZGV2X3JlYykpKSB7Ci0gICAgICAgICAgICByYyA9IEJUTV9TVUNDRVNTOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKChyYyA9PSBCVE1fU1VDQ0VTUykgJiYgKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19NT0RFNF9MRVZFTDQpICYmCi0gICAgICAgICAgKHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSAhPSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikpIHsKLSAgICAgICAgcmMgPSBCVE1fQ01EX1NUQVJURUQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogdGhlIG5ldyBzZWN1cml0eSByZXF1ZXN0ICovCi0gICAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlICE9IEJUTV9TRUNfU1RBVEVfSURMRSkgewotICAgICAgTE9HX0RFQlVHKCJBIHBlbmRpbmcgc2VjdXJpdHkgcHJvY2VkdXJlIGluIHByb2dyZXNzIik7Ci0gICAgICByYyA9IEJUTV9DTURfU1RBUlRFRDsKLSAgICB9Ci0gICAgaWYgKHJjID09IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgYnRtX3NlY19xdWV1ZV9teF9yZXF1ZXN0KGJkX2FkZHIsIEJUX1BTTV9SRkNPTU0sIGlzX29yaWdpbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX1NFQ19QUk9UT19SRkNPTU0sIHNlY3VyaXR5X3JlcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2FsbGJhY2ssIHBfcmVmX2RhdGEpOwotICAgIH0gZWxzZSAvKiByYyA9PSBCVE1fU1VDQ0VTUyAqLwotICAgIHsKLSAgICAgIGlmIChwX2NhbGxiYWNrKSB7Ci0gICAgICAgIExPR19ERUJVRygiTm90aWZ5aW5nIGNsaWVudCB0aGF0IHNlY3VyaXR5IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIik7Ci0gICAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgcmMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmM7Ci0gIH0KLQotICBpZiAoKCFpc19vcmlnaW5hdG9yKSAmJiAoKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19NT0RFNF9MRVZFTDQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYnRtX2NiLnNlY3VyaXR5X21vZGUgPT0gQlRNX1NFQ19NT0RFX1NDKSkpIHsKLSAgICBib29sIGxvY2FsX3N1cHBvcnRzX3NjID0KLSAgICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucygpOwotICAgIC8qIGFjY2VwdG9yIHJlY2VpdmVzIHNlcnZpY2UgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IFJlcXVlc3QgZm9yICovCi0gICAgLyogU2VjdXJlIENvbm5lY3Rpb25zIE9ubHkgc2VydmljZSAqLwotICAgIGlmICghKGxvY2FsX3N1cHBvcnRzX3NjKSB8fCAhKHBfZGV2X3JlYy0+U3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucygpKSkgewotICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICJTZWN1cmUgQ29ubmVjdGlvbiBvbmx5IG1vZGUgdW5zdXBwb3J0ZWQgbG9jYWxfU0Nfc3VwcG9ydDolcyIKLSAgICAgICAgICAiIHJlbW90ZV9TQ19zdXBwb3J0OiVzIiwKLSAgICAgICAgICBsb2dib29sKGxvY2FsX3N1cHBvcnRzX3NjKS5jX3N0cigpLAotICAgICAgICAgIGxvZ2Jvb2wocF9kZXZfcmVjLT5TdXBwb3J0c1NlY3VyZUNvbm5lY3Rpb25zKCkpLmNfc3RyKCkpOwotICAgICAgaWYgKHBfY2FsbGJhY2spCi0gICAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgKHZvaWQqKXBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgQlRNX01PREU0X0xFVkVMNF9OT1RfU1VQUE9SVEVEKTsKLQotICAgICAgcmV0dXJuIChCVE1fTU9ERTRfTEVWRUw0X05PVF9TVVBQT1JURUQpOwotICAgIH0KLSAgfQotCi0gIGlmIChzZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURSkgewotICAgIHNlY3VyaXR5X3JlcXVpcmVkIHw9IEJUTV9TRUNfT1VUX01JVE07Ci0gIH0KLSAgaWYgKHNlY3VyaXR5X3JlcXVpcmVkICYgQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUpIHsKLSAgICBzZWN1cml0eV9yZXF1aXJlZCB8PSBCVE1fU0VDX0lOX01JVE07Ci0gIH0KLQotICBwX2Rldl9yZWMtPnJlcXVpcmVkX3NlY3VyaXR5X2ZsYWdzX2Zvcl9wYWlyaW5nID0gc2VjdXJpdHlfcmVxdWlyZWQ7Ci0gIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgPSBzZWN1cml0eV9yZXF1aXJlZDsKLQotICBpZiAoYnRtX2NiLnNlY3VyaXR5X21vZGUgPT0gQlRNX1NFQ19NT0RFX1NQIHx8Ci0gICAgICBidG1fY2Iuc2VjdXJpdHlfbW9kZSA9PSBCVE1fU0VDX01PREVfU0MpIHsKLSAgICBpZiAoQlRNX1NFQ19JU19TTTQocF9kZXZfcmVjLT5zbTQpKSB7Ci0gICAgICBpZiAoKHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX01PREU0X0xFVkVMNCkgJiYKLSAgICAgICAgICAocF9kZXZfcmVjLT5saW5rX2tleV90eXBlICE9IEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2KSkgewotICAgICAgICAvKiBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NiBpcyB0aGUgb25seSBhY2NlcHRhYmxlIGtleSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICovCi0gICAgICAgIGlmICgocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xJTktfS0VZX0tOT1dOKSAhPSAwKSB7Ci0gICAgICAgICAgcF9kZXZfcmVjLT5zbTQgfD0gQlRNX1NNNF9VUEdSQURFOwotICAgICAgICB9Ci0KLSAgICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0KLSAgICAgICAgICAgIH4oQlRNX1NFQ19MSU5LX0tFWV9LTk9XTiB8IEJUTV9TRUNfTElOS19LRVlfQVVUSEVEIHwKLSAgICAgICAgICAgICAgQlRNX1NFQ19BVVRIRU5USUNBVEVEKTsKLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlczogc2VjX2ZsYWdzOjB4JXgiLCBfX2Z1bmNfXywgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0RFQlVHKCJBbHJlYWR5IGhhdmUgbGluayBrZXk7IGNoZWNraW5nIGlmIGxpbmsga2V5IGlzIHN1ZmZpY2llbnQiKTsKLSAgICAgICAgYnRtX3NlY19jaGVja191cGdyYWRlKHBfZGV2X3JlYywgaXNfb3JpZ2luYXRvcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcF9kZXZfcmVjLT5pc19vcmlnaW5hdG9yID0gaXNfb3JpZ2luYXRvcjsKLSAgcF9kZXZfcmVjLT5wX2NhbGxiYWNrID0gcF9jYWxsYmFjazsKLSAgcF9kZXZfcmVjLT5wX3JlZl9kYXRhID0gcF9yZWZfZGF0YTsKLQotICByYyA9IGJ0bV9zZWNfZXhlY3V0ZV9wcm9jZWR1cmUocF9kZXZfcmVjKTsKLSAgTE9HX0RFQlVHKCJTdGFydGVkIHNlY3VyaXR5IHByb2NlZHVyZSBwZWVyOiVzIGJ0bV9zdGF0dXM6JXMiLAotICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKHBfZGV2X3JlYy0+UmVtb3RlQWRkcmVzcygpKSwKLSAgICAgICAgICAgIGJ0bV9zdGF0dXNfdGV4dChyYykuY19zdHIoKSk7Ci0gIGlmIChyYyAhPSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICBpZiAocF9jYWxsYmFjaykgewotICAgICAgcF9kZXZfcmVjLT5wX2NhbGxiYWNrID0gTlVMTDsKLSAgICAgICgqcF9jYWxsYmFjaykoJmJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgcmMpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfY29ubl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlbiB0aGUgcGVlciBkZXZpY2UgaXMgcmVxdWVzdGluZwotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19jb25uX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGRjKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZGEpOwotCi0gIC8qIFNvbWUgZGV2aWNlIG1heSByZXF1ZXN0IGEgY29ubmVjdGlvbiBiZWZvcmUgd2UgYXJlIGRvbmUgd2l0aCB0aGUgSENJX1Jlc2V0Ci0gICAqIHNlcXVlbmNlICovCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9pc19yZWFkeSgpKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKCJTZWN1cml0eSBNYW5hZ2VyOiBjb25uZWN0IHJlcXVlc3Qgd2hlbiBkZXZpY2Ugbm90IHJlYWR5Iik7Ci0gICAgYnRzbmRfaGNpY19yZWplY3RfY29ubihiZGEsIEhDSV9FUlJfSE9TVF9SRUpFQ1RfREVWSUNFKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpICYmCi0gICAgICAoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSAmJgotICAgICAgKGJ0bV9jYi5wYWlyaW5nX2JkYSA9PSBiZGEpKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKAotICAgICAgICAiU2VjdXJpdHkgTWFuYWdlcjogcmVqZWN0IGNvbm5lY3QgcmVxdWVzdCBmcm9tIGJvbmRpbmcgZGV2aWNlIik7Ci0KLSAgICAvKiBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gYm9uZGluZyBkZXZpY2UgaXMgcmVqZWN0ZWQgKi8KLSAgICBidG1fY2IucGFpcmluZ19mbGFncyB8PSBCVE1fUEFJUl9GTEFHU19SRUpFQ1RFRF9DT05ORUNUOwotICAgIGJ0c25kX2hjaWNfcmVqZWN0X2Nvbm4oYmRhLCBIQ0lfRVJSX0hPU1RfUkVKRUNUX0RFVklDRSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSG9zdCBpcyBub3QgaW50ZXJlc3RlZCBvciBhcHByb3ZlZCBjb25uZWN0aW9uLiAgU2F2ZSBCREEgYW5kIERDIGFuZCAqLwotICAvKiBwYXNzIHJlcXVlc3QgdG8gTDJDQVAgKi8KLSAgYnRtX2NiLmNvbm5lY3RpbmdfYmRhID0gYmRhOwotICBtZW1jcHkoYnRtX2NiLmNvbm5lY3RpbmdfZGMsIGRjLCBERVZfQ0xBU1NfTEVOKTsKLQotICBpZiAoIXBfZGV2X3JlYykgewotICAgIC8qIGFjY2VwdCB0aGUgY29ubmVjdGlvbiAtPiBhbGxvY2F0ZSBhIGRldmljZSByZWNvcmQgKi8KLSAgICBwX2Rldl9yZWMgPSBidG1fc2VjX2FsbG9jX2RldihiZGEpOwotICB9Ci0gIHBfZGV2X3JlYy0+c200IHw9IEJUTV9TTTRfQ09OTl9QRU5EOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19ib25kX2NhbmNlbF9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVwb3J0IGJvbmQgY2FuY2VsIGNvbXBsZXRlCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fc2VjX2JvbmRfY2FuY2VsX2NvbXBsZXRlKHZvaWQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjOwotCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19ESVNDX1dIRU5fRE9ORSkgfHwKLSAgICAgIChCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX1BJTiA9PSBidG1fY2IucGFpcmluZ19zdGF0ZSAmJgotICAgICAgIEJUTV9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQgJiBidG1fY2IucGFpcmluZ19mbGFncykgfHwKLSAgICAgIChidG1fY2IucGFpcmluZ19zdGF0ZSA9PSBCVE1fUEFJUl9TVEFURV9HRVRfUkVNX05BTUUgJiYKLSAgICAgICBCVE1fUEFJUl9GTEFHU19XRV9DQU5DRUxfREQgJiBidG1fY2IucGFpcmluZ19mbGFncykpIHsKLSAgICAvKiBmb3IgZGVkaWNhdGVkIGJvbmRpbmcgaW4gbGVnYWN5IG1vZGUsIGF1dGhlbnRpY2F0aW9uIGhhcHBlbnMgYXQgImxpbmsKLSAgICAgKiBsZXZlbCIKLSAgICAgKiBidG1fc2VjX2Nvbm5lY3RlZCBpcyBjYWxsZWQgd2l0aCBmYWlsZWQgc3RhdHVzLgotICAgICAqIEluIHRoZW9yeSwgdGhlIGNvZGUgdGhhdCBoYW5kbGVzIGlzX3BhaXJpbmdfZGV2aWNlL3RydWUgc2hvdWxkIGNsZWFuIG91dAotICAgICAqIHNlY3VyaXR5IHJlbGF0ZWQgY29kZS4KLSAgICAgKiBIb3dldmVyLCB0aGlzIGZ1bmN0aW9uIG1heSBjbGVhbiBvdXQgdGhlIHNlY3VyaXR5IHJlbGF0ZWQgZmxhZ3MgYW5kCi0gICAgICogYnRtX3NlY19jb25uZWN0ZWQgd291bGQgbm90IGtub3cKLSAgICAgKiB0aGlzIGZ1bmN0aW9uIGFsc28gbmVlZHMgdG8gZG8gcHJvcGVyIGNsZWFuIHVwLgotICAgICAqLwotICAgIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihidG1fY2IucGFpcmluZ19iZGEpOwotICAgIGlmIChwX2Rldl9yZWMgIT0gTlVMTCkgcF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCA9IEJUTV9TRUNfTk9ORTsKLSAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotCi0gICAgLyogTm90aWZ5IGFwcGxpY2F0aW9uIHRoYXQgdGhlIGNhbmNlbCBzdWNjZWVkZWQgKi8KLSAgICBpZiAoYnRtX2NiLmFwaS5wX2JvbmRfY2FuY2VsX2NtcGxfY2FsbGJhY2spCi0gICAgICBidG1fY2IuYXBpLnBfYm9uZF9jYW5jZWxfY21wbF9jYWxsYmFjayhCVE1fU1VDQ0VTUyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9jcmVhdGVfY29ubl9jYW5jZWxfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSBjcmVhdGUgY29ubmVjdGlvbiBjYW5jZWwKLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIFNUUkVBTV9UT19CREFERFIoYmRfYWRkciwgcCk7Ci0gIEJUTV9UUkFDRV9FVkVOVCgiYnRtX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZSgpOiBpbiBTdGF0ZTogJXMgIHN0YXR1czolZCIsCi0gICAgICAgICAgICAgICAgICBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSksIHN0YXR1cyk7Ci0gIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQoCi0gICAgICAmYmRfYWRkciwgYmx1ZXRvb3RoOjpjb21tb246OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSwKLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HLCBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0wsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6Q01EX0NSRUFURV9DT05ORUNUSU9OX0NBTkNFTCwKLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpFVlRfQ09NTUFORF9DT01QTEVURSwKLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpCTEVfRVZUX1VOS05PV04sIHN0YXR1cywKLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTik7Ci0KLSAgLyogaWYgdGhlIGNyZWF0ZSBjb25uIGNhbmNlbCBjbWQgd2FzIGlzc3VlZCBieSB0aGUgYm9uZCBjYW5jZWwsCi0gICoqIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBiZSBub3RpZmllZCB0aGF0IGJvbmQgY2FuY2VsIHN1Y2NlZWRlZAotICAqLwotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2UgSENJX1NVQ0NFU1M6Ci0gICAgICBidG1fc2VjX2JvbmRfY2FuY2VsX2NvbXBsZXRlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9FUlJfQ09OTkVDVElPTl9FWElTVFM6Ci0gICAgY2FzZSBIQ0lfRVJSX05PX0NPTk5FQ1RJT046Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIE5vdGlmeSBhcHBsaWNhdGlvbiBvZiB0aGUgZXJyb3IgKi8KLSAgICAgIGlmIChidG1fY2IuYXBpLnBfYm9uZF9jYW5jZWxfY21wbF9jYWxsYmFjaykKLSAgICAgICAgYnRtX2NiLmFwaS5wX2JvbmRfY2FuY2VsX2NtcGxfY2FsbGJhY2soQlRNX0VSUl9QUk9DRVNTSU5HKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2NoZWNrX3BlbmRpbmdfcmVxcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdXJpdHkgcHJvY2VkdXJlCi0gKiAgICAgICAgICAgICAgICAgIHRvIGxldCBMMkNBUCBhbmQgUkZDT01NIGtub3cgdG8gcmUtc3VibWl0IGFueSBwZW5kaW5nCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3RzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19jaGVja19wZW5kaW5nX3JlcXModm9pZCkgewotICBpZiAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgPT0gQlRNX1BBSVJfU1RBVEVfSURMRSkgewotICAgIC8qIEZpcnN0LCByZXN1Ym1pdCBMMkNBUCByZXF1ZXN0cyAqLwotICAgIGlmIChidG1fY2Iuc2VjX3JlcV9wZW5kaW5nKSB7Ci0gICAgICBidG1fY2Iuc2VjX3JlcV9wZW5kaW5nID0gZmFsc2U7Ci0gICAgICBsMmN1X3Jlc3VibWl0X3BlbmRpbmdfc2VjX3JlcShudWxscHRyKTsKLSAgICB9Ci0KLSAgICAvKiBOb3csIHJlLXN1Ym1pdCBhbnl0aGluZyBpbiB0aGUgbXV4IHF1ZXVlICovCi0gICAgZml4ZWRfcXVldWVfdCogYnEgPSBidG1fY2Iuc2VjX3BlbmRpbmdfcTsKLQotICAgIGJ0bV9jYi5zZWNfcGVuZGluZ19xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLQotICAgIHRCVE1fU0VDX1FVRVVFX0VOVFJZKiBwX2U7Ci0gICAgd2hpbGUgKChwX2UgPSAodEJUTV9TRUNfUVVFVUVfRU5UUlkqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKGJxKSkgIT0gTlVMTCkgewotICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgQUNMIGlzIHN0aWxsIHVwIGJlZm9yZSBzdGFydGluZyBzZWN1cml0eSBwcm9jZWR1cmVzICovCi0gICAgICBpZiAoQlRNX0lzQWNsQ29ubmVjdGlvblVwKHBfZS0+YmRfYWRkciwgcF9lLT50cmFuc3BvcnQpKSB7Ci0gICAgICAgIGlmIChwX2UtPnBzbSAhPSAwKSB7Ci0gICAgICAgICAgQlRNX1RSQUNFX0VWRU5UKCIlcyBQU006MHglMDR4IElzX09yaWc6JXUiLCBfX2Z1bmNfXywgcF9lLT5wc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBfZS0+aXNfb3JpZyk7Ci0KLSAgICAgICAgICBidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0KHBfZS0+YmRfYWRkciwgcF9lLT5pc19vcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9lLT5yZmNvbW1fc2VjdXJpdHlfcmVxdWlyZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2UtPnBfY2FsbGJhY2ssIHBfZS0+cF9yZWZfZGF0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQlRNX1NldEVuY3J5cHRpb24ocF9lLT5iZF9hZGRyLCBwX2UtPnRyYW5zcG9ydCwgcF9lLT5wX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZS0+cF9yZWZfZGF0YSwgcF9lLT5zZWNfYWN0KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBvc2lfZnJlZShwX2UpOwotICAgIH0KLSAgICBmaXhlZF9xdWV1ZV9mcmVlKGJxLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19kZXZfcmVzZXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkZXZpY2UgcmVzZXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2Rldl9yZXNldCh2b2lkKSB7Ci0gIGlmIChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfc2ltcGxlX3BhaXJpbmcoKSkgewotICAgIC8qIHNldCB0aGUgZGVmYXVsdCBJTyBjYXBhYmlsaXRpZXMgKi8KLSAgICBidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHMgPSBidGlmX3N0b3JhZ2VfZ2V0X2xvY2FsX2lvX2NhcHMoKTsKLSAgICAvKiBhZGQgbXggc2VydmljZSB0byB1c2Ugbm8gc2VjdXJpdHkgKi8KLSAgICBCVE1fU2V0U2VjdXJpdHlMZXZlbChmYWxzZSwgIlJGQ19NVVgiLCBCVE1fU0VDX1NFUlZJQ0VfUkZDX01VWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fU0VDX05PTkUsIEJUX1BTTV9SRkNPTU0sIEJUTV9TRUNfUFJPVE9fUkZDT01NLCAwKTsKLSAgICBCVE1fU2V0U2VjdXJpdHlMZXZlbCh0cnVlLCAiUkZDX01VWCIsIEJUTV9TRUNfU0VSVklDRV9SRkNfTVVYLCBCVE1fU0VDX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRfUFNNX1JGQ09NTSwgQlRNX1NFQ19QUk9UT19SRkNPTU0sIDApOwotICB9IGVsc2UgewotICAgIGJ0bV9jYi5zZWN1cml0eV9tb2RlID0gQlRNX1NFQ19NT0RFX1NFUlZJQ0U7Ci0gIH0KLQotICBCVE1fVFJBQ0VfREVCVUcoImJ0bV9zZWNfZGV2X3Jlc2V0IHNlYyBtb2RlOiAlZCIsIGJ0bV9jYi5zZWN1cml0eV9tb2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfYWJvcnRfYWNjZXNzX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEwyQ0FQIG9yIFJGQ09NTSB0byBhYm9ydAotICogICAgICAgICAgICAgICAgICB0aGUgcGVuZGluZyBvcGVyYXRpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2Fib3J0X2FjY2Vzc19yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0KLSAgaWYgKCFwX2Rldl9yZWMpIHJldHVybjsKLQotICBpZiAoKHBfZGV2X3JlYy0+c2VjX3N0YXRlICE9IEJUTV9TRUNfU1RBVEVfQVVUSE9SSVpJTkcpICYmCi0gICAgICAocF9kZXZfcmVjLT5zZWNfc3RhdGUgIT0gQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORykpCi0gICAgcmV0dXJuOwotCi0gIHBfZGV2X3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9JRExFOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXM6IGNsZWFyaW5nIGNhbGxiYWNrLiBwX2Rldl9yZWM9JXAsIHBfY2FsbGJhY2s9JXAiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfZGV2X3JlYywgcF9kZXZfcmVjLT5wX2NhbGxiYWNrKTsKLSAgcF9kZXZfcmVjLT5wX2NhbGxiYWNrID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfZGRfY3JlYXRlX2Nvbm4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgQUNMIGNvbm5lY3Rpb24gZm9yCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBkZWRpY2F0ZWQgYm9kaW5nIHByb2Nlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRCVE1fU1RBVFVTIGJ0bV9zZWNfZGRfY3JlYXRlX2Nvbm4odEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIHRCVE1fU1RBVFVTIHN0YXR1cyA9IGwyY3VfQ29ubmVjdEFjbEZvclNlY3VyaXR5KHBfZGV2X3JlYy0+YmRfYWRkcik7Ci0gIGlmIChzdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX1BJTl9SRVEpOwotICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gIH0gZWxzZSBpZiAoc3RhdHVzID09IEJUTV9OT19SRVNPVVJDRVMpIHsKLSAgICByZXR1cm4gQlRNX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIC8qIHNldCB1cCB0aGUgY29udHJvbCBibG9jayB0byBpbmRpY2F0ZWQgZGVkaWNhdGVkIGJvbmRpbmcgKi8KLSAgYnRtX2NiLnBhaXJpbmdfZmxhZ3MgfD0gQlRNX1BBSVJfRkxBR1NfRElTQ19XSEVOX0RPTkU7Ci0KLSAgVkxPRygxKSA8PCAiU2VjdXJpdHkgTWFuYWdlcjogIiA8PCBwX2Rldl9yZWMtPmJkX2FkZHI7Ci0KLSAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX1BJTl9SRVEpOwotCi0gIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLX0KLQotYm9vbCBpc19zdGF0ZV9nZXR0aW5nX25hbWUodm9pZCogZGF0YSwgdm9pZCogY29udGV4dCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4oZGF0YSk7Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfR0VUVElOR19OQU1FKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19ybXRfbmFtZV9yZXF1ZXN0X2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJlbW90ZSBuYW1lIHdhcyBvYnRhaW5lZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBwZWVyIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfcm10X25hbWVfcmVxdWVzdF9jb21wbGV0ZShjb25zdCBSYXdBZGRyZXNzKiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2JkX25hbWUsIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIGludCBpOwotICBERVZfQ0xBU1MgZGV2X2NsYXNzOwotICB1aW50OF90IG9sZF9zZWNfc3RhdGU7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCJidG1fc2VjX3JtdF9uYW1lX3JlcXVlc3RfY29tcGxldGUiKTsKLSAgaWYgKCghcF9iZF9hZGRyICYmCi0gICAgICAgIUJUTV9Jc0FjbENvbm5lY3Rpb25VcChidG1fY2IuY29ubmVjdGluZ19iZGEsIEJUX1RSQU5TUE9SVF9CUl9FRFIpKSB8fAotICAgICAgKHBfYmRfYWRkciAmJiAhQlRNX0lzQWNsQ29ubmVjdGlvblVwKCpwX2JkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpKSkgewotICAgIGJ0bV9hY2xfcmVzdWJtaXRfcGFnZSgpOwotICB9Ci0KLSAgLyogSWYgcmVtb3RlIG5hbWUgcmVxdWVzdCBmYWlsZWQsIHBfYmRfYWRkciBpcyBudWxsIGFuZCB3ZSBuZWVkIHRvIHNlYXJjaCAqLwotICAvKiBiYXNlZCBvbiBzdGF0ZSBhc3N1bWluZyB0aGF0IHdlIGFyZSBkb2luZyAxIGF0IGEgdGltZSAqLwotICBpZiAocF9iZF9hZGRyKQotICAgIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldigqcF9iZF9hZGRyKTsKLSAgZWxzZSB7Ci0gICAgbGlzdF9ub2RlX3QqIG5vZGUgPQotICAgICAgICBsaXN0X2ZvcmVhY2goYnRtX2NiLnNlY19kZXZfcmVjLCBpc19zdGF0ZV9nZXR0aW5nX25hbWUsIE5VTEwpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgIHBfZGV2X3JlYyA9IHN0YXRpY19jYXN0PHRCVE1fU0VDX0RFVl9SRUMqPihsaXN0X25vZGUobm9kZSkpOwotICAgICAgcF9iZF9hZGRyID0gJnBfZGV2X3JlYy0+YmRfYWRkcjsKLSAgICB9IGVsc2UgewotICAgICAgcF9kZXZfcmVjID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotICAvKiBDb21tZW50aW5nIG91dCB0cmFjZSBkdWUgdG8gb2JmL2NvbXBpbGF0aW9uIHByb2JsZW1zLgotICAgKi8KLSAgaWYgKCFwX2JkX25hbWUpIHBfYmRfbmFtZSA9ICh1aW50OF90KikiIjsKLQotICBpZiAocF9kZXZfcmVjKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKAotICAgICAgICAiJXMgUGFpclN0YXRlOiAlcyAgUmVtTmFtZTogJXMgIHN0YXR1czogJWQgU3RhdGU6JWQgIHBfZGV2X3JlYzogIgotICAgICAgICAiMHglMDh4ICIsCi0gICAgICAgIF9fZnVuY19fLCBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSksIHBfYmRfbmFtZSwgc3RhdHVzLAotICAgICAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSwgcF9kZXZfcmVjKTsKLSAgfSBlbHNlIHsKLSAgICBCVE1fVFJBQ0VfRVZFTlQoIiVzIFBhaXJTdGF0ZTogJXMgIFJlbU5hbWU6ICVzICBzdGF0dXM6ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSwgcF9iZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICB9Ci0KLSAgaWYgKHBfZGV2X3JlYykgewotICAgIG9sZF9zZWNfc3RhdGUgPSBwX2Rldl9yZWMtPnNlY19zdGF0ZTsKLSAgICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgICBzdHJsY3B5KChjaGFyKilwX2Rldl9yZWMtPnNlY19iZF9uYW1lLCAoY2hhciopcF9iZF9uYW1lLAotICAgICAgICAgICAgICBCVE1fTUFYX1JFTV9CRF9OQU1FX0xFTiArIDEpOwotICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0gQlRNX1NFQ19OQU1FX0tOT1dOOwotICAgICAgQlRNX1RSQUNFX0VWRU5UKCJzZXR0aW5nIEJUTV9TRUNfTkFNRV9LTk9XTiBzZWNfZmxhZ3M6MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBOb3RpZnkgYWxsIGNsaWVudHMgd2FpdGluZyBmb3IgbmFtZSB0byBiZSByZXNvbHZlZCBldmVuIGlmIGl0IGZhaWxlZCBzbwotICAgICAgICogY2xpZW50cyBjYW4gY29udGludWUgKi8KLSAgICAgIHBfZGV2X3JlYy0+c2VjX2JkX25hbWVbMF0gPSAwOwotICAgIH0KLQotICAgIGlmIChwX2Rldl9yZWMtPnNlY19zdGF0ZSA9PSBCVE1fU0VDX1NUQVRFX0dFVFRJTkdfTkFNRSkKLSAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID0gQlRNX1NFQ19TVEFURV9JRExFOwotCi0gICAgLyogTm90aWZ5IGFsbCBjbGllbnRzIHdhaXRpbmcgZm9yIG5hbWUgdG8gYmUgcmVzb2x2ZWQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQlRNX1NFQ19NQVhfUk1UX05BTUVfQ0FMTEJBQ0tTOyBpKyspIHsKLSAgICAgIGlmIChidG1fY2IucF9ybXRfbmFtZV9jYWxsYmFja1tpXSAmJiBwX2JkX2FkZHIpCi0gICAgICAgICgqYnRtX2NiLnBfcm10X25hbWVfY2FsbGJhY2tbaV0pKCpwX2JkX2FkZHIsIHBfZGV2X3JlYy0+ZGV2X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNlY19iZF9uYW1lKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZGV2X2NsYXNzWzBdID0gMDsKLSAgICBkZXZfY2xhc3NbMV0gPSAwOwotICAgIGRldl9jbGFzc1syXSA9IDA7Ci0KLSAgICAvKiBOb3RpZnkgYWxsIGNsaWVudHMgd2FpdGluZyBmb3IgbmFtZSB0byBiZSByZXNvbHZlZCBldmVuIGlmIG5vdCBmb3VuZCBzbwotICAgICAqIGNsaWVudHMgY2FuIGNvbnRpbnVlICovCi0gICAgZm9yIChpID0gMDsgaSA8IEJUTV9TRUNfTUFYX1JNVF9OQU1FX0NBTExCQUNLUzsgaSsrKSB7Ci0gICAgICBpZiAoYnRtX2NiLnBfcm10X25hbWVfY2FsbGJhY2tbaV0gJiYgcF9iZF9hZGRyKQotICAgICAgICAoKmJ0bV9jYi5wX3JtdF9uYW1lX2NhbGxiYWNrW2ldKSgqcF9iZF9hZGRyLCBkZXZfY2xhc3MsICh1aW50OF90KikiIik7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSWYgd2Ugd2VyZSBkZWxheWluZyBhc2tpbmcgVUkgZm9yIGEgUElOIGJlY2F1c2UgbmFtZSB3YXMgbm90IHJlc29sdmVkLCBhc2sKLSAgICogbm93ICovCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfc3RhdGUgPT0gQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9QSU4pICYmIHBfYmRfYWRkciAmJgotICAgICAgKGJ0bV9jYi5wYWlyaW5nX2JkYSA9PSAqcF9iZF9hZGRyKSkgewotICAgIEJUTV9UUkFDRV9FVkVOVCgKLSAgICAgICAgIiVzKCkgZGVsYXllZCBwaW4gbm93IGJlaW5nIHJlcXVlc3RlZCBmbGFnczoweCV4LCAiCi0gICAgICAgICIocF9waW5fY2FsbGJhY2s9MHglcCkiLAotICAgICAgICBfX2Z1bmNfXywgYnRtX2NiLnBhaXJpbmdfZmxhZ3MsIGJ0bV9jYi5hcGkucF9waW5fY2FsbGJhY2spOwotCi0gICAgaWYgKChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1BJTl9SRVFEKSA9PSAwICYmCi0gICAgICAgIGJ0bV9jYi5hcGkucF9waW5fY2FsbGJhY2spIHsKLSAgICAgIEJUTV9UUkFDRV9FVkVOVCgiJXMoKSBjYWxsaW5nIHBpbl9jYWxsYmFjayIsIF9fZnVuY19fKTsKLSAgICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzIHw9IEJUTV9QQUlSX0ZMQUdTX1BJTl9SRVFEOwotICAgICAgKCpidG1fY2IuYXBpLnBfcGluX2NhbGxiYWNrKSgKLSAgICAgICAgICBwX2Rldl9yZWMtPmJkX2FkZHIsIHBfZGV2X3JlYy0+ZGV2X2NsYXNzLCBwX2JkX25hbWUsCi0gICAgICAgICAgKHBfZGV2X3JlYy0+cmVxdWlyZWRfc2VjdXJpdHlfZmxhZ3NfZm9yX3BhaXJpbmcgJgotICAgICAgICAgICBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4pKTsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHNhbWUgc3RhdGUgYWdhaW4gdG8gZm9yY2UgdGhlIHRpbWVyIHRvIGJlIHJlc3RhcnRlZCAqLwotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9QSU4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIENoZWNrIGlmIHdlIHdlcmUgZGVsYXlpbmcgYm9uZGluZyBiZWNhdXNlIG5hbWUgd2FzIG5vdCByZXNvbHZlZCAqLwotICBpZiAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgPT0gQlRNX1BBSVJfU1RBVEVfR0VUX1JFTV9OQU1FKSB7Ci0gICAgaWYgKHBfYmRfYWRkciAmJiBidG1fY2IucGFpcmluZ19iZGEgPT0gKnBfYmRfYWRkcikgewotICAgICAgQlRNX1RSQUNFX0VWRU5UKCIlcygpIGNvbnRpbnVlIGJvbmRpbmcgc200OiAweCUwNHgsIHN0YXR1czoweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kZXZfcmVjLT5zbTQsIHN0YXR1cyk7Ci0gICAgICBpZiAoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9DQU5DRUxfREQpIHsKLSAgICAgICAgYnRtX3NlY19ib25kX2NhbmNlbF9jb21wbGV0ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLQotICAgICAgICByZXR1cm4gTm90aWZ5Qm9uZGluZ0NoYW5nZSgqcF9kZXZfcmVjLCBzdGF0dXMpOwotICAgICAgfQotCi0gICAgICAvKiBpZiBwZWVyIGlzIHZlcnkgb2xkIGxlZ2FjeSBkZXZpY2VzLCBIQ0lfUk1UX0hPU1RfU1VQX0ZFQVRfTk9USUZZX0VWVCBpcwotICAgICAgICogbm90IHJlcG9ydGVkICovCi0gICAgICBpZiAoQlRNX1NFQ19JU19TTTRfVU5LTk9XTihwX2Rldl9yZWMtPnNtNCkpIHsKLSAgICAgICAgLyogc2V0IHRoZSBLTk9XTiBmbGFnIG9ubHkgaWYgQlRNX1BBSVJfRkxBR1NfUkVKRUNURURfQ09OTkVDVCBpcyBub3QKLSAgICAgICAgICogc2V0LiovCi0gICAgICAgIC8qIElmIGl0IGlzIHNldCwgdGhlcmUgbWF5IGJlIGEgcmFjZSBjb25kaXRpb24gKi8KLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlcyBJU19TTTRfVU5LTk9XTiBGbGFnczoweCUwNHgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzKTsKLSAgICAgICAgaWYgKChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1JFSkVDVEVEX0NPTk5FQ1QpID09IDApCi0gICAgICAgICAgcF9kZXZfcmVjLT5zbTQgfD0gQlRNX1NNNF9LTk9XTjsKLSAgICAgIH0KLQotICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlcywgU000IFZhbHVlOiAleCwgTGVnYWN5OiVkLElTIFNNNDolZCwgVW5rbm93bjolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfZGV2X3JlYy0+c200LAotICAgICAgICAgICAgICAgICAgICAgIEJUTV9TRUNfSVNfU000X0xFR0FDWShwX2Rldl9yZWMtPnNtNCksCi0gICAgICAgICAgICAgICAgICAgICAgQlRNX1NFQ19JU19TTTQocF9kZXZfcmVjLT5zbTQpLAotICAgICAgICAgICAgICAgICAgICAgIEJUTV9TRUNfSVNfU000X1VOS05PV04ocF9kZXZfcmVjLT5zbTQpKTsKLQotICAgICAgLyogQlQgMi4xIG9yIGNhcmtpdCwgYnJpbmcgdXAgdGhlIGNvbm5lY3Rpb24gdG8gZm9yY2UgdGhlIHBlZXIgdG8gcmVxdWVzdAotICAgICAgICpQSU4uCi0gICAgICAgKiogRWxzZSBwcmVmZXRjaCAoYnRtX3NlY19jaGVja19wcmVmZXRjaF9waW4gd2lsbCBkbyB0aGUgcHJlZmV0Y2hpbmcgaWYKLSAgICAgICAqbmVlZGVkKQotICAgICAgICovCi0gICAgICBpZiAoKHBfZGV2X3JlYy0+c200ICE9IEJUTV9TTTRfS05PV04pIHx8Ci0gICAgICAgICAgIWJ0bV9zZWNfY2hlY2tfcHJlZmV0Y2hfcGluKHBfZGV2X3JlYykpIHsKLSAgICAgICAgLyogaWYgd2UgcmVqZWN0ZWQgaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0LCB3ZSBoYXZlIHRvIHdhaXQKLSAgICAgICAgICogSENJX0Nvbm5lY3Rpb25fQ29tcGxldGUgZXZlbnQgKi8KLSAgICAgICAgLyogIGJlZm9yZSBvcmlnaW5hdGluZyAgKi8KLSAgICAgICAgaWYgKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfUkVKRUNURURfQ09OTkVDVCkgewotICAgICAgICAgIEJUTV9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiJXM6IHdhaXRpbmcgSENJX0Nvbm5lY3Rpb25fQ29tcGxldGUgYWZ0ZXIgcmVqZWN0aW5nIGNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQm90aCB3ZSBhbmQgdGhlIHBlZXIgYXJlIDIuMSAtIGNvbnRpbnVlIHRvIGNyZWF0ZSBjb25uZWN0aW9uICovCi0gICAgICAgIGVsc2UgaWYgKGJ0bV9zZWNfZGRfY3JlYXRlX2Nvbm4ocF9kZXZfcmVjKSAhPSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgICAgICBCVE1fVFJBQ0VfV0FSTklORygiJXM6IGZhaWxlZCB0byBzdGFydCBjb25uZWN0aW9uIiwgX19mdW5jX18pOwotCi0gICAgICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLQotICAgICAgICAgIE5vdGlmeUJvbmRpbmdDaGFuZ2UoKnBfZGV2X3JlYywgSENJX0VSUl9NRU1PUllfRlVMTCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgQlRNX1RSQUNFX1dBUk5JTkcoIiVzOiB3cm9uZyBCREEsIHJldHJ5IHdpdGggcGFpcmluZyBCREEiLCBfX2Z1bmNfXyk7Ci0gICAgICBpZiAoQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lKGJ0bV9jYi5wYWlyaW5nX2JkYSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0JSX0VEUikgIT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICAgIEJUTV9UUkFDRV9FUlJPUigiJXM6IGZhaWxlZCB0byBzdGFydCByZW1vdGUgbmFtZSByZXF1ZXN0IiwgX19mdW5jX18pOwotICAgICAgICBOb3RpZnlCb25kaW5nQ2hhbmdlKCpwX2Rldl9yZWMsIEhDSV9FUlJfTUVNT1JZX0ZVTEwpOwotICAgICAgfTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvKiBjaGVjayBpZiB3ZSB3ZXJlIGRlbGF5aW5nIGxpbmtfa2V5X2NhbGxiYWNrIGJlY2F1c2UgbmFtZSB3YXMgbm90IHJlc29sdmVkCi0gICAqLwotICBpZiAocF9kZXZfcmVjLT5saW5rX2tleV9ub3Rfc2VudCkgewotICAgIC8qIElmIEhDSSBjb25uZWN0aW9uIGNvbXBsZXRlIGhhcyBub3QgYXJyaXZlZCwgd2FpdCBmb3IgaXQgKi8KLSAgICBpZiAocF9kZXZfcmVjLT5oY2lfaGFuZGxlID09IEhDSV9JTlZBTElEX0hBTkRMRSkgcmV0dXJuOwotCi0gICAgcF9kZXZfcmVjLT5saW5rX2tleV9ub3Rfc2VudCA9IGZhbHNlOwotICAgIGJ0bV9zZW5kX2xpbmtfa2V5X25vdGlmKHBfZGV2X3JlYyk7Ci0gIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgYm9uZGluZyBwcm9jZWR1cmUgY2FuIGRpc2Nvbm5lY3QgdGhlIGxpbmsgbm93ICovCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSAmJgotICAgICAgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19BVVRIRU5USUNBVEVEKSkgewotICAgIEJUTV9UUkFDRV9XQVJOSU5HKCJidG1fc2VjX3JtdF9uYW1lX3JlcXVlc3RfY29tcGxldGUgKG5vbmUvY2UpIik7Ci0gICAgcF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmPSB+KEJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURSk7Ci0gICAgbDJjdV9zdGFydF9wb3N0X2JvbmRfdGltZXIocF9kZXZfcmVjLT5oY2lfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAob2xkX3NlY19zdGF0ZSAhPSBCVE1fU0VDX1NUQVRFX0dFVFRJTkdfTkFNRSkgcmV0dXJuOwotCi0gIC8qIElmIGdldCBuYW1lIGZhaWxlZCwgbm90aWZ5IHRoZSB3YWl0aW5nIGxheWVyICovCi0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBCVE1fRVJSX1BST0NFU1NJTkcsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9kZXZfcmVjLT5zbTQgJiBCVE1fU000X1JFUV9QRU5EKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKCJ3YWl0aW5nIGZvciByZW1vdGUgZmVhdHVyZXMhISIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlbW90ZSBOYW1lIHN1Y2NlZWRlZCwgZXhlY3V0ZSB0aGUgbmV4dCBzZWN1cml0eSBwcm9jZWR1cmUsIGlmIGFueSAqLwotICB0QlRNX1NUQVRVUyBidG1fc3RhdHVzID0gYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZShwX2Rldl9yZWMpOwotCi0gIC8qIElmIHJlc3VsdCBpcyBwZW5kaW5nIHJlcGx5IGZyb20gdGhlIHVzZXIgb3IgZnJvbSB0aGUgZGV2aWNlIGlzIHBlbmRpbmcgKi8KLSAgaWYgKGJ0bV9zdGF0dXMgPT0gQlRNX0NNRF9TVEFSVEVEKSByZXR1cm47Ci0KLSAgLyogVGhlcmUgaXMgbm8gbmV4dCBwcm9jZWR1cmUgb3Igc3RhcnQgb2YgcHJvY2VkdXJlIGZhaWxlZCwgbm90aWZ5IHRoZSB3YWl0aW5nCi0gICAqIGxheWVyICovCi0gIGJ0bV9zZWNfZGV2X3JlY19jYmFja19ldmVudChwX2Rldl9yZWMsIGJ0bV9zdGF0dXMsIGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfcm10X2hvc3Rfc3VwcG9ydF9mZWF0X2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgSENJX1JNVF9IT1NUX1NVUF9GRUFUX05PVElGWV9FVlQgaXMgcmVjZWl2ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX3JtdF9ob3N0X3N1cHBvcnRfZmVhdF9ldnQodWludDhfdCogcCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgLyogcGVlciBhZGRyZXNzICovCi0gIEJEX0ZFQVRVUkVTIGZlYXR1cmVzOwotCi0gIFNUUkVBTV9UT19CREFERFIoYmRfYWRkciwgcCk7Ci0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihiZF9hZGRyKTsKLQotICBCVE1fVFJBQ0VfRVZFTlQoImJ0bV9zZWNfcm10X2hvc3Rfc3VwcG9ydF9mZWF0X2V2dCAgc200OiAweCV4ICBwWzBdOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+c200LCBwWzBdKTsKLQotICBpZiAoQlRNX1NFQ19JU19TTTRfVU5LTk9XTihwX2Rldl9yZWMtPnNtNCkpIHsKLSAgICBwX2Rldl9yZWMtPnNtNCA9IEJUTV9TTTRfS05PV047Ci0gICAgU1RSRUFNX1RPX0FSUkFZKGZlYXR1cmVzLCBwLCBIQ0lfRkVBVFVSRV9CWVRFU19QRVJfUEFHRSk7Ci0gICAgaWYgKEhDSV9TU1BfSE9TVF9TVVBQT1JURUQoZmVhdHVyZXMpKSB7Ci0gICAgICBwX2Rldl9yZWMtPnNtNCA9IEJUTV9TTTRfVFJVRTsKLSAgICB9Ci0gICAgQlRNX1RSQUNFX0VWRU5UKAotICAgICAgICAiYnRtX3NlY19ybXRfaG9zdF9zdXBwb3J0X2ZlYXRfZXZ0IHNtNDogMHgleCBmZWF0dXJlc1swXTogMHgleCIsCi0gICAgICAgIHBfZGV2X3JlYy0+c200LCBmZWF0dXJlc1swXSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9pb19jYXBhYmlsaXRpZXNfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIExNIHJlcXVlc3QgZm9yIHRoZSBJTwotICogICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5IG9mIHRoZSBsb2NhbCBkZXZpY2UgYW5kCi0gKiAgICAgICAgICAgICAgICAgIGlmIHRoZSBPT0IgZGF0YSBpcyBwcmVzZW50IGZvciB0aGUgZGV2aWNlIGluIHRoZSBldmVudAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9pb19jYXBhYmlsaXRpZXNfcmVxKGNvbnN0IFJhd0FkZHJlc3MmIHApIHsKLSAgaWYgKGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KHApKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICIlczogSW5jb21pbmcgYm9uZCByZXF1ZXN0LCBidXQgJXMgaXMgYWxyZWFkeSBib25kZWQgKHJlbW92aW5nKSIsCi0gICAgICAgIF9fZnVuY19fLCBwLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZShwKTsKLSAgfQotCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihwKTsKLQotICBpZiAoKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgJiYKLSAgICAgICghcF9kZXZfcmVjLT5yZW1vdGVfZmVhdHVyZV9yZWNlaXZlZCkpIHsKLSAgICBCVE1fVFJBQ0VfRVZFTlQoIiVzOiBEZXZpY2Ugc2VjdXJpdHkgbW9kZSBpcyBTQyBvbmx5LiIsCi0gICAgICAgICAgICAgICAgICAgICJUbyBjb250aW51ZSBuZWVkIHRvIGtub3cgcmVtb3RlIGZlYXR1cmVzLiIsIF9fZnVuY19fKTsKLQotICAgIC8vIEFDTCBjYWxscyBiYWNrIHRvIGJ0bV9zZWNfc2V0X3BlZXJfc2VjX2NhcHMgYWZ0ZXIgaXQgZ2V0cyBkYXRhCi0gICAgcF9kZXZfcmVjLT5yZW1vdGVfZmVhdHVyZXNfbmVlZGVkID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0QlRNX1NQX0lPX1JFUSBldnRfZGF0YTsKLSAgZXZ0X2RhdGEuYmRfYWRkciA9IHA7Ci0KLSAgLyogc2V0dXAgdGhlIGRlZmF1bHQgcmVzcG9uc2UgYWNjb3JkaW5nIHRvIGNvbXBpbGUgb3B0aW9ucyAqLwotICAvKiBhc3N1bWUgdGhhdCB0aGUgbG9jYWwgSU8gY2FwYWJpbGl0eSBkb2VzIG5vdCBjaGFuZ2UKLSAgICogbG9jX2lvX2NhcHMgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotICBldnRfZGF0YS5pb19jYXAgPSBidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHM7Ci0gIC8vIFRPRE8ob3B0ZWRvYmxpdmlvbik6IEluamVjdCBPT0JfREFUQV9QUkVTRU5UIEZsYWcKLSAgZXZ0X2RhdGEub29iX2RhdGEgPSBCVE1fT09CX05PTkU7Ci0gIGV2dF9kYXRhLmF1dGhfcmVxID0gQlRNX0FVVEhfU1BfTk87Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCIlczogU3RhdGU6ICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSkpOwotCi0gIEJUTV9UUkFDRV9ERUJVRygiJXM6U2VjdXJpdHkgbW9kZTogJWQiLCBfX2Z1bmNfXywgYnRtX2NiLnNlY3VyaXR5X21vZGUpOwotCi0gIHBfZGV2X3JlYy0+c200IHw9IEJUTV9TTTRfVFJVRTsKLQotICBCVE1fVFJBQ0VfRVZFTlQoIiVzOiBTdGF0ZTogJXMgIEZsYWdzOiAweCUwNHgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSwKLSAgICAgICAgICAgICAgICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzKTsKLQotICB1aW50OF90IGVycl9jb2RlID0gMDsKLSAgYm9vbCBpc19vcmlnID0gdHJ1ZTsKLSAgc3dpdGNoIChidG1fY2IucGFpcmluZ19zdGF0ZSkgewotICAgIC8qIGluaXRpYXRvciBjb25uZWN0aW5nICovCi0gICAgY2FzZSBCVE1fUEFJUl9TVEFURV9JRExFOgotICAgICAgLy8gVE9ETzogSGFuZGxlIElkbGUgcGFpcmluZyBzdGF0ZQotICAgICAgLy8gc2VjdXJpdHlfcmVxdWlyZWQgPSBwX2Rldl9yZWMtPnNlY3VyaXR5X3JlcXVpcmVkOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiByZWNlaXZlZCBJTyBjYXBhYmlsaXR5IHJlc3BvbnNlIGFscmVhZHktPmFjY2VwdG9yICovCi0gICAgY2FzZSBCVE1fUEFJUl9TVEFURV9JTkNPTUlOR19TU1A6Ci0gICAgICBpc19vcmlnID0gZmFsc2U7Ci0KLSAgICAgIGlmIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1BFRVJfU1RBUlRFRF9ERCkgewotICAgICAgICAvKiBhY2NlcHRvciBpbiBkZWRpY2F0ZWQgYm9uZGluZyAqLwotICAgICAgICBldnRfZGF0YS5hdXRoX3JlcSA9IEJUTV9BVVRIX0FQX1lFUzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogaW5pdGlhdG9yLCBhdCB0aGlzIHBvaW50IGl0IGlzIGV4cGVjdGVkIHRvIGJlIGRlZGljYXRlZCBib25kaW5nCi0gICAgaW5pdGlhdGVkIGJ5IGxvY2FsIGRldmljZSAqLwotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9QSU5fUkVROgotICAgICAgaWYgKGV2dF9kYXRhLmJkX2FkZHIgPT0gYnRtX2NiLnBhaXJpbmdfYmRhKSB7Ci0gICAgICAgIGV2dF9kYXRhLmF1dGhfcmVxID0gQlRNX0FVVEhfQVBfWUVTOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyX2NvZGUgPSBIQ0lfRVJSX0hPU1RfQlVTWV9QQUlSSU5HOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBhbnkgb3RoZXIgc3RhdGUgaXMgdW5leHBlY3RlZCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJfY29kZSA9IEhDSV9FUlJfSE9TVF9CVVNZX1BBSVJJTkc7Ci0gICAgICBCVE1fVFJBQ0VfRVJST1IoIiVzOiBVbmV4cGVjdGVkIFBhaXJpbmcgc3RhdGUgcmVjZWl2ZWQgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICBidG1fY2IucGFpcmluZ19zdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChidG1fY2IucGFpcmluZ19kaXNhYmxlZCkgewotICAgIC8qIHBhaXJpbmcgaXMgbm90IGFsbG93ZWQgKi8KLSAgICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBQYWlyaW5nIGlzIG5vdCBhbGxvd2VkIC0+IGZhaWwgcGFpcmluZy4iLCBfX2Z1bmNfXyk7Ci0gICAgZXJyX2NvZGUgPSBIQ0lfRVJSX1BBSVJJTkdfTk9UX0FMTE9XRUQ7Ci0gIH0gZWxzZSBpZiAoYnRtX2NiLnNlY3VyaXR5X21vZGUgPT0gQlRNX1NFQ19NT0RFX1NDKSB7Ci0gICAgYm9vbCBsb2NhbF9zdXBwb3J0c19zYyA9Ci0gICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5zdXBwb3J0c19zZWN1cmVfY29ubmVjdGlvbnMoKTsKLSAgICAvKiBkZXZpY2UgaW4gU2VjdXJlIENvbm5lY3Rpb25zIE9ubHkgbW9kZSAqLwotICAgIGlmICghKGxvY2FsX3N1cHBvcnRzX3NjKSB8fCAhKHBfZGV2X3JlYy0+U3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucygpKSkgewotICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICJTQyBvbmx5IHNlcnZpY2UsIGxvY2FsX3N1cHBvcnRfZm9yX3NjOiVzLCIKLSAgICAgICAgICAiIHJlbW90ZV9zdXBwb3J0X2Zvcl9zYzolcyAtPiBmYWlsIHBhaXJpbmciLAotICAgICAgICAgIGxvZ2Jvb2wobG9jYWxfc3VwcG9ydHNfc2MpLmNfc3RyKCksCi0gICAgICAgICAgbG9nYm9vbChwX2Rldl9yZWMtPlN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMoKSkuY19zdHIoKSk7Ci0gICAgICBlcnJfY29kZSA9IEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRDsKLSAgICB9Ci0gIH0KLQotICBpZiAoZXJyX2NvZGUgIT0gMCkgewotICAgIGJ0c25kX2hjaWNfaW9fY2FwX3JlcV9uZWdfcmVwbHkoZXZ0X2RhdGEuYmRfYWRkciwgZXJyX2NvZGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGV2dF9kYXRhLmlzX29yaWcgPSBpc19vcmlnOwotCi0gIGlmIChpc19vcmlnKSB7Ci0gICAgLyogbG9jYWwgZGV2aWNlIGluaXRpYXRlZCB0aGUgcGFpcmluZyBub24tYm9uZGluZyAtPiB1c2UKLSAgICAgKiByZXF1aXJlZF9zZWN1cml0eV9mbGFnc19mb3JfcGFpcmluZyAqLwotICAgIGlmICghKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfV0VfU1RBUlRFRF9ERCkgJiYKLSAgICAgICAgKHBfZGV2X3JlYy0+cmVxdWlyZWRfc2VjdXJpdHlfZmxhZ3NfZm9yX3BhaXJpbmcgJgotICAgICAgICAgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFKSkgewotICAgICAgaWYgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgewotICAgICAgICAvKiBTQyBvbmx5IG1vZGUgZGV2aWNlIHJlcXVpcmVzIE1JVE0gcHJvdGVjdGlvbiAqLwotICAgICAgICBldnRfZGF0YS5hdXRoX3JlcSA9IEJUTV9BVVRIX1NQX1lFUzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV2dF9kYXRhLmF1dGhfcmVxID0KLSAgICAgICAgICAgIChwX2Rldl9yZWMtPnJlcXVpcmVkX3NlY3VyaXR5X2ZsYWdzX2Zvcl9wYWlyaW5nICYgQlRNX1NFQ19PVVRfTUlUTSkKLSAgICAgICAgICAgICAgICA/IEJUTV9BVVRIX1NQX1lFUwotICAgICAgICAgICAgICAgIDogQlRNX0FVVEhfU1BfTk87Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTm90aWZ5IEwyQ0FQIHRvIGluY3JlYXNlIHRpbWVvdXQgKi8KLSAgbDJjX3Bpbl9jb2RlX3JlcXVlc3QoZXZ0X2RhdGEuYmRfYWRkcik7Ci0KLSAgYnRtX2NiLnBhaXJpbmdfYmRhID0gZXZ0X2RhdGEuYmRfYWRkcjsKLQotICBpZiAoZXZ0X2RhdGEuYmRfYWRkciA9PSBidG1fY2IuY29ubmVjdGluZ19iZGEpCi0gICAgbWVtY3B5KHBfZGV2X3JlYy0+ZGV2X2NsYXNzLCBidG1fY2IuY29ubmVjdGluZ19kYywgREVWX0NMQVNTX0xFTik7Ci0KLSAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX0lPQ0FQUyk7Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c200ICYgQlRNX1NNNF9VUEdSQURFKSB7Ci0gICAgcF9kZXZfcmVjLT5zbTQgJj0gfkJUTV9TTTRfVVBHUkFERTsKLQotICAgIC8qIGxpbmsga2V5IHVwZ3JhZGU6IGFsd2F5cyB1c2UgU1BHQl9ZRVMgLSBhc3N1bWluZyB3ZSB3YW50IHRvIHNhdmUgdGhlIGxpbmsKLSAgICAgKiBrZXkgKi8KLSAgICBldnRfZGF0YS5hdXRoX3JlcSA9IEJUTV9BVVRIX1NQR0JfWUVTOwotICB9IGVsc2UgaWYgKGJ0bV9jYi5hcGkucF9zcF9jYWxsYmFjaykgewotICAgIC8qIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIHRoZSBJTyBjYXBhYmlsaXR5Li4uICovCi0gICAgKCpidG1fY2IuYXBpLnBfc3BfY2FsbGJhY2spKEJUTV9TUF9JT19SRVFfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodEJUTV9TUF9FVlRfREFUQSopJmV2dF9kYXRhKTsKLSAgfQotCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSkgewotICAgIGV2dF9kYXRhLmF1dGhfcmVxID0KLSAgICAgICAgKEJUTV9BVVRIX0REX0JPTkQgfCAoZXZ0X2RhdGEuYXV0aF9yZXEgJiBCVE1fQVVUSF9ZTl9CSVQpKTsKLSAgfQotCi0gIGlmIChidG1fY2Iuc2VjdXJpdHlfbW9kZSA9PSBCVE1fU0VDX01PREVfU0MpIHsKLSAgICAvKiBBdCB0aGlzIG1vbWVudCB3ZSBrbm93IHRoYXQgYm90aCBzaWRlcyBhcmUgU0MgY2FwYWJsZSwgZGV2aWNlIGluICovCi0gICAgLyogU0Mgb25seSBtb2RlIHJlcXVpcmVzIE1JVE0gZm9yIGFueSBzZXJ2aWNlIHNvIGxldCdzIHNldCBNSVRNIGJpdCAqLwotICAgIGV2dF9kYXRhLmF1dGhfcmVxIHw9IEJUTV9BVVRIX1lOX0JJVDsKLSAgICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBmb3IgZGV2aWNlIGluIFwiU0Mgb25seVwiIG1vZGUgc2V0IGF1dGhfcmVxIHRvIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBldnRfZGF0YS5hdXRoX3JlcSk7Ci0gIH0KLQotICAvKiBpZiB0aGUgdXNlciBkb2VzIG5vdCBpbmRpY2F0ZSAicmVwbHkgbGF0ZXIiIGJ5IHNldHRpbmcgdGhlIG9vYl9kYXRhIHRvCi0gICAqIHVua25vd24gKi8KLSAgLyogc2VuZCB0aGUgcmVzcG9uc2UgcmlnaHQgbm93LiBTYXZlIHRoZSBjdXJyZW50IElPIGNhcGFiaWxpdHkgaW4gdGhlCi0gICAqIGNvbnRyb2wgYmxvY2sgKi8KLSAgYnRtX2NiLmRldmNiLmxvY19hdXRoX3JlcSA9IGV2dF9kYXRhLmF1dGhfcmVxOwotICBidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHMgPSBldnRfZGF0YS5pb19jYXA7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCIlczogU3RhdGU6ICVzICBJT19DQVA6JWQgb29iX2RhdGE6JWQgYXV0aF9yZXE6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSwgZXZ0X2RhdGEuaW9fY2FwLAotICAgICAgICAgICAgICAgICAgZXZ0X2RhdGEub29iX2RhdGEsIGV2dF9kYXRhLmF1dGhfcmVxKTsKLQotICBidHNuZF9oY2ljX2lvX2NhcF9yZXFfcmVwbHkoZXZ0X2RhdGEuYmRfYWRkciwgZXZ0X2RhdGEuaW9fY2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0X2RhdGEub29iX2RhdGEsIGV2dF9kYXRhLmF1dGhfcmVxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9pb19jYXBhYmlsaXRpZXNfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBJTyBjYXBhYmlsaXR5IG9mIHRoZQotICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgZGV2aWNlIGlzIHJlY2VpdmVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2lvX2NhcGFiaWxpdGllc19yc3AodWludDhfdCogcCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIHRCVE1fU1BfSU9fUlNQIGV2dF9kYXRhOwotCi0gIFNUUkVBTV9UT19CREFERFIoZXZ0X2RhdGEuYmRfYWRkciwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChldnRfZGF0YS5pb19jYXAsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoZXZ0X2RhdGEub29iX2RhdGEsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoZXZ0X2RhdGEuYXV0aF9yZXEsIHApOwotCi0gIC8qIEFsbG9jYXRlIGEgbmV3IGRldmljZSByZWNvcmQgb3IgcmV1c2UgdGhlIG9sZGVzdCBvbmUgKi8KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfb3JfYWxsb2NfZGV2KGV2dF9kYXRhLmJkX2FkZHIpOwotCi0gIC8qIElmIG5vIHNlY3VyaXR5IGlzIGluIHByb2dyZXNzLCB0aGlzIGluZGljYXRlcyBpbmNvbWluZyBzZWN1cml0eSAqLwotICBpZiAoYnRtX2NiLnBhaXJpbmdfc3RhdGUgPT0gQlRNX1BBSVJfU1RBVEVfSURMRSkgewotICAgIGJ0bV9jYi5wYWlyaW5nX2JkYSA9IGV2dF9kYXRhLmJkX2FkZHI7Ci0KLSAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lOQ09NSU5HX1NTUCk7Ci0KLSAgICAvKiB3b3JrIGFyb3VuZCBmb3IgRlcgYnVnICovCi0gICAgYnRtX2lucV9zdG9wX29uX3NzcCgpOwotICB9Ci0KLSAgLyogTm90aWZ5IEwyQ0FQIHRvIGluY3JlYXNlIHRpbWVvdXQgKi8KLSAgbDJjX3Bpbl9jb2RlX3JlcXVlc3QoZXZ0X2RhdGEuYmRfYWRkcik7Ci0KLSAgLyogV2UgbXVzdCBoYXZlIGEgZGV2aWNlIHJlY29yZCBoZXJlLgotICAgKiBVc2UgdGhlIGNvbm5lY3RpbmcgZGV2aWNlJ3MgQ29EIGZvciB0aGUgY29ubmVjdGlvbiAqLwotICBpZiAoZXZ0X2RhdGEuYmRfYWRkciA9PSBidG1fY2IuY29ubmVjdGluZ19iZGEpCi0gICAgbWVtY3B5KHBfZGV2X3JlYy0+ZGV2X2NsYXNzLCBidG1fY2IuY29ubmVjdGluZ19kYywgREVWX0NMQVNTX0xFTik7Ci0KLSAgLyogcGVlciBzZXRzIGRlZGljYXRlZCBib25kaW5nIGJpdCBhbmQgd2UgZGlkIG5vdCBpbml0aWF0ZSBkZWRpY2F0ZWQgYm9uZGluZwotICAgKi8KLSAgaWYgKGJ0bV9jYi5wYWlyaW5nX3N0YXRlID09Ci0gICAgICAgICAgQlRNX1BBSVJfU1RBVEVfSU5DT01JTkdfU1NQIC8qIHBlZXIgaW5pdGlhdGVkIGJvbmRpbmcgKi8KLSAgICAgICYmIChldnRfZGF0YS5hdXRoX3JlcSAmCi0gICAgICAgICAgQlRNX0FVVEhfRERfQk9ORCkpIC8qIGFuZCBkZWRpY2F0ZWQgYm9uZGluZyBiaXQgaXMgc2V0ICovCi0gIHsKLSAgICBidG1fY2IucGFpcmluZ19mbGFncyB8PSBCVE1fUEFJUl9GTEFHU19QRUVSX1NUQVJURURfREQ7Ci0gIH0KLQotICAvKiBzYXZlIHRoZSBJTyBjYXBhYmlsaXR5IGluIHRoZSBkZXZpY2UgcmVjb3JkICovCi0gIHBfZGV2X3JlYy0+cm10X2lvX2NhcHMgPSBldnRfZGF0YS5pb19jYXA7Ci0gIHBfZGV2X3JlYy0+cm10X2F1dGhfcmVxID0gZXZ0X2RhdGEuYXV0aF9yZXE7Ci0KLSAgaWYgKGJ0bV9jYi5hcGkucF9zcF9jYWxsYmFjaykKLSAgICAoKmJ0bV9jYi5hcGkucF9zcF9jYWxsYmFjaykoQlRNX1NQX0lPX1JTUF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRNX1NQX0VWVF9EQVRBKikmZXZ0X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Byb2Nfc3BfcmVxX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzcy9yZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgSENJX1VTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfRVZUCi0gKiAgICAgICAgICAgICAgICAgIG9yIEhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVF9FVlQKLSAqICAgICAgICAgICAgICAgICAgb3IgSENJX1VTRVJfUEFTU0tFWV9OT1RJRllfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3Byb2Nfc3BfcmVxX2V2dCh0QlRNX1NQX0VWVCBldmVudCwgdWludDhfdCogcCkgewotICB0QlRNX1NUQVRVUyBzdGF0dXMgPSBCVE1fRVJSX1BST0NFU1NJTkc7Ci0gIHRCVE1fU1BfRVZUX0RBVEEgZXZ0X2RhdGE7Ci0gIFJhd0FkZHJlc3MmIHBfYmRhID0gZXZ0X2RhdGEuY2ZtX3JlcS5iZF9hZGRyOwotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0KLSAgLyogQWxsIGV2ZW50cyBzdGFydCB3aXRoIGJkX2FkZHIgKi8KLSAgU1RSRUFNX1RPX0JEQUREUihwX2JkYSwgcCk7Ci0KLSAgVkxPRygyKSA8PCAiIEJEQTogIiA8PCBwX2JkYSA8PCAiIGV2ZW50OiAweCIgPDwgc3RkOjpoZXggPDwgK2V2ZW50Ci0gICAgICAgICAgPDwgIiBTdGF0ZTogIiA8PCBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSk7Ci0KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KHBfYmRhKTsKLSAgaWYgKChwX2Rldl9yZWMgIT0gTlVMTCkgJiYgKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpICYmCi0gICAgICAoYnRtX2NiLnBhaXJpbmdfYmRhID09IHBfYmRhKSkgewotICAgIGV2dF9kYXRhLmNmbV9yZXEuYmRfYWRkciA9IHBfZGV2X3JlYy0+YmRfYWRkcjsKLSAgICBtZW1jcHkoZXZ0X2RhdGEuY2ZtX3JlcS5kZXZfY2xhc3MsIHBfZGV2X3JlYy0+ZGV2X2NsYXNzLCBERVZfQ0xBU1NfTEVOKTsKLQotICAgIHN0cmxjcHkoKGNoYXIqKWV2dF9kYXRhLmNmbV9yZXEuYmRfbmFtZSwgKGNoYXIqKXBfZGV2X3JlYy0+c2VjX2JkX25hbWUsCi0gICAgICAgICAgICBCVE1fTUFYX1JFTV9CRF9OQU1FX0xFTiArIDEpOwotCi0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgY2FzZSBCVE1fU1BfQ0ZNX1JFUV9FVlQ6Ci0gICAgICAgIC8qIE51bWVyaWMgY29uZmlybWF0aW9uLiBOZWVkIHVzZXIgdG8gY29uZiB0aGUgcGFzc2tleSAqLwotICAgICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfTlVNRVJJQ19DT05GSVJNKTsKLQotICAgICAgICAvKiBUaGUgZGV2aWNlIHJlY29yZCBtdXN0IGJlIGFsbG9jYXRlZCBpbiB0aGUgIklPIGNhcCBleGNoYW5nZSIgc3RlcCAqLwotICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKGV2dF9kYXRhLmNmbV9yZXEubnVtX3ZhbCwgcCk7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygiQlRNX1NQX0NGTV9SRVFfRVZUOiAgbnVtX3ZhbDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXZ0X2RhdGEuY2ZtX3JlcS5udW1fdmFsKTsKLQotICAgICAgICBldnRfZGF0YS5jZm1fcmVxLmp1c3Rfd29ya3MgPSB0cnVlOwotCi0gICAgICAgIC8qIHByb2Nlc3MgdXNlciBjb25maXJtIHJlcSBpbiBhc3NvY2lhdGlvbiB3aXRoIHRoZSBhdXRoX3JlcSBwYXJhbSAqLwotICAgICAgICBpZiAoYnRtX2NiLmRldmNiLmxvY19pb19jYXBzID09IEJUTV9JT19DQVBfSU8pIHsKLSAgICAgICAgICBpZiAocF9kZXZfcmVjLT5ybXRfaW9fY2FwcyA9PSBCVE1fSU9fQ0FQX1VOS05PV04pIHsKLSAgICAgICAgICAgIEJUTV9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICAgICAiJXMgZGlkIG5vdCByZWNlaXZlIElPIGNhcCByZXNwb25zZSBwcmlvciIKLSAgICAgICAgICAgICAgICAiIHRvIEJUTV9TUF9DRk1fUkVRX0VWVCwgZmFpbGluZyBwYWlyaW5nIHJlcXVlc3QiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJUTV9XUk9OR19NT0RFOwotICAgICAgICAgICAgQlRNX0NvbmZpcm1SZXFSZXBseShzdGF0dXMsIHBfYmRhKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChwX2Rldl9yZWMtPnJtdF9pb19jYXBzID09IEJUTV9JT19DQVBfSU8pICYmCi0gICAgICAgICAgICAgIChidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHMgPT0gQlRNX0lPX0NBUF9JTykgJiYKLSAgICAgICAgICAgICAgKChwX2Rldl9yZWMtPnJtdF9hdXRoX3JlcSAmIEJUTV9BVVRIX1NQX1lFUykgfHwKLSAgICAgICAgICAgICAgIChidG1fY2IuZGV2Y2IubG9jX2F1dGhfcmVxICYgQlRNX0FVVEhfU1BfWUVTKSkpIHsKLSAgICAgICAgICAgIC8qIEJvdGggZGV2aWNlcyBhcmUgRGlzcGxheVllc05vIGFuZCBvbmUgb3IgYm90aCBkZXZpY2VzIHdhbnQgdG8KLSAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSAtPiB1c2UgYXV0aGVudGljYXRlZCBsaW5rIGtleSAqLwotICAgICAgICAgICAgZXZ0X2RhdGEuY2ZtX3JlcS5qdXN0X3dvcmtzID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgImJ0bV9wcm9jX3NwX3JlcV9ldnQoKSAganVzdF93b3JrczolZCwgaW8gbG9jOiVkLCBybXQ6JWQsIGF1dGggIgotICAgICAgICAgICAgImxvYzolZCwgcm10OiVkIiwKLSAgICAgICAgICAgIGV2dF9kYXRhLmNmbV9yZXEuanVzdF93b3JrcywgYnRtX2NiLmRldmNiLmxvY19pb19jYXBzLAotICAgICAgICAgICAgcF9kZXZfcmVjLT5ybXRfaW9fY2FwcywgYnRtX2NiLmRldmNiLmxvY19hdXRoX3JlcSwKLSAgICAgICAgICAgIHBfZGV2X3JlYy0+cm10X2F1dGhfcmVxKTsKLQotICAgICAgICBldnRfZGF0YS5jZm1fcmVxLmxvY19hdXRoX3JlcSA9IGJ0bV9jYi5kZXZjYi5sb2NfYXV0aF9yZXE7Ci0gICAgICAgIGV2dF9kYXRhLmNmbV9yZXEucm10X2F1dGhfcmVxID0gcF9kZXZfcmVjLT5ybXRfYXV0aF9yZXE7Ci0gICAgICAgIGV2dF9kYXRhLmNmbV9yZXEubG9jX2lvX2NhcHMgPSBidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHM7Ci0gICAgICAgIGV2dF9kYXRhLmNmbV9yZXEucm10X2lvX2NhcHMgPSBwX2Rldl9yZWMtPnJtdF9pb19jYXBzOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVE1fU1BfS0VZX05PVElGX0VWVDoKLSAgICAgICAgLyogUGFzc2tleSBub3RpZmljYXRpb24gKG90aGVyIHNpZGUgaXMgYSBrZXlib2FyZCkgKi8KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQzMihldnRfZGF0YS5rZXlfbm90aWYucGFzc2tleSwgcCk7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygiQlRNX1NQX0tFWV9OT1RJRl9FVlQ6ICBwYXNza2V5OiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBldnRfZGF0YS5rZXlfbm90aWYucGFzc2tleSk7Ci0KLSAgICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEUpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBCVE1fU1BfS0VZX1JFUV9FVlQ6Ci0gICAgICAgIGlmIChidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHMgIT0gQlRNX0lPX0NBUF9OT05FKSB7Ci0gICAgICAgICAgLyogSENJX1VTRVJfUEFTU0tFWV9SRVFVRVNUX0VWVCAqLwotICAgICAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfS0VZX0VOVFJZKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoYnRtX2NiLmFwaS5wX3NwX2NhbGxiYWNrKSB7Ci0gICAgICBzdGF0dXMgPSAoKmJ0bV9jYi5hcGkucF9zcF9jYWxsYmFjaykoZXZlbnQsICZldnRfZGF0YSk7Ci0gICAgICBpZiAoc3RhdHVzICE9IEJUTV9OT1RfQVVUSE9SSVpFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvKiBlbHNlIEJUTV9OT1RfQVVUSE9SSVpFRCBtZWFucyB3aGVuIHRoZSBhcHAgd2FudHMgdG8gcmVqZWN0IHRoZSByZXEKLSAgICAgICAqIHJpZ2h0IG5vdyAqLwotICAgIH0gZWxzZSBpZiAoKGV2ZW50ID09IEJUTV9TUF9DRk1fUkVRX0VWVCkgJiYgKGV2dF9kYXRhLmNmbV9yZXEuanVzdF93b3JrcykpIHsKLSAgICAgIC8qIGF1dG9tYXRpY2FsbHkgcmVwbHkgd2l0aCBqdXN0IHdvcmtzIGlmIG5vIHNwX2NiYWNrICovCi0gICAgICBzdGF0dXMgPSBCVE1fU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQgPT0gQlRNX1NQX0NGTV9SRVFfRVZUKSB7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoImNhbGxpbmcgQlRNX0NvbmZpcm1SZXFSZXBseSB3aXRoIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgQlRNX0NvbmZpcm1SZXFSZXBseShzdGF0dXMsIHBfYmRhKTsKLSAgICB9IGVsc2UgaWYgKGJ0bV9jYi5kZXZjYi5sb2NfaW9fY2FwcyAhPSBCVE1fSU9fQ0FQX05PTkUgJiYKLSAgICAgICAgICAgICAgIGV2ZW50ID09IEJUTV9TUF9LRVlfUkVRX0VWVCkgewotICAgICAgQlRNX1Bhc3NrZXlSZXFSZXBseShzdGF0dXMsIHBfYmRhLCAwKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogU29tZXRoaW5nIGJhZC4gd2UgY2FuIG9ubHkgZmFpbCB0aGlzIGNvbm5lY3Rpb24gKi8KLSAgYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZKTsKLQotICBpZiAoQlRNX1NQX0NGTV9SRVFfRVZUID09IGV2ZW50KSB7Ci0gICAgYnRzbmRfaGNpY191c2VyX2NvbmZfcmVwbHkocF9iZGEsIGZhbHNlKTsKLSAgfSBlbHNlIGlmIChCVE1fU1BfS0VZX05PVElGX0VWVCA9PSBldmVudCkgewotICAgIC8qIGRvIG5vdGhpbmcgLT4gaXQgdmVyeSB1bmxpa2VseSB0byBoYXBwZW4uCi0gICAgVGhpcyBldmVudCBpcyBtb3N0IGxpa2VseSB0byBiZSByZWNlaXZlZCBieSBhIEhJRCBob3N0IHdoZW4gaXQgZmlyc3QKLSAgICBjb25uZWN0cyB0byBhIEhJRCBkZXZpY2UuCi0gICAgVXN1YWxseSB0aGUgSG9zdCBpbml0aWF0ZWQgdGhlIGNvbm5lY3Rpb24gaW4gdGhpcyBjYXNlLgotICAgIE9uIE1vYmlsZSBwbGF0Zm9ybXMsIGlmIHRoZXJlJ3MgYSBzZWN1cml0eSBwcm9jZXNzIGhhcHBlbmluZywKLSAgICB0aGUgaG9zdCBwcm9iYWJseSBjYW4gbm90IGluaXRpYXRlIGFub3RoZXIgY29ubmVjdGlvbi4KLSAgICBCVFcgKFBDKSBpcyBhbm90aGVyIHN0b3J5LiAgKi8KLSAgICBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYocF9iZGEpOwotICAgIGlmIChwX2Rldl9yZWMgIT0gTlVMTCkgewotICAgICAgYnRtX3NlY19kaXNjb25uZWN0KHBfZGV2X3JlYy0+aGNpX2hhbmRsZSwgSENJX0VSUl9BVVRIX0ZBSUxVUkUpOwotICAgIH0KLSAgfSBlbHNlIGlmIChidG1fY2IuZGV2Y2IubG9jX2lvX2NhcHMgIT0gQlRNX0lPX0NBUF9OT05FKSB7Ci0gICAgYnRzbmRfaGNpY191c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KHBfYmRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NpbXBsZV9wYWlyX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHNpbXBsZSBwYWlyaW5nIHByb2Nlc3MgaXMKLSAqICAgICAgICAgICAgICAgICAgY29tcGxldGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2ltcGxlX3BhaXJfY29tcGxldGUodWludDhfdCogcCkgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIGJvb2wgZGlzYyA9IGZhbHNlOwotCi0gIHN0YXR1cyA9ICpwKys7Ci0gIFNUUkVBTV9UT19CREFERFIoYmRfYWRkciwgcCk7Ci0KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkX2FkZHIpOwotICBpZiAocF9kZXZfcmVjID09IE5VTEwpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgd2l0aCB1bmtub3duIEJEQTogIiA8PCBiZF9hZGRyOwotICAgIHJldHVybjsKLSAgfQotCi0gIEJUTV9UUkFDRV9FVkVOVCgKLSAgICAgICJidG1fc2ltcGxlX3BhaXJfY29tcGxldGUoKSAgUGFpciBTdGF0ZTogJXMgIFN0YXR1czolZCAgc2VjX3N0YXRlOiAldSIsCi0gICAgICBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSksIHN0YXR1cywgcF9kZXZfcmVjLT5zZWNfc3RhdGUpOwotCi0gIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDX0FVVEhFTlRJQ0FURUQ7Ci0gIH0gZWxzZSBpZiAoc3RhdHVzID09IEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRCkgewotICAgIC8qIFRoZSB0ZXN0IHNwZWMgd2FudHMgdGhlIHBlZXIgZGV2aWNlIHRvIGdldCB0aGlzIGZhaWx1cmUgY29kZS4gKi8KLSAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfRElTQ09OTkVDVCk7Ci0KLSAgICAvKiBDaGFuZ2UgdGhlIHRpbWVyIHRvIDEgc2Vjb25kICovCi0gICAgYWxhcm1fc2V0X29uX21sb29wKGJ0bV9jYi5wYWlyaW5nX3RpbWVyLCBCVF8xU0VDX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0bV9zZWNfcGFpcmluZ190aW1lb3V0LCBOVUxMKTsKLSAgfSBlbHNlIGlmIChidG1fY2IucGFpcmluZ19iZGEgPT0gYmRfYWRkcikgewotICAgIC8qIHN0b3AgdGhlIHRpbWVyICovCi0gICAgYWxhcm1fY2FuY2VsKGJ0bV9jYi5wYWlyaW5nX3RpbWVyKTsKLQotICAgIGlmIChwX2Rldl9yZWMtPnNlY19zdGF0ZSAhPSBCVE1fU0VDX1NUQVRFX0FVVEhFTlRJQ0FUSU5HKSB7Ci0gICAgICAvKiB0aGUgaW5pdGlhdGluZyBzaWRlOiB3aWxsIHJlY2VpdmUgYXV0aCBjb21wbGV0ZSBldmVudC4gZGlzY29ubmVjdCBBQ0wKLSAgICAgICAqIGF0IHRoYXQgdGltZSAqLwotICAgICAgZGlzYyA9IHRydWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGRpc2MgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGRpc2MpIHsKLSAgICAvKiBzaW1wbGUgcGFpcmluZyBmYWlsZWQgKi8KLSAgICAvKiBBdm9pZCBzZW5kaW5nIGRpc2Nvbm5lY3Qgb24gSENJX0VSUl9QRUVSX1VTRVIgKi8KLSAgICBpZiAoKHN0YXR1cyAhPSBIQ0lfRVJSX1BFRVJfVVNFUikgJiYKLSAgICAgICAgKHN0YXR1cyAhPSBIQ0lfRVJSX0NPTk5fQ0FVU0VfTE9DQUxfSE9TVCkpIHsKLSAgICAgIGJ0bV9zZWNfc2VuZF9oY2lfZGlzY29ubmVjdChwX2Rldl9yZWMsIEhDSV9FUlJfQVVUSF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVtX29vYl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MvcmVwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIEhDSV9SRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVtX29vYl9yZXEodWludDhfdCogcCkgewotICB0QlRNX1NQX1JNVF9PT0IgZXZ0X2RhdGE7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgT2N0ZXQxNiBjOwotICBPY3RldDE2IHI7Ci0KLSAgUmF3QWRkcmVzcyYgcF9iZGEgPSBldnRfZGF0YS5iZF9hZGRyOwotCi0gIFNUUkVBTV9UT19CREFERFIocF9iZGEsIHApOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBCREE6ICIgPDwgcF9iZGE7Ci0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihwX2JkYSk7Ci0gIGlmICgocF9kZXZfcmVjICE9IE5VTEwpICYmIGJ0bV9jYi5hcGkucF9zcF9jYWxsYmFjaykgewotICAgIGV2dF9kYXRhLmJkX2FkZHIgPSBwX2Rldl9yZWMtPmJkX2FkZHI7Ci0gICAgbWVtY3B5KGV2dF9kYXRhLmRldl9jbGFzcywgcF9kZXZfcmVjLT5kZXZfY2xhc3MsIERFVl9DTEFTU19MRU4pOwotICAgIHN0cmxjcHkoKGNoYXIqKWV2dF9kYXRhLmJkX25hbWUsIChjaGFyKilwX2Rldl9yZWMtPnNlY19iZF9uYW1lLAotICAgICAgICAgICAgQlRNX01BWF9SRU1fQkRfTkFNRV9MRU4gKyAxKTsKLQotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9PT0JfUlNQKTsKLSAgICBpZiAoKCpidG1fY2IuYXBpLnBfc3BfY2FsbGJhY2spKEJUTV9TUF9STVRfT09CX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0QlRNX1NQX0VWVF9EQVRBKikmZXZ0X2RhdGEpID09Ci0gICAgICAgIEJUTV9OT1RfQVVUSE9SSVpFRCkgewotICAgICAgQlRNX1JlbW90ZU9vYkRhdGFSZXBseShzdGF0aWNfY2FzdDx0QlRNX1NUQVRVUz4odHJ1ZSksIHBfYmRhLCBjLCByKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogc29tZXRoaW5nIGJhZC4gd2UgY2FuIG9ubHkgZmFpbCB0aGlzIGNvbm5lY3Rpb24gKi8KLSAgYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZKTsKLSAgYnRzbmRfaGNpY19yZW1fb29iX25lZ19yZXBseShwX2JkYSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVhZF9sb2NhbF9vb2JfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVhZCBsb2NhbCBvb2IgZGF0YSBpcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgYnkgdGhlIExNCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3JlYWRfbG9jYWxfb29iX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgdEJUTV9TUF9MT0NfT09CIGV2dF9kYXRhOwotICB1aW50OF90IHN0YXR1cyA9ICpwKys7Ci0KLSAgQlRNX1RSQUNFX0VWRU5UKCJidG1fcmVhZF9sb2NhbF9vb2JfY29tcGxldGU6JWQiLCBzdGF0dXMpOwotICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgZXZ0X2RhdGEuc3RhdHVzID0gQlRNX1NVQ0NFU1M7Ci0gICAgU1RSRUFNX1RPX0FSUkFZMTYoZXZ0X2RhdGEuYy5kYXRhKCksIHApOwotICAgIFNUUkVBTV9UT19BUlJBWTE2KGV2dF9kYXRhLnIuZGF0YSgpLCBwKTsKLSAgfSBlbHNlCi0gICAgZXZ0X2RhdGEuc3RhdHVzID0gQlRNX0VSUl9QUk9DRVNTSU5HOwotCi0gIGlmIChidG1fY2IuYXBpLnBfc3BfY2FsbGJhY2spIHsKLSAgICB0QlRNX1NQX0VWVF9EQVRBIGJ0bV9zcF9ldnRfZGF0YTsKLSAgICBidG1fc3BfZXZ0X2RhdGEubG9jX29vYiA9IGV2dF9kYXRhOwotICAgICgqYnRtX2NiLmFwaS5wX3NwX2NhbGxiYWNrKShCVE1fU1BfTE9DX09PQl9FVlQsICZidG1fc3BfZXZ0X2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2F1dGhfY29sbGlzaW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGF1dGhlbnRpY2F0aW9uIG9yIGVuY3J5cHRpb24KLSAqICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgcmV0cmllZCBhdCBhIGxhdGVyIHRpbWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9zZWNfYXV0aF9jb2xsaXNpb24odWludDE2X3QgaGFuZGxlKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLQotICBpZiAoIWJ0bV9jYi5jb2xsaXNpb25fc3RhcnRfdGltZSkKLSAgICBidG1fY2IuY29sbGlzaW9uX3N0YXJ0X3RpbWUgPSBibHVldG9vdGg6OmNvbW1vbjo6dGltZV9nZXRfb3NfYm9vdHRpbWVfbXMoKTsKLQotICBpZiAoKGJsdWV0b290aDo6Y29tbW9uOjp0aW1lX2dldF9vc19ib290dGltZV9tcygpIC0KLSAgICAgICBidG1fY2IuY29sbGlzaW9uX3N0YXJ0X3RpbWUpIDwgQlRNX1NFQ19NQVhfQ09MTElTSU9OX0RFTEFZKSB7Ci0gICAgaWYgKGhhbmRsZSA9PSBIQ0lfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgIHBfZGV2X3JlYyA9IGJ0bV9zZWNfZmluZF9kZXZfYnlfc2VjX3N0YXRlKEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkcpOwotICAgICAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKQotICAgICAgICBwX2Rldl9yZWMgPSBidG1fc2VjX2ZpbmRfZGV2X2J5X3NlY19zdGF0ZShCVE1fU0VDX1NUQVRFX0VOQ1JZUFRJTkcpOwotICAgIH0gZWxzZQotICAgICAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2X2J5X2hhbmRsZShoYW5kbGUpOwotCi0gICAgaWYgKHBfZGV2X3JlYyAhPSBOVUxMKSB7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgImJ0bV9zZWNfYXV0aF9jb2xsaXNpb246IHN0YXRlICVkIChyZXRyeWluZyBpbiBhIG1vbWVudC4uLikiLAotICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlKTsKLSAgICAgIC8qIFdlIHdpbGwgcmVzdGFydCBhdXRoZW50aWNhdGlvbiBhZnRlciB0aW1lb3V0ICovCi0gICAgICBpZiAocF9kZXZfcmVjLT5zZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORyB8fAotICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfRU5DUllQVElORykKLSAgICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSAwOwotCi0gICAgICBidG1fY2IucF9jb2xsaWRlZF9kZXZfcmVjID0gcF9kZXZfcmVjOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKGJ0bV9jYi5zZWNfY29sbGlzaW9uX3RpbWVyLCBCVF8xU0VDX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnRtX3NlY19jb2xsaXNpb25fdGltZW91dCwgTlVMTCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfYXV0aF9yZXRyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhdXRoZW50aWNhdGlvbiBvciBlbmNyeXB0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIHJldHJpZWQgYXQgYSBsYXRlciB0aW1lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVFJVRSBpZiBhIHNlY3VyaXR5IHJldHJ5IHJlcXVpcmVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgYnRtX3NlY19hdXRoX3JldHJ5KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2X2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAoIXBfZGV2X3JlYykgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGtlZXAgdGhlIG9sZCBzbTQgZmxhZyBhbmQgY2xlYXIgdGhlIHJldHJ5IGJpdCBpbiBjb250cm9sIGJsb2NrICovCi0gIHVpbnQ4X3Qgb2xkX3NtNCA9IHBfZGV2X3JlYy0+c200OwotICBwX2Rldl9yZWMtPnNtNCAmPSB+QlRNX1NNNF9SRVRSWTsKLQotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX3N0YXRlID09IEJUTV9QQUlSX1NUQVRFX0lETEUpICYmCi0gICAgICAoKG9sZF9zbTQgJiBCVE1fU000X1JFVFJZKSA9PSAwKSAmJiAoSENJX0VSUl9LRVlfTUlTU0lORyA9PSBzdGF0dXMpICYmCi0gICAgICBCVE1fU0VDX0lTX1NNNChwX2Rldl9yZWMtPnNtNCkpIHsKLSAgICAvKiBUaGlzIHJldHJ5IGZvciBtaXNzaW5nIGtleSBpcyBmb3IgTGlzYm9uIG9yIGxhdGVyIG9ubHkuCi0gICAgICAgTGVnYWN5IGRldmljZSBkbyBub3QgbmVlZCB0aGlzLiB0aGUgY29udHJvbGxlciB3aWxsIGRyaXZlIHRoZSByZXRyeQotICAgICAgIGF1dG9tYXRpY2FsbHkKLSAgICAgICBzZXQgdGhlIHJldHJ5IGJpdCAqLwotICAgIGJ0bV9jYi5jb2xsaXNpb25fc3RhcnRfdGltZSA9IDA7Ci0gICAgYnRtX3Jlc3RvcmVfbW9kZSgpOwotICAgIHBfZGV2X3JlYy0+c200IHw9IEJUTV9TTTRfUkVUUlk7Ci0gICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0gfkJUTV9TRUNfTElOS19LRVlfS05PV047Ci0gICAgQlRNX1RSQUNFX0RFQlVHKCIlcyBSZXRyeSBmb3IgbWlzc2luZyBrZXkgc200OngleCBzZWNfZmxhZ3M6MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNtNCwgcF9kZXZfcmVjLT5zZWNfZmxhZ3MpOwotCi0gICAgLyogV2l0aCBCUkNNIGNvbnRyb2xsZXIsIHdlIGRvIG5vdCBuZWVkIHRvIGRlbGV0ZSB0aGUgc3RvcmVkIGxpbmsga2V5IGluCi0gICAgICAgY29udHJvbGxlci4KLSAgICAgICBJZiB0aGUgc3RhY2sgbWF5IHNpdCBvbiB0b3Agb2Ygb3RoZXIgY29udHJvbGxlciwgd2UgbWF5IG5lZWQgdGhpcwotICAgICAgIEJUTV9EZWxldGVTdG9yZWRMaW5rS2V5IChiZF9hZGRyLCBOVUxMKTsgKi8KLSAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfSURMRTsKLSAgICBidG1fc2VjX2V4ZWN1dGVfcHJvY2VkdXJlKHBfZGV2X3JlYyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgYnRtX3NlY19hdXRoX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIHRCVE1fUEFJUklOR19TVEFURSBvbGRfc3RhdGUgPSBidG1fY2IucGFpcmluZ19zdGF0ZTsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2X2J5X2hhbmRsZShoYW5kbGUpOwotICBib29sIGFyZV9ib25kaW5nID0gZmFsc2U7Ci0gIGJvb2wgd2FzX2F1dGhlbnRpY2F0aW5nID0gZmFsc2U7Ci0KLSAgaWYgKHBfZGV2X3JlYykgewotICAgIFZMT0coMikgPDwgX19mdW5jX18gPDwgIjogU2VjdXJpdHkgTWFuYWdlcjogaW4gc3RhdGU6ICIKLSAgICAgICAgICAgIDw8IGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKQotICAgICAgICAgICAgPDwgIiBoYW5kbGU6IiA8PCBoYW5kbGUgPDwgIiBzdGF0dXM6IiA8PCBzdGF0dXMKLSAgICAgICAgICAgIDw8ICJkZXYtPnNlY19zdGF0ZToiIDw8IHBfZGV2X3JlYy0+c2VjX3N0YXRlCi0gICAgICAgICAgICA8PCAiIGJkYToiIDw8IHBfZGV2X3JlYy0+YmRfYWRkcgotICAgICAgICAgICAgPDwgIlJOYW1lOiIgPDwgcF9kZXZfcmVjLT5zZWNfYmRfbmFtZTsKLSAgfSBlbHNlIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICI6IFNlY3VyaXR5IE1hbmFnZXI6IGluIHN0YXRlOiAiCi0gICAgICAgICAgICA8PCBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSkKLSAgICAgICAgICAgIDw8ICIgaGFuZGxlOiIgPDwgaGFuZGxlIDw8ICIgc3RhdHVzOiIgPDwgc3RhdHVzOwotICB9Ci0KLSAgLyogRm9yIHRyYW5zYWN0aW9uIGNvbGxpc2lvbiB3ZSBuZWVkIHRvIHdhaXQgYW5kIHJlcGVhdC4gIFRoZXJlIGlzIG5vIG5lZWQgKi8KLSAgLyogZm9yIHJhbmRvbSB0aW1lb3V0IGJlY2F1c2Ugb25seSBwZXJpcGhlcmFsIHNob3VsZCByZWNlaXZlIHRoZSByZXN1bHQgKi8KLSAgaWYgKChzdGF0dXMgPT0gSENJX0VSUl9MTVBfRVJSX1RSQU5TX0NPTExJU0lPTikgfHwKLSAgICAgIChzdGF0dXMgPT0gSENJX0VSUl9ESUZGX1RSQU5TQUNUSU9OX0NPTExJU0lPTikpIHsKLSAgICBidG1fc2VjX2F1dGhfY29sbGlzaW9uKGhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKGJ0bV9zZWNfYXV0aF9yZXRyeShoYW5kbGUsIHN0YXR1cykpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidG1fY2IuY29sbGlzaW9uX3N0YXJ0X3RpbWUgPSAwOwotCi0gIGJ0bV9yZXN0b3JlX21vZGUoKTsKLQotICAvKiBDaGVjayBpZiBjb25uZWN0aW9uIHdhcyBtYWRlIGp1c3QgdG8gZG8gYm9uZGluZy4gIElmIHdlIGF1dGhlbnRpY2F0ZQotICAgICB0aGUgY29ubmVjdGlvbiB0aGF0IGlzIHVwLCB0aGlzIGlzIHRoZSBsYXN0IGV2ZW50IHJlY2VpdmVkLgotICAqLwotICBpZiAocF9kZXZfcmVjICYmIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQpICYmCi0gICAgICAhKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfRElTQ19XSEVOX0RPTkUpKSB7Ci0gICAgcF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmPSB+QlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFOwotCi0gICAgbDJjdV9zdGFydF9wb3N0X2JvbmRfdGltZXIocF9kZXZfcmVjLT5oY2lfaGFuZGxlKTsKLSAgfQotCi0gIGlmICghcF9kZXZfcmVjKSByZXR1cm47Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkcpIHsKLSAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfSURMRTsKLSAgICB3YXNfYXV0aGVudGljYXRpbmcgPSB0cnVlOwotICAgIC8qIFRoZXJlIGNhbiBiZSBhIHJhY2UgY29uZGl0aW9uLCB3aGVuIHdlIGFyZSBzdGFydGluZyBhdXRoZW50aWNhdGlvbgotICAgICAqIGFuZCB0aGUgcGVlciBkZXZpY2UgaXMgZG9pbmcgZW5jcnlwdGlvbi4KLSAgICAgKiBJZiBmaXJzdCB3ZSByZWNlaXZlIGVuY3J5cHRpb24gY2hhbmdlIHVwLCB0aGVuIGluaXRpYXRlZAotICAgICAqIGF1dGhlbnRpY2F0aW9uIGNhbiBub3QgYmUgcGVyZm9ybWVkLgotICAgICAqIEFjY29yZGluZyB0byB0aGUgc3BlYyB3ZSBjYW4gbm90IGRvIGF1dGhlbnRpY2F0aW9uIG9uIHRoZQotICAgICAqIGVuY3J5cHRlZCBsaW5rLCBzbyBkZXZpY2UgaXMgY29ycmVjdC4KLSAgICAgKi8KLSAgICBpZiAoKHN0YXR1cyA9PSBIQ0lfRVJSX0NPTU1BTkRfRElTQUxMT1dFRCkgJiYKLSAgICAgICAgKChwX2Rldl9yZWMtPnNlY19mbGFncyAmIChCVE1fU0VDX0FVVEhFTlRJQ0FURUQgfCBCVE1fU0VDX0VOQ1JZUFRFRCkpID09Ci0gICAgICAgICAoQlRNX1NFQ19BVVRIRU5USUNBVEVEIHwgQlRNX1NFQ19FTkNSWVBURUQpKSkgewotICAgICAgc3RhdHVzID0gSENJX1NVQ0NFU1M7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfQVVUSEVOVElDQVRFRDsKLSAgICB9Ci0gIH0KLQotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpICYmCi0gICAgICAocF9kZXZfcmVjLT5iZF9hZGRyID09IGJ0bV9jYi5wYWlyaW5nX2JkYSkpIHsKLSAgICBpZiAoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSB7Ci0gICAgICBhcmVfYm9uZGluZyA9IHRydWU7Ci0gICAgfQotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gIH0KLQotICBpZiAod2FzX2F1dGhlbnRpY2F0aW5nID09IGZhbHNlKSB7Ci0gICAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUyAmJiBvbGRfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfSURMRSkgewotICAgICAgTm90aWZ5Qm9uZGluZ0NoYW5nZSgqcF9kZXZfcmVjLCBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBDdXJyZW50bHkgd2UgZG8gbm90IG5vdGlmeSB1c2VyIGlmIGl0IGlzIGEga2V5Ym9hcmQgd2hpY2ggY29ubmVjdHMgKi8KLSAgLyogVXNlciBwcm9iYWJseSBEaXNhYmxlZCB0aGUga2V5Ym9hcmQgd2hpbGUgaXQgd2FzIGFzbGVhcC4gIExldCB0aGVtIHRyeSAqLwotICBpZiAoYnRtX2NiLmFwaS5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2spIHsKLSAgICAvKiByZXBvcnQgdGhlIHN1dGhlbnRpY2F0aW9uIHN0YXR1cyAqLwotICAgIGlmICgob2xkX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpIHx8IChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpKQotICAgICAgKCpidG1fY2IuYXBpLnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjaykocF9kZXZfcmVjLT5iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNlY19iZF9uYW1lLCBzdGF0dXMpOwotICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGJvbmRpbmcgcHJvY2VkdXJlIGNhbiBkaXNjb25uZWN0IHRoZSBsaW5rIG5vdyAqLwotICBpZiAoYXJlX2JvbmRpbmcpIHsKLSAgICBwX2Rldl9yZWMtPnNlY3VyaXR5X3JlcXVpcmVkICY9IH5CVE1fU0VDX09VVF9BVVRIRU5USUNBVEU7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICBpZiAoKChzdGF0dXMgIT0gSENJX0VSUl9QRUVSX1VTRVIpICYmCi0gICAgICAgICAgIChzdGF0dXMgIT0gSENJX0VSUl9DT05OX0NBVVNFX0xPQ0FMX0hPU1QpKSkKLSAgICAgICAgYnRtX3NlY19zZW5kX2hjaV9kaXNjb25uZWN0KHBfZGV2X3JlYywgSENJX0VSUl9QRUVSX1VTRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPmhjaV9oYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBwX2Rldl9yZWMtPmJkX2FkZHIsICJCb25kaW5nIGNvbXBsZXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXR1cykpOwotICAgICAgQlRNX1RSQUNFX0RFQlVHKCJUUllJTkcgVE8gREVDSURFIElGIENBTiBVU0UgU01QX0JSX0NITkwiKTsKLSAgICAgIGlmIChwX2Rldl9yZWMtPm5ld19lbmNyeXB0aW9uX2tleV9pc19wMjU2ICYmCi0gICAgICAgICAgKGJ0bV9zZWNfdXNlX3NtcF9icl9jaG5sKHBfZGV2X3JlYykpCi0gICAgICAgICAgLyogbm8gTEUga2V5cyBhcmUgYXZhaWxhYmxlLCBkbyBkZXJpdmluZyAqLwotICAgICAgICAgICYmICghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTikgfHwKLSAgICAgICAgICAgICAgLyogb3IgQlIga2V5IGlzIGhpZ2hlciBzZWN1cml0eSB0aGFuIGV4aXN0aW5nIExFIGtleXMgKi8KLSAgICAgICAgICAgICAgKCEocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRCkgJiYKLSAgICAgICAgICAgICAgIChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfTElOS19LRVlfQVVUSEVEKSkpKSB7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICJsaW5rIGVuY3J5cHRlZCBhZmVyIGRlZGljIGJvbmRpbmcgY2FuIHVzZSBTTVBfQlJfQ0hOTCIpOwotCi0gICAgICAgIHRIQ0lfUk9MRSByb2xlID0gSENJX1JPTEVfVU5LTk9XTjsKLSAgICAgICAgQlRNX0dldFJvbGUocF9kZXZfcmVjLT5iZF9hZGRyLCAmcm9sZSk7Ci0gICAgICAgIGlmIChyb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICAgICAgICAvLyBFbmNyeXB0aW9uIGlzIHJlcXVpcmVkIHRvIHN0YXJ0IFNNIG92ZXIgQlIvRURSCi0gICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuY3J5cHRpb24gYWZ0ZXIgYXV0aGVudGljYXRpb24KLSAgICAgICAgICBCVE1fU2V0RW5jcnlwdGlvbihwX2Rldl9yZWMtPmJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9TRUNfTk9ORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocF9kZXZfcmVjLT5Jc0xvY2FsbHlJbml0aWF0ZWQoKSkgewotICAgICAgICAgIC8vIEVuY3J5cHRpb24gd2lsbCBiZSBzZXQgaW4gcm9sZV9jaGFuZ2VkIGNhbGxiYWNrCi0gICAgICAgICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgICAiJXMgYXV0aCBjb21wbGV0ZWQgaW4gcm9sZT1wZXJpcGhlcmFsLCB0cnkgdG8gc3dpdGNoIHJvbGUgYW5kICIKLSAgICAgICAgICAgICAgImVuY3J5cHQiLAotICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgICAgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwocF9kZXZfcmVjLT5SZW1vdGVBZGRyZXNzKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsMmN1X3N0YXJ0X3Bvc3RfYm9uZF90aW1lcihwX2Rldl9yZWMtPmhjaV9oYW5kbGUpOwotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgbm90aWZ5IHRoZSB3YWl0aW5nIGxheWVyICovCi0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBCVE1fRVJSX1BST0NFU1NJTkcsIGZhbHNlKTsKLQotICAgIGlmIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX0RJU0NfV0hFTl9ET05FKSB7Ci0gICAgICBidG1fc2VjX3NlbmRfaGNpX2Rpc2Nvbm5lY3QocF9kZXZfcmVjLCBIQ0lfRVJSX0FVVEhfRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPmhjaV9oYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9kZXZfcmVjLT5waW5fY29kZV9sZW5ndGggPj0gMTYgfHwKLSAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQiB8fAotICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlID09IEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2KSB7Ci0gICAgLy8gSWYgd2UgaGF2ZSBNSVRNIHByb3RlY3Rpb24gd2UgaGF2ZSBhIGhpZ2hlciBsZXZlbCBvZiBzZWN1cml0eSB0aGFuCi0gICAgLy8gcHJvdmlkZWQgYnkgMTYgZGlnaXRzIFBJTgotICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRDsKLSAgfQotCi0gIC8qIEF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgZXhlY3V0ZSB0aGUgbmV4dCBzZWN1cml0eSBwcm9jZWR1cmUsIGlmIGFueSAqLwotICB0QlRNX1NUQVRVUyBidG1fc3RhdHVzID0gYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZShwX2Rldl9yZWMpOwotCi0gIC8qIElmIHRoZXJlIGlzIG5vIG5leHQgcHJvY2VkdXJlLCBvciBwcm9jZWR1cmUgZmFpbGVkIHRvIHN0YXJ0LCBub3RpZnkgdGhlCi0gICAqIGNhbGxlciAqLwotICBpZiAoYnRtX3N0YXR1cyAhPSBCVE1fQ01EX1NUQVJURUQpCi0gICAgYnRtX3NlY19kZXZfcmVjX2NiYWNrX2V2ZW50KHBfZGV2X3JlYywgYnRtX3N0YXR1cywgZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19lbmNyeXB0X2NoYW5nZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB3aGVuIGVuY3J5cHRpb24gb2YgdGhlIGNvbm5lY3Rpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgY29tcGxldGVkIGJ5IHRoZSBMTQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfZW5jcnlwdF9jaGFuZ2UodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNyX2VuYWJsZSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXZfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIEJUTV9UUkFDRV9FVkVOVCgKLSAgICAgICJTZWN1cml0eSBNYW5hZ2VyOiBlbmNyeXB0X2NoYW5nZSBzdGF0dXM6JWQgU3RhdGU6JWQsIGVuY3JfZW5hYmxlID0gJWQiLAotICAgICAgc3RhdHVzLCAocF9kZXZfcmVjKSA/IHBfZGV2X3JlYy0+c2VjX3N0YXRlIDogMCwgZW5jcl9lbmFibGUpOwotICBCVE1fVFJBQ0VfREVCVUcoImJlZm9yZSB1cGRhdGUgcF9kZXZfcmVjLT5zZWNfZmxhZ3M9MHgleCIsCi0gICAgICAgICAgICAgICAgICAocF9kZXZfcmVjKSA/IHBfZGV2X3JlYy0+c2VjX2ZsYWdzIDogMCk7Ci0KLSAgLyogRm9yIHRyYW5zYWN0aW9uIGNvbGxpc2lvbiB3ZSBuZWVkIHRvIHdhaXQgYW5kIHJlcGVhdC4gIFRoZXJlIGlzIG5vIG5lZWQgKi8KLSAgLyogZm9yIHJhbmRvbSB0aW1lb3V0IGJlY2F1c2Ugb25seSBwZXJpcGhlcmFsIHNob3VsZCByZWNlaXZlIHRoZSByZXN1bHQgKi8KLSAgaWYgKChzdGF0dXMgPT0gSENJX0VSUl9MTVBfRVJSX1RSQU5TX0NPTExJU0lPTikgfHwKLSAgICAgIChzdGF0dXMgPT0gSENJX0VSUl9ESUZGX1RSQU5TQUNUSU9OX0NPTExJU0lPTikpIHsKLSAgICBidG1fc2VjX2F1dGhfY29sbGlzaW9uKGhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJ0bV9jYi5jb2xsaXNpb25fc3RhcnRfdGltZSA9IDA7Ci0KLSAgaWYgKCFwX2Rldl9yZWMpIHJldHVybjsKLQotICBpZiAoKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgJiYgZW5jcl9lbmFibGUpIHsKLSAgICBpZiAocF9kZXZfcmVjLT5oY2lfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0gKEJUTV9TRUNfQVVUSEVOVElDQVRFRCB8IEJUTV9TRUNfRU5DUllQVEVEKTsKLSAgICAgIGlmIChwX2Rldl9yZWMtPnBpbl9jb2RlX2xlbmd0aCA+PSAxNiB8fAotICAgICAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQiB8fAotICAgICAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikgewotICAgICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyB8PSBCVE1fU0VDXzE2X0RJR0lUX1BJTl9BVVRIRUQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IChCVE1fU0VDX0xFX0FVVEhFTlRJQ0FURUQgfCBCVE1fU0VDX0xFX0VOQ1JZUFRFRCk7Ci0gICAgfQotICB9Ci0KLSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBkZWNyeXB0ZWQgdGhlIGxpbmsgdG8gcGVyZm9ybSByb2xlIHN3aXRjaCAqLwotICAvKiBtYXJrIGxpbmsgbm90IHRvIGJlIGVuY3J5cHRlZCwgc28gdGhhdCB3aGVuIHdlIGV4ZWN1dGUgc2VjdXJpdHkgbmV4dCB0aW1lCi0gICAqIGl0IHdpbGwga2ljayBpbiBhZ2FpbiAqLwotICBpZiAoKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgJiYgIWVuY3JfZW5hYmxlKSB7Ci0gICAgaWYgKHBfZGV2X3JlYy0+aGNpX2hhbmRsZSA9PSBoYW5kbGUpCi0gICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+QlRNX1NFQ19FTkNSWVBURUQ7Ci0gICAgZWxzZQotICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0gfkJUTV9TRUNfTEVfRU5DUllQVEVEOwotICB9Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJhZnRlciB1cGRhdGUgcF9kZXZfcmVjLT5zZWNfZmxhZ3M9MHgleCIsCi0gICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyk7Ci0KLSAgYXV0byB0cmFuc3BvcnQgPQotICAgICAgQlRNX0lzQmxlQ29ubmVjdGlvbihoYW5kbGUpID8gQlRfVFJBTlNQT1JUX0xFIDogQlRfVFJBTlNQT1JUX0JSX0VEUjsKLSAgYnRtX3NlY19jaGVja19wZW5kaW5nX2VuY19yZXEocF9kZXZfcmVjLCB0cmFuc3BvcnQsIGVuY3JfZW5hYmxlKTsKLQotICBpZiAoQlRNX0lzQmxlQ29ubmVjdGlvbihoYW5kbGUpKSB7Ci0gICAgaWYgKHN0YXR1cyA9PSBIQ0lfRVJSX0tFWV9NSVNTSU5HIHx8IHN0YXR1cyA9PSBIQ0lfRVJSX0FVVEhfRkFJTFVSRSB8fAotICAgICAgICBzdGF0dXMgPT0gSENJX0VSUl9FTkNSWV9NT0RFX05PVF9BQ0NFUFRBQkxFKSB7Ci0gICAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+KEJUTV9TRUNfTEVfTElOS19LRVlfS05PV04pOwotICAgICAgcF9kZXZfcmVjLT5ibGUua2V5X3R5cGUgPSBCVE1fTEVfS0VZX05PTkU7Ci0gICAgfQotICAgIGJ0bV9ibGVfbGlua19lbmNyeXB0ZWQocF9kZXZfcmVjLT5ibGUucHNldWRvX2FkZHIsIGVuY3JfZW5hYmxlKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSB7Ci0gICAgLyogQlIvRURSIGNvbm5lY3Rpb24sIHVwZGF0ZSB0aGUgZW5jcnlwdGlvbiBrZXkgc2l6ZSB0byBiZSAxNiBhcyBhbHdheXMgKi8KLSAgICBwX2Rldl9yZWMtPmVuY19rZXlfc2l6ZSA9IDE2OwotICB9Ci0KLSAgQlRNX1RSQUNFX0RFQlVHKCJpbiAlcyBuZXdfZW5jcl9rZXlfMjU2IGlzICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPm5ld19lbmNyeXB0aW9uX2tleV9pc19wMjU2KTsKLQotICBpZiAoKHN0YXR1cyA9PSBIQ0lfU1VDQ0VTUykgJiYgZW5jcl9lbmFibGUgJiYKLSAgICAgIChwX2Rldl9yZWMtPmhjaV9oYW5kbGUgPT0gaGFuZGxlKSkgewotICAgIC8qIGlmIEJSIGtleSBpcyB0ZW1wb3Jhcnkgbm8gbmVlZCBmb3IgTEUgTFRLIGRlcml2YXRpb24gKi8KLSAgICBib29sIGRlcml2ZV9sdGsgPSB0cnVlOwotICAgIGlmIChwX2Rldl9yZWMtPnJtdF9hdXRoX3JlcSA9PSBCVE1fQVVUSF9TUF9OTyAmJgotICAgICAgICBidG1fY2IuZGV2Y2IubG9jX2F1dGhfcmVxID09IEJUTV9BVVRIX1NQX05PKSB7Ci0gICAgICBkZXJpdmVfbHRrID0gZmFsc2U7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBCUiBrZXkgaXMgdGVtcG9yYXJ5LCBza2lwIGRlcml2YXRpb24gb2YgTEUgTFRLIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgfQotICAgIHRIQ0lfUk9MRSByb2xlID0gSENJX1JPTEVfVU5LTk9XTjsKLSAgICBCVE1fR2V0Um9sZShwX2Rldl9yZWMtPmJkX2FkZHIsICZyb2xlKTsKLSAgICBpZiAocF9kZXZfcmVjLT5uZXdfZW5jcnlwdGlvbl9rZXlfaXNfcDI1NikgewotICAgICAgaWYgKGJ0bV9zZWNfdXNlX3NtcF9icl9jaG5sKHBfZGV2X3JlYykgJiYgcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMICYmCi0gICAgICAgICAgLyogaWYgTEUga2V5IGlzIG5vdCBrbm93biwgZG8gZGVyaXZpbmcgKi8KLSAgICAgICAgICAoIShwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfTEVfTElOS19LRVlfS05PV04pIHx8Ci0gICAgICAgICAgIC8qIG9yIEJSIGtleSBpcyBoaWdoZXIgc2VjdXJpdHkgdGhhbiBleGlzdGluZyBMRSBrZXlzICovCi0gICAgICAgICAgICghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MRV9MSU5LX0tFWV9BVVRIRUQpICYmCi0gICAgICAgICAgICAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xJTktfS0VZX0FVVEhFRCkpKSAmJgotICAgICAgICAgIGRlcml2ZV9sdGspIHsKLSAgICAgICAgLyogQlIvRURSIGlzIGVuY3J5cHRlZCB3aXRoIExLIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVyaXZlIExFIExUSyAqLwotICAgICAgICBwX2Rldl9yZWMtPm5ld19lbmNyeXB0aW9uX2tleV9pc19wMjU2ID0gZmFsc2U7Ci0KLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlcyBzdGFydCBTTSBvdmVyIEJSL0VEUiIsIF9fZnVuY19fKTsKLSAgICAgICAgU01QX0JSX1BhaXJXaXRoKHBfZGV2X3JlYy0+YmRfYWRkcik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEJSL0VEUiBpcyBzdWNjZXNzZnVsbHkgZW5jcnlwdGVkLiBDb3JyZWN0IExLIHR5cGUgaWYgbmVlZGVkCi0gICAgICAvLyAoQlIvRURSIExLIGRlcml2ZWQgZnJvbSBMRSBMVEsgd2FzIHVzZWQgZm9yIGVuY3J5cHRpb24pCi0gICAgICBpZiAoKGVuY3JfZW5hYmxlID09IDEpICYmIC8qIGVuY3J5cHRpb24gaXMgT04gZm9yIFNTUCAqLwotICAgICAgICAgIC8qIExLIHR5cGUgaXMgZm9yIEJSL0VEUiBTQyAqLwotICAgICAgICAgIChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPT0gQlRNX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NiB8fAotICAgICAgICAgICBwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPT0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTYpKSB7Ci0gICAgICAgIGlmIChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPT0gQlRNX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NikKLSAgICAgICAgICBwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPSBCVE1fTEtFWV9UWVBFX1VOQVVUSF9DT01COwotICAgICAgICBlbHNlIC8qIEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2ICovCi0gICAgICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlID0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUI7Ci0KLSAgICAgICAgQlRNX1RSQUNFX0RFQlVHKCJ1cGRhdGVkIGxpbmsga2V5IHR5cGUgdG8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlKTsKLSAgICAgICAgYnRtX3NlbmRfbGlua19rZXlfbm90aWYocF9kZXZfcmVjKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBJZiB0aGlzIGVuY3J5cHRpb24gd2FzIHN0YXJ0ZWQgYnkgcGVlciBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLwotICBpZiAocF9kZXZfcmVjLT5zZWNfc3RhdGUgIT0gQlRNX1NFQ19TVEFURV9FTkNSWVBUSU5HKSB7Ci0gICAgaWYgKEJUTV9TRUNfU1RBVEVfREVMQVlfRk9SX0VOQyA9PSBwX2Rldl9yZWMtPnNlY19zdGF0ZSkgewotICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0lETEU7Ci0gICAgICBCVE1fVFJBQ0VfREVCVUcoIiVzOiBjbGVhcmluZyBjYWxsYmFjay4gcF9kZXZfcmVjPSVwLCBwX2NhbGxiYWNrPSVwIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kZXZfcmVjLCBwX2Rldl9yZWMtPnBfY2FsbGJhY2spOwotICAgICAgcF9kZXZfcmVjLT5wX2NhbGxiYWNrID0gTlVMTDsKLSAgICAgIGwyY3VfcmVzdWJtaXRfcGVuZGluZ19zZWNfcmVxKCZwX2Rldl9yZWMtPmJkX2FkZHIpOwotI2lmZGVmIEJUTV9ESVNBQkxFX0NPTkNVUlJFTlRfUEVFUl9BVVRICi0gICAgfSBlbHNlIGlmIChCVE1fRElTQUJMRV9DT05DVVJSRU5UX1BFRVJfQVVUSCAmJgotICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORykgewotICAgICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0lETEU7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0lETEU7Ci0gIC8qIElmIGVuY3J5cHRpb24gc2V0dXAgZmFpbGVkLCBub3RpZnkgdGhlIHdhaXRpbmcgbGF5ZXIgKi8KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIGJ0bV9zZWNfZGV2X3JlY19jYmFja19ldmVudChwX2Rldl9yZWMsIEJUTV9FUlJfUFJPQ0VTU0lORywgZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEVuY3J5cHRpb24gc2V0dXAgc3VjY2VlZGVkLCBleGVjdXRlIHRoZSBuZXh0IHNlY3VyaXR5IHByb2NlZHVyZSwgaWYgYW55ICovCi0gIHRCVE1fU1RBVFVTIGJ0bV9zdGF0dXMgPSBidG1fc2VjX2V4ZWN1dGVfcHJvY2VkdXJlKHBfZGV2X3JlYyk7Ci0gIC8qIElmIHRoZXJlIGlzIG5vIG5leHQgcHJvY2VkdXJlLCBvciBwcm9jZWR1cmUgZmFpbGVkIHRvIHN0YXJ0LCBub3RpZnkgdGhlCi0gICAqIGNhbGxlciAqLwotICBpZiAoc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkKLSAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBidG1fc3RhdHVzLCBmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2Nvbm5lY3RfYWZ0ZXJfcmVqZWN0X3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbm5lY3Rpb24gZm9yIGJvbmRpbmcgY291bGQgbm90IHN0YXJ0IGJlY2F1c2Ugb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbi4gSW5pdGlhdGUgb3V0Z29pbmcgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgVExFIHN0cnVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fc2VjX2Nvbm5lY3RfYWZ0ZXJfcmVqZWN0X3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fY2IucF9jb2xsaWRlZF9kZXZfcmVjOwotCi0gIEJUTV9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0bV9jYi5wX2NvbGxpZGVkX2Rldl9yZWMgPSAwOwotCi0gIGlmIChidG1fc2VjX2RkX2NyZWF0ZV9jb25uKHBfZGV2X3JlYykgIT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoIlNlY3VyaXR5IE1hbmFnZXI6ICVzOiBmYWlsZWQgdG8gc3RhcnQgY29ubmVjdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotCi0gICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLQotICAgIE5vdGlmeUJvbmRpbmdDaGFuZ2UoKnBfZGV2X3JlYywgSENJX0VSUl9NRU1PUllfRlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfY29ubmVjdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHdoZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIGRldmljZSBpcwotICogICAgICAgICAgICAgICAgICBlc3RhYmxpc2hlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgZW5jX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSBhc3NpZ25lZF9yb2xlKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZGEpOwotICB0QlRNX1NUQVRVUyByZXM7Ci0gIGJvb2wgaXNfcGFpcmluZ19kZXZpY2UgPSBmYWxzZTsKLSAgYm9vbCBhZGRyX21hdGNoZWQ7Ci0gIHVpbnQ4X3QgYml0X3NoaWZ0ID0gMDsKLQotICBidG1fYWNsX3Jlc3VibWl0X3BhZ2UoKTsKLQotICBpZiAoIXBfZGV2X3JlYykgewotICAgIExPR19ERUJVRygKLSAgICAgICAgIkNvbm5lY3RlZCB0byBuZXcgZGV2aWNlIHN0YXRlOiVzIGhhbmRsZToweCUwNHggc3RhdHVzOiVzICIKLSAgICAgICAgImVuY19tb2RlOiVoaHUgYmRhOiVzIiwKLSAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpLCBoYW5kbGUsCi0gICAgICAgIGhjaV9zdGF0dXNfY29kZV90ZXh0KHN0YXR1cykuY19zdHIoKSwgZW5jX21vZGUsIFBSSVZBVEVfQUREUkVTUyhiZGEpKTsKLQotICAgIGlmIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIHBfZGV2X3JlYyA9IGJ0bV9zZWNfYWxsb2NfZGV2KGJkYSk7Ci0gICAgICBMT0dfREVCVUcoIkFsbG9jYXRlZCBuZXcgZGV2aWNlIHJlY29yZCBmb3IgbmV3IGNvbm5lY3Rpb24gcGVlcjolcyIsCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkYSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBJZiB0aGUgZGV2aWNlIG1hdGNoZXMgd2l0aCBzdG9yZWQgcGFyaW5nIGFkZHJlc3MKLSAgICAgICAqIHJlc2V0IHRoZSBwYXJpbmcgc3RhdGUgdG8gaWRsZSAqLwotICAgICAgaWYgKChidG1fY2IucGFpcmluZ19zdGF0ZSAhPSBCVE1fUEFJUl9TVEFURV9JRExFKSAmJgotICAgICAgICAgIGJ0bV9jYi5wYWlyaW5nX2JkYSA9PSBiZGEpIHsKLSAgICAgICAgTE9HX1dBUk4oIkNvbm5lY3Rpb24gZmFpbGVkIGR1cmluZyBib25kaW5nIGF0dGVtcHQgcGVlcjolcyByZWFzb246JXMiLAotICAgICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRhKSwgaGNpX2Vycm9yX2NvZGVfdGV4dChzdGF0dXMpLmNfc3RyKCkpOwotICAgICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotICAgICAgfQotCi0gICAgICBMT0dfREVCVUcoIklnbm9yaW5nIGZhaWxlZCBkZXZpY2UgY29ubmVjdGlvbiBwZWVyOiVzIHJlYXNvbjolcyIsCi0gICAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkYSksIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdHVzKS5jX3N0cigpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSAvKiBVcGRhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhpcyBkZXZpY2UgKi8KLSAgewotICAgIExPR19ERUJVRygKLSAgICAgICAgIkNvbm5lY3RlZCB0byBrbm93biBkZXZpY2Ugc3RhdGU6JXMgaGFuZGxlOjB4JTA0eCBzdGF0dXM6JXMgIgotICAgICAgICAiZW5jX21vZGU6JWhodSBiZGE6JXMgUk5hbWU6JXMiLAotICAgICAgICBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSksIGhhbmRsZSwKLSAgICAgICAgaGNpX3N0YXR1c19jb2RlX3RleHQoc3RhdHVzKS5jX3N0cigpLCBlbmNfbW9kZSwgUFJJVkFURV9BRERSRVNTKGJkYSksCi0gICAgICAgIHBfZGV2X3JlYy0+c2VjX2JkX25hbWUpOwotCi0gICAgYml0X3NoaWZ0ID0gKGhhbmRsZSA9PSBwX2Rldl9yZWMtPmJsZV9oY2lfaGFuZGxlKSA/IDggOiAwOwotICAgIHBfZGV2X3JlYy0+dGltZXN0YW1wID0gYnRtX2NiLmRldl9yZWNfY291bnQrKzsKLSAgICBpZiAocF9kZXZfcmVjLT5zbTQgJiBCVE1fU000X0NPTk5fUEVORCkgewotICAgICAgLyogdGVsbCBMMkNBUCBpdCdzIGEgYm9uZGluZyBjb25uZWN0aW9uLiAqLwotICAgICAgaWYgKChidG1fY2IucGFpcmluZ19zdGF0ZSAhPSBCVE1fUEFJUl9TVEFURV9JRExFKSAmJgotICAgICAgICAgIChidG1fY2IucGFpcmluZ19iZGEgPT0gcF9kZXZfcmVjLT5iZF9hZGRyKSAmJgotICAgICAgICAgIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQpKSB7Ci0gICAgICAgIC8qIGlmIGluY29taW5nIGNvbm5lY3Rpb24gZmFpbGVkIHdoaWxlIHBhaXJpbmcsIHRoZW4gdHJ5IHRvIGNvbm5lY3QgYW5kCi0gICAgICAgICAqIGNvbnRpbnVlICovCi0gICAgICAgIC8qIE1vdG9yb2xhIFM5IGRpc2Nvbm5lY3RzIHdpdGhvdXQgYXNraW5nIHBpbiBjb2RlICovCi0gICAgICAgIGlmICgoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSAmJgotICAgICAgICAgICAgKGJ0bV9jYi5wYWlyaW5nX3N0YXRlID09IEJUTV9QQUlSX1NUQVRFX1dBSVRfUElOX1JFUSkpIHsKLSAgICAgICAgICBCVE1fVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIlNlY3VyaXR5IE1hbmFnZXI6IGJ0bV9zZWNfY29ubmVjdGVkOiBpbmNvbWluZyBjb25uZWN0aW9uIGZhaWxlZCAiCi0gICAgICAgICAgICAgICJ3aXRob3V0IGFza2luZyBQSU4iKTsKLQotICAgICAgICAgIHBfZGV2X3JlYy0+c200ICY9IH5CVE1fU000X0NPTk5fUEVORDsKLSAgICAgICAgICBpZiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX05BTUVfS05PV04pIHsKLSAgICAgICAgICAgIC8qIFN0YXJ0IHRpbWVyIHdpdGggMCB0byBpbml0aWF0ZSBjb25uZWN0aW9uIHdpdGggbmV3IExDQiAqLwotICAgICAgICAgICAgLyogYmVjYXVzZSBMMkNBUCB3aWxsIGRlbGV0ZSBjdXJyZW50IExDQiB3aXRoIHRoaXMgZXZlbnQgICovCi0gICAgICAgICAgICBidG1fY2IucF9jb2xsaWRlZF9kZXZfcmVjID0gcF9kZXZfcmVjOwotICAgICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKGJ0bV9jYi5zZWNfY29sbGlzaW9uX3RpbWVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9zZWNfY29ubmVjdF9hZnRlcl9yZWplY3RfdGltZW91dCwgTlVMTCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfR0VUX1JFTV9OQU1FKTsKLSAgICAgICAgICAgIGlmIChCVE1fUmVhZFJlbW90ZURldmljZU5hbWUocF9kZXZfcmVjLT5iZF9hZGRyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9UUkFOU1BPUlRfQlJfRURSKSAhPQotICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgICAgICAgICBCVE1fVFJBQ0VfRVJST1IoIiVzIGNhbm5vdCByZWFkIHJlbW90ZSBuYW1lIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbDJjdV91cGRhdGVfbGNiXzRfYm9uZGluZyhwX2Rldl9yZWMtPmJkX2FkZHIsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBhbHdheXMgY2xlYXIgdGhlIHBlbmRpbmcgZmxhZyAqLwotICAgICAgcF9kZXZfcmVjLT5zbTQgJj0gfkJUTV9TTTRfQ09OTl9QRU5EOwotICAgIH0KLSAgfQotCi0gIHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGUgfD0gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci0KLSAgYWRkcl9tYXRjaGVkID0gKGJ0bV9jYi5wYWlyaW5nX2JkYSA9PSBiZGEpOwotCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfSURMRSkgJiYgYWRkcl9tYXRjaGVkKSB7Ci0gICAgLyogaWYgd2UgcmVqZWN0ZWQgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGJvbmRpbmcgZGV2aWNlICovCi0gICAgaWYgKChzdGF0dXMgPT0gSENJX0VSUl9IT1NUX1JFSkVDVF9ERVZJQ0UpICYmCi0gICAgICAgIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1JFSkVDVEVEX0NPTk5FQ1QpKSB7Ci0gICAgICBCVE1fVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiU2VjdXJpdHkgTWFuYWdlcjogYnRtX3NlY19jb25uZWN0ZWQ6IEhDSV9Db25uX0NvbXAgRmxhZ3M6MHglMDR4LCAiCi0gICAgICAgICAgInNtNDogMHgleCIsCi0gICAgICAgICAgYnRtX2NiLnBhaXJpbmdfZmxhZ3MsIHBfZGV2X3JlYy0+c200KTsKLQotICAgICAgYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJj0gfkJUTV9QQUlSX0ZMQUdTX1JFSkVDVEVEX0NPTk5FQ1Q7Ci0gICAgICBpZiAoQlRNX1NFQ19JU19TTTRfVU5LTk9XTihwX2Rldl9yZWMtPnNtNCkpIHsKLSAgICAgICAgLyogVHJ5IGFnYWluOiBSTlIgd2hlbiBubyBBQ0wgY2F1c2VzIEhDSV9STVRfSE9TVF9TVVBfRkVBVF9OT1RJRllfRVZUICovCi0gICAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfR0VUX1JFTV9OQU1FKTsKLSAgICAgICAgaWYgKEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShiZGEsIE5VTEwsIEJUX1RSQU5TUE9SVF9CUl9FRFIpICE9Ci0gICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgICAgICBCVE1fVFJBQ0VfRVJST1IoIiVzIGNhbm5vdCByZWFkIHJlbW90ZSBuYW1lIiwgX19mdW5jX18pOwotICAgICAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBpZiB3ZSBhbHJlYWR5IGhhdmUgcGluIGNvZGUgKi8KLSAgICAgIGlmIChidG1fY2IucGFpcmluZ19zdGF0ZSAhPSBCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX1BJTikgewotICAgICAgICAvKiBTdGFydCB0aW1lciB3aXRoIDAgdG8gaW5pdGlhdGUgY29ubmVjdGlvbiB3aXRoIG5ldyBMQ0IgKi8KLSAgICAgICAgLyogYmVjYXVzZSBMMkNBUCB3aWxsIGRlbGV0ZSBjdXJyZW50IExDQiB3aXRoIHRoaXMgZXZlbnQgICovCi0gICAgICAgIGJ0bV9jYi5wX2NvbGxpZGVkX2Rldl9yZWMgPSBwX2Rldl9yZWM7Ci0gICAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChidG1fY2Iuc2VjX2NvbGxpc2lvbl90aW1lciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9zZWNfY29ubmVjdF9hZnRlcl9yZWplY3RfdGltZW91dCwgTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLyogd2FpdCBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiB3aXRob3V0IHJlc2V0dGluZyBwYWlyaW5nIHN0YXRlICovCi0gICAgZWxzZSBpZiAoc3RhdHVzID09IEhDSV9FUlJfQ09OTkVDVElPTl9FWElTVFMpIHsKLSAgICAgIEJUTV9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICJTZWN1cml0eSBNYW5hZ2VyOiBidG1fc2VjX2Nvbm5lY3RlZDogV2FpdCBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlzX3BhaXJpbmdfZGV2aWNlID0gdHJ1ZTsKLSAgfQotCi0gIC8qIElmIGNvbm5lY3Rpb24gd2FzIG1hZGUgdG8gZG8gYm9uZGluZyByZXN0b3JlIGxpbmsgc2VjdXJpdHkgaWYgY2hhbmdlZCAqLwotICBidG1fcmVzdG9yZV9tb2RlKCk7Ci0KLSAgLyogaWYgY29ubmVjdGlvbiBmYWlscyBkdXJpbmcgcGluIHJlcXVlc3QsIG5vdGlmeSBhcHBsaWNhdGlvbiAqLwotICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgLyogSWYgY29ubmVjdGlvbiBmYWlsZWQgYmVjYXVzZSBvZiBkdXJpbmcgcGFpcmluZywgbmVlZCB0byB0ZWxsIHVzZXIgKi8KLSAgICBpZiAoaXNfcGFpcmluZ19kZXZpY2UpIHsKLSAgICAgIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJj0gfkJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURTsKLSAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzICY9Ci0gICAgICAgICAgfigoQlRNX1NFQ19MSU5LX0tFWV9LTk9XTiB8IEJUTV9TRUNfTElOS19LRVlfQVVUSEVEKSA8PCBiaXRfc2hpZnQpOwotICAgICAgQlRNX1RSQUNFX0RFQlVHKCJzZWN1cml0eV9yZXF1aXJlZDoleCAiLCBwX2Rldl9yZWMtPnNlY3VyaXR5X3JlcXVpcmVkKTsKLQotICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLQotICAgICAgLyogV2UgbmVlZCB0byBub3RpZnkgaG9zdCB0aGF0IHRoZSBrZXkgaXMgbm90IGtub3duIGFueSBtb3JlICovCi0gICAgICBOb3RpZnlCb25kaW5nQ2hhbmdlKCpwX2Rldl9yZWMsIHN0YXR1cyk7Ci0gICAgfQotICAgIC8qCi0gICAgICAgIERvIG5vdCBzZW5kIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUsIGlmIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQgZ29vZAotICAgICAgICAgMS4gIEJUTSBTZWMgUGFpcmluZyBzdGF0ZSBpcyBpZGxlCi0gICAgICAgICAyLiAgTGluayBrZXkgZm9yIHRoZSByZW1vdGUgZGV2aWNlIGlzIHByZXNlbnQuCi0gICAgICAgICAzLiAgUmVtb3RlIGlzIFNTUCBjYXBhYmxlLgotICAgICAqLwotICAgIGVsc2UgaWYgKChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPD0gQlRNX0xLRVlfVFlQRV9SRU1PVEVfVU5JVCkgJiYKLSAgICAgICAgICAgICAoKChzdGF0dXMgPT0gSENJX0VSUl9BVVRIX0ZBSUxVUkUpIHx8Ci0gICAgICAgICAgICAgICAoc3RhdHVzID09IEhDSV9FUlJfS0VZX01JU1NJTkcpIHx8Ci0gICAgICAgICAgICAgICAoc3RhdHVzID09IEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFkpIHx8Ci0gICAgICAgICAgICAgICAoc3RhdHVzID09IEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRCkgfHwKLSAgICAgICAgICAgICAgIChzdGF0dXMgPT0gSENJX0VSUl9VTklUX0tFWV9VU0VEKSB8fAotICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBIQ0lfRVJSX1BBSVJJTkdfV0lUSF9VTklUX0tFWV9OT1RfU1VQUE9SVEVEKSB8fAotICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBIQ0lfRVJSX0VOQ1JZX01PREVfTk9UX0FDQ0VQVEFCTEUpIHx8Ci0gICAgICAgICAgICAgICAoc3RhdHVzID09IEhDSV9FUlJfUkVQRUFURURfQVRURU1QVFMpKSkpIHsKLSAgICAgIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJj0gfkJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURTsKLSAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzICY9IH4oQlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTiA8PCBiaXRfc2hpZnQpOwotCi0jaWZkZWYgQlJDTV9OT1RfNF9CVEUKLSAgICAgIC8qIElmIHdlIHJlamVjdGVkIHBhaXJpbmcsIHBhc3MgdGhpcyBzcGVjaWFsIHJlc3VsdCBjb2RlICovCi0gICAgICBpZiAoYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbihIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZKSkgewotICAgICAgICBzdGF0dXMgPSBIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIC8qIFdlIG5lZWQgdG8gbm90aWZ5IGhvc3QgdGhhdCB0aGUga2V5IGlzIG5vdCBrbm93biBhbnkgbW9yZSAqLwotICAgICAgTm90aWZ5Qm9uZGluZ0NoYW5nZSgqcF9kZXZfcmVjLCBzdGF0dXMpOwotICAgIH0KLQotICAgIC8qIHBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjayBtaWdodCBoYXZlIGZyZWVkIHRoZSBwX2Rldl9yZWMsIGVuc3VyZSBpdCBleGlzdHMKLSAgICAgKiBiZWZvcmUgYWNjZXNzaW5nICovCi0gICAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkYSk7Ci0gICAgaWYgKCFwX2Rldl9yZWMpIHsKLSAgICAgIC8qIERvbid0IGNhbGxiYWNrIHdoZW4gZGV2aWNlIHNlY3VyaXR5IHJlY29yZCB3YXMgcmVtb3ZlZCAqLwotICAgICAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICA8PCAiOiBkZXZpY2Ugc2VjdXJpdHkgcmVjb3JkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJkYSBoYXMgYmVlbiAiCi0gICAgICAgICAgICAgICAgICJyZW1vdmVkISBiZGE9IgotICAgICAgICAgICAgICA8PCBiZGEgPDwgIiwgZG8gbm90IGNhbGxiYWNrISI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBIQ0lfRVJSX0NPTk5FQ1RJT05fVE9VVCB8fAotICAgICAgICBzdGF0dXMgPT0gSENJX0VSUl9MTVBfUkVTUE9OU0VfVElNRU9VVCB8fAotICAgICAgICBzdGF0dXMgPT0gSENJX0VSUl9VTlNQRUNJRklFRCB8fCBzdGF0dXMgPT0gSENJX0VSUl9QQUdFX1RJTUVPVVQpCi0gICAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBCVE1fREVWSUNFX1RJTUVPVVQsIGZhbHNlKTsKLSAgICBlbHNlCi0gICAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBCVE1fRVJSX1BST0NFU1NJTkcsIGZhbHNlKTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIGluaXRpYXRlZCBkZWRpY2F0ZWQgYm9uZGluZywgcmV0dXJuIHRoZSBsaW5rIGtleSBub3csIGFuZCBpbml0aWF0ZQotICAgKiBkaXNjb25uZWN0ICovCi0gIC8qIElmIGRlZGljYXRlZCBib25kaW5nLCBhbmQgd2Ugbm93IGhhdmUgYSBsaW5rIGtleSwgd2UgYXJlIGFsbCBkb25lICovCi0gIGlmIChpc19wYWlyaW5nX2RldmljZSAmJiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xJTktfS0VZX0tOT1dOKSkgewotICAgIGlmIChwX2Rldl9yZWMtPmxpbmtfa2V5X25vdF9zZW50KSB7Ci0gICAgICBwX2Rldl9yZWMtPmxpbmtfa2V5X25vdF9zZW50ID0gZmFsc2U7Ci0gICAgICBidG1fc2VuZF9saW5rX2tleV9ub3RpZihwX2Rldl9yZWMpOwotICAgIH0KLQotICAgIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJj0gfkJUTV9TRUNfT1VUX0FVVEhFTlRJQ0FURTsKLQotICAgIC8qIHJlbWVtYmVyIGZsYWcgYmVmb3JlIGl0IGlzIGluaXRpYWxpemVkICovCi0gICAgYm9vbCBpc19wYWlyX2ZsYWdzX3dlX3N0YXJ0ZWRfZGQgPSBmYWxzZTsKLSAgICBpZiAoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKQotICAgICAgaXNfcGFpcl9mbGFnc193ZV9zdGFydGVkX2RkID0gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICBpc19wYWlyX2ZsYWdzX3dlX3N0YXJ0ZWRfZGQgPSBmYWxzZTsKLQotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0KLSAgICBpZiAoaXNfcGFpcl9mbGFnc193ZV9zdGFydGVkX2RkKSB7Ci0gICAgICAvKiBMZXQgbDJjYXAgc3RhcnQgYm9uZCB0aW1lciAqLwotICAgICAgbDJjdV91cGRhdGVfbGNiXzRfYm9uZGluZyhwX2Rldl9yZWMtPmJkX2FkZHIsIHRydWUpOwotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0gIHBfZGV2X3JlYy0+aGNpX2hhbmRsZSA9IGhhbmRsZTsKLSAgYnRtX2FjbF9jcmVhdGVkKGJkYSwgaGFuZGxlLCBhc3NpZ25lZF9yb2xlLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICAvKiByb2xlIG1heSBub3QgYmUgY29ycmVjdCBoZXJlLCBpdCB3aWxsIGJlIHVwZGF0ZWQgYnkgbDJjYXAsIGJ1dCB3ZSBuZWVkIHRvCi0gICAqLwotICAvKiBub3RpZnkgYnRtX2FjbCB0aGF0IGxpbmsgaXMgdXAsIHNvIHN0YXJ0aW5nIG9mIHJtdCBuYW1lIHJlcXVlc3Qgd2lsbCBub3QgKi8KLSAgLyogc2V0IHBhZ2luZyBmbGFnIHVwICovCi0gIC8qIHdoYXRldmVyIGlzIGluIGJ0bV9lc3RhYmxpc2hfY29udGludWUoKSB3aXRob3V0IHJlcG9ydGluZyB0aGUKLSAgICogQlRNX0JMX0NPTk5fRVZUIGV2ZW50ICovCi0gIC8qIEZvciBub3cgdGhlcmUgYXJlIGEgc29tZSBkZXZpY2VzIHRoYXQgZG8gbm90IGxpa2Ugc2VuZGluZyAqLwotICAvKiBjb21tYW5kcyBldmVudHMgYW5kIGRhdGEgYXQgdGhlIHNhbWUgdGltZS4gKi8KLSAgLyogU2V0IHRoZSBwYWNrZXQgdHlwZXMgdG8gdGhlIGRlZmF1bHQgYWxsb3dlZCBieSB0aGUgZGV2aWNlICovCi0gIGJ0bV9zZXRfcGFja2V0X3R5cGVzX2Zyb21fYWRkcmVzcyhiZGEsIGFjbF9nZXRfc3VwcG9ydGVkX3BhY2tldF90eXBlcygpKTsKLQotICAvKiBJbml0aWFsaXplIHNlY3VyaXR5IGZsYWdzLiAgV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2Ugc29tZSAgICAgICAgICAgICovCi0gIC8qIGF1dGhvcml6YXRpb24gY29tcGxldGUgY291bGQgaGF2ZSBjb21lIGFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgKi8KLSAgLyogYW5kIHRoYXQgd291bGQgc2V0IHdyb25nIGZsYWcgdGhhdCBsaW5rIGhhcyBiZWVuIGF1dGhvcml6ZWQgYWxyZWFkeSAgICAqLwotICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPQotICAgICAgfigoQlRNX1NFQ19BVVRIRU5USUNBVEVEIHwgQlRNX1NFQ19FTkNSWVBURUQgfCBCVE1fU0VDX1JPTEVfU1dJVENIRUQpCi0gICAgICAgIDw8IGJpdF9zaGlmdCk7Ci0KLSAgaWYgKGVuY19tb2RlICE9IEhDSV9FTkNSWVBUX01PREVfRElTQUJMRUQpCi0gICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0KLSAgICAgICAgKChCVE1fU0VDX0FVVEhFTlRJQ0FURUQgfCBCVE1fU0VDX0VOQ1JZUFRFRCkgPDwgYml0X3NoaWZ0KTsKLQotICBpZiAocF9kZXZfcmVjLT5waW5fY29kZV9sZW5ndGggPj0gMTYgfHwKLSAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQiB8fAotICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlID09IEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2KSB7Ci0gICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0gKEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRCA8PCBiaXRfc2hpZnQpOwotICB9Ci0KLSAgLyogQWZ0ZXIgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3ZSBwZXJmb3JtIHNlY3VyaXR5IGlmIHdlIGRvIG5vdCBrbm93ICovCi0gIC8qIHRoZSBuYW1lLCBvciBpZiB3ZSBhcmUgb3JpZ2luYXRvciBiZWNhdXNlIHNvbWUgcHJvY2VkdXJlIGNhbiBoYXZlICovCi0gIC8qIGJlZW4gc2NoZWR1bGVkIHdoaWxlIGNvbm5lY3Rpb24gd2FzIGRvd24gKi8KLSAgTE9HX0RFQlVHKCJJcyBjb25uZWN0aW9uIGxvY2FsbHkgaW5pdGlhdGVkOiVzIiwKLSAgICAgICAgICAgIGxvZ2Jvb2wocF9kZXZfcmVjLT5pc19vcmlnaW5hdG9yKS5jX3N0cigpKTsKLSAgaWYgKCEocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX05BTUVfS05PV04pIHx8Ci0gICAgICBwX2Rldl9yZWMtPmlzX29yaWdpbmF0b3IpIHsKLSAgICByZXMgPSBidG1fc2VjX2V4ZWN1dGVfcHJvY2VkdXJlKHBfZGV2X3JlYyk7Ci0gICAgaWYgKHJlcyAhPSBCVE1fQ01EX1NUQVJURUQpCi0gICAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCByZXMsIGZhbHNlKTsKLSAgfQotICByZXR1cm47Ci19Ci0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfZGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXZfYnlfaGFuZGxlKGhhbmRsZSk7Ci0KLSAgLyogSW4gc29tZSB3ZWlyZCByYWNlIGNvbmRpdGlvbiB3ZSBtYXkgbm90IGhhdmUgYSByZWNvcmQgKi8KLSAgaWYgKCFwX2Rldl9yZWMpIHsKLSAgICBhY2xfZGlzY29ubmVjdF9mcm9tX2hhbmRsZShoYW5kbGUsIHJlYXNvbik7Ci0gICAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci0gIH0KLQotICAvKiBJZiB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYm9uZGluZyB3ZSBuZWVkIHRvIHRlbGwgY2xpZW50IHRoYXQgYXV0aCBmYWlsZWQKLSAgICovCi0gIGlmICgoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfSURMRSkgJiYKLSAgICAgIChidG1fY2IucGFpcmluZ19iZGEgPT0gcF9kZXZfcmVjLT5iZF9hZGRyKSAmJgotICAgICAgKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfV0VfU1RBUlRFRF9ERCkpIHsKLSAgICAvKiB3ZSBhcmUgY3VycmVudGx5IGRvaW5nIGJvbmRpbmcuICBMaW5rIHdpbGwgYmUgZGlzY29ubmVjdGVkIHdoZW4gZG9uZSAqLwotICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzIHw9IEJUTV9QQUlSX0ZMQUdTX0RJU0NfV0hFTl9ET05FOwotICAgIHJldHVybiAoQlRNX0JVU1kpOwotICB9Ci0KLSAgcmV0dXJuIChidG1fc2VjX3NlbmRfaGNpX2Rpc2Nvbm5lY3QocF9kZXZfcmVjLCByZWFzb24sIGhhbmRsZSkpOwotfQotCi12b2lkIGJ0bV9zZWNfZGlzY29ubmVjdGVkKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uKSB7Ci0gIGlmICgocmVhc29uICE9IEhDSV9FUlJfQ09OTl9DQVVTRV9MT0NBTF9IT1NUKSAmJgotICAgICAgKHJlYXNvbiAhPSBIQ0lfRVJSX1BFRVJfVVNFUikpIHsKLSAgICBMT0dfV0FSTigiR290IHVuY29tbW9uIGRpc2Nvbm5lY3Rpb24gcmVhc29uOiVzIGhhbmRsZToweCUwNHgiLAotICAgICAgICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQocmVhc29uKS5jX3N0cigpLCBoYW5kbGUpOwotICB9Ci0KLSAgYnRtX2FjbF9yZXN1Ym1pdF9wYWdlKCk7Ci0KLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2X2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9kZXZfcmVjID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiR290IGRpc2Nvbm5lY3QgZm9yIHVua25vd24gZGV2aWNlIHJlY29yZCBoYW5kbGU6MHglMDR4IiwgaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb25zdCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9Ci0gICAgICAoaGFuZGxlID09IHBfZGV2X3JlYy0+aGNpX2hhbmRsZSkgPyBCVF9UUkFOU1BPUlRfQlJfRURSIDogQlRfVFJBTlNQT1JUX0xFOwotCi0gIC8qIGNsZWFyIHVudXNlZCBmbGFncyAqLwotICBwX2Rldl9yZWMtPnNtNCAmPSBCVE1fU000X1RSVUU7Ci0KLSAgLyogSWYgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJvbmRpbmcgd2UgbmVlZCB0byB0ZWxsIGNsaWVudCB0aGF0IGF1dGggZmFpbGVkCi0gICAqLwotICBjb25zdCB1aW50OF90IG9sZF9wYWlyaW5nX2ZsYWdzID0gYnRtX2NiLnBhaXJpbmdfZmxhZ3M7Ci0gIGlmICgoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfSURMRSkgJiYKLSAgICAgIChidG1fY2IucGFpcmluZ19iZGEgPT0gcF9kZXZfcmVjLT5iZF9hZGRyKSkgewotICAgIExPR19ERUJVRygiRGlzY29ubmVjdGVkIHdoaWxlIHBhaXJpbmcgcHJvY2VzcyBhY3RpdmUgaGFuZGxlOjB4JTA0eCIsCi0gICAgICAgICAgICAgIGhhbmRsZSk7Ci0gICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+QlRNX1NFQ19MSU5LX0tFWV9LTk9XTjsKLQotICAgIC8qIElmIHRoZSBkaXNjb25uZWN0aW9uIHJlYXNvbiBpcyBSRVBFQVRFRF9BVFRFTVBUUywKLSAgICAgICBzZW5kIHRoaXMgZXJyb3IgbWVzc2FnZSB0byBjb21wbGV0ZSBjYWxsYmFjayBmdW5jdGlvbgotICAgICAgIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2Ugb2YgUmVwZWF0ZWQgYXR0ZW1wdHMuCi0gICAgICAgQWxsIG90aGVycywgc2VuZCBIQ0lfRVJSX0FVVEhfRkFJTFVSRS4gKi8KLSAgICB0SENJX1NUQVRVUyBzdGF0dXMgPSBIQ0lfRVJSX0FVVEhfRkFJTFVSRTsKLSAgICBpZiAocmVhc29uID09IEhDSV9FUlJfUkVQRUFURURfQVRURU1QVFMpIHsKLSAgICAgIHN0YXR1cyA9IEhDSV9FUlJfUkVQRUFURURfQVRURU1QVFM7Ci0gICAgfSBlbHNlIGlmIChvbGRfcGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQpIHsKLSAgICAgIHN0YXR1cyA9IEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFk7Ci0gICAgfQotICAgIE5vdGlmeUJvbmRpbmdDaGFuZ2UoKnBfZGV2X3JlYywgc3RhdHVzKTsKLQotICAgIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUoaGFuZGxlKTsKLSAgICBpZiAocF9kZXZfcmVjID09IG51bGxwdHIpIHsKLSAgICAgIC8vIHxidG1fY2IuYXBpLnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFja3wgbWF5IGNhdXNlIHxwX2Rldl9yZWN8IHRvIGJlCi0gICAgICAvLyBkZWFsbG9jYXRlZC4KLSAgICAgIExPR19XQVJOKCJEZXZpY2UgcmVjb3JkIHdhcyBkZWFsbG9jYXRlZCBhZnRlciB1c2VyIGNhbGxiYWNrIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgTE9HX0RFQlVHKAotICAgICAgIkRpc2Nvbm5lY3Rpb24gY29tcGxldGUgZGV2aWNlOiVzIG5hbWU6JXMgc3RhdGU6JXMgcmVhc29uOiVzIHNlY19yZXE6JXgiLAotICAgICAgUFJJVkFURV9BRERSRVNTKHBfZGV2X3JlYy0+YmRfYWRkciksIHBfZGV2X3JlYy0+c2VjX2JkX25hbWUsCi0gICAgICBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSksCi0gICAgICBoY2lfcmVhc29uX2NvZGVfdGV4dChyZWFzb24pLmNfc3RyKCksIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQpOwotCi0gIC8vIFRPRE8gU2hvdWxkIHRoaXMgYmUgZ2F0ZWQgYnkgdGhlIHRyYW5zcG9ydCBjaGVjayBiZWxvdyA/Ci0gIGJ0bV9ibGVfdXBkYXRlX21vZGVfb3BlcmF0aW9uKEhDSV9ST0xFX1VOS05PV04sICZwX2Rldl9yZWMtPmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDSV9TVUNDRVNTKTsKLSAgLyogc2VlIHNlY19mbGFncyBwcm9jZXNzaW5nIGluIGJ0bV9hY2xfcmVtb3ZlZCAqLwotCi0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgcF9kZXZfcmVjLT5ibGVfaGNpX2hhbmRsZSA9IEhDSV9JTlZBTElEX0hBTkRMRTsKLSAgICBwX2Rldl9yZWMtPnNlY19mbGFncyAmPSB+KEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRCB8IEJUTV9TRUNfTEVfRU5DUllQVEVEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TRUNfUk9MRV9TV0lUQ0hFRCk7Ci0gICAgcF9kZXZfcmVjLT5lbmNfa2V5X3NpemUgPSAwOwotCi0gICAgaWYgKChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfTEVfTElOS19LRVlfS05PV04pID09IDApIHsKLSAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzICY9Ci0gICAgICAgICAgfihCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRCB8IEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRCk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyBmb3IgY2hpcHMgdGhhdCBkb24ndCBzdXBwb3J0IGJlaW5nIGluIGNvbm5lY3RlZCBhbmQgYWR2ZXJ0aXNpbmcKLSAgICAvLyBzdGF0ZSBhdCBzYW1lIHRpbWUuCi0gICAgaWYgKCFwX2Rldl9yZWMtPklzTG9jYWxseUluaXRpYXRlZCgpKSB7Ci0gICAgICBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5KEhDSV9TVUNDRVNTLCBoYW5kbGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwX2Rldl9yZWMtPmhjaV9oYW5kbGUgPSBIQ0lfSU5WQUxJRF9IQU5ETEU7Ci0gICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0KLSAgICAgICAgfihCVE1fU0VDX0FVVEhFTlRJQ0FURUQgfCBCVE1fU0VDX0VOQ1JZUFRFRCB8IEJUTV9TRUNfUk9MRV9TV0lUQ0hFRCB8Ci0gICAgICAgICAgQlRNX1NFQ18xNl9ESUdJVF9QSU5fQVVUSEVEKTsKLQotICAgIC8vIFJlbW92ZSB0ZW1wb3Jhcnkga2V5LgotICAgIGlmIChwX2Rldl9yZWMtPmJvbmRfdHlwZSA9PSB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVEVNUE9SQVJZKQotICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0gfihCVE1fU0VDX0xJTktfS0VZX0tOT1dOKTsKLSAgfQotCi0gIC8qIFNvbWUgZGV2aWNlcyBoYXJkY29kZSBzYW1wbGUgTFRLIHZhbHVlIGZyb20gc3BlYywgaW5zdGVhZCBvZiBnZW5lcmF0aW5nCi0gICAqIG9uZS4gVHJlYXQgc3VjaCBkZXZpY2VzIGFzIGluc2VjdXJlLCBhbmQgcmVtb3ZlIHN1Y2ggYm9uZHMgb24KLSAgICogZGlzY29ubmVjdGlvbi4KLSAgICovCi0gIGlmIChpc19zYW1wbGVfbHRrKHBfZGV2X3JlYy0+YmxlLmtleXMucGx0aykpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyODQzNzI5NyIpOwotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIHJlbW92aW5nIGJvbmQgdG8gZGV2aWNlIHRoYXQgdXNlZCBzYW1wbGUgTFRLOiAiCi0gICAgICAgICAgICAgIDw8IHBfZGV2X3JlYy0+YmRfYWRkcjsKLQotICAgIGJ0YV9kbV9yZW1vdmVfZGV2aWNlKHBfZGV2X3JlYy0+YmRfYWRkcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfRElTQ09OTkVDVElOR19CT1RIKSB7Ci0gICAgTE9HX0RFQlVHKCJXYWl0aW5nIGZvciBvdGhlciB0cmFuc3BvcnQgdG8gZGlzY29ubmVjdCBjdXJyZW50OiVzIiwKLSAgICAgICAgICAgICAgYnRfdHJhbnNwb3J0X3RleHQodHJhbnNwb3J0KS5jX3N0cigpKTsKLSAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9ICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQlRNX1NFQ19TVEFURV9ESVNDT05ORUNUSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQkxFOwotICAgIHJldHVybjsKLSAgfQotICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfSURMRTsKLSAgcF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCA9IEJUTV9TRUNfTk9ORTsKLQotICBpZiAocF9kZXZfcmVjLT5wX2NhbGxiYWNrICE9IG51bGxwdHIpIHsKLSAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjayA9IHBfZGV2X3JlYy0+cF9jYWxsYmFjazsKLSAgICAvKiB3aGVuIHRoZSBwZWVyIGRldmljZSB0aW1lIG91dCB0aGUgYXV0aGVudGljYXRpb24gYmVmb3JlCi0gICAgICAgd2UgZG8sIHRoaXMgY2FsbCBiYWNrIG11c3QgYmUgcmVzZXQgaGVyZSAqLwotICAgIHBfZGV2X3JlYy0+cF9jYWxsYmFjayA9IG51bGxwdHI7Ci0gICAgKCpwX2NhbGxiYWNrKSgmcF9kZXZfcmVjLT5iZF9hZGRyLCB0cmFuc3BvcnQsIHBfZGV2X3JlYy0+cF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgIEJUTV9FUlJfUFJPQ0VTU0lORyk7Ci0gICAgTE9HX0RFQlVHKCJDbGVhbmVkIHVwIHBlbmRpbmcgc2VjdXJpdHkgc3RhdGUgZGV2aWNlOiVzIHRyYW5zcG9ydDolcyIsCi0gICAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhwX2Rldl9yZWMtPmJkX2FkZHIpLAotICAgICAgICAgICAgICBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gbGluayBrZXkgaXMgZ2VuZXJhdGVkICovCi12b2lkIGJ0bV9zZWNfbGlua19rZXlfbm90aWZpY2F0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9vcl9hbGxvY19kZXYocF9iZGEpOwotICBib29sIHdlX2FyZV9ib25kaW5nID0gZmFsc2U7Ci0gIGJvb2wgbHRrX2Rlcml2ZWRfbGsgPSBmYWxzZTsKLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHBfYmRhIDw8ICIsIFRZUEU6ICIgPDwgK2tleV90eXBlOwotCi0gIGlmICgoa2V5X3R5cGUgPj0gQlRNX0xUS19ERVJJVkVEX0xLRVlfT0ZGU0VUICsgQlRNX0xLRVlfVFlQRV9DT01CSU5BVElPTikgJiYKLSAgICAgIChrZXlfdHlwZSA8PQotICAgICAgIEJUTV9MVEtfREVSSVZFRF9MS0VZX09GRlNFVCArIEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2KSkgewotICAgIGx0a19kZXJpdmVkX2xrID0gdHJ1ZTsKLSAgICBrZXlfdHlwZSAtPSBCVE1fTFRLX0RFUklWRURfTEtFWV9PRkZTRVQ7Ci0gIH0KLSAgLyogSWYgY29ubmVjdGlvbiB3YXMgbWFkZSB0byBkbyBib25kaW5nIHJlc3RvcmUgbGluayBzZWN1cml0eSBpZiBjaGFuZ2VkICovCi0gIGJ0bV9yZXN0b3JlX21vZGUoKTsKLQotICBpZiAoa2V5X3R5cGUgIT0gQlRNX0xLRVlfVFlQRV9DSEFOR0VEX0NPTUIpCi0gICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlID0ga2V5X3R5cGU7Ci0KLSAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgfD0gQlRNX1NFQ19MSU5LX0tFWV9LTk9XTjsKLQotICAvKgotICAgKiBVbnRpbCB0aGlzIHBvaW50IGluIHRpbWUsIHdlIGRvIG5vdCBrbm93IGlmIE1JVE0gd2FzIGVuYWJsZWQsIGhlbmNlIHdlCi0gICAqIGFkZCB0aGUgZXh0ZW5kZWQgc2VjdXJpdHkgZmxhZyBoZXJlLgotICAgKi8KLSAgaWYgKHBfZGV2X3JlYy0+cGluX2NvZGVfbGVuZ3RoID49IDE2IHx8Ci0gICAgICBwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPT0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUIgfHwKLSAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikgewotICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfTElOS19LRVlfQVVUSEVEOwotICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzIHw9IEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRDsKLSAgfQotCi0gIC8qIEJSL0VEUiBjb25uZWN0aW9uLCB1cGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5IHNpemUgdG8gYmUgMTYgYXMgYWx3YXlzICovCi0gIHBfZGV2X3JlYy0+ZW5jX2tleV9zaXplID0gMTY7Ci0gIHBfZGV2X3JlYy0+bGlua19rZXkgPSBsaW5rX2tleTsKLQotICBpZiAoKGJ0bV9jYi5wYWlyaW5nX3N0YXRlICE9IEJUTV9QQUlSX1NUQVRFX0lETEUpICYmCi0gICAgICAoYnRtX2NiLnBhaXJpbmdfYmRhID09IHBfYmRhKSkgewotICAgIGlmIChidG1fY2IucGFpcmluZ19mbGFncyAmIEJUTV9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQpCi0gICAgICB3ZV9hcmVfYm9uZGluZyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9JRExFKTsKLSAgfQotCi0gIC8qIHNhdmUgTFRLIGRlcml2ZWQgTEsgbm8gbWF0dGVyIHdoYXQgKi8KLSAgaWYgKGx0a19kZXJpdmVkX2xrKSB7Ci0gICAgaWYgKGJ0bV9jYi5hcGkucF9saW5rX2tleV9jYWxsYmFjaykgewotICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlcygpIFNhdmUgTFRLIGRlcml2ZWQgTEsgKGtleV90eXBlID0gJWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlKTsKLSAgICAgICgqYnRtX2NiLmFwaS5wX2xpbmtfa2V5X2NhbGxiYWNrKShwX2JkYSwgcF9kZXZfcmVjLT5kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5zZWNfYmRfbmFtZSwgbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgPT0gQlRNX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NikgfHwKLSAgICAgICAgKHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikpIHsKLSAgICAgIHBfZGV2X3JlYy0+bmV3X2VuY3J5cHRpb25fa2V5X2lzX3AyNTYgPSB0cnVlOwotICAgICAgQlRNX1RSQUNFX0RFQlVHKCIlcyBzZXQgbmV3X2VuY3Jfa2V5XzI1NiB0byAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+bmV3X2VuY3J5cHRpb25fa2V5X2lzX3AyNTYpOwotICAgIH0KLSAgfQotCi0gIC8qIElmIG5hbWUgaXMgbm90IGtub3duIGF0IHRoaXMgcG9pbnQgZGVsYXkgY2FsbGluZyBjYWxsYmFjayB1bnRpbCB0aGUgbmFtZSBpcwotICAgKi8KLSAgLyogcmVzb2x2ZWQuIFVubGVzcyBpdCBpcyBhIEhJRCBEZXZpY2UgYW5kIHdlIHJlYWxseSBuZWVkIHRvIHNlbmQgYWxsIGxpbmsKLSAgICoga2V5cy4gKi8KLSAgaWYgKCghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19OQU1FX0tOT1dOKSAmJgotICAgICAgICgocF9kZXZfcmVjLT5kZXZfY2xhc3NbMV0gJiBCVE1fQ09EX01BSk9SX0NMQVNTX01BU0spICE9Ci0gICAgICAgIEJUTV9DT0RfTUFKT1JfUEVSSVBIRVJBTCkpICYmCi0gICAgICAhbHRrX2Rlcml2ZWRfbGspIHsKLSAgICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgRGVsYXllZCBCREE6ICIgPDwgcF9iZGEgPDwgIiBUeXBlOiIgPDwgK2tleV90eXBlOwotCi0gICAgcF9kZXZfcmVjLT5saW5rX2tleV9ub3Rfc2VudCA9IHRydWU7Ci0KLSAgICAvKiBJZiBpdCBpcyBmb3IgYm9uZGluZyBub3RoaW5nIGVsc2Ugd2lsbCBmb2xsb3csIHNvIHdlIG5lZWQgdG8gc3RhcnQgbmFtZQotICAgICAqIHJlc29sdXRpb24gKi8KLSAgICBpZiAod2VfYXJlX2JvbmRpbmcpIHsKLSAgICAgIFNlbmRSZW1vdGVOYW1lUmVxdWVzdChwX2JkYSk7Ci0gICAgfQotCi0gICAgQlRNX1RSQUNFX0VWRU5UKCJybXRfaW9fY2FwczolZCwgc2VjX2ZsYWdzOngleCwgZGV2X2NsYXNzWzFdOnglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5ybXRfaW9fY2FwcywgcF9kZXZfcmVjLT5zZWNfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+ZGV2X2NsYXNzWzFdKQotICAgIHJldHVybjsKLSAgfQotCi0vKiBXZSB3aWxsIHNhdmUgbGluayBrZXkgb25seSBpZiB0aGUgdXNlciBhdXRob3JpemVkIGl0IC0gQlRFIHJlcG9ydCBsaW5rIGtleSBpbgotICogYWxsIGNhc2VzICovCi0jaWZkZWYgQlJDTV9OT05FX0JURQotICBpZiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xJTktfS0VZX0FVVEhFRCkKLSNlbmRpZgotICB7Ci0gICAgaWYgKGJ0bV9jYi5hcGkucF9saW5rX2tleV9jYWxsYmFjaykgewotICAgICAgaWYgKGx0a19kZXJpdmVkX2xrKSB7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICJidG1fc2VjX2xpbmtfa2V5X25vdGlmaWNhdGlvbigpICBMVEsgZGVyaXZlZCBMSyBpcyBzYXZlZCBhbHJlYWR5IgotICAgICAgICAgICAgIiAoa2V5X3R5cGUgPSAlZCkiLAotICAgICAgICAgICAgcF9kZXZfcmVjLT5saW5rX2tleV90eXBlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICgqYnRtX2NiLmFwaS5wX2xpbmtfa2V5X2NhbGxiYWNrKShwX2JkYSwgcF9kZXZfcmVjLT5kZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnNlY19iZF9uYW1lLCBsaW5rX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2xpbmtfa2V5X3JlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gY29udHJvbGxlciByZXF1ZXN0cyBsaW5rIGtleQotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjb3JkIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2xpbmtfa2V5X3JlcXVlc3QodWludDhfdCogcF9ldmVudCkgewotICBSYXdBZGRyZXNzIGJkYTsKLQotICBTVFJFQU1fVE9fQkRBRERSKGJkYSwgcF9ldmVudCk7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihiZGEpOwotCi0gIFZMT0coMikgPDwgX19mdW5jX18gPDwgIiBiZGE6ICIgPDwgYmRhOwotI2lmIChkZWZpbmVkKEJUTV9ESVNBQkxFX0NPTkNVUlJFTlRfUEVFUl9BVVRIKSAmJiBcCi0gICAgIChCVE1fRElTQUJMRV9DT05DVVJSRU5UX1BFRVJfQVVUSCA9PSBUUlVFKSkKLSAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0FVVEhFTlRJQ0FUSU5HOwotI2VuZGlmCi0KLSAgaWYgKChidG1fY2IucGFpcmluZ19zdGF0ZSA9PSBCVE1fUEFJUl9TVEFURV9XQUlUX1BJTl9SRVEpICYmCi0gICAgICAoYnRtX2NiLmNvbGxpc2lvbl9zdGFydF90aW1lICE9IDApICYmCi0gICAgICAoYnRtX2NiLnBfY29sbGlkZWRfZGV2X3JlYy0+YmRfYWRkciA9PSBiZGEpKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKAotICAgICAgICAiYnRtX3NlY19saW5rX2tleV9yZXF1ZXN0KCkgcmVqZWN0aW5nIGxpbmsga2V5IHJlcSAiCi0gICAgICAgICJTdGF0ZTogJWQgU1RBUlRfVElNRU9VVCA6ICVkIiwKLSAgICAgICAgYnRtX2NiLnBhaXJpbmdfc3RhdGUsIGJ0bV9jYi5jb2xsaXNpb25fc3RhcnRfdGltZSk7Ci0gICAgYnRzbmRfaGNpY19saW5rX2tleV9uZWdfcmVwbHkoYmRhKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9LTk9XTikgewotICAgIGJ0c25kX2hjaWNfbGlua19rZXlfcmVxX3JlcGx5KGJkYSwgcF9kZXZfcmVjLT5saW5rX2tleSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogTm90aWZ5IEwyQ0FQIHRvIGluY3JlYXNlIHRpbWVvdXQgKi8KLSAgbDJjX3Bpbl9jb2RlX3JlcXVlc3QoYmRhKTsKLQotICAvKiBUaGUgbGluayBrZXkgaXMgbm90IGluIHRoZSBkYXRhYmFzZSBhbmQgaXQgaXMgbm90IGtub3duIHRvIHRoZSBtYW5hZ2VyICovCi0gIGJ0c25kX2hjaWNfbGlua19rZXlfbmVnX3JlcGx5KGJkYSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3BhaXJpbmdfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBob3N0IGRvZXMgbm90IHByb3ZpZGUgUElOCi0gKiAgICAgICAgICAgICAgICAgIHdpdGhpbiByZXF1ZXN0ZWQgdGltZQotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgVExFIHN0cnVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fc2VjX3BhaXJpbmdfdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIHRCVE1fQ0IqIHBfY2IgPSAmYnRtX2NiOwotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIHRCVE1fQVVUSF9SRVEgYXV0aF9yZXEgPSAoYnRtX2NiLmRldmNiLmxvY19pb19jYXBzID09IEJUTV9JT19DQVBfTk9ORSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJUTV9BVVRIX0FQX05PCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVE1fQVVUSF9BUF9ZRVM7Ci0gIEJEX05BTUUgbmFtZTsKLQotICBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYocF9jYi0+cGFpcmluZ19iZGEpOwotCi0gIEJUTV9UUkFDRV9FVkVOVCgiJXMgIFN0YXRlOiAlcyAgIEZsYWdzOiAldSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IocF9jYi0+cGFpcmluZ19zdGF0ZSksCi0gICAgICAgICAgICAgICAgICBwX2NiLT5wYWlyaW5nX2ZsYWdzKTsKLQotICBzd2l0Y2ggKHBfY2ItPnBhaXJpbmdfc3RhdGUpIHsKLSAgICBjYXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfUElOX1JFUToKLSAgICAgIGJ0bV9zZWNfYm9uZF9jYW5jZWxfY29tcGxldGUoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX1BJTjoKLSAgICAgIGlmICgoYnRtX2NiLnBhaXJpbmdfZmxhZ3MgJiBCVE1fUEFJUl9GTEFHU19QUkVfRkVUQ0hfUElOKSA9PSAwKQotICAgICAgICBidHNuZF9oY2ljX3Bpbl9jb2RlX25lZ19yZXBseShwX2NiLT5wYWlyaW5nX2JkYSk7Ci0gICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotICAgICAgLyogV2UgbmVlZCB0byBub3RpZnkgdGhlIFVJIHRoYXQgbm8gbG9uZ2VyIG5lZWQgdGhlIFBJTiAqLwotICAgICAgaWYgKGJ0bV9jYi5hcGkucF9hdXRoX2NvbXBsZXRlX2NhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgewotICAgICAgICAgIG5hbWVbMF0gPSAwOwotICAgICAgICAgICgqYnRtX2NiLmFwaS5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2spKHBfY2ItPnBhaXJpbmdfYmRhLCBOVUxMLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDSV9FUlJfQ09OTkVDVElPTl9UT1VUKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgTm90aWZ5Qm9uZGluZ0NoYW5nZSgqcF9kZXZfcmVjLCBIQ0lfRVJSX0NPTk5FQ1RJT05fVE9VVCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9OVU1FUklDX0NPTkZJUk06Ci0gICAgICBidHNuZF9oY2ljX3VzZXJfY29uZl9yZXBseShwX2NiLT5wYWlyaW5nX2JkYSwgZmFsc2UpOwotICAgICAgLyogYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZSAoQlRNX1BBSVJfU1RBVEVfSURMRSk7ICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfS0VZX0VOVFJZOgotICAgICAgaWYgKGJ0bV9jYi5kZXZjYi5sb2NfaW9fY2FwcyAhPSBCVE1fSU9fQ0FQX05PTkUpIHsKLSAgICAgICAgYnRzbmRfaGNpY191c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KHBfY2ItPnBhaXJpbmdfYmRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9JT0NBUFM6Ci0gICAgICAvLyBUT0RPKG9wdGVkb2JsaXZpb24pOiBJbmplY3QgT09CX0RBVEFfUFJFU0VOVCBGbGFnCi0gICAgICBidHNuZF9oY2ljX2lvX2NhcF9yZXFfcmVwbHkocF9jYi0+cGFpcmluZ19iZGEsIGJ0bV9jYi5kZXZjYi5sb2NfaW9fY2FwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fT09CX05PTkUsIGF1dGhfcmVxKTsKLSAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9PT0JfUlNQOgotICAgICAgYnRzbmRfaGNpY19yZW1fb29iX25lZ19yZXBseShwX2NiLT5wYWlyaW5nX2JkYSk7Ci0gICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfRElTQ09OTkVDVDoKLSAgICAgIC8qIHNpbXBsZSBwYWlyaW5nIGZhaWxlZC4gU3RhcnRlZCBhIDEtc2VjIHRpbWVyIGF0IHNpbXBsZSBwYWlyaW5nCi0gICAgICAgKiBjb21wbGV0ZS4KLSAgICAgICAqIG5vdyBpdCdzIHRpbWUgdG8gdGVhciBkb3duIHRoZSBBQ0wgbGluayovCi0gICAgICBpZiAocF9kZXZfcmVjID09IE5VTEwpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIgQlRNX1BBSVJfU1RBVEVfV0FJVF9ESVNDT05ORUNUIHVua25vd24gQkRBOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgcF9jYi0+cGFpcmluZ19iZGE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnRtX3NlY19zZW5kX2hjaV9kaXNjb25uZWN0KHBfZGV2X3JlYywgSENJX0VSUl9BVVRIX0ZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXZfcmVjLT5oY2lfaGFuZGxlKTsKLSAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9BVVRIX0NPTVBMRVRFOgotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfR0VUX1JFTV9OQU1FOgotICAgICAgLyogV2UgbmVlZCB0byBub3RpZnkgdGhlIFVJIHRoYXQgdGltZW91dCBoYXMgaGFwcGVuZWQgd2hpbGUgd2FpdGluZyBmb3IKLSAgICAgICAqIGF1dGhlbnRpY2F0aW9uKi8KLSAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfSURMRSk7Ci0gICAgICBpZiAoYnRtX2NiLmFwaS5wX2F1dGhfY29tcGxldGVfY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgbmFtZVswXSA9IDA7Ci0gICAgICAgICAgKCpidG1fY2IuYXBpLnBfYXV0aF9jb21wbGV0ZV9jYWxsYmFjaykocF9jYi0+cGFpcmluZ19iZGEsIE5VTEwsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VSUl9DT05ORUNUSU9OX1RPVVQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIE5vdGlmeUJvbmRpbmdDaGFuZ2UoKnBfZGV2X3JlYywgSENJX0VSUl9DT05ORUNUSU9OX1RPVVQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCVE1fVFJBQ0VfV0FSTklORygiJXMgbm90IHByb2Nlc3NlZCBzdGF0ZTogJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSk7Ci0gICAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX0lETEUpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfcGluX2NvZGVfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBjb250cm9sbGVyIHJlcXVlc3RzIFBJTiBjb2RlCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfcGluX2NvZGVfcmVxdWVzdCh1aW50OF90KiBwX2V2ZW50KSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYzsKLSAgdEJUTV9DQiogcF9jYiA9ICZidG1fY2I7Ci0gIFJhd0FkZHJlc3MgcF9iZGE7Ci0KLSAgU1RSRUFNX1RPX0JEQUREUihwX2JkYSwgcF9ldmVudCk7Ci0KLSAgLyogVGVsbCBMMkNBUCB0aGF0IHRoZXJlIHdhcyBhIFBJTiBjb2RlIHJlcXVlc3QsICAqLwotICAvKiBpdCBtYXkgbmVlZCB0byBzdHJldGNoIHRpbWVvdXRzICAgICAgICAgICAgICAgICovCi0gIGwyY19waW5fY29kZV9yZXF1ZXN0KHBfYmRhKTsKLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHBfYmRhCi0gICAgICAgICAgPDwgIiBzdGF0ZTogIiA8PCBidG1fcGFpcl9zdGF0ZV9kZXNjcihidG1fY2IucGFpcmluZ19zdGF0ZSk7Ci0KLSAgUmF3QWRkcmVzcyBsb2NhbF9iZF9hZGRyID0gKmNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWRkcmVzcygpOwotICBpZiAocF9iZGEgPT0gbG9jYWxfYmRfYWRkcikgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc0NjI2MjUxIik7Ci0gICAgYnRzbmRfaGNpY19waW5fY29kZV9uZWdfcmVwbHkocF9iZGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChidG1fY2IucGFpcmluZ19zdGF0ZSAhPSBCVE1fUEFJUl9TVEFURV9JRExFKSB7Ci0gICAgaWYgKChwX2JkYSA9PSBidG1fY2IucGFpcmluZ19iZGEpICYmCi0gICAgICAgIChidG1fY2IucGFpcmluZ19zdGF0ZSA9PSBCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEUpKSB7Ci0gICAgICBidHNuZF9oY2ljX3Bpbl9jb2RlX25lZ19yZXBseShwX2JkYSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmICgoYnRtX2NiLnBhaXJpbmdfc3RhdGUgIT0gQlRNX1BBSVJfU1RBVEVfV0FJVF9QSU5fUkVRKSB8fAotICAgICAgICAgICAgICAgcF9iZGEgIT0gYnRtX2NiLnBhaXJpbmdfYmRhKSB7Ci0gICAgICBCVE1fVFJBQ0VfV0FSTklORygiYnRtX3NlY19waW5fY29kZV9yZXF1ZXN0KCkgcmVqZWN0ZWQgLSBzdGF0ZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpKTsKLSAgICAgIGJ0c25kX2hjaWNfcGluX2NvZGVfbmVnX3JlcGx5KHBfYmRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBwX2Rldl9yZWMgPSBidG1fZmluZF9vcl9hbGxvY19kZXYocF9iZGEpOwotICAvKiByZWNlaXZlZCBQSU4gY29kZSByZXF1ZXN0LiBtdXN0IGJlIG5vbi1zbTQgKi8KLSAgcF9kZXZfcmVjLT5zbTQgPSBCVE1fU000X0tOT1dOOwotCi0gIGlmIChidG1fY2IucGFpcmluZ19zdGF0ZSA9PSBCVE1fUEFJUl9TVEFURV9JRExFKSB7Ci0gICAgYnRtX2NiLnBhaXJpbmdfYmRhID0gcF9iZGE7Ci0KLSAgICBidG1fY2IucGFpcmluZ19mbGFncyA9IEJUTV9QQUlSX0ZMQUdTX1BFRVJfU1RBUlRFRF9ERDsKLSAgfQotCi0gIGlmICghcF9jYi0+cGFpcmluZ19kaXNhYmxlZCAmJiAocF9jYi0+Y2ZnLnBpbl90eXBlID09IEhDSV9QSU5fVFlQRV9GSVhFRCkpIHsKLSAgICBCVE1fVFJBQ0VfRVZFTlQoImJ0bV9zZWNfcGluX2NvZGVfcmVxdWVzdCBmaXhlZCBwaW4gcmVwbHlpbmciKTsKLSAgICBidG1fc2VjX2NoYW5nZV9wYWlyaW5nX3N0YXRlKEJUTV9QQUlSX1NUQVRFX1dBSVRfQVVUSF9DT01QTEVURSk7Ci0gICAgYnRzbmRfaGNpY19waW5fY29kZV9yZXFfcmVwbHkocF9iZGEsIHBfY2ItPmNmZy5waW5fY29kZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+Y2ZnLnBpbl9jb2RlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBVc2UgdGhlIGNvbm5lY3RpbmcgZGV2aWNlJ3MgQ29EIGZvciB0aGUgY29ubmVjdGlvbiAqLwotICBpZiAoKHBfYmRhID09IHBfY2ItPmNvbm5lY3RpbmdfYmRhKSAmJgotICAgICAgKHBfY2ItPmNvbm5lY3RpbmdfZGNbMF0gfHwgcF9jYi0+Y29ubmVjdGluZ19kY1sxXSB8fAotICAgICAgIHBfY2ItPmNvbm5lY3RpbmdfZGNbMl0pKQotICAgIG1lbWNweShwX2Rldl9yZWMtPmRldl9jbGFzcywgcF9jYi0+Y29ubmVjdGluZ19kYywgREVWX0NMQVNTX0xFTik7Ci0KLSAgLyogV2UgY291bGQgaGF2ZSBzdGFydGVkIGNvbm5lY3Rpb24gYWZ0ZXIgYXNraW5nIHVzZXIgZm9yIHRoZSBQSU4gY29kZSAqLwotICBpZiAoYnRtX2NiLnBpbl9jb2RlX2xlbiAhPSAwKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKCJidG1fc2VjX3Bpbl9jb2RlX3JlcXVlc3QgYm9uZGluZyBzZW5kaW5nIHJlcGx5Iik7Ci0gICAgYnRzbmRfaGNpY19waW5fY29kZV9yZXFfcmVwbHkocF9iZGEsIGJ0bV9jYi5waW5fY29kZV9sZW4sIHBfY2ItPnBpbl9jb2RlKTsKLQotICAgIC8qIE1hcmsgdGhhdCB3ZSBmb3J3YXJkZWQgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlciBQSU4gY29kZSAqLwotICAgIGJ0bV9jYi5waW5fY29kZV9sZW4gPSAwOwotCi0gICAgLyogV2UgY2FuIGNoYW5nZSBtb2RlIGJhY2sgcmlnaHQgYXdheSwgdGhhdCBvdGhlciBjb25uZWN0aW9uIGJlaW5nCi0gICAgICogZXN0YWJsaXNoZWQgKi8KLSAgICAvKiBpcyBub3QgZm9yY2VkIHRvIGJlIHNlY3VyZSAtIGZvdW5kIGEgRlcgaXNzdWUsIHNvIHdlIGNhbiBub3QgZG8gdGhpcwotICAgIGJ0bV9yZXN0b3JlX21vZGUoKTsgKi8KLQotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfV0FJVF9BVVRIX0NPTVBMRVRFKTsKLSAgfQotCi0gIC8qIElmIHBhaXJpbmcgZGlzYWJsZWQgT1IgKG5vIFBJTiBjYWxsYmFjayBhbmQgbm90IGJvbmRpbmcpICovCi0gIC8qIE9SIHdlIGNvdWxkIG5vdCBhbGxvY2F0ZSBlbnRyeSBpbiB0aGUgZGF0YWJhc2UgcmVqZWN0IHBhaXJpbmcgcmVxdWVzdCAqLwotICBlbHNlIGlmIChwX2NiLT5wYWlyaW5nX2Rpc2FibGVkIHx8Ci0gICAgICAgICAgIChwX2NiLT5hcGkucF9waW5fY2FsbGJhY2sgPT0gTlVMTCkKLQotICAgICAgICAgICAvKiBPUiBNaWNyb3NvZnQga2V5Ym9hcmQgY2FuIGZvciBzb21lIHJlYXNvbiB0cnkgdG8gZXN0YWJsaXNoCi0gICAgICAgICAgICAqIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIC8qICB0aGUgb25seSB0aGluZyB3ZSBjYW4gZG8gaGVyZSBpcyB0byBzaHV0IGl0IHVwLiAgTm9ybWFsbHkgd2Ugd2lsbAotICAgICAgICAgICAgICBiZSBvcmlnaW5hdG9yICovCi0gICAgICAgICAgIC8qICBmb3Iga2V5Ym9hcmQgYm9uZGluZyAqLwotICAgICAgICAgICB8fCAoIXBfZGV2X3JlYy0+SXNMb2NhbGx5SW5pdGlhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICgocF9kZXZfcmVjLT5kZXZfY2xhc3NbMV0gJiBCVE1fQ09EX01BSk9SX0NMQVNTX01BU0spID09Ci0gICAgICAgICAgICAgICAgQlRNX0NPRF9NQUpPUl9QRVJJUEhFUkFMKSAmJgotICAgICAgICAgICAgICAgKHBfZGV2X3JlYy0+ZGV2X2NsYXNzWzJdICYgQlRNX0NPRF9NSU5PUl9LRVlCT0FSRCkpKSB7Ci0gICAgQlRNX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICJidG1fc2VjX3Bpbl9jb2RlX3JlcXVlc3QoKTogUGFpcmluZyBkaXNhYmxlZDolZDsgUElOIGNhbGxiYWNrOiV4LCBEZXYgIgotICAgICAgICAiUmVjOiV4ISIsCi0gICAgICAgIHBfY2ItPnBhaXJpbmdfZGlzYWJsZWQsIHBfY2ItPmFwaS5wX3Bpbl9jYWxsYmFjaywgcF9kZXZfcmVjKTsKLQotICAgIGJ0c25kX2hjaWNfcGluX2NvZGVfbmVnX3JlcGx5KHBfYmRhKTsKLSAgfQotICAvKiBOb3RpZnkgdXBwZXIgbGF5ZXIgb2YgUElOIHJlcXVlc3QgYW5kIHN0YXJ0IGV4cGlyYXRpb24gdGltZXIgKi8KLSAgZWxzZSB7Ci0gICAgYnRtX3NlY19jaGFuZ2VfcGFpcmluZ19zdGF0ZShCVE1fUEFJUl9TVEFURV9XQUlUX0xPQ0FMX1BJTik7Ci0gICAgLyogUGluIGNvZGUgcmVxdWVzdCBjYW4gbm90IGNvbWUgYXQgdGhlIHNhbWUgdGltZSBhcyBjb25uZWN0aW9uIHJlcXVlc3QgKi8KLSAgICBwX2NiLT5jb25uZWN0aW5nX2JkYSA9IHBfYmRhOwotICAgIG1lbWNweShwX2NiLT5jb25uZWN0aW5nX2RjLCBwX2Rldl9yZWMtPmRldl9jbGFzcywgREVWX0NMQVNTX0xFTik7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgbmFtZSBpcyBrbm93biAqLwotICAgIC8qIEV2ZW4gaWYgbmFtZSBpcyBub3Qga25vd24gd2UgbWlnaHQgbm90IGJlIGFibGUgdG8gZ2V0IG9uZSAqLwotICAgIC8qIHRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB3ZSBhcmUgYWxyZWFkeSBnZXR0aW5nIHNvbWV0aGluZyBmcm9tIHRoZSAqLwotICAgIC8qIGRldmljZSwgc28gSENJIGxldmVsIGlzIGZsb3cgY29udHJvbGxlZCAqLwotICAgIC8qIEFsc28gY2Fubm90IHNlbmQgcmVtb3RlIG5hbWUgcmVxdWVzdCB3aGlsZSBwYWdpbmcsIGkuZS4gY29ubmVjdGlvbiBpcyBub3QKLSAgICAgKiBjb21wbGV0ZWQgKi8KLSAgICBpZiAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX05BTUVfS05PV04pIHsKLSAgICAgIEJUTV9UUkFDRV9FVkVOVCgiYnRtX3NlY19waW5fY29kZV9yZXF1ZXN0IGdvaW5nIGZvciBjYWxsYmFjayIpOwotCi0gICAgICBidG1fY2IucGFpcmluZ19mbGFncyB8PSBCVE1fUEFJUl9GTEFHU19QSU5fUkVRRDsKLSAgICAgIGlmIChwX2NiLT5hcGkucF9waW5fY2FsbGJhY2spIHsKLSAgICAgICAgKCpwX2NiLT5hcGkucF9waW5fY2FsbGJhY2spKAotICAgICAgICAgICAgcF9iZGEsIHBfZGV2X3JlYy0+ZGV2X2NsYXNzLCBwX2Rldl9yZWMtPnNlY19iZF9uYW1lLAotICAgICAgICAgICAgKHBfZGV2X3JlYy0+cmVxdWlyZWRfc2VjdXJpdHlfZmxhZ3NfZm9yX3BhaXJpbmcgJgotICAgICAgICAgICAgIEJUTV9TRUNfSU5fTUlOXzE2X0RJR0lUX1BJTikpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBCVE1fVFJBQ0VfRVZFTlQoImJ0bV9zZWNfcGluX2NvZGVfcmVxdWVzdCBnb2luZyBmb3IgcmVtb3RlIG5hbWUiKTsKLQotICAgICAgLyogV2UgcmVjZWl2ZWQgUElOIGNvZGUgcmVxdWVzdCBmb3IgdGhlIGRldmljZSB3aXRoIHVua25vd24gbmFtZSAqLwotICAgICAgLyogaXQgaXMgbm90IHVzZXIgZnJpZW5kbHkganVzdCB0byBhc2sgZm9yIHRoZSBQSU4gd2l0aG91dCBuYW1lICovCi0gICAgICAvKiB0cnkgdG8gZ2V0IG5hbWUgYXQgZmlyc3QgKi8KLSAgICAgIFNlbmRSZW1vdGVOYW1lUmVxdWVzdChwX2Rldl9yZWMtPmJkX2FkZHIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfdXBkYXRlX2Nsb2NrX29mZnNldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdXBkYXRlIGNsb2NrIG9mZnNldAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfdXBkYXRlX2Nsb2NrX29mZnNldCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGNsb2NrX29mZnNldCkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIHRCVE1fSU5RX0lORk8qIHBfaW5xX2luZm87Ci0KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2X2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9kZXZfcmVjID09IE5VTEwpIHJldHVybjsKLQotICBwX2Rldl9yZWMtPmNsb2NrX29mZnNldCA9IGNsb2NrX29mZnNldCB8IEJUTV9DTE9DS19PRkZTRVRfVkFMSUQ7Ci0KLSAgcF9pbnFfaW5mbyA9IEJUTV9JbnFEYlJlYWQocF9kZXZfcmVjLT5iZF9hZGRyKTsKLSAgaWYgKHBfaW5xX2luZm8gPT0gTlVMTCkgcmV0dXJuOwotCi0gIHBfaW5xX2luZm8tPnJlc3VsdHMuY2xvY2tfb2Zmc2V0ID0gY2xvY2tfb2Zmc2V0IHwgQlRNX0NMT0NLX09GRlNFVF9WQUxJRDsKLX0KLQotdWludDE2X3QgQlRNX0dldENsb2NrT2Zmc2V0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KHJlbW90ZV9iZGEpOwotICByZXR1cm4gKHBfZGV2X3JlYykgPyBwX2Rldl9yZWMtPmNsb2NrX29mZnNldCA6IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFMgVCBBIFQgSSBDICAgICBGIFUgTiBDIFQgSSBPIE4gUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfZXhlY3V0ZV9wcm9jZWR1cmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IHJlcXVpcmVkIHNlY3VyaXR5Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NlZHVyZS4gIFRoZXJlIGlzIGEgY2FzZSB3aGVuIG11bHRpcGxleGluZyBwcm90b2NvbAotICogICAgICAgICAgICAgICAgICBjYWxscyB0aGlzIGZ1bmN0aW9uIG9uIHRoZSBvcmlnaW5hdGluZyBzaWRlLCBjb25uZWN0aW9uIHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBwZWVyIHdpbGwgbm90IGJlIGVzdGFibGlzaGVkLiAgVGhpcyBmdW5jdGlvbiBpbiB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhc2UgcGVyZm9ybXMgb25seSBhdXRob3JpemF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgICAgIC0gcGVybWlzc2lvbiBpcyBncmFudGVkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCAtIGluIHByb2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyAgLSBwZXJtaXNzaW9uIGRlY2xpbmVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfZXhlY3V0ZV9wcm9jZWR1cmUodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIENIRUNLKHBfZGV2X3JlYyAhPSBudWxscHRyKTsKLSAgTE9HX0RFQlVHKAotICAgICAgInNlY3VyaXR5X3JlcXVpcmVkOjB4JXggc2VjdXJpdHlfZmxhZ3M6MHgleCBzZWN1cml0eV9zdGF0ZTolc1slaGh1XSIsCi0gICAgICBwX2Rldl9yZWMtPnNlY3VyaXR5X3JlcXVpcmVkLCBwX2Rldl9yZWMtPnNlY19mbGFncywKLSAgICAgIHNlY3VyaXR5X3N0YXRlX3RleHQoc3RhdGljX2Nhc3Q8dFNFQ1VSSVRZX1NUQVRFPihwX2Rldl9yZWMtPnNlY19zdGF0ZSkpCi0gICAgICAgICAgLmNfc3RyKCksCi0gICAgICBwX2Rldl9yZWMtPnNlY19zdGF0ZSk7Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlICE9IEJUTV9TRUNfU1RBVEVfSURMRSkgewotICAgIExPR19ERUJVRygKLSAgICAgICAgIlNlY3VyaXR5IHN0YXRlIGlzIGlkbGUgaW5kaWNhdGluZyByZW1vdGUgbmFtZSByZXF1ZXN0IGlzIG91dHN0YW5kaW5nIik7Ci0gICAgcmV0dXJuIChCVE1fQ01EX1NUQVJURUQpOwotICB9Ci0KLSAgaWYgKCFibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICAvLyBMb2FkIHRoZSBTTTQgdmFsdWVzICAvLwotICAgIEhBQ0tfYWNsX2NoZWNrX3NtNCgqcF9kZXZfcmVjKTsKLSAgfQotCi0gIC8qIElmIGFueSBzZWN1cml0eSBpcyByZXF1aXJlZCwgZ2V0IHRoZSBuYW1lIGZpcnN0ICovCi0gIGlmICghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19OQU1FX0tOT1dOKSAmJgotICAgICAgKHBfZGV2X3JlYy0+aGNpX2hhbmRsZSAhPSBIQ0lfSU5WQUxJRF9IQU5ETEUpKSB7Ci0gICAgTE9HX0RFQlVHKCJTZWN1cml0eSBNYW5hZ2VyOiBTdGFydCBnZXQgbmFtZSIpOwotICAgIGlmICghYnRtX3NlY19zdGFydF9nZXRfbmFtZShwX2Rldl9yZWMpKSB7Ci0gICAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHN0YXJ0IHJlbW90ZSBuYW1lIHJlcXVlc3QiKTsKLSAgICAgIHJldHVybiAoQlRNX05PX1JFU09VUkNFUyk7Ci0gICAgfQotICAgIHJldHVybiAoQlRNX0NNRF9TVEFSVEVEKTsKLSAgfQotCi0gIC8qIElmIGNvbm5lY3Rpb24gaXMgbm90IGF1dGhlbnRpY2F0ZWQgYW5kIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkICovCi0gIC8qIHN0YXJ0IGF1dGhlbnRpY2F0aW9uIGFuZCByZXR1cm4gUEVORElORyB0byB0aGUgY2FsbGVyICovCi0gIGlmICgoKCghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19BVVRIRU5USUNBVEVEKSkgJiYKLSAgICAgICAgKChwX2Rldl9yZWMtPklzTG9jYWxseUluaXRpYXRlZCgpICYmCi0gICAgICAgICAgKHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9BVVRIRU5USUNBVEUpKSB8fAotICAgICAgICAgKCFwX2Rldl9yZWMtPklzTG9jYWxseUluaXRpYXRlZCgpICYmCi0gICAgICAgICAgKHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSkpKSkgfHwKLSAgICAgICAoIShwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRCkgJiYKLSAgICAgICAgKCFwX2Rldl9yZWMtPklzTG9jYWxseUluaXRpYXRlZCgpICYmCi0gICAgICAgICAocF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fTUlOXzE2X0RJR0lUX1BJTikpKSkgJiYKLSAgICAgIChwX2Rldl9yZWMtPmhjaV9oYW5kbGUgIT0gSENJX0lOVkFMSURfSEFORExFKSkgewotICAgIC8qCi0gICAgICogV2UgcmVseSBvbiBCVE1fU0VDXzE2X0RJR0lUX1BJTl9BVVRIRUQgYmVpbmcgc2V0IGlmIE1JVE0gaXMgaW4gdXNlLAotICAgICAqIGFzIDE2IERJR0lUIGlzIG9ubHkgbmVlZGVkIGlmIE1JVE0gaXMgbm90IHVzZWQuIFVuZm9ydHVuYXRlbHksIHRoZQotICAgICAqIEJUTV9TRUNfQVVUSEVOVElDQVRFRCBpcyB1c2VkIGZvciBib3RoIE1JVE0gYW5kIG5vbi1NSVRNCi0gICAgICogYXV0aGVudGljYXRlZCBjb25uZWN0aW9ucywgaGVuY2Ugd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGhlcmUuCi0gICAgICovCi0KLSAgICBMT0dfREVCVUcoIlNlY3VyaXR5IE1hbmFnZXI6IFN0YXJ0IGF1dGhlbnRpY2F0aW9uIik7Ci0KLSAgICAvKgotICAgICAqIElmIHdlIGRvIGhhdmUgYSBsaW5rLWtleSwgYnV0IHdlIGVuZCB1cCBoZXJlIGJlY2F1c2Ugd2UgbmVlZCBhbgotICAgICAqIHVwZ3JhZGUsIHRoZW4gY2xlYXIgdGhlIGxpbmsta2V5IGtub3duIGFuZCBhdXRoZW50aWNhdGVkIGZsYWcgYmVmb3JlCi0gICAgICogcmVzdGFydGluZyBhdXRoZW50aWNhdGlvbi4KLSAgICAgKiBXQVJOSU5HOiBJZiB0aGUgY29udHJvbGxlciBoYXMgbGluay1rZXksIGl0IGlzIG9wdGlvbmFsIGFuZAotICAgICAqIHJlY29tbWVuZGVkIGZvciB0aGUgY29udHJvbGxlciB0byBzZW5kIGEgTGlua19LZXlfUmVxdWVzdC4KLSAgICAgKiBJbiBjYXNlIHdlIG5lZWQgYW4gdXBncmFkZSwgdGhlIG9ubHkgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gZGVsZXRlCi0gICAgICogdGhlIGV4aXN0aW5nIGxpbmsta2V5LiBUaGF0IGNvdWxkIGxlYWQgdG8gdmVyeSBiYWQgdXNlciBleHBlcmllbmNlCi0gICAgICogb3IgZXZlbiBJT1AgaXNzdWVzLCBpZiBhIHJlY29ubmVjdCBjYXVzZXMgYSBuZXcgY29ubmVjdGlvbiB0aGF0Ci0gICAgICogcmVxdWlyZXMgYW4gdXBncmFkZS4KLSAgICAgKi8KLSAgICBpZiAoKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9LTk9XTikgJiYKLSAgICAgICAgKCEocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDXzE2X0RJR0lUX1BJTl9BVVRIRUQpICYmCi0gICAgICAgICAoIXBfZGV2X3JlYy0+SXNMb2NhbGx5SW5pdGlhdGVkKCkgJiYKLSAgICAgICAgICAocF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfSU5fTUlOXzE2X0RJR0lUX1BJTikpKSkgewotICAgICAgcF9kZXZfcmVjLT5zZWNfZmxhZ3MgJj0KLSAgICAgICAgICB+KEJUTV9TRUNfTElOS19LRVlfS05PV04gfCBCVE1fU0VDX0xJTktfS0VZX0FVVEhFRCB8Ci0gICAgICAgICAgICBCVE1fU0VDX0FVVEhFTlRJQ0FURUQpOwotICAgIH0KLQotICAgIGJ0bV9zZWNfd2FpdF9hbmRfc3RhcnRfYXV0aGVudGljYXRpb24ocF9kZXZfcmVjKTsKLSAgICByZXR1cm4gKEJUTV9DTURfU1RBUlRFRCk7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0RFQlVHKCJBdXRoZW50aWNhdGlvbiBub3QgcmVxdWlyZWQiKTsKLSAgfQotCi0gIC8qIElmIGNvbm5lY3Rpb24gaXMgbm90IGVuY3J5cHRlZCBhbmQgZW5jcnlwdGlvbiBpcyByZXF1aXJlZCAqLwotICAvKiBzdGFydCBlbmNyeXB0aW9uIGFuZCByZXR1cm4gUEVORElORyB0byB0aGUgY2FsbGVyICovCi0gIGlmICghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19FTkNSWVBURUQpICYmCi0gICAgICAoKHBfZGV2X3JlYy0+SXNMb2NhbGx5SW5pdGlhdGVkKCkgJiYKLSAgICAgICAgKHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX09VVF9FTkNSWVBUKSkgfHwKLSAgICAgICAoIXBfZGV2X3JlYy0+SXNMb2NhbGx5SW5pdGlhdGVkKCkgJiYKLSAgICAgICAgKHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJiBCVE1fU0VDX0lOX0VOQ1JZUFQpKSkgJiYKLSAgICAgIChwX2Rldl9yZWMtPmhjaV9oYW5kbGUgIT0gSENJX0lOVkFMSURfSEFORExFKSkgewotICAgIEJUTV9UUkFDRV9FVkVOVCgiU2VjdXJpdHkgTWFuYWdlcjogU3RhcnQgZW5jcnlwdGlvbiIpOwotCi0gICAgYnRzbmRfaGNpY19zZXRfY29ubl9lbmNyeXB0KHBfZGV2X3JlYy0+aGNpX2hhbmRsZSwgdHJ1ZSk7Ci0gICAgcF9kZXZfcmVjLT5zZWNfc3RhdGUgPSBCVE1fU0VDX1NUQVRFX0VOQ1JZUFRJTkc7Ci0gICAgcmV0dXJuIChCVE1fQ01EX1NUQVJURUQpOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiRW5jcnlwdGlvbiBub3QgcmVxdWlyZWQiKTsKLSAgfQotCi0gIGlmICgocF9kZXZfcmVjLT5zZWN1cml0eV9yZXF1aXJlZCAmIEJUTV9TRUNfTU9ERTRfTEVWRUw0KSAmJgotICAgICAgKHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSAhPSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikpIHsKLSAgICBCVE1fVFJBQ0VfRVZFTlQoCi0gICAgICAgICIlczogU2VjdXJpdHkgTWFuYWdlcjogU0Mgb25seSBzZXJ2aWNlLCBidXQgbGluayBrZXkgdHlwZSBpcyAweCUwMnggLSIsCi0gICAgICAgICJzZWN1cml0eSBmYWlsdXJlIiwgX19mdW5jX18sIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSk7Ci0gICAgcmV0dXJuIChCVE1fRkFJTEVEX09OX1NFQ1VSSVRZKTsKLSAgfQotCi0gIC8qIEFsbCByZXF1aXJlZCAgc2VjdXJpdHkgcHJvY2VkdXJlcyBhbHJlYWR5IGVzdGFibGlzaGVkICovCi0gIHBfZGV2X3JlYy0+c2VjdXJpdHlfcmVxdWlyZWQgJj0KLSAgICAgIH4oQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUgfAotICAgICAgICBCVE1fU0VDX09VVF9FTkNSWVBUIHwgQlRNX1NFQ19JTl9FTkNSWVBUKTsKLQotICBCVE1fVFJBQ0VfRVZFTlQoIlNlY3VyaXR5IE1hbmFnZXI6IGFjY2VzcyBncmFudGVkIik7Ci0KLSAgcmV0dXJuIChCVE1fU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3N0YXJ0X2dldF9uYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdGFydCBnZXQgbmFtZSBwcm9jZWR1cmUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3RhcnRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidG1fc2VjX3N0YXJ0X2dldF9uYW1lKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICBpZiAoIUJUTV9Jc0RldmljZVVwKCkpIHJldHVybiBmYWxzZTsKLQotICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfR0VUVElOR19OQU1FOwotCi0gIC8qIDAgYW5kIE5VTEwgYXJlIGFzIHRpbWVvdXQgYW5kIGNhbGxiYWNrIHBhcmFtcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1c2VkIGluCi0gICAqIHNlY3VyaXR5IGdldCBuYW1lIGNhc2UgKi8KLSAgU2VuZFJlbW90ZU5hbWVSZXF1ZXN0KHBfZGV2X3JlYy0+YmRfYWRkcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY193YWl0X2FuZF9zdGFydF9hdXRoZW50aWNhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIGFsYXJtIHRvIHdhaXQgYW5kIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9zZWNfd2FpdF9hbmRfc3RhcnRfYXV0aGVudGljYXRpb24odEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIGlmIChhbGFybV9pc19zY2hlZHVsZWQoYnRtX2NiLmV4ZWN1dGlvbl93YWl0X3RpbWVyKSkgewotICAgIEJUTV9UUkFDRV9FVkVOVCgiJXM6IGFsYXJtIGFscmVhZHkgc2NoZWR1bGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBhbGFybV9zZXQoYnRtX2NiLmV4ZWN1dGlvbl93YWl0X3RpbWVyLCBCVE1fREVMQVlfQVVUSF9NUywKLSAgICAgICAgICAgIGJ0bV9zZWNfYXV0aF90aW1lcl90aW1lb3V0LCBwX2Rldl9yZWMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19hdXRoX3RpbWVyX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGNhbGxlZCBhZnRlciB3YWl0IHRpbWVvdXQgdG8gcmVxdWVzdCBhdXRoZW50aWNhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fc2VjX2F1dGhfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9ICh0QlRNX1NFQ19ERVZfUkVDKilkYXRhOwotICBwX2Rldl9yZWMtPnNlY19zdGF0ZSA9IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkc7Ci0gIGJ0c25kX2hjaWNfYXV0aF9yZXF1ZXN0KHBfZGV2X3JlYy0+aGNpX2hhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2ZpbmRfZmlyc3Rfc2VydgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vayBmb3IgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgc2VydmljZSBkYXRhYmFzZQotICogICAgICAgICAgICAgICAgICB3aXRoIHNwZWNpZmllZCBQU00KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY29yZCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX1NFUlZfUkVDKiBidG1fc2VjX2ZpbmRfZmlyc3Rfc2Vydihib29sIGlzX29yaWdpbmF0b3IsIHVpbnQxNl90IHBzbSkgewotICB0QlRNX1NFQ19TRVJWX1JFQyogcF9zZXJ2X3JlYyA9ICZidG1fY2Iuc2VjX3NlcnZfcmVjWzBdOwotICBpbnQgaTsKLQotICBpZiAoaXNfb3JpZ2luYXRvciAmJiBidG1fY2IucF9vdXRfc2VydiAmJiBidG1fY2IucF9vdXRfc2Vydi0+cHNtID09IHBzbSkgewotICAgIC8qIElmIHRoaXMgaXMgb3V0Z29pbmcgY29ubmVjdGlvbiBhbmQgdGhlIFBTTSBtYXRjaGVzIHBfb3V0X3NlcnYsCi0gICAgICogdXNlIGl0IGFzIHRoZSBjdXJyZW50IHNlcnZpY2UgKi8KLSAgICByZXR1cm4gYnRtX2NiLnBfb3V0X3NlcnY7Ci0gIH0KLQotICAvKiBvdGhlcndpc2UsIGp1c3QgZmluZCB0aGUgZmlyc3QgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBQU00gKi8KLSAgZm9yIChpID0gMDsgaSA8IEJUTV9TRUNfTUFYX1NFUlZJQ0VfUkVDT1JEUzsgaSsrLCBwX3NlcnZfcmVjKyspIHsKLSAgICBpZiAoKHBfc2Vydl9yZWMtPnNlY3VyaXR5X2ZsYWdzICYgQlRNX1NFQ19JTl9VU0UpICYmCi0gICAgICAgIChwX3NlcnZfcmVjLT5wc20gPT0gcHNtKSkKLSAgICAgIHJldHVybiAocF9zZXJ2X3JlYyk7Ci0gIH0KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfY29sbGlzaW9uX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuY3J5cHRpb24gY291bGQgbm90IHN0YXJ0IGJlY2F1c2Ugb2YgdGhlIGNvbGxpc2lvbgotICogICAgICAgICAgICAgICAgICB0cnkgdG8gZG8gaXQgYWdhaW4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIFRMRSBzdHJ1Y3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnRtX3NlY19jb2xsaXNpb25fdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIEJUTV9UUkFDRV9FVkVOVCgiJXMoKSIsIF9fZnVuY19fKTsKLQotICB0QlRNX1NUQVRVUyBzdGF0dXMgPSBidG1fc2VjX2V4ZWN1dGVfcHJvY2VkdXJlKGJ0bV9jYi5wX2NvbGxpZGVkX2Rldl9yZWMpOwotCi0gIC8qIElmIHJlc3VsdCBpcyBwZW5kaW5nIHJlcGx5IGZyb20gdGhlIHVzZXIgb3IgZnJvbSB0aGUgZGV2aWNlIGlzIHBlbmRpbmcgKi8KLSAgaWYgKHN0YXR1cyAhPSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAvKiBUaGVyZSBpcyBubyBuZXh0IHByb2NlZHVyZSBvciBzdGFydCBvZiBwcm9jZWR1cmUgZmFpbGVkLCBub3RpZnkgdGhlCi0gICAgICogd2FpdGluZyBsYXllciAqLwotICAgIGJ0bV9zZWNfZGV2X3JlY19jYmFja19ldmVudChidG1fY2IucF9jb2xsaWRlZF9kZXZfcmVjLCBzdGF0dXMsIGZhbHNlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlbmRfbGlua19rZXlfbm90aWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGwgdGhlIGxpbmsga2V5IGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidG1fc2VuZF9saW5rX2tleV9ub3RpZih0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgaWYgKGJ0bV9jYi5hcGkucF9saW5rX2tleV9jYWxsYmFjaykKLSAgICAoKmJ0bV9jYi5hcGkucF9saW5rX2tleV9jYWxsYmFjaykoCi0gICAgICAgIHBfZGV2X3JlYy0+YmRfYWRkciwgcF9kZXZfcmVjLT5kZXZfY2xhc3MsIHBfZGV2X3JlYy0+c2VjX2JkX25hbWUsCi0gICAgICAgIHBfZGV2X3JlYy0+bGlua19rZXksIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fcmVzdG9yZV9tb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNlY3VyaXR5IG1vZGUgdG8gcHJldmlvdXMgc2V0dGluZwotICogICAgICAgICAgICAgICAgICBpZiBpdCB3YXMgY2hhbmdlZCBkdXJpbmcgYm9uZGluZy4KLSAqCi0gKgotICogUGFyYW1ldGVyczogICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9yZXN0b3JlX21vZGUodm9pZCkgewotICBpZiAoYnRtX2NiLnNlY3VyaXR5X21vZGVfY2hhbmdlZCkgewotICAgIGJ0bV9jYi5zZWN1cml0eV9tb2RlX2NoYW5nZWQgPSBmYWxzZTsKLSAgICBidHNuZF9oY2ljX3dyaXRlX2F1dGhfZW5hYmxlKGZhbHNlKTsKLSAgfQotCi0gIGlmIChidG1fY2IucGluX3R5cGVfY2hhbmdlZCkgewotICAgIGJ0bV9jYi5waW5fdHlwZV9jaGFuZ2VkID0gZmFsc2U7Ci0gICAgYnRzbmRfaGNpY193cml0ZV9waW5fdHlwZShidG1fY2IuY2ZnLnBpbl90eXBlKTsKLSAgfQotfQotCi1ib29sIGlzX3NlY19zdGF0ZV9lcXVhbCh2b2lkKiBkYXRhLCB2b2lkKiBjb250ZXh0KSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IHN0YXRpY19jYXN0PHRCVE1fU0VDX0RFVl9SRUMqPihkYXRhKTsKLSAgdWludDhfdCogc3RhdGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oY29udGV4dCk7Ci0KLSAgaWYgKHBfZGV2X3JlYy0+c2VjX3N0YXRlID09ICpzdGF0ZSkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19maW5kX2Rldl9ieV9zZWNfc3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSByZWNvcmQgaW4gdGhlIGRldmljZSBkYXRhYmFzZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgICAgICB3aGljaCBpcyBiZWluZyBhdXRoZW50aWNhdGVkIG9yIGVuY3J5cHRlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjb3JkIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TRUNfREVWX1JFQyogYnRtX3NlY19maW5kX2Rldl9ieV9zZWNfc3RhdGUodWludDhfdCBzdGF0ZSkgewotICBsaXN0X25vZGVfdCogbiA9IGxpc3RfZm9yZWFjaChidG1fY2Iuc2VjX2Rldl9yZWMsIGlzX3NlY19zdGF0ZV9lcXVhbCwgJnN0YXRlKTsKLSAgaWYgKG4pIHJldHVybiBzdGF0aWNfY2FzdDx0QlRNX1NFQ19ERVZfUkVDKj4obGlzdF9ub2RlKG4pKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoYW5nZSBwYWlyaW5nIHN0YXRlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUodEJUTV9QQUlSSU5HX1NUQVRFIG5ld19zdGF0ZSkgewotICB0QlRNX1BBSVJJTkdfU1RBVEUgb2xkX3N0YXRlID0gYnRtX2NiLnBhaXJpbmdfc3RhdGU7Ci0KLSAgTE9HX0RFQlVHKCJQYWlyaW5nIHN0YXRlIGNoYW5nZWQgJXMgPT4gJXMgcGFpcmluZ19mbGFnczoweCV4IiwKLSAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKGJ0bV9jYi5wYWlyaW5nX3N0YXRlKSwKLSAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKG5ld19zdGF0ZSksIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzKTsKLQotICBCVE1fTG9nSGlzdG9yeSgKLSAgICAgIGtCdG1Mb2dUYWcsIGJ0bV9jYi5wYWlyaW5nX2JkYSwgIlBhaXJpbmcgc3RhdGUgY2hhbmdlZCIsCi0gICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVzID0+ICVzIiwgYnRtX3BhaXJfc3RhdGVfZGVzY3IoYnRtX2NiLnBhaXJpbmdfc3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bV9wYWlyX3N0YXRlX2Rlc2NyKG5ld19zdGF0ZSkpKTsKLSAgYnRtX2NiLnBhaXJpbmdfc3RhdGUgPSBuZXdfc3RhdGU7Ci0KLSAgaWYgKG5ld19zdGF0ZSA9PSBCVE1fUEFJUl9TVEFURV9JRExFKSB7Ci0gICAgYWxhcm1fY2FuY2VsKGJ0bV9jYi5wYWlyaW5nX3RpbWVyKTsKLQotICAgIGJ0bV9jYi5wYWlyaW5nX2ZsYWdzID0gMDsKLSAgICBidG1fY2IucGluX2NvZGVfbGVuID0gMDsKLQotICAgIC8qIE1ha2Ugc3VyZSB0aGUgdGhlIGxjYiBzaG93cyB3ZSBhcmUgbm90IGJvbmRpbmcgKi8KLSAgICBsMmN1X3VwZGF0ZV9sY2JfNF9ib25kaW5nKGJ0bV9jYi5wYWlyaW5nX2JkYSwgZmFsc2UpOwotCi0gICAgYnRtX3Jlc3RvcmVfbW9kZSgpOwotICAgIGJ0bV9zZWNfY2hlY2tfcGVuZGluZ19yZXFzKCk7Ci0gICAgYnRtX2lucV9jbGVhcl9zc3AoKTsKLQotICAgIGJ0bV9jYi5wYWlyaW5nX2JkYSA9IFJhd0FkZHJlc3M6OmtBbnk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogSWYgdHJhbnNpdGlvbmluZyBvdXQgb2YgaWRsZSwgbWFyayB0aGUgbGNiIGFzIGJvbmRpbmcgKi8KLSAgICBpZiAob2xkX3N0YXRlID09IEJUTV9QQUlSX1NUQVRFX0lETEUpCi0gICAgICBsMmN1X3VwZGF0ZV9sY2JfNF9ib25kaW5nKGJ0bV9jYi5wYWlyaW5nX2JkYSwgdHJ1ZSk7Ci0KLSAgICBhbGFybV9zZXRfb25fbWxvb3AoYnRtX2NiLnBhaXJpbmdfdGltZXIsIEJUTV9TRUNfVElNRU9VVF9WQUxVRSAqIDEwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0bV9zZWNfcGFpcmluZ190aW1lb3V0LCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3BhaXJfc3RhdGVfZGVzY3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybiBzdGF0ZSBkZXNjcmlwdGlvbiBmb3IgdHJhY2luZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgY2hhciogYnRtX3BhaXJfc3RhdGVfZGVzY3IodEJUTV9QQUlSSU5HX1NUQVRFIHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBjYXNlIEJUTV9QQUlSX1NUQVRFX0lETEU6Ci0gICAgICByZXR1cm4gKCJJRExFIik7Ci0gICAgY2FzZSBCVE1fUEFJUl9TVEFURV9HRVRfUkVNX05BTUU6Ci0gICAgICByZXR1cm4gKCJHRVRfUkVNX05BTUUiKTsKLSAgICBjYXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfUElOX1JFUToKLSAgICAgIHJldHVybiAoIldBSVRfUElOX1JFUSIpOwotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9QSU46Ci0gICAgICByZXR1cm4gKCJXQUlUX0xPQ0FMX1BJTiIpOwotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9OVU1FUklDX0NPTkZJUk06Ci0gICAgICByZXR1cm4gKCJXQUlUX05VTV9DT05GSVJNIik7Ci0gICAgY2FzZSBCVE1fUEFJUl9TVEFURV9LRVlfRU5UUlk6Ci0gICAgICByZXR1cm4gKCJLRVlfRU5UUlkiKTsKLSAgICBjYXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfTE9DQUxfT09CX1JTUDoKLSAgICAgIHJldHVybiAoIldBSVRfTE9DQUxfT09CX1JTUCIpOwotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9JT0NBUFM6Ci0gICAgICByZXR1cm4gKCJXQUlUX0xPQ0FMX0lPQ0FQUyIpOwotICAgIGNhc2UgQlRNX1BBSVJfU1RBVEVfSU5DT01JTkdfU1NQOgotICAgICAgcmV0dXJuICgiSU5DT01JTkdfU1NQIik7Ci0gICAgY2FzZSBCVE1fUEFJUl9TVEFURV9XQUlUX0FVVEhfQ09NUExFVEU6Ci0gICAgICByZXR1cm4gKCJXQUlUX0FVVEhfQ09NUExFVEUiKTsKLSAgICBjYXNlIEJUTV9QQUlSX1NUQVRFX1dBSVRfRElTQ09OTkVDVDoKLSAgICAgIHJldHVybiAoIldBSVRfRElTQ09OTkVDVCIpOwotICB9Ci0KLSAgcmV0dXJuICgiPz8/Iik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuCi0gKiAgICAgICAgICAgICAgICAgIHJlc3VsdCBhbmQgY2xlYXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfZGV2X3JlY19jYmFja19ldmVudCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NUQVRVUyBidG1fc3RhdHVzLCBib29sIGlzX2xlX3RyYW5zcG9ydCkgewotICBBU1NFUlQocF9kZXZfcmVjICE9IG51bGxwdHIpOwotICBMT0dfREVCVUcoInRyYW5zcG9ydD0lcywgYnRtX3N0YXR1cz0lcyIsIGlzX2xlX3RyYW5zcG9ydCA/ICJsZSIgOiAiY2xhc3NpYyIsCi0gICAgICAgICAgICBidG1fc3RhdHVzX3RleHQoYnRtX3N0YXR1cykuY19zdHIoKSk7Ci0KLSAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2sgPSBwX2Rldl9yZWMtPnBfY2FsbGJhY2s7Ci0gIHBfZGV2X3JlYy0+cF9jYWxsYmFjayA9IE5VTEw7Ci0gIGlmIChwX2NhbGxiYWNrICE9IG51bGxwdHIpIHsKLSAgICBpZiAoaXNfbGVfdHJhbnNwb3J0KSB7Ci0gICAgICAoKnBfY2FsbGJhY2spKCZwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciwgQlRfVFJBTlNQT1JUX0xFLAotICAgICAgICAgICAgICAgICAgICBwX2Rldl9yZWMtPnBfcmVmX2RhdGEsIGJ0bV9zdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAoKnBfY2FsbGJhY2spKCZwX2Rldl9yZWMtPmJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIsCi0gICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+cF9yZWZfZGF0YSwgYnRtX3N0YXR1cyk7Ci0gICAgfQotICB9Ci0KLSAgYnRtX3NlY19jaGVja19wZW5kaW5nX3JlcXMoKTsKLX0KLQotdm9pZCBidG1fc2VjX2NyX2xvY19vb2JfZGF0YV9jYmFja19ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0xPQ19PT0JfREFUQSBsb2Nfb29iX2RhdGEpIHsKLSAgdEJUTV9MRV9FVlRfREFUQSBldnRfZGF0YSA9IHsKLSAgICAgIC5sb2NhbF9vb2JfZGF0YSA9IGxvY19vb2JfZGF0YSwKLSAgfTsKLSAgaWYgKGJ0bV9jYi5hcGkucF9sZV9jYWxsYmFjaykgewotICAgICgqYnRtX2NiLmFwaS5wX2xlX2NhbGxiYWNrKShCVE1fTEVfU0NfTE9DX09PQl9FVlQsIGFkZHJlc3MsICZldnRfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfcXVldWVfbXhfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJuIHN0YXRlIGRlc2NyaXB0aW9uIGZvciB0cmFjaW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0bV9zZWNfcXVldWVfbXhfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnLCB1aW50MzJfdCBteF9wcm90b19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBteF9jaGFuX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpIHsKLSAgdEJUTV9TRUNfUVVFVUVfRU5UUlkqIHBfZSA9Ci0gICAgICAodEJUTV9TRUNfUVVFVUVfRU5UUlkqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVE1fU0VDX1FVRVVFX0VOVFJZKSk7Ci0KLSAgcF9lLT5wc20gPSBwc207Ci0gIHBfZS0+aXNfb3JpZyA9IGlzX29yaWc7Ci0gIHBfZS0+cF9jYWxsYmFjayA9IHBfY2FsbGJhY2s7Ci0gIHBfZS0+cF9yZWZfZGF0YSA9IHBfcmVmX2RhdGE7Ci0gIHBfZS0+dHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0JSX0VEUjsKLSAgcF9lLT5zZWNfYWN0ID0gQlRNX0JMRV9TRUNfTk9ORTsKLSAgcF9lLT5iZF9hZGRyID0gYmRfYWRkcjsKLQotICBCVE1fVFJBQ0VfRVZFTlQoCi0gICAgICAiJXMoKSBQU006IDB4JTA0eCAgSXNfT3JpZzogJXUgIG14X3Byb3RvX2lkOiAldSAgbXhfY2hhbl9pZDogJXUiLAotICAgICAgX19mdW5jX18sIHBzbSwgaXNfb3JpZywgbXhfcHJvdG9faWQsIG14X2NoYW5faWQpOwotCi0gIGZpeGVkX3F1ZXVlX2VucXVldWUoYnRtX2NiLnNlY19wZW5kaW5nX3EsIHBfZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGJ0bV9zZWNfY2hlY2tfcHJlZmV0Y2hfcGluKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICB1aW50OF90IG1ham9yID0gKHVpbnQ4X3QpKHBfZGV2X3JlYy0+ZGV2X2NsYXNzWzFdICYgQlRNX0NPRF9NQUpPUl9DTEFTU19NQVNLKTsKLSAgdWludDhfdCBtaW5vciA9ICh1aW50OF90KShwX2Rldl9yZWMtPmRldl9jbGFzc1syXSAmIEJUTV9DT0RfTUlOT1JfQ0xBU1NfTUFTSyk7Ci0gIGJvb2wgcnYgPSBmYWxzZTsKLQotICBpZiAoKG1ham9yID09IEJUTV9DT0RfTUFKT1JfQVVESU8pICYmCi0gICAgICAoKG1pbm9yID09IEJUTV9DT0RfTUlOT1JfQ09ORk1fSEFORFNGUkVFKSB8fAotICAgICAgIChtaW5vciA9PSBCVE1fQ09EX01JTk9SX0NBUl9BVURJTykpKSB7Ci0gICAgQlRNX1RSQUNFX0VWRU5UKAotICAgICAgICAiJXMoKSBTa2lwcGluZyBwcmUtZmV0Y2ggUElOIGZvciBjYXJraXQgQ09EIE1ham9yOiAweCUwMnggTWlub3I6ICIKLSAgICAgICAgIjB4JTAyeCIsCi0gICAgICAgIF9fZnVuY19fLCBtYWpvciwgbWlub3IpOwotCi0gICAgaWYgKCFidG1fY2Iuc2VjdXJpdHlfbW9kZV9jaGFuZ2VkKSB7Ci0gICAgICBidG1fY2Iuc2VjdXJpdHlfbW9kZV9jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgIGJ0c25kX2hjaWNfd3JpdGVfYXV0aF9lbmFibGUodHJ1ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGJ0bV9zZWNfY2hhbmdlX3BhaXJpbmdfc3RhdGUoQlRNX1BBSVJfU1RBVEVfV0FJVF9MT0NBTF9QSU4pOwotCi0gICAgLyogSWYgd2UgZ290IGEgUElOLCB1c2UgdGhhdCwgZWxzZSB0cnkgdG8gZ2V0IG9uZSAqLwotICAgIGlmIChidG1fY2IucGluX2NvZGVfbGVuKSB7Ci0gICAgICBCVE1fUElOQ29kZVJlcGx5KHBfZGV2X3JlYy0+YmRfYWRkciwgQlRNX1NVQ0NFU1MsIGJ0bV9jYi5waW5fY29kZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJ0bV9jYi5waW5fY29kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHBpbiB3YXMgbm90IHN1cHBsaWVkIC0gcHJlLWZldGNoIHBpbiBjb2RlIG5vdyAqLwotICAgICAgaWYgKGJ0bV9jYi5hcGkucF9waW5fY2FsbGJhY2sgJiYKLSAgICAgICAgICAoKGJ0bV9jYi5wYWlyaW5nX2ZsYWdzICYgQlRNX1BBSVJfRkxBR1NfUElOX1JFUUQpID09IDApKSB7Ci0gICAgICAgIEJUTV9UUkFDRV9ERUJVRygiJXMoKSBQSU4gY29kZSBjYWxsYmFjayBjYWxsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGlmIChCVE1fSXNBY2xDb25uZWN0aW9uVXAocF9kZXZfcmVjLT5iZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKSkKLSAgICAgICAgICBidG1fY2IucGFpcmluZ19mbGFncyB8PSBCVE1fUEFJUl9GTEFHU19QSU5fUkVRRDsKLSAgICAgICAgKGJ0bV9jYi5hcGkucF9waW5fY2FsbGJhY2spKAotICAgICAgICAgICAgcF9kZXZfcmVjLT5iZF9hZGRyLCBwX2Rldl9yZWMtPmRldl9jbGFzcywgcF9kZXZfcmVjLT5zZWNfYmRfbmFtZSwKLSAgICAgICAgICAgIChwX2Rldl9yZWMtPnJlcXVpcmVkX3NlY3VyaXR5X2ZsYWdzX2Zvcl9wYWlyaW5nICYKLSAgICAgICAgICAgICBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBydiA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gcnY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3F1ZXVlX2VuY3J5cHRfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZW5jcXVldWUgZW5jcnlwdGlvbiByZXF1ZXN0IHdoZW4gZGV2aWNlIGhhcyBhY3RpdmUgc2VjdXJpdHkKLSAqICAgICAgICAgICAgICAgICAgcHJvY2VzcyBwZW5kaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBidG1fc2VjX3F1ZXVlX2VuY3J5cHRfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHsKLSAgdEJUTV9TRUNfUVVFVUVfRU5UUlkqIHBfZSA9Ci0gICAgICAodEJUTV9TRUNfUVVFVUVfRU5UUlkqKW9zaV9tYWxsb2Moc2l6ZW9mKHRCVE1fU0VDX1FVRVVFX0VOVFJZKSArIDEpOwotCi0gIHBfZS0+cHNtID0gMDsgLyogaWYgUFNNIDAsIGVuY3J5cHRpb24gcmVxdWVzdCAqLwotICBwX2UtPnBfY2FsbGJhY2sgPSBwX2NhbGxiYWNrOwotICBwX2UtPnBfcmVmX2RhdGEgPSBwX3JlZl9kYXRhOwotICBwX2UtPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLSAgcF9lLT5zZWNfYWN0ID0gc2VjX2FjdDsKLSAgcF9lLT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShidG1fY2Iuc2VjX3BlbmRpbmdfcSwgcF9lKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfY2hlY2tfcGVuZGluZ19lbmNfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIHBlbmRpbmcgZW5jcnlwdGlvbiBjYWxsYmFjawotICogICAgICAgICAgICAgICAgICBpZiB3YWl0aW5nCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0bV9zZWNfY2hlY2tfcGVuZGluZ19lbmNfcmVxKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNyX2VuYWJsZSkgewotICBpZiAoZml4ZWRfcXVldWVfaXNfZW1wdHkoYnRtX2NiLnNlY19wZW5kaW5nX3EpKSByZXR1cm47Ci0KLSAgY29uc3QgdEJUTV9TVEFUVVMgcmVzID0gZW5jcl9lbmFibGUgPyBCVE1fU1VDQ0VTUyA6IEJUTV9FUlJfUFJPQ0VTU0lORzsKLSAgbGlzdF90KiBsaXN0ID0gZml4ZWRfcXVldWVfZ2V0X2xpc3QoYnRtX2NiLnNlY19wZW5kaW5nX3EpOwotICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihsaXN0KTsgbm9kZSAhPSBsaXN0X2VuZChsaXN0KTspIHsKLSAgICB0QlRNX1NFQ19RVUVVRV9FTlRSWSogcF9lID0gKHRCVE1fU0VDX1FVRVVFX0VOVFJZKilsaXN0X25vZGUobm9kZSk7Ci0gICAgbm9kZSA9IGxpc3RfbmV4dChub2RlKTsKLQotICAgIGlmIChwX2UtPmJkX2FkZHIgPT0gcF9kZXZfcmVjLT5iZF9hZGRyICYmIHBfZS0+cHNtID09IDAgJiYKLSAgICAgICAgcF9lLT50cmFuc3BvcnQgPT0gdHJhbnNwb3J0KSB7Ci0gICAgICBpZiAoZW5jcl9lbmFibGUgPT0gMCB8fCB0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUiB8fAotICAgICAgICAgIHBfZS0+c2VjX2FjdCA9PSBCVE1fQkxFX1NFQ19FTkNSWVBUIHx8Ci0gICAgICAgICAgcF9lLT5zZWNfYWN0ID09IEJUTV9CTEVfU0VDX0VOQ1JZUFRfTk9fTUlUTSB8fAotICAgICAgICAgIChwX2UtPnNlY19hY3QgPT0gQlRNX0JMRV9TRUNfRU5DUllQVF9NSVRNICYmCi0gICAgICAgICAgIHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MRV9BVVRIRU5USUNBVEVEKSkgewotICAgICAgICBpZiAocF9lLT5wX2NhbGxiYWNrKQotICAgICAgICAgICgqcF9lLT5wX2NhbGxiYWNrKSgmcF9kZXZfcmVjLT5iZF9hZGRyLCB0cmFuc3BvcnQsIHBfZS0+cF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKTsKLSAgICAgICAgZml4ZWRfcXVldWVfdHJ5X3JlbW92ZV9mcm9tX3F1ZXVlKGJ0bV9jYi5zZWNfcGVuZGluZ19xLCAodm9pZCopcF9lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfc2V0X3NlcnZfbGV2ZWw0X2ZsYWdzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgc2VjdXJpdHkgbW9kZSA0IGxldmVsIDQKLSAqICAgICAgICAgICAgICAgICAgZmxhZ3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBzZXJ2aWNlIHNlY3VyaXR5IHJlcXVpcmVtZW50cyB1cGRhdGVkIHRvIGluY2x1ZGUgc2VjdXJlCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIG9ubHkgbW9kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQxNl90IGJ0bV9zZWNfc2V0X3NlcnZfbGV2ZWw0X2ZsYWdzKHVpbnQxNl90IGN1cl9zZWN1cml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX29yaWdpbmF0b3IpIHsKLSAgdWludDE2X3Qgc2VjX2xldmVsNF9mbGFncyA9Ci0gICAgICBpc19vcmlnaW5hdG9yID8gQlRNX1NFQ19PVVRfTEVWRUw0X0ZMQUdTIDogQlRNX1NFQ19JTl9MRVZFTDRfRkxBR1M7Ci0KLSAgcmV0dXJuIGN1cl9zZWN1cml0eSB8IHNlY19sZXZlbDRfZmxhZ3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2NsZWFyX2JsZV9rZXlzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhciBvdXQgdGhlIEJMRSBrZXlzLgotICogICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgd2hlbiBkZXZpY2VzIGFyZSByZW1vdmVkIGluIEJUTV9TZWNEZWxldGVEZXZpY2UsCi0gKiAgICAgICAgICAgICAgICAgIG9yIHdoZW4gYSBuZXcgQlQgTGluayBrZXkgaXMgZ2VuZXJhdGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfY2xlYXJfYmxlX2tleXModEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIEJUTV9UUkFDRV9ERUJVRygiJXMoKSBDbGVhcmluZyBCTEUgS2V5cyIsIF9fZnVuY19fKTsKLSAgcF9kZXZfcmVjLT5ibGUua2V5X3R5cGUgPSBCVE1fTEVfS0VZX05PTkU7Ci0gIG1lbXNldCgmcF9kZXZfcmVjLT5ibGUua2V5cywgMCwgc2l6ZW9mKHRCVE1fU0VDX0JMRV9LRVlTKSk7Ci0KLSAgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9yZW1vdmVfZGV2KHBfZGV2X3JlYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2lzX2FfYm9uZGVkX2RldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgIElzIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGlzIGEgYm9uZGVkIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSAtIGRldiBpcyBib25kZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBidG1fc2VjX2lzX2FfYm9uZGVkX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkYSk7Ci0gIGJvb2wgaXNfYm9uZGVkID0gZmFsc2U7Ci0KLSAgaWYgKHBfZGV2X3JlYyAmJiAoKHBfZGV2X3JlYy0+YmxlLmtleV90eXBlICYmCi0gICAgICAgICAgICAgICAgICAgICAocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0xJTktfS0VZX0tOT1dOKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9LTk9XTikpKSB7Ci0gICAgaXNfYm9uZGVkID0gdHJ1ZTsKLSAgfQotICBMT0dfREVCVUcoIkRldmljZSByZWNvcmQgYm9uZGVkIGNoZWNrIHBlZXI6JXMgaXNfYm9uZGVkOiVzIiwKLSAgICAgICAgICAgIFBSSVZBVEVfQUREUkVTUyhiZGEpLCBsb2dib29sKGlzX2JvbmRlZCkuY19zdHIoKSk7Ci0gIHJldHVybiBpc19ib25kZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3VzZV9zbXBfYnJfY2hubAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBTTVAgQlIgY29ubmVjdGlvbiBjYW4gYmUgdXNlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBwZWVyLgotICogICAgICAgICAgICAgICAgICBJcyBjYWxsZWQgd2hlbiBhdXRoZW50aWNhdGlvbiBmb3IgZGVkaWNhdGVkIGJvbmRpbmcgaXMKLSAqICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgLSBpZiBTTVAgQlIgY29ubmVjdGlvbiBjYW4gYmUgdXNlZCAodGhlIGxpbmsga2V5IGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgZnJvbSBQLTI1NiBhbmQgdGhlIHBlZXIgc3VwcG9ydHMgU2VjdXJpdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZXIgb3ZlciBCUikuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGJ0bV9zZWNfdXNlX3NtcF9icl9jaG5sKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICB1aW50MzJfdCBleHRfZmVhdDsKLSAgdWludDhfdCBjaG5sX21hc2tbTDJDQVBfRklYRURfQ0hOTF9BUlJBWV9TSVpFXTsKLQotICBCVE1fVFJBQ0VfREVCVUcoIiVzKCkgbGlua19rZXlfdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYy0+bGlua19rZXlfdHlwZSk7Ci0KLSAgaWYgKChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgIT0gQlRNX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NikgJiYKLSAgICAgIChwX2Rldl9yZWMtPmxpbmtfa2V5X3R5cGUgIT0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIUwyQ0FfR2V0UGVlckZlYXR1cmVzKHBfZGV2X3JlYy0+YmRfYWRkciwgJmV4dF9mZWF0LCBjaG5sX21hc2spKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIShjaG5sX21hc2tbMF0gJiBMMkNBUF9GSVhFRF9DSE5MX1NNUF9CUl9CSVQpKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3NldF9wZWVyX3NlY19jYXBzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgc200IGFuZCBybXRfc2VjX2NhcHMgZmllbGRzCi0gKiAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgcGVlciBkZXZpY2UgZmVhdHVyZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19zZXRfcGVlcl9zZWNfY2Fwcyh1aW50MTZfdCBoY2lfaGFuZGxlLCBib29sIHNzcF9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzY19zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoY2lfcm9sZV9zd2l0Y2hfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnJfZWRyX3N1cHBvcnRlZCwgYm9vbCBsZV9zdXBwb3J0ZWQpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2X2J5X2hhbmRsZShoY2lfaGFuZGxlKTsKLSAgaWYgKHBfZGV2X3JlYyA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgcF9kZXZfcmVjLT5yZW1vdGVfZmVhdHVyZV9yZWNlaXZlZCA9IHRydWU7Ci0gIHBfZGV2X3JlYy0+cmVtb3RlX3N1cHBvcnRzX2hjaV9yb2xlX3N3aXRjaCA9IGhjaV9yb2xlX3N3aXRjaF9zdXBwb3J0ZWQ7Ci0KLSAgdWludDhfdCByZXFfcGVuZCA9IChwX2Rldl9yZWMtPnNtNCAmIEJUTV9TTTRfUkVRX1BFTkQpOwotCi0gIGlmICghKHBfZGV2X3JlYy0+c2VjX2ZsYWdzICYgQlRNX1NFQ19OQU1FX0tOT1dOKSB8fAotICAgICAgcF9kZXZfcmVjLT5pc19vcmlnaW5hdG9yKSB7Ci0gICAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1cyA9IGJ0bV9zZWNfZXhlY3V0ZV9wcm9jZWR1cmUocF9kZXZfcmVjKTsKLSAgICBpZiAoYnRtX3N0YXR1cyAhPSBCVE1fQ01EX1NUQVJURUQpIHsKLSAgICAgIExPR19XQVJOKCJTZWN1cml0eSBwcm9jZWR1cmUgbm90IHN0YXJ0ZWQhIHN0YXR1czolcyIsCi0gICAgICAgICAgICAgICBidG1fc3RhdHVzX3RleHQoYnRtX3N0YXR1cykuY19zdHIoKSk7Ci0gICAgICBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQocF9kZXZfcmVjLCBidG1fc3RhdHVzLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyogU3RvcmUgdGhlIFBlZXIgU2VjdXJpdHkgQ2FwYWJpbGl0ZXMgKGluIFNNNCBhbmQgcm10X3NlY19jYXBzKSAqLwotICBpZiAoKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TUCB8fAotICAgICAgIGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgJiYKLSAgICAgIHNzcF9zdXBwb3J0ZWQpIHsKLSAgICBwX2Rldl9yZWMtPnNtNCA9IEJUTV9TTTRfVFJVRTsKLSAgICBwX2Rldl9yZWMtPnJlbW90ZV9zdXBwb3J0c19zZWN1cmVfY29ubmVjdGlvbnMgPSBzY19zdXBwb3J0ZWQ7Ci0gIH0gZWxzZSB7Ci0gICAgcF9kZXZfcmVjLT5zbTQgPSBCVE1fU000X0tOT1dOOwotICAgIHBfZGV2X3JlYy0+cmVtb3RlX3N1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucyA9IGZhbHNlOwotICB9Ci0KLSAgaWYgKHBfZGV2X3JlYy0+cmVtb3RlX2ZlYXR1cmVzX25lZWRlZCkgewotICAgIExPR19ERUJVRygiTm93IGRldmljZSBpbiBTQyBPbmx5IG1vZGUsIHdhaXRpbmcgZm9yIHBlZXIgcmVtb3RlIGZlYXR1cmVzISIpOwotICAgIGJ0bV9pb19jYXBhYmlsaXRpZXNfcmVxKHBfZGV2X3JlYy0+YmRfYWRkcik7Ci0gICAgcF9kZXZfcmVjLT5yZW1vdGVfZmVhdHVyZXNfbmVlZGVkID0gZmFsc2U7Ci0gIH0KLQotICBpZiAocmVxX3BlbmQpIHsKLSAgICAvKiBSZXF1ZXN0IGZvciByZW1haW5pbmcgU2VjdXJpdHkgRmVhdHVyZXMgKGlmIGFueSkgKi8KLSAgICBsMmN1X3Jlc3VibWl0X3BlbmRpbmdfc2VjX3JlcSgmcF9kZXZfcmVjLT5iZF9hZGRyKTsKLSAgfQotCi0gIHBfZGV2X3JlYy0+cmVtb3RlX3N1cHBvcnRzX2JyZWRyID0gYnJfZWRyX3N1cHBvcnRlZDsKLSAgcF9kZXZfcmVjLT5yZW1vdGVfc3VwcG9ydHNfYmxlID0gbGVfc3VwcG9ydGVkOwotfQotCi0vLyBSZXR1cm4gREVWX0NMQVNTICh1aW50OF90WzNdKSBvZiBiZGEuIElmIHJlY29yZCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgb25lLgotY29uc3QgdWludDhfdCogYnRtX2dldF9kZXZfY2xhc3MoY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX29yX2FsbG9jX2RldihiZGEpOwotICByZXR1cm4gcF9kZXZfcmVjLT5kZXZfY2xhc3M7Ci19Ci0KLXZvaWQgQlRNX3VwZGF0ZV92ZXJzaW9uX2luZm8oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3RlX3ZlcnNpb25faW5mbyYgcmVtb3RlX3ZlcnNpb25faW5mbykgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYoYmRfYWRkcik7Ci0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgcmV0dXJuOwotCi0gIHBfZGV2X3JlYy0+cmVtb3RlX3ZlcnNpb25faW5mbyA9IHJlbW90ZV92ZXJzaW9uX2luZm87Ci19CmRpZmYgLS1naXQgYS9zdGFjay9idG0vYnRtX3NlYy5oIGIvc3RhY2svYnRtL2J0bV9zZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3NTQzZi4uMDAwMDAwMAotLS0gYS9zdGFjay9idG0vYnRtX3NlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgdGhlIEJsdWV0b290aCBTZWN1cml0eSBNYW5hZ2VyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2J0bS9zZWN1cml0eV9kZXZpY2VfcmVjb3JkLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9kZXZpY2VfdHlwZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NlY3VyaXR5X2NsaWVudF9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgQlRNX1NFQ19NQVhfQ09MTElTSU9OX0RFTEFZICg1MDAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19TRVJWX1JFQyogYnRtX3NlY19maW5kX2ZpcnN0X3NlcnYoYm9vbCBpc19vcmlnaW5hdG9yLCB1aW50MTZfdCBwc20pOwotCi10QlRNX1NFQ19ERVZfUkVDKiBidG1fc2VjX2ZpbmRfZGV2X2J5X3NlY19zdGF0ZSh1aW50OF90IHN0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQXBwbGljYXRpb24gbWFuYWdlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGZvcgotICogICAgICAgICAgICAgICAgICBzZWN1cml0eSBzZXJ2aWNlcy4gIFRoZXJlIGNhbiBiZSBvbmUgYW5kIG9ubHkgb25lCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNhdmluZyBsaW5rIGtleXMuICBCVE0gYWxsb3dzIG9ubHkgZmlyc3QKLSAqICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NlY1JlZ2lzdGVyKGNvbnN0IHRCVE1fQVBQTF9JTkZPKiBwX2NiX2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0FkZFJtdE5hbWVOb3RpZnlDYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQW55IHByb2ZpbGUgY2FuIHJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmFtZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGRldmljZSBpcyByZXNvbHZlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVnaXN0ZXJlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9TZWNBZGRSbXROYW1lTm90aWZ5Q2FsbGJhY2sodEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBbnkgcHJvZmlsZSBjYW4gZGVyZWdpc3RlciBub3RpZmljYXRpb24gd2hlbiBhIG5ldyBMaW5rIEtleQotICogICAgICAgICAgICAgICAgICBpcyBnZW5lcmF0ZWQgcGVyIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NlY0RlbGV0ZVJtdE5hbWVOb3RpZnlDYWxsYmFjayh0QlRNX1JNVF9OQU1FX0NBTExCQUNLKiBwX2NhbGxiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCBzZWN1cml0eSBmbGFncyBmb3IgdGhlIGRldmljZSBvbiBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICAgIHRydWUgb3IgZmFsc2UgaXMgZGV2aWNlIGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0dldFNlY3VyaXR5RmxhZ3NCeVRyYW5zcG9ydChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc2VjX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotYm9vbCBCVE1fSXNFbmNyeXB0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotYm9vbCBCVE1fSXNMaW5rS2V5QXV0aGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLWJvb2wgQlRNX0lzTGlua0tleUtub3duKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLWJvb2wgQlRNX0lzQXV0aGVudGljYXRlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0UGluVHlwZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IFBJTiB0eXBlIGZvciB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9TZXRQaW5UeXBlKHVpbnQ4X3QgcGluX3R5cGUsIFBJTl9DT0RFIHBpbl9jb2RlLCB1aW50OF90IHBpbl9jb2RlX2xlbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0U2VjdXJpdHlMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXIgc2VydmljZSBzZWN1cml0eSBsZXZlbCB3aXRoIFNlY3VyaXR5IE1hbmFnZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGlzX29yaWdpbmF0b3IgLSB0cnVlIGlmIG9yaWdpbmF0aW5nIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfbmFtZSAgICAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSByZWxldmFudCBvbmx5IGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbiB3aWxsIHNob3cgdGhpcyBuYW1lIHRvIHVzZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBpZiBCVF9NQVhfU0VSVklDRV9OQU1FX0xFTiBpcyAwLgotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlX2lkICAtIHNlcnZpY2UgSUQgZm9yIHRoZSBzZXJ2aWNlIHBhc3NlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgc2VjX2xldmVsICAgLSBiaXQgbWFzayBvZiB0aGUgc2VjdXJpdHkgZmVhdHVyZXMKLSAqICAgICAgICAgICAgICAgICAgcHNtICAgICAgICAgLSBMMkNBUCBQU00KLSAqICAgICAgICAgICAgICAgICAgbXhfcHJvdG9faWQgLSBwcm90b2NvbCBJRCBvZiBtdWx0aXBsZXhpbmcgcHJvdG8gYmVsb3cKLSAqICAgICAgICAgICAgICAgICAgbXhfY2hhbl9pZCAgLSBjaGFubmVsIElEIG9mIG11bHRpcGxleGluZyBwcm90byBiZWxvdwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1NldFNlY3VyaXR5TGV2ZWwoYm9vbCBpc19vcmlnaW5hdG9yLCBjb25zdCBjaGFyKiBwX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZV9pZCwgdWludDE2X3Qgc2VjX2xldmVsLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG14X3Byb3RvX2lkLCB1aW50MzJfdCBteF9jaGFuX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNDbHJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmVzIHNwZWNpZmllZCBzZXJ2aWNlIHJlY29yZChzKSBmcm9tIHRoZSBzZWN1cml0eQotICogICAgICAgICAgICAgICAgICBkYXRhYmFzZS4gQWxsIHNlcnZpY2UgcmVjb3JkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhcmUKLSAqICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4gVHlwaWNhbGx5IHVzZWQgb25seSBieSBkZXZpY2VzIHdpdGggbGltaXRlZCBSQU0gc28KLSAqICAgICAgICAgICAgICAgICAgdGhhdCBpdCBjYW4gcmV1c2UgYW4gb2xkIHNlY3VyaXR5IHNlcnZpY2UgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgICAgTm90ZTogVW5wcmVkaWN0YWJsZSByZXN1bHRzIG1heSBvY2N1ciBpZiBhIHNlcnZpY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQgdGhhdCBpcyBzdGlsbCBpbiB1c2UgYnkgYW4gYXBwbGljYXRpb24vcHJvZmlsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIFNlcnZpY2UgSUQgLSBJZCBvZiB0aGUgc2VydmljZSB0byByZW1vdmUuICcwJyByZW1vdmVzIGFsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgcmVjb3JkcyAoZXhjZXB0IFNEUCkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOdW1iZXIgb2YgcmVjb3JkcyB0aGF0IHdlcmUgZnJlZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgQlRNX1NlY0NsclNlcnZpY2UodWludDhfdCBzZXJ2aWNlX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNDbHJTZXJ2aWNlQnlQc20KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZXMgc3BlY2lmaWVkIHNlcnZpY2UgcmVjb3JkIGZyb20gdGhlIHNlY3VyaXR5IGRhdGFiYXNlLgotICogICAgICAgICAgICAgICAgICBBbGwgc2VydmljZSByZWNvcmRzIHdpdGggdGhlIHNwZWNpZmllZCBwc20gYXJlIHJlbW92ZWQuCi0gKiAgICAgICAgICAgICAgICAgIFR5cGljYWxseSB1c2VkIGJ5IEwyQ0FQIHRvIGZyZWUgdXAgdGhlIHNlcnZpY2UgcmVjb3JkIHVzZWQKLSAqICAgICAgICAgICAgICAgICAgYnkgZHluYW1pYyBQU00gY2xpZW50cyB3aGVuIHRoZSBjaGFubmVsIGlzIGNsb3NlZC4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIHBzbSBtdXN0IGJlIGEgdmlydHVhbCBwc20uCi0gKgotICogUGFyYW1ldGVycyAgICAgICBTZXJ2aWNlIElEIC0gSWQgb2YgdGhlIHNlcnZpY2UgdG8gcmVtb3ZlLiAnMCcgcmVtb3ZlcyBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIHJlY29yZHMgKGV4Y2VwdCBTRFApLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTnVtYmVyIG9mIHJlY29yZHMgdGhhdCB3ZXJlIGZyZWVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9TZWNDbHJTZXJ2aWNlQnlQc20odWludDE2X3QgcHNtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9QSU5Db2RlUmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIFNlY3VyaXR5IE1hbmFnZXIgc3VibWl0dGVkCi0gKiAgICAgICAgICAgICAgICAgIFBJTiBjb2RlIHJlcXVlc3QgdG8gdGhlIFVJLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgIC0gQWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciB3aGljaCBQSU4gd2FzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZAotICogICAgICAgICAgICAgICAgICByZXMgICAgICAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBCVE1fU1VDQ0VTUwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBpbl9sZW4gICAgICAtIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgUElOIENvZGUKLSAqICAgICAgICAgICAgICAgICAgcF9waW4gICAgICAgIC0gcG9pbnRlciB0byBhcnJheSB3aXRoIHRoZSBQSU4gQ29kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9QSU5Db2RlUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9TVEFUVVMgcmVzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbiwgdWludDhfdCogcF9waW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19ib25kX2J5X3RyYW5zcG9ydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgdGhpcyBpcyB0aGUgYm9uZCBmdW5jdGlvbiB0aGF0IHdpbGwgc3RhcnQgZWl0aGVyIFNTUCBvciBTTVAuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgLSBBZGRyZXNzIG9mIHRoZSBkZXZpY2UgdG8gYm9uZAotICogICAgICAgICAgICAgICAgICBwaW5fbGVuICAgICAgLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIFBJTiBDb2RlCi0gKiAgICAgICAgICAgICAgICAgIHBfcGluICAgICAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCB0aGUgUElOIENvZGUKLSAqCi0gKiAgTm90ZTogQWZ0ZXIgMi4xIHBhcmFtZXRlcnMgYXJlIG5vdCB1c2VkIGFuZCBwcmVzZXJ2ZWQgaGVyZSBub3QgdG8gY2hhbmdlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfYm9uZF9ieV90cmFuc3BvcnQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9waW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0JvbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBlcmZvcm0gYm9uZGluZyB3aXRoIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IHVwLCBidXQgbm90IHNlY3VyZSwgcGFpcmluZwotICogICAgICAgICAgICAgICAgICBpcyBhdHRlbXB0ZWQuICBJZiBhbHJlYWR5IHBhaXJlZCBCVE1fU1VDQ0VTUyBpcyByZXR1cm5lZC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSB0byBib25kCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCAgICAtIGRvaW5nIFNTUCBvdmVyIEJSL0VEUiBvciBTTVAgb3ZlciBMRQotICogICAgICAgICAgICAgICAgICBwaW5fbGVuICAgICAgLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIFBJTiBDb2RlCi0gKiAgICAgICAgICAgICAgICAgIHBfcGluICAgICAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCB0aGUgUElOIENvZGUKLSAqCi0gKiAgTm90ZTogQWZ0ZXIgMi4xIHBhcmFtZXRlcnMgYXJlIG5vdCB1c2VkIGFuZCBwcmVzZXJ2ZWQgaGVyZSBub3QgdG8gY2hhbmdlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZWNCb25kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIHVpbnQ4X3QqIHBfcGluKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNCb25kQ2FuY2VsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjYW5jZWwgb25nb2luZyBib25kaW5nIHByb2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBwZWVyIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCAgICAtIGZhbHNlIGZvciBCUi9FRFIgbGluazsgdHJ1ZSBmb3IgTEUgbGluawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2VjQm9uZENhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNHZXREZXZpY2VMaW5rS2V5VHlwZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gb2J0YWluIGxpbmsga2V5IHR5cGUgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIGl0IHJldHVybnMgQlRNX1NVQ0NFU1MgaWYgbGluayBrZXkgaXMgYXZhaWxhYmxlLCBvcgotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIFNlY3VyaXR5IE1hbmFnZXIgZG9lcyBub3Qga25vdyBhYm91dAotICogICAgICAgICAgICAgICAgICB0aGUgZGV2aWNlIG9yIGRldmljZSByZWNvcmQgZG9lcyBub3QgY29udGFpbiBsaW5rIGtleSBpbmZvCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fTEtFWV9UWVBFX0lHTk9SRSBpZiBsaW5rIGtleSBpcyB1bmtub3duLCBsaW5rIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX0xJTktfS0VZX1RZUEUgQlRNX1NlY0dldERldmljZUxpbmtLZXlUeXBlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldEVuY3J5cHRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVuc3VyZSB0aGF0IGNvbm5lY3Rpb24gaXMKLSAqICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkLiAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uIGFuIG9wZW4gY29ubmVjdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IG9ubHkgbmVlZGVkIGZvciBjb25uZWN0aW9ucyB0aGF0IGZpcnN0IHdhbnQgdG8KLSAqICAgICAgICAgICAgICAgICAgYnJpbmcgdXAgdW5lbmNyeXB0ZWQgbGlua3MsIHRoZW4gbGF0ZXIgZW5jcnlwdCB0aGVtLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCAgICAgLSBMaW5rIHRyYW5zcG9ydAotICogICAgICAgICAgICAgICAgICBwX2NhbGxiYWNrICAgIC0gUG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBQRU5ESU5HIGFmdGVyIHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZWR1cmVzIGFyZSBjb21wbGV0ZWQuICBDYW4gYmUgc2V0IHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIHN0YXR1cyBpcyBub3QgZGVzaXJlZC4KLSAqICAgICAgICAgICAgICAgICAgcF9yZWZfZGF0YSAgICAtIHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGNhbGxlciB3aXNoZXMgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVwb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24uIGNhbiBiZSBzZXQgdG8gTlVMTCBpZiBub3QgdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgc2VjX2FjdCAgICAgICAtIExFIHNlY3VyaXR5IGFjdGlvbiwgdW51c2VkIGZvciBCUi9FRFIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTICAgLSBhbHJlYWR5IGVuY3J5cHRlZAotICogICAgICAgICAgICAgICAgICBCVE1fUEVORElORyAgIC0gY29tbWFuZCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBjYWxsYmFjawotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERS0gY29ubmVjdGlvbiBub3QgdXAuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZICAgICAgLSBzZWN1cml0eSBwcm9jZWR1cmVzIGFyZSBjdXJyZW50bHkgYWN0aXZlCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9NT0RFX1VOU1VQUE9SVEVEIC0gaWYgc2VjdXJpdHkgbWFuYWdlciBub3QgbGlua2VkIGluLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0RW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCk7Ci0KLWJvb2wgQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0NvbmZpcm1SZXFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29uZmlybSB0aGUgbnVtZXJpYyB2YWx1ZSBmb3IKLSAqICAgICAgICAgICAgICAgICAgU2ltcGxlIFBhaXJpbmcgaW4gcmVzcG9uc2UgdG8gQlRNX1NQX0NGTV9SRVFfRVZUCi0gKgotICogUGFyYW1ldGVyczogICAgICByZXMgICAgICAgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0NvbmZpcm1SZXFSZXBseSh0QlRNX1NUQVRVUyByZXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1Bhc3NrZXlSZXFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgcGFzc2tleSBmb3IKLSAqICAgICAgICAgICAgICAgICAgU2ltcGxlIFBhaXJpbmcgaW4gcmVzcG9uc2UgdG8gQlRNX1NQX0tFWV9SRVFfRVZUCi0gKgotICogUGFyYW1ldGVyczogICAgICByZXMgICAgIC0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gQlRNX1NVQ0NFU1MgaWYgc3VjY2VzcwotICogICAgICAgICAgICAgICAgICBiZF9hZGRyIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcGFzc2tleSAtIG51bWVyaWMgdmFsdWUgaW4gdGhlIHJhbmdlIG9mCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9NSU5fUEFTU0tFWV9WQUwoMCkgLQotICogICAgICAgICAgICAgICAgICBCVE1fTUFYX1BBU1NLRVlfVkFMKDk5OTk5OSgweEY0MjNGKSkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1Bhc3NrZXlSZXFSZXBseSh0QlRNX1NUQVRVUyByZXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc2tleSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZExvY2FsT29iRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgbG9jYWwgT09CIGRhdGEgZnJvbQotICogICAgICAgICAgICAgICAgICBMTQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9SZWFkTG9jYWxPb2JEYXRhKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlbW90ZU9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgcmVtb3RlIE9PQiBkYXRhIGZvcgotICogICAgICAgICAgICAgICAgICBTaW1wbGUgUGFpcmluZyBpbiByZXNwb25zZSB0byBCVE1fU1BfUk1UX09PQl9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgYyAgICAgICAgICAgLSBzaW1wbGUgcGFpcmluZyBIYXNoIEMuCi0gKiAgICAgICAgICAgICAgICAgIHIgICAgICAgICAgIC0gc2ltcGxlIHBhaXJpbmcgUmFuZG9taXplciAgQy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fUmVtb3RlT29iRGF0YVJlcGx5KHRCVE1fU1RBVFVTIHJlcywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgYm90aCB0aGUgbG9jYWwgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcGVlciBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGJkX2FkZHIgc3VwcG9ydCBCUi9FRFIKLSAqICAgICAgICAgICAgICAgICAgU2VjdXJlIENvbm5lY3Rpb25zLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgQlIvRURSIFNlY3VyZSBDb25uZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGJvdGgKLSAqICAgICAgICAgICAgICAgICAgbG9jYWwgYW5kIHRoZSByZW1vdGUgZGV2aWNlLCBlbHNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9QZWVyU3VwcG9ydHNTZWN1cmVDb25uZWN0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgdGhlIHBlZXIgc3VwcG9ydHMKLSAqICAgICAgICAgICAgICAgICAgQlIvRURSIFNlY3VyZSBDb25uZWN0aW9ucy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIEJSL0VEUiBTZWN1cmUgQ29ubmVjdGlvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcGVlciwKLSAqICAgICAgICAgICAgICAgICAgZWxzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fUGVlclN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2wyY2FwX2FjY2Vzc19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBMMkNBUCB0byBncmFudCBwZXJtaXNzaW9uIHRvCi0gKiAgICAgICAgICAgICAgICAgIGVzdGFibGlzaCBMMkNBUCBjb25uZWN0aW9uIHRvIG9yIGZyb20gdGhlIHBlZXIgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHBzbSAgICAgICAgICAgLSBMMkNBUCBQU00KLSAqICAgICAgICAgICAgICAgICAgaXNfb3JpZ2luYXRvciAtIHRydWUgaWYgcHJvdG9jb2wgYWJvdmUgTDJDQVAgb3JpZ2luYXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwX2NhbGxiYWNrICAgIC0gUG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBQRU5ESU5HIGFmdGVyIHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZWR1cmVzIGFyZSBjb21wbGV0ZS4gTVVTVCBOT1QgQkUgTlVMTC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRCVE1fU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpOwotCi0vLyBBbGxvdyBlbmZvcmNpbmcgc2VjdXJpdHkgYnkgc3BlY2lmaWMgcmVxdWlyZW1lbnQgKGZyb20gc2hpbSBsYXllcikuCi10QlRNX1NUQVRVUyBidG1fc2VjX2wyY2FwX2FjY2Vzc19yZXFfYnlfcmVxdWlyZW1lbnQoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZWQsIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywgdm9pZCogcF9yZWZfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbGwgTXVsdGlwbGV4aW5nIFByb3RvY29scwotICpkdXJpbmcgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb24gdG8gb3IgZnJvbSBwZWVyIGRldmljZSB0byBncmFudCBwZXJtaXNzaW9uCi0gKnRvIGVzdGFibGlzaCBhcHBsaWNhdGlvbiBjb25uZWN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHBzbSAgICAgICAgICAgLSBMMkNBUCBQU00KLSAqICAgICAgICAgICAgICAgICAgaXNfb3JpZ2luYXRvciAtIHRydWUgaWYgcHJvdG9jb2wgYWJvdmUgTDJDQVAgb3JpZ2luYXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBteF9wcm90b19pZCAgIC0gcHJvdG9jb2wgSUQgb2YgdGhlIG11bHRpcGxleGVyCi0gKiAgICAgICAgICAgICAgICAgIG14X2NoYW5faWQgICAgLSBtdWx0aXBsZXhlciBjaGFubmVsIHRvIHJlYWNoIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfY2FsbGJhY2sgICAgLSBQb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIFBFTkRJTkcgYWZ0ZXIKLSAqcmVxdWlyZWQgcHJvY2VkdXJlcyBhcmUgY29tcGxldGVkIHBfcmVmX2RhdGEgICAgLSBQb2ludGVyIHRvIGFueSByZWZlcmVuY2UKLSAqZGF0YSBuZWVkZWQgYnkgdGhlIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfY29ubl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlbiB0aGUgcGVlciBkZXZpY2UgaXMgcmVxdWVzdGluZwotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19jb25uX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGRjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9jcmVhdGVfY29ubl9jYW5jZWxfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQ0kgZm9yIHRoZSBjcmVhdGUgY29ubmVjdGlvbiBjYW5jZWwKLSAqICAgICAgICAgICAgICAgICAgY29tbWFuZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlKHVpbnQ4X3QqIHApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19kZXZfcmVzZXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkZXZpY2UgcmVzZXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2Rldl9yZXNldCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfYWJvcnRfYWNjZXNzX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEwyQ0FQIG9yIFJGQ09NTSB0byBhYm9ydAotICogICAgICAgICAgICAgICAgICB0aGUgcGVuZGluZyBvcGVyYXRpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2Fib3J0X2FjY2Vzc19yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLWJvb2wgaXNfc3RhdGVfZ2V0dGluZ19uYW1lKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19ybXRfbmFtZV9yZXF1ZXN0X2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJlbW90ZSBuYW1lIHdhcyBvYnRhaW5lZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBwZWVyIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfcm10X25hbWVfcmVxdWVzdF9jb21wbGV0ZShjb25zdCBSYXdBZGRyZXNzKiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2JkX25hbWUsIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3JtdF9ob3N0X3N1cHBvcnRfZmVhdF9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIEhDSV9STVRfSE9TVF9TVVBfRkVBVF9OT1RJRllfRVZUIGlzIHJlY2VpdmVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19ybXRfaG9zdF9zdXBwb3J0X2ZlYXRfZXZ0KHVpbnQ4X3QqIHApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2lvX2NhcGFiaWxpdGllc19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gTE0gcmVxdWVzdCBmb3IgdGhlIElPCi0gKiAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkgb2YgdGhlIGxvY2FsIGRldmljZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgaWYgdGhlIE9PQiBkYXRhIGlzIHByZXNlbnQgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIGV2ZW50Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX2lvX2NhcGFiaWxpdGllc19yZXEoY29uc3QgUmF3QWRkcmVzcyYgcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1faW9fY2FwYWJpbGl0aWVzX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgSU8gY2FwYWJpbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGRldmljZSBpcyByZWNlaXZlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9pb19jYXBhYmlsaXRpZXNfcnNwKHVpbnQ4X3QqIHApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3Byb2Nfc3BfcmVxX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzcy9yZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgSENJX1VTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfRVZUCi0gKiAgICAgICAgICAgICAgICAgIG9yIEhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVF9FVlQKLSAqICAgICAgICAgICAgICAgICAgb3IgSENJX1VTRVJfUEFTU0tFWV9OT1RJRllfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3Byb2Nfc3BfcmVxX2V2dCh0QlRNX1NQX0VWVCBldmVudCwgdWludDhfdCogcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2ltcGxlX3BhaXJfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc2ltcGxlIHBhaXJpbmcgcHJvY2VzcyBpcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zaW1wbGVfcGFpcl9jb21wbGV0ZSh1aW50OF90KiBwKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZW1fb29iX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2Vzcy9yZXBvcnQKLSAqICAgICAgICAgICAgICAgICAgSENJX1JFTU9URV9PT0JfREFUQV9SRVFVRVNUX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9yZW1fb29iX3JlcSh1aW50OF90KiBwKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9yZWFkX2xvY2FsX29vYl9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiByZWFkIGxvY2FsIG9vYiBkYXRhIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCBieSB0aGUgTE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fcmVhZF9sb2NhbF9vb2JfY29tcGxldGUodWludDhfdCogcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2F1dGhfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlbiBhdXRoZW50aWNhdGlvbiBvZiB0aGUgY29ubmVjdGlvbiBpcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgYnkgdGhlIExNCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19hdXRoX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfZW5jcnlwdF9jaGFuZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlbiBlbmNyeXB0aW9uIG9mIHRoZSBjb25uZWN0aW9uIGlzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCBieSB0aGUgTE0KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2VuY3J5cHRfY2hhbmdlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jcl9lbmFibGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19jb25uZWN0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXIgZGV2aWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19jb25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDhfdCBlbmNfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9ST0xFIGFzc2lnbmVkX3JvbGUgPSBIQ0lfUk9MRV9QRVJJUEhFUkFMKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfZGlzY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGlzY29ubmVjdCBIQ0kgbGluawotICoKLSAqIFJldHVybnMgICAgICAgICAgYnRtIHN0YXR1cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBidG1fc2VjX2Rpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19kaXNjb25uZWN0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXIgZGV2aWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgIGRyb3BwZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2Rpc2Nvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbik7Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gbGluayBrZXkgaXMgZ2VuZXJhdGVkICovCi12b2lkIGJ0bV9zZWNfbGlua19rZXlfbm90aWZpY2F0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2xpbmtfa2V5X3JlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gY29udHJvbGxlciByZXF1ZXN0cyBsaW5rIGtleQotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjb3JkIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2xpbmtfa2V5X3JlcXVlc3QodWludDhfdCogcF9ldmVudCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3Bpbl9jb2RlX3JlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gY29udHJvbGxlciByZXF1ZXN0cyBQSU4gY29kZQotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjb3JkIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX3Bpbl9jb2RlX3JlcXVlc3QodWludDhfdCogcF9ldmVudCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3VwZGF0ZV9jbG9ja19vZmZzZXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHVwZGF0ZSBjbG9jayBvZmZzZXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX3VwZGF0ZV9jbG9ja19vZmZzZXQodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjbG9ja19vZmZzZXQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgcmVxdWlyZWQgc2VjdXJpdHkKLSAqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlLiAgVGhlcmUgaXMgYSBjYXNlIHdoZW4gbXVsdGlwbGV4aW5nIHByb3RvY29sCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxzIHRoaXMgZnVuY3Rpb24gb24gdGhlIG9yaWdpbmF0aW5nIHNpZGUsIGNvbm5lY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIHBlZXIgd2lsbCBub3QgYmUgZXN0YWJsaXNoZWQuICBUaGlzIGZ1bmN0aW9uIGluIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgY2FzZSBwZXJmb3JtcyBvbmx5IGF1dGhvcml6YXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyAgICAgLSBwZXJtaXNzaW9uIGlzIGdyYW50ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIC0gaW4gcHJvY2VzcwotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTICAtIHBlcm1pc3Npb24gZGVjbGluZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19maW5kX2ZpcnN0X3NlcnYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgZm9yIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIHNlcnZpY2UgZGF0YWJhc2UKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBzcGVjaWZpZWQgUFNNCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NFQ19TRVJWX1JFQyogYnRtX3NlY19maW5kX2ZpcnN0X3NlcnYoYm9vbCBpc19vcmlnaW5hdG9yLCB1aW50MTZfdCBwc20pOwotCi1ib29sIGlzX3NlY19zdGF0ZV9lcXVhbCh2b2lkKiBkYXRhLCB2b2lkKiBjb250ZXh0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfZmluZF9kZXZfYnlfc2VjX3N0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIGZvciB0aGUgcmVjb3JkIGluIHRoZSBkZXZpY2UgZGF0YWJhc2UgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgYmVpbmcgYXV0aGVudGljYXRlZCBvciBlbmNyeXB0ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY29yZCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9zZWNfZmluZF9kZXZfYnlfc2VjX3N0YXRlKHVpbnQ4X3Qgc3RhdGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19kZXZfcmVjX2NiYWNrX2V2ZW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgICByZXN1bHQgYW5kIGNsZWFyIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2Rldl9yZWNfY2JhY2tfZXZlbnQodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjLCB0QlRNX1NUQVRVUyByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xlX3RyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX2NsZWFyX2JsZV9rZXlzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhciBvdXQgdGhlIEJMRSBrZXlzLgotICogICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgd2hlbiBkZXZpY2VzIGFyZSByZW1vdmVkIGluIEJUTV9TZWNEZWxldGVEZXZpY2UsCi0gKiAgICAgICAgICAgICAgICAgIG9yIHdoZW4gYSBuZXcgQlQgTGluayBrZXkgaXMgZ2VuZXJhdGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0bV9zZWNfY2xlYXJfYmxlX2tleXModEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICAgSXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgYSBib25kZWQgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIC0gZGV2IGlzIGJvbmRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidG1fc2VjX3NldF9wZWVyX3NlY19jYXBzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgc200IGFuZCBybXRfc2VjX2NhcHMgZmllbGRzCi0gKiAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgcGVlciBkZXZpY2UgZmVhdHVyZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRtX3NlY19zZXRfcGVlcl9zZWNfY2Fwcyh1aW50MTZfdCBoY2lfaGFuZGxlLCBib29sIHNzcF9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzY19zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoY2lfcm9sZV9zd2l0Y2hfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYnJfZWRyX3N1cHBvcnRlZCwgYm9vbCBsZV9zdXBwb3J0ZWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX3NlY19jcl9sb2Nfb29iX2RhdGFfY2JhY2tfZXZlbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBhc3MgdGhlIGxvY2FsIG9vYiB1cCB0byBjYWxsZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBidG1fc2VjX2NyX2xvY19vb2JfZGF0YV9jYmFja19ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0xPQ19PT0JfREFUQSBsb2Nfb29iX2RhdGEpOwotCi0vLyBSZXR1cm4gREVWX0NMQVNTICh1aW50OF90WzNdKSBvZiBiZGEuIElmIHJlY29yZCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgb25lLgotY29uc3QgdWludDhfdCogYnRtX2dldF9kZXZfY2xhc3MoY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKZGlmZiAtLWdpdCBhL3N0YWNrL2J0bS9uZWlnaGJvcl9pbnF1aXJ5LmggYi9zdGFjay9idG0vbmVpZ2hib3JfaW5xdWlyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjlhNDU5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0bS9uZWlnaGJvcl9pbnF1aXJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2RldmljZV90eXBlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyogRGlzY292ZXJhYmxlIG1vZGVzICovCi1lbnVtIDogdWludDE2X3QgewotICBCVE1fTk9OX0RJU0NPVkVSQUJMRSA9IDAsCi0gIEJUTV9MSU1JVEVEX0RJU0NPVkVSQUJMRSA9ICgxIDw8IDApLAotICBCVE1fR0VORVJBTF9ESVNDT1ZFUkFCTEUgPSAoMSA8PCAxKSwKLSAgQlRNX01BWF9ESVNDT1ZFUkFCTEUgPSBCVE1fR0VORVJBTF9ESVNDT1ZFUkFCTEUsCi0gIEJUTV9ESVNDT1ZFUkFCTEVfTUFTSyA9IChCVE1fTElNSVRFRF9ESVNDT1ZFUkFCTEUgfCBCVE1fR0VORVJBTF9ESVNDT1ZFUkFCTEUpLAotICAvKiBoaWdoIGJ5dGUgZm9yIEJMRSBEaXNjb3ZlcmFibGUgbW9kZXMgKi8KLSAgQlRNX0JMRV9OT05fRElTQ09WRVJBQkxFID0gMHgwMDAwLAotICBCVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFID0gMHgwMTAwLAotICBCVE1fQkxFX0dFTkVSQUxfRElTQ09WRVJBQkxFID0gMHgwMjAwLAotICBCVE1fQkxFX01BWF9ESVNDT1ZFUkFCTEUgPSBCVE1fQkxFX0dFTkVSQUxfRElTQ09WRVJBQkxFLAotICBCVE1fQkxFX0RJU0NPVkVSQUJMRV9NQVNLID0KLSAgICAgIChCVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFIHwgQlRNX0JMRV9HRU5FUkFMX0RJU0NPVkVSQUJMRSksCi19OwotCi0vKiBDb25uZWN0YWJsZSBtb2RlcyAqLwotZW51bSA6IHVpbnQxNl90IHsKLSAgQlRNX05PTl9DT05ORUNUQUJMRSA9IDAsCi0gIEJUTV9DT05ORUNUQUJMRSA9ICgxIDw8IDApLAotICBCVE1fQ09OTkVDVEFCTEVfTUFTSyA9IChCVE1fTk9OX0NPTk5FQ1RBQkxFIHwgQlRNX0NPTk5FQ1RBQkxFKSwKLSAgLyogaGlnaCBieXRlIGZvciBCTEUgQ29ubmVjdGFibGUgbW9kZXMgKi8KLSAgQlRNX0JMRV9OT05fQ09OTkVDVEFCTEUgPSBCVE1fTk9OX0NPTk5FQ1RBQkxFLAotICBCVE1fQkxFX0NPTk5FQ1RBQkxFID0gMHgwMTAwLAotICBCVE1fQkxFX01BWF9DT05ORUNUQUJMRSA9IEJUTV9CTEVfQ09OTkVDVEFCTEUsCi0gIEJUTV9CTEVfQ09OTkVDVEFCTEVfTUFTSyA9IChCVE1fQkxFX05PTl9DT05ORUNUQUJMRSB8IEJUTV9CTEVfQ09OTkVDVEFCTEUpLAotfTsKLQotLyogSW5xdWlyeSBtb2RlcwotICogTm90ZTogVGhlc2UgbW9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5xdWlyeSBhY3RpdmUgdmFsdWVzIChCVE1fKkFDVElWRSkKLSAqLwotZW51bSA6IHVpbnQ4X3QgewotICBCVE1fSU5RVUlSWV9OT05FID0gMCwKLSAgQlRNX0lOUVVJUllfSU5BQ1RJVkUgPSAweDAsCi0gIEJUTV9HRU5FUkFMX0lOUVVJUlkgPSAweDAxLAotICAvKiBTU1AgaXMgYWN0aXZlLCBzbyBpbnF1aXJ5IGlzIGRpc2FsbG93ZWQgKHdvcmsgYXJvdW5kIGZvciBGVyBidWcpICovCi0gIEJUTV9TU1BfSU5RVUlSWV9BQ1RJVkUgPSAweDQsCi0gIC8qIGhpZ2ggbmliYmxlIG9mIGlucXVpcnkgbW9kZSBmb3IgQkxFIGlucXVpcnkgbW9kZSAqLwotICBCVE1fQkxFX0dFTkVSQUxfSU5RVUlSWSA9IDB4MTAsCi0gIEJUTV9CUl9JTlFVSVJZX01BU0sgPSAoQlRNX0dFTkVSQUxfSU5RVUlSWSksCi0gIEJUTV9CTEVfSU5RVUlSWV9NQVNLID0gKEJUTV9CTEVfR0VORVJBTF9JTlFVSVJZKSwKLSAgQlRNX0JMRV9JTlFVSVJZX05PTkUgPSBCVE1fSU5RVUlSWV9OT05FLAotICBCVE1fR0VORVJBTF9JTlFVSVJZX0FDVElWRSA9IEJUTV9HRU5FUkFMX0lOUVVJUlksCi0gIC8qIGEgZ2VuZXJhbCBpbnF1aXJ5IGlzIGluIHByb2dyZXNzICovCi0gIEJUTV9MRV9HRU5FUkFMX0lOUVVJUllfQUNUSVZFID0gQlRNX0JMRV9HRU5FUkFMX0lOUVVJUlksCi0gIC8qIEJSL0VEUiBpbnF1aXJ5IGFjdGl2aXR5IG1hc2sgKi8KLSAgQlRNX0JSX0lOUV9BQ1RJVkVfTUFTSyA9IChCVE1fR0VORVJBTF9JTlFVSVJZX0FDVElWRSksCi0gIC8qIExFIHNjYW4gYWN0aXZpdHkgbWFzayAqLwotICBCVE1fQkxFX1NDQU5fQUNUSVZFX01BU0sgPSAweEYwLAotICAvKiBMRSBpbnF1aXJ5IGFjdGl2aXR5IG1hc2sqLwotICBCVE1fQkxFX0lOUV9BQ1RJVkVfTUFTSyA9IChCVE1fTEVfR0VORVJBTF9JTlFVSVJZX0FDVElWRSksCi0gIC8qIGlucXVpcnkgYWN0aXZpdHkgbWFzayAqLwotICBCVE1fSU5RVUlSWV9BQ1RJVkVfTUFTSyA9IChCVE1fQlJfSU5RX0FDVElWRV9NQVNLIHwgQlRNX0JMRV9JTlFfQUNUSVZFX01BU0spLAotfTsKLQotLyogRGVmaW5lIHNjYW4gdHlwZXMgKi8KLWVudW0gOiB1aW50MTZfdCB7Ci0gIEJUTV9TQ0FOX1RZUEVfU1RBTkRBUkQgPSAwLAotICBCVE1fU0NBTl9UWVBFX0lOVEVSTEFDRUQgPSAxLCAvKiAxLjIgZGV2aWNlcyBvbmx5ICovCi19OwotCi0vKiBEZWZpbmUgaW5xdWlyeSByZXN1bHRzIG1vZGUgKi8KLWVudW0gOiB1aW50OF90IHsKLSAgQlRNX0lOUV9SRVNVTFRfU1RBTkRBUkQgPSAwLAotICBCVE1fSU5RX1JFU1VMVF9XSVRIX1JTU0kgPSAxLAotICBCVE1fSU5RX1JFU1VMVF9FWFRFTkRFRCA9IDIsCi0gIC8qIFJTU0kgdmFsdWUgbm90IHN1cHBsaWVkIChpZ25vcmUgaXQpICovCi0gIEJUTV9JTlFfUkVTX0lHTk9SRV9SU1NJID0gMHg3ZiwKLX07Ci0KLS8qIFRoZXNlIGFyZSB0aGUgZmllbGRzIHJldHVybmVkIGluIGVhY2ggZGV2aWNlJ3MgcmVzcG9uc2UgdG8gdGhlIGlucXVpcnkuICBJdAotICogaXMgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMgY2FsbGJhY2sgaWYgcmVnaXN0ZXJlZC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjbG9ja19vZmZzZXQ7Ci0gIFJhd0FkZHJlc3MgcmVtb3RlX2JkX2FkZHI7Ci0gIERFVl9DTEFTUyBkZXZfY2xhc3M7Ci0gIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlOwotICB1aW50OF90IHBhZ2Vfc2Nhbl9wZXJfbW9kZTsKLSAgdWludDhfdCBwYWdlX3NjYW5fbW9kZTsKLSAgaW50OF90IHJzc2k7IC8qIFNldCB0byBCVE1fSU5RX1JFU19JR05PUkVfUlNTSSBpZiAgbm90IHZhbGlkICovCi0gIHVpbnQzMl90IGVpcl91dWlkW0JUTV9FSVJfU0VSVklDRV9BUlJBWV9TSVpFXTsKLSAgYm9vbCBlaXJfY29tcGxldGVfbGlzdDsKLSAgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlOwotICB1aW50OF90IGlucV9yZXN1bHRfdHlwZTsKLSAgdEJMRV9BRERSX1RZUEUgYmxlX2FkZHJfdHlwZTsKLSAgdWludDE2X3QgYmxlX2V2dF90eXBlOwotICB1aW50OF90IGJsZV9wcmltYXJ5X3BoeTsKLSAgdWludDhfdCBibGVfc2Vjb25kYXJ5X3BoeTsKLSAgdWludDhfdCBibGVfYWR2ZXJ0aXNpbmdfc2lkOwotICBpbnQ4X3QgYmxlX3R4X3Bvd2VyOwotICB1aW50MTZfdCBibGVfcGVyaW9kaWNfYWR2X2ludDsKLSAgdWludDhfdCBmbGFnOwotICBib29sIGluY2x1ZGVfcnNpOwotfSB0QlRNX0lOUV9SRVNVTFRTOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERldmljZSBEaXNjb3ZlcnkgQ2FsbGJhY2sgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBub3RpZmljYXRpb25zIHdoZW4gdGhlIEJUTSBnZXRzIGlucXVpcnkgcmVzcG9uc2UuCi0gKiBGaXJzdCBwYXJhbSBpcyBpbnF1aXJ5IHJlc3VsdHMgZGF0YWJhc2UsIHNlY29uZCBpcyBwb2ludGVyIG9mIEVJUi4KLSAqLwotdHlwZWRlZiB2b2lkKHRCVE1fSU5RX1JFU1VMVFNfQ0IpKHRCVE1fSU5RX1JFU1VMVFMqIHBfaW5xX3Jlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9laXIsIHVpbnQxNl90IGVpcl9sZW4pOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IGlucV9jb3VudDsgLyogVXNlZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuICovCi0gIC8qIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbnF1aXJ5IG9wZXJhdGlvbi4gKFdlIGRvIG5vdCAgICovCi0gIC8qIHdhbnQgdG8gZmxvb2QgdGhlIGNhbGxlciB3aXRoIG11bHRpcGxlIHJlc3BvbnNlcyBmcm9tICAgICovCi0gIC8qIHRoZSBzYW1lIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLX0gdElOUV9CREFERFI7Ci0KLS8qIFRoaXMgaXMgdGhlIGlucXVpcnkgcmVzcG9uc2UgaW5mb3JtYXRpb24gaGVsZCBpbiBpdHMgZGF0YWJhc2UgYnkgQlRNLCBhbmQKLSAqIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgdmlhIEJUTV9JbnFEYlJlYWQsIEJUTV9JbnFEYkZpcnN0LCBhbmQKLSAqIEJUTV9JbnFEYk5leHQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUTV9JTlFfUkVTVUxUUyByZXN1bHRzOwotCi0gIGJvb2wgYXBwbF9rbm93c19yZW1fbmFtZTsgLyogc2V0IGJ5IGFwcGxpY2F0aW9uIGlmIGl0IGtub3dzIHRoZSByZW1vdGUgbmFtZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwZWVyIGRldmljZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGxhdGVyIHVzZWQgYnkgYXBwbGljYXRpb24gdG8gZGV0ZXJtaW5lIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlIG5hbWUgcmVxdWVzdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGJlIGRvbmUuIEhhdmluZyB0aGUgZmxhZyBoZXJlIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlIHN0b3JlIG9mIGlucXVpcnkgcmVzdWx0cyAqLwotICB1aW50MTZfdCByZW1vdGVfbmFtZV9sZW47Ci0gIHRCVE1fQkRfTkFNRSByZW1vdGVfbmFtZTsKLSAgdWludDhfdCByZW1vdGVfbmFtZV9zdGF0ZTsKLSAgdWludDhfdCByZW1vdGVfbmFtZV90eXBlOwotCi19IHRCVE1fSU5RX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDY0X3QgdGltZV9vZl9yZXNwOwotICB1aW50MzJfdAotICAgICAgaW5xX2NvdW50OyAvKiAidGltZXN0YW1wcyIgdGhlIGVudHJ5IHdpdGggYSBwYXJ0aWN1bGFyIGlucXVpcnkgY291bnQgICAqLwotICAgICAgICAgICAgICAgICAvKiBVc2VkIGZvciBkZXRlcm1pbmluZyBpZiBhIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGJlZW4gICAgICAqLwotICAgICAgICAgICAgICAgICAvKiByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5xdWlyeSBvcGVyYXRpb24uIChXZSBkbyBub3QgICAqLwotICAgICAgICAgICAgICAgICAvKiB3YW50IHRvIGZsb29kIHRoZSBjYWxsZXIgd2l0aCBtdWx0aXBsZSByZXNwb25zZXMgZnJvbSAgICAqLwotICAgICAgICAgICAgICAgICAvKiB0aGUgc2FtZSBkZXZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0QlRNX0lOUV9JTkZPIGlucV9pbmZvOwotICBib29sIGluX3VzZTsKLSAgYm9vbCBzY2FuX3JzcDsKLX0gdElOUV9EQl9FTlQ7Ci0KLXR5cGVkZWYgc3RydWN0IC8qIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgaW5xdWlyeSBmdW5jdGlvbnMgKi8KLXsKLSAgdWludDhfdCBtb2RlOyAgICAgLyogZ2VuZXJhbCBvciBsaW1pdGVkICovCi0gIHVpbnQ4X3QgZHVyYXRpb247IC8qIGR1cmF0aW9uIG9mIHRoZSBpbnF1aXJ5ICgxLjI4IHNlYyBpbmNyZW1lbnRzKSAqLwotfSB0QlRNX0lOUV9QQVJNUzsKLQotLyogU3RydWN0dXJlIHJldHVybmVkIHdpdGggaW5xdWlyeSBjb21wbGV0ZSBjYWxsYmFjayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQ4X3QgbnVtX3Jlc3A7IC8qIE51bWJlciBvZiByZXN1bHRzIGZyb20gdGhlIGN1cnJlbnQgaW5xdWlyeSAqLwotfSB0QlRNX0lOUVVJUllfQ01QTDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX0NNUExfQ0IqIHBfcmVtbmFtZV9jbXBsX2NiOwotCi0jZGVmaW5lIEJUTV9FWFRfUk1UX05BTUVfVElNRU9VVF9NUyAoNDAgKiAxMDAwKSAvKiA0MCBzZWNvbmRzICovCi0KLSAgYWxhcm1fdCogcmVtb3RlX25hbWVfdGltZXI7Ci0KLSAgdWludDE2X3QgZGlzY292ZXJhYmxlX21vZGU7Ci0gIHVpbnQxNl90IGNvbm5lY3RhYmxlX21vZGU7Ci0gIHVpbnQxNl90IHBhZ2Vfc2Nhbl93aW5kb3c7Ci0gIHVpbnQxNl90IHBhZ2Vfc2Nhbl9wZXJpb2Q7Ci0gIHVpbnQxNl90IGlucV9zY2FuX3dpbmRvdzsKLSAgdWludDE2X3QgaW5xX3NjYW5fcGVyaW9kOwotICB1aW50MTZfdCBpbnFfc2Nhbl90eXBlOwotICB1aW50MTZfdCBwYWdlX3NjYW5fdHlwZTsgLyogY3VycmVudCBwYWdlIHNjYW4gdHlwZSAqLwotCi0gIFJhd0FkZHJlc3MgcmVtbmFtZV9iZGE7IC8qIE5hbWUgb2YgYmQgYWRkciBmb3IgYWN0aXZlIHJlbW90ZSBuYW1lIHJlcXVlc3QgKi8KLSNkZWZpbmUgQlRNX1JNVF9OQU1FX0VYVCAweDEgLyogSW5pdGlhdGVkIHRocm91Z2ggQVBJICovCi0gIGJvb2wgcmVtbmFtZV9hY3RpdmU7IC8qIFN0YXRlIG9mIGEgcmVtb3RlIG5hbWUgcmVxdWVzdCBieSBleHRlcm5hbCBBUEkgKi8KLQotICB0QlRNX0NNUExfQ0IqIHBfaW5xX2NtcGxfY2I7Ci0gIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfaW5xX3Jlc3VsdHNfY2I7Ci0gIHVpbnQzMl90IGlucV9jb3VudGVyOyAvKiBDb3VudGVyIGluY3JlbWVudGVkIGVhY2ggdGltZSBhbiBpbnF1aXJ5IGNvbXBsZXRlcyAqLwotICAvKiBVc2VkIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCBkdXBsaWNhdGUgZGV2aWNlcyAqLwotICAvKiBoYXZlIHJlc3BvbmRlZCB0byB0aGUgc2FtZSBpbnF1aXJ5ICovCi0gIHRJTlFfQkRBRERSKiBwX2JkX2RiOyAgICAvKiBQb2ludGVyIHRvIG1lbW9yeSB0aGF0IGhvbGRzIGJkYWRkcnMgKi8KLSAgdWludDE2X3QgbnVtX2JkX2VudHJpZXM7IC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGRhdGFiYXNlICovCi0gIHVpbnQxNl90IG1heF9iZF9lbnRyaWVzOyAvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgY2FuIGJlIHN0b3JlZCAqLwotICB0SU5RX0RCX0VOVCBpbnFfZGJbQlRNX0lOUV9EQl9TSVpFXTsKLSAgdEJUTV9JTlFfUEFSTVMgaW5xcGFybXM7IC8qIENvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3VycmVudCBpbnF1aXJ5ICovCi0gIHRCVE1fSU5RVUlSWV9DTVBMCi0gICAgICBpbnFfY21wbF9pbmZvOyAvKiBTdGF0dXMgYW5kIG51bWJlciBvZiByZXNwb25zZXMgZnJvbSB0aGUgbGFzdCBpbnF1aXJ5ICovCi0KLSAgdWludDE2X3QgcGVyX21pbl9kZWxheTsgLyogQ3VycmVudCBwZXJpb2RpYyBtaW5pbXVtIGRlbGF5ICovCi0gIHVpbnQxNl90IHBlcl9tYXhfZGVsYXk7IC8qIEN1cnJlbnQgcGVyaW9kaWMgbWF4aW11bSBkZWxheSAqLwotICAvKiBpbnF1aXJ5IHRoYXQgaGFzIGJlZW4gY2FuY2VsbGVkKi8KLSAgdWludDhfdCBpbnFmaWx0X3R5cGU7IC8qIENvbnRhaW5zIHRoZSBpbnF1aXJ5IGZpbHRlciB0eXBlIChCRCBBRERSLCBDT0QsIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhcikgKi8KLQotI2RlZmluZSBCVE1fSU5RX0lOQUNUSVZFX1NUQVRFIDAKLSNkZWZpbmUgQlRNX0lOUV9BQ1RJVkVfU1RBVEUgXAotICAzIC8qIEFjdHVhbCBpbnF1aXJ5IG9yIHBlcmlvZGljIGlucXVpcnkgaXMgaW4gcHJvZ3Jlc3MgKi8KLQotICB1aW50OF90IHN0YXRlOyAgICAgIC8qIEN1cnJlbnQgc3RhdGUgdGhhdCB0aGUgaW5xdWlyeSBwcm9jZXNzIGlzIGluICovCi0gIHVpbnQ4X3QgaW5xX2FjdGl2ZTsgLyogQml0IE1hc2sgaW5kaWNhdGluZyB0eXBlIG9mIGlucXVpcnkgaXMgYWN0aXZlICovCi0gIGJvb2wgbm9faW5jX3NzcDsgICAgLyogdHJ1ZSwgdG8gc3RvcCBpbnF1aXJ5IG9uIGluY29taW5nIFNTUCAqLwotCi0gIHZvaWQgSW5pdCgpIHsKLSAgICBhbGFybV9mcmVlKHJlbW90ZV9uYW1lX3RpbWVyKTsKLSAgICByZW1vdGVfbmFtZV90aW1lciA9IGFsYXJtX25ldygiYnRtX2lucS5yZW1vdGVfbmFtZV90aW1lciIpOwotICAgIG5vX2luY19zc3AgPSBCVE1fTk9fU1NQX09OX0lOUVVJUlk7Ci0gIH0KLSAgdm9pZCBGcmVlKCkgeyBhbGFybV9mcmVlKHJlbW90ZV9uYW1lX3RpbWVyKTsgfQotCi19IHRCVE1fSU5RVUlSWV9WQVJfU1Q7Ci0KLS8qIFN0cnVjdHVyZSByZXR1cm5lZCB3aXRoIHJlbW90ZSBuYW1lICByZXF1ZXN0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHN0YXR1czsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB1aW50MTZfdCBsZW5ndGg7Ci0gIEJEX05BTUUgcmVtb3RlX2JkX25hbWU7Ci19IHRCVE1fUkVNT1RFX0RFVl9OQU1FOwotCi10eXBlZGVmIHVuaW9uIC8qIGNvbnRhaW5zIHRoZSBpbnF1aXJ5IGZpbHRlciBjb25kaXRpb24gKi8KLXsKLSAgUmF3QWRkcmVzcyBiZGFkZHJfY29uZDsKLSAgdEJUTV9DT0RfQ09ORCBjb2RfY29uZDsKLX0gdEJUTV9JTlFfRklMVF9DT05EOwotCi0jZGVmaW5lIEJUTV9JTlFfUkVTVUxUX0JSIDB4MDEKLSNkZWZpbmUgQlRNX0lOUV9SRVNVTFRfQkxFIDB4MDIKLQotZXh0ZXJuIGJvb2wgYnRtX2lucV9maW5kX2JkYWRkcihjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSk7Ci1leHRlcm4gdElOUV9EQl9FTlQqIGJ0bV9pbnFfZGJfZmluZChjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSk7CmRpZmYgLS1naXQgYS9zdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oIGIvc3RhY2svYnRtL3NlY3VyaXR5X2RldmljZV9yZWNvcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjOGQzNy4uMDAwMDAwMAotLS0gYS9zdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJnZC9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2RldmljZV90eXBlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXR5cGVkZWYgY2hhciB0QlRNX0xPQ19CRF9OQU1FW0JUTV9NQVhfTE9DX0JEX05BTUVfTEVOICsgMV07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgbWluX2Nvbm5faW50OwotICB1aW50MTZfdCBtYXhfY29ubl9pbnQ7Ci0gIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeTsKLSAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dDsKLQotfSB0QlRNX0xFX0NPTk5fUFJBTVM7Ci0KLS8qIFRoZSBNU0Igb2YgdGhlIGNsb2NrIG9mZnNldCBmaWVsZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgb2Zmc2V0IGlzIHZhbGlkLiAqLwotI2RlZmluZSBCVE1fQ0xPQ0tfT0ZGU0VUX1ZBTElEIDB4ODAwMAotCi0vKgotICogRGVmaW5lIHN0cnVjdHVyZSBmb3IgU2VjdXJpdHkgU2VydmljZSBSZWNvcmQuCi0gKiBBIHJlY29yZCBleGlzdHMgZm9yIGVhY2ggc2VydmljZSByZWdpc3RlcmVkIHdpdGggdGhlIFNlY3VyaXR5IE1hbmFnZXIKLSAqLwotI2RlZmluZSBCVE1fU0VDX09VVF9GTEFHUyAoQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19PVVRfRU5DUllQVCkKLSNkZWZpbmUgQlRNX1NFQ19JTl9GTEFHUyAoQlRNX1NFQ19JTl9BVVRIRU5USUNBVEUgfCBCVE1fU0VDX0lOX0VOQ1JZUFQpCi0KLSNkZWZpbmUgQlRNX1NFQ19PVVRfTEVWRUw0X0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFIHwgQlRNX1NFQ19PVVRfRU5DUllQVCB8IEJUTV9TRUNfT1VUX01JVE0gfCBcCi0gICBCVE1fU0VDX01PREU0X0xFVkVMNCkKLQotI2RlZmluZSBCVE1fU0VDX0lOX0xFVkVMNF9GTEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChCVE1fU0VDX0lOX0FVVEhFTlRJQ0FURSB8IEJUTV9TRUNfSU5fRU5DUllQVCB8IEJUTV9TRUNfSU5fTUlUTSB8IFwKLSAgIEJUTV9TRUNfTU9ERTRfTEVWRUw0KQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBteF9wcm90b19pZDsgICAgIC8qIFNlcnZpY2UgcnVucyBvdmVyIHRoaXMgbXVsdGlwbGV4ZXIgcHJvdG9jb2wgKi8KLSAgdWludDMyX3Qgb3JpZ19teF9jaGFuX2lkOyAvKiBDaGFubmVsIG9uIHRoZSBtdWx0aXBsZXhlciBwcm90b2NvbCAgICAqLwotICB1aW50MzJfdCB0ZXJtX214X2NoYW5faWQ7IC8qIENoYW5uZWwgb24gdGhlIG11bHRpcGxleGVyIHByb3RvY29sICAgICovCi0gIHVpbnQxNl90IHBzbTsgICAgICAgICAgICAgLyogTDJDQVAgUFNNIHZhbHVlICovCi0gIHVpbnQxNl90IHNlY3VyaXR5X2ZsYWdzOyAgLyogQml0bWFwIG9mIHJlcXVpcmVkIHNlY3VyaXR5IGZlYXR1cmVzICovCi0gIHVpbnQ4X3Qgc2VydmljZV9pZDsgICAgICAgLyogUGFzc2VkIGluIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgKi8KLSAgdWludDhfdCBvcmlnX3NlcnZpY2VfbmFtZVtCVF9NQVhfU0VSVklDRV9OQU1FX0xFTiArIDFdOwotICB1aW50OF90IHRlcm1fc2VydmljZV9uYW1lW0JUX01BWF9TRVJWSUNFX05BTUVfTEVOICsgMV07Ci19IHRCVE1fU0VDX1NFUlZfUkVDOwotCi0vKiBMRSBTZWN1cml0eSBpbmZvcm1hdGlvbiBvZiBkZXZpY2UgaW4gUGVyaXBoZXJhbCBSb2xlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE9jdGV0MTYgaXJrOyAgIC8qIHBlZXIgZGl2ZXJpZmllZCBpZGVudGl0eSByb290ICovCi0gIE9jdGV0MTYgcGx0azsgIC8qIHBlZXIgbG9uZyB0ZXJtIGtleSAqLwotICBPY3RldDE2IHBjc3JrOyAvKiBwZWVyIFNSSyBwZWVyIGRldmljZSB1c2VkIHRvIHNlY3VyZWQgc2lnbiBsb2NhbCBkYXRhICAqLwotCi0gIE9jdGV0MTYgbGx0azsgIC8qIGxvY2FsIGxvbmcgdGVybSBrZXkgKi8KLSAgT2N0ZXQxNiBsY3NyazsgLyogbG9jYWwgU1JLIHBlZXIgZGV2aWNlIHVzZWQgdG8gc2VjdXJlZCBzaWduIGxvY2FsIGRhdGEgICovCi0KLSAgQlRfT0NURVQ4IHJhbmQ7ICAgICAgICAvKiByYW5kb20gdmVjdG9yIGZvciBMVEsgZ2VuZXJhdGlvbiAqLwotICB1aW50MTZfdCBlZGl2OyAgICAgICAgIC8qIExUSyBkaXZlcnNpZmllciBvZiB0aGlzIHBlcmlwaGVyYWwgZGV2aWNlICovCi0gIHVpbnQxNl90IGRpdjsgICAgICAgICAgLyogbG9jYWwgRElWICB0byBnZW5lcmF0ZSBsb2NhbCBMVEs9ZDEoRVIsRElWLDApIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTUks9ZDEoRVIsRElWLDEpICAqLwotICB1aW50OF90IHNlY19sZXZlbDsgICAgIC8qIGxvY2FsIHBhaXJpbmcgc2VjdXJpdHkgbGV2ZWwgKi8KLSAgdWludDhfdCBrZXlfc2l6ZTsgICAgICAvKiBrZXkgc2l6ZSBvZiB0aGUgTFRLIGRlbGl2ZXJlZCB0byBwZWVyIGRldmljZSAqLwotICB1aW50OF90IHNya19zZWNfbGV2ZWw7IC8qIHNlY3VyaXR5IHByb3BlcnR5IG9mIHBlZXIgU1JLIGZvciB0aGlzIGRldmljZSAqLwotICB1aW50OF90IGxvY2FsX2Nzcmtfc2VjX2xldmVsOyAvKiBzZWN1cml0eSBwcm9wZXJ0eSBvZiBsb2NhbCBDU1JLIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSAqLwotCi0gIHVpbnQzMl90IGNvdW50ZXI7ICAgICAgIC8qIHBlZXIgc2lnbiBjb3VudGVyIGZvciB2ZXJpZnlpbmcgcmN2IHNpZ25lZCBjbWQgKi8KLSAgdWludDMyX3QgbG9jYWxfY291bnRlcjsgLyogbG9jYWwgc2lnbiBjb3VudGVyIGZvciBzZW5kaW5nIHNpZ25lZCB3cml0ZSBjbWQqLwotfSB0QlRNX1NFQ19CTEVfS0VZUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIHBzZXVkb19hZGRyOyAvKiBMRSBwc2V1ZG8gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGlmIGRpZmZlcmVudCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBhZGRyZXNzICAqLwotICB0QkxFX0FERFJfVFlQRSBibGVfYWRkcl90eXBlOyAvKiBMRSBkZXZpY2UgdHlwZTogcHVibGljIG9yIHJhbmRvbSBhZGRyZXNzICovCi0KLSAgdEJMRV9CRF9BRERSIGlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlOwotCi0jZGVmaW5lIEJUTV9BQ0NFUFRMSVNUX0JJVCAweDAxCi0jZGVmaW5lIEJUTV9SRVNPTFZJTkdfTElTVF9CSVQgMHgwMgotICB1aW50OF90IGluX2NvbnRyb2xsZXJfbGlzdDsgLyogaW4gY29udHJvbGxlciByZXNvbHZpbmcgbGlzdCBvciBub3QgKi8KLSAgdWludDhfdCByZXNvbHZpbmdfbGlzdF9pbmRleDsKLSAgUmF3QWRkcmVzcyBjdXJfcmFuZF9hZGRyOyAvKiBjdXJyZW50IHJhbmRvbSBhZGRyZXNzICovCi0KLSAgdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gICAgQlRNX0JMRV9BRERSX1BTRVVETyA9IDAsCi0gICAgQlRNX0JMRV9BRERSX1JSQSA9IDEsCi0gICAgQlRNX0JMRV9BRERSX1NUQVRJQyA9IDIsCi0gIH0gdEFERFJFU1NfVFlQRTsKLSAgdEFERFJFU1NfVFlQRSBhY3RpdmVfYWRkcl90eXBlOwotCi0gIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGU7IC8qIGJpdCBtYXNrIG9mIHZhbGlkIGtleSB0eXBlcyBpbiByZWNvcmQgKi8KLSAgdEJUTV9TRUNfQkxFX0tFWVMga2V5czsgICAgLyogTEUgZGV2aWNlIHNlY3VyaXR5IGluZm8gaW4gcGVyaXBoZXJhbCByb2RlICovCi19IHRCVE1fU0VDX0JMRTsKLQotZW51bSA6IHVpbnQxNl90IHsKLSAgQlRNX1NFQ19BVVRIRU5USUNBVEVEID0gMHgwMDAyLAotICBCVE1fU0VDX0VOQ1JZUFRFRCA9IDB4MDAwNCwKLSAgQlRNX1NFQ19OQU1FX0tOT1dOID0gMHgwMDA4LAotICBCVE1fU0VDX0xJTktfS0VZX0tOT1dOID0gMHgwMDEwLAotICBCVE1fU0VDX0xJTktfS0VZX0FVVEhFRCA9IDB4MDAyMCwKLSAgQlRNX1NFQ19ST0xFX1NXSVRDSEVEID0gMHgwMDQwLCAgLy8gVU5VU0VEIC0gb25seSBjbGVhcmVkCi0gIEJUTV9TRUNfSU5fVVNFID0gMHgwMDgwLCAgICAgICAgIC8vIFVOVVNFRCAtIG9ubHkgc2V0Ci0gIC8qIExFIGxpbmsgc2VjdXJpdHkgZmxhZyAqLwotICAvKiBMRSBsaW5rIGlzIGVuY3J5cHRlZCBhZnRlciBwYWlyaW5nIHdpdGggTUlUTSAqLwotICBCVE1fU0VDX0xFX0FVVEhFTlRJQ0FURUQgPSAweDAyMDAsCi0gIC8qIExFIGxpbmsgaXMgZW5jcnlwdGVkICovCi0gIEJUTV9TRUNfTEVfRU5DUllQVEVEID0gMHgwNDAwLAotICAvKiBub3QgdXNlZCAqLwotICBCVE1fU0VDX0xFX05BTUVfS05PV04gPSAweDA4MDAsICAvLyBVTlVTRUQKLSAgLyogYm9uZGVkIHdpdGggcGVlciAocGVlciBMVEsgYW5kL29yIFNSSyBpcyBzYXZlZCkgKi8KLSAgQlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTiA9IDB4MTAwMCwKLSAgLyogcGFpcmluZyBpcyBkb25lIHdpdGggTUlUTSAqLwotICBCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRCA9IDB4MjAwMCwKLSAgLyogcGFpcmluZyBpcyBkb25lIHdpdGggMTYgZGlnaXQgcGluICovCi0gIEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRCA9IDB4NDAwMCwKLX07Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRNX1NFQ19TVEFURV9JRExFID0gMCwKLSAgQlRNX1NFQ19TVEFURV9BVVRIRU5USUNBVElORyA9IDEsCi0gIEJUTV9TRUNfU1RBVEVfRU5DUllQVElORyA9IDIsCi0gIEJUTV9TRUNfU1RBVEVfR0VUVElOR19OQU1FID0gMywKLSAgQlRNX1NFQ19TVEFURV9BVVRIT1JJWklORyA9IDQsCi0gIEJUTV9TRUNfU1RBVEVfU1dJVENISU5HX1JPTEUgPSA1LAotICAvKiBkaXNjb25uZWN0aW5nIEJSL0VEUiAqLwotICBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSA2LAotICAvKiBkZWxheSB0byBjaGVjayBmb3IgZW5jcnlwdGlvbiB0byB3b3JrIGFyb3VuZCAqLwotICAvKiBjb250cm9sbGVyIHByb2JsZW1zICovCi0gIEJUTV9TRUNfU1RBVEVfREVMQVlfRk9SX0VOQyA9IDcsCi0gIEJUTV9TRUNfU1RBVEVfRElTQ09OTkVDVElOR19CTEUgPSA4LAotICBCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkdfQk9USCA9IDksCi19IHRTRUNVUklUWV9TVEFURTsKLQotc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzZWN1cml0eV9zdGF0ZV90ZXh0KGNvbnN0IHRTRUNVUklUWV9TVEFURSYgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX1NFQ19TVEFURV9JRExFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX1NFQ19TVEFURV9FTkNSWVBUSU5HKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9TRUNfU1RBVEVfR0VUVElOR19OQU1FKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9TRUNfU1RBVEVfQVVUSE9SSVpJTkcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX1NFQ19TVEFURV9TV0lUQ0hJTkdfUk9MRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fU0VDX1NUQVRFX0RJU0NPTk5FQ1RJTkcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX1NFQ19TVEFURV9ERUxBWV9GT1JfRU5DKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9TRUNfU1RBVEVfRElTQ09OTkVDVElOR19CTEUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX1NFQ19TVEFURV9ESVNDT05ORUNUSU5HX0JPVEgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV05bJWhodV0iLCBzdGF0ZSk7Ci0gIH0KLX0KLQotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEJUTV9TTTRfVU5LTk9XTiA9IDB4MDAsCi0gIEJUTV9TTTRfS05PV04gPSAweDEwLAotICBCVE1fU000X1RSVUUgPSAweDExLAotICBCVE1fU000X1JFUV9QRU5EID0gMHgwOCwgLyogc2V0IHRoaXMgYml0IHdoZW4gZ2V0dGluZyByZW1vdGUgZmVhdHVyZXMgKi8KLSAgQlRNX1NNNF9VUEdSQURFID0gMHgwNCwgIC8qIHNldCB0aGlzIGJpdCB3aGVuIHVwZ3JhZGluZyBsaW5rIGtleSAqLwotICBCVE1fU000X1JFVFJZID0gMHgwMiwgICAgLyogc2V0IHRoaXMgYml0IHRvIHJldHJ5IG9uIEhDSV9FUlJfS0VZX01JU1NJTkcgb3IgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VSUl9MTVBfRVJSX1RSQU5TX0NPTExJU0lPTiAqLwotICBCVE1fU000X0REX0FDUCA9Ci0gICAgICAweDIwLCAvKiBzZXQgdGhpcyBiaXQgdG8gaW5kaWNhdGUgcGVlciBpbml0aWF0ZWQgZGVkaWNhdGVkIGJvbmRpbmcgKi8KLSAgQlRNX1NNNF9DT05OX1BFTkQgPSAweDQwLCAvKiBzZXQgdGhpcyBiaXQgdG8gaW5kaWNhdGUgYWNjZXB0aW5nIGFjbCBjb25uOyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjbGVhcmVkIG9uIFwgYnRtX2FjbF9jcmVhdGVkICovCi19IHRCVE1fU000X0JJVDsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGNsYXNzX29mX2RldmljZV90ZXh0KGNvbnN0IERFVl9DTEFTUyYgY29kKSB7Ci0gIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoIjB4JTAyeCUwMnglMDJ4IiwgY29kWzJdLCBjb2RbMV0sIGNvZFswXSk7Ci19Ci0KLS8qCi0gKiBEZWZpbmUgc3RydWN0dXJlIGZvciBTZWN1cml0eSBEZXZpY2UgUmVjb3JkLgotICogQSByZWNvcmQgZXhpc3RzIGZvciBlYWNoIGRldmljZSBhdXRoZW50aWNhdGVkIHdpdGggdGhpcyBkZXZpY2UKLSAqLwotc3RydWN0IHRCVE1fU0VDX0RFVl9SRUMgewotICAvKiBQZWVyaW5nIGJvbmQgdHlwZSAqLwotICB0eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgICBCT05EX1RZUEVfVU5LTk9XTiA9IDAsCi0gICAgQk9ORF9UWVBFX1BFUlNJU1RFTlQgPSAxLAotICAgIEJPTkRfVFlQRV9URU1QT1JBUlkgPSAyCi0gIH0gdEJUTV9CT05EX1RZUEU7Ci0KLSAgdWludDMyX3QgcmVxdWlyZWRfc2VjdXJpdHlfZmxhZ3NfZm9yX3BhaXJpbmc7Ci0gIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrOwotICB2b2lkKiBwX3JlZl9kYXRhOwotICB1aW50MzJfdCB0aW1lc3RhbXA7IC8qIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCBjb25uZWN0aW9uICAgKi8KLSAgdWludDE2X3QgaGNpX2hhbmRsZTsgICAgIC8qIEhhbmRsZSB0byBjb25uZWN0aW9uIHdoZW4gZXhpc3RzICAgKi8KLSAgdWludDE2X3QgY2xvY2tfb2Zmc2V0OyAgIC8qIExhdGVzdCBrbm93biBjbG9jayBvZmZzZXQgICAgICAgICAgKi8KLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAgICAgIC8qIEJEX0FERFIgb2YgdGhlIGRldmljZSAgICAgICAgICAgICAgKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgICAgIC8qIERFVl9DTEFTUyBvZiB0aGUgZGV2aWNlICAgICAgICAgICAgKi8KLSAgTGlua0tleSBsaW5rX2tleTsgICAgICAgIC8qIERldmljZSBsaW5rIGtleSAgICAgICAgICAgICAgICAgICAgKi8KLQotIHB1YmxpYzoKLSAgUmF3QWRkcmVzcyBSZW1vdGVBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gYmRfYWRkcjsgfQotICB1aW50MTZfdCBnZXRfYnJfZWRyX2hjaV9oYW5kbGUoKSBjb25zdCB7IHJldHVybiBoY2lfaGFuZGxlOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgYm9vbCBCVE1fU2VjQWRkRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRfTkFNRSBiZF9uYW1lLCB1aW50OF90KiBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rS2V5KiBwX2xpbmtfa2V5LCB1aW50OF90IGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbmd0aCk7Ci0gIGZyaWVuZCB2b2lkIEJUTV9QSU5Db2RlUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9TVEFUVVMgcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbiwgdWludDhfdCogcF9waW4pOwotICBmcmllbmQgdm9pZCBidG1fc2VjX2F1dGhfY29tcGxldGUodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyBzdGF0dXMpOwotICBmcmllbmQgdm9pZCBidG1fc2VjX2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGVuY19tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUpOwotICBmcmllbmQgdm9pZCBidG1fc2VjX2VuY3J5cHRfY2hhbmdlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jcl9lbmFibGUpOwotICBmcmllbmQgdm9pZCBidG1fc2VjX2xpbmtfa2V5X25vdGlmaWNhdGlvbihjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUpOwotICBmcmllbmQgdEJUTV9TVEFUVVMgYnRtX3NlY19ib25kX2J5X3RyYW5zcG9ydChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fbGVuLCB1aW50OF90KiBwX3Bpbik7Ci0gIHVpbnQ4X3QgcGluX2NvZGVfbGVuZ3RoOyAvKiBMZW5ndGggb2YgdGhlIHBpbl9jb2RlIHVzZWQgZm9yIHBhcmluZyAqLwotCi0gcHVibGljOgotICB1aW50MTZfdCBzZWNfZmxhZ3M7IC8qIEN1cnJlbnQgZGV2aWNlIHNlY3VyaXR5IHN0YXRlICAgICAgKi8KLSAgYm9vbCBpc19kZXZpY2VfYXV0aGVudGljYXRlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX2ZsYWdzICYgQlRNX1NFQ19BVVRIRU5USUNBVEVEOwotICB9Ci0gIHZvaWQgc2V0X2RldmljZV9hdXRoZW50aWNhdGVkKCkgeyBzZWNfZmxhZ3MgfD0gQlRNX1NFQ19BVVRIRU5USUNBVEVEOyB9Ci0gIHZvaWQgcmVzZXRfZGV2aWNlX2F1dGhlbnRpY2F0ZWQoKSB7IHNlY19mbGFncyAmPSB+QlRNX1NFQ19BVVRIRU5USUNBVEVEOyB9Ci0KLSAgYm9vbCBpc19kZXZpY2VfZW5jcnlwdGVkKCkgY29uc3QgeyByZXR1cm4gc2VjX2ZsYWdzICYgQlRNX1NFQ19FTkNSWVBURUQ7IH0KLSAgdm9pZCBzZXRfZGV2aWNlX2VuY3J5cHRlZCgpIHsgc2VjX2ZsYWdzIHw9IEJUTV9TRUNfRU5DUllQVEVEOyB9Ci0gIHZvaWQgcmVzZXRfZGV2aWNlX2VuY3J5cHRlZCgpIHsgc2VjX2ZsYWdzICY9IH5CVE1fU0VDX0VOQ1JZUFRFRDsgfQotCi0gIGJvb2wgaXNfbmFtZV9rbm93bigpIGNvbnN0IHsgcmV0dXJuIHNlY19mbGFncyAmIEJUTV9TRUNfTkFNRV9LTk9XTjsgfQotICB2b2lkIHNldF9kZXZpY2Vfa25vd24oKSB7IHNlY19mbGFncyB8PSBCVE1fU0VDX05BTUVfS05PV047IH0KLSAgdm9pZCByZXNldF9kZXZpY2Vfa25vd24oKSB7IHNlY19mbGFncyAmPSB+QlRNX1NFQ19OQU1FX0tOT1dOOyB9Ci0KLSAgYm9vbCBpc19saW5rX2tleV9rbm93bigpIGNvbnN0IHsgcmV0dXJuIHNlY19mbGFncyAmIEJUTV9TRUNfTElOS19LRVlfS05PV047IH0KLSAgdm9pZCBzZXRfbGlua19rZXlfa25vd24oKSB7IHNlY19mbGFncyB8PSBCVE1fU0VDX0xJTktfS0VZX0tOT1dOOyB9Ci0gIHZvaWQgcmVzZXRfbGlua19rZXlfa25vd24oKSB7IHNlY19mbGFncyAmPSB+QlRNX1NFQ19MSU5LX0tFWV9LTk9XTjsgfQotCi0gIGJvb2wgaXNfbGlua19rZXlfYXV0aGVudGljYXRlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX2ZsYWdzICYgQlRNX1NFQ19MSU5LX0tFWV9BVVRIRUQ7Ci0gIH0KLSAgdm9pZCBzZXRfbGlua19rZXlfYXV0aGVudGljYXRlZCgpIHsgc2VjX2ZsYWdzIHw9IEJUTV9TRUNfTElOS19LRVlfQVVUSEVEOyB9Ci0gIHZvaWQgcmVzZXRfbGlua19rZXlfYXV0aGVudGljYXRlZCgpIHsgc2VjX2ZsYWdzICY9IH5CVE1fU0VDX0xJTktfS0VZX0FVVEhFRDsgfQotCi0gIGJvb2wgaXNfbGVfZGV2aWNlX2F1dGhlbnRpY2F0ZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNlY19mbGFncyAmIEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRDsKLSAgfQotICB2b2lkIHNldF9sZV9kZXZpY2VfYXV0aGVudGljYXRlZCgpIHsgc2VjX2ZsYWdzIHw9IEJUTV9TRUNfTEVfQVVUSEVOVElDQVRFRDsgfQotICB2b2lkIHJlc2V0X2xlX2RldmljZV9hdXRoZW50aWNhdGVkKCkgewotICAgIHNlY19mbGFncyAmPSB+QlRNX1NFQ19MRV9BVVRIRU5USUNBVEVEOwotICB9Ci0KLSAgYm9vbCBpc19sZV9kZXZpY2VfZW5jcnlwdGVkKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0VOQ1JZUFRFRDsKLSAgfQotICB2b2lkIHNldF9sZV9kZXZpY2VfZW5jcnlwdGVkKCkgeyBzZWNfZmxhZ3MgfD0gQlRNX1NFQ19MRV9FTkNSWVBURUQ7IH0KLSAgdm9pZCByZXNldF9sZV9kZXZpY2VfZW5jcnlwdGVkKCkgeyBzZWNfZmxhZ3MgJj0gfkJUTV9TRUNfTEVfRU5DUllQVEVEOyB9Ci0KLSAgYm9vbCBpc19sZV9saW5rX2tleV9rbm93bigpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX2ZsYWdzICYgQlRNX1NFQ19MRV9MSU5LX0tFWV9LTk9XTjsKLSAgfQotICB2b2lkIHNldF9sZV9saW5rX2tleV9rbm93bigpIHsgc2VjX2ZsYWdzIHw9IEJUTV9TRUNfTEVfTElOS19LRVlfS05PV047IH0KLSAgdm9pZCByZXNldF9sZV9saW5rX2tleV9rbm93bigpIHsgc2VjX2ZsYWdzICY9IH5CVE1fU0VDX0xFX0xJTktfS0VZX0tOT1dOOyB9Ci0KLSAgYm9vbCBpc19sZV9saW5rX2tleV9hdXRoZW50aWNhdGVkKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRDsKLSAgfQotICB2b2lkIHNldF9sZV9saW5rX2tleV9hdXRoZW50aWNhdGVkKCkgewotICAgIHNlY19mbGFncyB8PSBCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRDsKLSAgfQotICB2b2lkIHJlc2V0X2xlX2xpbmtfa2V5X2F1dGhlbnRpY2F0ZWQoKSB7Ci0gICAgc2VjX2ZsYWdzICY9IH5CVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRDsKLSAgfQotCi0gIGJvb2wgaXNfbGVfbGlua18xNl9kaWdpdF9rZXlfYXV0aGVudGljYXRlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX2ZsYWdzICYgQlRNX1NFQ18xNl9ESUdJVF9QSU5fQVVUSEVEOwotICB9Ci0gIHZvaWQgc2V0X2xlX2xpbmtfMTZfZGlnaXRfa2V5X2F1dGhlbnRpY2F0ZWQoKSB7Ci0gICAgc2VjX2ZsYWdzIHw9IEJUTV9TRUNfMTZfRElHSVRfUElOX0FVVEhFRDsKLSAgfQotICB2b2lkIHJlc2V0X2xlX2xpbmtfMTZfZGlnaXRfa2V5X2F1dGhlbnRpY2F0ZWQoKSB7Ci0gICAgc2VjX2ZsYWdzICY9IH5CVE1fU0VDXzE2X0RJR0lUX1BJTl9BVVRIRUQ7Ci0gIH0KLQotICB0QlRNX0JEX05BTUUgc2VjX2JkX25hbWU7IC8qIFVzZXIgZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGV2aWNlLiAobWF5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVkIHRvIHNhdmUgc3BhY2UgaW4gZGV2X3JlYyB0YWJsZSkgKi8KLQotICB1aW50OF90IHNlY19zdGF0ZTsgICAgICAgICAgLyogT3BlcmF0aW5nIHN0YXRlICAgICAgICAgICAgICAgICAgICAqLwotICBib29sIGlzX3NlY3VyaXR5X3N0YXRlX2lkbGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNlY19zdGF0ZSA9PSBCVE1fU0VDX1NUQVRFX0lETEU7Ci0gIH0KLSAgYm9vbCBpc19zZWN1cml0eV9zdGF0ZV9hdXRoZW50aWNhdGluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfQVVUSEVOVElDQVRJTkc7Ci0gIH0KLSAgYm9vbCBpc19zZWN1cml0eV9zdGF0ZV9lbmNyeXB0aW5nKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9FTkNSWVBUSU5HOwotICB9Ci0gIGJvb2wgaXNfc2VjdXJpdHlfc3RhdGVfZ2V0dGluZ19uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9HRVRUSU5HX05BTUU7Ci0gIH0KLSAgYm9vbCBpc19zZWN1cml0eV9zdGF0ZV9hdXRob3JpemluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfQVVUSE9SSVpJTkc7Ci0gIH0KLSAgYm9vbCBpc19zZWN1cml0eV9zdGF0ZV9zd2l0Y2hpbmdfcm9sZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfU1dJVENISU5HX1JPTEU7Ci0gIH0KLSAgYm9vbCBpc19zZWN1cml0eV9zdGF0ZV9kaXNjb25uZWN0aW5nKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9ESVNDT05ORUNUSU5HOwotICB9Ci0gIGJvb2wgaXNfc2VjdXJpdHlfc3RhdGVfd2FpdF9mb3JfZW5jcnlwdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VjX3N0YXRlID09IEJUTV9TRUNfU1RBVEVfREVMQVlfRk9SX0VOQzsKLSAgfQotICBib29sIGlzX3NlY3VyaXR5X3N0YXRlX2JsZV9kaXNjb25uZWN0aW5nKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9ESVNDT05ORUNUSU5HX0JMRTsKLSAgfQotICBib29sIGlzX3NlY3VyaXR5X3N0YXRlX2JyX2Vkcl9hbmRfYmxlKCkgY29uc3QgewotICAgIHJldHVybiBzZWNfc3RhdGUgPT0gQlRNX1NFQ19TVEFURV9ESVNDT05ORUNUSU5HX0JPVEg7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgaXNfb3JpZ2luYXRvcjsgICAgICAgICAvKiB0cnVlIGlmIGRldmljZSBpcyBvcmlnaW5hdGluZyBjb25uZWN0aW9uICovCi0gIGZyaWVuZCB0QlRNX1NUQVRVUyBCVE1fU2V0RW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpOwotICBmcmllbmQgdEJUTV9TVEFUVVMgYnRtX3NlY19sMmNhcF9hY2Nlc3NfcmVxX2J5X3JlcXVpcmVtZW50KAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZWQsIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLCB2b2lkKiBwX3JlZl9kYXRhKTsKLSAgZnJpZW5kIHRCVE1fU1RBVFVTIGJ0bV9zZWNfbXhfYWNjZXNzX3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpOwotCi0gcHVibGljOgotICBib29sIElzTG9jYWxseUluaXRpYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGlzX29yaWdpbmF0b3I7IH0KLQotICBib29sIHJvbGVfY2VudHJhbDsgICAgICAgICAgLyogdHJ1ZSBpZiBjdXJyZW50IG1vZGUgaXMgY2VudHJhbCAgICAgKi8KLSAgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZWQ7IC8qIFNlY3VyaXR5IHJlcXVpcmVkIGZvciBjb25uZWN0aW9uICAgKi8KLSAgYm9vbCBsaW5rX2tleV9ub3Rfc2VudDsgLyogbGluayBrZXkgbm90aWZpY2F0aW9uIGhhcyBub3QgYmVlbiBzZW50IHdhaXRpbmcgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKi8KLSAgdWludDhfdCBsaW5rX2tleV90eXBlOyAgLyogVHlwZSBvZiBrZXkgdXNlZCBpbiBwYWlyaW5nICAgKi8KLQotICB1aW50OF90IHNtNDsgICAgICAgICAgICAgICAgLyogQlRNX1NNNF9UUlVFLCBpZiB0aGUgcGVlciBzdXBwb3J0cyBTTTQgKi8KLSAgdEJUTV9JT19DQVAgcm10X2lvX2NhcHM7ICAgIC8qIElPIGNhcGFiaWxpdHkgb2YgdGhlIHBlZXIgZGV2aWNlICovCi0gIHRCVE1fQVVUSF9SRVEgcm10X2F1dGhfcmVxOyAvKiB0aGUgYXV0aF9yZXEgZmxhZyBhcyBpbiB0aGUgSU8gY2FwcyByc3AgZXZ0ICovCi0KLSAgYm9vbCByZW1vdGVfc3VwcG9ydHNfc2VjdXJlX2Nvbm5lY3Rpb25zOwotICBmcmllbmQgdm9pZCBidG1fc2VjX3NldF9wZWVyX3NlY19jYXBzKHVpbnQxNl90IGhjaV9oYW5kbGUsIGJvb2wgc3NwX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhjaV9yb2xlX3N3aXRjaF9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBicl9lZHJfc3VwcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVfc3VwcG9ydGVkKTsKLQotIHB1YmxpYzoKLSAgYm9vbCBTdXBwb3J0c1NlY3VyZUNvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiByZW1vdGVfc3VwcG9ydHNfc2VjdXJlX2Nvbm5lY3Rpb25zOwotICB9Ci0KLSAgYm9vbCByZW1vdGVfZmVhdHVyZXNfbmVlZGVkOyAvKiBzZXQgdG8gdHJ1ZSBpZiB0aGUgbG9jYWwgZGV2aWNlIGlzIGluICovCi0gIC8qICJTZWN1cmUgQ29ubmVjdGlvbnMgT25seSIgbW9kZSBhbmQgaXQgcmVjZWl2ZXMgKi8KLSAgLyogSENJX0lPX0NBUEFCSUxJVFlfUkVRVUVTVF9FVlQgZnJvbSB0aGUgcGVlciBiZWZvcmUgKi8KLSAgLyogaXQga25vd3MgcGVlcidzIHN1cHBvcnQgZm9yIFNlY3VyZSBDb25uZWN0aW9ucyAqLwotICBib29sIHJlbW90ZV9zdXBwb3J0c19oY2lfcm9sZV9zd2l0Y2ggPSBmYWxzZTsKLSAgYm9vbCByZW1vdGVfc3VwcG9ydHNfYnJlZHI7Ci0gIGJvb2wgcmVtb3RlX3N1cHBvcnRzX2JsZTsKLSAgYm9vbCByZW1vdGVfZmVhdHVyZV9yZWNlaXZlZCA9IGZhbHNlOwotCi0gIHVpbnQxNl90IGJsZV9oY2lfaGFuZGxlOyAvKiB1c2UgaW4gRFVNTyBjb25uZWN0aW9uICovCi0gIHVpbnQxNl90IGdldF9ibGVfaGNpX2hhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGJsZV9oY2lfaGFuZGxlOyB9Ci0KLSAgdWludDhfdCBlbmNfa2V5X3NpemU7ICAgIC8qIGN1cnJlbnQgbGluayBlbmNyeXB0aW9uIGtleSBzaXplICovCi0gIHVpbnQ4X3QgZ2V0X2VuY3J5cHRpb25fa2V5X3NpemUoKSBjb25zdCB7IHJldHVybiBlbmNfa2V5X3NpemU7IH0KLQotICB0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGU7Ci0gIGJvb2wgaXNfZGV2aWNlX3R5cGVfYnJfZWRyKCkgY29uc3QgewotICAgIHJldHVybiBkZXZpY2VfdHlwZSA9PSBCVF9ERVZJQ0VfVFlQRV9CUkVEUjsKLSAgfQotICBib29sIGlzX2RldmljZV90eXBlX2JsZSgpIGNvbnN0IHsgcmV0dXJuIGRldmljZV90eXBlID09IEJUX0RFVklDRV9UWVBFX0JMRTsgfQotICBib29sIGlzX2RldmljZV90eXBlX2R1YWxfbW9kZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZGV2aWNlX3R5cGUgPT0gQlRfREVWSUNFX1RZUEVfRFVNTzsKLSAgfQotCi0gIGJvb2wgaXNfZGV2aWNlX3R5cGVfaGFzX2JsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZGV2aWNlX3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CTEU7Ci0gIH0KLSAgYm9vbCBuZXdfZW5jcnlwdGlvbl9rZXlfaXNfcDI1NjsgLyogU2V0IHRvIHRydWUgd2hlbiB0aGUgbmV3bHkgZ2VuZXJhdGVkIExLCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIGlzIGdlbmVyYXRlZCBmcm9tIFAtMjU2LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBMaW5rIGVuY3J5cHRlZCB3aXRoIHN1Y2ggTEsgY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogZm9yIFNNIG92ZXIgQlIvRURSLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0QlRNX0JPTkRfVFlQRSBib25kX3R5cGU7IC8qIHBlZXJpbmcgYm9uZCB0eXBlICovCi0gIGJvb2wgaXNfYm9uZF90eXBlX3Vua25vd24oKSBjb25zdCB7IHJldHVybiBib25kX3R5cGUgPT0gQk9ORF9UWVBFX1VOS05PV047IH0KLSAgYm9vbCBpc19ib25kX3R5cGVfcGVyc2lzdGVudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYm9uZF90eXBlID09IEJPTkRfVFlQRV9QRVJTSVNURU5UOwotICB9Ci0gIGJvb2wgaXNfYm9uZF90eXBlX3RlbXBvcmFyeSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYm9uZF90eXBlID09IEJPTkRfVFlQRV9URU1QT1JBUlk7Ci0gIH0KLQotICB0QlRNX1NFQ19CTEUgYmxlOwotICB0QlRNX0xFX0NPTk5fUFJBTVMgY29ubl9wYXJhbXM7Ci0KLSAgdFJFTU9URV9WRVJTSU9OX0lORk8gcmVtb3RlX3ZlcnNpb25faW5mbzsKLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAiJXMgJTZzIGNvZDolcyByZW1vdGVfaW5mbzolLTE0cyBzbTQ6MHglMDJ4IFNlY3VyZUNvbm46JWMgbmFtZTpcIiVzXCIiLAotICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIERldmljZVR5cGVUZXh0KGRldmljZV90eXBlKS5jX3N0cigpLAotICAgICAgICBjbGFzc19vZl9kZXZpY2VfdGV4dChkZXZfY2xhc3MpLmNfc3RyKCksCi0gICAgICAgIHJlbW90ZV92ZXJzaW9uX2luZm8uVG9TdHJpbmcoKS5jX3N0cigpLCBzbTQsCi0gICAgICAgIChyZW1vdGVfc3VwcG9ydHNfc2VjdXJlX2Nvbm5lY3Rpb25zKSA/ICdUJyA6ICdGJywKLSAgICAgICAgUFJJVkFURV9OQU1FKHNlY19iZF9uYW1lKSk7Ci0gIH0KLX07CmRpZmYgLS1naXQgYS9zdGFjay9idHUvYnR1X2hjaWYuY2MgYi9zdGFjay9idHUvYnR1X2hjaWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODU0ZjQuLjAwMDAwMDAKLS0tIGEvc3RhY2svYnR1L2J0dV9oY2lmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBpbnRlcmZhY2Ugd2l0aCB0aGUgSENJIHRyYW5zcG9ydC4gT24KLSAqICB0aGUgcmVjZWl2ZSBzaWRlLCBpdCByb3V0ZXMgZXZlbnRzIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyLCBlLmcuCi0gKiAgTDJDQVAsIFNjb01nci4gT24gdGhlIHRyYW5zbWl0IHNpZGUsIGl0IG1hbmFnZXMgdGhlIGNvbW1hbmQKLSAqICB0cmFuc21pc3Npb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9idHVfaGNpZiIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibGVfYWNsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYmxlX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1faXNvX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9kZXZfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXR0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9ldnRfbGVuZ3RoLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9pbnFfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3Njb19oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NlY19oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3N0YWNrX21ldHJpY3NfbG9nZ2luZy5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6TG9jYXRpb247Ci11c2luZyBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlcjsKLQotYm9vbCBsMmNfbGlua19oY2lfZGlzY19jb21wKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JFQVNPTiByZWFzb24pOyAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlCi1ib29sIEJUTV9CTEVfSVNfUkVTT0xWRV9CREEoY29uc3QgUmF3QWRkcmVzcyYgeCk7ICAgICAgICAgICAgICAvLyBUT0RPIHJlbW92ZQotdm9pZCBCVEFfc3lzX3NpZ25hbF9od19lcnJvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyByZW1vdmUKLXZvaWQgc21wX2NhbmNlbF9zdGFydF9lbmNyeXB0aW9uX2F0dGVtcHQoKTsgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlCi12b2lkIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgcmVhc29uKTsgIC8vIFRPRE8gcmVtb3ZlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2lucXVpcnlfY29tcF9ldnQodWludDhfdCogcCk7Ci0KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2Nvbm5lY3Rpb25fY29tcF9ldnQodWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKTsKLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2Nvbm5lY3Rpb25fcmVxdWVzdF9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9kaXNjb25uZWN0aW9uX2NvbXBfZXZ0KHVpbnQ4X3QqIHApOwotc3RhdGljIHZvaWQgYnR1X2hjaWZfYXV0aGVudGljYXRpb25fY29tcF9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9ybXRfbmFtZV9yZXF1ZXN0X2NvbXBfZXZ0KHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pOwotc3RhdGljIHZvaWQgYnR1X2hjaWZfZW5jcnlwdGlvbl9jaGFuZ2VfZXZ0KHVpbnQ4X3QqIHApOwotc3RhdGljIHZvaWQgYnR1X2hjaWZfcmVhZF9ybXRfZXh0X2ZlYXR1cmVzX2NvbXBfZXZ0KHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBldnRfbGVuKTsKLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0KEJUX0hEUiogcmVzcG9uc2UsIHZvaWQqIGNvbnRleHQpOwotc3RhdGljIHZvaWQgYnR1X2hjaWZfY29tbWFuZF9zdGF0dXNfZXZ0KHVpbnQ4X3Qgc3RhdHVzLCBCVF9IRFIqIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9oYXJkd2FyZV9lcnJvcl9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9yb2xlX2NoYW5nZV9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9tb2RlX2NoYW5nZV9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9saW5rX2tleV9ub3RpZmljYXRpb25fZXZ0KHVpbnQ4X3QqIHApOwotc3RhdGljIHZvaWQgYnR1X2hjaWZfcmVhZF9jbG9ja19vZmZfY29tcF9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9lc2NvX2Nvbm5lY3Rpb25fY29tcF9ldnQodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9lc2NvX2Nvbm5lY3Rpb25fY2hnX2V2dCh1aW50OF90KiBwKTsKLQotLyogU2ltcGxlIFBhaXJpbmcgRXZlbnRzICovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9pb19jYXBfcmVxdWVzdF9ldnQodWludDhfdCogcCk7Ci0KLXN0YXRpYyB2b2lkIGJ0dV9ibGVfbGxfY29ubl9wYXJhbV91cGRfZXZ0KHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pOwotc3RhdGljIHZvaWQgYnR1X2JsZV9wcm9jX2x0a19yZXEodWludDhfdCogcCk7Ci1zdGF0aWMgdm9pZCBidHVfaGNpZl9lbmNyeXB0aW9uX2tleV9yZWZyZXNoX2NtcGxfZXZ0KHVpbnQ4X3QqIHApOwotc3RhdGljIHZvaWQgYnR1X2JsZV9kYXRhX2xlbmd0aF9jaGFuZ2VfZXZ0KHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pOwotc3RhdGljIHZvaWQgYnR1X2JsZV9yY19wYXJhbV9yZXFfZXZ0KHVpbnQ4X3QqIHApOwotCi0vKioKLSAqIExvZyBIQ0kgZXZlbnQgbWV0cmljcyB0aGF0IGFyZSBub3QgaGFuZGxlZCBpbiBzcGVjaWFsIGZ1bmN0aW9ucwotICogQHBhcmFtIGV2dF9jb2RlIGV2ZW50IGNvZGUKLSAqIEBwYXJhbSBwX2V2ZW50IHBvaW50ZXIgdG8gZXZlbnQgcGFyYW1ldGVyLCBza2lwcGluZyBwYXJlbXRlciBsZW5ndGgKLSAqLwotdm9pZCBidHVfaGNpZl9sb2dfZXZlbnRfbWV0cmljcyh1aW50OF90IGV2dF9jb2RlLCB1aW50OF90KiBwX2V2ZW50KSB7Ci0gIHVpbnQzMl90IGNtZCA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpDTURfVU5LTk9XTjsKLSAgdWludDE2X3Qgc3RhdHVzID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOOwotICB1aW50MTZfdCByZWFzb24gPSBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV047Ci0gIHVpbnQxNl90IGhhbmRsZSA9IGJsdWV0b290aDo6Y29tbW9uOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGU7Ci0gIGludDY0X3QgdmFsdWUgPSAwOwotCi0gIFJhd0FkZHJlc3MgYmRhID0gUmF3QWRkcmVzczo6a0VtcHR5OwotICBzd2l0Y2ggKGV2dF9jb2RlKSB7Ci0gICAgY2FzZSBIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX0VWVDoKLSAgICBjYXNlIEhDSV9JT19DQVBBQklMSVRZX1JFU1BPTlNFX0VWVDoKLSAgICBjYXNlIEhDSV9MSU5LX0tFWV9SRVFVRVNUX0VWVDoKLSAgICBjYXNlIEhDSV9MSU5LX0tFWV9OT1RJRklDQVRJT05fRVZUOgotICAgIGNhc2UgSENJX1VTRVJfUEFTU0tFWV9SRVFVRVNUX0VWVDoKLSAgICBjYXNlIEhDSV9VU0VSX1BBU1NLRVlfTk9USUZZX0VWVDoKLSAgICBjYXNlIEhDSV9VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX0VWVDoKLSAgICBjYXNlIEhDSV9LRVlQUkVTU19OT1RJRllfRVZUOgotICAgIGNhc2UgSENJX1JFTU9URV9PT0JfREFUQV9SRVFVRVNUX0VWVDoKLSAgICAgIFNUUkVBTV9UT19CREFERFIoYmRhLCBwX2V2ZW50KTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoYmRhLCBoYW5kbGUsIGNtZCwgZXZ0X2NvZGUsIHN0YXR1cywgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9TSU1QTEVfUEFJUklOR19DT01QTEVURV9FVlQ6Ci0gICAgY2FzZSBIQ0lfUk1UX05BTUVfUkVRVUVTVF9DT01QX0VWVDoKLSAgICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfZXZlbnQpOwotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHBfZXZlbnQpOwotICAgICAgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudChiZGEsIGhhbmRsZSwgY21kLCBldnRfY29kZSwgc3RhdHVzLCByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0FVVEhFTlRJQ0FUSU9OX0NPTVBfRVZUOgotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9ldmVudCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9ldmVudCk7Ci0gICAgICBoYW5kbGUgPSBIQ0lEX0dFVF9IQU5ETEUoaGFuZGxlKTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoYmRhLCBoYW5kbGUsIGNtZCwgZXZ0X2NvZGUsIHN0YXR1cywgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9FTkNSWVBUSU9OX0NIQU5HRV9FVlQ6IHsKLSAgICAgIHVpbnQ4X3QgZW5jcnlwdGlvbl9lbmFibGVkOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9ldmVudCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9ldmVudCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoZW5jcnlwdGlvbl9lbmFibGVkLCBwX2V2ZW50KTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoYmRhLCBoYW5kbGUsIGNtZCwgZXZ0X2NvZGUsIHN0YXR1cywgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uX2VuYWJsZWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0NPTk5FQ1RJT05fQ09NUF9FVlQ6IHsKLSAgICAgIHVpbnQ4X3QgbGlua190eXBlOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9ldmVudCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9ldmVudCk7Ci0gICAgICBTVFJFQU1fVE9fQkRBRERSKGJkYSwgcF9ldmVudCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgobGlua190eXBlLCBwX2V2ZW50KTsKLSAgICAgIGhhbmRsZSA9IEhDSURfR0VUX0hBTkRMRShoYW5kbGUpOwotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgICAmYmRhLCBoYW5kbGUsIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX1VOS05PV04sIGxpbmtfdHlwZSwgY21kLAotICAgICAgICAgIGV2dF9jb2RlLCBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6QkxFX0VWVF9VTktOT1dOLCBzdGF0dXMsIHJlYXNvbik7Ci0KLSAgICAgIC8vIFJlYWQgU0RQX0RJIG1hbnVmYWN0dXJlciwgbW9kZWwsIEhXIHZlcnNpb24gZnJvbSBjb25maWcsCi0gICAgICAvLyBhbmQgbG9nIHRoZW0KLSAgICAgIGludCBzZHBfZGlfbWFudWZhY3R1cmVyX2lkID0gMDsKLSAgICAgIGludCBzZHBfZGlfbW9kZWxfaWQgPSAwOwotICAgICAgaW50IHNkcF9kaV9od192ZXJzaW9uID0gMDsKLSAgICAgIGludCBzZHBfZGlfdmVuZG9yX2lkX3NvdXJjZSA9IDA7Ci0gICAgICBzdGQ6OnN0cmluZyBiZGFfc3RyaW5nID0gYmRhLlRvU3RyaW5nKCk7Ci0gICAgICBidGlmX2NvbmZpZ19nZXRfaW50KGJkYV9zdHJpbmcsIEJUX0NPTkZJR19LRVlfU0RQX0RJX01BTlVGQUNUVVJFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkcF9kaV9tYW51ZmFjdHVyZXJfaWQpOwotICAgICAgYnRpZl9jb25maWdfZ2V0X2ludChiZGFfc3RyaW5nLCBCVF9DT05GSUdfS0VZX1NEUF9ESV9NT0RFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkcF9kaV9tb2RlbF9pZCk7Ci0gICAgICBidGlmX2NvbmZpZ19nZXRfaW50KGJkYV9zdHJpbmcsIEJUX0NPTkZJR19LRVlfU0RQX0RJX0hXX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZzZHBfZGlfaHdfdmVyc2lvbik7Ci0gICAgICBidGlmX2NvbmZpZ19nZXRfaW50KGJkYV9zdHJpbmcsIEJUX0NPTkZJR19LRVlfU0RQX0RJX1ZFTkRPUl9JRF9TUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZzZHBfZGlfdmVuZG9yX2lkX3NvdXJjZSk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgICAgLy8gW04gLSBuYXRpdmVdOjpTRFA6OltESVAgLSBEZXZpY2UgSUQgUHJvZmlsZV0KLSAgICAgIHNzIDw8ICJOOlNEUDo6RElQOjoiIDw8IGxvZ2hleChzZHBfZGlfdmVuZG9yX2lkX3NvdXJjZSk7Ci0gICAgICBsb2dfbWFudWZhY3R1cmVyX2luZm8oCi0gICAgICAgICAgYmRhLCBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtOjpERVZJQ0VfSU5GT19JTlRFUk5BTCwKLSAgICAgICAgICBzcy5zdHIoKSwgbG9naGV4KHNkcF9kaV9tYW51ZmFjdHVyZXJfaWQpLCBsb2doZXgoc2RwX2RpX21vZGVsX2lkKSwKLSAgICAgICAgICBsb2doZXgoc2RwX2RpX2h3X3ZlcnNpb24pLCAiIik7Ci0KLSAgICAgIC8vIFJlYWQgTE1QIHZlcnNpb24sIHN1YnZlcnNpb24gYW5kICBtYW51ZmFjdHVyZXIgZnJvbSBjb25maWcsCi0gICAgICAvLyBhbmQgbG9nIHRoZW0KLSAgICAgIGludCBsbXBfdmVyc2lvbiA9IC0xOwotICAgICAgaW50IGxtcF9zdWJ2ZXJzaW9uID0gLTE7Ci0gICAgICBpbnQgbG1wX21hbnVmYWN0dXJlcl9pZCA9IC0xOwotICAgICAgYnRpZl9jb25maWdfZ2V0X2ludChiZGFfc3RyaW5nLCBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmbG1wX3ZlcnNpb24pOwotICAgICAgYnRpZl9jb25maWdfZ2V0X2ludChiZGFfc3RyaW5nLCBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfU1VCVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmbG1wX3N1YnZlcnNpb24pOwotICAgICAgYnRpZl9jb25maWdfZ2V0X2ludChiZGFfc3RyaW5nLCBCVF9DT05GSUdfS0VZX1JFTU9URV9WRVJfTUZDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmxtcF9tYW51ZmFjdHVyZXJfaWQpOwotICAgICAgYmx1ZXRvb3RoOjpjb21tb246OkxvZ1JlbW90ZVZlcnNpb25JbmZvKAotICAgICAgICAgIGhhbmRsZSwgc3RhdHVzLCBsbXBfdmVyc2lvbiwgbG1wX21hbnVmYWN0dXJlcl9pZCwgbG1wX3N1YnZlcnNpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0NPTk5FQ1RJT05fUkVRVUVTVF9FVlQ6IHsKLSAgICAgIERFVl9DTEFTUyBkYzsKLSAgICAgIHVpbnQ4X3QgbGlua190eXBlOwotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHBfZXZlbnQpOwotICAgICAgU1RSRUFNX1RPX0RFVkNMQVNTKGRjLCBwX2V2ZW50KTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChsaW5rX3R5cGUsIHBfZXZlbnQpOwotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgICAmYmRhLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HLCBsaW5rX3R5cGUsIGNtZCwgZXZ0X2NvZGUsCi0gICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkJMRV9FVlRfVU5LTk9XTiwgc3RhdHVzLCByZWFzb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0RJU0NPTk5FQ1RJT05fQ09NUF9FVlQ6IHsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfZXZlbnQpOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHBfZXZlbnQpOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHJlYXNvbiwgcF9ldmVudCk7Ci0gICAgICBoYW5kbGUgPSBIQ0lEX0dFVF9IQU5ETEUoaGFuZGxlKTsKLSAgICAgIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQoCi0gICAgICAgICAgbnVsbHB0ciwgaGFuZGxlLCBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9VTktOT1dOLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV04sIGNtZCwgZXZ0X2NvZGUsCi0gICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OkJMRV9FVlRfVU5LTk9XTiwgc3RhdHVzLCByZWFzb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0VTQ09fQ09OTkVDVElPTl9DT01QX0VWVDogewotICAgICAgdWludDhfdCBsaW5rX3R5cGU7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwX2V2ZW50KTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwX2V2ZW50KTsKLSAgICAgIFNUUkVBTV9UT19CREFERFIoYmRhLCBwX2V2ZW50KTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChsaW5rX3R5cGUsIHBfZXZlbnQpOwotICAgICAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci0gICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgICZiZGEsIGhhbmRsZSwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fVU5LTk9XTiwgbGlua190eXBlLCBjbWQsCi0gICAgICAgICAgZXZ0X2NvZGUsIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpCTEVfRVZUX1VOS05PV04sIHN0YXR1cywgcmVhc29uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhDSV9FU0NPX0NPTk5FQ1RJT05fQ0hBTkdFRF9FVlQ6IHsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfZXZlbnQpOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHBfZXZlbnQpOwotICAgICAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci0gICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgIG51bGxwdHIsIGhhbmRsZSwgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fVU5LTk9XTiwKLSAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9VTktOT1dOLCBjbWQsIGV2dF9jb2RlLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpCTEVfRVZUX1VOS05PV04sIHN0YXR1cywgcmVhc29uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfcHJvY2Vzc19ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBIb3N0IENvbnRyb2xsZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnR1X2hjaWZfcHJvY2Vzc19ldmVudChVTlVTRURfQVRUUiB1aW50OF90IGNvbnRyb2xsZXJfaWQsIEJUX0hEUiogcF9tc2cpIHsKLSAgdWludDhfdCogcCA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gIHVpbnQ4X3QgaGNpX2V2dF9jb2RlLCBoY2lfZXZ0X2xlbjsKLSAgdWludDhfdCBibGVfc3ViX2NvZGU7Ci0gIFNUUkVBTV9UT19VSU5UOChoY2lfZXZ0X2NvZGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoaGNpX2V2dF9sZW4sIHApOwotCi0gIC8vIHZhbGlkYXRlIGV2ZW50IHNpemUKLSAgaWYgKGhjaV9ldnRfbGVuIDwgaGNpX2V2ZW50X3BhcmFtZXRlcnNfbWluaW11bV9sZW5ndGhbaGNpX2V2dF9jb2RlXSkgewotICAgIEhDSV9UUkFDRV9XQVJOSU5HKCIlczogZXZ0OjB4JTJYLCBtYWxmb3JtZWQgZXZlbnQgb2Ygc2l6ZSAlaGhkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaGNpX2V2dF9jb2RlLCBoY2lfZXZ0X2xlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYnR1X2hjaWZfbG9nX2V2ZW50X21ldHJpY3MoaGNpX2V2dF9jb2RlLCBwKTsKLQotICBzd2l0Y2ggKGhjaV9ldnRfY29kZSkgewotICAgIGNhc2UgSENJX0lOUVVJUllfQ09NUF9FVlQ6Ci0gICAgICBidHVfaGNpZl9pbnF1aXJ5X2NvbXBfZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfSU5RVUlSWV9SRVNVTFRfRVZUOgotICAgICAgYnRtX3Byb2Nlc3NfaW5xX3Jlc3VsdHMocCwgaGNpX2V2dF9sZW4sIEJUTV9JTlFfUkVTVUxUX1NUQU5EQVJEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0lOUVVJUllfUlNTSV9SRVNVTFRfRVZUOgotICAgICAgYnRtX3Byb2Nlc3NfaW5xX3Jlc3VsdHMocCwgaGNpX2V2dF9sZW4sIEJUTV9JTlFfUkVTVUxUX1dJVEhfUlNTSSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9FWFRFTkRFRF9JTlFVSVJZX1JFU1VMVF9FVlQ6Ci0gICAgICBidG1fcHJvY2Vzc19pbnFfcmVzdWx0cyhwLCBoY2lfZXZ0X2xlbiwgQlRNX0lOUV9SRVNVTFRfRVhURU5ERUQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfQ09OTkVDVElPTl9DT01QX0VWVDoKLSAgICAgIGJ0dV9oY2lmX2Nvbm5lY3Rpb25fY29tcF9ldnQocCwgaGNpX2V2dF9sZW4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfQ09OTkVDVElPTl9SRVFVRVNUX0VWVDoKLSAgICAgIGJ0dV9oY2lmX2Nvbm5lY3Rpb25fcmVxdWVzdF9ldnQocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9ESVNDT05ORUNUSU9OX0NPTVBfRVZUOgotICAgICAgYnR1X2hjaWZfZGlzY29ubmVjdGlvbl9jb21wX2V2dChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0FVVEhFTlRJQ0FUSU9OX0NPTVBfRVZUOgotICAgICAgYnR1X2hjaWZfYXV0aGVudGljYXRpb25fY29tcF9ldnQocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9STVRfTkFNRV9SRVFVRVNUX0NPTVBfRVZUOgotICAgICAgYnR1X2hjaWZfcm10X25hbWVfcmVxdWVzdF9jb21wX2V2dChwLCBoY2lfZXZ0X2xlbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9FTkNSWVBUSU9OX0NIQU5HRV9FVlQ6Ci0gICAgICBidHVfaGNpZl9lbmNyeXB0aW9uX2NoYW5nZV9ldnQocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9FTkNSWVBUSU9OX0tFWV9SRUZSRVNIX0NPTVBfRVZUOgotICAgICAgYnR1X2hjaWZfZW5jcnlwdGlvbl9rZXlfcmVmcmVzaF9jbXBsX2V2dChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1JFQURfUk1UX0ZFQVRVUkVTX0NPTVBfRVZUOgotICAgICAgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlX3JhdyhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1JFQURfUk1UX0VYVF9GRUFUVVJFU19DT01QX0VWVDoKLSAgICAgIGJ0dV9oY2lmX3JlYWRfcm10X2V4dF9mZWF0dXJlc19jb21wX2V2dChwLCBoY2lfZXZ0X2xlbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9SRUFEX1JNVF9WRVJTSU9OX0NPTVBfRVZUOgotICAgICAgYnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGVfcmF3KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfQ09NTUFORF9DT01QTEVURV9FVlQ6Ci0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIiVzIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuICIKLSAgICAgICAgICAiU29tZW9uZSBkaWRuJ3QgZ28gdGhyb3VnaCB0aGUgaGNpIHRyYW5zbWl0X2NvbW1hbmQgZnVuY3Rpb24uIiwKLSAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9DT01NQU5EX1NUQVRVU19FVlQ6Ci0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIiVzIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCBhIGNvbW1hbmQgc3RhdHVzIGV2ZW50LiAiCi0gICAgICAgICAgIlNvbWVvbmUgZGlkbid0IGdvIHRocm91Z2ggdGhlIGhjaSB0cmFuc21pdF9jb21tYW5kIGZ1bmN0aW9uLiIsCi0gICAgICAgICAgX19mdW5jX18pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfSEFSRFdBUkVfRVJST1JfRVZUOgotICAgICAgYnR1X2hjaWZfaGFyZHdhcmVfZXJyb3JfZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfUk9MRV9DSEFOR0VfRVZUOgotICAgICAgYnR1X2hjaWZfcm9sZV9jaGFuZ2VfZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfTlVNX0NPTVBMX0RBVEFfUEtUU19FVlQ6Ci0gICAgICBhY2xfcHJvY2Vzc19udW1fY29tcGxldGVkX3BrdHMocCwgaGNpX2V2dF9sZW4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfTU9ERV9DSEFOR0VfRVZUOgotICAgICAgYnR1X2hjaWZfbW9kZV9jaGFuZ2VfZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfUElOX0NPREVfUkVRVUVTVF9FVlQ6Ci0gICAgICBidG1fc2VjX3Bpbl9jb2RlX3JlcXVlc3QocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9MSU5LX0tFWV9SRVFVRVNUX0VWVDoKLSAgICAgIGJ0bV9zZWNfbGlua19rZXlfcmVxdWVzdChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0xJTktfS0VZX05PVElGSUNBVElPTl9FVlQ6Ci0gICAgICBidHVfaGNpZl9saW5rX2tleV9ub3RpZmljYXRpb25fZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfUkVBRF9DTE9DS19PRkZfQ09NUF9FVlQ6Ci0gICAgICBidHVfaGNpZl9yZWFkX2Nsb2NrX29mZl9jb21wX2V2dChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0VTQ09fQ09OTkVDVElPTl9DT01QX0VWVDoKLSAgICAgIGJ0dV9oY2lmX2VzY29fY29ubmVjdGlvbl9jb21wX2V2dChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0VTQ09fQ09OTkVDVElPTl9DSEFOR0VEX0VWVDoKLSAgICAgIGJ0dV9oY2lmX2VzY29fY29ubmVjdGlvbl9jaGdfZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfU05JRkZfU1VCX1JBVEVfRVZUOgotICAgICAgYnRtX3BtX3Byb2Nfc3NyX2V2dChwLCBoY2lfZXZ0X2xlbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9STVRfSE9TVF9TVVBfRkVBVF9OT1RJRllfRVZUOgotICAgICAgYnRtX3NlY19ybXRfaG9zdF9zdXBwb3J0X2ZlYXRfZXZ0KHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX0VWVDoKLSAgICAgIGJ0dV9oY2lmX2lvX2NhcF9yZXF1ZXN0X2V2dChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0lPX0NBUEFCSUxJVFlfUkVTUE9OU0VfRVZUOgotICAgICAgYnRtX2lvX2NhcGFiaWxpdGllc19yc3AocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX0VWVDoKLSAgICAgIGJ0bV9wcm9jX3NwX3JlcV9ldnQoQlRNX1NQX0NGTV9SRVFfRVZULCBwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1VTRVJfUEFTU0tFWV9SRVFVRVNUX0VWVDoKLSAgICAgIGJ0bV9wcm9jX3NwX3JlcV9ldnQoQlRNX1NQX0tFWV9SRVFfRVZULCBwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1JFTU9URV9PT0JfREFUQV9SRVFVRVNUX0VWVDoKLSAgICAgIGJ0bV9yZW1fb29iX3JlcShwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1NJTVBMRV9QQUlSSU5HX0NPTVBMRVRFX0VWVDoKLSAgICAgIGJ0bV9zaW1wbGVfcGFpcl9jb21wbGV0ZShwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1VTRVJfUEFTU0tFWV9OT1RJRllfRVZUOgotICAgICAgYnRtX3Byb2Nfc3BfcmVxX2V2dChCVE1fU1BfS0VZX05PVElGX0VWVCwgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9FVkVOVDogewotICAgICAgU1RSRUFNX1RPX1VJTlQ4KGJsZV9zdWJfY29kZSwgcCk7Ci0KLSAgICAgIHVpbnQ4X3QgYmxlX2V2dF9sZW4gPSBoY2lfZXZ0X2xlbiAtIDE7Ci0gICAgICBzd2l0Y2ggKGJsZV9zdWJfY29kZSkgewotICAgICAgICBjYXNlIEhDSV9CTEVfQURWX1BLVF9SUFRfRVZUOiAvKiByZXN1bHQgb2YgaW5xdWlyeSAqLwotICAgICAgICAgIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0KGJsZV9ldnRfbGVuLCBwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIQ0lfQkxFX0NPTk5fQ09NUExFVEVfRVZUOgotICAgICAgICAgIGJ0bV9ibGVfY29ubl9jb21wbGV0ZShwLCBoY2lfZXZ0X2xlbiwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhDSV9CTEVfTExfQ09OTl9QQVJBTV9VUERfRVZUOgotICAgICAgICAgIGJ0dV9ibGVfbGxfY29ubl9wYXJhbV91cGRfZXZ0KHAsIGhjaV9ldnRfbGVuKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIQ0lfQkxFX1JFQURfUkVNT1RFX0ZFQVRfQ01QTF9FVlQ6Ci0gICAgICAgICAgYnRtX2JsZV9yZWFkX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZShwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIQ0lfQkxFX0xUS19SRVFfRVZUOiAvKiByZWNlaXZlZCBvbmx5IGF0IHBlcmlwaGVyYWwgZGV2aWNlICovCi0gICAgICAgICAgYnR1X2JsZV9wcm9jX2x0a19yZXEocCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSENJX0JMRV9FTkhBTkNFRF9DT05OX0NPTVBMRVRFX0VWVDoKLSAgICAgICAgICBidG1fYmxlX2Nvbm5fY29tcGxldGUocCwgaGNpX2V2dF9sZW4sIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhDSV9CTEVfUkNfUEFSQU1fUkVRX0VWVDoKLSAgICAgICAgICBidHVfYmxlX3JjX3BhcmFtX3JlcV9ldnQocCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSENJX0JMRV9EQVRBX0xFTkdUSF9DSEFOR0VfRVZUOgotICAgICAgICAgIGJ0dV9ibGVfZGF0YV9sZW5ndGhfY2hhbmdlX2V2dChwLCBoY2lfZXZ0X2xlbik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBIQ0lfQkxFX1BIWV9VUERBVEVfQ09NUExFVEVfRVZUOgotICAgICAgICAgIGJ0bV9ibGVfcHJvY2Vzc19waHlfdXBkYXRlX3BrdChibGVfZXZ0X2xlbiwgcCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBIQ0lfTEVfRVhURU5ERURfQURWRVJUSVNJTkdfUkVQT1JUX0VWVDoKLSAgICAgICAgICBidG1fYmxlX3Byb2Nlc3NfZXh0X2Fkdl9wa3QoaGNpX2V2dF9sZW4sIHApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSENJX0xFX0FEVkVSVElTSU5HX1NFVF9URVJNSU5BVEVEX0VWVDoKLSAgICAgICAgICBidG1fbGVfb25fYWR2ZXJ0aXNpbmdfc2V0X3Rlcm1pbmF0ZWQocCwgaGNpX2V2dF9sZW4pOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSENJX0JMRV9SRVFfUEVFUl9TQ0FfQ1BMX0VWVDoKLSAgICAgICAgICBidG1fYWNsX3Byb2Nlc3Nfc2NhX2NtcGxfcGt0KGJsZV9ldnRfbGVuLCBwKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEhDSV9CTEVfUEVSSU9ESUNfQURWX1NZTkNfRVNUX0VWVDoKLSAgICAgICAgICBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfZXN0X2V2dChibGVfZXZ0X2xlbiwgcCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBIQ0lfQkxFX1BFUklPRElDX0FEVl9SRVBPUlRfRVZUOgotICAgICAgICAgIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0KGJsZV9ldnRfbGVuLCBwKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEhDSV9CTEVfUEVSSU9ESUNfQURWX1NZTkNfTE9TVF9FVlQ6Ci0gICAgICAgICAgYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9zeW5jX2xvc3RfZXZ0KGJsZV9ldnRfbGVuLCBwKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEhDSV9CTEVfQ0lTX0VTVF9FVlQ6Ci0gICAgICAgIGNhc2UgSENJX0JMRV9DUkVBVEVfQklHX0NQTF9FVlQ6Ci0gICAgICAgIGNhc2UgSENJX0JMRV9URVJNX0JJR19DUExfRVZUOgotICAgICAgICBjYXNlIEhDSV9CTEVfQ0lTX1JFUV9FVlQ6Ci0gICAgICAgIGNhc2UgSENJX0JMRV9CSUdfU1lOQ19FU1RfRVZUOgotICAgICAgICBjYXNlIEhDSV9CTEVfQklHX1NZTkNfTE9TVF9FVlQ6Ci0gICAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoYmxlX3N1Yl9jb2RlLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZV9ldnRfbGVuKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgSENJX1ZFTkRPUl9TUEVDSUZJQ19FVlQ6Ci0gICAgICBidG1fdmVuZG9yX3NwZWNpZmljX2V2dChwLCBoY2lfZXZ0X2xlbik7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9sb2dfY29tbWFuZF9tZXRyaWNzKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY21kX3N0YXR1cykgewotICBzdGF0aWMgdWludDE2X3Qga1Vua25vd25CbGVFdnQgPSBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6QkxFX0VWVF9VTktOT1dOOwotCi0gIHVpbnQxNl90IGhjaV9ldmVudCA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpFVlRfQ09NTUFORF9TVEFUVVM7Ci0gIGlmICghaXNfY21kX3N0YXR1cykgewotICAgIGhjaV9ldmVudCA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpFVlRfVU5LTk9XTjsKLSAgICBjbWRfc3RhdHVzID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOOwotICB9Ci0KLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQ4X3QgcmVhc29uOwotCi0gIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgY2FzZSBIQ0lfQ1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgY2FzZSBIQ0lfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMOgotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwX2NtZCk7Ci0gICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgICZiZF9hZGRyLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTCwgb3Bjb2RlLCBoY2lfZXZlbnQsIGtVbmtub3duQmxlRXZ0LAotICAgICAgICAgIGNtZF9zdGF0dXMsIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9ESVNDT05ORUNUOgotICAgICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHBfY21kKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChyZWFzb24sIHBfY21kKTsKLSAgICAgIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQoCi0gICAgICAgICAgbnVsbHB0ciwgaGFuZGxlLCBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9VTktOT1dOLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV04sIG9wY29kZSwgaGNpX2V2ZW50LAotICAgICAgICAgIGtVbmtub3duQmxlRXZ0LCBjbWRfc3RhdHVzLCByZWFzb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfU0VUVVBfRVNDT19DT05ORUNUSU9OOgotICAgIGNhc2UgSENJX0VOSF9TRVRVUF9FU0NPX0NPTk5FQ1RJT046Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9jbWQpOwotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgICBudWxscHRyLCBoYW5kbGUsIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV04sIG9wY29kZSwgaGNpX2V2ZW50LAotICAgICAgICAgIGtVbmtub3duQmxlRXZ0LCBjbWRfc3RhdHVzLCBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfQUNDRVBUX0NPTk5FQ1RJT05fUkVRVUVTVDoKLSAgICBjYXNlIEhDSV9BQ0NFUFRfRVNDT19DT05ORUNUSU9OOgotICAgIGNhc2UgSENJX0VOSF9BQ0NFUFRfRVNDT19DT05ORUNUSU9OOgotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwX2NtZCk7Ci0gICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgICZiZF9hZGRyLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV04sIG9wY29kZSwgaGNpX2V2ZW50LAotICAgICAgICAgIGtVbmtub3duQmxlRXZ0LCBjbWRfc3RhdHVzLCBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfUkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVDoKLSAgICBjYXNlIEhDSV9SRUpFQ1RfRVNDT19DT05ORUNUSU9OOgotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwX2NtZCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDgocmVhc29uLCBwX2NtZCk7Ci0gICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgICZiZF9hZGRyLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX1VOS05PV04sIG9wY29kZSwgaGNpX2V2ZW50LAotICAgICAgICAgIGtVbmtub3duQmxlRXZ0LCBjbWRfc3RhdHVzLCByZWFzb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8vIEJMRSBDb21tYW5kcwotICAgIGNhc2UgSENJX0JMRV9DUkVBVEVfTExfQ09OTjogewotICAgICAgcF9jbWQgKz0gMjsgIC8vIFNraXAgTEVfU2Nhbl9JbnRlcnZhbAotICAgICAgcF9jbWQgKz0gMjsgIC8vIFNraXAgTEVfU2Nhbl9XaW5kb3c7Ci0gICAgICB1aW50OF90IGluaXRpYXRvcl9maWx0ZXJfcG9saWN5OwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KGluaXRpYXRvcl9maWx0ZXJfcG9saWN5LCBwX2NtZCk7Ci0gICAgICB1aW50OF90IHBlZXJfYWRkcmVzc190eXBlOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHBlZXJfYWRkcmVzc190eXBlLCBwX2NtZCk7Ci0gICAgICBTVFJFQU1fVE9fQkRBRERSKGJkX2FkZHIsIHBfY21kKTsKLSAgICAgIC8vIFBlZXIgYWRkcmVzcyBzaG91bGQgbm90IGJlIHVzZWQgaWYgaW5pdGlhdG9yIGZpbHRlciBwb2xpY3kgaXMgbm90IDB4MDAKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHJfcCA9IG51bGxwdHI7Ci0gICAgICBpZiAoaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kgPT0gMHgwMCkgewotICAgICAgICBiZF9hZGRyX3AgPSAmYmRfYWRkcjsKLSAgICAgICAgaWYgKHBlZXJfYWRkcmVzc190eXBlID09IEJMRV9BRERSX1BVQkxJQ19JRCB8fAotICAgICAgICAgICAgcGVlcl9hZGRyZXNzX3R5cGUgPT0gQkxFX0FERFJfUkFORE9NX0lEKSB7Ci0gICAgICAgICAgLy8gaWYgaWRlbnRpdHkgYWRkcmVzcyBpcyBub3QgbWF0Y2hlZCwgdGhpcyBhZGRyZXNzIGlzIGludmFsaWQKLSAgICAgICAgICBpZiAoIWJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG8oJmJkX2FkZHIsICZwZWVyX2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7Ci0gICAgICAgICAgICBiZF9hZGRyX3AgPSBudWxscHRyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGluaXRpYXRvcl9maWx0ZXJfcG9saWN5ID09IDB4MDAgfHwKLSAgICAgICAgICAoY21kX3N0YXR1cyAhPSBIQ0lfU1VDQ0VTUyAmJiAhaXNfY21kX3N0YXR1cykpIHsKLSAgICAgICAgLy8gU2VsZWN0aXZlbHkgbG9nIHRvIGF2b2lkIGxvZyBzcGFtIGR1ZSB0byBhY2NlcHRsaXN0IGNvbm5lY3Rpb25zOgotICAgICAgICAvLyAtIFdoZW4gZG9pbmcgbm9uLWFjY2VwdGxpc3QgY29ubmVjdGlvbgotICAgICAgICAvLyAtIFdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gY29tbWFuZCBzdGF0dXMKLSAgICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgICAgIGJkX2FkZHJfcCwgYmx1ZXRvb3RoOjpjb21tb246OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSwKLSAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HLAotICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMLCBvcGNvZGUsIGhjaV9ldmVudCwKLSAgICAgICAgICAgIGtVbmtub3duQmxlRXZ0LCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhDSV9MRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTjogewotICAgICAgdWludDhfdCBpbml0aWF0b3JfZmlsdGVyX3BvbGljeTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChpbml0aWF0b3JfZmlsdGVyX3BvbGljeSwgcF9jbWQpOwotICAgICAgcF9jbWQgKz0gMTsgIC8vIFNraXAgT3duX0FkZHJlc3NfVHlwZQotICAgICAgdWludDhfdCBwZWVyX2FkZHJfdHlwZTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChwZWVyX2FkZHJfdHlwZSwgcF9jbWQpOwotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwX2NtZCk7Ci0gICAgICAvLyBQZWVyIGFkZHJlc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGlmIGluaXRpYXRvciBmaWx0ZXIgcG9saWN5IGlzIG5vdCAweDAwCi0gICAgICBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyX3AgPSBudWxscHRyOwotICAgICAgaWYgKGluaXRpYXRvcl9maWx0ZXJfcG9saWN5ID09IDB4MDApIHsKLSAgICAgICAgYmRfYWRkcl9wID0gJmJkX2FkZHI7Ci0gICAgICAgIC8vIGlmIGlkZW50aXR5IGFkZHJlc3MgaXMgbm90IG1hdGNoZWQsIHRoaXMgc2hvdWxkIGJlIGEgc3RhdGljIGFkZHJlc3MKLSAgICAgICAgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkbygmYmRfYWRkciwgJnBlZXJfYWRkcl90eXBlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kgPT0gMHgwMCB8fAotICAgICAgICAgIChjbWRfc3RhdHVzICE9IEhDSV9TVUNDRVNTICYmICFpc19jbWRfc3RhdHVzKSkgewotICAgICAgICAvLyBTZWxlY3RpdmVseSBsb2cgdG8gYXZvaWQgbG9nIHNwYW0gZHVlIHRvIGFjY2VwdGxpc3QgY29ubmVjdGlvbnM6Ci0gICAgICAgIC8vIC0gV2hlbiBkb2luZyBub24tYWNjZXB0bGlzdCBjb25uZWN0aW9uCi0gICAgICAgIC8vIC0gV2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjb21tYW5kIHN0YXR1cwotICAgICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgICAgYmRfYWRkcl9wLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fT1VUR09JTkcsCi0gICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0wsIG9wY29kZSwgaGNpX2V2ZW50LAotICAgICAgICAgICAga1Vua25vd25CbGVFdnQsIGNtZF9zdGF0dXMsCi0gICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0JMRV9DUkVBVEVfQ09OTl9DQU5DRUw6Ci0gICAgICBpZiAoY21kX3N0YXR1cyAhPSBIQ0lfU1VDQ0VTUyAmJiAhaXNfY21kX3N0YXR1cykgewotICAgICAgICAvLyBPbmx5IGxvZyBlcnJvcnMgdG8gcHJldmVudCBsb2cgc3BhbSBkdWUgdG8gYWNjZXB0bGlzdCBjb25uZWN0aW9ucwotICAgICAgICBsb2dfbGlua19sYXllcl9jb25uZWN0aW9uX2V2ZW50KAotICAgICAgICAgICAgbnVsbHB0ciwgYmx1ZXRvb3RoOjpjb21tb246OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSwKLSAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX09VVEdPSU5HLAotICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMLCBvcGNvZGUsIGhjaV9ldmVudCwKLSAgICAgICAgICAgIGtVbmtub3duQmxlRXZ0LCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0JMRV9DTEVBUl9BQ0NFUFRMSVNUOgotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgICBudWxscHRyLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RElSRUNUSU9OX0lOQ09NSU5HLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6TElOS19UWVBFX0FDTCwgb3Bjb2RlLCBoY2lfZXZlbnQsIGtVbmtub3duQmxlRXZ0LAotICAgICAgICAgIGNtZF9zdGF0dXMsIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9CTEVfQUREX0FDQ0VQVExJU1Q6Ci0gICAgY2FzZSBIQ0lfQkxFX1JFTU9WRV9BQ0NFUFRMSVNUOiB7Ci0gICAgICB1aW50OF90IHBlZXJfYWRkcl90eXBlOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHBlZXJfYWRkcl90eXBlLCBwX2NtZCk7Ci0gICAgICBTVFJFQU1fVE9fQkRBRERSKGJkX2FkZHIsIHBfY21kKTsKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHJfcCA9IG51bGxwdHI7Ci0gICAgICAvLyBXaGVuIHBlZXJfYWRkcl90eXBlIGlzIDB4RkYsIGJkX2FkZHIgc2hvdWxkIGJlIGlnbm9yZWQgcGVyIEJUIHNwZWMKLSAgICAgIGlmIChwZWVyX2FkZHJfdHlwZSAhPSBCTEVfQUREUl9BTk9OWU1PVVMpIHsKLSAgICAgICAgYmRfYWRkcl9wID0gJmJkX2FkZHI7Ci0gICAgICAgIGJvb2wgYWRkcl9pc19ycGEgPSBwZWVyX2FkZHJfdHlwZSA9PSBCTEVfQUREUl9SQU5ET00gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfSVNfUkVTT0xWRV9CREEoYmRfYWRkcik7Ci0gICAgICAgIC8vIE9ubHkgdHJ5IHRvIG1hdGNoIGlkZW50aXR5IGFkZHJlc3MgZm9yIHBzZXVkbyBpZiBhZGRyZXNzIGlzIG5vdCBSUEEKLSAgICAgICAgaWYgKCFhZGRyX2lzX3JwYSkgewotICAgICAgICAgIC8vIGlmIGlkZW50aXR5IGFkZHJlc3MgaXMgbm90IG1hdGNoZWQsIHRoaXMgc2hvdWxkIGJlIGEgc3RhdGljIGFkZHJlc3MKLSAgICAgICAgICBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvKCZiZF9hZGRyLCAmcGVlcl9hZGRyX3R5cGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICAgICAgICBiZF9hZGRyX3AsIGJsdWV0b290aDo6Y29tbW9uOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGUsCi0gICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpESVJFQ1RJT05fSU5DT01JTkcsCi0gICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpMSU5LX1RZUEVfQUNMLCBvcGNvZGUsIGhjaV9ldmVudCwga1Vua25vd25CbGVFdnQsCi0gICAgICAgICAgY21kX3N0YXR1cywgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhDSV9SRUFEX0xPQ0FMX09PQl9EQVRBOgotICAgICAgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudChSYXdBZGRyZXNzOjprRW1wdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6Y29tbW9uOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwgaGNpX2V2ZW50LCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04sIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfV1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERTogewotICAgICAgdWludDhfdCBzaW1wbGVfcGFpcmluZ19tb2RlOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHNpbXBsZV9wYWlyaW5nX21vZGUsIHBfY21kKTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoCi0gICAgICAgICAgUmF3QWRkcmVzczo6a0VtcHR5LCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgIG9wY29kZSwgaGNpX2V2ZW50LCBjbWRfc3RhdHVzLAotICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTiwgc2ltcGxlX3BhaXJpbmdfbW9kZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBIQ0lfV1JJVEVfU0VDVVJFX0NPTk5TX1NVUFBPUlQ6IHsKLSAgICAgIHVpbnQ4X3Qgc2VjdXJlX2Nvbm5faG9zdF9zdXBwb3J0OwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHNlY3VyZV9jb25uX2hvc3Rfc3VwcG9ydCwgcF9jbWQpOwotICAgICAgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudCgKLSAgICAgICAgICBSYXdBZGRyZXNzOjprRW1wdHksIGJsdWV0b290aDo6Y29tbW9uOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGUsCi0gICAgICAgICAgb3Bjb2RlLCBoY2lfZXZlbnQsIGNtZF9zdGF0dXMsCi0gICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOLCBzZWN1cmVfY29ubl9ob3N0X3N1cHBvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1RFRDoKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwX2NtZCk7Ci0gICAgICBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50KFJhd0FkZHJlc3M6OmtFbXB0eSwgaGFuZGxlLCBvcGNvZGUsIGhjaV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1NFVF9DT05OX0VOQ1JZUFRJT046IHsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwX2NtZCk7Ci0gICAgICB1aW50OF90IGVuY3J5cHRpb25fZW5hYmxlOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KGVuY3J5cHRpb25fZW5hYmxlLCBwX2NtZCk7Ci0gICAgICBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50KAotICAgICAgICAgIFJhd0FkZHJlc3M6OmtFbXB0eSwgaGFuZGxlLCBvcGNvZGUsIGhjaV9ldmVudCwgY21kX3N0YXR1cywKLSAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04sIGVuY3J5cHRpb25fZW5hYmxlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhDSV9ERUxFVEVfU1RPUkVEX0xJTktfS0VZOiB7Ci0gICAgICB1aW50OF90IGRlbGV0ZV9hbGxfZmxhZzsKLSAgICAgIFNUUkVBTV9UT19CREFERFIoYmRfYWRkciwgcF9jbWQpOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KGRlbGV0ZV9hbGxfZmxhZywgcF9jbWQpOwotICAgICAgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudCgKLSAgICAgICAgICBiZF9hZGRyLCBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLCBvcGNvZGUsCi0gICAgICAgICAgaGNpX2V2ZW50LCBjbWRfc3RhdHVzLCBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6U1RBVFVTX1VOS05PV04sCi0gICAgICAgICAgZGVsZXRlX2FsbF9mbGFnKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhDSV9STVRfTkFNRV9SRVFVRVNUOgotICAgIGNhc2UgSENJX1JNVF9OQU1FX1JFUVVFU1RfQ0FOQ0VMOgotICAgIGNhc2UgSENJX0xJTktfS0VZX1JFUVVFU1RfUkVQTFk6Ci0gICAgY2FzZSBIQ0lfTElOS19LRVlfUkVRVUVTVF9ORUdfUkVQTFk6Ci0gICAgY2FzZSBIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZOgotICAgIGNhc2UgSENJX1VTRVJfQ09ORl9SRVFVRVNUX1JFUExZOgotICAgIGNhc2UgSENJX1VTRVJfQ09ORl9WQUxVRV9ORUdfUkVQTFk6Ci0gICAgY2FzZSBIQ0lfVVNFUl9QQVNTS0VZX1JFUV9SRVBMWToKLSAgICBjYXNlIEhDSV9VU0VSX1BBU1NLRVlfUkVRX05FR19SRVBMWToKLSAgICBjYXNlIEhDSV9SRU1fT09CX0RBVEFfUkVRX1JFUExZOgotICAgIGNhc2UgSENJX1JFTV9PT0JfREFUQV9SRVFfTkVHX1JFUExZOgotICAgICAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwX2NtZCk7Ci0gICAgICBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50KAotICAgICAgICAgIGJkX2FkZHIsIGJsdWV0b290aDo6Y29tbW9uOjprVW5rbm93bkNvbm5lY3Rpb25IYW5kbGUsIG9wY29kZSwKLSAgICAgICAgICBoY2lfZXZlbnQsIGNtZF9zdGF0dXMsIGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9JT19DQVBfUkVRX05FR19SRVBMWToKLSAgICAgIFNUUkVBTV9UT19CREFERFIoYmRfYWRkciwgcF9jbWQpOwotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHJlYXNvbiwgcF9jbWQpOwotICAgICAgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudChiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmNvbW1vbjo6a1Vua25vd25Db25uZWN0aW9uSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsIGhjaV9ldmVudCwgY21kX3N0YXR1cywgcmVhc29uLCAwKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9zZW5kX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgSG9zdAotICogICAgICAgICAgICAgICAgICBDb250cm9sbGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGJ0dV9oY2lmX3NlbmRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY29udHJvbGxlcl9pZCwgQlRfSERSKiBwX2J1ZikgewotICBpZiAoIXBfYnVmKSByZXR1cm47Ci0KLSAgdWludDE2X3Qgb3Bjb2RlOwotICB1aW50OF90KiBzdHJlYW0gPSBwX2J1Zi0+ZGF0YSArIHBfYnVmLT5vZmZzZXQ7Ci0gIHZvaWQqIHZzY19jYWxsYmFjayA9IE5VTEw7Ci0KLSAgU1RSRUFNX1RPX1VJTlQxNihvcGNvZGUsIHN0cmVhbSk7Ci0KLSAgLy8gRXd3Li4uaG9ycmlibGUgaGFja2VyeSBoZXJlCi0gIC8qIElmIGNvbW1hbmQgd2FzIGEgVlNDLCB0aGVuIGV4dHJhY3QgY29tbWFuZF9jb21wbGV0ZSBjYWxsYmFjayAqLwotICBpZiAoKG9wY29kZSAmIEhDSV9HUlBfVkVORE9SX1NQRUNJRklDKSA9PSBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQyB8fAotICAgICAgKG9wY29kZSA9PSBIQ0lfQkxFX1JBTkQpIHx8IChvcGNvZGUgPT0gSENJX0JMRV9FTkNSWVBUKSkgewotICAgIHZzY19jYWxsYmFjayA9ICooKHZvaWQqKikocF9idWYgKyAxKSk7Ci0gIH0KLQotICAvLyBTa2lwIHBhcmFtZXRlciBsZW5ndGggYmVmb3JlIGxvZ2dpbmcKLSAgc3RyZWFtKys7Ci0gIGJ0dV9oY2lmX2xvZ19jb21tYW5kX21ldHJpY3Mob3Bjb2RlLCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOLCBmYWxzZSk7Ci0KLSAgYmx1ZXRvb3RoOjpzaGltOjpoY2lfbGF5ZXJfZ2V0X2ludGVyZmFjZSgpLT50cmFuc21pdF9jb21tYW5kKAotICAgICAgcF9idWYsIGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0LCBidHVfaGNpZl9jb21tYW5kX3N0YXR1c19ldnQsCi0gICAgICB2c2NfY2FsbGJhY2spOwotfQotCi11c2luZyBoY2lfY21kX2NiID0gYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoCi0gICAgdWludDhfdCogLyogcmV0dXJuX3BhcmFtZXRlcnMgKi8sIHVpbnQxNl90IC8qIHJldHVybl9wYXJhbWV0ZXJzX2xlbmd0aCovKT47Ci0KLXN0cnVjdCBjbWRfd2l0aF9jYl9kYXRhIHsKLSAgaGNpX2NtZF9jYiBjYjsKLSAgYmFzZTo6TG9jYXRpb24gcG9zdGVkX2Zyb207Ci19OwotCi12b2lkIGNtZF93aXRoX2NiX2RhdGFfaW5pdChjbWRfd2l0aF9jYl9kYXRhKiBjYl93cmFwcGVyKSB7Ci0gIG5ldyAoJmNiX3dyYXBwZXItPmNiKSBoY2lfY21kX2NiOwotICBuZXcgKCZjYl93cmFwcGVyLT5wb3N0ZWRfZnJvbSkgTG9jYXRpb247Ci19Ci0KLXZvaWQgY21kX3dpdGhfY2JfZGF0YV9jbGVhbnVwKGNtZF93aXRoX2NiX2RhdGEqIGNiX3dyYXBwZXIpIHsKLSAgY2Jfd3JhcHBlci0+Y2IufmhjaV9jbWRfY2IoKTsKLSAgY2Jfd3JhcHBlci0+cG9zdGVkX2Zyb20ufkxvY2F0aW9uKCk7Ci19Ci0KLS8qKgotICogTG9nIGNvbW1hbmQgY29tcGxldGUgZXZlbnRzIHRoYXQgaXMgbm90IGhhbmRsZWQgaW5kaXZpZHVhbGx5IGluIHRoaXMgZmlsZQotICogQHBhcmFtIG9wY29kZSBvcGNvZGUgb2YgdGhlIGNvbW1hbmQKLSAqIEBwYXJhbSBwX3JldHVybl9wYXJhbXMgcG9pbnRlciB0byByZXR1cm5lZCBwYXJhbWV0ZXIgYWZ0ZXIgcGFyYW1ldGVyIGxlbmd0aAotICogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZAotICovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9sb2dfY29tbWFuZF9jb21wbGV0ZV9tZXRyaWNzKHVpbnQxNl90IG9wY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXR1cm5fcGFyYW1zKSB7Ci0gIHVpbnQxNl90IHN0YXR1cyA9IGFuZHJvaWQ6OmJsdWV0b290aDo6aGNpOjpTVEFUVVNfVU5LTk9XTjsKLSAgdWludDE2X3QgcmVhc29uID0gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOOwotICB1aW50MTZfdCBoY2lfZXZlbnQgPSBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6RVZUX0NPTU1BTkRfQ09NUExFVEU7Ci0gIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQgPSBhbmRyb2lkOjpibHVldG9vdGg6OmhjaTo6QkxFX0VWVF9VTktOT1dOOwotICBSYXdBZGRyZXNzIGJkX2FkZHIgPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0gIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgY2FzZSBIQ0lfQkxFX0NMRUFSX0FDQ0VQVExJU1Q6Ci0gICAgY2FzZSBIQ0lfQkxFX0FERF9BQ0NFUFRMSVNUOgotICAgIGNhc2UgSENJX0JMRV9SRU1PVkVfQUNDRVBUTElTVDogewotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9yZXR1cm5fcGFyYW1zKTsKLSAgICAgIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQoCi0gICAgICAgICAgbnVsbHB0ciwgYmx1ZXRvb3RoOjpjb21tb246OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSwKLSAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRJUkVDVElPTl9JTkNPTUlORywKLSAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkxJTktfVFlQRV9BQ0wsIG9wY29kZSwgaGNpX2V2ZW50LCBoY2lfYmxlX2V2ZW50LAotICAgICAgICAgIHN0YXR1cywgcmVhc29uKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhDSV9ERUxFVEVfU1RPUkVEX0xJTktfS0VZOgotICAgIGNhc2UgSENJX1JFQURfTE9DQUxfT09CX0RBVEE6Ci0gICAgY2FzZSBIQ0lfV1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERToKLSAgICBjYXNlIEhDSV9XUklURV9TRUNVUkVfQ09OTlNfU1VQUE9SVDoKLSAgICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfcmV0dXJuX3BhcmFtcyk7Ci0gICAgICBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50KFJhd0FkZHJlc3M6OmtFbXB0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLCBoY2lfZXZlbnQsIHN0YXR1cywgcmVhc29uLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1JFQURfRU5DUl9LRVlfU0laRTogewotICAgICAgdWludDE2X3QgaGFuZGxlOwotICAgICAgdWludDhfdCBrZXlfc2l6ZTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfcmV0dXJuX3BhcmFtcyk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9yZXR1cm5fcGFyYW1zKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UOChrZXlfc2l6ZSwgcF9yZXR1cm5fcGFyYW1zKTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoUmF3QWRkcmVzczo6a0VtcHR5LCBoYW5kbGUsIG9wY29kZSwgaGNpX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHJlYXNvbiwga2V5X3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSENJX0xJTktfS0VZX1JFUVVFU1RfUkVQTFk6Ci0gICAgY2FzZSBIQ0lfTElOS19LRVlfUkVRVUVTVF9ORUdfUkVQTFk6Ci0gICAgY2FzZSBIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZOgotICAgIGNhc2UgSENJX0lPX0NBUF9SRVFfTkVHX1JFUExZOgotICAgIGNhc2UgSENJX1VTRVJfQ09ORl9SRVFVRVNUX1JFUExZOgotICAgIGNhc2UgSENJX1VTRVJfQ09ORl9WQUxVRV9ORUdfUkVQTFk6Ci0gICAgY2FzZSBIQ0lfVVNFUl9QQVNTS0VZX1JFUV9SRVBMWToKLSAgICBjYXNlIEhDSV9VU0VSX1BBU1NLRVlfUkVRX05FR19SRVBMWToKLSAgICBjYXNlIEhDSV9SRU1fT09CX0RBVEFfUkVRX1JFUExZOgotICAgIGNhc2UgSENJX1JFTV9PT0JfREFUQV9SRVFfTkVHX1JFUExZOgotICAgICAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcF9yZXR1cm5fcGFyYW1zKTsKLSAgICAgIFNUUkVBTV9UT19CREFERFIoYmRfYWRkciwgcF9yZXR1cm5fcGFyYW1zKTsKLSAgICAgIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpjb21tb246OmtVbmtub3duQ29ubmVjdGlvbkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLCBoY2lfZXZlbnQsIHN0YXR1cywgcmVhc29uLCAwKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0X3dpdGhfY2Jfb25fdGFzayhCVF9IRFIqIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpIHsKLSAgY29tbWFuZF9vcGNvZGVfdCBvcGNvZGU7Ci0gIC8vIDIgZm9yIGV2ZW50IGhlYWRlcjogZXZlbnQgY29kZSAoMSkgKyBwYXJhbWV0ZXIgbGVuZ3RoICgxKQotICAvLyAxIGZvciBudW1faGNpX3BrdCBjb21tYW5kIGNyZWRpdAotICB1aW50OF90KiBzdHJlYW0gPSBldmVudC0+ZGF0YSArIGV2ZW50LT5vZmZzZXQgKyAzOwotICBTVFJFQU1fVE9fVUlOVDE2KG9wY29kZSwgc3RyZWFtKTsKLQotICBidHVfaGNpZl9sb2dfY29tbWFuZF9jb21wbGV0ZV9tZXRyaWNzKG9wY29kZSwgc3RyZWFtKTsKLQotICBjbWRfd2l0aF9jYl9kYXRhKiBjYl93cmFwcGVyID0gKGNtZF93aXRoX2NiX2RhdGEqKWNvbnRleHQ7Ci0gIEhDSV9UUkFDRV9ERUJVRygiY29tbWFuZCBjb21wbGV0ZSBmb3I6ICVzIiwKLSAgICAgICAgICAgICAgICAgIGNiX3dyYXBwZXItPnBvc3RlZF9mcm9tLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIC8vIDIgZm9yIGV2ZW50IGhlYWRlcjogZXZlbnQgY29kZSAoMSkgKyBwYXJhbWV0ZXIgbGVuZ3RoICgxKQotICAvLyAzIGZvciBjb21tYW5kIGNvbXBsZXRlIGhlYWRlcjogbnVtX2hjaV9wa3QgKDEpICsgb3Bjb2RlICgyKQotICB1aW50MTZfdCBwYXJhbV9sZW4gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZXZlbnQtPmxlbiAtIDUpOwotICBzdGQ6Om1vdmUoY2Jfd3JhcHBlci0+Y2IpLlJ1bihzdHJlYW0sIHBhcmFtX2xlbik7Ci0gIGNtZF93aXRoX2NiX2RhdGFfY2xlYW51cChjYl93cmFwcGVyKTsKLSAgb3NpX2ZyZWUoY2Jfd3JhcHBlcik7Ci0KLSAgb3NpX2ZyZWUoZXZlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9jb21tYW5kX2NvbXBsZXRlX2V2dF93aXRoX2NiKEJUX0hEUiogcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0X3dpdGhfY2Jfb25fdGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgY29udGV4dCkpOwotfQotCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9jb21tYW5kX3N0YXR1c19ldnRfd2l0aF9jYl9vbl90YXNrKHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KSB7Ci0gIGNvbW1hbmRfb3Bjb2RlX3Qgb3Bjb2RlOwotICB1aW50OF90KiBzdHJlYW0gPSBldmVudC0+ZGF0YSArIGV2ZW50LT5vZmZzZXQ7Ci0gIFNUUkVBTV9UT19VSU5UMTYob3Bjb2RlLCBzdHJlYW0pOwotCi0gIENIRUNLKHN0YXR1cyAhPSAwKTsKLQotICAvLyBzdHJlYW0gKyAxIHRvIHNraXAgcGFyYW1ldGVyIGxlbmd0aCBmaWVsZAotICAvLyBObyBuZWVkIHRvIGNoZWNrIGxlbmd0aCBzaW5jZSBzdHJlYW0gaXMgd3JpdHRlbiBieSB1cwotICBidHVfaGNpZl9sb2dfY29tbWFuZF9tZXRyaWNzKG9wY29kZSwgc3RyZWFtICsgMSwgc3RhdHVzLCB0cnVlKTsKLQotICAvLyByZXBvcnQgY29tbWFuZCBzdGF0dXMgZXJyb3IKLSAgY21kX3dpdGhfY2JfZGF0YSogY2Jfd3JhcHBlciA9IChjbWRfd2l0aF9jYl9kYXRhKiljb250ZXh0OwotICBIQ0lfVFJBQ0VfREVCVUcoImNvbW1hbmQgc3RhdHVzIGZvcjogJXMiLAotICAgICAgICAgICAgICAgICAgY2Jfd3JhcHBlci0+cG9zdGVkX2Zyb20uVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgc3RkOjptb3ZlKGNiX3dyYXBwZXItPmNiKS5SdW4oJnN0YXR1cywgc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIGNtZF93aXRoX2NiX2RhdGFfY2xlYW51cChjYl93cmFwcGVyKTsKLSAgb3NpX2ZyZWUoY2Jfd3JhcHBlcik7Ci0KLSAgb3NpX2ZyZWUoZXZlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9jb21tYW5kX3N0YXR1c19ldnRfd2l0aF9jYih1aW50OF90IHN0YXR1cywgQlRfSERSKiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkgewotICAvLyBDb21tYW5kIGlzIHBlbmRpbmcsIHdlICByZXBvcnQgb25seSBlcnJvci4KLSAgaWYgKCFzdGF0dXMpIHsKLSAgICBvc2lfZnJlZShjb21tYW5kKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkb19pbl9tYWluX3RocmVhZCgKLSAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZChidHVfaGNpZl9jb21tYW5kX3N0YXR1c19ldnRfd2l0aF9jYl9vbl90YXNrLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgY29udGV4dCkpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBIb3N0IENvbnRyb2xsZXIuIHxjYnwgaXMKLSAqIGNhbGxlZCB3aGVuIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGlzIGNhbGxlZCB3aXRoIGVycm9yIGNvZGUsIG9yIHdoZW4gdGhlCi0gKiBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGlzIHJlY2VpdmVkLiAqLwotdm9pZCBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBwb3N0ZWRfZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhcmFtc19sZW4sIGhjaV9jbWRfY2IgY2IpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBwYXJhbXNfbGVuOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIG9wY29kZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGFyYW1zX2xlbik7Ci0gIGlmIChwYXJhbXMpIHsKLSAgICBtZW1jcHkocHAsIHBhcmFtcywgcGFyYW1zX2xlbik7Ci0gIH0KLQotICBidHVfaGNpZl9sb2dfY29tbWFuZF9tZXRyaWNzKG9wY29kZSwgcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpoY2k6OlNUQVRVU19VTktOT1dOLCBmYWxzZSk7Ci0KLSAgY21kX3dpdGhfY2JfZGF0YSogY2Jfd3JhcHBlciA9Ci0gICAgICAoY21kX3dpdGhfY2JfZGF0YSopb3NpX21hbGxvYyhzaXplb2YoY21kX3dpdGhfY2JfZGF0YSkpOwotCi0gIGNtZF93aXRoX2NiX2RhdGFfaW5pdChjYl93cmFwcGVyKTsKLSAgY2Jfd3JhcHBlci0+Y2IgPSBzdGQ6Om1vdmUoY2IpOwotICBjYl93cmFwcGVyLT5wb3N0ZWRfZnJvbSA9IHBvc3RlZF9mcm9tOwotCi0gIGJsdWV0b290aDo6c2hpbTo6aGNpX2xheWVyX2dldF9pbnRlcmZhY2UoKS0+dHJhbnNtaXRfY29tbWFuZCgKLSAgICAgIHAsIGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0X3dpdGhfY2IsCi0gICAgICBidHVfaGNpZl9jb21tYW5kX3N0YXR1c19ldnRfd2l0aF9jYiwgKHZvaWQqKWNiX3dyYXBwZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfaW5xdWlyeV9jb21wX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfSU5RVUlSWV9DT01QX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9pbnF1aXJ5X2NvbXBfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0KLSAgLyogVGVsbCBpbnF1aXJ5IHByb2Nlc3NpbmcgdGhhdCB3ZSBhcmUgZG9uZSAqLwotICBidG1fcHJvY2Vzc19pbnFfY29tcGxldGUoc3RhdHVzLCBCVE1fQlJfSU5RVUlSWV9NQVNLKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0dV9oY2lmX2Nvbm5lY3Rpb25fY29tcF9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgZXZlbnQgSENJX0NPTk5FQ1RJT05fQ09NUF9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2hjaWZfY29ubmVjdGlvbl9jb21wX2V2dCh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIHVpbnQ4X3QgbGlua190eXBlOwotICB1aW50OF90IGVuY19tb2RlOwotICB0QlRNX0VTQ09fREFUQSBlc2NvX2RhdGE7Ci0KLSAgaWYgKGV2dF9sZW4gPCAxMSkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTQxNjE5Njg2Iik7Ci0gICAgSENJX1RSQUNFX1dBUk5JTkcoIiVzOiBtYWxmb3JtZWQgZXZlbnQgb2Ygc2l6ZSAlaGhkIiwgX19mdW5jX18sIGV2dF9sZW4pOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIFNUUkVBTV9UT19CREFERFIoYmRhLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGxpbmtfdHlwZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChlbmNfbW9kZSwgcCk7Ci0KLSAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIEhDSV9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzOiBDb25uZWN0aW9uIGZhaWxlZDogc3RhdHVzPSVkLCBoYW5kbGU9JWQsIGxpbmtfdHlwZT0lZCwgIgotICAgICAgICAiZW5jX21vZGU9JWQiLAotICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBoYW5kbGUsIGxpbmtfdHlwZSwgZW5jX21vZGUpOwotICB9Ci0KLSAgaWYgKGxpbmtfdHlwZSA9PSBIQ0lfTElOS19UWVBFX0FDTCkgewotICAgIGJ0bV9hY2xfY29ubmVjdGVkKGJkYSwgaGFuZGxlLCBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwgZW5jX21vZGUpOwotICB9IGVsc2UgewotICAgIG1lbXNldCgmZXNjb19kYXRhLCAwLCBzaXplb2YodEJUTV9FU0NPX0RBVEEpKTsKLSAgICAvKiBlc2NvX2RhdGEubGlua190eXBlID0gSENJX0xJTktfVFlQRV9TQ087IGFscmVhZHkgemVybyAqLwotICAgIGVzY29fZGF0YS5iZF9hZGRyID0gYmRhOwotICAgIGJ0bV9zY29fY29ubmVjdGVkKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLCBiZGEsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAmZXNjb19kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfY29ubmVjdGlvbl9yZXF1ZXN0X2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfQ09OTkVDVElPTl9SRVFVRVNUX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9jb25uZWN0aW9uX3JlcXVlc3RfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIERFVl9DTEFTUyBkYzsKLSAgdWludDhfdCBsaW5rX3R5cGU7Ci0KLSAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHApOwotICBTVFJFQU1fVE9fREVWQ0xBU1MoZGMsIHApOwotICBTVFJFQU1fVE9fVUlOVDgobGlua190eXBlLCBwKTsKLQotICBpZiAobGlua190eXBlID09IEhDSV9MSU5LX1RZUEVfQUNMKSB7Ci0gICAgYnRtX2FjbF9jb25uZWN0aW9uX3JlcXVlc3QoYmRhLCBkYyk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRtX3Njb19jb25uX3JlcShiZGEsIGRjLCBsaW5rX3R5cGUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9kaXNjb25uZWN0aW9uX2NvbXBfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGV2ZW50IEhDSV9ESVNDT05ORUNUSU9OX0NPTVBfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2Rpc2Nvbm5lY3Rpb25fY29tcF9ldnQodWludDhfdCogcCkgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50OF90IHJlYXNvbjsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgocmVhc29uLCBwKTsKLQotICBoYW5kbGUgPSBIQ0lEX0dFVF9IQU5ETEUoaGFuZGxlKTsKLQotICBidG1fYWNsX2Rpc2Nvbm5lY3RlZChzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4ocmVhc29uKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9hdXRoZW50aWNhdGlvbl9jb21wX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfQVVUSEVOVElDQVRJT05fQ09NUF9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2hjaWZfYXV0aGVudGljYXRpb25fY29tcF9ldnQodWludDhfdCogcCkgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0KLSAgYnRtX3NlY19hdXRoX2NvbXBsZXRlKGhhbmRsZSwgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfcm10X25hbWVfcmVxdWVzdF9jb21wX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfUk1UX05BTUVfUkVRVUVTVF9DT01QX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9ybXRfbmFtZV9yZXF1ZXN0X2NvbXBfZXZ0KHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLSAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwKTsKLQotICBldnRfbGVuIC09ICgxICsgQkRfQUREUl9MRU4pOwotCi0gIGJ0bV9wcm9jZXNzX3JlbW90ZV9uYW1lKCZiZF9hZGRyLCBwLCBldnRfbGVuLCBzdGF0dXMpOwotCi0gIGJ0bV9zZWNfcm10X25hbWVfcmVxdWVzdF9jb21wbGV0ZSgmYmRfYWRkciwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpKTsKLX0KLQotY29uc3RleHByIHVpbnQ4X3QgTUlOX0tFWV9TSVpFID0gNzsKLQotc3RhdGljIHZvaWQgcmVhZF9lbmNyeXB0aW9uX2tleV9zaXplX2NvbXBsZXRlX2FmdGVyX2VuY3J5cHRpb25fY2hhbmdlKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfc2l6ZSkgewotICBpZiAoc3RhdHVzID09IEhDSV9FUlJfSU5TVUZGQ0lFTlRfU0VDVVJJVFkpIHsKLSAgICAvKiBJZiByZW1vdGUgZGV2aWNlIHN0b3AgdGhlIGVuY3J5cHRpb24gYmVmb3JlIHdlIGNhbGwgIlJlYWQgRW5jcnlwdGlvbiBLZXkKLSAgICAgKiBTaXplIiwgd2UgbWlnaHQgcmVjZWl2ZSBJbnN1ZmZpY2llbnQgU2VjdXJpdHksIHdoaWNoIG1lYW5zIHRoYXQgbGluayBpcwotICAgICAqIG5vIGxvbmdlciBlbmNyeXB0ZWQuICovCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IGVuY3J5cHRpb24gc3RvcHBlZCBvbiBsaW5rOiAiIDw8IGxvZ2hleChoYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGlzY29ubmVjdGluZywgc3RhdHVzOiAiIDw8IGxvZ2hleChzdGF0dXMpOwotICAgIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKGhhbmRsZSwgSENJX0VSUl9QRUVSX1VTRVIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChrZXlfc2l6ZSA8IE1JTl9LRVlfU0laRSkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTI0MzAxMTM3Iik7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIGVuY3J5cHRpb24ga2V5IHRvbyBzaG9ydCwgZGlzY29ubmVjdGluZy4gaGFuZGxlOiAiIDw8IGxvZ2hleChoYW5kbGUpCi0gICAgICAgICAgICAgICA8PCAiIGtleV9zaXplOiAiIDw8ICtrZXlfc2l6ZTsKLQotICAgIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKGhhbmRsZSwgSENJX0VSUl9IT1NUX1JFSkVDVF9TRUNVUklUWSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gZ29vZCBrZXkgc2l6ZSAtIHN1Y2NlZWQKLSAgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZShoYW5kbGUsIHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogZW5hYmxlICovKTsKLSAgYnRtX3NlY19lbmNyeXB0X2NoYW5nZShoYW5kbGUsIHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogZW5hYmxlICovKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9lbmNyeXB0aW9uX2NoYW5nZV9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgZXZlbnQgSENJX0VOQ1JZUFRJT05fQ0hBTkdFX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9lbmNyeXB0aW9uX2NoYW5nZV9ldnQodWludDhfdCogcCkgewotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50OF90IGVuY3JfZW5hYmxlOwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChlbmNyX2VuYWJsZSwgcCk7Ci0KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUyB8fCBlbmNyX2VuYWJsZSA9PSAwIHx8IEJUTV9Jc0JsZUNvbm5lY3Rpb24oaGFuZGxlKSkgewotICAgIGlmIChzdGF0dXMgPT0gSENJX0VSUl9DT05ORUNUSU9OX1RPVVQpIHsKLSAgICAgIHNtcF9jYW5jZWxfc3RhcnRfZW5jcnlwdGlvbl9hdHRlbXB0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZShoYW5kbGUsIHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcl9lbmFibGUpOwotICAgIGJ0bV9zZWNfZW5jcnlwdF9jaGFuZ2UoaGFuZGxlLCBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3JfZW5hYmxlKTsKLSAgfSBlbHNlIHsKLSAgICBidHNuZF9oY2ljX3JlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZShoYW5kbGUsIGJhc2U6OkJpbmQoJnJlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZV9jb21wbGV0ZV9hZnRlcl9lbmNyeXB0aW9uX2NoYW5nZSkpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9yZWFkX3JtdF9leHRfZmVhdHVyZXNfY29tcF9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgZXZlbnQgSENJX1JFQURfUk1UX0VYVF9GRUFUVVJFU19DT01QX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9yZWFkX3JtdF9leHRfZmVhdHVyZXNfY29tcF9ldnQodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV2dF9sZW4pIHsKLSAgdWludDhfdCogcF9jdXIgPSBwOwotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHBfY3VyKTsKLQotICBpZiAoc3RhdHVzID09IEhDSV9TVUNDRVNTKQotICAgIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGVfcmF3KHAsIGV2dF9sZW4pOwotICBlbHNlIHsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9jdXIpOwotICAgIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfZmFpbGVkKHN0YXR1cywgaGFuZGxlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfZXNjb19jb25uZWN0aW9uX2NvbXBfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGV2ZW50IEhDSV9FU0NPX0NPTk5FQ1RJT05fQ09NUF9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2hjaWZfZXNjb19jb25uZWN0aW9uX2NvbXBfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgdEJUTV9FU0NPX0RBVEEgZGF0YTsKLSAgdWludDE2X3QgaGFuZGxlOwotICBSYXdBZGRyZXNzIGJkYTsKLSAgdWludDhfdCBzdGF0dXM7Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLSAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHApOwotCi0gIFNUUkVBTV9UT19VSU5UOChkYXRhLmxpbmtfdHlwZSwgcCk7Ci0gIFNUUkVBTV9TS0lQX1VJTlQ4KHApOyAgIC8vIHR4X2ludGVydmFsCi0gIFNUUkVBTV9TS0lQX1VJTlQ4KHApOyAgIC8vIHJldHJhbnNfd2luZG93Ci0gIFNUUkVBTV9TS0lQX1VJTlQxNihwKTsgIC8vIHJ4X3BrdF9sZW4KLSAgU1RSRUFNX1NLSVBfVUlOVDE2KHApOyAgLy8gdHhfcGt0X2xlbgotICBTVFJFQU1fU0tJUF9VSU5UOChwKTsgICAvLyBhaXJfbW9kZQotCi0gIGhhbmRsZSA9IEhDSURfR0VUX0hBTkRMRShoYW5kbGUpOwotCi0gIGRhdGEuYmRfYWRkciA9IGJkYTsKLSAgYnRtX3Njb19jb25uZWN0ZWQoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cyksIGJkYSwgaGFuZGxlLCAmZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9lc2NvX2Nvbm5lY3Rpb25fY2hnX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfRVNDT19DT05ORUNUSU9OX0NIQU5HRURfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2VzY29fY29ubmVjdGlvbl9jaGdfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCB0eF9wa3RfbGVuOwotICB1aW50MTZfdCByeF9wa3RfbGVuOwotICB1aW50OF90IHN0YXR1czsKLSAgdWludDhfdCB0eF9pbnRlcnZhbDsKLSAgdWludDhfdCByZXRyYW5zX3dpbmRvdzsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotCi0gIFNUUkVBTV9UT19VSU5UOCh0eF9pbnRlcnZhbCwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChyZXRyYW5zX3dpbmRvdywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYocnhfcGt0X2xlbiwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYodHhfcGt0X2xlbiwgcCk7Ci0KLSAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9oZGxfY29tbWFuZF9jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGNvbW1hbmQgY29tcGxldGUgZXZlbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2hjaWZfaGRsX2NvbW1hbmRfY29tcGxldGUodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXZ0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfY3BsdF9jYmFjaykgewotICBzd2l0Y2ggKG9wY29kZSkgewotICAgIGNhc2UgSENJX0lOUVVJUllfQ0FOQ0VMOgotICAgICAgLyogVGVsbCBpbnF1aXJ5IHByb2Nlc3NpbmcgdGhhdCB3ZSBhcmUgZG9uZSAqLwotICAgICAgYnRtX3Byb2Nlc3NfY2FuY2VsX2NvbXBsZXRlKEhDSV9TVUNDRVNTLCBCVE1fQlJfSU5RVUlSWV9NQVNLKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1NFVF9FVkVOVF9GSUxURVI6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0RFTEVURV9TVE9SRURfTElOS19LRVk6Ci0gICAgICBidG1fZGVsZXRlX3N0b3JlZF9saW5rX2tleV9jb21wbGV0ZShwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfUkVBRF9MT0NBTF9OQU1FOgotICAgICAgYnRtX3JlYWRfbG9jYWxfbmFtZV9jb21wbGV0ZShwLCBldnRfbGVuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfR0VUX0xJTktfUVVBTElUWToKLSAgICAgIGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZShwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfUkVBRF9SU1NJOgotICAgICAgYnRtX3JlYWRfcnNzaV9jb21wbGV0ZShwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSOgotICAgICAgYnRtX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jb21wbGV0ZShwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfUkVBRF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVDoKLSAgICAgIGJ0bV9yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NvbXBsZXRlKHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhDSV9SRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMOgotICAgICAgYnRtX3JlYWRfdHhfcG93ZXJfY29tcGxldGUocCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhDSV9DUkVBVEVfQ09OTkVDVElPTl9DQU5DRUw6Ci0gICAgICBidG1fY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlKHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhDSV9SRUFEX0xPQ0FMX09PQl9EQVRBOgotICAgICAgYnRtX3JlYWRfbG9jYWxfb29iX2NvbXBsZXRlKHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhDSV9SRUFEX0lOUV9UWF9QT1dFUl9MRVZFTDoKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQkxFIENvbW1hbmRzIHNDb21wbGV0ZSovCi0gICAgY2FzZSBIQ0lfQkxFX1JBTkQ6Ci0gICAgY2FzZSBIQ0lfQkxFX0VOQ1JZUFQ6Ci0gICAgICBidG1fYmxlX3JhbmRfZW5jX2NvbXBsZXRlKHAsIG9wY29kZSwgKHRCVE1fUkFORF9FTkNfQ0IqKXBfY3BsdF9jYmFjayk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9SRUFEX0FEVl9DSE5MX1RYX1BPV0VSOgotICAgICAgYnRtX3JlYWRfdHhfcG93ZXJfY29tcGxldGUocCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9XUklURV9BRFZfRU5BQkxFOgotICAgICAgYnRtX2JsZV93cml0ZV9hZHZfZW5hYmxlX2NvbXBsZXRlKHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhDSV9CTEVfQ1JFQVRFX0xMX0NPTk46Ci0gICAgY2FzZSBIQ0lfTEVfRVhURU5ERURfQ1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgICAvLyBObyBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGZvciB0aG9zZSBjb21tYW5kcyBhY2NvcmRpbmcgdG8gc3BlYwotICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gY29tbWFuZCBjb21wbGV0ZSBleHBlY3RlZCwgYnV0IHJlY2VpdmVkISI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9DUkVBVEVfQ09OTl9DQU5DRUw6Ci0gICAgICBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZShwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfQkxFX1RSQU5TTUlUVEVSX1RFU1Q6Ci0gICAgY2FzZSBIQ0lfQkxFX1JFQ0VJVkVSX1RFU1Q6Ci0gICAgY2FzZSBIQ0lfQkxFX1RFU1RfRU5EOgotICAgICAgYnRtX2JsZV90ZXN0X2NvbW1hbmRfY29tcGxldGUocCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9BRERfREVWX1JFU09MVklOR19MSVNUOgotICAgICAgYnRtX2JsZV9hZGRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUocCwgZXZ0X2xlbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9STV9ERVZfUkVTT0xWSU5HX0xJU1Q6Ci0gICAgICBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZShwLCBldnRfbGVuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfQkxFX0NMRUFSX1JFU09MVklOR19MSVNUOgotICAgICAgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdF9jb21wbGV0ZShwLCBldnRfbGVuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBIQ0lfQkxFX1JFQURfUkVTT0xWQUJMRV9BRERSX1BFRVI6Ci0gICAgICBidG1fYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUocCwgZXZ0X2xlbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSENJX0JMRV9SRUFEX1JFU09MVkFCTEVfQUREUl9MT0NBTDoKLSAgICBjYXNlIEhDSV9CTEVfU0VUX0FERFJfUkVTT0xVVElPTl9FTkFCTEU6Ci0gICAgY2FzZSBIQ0lfQkxFX1NFVF9SQU5EX1BSSVZfQUREUl9USU1PVVQ6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChvcGNvZGUgJiBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQykgPT0gSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0gICAgICAgIGJ0bV92c2NfY29tcGxldGUocCwgb3Bjb2RlLCBldnRfbGVuLCAodEJUTV9WU0NfQ01QTF9DQiopcF9jcGx0X2NiYWNrKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9jb21tYW5kX2NvbXBsZXRlX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfQ09NTUFORF9DT01QTEVURV9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2hjaWZfY29tbWFuZF9jb21wbGV0ZV9ldnRfb25fdGFzayhCVF9IRFIqIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KSB7Ci0gIGNvbW1hbmRfb3Bjb2RlX3Qgb3Bjb2RlOwotICAvLyAyIGZvciBldmVudCBoZWFkZXI6IGV2ZW50IGNvZGUgKDEpICsgcGFyYW1ldGVyIGxlbmd0aCAoMSkKLSAgLy8gMSBmb3IgbnVtX2hjaV9wa3QgY29tbWFuZCBjcmVkaXQKLSAgdWludDhfdCogc3RyZWFtID0gZXZlbnQtPmRhdGEgKyBldmVudC0+b2Zmc2V0ICsgMzsKLSAgU1RSRUFNX1RPX1VJTlQxNihvcGNvZGUsIHN0cmVhbSk7Ci0KLSAgYnR1X2hjaWZfbG9nX2NvbW1hbmRfY29tcGxldGVfbWV0cmljcyhvcGNvZGUsIHN0cmVhbSk7Ci0gIC8vIDIgZm9yIGV2ZW50IGhlYWRlcjogZXZlbnQgY29kZSAoMSkgKyBwYXJhbWV0ZXIgbGVuZ3RoICgxKQotICAvLyAzIGZvciBjb21tYW5kIGNvbXBsZXRlIGhlYWRlcjogbnVtX2hjaV9wa3QgKDEpICsgb3Bjb2RlICgyKQotICB1aW50MTZfdCBwYXJhbV9sZW4gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZXZlbnQtPmxlbiAtIDUpOwotICBidHVfaGNpZl9oZGxfY29tbWFuZF9jb21wbGV0ZShvcGNvZGUsIHN0cmVhbSwgcGFyYW1fbGVuLCBjb250ZXh0KTsKLQotICBvc2lfZnJlZShldmVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0KEJUX0hEUiogcmVzcG9uc2UsIHZvaWQqIGNvbnRleHQpIHsKLSAgZG9faW5fbWFpbl90aHJlYWQoRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGJ0dV9oY2lmX2NvbW1hbmRfY29tcGxldGVfZXZ0X29uX3Rhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgY29udGV4dCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfaGRsX2NvbW1hbmRfc3RhdHVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgYSBjb21tYW5kIHN0YXR1cyBldmVudAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9oZGxfY29tbWFuZF9zdGF0dXModWludDE2X3Qgb3Bjb2RlLCB1aW50OF90IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3ZzY19zdGF0dXNfY2JhY2spIHsKLSAgQ0hFQ0tfTkUocF9jbWQsIG51bGxwdHIpIDw8ICJOdWxsIGNvbW1hbmQgZm9yIG9wY29kZSAweCIgPDwgbG9naGV4KG9wY29kZSk7Ci0gIHBfY21kKys7ICAvLyBTa2lwIHBhcmFtZXRlciB0b3RhbCBsZW5ndGgKLQotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLQotICBzd2l0Y2ggKG9wY29kZSkgewotICAgIC8vIExpbmsgQ29udHJvbCBDb21tYW5kcwotICAgIGNhc2UgSENJX0lOUVVJUlk6Ci0gICAgICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIC8vIFRlbGwgaW5xdWlyeSBwcm9jZXNzaW5nIHRoYXQgd2UgYXJlIGRvbmUKLSAgICAgICAgYnRtX3Byb2Nlc3NfaW5xX2NvbXBsZXRlKHN0YXR1cywgQlRNX0JSX0lOUVVJUllfTUFTSyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9TV0lUQ0hfUk9MRToKLSAgICAgIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgICAgLy8gVGVsbCBCVE0gdGhhdCB0aGUgY29tbWFuZCBmYWlsZWQKLSAgICAgICAgU1RSRUFNX1RPX0JEQUREUihiZF9hZGRyLCBwX2NtZCk7Ci0gICAgICAgIGJ0bV9hY2xfcm9sZV9jaGFuZ2VkKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLCBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfUk9MRV9VTktOT1dOKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX0NSRUFURV9DT05ORUNUSU9OOgotICAgICAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgICAgICBTVFJFQU1fVE9fQkRBRERSKGJkX2FkZHIsIHBfY21kKTsKLSAgICAgICAgYnRtX2FjbF9jb25uZWN0ZWQoYmRfYWRkciwgSENJX0lOVkFMSURfSEFORExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9BVVRIRU5USUNBVElPTl9SRVFVRVNURUQ6Ci0gICAgICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIC8vIERldmljZSByZWZ1c2VkIHRvIHN0YXJ0IGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIC8vIFRoaXMgaXMgdHJlYXRlZCBhcyBhbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlCi0gICAgICAgIGJ0bV9zZWNfYXV0aF9jb21wbGV0ZShIQ0lfSU5WQUxJRF9IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9TRVRfQ09OTl9FTkNSWVBUSU9OOgotICAgICAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgICAgICAvLyBEZXZpY2UgcmVmdXNlZCB0byBzdGFydCBlbmNyeXB0aW9uCi0gICAgICAgIC8vIFRoaXMgaXMgdHJlYXRlZCBhcyBhbiBlbmNyeXB0aW9uIGZhaWx1cmUKLSAgICAgICAgYnRtX3NlY19lbmNyeXB0X2NoYW5nZShIQ0lfSU5WQUxJRF9IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cyksIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1JNVF9OQU1FX1JFUVVFU1Q6Ci0gICAgICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIC8vIFRlbGwgaW5xdWlyeSBwcm9jZXNzaW5nIHRoYXQgd2UgYXJlIGRvbmUKLSAgICAgICAgYnRtX3Byb2Nlc3NfcmVtb3RlX25hbWUobnVsbHB0ciwgbnVsbHB0ciwgMCwgc3RhdHVzKTsKLSAgICAgICAgYnRtX3NlY19ybXRfbmFtZV9yZXF1ZXN0X2NvbXBsZXRlKG51bGxwdHIsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9SRUFEX1JNVF9FWFRfRkVBVFVSRVM6Ci0gICAgICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwX2NtZCk7Ci0gICAgICAgIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfZmFpbGVkKHN0YXR1cywgaGFuZGxlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1NFVFVQX0VTQ09fQ09OTkVDVElPTjoKLSAgICBjYXNlIEhDSV9FTkhfU0VUVVBfRVNDT19DT05ORUNUSU9OOgotICAgICAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9jbWQpOwotICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaW5pdGlhbCBjb25uZWN0aW9uIGZhaWxlZCBvciBpcyBhIGNoYW5nZSBvZiBzZXR1cAotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBCTEUgQ29tbWFuZHMKLSAgICBjYXNlIEhDSV9CTEVfQ1JFQVRFX0xMX0NPTk46Ci0gICAgY2FzZSBIQ0lfTEVfRVhURU5ERURfQ1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTKSB7Ci0gICAgICAgIGJ0bV9ibGVfY3JlYXRlX2xsX2Nvbm5fY29tcGxldGUoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfQkxFX1NUQVJUX0VOQzoKLSAgICAgIC8vIFJhY2UgY29uZGl0aW9uOiBkaXNjb25uZWN0aW9uIGhhcHBlbmVkIHJpZ2h0IGJlZm9yZSB3ZSBzZW5kCi0gICAgICAvLyAiTEUgRW5jcnlwdCIsIGNvbnRyb2xsZXIgcmVzcG9uZHMgd2l0aCBubyBjb25uZWN0aW9uLCB3ZSBzaG91bGQKLSAgICAgIC8vIGNhbmNlbCB0aGUgZW5jcnlwdGlvbiBhdHRlbXB0LCByYXRoZXIgdGhhbiB1bnBhaXIgdGhlIGRldmljZS4KLSAgICAgIGlmIChzdGF0dXMgPT0gSENJX0VSUl9OT19DT05ORUNUSU9OKSB7Ci0gICAgICAgIHNtcF9jYW5jZWxfc3RhcnRfZW5jcnlwdGlvbl9hdHRlbXB0KCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIC8vIExpbmsgUG9saWN5IENvbW1hbmRzCi0gICAgY2FzZSBIQ0lfRVhJVF9TTklGRl9NT0RFOgotICAgIGNhc2UgSENJX0VYSVRfUEFSS19NT0RFOgotICAgICAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgICAgICAvLyBBbGxvdyBTQ08gaW5pdGlhdGlvbiB0byBjb250aW51ZSBpZiB3YWl0aW5nIGZvciBjaGFuZ2UgbW9kZSBldmVudAotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcF9jbWQpOwotICAgICAgICBidG1fc2NvX2Noa19wZW5kX3VucGFyayhzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwgaGFuZGxlKTsKLSAgICAgIH0KLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgSENJX0hPTERfTU9ERToKLSAgICBjYXNlIEhDSV9TTklGRl9NT0RFOgotICAgIGNhc2UgSENJX1BBUktfTU9ERToKLSAgICAgIGJ0bV9wbV9wcm9jX2NtZF9zdGF0dXMoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cykpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChvcGNvZGUgJiBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQykgPT0gSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpIHsKLSAgICAgICAgYnRtX3ZzY19jb21wbGV0ZSgmc3RhdHVzLCBvcGNvZGUsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHRCVE1fVlNDX0NNUExfQ0IqKXBfdnNjX3N0YXR1c19jYmFjayk7Ci0gICAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0dV9oY2lmX2NvbW1hbmRfc3RhdHVzX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfQ09NTUFORF9TVEFUVVNfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2NvbW1hbmRfc3RhdHVzX2V2dF9vbl90YXNrKHVpbnQ4X3Qgc3RhdHVzLCBCVF9IRFIqIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkgewotICBjb21tYW5kX29wY29kZV90IG9wY29kZTsKLSAgdWludDhfdCogc3RyZWFtID0gZXZlbnQtPmRhdGEgKyBldmVudC0+b2Zmc2V0OwotICBTVFJFQU1fVE9fVUlOVDE2KG9wY29kZSwgc3RyZWFtKTsKLQotICAvLyBzdHJlYW0gKyAxIHRvIHNraXAgcGFyYW1ldGVyIGxlbmd0aCBmaWVsZAotICAvLyBObyBuZWVkIHRvIGNoZWNrIGxlbmd0aCBzaW5jZSBzdHJlYW0gaXMgd3JpdHRlbiBieSB1cwotICBidHVfaGNpZl9sb2dfY29tbWFuZF9tZXRyaWNzKG9wY29kZSwgc3RyZWFtICsgMSwgc3RhdHVzLCB0cnVlKTsKLQotICBidHVfaGNpZl9oZGxfY29tbWFuZF9zdGF0dXMob3Bjb2RlLCBzdGF0dXMsIHN0cmVhbSwgY29udGV4dCk7Ci0gIG9zaV9mcmVlKGV2ZW50KTsKLX0KLQotc3RhdGljIHZvaWQgYnR1X2hjaWZfY29tbWFuZF9zdGF0dXNfZXZ0KHVpbnQ4X3Qgc3RhdHVzLCBCVF9IRFIqIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkgewotICBkb19pbl9tYWluX3RocmVhZChGUk9NX0hFUkUsIGJhc2U6OkJpbmQoYnR1X2hjaWZfY29tbWFuZF9zdGF0dXNfZXZ0X29uX3Rhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGNvbW1hbmQsIGNvbnRleHQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0dV9oY2lmX2hhcmR3YXJlX2Vycm9yX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfSEFSRFdBUkVfRVJST1JfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2hhcmR3YXJlX2Vycm9yX2V2dCh1aW50OF90KiBwKSB7Ci0gIExPR19FUlJPUigiVU5IQU5ETEVEIEN0bHIgSC93IGVycm9yIGV2ZW50IC0gY29kZToweCV4IiwgKnApOwotICBCVEFfc3lzX3NpZ25hbF9od19lcnJvcigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfcm9sZV9jaGFuZ2VfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGV2ZW50IEhDSV9ST0xFX0NIQU5HRV9FVlQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2hjaWZfcm9sZV9jaGFuZ2VfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB1aW50OF90IHJvbGU7Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0gIFNUUkVBTV9UT19CREFERFIoYmRhLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHJvbGUsIHApOwotCi0gIGJ0bV9yZWplY3RsaXN0X3JvbGVfY2hhbmdlX2RldmljZShiZGEsIHN0YXR1cyk7Ci0gIGJ0bV9hY2xfcm9sZV9jaGFuZ2VkKHRvX2hjaV9zdGF0dXNfY29kZShzdGF0dXMpLCBiZGEsIHRvX2hjaV9yb2xlKHJvbGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0dV9oY2lmX21vZGVfY2hhbmdlX2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfTU9ERV9DSEFOR0VfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX21vZGVfY2hhbmdlX2V2dCh1aW50OF90KiBwKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQ4X3QgY3VycmVudF9tb2RlOwotICB1aW50MTZfdCBpbnRlcnZhbDsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLQotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChjdXJyZW50X21vZGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGludGVydmFsLCBwKTsKLSAgYnRtX3Njb19jaGtfcGVuZF91bnBhcmsoc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cyksIGhhbmRsZSk7Ci0gIGJ0bV9wbV9wcm9jX21vZGVfY2hhbmdlKHN0YXRpY19jYXN0PHRIQ0lfU1RBVFVTPihzdGF0dXMpLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRIQ0lfTU9ERT4oY3VycmVudF9tb2RlKSwgaW50ZXJ2YWwpOwotCi0jaWYgKEhJRF9ERVZfSU5DTFVERUQgPT0gVFJVRSAmJiBISURfREVWX1BNX0lOQ0xVREVEID09IFRSVUUpCi0gIGhpZGRfcG1fcHJvY19tb2RlX2NoYW5nZShzdGF0dXMsIGN1cnJlbnRfbW9kZSwgaW50ZXJ2YWwpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBidHVfaGNpZl9saW5rX2tleV9ub3RpZmljYXRpb25fZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGV2ZW50IEhDSV9MSU5LX0tFWV9OT1RJRklDQVRJT05fRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX2xpbmtfa2V5X25vdGlmaWNhdGlvbl9ldnQodWludDhfdCogcCkgewotICBSYXdBZGRyZXNzIGJkYTsKLSAgT2N0ZXQxNiBrZXk7Ci0gIHVpbnQ4X3Qga2V5X3R5cGU7Ci0KLSAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHApOwotICBTVFJFQU1fVE9fQVJSQVkxNihrZXkuZGF0YSgpLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KGtleV90eXBlLCBwKTsKLQotICBidG1fc2VjX2xpbmtfa2V5X25vdGlmaWNhdGlvbihiZGEsIGtleSwga2V5X3R5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnR1X2hjaWZfcmVhZF9jbG9ja19vZmZfY29tcF9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgZXZlbnQgSENJX1JFQURfQ0xPQ0tfT0ZGX0NPTVBfRVZUCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJ0dV9oY2lmX3JlYWRfY2xvY2tfb2ZmX2NvbXBfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgY2xvY2tfb2Zmc2V0OwotCi0gIFNUUkVBTV9UT19VSU5UOChzdGF0dXMsIHApOwotCi0gIC8qIElmIGZhaWxlZCB0byBnZXQgY2xvY2sgb2Zmc2V0IGp1c3QgZHJvcCB0aGUgcmVzdWx0ICovCi0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHJldHVybjsKLQotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYoY2xvY2tfb2Zmc2V0LCBwKTsKLQotICBoYW5kbGUgPSBIQ0lEX0dFVF9IQU5ETEUoaGFuZGxlKTsKLQotICBidG1fc2VjX3VwZGF0ZV9jbG9ja19vZmZzZXQoaGFuZGxlLCBjbG9ja19vZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2ltcGxlIFBhaXJpbmcgRXZlbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0dV9oY2lmX2lvX2NhcF9yZXF1ZXN0X2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBldmVudCBIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX0VWVAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBidHVfaGNpZl9pb19jYXBfcmVxdWVzdF9ldnQodWludDhfdCogcCkgewotICBSYXdBZGRyZXNzIGJkYTsKLSAgU1RSRUFNX1RPX0JEQUREUihiZGEsIHApOwotICBidG1faW9fY2FwYWJpbGl0aWVzX3JlcShiZGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRW5kIG9mIFNpbXBsZSBQYWlyaW5nIEV2ZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHJlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZV9jb21wbGV0ZV9hZnRlcl9rZXlfcmVmcmVzaCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGtleV9zaXplKSB7Ci0gIGlmIChzdGF0dXMgPT0gSENJX0VSUl9JTlNVRkZDSUVOVF9TRUNVUklUWSkgewotICAgIC8qIElmIHJlbW90ZSBkZXZpY2Ugc3RvcCB0aGUgZW5jcnlwdGlvbiBiZWZvcmUgd2UgY2FsbCAiUmVhZCBFbmNyeXB0aW9uIEtleQotICAgICAqIFNpemUiLCB3ZSBtaWdodCByZWNlaXZlIEluc3VmZmljaWVudCBTZWN1cml0eSwgd2hpY2ggbWVhbnMgdGhhdCBsaW5rIGlzCi0gICAgICogbm8gbG9uZ2VyIGVuY3J5cHRlZC4gKi8KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZW5jcnlwdGlvbiBzdG9wcGVkIG9uIGxpbms6ICIgPDwgbG9naGV4KGhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBIQ0lfU1VDQ0VTUykgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBkaXNjb25uZWN0aW5nLCBzdGF0dXM6ICIgPDwgbG9naGV4KHN0YXR1cyk7Ci0gICAgYWNsX2Rpc2Nvbm5lY3RfZnJvbV9oYW5kbGUoaGFuZGxlLCBIQ0lfRVJSX1BFRVJfVVNFUik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGtleV9zaXplIDwgTUlOX0tFWV9TSVpFKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjQzMDExMzciKTsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgZW5jcnlwdGlvbiBrZXkgdG9vIHNob3J0LCBkaXNjb25uZWN0aW5nLiBoYW5kbGU6ICIgPDwgbG9naGV4KGhhbmRsZSkKLSAgICAgICAgICAgICAgIDw8ICIga2V5X3NpemU6ICIgPDwgK2tleV9zaXplOwotCi0gICAgYWNsX2Rpc2Nvbm5lY3RfZnJvbV9oYW5kbGUoaGFuZGxlLCBIQ0lfRVJSX0hPU1RfUkVKRUNUX1NFQ1VSSVRZKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBidG1fc2VjX2VuY3J5cHRfY2hhbmdlKGhhbmRsZSwgc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBlbmNfZW5hYmxlICovKTsKLX0KLQotc3RhdGljIHZvaWQgYnR1X2hjaWZfZW5jcnlwdGlvbl9rZXlfcmVmcmVzaF9jbXBsX2V2dCh1aW50OF90KiBwKSB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50MTZfdCBoYW5kbGU7Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLQotICBpZiAoc3RhdHVzICE9IEhDSV9TVUNDRVNTIHx8IEJUTV9Jc0JsZUNvbm5lY3Rpb24oaGFuZGxlKSkgewotICAgIGJ0bV9zZWNfZW5jcnlwdF9jaGFuZ2UoaGFuZGxlLCBzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gSENJX1NVQ0NFU1MpID8gMSA6IDApOwotICB9IGVsc2UgewotICAgIGJ0c25kX2hjaWNfcmVhZF9lbmNyeXB0aW9uX2tleV9zaXplKGhhbmRsZSwgYmFzZTo6QmluZCgmcmVhZF9lbmNyeXB0aW9uX2tleV9zaXplX2NvbXBsZXRlX2FmdGVyX2tleV9yZWZyZXNoKSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJMRSBFdmVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gdm9pZCBnYXR0X25vdGlmeV9jb25uX3VwZGF0ZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGUsIHVpbnQxNl90IGludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci0KLXN0YXRpYyB2b2lkIGJ0dV9ibGVfbGxfY29ubl9wYXJhbV91cGRfZXZ0KHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgLyogTEUgY29ubmVjdGlvbiB1cGRhdGUgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYXMgYSBjZW50cmFsLiAqLwotICAvKiBXZSBjYW4gZW5hYmxlIHRoZSB1cGRhdGUgcmVxdWVzdCBpZiB0aGUgcmVzdWx0IGlzIGEgc3VjY2Vzcy4gKi8KLSAgLyogZXh0cmFjdCB0aGUgSENJIGhhbmRsZSBmaXJzdCAqLwotICB1aW50OF90IHN0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBpbnRlcnZhbDsKLSAgdWludDE2X3QgbGF0ZW5jeTsKLSAgdWludDE2X3QgdGltZW91dDsKLQotICBTVFJFQU1fVE9fVUlOVDgoc3RhdHVzLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGludGVydmFsLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihsYXRlbmN5LCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNih0aW1lb3V0LCBwKTsKLQotICBhY2xfYmxlX3VwZGF0ZV9ldmVudF9yZWNlaXZlZChzdGF0aWNfY2FzdDx0SENJX1NUQVRVUz4oc3RhdHVzKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCwgbGF0ZW5jeSwgdGltZW91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0dV9ibGVfcHJvY19sdGtfcmVxKHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgZWRpdiwgaGFuZGxlOwotICB1aW50OF90KiBwcDsKLQotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIHBwID0gcCArIDg7Ci0gIFNUUkVBTV9UT19VSU5UMTYoZWRpdiwgcHApOwotICBidG1fYmxlX2x0a19yZXF1ZXN0KGhhbmRsZSwgcCwgZWRpdik7Ci0gIC8qIFRoaXMgaXMgZW1wdHkgdW50aWwgYW4gdXBwZXIgbGF5ZXIgY2FyZXMgYWJvdXQgcmV0dXJuaW5nIGV2ZW50ICovCi19Ci0KLXN0YXRpYyB2b2lkIGJ0dV9ibGVfZGF0YV9sZW5ndGhfY2hhbmdlX2V2dCh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgdHhfZGF0YV9sZW47Ci0gIHVpbnQxNl90IHJ4X2RhdGFfbGVuOwotCi0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uKCkpIHsKLSAgICBIQ0lfVFJBQ0VfV0FSTklORygiJXMsIHJlcXVlc3Qgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYodHhfZGF0YV9sZW4sIHApOwotICBwICs9IDI7IC8qIFNraXAgdGhlIFR4VGltZXIgKi8KLSAgU1RSRUFNX1RPX1VJTlQxNihyeF9kYXRhX2xlbiwgcCk7Ci0KLSAgbDJjYmxlX3Byb2Nlc3NfZGF0YV9sZW5ndGhfY2hhbmdlX2V2ZW50KGhhbmRsZSwgdHhfZGF0YV9sZW4sIHJ4X2RhdGFfbGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVuZCBvZiBCTEUgRXZlbnRzIEhhbmRsZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYnR1X2JsZV9yY19wYXJhbV9yZXFfZXZ0KHVpbnQ4X3QqIHApIHsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50MTZfdCBpbnRfbWluLCBpbnRfbWF4LCBsYXRlbmN5LCB0aW1lb3V0OwotCi0gIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihpbnRfbWluLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihpbnRfbWF4LCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihsYXRlbmN5LCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNih0aW1lb3V0LCBwKTsKLQotICBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dChoYW5kbGUsIGludF9taW4sIGludF9tYXgsIGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svYnR1L2J0dV90YXNrLmNjIGIvc3RhY2svYnR1L2J0dV90YXNrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjMyNjA3Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2J0dS9idHVfdGFzay5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2J0dV90YXNrIgotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9ydW5fbG9vcC5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvbW9kdWxlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRtX2lzb19hcGkuaCIKLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idHUuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6Oklzb01hbmFnZXI7Ci0KLXZvaWQgYnRtX3JvdXRlX3Njb19kYXRhKEJUX0hEUiogcF9tc2cpOwotCi0vKiBEZWZpbmUgQlRVIHN0b3JhZ2UgYXJlYSAqLwotdWludDhfdCBidHVfdHJhY2VfbGV2ZWwgPSBIQ0lfSU5JVElBTF9UUkFDRV9MRVZFTDsKLQotc3RhdGljIE1lc3NhZ2VMb29wVGhyZWFkIG1haW5fdGhyZWFkKCJidF9tYWluX3RocmVhZCIsIHRydWUpOwotCi12b2lkIGJ0dV9oY2lfbXNnX3Byb2Nlc3MoQlRfSERSKiBwX21zZykgewotICAvKiBEZXRlcm1pbmUgdGhlIGlucHV0IG1lc3NhZ2UgdHlwZS4gKi8KLSAgc3dpdGNoIChwX21zZy0+ZXZlbnQgJiBCVF9FVlRfTUFTSykgewotICAgIGNhc2UgQlRfRVZUX1RPX0JUVV9IQ0lfQUNMOgotICAgICAgLyogQWxsIEFjbCBEYXRhIGdvZXMgdG8gQUNMICovCi0gICAgICBhY2xfcmN2X2FjbF9kYXRhKHBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVF9FVlRfVE9fQlRVX0wyQ19TRUdfWE1JVDoKLSAgICAgIC8qIEwyQ0FQIHNlZ21lbnQgdHJhbnNtaXQgY29tcGxldGUgKi8KLSAgICAgIGFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQocF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUX0VWVF9UT19CVFVfSENJX1NDTzoKLSAgICAgIGJ0bV9yb3V0ZV9zY29fZGF0YShwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0JUVV9IQ0lfRVZUOgotICAgICAgYnR1X2hjaWZfcHJvY2Vzc19ldmVudCgodWludDhfdCkocF9tc2ctPmV2ZW50ICYgQlRfU1VCX0VWVF9NQVNLKSwgcF9tc2cpOwotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUX0VWVF9UT19CVFVfSENJX0NNRDoKLSAgICAgIGJ0dV9oY2lmX3NlbmRfY21kKCh1aW50OF90KShwX21zZy0+ZXZlbnQgJiBCVF9TVUJfRVZUX01BU0spLCBwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfRVZUX1RPX0JUVV9IQ0lfSVNPOgotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSXNvRGF0YShwX21zZyk7Ci0gICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuICZtYWluX3RocmVhZDsgfQotCi1idF9zdGF0dXNfdCBkb19pbl9tYWluX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaykgewotICBpZiAoIW1haW5fdGhyZWFkLkRvSW5UaHJlYWQoZnJvbV9oZXJlLCBzdGQ6Om1vdmUodGFzaykpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgZnJvbSAiIDw8IGZyb21faGVyZS5Ub1N0cmluZygpOwotICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKLSAgfQotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWJ0X3N0YXR1c190IGRvX2luX21haW5fdGhyZWFkX2RlbGF5ZWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkZWxheSkgewotICBpZiAoIW1haW5fdGhyZWFkLkRvSW5UaHJlYWREZWxheWVkKGZyb21faGVyZSwgc3RkOjptb3ZlKHRhc2spLCBkZWxheSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCBmcm9tICIgPDwgZnJvbV9oZXJlLlRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOwotICB9Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgZG9fcG9zdF9vbl9idF9tYWluKEJ0TWFpbkNsb3N1cmUgY2xvc3VyZSkgeyBjbG9zdXJlKCk7IH0KLQotdm9pZCBwb3N0X29uX2J0X21haW4oQnRNYWluQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gIEFTU0VSVChkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoZG9fcG9zdF9vbl9idF9tYWluLCBzdGQ6Om1vdmUoY2xvc3VyZSkpKSA9PQotICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi12b2lkIG1haW5fdGhyZWFkX3N0YXJ0X3VwKCkgewotICBtYWluX3RocmVhZC5TdGFydFVwKCk7Ci0gIGlmICghbWFpbl90aHJlYWQuSXNSdW5uaW5nKCkpIHsKLSAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fIDw8ICI6IHVuYWJsZSB0byBzdGFydCBidHUgbWVzc2FnZSBsb29wIHRocmVhZC4iOwotICB9Ci0gIGlmICghbWFpbl90aHJlYWQuRW5hYmxlUmVhbFRpbWVTY2hlZHVsaW5nKCkpIHsKLSNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCi0gICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gZW5hYmxlIHJlYWwgdGltZSBzY2hlZHVsaW5nIjsKLSNlbHNlCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiB1bmFibGUgdG8gZW5hYmxlIHJlYWwgdGltZSBzY2hlZHVsaW5nIjsKLSNlbmRpZgotICB9Ci19Ci0KLXZvaWQgbWFpbl90aHJlYWRfc2h1dF9kb3duKCkgeyBtYWluX3RocmVhZC5TaHV0RG93bigpOyB9Ci0KLWJvb2wgaXNfb25fbWFpbl90aHJlYWQoKSB7Ci0gIC8vIFB0aHJlYWRzIGRvZXNuJ3QgaGF2ZSB0aGUgY29uY2VwdCBvZiBhIHRocmVhZCBJRCwgc28gd2UgaGF2ZSB0byByZWFjaCBkb3duCi0gIC8vIGludG8gdGhlIGtlcm5lbC4KLSNpZiBkZWZpbmVkKE9TX01BQ09TWCkKLSAgcmV0dXJuIG1haW5fdGhyZWFkLkdldFRocmVhZElkKCkgPT0gcHRocmVhZF9tYWNoX3RocmVhZF9ucChwdGhyZWFkX3NlbGYoKSk7Ci0jZWxpZiBkZWZpbmVkKE9TX0xJTlVYKQotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+IC8qIEZvciBTWVNfeHh4IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0gIHJldHVybiBtYWluX3RocmVhZC5HZXRUaHJlYWRJZCgpID09IHN5c2NhbGwoX19OUl9nZXR0aWQpOwotI2VsaWYgZGVmaW5lZChPU19BTkRST0lEKQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotICByZXR1cm4gbWFpbl90aHJlYWQuR2V0VGhyZWFkSWQoKSA9PSBnZXR0aWQoKTsKLSNlbHNlCi0gIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIlVuYWJsZSB0byBkZXRlcm1pbmUgaWYgb24gbWFpbiB0aHJlYWQiOwotICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvc3RhY2svY3J5cHRvX3Rvb2xib3gvYWVzLmNjIGIvc3RhY2svY3J5cHRvX3Rvb2xib3gvYWVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTM4OTRlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2NyeXB0b190b29sYm94L2Flcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDk1MCArMCwwIEBACi0vKgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIENvcHlyaWdodCAoYykgMTk5OC0yMDA4LCBCcmlhbiBHbGFkbWFuLCBXb3JjZXN0ZXIsIFVLLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gTElDRU5TRSBURVJNUwotCi0gVGhlIHJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpCi0gaXMgYWxsb3dlZCB3aXRob3V0IHRoZSBwYXltZW50IG9mIGZlZXMgb3Igcm95YWx0aWVzIHByb3ZpZGVkIHRoYXQ6Ci0KLSAgMS4gc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucyBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOwotCi0gIDIuIGJpbmFyeSBkaXN0cmlidXRpb25zIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAotICAgICBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlaXIgZG9jdW1lbnRhdGlvbjsKLQotICAzLiB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCi0gICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSBESVNDTEFJTUVSCi0KLSBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKLSBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKLSBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJc3N1ZSAwOS8wOS8yMDA2Ci0KLSBUaGlzIGlzIGFuIEFFUyBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgb25seSA4LWJpdCBieXRlIG9wZXJhdGlvbnMgb24gdGhlCi0gY2lwaGVyIHN0YXRlICh0aGVyZSBhcmUgb3B0aW9ucyB0byB1c2UgMzItYml0IHR5cGVzIGlmIGF2YWlsYWJsZSkuCi0KLSBUaGUgY29tYmluYXRpb24gb2YgbWl4IGNvbHVtbnMgYW5kIGJ5dGUgc3Vic3RpdHV0aW9uIHVzZWQgaGVyZSBpcyBiYXNlZCBvbgotIHRoYXQgZGV2ZWxvcGVkIGJ5IEthcmwgTWFsYnJhaW4uIEhpcyBjb250cmlidXRpb24gaXMgYWNrbm93bGVkZ2VkLgotICovCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIGZhc3QgbWVtY3B5IGZ1bmN0aW9uIG9uIHlvdXIgc3lzdGVtICovCi0jaWYgMQotI2RlZmluZSBIQVZFX01FTUNQWQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmIDAKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPGludHJpbi5oPgotI3ByYWdtYSBpbnRyaW5zaWMobWVtY3B5KQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBmYXN0IDMyLWJpdCB0eXBlcyBvbiB5b3VyIHN5c3RlbSAqLwotI2lmIDEKLSNkZWZpbmUgSEFWRV9VSU5UXzMyVAotI2VuZGlmCi0KLS8qIGRlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCBhbnkgdGFibGVzICovCi0jaWYgMQotI2RlZmluZSBVU0VfVEFCTEVTCi0jZW5kaWYKLQotLyogIE9uIEludGVsIENvcmUgMiBkdW8gVkVSU0lPTl8xIGlzIGZhc3RlciAqLwotCi0vKiBhbHRlcm5hdGl2ZSB2ZXJzaW9ucyAodGVzdCBmb3IgcGVyZm9ybWFuY2Ugb24geW91ciBzeXN0ZW0pICovCi0jaWYgMQotI2RlZmluZSBWRVJTSU9OXzEKLSNlbmRpZgotCi0jaW5jbHVkZSAiYWVzLmgiCi0KLSNpZiBkZWZpbmVkKEhBVkVfVUlOVF8zMlQpCi10eXBlZGVmIHVpbnQzMl90IHVpbnRfMzJ0OwotI2VuZGlmCi0KLS8qIGZ1bmN0aW9ucyBmb3IgZmluaXRlIGZpZWxkIG11bHRpcGxpY2F0aW9uIGluIHRoZSBBRVMgR2Fsb2lzIGZpZWxkICAgICovCi0KLSNkZWZpbmUgV1BPTFkgMHgwMTFiCi0jZGVmaW5lIEJQT0xZIDB4MWIKLSNkZWZpbmUgRFBPTFkgMHgwMDhkCi0KLSNkZWZpbmUgZjEoeCkgKHgpCi0jZGVmaW5lIGYyKHgpICgoKHgpIDw8IDEpIF4gKCgoKHgpID4+IDcpICYgMSkgKiBXUE9MWSkpCi0jZGVmaW5lIGY0KHgpIFwKLSAgKCgoeCkgPDwgMikgXiAoKCgoeCkgPj4gNikgJiAxKSAqIFdQT0xZKSBeICgoKCh4KSA+PiA2KSAmIDIpICogV1BPTFkpKQotI2RlZmluZSBmOCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoKHgpIDw8IDMpIF4gKCgoKHgpID4+IDUpICYgMSkgKiBXUE9MWSkgXiAoKCgoeCkgPj4gNSkgJiAyKSAqIFdQT0xZKSBeIFwKLSAgICgoKCh4KSA+PiA1KSAmIDQpICogV1BPTFkpKQotI2RlZmluZSBkMih4KSAoKCh4KSA+PiAxKSBeICgoeCkmMSA/IERQT0xZIDogMCkpCi0KLSNkZWZpbmUgZjMoeCkgKGYyKHgpIF4gKHgpKQotI2RlZmluZSBmOSh4KSAoZjgoeCkgXiAoeCkpCi0jZGVmaW5lIGZiKHgpIChmOCh4KSBeIGYyKHgpIF4gKHgpKQotI2RlZmluZSBmZCh4KSAoZjgoeCkgXiBmNCh4KSBeICh4KSkKLSNkZWZpbmUgZmUoeCkgKGY4KHgpIF4gZjQoeCkgXiBmMih4KSkKLQotI2lmIGRlZmluZWQoVVNFX1RBQkxFUykKLQotI2RlZmluZSBzYl9kYXRhKHcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAvKiBTIEJveCBkYXRhIHZhbHVlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdygweDYzKSwgdygweDdjKSwgdygweDc3KSwgdygweDdiKSwgdygweGYyKSwgdygweDZiKSwgdygweDZmKSwgdygweGM1KSwgXAotICAgICAgICB3KDB4MzApLCB3KDB4MDEpLCB3KDB4NjcpLCB3KDB4MmIpLCB3KDB4ZmUpLCB3KDB4ZDcpLCB3KDB4YWIpLCAgICAgIFwKLSAgICAgICAgdygweDc2KSwgdygweGNhKSwgdygweDgyKSwgdygweGM5KSwgdygweDdkKSwgdygweGZhKSwgdygweDU5KSwgICAgICBcCi0gICAgICAgIHcoMHg0NyksIHcoMHhmMCksIHcoMHhhZCksIHcoMHhkNCksIHcoMHhhMiksIHcoMHhhZiksIHcoMHg5YyksICAgICAgXAotICAgICAgICB3KDB4YTQpLCB3KDB4NzIpLCB3KDB4YzApLCB3KDB4YjcpLCB3KDB4ZmQpLCB3KDB4OTMpLCB3KDB4MjYpLCAgICAgIFwKLSAgICAgICAgdygweDM2KSwgdygweDNmKSwgdygweGY3KSwgdygweGNjKSwgdygweDM0KSwgdygweGE1KSwgdygweGU1KSwgICAgICBcCi0gICAgICAgIHcoMHhmMSksIHcoMHg3MSksIHcoMHhkOCksIHcoMHgzMSksIHcoMHgxNSksIHcoMHgwNCksIHcoMHhjNyksICAgICAgXAotICAgICAgICB3KDB4MjMpLCB3KDB4YzMpLCB3KDB4MTgpLCB3KDB4OTYpLCB3KDB4MDUpLCB3KDB4OWEpLCB3KDB4MDcpLCAgICAgIFwKLSAgICAgICAgdygweDEyKSwgdygweDgwKSwgdygweGUyKSwgdygweGViKSwgdygweDI3KSwgdygweGIyKSwgdygweDc1KSwgICAgICBcCi0gICAgICAgIHcoMHgwOSksIHcoMHg4MyksIHcoMHgyYyksIHcoMHgxYSksIHcoMHgxYiksIHcoMHg2ZSksIHcoMHg1YSksICAgICAgXAotICAgICAgICB3KDB4YTApLCB3KDB4NTIpLCB3KDB4M2IpLCB3KDB4ZDYpLCB3KDB4YjMpLCB3KDB4MjkpLCB3KDB4ZTMpLCAgICAgIFwKLSAgICAgICAgdygweDJmKSwgdygweDg0KSwgdygweDUzKSwgdygweGQxKSwgdygweDAwKSwgdygweGVkKSwgdygweDIwKSwgICAgICBcCi0gICAgICAgIHcoMHhmYyksIHcoMHhiMSksIHcoMHg1YiksIHcoMHg2YSksIHcoMHhjYiksIHcoMHhiZSksIHcoMHgzOSksICAgICAgXAotICAgICAgICB3KDB4NGEpLCB3KDB4NGMpLCB3KDB4NTgpLCB3KDB4Y2YpLCB3KDB4ZDApLCB3KDB4ZWYpLCB3KDB4YWEpLCAgICAgIFwKLSAgICAgICAgdygweGZiKSwgdygweDQzKSwgdygweDRkKSwgdygweDMzKSwgdygweDg1KSwgdygweDQ1KSwgdygweGY5KSwgICAgICBcCi0gICAgICAgIHcoMHgwMiksIHcoMHg3ZiksIHcoMHg1MCksIHcoMHgzYyksIHcoMHg5ZiksIHcoMHhhOCksIHcoMHg1MSksICAgICAgXAotICAgICAgICB3KDB4YTMpLCB3KDB4NDApLCB3KDB4OGYpLCB3KDB4OTIpLCB3KDB4OWQpLCB3KDB4MzgpLCB3KDB4ZjUpLCAgICAgIFwKLSAgICAgICAgdygweGJjKSwgdygweGI2KSwgdygweGRhKSwgdygweDIxKSwgdygweDEwKSwgdygweGZmKSwgdygweGYzKSwgICAgICBcCi0gICAgICAgIHcoMHhkMiksIHcoMHhjZCksIHcoMHgwYyksIHcoMHgxMyksIHcoMHhlYyksIHcoMHg1ZiksIHcoMHg5NyksICAgICAgXAotICAgICAgICB3KDB4NDQpLCB3KDB4MTcpLCB3KDB4YzQpLCB3KDB4YTcpLCB3KDB4N2UpLCB3KDB4M2QpLCB3KDB4NjQpLCAgICAgIFwKLSAgICAgICAgdygweDVkKSwgdygweDE5KSwgdygweDczKSwgdygweDYwKSwgdygweDgxKSwgdygweDRmKSwgdygweGRjKSwgICAgICBcCi0gICAgICAgIHcoMHgyMiksIHcoMHgyYSksIHcoMHg5MCksIHcoMHg4OCksIHcoMHg0NiksIHcoMHhlZSksIHcoMHhiOCksICAgICAgXAotICAgICAgICB3KDB4MTQpLCB3KDB4ZGUpLCB3KDB4NWUpLCB3KDB4MGIpLCB3KDB4ZGIpLCB3KDB4ZTApLCB3KDB4MzIpLCAgICAgIFwKLSAgICAgICAgdygweDNhKSwgdygweDBhKSwgdygweDQ5KSwgdygweDA2KSwgdygweDI0KSwgdygweDVjKSwgdygweGMyKSwgICAgICBcCi0gICAgICAgIHcoMHhkMyksIHcoMHhhYyksIHcoMHg2MiksIHcoMHg5MSksIHcoMHg5NSksIHcoMHhlNCksIHcoMHg3OSksICAgICAgXAotICAgICAgICB3KDB4ZTcpLCB3KDB4YzgpLCB3KDB4MzcpLCB3KDB4NmQpLCB3KDB4OGQpLCB3KDB4ZDUpLCB3KDB4NGUpLCAgICAgIFwKLSAgICAgICAgdygweGE5KSwgdygweDZjKSwgdygweDU2KSwgdygweGY0KSwgdygweGVhKSwgdygweDY1KSwgdygweDdhKSwgICAgICBcCi0gICAgICAgIHcoMHhhZSksIHcoMHgwOCksIHcoMHhiYSksIHcoMHg3OCksIHcoMHgyNSksIHcoMHgyZSksIHcoMHgxYyksICAgICAgXAotICAgICAgICB3KDB4YTYpLCB3KDB4YjQpLCB3KDB4YzYpLCB3KDB4ZTgpLCB3KDB4ZGQpLCB3KDB4NzQpLCB3KDB4MWYpLCAgICAgIFwKLSAgICAgICAgdygweDRiKSwgdygweGJkKSwgdygweDhiKSwgdygweDhhKSwgdygweDcwKSwgdygweDNlKSwgdygweGI1KSwgICAgICBcCi0gICAgICAgIHcoMHg2NiksIHcoMHg0OCksIHcoMHgwMyksIHcoMHhmNiksIHcoMHgwZSksIHcoMHg2MSksIHcoMHgzNSksICAgICAgXAotICAgICAgICB3KDB4NTcpLCB3KDB4YjkpLCB3KDB4ODYpLCB3KDB4YzEpLCB3KDB4MWQpLCB3KDB4OWUpLCB3KDB4ZTEpLCAgICAgIFwKLSAgICAgICAgdygweGY4KSwgdygweDk4KSwgdygweDExKSwgdygweDY5KSwgdygweGQ5KSwgdygweDhlKSwgdygweDk0KSwgICAgICBcCi0gICAgICAgIHcoMHg5YiksIHcoMHgxZSksIHcoMHg4NyksIHcoMHhlOSksIHcoMHhjZSksIHcoMHg1NSksIHcoMHgyOCksICAgICAgXAotICAgICAgICB3KDB4ZGYpLCB3KDB4OGMpLCB3KDB4YTEpLCB3KDB4ODkpLCB3KDB4MGQpLCB3KDB4YmYpLCB3KDB4ZTYpLCAgICAgIFwKLSAgICAgICAgdygweDQyKSwgdygweDY4KSwgdygweDQxKSwgdygweDk5KSwgdygweDJkKSwgdygweDBmKSwgdygweGIwKSwgICAgICBcCi0gICAgICAgIHcoMHg1NCksIHcoMHhiYiksIHcoMHgxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgaXNiX2RhdGEodykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgLyogaW52ZXJzZSBTIEJveCBkYXRhIHZhbHVlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHcoMHg1MiksIHcoMHgwOSksIHcoMHg2YSksIHcoMHhkNSksIHcoMHgzMCksIHcoMHgzNiksIHcoMHhhNSksIHcoMHgzOCksIFwKLSAgICAgICAgdygweGJmKSwgdygweDQwKSwgdygweGEzKSwgdygweDllKSwgdygweDgxKSwgdygweGYzKSwgdygweGQ3KSwgICAgICBcCi0gICAgICAgIHcoMHhmYiksIHcoMHg3YyksIHcoMHhlMyksIHcoMHgzOSksIHcoMHg4MiksIHcoMHg5YiksIHcoMHgyZiksICAgICAgXAotICAgICAgICB3KDB4ZmYpLCB3KDB4ODcpLCB3KDB4MzQpLCB3KDB4OGUpLCB3KDB4NDMpLCB3KDB4NDQpLCB3KDB4YzQpLCAgICAgIFwKLSAgICAgICAgdygweGRlKSwgdygweGU5KSwgdygweGNiKSwgdygweDU0KSwgdygweDdiKSwgdygweDk0KSwgdygweDMyKSwgICAgICBcCi0gICAgICAgIHcoMHhhNiksIHcoMHhjMiksIHcoMHgyMyksIHcoMHgzZCksIHcoMHhlZSksIHcoMHg0YyksIHcoMHg5NSksICAgICAgXAotICAgICAgICB3KDB4MGIpLCB3KDB4NDIpLCB3KDB4ZmEpLCB3KDB4YzMpLCB3KDB4NGUpLCB3KDB4MDgpLCB3KDB4MmUpLCAgICAgIFwKLSAgICAgICAgdygweGExKSwgdygweDY2KSwgdygweDI4KSwgdygweGQ5KSwgdygweDI0KSwgdygweGIyKSwgdygweDc2KSwgICAgICBcCi0gICAgICAgIHcoMHg1YiksIHcoMHhhMiksIHcoMHg0OSksIHcoMHg2ZCksIHcoMHg4YiksIHcoMHhkMSksIHcoMHgyNSksICAgICAgXAotICAgICAgICB3KDB4NzIpLCB3KDB4ZjgpLCB3KDB4ZjYpLCB3KDB4NjQpLCB3KDB4ODYpLCB3KDB4NjgpLCB3KDB4OTgpLCAgICAgIFwKLSAgICAgICAgdygweDE2KSwgdygweGQ0KSwgdygweGE0KSwgdygweDVjKSwgdygweGNjKSwgdygweDVkKSwgdygweDY1KSwgICAgICBcCi0gICAgICAgIHcoMHhiNiksIHcoMHg5MiksIHcoMHg2YyksIHcoMHg3MCksIHcoMHg0OCksIHcoMHg1MCksIHcoMHhmZCksICAgICAgXAotICAgICAgICB3KDB4ZWQpLCB3KDB4YjkpLCB3KDB4ZGEpLCB3KDB4NWUpLCB3KDB4MTUpLCB3KDB4NDYpLCB3KDB4NTcpLCAgICAgIFwKLSAgICAgICAgdygweGE3KSwgdygweDhkKSwgdygweDlkKSwgdygweDg0KSwgdygweDkwKSwgdygweGQ4KSwgdygweGFiKSwgICAgICBcCi0gICAgICAgIHcoMHgwMCksIHcoMHg4YyksIHcoMHhiYyksIHcoMHhkMyksIHcoMHgwYSksIHcoMHhmNyksIHcoMHhlNCksICAgICAgXAotICAgICAgICB3KDB4NTgpLCB3KDB4MDUpLCB3KDB4YjgpLCB3KDB4YjMpLCB3KDB4NDUpLCB3KDB4MDYpLCB3KDB4ZDApLCAgICAgIFwKLSAgICAgICAgdygweDJjKSwgdygweDFlKSwgdygweDhmKSwgdygweGNhKSwgdygweDNmKSwgdygweDBmKSwgdygweDAyKSwgICAgICBcCi0gICAgICAgIHcoMHhjMSksIHcoMHhhZiksIHcoMHhiZCksIHcoMHgwMyksIHcoMHgwMSksIHcoMHgxMyksIHcoMHg4YSksICAgICAgXAotICAgICAgICB3KDB4NmIpLCB3KDB4M2EpLCB3KDB4OTEpLCB3KDB4MTEpLCB3KDB4NDEpLCB3KDB4NGYpLCB3KDB4NjcpLCAgICAgIFwKLSAgICAgICAgdygweGRjKSwgdygweGVhKSwgdygweDk3KSwgdygweGYyKSwgdygweGNmKSwgdygweGNlKSwgdygweGYwKSwgICAgICBcCi0gICAgICAgIHcoMHhiNCksIHcoMHhlNiksIHcoMHg3MyksIHcoMHg5NiksIHcoMHhhYyksIHcoMHg3NCksIHcoMHgyMiksICAgICAgXAotICAgICAgICB3KDB4ZTcpLCB3KDB4YWQpLCB3KDB4MzUpLCB3KDB4ODUpLCB3KDB4ZTIpLCB3KDB4ZjkpLCB3KDB4MzcpLCAgICAgIFwKLSAgICAgICAgdygweGU4KSwgdygweDFjKSwgdygweDc1KSwgdygweGRmKSwgdygweDZlKSwgdygweDQ3KSwgdygweGYxKSwgICAgICBcCi0gICAgICAgIHcoMHgxYSksIHcoMHg3MSksIHcoMHgxZCksIHcoMHgyOSksIHcoMHhjNSksIHcoMHg4OSksIHcoMHg2ZiksICAgICAgXAotICAgICAgICB3KDB4YjcpLCB3KDB4NjIpLCB3KDB4MGUpLCB3KDB4YWEpLCB3KDB4MTgpLCB3KDB4YmUpLCB3KDB4MWIpLCAgICAgIFwKLSAgICAgICAgdygweGZjKSwgdygweDU2KSwgdygweDNlKSwgdygweDRiKSwgdygweGM2KSwgdygweGQyKSwgdygweDc5KSwgICAgICBcCi0gICAgICAgIHcoMHgyMCksIHcoMHg5YSksIHcoMHhkYiksIHcoMHhjMCksIHcoMHhmZSksIHcoMHg3OCksIHcoMHhjZCksICAgICAgXAotICAgICAgICB3KDB4NWEpLCB3KDB4ZjQpLCB3KDB4MWYpLCB3KDB4ZGQpLCB3KDB4YTgpLCB3KDB4MzMpLCB3KDB4ODgpLCAgICAgIFwKLSAgICAgICAgdygweDA3KSwgdygweGM3KSwgdygweDMxKSwgdygweGIxKSwgdygweDEyKSwgdygweDEwKSwgdygweDU5KSwgICAgICBcCi0gICAgICAgIHcoMHgyNyksIHcoMHg4MCksIHcoMHhlYyksIHcoMHg1ZiksIHcoMHg2MCksIHcoMHg1MSksIHcoMHg3ZiksICAgICAgXAotICAgICAgICB3KDB4YTkpLCB3KDB4MTkpLCB3KDB4YjUpLCB3KDB4NGEpLCB3KDB4MGQpLCB3KDB4MmQpLCB3KDB4ZTUpLCAgICAgIFwKLSAgICAgICAgdygweDdhKSwgdygweDlmKSwgdygweDkzKSwgdygweGM5KSwgdygweDljKSwgdygweGVmKSwgdygweGEwKSwgICAgICBcCi0gICAgICAgIHcoMHhlMCksIHcoMHgzYiksIHcoMHg0ZCksIHcoMHhhZSksIHcoMHgyYSksIHcoMHhmNSksIHcoMHhiMCksICAgICAgXAotICAgICAgICB3KDB4YzgpLCB3KDB4ZWIpLCB3KDB4YmIpLCB3KDB4M2MpLCB3KDB4ODMpLCB3KDB4NTMpLCB3KDB4OTkpLCAgICAgIFwKLSAgICAgICAgdygweDYxKSwgdygweDE3KSwgdygweDJiKSwgdygweDA0KSwgdygweDdlKSwgdygweGJhKSwgdygweDc3KSwgICAgICBcCi0gICAgICAgIHcoMHhkNiksIHcoMHgyNiksIHcoMHhlMSksIHcoMHg2OSksIHcoMHgxNCksIHcoMHg2MyksIHcoMHg1NSksICAgICAgXAotICAgICAgICB3KDB4MjEpLCB3KDB4MGMpLCB3KDB4N2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIG1tX2RhdGEodykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7IC8qIGJhc2ljIGRhdGEgZm9yIGZvcm1pbmcgZmluaXRlIGZpZWxkIHRhYmxlcyAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3KDB4MDApLCB3KDB4MDEpLCB3KDB4MDIpLCB3KDB4MDMpLCB3KDB4MDQpLCB3KDB4MDUpLCB3KDB4MDYpLCB3KDB4MDcpLCBcCi0gICAgICAgIHcoMHgwOCksIHcoMHgwOSksIHcoMHgwYSksIHcoMHgwYiksIHcoMHgwYyksIHcoMHgwZCksIHcoMHgwZSksICAgICAgXAotICAgICAgICB3KDB4MGYpLCB3KDB4MTApLCB3KDB4MTEpLCB3KDB4MTIpLCB3KDB4MTMpLCB3KDB4MTQpLCB3KDB4MTUpLCAgICAgIFwKLSAgICAgICAgdygweDE2KSwgdygweDE3KSwgdygweDE4KSwgdygweDE5KSwgdygweDFhKSwgdygweDFiKSwgdygweDFjKSwgICAgICBcCi0gICAgICAgIHcoMHgxZCksIHcoMHgxZSksIHcoMHgxZiksIHcoMHgyMCksIHcoMHgyMSksIHcoMHgyMiksIHcoMHgyMyksICAgICAgXAotICAgICAgICB3KDB4MjQpLCB3KDB4MjUpLCB3KDB4MjYpLCB3KDB4MjcpLCB3KDB4MjgpLCB3KDB4MjkpLCB3KDB4MmEpLCAgICAgIFwKLSAgICAgICAgdygweDJiKSwgdygweDJjKSwgdygweDJkKSwgdygweDJlKSwgdygweDJmKSwgdygweDMwKSwgdygweDMxKSwgICAgICBcCi0gICAgICAgIHcoMHgzMiksIHcoMHgzMyksIHcoMHgzNCksIHcoMHgzNSksIHcoMHgzNiksIHcoMHgzNyksIHcoMHgzOCksICAgICAgXAotICAgICAgICB3KDB4MzkpLCB3KDB4M2EpLCB3KDB4M2IpLCB3KDB4M2MpLCB3KDB4M2QpLCB3KDB4M2UpLCB3KDB4M2YpLCAgICAgIFwKLSAgICAgICAgdygweDQwKSwgdygweDQxKSwgdygweDQyKSwgdygweDQzKSwgdygweDQ0KSwgdygweDQ1KSwgdygweDQ2KSwgICAgICBcCi0gICAgICAgIHcoMHg0NyksIHcoMHg0OCksIHcoMHg0OSksIHcoMHg0YSksIHcoMHg0YiksIHcoMHg0YyksIHcoMHg0ZCksICAgICAgXAotICAgICAgICB3KDB4NGUpLCB3KDB4NGYpLCB3KDB4NTApLCB3KDB4NTEpLCB3KDB4NTIpLCB3KDB4NTMpLCB3KDB4NTQpLCAgICAgIFwKLSAgICAgICAgdygweDU1KSwgdygweDU2KSwgdygweDU3KSwgdygweDU4KSwgdygweDU5KSwgdygweDVhKSwgdygweDViKSwgICAgICBcCi0gICAgICAgIHcoMHg1YyksIHcoMHg1ZCksIHcoMHg1ZSksIHcoMHg1ZiksIHcoMHg2MCksIHcoMHg2MSksIHcoMHg2MiksICAgICAgXAotICAgICAgICB3KDB4NjMpLCB3KDB4NjQpLCB3KDB4NjUpLCB3KDB4NjYpLCB3KDB4NjcpLCB3KDB4NjgpLCB3KDB4NjkpLCAgICAgIFwKLSAgICAgICAgdygweDZhKSwgdygweDZiKSwgdygweDZjKSwgdygweDZkKSwgdygweDZlKSwgdygweDZmKSwgdygweDcwKSwgICAgICBcCi0gICAgICAgIHcoMHg3MSksIHcoMHg3MiksIHcoMHg3MyksIHcoMHg3NCksIHcoMHg3NSksIHcoMHg3NiksIHcoMHg3NyksICAgICAgXAotICAgICAgICB3KDB4NzgpLCB3KDB4NzkpLCB3KDB4N2EpLCB3KDB4N2IpLCB3KDB4N2MpLCB3KDB4N2QpLCB3KDB4N2UpLCAgICAgIFwKLSAgICAgICAgdygweDdmKSwgdygweDgwKSwgdygweDgxKSwgdygweDgyKSwgdygweDgzKSwgdygweDg0KSwgdygweDg1KSwgICAgICBcCi0gICAgICAgIHcoMHg4NiksIHcoMHg4NyksIHcoMHg4OCksIHcoMHg4OSksIHcoMHg4YSksIHcoMHg4YiksIHcoMHg4YyksICAgICAgXAotICAgICAgICB3KDB4OGQpLCB3KDB4OGUpLCB3KDB4OGYpLCB3KDB4OTApLCB3KDB4OTEpLCB3KDB4OTIpLCB3KDB4OTMpLCAgICAgIFwKLSAgICAgICAgdygweDk0KSwgdygweDk1KSwgdygweDk2KSwgdygweDk3KSwgdygweDk4KSwgdygweDk5KSwgdygweDlhKSwgICAgICBcCi0gICAgICAgIHcoMHg5YiksIHcoMHg5YyksIHcoMHg5ZCksIHcoMHg5ZSksIHcoMHg5ZiksIHcoMHhhMCksIHcoMHhhMSksICAgICAgXAotICAgICAgICB3KDB4YTIpLCB3KDB4YTMpLCB3KDB4YTQpLCB3KDB4YTUpLCB3KDB4YTYpLCB3KDB4YTcpLCB3KDB4YTgpLCAgICAgIFwKLSAgICAgICAgdygweGE5KSwgdygweGFhKSwgdygweGFiKSwgdygweGFjKSwgdygweGFkKSwgdygweGFlKSwgdygweGFmKSwgICAgICBcCi0gICAgICAgIHcoMHhiMCksIHcoMHhiMSksIHcoMHhiMiksIHcoMHhiMyksIHcoMHhiNCksIHcoMHhiNSksIHcoMHhiNiksICAgICAgXAotICAgICAgICB3KDB4YjcpLCB3KDB4YjgpLCB3KDB4YjkpLCB3KDB4YmEpLCB3KDB4YmIpLCB3KDB4YmMpLCB3KDB4YmQpLCAgICAgIFwKLSAgICAgICAgdygweGJlKSwgdygweGJmKSwgdygweGMwKSwgdygweGMxKSwgdygweGMyKSwgdygweGMzKSwgdygweGM0KSwgICAgICBcCi0gICAgICAgIHcoMHhjNSksIHcoMHhjNiksIHcoMHhjNyksIHcoMHhjOCksIHcoMHhjOSksIHcoMHhjYSksIHcoMHhjYiksICAgICAgXAotICAgICAgICB3KDB4Y2MpLCB3KDB4Y2QpLCB3KDB4Y2UpLCB3KDB4Y2YpLCB3KDB4ZDApLCB3KDB4ZDEpLCB3KDB4ZDIpLCAgICAgIFwKLSAgICAgICAgdygweGQzKSwgdygweGQ0KSwgdygweGQ1KSwgdygweGQ2KSwgdygweGQ3KSwgdygweGQ4KSwgdygweGQ5KSwgICAgICBcCi0gICAgICAgIHcoMHhkYSksIHcoMHhkYiksIHcoMHhkYyksIHcoMHhkZCksIHcoMHhkZSksIHcoMHhkZiksIHcoMHhlMCksICAgICAgXAotICAgICAgICB3KDB4ZTEpLCB3KDB4ZTIpLCB3KDB4ZTMpLCB3KDB4ZTQpLCB3KDB4ZTUpLCB3KDB4ZTYpLCB3KDB4ZTcpLCAgICAgIFwKLSAgICAgICAgdygweGU4KSwgdygweGU5KSwgdygweGVhKSwgdygweGViKSwgdygweGVjKSwgdygweGVkKSwgdygweGVlKSwgICAgICBcCi0gICAgICAgIHcoMHhlZiksIHcoMHhmMCksIHcoMHhmMSksIHcoMHhmMiksIHcoMHhmMyksIHcoMHhmNCksIHcoMHhmNSksICAgICAgXAotICAgICAgICB3KDB4ZjYpLCB3KDB4ZjcpLCB3KDB4ZjgpLCB3KDB4ZjkpLCB3KDB4ZmEpLCB3KDB4ZmIpLCB3KDB4ZmMpLCAgICAgIFwKLSAgICAgICAgdygweGZkKSwgdygweGZlKSwgdygweGZmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotc3RhdGljIGNvbnN0IHVpbnRfOHQgc2JveFsyNTZdID0gc2JfZGF0YShmMSk7Ci1zdGF0aWMgY29uc3QgdWludF84dCBpc2JveFsyNTZdID0gaXNiX2RhdGEoZjEpOwotCi1zdGF0aWMgY29uc3QgdWludF84dCBnZm0yX3Nib3hbMjU2XSA9IHNiX2RhdGEoZjIpOwotc3RhdGljIGNvbnN0IHVpbnRfOHQgZ2ZtM19zYm94WzI1Nl0gPSBzYl9kYXRhKGYzKTsKLQotc3RhdGljIGNvbnN0IHVpbnRfOHQgZ2ZtdWxfOVsyNTZdID0gbW1fZGF0YShmOSk7Ci1zdGF0aWMgY29uc3QgdWludF84dCBnZm11bF9iWzI1Nl0gPSBtbV9kYXRhKGZiKTsKLXN0YXRpYyBjb25zdCB1aW50Xzh0IGdmbXVsX2RbMjU2XSA9IG1tX2RhdGEoZmQpOwotc3RhdGljIGNvbnN0IHVpbnRfOHQgZ2ZtdWxfZVsyNTZdID0gbW1fZGF0YShmZSk7Ci0KLSNkZWZpbmUgc19ib3goeCkgc2JveFsoeCldCi0jZGVmaW5lIGlzX2JveCh4KSBpc2JveFsoeCldCi0jZGVmaW5lIGdmbTJfc2IoeCkgZ2ZtMl9zYm94Wyh4KV0KLSNkZWZpbmUgZ2ZtM19zYih4KSBnZm0zX3Nib3hbKHgpXQotI2RlZmluZSBnZm1fOSh4KSBnZm11bF85Wyh4KV0KLSNkZWZpbmUgZ2ZtX2IoeCkgZ2ZtdWxfYlsoeCldCi0jZGVmaW5lIGdmbV9kKHgpIGdmbXVsX2RbKHgpXQotI2RlZmluZSBnZm1fZSh4KSBnZm11bF9lWyh4KV0KLQotI2Vsc2UKLQotLyogdGhpcyBpcyB0aGUgaGlnaCBiaXQgb2YgeCByaWdodCBzaGlmdGVkIGJ5IDEgKi8KLS8qIHBvc2l0aW9uLiBTaW5jZSB0aGUgc3RhcnRpbmcgcG9seW5vbWlhbCBoYXMgICovCi0vKiA5IGJpdHMgKDB4MTFiKSwgdGhpcyByaWdodCBzaGlmdCBrZWVwcyB0aGUgICAqLwotLyogdmFsdWVzIG9mIGFsbCB0b3AgYml0cyB3aXRoaW4gYSBieXRlICAgICAgICAgKi8KLQotc3RhdGljIHVpbnRfOHQgaGliaXQoY29uc3QgdWludF84dCB4KSB7Ci0gIHVpbnRfOHQgciA9ICh1aW50Xzh0KSgoeCA+PiAxKSB8ICh4ID4+IDIpKTsKLQotICByIHw9IChyID4+IDIpOwotICByIHw9IChyID4+IDQpOwotICByZXR1cm4gKHIgKyAxKSA+PiAxOwotfQotCi0vKiByZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhlIGZpbml0ZSBmaWVsZCBlbGVtZW50IHggKi8KLQotc3RhdGljIHVpbnRfOHQgZ2ZfaW52KGNvbnN0IHVpbnRfOHQgeCkgewotICB1aW50Xzh0IHAxID0geCwgcDIgPSBCUE9MWSwgbjEgPSBoaWJpdCh4KSwgbjIgPSAweDgwLCB2MSA9IDEsIHYyID0gMDsKLQotICBpZiAoeCA8IDIpIHJldHVybiB4OwotCi0gIGZvciAoOzspIHsKLSAgICBpZiAobjEpCi0gICAgICB3aGlsZSAobjIgPj0gbjEpIC8qIGRpdmlkZSBwb2x5bm9taWFsIHAyIGJ5IHAxICAgICovCi0gICAgICB7Ci0gICAgICAgIG4yIC89IG4xOyAgICAgICAgICAgICAgIC8qIHNoaWZ0IHNtYWxsZXIgcG9seW5vbWlhbCBsZWZ0ICovCi0gICAgICAgIHAyIF49IChwMSAqIG4yKSAmIDB4ZmY7IC8qIGFuZCByZW1vdmUgZnJvbSBsYXJnZXIgb25lICAgICovCi0gICAgICAgIHYyIF49ICh2MSAqIG4yKTsgICAgICAgIC8qIHNoaWZ0IGFjY3VtdWxhdGVkIHZhbHVlIGFuZCAgICovCi0gICAgICAgIG4yID0gaGliaXQocDIpOyAgICAgICAgIC8qIGFkZCBpbnRvIHJlc3VsdCAgICAgICAgICAgICAgICovCi0gICAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHYxOwotCi0gICAgaWYgKG4yKSAvKiByZXBlYXQgd2l0aCB2YWx1ZXMgc3dhcHBlZCAgICAqLwotICAgICAgd2hpbGUgKG4xID49IG4yKSB7Ci0gICAgICAgIG4xIC89IG4yOwotICAgICAgICBwMSBePSBwMiAqIG4xOwotICAgICAgICB2MSBePSB2MiAqIG4xOwotICAgICAgICBuMSA9IGhpYml0KHAxKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gdjI7Ci0gIH0KLX0KLQotLyogVGhlIGZvcndhcmQgYW5kIGludmVyc2UgYWZmaW5lIHRyYW5zZm9ybWF0aW9ucyB1c2VkIGluIHRoZSBTLWJveCAqLwotdWludF84dCBmd2RfYWZmaW5lKGNvbnN0IHVpbnRfOHQgeCkgewotI2lmIGRlZmluZWQoSEFWRV9VSU5UXzMyVCkKLSAgdWludF8zMnQgdyA9IHg7Ci0gIHcgXj0gKHcgPDwgMSkgXiAodyA8PCAyKSBeICh3IDw8IDMpIF4gKHcgPDwgNCk7Ci0gIHJldHVybiAweDYzIF4gKCh3IF4gKHcgPj4gOCkpICYgMHhmZik7Ci0jZWxzZQotICByZXR1cm4gMHg2MyBeIHggXiAoeCA8PCAxKSBeICh4IDw8IDIpIF4gKHggPDwgMykgXiAoeCA8PCA0KSBeICh4ID4+IDcpIF4KLSAgICAgICAgICh4ID4+IDYpIF4gKHggPj4gNSkgXiAoeCA+PiA0KTsKLSNlbmRpZgotfQotCi11aW50Xzh0IGludl9hZmZpbmUoY29uc3QgdWludF84dCB4KSB7Ci0jaWYgZGVmaW5lZChIQVZFX1VJTlRfMzJUKQotICB1aW50XzMydCB3ID0geDsKLSAgdyA9ICh3IDw8IDEpIF4gKHcgPDwgMykgXiAodyA8PCA2KTsKLSAgcmV0dXJuIDB4MDUgXiAoKHcgXiAodyA+PiA4KSkgJiAweGZmKTsKLSNlbHNlCi0gIHJldHVybiAweDA1IF4gKHggPDwgMSkgXiAoeCA8PCAzKSBeICh4IDw8IDYpIF4gKHggPj4gNykgXiAoeCA+PiA1KSBeICh4ID4+IDIpOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgc19ib3goeCkgZndkX2FmZmluZShnZl9pbnYoeCkpCi0jZGVmaW5lIGlzX2JveCh4KSBnZl9pbnYoaW52X2FmZmluZSh4KSkKLSNkZWZpbmUgZ2ZtMl9zYih4KSBmMihzX2JveCh4KSkKLSNkZWZpbmUgZ2ZtM19zYih4KSBmMyhzX2JveCh4KSkKLSNkZWZpbmUgZ2ZtXzkoeCkgZjkoeCkKLSNkZWZpbmUgZ2ZtX2IoeCkgZmIoeCkKLSNkZWZpbmUgZ2ZtX2QoeCkgZmQoeCkKLSNkZWZpbmUgZ2ZtX2UoeCkgZmUoeCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfTUVNQ1BZKQotI2RlZmluZSBibG9ja19jb3B5X25uKGQsIHMsIGwpIG1lbWNweShkLCBzLCBsKQotI2RlZmluZSBibG9ja19jb3B5KGQsIHMpIG1lbWNweShkLCBzLCBOX0JMT0NLKQotI2Vsc2UKLSNkZWZpbmUgYmxvY2tfY29weV9ubihkLCBzLCBsKSBjb3B5X2Jsb2NrX25uKGQsIHMsIGwpCi0jZGVmaW5lIGJsb2NrX2NvcHkoZCwgcykgY29weV9ibG9jayhkLCBzKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChIQVZFX01FTUNQWSkKLXN0YXRpYyB2b2lkIGNvcHlfYmxvY2sodm9pZCogZCwgY29uc3Qgdm9pZCogcykgewotI2lmIGRlZmluZWQoSEFWRV9VSU5UXzMyVCkKLSAgKCh1aW50XzMydCopZClbMF0gPSAoKHVpbnRfMzJ0KilzKVswXTsKLSAgKCh1aW50XzMydCopZClbMV0gPSAoKHVpbnRfMzJ0KilzKVsxXTsKLSAgKCh1aW50XzMydCopZClbMl0gPSAoKHVpbnRfMzJ0KilzKVsyXTsKLSAgKCh1aW50XzMydCopZClbM10gPSAoKHVpbnRfMzJ0KilzKVszXTsKLSNlbHNlCi0gICgodWludF84dCopZClbMF0gPSAoKHVpbnRfOHQqKXMpWzBdOwotICAoKHVpbnRfOHQqKWQpWzFdID0gKCh1aW50Xzh0KilzKVsxXTsKLSAgKCh1aW50Xzh0KilkKVsyXSA9ICgodWludF84dCopcylbMl07Ci0gICgodWludF84dCopZClbM10gPSAoKHVpbnRfOHQqKXMpWzNdOwotICAoKHVpbnRfOHQqKWQpWzRdID0gKCh1aW50Xzh0KilzKVs0XTsKLSAgKCh1aW50Xzh0KilkKVs1XSA9ICgodWludF84dCopcylbNV07Ci0gICgodWludF84dCopZClbNl0gPSAoKHVpbnRfOHQqKXMpWzZdOwotICAoKHVpbnRfOHQqKWQpWzddID0gKCh1aW50Xzh0KilzKVs3XTsKLSAgKCh1aW50Xzh0KilkKVs4XSA9ICgodWludF84dCopcylbOF07Ci0gICgodWludF84dCopZClbOV0gPSAoKHVpbnRfOHQqKXMpWzldOwotICAoKHVpbnRfOHQqKWQpWzEwXSA9ICgodWludF84dCopcylbMTBdOwotICAoKHVpbnRfOHQqKWQpWzExXSA9ICgodWludF84dCopcylbMTFdOwotICAoKHVpbnRfOHQqKWQpWzEyXSA9ICgodWludF84dCopcylbMTJdOwotICAoKHVpbnRfOHQqKWQpWzEzXSA9ICgodWludF84dCopcylbMTNdOwotICAoKHVpbnRfOHQqKWQpWzE0XSA9ICgodWludF84dCopcylbMTRdOwotICAoKHVpbnRfOHQqKWQpWzE1XSA9ICgodWludF84dCopcylbMTVdOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfYmxvY2tfbm4odm9pZCogZCwgY29uc3Qgdm9pZCogcywgdWludF84dCBubikgewotICB3aGlsZSAobm4tLSkgKigodWludF84dCopZCkrKyA9ICooKHVpbnRfOHQqKXMpKys7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgeG9yX2Jsb2NrKHZvaWQqIGQsIGNvbnN0IHZvaWQqIHMpIHsKLSNpZiBkZWZpbmVkKEhBVkVfVUlOVF8zMlQpCi0gICgodWludF8zMnQqKWQpWzBdIF49ICgodWludF8zMnQqKXMpWzBdOwotICAoKHVpbnRfMzJ0KilkKVsxXSBePSAoKHVpbnRfMzJ0KilzKVsxXTsKLSAgKCh1aW50XzMydCopZClbMl0gXj0gKCh1aW50XzMydCopcylbMl07Ci0gICgodWludF8zMnQqKWQpWzNdIF49ICgodWludF8zMnQqKXMpWzNdOwotI2Vsc2UKLSAgKCh1aW50Xzh0KilkKVswXSBePSAoKHVpbnRfOHQqKXMpWzBdOwotICAoKHVpbnRfOHQqKWQpWzFdIF49ICgodWludF84dCopcylbMV07Ci0gICgodWludF84dCopZClbMl0gXj0gKCh1aW50Xzh0KilzKVsyXTsKLSAgKCh1aW50Xzh0KilkKVszXSBePSAoKHVpbnRfOHQqKXMpWzNdOwotICAoKHVpbnRfOHQqKWQpWzRdIF49ICgodWludF84dCopcylbNF07Ci0gICgodWludF84dCopZClbNV0gXj0gKCh1aW50Xzh0KilzKVs1XTsKLSAgKCh1aW50Xzh0KilkKVs2XSBePSAoKHVpbnRfOHQqKXMpWzZdOwotICAoKHVpbnRfOHQqKWQpWzddIF49ICgodWludF84dCopcylbN107Ci0gICgodWludF84dCopZClbOF0gXj0gKCh1aW50Xzh0KilzKVs4XTsKLSAgKCh1aW50Xzh0KilkKVs5XSBePSAoKHVpbnRfOHQqKXMpWzldOwotICAoKHVpbnRfOHQqKWQpWzEwXSBePSAoKHVpbnRfOHQqKXMpWzEwXTsKLSAgKCh1aW50Xzh0KilkKVsxMV0gXj0gKCh1aW50Xzh0KilzKVsxMV07Ci0gICgodWludF84dCopZClbMTJdIF49ICgodWludF84dCopcylbMTJdOwotICAoKHVpbnRfOHQqKWQpWzEzXSBePSAoKHVpbnRfOHQqKXMpWzEzXTsKLSAgKCh1aW50Xzh0KilkKVsxNF0gXj0gKCh1aW50Xzh0KilzKVsxNF07Ci0gICgodWludF84dCopZClbMTVdIF49ICgodWludF84dCopcylbMTVdOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfYW5kX2tleSh2b2lkKiBkLCBjb25zdCB2b2lkKiBzLCBjb25zdCB2b2lkKiBrKSB7Ci0jaWYgZGVmaW5lZChIQVZFX1VJTlRfMzJUKQotICAoKHVpbnRfMzJ0KilkKVswXSA9ICgodWludF8zMnQqKXMpWzBdIF4gKCh1aW50XzMydCopaylbMF07Ci0gICgodWludF8zMnQqKWQpWzFdID0gKCh1aW50XzMydCopcylbMV0gXiAoKHVpbnRfMzJ0KilrKVsxXTsKLSAgKCh1aW50XzMydCopZClbMl0gPSAoKHVpbnRfMzJ0KilzKVsyXSBeICgodWludF8zMnQqKWspWzJdOwotICAoKHVpbnRfMzJ0KilkKVszXSA9ICgodWludF8zMnQqKXMpWzNdIF4gKCh1aW50XzMydCopaylbM107Ci0jZWxpZiAxCi0gICgodWludF84dCopZClbMF0gPSAoKHVpbnRfOHQqKXMpWzBdIF4gKCh1aW50Xzh0KilrKVswXTsKLSAgKCh1aW50Xzh0KilkKVsxXSA9ICgodWludF84dCopcylbMV0gXiAoKHVpbnRfOHQqKWspWzFdOwotICAoKHVpbnRfOHQqKWQpWzJdID0gKCh1aW50Xzh0KilzKVsyXSBeICgodWludF84dCopaylbMl07Ci0gICgodWludF84dCopZClbM10gPSAoKHVpbnRfOHQqKXMpWzNdIF4gKCh1aW50Xzh0KilrKVszXTsKLSAgKCh1aW50Xzh0KilkKVs0XSA9ICgodWludF84dCopcylbNF0gXiAoKHVpbnRfOHQqKWspWzRdOwotICAoKHVpbnRfOHQqKWQpWzVdID0gKCh1aW50Xzh0KilzKVs1XSBeICgodWludF84dCopaylbNV07Ci0gICgodWludF84dCopZClbNl0gPSAoKHVpbnRfOHQqKXMpWzZdIF4gKCh1aW50Xzh0KilrKVs2XTsKLSAgKCh1aW50Xzh0KilkKVs3XSA9ICgodWludF84dCopcylbN10gXiAoKHVpbnRfOHQqKWspWzddOwotICAoKHVpbnRfOHQqKWQpWzhdID0gKCh1aW50Xzh0KilzKVs4XSBeICgodWludF84dCopaylbOF07Ci0gICgodWludF84dCopZClbOV0gPSAoKHVpbnRfOHQqKXMpWzldIF4gKCh1aW50Xzh0KilrKVs5XTsKLSAgKCh1aW50Xzh0KilkKVsxMF0gPSAoKHVpbnRfOHQqKXMpWzEwXSBeICgodWludF84dCopaylbMTBdOwotICAoKHVpbnRfOHQqKWQpWzExXSA9ICgodWludF84dCopcylbMTFdIF4gKCh1aW50Xzh0KilrKVsxMV07Ci0gICgodWludF84dCopZClbMTJdID0gKCh1aW50Xzh0KilzKVsxMl0gXiAoKHVpbnRfOHQqKWspWzEyXTsKLSAgKCh1aW50Xzh0KilkKVsxM10gPSAoKHVpbnRfOHQqKXMpWzEzXSBeICgodWludF84dCopaylbMTNdOwotICAoKHVpbnRfOHQqKWQpWzE0XSA9ICgodWludF84dCopcylbMTRdIF4gKCh1aW50Xzh0KilrKVsxNF07Ci0gICgodWludF84dCopZClbMTVdID0gKCh1aW50Xzh0KilzKVsxNV0gXiAoKHVpbnRfOHQqKWspWzE1XTsKLSNlbHNlCi0gIGJsb2NrX2NvcHkoZCwgcyk7Ci0gIHhvcl9ibG9jayhkLCBrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBhZGRfcm91bmRfa2V5KHVpbnRfOHQgZFtOX0JMT0NLXSwgY29uc3QgdWludF84dCBrW05fQkxPQ0tdKSB7Ci0gIHhvcl9ibG9jayhkLCBrKTsKLX0KLQotc3RhdGljIHZvaWQgc2hpZnRfc3ViX3Jvd3ModWludF84dCBzdFtOX0JMT0NLXSkgewotICB1aW50Xzh0IHR0OwotCi0gIHN0WzBdID0gc19ib3goc3RbMF0pOwotICBzdFs0XSA9IHNfYm94KHN0WzRdKTsKLSAgc3RbOF0gPSBzX2JveChzdFs4XSk7Ci0gIHN0WzEyXSA9IHNfYm94KHN0WzEyXSk7Ci0KLSAgdHQgPSBzdFsxXTsKLSAgc3RbMV0gPSBzX2JveChzdFs1XSk7Ci0gIHN0WzVdID0gc19ib3goc3RbOV0pOwotICBzdFs5XSA9IHNfYm94KHN0WzEzXSk7Ci0gIHN0WzEzXSA9IHNfYm94KHR0KTsKLQotICB0dCA9IHN0WzJdOwotICBzdFsyXSA9IHNfYm94KHN0WzEwXSk7Ci0gIHN0WzEwXSA9IHNfYm94KHR0KTsKLSAgdHQgPSBzdFs2XTsKLSAgc3RbNl0gPSBzX2JveChzdFsxNF0pOwotICBzdFsxNF0gPSBzX2JveCh0dCk7Ci0KLSAgdHQgPSBzdFsxNV07Ci0gIHN0WzE1XSA9IHNfYm94KHN0WzExXSk7Ci0gIHN0WzExXSA9IHNfYm94KHN0WzddKTsKLSAgc3RbN10gPSBzX2JveChzdFszXSk7Ci0gIHN0WzNdID0gc19ib3godHQpOwotfQotCi1zdGF0aWMgdm9pZCBpbnZfc2hpZnRfc3ViX3Jvd3ModWludF84dCBzdFtOX0JMT0NLXSkgewotICB1aW50Xzh0IHR0OwotCi0gIHN0WzBdID0gaXNfYm94KHN0WzBdKTsKLSAgc3RbNF0gPSBpc19ib3goc3RbNF0pOwotICBzdFs4XSA9IGlzX2JveChzdFs4XSk7Ci0gIHN0WzEyXSA9IGlzX2JveChzdFsxMl0pOwotCi0gIHR0ID0gc3RbMTNdOwotICBzdFsxM10gPSBpc19ib3goc3RbOV0pOwotICBzdFs5XSA9IGlzX2JveChzdFs1XSk7Ci0gIHN0WzVdID0gaXNfYm94KHN0WzFdKTsKLSAgc3RbMV0gPSBpc19ib3godHQpOwotCi0gIHR0ID0gc3RbMl07Ci0gIHN0WzJdID0gaXNfYm94KHN0WzEwXSk7Ci0gIHN0WzEwXSA9IGlzX2JveCh0dCk7Ci0gIHR0ID0gc3RbNl07Ci0gIHN0WzZdID0gaXNfYm94KHN0WzE0XSk7Ci0gIHN0WzE0XSA9IGlzX2JveCh0dCk7Ci0KLSAgdHQgPSBzdFszXTsKLSAgc3RbM10gPSBpc19ib3goc3RbN10pOwotICBzdFs3XSA9IGlzX2JveChzdFsxMV0pOwotICBzdFsxMV0gPSBpc19ib3goc3RbMTVdKTsKLSAgc3RbMTVdID0gaXNfYm94KHR0KTsKLX0KLQotI2lmIGRlZmluZWQoVkVSU0lPTl8xKQotc3RhdGljIHZvaWQgbWl4X3N1Yl9jb2x1bW5zKHVpbnRfOHQgZHRbTl9CTE9DS10pIHsKLSAgdWludF84dCBzdFtOX0JMT0NLXTsKLSAgYmxvY2tfY29weShzdCwgZHQpOwotI2Vsc2UKLXN0YXRpYyB2b2lkIG1peF9zdWJfY29sdW1ucyh1aW50Xzh0IGR0W05fQkxPQ0tdLCB1aW50Xzh0IHN0W05fQkxPQ0tdKSB7Ci0jZW5kaWYKLSAgZHRbMF0gPSBnZm0yX3NiKHN0WzBdKSBeIGdmbTNfc2Ioc3RbNV0pIF4gc19ib3goc3RbMTBdKSBeIHNfYm94KHN0WzE1XSk7Ci0gIGR0WzFdID0gc19ib3goc3RbMF0pIF4gZ2ZtMl9zYihzdFs1XSkgXiBnZm0zX3NiKHN0WzEwXSkgXiBzX2JveChzdFsxNV0pOwotICBkdFsyXSA9IHNfYm94KHN0WzBdKSBeIHNfYm94KHN0WzVdKSBeIGdmbTJfc2Ioc3RbMTBdKSBeIGdmbTNfc2Ioc3RbMTVdKTsKLSAgZHRbM10gPSBnZm0zX3NiKHN0WzBdKSBeIHNfYm94KHN0WzVdKSBeIHNfYm94KHN0WzEwXSkgXiBnZm0yX3NiKHN0WzE1XSk7Ci0KLSAgZHRbNF0gPSBnZm0yX3NiKHN0WzRdKSBeIGdmbTNfc2Ioc3RbOV0pIF4gc19ib3goc3RbMTRdKSBeIHNfYm94KHN0WzNdKTsKLSAgZHRbNV0gPSBzX2JveChzdFs0XSkgXiBnZm0yX3NiKHN0WzldKSBeIGdmbTNfc2Ioc3RbMTRdKSBeIHNfYm94KHN0WzNdKTsKLSAgZHRbNl0gPSBzX2JveChzdFs0XSkgXiBzX2JveChzdFs5XSkgXiBnZm0yX3NiKHN0WzE0XSkgXiBnZm0zX3NiKHN0WzNdKTsKLSAgZHRbN10gPSBnZm0zX3NiKHN0WzRdKSBeIHNfYm94KHN0WzldKSBeIHNfYm94KHN0WzE0XSkgXiBnZm0yX3NiKHN0WzNdKTsKLQotICBkdFs4XSA9IGdmbTJfc2Ioc3RbOF0pIF4gZ2ZtM19zYihzdFsxM10pIF4gc19ib3goc3RbMl0pIF4gc19ib3goc3RbN10pOwotICBkdFs5XSA9IHNfYm94KHN0WzhdKSBeIGdmbTJfc2Ioc3RbMTNdKSBeIGdmbTNfc2Ioc3RbMl0pIF4gc19ib3goc3RbN10pOwotICBkdFsxMF0gPSBzX2JveChzdFs4XSkgXiBzX2JveChzdFsxM10pIF4gZ2ZtMl9zYihzdFsyXSkgXiBnZm0zX3NiKHN0WzddKTsKLSAgZHRbMTFdID0gZ2ZtM19zYihzdFs4XSkgXiBzX2JveChzdFsxM10pIF4gc19ib3goc3RbMl0pIF4gZ2ZtMl9zYihzdFs3XSk7Ci0KLSAgZHRbMTJdID0gZ2ZtMl9zYihzdFsxMl0pIF4gZ2ZtM19zYihzdFsxXSkgXiBzX2JveChzdFs2XSkgXiBzX2JveChzdFsxMV0pOwotICBkdFsxM10gPSBzX2JveChzdFsxMl0pIF4gZ2ZtMl9zYihzdFsxXSkgXiBnZm0zX3NiKHN0WzZdKSBeIHNfYm94KHN0WzExXSk7Ci0gIGR0WzE0XSA9IHNfYm94KHN0WzEyXSkgXiBzX2JveChzdFsxXSkgXiBnZm0yX3NiKHN0WzZdKSBeIGdmbTNfc2Ioc3RbMTFdKTsKLSAgZHRbMTVdID0gZ2ZtM19zYihzdFsxMl0pIF4gc19ib3goc3RbMV0pIF4gc19ib3goc3RbNl0pIF4gZ2ZtMl9zYihzdFsxMV0pOwotfQotCi0jaWYgZGVmaW5lZChWRVJTSU9OXzEpCi1zdGF0aWMgdm9pZCBpbnZfbWl4X3N1Yl9jb2x1bW5zKHVpbnRfOHQgZHRbTl9CTE9DS10pIHsKLSAgdWludF84dCBzdFtOX0JMT0NLXTsKLSAgYmxvY2tfY29weShzdCwgZHQpOwotI2Vsc2UKLXN0YXRpYyB2b2lkIGludl9taXhfc3ViX2NvbHVtbnModWludF84dCBkdFtOX0JMT0NLXSwgdWludF84dCBzdFtOX0JMT0NLXSkgewotI2VuZGlmCi0gIGR0WzBdID0gaXNfYm94KGdmbV9lKHN0WzBdKSBeIGdmbV9iKHN0WzFdKSBeIGdmbV9kKHN0WzJdKSBeIGdmbV85KHN0WzNdKSk7Ci0gIGR0WzVdID0gaXNfYm94KGdmbV85KHN0WzBdKSBeIGdmbV9lKHN0WzFdKSBeIGdmbV9iKHN0WzJdKSBeIGdmbV9kKHN0WzNdKSk7Ci0gIGR0WzEwXSA9IGlzX2JveChnZm1fZChzdFswXSkgXiBnZm1fOShzdFsxXSkgXiBnZm1fZShzdFsyXSkgXiBnZm1fYihzdFszXSkpOwotICBkdFsxNV0gPSBpc19ib3goZ2ZtX2Ioc3RbMF0pIF4gZ2ZtX2Qoc3RbMV0pIF4gZ2ZtXzkoc3RbMl0pIF4gZ2ZtX2Uoc3RbM10pKTsKLQotICBkdFs0XSA9IGlzX2JveChnZm1fZShzdFs0XSkgXiBnZm1fYihzdFs1XSkgXiBnZm1fZChzdFs2XSkgXiBnZm1fOShzdFs3XSkpOwotICBkdFs5XSA9IGlzX2JveChnZm1fOShzdFs0XSkgXiBnZm1fZShzdFs1XSkgXiBnZm1fYihzdFs2XSkgXiBnZm1fZChzdFs3XSkpOwotICBkdFsxNF0gPSBpc19ib3goZ2ZtX2Qoc3RbNF0pIF4gZ2ZtXzkoc3RbNV0pIF4gZ2ZtX2Uoc3RbNl0pIF4gZ2ZtX2Ioc3RbN10pKTsKLSAgZHRbM10gPSBpc19ib3goZ2ZtX2Ioc3RbNF0pIF4gZ2ZtX2Qoc3RbNV0pIF4gZ2ZtXzkoc3RbNl0pIF4gZ2ZtX2Uoc3RbN10pKTsKLQotICBkdFs4XSA9IGlzX2JveChnZm1fZShzdFs4XSkgXiBnZm1fYihzdFs5XSkgXiBnZm1fZChzdFsxMF0pIF4gZ2ZtXzkoc3RbMTFdKSk7Ci0gIGR0WzEzXSA9IGlzX2JveChnZm1fOShzdFs4XSkgXiBnZm1fZShzdFs5XSkgXiBnZm1fYihzdFsxMF0pIF4gZ2ZtX2Qoc3RbMTFdKSk7Ci0gIGR0WzJdID0gaXNfYm94KGdmbV9kKHN0WzhdKSBeIGdmbV85KHN0WzldKSBeIGdmbV9lKHN0WzEwXSkgXiBnZm1fYihzdFsxMV0pKTsKLSAgZHRbN10gPSBpc19ib3goZ2ZtX2Ioc3RbOF0pIF4gZ2ZtX2Qoc3RbOV0pIF4gZ2ZtXzkoc3RbMTBdKSBeIGdmbV9lKHN0WzExXSkpOwotCi0gIGR0WzEyXSA9Ci0gICAgICBpc19ib3goZ2ZtX2Uoc3RbMTJdKSBeIGdmbV9iKHN0WzEzXSkgXiBnZm1fZChzdFsxNF0pIF4gZ2ZtXzkoc3RbMTVdKSk7Ci0gIGR0WzFdID0gaXNfYm94KGdmbV85KHN0WzEyXSkgXiBnZm1fZShzdFsxM10pIF4gZ2ZtX2Ioc3RbMTRdKSBeIGdmbV9kKHN0WzE1XSkpOwotICBkdFs2XSA9IGlzX2JveChnZm1fZChzdFsxMl0pIF4gZ2ZtXzkoc3RbMTNdKSBeIGdmbV9lKHN0WzE0XSkgXiBnZm1fYihzdFsxNV0pKTsKLSAgZHRbMTFdID0KLSAgICAgIGlzX2JveChnZm1fYihzdFsxMl0pIF4gZ2ZtX2Qoc3RbMTNdKSBeIGdmbV85KHN0WzE0XSkgXiBnZm1fZShzdFsxNV0pKTsKLX0KLQotI2lmIGRlZmluZWQoQUVTX0VOQ19QUkVLRVlFRCkgfHwgZGVmaW5lZChBRVNfREVDX1BSRUtFWUVEKQotCi0vKiAgU2V0IHRoZSBjaXBoZXIga2V5IGZvciB0aGUgcHJlLWtleWVkIHZlcnNpb24gKi8KLS8qICBOT1RFOiBJZiB0aGUgbGVuZ3RoX3R5cGUgdXNlZCBmb3IgdGhlIGtleSBsZW5ndGggaXMgYW4KLSAgICB1bnNpZ25lZCA4LWJpdCBjaGFyYWN0ZXIsIGEga2V5IGxlbmd0aCBvZiAyNTYgYml0cyBtdXN0Ci0gICAgYmUgZW50ZXJlZCBhcyBhIGxlbmd0aCBpbiBieXRlcyAodmFsaWQgaW5wdXRzIGFyZSBoZW5jZQotICAgIDEyOCwgMTkyLCAxNiwgMjQgYW5kIDMyKS4KLSovCi0KLXJldHVybl90eXBlIGFlc19zZXRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5W10sIGxlbmd0aF90eXBlIGtleWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFlc19jb250ZXh0IGN0eFsxXSkgewotICB1aW50Xzh0IGNjLCByYywgaGk7Ci0KLSAgc3dpdGNoIChrZXlsZW4pIHsKLSAgICBjYXNlIDE2OgotICAgIGNhc2UgMTI4OiAvKiBsZW5ndGggaW4gYml0cyAoMTI4ID0gOCoxNikgKi8KLSAgICAgIGtleWxlbiA9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICBjYXNlIDE5MjogLyogbGVuZ3RoIGluIGJpdHMgKDE5MiA9IDgqMjQpICovCi0gICAgICBrZXlsZW4gPSAyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICAvKiAgICBjYXNlIDI1NjogICAgICAgICAgIGxlbmd0aCBpbiBiaXRzICgyNTYgPSA4KjMyKSAqLwotICAgICAga2V5bGVuID0gMzI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgY3R4LT5ybmQgPSAwOwotICAgICAgcmV0dXJuIChyZXR1cm5fdHlwZSktMTsKLSAgfQotICBibG9ja19jb3B5X25uKGN0eC0+a3NjaCwga2V5LCBrZXlsZW4pOwotICBoaSA9IChrZXlsZW4gKyAyOCkgPDwgMjsKLSAgY3R4LT5ybmQgPSAoaGkgPj4gNCkgLSAxOwotICBmb3IgKGNjID0ga2V5bGVuLCByYyA9IDE7IGNjIDwgaGk7IGNjICs9IDQpIHsKLSAgICB1aW50Xzh0IHR0LCB0MCwgdDEsIHQyLCB0MzsKLQotICAgIHQwID0gY3R4LT5rc2NoW2NjIC0gNF07Ci0gICAgdDEgPSBjdHgtPmtzY2hbY2MgLSAzXTsKLSAgICB0MiA9IGN0eC0+a3NjaFtjYyAtIDJdOwotICAgIHQzID0gY3R4LT5rc2NoW2NjIC0gMV07Ci0gICAgaWYgKGNjICUga2V5bGVuID09IDApIHsKLSAgICAgIHR0ID0gdDA7Ci0gICAgICB0MCA9IHNfYm94KHQxKSBeIHJjOwotICAgICAgdDEgPSBzX2JveCh0Mik7Ci0gICAgICB0MiA9IHNfYm94KHQzKTsKLSAgICAgIHQzID0gc19ib3godHQpOwotICAgICAgcmMgPSBmMihyYyk7Ci0gICAgfSBlbHNlIGlmIChrZXlsZW4gPiAyNCAmJiBjYyAlIGtleWxlbiA9PSAxNikgewotICAgICAgdDAgPSBzX2JveCh0MCk7Ci0gICAgICB0MSA9IHNfYm94KHQxKTsKLSAgICAgIHQyID0gc19ib3godDIpOwotICAgICAgdDMgPSBzX2JveCh0Myk7Ci0gICAgfQotICAgIHR0ID0gY2MgLSBrZXlsZW47Ci0gICAgY3R4LT5rc2NoW2NjICsgMF0gPSBjdHgtPmtzY2hbdHQgKyAwXSBeIHQwOwotICAgIGN0eC0+a3NjaFtjYyArIDFdID0gY3R4LT5rc2NoW3R0ICsgMV0gXiB0MTsKLSAgICBjdHgtPmtzY2hbY2MgKyAyXSA9IGN0eC0+a3NjaFt0dCArIDJdIF4gdDI7Ci0gICAgY3R4LT5rc2NoW2NjICsgM10gPSBjdHgtPmtzY2hbdHQgKyAzXSBeIHQzOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0VOQ19QUkVLRVlFRCkKLQotLyogIEVuY3J5cHQgYSBzaW5nbGUgYmxvY2sgb2YgMTYgYnl0ZXMgKi8KLQotcmV0dXJuX3R5cGUgYWVzX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLCBjb25zdCBhZXNfY29udGV4dCBjdHhbMV0pIHsKLSAgaWYgKGN0eC0+cm5kKSB7Ci0gICAgdWludF84dCBzMVtOX0JMT0NLXSwgcjsKLSAgICBjb3B5X2FuZF9rZXkoczEsIGluLCBjdHgtPmtzY2gpOwotCi0gICAgZm9yIChyID0gMTsgciA8IGN0eC0+cm5kOyArK3IpCi0jaWYgZGVmaW5lZChWRVJTSU9OXzEpCi0gICAgewotICAgICAgbWl4X3N1Yl9jb2x1bW5zKHMxKTsKLSAgICAgIGFkZF9yb3VuZF9rZXkoczEsIGN0eC0+a3NjaCArIHIgKiBOX0JMT0NLKTsKLSAgICB9Ci0jZWxzZQotICAgIHsKLSAgICAgIHVpbnRfOHQgczJbTl9CTE9DS107Ci0gICAgICBtaXhfc3ViX2NvbHVtbnMoczIsIHMxKTsKLSAgICAgIGNvcHlfYW5kX2tleShzMSwgczIsIGN0eC0+a3NjaCArIHIgKiBOX0JMT0NLKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBzaGlmdF9zdWJfcm93cyhzMSk7Ci0gICAgY29weV9hbmRfa2V5KG91dCwgczEsIGN0eC0+a3NjaCArIHIgKiBOX0JMT0NLKTsKLSAgfSBlbHNlCi0gICAgcmV0dXJuIChyZXR1cm5fdHlwZSktMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENCQyBlbmNyeXB0IGEgbnVtYmVyIG9mIGJsb2NrcyAoaW5wdXQgYW5kIHJldHVybiBhbiBJVikgKi8KLQotcmV0dXJuX3R5cGUgYWVzX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCB1bnNpZ25lZCBjaGFyKiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5fYmxvY2ssIHVuc2lnbmVkIGNoYXIgaXZbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWVzX2NvbnRleHQgY3R4WzFdKSB7Ci0gIHdoaWxlIChuX2Jsb2NrLS0pIHsKLSAgICB4b3JfYmxvY2soaXYsIGluKTsKLSAgICBpZiAoYWVzX2VuY3J5cHQoaXYsIGl2LCBjdHgpICE9IEVYSVRfU1VDQ0VTUykgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICBtZW1jcHkob3V0LCBpdiwgTl9CTE9DSyk7Ci0gICAgaW4gKz0gTl9CTE9DSzsKLSAgICBvdXQgKz0gTl9CTE9DSzsKLSAgfQotICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0RFQ19QUkVLRVlFRCkKLQotLyogIERlY3J5cHQgYSBzaW5nbGUgYmxvY2sgb2YgMTYgYnl0ZXMgKi8KLQotcmV0dXJuX3R5cGUgYWVzX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLCBjb25zdCBhZXNfY29udGV4dCBjdHhbMV0pIHsKLSAgaWYgKGN0eC0+cm5kKSB7Ci0gICAgdWludF84dCBzMVtOX0JMT0NLXSwgcjsKLSAgICBjb3B5X2FuZF9rZXkoczEsIGluLCBjdHgtPmtzY2ggKyBjdHgtPnJuZCAqIE5fQkxPQ0spOwotICAgIGludl9zaGlmdF9zdWJfcm93cyhzMSk7Ci0KLSAgICBmb3IgKHIgPSBjdHgtPnJuZDsgLS1yOykKLSNpZiBkZWZpbmVkKFZFUlNJT05fMSkKLSAgICB7Ci0gICAgICBhZGRfcm91bmRfa2V5KHMxLCBjdHgtPmtzY2ggKyByICogTl9CTE9DSyk7Ci0gICAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxKTsKLSAgICB9Ci0jZWxzZQotICAgIHsKLSAgICAgIHVpbnRfOHQgczJbTl9CTE9DS107Ci0gICAgICBjb3B5X2FuZF9rZXkoczIsIHMxLCBjdHgtPmtzY2ggKyByICogTl9CTE9DSyk7Ci0gICAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxLCBzMik7Ci0gICAgfQotI2VuZGlmCi0gICAgY29weV9hbmRfa2V5KG91dCwgczEsIGN0eC0+a3NjaCk7Ci0gIH0gZWxzZQotICAgIHJldHVybiAocmV0dXJuX3R5cGUpLTE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBDQkMgZGVjcnlwdCBhIG51bWJlciBvZiBibG9ja3MgKGlucHV0IGFuZCByZXR1cm4gYW4gSVYpICovCi0KLXJldHVybl90eXBlIGFlc19jYmNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgY2hhciogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuX2Jsb2NrLCB1bnNpZ25lZCBjaGFyIGl2W05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFlc19jb250ZXh0IGN0eFsxXSkgewotICB3aGlsZSAobl9ibG9jay0tKSB7Ci0gICAgdWludF84dCB0bXBbTl9CTE9DS107Ci0KLSAgICBtZW1jcHkodG1wLCBpbiwgTl9CTE9DSyk7Ci0gICAgaWYgKGFlc19kZWNyeXB0KGluLCBvdXQsIGN0eCkgIT0gRVhJVF9TVUNDRVNTKSByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIHhvcl9ibG9jayhvdXQsIGl2KTsKLSAgICBtZW1jcHkoaXYsIHRtcCwgTl9CTE9DSyk7Ci0gICAgaW4gKz0gTl9CTE9DSzsKLSAgICBvdXQgKz0gTl9CTE9DSzsKLSAgfQotICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0VOQ18xMjhfT1RGSykKLQotLyogIFRoZSAnb24gdGhlIGZseScgZW5jcnlwdGlvbiBrZXkgdXBkYXRlIGZvciBmb3IgMTI4IGJpdCBrZXlzICovCi0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9lbmNyeXB0X2tleV8xMjgodWludF84dCBrW05fQkxPQ0tdLCB1aW50Xzh0KiByYykgewotICB1aW50Xzh0IGNjOwotCi0gIGtbMF0gXj0gc19ib3goa1sxM10pIF4gKnJjOwotICBrWzFdIF49IHNfYm94KGtbMTRdKTsKLSAga1syXSBePSBzX2JveChrWzE1XSk7Ci0gIGtbM10gXj0gc19ib3goa1sxMl0pOwotICAqcmMgPSBmMigqcmMpOwotCi0gIGZvciAoY2MgPSA0OyBjYyA8IDE2OyBjYyArPSA0KSB7Ci0gICAga1tjYyArIDBdIF49IGtbY2MgLSA0XTsKLSAgICBrW2NjICsgMV0gXj0ga1tjYyAtIDNdOwotICAgIGtbY2MgKyAyXSBePSBrW2NjIC0gMl07Ci0gICAga1tjYyArIDNdIF49IGtbY2MgLSAxXTsKLSAgfQotfQotCi0vKiAgRW5jcnlwdCBhIHNpbmdsZSBibG9jayBvZiAxNiBieXRlcyB3aXRoICdvbiB0aGUgZmx5JyAxMjggYml0IGtleWluZyAqLwotCi12b2lkIGFlc19lbmNyeXB0XzEyOChjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVtOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb19rZXlbTl9CTE9DS10pIHsKLSAgdWludF84dCBzMVtOX0JMT0NLXSwgciwgcmMgPSAxOwotCi0gIGlmIChvX2tleSAhPSBrZXkpIGJsb2NrX2NvcHkob19rZXksIGtleSk7Ci0gIGNvcHlfYW5kX2tleShzMSwgaW4sIG9fa2V5KTsKLQotICBmb3IgKHIgPSAxOyByIDwgMTA7ICsrcikKLSNpZiBkZWZpbmVkKFZFUlNJT05fMSkKLSAgewotICAgIG1peF9zdWJfY29sdW1ucyhzMSk7Ci0gICAgdXBkYXRlX2VuY3J5cHRfa2V5XzEyOChvX2tleSwgJnJjKTsKLSAgICBhZGRfcm91bmRfa2V5KHMxLCBvX2tleSk7Ci0gIH0KLSNlbHNlCi0gIHsKLSAgICB1aW50Xzh0IHMyW05fQkxPQ0tdOwotICAgIG1peF9zdWJfY29sdW1ucyhzMiwgczEpOwotICAgIHVwZGF0ZV9lbmNyeXB0X2tleV8xMjgob19rZXksICZyYyk7Ci0gICAgY29weV9hbmRfa2V5KHMxLCBzMiwgb19rZXkpOwotICB9Ci0jZW5kaWYKLQotICBzaGlmdF9zdWJfcm93cyhzMSk7Ci0gIHVwZGF0ZV9lbmNyeXB0X2tleV8xMjgob19rZXksICZyYyk7Ci0gIGNvcHlfYW5kX2tleShvdXQsIHMxLCBvX2tleSk7Ci19Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfREVDXzEyOF9PVEZLKQotCi0vKiAgVGhlICdvbiB0aGUgZmx5JyBkZWNyeXB0aW9uIGtleSB1cGRhdGUgZm9yIGZvciAxMjggYml0IGtleXMgKi8KLQotc3RhdGljIHZvaWQgdXBkYXRlX2RlY3J5cHRfa2V5XzEyOCh1aW50Xzh0IGtbTl9CTE9DS10sIHVpbnRfOHQqIHJjKSB7Ci0gIHVpbnRfOHQgY2M7Ci0KLSAgZm9yIChjYyA9IDEyOyBjYyA+IDA7IGNjIC09IDQpIHsKLSAgICBrW2NjICsgMF0gXj0ga1tjYyAtIDRdOwotICAgIGtbY2MgKyAxXSBePSBrW2NjIC0gM107Ci0gICAga1tjYyArIDJdIF49IGtbY2MgLSAyXTsKLSAgICBrW2NjICsgM10gXj0ga1tjYyAtIDFdOwotICB9Ci0gICpyYyA9IGQyKCpyYyk7Ci0gIGtbMF0gXj0gc19ib3goa1sxM10pIF4gKnJjOwotICBrWzFdIF49IHNfYm94KGtbMTRdKTsKLSAga1syXSBePSBzX2JveChrWzE1XSk7Ci0gIGtbM10gXj0gc19ib3goa1sxMl0pOwotfQotCi0vKiAgRGVjcnlwdCBhIHNpbmdsZSBibG9jayBvZiAxNiBieXRlcyB3aXRoICdvbiB0aGUgZmx5JyAxMjggYml0IGtleWluZyAqLwotCi12b2lkIGFlc19kZWNyeXB0XzEyOChjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVtOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb19rZXlbTl9CTE9DS10pIHsKLSAgdWludF84dCBzMVtOX0JMT0NLXSwgciwgcmMgPSAweDZjOwotICBpZiAob19rZXkgIT0ga2V5KSBibG9ja19jb3B5KG9fa2V5LCBrZXkpOwotCi0gIGNvcHlfYW5kX2tleShzMSwgaW4sIG9fa2V5KTsKLSAgaW52X3NoaWZ0X3N1Yl9yb3dzKHMxKTsKLQotICBmb3IgKHIgPSAxMDsgLS1yOykKLSNpZiBkZWZpbmVkKFZFUlNJT05fMSkKLSAgewotICAgIHVwZGF0ZV9kZWNyeXB0X2tleV8xMjgob19rZXksICZyYyk7Ci0gICAgYWRkX3JvdW5kX2tleShzMSwgb19rZXkpOwotICAgIGludl9taXhfc3ViX2NvbHVtbnMoczEpOwotICB9Ci0jZWxzZQotICB7Ci0gICAgdWludF84dCBzMltOX0JMT0NLXTsKLSAgICB1cGRhdGVfZGVjcnlwdF9rZXlfMTI4KG9fa2V5LCAmcmMpOwotICAgIGNvcHlfYW5kX2tleShzMiwgczEsIG9fa2V5KTsKLSAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxLCBzMik7Ci0gIH0KLSNlbmRpZgotICB1cGRhdGVfZGVjcnlwdF9rZXlfMTI4KG9fa2V5LCAmcmMpOwotICBjb3B5X2FuZF9rZXkob3V0LCBzMSwgb19rZXkpOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0VOQ18yNTZfT1RGSykKLQotLyogIFRoZSAnb24gdGhlIGZseScgZW5jcnlwdGlvbiBrZXkgdXBkYXRlIGZvciBmb3IgMjU2IGJpdCBrZXlzICovCi0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9lbmNyeXB0X2tleV8yNTYodWludF84dCBrWzIgKiBOX0JMT0NLXSwgdWludF84dCogcmMpIHsKLSAgdWludF84dCBjYzsKLQotICBrWzBdIF49IHNfYm94KGtbMjldKSBeICpyYzsKLSAga1sxXSBePSBzX2JveChrWzMwXSk7Ci0gIGtbMl0gXj0gc19ib3goa1szMV0pOwotICBrWzNdIF49IHNfYm94KGtbMjhdKTsKLSAgKnJjID0gZjIoKnJjKTsKLQotICBmb3IgKGNjID0gNDsgY2MgPCAxNjsgY2MgKz0gNCkgewotICAgIGtbY2MgKyAwXSBePSBrW2NjIC0gNF07Ci0gICAga1tjYyArIDFdIF49IGtbY2MgLSAzXTsKLSAgICBrW2NjICsgMl0gXj0ga1tjYyAtIDJdOwotICAgIGtbY2MgKyAzXSBePSBrW2NjIC0gMV07Ci0gIH0KLQotICBrWzE2XSBePSBzX2JveChrWzEyXSk7Ci0gIGtbMTddIF49IHNfYm94KGtbMTNdKTsKLSAga1sxOF0gXj0gc19ib3goa1sxNF0pOwotICBrWzE5XSBePSBzX2JveChrWzE1XSk7Ci0KLSAgZm9yIChjYyA9IDIwOyBjYyA8IDMyOyBjYyArPSA0KSB7Ci0gICAga1tjYyArIDBdIF49IGtbY2MgLSA0XTsKLSAgICBrW2NjICsgMV0gXj0ga1tjYyAtIDNdOwotICAgIGtbY2MgKyAyXSBePSBrW2NjIC0gMl07Ci0gICAga1tjYyArIDNdIF49IGtbY2MgLSAxXTsKLSAgfQotfQotCi0vKiAgRW5jcnlwdCBhIHNpbmdsZSBibG9jayBvZiAxNiBieXRlcyB3aXRoICdvbiB0aGUgZmx5JyAyNTYgYml0IGtleWluZyAqLwotCi12b2lkIGFlc19lbmNyeXB0XzI1Nihjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVsyICogTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG9fa2V5WzIgKiBOX0JMT0NLXSkgewotICB1aW50Xzh0IHMxW05fQkxPQ0tdLCByLCByYyA9IDE7Ci0gIGlmIChvX2tleSAhPSBrZXkpIHsKLSAgICBibG9ja19jb3B5KG9fa2V5LCBrZXkpOwotICAgIGJsb2NrX2NvcHkob19rZXkgKyAxNiwga2V5ICsgMTYpOwotICB9Ci0gIGNvcHlfYW5kX2tleShzMSwgaW4sIG9fa2V5KTsKLQotICBmb3IgKHIgPSAxOyByIDwgMTQ7ICsrcikKLSNpZiBkZWZpbmVkKFZFUlNJT05fMSkKLSAgewotICAgIG1peF9zdWJfY29sdW1ucyhzMSk7Ci0gICAgaWYgKHIgJiAxKQotICAgICAgYWRkX3JvdW5kX2tleShzMSwgb19rZXkgKyAxNik7Ci0gICAgZWxzZSB7Ci0gICAgICB1cGRhdGVfZW5jcnlwdF9rZXlfMjU2KG9fa2V5LCAmcmMpOwotICAgICAgYWRkX3JvdW5kX2tleShzMSwgb19rZXkpOwotICAgIH0KLSAgfQotI2Vsc2UKLSAgewotICAgIHVpbnRfOHQgczJbTl9CTE9DS107Ci0gICAgbWl4X3N1Yl9jb2x1bW5zKHMyLCBzMSk7Ci0gICAgaWYgKHIgJiAxKQotICAgICAgY29weV9hbmRfa2V5KHMxLCBzMiwgb19rZXkgKyAxNik7Ci0gICAgZWxzZSB7Ci0gICAgICB1cGRhdGVfZW5jcnlwdF9rZXlfMjU2KG9fa2V5LCAmcmMpOwotICAgICAgY29weV9hbmRfa2V5KHMxLCBzMiwgb19rZXkpOwotICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgc2hpZnRfc3ViX3Jvd3MoczEpOwotICB1cGRhdGVfZW5jcnlwdF9rZXlfMjU2KG9fa2V5LCAmcmMpOwotICBjb3B5X2FuZF9rZXkob3V0LCBzMSwgb19rZXkpOwotfQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQUVTX0RFQ18yNTZfT1RGSykKLQotLyogIFRoZSAnb24gdGhlIGZseScgZW5jcnlwdGlvbiBrZXkgdXBkYXRlIGZvciBmb3IgMjU2IGJpdCBrZXlzICovCi0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9kZWNyeXB0X2tleV8yNTYodWludF84dCBrWzIgKiBOX0JMT0NLXSwgdWludF84dCogcmMpIHsKLSAgdWludF84dCBjYzsKLQotICBmb3IgKGNjID0gMjg7IGNjID4gMTY7IGNjIC09IDQpIHsKLSAgICBrW2NjICsgMF0gXj0ga1tjYyAtIDRdOwotICAgIGtbY2MgKyAxXSBePSBrW2NjIC0gM107Ci0gICAga1tjYyArIDJdIF49IGtbY2MgLSAyXTsKLSAgICBrW2NjICsgM10gXj0ga1tjYyAtIDFdOwotICB9Ci0KLSAga1sxNl0gXj0gc19ib3goa1sxMl0pOwotICBrWzE3XSBePSBzX2JveChrWzEzXSk7Ci0gIGtbMThdIF49IHNfYm94KGtbMTRdKTsKLSAga1sxOV0gXj0gc19ib3goa1sxNV0pOwotCi0gIGZvciAoY2MgPSAxMjsgY2MgPiAwOyBjYyAtPSA0KSB7Ci0gICAga1tjYyArIDBdIF49IGtbY2MgLSA0XTsKLSAgICBrW2NjICsgMV0gXj0ga1tjYyAtIDNdOwotICAgIGtbY2MgKyAyXSBePSBrW2NjIC0gMl07Ci0gICAga1tjYyArIDNdIF49IGtbY2MgLSAxXTsKLSAgfQotCi0gICpyYyA9IGQyKCpyYyk7Ci0gIGtbMF0gXj0gc19ib3goa1syOV0pIF4gKnJjOwotICBrWzFdIF49IHNfYm94KGtbMzBdKTsKLSAga1syXSBePSBzX2JveChrWzMxXSk7Ci0gIGtbM10gXj0gc19ib3goa1syOF0pOwotfQotCi0vKiAgRGVjcnlwdCBhIHNpbmdsZSBibG9jayBvZiAxNiBieXRlcyB3aXRoICdvbiB0aGUgZmx5JwotICAgIDI1NiBiaXQga2V5aW5nCi0qLwotdm9pZCBhZXNfZGVjcnlwdF8yNTYoY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbMiAqIE5fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvX2tleVsyICogTl9CTE9DS10pIHsKLSAgdWludF84dCBzMVtOX0JMT0NLXSwgciwgcmMgPSAweDgwOwotCi0gIGlmIChvX2tleSAhPSBrZXkpIHsKLSAgICBibG9ja19jb3B5KG9fa2V5LCBrZXkpOwotICAgIGJsb2NrX2NvcHkob19rZXkgKyAxNiwga2V5ICsgMTYpOwotICB9Ci0KLSAgY29weV9hbmRfa2V5KHMxLCBpbiwgb19rZXkpOwotICBpbnZfc2hpZnRfc3ViX3Jvd3MoczEpOwotCi0gIGZvciAociA9IDE0OyAtLXI7KQotI2lmIGRlZmluZWQoVkVSU0lPTl8xKQotICB7Ci0gICAgaWYgKChyICYgMSkpIHsKLSAgICAgIHVwZGF0ZV9kZWNyeXB0X2tleV8yNTYob19rZXksICZyYyk7Ci0gICAgICBhZGRfcm91bmRfa2V5KHMxLCBvX2tleSArIDE2KTsKLSAgICB9IGVsc2UKLSAgICAgIGFkZF9yb3VuZF9rZXkoczEsIG9fa2V5KTsKLSAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxKTsKLSAgfQotI2Vsc2UKLSAgewotICAgIHVpbnRfOHQgczJbTl9CTE9DS107Ci0gICAgaWYgKChyICYgMSkpIHsKLSAgICAgIHVwZGF0ZV9kZWNyeXB0X2tleV8yNTYob19rZXksICZyYyk7Ci0gICAgICBjb3B5X2FuZF9rZXkoczIsIHMxLCBvX2tleSArIDE2KTsKLSAgICB9IGVsc2UKLSAgICAgIGNvcHlfYW5kX2tleShzMiwgczEsIG9fa2V5KTsKLSAgICBpbnZfbWl4X3N1Yl9jb2x1bW5zKHMxLCBzMik7Ci0gIH0KLSNlbmRpZgotICBjb3B5X2FuZF9rZXkob3V0LCBzMSwgb19rZXkpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWNrL2NyeXB0b190b29sYm94L2Flcy5oIGIvc3RhY2svY3J5cHRvX3Rvb2xib3gvYWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjZmYmQuLjAwMDAwMDAKLS0tIGEvc3RhY2svY3J5cHRvX3Rvb2xib3gvYWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCwgQnJpYW4gR2xhZG1hbiwgV29yY2VzdGVyLCBVSy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIExJQ0VOU0UgVEVSTVMKLQotIFRoZSByZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgKHdpdGggb3Igd2l0aG91dCBjaGFuZ2VzKQotIGlzIGFsbG93ZWQgd2l0aG91dCB0aGUgcGF5bWVudCBvZiBmZWVzIG9yIHJveWFsdGllcyBwcm92aWRlZCB0aGF0OgotCi0gIDEuIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKLQotICAyLiBiaW5hcnkgZGlzdHJpYnV0aW9ucyBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKLSAgICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZWlyIGRvY3VtZW50YXRpb247Ci0KLSAgMy4gdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cwotICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0gRElTQ0xBSU1FUgotCi0gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCi0gaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGNvcnJlY3RuZXNzCi0gYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSXNzdWUgMDkvMDkvMjAwNgotCi0gVGhpcyBpcyBhbiBBRVMgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIG9ubHkgOC1iaXQgYnl0ZSBvcGVyYXRpb25zIG9uIHRoZQotIGNpcGhlciBzdGF0ZS4KLSAqLwotCi0jaWZuZGVmIEFFU19ICi0jZGVmaW5lIEFFU19ICi0KLSNpZiAxCi0jZGVmaW5lIEFFU19FTkNfUFJFS0VZRUQgLyogQUVTIGVuY3J5cHRpb24gd2l0aCBhIHByZWNvbXB1dGVkIGtleSBzY2hlZHVsZSAgKi8KLSNlbmRpZgotI2lmIDEKLSNkZWZpbmUgQUVTX0RFQ19QUkVLRVlFRCAvKiBBRVMgZGVjcnlwdGlvbiB3aXRoIGEgcHJlY29tcHV0ZWQga2V5IHNjaGVkdWxlICAqLwotI2VuZGlmCi0jaWYgMQotI2RlZmluZSBBRVNfRU5DXzEyOF9PVEZLIC8qIEFFUyBlbmNyeXB0aW9uIHdpdGggJ29uIHRoZSBmbHknIDEyOCBiaXQga2V5aW5nICovCi0jZW5kaWYKLSNpZiAxCi0jZGVmaW5lIEFFU19ERUNfMTI4X09URksgLyogQUVTIGRlY3J5cHRpb24gd2l0aCAnb24gdGhlIGZseScgMTI4IGJpdCBrZXlpbmcgKi8KLSNlbmRpZgotI2lmIDEKLSNkZWZpbmUgQUVTX0VOQ18yNTZfT1RGSyAvKiBBRVMgZW5jcnlwdGlvbiB3aXRoICdvbiB0aGUgZmx5JyAyNTYgYml0IGtleWluZyAqLwotI2VuZGlmCi0jaWYgMQotI2RlZmluZSBBRVNfREVDXzI1Nl9PVEZLIC8qIEFFUyBkZWNyeXB0aW9uIHdpdGggJ29uIHRoZSBmbHknIDI1NiBiaXQga2V5aW5nICovCi0jZW5kaWYKLQotI2RlZmluZSBOX1JPVyA0Ci0jZGVmaW5lIE5fQ09MIDQKLSNkZWZpbmUgTl9CTE9DSyAoTl9ST1cgKiBOX0NPTCkKLSNkZWZpbmUgTl9NQVhfUk9VTkRTIDE0Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50Xzh0OwotCi10eXBlZGVmIHVpbnRfOHQgcmV0dXJuX3R5cGU7Ci0KLS8qICBXYXJuaW5nOiBUaGUga2V5IGxlbmd0aCBmb3IgMjU2IGJpdCBrZXlzIG92ZXJmbG93cyBhIGJ5dGUKLSAgICAoc2VlIGNvbW1lbnQgYmVsb3cpCi0qLwotCi10eXBlZGVmIHVpbnRfOHQgbGVuZ3RoX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludF84dCBrc2NoWyhOX01BWF9ST1VORFMgKyAxKSAqIE5fQkxPQ0tdOwotICB1aW50Xzh0IHJuZDsKLX0gYWVzX2NvbnRleHQ7Ci0KLS8qICBUaGUgZm9sbG93aW5nIGNhbGxzIGFyZSBmb3IgYSBwcmVjb21wdXRlZCBrZXkgc2NoZWR1bGUKLQotICAgIE5PVEU6IElmIHRoZSBsZW5ndGhfdHlwZSB1c2VkIGZvciB0aGUga2V5IGxlbmd0aCBpcyBhbgotICAgIHVuc2lnbmVkIDgtYml0IGNoYXJhY3RlciwgYSBrZXkgbGVuZ3RoIG9mIDI1NiBiaXRzIG11c3QKLSAgICBiZSBlbnRlcmVkIGFzIGEgbGVuZ3RoIGluIGJ5dGVzICh2YWxpZCBpbnB1dHMgYXJlIGhlbmNlCi0gICAgMTI4LCAxOTIsIDE2LCAyNCBhbmQgMzIpLgotKi8KLQotI2lmIGRlZmluZWQoQUVTX0VOQ19QUkVLRVlFRCkgfHwgZGVmaW5lZChBRVNfREVDX1BSRUtFWUVEKQotCi1yZXR1cm5fdHlwZSBhZXNfc2V0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyIGtleVtdLCBsZW5ndGhfdHlwZSBrZXlsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBhZXNfY29udGV4dCBjdHhbMV0pOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFFU19FTkNfUFJFS0VZRUQpCi0KLXJldHVybl90eXBlIGFlc19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dFtOX0JMT0NLXSwgY29uc3QgYWVzX2NvbnRleHQgY3R4WzFdKTsKLQotcmV0dXJuX3R5cGUgYWVzX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLCB1bnNpZ25lZCBjaGFyKiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5fYmxvY2ssIHVuc2lnbmVkIGNoYXIgaXZbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWVzX2NvbnRleHQgY3R4WzFdKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfREVDX1BSRUtFWUVEKQotCi1yZXR1cm5fdHlwZSBhZXNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sIGNvbnN0IGFlc19jb250ZXh0IGN0eFsxXSk7Ci0KLXJldHVybl90eXBlIGFlc19jYmNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgdW5zaWduZWQgY2hhciogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuX2Jsb2NrLCB1bnNpZ25lZCBjaGFyIGl2W05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFlc19jb250ZXh0IGN0eFsxXSk7Ci0jZW5kaWYKLQotLyogIFRoZSBmb2xsb3dpbmcgY2FsbHMgYXJlIGZvciAnb24gdGhlIGZseScga2V5aW5nLiAgSW4gdGhpcyBjYXNlIHRoZQotICAgIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24ga2V5cyBhcmUgZGlmZmVyZW50LgotCi0gICAgVGhlIGVuY3J5cHRpb24gc3Vicm91dGluZXMgdGFrZSBhIGtleSBpbiBhbiBhcnJheSBvZiBieXRlcyBpbgotICAgIGtleVtMXSB3aGVyZSBMIGlzIDE2LCAyNCBvciAzMiBieXRlcyBmb3Iga2V5IGxlbmd0aHMgb2YgMTI4LAotICAgIDE5MiwgYW5kIDI1NiBiaXRzIHJlc3BlY3RpdmVseS4gIFRoZXkgdGhlbiBlbmNyeXB0cyB0aGUgaW5wdXQKLSAgICBkYXRhLCBpbltdIHdpdGggdGhpcyBrZXkgYW5kIHB1dCB0aGUgcmV1bHQgaW4gdGhlIG91dHB1dCBhcnJheQotICAgIG91dFtdLiAgSW4gYWRkaXRpb24sIHRoZSBzZWNvbmQga2V5IGFycmF5LCBvX2tleVtMXSwgaXMgdXNlZAotICAgIHRvIG91dHB1dCB0aGUga2V5IHRoYXQgaXMgbmVlZGVkIGJ5IHRoZSBkZWNyeXB0aW9uIHN1YnJvdXRpbmUKLSAgICB0byByZXZlcnNlIHRoZSBlbmNyeXB0aW9uIG9wZXJhdGlvbi4gIFRoZSB0d28ga2V5IGFycmF5cyBjYW4KLSAgICBiZSB0aGUgc2FtZSBhcnJheSBidXQgaW4gdGhpcyBjYXNlIHRoZSBvcmlnaW5hbCBrZXkgd2lsbCBiZQotICAgIG92ZXJ3cml0dGVuLgotCi0gICAgSW4gdGhlIHNhbWUgd2F5LCB0aGUgZGVjcnlwdGlvbiBzdWJyb3V0aW5lcyBvdXRwdXQga2V5cyB0aGF0Ci0gICAgY2FuIGJlIHVzZWQgdG8gcmV2ZXJzZSB0aGVpciBlZmZlY3Qgd2hlbiB1c2VkIGZvciBlbmNyeXB0aW9uLgotCi0gICAgT25seSAxMjggYW5kIDI1NiBiaXQga2V5cyBhcmUgc3VwcG9ydGVkIGluIHRoZXNlICdvbiB0aGUgZmx5JwotICAgIG1vZGVzLgotKi8KLQotI2lmIGRlZmluZWQoQUVTX0VOQ18xMjhfT1RGSykKLXZvaWQgYWVzX2VuY3J5cHRfMTI4KGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5bTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG91dFtOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5W05fQkxPQ0tdLCB1aW50Xzh0IG9fa2V5W05fQkxPQ0tdKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfREVDXzEyOF9PVEZLKQotdm9pZCBhZXNfZGVjcnlwdF8xMjgoY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG9fa2V5W05fQkxPQ0tdKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBRVNfRU5DXzI1Nl9PVEZLKQotdm9pZCBhZXNfZW5jcnlwdF8yNTYoY29uc3QgdW5zaWduZWQgY2hhciBpbltOX0JMT0NLXSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3V0W05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbMiAqIE5fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvX2tleVsyICogTl9CTE9DS10pOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFFU19ERUNfMjU2X09URkspCi12b2lkIGFlc19kZWNyeXB0XzI1Nihjb25zdCB1bnNpZ25lZCBjaGFyIGluW05fQkxPQ0tdLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvdXRbTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVsyICogTl9CTE9DS10sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG9fa2V5WzIgKiBOX0JMT0NLXSk7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9jcnlwdG9fdG9vbGJveC9hZXNfY21hYy5jYyBiL3N0YWNrL2NyeXB0b190b29sYm94L2Flc19jbWFjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2UxMWRhLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2NyeXB0b190b29sYm94L2Flc19jbWFjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDgtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQUVTMTI4IGFuZCBBRVMgQ01BQyBhbGdvcml0aG0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgInN0YWNrL2NyeXB0b190b29sYm94L2Flcy5oIgotI2luY2x1ZGUgInN0YWNrL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLQotbmFtZXNwYWNlIGNyeXB0b190b29sYm94IHsKLQotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90KiB0ZXh0OwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQxNl90IHJvdW5kOwotfSB0Q01BQ19DQjsKLQotdGhyZWFkX2xvY2FsIHRDTUFDX0NCIGNtYWNfY2I7Ci0KLS8qIFJiIGZvciBBRVMtMTI4IGFzIGJsb2NrIGNpcGhlciwgTFNCIGFzIFswXSAqLwotT2N0ZXQxNiBjb25zdF9SYnsweDg3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotLyoqIHV0aWxpdHkgZnVuY3Rpb24gdG8gZG8gYW4gYml0ZWlzZSBleGNsdXNpdmUtT1Igb2YgdHdvIGJpdCBzdHJpbmdzIG9mIHRoZQotICogbGVuZ3RoIG9mIE9DVEVUMTZfTEVOLiBSZXN1bHQgaXMgc3RvcmVkIGluIGZpcnN0IGFyZ3VtZW50LgotICovCi1zdGF0aWMgdm9pZCB4b3JfMTI4KE9jdGV0MTYqIGEsIGNvbnN0IE9jdGV0MTYmIGIpIHsKLSAgQ0hFQ0soYSk7Ci0gIHVpbnQ4X3QgaSwgKmFhID0gYS0+ZGF0YSgpOwotICBjb25zdCB1aW50OF90KiBiYiA9IGIuZGF0YSgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBPQ1RFVDE2X0xFTjsgaSsrKSB7Ci0gICAgYWFbaV0gPSBhYVtpXSBeIGJiW2ldOwotICB9Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotLyogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBBRVNfMTI4KGtleSwgbWVzc2FnZSkgKi8KLU9jdGV0MTYgYWVzXzEyOChjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IE9jdGV0MTYmIG1lc3NhZ2UpIHsKLSAgT2N0ZXQxNiBrZXlfcmV2ZXJzZWQ7Ci0gIE9jdGV0MTYgbWVzc2FnZV9yZXZlcnNlZDsKLSAgT2N0ZXQxNiBvdXRwdXQ7Ci0KLSAgc3RkOjpyZXZlcnNlX2NvcHkoa2V5LmJlZ2luKCksIGtleS5lbmQoKSwga2V5X3JldmVyc2VkLmJlZ2luKCkpOwotICBzdGQ6OnJldmVyc2VfY29weShtZXNzYWdlLmJlZ2luKCksIG1lc3NhZ2UuZW5kKCksIG1lc3NhZ2VfcmV2ZXJzZWQuYmVnaW4oKSk7Ci0KLSAgYWVzX2NvbnRleHQgY3R4OwotICBhZXNfc2V0X2tleShrZXlfcmV2ZXJzZWQuZGF0YSgpLCBrZXlfcmV2ZXJzZWQuc2l6ZSgpLCAmY3R4KTsKLSAgYWVzX2VuY3J5cHQobWVzc2FnZV9yZXZlcnNlZC5kYXRhKCksIG91dHB1dC5kYXRhKCksICZjdHgpOwotCi0gIHN0ZDo6cmV2ZXJzZShvdXRwdXQuYmVnaW4oKSwgb3V0cHV0LmVuZCgpKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotLyoqIHV0aWxpdHkgZnVuY3Rpb24gdG8gcGFkZGluZyB0aGUgZ2l2ZW4gdGV4dCB0byBiZSBhIDEyOCBiaXRzIGRhdGEuIFRoZQotICogcGFyYW1ldGVyIGRlc3QgaXMgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIsIGl0IG11c3QgcG9pbnQgdG8gYQotICogT0NURVQxNl9MRU4gbWVtb3J5IHNwYWNlOyB3aGVyZSBpbmNsdWRlIGxlbmd0aCBieXRlcyB2YWxpZCBkYXRhLiAqLwotc3RhdGljIHZvaWQgcGFkZGluZyhPY3RldDE2KiBkZXN0LCB1aW50OF90IGxlbmd0aCkgewotICB1aW50OF90IGksICpwID0gZGVzdC0+ZGF0YSgpOwotICAvKiBvcmlnaW5hbCBsYXN0IGJsb2NrICovCi0gIGZvciAoaSA9IGxlbmd0aDsgaSA8IE9DVEVUMTZfTEVOOyBpKyspCi0gICAgcFtPQ1RFVDE2X0xFTiAtIGkgLSAxXSA9IChpID09IGxlbmd0aCkgPyAweDgwIDogMDsKLX0KLQotLyoqIHV0aWxpdHkgZnVuY3Rpb24gdG8gbGVmdCBzaGlmdCBvbmUgYml0IGZvciBhIDEyOCBiaXRzIHZhbHVlLiAqLwotc3RhdGljIHZvaWQgbGVmdHNoaWZ0X29uZWJpdCh1aW50OF90KiBpbnB1dCwgdWludDhfdCogb3V0cHV0KSB7Ci0gIHVpbnQ4X3QgaSwgb3ZlcmZsb3cgPSAwLCBuZXh0X292ZXJmbG93ID0gMDsKLSAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gIC8qIGlucHV0WzBdIGlzIExTQiAqLwotICBmb3IgKGkgPSAwOyBpIDwgT0NURVQxNl9MRU47IGkrKykgewotICAgIG5leHRfb3ZlcmZsb3cgPSAoaW5wdXRbaV0gJiAweDgwKSA/IDEgOiAwOwotICAgIG91dHB1dFtpXSA9IChpbnB1dFtpXSA8PCAxKSB8IG92ZXJmbG93OwotICAgIG92ZXJmbG93ID0gbmV4dF9vdmVyZmxvdzsKLSAgfQotICByZXR1cm47Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjYWxjdWxhdGlvbiBvZiBibG9jayBjaXBoZXIgdXNpbmcgQUVTLTEyOC4gKi8KLXN0YXRpYyBPY3RldDE2IGNtYWNfYWVzX2tfY2FsY3VsYXRlKGNvbnN0IE9jdGV0MTYmIGtleSkgewotICBPY3RldDE2IG91dHB1dDsKLSAgT2N0ZXQxNiB4ezB9OyAgLy8gemVybyBpbml0aWFsaXplZAotCi0gIERWTE9HKDIpIDw8IF9fZnVuY19fOwotCi0gIHVpbnQ4X3QgaSA9IDE7Ci0gIHdoaWxlIChpIDw9IGNtYWNfY2Iucm91bmQpIHsKLSAgICAvKiBNaScgOj0gTWkgKCspIFggICovCi0gICAgeG9yXzEyOCgoT2N0ZXQxNiopJmNtYWNfY2IudGV4dFsoY21hY19jYi5yb3VuZCAtIGkpICogT0NURVQxNl9MRU5dLCB4KTsKLQotICAgIG91dHB1dCA9IGFlc18xMjgoa2V5LCAmY21hY19jYi50ZXh0WyhjbWFjX2NiLnJvdW5kIC0gaSkgKiBPQ1RFVDE2X0xFTl0sCi0gICAgICAgICAgICAgICAgICAgICBPQ1RFVDE2X0xFTik7Ci0gICAgeCA9IG91dHB1dDsKLSAgICBpKys7Ci0gIH0KLQotICByZXR1cm4gb3V0cHV0OwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBwcm9jZWVlZCB0byBwcmVwYXJlIHRoZSBsYXN0IGJsb2NrIG9mIG1lc3NhZ2UgTW4gZGVwZW5kaW5nIG9uCi0gKiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAqLwotc3RhdGljIHZvaWQgY21hY19wcmVwYXJlX2xhc3RfYmxvY2soY29uc3QgT2N0ZXQxNiYgazEsIGNvbnN0IE9jdGV0MTYmIGsyKSB7Ci0gIC8vICAgIHVpbnQ4X3QgICAgIHhbMTZdID0gezB9OwotICBib29sIGZsYWc7Ci0KLSAgRFZMT0coMikgPDwgX19mdW5jX187Ci0gIC8qIGxhc3QgYmxvY2sgaXMgYSBjb21wbGV0ZSBibG9jayBzZXQgZmxhZyB0byAxICovCi0gIGZsYWcgPSAoKGNtYWNfY2IubGVuICUgT0NURVQxNl9MRU4pID09IDAgJiYgY21hY19jYi5sZW4gIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLSAgRFZMT0coMikgPDwgImZsYWc9IiA8PCBmbGFnIDw8ICIgcm91bmQ9IiA8PCBjbWFjX2NiLnJvdW5kOwotCi0gIGlmIChmbGFnKSB7IC8qIGxhc3QgYmxvY2sgaXMgY29tcGxldGUgYmxvY2sgKi8KLSAgICB4b3JfMTI4KChPY3RldDE2KikmY21hY19jYi50ZXh0WzBdLCBrMSk7Ci0gIH0gZWxzZSAvKiBwYWRkaW5nIHRoZW4geG9yIHdpdGggazIgKi8KLSAgewotICAgIHBhZGRpbmcoKE9jdGV0MTYqKSZjbWFjX2NiLnRleHRbMF0sICh1aW50OF90KShjbWFjX2NiLmxlbiAlIDE2KSk7Ci0KLSAgICB4b3JfMTI4KChPY3RldDE2KikmY21hY19jYi50ZXh0WzBdLCBrMik7Ci0gIH0KLX0KLQotLyoqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSB0d28gc3Via2V5cy4KLSAqIHxrZXl8IGlzIENNQUMga2V5LCBleHBlY3QgU1JLIHdoZW4gdXNlZCBieSBTTVAuCi0gKi8KLXN0YXRpYyB2b2lkIGNtYWNfZ2VuZXJhdGVfc3Via2V5KGNvbnN0IE9jdGV0MTYmIGtleSkgewotICBEVkxPRygyKSA8PCBfX2Z1bmNfXzsKLQotICBPY3RldDE2IHplcm97fTsKLSAgT2N0ZXQxNiBwID0gYWVzXzEyOChrZXksIHplcm8uZGF0YSgpLCBPQ1RFVDE2X0xFTik7Ci0KLSAgT2N0ZXQxNiBrMSwgazI7Ci0gIHVpbnQ4X3QqIHBwID0gcC5kYXRhKCk7Ci0KLSAgLyogSWYgTVNCKEwpID0gMCwgdGhlbiBLMSA9IEwgPDwgMSAqLwotICBpZiAoKHBwW09DVEVUMTZfTEVOIC0gMV0gJiAweDgwKSAhPSAwKSB7Ci0gICAgLyogRWxzZSBLMSA9ICggTCA8PCAxICkgKCspIFJiICovCi0gICAgbGVmdHNoaWZ0X29uZWJpdChwcCwgazEuZGF0YSgpKTsKLSAgICB4b3JfMTI4KCZrMSwgY29uc3RfUmIpOwotICB9IGVsc2UgewotICAgIGxlZnRzaGlmdF9vbmViaXQocHAsIGsxLmRhdGEoKSk7Ci0gIH0KLQotICBpZiAoKGsxW09DVEVUMTZfTEVOIC0gMV0gJiAweDgwKSAhPSAwKSB7Ci0gICAgLyogSzIgPSAgKEsxIDw8IDEpICgrKSBSYiAqLwotICAgIGxlZnRzaGlmdF9vbmViaXQoazEuZGF0YSgpLCBrMi5kYXRhKCkpOwotICAgIHhvcl8xMjgoJmsyLCBjb25zdF9SYik7Ci0gIH0gZWxzZSB7Ci0gICAgLyogSWYgTVNCKEsxKSA9IDAsIHRoZW4gSzIgPSBLMSA8PCAxICovCi0gICAgbGVmdHNoaWZ0X29uZWJpdChrMS5kYXRhKCksIGsyLmRhdGEoKSk7Ci0gIH0KLQotICBjbWFjX3ByZXBhcmVfbGFzdF9ibG9jayhrMSwgazIpOwotfQotCi0vKioga2V5IC0gQ01BQyBrZXkgaW4gbGl0dGxlIGVuZGlhbiBvcmRlcgotICogIGlucHV0IC0gdGV4dCB0byBiZSBzaWduZWQgaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgotICogIGxlbmd0aCAtIGxlbmd0aCBvZiB0aGUgaW5wdXQgaW4gYnl0ZS4KLSAqLwotT2N0ZXQxNiBhZXNfY21hYyhjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCB1aW50MTZfdCBsZW5ndGgpIHsKLSAgdWludDMyX3QgbGVuOwotICB1aW50MTZfdCBkaWZmOwotICAvKiBuIGlzIG51bWJlciBvZiByb3VuZHMgKi8KLSAgdWludDE2X3QgbiA9IChsZW5ndGggKyBPQ1RFVDE2X0xFTiAtIDEpIC8gT0NURVQxNl9MRU47Ci0KLSAgRFZMT0coMikgPDwgX19mdW5jX187Ci0KLSAgaWYgKG4gPT0gMCkgbiA9IDE7Ci0gIGxlbiA9IG4gKiBPQ1RFVDE2X0xFTjsKLQotICBEVkxPRygyKSA8PCAiQUVTMTI4X0NNQUMgc3RhcnRlZCwgYWxsb2NhdGUgYnVmZmVyIHNpemU9IiA8PCBsZW47Ci0gIC8qIGFsbG9jYXRlIGEgbWVtb3J5IHNwYWNlIG9mIG11bHRpcGxlIG9mIDE2IGJ5dGVzIHRvIGhvbGQgdGV4dCAgKi8KLSAgY21hY19jYi50ZXh0ID0gKHVpbnQ4X3QqKWFsbG9jYShsZW4pOwotICBjbWFjX2NiLnJvdW5kID0gbjsKLSAgZGlmZiA9IGxlbiAtIGxlbmd0aDsKLQotICBpZiAoaW5wdXQgIT0gTlVMTCAmJiBsZW5ndGggPiAwKSB7Ci0gICAgbWVtY3B5KCZjbWFjX2NiLnRleHRbZGlmZl0sIGlucHV0LCAoaW50KWxlbmd0aCk7Ci0gICAgY21hY19jYi5sZW4gPSBsZW5ndGg7Ci0gIH0gZWxzZSB7Ci0gICAgY21hY19jYi5sZW4gPSAwOwotICB9Ci0KLSAgLyogcHJlcGFyZSBjYWxjdWxhdGlvbiBmb3Igc3Via2V5IHMgYW5kIGxhc3QgYmxvY2sgb2YgZGF0YSAqLwotICBjbWFjX2dlbmVyYXRlX3N1YmtleShrZXkpOwotICAvKiBzdGFydCBjYWxjdWxhdGlvbiAqLwotICBPY3RldDE2IHNpZ25hdHVyZSA9IGNtYWNfYWVzX2tfY2FsY3VsYXRlKGtleSk7Ci0KLSAgLyogY2xlYW4gdXAgKi8KLSAgbWVtc2V0KCZjbWFjX2NiLCAwLCBzaXplb2YodENNQUNfQ0IpKTsKLSAgLy8gY21hY19jYi50ZXh0IGlzIGF1dG8tZnJlZWQgYnkgYWxsb2NhCi0KLSAgcmV0dXJuIHNpZ25hdHVyZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNyeXB0b190b29sYm94CmRpZmYgLS1naXQgYS9zdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5jYyBiL3N0YWNrL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY4MTZhLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9hZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotCi11c2luZyBiYXNlOjpIZXhFbmNvZGU7Ci0KLW5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveCB7Ci0KLU9jdGV0MTYgaDYoY29uc3QgT2N0ZXQxNiYgdywgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlpZCkgewotICByZXR1cm4gYWVzX2NtYWModywga2V5aWQuZGF0YSgpLCBrZXlpZC5zaXplKCkpOwotfQotCi1PY3RldDE2IGg3KGNvbnN0IE9jdGV0MTYmIHNhbHQsIGNvbnN0IE9jdGV0MTYmIHcpIHsKLSAgcmV0dXJuIGFlc19jbWFjKHNhbHQsIHcuZGF0YSgpLCB3LnNpemUoKSk7Ci19Ci0KLU9jdGV0MTYgZjQoY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgY29uc3QgT2N0ZXQxNiYgeCwgdWludDhfdCB6KSB7Ci0gIGNvbnN0ZXhwciBzaXplX3QgbXNnX2xlbiA9IEJUX09DVEVUMzJfTEVOIC8qIFUgc2l6ZSAqLyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX09DVEVUMzJfTEVOIC8qIFYgc2l6ZSAqLyArIDEgLyogWiBzaXplICovOwotCi0gIERWTE9HKDIpIDw8ICJVPSIgPDwgSGV4RW5jb2RlKHUsIEJUX09DVEVUMzJfTEVOKQotICAgICAgICAgICA8PCAiLCBWPSIgPDwgSGV4RW5jb2RlKHYsIEJUX09DVEVUMzJfTEVOKQotICAgICAgICAgICA8PCAiLCBYPSIgPDwgSGV4RW5jb2RlKHguZGF0YSgpLCB4LnNpemUoKSkgPDwgIiwgWj0iIDw8IHN0ZDo6aGV4Ci0gICAgICAgICAgIDw8ICt6OwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgbXNnX2xlbj4gbXNnOwotICBhdXRvIGl0ID0gbXNnLmJlZ2luKCk7Ci0gIGl0ID0gc3RkOjpjb3B5KCZ6LCAmeiArIDEsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkodiwgdiArIEJUX09DVEVUMzJfTEVOLCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KHUsIHUgKyBCVF9PQ1RFVDMyX0xFTiwgaXQpOwotICByZXR1cm4gYWVzX2NtYWMoeCwgbXNnLmRhdGEoKSwgbXNnLnNpemUoKSk7Ci19Ci0KLS8qKiBoZWxwZXIgZm9yIGY1ICovCi1zdGF0aWMgT2N0ZXQxNiBjYWxjdWxhdGVfbWFjX2tleV9vcl9sdGsoY29uc3QgT2N0ZXQxNiYgdCwgdWludDhfdCBjb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleV9pZCwgY29uc3QgT2N0ZXQxNiYgbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgbjIsIHVpbnQ4X3QqIGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGEyLCB1aW50OF90KiBsZW5ndGgpIHsKLSAgY29uc3RleHByIHNpemVfdCBtc2dfbGVuID0gMSAvKiBDb3VudGVyIHNpemUgKi8gKyA0IC8qIGtleUlEIHNpemUgKi8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ1RFVDE2X0xFTiAvKiBOMSBzaXplICovICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NURVQxNl9MRU4gLyogTjIgc2l6ZSAqLyArIDcgLyogQTEgc2l6ZSovICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAvKiBBMiBzaXplKi8gKyAyIC8qIExlbmd0aCBzaXplICovOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIG1zZ19sZW4+IG1zZzsKLSAgYXV0byBpdCA9IG1zZy5iZWdpbigpOwotICBpdCA9IHN0ZDo6Y29weShsZW5ndGgsIGxlbmd0aCArIDIsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkoYTIsIGEyICsgNywgaXQpOwotICBpdCA9IHN0ZDo6Y29weShhMSwgYTEgKyA3LCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KG4yLmJlZ2luKCksIG4yLmVuZCgpLCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KG4xLmJlZ2luKCksIG4xLmVuZCgpLCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KGtleV9pZCwga2V5X2lkICsgNCwgaXQpOwotICBpdCA9IHN0ZDo6Y29weSgmY291bnRlciwgJmNvdW50ZXIgKyAxLCBpdCk7Ci0KLSAgcmV0dXJuIGFlc19jbWFjKHQsIG1zZy5kYXRhKCksIG1zZy5zaXplKCkpOwotfQotCi12b2lkIGY1KGNvbnN0IHVpbnQ4X3QqIHcsIGNvbnN0IE9jdGV0MTYmIG4xLCBjb25zdCBPY3RldDE2JiBuMiwgdWludDhfdCogYTEsCi0gICAgICAgIHVpbnQ4X3QqIGEyLCBPY3RldDE2KiBtYWNfa2V5LCBPY3RldDE2KiBsdGspIHsKLSAgRFZMT0coMikgPDwgX19mdW5jX18gPDwgIlc9IiA8PCBIZXhFbmNvZGUodywgQlRfT0NURVQzMl9MRU4pCi0gICAgICAgICAgIDw8ICIsIE4xPSIgPDwgSGV4RW5jb2RlKG4xLmRhdGEoKSwgbjEuc2l6ZSgpKQotICAgICAgICAgICA8PCAiLCBOMj0iIDw8IEhleEVuY29kZShuMi5kYXRhKCksIG4yLnNpemUoKSkKLSAgICAgICAgICAgPDwgIiwgQTE9IiA8PCBIZXhFbmNvZGUoYTEsIDcpIDw8ICIsIEEyPSIgPDwgSGV4RW5jb2RlKGEyLCA3KTsKLQotICBjb25zdCBPY3RldDE2IHNhbHR7MHhCRSwgMHg4MywgMHg2MCwgMHg1QSwgMHhEQiwgMHgwQiwgMHgzNywgMHg2MCwKLSAgICAgICAgICAgICAgICAgICAgIDB4MzgsIDB4QTUsIDB4RjUsIDB4QUEsIDB4OTEsIDB4ODMsIDB4ODgsIDB4NkN9OwotICBPY3RldDE2IHQgPSBhZXNfY21hYyhzYWx0LCB3LCBCVF9PQ1RFVDMyX0xFTik7Ci0KLSAgRFZMT0coMikgPDwgIlQ9IiA8PCBIZXhFbmNvZGUodC5kYXRhKCksIHQuc2l6ZSgpKTsKLQotICB1aW50OF90IGtleV9pZFs0XSA9IHsweDY1LCAweDZjLCAweDc0LCAweDYyfTsgLyogMHg2Mjc0NmM2NSAqLwotICB1aW50OF90IGxlbmd0aFsyXSA9IHsweDAwLCAweDAxfTsgICAgICAgICAgICAgLyogMHgwMTAwICovCi0KLSAgKm1hY19rZXkgPSBjYWxjdWxhdGVfbWFjX2tleV9vcl9sdGsodCwgMCwga2V5X2lkLCBuMSwgbjIsIGExLCBhMiwgbGVuZ3RoKTsKLQotICAqbHRrID0gY2FsY3VsYXRlX21hY19rZXlfb3JfbHRrKHQsIDEsIGtleV9pZCwgbjEsIG4yLCBhMSwgYTIsIGxlbmd0aCk7Ci0KLSAgRFZMT0coMikgPDwgIm1hY19rZXk9IiA8PCBIZXhFbmNvZGUobWFjX2tleS0+ZGF0YSgpLCBtYWNfa2V5LT5zaXplKCkpOwotICBEVkxPRygyKSA8PCAibHRrPSIgPDwgSGV4RW5jb2RlKGx0ay0+ZGF0YSgpLCBsdGstPnNpemUoKSk7Ci19Ci0KLU9jdGV0MTYgZjYoY29uc3QgT2N0ZXQxNiYgdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgICAgICAgICBjb25zdCBPY3RldDE2JiByLCB1aW50OF90KiBpb2NhcCwgdWludDhfdCogYTEsIHVpbnQ4X3QqIGEyKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgbXNnX2xlbiA9IE9DVEVUMTZfTEVOIC8qIE4xIHNpemUgKi8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICBPQ1RFVDE2X0xFTiAvKiBOMiBzaXplICovICsgT0NURVQxNl9MRU4gLyogUiBzaXplICovICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMyAvKiBJT2NhcCBzaXplICovICsgNyAvKiBBMSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyA3IC8qIEEyIHNpemUqLzsKLQotICBEVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiVz0iIDw8IEhleEVuY29kZSh3LmRhdGEoKSwgdy5zaXplKCkpCi0gICAgICAgICAgIDw8ICIsIE4xPSIgPDwgSGV4RW5jb2RlKG4xLmRhdGEoKSwgbjEuc2l6ZSgpKQotICAgICAgICAgICA8PCAiLCBOMj0iIDw8IEhleEVuY29kZShuMi5kYXRhKCksIG4yLnNpemUoKSkKLSAgICAgICAgICAgPDwgIiwgUj0iIDw8IEhleEVuY29kZShyLmRhdGEoKSwgci5zaXplKCkpCi0gICAgICAgICAgIDw8ICIsIElPY2FwPSIgPDwgSGV4RW5jb2RlKGlvY2FwLCAzKSA8PCAiLCBBMT0iIDw8IEhleEVuY29kZShhMSwgNykKLSAgICAgICAgICAgPDwgIiwgQTI9IiA8PCBIZXhFbmNvZGUoYTIsIDcpOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgbXNnX2xlbj4gbXNnOwotICBhdXRvIGl0ID0gbXNnLmJlZ2luKCk7Ci0gIGl0ID0gc3RkOjpjb3B5KGEyLCBhMiArIDcsIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkoYTEsIGExICsgNywgaXQpOwotICBpdCA9IHN0ZDo6Y29weShpb2NhcCwgaW9jYXAgKyAzLCBpdCk7Ci0gIGl0ID0gc3RkOjpjb3B5KHIuYmVnaW4oKSwgci5lbmQoKSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weShuMi5iZWdpbigpLCBuMi5lbmQoKSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weShuMS5iZWdpbigpLCBuMS5lbmQoKSwgaXQpOwotCi0gIHJldHVybiBhZXNfY21hYyh3LCBtc2cuZGF0YSgpLCBtc2cuc2l6ZSgpKTsKLX0KLQotdWludDMyX3QgZzIoY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgY29uc3QgT2N0ZXQxNiYgeCwKLSAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHkpIHsKLSAgY29uc3RleHByIHNpemVfdCBtc2dfbGVuID0gQlRfT0NURVQzMl9MRU4gLyogVSBzaXplICovICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT0NURVQzMl9MRU4gLyogViBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT0NURVQxNl9MRU4gLyogWSBzaXplICovOwotCi0gIERWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICJVPSIgPDwgSGV4RW5jb2RlKHUsIEJUX09DVEVUMzJfTEVOKQotICAgICAgICAgICA8PCAiLCBWPSIgPDwgSGV4RW5jb2RlKHYsIEJUX09DVEVUMzJfTEVOKQotICAgICAgICAgICA8PCAiLCBYPSIgPDwgSGV4RW5jb2RlKHguZGF0YSgpLCB4LnNpemUoKSkKLSAgICAgICAgICAgPDwgIiwgWT0iIDw8IEhleEVuY29kZSh5LmRhdGEoKSwgeS5zaXplKCkpOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgbXNnX2xlbj4gbXNnOwotICBhdXRvIGl0ID0gbXNnLmJlZ2luKCk7Ci0gIGl0ID0gc3RkOjpjb3B5KHkuYmVnaW4oKSwgeS5lbmQoKSwgaXQpOwotICBpdCA9IHN0ZDo6Y29weSh2LCB2ICsgQlRfT0NURVQzMl9MRU4sIGl0KTsKLSAgaXQgPSBzdGQ6OmNvcHkodSwgdSArIEJUX09DVEVUMzJfTEVOLCBpdCk7Ci0KLSAgT2N0ZXQxNiBjbWFjID0gYWVzX2NtYWMoeCwgbXNnLmRhdGEoKSwgbXNnLnNpemUoKSk7Ci0KLSAgLyogdnJlcyA9IGNtYWMgbW9kIDIqKjMyIG1vZCAxMCoqNiAqLwotICB1aW50MzJfdCB2cmVzOwotICB1aW50OF90KiBwID0gY21hYy5kYXRhKCk7Ci0gIFNUUkVBTV9UT19VSU5UMzIodnJlcywgcCk7Ci0KLSAgdnJlcyA9IHZyZXMgJSAxMDAwMDAwOwotICByZXR1cm4gdnJlczsKLX0KLQotT2N0ZXQxNiBsdGtfdG9fbGlua19rZXkoY29uc3QgT2N0ZXQxNiYgbHRrLCBib29sIHVzZV9oNykgewotICBPY3RldDE2IGlsazsgLyogaW50ZXJtaWRpYXRlIGxpbmsga2V5ICovCi0gIGlmICh1c2VfaDcpIHsKLSAgICBjb25zdGV4cHIgT2N0ZXQxNiBzYWx0ezB4MzEsIDB4NzAsIDB4NkQsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgICBpbGsgPSBoNyhzYWx0LCBsdGspOwotICB9IGVsc2UgewotICAgIC8qICJ0bXAxIiBtYXBwaW5nIHRvIGV4dGVuZGVkIEFTQ0lJLCBsaXR0bGUgZW5kaWFuKi8KLSAgICBjb25zdGV4cHIgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlJRF90bXAxID0gezB4MzEsIDB4NzAsIDB4NkQsIDB4NzR9OwotICAgIGlsayA9IGg2KGx0aywga2V5SURfdG1wMSk7Ci0gIH0KLQotICAvKiAibGViciIgbWFwcGluZyB0byBleHRlbmRlZCBBU0NJSSwgbGl0dGxlIGVuZGlhbiAqLwotICBjb25zdGV4cHIgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlJRF9sZWJyID0gezB4NzIsIDB4NjIsIDB4NjUsIDB4NmN9OwotICByZXR1cm4gaDYoaWxrLCBrZXlJRF9sZWJyKTsKLX0KLQotT2N0ZXQxNiBsaW5rX2tleV90b19sdGsoY29uc3QgT2N0ZXQxNiYgbGlua19rZXksIGJvb2wgdXNlX2g3KSB7Ci0gIE9jdGV0MTYgaWx0azsgLyogaW50ZXJtaWRpYXRlIGxvbmcgdGVybSBrZXkgKi8KLSAgaWYgKHVzZV9oNykgewotICAgIGNvbnN0ZXhwciBPY3RldDE2IHNhbHR7MHgzMiwgMHg3MCwgMHg2RCwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICAgIGlsdGsgPSBoNyhzYWx0LCBsaW5rX2tleSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogInRtcDIiIG1hcHBpbmcgdG8gZXh0ZW5kZWQgQVNDSUksIGxpdHRsZSBlbmRpYW4gKi8KLSAgICBjb25zdGV4cHIgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlJRF90bXAyID0gezB4MzIsIDB4NzAsIDB4NkQsIDB4NzR9OwotICAgIGlsdGsgPSBoNihsaW5rX2tleSwga2V5SURfdG1wMik7Ci0gIH0KLQotICAvKiAiYnJsZSIgbWFwcGluZyB0byBleHRlbmRlZCBBU0NJSSwgbGl0dGxlIGVuZGlhbiAqLwotICBjb25zdGV4cHIgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlJRF9icmxlID0gezB4NjUsIDB4NmMsIDB4NzIsIDB4NjJ9OwotICByZXR1cm4gaDYoaWx0aywga2V5SURfYnJsZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveApkaWZmIC0tZ2l0IGEvc3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCBiL3N0YWNrL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjAxNTguLjAwMDAwMDAKLS0tIGEvc3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveCB7Ci0KLWV4dGVybiBPY3RldDE2IGFlc18xMjgoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCBPY3RldDE2JiBtZXNzYWdlKTsKLWV4dGVybiBPY3RldDE2IGFlc19jbWFjKGNvbnN0IE9jdGV0MTYmIGtleSwgY29uc3QgdWludDhfdCogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCk7Ci1leHRlcm4gT2N0ZXQxNiBmNChjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LAotICAgICAgICAgICAgICAgICAgdWludDhfdCB6KTsKLWV4dGVybiB2b2lkIGY1KGNvbnN0IHVpbnQ4X3QqIHcsIGNvbnN0IE9jdGV0MTYmIG4xLCBjb25zdCBPY3RldDE2JiBuMiwKLSAgICAgICAgICAgICAgIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMiwgT2N0ZXQxNiogbWFjX2tleSwgT2N0ZXQxNiogbHRrKTsKLWV4dGVybiBPY3RldDE2IGY2KGNvbnN0IE9jdGV0MTYmIHcsIGNvbnN0IE9jdGV0MTYmIG4xLCBjb25zdCBPY3RldDE2JiBuMiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHIsIHVpbnQ4X3QqIGlvY2FwLCB1aW50OF90KiBhMSwgdWludDhfdCogYTIpOwotZXh0ZXJuIE9jdGV0MTYgaDYoY29uc3QgT2N0ZXQxNiYgdywgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlpZCk7Ci1leHRlcm4gT2N0ZXQxNiBoNyhjb25zdCBPY3RldDE2JiBzYWx0LCBjb25zdCBPY3RldDE2JiB3KTsKLWV4dGVybiB1aW50MzJfdCBnMihjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHkpOwotZXh0ZXJuIE9jdGV0MTYgbHRrX3RvX2xpbmtfa2V5KGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcpOwotZXh0ZXJuIE9jdGV0MTYgbGlua19rZXlfdG9fbHRrKGNvbnN0IE9jdGV0MTYmIGxpbmtfa2V5LCBib29sIHVzZV9oNyk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgQUVTXzEyOChrZXksIG1lc3NhZ2UpLiB8a2V5fCBtdXN0IGJlIDEyOGJpdC4KLSAqIHxtZXNzYWdlfCBjYW4gYmUgYXQgbW9zdCAxNiBieXRlcyBsb25nLCBpdCdzIGxlbmd0aCBpbiBieXRlcyBpcyBnaXZlbiBpbgotICogfGxlbmd0aHwgKi8KLWlubGluZSBPY3RldDE2IGFlc18xMjgoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCB1aW50OF90KiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGxlbmd0aCkgewotICBDSEVDSyhsZW5ndGggPD0gT0NURVQxNl9MRU4pIDw8ICJ5b3UgdHJpZWQgYWVzXzEyOCBtb3JlIHRoYW4gMTYgYnl0ZXMhIjsKLSAgT2N0ZXQxNiBtc2d7MH07Ci0gIHN0ZDo6Y29weShtZXNzYWdlLCBtZXNzYWdlICsgbGVuZ3RoLCBtc2cuYmVnaW4oKSk7Ci0gIHJldHVybiBhZXNfMTI4KGtleSwgbXNnKTsKLX0KLQotLy8gfHRsZW58IC0gbGVudGggb2YgbWFjIGRlc2lyZWQKLS8vIHxwX3NpZ25hdHVyZXwgLSBkYXRhIHBvaW50ZXIgdG8gd2hlcmUgc2lnbmVkIGRhdGEgdG8gYmUgc3RvcmVkLCB0bGVuIGxvbmcuCi1pbmxpbmUgdm9pZCBhZXNfY21hYyhjb25zdCBPY3RldDE2JiBrZXksIGNvbnN0IHVpbnQ4X3QqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsIHVpbnQxNl90IHRsZW4sIHVpbnQ4X3QqIHBfc2lnbmF0dXJlKSB7Ci0gIE9jdGV0MTYgc2lnbmF0dXJlID0gYWVzX2NtYWMoa2V5LCBtZXNzYWdlLCBsZW5ndGgpOwotCi0gIHVpbnQ4X3QqIHBfbWFjID0gc2lnbmF0dXJlLmRhdGEoKSArIChPQ1RFVDE2X0xFTiAtIHRsZW4pOwotICBtZW1jcHkocF9zaWduYXR1cmUsIHBfbWFjLCB0bGVuKTsKLX0KLQotaW5saW5lIE9jdGV0MTYgYWVzX2NtYWMoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCBPY3RldDE2JiBtZXNzYWdlKSB7Ci0gIHJldHVybiBhZXNfY21hYyhrZXksIG1lc3NhZ2UuZGF0YSgpLCBtZXNzYWdlLnNpemUoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveApkaWZmIC0tZ2l0IGEvc3RhY2svZWF0dC9lYXR0LmNjIGIvc3RhY2svZWF0dC9lYXR0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDExMjZiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2VhdHQvZWF0dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZWF0dF9pbXBsLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi11c2luZyBibHVldG9vdGg6OmVhdHQ6OmVhdHRfaW1wbDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZWF0dCB7Ci0KLXN0cnVjdCBFYXR0RXh0ZW5zaW9uOjppbXBsIHsKLSAgaW1wbCgpID0gZGVmYXVsdDsKLSAgfmltcGwoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTdGFydCgpIHsKLSAgICBpZiAoZWF0dF9pbXBsXykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRWF0dCBhbHJlYWR5IHN0YXJ0ZWQiOwotICAgICAgcmV0dXJuOwotICAgIH07Ci0KLSAgICAvKiBSZWdpc3RlciBzZXJ2ZXIgZm9yIEVhdHQgKi8KLSAgICBtZW1zZXQoJnJlZ19pbmZvXywgMCwgc2l6ZW9mKHJlZ19pbmZvXykpOwotICAgIHJlZ19pbmZvXy5wTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RJbmRfQ2IgPSBlYXR0X2Nvbm5lY3RfaW5kOwotICAgIHJlZ19pbmZvXy5wTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RDZm1fQ2IgPSBlYXR0X2Nvbm5lY3RfY2ZtOwotICAgIHJlZ19pbmZvXy5wTDJDQV9DcmVkaXRCYXNlZFJlY29uZmlnQ29tcGxldGVkX0NiID0gZWF0dF9yZWNvbmZpZ19jb21wbGV0ZWQ7Ci0gICAgcmVnX2luZm9fLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IgPSBlYXR0X2Rpc2Nvbm5lY3RfaW5kOwotICAgIHJlZ19pbmZvXy5wTDJDQV9FcnJvcl9DYiA9IGVhdHRfZXJyb3JfY2I7Ci0gICAgcmVnX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IgPSBlYXR0X2RhdGFfaW5kOwotCi0gICAgaWYgKEwyQ0FfUmVnaXN0ZXJMRUNvYyhCVF9QU01fRUFUVCwgcmVnX2luZm9fLCBCVE1fU0VDX05PTkUsIHt9KSA9PSAwKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgY2Fubm90IHJlZ2lzdGVyIEVBVFQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBlYXR0X2ltcGxfID0gc3RkOjptYWtlX3VuaXF1ZTxlYXR0X2ltcGw+KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBTdG9wKCkgewotICAgIGlmICghZWF0dF9pbXBsXykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRWF0dCBub3Qgc3RhcnRlZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVhdHRfaW1wbF8ucmVzZXQobnVsbHB0cik7Ci0gICAgTDJDQV9EZXJlZ2lzdGVyTEVDb2MoQlRfUFNNX0VBVFQpOwotICB9Ci0KLSAgYm9vbCBJc1J1bm5pbmcoKSB7IHJldHVybiBlYXR0X2ltcGxfID8gdHJ1ZSA6IGZhbHNlOyB9Ci0KLSAgc3RhdGljIGVhdHRfaW1wbCogR2V0SW1wbEluc3RhbmNlKHZvaWQpIHsKLSAgICBhdXRvKiBpbnN0YW5jZSA9IEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlLT5waW1wbF8tPmVhdHRfaW1wbF8uZ2V0KCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBlYXR0X2Nvbm5lY3RfaW5kKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGxjaWRzLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVlcl9tdHUsIHVpbnQ4X3QgaWRlbnRpZmllcikgewotICAgIGF1dG8gcF9lYXR0X2ltcGwgPSBHZXRJbXBsSW5zdGFuY2UoKTsKLSAgICBpZiAocF9lYXR0X2ltcGwpCi0gICAgICBwX2VhdHRfaW1wbC0+ZWF0dF9sMmNhcF9jb25uZWN0X2luZChiZGEsIGxjaWRzLCBwc20sIHBlZXJfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcik7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBlYXR0X2Nvbm5lY3RfY2ZtKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZWVyX210dSwgdWludDE2X3QgcmVzdWx0KSB7Ci0gICAgYXV0byBwX2VhdHRfaW1wbCA9IEdldEltcGxJbnN0YW5jZSgpOwotICAgIGlmIChwX2VhdHRfaW1wbCkKLSAgICAgIHBfZWF0dF9pbXBsLT5lYXR0X2wyY2FwX2Nvbm5lY3RfY2ZtKGJkYSwgbGNpZCwgcGVlcl9tdHUsIHJlc3VsdCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBlYXR0X3JlY29uZmlnX2NvbXBsZXRlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbG9jYWxfY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gICAgYXV0byBwX2VhdHRfaW1wbCA9IEdldEltcGxJbnN0YW5jZSgpOwotICAgIGlmIChwX2VhdHRfaW1wbCkKLSAgICAgIHBfZWF0dF9pbXBsLT5lYXR0X2wyY2FwX3JlY29uZmlnX2NvbXBsZXRlZChiZGEsIGxjaWQsIGlzX2xvY2FsX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NmZyk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBlYXR0X2Vycm9yX2NiKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlYXNvbikgewotICAgIGF1dG8gcF9lYXR0X2ltcGwgPSBHZXRJbXBsSW5zdGFuY2UoKTsKLSAgICBpZiAocF9lYXR0X2ltcGwpIHBfZWF0dF9pbXBsLT5lYXR0X2wyY2FwX2Vycm9yX2NiKGxjaWQsIHJlYXNvbik7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBlYXR0X2Rpc2Nvbm5lY3RfaW5kKHVpbnQxNl90IGxjaWQsIGJvb2wgcGxlYXNlX2NvbmZpcm0pIHsKLSAgICBhdXRvIHBfZWF0dF9pbXBsID0gR2V0SW1wbEluc3RhbmNlKCk7Ci0gICAgaWYgKHBfZWF0dF9pbXBsKQotICAgICAgcF9lYXR0X2ltcGwtPmVhdHRfbDJjYXBfZGlzY29ubmVjdF9pbmQobGNpZCwgcGxlYXNlX2NvbmZpcm0pOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgZWF0dF9kYXRhX2luZCh1aW50MTZfdCBsY2lkLCBCVF9IRFIqIGRhdGFfcCkgewotICAgIGF1dG8gcF9lYXR0X2ltcGwgPSBHZXRJbXBsSW5zdGFuY2UoKTsKLSAgICBpZiAocF9lYXR0X2ltcGwpIHBfZWF0dF9pbXBsLT5lYXR0X2wyY2FwX2RhdGFfaW5kKGxjaWQsIGRhdGFfcCk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8ZWF0dF9pbXBsPiBlYXR0X2ltcGxfOwotICB0TDJDQVBfQVBQTF9JTkZPIHJlZ19pbmZvXzsKLX07Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6QWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBlYXR0X2ltcGwqIHBfZWF0dF9pbXBsID0gRWF0dEV4dGVuc2lvbjo6aW1wbDo6R2V0SW1wbEluc3RhbmNlKCk7Ci0gIGlmIChwX2VhdHRfaW1wbCkgcF9lYXR0X2ltcGwtPmFkZF9mcm9tX3N0b3JhZ2UoYmRfYWRkcik7Ci19Ci0KLUVhdHRFeHRlbnNpb246OkVhdHRFeHRlbnNpb24oKSA6IHBpbXBsXyhzdGQ6Om1ha2VfdW5pcXVlPGltcGw+KCkpIHt9Ci0KLWJvb2wgRWF0dEV4dGVuc2lvbjo6SXNFYXR0U3VwcG9ydGVkQnlQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcmV0dXJuIHBpbXBsXy0+ZWF0dF9pbXBsXy0+aXNfZWF0dF9zdXBwb3J0ZWRfYnlfcGVlcihiZF9hZGRyKTsKLX0KLQotdm9pZCBFYXR0RXh0ZW5zaW9uOjpDb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcGltcGxfLT5lYXR0X2ltcGxfLT5jb25uZWN0KGJkX2FkZHIpOwotfQotCi12b2lkIEVhdHRFeHRlbnNpb246OkRpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBwaW1wbF8tPmVhdHRfaW1wbF8tPmRpc2Nvbm5lY3QoYmRfYWRkcik7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6UmVjb25maWd1cmUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtdHUpIHsKLSAgcGltcGxfLT5lYXR0X2ltcGxfLT5yZWNvbmZpZ3VyZShiZF9hZGRyLCBjaWQsIG10dSk7Ci19Ci12b2lkIEVhdHRFeHRlbnNpb246OlJlY29uZmlndXJlQWxsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG10dSkgewotICBwaW1wbF8tPmVhdHRfaW1wbF8tPnJlY29uZmlndXJlX2FsbChiZF9hZGRyLCBtdHUpOwotfQotCi1FYXR0Q2hhbm5lbCogRWF0dEV4dGVuc2lvbjo6RmluZEVhdHRDaGFubmVsQnlDaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaWQpIHsKLSAgcmV0dXJuIHBpbXBsXy0+ZWF0dF9pbXBsXy0+ZmluZF9lYXR0X2NoYW5uZWxfYnlfY2lkKGJkX2FkZHIsIGNpZCk7Ci19Ci0KLUVhdHRDaGFubmVsKiBFYXR0RXh0ZW5zaW9uOjpGaW5kRWF0dENoYW5uZWxCeVRyYW5zSWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNfaWQpIHsKLSAgcmV0dXJuIHBpbXBsXy0+ZWF0dF9pbXBsXy0+ZmluZF9lYXR0X2NoYW5uZWxfYnlfdHJhbnNpZChiZF9hZGRyLCB0cmFuc19pZCk7Ci19Ci0KLWJvb2wgRWF0dEV4dGVuc2lvbjo6SXNJbmRpY2F0aW9uUGVuZGluZyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZGljYXRpb25faGFuZGxlKSB7Ci0gIHJldHVybiBwaW1wbF8tPmVhdHRfaW1wbF8tPmlzX2luZGljYXRpb25fcGVuZGluZyhiZF9hZGRyLCBpbmRpY2F0aW9uX2hhbmRsZSk7Ci19Ci0KLUVhdHRDaGFubmVsKiBFYXR0RXh0ZW5zaW9uOjpHZXRDaGFubmVsQXZhaWxhYmxlRm9ySW5kaWNhdGlvbigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBwaW1wbF8tPmVhdHRfaW1wbF8tPmdldF9jaGFubmVsX2F2YWlsYWJsZV9mb3JfaW5kaWNhdGlvbihiZF9hZGRyKTsKLX0KLQotdm9pZCBFYXR0RXh0ZW5zaW9uOjpGcmVlR2F0dFJlc291cmNlcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHBpbXBsXy0+ZWF0dF9pbXBsXy0+ZnJlZV9nYXR0X3Jlc291cmNlcyhiZF9hZGRyKTsKLX0KLQotYm9vbCBFYXR0RXh0ZW5zaW9uOjpJc091dHN0YW5kaW5nTXNnSW5TZW5kUXVldWUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICByZXR1cm4gcGltcGxfLT5lYXR0X2ltcGxfLT5pc19vdXRzdGFuZGluZ19tc2dfaW5fc2VuZF9xdWV1ZShiZF9hZGRyKTsKLX0KLQotRWF0dENoYW5uZWwqIEVhdHRFeHRlbnNpb246OkdldENoYW5uZWxXaXRoUXVldWVkRGF0YSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBwaW1wbF8tPmVhdHRfaW1wbF8tPmdldF9jaGFubmVsX3dpdGhfcXVldWVkX2RhdGEoYmRfYWRkcik7Ci19Ci0KLUVhdHRDaGFubmVsKiBFYXR0RXh0ZW5zaW9uOjpHZXRDaGFubmVsQXZhaWxhYmxlRm9yQ2xpZW50UmVxdWVzdCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBwaW1wbF8tPmVhdHRfaW1wbF8tPmdldF9jaGFubmVsX2F2YWlsYWJsZV9mb3JfY2xpZW50X3JlcXVlc3QoYmRfYWRkcik7Ci19Ci0KLS8qIFN0YXJ0IHN0b3AgR0FUVCBpbmRpY2F0aW9uIHRpbWVyIHBlciBDSUQgKi8KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RhcnRJbmRpY2F0aW9uQ29uZmlybWF0aW9uVGltZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2lkKSB7Ci0gIHBpbXBsXy0+ZWF0dF9pbXBsXy0+c3RhcnRfaW5kaWNhdGlvbl9jb25maXJtX3RpbWVyKGJkX2FkZHIsIGNpZCk7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RvcEluZGljYXRpb25Db25maXJtYXRpb25UaW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNpZCkgewotICBwaW1wbF8tPmVhdHRfaW1wbF8tPnN0b3BfaW5kaWNhdGlvbl9jb25maXJtX3RpbWVyKGJkX2FkZHIsIGNpZCk7Ci19Ci0KLS8qIFN0YXJ0IHN0b3AgYXBwbGljYXRpb24gaW5kaWNhdGlvbiB0aW1lb3V0ICovCi12b2lkIEVhdHRFeHRlbnNpb246OlN0YXJ0QXBwSW5kaWNhdGlvblRpbWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNpZCkgewotICBwaW1wbF8tPmVhdHRfaW1wbF8tPnN0YXJ0X2FwcF9pbmRpY2F0aW9uX3RpbWVyKGJkX2FkZHIsIGNpZCk7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RvcEFwcEluZGljYXRpb25UaW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNpZCkgewotICBwaW1wbF8tPmVhdHRfaW1wbF8tPnN0b3BfYXBwX2luZGljYXRpb25fdGltZXIoYmRfYWRkciwgY2lkKTsKLX0KLQotdm9pZCBFYXR0RXh0ZW5zaW9uOjpTdGFydCgpIHsgcGltcGxfLT5TdGFydCgpOyB9Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RvcCgpIHsgcGltcGxfLT5TdG9wKCk7IH0KLQotRWF0dEV4dGVuc2lvbjo6fkVhdHRFeHRlbnNpb24oKSA9IGRlZmF1bHQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBlYXR0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zdGFjay9lYXR0L2VhdHQuaCBiL3N0YWNrL2VhdHQvZWF0dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjA3MWFiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2VhdHQvZWF0dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLiBSZXByZXNlbnRlZCBieSBFSElNQSAtCi0gKiB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJzdGFjay9nYXR0L2dhdHRfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBFQVRUX01JTl9NVFVfTVBTICg2NCkKLSNkZWZpbmUgRUFUVF9ERUZBVUxUX01UVSAoMjU2KQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBlYXR0IHsKLQotLyogRW51bXMgKi8KLWVudW0gY2xhc3MgRWF0dENoYW5uZWxTdGF0ZSA6IHVpbnQ4X3QgewotICBFQVRUX0NIQU5ORUxfUEVORElORyA9IDB4MDAsCi0gIEVBVFRfQ0hBTk5FTF9PUEVORUQsCi0gIEVBVFRfQ0hBTk5FTF9SRUNPTkZJR1VSSU5HLAotfTsKLQotY2xhc3MgRWF0dENoYW5uZWwgewotIHB1YmxpYzoKLSAgLyogUG9pbnRlciB0byBFYXR0RGV2aWNlICovCi0gIFJhd0FkZHJlc3MgYmRhXzsKLSAgdWludDE2X3QgY2lkXzsKLSAgdWludDE2X3QgdHhfbXR1XzsKLSAgdWludDE2X3QgcnhfbXR1XzsKLSAgRWF0dENoYW5uZWxTdGF0ZSBzdGF0ZV87Ci0KLSAgLyogVXNlZCB0byBrZWVwIHNlcnZlciBjb21tYW5kcyAqLwotICB0R0FUVF9TUl9DTUQgc2VydmVyX291dHN0YW5kaW5nX2NtZF87Ci0gIC8qIFVzZWQgdG8gdmVyeWZ5IGluZGljYXRpb24gY29uZmlybWF0aW9uKi8KLSAgdWludDE2X3QgaW5kaWNhdGVfaGFuZGxlXzsKLSAgLyogbG9jYWwgYXBwIGNvbmZpcm0gdG8gaW5kaWNhdGlvbiB0aW1lciAqLwotICBhbGFybV90KiBpbmRfYWNrX3RpbWVyXzsKLSAgLyogaW5kaWNhdGlvbiBjb25maXJtYXRpb24gdGltZXIgKi8KLSAgYWxhcm1fdCogaW5kX2NvbmZpcm1hdGlvbl90aW1lcl87Ci0gIC8qIEdBVFQgY2xpZW50IGNvbW1hbmQgcXVldWUgKi8KLSAgc3RkOjpxdWV1ZTx0R0FUVF9DTURfUT4gY2xfY21kX3FfOwotCi0gIEVhdHRDaGFubmVsKFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgY2lkLCB1aW50MTZfdCB0eF9tdHUsIHVpbnQxNl90IHJ4X210dSkKLSAgICAgIDogYmRhXyhiZGEpLAotICAgICAgICBjaWRfKGNpZCksCi0gICAgICAgIHR4X210dV8odHhfbXR1KSwKLSAgICAgICAgcnhfbXR1XyhyeF9tdHUpLAotICAgICAgICBzdGF0ZV8oRWF0dENoYW5uZWxTdGF0ZTo6RUFUVF9DSEFOTkVMX1BFTkRJTkcpLAotICAgICAgICBpbmRpY2F0ZV9oYW5kbGVfKDApLAotICAgICAgICBpbmRfYWNrX3RpbWVyXyhOVUxMKSwKLSAgICAgICAgaW5kX2NvbmZpcm1hdGlvbl90aW1lcl8oTlVMTCkge30KLQotICB+RWF0dENoYW5uZWwoKSB7Ci0gICAgaWYgKGluZF9hY2tfdGltZXJfICE9IE5VTEwpIHsKLSAgICAgIGFsYXJtX2ZyZWUoaW5kX2Fja190aW1lcl8pOwotICAgIH0KLQotICAgIGlmIChpbmRfY29uZmlybWF0aW9uX3RpbWVyXyAhPSBOVUxMKSB7Ci0gICAgICBhbGFybV9mcmVlKGluZF9jb25maXJtYXRpb25fdGltZXJfKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEVhdHRDaGFubmVsU2V0U3RhdGUoRWF0dENoYW5uZWxTdGF0ZSBzdGF0ZSkgewotICAgIGlmIChzdGF0ZV8gPT0gRWF0dENoYW5uZWxTdGF0ZTo6RUFUVF9DSEFOTkVMX1BFTkRJTkcpIHsKLSAgICAgIGlmIChzdGF0ZSA9PSBFYXR0Q2hhbm5lbFN0YXRlOjpFQVRUX0NIQU5ORUxfT1BFTkVEKSB7Ci0gICAgICAgIGNsX2NtZF9xXyA9IHN0ZDo6cXVldWU8dEdBVFRfQ01EX1E+KCk7Ci0gICAgICAgIG1lbXNldCgmc2VydmVyX291dHN0YW5kaW5nX2NtZF8sIDAsIHNpemVvZih0R0FUVF9TUl9DTUQpKTsKLSAgICAgICAgY2hhciBuYW1lWzY0XTsKLSAgICAgICAgc3ByaW50ZihuYW1lLCAiZWF0dF9pbmRfYWNrX3RpbWVyXyVzX2NpZF8weCUwNHgiLAotICAgICAgICAgICAgICAgIGJkYV8uVG9TdHJpbmcoKS5jX3N0cigpLCBjaWRfKTsKLSAgICAgICAgaW5kX2Fja190aW1lcl8gPSBhbGFybV9uZXcobmFtZSk7Ci0KLSAgICAgICAgc3ByaW50ZihuYW1lLCAiZWF0dF9pbmRfY29uZl90aW1lcl8lc19jaWRfMHglMDR4IiwKLSAgICAgICAgICAgICAgICBiZGFfLlRvU3RyaW5nKCkuY19zdHIoKSwgY2lkXyk7Ci0gICAgICAgIGluZF9jb25maXJtYXRpb25fdGltZXJfID0gYWxhcm1fbmV3KG5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICBzdGF0ZV8gPSBzdGF0ZTsKLSAgfQotICB2b2lkIEVhdHRDaGFubmVsU2V0VHhNVFUodWludDE2X3QgdHhfbXR1KSB7IHRoaXMtPnR4X210dV8gPSB0eF9tdHU7IH0KLX07Ci0KLS8qIEludGVyZmFjZSBjbGFzcyAqLwotY2xhc3MgRWF0dEV4dGVuc2lvbiB7Ci0gcHVibGljOgotICBFYXR0RXh0ZW5zaW9uKCk7Ci0gIHZpcnR1YWwgfkVhdHRFeHRlbnNpb24oKTsKLQotICBzdGF0aWMgRWF0dEV4dGVuc2lvbiogR2V0SW5zdGFuY2UoKSB7Ci0gICAgc3RhdGljIEVhdHRFeHRlbnNpb24qIGluc3RhbmNlID0gbmV3IEVhdHRFeHRlbnNpb24oKTsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAvKioKLSAgICogQ2hlY2tzIGlmIEVBVFQgaXMgc3VwcG9ydGVkIG9uIHBlZXIgZGV2aWNlLgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgSXNFYXR0U3VwcG9ydGVkQnlQZWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKgotICAgKiBDb25uZWN0IGF0IG1heGltdW0gNSBFQVRUIGNoYW5uZWxzIHRvIHBlZXIgZGV2aWNlLgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAvKioKLSAgICogRGlzY29ubmVjdCBhbGwgRUFUVCBjaGFubmVscyB0byBwZWVyIGRldmljZS4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIERpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLSAgLyoqCi0gICAqIFJlY29uZmlndXJlIEVBVFQgY2hhbm5lbCBmb3IgZ2l2ZSBDSUQKLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gY2lkIGNoYW5uZWwgaWQKLSAgICogQHBhcmFtIG10dSBuZXcgbWF4aW11bSB0cmFuc21pdCB1bml0IGF2YWlsYWJsZSBvZiBsb2NhbCBkZXZpY2UKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBSZWNvbmZpZ3VyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtdHUpOwotCi0gIC8qKgotICAgKiBSZWNvbmZpZ3VyZSBhbGwgRUFUVCBjaGFubmVscyB0byBwZWVyIGRldmljZS4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gbXR1IG5ldyBtYXhpbXVtIHRyYW5zbWl0IHVuaXQgYXZhaWxhYmxlIG9mIGxvY2FsIGRldmljZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIFJlY29uZmlndXJlQWxsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG10dSk7Ci0KLSAgLyogQmVsb3cgbWV0aG9kcyByZXF1aXJlZCBieSBHQVRUIGltcGxlbWVudGF0aW9uICovCi0KLSAgLyoqCi0gICAqIEZpbmQgRUFUVCBjaGFubmVsIGJ5IGNpZC4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gY2lkIGNoYW5uZWwgaWQKLSAgICoKLSAgICogQHJldHVybiBFYXR0IENoYW5uZWwgaW5zdGFuY2UuCi0gICAqLwotICB2aXJ0dWFsIEVhdHRDaGFubmVsKiBGaW5kRWF0dENoYW5uZWxCeUNpZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaWQpOwotCi0gIC8qKgotICAgKiBGaW5kIEVBVFQgY2hhbm5lbCBieSB0cmFuc2FjdGlvbiBpZC4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gdHJhbnNfaWQgdHJhbnNhY3Rpb24gaWQKLSAgICoKLSAgICogQHJldHVybiBwb2ludGVyIHRvIEVBVFQgY2hhbm5lbC4KLSAgICovCi0gIHZpcnR1YWwgRWF0dENoYW5uZWwqIEZpbmRFYXR0Q2hhbm5lbEJ5VHJhbnNJZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNfaWQpOwotCi0gIC8qKgotICAgKiBDaGVjayBpZiBFQVRUIGNoYW5uZWwgb24gZ2l2ZW4gaGFuZGxlIGlzIHdhaXRpbmcgZm9yIGEgaW5kaWNhdGlvbgotICAgKiBjb25maXJtYXRpb24KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gaW5kaWNhdGlvbl9oYW5kbGUgaGFuZGxlIG9mIHRoZSBwZW5kaW5nIGluZGljYXRpb24KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIGNvbmZpcm1hdGlvbiBpcyBwZW5kaW5nIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgdmlydHVhbCBib29sIElzSW5kaWNhdGlvblBlbmRpbmcoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW5kaWNhdGlvbl9oYW5kbGUpOwotCi0gIC8qKgotICAgKiBHZXQgRUFUVCBjaGFubmVsIGF2YWlsYWJsZSBmb3IgaW5kaWNhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKgotICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gRUFUVCBjaGFubmVsLgotICAgKi8KLSAgdmlydHVhbCBFYXR0Q2hhbm5lbCogR2V0Q2hhbm5lbEF2YWlsYWJsZUZvckluZGljYXRpb24oCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAvKioKLSAgICogRnJlZSBSZXNvdXJjZXMuCi0gICAqCi0gICAqIChNYXliZSBub3QgbmVlZGVkKQotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgRnJlZUdhdHRSZXNvdXJjZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZXJlIGlzIGFueSBFQVRUIGNoYW5uZWxzIGhhdmluZyBzb21lIG1zZyBpbiBpdHMgc2VuZCBxdWV1ZQotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBFQVRUIGNoYW5uZWwgcmVhZHkgdG8gc2VuZAotICAgKi8KLSAgdmlydHVhbCBib29sIElzT3V0c3RhbmRpbmdNc2dJblNlbmRRdWV1ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotICAvKioKLSAgICogR2V0IEVBVFQgY2hhbm5lbCByZWFkeSB0byBzZW5kLgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqCi0gICAqIEByZXR1cm4gcG9pbnRlciB0byBFQVRUIGNoYW5uZWwuCi0gICAqLwotICB2aXJ0dWFsIEVhdHRDaGFubmVsKiBHZXRDaGFubmVsV2l0aFF1ZXVlZERhdGEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLSAgLyoqCi0gICAqIEdldCBFQVRUIGNoYW5uZWwgYXZhaWxhYmxlIHRvIHNlbmQgR0FUVCByZXF1ZXN0LgotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqCi0gICAqIEByZXR1cm4gcG9pbnRlciB0byBFQVRUIGNoYW5uZWwuCi0gICAqLwotICB2aXJ0dWFsIEVhdHRDaGFubmVsKiBHZXRDaGFubmVsQXZhaWxhYmxlRm9yQ2xpZW50UmVxdWVzdCgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0gIC8qKgotICAgKiBTdGFydCBHQVRUIGluZGljYXRpb24gdGltZXIgcGVyIENJRC4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gY2lkIGNoYW5uZWwgaWQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTdGFydEluZGljYXRpb25Db25maXJtYXRpb25UaW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2lkKTsKLQotICAvKioKLSAgICogU3RvcCBHQVRUIGluZGljYXRpb24gdGltZXIgcGVyIENJRC4KLSAgICoKLSAgICogQHBhcmFtIGJkX2FkZHIgcGVlciBkZXZpY2UgYWRkcmVzcwotICAgKiBAcGFyYW0gY2lkIGNoYW5uZWwgaWQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTdG9wSW5kaWNhdGlvbkNvbmZpcm1hdGlvblRpbWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNpZCk7Ci0KLSAgLyoqCi0gICAqICBTdGFydCBhcHBsaWNhdGlvbiB0aW1lIGZvciBpbmNvbWluZyBpbmRpY2F0aW9uIG9uIGdpdmVuIENJRAotICAgKgotICAgKiBAcGFyYW0gYmRfYWRkciBwZWVyIGRldmljZSBhZGRyZXNzCi0gICAqIEBwYXJhbSBjaWQgY2hhbm5lbCBpZAotICAgKi8KLSAgdmlydHVhbCB2b2lkIFN0YXJ0QXBwSW5kaWNhdGlvblRpbWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCk7Ci0KLSAgLyoqCi0gICAqICBTdG9wIGFwcGxpY2F0aW9uIHRpbWUgZm9yIGluY29taW5nIGluZGljYXRpb24gb24gZ2l2ZW4gQ0lECi0gICAqCi0gICAqIEBwYXJhbSBiZF9hZGRyIHBlZXIgZGV2aWNlIGFkZHJlc3MKLSAgICogQHBhcmFtIGNpZCBjaGFubmVsIGlkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgU3RvcEFwcEluZGljYXRpb25UaW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjaWQpOwotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIEVhdHRFeHRlbnNpb24gbW9kdWxlCi0gICAqLwotICB2b2lkIFN0YXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBFYXR0RXh0ZW5zaW9uIG1vZHVsZQotICAgKi8KLSAgdm9pZCBTdG9wKCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRWF0dEV4dGVuc2lvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZWF0dAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svZWF0dC9lYXR0X2ltcGwuaCBiL3N0YWNrL2VhdHQvZWF0dF9pbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjQ4MDguLjAwMDAwMDAKLS0tIGEvc3RhY2svZWF0dC9lYXR0X2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJhY2xfYXBpLmgiCi0jaW5jbHVkZSAiYmluZF9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImVhdHQuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2wyY2FwL2wyY19pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBlYXR0IHsKLQotI2RlZmluZSBCTEVfR0FUVF9TVlJfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLIDB4MDEKLQotY2xhc3MgZWF0dF9kZXZpY2UgewotIHB1YmxpYzoKLSAgUmF3QWRkcmVzcyBiZGFfOwotICB1aW50MTZfdCByeF9tdHVfOwotICB1aW50MTZfdCByeF9tcHNfOwotCi0gIHRHQVRUX1RDQiogZWF0dF90Y2JfOwotCi0gIHN0ZDo6bWFwPHVpbnQxNl90LCBzdGQ6OnNoYXJlZF9wdHI8RWF0dENoYW5uZWw+PiBlYXR0X2NoYW5uZWxzOwotCi0gIGVhdHRfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG10dSwgdWludDE2X3QgbXBzKQotICAgICAgOiByeF9tdHVfKG10dSksIHJ4X21wc18obXBzKSwgZWF0dF90Y2JfKG51bGxwdHIpIHsKLSAgICBiZGFfID0gYmRfYWRkcjsKLSAgfQotfTsKLQotc3RydWN0IGVhdHRfaW1wbCB7Ci0gIHN0ZDo6dmVjdG9yPGVhdHRfZGV2aWNlPiBkZXZpY2VzXzsKLSAgdWludDE2X3QgcHNtXzsKLSAgdWludDE2X3QgZGVmYXVsdF9tdHVfOwotICB1aW50MTZfdCBtYXhfbXBzXzsKLSAgdEwyQ0FQX0FQUExfSU5GTyByZWdfaW5mb187Ci0KLSAgZWF0dF9pbXBsKCkgewotICAgIGRlZmF1bHRfbXR1XyA9IEVBVFRfREVGQVVMVF9NVFU7Ci0gICAgbWF4X21wc18gPSBFQVRUX01JTl9NVFVfTVBTOwotICAgIHBzbV8gPSBCVF9QU01fRUFUVDsKLSAgfTsKLQotICB+ZWF0dF9pbXBsKCkgPSBkZWZhdWx0OwotCi0gIGVhdHRfZGV2aWNlKiBmaW5kX2RldmljZV9ieV9jaWQodWludDE2X3QgbGNpZCkgewotICAgIC8qIFRoaXMgd29ya3Mgb25seSBiZWNhdXNlIEFuZHJvaWQgQ0lEcyBhcmUgdW5pcXVlIGFjcm9zcyB0aGUgQUNMCi0gICAgICogY29ubmVjdGlvbnMgKi8KLSAgICBhdXRvIGl0ZXIgPSBmaW5kX2lmKGRldmljZXNfLmJlZ2luKCksIGRldmljZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgWyZsY2lkXShjb25zdCBlYXR0X2RldmljZSYgZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IGVkLmVhdHRfY2hhbm5lbHMuZmluZChsY2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ICE9IGVkLmVhdHRfY2hhbm5lbHMuZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBkZXZpY2VzXy5lbmQoKSkgPyBudWxscHRyIDogJigqaXRlcik7Ci0gIH0KLQotICBFYXR0Q2hhbm5lbCogZmluZF9jaGFubmVsX2J5X2NpZCh1aW50MTZfdCBsY2lkKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfY2lkKGxjaWQpOwotICAgIGlmICghZWF0dF9kZXYpIHJldHVybiBudWxscHRyOwotCi0gICAgYXV0byBpdCA9IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmZpbmQobGNpZCk7Ci0gICAgcmV0dXJuIChpdCA9PSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSkgPyBudWxscHRyIDogaXQtPnNlY29uZC5nZXQoKTsKLSAgfQotCi0gIEVhdHRDaGFubmVsKiBmaW5kX2NoYW5uZWxfYnlfY2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwgdWludDE2X3QgbGNpZCkgewotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2FkZHJlc3MoYmRhZGRyKTsKLSAgICBpZiAoIWVhdHRfZGV2KSByZXR1cm4gbnVsbHB0cjsKLQotICAgIGF1dG8gaXQgPSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5maW5kKGxjaWQpOwotICAgIHJldHVybiAoaXQgPT0gZWF0dF9kZXYtPmVhdHRfY2hhbm5lbHMuZW5kKCkpID8gbnVsbHB0ciA6IGl0LT5zZWNvbmQuZ2V0KCk7Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9jaGFubmVsX2J5X2NpZChlYXR0X2RldmljZSogZWF0dF9kZXYsIHVpbnQxNl90IGxjaWQpIHsKLSAgICBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lcmFzZShsY2lkKTsKLQotICAgIGlmIChlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5zaXplKCkgPT0gMCkgZWF0dF9kZXYtPmVhdHRfdGNiXyA9IE5VTEw7Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9jaGFubmVsX2J5X2NpZCh1aW50MTZfdCBsY2lkKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfY2lkKGxjaWQpOwotICAgIGlmICghZWF0dF9kZXYpIHJldHVybjsKLQotICAgIHJlbW92ZV9jaGFubmVsX2J5X2NpZChlYXR0X2RldiwgbGNpZCk7Ci0gIH0KLQotICB2b2lkIGVhdHRfbDJjYXBfY29ubmVjdF9pbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBsY2lkcywgdWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVlcl9tdHUsIHVpbnQ4X3QgaWRlbnRpZmllcikgewotICAgIC8qIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgTDJDQVAgbGF5ZXIgYWxyZWFkeSBjaGVjayBwYXJhbWV0ZXJzIGV0Yy4KLSAgICAgKiBHZXQgb3VyIGNhcGFiaWxpdGllcyBhbmQgYWNjZXB0IGFsbCB0aGUgY2hhbm5lbHMuCi0gICAgICovCi0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gdGhpcy0+ZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZGEpOwotICAgIGlmICghZWF0dF9kZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiB1bmtub3duIGRldmljZTogIiA8PCBiZGE7Ci0gICAgICBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcChiZGEsIGlkZW50aWZpZXIsIGxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ09OTl9OT19SRVNPVVJDRVMsIE5VTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQxNl90IG1heF9tcHMgPSBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FjbF9kYXRhX3NpemVfYmxlKCk7Ci0KLSAgICB0TDJDQVBfTEVfQ0ZHX0lORk8gbG9jYWxfY29jX2NmZyA9IHsKLSAgICAgICAgLm10dSA9IGVhdHRfZGV2LT5yeF9tdHVfLAotICAgICAgICAubXBzID0gZWF0dF9kZXYtPnJ4X21wc18gPCBtYXhfbXBzID8gZWF0dF9kZXYtPnJ4X21wc18gOiBtYXhfbXBzLAotICAgICAgICAuY3JlZGl0cyA9IEwyQ0FQX0xFX0NSRURJVF9ERUZBVUxUfTsKLQotICAgIGlmICghTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AoYmRhLCBpZGVudGlmaWVyLCBsY2lkcywgTDJDQVBfQ09OTl9PSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbF9jb2NfY2ZnKSkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICghZWF0dF9kZXYtPmVhdHRfdGNiXykgewotICAgICAgZWF0dF9kZXYtPmVhdHRfdGNiXyA9Ci0gICAgICAgICAgZ2F0dF9maW5kX3RjYl9ieV9hZGRyKGVhdHRfZGV2LT5iZGFfLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgICAgQ0hFQ0soZWF0dF9kZXYtPmVhdHRfdGNiXyk7Ci0gICAgfQotCi0gICAgZm9yICh1aW50MTZfdCBjaWQgOiBsY2lkcykgewotICAgICAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kX2VhdHRfY2hhbm5lbF9ieV9jaWQoYmRhLCBjaWQpOwotICAgICAgQ0hFQ0soIWNoYW5uZWwpOwotCi0gICAgICBhdXRvIGNoYW4gPSBzdGQ6Om1ha2Vfc2hhcmVkPEVhdHRDaGFubmVsPihlYXR0X2Rldi0+YmRhXywgY2lkLCBwZWVyX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdHRfZGV2LT5yeF9tdHVfKTsKLSAgICAgIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmluc2VydCh7Y2lkLCBjaGFufSk7Ci0KLSAgICAgIGNoYW4tPkVhdHRDaGFubmVsU2V0U3RhdGUoRWF0dENoYW5uZWxTdGF0ZTo6RUFUVF9DSEFOTkVMX09QRU5FRCk7Ci0gICAgICBlYXR0X2Rldi0+ZWF0dF90Y2JfLT5lYXR0Kys7Ci0KLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIENoYW5uZWwgY29ubmVjdGVkIENJRCAiIDw8IGxvZ2hleChjaWQpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgZWF0dF9sMmNhcF9jb25uZWN0X2NmbShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZWVyX210dSwgdWludDE2X3QgcmVzdWx0KSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgYmRhOiAiIDw8IGJkYSA8PCAiIGNpZDogIiA8PCArbGNpZAotICAgICAgICAgICAgICA8PCAicGVlciBtdHU6ICIgPDwgK3BlZXJfbXR1IDw8ICIgcmVzdWx0ICIgPDwgK3Jlc3VsdDsKLQotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2FkZHJlc3MoYmRhKTsKLSAgICBpZiAoIWVhdHRfZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgdW5rbm93biBkZXZpY2UiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gdGhpcy0+ZmluZF9jaGFubmVsX2J5X2NpZChiZGEsIGxjaWQpOwotICAgIGlmICghY2hhbm5lbCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIHVua25vd24gY2lkOiAiIDw8IGxvZ2hleChsY2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IEwyQ0FQX0NPTk5fT0spIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgPDwgIiBDb3VsZCBub3QgY29ubmVjdCBDb0MgcmVzdWx0OiAiIDw8IGxvZ2hleChyZXN1bHQpOwotICAgICAgcmVtb3ZlX2NoYW5uZWxfYnlfY2lkKGVhdHRfZGV2LCBsY2lkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjaGFubmVsLT5FYXR0Q2hhbm5lbFNldFN0YXRlKEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICAgIGNoYW5uZWwtPkVhdHRDaGFubmVsU2V0VHhNVFUocGVlcl9tdHUpOwotCi0gICAgQ0hFQ0soZWF0dF9kZXYtPmVhdHRfdGNiXyk7Ci0gICAgQ0hFQ0soZWF0dF9kZXYtPmJkYV8gPT0gY2hhbm5lbC0+YmRhXyk7Ci0gICAgZWF0dF9kZXYtPmVhdHRfdGNiXy0+ZWF0dCsrOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgQ2hhbm5lbCBjb25uZWN0ZWQgQ0lEICIgPDwgbG9naGV4KGxjaWQpOwotICB9Ci0KLSAgdm9pZCBlYXR0X2wyY2FwX3JlY29uZmlnX2NvbXBsZXRlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb2NhbF9jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAibGNpZDogIiA8PCBsb2doZXgobGNpZCkKLSAgICAgICAgICAgICAgPDwgIiBsb2NhbCBjZmc/OiAiIDw8IGlzX2xvY2FsX2NmZzsKLQotICAgIGlmIChwX2NmZy0+cmVzdWx0ICE9IEwyQ0FQX0NGR19PSykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgcmVjb25maWcgZmFpbGVkIGxjaWQ6ICIgPDwgbG9naGV4KGxjaWQpCi0gICAgICAgICAgICAgICAgPDwgIiByZXN1bHQ6ICIgPDwgbG9naGV4KHBfY2ZnLT5yZXN1bHQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gZmluZF9jaGFubmVsX2J5X2NpZChiZGEsIGxjaWQpOwotICAgIGlmICghY2hhbm5lbCkgcmV0dXJuOwotCi0gICAgLyogT24gdGhpcyBsYXllciB3ZSBkb24ndCBjYXJlIGFib3V0IG1wcyBhcyB0aGlzIGlzIGhhbmRsZWQgaW4gTDJDQVAgbGF5ZXIKLSAgICAgKi8KLSAgICBpZiAoaXNfbG9jYWxfY2ZnKQotICAgICAgY2hhbm5lbC0+cnhfbXR1XyA9IHBfY2ZnLT5tdHU7Ci0gICAgZWxzZQotICAgICAgY2hhbm5lbC0+dHhfbXR1XyA9IHBfY2ZnLT5tdHU7Ci0KLSAgICAvKiBHbyBiYWNrIHRvIG9wZW4gc3RhdGUgKi8KLSAgICBjaGFubmVsLT5FYXR0Q2hhbm5lbFNldFN0YXRlKEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICB9Ci0KLSAgdm9pZCBlYXR0X2wyY2FwX2Vycm9yX2NiKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlYXNvbikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNpZDogIiA8PCBsb2doZXgobGNpZCkgPDwgIiByZWFzb24gIgotICAgICAgICAgICAgICA8PCBsb2doZXgocmVhc29uKTsKLQotICAgIC8qVE9ETzogcHJvdmlkZSBhZGRyZXNzIGluIHRoZSBMMkNBUCBjYWxsYmFjayAqLwotCi0gICAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kX2NoYW5uZWxfYnlfY2lkKGxjaWQpOwotICAgIGlmICghY2hhbm5lbCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiVW5rbm93biBsY2lkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBlYXR0X2RldmljZSogZWF0dF9kZXYgPSBmaW5kX2RldmljZV9ieV9hZGRyZXNzKGNoYW5uZWwtPmJkYV8pOwotCi0gICAgc3dpdGNoIChjaGFubmVsLT5zdGF0ZV8pIHsKLSAgICAgIGNhc2UgRWF0dENoYW5uZWxTdGF0ZTo6RUFUVF9DSEFOTkVMX1BFTkRJTkc6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNvbm5lY3RpbmcgZmFpbGVkIjsKLSAgICAgICAgcmVtb3ZlX2NoYW5uZWxfYnlfY2lkKGVhdHRfZGV2LCBsY2lkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9SRUNPTkZJR1VSSU5HOgotICAgICAgICAvKiBKdXN0IGdvIGJhY2sgdG8gb3BlbiBzdGF0ZSAqLwotICAgICAgICBMT0coRVJST1IpIDw8ICJSZWNvbmZpZyBmYWlsZWQiOwotICAgICAgICBjaGFubmVsLT5FYXR0Q2hhbm5lbFNldFN0YXRlKEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkludmFsaWQgc3RhdGU6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihjaGFubmVsLT5zdGF0ZV8pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGVhdHRfbDJjYXBfZGlzY29ubmVjdF9pbmQodWludDE2X3QgbGNpZCwgYm9vbCBwbGVhc2VfY29uZmlybSkgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNpZDogIiA8PCBsb2doZXgobGNpZCk7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfY2lkKGxjaWQpOwotICAgIGlmICghZWF0dF9kZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiB1bmtub3duIGNpZDogIiA8PCBsb2doZXgobGNpZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZWF0dF9kZXYtPmVhdHRfdGNiXy0+ZWF0dC0tOwotICAgIHJlbW92ZV9jaGFubmVsX2J5X2NpZChlYXR0X2RldiwgbGNpZCk7Ci0gIH0KLQotICB2b2lkIGVhdHRfbDJjYXBfZGF0YV9pbmQodWludDE2X3QgbGNpZCwgQlRfSERSKiBkYXRhX3ApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjaWQ6ICIgPDwgbG9naGV4KGxjaWQpOwotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2NpZChsY2lkKTsKLSAgICBpZiAoIWVhdHRfZGV2KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgdW5rbm93biBjaWQ6ICIgPDwgbG9naGV4KGxjaWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gZmluZF9jaGFubmVsX2J5X2NpZChlYXR0X2Rldi0+YmRhXywgbGNpZCk7Ci0gICAgaWYgKCFjaGFubmVsKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJSZWNlaXZlZCBkYXRhIG9uIGNsb3NlZCBjaGFubmVsICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGxjaWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdhdHRfZGF0YV9wcm9jZXNzKCplYXR0X2Rldi0+ZWF0dF90Y2JfLCBjaGFubmVsLT5jaWRfLCBkYXRhX3ApOwotICAgIG9zaV9mcmVlKGRhdGFfcCk7Ci0gIH0KLQotICBib29sIGlzX2VhdHRfc3VwcG9ydGVkX2J5X3BlZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAgIHJldHVybiBnYXR0X3Byb2ZpbGVfZ2V0X2VhdHRfc3VwcG9ydChiZF9hZGRyKTsKLSAgfQotCi0gIGVhdHRfZGV2aWNlKiBmaW5kX2RldmljZV9ieV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgICBhdXRvIGl0ZXIgPSBmaW5kX2lmKAotICAgICAgICBkZXZpY2VzXy5iZWdpbigpLCBkZXZpY2VzXy5lbmQoKSwKLSAgICAgICAgWyZiZF9hZGRyXShjb25zdCBlYXR0X2RldmljZSYgZWQpIHsgcmV0dXJuIGVkLmJkYV8gPT0gYmRfYWRkcjsgfSk7Ci0KLSAgICByZXR1cm4gaXRlciA9PSBkZXZpY2VzXy5lbmQoKSA/IG51bGxwdHIgOiAmKCppdGVyKTsKLSAgfQotCi0gIGVhdHRfZGV2aWNlKiBhZGRfZWF0dF9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAgIGRldmljZXNfLnB1c2hfYmFjayhlYXR0X2RldmljZShiZF9hZGRyLCBkZWZhdWx0X210dV8sIG1heF9tcHNfKSk7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gJmRldmljZXNfLmJhY2soKTsKLSAgICByZXR1cm4gZWF0dF9kZXY7Ci0gIH0KLQotICB2b2lkIGNvbm5lY3RfZWF0dChlYXR0X2RldmljZSogZWF0dF9kZXYpIHsKLSAgICAvKiBMZXQgdXMgdXNlIG1heGltdW0gcG9zc2libGUgbXBzICovCi0gICAgaWYgKGVhdHRfZGV2LT5yeF9tcHNfID09IEVBVFRfTUlOX01UVV9NUFMpCi0gICAgICBlYXR0X2Rldi0+cnhfbXBzXyA9IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWNsX2RhdGFfc2l6ZV9ibGUoKTsKLQotICAgIHRMMkNBUF9MRV9DRkdfSU5GTyBsb2NhbF9jb2NfY2ZnID0gewotICAgICAgICAubXR1ID0gZWF0dF9kZXYtPnJ4X210dV8sCi0gICAgICAgIC5tcHMgPSBlYXR0X2Rldi0+cnhfbXBzXywKLSAgICAgICAgLmNyZWRpdHMgPSBMMkNBUF9MRV9DUkVESVRfREVGQVVMVCwKLSAgICB9OwotCi0gICAgLyogV2FybmluZyEgQ0lEcyBpbiBBbmRyb2lkIGFyZSB1bmlxdWUgYWNyb3NzIHRoZSBBQ0wgY29ubmVjdGlvbnMgKi8KLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY29ubmVjdGluZ19jaWRzID0KLSAgICAgICAgTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSZXEocHNtXywgZWF0dF9kZXYtPmJkYV8sICZsb2NhbF9jb2NfY2ZnKTsKLQotICAgIGlmIChjb25uZWN0aW5nX2NpZHMuc2l6ZSgpID09IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBnZXQgY2lkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIlN1Y2Nlc3NmdWxseSBzZW50IENvQyByZXF1ZXN0LCBudW1iZXIgb2YgY2hhbm5lbDogIgotICAgICAgICAgICAgICA8PCArY29ubmVjdGluZ19jaWRzLnNpemUoKTsKLQotICAgIGZvciAodWludDE2X3QgY2lkIDogY29ubmVjdGluZ19jaWRzKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIiBcdCBjaWQ6ICIgPDwgbG9naGV4KGNpZCk7Ci0KLSAgICAgIGF1dG8gY2hhbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8RWF0dENoYW5uZWw+KGVhdHRfZGV2LT5iZGFfLCBjaWQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXR0X2Rldi0+cnhfbXR1Xyk7Ci0gICAgICBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5pbnNlcnQoe2NpZCwgY2hhbn0pOwotICAgIH0KLQotICAgIGlmIChlYXR0X2Rldi0+ZWF0dF90Y2JfKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBoYXMgdGNiID8gIiA8PCBlYXR0X2Rldi0+ZWF0dF90Y2JfOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGVhdHRfZGV2LT5lYXR0X3RjYl8gPQotICAgICAgICBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoZWF0dF9kZXYtPmJkYV8sIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgQ0hFQ0soZWF0dF9kZXYtPmVhdHRfdGNiXyk7Ci0gIH0KLQotICBFYXR0Q2hhbm5lbCogZmluZF9lYXR0X2NoYW5uZWxfYnlfY2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2lkKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZF9hZGRyKTsKLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCBiZF9hZGRyIDw8ICIgIiA8PCArY2lkOwotCi0gICAgaWYgKCFlYXR0X2RldikgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIGl0ZXIgPSBmaW5kX2lmKAotICAgICAgICBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5iZWdpbigpLCBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSwKLSAgICAgICAgWyZjaWRdKGNvbnN0IHN0ZDo6cGFpcjx1aW50MTZfdCwgc3RkOjpzaGFyZWRfcHRyPEVhdHRDaGFubmVsPj4mIGVsKSB7Ci0gICAgICAgICAgcmV0dXJuIGVsLmZpcnN0ID09IGNpZDsKLSAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gaXRlciA9PSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSA/IG51bGxwdHIgOiBpdGVyLT5zZWNvbmQuZ2V0KCk7Ci0gIH0KLQotICBFYXR0Q2hhbm5lbCogZmluZF9lYXR0X2NoYW5uZWxfYnlfdHJhbnNpZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc19pZCkgewotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2FkZHJlc3MoYmRfYWRkcik7Ci0gICAgaWYgKCFlYXR0X2RldikgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIGl0ZXIgPSBmaW5kX2lmKAotICAgICAgICBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5iZWdpbigpLCBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSwKLSAgICAgICAgWyZ0cmFuc19pZF0oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8dWludDE2X3QsIHN0ZDo6c2hhcmVkX3B0cjxFYXR0Q2hhbm5lbD4+JiBlbCkgewotICAgICAgICAgIHJldHVybiBlbC5zZWNvbmQtPnNlcnZlcl9vdXRzdGFuZGluZ19jbWRfLnRyYW5zX2lkID09IHRyYW5zX2lkOwotICAgICAgICB9KTsKLQotICAgIHJldHVybiBpdGVyID09IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpID8gbnVsbHB0ciA6IGl0ZXItPnNlY29uZC5nZXQoKTsKLSAgfQotCi0gIGJvb2wgaXNfaW5kaWNhdGlvbl9wZW5kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZGljYXRpb25faGFuZGxlKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZF9hZGRyKTsKLSAgICBpZiAoIWVhdHRfZGV2KSByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvIGl0ZXIgPSBmaW5kX2lmKAotICAgICAgICBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5iZWdpbigpLCBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSwKLSAgICAgICAgWyZpbmRpY2F0aW9uX2hhbmRsZV0oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8dWludDE2X3QsIHN0ZDo6c2hhcmVkX3B0cjxFYXR0Q2hhbm5lbD4+JiBlbCkgewotICAgICAgICAgIHJldHVybiBlbC5zZWNvbmQtPmluZGljYXRlX2hhbmRsZV8gPT0gaW5kaWNhdGlvbl9oYW5kbGU7Ci0gICAgICAgIH0pOwotCi0gICAgcmV0dXJuIChpdGVyICE9IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpKTsKLSAgfTsKLQotICBFYXR0Q2hhbm5lbCogZ2V0X2NoYW5uZWxfYXZhaWxhYmxlX2Zvcl9pbmRpY2F0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgICBlYXR0X2RldmljZSogZWF0dF9kZXYgPSBmaW5kX2RldmljZV9ieV9hZGRyZXNzKGJkX2FkZHIpOwotICAgIGF1dG8gaXRlciA9IGZpbmRfaWYoCi0gICAgICAgIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmJlZ2luKCksIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpLAotICAgICAgICBbXShjb25zdCBzdGQ6OnBhaXI8dWludDE2X3QsIHN0ZDo6c2hhcmVkX3B0cjxFYXR0Q2hhbm5lbD4+JiBlbCkgewotICAgICAgICAgIHJldHVybiAhR0FUVF9IQU5ETEVfSVNfVkFMSUQoZWwuc2Vjb25kLT5pbmRpY2F0ZV9oYW5kbGVfKTsKLSAgICAgICAgfSk7Ci0KLSAgICByZXR1cm4gKGl0ZXIgPT0gZWF0dF9kZXYtPmVhdHRfY2hhbm5lbHMuZW5kKCkpID8gbnVsbHB0cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVyLT5zZWNvbmQuZ2V0KCk7Ci0gIH07Ci0KLSAgRWF0dENoYW5uZWwqIGdldF9jaGFubmVsX2F2YWlsYWJsZV9mb3JfY2xpZW50X3JlcXVlc3QoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZF9hZGRyKTsKLSAgICBpZiAoIWVhdHRfZGV2KSByZXR1cm4gbnVsbHB0cjsKLQotICAgIGF1dG8gaXRlciA9IGZpbmRfaWYoCi0gICAgICAgIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmJlZ2luKCksIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpLAotICAgICAgICBbXShjb25zdCBzdGQ6OnBhaXI8dWludDE2X3QsIHN0ZDo6c2hhcmVkX3B0cjxFYXR0Q2hhbm5lbD4+JiBlbCkgewotICAgICAgICAgIHJldHVybiBlbC5zZWNvbmQtPmNsX2NtZF9xXy5lbXB0eSgpOwotICAgICAgICB9KTsKLQotICAgIHJldHVybiAoaXRlciA9PSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSkgPyBudWxscHRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZXItPnNlY29uZC5nZXQoKTsKLSAgfQotCi0gIHZvaWQgZnJlZV9nYXR0X3Jlc291cmNlcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZF9hZGRyKTsKLSAgICBpZiAoIWVhdHRfZGV2KSByZXR1cm47Ci0KLSAgICBhdXRvIGl0ZXIgPSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5iZWdpbigpOwotICAgIHdoaWxlIChpdGVyICE9IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpKSB7Ci0gICAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9IGl0ZXItPnNlY29uZC5nZXQoKTsKLQotICAgICAgZml4ZWRfcXVldWVfZnJlZShjaGFubmVsLT5zZXJ2ZXJfb3V0c3RhbmRpbmdfY21kXy5tdWx0aV9yc3BfcSwgTlVMTCk7Ci0gICAgICBjaGFubmVsLT5zZXJ2ZXJfb3V0c3RhbmRpbmdfY21kXy5tdWx0aV9yc3BfcSA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBpc19vdXRzdGFuZGluZ19tc2dfaW5fc2VuZF9xdWV1ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZF9hZGRyKTsKLSAgICBpZiAoIWVhdHRfZGV2KSByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvIGl0ZXIgPSBmaW5kX2lmKAotICAgICAgICBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5iZWdpbigpLCBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSwKLSAgICAgICAgW10oY29uc3Qgc3RkOjpwYWlyPHVpbnQxNl90LCBzdGQ6OnNoYXJlZF9wdHI8RWF0dENoYW5uZWw+PiYgZWwpIHsKLSAgICAgICAgICByZXR1cm4gIWVsLnNlY29uZC0+Y2xfY21kX3FfLmVtcHR5KCk7Ci0gICAgICAgIH0pOwotICAgIHJldHVybiAoaXRlciAhPSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSk7Ci0gIH0KLQotICBFYXR0Q2hhbm5lbCogZ2V0X2NoYW5uZWxfd2l0aF9xdWV1ZWRfZGF0YShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gZmluZF9kZXZpY2VfYnlfYWRkcmVzcyhiZF9hZGRyKTsKLSAgICBpZiAoIWVhdHRfZGV2KSByZXR1cm4gbnVsbHB0cjsKLQotICAgIGF1dG8gaXRlciA9IGZpbmRfaWYoCi0gICAgICAgIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmJlZ2luKCksIGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpLAotICAgICAgICBbXShjb25zdCBzdGQ6OnBhaXI8dWludDE2X3QsIHN0ZDo6c2hhcmVkX3B0cjxFYXR0Q2hhbm5lbD4+JiBlbCkgewotICAgICAgICAgIHJldHVybiAhZWwuc2Vjb25kLT5jbF9jbWRfcV8uZW1wdHkoKTsKLSAgICAgICAgfSk7Ci0gICAgcmV0dXJuIChpdGVyID09IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpKSA/IG51bGxwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlci0+c2Vjb25kLmdldCgpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgZWF0dF9pbmRfYWNrX3RpbWVvdXQodm9pZCogZGF0YSkgewotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gKEVhdHRDaGFubmVsKilkYXRhOwotICAgIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoY2hhbm5lbC0+YmRhXywgQlRfVFJBTlNQT1JUX0xFKTsKLQotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZW5kIGFjayBub3ciOwotICAgIGF0dHBfc2VuZF9jbF9jb25maXJtYXRpb25fbXNnKCpwX3RjYiwgY2hhbm5lbC0+Y2lkXyk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBlYXR0X2luZF9jb25maXJtYXRpb25fdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gICAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPSAoRWF0dENoYW5uZWwqKWRhdGE7Ci0gICAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfYWRkcihjaGFubmVsLT5iZGFfLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgZGlzY29ubmVjdGluZy4uLiI7Ci0gICAgZ2F0dF9kaXNjb25uZWN0KHBfdGNiKTsKLSAgfQotCi0gIHZvaWQgc3RhcnRfaW5kaWNhdGlvbl9jb25maXJtX3RpbWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCkgewotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gZmluZF9lYXR0X2NoYW5uZWxfYnlfY2lkKGJkX2FkZHIsIGNpZCk7Ci0gICAgaWYgKCFjaGFubmVsKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJVbmtub3duIGNpZDogIiA8PCBsb2doZXgoY2lkKSA8PCAiIG9yIGRldmljZSAiCi0gICAgICAgICAgICAgICAgIDw8IGJkX2FkZHI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYWxhcm1fc2V0X29uX21sb29wKGNoYW5uZWwtPmluZF9jb25maXJtYXRpb25fdGltZXJfLAotICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dBSVRfRk9SX1JTUF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBlYXR0X2luZF9jb25maXJtYXRpb25fdGltZW91dCwgY2hhbm5lbCk7Ci0gIH0KLQotICB2b2lkIHN0b3BfaW5kaWNhdGlvbl9jb25maXJtX3RpbWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCkgewotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gZmluZF9lYXR0X2NoYW5uZWxfYnlfY2lkKGJkX2FkZHIsIGNpZCk7Ci0gICAgaWYgKCFjaGFubmVsKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJVbmtub3duIGNpZDogIiA8PCBsb2doZXgoY2lkKSA8PCAiIG9yIGRldmljZSAiCi0gICAgICAgICAgICAgICAgIDw8IGJkX2FkZHI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYWxhcm1fY2FuY2VsKGNoYW5uZWwtPmluZF9jb25maXJtYXRpb25fdGltZXJfKTsKLSAgfQotCi0gIHZvaWQgc3RhcnRfYXBwX2luZGljYXRpb25fdGltZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY2lkKSB7Ci0gICAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPSBmaW5kX2VhdHRfY2hhbm5lbF9ieV9jaWQoYmRfYWRkciwgY2lkKTsKLSAgICBpZiAoIWNoYW5uZWwpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIlVua25vd24gY2lkOiAiIDw8IGxvZ2hleChjaWQpIDw8ICIgb3IgZGV2aWNlICIKLSAgICAgICAgICAgICAgICAgPDwgYmRfYWRkcjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhbGFybV9zZXRfb25fbWxvb3AoY2hhbm5lbC0+aW5kX2Fja190aW1lcl8sIEdBVFRfV0FJVF9GT1JfUlNQX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIGVhdHRfaW5kX2Fja190aW1lb3V0LCBjaGFubmVsKTsKLSAgfQotCi0gIHZvaWQgc3RvcF9hcHBfaW5kaWNhdGlvbl90aW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjaWQpIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9IGZpbmRfZWF0dF9jaGFubmVsX2J5X2NpZChiZF9hZGRyLCBjaWQpOwotICAgIGlmICghY2hhbm5lbCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiVW5rbm93biBjaWQ6ICIgPDwgbG9naGV4KGNpZCkgPDwgIiBvciBkZXZpY2UgIgotICAgICAgICAgICAgICAgICA8PCBiZF9hZGRyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFsYXJtX2NhbmNlbChjaGFubmVsLT5pbmRfYWNrX3RpbWVyXyk7Ci0gIH0KLQotICB2b2lkIHJlY29uZmlndXJlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCwgdWludDE2X3QgbmV3X210dSkgewotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2FkZHJlc3MoYmRfYWRkcik7Ci0gICAgaWYgKCFlYXR0X2RldikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiVW5rbm93biBkZXZpY2UgIiA8PCBiZF9hZGRyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0gZmluZF9lYXR0X2NoYW5uZWxfYnlfY2lkKGJkX2FkZHIsIGNpZCk7Ci0gICAgaWYgKCFjaGFubmVsKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJVbmtub3duIGNpZDogIiA8PCBsb2doZXgoY2lkKSA8PCAiIG9yIGRldmljZSAiCi0gICAgICAgICAgICAgICAgIDw8IGJkX2FkZHI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5ld19tdHUgPD0gY2hhbm5lbC0+cnhfbXR1XykgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiSW52YWxpZCBtdHU6ICIgPDwgbG9naGV4KG5ld19tdHUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaWRzID0ge2NpZH07Ci0KLSAgICB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnID0gey5tcHMgPSBlYXR0X2Rldi0+cnhfbXBzXywgLm10dSA9IG5ld19tdHV9OwotCi0gICAgaWYgKCFMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShlYXR0X2Rldi0+YmRhXywgY2lkcywgJmNmZykpCi0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJDb3VsZCBub3Qgc3RhcnQgcmVjb25maWcgY2lkOiAiIDw8IGxvZ2hleChjaWQpCi0gICAgICAgICAgICAgICAgIDw8ICIgb3IgZGV2aWNlICIgPDwgYmRfYWRkcjsKLSAgfQotCi0gIHZvaWQgcmVjb25maWd1cmVfYWxsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG5ld19tdHUpIHsKLSAgICBlYXR0X2RldmljZSogZWF0dF9kZXYgPSBmaW5kX2RldmljZV9ieV9hZGRyZXNzKGJkX2FkZHIpOwotICAgIGlmICghZWF0dF9kZXYpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIlVua25vd24gZGV2aWNlICIgPDwgYmRfYWRkcjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1aW50OF90IG51bV9vZl9jaGFubmVscyA9IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLnNpemUoKTsKLSAgICBpZiAobnVtX29mX2NoYW5uZWxzID09IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIk5vIGNoYW5uZWxzIGZvciBkZXZpY2UgIiA8PCBiZF9hZGRyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaWRzOwotCi0gICAgYXV0byBpdGVyID0gZWF0dF9kZXYtPmVhdHRfY2hhbm5lbHMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXRlciAhPSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lbmQoKSkgewotICAgICAgdWludDE2X3QgY2lkID0gaXRlci0+Zmlyc3Q7Ci0gICAgICBjaWRzLnB1c2hfYmFjayhjaWQpOwotICAgICAgaXRlcisrOwotICAgIH0KLQotICAgIGlmIChuZXdfbXR1IDw9IEVBVFRfTUlOX01UVV9NUFMpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkludmFsaWQgbXR1OiAiIDw8IGxvZ2hleChuZXdfbXR1KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnID0gey5tcHMgPSBlYXR0X2Rldi0+cnhfbXBzXywgLm10dSA9IG5ld19tdHV9OwotCi0gICAgaWYgKCFMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShlYXR0X2Rldi0+YmRhXywgY2lkcywgJmNmZykpCi0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJDb3VsZCBub3Qgc3RhcnQgcmVjb25maWcgZm9yIGRldmljZSAiCi0gICAgICAgICAgICAgICAgIDw8IGJkX2FkZHI7Ci0gIH0KLQotICB2b2lkIHN1cHBvcnRlZF9mZWF0dXJlc19jYih1aW50OF90IHJvbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmVhdHVyZXMpIHsKLSAgICBib29sIGlzX2VhdHRfc3VwcG9ydGVkID0gZmVhdHVyZXMgJiBCTEVfR0FUVF9TVlJfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgIiA8PCBiZF9hZGRyCi0gICAgICAgICAgICAgIDw8ICIgaXNfZWF0dF9zdXBwb3J0ZWQgPSAiIDw8IGludChpc19lYXR0X3N1cHBvcnRlZCk7Ci0gICAgaWYgKCFpc19lYXR0X3N1cHBvcnRlZCkgcmV0dXJuOwotCi0gICAgZWF0dF9kZXZpY2UqIGVhdHRfZGV2ID0gYWRkX2VhdHRfZGV2aWNlKGJkX2FkZHIpOwotCi0gICAgaWYgKHJvbGUgIT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgICAgLyogVE9ETyBGb3Igbm93IGRvIG5vdGhpbmcsIHdlIGNvdWxkIHJ1biBhIHRpbWVyIGhlcmUgYW5kIHN0YXJ0IEVBVFQgaWYKLSAgICAgICAqIG5vdCBzdGFydGVkIGJ5IGNlbnRyYWwgKi8KLSAgICAgIExPRyhJTkZPKQotICAgICAgICAgIDw8ICIgRUFUVCBTaG91bGQgYmUgY29ubmVjdGVkIGJ5IHRoZSBjZW50cmFsLiBMZXQncyB3YWl0IGZvciBpdC4iOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbm5lY3RfZWF0dChlYXR0X2Rldik7Ci0gIH0KLQotICB2b2lkIGRpc2Nvbm5lY3RfY2hhbm5lbCh1aW50MTZfdCBjaWQpIHsgTDJDQV9EaXNjb25uZWN0UmVxKGNpZCk7IH0KLQotICB2b2lkIGRpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiICIgPDwgYmRfYWRkcjsKLQotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2FkZHJlc3MoYmRfYWRkcik7Ci0gICAgaWYgKCFlYXR0X2RldikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgbm8gZWF0dCBkZXZpY2UgZm91bmQiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZWF0dF9kZXYtPmVhdHRfdGNiXykgewotICAgICAgTE9HX0FTU0VSVChlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5zaXplKCkgPT0gMCk7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBubyBlYXR0IGNoYW5uZWxzIGZvdW5kIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGl0ZXIgPSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5iZWdpbigpOwotICAgIHdoaWxlIChpdGVyICE9IGVhdHRfZGV2LT5lYXR0X2NoYW5uZWxzLmVuZCgpKSB7Ci0gICAgICB1aW50MTZfdCBjaWQgPSBpdGVyLT5maXJzdDsKLSAgICAgIGRpc2Nvbm5lY3RfY2hhbm5lbChjaWQpOwotICAgICAgLyogV2hlbiBpbml0aWF0aW5nIGRpc2Nvbm5lY3Rpb24sIHN0YWNrIHdpbGwgbm90IG5vdGlmeSB1cyB0aGF0IGl0IGlzCi0gICAgICAgKiBkb25lLiBXZSBuZWVkIHRvIGFzc3VtZSBzdWNjZXNzCi0gICAgICAgKi8KLSAgICAgIGl0ZXIgPSBlYXR0X2Rldi0+ZWF0dF9jaGFubmVscy5lcmFzZShpdGVyKTsKLSAgICB9Ci0gICAgZWF0dF9kZXYtPmVhdHRfdGNiXy0+ZWF0dCA9IDA7Ci0gICAgZWF0dF9kZXYtPmVhdHRfdGNiXyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIGNvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAgIGVhdHRfZGV2aWNlKiBlYXR0X2RldiA9IGZpbmRfZGV2aWNlX2J5X2FkZHJlc3MoYmRfYWRkcik7Ci0KLSAgICB1aW50OF90IHJvbGUgPSBMMkNBX0dldEJsZUNvbm5Sb2xlKGJkX2FkZHIpOwotICAgIGlmIChyb2xlID09IEhDSV9ST0xFX1VOS05PV04pIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIkNvdWxkIG5vdCBnZXQgZGV2aWNlIHJvbGUiIDw8IGJkX2FkZHI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgZGV2aWNlICIgPDwgYmRfYWRkciA8PCAiIHJvbGUiCi0gICAgICAgICAgICAgIDw8IChyb2xlID09IEhDSV9ST0xFX0NFTlRSQUwgPyAiY2VudHJhbCIgOiAicGVyaXBoZXJhbCIpOwotCi0gICAgaWYgKGVhdHRfZGV2KSB7Ci0gICAgICAvKiBXZSBhcmUgcmVjb25uZWN0aW5nIGRldmljZSB3ZSBrbm93IHRoYXQgc3VwcG9ydCBFQVRULgotICAgICAgICogSnVzdCBjb25uZWN0IENvQwotICAgICAgICovCi0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBLbm93biBkZXZpY2UsIGNvbm5lY3QgZUNvQyI7Ci0KLSAgICAgIGlmIChyb2xlICE9IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICAgICAgTE9HKElORk8pCi0gICAgICAgICAgICA8PCAiIEVBVFQgU2hvdWxkIGJlIGNvbm5lY3RlZCBieSB0aGUgY2VudHJhbC4gTGV0J3Mgd2FpdCBmb3IgaXQuIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBjb25uZWN0X2VhdHQoZWF0dF9kZXYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEZvciBuZXcgZGV2aWNlLCBmaXJzdCByZWFkIEdBVFQgc2VydmVyIHN1cHBvcnRlZCBmZWF0dXJlcy4gKi8KLSAgICBpZiAoZ2F0dF9jbF9yZWFkX3NyX3N1cHBfZmVhdF9yZXEoCi0gICAgICAgICAgICBiZF9hZGRyLCBiYXNlOjpCaW5kT25jZSgmZWF0dF9pbXBsOjpzdXBwb3J0ZWRfZmVhdHVyZXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCByb2xlKSkgPT0gZmFsc2UpIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiRWF0dCBpcyBub3Qgc3VwcG9ydGVkLiBDaGVja2VkIGZvciBkZXZpY2UgIgotICAgICAgICAgICAgICAgIDw8IGJkX2FkZHI7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBhZGRfZnJvbV9zdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgICBlYXR0X2RldmljZSogZWF0dF9kZXYgPSBmaW5kX2RldmljZV9ieV9hZGRyZXNzKGJkX2FkZHIpOwotCi0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIsIHJlc3RvcmluZzogIiA8PCBiZF9hZGRyOwotCi0gICAgaWYgKCFlYXR0X2RldikgYWRkX2VhdHRfZGV2aWNlKGJkX2FkZHIpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZWF0dAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svZ2FwL2dhcF9ibGUuY2MgYi9zdGFjay9nYXAvZ2FwX2JsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZjQ1OC4uMDAwMDAwMAotLS0gYS9zdGFjay9nYXAvZ2FwX2JsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNpbmNsdWRlICJnYXR0X2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1uYW1lc3BhY2UgewotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHV1aWQ7Ci0gIHRHQVBfQkxFX0NNUExfQ0JBQ0sqIHBfY2JhY2s7Ci19IHRHQVBfUkVRVUVTVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkYTsKLSAgdEdBUF9CTEVfQ01QTF9DQkFDSyogcF9jYmFjazsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdWludDE2X3QgY2xfb3BfdXVpZDsKLSAgYm9vbCBjb25uZWN0ZWQ7Ci0gIHN0ZDo6cXVldWU8dEdBUF9SRVFVRVNUPiByZXF1ZXN0czsKLX0gdEdBUF9DTENCOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgdXVpZDsKLSAgdEdBUF9CTEVfQVRUUl9WQUxVRSBhdHRyX3ZhbHVlOwotfSB0R0FQX0FUVFI7Ci0KLXZvaWQgc2VydmVyX2F0dHJfcmVxdWVzdF9jYmFjayh1aW50MTZfdCwgdWludDMyX3QsIHRHQVRUU19SRVFfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVFNfREFUQSopOwotdm9pZCBjbGllbnRfY29ubmVjdF9jYmFjayh0R0FUVF9JRiwgY29uc3QgUmF3QWRkcmVzcyYsIHVpbnQxNl90LCBib29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDT05OX1JFQVNPTiwgdEJUX1RSQU5TUE9SVCk7Ci12b2lkIGNsaWVudF9jbXBsX2NiYWNrKHVpbnQxNl90LCB0R0FUVENfT1BUWVBFLCB0R0FUVF9TVEFUVVMsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NMX0NPTVBMRVRFKik7Ci0KLXRHQVRUX0NCQUNLIGdhcF9jYmFjayA9IHsKLSAgICAucF9jb25uX2NiID0gY2xpZW50X2Nvbm5lY3RfY2JhY2ssCi0gICAgLnBfY21wbF9jYiA9IGNsaWVudF9jbXBsX2NiYWNrLAotICAgIC5wX2Rpc2NfcmVzX2NiID0gbnVsbHB0ciwKLSAgICAucF9kaXNjX2NtcGxfY2IgPSBudWxscHRyLAotICAgIC5wX3JlcV9jYiA9IHNlcnZlcl9hdHRyX3JlcXVlc3RfY2JhY2ssCi0gICAgLnBfZW5jX2NtcGxfY2IgPSBudWxscHRyLAotICAgIC5wX2Nvbmdlc3Rpb25fY2IgPSBudWxscHRyLAotICAgIC5wX3BoeV91cGRhdGVfY2IgPSBudWxscHRyLAotICAgIC5wX2Nvbm5fdXBkYXRlX2NiID0gbnVsbHB0ciwKLX07Ci0KLWNvbnN0ZXhwciBpbnQgR0FQX0NIQVJfREVWX05BTUVfU0laRSA9IEJEX05BTUVfTEVOOwotY29uc3RleHByIGludCBHQVBfTUFYX0NIQVJfTlVNID0gNDsKLQotc3RkOjp2ZWN0b3I8dEdBUF9DTENCPiBnYXBfY2xjYnM7Ci0vKiBMRSBHQVAgYXR0cmlidXRlIGRhdGFiYXNlICovCi1zdGQ6OmFycmF5PHRHQVBfQVRUUiwgR0FQX01BWF9DSEFSX05VTT4gZ2F0dF9hdHRyOwotdEdBVFRfSUYgZ2F0dF9pZjsKLQotLyoqIHJldHVybnMgTENCIHdpdGggbWFjdGhpbmcgYmQgYWRkcmVzcywgb3IgbnVsbHB0ciAqLwotdEdBUF9DTENCKiBmaW5kX2NsY2JfYnlfYmRfYWRkcihjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgZm9yIChhdXRvJiBjYiA6IGdhcF9jbGNicykKLSAgICBpZiAoY2IuYmRhID09IGJkYSkgcmV0dXJuICZjYjsKLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLyoqIHJldHVybnMgTENCIHdpdGggbWFjdGhpbmcgY29ubmVjdGlvbiBJRCwgb3IgbnVsbHB0ciBpZiBub3QgZm91bmQgICovCi10R0FQX0NMQ0IqIGJsZV9maW5kX2NsY2JfYnlfY29ubl9pZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIGZvciAoYXV0byYgY2IgOiBnYXBfY2xjYnMpCi0gICAgaWYgKGNiLmNvbm5lY3RlZCAmJiBjYi5jb25uX2lkID09IGNvbm5faWQpIHJldHVybiAmY2I7Ci0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLS8qKiBhbGxvY2F0ZXMgYSBHQVAgY29ubmVjdGlvbiBsaW5rIGNvbnRyb2wgYmxvY2sgKi8KLXRHQVBfQ0xDQiogY2xjYl9hbGxvYyhjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgZ2FwX2NsY2JzLmVtcGxhY2VfYmFjaygpOwotICB0R0FQX0NMQ0ImIGNiID0gZ2FwX2NsY2JzLmJhY2soKTsKLSAgY2IuYmRhID0gYmRhOwotICByZXR1cm4gJmNiOwotfQotCi0vKiogVGhlIGZ1bmN0aW9uIGNsZWFuIHVwIHRoZSBwZW5kaW5nIHJlcXVlc3QgcXVldWUgaW4gR0FQICovCi12b2lkIGNsY2JfZGVhbGxvYyh0R0FQX0NMQ0ImIGNsY2IpIHsKLSAgLy8gcHV0IGxhc3QgZWxlbWVudCBpbnRvIHBsYWNlIG9mIGN1cnJlbnQgZWxlbWVudCwgYW5kIHJlbW92ZSBsYXN0IG9uZSAtIGp1c3QKLSAgLy8gZmFzdCByZW1vdmUuCi0gIGZvciAoYXV0byBpdCA9IGdhcF9jbGNicy5iZWdpbigpOyBpdCAhPSBnYXBfY2xjYnMuZW5kKCk7IGl0KyspIHsKLSAgICBpZiAoaXQtPmNvbm5faWQgPT0gY2xjYi5jb25uX2lkKSB7Ci0gICAgICBhdXRvIGxhc3Rfb25lID0gc3RkOjpwcmV2KGdhcF9jbGNicy5lbmQoKSk7Ci0gICAgICAqaXQgPSAqbGFzdF9vbmU7Ci0gICAgICBnYXBfY2xjYnMuZXJhc2UobGFzdF9vbmUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0vKiogR0FQIEF0dHJpYnV0ZXMgRGF0YWJhc2UgUmVxdWVzdCBjYWxsYmFjayAqLwotdEdBVFRfU1RBVFVTIHJlYWRfYXR0cl92YWx1ZSh1aW50MTZfdCBoYW5kbGUsIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xvbmcpIHsKLSAgdWludDhfdCogcCA9IHBfdmFsdWUtPnZhbHVlOwotICB1aW50MTZfdCBvZmZzZXQgPSBwX3ZhbHVlLT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZGV2X25hbWUgPSBOVUxMOwotCi0gIGZvciAoY29uc3QgdEdBUF9BVFRSJiBkYl9hdHRyIDogZ2F0dF9hdHRyKSB7Ci0gICAgY29uc3QgdEdBUF9CTEVfQVRUUl9WQUxVRSYgYXR0cl92YWx1ZSA9IGRiX2F0dHIuYXR0cl92YWx1ZTsKLSAgICBpZiAoaGFuZGxlID09IGRiX2F0dHIuaGFuZGxlKSB7Ci0gICAgICBpZiAoZGJfYXR0ci51dWlkICE9IEdBVFRfVVVJRF9HQVBfREVWSUNFX05BTUUgJiYgaXNfbG9uZykKLSAgICAgICAgcmV0dXJuIEdBVFRfTk9UX0xPTkc7Ci0KLSAgICAgIHN3aXRjaCAoZGJfYXR0ci51dWlkKSB7Ci0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0dBUF9ERVZJQ0VfTkFNRToKLSAgICAgICAgICBCVE1fUmVhZExvY2FsRGV2aWNlTmFtZSgoY2hhcioqKSZwX2Rldl9uYW1lKTsKLSAgICAgICAgICBpZiAoc3RybGVuKChjaGFyKilwX2Rldl9uYW1lKSA+IEdBVFRfTUFYX0FUVFJfTEVOKQotICAgICAgICAgICAgcF92YWx1ZS0+bGVuID0gR0FUVF9NQVhfQVRUUl9MRU47Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcF92YWx1ZS0+bGVuID0gKHVpbnQxNl90KXN0cmxlbigoY2hhciopcF9kZXZfbmFtZSk7Ci0KLSAgICAgICAgICBpZiAob2Zmc2V0ID4gcF92YWx1ZS0+bGVuKQotICAgICAgICAgICAgcmV0dXJuIEdBVFRfSU5WQUxJRF9PRkZTRVQ7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwX3ZhbHVlLT5sZW4gLT0gb2Zmc2V0OwotICAgICAgICAgICAgcF9kZXZfbmFtZSArPSBvZmZzZXQ7Ci0gICAgICAgICAgICBBUlJBWV9UT19TVFJFQU0ocCwgcF9kZXZfbmFtZSwgcF92YWx1ZS0+bGVuKTsKLSAgICAgICAgICAgIERWTE9HKDEpIDw8ICJHQVRUX1VVSURfR0FQX0RFVklDRV9OQU1FIGxlbj0iIDw8ICtwX3ZhbHVlLT5sZW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0dBUF9JQ09OOgotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgYXR0cl92YWx1ZS5pY29uKTsKLSAgICAgICAgICBwX3ZhbHVlLT5sZW4gPSAyOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0dBUF9QUkVGX0NPTk5fUEFSQU06Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBhdHRyX3ZhbHVlLmNvbm5fcGFyYW0uaW50X21pbik7IC8qIGludF9taW4gKi8KLSAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGF0dHJfdmFsdWUuY29ubl9wYXJhbS5pbnRfbWF4KTsgLyogaW50X21heCAqLwotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgYXR0cl92YWx1ZS5jb25uX3BhcmFtLmxhdGVuY3kpOyAvKiBsYXRlbmN5ICovCi0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBhdHRyX3ZhbHVlLmNvbm5fcGFyYW0uc3BfdG91dCk7IC8qIHNwX3RvdXQgKi8KLSAgICAgICAgICBwX3ZhbHVlLT5sZW4gPSA4OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIGFkZHJlc3MgcmVzb2x1dGlvbiAqLwotICAgICAgICBjYXNlIEdBVFRfVVVJRF9HQVBfQ0VOVFJBTF9BRERSX1JFU09MOgotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBhdHRyX3ZhbHVlLmFkZHJfcmVzb2x1dGlvbik7Ci0gICAgICAgICAgcF92YWx1ZS0+bGVuID0gMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci0gICAgfQotICB9Ci0gIHJldHVybiBHQVRUX05PVF9GT1VORDsKLX0KLQotLyoqIEdBUCBBdHRyaWJ1dGVzIERhdGFiYXNlIFJlYWQvUmVhZCBCbG9iIFJlcXVlc3QgcHJvY2VzcyAqLwotdEdBVFRfU1RBVFVTIHByb2NfcmVhZCh0R0FUVFNfUkVRX1RZUEUsIHRHQVRUX1JFQURfUkVRKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SU1AqIHBfcnNwKSB7Ci0gIGlmIChwX2RhdGEtPmlzX2xvbmcpIHBfcnNwLT5hdHRyX3ZhbHVlLm9mZnNldCA9IHBfZGF0YS0+b2Zmc2V0OwotCi0gIHBfcnNwLT5hdHRyX3ZhbHVlLmhhbmRsZSA9IHBfZGF0YS0+aGFuZGxlOwotCi0gIHJldHVybiByZWFkX2F0dHJfdmFsdWUocF9kYXRhLT5oYW5kbGUsICZwX3JzcC0+YXR0cl92YWx1ZSwgcF9kYXRhLT5pc19sb25nKTsKLX0KLQotLyoqIEdBUCBBVFQgc2VydmVyIHByb2Nlc3MgYSB3cml0ZSByZXF1ZXN0ICovCi10R0FUVF9TVEFUVVMgcHJvY193cml0ZV9yZXEodEdBVFRTX1JFUV9UWVBFLCB0R0FUVF9XUklURV9SRVEqIHBfZGF0YSkgewotICBmb3IgKGNvbnN0IGF1dG8mIGRiX2FkZHIgOiBnYXR0X2F0dHIpCi0gICAgaWYgKHBfZGF0YS0+aGFuZGxlID09IGRiX2FkZHIuaGFuZGxlKSByZXR1cm4gR0FUVF9XUklURV9OT1RfUEVSTUlUOwotCi0gIHJldHVybiBHQVRUX05PVF9GT1VORDsKLX0KLQotLyoqIEdBUCBBVFQgc2VydmVyIGF0dHJpYnV0ZSBhY2Nlc3MgcmVxdWVzdCBjYWxsYmFjayAqLwotdm9pZCBzZXJ2ZXJfYXR0cl9yZXF1ZXN0X2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSB0eXBlLCB0R0FUVFNfREFUQSogcF9kYXRhKSB7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBHQVRUX0lOVkFMSURfUERVOwotICBib29sIGlnbm9yZSA9IGZhbHNlOwotCi0gIERWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiJXM6IHJlY3YgdHlwZSAoMHglMDJ4KSIsIF9fZnVuY19fLCB0eXBlKTsKLQotICB0R0FUVFNfUlNQIHJzcF9tc2c7Ci0gIG1lbXNldCgmcnNwX21zZywgMCwgc2l6ZW9mKHRHQVRUU19SU1ApKTsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEdBVFRTX1JFUV9UWVBFX1JFQURfQ0hBUkFDVEVSSVNUSUM6Ci0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9SRUFEX0RFU0NSSVBUT1I6Ci0gICAgICBzdGF0dXMgPSBwcm9jX3JlYWQodHlwZSwgJnBfZGF0YS0+cmVhZF9yZXEsICZyc3BfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9XUklURV9DSEFSQUNURVJJU1RJQzoKLSAgICBjYXNlIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0RFU0NSSVBUT1I6Ci0gICAgICBpZiAoIXBfZGF0YS0+d3JpdGVfcmVxLm5lZWRfcnNwKSBpZ25vcmUgPSB0cnVlOwotCi0gICAgICBzdGF0dXMgPSBwcm9jX3dyaXRlX3JlcSh0eXBlLCAmcF9kYXRhLT53cml0ZV9yZXEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0VYRUM6Ci0gICAgICBpZ25vcmUgPSB0cnVlOwotICAgICAgRFZMT0coMSkgPDwgIklnbm9yZSBHQVRUU19SRVFfVFlQRV9XUklURV9FWEVDIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9NVFU6Ci0gICAgICBEVkxPRygxKSA8PCAiR2V0IE1UVSBleGNoYW5nZSBuZXcgbXR1IHNpemU6ICIgPDwgK3BfZGF0YS0+bXR1OwotICAgICAgaWdub3JlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIERWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiVW5rbm93bi91bmV4cGVjdGVkIExFIEdBUCBBVFQgcmVxdWVzdDogMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCFpZ25vcmUpIEdBVFRTX1NlbmRSc3AoY29ubl9pZCwgdHJhbnNfaWQsIHN0YXR1cywgJnJzcF9tc2cpOwotfQotCi0vKioKLSAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBhIHJlYWQgcmVxdWVzdCBmb3IgYSBHQVAgY2hhcmFjdGVyc2l0aWMuCi0gKiBSZXR1cm5zIHRydWUgaWYgcmVhZCBzdGFydGVkLCBlbHNlIGZhbHNlIGlmIEdBUCBpcyBidXN5LgotICovCi1ib29sIHNlbmRfY2xfcmVhZF9yZXF1ZXN0KHRHQVBfQ0xDQiYgY2xjYikgewotICBpZiAoIWNsY2IucmVxdWVzdHMuc2l6ZSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdEdBUF9SRVFVRVNUJiByZXEgPSBjbGNiLnJlcXVlc3RzLmZyb250KCk7Ci0gIGNsY2IucF9jYmFjayA9IHJlcS5wX2NiYWNrOwotICB1aW50MTZfdCB1dWlkID0gcmVxLnV1aWQ7Ci0gIGNsY2IucmVxdWVzdHMucG9wKCk7Ci0KLSAgdEdBVFRfUkVBRF9QQVJBTSBwYXJhbTsKLSAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHRHQVRUX1JFQURfUEFSQU0pKTsKLQotICBwYXJhbS5zZXJ2aWNlLnV1aWQgPSBVdWlkOjpGcm9tMTZCaXQodXVpZCk7Ci0gIHBhcmFtLnNlcnZpY2Uuc19oYW5kbGUgPSAxOwotICBwYXJhbS5zZXJ2aWNlLmVfaGFuZGxlID0gMHhGRkZGOwotICBwYXJhbS5zZXJ2aWNlLmF1dGhfcmVxID0gMDsKLQotICBpZiAoR0FUVENfUmVhZChjbGNiLmNvbm5faWQsIEdBVFRfUkVBRF9CWV9UWVBFLCAmcGFyYW0pID09IEdBVFRfU1VDQ0VTUykgewotICAgIGNsY2IuY2xfb3BfdXVpZCA9IHV1aWQ7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqIEdBUCBjbGllbnQgb3BlcmF0aW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCi12b2lkIGNsX29wX2NtcGwodEdBUF9DTENCJiBjbGNiLCBib29sIHN0YXR1cywgdWludDE2X3QgbGVuLCB1aW50OF90KiBwX25hbWUpIHsKLSAgdEdBUF9CTEVfQ01QTF9DQkFDSyogcF9jYmFjayA9IGNsY2IucF9jYmFjazsKLSAgdWludDE2X3Qgb3AgPSBjbGNiLmNsX29wX3V1aWQ7Ci0KLSAgRFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCIlczogc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotCi0gIGNsY2IuY2xfb3BfdXVpZCA9IDA7Ci0gIGNsY2IucF9jYmFjayA9IE5VTEw7Ci0KLSAgaWYgKHBfY2JhY2sgJiYgb3ApIHsKLSAgICBEVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjYWxsaW5nIjsKLSAgICAoKnBfY2JhY2spKHN0YXR1cywgY2xjYi5iZGEsIGxlbiwgKGNoYXIqKXBfbmFtZSk7Ci0gIH0KLQotICAvKiBpZiBubyBmdXJ0aGVyIGFjdGl2aXR5IGlzIHJlcXVlc3RlZCBpbiBjYWxsYmFjaywgZHJvcCB0aGUgbGluayAqLwotICBpZiAoY2xjYi5jb25uZWN0ZWQpIHsKLSAgICBpZiAoIXNlbmRfY2xfcmVhZF9yZXF1ZXN0KGNsY2IpKSB7Ci0gICAgICBHQVRUX0Rpc2Nvbm5lY3QoY2xjYi5jb25uX2lkKTsKLSAgICAgIGNsY2JfZGVhbGxvYyhjbGNiKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIENsaWVudCBjb25uZWN0aW9uIGNhbGxiYWNrICovCi12b2lkIGNsaWVudF9jb25uZWN0X2NiYWNrKHRHQVRUX0lGLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkLCB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQpIHsKLSAgdEdBUF9DTENCKiBwX2NsY2IgPSBmaW5kX2NsY2JfYnlfYmRfYWRkcihiZGEpOwotICBpZiAocF9jbGNiID09IE5VTEwpIHsKLSAgICBMT0dfSU5GTygiTm8gYWN0aXZlIEdBUCBzZXJ2aWNlIGZvdW5kIGZvciBwZWVyOiVzIGNhbGxiYWNrOiVzIiwKLSAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRhKSwgKGNvbm5lY3RlZCkgPyAiQ29ubmVjdGVkIiA6ICJEaXNjb25uZWN0ZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgTE9HX0RFQlVHKCJDb25uZWN0ZWQgR0FQIHRvIHJlbW90ZSBkZXZpY2UiKTsKLSAgICBwX2NsY2ItPmNvbm5faWQgPSBjb25uX2lkOwotICAgIHBfY2xjYi0+Y29ubmVjdGVkID0gdHJ1ZTsKLSAgICAvKiBzdGFydCBvcGVyYXRpb24gaXMgcGVuZGluZyAqLwotICAgIHNlbmRfY2xfcmVhZF9yZXF1ZXN0KCpwX2NsY2IpOwotICB9IGVsc2UgewotICAgIExPR19XQVJOKCJEaXNjb25uZWN0ZWQgR0FQIGZyb20gcmVtb3RlIGRldmljZSIpOwotICAgIHBfY2xjYi0+Y29ubmVjdGVkID0gZmFsc2U7Ci0gICAgY2xfb3BfY21wbCgqcF9jbGNiLCBmYWxzZSwgMCwgTlVMTCk7Ci0gICAgLyogY2xlYW4gdXAgY2xjYiAqLwotICAgIGNsY2JfZGVhbGxvYygqcF9jbGNiKTsKLSAgfQotfQotCi0vKiogQ2xpZW50IG9wZXJhdGlvbiBjb21wbGV0ZSBjYWxsYmFjayAqLwotdm9pZCBjbGllbnRfY21wbF9jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhKSB7Ci0gIHRHQVBfQ0xDQiogcF9jbGNiID0gYmxlX2ZpbmRfY2xjYl9ieV9jb25uX2lkKGNvbm5faWQpOwotICB1aW50MTZfdCBvcF90eXBlOwotICB1aW50MTZfdCBtaW4sIG1heCwgbGF0ZW5jeSwgdG91dDsKLSAgdWludDE2X3QgbGVuOwotICB1aW50OF90KiBwcDsKLQotICBpZiAocF9jbGNiID09IE5VTEwpIHJldHVybjsKLQotICBvcF90eXBlID0gcF9jbGNiLT5jbF9vcF91dWlkOwotCi0gIERWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICIlczogLSBvcF9jb2RlOiAweCUwMnggIHN0YXR1czogMHglMDJ4ICByZWFkX3R5cGU6IDB4JTA0eCIsIF9fZnVuY19fLCBvcCwKLSAgICAgIHN0YXR1cywgb3BfdHlwZSk7Ci0gIC8qIEN1cnJlbnRseSB3ZSBvbmx5IGlzc3VlIHJlYWQgY29tbWFuZHMgKi8KLSAgaWYgKG9wICE9IEdBVFRDX09QVFlQRV9SRUFEKSByZXR1cm47Ci0KLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBjbF9vcF9jbXBsKCpwX2NsY2IsIGZhbHNlLCAwLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwcCA9IHBfZGF0YS0+YXR0X3ZhbHVlLnZhbHVlOwotICBzd2l0Y2ggKG9wX3R5cGUpIHsKLSAgICBjYXNlIEdBVFRfVVVJRF9HQVBfUFJFRl9DT05OX1BBUkFNOgotICAgICAgLyogRXh0cmFjdCB0aGUgcGVyaXBoZXJhbCBwcmVmZXJyZWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGFuZCBzYXZlIHRoZW0gKi8KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYobWluLCBwcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG1heCwgcHApOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihsYXRlbmN5LCBwcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KHRvdXQsIHBwKTsKLQotICAgICAgQlRNX0JsZVNldFByZWZDb25uUGFyYW1zKHBfY2xjYi0+YmRhLCBtaW4sIG1heCwgbGF0ZW5jeSwgdG91dCk7Ci0gICAgICAvKiByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGhlcmUgKi8KLSAgICAgIGNsX29wX2NtcGwoKnBfY2xjYiwgdHJ1ZSwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9VVUlEX0dBUF9ERVZJQ0VfTkFNRToKLSAgICAgIGxlbiA9ICh1aW50MTZfdClzdHJsZW4oKGNoYXIqKXBwKTsKLSAgICAgIGlmIChsZW4gPiBHQVBfQ0hBUl9ERVZfTkFNRV9TSVpFKSBsZW4gPSBHQVBfQ0hBUl9ERVZfTkFNRV9TSVpFOwotICAgICAgY2xfb3BfY21wbCgqcF9jbGNiLCB0cnVlLCBsZW4sIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1VVSURfR0FQX0NFTlRSQUxfQUREUl9SRVNPTDoKLSAgICAgIGNsX29wX2NtcGwoKnBfY2xjYiwgdHJ1ZSwgMSwgcHApOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotYm9vbCBhY2NlcHRfY2xpZW50X29wZXJhdGlvbihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSwgdWludDE2X3QgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBUF9CTEVfQ01QTF9DQkFDSyogcF9jYmFjaykgewotICBpZiAocF9jYmFjayA9PSBOVUxMICYmIHV1aWQgIT0gR0FUVF9VVUlEX0dBUF9QUkVGX0NPTk5fUEFSQU0pIHJldHVybiBmYWxzZTsKLQotICB0R0FQX0NMQ0IqIHBfY2xjYiA9IGZpbmRfY2xjYl9ieV9iZF9hZGRyKHBlZXJfYmRhKTsKLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSB7Ci0gICAgcF9jbGNiID0gY2xjYl9hbGxvYyhwZWVyX2JkYSk7Ci0gIH0KLQotICBEVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBCREE6ICIgPDwgcGVlcl9iZGEKLSAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgY2xfb3BfdXVpZDogMHglMDR4IiwgdXVpZCk7Ci0KLSAgaWYgKEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQoZ2F0dF9pZiwgcGVlcl9iZGEsICZwX2NsY2ItPmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9MRSkpCi0gICAgcF9jbGNiLT5jb25uZWN0ZWQgPSB0cnVlOwotCi0gIGlmICghR0FUVF9Db25uZWN0KGdhdHRfaWYsIHBfY2xjYi0+YmRhLCB0cnVlLCBCVF9UUkFOU1BPUlRfTEUsIHRydWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBlbnF1ZXVlIHRoZSByZXF1ZXN0ICovCi0gIHBfY2xjYi0+cmVxdWVzdHMucHVzaCh7LnV1aWQgPSB1dWlkLCAucF9jYmFjayA9IHBfY2JhY2t9KTsKLQotICBpZiAocF9jbGNiLT5jb25uZWN0ZWQgJiYgcF9jbGNiLT5jbF9vcF91dWlkID09IDApCi0gICAgcmV0dXJuIHNlbmRfY2xfcmVhZF9yZXF1ZXN0KCpwX2NsY2IpOwotICBlbHNlIC8qIHdhaXQgZm9yIGNvbm5lY3Rpb24gdXAgb3IgcGVuZGluZyBvcGVyYXRpb24gdG8gZmluaXNoICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9hdHRfZGJfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR0FQIEFUVCBkYXRhYmFzZSBpbml0YWxpemF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXBfYXR0cl9kYl9pbml0KHZvaWQpIHsKLSAgdWludDE2X3Qgc2VydmljZV9oYW5kbGU7Ci0KLSAgLyogRmlsbCBvdXIgaW50ZXJuYWwgVVVJRCB3aXRoIGEgZml4ZWQgcGF0dGVybiAweDgyICovCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgVXVpZDo6a051bUJ5dGVzMTI4PiB0bXA7Ci0gIHRtcC5maWxsKDB4ODIpOwotICBVdWlkIGFwcF91dWlkID0gVXVpZDo6RnJvbTEyOEJpdEJFKHRtcCk7Ci0gIGdhdHRfYXR0ci5maWxsKHt9KTsKLQotICBnYXR0X2lmID0gR0FUVF9SZWdpc3RlcihhcHBfdXVpZCwgIkdhcCIsICZnYXBfY2JhY2ssIGZhbHNlKTsKLQotICBHQVRUX1N0YXJ0SWYoZ2F0dF9pZik7Ci0KLSAgVXVpZCBzdmNfdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVBfU0VSVkVSKTsKLSAgVXVpZCBuYW1lX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0dBUF9ERVZJQ0VfTkFNRSk7Ci0gIFV1aWQgaWNvbl91dWlkID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9HQVBfSUNPTik7Ci0gIFV1aWQgYWRkcl9yZXNfdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfR0FQX0NFTlRSQUxfQUREUl9SRVNPTCk7Ci0KLSAgYnRnYXR0X2RiX2VsZW1lbnRfdCBzZXJ2aWNlW10gPSB7Ci0gICAgewotICAgICAgICAudXVpZCA9IHN2Y191dWlkLAotICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9QUklNQVJZX1NFUlZJQ0UsCi0gICAgfSwKLSAgICB7LnV1aWQgPSBuYW1lX3V1aWQsCi0gICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFELAotICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRH0sCi0gICAgey51dWlkID0gaWNvbl91dWlkLAotICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICAgLnBlcm1pc3Npb25zID0gR0FUVF9QRVJNX1JFQUR9LAotICAgIHsudXVpZCA9IGFkZHJfcmVzX3V1aWQsCi0gICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFELAotICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRH0KLSNpZiAoQlRNX1BFUklQSEVSQUxfRU5BQkxFRCA9PSBUUlVFKSAvKiBPbmx5IG5lZWRlZCBmb3IgcGVyaXBoZXJhbCB0ZXN0aW5nICovCi0gICAgLAotICAgIHsudXVpZCA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfR0FQX1BSRUZfQ09OTl9QQVJBTSksCi0gICAgIC50eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDLAotICAgICAucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFELAotICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRH0KLSNlbmRpZgotICB9OwotCi0gIC8qIEFkZCBhIEdBUCBzZXJ2aWNlICovCi0gIEdBVFRTX0FkZFNlcnZpY2UoZ2F0dF9pZiwgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2VydmljZSkgLyBzaXplb2YoYnRnYXR0X2RiX2VsZW1lbnRfdCkpOwotICBzZXJ2aWNlX2hhbmRsZSA9IHNlcnZpY2VbMF0uYXR0cmlidXRlX2hhbmRsZTsKLQotICBEVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2aWNlX2hhbmRsZSA9ICIgPDwgK3NlcnZpY2VfaGFuZGxlOwotCi0gIGdhdHRfYXR0clswXS51dWlkID0gR0FUVF9VVUlEX0dBUF9ERVZJQ0VfTkFNRTsKLSAgZ2F0dF9hdHRyWzBdLmhhbmRsZSA9IHNlcnZpY2VbMV0uYXR0cmlidXRlX2hhbmRsZTsKLQotICBnYXR0X2F0dHJbMV0udXVpZCA9IEdBVFRfVVVJRF9HQVBfSUNPTjsKLSAgZ2F0dF9hdHRyWzFdLmhhbmRsZSA9IHNlcnZpY2VbMl0uYXR0cmlidXRlX2hhbmRsZTsKLQotICBnYXR0X2F0dHJbMl0udXVpZCA9IEdBVFRfVVVJRF9HQVBfQ0VOVFJBTF9BRERSX1JFU09MOwotICBnYXR0X2F0dHJbMl0uaGFuZGxlID0gc2VydmljZVszXS5hdHRyaWJ1dGVfaGFuZGxlOwotICBnYXR0X2F0dHJbMl0uYXR0cl92YWx1ZS5hZGRyX3Jlc29sdXRpb24gPSAwOwotCi0jaWYgKEJUTV9QRVJJUEhFUkFMX0VOQUJMRUQgPT0gVFJVRSkgLyogIE9ubHkgbmVlZGVkIGZvciBwZXJpcGhlcmFsIHRlc3RpbmcgKi8KLQotICBnYXR0X2F0dHJbM10udXVpZCA9IEdBVFRfVVVJRF9HQVBfUFJFRl9DT05OX1BBUkFNOwotICBnYXR0X2F0dHJbM10uYXR0cl92YWx1ZS5jb25uX3BhcmFtLmludF9tYXggPSBHQVBfUFJFRkVSX0NPTk5fSU5UX01BWDsgLyogNiAqLwotICBnYXR0X2F0dHJbM10uYXR0cl92YWx1ZS5jb25uX3BhcmFtLmludF9taW4gPSBHQVBfUFJFRkVSX0NPTk5fSU5UX01JTjsgLyogMCAqLwotICBnYXR0X2F0dHJbM10uYXR0cl92YWx1ZS5jb25uX3BhcmFtLmxhdGVuY3kgPSBHQVBfUFJFRkVSX0NPTk5fTEFURU5DWTsgLyogMCAqLwotICBnYXR0X2F0dHJbM10uYXR0cl92YWx1ZS5jb25uX3BhcmFtLnNwX3RvdXQgPQotICAgICAgR0FQX1BSRUZFUl9DT05OX1NQX1RPVVQ7IC8qIDIwMDAgKi8KLSAgZ2F0dF9hdHRyWzNdLmhhbmRsZSA9IHNlcnZpY2VbNF0uYXR0cmlidXRlX2hhbmRsZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0JsZUF0dHJEQlVwZGF0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR0FQIEFUVCBkYXRhYmFzZSB1cGRhdGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgR0FQX0JsZUF0dHJEQlVwZGF0ZSh1aW50MTZfdCBhdHRyX3V1aWQsIHRHQVBfQkxFX0FUVFJfVkFMVUUqIHBfdmFsdWUpIHsKLSAgRFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCIlczogYXR0cl91dWlkPTB4JTA0eCIsIF9fZnVuY19fLCBhdHRyX3V1aWQpOwotCi0gIGZvciAodEdBUF9BVFRSJiBkYl9hdHRyIDogZ2F0dF9hdHRyKSB7Ci0gICAgaWYgKGRiX2F0dHIudXVpZCA9PSBhdHRyX3V1aWQpIHsKLSAgICAgIERWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiRm91bmQgYXR0cl91dWlkPTB4JTA0eCIsIGF0dHJfdXVpZCk7Ci0KLSAgICAgIHN3aXRjaCAoYXR0cl91dWlkKSB7Ci0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0dBUF9JQ09OOgotICAgICAgICAgIGRiX2F0dHIuYXR0cl92YWx1ZS5pY29uID0gcF92YWx1ZS0+aWNvbjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdBVFRfVVVJRF9HQVBfUFJFRl9DT05OX1BBUkFNOgotICAgICAgICAgIG1lbWNweSgodm9pZCopJmRiX2F0dHIuYXR0cl92YWx1ZS5jb25uX3BhcmFtLAotICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCopJnBfdmFsdWUtPmNvbm5fcGFyYW0sCi0gICAgICAgICAgICAgICAgIHNpemVvZih0R0FQX0JMRV9QUkVGX1BBUkFNKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHQVRUX1VVSURfR0FQX0RFVklDRV9OQU1FOgotICAgICAgICAgIEJUTV9TZXRMb2NhbERldmljZU5hbWUoKGNvbnN0IGNoYXIqKXBfdmFsdWUtPnBfZGV2X25hbWUpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0dBUF9DRU5UUkFMX0FERFJfUkVTT0w6Ci0gICAgICAgICAgZGJfYXR0ci5hdHRyX3ZhbHVlLmFkZHJfcmVzb2x1dGlvbiA9IHBfdmFsdWUtPmFkZHJfcmVzb2x1dGlvbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9CbGVSZWFkUGVlclByZWZDb25uUGFyYW1zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBhIHByb2Nlc3MgdG8gcmVhZCBhIGNvbm5lY3RlZCBwZXJpcGhlcmFsJ3MgcHJlZmVycmVkCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gcGFyYW1ldGVycwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWFkIHN0YXJ0ZWQsIGVsc2UgZmFsc2UgaWYgR0FQIGlzIGJ1c3kKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBHQVBfQmxlUmVhZFBlZXJQcmVmQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSkgewotICByZXR1cm4gYWNjZXB0X2NsaWVudF9vcGVyYXRpb24ocGVlcl9iZGEsIEdBVFRfVVVJRF9HQVBfUFJFRl9DT05OX1BBUkFNLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9CbGVSZWFkUGVlckRldk5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IGEgcHJvY2VzcyB0byByZWFkIGEgY29ubmVjdGVkIHBlcmlwaGVyYWwncyBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgbmFtZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVxdWVzdCBhY2NlcHRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEdBUF9CbGVSZWFkUGVlckRldk5hbWUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBUF9CTEVfQ01QTF9DQkFDSyogcF9jYmFjaykgewotICByZXR1cm4gYWNjZXB0X2NsaWVudF9vcGVyYXRpb24ocGVlcl9iZGEsIEdBVFRfVVVJRF9HQVBfREVWSUNFX05BTUUsIHBfY2JhY2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0JsZUNhbmNlbFJlYWRQZWVyRGV2TmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FuY2VsIHJlYWRpbmcgYSBwZXJpcGhlcmFsJ3MgZGV2aWNlIG5hbWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHJlcXVlc3QgYWNjZXB0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBHQVBfQmxlQ2FuY2VsUmVhZFBlZXJEZXZOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRhKSB7Ci0gIHRHQVBfQ0xDQiogcF9jbGNiID0gZmluZF9jbGNiX2J5X2JkX2FkZHIocGVlcl9iZGEpOwotCi0gIERWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IEJEQTogIiA8PCBwZWVyX2JkYQotICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiBjbF9vcF91dWlkOiAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfY2xjYiA9PSBOVUxMKSA/IDAgOiBwX2NsY2ItPmNsX29wX3V1aWQpOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCkgewotICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjYW5jZWwgY3VycmVudCBvcCBpcyBub3QgZ2V0IGRldiBuYW1lIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXBfY2xjYi0+Y29ubmVjdGVkKSB7Ci0gICAgaWYgKCFHQVRUX0NhbmNlbENvbm5lY3QoZ2F0dF9pZiwgcGVlcl9iZGEsIHRydWUpKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY2FuY2VsIHdoZXJlIE5vIGNvbm5lY3Rpb24gaWQiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGNsX29wX2NtcGwoKnBfY2xjYiwgZmFsc2UsIDAsIE5VTEwpOwotCi0gIHJldHVybiAodHJ1ZSk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9nYXAvZ2FwX2Nvbm4uY2MgYi9zdGFjay9nYXAvZ2FwX2Nvbm4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTA2NzAuLjAwMDAwMDAKLS0tIGEvc3RhY2svZ2FwL2dhcF9jb25uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImdhcF9hcGkuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotCi0vKiBEZWZpbmUgdGhlIEdBUCBDb25uZWN0aW9uIENvbnRyb2wgQmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSNkZWZpbmUgR0FQX0NDQl9TVEFURV9JRExFIDAKLSNkZWZpbmUgR0FQX0NDQl9TVEFURV9MSVNURU5JTkcgMQotI2RlZmluZSBHQVBfQ0NCX1NUQVRFX0NPTk5fU0VUVVAgMgotI2RlZmluZSBHQVBfQ0NCX1NUQVRFX0NGR19TRVRVUCAzCi0jZGVmaW5lIEdBUF9DQ0JfU1RBVEVfQ09OTkVDVEVEIDUKLSAgdWludDhfdCBjb25fc3RhdGU7Ci0KLSNkZWZpbmUgR0FQX0NDQl9GTEFHU19JU19PUklHIDB4MDEKLSNkZWZpbmUgR0FQX0NDQl9GTEFHU19ISVNfQ0ZHX0RPTkUgMHgwMgotI2RlZmluZSBHQVBfQ0NCX0ZMQUdTX01ZX0NGR19ET05FIDB4MDQKLSNkZWZpbmUgR0FQX0NDQl9GTEFHU19TRUNfRE9ORSAweDA4Ci0jZGVmaW5lIEdBUF9DQ0JfRkxBR1NfQ09OTl9ET05FIDB4MEUKLSAgdWludDhfdCBjb25fZmxhZ3M7Ci0KLSAgdWludDhfdCBzZXJ2aWNlX2lkOyAgICAgLyogVXNlZCBieSBCVE0gKi8KLSAgdWludDE2X3QgZ2FwX2hhbmRsZTsgICAgLyogR0FQIGhhbmRsZSAqLwotICB1aW50MTZfdCBjb25uZWN0aW9uX2lkOyAvKiBMMkNBUCBDSUQgKi8KLSAgYm9vbCByZW1fYWRkcl9zcGVjaWZpZWQ7Ci0gIHVpbnQ4X3QgY2hhbl9tb2RlX21hc2s7IC8qIFN1cHBvcnRlZCBjaGFubmVsIG1vZGVzIChGQ1IpICovCi0gIFJhd0FkZHJlc3MgcmVtX2Rldl9hZGRyZXNzOwotICB1aW50MTZfdCBwc207Ci0gIHVpbnQxNl90IHJlbV9tdHVfc2l6ZTsKLQotICBib29sIGlzX2Nvbmdlc3RlZDsKLSAgZml4ZWRfcXVldWVfdCogdHhfcXVldWU7IC8qIFF1ZXVlIG9mIGJ1ZmZlcnMgd2FpdGluZyB0byBiZSBzZW50ICovCi0gIGZpeGVkX3F1ZXVlX3QqIHJ4X3F1ZXVlOyAvKiBRdWV1ZSBvZiBidWZmZXJzIHdhaXRpbmcgdG8gYmUgcmVhZCAqLwotCi0gIHVpbnQzMl90IHJ4X3F1ZXVlX3NpemU7IC8qIFRvdGFsIGRhdGEgY291bnQgaW4gcnhfcXVldWUgKi8KLQotICB0R0FQX0NPTk5fQ0FMTEJBQ0sqIHBfY2FsbGJhY2s7IC8qIFVzZXJzIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0KLSAgdEwyQ0FQX0NGR19JTkZPIGNmZzsgICAgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gKi8KLSAgdEwyQ0FQX0VSVE1fSU5GTyBlcnRtX2luZm87ICAgICAgIC8qIFBvb2xzIGFuZCBtb2RlcyBmb3IgZXJ0bSAqLwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsgICAgICAgICAgLyogVHJhbnNwb3J0IGNoYW5uZWwgQlIvRURSIG9yIEJMRSAqLwotICB0TDJDQVBfTEVfQ0ZHX0lORk8gbG9jYWxfY29jX2NmZzsgLyogbG9jYWwgY29uZmlndXJhdGlvbiBmb3IgTEUgQ29jICovCi0gIHRMMkNBUF9MRV9DRkdfSU5GTyBwZWVyX2NvY19jZmc7ICAvKiBsb2NhbCBjb25maWd1cmF0aW9uIGZvciBMRSBDb2MgKi8KLX0gdEdBUF9DQ0I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEwyQ0FQX0FQUExfSU5GTyByZWdfaW5mbzsgLyogTDJDQVAgUmVnaXN0cmF0aW9uIGluZm8gKi8KLSAgdEdBUF9DQ0IgY2NiX3Bvb2xbR0FQX01BWF9DT05ORUNUSU9OU107Ci19IHRHQVBfQ09OTjsKLQotbmFtZXNwYWNlIHsKLXRHQVBfQ09OTiBjb25uOwotfSAgLy8gbmFtZXNwYWNlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhcF9jb25uZWN0X2luZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHNtLCB1aW50OF90IGwyY2FwX2lkKTsKLXN0YXRpYyB2b2lkIGdhcF9jb25uZWN0X2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci1zdGF0aWMgdm9pZCBnYXBfY29uZmlnX2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotc3RhdGljIHZvaWQgZ2FwX2NvbmZpZ19jZm0odWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXN0YXRpYyB2b2lkIGdhcF9kaXNjb25uZWN0X2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIGJvb2wgYWNrX25lZWRlZCk7Ci1zdGF0aWMgdm9pZCBnYXBfZGF0YV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCBCVF9IRFIqIHBfbXNnKTsKLXN0YXRpYyB2b2lkIGdhcF9jb25nZXN0aW9uX2luZCh1aW50MTZfdCBsY2lkLCBib29sIGlzX2Nvbmdlc3RlZCk7Ci1zdGF0aWMgdm9pZCBnYXBfdHhfY29tcGxldGVfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3Qgc2R1X3NlbnQpOwotc3RhdGljIHZvaWQgZ2FwX29uX2wyY2FwX2Vycm9yKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0KTsKLXN0YXRpYyB0R0FQX0NDQiogZ2FwX2ZpbmRfY2NiX2J5X2NpZCh1aW50MTZfdCBjaWQpOwotc3RhdGljIHRHQVBfQ0NCKiBnYXBfZmluZF9jY2JfYnlfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci1zdGF0aWMgdEdBUF9DQ0IqIGdhcF9hbGxvY2F0ZV9jY2Iodm9pZCk7Ci1zdGF0aWMgdm9pZCBnYXBfcmVsZWFzZV9jY2IodEdBUF9DQ0IqIHBfY2NiKTsKLXN0YXRpYyB2b2lkIGdhcF9jaGVja3NfY29uX2ZsYWdzKHRHQVBfQ0NCKiBwX2NjYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfY29ubl9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIEdBUCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXBfY29ubl9pbml0KHZvaWQpIHsKLSAgbWVtc2V0KCZjb25uLCAwLCBzaXplb2YodEdBUF9DT05OKSk7Ci0gIGNvbm4ucmVnX2luZm8ucEwyQ0FfQ29ubmVjdEluZF9DYiA9IGdhcF9jb25uZWN0X2luZDsKLSAgY29ubi5yZWdfaW5mby5wTDJDQV9Db25uZWN0Q2ZtX0NiID0gZ2FwX2Nvbm5lY3RfY2ZtOwotICBjb25uLnJlZ19pbmZvLnBMMkNBX0NvbmZpZ0luZF9DYiA9IGdhcF9jb25maWdfaW5kOwotICBjb25uLnJlZ19pbmZvLnBMMkNBX0NvbmZpZ0NmbV9DYiA9IGdhcF9jb25maWdfY2ZtOwotICBjb25uLnJlZ19pbmZvLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IgPSBnYXBfZGlzY29ubmVjdF9pbmQ7Ci0gIGNvbm4ucmVnX2luZm8ucEwyQ0FfRGF0YUluZF9DYiA9IGdhcF9kYXRhX2luZDsKLSAgY29ubi5yZWdfaW5mby5wTDJDQV9Db25nZXN0aW9uU3RhdHVzX0NiID0gZ2FwX2Nvbmdlc3Rpb25faW5kOwotICBjb25uLnJlZ19pbmZvLnBMMkNBX1R4Q29tcGxldGVfQ2IgPSBnYXBfdHhfY29tcGxldGVfaW5kOwotICBjb25uLnJlZ19pbmZvLnBMMkNBX0Vycm9yX0NiID0gZ2FwX29uX2wyY2FwX2Vycm9yOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0Nvbm5PcGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBvcGVuIGFuIEwyQ0FQIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBpc19zZXJ2ZXIgICAtIElmIHRydWUsIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBjcmVhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHB1dCBpbnRvIGEgImxpc3RlbiIgbW9kZSB3YWl0aW5nIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZW1vdGUgc2lkZSB0byBjb25uZWN0LgotICoKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZV9pZCAgLSBVbmlxdWUgc2VydmljZSBJRCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX1NFQ19TRVJWSUNFX0ZJUlNUX0VNUFRZICg2KQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJUTV9TRUNfTUFYX1NFUlZJQ0VfUkVDT1JEUyAoMzIpCi0gKgotICogICAgICAgICAgICAgICAgICBwX3JlbV9iZGEgICAtIFBvaW50ZXIgdG8gcmVtb3RlIEJEIEFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYSBzZXJ2ZXIsIGFuZCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZSBCRCBBZGRyZXNzLCB0aGVuIE5VTEwgc2hvdWxkIGJlIHBhc3NlZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBzbSAgICAgICAgIC0gdGhlIFBTTSB1c2VkIGZvciB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBsZV9tcHMgICAgICAtIE1heGltdW0gUERVIFNpemUgZm9yIExFIENvQwotICoKLSAqICAgICAgICAgICAgICAgICAgcF9jb25maWcgICAgLSBPcHRpb25hbCBwb2ludGVyIHRvIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIE5VTEwsIHRoZSBkZWZhdWx0IEdBUCBjb25maWd1cmF0aW9uIHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkLgotICoKLSAqICAgICAgICAgICAgICAgICAgc2VjdXJpdHkgICAgLSBzZWN1cml0eSBmbGFncwotICogICAgICAgICAgICAgICAgICBjaGFuX21vZGVfbWFzayAtIChHQVBfRkNSX0NIQU5fT1BUX0JBU0lDLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVBfRkNSX0NIQU5fT1BUX0VSVE0sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBUF9GQ1JfQ0hBTl9PUFRfU1RSRUFNKQotICoKLSAqICAgICAgICAgICAgICAgICAgcF9jYiAgICAgICAgLSBQb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBldmVudHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24gaWYgc3VjY2Vzc2Z1bCwgZWxzZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FQX0lOVkFMSURfSEFORExFCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEdBUF9Db25uT3Blbihjb25zdCBjaGFyKiBwX3NlcnZfbmFtZSwgdWludDhfdCBzZXJ2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc2VydmVyLCBjb25zdCBSYXdBZGRyZXNzKiBwX3JlbV9iZGEsIHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZV9tcHMsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0VSVE1fSU5GTyogZXJ0bV9pbmZvLCB1aW50MTZfdCBzZWN1cml0eSwKLSAgICAgICAgICAgICAgICAgICAgICB0R0FQX0NPTk5fQ0FMTEJBQ0sqIHBfY2IsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHRHQVBfQ0NCKiBwX2NjYjsKLSAgdWludDE2X3QgY2lkOwotCi0gIERWTE9HKDEpIDw8ICJHQVBfQ09OTiAtIE9wZW4gUmVxdWVzdCI7Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgQ0NCLiBSZXR1cm4gaWYgbm9uZSBhdmFpbGFibGUuICovCi0gIHBfY2NiID0gZ2FwX2FsbG9jYXRlX2NjYigpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgcmV0dXJuIChHQVBfSU5WQUxJRF9IQU5ETEUpOwotCi0gIC8qIHVwZGF0ZSB0aGUgdHJhbnNwb3J0ICovCi0gIHBfY2NiLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0KLSAgLyogVGhlIHNlcnZpY2VfaWQgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgZ2FwX3JlbGVhc2VfY2NiKCkuICovCi0gIHBfY2NiLT5zZXJ2aWNlX2lkID0gc2VydmljZV9pZDsKLQotICAvKiBJZiBjYWxsZXIgc3BlY2lmaWVkIGEgQkQgYWRkcmVzcywgc2F2ZSBpdCAqLwotICBpZiAocF9yZW1fYmRhKSB7Ci0gICAgLyogdGhlIGJkIGFkZHIgaXMgbm90IFJhd0FkZHJlc3M6OmtBbnksIHRoZW4gYSBiZCBhZGRyZXNzIHdhcyBzcGVjaWZpZWQgKi8KLSAgICBpZiAoKnBfcmVtX2JkYSAhPSBSYXdBZGRyZXNzOjprQW55KSBwX2NjYi0+cmVtX2FkZHJfc3BlY2lmaWVkID0gdHJ1ZTsKLQotICAgIHBfY2NiLT5yZW1fZGV2X2FkZHJlc3MgPSAqcF9yZW1fYmRhOwotICB9IGVsc2UgaWYgKCFpc19zZXJ2ZXIpIHsKLSAgICAvKiByZW1vcmUgYWRkciBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpcyBub3QgYSBzZXJ2ZXIgLT4gYmFkICovCi0gICAgZ2FwX3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICByZXR1cm4gKEdBUF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICAvKiBBIGNsaWVudCBNVVNUIGhhdmUgc3BlY2lmaWVkIGEgYmQgYWRkciB0byBjb25uZWN0IHdpdGggKi8KLSAgaWYgKCFwX2NjYi0+cmVtX2FkZHJfc3BlY2lmaWVkICYmICFpc19zZXJ2ZXIpIHsKLSAgICBnYXBfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgIExPRyhFUlJPUikKLSAgICAgICAgPDwgIkdBUCBFUlJPUjogQ2xpZW50IG11c3Qgc3BlY2lmeSBhIHJlbW90ZSBCRCBBRERSIHRvIGNvbm5lY3QgdG8hIjsKLSAgICByZXR1cm4gKEdBUF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIHdhcyBzcGVjaWZpZWQgKi8KLSAgaWYgKHBfY2ZnKSBwX2NjYi0+Y2ZnID0gKnBfY2ZnOwotCi0gIC8qIENvbmZpZ3VyZSBMMkNBUCBDT0MsIGlmIHRyYW5zcG9ydCBpcyBMRSAqLwotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIHBfY2NiLT5sb2NhbF9jb2NfY2ZnLmNyZWRpdHMgPSBMMkNBUF9MRV9DUkVESVRfREVGQVVMVDsKLSAgICBwX2NjYi0+bG9jYWxfY29jX2NmZy5tdHUgPSBwX2NmZy0+bXR1OwotCi0gICAgdWludDE2X3QgbWF4X21wcyA9IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWNsX2RhdGFfc2l6ZV9ibGUoKTsKLSAgICBpZiAobGVfbXBzID4gbWF4X21wcykgewotICAgICAgTE9HKElORk8pIDw8ICJMaW1pdGluZyBNUFMgdG8gb25lIGJ1ZmZlciBzaXplIC0gIiA8PCBtYXhfbXBzOwotICAgICAgbGVfbXBzID0gbWF4X21wczsKLSAgICB9Ci0gICAgcF9jY2ItPmxvY2FsX2NvY19jZmcubXBzID0gbGVfbXBzOwotCi0gICAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBjcmVkaXRzPSIgPDwgcF9jY2ItPmxvY2FsX2NvY19jZmcuY3JlZGl0cwotICAgICAgICAgICAgPDwgIiwgbXBzPSIgPDwgcF9jY2ItPmxvY2FsX2NvY19jZmcubXBzCi0gICAgICAgICAgICA8PCAiLCBtdHU9IiA8PCBwX2NjYi0+bG9jYWxfY29jX2NmZy5tdHU7Ci0gIH0KLQotICBwX2NjYi0+cF9jYWxsYmFjayA9IHBfY2I7Ci0KLSAgLyogSWYgb3JpZ2luYXRvciwgdXNlIGEgZHluYW1pYyBQU00gKi8KLSAgaWYgKCFpc19zZXJ2ZXIpCi0gICAgY29ubi5yZWdfaW5mby5wTDJDQV9Db25uZWN0SW5kX0NiID0gTlVMTDsKLSAgZWxzZQotICAgIGNvbm4ucmVnX2luZm8ucEwyQ0FfQ29ubmVjdEluZF9DYiA9IGdhcF9jb25uZWN0X2luZDsKLQotICAvKiBGaWxsIGluIGVMMkNBUCBwYXJhbWV0ZXIgZGF0YSAqLwotICBpZiAocF9jY2ItPmNmZy5mY3JfcHJlc2VudCkgewotICAgIGlmIChlcnRtX2luZm8gPT0gTlVMTCkgewotICAgICAgcF9jY2ItPmVydG1faW5mby5wcmVmZXJyZWRfbW9kZSA9IHBfY2NiLT5jZmcuZmNyLm1vZGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfY2NiLT5lcnRtX2luZm8gPSAqZXJ0bV9pbmZvOwotICAgIH0KLSAgfQotCi0gIC8qIFJlZ2lzdGVyIHRoZSBQU00gd2l0aCBMMkNBUCAqLwotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICBwX2NjYi0+cHNtID0KLSAgICAgICAgTDJDQV9SZWdpc3RlcjIocHNtLCBjb25uLnJlZ19pbmZvLCBmYWxzZSAvKiBlbmFibGVfc25vb3AgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICZwX2NjYi0+ZXJ0bV9pbmZvLCBMMkNBUF9TRFVfTEVOR1RIX01BWCwgMCwgc2VjdXJpdHkpOwotICAgIGlmIChwX2NjYi0+cHNtID09IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKCIlczogRmFpbHVyZSByZWdpc3RlcmluZyBQU00gMHglMDR4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc20pOwotICAgICAgZ2FwX3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgIHJldHVybiAoR0FQX0lOVkFMSURfSEFORExFKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIHBfY2NiLT5wc20gPQotICAgICAgICBMMkNBX1JlZ2lzdGVyTEVDb2MocHNtLCBjb25uLnJlZ19pbmZvLCBzZWN1cml0eSwgcF9jY2ItPmxvY2FsX2NvY19jZmcpOwotICAgIGlmIChwX2NjYi0+cHNtID09IDApIHsKLSAgICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKCIlczogRmFpbHVyZSByZWdpc3RlcmluZyBQU00gMHglMDR4IiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc20pOwotICAgICAgZ2FwX3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgIHJldHVybiAoR0FQX0lOVkFMSURfSEFORExFKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoaXNfc2VydmVyKSB7Ci0gICAgcF9jY2ItPmNvbl9mbGFncyB8PQotICAgICAgICBHQVBfQ0NCX0ZMQUdTX1NFQ19ET05FOyAvKiBhc3N1bWUgYnRtL2wyY2FwIHdvdWxkIGhhbmRsZSBpdCAqLwotICAgIHBfY2NiLT5jb25fc3RhdGUgPSBHQVBfQ0NCX1NUQVRFX0xJU1RFTklORzsKLSAgICByZXR1cm4gKHBfY2NiLT5nYXBfaGFuZGxlKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBXZSBhcmUgdGhlIG9yaWdpbmF0b3Igb2YgdGhpcyBjb25uZWN0aW9uICovCi0gICAgcF9jY2ItPmNvbl9mbGFncyA9IEdBUF9DQ0JfRkxBR1NfSVNfT1JJRzsKLQotICAgIC8qIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgYXBwcm9wcmlhdGUgc3RhdGUsIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gY29uZmlybS4KLSAgICAgKi8KLSAgICBwX2NjYi0+Y29uX3N0YXRlID0gR0FQX0NDQl9TVEFURV9DT05OX1NFVFVQOwotCi0gICAgLyogbWFyayBzZWN1cml0eSBkb25lIGZsYWcsIHdoZW4gc2VjdXJpdHkgaXMgbm90IHJlcXVpcmVkICovCi0gICAgaWYgKChzZWN1cml0eSAmIChCVE1fU0VDX09VVF9BVVRIRU5USUNBVEUgfCBCVE1fU0VDX09VVF9FTkNSWVBUKSkgPT0gMCkKLSAgICAgIHBfY2NiLT5jb25fZmxhZ3MgfD0gR0FQX0NDQl9GTEFHU19TRUNfRE9ORTsKLQotICAgIC8qIENoZWNrIGlmIEwyQ0FQIHN0YXJ0ZWQgdGhlIGNvbm5lY3Rpb24gcHJvY2VzcyAqLwotICAgIGlmIChwX3JlbV9iZGEgJiYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSkgewotICAgICAgY2lkID0gTDJDQV9Db25uZWN0UmVxMihwX2NjYi0+cHNtLCAqcF9yZW1fYmRhLCBzZWN1cml0eSk7Ci0gICAgICBpZiAoY2lkICE9IDApIHsKLSAgICAgICAgcF9jY2ItPmNvbm5lY3Rpb25faWQgPSBjaWQ7Ci0gICAgICAgIHJldHVybiAocF9jY2ItPmdhcF9oYW5kbGUpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwX3JlbV9iZGEgJiYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpKSB7Ci0gICAgICBjaWQgPSBMMkNBX0Nvbm5lY3RMRUNvY1JlcShwX2NjYi0+cHNtLCAqcF9yZW1fYmRhLCAmcF9jY2ItPmxvY2FsX2NvY19jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eSk7Ci0gICAgICBpZiAoY2lkICE9IDApIHsKLSAgICAgICAgcF9jY2ItPmNvbm5lY3Rpb25faWQgPSBjaWQ7Ci0gICAgICAgIHJldHVybiAocF9jY2ItPmdhcF9oYW5kbGUpOwotICAgICAgfQotICAgIH0KLQotICAgIGdhcF9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgcmV0dXJuIChHQVBfSU5WQUxJRF9IQU5ETEUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfQ29ubkNsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbG9zZSBhIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgLSBIYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24gcmV0dXJuZWQgYnkgR0FQX0Nvbm5PcGVuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9QQVNTICAgICAgICAgICAgIC0gY2xvc2VkIE9LCi0gKiAgICAgICAgICAgICAgICAgIEdBUF9FUlJfQkFEX0hBTkRMRSAgLSBpbnZhbGlkIGhhbmRsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBHQVBfQ29ubkNsb3NlKHVpbnQxNl90IGdhcF9oYW5kbGUpIHsKLSAgdEdBUF9DQ0IqIHBfY2NiID0gZ2FwX2ZpbmRfY2NiX2J5X2hhbmRsZShnYXBfaGFuZGxlKTsKLQotICBEVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIkdBUF9DT05OIC0gY2xvc2UgIGhhbmRsZTogMHgleCIsIGdhcF9oYW5kbGUpOwotCi0gIGlmIChwX2NjYikgewotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIElEICovCi0gICAgaWYgKHBfY2NiLT5jb25fc3RhdGUgIT0gR0FQX0NDQl9TVEFURV9MSVNURU5JTkcpIHsKLSAgICAgIGlmIChwX2NjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcShwX2NjYi0+Y29ubmVjdGlvbl9pZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEocF9jY2ItPmNvbm5lY3Rpb25faWQpOwotICAgICAgfQotICAgIH0KLQotICAgIGdhcF9yZWxlYXNlX2NjYihwX2NjYik7Ci0KLSAgICByZXR1cm4gKEJUX1BBU1MpOwotICB9Ci0KLSAgcmV0dXJuIChHQVBfRVJSX0JBRF9IQU5ETEUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0Nvbm5SZWFkRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTm9ybWFsbHkgbm90IEdLSSBhd2FyZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBhZnRlciByZWNlaXZpbmcgR0FQX0VWVF9SWERBVEEgZXZlbnQuCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAtIEhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiByZXR1cm5lZCBpbiB0aGUgT3BlbgotICogICAgICAgICAgICAgICAgICBwX2RhdGEgICAgICAtIERhdGEgYXJlYQotICogICAgICAgICAgICAgICAgICBtYXhfbGVuICAgICAtIEJ5dGUgY291bnQgcmVxdWVzdGVkCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVuICAgICAgIC0gQnl0ZSBjb3VudCByZWNlaXZlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfUEFTUyAgICAgICAgICAgICAtIGRhdGEgcmVhZAotICogICAgICAgICAgICAgICAgICBHQVBfRVJSX0JBRF9IQU5ETEUgIC0gaW52YWxpZCBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgR0FQX05PX0RBVEFfQVZBSUwgICAtIG5vIGRhdGEgYXZhaWxhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEdBUF9Db25uUmVhZERhdGEodWludDE2X3QgZ2FwX2hhbmRsZSwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfbGVuLCB1aW50MTZfdCogcF9sZW4pIHsKLSAgdEdBUF9DQ0IqIHBfY2NiID0gZ2FwX2ZpbmRfY2NiX2J5X2hhbmRsZShnYXBfaGFuZGxlKTsKLSAgdWludDE2X3QgY29weV9sZW47Ci0KLSAgaWYgKCFwX2NjYikgcmV0dXJuIChHQVBfRVJSX0JBRF9IQU5ETEUpOwotCi0gICpwX2xlbiA9IDA7Ci0KLSAgaWYgKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT5yeF9xdWV1ZSkpIHJldHVybiAoR0FQX05PX0RBVEFfQVZBSUwpOwotCi0gIG11dGV4X2dsb2JhbF9sb2NrKCk7Ci0KLSAgd2hpbGUgKG1heF9sZW4pIHsKLSAgICBCVF9IRFIqIHBfYnVmID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8QlRfSERSKj4oZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QocF9jY2ItPnJ4X3F1ZXVlKSk7Ci0gICAgaWYgKHBfYnVmID09IE5VTEwpIGJyZWFrOwotCi0gICAgY29weV9sZW4gPSAocF9idWYtPmxlbiA+IG1heF9sZW4pID8gbWF4X2xlbiA6IHBfYnVmLT5sZW47Ci0gICAgbWF4X2xlbiAtPSBjb3B5X2xlbjsKLSAgICAqcF9sZW4gKz0gY29weV9sZW47Ci0gICAgaWYgKHBfZGF0YSkgewotICAgICAgbWVtY3B5KHBfZGF0YSwgKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwgY29weV9sZW4pOwotICAgICAgcF9kYXRhICs9IGNvcHlfbGVuOwotICAgIH0KLQotICAgIGlmIChwX2J1Zi0+bGVuID4gY29weV9sZW4pIHsKLSAgICAgIHBfYnVmLT5vZmZzZXQgKz0gY29weV9sZW47Ci0gICAgICBwX2J1Zi0+bGVuIC09IGNvcHlfbGVuOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG9zaV9mcmVlKGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT5yeF9xdWV1ZSkpOwotICB9Ci0KLSAgcF9jY2ItPnJ4X3F1ZXVlX3NpemUgLT0gKnBfbGVuOwotCi0gIG11dGV4X2dsb2JhbF91bmxvY2soKTsKLQotICBEVkxPRygxKSA8PCBTdHJpbmdQcmludGYoCi0gICAgICAiR0FQX0Nvbm5SZWFkRGF0YSAtIHJ4X3F1ZXVlX3NpemUgbGVmdD0lZCwgKnBfbGVuPSVkIiwKLSAgICAgIHBfY2NiLT5yeF9xdWV1ZV9zaXplLCAqcF9sZW4pOwotCi0gIHJldHVybiAoQlRfUEFTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfR2V0UnhRdWV1ZUNudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIG9uIHRoZSByeCBxdWV1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIEdBUF9Db25uT3BlbgotICogICAgICAgICAgICAgICAgICBwX3J4X3F1ZXVlX2NvdW50IC0gUG9pbnRlciB0byByZXR1cm4gcXVldWUgY291bnQgaW4uCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgR0FQX0dldFJ4UXVldWVDbnQodWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCogcF9yeF9xdWV1ZV9jb3VudCkgewotICB0R0FQX0NDQiogcF9jY2I7Ci0gIGludCByYyA9IEJUX1BBU1M7Ci0KLSAgLyogQ2hlY2sgdGhhdCBoYW5kbGUgaXMgdmFsaWQgKi8KLSAgaWYgKGhhbmRsZSA8IEdBUF9NQVhfQ09OTkVDVElPTlMpIHsKLSAgICBwX2NjYiA9ICZjb25uLmNjYl9wb29sW2hhbmRsZV07Ci0KLSAgICBpZiAocF9jY2ItPmNvbl9zdGF0ZSA9PSBHQVBfQ0NCX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgKnBfcnhfcXVldWVfY291bnQgPSBwX2NjYi0+cnhfcXVldWVfc2l6ZTsKLSAgICB9IGVsc2UKLSAgICAgIHJjID0gR0FQX0lOVkFMSURfSEFORExFOwotICB9IGVsc2UKLSAgICByYyA9IEdBUF9JTlZBTElEX0hBTkRMRTsKLQotICBEVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIkdBUF9HZXRSeFF1ZXVlQ250IC0gcmMgPSAweCUwNHgsIHJ4X3F1ZXVlX2NvdW50PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjLCAqcF9yeF9xdWV1ZV9jb3VudCk7Ci0KLSAgcmV0dXJuIChyYyk7Ci19Ci0KLS8qIFRyeSB0byB3cml0ZSB0aGUgcXVldWVkIGRhdGEgdG8gbDJjYS4gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3IgaWYgcXVldWUgaXMKLSAqIGNvbmdlc3RlZC4gRmFsc2UgaWYgZXJyb3Igb2NjdXJlZCB3aGVuIHdyaXRpbmcuICovCi1zdGF0aWMgYm9vbCBnYXBfdHJ5X3dyaXRlX3F1ZXVlZF9kYXRhKHRHQVBfQ0NCKiBwX2NjYikgewotICBpZiAocF9jY2ItPmlzX2Nvbmdlc3RlZCkgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VuZCB0aGUgYnVmZmVyIHRocm91Z2ggTDJDQVAgKi8KLSAgQlRfSERSKiBwX2J1ZjsKLSAgd2hpbGUgKChwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT50eF9xdWV1ZSkpICE9IE5VTEwpIHsKLSAgICB1aW50OF90IHN0YXR1czsKLSAgICBpZiAocF9jY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIHN0YXR1cyA9IEwyQ0FfTEVDb2NEYXRhV3JpdGUocF9jY2ItPmNvbm5lY3Rpb25faWQsIHBfYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RhdHVzID0gTDJDQV9EYXRhV3JpdGUocF9jY2ItPmNvbm5lY3Rpb25faWQsIHBfYnVmKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IEwyQ0FQX0RXX0NPTkdFU1RFRCkgewotICAgICAgcF9jY2ItPmlzX2Nvbmdlc3RlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBMMkNBUF9EV19TVUNDRVNTKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0Nvbm5Xcml0ZURhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE5vcm1hbGx5IG5vdCBHS0kgYXdhcmUgYXBwbGljYXRpb24gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgdG8gc2VuZCBkYXRhIHRvIHRoZSBjb25uZWN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBIYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24gcmV0dXJuZWQgaW4gdGhlIE9wZW4KLSAqICAgICAgICAgICAgICAgICAgbXNnICAgICAgICAgLSBwb2ludGVyIHRvIHNpbmdsZSBTRFUgdG8gc2VuZC4gVGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgdGFrZSBvd25lcnNoaXAgb2YgaXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9QQVNTICAgICAgICAgICAgICAgICAtIGRhdGEgcmVhZAotICogICAgICAgICAgICAgICAgICBHQVBfRVJSX0JBRF9IQU5ETEUgICAgICAtIGludmFsaWQgaGFuZGxlCi0gKiAgICAgICAgICAgICAgICAgIEdBUF9FUlJfQkFEX1NUQVRFICAgICAgIC0gY29ubmVjdGlvbiBub3QgZXN0YWJsaXNoZWQKLSAqICAgICAgICAgICAgICAgICAgR0FQX0NPTkdFU1RJT04gICAgICAgICAgLSBzeXN0ZW0gaXMgY29uZ2VzdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEdBUF9Db25uV3JpdGVEYXRhKHVpbnQxNl90IGdhcF9oYW5kbGUsIEJUX0hEUiogbXNnKSB7Ci0gIHRHQVBfQ0NCKiBwX2NjYiA9IGdhcF9maW5kX2NjYl9ieV9oYW5kbGUoZ2FwX2hhbmRsZSk7Ci0KLSAgaWYgKCFwX2NjYikgewotICAgIG9zaV9mcmVlKG1zZyk7Ci0gICAgcmV0dXJuIEdBUF9FUlJfQkFEX0hBTkRMRTsKLSAgfQotCi0gIGlmIChwX2NjYi0+Y29uX3N0YXRlICE9IEdBUF9DQ0JfU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgb3NpX2ZyZWUobXNnKTsKLSAgICByZXR1cm4gR0FQX0VSUl9CQURfU1RBVEU7Ci0gIH0KLQotICBpZiAobXNnLT5sZW4gPiBwX2NjYi0+cmVtX210dV9zaXplKSB7Ci0gICAgb3NpX2ZyZWUobXNnKTsKLSAgICByZXR1cm4gR0FQX0VSUl9JTExfUEFSTTsKLSAgfQotCi0gIERWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiR0FQX1dyaXRlRGF0YSAlZCBieXRlcyIsIG1zZy0+bGVuKTsKLQotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfY2NiLT50eF9xdWV1ZSwgbXNnKTsKLQotICBpZiAoIWdhcF90cnlfd3JpdGVfcXVldWVkX2RhdGEocF9jY2IpKSByZXR1cm4gR0FQX0VSUl9CQURfU1RBVEU7Ci0KLSAgcmV0dXJuIChCVF9QQVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9Db25uR2V0UmVtb3RlQWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSByZW1vdGUgQkQgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICBvZiBhIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgLSBIYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24gcmV0dXJuZWQgYnkgR0FQX0Nvbm5PcGVuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9QQVNTICAgICAgICAgICAgIC0gY2xvc2VkIE9LCi0gKiAgICAgICAgICAgICAgICAgIEdBUF9FUlJfQkFEX0hBTkRMRSAgLSBpbnZhbGlkIGhhbmRsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBSYXdBZGRyZXNzKiBHQVBfQ29ubkdldFJlbW90ZUFkZHIodWludDE2X3QgZ2FwX2hhbmRsZSkgewotICB0R0FQX0NDQiogcF9jY2IgPSBnYXBfZmluZF9jY2JfYnlfaGFuZGxlKGdhcF9oYW5kbGUpOwotCi0gIERWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgZ2FwX2hhbmRsZSA9ICIgPDwgZ2FwX2hhbmRsZTsKLQotICBpZiAoKHBfY2NiKSAmJiAocF9jY2ItPmNvbl9zdGF0ZSA+IEdBUF9DQ0JfU1RBVEVfTElTVEVOSU5HKSkgewotICAgIERWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHBfY2NiLT5yZW1fZGV2X2FkZHJlc3M7Ci0gICAgcmV0dXJuICZwX2NjYi0+cmVtX2Rldl9hZGRyZXNzOwotICB9IGVsc2UgewotICAgIERWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgcmV0dXJuIEVycm9yICI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9Db25uR2V0UmVtTXR1U2l6ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyB0aGUgcmVtb3RlIGRldmljZSdzIE1UVSBzaXplCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAtIEhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDE2X3QgICAgLSBtYXhpbXVtIHNpemUgYnVmZmVyIHRoYXQgY2FuIGJlIHRyYW5zbWl0dGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBlZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgR0FQX0Nvbm5HZXRSZW1NdHVTaXplKHVpbnQxNl90IGdhcF9oYW5kbGUpIHsKLSAgdEdBUF9DQ0IqIHBfY2NiOwotCi0gIHBfY2NiID0gZ2FwX2ZpbmRfY2NiX2J5X2hhbmRsZShnYXBfaGFuZGxlKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHJldHVybiAoMCk7Ci0KLSAgcmV0dXJuIChwX2NjYi0+cmVtX210dV9zaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9Db25uR2V0TDJDQVBDaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIEwyQ0FQIGNoYW5uZWwgaWQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgIC0gSGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB1aW50MTZfdCAgICAtIFRoZSBMMkNBUCBjaGFubmVsIGlkCi0gKiAgICAgICAgICAgICAgICAgIDAsIGlmIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEdBUF9Db25uR2V0TDJDQVBDaWQodWludDE2X3QgZ2FwX2hhbmRsZSkgewotICB0R0FQX0NDQiogcF9jY2I7Ci0KLSAgcF9jY2IgPSBnYXBfZmluZF9jY2JfYnlfaGFuZGxlKGdhcF9oYW5kbGUpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgcmV0dXJuICgwKTsKLQotICByZXR1cm4gKHBfY2NiLT5jb25uZWN0aW9uX2lkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhcF90eF9jb25uZWN0X2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZHMgb3V0IEdBUF9FVlRfVFhfRU1QVFkgd2hlbiB0cmFuc21pc3Npb24gaGFzIGJlZW4KLSAqICAgICAgICAgICAgICAgICAgY29tcGxldGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhcF90eF9jb21wbGV0ZV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCBzZHVfc2VudCkgewotICB0R0FQX0NDQiogcF9jY2IgPSBnYXBfZmluZF9jY2JfYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSByZXR1cm47Ci0KLSAgaWYgKChwX2NjYi0+Y29uX3N0YXRlID09IEdBUF9DQ0JfU1RBVEVfQ09OTkVDVEVEKSAmJiAoc2R1X3NlbnQgPT0gMHhGRkZGKSkgewotICAgIERWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiJXM6IEdBUF9FVlRfVFhfRU1QVFkiLCBfX2Z1bmNfXyk7Ci0gICAgcF9jY2ItPnBfY2FsbGJhY2socF9jY2ItPmdhcF9oYW5kbGUsIEdBUF9FVlRfVFhfRU1QVFksIG51bGxwdHIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBpbmJvdW5kIGNvbm5lY3Rpb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBmcm9tIEwyQ0FQLiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBhY3RpbmcgYXMgYQotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhcF9jb25uZWN0X2luZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHNtLCB1aW50OF90IGwyY2FwX2lkKSB7Ci0gIHVpbnQxNl90IHh4OwotICB0R0FQX0NDQiogcF9jY2I7Ci0KLSAgLyogU2VlIGlmIHdlIGhhdmUgYSBDQ0IgbGlzdGVuaW5nIGZvciB0aGUgY29ubmVjdGlvbiAqLwotICBmb3IgKHh4ID0gMCwgcF9jY2IgPSBjb25uLmNjYl9wb29sOyB4eCA8IEdBUF9NQVhfQ09OTkVDVElPTlM7IHh4KyssIHBfY2NiKyspIHsKLSAgICBpZiAoKHBfY2NiLT5jb25fc3RhdGUgPT0gR0FQX0NDQl9TVEFURV9MSVNURU5JTkcpICYmIChwX2NjYi0+cHNtID09IHBzbSkgJiYKLSAgICAgICAgKCFwX2NjYi0+cmVtX2FkZHJfc3BlY2lmaWVkIHx8IChiZF9hZGRyID09IHBfY2NiLT5yZW1fZGV2X2FkZHJlc3MpKSkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKHh4ID09IEdBUF9NQVhfQ09OTkVDVElPTlMpIHsKLSAgICBMT0coV0FSTklORykgPDwgIioqKioqKioiOwotICAgIExPRyhXQVJOSU5HKSA8PCAiV0FSTklORzogR0FQIENvbm4gSW5kaWNhdGlvbiBmb3IgVW5leHBlY3RlZCBCZCAiCi0gICAgICAgICAgICAgICAgICAgICJBZGRyLi4uRGlzY29ubmVjdGluZyI7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICIqKioqKioqIjsKLQotICAgIC8qIERpc2Nvbm5lY3QgYmVjYXVzZSBpdCBpcyBhbiB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAocF9jY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxKGwyY2FwX2NpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShsMmNhcF9jaWQpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN0YXRlLCB3YWl0aW5nIGZvciBjb25maWcgc2V0dXAuICovCi0gIGlmIChwX2NjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpCi0gICAgcF9jY2ItPmNvbl9zdGF0ZSA9IEdBUF9DQ0JfU1RBVEVfQ0ZHX1NFVFVQOwotCi0gIC8qIFNhdmUgdGhlIEJEIEFkZHJlc3MgYW5kIENoYW5uZWwgSUQuICovCi0gIHBfY2NiLT5yZW1fZGV2X2FkZHJlc3MgPSBiZF9hZGRyOwotICBwX2NjYi0+Y29ubmVjdGlvbl9pZCA9IGwyY2FwX2NpZDsKLQotICBpZiAocF9jY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAvKiBnZXQgdGhlIHJlbW90ZSBjb2MgY29uZmlndXJhdGlvbiAqLwotICAgIEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnKGwyY2FwX2NpZCwgJnBfY2NiLT5wZWVyX2NvY19jZmcpOwotICAgIHBfY2NiLT5yZW1fbXR1X3NpemUgPSBwX2NjYi0+cGVlcl9jb2NfY2ZnLm10dTsKLQotICAgIC8qIGNvbmZpZ3VyYXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciBMRSBDT0MgKi8KLSAgICBwX2NjYi0+Y29uX2ZsYWdzIHw9IEdBUF9DQ0JfRkxBR1NfSElTX0NGR19ET05FOwotICAgIHBfY2NiLT5jb25fZmxhZ3MgfD0gR0FQX0NDQl9GTEFHU19NWV9DRkdfRE9ORTsKLSAgICBnYXBfY2hlY2tzX2Nvbl9mbGFncyhwX2NjYik7Ci0gIH0KLQotICBEVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIkdBUF9DT05OIC0gUmN2ZCBMMkNBUCBjb25uIGluZCwgQ0lEOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5jb25uZWN0aW9uX2lkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhcF9jaGVja3NfY29uX2ZsYWdzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgTDJDQVAgY29uZmlndXJhdGlvbiBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXBfY2hlY2tzX2Nvbl9mbGFncyh0R0FQX0NDQiogcF9jY2IpIHsKLSAgRFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBjb25uX2ZsYWdzOjB4IiA8PCArcF9jY2ItPmNvbl9mbGFnczsKLSAgLyogaWYgYWxsIHRoZSByZXF1aXJlZCBjb25fZmxhZ3MgYXJlIHNldCwgcmVwb3J0IHRoZSBPUEVOIGV2ZW50IG5vdyAqLwotICBpZiAoKHBfY2NiLT5jb25fZmxhZ3MgJiBHQVBfQ0NCX0ZMQUdTX0NPTk5fRE9ORSkgPT0gR0FQX0NDQl9GTEFHU19DT05OX0RPTkUpIHsKLSAgICBwX2NjYi0+Y29uX3N0YXRlID0gR0FQX0NDQl9TVEFURV9DT05ORUNURUQ7Ci0KLSAgICBwX2NjYi0+cF9jYWxsYmFjayhwX2NjYi0+Z2FwX2hhbmRsZSwgR0FQX0VWVF9DT05OX09QRU5FRCwgbnVsbHB0cik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhcF9zZWNfY2hlY2tfY29tcGxldGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBjYWxsZWQgd2hlbiBTZWN1cml0eSBNYW5hZ2VyIGZpbmlzaGVzCi0gKiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2VydmljZSBzaWRlIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2FwX3NlY19jaGVja19jb21wbGV0ZSh0R0FQX0NDQiogcF9jY2IpIHsKLSAgaWYgKHBfY2NiLT5jb25fc3RhdGUgPT0gR0FQX0NDQl9TVEFURV9JRExFKSByZXR1cm47Ci0gIHBfY2NiLT5jb25fZmxhZ3MgfD0gR0FQX0NDQl9GTEFHU19TRUNfRE9ORTsKLSAgZ2FwX2NoZWNrc19jb25fZmxhZ3MocF9jY2IpOwotfQotCi1zdGF0aWMgdm9pZCBnYXBfb25fbDJjYXBfZXJyb3IodWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgdEdBUF9DQ0IqIHBfY2NiID0gZ2FwX2ZpbmRfY2NiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9jY2IgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gIC8qIFRlbGwgdGhlIHVzZXIgaWYgdGhlcmUgaXMgYSBjYWxsYmFjayAqLwotICBpZiAocF9jY2ItPnBfY2FsbGJhY2spCi0gICAgKCpwX2NjYi0+cF9jYWxsYmFjaykocF9jY2ItPmdhcF9oYW5kbGUsIEdBUF9FVlRfQ09OTl9DTE9TRUQsIG51bGxwdHIpOwotCi0gIGdhcF9yZWxlYXNlX2NjYihwX2NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfY29ubmVjdF9jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY29ubmVjdCBjb25maXJtIGV2ZW50cwotICogICAgICAgICAgICAgICAgICBmcm9tIEwyQ0FQLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gd2UgYXJlIGFjdGluZyBhcyBhCi0gKiAgICAgICAgICAgICAgICAgIGNsaWVudCBhbmQgaGF2ZSBzZW50IGEgY29ubmVjdCByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXBfY29ubmVjdF9jZm0odWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgdEdBUF9DQ0IqIHBfY2NiOwotCi0gIC8qIEZpbmQgQ0NCIGJhc2VkIG9uIENJRCAqLwotICBwX2NjYiA9IGdhcF9maW5kX2NjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHJldHVybjsKLQotICAvKiBpbml0aWF0ZSBzZWN1cml0eSBwcm9jZXNzLCBpZiBuZWVkZWQgKi8KLSAgaWYgKChwX2NjYi0+Y29uX2ZsYWdzICYgR0FQX0NDQl9GTEFHU19TRUNfRE9ORSkgPT0gMCAmJgotICAgICAgcF9jY2ItPnRyYW5zcG9ydCAhPSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAvLyBBc3N1bWUgc2VjdXJpdHkgY2hlY2sgaXMgZG9uZSBieSBMMmNhcAotICAgIGdhcF9zZWNfY2hlY2tfY29tcGxldGUocF9jY2IpOwotICB9Ci0KLSAgLyogSWYgdGhlIGNvbm5lY3Rpb24gcmVzcG9uc2UgY29udGFpbnMgc3VjY2VzcyBzdGF0dXMsIHRoZW4gKi8KLSAgLyogVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZSBhbmQgc3RhcnR1cCB0aGUgdGltZXIuICAgICAgKi8KLSAgaWYgKChyZXN1bHQgPT0gTDJDQVBfQ09OTl9PSykgJiYKLSAgICAgIChwX2NjYi0+Y29uX3N0YXRlID09IEdBUF9DQ0JfU1RBVEVfQ09OTl9TRVRVUCkpIHsKLSAgICBpZiAocF9jY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSB7Ci0gICAgICBwX2NjYi0+Y29uX3N0YXRlID0gR0FQX0NDQl9TVEFURV9DRkdfU0VUVVA7Ci0gICAgfQotCi0gICAgaWYgKHBfY2NiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgICAvKiBnZXQgdGhlIHJlbW90ZSBjb2MgY29uZmlndXJhdGlvbiAqLwotICAgICAgTDJDQV9HZXRQZWVyTEVDb2NDb25maWcobDJjYXBfY2lkLCAmcF9jY2ItPnBlZXJfY29jX2NmZyk7Ci0gICAgICBwX2NjYi0+cmVtX210dV9zaXplID0gcF9jY2ItPnBlZXJfY29jX2NmZy5tdHU7Ci0KLSAgICAgIC8qIGNvbmZpZ3VyYXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciBMRSBDT0MgKi8KLSAgICAgIHBfY2NiLT5jb25fZmxhZ3MgfD0gR0FQX0NDQl9GTEFHU19ISVNfQ0ZHX0RPTkU7Ci0gICAgICBwX2NjYi0+Y29uX2ZsYWdzIHw9IEdBUF9DQ0JfRkxBR1NfTVlfQ0ZHX0RPTkU7Ci0gICAgICBwX2NjYi0+Y29uX2ZsYWdzIHw9IEdBUF9DQ0JfRkxBR1NfU0VDX0RPTkU7Ci0gICAgICBnYXBfY2hlY2tzX2Nvbl9mbGFncyhwX2NjYik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfY29uZmlnX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIEwyQ0FQIGNvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBldmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2FwX2NvbmZpZ19pbmQodWludDE2X3QgbDJjYXBfY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIHRHQVBfQ0NCKiBwX2NjYjsKLSAgdWludDE2X3QgbG9jYWxfbXR1X3NpemU7Ci0KLSAgLyogRmluZCBDQ0IgYmFzZWQgb24gQ0lEICovCi0gIHBfY2NiID0gZ2FwX2ZpbmRfY2NiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIC8qIFJlbWVtYmVyIHRoZSByZW1vdGUgTVRVIHNpemUgKi8KLQotICBpZiAocF9jY2ItPmNmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKSB7Ci0gICAgbG9jYWxfbXR1X3NpemUgPSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFIC0gc2l6ZW9mKEJUX0hEUikgLSBMMkNBUF9NSU5fT0ZGU0VUOwotICB9IGVsc2UKLSAgICBsb2NhbF9tdHVfc2l6ZSA9IEwyQ0FQX01UVV9TSVpFOwotCi0gIGlmICgoIXBfY2ZnLT5tdHVfcHJlc2VudCkgfHwgKHBfY2ZnLT5tdHUgPiBsb2NhbF9tdHVfc2l6ZSkpIHsKLSAgICBwX2NjYi0+cmVtX210dV9zaXplID0gbG9jYWxfbXR1X3NpemU7Ci0gIH0gZWxzZQotICAgIHBfY2NiLT5yZW1fbXR1X3NpemUgPSBwX2NmZy0+bXR1OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2FwX2NvbmZpZ19jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uIGNvbmZpcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBldmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2FwX2NvbmZpZ19jZm0odWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIGdhcF9jb25maWdfaW5kKGwyY2FwX2NpZCwgcF9jZmcpOwotCi0gIHRHQVBfQ0NCKiBwX2NjYjsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9jY2IgPSBnYXBfZmluZF9jY2JfYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSByZXR1cm47Ci0KLSAgcF9jY2ItPmNvbl9mbGFncyB8PSBHQVBfQ0NCX0ZMQUdTX01ZX0NGR19ET05FOwotICBwX2NjYi0+Y29uX2ZsYWdzIHw9IEdBUF9DQ0JfRkxBR1NfSElTX0NGR19ET05FOwotICBnYXBfY2hlY2tzX2Nvbl9mbGFncyhwX2NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfZGlzY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2Nvbm5lY3QgZXZlbnQgZnJvbSBMMkNBUC4gSWYKLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIHRvLCB3ZSBhY2sgdGhlIGRpc2Nvbm5lY3QgYmVmb3JlIGRyb3BwaW5nIHRoZSBDQ0IKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2FwX2Rpc2Nvbm5lY3RfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgYm9vbCBhY2tfbmVlZGVkKSB7Ci0gIHRHQVBfQ0NCKiBwX2NjYjsKLQotICBEVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIkdBUF9DT05OIC0gUmN2ZCBMMkNBUCBkaXNjLCBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotCi0gIC8qIEZpbmQgQ0NCIGJhc2VkIG9uIENJRCAqLwotICBwX2NjYiA9IGdhcF9maW5kX2NjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHJldHVybjsKLQotICBwX2NjYi0+cF9jYWxsYmFjayhwX2NjYi0+Z2FwX2hhbmRsZSwgR0FQX0VWVF9DT05OX0NMT1NFRCwgbnVsbHB0cik7Ci0gIGdhcF9yZWxlYXNlX2NjYihwX2NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfZGF0YV9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZGF0YSBpcyByZWNlaXZlZCBmcm9tIEwyQ0FQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXBfZGF0YV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCBCVF9IRFIqIHBfbXNnKSB7Ci0gIHRHQVBfQ0NCKiBwX2NjYjsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9jY2IgPSBnYXBfZmluZF9jY2JfYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgb3NpX2ZyZWUocF9tc2cpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX2NjYi0+Y29uX3N0YXRlID09IEdBUF9DQ0JfU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX2NjYi0+cnhfcXVldWUsIHBfbXNnKTsKLQotICAgIHBfY2NiLT5yeF9xdWV1ZV9zaXplICs9IHBfbXNnLT5sZW47Ci0gICAgLyoKLSAgICBEVkxPRygxKSA8PCBTdHJpbmdQcmludGYgKCJnYXBfZGF0YV9pbmQgLSByeF9xdWV1ZV9zaXplPSVkLCBtc2cgbGVuPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnJ4X3F1ZXVlX3NpemUsIHBfbXNnLT5sZW4pOwotICAgICAqLwotCi0gICAgcF9jY2ItPnBfY2FsbGJhY2socF9jY2ItPmdhcF9oYW5kbGUsIEdBUF9FVlRfQ09OTl9EQVRBX0FWQUlMLCBudWxscHRyKTsKLSAgfSBlbHNlIHsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhcF9jb25nZXN0aW9uX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBMMkNBUCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIGRhdGEgTDJDQVAgY29uZ2VzdGlvbiBzdGF0dXMgY2hhbmdlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXBfY29uZ2VzdGlvbl9pbmQodWludDE2X3QgbGNpZCwgYm9vbCBpc19jb25nZXN0ZWQpIHsKLSAgRFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCJHQVBfQ09OTiAtIFJjdmQgTDJDQVAgSXMgQ29uZ2VzdGVkICglZCksIENJRDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb25nZXN0ZWQsIGxjaWQpOwotCi0gIHRHQVBfQ0NCKiBwX2NjYiA9IGdhcF9maW5kX2NjYl9ieV9jaWQobGNpZCk7IC8qIEZpbmQgQ0NCIGJhc2VkIG9uIENJRCAqLwotICBpZiAoIXBfY2NiKSByZXR1cm47Ci0KLSAgcF9jY2ItPmlzX2Nvbmdlc3RlZCA9IGlzX2Nvbmdlc3RlZDsKLQotICBwX2NjYi0+cF9jYWxsYmFjaygKLSAgICAgIHBfY2NiLT5nYXBfaGFuZGxlLAotICAgICAgKGlzX2Nvbmdlc3RlZCkgPyBHQVBfRVZUX0NPTk5fQ09OR0VTVEVEIDogR0FQX0VWVF9DT05OX1VOQ09OR0VTVEVELAotICAgICAgbnVsbHB0cik7Ci0KLSAgZ2FwX3RyeV93cml0ZV9xdWV1ZWRfZGF0YShwX2NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfZmluZF9jY2JfYnlfY2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBDQ0IgdGFibGUgZm9yIGFuIGVudHJ5IHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NlZCBDSUQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgQ0NCIGFkZHJlc3MsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEdBUF9DQ0IqIGdhcF9maW5kX2NjYl9ieV9jaWQodWludDE2X3QgY2lkKSB7Ci0gIHVpbnQxNl90IHh4OwotICB0R0FQX0NDQiogcF9jY2I7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGVhY2ggY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICovCi0gIGZvciAoeHggPSAwLCBwX2NjYiA9IGNvbm4uY2NiX3Bvb2w7IHh4IDwgR0FQX01BWF9DT05ORUNUSU9OUzsgeHgrKywgcF9jY2IrKykgewotICAgIGlmICgocF9jY2ItPmNvbl9zdGF0ZSAhPSBHQVBfQ0NCX1NUQVRFX0lETEUpICYmCi0gICAgICAgIChwX2NjYi0+Y29ubmVjdGlvbl9pZCA9PSBjaWQpKQotICAgICAgcmV0dXJuIChwX2NjYik7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBub3QgZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhcF9maW5kX2NjYl9ieV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIENDQiB0YWJsZSBmb3IgYW4gZW50cnkgd2l0aCB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGFzc2VkIGhhbmRsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBDQ0IgYWRkcmVzcywgb3IgTlVMTCBpZiBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0R0FQX0NDQiogZ2FwX2ZpbmRfY2NiX2J5X2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgdEdBUF9DQ0IqIHBfY2NiOwotCi0gIC8qIENoZWNrIHRoYXQgaGFuZGxlIGlzIHZhbGlkICovCi0gIGlmIChoYW5kbGUgPCBHQVBfTUFYX0NPTk5FQ1RJT05TKSB7Ci0gICAgcF9jY2IgPSAmY29ubi5jY2JfcG9vbFtoYW5kbGVdOwotCi0gICAgaWYgKHBfY2NiLT5jb25fc3RhdGUgIT0gR0FQX0NDQl9TVEFURV9JRExFKSByZXR1cm4gKHBfY2NiKTsKLSAgfQotCi0gIC8qIElmIGhlcmUsIGhhbmRsZSBwb2ludHMgdG8gaW52YWxpZCBjb25uZWN0aW9uICovCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfYWxsb2NhdGVfY2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBDQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBDQ0IgYWRkcmVzcywgb3IgTlVMTCBpZiBub25lIGF2YWlsYWJsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRHQVBfQ0NCKiBnYXBfYWxsb2NhdGVfY2NiKHZvaWQpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHRHQVBfQ0NCKiBwX2NjYjsKLQotICAvKiBMb29rIHRocm91Z2ggZWFjaCBjb25uZWN0aW9uIGNvbnRyb2wgYmxvY2sgZm9yIGEgZnJlZSBvbmUgKi8KLSAgZm9yICh4eCA9IDAsIHBfY2NiID0gY29ubi5jY2JfcG9vbDsgeHggPCBHQVBfTUFYX0NPTk5FQ1RJT05TOyB4eCsrLCBwX2NjYisrKSB7Ci0gICAgaWYgKHBfY2NiLT5jb25fc3RhdGUgPT0gR0FQX0NDQl9TVEFURV9JRExFKSB7Ci0gICAgICBtZW1zZXQocF9jY2IsIDAsIHNpemVvZih0R0FQX0NDQikpOwotICAgICAgcF9jY2ItPnR4X3F1ZXVlID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgICAgIHBfY2NiLT5yeF9xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0KLSAgICAgIHBfY2NiLT5nYXBfaGFuZGxlID0geHg7Ci0gICAgICBwX2NjYi0+cmVtX210dV9zaXplID0gTDJDQVBfTVRVX1NJWkU7Ci0KLSAgICAgIHJldHVybiAocF9jY2IpOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGhlcmUsIG5vIGZyZWUgQ0NCIGZvdW5kICovCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXBfcmVsZWFzZV9jY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYSBDQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhcF9yZWxlYXNlX2NjYih0R0FQX0NDQiogcF9jY2IpIHsKLSAgLyogRHJvcCBhbnkgYnVmZmVycyB3ZSBtYXkgYmUgaG9sZGluZyAqLwotICBwX2NjYi0+cnhfcXVldWVfc2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+cnhfcXVldWUpKQotICAgIG9zaV9mcmVlKGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT5yeF9xdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHBfY2NiLT5yeF9xdWV1ZSwgTlVMTCk7Ci0gIHBfY2NiLT5yeF9xdWV1ZSA9IE5VTEw7Ci0KLSAgd2hpbGUgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+dHhfcXVldWUpKQotICAgIG9zaV9mcmVlKGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT50eF9xdWV1ZSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHBfY2NiLT50eF9xdWV1ZSwgTlVMTCk7Ci0gIHBfY2NiLT50eF9xdWV1ZSA9IE5VTEw7Ci0KLSAgcF9jY2ItPmNvbl9zdGF0ZSA9IEdBUF9DQ0JfU1RBVEVfSURMRTsKLQotICAvKiBJZiBuby1vbmUgZWxzZSBpcyB1c2luZyB0aGUgUFNNLCBkZXJlZ2lzdGVyIGZyb20gTDJDQVAgKi8KLSAgdEdBUF9DQ0IqIHBfY2NiX2xvY2FsID0gY29ubi5jY2JfcG9vbDsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IEdBUF9NQVhfQ09OTkVDVElPTlM7IGkrKywgcF9jY2JfbG9jYWwrKykgewotICAgIGlmICgocF9jY2JfbG9jYWwtPmNvbl9zdGF0ZSAhPSBHQVBfQ0NCX1NUQVRFX0lETEUpICYmCi0gICAgICAgIChwX2NjYl9sb2NhbC0+cHNtID09IHBfY2NiLT5wc20pKSB7Ci0gICAgICBEVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIDogIiA8PCArcF9jY2JfbG9jYWwtPnBzbQotICAgICAgICAgICAgICAgPDwgIiBQU00gaXMgc3RpbGwgaW4gdXNlLCBkbyBub3QgZGVyZWdpc3RlciI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLyogRnJlZSB0aGUgc2VjdXJpdHkgcmVjb3JkIGZvciB0aGlzIFBTTSAqLwotICBCVE1fU2VjQ2xyU2VydmljZUJ5UHNtKHBfY2NiLT5wc20pOwotICBpZiAocF9jY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSBMMkNBX0RlcmVnaXN0ZXIocF9jY2ItPnBzbSk7Ci0gIGlmIChwX2NjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgTDJDQV9EZXJlZ2lzdGVyTEVDb2MocF9jY2ItPnBzbSk7Ci19Ci0KLWV4dGVybiB2b2lkIGdhcF9hdHRyX2RiX2luaXQodm9pZCk7Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZXhjZXB0IG9uY2UgcGVyIHN0YWNrIGludm9jYXRpb24uCi0gKi8KLXZvaWQgR0FQX0luaXQodm9pZCkgewotICBnYXBfY29ubl9pbml0KCk7Ci0gIGdhcF9hdHRyX2RiX2luaXQoKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2dhdHQvYXR0X3Byb3RvY29sLmNjIGIvc3RhY2svZ2F0dC9hdHRfcHJvdG9jb2wuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODQ3ZGIuLjAwMDAwMDAKLS0tIGEvc3RhY2svZ2F0dC9hdHRfcHJvdG9jb2wuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOC0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgQVRUIHByb3RvY29sIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJnYXR0X2ludC5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNkZWZpbmUgR0FUVF9IRFJfRklORF9UWVBFX1ZBTFVFX0xFTiAyMQotI2RlZmluZSBHQVRUX09QX0NPREVfU0laRSAxCi0jZGVmaW5lIEdBVFRfU1RBUlRfRU5EX0hBTkRMRV9TSVpFIDQKLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgQVRUIHByb3RvY2wgbWVzc2FnZSBidWlsZGluZyB1dGlsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9idWlsZF9tdHVfZXhlY19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGEgZXhjaGFuZ2UgTVRVIHJlcXVlc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF0dHBfYnVpbGRfbXR1X2NtZCh1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IHJ4X210dSkgewotICB1aW50OF90KiBwOwotICBCVF9IRFIqIHBfYnVmID0KLSAgICAgIChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBHQVRUX0hEUl9TSVpFICsgTDJDQVBfTUlOX09GRlNFVCk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBvcF9jb2RlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCByeF9tdHUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX2J1Zi0+bGVuID0gR0FUVF9IRFJfU0laRTsgLyogb3Bjb2RlICsgMiBieXRlcyBtdHUgKi8KLQotICByZXR1cm4gcF9idWY7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9idWlsZF9leGVjX3dyaXRlX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYSBleGVjdXRlIHdyaXRlIHJlcXVlc3Qgb3IgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdHRwX2J1aWxkX2V4ZWNfd3JpdGVfY21kKHVpbnQ4X3Qgb3BfY29kZSwgdWludDhfdCBmbGFnKSB7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKEdBVFRfREFUQV9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBHQVRUX09QX0NPREVfU0laRTsKLQotICBVSU5UOF9UT19TVFJFQU0ocCwgb3BfY29kZSk7Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SRVFfRVhFQ19XUklURSkgewotICAgIGZsYWcgJj0gR0FUVF9QUkVQX1dSSVRFX0VYRUM7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIGZsYWcpOwotICAgIHBfYnVmLT5sZW4gKz0gMTsKLSAgfQotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF0dHBfYnVpbGRfZXJyX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYSBleGNoYW5nZSBNVFUgcmVxdWVzdAotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJUX0hEUiogYXR0cF9idWlsZF9lcnJfY21kKHVpbnQ4X3QgY21kX2NvZGUsIHVpbnQxNl90IGVycl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWFzb24pIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBMMkNBUF9NSU5fT0ZGU0VUICsgNSk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBHQVRUX1JTUF9FUlJPUik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBjbWRfY29kZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgZXJyX2hhbmRsZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCByZWFzb24pOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICAvKiBHQVRUX0hEUl9TSVpFICgxQiBFUlJfUlNQIG9wIGNvZGUrIDJCIGhhbmRsZSkgKyAxQiBjbWRfb3BfY29kZSAgKyAxQiBzdGF0dXMKLSAgICovCi0gIHBfYnVmLT5sZW4gPSBHQVRUX0hEUl9TSVpFICsgMSArIDE7Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF0dHBfYnVpbGRfYnJvd3NlX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYSByZWFkIGluZm9ybWF0aW9uIHJlcXVlc3Qgb3IgcmVhZCBieSB0eXBlIHJlcXVlc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF0dHBfYnVpbGRfYnJvd3NlX2NtZCh1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IHNfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCkgewotICBjb25zdCBzaXplX3QgcGF5bG9hZF9zaXplID0KLSAgICAgIChHQVRUX09QX0NPREVfU0laRSkgKyAoR0FUVF9TVEFSVF9FTkRfSEFORExFX1NJWkUpICsgKFV1aWQ6OmtOdW1CeXRlczEyOCk7Ci0gIEJUX0hEUiogcF9idWYgPQotICAgICAgKEJUX0hEUiopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSArIHBheWxvYWRfc2l6ZSArIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICAvKiBEZXNjcmliZSB0aGUgYnVpbHQgbWVzc2FnZSBsb2NhdGlvbiBhbmQgc2l6ZSAqLwotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IEdBVFRfT1BfQ09ERV9TSVpFICsgNDsKLQotICBVSU5UOF9UT19TVFJFQU0ocCwgb3BfY29kZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgc19oZGwpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGVfaGRsKTsKLSAgcF9idWYtPmxlbiArPSBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtKCZwLCB1dWlkKTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdHRwX2J1aWxkX3JlYWRfaGFuZGxlc19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGEgcmVhZCBieSB0eXBlIGFuZCB2YWx1ZSByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29tbWFuZCBidWZmZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF0dHBfYnVpbGRfcmVhZF9ieV90eXBlX3ZhbHVlX2NtZCgKLSAgICB1aW50MTZfdCBwYXlsb2FkX3NpemUsIHRHQVRUX0ZJTkRfVFlQRV9WQUxVRSogcF92YWx1ZV90eXBlKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQxNl90IGxlbiA9IHBfdmFsdWVfdHlwZS0+dmFsdWVfbGVuOwotICBCVF9IRFIqIHBfYnVmID0KLSAgICAgIChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBwYXlsb2FkX3NpemUgKyBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSA1OyAvKiBvcGNvZGUgKyBzX2hhbmRsZSArIGVfaGFuZGxlICovCi0KLSAgVUlOVDhfVE9fU1RSRUFNKHAsIEdBVFRfUkVRX0ZJTkRfVFlQRV9WQUxVRSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF92YWx1ZV90eXBlLT5zX2hhbmRsZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF92YWx1ZV90eXBlLT5lX2hhbmRsZSk7Ci0KLSAgcF9idWYtPmxlbiArPSBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtKCZwLCBwX3ZhbHVlX3R5cGUtPnV1aWQpOwotCi0gIGlmIChwX3ZhbHVlX3R5cGUtPnZhbHVlX2xlbiArIHBfYnVmLT5sZW4gPiBwYXlsb2FkX3NpemUpCi0gICAgbGVuID0gcGF5bG9hZF9zaXplIC0gcF9idWYtPmxlbjsKLQotICBtZW1jcHkocCwgcF92YWx1ZV90eXBlLT52YWx1ZSwgbGVuKTsKLSAgcF9idWYtPmxlbiArPSBsZW47Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9idWlsZF9yZWFkX211bHRpX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYSByZWFkIG11bHRpcGxlIHJlcXVlc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF0dHBfYnVpbGRfcmVhZF9tdWx0aV9jbWQodWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBwYXlsb2FkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2hhbmRsZSkgewotICB1aW50OF90ICpwLCBpID0gMDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBudW1faGFuZGxlICogMiArIDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSAxOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwLCBvcF9jb2RlKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2hhbmRsZSAmJiBwX2J1Zi0+bGVuICsgMiA8PSBwYXlsb2FkX3NpemU7IGkrKykgewotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgKihwX2hhbmRsZSArIGkpKTsKLSAgICBwX2J1Zi0+bGVuICs9IDI7Ci0gIH0KLQotICByZXR1cm4gcF9idWY7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9idWlsZF9oYW5kbGVfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhIHJlYWQgL3JlYWQgYmxvYiByZXF1ZXN0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBhdHRwX2J1aWxkX2hhbmRsZV9jbWQodWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0KSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpICsgNSArIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLQotICBVSU5UOF9UT19TVFJFQU0ocCwgb3BfY29kZSk7Ci0gIHBfYnVmLT5sZW4gPSAxOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLSAgcF9idWYtPmxlbiArPSAyOwotCi0gIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX1JFQURfQkxPQikgewotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgb2Zmc2V0KTsKLSAgICBwX2J1Zi0+bGVuICs9IDI7Ci0gIH0KLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhdHRwX2J1aWxkX29wY29kZV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGEgIHJlcXVlc3QvcmVzcG9uc2Ugd2l0aCBvcGNvZGUgb25seS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF0dHBfYnVpbGRfb3Bjb2RlX2NtZCh1aW50OF90IG9wX2NvZGUpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyAxICsgTDJDQVBfTUlOX09GRlNFVCk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwLCBvcF9jb2RlKTsKLSAgcF9idWYtPmxlbiA9IDE7Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9idWlsZF92YWx1ZV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGEgYXR0cmlidXRlIHZhbHVlIHJlcXVlc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIGF0dHBfYnVpbGRfdmFsdWVfY21kKHVpbnQxNl90IHBheWxvYWRfc2l6ZSwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHBfZGF0YSkgewotICB1aW50OF90ICpwLCAqcHAsIHBhaXJfbGVuLCAqcF9wYWlyX2xlbjsKLSAgQlRfSERSKiBwX2J1ZiA9Ci0gICAgICAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpICsgcGF5bG9hZF9zaXplICsgTDJDQVBfTUlOX09GRlNFVCk7Ci0KLSAgcCA9IHBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIG9wX2NvZGUpOwotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IDE7Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SU1BfUkVBRF9CWV9UWVBFKSB7Ci0gICAgcF9wYWlyX2xlbiA9IHA7Ci0gICAgcGFpcl9sZW4gPSBsZW4gKyAyOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwYWlyX2xlbik7Ci0gICAgcF9idWYtPmxlbiArPSAxOwotICB9Ci0gIGlmIChvcF9jb2RlICE9IEdBVFRfUlNQX1JFQURfQkxPQiAmJiBvcF9jb2RlICE9IEdBVFRfUlNQX1JFQUQpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGhhbmRsZSk7Ci0gICAgcF9idWYtPmxlbiArPSAyOwotICB9Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SRVFfUFJFUEFSRV9XUklURSB8fCBvcF9jb2RlID09IEdBVFRfUlNQX1BSRVBBUkVfV1JJVEUpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIG9mZnNldCk7Ci0gICAgcF9idWYtPmxlbiArPSAyOwotICB9Ci0KLSAgaWYgKGxlbiA+IDAgJiYgcF9kYXRhICE9IE5VTEwpIHsKLSAgICAvKiBlbnN1cmUgZGF0YSBub3QgZXhjZWVkIE1UVSBzaXplICovCi0gICAgaWYgKHBheWxvYWRfc2l6ZSAtIHBfYnVmLT5sZW4gPCBsZW4pIHsKLSAgICAgIGxlbiA9IHBheWxvYWRfc2l6ZSAtIHBfYnVmLT5sZW47Ci0gICAgICAvKiB1cGRhdGUgaGFuZGxlIHZhbHVlIHBhaXIgbGVuZ3RoICovCi0gICAgICBpZiAob3BfY29kZSA9PSBHQVRUX1JTUF9SRUFEX0JZX1RZUEUpICpwX3BhaXJfbGVuID0gKGxlbiArIDIpOwotCi0gICAgICBMT0coV0FSTklORykgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAgICJhdHRyaWJ1dGUgdmFsdWUgdG9vIGxvbmcsIHRvIGJlIHRydW5jYXRlZCB0byAlZCIsIGxlbik7Ci0gICAgfQotCi0gICAgQVJSQVlfVE9fU1RSRUFNKHAsIHBfZGF0YSwgbGVuKTsKLSAgICBwX2J1Zi0+bGVuICs9IGxlbjsKLSAgfQotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF0dHBfc2VuZF9tc2dfdG9fbDJjYXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgbWVzc2FnZSB0byBMMkNBUC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9tc2dfdG9fbDJjYXAodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfdG9MMkNBUCkgewotICB1aW50MTZfdCBsMmNhcF9yZXQ7Ci0KLSAgaWYgKGxjaWQgPT0gTDJDQVBfQVRUX0NJRCkgewotICAgIExPR19ERUJVRygiU2VuZGluZyBBVFQgbWVzc2FnZSBvbiBhdHQgZml4ZWQgY2hhbm5lbCIpOwotICAgIGwyY2FwX3JldCA9IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEobGNpZCwgdGNiLnBlZXJfYmRhLCBwX3RvTDJDQVApOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiU2VuZGluZyBBVFQgbWVzc2FnZSBvbiBsY2lkOiVodSIsIGxjaWQpOwotICAgIGwyY2FwX3JldCA9ICh1aW50MTZfdClMMkNBX0RhdGFXcml0ZShsY2lkLCBwX3RvTDJDQVApOwotICB9Ci0KLSAgaWYgKGwyY2FwX3JldCA9PSBMMkNBUF9EV19GQUlMRUQpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byB3cml0ZSBkYXRhIHRvIEwyQ0FQIjsKLSAgICByZXR1cm4gR0FUVF9JTlRFUk5BTF9FUlJPUjsKLSAgfSBlbHNlIGlmIChsMmNhcF9yZXQgPT0gTDJDQVBfRFdfQ09OR0VTVEVEKSB7Ci0gICAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIkFUVCBjb25nZXN0ZWQsIG1lc3NhZ2UgYWNjZXB0ZWQiKTsKLSAgICByZXR1cm4gR0FUVF9DT05HRVNURUQ7Ci0gIH0KLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLQotLyoqIEJ1aWxkIEFUVCBTZXJ2ZXIgUERVcyAqLwotQlRfSERSKiBhdHRwX2J1aWxkX3NyX21zZyh0R0FUVF9UQ0ImIHRjYiwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TUl9NU0cqIHBfbXNnKSB7Ci0gIHVpbnQxNl90IG9mZnNldCA9IDA7Ci0KLSAgc3dpdGNoIChvcF9jb2RlKSB7Ci0gICAgY2FzZSBHQVRUX1JTUF9SRUFEX0JMT0I6Ci0gICAgY2FzZSBHQVRUX1JTUF9QUkVQQVJFX1dSSVRFOgotICAgICAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoCi0gICAgICAgICAgIkFUVF9SU1BfUkVBRF9CTE9CL0dBVFRfUlNQX1BSRVBBUkVfV1JJVEU6IGxlbiA9ICVkIG9mZnNldCA9ICVkIiwKLSAgICAgICAgICBwX21zZy0+YXR0cl92YWx1ZS5sZW4sIHBfbXNnLT5hdHRyX3ZhbHVlLm9mZnNldCk7Ci0gICAgICBvZmZzZXQgPSBwX21zZy0+YXR0cl92YWx1ZS5vZmZzZXQ7Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdBVFRfUlNQX1JFQURfQllfVFlQRToKLSAgICBjYXNlIEdBVFRfUlNQX1JFQUQ6Ci0gICAgY2FzZSBHQVRUX0hBTkRMRV9WQUxVRV9OT1RJRjoKLSAgICBjYXNlIEdBVFRfSEFORExFX1ZBTFVFX0lORDoKLSAgICAgIHJldHVybiBhdHRwX2J1aWxkX3ZhbHVlX2NtZCgKLSAgICAgICAgICB0Y2IucGF5bG9hZF9zaXplLCBvcF9jb2RlLCBwX21zZy0+YXR0cl92YWx1ZS5oYW5kbGUsIG9mZnNldCwKLSAgICAgICAgICBwX21zZy0+YXR0cl92YWx1ZS5sZW4sIHBfbXNnLT5hdHRyX3ZhbHVlLnZhbHVlKTsKLQotICAgIGNhc2UgR0FUVF9SU1BfV1JJVEU6Ci0gICAgICByZXR1cm4gYXR0cF9idWlsZF9vcGNvZGVfY21kKG9wX2NvZGUpOwotCi0gICAgY2FzZSBHQVRUX1JTUF9FUlJPUjoKLSAgICAgIHJldHVybiBhdHRwX2J1aWxkX2Vycl9jbWQocF9tc2ctPmVycm9yLmNtZF9jb2RlLCBwX21zZy0+ZXJyb3IuaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21zZy0+ZXJyb3IucmVhc29uKTsKLQotICAgIGNhc2UgR0FUVF9SU1BfRVhFQ19XUklURToKLSAgICAgIHJldHVybiBhdHRwX2J1aWxkX2V4ZWNfd3JpdGVfY21kKG9wX2NvZGUsIDApOwotCi0gICAgY2FzZSBHQVRUX1JTUF9NVFU6Ci0gICAgICByZXR1cm4gYXR0cF9idWlsZF9tdHVfY21kKG9wX2NvZGUsIHBfbXNnLT5tdHUpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhGQVRBTCkgPDwgImF0dHBfYnVpbGRfc3JfbXNnOiB1bmtub3duIG9wIGNvZGUgPSAiIDw8ICtvcF9jb2RlOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF0dHBfc2VuZF9zcl9tc2cKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIHNlcnZlciByZXNwb25zZSBvciBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdG8gY2xpZW50LgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF90Y2I6IHBvaW50ZXIgdG8gdGhlIGNvbm5lY3RvbiBjb250cm9sIGJsb2NrLgotICogICAgICAgICAgICAgICAgICBwX21zZzogcG9pbnRlciB0byBtZXNzYWdlIHBhcmFtZXRlcnMgc3RydWN0dXJlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIHN1Y2Vzc2Z1bGx5IHNlbnQ7IG90aGVyd2lzZSBlcnJvciBjb2RlLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9zcl9tc2codEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX21zZykgewotICBpZiAocF9tc2cgPT0gTlVMTCkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gc2VuZCBlbXB0eSBtZXNzYWdlIik7Ci0gICAgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgTE9HX0RFQlVHKCJTZW5kaW5nIHNlcnZlciByZXNwb25zZSBvciBpbmRpY2F0aW9uIG1lc3NhZ2UgdG8gY2xpZW50Iik7Ci0gIHBfbXNnLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICByZXR1cm4gYXR0cF9zZW5kX21zZ190b19sMmNhcCh0Y2IsIGNpZCwgcF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9jbF9zZW5kX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIEFUVCBjb21tYW5kIG9yIGVucXVldWUgaXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgY29tbWFuZCBzZW50Ci0gKiAgICAgICAgICAgICAgICAgIEdBVFRfQ09OR0VTVEVEIGlmIGNvbW1hbmQgc2VudCBidXQgY2hhbm5lbCBjb25nZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgR0FUVF9DTURfU1RBUlRFRCBpZiBjb21tYW5kIHF1ZXVlIHVwIGluIEdBVFQKLSAqICAgICAgICAgICAgICAgICAgR0FUVF9FUlJPUiBpZiBjb21tYW5kIHNlbmRpbmcgZmFpbHVyZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEdBVFRfU1RBVFVTIGF0dHBfY2xfc2VuZF9jbWQodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNtZF9jb2RlLCBCVF9IRFIqIHBfY21kKSB7Ci0gIGNtZF9jb2RlICY9IH5HQVRUX0FVVEhfU0lHTl9NQVNLOwotCi0gIGlmIChnYXR0X3RjYl9pc19jaWRfYnVzeSh0Y2IsIHBfY2xjYi0+Y2lkKSAmJgotICAgICAgY21kX2NvZGUgIT0gR0FUVF9IQU5ETEVfVkFMVUVfQ09ORikgewotICAgIGdhdHRfY21kX2VucSh0Y2IsIHBfY2xjYiwgdHJ1ZSwgY21kX2NvZGUsIHBfY21kKTsKLSAgICBMT0dfREVCVUcoIkVucXVldWVkIEFUVCBjb21tYW5kIik7Ci0gICAgcmV0dXJuIEdBVFRfQ01EX1NUQVJURUQ7Ci0gIH0KLQotICBMT0dfREVCVUcoCi0gICAgICAiU2VuZGluZyBBVFQgY29tbWFuZCB0byBsMmNhcCBjaWQ6MHglMDR4IGVhdHRfY2hhbm5lbHM6JXUgdHJhbnNwb3J0OiVzIiwKLSAgICAgIHBfY2xjYi0+Y2lkLCB0Y2IuZWF0dCwgYnRfdHJhbnNwb3J0X3RleHQodGNiLnRyYW5zcG9ydCkuY19zdHIoKSk7Ci0gIHRHQVRUX1NUQVRVUyBhdHRfcmV0ID0gYXR0cF9zZW5kX21zZ190b19sMmNhcCh0Y2IsIHBfY2xjYi0+Y2lkLCBwX2NtZCk7Ci0gIGlmIChhdHRfcmV0ICE9IEdBVFRfQ09OR0VTVEVEICYmIGF0dF9yZXQgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBzZW5kIEFUVCBjb21tYW5kIHRvIGwyY2FwIGxheWVyIik7Ci0gICAgcmV0dXJuIEdBVFRfSU5URVJOQUxfRVJST1I7Ci0gIH0KLQotICBpZiAoY21kX2NvZGUgPT0gR0FUVF9IQU5ETEVfVkFMVUVfQ09ORiB8fCBjbWRfY29kZSA9PSBHQVRUX0NNRF9XUklURSkgewotICAgIHJldHVybiBhdHRfcmV0OwotICB9Ci0KLSAgTE9HX0RFQlVHKCJTdGFydGluZyBBVFQgcmVzcG9uc2UgdGltZXIiKTsKLSAgZ2F0dF9zdGFydF9yc3BfdGltZXIocF9jbGNiKTsKLSAgZ2F0dF9jbWRfZW5xKHRjYiwgcF9jbGNiLCBmYWxzZSwgY21kX2NvZGUsIE5VTEwpOwotICByZXR1cm4gYXR0X3JldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGF0dHBfc2VuZF9jbF9jb25maXJtYXRpb25fbXNnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBjbGllbnQgY29uZmlybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdG8gc2VydmVyLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF90Y2I6IHBvaW50ZXIgdG8gdGhlIGNvbm5lY3Rpb24gY29udHJvbCBibG9jay4KLSAqICAgICAgICAgICAgICAgICAgY2lkOiBjaGFubmVsIGlkCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGx5IHNlbnQ7IG90aGVyd2lzZSBlcnJvciBjb2RlLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9jbF9jb25maXJtYXRpb25fbXNnKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQpIHsKLSAgQlRfSERSKiBwX2NtZCA9IE5VTEw7Ci0gIHBfY21kID0gYXR0cF9idWlsZF9vcGNvZGVfY21kKEdBVFRfSEFORExFX1ZBTFVFX0NPTkYpOwotCi0gIGlmIChwX2NtZCA9PSBOVUxMKSByZXR1cm4gR0FUVF9OT19SRVNPVVJDRVM7Ci0KLSAgLyogbm8gcGVuZGluZyByZXF1ZXN0IG9yIHZhbHVlIGNvbmZpcm1hdGlvbiAqLwotICB0R0FUVF9TVEFUVVMgYXR0X3JldCA9IGF0dHBfc2VuZF9tc2dfdG9fbDJjYXAodGNiLCBjaWQsIHBfY21kKTsKLSAgaWYgKGF0dF9yZXQgIT0gR0FUVF9DT05HRVNURUQgJiYgYXR0X3JldCAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICByZXR1cm4gR0FUVF9JTlRFUk5BTF9FUlJPUjsKLSAgfQotCi0gIHJldHVybiBhdHRfcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYXR0cF9zZW5kX2NsX21zZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgY2xpZW50IHJlcXVlc3Qgb3IgY29uZmlybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdG8gc2VydmVyLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF90Y2I6IHBvaW50ZXIgdG8gdGhlIGNvbm5lY3Rpbm8gY29udHJvbCBibG9jay4KLSAqICAgICAgICAgICAgICAgICAgcF9jbGNiOiBjbGNiCi0gKiAgICAgICAgICAgICAgICAgIG9wX2NvZGU6IG1lc3NhZ2Ugb3AgY29kZS4KLSAqICAgICAgICAgICAgICAgICAgcF9tc2c6IHBvaW50ZXIgdG8gbWVzc2FnZSBwYXJhbWV0ZXJzIHN0cnVjdHVyZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfU1VDQ0VTUyBpZiBzdWNlc3NmdWxseSBzZW50OyBvdGhlcndpc2UgZXJyb3IgY29kZS4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBhdHRwX3NlbmRfY2xfbXNnKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHRHQVRUX0NMX01TRyogcF9tc2cpIHsKLSAgQlRfSERSKiBwX2NtZCA9IE5VTEw7Ci0gIHVpbnQxNl90IG9mZnNldCA9IDAsIGhhbmRsZTsKLQotICBpZiAoIXBfY2xjYikgewotICAgIExPR19FUlJPUigiTWlzc2luZyBwX2NsY2IiKTsKLSAgICByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgfQotCi0gIHVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfdHgodGNiLCBwX2NsY2ItPmNpZCk7Ci0KLSAgc3dpdGNoIChvcF9jb2RlKSB7Ci0gICAgY2FzZSBHQVRUX1JFUV9NVFU6Ci0gICAgICBpZiAocF9tc2ctPm10dSA+IEdBVFRfTUFYX01UVV9TSVpFKSB7Ci0gICAgICAgIExPR19XQVJOKAotICAgICAgICAgICAgIkdBVFQgbWVzc2FnZSBNVFUgaXMgbGFyZ2VyIHRoYW4gbWF4IEdBVFQgTVRVIHNpemUgb3BfY29kZTolaGh1IiwKLSAgICAgICAgICAgIG9wX2NvZGUpOwotICAgICAgICByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgICAgIH0KLQotICAgICAgdGNiLnBheWxvYWRfc2l6ZSA9IHBfbXNnLT5tdHU7Ci0gICAgICBwX2NtZCA9IGF0dHBfYnVpbGRfbXR1X2NtZChHQVRUX1JFUV9NVFUsIHBfbXNnLT5tdHUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfUkVRX0ZJTkRfSU5GTzoKLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfQllfVFlQRToKLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEU6Ci0gICAgICBpZiAoIUdBVFRfSEFORExFX0lTX1ZBTElEKHBfbXNnLT5icm93c2Uuc19oYW5kbGUpIHx8Ci0gICAgICAgICAgIUdBVFRfSEFORExFX0lTX1ZBTElEKHBfbXNnLT5icm93c2UuZV9oYW5kbGUpIHx8Ci0gICAgICAgICAgcF9tc2ctPmJyb3dzZS5zX2hhbmRsZSA+IHBfbXNnLT5icm93c2UuZV9oYW5kbGUpIHsKLSAgICAgICAgTE9HX1dBUk4oIkdBVFQgbWVzc2FnZSBoYXMgaW52YWxpZCBoYW5kbGUgb3BfY29kZTolaGh1Iiwgb3BfY29kZSk7Ci0gICAgICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgfQotCi0gICAgICBwX2NtZCA9IGF0dHBfYnVpbGRfYnJvd3NlX2NtZChvcF9jb2RlLCBwX21zZy0+YnJvd3NlLnNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmJyb3dzZS5lX2hhbmRsZSwgcF9tc2ctPmJyb3dzZS51dWlkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX0JMT0I6Ci0gICAgICBvZmZzZXQgPSBwX21zZy0+cmVhZF9ibG9iLm9mZnNldDsKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgR0FUVF9SRVFfUkVBRDoKLSAgICAgIGhhbmRsZSA9Ci0gICAgICAgICAgKG9wX2NvZGUgPT0gR0FUVF9SRVFfUkVBRCkgPyBwX21zZy0+aGFuZGxlIDogcF9tc2ctPnJlYWRfYmxvYi5oYW5kbGU7Ci0gICAgICAvKiAgaGFuZGxlIGNoZWNraW5nICovCi0gICAgICBpZiAoIUdBVFRfSEFORExFX0lTX1ZBTElEKGhhbmRsZSkpIHsKLSAgICAgICAgTE9HX1dBUk4oIkdBVFQgbWVzc2FnZSBoYXMgaW52YWxpZCBoYW5kbGUgb3BfY29kZTolaGh1Iiwgb3BfY29kZSk7Ci0gICAgICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgfQotCi0gICAgICBwX2NtZCA9IGF0dHBfYnVpbGRfaGFuZGxlX2NtZChvcF9jb2RlLCBoYW5kbGUsIG9mZnNldCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9SRVFfUFJFUEFSRV9XUklURToKLSAgICAgIG9mZnNldCA9IHBfbXNnLT5hdHRyX3ZhbHVlLm9mZnNldDsKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgR0FUVF9SRVFfV1JJVEU6Ci0gICAgY2FzZSBHQVRUX0NNRF9XUklURToKLSAgICBjYXNlIEdBVFRfU0lHTl9DTURfV1JJVEU6Ci0gICAgICBpZiAoIUdBVFRfSEFORExFX0lTX1ZBTElEKHBfbXNnLT5hdHRyX3ZhbHVlLmhhbmRsZSkpIHsKLSAgICAgICAgTE9HX1dBUk4oIkdBVFQgbWVzc2FnZSBoYXMgaW52YWxpZCBoYW5kbGUgb3BfY29kZTolaGh1Iiwgb3BfY29kZSk7Ci0gICAgICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICAgICAgfQotCi0gICAgICBwX2NtZCA9IGF0dHBfYnVpbGRfdmFsdWVfY21kKAotICAgICAgICAgIHBheWxvYWRfc2l6ZSwgb3BfY29kZSwgcF9tc2ctPmF0dHJfdmFsdWUuaGFuZGxlLCBvZmZzZXQsCi0gICAgICAgICAgcF9tc2ctPmF0dHJfdmFsdWUubGVuLCBwX21zZy0+YXR0cl92YWx1ZS52YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9SRVFfRVhFQ19XUklURToKLSAgICAgIHBfY21kID0gYXR0cF9idWlsZF9leGVjX3dyaXRlX2NtZChvcF9jb2RlLCBwX21zZy0+ZXhlY193cml0ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9SRVFfRklORF9UWVBFX1ZBTFVFOgotICAgICAgcF9jbWQgPSBhdHRwX2J1aWxkX3JlYWRfYnlfdHlwZV92YWx1ZV9jbWQocGF5bG9hZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfbXNnLT5maW5kX3R5cGVfdmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfTVVMVEk6Ci0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX01VTFRJX1ZBUjoKLSAgICAgIHBfY21kID0gYXR0cF9idWlsZF9yZWFkX211bHRpX2NtZChvcF9jb2RlLCBwYXlsb2FkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPnJlYWRfbXVsdGkubnVtX2hhbmRsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPnJlYWRfbXVsdGkuaGFuZGxlcyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChwX2NtZCA9PSBOVUxMKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJVbmFibGUgdG8gYnVpbGQgcHJvcGVyIEdBVFQgbWVzc2FnZSB0byBzZW5kIHRvIHBlZXIgZGV2aWNlICIKLSAgICAgICAgIm9wX2NvZGU6JWhodSIsCi0gICAgICAgIG9wX2NvZGUpOwotICAgIHJldHVybiBHQVRUX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIHJldHVybiBhdHRwX2NsX3NlbmRfY21kKHRjYiwgcF9jbGNiLCBvcF9jb2RlLCBwX2NtZCk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9nYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5jYyBiL3N0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ5OWI0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb25uZWN0aW9uX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImludGVybmFsX2luY2x1ZGUvYnRfdHJhY2UuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfYmdjb25uLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBESVJFQ1RfQ09OTkVDVF9USU1FT1VUICgzMCAqIDEwMDApIC8qIDMwIHNlY29uZHMgKi8KLQotc3RydWN0IGNsb3N1cmVfZGF0YSB7Ci0gIGJhc2U6Ok9uY2VDbG9zdXJlIHVzZXJfdGFzazsKLSAgYmFzZTo6TG9jYXRpb24gcG9zdGVkX2Zyb207Ci19OwotCi1zdGF0aWMgdm9pZCBhbGFybV9jbG9zdXJlX2NiKHZvaWQqIHApIHsKLSAgY2xvc3VyZV9kYXRhKiBkYXRhID0gKGNsb3N1cmVfZGF0YSopcDsKLSAgVkxPRygxKSA8PCAiZXhlY3V0aW5nIHRpbWVyIHNjaGVkdWxlZCBhdCAlcyIgPDwgZGF0YS0+cG9zdGVkX2Zyb20uVG9TdHJpbmcoKTsKLSAgc3RkOjptb3ZlKGRhdGEtPnVzZXJfdGFzaykuUnVuKCk7Ci0gIGRlbGV0ZSBkYXRhOwotfQotCi0vLyBQZXJpb2RpYyBhbGFybXMgYXJlIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2Ugd2UgY2xlYW4gdXAgZGF0YSBpbiBjYWxsYmFjawotdm9pZCBhbGFybV9zZXRfY2xvc3VyZShjb25zdCBiYXNlOjpMb2NhdGlvbiYgcG9zdGVkX2Zyb20sIGFsYXJtX3QqIGFsYXJtLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBpbnRlcnZhbF9tcywgYmFzZTo6T25jZUNsb3N1cmUgdXNlcl90YXNrKSB7Ci0gIGNsb3N1cmVfZGF0YSogZGF0YSA9IG5ldyBjbG9zdXJlX2RhdGE7Ci0gIGRhdGEtPnBvc3RlZF9mcm9tID0gcG9zdGVkX2Zyb207Ci0gIGRhdGEtPnVzZXJfdGFzayA9IHN0ZDo6bW92ZSh1c2VyX3Rhc2spOwotICBWTE9HKDEpIDw8ICJzY2hlZHVsaW5nIHRpbWVyICVzIiA8PCBkYXRhLT5wb3N0ZWRfZnJvbS5Ub1N0cmluZygpOwotICBhbGFybV9zZXRfb25fbWxvb3AoYWxhcm0sIGludGVydmFsX21zLCBhbGFybV9jbG9zdXJlX2NiLCBkYXRhKTsKLX0KLQotdXNpbmcgdW5pcXVlX2FsYXJtX3B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxhbGFybV90LCBkZWNsdHlwZSgmYWxhcm1fZnJlZSk+OwotCi1uYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyIHsKLQotc3RydWN0IHRBUFBTX0NPTk5FQ1RJTkcgewotICAvLyBpZHMgb2YgY2xpZW50cyBkb2luZyBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gdG8gZ2l2ZW4gZGV2aWNlCi0gIHN0ZDo6c2V0PHRBUFBfSUQ+IGRvaW5nX2JnX2Nvbm47Ci0KLSAgLy8gQXBwcyB0cnlpbmcgdG8gZG8gZGlyZWN0IGNvbm5lY3Rpb24uCi0gIHN0ZDo6bWFwPHRBUFBfSUQsIHVuaXF1ZV9hbGFybV9wdHI+IGRvaW5nX2RpcmVjdF9jb25uOwotfTsKLQotbmFtZXNwYWNlIHsKLS8vIE1hcHMgYWRkcmVzcyB0byBhcHBzIHRyeWluZyB0byBjb25uZWN0IHRvIGl0Ci1zdGQ6Om1hcDxSYXdBZGRyZXNzLCB0QVBQU19DT05ORUNUSU5HPiBiZ2Nvbm5fZGV2OwotCi1ib29sIGFueW9uZV9jb25uZWN0aW5nKAotICAgIGNvbnN0IHN0ZDo6bWFwPFJhd0FkZHJlc3MsIHRBUFBTX0NPTk5FQ1RJTkc+OjppdGVyYXRvciBpdCkgewotICByZXR1cm4gKCFpdC0+c2Vjb25kLmRvaW5nX2JnX2Nvbm4uZW1wdHkoKSB8fAotICAgICAgICAgICFpdC0+c2Vjb25kLmRvaW5nX2RpcmVjdF9jb25uLmVtcHR5KCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLyoqIGJhY2tncm91bmQgY29ubmVjdGlvbiBkZXZpY2UgZnJvbSB0aGUgbGlzdC4gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBkZXZpY2UKLSAqIHJlY29yZCwgb3IgbnVsbHB0ciBpZiBub3QgZm91bmQgKi8KLXN0ZDo6c2V0PHRBUFBfSUQ+IGdldF9hcHBzX2Nvbm5lY3RpbmdfdG8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBhdXRvIGl0ID0gYmdjb25uX2Rldi5maW5kKGFkZHJlc3MpOwotICByZXR1cm4gKGl0ICE9IGJnY29ubl9kZXYuZW5kKCkpID8gaXQtPnNlY29uZC5kb2luZ19iZ19jb25uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGQ6OnNldDx0QVBQX0lEPigpOwotfQotCi0vKiogQWRkIGEgZGV2aWNlIGZyb20gdGhlIGJhY2tncm91bmQgY29ubmVjdGlvbiBsaXN0LiAgUmV0dXJucyB0cnVlIGlmIGRldmljZQotICogYWRkZWQgdG8gdGhlIGxpc3QsIG9yIGFscmVhZHkgaW4gbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlICovCi1ib29sIGJhY2tncm91bmRfY29ubmVjdF9hZGQodWludDhfdCBhcHBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIEwyQ0FfQ29ubmVjdEZpeGVkQ2hubChMMkNBUF9BVFRfQ0lELCBhZGRyZXNzKTsKLSAgfQotCi0gIGF1dG8gaXQgPSBiZ2Nvbm5fZGV2LmZpbmQoYWRkcmVzcyk7Ci0gIGJvb2wgaW5fYWNjZXB0bGlzdCA9IGZhbHNlOwotICBpZiAoaXQgIT0gYmdjb25uX2Rldi5lbmQoKSkgewotICAgIC8vIGRldmljZSBhbHJlYWR5IGluIHRoZSBhY2NlcHRsaXN0LCBqdXN0IGFkZCBpbnRlcmVzdGVkIGFwcCB0byB0aGUgbGlzdAotICAgIGlmIChpdC0+c2Vjb25kLmRvaW5nX2JnX2Nvbm4uY291bnQoYXBwX2lkKSkgewotICAgICAgTE9HKElORk8pIDw8ICJBcHAgaWQ9IiA8PCBsb2doZXgoYXBwX2lkKQotICAgICAgICAgICAgICAgIDw8ICJhbHJlYWR5IGRvaW5nIGJhY2tncm91bmQgY29ubmVjdGlvbiB0byAiIDw8IGFkZHJlc3M7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBBbHJlYWR5IGluIGFjY2VwdGxpc3QgPwotICAgIGlmIChhbnlvbmVfY29ubmVjdGluZyhpdCkpIHsKLSAgICAgIGluX2FjY2VwdGxpc3QgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmICghaW5fYWNjZXB0bGlzdCkgewotICAgIC8vIHRoZSBkZXZpY2UgaXMgbm90IGluIHRoZSBhY2NlcHRsaXN0Ci0gICAgaWYgKCFCVE1fQWNjZXB0bGlzdEFkZChhZGRyZXNzKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gY3JlYXRlIGVuZHRyeSBmb3IgYWRkcmVzcywgYW5kIGluc2VydCBhcHBfaWQuCi0gIGJnY29ubl9kZXZbYWRkcmVzc10uZG9pbmdfYmdfY29ubi5pbnNlcnQoYXBwX2lkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKiBSZW1vdmVzIGFsbCByZWdpc3RyYXRpb25zIGZvciBjb25uZWN0aW9uIGZvciBnaXZlbiBkZXZpY2UuCi0gKiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZSAqLwotYm9vbCByZW1vdmVfdW5jb25kaXRpb25hbChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGF1dG8gaXQgPSBiZ2Nvbm5fZGV2LmZpbmQoYWRkcmVzcyk7Ci0gIGlmIChpdCA9PSBiZ2Nvbm5fZGV2LmVuZCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgQlRNX0FjY2VwdGxpc3RSZW1vdmUoYWRkcmVzcyk7Ci0gIGJnY29ubl9kZXYuZXJhc2UoaXQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqIFJlbW92ZXMgdGhlIHJlZ2lzdHJhdGlvbnMgZm9yIGNvbm5lY3Rpb24gZm9yIGdpdmVuIGRldmljZS4KLSAqIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGNvbnRyb2xsZXIgYWNjZXB0bGlzdC4gIFVzZWQgZm9yCi0gKiBzaGltIHB1cnBvc2VzLgotICogUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UgKi8KLWJvb2wgcmVtb3ZlX3VuY29uZGl0aW9uYWxfZnJvbV9zaGltKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgYXV0byBpdCA9IGJnY29ubl9kZXYuZmluZChhZGRyZXNzKTsKLSAgaWYgKGl0ID09IGJnY29ubl9kZXYuZW5kKCkpIHJldHVybiBmYWxzZTsKLSAgYmdjb25uX2Rldi5lcmFzZShpdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiogUmVtb3ZlIGRldmljZSBmcm9tIHRoZSBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gZGV2aWNlIGxpc3Qgb3IgbGlzdGVuaW5nIHRvCi0gKiBhZHZlcnRpc2luZyBsaXN0LiAgUmV0dXJucyB0cnVlIGlmIGRldmljZSB3YXMgb24gdGhlIGxpc3QgYW5kIHdhcyBzdWNjZXNmdWxseQotICogcmVtb3ZlZCAqLwotYm9vbCBiYWNrZ3JvdW5kX2Nvbm5lY3RfcmVtb3ZlKHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIFZMT0coMikgPDwgX19mdW5jX187Ci0gIGF1dG8gaXQgPSBiZ2Nvbm5fZGV2LmZpbmQoYWRkcmVzcyk7Ci0gIGlmIChpdCA9PSBiZ2Nvbm5fZGV2LmVuZCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFpdC0+c2Vjb25kLmRvaW5nX2JnX2Nvbm4uZXJhc2UoYXBwX2lkKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhbnlvbmVfY29ubmVjdGluZyhpdCkpIHJldHVybiB0cnVlOwotCi0gIC8vIG5vIG1vcmUgYXBwcyBpbnRlcmVzdGVkIC0gcmVtb3ZlIGZyb20gYWNjZXB0bGlzdCBhbmQgZGVsZXRlIHJlY29yZAotICBCVE1fQWNjZXB0bGlzdFJlbW92ZShhZGRyZXNzKTsKLSAgYmdjb25uX2Rldi5lcmFzZShpdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiogZGVyZWdpc3RlciBhbGwgcmVsYXRlZCBiYWNrZ3JvdW5kIGNvbm5ldGlvbiBkZXZpY2UuICovCi12b2lkIG9uX2FwcF9kZXJlZ2lzdGVyZWQodWludDhfdCBhcHBfaWQpIHsKLSAgYXV0byBpdCA9IGJnY29ubl9kZXYuYmVnaW4oKTsKLSAgYXV0byBlbmQgPSBiZ2Nvbm5fZGV2LmVuZCgpOwotICAvKiB1cGRhdGUgdGhlIEJHIGNvbm4gZGV2aWNlIGxpc3QgKi8KLSAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgIGl0LT5zZWNvbmQuZG9pbmdfYmdfY29ubi5lcmFzZShhcHBfaWQpOwotCi0gICAgaXQtPnNlY29uZC5kb2luZ19kaXJlY3RfY29ubi5lcmFzZShhcHBfaWQpOwotCi0gICAgaWYgKGFueW9uZV9jb25uZWN0aW5nKGl0KSkgewotICAgICAgaXQrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIEJUTV9BY2NlcHRsaXN0UmVtb3ZlKGl0LT5maXJzdCk7Ci0gICAgaXQgPSBiZ2Nvbm5fZGV2LmVyYXNlKGl0KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVfYWxsX2NsaWVudHNfd2l0aF9wZW5kaW5nX2Nvbm5lY3Rpb25zKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgYXV0byBpdCA9IGJnY29ubl9kZXYuZmluZChhZGRyZXNzKTsKLSAgd2hpbGUgKGl0ICE9IGJnY29ubl9kZXYuZW5kKCkgJiYgIWl0LT5zZWNvbmQuZG9pbmdfZGlyZWN0X2Nvbm4uZW1wdHkoKSkgewotICAgIHVpbnQ4X3QgYXBwX2lkID0gaXQtPnNlY29uZC5kb2luZ19kaXJlY3RfY29ubi5iZWdpbigpLT5maXJzdDsKLSAgICBkaXJlY3RfY29ubmVjdF9yZW1vdmUoYXBwX2lkLCBhZGRyZXNzKTsKLSAgICBpdCA9IGJnY29ubl9kZXYuZmluZChhZGRyZXNzKTsKLSAgfQotfQotCi12b2lkIG9uX2Nvbm5lY3Rpb25fY29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBMT0dfSU5GTygiTGUgY29ubmVjdGlvbiBjb21wbGV0ZWQgdG8gZGV2aWNlOiVzIiwgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIHJlbW92ZV9hbGxfY2xpZW50c193aXRoX3BlbmRpbmdfY29ubmVjdGlvbnMoYWRkcmVzcyk7Ci19Ci0KLXZvaWQgb25fY29ubmVjdGlvbl90aW1lZF9vdXRfZnJvbV9zaGltKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgb25fY29ubmVjdGlvbl90aW1lZF9vdXQoMHgwMCwgYWRkcmVzcyk7Ci19Ci0KLS8qKiBSZXNldCBiZyBkZXZpY2UgbGlzdC4gSWYgY2FsbGVkIGFmdGVyIGNvbnRyb2xsZXIgcmVzZXQsIHNldCB8YWZ0ZXJfcmVzZXR8IHRvCi0gKiB0cnVlLCBhcyB0aGVyZSBpcyBubyBuZWVkIHRvIHdpcGUgY29udHJvbGxlciBhY2NlcHRsaXN0IGluIHRoaXMgY2FzZS4gKi8KLXZvaWQgcmVzZXQoYm9vbCBhZnRlcl9yZXNldCkgewotICBiZ2Nvbm5fZGV2LmNsZWFyKCk7Ci0gIGlmICghYWZ0ZXJfcmVzZXQpIEJUTV9BY2NlcHRsaXN0Q2xlYXIoKTsKLX0KLQotdm9pZCB3bF9kaXJlY3RfY29ubmVjdF90aW1lb3V0X2NiKHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG9uX2Nvbm5lY3Rpb25fdGltZWRfb3V0KGFwcF9pZCwgYWRkcmVzcyk7Ci0KLSAgLy8gVE9ETzogdGhpcyB3b3VsZCBmcmVlIHRoZSB0aW1lciwgZnJvbSB3aXRoaW4gdGhlIHRpbWVyIGNhbGxiYWNrLCB3aGljaCBpcwotICAvLyBiYWQuCi0gIGRpcmVjdF9jb25uZWN0X3JlbW92ZShhcHBfaWQsIGFkZHJlc3MpOwotfQotCi0vKiogQWRkIGEgZGV2aWNlIHRvIHRoZSBkaXJlY2d0IGNvbm5lY3Rpb24gbGlzdC4gIFJldHVybnMgdHJ1ZSBpZiBkZXZpY2UKLSAqIGFkZGVkIHRvIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UgKi8KLWJvb2wgZGlyZWN0X2Nvbm5lY3RfYWRkKHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBMMkNBX0Nvbm5lY3RGaXhlZENobmwoTDJDQVBfQVRUX0NJRCwgYWRkcmVzcyk7Ci0gIH0KLQotICBib29sIGluX2FjY2VwdGxpc3QgPSBmYWxzZTsKLSAgYXV0byBpdCA9IGJnY29ubl9kZXYuZmluZChhZGRyZXNzKTsKLSAgaWYgKGl0ICE9IGJnY29ubl9kZXYuZW5kKCkpIHsKLSAgICAvLyBhcHAgYWxyZWFkeSB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGlzIHBhcnRpY3VsYXIgZGV2aWNlCi0gICAgaWYgKGl0LT5zZWNvbmQuZG9pbmdfZGlyZWN0X2Nvbm4uY291bnQoYXBwX2lkKSkgewotICAgICAgTE9HKElORk8pIDw8ICJkaXJlY3QgY29ubmVjdCBhdHRlbXB0IGZyb20gYXBwX2lkPSIgPDwgbG9naGV4KGFwcF9pZCkKLSAgICAgICAgICAgICAgICA8PCAiIGFscmVhZHkgaW4gcHJvZ3Jlc3MiOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIGFyZSB3ZSBhbHJlYWR5IGluIHRoZSBhY2NlcHRsaXN0ID8KLSAgICBpZiAoYW55b25lX2Nvbm5lY3RpbmcoaXQpKSB7Ci0gICAgICBMT0dfV0FSTigiQmFja2dyb3VuZCBjb25uZWN0aW9uIGF0dGVtcHQgYWxyZWFkeSBpbiBwcm9ncmVzcyBhcHBfaWQ9JXgiLAotICAgICAgICAgICAgICAgYXBwX2lkKTsKLSAgICAgIGluX2FjY2VwdGxpc3QgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGJvb2wgcGFyYW1zX2NoYW5nZWQgPSBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdCgpOwotCi0gIGlmICghaW5fYWNjZXB0bGlzdCkgewotICAgIGlmICghQlRNX0FjY2VwdGxpc3RBZGQoYWRkcmVzcykpIHsKLSAgICAgIC8vIGlmIHdlIGNhbid0IGFkZCB0byBhY2NlcHRsaXN0LCB0dXJuIHBhcmFtZXRlcnMgYmFjayB0byBzbG93LgotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBhZGQgbGUgZGV2aWNlIHRvIGFjY2VwdGxpc3QiKTsKLSAgICAgIGlmIChwYXJhbXNfY2hhbmdlZCkgQlRNX1NldExlQ29ubmVjdGlvbk1vZGVUb1Nsb3coKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvLyBTZXR1cCBhIHRpbWVyCi0gIGFsYXJtX3QqIHRpbWVvdXQgPSBhbGFybV9uZXcoIndsX2Nvbm5fcGFyYW1zXzMwcyIpOwotICBhbGFybV9zZXRfY2xvc3VyZSgKLSAgICAgIEZST01fSEVSRSwgdGltZW91dCwgRElSRUNUX0NPTk5FQ1RfVElNRU9VVCwKLSAgICAgIGJhc2U6OkJpbmRPbmNlKCZ3bF9kaXJlY3RfY29ubmVjdF90aW1lb3V0X2NiLCBhcHBfaWQsIGFkZHJlc3MpKTsKLQotICBiZ2Nvbm5fZGV2W2FkZHJlc3NdLmRvaW5nX2RpcmVjdF9jb25uLmVtcGxhY2UoCi0gICAgICBhcHBfaWQsIHVuaXF1ZV9hbGFybV9wdHIodGltZW91dCwgJmFsYXJtX2ZyZWUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGFueV9kaXJlY3RfY29ubmVjdF9sZWZ0KCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IGJnY29ubl9kZXYpIHsKLSAgICBpZiAoIXRtcC5zZWNvbmQuZG9pbmdfZGlyZWN0X2Nvbm4uZW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGRpcmVjdF9jb25uZWN0X3JlbW92ZSh1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBhdXRvIGl0ID0gYmdjb25uX2Rldi5maW5kKGFkZHJlc3MpOwotICBpZiAoaXQgPT0gYmdjb25uX2Rldi5lbmQoKSkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gZmluZCBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gdG8gcmVtb3ZlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYXV0byBhcHBfaXQgPSBpdC0+c2Vjb25kLmRvaW5nX2RpcmVjdF9jb25uLmZpbmQoYXBwX2lkKTsKLSAgaWYgKGFwcF9pdCA9PSBpdC0+c2Vjb25kLmRvaW5nX2RpcmVjdF9jb25uLmVuZCgpKSB7Ci0gICAgTE9HX1dBUk4oIlVuYWJsZSB0byBmaW5kIGRpcmVjdCBjb25uZWN0aW9uIHRvIHJlbW92ZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIHRoaXMgd2lsbCBmcmVlIHRoZSBhbGFybQotICBpdC0+c2Vjb25kLmRvaW5nX2RpcmVjdF9jb25uLmVyYXNlKGFwcF9pdCk7Ci0KLSAgLy8gaWYgd2UgcmVtb3ZlZCBsYXN0IGRpcmVjdCBjb25uZWN0aW9uLCBsb3dlciB0aGUgc2NhbiBwYXJhbWV0ZXJzIHVzZWQgZm9yCi0gIC8vIGNvbm5lY3RpbmcKLSAgaWYgKCFhbnlfZGlyZWN0X2Nvbm5lY3RfbGVmdCgpKSB7Ci0gICAgQlRNX1NldExlQ29ubmVjdGlvbk1vZGVUb1Nsb3coKTsKLSAgfQotCi0gIGlmIChhbnlvbmVfY29ubmVjdGluZyhpdCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIG5vIG1vcmUgYXBwcyBpbnRlcmVzdGVkIC0gcmVtb3ZlIGZyb20gYWNjZXB0bGlzdAotICBCVE1fQWNjZXB0bGlzdFJlbW92ZShhZGRyZXNzKTsKLSAgYmdjb25uX2Rldi5lcmFzZShpdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIGR1bXAoaW50IGZkKSB7Ci0gIGRwcmludGYoZmQsICJcbmNvbm5lY3Rpb25fbWFuYWdlciBzdGF0ZTpcbiIpOwotICBpZiAoYmdjb25uX2Rldi5lbXB0eSgpKSB7Ci0gICAgZHByaW50ZihmZCwgIlx0bm8gTG93IEVuZXJneSBjb25uZWN0aW9uIGF0dGVtcHRzXG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkcHJpbnRmKGZkLCAiXHRkZXZpY2VzIGF0dGVtcHRpbmcgY29ubmVjdGlvbjogJWQiLCAoaW50KWJnY29ubl9kZXYuc2l6ZSgpKTsKLSAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGJnY29ubl9kZXYpIHsKLSAgICBkcHJpbnRmKGZkLCAiXG5cdCAqICVzOiAiLCBlbnRyeS5maXJzdC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgaWYgKCFlbnRyeS5zZWNvbmQuZG9pbmdfZGlyZWN0X2Nvbm4uZW1wdHkoKSkgewotICAgICAgZHByaW50ZihmZCwgIlxuXHRcdGFwcHMgZG9pbmcgZGlyZWN0IGNvbm5lY3Q6ICIpOwotICAgICAgZm9yIChjb25zdCBhdXRvJiBpZCA6IGVudHJ5LnNlY29uZC5kb2luZ19kaXJlY3RfY29ubikgewotICAgICAgICBkcHJpbnRmKGZkLCAiJWQsICIsIGlkLmZpcnN0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWVudHJ5LnNlY29uZC5kb2luZ19iZ19jb25uLmVtcHR5KCkpIHsKLSAgICAgIGRwcmludGYoZmQsICJcblx0XHRhcHBzIGRvaW5nIGJhY2tncm91bmQgY29ubmVjdDogIik7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGlkIDogZW50cnkuc2Vjb25kLmRvaW5nX2JnX2Nvbm4pIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiVkLCAiLCBpZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGRwcmludGYoZmQsICJcbiIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyCmRpZmYgLS1naXQgYS9zdGFjay9nYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5oIGIvc3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYmQ5My4uMDAwMDAwMAotLS0gYS9zdGFjay9nYXR0L2Nvbm5lY3Rpb25fbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKiBjb25uZWN0aW9uX21hbmFnZXIgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9mIExFIGNvbm5lY3Rpb24KLSAqIGluaXRpYXRpb24uIEl0IGFjY2VwdCByZXF1ZXN0cyBmcm9tIG11bHRpcGxlIHN1YnN5c3RlbXMgdG8gY29ubmVjdCB0bwotICogZGV2aWNlcywgYW5kIG11bHRpcGxleCB0aGVtIGludG8gYWNjZXB0bGlzdCBhZGQvcmVtb3ZlLCBhbmQgc2NhbiBwYXJhbWV0ZXIKLSAqIGNoYW5nZXMuCi0gKgotICogVGhlcmUgaXMgbm8gY29kZSBmb3IgYXBwX2lkIGdlbmVyYXRpb24uIEdBVFQgY2xpZW50cyB1c2UgdGhlaXIgR0FUVF9JRiwgYW5kCi0gKiBMMkNBUCBsYXllciB1c2VzIENPTk5fTUdSX0lEX0wyQ0FQIGFzIGZpeGVkIGFwcF9pZC4gSW4gY2FzZSBhbnkgZnVydGhlcgotICogc3Vic3lzdGVtcyBhbHNvIHVzZSBjb25uZWN0aW9uX21hbmFnZXIsIHdlIHNob3VsZCBjb25zaWRlciBhZGRpbmcgYSBwcm9wZXIKLSAqIG1lY2hhbmlzbSBmb3IgYXBwX2lkIGdlbmVyYXRpb24uCi0gKi8KLW5hbWVzcGFjZSBjb25uZWN0aW9uX21hbmFnZXIgewotCi11c2luZyB0QVBQX0lEID0gdWludDhfdDsKLQotLyogZm9yIGJhY2tncm91bmQgY29ubmVjdGlvbiAqLwotZXh0ZXJuIGJvb2wgYmFja2dyb3VuZF9jb25uZWN0X2FkZCh0QVBQX0lEIGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci1leHRlcm4gYm9vbCBiYWNrZ3JvdW5kX2Nvbm5lY3RfcmVtb3ZlKHRBUFBfSUQgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKTsKLWV4dGVybiBib29sIHJlbW92ZV91bmNvbmRpdGlvbmFsKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotZXh0ZXJuIGJvb2wgcmVtb3ZlX3VuY29uZGl0aW9uYWxfZnJvbV9zaGltKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi1leHRlcm4gdm9pZCByZXNldChib29sIGFmdGVyX3Jlc2V0KTsKLQotZXh0ZXJuIHZvaWQgb25fYXBwX2RlcmVnaXN0ZXJlZCh0QVBQX0lEIGFwcF9pZCk7Ci1leHRlcm4gdm9pZCBvbl9jb25uZWN0aW9uX2NvbXBsZXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi1leHRlcm4gc3RkOjpzZXQ8dEFQUF9JRD4gZ2V0X2FwcHNfY29ubmVjdGluZ190byhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLQotZXh0ZXJuIGJvb2wgZGlyZWN0X2Nvbm5lY3RfYWRkKHRBUFBfSUQgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKTsKLWV4dGVybiBib29sIGRpcmVjdF9jb25uZWN0X3JlbW92ZSh0QVBQX0lEIGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLWV4dGVybiB2b2lkIGR1bXAoaW50IGZkKTsKLQotLyogVGhpcyBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gZGlyZWN0IGNvbm5lY3QgYXR0ZW1wdCBmYWlscyBkdWUgdG8KLSAqIHRpbWVvdXQuIEl0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdXNlcnMgb2YgY29ubmVjdGlvbl9tYW5hZ2VyICovCi1leHRlcm4gdm9pZCBvbl9jb25uZWN0aW9uX3RpbWVkX291dCh1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci1leHRlcm4gdm9pZCBvbl9jb25uZWN0aW9uX3RpbWVkX291dF9mcm9tX3NoaW0oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb25uZWN0aW9uX21hbmFnZXIKZGlmZiAtLWdpdCBhL3N0YWNrL2dhdHQvZ2F0dF9hcGkuY2MgYi9zdGFjay9nYXR0L2dhdHRfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI5YjMwLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2dhdHQvZ2F0dF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgdGhpcyBmaWxlIGNvbnRhaW5zIEdBVFQgaW50ZXJmYWNlIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiZ2F0dF9hcGkuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJnYXR0X2ludC5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotZXh0ZXJuIGJvb2wgQlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotLyoqCi0gKiBBZGQgYW4gc2VydmljZSBoYW5kbGUgcmFuZ2UgdG8gdGhlIGxpc3QgaW4gZGVjZW5kaW5nIG9yZGVyIG9mIHRoZSBzdGFydAotICogaGFuZGxlLiBSZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBuZXdseSBhZGRlZCBlbGVtZW50LgotICoqLwotdEdBVFRfSERMX0xJU1RfRUxFTSYgZ2F0dF9hZGRfYW5faXRlbV90b19saXN0KHVpbnQxNl90IHNfaGFuZGxlKSB7Ci0gIGF1dG8gbHN0X3B0ciA9IGdhdHRfY2IuaGRsX2xpc3RfaW5mbzsKLSAgYXV0byBpdCA9IGxzdF9wdHItPmJlZ2luKCk7Ci0gIGZvciAoOyBpdCAhPSBsc3RfcHRyLT5lbmQoKTsgaXQrKykgewotICAgIGlmIChzX2hhbmRsZSA+IGl0LT5hc2duX3JhbmdlLnNfaGFuZGxlKSBicmVhazsKLSAgfQotCi0gIGF1dG8gcml0ID0gbHN0X3B0ci0+ZW1wbGFjZShpdCk7Ci0gIHJldHVybiAqcml0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgICAgICAgICAgICAgIEdBVFQgU0VSVkVSIEFQSQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUU19OVlJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBcHBsaWNhdGlvbiBtYW5hZ2VyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgZm9yCi0gKiAgICAgICAgICAgICAgICAgIE5WIHNhdmUgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGVyZSBjYW4gYmUgb25lIGFuZCBvbmx5IG9uZQotICogICAgICAgICAgICAgICAgICBOViBzYXZlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF9jYl9pbmZvIDogY2FsbGJhY2sgaW5mb3JtYWl0b24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVnaXN0ZXJlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEdBVFRTX05WUmVnaXN0ZXIodEdBVFRfQVBQTF9JTkZPKiBwX2NiX2luZm8pIHsKLSAgYm9vbCBzdGF0dXMgPSBmYWxzZTsKLSAgaWYgKHBfY2JfaW5mbykgewotICAgIGdhdHRfY2IuY2JfaW5mbyA9ICpwX2NiX2luZm87Ci0gICAgc3RhdHVzID0gdHJ1ZTsKLSAgICBnYXR0X2luaXRfc3J2X2NoZygpOwotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHVpbnQxNl90IGNvbXB1dGVfc2VydmljZV9zaXplKGJ0Z2F0dF9kYl9lbGVtZW50X3QqIHNlcnZpY2UsIGludCBjb3VudCkgewotICBpbnQgZGJfc2l6ZSA9IDA7Ci0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGVsID0gc2VydmljZTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVsKyspCi0gICAgaWYgKGVsLT50eXBlID09IEJUR0FUVF9EQl9QUklNQVJZX1NFUlZJQ0UgfHwKLSAgICAgICAgZWwtPnR5cGUgPT0gQlRHQVRUX0RCX1NFQ09OREFSWV9TRVJWSUNFIHx8Ci0gICAgICAgIGVsLT50eXBlID09IEJUR0FUVF9EQl9ERVNDUklQVE9SIHx8Ci0gICAgICAgIGVsLT50eXBlID09IEJUR0FUVF9EQl9JTkNMVURFRF9TRVJWSUNFKSB7Ci0gICAgICBkYl9zaXplICs9IDE7Ci0gICAgfSBlbHNlIGlmIChlbC0+dHlwZSA9PSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMpIHsKLSAgICAgIGRiX3NpemUgKz0gMjsKLQotICAgICAgLy8gaWYgcHJlc2VudCwgQ2hhcmFjdGVyaXN0aWMgRXh0ZW5kZWQgUHJvcGVydGllcyB0YWtlcyBvbmUgaGFuZGxlCi0gICAgICBpZiAoZWwtPnByb3BlcnRpZXMgJiBHQVRUX0NIQVJfUFJPUF9CSVRfRVhUX1BST1ApIGRiX3NpemUrKzsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBVbmtub3duIGVsZW1lbnQgdHlwZTogIiA8PCBlbC0+dHlwZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRiX3NpemU7Ci19Ci0KLXN0YXRpYyBib29sIGlzX2dhdHRfYXR0cl90eXBlKGNvbnN0IFV1aWQmIHV1aWQpIHsKLSAgaWYgKHV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9QUklfU0VSVklDRSkgfHwKLSAgICAgIHV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9TRUNfU0VSVklDRSkgfHwKLSAgICAgIHV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9JTkNMVURFX1NFUlZJQ0UpIHx8Ci0gICAgICB1dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9ERUNMQVJFKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqIFVwZGF0ZSB0aGUgdGhlIGxhc3Qgc2VydmljZSBpbmZvIGZvciB0aGUgc2VydmljZSBsaXN0IGluZm8gKi8KLXN0YXRpYyB2b2lkIGdhdHRfdXBkYXRlX2xhc3Rfc3J2X2luZm8oKSB7Ci0gIGdhdHRfY2IubGFzdF9zZXJ2aWNlX2hhbmRsZSA9IDA7Ci0KLSAgZm9yICh0R0FUVF9TUlZfTElTVF9FTEVNJiBlbCA6ICpnYXR0X2NiLnNydl9saXN0X2luZm8pIHsKLSAgICBnYXR0X2NiLmxhc3Rfc2VydmljZV9oYW5kbGUgPSBlbC5zX2hkbDsKLSAgfQotfQotCi0vKiogVXBkYXRlIGRhdGFiYXNlIGhhc2ggYW5kIGNsaWVudCBzdGF0dXMgKi8KLXN0YXRpYyB2b2lkIGdhdHRfdXBkYXRlX2Zvcl9kYXRhYmFzZV9jaGFuZ2UoKSB7Ci0gIGdhdHRfY2IuZGF0YWJhc2VfaGFzaCA9IGdhdHRzX2NhbGN1bGF0ZV9kYXRhYmFzZV9oYXNoKGdhdHRfY2Iuc3J2X2xpc3RfaW5mbyk7Ci0KLSAgdWludDhfdCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IEdBVFRfTUFYX1BIWV9DSEFOTkVMOyBpKyspIHsKLSAgICB0R0FUVF9UQ0ImIHRjYiA9IGdhdHRfY2IudGNiW2ldOwotICAgIGlmICh0Y2IuaW5fdXNlKSBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXModGNiLCAvKiBjaGdfYXdhcmU9ICovIGZhbHNlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVFNfQWRkU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIEdBVFQgc2VydmljZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGdhdHRfaWYgOiBhcHBsaWNhdGlvbiBpZgotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIDogcHNldWRvLXJlcHJlc2VudGF0aW9uIG9mIHNlcnZpY2UgYW5kIGl0J3MgY29udGVudAotICogICAgICAgICAgICAgICAgICBjb3VudCAgIDogc2l6ZSBvZiBzZXJ2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBvbiBzdWNjZXNzIEdBVFRfU0VSVklDRV9TVEFSVEVEIGlzIHJldHVybmVkLCBhbmQKLSAqICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX2hhbmRsZSBmaWVsZCBpbnNpZGUgc2VydmljZSBlbGVtZW50cyBhcmUgZmlsbGVkLgotICogICAgICAgICAgICAgICAgICBvbiBlcnJvciBlcnJvciBzdGF0dXMgaXMgcmV0dXJuZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBHQVRUU19BZGRTZXJ2aWNlKHRHQVRUX0lGIGdhdHRfaWYsIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKLSAgdWludDE2X3Qgc19oZGwgPSAwOwotICBib29sIHNhdmVfaGRsID0gZmFsc2U7Ci0gIHRHQVRUX1JFRyogcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLQotICBib29sIGlzX3ByaSA9IChzZXJ2aWNlLT50eXBlID09IEJUR0FUVF9EQl9QUklNQVJZX1NFUlZJQ0UpID8gdHJ1ZSA6IGZhbHNlOwotICBVdWlkIHN2Y191dWlkID0gc2VydmljZS0+dXVpZDsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFwX3JlZykgewotICAgIExPRyhFUlJPUikgPDwgIkluYXZsaWQgZ2F0dF9pZj0iIDw8ICtnYXR0X2lmOwotICAgIHJldHVybiBHQVRUX0lOVEVSTkFMX0VSUk9SOwotICB9Ci0KLSAgdWludDE2X3QgbnVtX2hhbmRsZXMgPSBjb21wdXRlX3NlcnZpY2Vfc2l6ZShzZXJ2aWNlLCBjb3VudCk7Ci0KLSAgaWYgKHN2Y191dWlkID09IFV1aWQ6OkZyb20xNkJpdChVVUlEX1NFUlZDTEFTU19HQVRUX1NFUlZFUikpIHsKLSAgICBzX2hkbCA9IGdhdHRfY2IuaGRsX2NmZy5nYXR0X3N0YXJ0X2hkbDsKLSAgfSBlbHNlIGlmIChzdmNfdXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FQX1NFUlZFUikpIHsKLSAgICBzX2hkbCA9IGdhdHRfY2IuaGRsX2NmZy5nYXBfc3RhcnRfaGRsOwotICB9IGVsc2UgewotICAgIGlmICghZ2F0dF9jYi5oZGxfbGlzdF9pbmZvLT5lbXB0eSgpKSB7Ci0gICAgICBzX2hkbCA9IGdhdHRfY2IuaGRsX2xpc3RfaW5mby0+ZnJvbnQoKS5hc2duX3JhbmdlLmVfaGFuZGxlICsgMTsKLSAgICB9Ci0KLSAgICBpZiAoc19oZGwgPCBnYXR0X2NiLmhkbF9jZmcuYXBwX3N0YXJ0X2hkbCkKLSAgICAgIHNfaGRsID0gZ2F0dF9jYi5oZGxfY2ZnLmFwcF9zdGFydF9oZGw7Ci0KLSAgICBzYXZlX2hkbCA9IHRydWU7Ci0gIH0KLQotICAvKiBjaGVjayBmb3Igc3BhY2UgKi8KLSAgaWYgKG51bV9oYW5kbGVzID4gKDB4RkZGRiAtIHNfaGRsICsgMSkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IG5vIGhhbmRsZXMsIHNfaGRsPSIgPDwgK3NfaGRsCi0gICAgICAgICAgICAgICA8PCAiIG5lZWRlZD0iIDw8IG51bV9oYW5kbGVzOwotICAgIHJldHVybiBHQVRUX0lOVEVSTkFMX0VSUk9SOwotICB9Ci0KLSAgdEdBVFRfSERMX0xJU1RfRUxFTSYgbGlzdCA9IGdhdHRfYWRkX2FuX2l0ZW1fdG9fbGlzdChzX2hkbCk7Ci0gIGxpc3QuYXNnbl9yYW5nZS5hcHBfdXVpZDEyOCA9IHBfcmVnLT5hcHBfdXVpZDEyODsKLSAgbGlzdC5hc2duX3JhbmdlLnN2Y191dWlkID0gc3ZjX3V1aWQ7Ci0gIGxpc3QuYXNnbl9yYW5nZS5zX2hhbmRsZSA9IHNfaGRsOwotICBsaXN0LmFzZ25fcmFuZ2UuZV9oYW5kbGUgPSBzX2hkbCArIG51bV9oYW5kbGVzIC0gMTsKLSAgbGlzdC5hc2duX3JhbmdlLmlzX3ByaW1hcnkgPSBpc19wcmk7Ci0KLSAgaWYgKHNhdmVfaGRsKSB7Ci0gICAgaWYgKGdhdHRfY2IuY2JfaW5mby5wX252X3NhdmVfY2FsbGJhY2spCi0gICAgICAoKmdhdHRfY2IuY2JfaW5mby5wX252X3NhdmVfY2FsbGJhY2spKHRydWUsICZsaXN0LmFzZ25fcmFuZ2UpOwotICB9Ci0KLSAgZ2F0dHNfaW5pdF9zZXJ2aWNlX2RiKGxpc3Quc3ZjX2RiLCBzdmNfdXVpZCwgaXNfcHJpLCBzX2hkbCwgbnVtX2hhbmRsZXMpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogaGFuZGxlcyBuZWVkZWQ9IiA8PCBudW1faGFuZGxlcwotICAgICAgICAgIDw8ICIsIHNfaGRsPSIgPDwgbG9naGV4KGxpc3QuYXNnbl9yYW5nZS5zX2hhbmRsZSkKLSAgICAgICAgICA8PCAiLCBlX2hkbD0iIDw8IGxvZ2hleChsaXN0LmFzZ25fcmFuZ2UuZV9oYW5kbGUpCi0gICAgICAgICAgPDwgIiwgdXVpZD0iIDw8IGxpc3QuYXNnbl9yYW5nZS5zdmNfdXVpZAotICAgICAgICAgIDw8ICIsIGlzX3ByaW1hcnk9IiA8PCArbGlzdC5hc2duX3JhbmdlLmlzX3ByaW1hcnk7Ci0KLSAgc2VydmljZS0+YXR0cmlidXRlX2hhbmRsZSA9IHNfaGRsOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIGVsID0gc2VydmljZSArIDE7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyssIGVsKyspIHsKLSAgICBjb25zdCBVdWlkJiB1dWlkID0gZWwtPnV1aWQ7Ci0KLSAgICBpZiAoZWwtPnR5cGUgPT0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDKSB7Ci0gICAgICAvKiBkYXRhIHZhbGlkaXR5IGNoZWNraW5nICovCi0gICAgICBpZiAoKChlbC0+cHJvcGVydGllcyAmIEdBVFRfQ0hBUl9QUk9QX0JJVF9BVVRIKSAmJgotICAgICAgICAgICAhKGVsLT5wZXJtaXNzaW9ucyAmIEdBVFRfV1JJVEVfU0lHTkVEX1BFUk0pKSB8fAotICAgICAgICAgICgoZWwtPnBlcm1pc3Npb25zICYgR0FUVF9XUklURV9TSUdORURfUEVSTSkgJiYKLSAgICAgICAgICAgIShlbC0+cHJvcGVydGllcyAmIEdBVFRfQ0hBUl9QUk9QX0JJVF9BVVRIKSkpIHsKLSAgICAgICAgVkxPRygxKSA8PCAiSW52YWxpZCBjb25maWd1cmF0aW9uIHByb3BlcnR5PSIgPDwgbG9naGV4KGVsLT5wcm9wZXJ0aWVzKQotICAgICAgICAgICAgICAgIDw8ICIsIHBlcm09IiA8PCBsb2doZXgoZWwtPnBlcm1pc3Npb25zKTsKLSAgICAgICAgcmV0dXJuIEdBVFRfSU5URVJOQUxfRVJST1I7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc19nYXR0X2F0dHJfdHlwZSh1dWlkKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogYXR0ZXB0IHRvIGFkZCBjaGFyYWN0ZXJpc3RpYyB3aXRoIFVVSUQgZXF1YWwgdG8gR0FUVCAiCi0gICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBUeXBlICIKLSAgICAgICAgICAgICAgICAgICA8PCB1dWlkOwotICAgICAgICByZXR1cm4gR0FUVF9JTlRFUk5BTF9FUlJPUjsKLSAgICAgIH0KLQotICAgICAgZWwtPmF0dHJpYnV0ZV9oYW5kbGUgPSBnYXR0c19hZGRfY2hhcmFjdGVyaXN0aWMoCi0gICAgICAgICAgbGlzdC5zdmNfZGIsIGVsLT5wZXJtaXNzaW9ucywgZWwtPnByb3BlcnRpZXMsIHV1aWQpOwotCi0gICAgICAvLyBhZGQgY2hhcmFjdGVyaXN0aWMgZXh0ZW5kZWQgcHJvcGVydGllcyBkZXNjcmlwdG9yIGlmIG5lZWRlZAotICAgICAgaWYgKGVsLT5wcm9wZXJ0aWVzICYgR0FUVF9DSEFSX1BST1BfQklUX0VYVF9QUk9QKSB7Ci0gICAgICAgIGdhdHRzX2FkZF9jaGFyX2V4dF9wcm9wX2Rlc2NyKGxpc3Quc3ZjX2RiLCBlbC0+ZXh0ZW5kZWRfcHJvcGVydGllcyk7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGVsLT50eXBlID09IEJUR0FUVF9EQl9ERVNDUklQVE9SKSB7Ci0gICAgICBpZiAoaXNfZ2F0dF9hdHRyX3R5cGUodXVpZCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IGF0dGVwdCB0byBhZGQgZGVzY3JpcHRvciB3aXRoIFVVSUQgZXF1YWwgdG8gR0FUVCAiCi0gICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBUeXBlICIKLSAgICAgICAgICAgICAgICAgICA8PCB1dWlkOwotICAgICAgICByZXR1cm4gR0FUVF9JTlRFUk5BTF9FUlJPUjsKLSAgICAgIH0KLQotICAgICAgZWwtPmF0dHJpYnV0ZV9oYW5kbGUgPQotICAgICAgICAgIGdhdHRzX2FkZF9jaGFyX2Rlc2NyKGxpc3Quc3ZjX2RiLCBlbC0+cGVybWlzc2lvbnMsIHV1aWQpOwotICAgIH0gZWxzZSBpZiAoZWwtPnR5cGUgPT0gQlRHQVRUX0RCX0lOQ0xVREVEX1NFUlZJQ0UpIHsKLSAgICAgIHRHQVRUX0hETF9MSVNUX0VMRU0qIHBfaW5jbF9kZWNsOwotICAgICAgcF9pbmNsX2RlY2wgPSBnYXR0X2ZpbmRfaGRsX2J1ZmZlcl9ieV9oYW5kbGUoZWwtPmF0dHJpYnV0ZV9oYW5kbGUpOwotICAgICAgaWYgKHBfaW5jbF9kZWNsID09IG51bGxwdHIpIHsKLSAgICAgICAgVkxPRygxKSA8PCAiSW5jbHVkZWQgU2VydmljZSBub3QgY3JlYXRlZCI7Ci0gICAgICAgIHJldHVybiBHQVRUX0lOVEVSTkFMX0VSUk9SOwotICAgICAgfQotCi0gICAgICBlbC0+YXR0cmlidXRlX2hhbmRsZSA9IGdhdHRzX2FkZF9pbmNsdWRlZF9zZXJ2aWNlKAotICAgICAgICAgIGxpc3Quc3ZjX2RiLCBwX2luY2xfZGVjbC0+YXNnbl9yYW5nZS5zX2hhbmRsZSwKLSAgICAgICAgICBwX2luY2xfZGVjbC0+YXNnbl9yYW5nZS5lX2hhbmRsZSwgcF9pbmNsX2RlY2wtPmFzZ25fcmFuZ2Uuc3ZjX3V1aWQpOwotICAgIH0KLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2aWNlIHBhcnNlZCBjb3JyZWN0bHksIG5vdyBzdGFydGluZyI7Ci0KLSAgLyp0aGlzIGlzIGEgbmV3IGFwcGxpY2F0aW9uIHNlcnZpY2Ugc3RhcnQgKi8KLQotICAvLyBmaW5kIGEgcGxhY2UgZm9yIHRoaXMgc2VydmljZSBpbiB0aGUgbGlzdAotICBhdXRvIGxzdF9wdHIgPSBnYXR0X2NiLnNydl9saXN0X2luZm87Ci0gIGF1dG8gaXQgPSBsc3RfcHRyLT5iZWdpbigpOwotICBmb3IgKDsgaXQgIT0gbHN0X3B0ci0+ZW5kKCk7IGl0KyspIHsKLSAgICBpZiAobGlzdC5hc2duX3JhbmdlLnNfaGFuZGxlIDwgaXQtPnNfaGRsKSBicmVhazsKLSAgfQotICBhdXRvIHJpdCA9IGxzdF9wdHItPmVtcGxhY2UoaXQpOwotCi0gIHRHQVRUX1NSVl9MSVNUX0VMRU0mIGVsZW0gPSAqcml0OwotICBlbGVtLmdhdHRfaWYgPSBnYXR0X2lmOwotICBlbGVtLnNfaGRsID0gbGlzdC5hc2duX3JhbmdlLnNfaGFuZGxlOwotICBlbGVtLmVfaGRsID0gbGlzdC5hc2duX3JhbmdlLmVfaGFuZGxlOwotICBlbGVtLnBfZGIgPSAmbGlzdC5zdmNfZGI7Ci0gIGVsZW0uaXNfcHJpbWFyeSA9IGxpc3QuYXNnbl9yYW5nZS5pc19wcmltYXJ5OwotCi0gIGVsZW0uYXBwX3V1aWQgPSBsaXN0LmFzZ25fcmFuZ2UuYXBwX3V1aWQxMjg7Ci0gIGVsZW0udHlwZSA9IGxpc3QuYXNnbl9yYW5nZS5pc19wcmltYXJ5ID8gR0FUVF9VVUlEX1BSSV9TRVJWSUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR0FUVF9VVUlEX1NFQ19TRVJWSUNFOwotCi0gIGlmIChlbGVtLnR5cGUgPT0gR0FUVF9VVUlEX1BSSV9TRVJWSUNFKSB7Ci0gICAgVXVpZCogcF91dWlkID0gZ2F0dHNfZ2V0X3NlcnZpY2VfdXVpZChlbGVtLnBfZGIpOwotICAgIGVsZW0uc2RwX2hhbmRsZSA9IGdhdHRfYWRkX3NkcF9yZWNvcmQoKnBfdXVpZCwgZWxlbS5zX2hkbCwgZWxlbS5lX2hkbCk7Ci0gIH0gZWxzZSB7Ci0gICAgZWxlbS5zZHBfaGFuZGxlID0gMDsKLSAgfQotCi0gIGdhdHRfdXBkYXRlX2xhc3Rfc3J2X2luZm8oKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGFsbG9jYXRlZCBlbCBzX2hkbD0iIDw8IGxvZ2hleChlbGVtLnNfaGRsKQotICAgICAgICAgIDw8ICIsIGVfaGRsPSIgPDwgbG9naGV4KGVsZW0uZV9oZGwpIDw8ICIsIHR5cGU9IiA8PCBsb2doZXgoZWxlbS50eXBlKQotICAgICAgICAgIDw8ICIsIHNkcF9oZGw9IiA8PCBsb2doZXgoZWxlbS5zZHBfaGFuZGxlKTsKLQotICBnYXR0X3VwZGF0ZV9mb3JfZGF0YWJhc2VfY2hhbmdlKCk7Ci0gIGdhdHRfcHJvY19zcnZfY2hnKCk7Ci0KLSAgcmV0dXJuIEdBVFRfU0VSVklDRV9TVEFSVEVEOwotfQotCi1ib29sIGlzX2FjdGl2ZV9zZXJ2aWNlKGNvbnN0IFV1aWQmIGFwcF91dWlkMTI4LCBVdWlkKiBwX3N2Y191dWlkLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUpIHsKLSAgZm9yIChhdXRvJiBpbmZvIDogKmdhdHRfY2Iuc3J2X2xpc3RfaW5mbykgewotICAgIFV1aWQqIHBfdGhpc191dWlkID0gZ2F0dHNfZ2V0X3NlcnZpY2VfdXVpZChpbmZvLnBfZGIpOwotCi0gICAgaWYgKHBfdGhpc191dWlkICYmIGFwcF91dWlkMTI4ID09IGluZm8uYXBwX3V1aWQgJiYKLSAgICAgICAgKnBfc3ZjX3V1aWQgPT0gKnBfdGhpc191dWlkICYmIChzdGFydF9oYW5kbGUgPT0gaW5mby5zX2hkbCkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkFjdGl2ZSBTZXJ2aWNlIEZvdW5kOiAiIDw8ICpwX3N2Y191dWlkOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRTX0RlbGV0ZVNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhIHNlcnZpY2UuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBnYXR0X2lmICAgICAgIDogYXBwbGljYXRpb24gaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgIHBfc3ZjX3V1aWQgICAgOiBzZXJ2aWNlIFVVSUQKLSAqICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlICA6IHN0YXJ0IGhhbmRsZSBvZiB0aGUgc2VydmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCwgZmFsc2UgaWYgdGhlIGhhbmRsZSBibG9jawotICogICAgICAgICAgICAgICAgICB3YXMgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEdBVFRTX0RlbGV0ZVNlcnZpY2UodEdBVFRfSUYgZ2F0dF9pZiwgVXVpZCogcF9zdmNfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdmNfaW5zdCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIHRHQVRUX1JFRyogcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLSAgaWYgKHBfcmVnID09IE5VTEwpIHsKLSAgICBMT0coRVJST1IpIDw8ICJBcHBsaWNhaXRvbiBub3QgZm91ZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYXV0byBpdCA9Ci0gICAgICBnYXR0X2ZpbmRfaGRsX2J1ZmZlcl9ieV9hcHBfaWQocF9yZWctPmFwcF91dWlkMTI4LCBwX3N2Y191dWlkLCBzdmNfaW5zdCk7Ci0gIGlmIChpdCA9PSBnYXR0X2NiLmhkbF9saXN0X2luZm8tPmVuZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTm8gU2VydmljZSBmb3VuZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGlzX2FjdGl2ZV9zZXJ2aWNlKHBfcmVnLT5hcHBfdXVpZDEyOCwgcF9zdmNfdXVpZCwgc3ZjX2luc3QpKSB7Ci0gICAgR0FUVFNfU3RvcFNlcnZpY2UoaXQtPmFzZ25fcmFuZ2Uuc19oYW5kbGUpOwotICB9Ci0KLSAgZ2F0dF91cGRhdGVfZm9yX2RhdGFiYXNlX2NoYW5nZSgpOwotICBnYXR0X3Byb2Nfc3J2X2NoZygpOwotCi0gIFZMT0coMSkgPDwgInJlbGVhc2VkIGhhbmRsZXMgc19oZGw9IiA8PCBsb2doZXgoaXQtPmFzZ25fcmFuZ2Uuc19oYW5kbGUpCi0gICAgICAgICAgPDwgIiwgZV9oZGw9IiA8PCBsb2doZXgoaXQtPmFzZ25fcmFuZ2UuZV9oYW5kbGUpOwotCi0gIGlmICgoaXQtPmFzZ25fcmFuZ2Uuc19oYW5kbGUgPj0gZ2F0dF9jYi5oZGxfY2ZnLmFwcF9zdGFydF9oZGwpICYmCi0gICAgICBnYXR0X2NiLmNiX2luZm8ucF9udl9zYXZlX2NhbGxiYWNrKQotICAgICgqZ2F0dF9jYi5jYl9pbmZvLnBfbnZfc2F2ZV9jYWxsYmFjaykoZmFsc2UsICZpdC0+YXNnbl9yYW5nZSk7Ci0KLSAgZ2F0dF9jYi5oZGxfbGlzdF9pbmZvLT5lcmFzZShpdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVFNfU3RvcFNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0b3AgYSBzZXJ2aWNlCi0gKgotICogUGFyYW1ldGVyICAgICAgICAgc2VydmljZV9oYW5kbGUgOiB0aGlzIGlzIHRoZSBzdGFydCBoYW5kbGUgb2YgYSBzZXJ2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEdBVFRTX1N0b3BTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaGFuZGxlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBzZXJ2aWNlID0gIiA8PCBsb2doZXgoc2VydmljZV9oYW5kbGUpOwotCi0gIGF1dG8gaXQgPSBnYXR0X3NyX2ZpbmRfaV9yY2JfYnlfaGFuZGxlKHNlcnZpY2VfaGFuZGxlKTsKLSAgaWYgKGl0ID09IGdhdHRfY2Iuc3J2X2xpc3RfaW5mby0+ZW5kKCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHNlcnZpY2VfaGFuZGxlPSIgPDwgbG9naGV4KHNlcnZpY2VfaGFuZGxlKQotICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgaW4gdXNlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoaXQtPnNkcF9oYW5kbGUpIHsKLSAgICBTRFBfRGVsZXRlUmVjb3JkKGl0LT5zZHBfaGFuZGxlKTsKLSAgfQotCi0gIGdhdHRfY2Iuc3J2X2xpc3RfaW5mby0+ZXJhc2UoaXQpOwotICBnYXR0X3VwZGF0ZV9sYXN0X3Nydl9pbmZvKCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVHNfSGFuZGxlVmFsdWVJbmRpY2F0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgaGFuZGxlIHZhbHVlIGluZGljYXRpb24gdG8gYSBjbGllbnQuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIGlkZW50aWZpZXIuCi0gKiAgICAgICAgICAgICAgICAgIGF0dHJfaGFuZGxlOiBBdHRyaWJ1dGUgaGFuZGxlIG9mIHRoaXMgaGFuZGxlIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uLgotICogICAgICAgICAgICAgICAgICB2YWxfbGVuOiBMZW5ndGggb2YgdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgdmFsdWUuCi0gKiAgICAgICAgICAgICAgICAgIHBfdmFsOiBQb2ludGVyIHRvIHRoZSBpbmRpY2F0ZWQgYXR0cmlidXRlIHZhbHVlIGRhdGEuCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgc3VjZXNzZnVsbHkgc2VudCBvciBxdWV1ZWQ7IG90aGVyd2lzZSBlcnJvcgotICogICAgICAgICAgICAgICAgICBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9TVEFUVVMgR0FUVFNfSGFuZGxlVmFsdWVJbmRpY2F0aW9uKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWxfbGVuLCB1aW50OF90KiBwX3ZhbCkgewotICB0R0FUVF9JRiBnYXR0X2lmID0gR0FUVF9HRVRfR0FUVF9JRihjb25uX2lkKTsKLSAgdWludDhfdCB0Y2JfaWR4ID0gR0FUVF9HRVRfVENCX0lEWChjb25uX2lkKTsKLSAgdEdBVFRfUkVHKiBwX3JlZyA9IGdhdHRfZ2V0X3JlZ2NiKGdhdHRfaWYpOwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9nZXRfdGNiX2J5X2lkeCh0Y2JfaWR4KTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICBpZiAoKHBfcmVnID09IE5VTEwpIHx8IChwX3RjYiA9PSBOVUxMKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biAgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gKHRHQVRUX1NUQVRVUylHQVRUX0lOVkFMSURfQ09OTl9JRDsKLSAgfQotCi0gIGlmICghR0FUVF9IQU5ETEVfSVNfVkFMSUQoYXR0cl9oYW5kbGUpKSByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLQotICB0R0FUVF9WQUxVRSBpbmRpY2F0aW9uOwotICBpbmRpY2F0aW9uLmNvbm5faWQgPSBjb25uX2lkOwotICBpbmRpY2F0aW9uLmhhbmRsZSA9IGF0dHJfaGFuZGxlOwotICBpbmRpY2F0aW9uLmxlbiA9IHZhbF9sZW47Ci0gIG1lbWNweShpbmRpY2F0aW9uLnZhbHVlLCBwX3ZhbCwgdmFsX2xlbik7Ci0gIGluZGljYXRpb24uYXV0aF9yZXEgPSBHQVRUX0FVVEhfUkVRX05PTkU7Ci0KLSAgdWludDE2X3QqIGluZGljYXRlX2hhbmRsZV9wID0gTlVMTDsKLSAgdWludDE2X3QgY2lkOwotCi0gIGlmICghZ2F0dF90Y2JfZ2V0X2NpZF9hdmFpbGFibGVfZm9yX2luZGljYXRpb24ocF90Y2IsIHBfcmVnLT5lYXR0X3N1cHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGljYXRlX2hhbmRsZV9wLCAmY2lkKSkgewotICAgIFZMT0coMSkgPDwgIkFkZCBhIHBlbmRpbmcgaW5kaWNhdGlvbiI7Ci0gICAgZ2F0dF9hZGRfcGVuZGluZ19pbmQocF90Y2IsICZpbmRpY2F0aW9uKTsKLSAgICByZXR1cm4gR0FUVF9TVUNDRVNTOwotICB9Ci0KLSAgdEdBVFRfU1JfTVNHIGdhdHRfc3JfbXNnOwotICBnYXR0X3NyX21zZy5hdHRyX3ZhbHVlID0gaW5kaWNhdGlvbjsKLSAgQlRfSERSKiBwX21zZyA9Ci0gICAgICBhdHRwX2J1aWxkX3NyX21zZygqcF90Y2IsIEdBVFRfSEFORExFX1ZBTFVFX0lORCwgJmdhdHRfc3JfbXNnKTsKLSAgaWYgKCFwX21zZykgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotCi0gIHRHQVRUX1NUQVRVUyBjbWRfc3RhdHVzID0gYXR0cF9zZW5kX3NyX21zZygqcF90Y2IsIGNpZCwgcF9tc2cpOwotICBpZiAoY21kX3N0YXR1cyA9PSBHQVRUX1NVQ0NFU1MgfHwgY21kX3N0YXR1cyA9PSBHQVRUX0NPTkdFU1RFRCkgewotICAgICppbmRpY2F0ZV9oYW5kbGVfcCA9IGluZGljYXRpb24uaGFuZGxlOwotICAgIGdhdHRfc3RhcnRfY29uZl90aW1lcihwX3RjYiwgY2lkKTsKLSAgfQotICByZXR1cm4gY21kX3N0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRTX0hhbmRsZVZhbHVlTm90aWZpY2F0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgaGFuZGxlIHZhbHVlIG5vdGlmaWNhdGlvbiB0byBhIGNsaWVudC4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgYXR0cl9oYW5kbGU6IEF0dHJpYnV0ZSBoYW5kbGUgb2YgdGhpcyBoYW5kbGUgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgIHZhbF9sZW46IExlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KLSAqICAgICAgICAgICAgICAgICAgcF92YWw6IFBvaW50ZXIgdG8gdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgdmFsdWUgZGF0YS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfU1VDQ0VTUyBpZiBzdWNlc3NmdWxseSBzZW50OyBvdGhlcndpc2UgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIEdBVFRTX0hhbmRsZVZhbHVlTm90aWZpY2F0aW9uKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmFsX2xlbiwgdWludDhfdCogcF92YWwpIHsKLSAgdEdBVFRfVkFMVUUgbm90aWY7Ci0gIHRHQVRUX0lGIGdhdHRfaWYgPSBHQVRUX0dFVF9HQVRUX0lGKGNvbm5faWQpOwotICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2dldF90Y2JfYnlfaWR4KHRjYl9pZHgpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKChwX3JlZyA9PSBOVUxMKSB8fCAocF90Y2IgPT0gTlVMTCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJVbmtub3duICBjb25uX2lkOiAiIDw8IGNvbm5faWQ7Ci0gICAgcmV0dXJuICh0R0FUVF9TVEFUVVMpR0FUVF9JTlZBTElEX0NPTk5fSUQ7Ci0gIH0KLQotICBpZiAoIUdBVFRfSEFORExFX0lTX1ZBTElEKGF0dHJfaGFuZGxlKSkgewotICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICB9Ci0KLSAgbWVtc2V0KCZub3RpZiwgMCwgc2l6ZW9mKG5vdGlmKSk7Ci0gIG5vdGlmLmhhbmRsZSA9IGF0dHJfaGFuZGxlOwotICBub3RpZi5sZW4gPSB2YWxfbGVuOwotICBtZW1jcHkobm90aWYudmFsdWUsIHBfdmFsLCB2YWxfbGVuKTsKLSAgbm90aWYuYXV0aF9yZXEgPSBHQVRUX0FVVEhfUkVRX05PTkU7Ci0KLSAgdEdBVFRfU1RBVFVTIGNtZF9zZW50OwotICB0R0FUVF9TUl9NU0cgZ2F0dF9zcl9tc2c7Ci0gIGdhdHRfc3JfbXNnLmF0dHJfdmFsdWUgPSBub3RpZjsKLQotICB1aW50MTZfdCBjaWQgPSBnYXR0X3RjYl9nZXRfYXR0X2NpZCgqcF90Y2IsIHBfcmVnLT5lYXR0X3N1cHBvcnQpOwotCi0gIEJUX0hEUiogcF9idWYgPQotICAgICAgYXR0cF9idWlsZF9zcl9tc2coKnBfdGNiLCBHQVRUX0hBTkRMRV9WQUxVRV9OT1RJRiwgJmdhdHRfc3JfbXNnKTsKLSAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICBjbWRfc2VudCA9IGF0dHBfc2VuZF9zcl9tc2coKnBfdGNiLCBjaWQsIHBfYnVmKTsKLSAgfSBlbHNlCi0gICAgY21kX3NlbnQgPSBHQVRUX05PX1JFU09VUkNFUzsKLSAgcmV0dXJuIGNtZF9zZW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVFNfU2VuZFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgc2VydmVyIHJlc3BvbnNlIHRvIGNsaWVudC4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgdHJhbnNfaWQ6IHRyYW5zYWN0aW9uIGlkCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Ugc3RhdHVzCi0gKiAgICAgICAgICAgICAgICAgIHBfbXNnOiBwb2ludGVyIHRvIG1lc3NhZ2UgcGFyYW1ldGVycyBzdHJ1Y3R1cmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgc3VjZXNzZnVsbHkgc2VudDsgb3RoZXJ3aXNlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBHQVRUU19TZW5kUnNwKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cywgdEdBVFRTX1JTUCogcF9tc2cpIHsKLSAgdEdBVFRfSUYgZ2F0dF9pZiA9IEdBVFRfR0VUX0dBVFRfSUYoY29ubl9pZCk7Ci0gIHVpbnQ4X3QgdGNiX2lkeCA9IEdBVFRfR0VUX1RDQl9JRFgoY29ubl9pZCk7Ci0gIHRHQVRUX1JFRyogcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZ2V0X3RjYl9ieV9pZHgodGNiX2lkeCk7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpCi0gICAgICAgICAgPDwgIiwgdHJhbnNfaWQ9IiA8PCBsb2doZXgodHJhbnNfaWQpCi0gICAgICAgICAgPDwgIiwgc3RhdHVzPSIgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0YXR1cykpOwotCi0gIGlmICgocF9yZWcgPT0gTlVMTCkgfHwgKHBfdGNiID09IE5VTEwpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biAgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gKHRHQVRUX1NUQVRVUylHQVRUX0lOVkFMSURfQ09OTl9JRDsKLSAgfQotCi0gIHRHQVRUX1NSX0NNRCogc3JfcmVzX3AgPSBnYXR0X3NyX2dldF9jbWRfYnlfdHJhbnNfaWQocF90Y2IsIHRyYW5zX2lkKTsKLQotICBpZiAoIXNyX3Jlc19wKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgICAgPDwgIiB3YWl0aW5nIGZvciBvdGhlciBvcF9jb2RlICI7Ci0gICAgcmV0dXJuIChHQVRUX1dST05HX1NUQVRFKTsKLSAgfQotCi0gIC8qIFByb2Nlc3MgQXBwIHJlc3BvbnNlICovCi0gIHJldHVybiBnYXR0X3NyX3Byb2Nlc3NfYXBwX3JzcCgqcF90Y2IsIGdhdHRfaWYsIHRyYW5zX2lkLCBzcl9yZXNfcC0+b3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcF9tc2csIHNyX3Jlc19wKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdBVFQgUHJvZmlsZSBTcnZyIEZ1bmN0aW9ucyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgIEdBVFQgQ0xJRU5UIEFQSXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUQ19Db25maWd1cmVNVFUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvbmZpZ3VyZSB0aGUgQVRUIE1UVSBzaXplLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICogICAgICAgICAgICAgICAgICBtdHUgICAgLSBhdHRyaWJ1dGUgTVRVIHNpemUuLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGNvbW1hbmQgc3RhcnRlZCBzdWNjZXNzZnVsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBHQVRUQ19Db25maWd1cmVNVFUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgbXR1KSB7Ci0gIHRHQVRUX0lGIGdhdHRfaWYgPSBHQVRUX0dFVF9HQVRUX0lGKGNvbm5faWQpOwotICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9nZXRfdGNiX2J5X2lkeCh0Y2JfaWR4KTsKLSAgdEdBVFRfUkVHKiBwX3JlZyA9IGdhdHRfZ2V0X3JlZ2NiKGdhdHRfaWYpOwotCi0gIGlmICgocF90Y2IgPT0gTlVMTCkgfHwgKHBfcmVnID09IE5VTEwpIHx8IChtdHUgPCBHQVRUX0RFRl9CTEVfTVRVX1NJWkUpIHx8Ci0gICAgICAobXR1ID4gR0FUVF9NQVhfTVRVX1NJWkUpKSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJVbmFibGUgdG8gY29uZmlndXJlIEFUVCBtdHUgc2l6ZSBpbGxlZ2FsIHBhcmFtZXRlciBjb25uX2lkOiVodSAiCi0gICAgICAgICJtdHU6JWh1IHRjYjolcyByZWc6JXMiLAotICAgICAgICBjb25uX2lkLCBtdHUsIChwX3RjYiA9PSBudWxscHRyKSA/ICJCQUQiIDogIm9rIiwKLSAgICAgICAgKHBfcmVnID09IG51bGxwdHIpID8gIkJBRCIgOiAib2siKTsKLSAgICByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgfQotCi0gIC8qIFZhbGlkYXRlIHRoYXQgdGhlIGxpbmsgaXMgQkxFLCBub3QgQlIvRURSICovCi0gIGlmIChwX3RjYi0+dHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIHJldHVybiBHQVRUX0VSUk9SOwotICB9Ci0KLSAgaWYgKGdhdHRfaXNfY2xjYl9hbGxvY2F0ZWQoY29ubl9pZCkpIHsKLSAgICBMT0dfV0FSTigiQ29ubmVjdGlvbiBpcyBhbHJlYWR5IHVzZWQgY29ubl9pZDolaHUiLCBjb25uX2lkKTsKLSAgICByZXR1cm4gR0FUVF9CVVNZOwotICB9Ci0KLSAgdEdBVFRfQ0xDQiogcF9jbGNiID0gZ2F0dF9jbGNiX2FsbG9jKGNvbm5faWQpOwotICBpZiAoIXBfY2xjYikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gYWxsb2NhdGUgY29ubmVjdGlvbiBsaW5rIGNvbnRyb2wgYmxvY2siKTsKLSAgICByZXR1cm4gR0FUVF9OT19SRVNPVVJDRVM7Ci0gIH0KLQotICAvKiBGb3IgdGhpcyByZXF1ZXN0IG9ubHkgQVRUIENJRCBpcyB2YWxpZCAqLwotICBwX2NsY2ItPmNpZCA9IEwyQ0FQX0FUVF9DSUQ7Ci0gIHBfY2xjYi0+cF90Y2ItPnBheWxvYWRfc2l6ZSA9IG10dTsKLSAgcF9jbGNiLT5vcGVyYXRpb24gPSBHQVRUQ19PUFRZUEVfQ09ORklHOwotICB0R0FUVF9DTF9NU0cgZ2F0dF9jbF9tc2c7Ci0gIGdhdHRfY2xfbXNnLm10dSA9IG10dTsKLSAgTE9HX0RFQlVHKCJDb25maWd1cmluZyBBVFQgbXR1IHNpemUgY29ubl9pZDolaHUgbXR1OiVodSIsIGNvbm5faWQsIG10dSk7Ci0KLSAgcmV0dXJuIGF0dHBfc2VuZF9jbF9tc2coKnBfY2xjYi0+cF90Y2IsIHBfY2xjYiwgR0FUVF9SRVFfTVRVLCAmZ2F0dF9jbF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVENfRGlzY292ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRvIGEgZGlzY292ZXJ5IHByb2NlZHVyZSBvbiBBVFQKLSAqICAgICAgICAgICAgICAgICAgc2VydmVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICogICAgICAgICAgICAgICAgICBkaXNjX3R5cGU6ZGlzY292ZXJ5IHR5cGUuCi0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSBhbmQgZW5kX2hhbmRsZTogcmFuZ2Ugb2YgaGFuZGxlcyBmb3IgZGlzY292ZXJ5Ci0gKiAgICAgICAgICAgICAgICAgIHV1aWQ6IHV1aWQgdG8gZGlzY292ZXJ5LiBzZXQgdG8gVXVpZDo6a0VtcHR5IGZvciByZXF1ZXN0cwotICogICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGRvbid0IG5lZWQgaXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfU1VDQ0VTUyBpZiBjb21tYW5kIHJlY2VpdmVkL3NlbnQgc3VjY2Vzc2Z1bGx5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9TVEFUVVMgR0FUVENfRGlzY292ZXIodWludDE2X3QgY29ubl9pZCwgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgdXVpZCkgewotICB0R0FUVF9JRiBnYXR0X2lmID0gR0FUVF9HRVRfR0FUVF9JRihjb25uX2lkKTsKLSAgdWludDhfdCB0Y2JfaWR4ID0gR0FUVF9HRVRfVENCX0lEWChjb25uX2lkKTsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZ2V0X3RjYl9ieV9pZHgodGNiX2lkeCk7Ci0gIHRHQVRUX1JFRyogcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLQotICBpZiAoKHBfdGNiID09IE5VTEwpIHx8IChwX3JlZyA9PSBOVUxMKSB8fCAoZGlzY190eXBlID49IEdBVFRfRElTQ19NQVgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIElsbGVnYWwgcGFyYW06IGRpc2NfdHlwZT0iIDw8ICtkaXNjX3R5cGUKLSAgICAgICAgICAgICAgIDw8ICIgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gR0FUVF9JTExFR0FMX1BBUkFNRVRFUjsKLSAgfQotCi0gIGlmICghR0FUVF9IQU5ETEVfSVNfVkFMSUQoc3RhcnRfaGFuZGxlKSB8fAotICAgICAgIUdBVFRfSEFORExFX0lTX1ZBTElEKGVuZF9oYW5kbGUpIHx8Ci0gICAgICAvKiBzZWFyY2ggYnkgdHlwZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgVVVJRCBwYXJhbSAqLwotICAgICAgKGRpc2NfdHlwZSA9PSBHQVRUX0RJU0NfU1JWQ19CWV9VVUlEICYmIHV1aWQuSXNFbXB0eSgpKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIElsbGVnYWwgcGFyYW1ldGVyIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCkKLSAgICAgICAgICAgICAgICAgPDwgIiwgZGlzY190eXBlPSIgPDwgK2Rpc2NfdHlwZQotICAgICAgICAgICAgICAgICA8PCAiLCBzX2hhbmRsZT0iIDw8IGxvZ2hleChzdGFydF9oYW5kbGUpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGVfaGFuZGxlPSIgPDwgbG9naGV4KGVuZF9oYW5kbGUpOwotICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICB9Ci0KLSAgaWYgKGdhdHRfaXNfY2xjYl9hbGxvY2F0ZWQoY29ubl9pZCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJHQVRUX0JVU1kgY29ubl9pZCA9ICIgPDwgK2Nvbm5faWQ7Ci0gICAgcmV0dXJuIEdBVFRfQlVTWTsKLSAgfQotCi0gIHRHQVRUX0NMQ0IqIHBfY2xjYiA9IGdhdHRfY2xjYl9hbGxvYyhjb25uX2lkKTsKLSAgaWYgKCFwX2NsY2IpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBObyByZXNvdXJjZXMgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgICAgICA8PCAiLCBkaXNjX3R5cGU9IiA8PCArZGlzY190eXBlCi0gICAgICAgICAgICAgICAgIDw8ICIsIHNfaGFuZGxlPSIgPDwgbG9naGV4KHN0YXJ0X2hhbmRsZSkKLSAgICAgICAgICAgICAgICAgPDwgIiwgZV9oYW5kbGU9IiA8PCBsb2doZXgoZW5kX2hhbmRsZSk7Ci0gICAgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgcF9jbGNiLT5vcGVyYXRpb24gPSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZOwotICBwX2NsY2ItPm9wX3N1YnR5cGUgPSBkaXNjX3R5cGU7Ci0gIHBfY2xjYi0+c19oYW5kbGUgPSBzdGFydF9oYW5kbGU7Ci0gIHBfY2xjYi0+ZV9oYW5kbGUgPSBlbmRfaGFuZGxlOwotICBwX2NsY2ItPnV1aWQgPSB1dWlkOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCkKLSAgICAgICAgICAgIDw8ICIsIGRpc2NfdHlwZT0iIDw8ICtkaXNjX3R5cGUKLSAgICAgICAgICAgIDw8ICIsIHNfaGFuZGxlPSIgPDwgbG9naGV4KHN0YXJ0X2hhbmRsZSkKLSAgICAgICAgICAgIDw8ICIsIGVfaGFuZGxlPSIgPDwgbG9naGV4KGVuZF9oYW5kbGUpOwotCi0gIGdhdHRfYWN0X2Rpc2NvdmVyeShwX2NsY2IpOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi10R0FUVF9TVEFUVVMgR0FUVENfRGlzY292ZXIodWludDE2X3QgY29ubl9pZCwgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUpIHsKLSAgcmV0dXJuIEdBVFRDX0Rpc2NvdmVyKGNvbm5faWQsIGRpc2NfdHlwZSwgc3RhcnRfaGFuZGxlLCBlbmRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgVXVpZDo6a0VtcHR5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRDX1JlYWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZQotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzZXJ2ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIGlkZW50aWZpZXIuCi0gKiAgICAgICAgICAgICAgICAgIHR5cGUgICAgLSBhdHRyaWJ1dGUgcmVhZCB0eXBlLgotICogICAgICAgICAgICAgICAgICBwX3JlYWQgIC0gcmVhZCBvcGVyYXRpb24gcGFyYW1ldGVycy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfU1VDQ0VTUyBpZiBjb21tYW5kIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9TVEFUVVMgR0FUVENfUmVhZCh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9SRUFEX1RZUEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1JFQURfUEFSQU0qIHBfcmVhZCkgewotICB0R0FUVF9JRiBnYXR0X2lmID0gR0FUVF9HRVRfR0FUVF9JRihjb25uX2lkKTsKLSAgdWludDhfdCB0Y2JfaWR4ID0gR0FUVF9HRVRfVENCX0lEWChjb25uX2lkKTsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZ2V0X3RjYl9ieV9pZHgodGNiX2lkeCk7Ci0gIHRHQVRUX1JFRyogcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCkKLSAgICAgICAgICA8PCAiLCB0eXBlPSIgPDwgbG9naGV4KHR5cGUpOwotCi0gIGlmICgocF90Y2IgPT0gTlVMTCkgfHwgKHBfcmVnID09IE5VTEwpIHx8IChwX3JlYWQgPT0gTlVMTCkgfHwKLSAgICAgICgodHlwZSA+PSBHQVRUX1JFQURfTUFYKSB8fCAodHlwZSA9PSAwKSkpIHsKLSAgICBMT0coRVJST1IpIDw8ICI6IGlsbGVnYWwgcGFyYW06IGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCkKLSAgICAgICAgICAgICAgIDw8ICJ0eXBlPSIgPDwgbG9naGV4KHR5cGUpOwotICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICB9Ci0KLSAgaWYgKGdhdHRfaXNfY2xjYl9hbGxvY2F0ZWQoY29ubl9pZCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJHQVRUX0JVU1kgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gR0FUVF9CVVNZOwotICB9Ci0KLSAgdEdBVFRfQ0xDQiogcF9jbGNiID0gZ2F0dF9jbGNiX2FsbG9jKGNvbm5faWQpOwotICBpZiAoIXBfY2xjYikgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotCi0gIHBfY2xjYi0+b3BlcmF0aW9uID0gR0FUVENfT1BUWVBFX1JFQUQ7Ci0gIHBfY2xjYi0+b3Bfc3VidHlwZSA9IHR5cGU7Ci0gIHBfY2xjYi0+YXV0aF9yZXEgPSBwX3JlYWQtPmJ5X2hhbmRsZS5hdXRoX3JlcTsKLSAgcF9jbGNiLT5jb3VudGVyID0gMDsKLSAgcF9jbGNiLT5yZWFkX3JlcV9jdXJyZW50X210dSA9Ci0gICAgICBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3R4KCpwX3RjYiwgcF9jbGNiLT5jaWQpOwotCi0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0FUVF9SRUFEX0JZX1RZUEU6Ci0gICAgY2FzZSBHQVRUX1JFQURfQ0hBUl9WQUxVRToKLSAgICAgIHBfY2xjYi0+c19oYW5kbGUgPSBwX3JlYWQtPnNlcnZpY2Uuc19oYW5kbGU7Ci0gICAgICBwX2NsY2ItPmVfaGFuZGxlID0gcF9yZWFkLT5zZXJ2aWNlLmVfaGFuZGxlOwotICAgICAgcF9jbGNiLT51dWlkID0gcF9yZWFkLT5zZXJ2aWNlLnV1aWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdBVFRfUkVBRF9NVUxUSVBMRTogewotICAgICAgcF9jbGNiLT5zX2hhbmRsZSA9IDA7Ci0gICAgICAvKiBjb3B5IG11bHRpcGxlIGhhbmRsZXMgaW4gQ0IgKi8KLSAgICAgIHRHQVRUX1JFQURfTVVMVEkqIHBfcmVhZF9tdWx0aSA9Ci0gICAgICAgICAgKHRHQVRUX1JFQURfTVVMVEkqKW9zaV9tYWxsb2Moc2l6ZW9mKHRHQVRUX1JFQURfTVVMVEkpKTsKLSAgICAgIHBfY2xjYi0+cF9hdHRyX2J1ZiA9ICh1aW50OF90KilwX3JlYWRfbXVsdGk7Ci0gICAgICBtZW1jcHkocF9yZWFkX211bHRpLCAmcF9yZWFkLT5yZWFkX211bHRpcGxlLCBzaXplb2YodEdBVFRfUkVBRF9NVUxUSSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgR0FUVF9SRUFEX0JZX0hBTkRMRToKLSAgICBjYXNlIEdBVFRfUkVBRF9QQVJUSUFMOgotICAgICAgcF9jbGNiLT51dWlkID0gVXVpZDo6a0VtcHR5OwotICAgICAgcF9jbGNiLT5zX2hhbmRsZSA9IHBfcmVhZC0+YnlfaGFuZGxlLmhhbmRsZTsKLQotICAgICAgaWYgKHR5cGUgPT0gR0FUVF9SRUFEX1BBUlRJQUwpIHsKLSAgICAgICAgcF9jbGNiLT5jb3VudGVyID0gcF9yZWFkLT5wYXJ0aWFsLm9mZnNldDsKLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc3RhcnQgc2VjdXJpdHkgY2hlY2sgKi8KLSAgaWYgKGdhdHRfc2VjdXJpdHlfY2hlY2tfc3RhcnQocF9jbGNiKSkgcF90Y2ItPnBlbmRpbmdfZW5jX2NsY2IucHVzaChwX2NsY2IpOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVENfV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHdyaXRlIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgdHlwZSAgICAtIGF0dHJpYnV0ZSB3cml0ZSB0eXBlLgotICogICAgICAgICAgICAgICAgICBwX3dyaXRlICAtIHdyaXRlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGNvbW1hbmQgc3RhcnRlZCBzdWNjZXNzZnVsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBHQVRUQ19Xcml0ZSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9XUklURV9UWVBFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfVkFMVUUqIHBfd3JpdGUpIHsKLSAgdEdBVFRfSUYgZ2F0dF9pZiA9IEdBVFRfR0VUX0dBVFRfSUYoY29ubl9pZCk7Ci0gIHVpbnQ4X3QgdGNiX2lkeCA9IEdBVFRfR0VUX1RDQl9JRFgoY29ubl9pZCk7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2dldF90Y2JfYnlfaWR4KHRjYl9pZHgpOwotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0KLSAgaWYgKChwX3RjYiA9PSBOVUxMKSB8fCAocF9yZWcgPT0gTlVMTCkgfHwgKHBfd3JpdGUgPT0gTlVMTCkgfHwKLSAgICAgICgodHlwZSAhPSBHQVRUX1dSSVRFKSAmJiAodHlwZSAhPSBHQVRUX1dSSVRFX1BSRVBBUkUpICYmCi0gICAgICAgKHR5cGUgIT0gR0FUVF9XUklURV9OT19SU1ApKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBJbGxlZ2FsIHBhcmFtOiBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpCi0gICAgICAgICAgICAgICA8PCAiLCB0eXBlPSIgPDwgbG9naGV4KHR5cGUpOwotICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICB9Ci0KLSAgaWYgKGdhdHRfaXNfY2xjYl9hbGxvY2F0ZWQoY29ubl9pZCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJHQVRUX0JVU1kgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gR0FUVF9CVVNZOwotICB9Ci0KLSAgdEdBVFRfQ0xDQiogcF9jbGNiID0gZ2F0dF9jbGNiX2FsbG9jKGNvbm5faWQpOwotICBpZiAoIXBfY2xjYikgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotCi0gIHBfY2xjYi0+b3BlcmF0aW9uID0gR0FUVENfT1BUWVBFX1dSSVRFOwotICBwX2NsY2ItPm9wX3N1YnR5cGUgPSB0eXBlOwotICBwX2NsY2ItPmF1dGhfcmVxID0gcF93cml0ZS0+YXV0aF9yZXE7Ci0KLSAgcF9jbGNiLT5wX2F0dHJfYnVmID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2Moc2l6ZW9mKHRHQVRUX1ZBTFVFKSk7Ci0gIG1lbWNweShwX2NsY2ItPnBfYXR0cl9idWYsICh2b2lkKilwX3dyaXRlLCBzaXplb2YodEdBVFRfVkFMVUUpKTsKLQotICB0R0FUVF9WQUxVRSogcCA9ICh0R0FUVF9WQUxVRSopcF9jbGNiLT5wX2F0dHJfYnVmOwotICBpZiAodHlwZSA9PSBHQVRUX1dSSVRFX1BSRVBBUkUpIHsKLSAgICBwX2NsY2ItPnN0YXJ0X29mZnNldCA9IHBfd3JpdGUtPm9mZnNldDsKLSAgICBwLT5vZmZzZXQgPSAwOwotICB9Ci0KLSAgaWYgKGdhdHRfc2VjdXJpdHlfY2hlY2tfc3RhcnQocF9jbGNiKSkgcF90Y2ItPnBlbmRpbmdfZW5jX2NsY2IucHVzaChwX2NsY2IpOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVENfRXhlY3V0ZVdyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGFuIEV4ZWN1dGUgd3JpdGUgcmVxdWVzdCB0bwotICogICAgICAgICAgICAgICAgICB0aGUgc2VydmVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICogICAgICAgICAgICAgICAgICBpc19leGVjdXRlIC0gdG8gZXhlY3V0ZSBvciBjYW5jZWwgdGhlIHByZXBhcmVkIHdyaXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KHMpCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgY29tbWFuZCBzdGFydGVkIHN1Y2Nlc3NmdWxseS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIEdBVFRDX0V4ZWN1dGVXcml0ZSh1aW50MTZfdCBjb25uX2lkLCBib29sIGlzX2V4ZWN1dGUpIHsKLSAgdEdBVFRfSUYgZ2F0dF9pZiA9IEdBVFRfR0VUX0dBVFRfSUYoY29ubl9pZCk7Ci0gIHVpbnQ4X3QgdGNiX2lkeCA9IEdBVFRfR0VUX1RDQl9JRFgoY29ubl9pZCk7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2dldF90Y2JfYnlfaWR4KHRjYl9pZHgpOwotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpCi0gICAgICAgICAgPDwgIiwgaXNfZXhlY3V0ZT0iIDw8ICtpc19leGVjdXRlOwotCi0gIGlmICgocF90Y2IgPT0gTlVMTCkgfHwgKHBfcmVnID09IE5VTEwpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiIElsbGVnYWwgcGFyYW06IGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gICAgcmV0dXJuIEdBVFRfSUxMRUdBTF9QQVJBTUVURVI7Ci0gIH0KLQotICBpZiAoZ2F0dF9pc19jbGNiX2FsbG9jYXRlZChjb25uX2lkKSkgewotICAgIExPRyhFUlJPUikgPDwgIiBHQVRUX0JVU1kgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gR0FUVF9CVVNZOwotICB9Ci0KLSAgdEdBVFRfQ0xDQiogcF9jbGNiID0gZ2F0dF9jbGNiX2FsbG9jKGNvbm5faWQpOwotICBpZiAoIXBfY2xjYikgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotCi0gIHBfY2xjYi0+b3BlcmF0aW9uID0gR0FUVENfT1BUWVBFX0VYRV9XUklURTsKLSAgdEdBVFRfRVhFQ19GTEFHIGZsYWcgPQotICAgICAgaXNfZXhlY3V0ZSA/IEdBVFRfUFJFUF9XUklURV9FWEVDIDogR0FUVF9QUkVQX1dSSVRFX0NBTkNFTDsKLSAgZ2F0dF9zZW5kX3F1ZXVlX3dyaXRlX2NhbmNlbCgqcF9jbGNiLT5wX3RjYiwgcF9jbGNiLCBmbGFnKTsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRDX1NlbmRIYW5kbGVWYWx1ZUNvbmZpcm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYSBoYW5kbGUgdmFsdWUgY29uZmlybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGFzIHJlc3BvbnNlIHRvIGEgaGFuZGxlIHZhbHVlIG5vdGlmaWNhdGlvbiBmcm9tIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgY2lkOiBjaGFubmVsIGlkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGNvbW1hbmQgc3RhcnRlZCBzdWNjZXNzZnVsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGNpZCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgIDw8ICIsIGNpZD0iIDw8IGxvZ2hleChjaWQpOwotCi0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2dldF90Y2JfYnlfaWR4KEdBVFRfR0VUX1RDQl9JRFgoY29ubl9pZCkpOwotICBpZiAoIXBfdGNiKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotICAgIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotICB9Ci0KLSAgaWYgKHBfdGNiLT5pbmRfY291bnQgPT0gMCkgewotICAgIFZMT0coMSkgPDwgIiBjb25uX2lkOiAiIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgPDwgIiBpZ25vcmVkIG5vdCB3YWl0aW5nIGZvciBpbmRpY2FpdG9uIGFjayI7Ci0gICAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLSAgfQotCi0gIGdhdHRfc3RvcF9pbmRfYWNrX3RpbWVyKHBfdGNiLCBjaWQpOwotCi0gIFZMT0coMSkgPDwgIm5vdGlmX2NvdW50PSAiIDw8IHBfdGNiLT5pbmRfY291bnQ7Ci0gIC8qIHNlbmQgY29uZmlybWF0aW9uIG5vdyAqLwotICB0R0FUVF9TVEFUVVMgcmV0ID0gYXR0cF9zZW5kX2NsX2NvbmZpcm1hdGlvbl9tc2coKnBfdGNiLCBjaWQpOwotCi0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgR0FUVCAgQVBJcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX1NldElkbGVUaW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIChjb21tb24gdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlcikgc2V0cyB0aGUKLSAqICAgICAgICAgICAgICAgICAgaWRsZSB0aW1lb3V0IGZvciBhIHRhbnNwb3J0IGNvbm5lY3Rpb24KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGJkX2FkZHI6ICAgdGFyZ2V0IGRldmljZSBiZCBhZGRyZXNzLgotICogICAgICAgICAgICAgICAgICBpZGxlX3RvdXQ6IHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBHQVRUX1NldElkbGVUaW1lb3V0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGlkbGVfdG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBib29sIHN0YXR1cyA9IGZhbHNlOwotCi0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfdGNiICE9IE5VTEwpIHsKLSAgICBzdGF0dXMgPSBMMkNBX1NldExlR2F0dFRpbWVvdXQoYmRfYWRkciwgaWRsZV90b3V0KTsKLQotICAgIGlmIChpZGxlX3RvdXQgPT0gR0FUVF9MSU5LX0lETEVfVElNRU9VVF9XSEVOX05PX0FQUCkKLSAgICAgIEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcigKLSAgICAgICAgICBwX3RjYi0+cGVlcl9iZGEsIEdBVFRfTElOS19JRExFX1RJTUVPVVRfV0hFTl9OT19BUFAsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIH0KLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgaWRsZV90b3V0PSIgPDwgaWRsZV90b3V0IDw8ICIsIHN0YXR1cz0iIDw8ICtzdGF0dXMKLSAgICAgICAgICA8PCAiICgxLU9LIDAtbm90IHBlcmZvcm1lZCkiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVF9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYW4gIGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggR0FUVAotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF9hcHBfdXVpZDEyODogQXBwbGljYXRpb24gVVVJRAotICogICAgICAgICAgICAgICAgICBwX2NiX2luZm86IGNhbGxiYWNrIGZ1bmN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgZWF0dF9zdXBwb3J0OiBpbmRpY2F0ZSBlYXR0IHN1cHBvcnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICAwIGZvciBlcnJvciwgb3RoZXJ3aXNlIHRoZSBpbmRleCBvZiB0aGUgY2xpZW50IHJlZ2lzdGVyZWQKLSAqICAgICAgICAgICAgICAgICAgd2l0aCBHQVRUCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX0lGIEdBVFRfUmVnaXN0ZXIoY29uc3QgVXVpZCYgYXBwX3V1aWQxMjgsIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NCQUNLKiBwX2NiX2luZm8sIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIHRHQVRUX1JFRyogcF9yZWc7Ci0gIHVpbnQ4X3QgaV9nYXR0X2lmID0gMDsKLSAgdEdBVFRfSUYgZ2F0dF9pZiA9IDA7Ci0KLSAgZm9yIChpX2dhdHRfaWYgPSAwLCBwX3JlZyA9IGdhdHRfY2IuY2xfcmNiOyBpX2dhdHRfaWYgPCBHQVRUX01BWF9BUFBTOwotICAgICAgIGlfZ2F0dF9pZisrLCBwX3JlZysrKSB7Ci0gICAgaWYgKHBfcmVnLT5pbl91c2UgJiYgcF9yZWctPmFwcF91dWlkMTI4ID09IGFwcF91dWlkMTI4KSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEFwcGxpY2F0aW9uIGFscmVhZHkgcmVnaXN0ZXJlZCAiCi0gICAgICAgICAgICAgICAgIDw8IGFwcF91dWlkMTI4OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpX2dhdHRfaWYgPSAwLCBwX3JlZyA9IGdhdHRfY2IuY2xfcmNiOyBpX2dhdHRfaWYgPCBHQVRUX01BWF9BUFBTOwotICAgICAgIGlfZ2F0dF9pZisrLCBwX3JlZysrKSB7Ci0gICAgaWYgKCFwX3JlZy0+aW5fdXNlKSB7Ci0gICAgICAqcF9yZWcgPSB7fTsKLSAgICAgIGlfZ2F0dF9pZisrOyAvKiBvbmUgYmFzZWQgbnVtYmVyICovCi0gICAgICBwX3JlZy0+YXBwX3V1aWQxMjggPSBhcHBfdXVpZDEyODsKLSAgICAgIGdhdHRfaWYgPSBwX3JlZy0+Z2F0dF9pZiA9ICh0R0FUVF9JRilpX2dhdHRfaWY7Ci0gICAgICBwX3JlZy0+YXBwX2NiID0gKnBfY2JfaW5mbzsKLSAgICAgIHBfcmVnLT5pbl91c2UgPSB0cnVlOwotICAgICAgcF9yZWctPmVhdHRfc3VwcG9ydCA9IGVhdHRfc3VwcG9ydDsKLSAgICAgIHBfcmVnLT5uYW1lID0gbmFtZTsKLSAgICAgIExPR19JTkZPKCJBbGxvY2F0ZWQgbmFtZTolcyB1dWlkOiVzIGdhdHRfaWY6JWhodSBlYXR0X3N1cHBvcnQ6JXUiLAotICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBhcHBfdXVpZDEyOC5Ub1N0cmluZygpLmNfc3RyKCksIGdhdHRfaWYsCi0gICAgICAgICAgICAgICBlYXR0X3N1cHBvcnQpOwotICAgICAgcmV0dXJuIGdhdHRfaWY7Ci0gICAgfQotICB9Ci0KLSAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgIDw8ICI6IFVuYWJsZSB0byByZWdpc3RlciBHQVRUIGNsaWVudCwgTUFYIGNsaWVudCByZWFjaGVkOiAiCi0gICAgICAgICAgICAgPDwgR0FUVF9NQVhfQVBQUzsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX0RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGVyZWdpc3RlcmVkIHRoZSBhcHBsaWNhdGlvbiBmcm9tIEdBVFQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBnYXR0X2lmOiBhcHBsaWNhaXRvbiBpbnRlcmZhY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEdBVFRfRGVyZWdpc3Rlcih0R0FUVF9JRiBnYXR0X2lmKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGdhdHRfaWY9IiA8PCArZ2F0dF9pZjsKLQotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0gIC8qIEluZGV4IDAgaXMgR0FQIGFuZCBpcyBuZXZlciBkZXJlZ2lzdGVyZWQgKi8KLSAgaWYgKChnYXR0X2lmID09IDApIHx8IChwX3JlZyA9PSBOVUxMKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IFVuYWJsZSB0byBkZXJlZ2lzdGVyIGNsaWVudCB3aXRoIGludmFsaWQgZ2F0dF9pZj0iCi0gICAgICAgICAgICAgICA8PCArZ2F0dF9pZjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBzdG9wIGFsbCBzZXJ2aWNlcyAgKi8KLSAgLyogdG9kbyBhbiBhcHBsY2FpdG9uIGNhbiBub3QgYmUgZGVyZWdpc3RlcmVkIGlmIGl0cyBzZXJ2aWNlcyBpcyBhbHNvIHVzZWQgYnkKLSAgICBvdGhlciBhcHBsaWNhdGlvbgotICAgIGRlcmVnaXN0ZXJhdGlvbiBuZWVkIHRvIGJlZCBwZXJmb3JtZWQgaW4gYW4gb3JkZXJseSBmYXNoaW9uCi0gICAgbm8gY2hlY2sgZm9yIG5vdyAqLwotICBmb3IgKGF1dG8gaXQgPSBnYXR0X2NiLnNydl9saXN0X2luZm8tPmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gZ2F0dF9jYi5zcnZfbGlzdF9pbmZvLT5lbmQoKTspIHsKLSAgICBpZiAoaXQtPmdhdHRfaWYgPT0gZ2F0dF9pZikgewotICAgICAgR0FUVFNfU3RvcFNlcnZpY2UoaXQrKy0+c19oZGwpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK2l0OwotICAgIH0KLSAgfQotCi0gIC8qIGZyZWUgYWxsIHNlcnZpY2VzIGRiIGJ1ZmZlcnMgaWYgb3duZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiAqLwotICBnYXR0X2ZyZWVfc3J2Y19kYl9idWZmZXJfYXBwX2lkKHBfcmVnLT5hcHBfdXVpZDEyOCk7Ci0KLSAgLyogV2hlbiBhbiBhcHBsaWNhdGlvbiBkZXJlZ2lzdGVycywgY2hlY2sgcmVtb3ZlIHRoZSBsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICogYXBwICovCi0gIHRHQVRUX1RDQiogcF90Y2I7Ci0gIGludCBpLCBqOwotICBmb3IgKGkgPSAwLCBwX3RjYiA9IGdhdHRfY2IudGNiOyBpIDwgR0FUVF9NQVhfUEhZX0NIQU5ORUw7IGkrKywgcF90Y2IrKykgewotICAgIGlmICghcF90Y2ItPmluX3VzZSkgY29udGludWU7Ci0KLSAgICBpZiAoZ2F0dF9nZXRfY2hfc3RhdGUocF90Y2IpICE9IEdBVFRfQ0hfQ0xPU0UpIHsKLSAgICAgIGdhdHRfdXBkYXRlX2FwcF91c2VfbGlua19mbGFnKGdhdHRfaWYsIHBfdGNiLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgdEdBVFRfQ0xDQiogcF9jbGNiOwotICAgIGZvciAoaiA9IDAsIHBfY2xjYiA9ICZnYXR0X2NiLmNsY2Jbal07IGogPCBHQVRUX0NMX01BWF9MQ0I7IGorKywgcF9jbGNiKyspIHsKLSAgICAgIGlmIChwX2NsY2ItPmluX3VzZSAmJiAocF9jbGNiLT5wX3JlZy0+Z2F0dF9pZiA9PSBnYXR0X2lmKSAmJgotICAgICAgICAgIChwX2NsY2ItPnBfdGNiLT50Y2JfaWR4ID09IHBfdGNiLT50Y2JfaWR4KSkgewotICAgICAgICBhbGFybV9jYW5jZWwocF9jbGNiLT5nYXR0X3JzcF90aW1lcl9lbnQpOwotICAgICAgICBnYXR0X2NsY2JfZGVhbGxvYyhwX2NsY2IpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjb25uZWN0aW9uX21hbmFnZXI6Om9uX2FwcF9kZXJlZ2lzdGVyZWQoZ2F0dF9pZik7Ci0KLSAgKnBfcmVnID0ge307Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX1N0YXJ0SWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHJlZ2lzdHJhdGlvbiB0byBzdGFydAotICogICAgICAgICAgICAgICAgICByZWNlaXZpbmcgY2FsbGJhY2tzIGZvciByZWdpc3RlcmVkIGludGVyZmFjZS4gIEZ1bmN0aW9uIG1heQotICogICAgICAgICAgICAgICAgICBjYWxsIGJhY2sgd2l0aCBjb25uZWN0aW9uIHN0YXR1cyBhbmQgcXVldWVkIG5vdGlmaWNhdGlvbnMKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGdhdHRfaWY6IGFwcGxpY2FpdG9uIGludGVyZmFjZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgR0FUVF9TdGFydElmKHRHQVRUX0lGIGdhdHRfaWYpIHsKLSAgdEdBVFRfUkVHKiBwX3JlZzsKLSAgdEdBVFRfVENCKiBwX3RjYjsKLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIHVpbnQ4X3Qgc3RhcnRfaWR4LCBmb3VuZF9pZHg7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotCi0gIExPR19ERUJVRygiU3RhcnRpbmcgR0FUVCBpbnRlcmZhY2UgZ2F0dF9pZl86JWh1IiwgZ2F0dF9pZik7Ci0KLSAgcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLSAgaWYgKHBfcmVnICE9IE5VTEwpIHsKLSAgICBzdGFydF9pZHggPSAwOwotICAgIHdoaWxlICgKLSAgICAgICAgZ2F0dF9maW5kX3RoZV9jb25uZWN0ZWRfYmRhKHN0YXJ0X2lkeCwgYmRhLCAmZm91bmRfaWR4LCAmdHJhbnNwb3J0KSkgewotICAgICAgcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoYmRhLCB0cmFuc3BvcnQpOwotICAgICAgaWYgKHBfcmVnLT5hcHBfY2IucF9jb25uX2NiICYmIHBfdGNiKSB7Ci0gICAgICAgIGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHBfdGNiLT50Y2JfaWR4LCBnYXR0X2lmKTsKLSAgICAgICAgKCpwX3JlZy0+YXBwX2NiLnBfY29ubl9jYikoZ2F0dF9pZiwgYmRhLCBjb25uX2lkLCB0cnVlLCBHQVRUX0NPTk5fT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Ci0gICAgICB9Ci0gICAgICBzdGFydF9pZHggPSArK2ZvdW5kX2lkeDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZSBhIGNvbm5lY3R0aW9uIHRvIGEgcmVtb3RlIGRldmljZSBvbgotICogICAgICAgICAgICAgICAgICBHQVRUIGNoYW5uZWwuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBnYXR0X2lmOiBhcHBsaWNhaXRvbiBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgYmRfYWRkcjogcGVlciBkZXZpY2UgYWRkcmVzcy4KLSAqICAgICAgICAgICAgICAgICAgaXNfZGlyZWN0OiBpcyBhIGRpcmVjdCBjb25lbmVjdGlvbiBvciBhIGJhY2tncm91bmQgYXV0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgY29ubmVjdGlvbiBzdGFydGVkOyBmYWxzZSBpZiBjb25uZWN0aW9uIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgR0FUVF9Db25uZWN0KHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgb3Bwb3J0dW5pc3RpYykgewotICB1aW50OF90IHBoeSA9IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfbGVfYWxsX2luaXRpYXRpbmdfcGh5cygpOwotICByZXR1cm4gR0FUVF9Db25uZWN0KGdhdHRfaWYsIGJkX2FkZHIsIGlzX2RpcmVjdCwgdHJhbnNwb3J0LCBvcHBvcnR1bmlzdGljLAotICAgICAgICAgICAgICAgICAgICAgIHBoeSk7Ci19Ci0KLWJvb2wgR0FUVF9Db25uZWN0KHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfZGlyZWN0LAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgb3Bwb3J0dW5pc3RpYywKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7Ci0gIC8qIE1ha2Ugc3VyZSBhcHAgaXMgcmVnaXN0ZXJlZCAqLwotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0gIGlmICghcF9yZWcpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBVbmFibGUgdG8gZmluZCByZWdpc3RlcmVkIGFwcCBnYXR0X2lmPSIgPDwgK2dhdHRfaWY7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFpc19kaXJlY3QgJiYgdHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IFVuc3VwcG9ydGVkIHRyYW5zcG9ydCBmb3IgYmFja2dyb3VuZCBjb25uZWN0aW9uIGdhdHRfaWY9IgotICAgICAgICAgICAgICAgPDwgK2dhdHRfaWY7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG9wcG9ydHVuaXN0aWMpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgPDwgIjogUmVnaXN0ZXJlZCBmb3Igb3Bwb3J0dW5pc3RpYyBjb25uZWN0aW9uIGdhdHRfaWY9IgotICAgICAgICAgICAgICA8PCArZ2F0dF9pZjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgcmV0OwotICBpZiAoaXNfZGlyZWN0KSB7Ci0gICAgTE9HX0RFQlVHKCJTdGFydGluZyBkaXJlY3QgY29ubmVjdCBnYXR0X2lmPSV1IGFkZHJlc3M9JXMiLCBnYXR0X2lmLAotICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0ID0gZ2F0dF9hY3RfY29ubmVjdChwX3JlZywgYmRfYWRkciwgdHJhbnNwb3J0LCBpbml0aWF0aW5nX3BoeXMpOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiU3RhcnRpbmcgYmFja2dyb3VuZCBjb25uZWN0IGdhdHRfaWY9JXUgYWRkcmVzcz0lcyIsIGdhdHRfaWYsCi0gICAgICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBpZiAoIUJUTV9CYWNrZ3JvdW5kQ29ubmVjdEFkZHJlc3NLbm93bihiZF9hZGRyKSkgewotICAgICAgLy8gIFJQQSBjYW4gcm90YXRlLCBjYXVzaW5nIGFkZHJlc3MgdG8gImV4cGlyZSIgaW4gdGhlIGJhY2tncm91bmQKLSAgICAgIC8vICBjb25uZWN0aW9uIGxpc3QuIFJQQSBpcyBhbGxvd2VkIGZvciBkaXJlY3QgY29ubmVjdCwgYXMgc3VjaCByZXF1ZXN0Ci0gICAgICAvLyAgdGltZXMgb3V0IGFmdGVyIDMwIHNlY29uZHMKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgIDw8ICI6IFVuYWJsZSB0byBhZGQgUlBBIHRvIGJhY2tncm91bmQgY29ubmVjdGlvbiBnYXR0X2lmPSIKLSAgICAgICAgICAgICAgICA8PCArZ2F0dF9pZjsKLSAgICAgIHJldCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19ERUJVRygiQWRkaW5nIHRvIGFjY2VwdGxpc3QgZGV2aWNlOiVzIiwgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpKTsKLSAgICAgIHJldCA9IGNvbm5lY3Rpb25fbWFuYWdlcjo6YmFja2dyb3VuZF9jb25uZWN0X2FkZChnYXR0X2lmLCBiZF9hZGRyKTsKLSAgICB9Ci0gIH0KLQotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9hZGRyKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIC8vIGJhY2tncm91bmQgY29ubmVjdGlvbnMgZG9uJ3QgbmVjZXNzYXJpbHkgY3JlYXRlIHRjYgotICBpZiAocF90Y2IgJiYgcmV0KQotICAgIGdhdHRfdXBkYXRlX2FwcF91c2VfbGlua19mbGFnKHBfcmVnLT5nYXR0X2lmLCBwX3RjYiwgdHJ1ZSwgIWlzX2RpcmVjdCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfQ2FuY2VsQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaW5pdGFpdGlvbiB0byBhCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBkZXZpY2Ugb24gR0FUVCBjaGFubmVsLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgZ2F0dF9pZjogY2xpZW50IGludGVyZmFjZS4gSWYgMCB1c2VkIGFzIHVuY29uZGl0aW9uYWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0LCB0eXBpY2FsbHkgdXNlZCBmb3IgZGlyZWN0IGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uLgotICogICAgICAgICAgICAgICAgICBiZF9hZGRyOiBwZWVyIGRldmljZSBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzdGFydGVkOyBmYWxzZSBvdGhlcndpc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgR0FUVF9DYW5jZWxDb25uZWN0KHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCkgewotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZ2F0dF9pZjoiIDw8ICtnYXR0X2lmIDw8ICIsIGFkZHJlc3M6ICIgPDwgYmRfYWRkcgotICAgICAgICAgICAgPDwgIiwgZGlyZWN0OiIgPDwgaXNfZGlyZWN0OwotCi0gIHRHQVRUX1JFRyogcF9yZWc7Ci0gIGlmIChnYXR0X2lmKSB7Ci0gICAgcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLSAgICBpZiAoIXBfcmVnKSB7Ci0gICAgICBMT0coRVJST1IpIDw8ICJnYXR0X2lmPSIgPDwgK2dhdHRfaWYgPDwgIiBpcyBub3QgcmVnaXN0ZXJlZCI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGlzX2RpcmVjdCkKLSAgICAgIHJldHVybiBnYXR0X2NhbmNlbF9vcGVuKGdhdHRfaWYsIGJkX2FkZHIpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnYXR0X2F1dG9fY29ubmVjdF9kZXZfcmVtb3ZlKHBfcmVnLT5nYXR0X2lmLCBiZF9hZGRyKTsKLSAgfQotCi0gIFZMT0coMSkgPDwgIiB1bmNvbmRpdGlvbmFsIjsKLQotICAvKiBvbmx5IExFIGNvbm5lY3Rpb24gY2FuIGJlIGNhbmNlbGxlZCAqLwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9hZGRyKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmIChwX3RjYiAmJiAhcF90Y2ItPmFwcF9ob2xkX2xpbmsuZW1wdHkoKSkgewotICAgIGZvciAoYXV0byBpdCA9IHBfdGNiLT5hcHBfaG9sZF9saW5rLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBwX3RjYi0+YXBwX2hvbGRfbGluay5lbmQoKTspIHsKLSAgICAgIGF1dG8gbmV4dCA9IHN0ZDo6bmV4dChpdCk7Ci0gICAgICAvLyBnYXR0X2NhbmNlbF9vcGVuIG1vZGlmaWVzIHRoZSBhcHBfaG9sZF9saW5rLgotICAgICAgZ2F0dF9jYW5jZWxfb3BlbigqaXQsIGJkX2FkZHIpOwotCi0gICAgICBpdCA9IG5leHQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFjb25uZWN0aW9uX21hbmFnZXI6OnJlbW92ZV91bmNvbmRpdGlvbmFsKGJkX2FkZHIpKSB7Ci0gICAgTE9HKEVSUk9SKQotICAgICAgICA8PCBfX2Z1bmNfXwotICAgICAgICA8PCAiOiBubyBhcHAgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZyBkZXZpY2UgZm9yIHVuY29uZGl0aW9uYWwgcmVtb3ZhbCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX0Rpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGlzY29ubmVjdHMgdGhlIEdBVFQgY2hhbm5lbCBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGRpc2Nvbm5lY3RlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIEdBVFRfRGlzY29ubmVjdCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0KLSAgdWludDhfdCB0Y2JfaWR4ID0gR0FUVF9HRVRfVENCX0lEWChjb25uX2lkKTsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZ2V0X3RjYl9ieV9pZHgodGNiX2lkeCk7Ci0gIGlmICghcF90Y2IpIHJldHVybiBHQVRUX0lMTEVHQUxfUEFSQU1FVEVSOwotCi0gIHRHQVRUX0lGIGdhdHRfaWYgPSBHQVRUX0dFVF9HQVRUX0lGKGNvbm5faWQpOwotICBnYXR0X3VwZGF0ZV9hcHBfdXNlX2xpbmtfZmxhZyhnYXR0X2lmLCBwX3RjYiwgZmFsc2UsIHRydWUpOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gdXNlcyBjb25uX2lkIHRvIGZpbmQgaXRzIGFzc29jaWF0ZWQgQkQgYWRkcmVzcwotICogICAgICAgICAgICAgICAgICBhbmQgYXBwbGljYXRpb24gaW50ZXJmYWNlCi0gKgotICogUGFyYW1ldGVycyAgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZCAgKGlucHV0KQotICogICAgICAgICAgICAgICAgICAgcF9nYXR0X2lmOiBhcHBsaWNhaXRvbiBpbnRlcmZhY2UgKG91dHB1dCkKLSAqICAgICAgICAgICAgICAgICAgIGJkX2FkZHI6IHBlZXIgZGV2aWNlIGFkZHJlc3MuIChvdXRwdXQpCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIHRoZSBsaWdpY2FsIGxpbmsgaW5mb3JtYXRpb24gaXMgZm91bmQgZm9yIGNvbm5faWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBHQVRUX0dldENvbm5lY3Rpb25JbmZvcih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9JRiogcF9nYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUKiBwX3RyYW5zcG9ydCkgewotICB0R0FUVF9JRiBnYXR0X2lmID0gR0FUVF9HRVRfR0FUVF9JRihjb25uX2lkKTsKLSAgdEdBVFRfUkVHKiBwX3JlZyA9IGdhdHRfZ2V0X3JlZ2NiKGdhdHRfaWYpOwotICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9nZXRfdGNiX2J5X2lkeCh0Y2JfaWR4KTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKTsKLQotICBpZiAoIXBfdGNiIHx8ICFwX3JlZykgcmV0dXJuIGZhbHNlOwotCi0gIGJkX2FkZHIgPSBwX3RjYi0+cGVlcl9iZGE7Ci0gICpwX2dhdHRfaWYgPSBnYXR0X2lmOwotICAqcF90cmFuc3BvcnQgPSBwX3RjYi0+dHJhbnNwb3J0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZmluZCB0aGUgY29ubl9pZCBpZiB0aGUgbG9naWNhbCBsaW5rIGZvciBCRAotICogICAgICAgICAgICAgICAgICBhZGRyZXNzIGFuZCBhcHBsY2lhdGlvbiBpbnRlcmZhY2UgaXMgY29ubmVjdGVkCi0gKgotICogUGFyYW1ldGVycyAgICAgICAgZ2F0dF9pZjogYXBwbGljYWl0b24gaW50ZXJmYWNlIChpbnB1dCkKLSAqICAgICAgICAgICAgICAgICAgIGJkX2FkZHI6IHBlZXIgZGV2aWNlIGFkZHJlc3MuIChpbnB1dCkKLSAqICAgICAgICAgICAgICAgICAgIHBfY29ubl9pZDogY29ubmVjdGlvbiBpZCAgKG91dHB1dCkKLSAqICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0IG9wdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSB0aGUgbG9naWNhbCBsaW5rIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQodEdBVFRfSUYgZ2F0dF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9jb25uX2lkLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgYm9vbCBzdGF0dXMgPSBmYWxzZTsKLQotICBpZiAocF9yZWcgJiYgcF90Y2IgJiYgKGdhdHRfZ2V0X2NoX3N0YXRlKHBfdGNiKSA9PSBHQVRUX0NIX09QRU4pKSB7Ci0gICAgKnBfY29ubl9pZCA9IEdBVFRfQ1JFQVRFX0NPTk5fSUQocF90Y2ItPnRjYl9pZHgsIGdhdHRfaWYpOwotICAgIHN0YXR1cyA9IHRydWU7Ci0gIH0KLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgc3RhdHVzPSAiIDw8ICtzdGF0dXM7Ci0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9nYXR0L2dhdHRfYXR0ci5jYyBiL3N0YWNrL2dhdHQvZ2F0dF9hdHRyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I5NjQ1Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2dhdHQvZ2F0dF9hdHRyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA4LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBHQVRUIHNlcnZlciBhdHRyaWJ1dGVzIGFjY2VzcyByZXF1ZXN0Ci0gKiAgaGFuZGxpbmcgZnVuY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiZWF0dC9lYXR0LmgiCi0jaW5jbHVkZSAiZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJnYXR0X2ludC5oIgotI2luY2x1ZGUgImdkL2NvbW1vbi9pbml0X2ZsYWdzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi11c2luZyBiYXNlOjpTdHJpbmdQcmludGY7Ci11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLSNkZWZpbmUgQkxFX0dBVFRfU1ZSX1NVUF9GRUFUX0VBVFRfQklUTUFTSyAweDAxCi0KLSNkZWZpbmUgQkxFX0dBVFRfQ0xfU1VQX0ZFQVRfQ0FDSElOR19CSVRNQVNLIDB4MDEKLSNkZWZpbmUgQkxFX0dBVFRfQ0xfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLIDB4MDIKLSNkZWZpbmUgQkxFX0dBVFRfQ0xfU1VQX0ZFQVRfTVVMVElfTk9USUZfQklUTUFTSyAweDA0Ci0KLSNkZWZpbmUgQkxFX0dBVFRfQ0xfQU5EUk9JRF9TVVBfRkVBVCBcCi0gIChCTEVfR0FUVF9DTF9TVVBfRkVBVF9FQVRUX0JJVE1BU0sgfCBCTEVfR0FUVF9DTF9TVVBfRkVBVF9NVUxUSV9OT1RJRl9CSVRNQVNLKQotCi11c2luZyBnYXR0X3NyX3N1cHBvcnRlZF9mZWF0X2NiID0KLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJiwgdWludDhfdCk+OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IG9wX3V1aWQ7Ci0gIGdhdHRfc3Jfc3VwcG9ydGVkX2ZlYXRfY2IgY2I7Ci19IGdhdHRfb3BfY2JfZGF0YTsKLQotc3RhdGljIHN0ZDo6bWFwPHVpbnQxNl90LCBnYXR0X29wX2NiX2RhdGE+IE9uZ29pbmdPcHM7Ci0KLXN0YXRpYyB2b2lkIGdhdHRfcmVxdWVzdF9jYmFjayh1aW50MTZfdCBjb25uX2lkLCB1aW50MzJfdCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHRHQVRUU19EQVRBKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgZ2F0dF9jb25uZWN0X2NiYWNrKFVOVVNFRF9BVFRSIHRHQVRUX0lGIGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkLCB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotc3RhdGljIHZvaWQgZ2F0dF9kaXNjX3Jlc19jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDX1JFUyogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGdhdHRfZGlzY19jbXBsX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGdhdHRfY2xfb3BfY21wbF9jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUqIHBfZGF0YSk7Ci0KLXN0YXRpYyB2b2lkIGdhdHRfY2xfc3RhcnRfY29uZmlnX2NjYyh0R0FUVF9QUk9GSUxFX0NMQ0IqIHBfY2xjYik7Ci0KLXN0YXRpYyBib29sIGdhdHRfc3JfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpOwotCi1zdGF0aWMgdEdBVFRfU1RBVFVTIGdhdHRfc3JfcmVhZF9kYl9oYXNoKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlKTsKLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dF9zcl9yZWFkX2NsX3N1cHBfZmVhdCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlKTsKLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dF9zcl93cml0ZV9jbF9zdXBwX2ZlYXQodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfUkVRKiBwX2RhdGEpOwotCi1zdGF0aWMgdEdBVFRfQ0JBQ0sgZ2F0dF9wcm9maWxlX2NiYWNrID0gey5wX2Nvbm5fY2IgPSBnYXR0X2Nvbm5lY3RfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wX2NtcGxfY2IgPSBnYXR0X2NsX29wX2NtcGxfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wX2Rpc2NfcmVzX2NiID0gZ2F0dF9kaXNjX3Jlc19jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBfZGlzY19jbXBsX2NiID0gZ2F0dF9kaXNjX2NtcGxfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wX3JlcV9jYiA9IGdhdHRfcmVxdWVzdF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBfZW5jX2NtcGxfY2IgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucF9jb25nZXN0aW9uX2NiID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBfcGh5X3VwZGF0ZV9jYiA9IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wX2Nvbm5fdXBkYXRlX2NiID0gbnVsbHB0cn07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2ZpbGVfZmluZF9jb25uX2lkX2J5X2JkX2FkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgdGhlIGNvbm5lY3Rpb24gSUQgYnkgcmVtb3RlIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIENvbm5lY3Rpb24gSUQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgZ2F0dF9wcm9maWxlX2ZpbmRfY29ubl9pZF9ieV9iZF9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgdWludDE2X3QgY29ubl9pZCA9IEdBVFRfSU5WQUxJRF9DT05OX0lEOwotICBHQVRUX0dldENvbm5JZElmQ29ubmVjdGVkKGdhdHRfY2IuZ2F0dF9pZiwgcmVtb3RlX2JkYSwgJmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKGNvbm5faWQgPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpCi0gICAgR0FUVF9HZXRDb25uSWRJZkNvbm5lY3RlZChnYXR0X2NiLmdhdHRfaWYsIHJlbW90ZV9iZGEsICZjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIHJldHVybiBjb25uX2lkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9wcm9maWxlX2ZpbmRfY2xjYl9ieV9jb25uX2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBmaW5kIGNsY2IgYnkgQ29ubmVjdGlvbiBJRAotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgZm91bmQgbGluayBjb25lbmN0aW9uIGNvbnRyb2wgYmxvY2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0R0FUVF9QUk9GSUxFX0NMQ0IqIGdhdHRfcHJvZmlsZV9maW5kX2NsY2JfYnlfY29ubl9pZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIHVpbnQ4X3QgaV9jbGNiOwotICB0R0FUVF9QUk9GSUxFX0NMQ0IqIHBfY2xjYiA9IE5VTEw7Ci0KLSAgZm9yIChpX2NsY2IgPSAwLCBwX2NsY2IgPSBnYXR0X2NiLnByb2ZpbGVfY2xjYjsgaV9jbGNiIDwgR0FUVF9NQVhfQVBQUzsKLSAgICAgICBpX2NsY2IrKywgcF9jbGNiKyspIHsKLSAgICBpZiAocF9jbGNiLT5pbl91c2UgJiYgcF9jbGNiLT5jb25uX2lkID09IGNvbm5faWQpIHJldHVybiBwX2NsY2I7Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfcHJvZmlsZV9maW5kX2NsY2JfYnlfYmRfYWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGFsbCBMQ0JzIHdpdGggbWFjdGhpbmcgYmQgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZvdW5kIGxpbmsgY29uZW5jdGlvbiBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEdBVFRfUFJPRklMRV9DTENCKiBnYXR0X3Byb2ZpbGVfZmluZF9jbGNiX2J5X2JkX2FkZHIoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB1aW50OF90IGlfY2xjYjsKLSAgdEdBVFRfUFJPRklMRV9DTENCKiBwX2NsY2IgPSBOVUxMOwotCi0gIGZvciAoaV9jbGNiID0gMCwgcF9jbGNiID0gZ2F0dF9jYi5wcm9maWxlX2NsY2I7IGlfY2xjYiA8IEdBVFRfTUFYX0FQUFM7Ci0gICAgICAgaV9jbGNiKyssIHBfY2xjYisrKSB7Ci0gICAgaWYgKHBfY2xjYi0+aW5fdXNlICYmIHBfY2xjYi0+dHJhbnNwb3J0ID09IHRyYW5zcG9ydCAmJiBwX2NsY2ItPmNvbm5lY3RlZCAmJgotICAgICAgICBwX2NsY2ItPmJkYSA9PSBiZGEpCi0gICAgICByZXR1cm4gcF9jbGNiOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2ZpbGVfY2xjYl9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIEdBVFQgcHJvZmlsZSBjb25uZWN0aW9uIGxpbmsKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgTlVMTCBpZiBub3QgZm91bmQuIE90aGVyd2lzZSBwb2ludGVyIHRvIHRoZSBjb25uZWN0aW9uIGxpbmsKLSAqICAgICAgICAgICAgICAgICAgYmxvY2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1BST0ZJTEVfQ0xDQiogZ2F0dF9wcm9maWxlX2NsY2JfYWxsb2ModWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5wb3J0KSB7Ci0gIHVpbnQ4X3QgaV9jbGNiID0gMDsKLSAgdEdBVFRfUFJPRklMRV9DTENCKiBwX2NsY2IgPSBOVUxMOwotCi0gIGZvciAoaV9jbGNiID0gMCwgcF9jbGNiID0gZ2F0dF9jYi5wcm9maWxlX2NsY2I7IGlfY2xjYiA8IEdBVFRfTUFYX0FQUFM7Ci0gICAgICAgaV9jbGNiKyssIHBfY2xjYisrKSB7Ci0gICAgaWYgKCFwX2NsY2ItPmluX3VzZSkgewotICAgICAgcF9jbGNiLT5pbl91c2UgPSB0cnVlOwotICAgICAgcF9jbGNiLT5jb25uX2lkID0gY29ubl9pZDsKLSAgICAgIHBfY2xjYi0+Y29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgIHBfY2xjYi0+dHJhbnNwb3J0ID0gdHJhbnBvcnQ7Ci0gICAgICBwX2NsY2ItPmJkYSA9IGJkYTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoaV9jbGNiIDwgR0FUVF9NQVhfQVBQUykgcmV0dXJuIHBfY2xjYjsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfcHJvZmlsZV9jbGNiX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBkZWFsbG9jYXRlcyBhIEdBVFQgcHJvZmlsZSBjb25uZWN0aW9uIGxpbmsKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfcHJvZmlsZV9jbGNiX2RlYWxsb2ModEdBVFRfUFJPRklMRV9DTENCKiBwX2NsY2IpIHsKLSAgbWVtc2V0KHBfY2xjYiwgMCwgc2l6ZW9mKHRHQVRUX1BST0ZJTEVfQ0xDQikpOwotfQotCi0vKiogR0FQIEF0dHJpYnV0ZXMgRGF0YWJhc2UgUmVxdWVzdCBjYWxsYmFjayAqLwotdEdBVFRfU1RBVFVTIHJlYWRfYXR0cl92YWx1ZSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlLCBib29sIGlzX2xvbmcpIHsKLSAgdWludDhfdCogcCA9IHBfdmFsdWUtPnZhbHVlOwotCi0gIGlmIChoYW5kbGUgPT0gZ2F0dF9jYi5oYW5kbGVfc3Jfc3VwcG9ydGVkX2ZlYXQpIHsKLSAgICAvKiBHQVRUX1VVSURfU0VSVkVSX1NVUF9GRUFUKi8KLSAgICBpZiAoaXNfbG9uZykgcmV0dXJuIEdBVFRfTk9UX0xPTkc7Ci0KLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgZ2F0dF9jYi5nYXR0X3N2cl9zdXBwb3J0ZWRfZmVhdF9tYXNrKTsKLSAgICBwX3ZhbHVlLT5sZW4gPSBzaXplb2YoZ2F0dF9jYi5nYXR0X3N2cl9zdXBwb3J0ZWRfZmVhdF9tYXNrKTsKLSAgICByZXR1cm4gR0FUVF9TVUNDRVNTOwotICB9Ci0KLSAgaWYgKGhhbmRsZSA9PSBnYXR0X2NiLmhhbmRsZV9jbF9zdXBwb3J0ZWRfZmVhdCkgewotICAgIC8qR0FUVF9VVUlEX0NMSUVOVF9TVVBfRkVBVCAqLwotICAgIGlmIChpc19sb25nKSByZXR1cm4gR0FUVF9OT1RfTE9ORzsKLQotICAgIHJldHVybiBnYXR0X3NyX3JlYWRfY2xfc3VwcF9mZWF0KGNvbm5faWQsIHBfdmFsdWUpOwotICB9Ci0KLSAgaWYgKGhhbmRsZSA9PSBnYXR0X2NiLmhhbmRsZV9vZl9kYXRhYmFzZV9oYXNoKSB7Ci0gICAgLyogR0FUVF9VVUlEX0RBVEFCQVNFX0hBU0ggKi8KLSAgICBpZiAoaXNfbG9uZykgcmV0dXJuIEdBVFRfTk9UX0xPTkc7Ci0KLSAgICByZXR1cm4gZ2F0dF9zcl9yZWFkX2RiX2hhc2goY29ubl9pZCwgcF92YWx1ZSk7Ci0gIH0KLQotICBpZiAoaGFuZGxlID09IGdhdHRfY2IuaGFuZGxlX29mX2hfcikgewotICAgIC8qIEdBVFRfVVVJRF9HQVRUX1NSVl9DSEdEICovCi0gICAgcmV0dXJuIEdBVFRfUkVBRF9OT1RfUEVSTUlUOwotICB9Ci0KLSAgcmV0dXJuIEdBVFRfTk9UX0ZPVU5EOwotfQotCi0vKiogR0FQIEF0dHJpYnV0ZXMgRGF0YWJhc2UgUmVhZC9SZWFkIEJsb2IgUmVxdWVzdCBwcm9jZXNzICovCi10R0FUVF9TVEFUVVMgcHJvY19yZWFkX3JlcSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVFNfUkVRX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9SRUFEX1JFUSogcF9kYXRhLCB0R0FUVFNfUlNQKiBwX3JzcCkgewotICBpZiAocF9kYXRhLT5pc19sb25nKSBwX3JzcC0+YXR0cl92YWx1ZS5vZmZzZXQgPSBwX2RhdGEtPm9mZnNldDsKLQotICBwX3JzcC0+YXR0cl92YWx1ZS5oYW5kbGUgPSBwX2RhdGEtPmhhbmRsZTsKLQotICByZXR1cm4gcmVhZF9hdHRyX3ZhbHVlKGNvbm5faWQsIHBfZGF0YS0+aGFuZGxlLCAmcF9yc3AtPmF0dHJfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT5pc19sb25nKTsKLX0KLQotLyoqIEdBUCBBVFQgc2VydmVyIHByb2Nlc3MgYSB3cml0ZSByZXF1ZXN0ICovCi10R0FUVF9TVEFUVVMgcHJvY193cml0ZV9yZXEodWludDE2X3QgY29ubl9pZCwgdEdBVFRTX1JFUV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1dSSVRFX1JFUSogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IHBfZGF0YS0+aGFuZGxlOwotCi0gIC8qIEdBVFRfVVVJRF9TRVJWRVJfU1VQX0ZFQVQqLwotICBpZiAoaGFuZGxlID09IGdhdHRfY2IuaGFuZGxlX3NyX3N1cHBvcnRlZF9mZWF0KSByZXR1cm4gR0FUVF9XUklURV9OT1RfUEVSTUlUOwotCi0gIC8qIEdBVFRfVVVJRF9DTElFTlRfU1VQX0ZFQVQqLwotICBpZiAoaGFuZGxlID09IGdhdHRfY2IuaGFuZGxlX2NsX3N1cHBvcnRlZF9mZWF0KQotICAgIHJldHVybiBnYXR0X3NyX3dyaXRlX2NsX3N1cHBfZmVhdChjb25uX2lkLCBwX2RhdGEpOwotCi0gIC8qIEdBVFRfVVVJRF9EQVRBQkFTRV9IQVNIICovCi0gIGlmIChoYW5kbGUgPT0gZ2F0dF9jYi5oYW5kbGVfb2ZfZGF0YWJhc2VfaGFzaCkgcmV0dXJuIEdBVFRfV1JJVEVfTk9UX1BFUk1JVDsKLQotICAvKiBHQVRUX1VVSURfR0FUVF9TUlZfQ0hHRCAqLwotICBpZiAoaGFuZGxlID09IGdhdHRfY2IuaGFuZGxlX29mX2hfcikgcmV0dXJuIEdBVFRfV1JJVEVfTk9UX1BFUk1JVDsKLQotICByZXR1cm4gR0FUVF9OT1RfRk9VTkQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3JlcXVlc3RfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdBVFQgcHJvZmlsZSBhdHRyaWJ1dGUgYWNjZXNzIHJlcXVlc3QgY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXR0X3JlcXVlc3RfY2JhY2sodWludDE2X3QgY29ubl9pZCwgdWludDMyX3QgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1JFUV9UWVBFIHR5cGUsIHRHQVRUU19EQVRBKiBwX2RhdGEpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfSU5WQUxJRF9QRFU7Ci0gIHRHQVRUU19SU1AgcnNwX21zZzsKLSAgYm9vbCByc3BfbmVlZGVkID0gdHJ1ZTsKLQotICBtZW1zZXQoJnJzcF9tc2csIDAsIHNpemVvZih0R0FUVFNfUlNQKSk7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9SRUFEX0NIQVJBQ1RFUklTVElDOgotICAgIGNhc2UgR0FUVFNfUkVRX1RZUEVfUkVBRF9ERVNDUklQVE9SOgotICAgICAgc3RhdHVzID0gcHJvY19yZWFkX3JlcShjb25uX2lkLCB0eXBlLCAmcF9kYXRhLT5yZWFkX3JlcSwgJnJzcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0NIQVJBQ1RFUklTVElDOgotICAgIGNhc2UgR0FUVFNfUkVRX1RZUEVfV1JJVEVfREVTQ1JJUFRPUjoKLSAgICBjYXNlIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0VYRUM6Ci0gICAgY2FzZSBHQVRUX0NNRF9XUklURToKLSAgICAgIGlmICghcF9kYXRhLT53cml0ZV9yZXEubmVlZF9yc3ApIHJzcF9uZWVkZWQgPSBmYWxzZTsKLQotICAgICAgc3RhdHVzID0gcHJvY193cml0ZV9yZXEoY29ubl9pZCwgdHlwZSwgJnBfZGF0YS0+d3JpdGVfcmVxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9NVFU6Ci0gICAgICBWTE9HKDEpIDw8ICJHZXQgTVRVIGV4Y2hhbmdlIG5ldyBtdHUgc2l6ZTogIiA8PCArcF9kYXRhLT5tdHU7Ci0gICAgICByc3BfbmVlZGVkID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBWTE9HKDEpIDw8ICJVbmtub3duL3VuZXhwZWN0ZWQgTEUgR0FQIEFUVCByZXF1ZXN0OiAiIDw8IGxvZ2hleCh0eXBlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKHJzcF9uZWVkZWQpIEdBVFRTX1NlbmRSc3AoY29ubl9pZCwgdHJhbnNfaWQsIHN0YXR1cywgJnJzcF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9jb25uZWN0X2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHYXR0IHByb2ZpbGUgY29ubmVjdGlvbiBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2F0dF9jb25uZWN0X2NiYWNrKFVOVVNFRF9BVFRSIHRHQVRUX0lGIGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkLCB0R0FUVF9ESVNDT05OX1JFQVNPTiByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBmcm9tICIgPDwgYmRhIDw8ICIgY29ubmVjdGVkOiAiIDw8IGNvbm5lY3RlZAotICAgICAgICAgIDw8ICIsIGNvbm5faWQ6ICIgPDwgbG9naGV4KGNvbm5faWQpOwotCi0gIC8vIGlmIHRoZSBkZXZpY2UgaXMgbm90IHRydXN0ZWQsIHJlbW92ZSBkYXRhIHdoZW4gdGhlIGxpbmsgaXMgZGlzY29ubmVjdGVkCi0gIGlmICghY29ubmVjdGVkICYmICFidG1fc2VjX2lzX2FfYm9uZGVkX2RldihiZGEpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHJlbW92ZSB1bnRydXN0ZWQgY2xpZW50IHN0YXR1cywgYmRhPSIgPDwgYmRhOwotICAgIGJ0aWZfc3RvcmFnZV9yZW1vdmVfZ2F0dF9jbF9zdXBwX2ZlYXQoYmRhKTsKLSAgICBidGlmX3N0b3JhZ2VfcmVtb3ZlX2dhdHRfY2xfZGJfaGFzaChiZGEpOwotICB9Ci0KLSAgdEdBVFRfUFJPRklMRV9DTENCKiBwX2NsY2IgPQotICAgICAgZ2F0dF9wcm9maWxlX2ZpbmRfY2xjYl9ieV9iZF9hZGRyKGJkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSByZXR1cm47Ci0KLSAgaWYgKGNvbm5lY3RlZCkgewotICAgIHBfY2xjYi0+Y29ubl9pZCA9IGNvbm5faWQ7Ci0gICAgcF9jbGNiLT5jb25uZWN0ZWQgPSB0cnVlOwotCi0gICAgaWYgKHBfY2xjYi0+Y2NjX3N0YWdlID09IEdBVFRfU1ZDX0NIQU5HRURfQ09OTkVDVElORykgewotICAgICAgcF9jbGNiLT5jY2Nfc3RhZ2UrKzsKLSAgICAgIGdhdHRfY2xfc3RhcnRfY29uZmlnX2NjYyhwX2NsY2IpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBnYXR0X3Byb2ZpbGVfY2xjYl9kZWFsbG9jKHBfY2xjYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfcHJvZmlsZV9kYl9pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXphIHRoZSBHQVRUIHByb2ZpbGUgYXR0cmlidXRlIGRhdGFiYXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfcHJvZmlsZV9kYl9pbml0KHZvaWQpIHsKLSAgLyogRmlsbCBvdXIgaW50ZXJuYWwgVVVJRCB3aXRoIGEgZml4ZWQgcGF0dGVybiAweDgxICovCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgVXVpZDo6a051bUJ5dGVzMTI4PiB0bXA7Ci0gIHRtcC5maWxsKDB4ODEpOwotCi0gIC8qIENyZWF0ZSBhIEdBVFQgcHJvZmlsZSBzZXJ2aWNlICovCi0gIGdhdHRfY2IuZ2F0dF9pZiA9IEdBVFRfUmVnaXN0ZXIoVXVpZDo6RnJvbTEyOEJpdEJFKHRtcCksICJHYXR0UHJvZmlsZURiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2F0dF9wcm9maWxlX2NiYWNrLCBmYWxzZSk7Ci0gIEdBVFRfU3RhcnRJZihnYXR0X2NiLmdhdHRfaWYpOwotCi0gIFV1aWQgc2VydmljZV91dWlkID0gVXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0dBVFRfU0VSVkVSKTsKLQotICBVdWlkIHNydl9jaGFuZ2VkX2NoYXJfdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfR0FUVF9TUlZfQ0hHRCk7Ci0gIFV1aWQgc3ZyX3N1cF9mZWF0X3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX1NFUlZFUl9TVVBfRkVBVCk7Ci0gIFV1aWQgY2xfc3VwX2ZlYXRfdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0xJRU5UX1NVUF9GRUFUKTsKLSAgVXVpZCBkYXRhYmFzZV9oYXNoX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0RBVEFCQVNFX0hBU0gpOwotCi0gIGJ0Z2F0dF9kYl9lbGVtZW50X3Qgc2VydmljZVtdID0gewotICAgICAgewotICAgICAgICAgIC51dWlkID0gc2VydmljZV91dWlkLAotICAgICAgICAgIC50eXBlID0gQlRHQVRUX0RCX1BSSU1BUllfU0VSVklDRSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICAgLnV1aWQgPSBzcnZfY2hhbmdlZF9jaGFyX3V1aWQsCi0gICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfSU5ESUNBVEUsCi0gICAgICAgICAgLnBlcm1pc3Npb25zID0gMCwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgLnV1aWQgPSBzdnJfc3VwX2ZlYXRfdXVpZCwKLSAgICAgICAgICAucHJvcGVydGllcyA9IEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFELAotICAgICAgICAgIC5wZXJtaXNzaW9ucyA9IEdBVFRfUEVSTV9SRUFELAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgICAgICAudXVpZCA9IGNsX3N1cF9mZWF0X3V1aWQsCi0gICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURSwKLSAgICAgICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRCB8IEdBVFRfUEVSTV9XUklURSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICAgLnV1aWQgPSBkYXRhYmFzZV9oYXNoX3V1aWQsCi0gICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUMsCi0gICAgICAgICAgLnByb3BlcnRpZXMgPSBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICAgICAgICAucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRCwKLSAgICAgIH19OwotCi0gIEdBVFRTX0FkZFNlcnZpY2UoZ2F0dF9jYi5nYXR0X2lmLCBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihzZXJ2aWNlKSAvIHNpemVvZihidGdhdHRfZGJfZWxlbWVudF90KSk7Ci0KLSAgZ2F0dF9jYi5oYW5kbGVfb2ZfaF9yID0gc2VydmljZVsxXS5hdHRyaWJ1dGVfaGFuZGxlOwotICBnYXR0X2NiLmhhbmRsZV9zcl9zdXBwb3J0ZWRfZmVhdCA9IHNlcnZpY2VbMl0uYXR0cmlidXRlX2hhbmRsZTsKLSAgZ2F0dF9jYi5oYW5kbGVfY2xfc3VwcG9ydGVkX2ZlYXQgPSBzZXJ2aWNlWzNdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0gIGdhdHRfY2IuaGFuZGxlX29mX2RhdGFiYXNlX2hhc2ggPSBzZXJ2aWNlWzRdLmF0dHJpYnV0ZV9oYW5kbGU7Ci0KLSAgZ2F0dF9jYi5nYXR0X3N2cl9zdXBwb3J0ZWRfZmVhdF9tYXNrIHw9IEJMRV9HQVRUX1NWUl9TVVBfRkVBVF9FQVRUX0JJVE1BU0s7Ci0gIGdhdHRfY2IuZ2F0dF9jbF9zdXBwb3J0ZWRfZmVhdF9tYXNrIHw9IEJMRV9HQVRUX0NMX0FORFJPSURfU1VQX0ZFQVQ7Ci0KLSAgaWYgKGdhdHRfc3JfaXNfcm9idXN0X2NhY2hpbmdfZW5hYmxlZCgpKQotICAgIGdhdHRfY2IuZ2F0dF9jbF9zdXBwb3J0ZWRfZmVhdF9tYXNrIHw9IEJMRV9HQVRUX0NMX1NVUF9GRUFUX0NBQ0hJTkdfQklUTUFTSzsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IGdhdHRfaWY9IiA8PCBnYXR0X2NiLmdhdHRfaWYgPDwgIiBFQVRUIHN1cHBvcnRlZCI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2Rpc2NfcmVzX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHYXR0IHByb2ZpbGUgZGlzY292ZXJ5IHJlc3VsdCBjYWxsYmFjawotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXR0X2Rpc2NfcmVzX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NfUkVTKiBwX2RhdGEpIHsKLSAgdEdBVFRfUFJPRklMRV9DTENCKiBwX2NsY2IgPSBnYXR0X3Byb2ZpbGVfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0KLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSByZXR1cm47Ci0KLSAgc3dpdGNoIChkaXNjX3R5cGUpIHsKLSAgICBjYXNlIEdBVFRfRElTQ19TUlZDX0JZX1VVSUQ6IC8qIHN0YWdlIDEgKi8KLSAgICAgIHBfY2xjYi0+ZV9oYW5kbGUgPSBwX2RhdGEtPnZhbHVlLmdyb3VwX3ZhbHVlLmVfaGFuZGxlOwotICAgICAgcF9jbGNiLT5jY2NfcmVzdWx0Kys7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVF9ESVNDX0NIQVI6IC8qIHN0YWdlIDIgKi8KLSAgICAgIHBfY2xjYi0+c19oYW5kbGUgPSBwX2RhdGEtPnZhbHVlLmRjbHJfdmFsdWUudmFsX2hhbmRsZTsKLSAgICAgIHBfY2xjYi0+Y2NjX3Jlc3VsdCsrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19DSEFSX0RTQ1BUOiAvKiBzdGFnZSAzICovCi0gICAgICBpZiAocF9kYXRhLT50eXBlID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHKSkgewotICAgICAgICBwX2NsY2ItPnNfaGFuZGxlID0gcF9kYXRhLT5oYW5kbGU7Ci0gICAgICAgIHBfY2xjYi0+Y2NjX3Jlc3VsdCsrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfRElTQ19TUlZDX0FMTDoKLSAgICBjYXNlIEdBVFRfRElTQ19JTkNfU1JWQzoKLSAgICBjYXNlIEdBVFRfRElTQ19NQVg6Ci0gICAgICBMT0dfRVJST1IoIklsbGVnYWwgZGlzY292ZXJ5IGl0ZW0gaGFuZGxlZCIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfZGlzY19jbXBsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHYXR0IHByb2ZpbGUgZGlzY292ZXJ5IGNvbXBsZXRlIGNhbGxiYWNrCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhdHRfZGlzY19jbXBsX2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzKSB7Ci0gIHRHQVRUX1BST0ZJTEVfQ0xDQiogcF9jbGNiID0gZ2F0dF9wcm9maWxlX2ZpbmRfY2xjYl9ieV9jb25uX2lkKGNvbm5faWQpOwotICBpZiAocF9jbGNiID09IE5VTEwpIHsKLSAgICBMT0dfV0FSTigiVW5hYmxlIHRvIGZpbmQgZ2F0dCBwcm9maWxlIGFmdGVyIGRpc2NvdmVyeSBjb21wbGV0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgTE9HX1dBUk4oIkdhdHQgZGlzY292ZXJ5IGNvbXBsZXRlZCB3aXRoIGVycm9ycyBzdGF0dXM6JXUiLCBzdGF0dXMpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocF9jbGNiLT5jY2NfcmVzdWx0ID09IDApIHsKLSAgICBMT0dfV0FSTigiR2F0dCBkaXNjb3ZlcnkgY29tcGxldGVkIGJ1dCBjb25uZWN0aW9uIHdhcyBpZGxlIGlkOiVodSIsCi0gICAgICAgICAgICAgY29ubl9pZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9jbGNiLT5jY2NfcmVzdWx0ID0gMDsKLSAgcF9jbGNiLT5jY2Nfc3RhZ2UrKzsKLSAgZ2F0dF9jbF9zdGFydF9jb25maWdfY2NjKHBfY2xjYik7Ci19Ci0KLXN0YXRpYyBib29sIGdhdHRfc3ZjX3JlYWRfY2xfc3VwcF9mZWF0X3JlcSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfb3BfY2JfZGF0YSogY2IpIHsKLSAgdEdBVFRfUkVBRF9QQVJBTSBwYXJhbTsKLQotICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YodEdBVFRfUkVBRF9QQVJBTSkpOwotCi0gIHBhcmFtLnNlcnZpY2Uuc19oYW5kbGUgPSAxOwotICBwYXJhbS5zZXJ2aWNlLmVfaGFuZGxlID0gMHhGRkZGOwotICBwYXJhbS5zZXJ2aWNlLmF1dGhfcmVxID0gMDsKLQotICBwYXJhbS5zZXJ2aWNlLnV1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0xJRU5UX1NVUF9GRUFUKTsKLQotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVENfUmVhZChjb25uX2lkLCBHQVRUX1JFQURfQllfVFlQRSwgJnBhcmFtKTsKLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgUmVhZCBmYWlsZWQuIFN0YXR1czogIgotICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0YXR1cykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNiLT5vcF91dWlkID0gR0FUVF9VVUlEX0NMSUVOVF9TVVBfRkVBVDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGdhdHRfYXR0X3dyaXRlX2NsX3N1cHBfZmVhdCh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgdEdBVFRfVkFMVUUgYXR0cjsKLQotICBtZW1zZXQoJmF0dHIsIDAsIHNpemVvZih0R0FUVF9WQUxVRSkpOwotCi0gIGF0dHIuY29ubl9pZCA9IGNvbm5faWQ7Ci0gIGF0dHIuaGFuZGxlID0gaGFuZGxlOwotICBhdHRyLmxlbiA9IDE7Ci0gIGF0dHIudmFsdWVbMF0gPSBnYXR0X2NiLmdhdHRfY2xfc3VwcG9ydGVkX2ZlYXRfbWFzazsKLQotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVENfV3JpdGUoY29ubl9pZCwgR0FUVF9XUklURSwgJmF0dHIpOwotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBXcml0ZSBmYWlsZWQuIFN0YXR1czogIgotICAgICAgICAgICAgICAgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0YXR1cykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9jbF9vcF9jbXBsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHYXR0IHByb2ZpbGUgY2xpZW50IG9wZXJhdGlvbiBjb21wbGV0ZSBjYWxsYmFjawotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXR0X2NsX29wX2NtcGxfY2JhY2sodWludDE2X3QgY29ubl9pZCwgdEdBVFRDX09QVFlQRSBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NMX0NPTVBMRVRFKiBwX2RhdGEpIHsKLSAgYXV0byBpdGVyID0gT25nb2luZ09wcy5maW5kKGNvbm5faWQpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBvcGNvZGU6ICIgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG9wKSkKLSAgICAgICAgICA8PCAiIHN0YXR1czogIiA8PCBzdGF0dXMKLSAgICAgICAgICA8PCAiIGNvbm4gaWQ6ICIgPDwgbG9naGV4KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbm5faWQpKTsKLQotICBpZiAob3AgIT0gR0FUVENfT1BUWVBFX1JFQUQpIHJldHVybjsKLQotICBpZiAoaXRlciA9PSBPbmdvaW5nT3BzLmVuZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIFVuZXhwZWN0ZWQgcmVhZCBjb21wbGV0ZSI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ2F0dF9vcF9jYl9kYXRhKiBvcGVyYXRpb25fY2FsbGJhY2tfZGF0YSA9ICZpdGVyLT5zZWNvbmQ7Ci0gIHVpbnQxNl90IGNsX29wX3V1aWQgPSBvcGVyYXRpb25fY2FsbGJhY2tfZGF0YS0+b3BfdXVpZDsKLSAgb3BlcmF0aW9uX2NhbGxiYWNrX2RhdGEtPm9wX3V1aWQgPSAwOwotCi0gIHVpbnQ4X3QqIHBwID0gcF9kYXRhLT5hdHRfdmFsdWUudmFsdWU7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGNsX29wX3V1aWQgIiA8PCBsb2doZXgoY2xfb3BfdXVpZCk7Ci0KLSAgc3dpdGNoIChjbF9vcF91dWlkKSB7Ci0gICAgY2FzZSBHQVRUX1VVSURfU0VSVkVSX1NVUF9GRUFUOiB7Ci0gICAgICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICAgICAgdEdBVFRfVENCJiB0Y2IgPSBnYXR0X2NiLnRjYlt0Y2JfaWR4XTsKLQotICAgICAgLyogQ2hlY2sgaWYgRUFUVCBpcyBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UOCh0Y2Iuc3Jfc3VwcF9mZWF0LCBwcCk7Ci0gICAgICAgIGJ0aWZfc3RvcmFnZV9zZXRfZ2F0dF9zcl9zdXBwX2ZlYXQodGNiLnBlZXJfYmRhLCB0Y2Iuc3Jfc3VwcF9mZWF0KTsKLSAgICAgIH0KLQotICAgICAgLyogTm90aWZ5IHVzZXIgYWJvdXQgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcyAqLwotICAgICAgc3RkOjptb3ZlKG9wZXJhdGlvbl9jYWxsYmFja19kYXRhLT5jYikKLSAgICAgICAgICAuUnVuKHRjYi5wZWVyX2JkYSwgdGNiLnNyX3N1cHBfZmVhdCk7Ci0KLSAgICAgIC8qIElmIHNlcnZlciBzdXBwb3J0cyBFQVRUIGxldHMgdHJ5IHRvIGZpbmQgaGFuZGxlIGZvciB0aGUKLSAgICAgICAqIGNsaWVudCBzdXBwb3J0ZWQgZmVhdHVyZXMgY2hhcmFjdGVyaXN0aWMsIHdoZXJlIHdlIGNvdWxkIHdyaXRlCi0gICAgICAgKiBvdXIgc3VwcG9ydGVkIGZlYXR1cmVzIGFzIGEgY2xpZW50LgotICAgICAgICovCi0gICAgICBpZiAodGNiLnNyX3N1cHBfZmVhdCAmIEJMRV9HQVRUX1NWUl9TVVBfRkVBVF9FQVRUX0JJVE1BU0spIHsKLSAgICAgICAgLyogSWYgcmVhZCBzdWNjZWVkLCByZXR1cm4gaGVyZSAqLwotICAgICAgICBpZiAoZ2F0dF9zdmNfcmVhZF9jbF9zdXBwX2ZlYXRfcmVxKGNvbm5faWQsIG9wZXJhdGlvbl9jYWxsYmFja19kYXRhKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIENvdWxkIG5vdCByZWFkIGNsaWVudCBzdXBwb3J0ZWQgY2hhcmN0ZXJpc3RpYyBvciBlYXR0IGlzIG5vdAotICAgICAgICogc3VwcG9ydGVkLiBFcmFzZSBjYWxsYmFjayBkYXRhIG5vdy4KLSAgICAgICAqLwotICAgICAgT25nb2luZ09wcy5lcmFzZShpdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEdBVFRfVVVJRF9DTElFTlRfU1VQX0ZFQVQ6Ci0gICAgICAvKldlIGRvbid0IG5lZWQgY2FsbGJhY2sgZGF0YSBhbnltb3JlICovCi0gICAgICBPbmdvaW5nT3BzLmVyYXNlKGl0ZXIpOwotCi0gICAgICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgIDw8ICIgQ2xpZW50IHN1cHBvcnRlZCBmZWF0dXJlcyBjaGFyY3RlcmlzdGljIG5vdCBmb3VuZCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogV3JpdGUgb3VyIGNsaWVudCBzdXBwb3J0ZWQgZmVhdHVyZXMgdG8gdGhlIHJlbW90ZSBkZXZpY2UgKi8KLSAgICAgIGdhdHRfYXR0X3dyaXRlX2NsX3N1cHBfZmVhdChjb25uX2lkLCBwX2RhdGEtPmF0dF92YWx1ZS5oYW5kbGUpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfY2xfc3RhcnRfY29uZmlnX2NjYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2F0dCBwcm9maWxlIHN0YXJ0IGNvbmZpZ3VyZSBzZXJ2aWNlIGNoYW5nZSBDQ0MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2F0dF9jbF9zdGFydF9jb25maWdfY2NjKHRHQVRUX1BST0ZJTEVfQ0xDQiogcF9jbGNiKSB7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBzdGFnZTogIiA8PCArcF9jbGNiLT5jY2Nfc3RhZ2U7Ci0KLSAgc3dpdGNoIChwX2NsY2ItPmNjY19zdGFnZSkgewotICAgIGNhc2UgR0FUVF9TVkNfQ0hBTkdFRF9TRVJWSUNFOiAvKiBkaXNjb3ZlciBHQVRUIHNlcnZpY2UgKi8KLSAgICAgIEdBVFRDX0Rpc2NvdmVyKHBfY2xjYi0+Y29ubl9pZCwgR0FUVF9ESVNDX1NSVkNfQllfVVVJRCwgMHgwMDAxLCAweGZmZmYsCi0gICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfR0FUVF9TRVJWRVIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1NWQ19DSEFOR0VEX0NIQVJBQ1RFUklTVElDOiAvKiBkaXNjb3ZlciBzZXJ2aWNlIGNoYW5nZSBjaGFyICovCi0gICAgICBHQVRUQ19EaXNjb3ZlcihwX2NsY2ItPmNvbm5faWQsIEdBVFRfRElTQ19DSEFSLCAweDAwMDEsIHBfY2xjYi0+ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0dBVFRfU1JWX0NIR0QpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1NWQ19DSEFOR0VEX0RFU0NSSVBUT1I6IC8qIGRpc2NvdmVyIHNlcnZpY2UgY2hhbmdlIGNjYyAqLwotICAgICAgR0FUVENfRGlzY292ZXIocF9jbGNiLT5jb25uX2lkLCBHQVRUX0RJU0NfQ0hBUl9EU0NQVCwgcF9jbGNiLT5zX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIHBfY2xjYi0+ZV9oYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfU1ZDX0NIQU5HRURfQ09ORklHVVJFX0NDQ0Q6IC8qIHdyaXRlIGNjYyAqLwotICAgIHsKLSAgICAgIHRHQVRUX1ZBTFVFIGNjY192YWx1ZTsKLSAgICAgIG1lbXNldCgmY2NjX3ZhbHVlLCAwLCBzaXplb2YodEdBVFRfVkFMVUUpKTsKLSAgICAgIGNjY192YWx1ZS5oYW5kbGUgPSBwX2NsY2ItPnNfaGFuZGxlOwotICAgICAgY2NjX3ZhbHVlLmxlbiA9IDI7Ci0gICAgICBjY2NfdmFsdWUudmFsdWVbMF0gPSBHQVRUX0NMVF9DT05GSUdfSU5ESUNBVElPTjsKLSAgICAgIEdBVFRDX1dyaXRlKHBfY2xjYi0+Y29ubl9pZCwgR0FUVF9XUklURSwgJmNjY192YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfQ29uZmlnU2VydmljZUNoYW5nZUNDQwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29uZmlndXJlIHNlcnZpY2UgY2hhbmdlIGluZGljYXRpb24gb24gcmVtb3RlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEdBVFRfQ29uZmlnU2VydmljZUNoYW5nZUNDQyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCBib29sIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHRHQVRUX1BST0ZJTEVfQ0xDQiogcF9jbGNiID0KLSAgICAgIGdhdHRfcHJvZmlsZV9maW5kX2NsY2JfYnlfYmRfYWRkcihyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCkKLSAgICBwX2NsY2IgPSBnYXR0X3Byb2ZpbGVfY2xjYl9hbGxvYygwLCByZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIGlmIChHQVRUX0dldENvbm5JZElmQ29ubmVjdGVkKGdhdHRfY2IuZ2F0dF9pZiwgcmVtb3RlX2JkYSwgJnBfY2xjYi0+Y29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KSkgewotICAgIHBfY2xjYi0+Y29ubmVjdGVkID0gdHJ1ZTsKLSAgfQotICAvKiBob2xkIHRoZSBsaW5rIGhlcmUgKi8KLSAgR0FUVF9Db25uZWN0KGdhdHRfY2IuZ2F0dF9pZiwgcmVtb3RlX2JkYSwgdHJ1ZSwgdHJhbnNwb3J0LCB0cnVlKTsKLSAgcF9jbGNiLT5jY2Nfc3RhZ2UgPSBHQVRUX1NWQ19DSEFOR0VEX0NPTk5FQ1RJTkc7Ci0KLSAgaWYgKCFwX2NsY2ItPmNvbm5lY3RlZCkgewotICAgIC8qIHdhaXQgZm9yIGNvbm5lY3Rpb24gKi8KLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2NsY2ItPmNjY19zdGFnZSsrOwotICBnYXR0X2NsX3N0YXJ0X2NvbmZpZ19jY2MocF9jbGNiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfY2xfaW5pdF9zcl9zdGF0dXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3RvcmUgc3RhdHVzIGZvciB0cnVzdGVkIEdBVFQgU2VydmVyIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfY2xfaW5pdF9zcl9zdGF0dXModEdBVFRfVENCJiB0Y2IpIHsKLSAgdGNiLnNyX3N1cHBfZmVhdCA9IGJ0aWZfc3RvcmFnZV9nZXRfc3Jfc3VwcF9mZWF0KHRjYi5wZWVyX2JkYSk7Ci0KLSAgaWYgKHRjYi5zcl9zdXBwX2ZlYXQgJiBCTEVfR0FUVF9TVlJfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLKQotICAgIGJsdWV0b290aDo6ZWF0dDo6RWF0dEV4dGVuc2lvbjo6QWRkRnJvbVN0b3JhZ2UodGNiLnBlZXJfYmRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfY2xfcmVhZF9zcl9zdXBwX2ZlYXRfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWFkIHJlbW90ZSBkZXZpY2Ugc3VwcG9ydGVkIEdBVFQgZmVhdHVyZSBtYXNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGdhdHRfY2xfcmVhZF9zcl9zdXBwX2ZlYXRfcmVxKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRhLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmLCB1aW50OF90KT4gY2IpIHsKLSAgdEdBVFRfUFJPRklMRV9DTENCKiBwX2NsY2I7Ci0gIHRHQVRUX1JFQURfUEFSQU0gcGFyYW07Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0KLSAgaWYgKCFjYikgcmV0dXJuIGZhbHNlOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBCREE6ICIgPDwgcGVlcl9iZGEKLSAgICAgICAgICA8PCAiIHJlYWQgZ2F0dCBzdXBwb3J0ZWQgZmVhdHVyZXMiOwotCi0gIEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQoZ2F0dF9jYi5nYXR0X2lmLCBwZWVyX2JkYSwgJmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKGNvbm5faWQgPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHJldHVybiBmYWxzZTsKLQotICBwX2NsY2IgPSBnYXR0X3Byb2ZpbGVfZmluZF9jbGNiX2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0gIGlmICghcF9jbGNiKSB7Ci0gICAgcF9jbGNiID0gZ2F0dF9wcm9maWxlX2NsY2JfYWxsb2MoY29ubl9pZCwgcGVlcl9iZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIH0KLQotICBpZiAoIXBfY2xjYikgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBwX2NsY2IgaXMgTlVMTCAiIDw8IGxvZ2hleChjb25uX2lkKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdXRvIGl0ID0gT25nb2luZ09wcy5maW5kKGNvbm5faWQpOwotICBpZiAoaXQgIT0gT25nb2luZ09wcy5lbmQoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBUaGVyZSBpcyBvbmdvaW5nIG9wZXJhdGlvbiBmb3IgY29ubl9pZDogIgotICAgICAgICAgICAgICAgPDwgbG9naGV4KGNvbm5faWQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1lbXNldCgmcGFyYW0sIDAsIHNpemVvZih0R0FUVF9SRUFEX1BBUkFNKSk7Ci0KLSAgcGFyYW0uc2VydmljZS5zX2hhbmRsZSA9IDE7Ci0gIHBhcmFtLnNlcnZpY2UuZV9oYW5kbGUgPSAweEZGRkY7Ci0gIHBhcmFtLnNlcnZpY2UuYXV0aF9yZXEgPSAwOwotCi0gIHBhcmFtLnNlcnZpY2UudXVpZCA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9TRVJWRVJfU1VQX0ZFQVQpOwotCi0gIGlmIChHQVRUQ19SZWFkKGNvbm5faWQsIEdBVFRfUkVBRF9CWV9UWVBFLCAmcGFyYW0pICE9IEdBVFRfU1VDQ0VTUykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBSZWFkIEdBVFQgU3VwcG9ydCBmZWF0dXJlcyBHQVRUX1JlYWQgRmFpbGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBnYXR0X29wX2NiX2RhdGEgY2JfZGF0YTsKLSAgY2JfZGF0YS5jYiA9IHN0ZDo6bW92ZShjYik7Ci0gIGNiX2RhdGEub3BfdXVpZCA9IEdBVFRfVVVJRF9TRVJWRVJfU1VQX0ZFQVQ7Ci0gIE9uZ29pbmdPcHNbY29ubl9pZF0gPSBzdGQ6Om1vdmUoY2JfZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2ZpbGVfZ2V0X2VhdHRfc3VwcG9ydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgRUFUVCBpcyBzdXBwb3J0ZWQgd2l0aCByZW1vdGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgaWYgRUFUVCBpcyBzdXBwb3J0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF9wcm9maWxlX2dldF9lYXR0X3N1cHBvcnQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICB1aW50MTZfdCBjb25uX2lkOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBCREE6ICIgPDwgcmVtb3RlX2JkYSA8PCAiIHJlYWQgR0FUVCBzdXBwb3J0IjsKLQotICBHQVRUX0dldENvbm5JZElmQ29ubmVjdGVkKGdhdHRfY2IuZ2F0dF9pZiwgcmVtb3RlX2JkYSwgJmNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0xFKTsKLQotICAvKiBUaGlzIHJlYWQgaXMgaW1wb3J0YW50IG9ubHkgd2hlbiBjb25uZWN0ZWQgKi8KLSAgaWYgKGNvbm5faWQgPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGNiIGluZm8gKi8KLSAgdWludDhfdCB0Y2JfaWR4ID0gR0FUVF9HRVRfVENCX0lEWChjb25uX2lkKTsKLSAgdEdBVFRfVENCJiB0Y2IgPSBnYXR0X2NiLnRjYlt0Y2JfaWR4XTsKLSAgcmV0dXJuIHRjYi5zcl9zdXBwX2ZlYXQgJiBCTEVfR0FUVF9TVlJfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9zcl9pc19yb2J1c3RfY2FjaGluZ19lbmFibGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiBSb2J1c3QgQ2FjaGluZyBpcyBlbmFibGVkIG9uIHNlcnZlciBzaWRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBlbmFibGVkIGluIGdkIGZsYWcsIG90aGVyd2lzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBnYXR0X3NyX2lzX3JvYnVzdF9jYWNoaW5nX2VuYWJsZWQoKSB7Ci0gIHJldHVybiBibHVldG9vdGg6OmNvbW1vbjo6aW5pdF9mbGFnczo6Z2F0dF9yb2J1c3RfY2FjaGluZ19pc19lbmFibGVkKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3NyX2lzX2NsX3JvYnVzdF9jYWNoaW5nX3N1cHBvcnRlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgUm9idXN0IENhY2hpbmcgaXMgc3VwcG9ydGVkIGZvciB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBlbmFibGVkIGJ5IGNsaWVudCBzaWRlLCBvdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgZ2F0dF9zcl9pc19jbF9yb2J1c3RfY2FjaGluZ19zdXBwb3J0ZWQodEdBVFRfVENCJiB0Y2IpIHsKLSAgLy8gaWYgcm9idXN0IGNhY2hpbmcgaXMgbm90IGVuYWJsZWQsIHNob3VsZCBhbHdheXMgcmV0dXJuIGZhbHNlCi0gIGlmICghZ2F0dF9zcl9pc19yb2J1c3RfY2FjaGluZ19lbmFibGVkKCkpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuICh0Y2IuY2xfc3VwcF9mZWF0ICYgQkxFX0dBVFRfQ0xfU1VQX0ZFQVRfQ0FDSElOR19CSVRNQVNLKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfaXNfY2xfY2hhbmdlX2F3YXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBjaGFuZ2UtYXdhcmUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgY2hhbmdlIGF3YXJlLCBvdGhlcndpc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBnYXR0X3NyX2lzX2NsX2NoYW5nZV9hd2FyZSh0R0FUVF9UQ0ImIHRjYikgewotICAvLyBpZiByb2J1c3QgY2FjaGluZyBpcyBub3Qgc3VwcG9ydGVkLCBzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlIGJ5IGRlZmF1bHQKLSAgaWYgKCFnYXR0X3NyX2lzX2NsX3JvYnVzdF9jYWNoaW5nX3N1cHBvcnRlZCh0Y2IpKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIHRjYi5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9zcl9pbml0X2NsX3N0YXR1cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzdG9yZSBzdGF0dXMgZm9yIHRydXN0ZWQgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zcl9pbml0X2NsX3N0YXR1cyh0R0FUVF9UQ0ImIHRjYikgewotICB0Y2IuY2xfc3VwcF9mZWF0ID0gYnRpZl9zdG9yYWdlX2dldF9nYXR0X2NsX3N1cHBfZmVhdCh0Y2IucGVlcl9iZGEpOwotICAvLyBUaGlzIGlzIHVzZWQgdG8gcmVzZXQgYml0IHdoZW4gcm9idXN0IGNhY2hpbmcgaXMgZGlzYWJsZWQKLSAgaWYgKCFnYXR0X3NyX2lzX3JvYnVzdF9jYWNoaW5nX2VuYWJsZWQoKSkgewotICAgIHRjYi5jbF9zdXBwX2ZlYXQgJj0gfkJMRV9HQVRUX0NMX1NVUF9GRUFUX0NBQ0hJTkdfQklUTUFTSzsKLSAgfQotCi0gIGlmIChnYXR0X3NyX2lzX2NsX3JvYnVzdF9jYWNoaW5nX3N1cHBvcnRlZCh0Y2IpKSB7Ci0gICAgT2N0ZXQxNiBzdG9yZWRfaGFzaCA9IGJ0aWZfc3RvcmFnZV9nZXRfZ2F0dF9jbF9kYl9oYXNoKHRjYi5wZWVyX2JkYSk7Ci0gICAgdGNiLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSAoc3RvcmVkX2hhc2ggPT0gZ2F0dF9jYi5kYXRhYmFzZV9oYXNoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgdW50cnVzdGVkIGRldmljZQotICAgIHRjYi5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gdHJ1ZTsKLSAgfQotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBiZGE9IiA8PCB0Y2IucGVlcl9iZGEKLSAgICAgICAgICAgIDw8ICIsIGNsX3N1cHBfZmVhdD0iIDw8IGxvZ2hleCh0Y2IuY2xfc3VwcF9mZWF0KQotICAgICAgICAgICAgPDwgIiwgYXdhcmU9IiA8PCB0Y2IuaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfdXBkYXRlX2NsX3N0YXR1cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlIGNoYW5nZS1hd2FyZSBzdGF0dXMgZm9yIHRoZSByZW1vdGUgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zcl91cGRhdGVfY2xfc3RhdHVzKHRHQVRUX1RDQiYgdGNiLCBib29sIGNoZ19hd2FyZSkgewotICAvLyBpZiByb2J1c3QgY2FjaGluZyBpcyBub3Qgc3VwcG9ydGVkLCBkbyBub3RoaW5nCi0gIGlmICghZ2F0dF9zcl9pc19jbF9yb2J1c3RfY2FjaGluZ19zdXBwb3J0ZWQodGNiKSkgcmV0dXJuOwotCi0gIC8vIG9ubHkgd2hlbiBjbGllbnQgc3RhdHVzIGlzIGNoYW5nZWQgZnJvbSBjaGFuZ2UtdW5hd2FyZSB0byBjaGFuZ2UtYXdhcmUsIHdlCi0gIC8vIGNhbiB0aGVuIHN0b3JlIGRhdGFiYXNlIGhhc2ggaW50byBidGlmX3N0b3JhZ2UKLSAgaWYgKCF0Y2IuaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSAmJiBjaGdfYXdhcmUpIHsKLSAgICBidGlmX3N0b3JhZ2Vfc2V0X2dhdHRfY2xfZGJfaGFzaCh0Y2IucGVlcl9iZGEsIGdhdHRfY2IuZGF0YWJhc2VfaGFzaCk7Ci0gIH0KLQotICAvLyBvbmx5IHdoZW4gdGhlIHN0YXR1cyBpcyBjaGFuZ2VkLCBwcmludCB0aGUgbG9nCi0gIGlmICh0Y2IuaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSAhPSBjaGdfYXdhcmUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogYmRhPSIgPDwgdGNiLnBlZXJfYmRhCi0gICAgICAgICAgICAgIDw8ICIsIGNoZ19hd2FyZT0iIDw8IGNoZ19hd2FyZTsKLSAgfQotCi0gIHRjYi5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gY2hnX2F3YXJlOwotfQotCi0vKiBoYW5kbGUgcmVxdWVzdCBmb3IgcmVhZGluZyBkYXRhYmFzZSBoYXNoICovCi1zdGF0aWMgdEdBVFRfU1RBVFVTIGdhdHRfc3JfcmVhZF9kYl9oYXNoKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpOwotCi0gIHVpbnQ4X3QqIHAgPSBwX3ZhbHVlLT52YWx1ZTsKLSAgT2N0ZXQxNiYgZGJfaGFzaCA9IGdhdHRfY2IuZGF0YWJhc2VfaGFzaDsKLSAgQVJSQVlfVE9fU1RSRUFNKHAsIGRiX2hhc2guZGF0YSgpLCAodWludDE2X3QpZGJfaGFzaC5zaXplKCkpOwotICBwX3ZhbHVlLT5sZW4gPSAodWludDE2X3QpZGJfaGFzaC5zaXplKCk7Ci0KLSAgLy8gRXZlcnkgdGltZSB3aGVuIGRhdGFiYXNlIGhhc2ggaXMgcmVxdWVzdGVkLCByZXNldCBmbGFnLgotICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXMoZ2F0dF9jYi50Y2JbdGNiX2lkeF0sIC8qIGNoZ19hd2FyZT0gKi8gdHJ1ZSk7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci0KLS8qIGhhbmRsZSByZXF1ZXN0IGZvciByZWFkaW5nIGNsaWVudCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dF9zcl9yZWFkX2NsX3N1cHBfZmVhdCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlKSB7Ci0gIC8vIEdldCB0Y2IgaW5mbwotICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICB0R0FUVF9UQ0ImIHRjYiA9IGdhdHRfY2IudGNiW3RjYl9pZHhdOwotCi0gIHVpbnQ4X3QqIHAgPSBwX3ZhbHVlLT52YWx1ZTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHRjYi5jbF9zdXBwX2ZlYXQpOwotICBwX3ZhbHVlLT5sZW4gPSAxOwotCi0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci0KLS8qIGhhbmRsZSByZXF1ZXN0IGZvciB3cml0aW5nIGNsaWVudCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dF9zcl93cml0ZV9jbF9zdXBwX2ZlYXQodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfUkVRKiBwX2RhdGEpIHsKLSAgc3RkOjpsaXN0PHVpbnQ4X3Q+IHRtcDsKLSAgdWludDE2X3QgbGVuID0gcF9kYXRhLT5sZW47Ci0gIHVpbnQ4X3QgdmFsdWUsICpwID0gcF9kYXRhLT52YWx1ZTsKLSAgLy8gUmVhZCBhbGwgb2N0ZXRzIGludG8gbGlzdAotICB3aGlsZSAobGVuID4gMCkgewotICAgIFNUUkVBTV9UT19VSU5UOCh2YWx1ZSwgcCk7Ci0gICAgdG1wLnB1c2hfYmFjayh2YWx1ZSk7Ci0gICAgbGVuLS07Ci0gIH0KLSAgLy8gUmVtb3ZlIHRyYWlsaW5nIHplcm8gb2N0ZXRzCi0gIHdoaWxlICghdG1wLmVtcHR5KCkpIHsKLSAgICBpZiAodG1wLmJhY2soKSAhPSAweDAwKSBicmVhazsKLSAgICB0bXAucG9wX2JhY2soKTsKLSAgfQotCi0gIC8vIEdldCB0Y2IgaW5mbwotICB1aW50OF90IHRjYl9pZHggPSBHQVRUX0dFVF9UQ0JfSURYKGNvbm5faWQpOwotICB0R0FUVF9UQ0ImIHRjYiA9IGdhdHRfY2IudGNiW3RjYl9pZHhdOwotCi0gIHN0ZDo6bGlzdDx1aW50OF90PiBmZWF0dXJlX2xpc3Q7Ci0gIGZlYXR1cmVfbGlzdC5wdXNoX2JhY2sodGNiLmNsX3N1cHBfZmVhdCk7Ci0KLSAgLy8gSWYgaW5wdXQgbGVuZ3RoIGlzIHplcm8sIHJldHVybiB2YWx1ZV9ub3RfYWxsb3dlZAotICBpZiAodG1wLmVtcHR5KCkpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogemVybyBsZW5ndGgsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCkKLSAgICAgICAgICAgICAgPDwgIiwgYmRhPSIgPDwgdGNiLnBlZXJfYmRhOwotICAgIHJldHVybiBHQVRUX1ZBTFVFX05PVF9BTExPV0VEOwotICB9Ci0gIC8vIGlmIG9yaWdpbmFsIGxlbmd0aCBpcyBsb25nZXIgdGhhbiBuZXcgb25lLCBpdCBtdXN0IGJlIHRoZSBiaXQgcmVzZXQgY2FzZS4KLSAgaWYgKGZlYXR1cmVfbGlzdC5zaXplKCkgPiB0bXAuc2l6ZSgpKSB7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHNob3J0ZXIgbGVuZ3RoLCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpCi0gICAgICAgICAgICAgIDw8ICIsIGJkYT0iIDw8IHRjYi5wZWVyX2JkYTsKLSAgICByZXR1cm4gR0FUVF9WQUxVRV9OT1RfQUxMT1dFRDsKLSAgfQotICAvLyBuZXcgbGVuZ3RoIGlzIGxvbmdlciBvciBlcXVhbHMgdG8gdGhlIG9yaWdpbmFsLCBuZWVkIHRvIGNoZWNrIGJpdHMKLSAgLy8gb25lIGJ5IG9uZS4gSGVyZSB3ZSB1c2UgYml0LXdpc2Ugb3BlcmF0aW9uLgotICAvLyAxLiBVc2UgWE9SIHRvIGxvY2F0ZSB0aGUgY2hhbmdlIGJpdCwgdmFsX3hvciBpcyB0aGUgY2hhbmdlIGJpdCBtYXNrCi0gIC8vIDIuIFVzZSBBTkQgZm9yIHZhbF94b3IgYW5kICppdF9uZXcgdG8gZ2V0IHZhbF9hbmQKLSAgLy8gMy4gSWYgdmFsX2FuZCAhPSB2YWxfeG9yLCBpdCBtZWFucyB0aGUgY2hhbmdlIGlzIGZyb20gMSB0byAwCi0gIGF1dG8gaXRfb2xkID0gZmVhdHVyZV9saXN0LmNiZWdpbigpOwotICBhdXRvIGl0X25ldyA9IHRtcC5jYmVnaW4oKTsKLSAgZm9yICg7IGl0X29sZCAhPSBmZWF0dXJlX2xpc3QuY2VuZCgpOyBpdF9vbGQrKywgaXRfbmV3KyspIHsKLSAgICB1aW50OF90IHZhbF94b3IgPSAqaXRfb2xkIF4gKml0X25ldzsKLSAgICB1aW50OF90IHZhbF9hbmQgPSB2YWxfeG9yICYgKml0X25ldzsKLSAgICBpZiAodmFsX2FuZCAhPSB2YWxfeG9yKSB7Ci0gICAgICBMT0coSU5GTykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICA8PCAiOiBiaXQgY2Fubm90IGJlIHJlc2V0LCBjb25uX2lkPSIgPDwgbG9naGV4KGNvbm5faWQpCi0gICAgICAgICAgICAgICAgPDwgIiwgYmRhPSIgPDwgdGNiLnBlZXJfYmRhOwotICAgICAgcmV0dXJuIEdBVFRfVkFMVUVfTk9UX0FMTE9XRUQ7Ci0gICAgfQotICB9Ci0KLSAgLy8gZ2V0IGN1cnJlbnQgcm9idXN0IGNhY2hpbmcgc3RhdHVzIGJlZm9yZSBzZXR0aW5nIG5ldyBvbmUKLSAgYm9vbCBjdXJyX2NhY2hpbmdfc3RhdGUgPSBnYXR0X3NyX2lzX2NsX3JvYnVzdF9jYWNoaW5nX3N1cHBvcnRlZCh0Y2IpOwotCi0gIHRjYi5jbF9zdXBwX2ZlYXQgPSB0bXAuZnJvbnQoKTsKLSAgaWYgKCFnYXR0X3NyX2lzX3JvYnVzdF9jYWNoaW5nX2VuYWJsZWQoKSkgewotICAgIC8vIHJlbW92ZSByb2J1c3QgY2FjaGluZyBiaXQKLSAgICB0Y2IuY2xfc3VwcF9mZWF0ICY9IH5CTEVfR0FUVF9DTF9TVVBfRkVBVF9DQUNISU5HX0JJVE1BU0s7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgIDw8ICI6IHJlc2V0IHJvYnVzdCBjYWNoaW5nIGJpdCwgY29ubl9pZD0iIDw8IGxvZ2hleChjb25uX2lkKQotICAgICAgICAgICAgICA8PCAiLCBiZGE9IiA8PCB0Y2IucGVlcl9iZGE7Ci0gIH0KLSAgLy8gVE9ETyhoeWxvKTogc2F2ZSBkYXRhIGFzIGJ5dGUgYXJyYXkKLSAgYnRpZl9zdG9yYWdlX3NldF9nYXR0X2NsX3N1cHBfZmVhdCh0Y2IucGVlcl9iZGEsIHRjYi5jbF9zdXBwX2ZlYXQpOwotCi0gIC8vIGdldCBuZXcgcm9idXN0IGNhY2hpbmcgc3RhdHVzIGFmdGVyIHNldHRpbmcgbmV3IG9uZQotICBib29sIG5ld19jYWNoaW5nX3N0YXRlID0gZ2F0dF9zcl9pc19jbF9yb2J1c3RfY2FjaGluZ19zdXBwb3J0ZWQodGNiKTsKLSAgLy8gb25seSB3aGVuIHRoZSBmaXJzdCB0aW1lIHJvYnVzdCBjYWNoaW5nIHJlcXVlc3QsIHByaW50IHRoZSBsb2cKLSAgaWYgKCFjdXJyX2NhY2hpbmdfc3RhdGUgJiYgbmV3X2NhY2hpbmdfc3RhdGUpIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogcm9idXN0IGNhY2hpbmcgZW5hYmxlZCBieSBjbGllbnQiCi0gICAgICAgICAgICAgIDw8ICIsIGNvbm5faWQ9IiA8PCBsb2doZXgoY29ubl9pZCk7Ci0gIH0KLQotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svZ2F0dC9nYXR0X2F1dGguY2MgYi9zdGFjay9nYXR0L2dhdHRfYXV0aC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3NDNiZi4uMDAwMDAwMAotLS0gYS9zdGFjay9nYXR0L2dhdHRfYXV0aC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyBHQVRUIGF1dGhlbnRpY2F0aW9uIGhhbmRsaW5nIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImdhdHRfYXBpLmgiCi0jaW5jbHVkZSAiZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc2lnbl9kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNpZ24gdGhlIGRhdGEgZm9yIHdyaXRlIGNvbW1hbmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGVuY3J5cHRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBnYXR0X3NpZ25fZGF0YSh0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgdEdBVFRfVkFMVUUqIHBfYXR0ciA9ICh0R0FUVF9WQUxVRSopcF9jbGNiLT5wX2F0dHJfYnVmOwotICB1aW50OF90ICpwX2RhdGEgPSBOVUxMLCAqcDsKLSAgdWludDE2X3QgcGF5bG9hZF9zaXplID0gcF9jbGNiLT5wX3RjYi0+cGF5bG9hZF9zaXplOwotICBib29sIHN0YXR1cyA9IGZhbHNlOwotICB1aW50OF90KiBwX3NpZ25hdHVyZTsKLQotICAvKiBkbyBub3QgbmVlZCB0byBtYXJrIGNoYW5uZWwgc2VjdXJvdHkgYWN0aXZpdHkgZm9yIGRhdGEgc2lnbmluZyAqLwotICBnYXR0X3NldF9zZWNfYWN0KHBfY2xjYi0+cF90Y2IsIEdBVFRfU0VDX09LKTsKLQotICBwX2RhdGEgPQotICAgICAgKHVpbnQ4X3QqKW9zaV9tYWxsb2MocF9hdHRyLT5sZW4gKyAzKTsgLyogMyA9IDIgYnl0ZSBoYW5kbGUgKyBvcGNvZGUgKi8KLQotICBwID0gcF9kYXRhOwotICBVSU5UOF9UT19TVFJFQU0ocCwgR0FUVF9TSUdOX0NNRF9XUklURSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9hdHRyLT5oYW5kbGUpOwotICBBUlJBWV9UT19TVFJFQU0ocCwgcF9hdHRyLT52YWx1ZSwgcF9hdHRyLT5sZW4pOwotCi0gIC8qIHNpZ24gZGF0YSBsZW5ndGggc2hvdWxkIGJlIGF0dHJpYnVsdGUgdmFsdWUgbGVuZ3RoIHBsdXMgMkIgaGFuZGxlICsgMUIgb3AKLSAgICogY29kZSAqLwotICBpZiAoKHBheWxvYWRfc2l6ZSAtIEdBVFRfQVVUSF9TSUdOX0xFTiAtIDMpIDwgcF9hdHRyLT5sZW4pCi0gICAgcF9hdHRyLT5sZW4gPSBwYXlsb2FkX3NpemUgLSBHQVRUX0FVVEhfU0lHTl9MRU4gLSAzOwotCi0gIHBfc2lnbmF0dXJlID0gcF9hdHRyLT52YWx1ZSArIHBfYXR0ci0+bGVuOwotICBpZiAoQlRNX0JsZURhdGFTaWduYXR1cmUoCi0gICAgICAgICAgcF9jbGNiLT5wX3RjYi0+cGVlcl9iZGEsIHBfZGF0YSwKLSAgICAgICAgICAodWludDE2X3QpKHBfYXR0ci0+bGVuICsgMyksIC8qIDMgPSAyIGJ5dGUgaGFuZGxlICsgb3Bjb2RlICovCi0gICAgICAgICAgcF9zaWduYXR1cmUpKSB7Ci0gICAgcF9hdHRyLT5sZW4gKz0gQlRNX0JMRV9BVVRIX1NJR05fTEVOOwotICAgIGdhdHRfc2V0X2NoX3N0YXRlKHBfY2xjYi0+cF90Y2IsIEdBVFRfQ0hfT1BFTik7Ci0gICAgZ2F0dF9hY3Rfd3JpdGUocF9jbGNiLCBHQVRUX1NFQ19TSUdOX0RBVEEpOwotICB9IGVsc2UgewotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfSU5URVJOQUxfRVJST1IsIE5VTEwpOwotICB9Ci0KLSAgb3NpX2ZyZWUocF9kYXRhKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF92ZXJpZnlfc2lnbmF0dXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0IHRvIHZlcmlmeSB0aGUgc2lnbiBkYXRhIHdoZW4gcmVjZWl2aW5nCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBkYXRhIGZyb20gcGVlciBkZXZpY2UuCi0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfdmVyaWZ5X3NpZ25hdHVyZSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIHVpbnQxNl90IGNtZF9sZW47Ci0gIHVpbnQ4X3Qgb3BfY29kZTsKLSAgdWludDhfdCAqcCwgKnBfb3JpZyA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0gIHVpbnQzMl90IGNvdW50ZXI7Ci0KLSAgaWYgKHBfYnVmLT5sZW4gPCBHQVRUX0FVVEhfU0lHTl9MRU4gKyA0KSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBTdHJpbmdQcmludGYoIiVzOiBEYXRhIGxlbmd0aCAldSBsZXNzIHRoYW4gZXhwZWN0ZWQgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2J1Zi0+bGVuLCBHQVRUX0FVVEhfU0lHTl9MRU4gKyA0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY21kX2xlbiA9IHBfYnVmLT5sZW4gLSBHQVRUX0FVVEhfU0lHTl9MRU4gKyA0OwotICBwID0gcF9vcmlnICsgY21kX2xlbiAtIDQ7Ci0gIFNUUkVBTV9UT19VSU5UMzIoY291bnRlciwgcCk7Ci0KLSAgaWYgKCFCVE1fQmxlVmVyaWZ5U2lnbmF0dXJlKHRjYi5wZWVyX2JkYSwgcF9vcmlnLCBjbWRfbGVuLCBjb3VudGVyLCBwKSkgewotICAgIC8qIGlmIHRoaXMgaXMgYSBiYWQgc2lnbmF0dXJlLCBhc3N1bWUgZnJvbSBhdHRhY2tlciwgaWdub3JlIGl0ICAqLwotICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKCJTaWduYXR1cmUgVmVyaWZpY2F0aW9uIEZhaWxlZCwgZGF0YSBpZ25vcmVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KG9wX2NvZGUsIHBfb3JpZyk7Ci0gIGdhdHRfc2VydmVyX2hhbmRsZV9jbGllbnRfcmVxKHRjYiwgY2lkLCBvcF9jb2RlLCAodWludDE2X3QpKHBfYnVmLT5sZW4gLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9vcmlnKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3NlY19jaGVja19jb21wbGV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc2VjdXJpdHkgY2hlY2sgY29tcGxldGUgYW5kIHByb2NlZWQgdG8gZGF0YSBzZW5kaW5nIGFjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zZWNfY2hlY2tfY29tcGxldGUoYm9vbCBzZWNfY2hlY2tfb2ssIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNfYWN0KSB7Ci0gIGlmIChwX2NsY2IgJiYgcF9jbGNiLT5wX3RjYiAmJiBwX2NsY2ItPnBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLmVtcHR5KCkpIHsKLSAgICBnYXR0X3NldF9zZWNfYWN0KHBfY2xjYi0+cF90Y2IsIEdBVFRfU0VDX05PTkUpOwotICB9Ci0KLSAgaWYgKCFzZWNfY2hlY2tfb2spIHsKLSAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX0FVVEhfRkFJTCwgTlVMTCk7Ci0gIH0gZWxzZSBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1dSSVRFKSB7Ci0gICAgZ2F0dF9hY3Rfd3JpdGUocF9jbGNiLCBzZWNfYWN0KTsKLSAgfSBlbHNlIGlmIChwX2NsY2ItPm9wZXJhdGlvbiA9PSBHQVRUQ19PUFRZUEVfUkVBRCkgewotICAgIGdhdHRfYWN0X3JlYWQocF9jbGNiLCBwX2NsY2ItPmNvdW50ZXIpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9lbmNfY21wbF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgbGluayBlbmNyeXB0aW9uIGNvbXBsZXRlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X2VuY19jbXBsX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHZvaWQqIHBfcmVmX2RhdGEsIHRCVE1fU1RBVFVTIHJlc3VsdCkgewotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiZ2F0dF9lbmNfY21wbF9jYmFjayIpOwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9hZGRyKCpiZF9hZGRyLCB0cmFuc3BvcnQpOwotICBpZiAoIXBfdGNiKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBTdHJpbmdQcmludGYoIiVzOiBlbmMgY2FsbGJhY2sgZm9yIHVua25vd24gYmRfYWRkciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnYXR0X2dldF9zZWNfYWN0KHBfdGNiKSA9PSBHQVRUX1NFQ19FTkNfUEVORElORykgcmV0dXJuOwotCi0gIGlmIChwX3RjYi0+cGVuZGluZ19lbmNfY2xjYi5lbXB0eSgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBTdHJpbmdQcmludGYoIiVzOiBubyBvcGVyYXRpb24gd2FpdGluZyBmb3IgZW5jcnlwdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRHQVRUX0NMQ0IqIHBfY2xjYiA9IHBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLmZyb250KCk7Ci0gIHBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLnBvcCgpOwotCi0gIGJvb2wgc3RhdHVzID0gZmFsc2U7Ci0gIGlmIChyZXN1bHQgPT0gQlRNX1NVQ0NFU1MpIHsKLSAgICBpZiAoZ2F0dF9nZXRfc2VjX2FjdChwX3RjYikgPT0gR0FUVF9TRUNfRU5DUllQVF9NSVRNKSB7Ci0gICAgICBzdGF0dXMgPSBCVE1fSXNMaW5rS2V5QXV0aGVkKCpiZF9hZGRyLCB0cmFuc3BvcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGF0dXMgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGdhdHRfc2VjX2NoZWNrX2NvbXBsZXRlKHN0YXR1cywgcF9jbGNiLCBwX3RjYi0+c2VjX2FjdCk7Ci0KLSAgLyogc3RhcnQgYWxsIG90aGVyIHBlbmRpbmcgb3BlcmF0aW9uIGluIHF1ZXVlICovCi0gIHN0ZDo6cXVldWU8dEdBVFRfQ0xDQio+IG5ld19wZW5kaW5nX2NsY2JzOwotICB3aGlsZSAoIXBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLmVtcHR5KCkpIHsKLSAgICB0R0FUVF9DTENCKiBwX2NsY2IgPSBwX3RjYi0+cGVuZGluZ19lbmNfY2xjYi5mcm9udCgpOwotICAgIHBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLnBvcCgpOwotICAgIGlmIChnYXR0X3NlY3VyaXR5X2NoZWNrX3N0YXJ0KHBfY2xjYikpIG5ld19wZW5kaW5nX2NsY2JzLnB1c2gocF9jbGNiKTsKLSAgfQotICBwX3RjYi0+cGVuZGluZ19lbmNfY2xjYiA9IG5ld19wZW5kaW5nX2NsY2JzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9ub3RpZnlfZW5jX2NtcGwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGxpbmsgZW5jcnlwdGlvbiBjb21wbGV0ZSBub3RpZmljYXRpb24gZm9yIGFsbCBlbmNyeXB0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaW5pdGlhdGVkIG91dHNpZGUgR0FUVC4KLSAqCi0gKiBSZXR1cm5zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9ub3RpZnlfZW5jX2NtcGwoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9hZGRyKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmICghcF90Y2IpIHsKLSAgICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICAgIm5vdGlmeSBHQVRUIGZvciBlbmNyeXB0aW9uIGNvbXBsZXRpb24gb2YgdW5rbm93biBkZXZpY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBHQVRUX01BWF9BUFBTOyBpKyspIHsKLSAgICBpZiAoZ2F0dF9jYi5jbF9yY2JbaV0uaW5fdXNlICYmIGdhdHRfY2IuY2xfcmNiW2ldLmFwcF9jYi5wX2VuY19jbXBsX2NiKSB7Ci0gICAgICAoKmdhdHRfY2IuY2xfcmNiW2ldLmFwcF9jYi5wX2VuY19jbXBsX2NiKShnYXR0X2NiLmNsX3JjYltpXS5nYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRfYWRkcik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdhdHRfZ2V0X3NlY19hY3QocF90Y2IpID09IEdBVFRfU0VDX0VOQ19QRU5ESU5HKSB7Ci0gICAgZ2F0dF9zZXRfc2VjX2FjdChwX3RjYiwgR0FUVF9TRUNfTk9ORSk7Ci0KLSAgICBzdGQ6OnF1ZXVlPHRHQVRUX0NMQ0IqPiBuZXdfcGVuZGluZ19jbGNiczsKLSAgICB3aGlsZSAoIXBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLmVtcHR5KCkpIHsKLSAgICAgIHRHQVRUX0NMQ0IqIHBfY2xjYiA9IHBfdGNiLT5wZW5kaW5nX2VuY19jbGNiLmZyb250KCk7Ci0gICAgICBwX3RjYi0+cGVuZGluZ19lbmNfY2xjYi5wb3AoKTsKLSAgICAgIGlmIChnYXR0X3NlY3VyaXR5X2NoZWNrX3N0YXJ0KHBfY2xjYikpIG5ld19wZW5kaW5nX2NsY2JzLnB1c2gocF9jbGNiKTsKLSAgICB9Ci0gICAgcF90Y2ItPnBlbmRpbmdfZW5jX2NsY2IgPSBuZXdfcGVuZGluZ19jbGNiczsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc2V0X3NlY19hY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBzZWNfYWN0IGluIGNsY2IKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3NldF9zZWNfYWN0KHRHQVRUX1RDQiogcF90Y2IsIHRHQVRUX1NFQ19BQ1RJT04gc2VjX2FjdCkgewotICBpZiAocF90Y2IpIHsKLSAgICBwX3RjYi0+c2VjX2FjdCA9IHNlY19hY3Q7Ci0gIH0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2dldF9zZWNfYWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGdldCB0aGUgc2VjX2FjdCBpbiBjbGNiCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NFQ19BQ1RJT04gZ2F0dF9nZXRfc2VjX2FjdCh0R0FUVF9UQ0IqIHBfdGNiKSB7Ci0gIHRHQVRUX1NFQ19BQ1RJT04gc2VjX2FjdCA9IEdBVFRfU0VDX05PTkU7Ci0gIGlmIChwX3RjYikgewotICAgIHNlY19hY3QgPSBwX3RjYi0+c2VjX2FjdDsKLSAgfQotICByZXR1cm4gc2VjX2FjdDsKLX0KLS8qKgotICogVGhpcyByb3V0aW5lIGRldGVybWluZSB0aGUgc2VjdXJpdHkgYWN0aW9uIGJhc2VkIG9uIGF1dGhfcmVxdWVzdCBhbmQgY3VycmVudAotICogbGluayBzdGF0dXMuIFJldHVybnMgdEdBVFRfU0VDX0FDVElPTiAoc2VjdXJpdHkgYWN0aW9uKQotICovCi10R0FUVF9TRUNfQUNUSU9OIGdhdHRfZGV0ZXJtaW5lX3NlY19hY3QodEdBVFRfQ0xDQiogcF9jbGNiKSB7Ci0gIHRHQVRUX1NFQ19BQ1RJT04gYWN0ID0gR0FUVF9TRUNfT0s7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBwX2NsY2ItPnBfdGNiOwotICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSA9IHBfY2xjYi0+YXV0aF9yZXE7Ci0gIGJvb2wgaXNfbGlua19lbmNyeXB0ZWQgPSBmYWxzZTsKLSAgYm9vbCBpc19saW5rX2tleV9rbm93biA9IGZhbHNlOwotICBib29sIGlzX2tleV9taXRtID0gZmFsc2U7Ci0gIHVpbnQ4X3Qga2V5X3R5cGU7Ci0gIHRCVE1fQkxFX1NFQ19SRVFfQUNUIHNlY19hY3QgPSBCVE1fQkxFX1NFQ19SRVFfQUNUX05PTkU7Ci0KLSAgaWYgKGF1dGhfcmVxID09IEdBVFRfQVVUSF9SRVFfTk9ORSkgcmV0dXJuIGFjdDsKLQotICBidG1fYmxlX2xpbmtfc2VjX2NoZWNrKHBfdGNiLT5wZWVyX2JkYSwgYXV0aF9yZXEsICZzZWNfYWN0KTsKLQotICAvKiBpZiBhIGVuY3J5cHRpb24gaXMgcGVuZGluZywgbmVlZCB0byB3YWl0ICovCi0gIGlmIChzZWNfYWN0ID09IEJUTV9CTEVfU0VDX1JFUV9BQ1RfRElTQ0FSRCAmJiBhdXRoX3JlcSAhPSBHQVRUX0FVVEhfUkVRX05PTkUpCi0gICAgcmV0dXJuIEdBVFRfU0VDX0VOQ19QRU5ESU5HOwotCi0gIGlzX2xpbmtfa2V5X2tub3duID0KLSAgICAgIEJUTV9Jc0xpbmtLZXlLbm93bihwX3RjYi0+cGVlcl9iZGEsIHBfY2xjYi0+cF90Y2ItPnRyYW5zcG9ydCk7Ci0gIGlzX2xpbmtfZW5jcnlwdGVkID0KLSAgICAgIEJUTV9Jc0VuY3J5cHRlZChwX3RjYi0+cGVlcl9iZGEsIHBfY2xjYi0+cF90Y2ItPnRyYW5zcG9ydCk7Ci0gIGlzX2tleV9taXRtID0gQlRNX0lzTGlua0tleUF1dGhlZChwX3RjYi0+cGVlcl9iZGEsIHBfY2xjYi0+cF90Y2ItPnRyYW5zcG9ydCk7Ci0KLSAgLyogZmlyc3QgY2hlY2sgbGluayBrZXkgdXBncmFkZSByZXF1aXJlZCBvciBub3QgKi8KLSAgc3dpdGNoIChhdXRoX3JlcSkgewotICAgIGNhc2UgR0FUVF9BVVRIX1JFUV9NSVRNOgotICAgIGNhc2UgR0FUVF9BVVRIX1JFUV9TSUdORURfTUlUTToKLSAgICAgIGlmICghaXNfa2V5X21pdG0pIGFjdCA9IEdBVFRfU0VDX0VOQ1JZUFRfTUlUTTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX0FVVEhfUkVRX05PX01JVE06Ci0gICAgY2FzZSBHQVRUX0FVVEhfUkVRX1NJR05FRF9OT19NSVRNOgotICAgICAgaWYgKCFpc19saW5rX2tleV9rbm93bikgYWN0ID0gR0FUVF9TRUNfRU5DUllQVF9OT19NSVRNOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogbm93IGNoZWNrIGxpbmsgbmVlZHMgdG8gYmUgZW5jcnlwdGVkIG9yIG5vdCBpZiB0aGUgbGluayBrZXkgdXBncmFkZSBpcyBub3QKLSAgICogcmVxdWlyZWQgKi8KLSAgaWYgKGFjdCA9PSBHQVRUX1NFQ19PSykgewotICAgIGlmIChwX3RjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSAmJgotICAgICAgICAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1dSSVRFKSAmJgotICAgICAgICAocF9jbGNiLT5vcF9zdWJ0eXBlID09IEdBVFRfV1JJVEVfTk9fUlNQKSkgewotICAgICAgLyogdGhpcyBpcyBhIHdyaXRlIGNvbW1hbmQgcmVxdWVzdAotICAgICAgICAgY2hlY2sgZGF0YSBzaWduaW5nIHJlcXVpcmVkIG9yIG5vdCAqLwotICAgICAgaWYgKCFpc19saW5rX2VuY3J5cHRlZCkgewotICAgICAgICBidG1fYmxlX2dldF9lbmNfa2V5X3R5cGUocF90Y2ItPnBlZXJfYmRhLCAma2V5X3R5cGUpOwotCi0gICAgICAgIGlmICgoa2V5X3R5cGUgJiBCVE1fTEVfS0VZX0xDU1JLKSAmJgotICAgICAgICAgICAgKChhdXRoX3JlcSA9PSBHQVRUX0FVVEhfUkVRX1NJR05FRF9OT19NSVRNKSB8fAotICAgICAgICAgICAgIChhdXRoX3JlcSA9PSBHQVRUX0FVVEhfUkVRX1NJR05FRF9NSVRNKSkpIHsKLSAgICAgICAgICBhY3QgPSBHQVRUX1NFQ19TSUdOX0RBVEE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYWN0ID0gR0FUVF9TRUNfRU5DUllQVDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIWlzX2xpbmtfZW5jcnlwdGVkKSB7Ci0gICAgICAgIGFjdCA9IEdBVFRfU0VDX0VOQ1JZUFQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGFjdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfZ2V0X2xpbmtfZW5jcnlwdF9zdGF0dXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIGVuY3J5cHRpb24gc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbGluawotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRHQVRUX1NUQVRVUyBsaW5rIGVuY3J5cHRpb24gc3RhdHVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBnYXR0X2dldF9saW5rX2VuY3J5cHRfc3RhdHVzKHRHQVRUX1RDQiYgdGNiKSB7Ci0gIHRHQVRUX1NUQVRVUyBlbmNyeXB0X3N0YXR1cyA9IEdBVFRfTk9UX0VOQ1JZUFRFRDsKLQotICBib29sIGVuY3J5cHRlZCA9IEJUTV9Jc0VuY3J5cHRlZCh0Y2IucGVlcl9iZGEsIHRjYi50cmFuc3BvcnQpOwotICBib29sIGxpbmtfa2V5X2tub3duID0gQlRNX0lzTGlua0tleUtub3duKHRjYi5wZWVyX2JkYSwgdGNiLnRyYW5zcG9ydCk7Ci0gIGJvb2wgbGlua19rZXlfYXV0aGVkID0gQlRNX0lzTGlua0tleUF1dGhlZCh0Y2IucGVlcl9iZGEsIHRjYi50cmFuc3BvcnQpOwotCi0gIGlmIChlbmNyeXB0ZWQgJiYgbGlua19rZXlfa25vd24pIHsKLSAgICBlbmNyeXB0X3N0YXR1cyA9IEdBVFRfRU5DUllQRURfTk9fTUlUTTsKLSAgICBpZiAobGlua19rZXlfYXV0aGVkKSB7Ci0gICAgICBlbmNyeXB0X3N0YXR1cyA9IEdBVFRfRU5DUllQRURfTUlUTTsKLSAgICB9Ci0gIH0KLQotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiZ2F0dF9nZXRfbGlua19lbmNyeXB0X3N0YXR1cyBzdGF0dXM9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRfc3RhdHVzKTsKLSAgcmV0dXJuIGVuY3J5cHRfc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9jb252ZXJ0X3NlY19hY3Rpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbnZlcnQgR0FUVCBzZWN1cml0eSBhY3Rpb24gZW51bSBpbnRvIGVxdWl2YWxlbnQKLSAqICAgICAgICAgICAgICAgICAgQlRNIEJMRSBzZWN1cml0eSBhY3Rpb24gZW51bQotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICB0cnVlIC0gY29udmVyc2F0aW9uIGlzIHN1Y2Nlc3NmdWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgZ2F0dF9jb252ZXJ0X3NlY19hY3Rpb24odEdBVFRfU0VDX0FDVElPTiBnYXR0X3NlY19hY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUKiBwX2J0bV9zZWNfYWN0KSB7Ci0gIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgc3dpdGNoIChnYXR0X3NlY19hY3QpIHsKLSAgICBjYXNlIEdBVFRfU0VDX0VOQ1JZUFQ6Ci0gICAgICAqcF9idG1fc2VjX2FjdCA9IEJUTV9CTEVfU0VDX0VOQ1JZUFQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdBVFRfU0VDX0VOQ1JZUFRfTk9fTUlUTToKLSAgICAgICpwX2J0bV9zZWNfYWN0ID0gQlRNX0JMRV9TRUNfRU5DUllQVF9OT19NSVRNOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHQVRUX1NFQ19FTkNSWVBUX01JVE06Ci0gICAgICAqcF9idG1fc2VjX2FjdCA9IEJUTV9CTEVfU0VDX0VOQ1JZUFRfTUlUTTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqIGNoZWNrIGxpbmsgc2VjdXJpdHksIHJldHVybiB0cnVlIGlmIHBfY2xjYiBzaG91bGQgYmUgYWRkZWQgYmFjayB0byBxdWV1ZSAqLwotYm9vbCBnYXR0X3NlY3VyaXR5X2NoZWNrX3N0YXJ0KHRHQVRUX0NMQ0IqIHBfY2xjYikgewotICB0R0FUVF9UQ0IqIHBfdGNiID0gcF9jbGNiLT5wX3RjYjsKLSAgdEdBVFRfU0VDX0FDVElPTiBzZWNfYWN0X29sZCA9IGdhdHRfZ2V0X3NlY19hY3QocF90Y2IpOwotCi0gIHRHQVRUX1NFQ19BQ1RJT04gZ2F0dF9zZWNfYWN0ID0gZ2F0dF9kZXRlcm1pbmVfc2VjX2FjdChwX2NsY2IpOwotCi0gIGlmIChzZWNfYWN0X29sZCA9PSBHQVRUX1NFQ19OT05FKSBnYXR0X3NldF9zZWNfYWN0KHBfdGNiLCBnYXR0X3NlY19hY3QpOwotCi0gIHN3aXRjaCAoZ2F0dF9zZWNfYWN0KSB7Ci0gICAgY2FzZSBHQVRUX1NFQ19TSUdOX0RBVEE6Ci0gICAgICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiJXM6IERvIGRhdGEgc2lnbmluZyIsIF9fZnVuY19fKTsKLSAgICAgIGdhdHRfc2lnbl9kYXRhKHBfY2xjYik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdBVFRfU0VDX0VOQ1JZUFQ6Ci0gICAgY2FzZSBHQVRUX1NFQ19FTkNSWVBUX05PX01JVE06Ci0gICAgY2FzZSBHQVRUX1NFQ19FTkNSWVBUX01JVE06Ci0gICAgICBpZiAoc2VjX2FjdF9vbGQgPCBHQVRUX1NFQ19FTkNSWVBUKSB7Ci0gICAgICAgIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCIlczogRW5jcnlwdCBub3cgb3Iga2V5IHVwZ3JlYWRlIGZpcnN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIGJ0bV9ibGVfc2VjX2FjdDsKLSAgICAgICAgZ2F0dF9jb252ZXJ0X3NlY19hY3Rpb24oZ2F0dF9zZWNfYWN0LCAmYnRtX2JsZV9zZWNfYWN0KTsKLSAgICAgICAgdEJUTV9TVEFUVVMgYnRtX3N0YXR1cyA9Ci0gICAgICAgICAgICBCVE1fU2V0RW5jcnlwdGlvbihwX3RjYi0+cGVlcl9iZGEsIHBfdGNiLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXR0X2VuY19jbXBsX2NiYWNrLCBOVUxMLCBidG1fYmxlX3NlY19hY3QpOwotICAgICAgICBpZiAoKGJ0bV9zdGF0dXMgIT0gQlRNX1NVQ0NFU1MpICYmIChidG1fc3RhdHVzICE9IEJUTV9DTURfU1RBUlRFRCkpIHsKLSAgICAgICAgICBMT0coRVJST1IpIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgIiVzIEJUTV9TZXRFbmNyeXB0aW9uIGZhaWxlZCBidG1fc3RhdHVzPSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIGJ0bV9zdGF0dXMpOwotICAgICAgICAgIGdhdHRfc2V0X3NlY19hY3QocF90Y2IsIEdBVFRfU0VDX05PTkUpOwotICAgICAgICAgIGdhdHRfc2V0X2NoX3N0YXRlKHBfdGNiLCBHQVRUX0NIX09QRU4pOwotCi0gICAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlNVRl9FTkNSWVBUSU9OLCBOVUxMKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgR0FUVF9TRUNfRU5DX1BFTkRJTkc6Ci0gICAgICAvKiB3YWl0IGZvciBsaW5rIGVuY3J5cG90aW9uIHRvIGZpbmlzaCAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGdhdHRfc2VjX2NoZWNrX2NvbXBsZXRlKHRydWUsIHBfY2xjYiwgZ2F0dF9zZWNfYWN0KTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svZ2F0dC9nYXR0X2NsLmNjIGIvc3RhY2svZ2F0dC9nYXR0X2NsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg5NmIzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2dhdHQvZ2F0dF9jbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gR0FUVCBjbGllbnQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svZWF0dC9lYXR0LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2RlZmluZSBHQVRUX1dSSVRFX0xPTkdfSERSX1NJWkUgNSAvKiAxIG9wY29kZSArIDIgaGFuZGxlICsgMiBvZmZzZXQgKi8KLSNkZWZpbmUgR0FUVF9SRUFEX0NIQVJfVkFMVUVfSERMIChHQVRUX1JFQURfQ0hBUl9WQUxVRSB8IDB4ODApCi0jZGVmaW5lIEdBVFRfUkVBRF9JTkNfU1JWX1VVSUQxMjggKEdBVFRfRElTQ19JTkNfU1JWQyB8IDB4OTApCi0KLSNkZWZpbmUgR0FUVF9QUkVQX1dSSVRFX1JTUF9NSU5fTEVOIDQKLSNkZWZpbmUgR0FUVF9OT1RJRklDQVRJT05fTUlOX0xFTiAyCi0jZGVmaW5lIEdBVFRfV1JJVEVfUlNQX01JTl9MRU4gMgotI2RlZmluZSBHQVRUX0lORk9fUlNQX01JTl9MRU4gMQotI2RlZmluZSBHQVRUX01UVV9SU1BfTUlOX0xFTiAyCi0jZGVmaW5lIEdBVFRfUkVBRF9CWV9UWVBFX1JTUF9NSU5fTEVOIDEKLQotI2RlZmluZSBMMkNBUF9QS1RfT1ZFUkhFQUQgNAotCi11c2luZyBiYXNlOjpTdHJpbmdQcmludGY7Ci11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci11c2luZyBibHVldG9vdGg6OmVhdHQ6OkVhdHRFeHRlbnNpb247Ci11c2luZyBibHVldG9vdGg6OmVhdHQ6OkVhdHRDaGFubmVsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgRyBMIE8gQiBBIEwgICAgICBHIEEgVCBUICAgICAgIEQgQSBUIEEgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfc2VuZF9wcmVwYXJlX3dyaXRlKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IpOwotCi11aW50OF90IGRpc2NfdHlwZV90b19hdHRfb3Bjb2RlW0dBVFRfRElTQ19NQVhdID0gewotICAgIDAsCi0gICAgR0FUVF9SRVFfUkVBRF9CWV9HUlBfVFlQRSwgLyogIEdBVFRfRElTQ19TUlZDX0FMTCA9IDEsICovCi0gICAgR0FUVF9SRVFfRklORF9UWVBFX1ZBTFVFLCAgLyogIEdBVFRfRElTQ19TUlZDX0JZX1VVSUQsICAqLwotICAgIEdBVFRfUkVRX1JFQURfQllfVFlQRSwgICAgIC8qICBHQVRUX0RJU0NfSU5DX1NSVkMsICAgICAgKi8KLSAgICBHQVRUX1JFUV9SRUFEX0JZX1RZUEUsICAgICAvKiAgR0FUVF9ESVNDX0NIQVIsICAgICAgICAgICovCi0gICAgR0FUVF9SRVFfRklORF9JTkZPICAgICAgICAgLyogIEdBVFRfRElTQ19DSEFSX0RTQ1BULCAgICAqLwotfTsKLQotdWludDE2X3QgZGlzY190eXBlX3RvX3V1aWRbR0FUVF9ESVNDX01BWF0gPSB7Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICBHQVRUX1VVSURfUFJJX1NFUlZJQ0UsICAgICAvKiA8c2VydmljZT4gRElTQ19TUlZDX0FMTCAqLwotICAgIEdBVFRfVVVJRF9QUklfU0VSVklDRSwgICAgIC8qIDxzZXJ2aWNlPiBmb3IgRElTQ19TRVJWQ19CWV9VVUlEICovCi0gICAgR0FUVF9VVUlEX0lOQ0xVREVfU0VSVklDRSwgLyogPGluY2x1ZGVfc2VydmljZT4gZm9yIERJU0NfSU5DX1NSVkMgKi8KLSAgICBHQVRUX1VVSURfQ0hBUl9ERUNMQVJFLCAgICAvKiA8Y2hhcmFjdGVyaXN0aWM+IGZvciBESVNDX0NIQVIgKi8KLSAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyB0eXBlIGZpbHRlcmluZyBmb3IgRElTQ19DSEFSX0RTQ1BUICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9hY3RfZGlzY292ZXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHQVRUIGRpc2NvdmVyeSBvcGVyYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfYWN0X2Rpc2NvdmVyeSh0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgdWludDhfdCBvcF9jb2RlID0gZGlzY190eXBlX3RvX2F0dF9vcGNvZGVbcF9jbGNiLT5vcF9zdWJ0eXBlXTsKLQotICBpZiAocF9jbGNiLT5zX2hhbmRsZSA+IHBfY2xjYi0+ZV9oYW5kbGUgfHwgcF9jbGNiLT5zX2hhbmRsZSA9PSAwKSB7Ci0gICAgTE9HX0RFQlVHKCJDb21wbGV0ZWQgR0FUVCBkaXNjb3Zlcnkgb2YgYWxsIGhhbmRsZSByYW5nZXMiKTsKLSAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX1NVQ0NFU1MsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRHQVRUX0NMX01TRyBjbF9yZXE7Ci0gIG1lbXNldCgmY2xfcmVxLCAwLCBzaXplb2YodEdBVFRfQ0xfTVNHKSk7Ci0KLSAgY2xfcmVxLmJyb3dzZS5zX2hhbmRsZSA9IHBfY2xjYi0+c19oYW5kbGU7Ci0gIGNsX3JlcS5icm93c2UuZV9oYW5kbGUgPSBwX2NsY2ItPmVfaGFuZGxlOwotCi0gIGlmIChkaXNjX3R5cGVfdG9fdXVpZFtwX2NsY2ItPm9wX3N1YnR5cGVdICE9IDApIHsKLSAgICBjbF9yZXEuYnJvd3NlLnV1aWQgPQotICAgICAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdChkaXNjX3R5cGVfdG9fdXVpZFtwX2NsY2ItPm9wX3N1YnR5cGVdKTsKLSAgfQotCi0gIGlmIChwX2NsY2ItPm9wX3N1YnR5cGUgPT0KLSAgICAgIEdBVFRfRElTQ19TUlZDX0JZX1VVSUQpIC8qIGZpbGwgaW4gdGhlIEZpbmRCeVR5cGVWYWx1ZSByZXF1ZXN0IGluZm8qLwotICB7Ci0gICAgY2xfcmVxLmZpbmRfdHlwZV92YWx1ZS51dWlkID0KLSAgICAgICAgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoZGlzY190eXBlX3RvX3V1aWRbcF9jbGNiLT5vcF9zdWJ0eXBlXSk7Ci0gICAgY2xfcmVxLmZpbmRfdHlwZV92YWx1ZS5zX2hhbmRsZSA9IHBfY2xjYi0+c19oYW5kbGU7Ci0gICAgY2xfcmVxLmZpbmRfdHlwZV92YWx1ZS5lX2hhbmRsZSA9IHBfY2xjYi0+ZV9oYW5kbGU7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IHBfY2xjYi0+dXVpZC5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpOwotICAgIGNsX3JlcS5maW5kX3R5cGVfdmFsdWUudmFsdWVfbGVuID0gc2l6ZTsKLSAgICBpZiAoc2l6ZSA9PSBVdWlkOjprTnVtQnl0ZXMxNikgewotICAgICAgdWludDhfdCogcCA9IGNsX3JlcS5maW5kX3R5cGVfdmFsdWUudmFsdWU7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2xjYi0+dXVpZC5BczE2Qml0KCkpOwotICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSBVdWlkOjprTnVtQnl0ZXMzMikgewotICAgICAgLyogaWYgc2VydmljZSB0eXBlIGlzIDMyIGJpdHMgVVVJRCwgY29udmVydCBpdCBub3cgKi8KLSAgICAgIG1lbWNweShjbF9yZXEuZmluZF90eXBlX3ZhbHVlLnZhbHVlLCBwX2NsY2ItPnV1aWQuVG8xMjhCaXRMRSgpLmRhdGEoKSwKLSAgICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczEyOCk7Ci0gICAgICBjbF9yZXEuZmluZF90eXBlX3ZhbHVlLnZhbHVlX2xlbiA9IFV1aWQ6OmtOdW1CeXRlczEyODsKLSAgICB9IGVsc2UKLSAgICAgIG1lbWNweShjbF9yZXEuZmluZF90eXBlX3ZhbHVlLnZhbHVlLCBwX2NsY2ItPnV1aWQuVG8xMjhCaXRMRSgpLmRhdGEoKSwKLSAgICAgICAgICAgICBzaXplKTsKLSAgfQotCi0gIHRHQVRUX1NUQVRVUyBzdCA9IGF0dHBfc2VuZF9jbF9tc2coKnBfY2xjYi0+cF90Y2IsIHBfY2xjYiwgb3BfY29kZSwgJmNsX3JlcSk7Ci0gIGlmIChzdCAhPSBHQVRUX1NVQ0NFU1MgJiYgc3QgIT0gR0FUVF9DTURfU1RBUlRFRCkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gc2VuZCBBVFQgbWVzc2FnZSIpOwotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfRVJST1IsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2FjdF9yZWFkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHQVRUIHJlYWQgb3BlcmF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X2FjdF9yZWFkKHRHQVRUX0NMQ0IqIHBfY2xjYiwgdWludDE2X3Qgb2Zmc2V0KSB7Ci0gIHRHQVRUX1RDQiYgdGNiID0gKnBfY2xjYi0+cF90Y2I7Ci0gIHRHQVRUX1NUQVRVUyBydCA9IEdBVFRfSU5URVJOQUxfRVJST1I7Ci0gIHRHQVRUX0NMX01TRyBtc2c7Ci0gIHVpbnQ4X3Qgb3BfY29kZSA9IDA7Ci0KLSAgbWVtc2V0KCZtc2csIDAsIHNpemVvZih0R0FUVF9DTF9NU0cpKTsKLQotICBzd2l0Y2ggKHBfY2xjYi0+b3Bfc3VidHlwZSkgewotICAgIGNhc2UgR0FUVF9SRUFEX0NIQVJfVkFMVUU6Ci0gICAgY2FzZSBHQVRUX1JFQURfQllfVFlQRToKLSAgICAgIG9wX2NvZGUgPSBHQVRUX1JFUV9SRUFEX0JZX1RZUEU7Ci0gICAgICBtc2cuYnJvd3NlLnNfaGFuZGxlID0gcF9jbGNiLT5zX2hhbmRsZTsKLSAgICAgIG1zZy5icm93c2UuZV9oYW5kbGUgPSBwX2NsY2ItPmVfaGFuZGxlOwotICAgICAgaWYgKHBfY2xjYi0+b3Bfc3VidHlwZSA9PSBHQVRUX1JFQURfQllfVFlQRSkKLSAgICAgICAgbXNnLmJyb3dzZS51dWlkID0gcF9jbGNiLT51dWlkOwotICAgICAgZWxzZSB7Ci0gICAgICAgIG1zZy5icm93c2UudXVpZCA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0RFQ0xBUkUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdBVFRfUkVBRF9DSEFSX1ZBTFVFX0hETDoKLSAgICBjYXNlIEdBVFRfUkVBRF9CWV9IQU5ETEU6Ci0gICAgICBpZiAoIXBfY2xjYi0+Y291bnRlcikgewotICAgICAgICBvcF9jb2RlID0gR0FUVF9SRVFfUkVBRDsKLSAgICAgICAgbXNnLmhhbmRsZSA9IHBfY2xjYi0+c19oYW5kbGU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXBfY2xjYi0+Zmlyc3RfcmVhZF9ibG9iX2FmdGVyX3JlYWQpCi0gICAgICAgICAgcF9jbGNiLT5maXJzdF9yZWFkX2Jsb2JfYWZ0ZXJfcmVhZCA9IHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwX2NsY2ItPmZpcnN0X3JlYWRfYmxvYl9hZnRlcl9yZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBmaXJzdF9yZWFkX2Jsb2JfYWZ0ZXJfcmVhZD0iCi0gICAgICAgICAgICAgICAgPDwgcF9jbGNiLT5maXJzdF9yZWFkX2Jsb2JfYWZ0ZXJfcmVhZDsKLSAgICAgICAgb3BfY29kZSA9IEdBVFRfUkVRX1JFQURfQkxPQjsKLSAgICAgICAgbXNnLnJlYWRfYmxvYi5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG1zZy5yZWFkX2Jsb2IuaGFuZGxlID0gcF9jbGNiLT5zX2hhbmRsZTsKLSAgICAgIH0KLSAgICAgIHBfY2xjYi0+b3Bfc3VidHlwZSAmPSB+MHg4MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1JFQURfUEFSVElBTDoKLSAgICAgIG9wX2NvZGUgPSBHQVRUX1JFUV9SRUFEX0JMT0I7Ci0gICAgICBtc2cucmVhZF9ibG9iLmhhbmRsZSA9IHBfY2xjYi0+c19oYW5kbGU7Ci0gICAgICBtc2cucmVhZF9ibG9iLm9mZnNldCA9IG9mZnNldDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1JFQURfTVVMVElQTEU6Ci0gICAgICBvcF9jb2RlID0gR0FUVF9SRVFfUkVBRF9NVUxUSTsKLSAgICAgIG1lbWNweSgmbXNnLnJlYWRfbXVsdGksIHBfY2xjYi0+cF9hdHRyX2J1Ziwgc2l6ZW9mKHRHQVRUX1JFQURfTVVMVEkpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUX1JFQURfSU5DX1NSVl9VVUlEMTI4OgotICAgICAgb3BfY29kZSA9IEdBVFRfUkVRX1JFQUQ7Ci0gICAgICBtc2cuaGFuZGxlID0gcF9jbGNiLT5zX2hhbmRsZTsKLSAgICAgIHBfY2xjYi0+b3Bfc3VidHlwZSAmPSB+MHg5MDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gcmVhZCB0eXBlOiIgPDwgK3BfY2xjYi0+b3Bfc3VidHlwZTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKG9wX2NvZGUgIT0gMCkgcnQgPSBhdHRwX3NlbmRfY2xfbXNnKHRjYiwgcF9jbGNiLCBvcF9jb2RlLCAmbXNnKTsKLQotICBpZiAob3BfY29kZSA9PSAwIHx8IChydCAhPSBHQVRUX1NVQ0NFU1MgJiYgcnQgIT0gR0FUVF9DTURfU1RBUlRFRCkpIHsKLSAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBydCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqIEdBVFQgd3JpdGUgb3BlcmF0aW9uICovCi12b2lkIGdhdHRfYWN0X3dyaXRlKHRHQVRUX0NMQ0IqIHBfY2xjYiwgdWludDhfdCBzZWNfYWN0KSB7Ci0gIHRHQVRUX1RDQiYgdGNiID0gKnBfY2xjYi0+cF90Y2I7Ci0KLSAgQ0hFQ0socF9jbGNiLT5wX2F0dHJfYnVmKTsKLSAgdEdBVFRfVkFMVUUmIGF0dHIgPSAqKCh0R0FUVF9WQUxVRSopcF9jbGNiLT5wX2F0dHJfYnVmKTsKLQotICB1aW50MTZfdCBwYXlsb2FkX3NpemUgPSBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3R4KHRjYiwgcF9jbGNiLT5jaWQpOwotCi0gIHN3aXRjaCAocF9jbGNiLT5vcF9zdWJ0eXBlKSB7Ci0gICAgY2FzZSBHQVRUX1dSSVRFX05PX1JTUDogewotICAgICAgcF9jbGNiLT5zX2hhbmRsZSA9IGF0dHIuaGFuZGxlOwotICAgICAgdWludDhfdCBvcF9jb2RlID0gKHNlY19hY3QgPT0gR0FUVF9TRUNfU0lHTl9EQVRBKSA/IEdBVFRfU0lHTl9DTURfV1JJVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHQVRUX0NNRF9XUklURTsKLSAgICAgIHRHQVRUX1NUQVRVUyBydCA9IGdhdHRfc2VuZF93cml0ZV9tc2codGNiLCBwX2NsY2IsIG9wX2NvZGUsIGF0dHIuaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxlbiwgMCwgYXR0ci52YWx1ZSk7Ci0gICAgICBpZiAocnQgIT0gR0FUVF9DTURfU1RBUlRFRCkgewotICAgICAgICBpZiAocnQgIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgTE9HKEVSUk9SKSA8PCBTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICJnYXR0X2FjdF93cml0ZSgpIGZhaWxlZCBvcF9jb2RlPTB4JXggcnQ9JWQiLCBvcF9jb2RlLCBydCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgcnQsIE5VTEwpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNhc2UgR0FUVF9XUklURTogewotICAgICAgaWYgKGF0dHIubGVuIDw9IChwYXlsb2FkX3NpemUgLSBHQVRUX0hEUl9TSVpFKSkgewotICAgICAgICBwX2NsY2ItPnNfaGFuZGxlID0gYXR0ci5oYW5kbGU7Ci0KLSAgICAgICAgdEdBVFRfU1RBVFVTIHJ0ID0gZ2F0dF9zZW5kX3dyaXRlX21zZygKLSAgICAgICAgICAgIHRjYiwgcF9jbGNiLCBHQVRUX1JFUV9XUklURSwgYXR0ci5oYW5kbGUsIGF0dHIubGVuLCAwLCBhdHRyLnZhbHVlKTsKLSAgICAgICAgaWYgKHJ0ICE9IEdBVFRfU1VDQ0VTUyAmJiBydCAhPSBHQVRUX0NNRF9TVEFSVEVEICYmCi0gICAgICAgICAgICBydCAhPSBHQVRUX0NPTkdFU1RFRCkgewotICAgICAgICAgIGlmIChydCAhPSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICJnYXR0X2FjdF93cml0ZSgpIGZhaWxlZCBvcF9jb2RlPTB4JXggcnQ9JWQiLCBHQVRUX1JFUV9XUklURSwKLSAgICAgICAgICAgICAgICBydCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIHJ0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBwcmVwYXJlIHdyaXRlIGZvciBsb25nIGF0dHJpYnV0ZSAqLwotICAgICAgICBnYXR0X3NlbmRfcHJlcGFyZV93cml0ZSh0Y2IsIHBfY2xjYik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBHQVRUX1dSSVRFX1BSRVBBUkU6Ci0gICAgICBnYXR0X3NlbmRfcHJlcGFyZV93cml0ZSh0Y2IsIHBfY2xjYik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQ0hFQ0soZmFsc2UpIDw8ICJVbmtub3duIHdyaXRlIHR5cGUiIDw8IHBfY2xjYi0+b3Bfc3VidHlwZTsKLSAgICAgIHJldHVybjsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc2VuZF9xdWV1ZV93cml0ZV9jYW5jZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmQgcXVldWUgd3JpdGUgY2FuY2VsCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfc2VuZF9xdWV1ZV93cml0ZV9jYW5jZWwodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9FWEVDX0ZMQUcgZmxhZykgewotICB0R0FUVF9TVEFUVVMgcnQ7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICB0R0FUVF9DTF9NU0cgZ2F0dF9jbF9tc2c7Ci0gIGdhdHRfY2xfbXNnLmV4ZWNfd3JpdGUgPSBmbGFnOwotICBydCA9IGF0dHBfc2VuZF9jbF9tc2codGNiLCBwX2NsY2IsIEdBVFRfUkVRX0VYRUNfV1JJVEUsICZnYXR0X2NsX21zZyk7Ci0KLSAgaWYgKHJ0ICE9IEdBVFRfU1VDQ0VTUykgewotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIHJ0LCBOVUxMKTsKLSAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfY2hlY2tfd3JpdGVfbG9uZ190ZXJtaW5hdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRvIHRlcm1pbmF0ZSB3cml0ZSBsb25nIG9yIG5vdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWU6IHdyaXRlIGxvbmcgaXMgdGVybWluYXRlZDsgZmFsc2Uga2VlcCBzZW5kaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGdhdHRfY2hlY2tfd3JpdGVfbG9uZ190ZXJtaW5hdGUodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9WQUxVRSogcF9yc3BfdmFsdWUpIHsKLSAgdEdBVFRfVkFMVUUqIHBfYXR0ciA9ICh0R0FUVF9WQUxVRSopcF9jbGNiLT5wX2F0dHJfYnVmOwotICBib29sIHRlcm1pbmF0ZSA9IGZhbHNlOwotICB0R0FUVF9FWEVDX0ZMQUcgZmxhZyA9IEdBVFRfUFJFUF9XUklURV9FWEVDOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0gIC8qIGNoZWNrIHRoZSBmaXJzdCB3cml0ZSByZXNwb25zZSBzdGF0dXMgKi8KLSAgaWYgKHBfcnNwX3ZhbHVlICE9IE5VTEwpIHsKLSAgICBpZiAocF9yc3BfdmFsdWUtPmhhbmRsZSAhPSBwX2F0dHItPmhhbmRsZSB8fAotICAgICAgICBwX3JzcF92YWx1ZS0+bGVuICE9IHBfY2xjYi0+Y291bnRlciB8fAotICAgICAgICBtZW1jbXAocF9yc3BfdmFsdWUtPnZhbHVlLCBwX2F0dHItPnZhbHVlICsgcF9hdHRyLT5vZmZzZXQsCi0gICAgICAgICAgICAgICBwX3JzcF92YWx1ZS0+bGVuKSkgewotICAgICAgLyogZGF0YSBkb2VzIG5vdCBtYXRjaCAgICAqLwotICAgICAgcF9jbGNiLT5zdGF0dXMgPSBHQVRUX0VSUk9SOwotICAgICAgZmxhZyA9IEdBVFRfUFJFUF9XUklURV9DQU5DRUw7Ci0gICAgICB0ZXJtaW5hdGUgPSB0cnVlOwotICAgIH0gZWxzZSAvKiByZXNwb25zZSBjaGVja2luZyBpcyBnb29kICovCi0gICAgewotICAgICAgcF9jbGNiLT5zdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0gICAgICAvKiB1cGRhdGUgd3JpdGUgb2Zmc2V0IGFuZCBjaGVjayBpZiBlbmQgb2YgYXR0cmlidXRlIHZhbHVlICovCi0gICAgICBpZiAoKHBfYXR0ci0+b2Zmc2V0ICs9IHBfcnNwX3ZhbHVlLT5sZW4pID49IHBfYXR0ci0+bGVuKSB0ZXJtaW5hdGUgPSB0cnVlOwotICAgIH0KLSAgfQotICBpZiAodGVybWluYXRlICYmIHBfY2xjYi0+b3Bfc3VidHlwZSAhPSBHQVRUX1dSSVRFX1BSRVBBUkUpIHsKLSAgICBnYXR0X3NlbmRfcXVldWVfd3JpdGVfY2FuY2VsKHRjYiwgcF9jbGNiLCBmbGFnKTsKLSAgfQotICByZXR1cm4gdGVybWluYXRlOwotfQotCi0vKiogU2VuZCBwcmVwYXJlIHdyaXRlICovCi12b2lkIGdhdHRfc2VuZF9wcmVwYXJlX3dyaXRlKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgdEdBVFRfVkFMVUUqIHBfYXR0ciA9ICh0R0FUVF9WQUxVRSopcF9jbGNiLT5wX2F0dHJfYnVmOwotICB1aW50OF90IHR5cGUgPSBwX2NsY2ItPm9wX3N1YnR5cGU7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCBTdHJpbmdQcmludGYoIiB0eXBlPTB4JXgiLCB0eXBlKTsKLSAgdWludDE2X3QgdG9fc2VuZCA9IHBfYXR0ci0+bGVuIC0gcF9hdHRyLT5vZmZzZXQ7Ci0KLSAgdWludDE2X3QgcGF5bG9hZF9zaXplID0gZ2F0dF90Y2JfZ2V0X3BheWxvYWRfc2l6ZV90eCh0Y2IsIHBfY2xjYi0+Y2lkKTsKLSAgaWYgKHRvX3NlbmQgPiAocGF5bG9hZF9zaXplIC0KLSAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9MT05HX0hEUl9TSVpFKSkgLyogMiA9IHVpbnQxNl90IG9mZnNldCBieXRlcyAgKi8KLSAgICB0b19zZW5kID0gcGF5bG9hZF9zaXplIC0gR0FUVF9XUklURV9MT05HX0hEUl9TSVpFOwotCi0gIHBfY2xjYi0+c19oYW5kbGUgPSBwX2F0dHItPmhhbmRsZTsKLQotICB1aW50MTZfdCBvZmZzZXQgPSBwX2F0dHItPm9mZnNldDsKLSAgaWYgKHR5cGUgPT0gR0FUVF9XUklURV9QUkVQQVJFKSB7Ci0gICAgb2Zmc2V0ICs9IHBfY2xjYi0+c3RhcnRfb2Zmc2V0OwotICB9Ci0KLSAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIm9mZnNldCA9MHgleCBsZW49JWQiLCBvZmZzZXQsIHRvX3NlbmQpOwotCi0gIHRHQVRUX1NUQVRVUyBydCA9IGdhdHRfc2VuZF93cml0ZV9tc2coCi0gICAgICB0Y2IsIHBfY2xjYiwgR0FUVF9SRVFfUFJFUEFSRV9XUklURSwgcF9hdHRyLT5oYW5kbGUsIHRvX3NlbmQsIC8qIGxlbmd0aCAqLwotICAgICAgb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZCBhcyBvZmZzZXQgKi8KLSAgICAgIHBfYXR0ci0+dmFsdWUgKyBwX2F0dHItPm9mZnNldCk7IC8qIGRhdGEgKi8KLQotICAvKiByZW1lbWJlciB0aGUgd3JpdGUgbG9uZyBhdHRyaWJ1dGUgbGVuZ3RoICovCi0gIHBfY2xjYi0+Y291bnRlciA9IHRvX3NlbmQ7Ci0KLSAgaWYgKHJ0ICE9IEdBVFRfU1VDQ0VTUyAmJiBydCAhPSBHQVRUX0NNRF9TVEFSVEVEICYmIHJ0ICE9IEdBVFRfQ09OR0VTVEVEKSB7Ci0gICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgcnQsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfZmluZF90eXBlX3ZhbHVlX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBmaW5kIGJ5IHR5cGUgdmFsdWUgcmVzcG9uc2UuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfcHJvY2Vzc19maW5kX3R5cGVfdmFsdWVfcnNwKFVOVVNFRF9BVFRSIHRHQVRUX1RDQiYgdGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTENCKiBwX2NsY2IsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIHRHQVRUX0RJU0NfUkVTIHJlc3VsdDsKLSAgdWludDhfdCogcCA9IHBfZGF0YTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICAvKiB1bmV4cGVjdGVkIHJlc3BvbnNlICovCi0gIGlmIChwX2NsY2ItPm9wZXJhdGlvbiAhPSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZIHx8Ci0gICAgICBwX2NsY2ItPm9wX3N1YnR5cGUgIT0gR0FUVF9ESVNDX1NSVkNfQllfVVVJRCkKLSAgICByZXR1cm47Ci0KLSAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZih0R0FUVF9ESVNDX1JFUykpOwotICByZXN1bHQudHlwZSA9IGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9QUklfU0VSVklDRSk7Ci0KLSAgLyogcmV0dXJucyBhIHNlcmllcyBvZiBoYW5kbGUgcmFuZ2VzICovCi0gIHdoaWxlIChsZW4gPj0gNCkgewotICAgIFNUUkVBTV9UT19VSU5UMTYocmVzdWx0LmhhbmRsZSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihyZXN1bHQudmFsdWUuZ3JvdXBfdmFsdWUuZV9oYW5kbGUsIHApOwotICAgIHJlc3VsdC52YWx1ZS5ncm91cF92YWx1ZS5zZXJ2aWNlX3R5cGUgPSBwX2NsY2ItPnV1aWQ7Ci0KLSAgICBsZW4gLT0gNDsKLQotICAgIGlmIChwX2NsY2ItPnBfcmVnLT5hcHBfY2IucF9kaXNjX3Jlc19jYikKLSAgICAgICgqcF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfZGlzY19yZXNfY2IpKAotICAgICAgICAgIHBfY2xjYi0+Y29ubl9pZCwgc3RhdGljX2Nhc3Q8dEdBVFRfRElTQ19UWVBFPihwX2NsY2ItPm9wX3N1YnR5cGUpLAotICAgICAgICAgICZyZXN1bHQpOwotICB9Ci0KLSAgLyogbGFzdCBoYW5kbGUgICsgMSAqLwotICBwX2NsY2ItPnNfaGFuZGxlID0gKHJlc3VsdC52YWx1ZS5ncm91cF92YWx1ZS5lX2hhbmRsZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgID8gMAotICAgICAgICAgICAgICAgICAgICAgICAgIDogKHJlc3VsdC52YWx1ZS5ncm91cF92YWx1ZS5lX2hhbmRsZSArIDEpOwotICAvKiBpbml0aWF0ZSBhbm90aGVyIHJlcXVlc3QgKi8KLSAgZ2F0dF9hY3RfZGlzY292ZXJ5KHBfY2xjYik7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9wcm9jZXNzX3JlYWRfaW5mb19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgcmVhZCBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgICByZXNwb25zZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9wcm9jZXNzX3JlYWRfaW5mb19yc3AoVU5VU0VEX0FUVFIgdEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICB0R0FUVF9ESVNDX1JFUyByZXN1bHQ7Ci0gIHVpbnQ4X3QgKnAgPSBwX2RhdGEsIHV1aWRfbGVuID0gMCwgdHlwZTsKLQotICBpZiAobGVuIDwgR0FUVF9JTkZPX1JTUF9NSU5fTEVOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCBJbmZvIFJlc3BvbnNlIFBEVSByZWNlaXZlZCwgZGlzY2FyZC4iOwotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfSU5WQUxJRF9QRFUsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotICAvKiB1bmV4cGVjdGVkIHJlc3BvbnNlICovCi0gIGlmIChwX2NsY2ItPm9wZXJhdGlvbiAhPSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZIHx8Ci0gICAgICBwX2NsY2ItPm9wX3N1YnR5cGUgIT0gR0FUVF9ESVNDX0NIQVJfRFNDUFQpCi0gICAgcmV0dXJuOwotCi0gIFNUUkVBTV9UT19VSU5UOCh0eXBlLCBwKTsKLSAgbGVuIC09IDE7Ci0KLSAgaWYgKHR5cGUgPT0gR0FUVF9JTkZPX1RZUEVfUEFJUl8xNikKLSAgICB1dWlkX2xlbiA9IFV1aWQ6OmtOdW1CeXRlczE2OwotICBlbHNlIGlmICh0eXBlID09IEdBVFRfSU5GT19UWVBFX1BBSVJfMTI4KQotICAgIHV1aWRfbGVuID0gVXVpZDo6a051bUJ5dGVzMTI4OwotCi0gIHdoaWxlIChsZW4gPj0gdXVpZF9sZW4gKyAyKSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihyZXN1bHQuaGFuZGxlLCBwKTsKLQotICAgIGlmICh1dWlkX2xlbiA+IDApIHsKLSAgICAgIGlmICghZ2F0dF9wYXJzZV91dWlkX2Zyb21fY21kKCZyZXN1bHQudHlwZSwgdXVpZF9sZW4sICZwKSkgYnJlYWs7Ci0gICAgfSBlbHNlCi0gICAgICByZXN1bHQudHlwZSA9IHBfY2xjYi0+dXVpZDsKLQotICAgIGxlbiAtPSAodXVpZF9sZW4gKyAyKTsKLQotICAgIGlmIChwX2NsY2ItPnBfcmVnLT5hcHBfY2IucF9kaXNjX3Jlc19jYikKLSAgICAgICgqcF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfZGlzY19yZXNfY2IpKAotICAgICAgICAgIHBfY2xjYi0+Y29ubl9pZCwgc3RhdGljX2Nhc3Q8dEdBVFRfRElTQ19UWVBFPihwX2NsY2ItPm9wX3N1YnR5cGUpLAotICAgICAgICAgICZyZXN1bHQpOwotICB9Ci0KLSAgcF9jbGNiLT5zX2hhbmRsZSA9IChyZXN1bHQuaGFuZGxlID09IDApID8gMCA6IChyZXN1bHQuaGFuZGxlICsgMSk7Ci0gIC8qIGluaXRpYXRlIGFub3RoZXIgcmVxdWVzdCAqLwotICBnYXR0X2FjdF9kaXNjb3ZlcnkocF9jbGNiKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2NfZGlzY19lcnJvcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgdGhlIHJlYWQgYnkgdHlwZSByZXNwb25zZSBhbmQgc2VuZCBhbm90aGVyIHJlcXVlc3QKLSAqICAgICAgICAgICAgICAgICAgaWYgbmVlZGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2NfZGlzY19lcnJvcl9yc3AoVU5VU0VEX0FUVFIgdEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3Bjb2RlLCBVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlYXNvbikgewotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gKHRHQVRUX1NUQVRVUylyZWFzb247Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigicmVhc29uOiAlMDJ4IGNtZF9jb2RlICUwNHgiLCByZWFzb24sIG9wY29kZSk7Ci0KLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEU6Ci0gICAgY2FzZSBHQVRUX1JFUV9GSU5EX1RZUEVfVkFMVUU6Ci0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX0JZX1RZUEU6Ci0gICAgY2FzZSBHQVRUX1JFUV9GSU5EX0lORk86Ci0gICAgICBpZiAocmVhc29uID09IEdBVFRfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICAgICAgVkxPRygxKSA8PCAiRGlzY292ZXJ5IGNvbXBsZXRlZCI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HKEVSUk9SKSA8PCBTdHJpbmdQcmludGYoIkluY29ycmVjdCBkaXNjb3Zlcnkgb3Bjb2RlICUwNHgiLCBvcGNvZGUpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBzdGF0dXMsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9wcm9jZXNzX2Vycm9yX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlcnJvciByZXNwb25zZQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2Nlc3NfZXJyb3JfcnNwKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwgdWludDhfdCogcF9kYXRhKSB7Ci0gIHVpbnQ4X3Qgb3Bjb2RlLCAqcCA9IHBfZGF0YTsKLSAgdWludDhfdCByZWFzb247Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdEdBVFRfVkFMVUUqIHBfYXR0ciA9ICh0R0FUVF9WQUxVRSopcF9jbGNiLT5wX2F0dHJfYnVmOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKGxlbiA8IDQpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc5NTkxNjg4Iik7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgcmVzcG9uc2UgdG9vIHNob3J0IjsKLSAgICAvLyBTcGVjaWZpY2F0aW9uIGRvZXMgbm90IGNsZWFybHkgZGVmaW5lIHdoYXQgc2hvdWxkIGhhcHBlbiBpZiBlcnJvcgotICAgIC8vIHJlc3BvbnNlIGlzIHRvbyBzaG9ydC4gR2VuZXJhbCBydWxlIGluIEJUIFNwZWMgNS4wIFZvbCAzLCBQYXJ0IEYgMy40LjEuMQotICAgIC8vIGlzOiAiSWYgYW4gZXJyb3IgY29kZSBpcyByZWNlaXZlZCBpbiB0aGUgRXJyb3IgUmVzcG9uc2UgdGhhdCBpcyBub3QKLSAgICAvLyB1bmRlcnN0b29kIGJ5IHRoZSBjbGllbnQsIGZvciBleGFtcGxlIGFuIGVycm9yIGNvZGUgdGhhdCB3YXMgcmVzZXJ2ZWQgZm9yCi0gICAgLy8gZnV0dXJlIHVzZSB0aGF0IGlzIG5vdyBiZWluZyB1c2VkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcwotICAgIC8vIHNwZWNpZmljYXRpb24sIHRoZW4gdGhlIEVycm9yIFJlc3BvbnNlIHNoYWxsIHN0aWxsIGJlIGNvbnNpZGVyZWQgdG8gc3RhdGUKLSAgICAvLyB0aGF0IHRoZSBnaXZlbiByZXF1ZXN0IGNhbm5vdCBiZSBwZXJmb3JtZWQgZm9yIGFuIHVua25vd24gcmVhc29uLiIKLSAgICBvcGNvZGUgPSBoYW5kbGUgPSAwOwotICAgIHJlYXNvbiA9IHN0YXRpY19jYXN0PHRHQVRUX1NUQVRVUz4oMHg3Zik7Ci0gIH0gZWxzZSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KG9wY29kZSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICAgIFNUUkVBTV9UT19VSU5UOChyZWFzb24sIHApOwotICB9Ci0KLSAgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9ESVNDT1ZFUlkpIHsKLSAgICBnYXR0X3Byb2NfZGlzY19lcnJvcl9yc3AodGNiLCBwX2NsY2IsIG9wY29kZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0R0FUVF9TVEFUVVM+KHJlYXNvbikpOwotICB9IGVsc2UgewotICAgIGlmICgocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1dSSVRFKSAmJgotICAgICAgICAocF9jbGNiLT5vcF9zdWJ0eXBlID09IEdBVFRfV1JJVEUpICYmCi0gICAgICAgIChvcGNvZGUgPT0gR0FUVF9SRVFfUFJFUEFSRV9XUklURSkgJiYgKHBfYXR0cikgJiYKLSAgICAgICAgKGhhbmRsZSA9PSBwX2F0dHItPmhhbmRsZSkpIHsKLSAgICAgIHBfY2xjYi0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8dEdBVFRfU1RBVFVTPihyZWFzb24pOwotICAgICAgZ2F0dF9zZW5kX3F1ZXVlX3dyaXRlX2NhbmNlbCh0Y2IsIHBfY2xjYiwgR0FUVF9QUkVQX1dSSVRFX0NBTkNFTCk7Ci0gICAgfSBlbHNlIGlmICgocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1JFQUQpICYmCi0gICAgICAgICAgICAgICAoKHBfY2xjYi0+b3Bfc3VidHlwZSA9PSBHQVRUX1JFQURfQ0hBUl9WQUxVRV9IREwpIHx8Ci0gICAgICAgICAgICAgICAgKHBfY2xjYi0+b3Bfc3VidHlwZSA9PSBHQVRUX1JFQURfQllfSEFORExFKSkgJiYKLSAgICAgICAgICAgICAgIChvcGNvZGUgPT0gR0FUVF9SRVFfUkVBRF9CTE9CKSAmJgotICAgICAgICAgICAgICAgcF9jbGNiLT5maXJzdF9yZWFkX2Jsb2JfYWZ0ZXJfcmVhZCAmJgotICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBHQVRUX05PVF9MT05HKSkgewotICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9TVUNDRVNTLCAodm9pZCopcF9jbGNiLT5wX2F0dHJfYnVmKTsKLSAgICB9IGVsc2UKLSAgICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIHN0YXRpY19jYXN0PHRHQVRUX1NUQVRVUz4ocmVhc29uKSwgTlVMTCk7Ci0gIH0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfcHJlcF93cml0ZV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgcmVhZCByZXNwb25zZQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2Nlc3NfcHJlcF93cml0ZV9yc3AodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QqIHAgPSBwX2RhdGE7Ci0KLSAgdEdBVFRfVkFMVUUgdmFsdWUgPSB7Ci0gICAgICAuY29ubl9pZCA9IHBfY2xjYi0+Y29ubl9pZCwgLmF1dGhfcmVxID0gR0FUVF9BVVRIX1JFUV9OT05FLAotICB9OwotCi0gIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCJ2YWx1ZSByZXNwIG9wX2NvZGUgPSAlcyBsZW4gPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfZGJnX29wX25hbWUob3BfY29kZSksIGxlbik7Ci0KLSAgaWYgKGxlbiA8IEdBVFRfUFJFUF9XUklURV9SU1BfTUlOX0xFTikgewotICAgIExPRyhFUlJPUikgPDwgImlsbGVnYWwgcHJlcGFyZSB3cml0ZSByZXNwb25zZSBsZW5ndGgsIGRpc2NhcmQiOwotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfSU5WQUxJRF9QRFUsICZ2YWx1ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQxNih2YWx1ZS5oYW5kbGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KHZhbHVlLm9mZnNldCwgcCk7Ci0KLSAgdmFsdWUubGVuID0gbGVuIC0gNDsKLQotICBtZW1jcHkodmFsdWUudmFsdWUsIHAsIHZhbHVlLmxlbik7Ci0KLSAgaWYgKCFnYXR0X2NoZWNrX3dyaXRlX2xvbmdfdGVybWluYXRlKHRjYiwgcF9jbGNiLCAmdmFsdWUpKSB7Ci0gICAgZ2F0dF9zZW5kX3ByZXBhcmVfd3JpdGUodGNiLCBwX2NsY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX2NsY2ItPm9wX3N1YnR5cGUgPT0gR0FUVF9XUklURV9QUkVQQVJFKSB7Ci0gICAgLyogYXBwbGljYXRpb24gc2hvdWxkIHZlcmlmeSBoYW5kbGUgb2Zmc2V0Ci0gICAgICAgYW5kIHZhbHVlIGFyZSBtYXRjaGVkIG9yIG5vdCAqLwotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIHBfY2xjYi0+c3RhdHVzLCAmdmFsdWUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgdGhlIGhhbmRsZSB2YWx1ZSBpbmRpY2F0aW9uL25vdGlmaWNhdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHVpbnQ4X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHBfZGF0YSkgewotICB0R0FUVF9WQUxVRSB2YWx1ZSA9IHt9OwotICB0R0FUVF9SRUcqIHBfcmVnOwotICB1aW50MTZfdCBjb25uX2lkOwotICB0R0FUVF9TVEFUVVMgZW5jcnlwdF9zdGF0dXMgPSB7fTsKLSAgdWludDhfdCogcCA9IHBfZGF0YTsKLSAgdWludDhfdCBpOwotICB0R0FUVENfT1BUWVBFIGV2ZW50ID0gKG9wX2NvZGUgPT0gR0FUVF9IQU5ETEVfVkFMVUVfSU5EKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR0FUVENfT1BUWVBFX0lORElDQVRJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdBVFRDX09QVFlQRV9OT1RJRklDQVRJT047Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICAvLyBFbnN1cmUgb3VyIHBhY2tldCBoYXMgZW5vdWdoIGRhdGEgKDIgYnl0ZXMpCi0gIGlmIChsZW4gPCBHQVRUX05PVElGSUNBVElPTl9NSU5fTEVOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiaWxsZWdhbCBub3RpZmljYXRpb24gUERVIGxlbmd0aCwgZGlzY2FyZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gR2V0IDIgYnl0ZSBoYW5kbGUKLSAgU1RSRUFNX1RPX1VJTlQxNih2YWx1ZS5oYW5kbGUsIHApOwotCi0gIC8vIEZhaWwgZWFybHkgaWYgdGhlIEdBVFQgaGFuZGxlIGlzIG5vdCB2YWxpZAotICBpZiAoIUdBVFRfSEFORExFX0lTX1ZBTElEKHZhbHVlLmhhbmRsZSkpIHsKLSAgICAvKiBpbGxlZ2FsIGhhbmRsZSwgc2VuZCBhY2sgbm93ICovCi0gICAgaWYgKG9wX2NvZGUgPT0gR0FUVF9IQU5ETEVfVkFMVUVfSU5EKQotICAgICAgYXR0cF9zZW5kX2NsX2NvbmZpcm1hdGlvbl9tc2codGNiLCBjaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIENhbGN1bGF0ZSB2YWx1ZSBsZW5ndGggYmFzZWQgb24gb3Bjb2RlCi0gIGlmIChvcF9jb2RlID09IEdBVFRfSEFORExFX01VTFRJX1ZBTFVFX05PVElGKSB7Ci0gICAgLy8gRW5zdXJlIG91ciBwYWNrZXQgaGFzIGVub3VnaCBkYXRhOyBNSU4gKyAyIG1vcmUgYnl0ZXMgZm9yIGxlbiB2YWx1ZQotICAgIGlmIChsZW4gPCBHQVRUX05PVElGSUNBVElPTl9NSU5fTEVOICsgMikgewotICAgICAgTE9HKEVSUk9SKSA8PCAiaWxsZWdhbCBub3RpZmljYXRpb24gUERVIGxlbmd0aCwgZGlzY2FyZCI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQWxsb3cgbXVsdGkgdmFsdWUgb3Bjb2RlIHRvIHNldCB2YWx1ZSBsZW4gZnJvbSB0aGUgcGFja2V0Ci0gICAgU1RSRUFNX1RPX1VJTlQxNih2YWx1ZS5sZW4sIHApOwotCi0gICAgaWYgKHZhbHVlLmxlbiA+IGxlbiAtIDQpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgInZhbHVlLmxlbiAoIiA8PCB2YWx1ZS5sZW4gPDwgIikgZ3JlYXRlciB0aGFuIGxlbmd0aCAoIgotICAgICAgICAgICAgICAgICA8PCAobGVuIC0gNCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgLy8gRm9yIHNpbmdsZSB2YWx1ZSwganVzdCB1c2UgdGhlIHBhc3NlZCBpbiBsZW4gbWludXMgb3Bjb2RlIGxlbmd0aCAoMikKLSAgICB2YWx1ZS5sZW4gPSBsZW4gLSAyOwotICB9Ci0KLSAgLy8gVmVyaWZ5IHRoZSBuZXcgY2FsY3VsYXRlZCBsZW5ndGgKLSAgaWYgKHZhbHVlLmxlbiA+IEdBVFRfTUFYX0FUVFJfTEVOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAidmFsdWUubGVuIGxhcmdlciB0aGFuIEdBVFRfTUFYX0FUVFJfTEVOLCBkaXNjYXJkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBIYW5kbGUgaW5kaWNhdGlvbnMgZGlmZmVyZW50bHkKLSAgaWYgKGV2ZW50ID09IEdBVFRDX09QVFlQRV9JTkRJQ0FUSU9OKSB7Ci0gICAgaWYgKHRjYi5pbmRfY291bnQpIHsKLSAgICAgIC8qIHRoaXMgaXMgYW4gZXJyb3IgY2FzZSB0aGF0IHJlY2VpdmluZyBhbiBpbmRpY2F0aW9uIGJ1dCB3ZQotICAgICAgICAgc3RpbGwgaGFzIGFuIGluZGljYXRpb24gbm90IGJlaW5nIGFja2VkIHlldC4KLSAgICAgICAgIEZvciBub3csIGp1c3QgbG9nIHRoZSBlcnJvciByZXNldCB0aGUgY291bnRlci4KLSAgICAgICAgIExhdGVyIHdlIG5lZWQgdG8gZGlzY29ubmVjdCB0aGUgbGluayB1bmNvbmRpdGlvbmFsbHkuCi0gICAgICAqLwotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIHJjdiBJbmQuIGJ1dCBpbmRfY291bnQ9IiA8PCB0Y2IuaW5kX2NvdW50Ci0gICAgICAgICAgICAgICAgIDw8ICIgKHdpbGwgcmVzZXQgaW5kX2NvdW50KSI7Ci0gICAgfQotCi0gICAgLy8gWmVybyBvdXQgdGhlIGluZF9jb3VudAotICAgIHRjYi5pbmRfY291bnQgPSAwOwotCi0gICAgLy8gTm90aWZ5IGFsbCByZWdpc3RlcmVkIGNsaWVudHMgd2l0aCB0aGUgaGFuZGxlIHZhbHVlCi0gICAgLy8gbm90aWZpY2F0aW9uL2luZGljYXRpb24KLSAgICAvLyBOb3RlOiBuZWVkIHRvIGRvIHRoZSBpbmRpY2F0aW9uIGNvdW50IGFuZCBzdGFydCB0aW1lciBmaXJzdCB0aGVuIGRvCi0gICAgLy8gY2FsbGJhY2sKLSAgICBmb3IgKGkgPSAwLCBwX3JlZyA9IGdhdHRfY2IuY2xfcmNiOyBpIDwgR0FUVF9NQVhfQVBQUzsgaSsrLCBwX3JlZysrKSB7Ci0gICAgICBpZiAocF9yZWctPmluX3VzZSAmJiBwX3JlZy0+YXBwX2NiLnBfY21wbF9jYikgdGNiLmluZF9jb3VudCsrOwotICAgIH0KLQotICAgIC8qIHN0YXJ0IGEgdGltZXIgZm9yIGFwcCBjb25maXJtYXRpb24gKi8KLSAgICBpZiAodGNiLmluZF9jb3VudCA+IDApIHsKLSAgICAgIGdhdHRfc3RhcnRfaW5kX2Fja190aW1lcih0Y2IsIGNpZCk7Ci0gICAgfSBlbHNlIHsgLyogbm8gYXBwIHRvIGluZGljYXRlLCBvciBpbnZhbGlkIGhhbmRsZSAqLwotICAgICAgYXR0cF9zZW5kX2NsX2NvbmZpcm1hdGlvbl9tc2codGNiLCBjaWQpOwotICAgIH0KLSAgfQotCi0gIGVuY3J5cHRfc3RhdHVzID0gZ2F0dF9nZXRfbGlua19lbmNyeXB0X3N0YXR1cyh0Y2IpOwotCi0gIFNUUkVBTV9UT19BUlJBWSh2YWx1ZS52YWx1ZSwgcCwgdmFsdWUubGVuKTsKLQotICB0R0FUVF9DTF9DT01QTEVURSBnYXR0X2NsX2NvbXBsZXRlOwotICBnYXR0X2NsX2NvbXBsZXRlLmF0dF92YWx1ZSA9IHZhbHVlOwotICBnYXR0X2NsX2NvbXBsZXRlLmNpZCA9IGNpZDsKLQotICBmb3IgKGkgPSAwLCBwX3JlZyA9IGdhdHRfY2IuY2xfcmNiOyBpIDwgR0FUVF9NQVhfQVBQUzsgaSsrLCBwX3JlZysrKSB7Ci0gICAgaWYgKHBfcmVnLT5pbl91c2UgJiYgcF9yZWctPmFwcF9jYi5wX2NtcGxfY2IpIHsKLSAgICAgIGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHRjYi50Y2JfaWR4LCBwX3JlZy0+Z2F0dF9pZik7Ci0gICAgICAoKnBfcmVnLT5hcHBfY2IucF9jbXBsX2NiKShjb25uX2lkLCBldmVudCwgZW5jcnlwdF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2F0dF9jbF9jb21wbGV0ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgdGhpcyBpcyBzaW5nbGUgdmFsdWUsIHRoZW4gbm90aGluZyBpcyBsZWZ0IHRvIGRvCi0gIGlmIChvcF9jb2RlICE9IEdBVFRfSEFORExFX01VTFRJX1ZBTFVFX05PVElGKSByZXR1cm47Ci0KLSAgLy8gTmVlZCBhIHNpZ25lZCB0eXBlIHRvIGNoZWNrIGlmIHRoZSB2YWx1ZSBpcyBiZWxvdyAwCi0gIC8vIGFzIHVpbnQxNl90IGRvZXNuJ3QgaGF2ZSBuZWdhdGl2ZXMgc28gdGhlIG5lZ2F0aXZlcyByZWdpc3RlciBhcyBhIG51bWJlcgotICAvLyB0aHVzIGFueXRoaW5nIGxlc3MgdGhhbiB6ZXJvIHdvbid0IHRyaWdnZXIgdGhlIGNvbmRpdGlvbmFsIGFuZCBpdCBpcyBub3QKLSAgLy8gYWx3YXlzIDAKLSAgLy8gd2hlbiBkb25lIGxvb3BpbmcgYXMgdmFsdWUubGVuIGlzIGFyYml0cmFyeS4KLSAgaW50MTZfdCByZW1fbGVuID0gKGludDE2X3QpbGVuIC0gKDQgLyogb2N0ZXRzICovICsgdmFsdWUubGVuKTsKLQotICAvLyBBbHJlYWR5IHN0cmVhbWVkIHRoZSBmaXJzdCB2YWx1ZSBhbmQgc2VudCBpdCwgbGV0cyBzZW5kIHRoZSByZXN0Ci0gIHdoaWxlIChyZW1fbGVuID4gNCAvKiBvY3RldHMgKi8pIHsKLSAgICAvLyAyCi0gICAgU1RSRUFNX1RPX1VJTlQxNih2YWx1ZS5oYW5kbGUsIHApOwotICAgIC8vICsgMiA9IDQKLSAgICBTVFJFQU1fVE9fVUlOVDE2KHZhbHVlLmxlbiwgcCk7Ci0gICAgLy8gQWNjb3VudGluZwotICAgIHJlbV9sZW4gLT0gNDsKLSAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBwYXN0IHRoZSByZW1haW5pbmcgZGF0YSBldmVuIGlmIHRoZSBsZW5ndGggc2F5cwotICAgIC8vIHdlIGNhbiBBbHNvIG5lZWQgdG8gd2F0Y2ggY29tcGFyaW5nIHRoZSBpbnQxNl90IHdpdGggdGhlIHVpbnQxNl90Ci0gICAgdmFsdWUubGVuID0gc3RkOjptaW4ocmVtX2xlbiwgKGludDE2X3QpdmFsdWUubGVuKTsKLSAgICBTVFJFQU1fVE9fQVJSQVkodmFsdWUudmFsdWUsIHAsIHZhbHVlLmxlbik7Ci0gICAgLy8gQWNjb3VudGluZwotICAgIHJlbV9sZW4gLT0gdmFsdWUubGVuOwotCi0gICAgZ2F0dF9jbF9jb21wbGV0ZS5hdHRfdmFsdWUgPSB2YWx1ZTsKLSAgICBnYXR0X2NsX2NvbXBsZXRlLmNpZCA9IGNpZDsKLQotICAgIGZvciAoaSA9IDAsIHBfcmVnID0gZ2F0dF9jYi5jbF9yY2I7IGkgPCBHQVRUX01BWF9BUFBTOyBpKyssIHBfcmVnKyspIHsKLSAgICAgIGlmIChwX3JlZy0+aW5fdXNlICYmIHBfcmVnLT5hcHBfY2IucF9jbXBsX2NiKSB7Ci0gICAgICAgIGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHRjYi50Y2JfaWR4LCBwX3JlZy0+Z2F0dF9pZik7Ci0gICAgICAgICgqcF9yZWctPmFwcF9jYi5wX2NtcGxfY2IpKGNvbm5faWQsIGV2ZW50LCBlbmNyeXB0X3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhdHRfY2xfY29tcGxldGUpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9wcm9jZXNzX3JlYWRfYnlfdHlwZV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgcmVhZCBieSB0eXBlIHJlc3BvbnNlLgotICogICAgICAgICAgICAgICAgICByZWFkIGJ5IHR5cGUgY2FuIGJlIHVzZWQgZm9yIGRpc2NvdmVyeSwgb3IgcmVhZCBieSB0eXBlIG9yCi0gKiAgICAgICAgICAgICAgICAgIHJlYWQgY2hhcmFjdGVyaXN0aWMgdmFsdWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9wcm9jZXNzX3JlYWRfYnlfdHlwZV9yc3AodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICB0R0FUVF9ESVNDX1JFUyByZXN1bHQ7Ci0gIHRHQVRUX0RJU0NfVkFMVUUgcmVjb3JkX3ZhbHVlOwotICB1aW50OF90ICpwID0gcF9kYXRhLCB2YWx1ZV9sZW4sIGhhbmRsZV9sZW4gPSAyOwotICB1aW50MTZfdCBoYW5kbGUgPSAwOwotCi0gIC8qIGRpc2NvdmVyeSBwcm9jZWR1cmUgYW5kIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgKi8KLSAgaWYgKCgoIXBfY2xjYi0+cF9yZWcpIHx8ICghcF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfZGlzY19yZXNfY2IpKSAmJgotICAgICAgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9ESVNDT1ZFUlkpKQotICAgIHJldHVybjsKLQotICBpZiAobGVuIDwgR0FUVF9SRUFEX0JZX1RZUEVfUlNQX01JTl9MRU4pIHsKLSAgICBMT0coRVJST1IpIDw8ICJJbGxlZ2FsIFJlYWRCeVR5cGUvUmVhZEJ5R3JvdXBUeXBlIFJlc3BvbnNlIGxlbmd0aCwgZGlzY2FyZCI7Ci0gICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlZBTElEX1BEVSwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHZhbHVlX2xlbiwgcCk7Ci0gIHVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfcngodGNiLCBwX2NsY2ItPmNpZCk7Ci0gIGlmICgodmFsdWVfbGVuID4gKHBheWxvYWRfc2l6ZSAtIDIpKSB8fCAodmFsdWVfbGVuID4gKGxlbiAtIDEpKSkgewotICAgIC8qIHRoaXMgaXMgYW4gZXJyb3IgY2FzZSB0aGF0IHNlcnZlcidzIHJlc3BvbnNlIGNvbnRhaW5pbmcgYSB2YWx1ZSBsZW5ndGgKLSAgICAgICB3aGljaCBpcyBsYXJnZXIgdGhhbiBNVFUtMgotICAgICAgIG9yIHZhbHVlX2xlbiA+IG1lc3NhZ2UgdG90YWwgbGVuZ3RoIC0xICovCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICI6IERpc2NhcmQgcmVzcG9uc2Ugb3BfY29kZT0lZCAiCi0gICAgICAgICAgICAgICAgICAgICAgInZhbGVfbGVuPSVkID4gKE1UVS0yPSVkIG9yIG1zZ19sZW4tMT0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgIG9wX2NvZGUsIHZhbHVlX2xlbiwgKHBheWxvYWRfc2l6ZSAtIDIpLCAobGVuIC0gMSkpOwotICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfRVJST1IsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChvcF9jb2RlID09IEdBVFRfUlNQX1JFQURfQllfR1JQX1RZUEUpIGhhbmRsZV9sZW4gPSA0OwotCi0gIHZhbHVlX2xlbiAtPSBoYW5kbGVfbGVuOyAvKiBzdWJzdHJhY3QgdGhlIGhhbmRsZSBwYWlycyBieXRlcyAqLwotICBsZW4gLT0gMTsKLQotICB3aGlsZSAobGVuID49IChoYW5kbGVfbGVuICsgdmFsdWVfbGVuKSkgewotICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLQotICAgIGlmICghR0FUVF9IQU5ETEVfSVNfVkFMSUQoaGFuZGxlKSkgewotICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlZBTElEX0hBTkRMRSwgTlVMTCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZih0R0FUVF9ESVNDX1JFUykpOwotICAgIG1lbXNldCgmcmVjb3JkX3ZhbHVlLCAwLCBzaXplb2YodEdBVFRfRElTQ19WQUxVRSkpOwotCi0gICAgcmVzdWx0LmhhbmRsZSA9IGhhbmRsZTsKLSAgICByZXN1bHQudHlwZSA9Ci0gICAgICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KGRpc2NfdHlwZV90b191dWlkW3BfY2xjYi0+b3Bfc3VidHlwZV0pOwotCi0gICAgLyogZGlzY292ZXIgYWxsIHNlcnZpY2VzICovCi0gICAgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9ESVNDT1ZFUlkgJiYKLSAgICAgICAgcF9jbGNiLT5vcF9zdWJ0eXBlID09IEdBVFRfRElTQ19TUlZDX0FMTCAmJgotICAgICAgICBvcF9jb2RlID09IEdBVFRfUlNQX1JFQURfQllfR1JQX1RZUEUpIHsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoaGFuZGxlLCBwKTsKLQotICAgICAgaWYgKCFHQVRUX0hBTkRMRV9JU19WQUxJRChoYW5kbGUpKSB7Ci0gICAgICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfSU5WQUxJRF9IQU5ETEUsIE5VTEwpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWNvcmRfdmFsdWUuZ3JvdXBfdmFsdWUuZV9oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgIGlmICghZ2F0dF9wYXJzZV91dWlkX2Zyb21fY21kKCZyZWNvcmRfdmFsdWUuZ3JvdXBfdmFsdWUuc2VydmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9sZW4sICZwKSkgewotICAgICAgICAgIExPRyhFUlJPUikgPDwgImRpc2NvdmVyIGFsbCBzZXJ2aWNlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHVyZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLyogZGlzY292ZXIgaW5jbHVkZWQgc2VydmljZSAqLwotICAgIGVsc2UgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9ESVNDT1ZFUlkgJiYKLSAgICAgICAgICAgICBwX2NsY2ItPm9wX3N1YnR5cGUgPT0gR0FUVF9ESVNDX0lOQ19TUlZDKSB7Ci0gICAgICBpZiAodmFsdWVfbGVuIDwgNCkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE1ODgzMzg1NCIpOwotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICIgSWxsZWdhbCBSZXNwb25zZSBsZW5ndGgsIG11c3QgYmUgYXQgbGVhc3QgNC4iOwotICAgICAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX0lOVkFMSURfUERVLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZWNvcmRfdmFsdWUuaW5jbF9zZXJ2aWNlLnNfaGFuZGxlLCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYocmVjb3JkX3ZhbHVlLmluY2xfc2VydmljZS5lX2hhbmRsZSwgcCk7Ci0KLSAgICAgIGlmICghR0FUVF9IQU5ETEVfSVNfVkFMSUQocmVjb3JkX3ZhbHVlLmluY2xfc2VydmljZS5zX2hhbmRsZSkgfHwKLSAgICAgICAgICAhR0FUVF9IQU5ETEVfSVNfVkFMSUQocmVjb3JkX3ZhbHVlLmluY2xfc2VydmljZS5lX2hhbmRsZSkpIHsKLSAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlZBTElEX0hBTkRMRSwgTlVMTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHZhbHVlX2xlbiA9PSA2KSB7Ci0gICAgICAgIHVpbnQxNl90IHRtcDsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNih0bXAsIHApOwotICAgICAgICByZWNvcmRfdmFsdWUuaW5jbF9zZXJ2aWNlLnNlcnZpY2VfdHlwZSA9Ci0gICAgICAgICAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdCh0bXApOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZV9sZW4gPT0gNCkgewotICAgICAgICBwX2NsY2ItPnNfaGFuZGxlID0gcmVjb3JkX3ZhbHVlLmluY2xfc2VydmljZS5zX2hhbmRsZTsKLSAgICAgICAgcF9jbGNiLT5yZWFkX3V1aWQxMjgud2FpdF9mb3JfcmVhZF9yc3AgPSB0cnVlOwotICAgICAgICBwX2NsY2ItPnJlYWRfdXVpZDEyOC5uZXh0X2Rpc2Nfc3RhcnRfaGRsID0gaGFuZGxlICsgMTsKLSAgICAgICAgbWVtY3B5KCZwX2NsY2ItPnJlYWRfdXVpZDEyOC5yZXN1bHQsICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKLSAgICAgICAgbWVtY3B5KCZwX2NsY2ItPnJlYWRfdXVpZDEyOC5yZXN1bHQudmFsdWUsICZyZWNvcmRfdmFsdWUsCi0gICAgICAgICAgICAgICBzaXplb2YocmVzdWx0LnZhbHVlKSk7Ci0gICAgICAgIHBfY2xjYi0+b3Bfc3VidHlwZSB8PSAweDkwOwotICAgICAgICBnYXR0X2FjdF9yZWFkKHBfY2xjYiwgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBJTkNMX1NSVkMgZmFpbGVkIHdpdGggaW52YWxpZCBkYXRhIHZhbHVlX2xlbj0iCi0gICAgICAgICAgICAgICAgICAgPDwgK3ZhbHVlX2xlbjsKLSAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlZBTElEX1BEVSwgKHZvaWQqKXApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIHJlYWQgYnkgdHlwZSAqLwotICAgIGVsc2UgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9SRUFEICYmCi0gICAgICAgICAgICAgcF9jbGNiLT5vcF9zdWJ0eXBlID09IEdBVFRfUkVBRF9CWV9UWVBFKSB7Ci0gICAgICBwX2NsY2ItPmNvdW50ZXIgPSBsZW4gLSAyOwotICAgICAgcF9jbGNiLT5zX2hhbmRsZSA9IGhhbmRsZTsKLSAgICAgIGlmIChwX2NsY2ItPmNvdW50ZXIgPT0gKHBheWxvYWRfc2l6ZSAtIDQpKSB7Ci0gICAgICAgIHBfY2xjYi0+b3Bfc3VidHlwZSA9IEdBVFRfUkVBRF9CWV9IQU5ETEU7Ci0gICAgICAgIGlmICghcF9jbGNiLT5wX2F0dHJfYnVmKQotICAgICAgICAgIHBfY2xjYi0+cF9hdHRyX2J1ZiA9ICh1aW50OF90Kilvc2lfbWFsbG9jKEdBVFRfTUFYX0FUVFJfTEVOKTsKLSAgICAgICAgaWYgKHBfY2xjYi0+Y291bnRlciA8PSBHQVRUX01BWF9BVFRSX0xFTikgewotICAgICAgICAgIG1lbWNweShwX2NsY2ItPnBfYXR0cl9idWYsIHAsIHBfY2xjYi0+Y291bnRlcik7Ci0gICAgICAgICAgZ2F0dF9hY3RfcmVhZChwX2NsY2IsIHBfY2xjYi0+Y291bnRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlRFUk5BTF9FUlJPUiwgKHZvaWQqKXApOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX1NVQ0NFU1MsICh2b2lkKilwKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgLyogZGlzY292ZXIgY2hhcmFjdGVyaXNpdGljICovCi0gICAgewotICAgICAgaWYgKHZhbHVlX2xlbiA8IDMpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNTg3Nzg2NTkiKTsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIElsbGVnYWwgUmVzcG9uc2UgbGVuZ3RoLCBtdXN0IGJlIGF0IGxlYXN0IDMuIjsKLSAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlZBTElEX1BEVSwgTlVMTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFNUUkVBTV9UT19VSU5UOChyZWNvcmRfdmFsdWUuZGNscl92YWx1ZS5jaGFyX3Byb3AsIHApOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZWNvcmRfdmFsdWUuZGNscl92YWx1ZS52YWxfaGFuZGxlLCBwKTsKLSAgICAgIGlmICghR0FUVF9IQU5ETEVfSVNfVkFMSUQocmVjb3JkX3ZhbHVlLmRjbHJfdmFsdWUudmFsX2hhbmRsZSkpIHsKLSAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9JTlZBTElEX0hBTkRMRSwgTlVMTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICghZ2F0dF9wYXJzZV91dWlkX2Zyb21fY21kKCZyZWNvcmRfdmFsdWUuZGNscl92YWx1ZS5jaGFyX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKHZhbHVlX2xlbiAtIDMpLCAmcCkpIHsKLSAgICAgICAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9TVUNDRVNTLCBOVUxMKTsKLSAgICAgICAgLyogaW52YWxpZCBmb3JtYXQsIGFuZCBza2lwIHRoZSByZXN1bHQgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBVVUlEIG5vdCBtYXRjaGluZyAqLwotICAgICAgaWYgKCFwX2NsY2ItPnV1aWQuSXNFbXB0eSgpICYmCi0gICAgICAgICAgIXJlY29yZF92YWx1ZS5kY2xyX3ZhbHVlLmNoYXJfdXVpZC5Jc0VtcHR5KCkgJiYKLSAgICAgICAgICByZWNvcmRfdmFsdWUuZGNscl92YWx1ZS5jaGFyX3V1aWQgIT0gcF9jbGNiLT51dWlkKSB7Ci0gICAgICAgIGxlbiAtPSAodmFsdWVfbGVuICsgMik7Ci0gICAgICAgIGNvbnRpbnVlOyAvKiBza2lwIHRoZSByZXN1bHQsIGFuZCBsb29rIGZvciBuZXh0IG9uZSAqLwotICAgICAgfQotCi0gICAgICBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1JFQUQpCi0gICAgICAvKiBVVUlEIG1hdGNoIGZvciByZWFkIGNoYXJhY3RlcmlzdGljIHZhbHVlICovCi0gICAgICB7Ci0gICAgICAgIC8qIG9ubHkgcmVhZCB0aGUgZmlyc3QgbWF0Y2hpbmcgVVVJRCBjaGFyYWN0ZXJpc3RpYyB2YWx1ZSwgYW5kCi0gICAgICAgICAgZGlzY2FyZCB0aGUgcmVzdCByZXN1bHRzICovCi0gICAgICAgIHBfY2xjYi0+c19oYW5kbGUgPSByZWNvcmRfdmFsdWUuZGNscl92YWx1ZS52YWxfaGFuZGxlOwotICAgICAgICBwX2NsY2ItPm9wX3N1YnR5cGUgfD0gMHg4MDsKLSAgICAgICAgZ2F0dF9hY3RfcmVhZChwX2NsY2IsIDApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGxlbiAtPSAodmFsdWVfbGVuICsgaGFuZGxlX2xlbik7Ci0KLSAgICAvKiByZXN1bHQgaXMgKGhhbmRsZSwgMTZiaXRzIFVVSUQpIHBhaXJzICovCi0gICAgbWVtY3B5KCZyZXN1bHQudmFsdWUsICZyZWNvcmRfdmFsdWUsIHNpemVvZihyZXN1bHQudmFsdWUpKTsKLQotICAgIC8qIHNlbmQgY2FsbGJhY2sgaWYgaXMgZGlzY292ZXIgcHJvY2VkdXJlICovCi0gICAgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9ESVNDT1ZFUlkgJiYKLSAgICAgICAgcF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfZGlzY19yZXNfY2IpCi0gICAgICAoKnBfY2xjYi0+cF9yZWctPmFwcF9jYi5wX2Rpc2NfcmVzX2NiKSgKLSAgICAgICAgICBwX2NsY2ItPmNvbm5faWQsIHN0YXRpY19jYXN0PHRHQVRUX0RJU0NfVFlQRT4ocF9jbGNiLT5vcF9zdWJ0eXBlKSwKLSAgICAgICAgICAmcmVzdWx0KTsKLSAgfQotCi0gIHBfY2xjYi0+c19oYW5kbGUgPSAoaGFuZGxlID09IDApID8gMCA6IChoYW5kbGUgKyAxKTsKLQotICBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX0RJU0NPVkVSWSkgewotICAgIC8qIGluaXRpYXRlIGFub3RoZXIgcmVxdWVzdCAqLwotICAgIGdhdHRfYWN0X2Rpc2NvdmVyeShwX2NsY2IpOwotICB9IGVsc2UgLyogcmVhZCBjaGFyYWN0ZXJpc3RpYyB2YWx1ZSAqLwotICB7Ci0gICAgZ2F0dF9hY3RfcmVhZChwX2NsY2IsIDApOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfcmVhZF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgcmVhZCBCTE9CIHJlc3BvbnNlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfcHJvY2Vzc19yZWFkX3JzcCh0R0FUVF9UQ0ImIHRjYiwgdEdBVFRfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDE2X3Qgb2Zmc2V0ID0gcF9jbGNiLT5jb3VudGVyOwotICB1aW50OF90KiBwID0gcF9kYXRhOwotCi0gIHVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfcngodGNiLCBwX2NsY2ItPmNpZCk7Ci0KLSAgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9SRUFEKSB7Ci0gICAgaWYgKHBfY2xjYi0+b3Bfc3VidHlwZSAhPSBHQVRUX1JFQURfQllfSEFORExFKSB7Ci0gICAgICBwX2NsY2ItPmNvdW50ZXIgPSBsZW47Ci0gICAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX1NVQ0NFU1MsICh2b2lkKilwKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogYWxsb2NhdGUgR0tJIGJ1ZmZlciBob2xkaW5nIHVwIGxvbmcgYXR0cmlidXRlIHZhbHVlICAqLwotICAgICAgaWYgKCFwX2NsY2ItPnBfYXR0cl9idWYpCi0gICAgICAgIHBfY2xjYi0+cF9hdHRyX2J1ZiA9ICh1aW50OF90Kilvc2lfbWFsbG9jKEdBVFRfTUFYX0FUVFJfTEVOKTsKLQotICAgICAgLyogY29weSBhdHRyb2J1dGUgdmFsdWUgaW50byBjYiBidWZmZXIgICovCi0gICAgICBpZiAob2Zmc2V0IDwgR0FUVF9NQVhfQVRUUl9MRU4pIHsKLSAgICAgICAgaWYgKChsZW4gKyBvZmZzZXQpID4gR0FUVF9NQVhfQVRUUl9MRU4pCi0gICAgICAgICAgbGVuID0gR0FUVF9NQVhfQVRUUl9MRU4gLSBvZmZzZXQ7Ci0KLSAgICAgICAgcF9jbGNiLT5jb3VudGVyICs9IGxlbjsKLQotICAgICAgICBtZW1jcHkocF9jbGNiLT5wX2F0dHJfYnVmICsgb2Zmc2V0LCBwLCBsZW4pOwotCi0gICAgICAgIC8qIGZ1bGwgcGFja2V0IGZvciByZWFkIG9yIHJlYWQgYmxvYiByc3AgKi8KLSAgICAgICAgYm9vbCBwYWNrZXRfaXNfZnVsbDsKLSAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA9PSBwX2NsY2ItPnJlYWRfcmVxX2N1cnJlbnRfbXR1KSB7Ci0gICAgICAgICAgcGFja2V0X2lzX2Z1bGwgPSAobGVuID09IChwYXlsb2FkX3NpemUgLSAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGFja2V0X2lzX2Z1bGwgPSAobGVuID09IChwX2NsY2ItPnJlYWRfcmVxX2N1cnJlbnRfbXR1IC0gMSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPT0gKHBheWxvYWRfc2l6ZSAtIDEpKTsKLSAgICAgICAgICBwX2NsY2ItPnJlYWRfcmVxX2N1cnJlbnRfbXR1ID0gcGF5bG9hZF9zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2VuZCBuZXh0IHJlcXVlc3QgaWYgbmVlZGVkICAqLwotICAgICAgICBpZiAocGFja2V0X2lzX2Z1bGwgJiYgKGxlbiArIG9mZnNldCA8IEdBVFRfTUFYX0FUVFJfTEVOKSkgewotICAgICAgICAgIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAiZnVsbCBwa3QgaXNzdWUgcmVhZCBibG9iIGZvciByZW1pYW5pbmcgYnl0ZXMgb2xkIG9mZnNldD0lZCAiCi0gICAgICAgICAgICAgICJsZW49JWQgbmV3IG9mZnNldD0lZCIsCi0gICAgICAgICAgICAgIG9mZnNldCwgbGVuLCBwX2NsY2ItPmNvdW50ZXIpOwotICAgICAgICAgIGdhdHRfYWN0X3JlYWQocF9jbGNiLCBwX2NsY2ItPmNvdW50ZXIpOwotICAgICAgICB9IGVsc2UgLyogZW5kIG9mIHJlcXVlc3QsIHNlbmQgY2FsbGJhY2sgKi8KLSAgICAgICAgewotICAgICAgICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfU1VDQ0VTUywgKHZvaWQqKXBfY2xjYi0+cF9hdHRyX2J1Zik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSAvKiBleGNlcHRpb24sIHNob3VsZCBub3QgaGFwcGVuICovCi0gICAgICB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgImF0dHIgb2Zmc2V0ID0gIiA8PCArb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgPDwgIiBwX2F0dHJfYnVmID0gIiA8PCBwX2NsY2ItPnBfYXR0cl9idWY7Ci0gICAgICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIEdBVFRfTk9fUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKXBfY2xjYi0+cF9hdHRyX2J1Zik7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwX2NsY2ItPm9wZXJhdGlvbiA9PSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZICYmCi0gICAgICAgIHBfY2xjYi0+b3Bfc3VidHlwZSA9PSBHQVRUX0RJU0NfSU5DX1NSVkMgJiYKLSAgICAgICAgcF9jbGNiLT5yZWFkX3V1aWQxMjgud2FpdF9mb3JfcmVhZF9yc3ApIHsKLSAgICAgIHBfY2xjYi0+c19oYW5kbGUgPSBwX2NsY2ItPnJlYWRfdXVpZDEyOC5uZXh0X2Rpc2Nfc3RhcnRfaGRsOwotICAgICAgcF9jbGNiLT5yZWFkX3V1aWQxMjgud2FpdF9mb3JfcmVhZF9yc3AgPSBmYWxzZTsKLSAgICAgIGlmIChsZW4gPT0gVXVpZDo6a051bUJ5dGVzMTI4KSB7Ci0gICAgICAgIHBfY2xjYi0+cmVhZF91dWlkMTI4LnJlc3VsdC52YWx1ZS5pbmNsX3NlcnZpY2Uuc2VydmljZV90eXBlID0KLSAgICAgICAgICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbTEyOEJpdExFKHApOwotICAgICAgICBpZiAocF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfZGlzY19yZXNfY2IpCi0gICAgICAgICAgKCpwX2NsY2ItPnBfcmVnLT5hcHBfY2IucF9kaXNjX3Jlc19jYikoCi0gICAgICAgICAgICAgIHBfY2xjYi0+Y29ubl9pZCwgc3RhdGljX2Nhc3Q8dEdBVFRfRElTQ19UWVBFPihwX2NsY2ItPm9wX3N1YnR5cGUpLAotICAgICAgICAgICAgICAmcF9jbGNiLT5yZWFkX3V1aWQxMjgucmVzdWx0KTsKLSAgICAgICAgZ2F0dF9hY3RfZGlzY292ZXJ5KHBfY2xjYik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX0lOVkFMSURfUERVLCAodm9pZCopcCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfaGFuZGxlX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSB3cml0ZSByZXNwb25zZQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2Nlc3NfaGFuZGxlX3JzcCh0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgR0FUVF9TVUNDRVNTLCBOVUxMKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfbXR1X3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyB0aGUgY29uZmlndXJlIE1UVSByZXNwb25zZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9wcm9jZXNzX210dV9yc3AodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDE2X3QgbXR1OwotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVF9TVUNDRVNTOwotCi0gIGlmIChsZW4gPCBHQVRUX01UVV9SU1BfTUlOX0xFTikgewotICAgIExPRyhFUlJPUikgPDwgImludmFsaWQgTVRVIHJlc3BvbnNlIFBEVSByZWNlaXZlZCwgZGlzY2FyZC4iOwotICAgIHN0YXR1cyA9IEdBVFRfSU5WQUxJRF9QRFU7Ci0gIH0gZWxzZSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihtdHUsIHBfZGF0YSk7Ci0KLSAgICBpZiAobXR1IDwgdGNiLnBheWxvYWRfc2l6ZSAmJiBtdHUgPj0gR0FUVF9ERUZfQkxFX01UVV9TSVpFKQotICAgICAgdGNiLnBheWxvYWRfc2l6ZSA9IG10dTsKLSAgfQotCi0gIEJUTV9TZXRCbGVEYXRhTGVuZ3RoKHRjYi5wZWVyX2JkYSwgdGNiLnBheWxvYWRfc2l6ZSArIEwyQ0FQX1BLVF9PVkVSSEVBRCk7Ci0KLSAgZ2F0dF9lbmRfb3BlcmF0aW9uKHBfY2xjYiwgc3RhdHVzLCBOVUxMKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2NtZF90b19yc3BfY29kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ29udmVydCBhbiBBVFQgY29tbWFuZCBvcCBjb2RlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgY29kZSBhc3N1bWUgbm8gZXJyb3Igb2NjdXJzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcmVzcG9uc2UgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBnYXR0X2NtZF90b19yc3BfY29kZSh1aW50OF90IGNtZF9jb2RlKSB7Ci0gIHVpbnQ4X3QgcnNwX2NvZGUgPSAwOwotCi0gIGlmIChjbWRfY29kZSA+IDEgJiYgY21kX2NvZGUgIT0gR0FUVF9DTURfV1JJVEUpIHsKLSAgICByc3BfY29kZSA9IGNtZF9jb2RlICsgMTsKLSAgfQotICByZXR1cm4gcnNwX2NvZGU7Ci19Ci0KLS8qKiBGaW5kIG5leHQgY29tbWFuZCBpbiBxdWV1ZSBhbmQgc2VudCB0byBzZXJ2ZXIgKi8KLWJvb2wgZ2F0dF9jbF9zZW5kX25leHRfY21kX2lucSh0R0FUVF9UQ0ImIHRjYikgewotICBzdGQ6OnF1ZXVlPHRHQVRUX0NNRF9RPiogY2xfY21kX3E7Ci0KLSAgd2hpbGUgKCF0Y2IuY2xfY21kX3EuZW1wdHkoKSB8fAotICAgICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+SXNPdXRzdGFuZGluZ01zZ0luU2VuZFF1ZXVlKHRjYi5wZWVyX2JkYSkpIHsKLSAgICBpZiAoIXRjYi5jbF9jbWRfcS5lbXB0eSgpKSB7Ci0gICAgICBjbF9jbWRfcSA9ICZ0Y2IuY2xfY21kX3E7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0KLSAgICAgICAgICBFYXR0RXh0ZW5zaW9uOjpHZXRJbnN0YW5jZSgpLT5HZXRDaGFubmVsV2l0aFF1ZXVlZERhdGEodGNiLnBlZXJfYmRhKTsKLSAgICAgIGNsX2NtZF9xID0gJmNoYW5uZWwtPmNsX2NtZF9xXzsKLSAgICB9Ci0KLSAgICB0R0FUVF9DTURfUSYgY21kID0gY2xfY21kX3EtPmZyb250KCk7Ci0gICAgaWYgKCFjbWQudG9fc2VuZCB8fCBjbWQucF9jbWQgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHRHQVRUX1NUQVRVUyBhdHRfcmV0OwotICAgIGF0dF9yZXQgPSBhdHRwX3NlbmRfbXNnX3RvX2wyY2FwKHRjYiwgY21kLmNpZCwgY21kLnBfY21kKTsKLQotICAgIGlmIChhdHRfcmV0ICE9IEdBVFRfU1VDQ0VTUyAmJiBhdHRfcmV0ICE9IEdBVFRfQ09OR0VTVEVEKSB7Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEwyQ0FQIHNlbnQgZXJyb3IiOwotICAgICAgY2xfY21kX3EtPnBvcCgpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgY21kLnRvX3NlbmQgPSBmYWxzZTsKLSAgICBjbWQucF9jbWQgPSBOVUxMOwotCi0gICAgaWYgKGNtZC5vcF9jb2RlID09IEdBVFRfQ01EX1dSSVRFIHx8IGNtZC5vcF9jb2RlID09IEdBVFRfU0lHTl9DTURfV1JJVEUpIHsKLSAgICAgIC8qIGRlcXVldWUgdGhlIHJlcXVlc3QgaWYgaXMgd3JpdGUgY29tbWFuZCBvciBzaWduIHdyaXRlICovCi0gICAgICB1aW50OF90IHJzcF9jb2RlOwotICAgICAgdEdBVFRfQ0xDQiogcF9jbGNiID0gZ2F0dF9jbWRfZGVxdWV1ZSh0Y2IsIGNtZC5jaWQsICZyc3BfY29kZSk7Ci0KLSAgICAgIC8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBjYWxsYmFjayBoZXJlICovCi0gICAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBhdHRfcmV0LCBOVUxMKTsKLQotICAgICAgLyogaWYgbm8gYWNrIG5lZWRlZCwga2VlcCBzZW5kaW5nICovCi0gICAgICBpZiAoYXR0X3JldCA9PSBHQVRUX1NVQ0NFU1MpIGNvbnRpbnVlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBnYXR0X3N0YXJ0X3JzcF90aW1lcihjbWQucF9jbGNiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgc2VydmVyIHJlc3BvbnNlIHRvIGNsaWVudCAqLwotdm9pZCBnYXR0X2NsaWVudF9oYW5kbGVfc2VydmVyX3JzcCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBvcGNvZGU6ICIgPDwgbG9naGV4KG9wX2NvZGUpOwotCi0gIHVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfcngodGNiLCBjaWQpOwotCi0gIGlmIChvcF9jb2RlID09IEdBVFRfSEFORExFX1ZBTFVFX0lORCB8fCBvcF9jb2RlID09IEdBVFRfSEFORExFX1ZBTFVFX05PVElGIHx8Ci0gICAgICBvcF9jb2RlID09IEdBVFRfSEFORExFX01VTFRJX1ZBTFVFX05PVElGKSB7Ci0gICAgaWYgKGxlbiA+PSBwYXlsb2FkX3NpemUpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAgICIlczogaW52YWxpZCBpbmRpY2F0ZSBwa3Qgc2l6ZTogJWQsIFBEVSBzaXplOiAlZCIsIF9fZnVuY19fLCBsZW4gKyAxLAotICAgICAgICAgIHBheWxvYWRfc2l6ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZ2F0dF9wcm9jZXNzX25vdGlmaWNhdGlvbih0Y2IsIGNpZCwgb3BfY29kZSwgbGVuLCBwX2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgY21kX2NvZGUgPSAwOwotICB0R0FUVF9DTENCKiBwX2NsY2IgPSBnYXR0X2NtZF9kZXF1ZXVlKHRjYiwgY2lkLCAmY21kX2NvZGUpOwotICB1aW50OF90IHJzcF9jb2RlID0gZ2F0dF9jbWRfdG9fcnNwX2NvZGUoY21kX2NvZGUpOwotICBpZiAoIXBfY2xjYiB8fCAocnNwX2NvZGUgIT0gb3BfY29kZSAmJiBvcF9jb2RlICE9IEdBVFRfUlNQX0VSUk9SKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBTdHJpbmdQcmludGYoCi0gICAgICAgICJBVFQgLSBJZ25vcmUgd3JvbmcgcmVzcG9uc2UuIFJlY2VpdmVzICglMDJ4KSBSZXF1ZXN0KCUwMngpIElnbm9yZWQiLAotICAgICAgICBvcF9jb2RlLCByc3BfY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFwX2NsY2ItPmluX3VzZSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQVRUIC0gY2xjYiBhbHJlYWR5IG5vdCBpbiB1c2UsIGlnbm9yaW5nIHJlc3BvbnNlIjsKLSAgICBnYXR0X2NsX3NlbmRfbmV4dF9jbWRfaW5xKHRjYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ2F0dF9zdG9wX3JzcF90aW1lcihwX2NsY2IpOwotICBwX2NsY2ItPnJldHJ5X2NvdW50ID0gMDsKLQotICAvKiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBtYXkgbm90IGJlIGJpZ2dlciB0aGFuIHRoZSBsb2NhbCBtYXggUERVIHNpemUqLwotICAvKiBUaGUgbWVzc2FnZSBoYXMgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBhZ3JlZWQgTVRVLCBsZW4gZG9lcyBub3QgY291bnQKLSAgICogb3BfY29kZSAqLwotICBpZiAobGVuID49IHBheWxvYWRfc2l6ZSkgewotICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgICAiJXM6IGludmFsaWQgcmVzcG9uc2UgcGt0IHNpemU6ICVkLCBQRFUgc2l6ZTogJWQiLCBfX2Z1bmNfXywgbGVuICsgMSwKLSAgICAgICAgcGF5bG9hZF9zaXplKTsKLSAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX0VSUk9SLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKG9wX2NvZGUpIHsKLSAgICAgIGNhc2UgR0FUVF9SU1BfRVJST1I6Ci0gICAgICAgIGdhdHRfcHJvY2Vzc19lcnJvcl9yc3AodGNiLCBwX2NsY2IsIG9wX2NvZGUsIGxlbiwgcF9kYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9SU1BfTVRVOiAvKiAyIGJ5dGVzIG10dSAqLwotICAgICAgICBnYXR0X3Byb2Nlc3NfbXR1X3JzcCh0Y2IsIHBfY2xjYiwgbGVuLCBwX2RhdGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHQVRUX1JTUF9GSU5EX0lORk86Ci0gICAgICAgIGdhdHRfcHJvY2Vzc19yZWFkX2luZm9fcnNwKHRjYiwgcF9jbGNiLCBvcF9jb2RlLCBsZW4sIHBfZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdBVFRfUlNQX1JFQURfQllfVFlQRToKLSAgICAgIGNhc2UgR0FUVF9SU1BfUkVBRF9CWV9HUlBfVFlQRToKLSAgICAgICAgZ2F0dF9wcm9jZXNzX3JlYWRfYnlfdHlwZV9yc3AodGNiLCBwX2NsY2IsIG9wX2NvZGUsIGxlbiwgcF9kYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9SU1BfUkVBRDoKLSAgICAgIGNhc2UgR0FUVF9SU1BfUkVBRF9CTE9COgotICAgICAgY2FzZSBHQVRUX1JTUF9SRUFEX01VTFRJOgotICAgICAgY2FzZSBHQVRUX1JTUF9SRUFEX01VTFRJX1ZBUjoKLSAgICAgICAgZ2F0dF9wcm9jZXNzX3JlYWRfcnNwKHRjYiwgcF9jbGNiLCBvcF9jb2RlLCBsZW4sIHBfZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdBVFRfUlNQX0ZJTkRfVFlQRV9WQUxVRTogLyogZGlzYyBzZXJ2aWNlIHdpdGggVVVJRCAqLwotICAgICAgICBnYXR0X3Byb2Nlc3NfZmluZF90eXBlX3ZhbHVlX3JzcCh0Y2IsIHBfY2xjYiwgbGVuLCBwX2RhdGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHQVRUX1JTUF9XUklURToKLSAgICAgICAgZ2F0dF9wcm9jZXNzX2hhbmRsZV9yc3AocF9jbGNiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9SU1BfUFJFUEFSRV9XUklURToKLSAgICAgICAgZ2F0dF9wcm9jZXNzX3ByZXBfd3JpdGVfcnNwKHRjYiwgcF9jbGNiLCBvcF9jb2RlLCBsZW4sIHBfZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdBVFRfUlNQX0VYRUNfV1JJVEU6Ci0gICAgICAgIGdhdHRfZW5kX29wZXJhdGlvbihwX2NsY2IsIHBfY2xjYi0+c3RhdHVzLCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogVW5rbm93biBvcGNvZGUgPSAiIDw8IHN0ZDo6aGV4IDw8IG9wX2NvZGU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGdhdHRfY2xfc2VuZF9uZXh0X2NtZF9pbnEodGNiKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2dhdHQvZ2F0dF9kYi5jYyBiL3N0YWNrL2dhdHQvZ2F0dF9kYi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjZmNhNS4uMDAwMDAwMAotLS0gYS9zdGFjay9nYXR0L2dhdHRfZGIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgR0FUVCBkYXRhYmFzZSBidWlsZGluZyBhbmQgcXVlcnkgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF90cmFjZS5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEdBVFRfQVRUUiYgYWxsb2NhdGVfYXR0cl9pbl9kYih0R0FUVF9TVkNfREImIGRiLCBjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfUEVSTSBwZXJtKTsKLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dHNfc2VuZF9hcHBfcmVhZF9yZXF1ZXN0KAotICAgIHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgaGFuZGxlLAotICAgIHVpbnQxNl90IG9mZnNldCwgdWludDMyX3QgdHJhbnNfaWQsIGJ0X2dhdHRfZGJfYXR0cmlidXRlX3R5cGVfdCBnYXR0X3R5cGUpOwotCi0vKioKLSAqIEluaXRpYWxpemUgYSBtZW1vcnkgc3BhY2UgdG8gYmUgYSBzZXJ2aWNlIGRhdGFiYXNlLgotICovCi12b2lkIGdhdHRzX2luaXRfc2VydmljZV9kYih0R0FUVF9TVkNfREImIGRiLCBjb25zdCBVdWlkJiBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaSwgdWludDE2X3Qgc19oZGwsIHVpbnQxNl90IG51bV9oYW5kbGUpIHsKLSAgZGIuYXR0cl9saXN0LnJlc2VydmUobnVtX2hhbmRsZSk7Ci0KLSAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIiVzOiBzX2hkbD0gJWQgbnVtX2hhbmRsZT0gJWQiLCBfX2Z1bmNfXywgc19oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9oYW5kbGUpOwotCi0gIC8qIHVwZGF0ZSBzZXJ2aWNlIGRhdGFiYXNlIGluZm9ybWF0aW9uICovCi0gIGRiLm5leHRfaGFuZGxlID0gc19oZGw7Ci0gIGRiLmVuZF9oYW5kbGUgPSBzX2hkbCArIG51bV9oYW5kbGU7Ci0KLSAgLyogYWRkIHNlcnZpY2UgZGVjbHJhdGlvbiByZWNvcmQgKi8KLSAgVXVpZCB1dWlkID0KLSAgICAgIFV1aWQ6OkZyb20xNkJpdChpc19wcmkgPyBHQVRUX1VVSURfUFJJX1NFUlZJQ0UgOiBHQVRUX1VVSURfU0VDX1NFUlZJQ0UpOwotICB0R0FUVF9BVFRSJiBhdHRyID0gYWxsb2NhdGVfYXR0cl9pbl9kYihkYiwgdXVpZCwgR0FUVF9QRVJNX1JFQUQpOwotICBhdHRyLnBfdmFsdWUucmVzZXQobmV3IHRHQVRUX0FUVFJfVkFMVUUpOwotICBhdHRyLnBfdmFsdWUtPnV1aWQgPSBzZXJ2aWNlX3V1aWQ7Ci19Ci0KLVV1aWQqIGdhdHRzX2dldF9zZXJ2aWNlX3V1aWQodEdBVFRfU1ZDX0RCKiBwX2RiKSB7Ci0gIGlmICghcF9kYiB8fCBwX2RiLT5hdHRyX2xpc3QuZW1wdHkoKSkgewotICAgIExPRyhFUlJPUikgPDwgInNlcnZpY2UgREIgZW1wdHkiOwotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHJldHVybiAmcF9kYi0+YXR0cl9saXN0WzBdLnBfdmFsdWUtPnV1aWQ7Ci0gIH0KLX0KLQotLyoqIENoZWNrIGF0dHJpYnV0ZSByZWFkYWJpbGl0eS4gUmV0dXJucyBzdGF0dXMgb2Ygb3BlcmF0aW9uLiAqLwotc3RhdGljIHRHQVRUX1NUQVRVUyBnYXR0c19jaGVja19hdHRyX3JlYWRhYmlsaXR5KGNvbnN0IHRHQVRUX0FUVFImIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZF9sb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NFQ19GTEFHIHNlY19mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3NpemUpIHsKLSAgdWludDE2X3QgbWluX2tleV9zaXplOwotICB0R0FUVF9QRVJNIHBlcm0gPSBhdHRyLnBlcm1pc3Npb247Ci0KLSAgbWluX2tleV9zaXplID0gKCgocGVybSAmIEdBVFRfRU5DUllQVF9LRVlfU0laRV9NQVNLKSA+PiAxMikpOwotICBpZiAobWluX2tleV9zaXplICE9IDApIHsKLSAgICBtaW5fa2V5X3NpemUgKz0gNjsKLSAgfQotCi0gIGlmICghKHBlcm0gJiBHQVRUX1JFQURfQUxMT1dFRCkpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEdBVFRfUkVBRF9OT1RfUEVSTUlUIjsKLSAgICByZXR1cm4gR0FUVF9SRUFEX05PVF9QRVJNSVQ7Ci0gIH0KLQotICBpZiAoKHBlcm0gJiBHQVRUX1JFQURfQVVUSF9SRVFVSVJFRCkgJiYgIXNlY19mbGFnLmlzX2xpbmtfa2V5X2tub3duICYmCi0gICAgICAhc2VjX2ZsYWcuaXNfZW5jcnlwdGVkKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBHQVRUX0lOU1VGX0FVVEhFTlRJQ0FUSU9OIjsKLSAgICByZXR1cm4gR0FUVF9JTlNVRl9BVVRIRU5USUNBVElPTjsKLSAgfQotCi0gIGlmICgocGVybSAmIEdBVFRfUkVBRF9NSVRNX1JFUVVJUkVEKSAmJiAhc2VjX2ZsYWcuaXNfbGlua19rZXlfYXV0aGVkKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBHQVRUX0lOU1VGX0FVVEhFTlRJQ0FUSU9OOiBNSVRNIFJlcXVpcmVkIjsKLSAgICByZXR1cm4gR0FUVF9JTlNVRl9BVVRIRU5USUNBVElPTjsKLSAgfQotCi0gIGlmICgocGVybSAmIEdBVFRfUkVBRF9FTkNSWVBURURfUkVRVUlSRUQpICYmICFzZWNfZmxhZy5pc19lbmNyeXB0ZWQpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEdBVFRfSU5TVUZfRU5DUllQVElPTiI7Ci0gICAgcmV0dXJuIEdBVFRfSU5TVUZfRU5DUllQVElPTjsKLSAgfQotCi0gIGlmICgocGVybSAmIEdBVFRfUkVBRF9FTkNSWVBURURfUkVRVUlSRUQpICYmIHNlY19mbGFnLmlzX2VuY3J5cHRlZCAmJgotICAgICAgKGtleV9zaXplIDwgbWluX2tleV9zaXplKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogR0FUVF9JTlNVRl9LRVlfU0laRSI7Ci0gICAgcmV0dXJuIEdBVFRfSU5TVUZfS0VZX1NJWkU7Ci0gIH0KLQotICBpZiAocmVhZF9sb25nICYmIGF0dHIudXVpZC5JczE2Qml0KCkpIHsKLSAgICBzd2l0Y2ggKGF0dHIudXVpZC5BczE2Qml0KCkpIHsKLSAgICAgIGNhc2UgR0FUVF9VVUlEX1BSSV9TRVJWSUNFOgotICAgICAgY2FzZSBHQVRUX1VVSURfU0VDX1NFUlZJQ0U6Ci0gICAgICBjYXNlIEdBVFRfVVVJRF9DSEFSX0RFQ0xBUkU6Ci0gICAgICBjYXNlIEdBVFRfVVVJRF9JTkNMVURFX1NFUlZJQ0U6Ci0gICAgICBjYXNlIEdBVFRfVVVJRF9DSEFSX0VYVF9QUk9QOgotICAgICAgY2FzZSBHQVRUX1VVSURfQ0hBUl9DTElFTlRfQ09ORklHOgotICAgICAgY2FzZSBHQVRUX1VVSURfQ0hBUl9TUlZSX0NPTkZJRzoKLSAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfUFJFU0VOVF9GT1JNQVQ6Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogR0FUVF9OT1RfTE9ORyI7Ci0gICAgICAgIHJldHVybiBHQVRUX05PVF9MT05HOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmVhZF9hdHRyX3ZhbHVlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVdGlsaXR5IGZ1bmN0aW9uIHRvIHJlYWQgYW4gYXR0cmlidXRlIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgYXR0cjE2OiBwb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgdG8gcmVhZC4KLSAqICAgICAgICAgICAgICAgICAgb2Zmc2V0OiByZWFkIG9mZnNldC4KLSAqICAgICAgICAgICAgICAgICAgcF9kYXRhOiBvdXRwdXQgcGFyYW1ldGVyIHRvIGNhcnJ5IG91dCB0aGUgYXR0cmlidXRlIHZhbHVlLgotICogICAgICAgICAgICAgICAgICByZWFkX2xvbmc6IHRoaXMgaXMgYSByZWFkIGJsb2IgcmVxdWVzdC4KLSAqICAgICAgICAgICAgICAgICAgbXR1OiBNVFUKLSAqICAgICAgICAgICAgICAgICAgcF9sZW46IG91dHB1dCBwYXJhbWV0ZXIgdG8gY2Fycnkgb3V0IHRoZSBhdHRyaWJ1dGUgbGVuZ3RoLgotICogICAgICAgICAgICAgICAgICAgc2VjX2ZsYWc6IGN1cnJlbnQgbGluayBzZWN1cml0eSBzdGF0dXMuCi0gKiAgICAgICAgICAgICAgICAgIGtleV9zaXplOiBlbmNyeXB0aW9uIGtleSBzaXplLgotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RhdHVzIG9mIG9wZXJhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRHQVRUX1NUQVRVUyByZWFkX2F0dHJfdmFsdWUodEdBVFRfQVRUUiYgYXR0cjE2LCB1aW50MTZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcF9kYXRhLCBib29sIHJlYWRfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSwgdWludDE2X3QqIHBfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU0VDX0ZMQUcgc2VjX2ZsYWcsIHVpbnQ4X3Qga2V5X3NpemUpIHsKLSAgdWludDhfdCogcCA9ICpwX2RhdGE7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIHV1aWQ9IiA8PCBhdHRyMTYudXVpZAotICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiIHBlcm09MHglMDJ4IG9mZnNldD0lZCByZWFkX2xvbmc9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyMTYucGVybWlzc2lvbiwgb2Zmc2V0LCByZWFkX2xvbmcpOwotCi0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBnYXR0c19jaGVja19hdHRyX3JlYWRhYmlsaXR5KGF0dHIxNiwgb2Zmc2V0LCByZWFkX2xvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY19mbGFnLCBrZXlfc2l6ZSk7Ci0gIGlmIChzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKSByZXR1cm4gc3RhdHVzOwotCi0gIGlmICghYXR0cjE2LnV1aWQuSXMxNkJpdCgpKSB7Ci0gICAgLyogY2hhcmFjdGVyaXN0aWMgZGVzY3JpcHRpb24gb3IgY2hhcmFjdGVyaXN0aWMgdmFsdWUgKi8KLSAgICByZXR1cm4gR0FUVF9QRU5ESU5HOwotICB9Ci0KLSAgdWludDE2X3QgdXVpZDE2ID0gYXR0cjE2LnV1aWQuQXMxNkJpdCgpOwotCi0gIGlmICh1dWlkMTYgPT0gR0FUVF9VVUlEX1BSSV9TRVJWSUNFIHx8IHV1aWQxNiA9PSBHQVRUX1VVSURfU0VDX1NFUlZJQ0UpIHsKLSAgICAqcF9sZW4gPSBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtX2xlbihhdHRyMTYucF92YWx1ZS0+dXVpZCk7Ci0gICAgaWYgKG10dSA8ICpwX2xlbikgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotCi0gICAgZ2F0dF9idWlsZF91dWlkX3RvX3N0cmVhbSgmcCwgYXR0cjE2LnBfdmFsdWUtPnV1aWQpOwotICAgICpwX2RhdGEgPSBwOwotICAgIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci0gIH0KLQotICBpZiAodXVpZDE2ID09IEdBVFRfVVVJRF9DSEFSX0RFQ0xBUkUpIHsKLSAgICB0R0FUVF9BVFRSKiB2YWxfYXR0ciA9ICZhdHRyMTYgKyAxOwotICAgIHVpbnQ4X3QgdmFsX2xlbiA9IHZhbF9hdHRyLT51dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0gICAgKnBfbGVuID0gKHZhbF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpID8gNSA6IDE5OwotCi0gICAgaWYgKG10dSA8ICpwX2xlbikgcmV0dXJuIEdBVFRfTk9fUkVTT1VSQ0VTOwotCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIGF0dHIxNi5wX3ZhbHVlLT5jaGFyX2RlY2wucHJvcGVydHkpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgYXR0cjE2LnBfdmFsdWUtPmNoYXJfZGVjbC5jaGFyX3ZhbF9oYW5kbGUpOwotCi0gICAgaWYgKHZhbF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgdmFsX2F0dHItPnV1aWQuQXMxNkJpdCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogaWYgMzIgYml0IFVVSUQsIGNvbnZlcnQgdG8gMTI4IGJpdCAqLwotICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIHZhbF9hdHRyLT51dWlkLlRvMTI4Qml0TEUoKSwgKGludClVdWlkOjprTnVtQnl0ZXMxMjgpOwotICAgIH0KLSAgICAqcF9kYXRhID0gcDsKLSAgICByZXR1cm4gR0FUVF9TVUNDRVNTOwotICB9Ci0KLSAgaWYgKHV1aWQxNiA9PSBHQVRUX1VVSURfSU5DTFVERV9TRVJWSUNFKSB7Ci0gICAgdEdBVFRfSU5DTF9TUlZDJiBpbmNsX2hhbmRsZSA9IGF0dHIxNi5wX3ZhbHVlLT5pbmNsX2hhbmRsZTsKLSAgICBpZiAoaW5jbF9oYW5kbGUuc2VydmljZV90eXBlLklzMTZCaXQoKSkKLSAgICAgICpwX2xlbiA9IDY7Ci0gICAgZWxzZQotICAgICAgKnBfbGVuID0gNDsKLQotICAgIGlmIChtdHUgPCAqcF9sZW4pIHJldHVybiBHQVRUX05PX1JFU09VUkNFUzsKLQotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgaW5jbF9oYW5kbGUuc19oYW5kbGUpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgaW5jbF9oYW5kbGUuZV9oYW5kbGUpOwotCi0gICAgaWYgKGluY2xfaGFuZGxlLnNlcnZpY2VfdHlwZS5JczE2Qml0KCkpIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgaW5jbF9oYW5kbGUuc2VydmljZV90eXBlLkFzMTZCaXQoKSk7Ci0gICAgfQotICAgICpwX2RhdGEgPSBwOwotICAgIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci0gIH0KLQotICBpZiAodXVpZDE2ID09IEdBVFRfVVVJRF9DSEFSX0VYVF9QUk9QKSB7Ci0gICAgLy8gc29tZXRpbWVzIHRoaXMgZGVzY3JpcHRvciBpcyBhZGRlZCBieSB1c2VycyBtYW51YWxseSwgd2UgbmVlZCB0byBjaGVjayBpZgotICAgIC8vIHRoZSBwX3ZhbHVlIGlzIG51bGxwdHIuCi0gICAgdWludDE2X3QgY2hhcl9leHRfcHJvcCA9Ci0gICAgICAgIGF0dHIxNi5wX3ZhbHVlID8gYXR0cjE2LnBfdmFsdWUtPmNoYXJfZXh0X3Byb3AgOiAweDAwMDA7Ci0gICAgKnBfbGVuID0gMjsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNoYXJfZXh0X3Byb3ApOwotICAgICpwX2RhdGEgPSBwOwotICAgIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci0gIH0KLQotICAvKiBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9yIG9yIGNoYXJhY3RlcmlzdGljIHZhbHVlIChhZ2FpbikgKi8KLSAgcmV0dXJuIEdBVFRfUEVORElORzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRzX2RiX3JlYWRfYXR0cl92YWx1ZV9ieV90eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBRdWVyeSBhdHRyaWJ1dGUgdmFsdWUgYnkgYXR0cmlidXRlIHR5cGUuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBwX2RiOiBwb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgZGF0YWJhc2UuCi0gKiAgICAgICAgICAgICAgICAgIHBfcnNwOiBSZWFkIEJ5IHR5cGUgcmVzcG9uc2UgZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgc19oYW5kbGU6IHN0YXJ0aW5nIGhhbmRsZSBvZiB0aGUgcmFuZ2Ugd2UgYXJlIGxvb2tpbmcgZm9yLgotICogICAgICAgICAgICAgICAgICBlX2hhbmRsZTogZW5kaW5nIGhhbmRsZSBvZiB0aGUgcmFuZ2Ugd2UgYXJlIGxvb2tpbmcgZm9yLgotICogICAgICAgICAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGUgdHlwZS4KLSAqICAgICAgICAgICAgICAgICAgbXR1OiBNVFUuCi0gKiAgICAgICAgICAgICAgICAgIHNlY19mbGFnOiBjdXJyZW50IGxpbmsgc2VjdXJpdHkgc3RhdHVzLgotICogICAgICAgICAgICAgICAgICBrZXlfc2l6ZTogZW5jcnlwdGlvbiBrZXkgc2l6ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9TVEFUVVMgZ2F0dHNfZGJfcmVhZF9hdHRyX3ZhbHVlX2J5X3R5cGUoCi0gICAgdEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdEdBVFRfU1ZDX0RCKiBwX2RiLCB1aW50OF90IG9wX2NvZGUsCi0gICAgQlRfSERSKiBwX3JzcCwgdWludDE2X3Qgc19oYW5kbGUsIHVpbnQxNl90IGVfaGFuZGxlLCBjb25zdCBVdWlkJiB0eXBlLAotICAgIHVpbnQxNl90KiBwX2xlbiwgdEdBVFRfU0VDX0ZMQUcgc2VjX2ZsYWcsIHVpbnQ4X3Qga2V5X3NpemUsCi0gICAgdWludDMyX3QgdHJhbnNfaWQsIHVpbnQxNl90KiBwX2N1cl9oYW5kbGUpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfTk9UX0ZPVU5EOwotICB1aW50MTZfdCBsZW4gPSAwOwotICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKShwX3JzcCArIDEpICsgcF9yc3AtPmxlbiArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgaWYgKHBfZGIpIHsKLSAgICBmb3IgKHRHQVRUX0FUVFImIGF0dHIgOiBwX2RiLT5hdHRyX2xpc3QpIHsKLSAgICAgIGlmIChhdHRyLmhhbmRsZSA+PSBzX2hhbmRsZSAmJiB0eXBlID09IGF0dHIudXVpZCkgewotICAgICAgICBpZiAoKnBfbGVuIDw9IDIpIHsKLSAgICAgICAgICBzdGF0dXMgPSBHQVRUX05PX1JFU09VUkNFUzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgYXR0ci5oYW5kbGUpOwotCi0gICAgICAgIHN0YXR1cyA9IHJlYWRfYXR0cl92YWx1ZShhdHRyLCAwLCAmcCwgZmFsc2UsICh1aW50MTZfdCkoKnBfbGVuIC0gMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBzZWNfZmxhZywga2V5X3NpemUpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gR0FUVF9QRU5ESU5HKSB7Ci0gICAgICAgICAgc3RhdHVzID0gZ2F0dHNfc2VuZF9hcHBfcmVhZF9yZXF1ZXN0KHRjYiwgY2lkLCBvcF9jb2RlLCBhdHRyLmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdHJhbnNfaWQsIGF0dHIuZ2F0dF90eXBlKTsKLQotICAgICAgICAgIC8qIG9uZSBjYWxsYmFjayBhdCBhIHRpbWUgKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgaWYgKHBfcnNwLT5vZmZzZXQgPT0gMCkgcF9yc3AtPm9mZnNldCA9IGxlbiArIDI7Ci0KLSAgICAgICAgICBpZiAocF9yc3AtPm9mZnNldCA9PSBsZW4gKyAyKSB7Ci0gICAgICAgICAgICBwX3JzcC0+bGVuICs9IChsZW4gKyAyKTsKLSAgICAgICAgICAgICpwX2xlbiAtPSAobGVuICsgMik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImZvcm1hdCBtaXNtYXRjaCI7Ci0gICAgICAgICAgICBzdGF0dXMgPSBHQVRUX05PX1JFU09VUkNFUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqcF9jdXJfaGFuZGxlID0gYXR0ci5oYW5kbGU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBpbmNsdWRlZCBzZXJ2aWNlIGludG8gYSBkYXRhYmFzZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGRiOiBkYXRhYmFzZSBwb2ludGVyLgotICogICAgICAgICAgICAgICAgICBpbmNfc3J2Y190eXBlOiBpbmNsdWRlZCBzZXJ2aWNlIHR5cGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBTdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi4KLSAqCi0gKi8KLXVpbnQxNl90IGdhdHRzX2FkZF9pbmNsdWRlZF9zZXJ2aWNlKHRHQVRUX1NWQ19EQiYgZGIsIHVpbnQxNl90IHNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZV9oYW5kbGUsIGNvbnN0IFV1aWQmIHNlcnZpY2UpIHsKLSAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9JTkNMVURFX1NFUlZJQ0UpOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18KLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjogc19oZGw9MHglMDR4IGVfaGRsPTB4JTA0eCAiLCBzX2hhbmRsZSwgZV9oYW5kbGUpCi0gICAgICAgICAgPDwgInNlcnZpY2UgdXVpZCA9ICIgPDwgc2VydmljZTsKLQotICBpZiAoc2VydmljZS5Jc0VtcHR5KCkgfHwgc19oYW5kbGUgPT0gMCB8fCBlX2hhbmRsZSA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBJbGxlZ2FsIFBhcmFtcy4iOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdEdBVFRfQVRUUiYgYXR0ciA9IGFsbG9jYXRlX2F0dHJfaW5fZGIoZGIsIHV1aWQsIEdBVFRfUEVSTV9SRUFEKTsKLQotICBhdHRyLnBfdmFsdWUucmVzZXQobmV3IHRHQVRUX0FUVFJfVkFMVUUpOwotICBhdHRyLnBfdmFsdWUtPmluY2xfaGFuZGxlLnNfaGFuZGxlID0gc19oYW5kbGU7Ci0gIGF0dHIucF92YWx1ZS0+aW5jbF9oYW5kbGUuZV9oYW5kbGUgPSBlX2hhbmRsZTsKLSAgYXR0ci5wX3ZhbHVlLT5pbmNsX2hhbmRsZS5zZXJ2aWNlX3R5cGUgPSBzZXJ2aWNlOwotCi0gIHJldHVybiBhdHRyLmhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGl0cyBkZXNjcmlwdG9yIGludG8KLSAqICAgICAgICAgICAgICAgICAgYSBzZXJ2Y2UgaWRlbnRpZmllZCBieSB0aGUgc2VydmljZSBkYXRhYmFzZSBwb2ludGVyLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgZGI6IGRhdGFiYXNlLgotICogICAgICAgICAgICAgICAgICBwZXJtOiBwZXJtaXNzaW9uIChhdXRoZW50aWNhdGlvbiBhbmQga2V5IHNpemUgcmVxdWlyZW1lbnRzKQotICogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHkgb2YgdGhlIGNoYXJhY3RlcmlzdGljLgotICogICAgICAgICAgICAgICAgICBleHRlbmRlZF9wcm9wZXJ0aWVzOiBjaGFyYWN0ZXJpc3RpYyBleHRlbmRlZCBwcm9wZXJ0aWVzLgotICogICAgICAgICAgICAgICAgICBwX2NoYXI6IGNoYXJhY3RlcmlzdGljIHZhbHVlIGluZm9ybWF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgU3RhdHVzIG9mIHRlIG9wZXJhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgZ2F0dHNfYWRkX2NoYXJhY3RlcmlzdGljKHRHQVRUX1NWQ19EQiYgZGIsIHRHQVRUX1BFUk0gcGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DSEFSX1BST1AgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgY2hhcl91dWlkKSB7Ci0gIFV1aWQgdXVpZCA9IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9ERUNMQVJFKTsKLQotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiJXM6IHBlcm09MHglMHggcHJvcGVydHk9MHglMHgiLCBfX2Z1bmNfXywgcGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotCi0gIHRHQVRUX0FUVFImIGNoYXJfZGVjbCA9IGFsbG9jYXRlX2F0dHJfaW5fZGIoZGIsIHV1aWQsIEdBVFRfUEVSTV9SRUFEKTsKLSAgdEdBVFRfQVRUUiYgY2hhcl92YWwgPSBhbGxvY2F0ZV9hdHRyX2luX2RiKGRiLCBjaGFyX3V1aWQsIHBlcm0pOwotCi0gIGNoYXJfZGVjbC5wX3ZhbHVlLnJlc2V0KG5ldyB0R0FUVF9BVFRSX1ZBTFVFKTsKLSAgY2hhcl9kZWNsLnBfdmFsdWUtPmNoYXJfZGVjbC5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICBjaGFyX2RlY2wucF92YWx1ZS0+Y2hhcl9kZWNsLmNoYXJfdmFsX2hhbmRsZSA9IGNoYXJfdmFsLmhhbmRsZTsKLSAgY2hhcl92YWwuZ2F0dF90eXBlID0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDOwotCi0gIHJldHVybiBjaGFyX3ZhbC5oYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0c19hZGRfY2hhcl9leHRfcHJvcF9kZXNjcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgYWRkIGEgY2hhcmFjdGVyaXN0aWNzIGV4dGVuZGVkIHByb3BlcnRpZXMgZGVzY3JpcHRvci4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGRiOiBkYXRhYmFzZSBwb2ludGVyLgotICogICAgICAgICAgICAgICAgICBleHRlbmRlZF9wcm9wZXJ0aWVzOiBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9ycyB2YWx1ZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBTdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgZ2F0dHNfYWRkX2NoYXJfZXh0X3Byb3BfZGVzY3IoCi0gICAgdEdBVFRfU1ZDX0RCJiBkYiwgdWludDE2X3QgZXh0ZW5kZWRfcHJvcGVydGllcykgewotICBVdWlkIGRlc2NyX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfRVhUX1BST1ApOwotCi0gIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCJnYXR0c19hZGRfY2hhcl9leHRfcHJvcF9kZXNjciB1dWlkPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIHRHQVRUX0FUVFImIGNoYXJfZHNjcHRyID0gYWxsb2NhdGVfYXR0cl9pbl9kYihkYiwgZGVzY3JfdXVpZCwgR0FUVF9QRVJNX1JFQUQpOwotICBjaGFyX2RzY3B0ci5nYXR0X3R5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUjsKLSAgY2hhcl9kc2NwdHIucF92YWx1ZS5yZXNldChuZXcgdEdBVFRfQVRUUl9WQUxVRSk7Ci0gIGNoYXJfZHNjcHRyLnBfdmFsdWUtPmNoYXJfZXh0X3Byb3AgPSBleHRlbmRlZF9wcm9wZXJ0aWVzOwotCi0gIHJldHVybiBjaGFyX2RzY3B0ci5oYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0c19hZGRfY2hhcl9kZXNjcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBjaGFyYWN0ZXJpc3RpY3MgZGVzY3JpcHRvci4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfZGI6IGRhdGFiYXNlIHBvaW50ZXIuCi0gKiAgICAgICAgICAgICAgICAgIHBlcm06IGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3IgcGVybWlzc2lvbiB0eXBlLgotICogICAgICAgICAgICAgICAgICBjaGFyX2RzY3BfdHB5ZTogdGhlIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3IgbWFza3MuCi0gKiAgICAgICAgICAgICAgICAgIHBfZHNjcF9wYXJhbXM6IGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3JzIHZhbHVlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBnYXR0c19hZGRfY2hhcl9kZXNjcih0R0FUVF9TVkNfREImIGRiLCB0R0FUVF9QRVJNIHBlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVdWlkJiBkZXNjcl91dWlkKSB7Ci0gIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCJnYXR0c19hZGRfY2hhcl9kZXNjciB1dWlkPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JfdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8qIEFkZCBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9ycyAqLwotICB0R0FUVF9BVFRSJiBjaGFyX2RzY3B0ciA9IGFsbG9jYXRlX2F0dHJfaW5fZGIoZGIsIGRlc2NyX3V1aWQsIHBlcm0pOwotICBjaGFyX2RzY3B0ci5nYXR0X3R5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUjsKLSAgcmV0dXJuIGNoYXJfZHNjcHRyLmhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNlcnZpY2UgQXR0cmlidXRlIERhdGFiYXNlIFF1ZXJ5IFV0aWxpdHkgRnVuY3Rpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfQVRUUiogZmluZF9hdHRyX2J5X2hhbmRsZSh0R0FUVF9TVkNfREIqIHBfZGIsIHVpbnQxNl90IGhhbmRsZSkgewotICBpZiAoIXBfZGIpIHJldHVybiBudWxscHRyOwotCi0gIGZvciAoYXV0byYgYXR0ciA6IHBfZGItPmF0dHJfbGlzdCkgewotICAgIGlmIChhdHRyLmhhbmRsZSA9PSBoYW5kbGUpIHJldHVybiAmYXR0cjsKLSAgICBpZiAoYXR0ci5oYW5kbGUgPiBoYW5kbGUpIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0c19yZWFkX2F0dHJfdmFsdWVfYnlfaGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBRdWVyeSBhdHRyaWJ1dGUgdmFsdWUgYnkgYXR0cmlidXRlIGhhbmRsZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfZGI6IHBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZSBkYXRhYmFzZS4KLSAqICAgICAgICAgICAgICAgICAgaGFuZGxlOiBBdHRyaWJ1dGUgaGFuZGxlIHRvIHJlYWQuCi0gKiAgICAgICAgICAgICAgICAgIG9mZnNldDogUmVhZCBvZmZzZXQuCi0gKiAgICAgICAgICAgICAgICAgIHBfdmFsdWU6IG91dHB1dCBwYXJhbWV0ZXIgdG8gY2Fycnkgb3V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVuOiBvdXRwdXQgcGFyYW1ldGVyIGFzIGF0dHJpYnV0ZSBsZW5ndGggcmVhZC4KLSAqICAgICAgICAgICAgICAgICAgcmVhZF9sb25nOiB0aGlzIGlzIGEgcmVhZCBibG9iIHJlcXVlc3QuCi0gKiAgICAgICAgICAgICAgICAgIG10dTogTVRVLgotICogICAgICAgICAgICAgICAgICBzZWNfZmxhZzogY3VycmVudCBsaW5rIHNlY3VyaXR5IHN0YXR1cy4KLSAqICAgICAgICAgICAgICAgICAga2V5X3NpemU6IGVuY3J5cHRpb24ga2V5IHNpemUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFN0YXR1cyBvZiBvcGVyYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBnYXR0c19yZWFkX2F0dHJfdmFsdWVfYnlfaGFuZGxlKAotICAgIHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHRHQVRUX1NWQ19EQiogcF9kYiwgdWludDhfdCBvcF9jb2RlLAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3Qgb2Zmc2V0LCB1aW50OF90KiBwX3ZhbHVlLCB1aW50MTZfdCogcF9sZW4sCi0gICAgdWludDE2X3QgbXR1LCB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZywgdWludDhfdCBrZXlfc2l6ZSwKLSAgICB1aW50MzJfdCB0cmFuc19pZCkgewotICB0R0FUVF9BVFRSKiBwX2F0dHIgPSBmaW5kX2F0dHJfYnlfaGFuZGxlKHBfZGIsIGhhbmRsZSk7Ci0gIGlmICghcF9hdHRyKSByZXR1cm4gR0FUVF9OT1RfRk9VTkQ7Ci0KLSAgdWludDhfdCogcHAgPSBwX3ZhbHVlOwotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gcmVhZF9hdHRyX3ZhbHVlKCpwX2F0dHIsIG9mZnNldCwgJnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib29sKShvcF9jb2RlID09IEdBVFRfUkVRX1JFQURfQkxPQiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXR1LCBwX2xlbiwgc2VjX2ZsYWcsIGtleV9zaXplKTsKLQotICBpZiAoc3RhdHVzID09IEdBVFRfUEVORElORykgewotICAgIHN0YXR1cyA9IGdhdHRzX3NlbmRfYXBwX3JlYWRfcmVxdWVzdCh0Y2IsIGNpZCwgb3BfY29kZSwgcF9hdHRyLT5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgdHJhbnNfaWQsIHBfYXR0ci0+Z2F0dF90eXBlKTsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfcmVhZF9hdHRyX3Blcm1fY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIGF0dHJpYnV0ZSByZWFkYWJpbGl0eS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfZGI6IHBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZSBkYXRhYmFzZS4KLSAqICAgICAgICAgICAgICAgICAgaGFuZGxlOiBBdHRyaWJ1dGUgaGFuZGxlIHRvIHJlYWQuCi0gKiAgICAgICAgICAgICAgICAgIG9mZnNldDogUmVhZCBvZmZzZXQuCi0gKiAgICAgICAgICAgICAgICAgIHBfdmFsdWU6IG91dHB1dCBwYXJhbWV0ZXIgdG8gY2Fycnkgb3V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVuOiBvdXRwdXQgcGFyYW1ldGVyIGFzIGF0dHJpYnV0ZSBsZW5ndGggcmVhZC4KLSAqICAgICAgICAgICAgICAgICAgcmVhZF9sb25nOiB0aGlzIGlzIGEgcmVhZCBibG9iIHJlcXVlc3QuCi0gKiAgICAgICAgICAgICAgICAgIG10dTogTVRVLgotICogICAgICAgICAgICAgICAgICBzZWNfZmxhZzogY3VycmVudCBsaW5rIHNlY3VyaXR5IHN0YXR1cy4KLSAqICAgICAgICAgICAgICAgICAga2V5X3NpemU6IGVuY3J5cHRpb24ga2V5IHNpemUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFN0YXR1cyBvZiBvcGVyYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBnYXR0c19yZWFkX2F0dHJfcGVybV9jaGVjayh0R0FUVF9TVkNfREIqIHBfZGIsIGJvb2wgaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU0VDX0ZMQUcgc2VjX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfc2l6ZSkgewotICB0R0FUVF9BVFRSKiBwX2F0dHIgPSBmaW5kX2F0dHJfYnlfaGFuZGxlKHBfZGIsIGhhbmRsZSk7Ci0gIGlmICghcF9hdHRyKSByZXR1cm4gR0FUVF9OT1RfRk9VTkQ7Ci0KLSAgcmV0dXJuIGdhdHRzX2NoZWNrX2F0dHJfcmVhZGFiaWxpdHkoKnBfYXR0ciwgMCwgaXNfbG9uZywgc2VjX2ZsYWcsIGtleV9zaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRzX3dyaXRlX2F0dHJfcGVybV9jaGVjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgV3JpdGUgYXR0cmlidXRlIHZhbHVlIGludG8gZGF0YWJhc2UuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBwX2RiOiBwb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgZGF0YWJhc2UuCi0gKiAgICAgICAgICAgICAgICAgIG9wX2NvZGU6b3AgY29kZSBvZiB0aGlzIHdyaXRlLgotICogICAgICAgICAgICAgICAgICBoYW5kbGU6IGhhbmRsZSBvZiB0aGUgYXR0cmlidXRlIHRvIHdyaXRlLgotICogICAgICAgICAgICAgICAgICBvZmZzZXQ6IFdyaXRlIG9mZnNldCBpZiB3cml0ZSBvcCBjb2RlIGlzIHdyaXRlIGJsb2IuCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YTogQXR0cmlidXRlIHZhbHVlIHRvIHdyaXRlLgotICogICAgICAgICAgICAgICAgICBsZW46IGF0dHJpYnV0ZSBkYXRhIGxlbmd0aC4KLSAqICAgICAgICAgICAgICAgICAgc2VjX2ZsYWc6IGN1cnJlbnQgbGluayBzZWN1cml0eSBzdGF0dXMuCi0gKiAgICAgICAgICAgICAgICAgIGtleV9zaXplOiBlbmNyeXB0aW9uIGtleSBzaXplCi0gKgotICogUmV0dXJucyAgICAgICAgICBTdGF0dXMgb2YgdGhlIG9wZXJhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfU1RBVFVTIGdhdHRzX3dyaXRlX2F0dHJfcGVybV9jaGVjayh0R0FUVF9TVkNfREIqIHBfZGIsIHVpbnQ4X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfc2l6ZSkgewotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICIlczogb3BfY29kZT0weCUweCBoYW5kbGU9MHglMDR4IG9mZnNldD0lZCBsZW49JWQgIgotICAgICAgImtleV9zaXplPSVkIiwKLSAgICAgIF9fZnVuY19fLCBvcF9jb2RlLCBoYW5kbGUsIG9mZnNldCwgbGVuLCBrZXlfc2l6ZSk7Ci0KLSAgdEdBVFRfQVRUUiogcF9hdHRyID0gZmluZF9hdHRyX2J5X2hhbmRsZShwX2RiLCBoYW5kbGUpOwotICBpZiAoIXBfYXR0cikgcmV0dXJuIEdBVFRfTk9UX0ZPVU5EOwotCi0gIHRHQVRUX1BFUk0gcGVybSA9IHBfYXR0ci0+cGVybWlzc2lvbjsKLSAgdWludDE2X3QgbWluX2tleV9zaXplID0gKCgocGVybSAmIEdBVFRfRU5DUllQVF9LRVlfU0laRV9NQVNLKSA+PiAxMikpOwotICBpZiAobWluX2tleV9zaXplICE9IDApIHsKLSAgICBtaW5fa2V5X3NpemUgKz0gNjsKLSAgfQotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigiJXM6IHBfYXR0ci0+cGVybWlzc2lvbiA9MHglMDR4IG1pbl9rZXlfc2l6ZT09MHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfYXR0ci0+cGVybWlzc2lvbiwgbWluX2tleV9zaXplKTsKLQotICBpZiAoKG9wX2NvZGUgPT0gR0FUVF9DTURfV1JJVEUgfHwgb3BfY29kZSA9PSBHQVRUX1JFUV9XUklURSkgJiYKLSAgICAgIChwZXJtICYgR0FUVF9XUklURV9TSUdORURfUEVSTSkpIHsKLSAgICAvKiB1c2UgdGhlIHJ1bGVzIGZvciB0aGUgbWl4ZWQgc2VjdXJpdHkgc2VlIHNlY3Rpb24gMTAuMi4zKi8KLSAgICAvKiB1c2Ugc2VjdXJpdHkgbW9kZSAxIGxldmVsIDIgd2hlbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBmb2xsb3dzICovCi0gICAgLyogTEUgc2VjdXJpdHkgbW9kZSAyIGxldmVsIDEgYW5kIExFIHNlY3VyaXR5IG1vZGUgMSBsZXZlbCAyICovCi0gICAgaWYgKChwZXJtICYgR0FUVF9QRVJNX1dSSVRFX1NJR05FRCkgJiYgKHBlcm0gJiBHQVRUX1BFUk1fV1JJVEVfRU5DUllQVEVEKSkgewotICAgICAgcGVybSA9IEdBVFRfUEVSTV9XUklURV9FTkNSWVBURUQ7Ci0gICAgfQotICAgIC8qIHVzZSBzZWN1cml0eSBtb2RlIDEgbGV2ZWwgMyB3aGVuIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGZvbGxvd3MgKi8KLSAgICAvKiBMRSBzZWN1cml0eSBtb2RlIDIgbGV2ZWwgMiBhbmQgc2VjdXJpdHkgbW9kZSAxIGFuZCBMRSAqLwotICAgIGVsc2UgaWYgKCgocGVybSAmIEdBVFRfUEVSTV9XUklURV9TSUdORURfTUlUTSkgJiYKLSAgICAgICAgICAgICAgKHBlcm0gJiBHQVRUX1BFUk1fV1JJVEVfRU5DUllQVEVEKSkgfHwKLSAgICAgICAgICAgICAvKiBMRSBzZWN1cml0eSBtb2RlIDIgYW5kIHNlY3VyaXR5IG1vZGUgMSBsZXZlbCAzICovCi0gICAgICAgICAgICAgKChwZXJtICYgR0FUVF9XUklURV9TSUdORURfUEVSTSkgJiYKLSAgICAgICAgICAgICAgKHBlcm0gJiBHQVRUX1BFUk1fV1JJVEVfRU5DX01JVE0pKSkgewotICAgICAgcGVybSA9IEdBVFRfUEVSTV9XUklURV9FTkNfTUlUTTsKLSAgICB9Ci0gIH0KLQotICB0R0FUVF9TVEFUVVMgc3RhdHVzID0gR0FUVF9OT1RfRk9VTkQ7Ci0gIGlmICgob3BfY29kZSA9PSBHQVRUX1NJR05fQ01EX1dSSVRFKSAmJiAhKHBlcm0gJiBHQVRUX1dSSVRFX1NJR05FRF9QRVJNKSkgewotICAgIHN0YXR1cyA9IEdBVFRfV1JJVEVfTk9UX1BFUk1JVDsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IHNpZ24gY21kIHdyaXRlIG5vdCBhbGxvd2VkIjsKLSAgfQotICBpZiAoKG9wX2NvZGUgPT0gR0FUVF9TSUdOX0NNRF9XUklURSkgJiYgc2VjX2ZsYWcuaXNfZW5jcnlwdGVkKSB7Ci0gICAgc3RhdHVzID0gR0FUVF9JTlZBTElEX1BEVTsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBFcnJvciEhIHNpZ24gY21kIHdyaXRlIHNlbnQgb24gYSBlbmN5cHRlZCBsaW5rIjsKLSAgfSBlbHNlIGlmICghKHBlcm0gJiBHQVRUX1dSSVRFX0FMTE9XRUQpKSB7Ci0gICAgc3RhdHVzID0gR0FUVF9XUklURV9OT1RfUEVSTUlUOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogR0FUVF9XUklURV9OT1RfUEVSTUlUIjsKLSAgfQotICAvKiByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLCBidXQgbm90IGJlZW4gYXV0aGVudGljYXRlZCAqLwotICBlbHNlIGlmICgocGVybSAmIEdBVFRfV1JJVEVfQVVUSF9SRVFVSVJFRCkgJiYgIXNlY19mbGFnLmlzX2xpbmtfa2V5X2tub3duKSB7Ci0gICAgc3RhdHVzID0gR0FUVF9JTlNVRl9BVVRIRU5USUNBVElPTjsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEdBVFRfSU5TVUZfQVVUSEVOVElDQVRJT04iOwotICB9IGVsc2UgaWYgKChwZXJtICYgR0FUVF9XUklURV9NSVRNX1JFUVVJUkVEKSAmJgotICAgICAgICAgICAgICFzZWNfZmxhZy5pc19saW5rX2tleV9hdXRoZWQpIHsKLSAgICBzdGF0dXMgPSBHQVRUX0lOU1VGX0FVVEhFTlRJQ0FUSU9OOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogR0FUVF9JTlNVRl9BVVRIRU5USUNBVElPTjogTUlUTSByZXF1aXJlZCI7Ci0gIH0gZWxzZSBpZiAoKHBlcm0gJiBHQVRUX1dSSVRFX0VOQ1JZUFRFRF9QRVJNKSAmJiAhc2VjX2ZsYWcuaXNfZW5jcnlwdGVkKSB7Ci0gICAgc3RhdHVzID0gR0FUVF9JTlNVRl9FTkNSWVBUSU9OOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogR0FUVF9JTlNVRl9FTkNSWVBUSU9OIjsKLSAgfSBlbHNlIGlmICgocGVybSAmIEdBVFRfV1JJVEVfRU5DUllQVEVEX1BFUk0pICYmIHNlY19mbGFnLmlzX2VuY3J5cHRlZCAmJgotICAgICAgICAgICAgIChrZXlfc2l6ZSA8IG1pbl9rZXlfc2l6ZSkpIHsKLSAgICBzdGF0dXMgPSBHQVRUX0lOU1VGX0tFWV9TSVpFOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogR0FUVF9JTlNVRl9LRVlfU0laRSI7Ci0gIH0KLSAgLyogTEUgc2VjdXJpdHkgbW9kZSAyIGF0dHJpYnV0ZSAgKi8KLSAgZWxzZSBpZiAocGVybSAmIEdBVFRfV1JJVEVfU0lHTkVEX1BFUk0gJiYgb3BfY29kZSAhPSBHQVRUX1NJR05fQ01EX1dSSVRFICYmCi0gICAgICAgICAgICFzZWNfZmxhZy5pc19lbmNyeXB0ZWQgJiYgKHBlcm0gJiBHQVRUX1dSSVRFX0FMTE9XRUQpID09IDApIHsKLSAgICBzdGF0dXMgPSBHQVRUX0lOU1VGX0FVVEhFTlRJQ0FUSU9OOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IEdBVFRfSU5TVUZfQVVUSEVOVElDQVRJT046IExFIHNlY3VyaXR5IG1vZGUgMiByZXF1aXJlZCI7Ci0gIH0gZWxzZSAvKiB3cml0YWJsZTogbXVzdCBiZSBjaGFyIHZhbHVlIGRlY2xhcmF0aW9uIG9yIGNoYXIgZGVzY3JpdHBvcnMgKi8KLSAgewotICAgIHVpbnQxNl90IG1heF9zaXplID0gMDsKLQotICAgIGlmIChwX2F0dHItPnV1aWQuSXNFbXB0eSgpKSB7Ci0gICAgICBzdGF0dXMgPSBHQVRUX0lOVkFMSURfUERVOwotICAgIH0gZWxzZSBpZiAocF9hdHRyLT51dWlkLklzMTZCaXQoKSkgewotICAgICAgc3dpdGNoIChwX2F0dHItPnV1aWQuQXMxNkJpdCgpKSB7Ci0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfUFJFU0VOVF9GT1JNQVQ6IC8qIHNob3VsZCBiZSByZWFkYWJsZSBvbmx5ICovCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfRVhUX1BST1A6ICAgICAgIC8qIHNob3VsZCBiZSByZWFkYWJsZSBvbmx5ICovCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfQUdHX0ZPUk1BVDogICAgIC8qIHNob3VsZCBiZSByZWFkYWJsZSBvbmx5ICovCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfVkFMSURfUkFOR0U6Ci0gICAgICAgICAgc3RhdHVzID0gR0FUVF9XUklURV9OT1RfUEVSTUlUOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRzoKLSAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICAgICAgY2FzZSBHQVRUX1VVSURfQ0hBUl9TUlZSX0NPTkZJRzoKLSAgICAgICAgICBtYXhfc2l6ZSA9IDI7Ci0gICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0NIQVJfREVTQ1JJUFRJT046Ci0gICAgICAgIGRlZmF1bHQ6IC8qIGFueSBvdGhlciBtdXN0IGJlIGNoYXJhY3RlciB2YWx1ZSBkZWNsYXJhdGlvbiAqLwotICAgICAgICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgeyAgLy8gMzIgb3IgMTI4IGJpdCBVVUlECi0gICAgICBzdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0gICAgfQotCi0gICAgaWYgKHBfZGF0YSA9PSBOVUxMICYmIGxlbiA+IDApIHsKLSAgICAgIHJldHVybiBHQVRUX0lOVkFMSURfUERVOwotICAgIH0KLQotICAgIC8qIHRoZXNlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhbGxvdyB3cml0ZSBibG9iICovCi0gICAgaWYgKHBfYXR0ci0+dXVpZC5JczE2Qml0KCkgJiYKLSAgICAgICAgKHBfYXR0ci0+dXVpZC5BczE2Qml0KCkgPT0gR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRyB8fAotICAgICAgICAgcF9hdHRyLT51dWlkLkFzMTZCaXQoKSA9PSBHQVRUX1VVSURfQ0hBUl9TUlZSX0NPTkZJRykpIHsKLSAgICAgIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX1BSRVBBUkVfV1JJVEUgJiYgb2Zmc2V0ICE9IDApIHsKLSAgICAgICAgLyogZG9lcyBub3QgYWxsb3cgd3JpdGUgYmxvYiAqLwotICAgICAgICBzdGF0dXMgPSBHQVRUX05PVF9MT05HOwotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEdBVFRfTk9UX0xPTkciOwotICAgICAgfSBlbHNlIGlmIChsZW4gIT0gbWF4X3NpemUpIHsKLSAgICAgICAgLyogZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgZm9ybWF0ICovCi0gICAgICAgIHN0YXR1cyA9IEdBVFRfSU5WQUxJRF9BVFRSX0xFTjsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBHQVRUX0lOVkFMSURfUERVIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFsbG9jYXRlIGEgbWVtb3J5IHNwYWNlIGZvciBhIG5ldyBhdHRyaWJ1dGUsIGFuZCBsaW5rIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIGludG8gdGhlIGRhdGFiYXNlIGF0dHJpYnV0ZSBsaXN0LgotICoKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfZGIgICAgOiBkYXRhYmFzZSBwb2ludGVyLgotICogICAgICAgICAgICAgICAgICB1dWlkOiAgICAgYXR0cmlidXRlIFVVSUQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBhdHRyaWJ1dGUuCi0gKgotICovCi1zdGF0aWMgdEdBVFRfQVRUUiYgYWxsb2NhdGVfYXR0cl9pbl9kYih0R0FUVF9TVkNfREImIGRiLCBjb25zdCBVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfUEVSTSBwZXJtKSB7Ci0gIGlmIChkYi5uZXh0X2hhbmRsZSA+PSBkYi5lbmRfaGFuZGxlKSB7Ci0gICAgTE9HKEZBVEFMKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgPDwgIiB3cm9uZyBudW1iZXIgb2YgaGFuZGxlcyEgaGFuZGxlX21heCA9ICIgPDwgK2RiLmVuZF9oYW5kbGUKLSAgICAgICAgICAgICAgIDw8ICIsIG5leHRfaGFuZGxlID0gIiA8PCArZGIubmV4dF9oYW5kbGU7Ci0gIH0KLQotICBkYi5hdHRyX2xpc3QuZW1wbGFjZV9iYWNrKCk7Ci0gIHRHQVRUX0FUVFImIGF0dHIgPSBkYi5hdHRyX2xpc3QuYmFjaygpOwotICBhdHRyLmhhbmRsZSA9IGRiLm5leHRfaGFuZGxlKys7Ci0gIGF0dHIudXVpZCA9IHV1aWQ7Ci0gIGF0dHIucGVybWlzc2lvbiA9IHBlcm07Ci0gIHJldHVybiBhdHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfc2VuZF9hcHBfcmVhZF9yZXF1ZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGFwcGxpY2F0aW9uIHJlYWQgcmVxdWVzdCBjYWxsYmFjawotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RhdHVzIG9mIG9wZXJhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRHQVRUX1NUQVRVUyBnYXR0c19zZW5kX2FwcF9yZWFkX3JlcXVlc3QoCi0gICAgdEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgdWludDE2X3Qgb2Zmc2V0LCB1aW50MzJfdCB0cmFuc19pZCwgYnRfZ2F0dF9kYl9hdHRyaWJ1dGVfdHlwZV90IGdhdHRfdHlwZSkgewotICB0R0FUVF9TUlZfTElTVF9FTEVNJiBlbCA9ICpnYXR0X3NyX2ZpbmRfaV9yY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIHVpbnQxNl90IGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHRjYi50Y2JfaWR4LCBlbC5nYXR0X2lmKTsKLQotICBpZiAodHJhbnNfaWQgPT0gMCkgewotICAgIHRyYW5zX2lkID0gZ2F0dF9zcl9lbnF1ZXVlX2NtZCh0Y2IsIGNpZCwgb3BfY29kZSwgaGFuZGxlKTsKLSAgICBnYXR0X3NyX3VwZGF0ZV9jYmFja19jbnQodGNiLCBjaWQsIGVsLmdhdHRfaWYsIHRydWUsIHRydWUpOwotICB9Ci0KLSAgaWYgKHRyYW5zX2lkICE9IDApIHsKLSAgICB0R0FUVFNfREFUQSBzcl9kYXRhOwotICAgIG1lbXNldCgmc3JfZGF0YSwgMCwgc2l6ZW9mKHRHQVRUU19EQVRBKSk7Ci0KLSAgICBzcl9kYXRhLnJlYWRfcmVxLmhhbmRsZSA9IGhhbmRsZTsKLSAgICBzcl9kYXRhLnJlYWRfcmVxLmlzX2xvbmcgPSAoYm9vbCkob3BfY29kZSA9PSBHQVRUX1JFUV9SRUFEX0JMT0IpOwotICAgIHNyX2RhdGEucmVhZF9yZXEub2Zmc2V0ID0gb2Zmc2V0OwotCi0gICAgdWludDhfdCBvcGNvZGU7Ci0gICAgaWYgKGdhdHRfdHlwZSA9PSBCVEdBVFRfREJfREVTQ1JJUFRPUikgewotICAgICAgb3Bjb2RlID0gR0FUVFNfUkVRX1RZUEVfUkVBRF9ERVNDUklQVE9SOwotICAgIH0gZWxzZSBpZiAoZ2F0dF90eXBlID09IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQykgewotICAgICAgb3Bjb2RlID0gR0FUVFNfUkVRX1RZUEVfUkVBRF9DSEFSQUNURVJJU1RJQzsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICA8PCAiOiBBdHRlbXB0IHRvIHJlYWQgYXR0cmlidXRlIHRoYXQncyBub3QgdGllZCB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgImNoYXJhY3RlcmlzdGljIG9yIGRlc2NyaXB0b3IgdmFsdWUuIjsKLSAgICAgIHJldHVybiBHQVRUX0VSUk9SOwotICAgIH0KLQotICAgIGdhdHRfc3Jfc2VuZF9yZXFfY2FsbGJhY2soY29ubl9pZCwgdHJhbnNfaWQsIG9wY29kZSwgJnNyX2RhdGEpOwotICAgIHJldHVybiAodEdBVFRfU1RBVFVTKUdBVFRfUEVORElORzsKLSAgfSBlbHNlCi0gICAgcmV0dXJuICh0R0FUVF9TVEFUVVMpR0FUVF9CVVNZOyAvKiBtYXggcGVuZGluZyBjb21tYW5kLCBhcHBsaWNhdGlvbiBlcnJvciAqLwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svZ2F0dC9nYXR0X2ludC5oIGIvc3RhY2svZ2F0dC9nYXR0X2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ5Mjg0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2dhdHQvZ2F0dF9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEdBVFRfSU5UX0gKLSNkZWZpbmUgR0FUVF9JTlRfSAotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0bV9ibGVfYXBpLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jZGVmaW5lIEdBVFRfQ1JFQVRFX0NPTk5fSUQodGNiX2lkeCwgZ2F0dF9pZikgXAotICAoKHVpbnQxNl90KSgoKCh1aW50OF90KSh0Y2JfaWR4KSkgPDwgOCkgfCAoKHVpbnQ4X3QpKGdhdHRfaWYpKSkpCi0jZGVmaW5lIEdBVFRfR0VUX1RDQl9JRFgoY29ubl9pZCkgKCh1aW50OF90KSgoKHVpbnQxNl90KShjb25uX2lkKSkgPj4gOCkpCi0jZGVmaW5lIEdBVFRfR0VUX0dBVFRfSUYoY29ubl9pZCkgKCh0R0FUVF9JRikoKHVpbnQ4X3QpKGNvbm5faWQpKSkKLQotI2RlZmluZSBHQVRUX1RSQU5TX0lEX01BWCAweDBmZmZmZmZmIC8qIDQgTVNCIGlzIHJlc2VydmVkICovCi0KLS8qIHNlY3VyaXR5IGFjdGlvbiBmb3IgR0FUVCB3cml0ZSBhbmQgcmVhZCByZXF1ZXN0ICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgR0FUVF9TRUNfTk9ORSA9IDAsCi0gIEdBVFRfU0VDX09LID0gMSwKLSAgR0FUVF9TRUNfU0lHTl9EQVRBID0gMiwgICAgICAgLyogY29tcHV0ZSB0aGUgc2lnbmF0dXJlIGZvciB0aGUgd3JpdGUgY21kICovCi0gIEdBVFRfU0VDX0VOQ1JZUFQgPSAzLCAgICAgICAgIC8qIGVuY3J5cHQgdGhlIGxpbmsgd2l0aCBjdXJyZW50IGtleSAqLwotICBHQVRUX1NFQ19FTkNSWVBUX05PX01JVE0gPSA0LCAvKiB1bmF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbiBvciBiZXR0ZXIgKi8KLSAgR0FUVF9TRUNfRU5DUllQVF9NSVRNID0gNSwgICAgLyogYXV0aGVudGljYXRlZCBlbmNyeXB0aW9uICovCi0gIEdBVFRfU0VDX0VOQ19QRU5ESU5HID0gNiwgICAgIC8qIHdhaXQgZm9yIGxpbmsgZW5jcnlwdGlvbiBwZW5kaW5nICovCi19IHRHQVRUX1NFQ19BQ1RJT047Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgZ2F0dF9zZWN1cml0eV9hY3Rpb25fdGV4dChjb25zdCB0R0FUVF9TRUNfQUNUSU9OJiBhY3Rpb24pIHsKLSAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfU0VDX05PTkUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9TRUNfT0spOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9TRUNfU0lHTl9EQVRBKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfU0VDX0VOQ1JZUFQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9TRUNfRU5DUllQVF9OT19NSVRNKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfU0VDX0VOQ1JZUFRfTUlUTSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChHQVRUX1NFQ19FTkNfUEVORElORyk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTlslaGh1XSIsIGFjdGlvbik7Ci0gIH0KLX0KLQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLQotI2RlZmluZSBHQVRUX0lOREVYX0lOVkFMSUQgMHhmZgotCi0jZGVmaW5lIEdBVFRfV1JJVEVfQ01EX01BU0sgMHhjMCAvKjB4MTEwMC0wMDAwKi8KLSNkZWZpbmUgR0FUVF9BVVRIX1NJR05fTUFTSyAweDgwIC8qMHgxMDAwLTAwMDAqLwotI2RlZmluZSBHQVRUX0FVVEhfU0lHTl9MRU4gMTIKLQotI2RlZmluZSBHQVRUX0hEUl9TSVpFIDMgLyogMUIgb3Bjb2RlICsgMkIgaGFuZGxlICovCi0KLS8qIHdhaXQgZm9yIEFUVCBjbWQgcmVzcG9uc2UgdGltZW91dCB2YWx1ZSAqLwotI2RlZmluZSBHQVRUX1dBSVRfRk9SX1JTUF9USU1FT1VUX01TICgzMCAqIDEwMDApCi0jZGVmaW5lIEdBVFRfV0FJVF9GT1JfRElTQ19SU1BfVElNRU9VVF9NUyAoNSAqIDEwMDApCi0jZGVmaW5lIEdBVFRfUkVRX1JFVFJZX0xJTUlUIDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIGlzX2xpbmtfa2V5X2tub3duOwotICBib29sIGlzX2xpbmtfa2V5X2F1dGhlZDsKLSAgYm9vbCBpc19lbmNyeXB0ZWQ7Ci19IHRHQVRUX1NFQ19GTEFHOwotCi0vKiBGaW5kIEluZm9ybWF0aW9uIFJlc3BvbnNlIFR5cGUKLSovCi0jZGVmaW5lIEdBVFRfSU5GT19UWVBFX1BBSVJfMTYgMHgwMQotI2RlZmluZSBHQVRUX0lORk9fVFlQRV9QQUlSXzEyOCAweDAyCi0KLWNvbnN0ZXhwciBib29sIGtHYXR0Q29ubmVjdGVkID0gdHJ1ZTsKLWNvbnN0ZXhwciBib29sIGtHYXR0RGlzY29ubmVjdGVkID0gIWtHYXR0Q29ubmVjdGVkOwotCi0vKiAgR0FUVCBjbGllbnQgRklORF9UWVBFX1ZBTFVFX1JlcXVlc3QgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBibHVldG9vdGg6OlV1aWQgdXVpZDsgLyogdHlwZSBvZiBhdHRyaWJ1dGUgdG8gYmUgZm91bmQgKi8KLSAgdWludDE2X3Qgc19oYW5kbGU7ICAvKiBzdGFydGluZyBoYW5kbGUgKi8KLSAgdWludDE2X3QgZV9oYW5kbGU7ICAvKiBlbmRpbmcgaGFuZGxlICovCi0gIHVpbnQxNl90IHZhbHVlX2xlbjsgLyogbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KLSAgdWludDhfdAotICAgICAgdmFsdWVbR0FUVF9NQVhfTVRVX1NJWkVdOyAvKiBwb2ludGVyIHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYmUgZm91bmQgKi8KLX0gdEdBVFRfRklORF9UWVBFX1ZBTFVFOwotCi0vKiBjbGllbnQgcmVxdWVzdCBtZXNzYWdlIHRvIEFUVCBwcm90b2NvbAotKi8KLXR5cGVkZWYgdW5pb24gewotICB0R0FUVF9SRUFEX0JZX1RZUEUgYnJvd3NlOyAgICAgICAgICAgICAvKiByZWFkIGJ5IHR5cGUgcmVxdWVzdCAqLwotICB0R0FUVF9GSU5EX1RZUEVfVkFMVUUgZmluZF90eXBlX3ZhbHVlOyAvKiBmaW5kIGJ5IHR5cGUgdmFsdWUgKi8KLSAgdEdBVFRfUkVBRF9NVUxUSSByZWFkX211bHRpOyAgICAgICAgICAgLyogcmVhZCBtdWx0aXBsZSByZXF1ZXN0ICovCi0gIHRHQVRUX1JFQURfUEFSVElBTCByZWFkX2Jsb2I7ICAgICAgICAgIC8qIHJlYWQgYmxvYiAqLwotICB0R0FUVF9WQUxVRSBhdHRyX3ZhbHVlOyAgICAgICAgICAgICAgICAvKiB3cml0ZSByZXF1ZXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXBhcmUgd3JpdGUgKi8KLSAgLyogd3JpdGUgYmxvYiAqLwotICB1aW50MTZfdCBoYW5kbGU7IC8qIHJlYWQsICBoYW5kbGUgdmFsdWUgY29uZmlybWF0aW9uICovCi0gIHVpbnQxNl90IG10dTsKLSAgdEdBVFRfRVhFQ19GTEFHIGV4ZWNfd3JpdGU7IC8qIGV4ZWN1dGUgd3JpdGUgKi8KLX0gdEdBVFRfQ0xfTVNHOwotCi0vKiBlcnJvciByZXNwb25zZSBzdHJ1Y3V0cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50OF90IGNtZF9jb2RlOwotICB1aW50OF90IHJlYXNvbjsKLX0gdEdBVFRfRVJST1I7Ci0KLS8qIHNlcnZlciByZXNwb25zZSBtZXNzYWdlIHRvIEFUVCBwcm90b2NvbAotKi8KLXR5cGVkZWYgdW5pb24gewotICAvKiBkYXRhIHR5cGUgICAgICAgICAgICBtZW1iZXIgICAgICAgICAgZXZlbnQgICAqLwotICB0R0FUVF9WQUxVRSBhdHRyX3ZhbHVlOyAvKiBSRUFELCBIQU5ETEVfVkFMVUVfSU5ELCBQUkVQQVJFX1dSSVRFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFQURfQkxPQiwgUkVBRF9CWV9UWVBFICovCi0gIHRHQVRUX0VSUk9SIGVycm9yOyAgICAgIC8qIEVSUk9SX1JTUCAqLwotICB1aW50MTZfdCBoYW5kbGU7ICAgICAgICAvKiBXUklURSwgV1JJVEVfQkxPQiAqLwotICB1aW50MTZfdCBtdHU7ICAgICAgICAgICAvKiBleGNoYW5nZSBNVFUgcmVxdWVzdCAqLwotfSB0R0FUVF9TUl9NU0c7Ci0KLS8qIENoYXJhY3RlcmlzdGljIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSB2YWx1ZQotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfQ0hBUl9QUk9QIHByb3BlcnR5OwotICB1aW50MTZfdCBjaGFyX3ZhbF9oYW5kbGU7Ci19IHRHQVRUX0NIQVJfREVDTDsKLQotLyogYXR0cmlidXRlIHZhbHVlIG1haW50YWluZWQgaW4gdGhlIHNlcnZlciBkYXRhYmFzZQotKi8KLXR5cGVkZWYgdW5pb24gewotICBibHVldG9vdGg6OlV1aWQgdXVpZDsgICAgICAgIC8qIHNlcnZpY2UgZGVjbGFyYXRpb24gKi8KLSAgdEdBVFRfQ0hBUl9ERUNMIGNoYXJfZGVjbDsgICAvKiBjaGFyYWN0ZXJpc3RpYyBkZWNsYXJhdGlvbiAqLwotICB0R0FUVF9JTkNMX1NSVkMgaW5jbF9oYW5kbGU7IC8qIGluY2x1ZGVkIHNlcnZpY2UgKi8KLSAgdWludDE2X3QgY2hhcl9leHRfcHJvcDsgICAgICAvKiBDaGFyYWN0ZXJpc3RpYyBFeHRlbmRlZCBQcm9wZXJ0aWVzICovCi19IHRHQVRUX0FUVFJfVkFMVUU7Ci0KLS8qIEF0dHJpYnV0ZSBVVUlEIHR5cGUKLSovCi0jZGVmaW5lIEdBVFRfQVRUUl9VVUlEX1RZUEVfMTYgMAotI2RlZmluZSBHQVRUX0FUVFJfVVVJRF9UWVBFXzEyOCAxCi0jZGVmaW5lIEdBVFRfQVRUUl9VVUlEX1RZUEVfMzIgMgotdHlwZWRlZiB1aW50OF90IHRHQVRUX0FUVFJfVVVJRF9UWVBFOwotCi0vKiAxNiBiaXRzIFVVSUQgQXR0cmlidXRlIGluIHNlcnZlciBkYXRhYmFzZQotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RkOjp1bmlxdWVfcHRyPHRHQVRUX0FUVFJfVkFMVUU+IHBfdmFsdWU7Ci0gIHRHQVRUX1BFUk0gcGVybWlzc2lvbjsKLSAgdWludDE2X3QgaGFuZGxlOwotICBibHVldG9vdGg6OlV1aWQgdXVpZDsKLSAgYnRfZ2F0dF9kYl9hdHRyaWJ1dGVfdHlwZV90IGdhdHRfdHlwZTsKLX0gdEdBVFRfQVRUUjsKLQotLyogU2VydmljZSBEYXRhYmFzZSBkZWZpbml0aW9uCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBzdGQ6OnZlY3Rvcjx0R0FUVF9BVFRSPiBhdHRyX2xpc3Q7IC8qIHBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZXMgKi8KLSAgdWludDE2X3QgZW5kX2hhbmRsZTsgICAgICAgLyogTGFzdCBoYW5kbGUgbnVtYmVyICAgICAgICAgICAqLwotICB1aW50MTZfdCBuZXh0X2hhbmRsZTsgICAgICAvKiBOZXh0IHVzYWJsZSBoYW5kbGUgdmFsdWUgICAgICovCi19IHRHQVRUX1NWQ19EQjsKLQotLyogRGF0YSBTdHJ1Y3R1cmUgdXNlZCBmb3IgR0FUVCBzZXJ2ZXIgKi8KLS8qIEFuIEdBVFQgcmVnaXN0cmF0aW9uIHJlY29yZCBjb25zaXN0cyBvZiBhIGhhbmRsZSwgYW5kIDEgb3IgbW9yZSBhdHRyaWJ1dGVzICovCi0vKiBBIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIHJlY29yZCBjb25zaXN0cyBvZiBiZWdpbm5pbmcgYW5kIGVuZGluZyAqLwotLyogYXR0cmlidXRlIGhhbmRsZSwgc2VydmljZSBVVUlEIGFuZCBhIHNldCBvZiBHQVRUIHNlcnZlciBjYWxsYmFjay4gICAgICAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBibHVldG9vdGg6OlV1aWQgYXBwX3V1aWQxMjg7Ci0gIHRHQVRUX0NCQUNLIGFwcF9jYnt9OwotICB0R0FUVF9JRiBnYXR0X2lmezB9OyAvKiBvbmUgYmFzZWQgKi8KLSAgYm9vbCBpbl91c2V7ZmFsc2V9OwotICB1aW50OF90IGxpc3RlbmluZ3swfTsgLyogaWYgYWR2IGZvciBhbGwgaGFzIGJlZW4gZW5hYmxlZCAqLwotICBib29sIGVhdHRfc3VwcG9ydHtmYWxzZX07Ci0gIHN0ZDo6c3RyaW5nIG5hbWU7Ci19IHRHQVRUX1JFRzsKLQotc3RydWN0IHRHQVRUX0NMQ0I7Ci0KLS8qIGNvbW1hbmQgcXVldWUgZm9yIGVhY2ggY29ubmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFIqIHBfY21kOwotICB0R0FUVF9DTENCKiBwX2NsY2I7Ci0gIHVpbnQ4X3Qgb3BfY29kZTsKLSAgYm9vbCB0b19zZW5kOwotICB1aW50MTZfdCBjaWQ7Ci19IHRHQVRUX0NNRF9ROwotCi0jaWYgR0FUVF9NQVhfU1JfUFJPRklMRVMgPD0gOAotdHlwZWRlZiB1aW50OF90IHRHQVRUX0FQUF9NQVNLOwotI2VsaWYgR0FUVF9NQVhfU1JfUFJPRklMRVMgPD0gMTYKLXR5cGVkZWYgdWludDE2X3QgdEdBVFRfQVBQX01BU0s7Ci0jZWxpZiBHQVRUX01BWF9TUl9QUk9GSUxFUyA8PSAzMgotdHlwZWRlZiB1aW50MzJfdCB0R0FUVF9BUFBfTUFTSzsKLSNlbmRpZgotCi0vKiBjb21tYW5kIGRldGFpbHMgZm9yIGVhY2ggY29ubmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBCVF9IRFIqIHBfcnNwX21zZzsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0gIHRHQVRUX1JFQURfTVVMVEkgbXVsdGlfcmVxOwotICBmaXhlZF9xdWV1ZV90KiBtdWx0aV9yc3BfcTsKLSAgdWludDE2X3QgaGFuZGxlOwotICB1aW50OF90IG9wX2NvZGU7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50OF90IGNiYWNrX2NudFtHQVRUX01BWF9BUFBTXTsKLSAgdWludDE2X3QgY2lkOwotfSB0R0FUVF9TUl9DTUQ7Ci0KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBHQVRUX0NIX0NMT1NFID0gMCwKLSAgR0FUVF9DSF9DTE9TSU5HID0gMSwKLSAgR0FUVF9DSF9DT05OID0gMiwKLSAgR0FUVF9DSF9DRkcgPSAzLAotICBHQVRUX0NIX09QRU4gPSA0LAotfSB0R0FUVF9DSF9TVEFURTsKLQotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0KLWlubGluZSBzdGQ6OnN0cmluZyBnYXR0X2NoYW5uZWxfc3RhdGVfdGV4dChjb25zdCB0R0FUVF9DSF9TVEFURSYgc3RhdGUpIHsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9DSF9DTE9TRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChHQVRUX0NIX0NMT1NJTkcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9DSF9DT05OKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfQ0hfQ0ZHKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfQ0hfT1BFTik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTlslaGh1XSIsIHN0YXRlKTsKLSAgfQotfQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLQotI2RlZmluZSBHQVRUX0dBVFRfU1RBUlRfSEFORExFIDEKLSNkZWZpbmUgR0FUVF9HQVBfU1RBUlRfSEFORExFIDIwCi0jZGVmaW5lIEdBVFRfQVBQX1NUQVJUX0hBTkRMRSA0MAotCi0jaWZuZGVmIEdBVFRfREVGQVVMVF9TVEFSVF9IQU5ETEUKLSNkZWZpbmUgR0FUVF9ERUZBVUxUX1NUQVJUX0hBTkRMRSBHQVRUX0dBVFRfU1RBUlRfSEFORExFCi0jZW5kaWYKLQotI2lmbmRlZiBHQVRUX0xBU1RfSEFORExFCi0jZGVmaW5lIEdBVFRfTEFTVF9IQU5ETEUgMHhGRkZGCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgaGRsX2NmZyB7Ci0gIHVpbnQxNl90IGdhdHRfc3RhcnRfaGRsOwotICB1aW50MTZfdCBnYXBfc3RhcnRfaGRsOwotICB1aW50MTZfdCBhcHBfc3RhcnRfaGRsOwotfSB0R0FUVF9IRExfQ0ZHOwotCi10eXBlZGVmIHN0cnVjdCBoZGxfbGlzdF9lbGVtIHsKLSAgdEdBVFRTX0hORExfUkFOR0UgYXNnbl9yYW5nZTsgLyogYXNzaWduZWQgaGFuZGxlIHJhbmdlICovCi0gIHRHQVRUX1NWQ19EQiBzdmNfZGI7Ci19IHRHQVRUX0hETF9MSVNUX0VMRU07Ci0KLS8qIERhdGEgU3RydWN0dXJlIHVzZWQgZm9yIEdBVFQgc2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBBIEdBVFQgcmVnaXN0cmF0aW9uIHJlY29yZCBjb25zaXN0cyBvZiBhIGhhbmRsZSwgYW5kIDEgb3IgbW9yZSBhdHRyaWJ1dGVzICAqLwotLyogQSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiByZWNvcmQgY29uc2lzdHMgb2YgYmVnaW5uaW5nIGFuZCBlbmRpbmcgKi8KLS8qIGF0dHJpYnV0ZSBoYW5kbGUsIHNlcnZpY2UgVVVJRCBhbmQgYSBzZXQgb2YgR0FUVCBzZXJ2ZXIgY2FsbGJhY2suICAgICAgICAgICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX1NWQ19EQiogcF9kYjsgIC8qIHBvaW50ZXIgdG8gdGhlIHNlcnZpY2UgZGF0YWJhc2UgKi8KLSAgYmx1ZXRvb3RoOjpVdWlkIGFwcF91dWlkOyAvKiBhcHBsaWNhdGlvbiBVVUlEICovCi0gIHVpbnQzMl90IHNkcF9oYW5kbGU7IC8qIHByaW1hbXJ5IHNlcnZpY2UgU0RQIGhhbmRsZSAqLwotICB1aW50MTZfdCB0eXBlOyAgICAgICAvKiBzZXJ2aWNlIHR5cGUgVVVJRCwgcHJpbWFyeSBvciBzZWNvbmRhcnkgKi8KLSAgdWludDE2X3Qgc19oZGw7ICAgICAgLyogc2VydmljZSBzdGFydGluZyBoYW5kbGUgKi8KLSAgdWludDE2X3QgZV9oZGw7ICAgICAgLyogc2VydmljZSBlbmRpbmcgaGFuZGxlICovCi0gIHRHQVRUX0lGIGdhdHRfaWY7ICAgIC8qIHRoaXMgc2VydmljZSBpcyBiZWxvbmcgdG8gd2hpY2ggYXBwbGljYXRpb24gKi8KLSAgYm9vbCBpc19wcmltYXJ5OwotfSB0R0FUVF9TUlZfTElTVF9FTEVNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0ZDo6cXVldWU8dEdBVFRfQ0xDQio+IHBlbmRpbmdfZW5jX2NsY2I7IC8qIHBlbmRpbmcgZW5jcnlwdGlvbiBjaGFubmVsIHEgKi8KLSAgdEdBVFRfU0VDX0FDVElPTiBzZWNfYWN0OwotICBSYXdBZGRyZXNzIHBlZXJfYmRhOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0KLSAgLyogSW5kaWNhdGVzIG51bWJlciBvZiBhdmFpbGFibGUgZWF0dCBjaGFubmVscyAqLwotICB1aW50OF90IGVhdHQ7Ci0KLSAgdWludDE2X3QgYXR0X2xjaWQ7IC8qIEwyQ0FQIGNoYW5uZWwgSUQgZm9yIEFUVCAqLwotICB1aW50MTZfdCBwYXlsb2FkX3NpemU7Ci0KLSAgdEdBVFRfQ0hfU1RBVEUgY2hfc3RhdGU7Ci0KLSAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQ4X3Q+IGFwcF9ob2xkX2xpbms7Ci0KLSAgLyogc2VydmVyIG5lZWRzICovCi0gIC8qIHNlcnZlciByZXNwb25zZSBkYXRhICovCi0gIHRHQVRUX1NSX0NNRCBzcl9jbWQ7Ci0gIHVpbnQxNl90IGluZGljYXRlX2hhbmRsZTsKLSAgZml4ZWRfcXVldWVfdCogcGVuZGluZ19pbmRfcTsKLQotICBhbGFybV90KiBjb25mX3RpbWVyOyAvKiBwZWVyIGNvbmZpcm0gdG8gaW5kaWNhdGlvbiB0aW1lciAqLwotCi0gIHVpbnQ4X3QgcHJlcF9jbnRbR0FUVF9NQVhfQVBQU107Ci0gIHVpbnQ4X3QgaW5kX2NvdW50OwotCi0gIHN0ZDo6cXVldWU8dEdBVFRfQ01EX1E+IGNsX2NtZF9xOwotICBhbGFybV90KiBpbmRfYWNrX3RpbWVyOyAvKiBsb2NhbCBhcHAgY29uZmlybSB0byBpbmRpY2F0aW9uIHRpbWVyICovCi0KLSAgLy8gVE9ETyhoeWxvKTogc3VwcG9ydCBieXRlIGFycmF5IGRhdGEKLSAgLyogQ2xpZW50IHN1cHBvcnRlZCBmZWF0dXJlKi8KLSAgdWludDhfdCBjbF9zdXBwX2ZlYXQ7Ci0gIC8qIFNlcnZlciBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLSAgdWludDhfdCBzcl9zdXBwX2ZlYXQ7Ci0gIC8qIFVzZSBmb3Igc2VydmVyLiBpZiBmYWxzZSwgc2hvdWxkIGhhbmRsZSBkYXRhYmFzZSBvdXQgb2Ygc3luYy4gKi8KLSAgYm9vbCBpc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlOwotCi0gIGJvb2wgaW5fdXNlOwotICB1aW50OF90IHRjYl9pZHg7Ci19IHRHQVRUX1RDQjsKLQotLyogbG9naWMgY2hhbm5lbCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdAotICAgICAgbmV4dF9kaXNjX3N0YXJ0X2hkbDsgLyogc3RhcnRpbmcgaGFuZGxlIGZvciB0aGUgbmV4dCBpbmMgc3J2diBkaXNjb3ZlcnkgKi8KLSAgdEdBVFRfRElTQ19SRVMgcmVzdWx0OwotICBib29sIHdhaXRfZm9yX3JlYWRfcnNwOwotfSB0R0FUVF9SRUFEX0lOQ19VVUlEMTI4Owotc3RydWN0IHRHQVRUX0NMQ0IgewotICB0R0FUVF9UQ0IqIHBfdGNiOyAvKiBhc3NvY2lhdGVkIFRDQiBvZiB0aGlzIENMQ0IgKi8KLSAgdEdBVFRfUkVHKiBwX3JlZzsgLyogb3duZXIgb2YgdGhpcyBDTENCICovCi0gIHVpbnQ4X3Qgc2NjYl9pZHg7Ci0gIHVpbnQ4X3QqIHBfYXR0cl9idWY7IC8qIGF0dHJpYnV0ZSBidWZmZXIgZm9yIHJlYWQgbXVsdGlwbGUsIHByZXBhcmUgd3JpdGUgKi8KLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQ7Ci0gIHVpbnQxNl90IGNvbm5faWQ7IC8qIGNvbm5lY3Rpb24gaGFuZGxlICovCi0gIHVpbnQxNl90IHNfaGFuZGxlOyAvKiBzdGFydGluZyBoYW5kbGUgb2YgdGhlIGFjdGl2ZSByZXF1ZXN0ICovCi0gIHVpbnQxNl90IGVfaGFuZGxlOyAvKiBlbmRpbmcgaGFuZGxlIG9mIHRoZSBhY3RpdmUgcmVxdWVzdCAqLwotICB1aW50MTZfdCBjb3VudGVyOyAvKiB1c2VkIGFzIG9mZnNldCwgYXR0cmlidXRlIGxlbmd0aCwgbnVtIG9mIHByZXBhcmUgd3JpdGUgKi8KLSAgdWludDE2X3Qgc3RhcnRfb2Zmc2V0OwotICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcTsgLyogYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnQgKi8KLSAgdEdBVFRDX09QVFlQRSBvcGVyYXRpb247IC8qIG9uZSBsb2dpYyBjaGFubmVsIGNhbiBoYXZlIG9uZSBvcGVyYXRpb24gYWN0aXZlICovCi0gIHVpbnQ4X3Qgb3Bfc3VidHlwZTsgICAgICAvKiBvcGVyYXRpb24gc3VidHlwZSAqLwotICB0R0FUVF9TVEFUVVMgc3RhdHVzOyAgICAgLyogb3BlcmF0aW9uIHN0YXR1cyAqLwotICBib29sIGZpcnN0X3JlYWRfYmxvYl9hZnRlcl9yZWFkOwotICB0R0FUVF9SRUFEX0lOQ19VVUlEMTI4IHJlYWRfdXVpZDEyODsKLSAgYm9vbCBpbl91c2U7Ci0gIGFsYXJtX3QqIGdhdHRfcnNwX3RpbWVyX2VudDsgLyogcGVlciByZXNwb25zZSB0aW1lciAqLwotICB1aW50OF90IHJldHJ5X2NvdW50OwotICB1aW50MTZfdCByZWFkX3JlcV9jdXJyZW50X210dTsgLyogVGhpcyBpcyB0aGUgTVRVIHZhbHVlIHRoYXQgdGhlIHJlYWQgd2FzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWF0ZWQgd2l0aCAqLwotICB1aW50MTZfdCBjaWQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgdXVpZDsKLSAgdWludDMyX3Qgc2VydmljZV9jaGFuZ2U7Ci19IHRHQVRUX1NWQ19DSEc7Ci0KLSNkZWZpbmUgR0FUVF9TVkNfQ0hBTkdFRF9DT05ORUNUSU5HIDEgICAgIC8qIHdhaXQgZm9yIGNvbm5lY3Rpb24gKi8KLSNkZWZpbmUgR0FUVF9TVkNfQ0hBTkdFRF9TRVJWSUNFIDIgICAgICAgIC8qIEdBVFQgc2VydmljZSBkaXNjb3ZlcnkgKi8KLSNkZWZpbmUgR0FUVF9TVkNfQ0hBTkdFRF9DSEFSQUNURVJJU1RJQyAzIC8qIHNlcnZpY2UgY2hhbmdlIGNoYXIgZGlzY292ZXJ5ICovCi0jZGVmaW5lIEdBVFRfU1ZDX0NIQU5HRURfREVTQ1JJUFRPUiA0ICAgICAvKiBzZXJ2aWNlIGNoYW5nZSBDQ0MgZGlzY29lcnkgKi8KLSNkZWZpbmUgR0FUVF9TVkNfQ0hBTkdFRF9DT05GSUdVUkVfQ0NDRCA1IC8qIGNvbmZpZyBDQ0MgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOwotICBib29sIGluX3VzZTsKLSAgYm9vbCBjb25uZWN0ZWQ7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsKLQotICAvKiBHQVRUIHNlcnZpY2UgY2hhbmdlIENDQyByZWxhdGVkIHZhcmlhYmxlcyAqLwotICB1aW50OF90IGNjY19zdGFnZTsKLSAgdWludDhfdCBjY2NfcmVzdWx0OwotICB1aW50MTZfdCBzX2hhbmRsZTsKLSAgdWludDE2X3QgZV9oYW5kbGU7Ci19IHRHQVRUX1BST0ZJTEVfQ0xDQjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9UQ0IgdGNiW0dBVFRfTUFYX1BIWV9DSEFOTkVMXTsKLSAgZml4ZWRfcXVldWVfdCogc2lnbl9vcF9xdWV1ZTsKLQotICB1aW50MTZfdCBuZXh0X2hhbmRsZTsgICAgIC8qIG5leHQgYXZhaWxhYmxlIGhhbmRsZSAqLwotICB1aW50MTZfdCBsYXN0X3NlcnZpY2VfaGFuZGxlOyAvKiBoYW5kbGUgb2YgbGFzdCBzZXJ2aWNlICovCi0gIHRHQVRUX1NWQ19DSEcgZ2F0dHBfYXR0cjsgLyogR0FUVCBwcm9maWxlIGF0dHJpYnV0ZSBzZXJ2aWNlIGNoYW5nZSAqLwotICB0R0FUVF9JRiBnYXR0X2lmOwotICBzdGQ6Omxpc3Q8dEdBVFRfSERMX0xJU1RfRUxFTT4qIGhkbF9saXN0X2luZm87Ci0gIHN0ZDo6bGlzdDx0R0FUVF9TUlZfTElTVF9FTEVNPiogc3J2X2xpc3RfaW5mbzsKLQotICBmaXhlZF9xdWV1ZV90KiBzcnZfY2hnX2NsdF9xOyAvKiBzZXJ2aWNlIGNoYW5nZSBjbGllbnRzIHF1ZXVlICovCi0gIHRHQVRUX1JFRyBjbF9yY2JbR0FUVF9NQVhfQVBQU107Ci0gIHRHQVRUX0NMQ0IgY2xjYltHQVRUX0NMX01BWF9MQ0JdOyAvKiBjb25uZWN0aW9uIGxpbmsgY29udHJvbCBibG9jayovCi0KLSNpZiAoR0FUVF9DT05GT1JNQU5DRV9URVNUSU5HID09IFRSVUUpCi0gIGJvb2wgZW5hYmxlX2Vycl9yc3A7Ci0gIHVpbnQ4X3QgcmVxX29wX2NvZGU7Ci0gIHVpbnQ4X3QgZXJyX3N0YXR1czsKLSAgdWludDE2X3QgaGFuZGxlOwotI2VuZGlmCi0KLSAgdEdBVFRfUFJPRklMRV9DTENCIHByb2ZpbGVfY2xjYltHQVRUX01BWF9BUFBTXTsKLSAgdWludDE2X3QKLSAgICAgIGhhbmRsZV9vZl9oX3I7IC8qIEhhbmRsZSBvZiB0aGUgaGFuZGxlcyByZXVzZWQgY2hhcmFjdGVyaXN0aWMgdmFsdWUgKi8KLSAgdWludDE2X3QgaGFuZGxlX2NsX3N1cHBvcnRlZF9mZWF0OwotICB1aW50MTZfdCBoYW5kbGVfc3Jfc3VwcG9ydGVkX2ZlYXQ7Ci0gIHVpbnQ4X3QKLSAgICAgIGdhdHRfc3ZyX3N1cHBvcnRlZF9mZWF0X21hc2s7IC8qIExvY2FsIHN1cHBvcnRlZCBmZWF0dXJlcyBhcyBhIHNlcnZlciAqLwotCi0gIC8qIFN1cHBvcnRlZCBmZWF0dXJlcyBhcyBhIGNsaWVudC4gVG8gYmUgd3JpdHRlbiB0byByZW1vdGUgZGV2aWNlLgotICAgKiBOb3RlIHRoaXMgaXMgTk9UIGEgdmFsdWUgb2YgdGhlIGNoYXJhY3RlcmlzdGljIHdpdGggaGFuZGxlCi0gICAqIGhhbmRsZV9jbF9zdXBwb3J0X2ZlYXQsIGFzIHRoYXQgb25lIHNob3VsZCBiZSB3cml0dGVuIGJ5IHJlbW90ZSBkZXZpY2UuCi0gICAqLwotICB1aW50OF90IGdhdHRfY2xfc3VwcG9ydGVkX2ZlYXRfbWFzazsKLQotICB1aW50MTZfdCBoYW5kbGVfb2ZfZGF0YWJhc2VfaGFzaDsKLSAgT2N0ZXQxNiBkYXRhYmFzZV9oYXNoOwotCi0gIHRHQVRUX0FQUExfSU5GTyBjYl9pbmZvOwotCi0gIHRHQVRUX0hETF9DRkcgaGRsX2NmZzsKLX0gdEdBVFRfQ0I7Ci0KLSNkZWZpbmUgR0FUVF9TSVpFX09GX1NSVl9DSEdfSE5ETF9SQU5HRSA0Ci0KLS8qIEdsb2JhbCBHQVRUIGRhdGEgKi8KLWV4dGVybiB0R0FUVF9DQiBnYXR0X2NiOwotCi0jaWYgKEdBVFRfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotZXh0ZXJuIHZvaWQgZ2F0dF9zZXRfZXJyX3JzcChib29sIGVuYWJsZSwgdWludDhfdCByZXFfb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcnJfc3RhdHVzKTsKLSNlbmRpZgotCi0vKiBmcm9tIGdhdHRfbWFpbi5jYyAqLwotZXh0ZXJuIGJvb2wgZ2F0dF9kaXNjb25uZWN0KHRHQVRUX1RDQiogcF90Y2IpOwotZXh0ZXJuIGJvb2wgZ2F0dF9hY3RfY29ubmVjdCh0R0FUVF9SRUcqIHBfcmVnLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgaW50OF90IGluaXRpYXRpbmdfcGh5cyk7Ci1leHRlcm4gYm9vbCBnYXR0X2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdEdBVFRfVENCKiBwX3RjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdWludDhfdCBpbml0aWF0aW5nX3BoeXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfSUYgZ2F0dF9pZik7Ci1leHRlcm4gdm9pZCBnYXR0X2RhdGFfcHJvY2Vzcyh0R0FUVF9UQ0ImIHBfdGNiLCB1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9idWYpOwotZXh0ZXJuIHZvaWQgZ2F0dF91cGRhdGVfYXBwX3VzZV9saW5rX2ZsYWcodEdBVFRfSUYgZ2F0dF9pZiwgdEdBVFRfVENCKiBwX3RjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYWRkLCBib29sIGNoZWNrX2FjbF9saW5rKTsKLQotZXh0ZXJuIHZvaWQgZ2F0dF9wcm9maWxlX2RiX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBnYXR0X3NldF9jaF9zdGF0ZSh0R0FUVF9UQ0IqIHBfdGNiLCB0R0FUVF9DSF9TVEFURSBjaF9zdGF0ZSk7Ci1leHRlcm4gdEdBVFRfQ0hfU1RBVEUgZ2F0dF9nZXRfY2hfc3RhdGUodEdBVFRfVENCKiBwX3RjYik7Ci1leHRlcm4gdm9pZCBnYXR0X2luaXRfc3J2X2NoZyh2b2lkKTsKLWV4dGVybiB2b2lkIGdhdHRfcHJvY19zcnZfY2hnKHZvaWQpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zZW5kX3Nydl9jaGdfaW5kKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRhKTsKLWV4dGVybiB2b2lkIGdhdHRfY2hrX3Nydl9jaGcodEdBVFRTX1NSVl9DSEcqIHBfc3J2X2NoZ19jbHQpOwotZXh0ZXJuIHZvaWQgZ2F0dF9hZGRfYV9ib25kZWRfZGV2X2Zvcl9zcnZfY2hnKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLS8qIGZyb20gZ2F0dF9hdHRyLmNjICovCi1leHRlcm4gdWludDE2X3QgZ2F0dF9wcm9maWxlX2ZpbmRfY29ubl9pZF9ieV9iZF9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLWV4dGVybiBib29sIGdhdHRfcHJvZmlsZV9nZXRfZWF0dF9zdXBwb3J0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpOwotZXh0ZXJuIHZvaWQgZ2F0dF9jbF9pbml0X3NyX3N0YXR1cyh0R0FUVF9UQ0ImIHRjYik7Ci1leHRlcm4gYm9vbCBnYXR0X2NsX3JlYWRfc3Jfc3VwcF9mZWF0X3JlcSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJiwgdWludDhfdCk+IGNiKTsKLQotZXh0ZXJuIGJvb2wgZ2F0dF9zcl9pc19jbF9jaGFuZ2VfYXdhcmUodEdBVFRfVENCJiB0Y2IpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zcl9pbml0X2NsX3N0YXR1cyh0R0FUVF9UQ0ImIHRjYik7Ci1leHRlcm4gdm9pZCBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXModEdBVFRfVENCJiB0Y2IsIGJvb2wgY2hnX3VuYXdhcmUpOwotCi0vKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgYXR0X3Byb3RvY29sLmNjICovCi1leHRlcm4gdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9jbF9jb25maXJtYXRpb25fbXNnKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQpOwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBhdHRwX3NlbmRfY2xfbXNnKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcF9jb2RlLCB0R0FUVF9DTF9NU0cqIHBfbXNnKTsKLWV4dGVybiBCVF9IRFIqIGF0dHBfYnVpbGRfc3JfbXNnKHRHQVRUX1RDQiYgdGNiLCB1aW50OF90IG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TUl9NU0cqIHBfbXNnKTsKLWV4dGVybiB0R0FUVF9TVEFUVVMgYXR0cF9zZW5kX3NyX21zZyh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9tc2cpOwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBhdHRwX3NlbmRfbXNnX3RvX2wyY2FwKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3RvTDJDQVApOwotCi0vKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHVpbnQ4X3QqIGdhdHRfZGJnX29wX25hbWUodWludDhfdCBvcF9jb2RlKTsKLWV4dGVybiB1aW50MzJfdCBnYXR0X2FkZF9zZHBfcmVjb3JkKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN0YXJ0X2hkbCwgdWludDE2X3QgZW5kX2hkbCk7Ci1leHRlcm4gYm9vbCBnYXR0X3BhcnNlX3V1aWRfZnJvbV9jbWQoYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWQsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcF9kYXRhKTsKLWV4dGVybiB1aW50OF90IGdhdHRfYnVpbGRfdXVpZF90b19zdHJlYW1fbGVuKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCk7Ci1leHRlcm4gdWludDhfdCBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtKHVpbnQ4X3QqKiBwX2RzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKTsKLWV4dGVybiB2b2lkIGdhdHRfc3JfZ2V0X3NlY19pbmZvKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NFQ19GTEFHKiBwX3NlY19mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9rZXlfc2l6ZSk7Ci1leHRlcm4gdm9pZCBnYXR0X3N0YXJ0X3JzcF90aW1lcih0R0FUVF9DTENCKiBwX2NsY2IpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zdG9wX3JzcF90aW1lcih0R0FUVF9DTENCKiBwX2NsY2IpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zdGFydF9jb25mX3RpbWVyKHRHQVRUX1RDQiogcF90Y2IsIHVpbnQxNl90IGNpZCk7Ci1leHRlcm4gdm9pZCBnYXR0X3N0b3BfY29uZl90aW1lcih0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKTsKLWV4dGVybiB2b2lkIGdhdHRfcnNwX3RpbWVvdXQodm9pZCogZGF0YSk7Ci1leHRlcm4gdm9pZCBnYXR0X2luZGljYXRpb25fY29uZmlybWF0aW9uX3RpbWVvdXQodm9pZCogZGF0YSk7Ci1leHRlcm4gdm9pZCBnYXR0X2luZF9hY2tfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiB2b2lkIGdhdHRfc3RhcnRfaW5kX2Fja190aW1lcih0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKTsKLWV4dGVybiB2b2lkIGdhdHRfc3RvcF9pbmRfYWNrX3RpbWVyKHRHQVRUX1RDQiogcF90Y2IsIHVpbnQxNl90IGNpZCk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIGdhdHRfc2VuZF9lcnJvcl9yc3AodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVycl9jb2RlLCB1aW50OF90IG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCBib29sIGRlcSk7Ci0KLWV4dGVybiBib29sIGdhdHRfaXNfc3J2X2NoZ19pbmRfcGVuZGluZyh0R0FUVF9UQ0IqIHBfdGNiKTsKLWV4dGVybiB0R0FUVFNfU1JWX0NIRyogZ2F0dF9pc19iZGFfaW5fdGhlX3Nydl9jaGdfY2x0X2xpc3QoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLQotZXh0ZXJuIGJvb2wgZ2F0dF9maW5kX3RoZV9jb25uZWN0ZWRfYmRhKHVpbnQ4X3Qgc3RhcnRfaWR4LCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9mb3VuZF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCogcF90cmFuc3BvcnQpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zZXRfc3J2X2NoZyh2b2lkKTsKLWV4dGVybiB2b2lkIGdhdHRfZGVsZXRlX2Rldl9mcm9tX3Nydl9jaGdfY2x0X2xpc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gdm9pZCBnYXR0X2FkZF9wZW5kaW5nX2luZCh0R0FUVF9UQ0IqIHBfdGNiLCB0R0FUVF9WQUxVRSogcF9pbmQpOwotZXh0ZXJuIHZvaWQgZ2F0dF9mcmVlX3NydmNfZGJfYnVmZmVyX2FwcF9pZChjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF9pZCk7Ci1leHRlcm4gYm9vbCBnYXR0X2NsX3NlbmRfbmV4dF9jbWRfaW5xKHRHQVRUX1RDQiYgdGNiKTsKLQotLyogcmVzZXJ2ZWQgaGFuZGxlIGxpc3QgKi8KLWV4dGVybiBzdGQ6Omxpc3Q8dEdBVFRfSERMX0xJU1RfRUxFTT46Oml0ZXJhdG9yIGdhdHRfZmluZF9oZGxfYnVmZmVyX2J5X2FwcF9pZCgKLSAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkMTI4LCBibHVldG9vdGg6OlV1aWQqIHBfc3ZjX3V1aWQsCi0gICAgdWludDE2X3Qgc3ZjX2luc3QpOwotZXh0ZXJuIHRHQVRUX0hETF9MSVNUX0VMRU0qIGdhdHRfZmluZF9oZGxfYnVmZmVyX2J5X2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpOwotZXh0ZXJuIHRHQVRUU19TUlZfQ0hHKiBnYXR0X2FkZF9zcnZfY2hnX2NsdCh0R0FUVFNfU1JWX0NIRyogcF9zcnZfY2hnKTsKLQotLyogZm9yIGJhY2tncm91bmQgY29ubmVjdGlvbiAqLwotZXh0ZXJuIGJvb2wgZ2F0dF9hdXRvX2Nvbm5lY3RfZGV2X3JlbW92ZSh0R0FUVF9JRiBnYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyogc2VydmVyIGZ1bmN0aW9uICovCi1leHRlcm4gc3RkOjpsaXN0PHRHQVRUX1NSVl9MSVNUX0VMRU0+OjppdGVyYXRvciBnYXR0X3NyX2ZpbmRfaV9yY2JfYnlfaGFuZGxlKAotICAgIHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIGdhdHRfc3JfcHJvY2Vzc19hcHBfcnNwKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9JRiBnYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc19pZCwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVFNfUlNQKiBwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1JfQ01EKiBzcl9yZXNfcCk7Ci1leHRlcm4gdm9pZCBnYXR0X3NlcnZlcl9oYW5kbGVfY2xpZW50X3JlcSh0R0FUVF9UQ0ImIHBfdGNiLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBnYXR0X3NyX3NlbmRfcmVxX2NhbGxiYWNrKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHRHQVRUU19EQVRBKiBwX3JlcV9kYXRhKTsKLWV4dGVybiB1aW50MzJfdCBnYXR0X3NyX2VucXVldWVfY21kKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gYm9vbCBnYXR0X2NhbmNlbF9vcGVuKHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci1leHRlcm4gdm9pZCBnYXR0X25vdGlmeV9waHlfdXBkYXRlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHkpOwotLyogICAqLwotCi1leHRlcm4gYm9vbCBnYXR0X3RjYl9pc19jaWRfYnVzeSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKTsKLQotZXh0ZXJuIHRHQVRUX1JFRyogZ2F0dF9nZXRfcmVnY2IodEdBVFRfSUYgZ2F0dF9pZik7Ci1leHRlcm4gYm9vbCBnYXR0X2lzX2NsY2JfYWxsb2NhdGVkKHVpbnQxNl90IGNvbm5faWQpOwotZXh0ZXJuIHRHQVRUX0NMQ0IqIGdhdHRfY2xjYl9hbGxvYyh1aW50MTZfdCBjb25uX2lkKTsKLQotZXh0ZXJuIGJvb2wgZ2F0dF90Y2JfZ2V0X2NpZF9hdmFpbGFibGVfZm9yX2luZGljYXRpb24oCi0gICAgdEdBVFRfVENCKiBwX3RjYiwgYm9vbCBlYXR0X3N1cHBvcnQsIHVpbnQxNl90KiogaW5kaWNhdGVfaGFuZGxlX3AsCi0gICAgdWludDE2X3QqIGNpZF9wKTsKLWV4dGVybiBib29sIGdhdHRfdGNiX2ZpbmRfaW5kaWNhdGVfaGFuZGxlKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogaW5kaWNhdGVkX2hhbmRsZV9wKTsKLWV4dGVybiB1aW50MTZfdCBnYXR0X3RjYl9nZXRfYXR0X2NpZCh0R0FUVF9UQ0ImIHRjYiwgYm9vbCBlYXR0X3N1cHBvcnQpOwotZXh0ZXJuIHVpbnQxNl90IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfdHgodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCk7Ci1leHRlcm4gdWludDE2X3QgZ2F0dF90Y2JfZ2V0X3BheWxvYWRfc2l6ZV9yeCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKTsKLWV4dGVybiB2b2lkIGdhdHRfY2xjYl9kZWFsbG9jKHRHQVRUX0NMQ0IqIHBfY2xjYik7Ci0KLWV4dGVybiB2b2lkIGdhdHRfc3JfY29weV9wcmVwX2NudF90b19jYmFja19jbnQodEdBVFRfVENCJiBwX3RjYik7Ci1leHRlcm4gYm9vbCBnYXR0X3NyX2lzX2NiYWNrX2NudF96ZXJvKHRHQVRUX1RDQiYgcF90Y2IpOwotZXh0ZXJuIGJvb2wgZ2F0dF9zcl9pc19wcmVwX2NudF96ZXJvKHRHQVRUX1RDQiYgcF90Y2IpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zcl9yZXNldF9jYmFja19jbnQodEdBVFRfVENCJiBwX3RjYiwgdWludDE2X3QgY2lkKTsKLWV4dGVybiB2b2lkIGdhdHRfc3JfcmVzZXRfcHJlcF9jbnQodEdBVFRfVENCJiB0Y2IpOwotZXh0ZXJuIHRHQVRUX1NSX0NNRCogZ2F0dF9zcl9nZXRfY21kX2J5X3RyYW5zX2lkKHRHQVRUX1RDQiogcF90Y2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNfaWQpOwotZXh0ZXJuIHRHQVRUX1NSX0NNRCogZ2F0dF9zcl9nZXRfY21kX2J5X2NpZCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKTsKLWV4dGVybiB0R0FUVF9SRUFEX01VTFRJKiBnYXR0X3NyX2dldF9yZWFkX211bHRpKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zcl91cGRhdGVfY2JhY2tfY250KHRHQVRUX1RDQiYgcF90Y2IsIHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9JRiBnYXR0X2lmLCBib29sIGlzX2luYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc2V0X2ZpcnN0KTsKLWV4dGVybiB2b2lkIGdhdHRfc3JfdXBkYXRlX3ByZXBfY250KHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9JRiBnYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmMsIGJvb2wgaXNfcmVzZXRfZmlyc3QpOwotCi1leHRlcm4gdWludDhfdCBnYXR0X251bV9jbGNiX2J5X2JkX2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLWV4dGVybiB0R0FUVF9UQ0IqIGdhdHRfZmluZF90Y2JfYnlfY2lkKHVpbnQxNl90IGxjaWQpOwotZXh0ZXJuIHRHQVRUX1RDQiogZ2F0dF9hbGxvY2F0ZV90Y2JfYnlfYmRhZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdEdBVFRfVENCKiBnYXR0X2dldF90Y2JfYnlfaWR4KHVpbnQ4X3QgdGNiX2lkeCk7Ci1leHRlcm4gdEdBVFRfVENCKiBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLWV4dGVybiBib29sIGdhdHRfc2VuZF9ibGVfYnVyc3RfZGF0YShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpOwotCi0vKiBHQVRUIGNsaWVudCBmdW5jdGlvbnMgKi8KLWV4dGVybiB2b2lkIGdhdHRfZGVxdWV1ZV9zcl9jbWQodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIGdhdHRfc2VuZF93cml0ZV9tc2codEdBVFRfVENCJiBwX3RjYiwgdEdBVFRfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDE2X3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBnYXR0X2NsZWFudXBfdXBvbl9kaXNjKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdm9pZCBnYXR0X2VuZF9vcGVyYXRpb24odEdBVFRfQ0xDQiogcF9jbGNiLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGdhdHRfYWN0X2Rpc2NvdmVyeSh0R0FUVF9DTENCKiBwX2NsY2IpOwotZXh0ZXJuIHZvaWQgZ2F0dF9hY3RfcmVhZCh0R0FUVF9DTENCKiBwX2NsY2IsIHVpbnQxNl90IG9mZnNldCk7Ci1leHRlcm4gdm9pZCBnYXR0X2FjdF93cml0ZSh0R0FUVF9DTENCKiBwX2NsY2IsIHVpbnQ4X3Qgc2VjX2FjdCk7Ci1leHRlcm4gdEdBVFRfQ0xDQiogZ2F0dF9jbWRfZGVxdWV1ZSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9vcGNvZGUpOwotZXh0ZXJuIHZvaWQgZ2F0dF9jbWRfZW5xKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IsIGJvb2wgdG9fc2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIEJUX0hEUiogcF9idWYpOwotZXh0ZXJuIHZvaWQgZ2F0dF9jbGllbnRfaGFuZGxlX3NlcnZlcl9yc3AodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKTsKLWV4dGVybiB2b2lkIGdhdHRfc2VuZF9xdWV1ZV93cml0ZV9jYW5jZWwodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfRVhFQ19GTEFHIGZsYWcpOwotCi0vKiBnYXR0X2F1dGguY2MgKi8KLWV4dGVybiBib29sIGdhdHRfc2VjdXJpdHlfY2hlY2tfc3RhcnQodEdBVFRfQ0xDQiogcF9jbGNiKTsKLWV4dGVybiB2b2lkIGdhdHRfdmVyaWZ5X3NpZ25hdHVyZSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCBCVF9IRFIqIHBfYnVmKTsKLWV4dGVybiB0R0FUVF9TVEFUVVMgZ2F0dF9nZXRfbGlua19lbmNyeXB0X3N0YXR1cyh0R0FUVF9UQ0ImIHRjYik7Ci1leHRlcm4gdEdBVFRfU0VDX0FDVElPTiBnYXR0X2dldF9zZWNfYWN0KHRHQVRUX1RDQiogcF90Y2IpOwotZXh0ZXJuIHZvaWQgZ2F0dF9zZXRfc2VjX2FjdCh0R0FUVF9UQ0IqIHBfdGNiLCB0R0FUVF9TRUNfQUNUSU9OIHNlY19hY3QpOwotCi0vKiBnYXR0X2RiLmNjICovCi1leHRlcm4gdm9pZCBnYXR0c19pbml0X3NlcnZpY2VfZGIodEdBVFRfU1ZDX0RCJiBkYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHNlcnZpY2UsIGJvb2wgaXNfcHJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNfaGRsLCB1aW50MTZfdCBudW1faGFuZGxlKTsKLWV4dGVybiB1aW50MTZfdCBnYXR0c19hZGRfaW5jbHVkZWRfc2VydmljZSh0R0FUVF9TVkNfREImIGRiLCB1aW50MTZfdCBzX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHNlcnZpY2UpOwotZXh0ZXJuIHVpbnQxNl90IGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYyh0R0FUVF9TVkNfREImIGRiLCB0R0FUVF9QRVJNIHBlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NIQVJfUFJPUCBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBjaGFyX3V1aWQpOwotZXh0ZXJuIHVpbnQxNl90IGdhdHRzX2FkZF9jaGFyX2V4dF9wcm9wX2Rlc2NyKHRHQVRUX1NWQ19EQiYgZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXh0ZW5kZWRfcHJvcGVydGllcyk7Ci1leHRlcm4gdWludDE2X3QgZ2F0dHNfYWRkX2NoYXJfZGVzY3IodEdBVFRfU1ZDX0RCJiBkYiwgdEdBVFRfUEVSTSBwZXJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgZHNjcF91dWlkKTsKLWV4dGVybiB0R0FUVF9TVEFUVVMgZ2F0dHNfZGJfcmVhZF9hdHRyX3ZhbHVlX2J5X3R5cGUoCi0gICAgdEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdEdBVFRfU1ZDX0RCKiBwX2RiLCB1aW50OF90IG9wX2NvZGUsCi0gICAgQlRfSERSKiBwX3JzcCwgdWludDE2X3Qgc19oYW5kbGUsIHVpbnQxNl90IGVfaGFuZGxlLAotICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdHlwZSwgdWludDE2X3QqIHBfbGVuLCB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZywKLSAgICB1aW50OF90IGtleV9zaXplLCB1aW50MzJfdCB0cmFuc19pZCwgdWludDE2X3QqIHBfY3VyX2hhbmRsZSk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIGdhdHRzX3JlYWRfYXR0cl92YWx1ZV9ieV9oYW5kbGUoCi0gICAgdEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdEdBVFRfU1ZDX0RCKiBwX2RiLCB1aW50OF90IG9wX2NvZGUsCi0gICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QqIHBfdmFsdWUsIHVpbnQxNl90KiBwX2xlbiwKLSAgICB1aW50MTZfdCBtdHUsIHRHQVRUX1NFQ19GTEFHIHNlY19mbGFnLCB1aW50OF90IGtleV9zaXplLCB1aW50MzJfdCB0cmFuc19pZCk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIGdhdHRzX3dyaXRlX2F0dHJfcGVybV9jaGVjaygKLSAgICB0R0FUVF9TVkNfREIqIHBfZGIsIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBvZmZzZXQsCi0gICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4sIHRHQVRUX1NFQ19GTEFHIHNlY19mbGFnLCB1aW50OF90IGtleV9zaXplKTsKLWV4dGVybiB0R0FUVF9TVEFUVVMgZ2F0dHNfcmVhZF9hdHRyX3Blcm1fY2hlY2sodEdBVFRfU1ZDX0RCKiBwX2RiLCBib29sIGlzX2xvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU0VDX0ZMQUcgc2VjX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3NpemUpOwotZXh0ZXJuIGJsdWV0b290aDo6VXVpZCogZ2F0dHNfZ2V0X3NlcnZpY2VfdXVpZCh0R0FUVF9TVkNfREIqIHBfZGIpOwotCi0vKiBnYXR0X3NyX2hhc2guY2MgKi8KLWV4dGVybiBPY3RldDE2IGdhdHRzX2NhbGN1bGF0ZV9kYXRhYmFzZV9oYXNoKAotICAgIHN0ZDo6bGlzdDx0R0FUVF9TUlZfTElTVF9FTEVNPiogbHN0X3B0cik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svZ2F0dC9nYXR0X21haW4uY2MgYi9zdGFjay9nYXR0L2dhdHRfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1YWE0NS4uMDAwMDAwMAotLS0gYS9zdGFjay9nYXR0L2dhdHRfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA4LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBBVFQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImNvbm5lY3Rpb25fbWFuYWdlci5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2VhdHQvZWF0dC5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjYXBfYWNsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYmx1ZXRvb3RoOjplYXR0OjpFYXR0RXh0ZW5zaW9uOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICBMIE8gQyBBIEwgICAgRiBVIE4gQyBUIEkgTyBOICAgICBQIFIgTyBUIE8gVCBZIFAgRSBTICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXR0X2xlX2Nvbm5lY3RfY2JhY2sodWludDE2X3QgY2hhbiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCwgdWludDE2X3QgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLXN0YXRpYyB2b2lkIGdhdHRfbGVfZGF0YV9pbmQodWludDE2X3QgY2hhbiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1Zik7Ci1zdGF0aWMgdm9pZCBnYXR0X2xlX2NvbmdfY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgYm9vbCBjb25nZXN0KTsKLQotc3RhdGljIHZvaWQgZ2F0dF9sMmNpZl9jb25uZWN0X2luZF9jYmFjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsMmNhcF9pZCk7Ci1zdGF0aWMgdm9pZCBnYXR0X2wyY2lmX2Nvbm5lY3RfY2ZtX2NiYWNrKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0KTsKLXN0YXRpYyB2b2lkIGdhdHRfbDJjaWZfY29uZmlnX2luZF9jYmFjayh1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1zdGF0aWMgdm9pZCBnYXR0X2wyY2lmX2NvbmZpZ19jZm1fY2JhY2sodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotc3RhdGljIHZvaWQgZ2F0dF9sMmNpZl9kaXNjb25uZWN0X2luZF9jYmFjayh1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNrX25lZWRlZCk7Ci1zdGF0aWMgdm9pZCBnYXR0X2wyY2lmX2Rpc2Nvbm5lY3QodWludDE2X3QgbDJjYXBfY2lkKTsKLXN0YXRpYyB2b2lkIGdhdHRfbDJjaWZfZGF0YV9pbmRfY2JhY2sodWludDE2X3QgbDJjYXBfY2lkLCBCVF9IRFIqIHBfbXNnKTsKLXN0YXRpYyB2b2lkIGdhdHRfc2VuZF9jb25uX2NiYWNrKHRHQVRUX1RDQiogcF90Y2IpOwotc3RhdGljIHZvaWQgZ2F0dF9sMmNpZl9jb25nZXN0X2NiYWNrKHVpbnQxNl90IGNpZCwgYm9vbCBjb25nZXN0ZWQpOwotc3RhdGljIHZvaWQgZ2F0dF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpOwotCi1zdGF0aWMgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyBkeW5faW5mbyA9IHtnYXR0X2wyY2lmX2Nvbm5lY3RfaW5kX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9sMmNpZl9jb25uZWN0X2NmbV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfbDJjaWZfY29uZmlnX2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfbDJjaWZfY29uZmlnX2NmbV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfbDJjaWZfZGlzY29ubmVjdF9pbmRfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9sMmNpZl9kYXRhX2luZF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdHRfbDJjaWZfY29uZ2VzdF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXR0X29uX2wyY2FwX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfTsKLQotdEdBVFRfQ0IgZ2F0dF9jYjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBlbmFibGUgdGhlIEdBVFQgcHJvZmlsZSBvbiB0aGUgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBJdCBjbGVhcnMgb3V0IHRoZSBjb250cm9sIGJsb2NrcywgYW5kIHJlZ2lzdGVycyB3aXRoIEwyQ0FQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfaW5pdCh2b2lkKSB7Ci0gIHRMMkNBUF9GSVhFRF9DSE5MX1JFRyBmaXhlZF9yZWc7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICBnYXR0X2NiID0gdEdBVFRfQ0IoKTsKLSAgY29ubmVjdGlvbl9tYW5hZ2VyOjpyZXNldCh0cnVlKTsKLSAgbWVtc2V0KCZmaXhlZF9yZWcsIDAsIHNpemVvZih0TDJDQVBfRklYRURfQ0hOTF9SRUcpKTsKLQotICBnYXR0X2NiLnNpZ25fb3BfcXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotICBnYXR0X2NiLnNydl9jaGdfY2x0X3EgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotICAvKiBGaXJzdCwgcmVnaXN0ZXIgZml4ZWQgTDJDQVAgY2hhbm5lbCBmb3IgQVRUIG92ZXIgQkxFICovCi0gIGZpeGVkX3JlZy5wTDJDQV9GaXhlZENvbm5fQ2IgPSBnYXR0X2xlX2Nvbm5lY3RfY2JhY2s7Ci0gIGZpeGVkX3JlZy5wTDJDQV9GaXhlZERhdGFfQ2IgPSBnYXR0X2xlX2RhdGFfaW5kOwotICBmaXhlZF9yZWcucEwyQ0FfRml4ZWRDb25nX0NiID0gZ2F0dF9sZV9jb25nX2NiYWNrOyAvKiBjb25nZXN0aW9uIGNhbGxiYWNrICovCi0gIGZpeGVkX3JlZy5kZWZhdWx0X2lkbGVfdG91dCA9IDB4ZmZmZjsgLyogMHhmZmZmIGRlZmF1bHQgaWRsZSB0aW1lb3V0ICovCi0KLSAgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbChMMkNBUF9BVFRfQ0lELCAmZml4ZWRfcmVnKTsKLQotICAvKiBOb3csIHJlZ2lzdGVyIHdpdGggTDJDQVAgZm9yIEFUVCBQU00gb3ZlciBCUi9FRFIgKi8KLSAgaWYgKCFMMkNBX1JlZ2lzdGVyMihCVF9QU01fQVRULCBkeW5faW5mbywgZmFsc2UgLyogZW5hYmxlX3Nub29wICovLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgIEdBVFRfTUFYX01UVV9TSVpFLCAwLCBCVE1fU0VDX05PTkUpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiQVRUIER5bmFtaWMgUmVnaXN0cmF0aW9uIGZhaWxlZCI7Ci0gIH0KLQotICBnYXR0X2NiLmhkbF9jZmcuZ2F0dF9zdGFydF9oZGwgPSBHQVRUX0dBVFRfU1RBUlRfSEFORExFOwotICBnYXR0X2NiLmhkbF9jZmcuZ2FwX3N0YXJ0X2hkbCA9IEdBVFRfR0FQX1NUQVJUX0hBTkRMRTsKLSAgZ2F0dF9jYi5oZGxfY2ZnLmFwcF9zdGFydF9oZGwgPSBHQVRUX0FQUF9TVEFSVF9IQU5ETEU7Ci0KLSAgZ2F0dF9jYi5oZGxfbGlzdF9pbmZvID0gbmV3IHN0ZDo6bGlzdDx0R0FUVF9IRExfTElTVF9FTEVNPigpOwotICBnYXR0X2NiLnNydl9saXN0X2luZm8gPSBuZXcgc3RkOjpsaXN0PHRHQVRUX1NSVl9MSVNUX0VMRU0+KCk7Ci0gIGdhdHRfcHJvZmlsZV9kYl9pbml0KCk7Ci0KLSAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+U3RhcnQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfZnJlZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyByZXNvdXJjZXMgdXNlZCBieSB0aGUgR0FUVCBwcm9maWxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfZnJlZSh2b2lkKSB7Ci0gIGludCBpOwotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUoZ2F0dF9jYi5zaWduX29wX3F1ZXVlLCBOVUxMKTsKLSAgZ2F0dF9jYi5zaWduX29wX3F1ZXVlID0gTlVMTDsKLSAgZml4ZWRfcXVldWVfZnJlZShnYXR0X2NiLnNydl9jaGdfY2x0X3EsIE5VTEwpOwotICBnYXR0X2NiLnNydl9jaGdfY2x0X3EgPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgR0FUVF9NQVhfUEhZX0NIQU5ORUw7IGkrKykgewotICAgIGdhdHRfY2IudGNiW2ldLnBlbmRpbmdfZW5jX2NsY2IgPSBzdGQ6OnF1ZXVlPHRHQVRUX0NMQ0IqPigpOwotCi0gICAgZml4ZWRfcXVldWVfZnJlZShnYXR0X2NiLnRjYltpXS5wZW5kaW5nX2luZF9xLCBOVUxMKTsKLSAgICBnYXR0X2NiLnRjYltpXS5wZW5kaW5nX2luZF9xID0gTlVMTDsKLQotICAgIGFsYXJtX2ZyZWUoZ2F0dF9jYi50Y2JbaV0uY29uZl90aW1lcik7Ci0gICAgZ2F0dF9jYi50Y2JbaV0uY29uZl90aW1lciA9IE5VTEw7Ci0KLSAgICBhbGFybV9mcmVlKGdhdHRfY2IudGNiW2ldLmluZF9hY2tfdGltZXIpOwotICAgIGdhdHRfY2IudGNiW2ldLmluZF9hY2tfdGltZXIgPSBOVUxMOwotCi0gICAgZml4ZWRfcXVldWVfZnJlZShnYXR0X2NiLnRjYltpXS5zcl9jbWQubXVsdGlfcnNwX3EsIE5VTEwpOwotICAgIGdhdHRfY2IudGNiW2ldLnNyX2NtZC5tdWx0aV9yc3BfcSA9IE5VTEw7Ci0KLSAgICBpZiAoZ2F0dF9jYi50Y2JbaV0uZWF0dCkKLSAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZyZWVHYXR0UmVzb3VyY2VzKGdhdHRfY2IudGNiW2ldLnBlZXJfYmRhKTsKLSAgfQotCi0gIGdhdHRfY2IuaGRsX2xpc3RfaW5mby0+Y2xlYXIoKTsKLSAgZGVsZXRlIGdhdHRfY2IuaGRsX2xpc3RfaW5mbzsKLSAgZ2F0dF9jYi5oZGxfbGlzdF9pbmZvID0gbnVsbHB0cjsKLSAgZ2F0dF9jYi5zcnZfbGlzdF9pbmZvLT5jbGVhcigpOwotICBkZWxldGUgZ2F0dF9jYi5zcnZfbGlzdF9pbmZvOwotICBnYXR0X2NiLnNydl9saXN0X2luZm8gPSBudWxscHRyOwotCi0gIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPlN0b3AoKTsKLX0KLQotdm9pZCBnYXR0X2ZpbmRfaW5fZGV2aWNlX3JlY29yZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0JEX0FERFIqIGFkZHJlc3Nfd2l0aF90eXBlKSB7Ci0gIGNvbnN0IHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihiZF9hZGRyKTsKLSAgaWYgKHBfZGV2X3JlYyA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfZGV2X3JlYy0+ZGV2aWNlX3R5cGUgJiBCVF9ERVZJQ0VfVFlQRV9CTEUpIHsKLSAgICBpZiAocF9kZXZfcmVjLT5ibGUuaWRlbnRpdHlfYWRkcmVzc193aXRoX3R5cGUuYmRhLklzRW1wdHkoKSkgewotICAgICAgKmFkZHJlc3Nfd2l0aF90eXBlID0gey50eXBlID0gcF9kZXZfcmVjLT5ibGUuYmxlX2FkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmRhID0gYmRfYWRkcn07Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICphZGRyZXNzX3dpdGhfdHlwZSA9IHBfZGV2X3JlYy0+YmxlLmlkZW50aXR5X2FkZHJlc3Nfd2l0aF90eXBlOwotICAgIHJldHVybjsKLSAgfQotICAqYWRkcmVzc193aXRoX3R5cGUgPSB7LnR5cGUgPSBCTEVfQUREUl9QVUJMSUMsIC5iZGEgPSBiZF9hZGRyfTsKLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9jb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gYSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHJlbV9iZGE6IHJlbW90ZSBkZXZpY2UgYWRkcmVzcyB0byBjb25uZWN0IHRvLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIHN0YXJ0ZWQsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF9jb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHRHQVRUX1RDQiogcF90Y2IsCi0gICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdWludDhfdCBpbml0aWF0aW5nX3BoeXMsCi0gICAgICAgICAgICAgICAgICB0R0FUVF9JRiBnYXR0X2lmKSB7Ci0gIGlmIChnYXR0X2dldF9jaF9zdGF0ZShwX3RjYikgIT0gR0FUVF9DSF9PUEVOKQotICAgIGdhdHRfc2V0X2NoX3N0YXRlKHBfdGNiLCBHQVRUX0NIX0NPTk4pOwotCi0gIGlmICh0cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgcF90Y2ItPmF0dF9sY2lkID0gTDJDQV9Db25uZWN0UmVxMihCVF9QU01fQVRULCByZW1fYmRhLCBCVE1fU0VDX05PTkUpOwotICAgIHJldHVybiBwX3RjYi0+YXR0X2xjaWQgIT0gMDsKLSAgfQotCi0gIC8vIEFscmVhZHkgY29ubmVjdGVkLCBtYXJrIHRoZSBsaW5rIGFzIHVzZWQKLSAgaWYgKGdhdHRfZ2V0X2NoX3N0YXRlKHBfdGNiKSA9PSBHQVRUX0NIX09QRU4pIHsKLSAgICBnYXR0X3VwZGF0ZV9hcHBfdXNlX2xpbmtfZmxhZyhnYXR0X2lmLCBwX3RjYiwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwX3RjYi0+YXR0X2xjaWQgPSBMMkNBUF9BVFRfQ0lEOwotICByZXR1cm4gYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uX3dpdGhfaWQoZ2F0dF9pZiwgcmVtX2JkYSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2Rpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRpc2Nvbm5lY3QgdG8gYW4gQVRUIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfdGNiOiBwb2ludGVyIHRvIHRoZSBUQ0IgdG8gZGlzY29ubmVjdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWU6IGlmIGNvbm5lY3Rpb24gZm91bmQgYW5kIHRvIGJlIGRpc2Nvbm5lY3RlZDsgb3RoZXJ3aXNlCi0gKiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBnYXR0X2Rpc2Nvbm5lY3QodEdBVFRfVENCKiBwX3RjYikgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIGlmICghcF90Y2IpIHJldHVybiBmYWxzZTsKLQotICB0R0FUVF9DSF9TVEFURSBjaF9zdGF0ZSA9IGdhdHRfZ2V0X2NoX3N0YXRlKHBfdGNiKTsKLSAgaWYgKGNoX3N0YXRlID09IEdBVFRfQ0hfQ0xPU0lORykgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBhbHJlYWR5IGluIGNsb3Npbmcgc3RhdGUiOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKHBfdGNiLT5hdHRfbGNpZCA9PSBMMkNBUF9BVFRfQ0lEKSB7Ci0gICAgaWYgKGNoX3N0YXRlID09IEdBVFRfQ0hfT1BFTikgewotICAgICAgTDJDQV9SZW1vdmVGaXhlZENobmwoTDJDQVBfQVRUX0NJRCwgcF90Y2ItPnBlZXJfYmRhKTsKLSAgICAgIGdhdHRfc2V0X2NoX3N0YXRlKHBfdGNiLCBHQVRUX0NIX0NMT1NJTkcpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb25uZWN0aW9uX21hbmFnZXI6OmRpcmVjdF9jb25uZWN0X3JlbW92ZShDT05OX01HUl9JRF9MMkNBUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNiLT5wZWVyX2JkYSk7Ci0gICAgICBnYXR0X2NsZWFudXBfdXBvbl9kaXNjKHBfdGNiLT5wZWVyX2JkYSwgR0FUVF9DT05OX1RFUk1JTkFURV9MT0NBTF9IT1NULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjYi0+dHJhbnNwb3J0KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKChjaF9zdGF0ZSA9PSBHQVRUX0NIX09QRU4pIHx8IChjaF9zdGF0ZSA9PSBHQVRUX0NIX0NGRykpIHsKLSAgICAgIGdhdHRfbDJjaWZfZGlzY29ubmVjdChwX3RjYi0+YXR0X2xjaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgZ2F0dF9kaXNjb25uZWN0IGNoYW5uZWwgbm90IG9wZW5lZCI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3VwZGF0ZV9hcHBfaG9sZF9saW5rX3N0YXR1cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlIHRoZSBhcHBsaWNhdGlvbiB1c2UgbGluayBzdGF0dXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYW55IG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgb3IKLSAqICAgICAgICAgICAgICAgICAgd2hlbiBpdCBhbHJlYWR5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGdhdHRfdXBkYXRlX2FwcF9ob2xkX2xpbmtfc3RhdHVzKHRHQVRUX0lGIGdhdHRfaWYsIHRHQVRUX1RDQiogcF90Y2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYWRkKSB7Ci0gIGF1dG8mIGhvbGRlcnMgPSBwX3RjYi0+YXBwX2hvbGRfbGluazsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotICBpZiAoaXNfYWRkKSB7Ci0gICAgYXV0byByZXQgPSBob2xkZXJzLmluc2VydChnYXR0X2lmKTsKLSAgICBpZiAocmV0LnNlY29uZCkgewotICAgICAgVkxPRygxKSA8PCAiYWRkZWQgZ2F0dF9pZj0iIDw8ICtnYXR0X2lmOwotICAgIH0gZWxzZSB7Ci0gICAgICBWTE9HKDEpIDw8ICJhdHRlbXB0IHRvIGFkZCBhbHJlYWR5IGV4aXN0aW5nIGdhdHRfaWY9IiA8PCArZ2F0dF9pZjsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyEgaXNfYWRkCi0gIGlmICghaG9sZGVycy5lcmFzZShnYXR0X2lmKSkgewotICAgIFZMT0coMSkgPDwgImF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0aW5nIGdhdHRfaWY9IiA8PCArZ2F0dF9pZjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBWTE9HKDEpIDw8ICJyZW1vdmVkIGdhdHRfaWY9IiA8PCArZ2F0dF9pZjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3VwZGF0ZV9hcHBfdXNlX2xpbmtfZmxhZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlIHRoZSBhcHBsaWNhdGlvbiB1c2UgbGluayBmbGFnIGFuZCBvcHRpb25hbCB0byBjaGVjawotICogICAgICAgICAgICAgICAgICB0aGUgYWNsIGxpbmsgaWYgdGhlIGxpbmsgaXMgdXAgdGhlbiBzZXQgdGhlIGlkbGUgdGltZSBvdXQKLSAqICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nbHkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF91cGRhdGVfYXBwX3VzZV9saW5rX2ZsYWcodEdBVFRfSUYgZ2F0dF9pZiwgdEdBVFRfVENCKiBwX3RjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hZGQsIGJvb2wgY2hlY2tfYWNsX2xpbmspIHsKLSAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIiVzOiBpc19hZGQ9JWQgY2hrX2xpbms9JWQiLCBfX2Z1bmNfXywgaXNfYWRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19hY2xfbGluayk7Ci0KLSAgaWYgKCFwX3RjYikgcmV0dXJuOwotCi0gIC8vIElmIHdlIG1ha2Ugbm8gbW9kaWZpY2F0aW9uLCBpLmUuIGtpbGwgYXBwIHRoYXQgd2FzIG5ldmVyIGNvbm5lY3RlZCB0byBhCi0gIC8vIGRldmljZSwgc2tpcCB1cGRhdGluZyB0aGUgZGV2aWNlIHN0YXRlLgotICBpZiAoIWdhdHRfdXBkYXRlX2FwcF9ob2xkX2xpbmtfc3RhdHVzKGdhdHRfaWYsIHBfdGNiLCBpc19hZGQpKSByZXR1cm47Ci0KLSAgaWYgKCFjaGVja19hY2xfbGluaykgewotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgaXNfdmFsaWRfaGFuZGxlID0KLSAgICAgIChCVE1fR2V0SENJQ29ubkhhbmRsZShwX3RjYi0+cGVlcl9iZGEsIHBfdGNiLT50cmFuc3BvcnQpICE9Ci0gICAgICAgR0FUVF9JTlZBTElEX0FDTF9IQU5ETEUpOwotCi0gIGlmIChpc19hZGQpIHsKLSAgICBpZiAocF90Y2ItPmF0dF9sY2lkID09IEwyQ0FQX0FUVF9DSUQgJiYgaXNfdmFsaWRfaGFuZGxlKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJkaXNhYmxlIGxpbmsgaWRsZSB0aW1lciI7Ci0gICAgICAvKiBhY2wgbGluayBpcyBjb25uZWN0ZWQgZGlzYWJsZSB0aGUgaWRsZSB0aW1lb3V0ICovCi0gICAgICBHQVRUX1NldElkbGVUaW1lb3V0KHBfdGNiLT5wZWVyX2JkYSwgR0FUVF9MSU5LX05PX0lETEVfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2ItPnRyYW5zcG9ydCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwX3RjYi0+YXBwX2hvbGRfbGluay5lbXB0eSgpKSB7Ci0gICAgICAvLyBhY2wgbGluayBpcyBjb25uZWN0ZWQgYnV0IG5vIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHVzZSB0aGUgbGluawotICAgICAgaWYgKHBfdGNiLT5hdHRfbGNpZCA9PSBMMkNBUF9BVFRfQ0lEICYmIGlzX3ZhbGlkX2hhbmRsZSkgewotCi0gICAgICAgIC8qIERyb3AgRUFUVCBiZWZvcmUgY2xvc2luZyBBVFQgKi8KLSAgICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RGlzY29ubmVjdChwX3RjYi0+cGVlcl9iZGEpOwotCi0gICAgICAgIC8qIGZvciBmaXhlZCBjaGFubmVsLCBzZXQgdGhlIHRpbWVvdXQgdmFsdWUgdG8KLSAgICAgICAgICAgR0FUVF9MSU5LX0lETEVfVElNRU9VVF9XSEVOX05PX0FQUCBzZWNvbmRzICovCi0gICAgICAgIFZMT0coMSkgPDwgIiBzdGFydCBsaW5rIGlkbGUgdGltZXIgPSAiCi0gICAgICAgICAgICAgICAgPDwgR0FUVF9MSU5LX0lETEVfVElNRU9VVF9XSEVOX05PX0FQUCA8PCAiIHNlYyI7Ci0gICAgICAgIEdBVFRfU2V0SWRsZVRpbWVvdXQocF90Y2ItPnBlZXJfYmRhLCBHQVRUX0xJTktfSURMRV9USU1FT1VUX1dIRU5fTk9fQVBQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNiLT50cmFuc3BvcnQpOwotICAgICAgfSBlbHNlCi0gICAgICAgIC8vIGRpc2Nvbm5lY3QgdGhlIGR5bmFtaWMgY2hhbm5lbAotICAgICAgICBnYXR0X2Rpc2Nvbm5lY3QocF90Y2IpOwotICAgIH0KLSAgfQotfQotCi0vKiogR0FUVCBjb25uZWN0aW9uIGluaXRpYXRpb24gKi8KLWJvb2wgZ2F0dF9hY3RfY29ubmVjdCh0R0FUVF9SRUcqIHBfcmVnLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfdGNiICE9IE5VTEwpIHsKLSAgICAvKiBiZWZvcmUgbGluayBkb3duLCBhbm90aGVyIGFwcCB0cnkgdG8gb3BlbiBhIEdBVFQgY29ubmVjdGlvbiAqLwotICAgIHVpbnQ4X3Qgc3QgPSBnYXR0X2dldF9jaF9zdGF0ZShwX3RjYik7Ci0gICAgaWYgKHN0ID09IEdBVFRfQ0hfT1BFTiAmJiBwX3RjYi0+YXBwX2hvbGRfbGluay5lbXB0eSgpICYmCi0gICAgICAgIHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIGlmICghZ2F0dF9jb25uZWN0KGJkX2FkZHIsIHBfdGNiLCB0cmFuc3BvcnQsIGluaXRpYXRpbmdfcGh5cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVnLT5nYXR0X2lmKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoc3QgPT0gR0FUVF9DSF9DTE9TSU5HKSB7Ci0gICAgICBMT0coSU5GTykgPDwgIk11c3QgZmluaXNoIGRpc2Nvbm5lY3Rpb24gYmVmb3JlIG5ldyBjb25uZWN0aW9uIjsKLSAgICAgIC8qIG5lZWQgdG8gY29tcGxldGUgdGhlIGNsb3NpbmcgZmlyc3QgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHBfdGNiID0gZ2F0dF9hbGxvY2F0ZV90Y2JfYnlfYmRhZGRyKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIGlmICghcF90Y2IpIHsKLSAgICBMT0coRVJST1IpIDw8ICJNYXggVENCIGZvciBnYXR0X2lmIFsgIiA8PCArcF9yZWctPmdhdHRfaWYgPDwgIl0gcmVhY2hlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZ2F0dF9jb25uZWN0KGJkX2FkZHIsIHBfdGNiLCB0cmFuc3BvcnQsIGluaXRpYXRpbmdfcGh5cywKLSAgICAgICAgICAgICAgICAgICAgcF9yZWctPmdhdHRfaWYpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiZ2F0dF9jb25uZWN0IGZhaWxlZCI7Ci0gICAgZml4ZWRfcXVldWVfZnJlZShwX3RjYi0+cGVuZGluZ19pbmRfcSwgTlVMTCk7Ci0gICAgKnBfdGNiID0gdEdBVFRfVENCKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLW5hbWVzcGFjZSBjb25uZWN0aW9uX21hbmFnZXIgewotdm9pZCBvbl9jb25uZWN0aW9uX3RpbWVkX291dCh1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBnYXR0X2xlX2Nvbm5lY3RfY2JhY2soTDJDQVBfQVRUX0NJRCwgYWRkcmVzcywgZmFsc2UsIDB4ZmYsIEJUX1RSQU5TUE9SVF9MRSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyCi0KLS8qKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBMMkNBUCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBBVFQgZml4ZWQKLSAqIGNoYW5uZWwgZm9yIExFIGlzIGNvbm5lY3RlZCAoY29ubiA9IHRydWUpL2Rpc2Nvbm5lY3RlZCAoY29ubiA9IGZhbHNlKS4KLSAqLwotc3RhdGljIHZvaWQgZ2F0dF9sZV9jb25uZWN0X2NiYWNrKHVpbnQxNl90IGNoYW4sIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25uZWN0ZWQsIHVpbnQxNl90IHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9hZGRyKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIGJvb2wgY2hlY2tfc3J2X2NoZyA9IGZhbHNlOwotICB0R0FUVFNfU1JWX0NIRyogcF9zcnZfY2hnX2NsdCA9IE5VTEw7Ci0KLSAgaWYgKHRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSB7Ci0gICAgTE9HX1dBUk4oIklnbm9yaW5nIGZpeGVkIGNoYW5uZWwgY29ubmVjdC9kaXNjb25uZWN0IG9uIGJyX2VkciBmb3IgR0FUVCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFZMT0coMSkgPDwgIkdBVFQgICBBVFQgcHJvdG9jb2wgY2hhbm5lbCB3aXRoIEJEQTogIiA8PCBiZF9hZGRyIDw8ICIgaXMgIgotICAgICAgICAgIDw8ICgoY29ubmVjdGVkKSA/ICJjb25uZWN0ZWQiIDogImRpc2Nvbm5lY3RlZCIpOwotCi0gIHBfc3J2X2NoZ19jbHQgPSBnYXR0X2lzX2JkYV9pbl90aGVfc3J2X2NoZ19jbHRfbGlzdChiZF9hZGRyKTsKLSAgaWYgKHBfc3J2X2NoZ19jbHQgIT0gTlVMTCkgewotICAgIGNoZWNrX3Nydl9jaGcgPSB0cnVlOwotICB9IGVsc2UgewotICAgIGlmIChidG1fc2VjX2lzX2FfYm9uZGVkX2RldihiZF9hZGRyKSkKLSAgICAgIGdhdHRfYWRkX2FfYm9uZGVkX2Rldl9mb3Jfc3J2X2NoZyhiZF9hZGRyKTsKLSAgfQotCi0gIGlmICghY29ubmVjdGVkKSB7Ci0gICAgZ2F0dF9jbGVhbnVwX3Vwb25fZGlzYyhiZF9hZGRyLCBzdGF0aWNfY2FzdDx0R0FUVF9ESVNDT05OX1JFQVNPTj4ocmVhc29uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogZG8gd2UgaGF2ZSBhIGNoYW5uZWwgaW5pdGlhdGluZyBhIGNvbm5lY3Rpb24/ICovCi0gIGlmIChwX3RjYikgewotICAgIC8qIHdlIGFyZSBpbml0aWF0aW5nIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAoZ2F0dF9nZXRfY2hfc3RhdGUocF90Y2IpID09IEdBVFRfQ0hfQ09OTikgewotICAgICAgLyogc2VuZCBjYWxsYmFjayAqLwotICAgICAgZ2F0dF9zZXRfY2hfc3RhdGUocF90Y2IsIEdBVFRfQ0hfT1BFTik7Ci0gICAgICBwX3RjYi0+cGF5bG9hZF9zaXplID0gR0FUVF9ERUZfQkxFX01UVV9TSVpFOwotCi0gICAgICBnYXR0X3NlbmRfY29ubl9jYmFjayhwX3RjYik7Ci0gICAgfQotICAgIGlmIChjaGVja19zcnZfY2hnKSBnYXR0X2Noa19zcnZfY2hnKHBfc3J2X2NoZ19jbHQpOwotICB9Ci0gIC8qIHRoaXMgaXMgaW5jb21pbmcgY29ubmVjdGlvbiBvciBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24gY2FsbGJhY2sgKi8KLQotICBlbHNlIHsKLSAgICBwX3RjYiA9IGdhdHRfYWxsb2NhdGVfdGNiX2J5X2JkYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICAgIGlmICghcF90Y2IpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgIkNDQiBtYXggb3V0LCBubyByc291cmNlcyI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcF90Y2ItPmF0dF9sY2lkID0gTDJDQVBfQVRUX0NJRDsKLQotICAgIGdhdHRfc2V0X2NoX3N0YXRlKHBfdGNiLCBHQVRUX0NIX09QRU4pOwotCi0gICAgcF90Y2ItPnBheWxvYWRfc2l6ZSA9IEdBVFRfREVGX0JMRV9NVFVfU0laRTsKLQotICAgIGdhdHRfc2VuZF9jb25uX2NiYWNrKHBfdGNiKTsKLSAgICBpZiAoY2hlY2tfc3J2X2NoZykgewotICAgICAgZ2F0dF9jaGtfc3J2X2NoZyhwX3Nydl9jaGdfY2x0KTsKLSAgICB9Ci0gIH0KLQotICBFYXR0RXh0ZW5zaW9uOjpHZXRJbnN0YW5jZSgpLT5Db25uZWN0KGJkX2FkZHIpOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgY29uZ2VzdGlvbiBjYWxsYmFjayBmcm9tIGxjYiAqLwotc3RhdGljIHZvaWQgZ2F0dF9jaGFubmVsX2Nvbmdlc3Rpb24odEdBVFRfVENCKiBwX3RjYiwgYm9vbCBjb25nZXN0ZWQpIHsKLSAgdWludDhfdCBpID0gMDsKLSAgdEdBVFRfUkVHKiBwX3JlZyA9IE5VTEw7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0KLSAgLyogaWYgdW5jb25nZXN0ZWQsIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnkgbW9yZSBwZW5kaW5nIGRhdGEgKi8KLSAgaWYgKHBfdGNiICE9IE5VTEwgJiYgIWNvbmdlc3RlZCkgewotICAgIGdhdHRfY2xfc2VuZF9uZXh0X2NtZF9pbnEoKnBfdGNiKTsKLSAgfQotICAvKiBub3RpZnlpbmcgYWxsIGFwcGxpY2F0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24gdXAgZXZlbnQgKi8KLSAgZm9yIChpID0gMCwgcF9yZWcgPSBnYXR0X2NiLmNsX3JjYjsgaSA8IEdBVFRfTUFYX0FQUFM7IGkrKywgcF9yZWcrKykgewotICAgIGlmIChwX3JlZy0+aW5fdXNlKSB7Ci0gICAgICBpZiAocF9yZWctPmFwcF9jYi5wX2Nvbmdlc3Rpb25fY2IpIHsKLSAgICAgICAgY29ubl9pZCA9IEdBVFRfQ1JFQVRFX0NPTk5fSUQocF90Y2ItPnRjYl9pZHgsIHBfcmVnLT5nYXR0X2lmKTsKLSAgICAgICAgKCpwX3JlZy0+YXBwX2NiLnBfY29uZ2VzdGlvbl9jYikoY29ubl9pZCwgY29uZ2VzdGVkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBnYXR0X25vdGlmeV9waHlfdXBkYXRlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSkgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXZfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIGlmICghcF9kZXZfcmVjKSB7Ci0gICAgTE9HX1dBUk4oIk5vIERldmljZSBGb3VuZCEiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0R0FUVF9UQ0IqIHBfdGNiID0KLSAgICAgIGdhdHRfZmluZF90Y2JfYnlfYWRkcihwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKCFwX3RjYikgcmV0dXJuOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgR0FUVF9NQVhfQVBQUzsgaSsrKSB7Ci0gICAgdEdBVFRfUkVHKiBwX3JlZyA9ICZnYXR0X2NiLmNsX3JjYltpXTsKLSAgICBpZiAocF9yZWctPmluX3VzZSAmJiBwX3JlZy0+YXBwX2NiLnBfcGh5X3VwZGF0ZV9jYikgewotICAgICAgdWludDE2X3QgY29ubl9pZCA9IEdBVFRfQ1JFQVRFX0NPTk5fSUQocF90Y2ItPnRjYl9pZHgsIHBfcmVnLT5nYXR0X2lmKTsKLSAgICAgICgqcF9yZWctPmFwcF9jYi5wX3BoeV91cGRhdGVfY2IpKHBfcmVnLT5nYXR0X2lmLCBjb25uX2lkLCB0eF9waHksIHJ4X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgZ2F0dF9ub3RpZnlfY29ubl91cGRhdGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlLCB1aW50MTZfdCBpbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIocmVtb3RlLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIGlmICghcF90Y2IpIHJldHVybjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IEdBVFRfTUFYX0FQUFM7IGkrKykgewotICAgIHRHQVRUX1JFRyogcF9yZWcgPSAmZ2F0dF9jYi5jbF9yY2JbaV07Ci0gICAgaWYgKHBfcmVnLT5pbl91c2UgJiYgcF9yZWctPmFwcF9jYi5wX2Nvbm5fdXBkYXRlX2NiKSB7Ci0gICAgICB1aW50MTZfdCBjb25uX2lkID0gR0FUVF9DUkVBVEVfQ09OTl9JRChwX3RjYi0+dGNiX2lkeCwgcF9yZWctPmdhdHRfaWYpOwotICAgICAgKCpwX3JlZy0+YXBwX2NiLnBfY29ubl91cGRhdGVfY2IpKHBfcmVnLT5nYXR0X2lmLCBjb25uX2lkLCBpbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHRHQVRUX1NUQVRVUz4oc3RhdHVzKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIEdBVFQgZml4ZWQgY2hhbm5lbCBpcyBjb25nZXN0ZWQgb3IgdW5jb25nZXN0ZWQKLSAqLwotc3RhdGljIHZvaWQgZ2F0dF9sZV9jb25nX2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIGJvb2wgY29uZ2VzdGVkKSB7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIocmVtb3RlX2JkYSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKCFwX3RjYikgcmV0dXJuOwotCi0gIC8qIGlmIHVuY29uZ2VzdGVkLCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW55IG1vcmUgcGVuZGluZyBkYXRhICovCi0gICAgZ2F0dF9jaGFubmVsX2Nvbmdlc3Rpb24ocF90Y2IsIGNvbmdlc3RlZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2xlX2RhdGFfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSBMMkNBUC4KLSAqICAgICAgICAgICAgICAgICAgaWYgd2UgYXJlIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgdGhlIEFUVAotICogICAgICAgICAgICAgICAgICBjbGllbnQsIGFuZCB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBpcyBxdWV1ZWQgdXAgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBjbGllbnQuCi0gKgotICogICAgICAgICAgICAgICAgICBJZiB3ZSBhcmUgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgdGhlIEFUVAotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIsIHNvIHRoZSBtZXNzYWdlIGlzIHBhc3NlZCB0byB0aGUgc2VydmVyIHByb2Nlc3NpbmcKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhdHRfbGVfZGF0YV9pbmQodWludDE2X3QgY2hhbiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZikgewotCi0gIC8qIEZpbmQgQ0NCIGJhc2VkIG9uIGJkIGFkZHIgKi8KLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBpZiAocF90Y2IpIHsKLSAgICBpZiAoZ2F0dF9nZXRfY2hfc3RhdGUocF90Y2IpIDwgR0FUVF9DSF9PUEVOKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgIkFUVCAtIElnbm9yZWQgTDJDQVAgZGF0YSB3aGlsZSBpbiBzdGF0ZTogIgotICAgICAgICAgICAgICAgICAgIDw8ICtnYXR0X2dldF9jaF9zdGF0ZShwX3RjYik7Ci0gICAgfSBlbHNlCi0gICAgICBnYXR0X2RhdGFfcHJvY2VzcygqcF90Y2IsIEwyQ0FQX0FUVF9DSUQsIHBfYnVmKTsKLSAgfQotCi0gIG9zaV9mcmVlKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfbDJjaWZfY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBpbmJvdW5kIGNvbm5lY3Rpb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBmcm9tIEwyQ0FQLiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBhY3RpbmcgYXMgYQotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhdHRfbDJjaWZfY29ubmVjdF9pbmRfY2JhY2soY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgcHNtLCB1aW50OF90IGlkKSB7Ci0gIHVpbnQ4X3QgcmVzdWx0ID0gTDJDQVBfQ09OTl9PSzsKLSAgTE9HKElORk8pIDw8ICJDb25uZWN0aW9uIGluZGljYXRpb24gY2lkID0gIiA8PCArbGNpZDsKLQotICAvKiBuZXcgY29ubmVjdGlvbiA/ICovCi0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2FkZHIoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIGlmIChwX3RjYiA9PSBOVUxMKSB7Ci0gICAgLyogYWxsb2NhdGUgdGNiICovCi0gICAgcF90Y2IgPSBnYXR0X2FsbG9jYXRlX3RjYl9ieV9iZGFkZHIoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgaWYgKHBfdGNiID09IE5VTEwpIHsKLSAgICAgIC8qIG5vIHRjYiBhdmFpbGFibGUsIHJlamVjdCBMMkNBUCBjb25uZWN0aW9uICovCi0gICAgICByZXN1bHQgPSBMMkNBUF9DT05OX05PX1JFU09VUkNFUzsKLSAgICB9IGVsc2UKLSAgICAgIHBfdGNiLT5hdHRfbGNpZCA9IGxjaWQ7Ci0KLSAgfSBlbHNlIC8qIGV4aXN0aW5nIGNvbm5lY3Rpb24gLCByZWplY3QgaXQgKi8KLSAgewotICAgIHJlc3VsdCA9IEwyQ0FQX0NPTk5fTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgLyogSWYgd2UgcmVqZWN0IHRoZSBjb25uZWN0aW9uLCBzZW5kIERpc2Nvbm5lY3RSZXEgKi8KLSAgaWYgKHJlc3VsdCAhPSBMMkNBUF9DT05OX09LKSB7Ci0gICAgTDJDQV9EaXNjb25uZWN0UmVxKGxjaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHRyYW5zaXRpb24gdG8gY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotICBnYXR0X3NldF9jaF9zdGF0ZShwX3RjYiwgR0FUVF9DSF9DRkcpOwotfQotCi1zdGF0aWMgdm9pZCBnYXR0X29uX2wyY2FwX2Vycm9yKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9jaWQobGNpZCk7Ci0gIGlmIChwX3RjYiA9PSBudWxscHRyKSByZXR1cm47Ci0gIGlmIChnYXR0X2dldF9jaF9zdGF0ZShwX3RjYikgPT0gR0FUVF9DSF9DT05OKSB7Ci0gICAgZ2F0dF9jbGVhbnVwX3Vwb25fZGlzYyhwX3RjYi0+cGVlcl9iZGEsIEdBVFRfQ09OTl9MMkNfRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICB9IGVsc2UgewotICAgIGdhdHRfbDJjaWZfZGlzY29ubmVjdChsY2lkKTsKLSAgfQotfQotCi0vKiogVGhpcyBpcyB0aGUgTDJDQVAgY29ubmVjdCBjb25maXJtIGNhbGxiYWNrIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCBnYXR0X2wyY2lmX2Nvbm5lY3RfY2ZtX2NiYWNrKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0R0FUVF9UQ0IqIHBfdGNiOwotCi0gIC8qIGxvb2sgdXAgY2xjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9jaWQobGNpZCk7Ci0gIGlmICghcF90Y2IpIHJldHVybjsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fCi0gICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgcmVzdWx0OiAlZCBjaF9zdGF0ZTogJWQsIGxjaWQ6MHgleCIsIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9nZXRfY2hfc3RhdGUocF90Y2IpLCBwX3RjYi0+YXR0X2xjaWQpOwotCi0gIGlmIChnYXR0X2dldF9jaF9zdGF0ZShwX3RjYikgPT0gR0FUVF9DSF9DT05OICYmIHJlc3VsdCA9PSBMMkNBUF9DT05OX09LKSB7Ci0gICAgZ2F0dF9zZXRfY2hfc3RhdGUocF90Y2IsIEdBVFRfQ0hfQ0ZHKTsKLSAgfSBlbHNlIHsKLSAgICBnYXR0X29uX2wyY2FwX2Vycm9yKGxjaWQsIHJlc3VsdCk7Ci0gIH0KLX0KLQotLyoqIFRoaXMgaXMgdGhlIEwyQ0FQIGNvbmZpZyBjb25maXJtIGNhbGxiYWNrIGZ1bmN0aW9uICovCi12b2lkIGdhdHRfbDJjaWZfY29uZmlnX2NmbV9jYmFjayh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIGdhdHRfbDJjaWZfY29uZmlnX2luZF9jYmFjayhsY2lkLCBwX2NmZyk7Ci0KLSAgLyogbG9vayB1cCBjbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfY2lkKGxjaWQpOwotICBpZiAoIXBfdGNiKSByZXR1cm47Ci0KLSAgLyogaWYgaW4gaW5jb3JyZWN0IHN0YXRlICovCi0gIGlmIChnYXR0X2dldF9jaF9zdGF0ZShwX3RjYikgIT0gR0FUVF9DSF9DRkcpIHJldHVybjsKLQotICBnYXR0X3NldF9jaF9zdGF0ZShwX3RjYiwgR0FUVF9DSF9PUEVOKTsKLQotICB0R0FUVFNfU1JWX0NIRyogcF9zcnZfY2hnX2NsdCA9Ci0gICAgICBnYXR0X2lzX2JkYV9pbl90aGVfc3J2X2NoZ19jbHRfbGlzdChwX3RjYi0+cGVlcl9iZGEpOwotICBpZiAocF9zcnZfY2hnX2NsdCAhPSBOVUxMKSB7Ci0gICAgZ2F0dF9jaGtfc3J2X2NoZyhwX3Nydl9jaGdfY2x0KTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoYnRtX3NlY19pc19hX2JvbmRlZF9kZXYocF90Y2ItPnBlZXJfYmRhKSkKLSAgICAgIGdhdHRfYWRkX2FfYm9uZGVkX2Rldl9mb3Jfc3J2X2NoZyhwX3RjYi0+cGVlcl9iZGEpOwotICB9Ci0KLSAgLyogc2VuZCBjYWxsYmFjayAqLwotICBnYXR0X3NlbmRfY29ubl9jYmFjayhwX3RjYik7Ci19Ci0KLS8qKiBUaGlzIGlzIHRoZSBMMkNBUCBjb25maWcgaW5kaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiAqLwotdm9pZCBnYXR0X2wyY2lmX2NvbmZpZ19pbmRfY2JhY2sodWludDE2X3QgbGNpZCwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICAvKiBsb29rIHVwIGNsY2IgZm9yIHRoaXMgY2hhbm5lbCAqLwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9jaWQobGNpZCk7Ci0gIGlmICghcF90Y2IpIHJldHVybjsKLQotICAvKiBHQVRUIHVzZXMgdGhlIHNtYWxsZXIgb2Ygb3VyIE1UVSBhbmQgcGVlcidzIE1UVSAgKi8KLSAgaWYgKHBfY2ZnLT5tdHVfcHJlc2VudCAmJiBwX2NmZy0+bXR1IDwgTDJDQVBfREVGQVVMVF9NVFUpCi0gICAgcF90Y2ItPnBheWxvYWRfc2l6ZSA9IHBfY2ZnLT5tdHU7Ci0gIGVsc2UKLSAgICBwX3RjYi0+cGF5bG9hZF9zaXplID0gTDJDQVBfREVGQVVMVF9NVFU7Ci19Ci0KLS8qKiBUaGlzIGlzIHRoZSBMMkNBUCBkaXNjb25uZWN0IGluZGljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gKi8KLXZvaWQgZ2F0dF9sMmNpZl9kaXNjb25uZWN0X2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBib29sIGFja19uZWVkZWQpIHsKLQotICAvKiBsb29rIHVwIGNsY2IgZm9yIHRoaXMgY2hhbm5lbCAqLwotICB0R0FUVF9UQ0IqIHBfdGNiID0gZ2F0dF9maW5kX3RjYl9ieV9jaWQobGNpZCk7Ci0gIGlmICghcF90Y2IpIHJldHVybjsKLQotICBpZiAoZ2F0dF9pc19iZGFfaW5fdGhlX3Nydl9jaGdfY2x0X2xpc3QocF90Y2ItPnBlZXJfYmRhKSA9PSBOVUxMKSB7Ci0gICAgaWYgKGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KHBfdGNiLT5wZWVyX2JkYSkpCi0gICAgICBnYXR0X2FkZF9hX2JvbmRlZF9kZXZfZm9yX3Nydl9jaGcocF90Y2ItPnBlZXJfYmRhKTsKLSAgfQotICAvKiBzZW5kIGRpc2Nvbm5lY3QgY2FsbGJhY2sgKi8KLSAgZ2F0dF9jbGVhbnVwX3Vwb25fZGlzYyhwX3RjYi0+cGVlcl9iZGEsIEdBVFRfQ09OTl9URVJNSU5BVEVfUEVFUl9VU0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotfQotCi1zdGF0aWMgdm9pZCBnYXR0X2wyY2lmX2Rpc2Nvbm5lY3QodWludDE2X3QgbGNpZCkgewotICBMMkNBX0Rpc2Nvbm5lY3RSZXEobGNpZCk7Ci0KLSAgLyogbG9vayB1cCBjbGNiIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfY2lkKGxjaWQpOwotICBpZiAoIXBfdGNiKSByZXR1cm47Ci0KLSAgLyogSWYgdGhlIGRldmljZSBpcyBub3QgaW4gdGhlIHNlcnZpY2UgY2hhbmdlZCBjbGllbnQgbGlzdCwgYWRkIGl0Li4uICovCi0gIGlmIChnYXR0X2lzX2JkYV9pbl90aGVfc3J2X2NoZ19jbHRfbGlzdChwX3RjYi0+cGVlcl9iZGEpID09IE5VTEwpIHsKLSAgICBpZiAoYnRtX3NlY19pc19hX2JvbmRlZF9kZXYocF90Y2ItPnBlZXJfYmRhKSkKLSAgICAgIGdhdHRfYWRkX2FfYm9uZGVkX2Rldl9mb3Jfc3J2X2NoZyhwX3RjYi0+cGVlcl9iZGEpOwotICB9Ci0KLSAgZ2F0dF9jbGVhbnVwX3Vwb25fZGlzYyhwX3RjYi0+cGVlcl9iZGEsIEdBVFRfQ09OTl9URVJNSU5BVEVfTE9DQUxfSE9TVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLX0KLQotLyoqIFRoaXMgaXMgdGhlIEwyQ0FQIGRhdGEgaW5kaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiAqLwotc3RhdGljIHZvaWQgZ2F0dF9sMmNpZl9kYXRhX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIC8qIGxvb2sgdXAgY2xjYiBmb3IgdGhpcyBjaGFubmVsICovCi0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2ZpbmRfdGNiX2J5X2NpZChsY2lkKTsKLSAgaWYgKHBfdGNiICYmIGdhdHRfZ2V0X2NoX3N0YXRlKHBfdGNiKSA9PSBHQVRUX0NIX09QRU4pIHsKLSAgICAvKiBwcm9jZXNzIHRoZSBkYXRhICovCi0gICAgZ2F0dF9kYXRhX3Byb2Nlc3MoKnBfdGNiLCBsY2lkLCBwX2J1Zik7Ci0gIH0KLQotICBvc2lfZnJlZShwX2J1Zik7Ci19Ci0KLS8qKiBMMkNBUCBjb25nZXN0aW9uIGNhbGxiYWNrICovCi1zdGF0aWMgdm9pZCBnYXR0X2wyY2lmX2Nvbmdlc3RfY2JhY2sodWludDE2X3QgbGNpZCwgYm9vbCBjb25nZXN0ZWQpIHsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfY2lkKGxjaWQpOwotCi0gIGlmIChwX3RjYiAhPSBOVUxMKSB7Ci0gICAgZ2F0dF9jaGFubmVsX2Nvbmdlc3Rpb24ocF90Y2IsIGNvbmdlc3RlZCk7Ci0gIH0KLX0KLQotLyoqIENhbGxiYWNrIHVzZWQgdG8gbm90aWZ5IGxheWVyIGFib3ZlIGFib3V0IGEgY29ubmVjdGlvbiAqLwotc3RhdGljIHZvaWQgZ2F0dF9zZW5kX2Nvbm5fY2JhY2sodEdBVFRfVENCKiBwX3RjYikgewotICB1aW50OF90IGk7Ci0gIHRHQVRUX1JFRyogcF9yZWc7Ci0gIHVpbnQxNl90IGNvbm5faWQ7Ci0KLSAgc3RkOjpzZXQ8dEdBVFRfSUY+IGFwcHMgPQotICAgICAgY29ubmVjdGlvbl9tYW5hZ2VyOjpnZXRfYXBwc19jb25uZWN0aW5nX3RvKHBfdGNiLT5wZWVyX2JkYSk7Ci0KLSAgLyogbm90aWZ5aW5nIGFsbCBhcHBsaWNhdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uIHVwIGV2ZW50ICovCi0gIGZvciAoaSA9IDAsIHBfcmVnID0gZ2F0dF9jYi5jbF9yY2I7IGkgPCBHQVRUX01BWF9BUFBTOyBpKyssIHBfcmVnKyspIHsKLSAgICBpZiAoIXBfcmVnLT5pbl91c2UpIGNvbnRpbnVlOwotCi0gICAgaWYgKGFwcHMuZmluZChwX3JlZy0+Z2F0dF9pZikgIT0gYXBwcy5lbmQoKSkKLSAgICAgIGdhdHRfdXBkYXRlX2FwcF91c2VfbGlua19mbGFnKHBfcmVnLT5nYXR0X2lmLCBwX3RjYiwgdHJ1ZSwgdHJ1ZSk7Ci0KLSAgICBpZiAocF9yZWctPmFwcF9jYi5wX2Nvbm5fY2IpIHsKLSAgICAgIGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHBfdGNiLT50Y2JfaWR4LCBwX3JlZy0+Z2F0dF9pZik7Ci0gICAgICAoKnBfcmVnLT5hcHBfY2IucF9jb25uX2NiKShwX3JlZy0+Z2F0dF9pZiwgcF90Y2ItPnBlZXJfYmRhLCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0dhdHRDb25uZWN0ZWQsIEdBVFRfQ09OTl9PSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNiLT50cmFuc3BvcnQpOwotICAgIH0KLSAgfQotCi0gIC8qIFJlbW92ZSB0aGUgZGlyZWN0IGNvbm5lY3Rpb24gKi8KLSAgY29ubmVjdGlvbl9tYW5hZ2VyOjpvbl9jb25uZWN0aW9uX2NvbXBsZXRlKHBfdGNiLT5wZWVyX2JkYSk7Ci0KLSAgaWYgKCFwX3RjYi0+YXBwX2hvbGRfbGluay5lbXB0eSgpICYmIHBfdGNiLT5hdHRfbGNpZCA9PSBMMkNBUF9BVFRfQ0lEKSB7Ci0gICAgLyogZGlzYWJsZSBpZGxlIHRpbWVvdXQgaWYgb25lIG9yIG1vcmUgY2xpZW50cyBhcmUgaG9sZGluZyB0aGUgbGluayBkaXNhYmxlCi0gICAgICogdGhlIGlkbGUgdGltZXIgKi8KLSAgICBHQVRUX1NldElkbGVUaW1lb3V0KHBfdGNiLT5wZWVyX2JkYSwgR0FUVF9MSU5LX05PX0lETEVfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNiLT50cmFuc3BvcnQpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2xlX2RhdGFfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSBMMkNBUC4KLSAqICAgICAgICAgICAgICAgICAgaWYgd2UgYXJlIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgdGhlIEFUVAotICogICAgICAgICAgICAgICAgICBjbGllbnQsIGFuZCB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBpcyBxdWV1ZWQgdXAgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBjbGllbnQuCi0gKgotICogICAgICAgICAgICAgICAgICBJZiB3ZSBhcmUgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgdGhlIEFUVAotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIsIHNvIHRoZSBtZXNzYWdlIGlzIHBhc3NlZCB0byB0aGUgc2VydmVyIHByb2Nlc3NpbmcKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9kYXRhX3Byb2Nlc3ModEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLSAgdWludDhfdCBvcF9jb2RlLCBwc2V1ZG9fb3BfY29kZTsKLQotICBpZiAocF9idWYtPmxlbiA8PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCBkYXRhIGxlbmd0aCwgaWdub3JlIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCBtc2dfbGVuID0gcF9idWYtPmxlbiAtIDE7Ci0gIFNUUkVBTV9UT19VSU5UOChvcF9jb2RlLCBwKTsKLQotICAvKiByZW1vdmUgdGhlIHR3byBNU0JzIGFzc29jaWF0ZWQgd2l0aCBzaWduIHdyaXRlIGFuZCB3cml0ZSBjbWQgKi8KLSAgcHNldWRvX29wX2NvZGUgPSBvcF9jb2RlICYgKH5HQVRUX1dSSVRFX0NNRF9NQVNLKTsKLQotICBpZiAocHNldWRvX29wX2NvZGUgPj0gR0FUVF9PUF9DT0RFX01BWCkgewotICAgIC8qIE5vdGU6IFBUUzogR0FUVC9TUi9VTlMvQkktMDEtQyBtYW5kYXRlcyBlcnJvciBvbiB1bnN1cHBvcnRlZCBBVFQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICA8PCAiOiBBVFQgLSBSY3ZkIEwyQ0FQIGRhdGEsIHVua25vd24gY21kOiAiIDw8IGxvZ2hleChvcF9jb2RlKTsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBHQVRUX1JFUV9OT1RfU1VQUE9SVEVELCBvcF9jb2RlLCAwLCBmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9TSUdOX0NNRF9XUklURSkgewotICAgIGdhdHRfdmVyaWZ5X3NpZ25hdHVyZSh0Y2IsIGNpZCwgcF9idWYpOwotICB9IGVsc2UgewotICAgIC8qIG1lc3NhZ2UgZnJvbSBjbGllbnQgKi8KLSAgICBpZiAoKG9wX2NvZGUgJSAyKSA9PSAwKQotICAgICAgZ2F0dF9zZXJ2ZXJfaGFuZGxlX2NsaWVudF9yZXEodGNiLCBjaWQsIG9wX2NvZGUsIG1zZ19sZW4sIHApOwotICAgIGVsc2UKLSAgICAgIGdhdHRfY2xpZW50X2hhbmRsZV9zZXJ2ZXJfcnNwKHRjYiwgY2lkLCBvcF9jb2RlLCBtc2dfbGVuLCBwKTsKLSAgfQotfQotCi0vKiogQWRkIGEgYm9uZGVkIGRldiB0byB0aGUgc2VydmljZSBjaGFuZ2VkIGNsaWVudCBsaXN0ICovCi12b2lkIGdhdHRfYWRkX2FfYm9uZGVkX2Rldl9mb3Jfc3J2X2NoZyhjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdEdBVFRTX1NSVl9DSEdfUkVRIHJlcTsKLSAgdEdBVFRTX1NSVl9DSEcgc3J2X2NoZ19jbHQ7Ci0KLSAgc3J2X2NoZ19jbHQuYmRhID0gYmRhOwotICBzcnZfY2hnX2NsdC5zcnZfY2hhbmdlZCA9IGZhbHNlOwotICBpZiAoIWdhdHRfYWRkX3Nydl9jaGdfY2x0KCZzcnZfY2hnX2NsdCkpIHJldHVybjsKLQotICByZXEuc3J2X2NoZy5iZGEgPSBiZGE7Ci0gIHJlcS5zcnZfY2hnLnNydl9jaGFuZ2VkID0gZmFsc2U7Ci0gIGlmIChnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKQotICAgICgqZ2F0dF9jYi5jYl9pbmZvLnBfc3J2X2NoZ19jYWxsYmFjaykoR0FUVFNfU1JWX0NIR19DTURfQUREX0NMSUVOVCwgJnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhIHNlcnZpY2UgY2huYWdlZCBpbmRpY2F0aW9uIHRvIHRoZQotICogc3BlY2lmaWVkIGJkIGFkZHJlc3MgKi8KLXZvaWQgZ2F0dF9zZW5kX3Nydl9jaGdfaW5kKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRhKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKCFnYXR0X2NiLmhhbmRsZV9vZl9oX3IpIHJldHVybjsKLQotICB1aW50MTZfdCBjb25uX2lkID0gZ2F0dF9wcm9maWxlX2ZpbmRfY29ubl9pZF9ieV9iZF9hZGRyKHBlZXJfYmRhKTsKLSAgaWYgKGNvbm5faWQgPT0gR0FUVF9JTlZBTElEX0NPTk5fSUQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZmluZCBjb25uX2lkIGZvciAiIDw8IHBlZXJfYmRhOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgaGFuZGxlX3JhbmdlW0dBVFRfU0laRV9PRl9TUlZfQ0hHX0hORExfUkFOR0VdOwotICB1aW50OF90KiBwID0gaGFuZGxlX3JhbmdlOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIEdBVFRfREVGQVVMVF9TVEFSVF9IQU5ETEUpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIEdBVFRfTEFTVF9IQU5ETEUpOwotICBHQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24oY29ubl9pZCwgZ2F0dF9jYi5oYW5kbGVfb2ZfaF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9TSVpFX09GX1NSVl9DSEdfSE5ETF9SQU5HRSwgaGFuZGxlX3JhbmdlKTsKLX0KLQotLyoqIENoZWNrIHNlbmRpbmcgc2VydmljZSBjaG5hZ2VkIEluZGljYXRpb24gaXMgcmVxdWlyZWQgb3Igbm90IGlmIHJlcXVpcmVkIHRoZW4KLSAqIHNlbmQgdGhlIEluZGljYXRpb24gKi8KLXZvaWQgZ2F0dF9jaGtfc3J2X2NoZyh0R0FUVFNfU1JWX0NIRyogcF9zcnZfY2hnX2NsdCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgc3J2X2NoYW5nZWQ9IiA8PCArcF9zcnZfY2hnX2NsdC0+c3J2X2NoYW5nZWQ7Ci0KLSAgaWYgKHBfc3J2X2NoZ19jbHQtPnNydl9jaGFuZ2VkKSB7Ci0gICAgZ2F0dF9zZW5kX3Nydl9jaGdfaW5kKHBfc3J2X2NoZ19jbHQtPmJkYSk7Ci0gIH0KLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXJ2aWNlIGNoYW5nZWQgYXR0cmlidXRlIHZhbHVlICovCi12b2lkIGdhdHRfaW5pdF9zcnZfY2hnKHZvaWQpIHsKLSAgdEdBVFRTX1NSVl9DSEdfUkVRIHJlcTsKLSAgdEdBVFRTX1NSVl9DSEdfUlNQIHJzcDsKLSAgdEdBVFRTX1NSVl9DSEcgc3J2X2NoZ19jbHQ7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLSAgaWYgKCFnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKSB7Ci0gICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkIHlldCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBzdGF0dXMgPSAoKmdhdHRfY2IuY2JfaW5mby5wX3Nydl9jaGdfY2FsbGJhY2spKAotICAgICAgR0FUVFNfU1JWX0NIR19DTURfUkVBRF9OVU1fQ0xFTlRTLCBOVUxMLCAmcnNwKTsKLQotICBpZiAoIShzdGF0dXMgJiYgcnNwLm51bV9jbGllbnRzKSkgcmV0dXJuOwotCi0gIFZMT0coMSkgPDwgIm51bV9zcnZfY2hnX2NsdF9jbGllbnRzPSIgPDwgK3JzcC5udW1fY2xpZW50czsKLSAgdWludDhfdCBudW1fY2xpZW50cyA9IHJzcC5udW1fY2xpZW50czsKLSAgdWludDhfdCBpID0gMTsgLyogdXNlIG9uZSBiYXNlZCBpbmRleCAqLwotICB3aGlsZSAoKGkgPD0gbnVtX2NsaWVudHMpICYmIHN0YXR1cykgewotICAgIHJlcS5jbGllbnRfcmVhZF9pbmRleCA9IGk7Ci0gICAgc3RhdHVzID0gKCpnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKShHQVRUU19TUlZfQ0hHX0NNRF9SRUFEX0NMRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcSwgJnJzcCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgbWVtY3B5KCZzcnZfY2hnX2NsdCwgJnJzcC5zcnZfY2hnLCBzaXplb2YodEdBVFRTX1NSVl9DSEcpKTsKLSAgICAgIGlmIChnYXR0X2FkZF9zcnZfY2hnX2NsdCgmc3J2X2NoZ19jbHQpID09IE5VTEwpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGFkZCBhIHNlcnZpY2UgY2hhbmdlIGNsaWVudCI7Ci0gICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBpKys7Ci0gIH0KLX0KLQotLyoqVGhpcyBmdW5jdGlvbiBpcyBwcm9jZXNzIHRoZSBzZXJ2aWNlIGNoYW5nZWQgcmVxdWVzdCAqLwotdm9pZCBnYXR0X3Byb2Nfc3J2X2NoZyh2b2lkKSB7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsKLSAgdWludDhfdCBmb3VuZF9pZHg7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAoIWdhdHRfY2IuY2JfaW5mby5wX3Nydl9jaGdfY2FsbGJhY2sgfHwgIWdhdHRfY2IuaGFuZGxlX29mX2hfcikgcmV0dXJuOwotCi0gIGdhdHRfc2V0X3Nydl9jaGcoKTsKLSAgdWludDhfdCBzdGFydF9pZHggPSAwOwotICB3aGlsZSAoZ2F0dF9maW5kX3RoZV9jb25uZWN0ZWRfYmRhKHN0YXJ0X2lkeCwgYmRhLCAmZm91bmRfaWR4LCAmdHJhbnNwb3J0KSkgewotICAgIHRHQVRUX1RDQiogcF90Y2IgPSAmZ2F0dF9jYi50Y2JbZm91bmRfaWR4XTsKLQotICAgIGJvb2wgc2VuZF9pbmRpY2F0aW9uID0gdHJ1ZTsKLQotICAgIGlmIChnYXR0X2lzX3Nydl9jaGdfaW5kX3BlbmRpbmcocF90Y2IpKSB7Ci0gICAgICBzZW5kX2luZGljYXRpb24gPSBmYWxzZTsKLSAgICAgIFZMT0coMSkgPDwgImRpc2NhcmQgc3J2IGNoZyAtIGFscmVhZHkgaGFzIG9uZSBpbiB0aGUgcXVldWUiOwotICAgIH0KLQotICAgIC8vIFNvbWUgTEUgR0FUVCBjbGllbnRzIGRvbid0IHJlc3BvbmQgdG8gc2VydmljZSBjaGFuZ2VkIGluZGljYXRpb25zLgotICAgIGNoYXIgcmVtb3RlX25hbWVbQlRNX01BWF9SRU1fQkRfTkFNRV9MRU5dID0gIiI7Ci0gICAgaWYgKHNlbmRfaW5kaWNhdGlvbiAmJgotICAgICAgICBidGlmX3N0b3JhZ2VfZ2V0X3N0b3JlZF9yZW1vdGVfbmFtZShiZGEsIHJlbW90ZV9uYW1lKSkgewotICAgICAgaWYgKGludGVyb3BfbWF0Y2hfbmFtZShJTlRFUk9QX0dBVFRDX05PX1NFUlZJQ0VfQ0hBTkdFRF9JTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9uYW1lKSkgewotICAgICAgICBWTE9HKDEpIDw8ICJkaXNjYXJkIHNydiBjaGcgLSBpbnRlcm9wIG1hdGNoZWQgIiA8PCByZW1vdGVfbmFtZTsKLSAgICAgICAgc2VuZF9pbmRpY2F0aW9uID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNlbmRfaW5kaWNhdGlvbikgZ2F0dF9zZW5kX3Nydl9jaGdfaW5kKGJkYSk7Ci0KLSAgICBzdGFydF9pZHggPSArK2ZvdW5kX2lkeDsKLSAgfQotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBzZXQgdGhlIGNoX3N0YXRlIGluIHRjYiAqLwotdm9pZCBnYXR0X3NldF9jaF9zdGF0ZSh0R0FUVF9UQ0IqIHBfdGNiLCB0R0FUVF9DSF9TVEFURSBjaF9zdGF0ZSkgewotICBpZiAoIXBfdGNiKSByZXR1cm47Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBvbGQ9IiA8PCArcF90Y2ItPmNoX3N0YXRlCi0gICAgICAgICAgPDwgIiBuZXc9IiA8PCBsb2doZXgoc3RhdGljX2Nhc3Q8dWludDhfdD4oY2hfc3RhdGUpKTsKLSAgcF90Y2ItPmNoX3N0YXRlID0gY2hfc3RhdGU7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGdldCB0aGUgY2hfc3RhdGUgaW4gdGNiICovCi10R0FUVF9DSF9TVEFURSBnYXR0X2dldF9jaF9zdGF0ZSh0R0FUVF9UQ0IqIHBfdGNiKSB7Ci0gIGlmICghcF90Y2IpIHJldHVybiBHQVRUX0NIX0NMT1NFOwotCi0gIFZMT0coMSkgPDwgImdhdHRfZ2V0X2NoX3N0YXRlOiBjaF9zdGF0ZT0iIDw8ICtwX3RjYi0+Y2hfc3RhdGU7Ci0gIHJldHVybiBwX3RjYi0+Y2hfc3RhdGU7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9nYXR0L2dhdHRfc3IuY2MgYi9zdGFjay9nYXR0L2dhdHRfc3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNWUzNDEuLjAwMDAwMDAKLS0tIGEvc3RhY2svZ2F0dC9nYXR0X3NyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA4LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgR0FUVCBzZXJ2ZXIgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImdhdHRfaW50LmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2VhdHQvZWF0dC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2wyY2FwL2wyY19pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jZGVmaW5lIEdBVFRfTVRVX1JFUV9NSU5fTEVOIDIKLSNkZWZpbmUgTDJDQVBfUEtUX09WRVJIRUFEIDQKLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotdXNpbmcgYmx1ZXRvb3RoOjplYXR0OjpFYXR0RXh0ZW5zaW9uOwotdXNpbmcgYmx1ZXRvb3RoOjplYXR0OjpFYXR0Q2hhbm5lbDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfZW5xdWV1ZV9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZW5xdWV1ZSB0aGUgcmVxdWVzdCBmcm9tIGNsaWVudCB3aGljaCBuZWVkcyBhCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHJlc3BvbnNlLCBhbmQgdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDMyX3QgZ2F0dF9zcl9lbnF1ZXVlX2NtZCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCB1aW50OF90IG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICB0R0FUVF9TUl9DTUQqIHBfY21kOwotCi0gIGlmIChjaWQgPT0gdGNiLmF0dF9sY2lkKSB7Ci0gICAgcF9jbWQgPSAmdGNiLnNyX2NtZDsKLSAgfSBlbHNlIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRjYi5wZWVyX2JkYSwgY2lkKTsKLSAgICBwX2NtZCA9ICZjaGFubmVsLT5zZXJ2ZXJfb3V0c3RhbmRpbmdfY21kXzsKLSAgfQotCi0gIHVpbnQzMl90IHRyYW5zX2lkID0gMDsKLQotICBwX2NtZC0+Y2lkID0gY2lkOwotCi0gIGlmICgocF9jbWQtPm9wX2NvZGUgPT0gMCkgfHwKLSAgICAgIChvcF9jb2RlID09IEdBVFRfSEFORExFX1ZBTFVFX0NPTkYpKSAvKiBubyBwZW5kaW5nIHJlcXVlc3QgKi8KLSAgewotICAgIGlmIChvcF9jb2RlID09IEdBVFRfQ01EX1dSSVRFIHx8IG9wX2NvZGUgPT0gR0FUVF9TSUdOX0NNRF9XUklURSB8fAotICAgICAgICBvcF9jb2RlID09IEdBVFRfUkVRX01UVSB8fCBvcF9jb2RlID09IEdBVFRfSEFORExFX1ZBTFVFX0NPTkYpIHsKLSAgICAgIHRyYW5zX2lkID0gKyt0Y2IudHJhbnNfaWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfY21kLT50cmFuc19pZCA9ICsrdGNiLnRyYW5zX2lkOwotICAgICAgcF9jbWQtPm9wX2NvZGUgPSBvcF9jb2RlOwotICAgICAgcF9jbWQtPmhhbmRsZSA9IGhhbmRsZTsKLSAgICAgIHBfY21kLT5zdGF0dXMgPSBHQVRUX05PVF9GT1VORDsKLSAgICAgIHRjYi50cmFuc19pZCAlPSBHQVRUX1RSQU5TX0lEX01BWDsKLSAgICAgIHRyYW5zX2lkID0gcF9jbWQtPnRyYW5zX2lkOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cmFuc19pZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfY21kX2VtcHR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgc2VydmVyIGNvbW1hbmQgcXVldWUgaXMgZW1wdHkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGVtcHR5LCBmYWxzZSBpZiB0aGVyZSBpcyBwZW5kaW5nIGNvbW1hbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF9zcl9jbWRfZW1wdHkodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkgewotICBpZiAoY2lkID09IHRjYi5hdHRfbGNpZCkgcmV0dXJuICh0Y2Iuc3JfY21kLm9wX2NvZGUgPT0gMCk7Ci0KLSAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlDaWQodGNiLnBlZXJfYmRhLCBjaWQpOwotCi0gIHJldHVybiAoY2hhbm5lbC0+c2VydmVyX291dHN0YW5kaW5nX2NtZF8ub3BfY29kZSA9PSAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfZGVxdWV1ZV9zcl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGVxdWV1ZSB0aGUgcmVxdWVzdCBmcm9tIGNvbW1hbmQgcXVldWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9kZXF1ZXVlX3NyX2NtZCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKSB7Ci0gIHRHQVRUX1NSX0NNRCogcF9jbWQ7Ci0KLSAgaWYgKGNpZCA9PSB0Y2IuYXR0X2xjaWQpIHsKLSAgICBwX2NtZCA9ICZ0Y2Iuc3JfY21kOwotICB9IGVsc2UgewotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0KLSAgICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlDaWQodGNiLnBlZXJfYmRhLCBjaWQpOwotCi0gICAgcF9jbWQgPSAmY2hhbm5lbC0+c2VydmVyX291dHN0YW5kaW5nX2NtZF87Ci0gIH0KLQotICAvKiBEb3VibGUgY2hlY2sgaW4gY2FzZSBhbnkgYnVmZmVycyBhcmUgcXVldWVkICovCi0gIFZMT0coMSkgPDwgImdhdHRfZGVxdWV1ZV9zcl9jbWQgY2lkOiAiIDw8IGxvZ2hleChjaWQpOwotICBpZiAocF9jbWQtPnBfcnNwX21zZykKLSAgICBMT0coRVJST1IpIDw8ICJmcmVlIHRjYi5zcl9jbWQucF9yc3BfbXNnID0gIgotICAgICAgICAgICAgICAgPDwgcF9jbWQtPnBfcnNwX21zZzsKLSAgb3NpX2ZyZWVfYW5kX3Jlc2V0KCh2b2lkKiopJnBfY21kLT5wX3JzcF9tc2cpOwotCi0gIHdoaWxlICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jbWQtPm11bHRpX3JzcF9xKSkKLSAgICBvc2lfZnJlZShmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2NtZC0+bXVsdGlfcnNwX3EpKTsKLSAgZml4ZWRfcXVldWVfZnJlZShwX2NtZC0+bXVsdGlfcnNwX3EsIE5VTEwpOwotICBtZW1zZXQocF9jbWQsIDAsIHNpemVvZih0R0FUVF9TUl9DTUQpKTsKLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfcmVhZF9tdWx0aV9yc3AodEdBVFRfU1JfQ01EKiBwX2NtZCwgdWludDE2X3QgbXR1KSB7Ci0gIHVpbnQxNl90IGlpLCB0b3RhbF9sZW4sIGxlbjsKLSAgdWludDhfdCogcDsKLSAgYm9vbCBpc19vdmVyZmxvdyA9IGZhbHNlOwotCi0gIGxlbiA9IHNpemVvZihCVF9IRFIpICsgTDJDQVBfTUlOX09GRlNFVCArIG10dTsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9jYWxsb2MobGVuKTsKLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIC8qIEZpcnN0IGJ5dGUgaW4gdGhlIHJlc3BvbnNlIGlzIHRoZSBvcGNvZGUgKi8KLSAgaWYgKHBfY21kLT5tdWx0aV9yZXEudmFyaWFibGVfbGVuKQotICAgICpwKysgPSBHQVRUX1JTUF9SRUFEX01VTFRJX1ZBUjsKLSAgZWxzZQotICAgICpwKysgPSBHQVRUX1JTUF9SRUFEX01VTFRJOwotCi0gIHBfYnVmLT5sZW4gPSAxOwotCi0gIC8qIE5vdyB3YWxrIHRocm91Z2ggdGhlIGJ1ZmZlcnMgcHV0dGluZyB0aGUgZGF0YSBpbnRvIHRoZSByZXNwb25zZSBpbiBvcmRlcgotICAgKi8KLSAgbGlzdF90KiBsaXN0ID0gTlVMTDsKLSAgY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUgPSBOVUxMOwotICBpZiAoIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY21kLT5tdWx0aV9yc3BfcSkpCi0gICAgbGlzdCA9IGZpeGVkX3F1ZXVlX2dldF9saXN0KHBfY21kLT5tdWx0aV9yc3BfcSk7Ci0gIGZvciAoaWkgPSAwOyBpaSA8IHBfY21kLT5tdWx0aV9yZXEubnVtX2hhbmRsZXM7IGlpKyspIHsKLSAgICB0R0FUVFNfUlNQKiBwX3JzcCA9IE5VTEw7Ci0KLSAgICBpZiAobGlzdCAhPSBOVUxMKSB7Ci0gICAgICBpZiAoaWkgPT0gMCkKLSAgICAgICAgbm9kZSA9IGxpc3RfYmVnaW4obGlzdCk7Ci0gICAgICBlbHNlCi0gICAgICAgIG5vZGUgPSBsaXN0X25leHQobm9kZSk7Ci0gICAgICBpZiAobm9kZSAhPSBsaXN0X2VuZChsaXN0KSkgcF9yc3AgPSAodEdBVFRTX1JTUCopbGlzdF9ub2RlKG5vZGUpOwotICAgIH0KLQotICAgIGlmIChwX3JzcCAhPSBOVUxMKSB7Ci0gICAgICB0b3RhbF9sZW4gPSAocF9idWYtPmxlbiArIHBfcnNwLT5hdHRyX3ZhbHVlLmxlbik7Ci0KLSAgICAgIGlmICh0b3RhbF9sZW4gPiBtdHUpIHsKLSAgICAgICAgLyoganVzdCBzZW5kIHRoZSBwYXJ0aWFsIHJlc3BvbnNlIGZvciB0aGUgb3ZlcmZsb3cgY2FzZSAqLwotICAgICAgICBsZW4gPSBwX3JzcC0+YXR0cl92YWx1ZS5sZW4gLSAodG90YWxfbGVuIC0gbXR1KTsKLSAgICAgICAgaXNfb3ZlcmZsb3cgPSB0cnVlOwotICAgICAgICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICJtdWx0aSByZWFkIG92ZXJmbG93IGF2YWlsYWJsZSBsZW49JWQgdmFsX2xlbj0lZCIsIGxlbiwKLSAgICAgICAgICAgIHBfcnNwLT5hdHRyX3ZhbHVlLmxlbik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsZW4gPSBwX3JzcC0+YXR0cl92YWx1ZS5sZW47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX2NtZC0+bXVsdGlfcmVxLnZhcmlhYmxlX2xlbikgewotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGxlbik7Ci0gICAgICAgIHBfYnVmLT5sZW4gKz0gMjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBfcnNwLT5hdHRyX3ZhbHVlLmhhbmRsZSA9PSBwX2NtZC0+bXVsdGlfcmVxLmhhbmRsZXNbaWldKSB7Ci0gICAgICAgIG1lbWNweShwLCBwX3JzcC0+YXR0cl92YWx1ZS52YWx1ZSwgbGVuKTsKLSAgICAgICAgaWYgKCFpc19vdmVyZmxvdykgcCArPSBsZW47Ci0gICAgICAgIHBfYnVmLT5sZW4gKz0gbGVuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9jbWQtPnN0YXR1cyA9IEdBVFRfTk9UX0ZPVU5EOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzX292ZXJmbG93KSBicmVhazsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBwX2NtZC0+c3RhdHVzID0gR0FUVF9OT1RfRk9VTkQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgfSAvKiBsb29wIHRocm91Z2ggYWxsIGhhbmRsZXMqLwotCi0gIC8qIFNhbml0eSBjaGVjayBvbiB0aGUgYnVmZmVyIGxlbmd0aCAqLwotICBpZiAocF9idWYtPmxlbiA9PSAwKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIG5vdGhpbmcgZm91bmQhISI7Ci0gICAgcF9jbWQtPnN0YXR1cyA9IEdBVFRfTk9UX0ZPVU5EOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICJvc2lfZnJlZShwX2J1ZikiOwotICB9IGVsc2UgaWYgKHBfY21kLT5wX3JzcF9tc2cgIT0gTlVMTCkgewotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfSBlbHNlIHsKLSAgICBwX2NtZC0+cF9yc3BfbXNnID0gcF9idWY7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHByb2Nlc3NfcmVhZF9tdWx0aV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2sgdGhlIHJlYWQgbXVsdGlwbGUgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICAgIGlmIGFsbCByZXBsaWVzIGhhdmUgYmVlbiByZWNlaXZlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBwcm9jZXNzX3JlYWRfbXVsdGlfcnNwKHRHQVRUX1NSX0NNRCogcF9jbWQsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SU1AqIHBfbXNnLCB1aW50MTZfdCBtdHUpIHsKLSAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoIiVzIHN0YXR1cz0lZCBtdHU9JWQiLCBfX2Z1bmNfXywgc3RhdHVzLCBtdHUpOwotCi0gIGlmIChwX2NtZC0+bXVsdGlfcnNwX3EgPT0gTlVMTCkKLSAgICBwX2NtZC0+bXVsdGlfcnNwX3EgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotCi0gIC8qIEVucXVldWUgdGhlIHJlc3BvbnNlICovCi0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZih0R0FUVFNfUlNQKSk7Ci0gIG1lbWNweSgodm9pZCopcF9idWYsIChjb25zdCB2b2lkKilwX21zZywgc2l6ZW9mKHRHQVRUU19SU1ApKTsKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX2NtZC0+bXVsdGlfcnNwX3EsIHBfYnVmKTsKLQotICBwX2NtZC0+c3RhdHVzID0gc3RhdHVzOwotICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUykgewotICAgIFZMT0coMSkgPDwgIk11bHRpIHJlYWQgY291bnQ9IiA8PCBmaXhlZF9xdWV1ZV9sZW5ndGgocF9jbWQtPm11bHRpX3JzcF9xKQotICAgICAgICAgICAgPDwgIiBudW1faGRscz0iIDw8IHBfY21kLT5tdWx0aV9yZXEubnVtX2hhbmRsZXMKLSAgICAgICAgICAgIDw8ICIgdmFyaWFibGU9IiA8PCBwX2NtZC0+bXVsdGlfcmVxLnZhcmlhYmxlX2xlbjsKLSAgICAvKiBXYWl0IHRpbGwgd2UgZ2V0IGFsbCB0aGUgcmVzcG9uc2VzICovCi0gICAgaWYgKGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NtZC0+bXVsdGlfcnNwX3EpID09Ci0gICAgICAgIHBfY21kLT5tdWx0aV9yZXEubnVtX2hhbmRsZXMpIHsKLSAgICAgIGJ1aWxkX3JlYWRfbXVsdGlfcnNwKHBfY21kLCBtdHUpOwotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0gIH0gZWxzZSAvKiBhbnkgaGFuZGxlIHJlYWQgZXhjZXB0aW9uIG9jY3VycywgcmV0dXJuIGVycm9yICovCi0gIHsKLSAgICByZXR1cm4gKHRydWUpOwotICB9Ci0KLSAgLyogSWYgaGVyZSwgc3RpbGwgd2FpdGluZyAqLwotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfcHJvY2Vzc19hcHBfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20KLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gbWF0Y2hlcyBhbnkgcGVuZGluZyByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9TVEFUVVMgZ2F0dF9zcl9wcm9jZXNzX2FwcF9yc3AodEdBVFRfVENCJiB0Y2IsIHRHQVRUX0lGIGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDMyX3QgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcF9jb2RlLCB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SU1AqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NSX0NNRCogc3JfcmVzX3ApIHsKLSAgdEdBVFRfU1RBVFVTIHJldF9jb2RlID0gR0FUVF9TVUNDRVNTOwotICB1aW50MTZfdCBwYXlsb2FkX3NpemUgPSBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3J4KHRjYiwgc3JfcmVzX3AtPmNpZCk7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIGdhdHRfaWY9IiA8PCArZ2F0dF9pZjsKLQotICBnYXR0X3NyX3VwZGF0ZV9jYmFja19jbnQodGNiLCBzcl9yZXNfcC0+Y2lkLCBnYXR0X2lmLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmICgob3BfY29kZSA9PSBHQVRUX1JFUV9SRUFEX01VTFRJKSB8fAotICAgICAgKG9wX2NvZGUgPT0gR0FUVF9SRVFfUkVBRF9NVUxUSV9WQVIpKSB7Ci0gICAgLyogSWYgbm8gZXJyb3IgYW5kIHN0aWxsIHdhaXRpbmcsIGp1c3QgcmV0dXJuICovCi0gICAgaWYgKCFwcm9jZXNzX3JlYWRfbXVsdGlfcnNwKHNyX3Jlc19wLCBzdGF0dXMsIHBfbXNnLCBwYXlsb2FkX3NpemUpKQotICAgICAgcmV0dXJuIChHQVRUX1NVQ0NFU1MpOwotICB9IGVsc2UgewotICAgIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX1BSRVBBUkVfV1JJVEUgJiYgc3RhdHVzID09IEdBVFRfU1VDQ0VTUykKLSAgICAgIGdhdHRfc3JfdXBkYXRlX3ByZXBfY250KHRjYiwgZ2F0dF9pZiwgdHJ1ZSwgZmFsc2UpOwotCi0gICAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SRVFfRVhFQ19XUklURSAmJiBzdGF0dXMgIT0gR0FUVF9TVUNDRVNTKQotICAgICAgZ2F0dF9zcl9yZXNldF9jYmFja19jbnQodGNiLCBzcl9yZXNfcC0+Y2lkKTsKLQotICAgIHNyX3Jlc19wLT5zdGF0dXMgPSBzdGF0dXM7Ci0KLSAgICBpZiAoZ2F0dF9zcl9pc19jYmFja19jbnRfemVybyh0Y2IpICYmIHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICAgIGlmIChzcl9yZXNfcC0+cF9yc3BfbXNnID09IE5VTEwpIHsKLSAgICAgICAgc3JfcmVzX3AtPnBfcnNwX21zZyA9IGF0dHBfYnVpbGRfc3JfbXNnKHRjYiwgKHVpbnQ4X3QpKG9wX2NvZGUgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0R0FUVF9TUl9NU0cqKXBfbXNnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkV4Y2VwdGlvbiEhISBhbHJlYWR5IGhhcyByZXNwb25kIG1lc3NhZ2UiOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoZ2F0dF9zcl9pc19jYmFja19jbnRfemVybyh0Y2IpKSB7Ci0gICAgaWYgKChzcl9yZXNfcC0+c3RhdHVzID09IEdBVFRfU1VDQ0VTUykgJiYgKHNyX3Jlc19wLT5wX3JzcF9tc2cpKSB7Ci0gICAgICByZXRfY29kZSA9IGF0dHBfc2VuZF9zcl9tc2codGNiLCBzcl9yZXNfcC0+Y2lkLCBzcl9yZXNfcC0+cF9yc3BfbXNnKTsKLSAgICAgIHNyX3Jlc19wLT5wX3JzcF9tc2cgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXRfY29kZSA9IGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBzcl9yZXNfcC0+Y2lkLCBzdGF0dXMsIG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JfcmVzX3AtPmhhbmRsZSwgZmFsc2UpOwotICAgIH0KLQotICAgIGdhdHRfZGVxdWV1ZV9zcl9jbWQodGNiLCBzcl9yZXNfcC0+Y2lkKTsKLSAgfQotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiByZXRfY29kZT0iIDw8ICtyZXRfY29kZTsKLQotICByZXR1cm4gcmV0X2NvZGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfZXhlY193cml0ZV9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIGV4ZWN1dGUgd3JpdGUgcmVxdWVzdAotICogICAgICAgICAgICAgICAgICBmcm9tIGNsaWVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2Nlc3NfZXhlY193cml0ZV9yZXEodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDhfdCAqcCA9IHBfZGF0YSwgZmxhZywgaSA9IDA7Ci0gIHVpbnQzMl90IHRyYW5zX2lkID0gMDsKLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLSAgdWludDE2X3QgY29ubl9pZDsKLQotI2lmIChHQVRUX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRSkKLSAgaWYgKGdhdHRfY2IuZW5hYmxlX2Vycl9yc3AgJiYgZ2F0dF9jYi5yZXFfb3BfY29kZSA9PSBvcF9jb2RlKSB7Ci0gICAgVkxPRygxKQotICAgICAgICA8PCAiQ29uZm9ybWFuY2UgdHN0OiBmb3JjZWQgZXJyIHJzcHYgZm9yIEV4ZWN1dGUgV3JpdGU6IGVycm9yIHN0YXR1cz0iCi0gICAgICAgIDw8ICtnYXR0X2NiLmVycl9zdGF0dXM7Ci0KLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBnYXR0X2NiLmVycl9zdGF0dXMsIGdhdHRfY2IucmVxX29wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBnYXR0X2NiLmhhbmRsZSwgZmFsc2UpOwotCi0gICAgcmV0dXJuOwotICB9Ci0jZW5kaWYKLQotICBpZiAobGVuIDwgc2l6ZW9mKGZsYWcpKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MzE3MjExNSIpOwotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgImludmFsaWQgbGVuZ3RoIjsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBHQVRUX0lOVkFMSURfUERVLCBHQVRUX1JFUV9FWEVDX1dSSVRFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOChmbGFnLCBwKTsKLQotICAvKiBtYXNrIHRoZSBmbGFnICovCi0gIGZsYWcgJj0gR0FUVF9QUkVQX1dSSVRFX0VYRUM7Ci0KLSAgLyogbm8gcHJlcCB3cml0ZSBpcyBxdWV1ZWQgKi8KLSAgaWYgKCFnYXR0X3NyX2lzX3ByZXBfY250X3plcm8odGNiKSkgewotICAgIHRyYW5zX2lkID0gZ2F0dF9zcl9lbnF1ZXVlX2NtZCh0Y2IsIGNpZCwgb3BfY29kZSwgMCk7Ci0gICAgZ2F0dF9zcl9jb3B5X3ByZXBfY250X3RvX2NiYWNrX2NudCh0Y2IpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEdBVFRfTUFYX0FQUFM7IGkrKykgewotICAgICAgaWYgKHRjYi5wcmVwX2NudFtpXSkgewotICAgICAgICBnYXR0X2lmID0gKHRHQVRUX0lGKShpICsgMSk7Ci0gICAgICAgIGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHRjYi50Y2JfaWR4LCBnYXR0X2lmKTsKLSAgICAgICAgdEdBVFRTX0RBVEEgZ2F0dHNfZGF0YTsKLSAgICAgICAgZ2F0dHNfZGF0YS5leGVjX3dyaXRlID0gZmxhZzsKLSAgICAgICAgZ2F0dF9zcl9zZW5kX3JlcV9jYWxsYmFjayhjb25uX2lkLCB0cmFuc19pZCwgR0FUVFNfUkVRX1RZUEVfV1JJVEVfRVhFQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2F0dHNfZGF0YSk7Ci0gICAgICAgIHRjYi5wcmVwX2NudFtpXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgLyogbm90aGluZyBuZWVkcyB0byBiZSBleGVjdXRlZCAsIHNlbmQgcmVzcG9uc2Ugbm93ICovCi0gIHsKLSAgICBMT0coRVJST1IpIDw8ICJnYXR0X3Byb2Nlc3NfZXhlY193cml0ZV9yZXE6IG5vIHByZXBhcmUgd3JpdGUgcGVuZGluZyI7Ci0gICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgR0FUVF9FUlJPUiwgR0FUVF9SRVFfRVhFQ19XUklURSwgMCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3Byb2Nlc3NfcmVhZF9tdWx0aV9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIHJlYWQgbXVsdGlwbGUgcmVxdWVzdAotICogICAgICAgICAgICAgICAgICBmcm9tIGNsaWVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3Byb2Nlc3NfcmVhZF9tdWx0aV9yZXEodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDMyX3QgdHJhbnNfaWQ7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDAsIGxsID0gbGVuOwotICB1aW50OF90KiBwID0gcF9kYXRhOwotICB0R0FUVF9TVEFUVVMgZXJyID0gR0FUVF9TVUNDRVNTOwotICB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZzsKLSAgdWludDhfdCBrZXlfc2l6ZTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIHRHQVRUX1JFQURfTVVMVEkqIG11bHRpX3JlcSA9IGdhdHRfc3JfZ2V0X3JlYWRfbXVsdGkodGNiLCBjaWQpOwotICBtdWx0aV9yZXEtPm51bV9oYW5kbGVzID0gMDsKLSAgbXVsdGlfcmVxLT52YXJpYWJsZV9sZW4gPSAob3BfY29kZSA9PSBHQVRUX1JFUV9SRUFEX01VTFRJX1ZBUik7Ci0gIGdhdHRfc3JfZ2V0X3NlY19pbmZvKHRjYi5wZWVyX2JkYSwgdGNiLnRyYW5zcG9ydCwgJnNlY19mbGFnLCAma2V5X3NpemUpOwotCi0jaWYgKEdBVFRfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotICBpZiAoZ2F0dF9jYi5lbmFibGVfZXJyX3JzcCAmJiBnYXR0X2NiLnJlcV9vcF9jb2RlID09IG9wX2NvZGUpIHsKLSAgICBWTE9HKDEpIDw8ICJDb25mb3JtYW5jZSB0c3Q6IGZvcmNlZCBlcnIgcnNwdm9mciBSZWFkTXVsdGlwbGU6IGVycm9yIHN0YXR1cz0iCi0gICAgICAgICAgICA8PCArZ2F0dF9jYi5lcnJfc3RhdHVzOwotCi0gICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotCi0gICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgZ2F0dF9jYi5lcnJfc3RhdHVzLCBnYXR0X2NiLnJlcV9vcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBmYWxzZSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLSNlbmRpZgotCi0gIHdoaWxlIChsbCA+PSAyICYmIG11bHRpX3JlcS0+bnVtX2hhbmRsZXMgPCBHQVRUX01BWF9SRUFEX01VTFRJX0hBTkRMRVMpIHsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0KLSAgICBhdXRvIGl0ID0gZ2F0dF9zcl9maW5kX2lfcmNiX2J5X2hhbmRsZShoYW5kbGUpOwotICAgIGlmIChpdCAhPSBnYXR0X2NiLnNydl9saXN0X2luZm8tPmVuZCgpKSB7Ci0gICAgICBtdWx0aV9yZXEtPmhhbmRsZXNbbXVsdGlfcmVxLT5udW1faGFuZGxlcysrXSA9IGhhbmRsZTsKLQotICAgICAgLyogY2hlY2sgcmVhZCBwZXJtaXNzaW9uICovCi0gICAgICBlcnIgPSBnYXR0c19yZWFkX2F0dHJfcGVybV9jaGVjayhpdC0+cF9kYiwgZmFsc2UsIGhhbmRsZSwgc2VjX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfc2l6ZSk7Ci0gICAgICBpZiAoZXJyICE9IEdBVFRfU1VDQ0VTUykgewotICAgICAgICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigicmVhZCBwZXJtaXNzaW9uIGRlbmllZCA6IDB4JTAyeCIsIGVycik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBpbnZhbGlkIGhhbmRsZSAqLwotICAgICAgZXJyID0gR0FUVF9JTlZBTElEX0hBTkRMRTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBsbCAtPSAyOwotICB9Ci0KLSAgaWYgKGxsICE9IDApIHsKLSAgICBMT0coRVJST1IpIDw8ICJtYXggYXR0cmlidXRlIGhhbmRsZSByZWFjaGVkIGluIFJlYWRNdWx0aXBsZSBSZXF1ZXN0LiI7Ci0gIH0KLQotICBpZiAobXVsdGlfcmVxLT5udW1faGFuZGxlcyA9PSAwKSBlcnIgPSBHQVRUX0lOVkFMSURfSEFORExFOwotCi0gIGlmIChlcnIgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgdHJhbnNfaWQgPSBnYXR0X3NyX2VucXVldWVfY21kKHRjYiwgY2lkLCBvcF9jb2RlLCBtdWx0aV9yZXEtPmhhbmRsZXNbMF0pOwotICAgIGlmICh0cmFuc19pZCAhPSAwKSB7Ci0gICAgICB0R0FUVF9TUl9DTUQqIHNyX2NtZF9wID0gZ2F0dF9zcl9nZXRfY21kX2J5X2NpZCh0Y2IsIGNpZCk7Ci0KLSAgICAgIGdhdHRfc3JfcmVzZXRfY2JhY2tfY250KHRjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCk7IC8qIHJlYWQgbXVsdGlwbGUgdXNlIG11bHRpX3JzcF9xJ3MgY291bnQqLwotCi0gICAgICBmb3IgKGxsID0gMDsgbGwgPCBtdWx0aV9yZXEtPm51bV9oYW5kbGVzOyBsbCsrKSB7Ci0gICAgICAgIHRHQVRUU19SU1AqIHBfbXNnID0gKHRHQVRUU19SU1AqKW9zaV9jYWxsb2Moc2l6ZW9mKHRHQVRUU19SU1ApKTsKLSAgICAgICAgaGFuZGxlID0gbXVsdGlfcmVxLT5oYW5kbGVzW2xsXTsKLSAgICAgICAgYXV0byBpdCA9IGdhdHRfc3JfZmluZF9pX3JjYl9ieV9oYW5kbGUoaGFuZGxlKTsKLQotICAgICAgICBwX21zZy0+YXR0cl92YWx1ZS5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgIGVyciA9IGdhdHRzX3JlYWRfYXR0cl92YWx1ZV9ieV9oYW5kbGUoCi0gICAgICAgICAgICB0Y2IsIGNpZCwgaXQtPnBfZGIsIG9wX2NvZGUsIGhhbmRsZSwgMCwgcF9tc2ctPmF0dHJfdmFsdWUudmFsdWUsCi0gICAgICAgICAgICAmcF9tc2ctPmF0dHJfdmFsdWUubGVuLCBHQVRUX01BWF9BVFRSX0xFTiwgc2VjX2ZsYWcsIGtleV9zaXplLAotICAgICAgICAgICAgdHJhbnNfaWQpOwotCi0gICAgICAgIGlmIChlcnIgPT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgZ2F0dF9zcl9wcm9jZXNzX2FwcF9yc3AodGNiLCBpdC0+Z2F0dF9pZiwgdHJhbnNfaWQsIG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9TVUNDRVNTLCBwX21zZywgc3JfY21kX3ApOwotICAgICAgICB9Ci0gICAgICAgIC8qIGVpdGhlciBub3QgdXNpbmcgb3IgZG9uZSB1c2luZyB0aGUgYnVmZmVyLCByZWxlYXNlIGl0IG5vdyAqLwotICAgICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICBlcnIgPSBHQVRUX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIC8qIGluIHRoZXJveSBCVVNZIGlzIG5vdCBwb3NzaWJsZShzaG91bGQgYWxyZWFkeSBiZWVuIGNoZWNrZWQpLCBwcm90ZWN0ZWQKLSAgICogY2hlY2sgKi8KLSAgaWYgKGVyciAhPSBHQVRUX1NVQ0NFU1MgJiYgZXJyICE9IEdBVFRfUEVORElORyAmJiBlcnIgIT0gR0FUVF9CVVNZKQotICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIGVyciwgb3BfY29kZSwgaGFuZGxlLCBmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2J1aWxkX3ByaW1hcnlfc2VydmljZV9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByaW1hbXJ5IHNlcnZpY2UgcmVxdWVzdCBwcm9jZXNzZWQgaW50ZXJuYWxseS4gVGhlcmV0aWNhbGx5Ci0gKiAgICAgICAgICAgICAgICAgIG9ubHkgZGVhbCB3aXRoIFJlYWRCeVR5cGVWQWx1ZSBhbmQgUmVhZEJ5R3JvdXBUeXBlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdEdBVFRfU1RBVFVTIGdhdHRfYnVpbGRfcHJpbWFyeV9zZXJ2aWNlX3JzcCgKLSAgICBCVF9IRFIqIHBfbXNnLCB0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCB1aW50OF90IG9wX2NvZGUsCi0gICAgdWludDE2X3Qgc19oZGwsIHVpbnQxNl90IGVfaGRsLCBVTlVTRURfQVRUUiB1aW50OF90KiBwX2RhdGEsCi0gICAgY29uc3QgVXVpZCYgdmFsdWUpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfTk9UX0ZPVU5EOwotICB1aW50OF90IGhhbmRsZV9sZW4gPSA0OwotCi0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIHVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfdHgodGNiLCBjaWQpOwotCi0gIGZvciAodEdBVFRfU1JWX0xJU1RfRUxFTSYgZWwgOiAqZ2F0dF9jYi5zcnZfbGlzdF9pbmZvKSB7Ci0gICAgaWYgKGVsLnNfaGRsIDwgc19oZGwgfHwgZWwuc19oZGwgPiBlX2hkbCB8fAotICAgICAgICBlbC50eXBlICE9IEdBVFRfVVVJRF9QUklfU0VSVklDRSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgVXVpZCogcF91dWlkID0gZ2F0dHNfZ2V0X3NlcnZpY2VfdXVpZChlbC5wX2RiKTsKLSAgICBpZiAoIXBfdXVpZCkgY29udGludWU7Ci0KLSAgICBpZiAob3BfY29kZSA9PSBHQVRUX1JFUV9SRUFEX0JZX0dSUF9UWVBFKQotICAgICAgaGFuZGxlX2xlbiA9IDQgKyBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtX2xlbigqcF91dWlkKTsKLQotICAgIC8qIGdldCB0aGUgbGVuZ3RoIGJ5dGUgaW4gdGhlIHJlcHNvbnNlICovCi0gICAgaWYgKHBfbXNnLT5vZmZzZXQgPT0gMCkgewotICAgICAgKnArKyA9IG9wX2NvZGUgKyAxOwotICAgICAgcF9tc2ctPmxlbisrOwotICAgICAgcF9tc2ctPm9mZnNldCA9IGhhbmRsZV9sZW47Ci0KLSAgICAgIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEUpIHsKLSAgICAgICAgKnArKyA9ICh1aW50OF90KXBfbXNnLT5vZmZzZXQ7IC8qIGxlbmd0aCBieXRlICovCi0gICAgICAgIHBfbXNnLT5sZW4rKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocF9tc2ctPmxlbiArIHBfbXNnLT5vZmZzZXQgPiBwYXlsb2FkX3NpemUgfHwKLSAgICAgICAgaGFuZGxlX2xlbiAhPSBwX21zZy0+b2Zmc2V0KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAob3BfY29kZSA9PSBHQVRUX1JFUV9GSU5EX1RZUEVfVkFMVUUgJiYgdmFsdWUgIT0gKnBfdXVpZCkgY29udGludWU7Ci0KLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGVsLnNfaGRsKTsKLQotICAgIGlmIChnYXR0X2NiLmxhc3Rfc2VydmljZV9oYW5kbGUgJiYKLSAgICAgICAgZ2F0dF9jYi5sYXN0X3NlcnZpY2VfaGFuZGxlID09IGVsLnNfaGRsKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJVc2UgMHhGRkZGIGZvciB0aGUgbGFzdCBwcmltYXJ5IGF0dHJpYnV0ZSI7Ci0gICAgICAvKiBzZWUgR0FUVCBFUlJBVEEgNDA2NSwgNDA2MywgQVRUIEVSUkFUQSA0MDYyICovCi0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIDB4RkZGRik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgZWwuZV9oZGwpOwotICAgIH0KLQotICAgIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEUpCi0gICAgICBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtKCZwLCAqcF91dWlkKTsKLQotICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICBwX21zZy0+bGVuICs9IHBfbXNnLT5vZmZzZXQ7Ci0gIH0KLSAgcF9tc2ctPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBmaWxsIHRoZSBmaW5kIGluZm9ybWF0aW9uIHJlc3BvbnNlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBidWZmZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlOiBpZiBkYXRhIGZpbGxlZCBzdWNlc3NmdWxseS4KLSAqICAgICAgICAgICAgICAgICAgZmFsc2U6IHBhY2tldCBmdWxsLCBvciBmb3JtYXQgbWlzbWF0Y2guCi0gKi8KLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dF9idWlsZF9maW5kX2luZm9fcnNwKHRHQVRUX1NSVl9MSVNUX0VMRU0mIGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX21zZywgdWludDE2X3QmIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNfaGRsLCB1aW50MTZfdCBlX2hkbCkgewotICB1aW50OF90IGluZm9fcGFpcl9sZW5bMl0gPSB7NCwgMTh9OwotCi0gIGlmICghZWwucF9kYikgcmV0dXJuIEdBVFRfTk9UX0ZPVU5EOwotCi0gIC8qIGNoZWNrIHRoZSBhdHRyaWJ1dGUgZGF0YWJhc2UgKi8KLQotICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKShwX21zZyArIDEpICsgTDJDQVBfTUlOX09GRlNFVCArIHBfbXNnLT5sZW47Ci0KLSAgZm9yIChhdXRvJiBhdHRyIDogZWwucF9kYi0+YXR0cl9saXN0KSB7Ci0gICAgaWYgKGF0dHIuaGFuZGxlID4gZV9oZGwpIGJyZWFrOwotCi0gICAgaWYgKGF0dHIuaGFuZGxlIDwgc19oZGwpIGNvbnRpbnVlOwotCi0gICAgdWludDhfdCB1dWlkX2xlbiA9IGF0dHIudXVpZC5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpOwotICAgIGlmIChwX21zZy0+b2Zmc2V0ID09IDApCi0gICAgICBwX21zZy0+b2Zmc2V0ID0gKHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczE2KSA/IEdBVFRfSU5GT19UWVBFX1BBSVJfMTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR0FUVF9JTkZPX1RZUEVfUEFJUl8xMjg7Ci0KLSAgICBpZiAobGVuIDwgaW5mb19wYWlyX2xlbltwX21zZy0+b2Zmc2V0IC0gMV0pIHJldHVybiBHQVRUX05PX1JFU09VUkNFUzsKLQotICAgIGlmIChwX21zZy0+b2Zmc2V0ID09IEdBVFRfSU5GT19UWVBFX1BBSVJfMTYgJiYKLSAgICAgICAgdXVpZF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgYXR0ci5oYW5kbGUpOwotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBhdHRyLnV1aWQuQXMxNkJpdCgpKTsKLSAgICB9IGVsc2UgaWYgKHBfbXNnLT5vZmZzZXQgPT0gR0FUVF9JTkZPX1RZUEVfUEFJUl8xMjggJiYKLSAgICAgICAgICAgICAgIHV1aWRfbGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBhdHRyLmhhbmRsZSk7Ci0gICAgICBBUlJBWV9UT19TVFJFQU0ocCwgYXR0ci51dWlkLlRvMTI4Qml0TEUoKSwgKGludClVdWlkOjprTnVtQnl0ZXMxMjgpOwotICAgIH0gZWxzZSBpZiAocF9tc2ctPm9mZnNldCA9PSBHQVRUX0lORk9fVFlQRV9QQUlSXzEyOCAmJgotICAgICAgICAgICAgICAgdXVpZF9sZW4gPT0gVXVpZDo6a051bUJ5dGVzMzIpIHsKLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgYXR0ci5oYW5kbGUpOwotICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIGF0dHIudXVpZC5UbzEyOEJpdExFKCksIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAiZm9ybWF0IG1pc21hdGNoIjsKLSAgICAgIHJldHVybiBHQVRUX05PX1JFU09VUkNFUzsKLSAgICAgIC8qIGZvcm1hdCBtaXNtYXRjaCAqLwotICAgIH0KLSAgICBwX21zZy0+bGVuICs9IGluZm9fcGFpcl9sZW5bcF9tc2ctPm9mZnNldCAtIDFdOwotICAgIGxlbiAtPSBpbmZvX3BhaXJfbGVuW3BfbXNnLT5vZmZzZXQgLSAxXTsKLSAgICByZXR1cm4gR0FUVF9TVUNDRVNTOwotICB9Ci0KLSAgcmV0dXJuIEdBVFRfTk9UX0ZPVU5EOwotfQotCi1zdGF0aWMgdEdBVFRfU1RBVFVTIHJlYWRfaGFuZGxlcyh1aW50MTZfdCYgbGVuLCB1aW50OF90KiYgcCwgdWludDE2X3QmIHNfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QmIGVfaGRsKSB7Ci0gIGlmIChsZW4gPCA0KSByZXR1cm4gR0FUVF9JTlZBTElEX1BEVTsKLQotICAvKiBvYnRhaW4gc3RhcnRpbmcgaGFuZGxlLCBhbmQgZW5kaW5nIGhhbmRsZSAqLwotICBTVFJFQU1fVE9fVUlOVDE2KHNfaGRsLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQxNihlX2hkbCwgcCk7Ci0gIGxlbiAtPSA0OwotCi0gIGlmIChzX2hkbCA+IGVfaGRsIHx8ICFHQVRUX0hBTkRMRV9JU19WQUxJRChzX2hkbCkgfHwKLSAgICAgICFHQVRUX0hBTkRMRV9JU19WQUxJRChlX2hkbCkpIHsKLSAgICByZXR1cm4gR0FUVF9JTlZBTElEX0hBTkRMRTsKLSAgfQotCi0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB0R0FUVF9TVEFUVVMgZ2F0dHNfdmFsaWRhdGVfcGFja2V0X2Zvcm1hdCh1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90JiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHAsIFV1aWQqIHBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCYgc19oZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QmIGVfaGRsKSB7Ci0gIHRHQVRUX1NUQVRVUyByZXQgPSByZWFkX2hhbmRsZXMobGVuLCBwLCBzX2hkbCwgZV9oZGwpOwotICBpZiAocmV0ICE9IEdBVFRfU1VDQ0VTUykgcmV0dXJuIHJldDsKLQotICBpZiAobGVuIDwgMikgcmV0dXJuIEdBVFRfSU5WQUxJRF9QRFU7Ci0KLSAgLyogcGFyc2UgdXVpZCBub3cgKi8KLSAgQ0hFQ0socF91dWlkKTsKLSAgdWludDE2X3QgdXVpZF9sZW4gPSAob3BfY29kZSA9PSBHQVRUX1JFUV9GSU5EX1RZUEVfVkFMVUUpID8gMiA6IGxlbjsKLSAgaWYgKCFnYXR0X3BhcnNlX3V1aWRfZnJvbV9jbWQocF91dWlkLCB1dWlkX2xlbiwgJnApKSB7Ci0gICAgVkxPRygxKSA8PCAiQmFkIFVVSUQiOwotICAgIHJldHVybiBHQVRUX0lOVkFMSURfUERVOwotICB9Ci0KLSAgbGVuIC09IHV1aWRfbGVuOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfcHJvY2Vzc19wcmltYXJ5X3NlcnZpY2VfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIFJlYWRCeUdyb3VwVHlwZS9SZWFkQnlUeXBlVmFsdWUgcmVxdWVzdCwgZm9yCi0gKiAgICAgICAgICAgICAgICAgIGRpc2NvdmVyaW5nIGFsbCBwcmltYXJ5IHNlcnZpY2VzIG9yIGRpc2NvdmVyIHByaW1hcnkgc2VydmljZQotICogICAgICAgICAgICAgICAgICBieSBVVUlEIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dHNfcHJvY2Vzc19wcmltYXJ5X3NlcnZpY2VfcmVxKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICB1aW50MTZfdCBzX2hkbCA9IDAsIGVfaGRsID0gMDsKLSAgVXVpZCB1dWlkID0gVXVpZDo6a0VtcHR5OwotCi0gIHVpbnQ4X3QgcmVhc29uID0KLSAgICAgIGdhdHRzX3ZhbGlkYXRlX3BhY2tldF9mb3JtYXQob3BfY29kZSwgbGVuLCBwX2RhdGEsICZ1dWlkLCBzX2hkbCwgZV9oZGwpOwotICBpZiAocmVhc29uICE9IEdBVFRfU1VDQ0VTUykgewotICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIHJlYXNvbiwgb3BfY29kZSwgc19oZGwsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAodXVpZCAhPSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX1BSSV9TRVJWSUNFKSkgewotICAgIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEUpIHsKLSAgICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIEdBVFRfVU5TVVBQT1JUX0dSUF9UWVBFLCBvcF9jb2RlLCBzX2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoInVuZXhwZWN0ZWQgUmVhZEJ5R3JwVHlwZSBHcm91cDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZC5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHdlIGRvIG5vdCBzdXBwb3J0IFJlYWRCeVR5cGVWYWx1ZSB3aXRoIGFueSBub24tcHJpbWFtcnlfc2VydmljZSB0eXBlCi0gICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgR0FUVF9OT1RfRk9VTkQsIG9wX2NvZGUsIHNfaGRsLCBmYWxzZSk7Ci0gICAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoInVuZXhwZWN0ZWQgUmVhZEJ5VHlwZVZhbHVlIHR5cGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVE9ETzogd2UgYXNzdW1lIHRoZWggdmFsdWUgaXMgVVVJRCwgdGhlcmUgaXMgbm8gc3VjaCByZXF1aXJlbWVudCBpbiBzcGVjCi0gIFV1aWQgdmFsdWUgPSBVdWlkOjprRW1wdHk7Ci0gIGlmIChvcF9jb2RlID09IEdBVFRfUkVRX0ZJTkRfVFlQRV9WQUxVRSkgewotICAgIGlmICghZ2F0dF9wYXJzZV91dWlkX2Zyb21fY21kKCZ2YWx1ZSwgbGVuLCAmcF9kYXRhKSkgewotICAgICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgR0FUVF9JTlZBTElEX1BEVSwgb3BfY29kZSwgc19oZGwsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICB1aW50MTZfdCBwYXlsb2FkX3NpemUgPSBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3R4KHRjYiwgY2lkKTsKLQotICB1aW50MTZfdCBtc2dfbGVuID0KLSAgICAgICh1aW50MTZfdCkoc2l6ZW9mKEJUX0hEUikgKyBwYXlsb2FkX3NpemUgKyBMMkNBUF9NSU5fT0ZGU0VUKTsKLSAgQlRfSERSKiBwX21zZyA9IChCVF9IRFIqKW9zaV9jYWxsb2MobXNnX2xlbik7Ci0gIHJlYXNvbiA9IGdhdHRfYnVpbGRfcHJpbWFyeV9zZXJ2aWNlX3JzcChwX21zZywgdGNiLCBjaWQsIG9wX2NvZGUsIHNfaGRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV9oZGwsIHBfZGF0YSwgdmFsdWUpOwotICBpZiAocmVhc29uICE9IEdBVFRfU1VDQ0VTUykgewotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCByZWFzb24sIG9wX2NvZGUsIHNfaGRsLCBmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXR0cF9zZW5kX3NyX21zZyh0Y2IsIGNpZCwgcF9tc2cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfcHJvY2Vzc19maW5kX2luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHByb2Nlc3MgZmluZCBpbmZvcm1hdGlvbiByZXF1ZXN0LCBmb3IgZGlzY292ZXIgY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXR0c19wcm9jZXNzX2ZpbmRfaW5mbyh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDE2X3Qgc19oZGwgPSAwLCBlX2hkbCA9IDA7Ci0gIHVpbnQ4X3QgcmVhc29uID0gcmVhZF9oYW5kbGVzKGxlbiwgcF9kYXRhLCBzX2hkbCwgZV9oZGwpOwotICBpZiAocmVhc29uICE9IEdBVFRfU1VDQ0VTUykgewotICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIHJlYXNvbiwgb3BfY29kZSwgc19oZGwsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCBwYXlsb2FkX3NpemUgPSBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3R4KHRjYiwgY2lkKTsKLSAgdWludDE2X3QgYnVmX2xlbiA9Ci0gICAgICAodWludDE2X3QpKHNpemVvZihCVF9IRFIpICsgcGF5bG9hZF9zaXplICsgTDJDQVBfTUlOX09GRlNFVCk7Ci0KLSAgQlRfSERSKiBwX21zZyA9IChCVF9IRFIqKW9zaV9jYWxsb2MoYnVmX2xlbik7Ci0gIHJlYXNvbiA9IEdBVFRfTk9UX0ZPVU5EOwotCi0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICAqcCsrID0gb3BfY29kZSArIDE7Ci0gIHBfbXNnLT5sZW4gPSAyOwotCi0gIGJ1Zl9sZW4gPSBwYXlsb2FkX3NpemUgLSAyOwotCi0gIGZvciAodEdBVFRfU1JWX0xJU1RfRUxFTSYgZWwgOiAqZ2F0dF9jYi5zcnZfbGlzdF9pbmZvKSB7Ci0gICAgaWYgKGVsLnNfaGRsIDw9IGVfaGRsICYmIGVsLmVfaGRsID49IHNfaGRsKSB7Ci0gICAgICByZWFzb24gPSBnYXR0X2J1aWxkX2ZpbmRfaW5mb19yc3AoZWwsIHBfbXNnLCBidWZfbGVuLCBzX2hkbCwgZV9oZGwpOwotICAgICAgaWYgKHJlYXNvbiA9PSBHQVRUX05PX1JFU09VUkNFUykgewotICAgICAgICByZWFzb24gPSBHQVRUX1NVQ0NFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gICpwID0gKHVpbnQ4X3QpcF9tc2ctPm9mZnNldDsKLQotICBwX21zZy0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLQotICBpZiAocmVhc29uICE9IEdBVFRfU1VDQ0VTUykgewotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCByZWFzb24sIG9wX2NvZGUsIHNfaGRsLCBmYWxzZSk7Ci0gIH0gZWxzZQotICAgIGF0dHBfc2VuZF9zcl9tc2codGNiLCBjaWQsIHBfbXNnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRzX3Byb2Nlc3NfbXR1X3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBleGNhaG5nZSBNVFUgcmVxdWVzdC4KLSAqICAgICAgICAgICAgICAgICAgT25seSB1c2VkIG9uIExFLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBnYXR0c19wcm9jZXNzX210dV9yZXEodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICAvKiBCUi9FRFIgY29uZW5jdGlvbiwgc2VuZCBlcnJvciByZXNwb25zZSAqLwotICBpZiAoY2lkICE9IEwyQ0FQX0FUVF9DSUQpIHsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBHQVRUX1JFUV9OT1RfU1VQUE9SVEVELCBHQVRUX1JFUV9NVFUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxlbiA8IEdBVFRfTVRVX1JFUV9NSU5fTEVOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCBNVFUgcmVxdWVzdCBQRFUgcmVjZWl2ZWQuIjsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBHQVRUX0lOVkFMSURfUERVLCBHQVRUX1JFUV9NVFUsIDAsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCBtdHUgPSAwOwotICB1aW50OF90KiBwID0gcF9kYXRhOwotICBTVFJFQU1fVE9fVUlOVDE2KG10dSwgcCk7Ci0gIC8qIG10dSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBkZWZhdWx0IE1UVSB3aGljaCBpcyAyMy80OCAqLwotICBpZiAobXR1IDwgR0FUVF9ERUZfQkxFX01UVV9TSVpFKQotICAgIHRjYi5wYXlsb2FkX3NpemUgPSBHQVRUX0RFRl9CTEVfTVRVX1NJWkU7Ci0gIGVsc2UgaWYgKG10dSA+IEdBVFRfTUFYX01UVV9TSVpFKQotICAgIHRjYi5wYXlsb2FkX3NpemUgPSBHQVRUX01BWF9NVFVfU0laRTsKLSAgZWxzZQotICAgIHRjYi5wYXlsb2FkX3NpemUgPSBtdHU7Ci0KLSAgTE9HKElORk8pIDw8ICJNVFUgcmVxdWVzdCBQRFUgd2l0aCBNVFUgc2l6ZSAiIDw8ICt0Y2IucGF5bG9hZF9zaXplOwotCi0gIEJUTV9TZXRCbGVEYXRhTGVuZ3RoKHRjYi5wZWVyX2JkYSwgdGNiLnBheWxvYWRfc2l6ZSArIEwyQ0FQX1BLVF9PVkVSSEVBRCk7Ci0KLSAgdEdBVFRfU1JfTVNHIGdhdHRfc3JfbXNnOwotICBnYXR0X3NyX21zZy5tdHUgPSB0Y2IucGF5bG9hZF9zaXplOwotICBCVF9IRFIqIHBfYnVmID0gYXR0cF9idWlsZF9zcl9tc2codGNiLCBHQVRUX1JTUF9NVFUsICZnYXR0X3NyX21zZyk7Ci0gIGF0dHBfc2VuZF9zcl9tc2codGNiLCBjaWQsIHBfYnVmKTsKLQotICB0R0FUVFNfREFUQSBnYXR0c19kYXRhOwotICBnYXR0c19kYXRhLm10dSA9IHRjYi5wYXlsb2FkX3NpemU7Ci0gIC8qIE5vdGlmeSBhbGwgcmVnaXN0ZXJlZCBhcHBsaWNhaXRvbiB3aXRoIG5ldyBNVFUgc2l6ZS4gVXMgYSB0cmFuc2FjdGlvbiBJRCAqLwotICAvKiBvZiAwLCBhcyBubyByZXNwb25zZSBpcyBhbGxvd2VkIGZyb20gYXBwbGNhdGlvbnMgICAgICAgICAgICAgICAgICAgICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgR0FUVF9NQVhfQVBQUzsgaSsrKSB7Ci0gICAgaWYgKGdhdHRfY2IuY2xfcmNiW2ldLmluX3VzZSkgewotICAgICAgdWludDE2X3QgY29ubl9pZCA9Ci0gICAgICAgICAgR0FUVF9DUkVBVEVfQ09OTl9JRCh0Y2IudGNiX2lkeCwgZ2F0dF9jYi5jbF9yY2JbaV0uZ2F0dF9pZik7Ci0gICAgICBnYXR0X3NyX3NlbmRfcmVxX2NhbGxiYWNrKGNvbm5faWQsIDAsIEdBVFRTX1JFUV9UWVBFX01UVSwgJmdhdHRzX2RhdGEpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfcHJvY2Vzc19yZWFkX2J5X3R5cGVfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBwcm9jZXNzIFJlYWQgQnkgdHlwZSByZXF1ZXN0LgotICogICAgICAgICAgICAgICAgICBUaGlzIFBEVSBjYW4gYmUgdXNlZCB0byBwZXJmb3JtOgotICogICAgICAgICAgICAgICAgICAtIHJlYWQgY2hhcmFjdGVyaXN0aWMgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgLSByZWFkIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3IgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgLSBkaXNjb3ZlciBjaGFyYWN0ZXJpc3RpYwotICogICAgICAgICAgICAgICAgICAtIGRpc2NvdmVyIGNoYXJhY3RlcmlzdGljIGJ5IFVVSUQKLSAqICAgICAgICAgICAgICAgICAgLSByZWxhdGlvbnNoaXAgZGlzY292ZXJ5Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdhdHRzX3Byb2Nlc3NfcmVhZF9ieV90eXBlX3JlcSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICBVdWlkIHV1aWQgPSBVdWlkOjprRW1wdHk7Ci0gIHVpbnQxNl90IHNfaGRsID0gMCwgZV9oZGwgPSAwLCBlcnJfaGRsID0gMDsKLSAgdEdBVFRfU1RBVFVTIHJlYXNvbiA9Ci0gICAgICBnYXR0c192YWxpZGF0ZV9wYWNrZXRfZm9ybWF0KG9wX2NvZGUsIGxlbiwgcF9kYXRhLCAmdXVpZCwgc19oZGwsIGVfaGRsKTsKLQotI2lmIChHQVRUX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRSkKLSAgaWYgKGdhdHRfY2IuZW5hYmxlX2Vycl9yc3AgJiYgZ2F0dF9jYi5yZXFfb3BfY29kZSA9PSBvcF9jb2RlKSB7Ci0gICAgVkxPRygxKSA8PCAiQ29uZm9ybWFuY2UgdHN0OiBmb3JjZWQgZXJyIHJzcCBmb3IgUmVhZEJ5VHlwZTogZXJyb3Igc3RhdHVzPSIKLSAgICAgICAgICAgIDw8ICtnYXR0X2NiLmVycl9zdGF0dXM7Ci0KLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBnYXR0X2NiLmVycl9zdGF0dXMsIGdhdHRfY2IucmVxX29wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzX2hkbCwgZmFsc2UpOwotCi0gICAgcmV0dXJuOwotICB9Ci0jZW5kaWYKLQotICBpZiAocmVhc29uICE9IEdBVFRfU1VDQ0VTUykgewotICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIHJlYXNvbiwgb3BfY29kZSwgc19oZGwsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCBwYXlsb2FkX3NpemUgPSBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3R4KHRjYiwgY2lkKTsKLQotICBzaXplX3QgbXNnX2xlbiA9IHNpemVvZihCVF9IRFIpICsgcGF5bG9hZF9zaXplICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgQlRfSERSKiBwX21zZyA9IChCVF9IRFIqKW9zaV9jYWxsb2MobXNnX2xlbik7Ci0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gICpwKysgPSBvcF9jb2RlICsgMTsKLSAgLyogcmVzZXJ2ZSBsZW5ndGggYnl0ZSAqLwotICBwX21zZy0+bGVuID0gMjsKLSAgdWludDE2X3QgYnVmX2xlbiA9IHBheWxvYWRfc2l6ZSAtIDI7Ci0KLSAgcmVhc29uID0gR0FUVF9OT1RfRk9VTkQ7Ci0gIGZvciAodEdBVFRfU1JWX0xJU1RfRUxFTSYgZWwgOiAqZ2F0dF9jYi5zcnZfbGlzdF9pbmZvKSB7Ci0gICAgaWYgKGVsLnNfaGRsIDw9IGVfaGRsICYmIGVsLmVfaGRsID49IHNfaGRsKSB7Ci0gICAgICB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZzsKLSAgICAgIHVpbnQ4X3Qga2V5X3NpemU7Ci0gICAgICBnYXR0X3NyX2dldF9zZWNfaW5mbyh0Y2IucGVlcl9iZGEsIHRjYi50cmFuc3BvcnQsICZzZWNfZmxhZywgJmtleV9zaXplKTsKLQotICAgICAgdEdBVFRfU1RBVFVTIHJldCA9IGdhdHRzX2RiX3JlYWRfYXR0cl92YWx1ZV9ieV90eXBlKAotICAgICAgICAgIHRjYiwgY2lkLCBlbC5wX2RiLCBvcF9jb2RlLCBwX21zZywgc19oZGwsIGVfaGRsLCB1dWlkLCAmYnVmX2xlbiwKLSAgICAgICAgICBzZWNfZmxhZywga2V5X3NpemUsIDAsICZlcnJfaGRsKTsKLSAgICAgIGlmIChyZXQgIT0gR0FUVF9OT1RfRk9VTkQpIHsKLSAgICAgICAgcmVhc29uID0gcmV0OwotICAgICAgICBpZiAocmV0ID09IEdBVFRfTk9fUkVTT1VSQ0VTKSByZWFzb24gPSBHQVRUX1NVQ0NFU1M7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXQgIT0gR0FUVF9TVUNDRVNTICYmIHJldCAhPSBHQVRUX05PVF9GT1VORCkgewotICAgICAgICBzX2hkbCA9IGVycl9oZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAqcCA9ICh1aW50OF90KXBfbXNnLT5vZmZzZXQ7Ci0gIHBfbXNnLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIGlmIChyZWFzb24gIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgb3NpX2ZyZWUocF9tc2cpOwotCi0gICAgLyogaW4gdGhlcm95IEJVU1kgaXMgbm90IHBvc3NpYmxlKHNob3VsZCBhbHJlYWR5IGJlZW4gY2hlY2tlZCksIHByb3RlY3RlZAotICAgICAqIGNoZWNrICovCi0gICAgaWYgKHJlYXNvbiAhPSBHQVRUX1BFTkRJTkcgJiYgcmVhc29uICE9IEdBVFRfQlVTWSkKLSAgICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIHJlYXNvbiwgb3BfY29kZSwgc19oZGwsIGZhbHNlKTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIGF0dHBfc2VuZF9zcl9tc2codGNiLCBjaWQsIHBfbXNnKTsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSB3cml0ZSByZXF1ZXN0IGZyb20gY2xpZW50LgotICovCi1zdGF0aWMgdm9pZCBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1JWX0xJU1RfRUxFTSYgZWwsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfZ2F0dF9kYl9hdHRyaWJ1dGVfdHlwZV90IGdhdHRfdHlwZSkgewotICB0R0FUVFNfREFUQSBzcl9kYXRhOwotICB1aW50MzJfdCB0cmFuc19pZDsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgdEdBVFRfU0VDX0ZMQUcgc2VjX2ZsYWc7Ci0gIHVpbnQ4X3Qga2V5X3NpemUsICpwID0gcF9kYXRhOwotICB1aW50MTZfdCBjb25uX2lkOwotCi0gIG1lbXNldCgmc3JfZGF0YSwgMCwgc2l6ZW9mKHRHQVRUU19EQVRBKSk7Ci0KLSAgc3dpdGNoIChvcF9jb2RlKSB7Ci0gICAgY2FzZSBHQVRUX1JFUV9QUkVQQVJFX1dSSVRFOgotICAgICAgaWYgKGxlbiA8IDIgfHwgcCA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBQcmVwYXJlIHdyaXRlIHJlcXVlc3Qgd2FzIGludmFsaWQgLSBtaXNzaW5nIG9mZnNldCwgIgotICAgICAgICAgICAgICAgICAgICAgICJzZW5kaW5nIGVycm9yIHJlc3BvbnNlIjsKLSAgICAgICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgR0FUVF9JTlZBTElEX1BEVSwgb3BfY29kZSwgaGFuZGxlLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHNyX2RhdGEud3JpdGVfcmVxLmlzX3ByZXAgPSB0cnVlOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihzcl9kYXRhLndyaXRlX3JlcS5vZmZzZXQsIHApOwotICAgICAgbGVuIC09IDI7Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdBVFRfU0lHTl9DTURfV1JJVEU6Ci0gICAgICBpZiAob3BfY29kZSA9PSBHQVRUX1NJR05fQ01EX1dSSVRFKSB7Ci0gICAgICAgIFZMT0coMSkgPDwgIldyaXRlIENNRCB3aXRoIGRhdGEgc2lnaW5pbmciOwotICAgICAgICBsZW4gLT0gR0FUVF9BVVRIX1NJR05fTEVOOwotICAgICAgfQotICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBHQVRUX0NNRF9XUklURToKLSAgICBjYXNlIEdBVFRfUkVRX1dSSVRFOgotICAgICAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SRVFfV1JJVEUgfHwgb3BfY29kZSA9PSBHQVRUX1JFUV9QUkVQQVJFX1dSSVRFKQotICAgICAgICBzcl9kYXRhLndyaXRlX3JlcS5uZWVkX3JzcCA9IHRydWU7Ci0gICAgICBzcl9kYXRhLndyaXRlX3JlcS5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICBpZiAobGVuID4gR0FUVF9NQVhfQVRUUl9MRU4pIGxlbiA9IEdBVFRfTUFYX0FUVFJfTEVOOwotICAgICAgc3JfZGF0YS53cml0ZV9yZXEubGVuID0gbGVuOwotICAgICAgaWYgKGxlbiAhPSAwICYmIHAgIT0gbnVsbHB0cikgewotICAgICAgICBtZW1jcHkoc3JfZGF0YS53cml0ZV9yZXEudmFsdWUsIHAsIGxlbik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGdhdHRfc3JfZ2V0X3NlY19pbmZvKHRjYi5wZWVyX2JkYSwgdGNiLnRyYW5zcG9ydCwgJnNlY19mbGFnLCAma2V5X3NpemUpOwotCi0gIHN0YXR1cyA9IGdhdHRzX3dyaXRlX2F0dHJfcGVybV9jaGVjayhlbC5wX2RiLCBvcF9jb2RlLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcl9kYXRhLndyaXRlX3JlcS5vZmZzZXQsIHAsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY19mbGFnLCBrZXlfc2l6ZSk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICB0cmFuc19pZCA9IGdhdHRfc3JfZW5xdWV1ZV9jbWQodGNiLCBjaWQsIG9wX2NvZGUsIGhhbmRsZSk7Ci0gICAgaWYgKHRyYW5zX2lkICE9IDApIHsKLSAgICAgIGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHRjYi50Y2JfaWR4LCBlbC5nYXR0X2lmKTsKLQotICAgICAgdWludDhfdCBvcGNvZGUgPSAwOwotICAgICAgaWYgKGdhdHRfdHlwZSA9PSBCVEdBVFRfREJfREVTQ1JJUFRPUikgewotICAgICAgICBvcGNvZGUgPSBHQVRUU19SRVFfVFlQRV9XUklURV9ERVNDUklQVE9SOwotICAgICAgfSBlbHNlIGlmIChnYXR0X3R5cGUgPT0gQlRHQVRUX0RCX0NIQVJBQ1RFUklTVElDKSB7Ci0gICAgICAgIG9wY29kZSA9IEdBVFRTX1JFUV9UWVBFX1dSSVRFX0NIQVJBQ1RFUklTVElDOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICIlczogQXR0ZW1wdCB0byB3cml0ZSBhdHRyaWJ1dGUgdGhhdCdzIG5vdCB0aWVkIHdpdGgiCi0gICAgICAgICAgICAgICAgICAgICAgIiBjaGFyYWN0ZXJpc3RpYyBvciBkZXNjcmlwdG9yIHZhbHVlLiI7Ci0gICAgICAgIHN0YXR1cyA9IEdBVFRfRVJST1I7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcGNvZGUpIHsKLSAgICAgICAgZ2F0dF9zcl9zZW5kX3JlcV9jYWxsYmFjayhjb25uX2lkLCB0cmFuc19pZCwgb3Bjb2RlLCAmc3JfZGF0YSk7Ci0gICAgICAgIHN0YXR1cyA9IEdBVFRfUEVORElORzsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTE9HKEVSUk9SKSA8PCAibWF4IHBlbmRpbmcgY29tbWFuZCwgc2VuZCBlcnJvciI7Ci0gICAgICBzdGF0dXMgPSBHQVRUX0JVU1k7IC8qIG1heCBwZW5kaW5nIGNvbW1hbmQsIGFwcGxpY2F0aW9uIGVycm9yICovCi0gICAgfQotICB9Ci0KLSAgLyogaW4gdGhlcm95IEJVU1kgaXMgbm90IHBvc3NpYmxlKHNob3VsZCBhbHJlYWR5IGJlZW4gY2hlY2tlZCksIHByb3RlY3RlZAotICAgKiBjaGVjayAqLwotICBpZiAoc3RhdHVzICE9IEdBVFRfUEVORElORyAmJiBzdGF0dXMgIT0gR0FUVF9CVVNZICYmCi0gICAgICAob3BfY29kZSA9PSBHQVRUX1JFUV9QUkVQQVJFX1dSSVRFIHx8IG9wX2NvZGUgPT0gR0FUVF9SRVFfV1JJVEUpKSB7Ci0gICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgc3RhdHVzLCBvcF9jb2RlLCBoYW5kbGUsIGZhbHNlKTsKLSAgfQotICByZXR1cm47Ci19Ci0KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgcmVhZCByZXF1ZXN0IGZyb20gY2xpZW50LgotICovCi1zdGF0aWMgdm9pZCBnYXR0c19wcm9jZXNzX3JlYWRfcmVxKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NSVl9MSVNUX0VMRU0mIGVsLCB1aW50OF90IG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpIHsKLSAgdWludDE2X3QgcGF5bG9hZF9zaXplID0gZ2F0dF90Y2JfZ2V0X3BheWxvYWRfc2l6ZV90eCh0Y2IsIGNpZCk7Ci0KLSAgc2l6ZV90IGJ1Zl9sZW4gPSBzaXplb2YoQlRfSERSKSArIHBheWxvYWRfc2l6ZSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHVpbnQxNl90IG9mZnNldCA9IDA7Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SRVFfUkVBRF9CTE9CICYmIGxlbiA8IHNpemVvZih1aW50MTZfdCkpIHsKLSAgICAvKiBFcnJvcjogcGFja2V0IGxlbmd0aCBpcyB0b28gc2hvcnQgKi8KLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IHBhY2tldCBsZW5ndGg9IiA8PCBsZW4KLSAgICAgICAgICAgICAgIDw8ICIgdG9vIHNob3J0LiBtaW49IiA8PCBzaXplb2YodWludDE2X3QpOwotICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKDB4NTM0ZTQ1NTQsICI3MzE3MjExNSIsIC0xLCBOVUxMLCAwKTsKLSAgICBnYXR0X3NlbmRfZXJyb3JfcnNwKHRjYiwgY2lkLCBHQVRUX0lOVkFMSURfUERVLCBvcF9jb2RlLCAwLCBmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRfSERSKiBwX21zZyA9IChCVF9IRFIqKW9zaV9jYWxsb2MoYnVmX2xlbik7Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9SRVFfUkVBRF9CTE9CKSBTVFJFQU1fVE9fVUlOVDE2KG9mZnNldCwgcF9kYXRhKTsKLQotICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKShwX21zZyArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgKnArKyA9IG9wX2NvZGUgKyAxOwotICBwX21zZy0+bGVuID0gMTsKLSAgYnVmX2xlbiA9IHBheWxvYWRfc2l6ZSAtIDE7Ci0KLSAgdEdBVFRfU0VDX0ZMQUcgc2VjX2ZsYWc7Ci0gIHVpbnQ4X3Qga2V5X3NpemU7Ci0gIGdhdHRfc3JfZ2V0X3NlY19pbmZvKHRjYi5wZWVyX2JkYSwgdGNiLnRyYW5zcG9ydCwgJnNlY19mbGFnLCAma2V5X3NpemUpOwotCi0gIHVpbnQxNl90IHZhbHVlX2xlbiA9IDA7Ci0gIHRHQVRUX1NUQVRVUyByZWFzb24gPSBnYXR0c19yZWFkX2F0dHJfdmFsdWVfYnlfaGFuZGxlKAotICAgICAgdGNiLCBjaWQsIGVsLnBfZGIsIG9wX2NvZGUsIGhhbmRsZSwgb2Zmc2V0LCBwLCAmdmFsdWVfbGVuLAotICAgICAgKHVpbnQxNl90KWJ1Zl9sZW4sIHNlY19mbGFnLCBrZXlfc2l6ZSwgMCk7Ci0gIHBfbXNnLT5sZW4gKz0gdmFsdWVfbGVuOwotCi0gIGlmIChyZWFzb24gIT0gR0FUVF9TVUNDRVNTKSB7Ci0gICAgb3NpX2ZyZWUocF9tc2cpOwotCi0gICAgLyogaW4gdGhlb3J5IEJVU1kgaXMgbm90IHBvc3NpYmxlKHNob3VsZCBhbHJlYWR5IGJlZW4gY2hlY2tlZCksIHByb3RlY3RlZAotICAgICAqIGNoZWNrICovCi0gICAgaWYgKHJlYXNvbiAhPSBHQVRUX1BFTkRJTkcgJiYgcmVhc29uICE9IEdBVFRfQlVTWSkKLSAgICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIHJlYXNvbiwgb3BfY29kZSwgaGFuZGxlLCBmYWxzZSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBhdHRwX3NlbmRfc3JfbXNnKHRjYiwgY2lkLCBwX21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0c19wcm9jZXNzX2F0dHJpYnV0ZV9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgdGhlIHBlciBhdHRyaWJ1dGUgaGFuZGxlCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgZnJvbSBjbGllbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dHNfcHJvY2Vzc19hdHRyaWJ1dGVfcmVxKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHVpbnQ4X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDhfdCogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDA7Ci0gIHVpbnQ4X3QqIHAgPSBwX2RhdGE7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBHQVRUX0lOVkFMSURfSEFORExFOwotCi0gIGlmIChsZW4gPCAyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiSWxsZWdhbCBQRFUgbGVuZ3RoLCBkaXNjYXJkIHJlcXVlc3QiOwotICAgIHN0YXR1cyA9IEdBVFRfSU5WQUxJRF9QRFU7Ci0gIH0gZWxzZSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICAgIGxlbiAtPSAyOwotICB9Ci0KLSNpZiAoR0FUVF9DT05GT1JNQU5DRV9URVNUSU5HID09IFRSVUUpCi0gIGdhdHRfY2IuaGFuZGxlID0gaGFuZGxlOwotICBpZiAoZ2F0dF9jYi5lbmFibGVfZXJyX3JzcCAmJiBnYXR0X2NiLnJlcV9vcF9jb2RlID09IG9wX2NvZGUpIHsKLSAgICBWTE9HKDEpIDw8ICJDb25mb3JtYW5jZSB0c3Q6IGZvcmNlZCBlcnIgcnNwOiBlcnJvciBzdGF0dXM9IgotICAgICAgICAgICAgPDwgK2dhdHRfY2IuZXJyX3N0YXR1czsKLQotICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIGdhdHRfY2IuZXJyX3N0YXR1cywgY2lkLCBnYXR0X2NiLnJlcV9vcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBmYWxzZSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChHQVRUX0hBTkRMRV9JU19WQUxJRChoYW5kbGUpKSB7Ci0gICAgZm9yIChhdXRvJiBlbCA6ICpnYXR0X2NiLnNydl9saXN0X2luZm8pIHsKLSAgICAgIGlmIChlbC5zX2hkbCA8PSBoYW5kbGUgJiYgZWwuZV9oZGwgPj0gaGFuZGxlKSB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgYXR0ciA6IGVsLnBfZGItPmF0dHJfbGlzdCkgewotICAgICAgICAgIGlmIChhdHRyLmhhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAob3BfY29kZSkgewotICAgICAgICAgICAgICBjYXNlIEdBVFRfUkVRX1JFQUQ6IC8qIHJlYWQgY2hhci9jaGFyIGRlc2NyaXB0b3IgdmFsdWUgKi8KLSAgICAgICAgICAgICAgY2FzZSBHQVRUX1JFUV9SRUFEX0JMT0I6Ci0gICAgICAgICAgICAgICAgZ2F0dHNfcHJvY2Vzc19yZWFkX3JlcSh0Y2IsIGNpZCwgZWwsIG9wX2NvZGUsIGhhbmRsZSwgbGVuLCBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIEdBVFRfUkVRX1dSSVRFOiAvKiB3cml0ZSBjaGFyL2NoYXIgZGVzY3JpcHRvciB2YWx1ZSAqLwotICAgICAgICAgICAgICBjYXNlIEdBVFRfQ01EX1dSSVRFOgotICAgICAgICAgICAgICBjYXNlIEdBVFRfU0lHTl9DTURfV1JJVEU6Ci0gICAgICAgICAgICAgIGNhc2UgR0FUVF9SRVFfUFJFUEFSRV9XUklURToKLSAgICAgICAgICAgICAgICBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcSh0Y2IsIGNpZCwgZWwsIGhhbmRsZSwgb3BfY29kZSwgbGVuLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2F0dF90eXBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IEdBVFRfU1VDQ0VTUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoc3RhdHVzICE9IEdBVFRfU1VDQ0VTUyAmJiBvcF9jb2RlICE9IEdBVFRfQ01EX1dSSVRFICYmCi0gICAgICBvcF9jb2RlICE9IEdBVFRfU0lHTl9DTURfV1JJVEUpCi0gICAgZ2F0dF9zZW5kX2Vycm9yX3JzcCh0Y2IsIGNpZCwgc3RhdHVzLCBvcF9jb2RlLCBoYW5kbGUsIGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRzX3Byb2Nfc3J2X2NoZ19pbmRfYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIHNlcnZpY2UgY2hhbmdlZCBpbmRpY2FpdG9uIEFDSwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRzX3Byb2Nfc3J2X2NoZ19pbmRfYWNrKHRHQVRUX1RDQiB0Y2IpIHsKLSAgdEdBVFRTX1NSVl9DSEdfUkVRIHJlcTsKLSAgdEdBVFRTX1NSVl9DSEcqIHBfYnVmID0gTlVMTDsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIHBfYnVmID0gZ2F0dF9pc19iZGFfaW5fdGhlX3Nydl9jaGdfY2x0X2xpc3QodGNiLnBlZXJfYmRhKTsKLSAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICBWTE9HKDEpIDw8ICJOViB1cGRhdGUgc2V0IHNydiBjaGcgPSBmYWxzZSI7Ci0gICAgcF9idWYtPnNydl9jaGFuZ2VkID0gZmFsc2U7Ci0gICAgbWVtY3B5KCZyZXEuc3J2X2NoZywgcF9idWYsIHNpemVvZih0R0FUVFNfU1JWX0NIRykpOwotICAgIGlmIChnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKQotICAgICAgKCpnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKShHQVRUU19TUlZfQ0hHX0NNRF9VUERBVEVfQ0xJRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfY2hrX3BlbmRpbmdfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrIGFueSBwZW5kaW5nIGluZGljYXRpb24gbmVlZHMgdG8gYmUgc2VudAotICogICAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgaW5kaWNhdGlvbiB0aGVuIHNlbnQgdGhlIGluZGljYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZ2F0dHNfY2hrX3BlbmRpbmdfaW5kKHRHQVRUX1RDQiYgdGNiKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgdEdBVFRfVkFMVUUqIHBfYnVmID0KLSAgICAgICh0R0FUVF9WQUxVRSopZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QodGNiLnBlbmRpbmdfaW5kX3EpOwotICBpZiAocF9idWYgIT0gTlVMTCkgewotICAgIEdBVFRTX0hhbmRsZVZhbHVlSW5kaWNhdGlvbihwX2J1Zi0+Y29ubl9pZCwgcF9idWYtPmhhbmRsZSwgcF9idWYtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPnZhbHVlKTsKLSAgICBvc2lfZnJlZShmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUodGNiLnBlbmRpbmdfaW5kX3EsIHBfYnVmKSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRzX3Byb2NfaW5kX2FjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIEluZGljYXRpb24gYWNrCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGNvbnRpbnVlIHRvIHByb2Nlc3MgdGhlIGluZGljYXRpb24gYWNrIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpZiB0aGUgQUNLIGlzIG5vdCBhIFNlcnZpY2UgQ2hhbmdlZCBJbmRpY2F0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGdhdHRzX3Byb2NfaW5kX2Fjayh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgYWNrX2hhbmRsZSkgewotICBib29sIGNvbnRpbnVlX3Byb2Nlc3NpbmcgPSB0cnVlOwotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBhY2sgaGFuZGxlPSVkIiA8PCBhY2tfaGFuZGxlOwotCi0gIGlmIChhY2tfaGFuZGxlID09IGdhdHRfY2IuaGFuZGxlX29mX2hfcikgewotICAgIGdhdHRzX3Byb2Nfc3J2X2NoZ19pbmRfYWNrKHRjYik7Ci0gICAgLyogdGhlcmUgaXMgbm8gbmVlZCB0byBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHNpbmNlIHNydiBjaGcgaXMgaGFuZGxlZAotICAgICAqIGludGVybmFsbHkgYnkgR0FUVCAqLwotICAgIGNvbnRpbnVlX3Byb2Nlc3NpbmcgPSBmYWxzZTsKLQotICAgIC8vIEFmdGVyIHJlY2VpdmluZyBhY2sgb2Ygc3ZjX2NoZ19pbmQsIHJlc2V0IGNsaWVudCBzdGF0dXMKLSAgICBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXModGNiLCAvKiBjaGdfYXdhcmU9ICovIHRydWUpOwotICB9Ci0KLSAgZ2F0dHNfY2hrX3BlbmRpbmdfaW5kKHRjYik7Ci0gIHJldHVybiBjb250aW51ZV9wcm9jZXNzaW5nOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dHNfcHJvY2Vzc192YWx1ZV9jb25mCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBoYW5kbGUgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRzX3Byb2Nlc3NfdmFsdWVfY29uZih0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCB1aW50OF90IG9wX2NvZGUpIHsKLSAgdWludDE2X3QgaGFuZGxlOwotCi0gIGlmICghZ2F0dF90Y2JfZmluZF9pbmRpY2F0ZV9oYW5kbGUodGNiLCBjaWQsICZoYW5kbGUpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAidW5leHBlY3RlZCBoYW5kbGUgdmFsdWUgY29uZmlybWF0aW9uIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBnYXR0X3N0b3BfY29uZl90aW1lcih0Y2IsIGNpZCk7Ci0KLSAgYm9vbCBjb250aW51ZV9wcm9jZXNzaW5nID0gZ2F0dHNfcHJvY19pbmRfYWNrKHRjYiwgaGFuZGxlKTsKLQotICBpZiAoY29udGludWVfcHJvY2Vzc2luZykgewotICAgIHRHQVRUU19EQVRBIGdhdHRzX2RhdGE7Ci0gICAgZ2F0dHNfZGF0YS5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgZm9yIChhdXRvJiBlbCA6ICpnYXR0X2NiLnNydl9saXN0X2luZm8pIHsKLSAgICAgIGlmIChlbC5zX2hkbCA8PSBoYW5kbGUgJiYgZWwuZV9oZGwgPj0gaGFuZGxlKSB7Ci0gICAgICAgIHVpbnQzMl90IHRyYW5zX2lkID0gZ2F0dF9zcl9lbnF1ZXVlX2NtZCh0Y2IsIGNpZCwgb3BfY29kZSwgaGFuZGxlKTsKLSAgICAgICAgdWludDE2X3QgY29ubl9pZCA9IEdBVFRfQ1JFQVRFX0NPTk5fSUQodGNiLnRjYl9pZHgsIGVsLmdhdHRfaWYpOwotICAgICAgICBnYXR0X3NyX3NlbmRfcmVxX2NhbGxiYWNrKGNvbm5faWQsIHRyYW5zX2lkLCBHQVRUU19SRVFfVFlQRV9DT05GLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYXR0c19kYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYyh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIGlmIChnYXR0X3NyX2lzX2NsX2NoYW5nZV9hd2FyZSh0Y2IpKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gZGVmYXVsdCB2YWx1ZQotICBib29sIHNob3VsZF9pZ25vcmUgPSB0cnVlOwotICBib29sIHNob3VsZF9yc3AgPSB0cnVlOwotCi0gIHN3aXRjaCAob3BfY29kZSkgewotICAgIGNhc2UgR0FUVF9SRVFfUkVBRF9CWV9UWVBFOiB7Ci0gICAgICAvLyBDaGVjayBpZiByZWFkIGRhdGFiYXNlIGhhc2ggYnkgVVVJRAotICAgICAgVXVpZCB1dWlkID0gVXVpZDo6a0VtcHR5OwotICAgICAgdWludDE2X3Qgc19oZGwgPSAwLCBlX2hkbCA9IDA7Ci0gICAgICB1aW50MTZfdCBkYl9oYXNoX2hhbmRsZSA9IGdhdHRfY2IuaGFuZGxlX29mX2RhdGFiYXNlX2hhc2g7Ci0gICAgICB0R0FUVF9TVEFUVVMgcmVhc29uID0gZ2F0dHNfdmFsaWRhdGVfcGFja2V0X2Zvcm1hdChvcF9jb2RlLCBsZW4sIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLCBzX2hkbCwgZV9oZGwpOwotICAgICAgaWYgKHJlYXNvbiA9PSBHQVRUX1NVQ0NFU1MgJiYKLSAgICAgICAgICAoc19oZGwgPD0gZGJfaGFzaF9oYW5kbGUgJiYgZGJfaGFzaF9oYW5kbGUgPD0gZV9oZGwpICYmCi0gICAgICAgICAgKHV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9EQVRBQkFTRV9IQVNIKSkpCi0gICAgICAgIHNob3VsZF9pZ25vcmUgPSBmYWxzZTsKLQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBHQVRUX1JFUV9SRUFEOiB7Ci0gICAgICAvLyBDaGVjayBpZiByZWFkIGRhdGFiYXNlIGhhc2ggYnkgaGFuZGxlCi0gICAgICB1aW50MTZfdCBoYW5kbGUgPSAwOwotICAgICAgdWludDhfdCogcCA9IHBfZGF0YTsKLSAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBHQVRUX1NVQ0NFU1M7Ci0KLSAgICAgIGlmIChsZW4gPCAyKSB7Ci0gICAgICAgIHN0YXR1cyA9IEdBVFRfSU5WQUxJRF9QRFU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gICAgICAgIGxlbiAtPSAyOwotICAgICAgfQotCi0gICAgICBpZiAoc3RhdHVzID09IEdBVFRfU1VDQ0VTUyAmJiBoYW5kbGUgPT0gZ2F0dF9jYi5oYW5kbGVfb2ZfZGF0YWJhc2VfaGFzaCkKLSAgICAgICAgc2hvdWxkX2lnbm9yZSA9IGZhbHNlOwotCi0gICAgfSBicmVhazsKLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEU6IC8qIGRpc2NvdmVyIHByaW1hcnkgc2VydmljZXMgKi8KLSAgICBjYXNlIEdBVFRfUkVRX0ZJTkRfVFlQRV9WQUxVRTogIC8qIGRpc2NvdmVyIHNlcnZpY2UgYnkgVVVJRCAqLwotICAgIGNhc2UgR0FUVF9SRVFfRklORF9JTkZPOiAgICAgICAgLyogZGlzY292ZXIgY2hhciBkZXNjcnB0b3IgKi8KLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfQkxPQjogICAgICAgIC8qIHJlYWQgbG9uZyBjaGFyICovCi0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX01VTFRJOiAgICAgICAvKiByZWFkIG11bHRpIGNoYXIqLwotICAgIGNhc2UgR0FUVF9SRVFfV1JJVEU6ICAgICAgICAgICAgLyogd3JpdGUgY2hhci9jaGFyIGRlc2NyaXB0b3IgdmFsdWUgKi8KLSAgICBjYXNlIEdBVFRfUkVRX1BSRVBBUkVfV1JJVEU6ICAgIC8qIHdyaXRlIGxvbmcgY2hhciAqLwotICAgICAgLy8gVXNlIGRlZmF1bHQgdmFsdWUKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR0FUVF9DTURfV1JJVEU6ICAgICAgLyogY21kICovCi0gICAgY2FzZSBHQVRUX1NJR05fQ01EX1dSSVRFOiAvKiBzaWduIGNtZCAqLwotICAgICAgc2hvdWxkX3JzcCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHQVRUX1JFUV9NVFU6ICAgICAgICAgICAvKiBjb25maWd1cmUgbXR1ICovCi0gICAgY2FzZSBHQVRUX1JFUV9FWEVDX1dSSVRFOiAgICAvKiBleGVjdXRlIHdyaXRlICovCi0gICAgY2FzZSBHQVRUX0hBTkRMRV9WQUxVRV9DT05GOiAvKiBjb25maXJtIGZvciBpbmRpY2F0aW9uICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHNob3VsZF9pZ25vcmUgPSBmYWxzZTsKLSAgfQotCi0gIGlmIChzaG91bGRfaWdub3JlKSB7Ci0gICAgaWYgKHNob3VsZF9yc3ApIHsKLSAgICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIEdBVFRfREFUQUJBU0VfT1VUX09GX1NZTkMsIG9wX2NvZGUsIDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogZGF0YWJhc2Ugb3V0IG9mIHN5bmMsIGRldmljZT0iIDw8IHRjYi5wZWVyX2JkYQotICAgICAgICAgICAgICA8PCAiLCBvcF9jb2RlPSIgPDwgbG9naGV4KCh1aW50MTZfdClvcF9jb2RlKQotICAgICAgICAgICAgICA8PCAiLCBzaG91bGRfcnNwPSIgPDwgc2hvdWxkX3JzcDsKLSAgICBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXModGNiLCAvKiBjaGdfYXdhcmU9ICovIHNob3VsZF9yc3ApOwotICB9Ci0KLSAgcmV0dXJuIHNob3VsZF9pZ25vcmU7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlIGNsaWVudCByZXF1ZXN0cyB0byBzZXJ2ZXIgKi8KLXZvaWQgZ2F0dF9zZXJ2ZXJfaGFuZGxlX2NsaWVudF9yZXEodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICAvKiB0aGVyZSBpcyBwZW5kaW5nIGNvbW1hbmQsIGRpc2NhcmQgdGhpcyBvbmUgKi8KLSAgaWYgKCFnYXR0X3NyX2NtZF9lbXB0eSh0Y2IsIGNpZCkgJiYgb3BfY29kZSAhPSBHQVRUX0hBTkRMRV9WQUxVRV9DT05GKSByZXR1cm47Ci0KLSAgLyogdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgbWF5IG5vdCBiZSBiaWdnZXIgdGhhbiB0aGUgbG9jYWwgbWF4IFBEVSBzaXplKi8KLSAgLyogVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiB0aGUgYWdyZWVkIE1UVSwgbGVuIGRvZXMgbm90IGluY2x1ZGUgb3AKLSAgICogY29kZSAqLwotCi0gIHVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfcngodGNiLCBjaWQpOwotICBpZiAobGVuID49IHBheWxvYWRfc2l6ZSkgewotICAgIExPRyhFUlJPUikgPDwgU3RyaW5nUHJpbnRmKCJzZXJ2ZXIgcmVjZWl2ZSBpbnZhbGlkIFBEVSBzaXplOiVkIHBkdSBzaXplOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyAxLCBwYXlsb2FkX3NpemUpOwotICAgIC8qIGZvciBpbnZhbGlkIHJlcXVlc3QgZXhwZWN0aW5nIHJlc3BvbnNlLCBzZW5kIGl0IG5vdyAqLwotICAgIGlmIChvcF9jb2RlICE9IEdBVFRfQ01EX1dSSVRFICYmIG9wX2NvZGUgIT0gR0FUVF9TSUdOX0NNRF9XUklURSAmJgotICAgICAgICBvcF9jb2RlICE9IEdBVFRfSEFORExFX1ZBTFVFX0NPTkYpIHsKLSAgICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AodGNiLCBjaWQsIEdBVFRfSU5WQUxJRF9QRFUsIG9wX2NvZGUsIDAsIGZhbHNlKTsKLSAgICB9Ci0gICAgLyogb3RoZXJ3aXNlLCBpZ25vcmUgdGhlIHBrdCAqLwotICB9IGVsc2UgewotICAgIC8vIGhhbmRsZSBkYXRhYmFzZSBvdXQgb2Ygc3luYwotICAgIGlmIChnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKHRjYiwgY2lkLCBvcF9jb2RlLCBsZW4sIHBfZGF0YSkpIHJldHVybjsKLQotICAgIHN3aXRjaCAob3BfY29kZSkgewotICAgICAgY2FzZSBHQVRUX1JFUV9SRUFEX0JZX0dSUF9UWVBFOiAvKiBkaXNjb3ZlciBwcmltYXJ5IHNlcnZpY2VzICovCi0gICAgICBjYXNlIEdBVFRfUkVRX0ZJTkRfVFlQRV9WQUxVRTogIC8qIGRpc2NvdmVyIHNlcnZpY2UgYnkgVVVJRCAqLwotICAgICAgICBnYXR0c19wcm9jZXNzX3ByaW1hcnlfc2VydmljZV9yZXEodGNiLCBjaWQsIG9wX2NvZGUsIGxlbiwgcF9kYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9SRVFfRklORF9JTkZPOiAvKiBkaXNjb3ZlciBjaGFyIGRlc2NycHRvciAqLwotICAgICAgICBnYXR0c19wcm9jZXNzX2ZpbmRfaW5mbyh0Y2IsIGNpZCwgb3BfY29kZSwgbGVuLCBwX2RhdGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHQVRUX1JFUV9SRUFEX0JZX1RZUEU6IC8qIHJlYWQgY2hhcmFjdGVyaXN0aWMgdmFsdWUsIGNoYXIgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICovCi0gICAgICAgIC8qIGRpc2NvdmVyIGNoYXJhY3RlcmlzdGljLCBkaXNjb3ZlciBjaGFyIGJ5IFVVSUQgKi8KLSAgICAgICAgZ2F0dHNfcHJvY2Vzc19yZWFkX2J5X3R5cGVfcmVxKHRjYiwgY2lkLCBvcF9jb2RlLCBsZW4sIHBfZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdBVFRfUkVRX1JFQUQ6IC8qIHJlYWQgY2hhci9jaGFyIGRlc2NyaXB0b3IgdmFsdWUgKi8KLSAgICAgIGNhc2UgR0FUVF9SRVFfUkVBRF9CTE9COgotICAgICAgY2FzZSBHQVRUX1JFUV9XUklURTogLyogd3JpdGUgY2hhci9jaGFyIGRlc2NyaXB0b3IgdmFsdWUgKi8KLSAgICAgIGNhc2UgR0FUVF9DTURfV1JJVEU6Ci0gICAgICBjYXNlIEdBVFRfU0lHTl9DTURfV1JJVEU6Ci0gICAgICBjYXNlIEdBVFRfUkVRX1BSRVBBUkVfV1JJVEU6Ci0gICAgICAgIGdhdHRzX3Byb2Nlc3NfYXR0cmlidXRlX3JlcSh0Y2IsIGNpZCwgb3BfY29kZSwgbGVuLCBwX2RhdGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHQVRUX0hBTkRMRV9WQUxVRV9DT05GOgotICAgICAgICBnYXR0c19wcm9jZXNzX3ZhbHVlX2NvbmYodGNiLCBjaWQsIG9wX2NvZGUpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHQVRUX1JFUV9NVFU6Ci0gICAgICAgIGdhdHRzX3Byb2Nlc3NfbXR1X3JlcSh0Y2IsIGNpZCwgbGVuLCBwX2RhdGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBHQVRUX1JFUV9FWEVDX1dSSVRFOgotICAgICAgICBnYXR0X3Byb2Nlc3NfZXhlY193cml0ZV9yZXEodGNiLCBjaWQsIG9wX2NvZGUsIGxlbiwgcF9kYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9SRVFfUkVBRF9NVUxUSToKLSAgICAgIGNhc2UgR0FUVF9SRVFfUkVBRF9NVUxUSV9WQVI6Ci0gICAgICAgIGdhdHRfcHJvY2Vzc19yZWFkX211bHRpX3JlcSh0Y2IsIGNpZCwgb3BfY29kZSwgbGVuLCBwX2RhdGEpOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zdGFjay9nYXR0L2dhdHRfc3JfaGFzaC5jYyBiL3N0YWNrL2dhdHQvZ2F0dF9zcl9oYXNoLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RmMGM1Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2dhdHQvZ2F0dF9zcl9oYXNoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgImdhdHRfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLXN0YXRpYyBzaXplX3QgY2FsY3VsYXRlX2RhdGFiYXNlX2luZm9fc2l6ZShzdGQ6Omxpc3Q8dEdBVFRfU1JWX0xJU1RfRUxFTT4qIGxzdF9wdHIpIHsKLSAgc2l6ZV90IGxlbiA9IDA7Ci0gIGF1dG8gc3J2X2l0ID0gbHN0X3B0ci0+YmVnaW4oKTsKLSAgZm9yICg7IHNydl9pdCAhPSBsc3RfcHRyLT5lbmQoKTsgc3J2X2l0KyspIHsKLSAgICBhdXRvIGF0dHJfbGlzdCA9ICZzcnZfaXQtPnBfZGItPmF0dHJfbGlzdDsKLSAgICBhdXRvIGF0dHJfaXQgPSBhdHRyX2xpc3QtPmJlZ2luKCk7Ci0gICAgZm9yICg7IGF0dHJfaXQgIT0gYXR0cl9saXN0LT5lbmQoKTsgYXR0cl9pdCsrKSB7Ci0gICAgICBpZiAoYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX1BSSV9TRVJWSUNFKSB8fAotICAgICAgICAgIGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9TRUNfU0VSVklDRSkpIHsKLSAgICAgICAgLy8gU2VydmljZSBkZWNsYXJhdGlvbiAoSGFuZGxlICsgVHlwZSArIFZhbHVlKQotICAgICAgICBsZW4gKz0gNCArIGdhdHRfYnVpbGRfdXVpZF90b19zdHJlYW1fbGVuKGF0dHJfaXQtPnBfdmFsdWUtPnV1aWQpOwotICAgICAgfSBlbHNlIGlmIChhdHRyX2l0LT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfSU5DTFVERV9TRVJWSUNFKSl7Ci0gICAgICAgIC8vIEluY2x1ZGVkIHNlcnZpY2UgZGVjbGFyYXRpb24gKEhhbmRsZSArIFR5cGUgKyBWYWx1ZSkKLSAgICAgICAgbGVuICs9IDggKyBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtX2xlbihhdHRyX2l0LT5wX3ZhbHVlLT5pbmNsX2hhbmRsZS5zZXJ2aWNlX3R5cGUpOwotICAgICAgfSBlbHNlIGlmIChhdHRyX2l0LT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9ERUNMQVJFKSkgewotICAgICAgICAvLyBDaGFyYWN0ZXJpc3RpYyBkZWNsYXJhdGlvbiAoSGFuZGxlICsgVHlwZSArIFZhbHVlKQotICAgICAgICBsZW4gKz0gNyArIGdhdHRfYnVpbGRfdXVpZF90b19zdHJlYW1fbGVuKCgrK2F0dHJfaXQpLT51dWlkKTsKLSAgICAgIH0gZWxzZSBpZiAoYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfREVTQ1JJUFRJT04pIHx8Ci0gICAgICAgICAgICAgICAgIGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpIHx8Ci0gICAgICAgICAgICAgICAgIGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX1NSVlJfQ09ORklHKSB8fAotICAgICAgICAgICAgICAgICBhdHRyX2l0LT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9QUkVTRU5UX0ZPUk1BVCkgfHwKLSAgICAgICAgICAgICAgICAgYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQUdHX0ZPUk1BVCkpIHsKLSAgICAgICAgLy8gRGVzY3JpcHRvciAoSGFuZGxlICsgVHlwZSkKLSAgICAgICAgbGVuICs9IDQ7Ci0gICAgICB9IGVsc2UgaWYgKGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0VYVF9QUk9QKSkgewotICAgICAgICAvLyBEZXNjcmlwdG9yIGZvciBleHQgcHJvcGVydHkgKEhhbmRsZSArIFR5cGUgKyBWYWx1ZSkKLSAgICAgICAgbGVuICs9IDY7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbGxfZGF0YWJhc2VfaW5mbyhzdGQ6Omxpc3Q8dEdBVFRfU1JWX0xJU1RfRUxFTT4qIGxzdF9wdHIsIHVpbnQ4X3QqIHBfZGF0YSkgewotICBhdXRvIHNydl9pdCA9IGxzdF9wdHItPmJlZ2luKCk7Ci0gIGZvciAoOyBzcnZfaXQgIT0gbHN0X3B0ci0+ZW5kKCk7IHNydl9pdCsrKSB7Ci0gICAgYXV0byBhdHRyX2xpc3QgPSAmc3J2X2l0LT5wX2RiLT5hdHRyX2xpc3Q7Ci0gICAgYXV0byBhdHRyX2l0ID0gYXR0cl9saXN0LT5iZWdpbigpOwotICAgIGZvciAoOyBhdHRyX2l0ICE9IGF0dHJfbGlzdC0+ZW5kKCk7IGF0dHJfaXQrKykgewotICAgICAgaWYgKGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9QUklfU0VSVklDRSkgfHwKLSAgICAgICAgICBhdHRyX2l0LT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfU0VDX1NFUlZJQ0UpKSB7Ci0gICAgICAgIC8vIFNlcnZpY2UgZGVjbGFyYXRpb24KLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwX2RhdGEsIGF0dHJfaXQtPmhhbmRsZSk7Ci0KLSAgICAgICAgaWYgKHNydl9pdC0+aXNfcHJpbWFyeSkgewotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBHQVRUX1VVSURfUFJJX1NFUlZJQ0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBHQVRUX1VVSURfU0VDX1NFUlZJQ0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2F0dF9idWlsZF91dWlkX3RvX3N0cmVhbSgmcF9kYXRhLCBhdHRyX2l0LT5wX3ZhbHVlLT51dWlkKTsKLSAgICAgIH0gZWxzZSBpZiAoYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0lOQ0xVREVfU0VSVklDRSkpewotICAgICAgICAvLyBJbmNsdWRlZCBzZXJ2aWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBhdHRyX2l0LT5oYW5kbGUpOwotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHBfZGF0YSwgR0FUVF9VVUlEX0lOQ0xVREVfU0VSVklDRSk7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBhdHRyX2l0LT5wX3ZhbHVlLT5pbmNsX2hhbmRsZS5zX2hhbmRsZSk7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBhdHRyX2l0LT5wX3ZhbHVlLT5pbmNsX2hhbmRsZS5lX2hhbmRsZSk7Ci0KLSAgICAgICAgZ2F0dF9idWlsZF91dWlkX3RvX3N0cmVhbSgmcF9kYXRhLCBhdHRyX2l0LT5wX3ZhbHVlLT5pbmNsX2hhbmRsZS5zZXJ2aWNlX3R5cGUpOwotICAgICAgfSBlbHNlIGlmIChhdHRyX2l0LT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9ERUNMQVJFKSkgewotICAgICAgICAvLyBDaGFyYWN0ZXJpc3RpYyBkZWNsYXJhdGlvbgotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHBfZGF0YSwgYXR0cl9pdC0+aGFuZGxlKTsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwX2RhdGEsIEdBVFRfVVVJRF9DSEFSX0RFQ0xBUkUpOwotICAgICAgICBVSU5UOF9UT19TVFJFQU0ocF9kYXRhLCBhdHRyX2l0LT5wX3ZhbHVlLT5jaGFyX2RlY2wucHJvcGVydHkpOwotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHBfZGF0YSwgYXR0cl9pdC0+cF92YWx1ZS0+Y2hhcl9kZWNsLmNoYXJfdmFsX2hhbmRsZSk7Ci0KLSAgICAgICAgLy8gSW5jcmVtZW50IDEgdG8gZmV0Y2ggY2hhcmFjdGVyaXN0aWMgdXVpZCBmcm9tIHZhbHVlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZQotICAgICAgICBnYXR0X2J1aWxkX3V1aWRfdG9fc3RyZWFtKCZwX2RhdGEsICgrK2F0dHJfaXQpLT51dWlkKTsKLSAgICAgIH0gZWxzZSBpZiAoYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfREVTQ1JJUFRJT04pIHx8Ci0gICAgICAgICAgICAgICAgIGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX0NMSUVOVF9DT05GSUcpIHx8Ci0gICAgICAgICAgICAgICAgIGF0dHJfaXQtPnV1aWQgPT0gVXVpZDo6RnJvbTE2Qml0KEdBVFRfVVVJRF9DSEFSX1NSVlJfQ09ORklHKSB8fAotICAgICAgICAgICAgICAgICBhdHRyX2l0LT51dWlkID09IFV1aWQ6OkZyb20xNkJpdChHQVRUX1VVSURfQ0hBUl9QUkVTRU5UX0ZPUk1BVCkgfHwKLSAgICAgICAgICAgICAgICAgYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfQUdHX0ZPUk1BVCkpIHsKLSAgICAgICAgLy8gRGVzY3JpcHRvcgotICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHBfZGF0YSwgYXR0cl9pdC0+aGFuZGxlKTsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwX2RhdGEsIGF0dHJfaXQtPnV1aWQuQXMxNkJpdCgpKTsKLSAgICAgIH0gZWxzZSBpZiAoYXR0cl9pdC0+dXVpZCA9PSBVdWlkOjpGcm9tMTZCaXQoR0FUVF9VVUlEX0NIQVJfRVhUX1BST1ApKSB7Ci0gICAgICAgIC8vIERlc2NyaXB0b3IKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwX2RhdGEsIGF0dHJfaXQtPmhhbmRsZSk7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBhdHRyX2l0LT51dWlkLkFzMTZCaXQoKSk7Ci0gICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocF9kYXRhLCBhdHRyX2l0LT5wX3ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdHRyX2l0LT5wX3ZhbHVlLT5jaGFyX2V4dF9wcm9wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDAwMDApOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1PY3RldDE2IGdhdHRzX2NhbGN1bGF0ZV9kYXRhYmFzZV9oYXNoKHN0ZDo6bGlzdDx0R0FUVF9TUlZfTElTVF9FTEVNPiogbHN0X3B0cikgewotICBpbnQgbGVuID0gY2FsY3VsYXRlX2RhdGFiYXNlX2luZm9fc2l6ZShsc3RfcHRyKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXJpYWxpemVkKGxlbik7Ci0gIGZpbGxfZGF0YWJhc2VfaW5mbyhsc3RfcHRyLCBzZXJpYWxpemVkLmRhdGEoKSk7Ci0KLSAgc3RkOjpyZXZlcnNlKHNlcmlhbGl6ZWQuYmVnaW4oKSwgc2VyaWFsaXplZC5lbmQoKSk7Ci0gIE9jdGV0MTYgZGJfaGFzaCA9IGNyeXB0b190b29sYm94OjphZXNfY21hYyhPY3RldDE2ezB9LCBzZXJpYWxpemVkLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnNpemUoKSk7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYXNoPSIKLSAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKGRiX2hhc2guZGF0YSgpLCBkYl9oYXNoLnNpemUoKSk7Ci0KLSAgcmV0dXJuIGRiX2hhc2g7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9nYXR0L2dhdHRfdXRpbHMuY2MgYi9zdGFjay9nYXR0L2dhdHRfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGIyNzcuLjAwMDAwMDAKLS0tIGEvc3RhY2svZ2F0dC9nYXR0X3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyBHQVRUIHV0aWxpdHkgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiICAvLyBNdXN0IGJlIGZpcnN0IHRvIGRlZmluZSBidWlsZCBjb25maWd1cmF0aW9uCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2VhdHQvZWF0dC5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9nYXR0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11aW50OF90IGJ0bV9ibGVfcmVhZF9zZWNfa2V5X3NpemUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLXVzaW5nIGJsdWV0b290aDo6ZWF0dDo6RWF0dEV4dGVuc2lvbjsKLXVzaW5nIGJsdWV0b290aDo6ZWF0dDo6RWF0dENoYW5uZWw7Ci0KLS8qIGNoZWNrIGlmIFt4LCB5XSBhbmQgW2EsIGJdIGhhdmUgb3ZlcmxhcHBpbmcgcmFuZ2UgKi8KLSNkZWZpbmUgR0FUVF9WQUxJREFURV9IQU5ETEVfUkFOR0UoeCwgeSwgYSwgYikgKCh5KSA+PSAoYSkgJiYgKHgpIDw9IChiKSkKLQotI2RlZmluZSBHQVRUX0dFVF9ORVhUX1ZBTElEX0hBTkRMRSh4KSAoKCh4KSAvIDEwICsgMSkgKiAxMCkKLQotY29uc3QgY2hhciogY29uc3Qgb3BfY29kZV9uYW1lW10gPSB7IlVOS05PV04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9SU1BfRVJST1IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9SRVFfTVRVIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUlNQX01UVSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1JFUV9SRUFEX0lORk8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9SU1BfUkVBRF9JTkZPIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUkVRX0ZJTkRfVFlQRV9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1JTUF9GSU5EX1RZUEVfVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9SRVFfUkVBRF9CWV9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUlNQX1JFQURfQllfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1JFUV9SRUFEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUlNQX1JFQUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9SRVFfUkVBRF9CTE9CIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUlNQX1JFQURfQkxPQiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FUVF9SRVFfUkVBRF9NVUxUSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FUVF9SU1BfUkVBRF9NVUxUSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FUVF9SRVFfUkVBRF9CWV9HUlBfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0FUVF9SU1BfUkVBRF9CWV9HUlBfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1JFUV9XUklURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1JTUF9XUklURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX0NNRF9XUklURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1NJR05fQ01EX1dSSVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUkVRX1BSRVBBUkVfV1JJVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9SU1BfUFJFUEFSRV9XUklURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX1JFUV9FWEVDX1dSSVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfUlNQX0VYRUNfV1JJVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVFRfSEFORExFX1ZBTFVFX05PVElGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlcnZlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX0hBTkRMRV9WQUxVRV9JTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVF9IQU5ETEVfVkFMVUVfQ09ORiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUX09QX0NPREVfTUFYIn07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2ZyZWVfcGVuZGluZ19pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICBGcmVlIGFsbCBwZW5kaW5nIGluZGljYXRpb25zCi0gKgotICogUmV0dXJucyAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9mcmVlX3BlbmRpbmdfaW5kKHRHQVRUX1RDQiogcF90Y2IpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXzsKLQotICBpZiAocF90Y2ItPnBlbmRpbmdfaW5kX3EgPT0gTlVMTCkgcmV0dXJuOwotCi0gIC8qIHJlbGVhc2UgYWxsIHF1ZXVlZCBpbmRpY2F0aW9ucyAqLwotICB3aGlsZSAoIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfdGNiLT5wZW5kaW5nX2luZF9xKSkKLSAgICBvc2lfZnJlZShmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX3RjYi0+cGVuZGluZ19pbmRfcSkpOwotICBmaXhlZF9xdWV1ZV9mcmVlKHBfdGNiLT5wZW5kaW5nX2luZF9xLCBOVUxMKTsKLSAgcF90Y2ItPnBlbmRpbmdfaW5kX3EgPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9kZWxldGVfZGV2X2Zyb21fc3J2X2NoZ19jbHRfbGlzdAotICoKLSAqIERlc2NyaXB0aW9uICAgIERlbGV0ZSBhIGRldmljZSBmcm9tIHRoZSBzZXJ2aWNlIGNoYW5nZWQgY2xpZW50IGxpdAotICoKLSAqIFJldHVybnMgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfZGVsZXRlX2Rldl9mcm9tX3Nydl9jaGdfY2x0X2xpc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBWTE9HKDEpIDw8IF9fZnVuY19fOwotCi0gIHRHQVRUU19TUlZfQ0hHKiBwX2J1ZiA9IGdhdHRfaXNfYmRhX2luX3RoZV9zcnZfY2hnX2NsdF9saXN0KGJkX2FkZHIpOwotICBpZiAocF9idWYgIT0gTlVMTCkgewotICAgIGlmIChnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKSB7Ci0gICAgICAvKiBkZWxldGUgZnJvbSBOViAqLwotICAgICAgdEdBVFRTX1NSVl9DSEdfUkVRIHJlcTsKLSAgICAgIHJlcS5zcnZfY2hnLmJkYSA9IGJkX2FkZHI7Ci0gICAgICAoKmdhdHRfY2IuY2JfaW5mby5wX3Nydl9jaGdfY2FsbGJhY2spKEdBVFRTX1NSVl9DSEdfQ01EX1JFTU9WRV9DTElFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXEsIE5VTEwpOwotICAgIH0KLSAgICBvc2lfZnJlZShmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUoZ2F0dF9jYi5zcnZfY2hnX2NsdF9xLCBwX2J1ZikpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3NldF9zcnZfY2hnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgdGhlIHNlcnZpY2UgY2hhbmdlZCBmbGFnIHRvIHRydWUKLSAqCi0gKiBSZXR1cm5zICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zZXRfc3J2X2NoZyh2b2lkKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgaWYgKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KGdhdHRfY2Iuc3J2X2NoZ19jbHRfcSkpIHJldHVybjsKLQotICBsaXN0X3QqIGxpc3QgPSBmaXhlZF9xdWV1ZV9nZXRfbGlzdChnYXR0X2NiLnNydl9jaGdfY2x0X3EpOwotICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihsaXN0KTsgbm9kZSAhPSBsaXN0X2VuZChsaXN0KTsKLSAgICAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpKSB7Ci0gICAgVkxPRygxKSA8PCAiZm91bmQgYSBzcnZfY2hnIGNsdCI7Ci0KLSAgICB0R0FUVFNfU1JWX0NIRyogcF9idWYgPSAodEdBVFRTX1NSVl9DSEcqKWxpc3Rfbm9kZShub2RlKTsKLSAgICBpZiAoIXBfYnVmLT5zcnZfY2hhbmdlZCkgewotICAgICAgVkxPRygxKSA8PCAic2V0IHNydl9jaGFuZ2VkIHRvIHRydWUiOwotICAgICAgcF9idWYtPnNydl9jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgIHRHQVRUU19TUlZfQ0hHX1JFUSByZXE7Ci0gICAgICBtZW1jcHkoJnJlcS5zcnZfY2hnLCBwX2J1Ziwgc2l6ZW9mKHRHQVRUU19TUlZfQ0hHKSk7Ci0gICAgICBpZiAoZ2F0dF9jYi5jYl9pbmZvLnBfc3J2X2NoZ19jYWxsYmFjaykKLSAgICAgICAgKCpnYXR0X2NiLmNiX2luZm8ucF9zcnZfY2hnX2NhbGxiYWNrKShHQVRUU19TUlZfQ0hHX0NNRF9VUERBVEVfQ0xJRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXEsIE5VTEwpOwotICAgIH0KLSAgfQotfQotCi0vKiogQWRkIGEgcGVuZGluZyBpbmRpY2F0aW9uICovCi12b2lkIGdhdHRfYWRkX3BlbmRpbmdfaW5kKHRHQVRUX1RDQiogcF90Y2IsIHRHQVRUX1ZBTFVFKiBwX2luZCkgewotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICJlbnF1ZXVlIGEgcGVuZGluZyBpbmRpY2F0aW9uIjsKLQotICB0R0FUVF9WQUxVRSogcF9idWYgPSAodEdBVFRfVkFMVUUqKW9zaV9tYWxsb2Moc2l6ZW9mKHRHQVRUX1ZBTFVFKSk7Ci0gIG1lbWNweShwX2J1ZiwgcF9pbmQsIHNpemVvZih0R0FUVF9WQUxVRSkpOwotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfdGNiLT5wZW5kaW5nX2luZF9xLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgIGdhdHRfYWRkX3Nydl9jaGdfY2x0Ci0gKgotICogRGVzY3JpcHRpb24gIEFkZCBhIHNlcnZpY2UgY2huYWdlIGNsaWVudCB0byB0aGUgc2VydmljZSBjaGFuZ2UgY2xpZW50IHF1ZXVlCi0gKgotICogUmV0dXJucyAgICBQb2ludGVyIHRvIHRoZSBzZXJ2aWNlIGNoYW5nZSBjbGllbnQgYnVmZmVyOyBOdWxsIG5vIGJ1ZmZlcgotICogICAgICAgICAgICBhdmFpbGFibGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRTX1NSVl9DSEcqIGdhdHRfYWRkX3Nydl9jaGdfY2x0KHRHQVRUU19TUlZfQ0hHKiBwX3Nydl9jaGcpIHsKLSAgdEdBVFRTX1NSVl9DSEcqIHBfYnVmID0gKHRHQVRUU19TUlZfQ0hHKilvc2lfbWFsbG9jKHNpemVvZih0R0FUVFNfU1JWX0NIRykpOwotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICJlbnF1ZXVlIGEgc3J2IGNoZyBjbGllbnQiOwotCi0gIG1lbWNweShwX2J1ZiwgcF9zcnZfY2hnLCBzaXplb2YodEdBVFRTX1NSVl9DSEcpKTsKLSAgZml4ZWRfcXVldWVfZW5xdWV1ZShnYXR0X2NiLnNydl9jaGdfY2x0X3EsIHBfYnVmKTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKgotICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBoYW5kbGUgcmFuZ2UgYnVmZmVyIHN0YXJ0aW5nIGF0IGhhbmRsZSB8aGFuZGxlfCwKLSAqIG51bGxwdHIKLSAqIGlmIG5vIGJ1ZmZlciBhdmFpbGFibGUKLSAqLwotdEdBVFRfSERMX0xJU1RfRUxFTSogZ2F0dF9maW5kX2hkbF9idWZmZXJfYnlfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSkgewotICBmb3IgKGF1dG8mIGVsZW0gOiAqZ2F0dF9jYi5oZGxfbGlzdF9pbmZvKSB7Ci0gICAgaWYgKGVsZW0uYXNnbl9yYW5nZS5zX2hhbmRsZSA9PSBoYW5kbGUpIHJldHVybiAmZWxlbTsKLSAgfQotCi0gIHJldHVybiBudWxscHRyOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZXNjcmlwdGlvbiAgRmluZCBoYW5kbGUgcmFuZ2UgYnVmZmVyIGJ5IGFwcCBJRCwgc2VydmljZSBhbmQgc2VydmljZSBpbnN0YW5jZQotICogICAgICAgICAgICAgIElELgotICoKLSAqIFJldHVybnMgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyLCBOVUxMIG5vIGJ1ZmZlciBhdmFpbGFibGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RkOjpsaXN0PHRHQVRUX0hETF9MSVNUX0VMRU0+OjppdGVyYXRvciBnYXR0X2ZpbmRfaGRsX2J1ZmZlcl9ieV9hcHBfaWQoCi0gICAgY29uc3QgVXVpZCYgYXBwX3V1aWQxMjgsIFV1aWQqIHBfc3ZjX3V1aWQsIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSkgewotICBhdXRvIGVuZF9pdCA9IGdhdHRfY2IuaGRsX2xpc3RfaW5mby0+ZW5kKCk7Ci0gIGF1dG8gaXQgPSBnYXR0X2NiLmhkbF9saXN0X2luZm8tPmJlZ2luKCk7Ci0gIGZvciAoOyBpdCAhPSBlbmRfaXQ7IGl0KyspIHsKLSAgICBpZiAoYXBwX3V1aWQxMjggPT0gaXQtPmFzZ25fcmFuZ2UuYXBwX3V1aWQxMjggJiYKLSAgICAgICAgKnBfc3ZjX3V1aWQgPT0gaXQtPmFzZ25fcmFuZ2Uuc3ZjX3V1aWQgJiYKLSAgICAgICAgKHN0YXJ0X2hhbmRsZSA9PSBpdC0+YXNnbl9yYW5nZS5zX2hhbmRsZSkpIHsKLSAgICAgIHJldHVybiBpdDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gaXQ7Ci19Ci0KLS8qKgotICogZnJlZSB0aGUgc2VydmljZSBhdHRyaWJ1dGUgZGF0YWJhc2UgYnVmZmVycyBieSB0aGUgb3duZXIgb2YgdGhlIHNlcnZpY2UgYXBwCi0gKiBJRC4KLSAqLwotdm9pZCBnYXR0X2ZyZWVfc3J2Y19kYl9idWZmZXJfYXBwX2lkKGNvbnN0IFV1aWQmIGFwcF9pZCkgewotICBhdXRvIGl0ID0gZ2F0dF9jYi5oZGxfbGlzdF9pbmZvLT5iZWdpbigpOwotICBhdXRvIGVuZCA9IGdhdHRfY2IuaGRsX2xpc3RfaW5mby0+ZW5kKCk7Ci0gIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICBpZiAoYXBwX2lkID09IGl0LT5hc2duX3JhbmdlLmFwcF91dWlkMTI4KSB7Ci0gICAgICBpdCA9IGdhdHRfY2IuaGRsX2xpc3RfaW5mby0+ZXJhc2UoaXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpdCsrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9maW5kX3RoZV9jb25uZWN0ZWRfYmRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGZpbmQgdGhlIGNvbm5lY3RlZCBiZGEKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgICB0cnVlIGlmIGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF9maW5kX3RoZV9jb25uZWN0ZWRfYmRhKHVpbnQ4X3Qgc3RhcnRfaWR4LCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZvdW5kX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQqIHBfdHJhbnNwb3J0KSB7Ci0gIHVpbnQ4X3QgaTsKLSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgc3RhcnRfaWR4PSIgPDwgK3N0YXJ0X2lkeDsKLQotICBmb3IgKGkgPSBzdGFydF9pZHg7IGkgPCBHQVRUX01BWF9QSFlfQ0hBTk5FTDsgaSsrKSB7Ci0gICAgaWYgKGdhdHRfY2IudGNiW2ldLmluX3VzZSAmJiBnYXR0X2NiLnRjYltpXS5jaF9zdGF0ZSA9PSBHQVRUX0NIX09QRU4pIHsKLSAgICAgIGJkYSA9IGdhdHRfY2IudGNiW2ldLnBlZXJfYmRhOwotICAgICAgKnBfZm91bmRfaWR4ID0gaTsKLSAgICAgICpwX3RyYW5zcG9ydCA9IGdhdHRfY2IudGNiW2ldLnRyYW5zcG9ydDsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgIFZMT0coMSkgPDwgIiBiZGEgOiIgPDwgYmRhOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCIgZm91bmQ9JWQgZm91bmRfaWR4PSVkIiwgZm91bmQsIGkpOwotICByZXR1cm4gZm91bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2lzX3Nydl9jaGdfaW5kX3BlbmRpbmcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIHdoZXRoZXIgYSBzZXJ2aWNlIGNobmFnZWQgaXMgaW4gdGhlIGluZGljYXRpb24gcGVuZGluZwotICogICAgICAgICAgICAgICAgICBxdWV1ZSBvciB3YWl0aW5nIGZvciBhbiBBY2sgYWxyZWFkeQotICoKLSAqIFJldHVybnMgICAgICAgICBib29sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF9pc19zcnZfY2hnX2luZF9wZW5kaW5nKHRHQVRUX1RDQiogcF90Y2IpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgIDw8ICIgaXNfcXVldWVfZW1wdHk9IiA8PCBmaXhlZF9xdWV1ZV9pc19lbXB0eShwX3RjYi0+cGVuZGluZ19pbmRfcSk7Ci0KLSAgaWYgKHBfdGNiLT5pbmRpY2F0ZV9oYW5kbGUgPT0gZ2F0dF9jYi5oYW5kbGVfb2ZfaF9yKSByZXR1cm4gdHJ1ZTsKLQotICBpZiAocF90Y2ItPmVhdHQgJiYgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+SXNJbmRpY2F0aW9uUGVuZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjYi0+cGVlcl9iZGEsIGdhdHRfY2IuaGFuZGxlX29mX2hfcikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfdGNiLT5wZW5kaW5nX2luZF9xKSkgcmV0dXJuIGZhbHNlOwotCi0gIGxpc3RfdCogbGlzdCA9IGZpeGVkX3F1ZXVlX2dldF9saXN0KHBfdGNiLT5wZW5kaW5nX2luZF9xKTsKLSAgZm9yIChjb25zdCBsaXN0X25vZGVfdCogbm9kZSA9IGxpc3RfYmVnaW4obGlzdCk7IG5vZGUgIT0gbGlzdF9lbmQobGlzdCk7Ci0gICAgICAgbm9kZSA9IGxpc3RfbmV4dChub2RlKSkgewotICAgIHRHQVRUX1ZBTFVFKiBwX2J1ZiA9ICh0R0FUVF9WQUxVRSopbGlzdF9ub2RlKG5vZGUpOwotICAgIGlmIChwX2J1Zi0+aGFuZGxlID09IGdhdHRfY2IuaGFuZGxlX29mX2hfcikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9pc19iZGFfaW5fdGhlX3Nydl9jaGdfY2x0X2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2sgdGhlIHNwZWNpZmllZCBiZGEgaXMgaW4gdGhlIHNydiBjaGcKLSAqICAgICAgICAgICAgICAgICAgY2xpZW50IGxpc3Qgb3Igbm90Ci0gKgotICogUmV0dXJucyAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZvdW5kIGVsZW1lbmV0IG90aGVyd2lzZSBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUU19TUlZfQ0hHKiBnYXR0X2lzX2JkYV9pbl90aGVfc3J2X2NoZ19jbHRfbGlzdChjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6ICIgPDwgYmRhOwotCi0gIGlmIChmaXhlZF9xdWV1ZV9pc19lbXB0eShnYXR0X2NiLnNydl9jaGdfY2x0X3EpKSByZXR1cm4gTlVMTDsKLQotICBsaXN0X3QqIGxpc3QgPSBmaXhlZF9xdWV1ZV9nZXRfbGlzdChnYXR0X2NiLnNydl9jaGdfY2x0X3EpOwotICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihsaXN0KTsgbm9kZSAhPSBsaXN0X2VuZChsaXN0KTsKLSAgICAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpKSB7Ci0gICAgdEdBVFRTX1NSVl9DSEcqIHBfYnVmID0gKHRHQVRUU19TUlZfQ0hHKilsaXN0X25vZGUobm9kZSk7Ci0gICAgaWYgKGJkYSA9PSBwX2J1Zi0+YmRhKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJiZGEgaXMgaW4gdGhlIHNydiBjaGcgY2x0IGxpc3QiOwotICAgICAgcmV0dXJuIHBfYnVmOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9pc19iZGFfY29ubmVjdGVkCi0gKgotICogRGVzY3JpcHRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfSU5ERVhfSU5WQUxJRCBpZiBub3QgZm91bmQuIE90aGVyd2lzZSBpbmRleCB0byB0aGUgdGNiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIGdhdHRfaXNfYmRhX2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdWludDhfdCBpID0gMDsKLSAgYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgR0FUVF9NQVhfUEhZX0NIQU5ORUw7IGkrKykgewotICAgIGlmIChnYXR0X2NiLnRjYltpXS5pbl91c2UgJiYgZ2F0dF9jYi50Y2JbaV0ucGVlcl9iZGEgPT0gYmRhKSB7Ci0gICAgICBjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb25uZWN0ZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2ZpbmRfaV90Y2JfYnlfYWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VhcmNoIGZvciBhbiBlbXB0eSB0Y2IgZW50cnksIGFuZCByZXR1cm4gdGhlIGluZGV4LgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9JTkRFWF9JTlZBTElEIGlmIG5vdCBmb3VuZC4gT3RoZXJ3aXNlIGluZGV4IHRvIHRoZSB0Y2IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgZ2F0dF9maW5kX2lfdGNiX2J5X2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB1aW50OF90IGkgPSAwOwotCi0gIGZvciAoOyBpIDwgR0FUVF9NQVhfUEhZX0NIQU5ORUw7IGkrKykgewotICAgIGlmIChnYXR0X2NiLnRjYltpXS5wZWVyX2JkYSA9PSBiZGEgJiYKLSAgICAgICAgZ2F0dF9jYi50Y2JbaV0udHJhbnNwb3J0ID09IHRyYW5zcG9ydCkgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBHQVRUX0lOREVYX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2dldF90Y2JfYnlfaWR4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGUgZnVuY3Rpb24gZ2V0IFRDQiB1c2luZyB0aGUgVENCIGluZGV4Ci0gKgotICogUmV0dXJucyAgICAgICAgICAgTlVMTCBpZiBub3QgZm91bmQuIE90aGVyd2lzZSBpbmRleCB0byB0aGUgdGNiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9UQ0IqIGdhdHRfZ2V0X3RjYl9ieV9pZHgodWludDhfdCB0Y2JfaWR4KSB7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBOVUxMOwotCi0gIGlmICgodGNiX2lkeCA8IEdBVFRfTUFYX1BIWV9DSEFOTkVMKSAmJiBnYXR0X2NiLnRjYlt0Y2JfaWR4XS5pbl91c2UpCi0gICAgcF90Y2IgPSAmZ2F0dF9jYi50Y2JbdGNiX2lkeF07Ci0KLSAgcmV0dXJuIHBfdGNiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9maW5kX3RjYl9ieV9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZWFyY2ggZm9yIGFuIGVtcHR5IHRjYiBlbnRyeSwgYW5kIHJldHVybiBwb2ludGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTlVMTCBpZiBub3QgZm91bmQuIE90aGVyd2lzZSBpbmRleCB0byB0aGUgdGNiLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9UQ0IqIGdhdHRfZmluZF90Y2JfYnlfYWRkcihjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0R0FUVF9UQ0IqIHBfdGNiID0gTlVMTDsKLSAgdWludDhfdCBpID0gMDsKLQotICBpID0gZ2F0dF9maW5kX2lfdGNiX2J5X2FkZHIoYmRhLCB0cmFuc3BvcnQpOwotICBpZiAoaSAhPSBHQVRUX0lOREVYX0lOVkFMSUQpIHBfdGNiID0gJmdhdHRfY2IudGNiW2ldOwotCi0gIHJldHVybiBwX3RjYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfYWxsb2NhdGVfdGNiX2J5X2JkYWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9jYXRlIG9yIGFsbG9jYXRlIGEgbmV3IHRjYiBlbnRyeSBmb3IgbWF0Y2hpbmcgYmRhLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9JTkRFWF9JTlZBTElEIGlmIG5vdCBmb3VuZC4gT3RoZXJ3aXNlIGluZGV4IHRvIHRoZSB0Y2IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1RDQiogZ2F0dF9hbGxvY2F0ZV90Y2JfYnlfYmRhZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIC8qIHNlYXJjaCBmb3IgZXhpc3RpbmcgdGNiIHdpdGggbWF0Y2hpbmcgYmRhICAgICovCi0gIHVpbnQ4X3QgaiA9IGdhdHRfZmluZF9pX3RjYl9ieV9hZGRyKGJkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKGogIT0gR0FUVF9JTkRFWF9JTlZBTElEKSByZXR1cm4gJmdhdHRfY2IudGNiW2pdOwotCi0gIC8qIGZpbmQgZnJlZSB0Y2IgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBHQVRUX01BWF9QSFlfQ0hBTk5FTDsgaSsrKSB7Ci0gICAgdEdBVFRfVENCKiBwX3RjYiA9ICZnYXR0X2NiLnRjYltpXTsKLSAgICBpZiAocF90Y2ItPmluX3VzZSkgY29udGludWU7Ci0KLSAgICAqcF90Y2IgPSB0R0FUVF9UQ0IoKTsKLQotICAgIHBfdGNiLT5wZW5kaW5nX2luZF9xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLSAgICBwX3RjYi0+Y29uZl90aW1lciA9IGFsYXJtX25ldygiZ2F0dC5jb25mX3RpbWVyIik7Ci0gICAgcF90Y2ItPmluZF9hY2tfdGltZXIgPSBhbGFybV9uZXcoImdhdHQuaW5kX2Fja190aW1lciIpOwotICAgIHBfdGNiLT5pbl91c2UgPSB0cnVlOwotICAgIHBfdGNiLT50Y2JfaWR4ID0gaTsKLSAgICBwX3RjYi0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgIHBfdGNiLT5wZWVyX2JkYSA9IGJkYTsKLSAgICBwX3RjYi0+ZWF0dCA9IDA7Ci0gICAgZ2F0dF9zcl9pbml0X2NsX3N0YXR1cygqcF90Y2IpOwotICAgIGdhdHRfY2xfaW5pdF9zcl9zdGF0dXMoKnBfdGNiKTsKLQotICAgIHJldHVybiBwX3RjYjsKLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiogZ2F0dF9idWlsZF91dWlkX3RvX3N0cmVhbSB3aWxsIGNvbnZlcnQgMzJiaXQgVVVJRHMgdG8gMTI4Yml0LiBUaGlzIGZ1bmN0aW9uCi0gKiB3aWxsIHJldHVybiBsZW5naHQgcmVxdWlyZWQgdG8gYnVpbGQgdXVpZCwgZWl0aGVyIHxVVUlEOmtOdW1CeXRlczE2fCBvcgotICogfFVVSUQ6OmtOdW1CeXRlczEyOHwgKi8KLXVpbnQ4X3QgZ2F0dF9idWlsZF91dWlkX3RvX3N0cmVhbV9sZW4oY29uc3QgVXVpZCYgdXVpZCkgewotICBzaXplX3QgbGVuID0gdXVpZC5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpOwotICByZXR1cm4gbGVuID09IFV1aWQ6OmtOdW1CeXRlczMyID8gVXVpZDo6a051bUJ5dGVzMTI4IDogbGVuOwotfQotCi0vKiogQWRkIFVVSUQgaW50byBzdHJlYW0uIFJldHVybnMgVVVJRCBsZW5ndGguICovCi11aW50OF90IGdhdHRfYnVpbGRfdXVpZF90b19zdHJlYW0odWludDhfdCoqIHBfZHN0LCBjb25zdCBVdWlkJiB1dWlkKSB7Ci0gIHVpbnQ4X3QqIHAgPSAqcF9kc3Q7Ci0gIHNpemVfdCBsZW4gPSB1dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCk7Ci0KLSAgaWYgKHV1aWQuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCB1dWlkLkFzMTZCaXQoKSk7Ci0gIH0gZWxzZSBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczMyKSB7Ci0gICAgLyogYWx3YXlzIGNvbnZlcnQgMzIgYml0cyBpbnRvIDEyOCBiaXRzICovCi0gICAgQVJSQVlfVE9fU1RSRUFNKHAsIHV1aWQuVG8xMjhCaXRMRSgpLCAoaW50KVV1aWQ6OmtOdW1CeXRlczEyOCk7Ci0gICAgbGVuID0gVXVpZDo6a051bUJ5dGVzMTI4OwotICB9IGVsc2UgaWYgKGxlbiA9PSBVdWlkOjprTnVtQnl0ZXMxMjgpIHsKLSAgICBBUlJBWV9UT19TVFJFQU0ocCwgdXVpZC5UbzEyOEJpdExFKCksIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgfQotCi0gICpwX2RzdCA9IHA7Ci0gIHJldHVybiBsZW47Ci19Ci0KLWJvb2wgZ2F0dF9wYXJzZV91dWlkX2Zyb21fY21kKFV1aWQqIHBfdXVpZF9yZWMsIHVpbnQxNl90IHV1aWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBwX2RhdGEpIHsKLSAgYm9vbCByZXQgPSB0cnVlOwotICB1aW50OF90KiBwX3V1aWQgPSAqcF9kYXRhOwotCi0gIHN3aXRjaCAodXVpZF9zaXplKSB7Ci0gICAgY2FzZSBVdWlkOjprTnVtQnl0ZXMxNjogewotICAgICAgdWludDE2X3QgdmFsOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNih2YWwsIHBfdXVpZCk7Ci0gICAgICAqcF91dWlkX3JlYyA9IFV1aWQ6OkZyb20xNkJpdCh2YWwpOwotICAgICAgKnBfZGF0YSArPSBVdWlkOjprTnVtQnl0ZXMxNjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGNhc2UgVXVpZDo6a051bUJ5dGVzMTI4OiB7Ci0gICAgICAqcF91dWlkX3JlYyA9IFV1aWQ6OkZyb20xMjhCaXRMRShwX3V1aWQpOwotICAgICAgKnBfZGF0YSArPSBVdWlkOjprTnVtQnl0ZXMxMjg7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiBkbyBub3QgYWxsb3cgMzIgYml0cyBVVUlEIGluIEFUVCBQRFUgbm93ICovCi0gICAgY2FzZSBVdWlkOjprTnVtQnl0ZXMzMjoKLSAgICAgIExPRyhFUlJPUikgPDwgIkRPIE5PVCBBTExPVyAzMiBCSVRTIFVVSUQgSU4gQVRUIFBEVSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSAwOgotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodXVpZF9zaXplICE9IDApIHJldCA9IGZhbHNlOwotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IGludmFsaWQgdXVpZCBzaXplIjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIChyZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9zdGFydF9yc3BfdGltZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IGEgd2FpdF9mb3JfcmVzcG9uc2UgdGltZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zdGFydF9yc3BfdGltZXIodEdBVFRfQ0xDQiogcF9jbGNiKSB7Ci0gIHVpbnQ2NF90IHRpbWVvdXRfbXMgPSBHQVRUX1dBSVRfRk9SX1JTUF9USU1FT1VUX01TOwotCi0gIGlmIChwX2NsY2ItPm9wZXJhdGlvbiA9PSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZICYmCi0gICAgICBwX2NsY2ItPm9wX3N1YnR5cGUgPT0gR0FUVF9ESVNDX1NSVkNfQUxMKSB7Ci0gICAgdGltZW91dF9tcyA9IEdBVFRfV0FJVF9GT1JfRElTQ19SU1BfVElNRU9VVF9NUzsKLSAgfQotCi0gIC8vIFRPRE86IFRoZSB0R0FUVF9DTENCIG1lbW9yeSBhbmQgc3RhdGUgbWFuYWdlbWVudCBuZWVkcyBjbGVhbnVwLAotICAvLyBhbmQgdGhlbiB0aGUgdGltZXJzIGNhbiBiZSBhbGxvY2F0ZWQgZWxzZXdoZXJlLgotICBpZiAocF9jbGNiLT5nYXR0X3JzcF90aW1lcl9lbnQgPT0gTlVMTCkgewotICAgIHBfY2xjYi0+Z2F0dF9yc3BfdGltZXJfZW50ID0gYWxhcm1fbmV3KCJnYXR0LmdhdHRfcnNwX3RpbWVyX2VudCIpOwotICB9Ci0gIGFsYXJtX3NldF9vbl9tbG9vcChwX2NsY2ItPmdhdHRfcnNwX3RpbWVyX2VudCwgdGltZW91dF9tcywgZ2F0dF9yc3BfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgIHBfY2xjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3N0b3BfcnNwX3RpbWVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdG9wcyBhIEdBVFQgcmVzcG9uc2UgdGltZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zdG9wX3JzcF90aW1lcih0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgYWxhcm1fY2FuY2VsKHBfY2xjYi0+Z2F0dF9yc3BfdGltZXJfZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3RhcnRfY29uZl90aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgYSB3YWl0X2Zvcl9jb25maXJtYXRpb24gdGltZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zdGFydF9jb25mX3RpbWVyKHRHQVRUX1RDQiogcF90Y2IsIHVpbnQxNl90IGNpZCkgewotICAvKiBzdGFydCBub3RpZmljYXRpb24gY2FjaGUgdGltZXIgKi8KLSAgaWYgKHBfdGNiLT5lYXR0ICYmIGNpZCAhPSBMMkNBUF9BVFRfQ0lEKQotICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPlN0YXJ0SW5kaWNhdGlvbkNvbmZpcm1hdGlvblRpbWVyKHBfdGNiLT5wZWVyX2JkYSwgY2lkKTsKLSAgZWxzZQotICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX3RjYi0+Y29uZl90aW1lciwgR0FUVF9XQUlUX0ZPUl9SU1BfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgZ2F0dF9pbmRpY2F0aW9uX2NvbmZpcm1hdGlvbl90aW1lb3V0LCBwX3RjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3N0b3BfY29uZl90aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgYSB3YWl0X2Zvcl9jb25maXJtYXRpb24gdGltZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zdG9wX2NvbmZfdGltZXIodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkgewotICAvKiBzdGFydCBub3RpZmljYXRpb24gY2FjaGUgdGltZXIgKi8KLSAgaWYgKHRjYi5lYXR0ICYmIGNpZCAhPSBMMkNBUF9BVFRfQ0lEKQotICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPlN0b3BJbmRpY2F0aW9uQ29uZmlybWF0aW9uVGltZXIodGNiLnBlZXJfYmRhLCBjaWQpOwotICBlbHNlCi0gICAgYWxhcm1fY2FuY2VsKHRjYi5jb25mX3RpbWVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3RhcnRfaW5kX2Fja190aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGFjayB0aW1lcgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfc3RhcnRfaW5kX2Fja190aW1lcih0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKSB7Ci0gIC8qIHN0YXJ0IG5vdGlmaWNhdGlvbiBjYWNoZSB0aW1lciAqLwotICBpZiAodGNiLmVhdHQgJiYgY2lkICE9IEwyQ0FQX0FUVF9DSUQpCi0gICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+U3RhcnRBcHBJbmRpY2F0aW9uVGltZXIodGNiLnBlZXJfYmRhLCBjaWQpOwotICBlbHNlCi0gICAgYWxhcm1fc2V0X29uX21sb29wKHRjYi5pbmRfYWNrX3RpbWVyLCBHQVRUX1dBSVRfRk9SX1JTUF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBnYXR0X2luZF9hY2tfdGltZW91dCwgJnRjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3N0b3BfaW5kX2Fja190aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc3RvcCB0aGUgYXBwbGljYXRpb24gYWNrIHRpbWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zdG9wX2luZF9hY2tfdGltZXIodEdBVFRfVENCKiBwX3RjYiwgdWludDE2X3QgY2lkKSB7Ci0gIC8qIHN0YXJ0IG5vdGlmaWNhdGlvbiBjYWNoZSB0aW1lciAqLwotICBpZiAocF90Y2ItPmVhdHQgJiYgY2lkICE9IEwyQ0FQX0FUVF9DSUQpIHsKLSAgICBFYXR0RXh0ZW5zaW9uOjpHZXRJbnN0YW5jZSgpLT5TdG9wQXBwSW5kaWNhdGlvblRpbWVyKHBfdGNiLT5wZWVyX2JkYSwgY2lkKTsKLSAgfSBlbHNlIHsKLSAgICBhbGFybV9jYW5jZWwocF90Y2ItPmluZF9hY2tfdGltZXIpOwotICAgIHBfdGNiLT5pbmRfY291bnQgPSAwOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9yc3BfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIHdoZW4gR0FUVCB3YWl0IGZvciBBVFQgY29tbWFuZCByZXNwb25zZSB0aW1lciBleHBpcmVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9yc3BfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIHRHQVRUX0NMQ0IqIHBfY2xjYiA9ICh0R0FUVF9DTENCKilkYXRhOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCB8fCBwX2NsY2ItPnBfdGNiID09IE5VTEwpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiBjbGNiIGlzIGFscmVhZHkgZGVsZXRlZCI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwX2NsY2ItPm9wZXJhdGlvbiA9PSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZICYmCi0gICAgICBwX2NsY2ItPm9wX3N1YnR5cGUgPT0gR0FUVF9ESVNDX1NSVkNfQUxMICYmCi0gICAgICBwX2NsY2ItPnJldHJ5X2NvdW50IDwgR0FUVF9SRVFfUkVUUllfTElNSVQpIHsKLSAgICB1aW50OF90IHJzcF9jb2RlOwotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIHJldHJ5IGRpc2NvdmVyeSBwcmltYXJ5IHNlcnZpY2UiOwotICAgIGlmIChwX2NsY2IgIT0gZ2F0dF9jbWRfZGVxdWV1ZSgqcF9jbGNiLT5wX3RjYiwgcF9jbGNiLT5jaWQsICZyc3BfY29kZSkpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIiBjb21tYW5kIHF1ZXVlIG91dCBvZiBzeW5jLCBkaXNjb25uZWN0IjsKLSAgICB9IGVsc2UgewotICAgICAgcF9jbGNiLT5yZXRyeV9jb3VudCsrOwotICAgICAgZ2F0dF9hY3RfZGlzY292ZXJ5KHBfY2xjYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgZGlzY29ubmVjdGluZy4uLiI7Ci0gIGdhdHRfZGlzY29ubmVjdChwX2NsY2ItPnBfdGNiKTsKLX0KLQotZXh0ZXJuIHZvaWQgZ2F0dHNfcHJvY19zcnZfY2hnX2luZF9hY2sodEdBVFRfVENCIHRjYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2luZGljYXRpb25fY29uZmlybWF0aW9uX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCB3aGVuIHRoZSBpbmRpY2F0aW9uIGNvbmZpcm1hdGlvbiB0aW1lciBleHBpcmVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9pbmRpY2F0aW9uX2NvbmZpcm1hdGlvbl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgdEdBVFRfVENCKiBwX3RjYiA9ICh0R0FUVF9UQ0IqKWRhdGE7Ci0KLSAgaWYgKHBfdGNiLT5pbmRpY2F0ZV9oYW5kbGUgPT0gZ2F0dF9jYi5oYW5kbGVfb2ZfaF9yKSB7Ci0gICAgLyogVGhlcmUgYXJlIHNvbWUgR0FUVCBTZXJ2ZXIgb25seSBkZXZpY2VzLCB0aGF0IGRvbid0IGltcGxlbWVudCBHQVRUIGNsaWVudAotICAgICAqIGZ1bmN0aW9uYWxpdGllcywgYW5kIGlnbm9yZSAiU2VydmljZSBDaGFuZ2VkIiBpbmRpY2F0aW9uLiBBbmRyb2lkIGRvZXMKLSAgICAgKiBub3QgaGF2ZSBDQ0MgaW4gIlNlcnZpY2UgQ2hhbmdlZCIgY2hhcmFjdGVyaXN0aWMsIGFuZCBzZW5kcyBpdCB0byBhbGwKLSAgICAgKiBib25kZWQgZGV2aWNlcy4gVGhpcyBsZWFkcyB0byBzaXR1YXRpb24gd2hlcmUgcmVtb3RlIGNhbiBpZ25vcmUgdGhlCi0gICAgICogaW5kaWNhdGlvbiwgYW5kIHRyaWdnZXIgMzBzIHRpbWVvdXQsIHRoZW4gcmVjb25uZWN0aW9uIGluIGEgbG9vcC4KLSAgICAgKgotICAgICAqIFNpbmNlIGNoYW5jZXMgb2YgaGVhbHRoeSBDbGllbnQgZGV2aWNlIGtlZXBpbmcgY29ubmVjdGlvbiBmb3IgMzAgc2Vjb25kcwotICAgICAqIGFuZCBub3QgcmVzcG9uZGluZyB0byAiU2VydmljZSBDaGFuZ2VkIiBpbmRpY2F0aW9uIGFyZSB2ZXJ5IGxvdywgYXNzdW1lCi0gICAgICogd2UgYXJlIGRlYWxpbmcgd2l0aCBTZXJ2ZXIgb25seSBkZXZpY2UsIGFuZCBkb24ndCB0cmlnZ2VyIGRpc2Nvbm5lY3Rpb24uCi0gICAgICoKLSAgICAgKiBUT0RPOiBJbiBmdXR1cmUsIHdlIHNob3VsZCBwcm9wZXJseSBleHBvc2UgQ0NDLCBhbmQgc2VuZCBpbmRpY2F0aW9uIG9ubHkKLSAgICAgKiB0byBkZXZpY2VzIHRoYXQgcmVnaXN0ZXIgZm9yIGl0LgotICAgICAqLwotICAgIExPRyhXQVJOSU5HKSA8PCAiIFNlcnZpY2UgQ2hhbmdlZCBub3RpZmljYXRpb24gdGltZWQgb3V0IGluIDMwICIKLSAgICAgICAgICAgICAgICAgICAgInNlY29uZHMsIGFzc3VtaW5nIHNlcnZlci1vbmx5IHJlbW90ZSwgbm90IGRpc2Nvbm5lY3RpbmciOwotICAgIGdhdHRzX3Byb2Nfc3J2X2NoZ19pbmRfYWNrKCpwX3RjYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgZGlzY29ubmVjdGluZy4uLiI7Ci0gIGdhdHRfZGlzY29ubmVjdChwX3RjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2luZF9hY2tfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIHdoZW4gR0FUVCB3YWl0IGZvciBBVFQgaGFuZGxlIGNvbmZpcm1hdGlvbiB0aW1lb3V0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgIGdhdHRfaW5kX2Fja190aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgdEdBVFRfVENCKiBwX3RjYiA9ICh0R0FUVF9UQ0IqKWRhdGE7Ci0gIENIRUNLKHBfdGNiKTsKLQotICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogc2VuZCBhY2sgbm93IjsKLSAgcF90Y2ItPmluZF9jb3VudCA9IDA7Ci0gIC8qVE9ETzogRm9yIG5vdyBBVFQgdXNlZCBvbmx5LCBidXQgd2UgbmVlZCB0byBoYXZlIHRpbWVvdXQgcGVyIENJRAotICAgKiBhbmQgdXNlIGl0IGhlcmUgY29ycmV0bHkuCi0gICAqLwotICBhdHRwX3NlbmRfY2xfY29uZmlybWF0aW9uX21zZygqcF90Y2IsIEwyQ0FQX0FUVF9DSUQpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlYXJjaCBmb3IgYSBzZXJ2aWNlIHRoYXQgb3ducyBhIHNwZWNpZmljIGhhbmRsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfTUFYX1NSX1BST0ZJTEVTIGlmIG5vdCBmb3VuZC4gT3RoZXJ3aXNlIHRoZSBpbmRleCBvZgotICogICAgICAgICAgICAgICAgICB0aGUgc2VydmljZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RkOjpsaXN0PHRHQVRUX1NSVl9MSVNUX0VMRU0+OjppdGVyYXRvciBnYXR0X3NyX2ZpbmRfaV9yY2JfYnlfaGFuZGxlKAotICAgIHVpbnQxNl90IGhhbmRsZSkgewotICBhdXRvIGl0ID0gZ2F0dF9jYi5zcnZfbGlzdF9pbmZvLT5iZWdpbigpOwotCi0gIGZvciAoOyBpdCAhPSBnYXR0X2NiLnNydl9saXN0X2luZm8tPmVuZCgpOyBpdCsrKSB7Ci0gICAgaWYgKGl0LT5zX2hkbCA8PSBoYW5kbGUgJiYgaXQtPmVfaGRsID49IGhhbmRsZSkgewotICAgICAgcmV0dXJuIGl0OwotICAgIH0KLSAgfQotCi0gIHJldHVybiBpdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfZ2V0X3NlY19pbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIHNlY3VyaXR5IGZsYWcgYW5kIGtleSBzaXplIGluZm9ybWF0aW9uIGZvciB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zcl9nZXRfc2VjX2luZm8oY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NFQ19GTEFHKiBwX3NlY19mbGFnLCB1aW50OF90KiBwX2tleV9zaXplKSB7Ci0gIHRHQVRUX1NFQ19GTEFHIGZsYWdzID0ge307Ci0gIGZsYWdzLmlzX2xpbmtfa2V5X2tub3duID0gQlRNX0lzTGlua0tleUtub3duKHJlbV9iZGEsIHRyYW5zcG9ydCk7Ci0gIGZsYWdzLmlzX2xpbmtfa2V5X2F1dGhlZCA9IEJUTV9Jc0xpbmtLZXlBdXRoZWQocmVtX2JkYSwgdHJhbnNwb3J0KTsKLSAgZmxhZ3MuaXNfZW5jcnlwdGVkID0gQlRNX0lzRW5jcnlwdGVkKHJlbV9iZGEsIHRyYW5zcG9ydCk7Ci0KLSAgKnBfa2V5X3NpemUgPSBidG1fYmxlX3JlYWRfc2VjX2tleV9zaXplKHJlbV9iZGEpOwotICAqcF9zZWNfZmxhZyA9IGZsYWdzOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3Jfc2VuZF9yZXFfY2FsbGJhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3NyX3NlbmRfcmVxX2NhbGxiYWNrKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSB0eXBlLCB0R0FUVFNfREFUQSogcF9kYXRhKSB7Ci0gIHRHQVRUX0lGIGdhdHRfaWYgPSBHQVRUX0dFVF9HQVRUX0lGKGNvbm5faWQpOwotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0KLSAgaWYgKCFwX3JlZykgewotICAgIExPRyhFUlJPUikgPDwgInBfcmVnIG5vdCBmb3VuZCBkaXNjYXJkIHJlcXVlc3QiOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX3JlZy0+aW5fdXNlICYmIHBfcmVnLT5hcHBfY2IucF9yZXFfY2IpIHsKLSAgICAoKnBfcmVnLT5hcHBfY2IucF9yZXFfY2IpKGNvbm5faWQsIHRyYW5zX2lkLCB0eXBlLCBwX2RhdGEpOwotICB9IGVsc2UgewotICAgIExPRyhXQVJOSU5HKSA8PCAiQ2FsbCBiYWNrIG5vdCBmb3VuZCBmb3IgYXBwbGljYXRpb24gY29ubl9pZD0iIDw8IGNvbm5faWQ7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc2VuZF9lcnJvcl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gZXJyb3IgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1NUQVRVUyBnYXR0X3NlbmRfZXJyb3JfcnNwKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHVpbnQ4X3QgZXJyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHVpbnQxNl90IGhhbmRsZSwgYm9vbCBkZXEpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLSAgQlRfSERSKiBwX2J1ZjsKLQotICB0R0FUVF9TUl9NU0cgbXNnOwotICBtc2cuZXJyb3IuY21kX2NvZGUgPSBvcF9jb2RlOwotICBtc2cuZXJyb3IucmVhc29uID0gZXJyX2NvZGU7Ci0gIG1zZy5lcnJvci5oYW5kbGUgPSBoYW5kbGU7Ci0KLSAgcF9idWYgPSBhdHRwX2J1aWxkX3NyX21zZyh0Y2IsIEdBVFRfUlNQX0VSUk9SLCAmbXNnKTsKLSAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICBzdGF0dXMgPSBhdHRwX3NlbmRfc3JfbXNnKHRjYiwgY2lkLCBwX2J1Zik7Ci0gIH0gZWxzZQotICAgIHN0YXR1cyA9IEdBVFRfSU5TVUZfUkVTT1VSQ0U7Ci0KLSAgaWYgKGRlcSkKLSAgICAgIGdhdHRfZGVxdWV1ZV9zcl9jbWQodGNiLCBjaWQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2FkZF9zZHBfcmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIFNEUCByZWNvcmQgZm9yIGEgR0FUVCBwcmltYXJ5IHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIDAgaWYgZXJyb3IgZWxzZSBzZHAgaGFuZGxlIGZvciB0aGUgcmVjb3JkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MzJfdCBnYXR0X2FkZF9zZHBfcmVjb3JkKGNvbnN0IFV1aWQmIHV1aWQsIHVpbnQxNl90IHN0YXJ0X2hkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZW5kX2hkbCkgewotICB1aW50OF90IGJ1ZmZbNjBdOwotICB1aW50OF90KiBwID0gYnVmZjsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fCi0gICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgc19oZGw9MHgleCAgc19oZGw9MHgleCIsIHN0YXJ0X2hkbCwgZW5kX2hkbCk7Ci0KLSAgdWludDMyX3Qgc2RwX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgaWYgKHNkcF9oYW5kbGUgPT0gMCkgcmV0dXJuIDA7Ci0KLSAgc3dpdGNoICh1dWlkLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkpIHsKLSAgICBjYXNlIFV1aWQ6OmtOdW1CeXRlczE2OiB7Ci0gICAgICB1aW50MTZfdCB0bXAgPSB1dWlkLkFzMTZCaXQoKTsKLSAgICAgIFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3Qoc2RwX2hhbmRsZSwgMSwgJnRtcCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIFV1aWQ6OmtOdW1CeXRlczMyOiB7Ci0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVVSURfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9GT1VSX0JZVEVTKTsKLSAgICAgIHVpbnQzMl90IHRtcCA9IHV1aWQuQXMzMkJpdCgpOwotICAgICAgVUlOVDMyX1RPX0JFX1NUUkVBTShwLCB0bXApOwotICAgICAgU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgKHVpbnQzMl90KShwIC0gYnVmZiksIGJ1ZmYpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBVdWlkOjprTnVtQnl0ZXMxMjg6Ci0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVVSURfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9TSVhURUVOX0JZVEVTKTsKLSAgICAgIEFSUkFZX1RPX0JFX1NUUkVBTShwLCB1dWlkLlRvMTI4Qml0QkUoKS5kYXRhKCksIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICAgIFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgIERBVEFfRUxFX1NFUV9ERVNDX1RZUEUsICh1aW50MzJfdCkocCAtIGJ1ZmYpLCBidWZmKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyoqKiBGaWxsIG91dCB0aGUgcHJvdG9jb2wgZWxlbWVudCBzZXF1ZW5jZSBmb3IgU0RQICoqKi8KLSAgdFNEUF9QUk9UT0NPTF9FTEVNIHByb3RvX2VsZW1fbGlzdFsyXTsKLSAgcHJvdG9fZWxlbV9saXN0WzBdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0wyQ0FQOwotICBwcm90b19lbGVtX2xpc3RbMF0ubnVtX3BhcmFtcyA9IDE7Ci0gIHByb3RvX2VsZW1fbGlzdFswXS5wYXJhbXNbMF0gPSBCVF9QU01fQVRUOwotICBwcm90b19lbGVtX2xpc3RbMV0ucHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfQVRUOwotICBwcm90b19lbGVtX2xpc3RbMV0ubnVtX3BhcmFtcyA9IDI7Ci0gIHByb3RvX2VsZW1fbGlzdFsxXS5wYXJhbXNbMF0gPSBzdGFydF9oZGw7Ci0gIHByb3RvX2VsZW1fbGlzdFsxXS5wYXJhbXNbMV0gPSBlbmRfaGRsOwotCi0gIFNEUF9BZGRQcm90b2NvbExpc3Qoc2RwX2hhbmRsZSwgMiwgcHJvdG9fZWxlbV9saXN0KTsKLQotICAvKiBNYWtlIHRoZSBzZXJ2aWNlIGJyb3dzZWFibGUgKi8KLSAgdWludDE2X3QgbGlzdCA9IFVVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVA7Ci0gIFNEUF9BZGRVdWlkU2VxdWVuY2Uoc2RwX2hhbmRsZSwgQVRUUl9JRF9CUk9XU0VfR1JPVVBfTElTVCwgMSwgJmxpc3QpOwotCi0gIHJldHVybiAoc2RwX2hhbmRsZSk7Ci19Ci0KLSNpZiBHQVRUX0NPTkZPUk1BTkNFX1RFU1RJTkcgPT0gVFJVRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc2V0X2Vycl9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgdGVzdCBjb25maXJtIHZhbHVlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zZXRfZXJyX3JzcChib29sIGVuYWJsZSwgdWludDhfdCByZXFfb3BfY29kZSwgdWludDhfdCBlcnJfc3RhdHVzKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18KLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiBlbmFibGU9JWQgb3BfY29kZT0lZCwgZXJyX3N0YXR1cz0lZCIsIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX29wX2NvZGUsIGVycl9zdGF0dXMpOwotICBnYXR0X2NiLmVuYWJsZV9lcnJfcnNwID0gZW5hYmxlOwotICBnYXR0X2NiLnJlcV9vcF9jb2RlID0gcmVxX29wX2NvZGU7Ci0gIGdhdHRfY2IuZXJyX3N0YXR1cyA9IGVycl9zdGF0dXM7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfZ2V0X3JlZ2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVnaXN0cmF0aW9uIGNvbnRyb2wgYmxvY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSByZWdpc3RyYXRpb24gY29udHJvbCBibG9jayBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRHQVRUX1JFRyogZ2F0dF9nZXRfcmVnY2IodEdBVFRfSUYgZ2F0dF9pZikgewotICB1aW50OF90IGlpID0gKHVpbnQ4X3QpZ2F0dF9pZjsKLSAgdEdBVFRfUkVHKiBwX3JlZyA9IE5VTEw7Ci0KLSAgaWYgKGlpIDwgMSB8fCBpaSA+IEdBVFRfTUFYX0FQUFMpIHsKLSAgICBMT0coV0FSTklORykgPDwgImdhdHRfaWYgb3V0IG9mIHJhbmdlID0gIiA8PCAraWk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBJbmRleCBmb3IgY2xfcmNiIGlzIGFsd2F5cyAxIGxlc3MgdGhhbiBnYXR0X2lmLgotICBwX3JlZyA9ICZnYXR0X2NiLmNsX3JjYltpaSAtIDFdOwotCi0gIGlmICghcF9yZWctPmluX3VzZSkgewotICAgIExPRyhXQVJOSU5HKSA8PCAiZ2F0dF9pZiBmb3VuZCBidXQgbm90IGluIHVzZS4iOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHBfcmVnOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9pc19jbGNiX2FsbG9jYXRlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGNoZWNrIGNsY2IgZm9yIGNvbm5faWQgaXMgYWxsb2NhdGVkIG9yIG5vdAotICoKLSAqIFJldHVybnMgICAgICAgICAgIFRydWUgYWxyZWFkeSBhbGxvY2F0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib29sIGdhdHRfaXNfY2xjYl9hbGxvY2F0ZWQodWludDE2X3QgY29ubl9pZCkgewotICB1aW50OF90IGkgPSAwOwotICB1aW50OF90IG51bV9vZl9hbGxvY2F0ZWQgPSAwOwotICB0R0FUVF9JRiBnYXR0X2lmID0gR0FUVF9HRVRfR0FUVF9JRihjb25uX2lkKTsKLSAgdWludDhfdCB0Y2JfaWR4ID0gR0FUVF9HRVRfVENCX0lEWChjb25uX2lkKTsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZ2V0X3RjYl9ieV9pZHgodGNiX2lkeCk7Ci0gIHRHQVRUX1JFRyogcF9yZWcgPSBnYXR0X2dldF9yZWdjYihnYXR0X2lmKTsKLSAgaW50IHBvc3NpYmxlX3BsY2IgPSAxOwotCi0gIGlmIChwX3JlZy0+ZWF0dF9zdXBwb3J0KSBwb3NzaWJsZV9wbGNiICs9IHBfdGNiLT5lYXR0OwotCi0gIC8qIFdpdGggZWF0dCBudW1iZXIgb2YgYWN0aXZlIGNsY2JzIGNhbiBtZSB1cCB0byAxICsgbnVtYmVyIG9mIGVhdHQgY2hhbm5lbHMKLSAgICovCi0gIGZvciAoaSA9IDA7IGkgPCBHQVRUX0NMX01BWF9MQ0I7IGkrKykgewotICAgIGlmIChnYXR0X2NiLmNsY2JbaV0uaW5fdXNlICYmIChnYXR0X2NiLmNsY2JbaV0uY29ubl9pZCA9PSBjb25uX2lkKSkgewotICAgICAgaWYgKCsrbnVtX29mX2FsbG9jYXRlZCA9PSBwb3NzaWJsZV9wbGNiKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3RjYl9pc19jaWRfYnVzeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGNoZWNrIGlmIGNoYW5uZWwgd2l0aCBnaXZlbiBjaWQgaXMgYnVzeQotICoKLSAqIFJldHVybnMgICAgICAgICAgVHJ1ZSB3aGVuIGJ1c3kKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib29sIGdhdHRfdGNiX2lzX2NpZF9idXN5KHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQpIHsKLSAgaWYgKGNpZCA9PSB0Y2IuYXR0X2xjaWQpIHJldHVybiAhdGNiLmNsX2NtZF9xLmVtcHR5KCk7Ci0KLSAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlDaWQodGNiLnBlZXJfYmRhLCBjaWQpOwotICBpZiAoIWNoYW5uZWwpIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gIWNoYW5uZWwtPmNsX2NtZF9xXy5lbXB0eSgpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfY2xjYl9hbGxvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIEdBVFQgIGNvbm5lY3Rpb24gbGluayBjb250cm9sIGJsb2NrCi0gKgotICogUmV0dXJucyAgICAgICAgICBOVUxMIGlmIG5vdCBmb3VuZC4gT3RoZXJ3aXNlIHBvaW50ZXIgdG8gdGhlIGNvbm5lY3Rpb24gbGluawotICogICAgICAgICAgICAgICAgICBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfQ0xDQiogZ2F0dF9jbGNiX2FsbG9jKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgdWludDhfdCBpID0gMDsKLSAgdEdBVFRfQ0xDQiogcF9jbGNiID0gTlVMTDsKLSAgdEdBVFRfSUYgZ2F0dF9pZiA9IEdBVFRfR0VUX0dBVFRfSUYoY29ubl9pZCk7Ci0gIHVpbnQ4X3QgdGNiX2lkeCA9IEdBVFRfR0VUX1RDQl9JRFgoY29ubl9pZCk7Ci0gIHRHQVRUX1RDQiogcF90Y2IgPSBnYXR0X2dldF90Y2JfYnlfaWR4KHRjYl9pZHgpOwotICB0R0FUVF9SRUcqIHBfcmVnID0gZ2F0dF9nZXRfcmVnY2IoZ2F0dF9pZik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEdBVFRfQ0xfTUFYX0xDQjsgaSsrKSB7Ci0gICAgaWYgKCFnYXR0X2NiLmNsY2JbaV0uaW5fdXNlKSB7Ci0gICAgICBwX2NsY2IgPSAmZ2F0dF9jYi5jbGNiW2ldOwotCi0gICAgICBwX2NsY2ItPmluX3VzZSA9IHRydWU7Ci0gICAgICBwX2NsY2ItPmNvbm5faWQgPSBjb25uX2lkOwotICAgICAgcF9jbGNiLT5wX3JlZyA9IHBfcmVnOwotICAgICAgcF9jbGNiLT5wX3RjYiA9IHBfdGNiOwotCi0gICAgICAvKiBVc2UgZWF0dCBvbmx5IHdoZW4gY2xpZW50cyB3YW50cyB0aGF0ICovCi0gICAgICBwX2NsY2ItPmNpZCA9IGdhdHRfdGNiX2dldF9hdHRfY2lkKCpwX3RjYiwgcF9yZWctPmVhdHRfc3VwcG9ydCk7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBwX2NsY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3RjYl9nZXRfY2lkX2F2YWlsYWJsZV9mb3JfaW5kaWNhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgaW5kaWNhdGlvbiBjYW4gYmUgc2VuZAotICoKLSAqIFJldHVybnMgICAgICAgICB0cnVlIHdoZW4gc3RhY2sgaXMgYnVzeSB3aXRoIHdhaXRpbmcgb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF90Y2JfZ2V0X2NpZF9hdmFpbGFibGVfZm9yX2luZGljYXRpb24odEdBVFRfVENCKiBwX3RjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlYXR0X3N1cHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiogaW5kaWNhdGVkX2hhbmRsZV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogY2lkX3ApIHsKLSAgaWYgKHBfdGNiLT5lYXR0ICYmIGVhdHRfc3VwcG9ydCkgewotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0KLSAgICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+R2V0Q2hhbm5lbEF2YWlsYWJsZUZvckluZGljYXRpb24ocF90Y2ItPnBlZXJfYmRhKTsKLSAgICBpZiAoY2hhbm5lbCkgewotICAgICAgKmluZGljYXRlZF9oYW5kbGVfcCA9ICZjaGFubmVsLT5pbmRpY2F0ZV9oYW5kbGVfOwotICAgICAgKmNpZF9wID0gY2hhbm5lbC0+Y2lkXzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmICghR0FUVF9IQU5ETEVfSVNfVkFMSUQocF90Y2ItPmluZGljYXRlX2hhbmRsZSkpIHsKLSAgICAqaW5kaWNhdGVkX2hhbmRsZV9wID0gJnBfdGNiLT5pbmRpY2F0ZV9oYW5kbGU7Ci0gICAgKmNpZF9wID0gcF90Y2ItPmF0dF9sY2lkOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF90Y2JfZmluZF9pbmRpY2F0ZV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGluZGljYXRpb24gY2FuIGJlIHNlbmQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgd2hlbiBpbmRpY2F0aW9uIGhhbmRsZSBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZ2F0dF90Y2JfZmluZF9pbmRpY2F0ZV9oYW5kbGUodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGluZGljYXRlZF9oYW5kbGVfcCkgewotICBpZiAoY2lkID09IHRjYi5hdHRfbGNpZCkgewotICAgICppbmRpY2F0ZWRfaGFuZGxlX3AgPSB0Y2IuaW5kaWNhdGVfaGFuZGxlOwotICAgIHRjYi5pbmRpY2F0ZV9oYW5kbGUgPSAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKHRjYi5lYXR0KSB7Ci0gICAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgICBFYXR0RXh0ZW5zaW9uOjpHZXRJbnN0YW5jZSgpLT5GaW5kRWF0dENoYW5uZWxCeUNpZCh0Y2IucGVlcl9iZGEsIGNpZCk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgICppbmRpY2F0ZWRfaGFuZGxlX3AgPSBjaGFubmVsLT5pbmRpY2F0ZV9oYW5kbGVfOwotICAgICAgY2hhbm5lbC0+aW5kaWNhdGVfaGFuZGxlXyA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3RjYl9nZXRfYXR0X2NpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGNpZCBmb3IgdGhlIEdBVFQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBBdmFpbGFibGUgQ0lECi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdWludDE2X3QgZ2F0dF90Y2JfZ2V0X2F0dF9jaWQodEdBVFRfVENCJiB0Y2IsIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIGlmIChlYXR0X3N1cHBvcnQgJiYgdGNiLmVhdHQpIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkdldENoYW5uZWxBdmFpbGFibGVGb3JDbGllbnRSZXF1ZXN0KHRjYi5wZWVyX2JkYSk7Ci0gICAgaWYgKGNoYW5uZWwpIHsKLSAgICAgIHJldHVybiBjaGFubmVsLT5jaWRfOwotICAgIH0KLSAgfQotICByZXR1cm4gdGNiLmF0dF9sY2lkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF90Y2JfZ2V0X3BheWxvYWRfc2l6ZV90eAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHBheWxvYWQgc2l6ZSBmb3IgdGhlIEdBVFQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBQYXlsb2FkIHNpemUgZm9yIHNlbmRpbmcgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBnYXR0X3RjYl9nZXRfcGF5bG9hZF9zaXplX3R4KHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQpIHsKLSAgaWYgKCF0Y2IuZWF0dCB8fCAoY2lkID09IHRjYi5hdHRfbGNpZCkpIHJldHVybiB0Y2IucGF5bG9hZF9zaXplOwotCi0gIEVhdHRDaGFubmVsKiBjaGFubmVsID0KLSAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRjYi5wZWVyX2JkYSwgY2lkKTsKLQotICByZXR1cm4gY2hhbm5lbC0+dHhfbXR1XzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfcngKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBwYXlsb2FkIHNpemUgZm9yIHRoZSBHQVRUIG9wZXJhdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgUGF5bG9hZCBzaXplIGZvciByZWNlaXZpbmcgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVpbnQxNl90IGdhdHRfdGNiX2dldF9wYXlsb2FkX3NpemVfcngodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkgewotICBpZiAoIXRjYi5lYXR0IHx8IChjaWQgPT0gdGNiLmF0dF9sY2lkKSkgcmV0dXJuIHRjYi5wYXlsb2FkX3NpemU7Ci0KLSAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlDaWQodGNiLnBlZXJfYmRhLCBjaWQpOwotCi0gIHJldHVybiBjaGFubmVsLT5yeF9tdHVfOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9jbGNiX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBkZS1hbGxvY2F0ZXMgYSBHQVRUIGNvbm5lY3Rpb24gbGluayBjb250cm9sCi0gKiAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKgotICogUmV0dXJucyAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X2NsY2JfZGVhbGxvYyh0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgaWYgKHBfY2xjYiAmJiBwX2NsY2ItPmluX3VzZSkgewotICAgIGFsYXJtX2ZyZWUocF9jbGNiLT5nYXR0X3JzcF90aW1lcl9lbnQpOwotICAgIG1lbXNldChwX2NsY2IsIDAsIHNpemVvZih0R0FUVF9DTENCKSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfZmluZF90Y2JfYnlfY2lkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuIGVtcHR5IGVudHJ5Ci0gKiAgICAgICAgICAgICAgICAgICBpbiByZWdpc3RyYXRpb24gaW5mbyB0YWJsZSBmb3IgR0FUVCBjbGllbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgICBOVUxMIGlmIG5vdCBmb3VuZC4gT3RoZXJ3aXNlIHBvaW50ZXIgdG8gdGhlIHJjYi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEdBVFRfVENCKiBnYXR0X2ZpbmRfdGNiX2J5X2NpZCh1aW50MTZfdCBsY2lkKSB7Ci0gIHVpbnQxNl90IHh4ID0gMDsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IE5VTEw7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgR0FUVF9NQVhfUEhZX0NIQU5ORUw7IHh4KyspIHsKLSAgICBpZiAoZ2F0dF9jYi50Y2JbeHhdLmluX3VzZSAmJgotICAgICAgICAoKGdhdHRfY2IudGNiW3h4XS5hdHRfbGNpZCA9PSBsY2lkKSB8fAotICAgICAgICAgKChFYXR0RXh0ZW5zaW9uOjpHZXRJbnN0YW5jZSgpLT5GaW5kRWF0dENoYW5uZWxCeUNpZChnYXR0X2NiLnRjYlt4eF0ucGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2lkKSAhPSBudWxscHRyKSkpKSB7Ci0gICAgICBwX3RjYiA9ICZnYXR0X2NiLnRjYlt4eF07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBfdGNiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9udW1fY2xjYl9ieV9iZF9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGUgZnVuY3Rpb24gc2VhcmNoZXMgYWxsIExDQiB3aXRoIG1hY3RoaW5nIGJkIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBjbGNiIGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGdhdHRfbnVtX2NsY2JfYnlfYmRfYWRkcihjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdWludDhfdCBpLCBudW0gPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBHQVRUX0NMX01BWF9MQ0I7IGkrKykgewotICAgIGlmIChnYXR0X2NiLmNsY2JbaV0uaW5fdXNlICYmIGdhdHRfY2IuY2xjYltpXS5wX3RjYi0+cGVlcl9iZGEgPT0gYmRhKSBudW0rKzsKLSAgfQotICByZXR1cm4gbnVtOwotfQotCi12b2lkIGdhdHRfc3JfY29weV9wcmVwX2NudF90b19jYmFja19jbnQodEdBVFRfVENCJiB0Y2IpIHsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgR0FUVF9NQVhfQVBQUzsgaSsrKSB7Ci0gICAgaWYgKHRjYi5wcmVwX2NudFtpXSkgewotICAgICAgdGNiLnNyX2NtZC5jYmFja19jbnRbaV0gPSAxOwotICAgIH0KLSAgfQotfQotCi0vKiBHZXQgb3V0c3RhbmRpbmcgc2VydmVyIGNvbW1hbmQgcG9pbnRlciBieSB0aGUgdHJhbnNhY3Rpb24gaWQgKi8KLXRHQVRUX1NSX0NNRCogZ2F0dF9zcl9nZXRfY21kX2J5X3RyYW5zX2lkKHRHQVRUX1RDQiogcF90Y2IsIHVpbnQzMl90IHRyYW5zX2lkKSB7Ci0gIGlmIChwX3RjYi0+c3JfY21kLnRyYW5zX2lkID09IHRyYW5zX2lkKSByZXR1cm4gJnBfdGNiLT5zcl9jbWQ7Ci0KLSAgaWYgKCFwX3RjYi0+ZWF0dCkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlUcmFuc0lkKHBfdGNiLT5wZWVyX2JkYSwgdHJhbnNfaWQpOwotICBpZiAoIWNoYW5uZWwpIHJldHVybiBudWxscHRyOwotCi0gIHJldHVybiAmY2hhbm5lbC0+c2VydmVyX291dHN0YW5kaW5nX2NtZF87Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZ2F0dF9zcl9pc19jYmFja19jbnRfemVybwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGFsbCBMQ0Igd2l0aCBtYWN0aGluZyBiZCBhZGRyZXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBUcnVlIGlmIHRoZXRvdGFsIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGNvdW50IGlzIHplcm8KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBnYXR0X3NyX2lzX2NiYWNrX2NudF96ZXJvKHRHQVRUX1RDQiYgdGNiKSB7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEdBVFRfTUFYX0FQUFM7IGkrKykgewotICAgIGlmICh0Y2Iuc3JfY21kLmNiYWNrX2NudFtpXSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfaXNfcHJlcF9jbnRfemVybwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgdGhlIHByZXBhcmUgd3JpdGUgcmVxdWVzdCBjb3VudCBpcyB6ZXJvIG9yIG5vdAotICoKLSAqIFJldHVybnMgICAgICAgICAgVHJ1ZSBubyBwcmVwYXJlIHdyaXRlIHJlcXVlc3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBnYXR0X3NyX2lzX3ByZXBfY250X3plcm8odEdBVFRfVENCJiB0Y2IpIHsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgR0FUVF9NQVhfQVBQUzsgaSsrKSB7Ci0gICAgaWYgKHRjYi5wcmVwX2NudFtpXSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfcmVzZXRfY2JhY2tfY250Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXNldCB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgY291bnQgdG8gemVybwotICoKLSAqIFJldHVybnMgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZ2F0dF9zcl9yZXNldF9jYmFja19jbnQodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkgewotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBHQVRUX01BWF9BUFBTOyBpKyspIHsKLSAgICBpZiAoY2lkID09IHRjYi5hdHRfbGNpZCkgewotICAgICAgdGNiLnNyX2NtZC5jYmFja19jbnRbaV0gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlDaWQodGNiLnBlZXJfYmRhLCBjaWQpOwotICAgICAgY2hhbm5lbC0+c2VydmVyX291dHN0YW5kaW5nX2NtZF8uY2JhY2tfY250W2ldID0gMDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfcmVzZXRfcHJlcF9jbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgUmVzZXQgdGhlIHByZXAgd3JpdGUgY291bnQgdG8gemVybwotICoKLSAqIFJldHVybnMgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3NyX3Jlc2V0X3ByZXBfY250KHRHQVRUX1RDQiYgdGNiKSB7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEdBVFRfTUFYX0FQUFM7IGkrKykgewotICAgIHRjYi5wcmVwX2NudFtpXSA9IDA7Ci0gIH0KLX0KLQotLyogR2V0IHBvaW50ZXIgdG8gc2VydmVyIGNvbW1hbmQgb24gZ2l2ZW4gY2lkICovCi10R0FUVF9TUl9DTUQqIGdhdHRfc3JfZ2V0X2NtZF9ieV9jaWQodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkgewotICB0R0FUVF9TUl9DTUQqIHNyX2NtZF9wOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIGNpZDogIiA8PCBpbnQoY2lkKSA8PCAiIHRjYiBjaWQgIiA8PCB0Y2IuYXR0X2xjaWQ7Ci0gIGlmIChjaWQgPT0gdGNiLmF0dF9sY2lkKSB7Ci0gICAgc3JfY21kX3AgPSAmdGNiLnNyX2NtZDsKLSAgfSBlbHNlIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRjYi5wZWVyX2JkYSwgY2lkKTsKLSAgICBzcl9jbWRfcCA9ICZjaGFubmVsLT5zZXJ2ZXJfb3V0c3RhbmRpbmdfY21kXzsKLSAgfQotCi0gIHJldHVybiBzcl9jbWRfcDsKLX0KLQotLyogR2V0IHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgb2Ygb3V0c3RhbmRpbmcgbXVsdGkgcmVxdWVzdCAqLwotdEdBVFRfUkVBRF9NVUxUSSogZ2F0dF9zcl9nZXRfcmVhZF9tdWx0aSh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkKSB7Ci0gIHRHQVRUX1JFQURfTVVMVEkqIHJlYWRfbXVsdGlfcDsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBjaWQ6ICIgPDwgaW50KGNpZCkgPDwgIiB0Y2IgY2lkICIgPDwgdGNiLmF0dF9sY2lkOwotICBpZiAoY2lkID09IHRjYi5hdHRfbGNpZCkgewotICAgIHJlYWRfbXVsdGlfcCA9ICZ0Y2Iuc3JfY21kLm11bHRpX3JlcTsKLSAgfSBlbHNlIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRjYi5wZWVyX2JkYSwgY2lkKTsKLSAgICByZWFkX211bHRpX3AgPSAmY2hhbm5lbC0+c2VydmVyX291dHN0YW5kaW5nX2NtZF8ubXVsdGlfcmVxOwotICB9Ci0KLSAgcmV0dXJuIHJlYWRfbXVsdGlfcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGdhdHRfc3JfdXBkYXRlX2NiYWNrX2NudAotICoKLSAqIERlc2NyaXB0aW9uICAgIFVwZGF0ZSB0aGUgdGVoIGFwcGxpY2FpdG9uIGNhbGxiYWNrIGNvdW50Ci0gKgotICogUmV0dXJucyAgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfc3JfdXBkYXRlX2NiYWNrX2NudCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCB0R0FUVF9JRiBnYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmMsIGJvb2wgaXNfcmVzZXRfZmlyc3QpIHsKLSAgdWludDhfdCBpZHggPSAoKHVpbnQ4X3QpZ2F0dF9pZikgLSAxOwotICB0R0FUVF9TUl9DTUQqIHNyX2NtZF9wOwotCi0gIGlmIChjaWQgPT0gdGNiLmF0dF9sY2lkKSB7Ci0gICAgc3JfY21kX3AgPSAmdGNiLnNyX2NtZDsKLSAgfSBlbHNlIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRjYi5wZWVyX2JkYSwgY2lkKTsKLSAgICBzcl9jbWRfcCA9ICZjaGFubmVsLT5zZXJ2ZXJfb3V0c3RhbmRpbmdfY21kXzsKLSAgfQotCi0gIGlmIChpc19yZXNldF9maXJzdCkgewotICAgIGdhdHRfc3JfcmVzZXRfY2JhY2tfY250KHRjYiwgY2lkKTsKLSAgfQotICBpZiAoaXNfaW5jKSB7Ci0gICAgc3JfY21kX3AtPmNiYWNrX2NudFtpZHhdKys7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHNyX2NtZF9wLT5jYmFja19jbnRbaWR4XSkgewotICAgICAgc3JfY21kX3AtPmNiYWNrX2NudFtpZHhdLS07Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X3NyX3VwZGF0ZV9wcmVwX2NudAotICoKLSAqIERlc2NyaXB0aW9uICAgIFVwZGF0ZSB0aGUgdGVoIHByZXBhcmUgd3JpdGUgcmVxdWVzdCBjb3VudAotICoKLSAqIFJldHVybnMgICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnYXR0X3NyX3VwZGF0ZV9wcmVwX2NudCh0R0FUVF9UQ0ImIHRjYiwgdEdBVFRfSUYgZ2F0dF9pZiwgYm9vbCBpc19pbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzZXRfZmlyc3QpIHsKLSAgdWludDhfdCBpZHggPSAoKHVpbnQ4X3QpZ2F0dF9pZikgLSAxOwotCi0gIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKAotICAgICAgIiVzIHRjYiBpZHg9JWQgZ2F0dF9pZj0lZCBpc19pbmM9JWQgaXNfcmVzZXRfZmlyc3Q9JWQiLCBfX2Z1bmNfXywKLSAgICAgIHRjYi50Y2JfaWR4LCBnYXR0X2lmLCBpc19pbmMsIGlzX3Jlc2V0X2ZpcnN0KTsKLQotICBpZiAoaXNfcmVzZXRfZmlyc3QpIHsKLSAgICBnYXR0X3NyX3Jlc2V0X3ByZXBfY250KHRjYik7Ci0gIH0KLSAgaWYgKGlzX2luYykgewotICAgIHRjYi5wcmVwX2NudFtpZHhdKys7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHRjYi5wcmVwX2NudFtpZHhdKSB7Ci0gICAgICB0Y2IucHJlcF9jbnRbaWR4XS0tOwotICAgIH0KLSAgfQotfQotCi0vKiogQ2FuY2VsIExFIENyZWF0ZSBDb25uZWN0aW9uIHJlcXVlc3QgKi8KLWJvb2wgZ2F0dF9jYW5jZWxfb3Blbih0R0FUVF9JRiBnYXR0X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfYWRkcihiZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmICghcF90Y2IpIHJldHVybiB0cnVlOwotCi0gIGlmIChnYXR0X2dldF9jaF9zdGF0ZShwX3RjYikgPT0gR0FUVF9DSF9PUEVOKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBsaW5rIGNvbm5lY3RlZCBUb28gbGF0ZSB0byBjYW5jZWwiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGdhdHRfdXBkYXRlX2FwcF91c2VfbGlua19mbGFnKGdhdHRfaWYsIHBfdGNiLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChwX3RjYi0+YXBwX2hvbGRfbGluay5lbXB0eSgpKSBnYXR0X2Rpc2Nvbm5lY3QocF90Y2IpOwotCi0gIGNvbm5lY3Rpb25fbWFuYWdlcjo6ZGlyZWN0X2Nvbm5lY3RfcmVtb3ZlKGdhdHRfaWYsIGJkYSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiogRW5xdWV1ZSB0aGlzIGNvbW1hbmQgKi8KLXZvaWQgZ2F0dF9jbWRfZW5xKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IsIGJvb2wgdG9fc2VuZCwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgQlRfSERSKiBwX2J1ZikgewotICB0R0FUVF9DTURfUSBjbWQ7Ci0gIGNtZC50b19zZW5kID0gdG9fc2VuZDsgLyogd2FpdGluZyB0byBiZSBzZW50ICovCi0gIGNtZC5vcF9jb2RlID0gb3BfY29kZTsKLSAgY21kLnBfY21kID0gcF9idWY7Ci0gIGNtZC5wX2NsY2IgPSBwX2NsY2I7Ci0gIGNtZC5jaWQgPSBwX2NsY2ItPmNpZDsKLQotICBpZiAocF9jbGNiLT5jaWQgPT0gdGNiLmF0dF9sY2lkKSB7Ci0gICAgdGNiLmNsX2NtZF9xLnB1c2goY21kKTsKLSAgfSBlbHNlIHsKLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIEVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCktPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRjYi5wZWVyX2JkYSwgY21kLmNpZCk7Ci0gICAgQ0hFQ0soY2hhbm5lbCk7Ci0gICAgY2hhbm5lbC0+Y2xfY21kX3FfLnB1c2goY21kKTsKLSAgfQotfQotCi0vKiogZGVxdWV1ZSB0aGUgY29tbWFuZCBpbiB0aGUgY2xpZW50IENDQiBjb21tYW5kIHF1ZXVlICovCi10R0FUVF9DTENCKiBnYXR0X2NtZF9kZXF1ZXVlKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHVpbnQ4X3QqIHBfb3BfY29kZSkgewotICBzdGQ6OnF1ZXVlPHRHQVRUX0NNRF9RPiogY2xfY21kX3FfcDsKLQotICBpZiAoY2lkID09IHRjYi5hdHRfbGNpZCkgewotICAgIGNsX2NtZF9xX3AgPSAmdGNiLmNsX2NtZF9xOwotICB9IGVsc2UgewotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0KLSAgICAgICAgRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKS0+RmluZEVhdHRDaGFubmVsQnlDaWQodGNiLnBlZXJfYmRhLCBjaWQpOwotICAgIENIRUNLKGNoYW5uZWwpOwotICAgIGNsX2NtZF9xX3AgPSAmY2hhbm5lbC0+Y2xfY21kX3FfOwotICB9Ci0KLSAgaWYgKGNsX2NtZF9xX3AtPmVtcHR5KCkpIHJldHVybiBudWxscHRyOwotCi0gIHRHQVRUX0NNRF9RIGNtZCA9IGNsX2NtZF9xX3AtPmZyb250KCk7Ci0gIHRHQVRUX0NMQ0IqIHBfY2xjYiA9IGNtZC5wX2NsY2I7Ci0gICpwX29wX2NvZGUgPSBjbWQub3BfY29kZTsKLSAgcF9jbGNiLT5jaWQgPSBjaWQ7Ci0gIGNsX2NtZF9xX3AtPnBvcCgpOwotCi0gIHJldHVybiBwX2NsY2I7Ci19Ci0KLS8qKiBTZW5kIG91dCB0aGUgQVRUIG1lc3NhZ2UgZm9yIHdyaXRlICovCi10R0FUVF9TVEFUVVMgZ2F0dF9zZW5kX3dyaXRlX21zZyh0R0FUVF9UQ0ImIHRjYiwgdEdBVFRfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcF9jb2RlLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwgdWludDhfdCogcF9kYXRhKSB7Ci0gIHRHQVRUX0NMX01TRyBtc2c7Ci0gIG1zZy5hdHRyX3ZhbHVlLmhhbmRsZSA9IGhhbmRsZTsKLSAgbXNnLmF0dHJfdmFsdWUubGVuID0gbGVuOwotICBtc2cuYXR0cl92YWx1ZS5vZmZzZXQgPSBvZmZzZXQ7Ci0gIG1lbWNweShtc2cuYXR0cl92YWx1ZS52YWx1ZSwgcF9kYXRhLCBsZW4pOwotCi0gIC8qIHdyaXRlIGJ5IGhhbmRsZSAqLwotICByZXR1cm4gYXR0cF9zZW5kX2NsX21zZyh0Y2IsIHBfY2xjYiwgb3BfY29kZSwgJm1zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2VuZF9vcGVyYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZW5kcyBhIGRpc2NvdmVyeSwgc2VuZCBjYWxsYmFjayBhbmQgZmluYWxpemUKLSAqICAgICAgICAgICAgICAgICAgc29tZSBjb250cm9sIHZhbHVlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgMTYgYml0cyB1dWlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdhdHRfZW5kX29wZXJhdGlvbih0R0FUVF9DTENCKiBwX2NsY2IsIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHZvaWQqIHBfZGF0YSkgewotICB0R0FUVF9DTF9DT01QTEVURSBjYl9kYXRhOwotICB0R0FUVF9DTVBMX0NCQUNLKiBwX2NtcGxfY2IgPQotICAgICAgKHBfY2xjYi0+cF9yZWcpID8gcF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfY21wbF9jYiA6IE5VTEw7Ci0gIHRHQVRUQ19PUFRZUEUgb3AgPSBwX2NsY2ItPm9wZXJhdGlvbjsKLSAgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSA9IEdBVFRfRElTQ19NQVg7Ci0gIHRHQVRUX0RJU0NfQ01QTF9DQiogcF9kaXNjX2NtcGxfY2IgPQotICAgICAgKHBfY2xjYi0+cF9yZWcpID8gcF9jbGNiLT5wX3JlZy0+YXBwX2NiLnBfZGlzY19jbXBsX2NiIDogTlVMTDsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgdWludDhfdCBvcGVyYXRpb247Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiIHN0YXR1cz0lZCBvcD0lZCBzdWJ0eXBlPSVkIiwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NsY2ItPm9wZXJhdGlvbiwgcF9jbGNiLT5vcF9zdWJ0eXBlKTsKLSAgbWVtc2V0KCZjYl9kYXRhLmF0dF92YWx1ZSwgMCwgc2l6ZW9mKHRHQVRUX1ZBTFVFKSk7Ci0KLSAgaWYgKHBfY21wbF9jYiAhPSBOVUxMICYmIHBfY2xjYi0+b3BlcmF0aW9uICE9IDApIHsKLSAgICBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1JFQUQpIHsKLSAgICAgIGNiX2RhdGEuYXR0X3ZhbHVlLmhhbmRsZSA9IHBfY2xjYi0+c19oYW5kbGU7Ci0gICAgICBjYl9kYXRhLmF0dF92YWx1ZS5sZW4gPSBwX2NsY2ItPmNvdW50ZXI7Ci0KLSAgICAgIGlmIChwX2RhdGEgJiYgcF9jbGNiLT5jb3VudGVyKQotICAgICAgICBtZW1jcHkoY2JfZGF0YS5hdHRfdmFsdWUudmFsdWUsIHBfZGF0YSwgY2JfZGF0YS5hdHRfdmFsdWUubGVuKTsKLSAgICB9Ci0KLSAgICBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX1dSSVRFKSB7Ci0gICAgICBtZW1zZXQoJmNiX2RhdGEuYXR0X3ZhbHVlLCAwLCBzaXplb2YodEdBVFRfVkFMVUUpKTsKLSAgICAgIGNiX2RhdGEuaGFuZGxlID0gY2JfZGF0YS5hdHRfdmFsdWUuaGFuZGxlID0gcF9jbGNiLT5zX2hhbmRsZTsKLSAgICAgIGlmIChwX2NsY2ItPm9wX3N1YnR5cGUgPT0gR0FUVF9XUklURV9QUkVQQVJFKSB7Ci0gICAgICAgIGlmIChwX2RhdGEpIHsKLSAgICAgICAgICBjYl9kYXRhLmF0dF92YWx1ZSA9ICooKHRHQVRUX1ZBTFVFKilwX2RhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZMT0coMSkgPDwgIlJjdiBQcmVwYXJlIHdyaXRlIHJzcCBidXQgbm8gZGF0YSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX0NPTkZJRykKLSAgICAgIGNiX2RhdGEubXR1ID0gcF9jbGNiLT5wX3RjYi0+cGF5bG9hZF9zaXplOwotCi0gICAgaWYgKHBfY2xjYi0+b3BlcmF0aW9uID09IEdBVFRDX09QVFlQRV9ESVNDT1ZFUlkpIHsKLSAgICAgIGRpc2NfdHlwZSA9IHN0YXRpY19jYXN0PHRHQVRUX0RJU0NfVFlQRT4ocF9jbGNiLT5vcF9zdWJ0eXBlKTsKLSAgICB9Ci0gIH0KLQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jbGNiLT5wX2F0dHJfYnVmKTsKLQotICBvcGVyYXRpb24gPSBwX2NsY2ItPm9wZXJhdGlvbjsKLSAgY29ubl9pZCA9IHBfY2xjYi0+Y29ubl9pZDsKLSAgZ2F0dF9zdG9wX3JzcF90aW1lcihwX2NsY2IpOwotCi0gIGdhdHRfY2xjYl9kZWFsbG9jKHBfY2xjYik7Ci0KLSAgaWYgKHBfZGlzY19jbXBsX2NiICYmIChvcCA9PSBHQVRUQ19PUFRZUEVfRElTQ09WRVJZKSkKLSAgICAoKnBfZGlzY19jbXBsX2NiKShjb25uX2lkLCBkaXNjX3R5cGUsIHN0YXR1cyk7Ci0gIGVsc2UgaWYgKHBfY21wbF9jYiAmJiBvcCkKLSAgICAoKnBfY21wbF9jYikoY29ubl9pZCwgb3AsIHN0YXR1cywgJmNiX2RhdGEpOwotICBlbHNlCi0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICI6IG5vdCBzZW50IG91dCBvcD0lZCBwX2Rpc2NfY21wbF9jYjolcCBwX2NtcGxfY2I6JXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLCBwX2Rpc2NfY21wbF9jYiwgcF9jbXBsX2NiKTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSBjb250cm9sIGJsb2NrcyB3aGVuIEwyQ0FQIGNoYW5uZWwgZGlzY29ubmVjdCAqLwotdm9pZCBnYXR0X2NsZWFudXBfdXBvbl9kaXNjKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX187Ci0KLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfYWRkcihiZGEsIHRyYW5zcG9ydCk7Ci0gIGlmICghcF90Y2IpIHJldHVybjsKLQotICBnYXR0X3NldF9jaF9zdGF0ZShwX3RjYiwgR0FUVF9DSF9DTE9TRSk7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEdBVFRfQ0xfTUFYX0xDQjsgaSsrKSB7Ci0gICAgdEdBVFRfQ0xDQiogcF9jbGNiID0gJmdhdHRfY2IuY2xjYltpXTsKLSAgICBpZiAoIXBfY2xjYi0+aW5fdXNlIHx8IHBfY2xjYi0+cF90Y2IgIT0gcF90Y2IpIGNvbnRpbnVlOwotCi0gICAgZ2F0dF9zdG9wX3JzcF90aW1lcihwX2NsY2IpOwotICAgIFZMT0coMSkgPDwgImZvdW5kIHBfY2xjYiBjb25uX2lkPSIgPDwgK3BfY2xjYi0+Y29ubl9pZDsKLSAgICBpZiAocF9jbGNiLT5vcGVyYXRpb24gPT0gR0FUVENfT1BUWVBFX05PTkUpIHsKLSAgICAgIGdhdHRfY2xjYl9kZWFsbG9jKHBfY2xjYik7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBnYXR0X2VuZF9vcGVyYXRpb24ocF9jbGNiLCBHQVRUX0VSUk9SLCBOVUxMKTsKLSAgfQotCi0gIGFsYXJtX2ZyZWUocF90Y2ItPmluZF9hY2tfdGltZXIpOwotICBwX3RjYi0+aW5kX2Fja190aW1lciA9IE5VTEw7Ci0gIGFsYXJtX2ZyZWUocF90Y2ItPmNvbmZfdGltZXIpOwotICBwX3RjYi0+Y29uZl90aW1lciA9IE5VTEw7Ci0gIGdhdHRfZnJlZV9wZW5kaW5nX2luZChwX3RjYik7Ci0gIGZpeGVkX3F1ZXVlX2ZyZWUocF90Y2ItPnNyX2NtZC5tdWx0aV9yc3BfcSwgTlVMTCk7Ci0gIHBfdGNiLT5zcl9jbWQubXVsdGlfcnNwX3EgPSBOVUxMOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEdBVFRfTUFYX0FQUFM7IGkrKykgewotICAgIHRHQVRUX1JFRyogcF9yZWcgPSAmZ2F0dF9jYi5jbF9yY2JbaV07Ci0gICAgaWYgKHBfcmVnLT5pbl91c2UgJiYgcF9yZWctPmFwcF9jYi5wX2Nvbm5fY2IpIHsKLSAgICAgIHVpbnQxNl90IGNvbm5faWQgPSBHQVRUX0NSRUFURV9DT05OX0lEKHBfdGNiLT50Y2JfaWR4LCBwX3JlZy0+Z2F0dF9pZik7Ci0gICAgICAoKnBfcmVnLT5hcHBfY2IucF9jb25uX2NiKShwX3JlZy0+Z2F0dF9pZiwgYmRhLCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0dhdHREaXNjb25uZWN0ZWQsIHJlYXNvbiwgdHJhbnNwb3J0KTsKLSAgICB9Ci0gIH0KLQotICAqcF90Y2IgPSB0R0FUVF9UQ0IoKTsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBleGl0IjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBnYXR0X2RiZ19yZXFfb3BfbmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2V0IG9wIGNvZGUgZGVzY3JpcHRpb24gbmFtZSwgZm9yIGRlYnVnIGluZm9ybWF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDhfdCAqOiBuYW1lIG9mIHRoZSBvcGVyYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QqIGdhdHRfZGJnX29wX25hbWUodWludDhfdCBvcF9jb2RlKSB7Ci0gIHVpbnQ4X3QgcHNlZHVvX29wX2NvZGVfaWR4ID0gb3BfY29kZSAmICh+R0FUVF9XUklURV9DTURfTUFTSyk7Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9DTURfV1JJVEUpIHsKLSAgICBwc2VkdW9fb3BfY29kZV9pZHggPSAweDE0OyAvKiBqdXN0IGFuIGluZGV4IHRvIG9wX2NvZGVfbmFtZSAqLwotICB9Ci0KLSAgaWYgKG9wX2NvZGUgPT0gR0FUVF9TSUdOX0NNRF9XUklURSkgewotICAgIHBzZWR1b19vcF9jb2RlX2lkeCA9IDB4MTU7IC8qIGp1c3QgYW4gaW5kZXggdG8gb3BfY29kZV9uYW1lICovCi0gIH0KLQotICBpZiAocHNlZHVvX29wX2NvZGVfaWR4IDw9IEdBVFRfT1BfQ09ERV9NQVgpCi0gICAgcmV0dXJuICh1aW50OF90KilvcF9jb2RlX25hbWVbcHNlZHVvX29wX2NvZGVfaWR4XTsKLSAgZWxzZQotICAgIHJldHVybiAodWludDhfdCopIk9wIENvZGUgRXhjZWVkIE1heCI7Ci19Ci0KLS8qKiBSZW1vdmUgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSBmb3IgdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGRldmljZSAqLwotYm9vbCBnYXR0X2F1dG9fY29ubmVjdF9kZXZfcmVtb3ZlKHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEdBVFRfVENCKiBwX3RjYiA9IGdhdHRfZmluZF90Y2JfYnlfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBpZiAocF90Y2IpIGdhdHRfdXBkYXRlX2FwcF91c2VfbGlua19mbGFnKGdhdHRfaWYsIHBfdGNiLCBmYWxzZSwgZmFsc2UpOwotICByZXR1cm4gY29ubmVjdGlvbl9tYW5hZ2VyOjpiYWNrZ3JvdW5kX2Nvbm5lY3RfcmVtb3ZlKGdhdHRfaWYsIGJkX2FkZHIpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svaGNpYy9oY2libGVjbWRzLmNjIGIvc3RhY2svaGNpYy9oY2libGVjbWRzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWYzNjU1Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2hjaWMvaGNpYmxlY21kcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb24gb2YgdGhlIEhDSUMgdW5pdCB0byBmb3JtYXQgYW5kIHNlbmQgSENJCi0gKiAgY29tbWFuZHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Yml0c2V0PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiaGNpZGVmcy5oIgotI2luY2x1ZGUgImhjaW1zZ3MuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJMRSBDb21tYW5kcwotICogICAgICBOb3RlOiAibG9jYWxfY29udHJvbGxlcl9pZCIgaXMgZm9yIHRyYW5zcG9ydCwgbm90IGNvdW50ZWQgaW4gSENJCi0gKiAgICAgICAgICAgICBtZXNzYWdlIHNpemUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEhDSUNfQkxFX1JBTkRfRElfU0laRSA4Ci0jZGVmaW5lIEhDSUNfQkxFX0lSS19TSVpFIDE2Ci0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1NFVF9VU0VEX0ZFQVRfQ01EIDgKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1JBTkRPTV9BRERSX0NNRCA2Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfQURWX1BBUkFNUyAxNQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX1NDQU5fUlNQIDMxCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9BRFZfRU5BQkxFIDEKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX1BBUkFNIDcKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX0VOQUJMRSAyCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfQ1JFQVRFX0xMX0NPTk4gMjUKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9DUkVBVEVfQ09OTl9DQU5DRUwgMAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQ0xFQVJfQUNDRVBUTElTVCAwCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9BRERfQUNDRVBUTElTVCA3Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9SRU1PVkVfQUNDRVBUTElTVCA3Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfVVBEX0xMX0NPTk5fUEFSQU1TIDE0Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9TRVRfSE9TVF9DSE5MX0NMQVNTIDUKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JFQURfQ0hOTF9NQVAgMgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JFQURfUkVNT1RFX0ZFQVQgMgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX0VOQ1JZUFQgMzIKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1dSSVRFX0xFX0hPU1RfU1VQUE9SVEVEIDIKLQotI2RlZmluZSBIQ0lDX0JMRV9SQU5EX0RJX1NJWkUgOAotI2RlZmluZSBIQ0lDX0JMRV9FTkNSWVBUX0tFWV9TSVpFIDE2Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfU1RBUlRfRU5DIFwKLSAgKDQgKyBIQ0lDX0JMRV9SQU5EX0RJX1NJWkUgKyBIQ0lDX0JMRV9FTkNSWVBUX0tFWV9TSVpFKQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfTFRLX1JFUV9SRVBMWSAoMiArIEhDSUNfQkxFX0VOQ1JZUFRfS0VZX1NJWkUpCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9MVEtfUkVRX05FR19SRVBMWSAyCi0jZGVmaW5lIEhDSUNfQkxFX0NITkxfTUFQX1NJWkUgNQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBIDMxCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9BRERfREVWX1JFU09MVklOR19MSVNUICg3ICsgSENJQ19CTEVfSVJLX1NJWkUgKiAyKQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JNX0RFVl9SRVNPTFZJTkdfTElTVCA3Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfU0VUX1BSSVZBQ1lfTU9ERSA4Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfQ0xFQVJfUkVTT0xWSU5HX0xJU1QgMAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JFQURfUkVTT0xWSU5HX0xJU1RfU0laRSAwCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9SRVNPTFZBQkxFX0FERFJfUEVFUiA3Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9SRVNPTFZBQkxFX0FERFJfTE9DQUwgNwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NFVF9BRERSX1JFU09MVVRJT05fRU5BQkxFIDEKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUkFORF9QUklWX0FERFJfVElNT1VUIDIKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JFQURfUEhZIDIKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfREVGQVVMVF9QSFkgMwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NFVF9QSFkgNwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX0VOSF9SWF9URVNUIDMKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9FTkhfVFhfVEVTVCA0Ci0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfREFUQV9MRU5HVEggNgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0VYVEVOREVEX1NDQU5fUEFSQU0gMTEKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JDX1BBUkFNX1JFUV9SRVBMWSAxNAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JDX1BBUkFNX1JFUV9ORUdfUkVQTFkgMwotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQyAxNAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkNfQ0FOQ0VMIDAKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1BFUklPRElDX0FEVkVSVElTSU5HX1RFUk1JTkFURV9TWU5DIDIKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0FERF9ERVZJQ0VfVE9fUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNUIDgKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JFTU9WRV9ERVZJQ0VfRlJPTV9QRVJJT0RJQ19BRFZFUlRJU0VSX0xJU1QgOAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQ0xFQVJfUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNUIDAKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JFQURfUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNUX1NJWkUgMAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1JFQ0VJVkVfRU5BQkxFIDMKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVIgNgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU0VUX0lORk9fVFJBTlNGRVIgNQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU1TIDgKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1NFVF9ERUZBVUxUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU1TIDgKLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfbG9jYWxfdXNlZF9mZWF0KHVpbnQ4X3QgZmVhdF9zZXRbOF0pIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfU0VUX1VTRURfRkVBVF9DTUQ7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9XUklURV9MT0NBTF9TUFRfRkVBVCk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwcCwgZmVhdF9zZXQsIEhDSUNfUEFSQU1fU0laRV9TRVRfVVNFRF9GRUFUX0NNRCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kb21fYWRkcihjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYmRhKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1JBTkRPTV9BRERSX0NNRDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1dSSVRFX1JBTkRPTV9BRERSKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUkFORE9NX0FERFJfQ01EKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCByYW5kb21fYmRhKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfd3JpdGVfYWR2X3BhcmFtcyh1aW50MTZfdCBhZHZfaW50X21pbiwgdWludDE2X3QgYWR2X2ludF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZV9kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgZGlyZWN0X2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2X2ZpbHRlcl9wb2xpY3kpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9QQVJBTVM7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9XUklURV9BRFZfUEFSQU1TKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9QQVJBTVMpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGFkdl9pbnRfbWluKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgYWR2X2ludF9tYXgpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkdl90eXBlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZGRyX3R5cGVfb3duKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZGRyX3R5cGVfZGlyKTsKLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgZGlyZWN0X2JkYSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgY2hhbm5lbF9tYXApOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkdl9maWx0ZXJfcG9saWN5KTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfYWR2X2NobmxfdHhfcG93ZXIodm9pZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NNRDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1JFQURfQURWX0NITkxfVFhfUE9XRVIpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NNRCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZGF0YSh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBICsgMTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1dSSVRFX0FEVl9EQVRBKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBICsgMSk7Ci0KLSAgbWVtc2V0KHBwLCAwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9EQVRBKTsKLQotICBpZiAocF9kYXRhICE9IE5VTEwgJiYgZGF0YV9sZW4gPiAwKSB7Ci0gICAgaWYgKGRhdGFfbGVuID4gSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9BRFZfREFUQSkKLSAgICAgIGRhdGFfbGVuID0gSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9BRFZfREFUQTsKLQotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZGF0YV9sZW4pOwotCi0gICAgQVJSQVlfVE9fU1RSRUFNKHBwLCBwX2RhdGEsIGRhdGFfbGVuKTsKLSAgfQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX3JzcF9kYXRhKHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIHBfc2Nhbl9yc3ApIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX1NDQU5fUlNQICsgMTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1dSSVRFX1NDQU5fUlNQX0RBVEEpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfU0NBTl9SU1AgKyAxKTsKLQotICBtZW1zZXQocHAsIDAsIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfU0NBTl9SU1ApOwotCi0gIGlmIChwX3NjYW5fcnNwICE9IE5VTEwgJiYgZGF0YV9sZW4gPiAwKSB7Ci0gICAgaWYgKGRhdGFfbGVuID4gSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX1JTUCkKLSAgICAgIGRhdGFfbGVuID0gSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX1JTUDsKLQotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZGF0YV9sZW4pOwotCi0gICAgQVJSQVlfVE9fU1RSRUFNKHBwLCBwX3NjYW5fcnNwLCBkYXRhX2xlbik7Ci0gIH0KLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2Fkdl9lbmFibGUodWludDhfdCBhZHZfZW5hYmxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1dSSVRFX0FEVl9FTkFCTEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9XUklURV9BRFZfRU5BQkxFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfQURWX0VOQUJMRSk7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZHZfZW5hYmxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX3BhcmFtcyh1aW50OF90IHNjYW5fdHlwZSwgdWludDE2X3Qgc2Nhbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzY2FuX3dpbiwgdWludDhfdCBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX2ZpbHRlcl9wb2xpY3kpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX1NDQU5fUEFSQU07Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9XUklURV9TQ0FOX1BBUkFNUyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX1BBUkFNKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIHNjYW5fdHlwZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHNjYW5faW50KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc2Nhbl93aW4pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkZHJfdHlwZV9vd24pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHNjYW5fZmlsdGVyX3BvbGljeSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX2VuYWJsZSh1aW50OF90IHNjYW5fZW5hYmxlLCB1aW50OF90IGR1cGxpY2F0ZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfU0NBTl9FTkFCTEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9XUklURV9TQ0FOX0VOQUJMRSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX0VOQUJMRSk7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzY2FuX2VuYWJsZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgZHVwbGljYXRlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLS8qIGxpbmsgbGF5ZXIgY29ubmVjdGlvbiBtYW5hZ2VtZW50IGNvbW1hbmRzICovCi12b2lkIGJ0c25kX2hjaWNfYmxlX2NyZWF0ZV9sbF9jb25uKHVpbnQxNl90IHNjYW5faW50LCB1aW50MTZfdCBzY2FuX3dpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbml0X2ZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGFfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlX293biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pbnRfbWluLCB1aW50MTZfdCBjb25uX2ludF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9DUkVBVEVfTExfQ09OTjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX0NSRUFURV9MTF9DT05OKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX0NSRUFURV9MTF9DT05OKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBzY2FuX2ludCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHNjYW5fd2luKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBpbml0X2ZpbHRlcl9wb2xpY3kpOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWRkcl90eXBlX3BlZXIpOwotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZGFfcGVlcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWRkcl90eXBlX293bik7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9pbnRfbWluKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9pbnRfbWF4KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9sYXRlbmN5KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl90aW1lb3V0KTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBtaW5fY2VfbGVuKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWF4X2NlX2xlbik7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX2NyZWF0ZV9jb25uX2NhbmNlbCh2b2lkKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9DUkVBVEVfQ09OTl9DQU5DRUw7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9DUkVBVEVfQ09OTl9DQU5DRUwpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfQ1JFQVRFX0NPTk5fQ0FOQ0VMKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfY2xlYXJfYWNjZXB0bGlzdCgKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9DTEVBUl9BQ0NFUFRMSVNULCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX2FkZF9hY2NlcHRsaXN0KAotICAgIHVpbnQ4X3QgYWRkcl90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgdWludDhfdCBwYXJhbVtIQ0lDX1BBUkFNX1NJWkVfQUREX0FDQ0VQVExJU1RdOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWRkcl90eXBlKTsKLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRhKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9BRERfQUNDRVBUTElTVCwgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJQ19QQVJBTV9TSVpFX0FERF9BQ0NFUFRMSVNULCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9yZW1vdmVfZnJvbV9hY2NlcHRsaXN0KAotICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIHVpbnQ4X3QgcGFyYW1bSENJQ19QQVJBTV9TSVpFX1JFTU9WRV9BQ0NFUFRMSVNUXTsKLSAgdWludDhfdCogcHAgPSBwYXJhbTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkZHJfdHlwZSk7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkYSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihGUk9NX0hFUkUsIEhDSV9CTEVfUkVNT1ZFX0FDQ0VQVExJU1QsIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDSUNfUEFSQU1fU0laRV9SRU1PVkVfQUNDRVBUTElTVCwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfdXBkX2xsX2Nvbm5fcGFyYW1zKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY29ubl9pbnRfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pbnRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1VQRF9MTF9DT05OX1BBUkFNUzsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1VQRF9MTF9DT05OX1BBUkFNUyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9VUERfTExfQ09OTl9QQVJBTVMpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9pbnRfbWluKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9pbnRfbWF4KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9sYXRlbmN5KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl90aW1lb3V0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWluX2NlX2xlbik7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIG1heF9jZV9sZW4pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfaG9zdF9jaG5sX2NsYXNzKAotICAgIHVpbnQ4X3QgY2hubF9tYXBbSENJQ19CTEVfQ0hOTF9NQVBfU0laRV0pIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfU0VUX0hPU1RfQ0hOTF9DTEFTUzsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1NFVF9IT1NUX0NITkxfQ0xBU1MpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9TRVRfSE9TVF9DSE5MX0NMQVNTKTsKLQotICBBUlJBWV9UT19TVFJFQU0ocHAsIGNobmxfbWFwLCBIQ0lDX0JMRV9DSE5MX01BUF9TSVpFKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9jaG5sX21hcCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfUkVBRF9DSE5MX01BUDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1JFQURfQ0hOTF9NQVApOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NITkxfTUFQKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9yZWFkX3JlbW90ZV9mZWF0KHVpbnQxNl90IGhhbmRsZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9SRU1PVEVfRkVBVDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1JFQURfUkVNT1RFX0ZFQVQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9SRU1PVEVfRkVBVCk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLS8qIHNlY3VyaXR5IG1hbmFnZW1lbnQgY29tbWFuZHMgKi8KLXZvaWQgYnRzbmRfaGNpY19ibGVfZW5jcnlwdCh1aW50OF90KiBrZXksIHVpbnQ4X3Qga2V5X2xlbiwgdWludDhfdCogcGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHB0X2xlbiwgdm9pZCogcF9jbWRfY3BsdF9jYmFjaykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9CTEVfRU5DUllQVDsKLSAgcC0+b2Zmc2V0ID0gc2l6ZW9mKHZvaWQqKTsKLQotICAqKCh2b2lkKiopcHApID0KLSAgICAgIHBfY21kX2NwbHRfY2JhY2s7IC8qIFN0b3JlIGNvbW1hbmQgY29tcGxldGUgY2FsbGJhY2sgaW4gYnVmZmVyICovCi0gIHBwICs9IHNpemVvZih2b2lkKik7ICAvKiBTa2lwIG92ZXIgY2FsbGJhY2sgcG9pbnRlciAqLwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfRU5DUllQVCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9FTkNSWVBUKTsKLQotICBtZW1zZXQocHAsIDAsIEhDSUNfUEFSQU1fU0laRV9CTEVfRU5DUllQVCk7Ci0KLSAgaWYgKGtleV9sZW4gPiBIQ0lDX0JMRV9FTkNSWVBUX0tFWV9TSVpFKSBrZXlfbGVuID0gSENJQ19CTEVfRU5DUllQVF9LRVlfU0laRTsKLSAgaWYgKHB0X2xlbiA+IEhDSUNfQkxFX0VOQ1JZUFRfS0VZX1NJWkUpIHB0X2xlbiA9IEhDSUNfQkxFX0VOQ1JZUFRfS0VZX1NJWkU7Ci0KLSAgQVJSQVlfVE9fU1RSRUFNKHBwLCBrZXksIGtleV9sZW4pOwotICBwcCArPSAoSENJQ19CTEVfRU5DUllQVF9LRVlfU0laRSAtIGtleV9sZW4pOwotICBBUlJBWV9UT19TVFJFQU0ocHAsIHBsYWluX3RleHQsIHB0X2xlbik7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3JhbmQoYmFzZTo6Q2FsbGJhY2s8dm9pZChCVF9PQ1RFVDgpPiBjYikgewotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0JMRV9SQU5ELCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGJhc2U6OkNhbGxiYWNrPHZvaWQoQlRfT0NURVQ4KT4gY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBhcmFtLCB1aW50MTZfdCBwYXJhbV9sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhwYXJhbVswXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTEUgUmFuZCByZXR1cm4gc3RhdHVzIG11c3QgYmUgemVybyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IuUnVuKHBhcmFtICsgMSAvKiBza2lwIHN0YXR1cyAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYikpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zdGFydF9lbmModWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByYW5kW0hDSUNfQkxFX1JBTkRfRElfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlZGl2LCBjb25zdCBPY3RldDE2JiBsdGspIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NUQVJUX0VOQzsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1NUQVJUX0VOQyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9TVEFSVF9FTkMpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwcCwgcmFuZCwgSENJQ19CTEVfUkFORF9ESV9TSVpFKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgZWRpdik7Ci0gIEFSUkFZX1RPX1NUUkVBTShwcCwgbHRrLmRhdGEoKSwgSENJQ19CTEVfRU5DUllQVF9LRVlfU0laRSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX2x0a19yZXFfcmVwbHkodWludDE2X3QgaGFuZGxlLCBjb25zdCBPY3RldDE2JiBsdGspIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfTFRLX1JFUV9SRVBMWTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX0xUS19SRVFfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9MVEtfUkVRX1JFUExZKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBBUlJBWV9UT19TVFJFQU0ocHAsIGx0ay5kYXRhKCksIEhDSUNfQkxFX0VOQ1JZUFRfS0VZX1NJWkUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9sdGtfcmVxX25lZ19yZXBseSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfTFRLX1JFUV9ORUdfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9MVEtfUkVRX05FR19SRVBMWSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0xUS19SRVFfTkVHX1JFUExZKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9yZWNlaXZlcl90ZXN0KHVpbnQ4X3QgcnhfZnJlcSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQVJBTTE7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9SRUNFSVZFUl9URVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIHJ4X2ZyZXEpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV90cmFuc21pdHRlcl90ZXN0KHVpbnQ4X3QgdHhfZnJlcSwgdWludDhfdCB0ZXN0X2RhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGF5bG9hZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQVJBTTM7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9UUkFOU01JVFRFUl9URVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0zKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIHR4X2ZyZXEpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHRlc3RfZGF0YV9sZW4pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBheWxvYWQpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV90ZXN0X2VuZCh2b2lkKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1JFQURfQ01EOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfVEVTVF9FTkQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NNRCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfaG9zdF9zdXBwb3J0ZWQodm9pZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NNRDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9MRV9IT1NUX1NVUFBPUlQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NNRCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3JjX3BhcmFtX3JlcV9yZXBseSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGNvbm5faW50X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50X21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9SQ19QQVJBTV9SRVFfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9SQ19QQVJBTV9SRVFfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfUkNfUEFSQU1fUkVRX1JFUExZKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjb25uX2ludF9taW4pOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjb25uX2ludF9tYXgpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjb25uX2xhdGVuY3kpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjb25uX3RpbWVvdXQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBtaW5fY2VfbGVuKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWF4X2NlX2xlbik7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3JjX3BhcmFtX3JlcV9uZWdfcmVwbHkodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9CTEVfUkNfUEFSQU1fUkVRX05FR19SRVBMWTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX1JDX1BBUkFNX1JFUV9ORUdfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfUkNfUEFSQU1fUkVRX05FR19SRVBMWSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByZWFzb24pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9hZGRfZGV2aWNlX3Jlc29sdmluZ19saXN0KHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgaXJrX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgaXJrX2xvY2FsKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9BRERfREVWX1JFU09MVklOR19MSVNUOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfQUREX0RFVl9SRVNPTFZJTkdfTElTVCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9BRERfREVWX1JFU09MVklOR19MSVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZGRyX3R5cGVfcGVlcik7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkYV9wZWVyKTsKLSAgQVJSQVlfVE9fU1RSRUFNKHBwLCBpcmtfcGVlci5kYXRhKCksIEhDSUNfQkxFX0VOQ1JZUFRfS0VZX1NJWkUpOwotICBBUlJBWV9UT19TVFJFQU0ocHAsIGlya19sb2NhbC5kYXRhKCksIEhDSUNfQkxFX0VOQ1JZUFRfS0VZX1NJWkUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9ybV9kZXZpY2VfcmVzb2x2aW5nX2xpc3QodWludDhfdCBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9STV9ERVZfUkVTT0xWSU5HX0xJU1Q7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0JMRV9STV9ERVZfUkVTT0xWSU5HX0xJU1QpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfUk1fREVWX1JFU09MVklOR19MSVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZGRyX3R5cGVfcGVlcik7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkYV9wZWVyKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X3ByaXZhY3lfbW9kZSh1aW50OF90IGFkZHJfdHlwZV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJpdmFjeV90eXBlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUFJJVkFDWV9NT0RFOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfU0VUX1BSSVZBQ1lfTU9ERSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUFJJVkFDWV9NT0RFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZGRyX3R5cGVfcGVlcik7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkYV9wZWVyKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwcml2YWN5X3R5cGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdCh2b2lkKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9DTEVBUl9SRVNPTFZJTkdfTElTVDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQkxFX0NMRUFSX1JFU09MVklOR19MSVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX0NMRUFSX1JFU09MVklOR19MSVNUKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9yZXNvbHZhYmxlX2FkZHJfcGVlcih1aW50OF90IGFkZHJfdHlwZV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9SRUFEX1JFU09MVkFCTEVfQUREUl9QRUVSOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfUkVBRF9SRVNPTFZBQkxFX0FERFJfUEVFUik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9SRUFEX1JFU09MVkFCTEVfQUREUl9QRUVSKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZGRyX3R5cGVfcGVlcik7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkYV9wZWVyKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9yZXNvbHZhYmxlX2FkZHJfbG9jYWwodWludDhfdCBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JFQURfUkVTT0xWQUJMRV9BRERSX0xPQ0FMOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfUkVBRF9SRVNPTFZBQkxFX0FERFJfTE9DQUwpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9SRVNPTFZBQkxFX0FERFJfTE9DQUwpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkZHJfdHlwZV9wZWVyKTsKLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRhX3BlZXIpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfYWRkcl9yZXNvbHV0aW9uX2VuYWJsZSh1aW50OF90IGFkZHJfcmVzb2x1dGlvbl9lbmFibGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NFVF9BRERSX1JFU09MVVRJT05fRU5BQkxFOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfU0VUX0FERFJfUkVTT0xVVElPTl9FTkFCTEUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfU0VUX0FERFJfUkVTT0xVVElPTl9FTkFCTEUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkZHJfcmVzb2x1dGlvbl9lbmFibGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfcmFuZF9wcml2X2FkZHJfdGltZW91dCh1aW50MTZfdCBycGFfdGltb3V0KSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUkFORF9QUklWX0FERFJfVElNT1VUOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfU0VUX1JBTkRfUFJJVl9BRERSX1RJTU9VVCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUkFORF9QUklWX0FERFJfVElNT1VUKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcnBhX3RpbW91dCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9kYXRhX2xlbmd0aCh1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDE2X3QgdHhfb2N0ZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHhfdGltZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9CTEVfU0VUX0RBVEFfTEVOR1RIOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfU0VUX0RBVEFfTEVOR1RIKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NFVF9EQVRBX0xFTkdUSCk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9oYW5kbGUpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCB0eF9vY3RldHMpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCB0eF90aW1lKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfZW5oX3J4X3Rlc3QodWludDhfdCByeF9jaGFuLCB1aW50OF90IHBoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb2RfaW5kZXgpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX0VOSF9SWF9URVNUOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfRU5IX1JFQ0VJVkVSX1RFU1QpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfRU5IX1JYX1RFU1QpOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcnhfY2hhbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGh5KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBtb2RfaW5kZXgpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9lbmhfdHhfdGVzdCh1aW50OF90IHR4X2NoYW4sIHVpbnQ4X3QgZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGF5bG9hZCwgdWludDhfdCBwaHkpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQkxFX0VOSF9UWF9URVNUOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfRU5IX1RSQU5TTUlUVEVSX1RFU1QpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9CTEVfRU5IX1RYX1RFU1QpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHR4X2NoYW4pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGRhdGFfbGVuKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYXlsb2FkKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwaHkpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfZXh0ZW5kZWRfc2Nhbl9wYXJhbXModWludDhfdCBvd25fYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FubmluZ19maWx0ZXJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FubmluZ19waHlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5pbmdfcGh5X2NmZyogcGh5X2NmZykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIGludCBwaHlfY250ID0KLSAgICAgIHN0ZDo6Yml0c2V0PHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46OmRpZ2l0cz4oc2Nhbm5pbmdfcGh5cykuY291bnQoKTsKLQotICB1aW50MTZfdCBwYXJhbV9sZW4gPSAzICsgKDUgKiBwaHlfY250KTsKLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgcGFyYW1fbGVuOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9MRV9TRVRfRVhURU5ERURfU0NBTl9QQVJBTUVURVJTKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYXJhbV9sZW4pOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgb3duX2FkZHJlc3NfdHlwZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2Nhbm5pbmdfZmlsdGVyX3BvbGljeSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2Nhbm5pbmdfcGh5cyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaHlfY250OyBpKyspIHsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHBoeV9jZmdbaV0uc2Nhbl90eXBlKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwaHlfY2ZnW2ldLnNjYW5faW50KTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwaHlfY2ZnW2ldLnNjYW5fd2luKTsKLSAgfQotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfZXh0ZW5kZWRfc2Nhbl9lbmFibGUodWludDhfdCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZpbHRlcl9kdXBsaWNhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpb2QpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBjb25zdCBpbnQgcGFyYW1fbGVuID0gNjsKLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgcGFyYW1fbGVuOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9MRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhcmFtX2xlbik7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBlbmFibGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGZpbHRlcl9kdXBsaWNhdGVzKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgZHVyYXRpb24pOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwZXJpb2QpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9leHRfY3JlYXRlX2Nvbm4odWludDhfdCBpbml0X2ZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGFfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUX0NPTk5fUEhZX0NGRyogcGh5X2NmZykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIGludCBwaHlfY250ID0KLSAgICAgIHN0ZDo6Yml0c2V0PHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46OmRpZ2l0cz4oaW5pdGlhdGluZ19waHlzKQotICAgICAgICAgIC5jb3VudCgpOwotCi0gIC8qIHBhcmFtX2xlbiA9IGluaXRpYWxfcGFyYW1zICsgc2l6ZV9wZXJfY2hhbm5lbCAqIG51bV9vZl9jaGFubmVscyAqLwotICB1aW50OF90IHBhcmFtX2xlbiA9IDEwICsgKDE2ICogcGh5X2NudCk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgcGFyYW1fbGVuOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9MRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGFyYW1fbGVuKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIGluaXRfZmlsdGVyX3BvbGljeSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWRkcl90eXBlX293bik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWRkcl90eXBlX3BlZXIpOwotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZGFfcGVlcik7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBpbml0aWF0aW5nX3BoeXMpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcGh5X2NudDsgaSsrKSB7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGh5X2NmZ1tpXS5zY2FuX2ludCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGh5X2NmZ1tpXS5zY2FuX3dpbik7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGh5X2NmZ1tpXS5jb25uX2ludF9taW4pOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBoeV9jZmdbaV0uY29ubl9pbnRfbWF4KTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwaHlfY2ZnW2ldLmNvbm5fbGF0ZW5jeSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGh5X2NmZ1tpXS5zdXBfdGltZW91dCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGh5X2NmZ1tpXS5taW5fY2VfbGVuKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwaHlfY2ZnW2ldLm1heF9jZV9sZW4pOwotICB9Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVhZF9pc29fdHhfc3luYygKLSAgICB1aW50MTZfdCBpc29faGFuZGxlLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBjb25zdCBpbnQgcGFyYW1zX2xlbiA9IDI7Ci0gIHVpbnQ4X3QgcGFyYW1bcGFyYW1zX2xlbl07Ci0gIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaXNvX2hhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihGUk9NX0hFUkUsIEhDSV9MRV9SRUFEX0lTT19UWF9TWU5DLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfbGVuLCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3NldF9jaWdfcGFyYW1zKAotICAgIHVpbnQ4X3QgY2lnX2lkLCB1aW50MzJfdCBzZHVfaXR2X210b3MsIHVpbnQzMl90IHNkdV9pdHZfc3RvbSwgdWludDhfdCBzY2EsCi0gICAgdWludDhfdCBwYWNraW5nLCB1aW50OF90IGZyYW1pbmcsIHVpbnQxNl90IG1heF90cmFuc19sYXRfc3RvbSwKLSAgICB1aW50MTZfdCBtYXhfdHJhbnNfbGF0X210b3MsIHVpbnQ4X3QgY2lzX2NudCwgY29uc3QgRVhUX0NJU19DRkcqIGNpc19jZmcsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgY29uc3QgaW50IHBhcmFtc19sZW4gPSAxNSArIGNpc19jbnQgKiA5OwotICB1aW50OF90IHBhcmFtW3BhcmFtc19sZW5dOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgY2lnX2lkKTsKLSAgVUlOVDI0X1RPX1NUUkVBTShwcCwgc2R1X2l0dl9tdG9zKTsKLSAgVUlOVDI0X1RPX1NUUkVBTShwcCwgc2R1X2l0dl9zdG9tKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBzY2EpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhY2tpbmcpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGZyYW1pbmcpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBtYXhfdHJhbnNfbGF0X210b3MpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBtYXhfdHJhbnNfbGF0X3N0b20pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGNpc19jbnQpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2lzX2NudDsgaSsrKSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaXNfY2ZnW2ldLmNpc19pZCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY2lzX2NmZ1tpXS5tYXhfc2R1X3NpemVfbXRvcyk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY2lzX2NmZ1tpXS5tYXhfc2R1X3NpemVfc3RvbSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaXNfY2ZnW2ldLnBoeV9tdG9zKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGNpc19jZmdbaV0ucGh5X3N0b20pOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgY2lzX2NmZ1tpXS5ydG5fbXRvcyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaXNfY2ZnW2ldLnJ0bl9zdG9tKTsKLSAgfQotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfTEVfU0VUX0NJR19QQVJBTVMsIHBhcmFtLCBwYXJhbXNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2Npcyh1aW50OF90IG51bV9jaXMsIGNvbnN0IEVYVF9DSVNfQ1JFQVRFX0NGRyogY2lzX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIGNvbnN0IGludCBwYXJhbXNfbGVuID0gMSArIG51bV9jaXMgKiA0OwotICB1aW50OF90IHBhcmFtW3BhcmFtc19sZW5dOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgbnVtX2Npcyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY2lzOyBpKyspIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjaXNfY2ZnW2ldLmNpc19jb25uX2hhbmRsZSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY2lzX2NmZ1tpXS5hY2xfY29ubl9oYW5kbGUpOwotICB9Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihGUk9NX0hFUkUsIEhDSV9MRV9DUkVBVEVfQ0lTLCBwYXJhbSwgcGFyYW1zX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlbW92ZV9jaWcodWludDhfdCBjaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBjb25zdCBpbnQgcGFyYW1zX2xlbiA9IDE7Ci0gIHVpbnQ4X3QgcGFyYW1bcGFyYW1zX2xlbl07Ci0gIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjaWdfaWQpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfTEVfUkVNT1ZFX0NJRywgcGFyYW0sIHBhcmFtc19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19hY2NlcHRfY2lzX3JlcSh1aW50MTZfdCBjb25uX2hhbmRsZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIGNvbnN0IGludCBwYXJhbV9sZW4gPSAyOwotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBwYXJhbV9sZW47Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0xFX0FDQ0VQVF9DSVNfUkVRKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYXJhbV9sZW4pOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNvbm5faGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZWpfY2lzX3JlcSh1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDhfdCByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgY29uc3QgaW50IHBhcmFtc19sZW4gPSAzOwotICB1aW50OF90IHBhcmFtW3BhcmFtc19sZW5dOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNvbm5faGFuZGxlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByZWFzb24pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfTEVfUkVKX0NJU19SRVEsIHBhcmFtLCBwYXJhbXNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVxX3BlZXJfc2NhKHVpbnQxNl90IGNvbm5faGFuZGxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgY29uc3QgaW50IHBhcmFtX2xlbiA9IDI7Ci0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIHBhcmFtX2xlbjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfTEVfUkVRX1BFRVJfU0NBKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYXJhbV9sZW4pOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjb25uX2hhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2JpZyh1aW50OF90IGJpZ19oYW5kbGUsIHVpbnQ4X3QgYWR2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2JpcywgdWludDMyX3Qgc2R1X2l0diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9zZHVfc2l6ZSwgdWludDE2X3QgdHJhbnNwb3J0X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ0biwgdWludDhfdCBwaHksIHVpbnQ4X3QgcGFja2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZnJhbWluZywgdWludDhfdCBlbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBiY3N0X2NvZGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBjb25zdCBpbnQgcGFyYW1fbGVuID0gMzE7Ci0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIHBhcmFtX2xlbjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfTEVfQ1JFQVRFX0JJRyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGFyYW1fbGVuKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIGJpZ19oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkdl9oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIG51bV9iaXMpOwotICBVSU5UMjRfVE9fU1RSRUFNKHBwLCBzZHVfaXR2KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWF4X3NkdV9zaXplKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgdHJhbnNwb3J0X2xhdGVuY3kpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHJ0bik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGh5KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYWNraW5nKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBmcmFtaW5nKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBlbmMpOwotCi0gIHVpbnQ4X3QqIGJ1Zl9wdHIgPSBiY3N0X2NvZGUuZGF0YSgpOwotICBBUlJBWV9UT19TVFJFQU0ocHAsIGJ1Zl9wdHIsIDE2KTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY190ZXJtX2JpZyh1aW50OF90IGJpZ19oYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgY29uc3QgaW50IHBhcmFtX2xlbiA9IDI7Ci0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIHBhcmFtX2xlbjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfTEVfVEVSTV9CSUcpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhcmFtX2xlbik7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBiaWdfaGFuZGxlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByZWFzb24pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JpZ19jcmVhdGVfc3luYyh1aW50OF90IGJpZ19oYW5kbGUsIHVpbnQxNl90IHN5bmNfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuYywgc3RkOjphcnJheTx1aW50OF90LCAxNj4gYmNzdF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1zZSwgdWludDE2X3QgYmlnX3N5bmNfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYmlzKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0gIHVpbnQ4X3QgbnVtX2JpcyA9IGJpcy5zaXplKCk7Ci0KLSAgY29uc3QgaW50IHBhcmFtX2xlbiA9IDI0ICsgbnVtX2JpczsKLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgcGFyYW1fbGVuOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9MRV9CSUdfQ1JFQVRFX1NZTkMpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhcmFtX2xlbik7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBiaWdfaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc3luY19oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGVuYyk7Ci0KLSAgdWludDhfdCogYnVmX3B0ciA9IGJjc3RfY29kZS5kYXRhKCk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwcCwgYnVmX3B0ciwgMTYpOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgbXNlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgYmlnX3N5bmNfdGltZW91dCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgbnVtX2Jpcyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmlzOyBpKyspIHsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsIGJpc1tpXSk7Ci0gIH0KLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19iaWdfdGVybV9zeW5jKHVpbnQ4X3QgYmlnX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIGNvbnN0IGludCBwYXJhbXNfbGVuID0gMTsKLSAgdWludDhfdCBwYXJhbVtwYXJhbXNfbGVuXTsKLSAgdWludDhfdCogcHAgPSBwYXJhbTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIGJpZ19oYW5kbGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfTEVfQklHX1RFUk1fU1lOQywgcGFyYW0sIHBhcmFtc19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19zZXR1cF9pc29fZGF0YV9wYXRoKAotICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpciwgdWludDhfdCBkYXRhX3BhdGhfaWQsCi0gICAgdWludDhfdCBjb2RlY19pZF9mb3JtYXQsIHVpbnQxNl90IGNvZGVjX2lkX2NvbXBhbnksCi0gICAgdWludDE2X3QgY29kZWNfaWRfdmVuZG9yLCB1aW50MzJfdCBjb250cm9sbGVyX2RlbGF5LAotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvZGVjX2NvbmYsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgY29uc3QgaW50IHBhcmFtc19sZW4gPSAxMyArIGNvZGVjX2NvbmYuc2l6ZSgpOwotICB1aW50OF90IHBhcmFtW3BhcmFtc19sZW5dOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGlzb19oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGRhdGFfcGF0aF9kaXIpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGRhdGFfcGF0aF9pZCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgY29kZWNfaWRfZm9ybWF0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29kZWNfaWRfY29tcGFueSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNvZGVjX2lkX3ZlbmRvcik7Ci0gIFVJTlQyNF9UT19TVFJFQU0ocHAsIGNvbnRyb2xsZXJfZGVsYXkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGNvZGVjX2NvbmYuc2l6ZSgpKTsKLSAgQVJSQVlfVE9fU1RSRUFNKHBwLCBjb2RlY19jb25mLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50Pihjb2RlY19jb25mLnNpemUoKSkpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfTEVfU0VUVVBfSVNPX0RBVEFfUEFUSCwgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zX2xlbiwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZW1vdmVfaXNvX2RhdGFfcGF0aCgKLSAgICB1aW50MTZfdCBpc29faGFuZGxlLCB1aW50OF90IGRhdGFfcGF0aF9kaXIsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgY29uc3QgaW50IHBhcmFtc19sZW4gPSAzOwotICB1aW50OF90IHBhcmFtW3BhcmFtc19sZW5dOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGlzb19oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGRhdGFfcGF0aF9kaXIpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoRlJPTV9IRVJFLCBIQ0lfTEVfUkVNT1ZFX0lTT19EQVRBX1BBVEgsIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc19sZW4sIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVhZF9pc29fbGlua19xdWFsaXR5KAotICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIGNvbnN0IGludCBwYXJhbXNfbGVuID0gMjsKLSAgdWludDhfdCBwYXJhbVtwYXJhbXNfbGVuXTsKLSAgdWludDhfdCogcHAgPSBwYXJhbTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBpc29faGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX0xFX1JFQURfSVNPX0xJTktfUVVBTElUWSwgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zX2xlbiwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfY3JlYXRlX3N5bmMoCi0gICAgdWludDhfdCBvcHRpb25zLCB1aW50OF90IGFkdl9zaWQsIHVpbnQ4X3QgYWR2X2FkZHJfdHlwZSwKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDE2X3Qgc2tpcF9udW0sIHVpbnQxNl90IHN5bmNfdGltZW91dCwKLSAgICB1aW50OF90IHN5bmNfY3RlX3R5cGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPQotICAgICAgSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1BFUklPRElDX0FEVkVSVElTSU5HX0NSRUFURV9TWU5DOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9CTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkMpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgb3B0aW9ucyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWR2X3NpZCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWR2X2FkZHJfdHlwZSk7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGFkdl9hZGRyKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc2tpcF9udW0pOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBzeW5jX3RpbWVvdXQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHN5bmNfY3RlX3R5cGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19jcmVhdGVfc3luY19jYW5jZWwoCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0JMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQ19DQU5DRUwsIG51bGxwdHIsCi0gICAgICBIQ0lDX1BBUkFNX1NJWkVfUEVSSU9ESUNfQURWRVJUSVNJTkdfQ1JFQVRFX1NZTkNfQ0FOQ0VMLCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ190ZXJtaW5hdGVfc3luYygKLSAgICB1aW50MTZfdCBzeW5jX2hhbmRsZSwgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgdWludDhfdCBwYXJhbVtIQ0lDX1BBUkFNX1NJWkVfUEVSSU9ESUNfQURWRVJUSVNJTkdfVEVSTUlOQVRFX1NZTkNdOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHN5bmNfaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgRlJPTV9IRVJFLCBIQ0lfQkxFX1BFUklPRElDX0FEVkVSVElTSU5HX1RFUk1JTkFURV9TWU5DLCBwYXJhbSwKLSAgICAgIEhDSUNfUEFSQU1fU0laRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19URVJNSU5BVEVfU1lOQywgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpX2JsZV9hZGRfZGV2aWNlX3RvX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdCgKLSAgICB1aW50OF90IGFkdl9hZGRyX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkdl9hZGRyLCB1aW50OF90IGFkdl9zaWQsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgdWludDhfdCBwYXJhbVtIQ0lDX1BBUkFNX1NJWkVfQUREX0RFVklDRV9UT19QRVJJT0RJQ19BRFZFUlRJU0VSX0xJU1RdOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWR2X2FkZHJfdHlwZSk7Ci0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGFkdl9hZGRyKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZHZfc2lkKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgRlJPTV9IRVJFLCBIQ0lfQkxFX0FERF9ERVZJQ0VfVE9fUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNULCBwYXJhbSwKLSAgICAgIEhDSUNfUEFSQU1fU0laRV9BRERfREVWSUNFX1RPX1BFUklPRElDX0FEVkVSVElTRVJfTElTVCwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpX2JsZV9yZW1vdmVfZGV2aWNlX2Zyb21fcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgIHVpbnQ4X3QgYWR2X2FkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWR2X2FkZHIsIHVpbnQ4X3QgYWR2X3NpZCwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICB1aW50OF90IHBhcmFtW0hDSUNfUEFSQU1fU0laRV9SRU1PVkVfREVWSUNFX0ZST01fUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNUXTsKLSAgdWludDhfdCogcHAgPSBwYXJhbTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIGFkdl9hZGRyX3R5cGUpOwotICBCREFERFJfVE9fU1RSRUFNKHBwLCBhZHZfYWRkcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWR2X3NpZCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0JMRV9SRU1PVkVfREVWSUNFX0ZST01fUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNULCBwYXJhbSwKLSAgICAgIEhDSUNfUEFSQU1fU0laRV9SRU1PVkVfREVWSUNFX0ZST01fUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNULAotICAgICAgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpX2JsZV9jbGVhcl9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3QoCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0JMRV9DTEVBUl9QRVJJT0RJQ19BRFZFUlRJU0VSX0xJU1QsIG51bGxwdHIsCi0gICAgICBIQ0lDX1BBUkFNX1NJWkVfQ0xFQVJfUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNULCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2lfYmxlX3JlYWRfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemUoCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0JMRV9SRUFEX1BFUklPRElDX0FEVkVSVElTRVJfTElTVF9TSVpFLCBudWxscHRyLAotICAgICAgSENJQ19QQVJBTV9TSVpFX1JFQURfUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNUX1NJWkUsIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9wZXJpb2RpY19hZHZlcnRpc2luZ19yZWNlaXZlX2VuYWJsZSgKLSAgICB1aW50MTZfdCBzeW5jX2hhbmRsZSwgYm9vbCBlbmFibGUsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgdWludDhfdCBwYXJhbVtIQ0lDX1BBUkFNX1NJWkVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1JFQ0VJVkVfRU5BQkxFXTsKLSAgdWludDhfdCogcHAgPSBwYXJhbTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBzeW5jX2hhbmRsZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgKGVuYWJsZSA/IDB4MDEgOiAweDAwKSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0xFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19SRUNFSVZFX0VOQUJMRSwgcGFyYW0sCi0gICAgICBIQ0lDX1BBUkFNX1NJWkVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX1JFQ0VJVkVfRU5BQkxFLCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyKAotICAgIHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50MTZfdCBzZXJ2aWNlX2RhdGEsIHVpbnQxNl90IHN5bmNfaGFuZGxlLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIHVpbnQ4X3QgcGFyYW1bSENJQ19QQVJBTV9TSVpFX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJdOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNvbm5faGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc2VydmljZV9kYXRhKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc3luY19oYW5kbGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kX3dpdGhfY2IoCi0gICAgICBGUk9NX0hFUkUsIEhDSV9MRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSLCBwYXJhbSwKLSAgICAgIEhDSUNfUEFSQU1fU0laRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSLCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zZXRfaW5mb190cmFuc2ZlcigKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDE2X3Qgc2VydmljZV9kYXRhLCB1aW50OF90IGFkdl9oYW5kbGUsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgdWludDhfdCBwYXJhbVtIQ0lDX1BBUkFNX1NJWkVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU0VUX0lORk9fVFJBTlNGRVJdOwotICB1aW50OF90KiBwcCA9IHBhcmFtOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNvbm5faGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc2VydmljZV9kYXRhKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBhZHZfaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKAotICAgICAgRlJPTV9IRVJFLCBIQ0lfTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU0VUX0lORk9fVFJBTlNGRVIsIHBhcmFtLAotICAgICAgSENJQ19QQVJBTV9TSVpFX1BFUklPRElDX0FEVkVSVElTSU5HX1NFVF9JTkZPX1RSQU5TRkVSLCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9wYXJhbXMoCi0gICAgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgbW9kZSwgdWludDE2X3Qgc2tpcCwgdWludDE2X3Qgc3luY190aW1lb3V0LAotICAgIHVpbnQ4X3QgY3RlX3R5cGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIHVpbnQ4X3QgcGFyYW1bSENJQ19QQVJBTV9TSVpFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNU107Ci0gIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIG1vZGUpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBza2lwKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc3luY190aW1lb3V0KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjdGVfdHlwZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0xFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNLCBwYXJhbSwKLSAgICAgIEhDSUNfUEFSQU1fU0laRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTVMsCi0gICAgICBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfZGVmYXVsdF9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3BhcmFtcygKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDhfdCBtb2RlLCB1aW50MTZfdCBza2lwLCB1aW50MTZfdCBzeW5jX3RpbWVvdXQsCi0gICAgdWludDhfdCBjdGVfdHlwZSwgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgdWludDhfdCBwYXJhbQotICAgICAgW0hDSUNfUEFSQU1fU0laRV9TRVRfREVGQVVMVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNU107Ci0gIHVpbnQ4X3QqIHBwID0gcGFyYW07Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY29ubl9oYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIG1vZGUpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBza2lwKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc3luY190aW1lb3V0KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBjdGVfdHlwZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYigKLSAgICAgIEZST01fSEVSRSwgSENJX0xFX1NFVF9ERUZBVUxUX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfUEFSQU0sCi0gICAgICBwYXJhbSwKLSAgICAgIEhDSUNfUEFSQU1fU0laRV9TRVRfREVGQVVMVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19TWU5DX1RSQU5TRkVSX1BBUkFNUywKLSAgICAgIHN0ZDo6bW92ZShjYikpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svaGNpYy9oY2ljbWRzLmNjIGIvc3RhY2svaGNpYy9oY2ljbWRzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDcwOTk3Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2hjaWMvaGNpY21kcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb24gb2YgdGhlIEhDSUMgdW5pdCB0byBmb3JtYXQgYW5kIHNlbmQgSENJCi0gKiAgY29tbWFuZHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvZXNjb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAiaGNpZGVmcy5oIgotI2luY2x1ZGUgImhjaW1zZ3MuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBidGVfbWFpbl9oY2lfc2VuZChCVF9IRFIqIHBfbXNnLCB1aW50MTZfdCBldmVudCk7Ci0KLS8qIE1lc3NhZ2UgYnkgbWVzc2FnZS4uLi4gKi8KLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfSU5RVUlSWSA1Ci0KLSNkZWZpbmUgSENJQ19JTlFfSU5RX0xBUF9PRkYgMAotI2RlZmluZSBIQ0lDX0lOUV9EVVJfT0ZGIDMKLSNkZWZpbmUgSENJQ19JTlFfUlNQX0NOVF9PRkYgNAotLyogSW5xdWlyeSAqLwotCi0vKiBJbnF1aXJ5IENhbmNlbCAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfSU5RX0NBTkNFTCAwCi0KLS8qIFBlcmlvZGljIElucXVpcnkgTW9kZSAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUEVSX0lOUV9NT0RFIDkKLQotI2RlZmluZSBIQ0lfUEVSX0lOUV9NQVhfSU5UUlZMX09GRiAwCi0jZGVmaW5lIEhDSV9QRVJfSU5RX01JTl9JTlRSVkxfT0ZGIDIKLSNkZWZpbmUgSENJX1BFUl9JTlFfSU5RX0xBUF9PRkYgNAotI2RlZmluZSBIQ0lfUEVSX0lOUV9EVVJBVElPTl9PRkYgNwotI2RlZmluZSBIQ0lfUEVSX0lOUV9SU1BfQ05UX09GRiA4Ci0vKiBQZXJpb2RpYyBJbnF1aXJ5IE1vZGUgKi8KLQotLyogRXhpdCBQZXJpb2RpYyBJbnF1aXJ5IE1vZGUgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0VYSVRfUEVSX0lOUSAwCi0KLS8qIENyZWF0ZSBDb25uZWN0aW9uICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9DUkVBVEVfQ09OTiAxMwotCi0jZGVmaW5lIEhDSUNfQ1JfQ09OTl9CRF9BRERSX09GRiAwCi0jZGVmaW5lIEhDSUNfQ1JfQ09OTl9QS1RfVFlQRVNfT0ZGIDYKLSNkZWZpbmUgSENJQ19DUl9DT05OX1JFUF9NT0RFX09GRiA4Ci0jZGVmaW5lIEhDSUNfQ1JfQ09OTl9QQUdFX1NDQU5fTU9ERV9PRkYgOQotI2RlZmluZSBIQ0lDX0NSX0NPTk5fQ0xLX09GRl9PRkYgMTAKLSNkZWZpbmUgSENJQ19DUl9DT05OX0FMTE9XX1NXSVRDSF9PRkYgMTIKLS8qIENyZWF0ZSBDb25uZWN0aW9uICovCi0KLS8qIERpc2Nvbm5lY3QgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0RJU0NPTk5FQ1QgMwotCi0jZGVmaW5lIEhDSV9ESVNDX0hBTkRMRV9PRkYgMAotI2RlZmluZSBIQ0lfRElTQ19SRUFTT05fT0ZGIDIKLS8qIERpc2Nvbm5lY3QgKi8KLQotLyogQWRkIFNDTyBDb25uZWN0aW9uICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9BRERfU0NPX0NPTk4gNAotCi0jZGVmaW5lIEhDSV9BRERfU0NPX0hBTkRMRV9PRkYgMAotI2RlZmluZSBIQ0lfQUREX1NDT19QQUNLRVRfVFlQRVNfT0ZGIDIKLS8qIEFkZCBTQ08gQ29ubmVjdGlvbiAqLwotCi0vKiBDcmVhdGUgQ29ubmVjdGlvbiBDYW5jZWwgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0NSRUFURV9DT05OX0NBTkNFTCA2Ci0KLSNkZWZpbmUgSENJQ19DUl9DT05OX0NBTkNFTF9CRF9BRERSX09GRiAwCi0vKiBDcmVhdGUgQ29ubmVjdGlvbiBDYW5jZWwgKi8KLQotLyogQWNjZXB0IENvbm5lY3Rpb24gUmVxdWVzdCAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQUNDRVBUX0NPTk4gNwotCi0jZGVmaW5lIEhDSV9BQ0NfQ09OTl9CRF9BRERSX09GRiAwCi0jZGVmaW5lIEhDSV9BQ0NfQ09OTl9ST0xFX09GRiA2Ci0vKiBBY2NlcHQgQ29ubmVjdGlvbiBSZXF1ZXN0ICovCi0KLS8qIFJlamVjdCBDb25uZWN0aW9uIFJlcXVlc3QgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JFSkVDVF9DT05OIDcKLQotI2RlZmluZSBIQ0lfUkVKX0NPTk5fQkRfQUREUl9PRkYgMAotI2RlZmluZSBIQ0lfUkVKX0NPTk5fUkVBU09OX09GRiA2Ci0vKiBSZWplY3QgQ29ubmVjdGlvbiBSZXF1ZXN0ICovCi0KLS8qIExpbmsgS2V5IFJlcXVlc3QgUmVwbHkgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0xJTktfS0VZX1JFUV9SRVBMWSAyMgotCi0jZGVmaW5lIEhDSV9MSU5LX0tFWV9SRVBMWV9CRF9BRERSX09GRiAwCi0jZGVmaW5lIEhDSV9MSU5LX0tFWV9SRVBMWV9MSU5LX0tFWV9PRkYgNgotLyogTGluayBLZXkgUmVxdWVzdCBSZXBseSAgKi8KLQotLyogTGluayBLZXkgUmVxdWVzdCBOZWcgUmVwbHkgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0xJTktfS0VZX05FR19SRVBMWSA2Ci0KLSNkZWZpbmUgSENJX0xJTktfS0VZX05FR19SRVBfQkRfQURSX09GRiAwCi0vKiBMaW5rIEtleSBSZXF1ZXN0IE5lZyBSZXBseSAgKi8KLQotLyogUElOIENvZGUgUmVxdWVzdCBSZXBseSAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUElOX0NPREVfUkVRX1JFUExZIDIzCi0KLSNkZWZpbmUgSENJX1BJTl9DT0RFX1JFUExZX0JEX0FERFJfT0ZGIDAKLSNkZWZpbmUgSENJX1BJTl9DT0RFX1JFUExZX1BJTl9MRU5fT0ZGIDYKLSNkZWZpbmUgSENJX1BJTl9DT0RFX1JFUExZX1BJTl9DT0RFX09GRiA3Ci0vKiBQSU4gQ29kZSBSZXF1ZXN0IFJlcGx5ICAqLwotCi0vKiBMaW5rIEtleSBSZXF1ZXN0IE5lZyBSZXBseSAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUElOX0NPREVfTkVHX1JFUExZIDYKLQotI2RlZmluZSBIQ0lfUElOX0NPREVfTkVHX1JFUF9CRF9BRFJfT0ZGIDAKLS8qIExpbmsgS2V5IFJlcXVlc3QgTmVnIFJlcGx5ICAqLwotCi0vKiBDaGFuZ2UgQ29ubmVjdGlvbiBUeXBlICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9DSEFOR0VfQ09OTl9UWVBFIDQKLQotI2RlZmluZSBIQ0lfQ0hOR19QS1RfVFlQRV9IQU5ETEVfT0ZGIDAKLSNkZWZpbmUgSENJX0NITkdfUEtUX1RZUEVfUEtUX1RZUEVfT0ZGIDIKLS8qIENoYW5nZSBDb25uZWN0aW9uIFR5cGUgKi8KLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRSAyCi0KLSNkZWZpbmUgSENJX0NNRF9IQU5ETEVfSEFORExFX09GRiAwCi0KLS8qIFNldCBDb25uZWN0aW9uIEVuY3J5cHRpb24gKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1NFVF9DT05OX0VOQ1JZUFQgMwotCi0jZGVmaW5lIEhDSV9TRVRfRU5DUllQVF9IQU5ETEVfT0ZGIDAKLSNkZWZpbmUgSENJX1NFVF9FTkNSWVBUX0VOQUJMRV9PRkYgMgotLyogU2V0IENvbm5lY3Rpb24gRW5jcnlwdGlvbiAqLwotCi0vKiBSZW1vdGUgTmFtZSBSZXF1ZXN0ICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9STVRfTkFNRV9SRVEgMTAKLQotI2RlZmluZSBIQ0lfUk1UX05BTUVfQkRfQUREUl9PRkYgMAotI2RlZmluZSBIQ0lfUk1UX05BTUVfUkVQX01PREVfT0ZGIDYKLSNkZWZpbmUgSENJX1JNVF9OQU1FX1BBR0VfU0NBTl9NT0RFX09GRiA3Ci0jZGVmaW5lIEhDSV9STVRfTkFNRV9DTEtfT0ZGX09GRiA4Ci0vKiBSZW1vdGUgTmFtZSBSZXF1ZXN0ICovCi0KLS8qIFJlbW90ZSBOYW1lIFJlcXVlc3QgQ2FuY2VsICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9STVRfTkFNRV9SRVFfQ0FOQ0VMIDYKLQotI2RlZmluZSBIQ0lfUk1UX05BTUVfQ0FOQ0VMX0JEX0FERFJfT0ZGIDAKLS8qIFJlbW90ZSBOYW1lIFJlcXVlc3QgQ2FuY2VsICovCi0KLS8qIFJlbW90ZSBFeHRlbmRlZCBGZWF0dXJlcyAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUk1UX0VYVF9GRUFUVVJFUyAzCi0KLSNkZWZpbmUgSENJX1JNVF9FWFRfRkVBVFVSRVNfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9STVRfRVhUX0ZFQVRVUkVTX1BBR0VfTlVNX09GRiAyCi0vKiBSZW1vdGUgRXh0ZW5kZWQgRmVhdHVyZXMgKi8KLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfU0VUVVBfRVNDTyAxNwotCi0jZGVmaW5lIEhDSV9TRVRVUF9FU0NPX0hBTkRMRV9PRkYgMAotI2RlZmluZSBIQ0lfU0VUVVBfRVNDT19UWF9CV19PRkYgMgotI2RlZmluZSBIQ0lfU0VUVVBfRVNDT19SWF9CV19PRkYgNgotI2RlZmluZSBIQ0lfU0VUVVBfRVNDT19NQVhfTEFUX09GRiAxMAotI2RlZmluZSBIQ0lfU0VUVVBfRVNDT19WT0lDRV9PRkYgMTIKLSNkZWZpbmUgSENJX1NFVFVQX0VTQ09fUkVUUkFOX0VGRl9PRkYgMTQKLSNkZWZpbmUgSENJX1NFVFVQX0VTQ09fUEtUX1RZUEVTX09GRiAxNQotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9BQ0NFUFRfRVNDTyAyMQotCi0jZGVmaW5lIEhDSV9BQ0NFUFRfRVNDT19CREFERFJfT0ZGIDAKLSNkZWZpbmUgSENJX0FDQ0VQVF9FU0NPX1RYX0JXX09GRiA2Ci0jZGVmaW5lIEhDSV9BQ0NFUFRfRVNDT19SWF9CV19PRkYgMTAKLSNkZWZpbmUgSENJX0FDQ0VQVF9FU0NPX01BWF9MQVRfT0ZGIDE0Ci0jZGVmaW5lIEhDSV9BQ0NFUFRfRVNDT19WT0lDRV9PRkYgMTYKLSNkZWZpbmUgSENJX0FDQ0VQVF9FU0NPX1JFVFJBTl9FRkZfT0ZGIDE4Ci0jZGVmaW5lIEhDSV9BQ0NFUFRfRVNDT19QS1RfVFlQRVNfT0ZGIDE5Ci0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JFSkVDVF9FU0NPIDcKLQotI2RlZmluZSBIQ0lfUkVKRUNUX0VTQ09fQkRBRERSX09GRiAwCi0jZGVmaW5lIEhDSV9SRUpFQ1RfRVNDT19SRUFTT05fT0ZGIDYKLQotLyogSG9sZCBNb2RlICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9IT0xEX01PREUgNgotCi0jZGVmaW5lIEhDSV9IT0xEX01PREVfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9IT0xEX01PREVfTUFYX1BFUl9PRkYgMgotI2RlZmluZSBIQ0lfSE9MRF9NT0RFX01JTl9QRVJfT0ZGIDQKLS8qIEhvbGQgTW9kZSAqLwotCi0vKiBTbmlmZiBNb2RlICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9TTklGRl9NT0RFIDEwCi0KLSNkZWZpbmUgSENJX1NOSUZGX01PREVfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9TTklGRl9NT0RFX01BWF9QRVJfT0ZGIDIKLSNkZWZpbmUgSENJX1NOSUZGX01PREVfTUlOX1BFUl9PRkYgNAotI2RlZmluZSBIQ0lfU05JRkZfTU9ERV9BVFRFTVBUX09GRiA2Ci0jZGVmaW5lIEhDSV9TTklGRl9NT0RFX1RJTUVPVVRfT0ZGIDgKLS8qIFNuaWZmIE1vZGUgKi8KLQotLyogUGFyayBNb2RlICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9QQVJLX01PREUgNgotCi0jZGVmaW5lIEhDSV9QQVJLX01PREVfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9QQVJLX01PREVfTUFYX1BFUl9PRkYgMgotI2RlZmluZSBIQ0lfUEFSS19NT0RFX01JTl9QRVJfT0ZGIDQKLS8qIFBhcmsgTW9kZSAqLwotCi0vKiBRb1MgU2V0dXAgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1FPU19TRVRVUCAyMAotCi0jZGVmaW5lIEhDSV9RT1NfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9RT1NfRkxBR1NfT0ZGIDIKLSNkZWZpbmUgSENJX1FPU19TRVJWSUNFX1RZUEVfT0ZGIDMKLSNkZWZpbmUgSENJX1FPU19UT0tFTl9SQVRFX09GRiA0Ci0jZGVmaW5lIEhDSV9RT1NfUEVBS19CQU5EV0lEVEhfT0ZGIDgKLSNkZWZpbmUgSENJX1FPU19MQVRFTkNZX09GRiAxMgotI2RlZmluZSBIQ0lfUU9TX0RFTEFZX1ZBUl9PRkYgMTYKLS8qIFFvUyBTZXR1cCAqLwotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9TV0lUQ0hfUk9MRSA3Ci0KLSNkZWZpbmUgSENJX1NXSVRDSF9CRF9BRERSX09GRiAwCi0jZGVmaW5lIEhDSV9TV0lUQ0hfUk9MRV9PRkYgNgotLyogU3dpdGNoIFJvbGUgUmVxdWVzdCAqLwotCi0vKiBXcml0ZSBQb2xpY3kgU2V0dGluZ3MgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BPTElDWV9TRVQgNAotCi0jZGVmaW5lIEhDSV9XUklURV9QT0xJQ1lfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9XUklURV9QT0xJQ1lfU0VUVElOR1NfT0ZGIDIKLS8qIFdyaXRlIFBvbGljeSBTZXR0aW5ncyAqLwotCi0vKiBXcml0ZSBEZWZhdWx0IFBvbGljeSBTZXR0aW5ncyAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfREVGX1BPTElDWV9TRVQgMgotCi0jZGVmaW5lIEhDSV9XUklURV9ERUZfUE9MSUNZX1NFVFRJTkdTX09GRiAwCi0vKiBXcml0ZSBEZWZhdWx0IFBvbGljeSBTZXR0aW5ncyAqLwotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9TTklGRl9TVUJfUkFURSA4Ci0KLSNkZWZpbmUgSENJX1NOSUZGX1NVQl9SQVRFX0hBTkRMRV9PRkYgMAotI2RlZmluZSBIQ0lfU05JRkZfU1VCX1JBVEVfTUFYX0xBVF9PRkYgMgotI2RlZmluZSBIQ0lfU05JRkZfU1VCX1JBVEVfTUlOX1JFTV9MQVRfT0ZGIDQKLSNkZWZpbmUgSENJX1NOSUZGX1NVQl9SQVRFX01JTl9MT0NfTEFUX09GRiA2Ci0vKiBTbmlmZiBTdWJyYXRpbmcgKi8KLQotLyogRXh0ZW5kZWQgSW5xdWlyeSBSZXNwb25zZSAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfRVhUX0lOUV9SRVNQIDI0MQotCi0jZGVmaW5lIEhDSUNfRVhUX0lOUV9SRVNQX0ZFQ19PRkYgMAotI2RlZmluZSBIQ0lDX0VYVF9JTlFfUkVTUF9SRVNQT05TRSAxCi0vKiBJTyBDYXBhYmlsaXRpZXMgUmVzcG9uc2UgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0lPX0NBUF9SRVNQIDkKLQotI2RlZmluZSBIQ0lfSU9fQ0FQX0JEX0FERFJfT0ZGIDAKLSNkZWZpbmUgSENJX0lPX0NBUEFCSUxJVFlfT0ZGIDYKLSNkZWZpbmUgSENJX0lPX0NBUF9PT0JfREFUQV9PRkYgNwotI2RlZmluZSBIQ0lfSU9fQ0FQX0FVVEhfUkVRX09GRiA4Ci0KLS8qIElPIENhcGFiaWxpdGllcyBSZXEgTmVnIFJlcGx5ICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9JT19DQVBfTkVHX1JFUExZIDcKLQotI2RlZmluZSBIQ0lfSU9fQ0FQX05SX0JEX0FERFJfT0ZGIDAKLSNkZWZpbmUgSENJX0lPX0NBUF9OUl9FUlJfQ09ERSA2Ci0KLS8qIFJlYWQgTG9jYWwgT09CIERhdGEgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JfTE9DQUxfT09CIDAKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfVUNPTkZfUkVQTFkgNgotCi0jZGVmaW5lIEhDSV9VU0VSX0NPTkZfQkRfQUREUl9PRkYgMAotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9VX1BLRVlfUkVQTFkgMTAKLQotI2RlZmluZSBIQ0lfVVNFUl9QQVNTS0VZX0JEX0FERFJfT0ZGIDAKLSNkZWZpbmUgSENJX1VTRVJfUEFTU0tFWV9WQUxVRV9PRkYgNgotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9VX1BLRVlfTkVHX1JFUExZIDYKLQotI2RlZmluZSBIQ0lfVVNFUl9QQVNTS0VZX05FR19CRF9BRERSX09GRiAwCi0KLS8qIFJlbW90ZSBPT0IgRGF0YSBSZXF1ZXN0IFJlcGx5ICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9SRU1fT09CX1JFUExZIDM4Ci0KLSNkZWZpbmUgSENJX1JFTV9PT0JfREFUQV9CRF9BRERSX09GRiAwCi0jZGVmaW5lIEhDSV9SRU1fT09CX0RBVEFfQ19PRkYgNgotI2RlZmluZSBIQ0lfUkVNX09PQl9EQVRBX1JfT0ZGIDIyCi0KLS8qIFJlbW90ZSBPT0IgRGF0YSBSZXF1ZXN0IE5lZ2F0aXZlIFJlcGx5ICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9SRU1fT09CX05FR19SRVBMWSA2Ci0KLSNkZWZpbmUgSENJX1JFTV9PT0JfREFUQV9ORUdfQkRfQUREUl9PRkYgMAotCi0vKiBSZWFkIFR4IFBvd2VyIExldmVsICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9SX1RYX1BPV0VSIDAKLQotLyogUmVhZCBEZWZhdWx0IEVycm9uZW91cyBEYXRhIFJlcG9ydGluZyAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUl9FUlJfREFUQV9SUFQgMAotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9FTkhBTkNFRF9GTFVTSCAzCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1NFTkRfS0VZUFJFU1NfTk9USUYgNwotCi0jZGVmaW5lIEhDSV9TRU5EX0tFWVBSRVNTX05PVElGX0JEX0FERFJfT0ZGIDAKLSNkZWZpbmUgSENJX1NFTkRfS0VZUFJFU1NfTk9USUZfTk9USUZfT0ZGIDYKLQotLyoqKiogZW5kIG9mIFNpbXBsZSBQYWlyaW5nIENvbW1hbmRzICoqKiovCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1NFVF9FVlRfRklMVEVSIDkKLQotI2RlZmluZSBIQ0lfRklMVF9DT05EX0ZJTFRfVFlQRV9PRkYgMAotI2RlZmluZSBIQ0lfRklMVF9DT05EX0NPTkRfVFlQRV9PRkYgMQotI2RlZmluZSBIQ0lfRklMVF9DT05EX0ZJTFRfT0ZGIDIKLS8qIFNldCBFdmVudCBGaWx0ZXIgKi8KLQotLyogRGVsZXRlIFN0b3JlZCBLZXkgKi8KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0RFTEVURV9TVE9SRURfS0VZIDcKLQotI2RlZmluZSBIQ0lfREVMRVRFX0tFWV9CRF9BRERSX09GRiAwCi0jZGVmaW5lIEhDSV9ERUxFVEVfS0VZX0FMTF9GTEFHX09GRiA2Ci0vKiBEZWxldGUgU3RvcmVkIEtleSAqLwotCi0vKiBDaGFuZ2UgTG9jYWwgTmFtZSAqLwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQ0hBTkdFX05BTUUgQkRfTkFNRV9MRU4KLQotI2RlZmluZSBIQ0lfQ0hBTkdFX05BTUVfTkFNRV9PRkYgMAotLyogQ2hhbmdlIExvY2FsIE5hbWUgKi8KLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUkVBRF9DTUQgMAotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQVJBTTEgMQotCi0jZGVmaW5lIEhDSUNfV1JJVEVfUEFSQU0xX1BBUkFNX09GRiAwCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMiAyCi0KLSNkZWZpbmUgSENJQ19XUklURV9QQVJBTTJfUEFSQU1fT0ZGIDAKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0zIDMKLQotI2RlZmluZSBIQ0lDX1dSSVRFX1BBUkFNM19QQVJBTV9PRkYgMAotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9TRVRfQUZIX0NIQU5ORUxTIDEwCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0VOSF9TRVRfRVNDT19DT05OIDU5Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9FTkhfQUNDX0VTQ09fQ09OTiA2MwotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQUdFU0NBTl9DRkcgNAotCi0jZGVmaW5lIEhDSV9TQ0FOX0NGR19JTlRFUlZBTF9PRkYgMAotI2RlZmluZSBIQ0lfU0NBTl9DRkdfV0lORE9XX09GRiAyCi0vKiBXcml0ZSBQYWdlIFNjYW4gQWN0aXZpdHkgKi8KLQotLyogV3JpdGUgSW5xdWlyeSBTY2FuIEFjdGl2aXR5ICovCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9JTlFTQ0FOX0NGRyA0Ci0KLSNkZWZpbmUgSENJX1NDQU5fQ0ZHX0lOVEVSVkFMX09GRiAwCi0jZGVmaW5lIEhDSV9TQ0FOX0NGR19XSU5ET1dfT0ZGIDIKLS8qIFdyaXRlIElucXVpcnkgU2NhbiBBY3Rpdml0eSAqLwotCi0vKiBIb3N0IENvbnRyb2xsZXIgdG8gSG9zdCBmbG93IGNvbnRyb2wgKi8KLSNkZWZpbmUgSENJX0hPU1RfRkxPV19DVFJMX09GRiAwCi0jZGVmaW5lIEhDSV9IT1NUX0ZMT1dfQ1RSTF9BQ0xfT04gMQotI2RlZmluZSBIQ0lfSE9TVF9GTE9XX0NUUkxfU0NPX09OIDIKLSNkZWZpbmUgSENJX0hPU1RfRkxPV19DVFJMX0JPVEhfT04gMwotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCA0Ci0KLSNkZWZpbmUgSENJX0ZMVVNIX1RPVVRfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9GTFVTSF9UT1VUX1RPVVRfT0ZGIDIKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUkVBRF9UWF9QT1dFUiAzCi0KLSNkZWZpbmUgSENJX1JFQURfVFhfUE9XRVJfSEFORExFX09GRiAwCi0jZGVmaW5lIEhDSV9SRUFEX1RYX1BPV0VSX1RZUEVfT0ZGIDIKLQotLyogUmVhZCB0cmFuc21pdCBwb3dlciBsZXZlbCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgSENJX1JFQURfQ1VSUkVOVCAweDAwCi0jZGVmaW5lIEhDSV9SRUFEX01BWElNVU0gMHgwMQotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9OVU1fUEtUU19ET05FX1NJWkUgc2l6ZW9mKGJ0bXNnX2hjaWNfbnVtX3BrdHNfZG9uZV90KQotCi0jZGVmaW5lIE1BWF9EQVRBX0hBTkRMRVMgMTAKLQotI2RlZmluZSBIQ0lfUEtUU19ET05FX05VTV9IQU5ETEVTX09GRiAwCi0jZGVmaW5lIEhDSV9QS1RTX0RPTkVfSEFORExFX09GRiAxCi0jZGVmaW5lIEhDSV9QS1RTX0RPTkVfTlVNX1BLVFNfT0ZGIDMKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfTElOS19TVVBFUl9UT1VUIDQKLQotI2RlZmluZSBIQ0lfTElOS19TVVBFUl9UT1VUX0hBTkRMRV9PRkYgMAotI2RlZmluZSBIQ0lfTElOS19TVVBFUl9UT1VUX1RPVVRfT0ZGIDIKLS8qIFdyaXRlIExpbmsgU3VwZXJ2aXNpb24gVGltZW91dCAqLwotCi0jZGVmaW5lIE1BWF9JQUNfTEFQUyAweDQwCi0KLSNkZWZpbmUgSENJX1dSSVRFX0lBQ19MQVBfTlVNX09GRiAwCi0jZGVmaW5lIEhDSV9XUklURV9JQUNfTEFQX0xBUF9PRkYgMQotLyogV3JpdGUgQ3VycmVudCBJQUMgTEFQICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBCTEUgQ29tbWFuZHMKLSAqICAgICAgTm90ZTogImxvY2FsX2NvbnRyb2xsZXJfaWQiIGlzIGZvciB0cmFuc3BvcnQsIG5vdCBjb3VudGVkIGluIEhDSQotICogICAgICAgICAgICAgbWVzc2FnZSBzaXplCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBIQ0lDX0JMRV9SQU5EX0RJX1NJWkUgOAotI2RlZmluZSBIQ0lDX0JMRV9JUktfU0laRSAxNgotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9TRVRfVVNFRF9GRUFUX0NNRCA4Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9SQU5ET01fQUREUl9DTUQgNgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1dSSVRFX0FEVl9QQVJBTVMgMTUKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9TQ0FOX1JTUCAzMQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfQURWX0VOQUJMRSAxCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfU0NBTl9QQVJBTSA3Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfV1JJVEVfU0NBTl9FTkFCTEUgMgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX0NSRUFURV9MTF9DT05OIDI1Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfQ1JFQVRFX0NPTk5fQ0FOQ0VMIDAKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0NMRUFSX0FDQ0VQVExJU1QgMAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQUREX0FDQ0VQVExJU1QgNwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfUkVNT1ZFX0FDQ0VQVExJU1QgNwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1VQRF9MTF9DT05OX1BBUkFNUyAxNAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfU0VUX0hPU1RfQ0hOTF9DTEFTUyA1Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NITkxfTUFQIDIKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9SRUFEX1JFTU9URV9GRUFUIDIKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9FTkNSWVBUIDMyCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9XUklURV9MRV9IT1NUX1NVUFBPUlRFRCAyCi0KLSNkZWZpbmUgSENJQ19CTEVfUkFORF9ESV9TSVpFIDgKLSNkZWZpbmUgSENJQ19CTEVfRU5DUllQVF9LRVlfU0laRSAxNgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NUQVJUX0VOQyBcCi0gICg0ICsgSENJQ19CTEVfUkFORF9ESV9TSVpFICsgSENJQ19CTEVfRU5DUllQVF9LRVlfU0laRSkKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0xUS19SRVFfUkVQTFkgKDIgKyBIQ0lDX0JMRV9FTkNSWVBUX0tFWV9TSVpFKQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfTFRLX1JFUV9ORUdfUkVQTFkgMgotI2RlZmluZSBIQ0lDX0JMRV9DSE5MX01BUF9TSVpFIDUKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9BRFZfREFUQSAzMQotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfQUREX0RFVl9SRVNPTFZJTkdfTElTVCAoNyArIEhDSUNfQkxFX0lSS19TSVpFICogMikKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9STV9ERVZfUkVTT0xWSU5HX0xJU1QgNwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NFVF9QUklWQUNZX01PREUgOAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX0NMRUFSX1JFU09MVklOR19MSVNUIDAKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9SRUFEX1JFU09MVklOR19MSVNUX1NJWkUgMAotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JFQURfUkVTT0xWQUJMRV9BRERSX1BFRVIgNwotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1JFQURfUkVTT0xWQUJMRV9BRERSX0xPQ0FMIDcKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfQUREUl9SRVNPTFVUSU9OX0VOQUJMRSAxCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfU0VUX1JBTkRfUFJJVl9BRERSX1RJTU9VVCAyCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9SRUFEX1BIWSAyCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfU0VUX0RFRkFVTFRfUEhZIDMKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9TRVRfUEhZIDcKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9FTkhfUlhfVEVTVCAzCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfRU5IX1RYX1RFU1QgNAotCi0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfU0VUX0RBVEFfTEVOR1RIIDYKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9XUklURV9FWFRFTkRFRF9TQ0FOX1BBUkFNIDExCi0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9SQ19QQVJBTV9SRVFfUkVQTFkgMTQKLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX0JMRV9SQ19QQVJBTV9SRVFfTkVHX1JFUExZIDMKLQotc3RhdGljIHZvaWQgYnRzbmRfaGNpY19pbnF1aXJ5KGNvbnN0IExBUCBpbnFfbGFwLCB1aW50OF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzcG9uc2VfY250KSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0lOUVVJUlk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0lOUVVJUlkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9JTlFVSVJZKTsKLQotICBMQVBfVE9fU1RSRUFNKHBwLCBpbnFfbGFwKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBkdXJhdGlvbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcmVzcG9uc2VfY250KTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c25kX2hjaWNfaW5xX2NhbmNlbCh2b2lkKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0lOUV9DQU5DRUw7Ci0gIHAtPm9mZnNldCA9IDA7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9JTlFVSVJZX0NBTkNFTCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0lOUV9DQU5DRUwpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3Blcl9pbnFfbW9kZSh1aW50MTZfdCBtYXhfcGVyaW9kLCB1aW50MTZfdCBtaW5fcGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMQVAgaW5xX2xhcCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXNwb25zZV9jbnQpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfUEVSX0lOUV9NT0RFOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9QRVJJT0RJQ19JTlFVSVJZX01PREUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9QRVJfSU5RX01PREUpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIG1heF9wZXJpb2QpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBtaW5fcGVyaW9kKTsKLSAgTEFQX1RPX1NUUkVBTShwcCwgaW5xX2xhcCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgZHVyYXRpb24pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHJlc3BvbnNlX2NudCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfZXhpdF9wZXJfaW5xKHZvaWQpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfRVhJVF9QRVJfSU5ROwotICBwLT5vZmZzZXQgPSAwOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfRVhJVF9QRVJJT0RJQ19JTlFVSVJZX01PREUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9FWElUX1BFUl9JTlEpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2NyZWF0ZV9jb25uKGNvbnN0IFJhd0FkZHJlc3MmIGRlc3QsIHVpbnQxNl90IHBhY2tldF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwgdWludDhfdCBwYWdlX3NjYW5fbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQsIHVpbnQ4X3QgYWxsb3dfc3dpdGNoKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NSRUFURV9DT05OOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9DUkVBVEVfQ09OTkVDVElPTik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NSRUFURV9DT05OKTsKLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgZGVzdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBhY2tldF90eXBlcyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcGFnZV9zY2FuX3JlcF9tb2RlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYWdlX3NjYW5fbW9kZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNsb2NrX29mZnNldCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgYWxsb3dfc3dpdGNoKTsKLSAgYnRtX2FjbF9wYWdpbmcocCwgZGVzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c25kX2hjaWNfZGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0RJU0NPTk5FQ1Q7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0RJU0NPTk5FQ1QpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9ESVNDT05ORUNUKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByZWFzb24pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2FkZF9TQ09fY29ubih1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHBhY2tldF90eXBlcykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9BRERfU0NPX0NPTk47Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0FERF9TQ09fQ09OTkVDVElPTik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0FERF9TQ09fQ09OTik7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGFja2V0X3R5cGVzKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19jcmVhdGVfY29ubl9jYW5jZWwoY29uc3QgUmF3QWRkcmVzcyYgZGVzdCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9DUkVBVEVfQ09OTl9DQU5DRUw7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0NSRUFURV9DT05ORUNUSU9OX0NBTkNFTCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NSRUFURV9DT05OX0NBTkNFTCk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgZGVzdCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfYWNjZXB0X2Nvbm4oY29uc3QgUmF3QWRkcmVzcyYgZGVzdCwgdWludDhfdCByb2xlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0FDQ0VQVF9DT05OOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9BQ0NFUFRfQ09OTkVDVElPTl9SRVFVRVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQUNDRVBUX0NPTk4pOwotICBCREFERFJfVE9fU1RSRUFNKHBwLCBkZXN0KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByb2xlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZWplY3RfY29ubihjb25zdCBSYXdBZGRyZXNzJiBkZXN0LCB1aW50OF90IHJlYXNvbikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SRUpFQ1RfQ09OTjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1JFSkVDVF9DT05OKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCBkZXN0KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByZWFzb24pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2xpbmtfa2V5X3JlcV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaW5rS2V5JiBsaW5rX2tleSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9MSU5LX0tFWV9SRVFfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0xJTktfS0VZX1JFUVVFU1RfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9MSU5LX0tFWV9SRVFfUkVQTFkpOwotCi0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkX2FkZHIpOwotICBBUlJBWTE2X1RPX1NUUkVBTShwcCwgbGlua19rZXkuZGF0YSgpKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19saW5rX2tleV9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9MSU5LX0tFWV9ORUdfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0xJTktfS0VZX1JFUVVFU1RfTkVHX1JFUExZKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfTElOS19LRVlfTkVHX1JFUExZKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZF9hZGRyKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19waW5fY29kZV9yZXFfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fY29kZV9sZW4sIFBJTl9DT0RFIHBpbl9jb2RlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0gIGludCBpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9QSU5fQ09ERV9SRVFfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1BJTl9DT0RFX1JFUVVFU1RfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9QSU5fQ09ERV9SRVFfUkVQTFkpOwotCi0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkX2FkZHIpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBpbl9jb2RlX2xlbik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHBpbl9jb2RlX2xlbjsgaSsrKSAqcHArKyA9ICpwaW5fY29kZSsrOwotCi0gIGZvciAoOyBpIDwgUElOX0NPREVfTEVOOyBpKyspICpwcCsrID0gMDsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19waW5fY29kZV9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9QSU5fQ09ERV9ORUdfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1BJTl9DT0RFX1JFUVVFU1RfTkVHX1JFUExZKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfUElOX0NPREVfTkVHX1JFUExZKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZF9hZGRyKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgcGFja2V0X3R5cGVzKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NIQU5HRV9DT05OX1RZUEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0NIQU5HRV9DT05OX1BBQ0tFVF9UWVBFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQ0hBTkdFX0NPTk5fVFlQRSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGFja2V0X3R5cGVzKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19hdXRoX3JlcXVlc3QodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1RFRCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEUpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfc2V0X2Nvbm5fZW5jcnlwdCh1aW50MTZfdCBoYW5kbGUsIGJvb2wgZW5hYmxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1NFVF9DT05OX0VOQ1JZUFQ7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1NFVF9DT05OX0VOQ1JZUFRJT04pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9TRVRfQ09OTl9FTkNSWVBUKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGVuYWJsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcm10X25hbWVfcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLCB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfUk1UX05BTUVfUkVROwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9STVRfTkFNRV9SRVFVRVNUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfUk1UX05BTUVfUkVRKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZF9hZGRyKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwYWdlX3NjYW5fcmVwX21vZGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhZ2Vfc2Nhbl9tb2RlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgY2xvY2tfb2Zmc2V0KTsKLQotICBidG1fYWNsX3BhZ2luZyhwLCBiZF9hZGRyKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JtdF9uYW1lX3JlcV9jYW5jZWwoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9STVRfTkFNRV9SRVFfQ0FOQ0VMOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9STVRfTkFNRV9SRVFVRVNUX0NBTkNFTCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1JNVF9OQU1FX1JFUV9DQU5DRUwpOwotCi0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkX2FkZHIpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JtdF9mZWF0dXJlc19yZXEodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1JFQURfUk1UX0ZFQVRVUkVTKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ybXRfZXh0X2ZlYXR1cmVzKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYWdlX251bSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9STVRfRVhUX0ZFQVRVUkVTOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9SRUFEX1JNVF9FWFRfRkVBVFVSRVMpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9STVRfRVhUX0ZFQVRVUkVTKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhZ2VfbnVtKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ybXRfdmVyX3JlcSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9STVRfVkVSU0lPTl9JTkZPKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX3JtdF9jbGtfb2Zmc2V0KHVpbnQxNl90IGhhbmRsZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9DTURfSEFORExFOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9SRUFEX1JNVF9DTE9DS19PRkZTRVQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9DTURfSEFORExFKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlYWRfbG1wX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9MTVBfSEFORExFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19zZXR1cF9lc2NvX2Nvbm4odWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCB0cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlY2VpdmVfYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfbGF0ZW5jeSwgdWludDE2X3Qgdm9pY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmV0cmFuc19lZmZvcnQsIHVpbnQxNl90IHBhY2tldF90eXBlcykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9TRVRVUF9FU0NPOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9TRVRVUF9FU0NPX0NPTk5FQ1RJT04pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9TRVRVUF9FU0NPKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UMzJfVE9fU1RSRUFNKHBwLCB0cmFuc21pdF9iYW5kd2lkdGgpOwotICBVSU5UMzJfVE9fU1RSRUFNKHBwLCByZWNlaXZlX2JhbmR3aWR0aCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIG1heF9sYXRlbmN5KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgdm9pY2UpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHJldHJhbnNfZWZmb3J0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcGFja2V0X3R5cGVzKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19hY2NlcHRfZXNjb19jb25uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWNlaXZlX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9sYXRlbmN5LCB1aW50MTZfdCBjb250ZW50X2ZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmV0cmFuc19lZmZvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYWNrZXRfdHlwZXMpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQUNDRVBUX0VTQ087Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0FDQ0VQVF9FU0NPX0NPTk5FQ1RJT04pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9BQ0NFUFRfRVNDTyk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHRyYW5zbWl0X2JhbmR3aWR0aCk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHJlY2VpdmVfYmFuZHdpZHRoKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWF4X2xhdGVuY3kpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBjb250ZW50X2ZtdCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcmV0cmFuc19lZmZvcnQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwYWNrZXRfdHlwZXMpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlamVjdF9lc2NvX2Nvbm4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZWFzb24pIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfUkVKRUNUX0VTQ087Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1JFSkVDVF9FU0NPX0NPTk5FQ1RJT04pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9SRUpFQ1RfRVNDTyk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcmVhc29uKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19ob2xkX21vZGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfaG9sZF9wZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ob2xkX3BlcmlvZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9IT0xEX01PREU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0hPTERfTU9ERSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0hPTERfTU9ERSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWF4X2hvbGRfcGVyaW9kKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWluX2hvbGRfcGVyaW9kKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19zbmlmZl9tb2RlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X3NuaWZmX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9zbmlmZl9wZXJpb2QsIHVpbnQxNl90IHNuaWZmX2F0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzbmlmZl90aW1lb3V0KSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1NOSUZGX01PREU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1NOSUZGX01PREUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9TTklGRl9NT0RFKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBtYXhfc25pZmZfcGVyaW9kKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWluX3NuaWZmX3BlcmlvZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHNuaWZmX2F0dGVtcHQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBzbmlmZl90aW1lb3V0KTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19leGl0X3NuaWZmX21vZGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0VYSVRfU05JRkZfTU9ERSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEUpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcGFya19tb2RlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgYmVhY29uX21heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYmVhY29uX21pbl9pbnRlcnZhbCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9QQVJLX01PREU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1BBUktfTU9ERSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1BBUktfTU9ERSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgYmVhY29uX21heF9pbnRlcnZhbCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGJlYWNvbl9taW5faW50ZXJ2YWwpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2V4aXRfcGFya19tb2RlKHVpbnQxNl90IGhhbmRsZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9DTURfSEFORExFOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9FWElUX1BBUktfTU9ERSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEUpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcW9zX3NldHVwKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBmbGFncywgdWludDhfdCBzZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRva2VuX3JhdGUsIHVpbnQzMl90IHBlYWssIHVpbnQzMl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X3ZhcikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9RT1NfU0VUVVA7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1FPU19TRVRVUCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1FPU19TRVRVUCk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBmbGFncyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgc2VydmljZV90eXBlKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwcCwgdG9rZW5fcmF0ZSk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHBlYWspOwotICBVSU5UMzJfVE9fU1RSRUFNKHBwLCBsYXRlbmN5KTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwcCwgZGVsYXlfdmFyKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c25kX2hjaWNfc3dpdGNoX3JvbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByb2xlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1NXSVRDSF9ST0xFOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9TV0lUQ0hfUk9MRSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1NXSVRDSF9ST0xFKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZF9hZGRyKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCByb2xlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9wb2xpY3lfc2V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3Qgc2V0dGluZ3MpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUE9MSUNZX1NFVDsKLSAgcC0+b2Zmc2V0ID0gMDsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX1BPTElDWV9TRVRUSU5HUyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BPTElDWV9TRVQpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHNldHRpbmdzKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9kZWZfcG9saWN5X3NldCh1aW50MTZfdCBzZXR0aW5ncykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9XUklURV9ERUZfUE9MSUNZX1NFVDsKLSAgcC0+b2Zmc2V0ID0gMDsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX0RFRl9QT0xJQ1lfU0VUVElOR1MpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9XUklURV9ERUZfUE9MSUNZX1NFVCk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgc2V0dGluZ3MpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3NldF9ldmVudF9maWx0ZXIodWludDhfdCBmaWx0X3R5cGUsIHVpbnQ4X3QgZmlsdF9jb25kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBmaWx0X2NvbmQsIHVpbnQ4X3QgZmlsdF9jb25kX2xlbikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1NFVF9FVkVOVF9GSUxURVIpOwotCi0gIGlmIChmaWx0X3R5cGUpIHsKLSAgICBwLT5sZW4gPSAodWludDE2X3QpKEhDSUNfUFJFQU1CTEVfU0laRSArIDIgKyBmaWx0X2NvbmRfbGVuKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocHAsICh1aW50OF90KSgyICsgZmlsdF9jb25kX2xlbikpOwotCi0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCBmaWx0X3R5cGUpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZmlsdF9jb25kX3R5cGUpOwotCi0gICAgaWYgKGZpbHRfY29uZF90eXBlID09IEhDSV9GSUxURVJfQ09ORF9ERVZJQ0VfQ0xBU1MpIHsKLSAgICAgIERFVkNMQVNTX1RPX1NUUkVBTShwcCwgZmlsdF9jb25kKTsKLSAgICAgIGZpbHRfY29uZCArPSBERVZfQ0xBU1NfTEVOOwotICAgICAgREVWQ0xBU1NfVE9fU1RSRUFNKHBwLCBmaWx0X2NvbmQpOwotICAgICAgZmlsdF9jb25kICs9IERFVl9DTEFTU19MRU47Ci0KLSAgICAgIGZpbHRfY29uZF9sZW4gLT0gKDIgKiBERVZfQ0xBU1NfTEVOKTsKLSAgICB9IGVsc2UgaWYgKGZpbHRfY29uZF90eXBlID09IEhDSV9GSUxURVJfQ09ORF9CRF9BRERSKSB7Ci0gICAgICBCREFERFJfVE9fU1RSRUFNKHBwLCAqKChSYXdBZGRyZXNzKilmaWx0X2NvbmQpKTsKLSAgICAgIGZpbHRfY29uZCArPSBCRF9BRERSX0xFTjsKLQotICAgICAgZmlsdF9jb25kX2xlbiAtPSBCRF9BRERSX0xFTjsKLSAgICB9Ci0KLSAgICBpZiAoZmlsdF9jb25kX2xlbikgQVJSQVlfVE9fU1RSRUFNKHBwLCBmaWx0X2NvbmQsIGZpbHRfY29uZF9sZW4pOwotICB9IGVsc2UgewotICAgIHAtPmxlbiA9ICh1aW50MTZfdCkoSENJQ19QUkVBTUJMRV9TSVpFICsgMSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHBwLCAxKTsKLQotICAgIFVJTlQ4X1RPX1NUUkVBTShwcCwgZmlsdF90eXBlKTsKLSAgfQotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX3Bpbl90eXBlKHVpbnQ4X3QgdHlwZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQVJBTTE7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX1BJTl9UWVBFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIHR5cGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX2RlbGV0ZV9zdG9yZWRfa2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWxldGVfYWxsX2ZsYWcpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfREVMRVRFX1NUT1JFRF9LRVk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0RFTEVURV9TVE9SRURfTElOS19LRVkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9ERUxFVEVfU1RPUkVEX0tFWSk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgZGVsZXRlX2FsbF9mbGFnKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19jaGFuZ2VfbmFtZShCRF9OQU1FIG5hbWUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLSAgdWludDE2X3QgbGVuID0gc3RybGVuKChjaGFyKiluYW1lKSArIDE7Ci0KLSAgbWVtc2V0KHBwLCAwLCBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQ0hBTkdFX05BTUUpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9DSEFOR0VfTkFNRTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfQ0hBTkdFX0xPQ0FMX05BTUUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9DSEFOR0VfTkFNRSk7Ci0KLSAgaWYgKGxlbiA+IEhDSUNfUEFSQU1fU0laRV9DSEFOR0VfTkFNRSkgbGVuID0gSENJQ19QQVJBTV9TSVpFX0NIQU5HRV9OQU1FOwotCi0gIEFSUkFZX1RPX1NUUkVBTShwcCwgbmFtZSwgbGVuKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX25hbWUodm9pZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SRUFEX0NNRDsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9MT0NBTF9OQU1FKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfUkVBRF9DTUQpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX3BhZ2VfdG91dCh1aW50MTZfdCB0aW1lb3V0KSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfV1JJVEVfUEFHRV9UT1VUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0yKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCB0aW1lb3V0KTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9zY2FuX2VuYWJsZSh1aW50OF90IGZsYWcpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9XUklURV9TQ0FOX0VOQUJMRSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMSk7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBmbGFnKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9wYWdlc2Nhbl9jZmcodWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IHdpbmRvdykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQUdFU0NBTl9DRkc7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX1BBR0VTQ0FOX0NGRyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBR0VTQ0FOX0NGRyk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaW50ZXJ2YWwpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCB3aW5kb3cpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX2lucXNjYW5fY2ZnKHVpbnQxNl90IGludGVydmFsLCB1aW50MTZfdCB3aW5kb3cpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfSU5RU0NBTl9DRkc7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX0lOUVVJUllTQ0FOX0NGRyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1dSSVRFX0lOUVNDQU5fQ0ZHKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBpbnRlcnZhbCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHdpbmRvdyk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfd3JpdGVfYXV0aF9lbmFibGUodWludDhfdCBmbGFnKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfV1JJVEVfQVVUSEVOVElDQVRJT05fRU5BQkxFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIGZsYWcpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX2Rldl9jbGFzcyhERVZfQ0xBU1MgZGV2X2NsYXNzKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMzsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfV1JJVEVfQ0xBU1NfT0ZfREVWSUNFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0zKTsKLQotICBERVZDTEFTU19UT19TVFJFQU0ocHAsIGRldl9jbGFzcyk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfd3JpdGVfdm9pY2Vfc2V0dGluZ3ModWludDE2X3QgZmxhZ3MpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0yOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9XUklURV9WT0lDRV9TRVRUSU5HUyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMik7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgZmxhZ3MpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX2F1dG9fZmx1c2hfdG91dCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHRvdXQpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQ7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHRvdXQpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlYWRfdHhfcG93ZXIodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHR5cGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfUkVBRF9UWF9QT1dFUjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1JFQURfVFhfUE9XRVIpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgdHlwZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfaG9zdF9udW1feG1pdHRlZF9wa3RzKHVpbnQ4X3QgbnVtX2hhbmRsZXMsIHVpbnQxNl90KiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBudW1fcGt0cykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIDEgKyAobnVtX2hhbmRsZXMgKiA0KTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfSE9TVF9OVU1fUEFDS0VUU19ET05FKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwLT5sZW4gLSBIQ0lDX1BSRUFNQkxFX1NJWkUpOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgbnVtX2hhbmRsZXMpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2hhbmRsZXM7IGkrKykgewotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZVtpXSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbnVtX3BrdHNbaV0pOwotICB9Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfd3JpdGVfbGlua19zdXBlcl90b3V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdGltZW91dCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9XUklURV9MSU5LX1NVUEVSX1RPVVQ7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX0xJTktfU1VQRVJfVE9VVCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1dSSVRFX0xJTktfU1VQRVJfVE9VVCk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgdGltZW91dCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfd3JpdGVfY3VyX2lhY19sYXAodWludDhfdCBudW1fY3VyX2lhYywgTEFQKiBjb25zdCBpYWNfbGFwKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgMSArIChMQVBfTEVOICogbnVtX2N1cl9pYWMpOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9XUklURV9DVVJSRU5UX0lBQ19MQVApOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHAtPmxlbiAtIEhDSUNfUFJFQU1CTEVfU0laRSk7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBudW1fY3VyX2lhYyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY3VyX2lhYzsgaSsrKSBMQVBfVE9fU1RSRUFNKHBwLCBpYWNfbGFwW2ldKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIExpc2JvbiBGZWF0dXJlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYnRzbmRfaGNpY19zbmlmZl9zdWJfcmF0ZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3JlbW90ZV9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2xvY2FsX2xhdCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9TTklGRl9TVUJfUkFURTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfU05JRkZfU1VCX1JBVEUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9TTklGRl9TVUJfUkFURSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWF4X2xhdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIG1pbl9yZW1vdGVfbGF0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgbWluX2xvY2FsX2xhdCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi0vKioqKiBFeHRlbmRlZCBJbnF1aXJ5IFJlc3BvbnNlIENvbW1hbmRzICoqKiovCi12b2lkIGJ0c25kX2hjaWNfd3JpdGVfZXh0X2lucXVpcnlfcmVzcG9uc2Uodm9pZCogYnVmZmVyLCB1aW50OF90IGZlY19yZXEpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopYnVmZmVyOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9FWFRfSU5RX1JFU1A7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1dSSVRFX0VYVF9JTlFfUkVTUE9OU0UpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9FWFRfSU5RX1JFU1ApOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgZmVjX3JlcSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfaW9fY2FwX3JlcV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGNhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9vYl9wcmVzZW50LCB1aW50OF90IGF1dGhfcmVxKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0lPX0NBUF9SRVNQOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9JT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9JT19DQVBfUkVTUCk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgY2FwYWJpbGl0eSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgb29iX3ByZXNlbnQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGF1dGhfcmVxKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19lbmhhbmNlZF9zZXRfdXBfc3luY2hyb25vdXNfY29ubmVjdGlvbigKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFyYW1zKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0VOSF9TRVRfRVNDT19DT05OOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9FTkhfU0VUVVBfRVNDT19DT05ORUNUSU9OKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfRU5IX1NFVF9FU0NPX0NPTk4pOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGNvbm5faGFuZGxlKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnRyYW5zbWl0X2JhbmR3aWR0aCk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5yZWNlaXZlX2JhbmR3aWR0aCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnRyYW5zbWl0X2NvZGluZ19mb3JtYXQuY29kaW5nX2Zvcm1hdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT50cmFuc21pdF9jb2RpbmdfZm9ybWF0LmNvbXBhbnlfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLAotICAgICAgICAgICAgICAgICAgIHBfcGFyYW1zLT50cmFuc21pdF9jb2RpbmdfZm9ybWF0LnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJlY2VpdmVfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJlY2VpdmVfY29kaW5nX2Zvcm1hdC5jb21wYW55X2lkKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwKLSAgICAgICAgICAgICAgICAgICBwX3BhcmFtcy0+cmVjZWl2ZV9jb2RpbmdfZm9ybWF0LnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT50cmFuc21pdF9jb2RlY19mcmFtZV9zaXplKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJlY2VpdmVfY29kZWNfZnJhbWVfc2l6ZSk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5pbnB1dF9iYW5kd2lkdGgpOwotICBVSU5UMzJfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+b3V0cHV0X2JhbmR3aWR0aCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPmlucHV0X2NvZGluZ19mb3JtYXQuY29kaW5nX2Zvcm1hdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5pbnB1dF9jb2RpbmdfZm9ybWF0LmNvbXBhbnlfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+aW5wdXRfY29kaW5nX2Zvcm1hdC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5vdXRwdXRfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm91dHB1dF9jb2RpbmdfZm9ybWF0LmNvbXBhbnlfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+b3V0cHV0X2NvZGluZ19mb3JtYXQudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPmlucHV0X2NvZGVkX2RhdGFfc2l6ZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5vdXRwdXRfY29kZWRfZGF0YV9zaXplKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+aW5wdXRfcGNtX2RhdGFfZm9ybWF0KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+b3V0cHV0X3BjbV9kYXRhX2Zvcm1hdCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPmlucHV0X3BjbV9wYXlsb2FkX21zYl9wb3NpdGlvbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm91dHB1dF9wY21fcGF5bG9hZF9tc2JfcG9zaXRpb24pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5pbnB1dF9kYXRhX3BhdGgpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5vdXRwdXRfZGF0YV9wYXRoKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+aW5wdXRfdHJhbnNwb3J0X3VuaXRfc2l6ZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm91dHB1dF90cmFuc3BvcnRfdW5pdF9zaXplKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm1heF9sYXRlbmN5X21zKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnBhY2tldF90eXBlcyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJldHJhbnNtaXNzaW9uX2VmZm9ydCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFyYW1zKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0VOSF9BQ0NfRVNDT19DT05OOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9FTkhfQUNDRVBUX0VTQ09fQ09OTkVDVElPTik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0VOSF9BQ0NfRVNDT19DT05OKTsKLQotICBCREFERFJfVE9fU1RSRUFNKHBwLCBiZF9hZGRyKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnRyYW5zbWl0X2JhbmR3aWR0aCk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5yZWNlaXZlX2JhbmR3aWR0aCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnRyYW5zbWl0X2NvZGluZ19mb3JtYXQuY29kaW5nX2Zvcm1hdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT50cmFuc21pdF9jb2RpbmdfZm9ybWF0LmNvbXBhbnlfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLAotICAgICAgICAgICAgICAgICAgIHBfcGFyYW1zLT50cmFuc21pdF9jb2RpbmdfZm9ybWF0LnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJlY2VpdmVfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJlY2VpdmVfY29kaW5nX2Zvcm1hdC5jb21wYW55X2lkKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwKLSAgICAgICAgICAgICAgICAgICBwX3BhcmFtcy0+cmVjZWl2ZV9jb2RpbmdfZm9ybWF0LnZlbmRvcl9zcGVjaWZpY19jb2RlY19pZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT50cmFuc21pdF9jb2RlY19mcmFtZV9zaXplKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJlY2VpdmVfY29kZWNfZnJhbWVfc2l6ZSk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5pbnB1dF9iYW5kd2lkdGgpOwotICBVSU5UMzJfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+b3V0cHV0X2JhbmR3aWR0aCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPmlucHV0X2NvZGluZ19mb3JtYXQuY29kaW5nX2Zvcm1hdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5pbnB1dF9jb2RpbmdfZm9ybWF0LmNvbXBhbnlfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+aW5wdXRfY29kaW5nX2Zvcm1hdC52ZW5kb3Jfc3BlY2lmaWNfY29kZWNfaWQpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5vdXRwdXRfY29kaW5nX2Zvcm1hdC5jb2RpbmdfZm9ybWF0KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm91dHB1dF9jb2RpbmdfZm9ybWF0LmNvbXBhbnlfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+b3V0cHV0X2NvZGluZ19mb3JtYXQudmVuZG9yX3NwZWNpZmljX2NvZGVjX2lkKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPmlucHV0X2NvZGVkX2RhdGFfc2l6ZSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5vdXRwdXRfY29kZWRfZGF0YV9zaXplKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+aW5wdXRfcGNtX2RhdGFfZm9ybWF0KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+b3V0cHV0X3BjbV9kYXRhX2Zvcm1hdCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPmlucHV0X3BjbV9wYXlsb2FkX21zYl9wb3NpdGlvbik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm91dHB1dF9wY21fcGF5bG9hZF9tc2JfcG9zaXRpb24pOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5pbnB1dF9kYXRhX3BhdGgpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBfcGFyYW1zLT5vdXRwdXRfZGF0YV9wYXRoKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBwX3BhcmFtcy0+aW5wdXRfdHJhbnNwb3J0X3VuaXRfc2l6ZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm91dHB1dF90cmFuc3BvcnRfdW5pdF9zaXplKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPm1heF9sYXRlbmN5X21zKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnBhY2tldF90eXBlcyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgcF9wYXJhbXMtPnJldHJhbnNtaXNzaW9uX2VmZm9ydCk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfaW9fY2FwX3JlcV9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVycl9jb2RlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0lPX0NBUF9ORUdfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0lPX0NBUF9SRVFfTkVHX1JFUExZKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfSU9fQ0FQX05FR19SRVBMWSk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgZXJyX2NvZGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlYWRfbG9jYWxfb29iX2RhdGEodm9pZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SX0xPQ0FMX09PQjsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9MT0NBTF9PT0JfREFUQSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1JfTE9DQUxfT09CKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY191c2VyX2NvbmZfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBpc195ZXMpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfVUNPTkZfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgaWYgKCFpc195ZXMpIHsKLSAgICAvKiBOZWdhdGl2ZSByZXBseSAqLwotICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9VU0VSX0NPTkZfVkFMVUVfTkVHX1JFUExZKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBDb25maXJtYXRpb24gKi8KLSAgICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfVVNFUl9DT05GX1JFUVVFU1RfUkVQTFkpOwotICB9Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfVUNPTkZfUkVQTFkpOwotCi0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkX2FkZHIpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3VzZXJfcGFzc2tleV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCB2YWx1ZSkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9VX1BLRVlfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1VTRVJfUEFTU0tFWV9SRVFfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9VX1BLRVlfUkVQTFkpOwotCi0gIEJEQUREUl9UT19TVFJFQU0ocHAsIGJkX2FkZHIpOwotICBVSU5UMzJfVE9fU1RSRUFNKHBwLCB2YWx1ZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfdXNlcl9wYXNza2V5X25lZ19yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1VfUEtFWV9ORUdfUkVQTFk7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1VTRVJfUEFTU0tFWV9SRVFfTkVHX1JFUExZKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfVV9QS0VZX05FR19SRVBMWSk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVtX29vYl9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCBPY3RldDE2JiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgcikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SRU1fT09CX1JFUExZOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9SRU1fT09CX0RBVEFfUkVRX1JFUExZKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfUkVNX09PQl9SRVBMWSk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIEFSUkFZMTZfVE9fU1RSRUFNKHBwLCBjLmRhdGEoKSk7Ci0gIEFSUkFZMTZfVE9fU1RSRUFNKHBwLCByLmRhdGEoKSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVtX29vYl9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SRU1fT09CX05FR19SRVBMWTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVNX09PQl9EQVRBX1JFUV9ORUdfUkVQTFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9SRU1fT09CX05FR19SRVBMWSk7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVhZF9pbnFfdHhfcG93ZXIodm9pZCkgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9SX1RYX1BPV0VSOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9SRUFEX0lOUV9UWF9QT1dFUl9MRVZFTCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1JfVFhfUE9XRVIpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3NlbmRfa2V5cHJlc3Nfbm90aWYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBub3RpZikgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilvc2lfbWFsbG9jKEhDSV9DTURfQlVGX1NJWkUpOwotICB1aW50OF90KiBwcCA9ICh1aW50OF90KikocCArIDEpOwotCi0gIHAtPmxlbiA9IEhDSUNfUFJFQU1CTEVfU0laRSArIEhDSUNfUEFSQU1fU0laRV9TRU5EX0tFWVBSRVNTX05PVElGOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9TRU5EX0tFWVBSRVNTX05PVElGKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfU0VORF9LRVlQUkVTU19OT1RJRik7Ci0KLSAgQkRBRERSX1RPX1NUUkVBTShwcCwgYmRfYWRkcik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgbm90aWYpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotLyoqKiogZW5kIG9mIFNpbXBsZSBQYWlyaW5nIENvbW1hbmRzICoqKiovCi0KLXZvaWQgYnRzbmRfaGNpY19lbmhhbmNlZF9mbHVzaCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFja2V0X3R5cGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfRU5IQU5DRURfRkxVU0g7Ci0gIHAtPm9mZnNldCA9IDA7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9FTkhBTkNFRF9GTFVTSCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0VOSEFOQ0VEX0ZMVVNIKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIHBhY2tldF90eXBlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFbmQgb2YgTGlzYm9uIENvbW1hbmRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBidHNuZF9oY2ljX2dldF9saW5rX3F1YWxpdHkodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0dFVF9MSU5LX1FVQUxJVFkpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9DTURfSEFORExFKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBoYW5kbGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlYWRfcnNzaSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9SU1NJKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRSk7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZV9jb21wbGV0ZShSZWFkRW5jS2V5U2l6ZUNiIGNiLCB1aW50OF90KiByZXR1cm5fcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXR1cm5fcGFyYW1ldGVyc19sZW5ndGgpIHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDhfdCBrZXlfc2l6ZTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHN0YXR1cywgcmV0dXJuX3BhcmFtZXRlcnMpOwotICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcmV0dXJuX3BhcmFtZXRlcnMpOwotICBTVFJFQU1fVE9fVUlOVDgoa2V5X3NpemUsIHJldHVybl9wYXJhbWV0ZXJzKTsKLQotICBzdGQ6Om1vdmUoY2IpLlJ1bihzdGF0dXMsIGhhbmRsZSwga2V5X3NpemUpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVhZF9lbmNyeXB0aW9uX2tleV9zaXplKHVpbnQxNl90IGhhbmRsZSwgUmVhZEVuY0tleVNpemVDYiBjYikgewotICBjb25zdGV4cHIgdWludDhfdCBsZW4gPSAyOwotICB1aW50OF90IHBhcmFtW2xlbl07Ci0gIG1lbXNldChwYXJhbSwgMCwgbGVuKTsKLQotICB1aW50OF90KiBwID0gcGFyYW07Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZF93aXRoX2NiKEZST01fSEVSRSwgSENJX1JFQURfRU5DUl9LRVlfU0laRSwgcGFyYW0sIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZyZWFkX2VuY3J5cHRpb25fa2V5X3NpemVfY29tcGxldGUsIGJhc2U6OlBhc3NlZCgmY2IpKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXIodWludDE2X3QgaGFuZGxlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEU7Ci0gIHAtPm9mZnNldCA9IDA7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUik7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEUpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfQ01EX0hBTkRMRTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfUkVBRF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX0NNRF9IQU5ETEUpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIGhhbmRsZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfZW5hYmxlX3Rlc3RfbW9kZSh2b2lkKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1JFQURfQ01EOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9FTkFCTEVfREVWX1VOREVSX1RFU1RfTU9ERSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgSENJQ19QQVJBTV9TSVpFX1JFQURfQ01EKTsKLQotICBidHVfaGNpZl9zZW5kX2NtZChMT0NBTF9CUl9FRFJfQ09OVFJPTExFUl9JRCwgcCk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9pbnFzY2FuX3R5cGUodWludDhfdCB0eXBlKSB7Ci0gIEJUX0hEUiogcCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoSENJX0NNRF9CVUZfU0laRSk7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgSENJQ19QQVJBTV9TSVpFX1dSSVRFX1BBUkFNMTsKLSAgcC0+b2Zmc2V0ID0gMDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHBwLCBIQ0lfV1JJVEVfSU5RU0NBTl9UWVBFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIHR5cGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX2lucXVpcnlfbW9kZSh1aW50OF90IG1vZGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9XUklURV9JTlFVSVJZX01PREUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIEhDSUNfUEFSQU1fU0laRV9XUklURV9QQVJBTTEpOwotCi0gIFVJTlQ4X1RPX1NUUkVBTShwcCwgbW9kZSk7Ci0KLSAgYnR1X2hjaWZfc2VuZF9jbWQoTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQsIHApOwotfQotCi12b2lkIGJ0c25kX2hjaWNfd3JpdGVfcGFnZXNjYW5fdHlwZSh1aW50OF90IHR5cGUpIHsKLSAgQlRfSERSKiBwID0gKEJUX0hEUiopb3NpX21hbGxvYyhIQ0lfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcHAgPSAodWludDhfdCopKHAgKyAxKTsKLQotICBwLT5sZW4gPSBIQ0lDX1BSRUFNQkxFX1NJWkUgKyBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xOwotICBwLT5vZmZzZXQgPSAwOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocHAsIEhDSV9XUklURV9QQUdFU0NBTl9UWVBFKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHBwLCBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocHAsIHR5cGUpOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotLyogTXVzdCBoYXZlIHJvb20gdG8gc3RvcmUgQlRfSERSICsgbWF4IFZTQyBsZW5ndGggKyBjYWxsYmFjayBwb2ludGVyICovCi0jaWYgKEhDSV9DTURfQlVGX1NJWkUgPCAyNjgpCi0jZXJyb3IgIkhDSV9DTURfQlVGX1NJWkUgbXVzdCBiZSBsYXJnZXIgdGhhbiAyNjgiCi0jZW5kaWYKLQotdm9pZCBidHNuZF9oY2ljX3ZlbmRvcl9zcGVjX2NtZCh2b2lkKiBidWZmZXIsIHVpbnQxNl90IG9wY29kZSwgdWludDhfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdm9pZCogcF9jbWRfY3BsdF9jYmFjaykgewotICBCVF9IRFIqIHAgPSAoQlRfSERSKilidWZmZXI7Ci0gIHVpbnQ4X3QqIHBwID0gKHVpbnQ4X3QqKShwICsgMSk7Ci0KLSAgcC0+bGVuID0gSENJQ19QUkVBTUJMRV9TSVpFICsgbGVuOwotICBwLT5vZmZzZXQgPSBzaXplb2Yodm9pZCopOwotCi0gICooKHZvaWQqKilwcCkgPQotICAgICAgcF9jbWRfY3BsdF9jYmFjazsgLyogU3RvcmUgY29tbWFuZCBjb21wbGV0ZSBjYWxsYmFjayBpbiBidWZmZXIgKi8KLSAgcHAgKz0gc2l6ZW9mKHZvaWQqKTsgIC8qIFNraXAgb3ZlciBjYWxsYmFjayBwb2ludGVyICovCi0KLSAgVUlOVDE2X1RPX1NUUkVBTShwcCwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMgfCBvcGNvZGUpOwotICBVSU5UOF9UT19TVFJFQU0ocHAsIGxlbik7Ci0gIEFSUkFZX1RPX1NUUkVBTShwcCwgcF9kYXRhLCBsZW4pOwotCi0gIGJ0dV9oY2lmX3NlbmRfY21kKExPQ0FMX0JSX0VEUl9DT05UUk9MTEVSX0lELCBwKTsKLX0KLQotYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6SW50ZXJmYWNlIGludGVyZmFjZV8gPSB7Ci0gICAgLy8gTElOS19DT05UUk9MCi0gICAgLlN0YXJ0SW5xdWlyeSA9IGJ0c25kX2hjaWNfaW5xdWlyeSwgICAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MDQwMQotICAgIC5JbnF1aXJ5Q2FuY2VsID0gYnRzbmRfaGNpY19pbnFfY2FuY2VsLCAgICAgICAgICAgICAgIC8vIE9DRiAweDA0MDIKLSAgICAuU3RhcnRQZXJpb2RpY0lucXVpcnlNb2RlID0gYnRzbmRfaGNpY19wZXJfaW5xX21vZGUsICAvLyBPQ0YgMHgwNDAzCi0gICAgLkV4aXRQZXJpb2RpY0lucXVpcnlNb2RlID0gYnRzbmRfaGNpY19leGl0X3Blcl9pbnEsICAgLy8gT0NGIDB4MDQwNAotICAgIC5DcmVhdGVDb25uZWN0aW9uID0gYnRzbmRfaGNpY19jcmVhdGVfY29ubiwgICAgICAgICAgIC8vIE9DRiAweDA0MDUKLSAgICAuRGlzY29ubmVjdCA9IGJ0c25kX2hjaWNfZGlzY29ubmVjdCwgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwNDA2Ci0gICAgLy8gVU5VU0VEIE9DRiAweDA0MDcgYnRzbmRfaGNpY19hZGRfU0NPX2Nvbm4KLSAgICAuQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbCA9IGJ0c25kX2hjaWNfY3JlYXRlX2Nvbm5fY2FuY2VsLCAgLy8gT0NGIDB4MDQwOAotICAgIC5BY2NlcHRDb25uZWN0aW9uUmVxdWVzdCA9IGJ0c25kX2hjaWNfYWNjZXB0X2Nvbm4sICAgICAgICAvLyBPQ0YgMHgwNDA5Ci0gICAgLlJlamVjdENvbm5lY3Rpb25SZXF1ZXN0ID0gYnRzbmRfaGNpY19yZWplY3RfY29ubiwgICAgICAgIC8vIE9DRiAweDA0MEEKLSAgICAuTGlua0tleVJlcXVlc3RSZXBseSA9IGJ0c25kX2hjaWNfbGlua19rZXlfcmVxX3JlcGx5LCAgICAgLy8gT0NGIDB4MDQwQgotICAgIC5MaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkgPQotICAgICAgICBidHNuZF9oY2ljX2xpbmtfa2V5X25lZ19yZXBseSwgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwNDBDLAotICAgIC5QaW5Db2RlUmVxdWVzdFJlcGx5ID0gYnRzbmRfaGNpY19waW5fY29kZV9yZXFfcmVwbHksICAvLyBPQ0YgMHgwNDBELAotICAgIC5QaW5Db2RlUmVxdWVzdE5lZ2F0aXZlUmVwbHkgPQotICAgICAgICBidHNuZF9oY2ljX3Bpbl9jb2RlX25lZ19yZXBseSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDA0MEUsCi0gICAgLkNoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlID0gYnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlLCAgLy8gT0NGIDB4MDQwRiwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MDQxMAotICAgIC5BdXRoZW50aWNhdGlvblJlcXVlc3RlZCA9IGJ0c25kX2hjaWNfYXV0aF9yZXF1ZXN0LCAgLy8gT0NGIDB4MDQxMSwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MDQxMgotICAgIC5TZXRDb25uZWN0aW9uRW5jcnlwdGlvbiA9IGJ0c25kX2hjaWNfc2V0X2Nvbm5fZW5jcnlwdCwgIC8vIE9DRiAweDA0MTMsCi0gICAgLy8gVU5VU0VEIE9DRiAweDA0MTQKLSAgICAuQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXkgPSBudWxscHRyLCAgLy8gT0NGIDB4MDQxNSwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MDQxNgotICAgIC5DZW50cmFsTGlua0tleSA9IG51bGxwdHIsICAvLyBPQ0YgMHgwNDE3LAotICAgIC8vIFVOVVNFRCBPQ0YgMHgwNDE4Ci0gICAgLlJlbW90ZU5hbWVSZXF1ZXN0ID0gYnRzbmRfaGNpY19ybXRfbmFtZV9yZXEsICAgICAgICAgICAgICAgIC8vIE9DRiAweDA0MTksCi0gICAgLlJlbW90ZU5hbWVSZXF1ZXN0Q2FuY2VsID0gYnRzbmRfaGNpY19ybXRfbmFtZV9yZXFfY2FuY2VsLCAgIC8vIE9DRiAweDA0MUEsCi0gICAgLlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyA9IGJ0c25kX2hjaWNfcm10X2ZlYXR1cmVzX3JlcSwgIC8vIE9DRiAweDA0MUIsCi0gICAgLlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzID0gYnRzbmRfaGNpY19ybXRfZXh0X2ZlYXR1cmVzLCAgIC8vIE9DRiAweDA0MUMsCi0gICAgLlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24gPSBidHNuZF9oY2ljX3JtdF92ZXJfcmVxLCAgICAgIC8vIE9DRiAweDA0MUQsCi0gICAgLy8gVU5VU0VEIE9DRiAweDA0MUUKLSAgICAuUmVhZENsb2NrT2Zmc2V0ID0gYnRzbmRfaGNpY19yZWFkX3JtdF9jbGtfb2Zmc2V0LCAgLy8gT0NGIDB4MDQxRiwKLSAgICAuUmVhZExtcEhhbmRsZSA9IGJ0c25kX2hjaWNfcmVhZF9sbXBfaGFuZGxlLCAgICAgICAgLy8gT0NGIDB4MDQyMCwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MDQyMCAtIDB4MDQyNwotICAgIC5TZXR1cFN5bmNocm9ub3VzQ29ubmVjdGlvbiA9IGJ0c25kX2hjaWNfc2V0dXBfZXNjb19jb25uLCAgICAvLyBPQ0YgMHgwNDI4LAotICAgIC5BY2NlcHRTeW5jaHJvbm91c0Nvbm5lY3Rpb24gPSBidHNuZF9oY2ljX2FjY2VwdF9lc2NvX2Nvbm4sICAvLyBPQ0YgMHgwNDI5LAotICAgIC5SZWplY3RTeW5jaHJvbm91c0Nvbm5lY3Rpb24gPSBidHNuZF9oY2ljX3JlamVjdF9lc2NvX2Nvbm4sICAvLyBPQ0YgMHgwNDJBLAotICAgIC5Jb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHkgPSBidHNuZF9oY2ljX2lvX2NhcF9yZXFfcmVwbHksICAgICAvLyBPQ0YgMHgwNDJCLAotICAgIC5Vc2VyQ29uZmlybWF0aW9uUmVxdWVzdFJlcGx5ID0gYnRzbmRfaGNpY191c2VyX2NvbmZfcmVwbHksICAvLyBPQ0YgMHgwNDJDLAotICAgIC5Vc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHkgPQotICAgICAgICBidHNuZF9oY2ljX3VzZXJfY29uZl9yZXBseSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MDQyRCwKLSAgICAuVXNlclBhc3NrZXlSZXF1ZXN0UmVwbHkgPSBidHNuZF9oY2ljX3VzZXJfcGFzc2tleV9yZXBseSwgIC8vIE9DRiAweDA0MkUsCi0gICAgLlVzZXJQYXNza2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkgPQotICAgICAgICBidHNuZF9oY2ljX3VzZXJfcGFzc2tleV9uZWdfcmVwbHksICAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MDQyRiwKLSAgICAuUmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseSA9IGJ0c25kX2hjaWNfcmVtX29vYl9yZXBseSwgIC8vIE9DRiAweDA0MzAsCi0gICAgLy8gVU5VU0VEIE9DRiAweDA0MzEgLSAweDA0MzIKLSAgICAuUmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5ID0KLSAgICAgICAgYnRzbmRfaGNpY19yZW1fb29iX25lZ19yZXBseSwgIC8vIE9DRiAweDA0MzMsCi0gICAgLklvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5ID0KLSAgICAgICAgYnRzbmRfaGNpY19pb19jYXBfcmVxX25lZ19yZXBseSwgIC8vIE9DRiAweDA0MzQsCi0gICAgLy8gVU5VU0VEIE9DRiAweDA0MzUgLSAweDA0M0MKLSAgICAuRW5oYW5jZWRTZXR1cFN5bmNocm9ub3VzQ29ubmVjdGlvbiA9Ci0gICAgICAgIGJ0c25kX2hjaWNfZW5oYW5jZWRfc2V0X3VwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24sICAvLyBPQ0YgMHgwNDNELAotICAgIC5FbmhhbmNlZEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvbiA9Ci0gICAgICAgIGJ0c25kX2hjaWNfZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24sICAvLyBPQ0YgMHgwNDNFLAotICAgIC8vIFVOVVNFRCBPQ0YgMHgwNDNGIC0gMHgwNDQ0Ci0gICAgLlJlbW90ZU9vYkV4dGVuZGVkRGF0YVJlcXVlc3RSZXBseSA9IG51bGxwdHIsICAvLyBPQ0YgMHgwNDQ1LAotCi0gICAgLy8gTElOS19QT0xJQ1kKLSAgICAuSG9sZE1vZGUgPSBidHNuZF9oY2ljX2hvbGRfbW9kZSwgIC8vIE9DRiAweDA4MDEsCi0gICAgLy8gVU5VU0VEIE9DRiAweDA4MDIKLSAgICAuU25pZmZNb2RlID0gYnRzbmRfaGNpY19zbmlmZl9tb2RlLCAgICAgICAgICAgLy8gT0NGIDB4MDgwMywKLSAgICAuRXhpdFNuaWZmTW9kZSA9IGJ0c25kX2hjaWNfZXhpdF9zbmlmZl9tb2RlLCAgLy8gT0NGIDB4MDgwNCwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MDgwNSAtIDB4MDgwNgotICAgIC5Rb3NTZXR1cCA9IGJ0c25kX2hjaWNfcW9zX3NldHVwLCAgLy8gT0NGIDB4MDgwNywKLSAgICAvLyBVTlVTRUQgT0NGIDB4MDgwOAotICAgIC5Sb2xlRGlzY292ZXJ5ID0gbnVsbHB0ciwgIC8vIE9DRiAweDA4MDksCi0gICAgLy8gVU5VU0VEIE9DRiAweDA4MEEKLSAgICAuU3RhcnRSb2xlU3dpdGNoID0gYnRzbmRfaGNpY19zd2l0Y2hfcm9sZSwgICAgICAgICAgICAgICAvLyBPQ0YgMHgwODBCLAotICAgIC5SZWFkTGlua1BvbGljeVNldHRpbmdzID0gbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDA4MEMsCi0gICAgLldyaXRlTGlua1BvbGljeVNldHRpbmdzID0gYnRzbmRfaGNpY193cml0ZV9wb2xpY3lfc2V0LCAgLy8gT0NGIDB4MDgwRCwKLSAgICAuUmVhZERlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MgPSBudWxscHRyLCAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwODBFLAotICAgIC5Xcml0ZURlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MgPQotICAgICAgICBidHNuZF9oY2ljX3dyaXRlX2RlZl9wb2xpY3lfc2V0LCAgICAgICAgICAvLyBPQ0YgMHgwODBGLAotICAgIC5GbG93U3BlY2lmaWNhdGlvbiA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwODEwLAotICAgIC5TbmlmZlN1YnJhdGluZyA9IGJ0c25kX2hjaWNfc25pZmZfc3ViX3JhdGUsICAvLyBPQ0YgMHgwODExLAotCi0gICAgLy8gQ09OVFJPTExFUl9BTkRfQkFTRUJBTkQKLSAgICAuU2V0RXZlbnRNYXNrID0gbnVsbHB0ciwgIC8vIE9DRiAweDBDMDEsCi0gICAgLy8gVU5VU0VEIE9DRiAweDBDMDIKLSAgICAuUmVzZXQgPSBudWxscHRyLCAgLy8gT0NGIDB4MEMwMywKLSAgICAvLyBVTlVTRUQgT0NGIDB4MEMwNAotICAgIC5TZXRFdmVudEZpbHRlciA9IGJ0c25kX2hjaWNfc2V0X2V2ZW50X2ZpbHRlciwgIC8vIE9DRiAweDBDMDUsCi0gICAgLy8gVU5VU0VEIE9DRiAweDBDMDYgPSAweDBDMDcKLSAgICAuRmx1c2ggPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDMDgsCi0gICAgLlJlYWRQaW5UeXBlID0gbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzA5LAotICAgIC5Xcml0ZVBpblR5cGUgPSBidHNuZF9oY2ljX3dyaXRlX3Bpbl90eXBlLCAgLy8gT0NGIDB4MEMwQSwKLSAgICAuQ3JlYXRlTmV3VW5pdEtleSA9IG51bGxwdHIsICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDMEIsCi0gICAgLy8gVU5VU0VEIE9DRiAweDBDMEMKLSAgICAuUmVhZFN0b3JlZExpbmtLZXkgPSBudWxscHRyLCAgLy8gT0NGIDB4MEMwRCwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MEMwRSAtIDB4MEMxMAotICAgIC5Xcml0ZVN0b3JlZExpbmtLZXkgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzExLAotICAgIC5EZWxldGVTdG9yZWRMaW5rS2V5ID0gYnRzbmRfaGNpY19kZWxldGVfc3RvcmVkX2tleSwgICAgICAgICAvLyBPQ0YgMHgwQzEyLAotICAgIC5Xcml0ZUxvY2FsTmFtZSA9IGJ0c25kX2hjaWNfY2hhbmdlX25hbWUsICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzEzLAotICAgIC5SZWFkTG9jYWxOYW1lID0gYnRzbmRfaGNpY19yZWFkX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzE0LAotICAgIC5SZWFkQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzE1LAotICAgIC5Xcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0ID0gYnRzbmRfaGNpY193cml0ZV9wYWdlX3RvdXQsICAvLyBPQ0YgMHgwQzE2LAotICAgIC5SZWFkUGFnZVRpbWVvdXQgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzE3LAotICAgIC5Xcml0ZVBhZ2VUaW1lb3V0ID0gbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzE4LAotICAgIC5SZWFkU2NhbkVuYWJsZSA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzE5LAotICAgIC5Xcml0ZVNjYW5FbmFibGUgPSBidHNuZF9oY2ljX3dyaXRlX3NjYW5fZW5hYmxlLCAgICAgICAgICAgICAvLyBPQ0YgMHgwQzFBLAotICAgIC5SZWFkUGFnZVNjYW5BY3Rpdml0eSA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzFCLAotICAgIC5Xcml0ZVBhZ2VTY2FuQWN0aXZpdHkgPSBidHNuZF9oY2ljX3dyaXRlX3BhZ2VzY2FuX2NmZywgICAgICAvLyBPQ0YgMHgwQzFDLAotICAgIC5SZWFkSW5xdWlyeVNjYW5BY3Rpdml0eSA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzFELAotICAgIC5Xcml0ZUlucXVpcnlTY2FuQWN0aXZpdHkgPSBidHNuZF9oY2ljX3dyaXRlX2lucXNjYW5fY2ZnLCAgICAvLyBPQ0YgMHgwQzFFLAotICAgIC5SZWFkQXV0aGVudGljYXRpb25FbmFibGUgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzFGLAotICAgIC8vIFVOVVNFRCBPQ0YgMHgwQzIwIC0gMHgwQzIyCi0gICAgLlJlYWRDbGFzc09mRGV2aWNlID0gbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDMjMsCi0gICAgLldyaXRlQ2xhc3NPZkRldmljZSA9IGJ0c25kX2hjaWNfd3JpdGVfZGV2X2NsYXNzLCAgICAgIC8vIE9DRiAweDBDMjQsCi0gICAgLlJlYWRWb2ljZVNldHRpbmcgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDMjUsCi0gICAgLldyaXRlVm9pY2VTZXR0aW5nID0gYnRzbmRfaGNpY193cml0ZV92b2ljZV9zZXR0aW5ncywgIC8vIE9DRiAweDBDMjYsCi0gICAgLlJlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXQgPQotICAgICAgICBidHNuZF9oY2ljX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXQsICAvLyBPQ0YgMHgwQzI3LAotICAgIC5Xcml0ZUF1dG9tYXRpY0ZsdXNoVGltZW91dCA9Ci0gICAgICAgIGJ0c25kX2hjaWNfd3JpdGVfYXV0b19mbHVzaF90b3V0LCAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzI4LAotICAgIC5SZWFkTnVtQnJvYWRjYXN0UmV0cmFuc21pdHMgPSBudWxscHRyLCAgICAgICAgICAgICAgLy8gT0NGIDB4MEMyOSwKLSAgICAuV3JpdGVOdW1Ccm9hZGNhc3RSZXRyYW5zbWl0cyA9IG51bGxwdHIsICAgICAgICAgICAgIC8vIE9DRiAweDBDMkEsCi0gICAgLlJlYWRIb2xkTW9kZUFjdGl2aXR5ID0gbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzJCLAotICAgIC5Xcml0ZUhvbGRNb2RlQWN0aXZpdHkgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MEMyQywKLSAgICAuUmVhZFRyYW5zbWl0UG93ZXJMZXZlbCA9IGJ0c25kX2hjaWNfcmVhZF90eF9wb3dlciwgIC8vIE9DRiAweDBDMkQsCi0gICAgLlJlYWRTeW5jaHJvbm91c0Zsb3dDb250cm9sRW5hYmxlID0gbnVsbHB0ciwgICAgICAgICAvLyBPQ0YgMHgwQzJFLAotICAgIC5Xcml0ZVN5bmNocm9ub3VzRmxvd0NvbnRyb2xFbmFibGUgPSBudWxscHRyLCAgICAgICAgLy8gT0NGIDB4MEMyRiwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MEMzMAotICAgIC5TZXRDb250cm9sbGVyVG9Ib3N0Rmxvd0NvbnRyb2wgPSBudWxscHRyLCAgLy8gT0NGIDB4MEMzMSwKLSAgICAvLyBVTlVTRUQgT0NGIDB4MEMzMgotICAgIC5Ib3N0QnVmZmVyU2l6ZSA9IG51bGxwdHIsICAvLyBPQ0YgMHgwQzMzLAotICAgIC8vIFVOVVNFRCBPQ0YgMHgwQzM0Ci0gICAgLkhvc3ROdW1Db21wbGV0ZWRQYWNrZXRzID0gbnVsbHB0ciwgIC8vIE9DRiAweDBDMzUsCi0gICAgLlJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0ID0KLSAgICAgICAgYnRzbmRfaGNpY193cml0ZV9saW5rX3N1cGVyX3RvdXQsICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDMzYsCi0gICAgLldyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzM3LAotICAgIC5SZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWMgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MEMzOCwKLSAgICAuUmVhZEN1cnJlbnRJYWNMYXAgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDMzksCi0gICAgLldyaXRlQ3VycmVudElhY0xhcCA9IGJ0c25kX2hjaWNfd3JpdGVfY3VyX2lhY19sYXAsICAgICAvLyBPQ0YgMHgwQzNBLAotICAgIC5TZXRBZmhIb3N0Q2hhbm5lbENsYXNzaWZpY2F0aW9uID0gbnVsbHB0ciwgICAgICAgICAgICAgLy8gT0NGIDB4MEMzRiwKLSAgICAuUmVhZElucXVpcnlTY2FuVHlwZSA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNDIsCi0gICAgLldyaXRlSW5xdWlyeVNjYW5UeXBlID0gYnRzbmRfaGNpY193cml0ZV9pbnFzY2FuX3R5cGUsICAvLyBPQ0YgMHgwQzQzLAotICAgIC5SZWFkSW5xdWlyeU1vZGUgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MEM0NCwKLSAgICAuV3JpdGVJbnF1aXJ5TW9kZSA9IGJ0c25kX2hjaWNfd3JpdGVfaW5xdWlyeV9tb2RlLCAgICAgIC8vIE9DRiAweDBDNDUsCi0gICAgLlJlYWRQYWdlU2NhblR5cGUgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzQ2LAotICAgIC5Xcml0ZVBhZ2VTY2FuVHlwZSA9IGJ0c25kX2hjaWNfd3JpdGVfcGFnZXNjYW5fdHlwZSwgICAgLy8gT0NGIDB4MEM0NywKLSAgICAuUmVhZEFmaENoYW5uZWxBc3Nlc3NtZW50TW9kZSA9IG51bGxwdHIsICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNDgsCi0gICAgLldyaXRlQWZoQ2hhbm5lbEFzc2Vzc21lbnRNb2RlID0gbnVsbHB0ciwgICAgICAgICAgICAgICAvLyBPQ0YgMHgwQzQ5LAotICAgIC5SZWFkRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2UgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgLy8gT0NGIDB4MEM1MSwKLSAgICAuV3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZSA9Ci0gICAgICAgIGJ0c25kX2hjaWNfd3JpdGVfZXh0X2lucXVpcnlfcmVzcG9uc2UsICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNTIsCi0gICAgLlJlZnJlc2hFbmNyeXB0aW9uS2V5ID0gbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNTMsCi0gICAgLlJlYWRTaW1wbGVQYWlyaW5nTW9kZSA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNTUsCi0gICAgLldyaXRlU2ltcGxlUGFpcmluZ01vZGUgPSBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNTYsCi0gICAgLlJlYWRMb2NhbE9vYkRhdGEgPSBidHNuZF9oY2ljX3JlYWRfbG9jYWxfb29iX2RhdGEsICAgICAgICAgIC8vIE9DRiAweDBDNTcsCi0gICAgLlJlYWRJbnF1aXJ5UmVzcG9uc2VUcmFuc21pdFBvd2VyTGV2ZWwgPSBudWxscHRyLCAgICAgICAgICAgIC8vIE9DRiAweDBDNTgsCi0gICAgLldyaXRlSW5xdWlyeVRyYW5zbWl0UG93ZXJMZXZlbCA9IG51bGxwdHIsICAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNTksCi0gICAgLkVuaGFuY2VkRmx1c2ggPSBidHNuZF9oY2ljX2VuaGFuY2VkX2ZsdXNoLCAgICAgICAgICAgICAgICAgIC8vIE9DRiAweDBDNUYsCi0gICAgLlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbiA9IGJ0c25kX2hjaWNfc2VuZF9rZXlwcmVzc19ub3RpZiwgIC8vIE9DRiAweDBDNjAsCi0KLSAgICAvLyBTVEFUVVNfUEFSQU1FVEVSUwotICAgIC5SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIgPQotICAgICAgICBidHNuZF9oY2ljX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlciwgICAgICAvLyBPQ0YgMHgxNDAxLAotICAgIC5SZXNldEZhaWxlZENvbnRhY3RDb3VudGVyID0gbnVsbHB0ciwgICAgICAgICAgICAvLyBPQ0YgMHgxNDAyLAotICAgIC5SZWFkTGlua1F1YWxpdHkgPSBidHNuZF9oY2ljX2dldF9saW5rX3F1YWxpdHksICAvLyBPQ0YgMHgxNDAzLAotICAgIC8vIFVOVVNFRCBPQ0YgMHgxNDA0Ci0gICAgLlJlYWRSc3NpID0gYnRzbmRfaGNpY19yZWFkX3Jzc2ksICAvLyBPQ0YgMHgxNDA1LAotICAgIC5SZWFkQWZoQ2hhbm5lbE1hcCA9IG51bGxwdHIsICAgICAgLy8gT0NGIDB4MTQwNiwKLSAgICAuUmVhZENsb2NrID0gbnVsbHB0ciwgICAgICAgICAgICAgIC8vIE9DRiAweDE0MDcsCi0gICAgLlJlYWRFbmNyeXB0aW9uS2V5U2l6ZSA9IG51bGxwdHIsICAvLyBPQ0YgMHgxNDA4LAotfTsKLQotY29uc3QgYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6SW50ZXJmYWNlJgotYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6R2V0SW50ZXJmYWNlKCkgewotICByZXR1cm4gaW50ZXJmYWNlXzsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2hpZC9oaWRfY29ubi5oIGIvc3RhY2svaGlkL2hpZF9jb25uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MmQ0OTEuLjAwMDAwMDAKLS0tIGEvc3RhY2svaGlkL2hpZF9jb25uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBISUQgY29ubmVjdGlvbiBpbnRlcm5hbCBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSElEX0NPTk5fSAotI2RlZmluZSBISURfQ09OTl9ICi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgSElEX0NPTk5fU1RBVEVfVU5VU0VEID0gMCwKLSAgSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19DVFJMID0gMSwKLSAgSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19JTlRSID0gMiwKLSAgSElEX0NPTk5fU1RBVEVfQ09ORklHID0gMywKLSAgSElEX0NPTk5fU1RBVEVfQ09OTkVDVEVEID0gNCwKLSAgSElEX0NPTk5fU1RBVEVfRElTQ09OTkVDVElORyA9IDUsCi0gIEhJRF9DT05OX1NUQVRFX1NFQ1VSSVRZID0gNiwKLX0gdEhJRF9DT05OX1NUQVRFOwotCi0vKiBEZWZpbmUgdGhlIEhJRCBDb25uZWN0aW9uIEJsb2NrCi0qLwotdHlwZWRlZiBzdHJ1Y3QgaGlkX2Nvbm4gewotICB0SElEX0NPTk5fU1RBVEUgY29ubl9zdGF0ZTsKLQotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0KLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBzdGF0ZV90ZXh0KGNvbnN0IHRISURfQ09OTl9TVEFURSYgc3RhdGUpIHsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9DT05OX1NUQVRFX1VOVVNFRCk7Ci0gICAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfQ1RSTCk7Ci0gICAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfSU5UUik7Ci0gICAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9DT05OX1NUQVRFX0NPTkZJRyk7Ci0gICAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkcpOwotICAgICAgQ0FTRV9SRVRVUk5fVEVYVChISURfQ09OTl9TVEFURV9TRUNVUklUWSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV05bJWhodV0iLCBzdGF0ZSk7Ci0gICAgfQotICB9Ci0jdW5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotCi0jZGVmaW5lIEhJRF9DT05OX0ZMQUdTX0lTX09SSUcgKDB4MDEpCi0jZGVmaW5lIEhJRF9DT05OX0ZMQUdTX0NPTkdFU1RFRCAoMHgyMCkKLSNkZWZpbmUgSElEX0NPTk5fRkxBR1NfSU5BQ1RJVkUgKDB4NDApCi0KLSAgdWludDhfdCBjb25uX2ZsYWdzOwotCi0gIHVpbnQxNl90IGN0cmxfY2lkOwotICB1aW50MTZfdCBpbnRyX2NpZDsKLSAgdWludDE2X3QgcmVtX210dV9zaXplOwotICB1aW50MTZfdCBkaXNjX3JlYXNvbjsgLyogUmVhc29uIGZvciBkaXNjb25uZWN0aW5nIChmb3IgSElEX0hERVZfRVZUX0NMT1NFKSAqLwotICBhbGFybV90KiBwcm9jZXNzX3JlcGFnZV90aW1lcjsKLX0gdEhJRF9DT05OOwotCi0jZGVmaW5lIEhJRF9TRUNfQ0hOIDEKLSNkZWZpbmUgSElEX05PU0VDX0NITiAyCi0KLSNkZWZpbmUgSElERF9TRUNfQ0hOIDMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9oaWQvaGlkZF9hcGkuY2MgYi9zdGFjay9oaWQvaGlkZF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTdkZTEuLjAwMDAwMDAKLS0tIGEvc3RhY2svaGlkL2hpZGRfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSElEIERldmljZSBBUEkgZW50cnkgcG9pbnRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImhpZGRfYXBpLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImhpZGRfaW50LmgiCi0jaW5jbHVkZSAiaGlkZGVmcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdEhJRF9ERVZfQ1RCIGhkX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldkluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemVzIGNvbnRyb2wgYmxvY2sKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBISURfRGV2SW5pdCh2b2lkKSB7Ci0gIHVpbnQ4X3QgbG9nX2xldmVsID0gaGRfY2IudHJhY2VfbGV2ZWw7Ci0KLSAgSElERF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIG1lbXNldCgmaGRfY2IsIDAsIHNpemVvZih0SElEX0RFVl9DVEIpKTsKLSAgaGRfY2IudHJhY2VfbGV2ZWwgPSBsb2dfbGV2ZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2U2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgSElEIERldi4gSWYgY2FsbGVkCi0qd2l0aAotICogICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDB4RkYsIGl0IHNpbXBseSByZWFkcyB0aGUgY3VycmVudCB0cmFjZSBsZXZlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBuZXcgKGN1cnJlbnQpIHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgSElEX0RldlNldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBoZF9jYi50cmFjZV9sZXZlbCA9IG5ld19sZXZlbDsKLQotICByZXR1cm4gKGhkX2NiLnRyYWNlX2xldmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZSZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXJzIEhJRCBkZXZpY2Ugd2l0aCBsb3dlciBsYXllcnMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9EZXZSZWdpc3Rlcih0SElEX0RFVl9IT1NUX0NBTExCQUNLKiBob3N0X2NiYWNrKSB7Ci0gIHRISURfU1RBVFVTIHN0OwotCi0gIEhJRERfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoaGRfY2IucmVnX2ZsYWcpIHJldHVybiBISURfRVJSX0FMUkVBRFlfUkVHSVNURVJFRDsKLQotICBpZiAoaG9zdF9jYmFjayA9PSBOVUxMKSByZXR1cm4gSElEX0VSUl9JTlZBTElEX1BBUkFNOwotCi0gIC8qIFJlZ2lzdGVyIHdpdGggTDJDQVAgKi8KLSAgc3QgPSBoaWRkX2Nvbm5fcmVnKCk7Ci0gIGlmIChzdCAhPSBISURfU1VDQ0VTUykgcmV0dXJuIHN0OwotCi0gIGhkX2NiLmNhbGxiYWNrID0gaG9zdF9jYmFjazsKLSAgaGRfY2IucmVnX2ZsYWcgPSBUUlVFOwotCi0gIGlmIChoZF9jYi5wZW5kaW5nX2RhdGEpIHsKLSAgICBvc2lfZnJlZShoZF9jYi5wZW5kaW5nX2RhdGEpOwotICAgIGhkX2NiLnBlbmRpbmdfZGF0YSA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZEZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZXJlZ2lzdGVycyBISUQgZGV2aWNlIHdpdGggbG93ZXIgbGF5ZXJzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBISURfRGV2RGVyZWdpc3Rlcih2b2lkKSB7Ci0gIEhJRERfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoIWhkX2NiLnJlZ19mbGFnKSByZXR1cm4gKEhJRF9FUlJfTk9UX1JFR0lTVEVSRUQpOwotCi0gIGhpZGRfY29ubl9kZXJlZygpOwotCi0gIGhkX2NiLnJlZ19mbGFnID0gRkFMU0U7Ci0KLSAgcmV0dXJuIChISURfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2QWRkUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGVzIFNEUCByZWNvcmQgZm9yIEhJRCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9EZXZBZGRSZWNvcmQodWludDMyX3QgaGFuZGxlLCBjaGFyKiBwX25hbWUsIGNoYXIqIHBfZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHBfcHJvdmlkZXIsIHVpbnQxNl90IHN1YmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkZXNjX2xlbiwgdWludDhfdCogcF9kZXNjX2RhdGEpIHsKLSAgYm9vbCByZXN1bHQgPSBUUlVFOwotCi0gIEhJRERfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICAvLyBTZXJ2aWNlIENsYXNzIElEIExpc3QKLSAgaWYgKHJlc3VsdCkgewotICAgIHVpbnQxNl90IHV1aWQgPSBVVUlEX1NFUlZDTEFTU19IVU1BTl9JTlRFUkZBQ0U7Ci0gICAgcmVzdWx0ICY9IFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QoaGFuZGxlLCAxLCAmdXVpZCk7Ci0gIH0KLQotICAvLyBQcm90b2NvbCBEZXNjcmlwdG9yIExpc3QKLSAgaWYgKHJlc3VsdCkgewotICAgIHRTRFBfUFJPVE9DT0xfRUxFTSBwcm90b19saXN0WzJdOwotCi0gICAgcHJvdG9fbGlzdFswXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9MMkNBUDsKLSAgICBwcm90b19saXN0WzBdLm51bV9wYXJhbXMgPSAxOwotICAgIHByb3RvX2xpc3RbMF0ucGFyYW1zWzBdID0gQlRfUFNNX0hJREM7Ci0KLSAgICBwcm90b19saXN0WzFdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0hJRFA7Ci0gICAgcHJvdG9fbGlzdFsxXS5udW1fcGFyYW1zID0gMDsKLQotICAgIHJlc3VsdCAmPSBTRFBfQWRkUHJvdG9jb2xMaXN0KGhhbmRsZSwgMiwgcHJvdG9fbGlzdCk7Ci0gIH0KLQotICAvLyBMYW5ndWFnZSBCYXNlIEF0dHJpYnV0ZSBJRCBMaXN0Ci0gIGlmIChyZXN1bHQpIHsKLSAgICByZXN1bHQgJj0gU0RQX0FkZExhbmd1YWdlQmFzZUF0dHJJRExpc3QoaGFuZGxlLCBMQU5HX0lEX0NPREVfRU5HTElTSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFOR19JRF9DSEFSX0VOQ09ERV9VVEY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQU5HVUFHRV9CQVNFX0lEKTsKLSAgfQotCi0gIC8vIEFkZGl0aW9uYWwgUHJvdG9jb2wgRGVzY3JpcHRvciBMaXN0Ci0gIGlmIChyZXN1bHQpIHsKLSAgICB0U0RQX1BST1RPX0xJU1RfRUxFTSBhZGRfcHJvdG9fbGlzdDsKLQotICAgIGFkZF9wcm90b19saXN0Lm51bV9lbGVtcyA9IDI7Ci0gICAgYWRkX3Byb3RvX2xpc3QubGlzdF9lbGVtWzBdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0wyQ0FQOwotICAgIGFkZF9wcm90b19saXN0Lmxpc3RfZWxlbVswXS5udW1fcGFyYW1zID0gMTsKLSAgICBhZGRfcHJvdG9fbGlzdC5saXN0X2VsZW1bMF0ucGFyYW1zWzBdID0gQlRfUFNNX0hJREk7Ci0gICAgYWRkX3Byb3RvX2xpc3QubGlzdF9lbGVtWzFdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0hJRFA7Ci0gICAgYWRkX3Byb3RvX2xpc3QubGlzdF9lbGVtWzFdLm51bV9wYXJhbXMgPSAwOwotCi0gICAgcmVzdWx0ICY9IFNEUF9BZGRBZGRpdGlvblByb3RvTGlzdHMoaGFuZGxlLCAxLCAmYWRkX3Byb3RvX2xpc3QpOwotICB9Ci0KLSAgLy8gU2VydmljZSBOYW1lIChPKQotICAvLyBTZXJ2aWNlIERlc2NyaXB0aW9uIChPKQotICAvLyBQcm92aWRlciBOYW1lIChPKQotICBpZiAocmVzdWx0KSB7Ci0gICAgY29uc3QgY2hhciogc3J2X25hbWUgPSBwX25hbWU7Ci0gICAgY29uc3QgY2hhciogc3J2X2Rlc2MgPSBwX2Rlc2NyaXB0aW9uOwotICAgIGNvbnN0IGNoYXIqIHByb3ZpZGVyX25hbWUgPSBwX3Byb3ZpZGVyOwotCi0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSwgVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihzcnZfbmFtZSkgKyAxLCAodWludDhfdCopc3J2X25hbWUpOwotCi0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1NFUlZJQ0VfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVF9TVFJfREVTQ19UWVBFLCBzdHJsZW4oc3J2X2Rlc2MpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopc3J2X2Rlc2MpOwotCi0gICAgcmVzdWx0ICY9Ci0gICAgICAgIFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1BST1ZJREVSX05BTUUsIFRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4ocHJvdmlkZXJfbmFtZSkgKyAxLCAodWludDhfdCopcHJvdmlkZXJfbmFtZSk7Ci0gIH0KLQotICAvLyBCbHVldG9vdGggUHJvZmlsZSBEZXNjcmlwdG9yIExpc3QKLSAgaWYgKHJlc3VsdCkgewotICAgIGNvbnN0IHVpbnQxNl90IHByb2ZpbGVfdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hVTUFOX0lOVEVSRkFDRTsKLSAgICBjb25zdCB1aW50MTZfdCB2ZXJzaW9uID0gMHgwMTAwOwotCi0gICAgcmVzdWx0ICY9IFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoaGFuZGxlLCBwcm9maWxlX3V1aWQsIHZlcnNpb24pOwotICB9Ci0KLSAgLy8gSElEIFBhcnNlciBWZXJzaW9uCi0gIGlmIChyZXN1bHQpIHsKLSAgICB1aW50OF90KiBwOwotICAgIGNvbnN0IHVpbnQxNl90IHJlbF9udW0gPSAweDAxMDA7Ci0gICAgY29uc3QgdWludDE2X3QgcGFyc2VyX3ZlcnNpb24gPSAweDAxMTE7Ci0gICAgY29uc3QgdWludDE2X3QgcHJvZl92ZXIgPSAweDAxMDA7Ci0gICAgY29uc3QgdWludDhfdCBkZXZfc3ViY2xhc3MgPSBzdWJjbGFzczsKLSAgICBjb25zdCB1aW50OF90IGNvdW50cnlfY29kZSA9IDB4MjE7Ci0gICAgY29uc3QgdWludDhfdCBib29sX2ZhbHNlID0gMHgwMDsKLSAgICBjb25zdCB1aW50OF90IGJvb2xfdHJ1ZSA9IDB4MDE7Ci0gICAgdWludDE2X3QgdGVtcDsKLQotICAgIHAgPSAodWludDhfdCopJnRlbXA7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCByZWxfbnVtKTsKLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfSElEX0RFVklDRV9SRUxOVU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsIDIsICh1aW50OF90KikmdGVtcCk7Ci0KLSAgICBwID0gKHVpbnQ4X3QqKSZ0ZW1wOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcGFyc2VyX3ZlcnNpb24pOwotICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9ISURfUEFSU0VSX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9ERVNDX1RZUEUsIDIsICh1aW50OF90KikmdGVtcCk7Ci0KLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfSElEX0RFVklDRV9TVUJDTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX0RFU0NfVFlQRSwgMSwgKHVpbnQ4X3QqKSZkZXZfc3ViY2xhc3MpOwotCi0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX0hJRF9DT1VOVFJZX0NPREUsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICh1aW50OF90KikmY291bnRyeV9jb2RlKTsKLQotICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9ISURfVklSVFVBTF9DQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MRUFOX0RFU0NfVFlQRSwgMSwgKHVpbnQ4X3QqKSZib29sX3RydWUpOwotCi0gICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX0hJRF9SRUNPTk5FQ1RfSU5JVElBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTl9ERVNDX1RZUEUsIDEsICh1aW50OF90KikmYm9vbF90cnVlKTsKLQotICAgIHsKLSAgICAgIHN0YXRpYyB1aW50OF90IGNkdCA9IDB4MjI7Ci0gICAgICB1aW50OF90KiBwX2J1ZjsKLSAgICAgIHVpbnQ4X3Qgc2VxX2xlbiA9IDQgKyBkZXNjX2xlbjsKLQotICAgICAgaWYgKGRlc2NfbGVuID4gSElERF9BUFBfREVTQ1JJUFRPUl9MRU4pIHsKLSAgICAgICAgSElERF9UUkFDRV9FUlJPUigiJXM6IGRlc2NyaXB0b3IgbGVuZ3RoID0gJWQsIGxhcmdlciB0aGFuIG1heCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2NfbGVuLCBISUREX0FQUF9ERVNDUklQVE9SX0xFTik7Ci0gICAgICAgIHJldHVybiBISURfRVJSX05PVF9SRUdJU1RFUkVEOwotICAgICAgfTsKLQotICAgICAgcF9idWYgPSAodWludDhfdCopb3NpX21hbGxvYyhISUREX0FQUF9ERVNDUklQVE9SX0xFTiArIDYpOwotCi0gICAgICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgICAgICBISUREX1RSQUNFX0VSUk9SKCIlczogQnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSA9IDIwNDggIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBISURfRVJSX05PVF9SRUdJU1RFUkVEOwotICAgICAgfQotCi0gICAgICBwID0gcF9idWY7Ci0KLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCAoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9CWVRFKTsKLQotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIHNlcV9sZW4pOwotCi0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9PTkVfQllURSk7Ci0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgY2R0KTsKLQotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChURVhUX1NUUl9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX0lOX05FWFRfQllURSk7Ci0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgZGVzY19sZW4pOwotICAgICAgQVJSQVlfVE9fQkVfU1RSRUFNKHAsIHBfZGVzY19kYXRhLCAoaW50KWRlc2NfbGVuKTsKLQotICAgICAgcmVzdWx0ICY9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX0hJRF9ERVNDUklQVE9SX0xJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX0VMRV9TRVFfREVTQ19UWVBFLCBwIC0gcF9idWYsIHBfYnVmKTsKLQotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgIH0KLQotICAgIHsKLSAgICAgIHVpbnQ4X3QgbGFuZ19idWZbOF07Ci0gICAgICBwID0gbGFuZ19idWY7Ci0gICAgICB1aW50OF90IHNlcV9sZW4gPSA2OwotICAgICAgdWludDE2X3QgbGFuZ19lbmdsaXNoID0gMHgwNDA5OwotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChEQVRBX0VMRV9TRVFfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9JTl9ORVhUX0JZVEUpOwotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIHNlcV9sZW4pOwotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChVSU5UX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfVFdPX0JZVEVTKTsKLSAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgbGFuZ19lbmdsaXNoKTsKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCAoVUlOVF9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX1RXT19CWVRFUyk7Ci0gICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIExBTkdVQUdFX0JBU0VfSUQpOwotICAgICAgcmVzdWx0ICY9Ci0gICAgICAgICAgU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfSElEX0xBTkdVQUdFX0lEX0JBU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX0VMRV9TRVFfREVTQ19UWVBFLCBwIC0gbGFuZ19idWYsIGxhbmdfYnVmKTsKLSAgICB9Ci0KLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfSElEX0JBVFRFUllfUE9XRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTl9ERVNDX1RZUEUsIDEsICh1aW50OF90KikmYm9vbF90cnVlKTsKLQotICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9ISURfUkVNT1RFX1dBS0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTl9ERVNDX1RZUEUsIDEsICh1aW50OF90KikmYm9vbF9mYWxzZSk7Ci0KLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfSElEX05PUk1BTExZX0NPTk5FQ1RBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU5fREVTQ19UWVBFLCAxLCAodWludDhfdCopJmJvb2xfdHJ1ZSk7Ci0KLSAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfSElEX0JPT1RfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU5fREVTQ19UWVBFLCAxLCAodWludDhfdCopJmJvb2xfdHJ1ZSk7Ci0KLSAgICBwID0gKHVpbnQ4X3QqKSZ0ZW1wOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcHJvZl92ZXIpOwotICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9ISURfUFJPRklMRV9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfREVTQ19UWVBFLCAyLCAodWludDhfdCopJnRlbXApOwotICB9Ci0KLSAgaWYgKHJlc3VsdCkgewotICAgIHVpbnQxNl90IGJyb3dzZV9ncm91cCA9IFVVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVA7Ci0gICAgcmVzdWx0ICY9IFNEUF9BZGRVdWlkU2VxdWVuY2UoaGFuZGxlLCBBVFRSX0lEX0JST1dTRV9HUk9VUF9MSVNULCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicm93c2VfZ3JvdXApOwotICB9Ci0KLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBISUREX1RSQUNFX0VSUk9SKCIlczogZmFpbGVkIHRvIGNvbXBsZXRlIFNEUCByZWNvcmQiLCBfX2Z1bmNfXyk7Ci0KLSAgICByZXR1cm4gSElEX0VSUl9OT1RfUkVHSVNURVJFRDsKLSAgfQotCi0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZTZW5kUmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyByZXBvcnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9EZXZTZW5kUmVwb3J0KHVpbnQ4X3QgY2hhbm5lbCwgdWludDhfdCB0eXBlLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgSElERF9UUkFDRV9WRVJCT1NFKCIlczogY2hhbm5lbD0lZCB0eXBlPSVkIGlkPSVkIGxlbj0lZCIsIF9fZnVuY19fLCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgdHlwZSwgaWQsIGxlbik7Ci0KLSAgaWYgKGNoYW5uZWwgPT0gSElEX0NIQU5ORUxfQ1RSTCkgewotICAgIHJldHVybiBoaWRkX2Nvbm5fc2VuZF9kYXRhKEhJRF9DSEFOTkVMX0NUUkwsIEhJRF9UUkFOU19EQVRBLCB0eXBlLCBpZCwgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSk7Ci0gIH0KLQotICBpZiAoY2hhbm5lbCA9PSBISURfQ0hBTk5FTF9JTlRSICYmIHR5cGUgPT0gSElEX1BBUl9SRVBfVFlQRV9JTlBVVCkgewotICAgIC8vIG9uIElOVFIgd2UgY2FuIG9ubHkgc2VuZCBJTlBVVAotICAgIHJldHVybiBoaWRkX2Nvbm5fc2VuZF9kYXRhKEhJRF9DSEFOTkVMX0lOVFIsIEhJRF9UUkFOU19EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9QQVJfUkVQX1RZUEVfSU5QVVQsIGlkLCBsZW4sIHBfZGF0YSk7Ci0gIH0KLQotICByZXR1cm4gSElEX0VSUl9JTlZBTElEX1BBUkFNOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldlZpcnR1YWxDYWJsZVVucGx1ZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZHMgVmlydHVhbCBDYWJsZSBVbnBsdWcKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9EZXZWaXJ0dWFsQ2FibGVVbnBsdWcodm9pZCkgewotICBISUREX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcmV0dXJuIGhpZGRfY29ubl9zZW5kX2RhdGEoSElEX0NIQU5ORUxfQ1RSTCwgSElEX1RSQU5TX0NPTlRST0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9QQVJfQ09OVFJPTF9WSVJUVUFMX0NBQkxFX1VOUExVRywgMCwgMCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2UGx1Z0RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXN0YWJsaXNoZXMgdmlydHVhbCBjYWJsZSB0byBnaXZlbiBob3N0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBISURfRGV2UGx1Z0RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIGhkX2NiLmRldmljZS5pbl91c2UgPSBUUlVFOwotICBoZF9jYi5kZXZpY2UuYWRkciA9IGFkZHI7Ci0KLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldlVucGx1Z0RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVW5wbHVncyB2aXJ0dWFsIGNhYmxlIGZyb20gZ2l2ZW4gaG9zdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0RldlVucGx1Z0RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIGlmIChoZF9jYi5kZXZpY2UuYWRkciA9PSBhZGRyKSB7Ci0gICAgaGRfY2IuZGV2aWNlLmluX3VzZSA9IEZBTFNFOwotICAgIGhkX2NiLmRldmljZS5jb25uLmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9VTlVTRUQ7Ci0gICAgaGRfY2IuZGV2aWNlLmNvbm4uY3RybF9jaWQgPSAwOwotICAgIGhkX2NiLmRldmljZS5jb25uLmludHJfY2lkID0gMDsKLSAgfQotCi0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZDb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDb25uZWN0cyB0byBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9EZXZDb25uZWN0KHZvaWQpIHsKLSAgaWYgKCFoZF9jYi5yZWdfZmxhZykgewotICAgIHJldHVybiBISURfRVJSX05PVF9SRUdJU1RFUkVEOwotICB9Ci0KLSAgaWYgKCFoZF9jYi5kZXZpY2UuaW5fdXNlKSB7Ci0gICAgcmV0dXJuIEhJRF9FUlJfSU5WQUxJRF9QQVJBTTsKLSAgfQotCi0gIGlmIChoZF9jYi5kZXZpY2Uuc3RhdGUgIT0gSElERF9ERVZfTk9fQ09OTikgewotICAgIHJldHVybiBISURfRVJSX0FMUkVBRFlfQ09OTjsKLSAgfQotCi0gIHJldHVybiBoaWRkX2Nvbm5faW5pdGlhdGUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZEaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjb25uZWN0cyBmcm9tIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0RldkRpc2Nvbm5lY3Qodm9pZCkgewotICBpZiAoIWhkX2NiLnJlZ19mbGFnKSB7Ci0gICAgcmV0dXJuIEhJRF9FUlJfTk9UX1JFR0lTVEVSRUQ7Ci0gIH0KLQotICBpZiAoIWhkX2NiLmRldmljZS5pbl91c2UpIHsKLSAgICByZXR1cm4gSElEX0VSUl9JTlZBTElEX1BBUkFNOwotICB9Ci0KLSAgaWYgKGhkX2NiLmRldmljZS5zdGF0ZSA9PSBISUREX0RFVl9OT19DT05OKSB7Ci0gICAgLyogSWYgd2UgYXJlIHN0aWxsIHRyeWluZyB0byBjb25uZWN0LCBqdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uLiAqLwotICAgIGlmIChoZF9jYi5kZXZpY2UuY29ubi5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX1VOVVNFRCkgewotICAgICAgdEhJRF9TVEFUVVMgcmV0ID0gaGlkZF9jb25uX2Rpc2Nvbm5lY3QoKTsKLSAgICAgIGhkX2NiLmRldmljZS5jb25uLmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9VTlVTRUQ7Ci0gICAgICBoZF9jYi5jYWxsYmFjayhoZF9jYi5kZXZpY2UuYWRkciwgSElEX0RIT1NUX0VWVF9DTE9TRSwKLSAgICAgICAgICAgICAgICAgICAgIEhJRF9FUlJfRElTQ09OTkVDVElORywgTlVMTCk7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gSElEX0VSUl9OT19DT05ORUNUSU9OOwotICB9Ci0KLSAgcmV0dXJuIGhpZGRfY29ubl9kaXNjb25uZWN0KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2U2V0SW5jb21pbmdQb2xpY3kKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgcG9saWN5IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyAoYWxsb3dlZC9kaXNhbGxvd2VkKQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0RldlNldEluY29taW5nUG9saWN5KGJvb2wgYWxsb3cpIHsKLSAgaGRfY2IuYWxsb3dfaW5jb21pbmcgPSBhbGxvdzsKLQotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2UmVwb3J0RXJyb3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlcG9ydHMgZXJyb3IgZm9yIFNldCBSZXBvcnQgdmlhIEhBTkRTSEFLRQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0RldlJlcG9ydEVycm9yKHVpbnQ4X3QgZXJyb3IpIHsKLSAgdWludDhfdCBoYW5kc2hha2VfcGFyYW07Ci0KLSAgSElERF9UUkFDRV9BUEkoIiVzOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycm9yKTsKLQotICBzd2l0Y2ggKGVycm9yKSB7Ci0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfU1VDQ0VTUzoKLSAgICBjYXNlIEhJRF9QQVJfSEFORFNIQUtFX1JTUF9OT1RfUkVBRFk6Ci0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX0lOVkFMSURfUkVQX0lEOgotICAgIGNhc2UgSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9VTlNVUFBPUlRFRF9SRVE6Ci0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX0lOVkFMSURfUEFSQU06Ci0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX1VOS05PV046Ci0gICAgY2FzZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX0ZBVEFMOgotICAgICAgaGFuZHNoYWtlX3BhcmFtID0gZXJyb3I7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaGFuZHNoYWtlX3BhcmFtID0gSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9VTktOT1dOOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gaGlkZF9jb25uX3NlbmRfZGF0YSgwLCBISURfVFJBTlNfSEFORFNIQUtFLCBoYW5kc2hha2VfcGFyYW0sIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldkdldERldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyB0aGUgQkQgQWRkcmVzcyBvZiB2aXJ0dWFsbHkgY2FibGVkIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0RldkdldERldmljZShSYXdBZGRyZXNzKiBhZGRyKSB7Ci0gIEhJRERfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoaGRfY2IuZGV2aWNlLmluX3VzZSkgewotICAgICphZGRyID0gaGRfY2IuZGV2aWNlLmFkZHI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEhJRF9FUlJfTk9UX1JFR0lTVEVSRUQ7Ci0gIH0KLQotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2U2V0SW5jb21pbmdRb3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgSW5jb21pbmcgUW9TIHZhbHVlcyBmb3IgSW50ZXJydXB0IEwyQ0FQIENoYW5uZWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9EZXZTZXRJbmNvbWluZ1Fvcyh1aW50OF90IHNlcnZpY2VfdHlwZSwgdWludDMyX3QgdG9rZW5fcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheV92YXJpYXRpb24pIHsKLSAgSElERF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIGhkX2NiLnVzZV9pbl9xb3MgPSBUUlVFOwotCi0gIGhkX2NiLmluX3Fvcy5zZXJ2aWNlX3R5cGUgPSBzZXJ2aWNlX3R5cGU7Ci0gIGhkX2NiLmluX3Fvcy50b2tlbl9yYXRlID0gdG9rZW5fcmF0ZTsKLSAgaGRfY2IuaW5fcW9zLnRva2VuX2J1Y2tldF9zaXplID0gdG9rZW5fYnVja2V0X3NpemU7Ci0gIGhkX2NiLmluX3Fvcy5wZWFrX2JhbmR3aWR0aCA9IHBlYWtfYmFuZHdpZHRoOwotICBoZF9jYi5pbl9xb3MubGF0ZW5jeSA9IGxhdGVuY3k7Ci0gIGhkX2NiLmluX3Fvcy5kZWxheV92YXJpYXRpb24gPSBkZWxheV92YXJpYXRpb247Ci0KLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldlNldE91dGdvaW5nUW9zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIE91dGdvaW5nIFFvUyB2YWx1ZXMgZm9yIEludGVycnVwdCBMMkNBUCBDaGFubmVsCi0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBISURfRGV2U2V0T3V0Z29pbmdRb3ModWludDhfdCBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKSB7Ci0gIEhJRERfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBoZF9jYi5sMmNhcF9pbnRyX2NmZy5xb3NfcHJlc2VudCA9IFRSVUU7Ci0KLSAgaGRfY2IubDJjYXBfaW50cl9jZmcucW9zLnNlcnZpY2VfdHlwZSA9IHNlcnZpY2VfdHlwZTsKLSAgaGRfY2IubDJjYXBfaW50cl9jZmcucW9zLnRva2VuX3JhdGUgPSB0b2tlbl9yYXRlOwotICBoZF9jYi5sMmNhcF9pbnRyX2NmZy5xb3MudG9rZW5fYnVja2V0X3NpemUgPSB0b2tlbl9idWNrZXRfc2l6ZTsKLSAgaGRfY2IubDJjYXBfaW50cl9jZmcucW9zLnBlYWtfYmFuZHdpZHRoID0gcGVha19iYW5kd2lkdGg7Ci0gIGhkX2NiLmwyY2FwX2ludHJfY2ZnLnFvcy5sYXRlbmN5ID0gbGF0ZW5jeTsKLSAgaGRfY2IubDJjYXBfaW50cl9jZmcucW9zLmRlbGF5X3ZhcmlhdGlvbiA9IGRlbGF5X3ZhcmlhdGlvbjsKLQotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9oaWQvaGlkZF9jb25uLmNjIGIvc3RhY2svaGlkL2hpZGRfY29ubi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxYzk5My4uMDAwMDAwMAotLS0gYS9zdGFjay9oaWQvaGlkZF9jb25uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgY29ubmVjdGlvbiBpbnRlcmZhY2UgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfaGQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9oaWQvaGlkZF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLXN0YXRpYyB2b2lkIGhpZGRfbDJjaWZfY29ubmVjdF9pbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQ4X3QgaWQpOwotc3RhdGljIHZvaWQgaGlkZF9sMmNpZl9jb25uZWN0X2NmbSh1aW50MTZfdCBjaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2NvbmZpZ19pbmQodWludDE2X3QgY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXN0YXRpYyB2b2lkIGhpZGRfbDJjaWZfY29uZmlnX2NmbSh1aW50MTZfdCBjaWQsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXN0YXRpYyB2b2lkIGhpZGRfbDJjaWZfZGlzY29ubmVjdF9pbmQodWludDE2X3QgY2lkLCBib29sIGFja19uZWVkZWQpOwotc3RhdGljIHZvaWQgaGlkZF9sMmNpZl9kaXNjb25uZWN0KHVpbnQxNl90IGNpZCk7Ci1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2RhdGFfaW5kKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2NvbmdfaW5kKHVpbnQxNl90IGNpZCwgYm9vbCBjb25nZXN0ZWQpOwotc3RhdGljIHZvaWQgaGlkZF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQpOwotc3RhdGljIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8gZGV2X3JlZ19pbmZvID0ge2hpZGRfbDJjaWZfY29ubmVjdF9pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZF9sMmNpZl9jb25uZWN0X2NmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkX2wyY2lmX2NvbmZpZ19pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZF9sMmNpZl9jb25maWdfY2ZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRfbDJjaWZfZGlzY29ubmVjdF9pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkX2wyY2lmX2RhdGFfaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRfbDJjaWZfY29uZ19pbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkX29uX2wyY2FwX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGRfY2hlY2tfY29uZmlnX2RvbmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrcyBpZiBjb25uZWN0aW9uIGlzIGNvbmZpZ3VyZWQgYW5kIGNhbGxiYWNrIGNhbiBiZSBmaXJlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRkX2NoZWNrX2NvbmZpZ19kb25lKCkgewotICB0SElEX0NPTk4qIHBfaGNvbiA9ICZoZF9jYi5kZXZpY2UuY29ubjsKLQotICBpZiAocF9oY29uLT5jb25uX3N0YXRlID09IEhJRF9DT05OX1NUQVRFX0NPTkZJRykgewotICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RFRDsKLQotICAgIGhkX2NiLmRldmljZS5zdGF0ZSA9IEhJRERfREVWX0NPTk5FQ1RFRDsKLQotICAgIGhkX2NiLmNhbGxiYWNrKGhkX2NiLmRldmljZS5hZGRyLCBISURfREhPU1RfRVZUX09QRU4sIDAsIE5VTEwpOwotCi0gICAgLy8gc2VuZCBvdXRzdGFuZGluZyBkYXRhIG9uIGludHIKLSAgICBpZiAoaGRfY2IucGVuZGluZ19kYXRhKSB7Ci0gICAgICBMMkNBX0RhdGFXcml0ZShwX2hjb24tPmludHJfY2lkLCBoZF9jYi5wZW5kaW5nX2RhdGEpOwotICAgICAgaGRfY2IucGVuZGluZ19kYXRhID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGRfbDJjaWZfY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZXMgaW5jb21pbmcgTDJDQVAgY29ubmVjdGlvbiAod2UgYWN0IGFzIHNlcnZlcikKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGlkZF9sMmNpZl9jb25uZWN0X2luZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBzbSwgdWludDhfdCBpZCkgewotICB0SElEX0RFVl9ERVZfQ1RCKiBwX2RldjsKLSAgYm9vbCBhY2NlcHQgPSBUUlVFOyAgLy8gYWNjZXB0IGJ5IGRlZmF1bHQKLQotICBISUREX1RSQUNFX0VWRU5UKCIlczogcHNtPSUwNHggY2lkPSUwNHgiLCBfX2Z1bmNfXywgcHNtLCBjaWQpOwotCi0gIHBfZGV2ID0gJmhkX2NiLmRldmljZTsKLQotICBpZiAoIWhkX2NiLmFsbG93X2luY29taW5nKSB7Ci0gICAgSElERF9UUkFDRV9XQVJOSU5HKCIlczogaW5jb21pbmcgY29ubmVjdGlvbnMgbm90IGFsbG93ZWQsIHJlamVjdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEoY2lkKTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIHRISURfQ09OTiogcF9oY29uID0gJmhkX2NiLmRldmljZS5jb25uOwotCi0gIHN3aXRjaCAocHNtKSB7Ci0gICAgY2FzZSBISURfUFNNX0lOVEVSUlVQVDoKLSAgICAgIGlmIChwX2hjb24tPmN0cmxfY2lkID09IDApIHsKLSAgICAgICAgYWNjZXB0ID0gRkFMU0U7Ci0gICAgICAgIEhJRERfVFJBQ0VfV0FSTklORygiJXM6IGluY29taW5nIElOVFIgd2l0aG91dCBDVFJMLCByZWplY3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotICAgICAgfQotCi0gICAgICBpZiAocF9oY29uLT5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfSU5UUikgewotICAgICAgICBhY2NlcHQgPSBGQUxTRTsKLSAgICAgICAgSElERF9UUkFDRV9XQVJOSU5HKCIlczogaW5jb21pbmcgSU5UUiBpbiBpbnZhbGlkIHN0YXRlICglZCksIHJlamVjdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9oY29uLT5jb25uX3N0YXRlKTsKLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9QU01fQ09OVFJPTDoKLSAgICAgIGlmIChwX2hjb24tPmNvbm5fc3RhdGUgIT0gSElEX0NPTk5fU1RBVEVfVU5VU0VEKSB7Ci0gICAgICAgIGFjY2VwdCA9IEZBTFNFOwotICAgICAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiBpbmNvbWluZyBDVFJMIGluIGludmFsaWQgc3RhdGUgKCVkKSwgcmVqZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2hjb24tPmNvbm5fc3RhdGUpOwotICAgICAgfQotCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhY2NlcHQgPSBGQUxTRTsKLSAgICAgIEhJRERfVFJBQ0VfRVJST1IoIiVzOiByZWNlaXZlZCBpbnZhbGlkIFBTTSwgcmVqZWN0aW5nIiwgX19mdW5jX18pOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoIWFjY2VwdCkgewotICAgIEwyQ0FfRGlzY29ubmVjdFJlcShjaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGZvciBDVFJMIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCBzZWN1cml0eSBhbmQgd2UgcmVwbHkgaW4gY2FsbGJhY2sgZnJvbSB0aGVyZQotICBpZiAocHNtID09IEhJRF9QU01fQ09OVFJPTCkgewotICAgIC8vIFdlIGFyZSByZWFkeSB0byBhY2NlcHQgY29ubmVjdGlvbiBmcm9tIHRoaXMgZGV2aWNlLCBzaW5jZSB3ZSBhcmVuJ3QKLSAgICAvLyBjb25uZWN0ZWQgdG8gYW55dGhpbmcgYW5kIGFyZSBpbiB0aGUgY29ycmVjdCBzdGF0ZS4KLSAgICBwX2Rldi0+aW5fdXNlID0gVFJVRTsKLSAgICBwX2Rldi0+YWRkciA9IGJkX2FkZHI7Ci0gICAgcF9kZXYtPnN0YXRlID0gSElERF9ERVZfTk9fQ09OTjsKLQotICAgIHBfaGNvbi0+Y29ubl9mbGFncyA9IDA7Ci0gICAgcF9oY29uLT5jdHJsX2NpZCA9IGNpZDsKLSAgICBwX2hjb24tPmRpc2NfcmVhc29uID0gSElEX1NVQ0NFU1M7Ci0gICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19JTlRSOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGZvciBJTlRSIHdlIGdvIGRpcmVjdGx5IHRvIGNvbmZpZyBzdGF0ZQotICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9DT05GSUc7Ci0gIHBfaGNvbi0+aW50cl9jaWQgPSBjaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZGRfb25fbDJjYXBfZXJyb3IodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0KSB7Ci0gIEhJRERfVFJBQ0VfV0FSTklORygiJXM6IGNvbm5lY3Rpb24gb2YgY29uZmlnIGZhaWxlZCwgbm93IGRpc2Nvbm5lY3QiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwotCi0gIGhpZGRfY29ubl9kaXNjb25uZWN0KCk7Ci0KLSAgLy8gTk9URSB0aGF0IHRoZSBjbGllbnQgZG9lc24ndCBjYXJlIGFib3V0IGVycm9yIGNvZGUKLSAgaGRfY2IuY2FsbGJhY2soaGRfY2IuZGV2aWNlLmFkZHIsIEhJRF9ESE9TVF9FVlRfQ0xPU0UsCi0gICAgICAgICAgICAgICAgIEhJRF9MMkNBUF9DT05OX0ZBSUwgfCAodWludDMyX3QpcmVzdWx0LCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGRfbDJjaWZfY29ubmVjdF9jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZXMgTDJDQVAgY29ubmVjdGlvbiByZXNwb25zZSAod2UgYWN0IGFzIGNsaWVudCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGlkZF9sMmNpZl9jb25uZWN0X2NmbSh1aW50MTZfdCBjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0SElEX0NPTk4qIHBfaGNvbiA9ICZoZF9jYi5kZXZpY2UuY29ubjsKLQotICBISUREX1RSQUNFX0VWRU5UKCIlczogY2lkPSUwNHggcmVzdWx0PSVkIiwgX19mdW5jX18sIGNpZCwgcmVzdWx0KTsKLQotICBpZiAocF9oY29uLT5jdHJsX2NpZCAhPSBjaWQgJiYgcF9oY29uLT5pbnRyX2NpZCAhPSBjaWQpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmtub3duIGNpZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIShwX2hjb24tPmNvbm5fZmxhZ3MgJiBISURfQ09OTl9GTEFHU19JU19PUklHKSB8fAotICAgICAgKChjaWQgPT0gcF9oY29uLT5jdHJsX2NpZCkgJiYKLSAgICAgICAocF9oY29uLT5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfQ1RSTCkpIHx8Ci0gICAgICAoKGNpZCA9PSBwX2hjb24tPmludHJfY2lkKSAmJgotICAgICAgIChwX2hjb24tPmNvbm5fc3RhdGUgIT0gSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19JTlRSKSkpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmV4cGVjdGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gTDJDQVBfQ09OTl9PSykgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogaW52b2tlZCB3aXRoIG5vbiBPSyBzdGF0dXMiOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIENUUkwgY29ubmVjdCBjb25mICovCi0gIGlmIChjaWQgPT0gcF9oY29uLT5jdHJsX2NpZCkgewotICAgIHBfaGNvbi0+ZGlzY19yZWFzb24gPSBISURfU1VDQ0VTUzsKLSAgICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9DT05GSUc7Ci0gIH0gZWxzZSB7Ci0gICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfQ09ORklHOwotICB9Ci0KLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGlkZF9sMmNpZl9jb25maWdfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGVzIGluY29taW5nIEwyQ0FQIGNvbmZpZ3VyYXRpb24gcmVxdWVzdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2NvbmZpZ19pbmQodWludDE2X3QgY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIEhJRERfVFJBQ0VfRVZFTlQoIiVzOiBjaWQ9JTA0eCIsIF9fZnVuY19fLCBjaWQpOwotCi0gIHRISURfQ09OTiogcF9oY29uID0gJmhkX2NiLmRldmljZS5jb25uOwotCi0gIGlmIChwX2hjb24tPmN0cmxfY2lkICE9IGNpZCAmJiBwX2hjb24tPmludHJfY2lkICE9IGNpZCkgewotICAgIEhJRERfVFJBQ0VfV0FSTklORygiJXM6IHVua25vd24gY2lkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICgoIXBfY2ZnLT5tdHVfcHJlc2VudCkgfHwgKHBfY2ZnLT5tdHUgPiBISURfREVWX01UVV9TSVpFKSkKLSAgICBwX2hjb24tPnJlbV9tdHVfc2l6ZSA9IEhJRF9ERVZfTVRVX1NJWkU7Ci0gIGVsc2UKLSAgICBwX2hjb24tPnJlbV9tdHVfc2l6ZSA9IHBfY2ZnLT5tdHU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRkX2wyY2lmX2NvbmZpZ19jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZXMgaW5jb21pbmcgTDJDQVAgY29uZmlndXJhdGlvbiByZXNwb25zZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2NvbmZpZ19jZm0odWludDE2X3QgY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBoaWRkX2wyY2lmX2NvbmZpZ19pbmQoY2lkLCBwX2NmZyk7Ci0KLQotICBISUREX1RSQUNFX0VWRU5UKCIlczogY2lkPSUwNHgiLCBfX2Z1bmNfXywgY2lkKTsKLQotICB0SElEX0NPTk4qIHBfaGNvbiA9ICZoZF9jYi5kZXZpY2UuY29ubjsKLQotICBpZiAocF9oY29uLT5jdHJsX2NpZCAhPSBjaWQgJiYgcF9oY29uLT5pbnRyX2NpZCAhPSBjaWQpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmtub3duIGNpZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyB1cGRhdGUgZmxhZ3MKLSAgaWYgKGNpZCA9PSBwX2hjb24tPmN0cmxfY2lkKSB7Ci0gICAgaWYgKHBfaGNvbi0+Y29ubl9mbGFncyAmIEhJRF9DT05OX0ZMQUdTX0lTX09SSUcpIHsKLSAgICAgIHBfaGNvbi0+ZGlzY19yZWFzb24gPSBISURfTDJDQVBfQ09OTl9GQUlMOwotICAgICAgaWYgKChwX2hjb24tPmludHJfY2lkID0KLSAgICAgICAgICAgICAgIEwyQ0FfQ29ubmVjdFJlcTIoSElEX1BTTV9JTlRFUlJVUFQsIGhkX2NiLmRldmljZS5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCkpID09IDApIHsKLSAgICAgICAgaGlkZF9jb25uX2Rpc2Nvbm5lY3QoKTsKLSAgICAgICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfVU5VU0VEOwotCi0gICAgICAgIEhJRERfVFJBQ0VfV0FSTklORygiJXM6IGNvdWxkIG5vdCBzdGFydCBMMkNBUCBjb25uZWN0aW9uIGZvciBJTlRSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgaGRfY2IuY2FsbGJhY2soaGRfY2IuZGV2aWNlLmFkZHIsIEhJRF9ESE9TVF9FVlRfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgIEhJRF9FUlJfTDJDQVBfRkFJTEVELCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19JTlRSOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGhpZGRfY2hlY2tfY29uZmlnX2RvbmUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGRfbDJjaWZfZGlzY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZXIgaW5jb21pbmcgTDJDQVAgZGlzY29ubmVjdGlvbiByZXF1ZXN0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhpZGRfbDJjaWZfZGlzY29ubmVjdF9pbmQodWludDE2X3QgY2lkLCBib29sIGFja19uZWVkZWQpIHsKLQotICBISUREX1RSQUNFX0VWRU5UKCIlczogY2lkPSUwNHggYWNrX25lZWRlZD0lZCIsIF9fZnVuY19fLCBjaWQsIGFja19uZWVkZWQpOwotCi0gIHRISURfQ09OTiogcF9oY29uID0gJmhkX2NiLmRldmljZS5jb25uOwotCi0gIGlmIChwX2hjb24tPmNvbm5fc3RhdGUgPT0gSElEX0NPTk5fU1RBVEVfVU5VU0VEIHx8Ci0gICAgICAocF9oY29uLT5jdHJsX2NpZCAhPSBjaWQgJiYgcF9oY29uLT5pbnRyX2NpZCAhPSBjaWQpKSB7Ci0gICAgSElERF9UUkFDRV9XQVJOSU5HKCIlczogdW5rbm93biBjaWQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfRElTQ09OTkVDVElORzsKLQotICBpZiAoY2lkID09IHBfaGNvbi0+Y3RybF9jaWQpCi0gICAgcF9oY29uLT5jdHJsX2NpZCA9IDA7Ci0gIGVsc2UKLSAgICBwX2hjb24tPmludHJfY2lkID0gMDsKLQotICBpZiAoKHBfaGNvbi0+Y3RybF9jaWQgPT0gMCkgJiYgKHBfaGNvbi0+aW50cl9jaWQgPT0gMCkpIHsKLSAgICBISUREX1RSQUNFX0VWRU5UKCIlczogSU5UUiBhbmQgQ1RSTCBkaXNjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7Ci0KLSAgICAvLyBjbGVhbiBhbnkgb3V0c3RhbmRpbmcgZGF0YSBvbiBpbnRyCi0gICAgaWYgKGhkX2NiLnBlbmRpbmdfZGF0YSkgewotICAgICAgb3NpX2ZyZWUoaGRfY2IucGVuZGluZ19kYXRhKTsKLSAgICAgIGhkX2NiLnBlbmRpbmdfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaGRfY2IuZGV2aWNlLnN0YXRlID0gSElERF9ERVZfTk9fQ09OTjsKLSAgICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9VTlVTRUQ7Ci0KLSAgICBoZF9jYi5jYWxsYmFjayhoZF9jYi5kZXZpY2UuYWRkciwgSElEX0RIT1NUX0VWVF9DTE9TRSwgcF9oY29uLT5kaXNjX3JlYXNvbiwKLSAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2Rpc2Nvbm5lY3QodWludDE2X3QgY2lkKSB7Ci0gIEwyQ0FfRGlzY29ubmVjdFJlcShjaWQpOwotCi0KLSAgSElERF9UUkFDRV9FVkVOVCgiJXM6IGNpZD0lMDR4IiwgX19mdW5jX18sIGNpZCk7Ci0KLSAgdEhJRF9DT05OKiBwX2hjb24gPSAmaGRfY2IuZGV2aWNlLmNvbm47Ci0KLSAgaWYgKHBfaGNvbi0+Y29ubl9zdGF0ZSA9PSBISURfQ09OTl9TVEFURV9VTlVTRUQgfHwKLSAgICAgIChwX2hjb24tPmN0cmxfY2lkICE9IGNpZCAmJiBwX2hjb24tPmludHJfY2lkICE9IGNpZCkpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmtub3duIGNpZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoY2lkID09IHBfaGNvbi0+Y3RybF9jaWQpIHsKLSAgICBwX2hjb24tPmN0cmxfY2lkID0gMDsKLSAgfSBlbHNlIHsKLSAgICBwX2hjb24tPmludHJfY2lkID0gMDsKLQotICAgIC8vIG5vdyBkaXNjb25uZWN0IENUUkwKLSAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEocF9oY29uLT5jdHJsX2NpZCk7Ci0gIH0KLQotICBpZiAoKHBfaGNvbi0+Y3RybF9jaWQgPT0gMCkgJiYgKHBfaGNvbi0+aW50cl9jaWQgPT0gMCkpIHsKLSAgICBISUREX1RSQUNFX0VWRU5UKCIlczogSU5UUiBhbmQgQ1RSTCBkaXNjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7Ci0KLSAgICBoZF9jYi5kZXZpY2Uuc3RhdGUgPSBISUREX0RFVl9OT19DT05OOwotICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX1VOVVNFRDsKLQotICAgIGlmIChoZF9jYi5wZW5kaW5nX3ZjX3VucGx1ZykgewotICAgICAgaGRfY2IuY2FsbGJhY2soaGRfY2IuZGV2aWNlLmFkZHIsIEhJRF9ESE9TVF9FVlRfVkNfVU5QTFVHLAotICAgICAgICAgICAgICAgICAgICAgcF9oY29uLT5kaXNjX3JlYXNvbiwgTlVMTCk7Ci0gICAgICBoZF9jYi5wZW5kaW5nX3ZjX3VucGx1ZyA9IEZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICBoZF9jYi5jYWxsYmFjayhoZF9jYi5kZXZpY2UuYWRkciwgSElEX0RIT1NUX0VWVF9DTE9TRSwKLSAgICAgICAgICAgICAgICAgICAgIHBfaGNvbi0+ZGlzY19yZWFzb24sIE5VTEwpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGlkZF9sMmNpZl9jb25nX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlcyBMMkNBUCBjb25nZXN0aW9uIHN0YXR1cyBldmVudAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2NvbmdfaW5kKHVpbnQxNl90IGNpZCwgYm9vbCBjb25nZXN0ZWQpIHsKLQotICBISUREX1RSQUNFX0VWRU5UKCIlczogY2lkPSUwNHggY29uZ2VzdGVkPSVkIiwgX19mdW5jX18sIGNpZCwgY29uZ2VzdGVkKTsKLQotICB0SElEX0NPTk4qIHBfaGNvbiA9ICZoZF9jYi5kZXZpY2UuY29ubjsKLQotICBpZiAocF9oY29uLT5jb25uX3N0YXRlID09IEhJRF9DT05OX1NUQVRFX1VOVVNFRCB8fAotICAgICAgKHBfaGNvbi0+Y3RybF9jaWQgIT0gY2lkICYmIHBfaGNvbi0+aW50cl9jaWQgIT0gY2lkKSkgewotICAgIEhJRERfVFJBQ0VfV0FSTklORygiJXM6IHVua25vd24gY2lkIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjb25nZXN0ZWQpIHsKLSAgICBwX2hjb24tPmNvbm5fZmxhZ3MgfD0gSElEX0NPTk5fRkxBR1NfQ09OR0VTVEVEOwotICB9IGVsc2UgewotICAgIHBfaGNvbi0+Y29ubl9mbGFncyAmPSB+SElEX0NPTk5fRkxBR1NfQ09OR0VTVEVEOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRkX2wyY2lmX2RhdGFfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGVyIGluY29taW5nIGRhdGEgb24gTDJDQVAgY2hhbm5lbAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRkX2wyY2lmX2RhdGFfaW5kKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX21zZykgewotICB1aW50OF90KiBwX2RhdGEgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBwX21zZy0+b2Zmc2V0OwotICB1aW50OF90IG1zZ190eXBlLCBwYXJhbTsKLSAgYm9vbCBlcnIgPSBGQUxTRTsKLQotICBISUREX1RSQUNFX0VWRU5UKCIlczogY2lkPSUwNHgiLCBfX2Z1bmNfXywgY2lkKTsKLQotICBpZiAocF9tc2ctPmxlbiA8IDEpIHsKLSAgICBISUREX1RSQUNFX0VSUk9SKCJJbnZhbGlkIGRhdGEgbGVuZ3RoLCBpZ25vcmUiKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEhJRF9DT05OKiBwX2hjb24gPSAmaGRfY2IuZGV2aWNlLmNvbm47Ci0KLSAgaWYgKHBfaGNvbi0+Y29ubl9zdGF0ZSA9PSBISURfQ09OTl9TVEFURV9VTlVTRUQgfHwKLSAgICAgIChwX2hjb24tPmN0cmxfY2lkICE9IGNpZCAmJiBwX2hjb24tPmludHJfY2lkICE9IGNpZCkpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiB1bmtub3duIGNpZCIsIF9fZnVuY19fKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbXNnX3R5cGUgPSBISURfR0VUX1RSQU5TX0ZST01fSERSKCpwX2RhdGEpOwotICBwYXJhbSA9IEhJRF9HRVRfUEFSQU1fRlJPTV9IRFIoKnBfZGF0YSk7Ci0KLSAgaWYgKG1zZ190eXBlID09IEhJRF9UUkFOU19EQVRBICYmIGNpZCA9PSBwX2hjb24tPmludHJfY2lkKSB7Ci0gICAgLy8gc2tpcCBISUQgaGVhZGVyCi0gICAgcF9tc2ctPm9mZnNldCsrOwotICAgIHBfbXNnLT5sZW4tLTsKLQotICAgIGhkX2NiLmNhbGxiYWNrKGhkX2NiLmRldmljZS5hZGRyLCBISURfREhPU1RfRVZUX0lOVFJfREFUQSwgMCwgcF9tc2cpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAobXNnX3R5cGUpIHsKLSAgICBjYXNlIEhJRF9UUkFOU19HRVRfUkVQT1JUOgotICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBkb24ndCBrbm93IGlmIFJlcG9ydCBJZCBzaGFsbCBiZSBpbmNsdWRlZCBpbiByZXF1ZXN0Ci0gICAgICAvLyBzbyB3ZSBwYXNzIGNvbXBsZXRlIHBhY2tldCBpbiBjYWxsYmFjayBhbmQgbGV0IG90aGVyIGNvZGUgYW5hbHl6ZSB0aGlzCi0gICAgICBoZF9jYi5jYWxsYmFjayhoZF9jYi5kZXZpY2UuYWRkciwgSElEX0RIT1NUX0VWVF9HRVRfUkVQT1JULAotICAgICAgICAgICAgICAgICAgICAgISEocGFyYW0gJiBISURfUEFSX0dFVF9SRVBfQlVGU0laRV9GT0xMT1dTKSwgcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19TRVRfUkVQT1JUOgotICAgICAgLy8gYXMgYWJvdmUKLSAgICAgIGhkX2NiLmNhbGxiYWNrKGhkX2NiLmRldmljZS5hZGRyLCBISURfREhPU1RfRVZUX1NFVF9SRVBPUlQsIDAsIHBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfVFJBTlNfR0VUX0lETEU6Ci0gICAgICBoaWRkX2Nvbm5fc2VuZF9kYXRhKEhJRF9DSEFOTkVMX0NUUkwsIEhJRF9UUkFOU19EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICBISURfUEFSX1JFUF9UWVBFX09USEVSLCBoZF9jYi5kZXZpY2UuaWRsZV90aW1lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfVFJBTlNfU0VUX0lETEU6Ci0gICAgICBpZiAocF9tc2ctPmxlbiAhPSAyKSB7Ci0gICAgICAgIEhJRERfVFJBQ0VfRVJST1IoIiVzOiBpbnZhbGlkIGxlbiAoJWQpIHNldCBpZGxlIHJlcXVlc3QgcmVjZWl2ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX21zZy0+bGVuKTsKLSAgICAgICAgZXJyID0gVFJVRTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhkX2NiLmRldmljZS5pZGxlX3RpbWUgPSBwX2RhdGFbMV07Ci0gICAgICAgIEhJRERfVFJBQ0VfREVCVUcoIiVzOiBpZGxlX3RpbWUgPSAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhkX2NiLmRldmljZS5pZGxlX3RpbWUpOwotICAgICAgICBpZiAoaGRfY2IuZGV2aWNlLmlkbGVfdGltZSkgewotICAgICAgICAgIEhJRERfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIiVzOiBpZGxlX3RpbWUgb2YgJWQgbXMgbm90IHN1cHBvcnRlZCBieSBISUQgRGV2aWNlIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgIChoZF9jYi5kZXZpY2UuaWRsZV90aW1lICogNCkpOwotICAgICAgICAgIGVyciA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghZXJyKSB7Ci0gICAgICAgIGhpZGRfY29ubl9zZW5kX2RhdGEoMCwgSElEX1RSQU5TX0hBTkRTSEFLRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURfUEFSX0hBTkRTSEFLRV9SU1BfU1VDQ0VTUywgMCwgMCwgTlVMTCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBoaWRkX2Nvbm5fc2VuZF9kYXRhKDAsIEhJRF9UUkFOU19IQU5EU0hBS0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9JTlZBTElEX1BBUkFNLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgfQotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19HRVRfUFJPVE9DT0w6Ci0gICAgICBoaWRkX2Nvbm5fc2VuZF9kYXRhKEhJRF9DSEFOTkVMX0NUUkwsIEhJRF9UUkFOU19EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICBISURfUEFSX1JFUF9UWVBFX09USEVSLCAhaGRfY2IuZGV2aWNlLmJvb3RfbW9kZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSElEX1RSQU5TX1NFVF9QUk9UT0NPTDoKLSAgICAgIGhkX2NiLmRldmljZS5ib290X21vZGUgPSAhKHBhcmFtICYgSElEX1BBUl9QUk9UT0NPTF9NQVNLKTsKLSAgICAgIGhkX2NiLmNhbGxiYWNrKGhkX2NiLmRldmljZS5hZGRyLCBISURfREhPU1RfRVZUX1NFVF9QUk9UT0NPTCwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtICYgSElEX1BBUl9QUk9UT0NPTF9NQVNLLCBOVUxMKTsKLSAgICAgIGhpZGRfY29ubl9zZW5kX2RhdGEoMCwgSElEX1RSQU5TX0hBTkRTSEFLRSwgSElEX1BBUl9IQU5EU0hBS0VfUlNQX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwpOwotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19DT05UUk9MOgotICAgICAgc3dpdGNoIChwYXJhbSkgewotICAgICAgICBjYXNlIEhJRF9QQVJfQ09OVFJPTF9TVVNQRU5EOgotICAgICAgICAgIGhkX2NiLmNhbGxiYWNrKGhkX2NiLmRldmljZS5hZGRyLCBISURfREhPU1RfRVZUX1NVU1BFTkQsIDAsIE5VTEwpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSElEX1BBUl9DT05UUk9MX0VYSVRfU1VTUEVORDoKLSAgICAgICAgICBoZF9jYi5jYWxsYmFjayhoZF9jYi5kZXZpY2UuYWRkciwgSElEX0RIT1NUX0VWVF9FWElUX1NVU1BFTkQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBISURfUEFSX0NPTlRST0xfVklSVFVBTF9DQUJMRV9VTlBMVUc6Ci0gICAgICAgICAgaGlkZF9jb25uX2Rpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgIC8vIHNldCBmbGFnIHNvIHdlIGNhbiBub3RpZnkgcHJvcGVybHkgd2hlbiBkaXNjb25uZWN0ZWQKLSAgICAgICAgICBoZF9jYi5wZW5kaW5nX3ZjX3VucGx1ZyA9IFRSVUU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBISURfVFJBTlNfREFUQToKLSAgICBkZWZhdWx0OgotICAgICAgSElERF9UUkFDRV9XQVJOSU5HKCIlczogZ290IHVuc3VwcG9ydGVkIG1zZyAoJWQpIiwgX19mdW5jX18sIG1zZ190eXBlKTsKLSAgICAgIGhpZGRfY29ubl9zZW5kX2RhdGEoMCwgSElEX1RSQU5TX0hBTkRTSEFLRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9VTlNVUFBPUlRFRF9SRVEsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGRfY29ubl9yZWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVycyBMMkNBUCBjaGFubmVscwotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBoaWRkX2Nvbm5fcmVnKHZvaWQpIHsKLSAgSElERF9UUkFDRV9BUEkoIiVzIiwgX19mdW5jX18pOwotCi0gIG1lbXNldCgmaGRfY2IubDJjYXBfY2ZnLCAwLCBzaXplb2YodEwyQ0FQX0NGR19JTkZPKSk7Ci0KLSAgaGRfY2IubDJjYXBfY2ZnLm10dV9wcmVzZW50ID0gVFJVRTsKLSAgaGRfY2IubDJjYXBfY2ZnLm10dSA9IEhJRF9ERVZfTVRVX1NJWkU7Ci0gIG1lbXNldCgmaGRfY2IubDJjYXBfaW50cl9jZmcsIDAsIHNpemVvZih0TDJDQVBfQ0ZHX0lORk8pKTsKLSAgaGRfY2IubDJjYXBfaW50cl9jZmcubXR1X3ByZXNlbnQgPSBUUlVFOwotICBoZF9jYi5sMmNhcF9pbnRyX2NmZy5tdHUgPSBISURfREVWX01UVV9TSVpFOwotCi0gIGlmICghTDJDQV9SZWdpc3RlcjIoSElEX1BTTV9DT05UUk9MLCBkZXZfcmVnX2luZm8sIGZhbHNlIC8qIGVuYWJsZV9zbm9vcCAqLywKLSAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBISURfREVWX01UVV9TSVpFLCAwLAotICAgICAgICAgICAgICAgICAgICAgIEJUQV9TRUNfQVVUSEVOVElDQVRFIHwgQlRBX1NFQ19FTkNSWVBUKSkgewotICAgIEhJRERfVFJBQ0VfRVJST1IoIkhJRCBDb250cm9sIChkZXZpY2UpIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICByZXR1cm4gKEhJRF9FUlJfTDJDQVBfRkFJTEVEKTsKLSAgfQotCi0gIGlmICghTDJDQV9SZWdpc3RlcjIoSElEX1BTTV9JTlRFUlJVUFQsIGRldl9yZWdfaW5mbywgZmFsc2UgLyogZW5hYmxlX3Nub29wICovLAotICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIEhJRF9ERVZfTVRVX1NJWkUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgQlRBX1NFQ19BVVRIRU5USUNBVEUgfCBCVEFfU0VDX0VOQ1JZUFQpKSB7Ci0gICAgTDJDQV9EZXJlZ2lzdGVyKEhJRF9QU01fQ09OVFJPTCk7Ci0gICAgSElERF9UUkFDRV9FUlJPUigiSElEIEludGVycnVwdCAoZGV2aWNlKSByZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgcmV0dXJuIChISURfRVJSX0wyQ0FQX0ZBSUxFRCk7Ci0gIH0KLQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGRfY29ubl9kZXJlZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGVyZWdpc3RlcnMgTDJDQVAgY2hhbm5lbHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBoaWRkX2Nvbm5fZGVyZWcodm9pZCkgewotICBISUREX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgTDJDQV9EZXJlZ2lzdGVyKEhJRF9QU01fQ09OVFJPTCk7Ci0gIEwyQ0FfRGVyZWdpc3RlcihISURfUFNNX0lOVEVSUlVQVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRkX2Nvbm5faW5pdGlhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYXRlcyBISUQgY29ubmVjdGlvbiB0byBwbHVnZ2VkIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgSElEX1NVQ0NFU1MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgaGlkZF9jb25uX2luaXRpYXRlKHZvaWQpIHsKLSAgdEhJRF9ERVZfREVWX0NUQiogcF9kZXYgPSAmaGRfY2IuZGV2aWNlOwotCi0gIEhJRERfVFJBQ0VfQVBJKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoIXBfZGV2LT5pbl91c2UpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiBubyB2aXJ0dWFsIGNhYmxlIGVzdGFibGlzaGVkIiwgX19mdW5jX18pOwotICAgIHJldHVybiAoSElEX0VSUl9OT1RfUkVHSVNURVJFRCk7Ci0gIH0KLQotICBpZiAocF9kZXYtPmNvbm4uY29ubl9zdGF0ZSAhPSBISURfQ09OTl9TVEFURV9VTlVTRUQpIHsKLSAgICBISUREX1RSQUNFX1dBUk5JTkcoIiVzOiBjb25uZWN0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIChISURfRVJSX0NPTk5fSU5fUFJPQ0VTUyk7Ci0gIH0KLQotICBwX2Rldi0+Y29ubi5jdHJsX2NpZCA9IDA7Ci0gIHBfZGV2LT5jb25uLmludHJfY2lkID0gMDsKLSAgcF9kZXYtPmNvbm4uZGlzY19yZWFzb24gPSBISURfTDJDQVBfQ09OTl9GQUlMOwotCi0gIHBfZGV2LT5jb25uLmNvbm5fZmxhZ3MgPSBISURfQ09OTl9GTEFHU19JU19PUklHOwotCi0gIC8qIENoZWNrIGlmIEwyQ0FQIHN0YXJ0ZWQgdGhlIGNvbm5lY3Rpb24gcHJvY2VzcyAqLwotICBpZiAoKHBfZGV2LT5jb25uLmN0cmxfY2lkID0KLSAgICAgICAgICAgTDJDQV9Db25uZWN0UmVxMihISURfUFNNX0NPTlRST0wsIHBfZGV2LT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9TRUNfQVVUSEVOVElDQVRFIHwgQlRBX1NFQ19FTkNSWVBUKSkgPT0gMCkgewotICAgIEhJRERfVFJBQ0VfV0FSTklORygiJXM6IGNvdWxkIG5vdCBzdGFydCBMMkNBUCBjb25uZWN0aW9uIiwgX19mdW5jX18pOwotICAgIGhkX2NiLmNhbGxiYWNrKGhkX2NiLmRldmljZS5hZGRyLCBISURfREhPU1RfRVZUX0NMT1NFLCBISURfRVJSX0wyQ0FQX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBwX2Rldi0+Y29ubi5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19DVFJMOwotICB9Ci0KLSAgcmV0dXJuIChISURfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRkX2Nvbm5fZGlzY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRGlzY29ubmVjdHMgZXhpc3RpbmcgSElEIGNvbm5lY3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEhJRF9TVUNDRVNTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIGhpZGRfY29ubl9kaXNjb25uZWN0KHZvaWQpIHsKLQotICBISUREX1RSQUNFX0FQSSgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLy8gY2xlYW4gYW55IG91dHN0YW5kaW5nIGRhdGEgb24gaW50cgotICBpZiAoaGRfY2IucGVuZGluZ19kYXRhKSB7Ci0gICAgb3NpX2ZyZWUoaGRfY2IucGVuZGluZ19kYXRhKTsKLSAgICBoZF9jYi5wZW5kaW5nX2RhdGEgPSBOVUxMOwotICB9Ci0KLSAgdEhJRF9DT05OKiBwX2hjb24gPSAmaGRfY2IuZGV2aWNlLmNvbm47Ci0KLSAgaWYgKChwX2hjb24tPmN0cmxfY2lkICE9IDApIHx8IChwX2hjb24tPmludHJfY2lkICE9IDApKSB7Ci0gICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfRElTQ09OTkVDVElORzsKLQotICAgIC8qIFNldCBsMmNhcCBpZGxlIHRpbWVvdXQgdG8gMCAoc28gQUNMIGxpbmsgaXMgZGlzY29ubmVjdGVkCi0gICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBjaGFubmVsIGlzIGNsb3NlZCkgKi8KLSAgICBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoaGRfY2IuZGV2aWNlLmFkZHIsIDAsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotCi0gICAgaWYgKHBfaGNvbi0+aW50cl9jaWQpIHsKLSAgICAgIGhpZGRfbDJjaWZfZGlzY29ubmVjdChwX2hjb24tPmludHJfY2lkKTsKLSAgICB9IGVsc2UgaWYgKHBfaGNvbi0+Y3RybF9jaWQpIHsKLSAgICAgIGhpZGRfbDJjaWZfZGlzY29ubmVjdChwX2hjb24tPmN0cmxfY2lkKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgSElERF9UUkFDRV9XQVJOSU5HKCIlczogYWxyZWFkeSBkaXNjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7Ci0gICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfVU5VU0VEOwotICB9Ci0KLSAgcmV0dXJuIChISURfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRkX2Nvbm5fc2VuZF9kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyBkYXRhIHRvIGhvc3QKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIGhpZGRfY29ubl9zZW5kX2RhdGEodWludDhfdCBjaGFubmVsLCB1aW50OF90IG1zZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhcmFtLCB1aW50OF90IGRhdGEsIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHBfb3V0OwotICB1aW50MTZfdCBjaWQ7Ci0gIHVpbnQxNl90IGJ1Zl9zaXplOwotCi0gIEhJRERfVFJBQ0VfVkVSQk9TRSgiJXM6IGNoYW5uZWwoJWQpLCBtc2dfdHlwZSglZCksIGxlbiglZCkiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIG1zZ190eXBlLCBsZW4pOwotCi0gIHRISURfQ09OTiogcF9oY29uID0gJmhkX2NiLmRldmljZS5jb25uOwotCi0gIGlmIChwX2hjb24tPmNvbm5fZmxhZ3MgJiBISURfQ09OTl9GTEFHU19DT05HRVNURUQpIHsKLSAgICByZXR1cm4gSElEX0VSUl9DT05HRVNURUQ7Ci0gIH0KLQotICBzd2l0Y2ggKG1zZ190eXBlKSB7Ci0gICAgY2FzZSBISURfVFJBTlNfSEFORFNIQUtFOgotICAgIGNhc2UgSElEX1RSQU5TX0NPTlRST0w6Ci0gICAgICBjaWQgPSBwX2hjb24tPmN0cmxfY2lkOwotICAgICAgYnVmX3NpemUgPSBISURfQ09OVFJPTF9CVUZfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX1RSQU5TX0RBVEE6Ci0gICAgICBpZiAoY2hhbm5lbCA9PSBISURfQ0hBTk5FTF9DVFJMKSB7Ci0gICAgICAgIGNpZCA9IHBfaGNvbi0+Y3RybF9jaWQ7Ci0gICAgICAgIGJ1Zl9zaXplID0gSElEX0NPTlRST0xfQlVGX1NJWkU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjaWQgPSBwX2hjb24tPmludHJfY2lkOwotICAgICAgICBidWZfc2l6ZSA9IEhJRF9JTlRFUlJVUFRfQlVGX1NJWkU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChISURfRVJSX0lOVkFMSURfUEFSQU0pOwotICB9Ci0KLSAgcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKGJ1Zl9zaXplKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHJldHVybiAoSElEX0VSUl9OT19SRVNPVVJDRVMpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIHBfb3V0ID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAqcF9vdXQgPSBISURfQlVJTERfSERSKG1zZ190eXBlLCBwYXJhbSk7Ci0gIHBfb3V0Kys7Ci0KLSAgcF9idWYtPmxlbiA9IDE7ICAvLyBzdGFydCB3aXRoIGhlYWRlciBvbmx5Ci0KLSAgLy8gYWRkIHJlcG9ydCBpZCBwcmVmaXggb25seSBpZiBub24temVybyAod2hpY2ggaXMgcmVzZXJ2ZWQpCi0gIGlmIChtc2dfdHlwZSA9PSBISURfVFJBTlNfREFUQSAmJiAoZGF0YSB8fCBwYXJhbSA9PSBISURfUEFSX1JFUF9UWVBFX09USEVSKSkgewotICAgICpwX291dCA9IGRhdGE7ICAvLyByZXBvcnRfaWQKLSAgICBwX291dCsrOwotICAgIHBfYnVmLT5sZW4rKzsKLSAgfQotCi0gIGlmIChsZW4gPiAwICYmIHBfZGF0YSAhPSBOVUxMKSB7Ci0gICAgbWVtY3B5KHBfb3V0LCBwX2RhdGEsIGxlbik7Ci0gICAgcF9idWYtPmxlbiArPSBsZW47Ci0gIH0KLQotICAvLyBjaGVjayBpZiBjb25uZWN0ZWQKLSAgaWYgKGhkX2NiLmRldmljZS5zdGF0ZSAhPSBISUREX0RFVl9DT05ORUNURUQpIHsKLSAgICAvLyBmb3IgREFUQSBvbiBpbnRyIHdlIGhvbGQgdHJhbnNmZXIgYW5kIHRyeSB0byByZWNvbm5lY3QKLSAgICBpZiAobXNnX3R5cGUgPT0gSElEX1RSQU5TX0RBVEEgJiYgY2lkID09IHBfaGNvbi0+aW50cl9jaWQpIHsKLSAgICAgIC8vIGRyb3AgcHJldmlvdXMgZGF0YSwgd2UgZG8gbm90IHF1ZXVlIGl0IGZvciBub3cKLSAgICAgIGlmIChoZF9jYi5wZW5kaW5nX2RhdGEpIHsKLSAgICAgICAgb3NpX2ZyZWUoaGRfY2IucGVuZGluZ19kYXRhKTsKLSAgICAgIH0KLQotICAgICAgaGRfY2IucGVuZGluZ19kYXRhID0gcF9idWY7Ci0KLSAgICAgIGlmIChoZF9jYi5kZXZpY2UuY29ubi5jb25uX3N0YXRlID09IEhJRF9DT05OX1NUQVRFX1VOVVNFRCkgewotICAgICAgICBoaWRkX2Nvbm5faW5pdGlhdGUoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIEhJRF9TVUNDRVNTOwotICAgIH0KLQotICAgIHJldHVybiBISURfRVJSX05PX0NPTk5FQ1RJT047Ci0gIH0KLQotI2lmZGVmIFJFUE9SVF9UUkFOU0ZFUl9USU1FU1RBTVAKLSAgaWYgKHJlcG9ydF90cmFuc2ZlcikgewotICAgIEhJRERfVFJBQ0VfRVJST1IoIiVzOiByZXBvcnQgc2VudCIsIF9fZnVuY19fKTsKLSAgfQotI2VuZGlmCi0gIEhJRERfVFJBQ0VfVkVSQk9TRSgiJXM6IHJlcG9ydCBzZW50IiwgX19mdW5jX18pOwotCi0gIGlmICghTDJDQV9EYXRhV3JpdGUoY2lkLCBwX2J1ZikpIHJldHVybiAoSElEX0VSUl9DT05HRVNURUQpOwotCi0gIHJldHVybiAoSElEX1NVQ0NFU1MpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svaGlkL2hpZGRfaW50LmggYi9zdGFjay9oaWQvaGlkZF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2YTVkMC4uMDAwMDAwMAotLS0gYS9zdGFjay9oaWQvaGlkZF9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBISUQgREVWSUNFIGludGVybmFsIGRlZmluaXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBISUREX0lOVF9ICi0jZGVmaW5lIEhJRERfSU5UX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJzdGFjay9oaWQvaGlkX2Nvbm4uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGlkZF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIgIC8vIHRMMkNBUF9DRkdfSU5GTyAmJiBGTE9XX1NQRUMKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1lbnVtIHsgSElERF9ERVZfTk9fQ09OTiwgSElERF9ERVZfQ09OTkVDVEVEIH07Ci0KLXR5cGVkZWYgc3RydWN0IGRldmljZV9jdGIgewotICBib29sIGluX3VzZTsKLSAgUmF3QWRkcmVzcyBhZGRyOwotCi0gIHVpbnQ4X3Qgc3RhdGU7Ci0KLSAgdEhJRF9DT05OIGNvbm47Ci0KLSAgYm9vbCBib290X21vZGU7Ci0KLSAgdWludDhfdCBpZGxlX3RpbWU7Ci19IHRISURfREVWX0RFVl9DVEI7Ci0KLXR5cGVkZWYgc3RydWN0IGRldl9jdGIgewotICB0SElEX0RFVl9ERVZfQ1RCIGRldmljZTsKLQotICB0SElEX0RFVl9IT1NUX0NBTExCQUNLKiBjYWxsYmFjazsKLSAgdEwyQ0FQX0NGR19JTkZPIGwyY2FwX2NmZzsKLSAgdEwyQ0FQX0NGR19JTkZPIGwyY2FwX2ludHJfY2ZnOwotCi0gIGJvb2wgdXNlX2luX3FvczsKLSAgRkxPV19TUEVDIGluX3FvczsKLQotICBib29sIHJlZ19mbGFnOwotICB1aW50OF90IHRyYWNlX2xldmVsOwotCi0gIGJvb2wgYWxsb3dfaW5jb21pbmc7Ci0KLSAgQlRfSERSKiBwZW5kaW5nX2RhdGE7Ci0KLSAgYm9vbCBwZW5kaW5nX3ZjX3VucGx1ZzsKLX0gdEhJRF9ERVZfQ1RCOwotCi1leHRlcm4gdEhJRF9TVEFUVVMgaGlkZF9jb25uX3JlZyh2b2lkKTsKLWV4dGVybiB2b2lkIGhpZGRfY29ubl9kZXJlZyh2b2lkKTsKLWV4dGVybiB0SElEX1NUQVRVUyBoaWRkX2Nvbm5faW5pdGlhdGUodm9pZCk7Ci1leHRlcm4gdEhJRF9TVEFUVVMgaGlkZF9jb25uX2Rpc2Nvbm5lY3Qodm9pZCk7Ci1leHRlcm4gdEhJRF9TVEFUVVMgaGlkZF9jb25uX3NlbmRfZGF0YSh1aW50OF90IGNoYW5uZWwsIHVpbnQ4X3QgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhcmFtLCB1aW50OF90IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHBfZGF0YSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWFpbiBDb250cm9sIEJsb2NrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfREVWX0NUQiBoZF9jYjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9oaWQvaGlkaF9hcGkuY2MgYi9zdGFjay9oaWQvaGlkaF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTUzNTguLjAwMDAwMDAKLS0tIGEvc3RhY2svaGlkL2hpZGhfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBISUQgSE9TVCBBUEkgZW50cnkgcG9pbnRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImhpZGhfYXBpLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImhpZGRlZnMuaCIKLSNpbmNsdWRlICJoaWRoX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fZGV2LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi10SElEX0hPU1RfQ1RCIGhoX2NiOwotCi1zdGF0aWMgdm9pZCBoaWRoX3NlYXJjaF9jYWxsYmFjayh0U0RQX1JFU1VMVCBzZHBfcmVzdWx0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9Ib3N0R2V0U0RQUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBkZXZpY2UgU0RQIHJlY29yZAotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0hvc3RHZXRTRFBSZWNvcmQoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MzJfdCBkYl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SElEX0hPU1RfU0RQX0NBTExCQUNLKiBzZHBfY2JhY2spIHsKLQotICBpZiAoaGhfY2Iuc2RwX2J1c3kpIHJldHVybiBISURfRVJSX1NEUF9CVVNZOwotCi0gIGhoX2NiLnBfc2RwX2RiID0gcF9kYjsKLSAgVXVpZCB1dWlkX2xpc3QgPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfSFVNQU5fSU5URVJGQUNFKTsKLSAgU0RQX0luaXREaXNjb3ZlcnlEYihwX2RiLCBkYl9sZW4sIDEsICZ1dWlkX2xpc3QsIDAsIE5VTEwpOwotCi0gIGlmIChTRFBfU2VydmljZVNlYXJjaFJlcXVlc3QoYWRkciwgcF9kYiwgaGlkaF9zZWFyY2hfY2FsbGJhY2spKSB7Ci0gICAgaGhfY2Iuc2RwX2NiYWNrID0gc2RwX2NiYWNrOwotICAgIGhoX2NiLnNkcF9idXN5ID0gdHJ1ZTsKLSAgICByZXR1cm4gSElEX1NVQ0NFU1M7Ci0gIH0gZWxzZQotICAgIHJldHVybiBISURfRVJSX05PX1JFU09VUkNFUzsKLX0KLQotdm9pZCBoaWRoX2dldF9zdHJfYXR0cih0U0RQX0RJU0NfUkVDKiBwX3JlYywgdWludDE2X3QgYXR0cl9pZCwgdWludDE2X3QgbWF4X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciogc3RyKSB7Ci0gIHRTRFBfRElTQ19BVFRSKiBwX2F0dHI7Ci0gIHVpbnQxNl90IG5hbWVfbGVuOwotCi0gIHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIGF0dHJfaWQpOwotICBpZiAocF9hdHRyICE9IE5VTEwpIHsKLSAgICBuYW1lX2xlbiA9IFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSk7Ci0gICAgaWYgKG5hbWVfbGVuIDwgbWF4X2xlbikgewotICAgICAgbWVtY3B5KHN0ciwgKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5LCBuYW1lX2xlbik7Ci0gICAgICBzdHJbbmFtZV9sZW5dID0gJ1wwJzsKLSAgICB9IGVsc2UgewotICAgICAgbWVtY3B5KHN0ciwgKGNoYXIqKXBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5LCBtYXhfbGVuIC0gMSk7Ci0gICAgICBzdHJbbWF4X2xlbiAtIDFdID0gJ1wwJzsKLSAgICB9Ci0gIH0gZWxzZQotICAgIHN0clswXSA9ICdcMCc7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZGhfc2VhcmNoX2NhbGxiYWNrKHRTRFBfUkVTVUxUIHNkcF9yZXN1bHQpIHsKLSAgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIgPSBoaF9jYi5wX3NkcF9kYjsKLSAgdFNEUF9ESVNDX1JFQyogcF9yZWM7Ci0gIHRTRFBfRElTQ19BVFRSICpwX2F0dHIsICpwX3N1YmF0dHIxLCAqcF9zdWJhdHRyMiwgKnBfcmVwZGVzYzsKLSAgdEhJRF9ERVZfU0RQX0lORk8qIHBfbnZpID0gJmhoX2NiLnNkcF9yZWM7Ci0gIHVpbnQxNl90IGF0dHJfbWFzayA9IDA7Ci0KLQotICBoaF9jYi5zZHBfYnVzeSA9IGZhbHNlOwotCi0gIGlmIChzZHBfcmVzdWx0ICE9IFNEUF9TVUNDRVNTKSB7Ci0gICAgaGhfY2Iuc2RwX2NiYWNrKHNkcF9yZXN1bHQsIDAsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFV1aWQgaGlkX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfSFVNQU5fSU5URVJGQUNFKTsKLSAgcF9yZWMgPSBTRFBfRmluZFNlcnZpY2VVVUlESW5EYihwX2RiLCBoaWRfdXVpZCwgTlVMTCk7Ci0gIGlmIChwX3JlYyA9PSBOVUxMKSB7Ci0gICAgaGhfY2Iuc2RwX2NiYWNrKEhJRF9TRFBfTk9fU0VSVl9VVUlELCAwLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtZW1zZXQoJmhoX2NiLnNkcF9yZWMsIDAsIHNpemVvZih0SElEX0RFVl9TRFBfSU5GTykpOwotCi0gIC8qIEZpcnN0LCB2ZXJpZnkgdGhlIG1hbmRhdG9yeSBmaWVsZHMgd2UgY2FyZSBhYm91dCAqLwotICBpZiAoKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX0hJRF9ERVNDUklQVE9SX0xJU1QpKSA9PQotICAgICAgIE5VTEwpIHx8Ci0gICAgICAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgIT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgfHwKLSAgICAgICgocF9zdWJhdHRyMSA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHIpID09IE5VTEwpIHx8Ci0gICAgICAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfc3ViYXR0cjEtPmF0dHJfbGVuX3R5cGUpICE9Ci0gICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgfHwKLSAgICAgICgocF9zdWJhdHRyMiA9IHBfc3ViYXR0cjEtPmF0dHJfdmFsdWUudi5wX3N1Yl9hdHRyKSA9PSBOVUxMKSB8fAotICAgICAgKChwX3JlcGRlc2MgPSBwX3N1YmF0dHIyLT5wX25leHRfYXR0cikgPT0gTlVMTCkgfHwKLSAgICAgIChTRFBfRElTQ19BVFRSX1RZUEUocF9yZXBkZXNjLT5hdHRyX2xlbl90eXBlKSAhPSBURVhUX1NUUl9ERVNDX1RZUEUpKSB7Ci0gICAgaGhfY2Iuc2RwX2NiYWNrKEhJRF9TRFBfTUFOREFUT1JZX01JU1NJTkcsIDAsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfbnZpLT5kc2NwX2luZm8uZGxfbGVuID0gU0RQX0RJU0NfQVRUUl9MRU4ocF9yZXBkZXNjLT5hdHRyX2xlbl90eXBlKTsKLSAgaWYgKHBfbnZpLT5kc2NwX2luZm8uZGxfbGVuICE9IDApCi0gICAgcF9udmktPmRzY3BfaW5mby5kc2NfbGlzdCA9ICh1aW50OF90KikmcF9yZXBkZXNjLT5hdHRyX3ZhbHVlOwotCi0gIGlmICgoKHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfSElEX1ZJUlRVQUxfQ0FCTEUpKSAhPQotICAgICAgIE5VTEwpICYmCi0gICAgICAocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTgpKSB7Ci0gICAgYXR0cl9tYXNrIHw9IEhJRF9WSVJUVUFMX0NBQkxFOwotICB9Ci0KLSAgaWYgKCgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYygKLSAgICAgICAgICAgIHBfcmVjLCBBVFRSX0lEX0hJRF9SRUNPTk5FQ1RfSU5JVElBVEUpKSAhPSBOVUxMKSAmJgotICAgICAgKHBfYXR0ci0+YXR0cl92YWx1ZS52LnU4KSkgewotICAgIGF0dHJfbWFzayB8PSBISURfUkVDT05OX0lOSVQ7Ci0gIH0KLQotICBpZiAoKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKAotICAgICAgICAgICAgcF9yZWMsIEFUVFJfSURfSElEX05PUk1BTExZX0NPTk5FQ1RBQkxFKSkgIT0gTlVMTCkgJiYKLSAgICAgIChwX2F0dHItPmF0dHJfdmFsdWUudi51OCkpIHsKLSAgICBhdHRyX21hc2sgfD0gSElEX05PUk1BTExZX0NPTk5FQ1RBQkxFOwotICB9Ci0KLSAgaWYgKCgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9ISURfU0RQX0RJU0FCTEUpKSAhPQotICAgICAgIE5VTEwpICYmCi0gICAgICAocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTgpKSB7Ci0gICAgYXR0cl9tYXNrIHw9IEhJRF9TRFBfRElTQUJMRTsKLSAgfQotCi0gIGlmICgoKHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfSElEX0JBVFRFUllfUE9XRVIpKSAhPQotICAgICAgIE5VTEwpICYmCi0gICAgICAocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTgpKSB7Ci0gICAgYXR0cl9tYXNrIHw9IEhJRF9CQVRURVJZX1BPV0VSOwotICB9Ci0KLSAgaWYgKCgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9ISURfUkVNT1RFX1dBS0UpKSAhPQotICAgICAgIE5VTEwpICYmCi0gICAgICAocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTgpKSB7Ci0gICAgYXR0cl9tYXNrIHw9IEhJRF9SRU1PVEVfV0FLRTsKLSAgfQotCi0gIGhpZGhfZ2V0X3N0cl9hdHRyKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSwgSElEX01BWF9TVkNfTkFNRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgIHBfbnZpLT5zdmNfbmFtZSk7Ci0gIGhpZGhfZ2V0X3N0cl9hdHRyKHBfcmVjLCBBVFRSX0lEX1NFUlZJQ0VfREVTQ1JJUFRJT04sIEhJRF9NQVhfU1ZDX0RFU0NSX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgcF9udmktPnN2Y19kZXNjcik7Ci0gIGhpZGhfZ2V0X3N0cl9hdHRyKHBfcmVjLCBBVFRSX0lEX1BST1ZJREVSX05BTUUsIEhJRF9NQVhfUFJPVl9OQU1FX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgcF9udmktPnByb3ZfbmFtZSk7Ci0KLSAgaWYgKCgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9ISURfREVWSUNFX1JFTE5VTSkpICE9Ci0gICAgICAgTlVMTCkpIHsKLSAgICBwX252aS0+cmVsX251bSA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgfQotCi0gIGlmICgoKHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfSElEX0NPVU5UUllfQ09ERSkpICE9Ci0gICAgICAgTlVMTCkpIHsKLSAgICBwX252aS0+Y3RyeV9jb2RlID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTg7Ci0gIH0KLQotICBpZiAoKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX0hJRF9ERVZJQ0VfU1VCQ0xBU1MpKSAhPQotICAgICAgIE5VTEwpKSB7Ci0gICAgcF9udmktPnN1Yl9jbGFzcyA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnU4OwotICB9Ci0KLSAgaWYgKCgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX3JlYywgQVRUUl9JRF9ISURfUEFSU0VSX1ZFUlNJT04pKSAhPQotICAgICAgIE5VTEwpKSB7Ci0gICAgcF9udmktPmhwYXJzX3ZlciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgfQotCi0gIGlmICgoKHBfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMoCi0gICAgICAgICAgICBwX3JlYywgQVRUUl9JRF9ISURfTElOS19TVVBFUlZJU0lPTl9UTykpICE9IE5VTEwpKSB7Ci0gICAgYXR0cl9tYXNrIHw9IEhJRF9TVVBfVE9VVF9BVkxCTDsKLSAgICBwX252aS0+c3VwX3RpbWVvdXQgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gIH0KLQotICBpZiAoKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX0hJRF9TU1JfSE9TVF9NQVhfTEFUKSkgIT0KLSAgICAgICBOVUxMKSkgewotICAgIGF0dHJfbWFzayB8PSBISURfU1NSX01BWF9MQVRFTkNZOwotICAgIHBfbnZpLT5zc3JfbWF4X2xhdGVuY3kgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gIH0gZWxzZQotICAgIHBfbnZpLT5zc3JfbWF4X2xhdGVuY3kgPSBISURfU1NSX1BBUkFNX0lOVkFMSUQ7Ci0KLSAgaWYgKCgocF9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYygKLSAgICAgICAgICAgIHBfcmVjLCBBVFRSX0lEX0hJRF9TU1JfSE9TVF9NSU5fVE9VVCkpICE9IE5VTEwpKSB7Ci0gICAgYXR0cl9tYXNrIHw9IEhJRF9TU1JfTUlOX1RPVVQ7Ci0gICAgcF9udmktPnNzcl9taW5fdG91dCA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgfSBlbHNlCi0gICAgcF9udmktPnNzcl9taW5fdG91dCA9IEhJRF9TU1JfUEFSQU1fSU5WQUxJRDsKLQotICBoaF9jYi5zZHBfcmVjLnBfc2RwX2xheWVyX3JlYyA9IHBfcmVjOwotICBoaF9jYi5zZHBfY2JhY2soU0RQX1NVQ0NFU1MsIGF0dHJfbWFzaywgJmhoX2NiLnNkcF9yZWMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RJbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjb250cm9sIGJsb2NrIGFuZCB0cmFjZQotICogICAgICAgICAgICAgICAgICB2YXJpYWJsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhJRF9Ib3N0SW5pdCh2b2lkKSB7Ci0gIHVpbnQ4X3QgbG9nX2xldmVsID0gaGhfY2IudHJhY2VfbGV2ZWw7Ci0gIG1lbXNldCgmaGhfY2IsIDAsIHNpemVvZih0SElEX0hPU1RfQ1RCKSk7Ci0gIGhoX2NiLnRyYWNlX2xldmVsID0gbG9nX2xldmVsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RTZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBISUQgSG9zdC4gSWYgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggMHhGRiwgaXQgc2ltcGx5IHJlYWRzIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIG5ldyAoY3VycmVudCkgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBISURfSG9zdFNldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBoaF9jYi50cmFjZV9sZXZlbCA9IG5ld19sZXZlbDsKLQotICByZXR1cm4gKGhoX2NiLnRyYWNlX2xldmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9Ib3N0UmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIEhJRC1Ib3N0IHdpdGggbG93ZXIgbGF5ZXJzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBISURfSG9zdFJlZ2lzdGVyKHRISURfSE9TVF9ERVZfQ0FMTEJBQ0sqIGRldl9jYmFjaykgewotICB0SElEX1NUQVRVUyBzdDsKLQotICBpZiAoaGhfY2IucmVnX2ZsYWcpIHJldHVybiBISURfRVJSX0FMUkVBRFlfUkVHSVNURVJFRDsKLQotICBpZiAoZGV2X2NiYWNrID09IE5VTEwpIHJldHVybiBISURfRVJSX0lOVkFMSURfUEFSQU07Ci0KLSAgLyogUmVnaXN0ZXIgd2l0aCBMMkNBUCAqLwotICBzdCA9IGhpZGhfY29ubl9yZWcoKTsKLSAgaWYgKHN0ICE9IEhJRF9TVUNDRVNTKSB7Ci0gICAgcmV0dXJuIHN0OwotICB9Ci0KLSAgaGhfY2IuY2FsbGJhY2sgPSBkZXZfY2JhY2s7Ci0gIGhoX2NiLnJlZ19mbGFnID0gdHJ1ZTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEhJRF9IT1NUX01BWF9ERVZJQ0VTOyBpKyspIHsKLSAgICBoaF9jYi5kZXZpY2VzW2ldLmNvbm4ucHJvY2Vzc19yZXBhZ2VfdGltZXIgPQotICAgICAgICBhbGFybV9uZXcoImhpZF9kZXZpY2VzX2Nvbm4ucHJvY2Vzc19yZXBhZ2VfdGltZXIiKTsKLSAgfQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9Ib3N0RGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaG9zdCBpcyBhYm91dCBwb3dlciBkb3duLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0hvc3REZXJlZ2lzdGVyKHZvaWQpIHsKLSAgdWludDhfdCBpOwotCi0gIGlmICghaGhfY2IucmVnX2ZsYWcpIHJldHVybiAoSElEX0VSUl9OT1RfUkVHSVNURVJFRCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEhJRF9IT1NUX01BWF9ERVZJQ0VTOyBpKyspIHsKLSAgICBISURfSG9zdFJlbW92ZURldihpKTsKLSAgICBhbGFybV9mcmVlKGhoX2NiLmRldmljZXNbaV0uY29ubi5wcm9jZXNzX3JlcGFnZV90aW1lcik7Ci0gIH0KLQotICBoaWRoX2Nvbm5fZGVyZWcoKTsKLSAgaGhfY2IucmVnX2ZsYWcgPSBmYWxzZTsKLQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9Ib3N0QWRkRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIGNhbGxlZCBzbyBISUQtaG9zdCBtYXkgbWFuYWdlIHRoaXMgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0hvc3RBZGREZXYoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDE2X3QgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaGFuZGxlKSB7Ci0gIGludCBpOwotICAvKiBGaW5kIGFuIGVudHJ5IGZvciB0aGlzIGRldmljZSBpbiBoaF9jYi5kZXZpY2VzIGFycmF5ICovCi0gIGlmICghaGhfY2IucmVnX2ZsYWcpIHJldHVybiAoSElEX0VSUl9OT1RfUkVHSVNURVJFRCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEhJRF9IT1NUX01BWF9ERVZJQ0VTOyBpKyspIHsKLSAgICBpZiAoKGhoX2NiLmRldmljZXNbaV0uaW5fdXNlKSAmJiBhZGRyID09IGhoX2NiLmRldmljZXNbaV0uYWRkcikgYnJlYWs7Ci0gIH0KLQotICBpZiAoaSA9PSBISURfSE9TVF9NQVhfREVWSUNFUykgewotICAgIGZvciAoaSA9IDA7IGkgPCBISURfSE9TVF9NQVhfREVWSUNFUzsgaSsrKSB7Ci0gICAgICBpZiAoIWhoX2NiLmRldmljZXNbaV0uaW5fdXNlKSBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoaSA9PSBISURfSE9TVF9NQVhfREVWSUNFUykgcmV0dXJuIEhJRF9FUlJfTk9fUkVTT1VSQ0VTOwotCi0gIGlmICghaGhfY2IuZGV2aWNlc1tpXS5pbl91c2UpIHsKLSAgICBoaF9jYi5kZXZpY2VzW2ldLmluX3VzZSA9IHRydWU7Ci0gICAgaGhfY2IuZGV2aWNlc1tpXS5hZGRyID0gYWRkcjsKLSAgICBoaF9jYi5kZXZpY2VzW2ldLnN0YXRlID0gSElEX0RFVl9OT19DT05OOwotICAgIGhoX2NiLmRldmljZXNbaV0uY29ubl90cmllcyA9IDA7Ci0gIH0KLQotICBpZiAoYXR0cl9tYXNrICE9IEhJRF9BVFRSX01BU0tfSUdOT1JFKSBoaF9jYi5kZXZpY2VzW2ldLmF0dHJfbWFzayA9IGF0dHJfbWFzazsKLQotICAqaGFuZGxlID0gaTsKLQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9Ib3N0UmVtb3ZlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHJlbW92ZXMgdGhlIGRldmljZSBmcm9tIHRoZSBsaXN0IG9mIGRldmljZXMgdGhhdCB0aGUKLSAqICAgICAgICAgICAgICAgICAgaG9zdCBoYXMgdG8gbWFuYWdlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0hvc3RSZW1vdmVEZXYodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIGlmICghaGhfY2IucmVnX2ZsYWcpIHJldHVybiAoSElEX0VSUl9OT1RfUkVHSVNURVJFRCk7Ci0KLSAgaWYgKChkZXZfaGFuZGxlID49IEhJRF9IT1NUX01BWF9ERVZJQ0VTKSB8fAotICAgICAgKCFoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmluX3VzZSkpCi0gICAgcmV0dXJuIEhJRF9FUlJfSU5WQUxJRF9QQVJBTTsKLQotICBISURfSG9zdENsb3NlRGV2KGRldl9oYW5kbGUpOwotICBoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmluX3VzZSA9IGZhbHNlOwotICBoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmNvbm4uY29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX1VOVVNFRDsKLSAgaGhfY2IuZGV2aWNlc1tkZXZfaGFuZGxlXS5jb25uLmN0cmxfY2lkID0KLSAgICAgIGhoX2NiLmRldmljZXNbZGV2X2hhbmRsZV0uY29ubi5pbnRyX2NpZCA9IDA7Ci0gIGhoX2NiLmRldmljZXNbZGV2X2hhbmRsZV0uYXR0cl9tYXNrID0gMDsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RPcGVuRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIGluaXRpYXRlIGEKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhdHRlbXB0IHRvIGEgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBISURfSG9zdE9wZW5EZXYodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIGlmICghaGhfY2IucmVnX2ZsYWcpIHJldHVybiAoSElEX0VSUl9OT1RfUkVHSVNURVJFRCk7Ci0KLSAgaWYgKChkZXZfaGFuZGxlID49IEhJRF9IT1NUX01BWF9ERVZJQ0VTKSB8fAotICAgICAgKCFoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmluX3VzZSkpCi0gICAgcmV0dXJuIEhJRF9FUlJfSU5WQUxJRF9QQVJBTTsKLQotICBpZiAoaGhfY2IuZGV2aWNlc1tkZXZfaGFuZGxlXS5zdGF0ZSAhPSBISURfREVWX05PX0NPTk4pCi0gICAgcmV0dXJuIEhJRF9FUlJfQUxSRUFEWV9DT05OOwotCi0gIGhoX2NiLmRldmljZXNbZGV2X2hhbmRsZV0uY29ubl90cmllcyA9IDE7Ci0gIHJldHVybiBoaWRoX2Nvbm5faW5pdGlhdGUoZGV2X2hhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdFdyaXRlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBob3N0IGhhcyBhIHJlcG9ydCB0byBzZW5kLgotICoKLSAqICAgICAgICAgICAgICAgICAgcmVwb3J0X2lkOiBpcyBvbmx5IHVzZWQgb24gR0VUX1JFUE9SVCB0cmFuc2FjdGlvbiBpZiBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQuIG9ubHkgdmFsaWQgd2hlbiBpdCBpcyBub24temVyby4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgSElEX0hvc3RXcml0ZURldih1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3QgdF90eXBlLCB1aW50OF90IHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhLCB1aW50OF90IHJlcG9ydF9pZCwgQlRfSERSKiBwYnVmKSB7Ci0gIHRISURfU1RBVFVTIHN0YXR1cyA9IEhJRF9TVUNDRVNTOwotCi0gIGlmICghaGhfY2IucmVnX2ZsYWcpIHsKLSAgICBISURIX1RSQUNFX0VSUk9SKCJISURfRVJSX05PVF9SRUdJU1RFUkVEIik7Ci0gICAgc3RhdHVzID0gSElEX0VSUl9OT1RfUkVHSVNURVJFRDsKLSAgfQotCi0gIGlmICgoZGV2X2hhbmRsZSA+PSBISURfSE9TVF9NQVhfREVWSUNFUykgfHwKLSAgICAgICghaGhfY2IuZGV2aWNlc1tkZXZfaGFuZGxlXS5pbl91c2UpKSB7Ci0gICAgSElESF9UUkFDRV9FUlJPUigiSElEX0VSUl9JTlZBTElEX1BBUkFNIik7Ci0gICAgc3RhdHVzID0gSElEX0VSUl9JTlZBTElEX1BBUkFNOwotICB9Ci0KLSAgZWxzZSBpZiAoaGhfY2IuZGV2aWNlc1tkZXZfaGFuZGxlXS5zdGF0ZSAhPSBISURfREVWX0NPTk5FQ1RFRCkgewotICAgIEhJREhfVFJBQ0VfRVJST1IoIkhJRF9FUlJfTk9fQ09OTkVDVElPTiBkZXZfaGFuZGxlICVkIiwgZGV2X2hhbmRsZSk7Ci0gICAgc3RhdHVzID0gSElEX0VSUl9OT19DT05ORUNUSU9OOwotICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSBISURfU1VDQ0VTUykKLSAgICBvc2lfZnJlZShwYnVmKTsKLSAgZWxzZQotICAgIHN0YXR1cyA9Ci0gICAgICAgIGhpZGhfY29ubl9zbmRfZGF0YShkZXZfaGFuZGxlLCB0X3R5cGUsIHBhcmFtLCBkYXRhLCByZXBvcnRfaWQsIHBidWYpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdENsb3NlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGRpc2Nvbm5lY3RzIHRoZSBkZXZpY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIEhJRF9Ib3N0Q2xvc2VEZXYodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIGlmICghaGhfY2IucmVnX2ZsYWcpIHJldHVybiAoSElEX0VSUl9OT1RfUkVHSVNURVJFRCk7Ci0KLSAgaWYgKChkZXZfaGFuZGxlID49IEhJRF9IT1NUX01BWF9ERVZJQ0VTKSB8fAotICAgICAgKCFoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmluX3VzZSkpCi0gICAgcmV0dXJuIEhJRF9FUlJfSU5WQUxJRF9QQVJBTTsKLQotICBpZiAoaGhfY2IuZGV2aWNlc1tkZXZfaGFuZGxlXS5zdGF0ZSAhPSBISURfREVWX0NPTk5FQ1RFRCkKLSAgICByZXR1cm4gSElEX0VSUl9OT19DT05ORUNUSU9OOwotCi0gIGFsYXJtX2NhbmNlbChoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmNvbm4ucHJvY2Vzc19yZXBhZ2VfdGltZXIpOwotICBoaF9jYi5kZXZpY2VzW2Rldl9oYW5kbGVdLmNvbm5fdHJpZXMgPSBISURfSE9TVF9NQVhfQ09OTl9SRVRSWSArIDE7Ci0gIHJldHVybiBoaWRoX2Nvbm5fZGlzY29ubmVjdChkZXZfaGFuZGxlKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2hpZC9oaWRoX2Nvbm4uY2MgYi9zdGFjay9oaWQvaGlkaF9jb25uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBjYzNiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2hpZC9oaWRoX2Nvbm4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbm5lY3Rpb24gaW50ZXJmYWNlIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiaGlkZGVmcy5oIgotI2luY2x1ZGUgImhpZGhfYXBpLmgiCi0jaW5jbHVkZSAiaGlkaF9pbnQuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIgIC8vIEJUTV9Mb2dIaXN0b3J5Ci0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBjaGFyIGtCdG1Mb2dUYWdbXSA9ICJISURIIjsKLWNvbnN0ZXhwciB1aW50OF90IGtISURfSE9TVF9NQVhfREVWSUNFUyA9IEhJRF9IT1NUX01BWF9ERVZJQ0VTOwotfQotCi1zdGF0aWMgdWludDhfdCBmaW5kX2Nvbm5fYnlfY2lkKHVpbnQxNl90IGNpZCk7Ci1zdGF0aWMgdm9pZCBoaWRoX2Nvbm5fcmV0cnkodWludDhfdCBkaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGlkaF9sMmNpZl9jb25uZWN0X2luZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsMmNhcF9pZCk7Ci1zdGF0aWMgdm9pZCBoaWRoX2wyY2lmX2Nvbm5lY3RfY2ZtKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0KTsKLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfY29uZmlnX2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotc3RhdGljIHZvaWQgaGlkaF9sMmNpZl9jb25maWdfY2ZtKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotc3RhdGljIHZvaWQgaGlkaF9sMmNpZl9kaXNjb25uZWN0X2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIGJvb2wgYWNrX25lZWRlZCk7Ci1zdGF0aWMgdm9pZCBoaWRoX2wyY2lmX2RhdGFfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgQlRfSERSKiBwX21zZyk7Ci1zdGF0aWMgdm9pZCBoaWRoX2wyY2lmX2Rpc2Nvbm5lY3QodWludDE2X3QgbDJjYXBfY2lkKTsKLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfY29uZ19pbmQodWludDE2X3QgbDJjYXBfY2lkLCBib29sIGNvbmdlc3RlZCk7Ci1zdGF0aWMgdm9pZCBoaWRoX29uX2wyY2FwX2Vycm9yKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0KTsKLQotc3RhdGljIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8gaHN0X3JlZ19pbmZvID0gewotICAgIC5wTDJDQV9Db25uZWN0SW5kX0NiID0gaGlkaF9sMmNpZl9jb25uZWN0X2luZCwKLSAgICAucEwyQ0FfQ29ubmVjdENmbV9DYiA9IGhpZGhfbDJjaWZfY29ubmVjdF9jZm0sCi0gICAgLnBMMkNBX0NvbmZpZ0luZF9DYiA9IGhpZGhfbDJjaWZfY29uZmlnX2luZCwKLSAgICAucEwyQ0FfQ29uZmlnQ2ZtX0NiID0gaGlkaF9sMmNpZl9jb25maWdfY2ZtLAotICAgIC5wTDJDQV9EaXNjb25uZWN0SW5kX0NiID0gaGlkaF9sMmNpZl9kaXNjb25uZWN0X2luZCwKLSAgICAucEwyQ0FfRGF0YUluZF9DYiA9IGhpZGhfbDJjaWZfZGF0YV9pbmQsCi0gICAgLnBMMkNBX0Nvbmdlc3Rpb25TdGF0dXNfQ2IgPSBoaWRoX2wyY2lmX2NvbmdfaW5kLAotICAgIC5wTDJDQV9UeENvbXBsZXRlX0NiID0gbnVsbHB0ciwKLSAgICAucEwyQ0FfRXJyb3JfQ2IgPSBoaWRoX29uX2wyY2FwX2Vycm9yLAotICAgIC5wTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RJbmRfQ2IgPSBudWxscHRyLAotICAgIC5wTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RDZm1fQ2IgPSBudWxscHRyLAotICAgIC5wTDJDQV9DcmVkaXRCYXNlZFJlY29uZmlnQ29tcGxldGVkX0NiID0gbnVsbHB0ciwKLX07Ci1zdGF0aWMgdm9pZCBoaWRoX3RyeV9yZXBhZ2UodWludDhfdCBkaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfbDJjaWZfcmVnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBTRFAgdW5pdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEhJRF9TVEFUVVMgaGlkaF9jb25uX3JlZyh2b2lkKSB7Ci0gIGludCB4eDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uLiBXZSBvbmx5IGNhcmUgYWJvdXQgTVRVIGFuZCBmbHVzaCAqLwotICBtZW1zZXQoJmhoX2NiLmwyY2FwX2NmZywgMCwgc2l6ZW9mKHRMMkNBUF9DRkdfSU5GTykpOwotCi0gIGhoX2NiLmwyY2FwX2NmZy5tdHVfcHJlc2VudCA9IHRydWU7Ci0gIGhoX2NiLmwyY2FwX2NmZy5tdHUgPSBISURfSE9TVF9NVFU7Ci0KLSAgLyogTm93LCByZWdpc3RlciB3aXRoIEwyQ0FQICovCi0gIGlmICghTDJDQV9SZWdpc3RlcjIoSElEX1BTTV9DT05UUk9MLCBoc3RfcmVnX2luZm8sIGZhbHNlIC8qIGVuYWJsZV9zbm9vcCAqLywKLSAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBISURfSE9TVF9NVFUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgQlRBX1NFQ19BVVRIRU5USUNBVEUgfCBCVEFfU0VDX0VOQ1JZUFQpKSB7Ci0gICAgSElESF9UUkFDRV9FUlJPUigiSElELUhvc3QgQ29udHJvbCBSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgcmV0dXJuIChISURfRVJSX0wyQ0FQX0ZBSUxFRCk7Ci0gIH0KLSAgaWYgKCFMMkNBX1JlZ2lzdGVyMihISURfUFNNX0lOVEVSUlVQVCwgaHN0X3JlZ19pbmZvLCBmYWxzZSAvKiBlbmFibGVfc25vb3AgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgSElEX0hPU1RfTVRVLCAwLAotICAgICAgICAgICAgICAgICAgICAgIEJUQV9TRUNfQVVUSEVOVElDQVRFIHwgQlRBX1NFQ19FTkNSWVBUKSkgewotICAgIEwyQ0FfRGVyZWdpc3RlcihISURfUFNNX0NPTlRST0wpOwotICAgIEhJREhfVFJBQ0VfRVJST1IoIkhJRC1Ib3N0IEludGVycnVwdCBSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgcmV0dXJuIChISURfRVJSX0wyQ0FQX0ZBSUxFRCk7Ci0gIH0KLQotICBmb3IgKHh4ID0gMDsgeHggPCBrSElEX0hPU1RfTUFYX0RFVklDRVM7IHh4KyspIHsKLSAgICBoaF9jYi5kZXZpY2VzW3h4XS5pbl91c2UgPSBmYWxzZTsKLSAgICBoaF9jYi5kZXZpY2VzW3h4XS5jb25uLmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9VTlVTRUQ7Ci0gIH0KLQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfY29ubl9kaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGRpc2Nvbm5lY3RzIGEgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZGlzY29ubmVjdCBzdGFydGVkLCBmYWxzZSBpZiBhbHJlYWR5IGRpc2Nvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBoaWRoX2Nvbm5fZGlzY29ubmVjdCh1aW50OF90IGRoYW5kbGUpIHsKLSAgdEhJRF9DT05OKiBwX2hjb24gPSAmaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5jb25uOwotCi0gIGlmICgocF9oY29uLT5jdHJsX2NpZCAhPSAwKSB8fCAocF9oY29uLT5pbnRyX2NpZCAhPSAwKSkgewotICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0KLSAgICAvKiBTZXQgbDJjYXAgaWRsZSB0aW1lb3V0IHRvIDAgKHNvIEFDTCBsaW5rIGlzIGRpc2Nvbm5lY3RlZAotICAgICAqIGltbWVkaWF0ZWx5IGFmdGVyIGxhc3QgY2hhbm5lbCBpcyBjbG9zZWQpICovCi0gICAgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyKGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgLyogRGlzY29ubmVjdCBib3RoIGludGVycnVwdCBhbmQgY29udHJvbCBjaGFubmVscyAqLwotICAgIGlmIChwX2hjb24tPmludHJfY2lkKQotICAgICAgaGlkaF9sMmNpZl9kaXNjb25uZWN0KHBfaGNvbi0+aW50cl9jaWQpOwotICAgIGVsc2UgaWYgKHBfaGNvbi0+Y3RybF9jaWQpCi0gICAgICBoaWRoX2wyY2lmX2Rpc2Nvbm5lY3QocF9oY29uLT5jdHJsX2NpZCk7Ci0KLSAgICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmFkZHIsICJEaXNjb25uZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAibG9jYWwgaW5pdGlhdGVkIik7Ci0gIH0gZWxzZSB7Ci0gICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfVU5VU0VEOwotICB9Ci0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfbDJjaWZfY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBpbmJvdW5kIGNvbm5lY3Rpb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBmcm9tIEwyQ0FQLiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBhY3RpbmcgYXMgYQotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfY29ubmVjdF9pbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbDJjYXBfaWQpIHsKLSAgYm9vbCBiQWNjZXB0ID0gdHJ1ZTsKLSAgdWludDhfdCBpID0ga0hJRF9IT1NUX01BWF9ERVZJQ0VTOwotCi0gIEhJREhfVFJBQ0VfRVZFTlQoIkhJRC1Ib3N0IFJjdmQgTDJDQVAgY29ubiBpbmQsIFBTTTogMHglMDR4ICBDSUQgMHgleCIsIHBzbSwKLSAgICAgICAgICAgICAgICAgICBsMmNhcF9jaWQpOwotCi0gIC8qIGFsd2F5cyBhZGQgaW5jb21pbmcgY29ubmVjdGlvbiBkZXZpY2UgaW50byBISUQgZGF0YWJhc2UgYnkgZGVmYXVsdCAqLwotICBpZiAoSElEX0hvc3RBZGREZXYoYmRfYWRkciwgSElEX1NFQ19SRVFVSVJFRCwgJmkpICE9IEhJRF9TVUNDRVNTKSB7Ci0gICAgTDJDQV9EaXNjb25uZWN0UmVxKGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEhJRF9DT05OKiBwX2hjb24gPSAmaGhfY2IuZGV2aWNlc1tpXS5jb25uOwotCi0gIEJUTV9Mb2dIaXN0b3J5KAotICAgICAga0J0bUxvZ1RhZywgaGhfY2IuZGV2aWNlc1tpXS5hZGRyLCAiQ29ubmVjdCByZXF1ZXN0IiwKLSAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiJXMgc3RhdGU6JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIChwc20gPT0gSElEX1BTTV9DT05UUk9MKSA/ICJjb250cm9sIiA6ICJpbnRlcnJ1cHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhpZF9jb25uOjpzdGF0ZV90ZXh0KHBfaGNvbi0+Y29ubl9zdGF0ZSkuY19zdHIoKSkpOwotCi0gIC8qIENoZWNrIHdlIGFyZSBpbiB0aGUgY29ycmVjdCBzdGF0ZSBmb3IgdGhpcyAqLwotICBpZiAocHNtID09IEhJRF9QU01fSU5URVJSVVBUKSB7Ci0gICAgaWYgKHBfaGNvbi0+Y3RybF9jaWQgPT0gMCkgewotICAgICAgSElESF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICJISUQtSG9zdCBSY3ZkIElOVFIgTDJDQVAgY29ubiBpbmQsIGJ1dCBubyBDVEwgY2hhbm5lbCIpOwotICAgICAgYkFjY2VwdCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAocF9oY29uLT5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfSU5UUikgewotICAgICAgSElESF9UUkFDRV9XQVJOSU5HKCJISUQtSG9zdCBSY3ZkIElOVFIgTDJDQVAgY29ubiBpbmQsIHdyb25nIHN0YXRlOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9oY29uLT5jb25uX3N0YXRlKTsKLSAgICAgIGJBY2NlcHQgPSBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSAvKiBDVFJMIGNoYW5uZWwgKi8KLSAgewotI2lmIChISURfSE9TVF9BQ1BUX05FV19DT05OID09IFRSVUUpCi0gICAgcF9oY29uLT5jdHJsX2NpZCA9IHBfaGNvbi0+aW50cl9jaWQgPSAwOwotICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX1VOVVNFRDsKLSNlbHNlCi0gICAgaWYgKHBfaGNvbi0+Y29ubl9zdGF0ZSAhPSBISURfQ09OTl9TVEFURV9VTlVTRUQpIHsKLSAgICAgIEhJREhfVFJBQ0VfV0FSTklORygiSElELUhvc3QgLSBSY3ZkIENUTCBMMkNBUCBjb25uIGluZCwgd3Jvbmcgc3RhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX2hjb24tPmNvbm5fc3RhdGUpOwotICAgICAgYkFjY2VwdCA9IGZhbHNlOwotICAgIH0KLSNlbmRpZgotICB9Ci0KLSAgaWYgKCFiQWNjZXB0KSB7Ci0gICAgTDJDQV9EaXNjb25uZWN0UmVxKGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBzbSA9PSBISURfUFNNX0NPTlRST0wpIHsKLSAgICBwX2hjb24tPmNvbm5fZmxhZ3MgPSAwOwotICAgIHBfaGNvbi0+Y3RybF9jaWQgPSBsMmNhcF9jaWQ7Ci0gICAgcF9oY29uLT5kaXNjX3JlYXNvbiA9IEhJRF9TVUNDRVNTOyAvKiBBdXRoZW50aWNhdGlvbiBwYXNzZWQuIFJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY19yZWFzb24gKGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURfRVJSX0FVVEhfRkFJTEVEKSAqLwotICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfSU5UUjsKLSAgICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBoaF9jYi5kZXZpY2VzW2ldLmFkZHIsICJDb25uZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAid2FpdGluZyBmb3IgaW50ZXJydXB0IGNoYW5uZWwiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN0YXRlLCBjb25maWd1cmF0aW9uICovCi0gIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0NPTkZJRzsKLSAgcF9oY29uLT5pbnRyX2NpZCA9IGwyY2FwX2NpZDsKLQotICBISURIX1RSQUNFX0VWRU5UKAotICAgICAgIkhJRC1Ib3N0IFJjdmQgTDJDQVAgY29ubiBpbmQsIHNlbnQgY29uZmlnIHJlcSwgUFNNOiAweCUwNHggIENJRCAweCV4IiwKLSAgICAgIHBzbSwgbDJjYXBfY2lkKTsKLX0KLQotc3RhdGljIHZvaWQgaGlkaF9wcm9jZXNzX3JlcGFnZV90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgdWludDhfdCBkaGFuZGxlID0gUFRSX1RPX1VJTlQoZGF0YSk7Ci0gIGhpZGhfdHJ5X3JlcGFnZShkaGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfdHJ5X3JlcGFnZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGltZW91dCAodG8gcGFnZSBkZXZpY2UpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRoX3RyeV9yZXBhZ2UodWludDhfdCBkaGFuZGxlKSB7Ci0gIHRISURfSE9TVF9ERVZfQ1RCKiBkZXZpY2U7Ci0KLSAgaGlkaF9jb25uX2luaXRpYXRlKGRoYW5kbGUpOwotCi0gIGRldmljZSA9ICZoaF9jYi5kZXZpY2VzW2RoYW5kbGVdOwotICBkZXZpY2UtPmNvbm5fdHJpZXMrKzsKLQotICBoaF9jYi5jYWxsYmFjayhkaGFuZGxlLCBkZXZpY2UtPmFkZHIsIEhJRF9IREVWX0VWVF9SRVRSWUlORywKLSAgICAgICAgICAgICAgICAgZGV2aWNlLT5jb25uX3RyaWVzLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgaGlkaF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICBhdXRvIGRoYW5kbGUgPSBmaW5kX2Nvbm5fYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChkaGFuZGxlID09IGtISURfSE9TVF9NQVhfREVWSUNFUykgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBlcnJvciBmb3IgdW5rbm93biBkZXZpY2UgY2lkOjB4JTA0eCByZWFzb246JXMiLAotICAgICAgICAgICAgIGwyY2FwX2NpZCwKLSAgICAgICAgICAgICBoY2lfcmVhc29uX2NvZGVfdGV4dCh0b19oY2lfcmVhc29uX2NvZGUocmVzdWx0KSkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaGlkaF9jb25uX2Rpc2Nvbm5lY3QoZGhhbmRsZSk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBMMkNBUF9DRkdfRkFJTEVEX05PX1JFQVNPTikgewotI2lmIChISURfSE9TVF9NQVhfQ09OTl9SRVRSWSA+IDApCi0gICAgaWYgKChoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm5fdHJpZXMgPD0gSElEX0hPU1RfTUFYX0NPTk5fUkVUUlkpICYmCi0gICAgICAgIChyZXN1bHQgPT0gSENJX0VSUl9DT05ORUNUSU9OX1RPVVQgfHwgcmVzdWx0ID09IEhDSV9FUlJfVU5TUEVDSUZJRUQgfHwKLSAgICAgICAgIHJlc3VsdCA9PSBIQ0lfRVJSX1BBR0VfVElNRU9VVCkpIHsKLSAgICAgIGhpZGhfY29ubl9yZXRyeShkaGFuZGxlKTsKLSAgICB9IGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIHVpbnQzMl90IHJlYXNvbiA9IEhJRF9MMkNBUF9DT05OX0ZBSUwgfCAodWludDMyX3QpcmVzdWx0OwotICAgICAgaGhfY2IuY2FsbGJhY2soZGhhbmRsZSwgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCBISURfSERFVl9FVlRfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgICByZWFzb24sIE5VTEwpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB1aW50MzJfdCByZWFzb24gPSBISURfTDJDQVBfQ0ZHX0ZBSUwgfCAodWludDMyX3QpcmVzdWx0OwotICAgIGhoX2NiLmNhbGxiYWNrKGRoYW5kbGUsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgSElEX0hERVZfRVZUX0NMT1NFLAotICAgICAgICAgICAgICAgICAgIHJlYXNvbiwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfbDJjaWZfY29ubmVjdF9jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY29ubmVjdCBjb25maXJtIGV2ZW50cwotICogICAgICAgICAgICAgICAgICBmcm9tIEwyQ0FQLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gd2UgYXJlIGFjdGluZyBhcyBhCi0gKiAgICAgICAgICAgICAgICAgIGNsaWVudCBhbmQgaGF2ZSBzZW50IGEgY29ubmVjdCByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBoaWRoX2wyY2lmX2Nvbm5lY3RfY2ZtKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0KSB7Ci0gIHVpbnQ4X3QgZGhhbmRsZTsKLSAgdEhJRF9DT05OKiBwX2hjb24gPSBOVUxMOwotCi0gIC8qIEZpbmQgQ0NCIGJhc2VkIG9uIENJRCwgYW5kIHZlcmlmeSB3ZSBhcmUgaW4gYSBzdGF0ZSB0byBhY2NlcHQgdGhpcyBtZXNzYWdlCi0gICAqLwotICBkaGFuZGxlID0gZmluZF9jb25uX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAoZGhhbmRsZSA8IGtISURfSE9TVF9NQVhfREVWSUNFUykgewotICAgIHBfaGNvbiA9ICZoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm47Ci0gIH0KLQotICBpZiAoKHBfaGNvbiA9PSBOVUxMKSB8fCAoIShwX2hjb24tPmNvbm5fZmxhZ3MgJiBISURfQ09OTl9GTEFHU19JU19PUklHKSkgfHwKLSAgICAgICgobDJjYXBfY2lkID09IHBfaGNvbi0+Y3RybF9jaWQpICYmCi0gICAgICAgKHBfaGNvbi0+Y29ubl9zdGF0ZSAhPSBISURfQ09OTl9TVEFURV9DT05ORUNUSU5HX0NUUkwpKSB8fAotICAgICAgKChsMmNhcF9jaWQgPT0gcF9oY29uLT5pbnRyX2NpZCkgJiYKLSAgICAgICAocF9oY29uLT5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfSU5UUikgJiYKLSAgICAgICAocF9oY29uLT5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkcpKSkgewotICAgIEhJREhfVFJBQ0VfV0FSTklORygiSElELUhvc3QgUmN2ZCB1bmV4cGVjdGVkIGNvbm4gY25mLCBDSUQgMHgleCAiLAotICAgICAgICAgICAgICAgICAgICAgICBsMmNhcF9jaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gTDJDQVBfQ09OTl9PSykgewotICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgcmVhbCBIQ0kgc3RhdHVzIGlmIHdlIHdhbnQgdG8gcmV0cnkuCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBpbnZva2VkIHdpdGggbm9uIE9LIHN0YXR1cyI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIHJlY2VpdmUgQ29udHJvbCBDaGFubmVsIGNvbm5lY3QgY29uZmlybWF0aW9uICovCi0gIGlmIChsMmNhcF9jaWQgPT0gcF9oY29uLT5jdHJsX2NpZCkgewotICAgIC8qIGNoZWNrIHNlY3VyaXR5IHJlcXVpcmVtZW50ICovCi0gICAgcF9oY29uLT5kaXNjX3JlYXNvbiA9IEhJRF9TVUNDRVNTOyAvKiBBdXRoZW50aWNhdGlvbiBwYXNzZWQuIFJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY19yZWFzb24gKGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURfRVJSX0FVVEhfRkFJTEVEKSAqLwotCi0gICAgLyogVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBhcHByb3ByaWF0ZSBzdGF0ZSwgY29uZmlndXJhdGlvbiAqLwotICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0NPTkZJRzsKLSAgfSBlbHNlIHsKLSAgICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9DT05GSUc7Ci0gIH0KLSAgQlRNX0xvZ0hpc3RvcnkoCi0gICAgICBrQnRtTG9nVGFnLCBoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmFkZHIsICJDb25maWd1cmluZyIsCi0gICAgICBiYXNlOjpTdHJpbmdQcmludGYoImNvbnRyb2w6MHglMDR4IGludGVycnVwdDoweCUwNHggc3RhdGU6JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGNvbi0+Y3RybF9jaWQsIHBfaGNvbi0+aW50cl9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGlkX2Nvbm46OnN0YXRlX3RleHQocF9oY29uLT5jb25uX3N0YXRlKS5jX3N0cigpKSk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfbDJjaWZfY29uZmlnX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIEwyQ0FQIGNvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICBldmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGlkaF9sMmNpZl9jb25maWdfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICB1aW50OF90IGRoYW5kbGU7Ci0gIHRISURfQ09OTiogcF9oY29uID0gTlVMTDsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgZGhhbmRsZSA9IGZpbmRfY29ubl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKGRoYW5kbGUgPCBrSElEX0hPU1RfTUFYX0RFVklDRVMpIHsKLSAgICBwX2hjb24gPSAmaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5jb25uOwotICB9Ci0KLSAgaWYgKHBfaGNvbiA9PSBOVUxMKSB7Ci0gICAgSElESF9UUkFDRV9XQVJOSU5HKCJISUQtSG9zdCBSY3ZkIEwyQ0FQIGNmZyBpbmQsIHVua25vd24gQ0lEOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgbDJjYXBfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBISURIX1RSQUNFX0VWRU5UKCJISUQtSG9zdCBSY3ZkIGNmZyBpbmQsIHNlbnQgY2ZnIGNmbSwgQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLQotICAvKiBSZW1lbWJlciB0aGUgcmVtb3RlIE1UVSBzaXplICovCi0gIGlmICgoIXBfY2ZnLT5tdHVfcHJlc2VudCkgfHwgKHBfY2ZnLT5tdHUgPiBISURfSE9TVF9NVFUpKQotICAgIHBfaGNvbi0+cmVtX210dV9zaXplID0gSElEX0hPU1RfTVRVOwotICBlbHNlCi0gICAgcF9oY29uLT5yZW1fbXR1X3NpemUgPSBwX2NmZy0+bXR1OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgaGlkaF9sMmNpZl9jb25maWdfY2ZtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgTDJDQVAgY29uZmlndXJhdGlvbiBjb25maXJtYXRpb24KLSAqICAgICAgICAgICAgICAgICAgZXZlbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfY29uZmlnX2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IGluaXRpYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIGhpZGhfbDJjaWZfY29uZmlnX2luZChsMmNhcF9jaWQsIHBfY2ZnKTsKLQotICB1aW50OF90IGRoYW5kbGU7Ci0gIHRISURfQ09OTiogcF9oY29uID0gTlVMTDsKLSAgdWludDMyX3QgcmVhc29uOwotCi0gIEhJREhfVFJBQ0VfRVZFTlQoIkhJRC1Ib3N0IFJjdmQgY2ZnIGNmbSwgQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgZGhhbmRsZSA9IGZpbmRfY29ubl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKGRoYW5kbGUgPCBrSElEX0hPU1RfTUFYX0RFVklDRVMpIHBfaGNvbiA9ICZoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm47Ci0KLSAgaWYgKHBfaGNvbiA9PSBOVUxMKSB7Ci0gICAgSElESF9UUkFDRV9XQVJOSU5HKCJISUQtSG9zdCBSY3ZkIEwyQ0FQIGNmZyBpbmQsIHVua25vd24gQ0lEOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgbDJjYXBfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobDJjYXBfY2lkID09IHBfaGNvbi0+Y3RybF9jaWQpIHsKLSAgICBpZiAocF9oY29uLT5jb25uX2ZsYWdzICYgSElEX0NPTk5fRkxBR1NfSVNfT1JJRykgewotICAgICAgLyogQ29ubmVjdCBpbnRlcnJ1cHQgY2hhbm5lbCAqLwotICAgICAgcF9oY29uLT5kaXNjX3JlYXNvbiA9IEhJRF9MMkNBUF9DT05OX0ZBSUw7IC8qIFJlc2V0IGluaXRpYWwgcmVhc29uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT1NFX0VWVDogQ29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGVtcHQgd2FzIG1hZGUgYnV0IGZhaWxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBwX2hjb24tPmludHJfY2lkID0KLSAgICAgICAgICBMMkNBX0Nvbm5lY3RSZXEyKEhJRF9QU01fSU5URVJSVVBULCBoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCk7Ci0gICAgICBpZiAocF9oY29uLT5pbnRyX2NpZCA9PSAwKSB7Ci0gICAgICAgIEhJREhfVFJBQ0VfV0FSTklORygiSElELUhvc3QgSU5UUiBPcmlnaW5hdGUgZmFpbGVkIik7Ci0gICAgICAgIHJlYXNvbiA9IEhJRF9MMkNBUF9SRVFfRkFJTDsKLSAgICAgICAgcF9oY29uLT5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfVU5VU0VEOwotICAgICAgICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmFkZHIsICJGYWlsZWQiKTsKLSAgICAgICAgaGlkaF9jb25uX2Rpc2Nvbm5lY3QoZGhhbmRsZSk7Ci0gICAgICAgIGhoX2NiLmNhbGxiYWNrKGRoYW5kbGUsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgSElEX0hERVZfRVZUX0NMT1NFLAotICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sIE5VTEwpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN0YXRlLCB3YWl0aW5nIGZvciBjb25uZWN0aW9uCi0gICAgICAgICAqIGNvbmZpcm0gb24gaW50ZXJydXB0IGNoYW5uZWwuICovCi0gICAgICAgIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0NPTk5FQ1RJTkdfSU5UUjsKLSAgICAgICAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCAiQ29ubmVjdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnJ1cHQgY2hhbm5lbCIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIElmIGFsbCBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlLCBjaGFuZ2Ugc3RhdGUgYW5kIHRlbGwgbWFuYWdlbWVudCB3ZSBhcmUKLSAgICogdXAgKi8KLSAgaWYgKHBfaGNvbi0+Y29ubl9zdGF0ZSA9PSBISURfQ09OTl9TVEFURV9DT05GSUcpIHsKLSAgICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9DT05ORUNURUQ7Ci0gICAgLyogUmVzZXQgZGlzY29ubmVjdCByZWFzb24gdG8gc3VjY2VzcywgYXMgY29ubmVjdGlvbiBzdWNjZXNzZnVsICovCi0gICAgcF9oY29uLT5kaXNjX3JlYXNvbiA9IEhJRF9TVUNDRVNTOwotCi0gICAgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5zdGF0ZSA9IEhJRF9ERVZfQ09OTkVDVEVEOwotICAgIGhoX2NiLmNhbGxiYWNrKGRoYW5kbGUsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgSElEX0hERVZfRVZUX09QRU4sIDAsCi0gICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgQlRNX0xvZ0hpc3RvcnkoCi0gICAgICAgIGtCdG1Mb2dUYWcsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgIkNvbm5lY3RlZCIsCi0gICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiY29udHJvbDoweCUwNHggaW50ZXJydXB0OjB4JTA0eCBzdGF0ZTolcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hjb24tPmN0cmxfY2lkLCBwX2hjb24tPmludHJfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkX2Nvbm46OnN0YXRlX3RleHQocF9oY29uLT5jb25uX3N0YXRlKS5jX3N0cigpKSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfbDJjaWZfZGlzY29ubmVjdF9pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2Nvbm5lY3QgZXZlbnQgZnJvbSBMMkNBUC4gSWYKLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIHRvLCB3ZSBhY2sgdGhlIGRpc2Nvbm5lY3QgYmVmb3JlIGRyb3BwaW5nIHRoZSBDQ0IKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGlkaF9sMmNpZl9kaXNjb25uZWN0X2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICB1aW50OF90IGRoYW5kbGU7Ci0gIHRISURfQ09OTiogcF9oY29uID0gTlVMTDsKLSAgdEhDSV9SRUFTT04gZGlzY19yZXMgPSBIQ0lfU1VDQ0VTUzsKLSAgdWludDE2X3QgaGlkX2Nsb3NlX2V2dF9yZWFzb247Ci0KLSAgLyogRmluZCBDQ0IgYmFzZWQgb24gQ0lEICovCi0gIGRoYW5kbGUgPSBmaW5kX2Nvbm5fYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChkaGFuZGxlIDwga0hJRF9IT1NUX01BWF9ERVZJQ0VTKSBwX2hjb24gPSAmaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5jb25uOwotCi0gIGlmIChwX2hjb24gPT0gTlVMTCkgewotICAgIEhJREhfVFJBQ0VfV0FSTklORygiSElELUhvc3QgUmN2ZCBMMkNBUCBkaXNjLCB1bmtub3duIENJRDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgSElESF9UUkFDRV9FVkVOVCgiSElELUhvc3QgUmN2ZCBMMkNBUCBkaXNjLCBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotCi0gIHBfaGNvbi0+Y29ubl9zdGF0ZSA9IEhJRF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0gIEJUTV9Mb2dIaXN0b3J5KAotICAgICAga0J0bUxvZ1RhZywgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCAiRGlzY29ubmVjdGluZyIsCi0gICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVzIGNoYW5uZWwiLCAobDJjYXBfY2lkID09IHBfaGNvbi0+Y3RybF9jaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJpbnRlcnJ1cHQiKSk7Ci0KLSAgaWYgKGwyY2FwX2NpZCA9PSBwX2hjb24tPmN0cmxfY2lkKQotICAgIHBfaGNvbi0+Y3RybF9jaWQgPSAwOwotICBlbHNlCi0gICAgcF9oY29uLT5pbnRyX2NpZCA9IDA7Ci0KLSAgaWYgKChwX2hjb24tPmN0cmxfY2lkID09IDApICYmIChwX2hjb24tPmludHJfY2lkID09IDApKSB7Ci0gICAgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5zdGF0ZSA9IEhJRF9ERVZfTk9fQ09OTjsKLSAgICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9VTlVTRUQ7Ci0KLSAgICBpZiAoIWFja19uZWVkZWQpIGRpc2NfcmVzID0gYnRtX2dldF9hY2xfZGlzY19yZWFzb25fY29kZSgpOwotCi0jaWYgKEhJRF9IT1NUX01BWF9DT05OX1JFVFJZID4gMCkKLSAgICBpZiAoKGRpc2NfcmVzID09IEhDSV9FUlJfQ09OTkVDVElPTl9UT1VUIHx8Ci0gICAgICAgICBkaXNjX3JlcyA9PSBIQ0lfRVJSX1VOU1BFQ0lGSUVEKSAmJgotICAgICAgICAoIShoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmF0dHJfbWFzayAmIEhJRF9SRUNPTk5fSU5JVCkpICYmCi0gICAgICAgIChoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmF0dHJfbWFzayAmIEhJRF9OT1JNQUxMWV9DT05ORUNUQUJMRSkpIHsKLSAgICAgIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uY29ubl90cmllcyA9IDA7Ci0gICAgICB1aW50NjRfdCBpbnRlcnZhbF9tcyA9IEhJRF9IT1NUX1JFUEFHRV9XSU4gKiAxMDAwOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKGhoX2NiLmRldmljZXNbZGhhbmRsZV0uY29ubi5wcm9jZXNzX3JlcGFnZV90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbF9tcywgaGlkaF9wcm9jZXNzX3JlcGFnZV90aW1lcl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRfVE9fUFRSKGRoYW5kbGUpKTsKLSAgICAgIGhoX2NiLmNhbGxiYWNrKGRoYW5kbGUsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgSElEX0hERVZfRVZUX0NMT1NFLAotICAgICAgICAgICAgICAgICAgICAgZGlzY19yZXMsIE5VTEwpOwotICAgIH0gZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgLyogU2V0IHJlYXNvbiBjb2RlIGZvciBISURfSERFVl9FVlRfQ0xPU0UgKi8KLSAgICAgIGhpZF9jbG9zZV9ldnRfcmVhc29uID0gcF9oY29uLT5kaXNjX3JlYXNvbjsKLQotICAgICAgLyogSWYgd2UgZ290IGJhc2ViYW5kIHNlbnQgSENJX0RJU0NPTk5FQ1RfQ09NUExFVEVfRVZUIGR1ZSB0byBzZWN1cml0eQotICAgICAgICogZmFpbHVyZSwgdGhlbiBzZXQgcmVhc29uIHRvIEhJRF9FUlJfQVVUSF9GQUlMRUQgKi8KLSAgICAgIGlmICgoZGlzY19yZXMgPT0gSENJX0VSUl9BVVRIX0ZBSUxVUkUpIHx8Ci0gICAgICAgICAgKGRpc2NfcmVzID09IEhDSV9FUlJfS0VZX01JU1NJTkcpIHx8Ci0gICAgICAgICAgKGRpc2NfcmVzID09IEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFkpIHx8Ci0gICAgICAgICAgKGRpc2NfcmVzID09IEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRCkgfHwKLSAgICAgICAgICAoZGlzY19yZXMgPT0gSENJX0VSUl9VTklUX0tFWV9VU0VEKSB8fAotICAgICAgICAgIChkaXNjX3JlcyA9PSBIQ0lfRVJSX1BBSVJJTkdfV0lUSF9VTklUX0tFWV9OT1RfU1VQUE9SVEVEKSB8fAotICAgICAgICAgIChkaXNjX3JlcyA9PSBIQ0lfRVJSX0VOQ1JZX01PREVfTk9UX0FDQ0VQVEFCTEUpIHx8Ci0gICAgICAgICAgKGRpc2NfcmVzID09IEhDSV9FUlJfUkVQRUFURURfQVRURU1QVFMpKSB7Ci0gICAgICAgIGhpZF9jbG9zZV9ldnRfcmVhc29uID0gSElEX0VSUl9BVVRIX0ZBSUxFRDsKLSAgICAgIH0KLQotICAgICAgaGhfY2IuY2FsbGJhY2soZGhhbmRsZSwgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCBISURfSERFVl9FVlRfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgICBoaWRfY2xvc2VfZXZ0X3JlYXNvbiwgTlVMTCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfZGlzY29ubmVjdCh1aW50MTZfdCBsMmNhcF9jaWQpIHsKLSAgTDJDQV9EaXNjb25uZWN0UmVxKGwyY2FwX2NpZCk7Ci0KLSAgLyogRmluZCBDQ0IgYmFzZWQgb24gQ0lEICovCi0gIGNvbnN0IHVpbnQ4X3QgZGhhbmRsZSA9IGZpbmRfY29ubl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKGRoYW5kbGUgPT0ga0hJRF9IT1NUX01BWF9ERVZJQ0VTKSB7Ci0gICAgTE9HX1dBUk4oIkhJRC1Ib3N0IFJjdmQgTDJDQVAgZGlzYyBjZm0sIHVua25vd24gQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0SElEX0NPTk4qIHBfaGNvbiA9ICZoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm47Ci0gIGlmIChsMmNhcF9jaWQgPT0gcF9oY29uLT5jdHJsX2NpZCkgewotICAgIHBfaGNvbi0+Y3RybF9jaWQgPSAwOwotICB9IGVsc2UgewotICAgIHBfaGNvbi0+aW50cl9jaWQgPSAwOwotICAgIGlmIChwX2hjb24tPmN0cmxfY2lkKSB7Ci0gICAgICBISURIX1RSQUNFX0VWRU5UKCJISUQtSG9zdCBJbml0aWF0aW5nIEwyQ0FQIEN0cmwgZGlzY29ubmVjdGlvbiIpOwotICAgICAgTDJDQV9EaXNjb25uZWN0UmVxKHBfaGNvbi0+Y3RybF9jaWQpOwotICAgICAgcF9oY29uLT5jdHJsX2NpZCA9IDA7Ci0gICAgfQotICB9Ci0KLSAgaWYgKChwX2hjb24tPmN0cmxfY2lkID09IDApICYmIChwX2hjb24tPmludHJfY2lkID09IDApKSB7Ci0gICAgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5zdGF0ZSA9IEhJRF9ERVZfTk9fQ09OTjsKLSAgICBwX2hjb24tPmNvbm5fc3RhdGUgPSBISURfQ09OTl9TVEFURV9VTlVTRUQ7Ci0gICAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCAiRGlzY29ubmVjdGVkIik7Ci0gICAgaGhfY2IuY2FsbGJhY2soZGhhbmRsZSwgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCBISURfSERFVl9FVlRfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgcF9oY29uLT5kaXNjX3JlYXNvbiwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfbDJjaWZfY29uZ19pbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGNvbmdlc3Rpb24gc3RhdHVzIGV2ZW50IGZyb20gTDJDQVAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfY29uZ19pbmQodWludDE2X3QgbDJjYXBfY2lkLCBib29sIGNvbmdlc3RlZCkgewotICB1aW50OF90IGRoYW5kbGU7Ci0gIHRISURfQ09OTiogcF9oY29uID0gTlVMTDsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgZGhhbmRsZSA9IGZpbmRfY29ubl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKGRoYW5kbGUgPCBrSElEX0hPU1RfTUFYX0RFVklDRVMpIHBfaGNvbiA9ICZoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm47Ci0KLSAgaWYgKHBfaGNvbiA9PSBOVUxMKSB7Ci0gICAgSElESF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiSElELUhvc3QgUmN2ZCBMMkNBUCBjb25nZXN0aW9uIHN0YXR1cywgdW5rbm93biBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEhJREhfVFJBQ0VfRVZFTlQoIkhJRC1Ib3N0IFJjdmQgTDJDQVAgY29uZ2VzdGlvbiBzdGF0dXMsIENJRDogMHgleCAgQ29uZzogJWQiLAotICAgICAgICAgICAgICAgICAgIGwyY2FwX2NpZCwgY29uZ2VzdGVkKTsKLQotICBpZiAoY29uZ2VzdGVkKQotICAgIHBfaGNvbi0+Y29ubl9mbGFncyB8PSBISURfQ09OTl9GTEFHU19DT05HRVNURUQ7Ci0gIGVsc2UgewotICAgIHBfaGNvbi0+Y29ubl9mbGFncyAmPSB+SElEX0NPTk5fRkxBR1NfQ09OR0VTVEVEOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRoX2wyY2lmX2RhdGFfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSBMMkNBUC4KLSAqICAgICAgICAgICAgICAgICAgaWYgd2UgYXJlIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgdGhlIFNEUAotICogICAgICAgICAgICAgICAgICBjbGllbnQsIGFuZCB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBpcyBxdWV1ZWQgdXAgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBjbGllbnQuCi0gKgotICogICAgICAgICAgICAgICAgICBJZiB3ZSBhcmUgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb25uZWN0aW9uLCB3ZSBhcmUgdGhlIFNEUAotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIsIHNvIHRoZSBtZXNzYWdlIGlzIHBhc3NlZCB0byB0aGUgc2VydmVyIHByb2Nlc3NpbmcKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGhpZGhfbDJjaWZfZGF0YV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCBCVF9IRFIqIHBfbXNnKSB7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gIHVpbnQ4X3QgdHR5cGUsIHBhcmFtLCByZXBfdHlwZSwgZXZ0OwotICB1aW50OF90IGRoYW5kbGU7Ci0gIHRISURfQ09OTiogcF9oY29uID0gTlVMTDsKLQotICBISURIX1RSQUNFX0RFQlVHKCJISUQtSG9zdCBoaWRoX2wyY2lmX2RhdGFfaW5kIFtsMmNhcF9jaWQ9MHglMDR4XSIsCi0gICAgICAgICAgICAgICAgICAgbDJjYXBfY2lkKTsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgZGhhbmRsZSA9IGZpbmRfY29ubl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKGRoYW5kbGUgPCBrSElEX0hPU1RfTUFYX0RFVklDRVMpIHBfaGNvbiA9ICZoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm47Ci0KLSAgaWYgKHBfaGNvbiA9PSBOVUxMKSB7Ci0gICAgSElESF9UUkFDRV9XQVJOSU5HKCJISUQtSG9zdCBSY3ZkIEwyQ0FQIGRhdGEsIHVua25vd24gQ0lEOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgbDJjYXBfY2lkKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfbXNnLT5sZW4gPCAxKSB7Ci0gICAgSElESF9UUkFDRV9XQVJOSU5HKCJSY3ZkIEwyQ0FQIGRhdGEsIGludmFsaWQgbGVuZ3RoICVkLCBzaG91bGQgYmUgPj0gMSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5sZW4pOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjgwNDkzMjcyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdHR5cGUgPSBISURfR0VUX1RSQU5TX0ZST01fSERSKCpwX2RhdGEpOwotICBwYXJhbSA9IEhJRF9HRVRfUEFSQU1fRlJPTV9IRFIoKnBfZGF0YSk7Ci0gIHJlcF90eXBlID0gcGFyYW0gJiBISURfUEFSX1JFUF9UWVBFX01BU0s7Ci0gIHBfZGF0YSsrOwotCi0gIC8qIEdldCByaWQgb2YgdGhlIGRhdGEgdHlwZSAqLwotICBwX21zZy0+bGVuLS07Ci0gIHBfbXNnLT5vZmZzZXQrKzsKLQotICBzd2l0Y2ggKHR0eXBlKSB7Ci0gICAgY2FzZSBISURfVFJBTlNfSEFORFNIQUtFOgotICAgICAgaGhfY2IuY2FsbGJhY2soZGhhbmRsZSwgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgSElEX0hERVZfRVZUX0hBTkRTSEFLRSwgcGFyYW0sIE5VTEwpOwotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19DT05UUk9MOgotICAgICAgc3dpdGNoIChwYXJhbSkgewotICAgICAgICBjYXNlIEhJRF9QQVJfQ09OVFJPTF9WSVJUVUFMX0NBQkxFX1VOUExVRzoKLSAgICAgICAgICBoaWRoX2Nvbm5fZGlzY29ubmVjdChkaGFuZGxlKTsKLSAgICAgICAgICAvKiBEZXZpY2UgaXMgdW5wbHVnZ2luZyBmcm9tIHVzLiBUZWxsIFVTQiAqLwotICAgICAgICAgIGhoX2NiLmNhbGxiYWNrKGRoYW5kbGUsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBISURfSERFVl9FVlRfVkNfVU5QTFVHLCAwLCBOVUxMKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19EQVRBOgotICAgICAgZXZ0ID0gKGhoX2NiLmRldmljZXNbZGhhbmRsZV0uY29ubi5pbnRyX2NpZCA9PSBsMmNhcF9jaWQpCi0gICAgICAgICAgICAgICAgPyBISURfSERFVl9FVlRfSU5UUl9EQVRBCi0gICAgICAgICAgICAgICAgOiBISURfSERFVl9FVlRfQ1RSTF9EQVRBOwotICAgICAgaGhfY2IuY2FsbGJhY2soZGhhbmRsZSwgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCBldnQsIHJlcF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgcF9tc2cpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhJRF9UUkFOU19EQVRBQzoKLSAgICAgIGV2dCA9IChoaF9jYi5kZXZpY2VzW2RoYW5kbGVdLmNvbm4uaW50cl9jaWQgPT0gbDJjYXBfY2lkKQotICAgICAgICAgICAgICAgID8gSElEX0hERVZfRVZUX0lOVFJfREFUQwotICAgICAgICAgICAgICAgIDogSElEX0hERVZfRVZUX0NUUkxfREFUQzsKLSAgICAgIGhoX2NiLmNhbGxiYWNrKGRoYW5kbGUsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgZXZ0LCByZXBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHBfbXNnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRoX2Nvbm5fc25kX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgc2VuZHMgb3V0IGRhdGEuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10SElEX1NUQVRVUyBoaWRoX2Nvbm5fc25kX2RhdGEodWludDhfdCBkaGFuZGxlLCB1aW50OF90IHRyYW5zX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXJhbSwgdWludDE2X3QgZGF0YSwgdWludDhfdCByZXBvcnRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBidWYpIHsKLSAgdEhJRF9DT05OKiBwX2hjb24gPSAmaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5jb25uOwotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwX291dDsKLSAgdWludDE2X3QgYnl0ZXNfY29waWVkOwotICBib29sIHNlZ19yZXEgPSBmYWxzZTsKLSAgdWludDE2X3QgZGF0YV9zaXplOwotICB1aW50MTZfdCBjaWQ7Ci0gIHVpbnQxNl90IGJ1Zl9zaXplOwotICB1aW50OF90IHVzZV9kYXRhID0gMDsKLSAgYm9vbCBibGFua19kYXRjID0gZmFsc2U7Ci0KLSAgaWYgKCFCVE1fSXNBY2xDb25uZWN0aW9uVXAoaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9UUkFOU1BPUlRfQlJfRURSKSkgewotICAgIG9zaV9mcmVlKGJ1Zik7Ci0gICAgcmV0dXJuIEhJRF9FUlJfTk9fQ09OTkVDVElPTjsKLSAgfQotCi0gIGlmIChwX2hjb24tPmNvbm5fZmxhZ3MgJiBISURfQ09OTl9GTEFHU19DT05HRVNURUQpIHsKLSAgICBvc2lfZnJlZShidWYpOwotICAgIHJldHVybiBISURfRVJSX0NPTkdFU1RFRDsKLSAgfQotCi0gIHN3aXRjaCAodHJhbnNfdHlwZSkgewotICAgIGNhc2UgSElEX1RSQU5TX0NPTlRST0w6Ci0gICAgY2FzZSBISURfVFJBTlNfR0VUX1JFUE9SVDoKLSAgICBjYXNlIEhJRF9UUkFOU19TRVRfUkVQT1JUOgotICAgIGNhc2UgSElEX1RSQU5TX0dFVF9QUk9UT0NPTDoKLSAgICBjYXNlIEhJRF9UUkFOU19TRVRfUFJPVE9DT0w6Ci0gICAgY2FzZSBISURfVFJBTlNfR0VUX0lETEU6Ci0gICAgY2FzZSBISURfVFJBTlNfU0VUX0lETEU6Ci0gICAgICBjaWQgPSBwX2hjb24tPmN0cmxfY2lkOwotICAgICAgYnVmX3NpemUgPSBISURfQ09OVFJPTF9CVUZfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSElEX1RSQU5TX0RBVEE6Ci0gICAgICBjaWQgPSBwX2hjb24tPmludHJfY2lkOwotICAgICAgYnVmX3NpemUgPSBISURfSU5URVJSVVBUX0JVRl9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoSElEX0VSUl9JTlZBTElEX1BBUkFNKTsKLSAgfQotCi0gIGlmICh0cmFuc190eXBlID09IEhJRF9UUkFOU19TRVRfSURMRSkKLSAgICB1c2VfZGF0YSA9IDE7Ci0gIGVsc2UgaWYgKCh0cmFuc190eXBlID09IEhJRF9UUkFOU19HRVRfUkVQT1JUKSAmJiAocGFyYW0gJiAweDA4KSkKLSAgICB1c2VfZGF0YSA9IDI7Ci0KLSAgZG8gewotICAgIGlmIChidWYgPT0gTlVMTCB8fCBibGFua19kYXRjKSB7Ci0gICAgICBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoYnVmX3NpemUpOwotCi0gICAgICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgICAgIHNlZ19yZXEgPSBmYWxzZTsKLSAgICAgIGRhdGFfc2l6ZSA9IDA7Ci0gICAgICBieXRlc19jb3BpZWQgPSAwOwotICAgICAgYmxhbmtfZGF0YyA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoKGJ1Zi0+bGVuID4gKHBfaGNvbi0+cmVtX210dV9zaXplIC0gMSkpKSB7Ci0gICAgICBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoYnVmX3NpemUpOwotCi0gICAgICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgICAgIHNlZ19yZXEgPSB0cnVlOwotICAgICAgZGF0YV9zaXplID0gYnVmLT5sZW47Ci0gICAgICBieXRlc19jb3BpZWQgPSBwX2hjb24tPnJlbV9tdHVfc2l6ZSAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfYnVmID0gYnVmOwotICAgICAgcF9idWYtPm9mZnNldCAtPSAxOwotICAgICAgc2VnX3JlcSA9IGZhbHNlOwotICAgICAgZGF0YV9zaXplID0gYnVmLT5sZW47Ci0gICAgICBieXRlc19jb3BpZWQgPSBidWYtPmxlbjsKLSAgICB9Ci0KLSAgICBwX291dCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0gICAgKnBfb3V0KysgPSBISURfQlVJTERfSERSKHRyYW5zX3R5cGUsIHBhcmFtKTsKLQotICAgIC8qIElmIHJlcG9ydCBJRCByZXF1aXJlZCBmb3IgdGhpcyBkZXZpY2UgKi8KLSAgICBpZiAoKHRyYW5zX3R5cGUgPT0gSElEX1RSQU5TX0dFVF9SRVBPUlQpICYmIChyZXBvcnRfaWQgIT0gMCkpIHsKLSAgICAgICpwX291dCA9IHJlcG9ydF9pZDsKLSAgICAgIGRhdGFfc2l6ZSA9IGJ5dGVzX2NvcGllZCA9IDE7Ci0gICAgfQotCi0gICAgaWYgKHNlZ19yZXEpIHsKLSAgICAgIG1lbWNweShwX291dCwgKCgodWludDhfdCopKGJ1ZiArIDEpKSArIGJ1Zi0+b2Zmc2V0KSwgYnl0ZXNfY29waWVkKTsKLSAgICAgIGJ1Zi0+b2Zmc2V0ICs9IGJ5dGVzX2NvcGllZDsKLSAgICAgIGJ1Zi0+bGVuIC09IGJ5dGVzX2NvcGllZDsKLSAgICB9IGVsc2UgaWYgKHVzZV9kYXRhID09IDEpIHsKLSAgICAgICoocF9vdXQgKyBieXRlc19jb3BpZWQpID0gZGF0YSAmIDB4ZmY7Ci0gICAgfSBlbHNlIGlmICh1c2VfZGF0YSA9PSAyKSB7Ci0gICAgICAqKHBfb3V0ICsgYnl0ZXNfY29waWVkKSA9IGRhdGEgJiAweGZmOwotICAgICAgKihwX291dCArIGJ5dGVzX2NvcGllZCArIDEpID0gKGRhdGEgPj4gOCkgJiAweGZmOwotICAgIH0KLQotICAgIHBfYnVmLT5sZW4gPSBieXRlc19jb3BpZWQgKyAxICsgdXNlX2RhdGE7Ci0gICAgZGF0YV9zaXplIC09IGJ5dGVzX2NvcGllZDsKLQotICAgIC8qIFNlbmQgdGhlIGJ1ZmZlciB0aHJvdWdoIEwyQ0FQICovCi0gICAgaWYgKChwX2hjb24tPmNvbm5fZmxhZ3MgJiBISURfQ09OTl9GTEFHU19DT05HRVNURUQpIHx8Ci0gICAgICAgICghTDJDQV9EYXRhV3JpdGUoY2lkLCBwX2J1ZikpKQotICAgICAgcmV0dXJuIChISURfRVJSX0NPTkdFU1RFRCk7Ci0KLSAgICBpZiAoZGF0YV9zaXplKQotICAgICAgdHJhbnNfdHlwZSA9IEhJRF9UUkFOU19EQVRBQzsKLSAgICBlbHNlIGlmIChieXRlc19jb3BpZWQgPT0gKHBfaGNvbi0+cmVtX210dV9zaXplIC0gMSkpIHsKLSAgICAgIHRyYW5zX3R5cGUgPSBISURfVFJBTlNfREFUQUM7Ci0gICAgICBibGFua19kYXRjID0gdHJ1ZTsKLSAgICB9Ci0KLSAgfSB3aGlsZSAoKGRhdGFfc2l6ZSAhPSAwKSB8fCBibGFua19kYXRjKTsKLQotICByZXR1cm4gKEhJRF9TVUNDRVNTKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBoaWRoX2Nvbm5faW5pdGlhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBtYW5hZ2VtZW50IHRvIGNyZWF0ZSBhCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRISURfU1RBVFVTIGhpZGhfY29ubl9pbml0aWF0ZSh1aW50OF90IGRoYW5kbGUpIHsKLSAgdEhJRF9IT1NUX0RFVl9DVEIqIHBfZGV2ID0gJmhoX2NiLmRldmljZXNbZGhhbmRsZV07Ci0KLSAgaWYgKHBfZGV2LT5jb25uLmNvbm5fc3RhdGUgIT0gSElEX0NPTk5fU1RBVEVfVU5VU0VEKQotICAgIHJldHVybiAoSElEX0VSUl9DT05OX0lOX1BST0NFU1MpOwotCi0gIHBfZGV2LT5jb25uLmN0cmxfY2lkID0gMDsKLSAgcF9kZXYtPmNvbm4uaW50cl9jaWQgPSAwOwotICBwX2Rldi0+Y29ubi5kaXNjX3JlYXNvbiA9Ci0gICAgICBISURfTDJDQVBfQ09OTl9GQUlMOyAvKiBSZXNldCBpbml0aWFsIHJlYXNvbiBmb3IgQ0xPU0VfRVZUOiBDb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRlbXB0IHdhcyBtYWRlIGJ1dCBmYWlsZWQgKi8KLQotICAvKiBXZSBhcmUgdGhlIG9yaWdpbmF0b3Igb2YgdGhpcyBjb25uZWN0aW9uICovCi0gIHBfZGV2LT5jb25uLmNvbm5fZmxhZ3MgPSBISURfQ09OTl9GTEFHU19JU19PUklHOwotCi0gIC8qIENoZWNrIGlmIEwyQ0FQIHN0YXJ0ZWQgdGhlIGNvbm5lY3Rpb24gcHJvY2VzcyAqLwotICBwX2Rldi0+Y29ubi5jdHJsX2NpZCA9IEwyQ0FfQ29ubmVjdFJlcTIoCi0gICAgICBISURfUFNNX0NPTlRST0wsIHBfZGV2LT5hZGRyLCBCVEFfU0VDX0FVVEhFTlRJQ0FURSB8IEJUQV9TRUNfRU5DUllQVCk7Ci0gIGlmIChwX2Rldi0+Y29ubi5jdHJsX2NpZCA9PSAwKSB7Ci0gICAgSElESF9UUkFDRV9XQVJOSU5HKCJISUQtSG9zdCBPcmlnaW5hdGUgZmFpbGVkIik7Ci0gICAgaGhfY2IuY2FsbGJhY2soZGhhbmRsZSwgaGhfY2IuZGV2aWNlc1tkaGFuZGxlXS5hZGRyLCBISURfSERFVl9FVlRfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgSElEX0VSUl9MMkNBUF9GQUlMRUQsIE5VTEwpOwotICB9IGVsc2UgewotICAgIC8qIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgYXBwcm9wcmlhdGUgc3RhdGUsIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gY29uZmlybQotICAgICAqIG9uIGNvbnRyb2wgY2hhbm5lbC4gKi8KLSAgICBwX2Rldi0+Y29ubi5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfQ09OTkVDVElOR19DVFJMOwotICAgIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIGhoX2NiLmRldmljZXNbZGhhbmRsZV0uYWRkciwgIkNvbm5lY3RpbmciLAotICAgICAgICAgICAgICAgICAgICJjb250cm9sIGNoYW5uZWwiKTsKLSAgfQotCi0gIHJldHVybiAoSElEX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZmluZF9jb25uX2J5X2NpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhIGNvbm5lY3Rpb24gY29udHJvbCBibG9jayBiYXNlZCBvbiBDSUQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBpbmRleCBvZiBjb250cm9sIGJsb2NrLCBvciBrSElEX0hPU1RfTUFYX0RFVklDRVMgaWYgbm90Ci0gKiAgICAgICAgICAgICAgICAgIGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBmaW5kX2Nvbm5fYnlfY2lkKHVpbnQxNl90IGNpZCkgewotICB1aW50OF90IHh4OwotCi0gIGZvciAoeHggPSAwOyB4eCA8IGtISURfSE9TVF9NQVhfREVWSUNFUzsgeHgrKykgewotICAgIGlmICgoaGhfY2IuZGV2aWNlc1t4eF0uaW5fdXNlKSAmJgotICAgICAgICAoaGhfY2IuZGV2aWNlc1t4eF0uY29ubi5jb25uX3N0YXRlICE9IEhJRF9DT05OX1NUQVRFX1VOVVNFRCkgJiYKLSAgICAgICAgKChoaF9jYi5kZXZpY2VzW3h4XS5jb25uLmN0cmxfY2lkID09IGNpZCkgfHwKLSAgICAgICAgIChoaF9jYi5kZXZpY2VzW3h4XS5jb25uLmludHJfY2lkID09IGNpZCkpKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gKHh4KTsKLX0KLQotdm9pZCBoaWRoX2Nvbm5fZGVyZWcodm9pZCkgewotICBMMkNBX0RlcmVnaXN0ZXIoSElEX1BTTV9DT05UUk9MKTsKLSAgTDJDQV9EZXJlZ2lzdGVyKEhJRF9QU01fSU5URVJSVVBUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGhpZGhfY29ubl9yZXRyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmV0cnkgYSBmYWlsZWQgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaGlkaF9jb25uX3JldHJ5KHVpbnQ4X3QgZGhhbmRsZSkgewotICB0SElEX0hPU1RfREVWX0NUQiogcF9kZXYgPSAmaGhfY2IuZGV2aWNlc1tkaGFuZGxlXTsKLQotICBwX2Rldi0+Y29ubi5jb25uX3N0YXRlID0gSElEX0NPTk5fU1RBVEVfVU5VU0VEOwotI2lmIChISURfSE9TVF9SRVBBR0VfV0lOID4gMCkKLSAgdWludDY0X3QgaW50ZXJ2YWxfbXMgPSBISURfSE9TVF9SRVBBR0VfV0lOICogMTAwMDsKLSAgYWxhcm1fc2V0X29uX21sb29wKHBfZGV2LT5jb25uLnByb2Nlc3NfcmVwYWdlX3RpbWVyLCBpbnRlcnZhbF9tcywKLSAgICAgICAgICAgICAgICAgICAgIGhpZGhfcHJvY2Vzc19yZXBhZ2VfdGltZXJfdGltZW91dCwgVUlOVF9UT19QVFIoZGhhbmRsZSkpOwotI2Vsc2UKLSAgaGlkaF90cnlfcmVwYWdlKGRoYW5kbGUpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zdGFjay9oaWQvaGlkaF9pbnQuaCBiL3N0YWNrL2hpZC9oaWRoX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY5ZDdkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2hpZC9oaWRoX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgSElEIEhPU1QgaW50ZXJuYWwgZGVmaW5pdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEhJREhfSU5UX0gKLSNkZWZpbmUgSElESF9JTlRfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2hpZC9oaWRfY29ubi5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oaWRoX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIiAgLy8gdEwyQ0FQX0NGR19JTkZPCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZW51bSB7IEhJRF9ERVZfTk9fQ09OTiwgSElEX0RFVl9DT05ORUNURUQgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgcGVyX2RldmljZV9jdGIgewotICBib29sIGluX3VzZTsKLSAgUmF3QWRkcmVzcyBhZGRyOyAgICAvKiBCRC1BZGRyIG9mIHRoZSBob3N0IGRldmljZSAqLwotICB1aW50MTZfdCBhdHRyX21hc2s7IC8qIDB4MDEtIHZpcnR1YWxfY2FibGU7IDB4MDItIG5vcm1hbGx5X2Nvbm5lY3RhYmxlOyAweDAzLQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29ubl9pbml0aWF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQtIHNkcF9kaXNhYmxlOyAqLwotICB1aW50OF90IHN0YXRlOyAgICAgIC8qIERldmljZSBzdGF0ZSBpZiBpbiBIT1NULUtOT1dOIG1vZGUgKi8KLSAgdWludDhfdCBjb25uX3RyaWVzOyAvKiBSZW1lbWJlcnMgdGhlIG51bWJlciBvZiBjb25uZWN0aW9uIGF0dGVtcHRzIHdoaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVElORyAqLwotCi0gIHRISURfQ09OTiBjb25uOyAvKiBMMkNBUCBjaGFubmVsIGluZm8gKi8KLX0gdEhJRF9IT1NUX0RFVl9DVEI7Ci0KLXR5cGVkZWYgc3RydWN0IGhvc3RfY3RiIHsKLSAgdEhJRF9IT1NUX0RFVl9DVEIgZGV2aWNlc1tISURfSE9TVF9NQVhfREVWSUNFU107Ci0gIHRISURfSE9TVF9ERVZfQ0FMTEJBQ0sqIGNhbGxiYWNrOyAvKiBBcHBsaWNhdGlvbiBjYWxsYmFja3MgKi8KLSAgdEwyQ0FQX0NGR19JTkZPIGwyY2FwX2NmZzsKLQotI2RlZmluZSBNQVhfU0VSVklDRV9EQl9TSVpFIDQwMDAKLQotICBib29sIHNkcF9idXN5OwotICB0SElEX0hPU1RfU0RQX0NBTExCQUNLKiBzZHBfY2JhY2s7Ci0gIHRTRFBfRElTQ09WRVJZX0RCKiBwX3NkcF9kYjsKLSAgdEhJRF9ERVZfU0RQX0lORk8gc2RwX3JlYzsKLSAgYm9vbCByZWdfZmxhZzsKLSAgdWludDhfdCB0cmFjZV9sZXZlbDsKLX0gdEhJRF9IT1NUX0NUQjsKLQotZXh0ZXJuIHRISURfU1RBVFVTIGhpZGhfY29ubl9zbmRfZGF0YSh1aW50OF90IGRoYW5kbGUsIHVpbnQ4X3QgdHJhbnNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXJhbSwgdWludDE2X3QgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBycHRfaWQsIEJUX0hEUiogYnVmKTsKLWV4dGVybiB0SElEX1NUQVRVUyBoaWRoX2Nvbm5fcmVnKHZvaWQpOwotZXh0ZXJuIHZvaWQgaGlkaF9jb25uX2RlcmVnKHZvaWQpOwotZXh0ZXJuIHRISURfU1RBVFVTIGhpZGhfY29ubl9kaXNjb25uZWN0KHVpbnQ4X3QgZGhhbmRsZSk7Ci1leHRlcm4gdEhJRF9TVEFUVVMgaGlkaF9jb25uX2luaXRpYXRlKHVpbnQ4X3QgZGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1haW4gQ29udHJvbCBCbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX0hPU1RfQ1RCIGhoX2NiOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9hYWMuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF9hYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OWYwYy4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfYWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEEyRFAgQ29kZWMgQVBJIGZvciBBQUMKLS8vCi0KLSNpZm5kZWYgQTJEUF9BQUNfSAotI2RlZmluZSBBMkRQX0FBQ19ICi0KLSNpbmNsdWRlIDxidF90YXJnZXQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImEyZHBfYWFjX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1jbGFzcyBBMmRwQ29kZWNDb25maWdBYWNCYXNlIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZyB7Ci0gcHJvdGVjdGVkOgotICBBMmRwQ29kZWNDb25maWdBYWNCYXNlKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc291cmNlKQotICAgICAgOiBBMmRwQ29kZWNDb25maWcoY29kZWNfaW5kZXgsIG5hbWUsIGNvZGVjX3ByaW9yaXR5KSwKLSAgICAgICAgaXNfc291cmNlXyhpc19zb3VyY2UpIHt9Ci0gIGJvb2wgc2V0Q29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcpIG92ZXJyaWRlOwotICBib29sIHNldFBlZXJDb2RlY0NhcGFiaWxpdGllcygKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBpc19zb3VyY2VfOyAgLy8gVHJ1ZSBpZiBsb2NhbCBpcyBTb3VyY2UKLX07Ci0KLWNsYXNzIEEyZHBDb2RlY0NvbmZpZ0FhY1NvdXJjZSA6IHB1YmxpYyBBMmRwQ29kZWNDb25maWdBYWNCYXNlIHsKLSBwdWJsaWM6Ci0gIEEyZHBDb2RlY0NvbmZpZ0FhY1NvdXJjZShidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSk7Ci0gIHZpcnR1YWwgfkEyZHBDb2RlY0NvbmZpZ0FhY1NvdXJjZSgpOwotCi0gIGJvb2wgaW5pdCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCB1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBkZWJ1Z19jb2RlY19kdW1wKGludCBmZCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBBMmRwQ29kZWNDb25maWdBYWNTaW5rIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZ0FhY0Jhc2UgewotIHB1YmxpYzoKLSAgQTJkcENvZGVjQ29uZmlnQWFjU2luayhidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSk7Ci0gIHZpcnR1YWwgfkEyZHBDb2RlY0NvbmZpZ0FhY1NpbmsoKTsKLQotICBib29sIGluaXQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgdXNlUnRwSGVhZGVyTWFya2VyQml0KCkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBBMkRQIEFBQyBTb3VyY2UKLS8vIGNvZGVjLgotLy8gTk9URTogb25seSBjb2RlY3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSB2YWxpZCBBQUMKLS8vIGNvZGVjLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgY29udGFpbiBhIHZhbGlkIEEyRFAgQUFDIFNpbmsgY29kZWMuCi0vLyBOT1RFOiBvbmx5IGNvZGVjcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcmUgY29uc2lkZXJlZCB2YWxpZC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHZhbGlkIEFBQyBjb2RlYywKLS8vIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1NpbmtDb2RlY1ZhbGlkQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgY29udGFpbiBhIHZhbGlkIHBlZXIgQTJEUCBBQUMgU291cmNlCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgQUFDIGNvZGVjLAotLy8gb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWRBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgcGVlciBBMkRQIEFBQyBTaW5rCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgQUFDCi0vLyBjb2RlYywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzUGVlclNpbmtDb2RlY1ZhbGlkQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIEEyRFAgQUFDIFNpbmsgY29kZWMgaXMgc3VwcG9ydGVkLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVjIGNhcGFiaWxpdGllcy4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQTJEUCBBQUMgU2luayBjb2RlYyBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1NpbmtDb2RlY1N1cHBvcnRlZEFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciBhbiBBMkRQIEFBQyBTb3VyY2UgY29kZWMgZm9yIGEgcGVlciBTb3VyY2UgZGV2aWNlIGlzCi0vLyBzdXBwb3J0ZWQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIG9mIHRoZQotLy8gcGVlciBkZXZpY2UuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIEEyRFAgQUFDIFNvdXJjZSBjb2RlYyBmb3IgYSBwZWVyIFNvdXJjZSBkZXZpY2UgaXMKLS8vIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBBMkRQIGRhdGEgcGFja2V0cyBzaG91bGQgY29udGFpbiBSVFAgaGVhZGVyLgotLy8gfGNvbnRlbnRfcHJvdGVjdGlvbl9lbmFibGVkfCBpcyB0cnVlIGlmIENvbnRlbnQgUHJvdGVjdGlvbiBpcwotLy8gZW5hYmxlZC4gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVjIGNhcGFiaWxpdGllcy4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQTJEUCBkYXRhIHBhY2tldHMgc2hvdWxkIGNvbnRhaW4gUlRQIGhlYWRlciwgb3RoZXJ3aXNlCi0vLyBmYWxzZS4KLWJvb2wgQTJEUF9Vc2VzUnRwSGVhZGVyQWFjKGJvb2wgY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIEFBQyBjb2RlYyBuYW1lIGZvciBhIGdpdmVuIHxwX2NvZGVjX2luZm98LgotY29uc3QgY2hhciogQTJEUF9Db2RlY05hbWVBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgQUFDIGNvZGVjcyB8cF9jb2RlY19pbmZvX2F8IGFuZCB8cF9jb2RlY19pbmZvX2J8Ci0vLyBoYXZlIHRoZSBzYW1lIHR5cGUuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBjb2RlY3MgaGF2ZSB0aGUgc2FtZSB0eXBlLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfQ29kZWNUeXBlRXF1YWxzQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYik7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHR3byBBMkRQIEFBQyBjb2RlY3MgfHBfY29kZWNfaW5mb19hfCBhbmQgfHBfY29kZWNfaW5mb19ifAotLy8gYXJlIGV4YWN0bHkgdGhlIHNhbWUuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBjb2RlY3MgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIG90aGVyd2lzZSBmYWxzZS4KLS8vIElmIHRoZSBjb2RlYyB0eXBlIGlzIG5vdCBBQUMsIHRoZSByZXR1cm4gdmFsdWUgaXMgZmFsc2UuCi1ib29sIEEyRFBfQ29kZWNFcXVhbHNBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBHZXRzIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSB2YWx1ZSBmb3IgdGhlIEEyRFAgQUFDIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBBQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldFRyYWNrU2FtcGxlUmF0ZUFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSB0cmFjayBiaXRzIHBlciBzYW1wbGUgdmFsdWUgZm9yIHRoZSBBMkRQIEFBQyBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgQUFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgYml0cyBwZXIgc2FtcGxlIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfR2V0VHJhY2tCaXRzUGVyU2FtcGxlQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgY291bnQgZm9yIHRoZSBBMkRQIEFBQyBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgQUFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgY2hhbm5lbCBjb3VudCBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50QWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgdHlwZSBmb3IgdGhlIEEyRFAgQUFDIFNpbmsgY29kZWM6Ci0vLyAxIGZvciBtb25vLCBvciAzIGZvciBkdWFsL3N0ZXJlby9qb2ludC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgQUFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgY2hhbm5lbCB0eXBlIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGVBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgb2JqZWN0IHR5cGUgY29kZSBmb3IgdGhlIEEyRFAgQUFDIGNvZGVjLgotLy8gVGhlIGFjdHVhbCB2YWx1ZSBpcyBjb2RlYy1zcGVjaWZpYyAtIHNlZSB8QTJEUF9BQUNfT0JKRUNUX1RZUEVfKnwuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIEFBQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIG9iamVjdCB0eXBlIGNvZGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRPYmplY3RUeXBlQ29kZUFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBjaGFubmVsIG1vZGUgY29kZSBmb3IgdGhlIEEyRFAgQUFDIGNvZGVjLgotLy8gVGhlIGFjdHVhbCB2YWx1ZSBpcyBjb2RlYy1zcGVjaWZpYyAtIHNlZSB8QTJEUF9BQUNfQ0hBTk5FTF9NT0RFXyp8LgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBBQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIG1vZGUgY29kZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldENoYW5uZWxNb2RlQ29kZUFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSB2YXJpYWJsZSBiaXQgcmF0ZSBzdXBwb3J0IGZvciB0aGUgQTJEUCBBQUMgY29kZWMuCi0vLyBUaGUgYWN0dWFsIHZhbHVlIGlzIGNvZGVjLXNwZWNpZmljIC0gc2VlIHxBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV8qfC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgQUFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdmFyaWFibGUgYml0IHJhdGUgc3VwcG9ydCBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldFZhcmlhYmxlQml0UmF0ZVN1cHBvcnRBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgYml0IHJhdGUgZm9yIHRoZSBBMkRQIEFBQyBjb2RlYy4KLS8vIFRoZSBhY3R1YWwgdmFsdWUgaXMgY29kZWMtc3BlY2lmaWMgLSBmb3IgQUFDIGl0IGlzIGluIGJpdHMgcGVyIHNlY29uZC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgQUFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgYml0IHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRCaXRSYXRlQWFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENvbXB1dGVzIHRoZSBtYXhpbXVtIGJpdCByYXRlIGZvciB0aGUgQTJEUCBBQUMgY29kZWMgYmFzZWQgb24gdGhlIE1UVS4KLS8vIFRoZSBhY3R1YWwgdmFsdWUgaXMgY29kZWMtc3BlY2lmaWMgLSBmb3IgQUFDIGl0IGlzIGluIGJpdHMgcGVyIHNlY29uZC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgQUFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gfG10dXwgaXMgdGhlIE1UVSB0byB1c2UgZm9yIHRoZSBjb21wdXRhdGlvbi4KLS8vIFJldHVybnMgdGhlIG1heGltdW0gYml0IHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9Db21wdXRlTWF4Qml0UmF0ZUFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIHVpbnQxNl90IG10dSk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgQUFDIGF1ZGlvIGRhdGEgdGltZXN0YW1wIGZyb20gYW4gYXVkaW8gcGFja2V0LgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gfHBfZGF0YXwgY29udGFpbnMgdGhlIGF1ZGlvIGRhdGEuCi0vLyBUaGUgdGltZXN0YW1wIGlzIHN0b3JlZCBpbiB8cF90aW1lc3RhbXB8LgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9HZXRQYWNrZXRUaW1lc3RhbXBBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2RhdGEsIHVpbnQzMl90KiBwX3RpbWVzdGFtcCk7Ci0KLS8vIEJ1aWxkcyBBMkRQIEFBQyBjb2RlYyBoZWFkZXIgZm9yIGF1ZGlvIGRhdGEuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9idWZ8IGNvbnRhaW5zIHRoZSBhdWRpbyBkYXRhLgotLy8gfGZyYW1lc19wZXJfcGFja2V0fCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGlzIHBhY2tldC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfQnVpbGRDb2RlY0hlYWRlckFhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmcmFtZXNfcGVyX3BhY2tldCk7Ci0KLS8vIERlY29kZXMgQTJEUCBBQUMgY29kZWMgaW5mbyBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBBQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotc3RkOjpzdHJpbmcgQTJEUF9Db2RlY0luZm9TdHJpbmdBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBBQUMgZW5jb2RlciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmNvZGUgYW5kIHByZXBhcmUKLS8vIEEyRFAgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uIC0gc2VlIHx0QTJEUF9FTkNPREVSX0lOVEVSRkFDRXwuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyBSZXR1cm5zIHRoZSBBMkRQIEFBQyBlbmNvZGVyIGludGVyZmFjZSBpZiB0aGUgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQgYW5kCi0vLyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBOVUxMLgotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfR2V0RW5jb2RlckludGVyZmFjZUFhYygKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBjdXJyZW50IEEyRFAgQUFDIGRlY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjb2RlCi0vLyByZWNlaXZlZCBBMkRQIHBhY2tldHMgLSBzZWUgfHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFfC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIFJldHVybnMgdGhlIEEyRFAgQUFDIGRlY29kZXIgaW50ZXJmYWNlIGlmIHRoZSB8cF9jb2RlY19pbmZvfCBpcyB2YWxpZCBhbmQKLS8vIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIE5VTEwuCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXREZWNvZGVySW50ZXJmYWNlQWFjKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEFkanVzdHMgdGhlIEEyRFAgQUFDIGNvZGVjLCBiYXNlZCBvbiBsb2NhbCBzdXBwb3J0IGFuZCBCbHVldG9vdGgKLS8vIHNwZWNpZmljYXRpb24uCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24gdG8gYWRqdXN0LgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZCBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9BZGp1c3RDb2RlY0FhYyh1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIEFBQyBTb3VyY2UgY29kZWMgaW5kZXggZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi0vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHxidGF2X2EyZHBfY29kZWNfaW5kZXhfdHwgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB8QlRBVl9BMkRQX0NPREVDX0lOREVYX01BWHwuCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1NvdXJjZUNvZGVjSW5kZXhBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBBQUMgU2luayBjb2RlYyBpbmRleCBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLS8vIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgfGJ0YXZfYTJkcF9jb2RlY19pbmRleF90fCBvbiBzdWNjZXNzLAotLy8gb3RoZXJ3aXNlIHxCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYfC4KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU2lua0NvZGVjSW5kZXhBYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBBQUMgU291cmNlIGNvZGVjIG5hbWUuCi1jb25zdCBjaGFyKiBBMkRQX0NvZGVjSW5kZXhTdHJBYWModm9pZCk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgQUFDIFNpbmsgY29kZWMgbmFtZS4KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNJbmRleFN0ckFhY1Npbmsodm9pZCk7Ci0KLS8vIEluaXRpYWxpemVzIEEyRFAgQUFDIFNvdXJjZSBjb2RlYyBpbmZvcm1hdGlvbiBpbnRvIHxBdmR0cFNlcENvbmZpZ3wKLS8vIGNvbmZpZ3VyYXRpb24gZW50cnkgcG9pbnRlZCBieSB8cF9jZmd8LgotYm9vbCBBMkRQX0luaXRDb2RlY0NvbmZpZ0FhYyhBdmR0cFNlcENvbmZpZyogcF9jZmcpOwotCi0vLyBJbml0aWFsaXplcyBBMkRQIEFBQyBTaW5rIGNvZGVjIGluZm9ybWF0aW9uIGludG8gfEF2ZHRwU2VwQ29uZmlnfAotLy8gY29uZmlndXJhdGlvbiBlbnRyeSBwb2ludGVkIGJ5IHxwX2NmZ3wuCi1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnQWFjU2luayhBdmR0cFNlcENvbmZpZyogcF9jZmcpOwotCi0jZW5kaWYgIC8vIEEyRFBfQUFDX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9hYWNfY29uc3RhbnRzLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfYWFjX2NvbnN0YW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzU2NTU2Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF9hYWNfY29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gQTJEUCBjb25zdGFudHMgZm9yIEFBQyBjb2RlYwotLy8KLQotI2lmbmRlZiBBMkRQX0FBQ19DT05TVEFOVFNfSAotI2RlZmluZSBBMkRQX0FBQ19DT05TVEFOVFNfSAotCi0vLyBBQUMgY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MKLSNkZWZpbmUgQTJEUF9BQUNfQ09ERUNfTEVOIDgKLQotLy8gW09jdGV0IDBdIE9iamVjdCBUeXBlCi0jZGVmaW5lIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUcyX0xDIDB4ODAgIC8qIE1QRUctMiBMb3cgQ29tcGxleGl0eSAqLwotI2RlZmluZSBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9MQyAweDQwICAvKiBNUEVHLTQgTG93IENvbXBsZXhpdHkgKi8KLSNkZWZpbmUgQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzRfTFRQIDB4MjAgLyogTVBFRy00IExvbmcgVGVybSBQcmVkaWN0aW9uICovCi0jZGVmaW5lIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X1NDQUxBQkxFIDB4MTAKLS8vIFtPY3RldCAxXSBTYW1wbGluZyBGcmVxdWVuY3kgLSA4MDAwIHRvIDQ0MTAwCi0jZGVmaW5lIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfTUFTSzAgMHhGRgotI2RlZmluZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzgwMDAgMHg4MAotI2RlZmluZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzExMDI1IDB4NDAKLSNkZWZpbmUgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV8xMjAwMCAweDIwCi0jZGVmaW5lIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfMTYwMDAgMHgxMAotI2RlZmluZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzIyMDUwIDB4MDgKLSNkZWZpbmUgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV8yNDAwMCAweDA0Ci0jZGVmaW5lIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfMzIwMDAgMHgwMgotI2RlZmluZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwIDB4MDEKLS8vIFtPY3RldCAyXSwgW0JpdHMgNC03XSBTYW1wbGluZyBGcmVxdWVuY3kgLSA0ODAwMCB0byA5NjAwMAotLy8gTk9URTogQml0cyBvZmZzZXQgZm9yIHRoZSBoaWdoZXItb3JkZXIgb2N0ZXQgMTYtYml0IGludGVnZXIKLSNkZWZpbmUgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV9NQVNLMSAoMHhGMCA8PCA4KQotI2RlZmluZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ4MDAwICgweDgwIDw8IDgpCi0jZGVmaW5lIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNjQwMDAgKDB4NDAgPDwgOCkKLSNkZWZpbmUgQTJEUF9BQUNfU0FNUExJTkdfRlJFUV84ODIwMCAoMHgyMCA8PCA4KQotI2RlZmluZSBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwICgweDEwIDw8IDgpCi0vLyBbT2N0ZXQgMl0sIFtCaXRzIDItM10gQ2hhbm5lbCBNb2RlCi0jZGVmaW5lIEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9NQVNLIDB4MEMKLSNkZWZpbmUgQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk8gMHgwOAotI2RlZmluZSBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPIDB4MDQKLS8vIFtPY3RldCAyXSwgW0JpdHMgMC0xXSBSRkEKLS8vIFtPY3RldCAzXSwgW0JpdCA3XSBWYXJpYWJsZSBCaXQgUmF0ZSBTdXBwb3J0ZWQKLSNkZWZpbmUgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfTUFTSyAweDgwCi0jZGVmaW5lIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0VOQUJMRUQgMHg4MAotI2RlZmluZSBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9ESVNBQkxFRCAweDAwCi0vLyBbT2N0ZXQgM10sIFtCaXRzIDAtNl0gQml0IFJhdGUgLSBCaXRzIDE2LTIyIGluIHRoZSAyMy1iaXQgVWlNc2JmCi0jZGVmaW5lIEEyRFBfQUFDX0JJVF9SQVRFX01BU0swICgweDdGIDw8IDE2KQotI2RlZmluZSBBMkRQX0FBQ19CSVRfUkFURV9NQVNLMSAoMHhGRiA8PCA4KQotI2RlZmluZSBBMkRQX0FBQ19CSVRfUkFURV9NQVNLMiAweEZGCi0vLyBbT2N0ZXQgNF0sIFtCaXRzIDAtN10gQml0IFJhdGUgLSBCaXRzIDgtMTUgaW4gdGhlIDIzLWJpdCBVaU1zZmIKLS8vIFtPY3RldCA1XSwgW0JpdHMgMC03XSBCaXQgUmF0ZSAtIEJpdHMgMC03IGluIHRoZSAyMy1iaXQgVWlNc2ZiCi0KLSNlbmRpZiAgLy8gQTJEUF9BQUNfQ09OU1RBTlRTX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9hYWNfZGVjb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX2FhY19kZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjQ3NDYuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX2FhY19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEludGVyZmFjZSB0byB0aGUgQTJEUCBBQUMgRGVjb2RlcgotLy8KLQotI2lmbmRlZiBBMkRQX0FBQ19ERUNPREVSX0gKLSNkZWZpbmUgQTJEUF9BQUNfREVDT0RFUl9ICi0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8vIExvYWRzIHRoZSBBMkRQIEFBQyBkZWNvZGVyLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0xvYWREZWNvZGVyQWFjKHZvaWQpOwotCi0vLyBVbmxvYWRzIHRoZSBBMkRQIEFBQyBkZWNvZGVyLgotdm9pZCBBMkRQX1VubG9hZERlY29kZXJBYWModm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgQUFDIGRlY29kZXIuCi1ib29sIGEyZHBfYWFjX2RlY29kZXJfaW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spOwotCi0vLyBDbGVhbnVwIHRoZSBBMkRQIEFBQyBkZWNvZGVyLgotdm9pZCBhMmRwX2FhY19kZWNvZGVyX2NsZWFudXAodm9pZCk7Ci0KLS8vIERlY29kZXMgfHBfYnVmfC4gQ2FsbHMgfGRlY29kZV9jYWxsYmFja3wgcGFzc2VkIGludG8gfGEyZHBfYWFjX2RlY29kZXJfaW5pdHwKLS8vIGlmIGRlY29kZWQgZnJhbWVzIGFyZSBhdmFpbGFibGUuCi1ib29sIGEyZHBfYWFjX2RlY29kZXJfZGVjb2RlX3BhY2tldChCVF9IRFIqIHBfYnVmKTsKLQotI2VuZGlmICAvLyBBMkRQX0FBQ19ERUNPREVSX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9hYWNfZW5jb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX2FhY19lbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDNmNDYuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX2FhY19lbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gSW50ZXJmYWNlIHRvIHRoZSBBMkRQIEFBQyBFbmNvZGVyCi0vLwotCi0jaWZuZGVmIEEyRFBfQUFDX0VOQ09ERVJfSAotI2RlZmluZSBBMkRQX0FBQ19FTkNPREVSX0gKLQotI2luY2x1ZGUgImEyZHBfYWFjX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0KLS8vIElzIHVzZWQgaW4gYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190LmNvZGVjX3NwZWNpZmljXzEgd2hlbiBjb2RlYyBpcyBBQUMKLWVudW0gY2xhc3MgQWFjRW5jb2RlckJpdHJhdGVNb2RlIDogaW50NjRfdCB7Ci0gIC8vIFZhcmlhYmxlIGJpdHJhdGUgbW9kZSB1bnN1cHBvcnRlZCB3aGVuIHVzZWQgaW4gYSBjb2RlYyByZXBvcnQsIGFuZCB1cHBlcgotICAvLyBsYXllciBjYW4gdXNlIHRoaXMgdmFsdWUgYXMgc3lzdGVtIGRlZmF1bHQgKGtlZXAgY3VycmVudCBzZXR0aW5ncykKLSAgQUFDRU5DX0JSX01PREVfQ0JSID0gQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRElTQUJMRUQsCi0gIC8vIENvbnN0YW50IGJpdHJhdGUgbW9kZSB3aGVuIFZhcmlhYmxlIGJpdHJhdGUgbW9kZSBpcyBzdXBwb3J0ZWQuIFRoaXMgY2FuCi0gIC8vIGFsc28gYmUgdXNlZCB0byBkaXNhYmxlIFZhcmlhYmxlIGJpdHJhdGUgbW9kZSBieSB1cHBlciBsYXllcgotICBBQUNFTkNfQlJfTU9ERV9WQlJfQyA9IChBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9FTkFCTEVEIHwgMHgwMCksCi0gIC8vIFZhcmlhYmxlIGJpdHJhdGUgbW9kZSAodmVyeSBsb3cgYml0cmF0ZSBmb3Igc29mdHdhcmUgZW5jb2RpbmcpLgotICBBQUNFTkNfQlJfTU9ERV9WQlJfMSA9IChBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9FTkFCTEVEIHwgMHgwMSksCi0gIC8vIFZhcmlhYmxlIGJpdHJhdGUgbW9kZSAobG93IGJpdHJhdGUgZm9yIHNvZnR3YXJlIGVuY29kaW5nKS4KLSAgQUFDRU5DX0JSX01PREVfVkJSXzIgPSAoQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRU5BQkxFRCB8IDB4MDIpLAotICAvLyBWYXJpYWJsZSBiaXRyYXRlIG1vZGUgKG1lZGl1bSBiaXRyYXRlIGZvciBzb2Z0d2FyZSBlbmNvZGluZykuCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zID0gKEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0VOQUJMRUQgfCAweDAzKSwKLSAgLy8gVmFyaWFibGUgYml0cmF0ZSBtb2RlIChoaWdoIGJpdHJhdGUgZm9yIHNvZnR3YXJlIGVuY29kaW5nKS4KLSAgQUFDRU5DX0JSX01PREVfVkJSXzQgPSAoQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRU5BQkxFRCB8IDB4MDQpLAotICAvLyBWYXJpYWJsZSBiaXRyYXRlIG1vZGUgKHZlcnkgaGlnaCBiaXRyYXRlIGZvciBzb2Z0d2FyZSBlbmNvZGluZykuCi0gIEFBQ0VOQ19CUl9NT0RFX1ZCUl81ID0gKEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0VOQUJMRUQgfCAweDA1KSwKLX07Ci0KLS8vIExvYWRzIHRoZSBBMkRQIEFBQyBlbmNvZGVyLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0xvYWRFbmNvZGVyQWFjKHZvaWQpOwotCi0vLyBVbmxvYWRzIHRoZSBBMkRQIEFBQyBlbmNvZGVyLgotdm9pZCBBMkRQX1VubG9hZEVuY29kZXJBYWModm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgQUFDIGVuY29kZXIuCi0vLyB8cF9wZWVyX3BhcmFtc3wgY29udGFpbnMgdGhlIEEyRFAgcGVlciBpbmZvcm1hdGlvbgotLy8gVGhlIGN1cnJlbnQgQTJEUCBjb2RlYyBjb25maWcgaXMgaW4gfGEyZHBfY29kZWNfY29uZmlnfC4KLS8vIHxyZWFkX2NhbGxiYWNrfCBpcyB0aGUgY2FsbGJhY2sgZm9yIHJlYWRpbmcgdGhlIGlucHV0IGF1ZGlvIGRhdGEuCi0vLyB8ZW5xdWV1ZV9jYWxsYmFja3wgaXMgdGhlIGNhbGxiYWNrIGZvciBlbnF1ZXVlaW5nIHRoZSBlbmNvZGVkIGF1ZGlvIGRhdGEuCi12b2lkIGEyZHBfYWFjX2VuY29kZXJfaW5pdChjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjayk7Ci0KLS8vIENsZWFudXAgdGhlIEEyRFAgQUFDIGVuY29kZXIuCi12b2lkIGEyZHBfYWFjX2VuY29kZXJfY2xlYW51cCh2b2lkKTsKLQotLy8gUmVzZXQgdGhlIGZlZWRpbmcgZm9yIHRoZSBBMkRQIEFBQyBlbmNvZGVyLgotdm9pZCBhMmRwX2FhY19mZWVkaW5nX3Jlc2V0KHZvaWQpOwotCi0vLyBGbHVzaCB0aGUgZmVlZGluZyBmb3IgdGhlIEEyRFAgQUFDIGVuY29kZXIuCi12b2lkIGEyZHBfYWFjX2ZlZWRpbmdfZmx1c2godm9pZCk7Ci0KLS8vIEdldCB0aGUgQTJEUCBBQUMgZW5jb2RlciBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKS4KLXVpbnQ2NF90IGEyZHBfYWFjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKHZvaWQpOwotCi0vLyBHZXQgdGhlIEEyRFAgQUFDIGVuY29kZWQgbWF4aW11bSBmcmFtZSBzaXplCi1pbnQgYTJkcF9hYWNfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCk7Ci0KLS8vIFByZXBhcmUgYW5kIHNlbmQgQTJEUCBBQUMgZW5jb2RlZCBmcmFtZXMuCi0vLyB8dGltZXN0YW1wX3VzfCBpcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgKGluIG1pY3Jvc2Vjb25kcykuCi12b2lkIGEyZHBfYWFjX3NlbmRfZnJhbWVzKHVpbnQ2NF90IHRpbWVzdGFtcF91cyk7Ci0KLSNlbmRpZiAgLy8gQTJEUF9BQUNfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfYXBpLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTg4OWIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDAtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vCi0vLyBBMkRQIEFQSQotLy8KLQotI2lmbmRlZiBBMkRQX0FQSV9ICi0jZGVmaW5lIEEyRFBfQVBJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2EyZHBfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX2Vycm9yX2NvZGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgY29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8KLS8vIHxNQVhfUENNX0ZSQU1FX05VTV9QRVJfVElDS3wgY29udHJvbHMgaG93IG1hbnkgYnVmZmVycyB3ZSBjYW4gaG9sZCBpbgotLy8gdGhlIEEyRFAgYnVmZmVyIHF1ZXVlcyBkdXJpbmcgdGVtcG9yYXJ5IGxpbmsgY29uZ2VzdGlvbi4KLS8vCi0jaWZuZGVmIE1BWF9QQ01fRlJBTUVfTlVNX1BFUl9USUNLCi0jZGVmaW5lIE1BWF9QQ01fRlJBTUVfTlVNX1BFUl9USUNLIDE0Ci0jZW5kaWYKLQotLyogdGhlIHJldHVybiB2YWx1ZXMgZnJvbSBBMkRQX0JpdHNTZXQoKSAqLwotI2RlZmluZSBBMkRQX1NFVF9PTkVfQklUIDEgICAvKiBvbmUgYW5kIG9ubHkgb25lIGJpdCBpcyBzZXQgKi8KLSNkZWZpbmUgQTJEUF9TRVRfWkVST19CSVQgMCAgLyogYWxsIGJpdHMgY2xlYXIgKi8KLSNkZWZpbmUgQTJEUF9TRVRfTVVMVExfQklUIDIgLyogbXVsdGlwbGUgYml0cyBhcmUgc2V0ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGRhdGEgdHlwZSBpcyB1c2VkIGluIEEyRFBfRmluZFNlcnZpY2UoKSB0byBpbml0aWFsaXplIHRoZSBTRFAgZGF0YWJhc2UKLSAqIHRvIGhvbGQgdGhlIHJlc3VsdCBzZXJ2aWNlIHNlYXJjaC4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgZGJfbGVuOyAgIC8qIExlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBkaXNjb3ZlcnkgZGF0YWJhc2UgKi8KLSAgdWludDE2X3QgbnVtX2F0dHI7IC8qIFRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBpbiBwX2F0dHJzICovCi0gIHVpbnQxNl90KiBwX2F0dHJzOyAvKiBUaGUgYXR0cmlidXRlcyBmaWx0ZXIuIElmIE5VTEwsIEEyRFAgQVBJIHNldHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgKiBhdHRyaWJ1dGUgZmlsdGVyCi0gICAgICAgICAgICAgICAgICAgICAgKiB0byBiZSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAqIEFUVFJfSURfQlRfUFJPRklMRV9ERVNDX0xJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgKiBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywgQVRUUl9JRF9TRVJWSUNFX05BTUUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgKiBBVFRSX0lEX1BST1ZJREVSX05BTUUuCi0gICAgICAgICAgICAgICAgICAgICAgKiBJZiBub3QgTlVMTCwgdGhlIGlucHV0IGlzIHRha2VuIGFzIHRoZSBmaWx0ZXIuICovCi19IHRBMkRQX1NEUF9EQl9QQVJBTVM7Ci0KLS8qIFRoaXMgZGF0YSB0eXBlIGlzIHVzZWQgaW4gdEEyRFBfRklORF9DQkFDSyB0byByZXBvcnQgdGhlIHJlc3VsdCBvZiB0aGUgU0RQCi0gKiBkaXNjb3ZlcnkgcHJvY2Vzcy4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3Qgc2VydmljZV9sZW47ICAvKiBMZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgc2VydmljZSBuYW1lICovCi0gIHVpbnQxNl90IHByb3ZpZGVyX2xlbjsgLyogTGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIHByb3ZpZGVyIG5hbWUgKi8KLSAgY2hhciogcF9zZXJ2aWNlX25hbWU7ICAvKiBQb2ludGVyIHRoZSBzZXJ2aWNlIG5hbWUuICBUaGlzIGNoYXJhY3RlciBzdHJpbmcgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICogbm90IGJlIG51bGwgdGVybWluYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBVc2UgdGhlIHNlcnZpY2VfbGVuIHBhcmFtZXRlciB0byBzYWZlbHkgY29weSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogc3RyaW5nICovCi0gIGNoYXIqIHBfcHJvdmlkZXJfbmFtZTsgLyogUG9pbnRlciB0aGUgcHJvdmlkZXIgbmFtZS4gIFRoaXMgY2hhcmFjdGVyIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1heSBub3QgYmUgbnVsbCB0ZXJtaW5hdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVzZSB0aGUgcHJvdmlkZXJfbGVuIHBhcmFtZXRlciB0byBzYWZlbHkgY29weSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogc3RyaW5nICovCi0gIHVpbnQxNl90IGZlYXR1cmVzOyAgICAgLyogUHJvZmlsZSBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KLSAgdWludDE2X3QgYXZkdF92ZXJzaW9uOyAvKiBBVkRUUCBwcm90b2NvbCB2ZXJzaW9uICovCi19IHRBMkRQX1NlcnZpY2U7Ci0KLS8qIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHRvIG5vdGlmeSB0aGUgcmVzdWx0IG9mIHRoZSBTRFAgZGlzY292ZXJ5IHByb2Nlc3MuICovCi10eXBlZGVmIHZvaWQodEEyRFBfRklORF9DQkFDSykoYm9vbCBmb3VuZCwgdEEyRFBfU2VydmljZSogcF9zZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBMkRQX0FkZFJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBzZXJ2ZXIgYXBwbGljYXRpb24gdG8gYWRkCi0gKiAgICAgICAgICAgICAgICAgIFNSQyBvciBTTksgaW5mb3JtYXRpb24gdG8gYW4gU0RQIHJlY29yZC4gIFByaW9yIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsCi0gKiAgICAgICAgICAgICAgICAgIFNEUF9DcmVhdGVSZWNvcmQoKSB0byBjcmVhdGUgYW4gU0RQIHJlY29yZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQ6ICBJbmRpY2F0ZXMgU1JDIG9yIFNOSy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfbmFtZTogIFBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VydmljZSBuYW1lLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfcHJvdmlkZXJfbmFtZTogIFBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgcHJvdmlkZXIgbmFtZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogIFByb2ZpbGUgc3VwcG9ydGVkIGZlYXR1cmVzLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGU6ICBTRFAgaGFuZGxlIHJldHVybmVkIGJ5IFNEUF9DcmVhdGVSZWNvcmQoKS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEEyRFBfU1VDQ0VTUyBpZiBmdW5jdGlvbiBleGVjdXRpb24gc3VjY2VlZGVkLAotICogICAgICAgICAgICAgICAgICBBMkRQX0lOVkFMSURfUEFSQU1TIGlmIGJhZCBwYXJhbWV0ZXJzIGFyZSBnaXZlbi4KLSAqICAgICAgICAgICAgICAgICAgQTJEUF9GQUlMIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRBMkRQX1NUQVRVUyBBMkRQX0FkZFJlY29yZCh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNoYXIqIHBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX3Byb3ZpZGVyX25hbWUsIHVpbnQxNl90IGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQTJEUF9GaW5kU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBjbGllbnQgYXBwbGljYXRpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgcGVyZm9ybSBzZXJ2aWNlIGRpc2NvdmVyeSBhbmQgcmV0cmlldmUgU1JDIG9yIFNOSyBTRFAKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkIGluZm9ybWF0aW9uIGZyb20gYSBzZXJ2ZXIuICBJbmZvcm1hdGlvbiBpcwotICogICAgICAgICAgICAgICAgICByZXR1cm5lZCBmb3IgdGhlIGZpcnN0IHNlcnZpY2UgcmVjb3JkIGZvdW5kIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBzZXJ2ZXIgdGhhdCBtYXRjaGVzIHRoZSBzZXJ2aWNlIFVVSUQuICBUaGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHNlcnZpY2UgZGlzY292ZXJ5IGlzCi0gKiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlLiAgVGhlcmUgY2FuIG9ubHkgYmUgb25lIG91dHN0YW5kaW5nIGNhbGwgdG8KLSAqICAgICAgICAgICAgICAgICAgQTJEUF9GaW5kU2VydmljZSgpIGF0IGEgdGltZTsgdGhlIGFwcGxpY2F0aW9uIG11c3Qgd2FpdAotICogICAgICAgICAgICAgICAgICBmb3IgdGhlIGNhbGxiYWNrIGJlZm9yZSBpdCBtYWtlcyBhbm90aGVyIGNhbGwgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZDogIEluZGljYXRlcyBTUkMgb3IgU05LLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHI6ICBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2RiOiAgUG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXNjb3ZlcnkgZGF0YWJhc2UuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcF9jYmFjazogIFBvaW50ZXIgdG8gdGhlIEEyRFBfRmluZFNlcnZpY2UoKQotICogICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBPdXRwdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBMkRQX1NVQ0NFU1MgaWYgZnVuY3Rpb24gZXhlY3V0aW9uIHN1Y2NlZWRlZCwKLSAqICAgICAgICAgICAgICAgICAgQTJEUF9JTlZBTElEX1BBUkFNUyBpZiBiYWQgcGFyYW1ldGVycyBhcmUgZ2l2ZW4uCi0gKiAgICAgICAgICAgICAgICAgIEEyRFBfQlVTWSBpZiBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4KLSAqICAgICAgICAgICAgICAgICAgQTJEUF9GQUlMIGlmIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRBMkRQX1NUQVRVUyBBMkRQX0ZpbmRTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBMkRQX1NEUF9EQl9QQVJBTVMqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEEyRFBfRklORF9DQkFDSyogcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEEyRFBfR2V0QXZkdHBWZXJzaW9uKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldHMgdGhlIGxvY2FsIHZlcnNpb24gb2YgQVZEVFAKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBsb2NhbCB2ZXJzaW9uIG9mIEFWRFRQLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBMkRQX0dldEF2ZHRwVmVyc2lvbih2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQTJEUF9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgQTJELiBJZiAweGZmIGlzIHBhc3NlZCwgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdHJhY2UgbGV2ZWwgaXMgcmV0dXJuZWQuCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgbmV3X2xldmVsOiAgVGhlIGxldmVsIHRvIHNldCB0aGUgQTJEUCB0cmFjaW5nIHRvOgotICogICAgICAgICAgICAgICAgICAgICAgMHhmZi1yZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcuCi0gKiAgICAgICAgICAgICAgICAgICAgICAwLXR1cm5zIG9mZiB0cmFjaW5nLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMS1FcnJvcnMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAyLVdhcm5pbmdzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMy1BUElzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gNC1FdmVudHMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSA1LURlYnVnLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG5ldyB0cmFjZSBsZXZlbCBvciBjdXJyZW50IHRyYWNlIGxldmVsIGlmCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgMHhmZi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDhfdCBBMkRQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIEEyRFBfQml0c1NldAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgdGhlIGdpdmVuIG51bSBmb3IgdGhlIG51bWJlciBvZiBiaXRzIHNldAotICogUmV0dXJucyAgICAgICAgICBBMkRQX1NFVF9PTkVfQklULCBpZiBvbmUgYW5kIG9ubHkgb25lIGJpdCBpcyBzZXQKLSAqICAgICAgICAgICAgICAgICAgQTJEUF9TRVRfWkVST19CSVQsIGlmIGFsbCBiaXRzIGNsZWFyCi0gKiAgICAgICAgICAgICAgICAgIEEyRFBfU0VUX01VTFRMX0JJVCwgaWYgbXVsdGlwbGUgYml0cyBhcmUgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDhfdCBBMkRQX0JpdHNTZXQodWludDY0X3QgbnVtKTsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIEEyRFAgY29udHJvbCBibG9jay4KLXZvaWQgQTJEUF9Jbml0KHZvaWQpOwotCi0jZW5kaWYgIC8vIEEyRFBfQVBJX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9jb2RlY19hcGkuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF9jb2RlY19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyNTlhNS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfY29kZWNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEEyRFAgQ29kZWNzIEFQSQotLy8KLQotI2lmbmRlZiBBMkRQX0NPREVDX0FQSV9ICi0jZGVmaW5lIEEyRFBfQ09ERUNfQVBJX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2F2Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImEyZHBfYXBpLmgiCi0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaCIKLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotY2xhc3MgdEJUX0EyRFBfT0ZGTE9BRDsKLQotLyoqCi0gKiBTdHJ1Y3R1cmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBBMkRQIGVuY29kZXIgd2l0aCBBMkRQIHBlZXIgaW5mb3JtYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIGlzX3BlZXJfZWRyOyAgICAgICAgICAvLyBUcnVlIGlmIHRoZSBBMkRQIHBlZXIgc3VwcG9ydHMgRURSCi0gIGJvb2wgcGVlcl9zdXBwb3J0c18zbWJwczsgIC8vIFRydWUgaWYgdGhlIEEyRFAgcGVlciBzdXBwb3J0cyAzIE1icHMgRURSCi0gIHVpbnQxNl90IHBlZXJfbXR1OyAgICAgICAgIC8vIE1UVSBvZiB0aGUgQTJEUCBwZWVyCi19IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUzsKLQotY2xhc3MgQTJkcENvZGVjQ29uZmlnIHsKLSAgZnJpZW5kIGNsYXNzIEEyZHBDb2RlY3M7Ci0KLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBjb2RlYyBlbnRyeS4gVGhlIHNlbGVjdGVkIGNvZGVjIGlzIGRlZmluZWQgYnkgfGNvZGVjX2luZGV4fCwKLSAgLy8gUmV0dXJucyB0aGUgY29kZWMgZW50cnkgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIG51bGxwdHIuCi0gIHN0YXRpYyBBMmRwQ29kZWNDb25maWcqIGNyZWF0ZUNvZGVjKAotICAgICAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgsCi0gICAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSA9Ci0gICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0RFRkFVTFQpOwotCi0gIHZpcnR1YWwgfkEyZHBDb2RlY0NvbmZpZygpID0gMDsKLQotICAvLyBHZXRzIHRoZSBwcmUtZGVmaW5lZCBjb2RlYyBpbmRleC4KLSAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGNvZGVjX2luZGV4XzsgfQotCi0gIC8vIEdldHMgdGhlIGNvZGVjIG5hbWUuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IHByaW9yaXR5IG9mIHRoZSBjb2RlYy4KLSAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGNvZGVjX3ByaW9yaXR5XzsgfQotCi0gIC8vIGdldHMgY3VycmVudCBPVEEgY29kZWMgc3BlY2lmaWMgY29uZmlnIHRvIHxwX2EyZHBfb2ZmbG9hZC0+Y29kZWNfaW5mb3wuCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBjb2RlYyBjb25maWcgaXMgdmFsaWQgYW5kIGNvcGllZCwKLSAgLy8gb3RoZXJ3aXNlIGZhbHNlLgotICBib29sIGdldENvZGVjU3BlY2lmaWNDb25maWcodEJUX0EyRFBfT0ZGTE9BRCogcF9hMmRwX29mZmxvYWQpOwotCi0gIC8vIEdldHMgdGhlIGJpdFJhdGUgZm9yIHRoZSBBMkRQIGNvZGVjLgotICAvLyBSZXR1cm5zIHRoZSBiaXRyYXRlIG9mIGN1cnJlbnQgY29kZWMgY29uZmlndXJhdGlvbiwgb3IgMCBpZiBub3QgY29uZmlndXJlZAotICBpbnQgZ2V0VHJhY2tCaXRSYXRlKCkgY29uc3Q7Ci0KLSAgLy8gQ29waWVzIG91dCB0aGUgY3VycmVudCBPVEEgY29kZWMgY29uZmlnIHRvIHxwX2NvZGVjX2luZm98LgotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlnIGlzIHZhbGlkIGFuZCBjb3BpZWQsCi0gIC8vIG90aGVyd2lzZSBmYWxzZS4KLSAgYm9vbCBjb3B5T3V0T3RhQ29kZWNDb25maWcodWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0gIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBnZXRDb2RlY0NvbmZpZygpOwotCi0gIC8vIEdldHMgdGhlIGN1cnJlbnQgY29kZWMgY2FwYWJpbGl0eS4KLSAgLy8gVGhlIGNhcGFiaWxpdHkgaXMgY29tcHV0ZWQgYnkgaW50ZXJzZWN0aW5nIHRoZSBsb2NhbCBjb2RlYydzIGNhcGFiaWxpdHkKLSAgLy8gYW5kIHRoZSBwZWVyJ3MgY29kZWMgY2FwYWJpbGl0eS4gSG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgdXNlcgotICAvLyBjb25maWd1cmF0aW9uIGZvciBzb21lIG9mIHRoZSBwYXJhbWV0ZXJzLCB0aGUgcmVzdWx0IGNvZGVjIGNvbmZpZ3VyYXRpb24KLSAgLy8gYW5kIGNhcGFiaWxpdHkgaXMgcmVzdHJpY3RlZCB0byB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24gY2hvaWNlLgotICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBjb2RlYyBjYXBhYmlsaXR5LgotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgZ2V0Q29kZWNDYXBhYmlsaXR5KCk7Ci0KLSAgLy8gR2V0cyB0aGUgY29kZWMgbG9jYWwgY2FwYWJpbGl0eS4KLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGNvZGVjIGxvY2FsIGNhcGFiaWxpdHkuCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBnZXRDb2RlY0xvY2FsQ2FwYWJpbGl0eSgpOwotCi0gIC8vIEdldHMgdGhlIGNvZGVjIHNlbGVjdGFibGUgY2FwYWJpbGl0eS4KLSAgLy8gVGhlIGNhcGFiaWxpdHkgaXMgY29tcHV0ZWQgYnkgaW50ZXJzZWN0aW5nIHRoZSBsb2NhbCBjb2RlYydzIGNhcGFiaWxpdHkKLSAgLy8gYW5kIHRoZSBwZWVyJ3MgY29kZWMgY2FwYWJpbGl0eS4gQW55IGV4cGxpY2l0IHVzZXIgY29uZmlndXJhdGlvbiBpcwotICAvLyBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGNvZGVjIHNlbGVjdGFibGUgY2FwYWJpbGl0eS4KLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGdldENvZGVjU2VsZWN0YWJsZUNhcGFiaWxpdHkoKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IGNvZGVjIHVzZXIgY29uZmlndXJhdGlvbi4KLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29kZWMgdXNlciBjb25maWd1cmF0aW9uLgotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgZ2V0Q29kZWNVc2VyQ29uZmlnKCk7Ci0KLSAgLy8gR2V0cyB0aGUgY3VycmVudCBjb2RlYyBhdWRpbyBjb25maWd1cmF0aW9uLgotICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBjb2RlYyBhdWRpbyBjb25maWd1cmF0aW9uLgotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgZ2V0Q29kZWNBdWRpb0NvbmZpZygpOwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgY29kZWMgY29uZmlndXJhdGlvbiwKLSAgLy8gb3IgMCBpZiBub3QgY29uZmlndXJlZC4KLSAgdWludDhfdCBnZXRBdWRpb0JpdHNQZXJTYW1wbGUoKTsKLQotICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgdXNlcyB0aGUgUlRQIEhlYWRlciBNYXJrZXIgYml0IChzZWUgUkZDIDY0MTYpLgotICAvLyBOT1RFOiBFdmVuIGlmIHRoZSBlbmNvZGVkIGRhdGEgdXNlcyBSVFAgaGVhZGVycywgc29tZSBjb2RlY3MgZG8gbm90IHVzZQotICAvLyB0aGUgTWFya2VyIGJpdCAtIHRoYXQgYml0IGlzIGV4cGVjdGVkIHRvIGJlIHNldCB0byAwLgotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kZWQgZGF0YSBwYWNrZXRzIGhhdmUgUlRQIGhlYWRlcnMsIGFuZAotICAvLyB0aGUgTWFya2VyIGJpdCBpbiB0aGUgaGVhZGVyIGlzIHNldCBhY2NvcmRpbmcgdG8gUkZDIDY0MTYuCi0gIHZpcnR1YWwgYm9vbCB1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCA9IDA7Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXIgfGNvZGVjX2NvbmZpZ3wgaXMgZW1wdHkgYW5kIGNvbnRhaW5zIG5vIGNvbmZpZ3VyYXRpb24uCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB8Y29kZWNfY29uZmlnfCBpcyBlbXB0eSwgb3RoZXJ3aXNlIGZhbHNlLgotICBzdGF0aWMgYm9vbCBpc0NvZGVjQ29uZmlnRW1wdHkoY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcpOwotCi0gcHJvdGVjdGVkOgotICAvLyBTZXRzIHRoZSBjdXJyZW50IHByaW9yaXR5IG9mIHRoZSBjb2RlYyB0byB8Y29kZWNfcHJpb3JpdHl8LgotICAvLyBJZiB8Y29kZWNfcHJpb3JpdHl8IGlzIEJUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ERUZBVUxULCB0aGUgcHJpb3JpdHkgaXMKLSAgLy8gcmVzZXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gIHZvaWQgc2V0Q29kZWNQcmlvcml0eShidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSk7Ci0KLSAgLy8gU2V0cyB0aGUgY3VycmVudCBwcmlvcml0eSBvZiB0aGUgY29kZWMgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gIHZvaWQgc2V0RGVmYXVsdENvZGVjUHJpb3JpdHkoKTsKLQotICAvLyBTZXRzIHRoZSBBMkRQIFNvdXJjZS10by1TaW5rIGNvZGVjIGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZAotICAvLyB3aXRoIGEgcGVlciBTaW5rIGRldmljZS4KLSAgLy8gfHBfcGVlcl9jb2RlY19pbmZvfCBpcyB0aGUgcGVlcidzIEEyRFAgU2luayBjb2RlYyBpbmZvcm1hdGlvbgotICAvLyB0byB1c2UuIElmIHxpc19jYXBhYmlsaXR5fCBpcyB0cnVlLCB0aGVuIHxwX3BlZXJfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlCi0gIC8vIHBlZXIncyBBMkRQIFNpbmsgY29kZWMgY2FwYWJpbGl0eSwgb3RoZXJ3aXNlIGl0IGNvbnRhaW5zIHRoZSBwZWVyJ3MKLSAgLy8gcHJlZmVycmVkIEEyRFAgY29kZWMgY29uZmlndXJhdGlvbiB0byB1c2UuCi0gIC8vIFRoZSByZXN1bHQgY29kZWMgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0X2NvZGVjX2NvbmZpZ3wuCi0gIC8vIFNlZSB8QTJkcENvZGVjcy5zZXRDb2RlY0NvbmZpZ3wgZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mCi0gIC8vIHRoZSBhY3R1YWwgbWVjaGFuaXNtIHVzZWQgdG8gY29tcHV0ZSB0aGUgY29uZmlndXJhdGlvbi4KLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGV3aXNlIGZhbHNlLgotICB2aXJ0dWFsIGJvb2wgc2V0Q29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcpID0gMDsKLQotICAvLyBTZXRzIHRoZSB1c2VyIHByZWZlcmVkIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0gIC8vIHxjb2RlY191c2VyX2NvbmZpZ3wgY29udGFpbnMgdGhlIHByZWZlcnJlZCBjb2RlYyB1c2VyIGNvbmZpZ3VyYXRpb24uCi0gIC8vIHxjb2RlY19hdWRpb19jb25maWd8IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBhdWRpbyBmZWVkaW5nIGNvbmZpZ3VyYXRpb24uCi0gIC8vIHxwX3BlZXJfcGFyYW1zfCBjb250YWlucyB0aGUgQTJEUCBwZWVyIGluZm9ybWF0aW9uLgotICAvLyB8cF9wZWVyX2NvZGVjX2luZm98IGlzIHRoZSBwZWVyJ3MgQTJEUCBTaW5rIGNvZGVjIGluZm9ybWF0aW9uCi0gIC8vIHRvIHVzZS4gSWYgfGlzX2NhcGFiaWxpdHl8IGlzIHRydWUsIHRoZW4gfHBfcGVlcl9jb2RlY19pbmZvfCBjb250YWlucyB0aGUKLSAgLy8gcGVlcidzIEEyRFAgU2luayBjb2RlYyBjYXBhYmlsaXR5LCBvdGhlcndpc2UgaXQgY29udGFpbnMgdGhlIHBlZXIncwotICAvLyBwcmVmZXJyZWQgQTJEUCBjb2RlYyBjb25maWd1cmF0aW9uIHRvIHVzZS4KLSAgLy8gSWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gdGhhdCByZXF1aXJlcyByZXN0YXJ0aW5nCi0gIC8vIGlmIHRoZSBhdWRpbyBpbnB1dCBzdHJlYW0sIGZsYWcgfHBfcmVzdGFydF9pbnB1dHwgaXMgc2V0IHRvIHRydWUuCi0gIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gdGhhdCByZXF1aXJlcyByZXN0YXJ0aW5nCi0gIC8vIG9mIHRoZSBBMkRQIGNvbm5lY3Rpb24sIHRoZSBuZXcgY29kZWMgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQgaW4KLSAgLy8gfHBfcmVzdWx0X2NvZGVjX2NvbmZpZ3wsIGFuZCBmbGFnIHxwX3Jlc3RhcnRfb3V0cHV0fCBpcyBzZXQgdG8gdHJ1ZS4KLSAgLy8gSWYgdGhlcmUgaXMgYW55IGNoYW5nZSBpbiB0aGUgY29kZWMgY29uZmlndXJhdGlvbiwgZmxhZyB8cF9jb25maWdfdXBkYXRlZHwKLSAgLy8gaXMgc2V0IHRvIHRydWUuCi0gIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gIHZpcnR1YWwgYm9vbCBzZXRDb2RlY1VzZXJDb25maWcoCi0gICAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX3VzZXJfY29uZmlnLAotICAgICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19hdWRpb19jb25maWcsCi0gICAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnLCBib29sKiBwX3Jlc3RhcnRfaW5wdXQsCi0gICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKTsKLQotICAvLyBTZXRzIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgZm9yIGEgcGVlci4KLSAgLy8gfHBfcGVlcl9jb2RlY19jYXBhYmlsdGl0aWVzfCBpcyB0aGUgcGVlciBjb2RlYyBjYXBhYmlsaXRpZXMgdG8gc2V0LgotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICB2aXJ0dWFsIGJvb2wgc2V0UGVlckNvZGVjQ2FwYWJpbGl0aWVzKAotICAgICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcykgPSAwOwotCi0gIC8vIENvbnN0cnVjdG9yIHdoZXJlIHxjb2RlY19pbmRleHwgaXMgdGhlIHVuaXF1ZSBpbmRleCB0aGF0IGlkZW50aWZpZXMgdGhlCi0gIC8vIGNvZGVjLiBUaGUgdXNlci1mcmllbmRseSBuYW1lIGlzIHxuYW1lfC4KLSAgLy8gVGhlIGRlZmF1bHQgY29kZWMgcHJpb3JpdHkgaXMgfGNvZGVjX3ByaW9yaXR5fC4gSWYgdGhlIHZhbHVlIGlzCi0gIC8vIHxCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVHwsIHRoZSBjb2RlYyBwcmlvcml0eSBpcyBjb21wdXRlZAotICAvLyBpbnRlcm5hbGx5LgotICBBMmRwQ29kZWNDb25maWcoYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNfcHJpb3JpdHkpOwotCi0gIC8vIEluaXRpYWxpemVzIHRoZSBjb2RlYyBlbnRyeS4KLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgdmlydHVhbCBib29sIGluaXQoKSA9IDA7Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGludGVybmFsIHN0YXRlIGlzIHZhbGlkCi0gIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIEEyRFAgQ29kZWMgQ29uZmlndXJhdGlvbiBpcyB2YWxpZC4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIEEyRFAgQ29kZWMgQ29uZmlndXJhdGlvbiBzdG9yZWQgaW4gfGNvZGVjX2NvbmZpZ3wKLSAgLy8gaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS4KLSAgc3RhdGljIGJvb2wgY29kZWNDb25maWdJc1ZhbGlkKGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfY29uZmlnKTsKLQotICAvLyBHZXRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQTJEUCBDb2RlYyBDb25maWd1cmF0aW9uLgotICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQTJEUCBDb2RlYyBDb25maWd1cmF0aW9uIHN0b3JlZAotICAvLyBpbiB8Y29kZWNfY29uZmlnfC4gVGhlIGZvcm1hdCBpczoKLSAgLy8gIlJhdGU9NDQxMDB8NDgwMDAgQml0cz0xNnwyNCBNb2RlPU1PTk98U1RFUkVPIgotICBzdGF0aWMgc3RkOjpzdHJpbmcgY29kZWNDb25maWcyU3RyKAotICAgICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcpOwotCi0gIC8vIEdldHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBBMkRQIENvZGVjIFNhbXBsZSBSYXRlLgotICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQTJEUCBDb2RlYyBTYW1wbGUgUmF0ZSBzdG9yZWQKLSAgLy8gaW4gfGNvZGVjX3NhbXBsZV9yYXRlfC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcyBzdG9yZWQgaW4KLSAgLy8gfGNvZGVjX3NhbXBsZV9yYXRlfCwgdGhlIHJldHVybiBzdHJpbmcgZm9ybWF0IGlzICJyYXRlMXxyYXRlMnxyYXRlMyIuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBjb2RlY1NhbXBsZVJhdGUyU3RyKAotICAgICAgYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QgY29kZWNfc2FtcGxlX3JhdGUpOwotCi0gIC8vIEdldHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBBMkRQIENvZGVjIEJpdHMgUGVyIFNhbXBsZS4KLSAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIEEyRFAgQ29kZWMgQml0cyBQZXIgU2FtcGxlIHN0b3JlZAotICAvLyBpbiB8Y29kZWNfYml0c19wZXJfc2FtcGxlfC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcyBzdG9yZWQgaW4KLSAgLy8gfGNvZGVjX2JpdHNfcGVyX3NhbXBsZXwsIHRoZSByZXR1cm4gc3RyaW5nIGZvcm1hdCBpcyAiYml0czF8Yml0czJ8Yml0czMiLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgY29kZWNCaXRzUGVyU2FtcGxlMlN0cigKLSAgICAgIGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdCBjb2RlY19iaXRzX3Blcl9zYW1wbGUpOwotCi0gIC8vIEdldHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBBMkRQIENvZGVjIENoYW5uZWwgTW9kZS4KLSAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIEEyRFAgQ2hhbm5lbCBNb2RlIHN0b3JlZAotICAvLyBpbiB8Y29kZWNfY2hhbm5lbF9tb2RlfC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZhbHVlcyBzdG9yZWQgaW4KLSAgLy8gfGNvZGVjX2NoYW5uZWxfbW9kZXwsIHRoZSByZXR1cm4gc3RyaW5nIGZvcm1hdCBpcyAibW9kZTF8bW9kZTJ8bW9kZTMiLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgY29kZWNDaGFubmVsTW9kZTJTdHIoCi0gICAgICBidGF2X2EyZHBfY29kZWNfY2hhbm5lbF9tb2RlX3QgY29kZWNfY2hhbm5lbF9tb2RlKTsKLQotICAvLyBEdW1wcyBjb2RlYy1yZWxhdGVkIGluZm9ybWF0aW9uLgotICAvLyBUaGUgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBpbiB1c2VyLWZyaWVuZGx5IGZvcm0gdG8gZmlsZSBkZXNjcmlwdG9yIHxmZHwuCi0gIHZpcnR1YWwgdm9pZCBkZWJ1Z19jb2RlY19kdW1wKGludCBmZCk7Ci0KLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggY29kZWNfbXV0ZXhfOwotICBjb25zdCBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleF87ICAvLyBUaGUgdW5pcXVlIGNvZGVjIGluZGV4Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOyAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlYyBuYW1lCi0gIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5XzsgIC8vIENvZGVjIHByaW9yaXR5OiBtdXN0IGJlIHVuaXF1ZQotICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBkZWZhdWx0X2NvZGVjX3ByaW9yaXR5XzsKLQotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnXzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX2NhcGFiaWxpdHlfOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfbG9jYWxfY2FwYWJpbGl0eV87Ci0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19zZWxlY3RhYmxlX2NhcGFiaWxpdHlfOwotCi0gIC8vIFRoZSBvcHRpb25hbCB1c2VyIGNvbmZpZ3VyYXRpb24uIFRoZSB2YWx1ZXMgKGlmIHNldCkgYXJlIHVzZWQKLSAgLy8gYXMgYSBwcmVmZXJlbmNlIHdoZW4gdGhlcmUgaXMgYSBjaG9pY2UuIElmIGEgcGFydGljdWxhciB2YWx1ZQotICAvLyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsb2NhbCBvciByZW1vdGUgZGV2aWNlLCBpdCBpcyBpZ25vcmVkLgotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfdXNlcl9jb25maWdfOwotCi0gIC8vIFRoZSBzZWxlY3RlZCBhdWRpbyBmZWVkaW5nIGNvbmZpZ3VyYXRpb24uCi0gIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBjb2RlY19hdWRpb19jb25maWdfOwotCi0gIHVpbnQ4X3Qgb3RhX2NvZGVjX2NvbmZpZ19bQVZEVF9DT0RFQ19TSVpFXTsKLSAgdWludDhfdCBvdGFfY29kZWNfcGVlcl9jYXBhYmlsaXR5X1tBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IG90YV9jb2RlY19wZWVyX2NvbmZpZ19bQVZEVF9DT0RFQ19TSVpFXTsKLX07Ci0KLWNsYXNzIEEyZHBDb2RlY3MgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IgZm9yIGNsYXNzIHxBMmRwQ29kZWNzfC4KLSAgLy8gfGNvZGVjX3ByaW9yaXRpZXN8IGNvbnRhaW5zIHRoZSBjb2RlYyBwcmlvcml0aWVzIHRvIHVzZS4KLSAgQTJkcENvZGVjcyhjb25zdCBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+JiBjb2RlY19wcmlvcml0aWVzKTsKLSAgfkEyZHBDb2RlY3MoKTsKLQotICAvLyBJbml0aWFsaXplcyBhbGwgc3VwcG9ydGVkIGNvZGVjcy4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBTb3VyY2UgY29kZWMgYW5kIG9uZSBTaW5rIGNvZGVjIHdlcmUKLSAgLy8gaW5pdGlhbGl6ZWQsIG90aGVyd2lzZSBmYWxzZS4KLSAgYm9vbCBpbml0KCk7Ci0KLSAgLy8gRmluZHMgdGhlIFNvdXJjZSBjb2RlYyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBBMkRQIG92ZXItdGhlLWFpcgotICAvLyB8cF9jb2RlY19pbmZvfCBpbmZvcm1hdGlvbi4KLSAgLy8gUmV0dXJucyB0aGUgU291cmNlIGNvZGVjIGlmIGZvdW5kLCBvdGhlcndpc2UgbnVsbHB0ci4KLSAgQTJkcENvZGVjQ29uZmlnKiBmaW5kU291cmNlQ29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotICAvLyBGaW5kcyB0aGUgU2luayBjb2RlYyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBBMkRQIG92ZXItdGhlLWFpcgotICAvLyB8cF9jb2RlY19pbmZvfCBpbmZvcm1hdGlvbi4KLSAgLy8gUmV0dXJucyB0aGUgU2luayBjb2RlYyBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGxwdHIuCi0gIEEyZHBDb2RlY0NvbmZpZyogZmluZFNpbmtDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0gIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBjb2RlYyBmb3IgfGNvZGVjX2luZGV4fCBpcyBzdXBwb3J0ZWQuCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZWMgaXMgc3VwcG9ydGVkLCBvdGhlcndpc2UgZmFsc2UuCi0gIGJvb2wgaXNTdXBwb3J0ZWRDb2RlYyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCk7Ci0KLSAgLy8gR2V0cyB0aGUgY29kZWMgY29uZmlnIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAvLyBSZXR1cm5zIHRoZSBjb2RlYyBjb25maWcgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIG9yIG51bGxwdHIgaWYKLSAgLy8gbm8gY29kZWMgaXMgc2VsZWN0ZWQuCi0gIEEyZHBDb2RlY0NvbmZpZyogZ2V0Q3VycmVudENvZGVjQ29uZmlnKCkgY29uc3QgewotICAgIHJldHVybiBjdXJyZW50X2NvZGVjX2NvbmZpZ187Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBsaXN0IG9mIFNvdXJjZSBjb2RlY3Mgb3JkZXJlZCBieSBwcmlvcml0eTogaGlnaGVyIHByaW9yaXR5IGZpcnN0LgotICBjb25zdCBzdGQ6Omxpc3Q8QTJkcENvZGVjQ29uZmlnKj4gb3JkZXJlZFNvdXJjZUNvZGVjcygpIGNvbnN0IHsKLSAgICByZXR1cm4gb3JkZXJlZF9zb3VyY2VfY29kZWNzXzsKLSAgfQotCi0gIC8vIEdldHMgdGhlIGxpc3Qgb2YgU2luayBjb2RlY3Mgb3JkZXJlZCBieSBwcmlvcml0eTogaGlnaGVyIHByaW9yaXR5IGZpcnN0LgotICBjb25zdCBzdGQ6Omxpc3Q8QTJkcENvZGVjQ29uZmlnKj4gb3JkZXJlZFNpbmtDb2RlY3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9yZGVyZWRfc2lua19jb2RlY3NfOwotICB9Ci0KLSAgLy8gU2V0cyB0aGUgQTJEUCBTb3VyY2UtdG8tU2luayBjb2RlYyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQKLSAgLy8gd2l0aCBhIHBlZXIgU2luayBkZXZpY2UuCi0gIC8vIHxwX3BlZXJfY29kZWNfaW5mb3wgaXMgdGhlIHBlZXIncyBBMkRQIFNpbmsgY29kZWMgaW5mb3JtYXRpb24KLSAgLy8gdG8gdXNlLiBJZiB8aXNfY2FwYWJpbGl0eXwgaXMgdHJ1ZSwgdGhlbiB8cF9wZWVyX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZQotICAvLyBwZWVyJ3MgQTJEUCBTaW5rIGNvZGVjIGNhcGFiaWxpdHksIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgcGVlcidzCi0gIC8vIHByZWZlcnJlZCBBMkRQIGNvZGVjIGNvbmZpZ3VyYXRpb24gdG8gdXNlLgotICAvLyBJZiB0aGUgY29kZWMgY2FuIGJlIHVzZWQgYW5kIHxzZWxlY3RfY3VycmVudF9jb2RlY3wgaXMgdHJ1ZSwgdGhlbgotICAvLyB0aGlzIGNvZGVjIGlzIHNlbGVjdGVkIGFzIHRoZSBjdXJyZW50IG9uZS4KLSAgLy8KLSAgLy8gVGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gaXMgYnVpbHQgYnkgY29uc2lkZXJpbmcgdGhlIG9wdGlvbmFsIHVzZXIKLSAgLy8gY29uZmlndXJhdGlvbiwgdGhlIGxvY2FsIGNvZGVjIGNhcGFiaWxpdGllcywgdGhlIHBlZXIncyBjb2RlYwotICAvLyBjYXBhYmlsaXRpZXMsIGFuZCB0aGUgY29kZWMncyBsb2NhbGx5LWRlZmluZWQgZGVmYXVsdCB2YWx1ZXMuCi0gIC8vIEZvciBlYWNoIGNvZGVjIHBhcmFtZXRlcjoKLSAgLy8KLSAgLy8gMS4gSWYgaXQgaXMgdXNlci1jb25maWd1cmFibGUgcGFyYW1ldGVyIChzYW1wbGUgcmF0ZSwgYml0cyBwZXIgc2FtcGxlLAotICAvLyAgICBjaGFubmVsIG1vZGUsIGFuZCBzb21lIGNvZGVjLXNwZWNpZmljIHBhcmFtZXRlcnMpLAotICAvLyAgICBpZiB0aGUgdXNlciBoYXMgYW4gZXhwbGljaXQgcHJlZmVyZW5jZSwgYW5kIHRoYXQgcHJlZmVyZW5jZQotICAvLyAgICBpcyBzdXBwb3J0ZWQgYnkgYm90aCB0aGUgbG9jYWwgYW5kIHJlbW90ZSBkZXZpY2UsIHRoaXMgaXMgdGhlCi0gIC8vICAgIHBhcmFtZXRlciB2YWx1ZSB0aGF0IGlzIHVzZWQuCi0gIC8vIDIuIE90aGVyd2lzZSwgaWYgdGhlIGV4cGxpY2l0IGludGVybmFsIGRlZmF1bHQgdmFsdWUgaXMgc3VwcG9ydGVkCi0gIC8vICAgIGJ5IGJvdGggdGhlIGxvY2FsIGFuZCByZW1vdGUgZGV2aWNlLCB0aGlzIGlzIHRoZSBwYXJhbWV0ZXIgdmFsdWUKLSAgLy8gICAgdGhhdCBpcyB1c2VkLgotICAvLyAzLiBPdGhlcndpc2UsIHRoZSBiZXN0IG1hdGNoIGlzIGNob3NlbiBhbW9uZyBhbGwgdmFsdWVzIHN1cHBvcnRlZCBieQotICAvLyAgICB0aGUgbG9jYWwgYW5kIHJlbW90ZSBkZXZpY2UuCi0gIC8vCi0gIC8vIEluIGFkZGl0aW9uLCB0aGUgY29kZWMncyBpbnRlcm5hbCBzdGF0ZSBpcyB1cGRhdGVkIHRvIHJlZmxlY3QKLSAgLy8gdGhlIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBhZHZlcnRpc2VkIHRvIHRoZSB1cHN0cmVhbSBhdWRpbyBzb3VyY2UKLSAgLy8gKE1lZGlhIEZyYW1ld29yaykgdG8gbWFrZSBydW4tdGltZSBhdWRpbyBwYXJhbWV0ZXIgY2hvaWNlczoKLSAgLy8gNC4gSWYgdGhlIHVzZXItY29uZmlndXJhYmxlIHBhcmFtZXRlciB3YXMgc2VsZWN0ZWQsIHRoaXMgaXMgdGhlCi0gIC8vICAgIG9ubHkgcGFyYW1ldGVyIHZhbHVlIHRoYXQgaXMgYWR2ZXJ0aXNlZCB0byB0aGUgTWVkaWEgRnJhbWV3b3JrLgotICAvLyA1LiBPdGhlcndpc2UsIGFsbCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGJvdGggdGhlIGxvY2FsIGFuZCByZW1vdGUKLSAgLy8gICAgZGV2aWNlcyBhcmUgYWR2ZXJ0aXNlZCB0byB0aGUgTWVkaWEgRnJhbWV3b3JrLgotICAvLwotICAvLyBUaGUgcmVzdWx0IGNvZGVjIGNvbmZpZ3VyYXRpb24gaXMgc3RvcmVkIGluIHxwX3Jlc3VsdF9jb2RlY19jb25maWd8LgotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXdpc2UgZmFsc2UuCi0gIGJvb2wgc2V0Q29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZWxlY3RfY3VycmVudF9jb2RlYyk7Ci0KLSAgLy8gU2V0cyB0aGUgQTJEUCBTaW5rIGNvZGVjIGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCB3aXRoIGEgcGVlciBTb3VyY2UKLSAgLy8gZGV2aWNlLgotICAvLyBbU2VlIHNldENvZGVjQ29uZmlnKCkgZm9yIGRlc2NyaXB0aW9uXQotICBib29sIHNldFNpbmtDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VsZWN0X2N1cnJlbnRfY29kZWMpOwotCi0gIC8vIFNldHMgdGhlIHVzZXIgcHJlZmVyZWQgY29kZWMgY29uZmlndXJhdGlvbi4KLSAgLy8gfGNvZGVjX3VzZXJfY29uZmlnfCBjb250YWlucyB0aGUgcHJlZmVycmVkIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0gIC8vIHxwX3BlZXJfcGFyYW1zfCBjb250YWlucyB0aGUgQTJEUCBwZWVyIGluZm9ybWF0aW9uLgotICAvLyB8cF9wZWVyX3NpbmtfY2FwYWJpbGl0aWVzfCBpcyB0aGUgcGVlcidzIEEyRFAgU2luayBjb2RlYyBjYXBhYmlsaXRpZXMKLSAgLy8gdG8gdXNlLgotICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIHRoYXQgcmVxdWlyZXMgcmVzdGFydGluZwotICAvLyB0aGUgYXVkaW8gaW5wdXQgc3RyZWFtLCBmbGFnIHxwX3Jlc3RhcnRfaW5wdXR8IGlzIHNldCB0byB0cnVlLgotICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIHRoYXQgcmVxdWlyZXMgcmVzdGFydGluZwotICAvLyBvZiB0aGUgQTJEUCBjb25uZWN0aW9uLCBmbGFnIHxwX3Jlc3RhcnRfb3V0cHV0fCBpcyBzZXQgdG8gdHJ1ZSwgYW5kIHRoZQotICAvLyBuZXcgY29kZWMgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdF9jb2RlY19jb25maWd8LgotICAvLyBJZiB0aGVyZSBpcyBhbnkgY2hhbmdlIGluIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uLCBmbGFnIHxwX2NvbmZpZ191cGRhdGVkfAotICAvLyBpcyBzZXQgdG8gdHJ1ZS4KLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgYm9vbCBzZXRDb2RlY1VzZXJDb25maWcoY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TKiBwX3BlZXJfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywgYm9vbCogcF9yZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKTsKLQotICAvLyBTZXRzIHRoZSBBdWRpbyBIQUwgc2VsZWN0ZWQgYXVkaW8gZmVlZGluZyBwYXJhbWV0ZXJzLgotICAvLyBUaG9zZSBwYXJhbWV0ZXJzIGFyZSBhcHBsaWVkIG9ubHkgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb2RlYy4KLSAgLy8gfGNvZGVjX2F1ZGlvX2NvbmZpZ3wgY29udGFpbnMgdGhlIHNlbGVjdGVkIGF1ZGlvIGZlZWRpbmcgY29uZmlndXJhdGlvbi4KLSAgLy8gfHBfcGVlcl9wYXJhbXN8IGNvbnRhaW5zIHRoZSBBMkRQIHBlZXIgaW5mb3JtYXRpb24uCi0gIC8vIHxwX3BlZXJfc2lua19jYXBhYmlsaXRpZXN8IGlzIHRoZSBwZWVyJ3MgQTJEUCBTaW5rIGNvZGVjIGNhcGFiaWxpdGllcwotICAvLyB0byB1c2UuCi0gIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gdGhhdCByZXF1aXJlcyByZXN0YXJ0aW5nCi0gIC8vIG9mIHRoZSBBMkRQIGNvbm5lY3Rpb24sIGZsYWcgfHBfcmVzdGFydF9vdXRwdXR8IGlzIHNldCB0byB0cnVlLCBhbmQgdGhlCi0gIC8vIG5ldyBjb2RlYyBpcyBzdG9yZWQgaW4gfHBfcmVzdWx0X2NvZGVjX2NvbmZpZ3wuCi0gIC8vIElmIHRoZXJlIGlzIGFueSBjaGFuZ2UgaW4gdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24sIGZsYWcgfHBfY29uZmlnX3VwZGF0ZWR8Ci0gIC8vIGlzIHNldCB0byB0cnVlLgotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICBib29sIHNldENvZGVjQXVkaW9Db25maWcoY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19hdWRpb19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKTsKLQotICAvLyBTZXRzIHRoZSBPdmVyLVRoZS1BaXIgcHJlZmVycmVkIGNvZGVjIGNvbmZpZ3VyYXRpb24uCi0gIC8vIFRoZSBPVEEgcHJlZmVyZWQgY29kZWMgY29uZmlndXJhdGlvbiBpcyBpZ25vcmVkIGlmIHRoZSBjdXJyZW50Ci0gIC8vIGNvZGVjIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgZXhwbGljaXQgdXNlciBjb25maWd1cmF0aW9uLCBvciBpZiB0aGUKLSAgLy8gY29kZWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNhbWUgY29kZWMgY29udGFpbnMgZXhwbGljaXQgdXNlcgotICAvLyBjb25maWd1cmF0aW9uLgotICAvLyB8cF9vdGFfY29kZWNfY29uZmlnfCBjb250YWlucyB0aGUgcmVjZWl2ZWQgT1RBIEEyRFAgY29kZWMgY29uZmlndXJhdGlvbgotICAvLyBmcm9tIHRoZSByZW1vdGUgcGVlci4gTm90ZTogdGhpcyBpcyBub3QgdGhlIHBlZXIgY29kZWMgY2FwYWJpbGl0eSwKLSAgLy8gYnV0IHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIHRoYXQgdGhlIHBlZXIgd291bGQgbGlrZSB0byB1c2UuCi0gIC8vIHxwX3BlZXJfcGFyYW1zfCBjb250YWlucyB0aGUgQTJEUCBwZWVyIGluZm9ybWF0aW9uLgotICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIHRoYXQgcmVxdWlyZXMgcmVzdGFydGluZwotICAvLyB0aGUgYXVkaW8gaW5wdXQgc3RyZWFtLCBmbGFnIHxwX3Jlc3RhcnRfaW5wdXR8IGlzIHNldCB0byB0cnVlLgotICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIHRoYXQgcmVxdWlyZXMgcmVzdGFydGluZwotICAvLyBvZiB0aGUgQTJEUCBjb25uZWN0aW9uLCBmbGFnIHxwX3Jlc3RhcnRfb3V0cHV0fCBpcyBzZXQgdG8gdHJ1ZSwgYW5kIHRoZQotICAvLyBuZXcgY29kZWMgaXMgc3RvcmVkIGluIHxwX3Jlc3VsdF9jb2RlY19jb25maWd8LgotICAvLyBJZiB0aGVyZSBpcyBhbnkgY2hhbmdlIGluIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uLCBmbGFnIHxwX2NvbmZpZ191cGRhdGVkfAotICAvLyBpcyBzZXQgdG8gdHJ1ZS4KLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgYm9vbCBzZXRDb2RlY090YUNvbmZpZyhjb25zdCB1aW50OF90KiBwX290YV9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TKiBwX3BlZXJfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywgYm9vbCogcF9yZXN0YXJ0X2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQsIGJvb2wqIHBfY29uZmlnX3VwZGF0ZWQpOwotCi0gIC8vIFNldHMgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBmb3IgYSBTaW5rIHBlZXIuCi0gIC8vIHxwX3BlZXJfY29kZWNfY2FwYWJpbHRpdGllc3wgaXMgdGhlIHBlZXIgY29kZWMgY2FwYWJpbGl0aWVzIHRvIHNldC4KLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLSAgYm9vbCBzZXRQZWVyU2lua0NvZGVjQ2FwYWJpbGl0aWVzKGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpOwotCi0gIC8vIFNldHMgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBmb3IgYSBTb3VyY2UgcGVlci4KLSAgLy8gfHBfcGVlcl9jb2RlY19jYXBhYmlsdGl0aWVzfCBpcyB0aGUgcGVlciBjb2RlYyBjYXBhYmlsaXRpZXMgdG8gc2V0LgotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotICBib29sIHNldFBlZXJTb3VyY2VDb2RlY0NhcGFiaWxpdGllcyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IGNvZGVjIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YKLSAgLy8gYWxsIGNvbmZpZ3VyZWQgY29kZWNzLgotICAvLyBUaGUgY3VycmVudCBjb2RlYyBjb25maWd1cmF0aW9uIGlzIHN0b3JlZCBpbiB8cF9jb2RlY19jb25maWd8LgotICAvLyBMb2NhbCBkZXZpY2UncyBjb2RlY3MgY2FwYWJpbGl0aWVzIGFyZSBzdG9yZWQgaW4KLSAgLy8gfHBfY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllc3wuCi0gIC8vIFRoZSBjb2RlY3MgY2FwYWJpbGl0aWVzIHRoYXQgY2FuIGJlIHVzZWQgYmV0d2VlbiB0aGUgbG9jYWwgZGV2aWNlCi0gIC8vIGFuZCB0aGUgcmVtb3RlIGRldmljZSBhcmUgc3RvcmVkIGluIHxwX2NvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllc3wuCi0gIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi0gIGJvb2wgZ2V0Q29kZWNDb25maWdBbmRDYXBhYmlsaXRpZXMoCi0gICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QqIHBfY29kZWNfY29uZmlnLAotICAgICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiogcF9jb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiogcF9jb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXMpOwotCi0gIC8vIER1bXBzIGNvZGVjLXJlbGF0ZWQgaW5mb3JtYXRpb24uCi0gIC8vIFRoZSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIGluIHVzZXItZnJpZW5kbHkgZm9ybSB0byBmaWxlIGRlc2NyaXB0b3IgfGZkfC4KLSAgdm9pZCBkZWJ1Z19jb2RlY19kdW1wKGludCBmZCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgQ29tcGFyZUJ0QmRhZGRyCi0gICAgICA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxSYXdBZGRyZXNzLCBSYXdBZGRyZXNzLCBib29sPiB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGxocywgY29uc3QgUmF3QWRkcmVzcyYgcmhzKSBjb25zdCB7Ci0gICAgICByZXR1cm4gKG1lbWNtcCgmbGhzLCAmcmhzLCBzaXplb2YobGhzKSkgPCAwKTsKLSAgICB9Ci0gIH07Ci0gIHR5cGVkZWYgc3RkOjptYXA8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3QsIEEyZHBDb2RlY0NvbmZpZyo+IEluZGV4ZWRDb2RlY3M7Ci0KLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggY29kZWNfbXV0ZXhfOwotICBBMmRwQ29kZWNDb25maWcqIGN1cnJlbnRfY29kZWNfY29uZmlnXzsgIC8vIEN1cnJlbnRseSBzZWxlY3RlZCBjb2RlYwotICBzdGQ6Om1hcDxidGF2X2EyZHBfY29kZWNfaW5kZXhfdCwgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3Q+Ci0gICAgICBjb2RlY19wcmlvcml0aWVzXzsKLQotICBJbmRleGVkQ29kZWNzIGluZGV4ZWRfY29kZWNzXzsgICAgICAgICAgIC8vIFRoZSBjb2RlY3MgaW5kZXhlZCBieSBjb2RlYyBpbmRleAotICBJbmRleGVkQ29kZWNzIGRpc2FibGVkX2NvZGVjc187ICAgICAgICAgIC8vIFRoZSBkaXNhYmxlZCBjb2RlY3MKLQotICAvLyBBMkRQIFNvdXJjZSBjb2RlY3Mgb3JkZXJlZCBieSBwcmlvcml0eQotICBzdGQ6Omxpc3Q8QTJkcENvZGVjQ29uZmlnKj4gb3JkZXJlZF9zb3VyY2VfY29kZWNzXzsKLQotICAvLyBBMkRQIFNpbmsgY29kZWNzIG9yZGVyZWQgYnkgcHJpb3JpdHkKLSAgc3RkOjpsaXN0PEEyZHBDb2RlY0NvbmZpZyo+IG9yZGVyZWRfc2lua19jb2RlY3NfOwotCi0gIHN0ZDo6bWFwPFJhd0FkZHJlc3MsIEluZGV4ZWRDb2RlY3MqLCBDb21wYXJlQnRCZGFkZHI+IHBlZXJfY29kZWNzXzsKLX07Ci0KLS8qKgotICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBBMkRQIGZlZWRpbmcuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEEyRFBfU0FNUExFX1JBVEUgc2FtcGxlX3JhdGU7ICAgICAgICAgIC8vIDQ0MTAwLCA0ODAwMCwgZXRjCi0gIHRBMkRQX0JJVFNfUEVSX1NBTVBMRSBiaXRzX3Blcl9zYW1wbGU7ICAvLyA4LCAxNiwgMjQsIDMyCi0gIHRBMkRQX0NIQU5ORUxfQ09VTlQgY2hhbm5lbF9jb3VudDsgICAgICAvLyAxIGZvciBtb25vIG9yIDIgZm9yIHN0ZXJlbwotfSB0QTJEUF9GRUVESU5HX1BBUkFNUzsKLQotLy8gUHJvdG90eXBlIGZvciBhIGNhbGxiYWNrIHRvIHJlYWQgYXVkaW8gZGF0YSBmb3IgZW5jb2RpbmcuCi0vLyB8cF9idWZ8IGlzIHRoZSBidWZmZXIgdG8gc3RvcmUgdGhlIGRhdGEuIHxsZW58IGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIHRvCi0vLyByZWFkLgotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9jdGV0cyByZWFkLgotdHlwZWRlZiB1aW50MzJfdCAoKmEyZHBfc291cmNlX3JlYWRfY2FsbGJhY2tfdCkodWludDhfdCogcF9idWYsIHVpbnQzMl90IGxlbik7Ci0KLS8vIFByb3RvdHlwZSBmb3IgYSBjYWxsYmFjayB0byBlbnF1ZXVlIEEyRFAgU291cmNlIHBhY2tldHMgZm9yIHRyYW5zbWlzc2lvbi4KLS8vIHxwX2J1ZnwgaXMgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhdWRpbyBkYXRhIHRvIGVucXVldWUuIFRoZSBjYWxsYmFjayBpcwotLy8gcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgfHBfYnVmfC4KLS8vIHxmcmFtZXNfbnwgaXMgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgaW4gfHBfYnVmfCAtIGl0IGlzIHVzZWQgZm9yCi0vLyBzdGF0aXN0aWNzIHB1cnBvc2UuCi0vLyB8bnVtX2J5dGVzfCBpcyB0aGUgbnVtYmVyIG9mIGF1ZGlvIGJ5dGVzIGluIHxwX2J1ZnwgLSBpdCBpcyB1c2VkIGZvcgotLy8gZGVsYXkgcmVwb3J0aW5nLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwYWNrZXQgd2FzIGVucXVldWVkLCBvdGhlcndpc2UgZmFsc2UuCi10eXBlZGVmIGJvb2wgKCphMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QpKEJUX0hEUiogcF9idWYsIHNpemVfdCBmcmFtZXNfbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX2J5dGVzKTsKLQotLy8KLS8vIEEyRFAgZW5jb2RlciBjYWxsYmFja3MgaW50ZXJmYWNlLgotLy8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgQTJEUCBlbmNvZGVyLgotICAvLyB8cF9wZWVyX3BhcmFtc3wgY29udGFpbnMgdGhlIEEyRFAgcGVlciBpbmZvcm1hdGlvbgotICAvLyBUaGUgY3VycmVudCBBMkRQIGNvZGVjIGNvbmZpZyBpcyBpbiB8YTJkcF9jb2RlY19jb25maWd8LgotICAvLyB8cmVhZF9jYWxsYmFja3wgaXMgdGhlIGNhbGxiYWNrIGZvciByZWFkaW5nIHRoZSBpbnB1dCBhdWRpbyBkYXRhLgotICAvLyB8ZW5xdWV1ZV9jYWxsYmFja3wgaXMgdGhlIGNhbGxiYWNrIGZvciBlbnF1ZXVlaW5nIHRoZSBlbmNvZGVkIGF1ZGlvIGRhdGEuCi0gIHZvaWQgKCplbmNvZGVyX2luaXQpKGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIGEyZHBfc291cmNlX2VucXVldWVfY2FsbGJhY2tfdCBlbnF1ZXVlX2NhbGxiYWNrKTsKLQotICAvLyBDbGVhbnVwIHRoZSBBMkRQIGVuY29kZXIuCi0gIHZvaWQgKCplbmNvZGVyX2NsZWFudXApKHZvaWQpOwotCi0gIC8vIFJlc2V0IHRoZSBmZWVkaW5nIGZvciB0aGUgQTJEUCBlbmNvZGVyLgotICB2b2lkICgqZmVlZGluZ19yZXNldCkodm9pZCk7Ci0KLSAgLy8gRmx1c2ggdGhlIGZlZWRpbmcgZm9yIHRoZSBBMkRQIGVuY29kZXIuCi0gIHZvaWQgKCpmZWVkaW5nX2ZsdXNoKSh2b2lkKTsKLQotICAvLyBHZXQgdGhlIEEyRFAgZW5jb2RlciBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKS4KLSAgdWludDY0X3QgKCpnZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcykodm9pZCk7Ci0KLSAgLy8gR2V0IHRoZSBBMkRQIGVuY29kZWQgbWF4aW11bSBmcmFtZSBzaXplIChzaW1pbGFyIHRvIE1UVSkuCi0gIGludCAoKmdldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSkodm9pZCk7Ci0KLSAgLy8gUHJlcGFyZSBhbmQgc2VuZCBBMkRQIGVuY29kZWQgZnJhbWVzLgotICAvLyB8dGltZXN0YW1wX3VzfCBpcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgKGluIG1pY3Jvc2Vjb25kcykuCi0gIHZvaWQgKCpzZW5kX2ZyYW1lcykodWludDY0X3QgdGltZXN0YW1wX3VzKTsKLQotICAvLyBTZXQgdHJhbnNtaXQgcXVldWUgbGVuZ3RoIGZvciB0aGUgQTJEUCBlbmNvZGVyLgotICB2b2lkICgqc2V0X3RyYW5zbWl0X3F1ZXVlX2xlbmd0aCkoc2l6ZV90IHRyYW5zbWl0X3F1ZXVlX2xlbmd0aCk7Ci19IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFOwotCi0vLyBQcm90b3R5cGUgZm9yIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSBkZWNvZGVkIGF1ZGlvIGRhdGEgZnJvbSBhCi0vLyB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRXwuCi0vLyB8YnVmfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEuCi0vLyB8bGVufCBpcyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBwb2ludGVkIHRvIGJ5IHxidWZ8LgotdHlwZWRlZiB2b2lkICgqZGVjb2RlZF9kYXRhX2NhbGxiYWNrX3QpKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotLy8KLS8vIEEyRFAgZGVjb2RlciBjYWxsYmFja3MgaW50ZXJmYWNlLgotLy8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4gQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgd2lsbCByZWluaXRhbGl6ZS4KLSAgYm9vbCAoKmRlY29kZXJfaW5pdCkoZGVjb2RlZF9kYXRhX2NhbGxiYWNrX3QgZGVjb2RlX2NhbGxiYWNrKTsKLQotICAvLyBDbGVhbnVwIHRoZSBBMkRQIGRlY29kZXIuCi0gIHZvaWQgKCpkZWNvZGVyX2NsZWFudXApKCk7Ci0KLSAgLy8gRGVjb2RlcyB8cF9idWZ8IGFuZCBjYWxscyB8ZGVjb2RlX2NhbGxiYWNrfCBwYXNzZWQgaW50byBpbml0IGZvciB0aGUKLSAgLy8gZGVjb2RlZCBkYXRhLgotICBib29sICgqZGVjb2RlX3BhY2tldCkoQlRfSERSKiBwX2J1Zik7Ci0KLSAgLy8gU3RhcnQgdGhlIEEyRFAgZGVjb2Rlci4KLSAgdm9pZCAoKmRlY29kZXJfc3RhcnQpKCk7Ci0KLSAgLy8gU3VzcGVuZCB0aGUgQTJEUCBkZWNvZGVyLgotICB2b2lkICgqZGVjb2Rlcl9zdXNwZW5kKSgpOwotCi0gIC8vIEEyRFAgZGVjb2RlciBjb25maWd1cmF0aW9uLgotICB2b2lkICgqZGVjb2Rlcl9jb25maWd1cmUpKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci19IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFOwotCi0vLyBHZXRzIHRoZSBBMkRQIGNvZGVjIHR5cGUuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotdEEyRFBfQ09ERUNfVFlQRSBBMkRQX0dldENvZGVjVHlwZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBBMkRQIFNvdXJjZSBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgY29kZWMsCi0vLyBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgY29udGFpbiBhIHZhbGlkIEEyRFAgU2luayBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgY29kZWMsCi0vLyBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNTaW5rQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBwZWVyIEEyRFAgU291cmNlCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgY29kZWMsCi0vLyBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNQZWVyU291cmNlQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBwZWVyIEEyRFAgU2luayBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgY29kZWMsCi0vLyBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgYW4gQTJEUCBTaW5rIGNvZGVjIGlzIHN1cHBvcnRlZC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIEEyRFAgU2luayBjb2RlYyBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1NpbmtDb2RlY1N1cHBvcnRlZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciBhbiBBMkRQIFNvdXJjZSBjb2RlYyBmb3IgYSBwZWVyIFNvdXJjZSBkZXZpY2UgaXMgc3VwcG9ydGVkLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBvZiB0aGUKLS8vIHBlZXIgZGV2aWNlLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIFNvdXJjZSBjb2RlYyBmb3IgYSBwZWVyIFNvdXJjZSBkZXZpY2UgaXMgc3VwcG9ydGVkLAotLy8gb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEluaXRpYWxpemUgc3RhdGUgd2l0aCB0aGUgZGVmYXVsdCBBMkRQIGNvZGVjLgotLy8gVGhlIGluaXRpYWxpemVkIHN0YXRlIHdpdGggdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBpcyBzdG9yZWQgaW4KLS8vIHxwX2NvZGVjX2luZm98Lgotdm9pZCBBMkRQX0luaXREZWZhdWx0Q29kZWModWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIEEyRFAgZGF0YSBwYWNrZXRzIHNob3VsZCBjb250YWluIFJUUCBoZWFkZXIuCi0vLyB8Y29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWR8IGlzIHRydWUgaWYgQ29udGVudCBQcm90ZWN0aW9uIGlzCi0vLyBlbmFibGVkLiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIGRhdGEgcGFja2V0cyBzaG91bGQgY29udGFpbiBSVFAgaGVhZGVyLCBvdGhlcndpc2UKLS8vIGZhbHNlLgotYm9vbCBBMkRQX1VzZXNSdHBIZWFkZXIoYm9vbCBjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIHxBVkRUX01FRElBX1RZUEVfKnwgbWVkaWEgdHlwZSBmcm9tIHRoZSBjb2RlYyBjYXBhYmlsaXR5Ci0vLyBpbiB8cF9jb2RlY19pbmZvfC4KLXVpbnQ4X3QgQTJEUF9HZXRNZWRpYVR5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBjb2RlYyBuYW1lIGZvciBhIGdpdmVuIHxwX2NvZGVjX2luZm98LgotY29uc3QgY2hhciogQTJEUF9Db2RlY05hbWUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgY29kZWNzIHxwX2NvZGVjX2luZm9fYXwgYW5kIHxwX2NvZGVjX2luZm9fYnwgaGF2ZQotLy8gdGhlIHNhbWUgdHlwZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGNvZGVjcyBoYXZlIHRoZSBzYW1lIHR5cGUsIG90aGVyd2lzZSBmYWxzZS4KLS8vIElmIHRoZSBjb2RlYyB0eXBlIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlLgotYm9vbCBBMkRQX0NvZGVjVHlwZUVxdWFscyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBDaGVja3Mgd2hldGhlciB0d28gQTJEUCBjb2RlY3MgcF9jb2RlY19pbmZvX2F8IGFuZCB8cF9jb2RlY19pbmZvX2J8IGFyZQotLy8gZXhhY3RseSB0aGUgc2FtZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGNvZGVjcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8gSWYgdGhlIGNvZGVjIHR5cGUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgZmFsc2UuCi1ib29sIEEyRFBfQ29kZWNFcXVhbHMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBHZXRzIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSB2YWx1ZSBmb3IgdGhlIEEyRFAgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRUcmFja1NhbXBsZVJhdGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgdHJhY2sgYml0cyBwZXIgc2FtcGxlIHZhbHVlIGZvciB0aGUgQTJEUCBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSB0cmFjayBiaXRzIHBlciBzYW1wbGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRUcmFja0JpdHNQZXJTYW1wbGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgY2hhbm5lbCBjb3VudCBmb3IgdGhlIEEyRFAgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgY2hhbm5lbCBjb3VudCBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldFRyYWNrQ2hhbm5lbENvdW50KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgdHlwZSBmb3IgdGhlIEEyRFAgU2luayBjb2RlYzoKLS8vIDEgZm9yIG1vbm8sIG9yIDMgZm9yIGR1YWwvc3RlcmVvL2pvaW50LgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIGNoYW5uZWwgdHlwZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldFNpbmtUcmFja0NoYW5uZWxUeXBlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgYXVkaW8gZGF0YSB0aW1lc3RhbXAgZnJvbSBhbiBhdWRpbyBwYWNrZXQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9kYXRhfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIFRoZSB0aW1lc3RhbXAgaXMgc3RvcmVkIGluIHxwX3RpbWVzdGFtcHwuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0dldFBhY2tldFRpbWVzdGFtcChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKTsKLQotLy8gQnVpbGRzIEEyRFAgY29kZWMgaGVhZGVyIGZvciBhdWRpbyBkYXRhLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gfHBfYnVmfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIHxmcmFtZXNfcGVyX3BhY2tldHwgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhpcyBwYWNrZXQuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0J1aWxkQ29kZWNIZWFkZXIoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnJhbWVzX3Blcl9wYWNrZXQpOwotCi0vLyBHZXRzIHRoZSBBMkRQIGVuY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW5jb2RlIGFuZCBwcmVwYXJlCi0vLyBBMkRQIHBhY2tldHMgZm9yIHRyYW5zbWlzc2lvbiAtIHNlZSB8dEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0V8LgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gUmV0dXJucyB0aGUgQTJEUCBlbmNvZGVyIGludGVyZmFjZSBpZiB0aGUgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQgYW5kCi0vLyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBOVUxMLgotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfR2V0RW5jb2RlckludGVyZmFjZSgKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIGRlY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIHJlY2VpdmVkIEEyRFAKLS8vIHBhY2tldHMgLSBzZWUgfHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFfC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIFJldHVybnMgdGhlIEEyRFAgZGVjb2RlciBpbnRlcmZhY2UgaWYgdGhlIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZAotLy8gc3VwcG9ydGVkLCBvdGhlcndpc2UgTlVMTC4KLWNvbnN0IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFKiBBMkRQX0dldERlY29kZXJJbnRlcmZhY2UoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQWRqdXN0cyB0aGUgQTJEUCBjb2RlYywgYmFzZWQgb24gbG9jYWwgc3VwcG9ydCBhbmQgQmx1ZXRvb3RoIHNwZWNpZmljYXRpb24uCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24gdG8gYWRqdXN0LgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZCBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9BZGp1c3RDb2RlYyh1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIFNvdXJjZSBjb2RlYyBpbmRleCBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLS8vIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgfGJ0YXZfYTJkcF9jb2RlY19pbmRleF90fCBvbiBzdWNjZXNzLAotLy8gb3RoZXJ3aXNlIHxCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYfC4KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU291cmNlQ29kZWNJbmRleChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIFNpbmsgY29kZWMgaW5kZXggZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi0vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHxidGF2X2EyZHBfY29kZWNfaW5kZXhfdHwgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB8QlRBVl9BMkRQX0NPREVDX0lOREVYX01BWHwuCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1NpbmtDb2RlY0luZGV4KGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgY29kZWMgbmFtZSBmb3IgYSBnaXZlbiB8Y29kZWNfaW5kZXh8LgotY29uc3QgY2hhciogQTJEUF9Db2RlY0luZGV4U3RyKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KTsKLQotLy8gSW5pdGlhbGl6ZXMgQTJEUCBjb2RlYy1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpbnRvIHxBdmR0cFNlcENvbmZpZ3wKLS8vIGNvbmZpZ3VyYXRpb24gZW50cnkgcG9pbnRlZCBieSB8cF9jZmd8LiBUaGUgc2VsZWN0ZWQgY29kZWMgaXMgZGVmaW5lZAotLy8gYnkgfGNvZGVjX2luZGV4fC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jZmcpOwotCi0vLyBHZXRzIHRoZSBBMkRQIGVmZmVjdGl2ZSBmcmFtZSBzaXplIHRoYXQgZWFjaCBlbmNvZGVkIG1lZGlhIGZyYW1lIHNob3VsZCBub3QKLS8vIGV4Y2VlZCB0aGlzIHZhbHVlLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gUmV0dXJucyB0aGUgZWZmZWN0aXZlIGZyYW1lIHNpemUgaWYgdGhlIGVuY29kZXIgaXMgY29uZmlndXJlZCB3aXRoIHRoaXMKLS8vIHxwX2NvZGVjX2luZm98LCBvdGhlcndpc2UgMC4KLWludCBBMkRQX0dldEVlY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gRGVjb2RlcyBBMkRQIGNvZGVjIGluZm8gaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotc3RkOjpzdHJpbmcgQTJEUF9Db2RlY0luZm9TdHJpbmcoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQWRkIGVudW0tYmFzZWQgZmxhZyBvcGVyYXRvcnMgdG8gdGhlIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBmaWVsZHMKLSNpZm5kZWYgREVGSU5FX0VOVU1fRkxBR19PUEVSQVRPUlMKLS8vIFVzZSBOT0xJTlQgdG8gc3VwcHJlc3MgbWlzc2luZyBwYXJlbnRoZXNlcyB3YXJuaW5ncyBhcm91bmQgYml0bWFzay4KLSNkZWZpbmUgREVGSU5FX0VOVU1fRkxBR19PUEVSQVRPUlMoYml0bWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGV4dGVybiAiQysrIiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3RleHByIGJpdG1hc2sgb3BlcmF0b3ImKGJpdG1hc2sgWCwgYml0bWFzayBZKSB7ICAvKiBOT0xJTlQgKi8gIFwKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Yml0bWFzaz4oc3RhdGljX2Nhc3Q8aW50PihYKSAmIHN0YXRpY19jYXN0PGludD4oWSkpOyBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3RleHByIGJpdG1hc2sgb3BlcmF0b3J8KGJpdG1hc2sgWCwgYml0bWFzayBZKSB7ICAvKiBOT0xJTlQgKi8gIFwKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Yml0bWFzaz4oc3RhdGljX2Nhc3Q8aW50PihYKSB8IHN0YXRpY19jYXN0PGludD4oWSkpOyBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3RleHByIGJpdG1hc2sgb3BlcmF0b3JeKGJpdG1hc2sgWCwgYml0bWFzayBZKSB7ICAvKiBOT0xJTlQgKi8gIFwKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Yml0bWFzaz4oc3RhdGljX2Nhc3Q8aW50PihYKSBeIHN0YXRpY19jYXN0PGludD4oWSkpOyBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3RleHByIGJpdG1hc2sgb3BlcmF0b3J+KGJpdG1hc2sgWCkgeyAgICAgICAgICAgICAvKiBOT0xJTlQgKi8gIFwKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Yml0bWFzaz4ofnN0YXRpY19jYXN0PGludD4oWCkpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgYml0bWFzayYgb3BlcmF0b3ImPShiaXRtYXNrJiBYLCBiaXRtYXNrIFkpIHsgICAgICAgICAvKiBOT0xJTlQgKi8gIFwKLSAgICBYID0gWCAmIFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIFg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGJpdG1hc2smIG9wZXJhdG9yfD0oYml0bWFzayYgWCwgYml0bWFzayBZKSB7ICAgICAgICAgLyogTk9MSU5UICovICBcCi0gICAgWCA9IFggfCBZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBiaXRtYXNrJiBvcGVyYXRvcl49KGJpdG1hc2smIFgsIGJpdG1hc2sgWSkgeyAgICAgICAgIC8qIE5PTElOVCAqLyAgXAotICAgIFggPSBYIF4gWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYgIC8vIERFRklORV9FTlVNX0ZMQUdfT1BFUkFUT1JTCi1ERUZJTkVfRU5VTV9GTEFHX09QRVJBVE9SUyhidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdCk7Ci1ERUZJTkVfRU5VTV9GTEFHX09QRVJBVE9SUyhidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QpOwotREVGSU5FX0VOVU1fRkxBR19PUEVSQVRPUlMoYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90KTsKLQotI2VuZGlmICAvLyBBMkRQX0NPREVDX0FQSV9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfY29uc3RhbnRzLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDdiMjIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX2NvbnN0YW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8KLS8vIEEyRFAgY29uc3RhbnRzIGRlZmluZWQgYnkgdGhlIFByb2ZpbGUgU3BlY2lmaWNhdGlvbgotLy8KLQotI2lmbmRlZiBBMkRQX0NPTlNUQU5UU19ICi0jZGVmaW5lIEEyRFBfQ09OU1RBTlRTX0gKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8qIFByb2ZpbGUgc3VwcG9ydGVkIGZlYXR1cmVzICovCi0jZGVmaW5lIEEyRFBfU1VQRl9QTEFZRVIgMHgwMDAxCi0jZGVmaW5lIEEyRFBfU1VQRl9NSUMgMHgwMDAyCi0jZGVmaW5lIEEyRFBfU1VQRl9UVU5FUiAweDAwMDQKLSNkZWZpbmUgQTJEUF9TVVBGX01JWEVSIDB4MDAwOAotCi0jZGVmaW5lIEEyRFBfU1VQRl9IRUFEUEhPTkUgMHgwMDAxCi0jZGVmaW5lIEEyRFBfU1VQRl9TUEVBS0VSIDB4MDAwMgotI2RlZmluZSBBMkRQX1NVUEZfUkVDT1JERVIgMHgwMDA0Ci0jZGVmaW5lIEEyRFBfU1VQRl9BTVAgMHgwMDA4Ci0KLS8qIEFWIE1lZGlhIENvZGVjIFR5cGVzIChBdWRpbyBDb2RlYyBJRCkgKi8KLSNkZWZpbmUgQTJEUF9NRURJQV9DVF9TQkMgMHgwMCAvKiBTQkMgbWVkaWEgY29kZWMgdHlwZSAqLwotI2RlZmluZSBBMkRQX01FRElBX0NUX0FBQyAweDAyIC8qIEFBQyBtZWRpYSBjb2RlYyB0eXBlICovCi0vKiBOb24tQTJEUCBtZWRpYSBjb2RlYyB0eXBlICh2ZW5kb3Itc3BlY2lmaWMgY29kZWMpICovCi0jZGVmaW5lIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFAgMHhGRgotCi10eXBlZGVmIHVpbnQ4X3QgdEEyRFBfQ09ERUNfVFlQRTsgLyogQTJEUCBDb2RlYyB0eXBlOiBBMkRQX01FRElBX0NUXyogKi8KLQotI2VuZGlmICAvLyBBMkRQX0NPTlNUQU5UU19ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfZXJyb3JfY29kZXMuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF9lcnJvcl9jb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE3MTA1Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF9lcnJvcl9jb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDAtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vCi0vLyBBMkRQIEVycm9yIENvZGVzCi0vLwotCi0jaWZuZGVmIEEyRFBfRVJST1JfQ09ERVNfSAotI2RlZmluZSBBMkRQX0VSUk9SX0NPREVTX0gKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8qIFN1Y2Nlc3MgKi8KLSNkZWZpbmUgQTJEUF9TVUNDRVNTIDAKLQotLyogRmFpbGVkICovCi0jZGVmaW5lIEEyRFBfRkFJTCAweDBBCi0KLS8qIEEyRFBfRmluZFNlcnZpY2UgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLwotI2RlZmluZSBBMkRQX0JVU1kgMHgwQgotCi0vKiBCYWQgcGFyYW1ldGVycyAqLwotI2RlZmluZSBBMkRQX0lOVkFMSURfUEFSQU1TIDB4MEMKLQotLyogV3JvbmcgY29kZWMgaW5mbyAqLwotI2RlZmluZSBBMkRQX1dST05HX0NPREVDIDB4MEQKLQotLyogTWVkaWEgQ29kZWMgVHlwZSBpcyBub3QgdmFsaWQgKi8KLSNkZWZpbmUgQTJEUF9CQURfQ09ERUNfVFlQRSAweEMxCi0KLS8qIE1lZGlhIENvZGVjIFR5cGUgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBBMkRQX05TX0NPREVDX1RZUEUgMHhDMgotCi0vKiBTYW1wbGluZyBGcmVxdWVuY3kgaXMgbm90IHZhbGlkIG9yIG11bHRpcGxlIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQgKi8KLSNkZWZpbmUgQTJEUF9CQURfU0FNUF9GUkVRIDB4QzMKLQotLyogU2FtcGxpbmcgRnJlcXVlbmN5IGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQTJEUF9OU19TQU1QX0ZSRVEgMHhDNAotCi0vKiBDaGFubmVsIE1vZGUgaXMgbm90IHZhbGlkIG9yIG11bHRpcGxlIHZhbHVlcyAqIGhhdmUgYmVlbiBzZWxlY3RlZCAqLwotI2RlZmluZSBBMkRQX0JBRF9DSF9NT0RFIDB4QzUKLQotLyogQ2hhbm5lbCBNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQTJEUF9OU19DSF9NT0RFIDB4QzYKLQotLyogTm9uZSBvciBtdWx0aXBsZSB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBOdW1iZXIgb2YgU3ViYmFuZHMgKi8KLSNkZWZpbmUgQTJEUF9CQURfU1VCQkFORFMgMHhDNwotCi0vKiBOdW1iZXIgb2YgU3ViYmFuZHMgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBBMkRQX05TX1NVQkJBTkRTIDB4QzgKLQotLyogTm9uZSBvciBtdWx0aXBsZSB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBBbGxvY2F0aW9uIE1ldGhvZCAqLwotI2RlZmluZSBBMkRQX0JBRF9BTExPQ19NRVRIT0QgMHhDOQotCi0vKiBBbGxvY2F0aW9uIE1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIEEyRFBfTlNfQUxMT0NfTUVUSE9EIDB4Q0EKLQotLyogTWluaW11bSBCaXRwb29sIFZhbHVlIGlzIG5vdCB2YWxpZCAqLwotI2RlZmluZSBBMkRQX0JBRF9NSU5fQklUUE9PTCAweENCCi0KLS8qIE1pbmltdW0gQml0cG9vbCBWYWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIEEyRFBfTlNfTUlOX0JJVFBPT0wgMHhDQwotCi0vKiBNYXhpbXVtIEJpdHBvb2wgVmFsdWUgaXMgbm90IHZhbGlkICovCi0jZGVmaW5lIEEyRFBfQkFEX01BWF9CSVRQT09MIDB4Q0QKLQotLyogTWF4aW11bSBCaXRwb29sIFZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQTJEUF9OU19NQVhfQklUUE9PTCAweENFCi0KLS8qIE5vbmUgb3IgbXVsdGlwbGUgdmFsdWVzIGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgTGF5ZXIgKi8KLSNkZWZpbmUgQTJEUF9CQURfTEFZRVIgMHhDRgotCi0vKiBMYXllciBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIEEyRFBfTlNfTEFZRVIgMHhEMAotCi0vKiBDUkMgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBBMkRQX05TX0NSQyAweEQxCi0KLS8qIE1QRi0yIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQTJEUF9OU19NUEYgMHhEMgotCi0vKiBWQlIgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBBMkRQX05TX1ZCUiAweEQzCi0KLS8qIE5vbmUgb3IgbXVsdGlwbGUgdmFsdWVzIGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgQml0IFJhdGUgKi8KLSNkZWZpbmUgQTJEUF9CQURfQklUX1JBVEUgMHhENAotCi0vKiBCaXQgUmF0ZSBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIEEyRFBfTlNfQklUX1JBVEUgMHhENQotCi0vKiBFaXRoZXIgMSkgT2JqZWN0IHR5cGUgaXMgbm90IHZhbGlkIChiMy1iMCkgb3IgMikgTm9uZSBvciBtdWx0aXBsZSB2YWx1ZXMKLSAqIGhhdmUgYmVlbiAqIHNlbGVjdGVkIGZvciBPYmplY3QgVHlwZQotICovCi0jZGVmaW5lIEEyRFBfQkFEX09CSl9UWVBFIDB4RDYKLQotLyogT2JqZWN0IHR5cGUgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBBMkRQX05TX09CSl9UWVBFIDB4RDcKLQotLyogTm9uZSBvciBtdWx0aXBsZSB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBDaGFubmVscyAqLwotI2RlZmluZSBBMkRQX0JBRF9DSEFOTkVMIDB4RDgKLQotLyogQ2hhbm5lbHMgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBBMkRQX05TX0NIQU5ORUwgMHhEOQotCi0vKiBOb25lIG9yIG11bHRpcGxlIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIEJsb2NrIExlbmd0aCAqLwotI2RlZmluZSBBMkRQX0JBRF9CTE9DS19MRU4gMHhERAotCi0vKiBUaGUgcmVxdWVzdGVkIENQIFR5cGUgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSNkZWZpbmUgQTJEUF9CQURfQ1BfVFlQRSAweEUwCi0KLS8qIFRoZSBmb3JtYXQgb2YgQ29udGVudCBQcm90ZWN0aW9uIFNlcnZpY2UgQ2FwYWJpbGl0eS9Db250ZW50IFByb3RlY3Rpb24KLSAqIFNjaGVtZSBEZXBlbmRlbnQgRGF0YSBpcyBub3QgY29ycmVjdC4KLSAqLwotI2RlZmluZSBBMkRQX0JBRF9DUF9GT1JNQVQgMHhFMQotCi10eXBlZGVmIHVpbnQ4X3QgdEEyRFBfU1RBVFVTOwotCi0jZW5kaWYgIC8vIEEyRFBfRVJST1JfQ09ERVNfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hMmRwX3NiYy5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3NiYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA2NGJkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF9zYmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gQTJEUCBDb2RlYyBBUEkgZm9yIGxvdyBjb21wbGV4aXR5IHN1YmJhbmQgY29kZWMgKFNCQykKLS8vCi0KLSNpZm5kZWYgQTJEUF9TQkNfSAotI2RlZmluZSBBMkRQX1NCQ19ICi0KLSNpbmNsdWRlIDxidF90YXJnZXQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0jaW5jbHVkZSAiYTJkcF9zYmNfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1jbGFzcyBBMmRwQ29kZWNDb25maWdTYmNCYXNlIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZyB7Ci0gcHJvdGVjdGVkOgotICBBMmRwQ29kZWNDb25maWdTYmNCYXNlKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc291cmNlKQotICAgICAgOiBBMmRwQ29kZWNDb25maWcoY29kZWNfaW5kZXgsIG5hbWUsIGNvZGVjX3ByaW9yaXR5KSwKLSAgICAgICAgaXNfc291cmNlXyhpc19zb3VyY2UpIHt9Ci0gIGJvb2wgc2V0Q29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcpIG92ZXJyaWRlOwotICBib29sIHNldFBlZXJDb2RlY0NhcGFiaWxpdGllcygKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBpc19zb3VyY2VfOyAgLy8gVHJ1ZSBpZiBsb2NhbCBpcyBTb3VyY2UKLX07Ci0KLWNsYXNzIEEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZSA6IHB1YmxpYyBBMmRwQ29kZWNDb25maWdTYmNCYXNlIHsKLSBwdWJsaWM6Ci0gIEEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZShidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSk7Ci0gIHZpcnR1YWwgfkEyZHBDb2RlY0NvbmZpZ1NiY1NvdXJjZSgpOwotCi0gIGJvb2wgaW5pdCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCB1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBkZWJ1Z19jb2RlY19kdW1wKGludCBmZCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBBMmRwQ29kZWNDb25maWdTYmNTaW5rIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZ1NiY0Jhc2UgewotIHB1YmxpYzoKLSAgQTJkcENvZGVjQ29uZmlnU2JjU2luayhidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSk7Ci0gIHZpcnR1YWwgfkEyZHBDb2RlY0NvbmZpZ1NiY1NpbmsoKTsKLQotICBib29sIGluaXQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgdXNlUnRwSGVhZGVyTWFya2VyQml0KCkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBBMkRQIFNCQyBTb3VyY2UgY29kZWMuCi0vLyBOT1RFOiBvbmx5IGNvZGVjcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcmUgY29uc2lkZXJlZCB2YWxpZC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHZhbGlkIFNCQyBjb2RlYywKLS8vIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWRTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgQTJEUCBTQkMgU2luayBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgU0JDIGNvZGVjLAotLy8gb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzU2lua0NvZGVjVmFsaWRTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgcGVlciBBMkRQIFNCQyBTb3VyY2UKLS8vIGNvZGVjLgotLy8gTk9URTogb25seSBjb2RlY3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSB2YWxpZCBTQkMgY29kZWMsCi0vLyBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNQZWVyU291cmNlQ29kZWNWYWxpZFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBwZWVyIEEyRFAgU0JDIFNpbmsKLS8vIGNvZGVjLgotLy8gTk9URTogb25seSBjb2RlY3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSB2YWxpZCBTQkMgY29kZWMsCi0vLyBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWRTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgQTJEUCBTQkMgU2luayBjb2RlYyBpcyBzdXBwb3J0ZWQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIFNCQyBTaW5rIGNvZGVjIGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIGFuIEEyRFAgU0JDIFNvdXJjZSBjb2RlYyBmb3IgYSBwZWVyIFNvdXJjZSBkZXZpY2UgaXMKLS8vIHN1cHBvcnRlZC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgb2YgdGhlCi0vLyBwZWVyIGRldmljZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQTJEUCBTQkMgU291cmNlIGNvZGVjIGZvciBhIHBlZXIgU291cmNlIGRldmljZSBpcwotLy8gc3VwcG9ydGVkLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNQZWVyU291cmNlQ29kZWNTdXBwb3J0ZWRTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gSW5pdGlhbGl6ZSBzdGF0ZSB3aXRoIHRoZSBkZWZhdWx0IEEyRFAgU0JDIGNvZGVjLgotLy8gVGhlIGluaXRpYWxpemVkIHN0YXRlIHdpdGggdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBpcyBzdG9yZWQgaW4KLS8vIHxwX2NvZGVjX2luZm98Lgotdm9pZCBBMkRQX0luaXREZWZhdWx0Q29kZWNTYmModWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBTQkMgY29kZWMgbmFtZSBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNOYW1lU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHR3byBBMkRQIFNCQyBjb2RlY3MgfHBfY29kZWNfaW5mb19hfCBhbmQgfHBfY29kZWNfaW5mb19ifAotLy8gaGF2ZSB0aGUgc2FtZSB0eXBlLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gY29kZWNzIGhhdmUgdGhlIHNhbWUgdHlwZSwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0NvZGVjVHlwZUVxdWFsc1NiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBDaGVja3Mgd2hldGhlciB0d28gQTJEUCBTQkMgY29kZWNzIHxwX2NvZGVjX2luZm9fYXwgYW5kIHxwX2NvZGVjX2luZm9fYnwKLS8vIGFyZSBleGFjdGx5IHRoZSBzYW1lLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gY29kZWNzIGFyZSBleGFjdGx5IHRoZSBzYW1lLCBvdGhlcndpc2UgZmFsc2UuCi0vLyBJZiB0aGUgY29kZWMgdHlwZSBpcyBub3QgU0JDLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlLgotYm9vbCBBMkRQX0NvZGVjRXF1YWxzU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKTsKLQotLy8gR2V0cyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgdmFsdWUgZm9yIHRoZSBBMkRQIFNCQyBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgU0JDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRUcmFja1NhbXBsZVJhdGVTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgdHJhY2sgYml0cyBwZXIgc2FtcGxlIHZhbHVlIGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNCQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIHRyYWNrIGJpdHMgcGVyIHNhbXBsZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldFRyYWNrQml0c1BlclNhbXBsZVNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBjaGFubmVsIGNvdW50IGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNCQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIGNoYW5uZWwgY291bnQgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3ViYmFuZHMgZm9yIHRoZSBBMkRQIFNCQyBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgU0JDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1YmJhbmRzIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfR2V0TnVtYmVyT2ZTdWJiYW5kc1NiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNCQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBibG9ja3Mgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXROdW1iZXJPZkJsb2Nrc1NiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBjb2RlIGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyBUaGUgYWN0dWFsIHZhbHVlIGlzIGNvZGVjLXNwZWNpZmljIC0gc2VlIHxBMkRQX1NCQ19JRV9BTExPQ19NRF8qfC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgU0JDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgYWxsb2NhdGlvbiBtZXRob2QgY29kZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldEFsbG9jYXRpb25NZXRob2RDb2RlU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgbW9kZSBjb2RlIGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyBUaGUgYWN0dWFsIHZhbHVlIGlzIGNvZGVjLXNwZWNpZmljIC0gc2VlIHxBMkRQX1NCQ19JRV9DSF9NRF8qfC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgU0JDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgY2hhbm5lbCBtb2RlIGNvZGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRDaGFubmVsTW9kZUNvZGVTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGNvZGUgZm9yIHRoZSBBMkRQIFNCQyBjb2RlYy4KLS8vIFRoZSBhY3R1YWwgdmFsdWUgaXMgY29kZWMtc3BlY2lmaWMgLSBzZWUgfEEyRFBfU0JDX0lFX1NBTVBfRlJFUV8qfC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgU0JDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGNvZGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRTYW1wbGluZ0ZyZXF1ZW5jeUNvZGVTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgbWluaW11bSBiaXRwb29sIGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyBUaGUgYWN0dWFsIHZhbHVlIGlzIGNvZGVjLXNwZWNpZmljIC0gc2VlIHxBMkRQX1NCQ19JRV9NSU5fQklUUE9PTHwuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNCQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIG1pbmltdW0gYml0cG9vbCBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldE1pbkJpdHBvb2xTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgbWF4aW11bSBiaXRwb29sIGZvciB0aGUgQTJEUCBTQkMgY29kZWMuCi0vLyBUaGUgYWN0dWFsIHZhbHVlIGlzIGNvZGVjLXNwZWNpZmljIC0gc2VlIHxBMkRQX1NCQ19JRV9NQVhfQklUUE9PTHwuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNCQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIG1heGltdW0gYml0cG9vbCBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX0dldE1heEJpdHBvb2xTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgY2hhbm5lbCB0eXBlIGZvciB0aGUgQTJEUCBTQkMgU2luayBjb2RlYzoKLS8vIDEgZm9yIG1vbm8sIG9yIDMgZm9yIGR1YWwvc3RlcmVvL2pvaW50LgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBTQkMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIHR5cGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9HZXRTaW5rVHJhY2tDaGFubmVsVHlwZVNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIFNCQyBhdWRpbyBkYXRhIHRpbWVzdGFtcCBmcm9tIGFuIGF1ZGlvIHBhY2tldC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIHxwX2RhdGF8IGNvbnRhaW5zIHRoZSBhdWRpbyBkYXRhLgotLy8gVGhlIHRpbWVzdGFtcCBpcyBzdG9yZWQgaW4gfHBfdGltZXN0YW1wfC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfR2V0UGFja2V0VGltZXN0YW1wU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9kYXRhLCB1aW50MzJfdCogcF90aW1lc3RhbXApOwotCi0vLyBCdWlsZHMgQTJEUCBTQkMgY29kZWMgaGVhZGVyIGZvciBhdWRpbyBkYXRhLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gfHBfYnVmfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIHxmcmFtZXNfcGVyX3BhY2tldHwgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhpcyBwYWNrZXQuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0J1aWxkQ29kZWNIZWFkZXJTYmMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnJhbWVzX3Blcl9wYWNrZXQpOwotCi0vLyBEZWNvZGVzIEEyRFAgU0JDIGNvZGVjIGluZm8gaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgU0JDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLXN0ZDo6c3RyaW5nIEEyRFBfQ29kZWNJbmZvU3RyaW5nU2JjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgU0JDIGVuY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW5jb2RlIGFuZCBwcmVwYXJlCi0vLyBBMkRQIHBhY2tldHMgZm9yIHRyYW5zbWlzc2lvbiAtIHNlZSB8dEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0V8LgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gUmV0dXJucyB0aGUgQTJEUCBTQkMgZW5jb2RlciBpbnRlcmZhY2UgaWYgdGhlIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZAotLy8gc3VwcG9ydGVkLCBvdGhlcndpc2UgTlVMTC4KLWNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFKiBBMkRQX0dldEVuY29kZXJJbnRlcmZhY2VTYmMoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBTQkMgZGVjb2RlciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNvZGUgcmVjZWl2ZWQgQTJEUAotLy8gcGFja2V0cyAtIHNlZSB8dEEyRFBfREVDT0RFUl9JTlRFUkZBQ0V8LgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gUmV0dXJucyB0aGUgQTJEUCBTQkMgZGVjb2RlciBpbnRlcmZhY2UgaWYgdGhlIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZAotLy8gc3VwcG9ydGVkLCBvdGhlcndpc2UgTlVMTC4KLWNvbnN0IHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFKiBBMkRQX0dldERlY29kZXJJbnRlcmZhY2VTYmMoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQWRqdXN0cyB0aGUgQTJEUCBTQkMgY29kZWMsIGJhc2VkIG9uIGxvY2FsIHN1cHBvcnQgYW5kIEJsdWV0b290aAotLy8gc3BlY2lmaWNhdGlvbi4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbiB0byBhZGp1c3QuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQgYW5kIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0FkanVzdENvZGVjU2JjKHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgU0JDIFNvdXJjZSBjb2RlYyBpbmRleCBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLS8vIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgfGJ0YXZfYTJkcF9jb2RlY19pbmRleF90fCBvbiBzdWNjZXNzLAotLy8gb3RoZXJ3aXNlIHxCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYfC4KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU291cmNlQ29kZWNJbmRleFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIFNCQyBTaW5rIGNvZGVjIGluZGV4IGZvciBhIGdpdmVuIHxwX2NvZGVjX2luZm98LgotLy8gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3R8IG9uIHN1Y2Nlc3MsCi0vLyBvdGhlcndpc2UgfEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVh8LgotYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgQTJEUF9TaW5rQ29kZWNJbmRleFNiYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIFNCQyBTb3VyY2UgY29kZWMgbmFtZS4KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNJbmRleFN0clNiYyh2b2lkKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBTQkMgU2luayBjb2RlYyBuYW1lLgotY29uc3QgY2hhciogQTJEUF9Db2RlY0luZGV4U3RyU2JjU2luayh2b2lkKTsKLQotLy8gSW5pdGlhbGl6ZXMgQTJEUCBTQkMgU291cmNlIGNvZGVjIGluZm9ybWF0aW9uIGludG8gfEF2ZHRwU2VwQ29uZmlnfAotLy8gY29uZmlndXJhdGlvbiBlbnRyeSBwb2ludGVkIGJ5IHxwX2NmZ3wuCi1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnU2JjKEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLS8vIEluaXRpYWxpemVzIEEyRFAgU0JDIFNpbmsgY29kZWMgaW5mb3JtYXRpb24gaW50byB8QXZkdHBTZXBDb25maWd8Ci0vLyBjb25maWd1cmF0aW9uIGVudHJ5IHBvaW50ZWQgYnkgfHBfY2ZnfC4KLWJvb2wgQTJEUF9Jbml0Q29kZWNDb25maWdTYmNTaW5rKEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLS8vIEdldCBTQkMgYml0cmF0ZQotLy8gUmV0dXJucyB8dWludDMyX3R8IGJpdHJhdGUgdmFsdWUgaW4gYml0cyBwZXIgc2Vjb25kCi11aW50MzJfdCBBMkRQX0dldEJpdHJhdGVTYmMoKTsKLQotI2VuZGlmICAvLyBBMkRQX1NCQ19ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfc2JjX2NvbnN0YW50cy5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3NiY19jb25zdGFudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNjY4OC4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfc2JjX2NvbnN0YW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8KLS8vIEEyRFAgY29uc3RhbnRzIGZvciBsb3cgY29tcGxleGl0eSBzdWJiYW5kIGNvZGVjIChTQkMpCi0vLwotCi0jaWZuZGVmIEEyRFBfU0JDX0NPTlNUQU5UU19ICi0jZGVmaW5lIEEyRFBfU0JDX0NPTlNUQU5UU19ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGUgbGVuZ3RoIG9mIHRoZSBTQkMgTWVkaWEgUGF5bG9hZCBoZWFkZXIuICovCi0jZGVmaW5lIEEyRFBfU0JDX01QTF9IRFJfTEVOIDEKLQotLyogdGhlIExPU0Mgb2YgU0JDIG1lZGlhIGNvZGVjIGNhcGFiaWxpdGl5ICovCi0jZGVmaW5lIEEyRFBfU0JDX0lORk9fTEVOIDYKLQotLyogZm9yIENvZGVjIFNwZWNpZmljIEluZm9ybWF0aW9uIEVsZW1lbnQgKi8KLSNkZWZpbmUgQTJEUF9TQkNfSUVfU0FNUF9GUkVRX01TSyAweEYwIC8qIGI3LWI0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfMTYgMHg4MCAgLyogYjc6MTYgIGtIeiAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfMzIgMHg0MCAgLyogYjY6MzIgIGtIeiAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDQgMHgyMCAgLyogYjU6NDQuMWtIeiAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9TQU1QX0ZSRVFfNDggMHgxMCAgLyogYjQ6NDggIGtIeiAqLwotCi0jZGVmaW5lIEEyRFBfU0JDX0lFX0NIX01EX01TSyAweDBGICAgIC8qIGIzLWIwIGNoYW5uZWwgbW9kZSAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9DSF9NRF9NT05PIDB4MDggICAvKiBiMzogbW9ubyAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMIDB4MDQgICAvKiBiMjogZHVhbCAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9DSF9NRF9TVEVSRU8gMHgwMiAvKiBiMTogc3RlcmVvICovCi0jZGVmaW5lIEEyRFBfU0JDX0lFX0NIX01EX0pPSU5UIDB4MDEgIC8qIGIwOiBqb2ludCBzdGVyZW8gKi8KLQotI2RlZmluZSBBMkRQX1NCQ19JRV9CTE9DS1NfTVNLIDB4RjAgLyogYjctYjQgbnVtYmVyIG9mIGJsb2NrcyAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9CTE9DS1NfNCAweDgwICAgLyogNCBibG9ja3MgKi8KLSNkZWZpbmUgQTJEUF9TQkNfSUVfQkxPQ0tTXzggMHg0MCAgIC8qIDggYmxvY2tzICovCi0jZGVmaW5lIEEyRFBfU0JDX0lFX0JMT0NLU18xMiAweDIwICAvKiAxMmJsb2NrcyAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9CTE9DS1NfMTYgMHgxMCAgLyogMTZibG9ja3MgKi8KLQotI2RlZmluZSBBMkRQX1NCQ19JRV9TVUJCQU5EX01TSyAweDBDIC8qIGIzLWIyIG51bWJlciBvZiBzdWJiYW5kcyAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9TVUJCQU5EXzQgMHgwOCAgIC8qIGIzOiA0ICovCi0jZGVmaW5lIEEyRFBfU0JDX0lFX1NVQkJBTkRfOCAweDA0ICAgLyogYjI6IDggKi8KLQotI2RlZmluZSBBMkRQX1NCQ19JRV9BTExPQ19NRF9NU0sgMHgwMyAvKiBiMS1iMCBhbGxvY2F0aW9uIG1vZGUgKi8KLSNkZWZpbmUgQTJEUF9TQkNfSUVfQUxMT0NfTURfUyAweDAyICAgLyogYjE6IFNOUiAqLwotI2RlZmluZSBBMkRQX1NCQ19JRV9BTExPQ19NRF9MIDB4MDEgICAvKiBiMDogbG91bmRlc3MgKi8KLQotI2RlZmluZSBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTCAyCi0jZGVmaW5lIEEyRFBfU0JDX0lFX01BWF9CSVRQT09MIDI1MAotI2RlZmluZSBBMkRQX1NCQ19CSVRQT09MX01JRERMRV9RVUFMSVRZIDM1Ci0KLS8qIGZvciBtZWRpYSBwYXlsb2FkIGhlYWRlciAqLwotI2RlZmluZSBBMkRQX1NCQ19IRFJfRl9NU0sgMHg4MAotI2RlZmluZSBBMkRQX1NCQ19IRFJfU19NU0sgMHg0MAotI2RlZmluZSBBMkRQX1NCQ19IRFJfTF9NU0sgMHgyMAotI2RlZmluZSBBMkRQX1NCQ19IRFJfTlVNX01TSyAweDBGCi0KLSNlbmRpZiAgLy8gQTJEUF9TQkNfQ09OU1RBTlRTX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9zYmNfZGVjb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3NiY19kZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZGJlYmMuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX3NiY19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEludGVyZmFjZSB0byB0aGUgQTJEUCBTQkMgRGVjb2RlcgotLy8KLQotI2lmbmRlZiBBMkRQX1NCQ19ERUNPREVSX0gKLSNkZWZpbmUgQTJEUF9TQkNfREVDT0RFUl9ICi0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8vIExvYWRzIHRoZSBBMkRQIFNCQyBkZWNvZGVyLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0xvYWREZWNvZGVyU2JjKHZvaWQpOwotCi0vLyBVbmxvYWRzIHRoZSBBMkRQIFNCQyBkZWNvZGVyLgotdm9pZCBBMkRQX1VubG9hZERlY29kZXJTYmModm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgU0JDIGRlY29kZXIuCi1ib29sIGEyZHBfc2JjX2RlY29kZXJfaW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spOwotCi0vLyBDbGVhbnVwIHRoZSBBMkRQIFNCQyBkZWNvZGVyLgotdm9pZCBhMmRwX3NiY19kZWNvZGVyX2NsZWFudXAodm9pZCk7Ci0KLS8vIERlY29kZXMgfHBfYnVmfC4gQ2FsbHMgfGRlY29kZV9jYWxsYmFja3wgcGFzc2VkIGludG8gfGEyZHBfc2JjX2RlY29kZXJfaW5pdHwKLS8vIGlmIGRlY29kZWQgZnJhbWVzIGFyZSBhdmFpbGFibGUuCi1ib29sIGEyZHBfc2JjX2RlY29kZXJfZGVjb2RlX3BhY2tldChCVF9IRFIqIHBfYnVmKTsKLQotI2VuZGlmICAvLyBBMkRQX1NCQ19ERUNPREVSX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9zYmNfZW5jb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3NiY19lbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNWI3Y2QuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX3NiY19lbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8KLS8vIEludGVyZmFjZSB0byB0aGUgQTJEUCBTQkMgRW5jb2RlcgotLy8KLQotI2lmbmRlZiBBMkRQX1NCQ19FTkNPREVSX0gKLSNkZWZpbmUgQTJEUF9TQkNfRU5DT0RFUl9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0KLS8vIExvYWRzIHRoZSBBMkRQIFNCQyBlbmNvZGVyLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0xvYWRFbmNvZGVyU2JjKHZvaWQpOwotCi0vLyBVbmxvYWRzIHRoZSBBMkRQIFNCQyBlbmNvZGVyLgotdm9pZCBBMkRQX1VubG9hZEVuY29kZXJTYmModm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgU0JDIGVuY29kZXIuCi0vLyB8cF9wZWVyX3BhcmFtc3wgY29udGFpbnMgdGhlIEEyRFAgcGVlciBpbmZvcm1hdGlvbgotLy8gVGhlIGN1cnJlbnQgQTJEUCBjb2RlYyBjb25maWcgaXMgaW4gfGEyZHBfY29kZWNfY29uZmlnfC4KLS8vIHxyZWFkX2NhbGxiYWNrfCBpcyB0aGUgY2FsbGJhY2sgZm9yIHJlYWRpbmcgdGhlIGlucHV0IGF1ZGlvIGRhdGEuCi0vLyB8ZW5xdWV1ZV9jYWxsYmFja3wgaXMgdGhlIGNhbGxiYWNrIGZvciBlbnF1ZXVlaW5nIHRoZSBlbmNvZGVkIGF1ZGlvIGRhdGEuCi12b2lkIGEyZHBfc2JjX2VuY29kZXJfaW5pdChjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQ29kZWNDb25maWcqIGEyZHBfY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjayk7Ci0KLS8vIENsZWFudXAgdGhlIEEyRFAgU0JDIGVuY29kZXIuCi12b2lkIGEyZHBfc2JjX2VuY29kZXJfY2xlYW51cCh2b2lkKTsKLQotLy8gUmVzZXQgdGhlIGZlZWRpbmcgZm9yIHRoZSBBMkRQIFNCQyBlbmNvZGVyLgotdm9pZCBhMmRwX3NiY19mZWVkaW5nX3Jlc2V0KHZvaWQpOwotCi0vLyBGbHVzaCB0aGUgZmVlZGluZyBmb3IgdGhlIEEyRFAgU0JDIGVuY29kZXIuCi12b2lkIGEyZHBfc2JjX2ZlZWRpbmdfZmx1c2godm9pZCk7Ci0KLS8vIEdldCB0aGUgQTJEUCBTQkMgZW5jb2RlciBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKS4KLXVpbnQ2NF90IGEyZHBfc2JjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKHZvaWQpOwotCi0vLyBHZXQgdGhlIEEyRFAgU0JDIGVuY29kZWQgbWF4aW11bSBmcmFtZSBzaXplCi1pbnQgYTJkcF9zYmNfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCk7Ci0KLS8vIFByZXBhcmUgYW5kIHNlbmQgQTJEUCBTQkMgZW5jb2RlZCBmcmFtZXMuCi0vLyB8dGltZXN0YW1wX3VzfCBpcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgKGluIG1pY3Jvc2Vjb25kcykuCi12b2lkIGEyZHBfc2JjX3NlbmRfZnJhbWVzKHVpbnQ2NF90IHRpbWVzdGFtcF91cyk7Ci0KLS8vIEdldCBTQkMgYml0cmF0ZQotLy8gUmV0dXJucyB8dWludDMyX3R8IGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kCi11aW50MzJfdCBhMmRwX3NiY19nZXRfYml0cmF0ZSgpOwotI2VuZGlmICAvLyBBMkRQX1NCQ19FTkNPREVSX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF9zYmNfdXBfc2FtcGxlLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfc2JjX3VwX3NhbXBsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzgzOTYxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF9zYmNfdXBfc2FtcGxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBTQkMgZGF0YQotICogIGZyYW1lcyBhbmQgY29kZWMgY2FwYWJpbGl0aWVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEEyRFBfU0JDX1VQX1NBTVBMRV9ICi0jZGVmaW5lIEEyRFBfU0JDX1VQX1NBTVBMRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX2luaXRfdXBfc2FtcGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBpbml0aWFsaXplIHRoZSB1cCBzYW1wbGUKLSAqCi0gKiAgICAgICAgICAgICAgICAgIHNyY19zcHM6IHNhbXBsZXMgcGVyIHNlY29uZCAoc291cmNlIGF1ZGlvIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgIGRzdF9zcHM6IHNhbXBsZXMgcGVyIHNlY29uZCAoY29udmVydGVkIGF1ZGlvIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgIGJpdHM6IG51bWJlciBvZiBiaXRzIHBlciBwY20gc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIG5fY2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscyAoaS5lLiBtb25vKDEpLCBzdGVyZW8oMikuLi4pCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYTJkcF9zYmNfaW5pdF91cF9zYW1wbGUodWludDMyX3Qgc3JjX3NwcywgdWludDMyX3QgZHN0X3NwcywgdWludDhfdCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5fY2hhbm5lbHMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYTJkcF9zYmNfdXBfc2FtcGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiB0aGUgc291cmNlIChwX3NyYykgYXVkaW8gZGF0YSBhbmQKLSAqICAgICAgICAgICAgICAgICAgc291cmNlIHNwZWVkIChzcmNfc3BzLCBzYW1wbGVzIHBlciBzZWNvbmQpLAotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGl0IHRvIGF1ZGlvIGRhdGEgaW4gdGhlIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAgICAgZm9ybWF0Ci0gKgotICogICAgICAgICAgICAgICAgICBwX3NyYzogdGhlIGRhdGEgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHBfZHN0OiB0aGUgZGF0YSBidWZmZXIgdG8gaG9sZCB0aGUgY29udmVydGVkIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgc3JjX3NhbXBsZXM6IFRoZSBudW1iZXIgb2Ygc291cmNlIHNhbXBsZXMgKG51bWJlciBvZiBieXRlcykKLSAqICAgICAgICAgICAgICAgICAgZHN0X3NhbXBsZXM6IFRoZSBzaXplIG9mIHBfZHN0IChudW1iZXIgb2YgYnl0ZXMpCi0gKgotICogTm90ZTogICAgICAgICAgICBBbiBBRSByZXBvcnRlZCBhbiBpc3N1ZSB3aXRoIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gY2FsbGVkIHdpdGggYTJkcF9zYmNfdXBfc2FtcGxlKHNyYywgdWludDhfYXJyYXlfZHN0Li4pCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBieXRlIGJlZm9yZSB1aW50OF9hcnJheV9kc3QgbWF5IGdldCBvdmVyd3JpdHRlbi4KLSAqICAgICAgICAgICAgICAgICAgVXNpbmcgdWludDE2X2FycmF5X2RzdCBhdm9pZHMgdGhlIHByb2JsZW0uCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgaXNzdWUgaXMgcmVsYXRlZCB0byBlbmRpYW4tbmVzcyBhbmQgaXMgaGFyZCB0byByZXNvbHZlCi0gKiAgICAgICAgICAgICAgICAgIGluIGEgZ2VuZXJpYyBtYW5uZXIuCi0gKiAqKioqKioqKioqKioqKioqIFBsZWFzZSB1c2UgdWludDE2IGFycmF5IGFzIGRzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX2RzdAotICogICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9zcmMgKGluICpwX3JldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGEyZHBfc2JjX3VwX3NhbXBsZSh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2FtcGxlcywgdWludDMyX3QqIHBfcmV0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX3VwX3NhbXBsZV8xNnMgKDE2Yml0cy1zdGVyZW8pCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHaXZlbiB0aGUgc291cmNlIChwX3NyYykgYXVkaW8gZGF0YSBhbmQKLSAqICAgICAgICAgICAgICAgICAgc291cmNlIHNwZWVkIChzcmNfc3BzLCBzYW1wbGVzIHBlciBzZWNvbmQpLAotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGl0IHRvIGF1ZGlvIGRhdGEgaW4gdGhlIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAgICAgZm9ybWF0Ci0gKgotICogICAgICAgICAgICAgICAgICBwX3NyYzogdGhlIGRhdGEgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHBfZHN0OiB0aGUgZGF0YSBidWZmZXIgdG8gaG9sZCB0aGUgY29udmVydGVkIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgc3JjX3NhbXBsZXM6IFRoZSBudW1iZXIgb2Ygc291cmNlIHNhbXBsZXMgKGluIHVpbnQgb2YgNAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpCi0gKiAgICAgICAgICAgICAgICAgIGRzdF9zYW1wbGVzOiBUaGUgc2l6ZSBvZiBwX2RzdCAoaW4gdWludCBvZiA0IGJ5dGVzKQotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGluIHBfZHN0Ci0gKiAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX3NyYyAoaW4gKnBfcmV0KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgYTJkcF9zYmNfdXBfc2FtcGxlXzE2cyh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0X3NhbXBsZXMsIHVpbnQzMl90KiBwX3JldCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBhMmRwX3NiY191cF9zYW1wbGVfMTZtICgxNmJpdHMtbW9ubykKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIHRoZSBzb3VyY2UgKHBfc3JjKSBhdWRpbyBkYXRhIGFuZAotICogICAgICAgICAgICAgICAgICBzb3VyY2Ugc3BlZWQgKHNyY19zcHMsIHNhbXBsZXMgcGVyIHNlY29uZCksCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgaXQgdG8gYXVkaW8gZGF0YSBpbiB0aGUgZGVzaXJlZAotICogICAgICAgICAgICAgICAgICBmb3JtYXQKLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfc3JjOiB0aGUgZGF0YSBidWZmZXIgdGhhdCBob2xkcyB0aGUgc291cmNlIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgcF9kc3Q6IHRoZSBkYXRhIGJ1ZmZlciB0byBob2xkIHRoZSBjb252ZXJ0ZWQgYXVkaW8gZGF0YQotICogICAgICAgICAgICAgICAgICBzcmNfc2FtcGxlczogVGhlIG51bWJlciBvZiBzb3VyY2Ugc2FtcGxlcyAoaW4gdWludCBvZiAyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcykKLSAqICAgICAgICAgICAgICAgICAgZHN0X3NhbXBsZXM6IFRoZSBzaXplIG9mIHBfZHN0IChpbiB1aW50IG9mIDIgYnl0ZXMpCi0gKgotICogUmV0dXJucyAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9kc3QKLSAqICAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGluIHBfc3JjIChpbiAqcF9yZXQpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBhMmRwX3NiY191cF9zYW1wbGVfMTZtKHZvaWQqIHBfc3JjLCB2b2lkKiBwX2RzdCwgdWludDMyX3Qgc3JjX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2FtcGxlcywgdWludDMyX3QqIHBfcmV0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX3VwX3NhbXBsZV84cyAoOGJpdHMtc3RlcmVvKQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gdGhlIHNvdXJjZSAocF9zcmMpIGF1ZGlvIGRhdGEgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHNvdXJjZSBzcGVlZCAoc3JjX3Nwcywgc2FtcGxlcyBwZXIgc2Vjb25kKSwKLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBpdCB0byBhdWRpbyBkYXRhIGluIHRoZSBkZXNpcmVkCi0gKiAgICAgICAgICAgICAgICAgIGZvcm1hdAotICoKLSAqICAgICAgICAgICAgICAgICAgcF9zcmM6IHRoZSBkYXRhIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBzb3VyY2UgYXVkaW8gZGF0YQotICogICAgICAgICAgICAgICAgICBwX2RzdDogdGhlIGRhdGEgYnVmZmVyIHRvIGhvbGQgdGhlIGNvbnZlcnRlZCBhdWRpbyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHNyY19zYW1wbGVzOiBUaGUgbnVtYmVyIG9mIHNvdXJjZSBzYW1wbGVzIChpbiB1aW50IG9mIDIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKQotICogICAgICAgICAgICAgICAgICBkc3Rfc2FtcGxlczogVGhlIHNpemUgb2YgcF9kc3QgKGluIHVpbnQgb2YgMiBieXRlcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX2RzdAotICogICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9zcmMgKGluICpwX3JldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGEyZHBfc2JjX3VwX3NhbXBsZV84cyh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2FtcGxlcywgdWludDMyX3QqIHBfcmV0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGEyZHBfc2JjX3VwX3NhbXBsZV84bSAoOGJpdHMtbW9ubykKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIHRoZSBzb3VyY2UgKHBfc3JjKSBhdWRpbyBkYXRhIGFuZAotICogICAgICAgICAgICAgICAgICBzb3VyY2Ugc3BlZWQgKHNyY19zcHMsIHNhbXBsZXMgcGVyIHNlY29uZCksCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgaXQgdG8gYXVkaW8gZGF0YSBpbiB0aGUgZGVzaXJlZAotICogICAgICAgICAgICAgICAgICBmb3JtYXQKLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfc3JjOiB0aGUgZGF0YSBidWZmZXIgdGhhdCBob2xkcyB0aGUgc291cmNlIGF1ZGlvIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgcF9kc3Q6IHRoZSBkYXRhIGJ1ZmZlciB0byBob2xkIHRoZSBjb252ZXJ0ZWQgYXVkaW8gZGF0YQotICogICAgICAgICAgICAgICAgICBzcmNfc2FtcGxlczogVGhlIG51bWJlciBvZiBzb3VyY2Ugc2FtcGxlcyAobnVtYmVyIG9mIGJ5dGVzKQotICogICAgICAgICAgICAgICAgICBkc3Rfc2FtcGxlczogVGhlIHNpemUgb2YgcF9kc3QgKG51bWJlciBvZiBieXRlcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBwX2RzdAotICogICAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gcF9zcmMgKGluICpwX3JldCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGEyZHBfc2JjX3VwX3NhbXBsZV84bSh2b2lkKiBwX3NyYywgdm9pZCogcF9kc3QsIHVpbnQzMl90IHNyY19zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc2FtcGxlcywgdWludDMyX3QqIHBfcmV0KTsKLQotI2VuZGlmICAvLyBBMkRQX1NCQ19VUF9TQU1QTEVfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWUxMDg2Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVmVuZG9yIFNwZWNpZmljIEEyRFAgQ29kZWNzIFN1cHBvcnQKLS8vCi0KLSNpZm5kZWYgQTJEUF9WRU5ET1JfSAotI2RlZmluZSBBMkRQX1ZFTkRPUl9ICi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLS8qIE9mZnNldCBmb3IgQTJEUCB2ZW5kb3IgY29kZWMgKi8KLSNkZWZpbmUgQTJEUF9WRU5ET1JfQ09ERUNfU1RBUlRfSURYIDMKLQotLyogT2Zmc2V0IGZvciBWZW5kb3IgSUQgZm9yIEEyRFAgdmVuZG9yIGNvZGVjICovCi0jZGVmaW5lIEEyRFBfVkVORE9SX0NPREVDX1ZFTkRPUl9JRF9TVEFSVF9JRFggQTJEUF9WRU5ET1JfQ09ERUNfU1RBUlRfSURYCi0KLS8qIE9mZnNldCBmb3IgQ29kZWMgSUQgZm9yIEEyRFAgdmVuZG9yIGNvZGVjICovCi0jZGVmaW5lIEEyRFBfVkVORE9SX0NPREVDX0NPREVDX0lEX1NUQVJUX0lEWCBcCi0gIChBMkRQX1ZFTkRPUl9DT0RFQ19WRU5ET1JfSURfU1RBUlRfSURYICsgc2l6ZW9mKHVpbnQzMl90KSkKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgQTJEUCB2ZW5kb3Itc3BlY2lmaWMKLS8vIFNvdXJjZSBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQKLS8vIHZlbmRvci1zcGVjaWZpYyBjb2RlYywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzVmVuZG9yU291cmNlQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBBMkRQIHZlbmRvci1zcGVjaWZpYwotLy8gU2luayBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQKLS8vIHZlbmRvci1zcGVjaWZpYyBjb2RlYywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzVmVuZG9yU2lua0NvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgcGVlciBBMkRQCi0vLyB2ZW5kb3Itc3BlY2lmaWMgU291cmNlIGNvZGVjLgotLy8gTk9URTogb25seSBjb2RlY3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSB2YWxpZAotLy8gdmVuZG9yLXNwZWNpZmljIGNvZGVjLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNWZW5kb3JQZWVyU291cmNlQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBwZWVyIEEyRFAKLS8vIHZlbmRvci1zcGVjaWZpYyBTaW5rIGNvZGVjLgotLy8gTk9URTogb25seSBjb2RlY3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSB2YWxpZAotLy8gdmVuZG9yLXNwZWNpZmljIGNvZGVjLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNWZW5kb3JQZWVyU2lua0NvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgYSB2ZW5kb3Itc3BlY2lmaWMgQTJEUCBTaW5rIGNvZGVjIGlzIHN1cHBvcnRlZC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHZlbmRvci1zcGVjaWZpYyBBMkRQIFNpbmsgY29kZWMgaXMgc3VwcG9ydGVkLAotLy8gb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzVmVuZG9yU2lua0NvZGVjU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIGEgdmVuZG9yLXNwZWNpZmljIEEyRFAgU291cmNlIGNvZGVjIGZvciBhIHBlZXIgU291cmNlIGRldmljZQotLy8gaXMgc3VwcG9ydGVkLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBvZiB0aGUKLS8vIHBlZXIgZGV2aWNlLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2ZW5kb3Itc3BlY2lmaWMgQTJEUCBTb3VyY2UgY29kZWMgZm9yIGEgcGVlciBTb3VyY2UKLS8vIGRldmljZSBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBWZW5kb3IgSUQgZm9yIHRoZSB2ZW5kb3Itc3BlY2lmaWMgQTJEUCBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMuCi0vLyBSZXR1cm5zIHRoZSBWZW5kb3IgSUQgZm9yIHRoZSB2ZW5kb3Itc3BlY2lmaWMgQTJEUCBjb2RlYy4KLXVpbnQzMl90IEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBDb2RlYyBJRCBmb3IgdGhlIHZlbmRvci1zcGVjaWZpYyBBMkRQIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVjIGNhcGFiaWxpdGllcy4KLS8vIFJldHVybnMgdGhlIENvZGVjIElEIGZvciB0aGUgdmVuZG9yLXNwZWNpZmljIEEyRFAgY29kZWMuCi11aW50MTZfdCBBMkRQX1ZlbmRvckNvZGVjR2V0Q29kZWNJZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgQTJEUCB2ZW5kb3Itc3BlY2lmaWMgZGF0YSBwYWNrZXRzIHNob3VsZCBjb250YWluIFJUUAotLy8gaGVhZGVyLiB8Y29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWR8IGlzIHRydWUgaWYgQ29udGVudCBQcm90ZWN0aW9uIGlzCi0vLyBlbmFibGVkLiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIHZlbmRvci1zcGVjaWZpYyBkYXRhIHBhY2tldHMgc2hvdWxkIGNvbnRhaW4gUlRQCi0vLyBoZWFkZXIsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JVc2VzUnRwSGVhZGVyKGJvb2wgY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIHZlbmRvci1zcGVjaWZpYyBjb2RlYyBuYW1lIGZvciBhIGdpdmVuIHxwX2NvZGVjX2luZm98LgotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY05hbWUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjcyB8cF9jb2RlY19pbmZvX2F8IGFuZAotLy8gfHBfY29kZWNfaW5mb19ifCBoYXZlIHRoZSBzYW1lIHR5cGUuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBjb2RlY3MgaGF2ZSB0aGUgc2FtZSB0eXBlLCBvdGhlcndpc2UgZmFsc2UuCi0vLyBJZiB0aGUgY29kZWMgdHlwZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JDb2RlY1R5cGVFcXVhbHMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjcyB8cF9jb2RlY19pbmZvX2F8IGFuZAotLy8gfHBfY29kZWNfaW5mb19ifCBhcmUgZXhhY3RseSB0aGUgc2FtZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGNvZGVjcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8gSWYgdGhlIGNvZGVjIHR5cGUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNFcXVhbHMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBHZXRzIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSB2YWx1ZSBmb3IgdGhlIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX1ZlbmRvckdldFRyYWNrU2FtcGxlUmF0ZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSB0cmFjayBiaXRzIHBlciBzYW1wbGUgdmFsdWUgZm9yIHRoZSBBMkRQIHZlbmRvci1zcGVjaWZpYyBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9WZW5kb3JHZXRUcmFja0JpdHNQZXJTYW1wbGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgY2hhbm5lbCBjb3VudCBmb3IgdGhlIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIGNvdW50IG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgYml0cmF0ZSBmb3IgdGhlIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIGNvdW50IG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0Qml0UmF0ZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBjaGFubmVsIHR5cGUgZm9yIHRoZSBBMkRQIHZlbmRvci1zcGVjaWZpYyBTaW5rIGNvZGVjOgotLy8gMSBmb3IgbW9ubywgb3IgMyBmb3IgZHVhbC9zdGVyZW8vam9pbnQuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIGNoYW5uZWwgdHlwZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX1ZlbmRvckdldFNpbmtUcmFja0NoYW5uZWxUeXBlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgY29kZWMtc3BlY2lmaWMgYXVkaW8gZGF0YSB0aW1lc3RhbXAgZnJvbSBhbiBhdWRpbyBwYWNrZXQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9kYXRhfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIFRoZSB0aW1lc3RhbXAgaXMgc3RvcmVkIGluIHxwX3RpbWVzdGFtcHwuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckdldFBhY2tldFRpbWVzdGFtcChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKTsKLQotLy8gQnVpbGRzIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjIGhlYWRlciBmb3IgYXVkaW8gZGF0YS4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIHxwX2J1ZnwgY29udGFpbnMgdGhlIGF1ZGlvIGRhdGEuCi0vLyB8ZnJhbWVzX3Blcl9wYWNrZXR8IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoaXMgcGFja2V0LgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JCdWlsZENvZGVjSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbywgQlRfSERSKiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lc19wZXJfcGFja2V0KTsKLQotLy8gR2V0cyB0aGUgQTJEUCB2ZW5kb3IgZW5jb2RlciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmNvZGUgYW5kCi0vLyBwcmVwYXJlIEEyRFAgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uIC0gc2VlIHx0QTJEUF9FTkNPREVSX0lOVEVSRkFDRXwuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyBSZXR1cm5zIHRoZSBBMkRQIHZlbmRvciBlbmNvZGVyIGludGVyZmFjZSBpZiB0aGUgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQgYW5kCi0vLyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBOVUxMLgotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfVmVuZG9yR2V0RW5jb2RlckludGVyZmFjZSgKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBjdXJyZW50IEEyRFAgdmVuZG9yIGRlY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjb2RlCi0vLyByZWNlaXZlZCBBMkRQIHBhY2tldHMgLSBzZWUgfHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFfC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIFJldHVybnMgdGhlIEEyRFAgdmVuZG9yIGRlY29kZXIgaW50ZXJmYWNlIGlmIHRoZSB8cF9jb2RlY19pbmZvfCBpcyB2YWxpZCBhbmQKLS8vIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIE5VTEwuCi1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9WZW5kb3JHZXREZWNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEFkanVzdHMgdGhlIEEyRFAgdmVuZG9yLXNwZWNpZmljIGNvZGVjLCBiYXNlZCBvbiBsb2NhbCBzdXBwb3J0IGFuZCBCbHVldG9vdGgKLS8vIHNwZWNpZmljYXRpb24uCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24gdG8gYWRqdXN0LgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZCBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JBZGp1c3RDb2RlYyh1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIHZlbmRvciBTb3VyY2UgY29kZWMgaW5kZXggZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi0vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHxidGF2X2EyZHBfY29kZWNfaW5kZXhfdHwgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB8QlRBVl9BMkRQX0NPREVDX0lOREVYX01BWHwuCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXgoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCB2ZW5kb3IgU2luayBjb2RlYyBpbmRleCBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLS8vIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgfGJ0YXZfYTJkcF9jb2RlY19pbmRleF90fCBvbiBzdWNjZXNzLAotLy8gb3RoZXJ3aXNlIHxCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYfC4KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfVmVuZG9yU2lua0NvZGVjSW5kZXgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCB2ZW5kb3IgY29kZWMgbmFtZSBmb3IgYSBnaXZlbiB8Y29kZWNfaW5kZXh8LgotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KTsKLQotLy8gSW5pdGlhbGl6ZXMgQTJEUCB2ZW5kb3IgY29kZWMtc3BlY2lmaWMgaW5mb3JtYXRpb24gaW50byB8QXZkdHBTZXBDb25maWd8Ci0vLyBjb25maWd1cmF0aW9uIGVudHJ5IHBvaW50ZWQgYnkgfHBfY2ZnfC4gVGhlIHNlbGVjdGVkIGNvZGVjIGlzIGRlZmluZWQgYnkKLS8vIHxjb2RlY19pbmRleHwuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckluaXRDb2RlY0NvbmZpZyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkdHBTZXBDb25maWcqIHBfY2ZnKTsKLQotLy8gRGVjb2RlcyBBMkRQIHZlbmRvciBjb2RlYyBpbmZvIGludG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLXN0ZDo6c3RyaW5nIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLSNlbmRpZiAgLy8gQTJEUF9WRU5ET1JfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9hcHR4LmggYi9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzY2NlNi4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gQTJEUCBDb2RlYyBBUEkgZm9yIGFwdFgKLS8vCi0KLSNpZm5kZWYgQTJEUF9WRU5ET1JfQVBUWF9ICi0jZGVmaW5lIEEyRFBfVkVORE9SX0FQVFhfSAotCi0jaW5jbHVkZSA8YnRfdGFyZ2V0Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yX2FwdHhfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1jbGFzcyBBMmRwQ29kZWNDb25maWdBcHR4IDogcHVibGljIEEyZHBDb2RlY0NvbmZpZyB7Ci0gcHVibGljOgotICBBMmRwQ29kZWNDb25maWdBcHR4KGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KTsKLSAgdmlydHVhbCB+QTJkcENvZGVjQ29uZmlnQXB0eCgpOwotCi0gIGJvb2wgaW5pdCgpIG92ZXJyaWRlOwotICBib29sIHNldENvZGVjQ29uZmlnKGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19pbmZvLCBib29sIGlzX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnKSBvdmVycmlkZTsKLSAgYm9vbCBzZXRQZWVyQ29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgdXNlUnRwSGVhZGVyTWFya2VyQml0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgZGVidWdfY29kZWNfZHVtcChpbnQgZmQpIG92ZXJyaWRlOwotfTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgQTJEUCBhcHRYIFNvdXJjZQotLy8gY29kZWMuCi0vLyBOT1RFOiBvbmx5IGNvZGVjcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcmUgY29uc2lkZXJlZCB2YWxpZC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHZhbGlkIGFwdFgKLS8vIGNvZGVjLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNWZW5kb3JTb3VyY2VDb2RlY1ZhbGlkQXB0eChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBwZWVyIEEyRFAgYXB0WCBTaW5rCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgYXB0WAotLy8gY29kZWMsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTaW5rQ29kZWNWYWxpZEFwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIEEyRFAgZGF0YSBwYWNrZXRzIHNob3VsZCBjb250YWluIFJUUCBoZWFkZXIuCi0vLyB8Y29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWR8IGlzIHRydWUgaWYgQ29udGVudCBQcm90ZWN0aW9uIGlzCi0vLyBlbmFibGVkLiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIGRhdGEgcGFja2V0cyBzaG91bGQgY29udGFpbiBSVFAgaGVhZGVyLCBvdGhlcndpc2UKLS8vIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvclVzZXNSdHBIZWFkZXJBcHR4KGJvb2wgY29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBhcHRYIGNvZGVjIG5hbWUgZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjTmFtZUFwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgYXB0WCBjb2RlY3MgfHBfY29kZWNfaW5mb19hfCBhbmQgfHBfY29kZWNfaW5mb19ifAotLy8gaGF2ZSB0aGUgc2FtZSB0eXBlLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gY29kZWNzIGhhdmUgdGhlIHNhbWUgdHlwZSwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckNvZGVjVHlwZUVxdWFsc0FwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYik7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHR3byBBMkRQIGFwdFggY29kZWNzIHxwX2NvZGVjX2luZm9fYXwgYW5kIHxwX2NvZGVjX2luZm9fYnwKLS8vIGFyZSBleGFjdGx5IHRoZSBzYW1lLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gY29kZWNzIGFyZSBleGFjdGx5IHRoZSBzYW1lLCBvdGhlcndpc2UgZmFsc2UuCi0vLyBJZiB0aGUgY29kZWMgdHlwZSBpcyBub3QgYXB0WCwgdGhlIHJldHVybiB2YWx1ZSBpcyBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JDb2RlY0VxdWFsc0FwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKTsKLQotLy8gR2V0cyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgdmFsdWUgZm9yIHRoZSBBMkRQIGFwdFggY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGFwdFggY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX1ZlbmRvckdldFRyYWNrU2FtcGxlUmF0ZUFwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgdHJhY2sgYml0cyBwZXIgc2FtcGxlIHZhbHVlIGZvciB0aGUgQTJEUCBhcHRYIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgYml0cyBwZXIgc2FtcGxlIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tCaXRzUGVyU2FtcGxlQXB0eChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSB0cmFjayBiaXRyYXRlIHZhbHVlIGZvciB0aGUgQTJEUCBhcHRYIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9WZW5kb3JHZXRCaXRSYXRlQXB0eChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBjaGFubmVsIGNvdW50IGZvciB0aGUgQTJEUCBhcHRYIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgY2hhbm5lbCBjb3VudCBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX1ZlbmRvckdldFRyYWNrQ2hhbm5lbENvdW50QXB0eChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIGFwdFggYXVkaW8gZGF0YSB0aW1lc3RhbXAgZnJvbSBhbiBhdWRpbyBwYWNrZXQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9kYXRhfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIFRoZSB0aW1lc3RhbXAgaXMgc3RvcmVkIGluIHxwX3RpbWVzdGFtcHwuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckdldFBhY2tldFRpbWVzdGFtcEFwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKTsKLQotLy8gQnVpbGRzIEEyRFAgYXB0WCBjb2RlYyBoZWFkZXIgZm9yIGF1ZGlvIGRhdGEuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9idWZ8IGNvbnRhaW5zIHRoZSBhdWRpbyBkYXRhLgotLy8gfGZyYW1lc19wZXJfcGFja2V0fCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGlzIHBhY2tldC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yQnVpbGRDb2RlY0hlYWRlckFwdHgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lc19wZXJfcGFja2V0KTsKLQotLy8gRGVjb2RlcyBBMkRQIGFwdFggY29kZWMgaW5mbyBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLXN0ZDo6c3RyaW5nIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nQXB0eChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIGFwdFggZW5jb2RlciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmNvZGUgYW5kIHByZXBhcmUKLS8vIEEyRFAgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uIC0gc2VlIHx0QTJEUF9FTkNPREVSX0lOVEVSRkFDRXwuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyBSZXR1cm5zIHRoZSBBMkRQIGFwdFggZW5jb2RlciBpbnRlcmZhY2UgaWYgdGhlIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZAotLy8gc3VwcG9ydGVkLCBvdGhlcndpc2UgTlVMTC4KLWNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFKiBBMkRQX1ZlbmRvckdldEVuY29kZXJJbnRlcmZhY2VBcHR4KAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEFkanVzdHMgdGhlIEEyRFAgYXB0WCBjb2RlYywgYmFzZWQgb24gbG9jYWwgc3VwcG9ydCBhbmQgQmx1ZXRvb3RoCi0vLyBzcGVjaWZpY2F0aW9uLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uIHRvIGFkanVzdC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB8cF9jb2RlY19pbmZvfCBpcyB2YWxpZCBhbmQgc3VwcG9ydGVkLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yQWRqdXN0Q29kZWNBcHR4KHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgYXB0WCBTb3VyY2UgY29kZWMgaW5kZXggZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi0vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHxidGF2X2EyZHBfY29kZWNfaW5kZXhfdHwgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB8QlRBVl9BMkRQX0NPREVDX0lOREVYX01BWHwuCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXhBcHR4KAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgYXB0WCBTb3VyY2UgY29kZWMgbmFtZS4KLWNvbnN0IGNoYXIqIEEyRFBfVmVuZG9yQ29kZWNJbmRleFN0ckFwdHgodm9pZCk7Ci0KLS8vIEluaXRpYWxpemVzIEEyRFAgYXB0WCBTb3VyY2UgY29kZWMgaW5mb3JtYXRpb24gaW50byB8QXZkdHBTZXBDb25maWd8Ci0vLyBjb25maWd1cmF0aW9uIGVudHJ5IHBvaW50ZWQgYnkgfHBfY2ZnfC4KLWJvb2wgQTJEUF9WZW5kb3JJbml0Q29kZWNDb25maWdBcHR4KEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLSNlbmRpZiAgLy8gQTJEUF9WRU5ET1JfQVBUWF9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfY29uc3RhbnRzLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTg2Y2MuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9hcHR4X2NvbnN0YW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEEyRFAgY29uc3RhbnRzIGZvciBhcHRYIGNvZGVjCi0vLwotCi0jaWZuZGVmIEEyRFBfVkVORE9SX0FQVFhfQ09OU1RBTlRTX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfQVBUWF9DT05TVEFOVFNfSAotCi0vKiBhcHRYIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzICovCi0jZGVmaW5lIEEyRFBfQVBUWF9DT0RFQ19MRU4gOQotCi0jZGVmaW5lIEEyRFBfQVBUWF9WRU5ET1JfSUQgMHgwMDAwMDA0RgotI2RlZmluZSBBMkRQX0FQVFhfQ09ERUNfSURfQkxVRVRPT1RIIDB4MDAwMQotI2RlZmluZSBBMkRQX0FQVFhfU0FNUExFUkFURV80NDEwMCAweDIwCi0jZGVmaW5lIEEyRFBfQVBUWF9TQU1QTEVSQVRFXzQ4MDAwIDB4MTAKLSNkZWZpbmUgQTJEUF9BUFRYX0NIQU5ORUxTX1NURVJFTyAweDAyCi0jZGVmaW5lIEEyRFBfQVBUWF9DSEFOTkVMU19NT05PIDB4MDEKLSNkZWZpbmUgQTJEUF9BUFRYX0ZVVFVSRV8xIDB4MDAKLSNkZWZpbmUgQTJEUF9BUFRYX0ZVVFVSRV8yIDB4MDAKLQotI2VuZGlmICAvLyBBMkRQX1ZFTkRPUl9BUFRYX0NPTlNUQU5UU19ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9hcHR4X2VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzN2I2My4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfZW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEludGVyZmFjZSB0byB0aGUgQTJEUCBhcHRYIEVuY29kZXIKLS8vCi0KLSNpZm5kZWYgQTJEUF9WRU5ET1JfQVBUWF9FTkNPREVSX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfQVBUWF9FTkNPREVSX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLQotLy8gTG9hZHMgdGhlIEEyRFAgYXB0WCBlbmNvZGVyLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckxvYWRFbmNvZGVyQXB0eCh2b2lkKTsKLQotLy8gVW5sb2FkcyB0aGUgQTJEUCBhcHRYIGVuY29kZXIuCi12b2lkIEEyRFBfVmVuZG9yVW5sb2FkRW5jb2RlckFwdHgodm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgYXB0WCBlbmNvZGVyLgotLy8gfHBfcGVlcl9wYXJhbXN8IGNvbnRhaW5zIHRoZSBBMkRQIHBlZXIgaW5mb3JtYXRpb24uCi0vLyBUaGUgY3VycmVudCBBMkRQIGNvZGVjIGNvbmZpZyBpcyBpbiB8YTJkcF9jb2RlY19jb25maWd8LgotLy8gfHJlYWRfY2FsbGJhY2t8IGlzIHRoZSBjYWxsYmFjayBmb3IgcmVhZGluZyB0aGUgaW5wdXQgYXVkaW8gZGF0YS4KLS8vIHxlbnF1ZXVlX2NhbGxiYWNrfCBpcyB0aGUgY2FsbGJhY2sgZm9yIGVucXVldWVpbmcgdGhlIGVuY29kZWQgYXVkaW8gZGF0YS4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyX2luaXQoCi0gICAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TKiBwX3BlZXJfcGFyYW1zLAotICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsCi0gICAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2ssCi0gICAgYTJkcF9zb3VyY2VfZW5xdWV1ZV9jYWxsYmFja190IGVucXVldWVfY2FsbGJhY2spOwotCi0vLyBDbGVhbnVwIHRoZSBBMkRQIGFwdFggZW5jb2Rlci4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9lbmNvZGVyX2NsZWFudXAodm9pZCk7Ci0KLS8vIFJlc2V0IHRoZSBmZWVkaW5nIGZvciB0aGUgQTJEUCBhcHRYIGVuY29kZXIuCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfZmVlZGluZ19yZXNldCh2b2lkKTsKLQotLy8gRmx1c2ggdGhlIGZlZWRpbmcgZm9yIHRoZSBBMkRQIGFwdFggZW5jb2Rlci4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9mZWVkaW5nX2ZsdXNoKHZvaWQpOwotCi0vLyBHZXQgdGhlIEEyRFAgYXB0WCBlbmNvZGVyIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpLgotdWludDY0X3QgYTJkcF92ZW5kb3JfYXB0eF9nZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcyh2b2lkKTsKLQotLy8gR2V0IHRoZSBBMkRQIGFwdFggZW5jb2RlZCBtYXhpbXVtIGZyYW1lIHNpemUKLWludCBhMmRwX3ZlbmRvcl9hcHR4X2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSgpOwotCi0vLyBQcmVwYXJlIGFuZCBzZW5kIEEyRFAgYXB0WCBlbmNvZGVkIGZyYW1lcy4KLS8vIHx0aW1lc3RhbXBfdXN8IGlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCAoaW4gbWljcm9zZWNvbmRzKS4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9zZW5kX2ZyYW1lcyh1aW50NjRfdCB0aW1lc3RhbXBfdXMpOwotCi0jZW5kaWYgIC8vIEEyRFBfVkVORE9SX0FQVFhfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfaGQuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfYXB0eF9oZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U4MjUxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfYXB0eF9oZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBBMkRQIENvZGVjIEFQSSBmb3IgYXB0WC1IRAotLy8KLQotI2lmbmRlZiBBMkRQX1ZFTkRPUl9BUFRYX0hEX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfQVBUWF9IRF9ICi0KLSNpbmNsdWRlIDxidF90YXJnZXQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfYXB0eF9oZF9jb25zdGFudHMuaCIKLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLWNsYXNzIEEyZHBDb2RlY0NvbmZpZ0FwdHhIZCA6IHB1YmxpYyBBMmRwQ29kZWNDb25maWcgewotIHB1YmxpYzoKLSAgQTJkcENvZGVjQ29uZmlnQXB0eEhkKGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KTsKLSAgdmlydHVhbCB+QTJkcENvZGVjQ29uZmlnQXB0eEhkKCk7Ci0KLSAgYm9vbCBpbml0KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgc2V0Q29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcpIG92ZXJyaWRlOwotICBib29sIHNldFBlZXJDb2RlY0NhcGFiaWxpdGllcygKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCB1c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBkZWJ1Z19jb2RlY19kdW1wKGludCBmZCkgb3ZlcnJpZGU7Ci19OwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBBMkRQIGFwdFgtSEQgU291cmNlCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgYXB0WC1IRAotLy8gY29kZWMsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclNvdXJjZUNvZGVjVmFsaWRBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgcGVlciBBMkRQIGFwdFgtSEQgU2luawotLy8gY29kZWMuCi0vLyBOT1RFOiBvbmx5IGNvZGVjcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcmUgY29uc2lkZXJlZCB2YWxpZC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHZhbGlkIGFwdFgtSEQKLS8vIGNvZGVjLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfSXNWZW5kb3JQZWVyU2lua0NvZGVjVmFsaWRBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIEEyRFAgZGF0YSBwYWNrZXRzIHNob3VsZCBjb250YWluIFJUUCBoZWFkZXIuCi0vLyB8Y29udGVudF9wcm90ZWN0aW9uX2VuYWJsZWR8IGlzIHRydWUgaWYgQ29udGVudCBQcm90ZWN0aW9uIGlzCi0vLyBlbmFibGVkLiB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIGRhdGEgcGFja2V0cyBzaG91bGQgY29udGFpbiBSVFAgaGVhZGVyLCBvdGhlcndpc2UKLS8vIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvclVzZXNSdHBIZWFkZXJBcHR4SGQoYm9vbCBjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgYXB0WC1IRCBjb2RlYyBuYW1lIGZvciBhIGdpdmVuIHxwX2NvZGVjX2luZm98LgotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY05hbWVBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgYXB0WC1IRCBjb2RlY3MgfHBfY29kZWNfaW5mb19hfCBhbmQgfHBfY29kZWNfaW5mb19ifAotLy8gaGF2ZSB0aGUgc2FtZSB0eXBlLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gY29kZWNzIGhhdmUgdGhlIHNhbWUgdHlwZSwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckNvZGVjVHlwZUVxdWFsc0FwdHhIZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBDaGVja3Mgd2hldGhlciB0d28gQTJEUCBhcHRYLUhEIGNvZGVjcyB8cF9jb2RlY19pbmZvX2F8IGFuZCB8cF9jb2RlY19pbmZvX2J8Ci0vLyBhcmUgZXhhY3RseSB0aGUgc2FtZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGNvZGVjcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgb3RoZXJ3aXNlIGZhbHNlLgotLy8gSWYgdGhlIGNvZGVjIHR5cGUgaXMgbm90IGFwdFgtSEQsIHRoZSByZXR1cm4gdmFsdWUgaXMgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNFcXVhbHNBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBHZXRzIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSB2YWx1ZSBmb3IgdGhlIEEyRFAgYXB0WC1IRCBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgYXB0WC1IRCBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIHRyYWNrIHNhbXBsZSByYXRlIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tTYW1wbGVSYXRlQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIHRyYWNrIGJpdHMgcGVyIHNhbXBsZSB2YWx1ZSBmb3IgdGhlIEEyRFAgYXB0WC1IRCBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgYXB0WC1IRCBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIHRyYWNrIGJpdHMgcGVyIHNhbXBsZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX1ZlbmRvckdldFRyYWNrQml0c1BlclNhbXBsZUFwdHhIZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSB0cmFjayBiaXRyYXRlIHZhbHVlIGZvciB0aGUgQTJEUCBhcHRYLUhEIGNvZGVjLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYLUhEIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyB0aGUgdHJhY2sgc2FtcGxlIHJhdGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9WZW5kb3JHZXRCaXRSYXRlQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgY291bnQgZm9yIHRoZSBBMkRQIGFwdFgtSEQgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIGFwdFgtSEQgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIGNvdW50IG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnRBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBhcHRYLUhEIGF1ZGlvIGRhdGEgdGltZXN0YW1wIGZyb20gYW4gYXVkaW8gcGFja2V0LgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gfHBfZGF0YXwgY29udGFpbnMgdGhlIGF1ZGlvIGRhdGEuCi0vLyBUaGUgdGltZXN0YW1wIGlzIHN0b3JlZCBpbiB8cF90aW1lc3RhbXB8LgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JHZXRQYWNrZXRUaW1lc3RhbXBBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX3RpbWVzdGFtcCk7Ci0KLS8vIEJ1aWxkcyBBMkRQIGFwdFgtSEQgY29kZWMgaGVhZGVyIGZvciBhdWRpbyBkYXRhLgotLy8gfHBfY29kZWNfaW5mb3wgY29udGFpbnMgdGhlIGNvZGVjIGluZm9ybWF0aW9uLgotLy8gfHBfYnVmfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIHxmcmFtZXNfcGVyX3BhY2tldHwgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhpcyBwYWNrZXQuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckJ1aWxkQ29kZWNIZWFkZXJBcHR4SGQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lc19wZXJfcGFja2V0KTsKLQotLy8gRGVjb2RlcyBBMkRQIGFwdFgtSEQgY29kZWMgaW5mbyBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBhcHRYLUhEIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLXN0ZDo6c3RyaW5nIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nQXB0eEhkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgYXB0WC1IRCBlbmNvZGVyIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGVuY29kZSBhbmQKLS8vIHByZXBhcmUgQTJEUCBwYWNrZXRzIGZvciB0cmFuc21pc3Npb24gLSBzZWUgfHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFfC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIFJldHVybnMgdGhlIEEyRFAgYXB0WC1IRCBlbmNvZGVyIGludGVyZmFjZSBpZiB0aGUgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQKLS8vIGFuZCBzdXBwb3J0ZWQsIG90aGVyd2lzZSBOVUxMLgotY29uc3QgdEEyRFBfRU5DT0RFUl9JTlRFUkZBQ0UqIEEyRFBfVmVuZG9yR2V0RW5jb2RlckludGVyZmFjZUFwdHhIZCgKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBBZGp1c3RzIHRoZSBBMkRQIGFwdFgtSEQgY29kZWMsIGJhc2VkIG9uIGxvY2FsIHN1cHBvcnQgYW5kIEJsdWV0b290aAotLy8gc3BlY2lmaWNhdGlvbi4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbiB0byBhZGp1c3QuCi0vLyBSZXR1cm5zIHRydWUgaWYgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQgYW5kIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckFkanVzdENvZGVjQXB0eEhkKHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIEEyRFAgYXB0WC1IRCBTb3VyY2UgY29kZWMgaW5kZXggZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi0vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHxidGF2X2EyZHBfY29kZWNfaW5kZXhfdHwgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB8QlRBVl9BMkRQX0NPREVDX0lOREVYX01BWHwuCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNvdXJjZUNvZGVjSW5kZXhBcHR4SGQoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBhcHRYLUhEIFNvdXJjZSBjb2RlYyBuYW1lLgotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyQXB0eEhkKHZvaWQpOwotCi0vLyBJbml0aWFsaXplcyBBMkRQIGFwdFgtSEQgU291cmNlIGNvZGVjIGluZm9ybWF0aW9uIGludG8gfEF2ZHRwU2VwQ29uZmlnfAotLy8gY29uZmlndXJhdGlvbiBlbnRyeSBwb2ludGVkIGJ5IHxwX2NmZ3wuCi1ib29sIEEyRFBfVmVuZG9ySW5pdENvZGVjQ29uZmlnQXB0eEhkKEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLSNlbmRpZiAgLy8gQTJEUF9WRU5ET1JfQVBUWF9IRF9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfaGRfY29uc3RhbnRzLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2FwdHhfaGRfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZDhmZjguLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9hcHR4X2hkX2NvbnN0YW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEEyRFAgY29uc3RhbnRzIGZvciBhcHRYLUhEIGNvZGVjCi0vLwotCi0jaWZuZGVmIEEyRFBfVkVORE9SX0FQVFhfSERfQ09OU1RBTlRTX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfQVBUWF9IRF9DT05TVEFOVFNfSAotCi0vKiBhcHRYLUhEIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzICovCi0jZGVmaW5lIEEyRFBfQVBUWF9IRF9DT0RFQ19MRU4gMTMKLQotI2RlZmluZSBBMkRQX0FQVFhfSERfVkVORE9SX0lEIDB4MDAwMDAwRDcKLSNkZWZpbmUgQTJEUF9BUFRYX0hEX0NPREVDX0lEX0JMVUVUT09USCAweDAwMjQKLSNkZWZpbmUgQTJEUF9BUFRYX0hEX1NBTVBMRVJBVEVfNDQxMDAgMHgyMAotI2RlZmluZSBBMkRQX0FQVFhfSERfU0FNUExFUkFURV80ODAwMCAweDEwCi0jZGVmaW5lIEEyRFBfQVBUWF9IRF9DSEFOTkVMU19TVEVSRU8gMHgwMgotI2RlZmluZSBBMkRQX0FQVFhfSERfQ0hBTk5FTFNfTU9OTyAweDAxCi0jZGVmaW5lIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMCAweDAwCi0jZGVmaW5lIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMSAweDAwCi0jZGVmaW5lIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMiAweDAwCi0jZGVmaW5lIEEyRFBfQVBUWF9IRF9BQ0xfU1BSSU5UX1JFU0VSVkVEMyAweDAwCi0KLSNlbmRpZiAgLy8gQTJEUF9WRU5ET1JfQVBUWF9IRF9DT05TVEFOVFNfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWFkMDEuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9hcHR4X2hkX2VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBJbnRlcmZhY2UgdG8gdGhlIEEyRFAgYXB0WC1IRCBFbmNvZGVyCi0vLwotCi0jaWZuZGVmIEEyRFBfVkVORE9SX0FQVFhfSERfRU5DT0RFUl9ICi0jZGVmaW5lIEEyRFBfVkVORE9SX0FQVFhfSERfRU5DT0RFUl9ICi0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotCi0vLyBMb2FkcyB0aGUgQTJEUCBhcHRYLUhEIGVuY29kZXIuCi0vLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yTG9hZEVuY29kZXJBcHR4SGQodm9pZCk7Ci0KLS8vIFVubG9hZHMgdGhlIEEyRFAgYXB0WC1IRCBlbmNvZGVyLgotdm9pZCBBMkRQX1ZlbmRvclVubG9hZEVuY29kZXJBcHR4SGQodm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgYXB0WC1IRCBlbmNvZGVyLgotLy8gfHBfcGVlcl9wYXJhbXN8IGNvbnRhaW5zIHRoZSBBMkRQIHBlZXIgaW5mb3JtYXRpb24uCi0vLyBUaGUgY3VycmVudCBBMkRQIGNvZGVjIGNvbmZpZyBpcyBpbiB8YTJkcF9jb2RlY19jb25maWd8LgotLy8gfHJlYWRfY2FsbGJhY2t8IGlzIHRoZSBjYWxsYmFjayBmb3IgcmVhZGluZyB0aGUgaW5wdXQgYXVkaW8gZGF0YS4KLS8vIHxlbnF1ZXVlX2NhbGxiYWNrfCBpcyB0aGUgY2FsbGJhY2sgZm9yIGVucXVldWVpbmcgdGhlIGVuY29kZWQgYXVkaW8gZGF0YS4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyX2luaXQoCi0gICAgY29uc3QgdEEyRFBfRU5DT0RFUl9JTklUX1BFRVJfUEFSQU1TKiBwX3BlZXJfcGFyYW1zLAotICAgIEEyZHBDb2RlY0NvbmZpZyogYTJkcF9jb2RlY19jb25maWcsCi0gICAgYTJkcF9zb3VyY2VfcmVhZF9jYWxsYmFja190IHJlYWRfY2FsbGJhY2ssCi0gICAgYTJkcF9zb3VyY2VfZW5xdWV1ZV9jYWxsYmFja190IGVucXVldWVfY2FsbGJhY2spOwotCi0vLyBDbGVhbnVwIHRoZSBBMkRQIGFwdFgtSEQgZW5jb2Rlci4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9oZF9lbmNvZGVyX2NsZWFudXAodm9pZCk7Ci0KLS8vIFJlc2V0IHRoZSBmZWVkaW5nIGZvciB0aGUgQTJEUCBhcHRYLUhEIGVuY29kZXIuCi12b2lkIGEyZHBfdmVuZG9yX2FwdHhfaGRfZmVlZGluZ19yZXNldCh2b2lkKTsKLQotLy8gRmx1c2ggdGhlIGZlZWRpbmcgZm9yIHRoZSBBMkRQIGFwdFgtSEQgZW5jb2Rlci4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9oZF9mZWVkaW5nX2ZsdXNoKHZvaWQpOwotCi0vLyBHZXQgdGhlIEEyRFAgYXB0WC1IRCBlbmNvZGVyIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpLgotdWludDY0X3QgYTJkcF92ZW5kb3JfYXB0eF9oZF9nZXRfZW5jb2Rlcl9pbnRlcnZhbF9tcyh2b2lkKTsKLQotLy8gR2V0IHRoZSBBMkRQIGFwdFgtSEQgZW5jb2RlZCBtYXhpbXVtIGZyYW1lIHNpemUKLWludCBhMmRwX3ZlbmRvcl9hcHR4X2hkX2dldF9lZmZlY3RpdmVfZnJhbWVfc2l6ZSgpOwotCi0vLyBQcmVwYXJlIGFuZCBzZW5kIEEyRFAgYXB0WC1IRCBlbmNvZGVkIGZyYW1lcy4KLS8vIHx0aW1lc3RhbXBfdXN8IGlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCAoaW4gbWljcm9zZWNvbmRzKS4KLXZvaWQgYTJkcF92ZW5kb3JfYXB0eF9oZF9zZW5kX2ZyYW1lcyh1aW50NjRfdCB0aW1lc3RhbXBfdXMpOwotCi0jZW5kaWYgIC8vIEEyRFBfVkVORE9SX0FQVFhfSERfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWMuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfbGRhYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI1ZDJjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfbGRhYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBBMkRQIENvZGVjIEFQSSBmb3IgTERBQwotLy8KLQotI2lmbmRlZiBBMkRQX1ZFTkRPUl9MREFDX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfTERBQ19ICi0KLSNpbmNsdWRlIDxidF90YXJnZXQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0jaW5jbHVkZSAiYTJkcF92ZW5kb3JfbGRhY19jb25zdGFudHMuaCIKLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLWNsYXNzIEEyZHBDb2RlY0NvbmZpZ0xkYWNCYXNlIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZyB7Ci0gcHJvdGVjdGVkOgotICBBMmRwQ29kZWNDb25maWdMZGFjQmFzZShidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3NvdXJjZSkKLSAgICAgIDogQTJkcENvZGVjQ29uZmlnKGNvZGVjX2luZGV4LCBuYW1lLCBjb2RlY19wcmlvcml0eSksCi0gICAgICAgIGlzX3NvdXJjZV8oaXNfc291cmNlKSB7fQotICBib29sIHNldENvZGVjQ29uZmlnKGNvbnN0IHVpbnQ4X3QqIHBfcGVlcl9jb2RlY19pbmZvLCBib29sIGlzX2NhcGFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnKSBvdmVycmlkZTsKLSAgYm9vbCBzZXRQZWVyQ29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgaXNfc291cmNlXzsgIC8vIFRydWUgaWYgbG9jYWwgaXMgU291cmNlCi19OwotCi1jbGFzcyBBMmRwQ29kZWNDb25maWdMZGFjU291cmNlIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZ0xkYWNCYXNlIHsKLSBwdWJsaWM6Ci0gIEEyZHBDb2RlY0NvbmZpZ0xkYWNTb3VyY2UoYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNfcHJpb3JpdHkpOwotICB2aXJ0dWFsIH5BMmRwQ29kZWNDb25maWdMZGFjU291cmNlKCk7Ci0KLSAgYm9vbCBpbml0KCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBib29sIHVzZVJ0cEhlYWRlck1hcmtlckJpdCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIGRlYnVnX2NvZGVjX2R1bXAoaW50IGZkKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIEEyZHBDb2RlY0NvbmZpZ0xkYWNTaW5rIDogcHVibGljIEEyZHBDb2RlY0NvbmZpZ0xkYWNCYXNlIHsKLSBwdWJsaWM6Ci0gIEEyZHBDb2RlY0NvbmZpZ0xkYWNTaW5rKGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KTsKLSAgdmlydHVhbCB+QTJkcENvZGVjQ29uZmlnTGRhY1NpbmsoKTsKLQotICBib29sIGluaXQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgdXNlUnRwSGVhZGVyTWFya2VyQml0KCkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBBMkRQIExEQUMgU291cmNlCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgTERBQwotLy8gY29kZWMsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclNvdXJjZUNvZGVjVmFsaWRMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgY29udGFpbiBhIHZhbGlkIEEyRFAgTERBQyBTaW5rCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgTERBQwotLy8gY29kZWMsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclNpbmtDb2RlY1ZhbGlkTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgY29kZWMgY2FwYWJpbGl0aWVzIGNvbnRhaW4gYSB2YWxpZCBwZWVyIEEyRFAgTERBQyBTaW5rCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgTERBQwotLy8gY29kZWMsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTaW5rQ29kZWNWYWxpZExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGNvZGVjIGNhcGFiaWxpdGllcyBjb250YWluIGEgdmFsaWQgcGVlciBBMkRQIExEQUMgU291cmNlCi0vLyBjb2RlYy4KLS8vIE5PVEU6IG9ubHkgY29kZWNzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFyZSBjb25zaWRlcmVkIHZhbGlkLgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgdmFsaWQgTERBQwotLy8gY29kZWMsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclBlZXJTb3VyY2VDb2RlY1ZhbGlkTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciBBMkRQIExEQUMgU2luayBjb2RlYyBpcyBzdXBwb3J0ZWQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZWMgY2FwYWJpbGl0aWVzLgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBBMkRQIExEQUMgU2luayBjb2RlYyBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9Jc1ZlbmRvclNpbmtDb2RlY1N1cHBvcnRlZExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgYW4gQTJEUCBMREFDIFNvdXJjZSBjb2RlYyBmb3IgYSBwZWVyIFNvdXJjZSBkZXZpY2UgaXMKLS8vIHN1cHBvcnRlZC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgb2YgdGhlCi0vLyBwZWVyIGRldmljZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQTJEUCBMREFDIFNvdXJjZSBjb2RlYyBmb3IgYSBwZWVyIFNvdXJjZSBkZXZpY2UgaXMKLS8vIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgQTJEUCBkYXRhIHBhY2tldHMgc2hvdWxkIGNvbnRhaW4gUlRQIGhlYWRlci4KLS8vIHxjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZHwgaXMgdHJ1ZSBpZiBDb250ZW50IFByb3RlY3Rpb24gaXMKLS8vIGVuYWJsZWQuIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIEEyRFAgZGF0YSBwYWNrZXRzIHNob3VsZCBjb250YWluIFJUUCBoZWFkZXIsIG90aGVyd2lzZQotLy8gZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yVXNlc1J0cEhlYWRlckxkYWMoYm9vbCBjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIExEQUMgY29kZWMgbmFtZSBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLWNvbnN0IGNoYXIqIEEyRFBfVmVuZG9yQ29kZWNOYW1lTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBDaGVja3Mgd2hldGhlciB0d28gQTJEUCBMREFDIGNvZGVjcyB8cF9jb2RlY19pbmZvX2F8IGFuZCB8cF9jb2RlY19pbmZvX2J8Ci0vLyBoYXZlIHRoZSBzYW1lIHR5cGUuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBjb2RlY3MgaGF2ZSB0aGUgc2FtZSB0eXBlLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yQ29kZWNUeXBlRXF1YWxzTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgdHdvIEEyRFAgTERBQyBjb2RlY3MgfHBfY29kZWNfaW5mb19hfCBhbmQgfHBfY29kZWNfaW5mb19ifAotLy8gYXJlIGV4YWN0bHkgdGhlIHNhbWUuCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBjb2RlY3MgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIG90aGVyd2lzZSBmYWxzZS4KLS8vIElmIHRoZSBjb2RlYyB0eXBlIGlzIG5vdCBMREFDLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckNvZGVjRXF1YWxzTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvX2IpOwotCi0vLyBHZXRzIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSB2YWx1ZSBmb3IgdGhlIEEyRFAgTERBQyBjb2RlYy4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgTERBQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIHRyYWNrIHNhbXBsZSByYXRlIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tTYW1wbGVSYXRlTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSB0cmFjayBiaXRzIHBlciBzYW1wbGUgdmFsdWUgZm9yIHRoZSBBMkRQIExEQUMgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIExEQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSB0cmFjayBiaXRzIHBlciBzYW1wbGUgb24gc3VjY2Vzcywgb3IgLTEgaWYgfHBfY29kZWNfaW5mb3wKLS8vIGNvbnRhaW5zIGludmFsaWQgY29kZWMgaW5mb3JtYXRpb24uCi1pbnQgQTJEUF9WZW5kb3JHZXRUcmFja0JpdHNQZXJTYW1wbGVMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIHRyYWNrIGJpdHJhdGUgdmFsdWUgZm9yIHRoZSBBMkRQIExEQUMgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIExEQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSBvbiBzdWNjZXNzLCBvciAtMSBpZiB8cF9jb2RlY19pbmZvfAotLy8gY29udGFpbnMgaW52YWxpZCBjb2RlYyBpbmZvcm1hdGlvbi4KLWludCBBMkRQX1ZlbmRvckdldEJpdFJhdGVMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgY291bnQgZm9yIHRoZSBBMkRQIExEQUMgY29kZWMuCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIExEQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIGNvdW50IG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tDaGFubmVsQ291bnRMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgdHlwZSBmb3IgdGhlIEEyRFAgTERBQyBjb2RlYy4KLS8vIDEgZm9yIG1vbm8sIG9yIDMgZm9yIGR1YWwgY2hhbm5lbC9zdGVyZW8uCi0vLyB8cF9jb2RlY19pbmZvfCBpcyBhIHBvaW50ZXIgdG8gdGhlIExEQUMgY29kZWNfaW5mbyB0byBkZWNvZGUuCi0vLyBSZXR1cm5zIHRoZSBjaGFubmVsIGNvdW50IG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGVMZGFjKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGNoYW5uZWwgbW9kZSBjb2RlIGZvciB0aGUgQTJEUCBMREFDIGNvZGVjLgotLy8gVGhlIGFjdHVhbCB2YWx1ZSBpcyBjb2RlYy1zcGVjaWZpYyAtIHNlZSB8QTJEUF9MREFDX0NIQU5ORUxfTU9ERV8qfC4KLS8vIHxwX2NvZGVjX2luZm98IGlzIGEgcG9pbnRlciB0byB0aGUgTERBQyBjb2RlY19pbmZvIHRvIGRlY29kZS4KLS8vIFJldHVybnMgdGhlIGNoYW5uZWwgbW9kZSBjb2RlIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHxwX2NvZGVjX2luZm98Ci0vLyBjb250YWlucyBpbnZhbGlkIGNvZGVjIGluZm9ybWF0aW9uLgotaW50IEEyRFBfVmVuZG9yR2V0Q2hhbm5lbE1vZGVDb2RlTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIExEQUMgYXVkaW8gZGF0YSB0aW1lc3RhbXAgZnJvbSBhbiBhdWRpbyBwYWNrZXQuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9kYXRhfCBjb250YWlucyB0aGUgYXVkaW8gZGF0YS4KLS8vIFRoZSB0aW1lc3RhbXAgaXMgc3RvcmVkIGluIHxwX3RpbWVzdGFtcHwuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckdldFBhY2tldFRpbWVzdGFtcExkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKTsKLQotLy8gQnVpbGRzIEEyRFAgTERBQyBjb2RlYyBoZWFkZXIgZm9yIGF1ZGlvIGRhdGEuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyB8cF9idWZ8IGNvbnRhaW5zIHRoZSBhdWRpbyBkYXRhLgotLy8gfGZyYW1lc19wZXJfcGFja2V0fCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGlzIHBhY2tldC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yQnVpbGRDb2RlY0hlYWRlckxkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lc19wZXJfcGFja2V0KTsKLQotLy8gRGVjb2RlcyBBMkRQIExEQUMgY29kZWMgaW5mbyBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLgotLy8gfHBfY29kZWNfaW5mb3wgaXMgYSBwb2ludGVyIHRvIHRoZSBMREFDIGNvZGVjX2luZm8gdG8gZGVjb2RlLgotLy8gUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLXN0ZDo6c3RyaW5nIEEyRFBfVmVuZG9yQ29kZWNJbmZvU3RyaW5nTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIExEQUMgZW5jb2RlciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmNvZGUgYW5kIHByZXBhcmUKLS8vIEEyRFAgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uIC0gc2VlIHx0QTJEUF9FTkNPREVSX0lOVEVSRkFDRXwuCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24uCi0vLyBSZXR1cm5zIHRoZSBBMkRQIExEQUMgZW5jb2RlciBpbnRlcmZhY2UgaWYgdGhlIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZAotLy8gc3VwcG9ydGVkLCBvdGhlcndpc2UgTlVMTC4KLWNvbnN0IHRBMkRQX0VOQ09ERVJfSU5URVJGQUNFKiBBMkRQX1ZlbmRvckdldEVuY29kZXJJbnRlcmZhY2VMZGFjKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbyk7Ci0KLS8vIEdldHMgdGhlIGN1cnJlbnQgQTJEUCBMREFDIGRlY29kZXIgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjb2RlCi0vLyByZWNlaXZlZCBBMkRQIHBhY2tldHMgLSBzZWUgfHRBMkRQX0RFQ09ERVJfSU5URVJGQUNFfC4KLS8vIHxwX2NvZGVjX2luZm98IGNvbnRhaW5zIHRoZSBjb2RlYyBpbmZvcm1hdGlvbi4KLS8vIFJldHVybnMgdGhlIEEyRFAgTERBQyBkZWNvZGVyIGludGVyZmFjZSBpZiB0aGUgfHBfY29kZWNfaW5mb3wgaXMgdmFsaWQgYW5kCi0vLyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBOVUxMLgotY29uc3QgdEEyRFBfREVDT0RFUl9JTlRFUkZBQ0UqIEEyRFBfVmVuZG9yR2V0RGVjb2RlckludGVyZmFjZUxkYWMoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gQWRqdXN0cyB0aGUgQTJEUCBMREFDIGNvZGVjLCBiYXNlZCBvbiBsb2NhbCBzdXBwb3J0IGFuZCBCbHVldG9vdGgKLS8vIHNwZWNpZmljYXRpb24uCi0vLyB8cF9jb2RlY19pbmZvfCBjb250YWlucyB0aGUgY29kZWMgaW5mb3JtYXRpb24gdG8gYWRqdXN0LgotLy8gUmV0dXJucyB0cnVlIGlmIHxwX2NvZGVjX2luZm98IGlzIHZhbGlkIGFuZCBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JBZGp1c3RDb2RlY0xkYWModWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBMREFDIFNvdXJjZSBjb2RlYyBpbmRleCBmb3IgYSBnaXZlbiB8cF9jb2RlY19pbmZvfC4KLS8vIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgfGJ0YXZfYTJkcF9jb2RlY19pbmRleF90fCBvbiBzdWNjZXNzLAotLy8gb3RoZXJ3aXNlIHxCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYfC4KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfVmVuZG9yU291cmNlQ29kZWNJbmRleExkYWMoCi0gICAgY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKTsKLQotLy8gR2V0cyB0aGUgQTJEUCBMREFDIFNpbmsgY29kZWMgaW5kZXggZm9yIGEgZ2l2ZW4gfHBfY29kZWNfaW5mb3wuCi0vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHxidGF2X2EyZHBfY29kZWNfaW5kZXhfdHwgb24gc3VjY2VzcywKLS8vIG90aGVyd2lzZSB8QlRBVl9BMkRQX0NPREVDX0lOREVYX01BWHwuCi1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBBMkRQX1ZlbmRvclNpbmtDb2RlY0luZGV4TGRhYygKLSAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0vLyBHZXRzIHRoZSBBMkRQIExEQUMgU291cmNlIGNvZGVjIG5hbWUuCi1jb25zdCBjaGFyKiBBMkRQX1ZlbmRvckNvZGVjSW5kZXhTdHJMZGFjKHZvaWQpOwotCi0vLyBHZXRzIHRoZSBBMkRQIExEQUMgU2luayBjb2RlYyBuYW1lLgotY29uc3QgY2hhciogQTJEUF9WZW5kb3JDb2RlY0luZGV4U3RyTGRhY1Npbmsodm9pZCk7Ci0KLS8vIEluaXRpYWxpemVzIEEyRFAgTERBQyBTb3VyY2UgY29kZWMgaW5mb3JtYXRpb24gaW50byB8QXZkdHBTZXBDb25maWd8Ci0vLyBjb25maWd1cmF0aW9uIGVudHJ5IHBvaW50ZWQgYnkgfHBfY2ZnfC4KLWJvb2wgQTJEUF9WZW5kb3JJbml0Q29kZWNDb25maWdMZGFjKEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLS8vIEluaXRpYWxpemVzIEEyRFAgTERBQyBTaW5rIGNvZGVjIGluZm9ybWF0aW9uIGludG8gfEF2ZHRwU2VwQ29uZmlnfAotLy8gY29uZmlndXJhdGlvbiBlbnRyeSBwb2ludGVkIGJ5IHxwX2NmZ3wuCi1ib29sIEEyRFBfVmVuZG9ySW5pdENvZGVjQ29uZmlnTGRhY1NpbmsoQXZkdHBTZXBDb25maWcqIHBfY2ZnKTsKLQotI2VuZGlmICAvLyBBMkRQX1ZFTkRPUl9MREFDX0gKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfbGRhY19hYnIuaCBiL3N0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfbGRhY19hYnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhNGQwZS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfYWJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gSW50ZXJmYWNlIHRvIHRoZSBBMkRQIExEQUMgQUJSCi0vLwotCi0jaWZuZGVmIEEyRFBfVkVORE9SX0xEQUNfQUJSX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfTERBQ19BQlJfSAotCi0jaW5jbHVkZSA8bGRhY0JUX2Fici5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8vIEluaXRpYWwgRVFNSUQgZm9yIEFCUiBtb2RlLgotI2RlZmluZSBMREFDX0FCUl9NT0RFX0VRTUlEIExEQUNCVF9FUU1JRF9TUQotCi0vLyBMb2FkcyB0aGUgTERBQyBBQlIgbGlicmFyeS4KLS8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KLWJvb2wgQTJEUF9WZW5kb3JMb2FkTGRhY0Ficih2b2lkKTsKLQotLy8gVW5sb2FkcyB0aGUgTERBQyBBQlIgbGlicmFyeS4KLXZvaWQgQTJEUF9WZW5kb3JVbmxvYWRMZGFjQWJyKHZvaWQpOwotCi0vLyBHZXRzIHRoZSBMREFDIEFCUiBoYW5kbGUuCi0vLyBSZXR1cm4gdGhlIExEQUMgQUJSIGhhbmRsZS4KLUhBTkRMRV9MREFDX0FCUiBhMmRwX2xkYWNfYWJyX2dldF9oYW5kbGUodm9pZCk7Ci0KLS8vIEZyZWUgdGhlIExEQUMgQUJSIGhhbmRsZS4KLXZvaWQgYTJkcF9sZGFjX2Ficl9mcmVlX2hhbmRsZShIQU5ETEVfTERBQ19BQlIgaExkYWNBYnIpOwotCi0vLyBJbml0aWFsaXplcyB0aGUgTERBQyBBQlIgaGFuZGxlLgotLy8gUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4KLWludCBhMmRwX2xkYWNfYWJyX2luaXQoSEFORExFX0xEQUNfQUJSIGhMZGFjQWJyLCB1bnNpZ25lZCBpbnQgaW50ZXJ2YWxfbXMpOwotCi0vLyBTZXRzIHRocmVzaG9sZHMgZm9yIHRoZSBMREFDIEFCUiBoYW5kbGUuCi0vLyBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLgotaW50IGEyZHBfbGRhY19hYnJfc2V0X3RocmVzaG9sZHMoSEFORExFX0xEQUNfQUJSIGhMZGFjQWJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRoX2NyaXRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRoX2Rhbmdlcm91c190cmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aF80aHFzcSk7Ci0KLS8vIExEQUMgQUJSIG1haW4gcHJvY2Vzcy4KLS8vIEl0IGNvbnRyb2xzIExEQUMgZW5jb2RlciBiaXQgcmF0ZSBiYXNlZCBvbiBBMkRQIHRyYW5zbWl0IHF1ZXVlIGxlbmd0aC4KLS8vIHJldHVybiBjdXJyZW50IEVRTUlEIG9mIExEQUMgZW5jb2Rlci4KLWludCBhMmRwX2xkYWNfYWJyX3Byb2MoSEFORExFX0xEQUNfQlQgaExkYWNQYXJhbSwgSEFORExFX0xEQUNfQUJSIGhMZGFjQWJyLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdHJhbnNtaXRfcXVldWVfbGVuZ3RoLCB1bnNpZ25lZCBpbnQgZmxhZ19lbmFibGUpOwotCi0jZW5kaWYgIC8vIEEyRFBfVkVORE9SX0xEQUNfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfY29uc3RhbnRzLmggYi9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjkyMDAuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9sZGFjX2NvbnN0YW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEEyRFAgY29uc3RhbnRzIGZvciBMREFDIGNvZGVjCi0vLwotCi0jaWZuZGVmIEEyRFBfVkVORE9SX0xEQUNfQ09OU1RBTlRTX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfTERBQ19DT05TVEFOVFNfSAotCi0vLyBMREFDIFF1YWxpdHkgTW9kZSBJbmRleAotI2RlZmluZSBBMkRQX0xEQUNfUVVBTElUWV9ISUdIIDAgIC8vIEVxdWFsIHRvIExEQUNCVF9FUU1JRF9IUSA5OTBrYnBzCi0jZGVmaW5lIEEyRFBfTERBQ19RVUFMSVRZX01JRCAxICAgLy8gRXF1YWwgdG8gTERBQ0JUX0VRTUlEX1NRIDY2MGticHMKLSNkZWZpbmUgQTJEUF9MREFDX1FVQUxJVFlfTE9XIDIgICAvLyBFcXVhbCB0byBMREFDQlRfRVFNSURfTVEgMzMwa2JwcwotI2RlZmluZSBBMkRQX0xEQUNfUVVBTElUWV9BQlIgMyAgIC8vIEFCUiBtb2RlLCByYW5nZTogOTkwLDY2MCw0OTIsMzk2LDMzMChrYnBzKQotLy8gQUJSIG1vZGUgaW4gb2ZmbG9hZCwgcmFuZ2U6IDk5MCw2NjAsNDkyLDM5NiwzMzAoa2JwcykKLSNkZWZpbmUgQTJEUF9MREFDX1FVQUxJVFlfQUJSX09GRkxPQUQgMHg3RgotCi0vLyBMZW5ndGggb2YgdGhlIExEQUMgTWVkaWEgUGF5bG9hZCBoZWFkZXIKLSNkZWZpbmUgQTJEUF9MREFDX01QTF9IRFJfTEVOIDEKLQotLy8gTERBQyBNZWRpYSBQYXlsb2FkIEhlYWRlcgotI2RlZmluZSBBMkRQX0xEQUNfSERSX0ZfTVNLIDB4ODAKLSNkZWZpbmUgQTJEUF9MREFDX0hEUl9TX01TSyAweDQwCi0jZGVmaW5lIEEyRFBfTERBQ19IRFJfTF9NU0sgMHgyMAotI2RlZmluZSBBMkRQX0xEQUNfSERSX05VTV9NU0sgMHgwRgotCi0vLyBMREFDIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzCi0jZGVmaW5lIEEyRFBfTERBQ19DT0RFQ19MRU4gMTAKLS8vIFtPY3RldCAwLTNdIFZlbmRvciBJRAotI2RlZmluZSBBMkRQX0xEQUNfVkVORE9SX0lEIDB4MDAwMDAxMkQKLS8vIFtPY3RldCA0LTVdIFZlbmRvciBTcGVjaWZpYyBDb2RlYyBJRAotI2RlZmluZSBBMkRQX0xEQUNfQ09ERUNfSUQgMHgwMEFBCi0vLyBbT2N0ZXQgNl0sIFtCaXRzIDAtNV0gU2FtcGxpbmcgRnJlcXVlbmN5Ci0jZGVmaW5lIEEyRFBfTERBQ19TQU1QTElOR19GUkVRX01BU0sgMHgzRgotI2RlZmluZSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV80NDEwMCAweDIwCi0jZGVmaW5lIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzQ4MDAwIDB4MTAKLSNkZWZpbmUgQTJEUF9MREFDX1NBTVBMSU5HX0ZSRVFfODgyMDAgMHgwOAotI2RlZmluZSBBMkRQX0xEQUNfU0FNUExJTkdfRlJFUV85NjAwMCAweDA0Ci0jZGVmaW5lIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE3NjQwMCAweDAyCi0jZGVmaW5lIEEyRFBfTERBQ19TQU1QTElOR19GUkVRXzE5MjAwMCAweDAxCi0vLyBbT2N0ZXQgN10sIFtCaXRzIDAtMl0gQ2hhbm5lbCBNb2RlCi0jZGVmaW5lIEEyRFBfTERBQ19DSEFOTkVMX01PREVfTUFTSyAweDA3Ci0jZGVmaW5lIEEyRFBfTERBQ19DSEFOTkVMX01PREVfTU9OTyAweDA0Ci0jZGVmaW5lIEEyRFBfTERBQ19DSEFOTkVMX01PREVfRFVBTCAweDAyCi0jZGVmaW5lIEEyRFBfTERBQ19DSEFOTkVMX01PREVfU1RFUkVPIDB4MDEKLQotI2VuZGlmICAvLyBBMkRQX1ZFTkRPUl9MREFDX0NPTlNUQU5UU19ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNWI4My4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEludGVyZmFjZSB0byB0aGUgQTJEUCBMREFDIERlY29kZXIKLS8vCi0KLSNpZm5kZWYgQTJEUF9WRU5ET1JfTERBQ19ERUNPREVSX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfTERBQ19ERUNPREVSX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vLyBMb2FkcyB0aGUgQTJEUCBMREFDIGRlY29kZXIuCi0vLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCi1ib29sIEEyRFBfVmVuZG9yTG9hZERlY29kZXJMZGFjKHZvaWQpOwotCi0vLyBVbmxvYWRzIHRoZSBBMkRQIExEQUMgZGVjb2Rlci4KLXZvaWQgQTJEUF9WZW5kb3JVbmxvYWREZWNvZGVyTGRhYyh2b2lkKTsKLQotLy8gSW5pdGlhbGl6ZSB0aGUgQTJEUCBMREFDIGRlY29kZXIuCi1ib29sIGEyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl9pbml0KGRlY29kZWRfZGF0YV9jYWxsYmFja190IGRlY29kZV9jYWxsYmFjayk7Ci0KLS8vIENsZWFudXAgdGhlIEEyRFAgTERBQyBkZWNvZGVyLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfY2xlYW51cCh2b2lkKTsKLQotLy8gRGVjb2RlcyB8cF9idWZ8LiBDYWxscyB8ZGVjb2RlX2NhbGxiYWNrfCBwYXNzZWQgaW50bwotLy8gfGEyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl9pbml0fCBpZiBkZWNvZGVkIGZyYW1lcyBhcmUgYXZhaWxhYmxlLgotYm9vbCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfZGVjb2RlX3BhY2tldChCVF9IRFIqIHBfYnVmKTsKLQotLy8gU3RhcnQgdGhlIEEyRFAgTERBQyBkZWNvZGVyLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfc3RhcnQodm9pZCk7Ci0KLS8vIFN1c3BlbmQgdGhlIEEyRFAgTERBQyBkZWNvZGVyLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfc3VzcGVuZCh2b2lkKTsKLQotLy8gQTJEUCBMREFDIGRlY29kZXIgY29uZmlndXJhdGlvbi4KLXZvaWQgYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyX2NvbmZpZ3VyZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pOwotCi0jZW5kaWYgIC8vIEEyRFBfVkVORE9SX0xEQUNfREVDT0RFUl9ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfZW5jb2Rlci5oIGIvc3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1YTgxZi4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2EyZHBfdmVuZG9yX2xkYWNfZW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEludGVyZmFjZSB0byB0aGUgQTJEUCBMREFDIEVuY29kZXIKLS8vCi0KLSNpZm5kZWYgQTJEUF9WRU5ET1JfTERBQ19FTkNPREVSX0gKLSNkZWZpbmUgQTJEUF9WRU5ET1JfTERBQ19FTkNPREVSX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLQotLy8gTG9hZHMgdGhlIEEyRFAgTERBQyBlbmNvZGVyLgotLy8gUmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgotYm9vbCBBMkRQX1ZlbmRvckxvYWRFbmNvZGVyTGRhYyh2b2lkKTsKLQotLy8gVW5sb2FkcyB0aGUgQTJEUCBMREFDIGVuY29kZXIuCi12b2lkIEEyRFBfVmVuZG9yVW5sb2FkRW5jb2RlckxkYWModm9pZCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIEEyRFAgTERBQyBlbmNvZGVyLgotLy8gfHBfcGVlcl9wYXJhbXN8IGNvbnRhaW5zIHRoZSBBMkRQIHBlZXIgaW5mb3JtYXRpb24KLS8vIFRoZSBjdXJyZW50IEEyRFAgY29kZWMgY29uZmlnIGlzIGluIHxhMmRwX2NvZGVjX2NvbmZpZ3wuCi0vLyB8cmVhZF9jYWxsYmFja3wgaXMgdGhlIGNhbGxiYWNrIGZvciByZWFkaW5nIHRoZSBpbnB1dCBhdWRpbyBkYXRhLgotLy8gfGVucXVldWVfY2FsbGJhY2t8IGlzIHRoZSBjYWxsYmFjayBmb3IgZW5xdWV1ZWluZyB0aGUgZW5jb2RlZCBhdWRpbyBkYXRhLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXJfaW5pdCgKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgQTJkcENvZGVjQ29uZmlnKiBhMmRwX2NvZGVjX2NvbmZpZywKLSAgICBhMmRwX3NvdXJjZV9yZWFkX2NhbGxiYWNrX3QgcmVhZF9jYWxsYmFjaywKLSAgICBhMmRwX3NvdXJjZV9lbnF1ZXVlX2NhbGxiYWNrX3QgZW5xdWV1ZV9jYWxsYmFjayk7Ci0KLS8vIENsZWFudXAgdGhlIEEyRFAgTERBQyBlbmNvZGVyLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2VuY29kZXJfY2xlYW51cCh2b2lkKTsKLQotLy8gUmVzZXQgdGhlIGZlZWRpbmcgZm9yIHRoZSBBMkRQIExEQUMgZW5jb2Rlci4KLXZvaWQgYTJkcF92ZW5kb3JfbGRhY19mZWVkaW5nX3Jlc2V0KHZvaWQpOwotCi0vLyBGbHVzaCB0aGUgZmVlZGluZyBmb3IgdGhlIEEyRFAgTERBQyBlbmNvZGVyLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX2ZlZWRpbmdfZmx1c2godm9pZCk7Ci0KLS8vIEdldCB0aGUgQTJEUCBMREFDIGVuY29kZXIgaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykuCi11aW50NjRfdCBhMmRwX3ZlbmRvcl9sZGFjX2dldF9lbmNvZGVyX2ludGVydmFsX21zKHZvaWQpOwotCi0vLyBHZXQgdGhlIEEyRFAgTERBQyBlbmNvZGVkIG1heGltdW0gZnJhbWUgc2l6ZQotaW50IGEyZHBfdmVuZG9yX2xkYWNfZ2V0X2VmZmVjdGl2ZV9mcmFtZV9zaXplKCk7Ci0KLS8vIFByZXBhcmUgYW5kIHNlbmQgQTJEUCBMREFDIGVuY29kZWQgZnJhbWVzLgotLy8gfHRpbWVzdGFtcF91c3wgaXMgdGhlIGN1cnJlbnQgdGltZXN0YW1wIChpbiBtaWNyb3NlY29uZHMpLgotdm9pZCBhMmRwX3ZlbmRvcl9sZGFjX3NlbmRfZnJhbWVzKHVpbnQ2NF90IHRpbWVzdGFtcF91cyk7Ci0KLS8vIFNldCB0cmFuc21pdCBxdWV1ZSBsZW5ndGggZm9yIHRoZSBBMkRQIExEQUMgQUJSKEFkYXB0aXZlIEJpdCBSYXRlKSBtZWNoYW5pc20uCi12b2lkIGEyZHBfdmVuZG9yX2xkYWNfc2V0X3RyYW5zbWl0X3F1ZXVlX2xlbmd0aChzaXplX3QgdHJhbnNtaXRfcXVldWVfbGVuZ3RoKTsKLQotI2VuZGlmICAvLyBBMkRQX1ZFTkRPUl9MREFDX0VOQ09ERVJfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hY2xfYXBpLmggYi9zdGFjay9pbmNsdWRlL2FjbF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxMGI4NS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2FjbF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX3N0YXR1cy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBOb3RlOiBGcm9tIHN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEFDTCBDSEFOTkVMIE1BTkFHRU1FTlQgRlVOQ1RJT05TCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX2lzX3NuaWZmX2FsbG93ZWRfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci0KLXZvaWQgQlRNX3VuYmxvY2tfc25pZmZfbW9kZV9mb3IoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLXZvaWQgQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci12b2lkIEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotdm9pZCBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci12b2lkIEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2FuZF9zbmlmZl9tb2RlX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotdm9pZCBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfYW5kX3NuaWZmX21vZGVfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci0KLXZvaWQgQlRNX2RlZmF1bHRfdW5ibG9ja19yb2xlX3N3aXRjaCgpOwotdm9pZCBCVE1fZGVmYXVsdF9ibG9ja19yb2xlX3N3aXRjaCgpOwotCi12b2lkIEJUTV9hY2xfYWZ0ZXJfY29udHJvbGxlcl9zdGFydGVkKGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0TGlua1N1cGVyVG91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIGFuZCBzZW5kIEhDSSAiV3JpdGUgTGluayBTdXBlcnZpc2lvbiBUaW1lb3V0IiBjb21tYW5kCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCwgb3RoZXJ3aXNlIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXRMaW5rU3VwZXJUb3V0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0TGlua1N1cGVyVG91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgbGluayBzdXBlcnZpc2lvbiB0aW1lb3V0IHZhbHVlIG9mIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fR2V0TGlua1N1cGVyVG91dChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfdGltZW91dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSXNBY2xDb25uZWN0aW9uVXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGFuIEFDTCBjb25uZWN0aW9uIGV4aXN0cwotICogICAgICAgICAgICAgICAgICB0byBhIHNwZWNpZmljIHJlbW90ZSBCRCBBZGRyZXNzLiAgVGhlIHNlY29uZCB2ZXJzaW9uIGVuc3VyZXMKLSAqICAgICAgICAgICAgICAgICAgdGhlIGhjaSBoYW5kbGUgaXMgdmFsaWQgKFVuc3VyZSBpZiBuZWVkZWQpCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgdXAsIGVsc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0lzQWNsQ29ubmVjdGlvblVwKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLWJvb2wgQlRNX0lzQWNsQ29ubmVjdGlvblVwQW5kSGFuZGxlVmFsaWQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi1ib29sIEJUTV9Jc0FjbENvbm5lY3Rpb25VcEZyb21IYW5kbGUodWludDE2X3QgaGNpX2hhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0Um9sZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSByb2xlIG9mIHRoZSBsb2NhbCBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBBQ0wgY29ubmVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgY29ubmVjdGlvbiBleGlzdHMuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgbm8gYWN0aXZlIGxpbmsgd2l0aCBiZCBhZGRyIHNwZWNpZmllZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fR2V0Um9sZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwgdEhDSV9ST0xFKiBwX3JvbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN3aXRjaCByb2xlIGJldHdlZW4gY2VudHJhbCBhbmQKLSAqICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4gIElmIHJvbGUgaXMgYWxyZWFkeSBzZXQgaXQgd2lsbCBkbyBub3RoaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgYWxyZWFkeSBpbiBzcGVjaWZpZWQgcm9sZS4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIGNvbW1hbmQgaXNzdWVkIHRvIGNvbnRyb2xsZXIuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgbWVtb3J5IGNvdWxkbid0IGJlIGFsbG9jYXRlZCB0byBpc3N1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgbm8gYWN0aXZlIGxpbmsgd2l0aCBiZCBhZGRyIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBCVE1fTU9ERV9VTlNVUFBPUlRFRCBpZiB0aGUgbG9jYWwgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSBzd2l0Y2hpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRSU1NJCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBsaW5rIHBvbGljeSBzZXR0aW5ncy4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGFkZHJlc3Mgb2YgbGluayBwb2xpY3kgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAodEJUTV9SU1NJX1JFU1VMVCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBjb21tYW5kIGlzc3VlZCB0byBjb250cm9sbGVyLgotICogICAgICAgICAgICAgICAgICBCVE1fTk9fUkVTT1VSQ0VTIGlmIG1lbW9yeSBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQgdG8gaXNzdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fVU5LTk9XTl9BRERSIGlmIG5vIGFjdGl2ZSBsaW5rIHdpdGggYmQgYWRkciBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgY29tbWFuZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkUlNTSShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRNX0NNUExfQ0IqIHBfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRGYWlsZWRDb250YWN0Q291bnRlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgZmFpbGVkIGNvbnRhY3QgY291bnRlci4KLSAqICAgICAgICAgICAgICAgICAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiB0aGUgY2FsbGJhY2suCi0gKiAgICAgICAgICAgICAgICAgICh0QlRNX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfUkVTVUxUKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIGNvbW1hbmQgaXNzdWVkIHRvIGNvbnRyb2xsZXIuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgbWVtb3J5IGNvdWxkbid0IGJlIGFsbG9jYXRlZCB0byBpc3N1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgbm8gYWN0aXZlIGxpbmsgd2l0aCBiZCBhZGRyIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiBjb21tYW5kIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRGYWlsZWRDb250YWN0Q291bnRlcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRUeFBvd2VyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgVFggcG93ZXIgb2YgdGhlIGNvbm5lY3Rpb24uIFRoZSBUWCBwb3dlciBsZXZlbCByZXN1bHRzCi0gKiAgICAgICAgICAgICAgICAgIGFyZSByZXR1cm5lZCBpbiB0aGUgY2FsbGJhY2suCi0gKiAgICAgICAgICAgICAgICAgICh0QlRNX1JTU0lfUkVTVUxUKQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIGNvbW1hbmQgaXNzdWVkIHRvIGNvbnRyb2xsZXIuCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgbWVtb3J5IGNvdWxkbid0IGJlIGFsbG9jYXRlZCB0byBpc3N1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgbm8gYWN0aXZlIGxpbmsgd2l0aCBiZCBhZGRyIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiBjb21tYW5kIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRUeFBvd2VyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVE1fQ01QTF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0TnVtQWNsTGlua3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YKLSAqICAgICAgICAgICAgICAgICAgQUNMIGxpbmtzIHRoYXQgYXJlIGFjdGl2ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHVpbnQxNl90IE51bWJlciBvZiBhY3RpdmUgQUNMIGxpbmtzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEJUTV9HZXROdW1BY2xMaW5rcyh2b2lkKTsKLQotdm9pZCBidG1fc2V0X3BhY2tldF90eXBlc19mcm9tX2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGt0X3R5cGVzKTsKLQotI2RlZmluZSBCTEVfUkVTT0xWRV9BRERSX01BU0sgMHhjMAotI2RlZmluZSBCTEVfUkVTT0xWRV9BRERSX01TQiAweDQwCi0KLWJvb2wgQlRNX0JMRV9JU19SRVNPTFZFX0JEQShjb25zdCBSYXdBZGRyZXNzJiB4KTsKLQotYm9vbCBhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBpZGVudGl0eV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBpZGVudGl0eV9hZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQ4X3QgcnJhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJwYSk7Ci0KLXZvaWQgYnRtX2VzdGFibGlzaF9jb250aW51ZV9mcm9tX2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLQotYm9vbCBzY29fcGVlcl9zdXBwb3J0c19lc2NvXzJtX3BoeShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLWJvb2wgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci0KLWJvb2wgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX3BhY2tldF9leHRlbnNpb24odWludDE2X3QgaGNpX2hhbmRsZSk7Ci1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV8ybV9waHkodWludDE2X3QgaGNpX2hhbmRsZSk7Ci1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9jb2RlZF9waHkodWludDE2X3QgaGNpX2hhbmRsZSk7Ci0KLWJvb2wgYWNsX2lzX3N3aXRjaF9yb2xlX2lkbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uKHVpbnQxNl90IGhjaV9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRDb25uZWN0aW9uQWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgbG9jYWwgZGV2aWNlIHJhbmRvbSBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9SZWFkQ29ubmVjdGlvbkFkZHIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9Jc0JsZUNvbm5lY3Rpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGhhbmRsZQotICogICAgICAgICAgICAgICAgICBmb3IgYW4gTEUgbGluawotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIExFIGxpbmssIG90aGVyd2lzZSBmYWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fSXNCbGVDb25uZWN0aW9uKHVpbnQxNl90IGhjaV9oYW5kbGUpOwotCi1jb25zdCBSYXdBZGRyZXNzIGFjbF9hZGRyZXNzX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUpOwotCi12b2lkIGJ0bV9ibGVfcmVmcmVzaF9sb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhKTsKLQotdm9pZCBidG1fY29udF9yc3dpdGNoX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUpOwotCi11aW50OF90IGFjbF9saW5rX3JvbGVfZnJvbV9oYW5kbGUodWludDE2X3QgaGFuZGxlKTsKLQotdm9pZCBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKHRIQ0lfU1RBVFVTIGFjbF9kaXNjX3JlYXNvbik7Ci0KLWJvb2wgYWNsX2lzX3JvbGVfc3dpdGNoX2FsbG93ZWQoKTsKLQotdWludDE2X3QgYWNsX2dldF9zdXBwb3J0ZWRfcGFja2V0X3R5cGVzKCk7Ci0KLWJvb2wgYWNsX3NldF9wZWVyX2xlX2ZlYXR1cmVzX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwKTsKLQotdEJUTV9TVEFUVVMgYnRtX3JlYWRfcG93ZXJfbW9kZV9zdGF0ZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1BNX1NUQVRFKiBwbVN0YXRlKTsKLQotdm9pZCBidG1fYWNsX25vdGlmX2Nvbm5fY29sbGlzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLXZvaWQgYnRtX2FjbF91cGRhdGVfY29ubl9hZGRyKHVpbnQxNl90IGNvbm5faGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUG93ZXJNb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHJldHVybnMgdGhlIGN1cnJlbnQgbW9kZSBmb3IgYSBzcGVjaWZpYwotICogICAgICAgICAgICAgICAgICBBQ0wgY29ubmVjdGlvbi4KLSAqCi0gKiBJbnB1dCBQYXJhbSAgICAgIHJlbW90ZV9iZGEgLSBkZXZpY2UgYWRkcmVzcyBvZiBkZXNpcmVkIEFDTCBjb25uZWN0aW9uCi0gKgotICogT3V0cHV0IFBhcmFtICAgICBwX21vZGUgLSBhZGRyZXNzIHdoZXJlIHRoZSBjdXJyZW50IG1vZGUgaXMgY29waWVkIGludG8uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0FDTF9NT0RFX05PUk1BTAotICogICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9BQ0xfTU9ERV9IT0xECi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0FDTF9NT0RFX1NOSUZGCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0FDTF9NT0RFX1BBUksKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsaWQgb25seSBpZiByZXR1cm4gY29kZSBpcyBCVE1fU1VDQ0VTUykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9SZWFkUG93ZXJNb2RlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVE1fUE1fTU9ERSogcF9tb2RlKTsKLQotdm9pZCBidG1fYWNsX2NyZWF0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgdEhDSV9ST0xFIGxpbmtfcm9sZSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi12b2lkIGJ0bV9hY2xfcmVtb3ZlZCh1aW50MTZfdCBoYW5kbGUpOwotCi12b2lkIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKTsKLXZvaWQgYWNsX2Rpc2Nvbm5lY3RfYWZ0ZXJfcm9sZV9zd2l0Y2godWludDE2X3QgY29ubl9oYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbik7Ci0KLWJvb2wgYWNsX3BlZXJfc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpOwotCi12b2lkIGJ0bV9hY2xfc2V0X3BhZ2luZyhib29sIHZhbHVlKTsKLQotdm9pZCBidG1fcHJvY2Vzc19jYW5jZWxfY29tcGxldGUodWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgbW9kZSk7Ci0KLXVpbnQ4X3QgYnRtX2hhbmRsZV90b19hY2xfaW5kZXgodWludDE2X3QgaGNpX2hhbmRsZSk7Ci0KLXRIQ0lfUkVBU09OIGJ0bV9nZXRfYWNsX2Rpc2NfcmVhc29uX2NvZGUodm9pZCk7Ci0KLWV4dGVybiB0QlRNX1NUQVRVUyBidG1fcmVtb3ZlX2FjbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotdm9pZCBidG1fYWNsX2RldmljZV9kb3duKHZvaWQpOwotdm9pZCBidG1fYWNsX3VwZGF0ZV9pbnF1aXJ5X3N0YXR1cyh1aW50OF90IHN0YXR1cyk7Ci0KLXZvaWQgQUNMX1JlZ2lzdGVyQ2xpZW50KHN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MqIGNhbGxiYWNrcyk7Ci12b2lkIEFDTF9VbnJlZ2lzdGVyQ2xpZW50KHN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MqIGNhbGxiYWNrcyk7Ci1ib29sIEFDTF9TdXBwb3J0VHJhbnNwYXJlbnRTeW5jaHJvbm91c0RhdGEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2FjbF9hcGlfdHlwZXMuaCBiL3N0YWNrL2luY2x1ZGUvYWNsX2FwaV90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBmMTAwLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYWNsX2FwaV90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX3N0YXR1cy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE5vdGU6IEZyb20gaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQUNMIENIQU5ORUwgTUFOQUdFTUVOVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqCi0gKiAgQUNMIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioKLSAqICBBQ0wgVHlwZXMKLSAqKioqKioqKioqKioqKiovCi0KLS8qIFN0cnVjdHVyZSByZXR1cm5lZCB3aXRoIHJlYWQgUlNTSSBldmVudCAoaW4gdEJUTV9DTVBMX0NCIGNhbGxiYWNrIGZ1bmN0aW9uKQotICogaW4gcmVzcG9uc2UgdG8gQlRNX1JlYWRSU1NJIGNhbGwuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotICB1aW50OF90IGhjaV9zdGF0dXM7Ci0gIFJhd0FkZHJlc3MgcmVtX2JkYTsKLSAgaW50OF90IHJzc2k7Ci19IHRCVE1fUlNTSV9SRVNVTFQ7Ci0KLS8qIFN0cnVjdHVyZSByZXR1cm5lZCB3aXRoIHJlYWQgZmFpbGVkIGNvbnRhY3QgY291bnRlciBldmVudAotICogKGluIHRCVE1fQ01QTF9DQiBjYWxsYmFjayBmdW5jdGlvbikgaW4gcmVzcG9uc2UgdG8KLSAqIEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIgY2FsbC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQ4X3QgaGNpX3N0YXR1czsKLSAgUmF3QWRkcmVzcyByZW1fYmRhOwotICB1aW50MTZfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyOwotfSB0QlRNX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJfUkVTVUxUOwotCi0vKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgd2l0aCByZWFkIGF1dG9tYXRpYyBmbHVzaCB0aW1lb3V0IGV2ZW50Ci0gKiAoaW4gdEJUTV9DTVBMX0NCIGNhbGxiYWNrIGZ1bmN0aW9uKSBpbiByZXNwb25zZSB0bwotICogQlRNX1JlYWRBdXRvbWF0aWNGbHVzaFRpbWVvdXQgY2FsbC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQ4X3QgaGNpX3N0YXR1czsKLSAgUmF3QWRkcmVzcyByZW1fYmRhOwotICB1aW50MTZfdCBhdXRvbWF0aWNfZmx1c2hfdGltZW91dDsKLX0gdEJUTV9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVF9SRVNVTFQ7Ci0KLS8qIFN0cnVjdHVyZSByZXR1cm5lZCB3aXRoIHJlYWQgY3VycmVudCBUWCBwb3dlciBldmVudCAoaW4gdEJUTV9DTVBMX0NCIGNhbGxiYWNrCi0gKiBmdW5jdGlvbikgaW4gcmVzcG9uc2UgdG8gQlRNX1JlYWRUeFBvd2VyIGNhbGwuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEJUTV9TVEFUVVMgc3RhdHVzOwotICB1aW50OF90IGhjaV9zdGF0dXM7Ci0gIFJhd0FkZHJlc3MgcmVtX2JkYTsKLSAgaW50OF90IHR4X3Bvd2VyOwotfSB0QlRNX1RYX1BPV0VSX1JFU1VMVDsKLQotLyogU3RydWN0dXJlIHJldHVybmVkIHdpdGggcmVhZCBsaW5rIHF1YWxpdHkgZXZlbnQgKGluIHRCVE1fQ01QTF9DQiBjYWxsYmFjawotICogZnVuY3Rpb24pIGluIHJlc3BvbnNlIHRvIEJUTV9SZWFkTGlua1F1YWxpdHkgY2FsbC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX1NUQVRVUyBzdGF0dXM7Ci0gIHVpbnQ4X3QgaGNpX3N0YXR1czsKLSAgUmF3QWRkcmVzcyByZW1fYmRhOwotICB1aW50OF90IGxpbmtfcXVhbGl0eTsKLX0gdEJUTV9MSU5LX1FVQUxJVFlfUkVTVUxUOwotCi0jZGVmaW5lIEJUTV9JTlFVSVJZX1NUQVJURUQgMQotI2RlZmluZSBCVE1fSU5RVUlSWV9DQU5DRUxMRUQgMgotI2RlZmluZSBCVE1fSU5RVUlSWV9DT01QTEVURSAzCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2FjbF9jbGllbnRfY2FsbGJhY2tzLmggYi9zdGFjay9pbmNsdWRlL2FjbF9jbGllbnRfY2FsbGJhY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTAyODcuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hY2xfY2xpZW50X2NhbGxiYWNrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MgewotICB2aXJ0dWFsIHZvaWQgb25fYWNsX2xpbmtfZG93bihjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBvbl9hY2xfbGlua191cChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgb25fYWNsX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIpID0gMDsKLSAgdmlydHVhbCB2b2lkIG9uX2FjbF9yb2xlX2NoYW5nZShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIGhjaV9yb2xlX3QgbmV3X3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgaGNpX3N0YXR1cykgPSAwOwotCi0gIHZpcnR1YWwgfmFjbF9jbGllbnRfY2FsbGJhY2tfcygpID0gZGVmYXVsdDsKLX07CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2FjbF9oY2lfbGlua19pbnRlcmZhY2UuaCBiL3N0YWNrL2luY2x1ZGUvYWNsX2hjaV9saW5rX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDYwMjUxOC4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2FjbF9oY2lfbGlua19pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfbW9kZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgZnVuY3Rpb25zIGZvciBIQ0lGLUFjbCBNYW5hZ2VtZW50IHRvIGludm9rZQotLy8KLXZvaWQgYnRtX2FjbF9jb25uZWN0aW9uX3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90KiBkYyk7Ci12b2lkIGJ0bV9hY2xfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQ4X3QgZW5jX21vZGUpOwotdm9pZCBvbl9hY2xfYnJfZWRyX2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNfbW9kZSk7Ci12b2lkIG9uX2FjbF9icl9lZHJfZmFpbGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLXZvaWQgYnRtX2FjbF9kaXNjb25uZWN0ZWQodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHJlYXNvbik7Ci12b2lkIGJ0bV9hY2xfaXNvX2Rpc2Nvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbik7Ci12b2lkIGJ0bV9hY2xfZW5jcnlwdF9jaGFuZ2UodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuY3JfZW5hYmxlKTsKLXZvaWQgYnRtX2FjbF9wYWdpbmcoQlRfSERSKiBwLCBjb25zdCBSYXdBZGRyZXNzJiBkZXN0KTsKLXZvaWQgYnRtX2FjbF9yZXN1Ym1pdF9wYWdlKHZvaWQpOwotdm9pZCBidG1fYWNsX3JvbGVfY2hhbmdlZCh0SENJX1NUQVRVUyBoY2lfc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbmV3X3JvbGUpOwotdm9pZCBidG1fcmVqZWN0bGlzdF9yb2xlX2NoYW5nZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGNpX3N0YXR1cyk7Ci12b2lkIGJ0bV9wbV9wcm9jX2NtZF9zdGF0dXModEhDSV9TVEFUVVMgc3RhdHVzKTsKLXZvaWQgYnRtX3BtX3Byb2NfbW9kZV9jaGFuZ2UodEhDSV9TVEFUVVMgaGNpX3N0YXR1cywgdWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIG1vZGUsIHVpbnQxNl90IGludGVydmFsKTsKLXZvaWQgYnRtX3BtX3Byb2Nfc3NyX2V2dCh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKTsKLXZvaWQgYnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUodWludDhfdCogcCk7Ci12b2lkIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUodWludDhfdCogcCk7Ci12b2lkIGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSh1aW50OF90KiBwKTsKLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZV9yYXcodWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKTsKLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfcGFnZSwgdWludDhfdCogZmVhdHVyZXMpOwotdm9pZCBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlKTsKLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlX3Jhdyh1aW50OF90KiBwKTsKLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCogZmVhdHVyZXMpOwotdm9pZCBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZV9yYXcodWludDhfdCogcCk7Ci12b2lkIGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxtcF9zdWJ2ZXJzaW9uKTsKLXZvaWQgYnRtX3JlYWRfcnNzaV9jb21wbGV0ZSh1aW50OF90KiBwKTsKLXZvaWQgYnRtX3JlYWRfdHhfcG93ZXJfY29tcGxldGUodWludDhfdCogcCwgYm9vbCBpc19ibGUpOwotCi12b2lkIGFjbF9yY3ZfYWNsX2RhdGEoQlRfSERSKiBwX21zZyk7Ci12b2lkIGFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQoQlRfSERSKiBwX21zZyk7Ci12b2lkIGFjbF9wcm9jZXNzX251bV9jb21wbGV0ZWRfcGt0cyh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pOwotdm9pZCBhY2xfcGFja2V0c19jb21wbGV0ZWQodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBudW1fcGFja2V0cyk7Ci12b2lkIGFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ2NF90IGZlYXR1cmVzKTsKLXZvaWQgYWNsX3Byb2Nlc3NfZXh0ZW5kZWRfZmVhdHVyZXModWludDE2X3QgaGFuZGxlLCB1aW50OF90IGN1cnJlbnRfcGFnZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcyk7Ci12b2lkIGJ0bV9wbV9vbl9tb2RlX2NoYW5nZSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfTU9ERSBjdXJyZW50X21vZGUsIHVpbnQxNl90IGludGVydmFsKTsKLXZvaWQgYnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZyh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpOwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hZHZlcnRpc2VfZGF0YV9wYXJzZXIuaCBiL3N0YWNrL2luY2x1ZGUvYWR2ZXJ0aXNlX2RhdGFfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDg5NmMuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hZHZlcnRpc2VfZGF0YV9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBTY2FuIFJlc3BvbnNlIGRhdGEgZnJvbSBUcmF4eGFzCi1zdGF0aWMgY29uc3RleHByIHN0ZDo6YXJyYXk8dWludDhfdCwgMTg+IHRyeF9xdWlya3sKLSAgICB7MHgxNCwgMHgwOSwgMHg1NCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MiwgMHg0QywgMHg0NSwgMHgwNSwgMHgxMiwgMHhGRiwKLSAgICAgMHgwMCwgMHhFOCwgMHgwMywgMHgwMiwgMHgwQSwgMHgwMH19OwotCi1jbGFzcyBBZHZlcnRpc2VEYXRhUGFyc2VyIHsKLSAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHBhY2tldCBpcyBtYWxmb3JtZWQsIGJ1dCBzaG91bGQgYmUgY29uc2lkZXJlZCB2YWxpZCBmb3IKLSAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGFscmVhZHkgZXhpc3RpbmcgZGV2aWNlcwotICBzdGF0aWMgYm9vbCBNYWxmb3JtZWRQYWNrZXRRdWlyayhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbikgewotICAgIGF1dG8gZGF0YV9zdGFydCA9IGFkLmJlZ2luKCkgKyBwb3NpdGlvbjsKLQotICAgIC8vIFRyYXh4YXMgLSBiYWQgbmFtZSBsZW5ndGgKLSAgICBpZiAoKGFkLnNpemUoKSAtIHBvc2l0aW9uKSA+PSAxOCAmJgotICAgICAgICBzdGQ6OmVxdWFsKGRhdGFfc3RhcnQsIGRhdGFfc3RhcnQgKyAzLCB0cnhfcXVpcmsuYmVnaW4oKSkgJiYKLSAgICAgICAgc3RkOjplcXVhbChkYXRhX3N0YXJ0ICsgNSwgZGF0YV9zdGFydCArIDExLCB0cnhfcXVpcmsuYmVnaW4oKSArIDUpICYmCi0gICAgICAgIHN0ZDo6ZXF1YWwoZGF0YV9zdGFydCArIDEyLCBkYXRhX3N0YXJ0ICsgMTgsIHRyeF9xdWlyay5iZWdpbigpICsgMTIpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUmVtb3ZlVHJhaWxpbmdaZXJvcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYWQpIHsKLSAgICBzaXplX3QgcG9zaXRpb24gPSAwOwotCi0gICAgc2l6ZV90IGFkX2xlbiA9IGFkLnNpemUoKTsKLSAgICB3aGlsZSAocG9zaXRpb24gIT0gYWRfbGVuKSB7Ci0gICAgICB1aW50OF90IGxlbiA9IGFkW3Bvc2l0aW9uXTsKLQotICAgICAgLy8gQSBmaWVsZCBsZW5ndGggb2YgMCB3b3VsZCBiZSBpbnZhbGlkIGFzIGl0IHNob3VsZCBhdCBsZWFzdCBjb250YWluIHRoZQotICAgICAgLy8gRUlSIGZpZWxkIHR5cGUuIEhvd2V2ZXIsIHNvbWUgZXhpc3RpbmcgZGV2aWNlcyBzZW5kIHplcm8gcGFkZGluZyBhdCB0aGUKLSAgICAgIC8vIGVuZCBvZiBhZHZlcnRpc2VtZW50LiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBjdXQgdGhlIHplcm8gcGFkZGluZyBmcm9tCi0gICAgICAvLyBlbmQgb2YgdGhlIHBhY2tldC4gT3RoZXJ3aXNlIGkuZS4gZ2x1aW5nIHNjYW4gcmVzcG9uc2UgdG8gYWR2ZXJ0aXNlCi0gICAgICAvLyBkYXRhIHdpbGwgcmVzdWx0IGluIGRhdGEgd2l0aCB6ZXJvIHBhZGRpbmcgaW4gdGhlIG1pZGRsZS4KLSAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICBhZC5lcmFzZShhZC5iZWdpbigpICsgcG9zaXRpb24sIGFkLmVuZCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocG9zaXRpb24gKyBsZW4gPj0gYWRfbGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG9zaXRpb24gKz0gbGVuICsgMTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyB8YWR8IHJlcHJlc2VudCBwcm9wZXJseSBmb3JtYXR0ZWQgYWR2ZXJ0aXNpbmcgZGF0YS4KLSAgICovCi0gIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGFkKSB7Ci0gICAgc2l6ZV90IHBvc2l0aW9uID0gMDsKLQotICAgIHNpemVfdCBhZF9sZW4gPSBhZC5zaXplKCk7Ci0gICAgd2hpbGUgKHBvc2l0aW9uICE9IGFkX2xlbikgewotICAgICAgdWludDhfdCBsZW4gPSBhZFtwb3NpdGlvbl07Ci0KLSAgICAgIC8vIEEgZmllbGQgbGVuZ3RoIG9mIDAgd291bGQgYmUgaW52YWxpZCBhcyBpdCBzaG91bGQgYXQgbGVhc3QgY29udGFpbiB0aGUKLSAgICAgIC8vIEVJUiBmaWVsZCB0eXBlLiBIb3dldmVyLCBzb21lIGV4aXN0aW5nIGRldmljZXMgc2VuZCB6ZXJvIHBhZGRpbmcgYXQgdGhlCi0gICAgICAvLyBlbmQgb2YgYWR2ZXJ0aXNlbWVudC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdHJlYXQgdGhlIHBhY2tldCBhcyB2YWxpZC4KLSAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gcG9zaXRpb24gKyAxOyBpIDwgYWRfbGVuOyBpKyspIHsKLSAgICAgICAgICBpZiAoYWRbaV0gIT0gMCkgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGZpZWxkIHdvdWxkIGV4Y2VlZCB0aGUgdG90YWwgZGF0YSBsZW5ndGgsCi0gICAgICAvLyB0aGVuIHRoZSBkYXRhIGlzIGJhZGx5IGZvcm1hdHRlZC4KLSAgICAgIGlmIChwb3NpdGlvbiArIGxlbiA+PSBhZF9sZW4pIHsKLSAgICAgICAgaWYgKE1hbGZvcm1lZFBhY2tldFF1aXJrKGFkLCBwb3NpdGlvbikpIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgcG9zaXRpb24gKz0gbGVuICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIGluc2lkZSB0aGUgfGFkfCBhcnJheSBvZiBsZW5ndGggfGFkX2xlbnwKLSAgICogd2hlcmUgYSBmaWVsZCBvZiB8dHlwZXwgaXMgbG9jYXRlZCwgdG9nZXRoZXIgd2l0aCBpdHMgbGVuZ3RoIGluIHxwX2xlbmd0aHwKLSAgICovCi0gIHN0YXRpYyBjb25zdCB1aW50OF90KiBHZXRGaWVsZEJ5VHlwZShjb25zdCB1aW50OF90KiBhZCwgc2l6ZV90IGFkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSwgdWludDhfdCogcF9sZW5ndGgpIHsKLSAgICBzaXplX3QgcG9zaXRpb24gPSAwOwotCi0gICAgd2hpbGUgKHBvc2l0aW9uICE9IGFkX2xlbikgewotICAgICAgdWludDhfdCBsZW4gPSBhZFtwb3NpdGlvbl07Ci0KLSAgICAgIGlmIChsZW4gPT0gMCkgYnJlYWs7Ci0gICAgICBpZiAocG9zaXRpb24gKyBsZW4gPj0gYWRfbGVuKSBicmVhazsKLQotICAgICAgdWludDhfdCBhZHZfdHlwZSA9IGFkW3Bvc2l0aW9uICsgMV07Ci0KLSAgICAgIGlmIChhZHZfdHlwZSA9PSB0eXBlKSB7Ci0gICAgICAgIC8qIGxlbmd0aCBkb2Vzbid0IGluY2x1ZGUgaXRzZWxmICovCi0gICAgICAgICpwX2xlbmd0aCA9IGxlbiAtIDE7IC8qIG1pbnVzIHRoZSBsZW5ndGggb2YgdHlwZSAqLwotICAgICAgICByZXR1cm4gYWQgKyBwb3NpdGlvbiArIDI7Ci0gICAgICB9Ci0KLSAgICAgIHBvc2l0aW9uICs9IGxlbiArIDE7IC8qIHNraXAgdGhlIGxlbmd0aCBvZiBkYXRhICovCi0gICAgfQotCi0gICAgKnBfbGVuZ3RoID0gMDsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIGluc2lkZSB0aGUgfGFkdnwgd2hlcmUgYSBmaWVsZCBvZiB8dHlwZXwgaXMKLSAgICogbG9jYXRlZCwgdG9nZXRoZXIgd2l0aCBpdCcgbGVuZ3RoIGluIHxwX2xlbmd0aHwKLSAgICovCi0gIHN0YXRpYyBjb25zdCB1aW50OF90KiBHZXRGaWVsZEJ5VHlwZShzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25zdCYgYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR5cGUsIHVpbnQ4X3QqIHBfbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIEdldEZpZWxkQnlUeXBlKGFkLmRhdGEoKSwgYWQuc2l6ZSgpLCB0eXBlLCBwX2xlbmd0aCk7Ci0gIH0KLX07CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2F2Y3RfYXBpLmggYi9zdGFjay9pbmNsdWRlL2F2Y3RfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOGU5NDUuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hdmN0X2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpbnRlcmZhY2UgZmlsZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBBdWRpbyBWaWRlbyBDb250cm9sCi0gKiAgVHJhbnNwb3J0IFByb3RvY29sIChBVkNUUCkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVZDVF9BUElfSAotI2RlZmluZSBBVkNUX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBUEkgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIHJlc3VsdCBjb2Rlcy4gKi8KLSNkZWZpbmUgQVZDVF9TVUNDRVNTIDAgICAgICAvKiBGdW5jdGlvbiBzdWNjZXNzZnVsICovCi0jZGVmaW5lIEFWQ1RfTk9fUkVTT1VSQ0VTIDEgLyogTm90IGVub3VnaCByZXNvdXJjZXMgKi8KLSNkZWZpbmUgQVZDVF9CQURfSEFORExFIDIgICAvKiBCYWQgaGFuZGxlICovCi0jZGVmaW5lIEFWQ1RfUElEX0lOX1VTRSAzICAgLyogUElEIGFscmVhZHkgaW4gdXNlICovCi0jZGVmaW5lIEFWQ1RfTk9UX09QRU4gNCAgICAgLyogQ29ubmVjdGlvbiBub3Qgb3BlbiAqLwotCi0vKiBQU00gZm9yIEFWQ1QuICovCi0jZGVmaW5lIEFWQ1RfUFNNIDB4MDAxNwotI2RlZmluZSBBVkNUX0JSX1BTTSAweDAwMUIKLQotLyogUHJvdG9jb2wgcmV2aXNpb24gbnVtYmVycyAqLwotI2RlZmluZSBBVkNUX1JFVl8xXzAgMHgwMTAwCi0jZGVmaW5lIEFWQ1RfUkVWXzFfMiAweDAxMDIKLSNkZWZpbmUgQVZDVF9SRVZfMV8zIDB4MDEwMwotI2RlZmluZSBBVkNUX1JFVl8xXzQgMHgwMTA0Ci0KLS8qIHRoZSBsYXllcl9zcGVjaWZpYyBzZXR0aW5ncyAqLwotI2RlZmluZSBBVkNUX0RBVEFfQ1RSTCAweDAwMDEgICAgLyogZm9yIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KLSNkZWZpbmUgQVZDVF9EQVRBX0JST1dTRSAweDAwMDIgIC8qIGZvciB0aGUgYnJvd3NpbmcgY2hhbm5lbCAqLwotI2RlZmluZSBBVkNUX0RBVEFfUEFSVElBTCAweDAxMDAgLyogT25seSBoYXZlIHJvb20gZm9yIGEgcGFydGlhbCBtZXNzYWdlICovCi0KLS8qIFBlciB0aGUgQVZSQyBzcGVjLCBtaW5pbXVtIE1UVSBmb3IgdGhlIGNvbnRyb2wgY2hhbm5lbCAqLwotI2RlZmluZSBBVkNUX01JTl9DT05UUk9MX01UVSA0OAotLyogUGVyIHRoZSBBVlJDIHNwZWMsIG1pbmltdW0gTVRVIGZvciB0aGUgYnJvd3NpbmcgY2hhbm5lbCAqLwotI2RlZmluZSBBVkNUX01JTl9CUk9XU0VfTVRVIDMzNQotCi0vKiBNZXNzYWdlIG9mZnNldC4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBmb3IgdGhlCi0gKiBwcm90b2NvbCBoZWFkZXJzIG9mIGFuIEFWQ1RQIG1lc3NhZ2UgcGFja2V0LgotKi8KLSNkZWZpbmUgQVZDVF9NU0dfT0ZGU0VUIDE1Ci0jZGVmaW5lIEFWQ1RfQlJPV1NFX09GRlNFVCAxNyAvKiB0aGUgZGVmYXVsdCBvZmZzZXQgZm9yIGJyb3dzaW5nIGNoYW5uZWwgKi8KLQotLyogQ29ubmVjdGlvbiByb2xlLiAqLwotI2RlZmluZSBBVkNUX0lOVCAwIC8qIEluaXRpYXRvciBjb25uZWN0aW9uICovCi0jZGVmaW5lIEFWQ1RfQUNQIDEgLyogQWNjZXB0b3IgY29ubmVjdGlvbiAqLwotCi0vKiBDb250cm9sIHJvbGUuICovCi0jZGVmaW5lIEFWQ1RfVEFSR0VUIDEgIC8qIHRhcmdldCAgKi8KLSNkZWZpbmUgQVZDVF9DT05UUk9MIDIgLyogY29udHJvbGxlciAgKi8KLSNkZWZpbmUgQVZDVF9QQVNTSVZFIDQgLyogSWYgY29uZmxpY3QsIGFsbG93IHRoZSBvdGhlciBzaWRlIHRvIHN1Y2NlZWQgICovCi0KLS8qIENvbW1hbmQvUmVzcG9uc2UgaW5kaWNhdG9yLiAqLwotI2RlZmluZSBBVkNUX0NNRCAwIC8qIENvbW1hbmQgbWVzc2FnZSAqLwotI2RlZmluZSBBVkNUX1JTUCAyIC8qIFJlc3BvbnNlIG1lc3NhZ2UgKi8KLSNkZWZpbmUgQVZDVF9SRUogMyAvKiBNZXNzYWdlIHJlamVjdGVkICovCi0KLS8qIENvbnRyb2wgY2FsbGJhY2sgZXZlbnRzLiAqLwotI2RlZmluZSBBVkNUX0NPTk5FQ1RfQ0ZNX0VWVCAwICAgICAgICAvKiBDb25uZWN0aW9uIGNvbmZpcm0gKi8KLSNkZWZpbmUgQVZDVF9DT05ORUNUX0lORF9FVlQgMSAgICAgICAgLyogQ29ubmVjdGlvbiBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWQ1RfRElTQ09OTkVDVF9DRk1fRVZUIDIgICAgIC8qIERpc2Nvbm5lY3QgY29uZmlybSAqLwotI2RlZmluZSBBVkNUX0RJU0NPTk5FQ1RfSU5EX0VWVCAzICAgICAvKiBEaXNjb25uZWN0IGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZDVF9DT05HX0lORF9FVlQgNCAgICAgICAgICAgLyogQ29uZ2VzdGlvbiBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWQ1RfVU5DT05HX0lORF9FVlQgNSAgICAgICAgIC8qIFVuY29uZ2VzdGlvbiBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWQ1RfQlJPV1NFX0NPTk5fQ0ZNX0VWVCA2ICAgIC8qIEJyb3dzZSBDb25uZWN0aW9uIGNvbmZpcm0gKi8KLSNkZWZpbmUgQVZDVF9CUk9XU0VfQ09OTl9JTkRfRVZUIDcgICAgLyogQnJvd3NlIENvbm5lY3Rpb24gaW5kaWNhdGlvbiAqLwotI2RlZmluZSBBVkNUX0JST1dTRV9ESVNDT05OX0NGTV9FVlQgOCAvKiBCcm93c2UgRGlzY29ubmVjdCBjb25maXJtICovCi0jZGVmaW5lIEFWQ1RfQlJPV1NFX0RJU0NPTk5fSU5EX0VWVCA5IC8qIEJyb3dzZSBEaXNjb25uZWN0IGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZDVF9CUk9XU0VfQ09OR19JTkRfRVZUIDEwICAgLyogQ29uZ2VzdGlvbiBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWQ1RfQlJPV1NFX1VOQ09OR19JTkRfRVZUIDExIC8qIFVuY29uZ2VzdGlvbiBpbmRpY2F0aW9uICovCi0KLS8qIEdlbmVyYWwgcHVycG9zZSBmYWlsdXJlIHJlc3VsdCBjb2RlIGZvciBjYWxsYmFjayBldmVudHMuICovCi0jZGVmaW5lIEFWQ1RfUkVTVUxUX0ZBSUwgNQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIERlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29udHJvbCBjYWxsYmFjayBmdW5jdGlvbi4gKi8KLXR5cGVkZWYgdm9pZCh0QVZDVF9DVFJMX0NCQUNLKSh1aW50OF90IGhhbmRsZSwgdWludDhfdCBldmVudCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHBlZXJfYWRkcik7Ci0KLS8qIE1lc3NhZ2UgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLS8qIHBfcGt0LT5sYXllcl9zcGVjaWZpYyBpcyBBVkNUX0RBVEFfQ1RSTCBvciBBVkNUX0RBVEFfQlJPV1NFICovCi10eXBlZGVmIHZvaWQodEFWQ1RfTVNHX0NCQUNLKSh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgdWludDhfdCBjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCBieSBBVkNUX0NyZWF0ZUNvbm4uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVkNUX0NUUkxfQ0JBQ0sqIHBfY3RybF9jYmFjazsgLyogQ29udHJvbCBjYWxsYmFjayAqLwotICB0QVZDVF9NU0dfQ0JBQ0sqIHBfbXNnX2NiYWNrOyAgIC8qIE1lc3NhZ2UgY2FsbGJhY2sgKi8KLSAgdWludDE2X3QgcGlkOyAgICAgICAgICAgICAgICAgICAvKiBQcm9maWxlIElEICovCi0gIHVpbnQ4X3Qgcm9sZTsgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhdG9yL2FjY2VwdG9yIHJvbGUgKi8KLSAgdWludDhfdCBjb250cm9sOyAgICAgICAgICAgICAgICAvKiBDb250cm9sIHJvbGUgKENvbnRyb2wvVGFyZ2V0KSAqLwotfSB0QVZDVF9DQzsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIHN5c3RlbSBsZXZlbCByZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBBVkNUUCBwcm90b2NvbC4gIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgQVZDVFAgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHByZXBhcmVzIHRoZSBwcm90b2NvbCBzdGFjayBmb3IgaXRzIHVzZS4gIFRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbXVzdCBiZSBjYWxsZWQgb25jZSBieSB0aGUgc3lzdGVtIG9yIHBsYXRmb3JtIHVzaW5nIEFWQ1RQCi0gKiAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgb3RoZXIgZnVuY3Rpb25zIG9mIHRoZSBBUEkgYW4gYmUgdXNlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEFWQ1RfUmVnaXN0ZXIoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVyZWdpc3RlciB1c2UgQVZDVFAgcHJvdG9jb2wuCi0gKiAgICAgICAgICAgICAgICAgIEl0IGlzIGNhbGxlZCB3aGVuIEFWQ1RQIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGJ5IGFueQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpbiB0aGUgc3lzdGVtLiAgQmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCwgYWxsIGNvbm5lY3Rpb25zIG11c3QgYmUgcmVtb3ZlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIEFWQ1RfUmVtb3ZlQ29ubigpLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQVZDVF9EZXJlZ2lzdGVyKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9DcmVhdGVDb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGUgYW4gQVZDVFAgY29ubmVjdGlvbi4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMsIGluaXRpYXRvciBhbmQgYWNjZXB0b3IsIGFzIGRldGVybWluZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgdGhlIHBfY2MtPnJvbGUgcGFyYW1ldGVyLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0bwotICogICAgICAgICAgICAgICAgICBjcmVhdGUgYW4gaW5pdGlhdG9yIGNvbm5lY3Rpb24sIGFuIEFWQ1RQIGNvbm5lY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIHBlZXIgZGV2aWNlIGlzIGluaXRpYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLSAqICAgICAgICAgICAgICAgICAgSWYgYW4gYWNjZXB0b3IgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCB0aGUgY29ubmVjdGlvbiB3YWl0cwotICogICAgICAgICAgICAgICAgICBwYXNzaXZlbHkgZm9yIGFuIGluY29taW5nIEFWQ1RQIGNvbm5lY3Rpb24gZnJvbSBhIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWQ1RfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkNUX0NyZWF0ZUNvbm4odWludDhfdCogcF9oYW5kbGUsIHRBVkNUX0NDKiBwX2NjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9SZW1vdmVDb25uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmUgYW4gQVZDVFAgY29ubmVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uICBJZiB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGlzIHRoZSBsYXN0IGNvbm5lY3Rpb24gdG8gYSBwZWVyIHRoZSBMMkNBUCBjaGFubmVsIGZvciBBVkNUUAotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGNsb3NlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkNUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZDVF9SZW1vdmVDb25uKHVpbnQ4X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfQ3JlYXRlQnJvd3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGUgYW4gQVZDVFAgY29ubmVjdGlvbi4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMsIGluaXRpYXRvciBhbmQgYWNjZXB0b3IsIGFzIGRldGVybWluZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgdGhlIHBfY2MtPnJvbGUgcGFyYW1ldGVyLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0bwotICogICAgICAgICAgICAgICAgICBjcmVhdGUgYW4gaW5pdGlhdG9yIGNvbm5lY3Rpb24sIGFuIEFWQ1RQIGNvbm5lY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIHBlZXIgZGV2aWNlIGlzIGluaXRpYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLSAqICAgICAgICAgICAgICAgICAgSWYgYW4gYWNjZXB0b3IgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCB0aGUgY29ubmVjdGlvbiB3YWl0cwotICogICAgICAgICAgICAgICAgICBwYXNzaXZlbHkgZm9yIGFuIGluY29taW5nIEFWQ1RQIGNvbm5lY3Rpb24gZnJvbSBhIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWQ1RfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkNUX0NyZWF0ZUJyb3dzZSh1aW50OF90IGhhbmRsZSwgdWludDhfdCByb2xlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfUmVtb3ZlQnJvd3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmUgYW4gQVZDVFAgY29ubmVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uICBJZiB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGlzIHRoZSBsYXN0IGNvbm5lY3Rpb24gdG8gYSBwZWVyIHRoZSBMMkNBUCBjaGFubmVsIGZvciBBVkNUUAotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGNsb3NlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkNUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZDVF9SZW1vdmVCcm93c2UodWludDhfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9HZXRCcm93c2VNdHUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgcGVlcl9tdHUgZm9yIHRoZSBBVkNUUCBCcm93c2UgY2hhbm5lbCBvZiB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBwZWVyIGJyb3dzaW5nIGNoYW5uZWwgTVRVLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZDVF9HZXRCcm93c2VNdHUodWludDhfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZDVF9HZXRQZWVyTXR1Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIHBlZXJfbXR1IGZvciB0aGUgQVZDVFAgY2hhbm5lbCBvZiB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBwZWVyIE1UVSBzaXplLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZDVF9HZXRQZWVyTXR1KHVpbnQ4X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWQ1RfTXNnUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIEFWQ1RQIG1lc3NhZ2UgdG8gYSBwZWVyIGRldmljZS4gIEluIGNhbGxpbmcKLSAqICAgICAgICAgICAgICAgICAgQVZDVF9Nc2dSZXEoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBrZWVwIHRyYWNrIG9mIHRoZQotICogICAgICAgICAgICAgICAgICBjb25nZXN0aW9uIHN0YXRlIG9mIEFWQ1RQIGFzIGNvbW11bmljYXRlZCB3aXRoIGV2ZW50cwotICogICAgICAgICAgICAgICAgICBBVkNUX0NPTkdfSU5EX0VWVCBhbmQgQVZDVF9VTkNPTkdfSU5EX0VWVC4gICBJZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FsbHMgQVZDVF9Nc2dSZXEoKSB3aGVuIEFWQ1RQIGlzIGNvbmdlc3RlZAotICogICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSBtYXkgYmUgZGlzY2FyZGVkLiAgVGhlIGFwcGxpY2F0aW9uIG1heSBtYWtlIGl0cwotICogICAgICAgICAgICAgICAgICBmaXJzdCBjYWxsIHRvIEFWQ1RfTXNnUmVxKCkgYWZ0ZXIgaXQgcmVjZWl2ZXMgYW4KLSAqICAgICAgICAgICAgICAgICAgQVZDVF9DT05ORUNUX0NGTV9FVlQgb3IgQVZDVF9DT05ORUNUX0lORF9FVlQgb24gY29udHJvbAotICogICAgICAgICAgICAgICAgICBjaGFubmVsIG9yCi0gKiAgICAgICAgICAgICAgICAgIEFWQ1RfQlJPV1NFX0NPTk5fQ0ZNX0VWVCBvciBBVkNUX0JST1dTRV9DT05OX0lORF9FVlQgb24KLSAqICAgICAgICAgICAgICAgICAgYnJvd3NpbmcgY2hhbm5lbC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfbXNnLT5sYXllcl9zcGVjaWZpYyBtdXN0IGJlIHNldCB0bwotICogICAgICAgICAgICAgICAgICBBVkNUX0RBVEFfQ1RSTCBmb3IgY29udHJvbCBjaGFubmVsIHRyYWZmaWM7Ci0gKiAgICAgICAgICAgICAgICAgIEFWQ1RfREFUQV9CUk9XU0UgZm9yIGZvciBicm93c2UgY2hhbm5lbCB0cmFmZmljLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZDVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWQ1RfTXNnUmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9tc2cpOwotCi0jZW5kaWYgLyogQVZDVF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hdmR0X2FwaS5oIGIvc3RhY2svaW5jbHVkZS9hdmR0X2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDUxYjA5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYXZkdF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAyLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgaW50ZXJmYWNlIGZpbGUgY29udGFpbnMgdGhlIGludGVyZmFjZSB0byB0aGUgQXVkaW8gVmlkZW8KLSAqICBEaXN0cmlidXRpb24gVHJhbnNwb3J0IFByb3RvY29sIChBVkRUUCkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVZEVF9BUElfSAotI2RlZmluZSBBVkRUX0FQSV9ICi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQVZEVF9WRVJTSU9OXzFfMyAweDAxMDMKLQotI2RlZmluZSBBVkRUUF9WRVJTSU9OX0NPTkZJR19LRVkgIkF2ZHRwVmVyc2lvbiIKLQotLyogTWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjb2RlYyBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24gZWxlbWVudC4gKi8KLSNkZWZpbmUgQVZEVF9DT0RFQ19TSVpFIDIwCi0KLS8qIEFQSSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgcmVzdWx0IGNvZGVzLiAqLwotdHlwZWRlZiBlbnVtIDogdWludDE2X3QgewotICBBVkRUX1NVQ0NFU1MgPSAwLCAgICAgIC8qIEZ1bmN0aW9uIHN1Y2Nlc3NmdWwgKi8KLSAgQVZEVF9CQURfUEFSQU1TID0gMSwgICAvKiBJbnZhbGlkIHBhcmFtZXRlcnMgKi8KLSAgQVZEVF9OT19SRVNPVVJDRVMgPSAyLCAvKiBOb3QgZW5vdWdoIHJlc291cmNlcyAqLwotICBBVkRUX0JBRF9IQU5ETEUgPSAzLCAgIC8qIEJhZCBoYW5kbGUgKi8KLSAgQVZEVF9CVVNZID0gNCwgICAgICAgICAvKiBBIHByb2NlZHVyZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzICovCi0gIEFWRFRfV1JJVEVfRkFJTCA9IDUsICAgLyogV3JpdGUgZmFpbGVkICovCi19IHRBVkRUX1JFU1VMVDsKLQotaW5saW5lIHRBVkRUX1JFU1VMVCBUb0F2ZHRSZXN1bHQodWludDE2X3QgcmVzdWx0KSB7Ci0gIEFTU0VSVF9MT0cocmVzdWx0IDw9IEFWRFRfV1JJVEVfRkFJTCwgIlVuYWJsZSB0byBjb252ZXJ0IGlsbGVnYWwgcmVzdWx0OiVodSIsCi0gICAgICAgICAgICAgcmVzdWx0KTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHRBVkRUX1JFU1VMVD4ocmVzdWx0KTsKLX0KLQotI2RlZmluZSBDQVNFX1JFVFVSTl9URVhUKGNvZGUpIFwKLSAgY2FzZSBjb2RlOiAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb2RlCi0KLWlubGluZSBzdGQ6OnN0cmluZyBhdmR0X3Jlc3VsdF90ZXh0KGNvbnN0IHRBVkRUX1JFU1VMVCYgcmVzdWx0KSB7Ci0gIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBVkRUX1NVQ0NFU1MpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQVZEVF9CQURfUEFSQU1TKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEFWRFRfTk9fUkVTT1VSQ0VTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEFWRFRfQkFEX0hBTkRMRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChBVkRUX0JVU1kpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQVZEVF9XUklURV9GQUlMKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigiVU5LTk9XTlslaHVdIiwgcmVzdWx0KTsKLSAgfQotfQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLQotLyogVGhlIGluZGV4IHRvIGFjY2VzcyB0aGUgY29kZWMgdHlwZSBpbiBjb2RlY19pbmZvW10uICovCi0jZGVmaW5lIEFWRFRfQ09ERUNfVFlQRV9JTkRFWCAyCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgQWRhcHRhdGlvbiBMYXllciBoZWFkZXIuICovCi0jZGVmaW5lIEFWRFRfQUxfSERSX1NJWkUgMwotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhIG1lZGlhIHBhY2tldCBoZWFkZXIuICovCi0jZGVmaW5lIEFWRFRfTUVESUFfSERSX1NJWkUgMTIKLQotLyogVGhlIGhhbmRsZSBpcyB1c2VkIHdoZW4gcmVwb3J0aW5nIE1VTFRJX0FWIHNwZWNpZmljIGV2ZW50cyAqLwotI2RlZmluZSBBVkRUX01VTFRJX0FWX0hBTkRMRSAweEZGCi0KLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBmb3IgdGhlIHByb3RvY29sIGhlYWRlcnMKLSAqIG9mIGEgbWVkaWEgcGFja2V0LiAgVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgbWVkaWEgcGFja2V0IGhlYWRlciwgdGhlCi0gKiBMMkNBUCBwYWNrZXQgaGVhZGVyIGFuZCBIQ0kgaGVhZGVyLgotKi8KLSNkZWZpbmUgQVZEVF9NRURJQV9PRkZTRVQgMjMKLQotLyogVGhlIG1hcmtlciBiaXQgaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gbWFyayBzaWduaWZpY2FudCBldmVudHMgc3VjaAotICogYXMgZnJhbWUgYm91bmRhcmllcyBpbiB0aGUgZGF0YSBzdHJlYW0uICBUaGlzIGNvbnN0YW50IGlzIHVzZWQgdG8gY2hlY2sgb3IKLSAqIHNldCB0aGUgbWFya2VyIGJpdCBpbiB0aGUgbV9wdCBwYXJhbWV0ZXIgb2YgYW4gQVZEVF9Xcml0ZVJlcSgpCi0gKiBvciBBVkRUX0RBVEFfSU5EX0VWVC4KLSovCi0jZGVmaW5lIEFWRFRfTUFSS0VSX1NFVCAweDgwCi0KLSNkZWZpbmUgTUFYXzJNQlBTX0FWRFRQX01UVSA2NjMgICAvLyAyREg1IE1UVT02NzksIC0xMiBmb3IgQVZEVFAsIC00IGZvciBMMkNBUAotI2RlZmluZSBNQVhfM01CUFNfQVZEVFBfTVRVIDEwMDUgIC8vIDNESDUgTVRVPTEwMjEsIC0xMiBmb3IgQVZEVFAsIC00IGZvciBMMkNBUAotCi0vKiBTRVAgVHlwZS4gIFRoaXMgaW5kaWNhdGVzIHRoZSBzdHJlYW0gZW5kcG9pbnQgdHlwZS4gKi8KLSNkZWZpbmUgQVZEVF9UU0VQX1NSQyAwICAgICAvKiBTb3VyY2UgU0VQICovCi0jZGVmaW5lIEFWRFRfVFNFUF9TTksgMSAgICAgLyogU2luayBTRVAgKi8KLSNkZWZpbmUgQVZEVF9UU0VQX0lOVkFMSUQgMyAvKiBJbnZhbGlkIFNFUCAqLwotaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nIHBlZXJfc3RyZWFtX2VuZHBvaW50X3RleHQoaW50IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBBVkRUX1RTRVBfU1JDOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJTb3VyY2UiKTsKLSAgICBjYXNlIEFWRFRfVFNFUF9TTks6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlNpbmsiKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJJbnZhbGlkIik7Ci0gIH0KLX0KLQotLyogaW5pdGlhdG9yL2FjY2VwdG9yIHJvbGUgZm9yIGFkYXB0aW9uICovCi0jZGVmaW5lIEFWRFRfSU5UIDAgLyogaW5pdGlhdG9yICovCi0jZGVmaW5lIEFWRFRfQUNQIDEgLyogYWNjZXB0b3IgKi8KLQotLyogTWVkaWEgVHlwZSBvZiB0aGUgc3RyZWFtIGVuZHBvaW50ICovCi0vKiBUaGUgdmFsdWUgZG9lcyBub3QgaW5jbHVkZSB0aGUgcmVzZXJ2ZWQgNC1iaXQgTFNCcyBmaWVsZCAqLwotI2RlZmluZSBBVkRUX01FRElBX1RZUEVfQVVESU8gMCAvKiBBdWRpbyBTRVAgKi8KLSNkZWZpbmUgQVZEVF9NRURJQV9UWVBFX1ZJREVPIDEgLyogVmlkZW8gU0VQICovCi0jZGVmaW5lIEFWRFRfTUVESUFfVFlQRV9NVUxUSSAyIC8qIE11bHRpbWVkaWEgU0VQICovCi0KLS8qIGZvciByZXBvcnRpbmcgcGFja2V0cyAocGFja2V0IHR5cGVzKSAqLwotI2RlZmluZSBBVkRUX1JUQ1BfUFRfU1IgMjAwICAgLyogU1IgKFNlbmRlciBSZXBvcnQpICovCi0jZGVmaW5lIEFWRFRfUlRDUF9QVF9SUiAyMDEgICAvKiBSUiAoUmVjZWl2ZXIgUmVwb3J0KSAqLwotI2RlZmluZSBBVkRUX1JUQ1BfUFRfU0RFUyAyMDIgLyogU0RFUyAoU291cmNlIERlc2NyaXB0aW9uKSAqLwotdHlwZWRlZiB1aW50OF90IEFWRFRfUkVQT1JUX1RZUEU7Ci0KLSNkZWZpbmUgQVZEVF9SVENQX1NERVNfQ05BTUUgMSAvKiBTREVTIGl0ZW0gQ05BTUUgKi8KLSNpZm5kZWYgQVZEVF9NQVhfQ05BTUVfU0laRQotI2RlZmluZSBBVkRUX01BWF9DTkFNRV9TSVpFIDI4Ci0jZW5kaWYKLQotLyogUHJvdG9jb2wgc2VydmljZSBjYXBhYmlsaXRpZXMuICBUaGlzIGluZGljYXRlcyB0aGUgcHJvdG9jb2wgc2VydmljZQotICogY2FwYWJpbGl0aWVzIG9mIGEgc3RyZWFtIGVuZHBvaW50LiAgVGhpcyB2YWx1ZSBpcyBhIG1hc2suCi0gKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggYSBiaXR3aXNlIE9SLgotKi8KLSNkZWZpbmUgQVZEVF9QU0NfVFJBTlMgKDEgPDwgMSkgICAgIC8qIE1lZGlhIHRyYW5zcG9ydCAqLwotI2RlZmluZSBBVkRUX1BTQ19SRVBPUlQgKDEgPDwgMikgICAgLyogUmVwb3J0aW5nICovCi0jZGVmaW5lIEFWRFRfUFNDX1JFQ09WICgxIDw8IDMpICAgICAvKiBSZWNvdmVyeSAqLwotI2RlZmluZSBBVkRUX1BTQ19IRFJDTVAgKDEgPDwgNSkgICAgLyogSGVhZGVyIGNvbXByZXNzaW9uICovCi0jZGVmaW5lIEFWRFRfUFNDX01VWCAoMSA8PCA2KSAgICAgICAvKiBNdWx0aXBsZXhpbmcgKi8KLSNkZWZpbmUgQVZEVF9QU0NfREVMQVlfUlBUICgxIDw8IDgpIC8qIERlbGF5IFJlcG9ydCAqLwotCi0vKiBSZWNvdmVyeSB0eXBlLiAgVGhpcyBpbmRpY2F0ZXMgdGhlIHJlY292ZXJ5IHR5cGUuICovCi0jZGVmaW5lIEFWRFRfUkVDT1ZfUkZDMjczMyAxIC8qIFJGQzI3MzMgcmVjb3ZlcnkgKi8KLQotLyogSGVhZGVyIGNvbXByZXNzaW9uIGNhcGFiaWxpdGllcy4gIFRoaXMgaW5kaWNhdGVzIHRoZSBoZWFkZXIgY29tcHJlc3Npb24KLSAqIGNhcGFiaWxpdGllcy4gIFRoaXMgdmFsdWUgaXMgYSBtYXNrLiAgTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjb21iaW5lZAotICogd2l0aCBhIGJpdHdpc2UgT1IuCi0qLwotI2RlZmluZSBBVkRUX0hEUkNNUF9NRURJQSAoMSA8PCA1KSAgLyogQXZhaWxhYmxlIGZvciBtZWRpYSBwYWNrZXRzICovCi0jZGVmaW5lIEFWRFRfSERSQ01QX1JFQ09WICgxIDw8IDYpICAvKiBBdmFpbGFibGUgZm9yIHJlY292ZXJ5IHBhY2tldHMgKi8KLSNkZWZpbmUgQVZEVF9IRFJDTVBfQkFDS0NIICgxIDw8IDcpIC8qIEJhY2sgY2hhbm5lbCBzdXBwb3J0ZWQgKi8KLQotLyogTXVsdGlwbGV4aW5nIGNhcGFiaWxpdGllcyBtYXNrLiAqLwotI2RlZmluZSBBVkRUX01VWF9GUkFHICgxIDw8IDcpIC8qIEFsbG93IEFkYXB0YXRpb24gTGF5ZXIgRnJhZ21lbnRhdGlvbiAqLwotCi0vKiBBcHBsaWNhdGlvbiBzZXJ2aWNlIGNhdGVnb3J5LiBUaGlzIGluZGljYXRlcyB0aGUgYXBwbGljYXRpb24KLSAqIHNlcnZpY2UgY2F0ZWdvcnkuCi0qLwotI2RlZmluZSBBVkRUX0FTQ19QUk9URUNUIDQgLyogQ29udGVudCBwcm90ZWN0aW9uICovCi0jZGVmaW5lIEFWRFRfQVNDX0NPREVDIDcgICAvKiBDb2RlYyAqLwotCi0vKiB0aGUgY29udGVudCBwcm90ZWN0aW9uIElEcyBhc3NpZ25lZCBieSBCVCBTSUcgKi8KLSNkZWZpbmUgQVZEVF9DUF9TQ01TX1RfSUQgMHgwMDAyCi0jZGVmaW5lIEFWRFRfQ1BfRFRDUF9JRCAweDAwMDEKLQotI2RlZmluZSBBVkRUX0NQX0xPU0MgMgotI2RlZmluZSBBVkRUX0NQX0lORk9fTEVOIDMKLQotI2RlZmluZSBBVkRUX0NQX1NDTVNfQ09QWV9NQVNLIDMKLSNkZWZpbmUgQVZEVF9DUF9TQ01TX0NPUFlfRlJFRSAyCi0jZGVmaW5lIEFWRFRfQ1BfU0NNU19DT1BZX09OQ0UgMQotI2RlZmluZSBBVkRUX0NQX1NDTVNfQ09QWV9ORVZFUiAwCi0KLS8qIEVycm9yIGNvZGVzLiAgVGhlIGZvbGxvd2luZyBhcmUgZXJyb3IgY29kZXMgZGVmaW5lZCBpbiB0aGUgQVZEVFAgYW5kIEdBVkRQCi0gKiBzcGVjaWZpY2F0aW9ucy4gIFRoZXNlIGVycm9yIGNvZGVzIGNvbW11bmljYXRlIHByb3RvY29sIGVycm9ycyBiZXR3ZWVuCi0gKiBBVkRUUCBhbmQgdGhlIGFwcGxpY2F0aW9uLiAgTW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgb2YgdGhlIGVycm9yIGNvZGVzCi0gKiBhbmQgdGhlaXIgYXBwcm9wcmlhdGUgdXNlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQVZEVFAgYW5kIEdBVkRQIHNwZWNpZmljYXRpb25zLgotICogVGhlc2UgZXJyb3IgY29kZXMgYXJlIHVucmVsYXRlZCB0byB0aGUgcmVzdWx0IHZhbHVlcyByZXR1cm5lZCBieSB0aGUKLSAqIEFWRFRQIEFQSSBmdW5jdGlvbnMuCi0qLwotLyogQmFkIHBhY2tldCBoZWFkZXIgZm9ybWF0ICovCi0jZGVmaW5lIEFWRFRfRVJSX0hFQURFUiAweDAxCi0vKiBCYWQgcGFja2V0IGxlbmd0aCAqLwotI2RlZmluZSBBVkRUX0VSUl9MRU5HVEggMHgxMQotLyogSW52YWxpZCBTRUlEICovCi0jZGVmaW5lIEFWRFRfRVJSX1NFSUQgMHgxMgotLyogVGhlIFNFUCBpcyBpbiB1c2UgKi8KLSNkZWZpbmUgQVZEVF9FUlJfSU5fVVNFIDB4MTMKLS8qIFRoZSBTRVAgaXMgbm90IGluIHVzZSAqLwotI2RlZmluZSBBVkRUX0VSUl9OT1RfSU5fVVNFIDB4MTQKLS8qIEJhZCBzZXJ2aWNlIGNhdGVnb3J5ICovCi0jZGVmaW5lIEFWRFRfRVJSX0NBVEVHT1JZIDB4MTcKLS8qIEJhZCBwYXlsb2FkIGZvcm1hdCAqLwotI2RlZmluZSBBVkRUX0VSUl9QQVlMT0FEIDB4MTgKLS8qIFJlcXVlc3RlZCBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQVZEVF9FUlJfTlNDIDB4MTkKLS8qIFJlY29uZmlndXJlIGF0dGVtcHRlZCBpbnZhbGlkIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSBBVkRUX0VSUl9JTlZBTElEX0NBUCAweDFBCi0vKiBSZXF1ZXN0ZWQgcmVjb3ZlcnkgdHlwZSBub3QgZGVmaW5lZCAqLwotI2RlZmluZSBBVkRUX0VSUl9SRUNPVl9UWVBFIDB4MjIKLS8qIE1lZGlhIHRyYW5zcG9ydCBjYXBhYmlsaXR5IG5vdCBjb3JyZWN0ICovCi0jZGVmaW5lIEFWRFRfRVJSX01FRElBX1RSQU5TIDB4MjMKLS8qIFJlY292ZXJ5IHNlcnZpY2UgY2FwYWJpbGl0eSBub3QgY29ycmVjdCAqLwotI2RlZmluZSBBVkRUX0VSUl9SRUNPVl9GTVQgMHgyNQotLyogSGVhZGVyIGNvbXByZXNzaW9uIHNlcnZpY2UgY2FwYWJpbGl0eSBub3QgY29ycmVjdCAqLwotI2RlZmluZSBBVkRUX0VSUl9ST0hDX0ZNVCAweDI2Ci0vKiBDb250ZW50IHByb3RlY3Rpb24gc2VydmljZSBjYXBhYmlsaXR5IG5vdCBjb3JyZWN0ICovCi0jZGVmaW5lIEFWRFRfRVJSX0NQX0ZNVCAweDI3Ci0vKiBNdWx0aXBsZXhpbmcgc2VydmljZSBjYXBhYmlsaXR5IG5vdCBjb3JyZWN0ICovCi0jZGVmaW5lIEFWRFRfRVJSX01VWF9GTVQgMHgyOAotLyogQ29uZmlndXJhdGlvbiBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIEFWRFRfRVJSX1VOU1VQX0NGRyAweDI5Ci0vKiBNZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQgaW4gdGhpcyBzdGF0ZSAqLwotI2RlZmluZSBBVkRUX0VSUl9CQURfU1RBVEUgMHgzMQotLyogUmVwb3J0IHNlcnZpY2UgY2FwYWJpbGl0eSBub3QgY29ycmVjdCAqLwotI2RlZmluZSBBVkRUX0VSUl9SRVBPUlRfRk1UIDB4NjUKLS8qIEludmFsaWQgc2VydmljZSBjYXRlZ29yeSAqLwotI2RlZmluZSBBVkRUX0VSUl9TRVJWSUNFIDB4ODAKLS8qIEluc3VmZmljaWVudCByZXNvdXJjZXMgKi8KLSNkZWZpbmUgQVZEVF9FUlJfUkVTT1VSQ0UgMHg4MQotLyogSW52YWxpZCBNZWRpYSBDb2RlYyBUeXBlICovCi0jZGVmaW5lIEFWRFRfRVJSX0lOVkFMSURfTUNUIDB4QzEKLS8qIFVuc3VwcG9ydGVkIE1lZGlhIENvZGVjIFR5cGUgKi8KLSNkZWZpbmUgQVZEVF9FUlJfVU5TVVBfTUNUIDB4QzIKLS8qIEludmFsaWQgTGV2ZWwgKi8KLSNkZWZpbmUgQVZEVF9FUlJfSU5WQUxJRF9MRVZFTCAweEMzCi0vKiBVbnN1cHBvcnRlZCBMZXZlbCAqLwotI2RlZmluZSBBVkRUX0VSUl9VTlNVUF9MRVZFTCAweEM0Ci0vKiBJbnZhbGlkIENvbnRlbnQgUHJvdGVjdGlvbiBUeXBlICovCi0jZGVmaW5lIEFWRFRfRVJSX0lOVkFMSURfQ1AgMHhFMAotLyogSW52YWxpZCBDb250ZW50IFByb3RlY3Rpb24gZm9ybWF0ICovCi0jZGVmaW5lIEFWRFRfRVJSX0lOVkFMSURfRk9STUFUIDB4RTEKLQotLyogQWRkaXRpb25hbCBlcnJvciBjb2Rlcy4gIFRoaXMgaW5kaWNhdGVzIGVycm9yIGNvZGVzIHVzZWQgYnkgQVZEVFAKLSAqIGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljYXRpb25zLgotKi8KLSNkZWZpbmUgQVZEVF9FUlJfQ09OTkVDVCAweDA3IC8qIENvbm5lY3Rpb24gZmFpbGVkLiAqLwotI2RlZmluZSBBVkRUX0VSUl9USU1FT1VUIDB4MDggLyogUmVzcG9uc2UgdGltZW91dC4gKi8KLQotLyogQ29udHJvbCBjYWxsYmFjayBldmVudHMuICovCi0jZGVmaW5lIEFWRFRfRElTQ09WRVJfQ0ZNX0VWVCAwICAgICAgLyogRGlzY292ZXIgY29uZmlybSAqLwotI2RlZmluZSBBVkRUX0dFVENBUF9DRk1fRVZUIDEgICAgICAgIC8qIEdldCBjYXBhYmlsaXRpZXMgY29uZmlybSAqLwotI2RlZmluZSBBVkRUX09QRU5fQ0ZNX0VWVCAyICAgICAgICAgIC8qIE9wZW4gY29uZmlybSAqLwotI2RlZmluZSBBVkRUX09QRU5fSU5EX0VWVCAzICAgICAgICAgIC8qIE9wZW4gaW5kaWNhdGlvbiAqLwotI2RlZmluZSBBVkRUX0NPTkZJR19JTkRfRVZUIDQgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbiAqLwotI2RlZmluZSBBVkRUX1NUQVJUX0NGTV9FVlQgNSAgICAgICAgIC8qIFN0YXJ0IGNvbmZpcm0gKi8KLSNkZWZpbmUgQVZEVF9TVEFSVF9JTkRfRVZUIDYgICAgICAgICAvKiBTdGFydCBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWRFRfU1VTUEVORF9DRk1fRVZUIDcgICAgICAgLyogU3VzcGVuZCBjb25maXJtICovCi0jZGVmaW5lIEFWRFRfU1VTUEVORF9JTkRfRVZUIDggICAgICAgLyogU3VzcGVuZCBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWRFRfQ0xPU0VfQ0ZNX0VWVCA5ICAgICAgICAgLyogQ2xvc2UgY29uZmlybSAqLwotI2RlZmluZSBBVkRUX0NMT1NFX0lORF9FVlQgMTAgICAgICAgIC8qIENsb3NlIGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZEVF9SRUNPTkZJR19DRk1fRVZUIDExICAgICAvKiBSZWNvbmZpZ3VyYXRpb24gY29uZmlybSAqLwotI2RlZmluZSBBVkRUX1JFQ09ORklHX0lORF9FVlQgMTIgICAgIC8qIFJlY29uZmlndXJhdGlvbiBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWRFRfU0VDVVJJVFlfQ0ZNX0VWVCAxMyAgICAgLyogU2VjdXJpdHkgY29uZmlybSAqLwotI2RlZmluZSBBVkRUX1NFQ1VSSVRZX0lORF9FVlQgMTQgICAgIC8qIFNlY3VyaXR5IGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZEVF9XUklURV9DRk1fRVZUIDE1ICAgICAgICAvKiBXcml0ZSBjb25maXJtICovCi0jZGVmaW5lIEFWRFRfQ09OTkVDVF9JTkRfRVZUIDE2ICAgICAgLyogU2lnbmFsaW5nIGNoYW5uZWwgY29ubmVjdGVkICovCi0jZGVmaW5lIEFWRFRfRElTQ09OTkVDVF9JTkRfRVZUIDE3ICAgLyogU2lnbmFsaW5nIGNoYW5uZWwgZGlzY29ubmVjdGVkICovCi0jZGVmaW5lIEFWRFRfUkVQT1JUX0NPTk5fRVZUIDE4ICAgICAgLyogUmVwb3J0aW5nIGNoYW5uZWwgY29ubmVjdGVkICovCi0jZGVmaW5lIEFWRFRfUkVQT1JUX0RJU0NPTk5fRVZUIDE5ICAgLyogUmVwb3J0aW5nIGNoYW5uZWwgZGlzY29ubmVjdGVkICovCi0jZGVmaW5lIEFWRFRfREVMQVlfUkVQT1JUX0VWVCAyMCAgICAgLyogRGVsYXkgcmVwb3J0IHJlY2VpdmVkICovCi0jZGVmaW5lIEFWRFRfREVMQVlfUkVQT1JUX0NGTV9FVlQgMjEgLyogRGVsYXkgcmVwb3J0IHJlc3BvbnNlIHJlY2VpdmVkICovCi0KLSNkZWZpbmUgQVZEVF9NQVhfRVZUIChBVkRUX0RFTEFZX1JFUE9SVF9DRk1fRVZUKQotCi0vKiBQU00gZm9yIEFWRFQgKi8KLSNkZWZpbmUgQVZEVF9QU00gMHgwMDE5Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgRGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IG50cF9zZWM7IC8qIE5UUCB0aW1lOiBzZWNvbmRzIHJlbGF0aXZlIHRvIDBoIFVUQyBvbiAxIEphbnVhcnkgMTkwMCAqLwotICB1aW50MzJfdCBudHBfZnJhYzsgICAgLyogTlRQIHRpbWU6IHRoZSBmcmFjdGlvbmFsIHBhcnQgKi8KLSAgdWludDMyX3QgcnRwX3RpbWU7ICAgIC8qIHRpbWVzdGFtcCBpbiBSVFAgaGVhZGVyICovCi0gIHVpbnQzMl90IHBrdF9jb3VudDsgICAvKiBzZW5kZXIncyBwYWNrZXQgY291bnQ6IHNpbmNlIHN0YXJ0aW5nIHRyYW5zbWlzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgKiB1cCB1bnRpbCB0aGUgdGltZSB0aGlzIFNSIHBhY2tldCB3YXMgZ2VuZXJhdGVkLiAqLwotICB1aW50MzJfdCBvY3RldF9jb3VudDsgLyogc2VuZGVyJ3Mgb2N0ZXQgY291bnQ6IHNhbWUgY29tbWVudCAqLwotfSB0QVZEVF9TRU5ERVJfSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGZyYWdfbG9zdDsgLyogZnJhY3Rpb24gbG9zdCBzaW5jZSBsYXN0IFJSICovCi0gIHVpbnQzMl90Ci0gICAgICBwYWNrZXRfbG9zdDsgLyogY3VtdWxhdGl2ZSBudW1iZXIgb2YgcGFja2V0cyBsb3N0IHNpbmNlIHRoZSBiZWdpbm5pbmcgKi8KLSAgdWludDMyX3Qgc2VxX251bV9yY3ZkOyAvKiBleHRlbmRlZCBoaWdoZXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCAqLwotICB1aW50MzJfdCBqaXR0ZXI7ICAgICAgIC8qIGludGVyYXJyaXZhbCBqaXR0ZXIgKi8KLSAgdWludDMyX3QgbHNyOyAgICAgICAgICAvKiBsYXN0IFNSIHRpbWVzdGFtcCAqLwotICB1aW50MzJfdCBkbHNyOyAgICAgICAgIC8qIGRlbGF5IHNpbmNlIGxhc3QgU1IgKi8KLX0gdEFWRFRfUkVQT1JUX0JMSzsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHRBVkRUX1NFTkRFUl9JTkZPIHNyOwotICB0QVZEVF9SRVBPUlRfQkxLIHJyOwotICB1aW50OF90IGNuYW1lW0FWRFRfTUFYX0NOQU1FX1NJWkUgKyAxXTsKLX0gdEFWRFRfUkVQT1JUX0RBVEE7Ci0KLS8qKgotICogQVZEVFAgUmVnaXN0cmF0aW9uIENvbnRyb2wgQmxvY2suCi0gKi8KLWNsYXNzIEF2ZHRwUmNiIHsKLSBwdWJsaWM6Ci0gIEF2ZHRwUmNiKCkKLSAgICAgIDogY3RybF9tdHUoMCksCi0gICAgICAgIHJldF90b3V0KDApLAotICAgICAgICBzaWdfdG91dCgwKSwKLSAgICAgICAgaWRsZV90b3V0KDApLAotICAgICAgICBzY2JfaW5kZXgoMCkge30KLSAgQXZkdHBSY2ImIG9wZXJhdG9yPShjb25zdCBBdmR0cFJjYiYpID0gZGVmYXVsdDsKLQotICB2b2lkIFJlc2V0KCkgewotICAgIGN0cmxfbXR1ID0gMDsKLSAgICByZXRfdG91dCA9IDA7Ci0gICAgc2lnX3RvdXQgPSAwOwotICAgIGlkbGVfdG91dCA9IDA7Ci0gICAgc2NiX2luZGV4ID0gMDsKLSAgfQotCi0gIHVpbnQxNl90IGN0cmxfbXR1OyAvKiBMMkNBUCBNVFUgb2YgdGhlIEFWRFRQIHNpZ25hbGluZyBjaGFubmVsICovCi0gIHVpbnQ4X3QgcmV0X3RvdXQ7ICAvKiBBVkRUUCBzaWduYWxpbmcgcmV0cmFuc21pc3Npb24gdGltZW91dCAqLwotICB1aW50OF90IHNpZ190b3V0OyAgLyogQVZEVFAgc2lnbmFsaW5nIG1lc3NhZ2UgdGltZW91dCAqLwotICB1aW50OF90IGlkbGVfdG91dDsgLyogQVZEVFAgaWRsZSBzaWduYWxpbmcgY2hhbm5lbCB0aW1lb3V0ICovCi0gIHVpbnQ4X3Qgc2NiX2luZGV4OyAvKiBUaGUgU3RyZWFtIENvbnRyb2wgQmxvY2sgaW5kZXggKi8KLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBTRVAgaW5mb3JtYXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzCi0gKiB0cmFuc2ZlcnJlZCBkdXJpbmcgdGhlIGRpc2NvdmVyeSBwcm9jZWR1cmUuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIGluX3VzZTsgICAgICAgIC8qIHRydWUgaWYgc3RyZWFtIGlzIGN1cnJlbnRseSBpbiB1c2UgKi8KLSAgdWludDhfdCBzZWlkOyAgICAgICAvKiBTdHJlYW0gZW5kcG9pbnQgaWRlbnRpZmllciAqLwotICB1aW50OF90IG1lZGlhX3R5cGU7IC8qIE1lZGlhIHR5cGU6IEFWRFRfTUVESUFfVFlQRV8qICovCi0gIHVpbnQ4X3QgdHNlcDsgICAgICAgLyogU0VQIHR5cGUgKi8KLX0gdEFWRFRfU0VQX0lORk87Ci0KLS8qKgotICogQVZEVFAgU0VQIENvbmZpZ3VyYXRpb24uCi0gKi8KLWNsYXNzIEF2ZHRwU2VwQ29uZmlnIHsKLSBwdWJsaWM6Ci0gIEF2ZHRwU2VwQ29uZmlnKCkKLSAgICAgIDogY29kZWNfaW5mb3t9LAotICAgICAgICBwcm90ZWN0X2luZm97fSwKLSAgICAgICAgbnVtX2NvZGVjKDApLAotICAgICAgICBudW1fcHJvdGVjdCgwKSwKLSAgICAgICAgcHNjX21hc2soMCksCi0gICAgICAgIHJlY292X3R5cGUoMCksCi0gICAgICAgIHJlY292X21yd3MoMCksCi0gICAgICAgIHJlY292X21ubXAoMCksCi0gICAgICAgIGhkcmNtcF9tYXNrKDApIHt9Ci0gIEF2ZHRwU2VwQ29uZmlnJiBvcGVyYXRvcj0oY29uc3QgQXZkdHBTZXBDb25maWcmKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBtZW1zZXQoY29kZWNfaW5mbywgMCwgc2l6ZW9mKGNvZGVjX2luZm8pKTsKLSAgICBtZW1zZXQocHJvdGVjdF9pbmZvLCAwLCBzaXplb2YocHJvdGVjdF9pbmZvKSk7Ci0gICAgbnVtX2NvZGVjID0gMDsKLSAgICBudW1fcHJvdGVjdCA9IDA7Ci0gICAgcHNjX21hc2sgPSAwOwotICAgIHJlY292X3R5cGUgPSAwOwotICAgIHJlY292X21yd3MgPSAwOwotICAgIHJlY292X21ubXAgPSAwOwotICAgIGhkcmNtcF9tYXNrID0gMDsKLSAgfQotCi0gIHVpbnQ4X3QgY29kZWNfaW5mb1tBVkRUX0NPREVDX1NJWkVdOyAgICAgLyogQ29kZWMgY2FwYWJpbGl0aWVzIGFycmF5ICovCi0gIHVpbnQ4X3QgcHJvdGVjdF9pbmZvW0FWRFRfUFJPVEVDVF9TSVpFXTsgLyogQ29udGVudCBwcm90ZWN0aW9uIGNhcGFiaWxpdGllcyAqLwotICB1aW50OF90IG51bV9jb2RlYzsgICAvKiBOdW1iZXIgb2YgbWVkaWEgY29kZWMgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KLSAgdWludDhfdCBudW1fcHJvdGVjdDsgLyogTnVtYmVyIG9mIGNvbnRlbnQgcHJvdGVjdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyAqLwotICB1aW50MTZfdCBwc2NfbWFzazsgICAvKiBQcm90b2NvbCBzZXJ2aWNlIGNhcGFiaWxpdGllcyBtYXNrICovCi0gIHVpbnQ4X3QgcmVjb3ZfdHlwZTsgIC8qIFJlY292ZXJ5IHR5cGUgKi8KLSAgdWludDhfdCByZWNvdl9tcndzOyAgLyogTWF4aW11bSByZWNvdmVyeSB3aW5kb3cgc2l6ZSAqLwotICB1aW50OF90IHJlY292X21ubXA7ICAvKiBSZWNvdmVyeSBtYXhpbXVtIG51bWJlciBvZiBtZWRpYSBwYWNrZXRzICovCi0gIHVpbnQ4X3QgaGRyY21wX21hc2s7IC8qIEhlYWRlciBjb21wcmVzc2lvbiBjYXBhYmlsaXRpZXMgKi8KLX07Ci0KLS8qIEhlYWRlciBzdHJ1Y3R1cmUgZm9yIGNhbGxiYWNrIGV2ZW50IHBhcmFtZXRlcnMuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QKLSAgICAgIGVycl9jb2RlOyAvKiBaZXJvIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQ7IG5vbnplcm8gaWYgb3BlcmF0aW9uIGZhaWxlZCAqLwotICB1aW50OF90IGVycl9wYXJhbTsgLyogRXJyb3IgcGFyYW1ldGVyIGluY2x1ZGVkIGZvciBzb21lIGV2ZW50cyAqLwotICB1aW50OF90IGxhYmVsOyAgICAgLyogVHJhbnNhY3Rpb24gbGFiZWwgKi8KLSAgdWludDhfdCBzZWlkOyAgICAgIC8qIEZvciBpbnRlcm5hbCB1c2Ugb25seSAqLwotICB1aW50OF90IHNpZ19pZDsgICAgLyogRm9yIGludGVybmFsIHVzZSBvbmx5ICovCi0gIHVpbnQ4X3QgY2NiX2lkeDsgICAvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KLX0gdEFWRFRfRVZUX0hEUjsKLQotLyogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFWRFRfR0VUQ0FQX0NGTV9FVlQsCi0gKiBBVkRUX1JFQ09ORklHX0lORF9FVlQsIGFuZCBBVkRUX1JFQ09ORklHX0NGTV9FVlQuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZEVF9FVlRfSERSIGhkcjsgLyogRXZlbnQgaGVhZGVyICovCi0gIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZzsgLyogUG9pbnRlciB0byBjb25maWd1cmF0aW9uIGZvciB0aGlzIFNFUCAqLwotfSB0QVZEVF9DT05GSUc7Ci0KLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBVkRUX0NPTkZJR19JTkRfRVZULiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZEVF9FVlRfSERSIGhkcjsgLyogRXZlbnQgaGVhZGVyICovCi0gIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZzsgLyogUG9pbnRlciB0byBjb25maWd1cmF0aW9uIGZvciB0aGlzIFNFUCAqLwotICB1aW50OF90IGludF9zZWlkOyAgLyogU3RyZWFtIGVuZHBvaW50IElEIG9mIHN0cmVhbSBpbml0aWF0aW5nIHRoZSBvcGVyYXRpb24gKi8KLX0gdEFWRFRfU0VUQ09ORklHOwotCi0vKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQVZEVF9PUEVOX0lORF9FVlQgYW5kCi0gKiBBVkRUX09QRU5fQ0ZNX0VWVC4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEFWRFRfRVZUX0hEUiBoZHI7IC8qIEV2ZW50IGhlYWRlciAqLwotICB1aW50MTZfdCBwZWVyX210dTsgLyogVHJhbnNwb3J0IGNoYW5uZWwgTDJDQVAgTVRVIG9mIHRoZSBwZWVyICovCi0gIHVpbnQxNl90IGxjaWQ7ICAgICAvKiBMMkNBUCBMQ0lEIGZvciBtZWRpYSBjaGFubmVsICovCi19IHRBVkRUX09QRU47Ci0KLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBVkRUX1NFQ1VSSVRZX0lORF9FVlQKLSAqIGFuZCBBVkRUX1NFQ1VSSVRZX0NGTV9FVlQuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZEVF9FVlRfSERSIGhkcjsgLyogRXZlbnQgaGVhZGVyICovCi0gIHVpbnQ4X3QqIHBfZGF0YTsgICAvKiBQb2ludGVyIHRvIHNlY3VyaXR5IGRhdGEgKi8KLSAgdWludDE2X3QgbGVuOyAgICAgIC8qIExlbmd0aCBpbiBieXRlcyBvZiB0aGUgc2VjdXJpdHkgZGF0YSAqLwotfSB0QVZEVF9TRUNVUklUWTsKLQotLyogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFWRFRfRElTQ09WRVJfQ0ZNX0VWVC4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEFWRFRfRVZUX0hEUiBoZHI7ICAgICAgICAgIC8qIEV2ZW50IGhlYWRlciAqLwotICB0QVZEVF9TRVBfSU5GTyogcF9zZXBfaW5mbzsgLyogUG9pbnRlciB0byBTRVAgaW5mb3JtYXRpb24gKi8KLSAgdWludDhfdCBudW1fc2VwczsgICAgICAgICAgIC8qIE51bWJlciBvZiBzdHJlYW0gZW5kcG9pbnRzICovCi19IHRBVkRUX0RJU0NPVkVSOwotCi0vKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQVZEVF9ERUxBWV9SRVBPUlRfRVZULiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZEVF9FVlRfSERSIGhkcjsgLyogRXZlbnQgaGVhZGVyICovCi0gIHVpbnQxNl90IGRlbGF5OyAgICAvKiBEZWxheSB2YWx1ZSAqLwotfSB0QVZEVF9ERUxBWV9SUFQ7Ci0KLS8qIFVuaW9uIG9mIGFsbCBjb250cm9sIGNhbGxiYWNrIGV2ZW50IGRhdGEgc3RydWN0dXJlcyAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHRBVkRUX0VWVF9IRFIgaGRyOwotICB0QVZEVF9ESVNDT1ZFUiBkaXNjb3Zlcl9jZm07Ci0gIHRBVkRUX0NPTkZJRyBnZXRjYXBfY2ZtOwotICB0QVZEVF9PUEVOIG9wZW5fY2ZtOwotICB0QVZEVF9PUEVOIG9wZW5faW5kOwotICB0QVZEVF9TRVRDT05GSUcgY29uZmlnX2luZDsKLSAgdEFWRFRfRVZUX0hEUiBzdGFydF9jZm07Ci0gIHRBVkRUX0VWVF9IRFIgc3VzcGVuZF9jZm07Ci0gIHRBVkRUX0VWVF9IRFIgY2xvc2VfY2ZtOwotICB0QVZEVF9DT05GSUcgcmVjb25maWdfY2ZtOwotICB0QVZEVF9DT05GSUcgcmVjb25maWdfaW5kOwotICB0QVZEVF9TRUNVUklUWSBzZWN1cml0eV9jZm07Ci0gIHRBVkRUX1NFQ1VSSVRZIHNlY3VyaXR5X2luZDsKLSAgdEFWRFRfRVZUX0hEUiBjb25uZWN0X2luZDsKLSAgdEFWRFRfRVZUX0hEUiBkaXNjb25uZWN0X2luZDsKLSAgdEFWRFRfRVZUX0hEUiByZXBvcnRfY29ubjsKLSAgdEFWRFRfREVMQVlfUlBUIGRlbGF5X3JwdF9jbWQ7Ci19IHRBVkRUX0NUUkw7Ci0KLS8qIFRoaXMgaXMgdGhlIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIHBhc3NlcyBjb250cm9sIGV2ZW50cwotICogdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsIHJlZ2lzdGVyZWQgc3RyZWFtCi0gKiBlbmRwb2ludHMgYW5kIGZvciB0aGUgQVZEVF9EaXNjb3ZlclJlcSgpIGFuZCBBVkRUX0dldENhcFJlcSgpIGZ1bmN0aW9ucy4KLSAqCi0qLwotdHlwZWRlZiB2b2lkKHRBVkRUX0NUUkxfQ0JBQ0spKHVpbnQ4X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYl9pbmRleCk7Ci0KLS8qIFRoaXMgaXMgdGhlIGRhdGEgY2FsbGJhY2sgZnVuY3Rpb24uICBJdCBpcyBleGVjdXRlZCB3aGVuIEFWRFRQIGhhcyBhIG1lZGlhCi0gKiBwYWNrZXQgcmVhZHkgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIFNOSwotICogZW5kcG9pbnRzIGFuZCBub3QgYXBwbGljYWJsZSBmb3IgU1JDIGVuZHBvaW50cy4KLSovCi10eXBlZGVmIHZvaWQodEFWRFRfU0lOS19EQVRBX0NCQUNLKSh1aW50OF90IGhhbmRsZSwgQlRfSERSKiBwX3BrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRpbWVfc3RhbXAsIHVpbnQ4X3QgbV9wdCk7Ci0KLS8qIFRoaXMgaXMgdGhlIHJlcG9ydCBjYWxsYmFjayBmdW5jdGlvbi4gIEl0IGlzIGV4ZWN1dGVkIHdoZW4gQVZEVFAgaGFzIGEKLSAqIHJlcG9ydGluZyBwYWNrZXQgcmVhZHkgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiBzdHJlYW1zIGNyZWF0ZWQgd2l0aCBBVkRUX1BTQ19SRVBPUlQuCi0qLwotdHlwZWRlZiB2b2lkKHRBVkRUX1JFUE9SVF9DQkFDSykodWludDhfdCBoYW5kbGUsIEFWRFRfUkVQT1JUX1RZUEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX1JFUE9SVF9EQVRBKiBwX2RhdGEpOwotCi0vKioKLSAqIEFWRFRQIFN0cmVhbSBDb25maWd1cmF0aW9uLgotICogVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgd2hlbiBhIHN0cmVhbSBpcyBjcmVhdGVkLgotICovCi1jbGFzcyBBdmR0cFN0cmVhbUNvbmZpZyB7Ci0gcHVibGljOgotICAvLwotICAvLyBOb24tc3VwcG9ydGVkIHByb3RvY29sIGNvbW1hbmQgbWVzc2FnZXMKLSAgLy8KLSAgLy8gU3VzcGVuZCBjb21tYW5kIG5vdCBzdXBwb3J0ZWQKLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQVZEVF9OU0NfU1VTUEVORCA9IDB4MDE7Ci0gIC8vIFJlY29uZmlndXJlIGNvbW1hbmQgbm90IHN1cHBvcnRlZAotICBzdGF0aWMgY29uc3RleHByIGludCBBVkRUX05TQ19SRUNPTkZJRyA9IDB4MDI7Ci0gIC8vIFNlY3VyaXR5IGNvbW1hbmQgbm90IHN1cHBvcnRlZAotICBzdGF0aWMgY29uc3RleHByIGludCBBVkRUX05TQ19TRUNVUklUWSA9IDB4MDQ7Ci0KLSAgQXZkdHBTdHJlYW1Db25maWcoKQotICAgICAgOiBwX2F2ZHRfY3RybF9jYmFjayhudWxscHRyKSwKLSAgICAgICAgc2NiX2luZGV4KDApLAotICAgICAgICBwX3NpbmtfZGF0YV9jYmFjayhudWxscHRyKSwKLSAgICAgICAgcF9yZXBvcnRfY2JhY2sobnVsbHB0ciksCi0gICAgICAgIG10dSgwKSwKLSAgICAgICAgdHNlcCgwKSwKLSAgICAgICAgbWVkaWFfdHlwZSgwKSwKLSAgICAgICAgbnNjX21hc2soMCkge30KLQotICB2b2lkIFJlc2V0KCkgewotICAgIGNmZy5SZXNldCgpOwotICAgIHBfYXZkdF9jdHJsX2NiYWNrID0gbnVsbHB0cjsKLSAgICBzY2JfaW5kZXggPSAwOwotICAgIHBfc2lua19kYXRhX2NiYWNrID0gbnVsbHB0cjsKLSAgICBwX3JlcG9ydF9jYmFjayA9IG51bGxwdHI7Ci0gICAgbXR1ID0gMDsKLSAgICB0c2VwID0gMDsKLSAgICBtZWRpYV90eXBlID0gMDsKLSAgICBuc2NfbWFzayA9IDA7Ci0gIH0KLQotICBBdmR0cFNlcENvbmZpZyBjZmc7ICAgICAgICAgICAgICAgICAgIC8vIFNFUCBjb25maWd1cmF0aW9uCi0gIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfYXZkdF9jdHJsX2NiYWNrOyAgLy8gQ29udHJvbCBjYWxsYmFjayBmdW5jdGlvbgotICB1aW50OF90IHNjYl9pbmRleDsgIC8vIFRoZSBpbmRleCB0byB0aGUgYnRhX2F2X2NiLnBfc2NiW10gZW50cnkKLSAgdEFWRFRfU0lOS19EQVRBX0NCQUNLKiBwX3NpbmtfZGF0YV9jYmFjazsgIC8vIFNpbmsgZGF0YSBjYWxsYmFjayBmdW5jdGlvbgotICB0QVZEVF9SRVBPUlRfQ0JBQ0sqIHBfcmVwb3J0X2NiYWNrOyAgICAgICAgLy8gUmVwb3J0IGNhbGxiYWNrIGZ1bmN0aW9uCi0gIHVpbnQxNl90IG10dTsgICAgICAgIC8vIFRoZSBMMkNBUCBNVFUgb2YgdGhlIHRyYW5zcG9ydCBjaGFubmVsCi0gIHVpbnQ4X3QgdHNlcDsgICAgICAgIC8vIFNFUCB0eXBlCi0gIHVpbnQ4X3QgbWVkaWFfdHlwZTsgIC8vIE1lZGlhIHR5cGU6IEFWRFRfTUVESUFfVFlQRV8qCi0gIHVpbnQxNl90IG5zY19tYXNrOyAgIC8vIE5vbnN1cHBvcnRlZCBwcm90b2NvbCBjb21tYW5kIG1lc3NhZ2VzCi19OwotCi0vKiBBVkRUIGRhdGEgb3B0aW9uIG1hc2sgaXMgdXNlZCBpbiB0aGUgd3JpdGUgcmVxdWVzdCAqLwotI2RlZmluZSBBVkRUX0RBVEFfT1BUX05PTkUgMHgwMCAgICAgICAgICAvKiBObyBvcHRpb24gc3RpbGwgYWRkIFJUUCBoZWFkZXIgKi8KLSNkZWZpbmUgQVZEVF9EQVRBX09QVF9OT19SVFAgKDB4MDEgPDwgMCkgLyogU2tpcCBhZGRpbmcgUlRQIGhlYWRlciAqLwotCi10eXBlZGVmIHVpbnQ4X3QgdEFWRFRfREFUQV9PUFRfTUFTSzsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIHN5c3RlbSBsZXZlbCByZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBBVkRUUCBwcm90b2NvbC4gIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgQVZEVFAgYW5kCi0gKiAgICAgICAgICAgICAgICAgIHByZXBhcmVzIHRoZSBwcm90b2NvbCBzdGFjayBmb3IgaXRzIHVzZS4gIFRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbXVzdCBiZSBjYWxsZWQgb25jZSBieSB0aGUgc3lzdGVtIG9yIHBsYXRmb3JtIHVzaW5nIEFWRFRQCi0gKiAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgb3RoZXIgZnVuY3Rpb25zIG9mIHRoZSBBUEkgYW4gYmUgdXNlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEFWRFRfUmVnaXN0ZXIoQXZkdHBSY2IqIHBfcmVnLCB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVyZWdpc3RlciB1c2UgQVZEVFAgcHJvdG9jb2wuCi0gKiAgICAgICAgICAgICAgICAgIEl0IGlzIGNhbGxlZCB3aGVuIEFWRFRQIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGJ5IGFueQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpbiB0aGUgc3lzdGVtLiAgQmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxlZCwgYWxsIHN0cmVhbXMgbXVzdCBiZSByZW1vdmVkIHdpdGggQVZEVF9SZW1vdmVTdHJlYW0uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEFWRFRfRGVyZWdpc3Rlcih2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfQWJvcnRSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRyaWdnZXIgQWJvcnQgcmVxdWVzdCB0byBwYXNzIEFWRFRQIEFib3J0IHJlbGF0ZWQgbWFuZGF0b3J5Ci0gKiAgICAgICAgICAgICAgICAgIFBUUyBUZXN0IGNhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUX0Fib3J0UmVxKHVpbnQ4X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfQ3JlYXRlU3RyZWFtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGUgYSBzdHJlYW0gZW5kcG9pbnQuICBBZnRlciBhIHN0cmVhbSBlbmRwb2ludCBpcwotICogICAgICAgICAgICAgICAgICBjcmVhdGVkIGFuIGFwcGxpY2F0aW9uIGNhbiBpbml0aWF0ZSBhIGNvbm5lY3Rpb24gYmV0d2VlbgotICogICAgICAgICAgICAgICAgICB0aGlzIGVuZHBvaW50IGFuZCBhbiBlbmRwb2ludCBvbiBhIHBlZXIgZGV2aWNlLiAgSW4KLSAqICAgICAgICAgICAgICAgICAgYWRkaXRpb24sIGEgcGVlciBkZXZpY2UgY2FuIGRpc2NvdmVyLCBnZXQgdGhlIGNhcGFiaWxpdGllcywKLSAqICAgICAgICAgICAgICAgICAgYW5kIGNvbm5lY3QgdG8gdGhpcyBlbmRwb2ludC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZEVF9DcmVhdGVTdHJlYW0odWludDhfdCBwZWVyX2lkLCB1aW50OF90KiBwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmR0cFN0cmVhbUNvbmZpZyYgYXZkdHBfc3RyZWFtX2NvbmZpZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX1JlbW92ZVN0cmVhbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVtb3ZlIGEgc3RyZWFtIGVuZHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbgotICogICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gaXMgbm8gbG9uZ2VyIHVzaW5nIGEgc3RyZWFtIGVuZHBvaW50LgotICogICAgICAgICAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBlbmRwb2ludCBpcyBjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFuZCB0aGVuIHRoZSBzdHJlYW0gZW5kcG9pbnQKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVtb3ZlZC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZEVF9SZW1vdmVTdHJlYW0odWludDhfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9EaXNjb3ZlclJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBBVkRUUCBzZXJ2aWNlCi0gKiAgICAgICAgICAgICAgICAgIG9uIHRoZSBwZWVyIGRldmljZSwgaWYgbm90IGFscmVhZHkgcHJlc2VudCwgYW5kIGRpc2NvdmVycwotICogICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIGVuZHBvaW50cyBvbiB0aGUgcGVlciBkZXZpY2UuICAoUGxlYXNlIG5vdGUKLSAqICAgICAgICAgICAgICAgICAgdGhhdCBBVkRUUCBkaXNjb3ZlcnkgaXMgdW5yZWxhdGVkIHRvIFNEUCBkaXNjb3ZlcnkpLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgcmVnYXJkbGVzcyBvZgotICogICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZXJlIGlzIGFuIEFWRFRQIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXIgZGV2aWNlLgotICoKLSAqICAgICAgICAgICAgICAgICAgV2hlbiBkaXNjb3ZlcnkgaXMgY29tcGxldGUsIGFuIEFWRFRfRElTQ09WRVJfQ0ZNX0VWVAotICogICAgICAgICAgICAgICAgICBpcyBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgaXRzIGNhbGxiYWNrIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QgY2FsbCBBVkRUX0dldENhcFJlcSgpIG9yCi0gKiAgICAgICAgICAgICAgICAgIEFWRFRfRGlzY292ZXJSZXEoKSBhZ2FpbiB0byB0aGUgc2FtZSBkZXZpY2UgdW50aWwKLSAqICAgICAgICAgICAgICAgICAgZGlzY292ZXJ5IGlzIGNvbXBsZXRlLgotICoKLSAqICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBhZGRyZXNzZWQgYnkgc2VwX2luZm8gaXMgYWxsb2NhdGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi4gIFRoaXMgbWVtb3J5IGlzIHdyaXR0ZW4gdG8gYnkgQVZEVFAgYXMgcGFydAotICogICAgICAgICAgICAgICAgICBvZiB0aGUgZGlzY292ZXJ5IHByb2NlZHVyZS4gIFRoaXMgbWVtb3J5IG11c3QgcmVtYWluCi0gKiAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGUgdW50aWwgdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVzIHRoZQotICogICAgICAgICAgICAgICAgICBBVkRUX0RJU0NPVkVSX0NGTV9FVlQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZEVF9EaXNjb3ZlclJlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfU0VQX0lORk8qIHBfc2VwX2luZm8sIHVpbnQ4X3QgbWF4X3NlcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfR2V0Q2FwUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIEFWRFRQIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgb24gdGhlIHBlZXIgZGV2aWNlLCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBhbmQgZ2V0cyB0aGUKLSAqICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIG9mIGEgc3RyZWFtIGVuZHBvaW50IG9uIHRoZSBwZWVyIGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIHJlZ2FyZGxlc3Mgb2YKLSAqICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGVyZSBpcyBhbiBBVkRUUCBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIHByb2NlZHVyZSBpcyBjb21wbGV0ZSwgYW4gQVZEVF9HRVRDQVBfQ0ZNX0VWVCBpcwotICogICAgICAgICAgICAgICAgICBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgaXRzIGNhbGxiYWNrIGZ1bmN0aW9uLiAgVGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNhbGwgQVZEVF9HZXRDYXBSZXEoKSBvcgotICogICAgICAgICAgICAgICAgICBBVkRUX0Rpc2NvdmVyUmVxKCkgYWdhaW4gdW50aWwgdGhlIHByb2NlZHVyZSBpcyBjb21wbGV0ZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBwX2NmZyBpcyBhbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLiAgVGhpcyBtZW1vcnkgaXMgd3JpdHRlbiB0byBieSBBVkRUUCBhcyBwYXJ0Ci0gKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBnZXQgY2FwYWJpbGl0aWVzIHByb2NlZHVyZS4gIFRoaXMgbWVtb3J5IG11c3QKLSAqICAgICAgICAgICAgICAgICAgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVzCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBBVkRUX0dFVENBUF9DRk1fRVZULgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWRFRfR2V0Q2FwUmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgY2hhbm5lbF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlaWQsIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrLCBib29sIGdldF9hbGxfY2FwKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfRGVsYXlSZXBvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb25zIHNlbmRzIGEgRGVsYXkgUmVwb3J0IHRvIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgU0VJRC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgU05LIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkRUX0RlbGF5UmVwb3J0KHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IHNlaWQsIHVpbnQxNl90IGRlbGF5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfT3BlblJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBBVkRUUCBzZXJ2aWNlCi0gKiAgICAgICAgICAgICAgICAgIG9uIHRoZSBwZWVyIGRldmljZSwgaWYgbm90IGFscmVhZHkgcHJlc2VudCwgYW5kIGNvbm5lY3RzCi0gKiAgICAgICAgICAgICAgICAgIHRvIGEgc3RyZWFtIGVuZHBvaW50IG9uIGEgcGVlciBkZXZpY2UuICBXaGVuIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGlzIGNvbXBsZXRlZCwgYW4gQVZEVF9PUEVOX0NGTV9FVlQgaXMgc2VudCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdmlhIHRoZSBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkRUX09wZW5SZXEodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9pbmRleCwgdWludDhfdCBzZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jZmcpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9Db25maWdSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbmQgdG8gYSBjb25maWd1cmUgcmVxdWVzdCBmcm9tIHRoZSBwZWVyIGRldmljZS4gIFRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGFuCi0gKiAgICAgICAgICAgICAgICAgIEFWRFRfQ09ORklHX0lORF9FVlQgdGhyb3VnaCBpdHMgY29udHJvbCBjYWxsYmFjay4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZEVF9Db25maWdSc3AodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcnJvcl9jb2RlLCB1aW50OF90IGNhdGVnb3J5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfU3RhcnRSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IG9uZSBvciBtb3JlIHN0cmVhbSBlbmRwb2ludHMuICBUaGlzIGluaXRpYXRlcyB0aGUKLSAqICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgb2YgbWVkaWEgcGFja2V0cyBmb3IgdGhlIHN0cmVhbXMuICBBbGwgc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgIGVuZHBvaW50cyBtdXN0IHByZXZpb3VzbHkgYmUgb3BlbmVkLiAgV2hlbiB0aGUgc3RyZWFtcwotICogICAgICAgICAgICAgICAgICBhcmUgc3RhcnRlZCwgYW4gQVZEVF9TVEFSVF9DRk1fRVZUIGlzIHNlbnQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHZpYSB0aGUgY29udHJvbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaAotICogICAgICAgICAgICAgICAgICBzdHJlYW0uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWRFRfU3RhcnRSZXEodWludDhfdCogcF9oYW5kbGVzLCB1aW50OF90IG51bV9oYW5kbGVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfU3VzcGVuZFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3VzcGVuZCBvbmUgb3IgbW9yZSBzdHJlYW0gZW5kcG9pbnRzLiBUaGlzIHN1c3BlbmRzIHRoZQotICogICAgICAgICAgICAgICAgICB0cmFuc2ZlciBvZiBtZWRpYSBwYWNrZXRzIGZvciB0aGUgc3RyZWFtcy4gIEFsbCBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzIG11c3QgcHJldmlvdXNseSBiZSBvcGVuIGFuZCBzdGFydGVkLiAgV2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3RyZWFtcyBhcmUgc3VzcGVuZGVkLCBhbiBBVkRUX1NVU1BFTkRfQ0ZNX0VWVCBpcyBzZW50IHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIGNvbnRyb2wgY2FsbGJhY2sgZnVuY3Rpb24gZm9yCi0gKiAgICAgICAgICAgICAgICAgIGVhY2ggc3RyZWFtLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkRUX1N1c3BlbmRSZXEodWludDhfdCogcF9oYW5kbGVzLCB1aW50OF90IG51bV9oYW5kbGVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfQ2xvc2VSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIGEgc3RyZWFtIGVuZHBvaW50LiAgVGhpcyBzdG9wcyB0aGUgdHJhbnNmZXIgb2YgbWVkaWEKLSAqICAgICAgICAgICAgICAgICAgcGFja2V0cyBhbmQgY2xvc2VzIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgdGhpcyBzdHJlYW0gZW5kcG9pbnQuICBXaGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLCBhbgotICogICAgICAgICAgICAgICAgICBBVkRUX0NMT1NFX0NGTV9FVlQgaXMgc2VudCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZQotICogICAgICAgICAgICAgICAgICBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGlzIGhhbmRsZS4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZEVF9DbG9zZVJlcSh1aW50OF90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX1JlY29uZmlnUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWNvbmZpZ3VyZSBhIHN0cmVhbSBlbmRwb2ludC4gIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICB0byBjaGFuZ2UgdGhlIGNvZGVjIG9yIGNvbnRlbnQgcHJvdGVjdGlvbiBjYXBhYmlsaXRpZXMgb2YKLSAqICAgICAgICAgICAgICAgICAgYSBzdHJlYW0gZW5kcG9pbnQgYWZ0ZXIgaXQgaGFzIGJlZW4gb3BlbmVkLiAgVGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHN0cmVhbSBpcyBvcGVuZWQgYnV0IG5vdCBzdGFydGVkCi0gKiAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3VzcGVuZGVkLiAgV2hlbiB0aGUgcHJvY2VkdXJlCi0gKiAgICAgICAgICAgICAgICAgIGlzIGNvbXBsZXRlZCwgYW4gQVZEVF9SRUNPTkZJR19DRk1fRVZUIGlzIHNlbnQgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHZpYSB0aGUgY29udHJvbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICBoYW5kbGUuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWRFRfUmVjb25maWdSZXEodWludDhfdCBoYW5kbGUsIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUX1NlY3VyaXR5UmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgc2VjdXJpdHkgcmVxdWVzdCB0byB0aGUgcGVlciBkZXZpY2UuICBXaGVuIHRoZQotICogICAgICAgICAgICAgICAgICBzZWN1cml0eSBwcm9jZWR1cmUgaXMgY29tcGxldGVkLCBhbiBBVkRUX1NFQ1VSSVRZX0NGTV9FVlQKLSAqICAgICAgICAgICAgICAgICAgaXMgc2VudCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGhhbmRsZS4gIChQbGVhc2Ugbm90ZSB0aGF0IEFWRFRQIHNlY3VyaXR5Ci0gKiAgICAgICAgICAgICAgICAgIHByb2NlZHVyZXMgYXJlIHVucmVsYXRlZCB0byBCbHVldG9vdGggbGluayBsZXZlbCBzZWN1cml0eS4pCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWRFRfU2VjdXJpdHlSZXEodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfU2VjdXJpdHlSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbmQgdG8gYSBzZWN1cml0eSByZXF1ZXN0IGZyb20gdGhlIHBlZXIgZGV2aWNlLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGlmIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcwotICogICAgICAgICAgICAgICAgICBhbiBBVkRUX1NFQ1VSSVRZX0lORF9FVlQgdGhyb3VnaCBpdHMgY29udHJvbCBjYWxsYmFjay4KLSAqICAgICAgICAgICAgICAgICAgKFBsZWFzZSBub3RlIHRoYXQgQVZEVFAgc2VjdXJpdHkgcHJvY2VkdXJlcyBhcmUgdW5yZWxhdGVkCi0gKiAgICAgICAgICAgICAgICAgIHRvIEJsdWV0b290aCBsaW5rIGxldmVsIHNlY3VyaXR5LikKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVkRUX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZEVF9TZWN1cml0eVJzcCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXJyb3JfY29kZSwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfV3JpdGVSZXFPcHQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBtZWRpYSBwYWNrZXQgdG8gdGhlIHBlZXIgZGV2aWNlLiAgVGhlIHN0cmVhbSBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGJlIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgQWxzbywgdGhpcwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHN0cmVhbSBpcyBhIFNSQwotICoKLSAqICAgICAgICAgICAgICAgICAgV2hlbiBBVkRUUCBoYXMgc2VudCB0aGUgbWVkaWEgcGFja2V0IGFuZCBpcyByZWFkeSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIG5leHQgcGFja2V0LCBhbiBBVkRUX1dSSVRFX0NGTV9FVlQgaXMgc2VudCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdmlhIHRoZSBjb250cm9sIGNhbGxiYWNrLiAgVGhlIGFwcGxpY2F0aW9uIG11c3QKLSAqICAgICAgICAgICAgICAgICAgd2FpdCBmb3IgdGhlIEFWRFRfV1JJVEVfQ0ZNX0VWVCBiZWZvcmUgaXQgbWFrZXMgdGhlIG5leHQKLSAqICAgICAgICAgICAgICAgICAgY2FsbCB0byBBVkRUX1dyaXRlUmVxKCkuICBJZiB0aGUgYXBwbGljYXRpb25zIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgIEFWRFRfV3JpdGVSZXEoKSBiZWZvcmUgaXQgcmVjZWl2ZXMgdGhlIGV2ZW50IHRoZSBwYWNrZXQKLSAqICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgc2VudC4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgbWFrZSBpdHMgZmlyc3QgY2FsbAotICogICAgICAgICAgICAgICAgICB0byBBVkRUX1dyaXRlUmVxKCkgYWZ0ZXIgaXQgcmVjZWl2ZXMgYW4gQVZEVF9TVEFSVF9DRk1fRVZUCi0gKiAgICAgICAgICAgICAgICAgIG9yIEFWRFRfU1RBUlRfSU5EX0VWVC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBwYXNzZXMgdGhlIHBhY2tldCB1c2luZyB0aGUgQlRfSERSIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAyLjEuICBUaGUgb2Zmc2V0Ci0gKiAgICAgICAgICAgICAgICAgIGZpZWxkIG11c3QgYmUgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIEFWRFRfTUVESUFfT0ZGU0VUCi0gKiAgICAgICAgICAgICAgICAgIChpZiBOT19SVFAgaXMgc3BlY2lmaWVkLCBMMkNBUF9NSU5fT0ZGU0VUIGNhbiBiZSB1c2VkKQotICogICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgdGhlIEwyQ0FQIGFuZAotICogICAgICAgICAgICAgICAgICBBVkRUUCBoZWFkZXJzLgotICoKLSAqICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHBfcGt0IG11c3QgYmUgYSBHS0kgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGlzIGJ1ZmZlciB3aWxsIGJlIGZyZWVkCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHRoZSBwcm90b2NvbCBzdGFjazsgdGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGZyZWUKLSAqICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGUgb3B0IHBhcmFtZXRlciBhbGxvd3MgcGFzc2luZyBzcGVjaWZpYyBvcHRpb25zIGxpa2U6Ci0gKiAgICAgICAgICAgICAgICAgIC0gTk9fUlRQIDogZG8gbm90IGFkZCB0aGUgUlRQIGhlYWRlciB0byBidWZmZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWRFRfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZXJyb3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkRUX1dyaXRlUmVxT3B0KHVpbnQ4X3QgaGFuZGxlLCBCVF9IRFIqIHBfcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGltZV9zdGFtcCwgdWludDhfdCBtX3B0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfREFUQV9PUFRfTUFTSyBvcHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9Db25uZWN0UmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhbiBBVkRUUCBzaWduYWxpbmcgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlciBkZXZpY2UuICBXaGVuIHRoZSBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZCwgYW4KLSAqICAgICAgICAgICAgICAgICAgQVZEVF9DT05ORUNUX0lORF9FVlQgaXMgc2VudCB0byB0aGUgYXBwbGljYXRpb24gdmlhIGl0cwotICogICAgICAgICAgICAgICAgICBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlscwotICogICAgICAgICAgICAgICAgICBhbiBBVkRUX0RJU0NPTk5FQ1RfSU5EX0VWVCBpcyBzZW50LiAgVGhlIHNlY3VyaXR5IG1hc2sKLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG92ZXJyaWRlcyB0aGUgb3V0Z29pbmcgc2VjdXJpdHkgbWFzayBzZXQgaW4KLSAqICAgICAgICAgICAgICAgICAgQVZEVF9SZWdpc3RlcigpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWRFRfQ29ubmVjdFJlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVF9EaXNjb25uZWN0UmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGRpc2Nvbm5lY3QgYW4gQVZEVFAgc2lnbmFsaW5nIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHBlZXIgZGV2aWNlLiAgV2hlbiBkaXNjb25uZWN0ZWQgYW4KLSAqICAgICAgICAgICAgICAgICAgQVZEVF9ESVNDT05ORUNUX0lORF9FVlQgaXMgc2VudCB0byB0aGUgYXBwbGljYXRpb24gdmlhIGl0cwotICogICAgICAgICAgICAgICAgICBjb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZEVF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBlcnJvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWRFRfRGlzY29ubmVjdFJlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfR2V0TDJDYXBDaGFubmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIEwyQ0FQIENJRCB1c2VkIGJ5IHRoZSBoYW5kbGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBDSUQgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIDAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVkRUX0dldEwyQ2FwQ2hhbm5lbCh1aW50OF90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRfU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEFWRFQuIElmIDB4ZmYgaXMgcGFzc2VkLCB0aGUKLSAqICAgICAgICAgICAgICAgICAgY3VycmVudCB0cmFjZSBsZXZlbCBpcyByZXR1cm5lZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBuZXdfbGV2ZWw6ICBUaGUgbGV2ZWwgdG8gc2V0IHRoZSBBVkRUIHRyYWNpbmcgdG86Ci0gKiAgICAgICAgICAgICAgICAgICAgICAweGZmLXJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZy4KLSAqICAgICAgICAgICAgICAgICAgICAgIDAtdHVybnMgb2ZmIHRyYWNpbmcuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAxLUVycm9ycy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDItV2FybmluZ3MuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAzLUFQSXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSA0LUV2ZW50cy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDUtRGVidWcuCi0gKgotICogUmV0dXJucyAgICAgICAgICBUaGUgbmV3IHRyYWNlIGxldmVsIG9yIGN1cnJlbnQgdHJhY2UgbGV2ZWwgaWYKLSAqICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IHBhcmFtZXRlciBpcyAweGZmLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50OF90IEFWRFRfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci0KLS8qKgotICogRHVtcCBkZWJ1Zy1yZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgU3RhY2sgQVZEVFAgbW9kdWxlLgotICoKLSAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHVzZSBmb3Igd3JpdGluZyB0aGUgQVNDSUkgZm9ybWF0dGVkCi0gKiBpbmZvcm1hdGlvbgotICovCi12b2lkIHN0YWNrX2RlYnVnX2F2ZHRwX2FwaV9kdW1wKGludCBmZCk7Ci0KLSNlbmRpZiAvKiBBVkRUX0FQSV9IICovCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2F2ZHRjX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9hdmR0Y19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMzM3MS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2F2ZHRjX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpbnRlcmZhY2UgZmlsZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIEFWRFRQIGNvbmZvcm1hbmNlIEFQSS4gIFRoZXNlCi0gKiAgYWRkaXRpb25hbCBBUEkgZnVuY3Rpb25zIGFuZCBjYWxsYmFjayBldmVudHMgYXJlIHByb3ZpZGVkIGZvcgotICogIGNvbmZvcm1hbmNlIHRlc3RpbmcgcHVycG9zZXMgb25seS4gIFRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5Ci0gKiAgYW4gYXBwbGljYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVZEVF9DQVBJX0gKLSNkZWZpbmUgQVZEVF9DQVBJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIHN0YXJ0IEFWRFRDIGV2ZW50cyBoZXJlIHRvIGRpc3Rpbmd1aXNoIGZyb20gQVZEVCBldmVudHMgKi8KLSNkZWZpbmUgQVZEVENfRVZUX0JFR0lOIDB4ODAKLQotLyogRGlzY292ZXIgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBBVkRUQ19ESVNDT1ZFUl9JTkRfRVZUICgwICsgQVZEVENfRVZUX0JFR0lOKQotLyogR2V0IGNhcGFiaWxpdGllcyBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWRFRDX0dFVENBUF9JTkRfRVZUICgxICsgQVZEVENfRVZUX0JFR0lOKQotLyogU2V0IGNvbmZpZ3VyYXRpb24gY29uZmlybSAqLwotI2RlZmluZSBBVkRUQ19TRVRDT05GSUdfQ0ZNX0VWVCAoMiArIEFWRFRDX0VWVF9CRUdJTikKLS8qIEdldCBjb25maWd1cmF0aW9uIGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZEVENfR0VUQ09ORklHX0lORF9FVlQgKDMgKyBBVkRUQ19FVlRfQkVHSU4pCi0vKiBHZXQgY29uZmlndXJhdGlvbiBjb25maXJtICovCi0jZGVmaW5lIEFWRFRDX0dFVENPTkZJR19DRk1fRVZUICg0ICsgQVZEVENfRVZUX0JFR0lOKQotLyogT3BlbiBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWRFRDX09QRU5fSU5EX0VWVCAoNSArIEFWRFRDX0VWVF9CRUdJTikKLS8qIFN0YXJ0IGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZEVENfU1RBUlRfSU5EX0VWVCAoNiArIEFWRFRDX0VWVF9CRUdJTikKLS8qIENsb3NlIGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVZEVENfQ0xPU0VfSU5EX0VWVCAoNyArIEFWRFRDX0VWVF9CRUdJTikKLS8qIFN1c3BlbmQgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBBVkRUQ19TVVNQRU5EX0lORF9FVlQgKDggKyBBVkRUQ19FVlRfQkVHSU4pCi0vKiBBYm9ydCBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEFWRFRDX0FCT1JUX0lORF9FVlQgKDkgKyBBVkRUQ19FVlRfQkVHSU4pCi0vKiBBYm9ydCBjb25maXJtICovCi0jZGVmaW5lIEFWRFRDX0FCT1JUX0NGTV9FVlQgKDEwICsgQVZEVENfRVZUX0JFR0lOKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVkRUX0VWVF9IRFIgaGRyOyAgICAgICAgICAgICAgICAvKiBFdmVudCBoZWFkZXIgKi8KLSAgdWludDhfdCBzZWlkX2xpc3RbQVZEVF9OVU1fU0VQU107IC8qIEFycmF5IG9mIFNFSUQgdmFsdWVzICovCi0gIHVpbnQ4X3QgbnVtX3NlcHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdmFsdWVzIGluIGFycmF5ICovCi19IHRBVkRUX01VTFRJOwotCi0vKiBVbmlvbiBvZiBhbGwgY29udHJvbCBjYWxsYmFjayBldmVudCBkYXRhIHN0cnVjdHVyZXMgKi8KLXR5cGVkZWYgdW5pb24gewotICB0QVZEVF9FVlRfSERSIGhkcjsKLSAgdEFWRFRfQ09ORklHIGdldGNvbmZpZ19jZm07Ci0gIHRBVkRUX01VTFRJIHN0YXJ0X2luZDsKLSAgdEFWRFRfTVVMVEkgc3VzcGVuZF9pbmQ7Ci19IHRBVkRUQ19DVFJMOwotCi10eXBlZGVmIHZvaWQgdEFWRFRDX0NUUkxfQ0JBQ0sodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBldmVudCwgdEFWRFRDX0NUUkwqIHBfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19Jbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBiZWdpbiB1c2luZyB0aGUgY29uZm9ybWFuY2UgQVBJLgotICogICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBBVkRUX1JlZ2lzdGVyKCkgYW5kIGJlZm9yZSBhbnkKLSAqICAgICAgICAgICAgICAgICAgb3RoZXIgQVBJIG9yIGNvbmZvcm1hbmNlIEFQSSBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQVZEVENfSW5pdCh0QVZEVENfQ1RSTF9DQkFDSyogcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19EaXNjb3ZlclJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIGRpc2NvdmVyIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19EaXNjb3ZlclJzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfU0VQX0lORk8gc2VwX2luZm9bXSwgdWludDhfdCBudW1fc2Vwcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19HZXRDYXBSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgU2VuZCBhIGdldCBjYXBhYmlsaXRpZXMgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEFWRFRDX0dldENhcFJzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZHRwU2VwQ29uZmlnKiBwX2NhcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19HZXRBbGxDYXBSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgU2VuZCBhIGdldCBhbGwgY2FwYWJpbGl0aWVzIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19HZXRBbGxDYXBSc3AoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jYXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVENfR2V0Q29uZmlnUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgZ2V0IGNvbmZpZ3VyYXRpb24gcmVxdWVzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQVZEVENfR2V0Q29uZmlnUmVxKHVpbnQ4X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRDX0dldENvbmZpZ1JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIGdldCBjb25maWd1cmF0aW9uIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19HZXRDb25maWdSc3AodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkdHBTZXBDb25maWcqIHBfY2ZnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRDX09wZW5SZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gb3BlbiByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19PcGVuUmVxKHVpbnQ4X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRDX09wZW5Sc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gb3BlbiByZXNwb25zZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQVZEVENfT3BlblJzcCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19TdGFydFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHN0YXJ0IHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19TdGFydFJzcCh1aW50OF90KiBwX2hhbmRsZXMsIHVpbnQ4X3QgbnVtX2hhbmRsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxhYmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRDX0Nsb3NlUnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgY2xvc2UgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEFWRFRDX0Nsb3NlUnNwKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWRFRDX1N1c3BlbmRSc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBzdXNwZW5kIHJlc3BvbnNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19TdXNwZW5kUnNwKHVpbnQ4X3QqIHBfaGFuZGxlcywgdWludDhfdCBudW1faGFuZGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYWJlbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19BYm9ydFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBhYm9ydCByZXF1ZXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVkRUQ19BYm9ydFJlcSh1aW50OF90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVkRUQ19BYm9ydFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBhYm9ydCByZXNwb25zZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQVZEVENfQWJvcnRSc3AodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZEVENfUmVqCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgcmVqZWN0IG1lc3NhZ2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEFWRFRDX1Jlaih1aW50OF90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsYWJlbCwgdWludDhfdCBlcnJfY29kZSwgdWludDhfdCBlcnJfcGFyYW0pOwotCi0jZW5kaWYgLyogQVZEVF9DQVBJX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYXZyY19hcGkuaCBiL3N0YWNrL2luY2x1ZGUvYXZyY19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0ZjQ2My4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2F2cmNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBudGVyZmFjZSB0byBBVlJDUCBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBBVlJDX0FQSV9ICi0jZGVmaW5lIEFWUkNfQVBJX0gKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2Y3RfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdnJjX2RlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIGNvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFQSSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgcmVzdWx0IGNvZGVzLiAqLwotLyogMCBGdW5jdGlvbiBzdWNjZXNzZnVsICovCi0jZGVmaW5lIEFWUkNfU1VDQ0VTUyBBVkNUX1NVQ0NFU1MKLS8qIDEgTm90IGVub3VnaCByZXNvdXJjZXMgKi8KLSNkZWZpbmUgQVZSQ19OT19SRVNPVVJDRVMgQVZDVF9OT19SRVNPVVJDRVMKLS8qIDIgQmFkIGhhbmRsZSAqLwotI2RlZmluZSBBVlJDX0JBRF9IQU5ETEUgQVZDVF9CQURfSEFORExFCi0vKiAzIFBJRCBhbHJlYWR5IGluIHVzZSAqLwotI2RlZmluZSBBVlJDX1BJRF9JTl9VU0UgQVZDVF9QSURfSU5fVVNFCi0vKiA0IENvbm5lY3Rpb24gbm90IG9wZW4gKi8KLSNkZWZpbmUgQVZSQ19OT1RfT1BFTiBBVkNUX05PVF9PUEVOCi0vKiA1IHRoZSBtZXNzYWdlIGxlbmd0aCBleGNlZWQgdGhlIE1UVSBvZiB0aGUgYnJvd3NpbmcgY2hhbm5lbCAqLwotI2RlZmluZSBBVlJDX01TR19UT09fQklHIDUKLS8qIDB4MTAgZ2VuZXJpYyBmYWlsdXJlICovCi0jZGVmaW5lIEFWUkNfRkFJTCAweDEwCi0vKiAweDExIGJhZCBwYXJhbWV0ZXIgICAqLwotI2RlZmluZSBBVlJDX0JBRF9QQVJBTSAweDExCi0KLS8qIENvbnRyb2wgcm9sZSAtIHNhbWUgYXMgQVZDVF9UQVJHRVQvQVZDVF9DT05UUk9MICovCi0vKiB0YXJnZXQgICovCi0jZGVmaW5lIEFWUkNfQ1RfVEFSR0VUIDEKLS8qIGNvbnRyb2xsZXIgICovCi0jZGVmaW5lIEFWUkNfQ1RfQ09OVFJPTCAyCi0vKiBJZiBjb25mbGljdCwgYWxsb3cgdGhlIG90aGVyIHNpZGUgdG8gc3VjY2VlZCAgKi8KLSNkZWZpbmUgQVZSQ19DVF9QQVNTSVZFIDQKLQotLyogQ29ubmVjdGlvbiByb2xlICovCi0vKiBpbml0aWF0b3IgKi8KLSNkZWZpbmUgQVZSQ19DT05OX0lOVCBBVkNUX0lOVAotLyogQWNjZXB0b3IgICovCi0jZGVmaW5lIEFWUkNfQ09OTl9BQ1AgQVZDVF9BQ1AKLQotLyogQVZSQyBDVFJMIGV2ZW50cyAqLwotLyogQVZSQ19PUEVOX0lORF9FVlQgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBvcGVuZWQuCi0gKiBUaGlzIGV2ZW50aXMgc2VudCBpbiByZXNwb25zZSB0byBhbiBBVlJDX09wZW4oKS4gKi8KLSNkZWZpbmUgQVZSQ19PUEVOX0lORF9FVlQgMAotCi0vKiBBVlJDX0NMT1NFX0lORF9FVlQgZXZlbnQgaXMgc2VudCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQuCi0gKiBUaGlzIGV2ZW50IGNhbiByZXN1bHQgZnJvbSBhIGNhbGwgdG8gQVZSQ19DbG9zZSgpIG9yIHdoZW4gdGhlIHBlZXIgY2xvc2VzCi0gKiB0aGUgY29ubmVjdGlvbi4gIEl0IGlzIGFsc28gc2VudCB3aGVuIGEgY29ubmVjdGlvbiBhdHRlbXB0ZWQgdGhyb3VnaAotICogQVZSQ19PcGVuKCkgZmFpbHMuICovCi0jZGVmaW5lIEFWUkNfQ0xPU0VfSU5EX0VWVCAxCi0KLS8qIEFWUkNfQ09OR19JTkRfRVZUIGV2ZW50IGluZGljYXRlcyB0aGF0IEFWQ1RQIGlzIGNvbmdlc3RlZCBhbmQgY2Fubm90IHNlbmQKLSAqIGFueSBtb3JlIG1lc3NhZ2VzLiAqLwotI2RlZmluZSBBVlJDX0NPTkdfSU5EX0VWVCAyCi0KLS8qIEFWUkNfVU5DT05HX0lORF9FVlQgZXZlbnQgaW5kaWNhdGVzIHRoYXQgQVZDVFAgaXMgdW5jb25nZXN0ZWQgYW5kIHJlYWR5IHRvCi0gKiBzZW5kIG1lc3NhZ2VzLiAqLwotI2RlZmluZSBBVlJDX1VOQ09OR19JTkRfRVZUIDMKLQotLyogQVZSQ19CUk9XU0VfT1BFTl9JTkRfRVZUIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgYnJvd3NlIGNoYW5uZWwgaXMKLSogc3VjY2Vzc2Z1bGx5IG9wZW5lZC4KLSogVGhpcyBldmVudGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW4gQVZSQ19PcGVuKCkgb3IgQVZSQ19PcGVuQnJvd3NlKCkgLiAqLwotI2RlZmluZSBBVlJDX0JST1dTRV9PUEVOX0lORF9FVlQgNAotCi0vKiBBVlJDX0JST1dTRV9DTE9TRV9JTkRfRVZUIGV2ZW50IGlzIHNlbnQgd2hlbiBhIGJyb3dzZSBjaGFubmVsIGlzIGNsb3NlZC4KLSAqIFRoaXMgZXZlbnQgY2FuIHJlc3VsdCBmcm9tIGEgY2FsbCB0byBBVlJDX0Nsb3NlKCksIEFWUkNfQ2xvc2VCcm93c2UoKSBvcgotICogd2hlbiB0aGUgcGVlciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uICBJdCBpcyBhbHNvIHNlbnQgd2hlbiBhIGNvbm5lY3Rpb24KLSAqIGF0dGVtcHRlZCB0aHJvdWdoIEFWUkNfT3BlbkJyb3dzZSgpIGZhaWxzLiAqLwotI2RlZmluZSBBVlJDX0JST1dTRV9DTE9TRV9JTkRfRVZUIDUKLQotLyogQVZSQ19CUk9XU0VfQ09OR19JTkRfRVZUIGV2ZW50IGluZGljYXRlcyB0aGF0IEFWQ1RQIGJyb3dzZSBjaGFubmVsIGlzCi0gKiBjb25nZXN0ZWQgYW5kIGNhbm5vdCBzZW5kIGFueSBtb3JlIG1lc3NhZ2VzLiAqLwotI2RlZmluZSBBVlJDX0JST1dTRV9DT05HX0lORF9FVlQgNgotCi0vKiBBVlJDX0JST1dTRV9VTkNPTkdfSU5EX0VWVCBldmVudCBpbmRpY2F0ZXMgdGhhdCBBVkNUUCBicm93c2UgY2hhbm5lbCBpcwotICogdW5jb25nZXN0ZWQgYW5kIHJlYWR5IHRvIHNlbmQgbWVzc2FnZXMuICovCi0jZGVmaW5lIEFWUkNfQlJPV1NFX1VOQ09OR19JTkRfRVZUIDcKLQotLyogQVZSQ19DTURfVElNRU9VVF9FVlQgZXZlbnQgaW5kaWNhdGVzIHRpbWVvdXQgd2FpdGluZyBmb3IgQVZSQyBjb21tYW5kCi0gKiByZXNwb25zZSBmcm9tIHRoZSBwZWVyICovCi0jZGVmaW5lIEFWUkNfQ01EX1RJTUVPVVRfRVZUIDgKLQotLyogQ29uZmlndXJhYmxlIGF2cmNwIHZlcnNpb24ga2V5IGFuZCBjb25zdGFudCB2YWx1ZXMgKi8KLSNpZm5kZWYgQVZSQ19WRVJTSU9OX1BST1BFUlRZCi0jZGVmaW5lIEFWUkNfVkVSU0lPTl9QUk9QRVJUWSAicGVyc2lzdC5ibHVldG9vdGguYXZyY3B2ZXJzaW9uIgotI2VuZGlmCi0KLSNpZm5kZWYgQVZSQ18xXzZfU1RSSU5HCi0jZGVmaW5lIEFWUkNfMV82X1NUUklORyAiYXZyY3AxNiIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNfMV81X1NUUklORwotI2RlZmluZSBBVlJDXzFfNV9TVFJJTkcgImF2cmNwMTUiCi0jZW5kaWYKLQotI2lmbmRlZiBBVlJDXzFfNF9TVFJJTkcKLSNkZWZpbmUgQVZSQ18xXzRfU1RSSU5HICJhdnJjcDE0IgotI2VuZGlmCi0KLSNpZm5kZWYgQVZSQ18xXzNfU1RSSU5HCi0jZGVmaW5lIEFWUkNfMV8zX1NUUklORyAiYXZyY3AxMyIKLSNlbmRpZgotCi0jaWZuZGVmIEFWUkNfREVGQVVMVF9WRVJTSU9OCi0jZGVmaW5lIEFWUkNfREVGQVVMVF9WRVJTSU9OIEFWUkNfMV81X1NUUklORwotI2VuZGlmCi0KLS8qIFN1cHBvcnRlZCBjYXRlZ29yaWVzICovCi0jZGVmaW5lIEFWUkNfU1VQRl9DVF9DQVQxIDB4MDAwMSAgICAgICAgIC8qIENhdGVnb3J5IDEgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX0NUX0NBVDIgMHgwMDAyICAgICAgICAgLyogQ2F0ZWdvcnkgMiAqLwotI2RlZmluZSBBVlJDX1NVUEZfQ1RfQ0FUMyAweDAwMDQgICAgICAgICAvKiBDYXRlZ29yeSAzICovCi0jZGVmaW5lIEFWUkNfU1VQRl9DVF9DQVQ0IDB4MDAwOCAgICAgICAgIC8qIENhdGVnb3J5IDQgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX0NUX0FQUF9TRVRUSU5HUyAweDAwMTAgLyogUGxheWVyIEFwcGxpY2F0aW9uIFNldHRpbmdzICovCi0jZGVmaW5lIEFWUkNfU1VQRl9DVF9HUk9VUF9OQVZJIDB4MDAyMCAgIC8qIEdyb3VwIE5hdmlnYXRpb24gKi8KLSNkZWZpbmUgQVZSQ19TVVBGX0NUX0JST1dTRSAweDAwNDAgICAgICAgLyogQnJvd3NpbmcgKi8KLQotLyogQ292ZXIgQXJ0LCBnZXQgaW1hZ2UgcHJvcGVydHkgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX0NUX0NPVkVSX0FSVF9HRVRfSU1BR0VfUFJPUCAweDAwODAKLS8qIENvdmVyIEFydCwgZ2V0IGltYWdlICovCi0jZGVmaW5lIEFWUkNfU1VQRl9DVF9DT1ZFUl9BUlRfR0VUX0lNQUdFIDB4MDEwMAotLyogQ292ZXIgQXJ0LCBnZXQgTGlua2VkIFRodW1ibmFpbCAqLwotI2RlZmluZSBBVlJDX1NVUEZfQ1RfQ09WRVJfQVJUX0dFVF9USFVNQk5BSUwgMHgwMjAwCi0KLSNkZWZpbmUgQVZSQ19TVVBGX1RHX0NBVDEgMHgwMDAxICAgICAgICAgICAgIC8qIENhdGVnb3J5IDEgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX1RHX0NBVDIgMHgwMDAyICAgICAgICAgICAgIC8qIENhdGVnb3J5IDIgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX1RHX0NBVDMgMHgwMDA0ICAgICAgICAgICAgIC8qIENhdGVnb3J5IDMgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX1RHX0NBVDQgMHgwMDA4ICAgICAgICAgICAgIC8qIENhdGVnb3J5IDQgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX1RHX0FQUF9TRVRUSU5HUyAweDAwMTAgICAgIC8qIFBsYXllciBBcHBsaWNhdGlvbiBTZXR0aW5ncyAqLwotI2RlZmluZSBBVlJDX1NVUEZfVEdfR1JPVVBfTkFWSSAweDAwMjAgICAgICAgLyogR3JvdXAgTmF2aWdhdGlvbiAqLwotI2RlZmluZSBBVlJDX1NVUEZfVEdfQlJPV1NFIDB4MDA0MCAgICAgICAgICAgLyogQnJvd3NpbmcgKi8KLSNkZWZpbmUgQVZSQ19TVVBGX1RHX01VTFRJX1BMQVlFUiAweDAwODAgICAgIC8qIE11bGlwbGUgTWVkaWEgUGxheWVyICovCi0jZGVmaW5lIEFWUkNfU1VQRl9UR19QTEFZRVJfQ09WRVJfQVJUIDB4MDEwMCAvKiBDb3ZlciBBcnQgKi8KLQotI2RlZmluZSBBVlJDX01FVEFfU1VDQ0VTUyBBVlJDX1NVQ0NFU1MKLSNkZWZpbmUgQVZSQ19NRVRBX0ZBSUwgQVZSQ19GQUlMCi0jZGVmaW5lIEFWUkNfTUVUQURBVEFfQ01EIDB4MDAwMAotI2RlZmluZSBBVlJDX01FVEFEQVRBX1JFU1AgMHgwMDAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIGRhdGEgdHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgZGF0YSB0eXBlIGlzIHVzZWQgaW4gQVZSQ19GaW5kU2VydmljZSgpIHRvIGluaXRpYWxpemUgdGhlIFNEUCBkYXRhYmFzZQotICogdG8gaG9sZCB0aGUgcmVzdWx0IHNlcnZpY2Ugc2VhcmNoLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBkYl9sZW47ICAgICAgICAgLyogTGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYjsgLyogUG9pbnRlciB0byB0aGUgZGlzY292ZXJ5IGRhdGFiYXNlICovCi0gIHVpbnQxNl90IG51bV9hdHRyOyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gcF9hdHRycyAqLwotICB1aW50MTZfdCogcF9hdHRyczsgICAgICAgLyogVGhlIGF0dHJpYnV0ZXMgZmlsdGVyLiBJZiBOVUxMLCBBVlJDUCBBUEkgc2V0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF0dHJpYnV0ZSBmaWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGJlIEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTLCBBVFRSX0lEX1NFUlZJQ0VfTkFNRSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFUVFJfSURfUFJPVklERVJfTkFNRS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG5vdCBOVUxMLCB0aGUgaW5wdXQgaXMgdGFrZW4gYXMgdGhlIGZpbHRlci4gKi8KLX0gdEFWUkNfU0RQX0RCX1BBUkFNUzsKLQotLyogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIHNlcnZpY2UgZGlzY292ZXJ5IGluZm9ybWF0aW9uIHRvIHRoZQotICogYXBwbGljYXRpb24gYWZ0ZXIgdGhlIEFWUkNfRmluZFNlcnZpY2UoKSBBUEkgZnVuY3Rpb24gaXMgY2FsbGVkLiAgVGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIG11c3QgY29weSB0aGUgcF9zZXJ2aWNlX25hbWUKLSAqIGFuZCBwX3Byb3ZpZGVyX25hbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gaXQgYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQKLSAqIHRvIHJlbWFpbiBhZnRlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZXhpdHMuICovCi11c2luZyB0QVZSQ19GSU5EX0NCQUNLID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50MTZfdCBzdGF0dXMpPjsKLQotLyogVGhpcyBpcyB0aGUgY29udHJvbCBjYWxsYmFjayBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gcGFzc2VzIGV2ZW50cwotICogbGlzdGVkIGluIFRhYmxlIDIwIHRvIHRoZSBhcHBsaWNhdGlvbi4gKi8KLXVzaW5nIHRBVlJDX0NUUkxfQ0JBQ0sgPQotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgZXZlbnQsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHBlZXJfYWRkcik+OwotCi0vKiBUaGlzIGlzIHRoZSBtZXNzYWdlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSXQgaXMgZXhlY3V0ZWQgd2hlbiBBVkNUUCBoYXMKLSAqIGEgbWVzc2FnZSBwYWNrZXQgcmVhZHkgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gKiBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGNvcHkgdGhlIHRBVlJDX01TRyBzdHJ1Y3R1cmUgcGFzc2VkIHRvIGl0IGFzIGl0Ci0gKiBpcyBub3QgZ3VhcmFudGVlZCB0byByZW1haW4gYWZ0ZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGV4aXRzLiAqLwotdXNpbmcgdEFWUkNfTVNHX0NCQUNLID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvcGNvZGUsIHRBVlJDX01TRyogcF9tc2cpPjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZSQ19DVFJMX0NCQUNLIGN0cmxfY2JhY2s7ICAgIC8qIGFwcGxpY2F0aW9uIGNvbnRyb2wgY2FsbGJhY2sgKi8KLSAgdEFWUkNfTVNHX0NCQUNLIG1zZ19jYmFjazsgICAgICAvKiBhcHBsaWNhdGlvbiBtZXNzYWdlIGNhbGxiYWNrICovCi0gIHVpbnQzMl90IGNvbXBhbnlfaWQ7ICAgICAgICAgICAgLyogdGhlIGNvbXBhbnkgSUQgICovCi0gIHVpbnQ4X3QgY29ubjsgICAgICAgICAgICAgICAgICAgLyogQ29ubmVjdGlvbiByb2xlIChJbml0aWF0b3IvYWNjZXB0b3IpICovCi0gIHVpbnQ4X3QgY29udHJvbDsgICAgICAgICAgICAgICAgLyogQ29udHJvbCByb2xlIChDb250cm9sL1RhcmdldCkgKi8KLX0gdEFWUkNfQ09OTl9DQjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGhhbmRsZTsKLSAgdWludDhfdCBsYWJlbDsKLSAgdWludDhfdCBtc2dfbWFzazsKLX0gdEFWUkNfUEFSQU07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFSVkNfR2V0UHJvZmlsZVZlcnNpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgdXNlciBhc3NpZ25lZCBBVlJDUCBwcm9maWxlIHZlcnNpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBBVlJDUCBwcm9maWxlIHZlcnNpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZSQ19HZXRQcm9maWxlVmVyc2lvbigpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0FkZFJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYnVpbGQgYW4gQVZSQ1AgU0RQIHJlY29yZC4KLSAqICAgICAgICAgICAgICAgICAgUHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgIGNhbGwgU0RQX0NyZWF0ZVJlY29yZCgpIHRvIGNyZWF0ZSBhbiBTRFAgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdXVpZDogIEluZGljYXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURyhVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENUKFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9uYW1lOiAgUG9pbnRlciB0byBhIG51bGwtdGVybWluYXRlZCBjaGFyYWN0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXJ2aWNlIG5hbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiBzZXJ2aWNlIG5hbWUgaXMgbm90IHVzZWQgc2V0IHRoaXMgdG8gTlVMTC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX3Byb3ZpZGVyX25hbWU6ICBQb2ludGVyIHRvIGEgbnVsbC10ZXJtaW5hdGVkIGNoYXJhY3RlcgotICogICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVyIG5hbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiBwcm92aWRlciBuYW1lIGlzIG5vdCB1c2VkIHNldCB0aGlzIHRvIE5VTEwuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczogIFN1cHBvcnRlZCBjYXRlZ29yaWVzLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHNkcF9oYW5kbGU6ICBTRFAgaGFuZGxlIHJldHVybmVkIGJ5IFNEUF9DcmVhdGVSZWNvcmQoKS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBicm93c2Vfc3VwcG9ydGVkOiAgYnJvd3NlIHN1cHBvcnQgaW5mby4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX3ZlcnNpb246ICBwcm9maWxlIHZlcnNpb24gb2YgYXZyY3AgcmVjb3JkLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGNvdmVyX2FydF9wc206IFRoZSBQU00gb2YgYSBjb3ZlciBhcnQgc2VydmljZSwgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC4gVXNlIDAgT3RoZXJ3aXNlLiBJZ25vcmVkIG9uIGNvbnRyb2xsZXIKLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX05PX1JFU09VUkNFUyBpZiBub3QgZW5vdWdoIHJlc291cmNlcyB0byBidWlsZCB0aGUgU0RQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZSQ19BZGRSZWNvcmQodWludDE2X3Qgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfcHJvdmlkZXJfbmFtZSwgdWludDE2X3QgY2F0ZWdvcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlLCBib29sIGJyb3dzZV9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZmlsZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdmVyX2FydF9wc20pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgIEFWUkNfUmVtb3ZlUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVtb3ZlIGFuIEFWUkNQIFNEUCByZWNvcmQuCi0gKgotICogICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgICBzZHBfaGFuZGxlOiAgSGFuZGxlIHlvdSB1c2VkIHdpdGggQVZSQ19BZGRSZWNvcmQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgIEFWUkNfRkFJTCBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVlJDX1JlbW92ZVJlY29yZCh1aW50MzJfdCBzZHBfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19GaW5kU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgc2VydmljZSBkaXNjb3ZlcnkgYW5kIHJldHJpZXZlIEFWUkNQIFNEUCByZWNvcmQgaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICAgICAgZnJvbSBhIHBlZXIgZGV2aWNlLiAgSW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZm9yIHRoZSBmaXJzdAotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlIHJlY29yZCBmb3VuZCBvbiB0aGUgc2VydmVyIHRoYXQgbWF0Y2hlcyB0aGUgc2VydmljZQotICogICAgICAgICAgICAgICAgICBVVUlELiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHNlcnZpY2UKLSAqICAgICAgICAgICAgICAgICAgZGlzY292ZXJ5IGlzIGNvbXBsZXRlLiAgVGhlcmUgY2FuIG9ubHkgYmUgb25lIG91dHN0YW5kaW5nCi0gKiAgICAgICAgICAgICAgICAgIGNhbGwgdG8gQVZSQ19GaW5kU2VydmljZSgpIGF0IGEgdGltZTsgdGhlIGFwcGxpY2F0aW9uIG11c3QKLSAqICAgICAgICAgICAgICAgICAgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIGJlZm9yZSBpdCBtYWtlcyBhbm90aGVyIGNhbGwgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcKLSAqICAgICAgICAgICAgICAgICAgbWVtb3J5IGZvciB0aGUgZGlzY292ZXJ5IGRhdGFiYXNlLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdAotICogICAgICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgZGlzY292ZXJ5IGRhdGFiYXNlIGJlIGF0IGxlYXN0IDMwMCBieXRlcy4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGNhbiBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgYWZ0ZXIgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGhhcyBleGVjdXRlZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3V1aWQ6IEluZGljYXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURyhVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENUKFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGJkX2FkZHI6ICBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2RiOiAgU0RQIGRpc2NvdmVyeSBkYXRhYmFzZSBwYXJhbWV0ZXJzLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfY2JhY2s6ICBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9QQVJBTVMgaWYgZGlzY292ZXJ5IGRhdGFiYXNlIHBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkLgotICogICAgICAgICAgICAgICAgICBBVlJDX05PX1JFU09VUkNFUyBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCByZXNvdXJjZXMgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSB0aGUgc2VydmljZSBzZWFyY2guCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWUkNfRmluZFNlcnZpY2UodWludDE2X3Qgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1NEUF9EQl9QQVJBTVMqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QVZSQ19GSU5EX0NCQUNLJiBjYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfT3BlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gQVZDVFAuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBjb25uZWN0aW9uIGNhbiBiZSBlaXRoZXIgYW4gaW5pdGlhdG9yIG9yIGFjY2VwdG9yLCBhcwotICogICAgICAgICAgICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBwX2NjYi0+c3RyZWFtIHBhcmFtZXRlci4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24gY2FuIGJlIGEgdGFyZ2V0LCBhIGNvbnRyb2xsZXIgb3IgZm9yIGJvdGgKLSAqICAgICAgICAgICAgICAgICAgcm9sZXMsIGFzIGRldGVybWluZWQgYnkgdGhlIHBfY2NiLT5jb250cm9sIHBhcmFtZXRlci4KLSAqICAgICAgICAgICAgICAgICAgQnkgZGVmaW5pdGlvbiwgYSB0YXJnZXQgY29ubmVjdGlvbiBpcyBhbiBhY2NlcHRvciBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRoYXQgd2FpdHMgZm9yIGFuIGluY29taW5nIEFWQ1RQIGNvbm5lY3Rpb24gZnJvbSB0aGUgcGVlci4KLSAqICAgICAgICAgICAgICAgICAgVGhlIGNvbm5lY3Rpb24gcmVtYWlucyBhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uIHVudGlsCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBjbG9zZXMgaXQgYnkgY2FsbGluZyBBVlJDX0Nsb3NlKCkuICBUaGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZG9lcyBub3QgbmVlZCB0byByZW9wZW4gdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgYW4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19DTE9TRV9JTkRfRVZUIGlzIHJlY2VpdmVkLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5jb21wYW55X2lkOiBDb21wYW55IElkZW50aWZpZXIuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfY3RybF9jYmFjazogIFBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+cF9tc2dfY2JhY2s6ICBQb2ludGVyIHRvIHRoZSBtZXNzYWdlIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+Y29ubjogQVZDVFAgY29ubmVjdGlvbiByb2xlLiAgVGhpcyBpcyBzZXQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgIEFWQ1RQX0lOVCBmb3IgaW5pdGlhdG9yIGNvbm5lY3Rpb25zIGFuZCBBVkNUUF9BQ1AKLSAqICAgICAgICAgICAgICAgICAgICAgIGZvciBhY2NlcHRvciBjb25uZWN0aW9ucy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+Y29udHJvbDogQ29udHJvbCByb2xlLiAgVGhpcyBpcyBzZXQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgIEFWUkNfQ1RfVEFSR0VUIGZvciB0YXJnZXQgY29ubmVjdGlvbnMsIEFWUkNfQ1RfQ09OVFJPTAotICogICAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnRyb2wgY29ubmVjdGlvbnMgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIChBVlJDX0NUX1RBUkdFVHxBVlJDX0NUX0NPTlRST0wpIGZvciBjb25uZWN0aW9ucyB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGJvdGggcm9sZXMuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgcGVlcl9hZGRyOiBCRCBhZGRyZXNzIG9mIHBlZXIgZGV2aWNlLiAgVGhpcyB2YWx1ZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgb25seSB1c2VkIGZvciBpbml0aWF0b3IgY29ubmVjdGlvbnM7IGZvciBhY2NlcHRvcgotICogICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgaXQgY2FuIGJlIHNldCB0byBOVUxMLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBwX2hhbmRsZTogUG9pbnRlciB0byBoYW5kbGUuICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaWYgQVZSQ19TVUNDRVNTIGlzIHJldHVybmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfTk9fUkVTT1VSQ0VTIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBvcGVuCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVlJDX09wZW4odWludDhfdCogcF9oYW5kbGUsIHRBVlJDX0NPTk5fQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0Nsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbG9zZSBhIGNvbm5lY3Rpb24gb3BlbmVkIHdpdGggQVZSQ19PcGVuKCkuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB1c2luZyBhIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiBIYW5kbGUgb2YgdGhpcyBjb25uZWN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQkFEX0hBTkRMRSBpZiBoYW5kbGUgaXMgaW52YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZSQ19DbG9zZSh1aW50OF90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfT3BlbkJyb3dzZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gb3BlbiBhIGJyb3dzaW5nIGNvbm5lY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgQVZDVFAuIFRoZSBjb25uZWN0aW9uIGNhbiBiZSBlaXRoZXIgYW4gaW5pdGlhdG9yIG9yCi0gKiAgICAgICAgICAgICAgICAgIGFjY2VwdG9yLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb25uX3JvbGUuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIEFWUkNfT3Blbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX05PX1JFU09VUkNFUyBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCByZXNvdXJjZXMgdG8gb3BlbgotICogICAgICAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZSQ19PcGVuQnJvd3NlKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGNvbm5fcm9sZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfQ2xvc2VCcm93c2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIGEgY29ubmVjdGlvbiBvcGVuZWQgd2l0aCBBVlJDX09wZW5Ccm93c2UoKS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaXMgbm8gbG9uZ2VyIHVzaW5nIGEgY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWUkNfQ2xvc2VCcm93c2UodWludDhfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX01zZ1JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgdGhlIEFWUkNQIGJ5dGUgc3RyZWFtIGluIHBfcGt0Ci0gKiAgICAgICAgICAgICAgICAgIGRvd24gdG8gQVZDVFAuCi0gKgotICogICAgICAgICAgICAgICAgICBJdCBpcyBleHBlY3RlZCB0aGF0OgotICogICAgICAgICAgICAgICAgICBwX3BrdC0+b2Zmc2V0IGlzIGF0IGxlYXN0IEFWQ1RfTVNHX09GRlNFVAotICogICAgICAgICAgICAgICAgICBwX3BrdC0+bGF5ZXJfc3BlY2lmaWMgaXMgQVZDVF9EQVRBX0NUUkwgb3IgQVZDVF9EQVRBX0JST1dTRQotICogICAgICAgICAgICAgICAgICBwX3BrdC0+ZXZlbnQgaXMgQVZSQ19PUF9WRU5ET1IsIEFWUkNfT1BfUEFTU19USFJVIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX09QX0JST1dTSU5HCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBhYm92ZSBCVF9IRFIgc2V0dGluZ3MgYXJlIHNldCBieSB0aGUgQVZSQ19CbGQqCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWUkNfTXNnUmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGN0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1VuaXRDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBVTklUIElORk8gY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQkFEX0hBTkRMRSBpZiBoYW5kbGUgaXMgaW52YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZSQ19Vbml0Q21kKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19TdWJDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBTVUJVTklUIElORk8gY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IFNwZWNpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBzdWJ1bml0IHR5cGUgdGFibGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGlzIHJlcXVlc3RlZC4gIEZvciBBVlJDUCBpdCBpcyB0eXBpY2FsbHkgemVyby4KLSAqICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHJhbmdlIGlzIDAtNy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWUkNfU3ViQ21kKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IHBhZ2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1Bhc3NDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBQQVNTIFRIUk9VR0ggY29tbWFuZCB0byB0aGUgcGVlciBkZXZpY2UuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgY29udHJvbGxlciByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBBbnkgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBwZWVyIGlzIHBhc3NlZCBiYWNrIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgICAgdGhlIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFBBU1MgVEhST1VHSCBtZXNzYWdlIHN0cnVjdHVyZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWUkNfUGFzc0NtZCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTVNHX1BBU1MqIHBfbXNnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19QYXNzUnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIGEgUEFTUyBUSFJPVUdIIHJlc3BvbnNlIHRvIHRoZSBwZWVyIGRldmljZS4gIFRoaXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGZvciB0YXJnZXQgcm9sZSBjb25uZWN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIGEgUEFTUyBUSFJPVUdIIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBwZWVyIHRocm91Z2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLiAgTXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcwotICogICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHdpdGggdGhlIGNvbW1hbmQgbWVzc2FnZSBpbiB0aGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFBBU1MgVEhST1VHSCBtZXNzYWdlIHN0cnVjdHVyZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE91dHB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgTm9uZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEFWUkNfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgotICogICAgICAgICAgICAgICAgICBBVlJDX0JBRF9IQU5ETEUgaWYgaGFuZGxlIGlzIGludmFsaWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEFWUkNfUGFzc1JzcCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTVNHX1BBU1MqIHBfbXNnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19WZW5kb3JDbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBWRU5ET1IgREVQRU5ERU5UIGNvbW1hbmQgdG8gdGhlIHBlZXIgZGV2aWNlLiAgVGhpcwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgZm9yIGNvbnRyb2xsZXIgcm9sZSBjb25uZWN0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgQW55IHJlc3BvbnNlIG1lc3NhZ2UgZnJvbSB0aGUgcGVlciBpcyBwYXNzZWQgYmFjayB0aHJvdWdoCi0gKiAgICAgICAgICAgICAgICAgIHRoZSB0QVZSQ19NU0dfQ0JBQ0sgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICBJbnB1dCBQYXJhbWV0ZXJzOgotICogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiBIYW5kbGUgb2YgdGhpcyBjb25uZWN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBUcmFuc2FjdGlvbiBsYWJlbC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICBwX21zZzogUG9pbnRlciB0byBWRU5ET1IgREVQRU5ERU5UIG1lc3NhZ2Ugc3RydWN0dXJlLgotICoKLSAqICAgICAgICAgICAgICAgICAgT3V0cHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBOb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwuCi0gKiAgICAgICAgICAgICAgICAgIEFWUkNfQkFEX0hBTkRMRSBpZiBoYW5kbGUgaXMgaW52YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQVZSQ19WZW5kb3JDbWQodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfTVNHX1ZFTkRPUiogcF9tc2cpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX1ZlbmRvclJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIFZFTkRPUiBERVBFTkRFTlQgcmVzcG9uc2UgdG8gdGhlIHBlZXIgZGV2aWNlLiAgVGhpcwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgZm9yIHRhcmdldCByb2xlIGNvbm5lY3Rpb25zLgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gYSBWRU5ET1IgREVQRU5ERU5UCi0gKiAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBwZWVyIHRocm91Z2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHRBVlJDX01TR19DQkFDSyBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IEhhbmRsZSBvZiB0aGlzIGNvbm5lY3Rpb24uCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFRyYW5zYWN0aW9uIGxhYmVsLiAgTXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcwotICogICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHdpdGggdGhlIGNvbW1hbmQgbWVzc2FnZSBpbiB0aGUgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIHBfbXNnOiBQb2ludGVyIHRvIFZFTkRPUiBERVBFTkRFTlQgbWVzc2FnZSBzdHJ1Y3R1cmUuCi0gKgotICogICAgICAgICAgICAgICAgICBPdXRwdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIE5vbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQVZSQ19CQURfSEFORExFIGlmIGhhbmRsZSBpcyBpbnZhbGlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBBVlJDX1ZlbmRvclJzcCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZSQ19NU0dfVkVORE9SKiBwX21zZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEFWUkMuIElmIDB4ZmYgaXMgcGFzc2VkLCB0aGUKLSAqICAgICAgICAgICAgICAgICAgY3VycmVudCB0cmFjZSBsZXZlbCBpcyByZXR1cm5lZC4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIElucHV0IFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBuZXdfbGV2ZWw6ICBUaGUgbGV2ZWwgdG8gc2V0IHRoZSBBVlJDIHRyYWNpbmcgdG86Ci0gKiAgICAgICAgICAgICAgICAgICAgICAweGZmLXJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZy4KLSAqICAgICAgICAgICAgICAgICAgICAgIDAtdHVybnMgb2ZmIHRyYWNpbmcuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAxLUVycm9ycy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDItV2FybmluZ3MuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAzLUFQSXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSA0LUV2ZW50cy4KLSAqICAgICAgICAgICAgICAgICAgICAgID49IDUtRGVidWcuCi0gKgotICogUmV0dXJucyAgICAgICAgICBUaGUgbmV3IHRyYWNlIGxldmVsIG9yIGN1cnJlbnQgdHJhY2UgbGV2ZWwgaWYKLSAqICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IHBhcmFtZXRlciBpcyAweGZmLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50OF90IEFWUkNfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHN0YWNrIHN0YXJ0dXAgdG8gYWxsb2NhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgKGlmIHVzaW5nIGR5bmFtaWMgbWVtb3J5KSwgYW5kIGluaXRpYWxpemVzIHRoZQotICogICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGFuZCB0cmFjaW5nIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBBVlJDX0luaXQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0N0cmxfUGFyc0NvbW1hbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXJzZSBjbWRzIHJlY2VpdmVkIGZvciBDVFJMCi0gKiAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSBpdCBpcyBmb3IgU2V0QWJzVm9sdW1lIGFuZCBWb2x1bWUgQ2hhbmdlCi0gKiAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBtZXNzYWdlIGluIHBfZGF0YSBpcyBwYXJzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZSBkZWZpbmVkIGJ5IEFWUkNQIDEuNAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEFWUkNfU1RTIEFWUkNfQ3RybF9QYXJzQ29tbWFuZCh0QVZSQ19NU0cqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfQ09NTUFORCogcF9yZXN1bHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19QYXJzQ29tbWFuZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhcnNlIHRoZSByZWNlaXZlZCBjb21tYW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBtZXNzYWdlIGluIHBfZGF0YSBpcyBwYXJzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZSBkZWZpbmVkIGJ5IEFWUkNQIDEuNAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEFWUkNfU1RTIEFWUkNfUGFyc0NvbW1hbmQodEFWUkNfTVNHKiBwX21zZywgdEFWUkNfQ09NTUFORCogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9idWYsIHVpbnQxNl90IGJ1Zl9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19QYXJzUmVzcG9uc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXJzZSB0aGUgcmVjZWl2ZWQgcmVzcG9uc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlIGRlZmluZWQgYnkgQVZSQ1AgMS40Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QVZSQ19TVFMgQVZSQ19QYXJzUmVzcG9uc2UodEFWUkNfTVNHKiBwX21zZywgdEFWUkNfUkVTUE9OU0UqIHBfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2J1ZiwgdWludDE2X3QgYnVmX2xlbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0N0cmxfUGFyc1Jlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcGFyc2UgcmVzcG9uc2UgZm9yIEFWUkNQIENvbnRyb2xsZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUiwgaWYgdGhlIG1lc3NhZ2UgaW4gcF9kYXRhIGlzIHBhcnNlZAotICogICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlIGRlZmluZWQgYnkgQVZSQ1AgMS40Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QVZSQ19TVFMgQVZSQ19DdHJsX1BhcnNSZXNwb25zZSh0QVZSQ19NU0cqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1JFU1BPTlNFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2J1ZiwgdWludDE2X3QqIGJ1Zl9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQVZSQ19CbGRDb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgZ2l2ZW4gQVZSQ1AgY29tbWFuZCB0byB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgR0tJIGJ1ZmZlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSBjb21tYW5kIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBlcnJvciBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEFWUkNfU1RTIEFWUkNfQmxkQ29tbWFuZCh0QVZSQ19DT01NQU5EKiBwX2NtZCwgQlRfSERSKiogcHBfcGt0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfQmxkUmVzcG9uc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBnaXZlbiBBVlJDUCByZXNwb25zZSB0byB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgR0tJIGJ1ZmZlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IsIGlmIHRoZSByZXNwb25zZSBpcyBidWlsdCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRBVlJDX1NUUyBBVlJDX0JsZFJlc3BvbnNlKHVpbnQ4X3QgaGFuZGxlLCB0QVZSQ19SRVNQT05TRSogcF9yc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiogcHBfcGt0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBBVlJDX0lzVmFsaWRBdmNUeXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiBjb3JyZWN0IEFWQyB0eXBlIGlzIHNwZWNpZmllZAotICoKLSAqIFJldHVybnMgICAgICAgICAgcmV0dXJucyB0cnVlIGlmIGl0IGlzIHZhbGlkCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBBVlJDX0lzVmFsaWRBdmNUeXBlKHVpbnQ4X3QgcGR1X2lkLCB1aW50OF90IGF2Y190eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEFWUkNfSXNWYWxpZFBsYXllckF0dHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIGlmIHRoZSBnaXZlbiBhdHRyaWIgdmFsdWUgaXMgYSB2YWxpZCBvbmUKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICByZXR1cm5zIHRydWUgaWYgaXQgaXMgdmFsaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgQVZSQ19Jc1ZhbGlkUGxheWVyQXR0cih1aW50OF90IGF0dHIpOwotCi0jZW5kaWYgLyogQVZSQ19BUElfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9hdnJjX2RlZnMuaCBiL3N0YWNrL2luY2x1ZGUvYXZyY19kZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDFmM2QuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9hdnJjX2RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDE2IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBBVlJDUCBkZWZpbml0aW9uIGFuZCBkYXRhIHR5cGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX0FWUkNfREVGU19ICi0jZGVmaW5lIF9BVlJDX0RFRlNfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBjb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQcm9maWxlIHJldmlzaW9uIG51bWJlcnMgKi8KLSNkZWZpbmUgQVZSQ19SRVZfMV8wIDB4MDEwMAotI2RlZmluZSBBVlJDX1JFVl8xXzMgMHgwMTAzCi0jZGVmaW5lIEFWUkNfUkVWXzFfNCAweDAxMDQKLSNkZWZpbmUgQVZSQ19SRVZfMV81IDB4MDEwNQotI2RlZmluZSBBVlJDX1JFVl8xXzYgMHgwMTA2Ci0KLS8qIGRlZmluZXMgZnJvbSB0aGUgc3BlYyAqLwotI2RlZmluZSBBVlJDX1BBQ0tFVF9MRU4gNTEyIC8qIFlvdSBtdXN0IHN1cHBvcnQgNTEyIGJ5dGUgUkMgcGFja2V0cyAqLwotCi0jZGVmaW5lIEFWUkNfTUlOX0NPTlRST0xfTVRVIDQ4IC8qIE1pbmltdW0gTVRVIGZvciB0aGUgY29udHJvbCBjaGFubmVsICovCi0jZGVmaW5lIEFWUkNfTUlOX0JST1dTRV9NVFUgMzM1IC8qIE1pbmltdW0gTVRVIGZvciB0aGUgYnJvd3NpbmcgY2hhbm5lbCAqLwotCi0jZGVmaW5lIEFWUkNfTUVUQV9QRFVfT0ZGU0VUIDQKLSNkZWZpbmUgQVZSQ19TVUJfVFlQRV9MRU4gNAotI2RlZmluZSBBVlJDX1VJRF9TSVpFIDgKLSNkZWZpbmUgQVZSQ19GRUFUVVJFX01BU0tfU0laRSAxNgotCi0vKiBjb21tYW5kIHR5cGUgY29kZXMgKi8KLSNkZWZpbmUgQVZSQ19DTURfQ1RSTCAwICAgLyogSW5zdHJ1Y3QgYSB0YXJnZXQgdG8gcGVyZm9ybSBhbiBvcGVyYXRpb24gKi8KLSNkZWZpbmUgQVZSQ19DTURfU1RBVFVTIDEgLyogQ2hlY2sgYSBkZXZpY2UncyBjdXJyZW50IHN0YXR1cyAqLwotI2RlZmluZSBBVlJDX0NNRF9TUEVDX0lOUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgMiAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIGEgdGFyZ2V0IHN1cHBvcnRzIGEgcGFydGljdWxhciBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBjb21tYW5kOyBhbGwgb3BlcmFuZHMgYXJlIGluY2x1ZGVkICovCi0jZGVmaW5lIEFWUkNfQ01EX05PVElGIDMgLyogTm90aWZpY2F0aW9uIG9mIGEgY2hhbmdlIGluIGEgZGV2aWNlJ3Mgc3RhdGUgKi8KLSNkZWZpbmUgQVZSQ19DTURfR0VOX0lOUSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDQgLyogQ2hlY2sgd2hldGhlciBhIHRhcmdldCBzdXBwb3J0cyBhIHBhcnRpY3VsYXIgXAotICAgICAgIGNvbnRyb2wgY29tbWFuZDsgb3BlcmFuZHMgYXJlIG5vdCBpbmNsdWRlZCAqLwotCi0vKiByZXNwb25zZSB0eXBlIGNvZGVzICovCi0jZGVmaW5lIEFWUkNfUlNQX05PVF9JTVBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgOCAvKiBUaGUgdGFyZ2V0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgY29tbWFuZCBzcGVjaWZpZWQgXAotICAgICAgIGJ5IHRoZSBvcGNvZGUgYW5kIG9wZXJhbmQsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgb3IgZG9lc24ndCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdWJ1bml0ICovCi0jZGVmaW5lIEFWUkNfUlNQX0FDQ0VQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICA5IC8qIFRoZSB0YXJnZXQgZXhlY3V0ZWQgb3IgaXMgZXhlY3V0aW5nIHRoZSBjb21tYW5kIFwKLSAgICAgICAqLwotI2RlZmluZSBBVlJDX1JTUF9SRUogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAxMCAvKiBUaGUgdGFyZ2V0IGltcGxlbWVudHMgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IHRoZSAgXAotICAgICAgICBvcGNvZGUgYnV0IGNhbm5vdCByZXNwb25kIGJlY2F1c2UgdGhlIGN1cnJlbnQgc3RhdGUgXAotICAgICAgICBvZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgYWxsb3cgaXQgKi8KLSNkZWZpbmUgQVZSQ19SU1BfSU5fVFJBTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAxMSAvKiBUaGUgdGFyZ2V0IGltcGxlbWVudHMgdGhlIHN0YXR1cyBjb21tYW5kIGJ1dCBpdCBpcyBcCi0gICAgICAgIGluIGEgc3RhdGUgb2YgdHJhbnNpdGlvbjsgdGhlIHN0YXR1cyBjb21tYW5kIG1heSAgIFwKLSAgICAgICAgYmUgcmV0cmllZCBhdCBhIGZ1dHVyZSB0aW1lICovCi0jZGVmaW5lIEFWUkNfUlNQX0lNUExfU1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDEyIC8qIEZvciBzcGVjaWZpYyBpbnF1aXJ5IG9yIGdlbmVyYWwgaW5xdWl5IGNvbW1hbmRzLCBcCi0gICAgICAgIHRoZSB0YXJnZXQgaW1wbGVtZW50cyB0aGUgY29tbWFuZDsgZm9yIHN0YXR1cyAgICBcCi0gICAgICAgIGNvbW1hbmRzLCB0aGUgdGFyZ2V0IHJldHVybnMgc3RhYmxlIGFuZCBpbmNsdWRlcyBcCi0gICAgICAgIHRoZSBzdGF0dXMgcmVzdWx0cyAqLwotI2RlZmluZSBBVlJDX1JTUF9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAxMyAvKiBUaGUgcmVzcG9uc2UgZnJhbWUgY29udGFpbnMgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgXAotICAgICAgICB0YXJnZXQgZGV2aWNlJ3Mgc3RhdGUgaGFzIGNoYW5nZWQgKi8KLSNkZWZpbmUgQVZSQ19SU1BfSU5URVJJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIDE1IC8qIEZvciBjb250cm9sIGNvbW1hbmRzLCB0aGUgdGFyZ2V0IGhhcyBhY2NlcHRlZCB0aGUgICAgICAgXAotICAgICAgICByZXF1ZXN0IGJ1dCBjYW5ub3QgcmV0dXJuIGluZm9ybWF0aW9uIHdpdGhpbiAxMDAgICAgICAgIFwKLSAgICAgICAgbWlsbGlzZWNvbmRzOyBmb3Igbm90aWZ5IGNvbW1hbmRzLCB0aGUgdGFyZ2V0IGFjY2VwdGVkICBcCi0gICAgICAgIHRoZSBjb21tYW5kLCBhbmQgd2lsbCBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgYSBjaGFuZ2UgXAotICAgICAgICBvZiB0YXJnZXQgc3RhdGUgYXQgYSBmdXR1cmUgdGltZSAqLwotCi0vKiBzdWJ1bml0IHR5cGUgKi8KLSNkZWZpbmUgQVZSQ19TVUJfTU9OSVRPUiAweDAwICAvKiBNb25pdG9yICovCi0jZGVmaW5lIEFWUkNfU1VCX0FVRElPIDB4MDEgICAgLyogQXVkaW8gKi8KLSNkZWZpbmUgQVZSQ19TVUJfUFJJTlRFUiAweDAyICAvKiBQcmludGVyICovCi0jZGVmaW5lIEFWUkNfU1VCX0RJU0MgMHgwMyAgICAgLyogRGlzYyAqLwotI2RlZmluZSBBVlJDX1NVQl9UQVBFIDB4MDQgICAgIC8qIFRhcGUgcmVjb3JkZXIvcGxheWVyICovCi0jZGVmaW5lIEFWUkNfU1VCX1RVTkVSIDB4MDUgICAgLyogVHVuZXIgKi8KLSNkZWZpbmUgQVZSQ19TVUJfQ0EgMHgwNiAgICAgICAvKiBDQSAqLwotI2RlZmluZSBBVlJDX1NVQl9DQU1FUkEgMHgwNyAgIC8qIENhbWVyYSAqLwotI2RlZmluZSBBVlJDX1NVQl9QQU5FTCAweDA5ICAgIC8qIFBhbmVsICovCi0jZGVmaW5lIEFWUkNfU1VCX0JCIDB4MEEgICAgICAgLyogQnVsbGV0aW4gQm9hcmQgKi8KLSNkZWZpbmUgQVZSQ19TVUJfQ0FNX1NUT1IgMHgwQiAvKiBDYW1lcmEgU3RvcmFnZSAqLwotI2RlZmluZSBBVlJDX1NVQl9WRU5ET1IgMHgxQyAgIC8qIFZlbmRvciB1bmlxdWUgKi8KLSNkZWZpbmUgQVZSQ19TVUJfRVhUIDB4MUUgICAgICAvKiBTdWJ1bml0IHR5cGUgZXh0ZW5kZWQgdG8gbmV4dCBieXRlICovCi0jZGVmaW5lIEFWUkNfU1VCX1VOSVQgMHgxRiAgICAgLyogVW5pdCAqLwotCi0vKiBvcGNvZGVzIC0gZGVmaW5lZCBieSAxMzk0dGEgKi8KLSNkZWZpbmUgQVZSQ19PUF9VTklUX0lORk8gMHgzMCAvKiBSZXBvcnQgdW5pdCBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBBVlJDX09QX1NVQl9JTkZPIDB4MzEgIC8qIFJlcG9ydCBzdWJ1bml0IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEFWUkNfT1BfVkVORE9SIDB4MDAgICAgLyogVmVuZG9yLWRlcGVuZGVudCBjb21tYW5kcyAqLwotI2RlZmluZSBBVlJDX09QX1BBU1NfVEhSVSAweDdDIC8qIHBhbmVsIHN1YnVuaXQgb3Bjb2RlICovCi0vKiBvcGNvZGVzIDgwLTlGIGFuZCBFMC1GRiBhcmUgbm90IHVzZWQgYnkgMTM5NHRhLiAgU25lYWsgb25lIGZvciBicm93c2luZyAqLwotI2RlZmluZSBBVlJDX09QX0JST1dTRSAweEZGICAvKiBCcm93c2luZyAqLwotI2RlZmluZSBBVlJDX09QX0lOVkFMSUQgMHhGRSAvKiBpbnZhbGlkIG9uZSAqLwotCi0vKiBDb21wYW55IElEJ3MKLSovCi0jZGVmaW5lIEFWUkNfQ09fQkxVRVRPT1RIX1NJRyAweDAwRkZGRkZGCi0jZGVmaW5lIEFWUkNfQ09fV0lEQ09NTSAweDAwMDAwMzYxCi0jZGVmaW5lIEFWUkNfQ09fQlJPQURDT00gMHgwMDAwMTAxOAotI2RlZmluZSBBVlJDX0NPX0dPT0dMRSAweDAwREFBMTE5Ci0jZGVmaW5lIEFWUkNfQ09fTUVUQURBVEEgXAotICAweDAwMDAxOTU4IC8qIFVuaXF1ZSBDT01QQU5ZIElEIGZvciBNZXRhZGF0YSBtZXNzYWdlcyAqLwotCi0vKiBTdGF0ZSBmbGFnIGZvciBQYXNzdGhyb3VnaCBjb21tYW5kcwotKi8KLSNkZWZpbmUgQVZSQ19TVEFURV9QUkVTUyAwCi0jZGVmaW5lIEFWUkNfU1RBVEVfUkVMRUFTRSAxCi0KLS8qIE9wZXJhdGlvbiBJRCBsaXN0IGZvciBQYXNzdGhyb3VnaCBjb21tYW5kcwotKi8KLSNkZWZpbmUgQVZSQ19JRF9TRUxFQ1QgMHgwMCAgICAgLyogc2VsZWN0ICovCi0jZGVmaW5lIEFWUkNfSURfVVAgMHgwMSAgICAgICAgIC8qIHVwICovCi0jZGVmaW5lIEFWUkNfSURfRE9XTiAweDAyICAgICAgIC8qIGRvd24gKi8KLSNkZWZpbmUgQVZSQ19JRF9MRUZUIDB4MDMgICAgICAgLyogbGVmdCAqLwotI2RlZmluZSBBVlJDX0lEX1JJR0hUIDB4MDQgICAgICAvKiByaWdodCAqLwotI2RlZmluZSBBVlJDX0lEX1JJR0hUX1VQIDB4MDUgICAvKiByaWdodC11cCAqLwotI2RlZmluZSBBVlJDX0lEX1JJR0hUX0RPV04gMHgwNiAvKiByaWdodC1kb3duICovCi0jZGVmaW5lIEFWUkNfSURfTEVGVF9VUCAweDA3ICAgIC8qIGxlZnQtdXAgKi8KLSNkZWZpbmUgQVZSQ19JRF9MRUZUX0RPV04gMHgwOCAgLyogbGVmdC1kb3duICovCi0jZGVmaW5lIEFWUkNfSURfUk9PVF9NRU5VIDB4MDkgIC8qIHJvb3QgbWVudSAqLwotI2RlZmluZSBBVlJDX0lEX1NFVFVQX01FTlUgMHgwQSAvKiBzZXR1cCBtZW51ICovCi0jZGVmaW5lIEFWUkNfSURfQ09OVF9NRU5VIDB4MEIgIC8qIGNvbnRlbnRzIG1lbnUgKi8KLSNkZWZpbmUgQVZSQ19JRF9GQVZfTUVOVSAweDBDICAgLyogZmF2b3JpdGUgbWVudSAqLwotI2RlZmluZSBBVlJDX0lEX0VYSVQgMHgwRCAgICAgICAvKiBleGl0ICovCi0jZGVmaW5lIEFWUkNfSURfMCAweDIwICAgICAgICAgIC8qIDAgKi8KLSNkZWZpbmUgQVZSQ19JRF8xIDB4MjEgICAgICAgICAgLyogMSAqLwotI2RlZmluZSBBVlJDX0lEXzIgMHgyMiAgICAgICAgICAvKiAyICovCi0jZGVmaW5lIEFWUkNfSURfMyAweDIzICAgICAgICAgIC8qIDMgKi8KLSNkZWZpbmUgQVZSQ19JRF80IDB4MjQgICAgICAgICAgLyogNCAqLwotI2RlZmluZSBBVlJDX0lEXzUgMHgyNSAgICAgICAgICAvKiA1ICovCi0jZGVmaW5lIEFWUkNfSURfNiAweDI2ICAgICAgICAgIC8qIDYgKi8KLSNkZWZpbmUgQVZSQ19JRF83IDB4MjcgICAgICAgICAgLyogNyAqLwotI2RlZmluZSBBVlJDX0lEXzggMHgyOCAgICAgICAgICAvKiA4ICovCi0jZGVmaW5lIEFWUkNfSURfOSAweDI5ICAgICAgICAgIC8qIDkgKi8KLSNkZWZpbmUgQVZSQ19JRF9ET1QgMHgyQSAgICAgICAgLyogZG90ICovCi0jZGVmaW5lIEFWUkNfSURfRU5URVIgMHgyQiAgICAgIC8qIGVudGVyICovCi0jZGVmaW5lIEFWUkNfSURfQ0xFQVIgMHgyQyAgICAgIC8qIGNsZWFyICovCi0jZGVmaW5lIEFWUkNfSURfQ0hBTl9VUCAweDMwICAgIC8qIGNoYW5uZWwgdXAgKi8KLSNkZWZpbmUgQVZSQ19JRF9DSEFOX0RPV04gMHgzMSAgLyogY2hhbm5lbCBkb3duICovCi0jZGVmaW5lIEFWUkNfSURfUFJFVl9DSEFOIDB4MzIgIC8qIHByZXZpb3VzIGNoYW5uZWwgKi8KLSNkZWZpbmUgQVZSQ19JRF9TT1VORF9TRUwgMHgzMyAgLyogc291bmQgc2VsZWN0ICovCi0jZGVmaW5lIEFWUkNfSURfSU5QVVRfU0VMIDB4MzQgIC8qIGlucHV0IHNlbGVjdCAqLwotI2RlZmluZSBBVlJDX0lEX0RJU1BfSU5GTyAweDM1ICAvKiBkaXNwbGF5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEFWUkNfSURfSEVMUCAweDM2ICAgICAgIC8qIGhlbHAgKi8KLSNkZWZpbmUgQVZSQ19JRF9QQUdFX1VQIDB4MzcgICAgLyogcGFnZSB1cCAqLwotI2RlZmluZSBBVlJDX0lEX1BBR0VfRE9XTiAweDM4ICAvKiBwYWdlIGRvd24gKi8KLSNkZWZpbmUgQVZSQ19JRF9QT1dFUiAweDQwICAgICAgLyogcG93ZXIgKi8KLSNkZWZpbmUgQVZSQ19JRF9WT0xfVVAgMHg0MSAgICAgLyogdm9sdW1lIHVwICovCi0jZGVmaW5lIEFWUkNfSURfVk9MX0RPV04gMHg0MiAgIC8qIHZvbHVtZSBkb3duICovCi0jZGVmaW5lIEFWUkNfSURfTVVURSAweDQzICAgICAgIC8qIG11dGUgKi8KLSNkZWZpbmUgQVZSQ19JRF9QTEFZIDB4NDQgICAgICAgLyogcGxheSAqLwotI2RlZmluZSBBVlJDX0lEX1NUT1AgMHg0NSAgICAgICAvKiBzdG9wICovCi0jZGVmaW5lIEFWUkNfSURfUEFVU0UgMHg0NiAgICAgIC8qIHBhdXNlICovCi0jZGVmaW5lIEFWUkNfSURfUkVDT1JEIDB4NDcgICAgIC8qIHJlY29yZCAqLwotI2RlZmluZSBBVlJDX0lEX1JFV0lORCAweDQ4ICAgICAvKiByZXdpbmQgKi8KLSNkZWZpbmUgQVZSQ19JRF9GQVNUX0ZPUiAweDQ5ICAgLyogZmFzdCBmb3J3YXJkICovCi0jZGVmaW5lIEFWUkNfSURfRUpFQ1QgMHg0QSAgICAgIC8qIGVqZWN0ICovCi0jZGVmaW5lIEFWUkNfSURfRk9SV0FSRCAweDRCICAgIC8qIGZvcndhcmQgKi8KLSNkZWZpbmUgQVZSQ19JRF9CQUNLV0FSRCAweDRDICAgLyogYmFja3dhcmQgKi8KLSNkZWZpbmUgQVZSQ19JRF9BTkdMRSAweDUwICAgICAgLyogYW5nbGUgKi8KLSNkZWZpbmUgQVZSQ19JRF9TVUJQSUNUIDB4NTEgICAgLyogc3VicGljdHVyZSAqLwotI2RlZmluZSBBVlJDX0lEX0YxIDB4NzEgICAgICAgICAvKiBGMSAqLwotI2RlZmluZSBBVlJDX0lEX0YyIDB4NzIgICAgICAgICAvKiBGMiAqLwotI2RlZmluZSBBVlJDX0lEX0YzIDB4NzMgICAgICAgICAvKiBGMyAqLwotI2RlZmluZSBBVlJDX0lEX0Y0IDB4NzQgICAgICAgICAvKiBGNCAqLwotI2RlZmluZSBBVlJDX0lEX0Y1IDB4NzUgICAgICAgICAvKiBGNSAqLwotI2RlZmluZSBBVlJDX0lEX1ZFTkRPUiAweDdFICAgICAvKiB2ZW5kb3IgdW5pcXVlICovCi0jZGVmaW5lIEFWUkNfS0VZUFJFU1NFRF9SRUxFQVNFIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTWV0YWRhdGEgdHJhbnNmZXIgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBEZWZpbmUgdGhlIE1ldGFkYXRhIFBhY2tldCB0eXBlcwotKi8KLSNkZWZpbmUgQVZSQ19QS1RfU0lOR0xFIDAKLSNkZWZpbmUgQVZSQ19QS1RfU1RBUlQgMQotI2RlZmluZSBBVlJDX1BLVF9DT05USU5VRSAyCi0jZGVmaW5lIEFWUkNfUEtUX0VORCAzCi0jZGVmaW5lIEFWUkNfUEtUX1RZUEVfTUFTSyAzCi0KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICAvKiBEZWZpbmUgdGhlIFBEVXMgY2FycmllZCBpbiB0aGUgdmVuZG9yIGRlcGVuZGFudCBkYXRhCi0gICAqLwotICBBVlJDX1BEVV9HRVRfQ0FQQUJJTElUSUVTID0gMHgxMCwKLSAgQVZSQ19QRFVfTElTVF9QTEFZRVJfQVBQX0FUVFIgPSAweDExLAotICBBVlJDX1BEVV9MSVNUX1BMQVlFUl9BUFBfVkFMVUVTID0gMHgxMiwKLSAgQVZSQ19QRFVfR0VUX0NVUl9QTEFZRVJfQVBQX1ZBTFVFID0gMHgxMywKLSAgQVZSQ19QRFVfU0VUX1BMQVlFUl9BUFBfVkFMVUUgPSAweDE0LAotICBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9BVFRSX1RFWFQgPSAweDE1LAotICBBVlJDX1BEVV9HRVRfUExBWUVSX0FQUF9WQUxVRV9URVhUID0gMHgxNiwKLSAgQVZSQ19QRFVfSU5GT1JNX0RJU1BMQVlfQ0hBUlNFVCA9IDB4MTcsCi0gIEFWUkNfUERVX0lORk9STV9CQVRURVJZX1NUQVRfT0ZfQ1QgPSAweDE4LAotICBBVlJDX1BEVV9HRVRfRUxFTUVOVF9BVFRSID0gMHgyMCwKLSAgQVZSQ19QRFVfR0VUX1BMQVlfU1RBVFVTID0gMHgzMCwKLSAgQVZSQ19QRFVfUkVHSVNURVJfTk9USUZJQ0FUSU9OID0gMHgzMSwKLSAgQVZSQ19QRFVfUkVRVUVTVF9DT05USU5VQVRJT05fUlNQID0gMHg0MCwKLSAgQVZSQ19QRFVfQUJPUlRfQ09OVElOVUFUSU9OX1JTUCA9IDB4NDEsCi0gIC8qIGFkZGVkIGluIDEuNCAqLwotICBBVlJDX1BEVV9TRVRfQUJTT0xVVEVfVk9MVU1FID0gMHg1MCwKLSAgQVZSQ19QRFVfU0VUX0FERFJFU1NFRF9QTEFZRVIgPSAweDYwLAotICBBVlJDX1BEVV9TRVRfQlJPV1NFRF9QTEFZRVIgPSAweDcwLAotICBBVlJDX1BEVV9HRVRfRk9MREVSX0lURU1TID0gMHg3MSwKLSAgQVZSQ19QRFVfQ0hBTkdFX1BBVEggPSAweDcyLAotICBBVlJDX1BEVV9HRVRfSVRFTV9BVFRSSUJVVEVTID0gMHg3MywKLSAgQVZSQ19QRFVfUExBWV9JVEVNID0gMHg3NCwKLSAgLyogQWRkZWQgaW4gcG9zdCAxLjUgKi8KLSAgQVZSQ19QRFVfR0VUX1RPVEFMX05VTV9PRl9JVEVNUyA9IDB4NzUsCi0gIEFWUkNfUERVX1NFQVJDSCA9IDB4ODAsCi0gIEFWUkNfUERVX0FERF9UT19OT1dfUExBWUlORyA9IDB4OTAsCi0gIEFWUkNfUERVX0dFTkVSQUxfUkVKRUNUID0gMHhBMCwKLSAgLyogRGVmaW5lIHRoZSB2ZW5kb3IgdW5pcXVlIGlkIGNhcnJpZWQgaW4gdGhlIHBhc3MgdGhyb3VnaCBkYXRhCi0gICAqLwotICBBVlJDX1BEVV9ORVhUX0dST1VQID0gMHgwMCwKLSAgQVZSQ19QRFVfUFJFVl9HUk9VUCA9IDB4MDEsCi0gIEFWUkNfUERVX0lOVkFMSUQgPSAweGZmLAotfSB0QVZSQ19QRFU7Ci0KLS8qIFRoZSBvbmx5IHBhc3MgdGhyb3VnaCB2ZW5kb3IgdW5pcXVlIGNvbW1hbmRzIGRlZmluZWQgYnkgQVZSQyBhcmUgdGhlIGdyb3VwCi0gKiAgbmF2aWdhdGlvbiBjb21tYW5kcy4KLSAqIFRoZSBsZW4gZm9yIHZlbmRvciB1bmlxdWUgZGF0YSBpcyA1Ci0gKi8KLSNkZWZpbmUgQVZSQ19QQVNTX1RIUlVfR1JPVVBfTEVOIDUKLQotLyogNi4xNS4zIGVycm9yIHN0YXR1cyBjb2RlIGZvciBnZW5lcmFsIHJlamVjdCAqLwotLyogSW52YWxpZCBjb21tYW5kLCBzZW50IGlmIFRHIHJlY2VpdmVkIGEgUERVIHRoYXQgaXQgZGlkIG5vdCB1bmRlcnN0YW5kLiAqLwotI2RlZmluZSBBVlJDX1NUU19CQURfQ01EIDB4MDAKLS8qIEludmFsaWQgcGFyYW1ldGVyLCBzZW50IGlmIHRoZSBURyByZWNlaXZlZCBhIFBEVSB3aXRoIGEgcGFyYW1ldGVyIElEIHRoYXQgaXQKLSAqIGRpZCBub3QgdW5kZXJzdGFuZC4gU2VudCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJhbWV0ZXIgSUQgaW4gdGhlIFBEVS4gKi8KLSNkZWZpbmUgQVZSQ19TVFNfQkFEX1BBUkFNIDB4MDEKLS8qIFNwZWNpZmllZCBwYXJhbWV0ZXIgbm90IGZvdW5kLiwgc2VudCBpZiB0aGUgcGFyYW1ldGVyIElEIGlzIHVuZGVyc3Rvb2QsIGJ1dAotICogY29udGVudCBpcyB3cm9uZyBvciBjb3JydXB0ZWQuICovCi0jZGVmaW5lIEFWUkNfU1RTX05PVF9GT1VORCAweDAyCi0vKiBJbnRlcm5hbCBFcnJvciwgc2VudCBpZiB0aGVyZSBhcmUgZXJyb3IgY29uZGl0aW9ucyBub3QgY292ZXJlZCBieSBhIG1vcmUKLSAqIHNwZWNpZmljIGVycm9yIGNvZGUuICovCi0jZGVmaW5lIEFWUkNfU1RTX0lOVEVSTkFMX0VSUiAweDAzCi0vKiBPcGVyYXRpb24gY29tcGxldGVkIHdpdGhvdXQgZXJyb3IuICBUaGlzIGlzIHRoZSBzdGF0dXMgdGhhdCBzaG91bGQgYmUKLSAqIHJldHVybmVkIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuICovCi0jZGVmaW5lIEFWUkNfU1RTX05PX0VSUk9SIDB4MDQKLS8qIFVJRCBDaGFuZ2VkIC0gVGhlIFVJRHMgb24gdGhlIGRldmljZSBoYXZlIGNoYW5nZWQgKi8KLSNkZWZpbmUgQVZSQ19TVFNfVUlEX0NIQU5HRUQgMHgwNQotLyogI2RlZmluZSBBVlJDX1NUU19HRU5fRVJST1IgICAweDA2ICAgIFVua25vd24gRXJyb3IgLSBub3cgInJlc2VydmVkIiAqLwotLyogSW52YWxpZCBEaXJlY3Rpb24gLSBUaGUgRGlyZWN0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkIC0gQ2hhbmdlIFBhdGgqLwotI2RlZmluZSBBVlJDX1NUU19CQURfRElSIDB4MDcKLS8qIE5vdCBhIERpcmVjdG9yeSAtIFRoZSBVSUQgcHJvdmlkZWQgZG9lcyBub3QgcmVmZXIgdG8gYSBmb2xkZXIgaXRlbSAtCi0gKiAgICAgIENoYW5nZSBQYXRoICovCi0jZGVmaW5lIEFWUkNfU1RTX05PVF9ESVIgMHgwOAotLyogRG9lcyBOb3QgRXhpc3QgLSBUaGUgVUlEIHByb3ZpZGVkIGRvZXMgbm90IHJlZmVyIHRvIGFueSBpdGVtIC0gQ2hhbmdlIFBhdGgsCi0gKiAgICAgIFBsYXlJdGVtLCBBZGRUb05vd1BsYXlpbmcsIEdldEl0ZW1BdHRyaWJ1dGVzICovCi0jZGVmaW5lIEFWUkNfU1RTX05PVF9FWElTVCAweDA5Ci0vKiBJbnZhbGlkIFNjb3BlIC0gVGhlIHNjb3BlIHBhcmFtZXRlciBpcyBpbnZhbGlkIC0gR2V0Rm9sZGVySXRlbXMsIFBsYXlJdGVtLAotICogICAgICBBZGRUb05vd1BsYXllciwgR2V0SXRlbUF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgQVZSQ19TVFNfQkFEX1NDT1BFIDB4MGEKLS8qIFJhbmdlIE91dCBvZiBCb3VuZHMgLSBUaGUgc3RhcnQgb2YgcmFuZ2UgcHJvdmlkZWQgaXMgbm90IHZhbGlkCi0gKiAgICAgIEdldEZvbGRlckl0ZW1zKi8KLSNkZWZpbmUgQVZSQ19TVFNfQkFEX1JBTkdFIDB4MGIKLS8qIFVJRCBpcyBhIERpcmVjdG9yeSAtIFRoZSBVSUQgcHJvdmlkZWQgcmVmZXJzIHRvIGEgZGlyZWN0b3J5LCB3aGljaCBjYW5ub3QgYmUKLSAqIGhhbmRsZWQgYnkgdGhpcyBtZWRpYSBwbGF5ZXIgLSAgUGxheUl0ZW0sIEFkZFRvTm93UGxheWluZyAqLwotI2RlZmluZSBBVlJDX1NUU19VSURfSVNfRElSIDB4MGMKLS8qIE1lZGlhIGluIFVzZSAtIFRoZSBtZWRpYSBpcyBub3QgYWJsZSB0byBiZSB1c2VkIGZvciB0aGlzIG9wZXJhdGlvbiBhdCB0aGlzCi0gKiB0aW1lIC0gUGxheUl0ZW0sIEFkZFRvTm93UGxheWluZyAqLwotI2RlZmluZSBBVlJDX1NUU19JTl9VU0UgMHgwZAotLyogTm93IFBsYXlpbmcgTGlzdCBGdWxsIC0gTm8gbW9yZSBpdGVtcyBjYW4gYmUgYWRkZWQgdG8gdGhlIE5vdyBQbGF5aW5nIExpc3QgLQotICogQWRkVG9Ob3dQbGF5aW5nKi8KLSNkZWZpbmUgQVZSQ19TVFNfTk9XX0xJU1RfRlVMTCAweDBlCi0vKiBTZWFyY2ggTm90IFN1cHBvcnRlZCAtIFRoZSBCcm93c2VkIE1lZGlhIFBsYXllciBkb2VzIG5vdCBzdXBwb3J0IHNlYXJjaCAtCi0gKiBTZWFyY2ggKi8KLSNkZWZpbmUgQVZSQ19TVFNfU0VBUkNIX05PVF9TVVAgMHgwZgotLyogU2VhcmNoIGluIFByb2dyZXNzIC0gQSBzZWFyY2ggb3BlcmF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgLSBTZWFyY2gqLwotI2RlZmluZSBBVlJDX1NUU19TRUFSQ0hfQlVTWSAweDEwCi0vKiBJbnZhbGlkIFBsYXllciBJZCAtIFRoZSBzcGVjaWZpZWQgUGxheWVyIElkIGRvZXMgbm90IHJlZmVyIHRvIGEgdmFsaWQgcGxheWVyCi0gKiAtIFNldEFkZHJlc3NlZFBsYXllciwgU2V0QnJvd3NlZFBsYXllciovCi0jZGVmaW5lIEFWUkNfU1RTX0JBRF9QTEFZRVJfSUQgMHgxMQotLyogUGxheWVyIE5vdCBCcm93c2FibGUgLSBUaGUgUGxheWVyIElkIHN1cHBsaWVkIHJlZmVycyB0byBhIE1lZGlhIFBsYXllciB3aGljaAotICogZG9lcyBub3Qgc3VwcG9ydCBicm93c2luZyAtIFNldEJyb3dzZWRQbGF5ZXIgKi8KLSNkZWZpbmUgQVZSQ19TVFNfUExBWUVSX05fQlIgMHgxMgotLyogUGxheWVyIE5vdCBBZGRyZXNzZWQuICBUaGUgUGxheWVyIElkIHN1cHBsaWVkIHJlZmVycyB0byBhIHBsYXllciB3aGljaCBpcyBub3QKLSAqIGN1cnJlbnRseSBhZGRyZXNzZWQsIGFuZCB0aGUgY29tbWFuZCBpcyBub3QgYWJsZSB0byBiZSBwZXJmb3JtZWQgaWYgdGhlCi0gKiBwbGF5ZXIgaXMgbm90IHNldCBhcyBhZGRyZXNzZWQgLSBTZWFyY2gsIFNldEJyb3dzZWRQbGF5ZXIqLwotI2RlZmluZSBBVlJDX1NUU19QTEFZRVJfTl9BRERSIDB4MTMKLS8qIE5vIHZhbGlkIFNlYXJjaCBSZXN1bHRzIC0gVGhlIFNlYXJjaCByZXN1bHQgbGlzdCBkb2VzIG5vdCBjb250YWluIHZhbGlkCi0gKiBlbnRyaWVzLCBlLmcuIGFmdGVyIGJlaW5nIGludmFsaWRhdGVkIGR1ZSB0byBjaGFuZ2Ugb2YgYnJvd3NlZCBwbGF5ZXIgLQotICogR2V0Rm9sZGVySXRlbXMgKi8KLSNkZWZpbmUgQVZSQ19TVFNfQkFEX1NFQVJDSF9SRVMgMHgxNAotLyogTm8gYXZhaWxhYmxlIHBsYXllcnMgQUxMICovCi0jZGVmaW5lIEFWUkNfU1RTX05PX0FWQUxfUExBWUVSIDB4MTUKLS8qIEFkZHJlc3NlZCBQbGF5ZXIgQ2hhbmdlZCAtIFJlZ2lzdGVyIE5vdGlmaWNhdGlvbiAqLwotI2RlZmluZSBBVlJDX1NUU19BRERSX1BMQVlFUl9DSEcgMHgxNgotdHlwZWRlZiB1aW50OF90IHRBVlJDX1NUUzsKLQotLyogRGVmaW5lIHRoZSBDYXBhYmlsaXR5IElEcwotKi8KLSNkZWZpbmUgQVZSQ19DQVBfQ09NUEFOWV9JRCAweDAyCi0jZGVmaW5lIEFWUkNfQ0FQX0VWRU5UU19TVVBQT1JURUQgMHgwMwotI2RlZmluZSBBVlJDX0NPTVBBTllfSURfTEVOIDMKLSNkZWZpbmUgQVZSQ19DQVBBQklMSVRZX09GRlNFVCAyCi0KLS8qIERlZmluZSB0aGUgUGxheWVyIEFwcGxpY2F0aW9uIFNldHRpbmdzIElEcwotKi8KLSNkZWZpbmUgQVZSQ19QTEFZRVJfU0VUVElOR19FUVVBTElaRVIgMHgwMQotI2RlZmluZSBBVlJDX1BMQVlFUl9TRVRUSU5HX1JFUEVBVCAweDAyCi0jZGVmaW5lIEFWUkNfUExBWUVSX1NFVFRJTkdfU0hVRkZMRSAweDAzCi0jZGVmaW5lIEFWUkNfUExBWUVSX1NFVFRJTkdfU0NBTiAweDA0Ci0jZGVmaW5lIEFWUkNfUExBWUVSX1NFVFRJTkdfTE9XX01FTlVfRVhUIDB4ODAKLSNkZWZpbmUgQVZSQ19QTEFZRVJfU0VUVElOR19ISUdIX01FTlVfRVhUIDB4ZmYKLQotLyogRGVmaW5lIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIFBsYXllciBBcHBsaWNhdGlvbiBTZXR0aW5ncwotKi8KLSNkZWZpbmUgQVZSQ19QTEFZRVJfVkFMX09GRiAweDAxCi0jZGVmaW5lIEFWUkNfUExBWUVSX1ZBTF9PTiAweDAyCi0jZGVmaW5lIEFWUkNfUExBWUVSX1ZBTF9TSU5HTEVfUkVQRUFUIDB4MDIKLSNkZWZpbmUgQVZSQ19QTEFZRVJfVkFMX0FMTF9SRVBFQVQgMHgwMwotI2RlZmluZSBBVlJDX1BMQVlFUl9WQUxfR1JPVVBfUkVQRUFUIDB4MDQKLSNkZWZpbmUgQVZSQ19QTEFZRVJfVkFMX0FMTF9TSFVGRkxFIDB4MDIKLSNkZWZpbmUgQVZSQ19QTEFZRVJfVkFMX0dST1VQX1NIVUZGTEUgMHgwMwotI2RlZmluZSBBVlJDX1BMQVlFUl9WQUxfQUxMX1NDQU4gMHgwMgotI2RlZmluZSBBVlJDX1BMQVlFUl9WQUxfR1JPVVBfU0NBTiAweDAzCi0KLS8qIERlZmluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIEJhdHRlcnkgU3RhdHVzIFBEVQotKi8KLSNkZWZpbmUgQVZSQ19CQVRURVJZX1NUQVRVU19OT1JNQUwgMHgwMAotI2RlZmluZSBBVlJDX0JBVFRFUllfU1RBVFVTX1dBUk5JTkcgMHgwMQotI2RlZmluZSBBVlJDX0JBVFRFUllfU1RBVFVTX0NSSVRJQ0FMIDB4MDIKLSNkZWZpbmUgQVZSQ19CQVRURVJZX1NUQVRVU19FWFRFUk5BTCAweDAzCi0jZGVmaW5lIEFWUkNfQkFUVEVSWV9TVEFUVVNfRlVMTF9DSEFSR0UgMHgwNAotdHlwZWRlZiB1aW50OF90IHRBVlJDX0JBVFRFUllfU1RBVFVTOwotCi0vKiBEZWZpbmUgY2hhcmFjdGVyIHNldCAqLwotI2RlZmluZSBBVlJDX0NIQVJfU0VUX1NJWkUgMgotCi0vKiBEZWZpbmUgdGhlIE1lZGlhIEF0dHJpYnV0ZSBJRHMKLSovCi0jZGVmaW5lIEFWUkNfTUVESUFfQVRUUl9JRF9USVRMRSAweDAwMDAwMDAxCi0jZGVmaW5lIEFWUkNfTUVESUFfQVRUUl9JRF9BUlRJU1QgMHgwMDAwMDAwMgotI2RlZmluZSBBVlJDX01FRElBX0FUVFJfSURfQUxCVU0gMHgwMDAwMDAwMwotI2RlZmluZSBBVlJDX01FRElBX0FUVFJfSURfVFJBQ0tfTlVNIDB4MDAwMDAwMDQKLSNkZWZpbmUgQVZSQ19NRURJQV9BVFRSX0lEX05VTV9UUkFDS1MgMHgwMDAwMDAwNQotI2RlZmluZSBBVlJDX01FRElBX0FUVFJfSURfR0VOUkUgMHgwMDAwMDAwNgotI2RlZmluZSBBVlJDX01FRElBX0FUVFJfSURfUExBWUlOR19USU1FIDB4MDAwMDAwMDcgLyogaW4gbWlsaXNlY29uZHMgKi8KLSNkZWZpbmUgQVZSQ19NRURJQV9BVFRSX0lEX0NPVkVSX0FSVFdPUktfSEFORExFIDB4MDAwMDAwMDgKLSNkZWZpbmUgQVZSQ19NQVhfTlVNX01FRElBX0FUVFJfSUQgOAotCi0vKiBEZWZpbmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBwbGF5IHN0YXRlCi0qLwotI2RlZmluZSBBVlJDX1BMQVlTVEFURV9SRVNQX01TR19TSVpFIDkKLSNkZWZpbmUgQVZSQ19QTEFZU1RBVEVfU1RPUFBFRCAweDAwICAvKiBTdG9wcGVkICovCi0jZGVmaW5lIEFWUkNfUExBWVNUQVRFX1BMQVlJTkcgMHgwMSAgLyogUGxheWluZyAqLwotI2RlZmluZSBBVlJDX1BMQVlTVEFURV9QQVVTRUQgMHgwMiAgIC8qIFBhdXNlZCAgKi8KLSNkZWZpbmUgQVZSQ19QTEFZU1RBVEVfRldEX1NFRUsgMHgwMyAvKiBGd2QgU2VlayovCi0jZGVmaW5lIEFWUkNfUExBWVNUQVRFX1JFVl9TRUVLIDB4MDQgLyogUmV2IFNlZWsqLwotI2RlZmluZSBBVlJDX1BMQVlTVEFURV9FUlJPUiAweEZGICAgIC8qIEVycm9yICAgKi8KLXR5cGVkZWYgdWludDhfdCB0QVZSQ19QTEFZU1RBVEU7Ci0KLS8qIERlZmluZSB0aGUgZXZlbnRzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIG5vdGlmaWNhdGlvbnMKLSovCi0jZGVmaW5lIEFWUkNfRVZUX1BMQVlfU1RBVFVTX0NIQU5HRSAweDAxCi0jZGVmaW5lIEFWUkNfRVZUX1RSQUNLX0NIQU5HRSAweDAyCi0jZGVmaW5lIEFWUkNfRVZUX1RSQUNLX1JFQUNIRURfRU5EIDB4MDMKLSNkZWZpbmUgQVZSQ19FVlRfVFJBQ0tfUkVBQ0hFRF9TVEFSVCAweDA0Ci0jZGVmaW5lIEFWUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQgMHgwNQotI2RlZmluZSBBVlJDX0VWVF9CQVRURVJZX1NUQVRVU19DSEFOR0UgMHgwNgotI2RlZmluZSBBVlJDX0VWVF9TWVNURU1fU1RBVFVTX0NIQU5HRSAweDA3Ci0jZGVmaW5lIEFWUkNfRVZUX0FQUF9TRVRUSU5HX0NIQU5HRSAweDA4Ci0vKiBhZGRlZCBpbiBBVlJDUCAxLjQgKi8KLSNkZWZpbmUgQVZSQ19FVlRfTk9XX1BMQVlJTkdfQ0hBTkdFIDB4MDkKLSNkZWZpbmUgQVZSQ19FVlRfQVZBTF9QTEFZRVJTX0NIQU5HRSAweDBhCi0jZGVmaW5lIEFWUkNfRVZUX0FERFJfUExBWUVSX0NIQU5HRSAweDBiCi0jZGVmaW5lIEFWUkNfRVZUX1VJRFNfQ0hBTkdFIDB4MGMKLSNkZWZpbmUgQVZSQ19FVlRfVk9MVU1FX0NIQU5HRSAweDBkCi0KLS8qIHRoZSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIG5vdGlmaWNhdGlvbnMgKi8KLSNkZWZpbmUgQVZSQ19OVU1fTk9USUZfRVZFTlRTIDB4MGQKLQotI2RlZmluZSBBVlJDX0VWVF9NU0dfTEVOXzEgMHgwMQotI2RlZmluZSBBVlJDX0VWVF9NU0dfTEVOXzIgMHgwMgotI2RlZmluZSBBVlJDX0VWVF9NU0dfTEVOXzUgMHgwNQotI2RlZmluZSBBVlJDX0VWVF9NU0dfTEVOXzkgMHgwOQotCi0jZGVmaW5lIEFWUkNfTUFYX1ZPTFVNRSAweDdGCi0KLS8qIERlZmluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHN5c3RlbSBzdGF0dXMKLSovCi0jZGVmaW5lIEFWUkNfU1lTVEVNU1RBVEVfUFdSX09OIDB4MDAKLSNkZWZpbmUgQVZSQ19TWVNURU1TVEFURV9QV1JfT0ZGIDB4MDEKLSNkZWZpbmUgQVZSQ19TWVNURU1TVEFURV9QV1JfVU5QTFVHR0VEIDB4MDIKLXR5cGVkZWYgdWludDhfdCB0QVZSQ19TWVNURU1TVEFURTsKLQotLyogdGhlIGZyZXF1ZW50bHkgdXNlZCBjaGFyYWN0ZXIgc2V0IGlkcyAqLwotI2RlZmluZSBBVlJDX0NIQVJTRVRfSURfQVNDSUkgKCh1aW50MTZfdCkweDAwMDMpIC8qIEFTQ0lJICovCi0jZGVmaW5lIEFWUkNfQ0hBUlNFVF9JRF9VVEY4ICgodWludDE2X3QpMHgwMDZhKSAgLyogVVRGLTggKi8KLSNkZWZpbmUgQVZSQ19DSEFSU0VUX0lEX1VURjE2ICgodWludDE2X3QpMHgwM2Y3KSAvKiAxMDE1ICovCi0jZGVmaW5lIEFWUkNfQ0hBUlNFVF9JRF9VVEYzMiAoKHVpbnQxNl90KTB4MDNmOSkgLyogMTAxNyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBBZHZhbmNlZCBDb250cm9sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQVZSQ19JVEVNX1BMQVlFUiAweDAxCi0jZGVmaW5lIEFWUkNfSVRFTV9GT0xERVIgMHgwMgotI2RlZmluZSBBVlJDX0lURU1fTUVESUEgMHgwMwotCi0vKiBNZWRpYSBQbGF5ZXIgSXRlbSAtIENvbnRhaW5zIGFsbCBhdmFpbGFibGUgbWVkaWEgcGxheWVycyAqLwotI2RlZmluZSBBVlJDX1NDT1BFX1BMQVlFUl9MSVNUIDB4MDAKLS8qIEZvbGRlciBJdGVtLCBNZWRpYSBFbGVtZW50IEl0ZW0gLSBUaGUgdmlydHVhbCBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgdGhlIG1lZGlhCi0gKiBjb250ZW50IG9mIHRoZSBicm93c2VkIHBsYXllciAqLwotI2RlZmluZSBBVlJDX1NDT1BFX0ZJTEVfU1lTVEVNIDB4MDEKLS8qIE1lZGlhIEVsZW1lbnQgSXRlbSAgVGhlIHJlc3VsdHMgb2YgYSBzZWFyY2ggb3BlcmF0aW9uIG9uIHRoZSBicm93c2VkIHBsYXllcgotICovCi0jZGVmaW5lIEFWUkNfU0NPUEVfU0VBUkNIIDB4MDIKLS8qIE1lZGlhIEVsZW1lbnQgSXRlbSAgVGhlIE5vdyBQbGF5aW5nIGxpc3QgKG9yIHF1ZXVlKSBvZiB0aGUgYWRkcmVzc2VkIHBsYXllcgotICovCi0jZGVmaW5lIEFWUkNfU0NPUEVfTk9XX1BMQVlJTkcgMHgwMwotCi0jZGVmaW5lIEFWUkNfRk9MREVSX0lURU1fQ09VTlRfTk9ORSAweEZGCi0KLS8qIGZvbGRlciB0eXBlICovCi0jZGVmaW5lIEFWUkNfRk9MREVSX1RZUEVfTUlYRUQgMHgwMAotI2RlZmluZSBBVlJDX0ZPTERFUl9UWVBFX1RJVExFUyAweDAxCi0jZGVmaW5lIEFWUkNfRk9MREVSX1RZUEVfQUxOVU1TIDB4MDIKLSNkZWZpbmUgQVZSQ19GT0xERVJfVFlQRV9BUlRJU1RTIDB4MDMKLSNkZWZpbmUgQVZSQ19GT0xERVJfVFlQRV9HRU5SRVMgMHgwNAotI2RlZmluZSBBVlJDX0ZPTERFUl9UWVBFX1BMQVlMSVNUUyAweDA1Ci0jZGVmaW5lIEFWUkNfRk9MREVSX1RZUEVfWUVBUlMgMHgwNgotCi0vKiBtYWpvciBwbGF5ZXIgdHlwZSAqLwotI2RlZmluZSBBVlJDX01KX1RZUEVfQVVESU8gMHgwMSAgICAvKiBBdWRpbyAqLwotI2RlZmluZSBBVlJDX01KX1RZUEVfVklERU8gMHgwMiAgICAvKiBWaWRlbyAqLwotI2RlZmluZSBBVlJDX01KX1RZUEVfQkNfQVVESU8gMHgwNCAvKiBCcm9hZGNhc3RpbmcgQXVkaW8gKi8KLSNkZWZpbmUgQVZSQ19NSl9UWVBFX0JDX1ZJREVPIDB4MDggLyogQnJvYWRjYXN0aW5nIFZpZGVvICovCi0jZGVmaW5lIEFWUkNfTUpfVFlQRV9JTlZBTElEIDB4RjAKLQotLyogcGxheWVyIHN1YiB0eXBlICovCi0jZGVmaW5lIEFWUkNfU1VCX1RZUEVfTk9ORSAweDAwCi0jZGVmaW5lIEFWUkNfU1VCX1RZUEVfQVVESU9fQk9PSyAweDAxIC8qIEF1ZGlvIEJvb2sgKi8KLSNkZWZpbmUgQVZSQ19TVUJfVFlQRV9QT0RDQVNUIDB4MDIgICAgLyogUG9kY2FzdCAqLwotI2RlZmluZSBBVlJDX1NVQl9UWVBFX0lOVkFMSUQgMHhGQwotCi0vKiBtZWRpYSBpdGVtIC0gbWVkaWEgdHlwZSAqLwotI2RlZmluZSBBVlJDX01FRElBX1RZUEVfQVVESU8gMHgwMAotI2RlZmluZSBBVlJDX01FRElBX1RZUEVfVklERU8gMHgwMQotCi0jZGVmaW5lIEFWUkNfRElSX1VQIDB4MDAgICAvKiBGb2xkZXIgVXAgKi8KLSNkZWZpbmUgQVZSQ19ESVJfRE9XTiAweDAxIC8qIEZvbGRlciBEb3duICovCi0KLSNkZWZpbmUgQVZSQ19VSURfU0laRSA4Ci10eXBlZGVmIHVpbnQ4X3QgdEFWUkNfVUlEW0FWUkNfVUlEX1NJWkVdOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBwbGF5ZXIgYXR0cmlidXRlIC0gc3VwcG9ydGVkIGZlYXR1cmVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQVZSQ19QRl9TRUxFQ1RfQklUX05PIDAKLSNkZWZpbmUgQVZSQ19QRl9TRUxFQ1RfTUFTSyAweDAxCi0jZGVmaW5lIEFWUkNfUEZfU0VMRUNUX09GRiAwCi0jZGVmaW5lIEFWUkNfUEZfU0VMRUNUX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9TRUxFQ1RfT0ZGXSAmIEFWUkNfUEZfU0VMRUNUX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9VUF9CSVRfTk8gMQotI2RlZmluZSBBVlJDX1BGX1VQX01BU0sgMHgwMgotI2RlZmluZSBBVlJDX1BGX1VQX09GRiAwCi0jZGVmaW5lIEFWUkNfUEZfVVBfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl9VUF9PRkZdICYgQVZSQ19QRl9VUF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfRE9XTl9CSVRfTk8gMgotI2RlZmluZSBBVlJDX1BGX0RPV05fTUFTSyAweDA0Ci0jZGVmaW5lIEFWUkNfUEZfRE9XTl9PRkYgMAotI2RlZmluZSBBVlJDX1BGX0RPV05fU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl9ET1dOX09GRl0gJiBBVlJDX1BGX0RPV05fTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0xFRlRfQklUX05PIDMKLSNkZWZpbmUgQVZSQ19QRl9MRUZUX01BU0sgMHgwOAotI2RlZmluZSBBVlJDX1BGX0xFRlRfT0ZGIDAKLSNkZWZpbmUgQVZSQ19QRl9MRUZUX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfTEVGVF9PRkZdICYgQVZSQ19QRl9MRUZUX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9SSUdIVF9CSVRfTk8gNAotI2RlZmluZSBBVlJDX1BGX1JJR0hUX01BU0sgMHgxMAotI2RlZmluZSBBVlJDX1BGX1JJR0hUX09GRiAwCi0jZGVmaW5lIEFWUkNfUEZfUklHSFRfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl9SSUdIVF9PRkZdICYgQVZSQ19QRl9SSUdIVF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUklHSFRVUF9CSVRfTk8gNQotI2RlZmluZSBBVlJDX1BGX1JJR0hUVVBfTUFTSyAweDIwCi0jZGVmaW5lIEFWUkNfUEZfUklHSFRVUF9PRkYgMAotI2RlZmluZSBBVlJDX1BGX1JJR0hUVVBfU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX1JJR0hUVVBfT0ZGXSAmIEFWUkNfUEZfUklHSFRVUF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUklHSFRET1dOX0JJVF9OTyA2Ci0jZGVmaW5lIEFWUkNfUEZfUklHSFRET1dOX01BU0sgMHg0MAotI2RlZmluZSBBVlJDX1BGX1JJR0hURE9XTl9PRkYgMAotI2RlZmluZSBBVlJDX1BGX1JJR0hURE9XTl9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfUklHSFRET1dOX09GRl0gJiBBVlJDX1BGX1JJR0hURE9XTl9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfTEVGVFVQX0JJVF9OTyA3Ci0jZGVmaW5lIEFWUkNfUEZfTEVGVFVQX01BU0sgMHg4MAotI2RlZmluZSBBVlJDX1BGX0xFRlRVUF9PRkYgMAotI2RlZmluZSBBVlJDX1BGX0xFRlRVUF9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfTEVGVFVQX09GRl0gJiBBVlJDX1BGX0xFRlRVUF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfTEVGVERPV05fQklUX05PIDgKLSNkZWZpbmUgQVZSQ19QRl9MRUZURE9XTl9NQVNLIDB4MDEKLSNkZWZpbmUgQVZSQ19QRl9MRUZURE9XTl9PRkYgMQotI2RlZmluZSBBVlJDX1BGX0xFRlRET1dOX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9MRUZURE9XTl9PRkZdICYgQVZSQ19QRl9MRUZURE9XTl9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUk9PVF9NRU5VX0JJVF9OTyA5Ci0jZGVmaW5lIEFWUkNfUEZfUk9PVF9NRU5VX01BU0sgMHgwMgotI2RlZmluZSBBVlJDX1BGX1JPT1RfTUVOVV9PRkYgMQotI2RlZmluZSBBVlJDX1BGX1JPT1RfTUVOVV9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfUk9PVF9NRU5VX09GRl0gJiBBVlJDX1BGX1JPT1RfTUVOVV9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfU0VUVVBfTUVOVV9CSVRfTk8gMTAKLSNkZWZpbmUgQVZSQ19QRl9TRVRVUF9NRU5VX01BU0sgMHgwNAotI2RlZmluZSBBVlJDX1BGX1NFVFVQX01FTlVfT0ZGIDEKLSNkZWZpbmUgQVZSQ19QRl9TRVRVUF9NRU5VX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9TRVRVUF9NRU5VX09GRl0gJiBBVlJDX1BGX1NFVFVQX01FTlVfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0NPTlRFTlRTX01FTlVfQklUX05PIDExCi0jZGVmaW5lIEFWUkNfUEZfQ09OVEVOVFNfTUVOVV9NQVNLIDB4MDgKLSNkZWZpbmUgQVZSQ19QRl9DT05URU5UU19NRU5VX09GRiAxCi0jZGVmaW5lIEFWUkNfUEZfQ09OVEVOVFNfTUVOVV9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfQ09OVEVOVFNfTUVOVV9PRkZdICYgQVZSQ19QRl9DT05URU5UU19NRU5VX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9GQVZPUklURV9NRU5VX0JJVF9OTyAxMgotI2RlZmluZSBBVlJDX1BGX0ZBVk9SSVRFX01FTlVfTUFTSyAweDEwCi0jZGVmaW5lIEFWUkNfUEZfRkFWT1JJVEVfTUVOVV9PRkYgMQotI2RlZmluZSBBVlJDX1BGX0ZBVk9SSVRFX01FTlVfU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX0ZBVk9SSVRFX01FTlVfT0ZGXSAmIEFWUkNfUEZfRkFWT1JJVEVfTUVOVV9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfRVhJVF9CSVRfTk8gMTMKLSNkZWZpbmUgQVZSQ19QRl9FWElUX01BU0sgMHgyMAotI2RlZmluZSBBVlJDX1BGX0VYSVRfT0ZGIDEKLSNkZWZpbmUgQVZSQ19QRl9FWElUX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfRVhJVF9PRkZdICYgQVZSQ19QRl9FWElUX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl8wX0JJVF9OTyAxNAotI2RlZmluZSBBVlJDX1BGXzBfTUFTSyAweDQwCi0jZGVmaW5lIEFWUkNfUEZfMF9PRkYgMQotI2RlZmluZSBBVlJDX1BGXzBfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl8wX09GRl0gJiBBVlJDX1BGXzBfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGXzFfQklUX05PIDE1Ci0jZGVmaW5lIEFWUkNfUEZfMV9NQVNLIDB4ODAKLSNkZWZpbmUgQVZSQ19QRl8xX09GRiAxCi0jZGVmaW5lIEFWUkNfUEZfMV9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGXzFfT0ZGXSAmIEFWUkNfUEZfMV9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfMl9CSVRfTk8gMTYKLSNkZWZpbmUgQVZSQ19QRl8yX01BU0sgMHgwMQotI2RlZmluZSBBVlJDX1BGXzJfT0ZGIDIKLSNkZWZpbmUgQVZSQ19QRl8yX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfMl9PRkZdICYgQVZSQ19QRl8yX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl8zX0JJVF9OTyAxNwotI2RlZmluZSBBVlJDX1BGXzNfTUFTSyAweDAyCi0jZGVmaW5lIEFWUkNfUEZfM19PRkYgMgotI2RlZmluZSBBVlJDX1BGXzNfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl8zX09GRl0gJiBBVlJDX1BGXzNfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGXzRfQklUX05PIDE4Ci0jZGVmaW5lIEFWUkNfUEZfNF9NQVNLIDB4MDQKLSNkZWZpbmUgQVZSQ19QRl80X09GRiAyCi0jZGVmaW5lIEFWUkNfUEZfNF9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGXzRfT0ZGXSAmIEFWUkNfUEZfNF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfNV9CSVRfTk8gMTkKLSNkZWZpbmUgQVZSQ19QRl81X01BU0sgMHgwOAotI2RlZmluZSBBVlJDX1BGXzVfT0ZGIDIKLSNkZWZpbmUgQVZSQ19QRl81X1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfNV9PRkZdICYgQVZSQ19QRl81X01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl82X0JJVF9OTyAyMAotI2RlZmluZSBBVlJDX1BGXzZfTUFTSyAweDEwCi0jZGVmaW5lIEFWUkNfUEZfNl9PRkYgMgotI2RlZmluZSBBVlJDX1BGXzZfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl82X09GRl0gJiBBVlJDX1BGXzZfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGXzdfQklUX05PIDIxCi0jZGVmaW5lIEFWUkNfUEZfN19NQVNLIDB4MjAKLSNkZWZpbmUgQVZSQ19QRl83X09GRiAyCi0jZGVmaW5lIEFWUkNfUEZfN19TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGXzdfT0ZGXSAmIEFWUkNfUEZfN19NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfOF9CSVRfTk8gMjIKLSNkZWZpbmUgQVZSQ19QRl84X01BU0sgMHg0MAotI2RlZmluZSBBVlJDX1BGXzhfT0ZGIDIKLSNkZWZpbmUgQVZSQ19QRl84X1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfOF9PRkZdICYgQVZSQ19QRl84X01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl85X0JJVF9OTyAyMwotI2RlZmluZSBBVlJDX1BGXzlfTUFTSyAweDgwCi0jZGVmaW5lIEFWUkNfUEZfOV9PRkYgMgotI2RlZmluZSBBVlJDX1BGXzlfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl85X09GRl0gJiBBVlJDX1BGXzlfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0RPVF9CSVRfTk8gMjQKLSNkZWZpbmUgQVZSQ19QRl9ET1RfTUFTSyAweDAxCi0jZGVmaW5lIEFWUkNfUEZfRE9UX09GRiAzCi0jZGVmaW5lIEFWUkNfUEZfRE9UX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfRE9UX09GRl0gJiBBVlJDX1BGX0RPVF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfRU5URVJfQklUX05PIDI1Ci0jZGVmaW5lIEFWUkNfUEZfRU5URVJfTUFTSyAweDAyCi0jZGVmaW5lIEFWUkNfUEZfRU5URVJfT0ZGIDMKLSNkZWZpbmUgQVZSQ19QRl9FTlRFUl9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX0VOVEVSX09GRl0gJiBBVlJDX1BGX0VOVEVSX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9DTEVBUl9CSVRfTk8gMjYKLSNkZWZpbmUgQVZSQ19QRl9DTEVBUl9NQVNLIDB4MDQKLSNkZWZpbmUgQVZSQ19QRl9DTEVBUl9PRkYgMwotI2RlZmluZSBBVlJDX1BGX0NMRUFSX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfQ0xFQVJfT0ZGXSAmIEFWUkNfUEZfQ0xFQVJfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0NITkxfVVBfQklUX05PIDI3Ci0jZGVmaW5lIEFWUkNfUEZfQ0hOTF9VUF9NQVNLIDB4MDgKLSNkZWZpbmUgQVZSQ19QRl9DSE5MX1VQX09GRiAzCi0jZGVmaW5lIEFWUkNfUEZfQ0hOTF9VUF9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfQ0hOTF9VUF9PRkZdICYgQVZSQ19QRl9DSE5MX1VQX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9DSE5MX0RPV05fQklUX05PIDI4Ci0jZGVmaW5lIEFWUkNfUEZfQ0hOTF9ET1dOX01BU0sgMHgxMAotI2RlZmluZSBBVlJDX1BGX0NITkxfRE9XTl9PRkYgMwotI2RlZmluZSBBVlJDX1BGX0NITkxfRE9XTl9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfQ0hOTF9ET1dOX09GRl0gJiBBVlJDX1BGX0NITkxfRE9XTl9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUFJFVl9DSE5MX0JJVF9OTyAyOQotI2RlZmluZSBBVlJDX1BGX1BSRVZfQ0hOTF9NQVNLIDB4MjAKLSNkZWZpbmUgQVZSQ19QRl9QUkVWX0NITkxfT0ZGIDMKLSNkZWZpbmUgQVZSQ19QRl9QUkVWX0NITkxfU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX1BSRVZfQ0hOTF9PRkZdICYgQVZSQ19QRl9QUkVWX0NITkxfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX1NPVU5EX1NFTF9CSVRfTk8gMzAKLSNkZWZpbmUgQVZSQ19QRl9TT1VORF9TRUxfTUFTSyAweDQwCi0jZGVmaW5lIEFWUkNfUEZfU09VTkRfU0VMX09GRiAzCi0jZGVmaW5lIEFWUkNfUEZfU09VTkRfU0VMX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9TT1VORF9TRUxfT0ZGXSAmIEFWUkNfUEZfU09VTkRfU0VMX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9JTlBVVF9TRUxfQklUX05PIDMxCi0jZGVmaW5lIEFWUkNfUEZfSU5QVVRfU0VMX01BU0sgMHg4MAotI2RlZmluZSBBVlJDX1BGX0lOUFVUX1NFTF9PRkYgMwotI2RlZmluZSBBVlJDX1BGX0lOUFVUX1NFTF9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfSU5QVVRfU0VMX09GRl0gJiBBVlJDX1BGX0lOUFVUX1NFTF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfRElTUF9JTkZPX0JJVF9OTyAzMgotI2RlZmluZSBBVlJDX1BGX0RJU1BfSU5GT19NQVNLIDB4MDEKLSNkZWZpbmUgQVZSQ19QRl9ESVNQX0lORk9fT0ZGIDQKLSNkZWZpbmUgQVZSQ19QRl9ESVNQX0lORk9fU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX0RJU1BfSU5GT19PRkZdICYgQVZSQ19QRl9ESVNQX0lORk9fTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0hFTFBfQklUX05PIDMzCi0jZGVmaW5lIEFWUkNfUEZfSEVMUF9NQVNLIDB4MDIKLSNkZWZpbmUgQVZSQ19QRl9IRUxQX09GRiA0Ci0jZGVmaW5lIEFWUkNfUEZfSEVMUF9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX0hFTFBfT0ZGXSAmIEFWUkNfUEZfSEVMUF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUEFHRV9VUF9CSVRfTk8gMzQKLSNkZWZpbmUgQVZSQ19QRl9QQUdFX1VQX01BU0sgMHgwNAotI2RlZmluZSBBVlJDX1BGX1BBR0VfVVBfT0ZGIDQKLSNkZWZpbmUgQVZSQ19QRl9QQUdFX1VQX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9QQUdFX1VQX09GRl0gJiBBVlJDX1BGX1BBR0VfVVBfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX1BBR0VfRE9XTl9CSVRfTk8gMzUKLSNkZWZpbmUgQVZSQ19QRl9QQUdFX0RPV05fTUFTSyAweDA4Ci0jZGVmaW5lIEFWUkNfUEZfUEFHRV9ET1dOX09GRiA0Ci0jZGVmaW5lIEFWUkNfUEZfUEFHRV9ET1dOX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9QQUdFX0RPV05fT0ZGXSAmIEFWUkNfUEZfUEFHRV9ET1dOX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9QT1dFUl9CSVRfTk8gMzYKLSNkZWZpbmUgQVZSQ19QRl9QT1dFUl9NQVNLIDB4MTAKLSNkZWZpbmUgQVZSQ19QRl9QT1dFUl9PRkYgNAotI2RlZmluZSBBVlJDX1BGX1BPV0VSX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfUE9XRVJfT0ZGXSAmIEFWUkNfUEZfUE9XRVJfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX1ZPTF9VUF9CSVRfTk8gMzcKLSNkZWZpbmUgQVZSQ19QRl9WT0xfVVBfTUFTSyAweDIwCi0jZGVmaW5lIEFWUkNfUEZfVk9MX1VQX09GRiA0Ci0jZGVmaW5lIEFWUkNfUEZfVk9MX1VQX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9WT0xfVVBfT0ZGXSAmIEFWUkNfUEZfVk9MX1VQX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9WT0xfRE9XTl9CSVRfTk8gMzgKLSNkZWZpbmUgQVZSQ19QRl9WT0xfRE9XTl9NQVNLIDB4NDAKLSNkZWZpbmUgQVZSQ19QRl9WT0xfRE9XTl9PRkYgNAotI2RlZmluZSBBVlJDX1BGX1ZPTF9ET1dOX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9WT0xfRE9XTl9PRkZdICYgQVZSQ19QRl9WT0xfRE9XTl9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfTVVURV9CSVRfTk8gMzkKLSNkZWZpbmUgQVZSQ19QRl9NVVRFX01BU0sgMHg4MAotI2RlZmluZSBBVlJDX1BGX01VVEVfT0ZGIDQKLSNkZWZpbmUgQVZSQ19QRl9NVVRFX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfTVVURV9PRkZdICYgQVZSQ19QRl9NVVRFX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9QTEFZX0JJVF9OTyA0MAotI2RlZmluZSBBVlJDX1BGX1BMQVlfTUFTSyAweDAxCi0jZGVmaW5lIEFWUkNfUEZfUExBWV9PRkYgNQotI2RlZmluZSBBVlJDX1BGX1BMQVlfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl9QTEFZX09GRl0gJiBBVlJDX1BGX1BMQVlfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX1NUT1BfQklUX05PIDQxCi0jZGVmaW5lIEFWUkNfUEZfU1RPUF9NQVNLIDB4MDIKLSNkZWZpbmUgQVZSQ19QRl9TVE9QX09GRiA1Ci0jZGVmaW5lIEFWUkNfUEZfU1RPUF9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX1NUT1BfT0ZGXSAmIEFWUkNfUEZfU1RPUF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUEFVU0VfQklUX05PIDQyCi0jZGVmaW5lIEFWUkNfUEZfUEFVU0VfTUFTSyAweDA0Ci0jZGVmaW5lIEFWUkNfUEZfUEFVU0VfT0ZGIDUKLSNkZWZpbmUgQVZSQ19QRl9QQVVTRV9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX1BBVVNFX09GRl0gJiBBVlJDX1BGX1BBVVNFX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9SRUNPUkRfQklUX05PIDQzCi0jZGVmaW5lIEFWUkNfUEZfUkVDT1JEX01BU0sgMHgwOAotI2RlZmluZSBBVlJDX1BGX1JFQ09SRF9PRkYgNQotI2RlZmluZSBBVlJDX1BGX1JFQ09SRF9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfUkVDT1JEX09GRl0gJiBBVlJDX1BGX1JFQ09SRF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfUkVXSU5EX0JJVF9OTyA0NAotI2RlZmluZSBBVlJDX1BGX1JFV0lORF9NQVNLIDB4MTAKLSNkZWZpbmUgQVZSQ19QRl9SRVdJTkRfT0ZGIDUKLSNkZWZpbmUgQVZSQ19QRl9SRVdJTkRfU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX1JFV0lORF9PRkZdICYgQVZSQ19QRl9SRVdJTkRfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0ZBU1RfRldEX0JJVF9OTyA0NQotI2RlZmluZSBBVlJDX1BGX0ZBU1RfRldEX01BU0sgMHgyMAotI2RlZmluZSBBVlJDX1BGX0ZBU1RfRldEX09GRiA1Ci0jZGVmaW5lIEFWUkNfUEZfRkFTVF9GV0RfU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX0ZBU1RfRldEX09GRl0gJiBBVlJDX1BGX0ZBU1RfRldEX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9FSkVDVF9CSVRfTk8gNDYKLSNkZWZpbmUgQVZSQ19QRl9FSkVDVF9NQVNLIDB4NDAKLSNkZWZpbmUgQVZSQ19QRl9FSkVDVF9PRkYgNQotI2RlZmluZSBBVlJDX1BGX0VKRUNUX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfRUpFQ1RfT0ZGXSAmIEFWUkNfUEZfRUpFQ1RfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0ZPUldBUkRfQklUX05PIDQ3Ci0jZGVmaW5lIEFWUkNfUEZfRk9SV0FSRF9NQVNLIDB4ODAKLSNkZWZpbmUgQVZSQ19QRl9GT1JXQVJEX09GRiA1Ci0jZGVmaW5lIEFWUkNfUEZfRk9SV0FSRF9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfRk9SV0FSRF9PRkZdICYgQVZSQ19QRl9GT1JXQVJEX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9CQUNLV0FSRF9CSVRfTk8gNDgKLSNkZWZpbmUgQVZSQ19QRl9CQUNLV0FSRF9NQVNLIDB4MDEKLSNkZWZpbmUgQVZSQ19QRl9CQUNLV0FSRF9PRkYgNgotI2RlZmluZSBBVlJDX1BGX0JBQ0tXQVJEX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9CQUNLV0FSRF9PRkZdICYgQVZSQ19QRl9CQUNLV0FSRF9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfQU5HTEVfQklUX05PIDQ5Ci0jZGVmaW5lIEFWUkNfUEZfQU5HTEVfTUFTSyAweDAyCi0jZGVmaW5lIEFWUkNfUEZfQU5HTEVfT0ZGIDYKLSNkZWZpbmUgQVZSQ19QRl9BTkdMRV9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX0FOR0xFX09GRl0gJiBBVlJDX1BGX0FOR0xFX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9TVUJQSUNUVVJFX0JJVF9OTyA1MAotI2RlZmluZSBBVlJDX1BGX1NVQlBJQ1RVUkVfTUFTSyAweDA0Ci0jZGVmaW5lIEFWUkNfUEZfU1VCUElDVFVSRV9PRkYgNgotI2RlZmluZSBBVlJDX1BGX1NVQlBJQ1RVUkVfU1VQUE9SVEVEKHgpIFwKLSAgKCh4KVtBVlJDX1BGX1NVQlBJQ1RVUkVfT0ZGXSAmIEFWUkNfUEZfU1VCUElDVFVSRV9NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfRjFfQklUX05PIDUxCi0jZGVmaW5lIEFWUkNfUEZfRjFfTUFTSyAweDA4Ci0jZGVmaW5lIEFWUkNfUEZfRjFfT0ZGIDYKLSNkZWZpbmUgQVZSQ19QRl9GMV9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX0YxX09GRl0gJiBBVlJDX1BGX0YxX01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9GMl9CSVRfTk8gNTIKLSNkZWZpbmUgQVZSQ19QRl9GMl9NQVNLIDB4MTAKLSNkZWZpbmUgQVZSQ19QRl9GMl9PRkYgNgotI2RlZmluZSBBVlJDX1BGX0YyX1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfRjJfT0ZGXSAmIEFWUkNfUEZfRjJfTUFTSykKLQotI2RlZmluZSBBVlJDX1BGX0YzX0JJVF9OTyA1MwotI2RlZmluZSBBVlJDX1BGX0YzX01BU0sgMHgyMAotI2RlZmluZSBBVlJDX1BGX0YzX09GRiA2Ci0jZGVmaW5lIEFWUkNfUEZfRjNfU1VQUE9SVEVEKHgpICgoeClbQVZSQ19QRl9GM19PRkZdICYgQVZSQ19QRl9GM19NQVNLKQotCi0jZGVmaW5lIEFWUkNfUEZfRjRfQklUX05PIDU0Ci0jZGVmaW5lIEFWUkNfUEZfRjRfTUFTSyAweDQwCi0jZGVmaW5lIEFWUkNfUEZfRjRfT0ZGIDYKLSNkZWZpbmUgQVZSQ19QRl9GNF9TVVBQT1JURUQoeCkgKCh4KVtBVlJDX1BGX0Y0X09GRl0gJiBBVlJDX1BGX0Y0X01BU0spCi0KLSNkZWZpbmUgQVZSQ19QRl9GNV9CSVRfTk8gNTUKLSNkZWZpbmUgQVZSQ19QRl9GNV9NQVNLIDB4ODAKLSNkZWZpbmUgQVZSQ19QRl9GNV9PRkYgNgotI2RlZmluZSBBVlJDX1BGX0Y1X1NVUFBPUlRFRCh4KSAoKHgpW0FWUkNfUEZfRjVfT0ZGXSAmIEFWUkNfUEZfRjVfTUFTSykKLQotLyogVmVuZG9yIHVuaXF1ZS4gVGhpcyBQQVNTVEhST1VHSCBjb21tYW5kIGlzIHN1cHBvcnRlZC4gKi8KLSNkZWZpbmUgQVZSQ19QRl9WRU5ET1JfQklUX05PIDU2Ci0jZGVmaW5lIEFWUkNfUEZfVkVORE9SX01BU0sgMHgwMQotI2RlZmluZSBBVlJDX1BGX1ZFTkRPUl9PRkYgNwotI2RlZmluZSBBVlJDX1BGX1ZFTkRPUl9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfVkVORE9SX09GRl0gJiBBVlJDX1BGX1ZFTkRPUl9NQVNLKQotCi0vKiBCYXNpYyBHcm91cCBOYXZpZ2F0aW9uLiAgVGhpcyBvdmVycnVsZXMgdGhlIFNEUCBlbnRyeSBhcyBpdCBpcyBzZXQgcGVyCi0gKiBwbGF5ZXIuNyAqLwotI2RlZmluZSBBVlJDX1BGX0dST1VQX05BVklfQklUX05PIDU3Ci0jZGVmaW5lIEFWUkNfUEZfR1JPVVBfTkFWSV9NQVNLIDB4MDIKLSNkZWZpbmUgQVZSQ19QRl9HUk9VUF9OQVZJX09GRiA3Ci0jZGVmaW5lIEFWUkNfUEZfR1JPVVBfTkFWSV9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfR1JPVVBfTkFWSV9PRkZdICYgQVZSQ19QRl9HUk9VUF9OQVZJX01BU0spCi0KLS8qIEFkdmFuY2VkIENvbnRyb2wgUGxheWVyLiAgVGhpcyBiaXQgaXMgc2V0IGlmIHRoZSBwbGF5ZXIgc3VwcG9ydHMgYXQgbGVhc3QKLSAqIEFWUkNQIDEuNC4gKi8KLSNkZWZpbmUgQVZSQ19QRl9BRFZfQ1RSTF9CSVRfTk8gNTgKLSNkZWZpbmUgQVZSQ19QRl9BRFZfQ1RSTF9NQVNLIDB4MDQKLSNkZWZpbmUgQVZSQ19QRl9BRFZfQ1RSTF9PRkYgNwotI2RlZmluZSBBVlJDX1BGX0FEVl9DVFJMX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9BRFZfQ1RSTF9PRkZdICYgQVZSQ19QRl9BRFZfQ1RSTF9NQVNLKQotCi0vKiBCcm93c2luZy4gIFRoaXMgYml0IGlzIHNldCBpZiB0aGUgcGxheWVyIHN1cHBvcnRzIGJyb3dzaW5nLiAqLwotI2RlZmluZSBBVlJDX1BGX0JST1dTRV9CSVRfTk8gNTkKLSNkZWZpbmUgQVZSQ19QRl9CUk9XU0VfTUFTSyAweDA4Ci0jZGVmaW5lIEFWUkNfUEZfQlJPV1NFX09GRiA3Ci0jZGVmaW5lIEFWUkNfUEZfQlJPV1NFX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9CUk9XU0VfT0ZGXSAmIEFWUkNfUEZfQlJPV1NFX01BU0spCi0KLS8qIFNlYXJjaGluZy4gVGhpcyBiaXQgaXMgc2V0IGlmIHRoZSBwbGF5ZXIgc3VwcG9ydHMgc2VhcmNoaW5nLiAqLwotI2RlZmluZSBBVlJDX1BGX1NFQVJDSF9CSVRfTk8gNjAKLSNkZWZpbmUgQVZSQ19QRl9TRUFSQ0hfTUFTSyAweDEwCi0jZGVmaW5lIEFWUkNfUEZfU0VBUkNIX09GRiA3Ci0jZGVmaW5lIEFWUkNfUEZfU0VBUkNIX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9TRUFSQ0hfT0ZGXSAmIEFWUkNfUEZfU0VBUkNIX01BU0spCi0KLS8qIEFkZFRvTm93UGxheWluZy4gIFRoaXMgYml0IGlzIHNldCBpZiB0aGUgcGxheWVyIHN1cHBvcnRzIHRoZSBBZGRUb05vd1BsYXlpbmcKLSAqIGNvbW1hbmQuICovCi0jZGVmaW5lIEFWUkNfUEZfQUREMk5PV1BMQVlfQklUX05PIDYxCi0jZGVmaW5lIEFWUkNfUEZfQUREMk5PV1BMQVlfTUFTSyAweDIwCi0jZGVmaW5lIEFWUkNfUEZfQUREMk5PV1BMQVlfT0ZGIDcKLSNkZWZpbmUgQVZSQ19QRl9BREQyTk9XUExBWV9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfQUREMk5PV1BMQVlfT0ZGXSAmIEFWUkNfUEZfQUREMk5PV1BMQVlfTUFTSykKLQotLyogVUlEcyB1bmlxdWUgaW4gcGxheWVyIGJyb3dzZSB0cmVlLiAgVGhpcyBiaXQgaXMgc2V0IGlmIHRoZSBwbGF5ZXIgaXMgYWJsZSB0bwotICogbWFpbnRhaW4gdW5pcXVlIFVJRHMgYWNyb3NzIHRoZSBwbGF5ZXIgYnJvd3NlIHRyZWUuICovCi0jZGVmaW5lIEFWUkNfUEZfVUlEX1VOSVFVRV9CSVRfTk8gNjIKLSNkZWZpbmUgQVZSQ19QRl9VSURfVU5JUVVFX01BU0sgMHg0MAotI2RlZmluZSBBVlJDX1BGX1VJRF9VTklRVUVfT0ZGIDcKLSNkZWZpbmUgQVZSQ19QRl9VSURfVU5JUVVFX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9VSURfVU5JUVVFX09GRl0gJiBBVlJDX1BGX1VJRF9VTklRVUVfTUFTSykKLQotLyogT25seUJyb3dzYWJsZVdoZW5BZGRyZXNzZWQuICBUaGlzIGJpdCBpcyBzZXQgaWYgdGhlIHBsYXllciBpcyBvbmx5IGFibGUgdG8gYmUKLSAqIGJyb3dzZWQgd2hlbiBpdCBpcyBzZXQgYXMgdGhlIEFkZHJlc3NlZCBQbGF5ZXIuICovCi0jZGVmaW5lIEFWUkNfUEZfQlJfV0hfQUREUl9CSVRfTk8gNjMKLSNkZWZpbmUgQVZSQ19QRl9CUl9XSF9BRERSX01BU0sgMHg4MAotI2RlZmluZSBBVlJDX1BGX0JSX1dIX0FERFJfT0ZGIDcKLSNkZWZpbmUgQVZSQ19QRl9CUl9XSF9BRERSX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9CUl9XSF9BRERSX09GRl0gJiBBVlJDX1BGX0JSX1dIX0FERFJfTUFTSykKLQotLyogT25seVNlYXJjaGFibGVXaGVuQWRkcmVzc2VkLiAgVGhpcyBiaXQgaXMgc2V0IGlmIHRoZSBwbGF5ZXIgaXMgb25seSBhYmxlIHRvCi0gKiBiZSBzZWFyY2hlZCB3aGVuIGl0IGlzIHNldCBhcyB0aGUgQWRkcmVzc2VkIHBsYXllci4gKi8KLSNkZWZpbmUgQVZSQ19QRl9TRUFSQ0hfV0hfQUREUl9CSVRfTk8gNjQKLSNkZWZpbmUgQVZSQ19QRl9TRUFSQ0hfV0hfQUREUl9NQVNLIDB4MDEKLSNkZWZpbmUgQVZSQ19QRl9TRUFSQ0hfV0hfQUREUl9PRkYgOAotI2RlZmluZSBBVlJDX1BGX1NFQVJDSF9XSF9BRERSX1NVUFBPUlRFRCh4KSBcCi0gICgoeClbQVZSQ19QRl9TRUFSQ0hfV0hfQUREUl9PRkZdICYgQVZSQ19QRl9TRUFSQ0hfV0hfQUREUl9NQVNLKQotCi0vKiBOb3dQbGF5aW5nLiAgVGhpcyBiaXQgaXMgc2V0IGlmIHRoZSBwbGF5ZXIgc3VwcG9ydHMgdGhlIE5vd1BsYXlpbmcgZm9sZGVyLgotICogTm90ZSB0aGF0IGZvciBhbGwgcGxheWVycyB0aGF0IHN1cHBvcnQgYnJvd3NpbmcgdGhpcyBiaXQgc2hhbGwgYmUgc2V0ICovCi0jZGVmaW5lIEFWUkNfUEZfTk9XX1BMQVlfQklUX05PIDY1Ci0jZGVmaW5lIEFWUkNfUEZfTk9XX1BMQVlfTUFTSyAweDAyCi0jZGVmaW5lIEFWUkNfUEZfTk9XX1BMQVlfT0ZGIDgKLSNkZWZpbmUgQVZSQ19QRl9OT1dfUExBWV9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfTk9XX1BMQVlfT0ZGXSAmIEFWUkNfUEZfTk9XX1BMQVlfTUFTSykKLQotLyogVUlEUGVyc2lzdGVuY3kuICBUaGlzIGJpdCBpcyBzZXQgaWYgdGhlIFBsYXllciBpcyBhYmxlIHRvIHBlcnNpc3QgVUlEIHZhbHVlcwotICogYmV0d2VlbiBBVlJDUCBCcm93c2UgUmVjb25uZWN0ICovCi0jZGVmaW5lIEFWUkNfUEZfVUlEX1BFUlNJU1RfQklUX05PIDY2Ci0jZGVmaW5lIEFWUkNfUEZfVUlEX1BFUlNJU1RfTUFTSyAweDA0Ci0jZGVmaW5lIEFWUkNfUEZfVUlEX1BFUlNJU1RfT0ZGIDgKLSNkZWZpbmUgQVZSQ19QRl9VSURfUEVSU0lTVF9TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfVUlEX1BFUlNJU1RfT0ZGXSAmIEFWUkNfUEZfVUlEX1BFUlNJU1RfTUFTSykKLQotLyogTnVtYmVyT2ZJdGVtcy4gVGhpcyBiaXQgaXMgc2V0IGlmIHBsYXllciBzdXBwb3J0cyB0aGUgR2V0VG90YWxOdW1iZXJPZkl0ZW1zCi0gKiBicm93c2luZyBjb21tYW5kLiAqLwotI2RlZmluZSBBVlJDX1BGX0dFVF9OVU1fT0ZfSVRFTVNfQklUX05PIDY3Ci0jZGVmaW5lIEFWUkNfUEZfR0VUX05VTV9PRl9JVEVNU19NQVNLIDB4MDgKLSNkZWZpbmUgQVZSQ19QRl9HRVRfTlVNX09GX0lURU1TX09GRiA4Ci0jZGVmaW5lIEFWUkNfUEZfR0VUX05VTV9PRl9JVEVNU19TVVBQT1JURUQoeCkgXAotICAoKHgpW0FWUkNfUEZfR0VUX05VTV9PRl9JVEVNU19PRkZdICYgQVZSQ19QRl9HRVRfTlVNX09GX0lURU1TX01BU0spCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIGRhdGEgdHlwZSBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi1UaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaGVhZGVyIHBhcmFtZXRlcnMgb2YgYW4gQVYvQyBtZXNzYWdlLgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBjdHlwZTsgICAgICAgIC8qIENvbW1hbmQgdHlwZS4gICovCi0gIHVpbnQ4X3Qgc3VidW5pdF90eXBlOyAvKiBTdWJ1bml0IHR5cGUuICovCi0gIHVpbnQ4X3Qgc3VidW5pdF9pZDsgLyogU3VidW5pdCBJRC4gIFRoaXMgdmFsdWUgaXMgdHlwaWNhbGx5IGlnbm9yZWQgaW4gQVZSQ1AsCi0gICAgICAgICAgICAgICAgICAgICAgICogZXhjZXB0IGZvciBWRU5ET1IgREVQRU5ERU5UIG1lc3NhZ2VzIHdoZW4gdGhlIHZhbHVlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICogdmVuZG9yLWRlcGVuZGVudC4gIFZhbHVlIHJhbmdlIGlzIDAtNy4gKi8KLSAgdWludDhfdCBvcGNvZGU7ICAgICAvKiBPcCBDb2RlIChwYXNzdGhyb3VnaCwgdmVuZG9yLCBldGMpICovCi19IHRBVlJDX0hEUjsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYSBVTklUIElORk8gbWVzc2FnZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEFWUkNfSERSIGhkcjsgICAgICAgLyogTWVzc2FnZSBoZWFkZXIuICovCi0gIHVpbnQzMl90IGNvbXBhbnlfaWQ7IC8qIENvbXBhbnkgaWRlbnRpZmllci4gKi8KLSAgdWludDhfdCB1bml0X3R5cGU7ICAgLyogVW5pdCB0eXBlLiAgVXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgc3VidW5pdCB0eXBlLiAqLwotICB1aW50OF90IHVuaXQ7ICAgICAgICAvKiBUaGlzIHZhbHVlIGlzIHZlbmRvciBkZXBlbmRlbnQgYW5kIHR5cGljYWxseSB6ZXJvLiAgKi8KLX0gdEFWUkNfTVNHX1VOSVQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGEgU1VCVU5JVCBJTkZPIG1lc3NhZ2UuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVlJDX0hEUiBoZHI7IC8qIE1lc3NhZ2UgaGVhZGVyLiAqLwotICB1aW50OF90IHN1YnVuaXRfdHlwZVtBVlJDX1NVQl9UWVBFX0xFTl07Ci0gIC8qIEFycmF5IGNvbnRhaW5pbmcgc3VidW5pdCB0eXBlIHZhbHVlcy4gICovCi0gIGJvb2wgcGFuZWw7ICAgLyogdHJ1ZSBpZiB0aGUgcGFuZWwgc3VidW5pdCB0eXBlIGlzIGluIHRoZQotICAgICAgICAgICAgICAgICAqIHN1YnVuaXRfdHlwZSBhcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLiAqLwotICB1aW50OF90IHBhZ2U7IC8qIFNwZWNpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBzdWJ1bml0IHR5cGUgdGFibGUgaXMKLSAgICAgICAgICAgICAgICAgKiByZXR1cm5lZC4gIEZvciBBVlJDUCBpdCBpcyB0eXBpY2FsbHkgemVyby4KLSAgICAgICAgICAgICAgICAgKiBWYWx1ZSByYW5nZSBpcyAwLTcuICovCi19IHRBVlJDX01TR19TVUI7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGEgVkVORE9SIERFUEVOREVOVCBtZXNzYWdlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QVZSQ19IRFIgaGRyOyAgICAgICAgICAvKiBNZXNzYWdlIGhlYWRlci4gKi8KLSAgdWludDMyX3QgY29tcGFueV9pZDsgICAgLyogQ29tcGFueSBpZGVudGlmaWVyLiAqLwotICB1aW50OF90KiBwX3ZlbmRvcl9kYXRhOyAvKiBQb2ludGVyIHRvIHZlbmRvciBkZXBlbmRlbnQgZGF0YS4gKi8KLSAgdWludDE2X3QgdmVuZG9yX2xlbjsgICAgLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHZlbmRvciBkZXBlbmRlbnQgZGF0YS4gKi8KLX0gdEFWUkNfTVNHX1ZFTkRPUjsKLQotLyogUEFTUyBUSFJPVUdIIG1lc3NhZ2Ugc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVlJDX0hEUiBoZHI7ICAgICAgICAvKiBoZHIuY3R5cGUgVW51c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICogaGRyLnN1YnVuaXRfdHlwZSBVbnVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBoZHIuc3VidW5pdF9pZCBVbnVzZWQuICovCi0gIHVpbnQ4X3Qgb3BfaWQ7ICAgICAgICAvKiBPcGVyYXRpb24gSUQuICAqLwotICB1aW50OF90IHN0YXRlOyAgICAgICAgLyogS2V5cHJlc3Mgc3RhdGUuICAqLwotICB1aW50OF90KiBwX3Bhc3NfZGF0YTsgLyogUG9pbnRlciB0byBkYXRhLiAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB2YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICogd2hlbiB0aGUgb3BfaWQgaXMgQVZSQ19JRF9WRU5ET1IuKi8KLSAgdWludDhfdCBwYXNzX2xlbjsgICAgIC8qIExlbmd0aCBpbiBieXRlcyBvZiBkYXRhLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZCB3aGVuIHRoZSBvcF9pZCBpcyBBVlJDX0lEX1ZFTkRPUi4qLwotfSB0QVZSQ19NU0dfUEFTUzsKLQotLyogQ29tbWFuZC9SZXNwb25zZSBpbmRpY2F0b3IuICovCi0jZGVmaW5lIEFWUkNfQ01EIEFWQ1RfQ01EIC8qIENvbW1hbmQgbWVzc2FnZSAqLwotI2RlZmluZSBBVlJDX1JTUCBBVkNUX1JTUCAvKiBSZXNwb25zZSBtZXNzYWdlICovCi0KLS8qIEJyb3dzaW5nIGNoYW5uZWwgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEFWUkNfSERSIGhkcjsgICAgICAgICAgLyogaGRyLmN0eXBlIEFWUkNfQ01EIG9yIEFWUkNfUlNQLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoZHIuc3VidW5pdF90eXBlIFVudXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGRyLnN1YnVuaXRfaWQgVW51c2VkLiAqLwotICB1aW50OF90KiBwX2Jyb3dzZV9kYXRhOyAvKiBQb2ludGVyIHRvIGRhdGEuICAqLwotICB1aW50MTZfdCBicm93c2VfbGVuOyAgICAvKiBMZW5ndGggaW4gYnl0ZXMgb2YgZGF0YS4gKi8KLSAgQlRfSERSKiBwX2Jyb3dzZV9wa3Q7IC8qIFRoZSBHS0kgYnVmZmVyIHJlY2VpdmVkLiBTZXQgdG8gTlVMTCwgaWYgdGhlIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3YW50cyB0byBrZWVwIHRoZSBidWZmZXIgKi8KLX0gdEFWUkNfTVNHX0JST1dTRTsKLQotLyogVGhpcyBpcyBhIHVuaW9uIG9mIGFsbCBtZXNzYWdlIHR5cGUgc3RydWN0dXJlcy4gKi8KLXR5cGVkZWYgdW5pb24gewotICB0QVZSQ19IRFIgaGRyOyAgICAgICAgICAgLyogTWVzc2FnZSBoZWFkZXIuICovCi0gIHRBVlJDX01TR19VTklUIHVuaXQ7ICAgICAvKiBVTklUIElORk8gbWVzc2FnZS4gKi8KLSAgdEFWUkNfTVNHX1NVQiBzdWI7ICAgICAgIC8qIFNVQlVOSVQgSU5GTyBtZXNzYWdlLiAqLwotICB0QVZSQ19NU0dfVkVORE9SIHZlbmRvcjsgLyogVkVORE9SIERFUEVOREVOVCBtZXNzYWdlLiAqLwotICB0QVZSQ19NU0dfUEFTUyBwYXNzOyAgICAgLyogUEFTUyBUSFJPVUdIIG1lc3NhZ2UuICovCi0gIHRBVlJDX01TR19CUk9XU0UgYnJvd3NlOyAvKiBtZXNzYWdlcyB0aHJ1IGJyb3dzaW5nIGNoYW5uZWwgKi8KLX0gdEFWUkNfTVNHOwotCi0vKiBtYWNyb3MgKi8KLSNkZWZpbmUgQVZSQ19JU19WQUxJRF9DQVBfSUQoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKCgoKGEpID09IEFWUkNfQ0FQX0NPTVBBTllfSUQpIHx8ICgoYSkgPT0gQVZSQ19DQVBfRVZFTlRTX1NVUFBPUlRFRCkpIFwKLSAgICAgICA/IHRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6IGZhbHNlKQotCi0jZGVmaW5lIEFWUkNfSVNfVkFMSURfRVZFTlRfSUQoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKCgoKGEpID49IEFWUkNfRVZUX1BMQVlfU1RBVFVTX0NIQU5HRSkgJiYgKChhKSA8PSBBVlJDX0VWVF9WT0xVTUVfQ0hBTkdFKSkgXAotICAgICAgID8gdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiBmYWxzZSkKLQotI2RlZmluZSBBVlJDX0lTX1ZBTElEX0FUVFJJQlVURShhKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoKCgoKGEpID4gMCkgJiYgKGEpIDw9IEFWUkNfUExBWUVSX1NFVFRJTkdfU0NBTikpIHx8IFwKLSAgICAoKGEpID49IEFWUkNfUExBWUVSX1NFVFRJTkdfTE9XX01FTlVfRVhUKSkgICAgICAgICAgXAotICAgICAgID8gdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiBmYWxzZSkKLQotI2RlZmluZSBBVlJDX0lTX1ZBTElEX01FRElBX0FUVFJJQlVURShhKSAgICAgICAgICAgIFwKLSAgKCgoYSkgPj0gQVZSQ19NRURJQV9BVFRSX0lEX1RJVExFKSAmJiAgICAgICAgICAgICBcCi0gICAgICAgICAgICgoYSkgPD0gQVZSQ19NQVhfTlVNX01FRElBX0FUVFJfSUQpIFwKLSAgICAgICA/IHRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiBmYWxzZSkKLQotI2RlZmluZSBBVlJDX0lTX1ZBTElEX0JBVFRFUllfU1RBVFVTKGEpIFwKLSAgKCgoYSkgPD0gQVZSQ19CQVRURVJZX1NUQVRVU19GVUxMX0NIQVJHRSkgPyB0cnVlIDogZmFsc2UpCi0KLSNkZWZpbmUgQVZSQ19JU19WQUxJRF9TWVNURU1fU1RBVFVTKGEpIFwKLSAgKCgoYSkgPD0gQVZSQ19TWVNURU1TVEFURV9QV1JfVU5QTFVHR0VEKSA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBBVlJDX0lTX1ZBTElEX0dST1VQKGEpICgoKGEpIDw9IEFWUkNfUERVX1BSRVZfR1JPVVApID8gdHJ1ZSA6IGZhbHNlKQotCi0vKiBDb21wYW55IElEIGlzIDI0LWJpdCBpbnRlZ2VyIFdlIGNhbiBub3QgdXNlIHRoZSBtYWNyb3MgaW4gYnRfdHlwZXMuaCAqLwotI2RlZmluZSBBVlJDX0NPX0lEX1RPX0JFX1NUUkVBTShwLCB1MzIpIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1MzIpID4+IDE2KTsgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTMyKSA+PiA4KTsgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkodTMyKTsgICAgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgQVZSQ19CRV9TVFJFQU1fVE9fQ09fSUQodTMyLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHUzMikgPSAoKCh1aW50MzJfdCkoKigocCkgKyAyKSkpICsgKCgodWludDMyX3QpKCooKHApICsgMSkpKSA8PCA4KSArIFwKLSAgICAgICAgICAgICAoKCh1aW50MzJfdCkoKihwKSkpIDw8IDE2KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKSArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgZGF0YSB0eXBlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQVZSQ19NQVhfQVBQX0FUVFJfU0laRSAxNgotI2RlZmluZSBBVlJDX01BWF9DSEFSU0VUX1NJWkUgMTYKLSNkZWZpbmUgQVZSQ19NQVhfRUxFTV9BVFRSX1NJWkUgOAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBNZXRhZGF0YSB0cmFuc2ZlciBCdWlsZGluZy9QYXJzaW5nIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjaGFyc2V0X2lkOwotICB1aW50MTZfdCBzdHJfbGVuOwotICB1aW50OF90KiBwX3N0cjsKLX0gdEFWUkNfRlVMTF9OQU1FOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHN0cl9sZW47Ci0gIHVpbnQ4X3QqIHBfc3RyOwotfSB0QVZSQ19OQU1FOwotCi0jaWZuZGVmIEFWUkNfQ0FQX01BWF9OVU1fQ09NUF9JRAotI2RlZmluZSBBVlJDX0NBUF9NQVhfTlVNX0NPTVBfSUQgNAotI2VuZGlmCi0KLSNpZm5kZWYgQVZSQ19DQVBfTUFYX05VTV9FVlRfSUQKLSNkZWZpbmUgQVZSQ19DQVBfTUFYX05VTV9FVlRfSUQgMTYKLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIHsKLSAgdWludDMyX3QgY29tcGFueV9pZFtBVlJDX0NBUF9NQVhfTlVNX0NPTVBfSURdOwotICB1aW50OF90IGV2ZW50X2lkW0FWUkNfQ0FQX01BWF9OVU1fRVZUX0lEXTsKLX0gdEFWUkNfQ0FQU19QQVJBTTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGF0dHJfaWQ7Ci0gIHVpbnQ4X3QgYXR0cl92YWw7Ci19IHRBVlJDX0FQUF9TRVRUSU5HOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYXR0cl9pZDsKLSAgdWludDE2X3QgY2hhcnNldF9pZDsKLSAgdWludDhfdCBzdHJfbGVuOwotICB1aW50OF90KiBwX3N0cjsKLX0gdEFWUkNfQVBQX1NFVFRJTkdfVEVYVDsKLQotdHlwZWRlZiB1aW50OF90IHRBVlJDX0ZFQVRVUkVfTUFTS1tBVlJDX0ZFQVRVUkVfTUFTS19TSVpFXTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBwbGF5ZXJfaWQ7ICAvKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIG1lZGlhIHBsYXllci4qLwotICB1aW50OF90IG1ham9yX3R5cGU7ICAvKiBVc2UgQVZSQ19NSl9UWVBFX0FVRElPLCBBVlJDX01KX1RZUEVfVklERU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfTUpfVFlQRV9CQ19BVURJTywgb3IgQVZSQ19NSl9UWVBFX0JDX1ZJREVPLiovCi0gIHVpbnQzMl90IHN1Yl90eXBlOyAgIC8qIFVzZSBBVlJDX1NVQl9UWVBFX05PTkUsIEFWUkNfU1VCX1RZUEVfQVVESU9fQk9PSywgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSQ19TVUJfVFlQRV9QT0RDQVNUKi8KLSAgdWludDhfdCBwbGF5X3N0YXR1czsgLyogVXNlIEFWUkNfUExBWVNUQVRFX1NUT1BQRUQsIEFWUkNfUExBWVNUQVRFX1BMQVlJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfUExBWVNUQVRFX1BBVVNFRCwgQVZSQ19QTEFZU1RBVEVfRldEX1NFRUssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX1BMQVlTVEFURV9SRVZfU0VFSywgb3IgQVZSQ19QTEFZU1RBVEVfRVJST1IqLwotICB0QVZSQ19GRUFUVVJFX01BU0sgZmVhdHVyZXM7IC8qIFN1cHBvcnRlZCBmZWF0dXJlIGJpdCBtYXNrKi8KLSAgdEFWUkNfRlVMTF9OQU1FIG5hbWU7IC8qIFRoZSBwbGF5ZXIgbmFtZSwgbmFtZSBsZW5ndGggYW5kIGNoYXJhY3RlciBzZXQgaWQuKi8KLX0gdEFWUkNfSVRFTV9QTEFZRVI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEFWUkNfVUlEIHVpZDsgICAgICAgIC8qIFRoZSB1aWQgb2YgdGhpcyBmb2xkZXIgKi8KLSAgdWludDhfdCB0eXBlOyAgICAgICAgIC8qIFVzZSBBVlJDX0ZPTERFUl9UWVBFX01JWEVELCBBVlJDX0ZPTERFUl9UWVBFX1RJVExFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfRk9MREVSX1RZUEVfQUxOVU1TLCBBVlJDX0ZPTERFUl9UWVBFX0FSVElTVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJDX0ZPTERFUl9UWVBFX0dFTlJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUkNfRk9MREVSX1RZUEVfUExBWUxJU1RTLCBvciBBVlJDX0ZPTERFUl9UWVBFX1lFQVJTLiovCi0gIGJvb2wgcGxheWFibGU7ICAgICAgICAvKiB0cnVlLCBpZiB0aGUgZm9sZGVyIGNhbiBiZSBwbGF5ZWQuICovCi0gIHRBVlJDX0ZVTExfTkFNRSBuYW1lOyAvKiBUaGUgZm9sZGVyIG5hbWUsIG5hbWUgbGVuZ3RoIGFuZCBjaGFyYWN0ZXIgc2V0IGlkLiAqLwotfSB0QVZSQ19JVEVNX0ZPTERFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdAotICAgICAgYXR0cl9pZDsgLyogVXNlIEFWUkNfTUVESUFfQVRUUl9JRF9USVRMRSwgQVZSQ19NRURJQV9BVFRSX0lEX0FSVElTVCwKLSAgICAgICAgICAgICAgICAgIEFWUkNfTUVESUFfQVRUUl9JRF9BTEJVTSwKLSAgICAgICAgICAgICAgICAgIEFWUkNfTUVESUFfQVRUUl9JRF9UUkFDS19OVU0sIEFWUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTLAotICAgICAgICAgICAgICAgICAgQVZSQ19NRURJQV9BVFRSX0lEX0dFTlJFLCBBVlJDX01FRElBX0FUVFJfSURfUExBWUlOR19USU1FICovCi0gIHRBVlJDX0ZVTExfTkFNRQotICAgICAgbmFtZTsgLyogVGhlIGF0dHJpYnV0ZSB2YWx1ZSwgdmFsdWUgbGVuZ3RoIGFuZCBjaGFyYWN0ZXIgc2V0IGlkLiAqLwotfSB0QVZSQ19BVFRSX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRBVlJDX1VJRCB1aWQ7IC8qIFRoZSB1aWQgb2YgdGhpcyBtZWRpYSBlbGVtZW50IGl0ZW0gKi8KLSAgdWludDhfdCB0eXBlOyAgLyogVXNlIEFWUkNfTUVESUFfVFlQRV9BVURJTyBvciBBVlJDX01FRElBX1RZUEVfVklERU8uICovCi0gIHRBVlJDX0ZVTExfTkFNRSBuYW1lOyAvKiBUaGUgbWVkaWEgbmFtZSwgbmFtZSBsZW5ndGggYW5kIGNoYXJhY3RlciBzZXQgaWQuICovCi0gIHVpbnQ4X3QgYXR0cl9jb3VudDsgICAvKiBUaGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gcF9hdHRyX2xpc3QgKi8KLSAgdEFWUkNfQVRUUl9FTlRSWSogcF9hdHRyX2xpc3Q7IC8qIEF0dHJpYnV0ZSBlbnRyeSBsaXN0LiAqLwotfSB0QVZSQ19JVEVNX01FRElBOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QKLSAgICAgIGl0ZW1fdHlwZTsgLyogQVZSQ19JVEVNX1BMQVlFUiwgQVZSQ19JVEVNX0ZPTERFUiwgb3IgQVZSQ19JVEVNX01FRElBICovCi0gIHVuaW9uIHsKLSAgICB0QVZSQ19JVEVNX1BMQVlFUiBwbGF5ZXI7IC8qIFRoZSBwcm9wZXJ0aWVzIG9mIGEgbWVkaWEgcGxheWVyIGl0ZW0uKi8KLSAgICB0QVZSQ19JVEVNX0ZPTERFUiBmb2xkZXI7IC8qIFRoZSBwcm9wZXJ0aWVzIG9mIGEgZm9sZGVyIGl0ZW0uKi8KLSAgICB0QVZSQ19JVEVNX01FRElBIG1lZGlhOyAgIC8qIFRoZSBwcm9wZXJ0aWVzIG9mIGEgbWVkaWEgaXRlbS4qLwotICB9IHU7Ci19IHRBVlJDX0lURU07Ci0KLS8qIEdldENhcGFiaWxpdHkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBjYXBhYmlsaXR5X2lkOwotfSB0QVZSQ19HRVRfQ0FQU19DTUQ7Ci0KLS8qIExpc3RQbGF5ZXJBcHBWYWx1ZXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBhdHRyX2lkOwotfSB0QVZSQ19MSVNUX0FQUF9WQUxVRVNfQ01EOwotCi0vKiBHZXRDdXJBcHBWYWx1ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGFzc2lnbmVkIGJ5IEFWUkNfQmxkQ29tbWFuZCBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IG51bV9hdHRyOwotICB1aW50OF90IGF0dHJzW0FWUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotfSB0QVZSQ19HRVRfQ1VSX0FQUF9WQUxVRV9DTUQ7Ci0KLS8qIFNldEFwcFZhbHVlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoYXNzaWduZWQgYnkgQVZSQ19CbGRDb21tYW5kIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQ4X3QgbnVtX3ZhbDsKLSAgdEFWUkNfQVBQX1NFVFRJTkcqIHBfdmFsczsKLX0gdEFWUkNfU0VUX0FQUF9WQUxVRV9DTUQ7Ci0KLS8qIEdldEFwcEF0dHJUeHQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBudW1fYXR0cjsKLSAgdWludDhfdCBhdHRyc1tBVlJDX01BWF9BUFBfQVRUUl9TSVpFXTsKLX0gdEFWUkNfR0VUX0FQUF9BVFRSX1RYVF9DTUQ7Ci0KLS8qIEdldEFwcFZhbHVlVHh0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoYXNzaWduZWQgYnkgQVZSQ19CbGRDb21tYW5kIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQ4X3QgYXR0cl9pZDsKLSAgdWludDhfdCBudW1fdmFsOwotICB1aW50OF90IHZhbHNbQVZSQ19NQVhfQVBQX0FUVFJfU0laRV07Ci19IHRBVlJDX0dFVF9BUFBfVkFMX1RYVF9DTUQ7Ci0KLS8qIEluZm9ybUNoYXJzZXQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBudW1faWQ7Ci0gIHVpbnQxNl90IGNoYXJzZXRzW0FWUkNfTUFYX0NIQVJTRVRfU0laRV07Ci19IHRBVlJDX0lORk9STV9DSEFSU0VUX0NNRDsKLQotLyogSW5mb3JtQmF0dGVyeVN0YXR1cyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGFzc2lnbmVkIGJ5IEFWUkNfQmxkQ29tbWFuZCBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IGJhdHRlcnlfc3RhdHVzOwotfSB0QVZSQ19CQVRURVJZX1NUQVRVU19DTUQ7Ci0KLS8qIEdldEVsZW1BdHRycyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGFzc2lnbmVkIGJ5IEFWUkNfQmxkQ29tbWFuZCBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IG51bV9hdHRyOwotICB1aW50MzJfdCBhdHRyc1tBVlJDX01BWF9FTEVNX0FUVFJfU0laRV07Ci19IHRBVlJDX0dFVF9FTEVNX0FUVFJTX0NNRDsKLQotLyogUmVnTm90aWZ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoYXNzaWduZWQgYnkgQVZSQ19CbGRDb21tYW5kIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQ4X3QgZXZlbnRfaWQ7Ci0gIHVpbnQzMl90IHBhcmFtOwotfSB0QVZSQ19SRUdfTk9USUZfQ01EOwotCi0vKiBTZXRBZGRyUGxheWVyICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoYXNzaWduZWQgYnkgQVZSQ19CbGRDb21tYW5kIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQxNl90IHBsYXllcl9pZDsKLX0gdEFWUkNfU0VUX0FERFJfUExBWUVSX0NNRDsKLQotLyogU2V0QnJvd3NlZFBsYXllciAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGFzc2lnbmVkIGJ5IEFWUkNfQmxkQ29tbWFuZCBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50MTZfdCBwbGF5ZXJfaWQ7Ci19IHRBVlJDX1NFVF9CUl9QTEFZRVJfQ01EOwotCi0vKiBTZXRBYnNWb2x1bWUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCB2b2x1bWU7Ci19IHRBVlJDX1NFVF9WT0xVTUVfQ01EOwotCi0vKiBHZXRGb2xkZXJJdGVtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGFzc2lnbmVkIGJ5IEFWUkNfQmxkQ29tbWFuZCBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IHNjb3BlOwotICB1aW50MzJfdCBzdGFydF9pdGVtOwotICB1aW50MzJfdCBlbmRfaXRlbTsKLSAgdWludDhfdCBhdHRyX2NvdW50OwotICB1aW50MzJfdCogcF9hdHRyX2xpc3Q7Ci19IHRBVlJDX0dFVF9JVEVNU19DTUQ7Ci0KLS8qIENoYW5nZVBhdGggKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci0gIHVpbnQ4X3QgZGlyZWN0aW9uOwotICB0QVZSQ19VSUQgZm9sZGVyX3VpZDsKLX0gdEFWUkNfQ0hHX1BBVEhfQ01EOwotCi0vKiBHZXRJdGVtQXR0cnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBzY29wZTsKLSAgdEFWUkNfVUlEIHVpZDsKLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci0gIHVpbnQ4X3QgYXR0cl9jb3VudDsKLSAgdWludDMyX3QqIHBfYXR0cl9saXN0OwotfSB0QVZSQ19HRVRfQVRUUlNfQ01EOwotCi0vKiBTZWFyY2ggKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdEFWUkNfRlVMTF9OQU1FIHN0cmluZzsKLX0gdEFWUkNfU0VBUkNIX0NNRDsKLQotLyogUGxheUl0ZW0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBzY29wZTsKLSAgdEFWUkNfVUlEIHVpZDsKLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci19IHRBVlJDX1BMQVlfSVRFTV9DTUQ7Ci0KLS8qIEFkZFRvTm93UGxheWluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGFzc2lnbmVkIGJ5IEFWUkNfQmxkQ29tbWFuZCBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IHNjb3BlOwotICB0QVZSQ19VSUQgdWlkOwotICB1aW50MTZfdCB1aWRfY291bnRlcjsKLX0gdEFWUkNfQUREX1RPX1BMQVlfQ01EOwotCi0vKiBHZXRUb3RhbE51bU9mSXRlbXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBzY29wZTsKLX0gdEFWUkNfR0VUX05VTV9PRl9JVEVNU19DTUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLX0gdEFWUkNfQ01EOwotCi0vKiBDb250aW51ZSBhbmQgQWJvcnQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChhc3NpZ25lZCBieSBBVlJDX0JsZENvbW1hbmQgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCB0YXJnZXRfcGR1OwotfSB0QVZSQ19ORVhUX0NNRDsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19DTUQgY21kOwotICB0QVZSQ19HRVRfQ0FQU19DTUQgZ2V0X2NhcHM7ICAgICAgICAgICAgICAgICAgICAvKiBHZXRDYXBhYmlsaXR5ICovCi0gIHRBVlJDX0NNRCBsaXN0X2FwcF9hdHRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpc3RQbGF5ZXJBcHBBdHRyICovCi0gIHRBVlJDX0xJU1RfQVBQX1ZBTFVFU19DTUQgbGlzdF9hcHBfdmFsdWVzOyAgICAgIC8qIExpc3RQbGF5ZXJBcHBWYWx1ZXMgKi8KLSAgdEFWUkNfR0VUX0NVUl9BUFBfVkFMVUVfQ01EIGdldF9jdXJfYXBwX3ZhbDsgICAgLyogR2V0Q3VyQXBwVmFsdWUgKi8KLSAgdEFWUkNfU0VUX0FQUF9WQUxVRV9DTUQgc2V0X2FwcF92YWw7ICAgICAgICAgICAgLyogU2V0QXBwVmFsdWUgKi8KLSAgdEFWUkNfR0VUX0FQUF9BVFRSX1RYVF9DTUQgZ2V0X2FwcF9hdHRyX3R4dDsgICAgLyogR2V0QXBwQXR0clR4dCAqLwotICB0QVZSQ19HRVRfQVBQX1ZBTF9UWFRfQ01EIGdldF9hcHBfdmFsX3R4dDsgICAgICAvKiBHZXRBcHBWYWx1ZVR4dCAqLwotICB0QVZSQ19JTkZPUk1fQ0hBUlNFVF9DTUQgaW5mb3JtX2NoYXJzZXQ7ICAgICAgICAvKiBJbmZvcm1DaGFyc2V0ICovCi0gIHRBVlJDX0JBVFRFUllfU1RBVFVTX0NNRCBpbmZvcm1fYmF0dGVyeV9zdGF0dXM7IC8qIEluZm9ybUJhdHRlcnlTdGF0dXMgKi8KLSAgdEFWUkNfR0VUX0VMRU1fQVRUUlNfQ01EIGdldF9lbGVtX2F0dHJzOyAgICAgICAgLyogR2V0RWxlbUF0dHJzICovCi0gIHRBVlJDX0NNRCBnZXRfcGxheV9zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIEdldFBsYXlTdGF0dXMgKi8KLSAgdEFWUkNfUkVHX05PVElGX0NNRCByZWdfbm90aWY7ICAgICAgICAgICAgICAgICAgLyogUmVnTm90aWZ5ICovCi0gIHRBVlJDX05FWFRfQ01EIGNvbnRpbnU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRpbnVlICovCi0gIHRBVlJDX05FWFRfQ01EIGFib3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFib3J0ICovCi0KLSAgdEFWUkNfU0VUX0FERFJfUExBWUVSX0NNRCBhZGRyX3BsYXllcjsgICAgICAgLyogU2V0QWRkclBsYXllciAqLwotICB0QVZSQ19TRVRfVk9MVU1FX0NNRCB2b2x1bWU7ICAgICAgICAgICAgICAgICAvKiBTZXRBYnNWb2x1bWUgKi8KLSAgdEFWUkNfU0VUX0JSX1BMQVlFUl9DTUQgYnJfcGxheWVyOyAgICAgICAgICAgLyogU2V0QnJvd3NlZFBsYXllciAqLwotICB0QVZSQ19HRVRfSVRFTVNfQ01EIGdldF9pdGVtczsgICAgICAgICAgICAgICAvKiBHZXRGb2xkZXJJdGVtcyAqLwotICB0QVZSQ19DSEdfUEFUSF9DTUQgY2hnX3BhdGg7ICAgICAgICAgICAgICAgICAvKiBDaGFuZ2VQYXRoICovCi0gIHRBVlJDX0dFVF9BVFRSU19DTUQgZ2V0X2F0dHJzOyAgICAgICAgICAgICAgIC8qIEdldEl0ZW1BdHRycyAqLwotICB0QVZSQ19TRUFSQ0hfQ01EIHNlYXJjaDsgICAgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggKi8KLSAgdEFWUkNfUExBWV9JVEVNX0NNRCBwbGF5X2l0ZW07ICAgICAgICAgICAgICAgLyogUGxheUl0ZW0gKi8KLSAgdEFWUkNfQUREX1RPX1BMQVlfQ01EIGFkZF90b19wbGF5OyAgICAgICAgICAgLyogQWRkVG9Ob3dQbGF5aW5nICovCi0gIHRBVlJDX0dFVF9OVU1fT0ZfSVRFTVNfQ01EIGdldF9udW1fb2ZfaXRlbXM7IC8qIEdldFRvdGFsTnVtT2ZJdGVtcyAqLwotfSB0QVZSQ19DT01NQU5EOwotCi0vKiBHZXRDYXBhYmlsaXR5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoY29waWVkIGZyb20gYXZyY19jbWQub3Bjb2RlIGJ5IEFWUkNfQmxkUmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgIHVzZXIuIGludmFsaWQgb25lIHRvIGdlbmVyYXRlIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQ4X3QgY2FwYWJpbGl0eV9pZDsKLSAgdWludDhfdCBjb3VudDsKLSAgdEFWUkNfQ0FQU19QQVJBTSBwYXJhbTsKLX0gdEFWUkNfR0VUX0NBUFNfUlNQOwotCi0vKiBMaXN0UGxheWVyQXBwQXR0ciAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGNvcGllZCBmcm9tIGF2cmNfY21kLm9wY29kZSBieSBBVlJDX0JsZFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICB1c2VyLiBpbnZhbGlkIG9uZSB0byBnZW5lcmF0ZSBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IG51bV9hdHRyOwotICB1aW50OF90IGF0dHJzW0FWUkNfTUFYX0FQUF9BVFRSX1NJWkVdOwotfSB0QVZSQ19MSVNUX0FQUF9BVFRSX1JTUDsKLQotLyogTGlzdFBsYXllckFwcFZhbHVlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGNvcGllZCBmcm9tIGF2cmNfY21kLm9wY29kZSBieSBBVlJDX0JsZFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICB1c2VyLiBpbnZhbGlkIG9uZSB0byBnZW5lcmF0ZSBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IG51bV92YWw7Ci0gIHVpbnQ4X3QgdmFsc1tBVlJDX01BWF9BUFBfQVRUUl9TSVpFXTsKLX0gdEFWUkNfTElTVF9BUFBfVkFMVUVTX1JTUDsKLQotLyogR2V0Q3VyQXBwVmFsdWUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBudW1fdmFsOwotICB0QVZSQ19BUFBfU0VUVElORyogcF92YWxzOwotfSB0QVZSQ19HRVRfQ1VSX0FQUF9WQUxVRV9SU1A7Ci0KLS8qIEdldEFwcEF0dHJUeHQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBudW1fYXR0cjsKLSAgdEFWUkNfQVBQX1NFVFRJTkdfVEVYVCogcF9hdHRyczsKLX0gdEFWUkNfR0VUX0FQUF9BVFRSX1RYVF9SU1A7Ci0KLS8qIEdldFBsYXlTdGF0dXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDMyX3Qgc29uZ19sZW47Ci0gIHVpbnQzMl90IHNvbmdfcG9zOwotICB1aW50OF90IHBsYXlfc3RhdHVzOwotfSB0QVZSQ19HRVRfUExBWV9TVEFUVVNfUlNQOwotCi0vKiBub3RpZmljYXRpb24gZXZlbnQgcGFyYW1ldGVyIGZvciBBZGRyZXNzZWRQbGF5ZXIgY2hhbmdlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHBsYXllcl9pZDsKLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci19IHRBVlJDX0FERFJfUExBWUVSX1BBUkFNOwotCi0jaWZuZGVmIEFWUkNfTUFYX0FQUF9TRVRUSU5HUwotI2RlZmluZSBBVlJDX01BWF9BUFBfU0VUVElOR1MgOAotI2VuZGlmCi0KLS8qIG5vdGlmaWNhdGlvbiBldmVudCBwYXJhbWV0ZXIgZm9yIFBsYXllciBBcHBsaWNhdGlvbiBzZXR0aW5nIGNoYW5nZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IG51bV9hdHRyOwotICB1aW50OF90IGF0dHJfaWRbQVZSQ19NQVhfQVBQX1NFVFRJTkdTXTsKLSAgdWludDhfdCBhdHRyX3ZhbHVlW0FWUkNfTUFYX0FQUF9TRVRUSU5HU107Ci19IHRBVlJDX1BMQVlFUl9BUFBfUEFSQU07Ci0KLXR5cGVkZWYgdW5pb24gewotICB0QVZSQ19QTEFZU1RBVEUgcGxheV9zdGF0dXM7Ci0gIHRBVlJDX1VJRCB0cmFjazsKLSAgdWludDMyX3QgcGxheV9wb3M7Ci0gIHRBVlJDX0JBVFRFUllfU1RBVFVTIGJhdHRlcnlfc3RhdHVzOwotICB0QVZSQ19TWVNURU1TVEFURSBzeXN0ZW1fc3RhdHVzOwotICB0QVZSQ19QTEFZRVJfQVBQX1BBUkFNIHBsYXllcl9zZXR0aW5nOwotICB0QVZSQ19BRERSX1BMQVlFUl9QQVJBTSBhZGRyX3BsYXllcjsKLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci0gIHVpbnQ4X3Qgdm9sdW1lOwotfSB0QVZSQ19OT1RJRl9SU1BfUEFSQU07Ci0KLS8qIFJlZ05vdGlmeSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGNvcGllZCBmcm9tIGF2cmNfY21kLm9wY29kZSBieSBBVlJDX0JsZFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICB1c2VyLiBpbnZhbGlkIG9uZSB0byBnZW5lcmF0ZSBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IGV2ZW50X2lkOwotICB0QVZSQ19OT1RJRl9SU1BfUEFSQU0gcGFyYW07Ci19IHRBVlJDX1JFR19OT1RJRl9SU1A7Ci0KLS8qIFNldEFic1ZvbHVtZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGNvcGllZCBmcm9tIGF2cmNfY21kLm9wY29kZSBieSBBVlJDX0JsZFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICB1c2VyLiBpbnZhbGlkIG9uZSB0byBnZW5lcmF0ZSBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50OF90IHZvbHVtZTsKLX0gdEFWUkNfU0VUX1ZPTFVNRV9SU1A7Ci0KLS8qIFNldEJyb3dzZWRQbGF5ZXIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci0gIHVpbnQzMl90IG51bV9pdGVtczsKLSAgdWludDE2X3QgY2hhcnNldF9pZDsKLSAgdWludDhfdCBmb2xkZXJfZGVwdGg7Ci0gIHRBVlJDX05BTUUqIHBfZm9sZGVyczsKLX0gdEFWUkNfU0VUX0JSX1BMQVlFUl9SU1A7Ci0KLS8qIEdldEZvbGRlckl0ZW1zICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoY29waWVkIGZyb20gYXZyY19jbWQub3Bjb2RlIGJ5IEFWUkNfQmxkUmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgIHVzZXIuIGludmFsaWQgb25lIHRvIGdlbmVyYXRlIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQxNl90IHVpZF9jb3VudGVyOwotICB1aW50MTZfdCBpdGVtX2NvdW50OwotICB0QVZSQ19JVEVNKiBwX2l0ZW1fbGlzdDsKLX0gdEFWUkNfR0VUX0lURU1TX1JTUDsKLQotLyogQ2hhbmdlUGF0aCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGNvcGllZCBmcm9tIGF2cmNfY21kLm9wY29kZSBieSBBVlJDX0JsZFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICB1c2VyLiBpbnZhbGlkIG9uZSB0byBnZW5lcmF0ZSBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50MzJfdCBudW1faXRlbXM7Ci19IHRBVlJDX0NIR19QQVRIX1JTUDsKLQotLyogR2V0SXRlbUF0dHJzLCBHZXRFbGVtQXR0cnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDhfdCBudW1fYXR0cnM7Ci0gIHRBVlJDX0FUVFJfRU5UUlkqIHBfYXR0cnM7Ci19IHRBVlJDX0dFVF9BVFRSU19SU1A7Ci0KLS8qIEdldCBUb3RhbCBOdW1iZXIgb2YgSXRlbXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLSAgdWludDE2X3QgdWlkX2NvdW50ZXI7Ci0gIHVpbnQzMl90IG51bV9pdGVtczsKLX0gdEFWUkNfR0VUX05VTV9PRl9JVEVNU19SU1A7Ci0KLS8qIFNlYXJjaCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHBkdTsKLSAgdEFWUkNfU1RTIHN0YXR1czsKLSAgdWludDhfdCBvcGNvZGU7IC8qIE9wIENvZGUgKGNvcGllZCBmcm9tIGF2cmNfY21kLm9wY29kZSBieSBBVlJDX0JsZFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICB1c2VyLiBpbnZhbGlkIG9uZSB0byBnZW5lcmF0ZSBhY2NvcmRpbmcgdG8gcGR1KSAqLwotICB1aW50MTZfdCB1aWRfY291bnRlcjsKLSAgdWludDMyX3QgbnVtX2l0ZW1zOwotfSB0QVZSQ19TRUFSQ0hfUlNQOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgcGR1OwotICB0QVZSQ19TVFMgc3RhdHVzOwotICB1aW50OF90IG9wY29kZTsgLyogT3AgQ29kZSAoY29waWVkIGZyb20gYXZyY19jbWQub3Bjb2RlIGJ5IEFWUkNfQmxkUmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgIHVzZXIuIGludmFsaWQgb25lIHRvIGdlbmVyYXRlIGFjY29yZGluZyB0byBwZHUpICovCi0gIHVpbnQ4X3QgdGFyZ2V0X3BkdTsKLX0gdEFWUkNfTkVYVF9SU1A7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1NUUyBzdGF0dXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOyAvKiBPcCBDb2RlIChjb3BpZWQgZnJvbSBhdnJjX2NtZC5vcGNvZGUgYnkgQVZSQ19CbGRSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAgdXNlci4gaW52YWxpZCBvbmUgdG8gZ2VuZXJhdGUgYWNjb3JkaW5nIHRvIHBkdSkgKi8KLX0gdEFWUkNfUlNQOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdWludDhfdCBwZHU7Ci0gIHRBVlJDX1JTUCByc3A7Ci0gIHRBVlJDX0dFVF9DQVBTX1JTUCBnZXRfY2FwczsgICAgICAgICAgICAgICAgIC8qIEdldENhcGFiaWxpdHkgKi8KLSAgdEFWUkNfTElTVF9BUFBfQVRUUl9SU1AgbGlzdF9hcHBfYXR0cjsgICAgICAgLyogTGlzdFBsYXllckFwcEF0dHIgKi8KLSAgdEFWUkNfTElTVF9BUFBfVkFMVUVTX1JTUCBsaXN0X2FwcF92YWx1ZXM7ICAgLyogTGlzdFBsYXllckFwcFZhbHVlcyAqLwotICB0QVZSQ19HRVRfQ1VSX0FQUF9WQUxVRV9SU1AgZ2V0X2N1cl9hcHBfdmFsOyAvKiBHZXRDdXJBcHBWYWx1ZSAqLwotICB0QVZSQ19SU1Agc2V0X2FwcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXRBcHBWYWx1ZSAqLwotICB0QVZSQ19HRVRfQVBQX0FUVFJfVFhUX1JTUCBnZXRfYXBwX2F0dHJfdHh0OyAvKiBHZXRBcHBBdHRyVHh0ICovCi0gIHRBVlJDX0dFVF9BUFBfQVRUUl9UWFRfUlNQIGdldF9hcHBfdmFsX3R4dDsgIC8qIEdldEFwcFZhbHVlVHh0ICovCi0gIHRBVlJDX1JTUCBpbmZvcm1fY2hhcnNldDsgICAgICAgICAgICAgICAgICAgIC8qIEluZm9ybUNoYXJzZXQgKi8KLSAgdEFWUkNfUlNQIGluZm9ybV9iYXR0ZXJ5X3N0YXR1czsgICAgICAgICAgICAgLyogSW5mb3JtQmF0dGVyeVN0YXR1cyAqLwotICB0QVZSQ19HRVRfUExBWV9TVEFUVVNfUlNQIGdldF9wbGF5X3N0YXR1czsgICAvKiBHZXRQbGF5U3RhdHVzICovCi0gIHRBVlJDX1JFR19OT1RJRl9SU1AgcmVnX25vdGlmOyAgICAgICAgICAgICAgIC8qIFJlZ05vdGlmeSAqLwotICB0QVZSQ19ORVhUX1JTUCBjb250aW51OyAgICAgICAgICAgICAgICAgICAgICAvKiBDb250aW51ZSAqLwotICB0QVZSQ19ORVhUX1JTUCBhYm9ydDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYm9ydCAqLwotICB0QVZSQ19SU1AgYWRkcl9wbGF5ZXI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXRBZGRyUGxheWVyICovCi0gIHRBVlJDX1NFVF9WT0xVTUVfUlNQIHZvbHVtZTsgICAgICAgICAgICAgICAgIC8qIFNldEFic1ZvbHVtZSAqLwotICB0QVZSQ19TRVRfQlJfUExBWUVSX1JTUCBicl9wbGF5ZXI7ICAgICAgICAgICAvKiBTZXRCcm93c2VkUGxheWVyICovCi0gIHRBVlJDX0dFVF9JVEVNU19SU1AgZ2V0X2l0ZW1zOyAgICAgICAgICAgICAgIC8qIEdldEZvbGRlckl0ZW1zICovCi0gIHRBVlJDX0NIR19QQVRIX1JTUCBjaGdfcGF0aDsgICAgICAgICAgICAgICAgIC8qIENoYW5nZVBhdGggKi8KLSAgdEFWUkNfR0VUX0FUVFJTX1JTUCBnZXRfYXR0cnM7ICAgICAgICAgICAgICAgLyogR2V0SXRlbUF0dHJzLCBHZXRFbGVtQXR0cnMgKi8KLSAgdEFWUkNfR0VUX05VTV9PRl9JVEVNU19SU1AgZ2V0X251bV9vZl9pdGVtczsgLyogR2V0VG90YWxOdW1iZXJPZkl0ZW1zICovCi0gIHRBVlJDX1NFQVJDSF9SU1Agc2VhcmNoOyAgICAgICAgICAgICAgICAgICAgIC8qIFNlYXJjaCAqLwotICB0QVZSQ19SU1AgcGxheV9pdGVtOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQbGF5SXRlbSAqLwotICB0QVZSQ19SU1AgYWRkX3RvX3BsYXk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGRUb05vd1BsYXlpbmcgKi8KLX0gdEFWUkNfUkVTUE9OU0U7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9ibGVfYWNsX2ludGVyZmFjZS5oIGIvc3RhY2svaW5jbHVkZS9ibGVfYWNsX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEzM2M2Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYmxlX2FjbF9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBhY2xfYmxlX2Nvbm5lY3Rpb25fY29tcGxldGUoY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9ST0xFIHJvbGUsIGJvb2wgbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2ludGVydmFsLCB1aW50MTZfdCBjb25uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX3RpbWVvdXQpOwotdm9pZCBhY2xfYmxlX2VuaGFuY2VkX2Nvbm5lY3Rpb25fY29tcGxldGUoCi0gICAgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwgdWludDE2X3QgaGFuZGxlLCB0SENJX1JPTEUgcm9sZSwKLSAgICBib29sIG1hdGNoLCB1aW50MTZfdCBjb25uX2ludGVydmFsLCB1aW50MTZfdCBjb25uX2xhdGVuY3ksCi0gICAgdWludDE2X3QgY29ubl90aW1lb3V0LCBjb25zdCBSYXdBZGRyZXNzJiBsb2NhbF9ycGEsCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9ycGEsIHRCTEVfQUREUl9UWVBFIHBlZXJfYWRkcl90eXBlKTsKLXZvaWQgYWNsX2JsZV9lbmhhbmNlZF9jb25uZWN0aW9uX2NvbXBsZXRlX2Zyb21fc2hpbSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLAotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGxvY2FsX3JwYSwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9ycGEsCi0gICAgdEJMRV9BRERSX1RZUEUgcGVlcl9hZGRyX3R5cGUpOwotdm9pZCBhY2xfYmxlX2Nvbm5lY3Rpb25fZmFpbChjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIGJvb2wgZW5oYW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci12b2lkIGFjbF9ibGVfdXBkYXRlX2V2ZW50X3JlY2VpdmVkKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCk7CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2JsZV9hZHZlcnRpc2VyLmggYi9zdGFjay9pbmNsdWRlL2JsZV9hZHZlcnRpc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGEyNDkuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9ibGVfYWR2ZXJ0aXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQkxFX0FEVkVSVElTRVJfSAotI2RlZmluZSBCTEVfQURWRVJUSVNFUl9ICi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL21lbW9yeS93ZWFrX3B0ci5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUyAwCi0jZGVmaW5lIEJUTV9CTEVfTVVMVElfQURWX0ZBSUxVUkUgMQotI2RlZmluZSBBRFZFUlRJU0VfRkFJTEVEX1RPT19NQU5ZX0FEVkVSVElTRVJTIDB4MDIKLQotdXNpbmcgTXVsdGlBZHZDYiA9IGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPjsKLXVzaW5nIFBhcmFtZXRlcnNDYiA9Ci0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLywgaW50OF90IC8qIHR4X3Bvd2VyICovKT47Ci0KLS8vIG1ldGhvZHMgd2UgbXVzdCBoYXZlIGRlZmluZWQKLXZvaWQgYnRtX2JsZV91cGRhdGVfZG10X2ZsYWdfYml0cyh1aW50OF90KiBmbGFnX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90IGNvbm5lY3RfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBkaXNjX21vZGUpOwotdm9pZCBidG1fYWNsX3VwZGF0ZV9jb25uX2FkZHIodWludDE2X3QgY29ubl9oYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpOwotCi0vLyBtZXRob2RzIHdlIGV4cG9zZSB0byBjIGNvZGU6Ci12b2lkIGJ0bV9ibGVfbXVsdGlfYWR2X2NsZWFudXAodm9pZCk7Ci12b2lkIGJ0bV9ibGVfbXVsdGlfYWR2X2luaXQoKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBhZHZlcnRpc2luZ19ldmVudF9wcm9wZXJ0aWVzOwotICB1aW50MzJfdCBhZHZfaW50X21pbjsKLSAgdWludDMyX3QgYWR2X2ludF9tYXg7Ci0gIHRCVE1fQkxFX0FEVl9DSE5MX01BUCBjaGFubmVsX21hcDsKLSAgdEJUTV9CTEVfQUZQIGFkdl9maWx0ZXJfcG9saWN5OwotICBpbnQ4X3QgdHhfcG93ZXI7Ci0gIHVpbnQ4X3QgcHJpbWFyeV9hZHZlcnRpc2luZ19waHk7Ci0gIHVpbnQ4X3Qgc2Vjb25kYXJ5X2FkdmVydGlzaW5nX3BoeTsKLSAgdWludDhfdCBzY2FuX3JlcXVlc3Rfbm90aWZpY2F0aW9uX2VuYWJsZTsKLX0gdEJUTV9CTEVfQURWX1BBUkFNUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGVuYWJsZTsKLSAgdWludDE2X3QgbWluX2ludGVydmFsOwotICB1aW50MTZfdCBtYXhfaW50ZXJ2YWw7Ci0gIHVpbnQxNl90IHBlcmlvZGljX2FkdmVydGlzaW5nX3Byb3BlcnRpZXM7Ci19IHRCTEVfUEVSSU9ESUNfQURWX1BBUkFNUzsKLQotY2xhc3MgQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTsKLQotY2xhc3MgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkJsZUFkdmVydGlzaW5nTWFuYWdlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgY29uc3QgdWludDE2X3QgYWR2ZXJ0aXNpbmdfcHJvcF9sZWdhY3lfY29ubmVjdGFibGUgPSAweDAwMTE7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBhZHZlcnRpc2luZ19wcm9wX2xlZ2FjeV9ub25fY29ubmVjdGFibGUgPSAweDAwMTA7Ci0KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShCbGVBZHZlcnRpc2VySGNpSW50ZXJmYWNlKiBpbnRlcmZhY2UpOwotICBzdGF0aWMgdm9pZCBDbGVhblVwKCk7Ci0gIHN0YXRpYyBib29sIElzSW5pdGlhbGl6ZWQoKTsKLSAgc3RhdGljIGJhc2U6OldlYWtQdHI8QmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyPiBHZXQoKTsKLQotICAvKiBSZWdpc3RlciBhbiBhZHZlcnRpc2luZyBpbnN0YW5jZSwgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQgaW4gfGNifAotICAgKiBjYWxsYmFjaywgd2l0aCBhc3NpZ25lZCBpZCwgaWYgb3BlcmF0aW9uIHN1Y2NlZWRzLiBJbnN0YW5jZSBpcyBmcmVlZCB3aGVuCi0gICAqIGFkdmVydGlzaW5nIGlzIGRpc2FibGVkIGJ5IGNhbGxpbmcgfEJUTV9CbGVEaXNhYmxlQWR2SW5zdGFuY2V8LCBvciB3aGVuIGFueQotICAgKiBvZiB0aGUgb3BlcmF0aW9ucyBmYWlscy4KLSAgICogVGhlIGluc3RhbmNlIHdpbGwgaGF2ZSBkYXRhIHNldCB0byB8YWR2ZXJ0aXNlX2RhdGF8LCBzY2FuIHJlc3BvbnNlIHNldCB0bwotICAgKiB8c2Nhbl9yZXNwb25zZV9kYXRhfCwgYW5kIHdpbGwgYmUgZW5hYmxlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTdGFydEFkdmVydGlzaW5nKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgTXVsdGlBZHZDYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfQURWX1BBUkFNUyogcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24sIE11bHRpQWR2Q2IgdGltZW91dF9jYikgPSAwOwotCi0gIC8qIFJlZ2lzdGVyIGFuIGFkdmVydGlzaW5nIGluc3RhbmNlLCBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZCBpbiB8Y2J8Ci0gICAqIGNhbGxiYWNrLCB3aXRoIGFzc2lnbmVkIGlkLCBpZiBvcGVyYXRpb24gc3VjY2VlZHMuIEluc3RhbmNlIGlzIGZyZWVkIHdoZW4KLSAgICogYWR2ZXJ0aXNpbmcgaXMgZGlzYWJsZWQgYnkgY2FsbGluZyB8QlRNX0JsZURpc2FibGVBZHZJbnN0YW5jZXwsIG9yIHdoZW4gYW55Ci0gICAqIG9mIHRoZSBvcGVyYXRpb25zIGZhaWxzLgotICAgKiBUaGUgaW5zdGFuY2Ugd2lsbCBoYXZlIGRhdGEgc2V0IHRvIHxhZHZlcnRpc2VfZGF0YXwsIHNjYW4gcmVzcG9uc2Ugc2V0IHRvCi0gICAqIHxzY2FuX3Jlc3BvbnNlX2RhdGF8LCBwZXJpb2RpYyBkYXRhIHNldCB0byB8cGVyaW9kaWNfZGF0YXwgYW5kIHdpbGwgYmUKLSAgICogZW5hYmxlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTdGFydEFkdmVydGlzaW5nU2V0KAotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGluc3RfaWQgKi8sIGludDhfdCAvKiB0eF9wb3dlciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAvKiBzdGF0dXMgKi8pPgotICAgICAgICAgIGNiLAotICAgICAgdEJUTV9CTEVfQURWX1BBUkFNUyogcGFyYW1zLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YSwKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2VfZGF0YSwKLSAgICAgIHRCTEVfUEVSSU9ESUNfQURWX1BBUkFNUyogcGVyaW9kaWNfcGFyYW1zLAotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGVyaW9kaWNfZGF0YSwgdWludDE2X3QgZHVyYXRpb24sCi0gICAgICB1aW50OF90IG1heEV4dEFkdkV2ZW50cywKLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBpbnN0X2lkICovLCB1aW50OF90IC8qIHN0YXR1cyAqLyk+Ci0gICAgICAgICAgdGltZW91dF9jYikgPSAwOwotCi0gIC8qIFJlZ2lzdGVyIGFuIGFkdmVydGlzaW5nIGluc3RhbmNlLCBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZCBpbiB8Y2J8Ci0gICAqIGNhbGxiYWNrLCB3aXRoIGFzc2lnbmVkIGlkLCBpZiBvcGVyYXRpb24gc3VjY2VlZHMuIEluc3RhbmNlIGlzIGZyZWVkIHdoZW4KLSAgICogYWR2ZXJ0aXNpbmcgaXMgZGlzYWJsZWQgYnkgY2FsbGluZyB8QlRNX0JsZURpc2FibGVBZHZJbnN0YW5jZXwsIG9yIHdoZW4gYW55Ci0gICAqIG9mIHRoZSBvcGVyYXRpb25zIGZhaWxzLiAqLwotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJBZHZlcnRpc2VyKAotICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIGluc3RfaWQgKi8sIHVpbnQ4X3QgLyogc3RhdHVzICovKT4pID0gMDsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMvZGlzYWJsZXMgYW4gYWR2ZXJ0aXNpbmcgaW5zdGFuY2UuIE9wZXJhdGlvbiBzdGF0dXMgaXMKLSAgICogcmV0dXJuZWQgaW4gfGNifCAqLwotICB2aXJ0dWFsIHZvaWQgRW5hYmxlKHVpbnQ4X3QgaW5zdF9pZCwgYm9vbCBlbmFibGUsIE11bHRpQWR2Q2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb24sIHVpbnQ4X3QgbWF4RXh0QWR2RXZlbnRzLAotICAgICAgICAgICAgICAgICAgICAgIE11bHRpQWR2Q2IgdGltZW91dF9jYikgPSAwOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlIGEgTXVsdGktQURWIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmlmZWQgYWR2Ci0gICAqIHBhcmFtZXRlcnMuICovCi0gIHZpcnR1YWwgdm9pZCBTZXRQYXJhbWV0ZXJzKHVpbnQ4X3QgaW5zdF9pZCwgdEJUTV9CTEVfQURWX1BBUkFNUyogcF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNDYiBjYikgPSAwOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlIGEgTXVsdGktQURWIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBhZHYgZGF0YSBvcgotICAgKiBzY2FuIHJlc3BvbnNlIGRhdGEuKi8KLSAgdmlydHVhbCB2b2lkIFNldERhdGEodWludDhfdCBpbnN0X2lkLCBib29sIGlzX3NjYW5fcnNwLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLCBNdWx0aUFkdkNiIGNiKSA9IDA7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBjb25maWd1cmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBlcmlvZGljIHBhcmFtZXRlcnMgKi8KLSAgdmlydHVhbCB2b2lkIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKAotICAgICAgdWludDhfdCBpbnN0X2lkLCB0QkxFX1BFUklPRElDX0FEVl9QQVJBTVMqIHBhcmFtcywgTXVsdGlBZHZDYiBjYikgPSAwOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBwZXJpb2RpYyBkYXRhICovCi0gIHZpcnR1YWwgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YSh1aW50OF90IGluc3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlBZHZDYiBjYikgPSAwOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gZW5hYmxlcy9kaXNhYmxlcyBwZXJpb2RpYyBhZHZlcnRpc2luZyBvbiBzZWxlY3RlZCBpbnN0YW5jZSAqLwotICB2aXJ0dWFsIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZSh1aW50OF90IGluc3RfaWQsIHVpbnQ4X3QgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUFkdkNiIGNiKSA9IDA7Ci0KLSAgLyogIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSBhIE11bHRpLUFEViBpbnN0YW5jZSAqLwotICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3Rlcih1aW50OF90IGluc3RfaWQpID0gMDsKLQotICAvKiBXaGVuIHJlc29sdmluZyBsaXN0IGlzIHVzZWQsIHdlIG5lZWQgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIGFsbCBhZHZlcnRpc2luZwotICAgKiBpbnN0YW5jZXMgZm9yIHRoZSB0aW1lIG9mIG9wZXJhdGlvbi4gU3VzcGVuZCgpIHNhdmVzIGN1cnJlbnQgc3RhdGUsCi0gICAqIFJlc3VtZSgpIHJlc3VtZXMgdGhlIGFkdmVydGlzaW5nLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFN1c3BlbmQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZXN1bWUoKSA9IDA7Ci0KLSAgLyogVGhpcyBtZXRob2QgaXMgYSBtZW1iZXIgb2YgQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZSwgYW5kIGlzIGV4cG9zZWQgaGVyZQotICAgKiBqdXN0IGZvciB0ZXN0cy4gSXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tIHVwcGVyIGxheWVycyovCi0gIHZpcnR1YWwgdm9pZCBPbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZCgKLSAgICAgIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IGFkdmVydGlzaW5nX2hhbmRsZSwgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgICB1aW50OF90IG51bV9jb21wbGV0ZWRfZXh0ZW5kZWRfYWR2X2V2ZW50cykgPSAwOwotCi0gIHVzaW5nIEdldEFkZHJlc3NDYWxsYmFjayA9Ci0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogYWRkcmVzc190eXBlKi8sIFJhd0FkZHJlc3MgLyphZGRyZXNzKi8pPjsKLSAgdmlydHVhbCB2b2lkIEdldE93bkFkZHJlc3ModWludDhfdCBpbnN0X2lkLCBHZXRBZGRyZXNzQ2FsbGJhY2sgY2IpID0gMDsKLX07Ci0KLSNlbmRpZiAgLy8gQkxFX0FEVkVSVElTRVJfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9ibGVfaGNpX2xpbmtfaW50ZXJmYWNlLmggYi9zdGFjay9pbmNsdWRlL2JsZV9oY2lfbGlua19pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzNzE2YS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2JsZV9oY2lfbGlua19pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgZnVuY3Rpb25zIGZvciBIQ0ktYmxlIHRvIGludm9rZQotdm9pZCBidG1fYmxlX2Nvbm5fY29tcGxldGUodWludDhfdCogcCwgVU5VU0VEX0FUVFIgdWludDE2X3QgZXZ0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5oYW5jZWQpOwotdm9pZCBidG1fYmxlX3Byb2Nlc3NfYWR2X3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogcCk7Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19leHRfYWR2X3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogcCk7Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19waHlfdXBkYXRlX3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogcCk7Ci12b2lkIGJ0bV9ibGVfcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUodWludDhfdCogcCk7Ci12b2lkIGJ0bV9sZV9vbl9hZHZlcnRpc2luZ19zZXRfdGVybWluYXRlZCh1aW50OF90KiBwLCB1aW50MTZfdCBsZW5ndGgpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV93cml0ZV9hZHZfZW5hYmxlX2NvbXBsZXRlKHVpbnQ4X3QqIHApOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9jcmVhdGVfbGxfY29ubl9jb21wbGV0ZSh0SENJX1NUQVRVUyBzdGF0dXMpOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9sdGtfcmVxdWVzdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmFuZFs4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZWRpdik7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3Rlc3RfY29tbWFuZF9jb21wbGV0ZSh1aW50OF90KiBwKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcmFuZF9lbmNfY29tcGxldGUodWludDhfdCogcCwgdWludDE2X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9SQU5EX0VOQ19DQiogcF9lbmNfY3BsdF9jYmFjayk7Ci1leHRlcm4gYm9vbCBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvKFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZnJlc2gpOwotZXh0ZXJuIGJvb2wgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkb19mcm9tX2FkZHJlc3Nfd2l0aF90eXBlKAotICAgIHRCTEVfQkRfQUREUiogYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgcmVmcmVzaCk7Ci1leHRlcm4gdm9pZCBidG1fYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBldnRfbGVuKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlKHVpbnQ4X3QqIHApOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9yZW1vdmVfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4pOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9hZGRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4pOwotZXh0ZXJuIHZvaWQgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdF9jb21wbGV0ZSh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0KHVpbnQ4X3QgbGVuLCB1aW50OF90KiBwKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0KHVpbnQ4X3QgbGVuLCB1aW50OF90KiBwKTsKLWV4dGVybiB2b2lkIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19sb3N0X2V2dCh1aW50OF90IGxlbiwgdWludDhfdCogcCk7CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2JuZXBfYXBpLmggYi9zdGFjay9pbmNsdWRlL2JuZXBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDFkZTIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9ibmVwX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBpbnRlcmZhY2UgZmlsZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBCbHVldG9vdGggTmV0d29yawotICogIEVuY2Fwc2lsYXRpb24gUHJvdG9jb2wgKEJORVApLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJORVBfQVBJX0gKLSNkZWZpbmUgQk5FUF9BUElfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGVmaW5lIHRoZSBtaW5pbXVtIG9mZnNldCBuZWVkZWQgaW4gYSBHS0kgYnVmZmVyIGZvcgotICogc2VuZGluZyBCTkVQIHBhY2tldHMuIE5vdGUsIHdlIGFyZSBjdXJyZW50bHkgbm90IHNlbmRpbmcKLSAqIGV4dGVuc2lvbiBoZWFkZXJzLCBidXQgbWF5IGluIHRoZSBmdXR1cmUsIHNvIGFsbG93Ci0gKiBzcGFjZSBmb3IgdGhlbQotKi8KLSNkZWZpbmUgQk5FUF9NSU5JTVVNX09GRlNFVCAoMTUgKyBMMkNBUF9NSU5fT0ZGU0VUKQotI2RlZmluZSBCTkVQX0lOVkFMSURfSEFORExFIDB4RkZGRgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIERlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGVmaW5lIHRoZSByZXN1bHQgY29kZXMgZnJvbSBCTkVQCi0qLwotZW51bSB7Ci0gIEJORVBfU1VDQ0VTUywgICAgICAgICAgICAgICAvKiBTdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQk5FUF9DT05OX0RJU0NPTk5FQ1RFRCwgICAgIC8qIENvbm5lY3Rpb24gdGVybWluYXRlZCAgICovCi0gIEJORVBfTk9fUkVTT1VSQ0VTLCAgICAgICAgICAvKiBObyByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQk5FUF9NVFVfRVhDRURFRCwgICAgICAgICAgIC8qIEF0dGVtcHQgdG8gd3JpdGUgbG9uZyBkYXRhICAgICAgICAqLwotICBCTkVQX0lOVkFMSURfT0ZGU0VULCAgICAgICAgLyogSW5zdWZmaWNpZW50IG9mZnNldCBpbiBHS0kgYnVmZmVyICovCi0gIEJORVBfQ09OTl9GQUlMRUQsICAgICAgICAgICAvKiBDb25uZWN0aW9uIGZhaWxlZCAgICAgICAgICAgICAgICAgKi8KLSAgQk5FUF9DT05OX0ZBSUxFRF9DRkcsICAgICAgIC8qIENvbm5lY3Rpb24gZmFpbGVkIGNvcyBvZiBjb25maWcgICAqLwotICBCTkVQX0NPTk5fRkFJTEVEX1NSQ19VVUlELCAgLyogQ29ubmVjdGlvbiBmYWlsZWQgd3Jvbmcgc291cmNlIFVVSUQgICAqLwotICBCTkVQX0NPTk5fRkFJTEVEX0RTVF9VVUlELCAgLyogQ29ubmVjdGlvbiBmYWlsZWQgd3JvbmcgZGVzdGluYXRpb24gVVVJRCAgICovCi0gIEJORVBfQ09OTl9GQUlMRURfVVVJRF9TSVpFLCAvKiBDb25uZWN0aW9uIGZhaWxlZCB3cm9uZyBzaXplIFVVSUQgICAqLwotICBCTkVQX1FfU0laRV9FWENFRURFRCwgICAgICAgLyogVG9vIG1hbnkgYnVmZmVycyB0byBkZXN0ICAgICAgICAgICovCi0gIEJORVBfVE9PX01BTllfRklMVEVSUywgICAgICAvKiBUb28gbWFueSBsb2NhbCBmaWx0ZXJzIHNwZWNpZmllZCAgKi8KLSAgQk5FUF9TRVRfRklMVEVSX0ZBSUwsICAgICAgIC8qIFNldCBGaWx0ZXIgZmFpbGVkICAqLwotICBCTkVQX1dST05HX0hBTkRMRSwgICAgICAgICAgLyogV3JvbmcgaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbiAgKi8KLSAgQk5FUF9XUk9OR19TVEFURSwgICAgICAgICAgIC8qIENvbm5lY3Rpb24gaXMgaW4gd3Jvbmcgc3RhdGUgKi8KLSAgQk5FUF9TRUNVUklUWV9GQUlMLCAgICAgICAgIC8qIEZhaWxlZCBiZWNhdXNlIG9mIHNlY3VyaXR5ICovCi0gIEJORVBfSUdOT1JFX0NNRCwgICAgICAgICAgICAvKiBUbyBpZ25vcmUgdGhlIHJjdmQgY29tbWFuZCAqLwotICBCTkVQX1RYX0ZMT1dfT04sICAgICAgICAgICAgLyogdHggZGF0YSBmbG93IGVuYWJsZWQgKi8KLSAgQk5FUF9UWF9GTE9XX09GRiAgICAgICAgICAgIC8qIHR4IGRhdGEgZmxvdyBkaXNhYmxlZCAqLwotCi19OwotdHlwZWRlZiB1aW50OF90IHRCTkVQX1JFU1VMVDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENhbGxiYWNrIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIENvbm5lY3Rpb24gaGFuZGxlCi0gKiAgICAgICAgICAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqICAgICAgICAgICAgICBDb25uZWN0aW9uIHN0YXRlIGNoYW5nZSByZXN1bHQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TVUNDRVNTIGluZGljYXRlcyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgQWxsIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcmVhc29uIGZvciBmYWlsdXJlCi0gKiAgICAgICAgICAgICAgRmxhZyB0byBpbmRpY2F0ZSBpZiBpdCBpcyBqdXN0IGEgcm9sZSBjaGFuZ2UKLSovCi10eXBlZGVmIHZvaWQodEJORVBfQ09OTl9TVEFURV9DQikodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTkVQX1JFU1VMVCByZXN1bHQsIGJvb2wgaXNfcm9sZV9jaGFuZ2UpOwotCi0vKiBDb25uZWN0aW9uIGluZGljYXRpb24gY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlLCByZW1vdGUgVVVJRCBhbmQgbG9jYWwgVVVJRAotICogICAgICAgICAgICAgIGFuZCBmbGFnIHRvIGluZGljYXRlIHJvbGUgY2hhbmdlIGFuZCBoYW5kbGUgdG8gdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICBXaGVuIEJORVAgY2FsbHMgdGhpcyBmdW5jdGlvbiBwcm9maWxlIHNob3VsZAotICogICAgICAgICAgICAgIHVzZSBCTkVQX0Nvbm5lY3RSZXNwIGNhbGwgdG8gYWNjZXB0IG9yIHJlamVjdCB0aGUgcmVxdWVzdAotKi8KLXR5cGVkZWYgdm9pZCh0Qk5FUF9DT05ORUNUX0lORF9DQikodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHJlbW90ZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGxvY2FsX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcm9sZV9jaGFuZ2UpOwotCi0vKiBEYXRhIGJ1ZmZlciByZWNlaXZlZCBpbmRpY2F0aW9uIGNhbGxiYWNrIHByb3RvdHlwZS4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICBIYW5kbGUgdG8gdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICBTb3VyY2UgQkQvRXRoZXJuZXQgQWRkcmVzcwotICogICAgICAgICAgICAgIERlc3QgQkQvRXRoZXJuZXQgYWRkcmVzcwotICogICAgICAgICAgICAgIFByb3RvY29sCi0gKiAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyCi0gKiAgICAgICAgICAgICAgRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGV4dGVuc2lvbiBoZWFkZXJzIHRvIGJlIGZvcndhcmRlZCBhcmUKLSAqICAgICAgICAgICAgICAgIHByZXNlbnQKLSAqLwotdHlwZWRlZiB2b2lkKHRCTkVQX0RBVEFfQlVGX0NCKSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgZHN0LCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZiwgYm9vbCBmd19leHRfcHJlc2VudCk7Ci0KLS8qIERhdGEgcmVjZWl2ZWQgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgSGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgU291cmNlIEJEL0V0aGVybmV0IEFkZHJlc3MKLSAqICAgICAgICAgICAgICBEZXN0IEJEL0V0aGVybmV0IGFkZHJlc3MKLSAqICAgICAgICAgICAgICBQcm90b2NvbAotICogICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YQotICogICAgICAgICAgICAgIExlbmd0aCBvZiBkYXRhCi0gKiAgICAgICAgICAgICAgRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGV4dGVuc2lvbiBoZWFkZXJzIHRvIGJlIGZvcndhcmRlZCBhcmUKLSAqICAgICAgICAgICAgICAgIHByZXNlbnQKLSAqLwotdHlwZWRlZiB2b2lkKHRCTkVQX0RBVEFfSU5EX0NCKSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgZHN0LCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZndfZXh0X3ByZXNlbnQpOwotCi0vKiBGbG93IGNvbnRyb2wgY2FsbGJhY2sgZm9yIFRYIGRhdGEuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgSGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgRXZlbnQgIGZsb3cgc3RhdHVzCi0qLwotdHlwZWRlZiB2b2lkKHRCTkVQX1RYX0RBVEFfRkxPV19DQikodWludDE2X3QgaGFuZGxlLCB0Qk5FUF9SRVNVTFQgZXZlbnQpOwotCi0vKiBGaWx0ZXJzIHJlY2VpdmVkIGluZGljYXRpb24gY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEhhbmRsZSB0byB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgIHRydWUgaWYgdGhlIGNiIGlzIGNhbGxlZCBmb3IgaW5kaWNhdGlvbgotICogICAgICAgICAgICAgIElnbm9yZSB0aGlzIGlmIGl0IGlzIGluZGljYXRpb24sIG90aGVyd2lzZSBpdCBpcyB0aGUgcmVzdWx0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGZpbHRlciBzZXQgb3BlcmF0aW9uIHBlcmZvcm1lZCBieSB0aGUgbG9jYWwKLSAqICAgICAgICAgICAgICAgICAgICAgIGRldmljZQotICogICAgICAgICAgICAgIE51bWJlciBvZiBwcm90b2NvbCBmaWx0ZXJzIHByZXNlbnQKLSAqICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXJzIHN0YXJ0LiBGaWx0ZXJzIGFyZSBwcmVzZW50IGluIHBhaXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBzdGFydCBvZiB0aGUgcmFuZ2UgYW5kIGVuZCBvZiB0aGUgcmFuZ2UuCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGV5IHdpbGwgYmUgcHJlc2VudCBpbiBiaWcgZW5kaWFuIG9yZGVyLiBGaXJzdAotICogICAgICAgICAgICAgICAgICAgICAgdHdvIGJ5dGVzIHdpbGwgYmUgc3RhcnRpbmcgb2YgdGhlIGZpcnN0IHJhbmdlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgbmV4dCB0d28gYnl0ZXMgd2lsbCBiZSBlbmRpbmcgb2YgdGhlIHJhbmdlLgotKi8KLXR5cGVkZWYgdm9pZCh0Qk5FUF9GSUxURVJfSU5EX0NCKSh1aW50MTZfdCBoYW5kbGUsIGJvb2wgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qk5FUF9SRVNVTFQgcmVzdWx0LCB1aW50MTZfdCBudW1fZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMpOwotCi0vKiBNdWx0aWNhc3QgRmlsdGVycyByZWNlaXZlZCBpbmRpY2F0aW9uIGNhbGxiYWNrIHByb3RvdHlwZS4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICBIYW5kbGUgdG8gdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICB0cnVlIGlmIHRoZSBjYiBpcyBjYWxsZWQgZm9yIGluZGljYXRpb24KLSAqICAgICAgICAgICAgICBJZ25vcmUgdGhpcyBpZiBpdCBpcyBpbmRpY2F0aW9uLCBvdGhlcndpc2UgaXQgaXMgdGhlIHJlc3VsdAotICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmaWx0ZXIgc2V0IG9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgdGhlIGxvY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKLSAqICAgICAgICAgICAgICBOdW1iZXIgb2YgbXVsdGljYXN0IGZpbHRlcnMgcHJlc2VudAotICogICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlcnMgc3RhcnQuIEZpbHRlcnMgYXJlIHByZXNlbnQgaW4gcGFpcnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIHN0YXJ0IG9mIHRoZSByYW5nZSBhbmQgZW5kIG9mIHRoZSByYW5nZS4KLSAqICAgICAgICAgICAgICAgICAgICAgIEZpcnN0IHNpeCBieXRlcyB3aWxsIGJlIHN0YXJ0aW5nIG9mIHRoZSBmaXJzdCByYW5nZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgIG5leHQgc2l4IGJ5dGVzIHdpbGwgYmUgZW5kaW5nIG9mIHRoZSByYW5nZS4KLSovCi10eXBlZGVmIHZvaWQodEJORVBfTUZJTFRFUl9JTkRfQ0IpKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qk5FUF9SRVNVTFQgcmVzdWx0LCB1aW50MTZfdCBudW1fbWZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbWZpbHRlcnMpOwotCi0vKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCBieSBwcm9maWxlIHRvIHJlZ2lzdGVyIHdpdGggQk5FUCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0Qk5FUF9DT05ORUNUX0lORF9DQiogcF9jb25uX2luZF9jYjsgIC8qIFRvIGluZGljYXRlIHRoZSBjb25uIHJlcXVlc3QgKi8KLSAgdEJORVBfQ09OTl9TVEFURV9DQiogcF9jb25uX3N0YXRlX2NiOyAvKiBUbyBpbmRpY2F0ZSBjb25uIHN0YXRlIGNoYW5nZSAqLwotICB0Qk5FUF9EQVRBX0lORF9DQiogcF9kYXRhX2luZF9jYjsgICAgIC8qIFRvIHBhc3MgdGhlIGRhdGEgcmVjZWl2ZWQgKi8KLSAgdEJORVBfREFUQV9CVUZfQ0IqIHBfZGF0YV9idWZfY2I7ICAgICAvKiBUbyBwYXNzIHRoZSBkYXRhIGJ1ZmZlciByZWNlaXZlZCAqLwotICB0Qk5FUF9UWF9EQVRBX0ZMT1dfQ0IqIHBfdHhfZGF0YV9mbG93X2NiOyAvKiBkYXRhIGZsb3cgY2FsbGJhY2sgKi8KLSAgdEJORVBfRklMVEVSX0lORF9DQioKLSAgICAgIHBfZmlsdGVyX2luZF9jYjsgLyogVG8gaW5kaWNhdGUgdGhhdCBwZWVyIHNldCBwcm90b2NvbCBmaWx0ZXJzICovCi0gIHRCTkVQX01GSUxURVJfSU5EX0NCKgotICAgICAgcF9tZmlsdGVyX2luZF9jYjsgLyogVG8gaW5kaWNhdGUgdGhhdCBwZWVyIHNldCBtY2FzdCBmaWx0ZXJzICovCi0KLX0gdEJORVBfUkVHSVNURVI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyIGxheWVyIHRvIHJlZ2lzdGVyCi0gKiAgICAgICAgICAgICAgICAgIGl0cyBjYWxsYmFja3Mgd2l0aCBCTkVQCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX3JlZ19pbmZvIC0gY29udGFpbnMgYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICBpZiByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBCTkVQX0ZBSUxVUkUgICAgICAgIGlmIGNvbm5lY3Rpb24gc3RhdGUgY2FsbGJhY2sgaXMgbWlzc2luZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJORVBfUkVTVUxUIEJORVBfUmVnaXN0ZXIodEJORVBfUkVHSVNURVIqIHBfcmVnX2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9EZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdXBwZXIgbGF5ZXIgdG8gZGUtcmVnaXN0ZXIKLSAqICAgICAgICAgICAgICAgICAgaXRzIGNhbGxiYWNrcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHZvaWQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJORVBfRGVyZWdpc3Rlcih2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJORVBfQ29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgQk5FUCBjb25uZWN0aW9uIHRvIGEgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHBfcmVtX2FkZHIgLSBCRF9BRERSIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIHNyY191dWlkICAgLSBzb3VyY2UgdXVpZCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgZHN0X3V1aWQgICAtIGRlc3RpbmF0aW9uIHV1aWQgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfaGFuZGxlICAgLSBwb2ludGVyIHRvIHJldHVybiB0aGUgaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24gc3RhcnRlZAotICogICAgICAgICAgICAgICAgICBCTkVQX05PX1JFU09VUkNFUyAgICAgICAgICAgaWYgbm8gcmVzb3VyY2VzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0Qk5FUF9SRVNVTFQgQk5FUF9Db25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIHBfcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgc3JjX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIGRzdF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfaGFuZGxlLCB1aW50MzJfdCBteF9jaGFuX2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJORVBfQ29ubmVjdFJlc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHJlc3BvbmNlIHRvIGNvbm5lY3Rpb24gaW5kaWNhdGlvbgotICoKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgLSBoYW5kbGUgZ2l2ZW4gaW4gdGhlIGNvbm5lY3Rpb24gaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICByZXNwICAgIC0gcmVzcG9uY2UgZm9yIHRoZSBjb25uZWN0aW9uIGluZGljYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJORVBfU1VDQ0VTUyAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uIHN0YXJ0ZWQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9XUk9OR19IQU5ETEUgICAgICAgICAgIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBmb3VuZAotICogICAgICAgICAgICAgICAgICBCTkVQX1dST05HX1NUQVRFICAgICAgICAgICAgaWYgdGhlIHJlc3BvbmNlIGlzIG5vdCBleHBlY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJORVBfUkVTVUxUIEJORVBfQ29ubmVjdFJlc3AodWludDE2X3QgaGFuZGxlLCB0Qk5FUF9SRVNVTFQgcmVzcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX0Rpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsb3NlIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgIC0gaGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9XUk9OR19IQU5ETEUgICAgICAgICAgIGlmIG5vIGNvbm5lY3Rpb24gaXMgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0Qk5FUF9SRVNVTFQgQk5FUF9EaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX1dyaXRlQnVmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGRhdGEgaW4gYSBHS0kgYnVmZmVyIG9uIEJORVAgY29ubmVjdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgIC0gaGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHdyaXRlCi0gKiAgICAgICAgICAgICAgICAgIHBfZGVzdF9hZGRyICAtIEJEX0FERFIvRXRoZXJuZXQgYWRkciBvZiB0aGUgZGVzdGluYXRpb24KLSAqICAgICAgICAgICAgICAgICAgcF9idWYgICAgICAgIC0gcG9pbnRlciB0byBhZGRyZXNzIG9mIGJ1ZmZlciB3aXRoIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgICAgIC0gcHJvdG9jb2wgdHlwZSBvZiB0aGUgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIHBfc3JjX2FkZHIgICAtIChvcHRpb25hbCkgQkRfQUREUi9ldGhlcm5ldCBhZGRyZXNzIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgKHNob3VsZCBiZSBOVUxMIGlmIGl0IGlzIHRoZSBsb2NhbCBCRAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIpCi0gKiAgICAgICAgICAgICAgICAgIGZ3X2V4dF9wcmVzZW50IC0gZm9yd2FyZGVkIGV4dGVuc2lvbnMgcHJlc2VudAotICoKLSAqIFJldHVybnM6ICAgICAgICAgQk5FUF9XUk9OR19IQU5ETEUgICAgICAgLSBpZiBwYXNzZWQgaGFuZGxlIGlzIG5vdCB2YWxpZAotICogICAgICAgICAgICAgICAgICBCTkVQX01UVV9FWENFREVEICAgICAgICAtIElmIHRoZSBkYXRhIGxlbmd0aCBpcyBncmVhdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBNVFUKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9JR05PUkVfQ01EICAgICAgICAgLSBJZiB0aGUgcGFja2V0IGlzIGZpbHRlcmVkIG91dAotICogICAgICAgICAgICAgICAgICBCTkVQX1FfU0laRV9FWENFRURFRCAgICAtIElmIHRoZSBUeCBRIGlzIGZ1bGwKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICAgICAgLSBJZiB3cml0dGVuIHN1Y2Nlc3NmdWxseQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJORVBfUkVTVUxUIEJORVBfV3JpdGVCdWYodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBfZGVzdF9hZGRyLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHBfc3JjX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmd19leHRfcHJlc2VudCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX1dyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGRhdGEgb3ZlciBhIEJORVAgY29ubmVjdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgIC0gaGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHdyaXRlCi0gKiAgICAgICAgICAgICAgICAgIHBfZGVzdF9hZGRyICAtIEJEX0FERFIvRXRoZXJuZXQgYWRkciBvZiB0aGUgZGVzdGluYXRpb24KLSAqICAgICAgICAgICAgICAgICAgcF9kYXRhICAgICAgIC0gcG9pbnRlciB0byBkYXRhIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgIHByb3RvY29sICAgICAtIHByb3RvY29sIHR5cGUgb2YgdGhlIHBhY2tldAotICogICAgICAgICAgICAgICAgICBwX3NyY19hZGRyICAgLSAob3B0aW9uYWwpIEJEX0FERFIvZXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIChzaG91bGQgYmUgTlVMTCBpZiBpdCBpcyB0aGUgbG9jYWwgQkQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcikKLSAqICAgICAgICAgICAgICAgICAgZndfZXh0X3ByZXNlbnQgLSBmb3J3YXJkZWQgZXh0ZW5zaW9ucyBwcmVzZW50Ci0gKgotICogUmV0dXJuczogICAgICAgICBCTkVQX1dST05HX0hBTkRMRSAgICAgICAtIGlmIHBhc3NlZCBoYW5kbGUgaXMgbm90IHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfTVRVX0VYQ0VERUQgICAgICAgIC0gSWYgdGhlIGRhdGEgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNVFUKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9JR05PUkVfQ01EICAgICAgICAgLSBJZiB0aGUgcGFja2V0IGlzIGZpbHRlcmVkIG91dAotICogICAgICAgICAgICAgICAgICBCTkVQX1FfU0laRV9FWENFRURFRCAgICAtIElmIHRoZSBUeCBRIGlzIGZ1bGwKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9OT19SRVNPVVJDRVMgICAgICAgLSBJZiBub3QgYWJsZSB0byBhbGxvY2F0ZSBhIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAtIElmIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0Qk5FUF9SRVNVTFQgQk5FUF9Xcml0ZSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBfZGVzdF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwX3NyY19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZndfZXh0X3ByZXNlbnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQk5FUF9TZXRQcm90b2NvbEZpbHRlcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcHJvdG9jb2wgZmlsdGVycyBvbiBwZWVyIGRldmljZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgICAtIEhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgICAtIHRvdGFsIG51bWJlciBvZiBmaWx0ZXIgcmFuZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHBfc3RhcnRfYXJyYXkgLSBBcnJheSBvZiBiZWdpbmluZ3Mgb2YgYWxsIHByb3RvY29sIHJhbmdlcwotICogICAgICAgICAgICAgICAgICBwX2VuZF9hcnJheSAgIC0gQXJyYXkgb2YgZW5kcyBvZiBhbGwgcHJvdG9jb2wgcmFuZ2VzCi0gKgotICogUmV0dXJucyAgICAgICAgICBCTkVQX1dST05HX0hBTkRMRSAgICAgICAgICAgLSBpZiB0aGUgY29ubmVjdGlvbiBoYW5kbGUgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfU0VUX0ZJTFRFUl9GQUlMICAgICAgICAtIGlmIHRoZSBjb25uZWN0aW9uIGlzIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZyBzdGF0ZQotICogICAgICAgICAgICAgICAgICBCTkVQX1RPT19NQU5ZX0ZJTFRFUlMgICAgICAgLSBpZiB0b28gbWFueSBmaWx0ZXJzCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfU1VDQ0VTUyAgICAgICAgICAgICAgICAtIGlmIHJlcXVlc3Qgc2VudCBzdWNjZXNzZnVsbHkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRCTkVQX1JFU1VMVCBCTkVQX1NldFByb3RvY29sRmlsdGVycyh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9zdGFydF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfZW5kX2FycmF5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJORVBfU2V0TXVsdGljYXN0RmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWx0ZXJzIGZvciBtdWx0aWNhc3QgYWRkcmVzc2VzIGZvcgotICogICAgICAgICAgICAgICAgICBCTkVQLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgICAtIEhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgICAtIHRvdGFsIG51bWJlciBvZiBmaWx0ZXIgcmFuZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHBfc3RhcnRfYXJyYXkgLSBQb2ludGVyIHRvIHNlcXVlbmNlIG9mIGJlZ2luaW5ncyBvZiBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgYWRkcmVzcyByYW5nZXMKLSAqICAgICAgICAgICAgICAgICAgcF9lbmRfYXJyYXkgICAtIFBvaW50ZXIgdG8gc2VxdWVuY2Ugb2YgZW5kcyBvZiBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgYWRkcmVzcyByYW5nZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJORVBfV1JPTkdfSEFORExFICAgICAgICAgICAtIGlmIHRoZSBjb25uZWN0aW9uIGhhbmRsZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdmFsaWQKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TRVRfRklMVEVSX0ZBSUwgICAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgIEJORVBfVE9PX01BTllfRklMVEVSUyAgICAgICAtIGlmIHRvbyBtYW55IGZpbHRlcnMKLSAqICAgICAgICAgICAgICAgICAgQk5FUF9TVUNDRVNTICAgICAgICAgICAgICAgIC0gaWYgcmVxdWVzdCBzZW50IHN1Y2Nlc3NmdWxseQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJORVBfUkVTVUxUIEJORVBfU2V0TXVsdGljYXN0RmlsdGVycyh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc3RhcnRfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2VuZF9hcnJheSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCTkVQX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEJORVAuIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMHhGRiwgaXQgc2ltcGx5IHJlYWRzIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIG5ldyAoY3VycmVudCkgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQ4X3QgQk5FUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJORVBfSW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQk5FUCB1bml0LiBJdCBzaG91bGQgYmUgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIGJlZm9yZSBhY2Nlc3NpbmcgYW55IG90aGVyIEFQSXMgdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJvbAotICogICAgICAgICAgICAgICAgICBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCTkVQX0luaXQodm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idF9kZXZfY2xhc3MuaCBiL3N0YWNrL2luY2x1ZGUvYnRfZGV2X2NsYXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzZkNTQuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idF9kZXZfY2xhc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxjc3RkaW50PgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZiAgLy8gX19jcGx1c3BsdXMKLQotI2RlZmluZSBERVZfQ0xBU1NfTEVOIDMKLXR5cGVkZWYgdWludDhfdCBERVZfQ0xBU1NbREVWX0NMQVNTX0xFTl07IC8qIERldmljZSBjbGFzcyAqLwotCi0jZGVmaW5lIERFVkNMQVNTX1RPX1NUUkVBTShwLCBhKSAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGlqazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpamsgPSAwOyBpamsgPCBERVZfQ0xBU1NfTEVOOyBpamsrKykgICAgICAgICBcCi0gICAgICAqKHApKysgPSAodWludDhfdCkoYSlbREVWX0NMQVNTX0xFTiAtIDEgLSBpamtdOyBcCi0gIH0KLQotI2RlZmluZSBTVFJFQU1fVE9fREVWQ0xBU1MoYSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpams7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QqIF9wYSA9ICh1aW50OF90KikoYSkgKyBERVZfQ0xBU1NfTEVOIC0gMTsgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgREVWX0NMQVNTX0xFTjsgaWprKyspICpfcGEtLSA9ICoocCkrKzsgXAotICB9CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2J0X2RldmljZV90eXBlLmggYi9zdGFjay9pbmNsdWRlL2J0X2RldmljZV90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTQ0MTYuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idF9kZXZpY2VfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0vKiBEZXZpY2UgVHlwZXMKLSAqLwotZW51bSB7Ci0gIEJUX0RFVklDRV9UWVBFX1VOS05PV04gPSAwLAotICBCVF9ERVZJQ0VfVFlQRV9CUkVEUiA9ICgxIDw8IDApLAotICBCVF9ERVZJQ0VfVFlQRV9CTEUgPSAoMSA8PCAxKSwKLSAgQlRfREVWSUNFX1RZUEVfRFVNTyA9IEJUX0RFVklDRV9UWVBFX0JSRURSIHwgQlRfREVWSUNFX1RZUEVfQkxFLAotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRfREVWSUNFX1RZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotaW5saW5lIHN0ZDo6c3RyaW5nIERldmljZVR5cGVUZXh0KHRCVF9ERVZJQ0VfVFlQRSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgQlRfREVWSUNFX1RZUEVfQlJFRFI6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkJSX0VEUiIpOwotICAgIGNhc2UgQlRfREVWSUNFX1RZUEVfQkxFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJCTEUiKTsKLSAgICBjYXNlIEJUX0RFVklDRV9UWVBFX0RVTU86Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkRVQUwiKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVbmtub3duIik7Ci0gIH0KLX0KLSNlbmRpZiAgLy8gX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYnRfaGRyLmggYi9zdGFjay9pbmNsdWRlL2J0X2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE4NWM2Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYnRfaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZiAgLy8gX2NwbHVzcGx1cwotCi0vKiBEZWZpbmUgdGhlIGhlYWRlciBvZiBlYWNoIGJ1ZmZlciB1c2VkIGluIHRoZSBCbHVldG9vdGggc3RhY2suCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgZXZlbnQ7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDE2X3Qgb2Zmc2V0OwotICB1aW50MTZfdCBsYXllcl9zcGVjaWZpYzsKLSAgdWludDhfdCBkYXRhW107Ci19IEJUX0hEUjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBldmVudDsKLSAgdWludDE2X3QgbGVuOwotICB1aW50MTZfdCBvZmZzZXQ7Ci0gIHVpbnQxNl90IGxheWVyX3NwZWNpZmljOwotICAvLyBOb3RlOiBSZW1vdmFsIG9mIGZsZXhpYmxlIGFycmF5IG1lbWJlciB3aXRoIG5vIHNwZWNpZmllZCBzaXplLgotICAvLyBUaGlzIHN0cnVjdCBtYXkgYmUgZW1iZWRkZWQgaW4gYW55IHBvc2l0aW9uIHdpdGhpbiBvdGhlciBzdHJ1Y3RzCi0gIC8vIGFuZCB3aWxsIG5vdCB0cmlnZ2VyIHZhcmlvdXMgZmxleGlibGUgbWVtYmVyIGNvbXBpbGF0aW9uIGlzc3Vlcy4KLX0gQlRfSERSX1JJR0lEOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCogVG9QYWNrZXREYXRhKEJUX0hEUiogYnRfaGRyLCBzaXplX3Qgb2Zmc2V0ID0gMCkgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oYnRfaGRyLT5kYXRhICsgYnRfaGRyLT5vZmZzZXQgKyBvZmZzZXQpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jb25zdCBUKiBUb1BhY2tldERhdGEoY29uc3QgQlRfSERSKiBidF9oZHIsIHNpemVfdCBvZmZzZXQgPSAwKSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihidF9oZHItPmRhdGEgKyBidF9oZHItPm9mZnNldCArIG9mZnNldCk7Ci19Ci0jZW5kaWYgIC8vIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgQlRfSERSX1NJWkUgKHNpemVvZihCVF9IRFIpKQpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idF9uYW1lLmggYi9zdGFjay9pbmNsdWRlL2J0X25hbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwZmJiNi4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2J0X25hbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxjc3RkaW50PgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0vLyBOT1RFOiBTaGFyZWQgd2l0aCBpbnRlcm5hbF9pbmNsdWRlL2J0X3RhcmdldC5oCi0vKiBNYXhpbXVtIGRldmljZSBuYW1lIGxlbmd0aCB1c2VkIGluIGJ0bSBkYXRhYmFzZS4gKi8KLSNpZm5kZWYgQlRNX01BWF9SRU1fQkRfTkFNRV9MRU4KLSNkZWZpbmUgQlRNX01BWF9SRU1fQkRfTkFNRV9MRU4gMjQ4Ci0jZW5kaWYKLQotLyogTWF4aW11bSBsb2NhbCBkZXZpY2UgbmFtZSBsZW5ndGggc3RvcmVkIGJ0bSBkYXRhYmFzZSAqLwotI2lmbmRlZiBCVE1fTUFYX0xPQ19CRF9OQU1FX0xFTgotI2RlZmluZSBCVE1fTUFYX0xPQ19CRF9OQU1FX0xFTiAyNDgKLSNlbmRpZgotCi0jZGVmaW5lIEJEX05BTUVfTEVOIDI0OAotdHlwZWRlZiB1aW50OF90IEJEX05BTUVbQkRfTkFNRV9MRU4gKyAxXTsgLyogRGV2aWNlIG5hbWUgKi8KLQotLyogRGV2aWNlIG5hbWUgb2YgcGVlciAobWF5IGJlIHRydW5jYXRlZCB0byBzYXZlIHNwYWNlIGluIEJUTSBkYXRhYmFzZSkgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRNX0JEX05BTUVbQlRNX01BWF9SRU1fQkRfTkFNRV9MRU4gKyAxXTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmggYi9zdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM5ZTA3Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotLyogU29tZSBDIGZpbGVzIGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1jb25zdGV4cHIgaW50IE9DVEVUMTZfTEVOID0gMTY7Ci10eXBlZGVmIHN0ZDo6YXJyYXk8dWludDhfdCwgT0NURVQxNl9MRU4+IE9jdGV0MTY7Ci0KLWNvbnN0ZXhwciBpbnQgTElOS19LRVlfTEVOID0gT0NURVQxNl9MRU47Ci10eXBlZGVmIE9jdGV0MTYgTGlua0tleTsgLyogTGluayBLZXkgKi8KLQotLyogU2FtcGxlIExUSyBmcm9tIEJUIFNwZWMgNS4xIHwgVm9sIDYsIFBhcnQgQyAxCi0gKiAweDRDNjgzODQxMzlGNTc0RDgzNkJDRjM0RTlERkIwMUJGICovCi1jb25zdGV4cHIgT2N0ZXQxNiBTQU1QTEVfTFRLID0gezB4YmYsIDB4MDEsIDB4ZmIsIDB4OWQsIDB4NGUsIDB4ZjMsIDB4YmMsIDB4MzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZDgsIDB4NzQsIDB4ZjUsIDB4MzksIDB4NDEsIDB4MzgsIDB4NjgsIDB4NGN9OwotaW5saW5lIGJvb2wgaXNfc2FtcGxlX2x0ayhjb25zdCBPY3RldDE2JiBsdGspIHsgcmV0dXJuIGx0ayA9PSBTQU1QTEVfTFRLOyB9Ci0KLSNlbmRpZgotCi0jZGVmaW5lIEJUX09DVEVUOF9MRU4gOAotdHlwZWRlZiB1aW50OF90IEJUX09DVEVUOFtCVF9PQ1RFVDhfTEVOXTsgLyogb2N0ZXQgYXJyYXk6IHNpemUgMTYgKi8KLQotI2RlZmluZSBCVF9PQ1RFVDMyX0xFTiAzMgotdHlwZWRlZiB1aW50OF90IEJUX09DVEVUMzJbQlRfT0NURVQzMl9MRU5dOyAvKiBvY3RldCBhcnJheTogc2l6ZSAzMiAqLwotCi0jZGVmaW5lIFBJTl9DT0RFX0xFTiAxNgotdHlwZWRlZiB1aW50OF90IFBJTl9DT0RFW1BJTl9DT0RFX0xFTl07IC8qIFBpbiBDb2RlICh1cHRvIDEyOCBiaXRzKSBNU0IgaXMgMCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idF90eXBlcy5oIGIvc3RhY2svaW5jbHVkZS9idF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdhYjRkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUX1RZUEVTX0gKLSNkZWZpbmUgQlRfVFlQRVNfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RyaW5nPgotI2VuZGlmICAvLyBfX2NwbHVzcGx1cwotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9kZXZfY2xhc3MuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2RldmljZV90eXBlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X25hbWUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jZW5kaWYgIC8vIF9fY3BsdXNwbHVzCi0KLS8qIFJFQUQgV0VMTCAhIQotICoKLSAqIFRoaXMgc2VjdGlvbiBkZWZpbmVzIGdsb2JhbCBldmVudHMuIFRoZXNlIGFyZSBldmVudHMgdGhhdCBjcm9zcyBsYXllcnMuCi0gKiBBbnkgZXZlbnQgdGhhdCBwYXNzZXMgYmV0d2VlbiBsYXllcnMgTVVTVCBiZSBvbmUgb2YgdGhlc2UgZXZlbnRzLiBUYXNrcwotICogY2FuIHVzZSB0aGVpciBvd24gZXZlbnRzIGludGVybmFsbHksIGJ1dCBhIEZVTkRBTUVOVEFMIGRlc2lnbiBpc3N1ZSBpcwotICogdGhhdCBnbG9iYWwgZXZlbnRzIE1VU1QgYmUgb25lIG9mIHRoZXNlIGV2ZW50cyBkZWZpbmVkIGJlbG93LgotICoKLSAqIFRoZSBjb252ZW50aW9uIHVzZWQgaXMgdGhlIHRoZSBldmVudCBuYW1lIGNvbnRhaW5zIHRoZSBsYXllciB0aGF0IHRoZQotICogZXZlbnQgaXMgZ29pbmcgdG8uCi0gKi8KLSNkZWZpbmUgQlRfRVZUX01BU0sgMHhGRjAwCi0jZGVmaW5lIEJUX1NVQl9FVlRfTUFTSyAweDAwRkYKLS8qIFRvIEJsdWV0b290aCBVcHBlciBMYXllcnMgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSENJIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0JUVV9IQ0lfRVZUIDB4MTAwMAotLyogQUNMIERhdGEgZnJvbSBIQ0kgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0JUVV9IQ0lfQUNMIDB4MTEwMAotLyogU0NPIERhdGEgZnJvbSBIQ0kgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0JUVV9IQ0lfU0NPIDB4MTIwMAotLyogSENJIFRyYW5zcG9ydCBFcnJvciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0JUVV9IQ0lUX0VSUiAweDEzMDAKLQotLyogU2VyaWFsIFBvcnQgRGF0YSAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0JUVV9TUF9EQVRBIDB4MTUwMAotCi0vKiBIQ0kgY29tbWFuZCBmcm9tIHVwcGVyIGxheWVyICAgICAqLwotI2RlZmluZSBCVF9FVlRfVE9fQlRVX0hDSV9DTUQgMHgxNjAwCi0KLS8qIElTTyBEYXRhIGZyb20gSENJICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUX0VWVF9UT19CVFVfSENJX0lTTyAweDE3MDAKLQotLyogTDJDQVAgc2VnbWVudChzKSB0cmFuc21pdHRlZCAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0JUVV9MMkNfU0VHX1hNSVQgMHgxOTAwCi0KLS8qIFRvIExNICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSENJIENvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0xNX0hDSV9DTUQgMHgyMDAwCi0vKiBIQ0kgQUNMIERhdGEgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBCVF9FVlRfVE9fTE1fSENJX0FDTCAweDIxMDAKLS8qIEhDSSBTQ08gRGF0YSAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJUX0VWVF9UT19MTV9IQ0lfU0NPIDB4MjIwMAotLyogSENJIElTTyBEYXRhICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQlRfRVZUX1RPX0xNX0hDSV9JU08gMHgyZDAwCi0KLSNkZWZpbmUgQlRfRVZUX0hDSVNVIDB4NTAwMAotCi0vKiBCVElGIEV2ZW50cyAqLwotI2RlZmluZSBCVF9FVlRfQlRJRiAweEEwMDAKLSNkZWZpbmUgQlRfRVZUX0NPTlRFWFRfU1dJVENIX0VWVCAoMHgwMDAxIHwgQlRfRVZUX0JUSUYpCi0KLS8qIElTTyBMYXllciBzcGVjaWZpYyAqLwotI2RlZmluZSBCVF9JU09fSERSX0NPTlRBSU5TX1RTICgweDAwMDEpCi0jZGVmaW5lIEJUX0lTT19IRFJfT0ZGU0VUX1BPSU5UU19EQVRBICgweDAwMDIpCi0KLWVudW0gewotICBCVF9QU01fU0RQID0gMHgwMDAxLAotICBCVF9QU01fUkZDT01NID0gMHgwMDAzLAotICBCVF9QU01fVENTID0gMHgwMDA1LAotICBCVF9QU01fQ1RQID0gMHgwMDA3LAotICBCVF9QU01fQk5FUCA9IDB4MDAwRiwKLSAgQlRfUFNNX0hJREMgPSAweDAwMTEsCi0gIEhJRF9QU01fQ09OVFJPTCA9IDB4MDAxMSwKLSAgQlRfUFNNX0hJREkgPSAweDAwMTMsCi0gIEhJRF9QU01fSU5URVJSVVBUID0gMHgwMDEzLAotICBCVF9QU01fVVBOUCA9IDB4MDAxNSwKLSAgQlRfUFNNX0FWQ1RQID0gMHgwMDE3LAotICBCVF9QU01fQVZEVFAgPSAweDAwMTksCi0gIEJUX1BTTV9BVkNUUF8xMyA9IDB4MDAxQiwgLyogQWR2YW5jZWQgQ29udHJvbCAtIEJyb3dzaW5nICovCi0gIEJUX1BTTV9VRElfQ1AgPQotICAgICAgMHgwMDFELCAgICAgICAgICAvKiBVbnJlc3RyaWN0ZWQgRGlnaXRhbCBJbmZvcm1hdGlvbiBQcm9maWxlIEMtUGxhbmUgICovCi0gIEJUX1BTTV9BVFQgPSAweDAwMUYsIC8qIEF0dHJpYnV0ZSBQcm90b2NvbCAgKi8KLSAgQlRfUFNNX0VBVFQgPSAweDAwMjcsCi0gIC8qIFdlIHdpbGwgbm90IGFsbG9jYXRlIGEgUFNNIGluIHRoZSByZXNlcnZlZCByYW5nZSB0byAzcmQgcGFydHkgYXBwcwotICAgKi8KLSAgQlJDTV9SRVNFUlZFRF9QU01fU1RBUlQgPSAweDVBRTEsCi0gIEJSQ01fUkVTRVJWRURfUFNNX0VORCA9IDB4NUFGRiwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYWNyb3MgdG8gZ2V0IGFuZCBwdXQgYnl0ZXMgdG8gYW5kIGZyb20gYSBzdHJlYW0gKExpdHRsZSBFbmRpYW4gZm9ybWF0KS4KLSAqLwotI2RlZmluZSBVSU5UNjRfVE9fQkVfU1RSRUFNKHAsIHU2NCkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1NjQpID4+IDU2KTsgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTY0KSA+PiA0OCk7IFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHU2NCkgPj4gNDApOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1NjQpID4+IDMyKTsgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTY0KSA+PiAyNCk7IFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHU2NCkgPj4gMTYpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1NjQpID4+IDgpOyAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSh1NjQpOyAgICAgICAgIFwKLSAgfQotI2RlZmluZSBVSU5UMzJfVE9fU1RSRUFNKHAsIHUzMikgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKHUzMik7ICAgICAgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTMyKSA+PiA4KTsgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHUzMikgPj4gMTYpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1MzIpID4+IDI0KTsgXAotICB9Ci0jZGVmaW5lIFVJTlQyNF9UT19TVFJFQU0ocCwgdTI0KSAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkodTI0KTsgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1MjQpID4+IDgpOyAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTI0KSA+PiAxNik7IFwKLSAgfQotI2RlZmluZSBVSU5UMTZfVE9fU1RSRUFNKHAsIHUxNikgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSh1MTYpOyAgICAgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTE2KSA+PiA4KTsgXAotICB9Ci0jZGVmaW5lIFVJTlQ4X1RPX1NUUkVBTShwLCB1OCkgXAotICB7ICoocCkrKyA9ICh1aW50OF90KSh1OCk7IH0KLSNkZWZpbmUgSU5UOF9UT19TVFJFQU0ocCwgdTgpIFwKLSAgeyAqKHApKysgPSAoaW50OF90KSh1OCk7IH0KLSNkZWZpbmUgQVJSQVkxNl9UT19TVFJFQU0ocCwgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGlqazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGlqayA9IDA7IGlqayA8IDE2OyBpamsrKykgKihwKSsrID0gKHVpbnQ4X3QpKGEpWzE1IC0gaWprXTsgXAotICB9Ci0jZGVmaW5lIEFSUkFZOF9UT19TVFJFQU0ocCwgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGlqazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpamsgPSAwOyBpamsgPCA4OyBpamsrKykgKihwKSsrID0gKHVpbnQ4X3QpKGEpWzcgLSBpamtdOyBcCi0gIH0KLSNkZWZpbmUgTEFQX1RPX1NUUkVBTShwLCBhKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaWprOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGlqayA9IDA7IGlqayA8IExBUF9MRU47IGlqaysrKSAgICAgICAgIFwKLSAgICAgICoocCkrKyA9ICh1aW50OF90KShhKVtMQVBfTEVOIC0gMSAtIGlqa107IFwKLSAgfQotI2RlZmluZSBBUlJBWV9UT19TVFJFQU0ocCwgYSwgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpams7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgKGxlbik7IGlqaysrKSAqKHApKysgPSAodWludDhfdCkoYSlbaWprXTsgXAotICB9Ci0jZGVmaW5lIFNUUkVBTV9UT19JTlQ4KHU4LCBwKSAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1OCkgPSAoKigoaW50OF90KikocCkpKTsgICBcCi0gICAgKHApICs9IDE7ICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBTVFJFQU1fVE9fVUlOVDgodTgsIHApIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHU4KSA9ICh1aW50OF90KSgqKHApKTsgICAgXAotICAgIChwKSArPSAxOyAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBTVFJFQU1fVE9fVUlOVDE2KHUxNiwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1MTYpID0gKCh1aW50MTZfdCkoKihwKSkgKyAoKCh1aW50MTZfdCkoKigocCkgKyAxKSkpIDw8IDgpKTsgXAotICAgIChwKSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFNUUkVBTV9UT19VSU5UMjQodTMyLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTMyKSA9ICgoKHVpbnQzMl90KSgqKHApKSkgKyAoKCgodWludDMyX3QpKCooKHApICsgMSkpKSkgPDwgOCkgKyBcCi0gICAgICAgICAgICAgKCgoKHVpbnQzMl90KSgqKChwKSArIDIpKSkpIDw8IDE2KSk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKSArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBTVFJFQU1fVE9fVUlOVDMyKHUzMiwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHUzMikgPSAoKCh1aW50MzJfdCkoKihwKSkpICsgKCgoKHVpbnQzMl90KSgqKChwKSArIDEpKSkpIDw8IDgpICsgXAotICAgICAgICAgICAgICgoKCh1aW50MzJfdCkoKigocCkgKyAyKSkpKSA8PCAxNikgKyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAoKCgodWludDMyX3QpKCooKHApICsgMykpKSkgPDwgMjQpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHApICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFNUUkVBTV9UT19VSU5UNjQodTY0LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTY0KSA9ICgoKHVpbnQ2NF90KSgqKHApKSkgKyAoKCgodWludDY0X3QpKCooKHApICsgMSkpKSkgPDwgOCkgKyBcCi0gICAgICAgICAgICAgKCgoKHVpbnQ2NF90KSgqKChwKSArIDIpKSkpIDw8IDE2KSArICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICgoKCh1aW50NjRfdCkoKigocCkgKyAzKSkpKSA8PCAyNCkgKyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAoKCgodWludDY0X3QpKCooKHApICsgNCkpKSkgPDwgMzIpICsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgKCgoKHVpbnQ2NF90KSgqKChwKSArIDUpKSkpIDw8IDQwKSArICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICgoKCh1aW50NjRfdCkoKigocCkgKyA2KSkpKSA8PCA0OCkgKyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAoKCgodWludDY0X3QpKCooKHApICsgNykpKSkgPDwgNTYpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHApICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFNUUkVBTV9UT19BUlJBWTE2KGEsIHApICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaWprOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDhfdCogX3BhID0gKHVpbnQ4X3QqKShhKSArIDE1OyAgICAgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgMTY7IGlqaysrKSAqX3BhLS0gPSAqKHApKys7IFwKLSAgfQotI2RlZmluZSBTVFJFQU1fVE9fQVJSQVk4KGEsIHApICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpams7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QqIF9wYSA9ICh1aW50OF90KikoYSkgKyA3OyAgICAgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgODsgaWprKyspICpfcGEtLSA9ICoocCkrKzsgXAotICB9Ci0jZGVmaW5lIFNUUkVBTV9UT19MQVAoYSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaWprOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDhfdCogcGxhcCA9ICh1aW50OF90KikoYSkgKyBMQVBfTEVOIC0gMTsgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgTEFQX0xFTjsgaWprKyspICpwbGFwLS0gPSAqKHApKys7IFwKLSAgfQotI2RlZmluZSBTVFJFQU1fVE9fQVJSQVkoYSwgcCwgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpams7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgKGxlbik7IGlqaysrKSAoKHVpbnQ4X3QqKShhKSlbaWprXSA9ICoocCkrKzsgXAotICB9Ci0jZGVmaW5lIFNUUkVBTV9TS0lQX1VJTlQ4KHApIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKSArPSAxOyAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZGVmaW5lIFNUUkVBTV9TS0lQX1VJTlQxNihwKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHApICs9IDI7ICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZGVmaW5lIFNUUkVBTV9TS0lQX1VJTlQzMihwKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHApICs9IDQ7ICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYWNyb3MgdG8gZ2V0IGFuZCBwdXQgYnl0ZXMgdG8gYW5kIGZyb20gYSBzdHJlYW0gKEJpZyBFbmRpYW4gZm9ybWF0KQotICovCi0jZGVmaW5lIFVJTlQzMl9UT19CRV9TVFJFQU0ocCwgdTMyKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHUzMikgPj4gMjQpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1MzIpID4+IDE2KTsgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTMyKSA+PiA4KTsgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkodTMyKTsgICAgICAgICBcCi0gIH0KLSNkZWZpbmUgVUlOVDI0X1RPX0JFX1NUUkVBTShwLCB1MjQpICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTI0KSA+PiAxNik7IFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHUyNCkgPj4gOCk7ICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKHUyNCk7ICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgdTE2KSBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1MTYpID4+IDgpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKHUxNik7ICAgICAgICBcCi0gIH0KLSNkZWZpbmUgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIHU4KSBcCi0gIHsgKihwKSsrID0gKHVpbnQ4X3QpKHU4KTsgfQotI2RlZmluZSBBUlJBWV9UT19CRV9TVFJFQU0ocCwgYSwgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpams7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgKGxlbik7IGlqaysrKSAqKHApKysgPSAodWludDhfdCkoYSlbaWprXTsgXAotICB9Ci0jZGVmaW5lIEJFX1NUUkVBTV9UT19VSU5UOCh1OCwgcCkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTgpID0gKHVpbnQ4X3QpKCoocCkpOyAgICAgICBcCi0gICAgKHApICs9IDE7ICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIEJFX1NUUkVBTV9UT19VSU5UMTYodTE2LCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1MTYpID0gKHVpbnQxNl90KSgoKHVpbnQxNl90KSgqKHApKSA8PCA4KSArICh1aW50MTZfdCkoKigocCkgKyAxKSkpOyBcCi0gICAgKHApICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBCRV9TVFJFQU1fVE9fVUlOVDI0KHUzMiwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh1MzIpID0gKCgodWludDMyX3QpKCooKHApICsgMikpKSArICgodWludDMyX3QpKCooKHApICsgMSkpIDw8IDgpICsgXAotICAgICAgICAgICAgICgodWludDMyX3QpKCoocCkpIDw8IDE2KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwKSArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIEJFX1NUUkVBTV9UT19VSU5UMzIodTMyLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTMyKSA9ICgodWludDMyX3QpKCooKHApICsgMykpICsgKCh1aW50MzJfdCkoKigocCkgKyAyKSkgPDwgOCkgKyAgICBcCi0gICAgICAgICAgICAgKCh1aW50MzJfdCkoKigocCkgKyAxKSkgPDwgMTYpICsgKCh1aW50MzJfdCkoKihwKSkgPDwgMjQpKTsgXAotICAgIChwKSArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBCRV9TVFJFQU1fVE9fVUlOVDY0KHU2NCwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHU2NCkgPSAoKHVpbnQ2NF90KSgqKChwKSArIDcpKSArICgodWludDY0X3QpKCooKHApICsgNikpIDw8IDgpICsgICAgICAgICAgXAotICAgICAgICAgICAgICgodWludDY0X3QpKCooKHApICsgNSkpIDw8IDE2KSArICgodWludDY0X3QpKCooKHApICsgNCkpIDw8IDI0KSArIFwKLSAgICAgICAgICAgICAoKHVpbnQ2NF90KSgqKChwKSArIDMpKSA8PCAzMikgKyAoKHVpbnQ2NF90KSgqKChwKSArIDIpKSA8PCA0MCkgKyBcCi0gICAgICAgICAgICAgKCh1aW50NjRfdCkoKigocCkgKyAxKSkgPDwgNDgpICsgKCh1aW50NjRfdCkoKihwKSkgPDwgNTYpKTsgICAgICAgXAotICAgIChwKSArPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2RlZmluZSBCRV9TVFJFQU1fVE9fQVJSQVkocCwgYSwgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBpams7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaWprID0gMDsgaWprIDwgKGxlbik7IGlqaysrKSAoKHVpbnQ4X3QqKShhKSlbaWprXSA9ICoocCkrKzsgXAotICB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYWNyb3MgdG8gZ2V0IGFuZCBwdXQgYnl0ZXMgdG8gYW5kIGZyb20gYSBmaWVsZCAoQmlnIEVuZGlhbiBmb3JtYXQpLgotICogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRvIHN0cmVhbSwgZXhjZXB0IHRoZSBwb2ludGVyIGlzIG5vdCBpbmNyZW1lbnRlZC4KLSAqLwotI2RlZmluZSBVSU5UMzJfVE9fQkVfRklFTEQocCwgdTMyKSAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICoodWludDhfdCopKHApID0gKHVpbnQ4X3QpKCh1MzIpID4+IDI0KTsgICAgICAgXAotICAgICooKHVpbnQ4X3QqKShwKSArIDEpID0gKHVpbnQ4X3QpKCh1MzIpID4+IDE2KTsgXAotICAgICooKHVpbnQ4X3QqKShwKSArIDIpID0gKHVpbnQ4X3QpKCh1MzIpID4+IDgpOyAgXAotICAgICooKHVpbnQ4X3QqKShwKSArIDMpID0gKHVpbnQ4X3QpKHUzMik7ICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFVJTlQxNl9UT19CRV9GSUVMRChwLCB1MTYpICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICoodWludDhfdCopKHApID0gKHVpbnQ4X3QpKCh1MTYpID4+IDgpOyBcCi0gICAgKigodWludDhfdCopKHApICsgMSkgPSAodWludDhfdCkodTE2KTsgIFwKLSAgfQotCi0vKiBDb21tb24gQmx1ZXRvb3RoIGZpZWxkIGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgTEFQX0xFTiAzCi10eXBlZGVmIHVpbnQ4X3QgTEFQW0xBUF9MRU5dOyAgICAgLyogSUFDIGFzIHBhc3NlZCB0byBJbnF1aXJ5IChMQVApICovCi0KLSNkZWZpbmUgQlRfMVNFQ19USU1FT1VUX01TICgxICogMTAwMCkgLyogMSBzZWNvbmQgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2J0bV9hcGkuaCBiL3N0YWNrL2luY2x1ZGUvYnRtX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjJlMDVjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYnRtX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTU4ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCbHVldG9vdGggTWFuYWdlciAoQlRNKSBBUEkgZnVuY3Rpb24gZXh0ZXJuYWwKLSAqICBkZWZpbml0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVE1fQVBJX0gKLSNkZWZpbmUgQlRNX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvZXNjb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL25laWdoYm9yX2lucXVpcnkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fbG9nX2hpc3RvcnkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9zdGF0dXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3Njb19jbGllbnRfY2FsbGJhY2tzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIGJ0bV9pbml0KCk7Ci12b2lkIGJ0bV9mcmVlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERFVklDRSBDT05UUk9MIGFuZCBDT01NT04KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFWFRFUk5BTCBGVU5DVElPTiBERUNMQVJBVElPTlMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBERVZJQ0UgQ09OVFJPTCBhbmQgQ09NTU9OIEZVTkNUSU9OUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQlRNX3Jlc2V0X2NvbXBsZXRlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSXNEZXZpY2VVcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyB1cC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZGV2aWNlIGlzIHVwLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0lzRGV2aWNlVXAodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0TG9jYWxEZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIGxvY2FsIGRldmljZSBuYW1lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhbiBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0TG9jYWxEZXZpY2VOYW1lKGNvbnN0IGNoYXIqIHBfbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0RGV2aWNlQ2xhc3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgbG9jYWwgZGV2aWNlIGNsYXNzCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYW4gZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldERldmljZUNsYXNzKERFVl9DTEFTUyBkZXZfY2xhc3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRMb2NhbERldmljZU5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGxvY2FsIGRldmljZSBuYW1lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgSWYgc3VjY2VzcywgQlRNX1NVQ0NFU1MgaXMgcmV0dXJuZWQgYW5kIHBfbmFtZSBwb2ludHMgc3RvcmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIGRldmljZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgIElmIEJUTSBkb2Vzbid0IHN0b3JlIGxvY2FsIGRldmljZSBuYW1lLCBCVE1fTk9fUkVTT1VSQ0VTIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkIGFuZCBwX25hbWUgaXMgc2V0IHRvIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRMb2NhbERldmljZU5hbWUoY2hhcioqIHBfbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVhZExvY2FsRGV2aWNlTmFtZUZyb21Db250cm9sbGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgbG9jYWwgZGV2aWNlIG5hbWUgZnJvbSBjb250cm9sbGVyLiBEbyBub3QgdXNlIGNhY2hlZAotICogICAgICAgICAgICAgICAgICBuYW1lICh1c2VkIHRvIGdldCBjaGlwLWlkIHByaW9yIHRvIGJ0bSByZXNldCBjb21wbGV0ZSkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGFuIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lRnJvbUNvbnRyb2xsZXIoCi0gICAgdEJUTV9DTVBMX0NCKiBwX3Jsbl9jbXBsX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkRGV2aWNlQ2xhc3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGxvY2FsIGRldmljZSBjbGFzcwotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGV2aWNlIGNsYXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QqIEJUTV9SZWFkRGV2aWNlQ2xhc3Modm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVnaXN0ZXJGb3JWU0V2ZW50cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIvZGVyZWdpc3RlciBmb3IgdmVuZG9yCi0gKiAgICAgICAgICAgICAgICAgIHNwZWNpZmljIEhDSSBldmVudHMuCi0gKgotICogICAgICAgICAgICAgICAgICBJZiBpc19yZWdpc3Rlcj10cnVlLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHJlZ2lzdGVyZWQ7Ci0gKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gd2lsbCBiZSBkZXJlZ2lzdGVyZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLAotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiBtYXhpbXVtIG51bWJlciBvZiBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlZ2lzdGVyRm9yVlNFdmVudHModEJUTV9WU19FVlRfQ0IqIHBfY2IsIGJvb2wgaXNfcmVnaXN0ZXIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhIHZlbmRvciBzcGVjaWZpYyBIQ0kgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fVmVuZG9yU3BlY2lmaWNDb21tYW5kKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCBwYXJhbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9wYXJhbV9idWYsIHRCVE1fVlNDX0NNUExfQ0IqIHBfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0FsbG9jYXRlU0NOCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIHRocm91Z2ggdGhlIFNlcnZlciBDaGFubmVsIE51bWJlcnMgZm9yIGEgZnJlZSBvbmUgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgdXNlZCB3aXRoIGFuIFJGQ09NTSBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQWxsb2NhdGVkIFNDTiBudW1iZXIgb3IgMCBpZiBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9BbGxvY2F0ZVNDTih2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9UcnlBbGxvY2F0ZVNDTgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVHJ5IHRvIGFsbG9jYXRlIGEgZml4ZWQgc2VydmVyIGNoYW5uZWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBzZXJ2ZXIgY2hhbm5lbCB3YXMgYXZhaWxhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX1RyeUFsbG9jYXRlU0NOKHVpbnQ4X3Qgc2NuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9GcmVlU0NOCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlIHRoZSBzcGVjaWZpZWQgU0NOLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiBTQ04gaXMgbm90IGluIHVzZSBvciBpbnZhbGlkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0ZyZWVTQ04odWludDhfdCBzY24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIEJUTS4gIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMHhGRiwgaXQgc2ltcGx5IHJldHVybnMgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICBUaGUgbmV3IG9yIGN1cnJlbnQgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVE1fU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fV3JpdGVQYWdlVGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBIQ0kgV2l0ZSBQYWdlIFRpbWVvdXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1dyaXRlUGFnZVRpbWVvdXQodWludDE2X3QgdGltZW91dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fV3JpdGVWb2ljZVNldHRpbmdzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIEhDSSBXcml0ZSBWb2ljZSBTZXR0aW5ncyBjb21tYW5kLgotICogICAgICAgICAgICAgICAgICBTZWUgaGNpZGVmcy5oIGZvciBzZXR0aW5ncyBiaXRtYXNrIHZhbHVlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fV3JpdGVWb2ljZVNldHRpbmdzKHVpbnQxNl90IHNldHRpbmdzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9FbmFibGVUZXN0TW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VuZCBIQ0kgdGhlIGVuYWJsZSBkZXZpY2UgdW5kZXIgdGVzdCBjb21tYW5kLgotICoKLSAqICAgICAgICAgICAgICAgICAgTm90ZTogQ29udHJvbGxlciBjYW4gb25seSBiZSB0YWtlbiBvdXQgb2YgdGhpcyBtb2RlIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICByZXNldHRpbmcgdGhlIGNvbnRyb2xsZXIuCi0gKgotICogUmV0dXJucwotICogICAgICBCVE1fU1VDQ0VTUyAgICAgICAgIENvbW1hbmQgc2VudC4KLSAqICAgICAgQlRNX05PX1JFU09VUkNFUyAgICBJZiBvdXQgb2YgcmVzb3VyY2VzIHRvIHNlbmQgdGhlIGNvbW1hbmQuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fRW5hYmxlVGVzdE1vZGUodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBERVZJQ0UgRElTQ09WRVJZIEZVTkNUSU9OUyAtIElucXVpcnksIFJlbW90ZSBOYW1lLCBEaXNjb3ZlcnksIENsYXNzIG9mIERldmljZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZXREaXNjb3ZlcmFiaWxpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgZGV2aWNlIGludG8gb3Igb3V0IG9mCi0gKiAgICAgICAgICAgICAgICAgIGRpc2NvdmVyYWJsZSBtb2RlLiBEaXNjb3ZlcmFibGUgbW9kZSBtZWFucyBpbnF1aXJ5Ci0gKiAgICAgICAgICAgICAgICAgIHNjYW5zIGFyZSBlbmFibGVkLiAgSWYgYSB2YWx1ZSBvZiAnMCcgaXMgZW50ZXJlZCBmb3Igd2luZG93Ci0gKiAgICAgICAgICAgICAgICAgIG9yIGludGVydmFsLCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzZnVsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9CVVNZIGlmIGEgc2V0dGluZyBvZiB0aGUgZmlsdGVyIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZG4ndCBnZXQgYSBtZW1vcnkgcG9vbCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgYSBiYWQgcGFyYW1ldGVyIHdhcyBkZXRlY3RlZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCBpbnFfbW9kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU3RhcnRJbnF1aXJ5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdGFydCBhbiBpbnF1aXJ5LgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcF9pbnFwYXJtcyAtIHBvaW50ZXIgdG8gdGhlIGlucXVpcnkgaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgIG1vZGUgLSBHRU5FUkFMIG9yIExJTUlURUQgaW5xdWlyeQotICogICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gLSBsZW5ndGggaW4gMS4yOCBzZWMgaW50ZXJ2YWxzIChJZiAnMCcsIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnF1aXJ5IGlzIENBTkNFTExFRCkKLSAqICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9jb25kX3R5cGUgLSBCVE1fQ0xSX0lOUVVJUllfRklMVEVSLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9GSUxURVJfQ09ORF9ERVZJQ0VfQ0xBU1MsIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0ZJTFRFUl9DT05EX0JEX0FERFIKLSAqICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9jb25kIC0gdmFsdWUgZm9yIHRoZSBmaWx0ZXIgKGJhc2VkIG9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY29uZF90eXBlKQotICoKLSAqICAgICAgICAgICAgICAgICAgcF9yZXN1bHRzX2NiICAtIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUgd2hpY2ggZ2V0cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCB1cG9uIHJlY2VpcHQgb2YgYW4gaW5xdWlyeSByZXN1bHQuIElmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgYXBwbGljYXRpb24gaXMgbm90Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQuCi0gKgotICogICAgICAgICAgICAgICAgICBwX2NtcGxfY2IgICAtIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUgd2hpY2ggZ2V0cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCB1cG9uIGNvbXBsZXRpb24uICBJZiB0aGlzIGZpZWxkIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBub3RpZmllZCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkLgotICogUmV0dXJucyAgICAgICAgICB0QlRNX1NUQVRVUwotICogICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaWYgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZAotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiBhbHJlYWR5IGluIHByb2dyZXNzCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9JTExFR0FMX1ZBTFVFIGlmIHBhcmFtZXRlcihzKSBhcmUgb3V0IG9mIHJhbmdlCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgY291bGQgbm90IGFsbG9jYXRlIHJlc291cmNlcyB0byBzdGFydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9XUk9OR19NT0RFIGlmIHRoZSBkZXZpY2UgaXMgbm90IHVwLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU3RhcnRJbnF1aXJ5KHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NtcGxfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0lzSW5xdWlyeUFjdGl2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJuIGEgYml0IG1hc2sgb2YgdGhlIGN1cnJlbnQgaW5xdWlyeSBzdGF0ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0lOUVVJUllfSU5BQ1RJVkUgaWYgaW5hY3RpdmUgKDApCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9HRU5FUkFMX0lOUVVJUllfQUNUSVZFIGlmIGEgZ2VuZXJhbCBpbnF1aXJ5IGlzIGFjdGl2ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBCVE1fSXNJbnF1aXJ5QWN0aXZlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0NhbmNlbElucXVpcnkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FuY2VscyBhbiBpbnF1aXJ5IGlmIGFjdGl2ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJUTV9DYW5jZWxJbnF1aXJ5KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldENvbm5lY3RhYmlsaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIGRldmljZSBpbnRvIG9yIG91dCBvZgotICogICAgICAgICAgICAgICAgICBjb25uZWN0YWJsZSBtb2RlLiBEaXNjb3ZlcmFibGUgbW9kZSBtZWFucyBwYWdlIHNjYW5zIGFyZQotICogICAgICAgICAgICAgICAgICBlbmFibGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bAotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRSBpZiBhIGJhZCBwYXJhbWV0ZXIgaXMgZGV0ZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZCBub3QgYWxsb2NhdGUgYSBtZXNzYWdlIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldENvbm5lY3RhYmlsaXR5KHVpbnQxNl90IHBhZ2VfbW9kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0SW5xdWlyeU1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCBzdGFuZGFyZCwgd2l0aCBSU1NJCi0gKiAgICAgICAgICAgICAgICAgIG1vZGUgb3IgZXh0ZW5kZWQgb2YgdGhlIGlucXVpcnkgZm9yIGxvY2FsIGRldmljZS4KLSAqCi0gKiBJbnB1dCBQYXJhbXM6ICAgIEJUTV9JTlFfUkVTVUxUX1NUQU5EQVJELCBCVE1fSU5RX1JFU1VMVF9XSVRIX1JTU0kgb3IKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lOUV9SRVNVTFRfRVhURU5ERUQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiBjb3VsZG4ndCBnZXQgYSBtZW1vcnkgcG9vbCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgYSBiYWQgcGFyYW1ldGVyIHdhcyBkZXRlY3RlZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldElucXVpcnlNb2RlKHVpbnQ4X3QgbW9kZSk7Ci0KLXZvaWQgQlRNX0VuYWJsZUludGVybGFjZWRJbnF1aXJ5U2NhbigpOwotCi12b2lkIEJUTV9FbmFibGVJbnRlcmxhY2VkUGFnZVNjYW4oKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgYSByZW1vdGUgZGV2aWNlIEhDSSBjb21tYW5kIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBjb250cm9sbGVyIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgd2hlbiB0aGUgcHJvY2VzcyBoYXMKLSAqICAgICAgICAgICAgICAgICAgY29tcGxldGVkLgotICoKLSAqIElucHV0IFBhcmFtczogICAgcmVtb3RlX2JkYSAgICAgIC0gZGV2aWNlIGFkZHJlc3Mgb2YgbmFtZSB0byByZXRyaWV2ZQotICogICAgICAgICAgICAgICAgICBwX2NiICAgICAgICAgICAgLSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUQVJURUQgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0QlRNX1JFTU9URV9ERVZfTkFNRSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMKLSAqICAgICAgICAgICAgICAgICAgQlRNX0NNRF9TVEFSVEVEIGlzIHJldHVybmVkIGlmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQgdG8gSENJLgotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSBpZiBhbHJlYWR5IGluIHByb2dyZXNzCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgZGV2aWNlIGFkZHJlc3MgaXMgYmFkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgcmVzb3VyY2VzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB0aGUgY29tbWFuZAotICogICAgICAgICAgICAgICAgICBCVE1fV1JPTkdfTU9ERSBpZiB0aGUgZGV2aWNlIGlzIG5vdCB1cC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlYWRSZW1vdGVEZXZpY2VOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9DYW5jZWxSZW1vdGVEZXZpY2VOYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyB0aGUgY2FuY2VsIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGRldmljZS4KLSAqCi0gKiBJbnB1dCBQYXJhbXM6ICAgIE5vbmUKLSAqCi0gKiBSZXR1cm5zCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50IHRvIEhDSS4KLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiByZXNvdXJjZXMgY291bGQgbm90IGJlIGFsbG9jYXRlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRoZSBjb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9XUk9OR19NT0RFIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSByZW1vdGUgbmFtZSByZXF1ZXN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fQ2FuY2VsUmVtb3RlRGV2aWNlTmFtZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkUmVtb3RlVmVyc2lvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIHJlbW90ZSBkZXZpY2UncyB2ZXJzaW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGRhdGEgdmFsaWQsIGZhbHNlIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9SZWFkUmVtb3RlVmVyc2lvbihjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYW51ZmFjdHVyZXIsIHVpbnQxNl90KiBsbXBfc3ViX3ZlcnNpb24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRSZW1vdGVGZWF0dXJlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCBhIHJlbW90ZSBkZXZpY2UncwotICogICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgZmVhdHVyZXMgbWFzayAoZmVhdHVyZXMgbWFzayBsb2NhdGVkIGF0IHBhZ2UgMCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJlbW90ZSBzdXBwb3J0ZWQgZmVhdHVyZXMgbWFzawotICogICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiBkZXZpY2UgZmVhdHVyZXMgbWFzayBwYWdlIGlzCi0gKiAgICAgICAgICAgICAgICAgIEhDSV9GRUFUVVJFX0JZVEVTX1BFUl9QQUdFIGJ5dGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90KiBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0lucURiUmVhZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBsb29rcyB0aHJvdWdoIHRoZSBpbnF1aXJ5IGRhdGFiYXNlIGZvciBhIG1hdGNoCi0gKiAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIEJsdWV0b290aCBEZXZpY2UgQWRkcmVzcy4gVGhpcyBpcyB0aGUgYXBwbGljYXRpb24ncwotICogICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBpbnF1aXJ5IGRldGFpbHMgb2YgYSBzcGVjaWZpYyBCRAotICogICAgICAgICAgICAgICAgICBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBlbnRyeSwgb3IgTlVMTCBpZiBub3QgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9JTlFfSU5GTyogQlRNX0lucURiUmVhZChjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSW5xRGJGaXJzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBsb29rcyB0aHJvdWdoIHRoZSBpbnF1aXJ5IGRhdGFiYXNlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgZmlyc3QgdXNlZCBlbnRyeSwgYW5kIHJldHVybnMgdGhhdC4gVGhpcyBpcyB1c2VkIGluCi0gKiAgICAgICAgICAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggQlRNX0lucURiTmV4dCBieSBhcHBsaWNhdGlvbnMgYXMgYSB3YXkgdG8KLSAqICAgICAgICAgICAgICAgICAgd2FsayB0aHJvdWdoIHRoZSBpbnF1aXJ5IGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBmaXJzdCBpbi11c2UgZW50cnksIG9yIE5VTEwgaWYgREIgaXMgZW1wdHkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9JTlFfSU5GTyogQlRNX0lucURiRmlyc3Qodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSW5xRGJOZXh0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIHRocm91Z2ggdGhlIGlucXVpcnkgZGF0YWJhc2UgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBuZXh0IHVzZWQgZW50cnksIGFuZCByZXR1cm5zIHRoYXQuICBJZiB0aGUgaW5wdXQgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgIGlzIE5VTEwsIHRoZSBmaXJzdCBlbnRyeSBpcyByZXR1cm5lZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gbmV4dCBpbi11c2UgZW50cnksIG9yIE5VTEwgaWYgbm8gbW9yZSBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9JTlFfSU5GTyogQlRNX0lucURiTmV4dCh0QlRNX0lOUV9JTkZPKiBwX2N1cik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQ2xlYXJJbnFEYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2xlYXIgb3V0IGEgZGV2aWNlIG9yIGFsbCBkZXZpY2VzCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGlucXVpcnkgZGF0YWJhc2UuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBwX2JkYSAtIChpbnB1dCkgQkRfQUREUiAtPiAgQWRkcmVzcyBvZiBkZXZpY2UgdG8gY2xlYXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVUxMIGNsZWFycyBhbGwgZW50cmllcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9CVVNZIGlmIGFuIGlucXVpcnksIGdldCByZW1vdGUgbmFtZSwgb3IgZXZlbnQgZmlsdGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWN0aXZlLCBvdGhlcndpc2UgQlRNX1NVQ0NFU1MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0NsZWFySW5xRGIoY29uc3QgUmF3QWRkcmVzcyogcF9iZGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAoZSlTQ08gQ0hBTk5FTCBNQU5BR0VNRU5UIEZVTkNUSU9OUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0NyZWF0ZVNjbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY3JlYXRlIGFuIFNDTyBjb25uZWN0aW9uLiBJZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgImlzX29yaWciIGZsYWcgaXMgdHJ1ZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBvcmlnaW5hdGVkLAotICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQlRNIHdpbGwgd2FpdCBmb3IgdGhlIG90aGVyIHNpZGUgdG8gY29ubmVjdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgdGhlIEFDTCBjb25uZWN0aW9uIGlzIG5vdCB1cAotICogICAgICAgICAgICAgICAgICBCVE1fQlVTWSAgICAgICAgIGlmIGFub3RoZXIgU0NPIGJlaW5nIHNldCB1cCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIEJEIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgQlRNX05PX1JFU09VUkNFUyBpZiB0aGUgbWF4IFNDTyBsaW1pdCBoYXMgYmVlbiByZWFjaGVkCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCAgaWYgdGhlIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBpcyBzdGFydGVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgIipwX3Njb19pbngiIGlzIGZpbGxlZCBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNjbyBpbmRleCB1c2VkIGZvciB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0NyZWF0ZVNjbyhjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRhLCBib29sIGlzX29yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBrdF90eXBlcywgdWludDE2X3QqIHBfc2NvX2lueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TQ09fQ0IqIHBfY29ubl9jYiwgdEJUTV9TQ09fQ0IqIHBfZGlzY19jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVtb3ZlU2NvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZW1vdmUgYSBzcGVjaWZpYyBTQ08gY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkLCBvdGhlcndpc2UgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1JlbW92ZVNjbyh1aW50MTZfdCBzY29faW54KTsKLXZvaWQgQlRNX1JlbW92ZVNjbyhjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRTY29CZEFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVhZCB0aGUgcmVtb3RlIEJEIEFkZHJlc3MgZm9yIGEgc3BlY2lmaWMKLSAqICAgICAgICAgICAgICAgICAgU0NPIGNvbm5lY3Rpb24sCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIEJEIGFkZHJlc3Mgb3IgTlVMTCBpZiBub3Qga25vd24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgUmF3QWRkcmVzcyogQlRNX1JlYWRTY29CZEFkZHIodWludDE2X3Qgc2NvX2lueCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0RVNjb01vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzIGZvciBTQ08gb3IKLSAqICAgICAgICAgICAgICAgICAgZVNDTywgYW5kIHNldHMgYXMgdGhlIGRlZmF1bHQgbW9kZSB1c2VkIGZvciBjYWxscyB0bwotICogICAgICAgICAgICAgICAgICBCVE1fQ3JlYXRlU2NvLiAgSXQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vCi0gKiAgICAgICAgICAgICAgICAgIGFjdGl2ZSAoZSlTQ08gbGlua3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiB0aGUgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0JVU1kgaWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGFjdGl2ZSAoZSlTQ08gbGlua3MuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9TZXRFU2NvTW9kZShlbmhfZXNjb19wYXJhbXNfdCogcF9wYXJtcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUmVnRm9yRVNjb0V2dHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGEgU0NPIGV2ZW50IGNhbGxiYWNrIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbnN0YW5jZS4gIEl0IHNob3VsZCBiZSB1c2VkIHRvIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gaW5kaWNhdGlvbiBldmVudHMgYW5kIGNoYW5nZSBvZiBsaW5rIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICBldmVudHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiB0aGUgc3VjY2Vzc2Z1bC4KLSAqICAgICAgICAgICAgICAgICAgQlRNX0lMTEVHQUxfVkFMVUUgaWYgdGhlcmUgaXMgYW4gaWxsZWdhbCBzY29faW54Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fU1RBVFVTIEJUTV9SZWdGb3JFU2NvRXZ0cyh1aW50MTZfdCBzY29faW54LCB0QlRNX0VTQ09fQ0JBQ0sqIHBfZXNjb19jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fRVNjb0Nvbm5Sc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gcmVjZWlwdCBvZiBhbiAoZSlTQ08gY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICByZXF1ZXN0IGV2ZW50IChCVE1fRVNDT19DT05OX1JFUV9FVlQpIHRvIGFjY2VwdCBvciByZWplY3QKLSAqICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QuIFBhcmFtZXRlcnMgdXNlZCB0byBuZWdvdGlhdGUgZVNDTyBsaW5rcy4KLSAqICAgICAgICAgICAgICAgICAgSWYgcF9wYXJtcyBpcyBOVUxMLCB0aGVuIHZhbHVlcyBzZXQgdGhyb3VnaCBCVE1fU2V0RVNjb01vZGUKLSAqICAgICAgICAgICAgICAgICAgYXJlIHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBsaW5rIHR5cGUgb2YgdGhlIGluY29taW5nIHJlcXVlc3QgaXMgU0NPLCB0aGVuIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgdGhlIHR4X2J3LCBtYXhfbGF0ZW5jeSwgY29udGVudCBmb3JtYXQsIGFuZCBwYWNrZXRfdHlwZXMgYXJlCi0gKiAgICAgICAgICAgICAgICAgIHZhbGlkLiAgVGhlIGhjaV9zdGF0dXMgcGFyYW1ldGVyIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAoWzB4MF0gdG8gYWNjZXB0LCBbMHgwZC4uMHgwZl0gdG8gcmVqZWN0KQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fRVNjb0Nvbm5Sc3AodWludDE2X3Qgc2NvX2lueCwgdWludDhfdCBoY2lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFybXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldE51bVNjb0xpbmtzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgU0NPIGxpbmtzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDhfdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9HZXROdW1TY29MaW5rcyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU0VDVVJJVFkgTUFOQUdFTUVOVCBGVU5DVElPTlMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0FkZERldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkL21vZGlmeSBkZXZpY2UuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgbm9ybWFsbHkgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIGR1cmluZyBob3N0IHN0YXJ0dXAgdG8gcmVzdG9yZSBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSBOVlJBTS4KLSAqICAgICAgICAgICAgICAgICAgZGV2X2NsYXNzLCBiZF9uYW1lLCBsaW5rX2tleSwgYW5kIGZlYXR1cmVzIGFyZSBOVUxMIGlmCi0gKiAgICAgICAgICAgICAgICAgIHVua25vd24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYWRkZWQgT0ssIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBCVE1fU2VjQWRkRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgQkRfTkFNRSBiZF9uYW1lLCB1aW50OF90KiBmZWF0dXJlcywgTGlua0tleSogbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfdHlwZSwgdWludDhfdCBwaW5fbGVuZ3RoKTsKLQotLyoqIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB8YmRfYWRkcnwgYWRkcmVzcy4KLSAqCi0gKiAqKiogV0FSTklORyAqKioKLSAqIHRCVE1fU0VDX0RFVl9SRUMgYXNzb2NpYXRlZCB3aXRoIGJkX2FkZHIgYmVjb21lcyBpbnZhbGlkIGFmdGVyIHRoaXMgZnVuY3Rpb24KLSAqIGlzIGNhbGxlZCwgYWxzbyBhbnkgb2YgaXQncyBmaWVsZHMuIGkuZS4gaWYgeW91IHVzZSBwX2Rldl9yZWMtPmJkX2FkZHIsIGl0IGlzCi0gKiBubyBsb25nZXIgdmFsaWQhCi0gKiAqKiogV0FSTklORyAqKioKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgcmVtb3ZlZCBPSywgZmFsc2UgaWYgbm90IGZvdW5kIG9yIEFDTCBsaW5rIGlzIGFjdGl2ZS4KLSAqLwotYm9vbCBCVE1fU2VjRGVsZXRlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0NsZWFyU2VjdXJpdHlGbGFncwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzZXQgdGhlIHNlY3VyaXR5IGZsYWdzIChtYXJrIGFzIG5vdC1wYWlyZWQpIGZvciBhIGdpdmVuCi0gKiAgICAgICAgICAgICAgICAgIHJlbW92ZSBkZXZpY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1NlY0NsZWFyU2VjdXJpdHlGbGFncyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICAgSXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgYSBib25kZWQgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIC0gZGV2IGlzIGJvbmRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBidG1fc2VjX2lzX2FfYm9uZGVkX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldFBlZXJEZXZpY2VUeXBlRnJvbUZlYXR1cmVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgcGVlciBkZXZpY2UgdHlwZQotICogICAgICAgICAgICAgICAgICBieSByZWZlcmVuY2luZyB0aGUgcmVtb3RlIGZlYXR1cmVzLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUX0RFVklDRV9UWVBFX0RVTU8gaWYgYm90aCBCUi9FRFIgYW5kIEJMRSB0cmFuc3BvcnRzIGFyZQotICogICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIHBlZXIsCi0gKiAgICAgICAgICAgICAgICAgIEJUX0RFVklDRV9UWVBFX0JSRURSIGlmIG9ubHkgQlIvRURSIHRyYW5zcG9ydCBpcyBzdXBwb3J0ZWQsCi0gKiAgICAgICAgICAgICAgICAgIEJUX0RFVklDRV9UWVBFX0JMRSBpZiBvbmx5IEJMRSB0cmFuc3BvcnQgaXMgc3VwcG9ydGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJUX0RFVklDRV9UWVBFIEJUTV9HZXRQZWVyRGV2aWNlVHlwZUZyb21GZWF0dXJlcygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9TZWNSZWFkRGV2TmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9va3MgZm9yIHRoZSBkZXZpY2UgbmFtZSBpbiB0aGUgc2VjdXJpdHkgZGF0YWJhc2UgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgQkQgYWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG5hbWUgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyKiBCVE1fU2VjUmVhZERldk5hbWUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFBPV0VSIE1BTkFHRU1FTlQgRlVOQ1RJT05TCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fUG1SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcmVnaXN0ZXIgb3IgZGVyZWdpc3RlciB3aXRoIHBvd2VyIG1hbmFnZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMgaWYgbm8gcm9vbSB0byBob2xkIHJlZ2lzdHJhdGlvbgotICogICAgICAgICAgICAgICAgICBCVE1fSUxMRUdBTF9WQUxVRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fUG1SZWdpc3Rlcih1aW50OF90IG1hc2ssIHVpbnQ4X3QqIHBfcG1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYik7Ci0KLS8vIE5vdGlmaWVkIGJ5IEFDTCB0aGF0IGEgbmV3IGxpbmsgaXMgY29ubmVjdGVkCi12b2lkIEJUTV9QTV9PbkNvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpOwotCi0vLyBOb3RpZmllZCBieSBBQ0wgdGhhdCBhIGxpbmsgaXMgZGlzY29ubmVjdGVkCi12b2lkIEJUTV9QTV9PbkRpc2Nvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NldFBvd2VyTW9kZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc3RvcmUgdGhlIG1vZGUgaW4gY29udHJvbCBibG9jayBvcgotICogICAgICAgICAgICAgICAgICBhbHRlciBBQ0wgY29ubmVjdGlvbiBiZWhhdmlvci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgYmQgYWRkciBpcyBub3QgYWN0aXZlIG9yIGJhZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fU2V0UG93ZXJNb2RlKHVpbnQ4X3QgcG1faWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fUE1fUFdSX01EKiBwX21vZGUpOwotYm9vbCBCVE1fU2V0TGlua1BvbGljeUFjdGl2ZU1vZGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0U3NyUGFyYW1zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHNlbmRzIHRoZSBnaXZlbiBTU1IgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIEFDTAotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlmIGl0IGlzIGluIEFDVElWRSBtb2RlLgotICoKLSAqIElucHV0IFBhcmFtICAgICAgcmVtb3RlX2JkYSAtIGRldmljZSBhZGRyZXNzIG9mIGRlc2lyZWQgQUNMIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbWF4X2xhdCAgICAtIG1heGltdW0gbGF0ZW5jeSAoaW4gMC42MjVtcykoMC0weEZGRkUpCi0gKiAgICAgICAgICAgICAgICAgIG1pbl9ybXRfdG8gLSBtaW5pbXVtIHJlbW90ZSB0aW1lb3V0Ci0gKiAgICAgICAgICAgICAgICAgIG1pbl9sb2NfdG8gLSBtaW5pbXVtIGxvY2FsIHRpbWVvdXQKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiB0aGUgSENJIGNvbW1hbmQgaXMgaXNzdWVkIHN1Y2Nlc3NmdWwsCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9VTktOT1dOX0FERFIgaWYgYmQgYWRkciBpcyBub3QgYWN0aXZlIG9yIGJhZAotICogICAgICAgICAgICAgICAgICBCVE1fQ01EX1NUT1JFRCBpZiB0aGUgY29tbWFuZCBpcyBzdG9yZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX1NldFNzclBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB1aW50MTZfdCBtYXhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fcm10X3RvLCB1aW50MTZfdCBtaW5fbG9jX3RvKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9HZXRIQ0lDb25uSGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIGhhbmRsZSBmb3IgYW4gQUNMCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyByZW1vdGUgQkQgQWRkcmVzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBoYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24sIG9yIDB4RkZGRiBpZiBub25lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBCVE1fR2V0SENJQ29ubkhhbmRsZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0lzUGh5Mm1TdXBwb3J0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIFBIWSAyTSBzdXBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIGZyb20gcGVlciBkZXZpY2UKLSAqIFJldHVybnMgICAgICAgICAgVHJ1ZSB3aGVuIFBIWSAyTSBzdXBwb3J0ZWQgZmFsc2Ugb3RoZXJ3aXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgQlRNX0lzUGh5Mm1TdXBwb3J0ZWQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlcXVlc3RQZWVyU0NBCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXF1ZXN0IHNsZWVwIGNsb2NrIGFjY3VyYWN5Ci0gKiAgICAgICAgICAgICAgICAgIGZyb20gcGVlciBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX1JlcXVlc3RQZWVyU0NBKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0dldFBlZXJTQ0EKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBwZWVyIHNsZWVwIGNsb2NrIGFjY3VyYWN5Ci0gKgotICogUmV0dXJucyAgICAgICAgICBTQ0Egb3IgMHhGRiBpZiBTQ0Egd2FzIG5ldmVyIHByZXZpb3VzbHkgcmVxdWVzdGVkLCByZXF1ZXN0Ci0gKiAgICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgcGVlciBkZXZpY2Ugb3IgQUNMIGRvZXMgbm90IGV4aXN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50OF90IEJUTV9HZXRQZWVyU0NBKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fRGVsZXRlU3RvcmVkTGlua0tleQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGVsZXRlIGxpbmsga2V5IGZvciB0aGUgc3BlY2lmaWVkCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZSBhZGRyZXNzZXMgZnJvbSB0aGUgTlZSQU0gc3RvcmFnZSBhdHRhY2hlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoIGNvbnRyb2xsZXIuCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgLSBBZGRyZXNzZXMgb2YgdGhlIGRldmljZXMKLSAqICAgICAgICAgICAgICAgICAgcF9jYiAgICAgICAgIC0gQ2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byByZXR1cm4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9TVEFUVVMgQlRNX0RlbGV0ZVN0b3JlZExpbmtLZXkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fV3JpdGVFSVIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHdyaXRlIEVJUiBkYXRhIHRvIGNvbnRyb2xsZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2J1ZmYgLSBhbGxvY2F0ZWQgSENJIGNvbW1hbmQgYnVmZmVyIGluY2x1ZGluZyBleHRlbmRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnF1cmlyeSByZXNwb25zZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgIC0gaWYgc3VjY2Vzc2Z1bAotICogICAgICAgICAgICAgICAgICBCVE1fTU9ERV9VTlNVUFBPUlRFRCAtIGlmIGxvY2FsIGRldmljZSBjYW5ub3Qgc3VwcG9ydCBpdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10QlRNX1NUQVRVUyBCVE1fV3JpdGVFSVIoQlRfSERSKiBwX2J1ZmYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0hhc0VpclNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGtub3cgaWYgVVVJRCBpbiBiaXQgbWFwIG9mIFVVSUQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2Vpcl91dWlkIC0gYml0IG1hcCBvZiBVVUlEIGxpc3QKLSAqICAgICAgICAgICAgICAgICAgdXVpZDE2IC0gVVVJRCAxNi1iaXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgLSBpZiBmb3VuZAotICogICAgICAgICAgICAgICAgICBmYWxzZSAtIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEJUTV9IYXNFaXJTZXJ2aWNlKGNvbnN0IHVpbnQzMl90KiBwX2Vpcl91dWlkLCB1aW50MTZfdCB1dWlkMTYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0hhc0lucXVpcnlFaXJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXR1cm4gaWYgYSBVVUlEIGlzIGluIHRoZSBiaXQgbWFwIG9mIGEgVVVJRCBsaXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9yZXN1bHRzIC0gaW5xdWlyeSByZXN1bHRzCi0gKiAgICAgICAgICAgICAgICAgIHV1aWQxNiAtIFVVSUQgMTYtYml0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fRUlSX0ZPVU5EIC0gaWYgZm91bmQKLSAqICAgICAgICAgICAgICAgICAgQlRNX0VJUl9OT1RfRk9VTkQgLSBpZiBub3QgZm91bmQgYW5kIGl0IGlzIGEgY29tcGxldGUgbGlzdAotICogICAgICAgICAgICAgICAgICBCVE1fRUlSX1VOS05PV04gLSBpZiBub3QgZm91bmQgYW5kIGl0IGlzIG5vdCBjb21wbGV0ZSBsaXN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRCVE1fRUlSX1NFQVJDSF9SRVNVTFQgQlRNX0hhc0lucXVpcnlFaXJTZXJ2aWNlKHRCVE1fSU5RX1JFU1VMVFMqIHBfcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWQxNik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQWRkRWlyU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGEgc2VydmljZSBpbiB0aGUgYml0IG1hcCBVVUlECi0gKiAgICAgICAgICAgICAgICAgIGxpc3QuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBwX2Vpcl91dWlkIC0gYml0IG1hc2sgb2YgVVVJRCBsaXN0IGZvciBFSVIKLSAqICAgICAgICAgICAgICAgICAgdXVpZDE2IC0gVVVJRCAxNi1iaXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQWRkRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDE2X3QgdXVpZDE2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZW1vdmVFaXJTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZW1vdmUgYSBzZXJ2aWNlIGZyb20gdGhlIGJpdCBtYXAKLSAqICAgICAgICAgICAgICAgICAgVVVJRCBsaXN0LgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9laXJfdXVpZCAtIGJpdCBtYXNrIG9mIFVVSUQgbGlzdCBmb3IgRUlSCi0gKiAgICAgICAgICAgICAgICAgIHV1aWQxNiAtIFVVSUQgMTYtYml0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX1JlbW92ZUVpclNlcnZpY2UodWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fR2V0RWlyU3VwcG9ydGVkU2VydmljZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBVVUlEIGxpc3QgZnJvbSBiaXQgbWFwIFVVSUQKLSAqICAgICAgICAgICAgICAgICAgbGlzdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZWlyX3V1aWQgLSBiaXQgbWFzayBvZiBVVUlEIGxpc3QgZm9yIEVJUgotICogICAgICAgICAgICAgICAgICBwIC0gcmVmZXJlbmNlIG9mIGN1cnJlbnQgcG9pbnRlciBvZiBFSVIKLSAqICAgICAgICAgICAgICAgICAgbWF4X251bV91dWlkMTYgLSBtYXggbnVtYmVyIG9mIFVVSUQgY2FuIGJlIHdyaXR0ZW4gaW4gRUlSCi0gKiAgICAgICAgICAgICAgICAgIG51bV91dWlkMTYgLSBudW1iZXIgb2YgVVVJRCBoYXZlIGJlZW4gd3JpdHRlbiBpbiBFSVIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEhDSV9FSVJfTU9SRV8xNkJJVFNfVVVJRF9UWVBFLCBpZiBpdCBoYXMgbW9yZSB0aGFuIG1heAotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX0NPTVBMRVRFXzE2QklUU19VVUlEX1RZUEUsIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcyh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDhfdCoqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9udW1fdXVpZDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fdXVpZDE2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9HZXRFaXJVdWlkTGlzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgRUlSIGFuZCByZXR1cm5zIFVVSUQgbGlzdC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZWlyIC0gRUlSCi0gKiAgICAgICAgICAgICAgICAgIGVpcmxfbGVuIC0gRUlSIGxlbgotICogICAgICAgICAgICAgICAgICB1dWlkX3NpemUgLSBVdWlkOjprTnVtQnl0ZXMxNiwgVXVpZDo6a051bUJ5dGVzMzIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczEyOAotICogICAgICAgICAgICAgICAgICBwX251bV91dWlkIC0gcmV0dXJuIG51bWJlciBvZiBVVUlEIGluIGZvdW5kIGxpc3QKLSAqICAgICAgICAgICAgICAgICAgcF91dWlkX2xpc3QgLSByZXR1cm4gVVVJRCAxNi1iaXQgbGlzdAotICogICAgICAgICAgICAgICAgICBtYXhfbnVtX3V1aWQgLSBtYXhpbXVtIG51bWJlciBvZiBVVUlEIHRvIGJlIHJldHVybmVkCi0gKgotICogUmV0dXJucyAgICAgICAgICAwIC0gaWYgbm90IGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIEhDSV9FSVJfQ09NUExFVEVfMTZCSVRTX1VVSURfVFlQRQotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX01PUkVfMTZCSVRTX1VVSURfVFlQRQotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX0NPTVBMRVRFXzMyQklUU19VVUlEX1RZUEUKLSAqICAgICAgICAgICAgICAgICAgSENJX0VJUl9NT1JFXzMyQklUU19VVUlEX1RZUEUKLSAqICAgICAgICAgICAgICAgICAgSENJX0VJUl9DT01QTEVURV8xMjhCSVRTX1VVSURfVFlQRQotICogICAgICAgICAgICAgICAgICBIQ0lfRUlSX01PUkVfMTI4QklUU19VVUlEX1RZUEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBCVE1fR2V0RWlyVXVpZExpc3QoY29uc3QgdWludDhfdCogcF9laXIsIHNpemVfdCBlaXJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1dWlkX3NpemUsIHVpbnQ4X3QqIHBfbnVtX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3V1aWRfbGlzdCwgdWludDhfdCBtYXhfbnVtX3V1aWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1BNX1JlYWRDb250cm9sbGVyU3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG9idGFpbiB0aGUgY29udHJvbGxlciBzdGF0ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgQ29udHJvbGxlciBzdGF0ZSAoQlRNX0NPTlRSTF9BQ1RJVkUsIEJUTV9DT05UUkxfU0NBTiwgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9DT05UUkxfSURMRSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEJUTV9DT05UUkxfU1RBVEUgQlRNX1BNX1JlYWRDb250cm9sbGVyU3RhdGUodm9pZCk7Ci0KLS8qKgotICogU2VuZCByZW1vdGUgbmFtZSByZXF1ZXN0LCBlaXRoZXIgdG8gbGVnYWN5IEhDSSwgb3IgdG8gR0Qgc2hpbSBOYW1lIG1vZHVsZQotICovCi12b2lkIFNlbmRSZW1vdGVOYW1lUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcyk7Ci0KLWJvb2wgQlRNX0lzU2NvQWN0aXZlQnlCZGFkZHIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSk7Ci0KLXVpbnQxNl90IEJUTV9HZXRDbG9ja09mZnNldChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKTsKLQotLyogUmVhZCBtYXhpbXVtIGRhdGEgcGFja2V0IHRoYXQgY2FuIGJlIHNlbnQgb3ZlciBjdXJyZW50IGNvbm5lY3Rpb24gKi8KLXVpbnQxNl90IEJUTV9HZXRNYXhQYWNrZXRTaXplKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpOwotCi1leHRlcm4gdEJUTV9TVEFUVVMgQlRNX0JUX1F1YWxpdHlfUmVwb3J0X1ZTRV9SZWdpc3RlcigKLSAgICBib29sIGlzX3JlZ2lzdGVyLCB0QlRNX0JUX1FVQUxJVFlfUkVQT1JUX1JFQ0VJVkVSKiBwX2Jxcl9yZXBvcnRfcmVjZWl2ZXIpOwotCi11aW50OF90IGJ0bV9ibGVfcmVhZF9zZWNfa2V5X3NpemUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLSNlbmRpZiAvKiBCVE1fQVBJX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIGIvc3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWJjOTkuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVE1fQVBJX1RZUEVTX0gKLSNkZWZpbmUgQlRNX0FQSV9UWVBFU19ICi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImludGVybmFsX2luY2x1ZGUvYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9kZXZfY2xhc3MuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfbmFtZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfbW9kZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc21wX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qIFN0cnVjdHVyZSByZXR1cm5lZCB3aXRoIFZlbmRvciBTcGVjaWZpYyBDb21tYW5kIGNvbXBsZXRlIGNhbGxiYWNrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IG9wY29kZTsKLSAgdWludDE2X3QgcGFyYW1fbGVuOwotICB1aW50OF90KiBwX3BhcmFtX2J1ZjsKLX0gdEJUTV9WU0NfQ01QTDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRGV2aWNlIENvbnRyb2wgYW5kIEdlbmVyYWwgQ2FsbGJhY2sgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiBhIHZlbmRvciBzcGVjaWZpYyBldmVudCBvY2N1cnMuIFRoZSBsZW5ndGggYW5kCi0gKiBhcnJheSBvZiByZXR1cm5lZCBwYXJhbWV0ZXIgYnl0ZXMgYXJlIGluY2x1ZGVkLiBUaGlzIGFzeW5jaHJvbm91cyBldmVudAotICogaXMgZW5hYmxlZC9kaXNhYmxlZCBieSBjYWxsaW5nIEJUTV9SZWdpc3RlckZvclZTRXZlbnRzKCkuCi0qLwotdHlwZWRlZiB2b2lkKHRCVE1fVlNfRVZUX0NCKSh1aW50OF90IGxlbiwgdWludDhfdCogcCk7Ci0KLS8qIEdlbmVyYWwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG5vdGlmeWluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IGEgc3luY2hyb25vdXMKLSAqIEJUTSBmdW5jdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHBvaW50ZXIgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYW55IHJldHVybmVkCi0gKiBkYXRhLgotICovCi10eXBlZGVmIHZvaWQodEJUTV9DTVBMX0NCKSh2b2lkKiBwMSk7Ci0KLS8qIFZTQyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igbm90aWZ5aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgYSBzeW5jaHJvbm91cwotICogQlRNIGZ1bmN0aW9uIGlzIGNvbXBsZXRlLiBUaGUgcG9pbnRlciBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhbnkgcmV0dXJuZWQKLSAqIGRhdGEuCi0gKi8KLXR5cGVkZWYgdm9pZCh0QlRNX1ZTQ19DTVBMX0NCKSh0QlRNX1ZTQ19DTVBMKiBwMSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERFVklDRSBESVNDT1ZFUlkgLSBJbnF1aXJ5LCBSZW1vdGUgTmFtZSwgRGlzY292ZXJ5LCBDbGFzcyBvZiBEZXZpY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBEZXZpY2UgRGlzY292ZXJ5IENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogbWlub3IgZGV2aWNlIGNsYXNzIGZpZWxkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMHgwMCBpcyB1c2VkIGFzIHVuY2xhc3NpZmllZCBmb3IgYWxsIG1pbm9yIGRldmljZSBjbGFzc2VzICovCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfVU5DTEFTU0lGSUVEIDB4MDAKLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9XRUFSQUJMRV9IRUFEU0VUIDB4MDQKLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9DT05GTV9IQU5EU0ZSRUUgMHgwOAotI2RlZmluZSBCVE1fQ09EX01JTk9SX0NBUl9BVURJTyAweDIwCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfU0VUX1RPUF9CT1ggMHgyNAotCi0vKiBtaW5vciBkZXZpY2UgY2xhc3MgZmllbGQgZm9yIFBlcmlwaGVyYWwgTWFqb3IgQ2xhc3MgKi8KLS8qIEJpdHMgNi03IGluZGVwZW5kZW50bHkgc3BlY2lmeSBtb3VzZSwga2V5Ym9hcmQsIG9yIGNvbWJvIG1vdXNlL2tleWJvYXJkICovCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfS0VZQk9BUkQgMHg0MAotI2RlZmluZSBCVE1fQ09EX01JTk9SX1BPSU5USU5HIDB4ODAKLS8qIEJpdHMgMi01IE9SJ2Qgd2l0aCBzZWxlY3Rpb24gZnJvbSBiaXRzIDYtNyAqLwotLyogI2RlZmluZSBCVE1fQ09EX01JTk9SX1VOQ0xBU1NJRklFRCAgICAgICAweDAwICAgICovCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfSk9ZU1RJQ0sgMHgwNAotI2RlZmluZSBCVE1fQ09EX01JTk9SX0dBTUVQQUQgMHgwOAotI2RlZmluZSBCVE1fQ09EX01JTk9SX1JFTU9URV9DT05UUk9MIDB4MEMKLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9ESUdJVElaSU5HX1RBQkxFVCAweDE0Ci0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfQ0FSRF9SRUFERVIgMHgxOCAvKiBlLmcuIFNJTSBjYXJkIHJlYWRlciAqLwotI2RlZmluZSBCVE1fQ09EX01JTk9SX0RJR0lUQUxfUEFOIDB4MUMKLQotLyogbWlub3IgZGV2aWNlIGNsYXNzIGZpZWxkIGZvciBJbWFnaW5nIE1ham9yIENsYXNzICovCi0vKiBCaXRzIDUtNyBpbmRlcGVuZGVudGx5IHNwZWNpZnkgZGlzcGxheSwgY2FtZXJhLCBzY2FubmVyLCBvciBwcmludGVyICovCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfRElTUExBWSAweDEwCi0vKiBCaXRzIDItMyBSZXNlcnZlZCAqLwotLyogI2RlZmluZSBCVE1fQ09EX01JTk9SX1VOQ0xBU1NJRklFRCAgICAgICAweDAwICAgICovCi0KLS8qIG1pbm9yIGRldmljZSBjbGFzcyBmaWVsZCBmb3IgV2VhcmFibGUgTWFqb3IgQ2xhc3MgKi8KLS8qIEJpdHMgMi03IG1lYW5pbmdmdWwgICAgKi8KLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9XUklTVF9XQVRDSCAweDA0Ci0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfR0xBU1NFUyAweDE0Ci0KLS8qIG1pbm9yIGRldmljZSBjbGFzcyBmaWVsZCBmb3IgSGVhbHRoIE1ham9yIENsYXNzICovCi0vKiBCaXRzIDItNyBtZWFuaW5nZnVsICAgICovCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfQkxPT0RfTU9OSVRPUiAweDA0Ci0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfVEhFUk1PTUVURVIgMHgwOAotI2RlZmluZSBCVE1fQ09EX01JTk9SX1dFSUdISU5HX1NDQUxFIDB4MEMKLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9HTFVDT1NFX01FVEVSIDB4MTAKLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9QVUxTRV9PWElNRVRFUiAweDE0Ci0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfSEVBUlRfUFVMU0VfTU9OSVRPUiAweDE4Ci0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfU1RFUF9DT1VOVEVSIDB4MjAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogbWFqb3IgZGV2aWNlIGNsYXNzIGZpZWxkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBCVE1fQ09EX01BSk9SX0NPTVBVVEVSIDB4MDEKLSNkZWZpbmUgQlRNX0NPRF9NQUpPUl9QSE9ORSAweDAyCi0jZGVmaW5lIEJUTV9DT0RfTUFKT1JfQVVESU8gMHgwNAotI2RlZmluZSBCVE1fQ09EX01BSk9SX1BFUklQSEVSQUwgMHgwNQotI2RlZmluZSBCVE1fQ09EX01BSk9SX0lNQUdJTkcgMHgwNgotI2RlZmluZSBCVE1fQ09EX01BSk9SX1dFQVJBQkxFIDB4MDcKLSNkZWZpbmUgQlRNX0NPRF9NQUpPUl9IRUFMVEggMHgwOQotI2RlZmluZSBCVE1fQ09EX01BSk9SX1VOQ0xBU1NJRklFRCAweDFGCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHNlcnZpY2UgY2xhc3MgZmllbGRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBCVE1fQ09EX1NFUlZJQ0VfTE1URF9ESVNDT1ZFUiAweDAwMjAKLSNkZWZpbmUgQlRNX0NPRF9TRVJWSUNFX1BPU0lUSU9OSU5HIDB4MDEwMAotI2RlZmluZSBCVE1fQ09EX1NFUlZJQ0VfTkVUV09SS0lORyAweDAyMDAKLSNkZWZpbmUgQlRNX0NPRF9TRVJWSUNFX1JFTkRFUklORyAweDA0MDAKLSNkZWZpbmUgQlRNX0NPRF9TRVJWSUNFX0NBUFRVUklORyAweDA4MDAKLSNkZWZpbmUgQlRNX0NPRF9TRVJWSUNFX09CSl9UUkFOU0ZFUiAweDEwMDAKLSNkZWZpbmUgQlRNX0NPRF9TRVJWSUNFX0FVRElPIDB4MjAwMAotI2RlZmluZSBCVE1fQ09EX1NFUlZJQ0VfVEVMRVBIT05ZIDB4NDAwMAotI2RlZmluZSBCVE1fQ09EX1NFUlZJQ0VfSU5GT1JNQVRJT04gMHg4MDAwCi0KLS8qIGNsYXNzIG9mIGRldmljZSBmaWVsZCBtYWNyb3MgKi8KLSNkZWZpbmUgQlRNX0NPRF9NSU5PUl9DTEFTUyh1OCwgcGQpIFwKLSAgeyAodTgpID0gKHBkKVsyXSAmIDB4RkM7IH0KLSNkZWZpbmUgQlRNX0NPRF9NQUpPUl9DTEFTUyh1OCwgcGQpIFwKLSAgeyAodTgpID0gKHBkKVsxXSAmIDB4MUY7IH0KLSNkZWZpbmUgQlRNX0NPRF9TRVJWSUNFX0NMQVNTKHUxNiwgcGQpIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTE2KSA9IChwZClbMF07ICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTE2KSA8PD0gODsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodTE2KSArPSAocGQpWzFdICYgMHhFMDsgICAgICAgICAgIFwKLSAgfQotCi0vKiB0byBzZXQgdGhlIGZpZWxkcyAoYXNzdW1lcyB0aGF0IGZvcm1hdCB0eXBlIGlzIGFsd2F5cyAwKSAqLwotI2RlZmluZSBGSUVMRFNfVE9fQ09EKHBkLCBtbiwgbWosIHN2KSAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocGQpWzJdID0gbW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwZClbMV0gPSAobWopICsgKChzdikmQlRNX0NPRF9TRVJWSUNFX0NMQVNTX0xPX0IpOyBcCi0gICAgKHBkKVswXSA9IChzdikgPj4gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0vKiB0aGUgQ09EIG1hc2tzICovCi0jZGVmaW5lIEJUTV9DT0RfTUlOT1JfQ0xBU1NfTUFTSyAweEZDCi0jZGVmaW5lIEJUTV9DT0RfTUFKT1JfQ0xBU1NfTUFTSyAweDFGCi0jZGVmaW5lIEJUTV9DT0RfU0VSVklDRV9DTEFTU19MT19CIDB4MDBFMAotI2RlZmluZSBCVE1fQ09EX1NFUlZJQ0VfQ0xBU1NfTUFTSyAweEZGRTAKLQotLyogQlRNIHNlcnZpY2UgZGVmaW5pdGlvbnMKLSAqIFVzZWQgZm9yIHN0b3JpbmcgRUlSIGRhdGEgdG8gYml0IG1hc2sKLSovCi1lbnVtIHsKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19TRVJWSUNFX0RJU0NPVkVSWV9TRVJWRVIsCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfQlJPV1NFX0dST1VQX0RFU0NSSVBUT1IsICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQLCAgICAgICAqLwotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1NFUklBTF9QT1JULAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0xBTl9BQ0NFU1NfVVNJTkdfUFBQLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0RJQUxVUF9ORVRXT1JLSU5HLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0lSTUNfU1lOQywKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19PQkVYX09CSkVDVF9QVVNILAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX09CRVhfRklMRV9UUkFOU0ZFUiwKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19JUk1DX1NZTkNfQ09NTUFORCwKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19IRUFEU0VULAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0NPUkRMRVNTX1RFTEVQSE9OWSwKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0UsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSywKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQsCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfQURWX0FVRElPX0RJU1RSSUJVVElPTiwgICAgKi8KLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19BVl9SRU1PVEVfQ09OVFJPTCwKLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19WSURFT19DT05GRVJFTkNJTkcsICAgICAgICAqLwotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0lOVEVSQ09NLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0ZBWCwKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVksCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfV0FQLCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19XQVBfQ0xJRU5ULCAgICAgICAgICAgICAgICAqLwotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1BBTlUsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfTkFQLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0dOLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0RJUkVDVF9QUklOVElORywKLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19SRUZFUkVOQ0VfUFJJTlRJTkcsICAgICAgICAqLwotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0lNQUdJTkcsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfSU1BR0lOR19SRVNQT05ERVIsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfSU1BR0lOR19BVVRPX0FSQ0hJVkUsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfSU1BR0lOR19SRUZfT0JKRUNUUywKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0RJUl9QUlRfUkVGX09CSl9TRVJWSUNFLAotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1JFRkxFQ1RFRF9VSSwgICAgICAgICAgICAgICovCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfQkFTSUNfUFJJTlRJTkcsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfUFJJTlRJTkdfU1RBVFVTLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0hVTUFOX0lOVEVSRkFDRSwKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19DQUJMRV9SRVBMQUNFTUVOVCwKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19IQ1JQX1BSSU5ULAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0hDUlBfU0NBTiwKLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19DT01NT05fSVNETl9BQ0NFU1MsICAgICAgICAqLwotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1ZJREVPX0NPTkZFUkVOQ0lOR19HVywgICAgICovCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfVURJX01ULCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19VRElfVEEsICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1ZDUCwgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfU0FQLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1BCQVBfUENFLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1BCQVBfUFNFLAotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1RFX1BIT05FX0FDQ0VTUywgICAgICAgICAgICovCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfTUVfUEhPTkVfQUNDRVNTLCAgICAgICAgICAgKi8KLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19QSE9ORV9BQ0NFU1MsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVF9IUywKLSAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19QTlBfSU5GT1JNQVRJT04sCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfR0VORVJJQ19ORVRXT1JLSU5HLCAgICAgICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19HRU5FUklDX0ZJTEVUUkFOU0ZFUiwgICAgICAqLwotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0dFTkVSSUNfQVVESU8sICAgICAgICAgICAgICovCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfR0VORVJJQ19URUxFUEhPTlksICAgICAgICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19VUE5QX1NFUlZJQ0UsICAgICAgICAgICAgICAqLwotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1VQTlBfSVBfU0VSVklDRSwgICAgICAgICAgICovCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfRVNEUF9VUE5QX0lQX1BBTiwgICAgICAgICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19FU0RQX1VQTlBfSVBfTEFQLCAgICAgICAgICAqLwotICAvKiAgICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0VTRFBfVVBOUF9JUF9MMkNBUCwgICAgICAgICovCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfVklERU9fU09VUkNFLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX1ZJREVPX1NJTkssCi0gIC8qICAgIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfVklERU9fRElTVFJJQlVUSU9OICAgICAgICAgKi8KLSAgLyogICAgQlRNX0VJUl9VVUlEX1NFUlZDTEFTU19IRFBfUFJPRklMRSAgICAgICAgICAgICAgICAqLwotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX01FU1NBR0VfQUNDRVNTLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX01FU1NBR0VfTk9USUZJQ0FUSU9OLAotICBCVE1fRUlSX1VVSURfU0VSVkNMQVNTX0hEUF9TT1VSQ0UsCi0gIEJUTV9FSVJfVVVJRF9TRVJWQ0xBU1NfSERQX1NJTkssCi0gIEJUTV9FSVJfTUFYX1NFUlZJQ0VTCi19OwotCi0vKiBzZWFyY2ggcmVzdWx0IGluIEVJUiBvZiBpbnF1aXJ5IGRhdGFiYXNlICovCi0jZGVmaW5lIEJUTV9FSVJfRk9VTkQgMAotI2RlZmluZSBCVE1fRUlSX05PVF9GT1VORCAxCi0jZGVmaW5lIEJUTV9FSVJfVU5LTk9XTiAyCi0KLXR5cGVkZWYgdWludDhfdCB0QlRNX0VJUl9TRUFSQ0hfUkVTVUxUOwotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRNX0JMRV9TRUNfTk9ORSA9IDAsCi0gIC8qIGVuY3J5cHQgdGhlIGxpbmsgdXNpbmcgY3VycmVudCBrZXkgKi8KLSAgQlRNX0JMRV9TRUNfRU5DUllQVCA9IDEsCi0gIEJUTV9CTEVfU0VDX0VOQ1JZUFRfTk9fTUlUTSA9IDIsCi0gIEJUTV9CTEVfU0VDX0VOQ1JZUFRfTUlUTSA9IDMsCi19IHRCVE1fQkxFX1NFQ19BQ1Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBCVE0gU2VydmljZXMgTUFDUk9TIGhhbmRsZSBhcnJheSBvZiB1aW50MzJfdCBiaXRzIGZvciBtb3JlIHRoYW4gMzIgc2VydmljZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB1aW50MzJfdCdzIG5lY2Vzc2FyeSBmb3Igc2VydmljZXMgKi8KLSNkZWZpbmUgQlRNX0VJUl9BUlJBWV9CSVRTIDMyIC8qIE51bWJlciBvZiBiaXRzIGluIGVhY2ggYXJyYXkgZWxlbWVudCAqLwotI2RlZmluZSBCVE1fRUlSX1NFUlZJQ0VfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoKHVpbnQzMl90KUJUTV9FSVJfTUFYX1NFUlZJQ0VTIC8gQlRNX0VJUl9BUlJBWV9CSVRTKSArIFwKLSAgICgoKHVpbnQzMl90KUJUTV9FSVJfTUFYX1NFUlZJQ0VTICUgQlRNX0VJUl9BUlJBWV9CSVRTKSA/IDEgOiAwKSkKLQotLyogTUFDUk8gdG8gc2V0IHRoZSBzZXJ2aWNlIGJpdCBtYXNrIGluIGEgYml0IHN0cmVhbSAqLwotI2RlZmluZSBCVE1fRUlSX1NFVF9TRVJWSUNFKHAsIHNlcnZpY2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKCh1aW50MzJfdCopKHApKVsoKCh1aW50MzJfdCkoc2VydmljZSkpIC8gQlRNX0VJUl9BUlJBWV9CSVRTKV0gfD0gXAotICAgKCh1aW50MzJfdCkxIDw8ICgoKHVpbnQzMl90KShzZXJ2aWNlKSkgJSBCVE1fRUlSX0FSUkFZX0JJVFMpKSkKLQotLyogTUFDUk8gdG8gY2xlYXIgdGhlIHNlcnZpY2UgYml0IG1hc2sgaW4gYSBiaXQgc3RyZWFtICovCi0jZGVmaW5lIEJUTV9FSVJfQ0xSX1NFUlZJQ0UocCwgc2VydmljZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoKHVpbnQzMl90KikocCkpWygoKHVpbnQzMl90KShzZXJ2aWNlKSkgLyBCVE1fRUlSX0FSUkFZX0JJVFMpXSAmPSBcCi0gICB+KCh1aW50MzJfdCkxIDw8ICgoKHVpbnQzMl90KShzZXJ2aWNlKSkgJSBCVE1fRUlSX0FSUkFZX0JJVFMpKSkKLQotLyogTUFDUk8gdG8gY2hlY2sgdGhlIHNlcnZpY2UgYml0IG1hc2sgaW4gYSBiaXQgc3RyZWFtICovCi0jZGVmaW5lIEJUTV9FSVJfSEFTX1NFUlZJQ0UocCwgc2VydmljZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKCgodWludDMyX3QqKShwKSlbKCgodWludDMyX3QpKHNlcnZpY2UpKSAvIEJUTV9FSVJfQVJSQVlfQklUUyldICYgIFwKLSAgICAoKHVpbnQzMl90KTEgPDwgKCgodWludDMyX3QpKHNlcnZpY2UpKSAlIEJUTV9FSVJfQVJSQVlfQklUUykpKSA+PiBcCi0gICAoKCh1aW50MzJfdCkoc2VydmljZSkpICUgQlRNX0VJUl9BUlJBWV9CSVRTKSkKLQotLyogc3RhcnQgb2YgRUlSIGluIEhDSSBidWZmZXIsIDQgYnl0ZXMgPSBIQ0kgQ29tbWFuZCgyKSArIExlbmd0aCgxKSArIEZFQ19SZXEoMSkKLSAqLwotI2RlZmluZSBCVE1fSENJX0VJUl9PRkZTRVQgKEJUX0hEUl9TSVpFICsgNCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERldmljZSBEaXNjb3ZlcnkgVHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZWZpbml0aW9ucyBvZiB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gQlRNX1N0YXJ0SW5xdWlyeS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgLyogY29udGFpbnMgdGhlIHR3byBkZXZpY2UgY2xhc3MgY29uZGl0aW9uIGZpZWxkcyAqLwotewotICBERVZfQ0xBU1MgZGV2X2NsYXNzOwotICBERVZfQ0xBU1MgZGV2X2NsYXNzX21hc2s7Ci19IHRCVE1fQ09EX0NPTkQ7Ci0KLWNvbnN0ZXhwciB1aW50OF90IEJMRV9FVlRfQ09OTkVDVEFCTEVfQklUID0gMDsKLWNvbnN0ZXhwciB1aW50OF90IEJMRV9FVlRfU0NBTk5BQkxFX0JJVCA9IDE7Ci1jb25zdGV4cHIgdWludDhfdCBCTEVfRVZUX0RJUkVDVEVEX0JJVCA9IDI7Ci1jb25zdGV4cHIgdWludDhfdCBCTEVfRVZUX1NDQU5fUkVTUE9OU0VfQklUID0gMzsKLWNvbnN0ZXhwciB1aW50OF90IEJMRV9FVlRfTEVHQUNZX0JJVCA9IDQ7Ci0KLWNvbnN0ZXhwciB1aW50OF90IFBIWV9MRV9OT19QQUNLRVQgPSAweDAwOwotY29uc3RleHByIHVpbnQ4X3QgUEhZX0xFXzFNID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IFBIWV9MRV8yTSA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBQSFlfTEVfQ09ERUQgPSAweDA0OwotCi1jb25zdGV4cHIgdWludDhfdCBOT19BRElfUFJFU0VOVCA9IDB4RkY7Ci1jb25zdGV4cHIgdWludDhfdCBUWF9QT1dFUl9OT1RfUFJFU0VOVCA9IDB4N0Y7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBwY21faW50Zl9yYXRlOyAvKiBQQ00gaW50ZXJmYWNlIHJhdGU6IDA6IDEyOGticHMsIDE6IDI1NiBrYnBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjUxMiBicHM7IDM6IDEwMjRrYnBzOyA0OiAyMDQ4a2JwcyAqLwotICB1aW50OF90IGZyYW1lX3R5cGU7ICAgIC8qIGZyYW1lIHR5cGU6IDA6IHNob3J0OyAxOiBsb25nICovCi0gIHVpbnQ4X3Qgc3luY19tb2RlOyAgICAgLyogc3luYyBtb2RlOiAwOiBwZXJpcGhlcmFsOyAxOiBjZW50cmFsICovCi0gIHVpbnQ4X3QgY2xvY2tfbW9kZTsgICAgLyogY2xvY2sgbW9kZTogMDogcGVyaXBoZXJhbDsgMTogY2VudHJhbCAqLwotCi19IHRCVE1fU0NPX1BDTV9QQVJBTTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQUNMIENIQU5ORUwgTUFOQUdFTUVOVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBOT1RFOiBNb3ZlZCB0byBzdGFjay9pbmNsdWRlL2FjbF9hcGlfdHlwZXMuaAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTQ08gQ0hBTk5FTCBNQU5BR0VNRU5UCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioKLSAqICBTQ08gQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqLwotCi0vKiBEZWZpbmUgYW4gaW52YWxpZCBTQ08gaW5kZXggYW5kIGFuIGludmFsaWQgSENJIGhhbmRsZSAqLwotI2RlZmluZSBCVE1fSU5WQUxJRF9TQ09fSU5ERVggMHhGRkZGCi0KLS8qIERlZmluZSBhbiBpbnZhbGlkIFNDTyBkaXNjb25uZWN0IHJlYXNvbiAqLwotI2RlZmluZSBCVE1fSU5WQUxJRF9TQ09fRElTQ19SRUFTT04gMHhGRkZGCi0KLSNkZWZpbmUgQlRNX1NDT19MSU5LX09OTFlfTUFTSyBcCi0gIChFU0NPX1BLVF9UWVBFU19NQVNLX0hWMSB8IEVTQ09fUEtUX1RZUEVTX01BU0tfSFYyIHwgRVNDT19QS1RfVFlQRVNfTUFTS19IVjMpCi0KLSNkZWZpbmUgQlRNX0VTQ09fTElOS19PTkxZX01BU0sgXAotICAoRVNDT19QS1RfVFlQRVNfTUFTS19FVjMgfCBFU0NPX1BLVF9UWVBFU19NQVNLX0VWNCB8IEVTQ09fUEtUX1RZUEVTX01BU0tfRVY1KQotCi0vKioqKioqKioqKioqKioqCi0gKiAgU0NPIFR5cGVzCi0gKioqKioqKioqKioqKioqLwotI2RlZmluZSBCVE1fTElOS19UWVBFX1NDTyBIQ0lfTElOS19UWVBFX1NDTwotI2RlZmluZSBCVE1fTElOS19UWVBFX0VTQ08gSENJX0xJTktfVFlQRV9FU0NPCi10eXBlZGVmIHVpbnQ4X3QgdEJUTV9TQ09fVFlQRTsKLQotLyoqKioqKioqKioqKioqKioqKioKLSAqIFNDTyBDb2RlYyBUeXBlcwotICoqKioqKioqKioqKioqKioqKiovCi0vLyBUT0RPKGdvb2dsZSkgVGhpcyBzaG91bGQgdXNlIGNvbW1vbiBkZWZpbml0aW9ucwotI2RlZmluZSBCVE1fU0NPX0NPREVDX05PTkUgMHgwMDAwCi0jZGVmaW5lIEJUTV9TQ09fQ09ERUNfQ1ZTRCAweDAwMDEKLSNkZWZpbmUgQlRNX1NDT19DT0RFQ19NU0JDIDB4MDAwMgotdHlwZWRlZiB1aW50MTZfdCB0QlRNX1NDT19DT0RFQ19UWVBFOwotCi0vKioqKioqKioqKioqKioqKioqKgotICogU0NPIFZvaWNlIFNldHRpbmdzCi0gKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQlRNX1ZPSUNFX1NFVFRJTkdfQ1ZTRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKHVpbnQxNl90KShIQ0lfSU5QX0NPRElOR19MSU5FQVIgfCBIQ0lfSU5QX0RBVEFfRk1UXzJTX0NPTVBMRU1FTlQgfCBcCi0gICAgICAgICAgICAgIEhDSV9JTlBfU0FNUExFX1NJWkVfMTZCSVQgfCBIQ0lfQUlSX0NPRElOR19GT1JNQVRfQ1ZTRCkpCi0KLSNkZWZpbmUgQlRNX1ZPSUNFX1NFVFRJTkdfVFJBTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKHVpbnQxNl90KShIQ0lfSU5QX0NPRElOR19MSU5FQVIgfCBIQ0lfSU5QX0RBVEFfRk1UXzJTX0NPTVBMRU1FTlQgfCBcCi0gICAgICAgICAgICAgIEhDSV9JTlBfU0FNUExFX1NJWkVfMTZCSVQgfCBIQ0lfQUlSX0NPRElOR19GT1JNQVRfVFJBTlNQTlQpKQotCi0vKioqKioqKioqKioqKioqKioqKgotICogU0NPIERhdGEgU3RhdHVzCi0gKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgdWludDhfdCB0QlRNX1NDT19EQVRBX0ZMQUc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTQ08gQ2FsbGJhY2sgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiB2b2lkKHRCVE1fU0NPX0NCKSh1aW50MTZfdCBzY29faW54KTsKLQotLyoqKioqKioqKioqKioqKgotICogIGVTQ08gVHlwZXMKLSAqKioqKioqKioqKioqKiovCi0vKiB0QlRNX0VTQ09fQ0JBQ0sgZXZlbnQgdHlwZXMgKi8KLSNkZWZpbmUgQlRNX0VTQ09fQ09OTl9SRVFfRVZUIDIKLXR5cGVkZWYgdWludDhfdCB0QlRNX0VTQ09fRVZUOwotCi0vKiBTdHJ1Y3R1cmUgcGFzc2VkIHdpdGggU0NPIGNoYW5nZSBjb21tYW5kIGFuZCBldmVudHMuCi0gKiBVc2VkIGJ5IGJvdGggU3luYyBhbmQgRW5oYW5jZWQgc3luYyBtZXNzYWdpbmcKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBtYXhfbGF0ZW5jeV9tczsKLSAgdWludDE2X3QgcGFja2V0X3R5cGVzOwotICB1aW50OF90IHJldHJhbnNtaXNzaW9uX2VmZm9ydDsKLX0gdEJUTV9DSEdfRVNDT19QQVJBTVM7Ci0KLS8qIFJldHVybmVkIGJ5IEJUTV9SZWFkRVNjb0xpbmtQYXJtcygpICovCi1zdHJ1Y3QgdEJUTV9FU0NPX0RBVEEgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQ4X3QgbGlua190eXBlOyAvKiBCVE1fTElOS19UWVBFX1NDTyBvciBCVE1fTElOS19UWVBFX0VTQ08gKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3Qgc2NvX2lueDsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOwotICBERVZfQ0xBU1MgZGV2X2NsYXNzOwotICB0QlRNX1NDT19UWVBFIGxpbmtfdHlwZTsKLX0gdEJUTV9FU0NPX0NPTk5fUkVRX0VWVF9EQVRBOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdEJUTV9FU0NPX0NPTk5fUkVRX0VWVF9EQVRBIGNvbm5fZXZ0OwotfSB0QlRNX0VTQ09fRVZUX0RBVEE7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBlU0NPIENhbGxiYWNrIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgdm9pZCh0QlRNX0VTQ09fQ0JBQ0spKHRCVE1fRVNDT19FVlQgZXZlbnQsIHRCVE1fRVNDT19FVlRfREFUQSogcF9kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgU0VDVVJJVFkgTUFOQUdFTUVOVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFNlY3VyaXR5IE1hbmFnZXIgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEJUTV9TRUNfTU9ERV9TRVJWSUNFID0gMiwKLSAgQlRNX1NFQ19NT0RFX1NQID0gNCwKLSAgQlRNX1NFQ19NT0RFX1NDID0gNiwKLX0gdFNFQ1VSSVRZX01PREU7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBzZWN1cml0eV9tb2RlX3RleHQoY29uc3QgdFNFQ1VSSVRZX01PREUmIHNlY3VyaXR5X21vZGUpIHsKLSAgc3dpdGNoIChzZWN1cml0eV9tb2RlKSB7Ci0gICAgY2FzZSBCVE1fU0VDX01PREVfU0VSVklDRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygic2VydmljZSIpOwotICAgIGNhc2UgQlRNX1NFQ19NT0RFX1NQOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJzaW1wbGUgcGFpcmluZyIpOwotICAgIGNhc2UgQlRNX1NFQ19NT0RFX1NDOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJzZWN1cmUgY29ubmVjdGlvbnMgb25seSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV05bJWhodV0iLCBzZWN1cml0eV9tb2RlKTsKLSAgfQotfQotCi1lbnVtIDogdWludDE2X3QgewotICAvKiBOb3RoaW5nIHJlcXVpcmVkICovCi0gIEJUTV9TRUNfTk9ORSA9IDB4MDAwMCwKLSAgLyogSW5ib3VuZCBjYWxsIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uICovCi0gIEJUTV9TRUNfSU5fQVVUSEVOVElDQVRFID0gMHgwMDAyLAotICAvKiBJbmJvdW5kIGNhbGwgcmVxdWlyZXMgZW5jcnlwdGlvbiAqLwotICBCVE1fU0VDX0lOX0VOQ1JZUFQgPSAweDAwMDQsCi0gIC8qIE91dGJvdW5kIGNhbGwgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gKi8KLSAgQlRNX1NFQ19PVVRfQVVUSEVOVElDQVRFID0gMHgwMDEwLAotICAvKiBPdXRib3VuZCBjYWxsIHJlcXVpcmVzIGVuY3J5cHRpb24gKi8KLSAgQlRNX1NFQ19PVVRfRU5DUllQVCA9IDB4MDAyMCwKLSAgLyogU2VjdXJlIENvbm5lY3Rpb25zIE9ubHkgTW9kZSAqLwotICBCVE1fU0VDX01PREU0X0xFVkVMNCA9IDB4MDA0MCwKLSAgLyogTmVlZCB0byBzd2l0Y2ggY29ubmVjdGlvbiB0byBiZSBjZW50cmFsICovCi0gIEJUTV9TRUNfRk9SQ0VfQ0VOVFJBTCA9IDB4MDEwMCwKLSAgLyogTmVlZCB0byBzd2l0Y2ggY29ubmVjdGlvbiB0byBiZSBjZW50cmFsICovCi0gIEJUTV9TRUNfQVRURU1QVF9DRU5UUkFMID0gMHgwMjAwLAotICAvKiBOZWVkIHRvIHN3aXRjaCBjb25uZWN0aW9uIHRvIGJlIHBlcmlwaGVyYWwgKi8KLSAgQlRNX1NFQ19GT1JDRV9QRVJJUEhFUkFMID0gMHgwNDAwLAotICAvKiBUcnkgdG8gc3dpdGNoIGNvbm5lY3Rpb24gdG8gYmUgcGVyaXBoZXJhbCAqLwotICBCVE1fU0VDX0FUVEVNUFRfUEVSSVBIRVJBTCA9IDB4MDgwMCwKLSAgLyogaW5ib3VuZCBEbyBtYW4gaW4gdGhlIG1pZGRsZSBwcm90ZWN0aW9uICovCi0gIEJUTV9TRUNfSU5fTUlUTSA9IDB4MTAwMCwKLSAgLyogb3V0Ym91bmQgRG8gbWFuIGluIHRoZSBtaWRkbGUgcHJvdGVjdGlvbiAqLwotICBCVE1fU0VDX09VVF9NSVRNID0gMHgyMDAwLAotICAvKiBlbmZvcmNlIGEgbWluaW11bSBvZiAxNiBkaWdpdCBmb3Igc2VjIG1vZGUgMiAqLwotICBCVE1fU0VDX0lOX01JTl8xNl9ESUdJVF9QSU4gPSAweDQwMDAsCi19OwotCi0vKiBTZWN1cml0eSBGbGFncyBbYml0IG1hc2tdIChCVE1fR2V0U2VjdXJpdHlGbGFncykKLSovCi0jZGVmaW5lIEJUTV9TRUNfRkxBR19BVVRIRU5USUNBVEVEIDB4MDIKLSNkZWZpbmUgQlRNX1NFQ19GTEFHX0VOQ1JZUFRFRCAweDA0Ci0jZGVmaW5lIEJUTV9TRUNfRkxBR19MS0VZX0tOT1dOIDB4MTAKLSNkZWZpbmUgQlRNX1NFQ19GTEFHX0xLRVlfQVVUSEVEIDB4MjAKLQotLyogTGluayBLZXkgdHlwZXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IGxpbmsga2V5LgotICogcmV0dXJuZWQgaW4gbGluayBrZXkgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uCi0qLwotI2RlZmluZSBCVE1fTEtFWV9UWVBFX0NPTUJJTkFUSU9OIEhDSV9MS0VZX1RZUEVfQ09NQklOQVRJT04KLSNkZWZpbmUgQlRNX0xLRVlfVFlQRV9SRU1PVEVfVU5JVCBIQ0lfTEtFWV9UWVBFX1JFTU9URV9VTklUCi0jZGVmaW5lIEJUTV9MS0VZX1RZUEVfVU5BVVRIX0NPTUIgSENJX0xLRVlfVFlQRV9VTkFVVEhfQ09NQgotI2RlZmluZSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQiBIQ0lfTEtFWV9UWVBFX0FVVEhfQ09NQgotI2RlZmluZSBCVE1fTEtFWV9UWVBFX0NIQU5HRURfQ09NQiBIQ0lfTEtFWV9UWVBFX0NIQU5HRURfQ09NQgotCi0jZGVmaW5lIEJUTV9MS0VZX1RZUEVfVU5BVVRIX0NPTUJfUF8yNTYgSENJX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NgotI2RlZmluZSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NiBIQ0lfTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NgotCi0vKiAiZWFzeSIgcmVxdWlyZW1lbnRzIGZvciBMSyBkZXJpdmVkIGZyb20gTFRLICovCi0jZGVmaW5lIEJUTV9MVEtfREVSSVZFRF9MS0VZX09GRlNFVCAweDIwCi0jZGVmaW5lIEJUTV9MS0VZX1RZUEVfSUdOT1JFICAgICAgICAgICAgICAgXAotICAweGZmIC8qIHVzZWQgd2hlbiBldmVudCBpcyByZXNwb25zZSBmcm9tIFwKLSAgICAgICAgICBoY2kgcmV0dXJuIGxpbmsga2V5cyByZXF1ZXN0ICovCi0KLXR5cGVkZWYgdWludDhfdCB0QlRNX0xJTktfS0VZX1RZUEU7Ci0KLS8qIFByb3RvY29sIGxldmVsIHNlY3VyaXR5IChCVE1fU2V0U2VjdXJpdHlMZXZlbCkgKi8KLSNkZWZpbmUgQlRNX1NFQ19QUk9UT19SRkNPTU0gMwotI2RlZmluZSBCVE1fU0VDX1BST1RPX0JORVAgNQotI2RlZmluZSBCVE1fU0VDX1BST1RPX0hJRCA2IC8qIEhJRCAgICAgICovCi0jZGVmaW5lIEJUTV9TRUNfUFJPVE9fQVZEVCA3Ci0KLSNkZWZpbmUgQlRNX1NFQ19TRVJWSUNFX0hFQURTRVQgOAotI2RlZmluZSBCVE1fU0VDX1NFUlZJQ0VfSEVBRFNFVF9BRyAxMgotI2RlZmluZSBCVE1fU0VDX1NFUlZJQ0VfQUdfSEFORFNGUkVFIDI5Ci0jZGVmaW5lIEJUTV9TRUNfU0VSVklDRV9SRkNfTVVYIDQyCi0jZGVmaW5lIEJUTV9TRUNfU0VSVklDRV9IRUFSSU5HX0FJRF9MRUZUIDU0Ci0jZGVmaW5lIEJUTV9TRUNfU0VSVklDRV9IRUFSSU5HX0FJRF9SSUdIVCA1NQotI2RlZmluZSBCVE1fU0VDX1NFUlZJQ0VfRUFUVCA1NgotCi0vKiBVcGRhdGUgdGhlc2UgYXMgc2VydmljZXMgYXJlIGFkZGVkICovCi0jZGVmaW5lIEJUTV9TRUNfU0VSVklDRV9GSVJTVF9FTVBUWSA1NwotCi0jaWZuZGVmIEJUTV9TRUNfTUFYX1NFUlZJQ0VTCi0jZGVmaW5lIEJUTV9TRUNfTUFYX1NFUlZJQ0VTIDc1Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNlY3VyaXR5IFNlcnZpY2VzIE1BQ1JPUyBoYW5kbGUgYXJyYXkgb2YgdWludDMyX3QgYml0cyBmb3IgbW9yZSB0aGFuIDMyCi0gKiB0cnVzdGVkIHNlcnZpY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1lbnVtIHsKLSAgQlRNX1NQX0lPX1JFUV9FVlQsICAgIC8qIHJlY2VpdmVkIElPX0NBUEFCSUxJVFlfUkVRVUVTVCBldmVudCAqLwotICBCVE1fU1BfSU9fUlNQX0VWVCwgICAgLyogcmVjZWl2ZWQgSU9fQ0FQQUJJTElUWV9SRVNQT05TRSBldmVudCAqLwotICBCVE1fU1BfQ0ZNX1JFUV9FVlQsICAgLyogcmVjZWl2ZWQgVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVCBldmVudCAqLwotICBCVE1fU1BfS0VZX05PVElGX0VWVCwgLyogcmVjZWl2ZWQgVVNFUl9QQVNTS0VZX05PVElGWSBldmVudCAqLwotICBCVE1fU1BfS0VZX1JFUV9FVlQsICAgLyogcmVjZWl2ZWQgVVNFUl9QQVNTS0VZX1JFUVVFU1QgZXZlbnQgKi8KLSAgQlRNX1NQX0xPQ19PT0JfRVZULCAgIC8qIHJlY2VpdmVkIHJlc3VsdCBmb3IgUkVBRF9MT0NBTF9PT0JfREFUQSBjb21tYW5kICovCi0gIEJUTV9TUF9STVRfT09CX0VWVCwgICAvKiByZWNlaXZlZCBSRU1PVEVfT09CX0RBVEFfUkVRVUVTVCBldmVudCAqLwotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRNX1NQX0VWVDsKLQotZW51bSA6IHVpbnQ4X3QgewotICBCVE1fSU9fQ0FQX09VVCA9IDAsICAgIC8qIERpc3BsYXlPbmx5ICovCi0gIEJUTV9JT19DQVBfSU8gPSAxLCAgICAgLyogRGlzcGxheVllc05vICovCi0gIEJUTV9JT19DQVBfSU4gPSAyLCAgICAgLyogS2V5Ym9hcmRPbmx5ICovCi0gIEJUTV9JT19DQVBfTk9ORSA9IDMsICAgLyogTm9JbnB1dE5vT3V0cHV0ICovCi0gIEJUTV9JT19DQVBfS0JESVNQID0gNCwgLyogS2V5Ym9hcmQgZGlzcGxheSAqLwotICBCVE1fSU9fQ0FQX01BWCA9IDUsCi0gIEJUTV9JT19DQVBfVU5LTk9XTiA9IDB4RkYgLyogVW5rbm93biB2YWx1ZSAqLwotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRNX0lPX0NBUDsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGlvX2NhcGFiaWxpdGllc190ZXh0KGNvbnN0IHRCVE1fSU9fQ0FQJiBpb19jYXBzKSB7Ci0gIHN3aXRjaCAoaW9fY2FwcykgewotICAgIGNhc2UgQlRNX0lPX0NBUF9PVVQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkRpc3BsYXkgb25seSIpOwotICAgIGNhc2UgQlRNX0lPX0NBUF9JTzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiRGlzcGxheSB5ZXMtbm8iKTsKLSAgICBjYXNlIEJUTV9JT19DQVBfSU46Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIktleWJvYXJkIE9ubHkiKTsKLSAgICBjYXNlIEJUTV9JT19DQVBfTk9ORToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiTm8gaW5wdXQgb3Igb3V0cHV0Iik7Ci0gICAgY2FzZSBCVE1fSU9fQ0FQX0tCRElTUDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiS2V5Ym9hcmQtRGlzcGxheSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCJVTktOT1dOWyVoaHVdIiwgaW9fY2Fwcyk7Ci0gIH0KLX0KLQotI2RlZmluZSBCVE1fTUFYX1BBU1NLRVlfVkFMICg5OTk5OTkpCi0KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICAvKiBNSVRNIFByb3RlY3Rpb24gTm90IFJlcXVpcmVkIC0gU2luZ2xlIFByb2ZpbGUvbm9uLWJvbmRpbmcgTnVtZXJpYwotICAgKiBjb21wYXJpc29uIHdpdGggYXV0b21hdGljIGFjY2VwdCBhbGxvd2VkICovCi0gIC8vIE5PX0JPTkRJTkcKLSAgQlRNX0FVVEhfU1BfTk8gPSAwLAotICAvKiBNSVRNIFByb3RlY3Rpb24gUmVxdWlyZWQgLSBTaW5nbGUgUHJvZmlsZS9ub24tYm9uZGluZy4gVXNlIElPIENhcGFiaWxpdGllcwotICAgKiB0byBkZXRlcm1pbmUgYXV0aGVudGljYXRpb24gcHJvY2VkdXJlICovCi0gIC8vIE5PX0JPTkRJTkdfTUlUTV9QUk9URUNUSU9OCi0gIEJUTV9BVVRIX1NQX1lFUyA9IDEsCi0gIC8qIE1JVE0gUHJvdGVjdGlvbiBOb3QgUmVxdWlyZWQgLSBBbGwgUHJvZmlsZXMvZGVkaWNhdGVkIGJvbmRpbmcgTnVtZXJpYwotICAgKiBjb21wYXJpc29uIHdpdGggYXV0b21hdGljIGFjY2VwdCBhbGxvd2VkICovCi0gIC8vIERFRElDQVRFRF9CT05ESU5HCi0gIEJUTV9BVVRIX0FQX05PID0gMiwKLSAgLyogTUlUTSBQcm90ZWN0aW9uIFJlcXVpcmVkIC0gQWxsIFByb2ZpbGVzL2RlZGljYXRlZCBib25kaW5nIFVzZSBJTwotICAgKiBDYXBhYmlsaXRpZXMgdG8gZGV0ZXJtaW5lIGF1dGhlbnRpY2F0aW9uIHByb2NlZHVyZSAqLwotICAvLyBERURJQ0FURURfQk9ORElOR19NSVRNX1BST1RFQ1RJT04KLSAgQlRNX0FVVEhfQVBfWUVTID0gMywKLSAgLyogTUlUTSBQcm90ZWN0aW9uIE5vdCBSZXF1aXJlZCAtIFNpbmdsZSBQcm9maWxlcy9nZW5lcmFsIGJvbmRpbmcgTnVtZXJpYwotICAgKiBjb21wYXJpc29uIHdpdGggYXV0b21hdGljIGFjY2VwdCBhbGxvd2VkICovCi0gIC8vIEdFTkVSQUxfQk9ORElORwotICBCVE1fQVVUSF9TUEdCX05PID0gNCwKLSAgLyogTUlUTSBQcm90ZWN0aW9uIFJlcXVpcmVkIC0gU2luZ2xlIFByb2ZpbGVzL2dlbmVyYWwgYm9uZGluZyBVc2UgSU8KLSAgICogQ2FwYWJpbGl0aWVzIHRvIGRldGVybWluZSBhdXRoZW50aWNhdGlvbiBwcm9jZWR1cmUgKi8KLSAgLy8gR0VORVJBTF9CT05ESU5HX01JVE1fUFJPVEVDVElPTgotICBCVE1fQVVUSF9TUEdCX1lFUyA9IDUsCi19IHRCVE1fQVVUSDsKLQotLyogdGhpcyBiaXQgaXMgT1JlZCB3aXRoIEJUTV9BVVRIX1NQXyogd2hlbiBJTyBleGNoYW5nZSBmb3IgZGVkaWNhdGVkIGJvbmRpbmcgKi8KLSNkZWZpbmUgQlRNX0FVVEhfRERfQk9ORCAyCi0jZGVmaW5lIEJUTV9BVVRIX0JPTkRTIDYgIC8qIHRoZSBnZW5lcmFsL2RlZGljYXRlZCBib25kaW5nIGJpdHMgICovCi0jZGVmaW5lIEJUTV9BVVRIX1lOX0JJVCAxIC8qIHRoaXMgaXMgdGhlIFllcyBvciBObyBiaXQgICovCi0KLSNkZWZpbmUgQlRNX0JMRV9JTklUSUFUT1JfS0VZX1NJWkUgMTUKLSNkZWZpbmUgQlRNX0JMRV9SRVNQT05ERVJfS0VZX1NJWkUgMTUKLSNkZWZpbmUgQlRNX0JMRV9NQVhfS0VZX1NJWkUgMTYKLQotdHlwZWRlZiB1aW50OF90IHRCVE1fQVVUSF9SRVE7Ci0KLWVudW0gewotICBCVE1fT09CX05PTkUsCi0gIEJUTV9PT0JfUFJFU0VOVF8xOTIsCi0gIEJUTV9PT0JfUFJFU0VOVF8yNTYsCi0gIEJUTV9PT0JfUFJFU0VOVF8xOTJfQU5EXzI1NiwKLSAgQlRNX09PQl9VTktOT1dOCi19OwotCi10eXBlZGVmIHVpbnQ4X3QgdEJUTV9PT0JfREFUQTsKLQotLyogZGF0YSB0eXBlIGZvciBCVE1fU1BfSU9fUkVRX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7ICAgICAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgdEJUTV9JT19DQVAgaW9fY2FwOyAgICAgLyogbG9jYWwgSU8gY2FwYWJpbGl0aWVzICovCi0gIHRCVE1fT09CX0RBVEEgb29iX2RhdGE7IC8qIE9PQiBkYXRhIHByZXNlbnQgKGxvY2FsbHkpIGZvciB0aGUgcGVlciBkZXZpY2UgKi8KLSAgdEJUTV9BVVRIX1JFUSBhdXRoX3JlcTsgLyogQXV0aGVudGljYXRpb24gcmVxdWlyZWQgKGZvciBsb2NhbCBkZXZpY2UpICovCi0gIGJvb2wgaXNfb3JpZzsgICAgICAgICAgIC8qIHRydWUsIGlmIGxvY2FsIGRldmljZSBpbml0aWF0ZWQgdGhlIFNQIHByb2Nlc3MgKi8KLX0gdEJUTV9TUF9JT19SRVE7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRNX1NQX0lPX1JTUF9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgdEJUTV9JT19DQVAgaW9fY2FwOyAvKiBwZWVyIElPIGNhcGFiaWxpdGllcyAqLwotICB0QlRNX09PQl9EQVRBCi0gICAgICBvb2JfZGF0YTsgLyogT09CIGRhdGEgcHJlc2VudCBhdCBwZWVyIGRldmljZSBmb3IgdGhlIGxvY2FsIGRldmljZSAqLwotICB0QlRNX0FVVEhfUkVRIGF1dGhfcmVxOyAvKiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgcGVlciBkZXZpY2UgKi8KLX0gdEJUTV9TUF9JT19SU1A7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRNX1NQX0NGTV9SRVFfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgICAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgIC8qIHBlZXIgQ29EICovCi0gIHRCVE1fQkRfTkFNRSBiZF9uYW1lOyAvKiBwZWVyIGRldmljZSBuYW1lICovCi0gIHVpbnQzMl90IG51bV92YWw7IC8qIHRoZSBudW1lcmljIHZhbHVlIGZvciBjb21wYXJpc29uLiBJZiBqdXN0X3dvcmtzLCBkbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc2hvdyB0aGlzIG51bWJlciB0byBVSSAqLwotICBib29sIGp1c3Rfd29ya3M7ICAvKiB0cnVlLCBpZiAiSnVzdCBXb3JrcyIgYXNzb2NpYXRpb24gbW9kZWwgKi8KLSAgdEJUTV9BVVRIX1JFUSBsb2NfYXV0aF9yZXE7IC8qIEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIGZvciBsb2NhbCBkZXZpY2UgKi8KLSAgdEJUTV9BVVRIX1JFUSBybXRfYXV0aF9yZXE7IC8qIEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIGZvciBwZWVyIGRldmljZSAqLwotICB0QlRNX0lPX0NBUCBsb2NfaW9fY2FwczsgICAgLyogSU8gQ2FwYWJpbGl0aWVzIG9mIHRoZSBsb2NhbCBkZXZpY2UgKi8KLSAgdEJUTV9JT19DQVAgcm10X2lvX2NhcHM7ICAgIC8qIElPIENhcGFiaWxpdGllcyBvZiB0aGUgcmVtb3QgZGV2aWNlICovCi19IHRCVE1fU1BfQ0ZNX1JFUTsKLQotLyogZGF0YSB0eXBlIGZvciBCVE1fU1BfS0VZX1JFUV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZF9hZGRyOyAgIC8qIHBlZXIgYWRkcmVzcyAqLwotICBERVZfQ0xBU1MgZGV2X2NsYXNzOyAgLyogcGVlciBDb0QgKi8KLSAgdEJUTV9CRF9OQU1FIGJkX25hbWU7IC8qIHBlZXIgZGV2aWNlIG5hbWUgKi8KLX0gdEJUTV9TUF9LRVlfUkVROwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUTV9TUF9LRVlfTk9USUZfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgICAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgIC8qIHBlZXIgQ29EICovCi0gIHRCVE1fQkRfTkFNRSBiZF9uYW1lOyAvKiBwZWVyIGRldmljZSBuYW1lICovCi0gIHVpbnQzMl90IHBhc3NrZXk7ICAgICAvKiBwYXNza2V5ICovCi19IHRCVE1fU1BfS0VZX05PVElGOwotCi0vKiBkYXRhIHR5cGUgZm9yIEJUTV9TUF9MT0NfT09CX0VWVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX1NUQVRVUyBzdGF0dXM7IC8qICovCi0gIE9jdGV0MTYgYzsgICAgICAgICAgLyogU2ltcGxlIFBhaXJpbmcgSGFzaCBDICovCi0gIE9jdGV0MTYgcjsgICAgICAgICAgLyogU2ltcGxlIFBhaXJpbmcgUmFuZG9tbml6ZXIgUiAqLwotfSB0QlRNX1NQX0xPQ19PT0I7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRNX1NQX1JNVF9PT0JfRVZUICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgICAvKiBwZWVyIGFkZHJlc3MgKi8KLSAgREVWX0NMQVNTIGRldl9jbGFzczsgIC8qIHBlZXIgQ29EICovCi0gIHRCVE1fQkRfTkFNRSBiZF9uYW1lOyAvKiBwZWVyIGRldmljZSBuYW1lICovCi19IHRCVE1fU1BfUk1UX09PQjsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHRCVE1fU1BfSU9fUkVRIGlvX3JlcTsgICAgICAgLyogQlRNX1NQX0lPX1JFUV9FVlQgICAgICAqLwotICB0QlRNX1NQX0lPX1JTUCBpb19yc3A7ICAgICAgIC8qIEJUTV9TUF9JT19SU1BfRVZUICAgICAgKi8KLSAgdEJUTV9TUF9DRk1fUkVRIGNmbV9yZXE7ICAgICAvKiBCVE1fU1BfQ0ZNX1JFUV9FVlQgICAgICovCi0gIHRCVE1fU1BfS0VZX05PVElGIGtleV9ub3RpZjsgLyogQlRNX1NQX0tFWV9OT1RJRl9FVlQgICAqLwotICB0QlRNX1NQX0tFWV9SRVEga2V5X3JlcTsgICAgIC8qIEJUTV9TUF9LRVlfUkVRX0VWVCAgICAgKi8KLSAgdEJUTV9TUF9MT0NfT09CIGxvY19vb2I7ICAgICAvKiBCVE1fU1BfTE9DX09PQl9FVlQgICAgICovCi0gIHRCVE1fU1BfUk1UX09PQiBybXRfb29iOyAgICAgLyogQlRNX1NQX1JNVF9PT0JfRVZUICAgICAqLwotfSB0QlRNX1NQX0VWVF9EQVRBOwotCi0vKiBTaW1wbGUgUGFpcmluZyBFdmVudHMuICBDYWxsZWQgYnkgdGhlIHN0YWNrIHdoZW4gU2ltcGxlIFBhaXJpbmcgcmVsYXRlZAotICogZXZlbnRzIG9jY3VyLgotKi8KLXR5cGVkZWYgdEJUTV9TVEFUVVModEJUTV9TUF9DQUxMQkFDSykodEJUTV9TUF9FVlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1BfRVZUX0RBVEEqIHBfZGF0YSk7Ci0KLXR5cGVkZWYgdm9pZCh0QlRNX01LRVlfQ0FMTEJBQ0spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfZmxhZyk7Ci0KLS8qIEVuY3J5cHRpb24gZW5hYmxlZC9kaXNhYmxlZCBjb21wbGV0ZTogT3B0aW9uYWxseSBwYXNzZWQgd2l0aAotICogQlRNX1NldEVuY3J5cHRpb24uCi0gKiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgb3B0aW9uYWwgZGF0YSBwYXNzZWQgaW4gYnkgQlRNX1NldEVuY3J5cHRpb24KLSAqICAgICAgICAgICAgICB0QlRNX1NUQVRVUyAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0qLwotdHlwZWRlZiB2b2lkKHRCVE1fU0VDX0NBTExCQUNLKShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYXNucG9ydCwgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgcmVzdWx0KTsKLXR5cGVkZWYgdEJUTV9TRUNfQ0FMTEJBQ0sgdEJUTV9TRUNfQ0FMTEJBQ0s7Ci0KLS8qIEJvbmQgQ2FuY2VsIGNvbXBsZXRlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIFJlc3VsdCBvZiB0aGUgY2FuY2VsIG9wZXJhdGlvbgotICoKLSovCi10eXBlZGVmIHZvaWQodEJUTV9CT05EX0NBTkNFTF9DTVBMX0NBTExCQUNLKSh0QlRNX1NUQVRVUyByZXN1bHQpOwotCi0vKiBMRSByZWxhdGVkIGV2ZW50IGFuZCBkYXRhIHN0cnVjdHVyZSAqLwotLyogcmVjZWl2ZWQgSU9fQ0FQQUJJTElUWV9SRVFVRVNUIGV2ZW50ICovCi0jZGVmaW5lIEJUTV9MRV9JT19SRVFfRVZUIFNNUF9JT19DQVBfUkVRX0VWVAotLyogc2VjdXJpdHkgcmVxdWVzdCBldmVudCAqLwotI2RlZmluZSBCVE1fTEVfU0VDX1JFUVVFU1RfRVZUIFNNUF9TRUNfUkVRVUVTVF9FVlQKLS8qIHJlY2VpdmVkIFVTRVJfUEFTU0tFWV9OT1RJRlkgZXZlbnQgKi8KLSNkZWZpbmUgQlRNX0xFX0tFWV9OT1RJRl9FVlQgU01QX1BBU1NLRVlfTk9USUZfRVZUCi0vKiByZWNlaXZlZCBVU0VSX1BBU1NLRVlfUkVRVUVTVCBldmVudCAqLwotI2RlZmluZSBCVE1fTEVfS0VZX1JFUV9FVlQgU01QX1BBU1NLRVlfUkVRX0VWVAotLyogT09CIGRhdGEgcmVxdWVzdCBldmVudCAqLwotI2RlZmluZSBCVE1fTEVfT09CX1JFUV9FVlQgU01QX09PQl9SRVFfRVZUCi0vKiBOdW1lcmljIENvbXBhcmlzb24gcmVxdWVzdCBldmVudCAqLwotI2RlZmluZSBCVE1fTEVfTkNfUkVRX0VWVCBTTVBfTkNfUkVRX0VWVAotLyogUGVlciBrZXlwcmVzcyBub3RpZmljYXRpb24gcmVjZCBldmVudCAqLwotI2RlZmluZSBCVE1fTEVfUFJfS0VZUFJfTk9UX0VWVCBTTVBfUEVFUl9LRVlQUl9OT1RfRVZUCi0vKiBTQyBPT0IgcmVxdWVzdCBldmVudCAoYm90aCBsb2NhbCBhbmQgcGVlciBPT0IgZGF0YSkgY2FuIGJlIGV4cGVjdGVkIGluCi0gKiByZXNwb25zZSAqLwotI2RlZmluZSBCVE1fTEVfU0NfT09CX1JFUV9FVlQgU01QX1NDX09PQl9SRVFfRVZUCi0vKiBTQyBPT0IgbG9jYWwgZGF0YSBzZXQgaXMgY3JlYXRlZCAoYXMgcmVzdWx0IG9mIFNNUF9DckxvY1NjT29iRGF0YSguLi4pKSAqLwotI2RlZmluZSBCVE1fTEVfU0NfTE9DX09PQl9FVlQgU01QX1NDX0xPQ19PT0JfREFUQV9VUF9FVlQKLS8qIFNNUCBjb21wbGV0ZSBldmVudCAqLwotI2RlZmluZSBCVE1fTEVfQ09NUExUX0VWVCBTTVBfQ09NUExUX0VWVAotI2RlZmluZSBCVE1fTEVfTEFTVF9GUk9NX1NNUCBTTVBfQlJfS0VZU19SRVFfRVZUCi0vKiBLRVkgdXBkYXRlIGV2ZW50ICovCi0jZGVmaW5lIEJUTV9MRV9LRVlfRVZUIChCVE1fTEVfTEFTVF9GUk9NX1NNUCArIDEpCi0jZGVmaW5lIEJUTV9MRV9DT05TRU5UX1JFUV9FVlQgU01QX0NPTlNFTlRfUkVRX0VWVAotdHlwZWRlZiB1aW50OF90IHRCVE1fTEVfRVZUOwotCi1lbnVtIDogdWludDhfdCB7Ci0gIEJUTV9MRV9LRVlfTk9ORSA9IDAsCi0gIEJUTV9MRV9LRVlfUEVOQyA9IFNNUF9TRUNfS0VZX1RZUEVfRU5DLAotICAvKiBpZGVudGl0eSBrZXkgb2YgdGhlIHBlZXIgZGV2aWNlICovCi0gIEJUTV9MRV9LRVlfUElEID0gU01QX1NFQ19LRVlfVFlQRV9JRCwKLSAgLyogcGVlciBTUksgKi8KLSAgQlRNX0xFX0tFWV9QQ1NSSyA9IFNNUF9TRUNfS0VZX1RZUEVfQ1NSSywKLSAgQlRNX0xFX0tFWV9QTEsgPSBTTVBfU0VDX0tFWV9UWVBFX0xLLAotICBCVE1fTEVfS0VZX0xMSyA9IChTTVBfU0VDX0tFWV9UWVBFX0xLIDw8IDQpLAotICAvKiBtYXN0ZXIgcm9sZSBzZWN1cml0eSBpbmZvcm1hdGlvbjpkaXYgKi8KLSAgQlRNX0xFX0tFWV9MRU5DID0gKFNNUF9TRUNfS0VZX1RZUEVfRU5DIDw8IDQpLAotICAvKiBtYXN0ZXIgZGV2aWNlIElEIGtleSAqLwotICBCVE1fTEVfS0VZX0xJRCA9IChTTVBfU0VDX0tFWV9UWVBFX0lEIDw8IDQpLAotICAvKiBsb2NhbCBDU1JLIGhhcyBiZWVuIGRlbGl2ZXIgdG8gcGVlciAqLwotICBCVE1fTEVfS0VZX0xDU1JLID0gKFNNUF9TRUNfS0VZX1RZUEVfQ1NSSyA8PCA0KSwKLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUTV9MRV9LRVlfVFlQRTsKLQotI2RlZmluZSBCVE1fTEVfQVVUSF9SRVFfTk9fQk9ORCBTTVBfQVVUSF9OT19CT05EIC8qIDAgKi8KLSNkZWZpbmUgQlRNX0xFX0FVVEhfUkVRX0JPTkQgU01QX0FVVEhfQk9ORCAgICAgICAvKiAxIDw8IDAgKi8KLSNkZWZpbmUgQlRNX0xFX0FVVEhfUkVRX01JVE0gU01QX0FVVEhfWU5fQklUICAgICAvKiAxIDw8IDIgKi8KLXR5cGVkZWYgdWludDhfdCB0QlRNX0xFX0FVVEhfUkVROwotI2RlZmluZSBCVE1fTEVfU0NfU1VQUE9SVF9CSVQgU01QX1NDX1NVUFBPUlRfQklUIC8qICgxIDw8IDMpICovCi0jZGVmaW5lIEJUTV9MRV9LUF9TVVBQT1JUX0JJVCBTTVBfS1BfU1VQUE9SVF9CSVQgLyogKDEgPDwgNCkgKi8KLSNkZWZpbmUgQlRNX0xFX0g3X1NVUFBPUlRfQklUIFNNUF9IN19TVVBQT1JUX0JJVCAvKiAoMSA8PCA1KSAqLwotCi0jZGVmaW5lIEJUTV9MRV9BVVRIX1JFUV9TQ19PTkxZIFNNUF9BVVRIX1NDX0VOQ19PTkxZICAgICAvKiAwMDEwMTAwMCAqLwotI2RlZmluZSBCVE1fTEVfQVVUSF9SRVFfU0NfQk9ORCBTTVBfQVVUSF9TQ19HQiAgICAgICAgICAgLyogMDAxMDEwMDEgKi8KLSNkZWZpbmUgQlRNX0xFX0FVVEhfUkVRX1NDX01JVE0gU01QX0FVVEhfU0NfTUlUTV9OQiAgICAgIC8qIDAwMTAxMTAwICovCi0jZGVmaW5lIEJUTV9MRV9BVVRIX1JFUV9TQ19NSVRNX0JPTkQgU01QX0FVVEhfU0NfTUlUTV9HQiAvKiAwMDEwMTEwMSAqLwotI2RlZmluZSBCVE1fTEVfQVVUSF9SRVFfTUFTSyBTTVBfQVVUSF9NQVNLICAgICAgICAgICAgICAgLyogMHgzRCAqLwotCi0vKiBMRSBzZWN1cml0eSBsZXZlbCAqLwotI2RlZmluZSBCVE1fTEVfU0VDX05PTkUgU01QX1NFQ19OT05FCi0jZGVmaW5lIEJUTV9MRV9TRUNfVU5BVVRIRU5USUNBVEUgU01QX1NFQ19VTkFVVEhFTlRJQ0FURSAvKiAxICovCi0jZGVmaW5lIEJUTV9MRV9TRUNfQVVUSEVOVElDQVRFRCBTTVBfU0VDX0FVVEhFTlRJQ0FURUQgICAvKiA0ICovCi10eXBlZGVmIHVpbnQ4X3QgdEJUTV9MRV9TRUM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogbG9jYWwgSU8gY2FwYWJpbGl0aWVzICovCi0gIHRCVE1fSU9fQ0FQIGlvX2NhcDsKLSAgLyogT09CIGRhdGEgcHJlc2VudCAobG9jYWxseSkgZm9yIHRoZSBwZWVyIGRldmljZSAqLwotICB1aW50OF90IG9vYl9kYXRhOwotICAvKiBBdXRoZW50aWNhdGlvbiByZXF1ZXN0IChmb3IgbG9jYWwgZGV2aWNlKSBjb250YWluaW5nIGJvbmRpbmcgYW5kIE1JVE0KLSAgICogaW5mbyAqLwotICB0QlRNX0xFX0FVVEhfUkVRIGF1dGhfcmVxOwotICB1aW50OF90IG1heF9rZXlfc2l6ZTsgICAgICAgLyogbWF4IGVuY3J5cHRpb24ga2V5IHNpemUgKi8KLSAgdEJUTV9MRV9LRVlfVFlQRSBpbml0X2tleXM7IC8qIGtleXMgdG8gYmUgZGlzdHJpYnV0ZWQsIGJpdCBtYXNrICovCi0gIHRCVE1fTEVfS0VZX1RZUEUgcmVzcF9rZXlzOyAvKiBrZXlzIHRvIGJlIGRpc3RyaWJ1dGVkLCBiaXQgbWFzayAqLwotfSB0QlRNX0xFX0lPX1JFUTsKLQotLyogZGF0YSB0eXBlIGZvciB0QlRNX0xFX0NPTVBMVCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHJlYXNvbjsKLSAgdWludDhfdCBzZWNfbGV2ZWw7Ci0gIGJvb2wgaXNfcGFpcl9jYW5jZWw7Ci0gIGJvb2wgc21wX292ZXJfYnI7Ci19IHRCVE1fTEVfQ09NUExUOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQT1dFUiBNQU5BR0VNRU5UCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUG93ZXIgTWFuYWdlciBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQlRNIFBvd2VyIG1hbmFnZXIgc3RhdHVzIGNvZGVzICovCi1lbnVtIDogdWludDhfdCB7Ci0gIEJUTV9QTV9TVFNfQUNUSVZFID0gSENJX01PREVfQUNUSVZFLCAgLy8gMHgwMAotICBCVE1fUE1fU1RTX0hPTEQgPSBIQ0lfTU9ERV9IT0xELCAgICAgIC8vIDB4MDEKLSAgQlRNX1BNX1NUU19TTklGRiA9IEhDSV9NT0RFX1NOSUZGLCAgICAvLyAweDAyCi0gIEJUTV9QTV9TVFNfUEFSSyA9IEhDSV9NT0RFX1BBUkssICAgICAgLy8gMHgwMwotICBCVE1fUE1fU1RTX1NTUiwgICAgIC8qIHJlcG9ydCB0aGUgU1NSIHBhcmFtZXRlcnMgaW4gSENJX1NOSUZGX1NVQl9SQVRFX0VWVCAqLwotICBCVE1fUE1fU1RTX1BFTkRJTkcsIC8qIHdoZW4gd2FpdGluZyBmb3Igc3RhdHVzIGZyb20gY29udHJvbGxlciAqLwotICBCVE1fUE1fU1RTX0VSUk9SICAgIC8qIHdoZW4gSENJIGNvbW1hbmQgc3RhdHVzIHJldHVybnMgZXJyb3IgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEJUTV9QTV9TVEFUVVM7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBwb3dlcl9tb2RlX3N0YXR1c190ZXh0KHRCVE1fUE1fU1RBVFVTIHN0YXR1cykgewotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2UgQlRNX1BNX1NUU19BQ1RJVkU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImFjdGl2ZSIpOwotICAgIGNhc2UgQlRNX1BNX1NUU19IT0xEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJob2xkIik7Ci0gICAgY2FzZSBCVE1fUE1fU1RTX1NOSUZGOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJzbmlmZiIpOwotICAgIGNhc2UgQlRNX1BNX1NUU19QQVJLOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJwYXJrIik7Ci0gICAgY2FzZSBCVE1fUE1fU1RTX1NTUjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygic25pZmZfc3VicmF0aW5nIik7Ci0gICAgY2FzZSBCVE1fUE1fU1RTX1BFTkRJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInBlbmRpbmciKTsKLSAgICBjYXNlIEJUTV9QTV9TVFNfRVJST1I6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImVycm9yIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTiIpOwotICB9Ci19Ci0KLS8qIEJUTSBQb3dlciBtYW5hZ2VyIG1vZGVzICovCi1lbnVtIDogdWludDhfdCB7Ci0gIEJUTV9QTV9NRF9BQ1RJVkUgPSBIQ0lfTU9ERV9BQ1RJVkUsICAvLyAweDAwCi0gIEJUTV9QTV9NRF9IT0xEID0gSENJX01PREVfSE9MRCwgICAgICAvLyAweDAxCi0gIEJUTV9QTV9NRF9TTklGRiA9IEhDSV9NT0RFX1NOSUZGLCAgICAvLyAweDAyCi0gIEJUTV9QTV9NRF9QQVJLID0gSENJX01PREVfUEFSSywgICAgICAvLyAweDAzCi0gIEJUTV9QTV9NRF9GT1JDRSA9IDB4MTAsIC8qIE9SIHRoaXMgdG8gZm9yY2UgQUNMIGxpbmsgdG8gYSBjZXJ0YWluIG1vZGUgKi8KLSAgQlRNX1BNX01EX1VOS05PV04gPSAweEVGLAotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRNX1BNX01PREU7Ci0jZGVmaW5lIEhDSV9UT19CVE1fUE9XRVJfTU9ERShtb2RlKSAoc3RhdGljX2Nhc3Q8dEJUTV9QTV9NT0RFPihtb2RlKSkKLQotaW5saW5lIGJvb2wgaXNfbGVnYWxfcG93ZXJfbW9kZSh0QlRNX1BNX01PREUgbW9kZSkgewotICBzd2l0Y2ggKG1vZGUgJiB+QlRNX1BNX01EX0ZPUkNFKSB7Ci0gICAgY2FzZSBCVE1fUE1fTURfQUNUSVZFOgotICAgIGNhc2UgQlRNX1BNX01EX0hPTEQ6Ci0gICAgY2FzZSBCVE1fUE1fTURfU05JRkY6Ci0gICAgY2FzZSBCVE1fUE1fTURfUEFSSzoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIHBvd2VyX21vZGVfdGV4dCh0QlRNX1BNX01PREUgbW9kZSkgewotICBzdGQ6OnN0cmluZyBzID0gYmFzZTo6U3RyaW5nUHJpbnRmKChtb2RlICYgQlRNX1BNX01EX0ZPUkNFKSA/ICIiIDogImZvcmNlZDoiKTsKLSAgc3dpdGNoIChtb2RlICYgfkJUTV9QTV9NRF9GT1JDRSkgewotICAgIGNhc2UgQlRNX1BNX01EX0FDVElWRToKLSAgICAgIHJldHVybiBzICsgc3RkOjpzdHJpbmcoImFjdGl2ZSIpOwotICAgIGNhc2UgQlRNX1BNX01EX0hPTEQ6Ci0gICAgICByZXR1cm4gcyArIHN0ZDo6c3RyaW5nKCJob2xkIik7Ci0gICAgY2FzZSBCVE1fUE1fTURfU05JRkY6Ci0gICAgICByZXR1cm4gcyArIHN0ZDo6c3RyaW5nKCJzbmlmZiIpOwotICAgIGNhc2UgQlRNX1BNX01EX1BBUks6Ci0gICAgICByZXR1cm4gcyArIHN0ZDo6c3RyaW5nKCJwYXJrIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzICsgc3RkOjpzdHJpbmcoIlVOS05PV04iKTsKLSAgfQotfQotCi0jZGVmaW5lIEJUTV9QTV9TRVRfT05MWV9JRCAweDgwCi0KLS8qIE9wZXJhdGlvbiBjb2RlcyAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIC8qIFRoZSBtb2R1bGUgd2FudHMgdG8gc2V0IHRoZSBkZXNpcmVkIHBvd2VyIG1vZGUgKi8KLSAgQlRNX1BNX1JFR19TRVQgPSAoMXUgPDwgMCksCi0gIC8qIFRoZSBtb2R1bGUgZG9lcyBub3Qgd2FudCB0byBpbnZvbHZlIHdpdGggUE0gYW55bW9yZSAqLwotICBCVE1fUE1fREVSRUcgPSAoMXUgPDwgMiksCi19IHRCVE1fUE1fUkVHSVNURVI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQb3dlciBNYW5hZ2VyIFR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBtYXggPSAwOwotICB1aW50MTZfdCBtaW4gPSAwOwotICB1aW50MTZfdCBhdHRlbXB0ID0gMDsKLSAgdWludDE2X3QgdGltZW91dCA9IDA7Ci0gIHRCVE1fUE1fTU9ERSBtb2RlID0gQlRNX1BNX01EX0FDVElWRTsgIC8vIDAKLX0gdEJUTV9QTV9QV1JfTUQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUG93ZXIgTWFuYWdlciBDYWxsYmFjayBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiB2b2lkKHRCVE1fUE1fU1RBVFVTX0NCQUNLKShjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9QTV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgaGNpX3N0YXR1cyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdG9yZWQgTGlua2tleSBUeXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQlRNX0NCX0VWVF9ERUxFVEVfU1RPUkVEX0xJTktfS0VZUyA0Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBldmVudDsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQxNl90IG51bV9rZXlzOwotCi19IHRCVE1fREVMRVRFX1NUT1JFRF9MSU5LX0tFWV9DT01QTEVURTsKLQotI2RlZmluZSBCVE1fQ09OVFJMX1VOS05PV04gMAotLyogQUNMIGxpbmsgb24sIFNDTyBsaW5rIG9uZ29pbmcsIHNuaWZmIG1vZGUgKi8KLSNkZWZpbmUgQlRNX0NPTlRSTF9BQ1RJVkUgMQotLyogU2NhbiBzdGF0ZSAtIHBhZ2luZy9pbnF1aXJ5L3RyeWluZyB0byBjb25uZWN0Ki8KLSNkZWZpbmUgQlRNX0NPTlRSTF9TQ0FOIDIKLS8qIElkbGUgc3RhdGUgLSBwYWdlIHNjYW4sIExFIGFkdnQsIGlucXVpcnkgc2NhbiAqLwotI2RlZmluZSBCVE1fQ09OVFJMX0lETEUgMwotCi10eXBlZGVmIHVpbnQ4X3QgdEJUTV9DT05UUkxfU1RBVEU7Ci0KLS8vIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCAtIFJlcG9ydCByZWNlaXZlcgotdHlwZWRlZiB2b2lkKHRCVE1fQlRfUVVBTElUWV9SRVBPUlRfUkVDRUlWRVIpKHVpbnQ4X3QgbGVuLCB1aW50OF90KiBwX3N0cmVhbSk7Ci0KLXN0cnVjdCB0UkVNT1RFX1ZFUlNJT05fSU5GTyB7Ci0gIHVpbnQ4X3QgbG1wX3ZlcnNpb257MH07Ci0gIHVpbnQxNl90IGxtcF9zdWJ2ZXJzaW9uezB9OwotICB1aW50MTZfdCBtYW51ZmFjdHVyZXJ7MH07Ci0gIGJvb2wgdmFsaWR7ZmFsc2V9OwotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gKHZhbGlkKSA/IGJhc2U6OlN0cmluZ1ByaW50ZigiJTAyaGh1LSUwNWh1LSUwNWh1IiwgbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1wX3N1YnZlcnNpb24sIG1hbnVmYWN0dXJlcikKLSAgICAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCJVTktOT1dOIik7Ci0gIH0KLX07Ci11c2luZyByZW1vdGVfdmVyc2lvbl9pbmZvID0gdFJFTU9URV9WRVJTSU9OX0lORk87Ci0KLSNlbmRpZiAgLy8gQlRNX0FQSV9UWVBFU19ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2J0bV9ibGVfYXBpLmggYi9zdGFjay9pbmNsdWRlL2J0bV9ibGVfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTFmODQuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCbHVldG9vdGggTWFuYWdlciAoQlRNKSBBUEkgZnVuY3Rpb24gZXh0ZXJuYWwKLSAqICBkZWZpbml0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVE1fQkxFX0FQSV9ICi0jZGVmaW5lIEJUTV9CTEVfQVBJX0gKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2NvbW1vbl90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2JsZV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9uZWlnaGJvcl9pbnF1aXJ5LmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBidG1fYmxlX2luaXQoKTsKLXZvaWQgYnRtX2JsZV9mcmVlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEVYVEVSTkFMIEZVTkNUSU9OIERFQ0xBUkFUSU9OUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY0FkZEJsZURldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQWRkL21vZGlmeSBkZXZpY2UuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgbm9ybWFsbHkgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIGR1cmluZyBob3N0IHN0YXJ0dXAgdG8gcmVzdG9yZSBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICAgICAgZm9yIGEgTEUgZGV2aWNlIHN0b3JlZCBpbiB0aGUgTlZSQU0uCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgICAgIC0gQkQgYWRkcmVzcyBvZiB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBkZXZfdHlwZSAgICAgICAgIC0gUmVtb3RlIGRldmljZSdzIGRldmljZSB0eXBlLgotICogICAgICAgICAgICAgICAgICBhZGRyX3R5cGUgICAgICAgIC0gTEUgZGV2aWNlIGFkZHJlc3MgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX1NlY0FkZEJsZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2VjQWRkQmxlS2V5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQvbW9kaWZ5IExFIGRldmljZSBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZQotICogICAgICAgICAgICAgICAgICBub3JtYWxseSBjYWxsZWQgZHVyaW5nIGhvc3Qgc3RhcnR1cCB0byByZXN0b3JlIGFsbCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIE5WUkFNLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgcF9sZV9rZXkgICAgICAgICAtIExFIGtleSB2YWx1ZXMuCi0gKiAgICAgICAgICAgICAgICAgIGtleV90eXBlICAgICAgICAgLSBMRSBTTVAga2V5IHR5cGUuCi0qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX1NlY0FkZEJsZUtleShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpOwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCBzY2FuIHBhcmFtZXRlcnMuIHxjYnwgaXMgY2FsbGVkIHdpdGggb3BlcmF0aW9uCi0gKiBzdGF0dXMKLSAqKi8KLWV4dGVybiB2b2lkIEJUTV9CbGVTZXRTY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9TQ0FOX01PREUgc2Nhbl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90KT4gY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUdldFZlbmRvckNhcGFiaWxpdGllcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBsb2NhbCBMRSBmZWF0dXJlcwotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9jbW5fdnNjX2NiIDogTG9jYWxhIExFIGNhcGFiaWxpdHkgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUTV9CbGVHZXRWZW5kb3JDYXBhYmlsaXRpZXModEJUTV9CTEVfVlNDX0NCKiBwX2Ntbl92c2NfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUdldER5bmFtaWNBdWRpb0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBkeW5hbWljIGF1ZGlvIGJ1ZmZlcgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgcF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9jYiA6IER5bmFtaWMgQXVkaW8gQnVmZmVyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlR2V0RHluYW1pY0F1ZGlvQnVmZmVyKAotICAgIHRCVE1fQlRfRFlOQU1JQ19BVURJT19CVUZGRVJfQ0IqIHBfZHluYW1pY19hdWRpb19idWZmZXJfY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVNldFN0b3JhZ2VDb25maWcKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldHVwIHN0b3JhZ2UgY29uZmlndXJhdGlvbiBhbmQKLSAqICAgICAgICAgICAgICAgICAgc2V0dXAgY2FsbGJhY2tzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgdWludDhfdCBiYXRjaF9zY2FuX2Z1bGxfbWF4IC1CYXRjaCBzY2FuIGZ1bGwgbWF4aW11bQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJhdGNoX3NjYW5fdHJ1bmNfbWF4IC0gQmF0Y2ggc2NhbiB0cnVuY2F0ZWQgdmFsdWUKLSBtYXhpbXVtCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkIC0gVGhyZXNob2xkIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGNiIC0gU2V0dXAgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0NBTl9USFJFU0hPTERfQ0JBQ0sgKnBfdGhyZXNfY2JhY2sgLVRocmVzaG9sZAotIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKnBfcmVmIC0gUmVmZXJlbmNlIHZhbHVlCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlU2V0U3RvcmFnZUNvbmZpZygKLSAgICB1aW50OF90IGJhdGNoX3NjYW5fZnVsbF9tYXgsIHVpbnQ4X3QgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCi0gICAgdWludDhfdCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQsCi0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLyk+IGNiLAotICAgIHRCVE1fQkxFX1NDQU5fVEhSRVNIT0xEX0NCQUNLKiBwX3RocmVzX2NiYWNrLCB0QlRNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5hYmxlIGJhdGNoIHNjYW4gKi8KLWV4dGVybiB2b2lkIEJUTV9CbGVFbmFibGVCYXRjaFNjYW4oCi0gICAgdEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFIHNjYW5fbW9kZSwgdWludDMyX3Qgc2Nhbl9pbnRlcnZhbCwKLSAgICB1aW50MzJfdCBzY2FuX3dpbmRvdywgdEJUTV9CTEVfRElTQ0FSRF9SVUxFIGRpc2NhcmRfcnVsZSwKLSAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYik7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRpc2FibGUgYmF0Y2ggc2Nhbm5pbmcgKi8KLWV4dGVybiB2b2lkIEJUTV9CbGVEaXNhYmxlQmF0Y2hTY2FuKAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzdGF0dXMgKi8pPiBjYik7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYmF0Y2ggc2NhbiByZXBvcnRzICovCi1leHRlcm4gdm9pZCBCVE1fQmxlUmVhZFNjYW5SZXBvcnRzKHRCTEVfU0NBTl9NT0RFIHNjYW5fbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0NBTl9SRVBfQ0JBQ0sgY2IpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXR1cCB0aGUgY2FsbGJhY2sgZm9yIHRyYWNraW5nICovCi1leHRlcm4gdm9pZCBCVE1fQmxlVHJhY2tBZHZlcnRpc2VyKHRCVE1fQkxFX1RSQUNLX0FEVl9DQkFDSyogcF90cmFja19jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlT2JzZXJ2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBwcm9jZWR1cmUga2VlcCB0aGUgZGV2aWNlIGxpc3RlbmluZyBmb3IgYWR2ZXJ0aXNpbmcKLSAqICAgICAgICAgICAgICAgICAgZXZlbnRzIGZyb20gYSBicm9hZGNhc3QgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgc3RhcnQ6IHN0YXJ0IG9yIHN0b3Agb2JzZXJ2ZS4KLSAqICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGhvdyBsb25nIHRoZSBzY2FuIHNob3VsZCBsYXN0LCBpbiBzZWNvbmRzLiAwIG1lYW5zCi0gKiAgICAgICAgICAgICAgICAgIHNjYW4gd2l0aG91dCB0aW1lb3V0LiBTdGFydGluZyB0aGUgc2NhbiBzZWNvbmQgdGltZSB3aXRob3V0Ci0gKiAgICAgICAgICAgICAgICAgIHRpbWVvdXQgd2lsbCBkaXNhYmxlIHRoZSB0aW1lci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRCVE1fU1RBVFVTIEJUTV9CbGVPYnNlcnZlKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9JTlFfUkVTVUxUU19DQiogcF9yZXN1bHRzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVPcHBvcnR1bmlzdGljT2JzZXJ2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVnaXN0ZXIvdW5yZWdpc3RlciBvcHBvcnR1bmlzdGljIHNjYW4gY2FsbGJhY2suIFRoaXMgbWV0aG9kCi0gKiAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHRyaWdnZXIgc2NhbiBzdGFydC9zdG9wLCBidXQgaWYgc2NhbiBpcyBldmVyIHN0YXJ0ZWQsCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgY2FsbGJhY2sgd291bGQgZ2V0IGNhbGxlZCB3aXRoIHNjYW4gcmVzdWx0cy4gQWRkaXRpb25hbGx5LAotICogICAgICAgICAgICAgICAgICB0aGlzIGNhbGxiYWNrIGlzIG5vdCByZXNldCBvbiBlYWNoIHNjYW4gc3RhcnQvc3RvcC4gSXQncwotICogICAgICAgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IExFIEF1ZGlvIHJlbGF0ZWQgcHJvZmlsZXMsIHRoYXQgd291bGQKLSAqICAgICAgICAgICAgICAgICAgZmluZCB5ZXQgdW5wYWlyZWQgbWVtYmVycyBvZiBDU0lTIHNldCwgb3IgYnJvYWRjYXN0cy4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGVuYWJsZTogZW5hYmxlL2Rpc2FibGUgb2JzZXJ2aW5nLgotICogICAgICAgICAgICAgICAgICBwX3Jlc3VsdHNfY2I6IGNhbGxiYWNrIGZvciByZXN1bHRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlT3Bwb3J0dW5pc3RpY09ic2VydmUoYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9JTlFfUkVTVUxUU19DQiogcF9yZXN1bHRzX2NiKTsKLQotLyoqIFJldHVybnMgbG9jYWwgZGV2aWNlIGVuY3J5cHRpb24gcm9vdCAoRVIpICovCi1jb25zdCBPY3RldDE2JiBCVE1fR2V0RGV2aWNlRW5jUm9vdCgpOwotCi0vKiogUmV0dXJucyBsb2NhbCBkZXZpY2UgaWRlbnRpdHkgcm9vdCAoSVIpICovCi1leHRlcm4gY29uc3QgT2N0ZXQxNiYgQlRNX0dldERldmljZUlEUm9vdCgpOwotCi0vKiogUmV0dXJuIGxvY2FsIGRldmljZSBESEsuICovCi1leHRlcm4gY29uc3QgT2N0ZXQxNiYgQlRNX0dldERldmljZURISygpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1NlY3VyaXR5R3JhbnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdyYW50IHNlY3VyaXR5IHByb2Nlc3MuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBiZF9hZGRyIC0gcGVlciBkZXZpY2UgYmQgYWRkcmVzcy4KLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3MuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIEJUTV9SRVBFQVRFRF9BVFRFTVBUUyBpcyB0b28gbWFueQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUTV9TZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVQYXNza2V5UmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIFNlY3VyaXR5IE1hbmFnZXIgc3VibWl0dGVkCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NrZXkgcmVxdWVzdCB0byB0aGUgYXBwbGljYXRpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyIC0gQWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciB3aGljaCBwYXNza2V5IHdhcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkCi0gKiAgICAgICAgICAgICAgICAgIHJlcyAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NrZXkgLSBudW1lcmljIHZhbHVlIGluIHRoZSByYW5nZSBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX01JTl9QQVNTS0VZX1ZBTCgwKSAtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fTUFYX1BBU1NLRVlfVkFMKDk5OTk5OSgweEY0MjNGKSkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUTV9CbGVQYXNza2V5UmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUNvbmZpcm1SZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgU2VjdXJpdHkgTWFuYWdlciBzdWJtaXR0ZWQKLSAqICAgICAgICAgICAgICAgICAgbnVtZXJpYyBjb21wYXJpc29uIHJlcXVlc3QgdG8gdGhlIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgIC0gQWRkcmVzcyBvZiB0aGUgZGV2aWNlIHdpdGggd2hpY2ggbnVtZXJpYwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uIHdhcyByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgIC0gY29tcGFyaXNvbiByZXN1bHQgQlRNX1NVQ0NFU1MgaWYgc3VjY2VzcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlQ29uZmlybVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9MZU9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBCVE1fTEVfT09CX1JFUV9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAgICAgIC0gc2ltcGxlIHBhaXJpbmcgUmFuZG9taXplciAgQy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX0JsZU9vYkRhdGFSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZW4sIHVpbnQ4X3QqIHBfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBCVE1fTEVfT09CX1JFUV9FVlQgd2hlbiBzZWN1cmUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBkYXRhIGlzIGF2YWlsYWJsZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgLSBBZGRyZXNzIG9mIHRoZSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBwX2MgICAgICAgICAtIHBvaW50ZXIgdG8gQ29uZmlybWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfciAgICAgICAgIC0gcG9pbnRlciB0byBSYW5kb21pemVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jLCB1aW50OF90KiBwX3IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZURhdGFTaWduYXR1cmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNpZ24gdGhlIGRhdGEgdXNpbmcgQUVTMTI4IENNQUMKLSAqICAgICAgICAgICAgICAgICAgYWxnb3JpdGguCi0gKgotICogUGFyYW1ldGVyICAgICAgICBiZF9hZGRyOiB0YXJnZXQgZGV2aWNlIHRoZSBkYXRhIHRvIGJlIHNpZ25lZCBmb3IuCi0gKiAgICAgICAgICAgICAgICAgIHBfdGV4dDogc2luZ2luZyBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIGxlbjogbGVuZ3RoIG9mIHRoZSBzaWduaW5nIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOiBvdXRwdXQgcGFyYW1ldGVyIHdoZXJlIGRhdGEgc2lnbmF0dXJlIGlzIGdvaW5nIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzaWduaW5nIHN1Y2Vzc3VsLCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEJUTV9CbGVEYXRhU2lnbmF0dXJlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QqIHBfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgQkxFX1NJR05BVFVSRSBzaWduYXR1cmUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVZlcmlmeVNpZ25hdHVyZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IHRoZSBkYXRhIHNpZ25hdHVyZQotICoKLSAqIFBhcmFtZXRlciAgICAgICAgYmRfYWRkcjogdGFyZ2V0IGRldmljZSB0aGUgZGF0YSB0byBiZSBzaWduZWQgZm9yLgotICogICAgICAgICAgICAgICAgICBwX29yaWc6ICBvcmlnaW5hbCBkYXRhIGJlZm9yZSBzaWduYXR1cmUuCi0gKiAgICAgICAgICAgICAgICAgIGxlbjogbGVuZ3RoIG9mIHRoZSBzaWduaW5nIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlciB1c2VkIHdoZW4gZG9pbmcgZGF0YSBzaWduaW5nCi0gKiAgICAgICAgICAgICAgICAgIHBfY29tcDogc2lnbmF0dXJlIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QuCi0KLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzaWduYXR1cmUgdmVyaWZpZWQgY29ycmVjdGx5OyBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEJUTV9CbGVWZXJpZnlTaWduYXR1cmUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCogcF9vcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQzMl90IGNvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfY29tcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fSXNCbGVDb25uZWN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBpZiB0aGUgY29ubmVjdGlvbiBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgZm9yIGFuIExFIGxpbmsKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgY29ubmVjdGlvbiBpcyBMRSBsaW5rLCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEJUTV9Jc0JsZUNvbm5lY3Rpb24odWludDE2X3QgY29ubl9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgcmVtb3RlIGRldmljZSBhZGRyZXNzIGN1cnJlbnRseSB1c2VkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlTG9hZExvY2FsS2V5cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9jYWwgbG9jYWwgaWRlbnRpdHkga2V5LCBlbmNyeXB0aW9uIHJvb3Qgb3Igc2lnbiBjb3VudGVyLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAga2V5X3R5cGU6IHR5cGUgb2Yga2V5LCBjYW4gYmUgQlRNX0JMRV9LRVlfVFlQRV9JRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfS0VZX1RZUEVfRVIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEJUTV9CTEVfS0VZX1RZUEVfQ09VTlRFUi4KLSAqICAgICAgICAgICAgICAgICAgcF9rZXk6IHBvaW50ZXIgdG8gdGhlIGtleS4KLSoKLSAqIFJldHVybnMgICAgICAgICAgbm9uMi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX0JsZUxvYWRMb2NhbEtleXModWludDhfdCBrZXlfdHlwZSwgdEJUTV9CTEVfTE9DQUxfS0VZUyogcF9rZXkpOwotCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfYmdjb25uLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVNldFByZWZDb25uUGFyYW1zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgYSBwZXJpcGhlcmFsJ3MgcHJlZmVycmVkIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4gV2hlbgotICogICAgICAgICAgICAgICAgICBhbnkgb2YgdGhlIHZhbHVlIGRvZXMgbm90IHdhbnQgdG8gYmUgdXBkYXRlZCB3aGlsZSBvdGhlcnMKLSAqICAgICAgICAgICAgICAgICAgZG8sIHVzZSBCVE1fQkxFX0NPTk5fUEFSQU1fVU5ERUYgZm9yIHRoZSBvbmVzIHdhbnQgdG8KLSAqICAgICAgICAgICAgICAgICAgbGVhdmUgdW50b3VjaGVkLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgYmRfYWRkciAgICAgICAgICAtIEJEIGFkZHJlc3Mgb2YgdGhlIHBlcmlwaGVyYWwKLSAqICAgICAgICAgICAgICAgICAgbWluX2Nvbm5faW50ICAgICAtIG1pbmltdW0gcHJlZmVycmVkIGNvbm5lY3Rpb24gaW50ZXJ2YWwKLSAqICAgICAgICAgICAgICAgICAgbWF4X2Nvbm5faW50ICAgICAtIG1heGltdW0gcHJlZmVycmVkIGNvbm5lY3Rpb24gaW50ZXJ2YWwKLSAqICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbF9sYXRlbmN5ICAgIC0gcHJlZmVycmVkIHBlcmlwaGVyYWwgbGF0ZW5jeQotICogICAgICAgICAgICAgICAgICBzdXBlcnZpc2lvbl90b3V0IC0gcHJlZmVycmVkIHN1cGVydmlzaW9uIHRpbWVvdXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX0JsZVNldFByZWZDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVSZWFkQ29udHJvbGxlckZlYXR1cmVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWFkcyBCTEUgc3BlY2lmaWMgY29udHJvbGxlciBmZWF0dXJlcwotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgdEJUTV9CTEVfQ1RSTF9GRUFUVVJFU19DQkFDSyA6IENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzIGFyZSByZWFkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEJUTV9CbGVSZWFkQ29udHJvbGxlckZlYXR1cmVzKAotICAgIHRCVE1fQkxFX0NUUkxfRkVBVFVSRVNfQ0JBQ0sqIHBfdnNjX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9fQkxFUmVhZERpc2NvdmVyYWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgY3VycmVudCBMRQotICogICAgICAgICAgICAgICAgICBkaXNjb3ZlcmFiaWxpdHkgbW9kZSBvZiB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0JMRV9OT05fRElTQ09WRVJBQkxFICxCVE1fQkxFX0xJTUlURURfRElTQ09WRVJBQkxFIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgIEJUTV9CTEVfR0VOUkFMX0RJU0NPVkVSQUJMRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBCVE1fQmxlUmVhZERpc2NvdmVyYWJpbGl0eSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX19CTEVSZWFkQ29ubmVjdGFiaWxpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgdGhlIGN1cnJlbnQgTEUKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGliaWxpdHkgbW9kZSBvZiB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX0JMRV9OT05fQ09OTkVDVEFCTEUgb3IgQlRNX0JMRV9DT05ORUNUQUJMRQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgQlRNX0JsZVJlYWRDb25uZWN0YWJpbGl0eSgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1JlYWREZXZJbmZvCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSBkZXZpY2UvYWRkcmVzcyB0eXBlCi0gKiAgICAgICAgICAgICAgICAgIG9mIEJEIGFkZHJlc3MuCi0gKgotICogUGFyYW1ldGVyICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgcF9kZXZfdHlwZTogb3V0cHV0IHBhcmFtZXRlciB0byByZWFkIHRoZSBkZXZpY2UgdHlwZS4KLSAqICAgICAgICAgICAgICAgICAgcF9hZGRyX3R5cGU6IG91dHB1dCBwYXJhbWV0ZXIgdG8gcmVhZCB0aGUgYWRkcmVzcyB0eXBlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fUmVhZERldkluZm8oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUqIHBfZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9SZWFkQ29ubmVjdGVkVHJhbnNwb3J0QWRkcmVzcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgcGFpcmVkIGRldmljZS9hZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3RoZXIgZGV2aWNlIHBhaXJlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBCRF9hZGRyZXNzCi0gKgotICogUGFyYW1ldGVyICAgICAgICByZW1vdGVfYmRhOiByZW1vdGUgZGV2aWNlIGFkZHJlc3MsIGNhcnJ5IG91dCB0aGUgdHJhbnNwb3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0OiBhY3RpdmUgdHJhbnNwb3J0Ci0gKgotICogUmV0dXJuICAgICAgICAgICB0cnVlIGlmIGFuIGFjdGl2ZSBsaW5rIGlzIGlkZW50aWZpZWQ7IGZhbHNlIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBCVE1fUmVhZENvbm5lY3RlZFRyYW5zcG9ydEFkZHJlc3MoUmF3QWRkcmVzcyogcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlQ29uZmlnUHJpdmFjeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHByaXZhY3kgaW4KLSAqICAgICAgICAgICAgICAgICAgdGhlIGxvY2FsIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGVuYWJsZTogdHJ1ZSB0byBlbmFibGUgaXQ7IGZhbHNlIHRvIGRpc2FibGUgaXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICAgIHByaXZhY3kgbW9kZSBzZXQgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhaWxlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgQlRNX0JsZUNvbmZpZ1ByaXZhY3koYm9vbCBlbmFibGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUxvY2FsUHJpdmFjeUVuYWJsZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgICAgQ2hlY2tzIGlmIGxvY2FsIGRldmljZSBzdXBwb3J0cyBwcml2YXRlIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybiB0cnVlIGlmIGxvY2FsIHByaXZhY3kgaXMgZW5hYmxlZCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEJUTV9CbGVMb2NhbFByaXZhY3lFbmFibGVkKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgIEJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG11bHRpIGFkdiBpbnN0YW5jZXMgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjb250cm9sbGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTWF4IG11bHRpIGFkdiBpbnN0YW5jZSBjb3VudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDhfdCBCVE1fQmxlTWF4TXVsdGlBZHZJbnN0YW5jZUNvdW50KCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlUmVjZWl2ZXJUZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdGFydCB0aGUgTEUgUmVjZWl2ZXIgdGVzdAotICoKLSAqIFBhcmFtZXRlciAgICAgICByeF9mcmVxIC0gRnJlcXVlbmN5IFJhbmdlCi0gKiAgICAgICAgICAgICAgIHBfY21kX2NtcGxfY2JhY2sgLSBDb21tYW5kIENvbXBsZXRlIGNhbGxiYWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlRNX0JsZVJlY2VpdmVyVGVzdCh1aW50OF90IHJ4X2ZyZXEsIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlVHJhbnNtaXR0ZXJUZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzdGFydCB0aGUgTEUgVHJhbnNtaXR0ZXIgdGVzdAotICoKLSAqIFBhcmFtZXRlciAgICAgICB0eF9mcmVxIC0gRnJlcXVlbmN5IFJhbmdlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9kYXRhX2xlbiAtIExlbmd0aCBpbiBieXRlcyBvZiBwYXlsb2FkIGRhdGEgaW4gZWFjaAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfcGF5bG9hZCAtIFBhdHRlcm4gdG8gdXNlIGluIHRoZSBwYXlsb2FkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgcF9jbWRfY21wbF9jYmFjayAtIENvbW1hbmQgQ29tcGxldGUgY2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlVHJhbnNtaXR0ZXJUZXN0KHVpbnQ4X3QgdHhfZnJlcSwgdWludDhfdCB0ZXN0X2RhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFja2V0X3BheWxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NtZF9jbXBsX2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVUZXN0RW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0b3AgdGhlIGluLXByb2dyZXNzIFRYIG9yIFJYIHRlc3QKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgcF9jbWRfY21wbF9jYmFjayAtIENvbW1hbmQgY29tcGxldGUgY2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCVE1fQmxlVGVzdEVuZCh0QlRNX0NNUExfQ0IqIHBfY21kX2NtcGxfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX1VzZUxlTGluawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2VsZWN0IHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGxpbmsgdG8gdXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSB0byB1c2UgTEUsIGZhbHNlIHVzZSBCUi9FRFIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEJUTV9Vc2VMZUxpbmsoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlQWR2RmlsdGVyUGFyYW1TZXR1cAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0dXAgdGhlIGFkdiBkYXRhIHBheWxvYWQgZmlsdGVyCi0gKiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX0JsZUFkdkZpbHRlclBhcmFtU2V0dXAoCi0gICAgdEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxidGdhdHRfZmlsdF9wYXJhbV9zZXR1cF90PiBwX2ZpbHRfcGFyYW1zLAotICAgIHRCVE1fQkxFX1BGX1BBUkFNX0NCIGNiKTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvIGNvbmZpZ3VyZSB0aGUgYWR2IGRhdGEgcGF5bG9hZCBmaWx0ZXIgY29uZGl0aW9uCi0gKi8KLWV4dGVybiB2b2lkIEJUTV9MRV9QRl9zZXQodEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBcGNmQ29tbWFuZD4gY29tbWFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYik7Ci1leHRlcm4gdm9pZCBCVE1fTEVfUEZfY2xlYXIodEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUENGIGZlYXR1cmUKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGVuYWJsZSAtIHRydWUgLSBlbmFibGVzIEFQQ0YsIGZhbHNlIC0gZGlzYWJsZXMgQVBDRgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUoCi0gICAgdWludDhfdCBlbmFibGUsIHRCVE1fQkxFX1BGX1NUQVRVU19DQkFDSyBwX3N0YXRfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZUdldEVuZXJneUluZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gb2J0YWlucyB0aGUgZW5lcmd5IGluZm8KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHBfZW5lcl9jYmFjayAtIENhbGxiYWNrIHBvaW50ZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHN0YXR1cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEJUTV9TVEFUVVMgQlRNX0JsZUdldEVuZXJneUluZm8oCi0gICAgdEJUTV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfZW5lcl9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBCVE1fU2V0QmxlRGF0YUxlbmd0aAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IHRoZSBtYXhpbXVtIEJMRSB0cmFuc21pc3Npb24gcGFja2V0IHNpemUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEJUTV9TVUNDRVNTIGlmIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0QlRNX1NUQVRVUyBCVE1fU2V0QmxlRGF0YUxlbmd0aChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR4X3BkdV9sZW5ndGgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgQlRNX0JsZVJlYWRQaHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRvIHJlYWQgdGhlIGN1cnJlbnQgUEhZcyBmb3Igc3BlY2lmaWVkIExFIGNvbm5lY3Rpb24KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVE1fU1VDQ0VTUyBpZiBzdWNjZXNzOyBvdGhlcndpc2UgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBCVE1fQmxlUmVhZFBoeSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+IGNiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUTV9CbGVTZXRQaHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRvIHNldCBQSFkgcHJlZmVyZW5jZXMgZm9yIHNwZWNpZmllZCBMRSBjb25uZWN0aW9uCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRNX1NVQ0NFU1MgaWYgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhaWxlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgQlRNX0JsZVNldFBoeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHR4X3BoeXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5cywgdWludDE2X3QgcGh5X29wdGlvbnMpOwotCi1leHRlcm4gdm9pZCBidG1fYmxlX211bHRpX2Fkdl9jbGVhbnVwKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYnRtX2JsZV9nZXRfYWNsX3JlbW90ZV9hZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBhY3RpdmUgcmVtb3RlIGFkZHJlc3MgdXNlZCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBzdWNjZXNzIHJldHVybiB0cnVlLCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgYnRtX2JsZV9nZXRfYWNsX3JlbW90ZV9hZGRyKHVpbnQxNl90IGhjaV9oYW5kbGUsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oIGIvc3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQ3NmJiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGlfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUTV9CTEVfQVBJX1RZUEVTX0gKLSNkZWZpbmUgQlRNX0JMRV9BUElfVFlQRVNfSAotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFja19mb3J3YXJkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfY29tbW9uX3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgQ0hOTF9NQVBfTEVOIDUKLXR5cGVkZWYgdWludDhfdCB0QlRNX0JMRV9DSE5MX01BUFtDSE5MX01BUF9MRU5dOwotCi1lbnVtIDogdWludDhfdCB7Ci0gIC8qIDB4MDAtMHgwNCBvbmx5IHVzZWQgZm9yIHNldCBhZHZlcnRpc2luZyBwYXJhbWV0ZXIgY29tbWFuZCAqLwotICBCVE1fQkxFX0NPTk5FQ1RfRVZUID0gMHgwMCwKLSAgLyogQ29ubmVjdGFibGUgZGlyZWN0ZWQgYWR2ZXJ0aXNpbmcgKi8KLSAgQlRNX0JMRV9DT05ORUNUX0RJUl9FVlQgPSAweDAxLAotICAvKiBTY2FubmFibGUgdW5kaXJlY3RlZCBhZHZlcnRpc2luZyAqLwotICBCVE1fQkxFX0RJU0NPVkVSX0VWVCA9IDB4MDIsCi0gIC8qIE5vbiBjb25uZWN0YWJsZSB1bmRpcmVjdGVkIGFkdmVydGlzaW5nICovCi0gIEJUTV9CTEVfTk9OX0NPTk5FQ1RfRVZUID0gMHgwMywKLSAgLyogQ29ubmVjdGFibGUgbG93IGR1dHkgY3ljbGUgZGlyZWN0ZWQgYWR2ZXJ0aXNpbmcgICovCi0gIEJUTV9CTEVfQ09OTkVDVF9MT19EVVRZX0RJUl9FVlQgPSAweDA0LAotfTsKLQotLyogMHgwMCAtIDB4MDQgY2FuIGJlIHJlY2VpdmVkIG9uIGFkdiBldmVudCB0eXBlICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgQlRNX0JMRV9BRFZfSU5EX0VWVCA9IDB4MDAsCi0gIEJUTV9CTEVfQURWX0RJUkVDVF9JTkRfRVZUID0gMHgwMSwKLSAgQlRNX0JMRV9BRFZfU0NBTl9JTkRfRVZUID0gMHgwMiwKLSAgQlRNX0JMRV9BRFZfTk9OQ09OTl9JTkRfRVZUID0gMHgwMywKLSAgQlRNX0JMRV9TQ0FOX1JTUF9FVlQgPSAweDA0LAotfSB0QlRNX0JMRV9FVlQ7Ci0KLXR5cGVkZWYgdWludDMyX3QgdEJUTV9CTEVfUkVGX1ZBTFVFOwotCi0jZGVmaW5lIEJUTV9CTEVfU0NBTl9NT0RFX1BBU1MgMAotI2RlZmluZSBCVE1fQkxFX1NDQU5fTU9ERV9BQ1RJIDEKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX01PREVfTk9ORSAweGZmCi10eXBlZGVmIHVpbnQ4X3QgdEJMRV9TQ0FOX01PREU7Ci0KLSNkZWZpbmUgQlRNX0JMRV9CQVRDSF9TQ0FOX01PREVfRElTQUJMRSAwCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFX1BBU1MgMQotI2RlZmluZSBCVE1fQkxFX0JBVENIX1NDQU5fTU9ERV9BQ1RJIDIKLSNkZWZpbmUgQlRNX0JMRV9CQVRDSF9TQ0FOX01PREVfUEFTU19BQ1RJIDMKLQotdHlwZWRlZiB1aW50OF90IHRCVE1fQkxFX0JBVENIX1NDQU5fTU9ERTsKLQotLyogYWR2ZXJ0aXNpbmcgY2hhbm5lbCBtYXAgKi8KLSNkZWZpbmUgQlRNX0JMRV9BRFZfQ0hOTF8zNyAoMHgwMSA8PCAwKQotI2RlZmluZSBCVE1fQkxFX0FEVl9DSE5MXzM4ICgweDAxIDw8IDEpCi0jZGVmaW5lIEJUTV9CTEVfQURWX0NITkxfMzkgKDB4MDEgPDwgMikKLXR5cGVkZWYgdWludDhfdCB0QlRNX0JMRV9BRFZfQ0hOTF9NQVA7Ci0KLS8qZCBlZmF1bHQgYWR2ZXJ0aXNpbmcgY2hhbm5lbCBtYXAgKi8KLSNpZm5kZWYgQlRNX0JMRV9ERUZBVUxUX0FEVl9DSE5MX01BUAotI2RlZmluZSBCVE1fQkxFX0RFRkFVTFRfQURWX0NITkxfTUFQIFwKLSAgKEJUTV9CTEVfQURWX0NITkxfMzcgfCBCVE1fQkxFX0FEVl9DSE5MXzM4IHwgQlRNX0JMRV9BRFZfQ0hOTF8zOSkKLSNlbmRpZgotCi0vKiBhZHZlcnRpc2luZyBmaWx0ZXIgcG9saWN5ICovCi0jZGVmaW5lIEFQX1NDQU5fQ09OTl9BTEwgMHgwMCAvKiBkZWZhdWx0ICovCi0jZGVmaW5lIEFQX1NDQU5fV0xfQ09OTl9BTEwgMHgwMQotI2RlZmluZSBBUF9TQ0FOX0FMTF9DT05OX1dMIDB4MDIKLSNkZWZpbmUgQVBfU0NBTl9DT05OX1dMIDB4MDMKLSNkZWZpbmUgQVBfU0NBTl9DT05OX1BPTElDWV9NQVggMHgwNAotdHlwZWRlZiB1aW50OF90IHRCVE1fQkxFX0FGUDsKLQotLyogZGVmYXVsdCBhZHZlcnRpc2luZyBmaWx0ZXIgcG9saWN5ICovCi0jaWZuZGVmIEJUTV9CTEVfREVGQVVMVF9BRlAKLSNkZWZpbmUgQlRNX0JMRV9ERUZBVUxUX0FGUCBBUF9TQ0FOX0NPTk5fQUxMCi0jZW5kaWYKLQotLyogc2Nhbm5pbmcgZmlsdGVyIHBvbGljeSAqLwotLyogMDogYWNjZXB0IGFkdiBwYWNrZXQgZnJvbSBhbGwsIGRpcmVjdGVkIGFkdiBwa3Qgbm90IGRpcmVjdGVkICovCi0vKiAgICB0byBsb2NhbCBkZXZpY2UgaXMgaWdub3JlZCAqLwotI2RlZmluZSBTUF9BRFZfQUxMIDB4MDAKLQotdHlwZWRlZiB1aW50OF90IHRCVE1fQkxFX1NGUDsKLQotI2lmbmRlZiBCVE1fQkxFX0RFRkFVTFRfU0ZQCi0jZGVmaW5lIEJUTV9CTEVfREVGQVVMVF9TRlAgU1BfQURWX0FMTAotI2VuZGlmCi0KLS8qIEZ1bGwgc2NhbiBib3VuZGFyeSB2YWx1ZXMgKi8KLSNkZWZpbmUgQlRNX0JMRV9BRFZfU0NBTl9GVUxMX01JTiAweDAwCi0jZGVmaW5lIEJUTV9CTEVfQURWX1NDQU5fRlVMTF9NQVggMHg2NAotCi0vKiBQYXJ0aWFsIHNjYW4gYm91bmRhcnkgdmFsdWVzICovCi0jZGVmaW5lIEJUTV9CTEVfQURWX1NDQU5fVFJVTkNfTUFYIEJUTV9CTEVfQURWX1NDQU5fRlVMTF9NQVgKLQotLyogVGhyZXNob2xkIHZhbHVlcyAqLwotI2RlZmluZSBCVE1fQkxFX0FEVl9TQ0FOX1RIUl9NQVggQlRNX0JMRV9BRFZfU0NBTl9GVUxMX01BWAotCi0vKiBjb25uZWN0aW9uIHBhcmFtZXRlciBib3VuZGFyeSB2YWx1ZXMgKi8KLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX0lOVF9NSU4gMHgwMDA0Ci0jZGVmaW5lIEJUTV9CTEVfU0NBTl9JTlRfTUFYIDB4NDAwMAotI2RlZmluZSBCVE1fQkxFX1NDQU5fV0lOX01JTiAweDAwMDQKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX1dJTl9NQVggMHg0MDAwCi0jZGVmaW5lIEJUTV9CTEVfRVhUX1NDQU5fSU5UX01BWCAweDAwRkZGRkZGCi0jZGVmaW5lIEJUTV9CTEVfRVhUX1NDQU5fV0lOX01BWCAweEZGRkYKLSNkZWZpbmUgQlRNX0JMRV9DT05OX0lOVF9NSU4gMHgwMDA2Ci0jZGVmaW5lIEJUTV9CTEVfQ09OTl9JTlRfTUFYIDB4MEM4MAotI2RlZmluZSBCVE1fQkxFX0NPTk5fTEFURU5DWV9NQVggNTAwCi0jZGVmaW5lIEJUTV9CTEVfQ09OTl9TVVBfVE9VVF9NSU4gMHgwMDBBCi0jZGVmaW5lIEJUTV9CTEVfQ09OTl9TVVBfVE9VVF9NQVggMHgwQzgwCi0vKiB1c2UgdGhpcyB2YWx1ZSB3aGVuIGEgc3BlY2lmaWMgdmFsdWUgbm90IHRvIGJlIG92ZXJ3cml0dGVuICovCi0jZGVmaW5lIEJUTV9CTEVfQ09OTl9QQVJBTV9VTkRFRiAweGZmZmYKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX1BBUkFNX1VOREVGIDB4ZmZmZgotCi0vKiBkZWZhdWx0IGNvbm5lY3Rpb24gcGFyYW1ldGVycyBpZiBub3QgY29uZmlndXJlZCwgdXNlIEdBUCByZWNvbW1lbmRlZCB2YWx1ZQotICogZm9yIGF1dG8vc2VsZWN0aXZlIGNvbm5lY3Rpb24gKi8KLS8qIGRlZmF1bHQgc2NhbiBpbnRlcnZhbCAqLwotI2lmbmRlZiBCVE1fQkxFX1NDQU5fRkFTVF9JTlQKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX0ZBU1RfSU5UIDk2IC8qIDMwIH4gNjAgbXMgKHVzZSA2MCkgID0gOTYgKjAuNjI1ICovCi0jZW5kaWYKLS8qIGRlZmF1bHQgc2NhbiB3aW5kb3cgZm9yIGJhY2tncm91bmQgY29ubmVjdGlvbiwgYXBwbGljYWJsZSBmb3IgYXV0byBjb25uZWN0aW9uCi0gKiBvciBzZWxlY3RpdmUgY29ubmVjdGlvbiAqLwotI2lmbmRlZiBCVE1fQkxFX1NDQU5fRkFTVF9XSU4KLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX0ZBU1RfV0lOIDQ4IC8qIDMwIG1zID0gNDggKjAuNjI1ICovCi0jZW5kaWYKLQotLyogZGVmYXVsdCBzY2FuIHBhcmFtdGVyIHVzZWQgaW4gcmVkdWNlZCBwb3dlciBjeWNsZSAoYmFja2dyb3VuZCBzY2FubmluZykgKi8KLSNpZm5kZWYgQlRNX0JMRV9TQ0FOX1NMT1dfSU5UXzEKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX1NMT1dfSU5UXzEgMjA0OCAvKiAxLjI4IHMgICA9IDIwNDggKjAuNjI1ICovCi0jZW5kaWYKLSNpZm5kZWYgQlRNX0JMRV9TQ0FOX1NMT1dfV0lOXzEKLSNkZWZpbmUgQlRNX0JMRV9TQ0FOX1NMT1dfV0lOXzEgNDggLyogMzAgbXMgPSA0OCAqMC42MjUgKi8KLSNlbmRpZgotCi0vKiBkZWZhdWx0IHNjYW4gcGFyYW10ZXIgdXNlZCBpbiByZWR1Y2VkIHBvd2VyIGN5Y2xlIChiYWNrZ3JvdW5kIHNjYW5uaW5nKSAqLwotI2lmbmRlZiBCVE1fQkxFX1NDQU5fU0xPV19JTlRfMgotI2RlZmluZSBCVE1fQkxFX1NDQU5fU0xPV19JTlRfMiA0MDk2IC8qIDIuNTYgcyAgID0gNDA5NiAqMC42MjUgKi8KLSNlbmRpZgotI2lmbmRlZiBCVE1fQkxFX1NDQU5fU0xPV19XSU5fMgotI2RlZmluZSBCVE1fQkxFX1NDQU5fU0xPV19XSU5fMiAzNiAvKiAyMi41IG1zID0gMzYgKjAuNjI1ICovCi0jZW5kaWYKLQotLyogZGVmYXVsdCBjb25uZWN0aW9uIGludGVydmFsIG1pbiAqLwotI2lmbmRlZiBCVE1fQkxFX0NPTk5fSU5UX01JTl9ERUYKLS8qIHJlY29tbWVuZGVkIG1pbjogMzBtcyAgPSAyNCAqIDEuMjUgKi8KLSNpZm5kZWYgQlRNX0JMRV9DT05OX0lOVF9NSU5fREVGCi0jZGVmaW5lIEJUTV9CTEVfQ09OTl9JTlRfTUlOX0RFRiAyNAotI2VuZGlmCi0jZW5kaWYKLQotLyogZGVmYXVsdCBjb25uZWN0aW5vIGludGVydmFsIG1heCAqLwotI2lmbmRlZiBCVE1fQkxFX0NPTk5fSU5UX01BWF9ERUYKLS8qIHJlY29tbWVuZGVkIG1heDogNTAgbXMgPSA1NiAqIDEuMjUgKi8KLSNpZm5kZWYgQlRNX0JMRV9DT05OX0lOVF9NQVhfREVGCi0jZGVmaW5lIEJUTV9CTEVfQ09OTl9JTlRfTUFYX0RFRiA0MAotI2VuZGlmCi0jZW5kaWYKLQotLyogZGVmYXVsdCBwZXJpcGhlcmFsIGxhdGVuY3kgKi8KLSNpZm5kZWYgQlRNX0JMRV9DT05OX1BFUklQSEVSQUxfTEFURU5DWV9ERUYKLSNkZWZpbmUgQlRNX0JMRV9DT05OX1BFUklQSEVSQUxfTEFURU5DWV9ERUYgMCAvKiAwICovCi0jZW5kaWYKLQotLyogZGVmYXVsdCBzdXBlcnZpc2lvbiB0aW1lb3V0ICovCi0jaWZuZGVmIEJUTV9CTEVfQ09OTl9USU1FT1VUX0RFRgotI2RlZmluZSBCVE1fQkxFX0NPTk5fVElNRU9VVF9ERUYgNTAwCi0jZW5kaWYKLQotLyogbWluaW11bSBzdXBlcnZpc2lvbiB0aW1lb3V0ICovCi0jaWZuZGVmIEJUTV9CTEVfQ09OTl9USU1FT1VUX01JTl9ERUYKLSNkZWZpbmUgQlRNX0JMRV9DT05OX1RJTUVPVVRfTUlOX0RFRiAxMDAKLSNlbmRpZgotCi0vKiBtaW5pbXVtIGFjY2VwdGFibGUgY29ubmVjdGlvbiBpbnRlcnZhbCAqLwotI2lmbmRlZiBCVE1fQkxFX0NPTk5fSU5UX01JTl9MSU1JVAotI2RlZmluZSBCVE1fQkxFX0NPTk5fSU5UX01JTl9MSU1JVCAweDAwMDkKLSNlbmRpZgotCi0vKiBtaW5pbXVtIGFjY2VwdGFibGUgY29ubmVjdGlvbiBpbnRlcnZhbCB3aGVuIHRoZXJlIGlzIGJvbmRlZCBIZWFyaW5nIEFpZAotICogZGV2aWNlICovCi0jaWZuZGVmIEJUTV9CTEVfQ09OTl9JTlRfTUlOX0hFQVJJTkdBSUQKLSNkZWZpbmUgQlRNX0JMRV9DT05OX0lOVF9NSU5fSEVBUklOR0FJRCAweDAwMTAKLSNlbmRpZgotCi0jZGVmaW5lIEJUTV9DTUFDX1RMRU5fU0laRSA4IC8qIDY0IGJpdHMgKi8KLSNkZWZpbmUgQlRNX0JMRV9BVVRIX1NJR05fTEVOIFwKLSAgMTIgLyogQkxFIGRhdGEgc2lnbmF0dXJlIGxlbmd0aCA4IEJ5dGVzICsgNCBieXRlcyBjb3VudGVyKi8KLXR5cGVkZWYgdWludDhfdCBCTEVfU0lHTkFUVVJFW0JUTV9CTEVfQVVUSF9TSUdOX0xFTl07IC8qIERldmljZSBhZGRyZXNzICovCi0KLSNpZm5kZWYgQlRNX0JMRV9IT1NUX1NVUFBPUlQKLSNkZWZpbmUgQlRNX0JMRV9IT1NUX1NVUFBPUlQgMHgwMQotI2VuZGlmCi0KLSNpZm5kZWYgQlRNX0JMRV9TSU1VTFRBTkVPVVNfSE9TVAotI2RlZmluZSBCVE1fQkxFX1NJTVVMVEFORU9VU19IT1NUIDB4MDEKLSNlbmRpZgotCi0vKiBBcHBlYXJhbmNlIFZhbHVlcyBSZXBvcnRlZCB3aXRoIEJUTV9CTEVfQURfVFlQRV9BUFBFQVJBTkNFICovCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9VS05PV04gMHgwMDAwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX1BIT05FIDB4MDA0MAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19DT01QVVRFUiAweDAwODAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfV0FUQ0ggMHgwMEMwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9TUE9SVFNfV0FUQ0ggMHgwMEMxCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX0NMT0NLIDB4MDEwMAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19ESVNQTEFZIDB4MDE0MAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19SRU1PVEUgMHgwMTgwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX0VZRUdMQVNTRVMgMHgwMUMwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX1RBRyAweDAyMDAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfS0VZUklORyAweDAyNDAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfTUVESUFfUExBWUVSIDB4MDI4MAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19CQVJDT0RFX1NDQU5ORVIgMHgwMkMwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9HRU5FUklDX1RIRVJNT01FVEVSIDB4MDMwMAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfVEhFUk1PTUVURVJfRUFSIDB4MDMwMQotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19IRUFSVF9SQVRFIDB4MDM0MAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSEVBUlRfUkFURV9CRUxUIDB4MDM0MQotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19CTE9PRF9QUkVTU1VSRSAweDAzODAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0JMT09EX1BSRVNTVVJFX0FSTSAweDAzODEKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0JMT09EX1BSRVNTVVJFX1dSSVNUIDB4MDM4MgotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19ISUQgMHgwM0MwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9ISURfS0VZQk9BUkQgMHgwM0MxCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9ISURfTU9VU0UgMHgwM0MyCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9ISURfSk9ZU1RJQ0sgMHgwM0MzCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9ISURfR0FNRVBBRCAweDAzQzQKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0hJRF9ESUdJVElaRVJfVEFCTEVUIDB4MDNDNQotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSElEX0NBUkRfUkVBREVSIDB4MDNDNgotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSElEX0RJR0lUQUxfUEVOIDB4MDNDNwotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfSElEX0JBUkNPREVfU0NBTk5FUiAweDAzQzgKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfR0xVQ09TRSAweDA0MDAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfV0FMS0lORyAweDA0NDAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX1dBTEtJTkdfSU5fU0hPRSAweDA0NDEKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX1dBTEtJTkdfT05fU0hPRSAweDA0NDIKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX1dBTEtJTkdfT05fSElQIDB4MDQ0MwotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19DWUNMSU5HIDB4MDQ4MAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfQ1lDTElOR19DT01QVVRFUiAweDA0ODEKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0NZQ0xJTkdfU1BFRUQgMHgwNDgyCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9DWUNMSU5HX0NBREVOQ0UgMHgwNDgzCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9DWUNMSU5HX1BPV0VSIDB4MDQ4NAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfQ1lDTElOR19TUEVFRF9DQURFTkNFIDB4MDQ4NQotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfV0VBUkFCTEVfQVVESU9fREVWSUNFX0VBUkJVRCAweDA5NDEKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfUFVMU0VfT1hJTUVURVIgMHgwQzQwCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9QVUxTRV9PWElNRVRFUl9GSU5HRVJUSVAgMHgwQzQxCi0jZGVmaW5lIEJUTV9CTEVfQVBQRUFSQU5DRV9QVUxTRV9PWElNRVRFUl9XUklTVCAweDBDNDIKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX0dFTkVSSUNfV0VJR0hUIDB4MEM4MAotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfR0VORVJJQ19PVVRET09SX1NQT1JUUyAweDE0NDAKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX09VVERPT1JfU1BPUlRTX0xPQ0FUSU9OIDB4MTQ0MQotI2RlZmluZSBCVE1fQkxFX0FQUEVBUkFOQ0VfT1VURE9PUl9TUE9SVFNfTE9DQVRJT05fQU5EX05BViAweDE0NDIKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX09VVERPT1JfU1BPUlRTX0xPQ0FUSU9OX1BPRCAweDE0NDMKLSNkZWZpbmUgQlRNX0JMRV9BUFBFQVJBTkNFX09VVERPT1JfU1BPUlRTX0xPQ0FUSU9OX1BPRF9BTkRfTkFWIDB4MTQ0NAotCi0vKiBTdHJ1Y3R1cmUgcmV0dXJuZWQgd2l0aCBSYW5kL0VuY3J5cHQgY29tcGxldGUgY2FsbGJhY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQ4X3QgcGFyYW1fbGVuOwotICB1aW50MTZfdCBvcGNvZGU7Ci0gIHVpbnQ4X3QgcGFyYW1fYnVmW09DVEVUMTZfTEVOXTsKLX0gdEJUTV9SQU5EX0VOQzsKLQotLyogR2VuZXJhbCBjYWxsYmFjayBmdW5jdGlvbiBmb3Igbm90aWZ5aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgYSBzeW5jaHJvbm91cwotICogQlRNIGZ1bmN0aW9uIGlzIGNvbXBsZXRlLiBUaGUgcG9pbnRlciBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhbnkgcmV0dXJuZWQKLSAqIGRhdGEuCi0qLwotdHlwZWRlZiB2b2lkKHRCVE1fUkFORF9FTkNfQ0IpKHRCVE1fUkFORF9FTkMqIHAxKTsKLQotLyogQURWIGRhdGEgZmxhZyBiaXQgZGVmaW5pdGlvbiB1c2VkIGZvciBCVE1fQkxFX0FEX1RZUEVfRkxBRyAqLwotI2RlZmluZSBCVE1fQkxFX0xJTUlUX0RJU0NfRkxBRyAoMHgwMSA8PCAwKQotI2RlZmluZSBCVE1fQkxFX0dFTl9ESVNDX0ZMQUcgKDB4MDEgPDwgMSkKLSNkZWZpbmUgQlRNX0JMRV9CUkVEUl9OT1RfU1BUICgweDAxIDw8IDIpCi0vKiA0LjEgc3BlYyBhZHYgZmxhZyBmb3Igc2ltdWx0YW5lb3VzIEJSL0VEUitMRSBjb25uZWN0aW9uIHN1cHBvcnQgKi8KLSNkZWZpbmUgQlRNX0JMRV9ETVRfQ09OVFJPTExFUl9TUFQgKDB4MDEgPDwgMykKLSNkZWZpbmUgQlRNX0JMRV9ETVRfSE9TVF9TUFQgKDB4MDEgPDwgNCkKLQotLy8gVE9ETyhqcGF3bG93c2tpKTogdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aXRoIGNvZGUgdGhhdCBkZXBlbmQgb24gaXQuCi0jZGVmaW5lIEJUTV9CTEVfQURfQklUX0ZMQUdTICgweDAwMDAwMDAxIDw8IDEpCi0KLSNkZWZpbmUgQlRNX0JMRV9BRF9UWVBFX0ZMQUcgSENJX0VJUl9GTEFHU19UWVBFIC8qIDB4MDEgKi8KLSNkZWZpbmUgQlRNX0JMRV9BRF9UWVBFXzE2U1JWX0NNUEwgICAgICAgICAgXAotICBIQ0lfRUlSX0NPTVBMRVRFXzE2QklUU19VVUlEX1RZUEUgLyogMHgwMyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBCVE1fQkxFX0FEX1RZUEVfQVBQRUFSQU5DRSAweDE5Ci0jZGVmaW5lIEJUTV9CTEVfQURfVFlQRV9SU0kgSENJX0VJUl9SU0lfVFlQRSAvKiAweDJFICovCi0KLS8qICBNaW4vbWF4IFByZWZlcnJlZCAgbnVtYmVyIG9mIHBheWxvYWQgb2N0ZXRzIHRoYXQgdGhlIGxvY2FsIENvbnRyb2xsZXIKLSAgICBzaG91bGQgaW5jbHVkZSBpbiBhIHNpbmdsZSBMaW5rIExheWVyIERhdGEgQ2hhbm5lbCBQRFUuICovCi0jZGVmaW5lIEJUTV9CTEVfREFUQV9TSVpFX01BWCAweDAwZmIKLSNkZWZpbmUgQlRNX0JMRV9EQVRBX1NJWkVfTUlOIDB4MDAxYgotCi0vKiAgUHJlZmVycmVkIG1heGltdW0gbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0aGF0IHRoZSBsb2NhbCBDb250cm9sbGVyCi0gICAgc2hvdWxkIHVzZSB0byB0cmFuc21pdCBhIHNpbmdsZSBMaW5rIExheWVyIERhdGEgQ2hhbm5lbCBQRFUuICovCi0jZGVmaW5lIEJUTV9CTEVfREFUQV9UWF9USU1FX01BWF9MRUdBQ1kgIDB4MDg0OAotI2RlZmluZSBCVE1fQkxFX0RBVEFfVFhfVElNRV9NQVggICAgICAgICAweDQyOTAKLQotLyogYWR2IHR4IHBvd2VyIGluIGRCbSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGFkdl9pbnN0X21heDsgLyogbWF4IGFkdiBpbnN0YW5jZSBzdXBwb3J0ZWQgaW4gY29udHJvbGxlciAqLwotICB1aW50OF90IHJwYV9vZmZsb2FkaW5nOwotICB1aW50MTZfdCB0b3Rfc2Nhbl9yZXN1bHRzX3N0cmc7Ci0gIHVpbnQ4X3QgbWF4X2lya19saXN0X3N6OwotICB1aW50OF90IGZpbHRlcl9zdXBwb3J0OwotICB1aW50OF90IG1heF9maWx0ZXI7Ci0gIHVpbnQ4X3QgZW5lcmd5X3N1cHBvcnQ7Ci0gIGJvb2wgdmFsdWVzX3JlYWQ7Ci0gIHVpbnQxNl90IHZlcnNpb25fc3VwcG9ydGVkOwotICB1aW50MTZfdCB0b3RhbF90cmFja2FibGVfYWR2ZXJ0aXNlcnM7Ci0gIHVpbnQ4X3QgZXh0ZW5kZWRfc2Nhbl9zdXBwb3J0OwotICB1aW50OF90IGRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkOwotICB1aW50OF90IGxlX2FkZHJlc3NfZ2VuZXJhdGlvbl9vZmZsb2FkaW5nX3N1cHBvcnQ7Ci0gIHVpbnQzMl90IGEyZHBfc291cmNlX29mZmxvYWRfY2FwYWJpbGl0eV9tYXNrOwotICB1aW50OF90IHF1YWxpdHlfcmVwb3J0X3N1cHBvcnQ7Ci0gIHVpbnQzMl90IGR5bmFtaWNfYXVkaW9fYnVmZmVyX3N1cHBvcnQ7Ci19IHRCVE1fQkxFX1ZTQ19DQjsKLQotLyogU3RvcmVkIHRoZSBkZWZhdWx0L21heGltdW0vbWluaW11bSBidWZmZXIgdGltZSBmb3IgZHluYW1pYyBhdWRpbyBidWZmZXIuCi0gKiBGb3IgQTJEUCBvZmZsb2FkIHVzYWdlLCB0aGUgdW5pdCBpcyBtaWxsaXNlY29uZC4KLSAqIEZvciBBMkRQIGxlZ2FjeSB1c2FnZSwgdGhlIHVuaXQgaXMgYnVmZmVyIHF1ZXVlIHNpemUqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBkZWZhdWx0X2J1ZmZlcl90aW1lOwotICB1aW50MTZfdCBtYXhpbXVtX2J1ZmZlcl90aW1lOwotICB1aW50MTZfdCBtaW5pbXVtX2J1ZmZlcl90aW1lOwotfSB0QlRNX0JUX0RZTkFNSUNfQVVESU9fQlVGRkVSX0NCOwotCi10eXBlZGVmIHZvaWQodEJUTV9CTEVfQURWX0RBVEFfQ01QTF9DQkFDSykodEJUTV9TVEFUVVMgc3RhdHVzKTsKLQotI2lmbmRlZiBCVE1fQkxFX01VTFRJX0FEVl9NQVgKLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAxNiAvKiBjb250cm9sbGVyIHJldHVybmVkIGFkdl9pbnN0X21heCBzaG91bGQgYmUgbGVzcyBcCi0gICAgICAgIHRoYW4gdGhpcyBudW1iZXIgKi8KLSNlbmRpZgotCi10eXBlZGVmIHVpbnQ4X3QgdEdBVFRfSUY7Ci0KLXR5cGVkZWYgdm9pZCh0QlRNX0JMRV9TQ0FOX1RIUkVTSE9MRF9DQkFDSykodEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSk7Ci11c2luZyB0QlRNX0JMRV9TQ0FOX1JFUF9DQkFDSyA9Ci0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh0QlRNX1NUQVRVUyAvKiBzdGF0dXMgKi8sIHVpbnQ4X3QgLyogcmVwb3J0X2Zvcm1hdCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgLyogbnVtX3JlcG9ydHMgKi8sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KT47Ci0KLSNpZm5kZWYgQlRNX0JMRV9CQVRDSF9TQ0FOX01BWAotI2RlZmluZSBCVE1fQkxFX0JBVENIX1NDQU5fTUFYIDUKLSNlbmRpZgotCi0jaWZuZGVmIEJUTV9CTEVfQkFUQ0hfUkVQX01BSU5fUV9TSVpFCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfUkVQX01BSU5fUV9TSVpFIDIKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotICBCVE1fQkxFX1NDQU5fSU5WQUxJRF9TVEFURSA9IDAsCi0gIEJUTV9CTEVfU0NBTl9FTkFCTEVfQ0FMTEVEID0gMSwKLSAgQlRNX0JMRV9TQ0FOX0VOQUJMRURfU1RBVEUgPSAyLAotICBCVE1fQkxFX1NDQU5fRElTQUJMRV9DQUxMRUQgPSAzLAotICBCVE1fQkxFX1NDQU5fRElTQUJMRURfU1RBVEUgPSA0Ci19IHRCVE1fQkxFX0JBVENIX1NDQU5fU1RBVEU7Ci0KLWVudW0geyBCVE1fQkxFX0RJU0NBUkRfT0xEX0lURU1TLCBCVE1fQkxFX0RJU0NBUkRfTE9XRVJfUlNTSV9JVEVNUyB9OwotdHlwZWRlZiB1aW50OF90IHRCVE1fQkxFX0RJU0NBUkRfUlVMRTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX0JMRV9CQVRDSF9TQ0FOX1NUQVRFIGN1cl9zdGF0ZTsKLSAgdEJUTV9CTEVfQkFUQ0hfU0NBTl9NT0RFIHNjYW5fbW9kZTsKLSAgdWludDMyX3Qgc2Nhbl9pbnRlcnZhbDsKLSAgdWludDMyX3Qgc2Nhbl93aW5kb3c7Ci0gIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZTsKLSAgdEJUTV9CTEVfRElTQ0FSRF9SVUxFIGRpc2NhcmRfcnVsZTsKLSAgdEJUTV9CTEVfU0NBTl9USFJFU0hPTERfQ0JBQ0sqIHBfdGhyZXNfY2JhY2s7Ci0gIHRCVE1fQkxFX1JFRl9WQUxVRSByZWZfdmFsdWU7Ci19IHRCVE1fQkxFX0JBVENIX1NDQU5fQ0I7Ci0KLS8qIGZpbHRlciBzZWxlY3Rpb24gYml0IGluZGV4ICAqLwotI2RlZmluZSBCVE1fQkxFX1BGX0FERFJfRklMVEVSIDAKLSNkZWZpbmUgQlRNX0JMRV9QRl9TUlZDX0RBVEEgMQotI2RlZmluZSBCVE1fQkxFX1BGX1NSVkNfVVVJRCAyCi0jZGVmaW5lIEJUTV9CTEVfUEZfU1JWQ19TT0xfVVVJRCAzCi0jZGVmaW5lIEJUTV9CTEVfUEZfTE9DQUxfTkFNRSA0Ci0jZGVmaW5lIEJUTV9CTEVfUEZfTUFOVV9EQVRBIDUKLSNkZWZpbmUgQlRNX0JMRV9QRl9TUlZDX0RBVEFfUEFUVEVSTiA2Ci0vKiB3aGVuIHBhc3NlZCBpbiBwYXlsb2FkIGZpbHRlciB0eXBlIGFsbCwgb25seSBjbGVhciBhY3Rpb24gaXMgYXBwbGljYWJsZSAqLwotI2RlZmluZSBCVE1fQkxFX1BGX1RZUEVfQUxMIDcKLSNkZWZpbmUgQlRNX0JMRV9QRl9UWVBFX01BWCA4Ci0KLS8qIG1heCBudW1iZXIgb2YgZmlsdGVyIHNwb3QgZm9yIGRpZmZlcmVudCBmaWx0ZXIgdHlwZSAqLwotI2lmbmRlZiBCVE1fQkxFX01BWF9VVUlEX0ZJTFRFUgotI2RlZmluZSBCVE1fQkxFX01BWF9VVUlEX0ZJTFRFUiA4Ci0jZW5kaWYKLSNpZm5kZWYgQlRNX0JMRV9NQVhfQUREUl9GSUxURVIKLSNkZWZpbmUgQlRNX0JMRV9NQVhfQUREUl9GSUxURVIgOAotI2VuZGlmCi0jaWZuZGVmIEJUTV9CTEVfUEZfU1RSX0NPTkRfTUFYCi0jZGVmaW5lIEJUTV9CTEVfUEZfU1RSX0NPTkRfTUFYIDQgLyogYXBwbHkgdG8gbWFudSBkYXRhICwgb3IgbG9jYWwgbmFtZSAqLwotI2VuZGlmCi0jaWZuZGVmIEJUTV9CTEVfUEZfU1RSX0xFTl9NQVgKLSNkZWZpbmUgQlRNX0JMRV9QRl9TVFJfTEVOX01BWCAyOSAvKiBtYXRjaCBmb3IgZmlyc3QgMjkgYnl0ZXMgKi8KLSNlbmRpZgotCi10eXBlZGVmIHVpbnQ4X3QgdEJUTV9CTEVfUEZfQ09ORF9UWVBFOwotCi0jZGVmaW5lIEJUTV9CTEVfUEZfTE9HSUNfT1IgMAotI2RlZmluZSBCVE1fQkxFX1BGX0xPR0lDX0FORCAxCi10eXBlZGVmIHVpbnQ4X3QgdEJUTV9CTEVfUEZfTE9HSUNfVFlQRTsKLQotI2RlZmluZSBCVE1fQkxFX1BGX0VOQUJMRSAxCi0jZGVmaW5lIEJUTV9CTEVfUEZfQ09ORklHIDIKLQotdHlwZWRlZiB1aW50OF90IHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVg7Ci0KLWVudW0gewotICBCVE1fQkxFX1NDQU5fQ09ORF9BREQsCi0gIEJUTV9CTEVfU0NBTl9DT05EX0RFTEVURSwKLSAgQlRNX0JMRV9TQ0FOX0NPTkRfQ0xFQVIgPSAyCi19OwotdHlwZWRlZiB1aW50OF90IHRCVE1fQkxFX1NDQU5fQ09ORF9PUDsKLQotLyogQkxFIGFkdiBwYXlsb2FkIGZpbHRlcmluZyBjb25maWcgY29tcGxldGUgY2FsbGJhY2sgKi8KLXVzaW5nIHRCVE1fQkxFX1BGX0NGR19DQkFDSyA9IGJhc2U6OkNhbGxiYWNrPHZvaWQoCi0gICAgdWludDhfdCAvKiBhdmJsX3NwYWNlICovLCB0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgLyogYWN0aW9uICovLAotICAgIHRCVE1fU1RBVFVTIC8qIGJ0bV9zdGF0dXMgKi8pPjsKLQotLyogQkxFIGFkdiBwYXlsb2FkIGZpbHRlcmluZyBzdGF0dXMgc2V0dXAgY29tcGxldGUgY2FsbGJhY2sgKi8KLXVzaW5nIHRCVE1fQkxFX1BGX1NUQVRVU19DQkFDSyA9IGJhc2U6OkNhbGxiYWNrPHZvaWQoCi0gICAgdEJUTV9CTEVfU0NBTl9DT05EX09QIC8qYWN0aW9uKi8sIHRCVE1fU1RBVFVTIC8qIGJ0bV9zdGF0dXMgKi8pPjsKLQotLyogQkxFIGFkdiBwYXlsb2FkIGZpbHRlcmluZyBwYXJhbSBzZXR1cCBjb21wbGV0ZSBjYWxsYmFjayAqLwotdXNpbmcgdEJUTV9CTEVfUEZfUEFSQU1fQ0IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKAotICAgIHVpbnQ4X3QgLyogYXZibF9zcGFjZSAqLywgdEJUTV9CTEVfU0NBTl9DT05EX09QIC8qIGFjdGlvbiAqLywKLSAgICB0QlRNX1NUQVRVUyAvKiBidG1fc3RhdHVzICovKT47Ci0KLSNpZm5kZWYgQlRNX0NTX0lSS19MSVNUX01BWAotI2RlZmluZSBCVE1fQ1NfSVJLX0xJU1RfTUFYIDB4MjAKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgaW5fdXNlOwotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIHVpbnQ4X3QgcGZfY291bnRlcltCVE1fQkxFX1BGX1RZUEVfTUFYXTsgLyogbnVtYmVyIG9mIGZpbHRlciBpbmRleGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ09ORF9UWVBFICovCi19IHRCVE1fQkxFX1BGX0NPVU5UOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJvb2wgZW5hYmxlOwotICB1aW50OF90IG9wX3R5cGU7Ci0gIHRCVE1fQkxFX1BGX0NPVU5UKiBwX2FkZHJfZmlsdGVyX2NvdW50OyAvKiBwZXIgQkRBIGZpbHRlciBhcnJheSAqLwotICB0QkxFX0JEX0FERFIgY3VyX2ZpbHRlcl90YXJnZXQ7Ci19IHRCVE1fQkxFX0FEVl9GSUxURVJfQ0I7Ci0KLS8qIFN1YiBjb2RlcyAqLwotI2RlZmluZSBCVE1fQkxFX01FVEFfUEZfRU5BQkxFIDB4MDAKLSNkZWZpbmUgQlRNX0JMRV9NRVRBX1BGX0ZFQVRfU0VMIDB4MDEKLSNkZWZpbmUgQlRNX0JMRV9NRVRBX1BGX0FERFIgMHgwMgotI2RlZmluZSBCVE1fQkxFX01FVEFfUEZfVVVJRCAweDAzCi0jZGVmaW5lIEJUTV9CTEVfTUVUQV9QRl9TT0xfVVVJRCAweDA0Ci0jZGVmaW5lIEJUTV9CTEVfTUVUQV9QRl9MT0NBTF9OQU1FIDB4MDUKLSNkZWZpbmUgQlRNX0JMRV9NRVRBX1BGX01BTlVfREFUQSAweDA2Ci0jZGVmaW5lIEJUTV9CTEVfTUVUQV9QRl9TUlZDX0RBVEEgMHgwNwotI2RlZmluZSBCVE1fQkxFX01FVEFfUEZfQUxMIDB4MDgKLQotI2RlZmluZSBBRFZfSU5GT19QUkVTRU5UIDB4MDAKLSNkZWZpbmUgTk9fQURWX0lORk9fUFJFU0VOVCAweDAxCi0KLXR5cGVkZWYgYnRnYXR0X3RyYWNrX2Fkdl9pbmZvX3QgdEJUTV9CTEVfVFJBQ0tfQURWX0RBVEE7Ci0KLXR5cGVkZWYgdm9pZCh0QlRNX0JMRV9UUkFDS19BRFZfQ0JBQ0spKAotICAgIHRCVE1fQkxFX1RSQUNLX0FEVl9EQVRBKiBwX3RyYWNrX2Fkdl9kYXRhKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX0JMRV9SRUZfVkFMVUUgcmVmX3ZhbHVlOwotICB0QlRNX0JMRV9UUkFDS19BRFZfQ0JBQ0sqIHBfdHJhY2tfY2JhY2s7Ci19IHRCVE1fQkxFX0FEVl9UUkFDS19DQjsKLQotdHlwZWRlZiB1aW50MzJfdCB0QlRNX0JMRV9UWF9USU1FX01TOwotdHlwZWRlZiB1aW50MzJfdCB0QlRNX0JMRV9SWF9USU1FX01TOwotdHlwZWRlZiB1aW50MzJfdCB0QlRNX0JMRV9JRExFX1RJTUVfTVM7Ci10eXBlZGVmIHVpbnQzMl90IHRCVE1fQkxFX0VORVJHWV9VU0VEOwotCi10eXBlZGVmIHZvaWQodEJUTV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0spKHRCVE1fQkxFX1RYX1RJTUVfTVMgdHhfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUlhfVElNRV9NUyByeF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9JRExFX1RJTUVfTVMgaWRsZV90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9FTkVSR1lfVVNFRCBlbmVyZ3lfdXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0QlRNX0JMRV9FTkVSR1lfSU5GT19DQkFDSyogcF9lbmVyX2NiYWNrOwotfSB0QlRNX0JMRV9FTkVSR1lfSU5GT19DQjsKLQotdHlwZWRlZiB2b2lkKHRCVE1fQkxFX0NUUkxfRkVBVFVSRVNfQ0JBQ0spKHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci0KLS8qIEJMRSBlbmNyeXB0aW9uIGtleXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgT2N0ZXQxNiBsdGs7Ci0gIEJUX09DVEVUOCByYW5kOwotICB1aW50MTZfdCBlZGl2OwotICB1aW50OF90IHNlY19sZXZlbDsKLSAgdWludDhfdCBrZXlfc2l6ZTsKLX0gdEJUTV9MRV9QRU5DX0tFWVM7Ci0KLS8qIEJMRSBDU1JLIGtleXMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgY291bnRlcjsKLSAgT2N0ZXQxNiBjc3JrOwotICB1aW50OF90IHNlY19sZXZlbDsKLX0gdEJUTV9MRV9QQ1NSS19LRVlTOwotCi0vKiBCTEUgRW5jcnlwdGlvbiByZXByb2R1Y3Rpb24ga2V5cyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBPY3RldDE2IGx0azsKLSAgdWludDE2X3QgZGl2OwotICB1aW50OF90IGtleV9zaXplOwotICB1aW50OF90IHNlY19sZXZlbDsKLX0gdEJUTV9MRV9MRU5DX0tFWVM7Ci0KLS8qIEJMRSBTUksga2V5cyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBjb3VudGVyOwotICB1aW50MTZfdCBkaXY7Ci0gIHVpbnQ4X3Qgc2VjX2xldmVsOwotICBPY3RldDE2IGNzcms7Ci19IHRCVE1fTEVfTENTUktfS0VZUzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBPY3RldDE2IGlyazsKLSAgdEJMRV9BRERSX1RZUEUgaWRlbnRpdHlfYWRkcl90eXBlOwotICBSYXdBZGRyZXNzIGlkZW50aXR5X2FkZHI7Ci19IHRCVE1fTEVfUElEX0tFWVM7Ci0KLXR5cGVkZWYgdW5pb24gewotICB0QlRNX0xFX1BFTkNfS0VZUyBwZW5jX2tleTsgICAvKiByZWNlaXZlZCBwZWVyIGVuY3J5cHRpb24ga2V5ICovCi0gIHRCVE1fTEVfUENTUktfS0VZUyBwY3Nya19rZXk7IC8qIHJlY2VpdmVkIHBlZXIgZGV2aWNlIFNSSyAqLwotICB0QlRNX0xFX1BJRF9LRVlTIHBpZF9rZXk7ICAgICAvKiBwZWVyIGRldmljZSBJRCBrZXkgKi8KLSAgdEJUTV9MRV9MRU5DX0tFWVMgbGVuY19rZXk7ICAgLyogbG9jYWwgZW5jcnlwdGlvbiByZXByb2R1Y3Rpb24ga2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBMVEsgPSA9IGQxKEVSLERJViwwKSAqLwotICB0QlRNX0xFX0xDU1JLX0tFWVMgbGNzcmtfa2V5OyAvKiBsb2NhbCBkZXZpY2UgQ1NSSyA9IGQxKEVSLERJViwxKSovCi19IHRCVE1fTEVfS0VZX1ZBTFVFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGU7Ci0gIHRCVE1fTEVfS0VZX1ZBTFVFKiBwX2tleV92YWx1ZTsKLX0gdEJUTV9MRV9LRVk7Ci0KLXR5cGVkZWYgdW5pb24gewotICB0QlRNX0xFX0lPX1JFUSBpb19yZXE7IC8qIEJUTV9MRV9JT19SRVFfRVZUICAgICAgKi8KLSAgdWludDMyX3Qga2V5X25vdGlmOyAgICAvKiBCVE1fTEVfS0VZX05PVElGX0VWVCAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogQlRNX0xFX05DX1JFUV9FVlQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjYWxsYmFjayBkYXRhIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAqIEJUTV9MRV9LRVlfUkVRX0VWVAotICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBCVE1fTEVfT09CX1JFUV9FVlQgICovCi0gIHRCVE1fTEVfQ09NUExUIGNvbXBsdDsgLyogQlRNX0xFX0NPTVBMVF9FVlQgICAgICAqLwotICB0U01QX09PQl9EQVRBX1RZUEUgcmVxX29vYl90eXBlOwotICB0QlRNX0xFX0tFWSBrZXk7Ci0gIHRTTVBfTE9DX09PQl9EQVRBIGxvY2FsX29vYl9kYXRhOwotfSB0QlRNX0xFX0VWVF9EQVRBOwotCi0vKiBTaW1wbGUgUGFpcmluZyBFdmVudHMuICBDYWxsZWQgYnkgdGhlIHN0YWNrIHdoZW4gU2ltcGxlIFBhaXJpbmcgcmVsYXRlZAotICogZXZlbnRzIG9jY3VyLgotICovCi10eXBlZGVmIHVpbnQ4X3QodEJUTV9MRV9DQUxMQkFDSykodEJUTV9MRV9FVlQgZXZlbnQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0VWVF9EQVRBKiBwX2RhdGEpOwotCi0jZGVmaW5lIEJUTV9CTEVfS0VZX1RZUEVfSUQgMQotI2RlZmluZSBCVE1fQkxFX0tFWV9UWVBFX0VSIDIKLSNkZWZpbmUgQlRNX0JMRV9LRVlfVFlQRV9DT1VOVEVSIDMgIC8vIHRvYmUgb2Jzb2xldGUKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBPY3RldDE2IGlyOwotICBPY3RldDE2IGlyazsKLSAgT2N0ZXQxNiBkaGs7Ci0KLX0gdEJUTV9CTEVfTE9DQUxfSURfS0VZUzsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHRCVE1fQkxFX0xPQ0FMX0lEX0tFWVMgaWRfa2V5czsKLSAgT2N0ZXQxNiBlcjsKLX0gdEJUTV9CTEVfTE9DQUxfS0VZUzsKLQotLyogTmV3IExFIGlkZW50aXR5IGtleSBmb3IgbG9jYWwgZGV2aWNlLgotICovCi10eXBlZGVmIHZvaWQodEJUTV9MRV9LRVlfQ0FMTEJBQ0spKHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX0xPQ0FMX0tFWVMqIHBfa2V5KTsKLQotI2VuZGlmICAvLyBCVE1fQkxFX0FQSV9UWVBFU19ICmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2J0bV9jbGllbnRfaW50ZXJmYWNlLmggYi9zdGFjay9pbmNsdWRlL2J0bV9jbGllbnRfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOWI5NmIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2VzY29fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9uZWlnaGJvcl9pbnF1aXJ5LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfY2xpZW50X2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9ibGVfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2VjdXJpdHlfY2xpZW50X2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotc3RydWN0IGJ0bV9jbGllbnRfaW50ZXJmYWNlX3MgewotICBzdHJ1Y3QgewotICAgIHRCVE1fU1RBVFVTICgqQlRNX1BtUmVnaXN0ZXIpKHVpbnQ4X3QgbWFzaywgdWludDhfdCogcF9wbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYmFjayk7Ci0gICAgdWludDE2X3QgKCpCVE1fR2V0SENJQ29ubkhhbmRsZSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0gICAgdm9pZCAoKkJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQpKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCBwYXJhbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcGFyYW1fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1ZTQ19DTVBMX0NCKiBwX2NiKTsKLSAgICB2b2lkICgqQUNMX1JlZ2lzdGVyQ2xpZW50KShzdHJ1Y3QgYWNsX2NsaWVudF9jYWxsYmFja19zKiBjYWxsYmFja3MpOwotICAgIHZvaWQgKCpBQ0xfVW5yZWdpc3RlckNsaWVudCkoc3RydWN0IGFjbF9jbGllbnRfY2FsbGJhY2tfcyogY2FsbGJhY2tzKTsKLSAgICB2b2lkICgqYnRtX2luaXQpKCk7Ci0gICAgdm9pZCAoKmJ0bV9mcmVlKSgpOwotICAgIHZvaWQgKCpidG1fYmxlX2luaXQpKCk7Ci0gICAgdm9pZCAoKmJ0bV9ibGVfZnJlZSkoKTsKLSAgICB2b2lkICgqQlRNX3Jlc2V0X2NvbXBsZXRlKSgpOwotICB9IGxpZmVjeWNsZTsKLQotICBzdHJ1Y3QgewotICAgIC8vIFNlcnZlciBjaGFubmVsIG51bWJlcgotICAgIHVpbnQ4X3QgKCpCVE1fQWxsb2NhdGVTQ04pKHZvaWQpOwotICAgIGJvb2wgKCpCVE1fVHJ5QWxsb2NhdGVTQ04pKHVpbnQ4X3Qgc2NuKTsKLSAgICBib29sICgqQlRNX0ZyZWVTQ04pKHVpbnQ4X3Qgc2NuKTsKLSAgfSBzY247Ci0KLSAgLy8gTmVpZ2hib3IKLSAgc3RydWN0IHsKLSAgICB2b2lkICgqQlRNX0NhbmNlbElucXVpcnkpKCk7Ci0gICAgdEJUTV9JTlFfSU5GTyogKCpCVE1fSW5xRGJOZXh0KSh0QlRNX0lOUV9JTkZPKiBwX2N1cik7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fQ2xlYXJJbnFEYikoY29uc3QgUmF3QWRkcmVzcyogcF9iZGEpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldERpc2NvdmVyYWJpbGl0eSkodWludDE2X3QgaW5xX21vZGUpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldENvbm5lY3RhYmlsaXR5KSh1aW50MTZfdCBwYWdlX21vZGUpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1N0YXJ0SW5xdWlyeSkodEJUTV9JTlFfUkVTVUxUU19DQiogcF9yZXN1bHRzX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NtcGxfY2IpOwotICAgIHVpbnQxNl90ICgqQlRNX0lzSW5xdWlyeUFjdGl2ZSkodm9pZCk7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fU2V0SW5xdWlyeU1vZGUpKHVpbnQ4X3QgbW9kZSk7Ci0gICAgdm9pZCAoKkJUTV9FbmFibGVJbnRlcmxhY2VkSW5xdWlyeVNjYW4pKCk7Ci0gICAgdm9pZCAoKkJUTV9FbmFibGVJbnRlcmxhY2VkUGFnZVNjYW4pKCk7Ci0gIH0gbmVpZ2hib3I7Ci0KLSAgLy8gQWNsIHBlZXIgYW5kIGxpZmVjeWNsZQotICBzdHJ1Y3QgewotICAgIHN0cnVjdCB7Ci0gICAgICBib29sICgqU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICB9IGZlYXR1cmVzOwotCi0gICAgYm9vbCAoKkJUTV9Jc0FjbENvbm5lY3Rpb25VcCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0gICAgYm9vbCAoKkJUTV9SZWFkQ29ubmVjdGVkVHJhbnNwb3J0QWRkcmVzcykoUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fQ2FuY2VsUmVtb3RlRGV2aWNlTmFtZSkodm9pZCk7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fUmVhZFJlbW90ZURldmljZU5hbWUpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotICAgIHVpbnQ4X3QqICgqQlRNX1JlYWRSZW1vdGVGZWF0dXJlcykoY29uc3QgUmF3QWRkcmVzcyYpOwotICAgIHZvaWQgKCpCVE1fUmVhZERldkluZm8pKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFKiBwX2Rldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSk7Ci0gICAgdWludDE2X3QgKCpCVE1fR2V0TWF4UGFja2V0U2l6ZSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0gICAgYm9vbCAoKkJUTV9SZWFkUmVtb3RlVmVyc2lvbikoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCogbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIG1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKTsKLSAgfSBwZWVyOwotCi0gIHN0cnVjdCB7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fR2V0Um9sZSkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9ST0xFKiBwX3JvbGUpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldFBvd2VyTW9kZSkodWludDhfdCBwbV9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fUE1fUFdSX01EKiBwX21vZGUpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldFNzclBhcmFtcykoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWF4X2xhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sIHVpbnQxNl90IG1pbl9sb2NfdG8pOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyKTsKLSAgICB2b2lkICgqQlRNX2Jsb2NrX3JvbGVfc3dpdGNoX2ZvcikoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKTsKLSAgICB2b2lkICgqQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yKShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotICAgIHZvaWQgKCpCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoKSgpOwotICAgIHZvaWQgKCpCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9mb3IpKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik7Ci0gICAgdm9pZCAoKkJUTV91bmJsb2NrX3NuaWZmX21vZGVfZm9yKShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpOwotICAgIHZvaWQgKCpCVE1fV3JpdGVQYWdlVGltZW91dCkodWludDE2X3QgdGltZW91dCk7Ci0gIH0gbGlua19wb2xpY3k7Ci0KLSAgc3RydWN0IHsKLSAgICB0QlRNX1NUQVRVUyAoKkJUTV9HZXRMaW5rU3VwZXJUb3V0KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3RpbWVvdXQpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1JlYWRSU1NJKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRNX0NNUExfQ0IqIHBfY2IpOwotICB9IGxpbmtfY29udHJvbGxlcjsKLQotICBzdHJ1Y3QgewotICAgIGJvb2wgKCpCVE1fU2VjQWRkRGV2aWNlKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRF9OQU1FIGJkX25hbWUsIHVpbnQ4X3QqIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rS2V5KiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fbGVuZ3RoKTsKLSAgICBib29sICgqQlRNX1NlY0FkZFJtdE5hbWVOb3RpZnlDYWxsYmFjaykodEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjayk7Ci0gICAgYm9vbCAoKkJUTV9TZWNEZWxldGVEZXZpY2UpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIGJvb2wgKCpCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWMpKAotICAgICAgICB0QlRNX1JNVF9OQU1FX0NBTExCQUNLKiBwX2NhbGxiYWNrKTsKLSAgICBib29sICgqQlRNX1NlY1JlZ2lzdGVyKShjb25zdCB0QlRNX0FQUExfSU5GTyogcF9jYl9pbmZvKTsKLSAgICBjaGFyKiAoKkJUTV9TZWNSZWFkRGV2TmFtZSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fU2VjQm9uZCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlLCB1aW50OF90IHBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9waW4pOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NlY0JvbmRDYW5jZWwpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHZvaWQgKCpCVE1fU2VjQWRkQmxlS2V5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpOwotICAgIHZvaWQgKCpCVE1fU2VjQWRkQmxlRGV2aWNlKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSk7Ci0gICAgdm9pZCAoKkJUTV9TZWNDbGVhclNlY3VyaXR5RmxhZ3MpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICAgIHVpbnQ4X3QgKCpCVE1fU2VjQ2xyU2VydmljZSkodWludDhfdCBzZXJ2aWNlX2lkKTsKLSAgICB1aW50OF90ICgqQlRNX1NlY0NsclNlcnZpY2VCeVBzbSkodWludDE2X3QgcHNtKTsKLSAgICB2b2lkICgqQlRNX1JlbW90ZU9vYkRhdGFSZXBseSkodEJUTV9TVEFUVVMgcmVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKTsKLSAgICB2b2lkICgqQlRNX1BJTkNvZGVSZXBseSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9TVEFUVVMgcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW4sIHVpbnQ4X3QqIHBfcGluKTsKLSAgICB2b2lkICgqQlRNX0NvbmZpcm1SZXFSZXBseSkodEJUTV9TVEFUVVMgcmVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICBib29sICgqQlRNX1NlY0RlbGV0ZVJtdE5hbWVOb3RpZnlDYWxsYmFjaykoCi0gICAgICAgIHRCVE1fUk1UX05BTUVfQ0FMTEJBQ0sqIHBfY2FsbGJhY2spOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldEVuY3J5cHRpb24pKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpOwotICAgIGJvb2wgKCpCVE1fSXNFbmNyeXB0ZWQpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLSAgICBib29sICgqQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgICBib29sICgqQlRNX0lzTGlua0tleUtub3duKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLSAgfSBzZWN1cml0eTsKLQotICBzdHJ1Y3QgewotICAgIHRCVE1fU1RBVFVTICgqQlRNX0JsZUdldEVuZXJneUluZm8pKHRCVE1fQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBjYWxsYmFjayk7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fQmxlT2JzZXJ2ZSkoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NtcGxfY2IpOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldEJsZURhdGFMZW5ndGgpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHhfcGR1X2xlbmd0aCk7Ci0gICAgdm9pZCAoKkJUTV9CbGVDb25maXJtUmVwbHkpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVzKTsKLSAgICB2b2lkICgqQlRNX0JsZUxvYWRMb2NhbEtleXMpKHVpbnQ4X3Qga2V5X3R5cGUsIHRCVE1fQkxFX0xPQ0FMX0tFWVMqIHBfa2V5KTsKLSAgICB2b2lkICgqQlRNX0JsZVBhc3NrZXlSZXBseSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpOwotICAgIHZvaWQgKCpCVE1fQmxlUmVhZENvbnRyb2xsZXJGZWF0dXJlcykoCi0gICAgICAgIHRCVE1fQkxFX0NUUkxfRkVBVFVSRVNfQ0JBQ0sqIHBfdnNjX2NiYWNrKTsKLSAgICB2b2lkICgqQlRNX0JsZVNldENvbm5TY2FuUGFyYW1zKSh1aW50MzJfdCBzY2FuX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYW5fd2luZG93KTsKLSAgICB2b2lkICgqQlRNX0JsZVNldFBoeSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCB0eF9waHlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ4X3BoeXMsIHVpbnQxNl90IHBoeV9vcHRpb25zKTsKLSAgICB2b2lkICgqQlRNX0JsZVNldFByZWZDb25uUGFyYW1zKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQpOwotICAgIGJvb2wgKCpCVE1fVXNlTGVMaW5rKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgfSBibGU7Ci0KLSAgc3RydWN0IHsKLSAgICB0QlRNX1NUQVRVUyAoKkJUTV9DcmVhdGVTY28pKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJvb2wgaXNfb3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBrdF90eXBlcywgdWludDE2X3QqIHBfc2NvX2lueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0NPX0NCKiBwX2Nvbm5fY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NDT19DQiogcF9kaXNjX2NiKTsKLSAgICB0QlRNX1NUQVRVUyAoKkJUTV9SZWdGb3JFU2NvRXZ0cykodWludDE2X3Qgc2NvX2lueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9FU0NPX0NCQUNLKiBwX2VzY29fY2JhY2spOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1JlbW92ZVNjbykodWludDE2X3Qgc2NvX2lueCk7Ci0gICAgdm9pZCAoKkJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MpKHVpbnQxNl90IHNldHRpbmdzKTsKLSAgICB2b2lkICgqQlRNX0VTY29Db25uUnNwKSh1aW50MTZfdCBzY29faW54LCB1aW50OF90IGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFybXMpOwotICAgIHVpbnQ4X3QgKCpCVE1fR2V0TnVtU2NvTGlua3MpKCk7Ci0gICAgdEJUTV9TVEFUVVMgKCpCVE1fU2V0RVNjb01vZGUpKGVuaF9lc2NvX3BhcmFtc190KiBwX3Bhcm1zKTsKLSAgfSBzY287Ci0KLSAgc3RydWN0IHsKLSAgICB0QlRNX1NUQVRVUyAoKkJUTV9SZWFkTG9jYWxEZXZpY2VOYW1lRnJvbUNvbnRyb2xsZXIpKAotICAgICAgICB0QlRNX0NNUExfQ0IqIHBfcmxuX2NtcGxfY2JhY2spOwotICAgIHRCVE1fU1RBVFVTICgqQlRNX1NldExvY2FsRGV2aWNlTmFtZSkoY29uc3QgY2hhciogcF9uYW1lKTsKLSAgICB0QlRNX1NUQVRVUyAoKkJUTV9TZXREZXZpY2VDbGFzcykoREVWX0NMQVNTIGRldl9jbGFzcyk7Ci0gICAgYm9vbCAoKkJUTV9Jc0RldmljZVVwKSgpOwotICAgIHVpbnQ4X3QqICgqQlRNX1JlYWREZXZpY2VDbGFzcykoKTsKLSAgfSBsb2NhbDsKLQotICBzdHJ1Y3QgewotICAgIHRCVE1fU1RBVFVTICgqQlRNX1dyaXRlRUlSKShCVF9IRFIqIHBfYnVmZik7Ci0gICAgdWludDhfdCAoKkJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcykodWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQ4X3QqKiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X251bV91dWlkMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fdXVpZDE2KTsKLSAgICB1aW50OF90ICgqQlRNX0dldEVpclV1aWRMaXN0KShjb25zdCB1aW50OF90KiBwX2Vpciwgc2l6ZV90IGVpcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1dWlkX3NpemUsIHVpbnQ4X3QqIHBfbnVtX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF91dWlkX2xpc3QsIHVpbnQ4X3QgbWF4X251bV91dWlkKTsKLSAgICB2b2lkICgqQlRNX0FkZEVpclNlcnZpY2UpKHVpbnQzMl90KiBwX2Vpcl91dWlkLCB1aW50MTZfdCB1dWlkMTYpOwotICAgIHZvaWQgKCpCVE1fUmVtb3ZlRWlyU2VydmljZSkodWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNik7Ci0gIH0gZWlyOwotCi0gIHN0cnVjdCB7Ci0gICAgdEJUTV9JTlFfSU5GTyogKCpCVE1fSW5xRGJSZWFkKShjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSk7Ci0gICAgdEJUTV9JTlFfSU5GTyogKCpCVE1fSW5xRGJGaXJzdCkoKTsKLSAgICB0QlRNX0lOUV9JTkZPKiAoKkJUTV9JbnFEYk5leHQpKHRCVE1fSU5RX0lORk8qIHBfY3VyKTsKLSAgICB0QlRNX1NUQVRVUyAoKkJUTV9DbGVhcklucURiKShjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSk7Ci0gIH0gZGI7Ci19OwotCi1zdHJ1Y3QgYnRtX2NsaWVudF9pbnRlcmZhY2VfcyYgZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCk7CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2J0bV9pc29fYXBpLmggYi9zdGFjay9pbmNsdWRlL2J0bV9pc29fYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGE5Y2YuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idG1faXNvX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0bV9pc29fYXBpX3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci1uYW1lc3BhY2UgaXNvX21hbmFnZXIgewotc3RydWN0IENpZ0NhbGxiYWNrcyB7Ci0gIHZpcnR1YWwgfkNpZ0NhbGxiYWNrcygpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE9uU2V0dXBJc29EYXRhUGF0aCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaWdfaWQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUmVtb3ZlSXNvRGF0YVBhdGgodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNpZ19pZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25Jc29MaW5rUXVhbGl0eVJlYWQoCi0gICAgICB1aW50OF90IGNvbm5faGFuZGxlLCB1aW50OF90IGNpZ19pZCwgdWludDMyX3QgdHhVbmFja2VkUGFja2V0cywKLSAgICAgIHVpbnQzMl90IHR4Rmx1c2hlZFBhY2tldHMsIHVpbnQzMl90IHR4TGFzdFN1YmV2ZW50UGFja2V0cywKLSAgICAgIHVpbnQzMl90IHJldHJhbnNtaXR0ZWRQYWNrZXRzLCB1aW50MzJfdCBjcmNFcnJvclBhY2tldHMsCi0gICAgICB1aW50MzJfdCByeFVucmVjZWl2ZWRQYWNrZXRzLCB1aW50MzJfdCBkdXBsaWNhdGVQYWNrZXRzKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uQ2lzRXZlbnQodWludDhfdCBldmVudCwgdm9pZCogZGF0YSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25DaWdFdmVudCh1aW50OF90IGV2ZW50LCB2b2lkKiBkYXRhKSA9IDA7Ci19OwotCi1zdHJ1Y3QgQmlnQ2FsbGJhY2tzIHsKLSAgdmlydHVhbCB+QmlnQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIHZvaWQgT25TZXR1cElzb0RhdGFQYXRoKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBjb25uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJpZ19pZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25SZW1vdmVJc29EYXRhUGF0aCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmlnX2lkKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uQmlnRXZlbnQodWludDhfdCBldmVudCwgdm9pZCogZGF0YSkgPSAwOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBpc29fbWFuYWdlcgotCi1jbGFzcyBJc29NYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIElzb01hbmFnZXIoKTsKLSAgSXNvTWFuYWdlcihjb25zdCBJc29NYW5hZ2VyJikgPSBkZWxldGU7Ci0gIElzb01hbmFnZXImIG9wZXJhdG9yPShjb25zdCBJc29NYW5hZ2VyJikgPSBkZWxldGU7Ci0KLSAgdmlydHVhbCB+SXNvTWFuYWdlcigpOwotCi0gIHN0YXRpYyBJc29NYW5hZ2VyKiBHZXRJbnN0YW5jZSgpIHsKLSAgICBzdGF0aWMgSXNvTWFuYWdlciogaW5zdGFuY2UgPSBuZXcgSXNvTWFuYWdlcigpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgQ0lHIGFuZCBDSVMgcmVsYXRlZCBjYWxsYmFja3MKLSAgICoKLSAgICogPHA+IFNoYWxsIGJlIHNldCBieSB0aGUgTGUgQXVkaW8gVW5pY2FzdGVyIGltcGxlbWVudGF0aW9uCi0gICAqCi0gICAqIEBwYXJhbSBjYWxsYmFja3MgQ2lnQ2FsbGJhY2tzIGltcGxlbWVudGF0aW9uCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJDaWdDYWxsYmFja3MoaXNvX21hbmFnZXI6OkNpZ0NhbGxiYWNrcyogY2FsbGJhY2tzKSBjb25zdDsKLQotICAvKioKLSAgICogU2V0IEJJRyByZWxhdGVkIGNhbGxiYWNrcwotICAgKgotICAgKiA8cD4gU2hhbGwgYmUgc2V0IGJ5IHRoZSBMZSBBdWRpbyBCcm9hZGNhc3RlciBpbXBsZW1lbnRhdGlvbgotICAgKgotICAgKiBAcGFyYW0gY2FsbGJhY2tzIEJpZ0NhbGxiYWNrcyBpbXBsZW1lbnRhdGlvbgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQmlnQ2FsbGJhY2tzKGlzb19tYW5hZ2VyOjpCaWdDYWxsYmFja3MqIGNhbGxiYWNrcykgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgY29ubmVjdGVkIGlzb2Nocm9ub3VzIGdyb3VwIChDSUcpIGFjY29yZGluZyB0byBnaXZlbiBwYXJhbXMuCi0gICAqCi0gICAqIEBwYXJhbSBjaWdfaWQgY29ubmVjdGVkIGlzb2Nocm9ub3VzIGdyb3VwIGlkCi0gICAqIEBwYXJhbSBjaWdfcGFyYW1zIENJRyBwYXJhbWV0ZXJzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQ3JlYXRlQ2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMgY2lnX3BhcmFtcyk7Ci0KLSAgLyoqCi0gICAqIFJlY29uZmlndXJlcyBjb25uZWN0ZWQgaXNvY2hyb25vdXMgZ3JvdXAgKENJRykgYWNjb3JkaW5nIHRvIGdpdmVuIHBhcmFtcy4KLSAgICoKLSAgICogQHBhcmFtIGNpZ19pZCBjb25uZWN0ZWQgaXNvY2hyb25vdXMgZ3JvdXAgaWQKLSAgICogQHBhcmFtIGNpZ19wYXJhbXMgQ0lHIHBhcmFtZXRlcnMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBSZWNvbmZpZ3VyZUNpZyh1aW50OF90IGNpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMgY2lnX3BhcmFtcyk7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlcyByZW1vdmluZyBvZiBjb25uZWN0ZWQgaXNvY2hyb25vdXMgZ3JvdXAgKENJRykuCi0gICAqCi0gICAqIEBwYXJhbSBjaWdfaWQgY29ubmVjdGVkIGlzb2Nocm9ub3VzIGdyb3VwIGlkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQ2lnKHVpbnQ4X3QgY2lnX2lkKTsKLQotICAvKioKLSAgICogSW5pdGlhdGVzIGNyZWF0aW9uIG9mIGNvbm5lY3RlZCBpc29jaHJvbm91cyBzdHJlYW0gKENJUykuCi0gICAqCi0gICAqIEBwYXJhbSBjb25uX3BhcmFtcyBBIHNldCBvZiBjaXMgYW5kIGFjbCBjb25uZWN0aW9uIGhhbmRsZXMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBFc3RhYmxpc2hDaXMoCi0gICAgICBzdHJ1Y3QgaXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIGNvbm5fcGFyYW1zKTsKLQotICAvKioKLSAgICogSW5pdGlhdGVzIGRpc2Nvbm5lY3Rpb24gb2YgY29ubmVjdGVkIGlzb2Nocm9ub3VzIHN0cmVhbSAoQ0lTKS4KLSAgICoKLSAgICogQHBhcmFtIGNvbm5faGFuZGxlIENJUyBjb25uZWN0aW9uIGhhbmRsZQotICAgKiBAcGFyYW0gcmVhc29uIEhDSSByZWFzb24gZm9yIGRpc2Nvbm5lY3Rpb24KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0Q2lzKHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IHJlYXNvbik7Ci0KLSAgLyoqCi0gICAqIEluaXRpYXRlcyBjcmVhdGlvbiBvZiBpc29jaHJvbm91cyBkYXRhIHBhdGggZm9yIGNvbm5lY3RlZCBpc29jaHJvbm91cwotICAgKiBzdHJlYW0uCi0gICAqCi0gICAqIEBwYXJhbSBjb25uX2hhbmRsZSBoYW5kbGUgb2YgQklTIG9yIENJUyBjb25uZWN0aW9uCi0gICAqIEBwYXJhbSBwYXRoX3BhcmFtcyBpc28gZGF0YSBwYXRoIHBhcmFtZXRlcnMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXR1cElzb0RhdGFQYXRoKAotICAgICAgdWludDE2X3QgY29ubl9oYW5kbGUsCi0gICAgICBzdHJ1Y3QgaXNvX21hbmFnZXI6Omlzb19kYXRhX3BhdGhfcGFyYW1zIHBhdGhfcGFyYW1zKTsKLQotICAvKioKLSAgICogSW5pdGlhdGVzIHJlbW92YWwgb2YgaXNvY2hyb25vdXMgZGF0YSBwYXRoIGZvciBjb25uZWN0ZWQgaXNvY2hyb25vdXMKLSAgICogc3RyZWFtLgotICAgKgotICAgKiBAcGFyYW0gY29ubl9oYW5kbGUgaGFuZGxlIG9mIEJJUyBvciBDSVMgY29ubmVjdGlvbgotICAgKiBAcGFyYW0gZGF0YV9wYXRoX2RpciBpc28gZGF0YSBwYXRoIGRpcmVjdGlvbgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFJlbW92ZUlzb0RhdGFQYXRoKHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IGRhdGFfcGF0aF9kaXIpOwotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgSVNPIGxpbmsgcXVhbGl0eS4gT25Jc29MaW5rUXVhbGl0eVJlYWQgY2FsbGJhY2sgaXMgaW52b2tlZCBvbmx5Ci0gICAqIGlmIHJlYWQgaXMgc3VjY2Vzc2Z1bC4KLSAgICoKLSAgICogQHBhcmFtIGNvbm5faGFuZGxlIGhhbmRsZSBvZiBJU08gY29ubmVjdGlvbgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFJlYWRJc29MaW5rUXVhbGl0eSh1aW50MTZfdCBjb25uX2hhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIFNlbmRzIGlzbyBkYXRhIHRvIHRoZSBjb250cm9sbGVyCi0gICAqCi0gICAqIEBwYXJhbSBjb25uX2hhbmRsZSBoYW5kbGUgb2YgQklTIG9yIENJUyBjb25uZWN0aW9uCi0gICAqIEBwYXJhbSBkYXRhIGRhdGEgYnVmZmVyLiBUaGUgb3duZXJzaGlwIG9mIGRhdGEgaXMgbm90IGJlaW5nIHRyYW5zZmVycmVkLgotICAgKiBAcGFyYW0gZGF0YV9sZW4gZGF0YSBidWZmZXIgbGVuZ3RoCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgU2VuZElzb0RhdGEodWludDE2X3QgY29ubl9oYW5kbGUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2xlbik7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIEJyb2FkY2FzdCBJc29jaHJvbm91cyBHcm91cAotICAgKgotICAgKiBAcGFyYW0gYmlnX2lkIGhvc3QgYXNzaWduZWQgQklHIGlkZW50aWZpZXIKLSAgICogQHBhcmFtIGJpZ19wYXJhbXMgQklHIHBhcmFtZXRlcnMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBDcmVhdGVCaWcodWludDhfdCBiaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzb19tYW5hZ2VyOjpiaWdfY3JlYXRlX3BhcmFtcyBiaWdfcGFyYW1zKTsKLQotICAvKioKLSAgICogVGVybWluYXRlcyB0aGUgQnJvYWRjYXN0IElzb2Nocm9ub3VzIEdyb3VwCi0gICAqCi0gICAqIEBwYXJhbSBiaWdfaWQgaG9zdCBhc3NpZ25lZCBCSUcgaWRlbnRpZmllcgotICAgKiBAcGFyYW0gcmVhc29uIHRlcm1pbmF0aW9uIHJlYXNvbiBkYXRhCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgVGVybWluYXRlQmlnKHVpbnQ4X3QgYmlnX2lkLCB1aW50OF90IHJlYXNvbik7Ci0KLSAgLyogQmVsb3cgYXJlIGRlZmluZWQgaGFuZGxlcnMgY2FsbGVkIGJ5IHRoZSBsZWdhY3kgY29kZSBpbiBidHVfaGNpZi5jYyAqLwotCi0gIC8qKgotICAgKiBIYW5kbGVzIElzbyBEYXRhIHBhY2tldHMgZnJvbSB0aGUgY29udHJvbGxlcgotICAgKgotICAgKiBAcGFyYW0gcF9tc2cgcmF3IGRhdGEgcGFja2V0LiBUaGUgb3duZXJzaGlwIG9mIHBfbXNnIGlzIG5vdCBiZWluZwotICAgKiB0cmFuc2ZlcnJlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVJc29EYXRhKHZvaWQqIHBfbXNnKTsKLQotICAvKioKLSAgICogSGFuZGxlcyBkaXNjb25uZWN0IEhDSSBldmVudAotICAgKgotICAgKiA8cD4gVGhpcyBjYWxsYmFjayBjYW4gYmUgY2FsbGVkIHdpdGggaGFuZGxlcyBvdGhlciB0aGFuIElTTyBjb25uZWN0aW9uCi0gICAqIGhhbmRsZXMuCi0gICAqCi0gICAqIEBwYXJhbSBjb25uX2hhbmRsZSBjb25uZWN0aW9uIGhhbmRsZQotICAgKiBAcGFyYW0gcmVhc29uIEhDSSByZWFzb24gZm9yIGRpc2Nvbm5lY3Rpb24KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVEaXNjb25uZWN0KHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IHJlYXNvbik7Ci0KLSAgLyoqCi0gICAqIEhhbmRsZXMgSENJIGV2ZW50IGZvciB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCBwYWNrZXRzCi0gICAqCi0gICAqIEBwYXJhbSBwIHJhdyBwYWNrZXQgYnVmZmVyIGZvciB0aGUgZXZlbnQuIFRoZSBvd25lcnNoaXAgb2YgcCBpcyBub3QgYmVpbmcKLSAgICogdHJhbnNmZXJyZWQuCi0gICAqIEBwYXJhbSBldnRfbGVuIGV2ZW50IHBhY2tldCBidWZmZXIgbGVuZ3RoCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgSGFuZGxlTnVtQ29tcGxEYXRhUGt0cyh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pOwotICB2aXJ0dWFsIHZvaWQgSGFuZGxlR2ROdW1Db21wbERhdGFQa3RzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY3JlZGl0cyk7Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSBDSVMgYW5kIEJJRyByZWxhdGVkIEhDSSBldmVudHMKLSAgICoKLSAgICogQHBhcmFtIHN1Yl9jb2RlIGJsZSBzdWJjb2RlIGZvciB0aGUgSENJIGV2ZW50Ci0gICAqIEBwYXJhbSBwYXJhbXMgcmF3IHBhY2tldCBidWZmZXIgZm9yIHRoZSBldmVudC4gVGhlIG93bmVyc2hpcCBvZiBwYXJhbXMgaXMKLSAgICogbm90IGJlaW5nIHRyYW5zZmVycmVkCi0gICAqIEBwYXJhbSBsZW5ndGggZXZlbnQgcGFja2V0IGJ1ZmZlciBsZW5ndGgKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVIY2lFdmVudCh1aW50OF90IHN1Yl9jb2RlLCB1aW50OF90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgpOwotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIElzb01hbmFnZXIgbW9kdWxlCi0gICAqLwotICB2b2lkIFN0YXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBJc29NYW5hZ2VyIG1vZHVsZQotICAgKi8KLSAgdm9pZCBTdG9wKCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgaW1wbDsKLSAgc3RkOjp1bmlxdWVfcHRyPGltcGw+IHBpbXBsXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2kKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvYnRtX2lzb19hcGlfdHlwZXMuaCBiL3N0YWNrL2luY2x1ZGUvYnRtX2lzb19hcGlfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhMjUzZS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2J0bV9pc29fYXBpX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiaGNpbXNncy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29Db2RpbmdGb3JtYXRMYzMgPSAweDA2OwotY29uc3RleHByIHVpbnQ4X3Qga0lzb0NvZGluZ0Zvcm1hdFZlbmRvclNwZWNpZmljID0gMHhGRjsKLQotY29uc3RleHByIHVpbnQ4X3Qga0lzb0NpZ1BhY2tpbmdTZXF1ZW50aWFsID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29DaWdQYWNraW5nSW50ZXJsZWF2ZWQgPSAweDAxOwotCi1jb25zdGV4cHIgdWludDhfdCBrSXNvQ2lnRnJhbWluZ1VuZnJhbWVkID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29DaWdGcmFtaW5nRnJhbWVkID0gMHgwMTsKLQotY29uc3RleHByIHVpbnQ4X3Qga0lzb0NpZ1BoeTFNID0gMHgwMTsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29DaWdQaHkyTSA9IDB4MDI7Ci1jb25zdGV4cHIgdWludDhfdCBrSXNvQ2lnUGh5QyA9IDB4MDQ7Ci0KLW5hbWVzcGFjZSBpc29fbWFuYWdlciB7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtJc29EYXRhUGF0aERpcmVjdGlvbkluID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29EYXRhUGF0aERpcmVjdGlvbk91dCA9IDB4MDE7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtJc29EYXRhUGF0aEhjaSA9IDB4MDA7Ci1jb25zdGV4cHIgdWludDhfdCBrSXNvRGF0YVBhdGhEaXNhYmxlZCA9IDB4RkY7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtJc29TY2EyNTFUbzUwMFBwbSA9IDB4MDA7Ci1jb25zdGV4cHIgdWludDhfdCBrSXNvU2NhMTUxVG8yNTBQcG0gPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3Qga0lzb1NjYTEwMVRvMTUwUHBtID0gMHgwMjsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29TY2E3NlRvMTAwUHBtID0gMHgwMzsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29TY2E1MVRvNzVQcG0gPSAweDA0OwotY29uc3RleHByIHVpbnQ4X3Qga0lzb1NjYTMxVG81MFBwbSA9IDB4MDU7Ci1jb25zdGV4cHIgdWludDhfdCBrSXNvU2NhMjFUbzMwUHBtID0gMHgwNjsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29TY2EwVG8yMFBwbSA9IDB4MDc7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtJc29FdmVudENpc0RhdGFBdmFpbGFibGUgPSAweDAwOwotY29uc3RleHByIHVpbnQ4X3Qga0lzb0V2ZW50Q2lzRXN0YWJsaXNoQ21wbCA9IDB4MDE7Ci1jb25zdGV4cHIgdWludDhfdCBrSXNvRXZlbnRDaXNEaXNjb25uZWN0ZWQgPSAweDAyOwotCi1jb25zdGV4cHIgdWludDhfdCBrSXNvRXZlbnRDaWdPbkNyZWF0ZUNtcGwgPSAweDAwOwotY29uc3RleHByIHVpbnQ4X3Qga0lzb0V2ZW50Q2lnT25SZWNvbmZpZ3VyZUNtcGwgPSAweDAxOwotY29uc3RleHByIHVpbnQ4X3Qga0lzb0V2ZW50Q2lnT25SZW1vdmVDbXBsID0gMHgwMjsKLQotY29uc3RleHByIHVpbnQ4X3Qga0lzb0V2ZW50QmlnT25DcmVhdGVDbXBsID0gMHgwMDsKLWNvbnN0ZXhwciB1aW50OF90IGtJc29FdmVudEJpZ09uVGVybWluYXRlQ21wbCA9IDB4MDE7Ci0KLXN0cnVjdCBjaWdfY3JlYXRlX3BhcmFtcyB7Ci0gIHVpbnQzMl90IHNkdV9pdHZfbXRvczsKLSAgdWludDMyX3Qgc2R1X2l0dl9zdG9tOwotICB1aW50OF90IHNjYTsKLSAgdWludDhfdCBwYWNraW5nOwotICB1aW50OF90IGZyYW1pbmc7Ci0gIHVpbnQxNl90IG1heF90cmFuc19sYXRfc3RvbTsKLSAgdWludDE2X3QgbWF4X3RyYW5zX2xhdF9tdG9zOwotICBzdGQ6OnZlY3RvcjxFWFRfQ0lTX0NGRz4gY2lzX2NmZ3M7Ci19OwotCi1zdHJ1Y3QgY2lnX3JlbW92ZV9jbXBsX2V2dCB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50OF90IGNpZ19pZDsKLX07Ci0KLXN0cnVjdCBjaWdfY3JlYXRlX2NtcGxfZXZ0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY29ubl9oYW5kbGVzOwotfTsKLQotc3RydWN0IGNpc19kYXRhX2V2dCB7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50MTZfdCBjaXNfY29ubl9oZGw7Ci0gIHVpbnQzMl90IHRzOwotICB1aW50MTZfdCBldnRfbG9zdDsKLSAgQlRfSERSKiBwX21zZzsKLX07Ci0KLXN0cnVjdCBjaXNfZXN0YWJsaXNoX3BhcmFtcyB7Ci0gIHN0ZDo6dmVjdG9yPEVYVF9DSVNfQ1JFQVRFX0NGRz4gY29ubl9wYWlyczsKLX07Ci0KLXN0cnVjdCBjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQ4X3QgY2lnX2lkOwotICB1aW50MTZfdCBjaXNfY29ubl9oZGw7Ci0gIHVpbnQzMl90IGNpZ19zeW5jX2RlbGF5OwotICB1aW50MzJfdCBjaXNfc3luY19kZWxheTsKLSAgdWludDMyX3QgdHJhbnNfbGF0X210b3M7Ci0gIHVpbnQzMl90IHRyYW5zX2xhdF9zdG9tOwotICB1aW50OF90IHBoeV9tdG9zOwotICB1aW50OF90IHBoeV9zdG9tOwotICB1aW50OF90IG5zZTsKLSAgdWludDhfdCBibl9tdG9zOwotICB1aW50OF90IGJuX3N0b207Ci0gIHVpbnQ4X3QgZnRfbXRvczsKLSAgdWludDhfdCBmdF9zdG9tOwotICB1aW50MTZfdCBtYXhfcGR1X210b3M7Ci0gIHVpbnQxNl90IG1heF9wZHVfc3RvbTsKLSAgdWludDE2X3QgaXNvX2l0djsKLX07Ci0KLXN0cnVjdCBjaXNfZGlzY29ubmVjdGVkX2V2dCB7Ci0gIHVpbnQ4X3QgcmVhc29uOwotICB1aW50OF90IGNpZ19pZDsKLSAgdWludDE2X3QgY2lzX2Nvbm5faGRsOwotfTsKLQotc3RydWN0IGJpZ19jcmVhdGVfcGFyYW1zIHsKLSAgdWludDhfdCBhZHZfaGFuZGxlOwotICB1aW50OF90IG51bV9iaXM7Ci0gIHVpbnQzMl90IHNkdV9pdHY7Ci0gIHVpbnQxNl90IG1heF9zZHVfc2l6ZTsKLSAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5OwotICB1aW50OF90IHJ0bjsKLSAgdWludDhfdCBwaHk7Ci0gIHVpbnQ4X3QgcGFja2luZzsKLSAgdWludDhfdCBmcmFtaW5nOwotICB1aW50OF90IGVuYzsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gZW5jX2NvZGU7Ci19OwotCi1zdHJ1Y3QgYmlnX2NyZWF0ZV9jbXBsX2V2dCB7Ci0gIHVpbnQ4X3Qgc3RhdHVzOwotICB1aW50OF90IGJpZ19pZDsKLSAgdWludDMyX3QgYmlnX3N5bmNfZGVsYXk7Ci0gIHVpbnQzMl90IHRyYW5zcG9ydF9sYXRlbmN5X2JpZzsKLSAgdWludDhfdCBwaHk7Ci0gIHVpbnQ4X3QgbnNlOwotICB1aW50OF90IGJuOwotICB1aW50OF90IHB0bzsKLSAgdWludDhfdCBpcmM7Ci0gIHVpbnQxNl90IG1heF9wZHU7Ci0gIHVpbnQxNl90IGlzb19pbnRlcnZhbDsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvbm5faGFuZGxlczsKLX07Ci0KLXN0cnVjdCBiaWdfdGVybWluYXRlX2NtcGxfZXZ0IHsKLSAgdWludDhfdCBiaWdfaWQ7Ci0gIHVpbnQ4X3QgcmVhc29uOwotfTsKLQotc3RydWN0IGlzb19kYXRhX3BhdGhfcGFyYW1zIHsKLSAgdWludDhfdCBkYXRhX3BhdGhfZGlyOwotICB1aW50OF90IGRhdGFfcGF0aF9pZDsKLSAgdWludDhfdCBjb2RlY19pZF9mb3JtYXQ7Ci0gIHVpbnQxNl90IGNvZGVjX2lkX2NvbXBhbnk7Ci0gIHVpbnQxNl90IGNvZGVjX2lkX3ZlbmRvcjsKLSAgdWludDMyX3QgY29udHJvbGxlcl9kZWxheTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfY29uZjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpc29fbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idG1fbG9nX2hpc3RvcnkuaCBiL3N0YWNrL2luY2x1ZGUvYnRtX2xvZ19oaXN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjFlMGIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idG1fbG9nX2hpc3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBCVE1fTG9nSGlzdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgdGFnLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKLXZvaWQgQlRNX0xvZ0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZywgY29uc3Qgc3RkOjpzdHJpbmcmIGV4dHJhKTsKLXZvaWQgQlRNX0xvZ0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKLXZvaWQgQlRNX0xvZ0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnLCBjb25zdCBzdGQ6OnN0cmluZyYgZXh0cmEpOwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmggYi9zdGFjay9pbmNsdWRlL2J0bV9zdGF0dXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1MDU3MS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2J0bV9zdGF0dXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLS8qIEJUTSBhcHBsaWNhdGlvbiByZXR1cm4gc3RhdHVzIGNvZGVzICovCi1lbnVtIDogdWludDhfdCB7Ci0gIEJUTV9TVUNDRVNTID0gMCwgICAgICAgICAvKiAwICBDb21tYW5kIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgKi8KLSAgQlRNX0NNRF9TVEFSVEVELCAgICAgICAgIC8qIDEgIENvbW1hbmQgc3RhcnRlZCBPSy4gICAgICAgICAgICAgICAqLwotICBCVE1fQlVTWSwgICAgICAgICAgICAgICAgLyogMiAgRGV2aWNlIGJ1c3kgd2l0aCBhbm90aGVyIGNvbW1hbmQgICovCi0gIEJUTV9OT19SRVNPVVJDRVMsICAgICAgICAvKiAzICBObyByZXNvdXJjZXMgdG8gaXNzdWUgY29tbWFuZCAgICAgKi8KLSAgQlRNX01PREVfVU5TVVBQT1JURUQsICAgIC8qIDQgIFJlcXVlc3QgZm9yIDEgb3IgbW9yZSB1bnN1cHBvcnRlZCBtb2RlcyAqLwotICBCVE1fSUxMRUdBTF9WQUxVRSwgICAgICAgLyogNSAgSWxsZWdhbCBwYXJhbWV0ZXIgdmFsdWUgICAgICAgICAgICovCi0gIEJUTV9XUk9OR19NT0RFLCAgICAgICAgICAvKiA2ICBEZXZpY2UgaW4gd3JvbmcgbW9kZSBmb3IgcmVxdWVzdCAgKi8KLSAgQlRNX1VOS05PV05fQUREUiwgICAgICAgIC8qIDcgIFVua25vd24gcmVtb3RlIEJEIGFkZHJlc3MgICAgICAgICAqLwotICBCVE1fREVWSUNFX1RJTUVPVVQsICAgICAgLyogOCAgRGV2aWNlIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICovCi0gIEJUTV9CQURfVkFMVUVfUkVULCAgICAgICAvKiA5ICBBIGJhZCB2YWx1ZSB3YXMgcmVjZWl2ZWQgZnJvbSBIQ0kgKi8KLSAgQlRNX0VSUl9QUk9DRVNTSU5HLCAgICAgIC8qIDEwIEdlbmVyaWMgZXJyb3IgICAgICAgICAgICAgICAgICAgICAqLwotICBCVE1fTk9UX0FVVEhPUklaRUQsICAgICAgLyogMTEgQXV0aG9yaXphdGlvbiBmYWlsZWQgICAgICAgICAgICAgICovCi0gIEJUTV9ERVZfUkVTRVQsICAgICAgICAgICAvKiAxMiBEZXZpY2UgaGFzIGJlZW4gcmVzZXQgICAgICAgICAgICAgKi8KLSAgQlRNX0NNRF9TVE9SRUQsICAgICAgICAgIC8qIDEzIHJlcXVlc3QgaXMgc3RvcmVkIGluIGNvbnRyb2wgYmxvY2sgKi8KLSAgQlRNX0lMTEVHQUxfQUNUSU9OLCAgICAgIC8qIDE0IHN0YXRlIG1hY2hpbmUgZ2V0cyBpbGxlZ2FsIGNvbW1hbmQgKi8KLSAgQlRNX0RFTEFZX0NIRUNLLCAgICAgICAgIC8qIDE1IGRlbGF5IHRoZSBjaGVjayBvbiBlbmNyeXB0aW9uICovCi0gIEJUTV9TQ09fQkFEX0xFTkdUSCwgICAgICAvKiAxNiBCYWQgU0NPIG92ZXIgSENJIGRhdGEgbGVuZ3RoICovCi0gIEJUTV9TVUNDRVNTX05PX1NFQ1VSSVRZLCAvKiAxNyBzZWN1cml0eSBwYXNzZWQsIG5vIHNlY3VyaXR5IHNldCAgKi8KLSAgQlRNX0ZBSUxFRF9PTl9TRUNVUklUWSwgIC8qIDE4IHNlY3VyaXR5IGZhaWxlZCAgICAgICAgICAgICAgICAgICAqLwotICBCVE1fUkVQRUFURURfQVRURU1QVFMsICAgLyogMTkgcmVwZWF0ZWQgYXR0ZW1wdHMgZm9yIExFIHNlY3VyaXR5IHJlcXVlc3RzICovCi0gIEJUTV9NT0RFNF9MRVZFTDRfTk9UX1NVUFBPUlRFRCwgLyogMjAgU2VjdXJlIENvbm5lY3Rpb25zIE9ubHkgTW9kZSBjYW4ndCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCAqLwotICBCVE1fREVWX1JFU1RSSUNUX0xJU1RFRCwgICAgICAgIC8qIDIxIFRoZSBkZXZpY2UgaXMgcmVzdHJpY3QgbGlzdGVkICovCi0gIEJUTV9NQVhfU1RBVFVTX1ZBTFVFID0gQlRNX0RFVl9SRVNUUklDVF9MSVNURUQsCi0gIEJUTV9VTkRFRklORUQgPSAweEZGLAotfTsKLXR5cGVkZWYgdWludDhfdCB0QlRNX1NUQVRVUzsKLQotaW5saW5lIHVpbnQ4X3QgYnRtX3N0YXR1c192YWx1ZShjb25zdCB0QlRNX1NUQVRVUyYgc3RhdHVzKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihzdGF0dXMpOwotfQotCi1pbmxpbmUgdEJUTV9TVEFUVVMgdG9fYnRtX3N0YXR1cyhjb25zdCB1aW50OF90JiB2YWx1ZSkgewotICBpZiAodmFsdWUgPiBCVE1fTUFYX1NUQVRVU19WQUxVRSkgcmV0dXJuIEJUTV9VTkRFRklORUQ7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx0QlRNX1NUQVRVUz4odmFsdWUpOwotfQotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGJ0bV9zdGF0dXNfdGV4dChjb25zdCB0QlRNX1NUQVRVUyYgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fU1VDQ0VTUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fQ01EX1NUQVJURUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX0JVU1kpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX05PX1JFU09VUkNFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fTU9ERV9VTlNVUFBPUlRFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fSUxMRUdBTF9WQUxVRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fV1JPTkdfTU9ERSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fVU5LTk9XTl9BRERSKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9ERVZJQ0VfVElNRU9VVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fQkFEX1ZBTFVFX1JFVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fRVJSX1BST0NFU1NJTkcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX05PVF9BVVRIT1JJWkVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9ERVZfUkVTRVQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX0NNRF9TVE9SRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX0lMTEVHQUxfQUNUSU9OKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9ERUxBWV9DSEVDSyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fU0NPX0JBRF9MRU5HVEgpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX1NVQ0NFU1NfTk9fU0VDVVJJVFkpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX0ZBSUxFRF9PTl9TRUNVUklUWSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVE1fUkVQRUFURURfQVRURU1QVFMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRNX01PREU0X0xFVkVMNF9OT1RfU1VQUE9SVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEJUTV9ERVZfUkVTVFJJQ1RfTElTVEVEKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOWyVoaHVdIiwgc3RhdHVzKTsKLSAgfQotfQotCi0jdW5kZWYgQ0FTRV9SRVRVUk5fVEVYVApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9idHUuaCBiL3N0YWNrL2luY2x1ZGUvYnR1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkY2Y3OGYuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9idHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgdGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIEJsdWV0b290aCBVcHBlciBMYXllciBkZWZpbml0aW9ucy4gVGhlIEJyb2FkY29tCi0gKiAgaW1wbGVtZW50YXRpb25zIG9mIEwyQ0FQIFJGQ09NTSwgU0RQIGFuZCB0aGUgQlRJZiBydW4gYXMgb25lIEdLSSB0YXNrLiBUaGUKLSAqICBidHVfdGFzayBzd2l0Y2hlcyBiZXR3ZWVuIHRoZW0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVFVfSAotI2RlZmluZSBCVFVfSAotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL3RocmVhZGluZy90aHJlYWQuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0vKiBHbG9iYWwgQlRVIGRhdGEgKi8KLWV4dGVybiB1aW50OF90IGJ0dV90cmFjZV9sZXZlbDsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGJ0dV9oY2lmLmNjCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIGJ0dV9oY2lmX3Byb2Nlc3NfZXZlbnQodWludDhfdCBjb250cm9sbGVyX2lkLCBCVF9IRFIqIHBfYnVmKTsKLXZvaWQgYnR1X2hjaWZfc2VuZF9jbWQodWludDhfdCBjb250cm9sbGVyX2lkLCBCVF9IRFIqIHBfbXNnKTsKLXZvaWQgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihjb25zdCBiYXNlOjpMb2NhdGlvbiYgcG9zdGVkX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXJhbXNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGJ0dV90YXNrLmNjCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpOwotYnRfc3RhdHVzX3QgZG9faW5fbWFpbl90aHJlYWQoY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2spOwotYnRfc3RhdHVzX3QgZG9faW5fbWFpbl90aHJlYWRfZGVsYXllZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGRlbGF5KTsKLQotYm9vbCBpc19vbl9tYWluX3RocmVhZCgpOwotdXNpbmcgQnRNYWluQ2xvc3VyZSA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPjsKLXZvaWQgcG9zdF9vbl9idF9tYWluKEJ0TWFpbkNsb3N1cmUgY2xvc3VyZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9kZXZfaGNpX2xpbmtfaW50ZXJmYWNlLmggYi9zdGFjay9pbmNsdWRlL2Rldl9oY2lfbGlua19pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNmZiYi4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2Rldl9oY2lfbGlua19pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZXh0ZXJuIHZvaWQgYnRtX2RlbGV0ZV9zdG9yZWRfbGlua19rZXlfY29tcGxldGUodWludDhfdCogcCk7Ci1leHRlcm4gdm9pZCBidG1fdmVuZG9yX3NwZWNpZmljX2V2dCh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pOwotZXh0ZXJuIHZvaWQgYnRtX3ZzY19jb21wbGV0ZSh1aW50OF90KiBwLCB1aW50MTZfdCBjY19vcGNvZGUsIHVpbnQxNl90IGV2dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fVlNDX0NNUExfQ0IqIHBfdnNjX2NwbHRfY2JhY2spOwotZXh0ZXJuIHZvaWQgYnRtX3JlYWRfbG9jYWxfbmFtZV9jb21wbGV0ZSh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvZ2FwX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9nYXBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDIwNWMuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9nYXBfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBHQVBfQVBJX0gKLSNkZWZpbmUgR0FQX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJwcm9maWxlc19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqIEdBUCBFcnJvciBhbmQgU3RhdHVzIENvZGVzICoqKi8KLS8qIEFuIGlsbGVnYWwgcGFyYW1ldGVyIHdhcyBkZXRlY3RlZCAqLwotI2RlZmluZSBHQVBfRVJSX0lMTF9QQVJNIChHQVBfRVJSX0dSUCArIDB4MDkpCi0KLS8qIEJhZCBHQVAgaGFuZGxlICovCi0jZGVmaW5lIEdBUF9FUlJfQkFEX0hBTkRMRSAoR0FQX0VSUl9HUlAgKyAweDBlKQotLyogQ29ubmVjdGlvbiBpcyBpbiBpbnZhbGlkIHN0YXRlICovCi0jZGVmaW5lIEdBUF9FUlJfQkFEX1NUQVRFIChHQVBfRVJSX0dSUCArIDB4MTApCi0vKiBObyBkYXRhIGF2YWlsYWJsZSAqLwotI2RlZmluZSBHQVBfTk9fREFUQV9BVkFJTCAoR0FQX0VSUl9HUlAgKyAweDExKQotI2RlZmluZSBHQVBfRVZUX0NPTk5fT1BFTkVEIDB4MDEwMAotI2RlZmluZSBHQVBfRVZUX0NPTk5fQ0xPU0VEIDB4MDEwMQotI2RlZmluZSBHQVBfRVZUX0NPTk5fREFUQV9BVkFJTCAweDAxMDIKLSNkZWZpbmUgR0FQX0VWVF9DT05OX0NPTkdFU1RFRCAweDAxMDMKLSNkZWZpbmUgR0FQX0VWVF9DT05OX1VOQ09OR0VTVEVEIDB4MDEwNAotI2RlZmluZSBHQVBfRVZUX1RYX0VNUFRZIDB4MDEwNQotCi0vKioqIHVzZWQgaW4gY29ubmVjdGlvbiB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyAqKiovCi0jZGVmaW5lIEdBUF9JTlZBTElEX0hBTkRMRSAweEZGRkYKLQotI2lmbmRlZiBHQVBfUFJFRkVSX0NPTk5fSU5UX01BWAotI2RlZmluZSBHQVBfUFJFRkVSX0NPTk5fSU5UX01BWCBCVE1fQkxFX0NPTk5fSU5UX01JTgotI2VuZGlmCi0KLSNpZm5kZWYgR0FQX1BSRUZFUl9DT05OX0lOVF9NSU4KLSNkZWZpbmUgR0FQX1BSRUZFUl9DT05OX0lOVF9NSU4gQlRNX0JMRV9DT05OX0lOVF9NSU4KLSNlbmRpZgotCi0jaWZuZGVmIEdBUF9QUkVGRVJfQ09OTl9MQVRFTkNZCi0jZGVmaW5lIEdBUF9QUkVGRVJfQ09OTl9MQVRFTkNZIDAKLSNlbmRpZgotCi0jaWZuZGVmIEdBUF9QUkVGRVJfQ09OTl9TUF9UT1VUCi0jZGVmaW5lIEdBUF9QUkVGRVJfQ09OTl9TUF9UT1VUIDIwMDAKLSNlbmRpZgotCi1zdHJ1Y3QgdEdBUF9DT0NfQ1JFRElUUyB7Ci0gIHVpbnQxNl90IGNyZWRpdHNfcmVjZWl2ZWQ7Ci0gIHVpbnQxNl90IGNyZWRpdF9jb3VudDsKLX07Ci0KLXVuaW9uIHRHQVBfQ0JfREFUQSB7Ci0gIHRHQVBfQ09DX0NSRURJVFMgY29jX2NyZWRpdHM7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIERlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgY29ubmVjdGlvbiBzZXJ2aWNlcwotKi8KLXR5cGVkZWYgdm9pZCh0R0FQX0NPTk5fQ0FMTEJBQ0spKHVpbnQxNl90IGdhcF9oYW5kbGUsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBUF9DQl9EQVRBKiBkYXRhKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBpbnRfbWluOwotICB1aW50MTZfdCBpbnRfbWF4OwotICB1aW50MTZfdCBsYXRlbmN5OwotICB1aW50MTZfdCBzcF90b3V0OwotfSB0R0FQX0JMRV9QUkVGX1BBUkFNOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdEdBUF9CTEVfUFJFRl9QQVJBTSBjb25uX3BhcmFtOwotICBSYXdBZGRyZXNzIHJlY29ubl9iZGE7Ci0gIHVpbnQxNl90IGljb247Ci0gIHVpbnQ4X3QqIHBfZGV2X25hbWU7Ci0gIHVpbnQ4X3QgYWRkcl9yZXNvbHV0aW9uOwotCi19IHRHQVBfQkxFX0FUVFJfVkFMVUU7Ci0KLXR5cGVkZWYgdm9pZCh0R0FQX0JMRV9DTVBMX0NCQUNLKShib29sIHN0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsIGNoYXIqIHBfbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiogRnVuY3Rpb25zIGZvciBMMkNBUCBjb25uZWN0aW9uIGludGVyZmFjZSAqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfQ29ubk9wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG9wZW4gYSBnZW5lcmljIEwyQ0FQIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24gaWYgc3VjY2Vzc2Z1bCwgZWxzZQotICogICAgICAgICAgICAgICAgICBHQVBfSU5WQUxJRF9IQU5ETEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEdBUF9Db25uT3Blbihjb25zdCBjaGFyKiBwX3NlcnZfbmFtZSwgdWludDhfdCBzZXJ2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3NlcnZlciwgY29uc3QgUmF3QWRkcmVzcyogcF9yZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQxNl90IGxlX21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0VSVE1fSU5GTyogZXJ0bV9pbmZvLCB1aW50MTZfdCBzZWN1cml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBUF9DT05OX0NBTExCQUNLKiBwX2NiLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfQ29ubkNsb3NlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbG9zZSBhIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9QQVNTICAgICAgICAgICAgIC0gY2xvc2VkIE9LCi0gKiAgICAgICAgICAgICAgICAgIEdBUF9FUlJfQkFEX0hBTkRMRSAgLSBpbnZhbGlkIGhhbmRsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgR0FQX0Nvbm5DbG9zZSh1aW50MTZfdCBnYXBfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9Db25uUmVhZERhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdLSSBidWZmZXIgdW5hd2FyZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBhZnRlciByZWNlaXZpbmcgR0FQX0VWVF9SWERBVEEgZXZlbnQuIEEgZGF0YSBjb3B5IGlzIG1hZGUKLSAqICAgICAgICAgICAgICAgICAgaW50byB0aGUgcmVjZWl2ZSBidWZmZXIgcGFyYW1ldGVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfUEFTUyAgICAgICAgICAgICAtIGRhdGEgcmVhZAotICogICAgICAgICAgICAgICAgICBHQVBfRVJSX0JBRF9IQU5ETEUgIC0gaW52YWxpZCBoYW5kbGUKLSAqICAgICAgICAgICAgICAgICAgR0FQX05PX0RBVEFfQVZBSUwgICAtIG5vIGRhdGEgYXZhaWxhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBHQVBfQ29ublJlYWREYXRhKHVpbnQxNl90IGdhcF9oYW5kbGUsIHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9sZW4sIHVpbnQxNl90KiBwX2xlbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfR2V0UnhRdWV1ZUNudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIG9uIHRoZSByeCBxdWV1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIEdBUF9Db25uT3BlbgotICogICAgICAgICAgICAgICAgICBwX3J4X3F1ZXVlX2NvdW50IC0gUG9pbnRlciB0byByZXR1cm4gcXVldWUgY291bnQgaW4uCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IEdBUF9HZXRSeFF1ZXVlQ250KHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QqIHBfcnhfcXVldWVfY291bnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0Nvbm5Xcml0ZURhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdLSSBidWZmZXIgdW5hd2FyZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICB0byBzZW5kIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24uIEEgZGF0YSBjb3B5IGlzIG1hZGUgaW50byBhCi0gKiAgICAgICAgICAgICAgICAgIEdLSSBidWZmZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBCVF9QQVNTICAgICAgICAgICAgICAgICAtIGRhdGEgcmVhZAotICogICAgICAgICAgICAgICAgICBHQVBfRVJSX0JBRF9IQU5ETEUgICAgICAtIGludmFsaWQgaGFuZGxlCi0gKiAgICAgICAgICAgICAgICAgIEdBUF9FUlJfQkFEX1NUQVRFICAgICAgIC0gY29ubmVjdGlvbiBub3QgZXN0YWJsaXNoZWQKLSAqICAgICAgICAgICAgICAgICAgR0FQX0NPTkdFU1RJT04gICAgICAgICAgLSBzeXN0ZW0gaXMgY29uZ2VzdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBHQVBfQ29ubldyaXRlRGF0YSh1aW50MTZfdCBnYXBfaGFuZGxlLCBCVF9IRFIqIG1zZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfQ29ubkdldFJlbW90ZUFkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgcmVtb3RlIEJEIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgb2YgYSBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQlRfUEFTUyAgICAgICAgICAgICAtIGNsb3NlZCBPSwotICogICAgICAgICAgICAgICAgICBHQVBfRVJSX0JBRF9IQU5ETEUgIC0gaW52YWxpZCBoYW5kbGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGNvbnN0IFJhd0FkZHJlc3MqIEdBUF9Db25uR2V0UmVtb3RlQWRkcih1aW50MTZfdCBnYXBfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9Db25uR2V0UmVtTXR1U2l6ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmV0dXJucyB0aGUgcmVtb3RlIGRldmljZSdzIE1UVSBzaXplLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDE2X3QgLSBtYXhpbXVtIHNpemUgYnVmZmVyIHRoYXQgY2FuIGJlIHRyYW5zbWl0dGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBlZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEdBUF9Db25uR2V0UmVtTXR1U2l6ZSh1aW50MTZfdCBnYXBfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9Db25uR2V0TDJDQVBDaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIEwyQ0FQIGNoYW5uZWwgaWQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgIC0gSGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB1aW50MTZfdCAgICAtIFRoZSBMMkNBUCBjaGFubmVsIGlkCi0gKiAgICAgICAgICAgICAgICAgIDAsIGlmIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBHQVBfQ29ubkdldEwyQ0FQQ2lkKHVpbnQxNl90IGdhcF9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemVzIHRoZSBjb250cm9sIGJsb2NrcyB1c2VkIGJ5IEdBUC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyByb3V0aW5lIHNob3VsZCBub3QgYmUgY2FsbGVkIGV4Y2VwdCBvbmNlIHBlcgotICogICAgICAgICAgICAgICAgICAgICAgc3RhY2sgaW52b2NhdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgR0FQX0luaXQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVBfQmxlQXR0ckRCVXBkYXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICB1cGRhdGUgR0FQIGxvY2FsIEJMRSBhdHRyaWJ1dGUgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb3RoaW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEdBUF9CbGVBdHRyREJVcGRhdGUodWludDE2X3QgYXR0cl91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FQX0JMRV9BVFRSX1ZBTFVFKiBwX3ZhbHVlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBUF9CbGVSZWFkUGVlclByZWZDb25uUGFyYW1zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBhIHByb2Nlc3MgdG8gcmVhZCBhIGNvbm5lY3RlZCBwZXJpcGhlcmFsJ3MgcHJlZmVycmVkCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gcGFyYW1ldGVycwotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZWFkIHN0YXJ0ZWQsIGVsc2UgZmFsc2UgaWYgR0FQIGlzIGJ1c3kKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgR0FQX0JsZVJlYWRQZWVyUHJlZkNvbm5QYXJhbXMoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0JsZVJlYWRQZWVyRGV2TmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgYSBwcm9jZXNzIHRvIHJlYWQgYSBjb25uZWN0ZWQgcGVyaXBoZXJhbCdzIGRldmljZQotICogICAgICAgICAgICAgICAgICBuYW1lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiByZXF1ZXN0IGFjY2VwdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEdBUF9CbGVSZWFkUGVlckRldk5hbWUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVBfQkxFX0NNUExfQ0JBQ0sqIHBfY2JhY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FQX0JsZUNhbmNlbFJlYWRQZWVyRGV2TmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FuY2VsIHJlYWRpbmcgYSBwZXJpcGhlcmFsJ3MgZGV2aWNlIG5hbWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHJlcXVlc3QgYWNjZXB0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgR0FQX0JsZUNhbmNlbFJlYWRQZWVyRGV2TmFtZShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSk7Ci0KLSNlbmRpZiAvKiBHQVBfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvZ2F0dF9hcGkuaCBiL3N0YWNrL2luY2x1ZGUvZ2F0dF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhNmVhZS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEdBVFRfQVBJX0gKLSNkZWZpbmUgR0FUVF9BUElfSAotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImdhdHRkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3VjY2VzcyBjb2RlIGFuZCBlcnJvciBjb2RlcyAqLwotdHlwZWRlZiBlbnVtIEdhdHRTdGF0dXMgOiB1aW50OF90IHsKLSAgR0FUVF9TVUNDRVNTID0gMHgwMCwKLSAgR0FUVF9JTlZBTElEX0hBTkRMRSA9IDB4MDEsCi0gIEdBVFRfUkVBRF9OT1RfUEVSTUlUID0gMHgwMiwKLSAgR0FUVF9XUklURV9OT1RfUEVSTUlUID0gMHgwMywKLSAgR0FUVF9JTlZBTElEX1BEVSA9IDB4MDQsCi0gIEdBVFRfSU5TVUZfQVVUSEVOVElDQVRJT04gPSAweDA1LAotICBHQVRUX1JFUV9OT1RfU1VQUE9SVEVEID0gMHgwNiwKLSAgR0FUVF9JTlZBTElEX09GRlNFVCA9IDB4MDcsCi0gIEdBVFRfSU5TVUZfQVVUSE9SSVpBVElPTiA9IDB4MDgsCi0gIEdBVFRfUFJFUEFSRV9RX0ZVTEwgPSAweDA5LAotICBHQVRUX05PVF9GT1VORCA9IDB4MGEsCi0gIEdBVFRfTk9UX0xPTkcgPSAweDBiLAotICBHQVRUX0lOU1VGX0tFWV9TSVpFID0gMHgwYywKLSAgR0FUVF9JTlZBTElEX0FUVFJfTEVOID0gMHgwZCwKLSAgR0FUVF9FUlJfVU5MSUtFTFkgPSAweDBlLAotICBHQVRUX0lOU1VGX0VOQ1JZUFRJT04gPSAweDBmLAotICBHQVRUX1VOU1VQUE9SVF9HUlBfVFlQRSA9IDB4MTAsCi0gIEdBVFRfSU5TVUZfUkVTT1VSQ0UgPSAweDExLAotICBHQVRUX0RBVEFCQVNFX09VVF9PRl9TWU5DID0gMHgxMiwKLSAgR0FUVF9WQUxVRV9OT1RfQUxMT1dFRCA9IDB4MTMsCi0gIEdBVFRfSUxMRUdBTF9QQVJBTUVURVIgPSAweDg3LAotICBHQVRUX1RPT19TSE9SVCA9IDB4N2YsCi0gIEdBVFRfTk9fUkVTT1VSQ0VTID0gMHg4MCwKLSAgR0FUVF9JTlRFUk5BTF9FUlJPUiA9IDB4ODEsCi0gIEdBVFRfV1JPTkdfU1RBVEUgPSAweDgyLAotICBHQVRUX0RCX0ZVTEwgPSAweDgzLAotICBHQVRUX0JVU1kgPSAweDg0LAotICBHQVRUX0VSUk9SID0gMHg4NSwKLSAgR0FUVF9DTURfU1RBUlRFRCA9IDB4ODYsCi0gIEdBVFRfUEVORElORyA9IDB4ODgsCi0gIEdBVFRfQVVUSF9GQUlMID0gMHg4OSwKLSAgR0FUVF9NT1JFID0gMHg4YSwKLSAgR0FUVF9JTlZBTElEX0NGRyA9IDB4OGIsCi0gIEdBVFRfU0VSVklDRV9TVEFSVEVEID0gMHg4YywKLSAgR0FUVF9FTkNSWVBFRF9NSVRNID0gR0FUVF9TVUNDRVNTLAotICBHQVRUX0VOQ1JZUEVEX05PX01JVE0gPSAweDhkLAotICBHQVRUX05PVF9FTkNSWVBURUQgPSAweDhlLAotICBHQVRUX0NPTkdFU1RFRCA9IDB4OGYsCi0gIEdBVFRfRFVQX1JFRyA9IDB4OTAsICAgICAgLyogMHg5MCAqLwotICBHQVRUX0FMUkVBRFlfT1BFTiA9IDB4OTEsIC8qIDB4OTEgKi8KLSAgR0FUVF9DQU5DRUwgPSAweDkyLCAgICAgICAvKiAweDkyICovCi0gIC8qID0gMHhFMCB+IDB4RkMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQotICAvKiBDbGllbnQgQ2hhcmFjdGVyaXN0aWMgQ29uZmlndXJhdGlvbiBEZXNjcmlwdG9yIEltcHJvcGVybHkgQ29uZmlndXJlZCAqLwotICBHQVRUX0NDQ19DRkdfRVJSID0gMHhGRCwKLSAgLyogUHJvY2VkdXJlIEFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KLSAgR0FUVF9QUkNfSU5fUFJPR1JFU1MgPSAweEZFLAotICAvKiBBdHRyaWJ1dGUgdmFsdWUgb3V0IG9mIHJhbmdlICovCi0gIEdBVFRfT1VUX09GX1JBTkdFID0gMHhGRiwKLX0gdEdBVFRfU1RBVFVTOwotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgR0FUVF9SU1BfRVJST1IgPSAweDAxLAotICBHQVRUX1JFUV9NVFUgPSAweDAyLAotICBHQVRUX1JTUF9NVFUgPSAweDAzLAotICBHQVRUX1JFUV9GSU5EX0lORk8gPSAweDA0LAotICBHQVRUX1JTUF9GSU5EX0lORk8gPSAweDA1LAotICBHQVRUX1JFUV9GSU5EX1RZUEVfVkFMVUUgPSAweDA2LAotICBHQVRUX1JTUF9GSU5EX1RZUEVfVkFMVUUgPSAweDA3LAotICBHQVRUX1JFUV9SRUFEX0JZX1RZUEUgPSAweDA4LAotICBHQVRUX1JTUF9SRUFEX0JZX1RZUEUgPSAweDA5LAotICBHQVRUX1JFUV9SRUFEID0gMHgwQSwKLSAgR0FUVF9SU1BfUkVBRCA9IDB4MEIsCi0gIEdBVFRfUkVRX1JFQURfQkxPQiA9IDB4MEMsCi0gIEdBVFRfUlNQX1JFQURfQkxPQiA9IDB4MEQsCi0gIEdBVFRfUkVRX1JFQURfTVVMVEkgPSAweDBFLAotICBHQVRUX1JTUF9SRUFEX01VTFRJID0gMHgwRiwKLSAgR0FUVF9SRVFfUkVBRF9CWV9HUlBfVFlQRSA9IDB4MTAsCi0gIEdBVFRfUlNQX1JFQURfQllfR1JQX1RZUEUgPSAweDExLAotICAvKiAgICAgICAgICAgICAgICAgMDAwMS0wMDEwICh3cml0ZSkqLwotICBHQVRUX1JFUV9XUklURSA9IDB4MTIsCi0gIEdBVFRfUlNQX1dSSVRFID0gMHgxMywKLSAgLyogY2hhbmdlZCBpbiBWNC4wIDAxMDAxLTAwMTAod3JpdGUgY21kKSovCi0gIEdBVFRfQ01EX1dSSVRFID0gMHg1MiwKLSAgR0FUVF9SRVFfUFJFUEFSRV9XUklURSA9IDB4MTYsCi0gIEdBVFRfUlNQX1BSRVBBUkVfV1JJVEUgPSAweDE3LAotICBHQVRUX1JFUV9FWEVDX1dSSVRFID0gMHgxOCwKLSAgR0FUVF9SU1BfRVhFQ19XUklURSA9IDB4MTksCi0gIEdBVFRfSEFORExFX1ZBTFVFX05PVElGID0gMHgxQiwKLSAgR0FUVF9IQU5ETEVfVkFMVUVfSU5EID0gMHgxRCwKLSAgR0FUVF9IQU5ETEVfVkFMVUVfQ09ORiA9IDB4MUUsCi0KLSAgR0FUVF9SRVFfUkVBRF9NVUxUSV9WQVIgPSAweDIwLAotICBHQVRUX1JTUF9SRUFEX01VTFRJX1ZBUiA9IDB4MjEsCi0gIEdBVFRfSEFORExFX01VTFRJX1ZBTFVFX05PVElGID0gMHgyMywKLQotICAvKiBjaGFuZ2VkIGluIFY0LjAgMTEwMS0wMDEwIChzaWduZWQgd3JpdGUpICBzZWUgd3JpdGUgY21kIGFib3ZlKi8KLSAgR0FUVF9TSUdOX0NNRF9XUklURSA9IDB4RDIsCi0gIC8qIDB4MUUgPSAzMCArIDEgPSAzMSovCi0gIEdBVFRfT1BfQ09ERV9NQVggPSAoR0FUVF9IQU5ETEVfTVVMVElfVkFMVUVfTk9USUYgKyAxKSwKLX0gdEdBVFRfT1BfQ09ERTsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGdhdHRfb3BfY29kZV90ZXh0KGNvbnN0IHRHQVRUX09QX0NPREUmIG9wX2NvZGUpIHsKLSAgc3dpdGNoIChvcF9jb2RlKSB7Ci0gICAgY2FzZSBHQVRUX1JTUF9FUlJPUjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SU1BfRVJST1IiKTsKLSAgICBjYXNlIEdBVFRfUkVRX01UVToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SRVFfTVRVIik7Ci0gICAgY2FzZSBHQVRUX1JTUF9NVFU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFRfUlNQX01UVSIpOwotICAgIGNhc2UgR0FUVF9SRVFfRklORF9JTkZPOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JFUV9GSU5EX0lORk8iKTsKLSAgICBjYXNlIEdBVFRfUlNQX0ZJTkRfSU5GTzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SU1BfRklORF9JTkZPIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9GSU5EX1RZUEVfVkFMVUU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFRfUkVRX0ZJTkRfVFlQRV9WQUxVRSIpOwotICAgIGNhc2UgR0FUVF9SU1BfRklORF9UWVBFX1ZBTFVFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9GSU5EX1RZUEVfVkFMVUUiKTsKLSAgICBjYXNlIEdBVFRfUkVRX1JFQURfQllfVFlQRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SRVFfUkVBRF9CWV9UWVBFIik7Ci0gICAgY2FzZSBHQVRUX1JTUF9SRUFEX0JZX1RZUEU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFRfUlNQX1JFQURfQllfVFlQRSIpOwotICAgIGNhc2UgR0FUVF9SRVFfUkVBRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SRVFfUkVBRCIpOwotICAgIGNhc2UgR0FUVF9SU1BfUkVBRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SU1BfUkVBRCIpOwotICAgIGNhc2UgR0FUVF9SRVFfUkVBRF9CTE9COgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JFUV9SRUFEX0JMT0IiKTsKLSAgICBjYXNlIEdBVFRfUlNQX1JFQURfQkxPQjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SU1BfUkVBRF9CTE9CIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX01VTFRJOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JFUV9SRUFEX01VTFRJIik7Ci0gICAgY2FzZSBHQVRUX1JTUF9SRUFEX01VTFRJOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9SRUFEX01VTFRJIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX0JZX0dSUF9UWVBFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JFUV9SRUFEX0JZX0dSUF9UWVBFIik7Ci0gICAgY2FzZSBHQVRUX1JTUF9SRUFEX0JZX0dSUF9UWVBFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9SRUFEX0JZX0dSUF9UWVBFIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9XUklURToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SRVFfV1JJVEUiKTsKLSAgICBjYXNlIEdBVFRfUlNQX1dSSVRFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9XUklURSIpOwotICAgIGNhc2UgR0FUVF9DTURfV1JJVEU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFRfQ01EX1dSSVRFIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9QUkVQQVJFX1dSSVRFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JFUV9QUkVQQVJFX1dSSVRFIik7Ci0gICAgY2FzZSBHQVRUX1JTUF9QUkVQQVJFX1dSSVRFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9QUkVQQVJFX1dSSVRFIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9FWEVDX1dSSVRFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JFUV9FWEVDX1dSSVRFIik7Ci0gICAgY2FzZSBHQVRUX1JTUF9FWEVDX1dSSVRFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9FWEVDX1dSSVRFIik7Ci0gICAgY2FzZSBHQVRUX0hBTkRMRV9WQUxVRV9OT1RJRjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9IQU5ETEVfVkFMVUVfTk9USUYiKTsKLSAgICBjYXNlIEdBVFRfSEFORExFX1ZBTFVFX0lORDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9IQU5ETEVfVkFMVUVfSU5EIik7Ci0gICAgY2FzZSBHQVRUX0hBTkRMRV9WQUxVRV9DT05GOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX0hBTkRMRV9WQUxVRV9DT05GIik7Ci0gICAgY2FzZSBHQVRUX1JFUV9SRUFEX01VTFRJX1ZBUjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR0FUVF9SRVFfUkVBRF9NVUxUSV9WQVIiKTsKLSAgICBjYXNlIEdBVFRfUlNQX1JFQURfTVVMVElfVkFSOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1JTUF9SRUFEX01VTFRJX1ZBUiIpOwotICAgIGNhc2UgR0FUVF9IQU5ETEVfTVVMVElfVkFMVUVfTk9USUY6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkdBVFRfSEFORExFX01VTFRJX1ZBTFVFX05PVElGIik7Ci0gICAgY2FzZSBHQVRUX1NJR05fQ01EX1dSSVRFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX1NJR05fQ01EX1dSSVRFIik7Ci0gICAgY2FzZSBHQVRUX09QX0NPREVfTUFYOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJHQVRUX09QX0NPREVfTUFYIik7Ci0gIH07Ci19Ci0KLSNkZWZpbmUgR0FUVF9IQU5ETEVfSVNfVkFMSUQoeCkgKCh4KSAhPSAwKQotCi10eXBlZGVmIGVudW0gOiB1aW50MTZfdCB7Ci0gIEdBVFRfQ09OTl9PSyA9IDAsCi0gIC8qIGdlbmVyYWwgTDJjYXAgZmFpbHVyZSAgKi8KLSAgR0FUVF9DT05OX0wyQ19GQUlMVVJFID0gMSwKLSAgLyogMHgwOCBjb25uZWN0aW9uIHRpbWVvdXQgICovCi0gIEdBVFRfQ09OTl9USU1FT1VUID0gSENJX0VSUl9DT05ORUNUSU9OX1RPVVQsCi0gIC8qIDB4MTMgY29ubmVjdGlvbiB0ZXJtaW5hdGUgYnkgcGVlciB1c2VyICAqLwotICBHQVRUX0NPTk5fVEVSTUlOQVRFX1BFRVJfVVNFUiA9IEhDSV9FUlJfUEVFUl9VU0VSLAotICAvKiAweDE2IGNvbm5lY3Rpb250ZXJtaW5hdGVkIGJ5IGxvY2FsIGhvc3QgICovCi0gIEdBVFRfQ09OTl9URVJNSU5BVEVfTE9DQUxfSE9TVCA9IEhDSV9FUlJfQ09OTl9DQVVTRV9MT0NBTF9IT1NULAotICAvKiAweDIyIGNvbm5lY3Rpb24gZmFpbCBmb3IgTE1QIHJlc3BvbnNlIHRvdXQgKi8KLSAgR0FUVF9DT05OX0xNUF9USU1FT1VUID0gSENJX0VSUl9MTVBfUkVTUE9OU0VfVElNRU9VVCwKLQotICBHQVRUX0NPTk5fRkFJTEVEX0VTVEFCTElTSE1FTlQgPSBIQ0lfRVJSX0NPTk5fRkFJTEVEX0VTVEFCTElTSE1FTlQsCi0KLSAgQlRBX0dBVFRfQ09OTl9OT05FID0gMHgwMTAxLCAvKiAweDAxMDEgbm8gY29ubmVjdGlvbiB0byBjYW5jZWwgICovCi0KLX0gdEdBVFRfRElTQ09OTl9SRUFTT047Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgZ2F0dF9kaXNjb25uZWN0aW9uX3JlYXNvbl90ZXh0KAotICAgIGNvbnN0IHRHQVRUX0RJU0NPTk5fUkVBU09OJiByZWFzb24pIHsKLSAgc3dpdGNoIChyZWFzb24pIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfQ09OTl9PSyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChHQVRUX0NPTk5fTDJDX0ZBSUxVUkUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9DT05OX1RJTUVPVVQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9DT05OX1RFUk1JTkFURV9QRUVSX1VTRVIpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoR0FUVF9DT05OX1RFUk1JTkFURV9MT0NBTF9IT1NUKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEdBVFRfQ09OTl9MTVBfVElNRU9VVCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChHQVRUX0NPTk5fRkFJTEVEX0VTVEFCTElTSE1FTlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRBX0dBVFRfQ09OTl9OT05FKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigiVU5LTk9XTlslaHVdIiwgcmVhc29uKTsKLSAgfQotfQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLQotLyogTUFYIEdBVFQgTVRVIHNpemUKLSovCi0jaWZuZGVmIEdBVFRfTUFYX01UVV9TSVpFCi0jZGVmaW5lIEdBVFRfTUFYX01UVV9TSVpFIDUxNwotI2VuZGlmCi0KLS8qIG1heCBsZWd0aCBvZiBhbiBhdHRyaWJ1dGUgdmFsdWUKLSovCi0jaWZuZGVmIEdBVFRfTUFYX0FUVFJfTEVOCi0jZGVmaW5lIEdBVFRfTUFYX0FUVFJfTEVOIDYwMAotI2VuZGlmCi0KLS8qIGRlZmF1bHQgR0FUVCBNVFUgc2l6ZSBvdmVyIExFIGxpbmsKLSovCi0jZGVmaW5lIEdBVFRfREVGX0JMRV9NVFVfU0laRSAyMwotCi0vKiBpbnZhbGlkIGNvbm5lY3Rpb24gSUQKLSovCi0jZGVmaW5lIEdBVFRfSU5WQUxJRF9DT05OX0lEIDB4RkZGRgotCi0jaWZuZGVmIEdBVFRfQ0xfTUFYX0xDQgotI2RlZmluZSBHQVRUX0NMX01BWF9MQ0IgMjIKLSNlbmRpZgotCi0vKiBHQVRUIG5vdGlmaWNhdGlvbiBjYWNoaW5nIHRpbWVyLCBkZWZhdWx0IHRvIGJlIHRocmVlIHNlY29uZHMKLSovCi0jaWZuZGVmIEdBVFRDX05PVElGX1RJTUVPVVQKLSNkZWZpbmUgR0FUVENfTk9USUZfVElNRU9VVCAzCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHQVRUIFN0cnVjdHVyZSBEZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQXR0cmlidXRlIHBlcm1pc3Npb25zCi0qLwotI2RlZmluZSBHQVRUX1BFUk1fUkVBRCAoMSA8PCAwKSAgICAgICAgICAgICAgLyogYml0IDAgKi8KLSNkZWZpbmUgR0FUVF9QRVJNX1JFQURfRU5DUllQVEVEICgxIDw8IDEpICAgIC8qIGJpdCAxICovCi0jZGVmaW5lIEdBVFRfUEVSTV9SRUFEX0VOQ19NSVRNICgxIDw8IDIpICAgICAvKiBiaXQgMiAqLwotI2RlZmluZSBHQVRUX1BFUk1fV1JJVEUgKDEgPDwgNCkgICAgICAgICAgICAgLyogYml0IDQgKi8KLSNkZWZpbmUgR0FUVF9QRVJNX1dSSVRFX0VOQ1JZUFRFRCAoMSA8PCA1KSAgIC8qIGJpdCA1ICovCi0jZGVmaW5lIEdBVFRfUEVSTV9XUklURV9FTkNfTUlUTSAoMSA8PCA2KSAgICAvKiBiaXQgNiAqLwotI2RlZmluZSBHQVRUX1BFUk1fV1JJVEVfU0lHTkVEICgxIDw8IDcpICAgICAgLyogYml0IDcgKi8KLSNkZWZpbmUgR0FUVF9QRVJNX1dSSVRFX1NJR05FRF9NSVRNICgxIDw8IDgpIC8qIGJpdCA4ICovCi10eXBlZGVmIHVpbnQxNl90IHRHQVRUX1BFUk07Ci0KLS8qIHRoZSBNUyBuaWJibGUgb2YgdEdBVFRfUEVSTTsga2V5IHNpemUgNz0wOyBzaXplIDE2PTkgKi8KLSNkZWZpbmUgR0FUVF9FTkNSWVBUX0tFWV9TSVpFX01BU0sgKDB4RjAwMCkKLQotI2RlZmluZSBHQVRUX1JFQURfQUxMT1dFRCBcCi0gIChHQVRUX1BFUk1fUkVBRCB8IEdBVFRfUEVSTV9SRUFEX0VOQ1JZUFRFRCB8IEdBVFRfUEVSTV9SRUFEX0VOQ19NSVRNKQotI2RlZmluZSBHQVRUX1JFQURfQVVUSF9SRVFVSVJFRCAoR0FUVF9QRVJNX1JFQURfRU5DUllQVEVEKQotI2RlZmluZSBHQVRUX1JFQURfTUlUTV9SRVFVSVJFRCAoR0FUVF9QRVJNX1JFQURfRU5DX01JVE0pCi0jZGVmaW5lIEdBVFRfUkVBRF9FTkNSWVBURURfUkVRVUlSRUQgXAotICAoR0FUVF9QRVJNX1JFQURfRU5DUllQVEVEIHwgR0FUVF9QRVJNX1JFQURfRU5DX01JVE0pCi0KLSNkZWZpbmUgR0FUVF9XUklURV9BTExPV0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChHQVRUX1BFUk1fV1JJVEUgfCBHQVRUX1BFUk1fV1JJVEVfRU5DUllQVEVEIHwgR0FUVF9QRVJNX1dSSVRFX0VOQ19NSVRNIHwgXAotICAgR0FUVF9QRVJNX1dSSVRFX1NJR05FRCB8IEdBVFRfUEVSTV9XUklURV9TSUdORURfTUlUTSkKLQotI2RlZmluZSBHQVRUX1dSSVRFX0FVVEhfUkVRVUlSRUQgXAotICAoR0FUVF9QRVJNX1dSSVRFX0VOQ1JZUFRFRCB8IEdBVFRfUEVSTV9XUklURV9TSUdORUQpCi0KLSNkZWZpbmUgR0FUVF9XUklURV9NSVRNX1JFUVVJUkVEIFwKLSAgKEdBVFRfUEVSTV9XUklURV9FTkNfTUlUTSB8IEdBVFRfUEVSTV9XUklURV9TSUdORURfTUlUTSkKLQotI2RlZmluZSBHQVRUX1dSSVRFX0VOQ1JZUFRFRF9QRVJNIFwKLSAgKEdBVFRfUEVSTV9XUklURV9FTkNSWVBURUQgfCBHQVRUX1BFUk1fV1JJVEVfRU5DX01JVE0pCi0KLSNkZWZpbmUgR0FUVF9XUklURV9TSUdORURfUEVSTSBcCi0gIChHQVRUX1BFUk1fV1JJVEVfU0lHTkVEIHwgR0FUVF9QRVJNX1dSSVRFX1NJR05FRF9NSVRNKQotCi0vKiBDaGFyYWN0ZXJpc3RpYyBwcm9wZXJ0aWVzCi0qLwotI2RlZmluZSBHQVRUX0NIQVJfUFJPUF9CSVRfQlJPQURDQVNUICgxIDw8IDApCi0jZGVmaW5lIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFEICgxIDw8IDEpCi0jZGVmaW5lIEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURV9OUiAoMSA8PCAyKQotI2RlZmluZSBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEUgKDEgPDwgMykKLSNkZWZpbmUgR0FUVF9DSEFSX1BST1BfQklUX05PVElGWSAoMSA8PCA0KQotI2RlZmluZSBHQVRUX0NIQVJfUFJPUF9CSVRfSU5ESUNBVEUgKDEgPDwgNSkKLSNkZWZpbmUgR0FUVF9DSEFSX1BST1BfQklUX0FVVEggKDEgPDwgNikKLSNkZWZpbmUgR0FUVF9DSEFSX1BST1BfQklUX0VYVF9QUk9QICgxIDw8IDcpCi10eXBlZGVmIHVpbnQ4X3QgdEdBVFRfQ0hBUl9QUk9QOwotCi0vKiBGb3JtYXQgb2YgdGhlIHZhbHVlIG9mIGEgY2hhcmFjdGVyaXN0aWMuIGVudW1lcmF0aW9uIHR5cGUKLSovCi1lbnVtIHsKLSAgR0FUVF9GT1JNQVRfUkVTLCAgICAgLyogcmZ1ICovCi0gIEdBVFRfRk9STUFUX0JPT0wsICAgIC8qIDB4MDEgYm9vbGVhbiAqLwotICBHQVRUX0ZPUk1BVF8yQklUUywgICAvKiAweDAyIDIgYml0ICovCi0gIEdBVFRfRk9STUFUX05JQkJMRSwgIC8qIDB4MDMgbmliYmxlICovCi0gIEdBVFRfRk9STUFUX1VJTlQ4LCAgIC8qIDB4MDQgdWludDggKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDEyLCAgLyogMHgwNSB1aW50MTIgKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDE2LCAgLyogMHgwNiB1aW50MTYgKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDI0LCAgLyogMHgwNyB1aW50MjQgKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDMyLCAgLyogMHgwOCB1aW50MzIgKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDQ4LCAgLyogMHgwOSB1aW50NDggKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDY0LCAgLyogMHgwYSB1aW50NjQgKi8KLSAgR0FUVF9GT1JNQVRfVUlOVDEyOCwgLyogMHgwQiB1aW50MTI4ICovCi0gIEdBVFRfRk9STUFUX1NJTlQ4LCAgIC8qIDB4MEMgc2lnbmVkIDggYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDEyLCAgLyogMHgwRCBzaWduZWQgMTIgYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDE2LCAgLyogMHgwRSBzaWduZWQgMTYgYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDI0LCAgLyogMHgwRiBzaWduZWQgMjQgYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDMyLCAgLyogMHgxMCBzaWduZWQgMzIgYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDQ4LCAgLyogMHgxMSBzaWduZWQgNDggYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDY0LCAgLyogMHgxMiBzaWduZWQgNjQgYml0IGludGVnZXIgKi8KLSAgR0FUVF9GT1JNQVRfU0lOVDEyOCwgLyogMHgxMyBzaWduZWQgMTI4IGJpdCBpbnRlZ2VyICovCi0gIEdBVFRfRk9STUFUX0ZMT0FUMzIsIC8qIDB4MTQgZmxvYXQgMzIgKi8KLSAgR0FUVF9GT1JNQVRfRkxPQVQ2NCwgLyogMHgxNSBmbG9hdCA2NCovCi0gIEdBVFRfRk9STUFUX1NGTE9BVCwgIC8qIDB4MTYgSUVFRS0xMTA3MyAxNiBiaXQgU0ZMT0FUICovCi0gIEdBVFRfRk9STUFUX0ZMT0FULCAgIC8qIDB4MTcgSUVFRS0xMTA3MyAzMiBiaXQgU0ZMT0FUICovCi0gIEdBVFRfRk9STUFUX0RVSU5UMTYsIC8qIDB4MTggSUVFRS0yMDYwMSBmb3JtYXQgKi8KLSAgR0FUVF9GT1JNQVRfVVRGOFMsICAgLyogMHgxOSBVVEYtOCBzdHJpbmcgKi8KLSAgR0FUVF9GT1JNQVRfVVRGMTZTLCAgLyogMHgxYSBVVEYtMTYgc3RyaW5nICovCi0gIEdBVFRfRk9STUFUX1NUUlVDVCwgIC8qIDB4MWIgT3BhcXVlIHN0cnVjdHVyZSovCi0gIEdBVFRfRk9STUFUX01BWCAgICAgIC8qIDB4MWMgb3IgYWJvdmUgcmVzZXJ2ZWQgKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEdBVFRfRk9STUFUOwotCi0vKiBDaGFyYWN0ZXJpc3RpYyBQcmVzZW50YXRpb24gRm9ybWF0IERlc2NyaXB0b3IgdmFsdWUKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHVuaXQ7ICAvKiBhcyBVVUlVRCBkZWZpbmVkIGJ5IFNJRyAqLwotICB1aW50MTZfdCBkZXNjcjsgLyogYXMgVVVJRCBhcyBkZWZpbmVkIGJ5IFNJRyAqLwotICB0R0FUVF9GT1JNQVQgZm9ybWF0OwotICBpbnQ4X3QgZXhwOwotICB1aW50OF90IG5hbWVfc3BjOyAvKiBUaGUgbmFtZSBzcGFjZSBvZiB0aGUgZGVzY3JpcHRpb24gKi8KLX0gdEdBVFRfQ0hBUl9QUkVTOwotCi0vKiBDaGFyYWN0ZXJpc3RpYyBSZXBvcnQgcmVmZXJlbmNlIERlc2NyaXB0b3IgZm9ybWF0Ci0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHJwdF9pZDsgICAvKiByZXBvcnQgSUQgKi8KLSAgdWludDhfdCBycHRfdHlwZTsgLyogcmVwb3J0IHR5cGUgKi8KLX0gdEdBVFRfQ0hBUl9SUFRfUkVGOwotCi0jZGVmaW5lIEdBVFRfVkFMSURfUkFOR0VfTUFYX1NJWkUgMTYKLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBmb3JtYXQ7Ci0gIHVpbnQxNl90IGxlbjsKLSAgdWludDhfdCBsb3dlcl9yYW5nZVtHQVRUX1ZBTElEX1JBTkdFX01BWF9TSVpFXTsgLyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KLSAgdWludDhfdCB1cHBlcl9yYW5nZVtHQVRUX1ZBTElEX1JBTkdFX01BWF9TSVpFXTsKLX0gdEdBVFRfVkFMSURfUkFOR0U7Ci0KLS8qIENoYXJhY3RlcmlzdGljIEFnZ3JlZ2F0ZSBGb3JtYXQgYXR0cmlidXRlIHZhbHVlCi0qLwotI2RlZmluZSBHQVRUX0FHR1JfSEFORExFX05VTV9NQVggMTAKLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBudW1faGFuZGxlOwotICB1aW50MTZfdCBoYW5kbGVfbGlzdFtHQVRUX0FHR1JfSEFORExFX05VTV9NQVhdOwotfSB0R0FUVF9DSEFSX0FHR1JFOwotCi0vKiBDaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9yOiBFeHRlbmRlZCBQcm9wZXJ0aWVzIHZhbHVlCi0qLwotLyogcGVybWl0cyByZWxpYWJsZSB3cml0ZXMgb2YgdGhlIENoYXJhY3RlcmlzdGljIFZhbHVlICovCi0jZGVmaW5lIEdBVFRfQ0hBUl9CSVRfUkVMX1dSSVRFIDB4MDAwMQotLyogcGVybWl0cyB3cml0ZXMgdG8gdGhlIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3IgKi8KLSNkZWZpbmUgR0FUVF9DSEFSX0JJVF9XUklURV9BVVggMHgwMDAyCi0KLS8qIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3I6IGNsaWVudCBjb25maWd1cmF0aW9uIHZhbHVlCi0qLwotI2RlZmluZSBHQVRUX0NMVF9DT05GSUdfTk9ORSAweDAwMDAKLSNkZWZpbmUgR0FUVF9DTFRfQ09ORklHX05PVElGSUNBVElPTiAweDAwMDEKLSNkZWZpbmUgR0FUVF9DTFRfQ09ORklHX0lORElDQVRJT04gMHgwMDAyCi0KLS8qIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3I6IHNlcnZlciBjb25maWd1cmF0aW9uIHZhbHVlCi0qLwotI2RlZmluZSBHQVRUX1NWUl9DT05GSUdfTk9ORSAweDAwMDAKLSNkZWZpbmUgR0FUVF9TVlJfQ09ORklHX0JST0FEQ0FTVCAweDAwMDEKLXR5cGVkZWYgdWludDE2X3QgdEdBVFRfU1ZSX0NIQVJfQ09ORklHOwotCi0vKiBDaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9yOiBFeHRlbmRlZCBQcm9wZXJ0aWVzIHZhbHVlCi0qLwotLyogcGVybWl0cyByZWxpYWJsZSB3cml0ZXMgb2YgdGhlIENoYXJhY3RlcmlzdGljIFZhbHVlICovCi0jZGVmaW5lIEdBVFRfQ0hBUl9CSVRfUkVMX1dSSVRFIDB4MDAwMQotLyogcGVybWl0cyB3cml0ZXMgdG8gdGhlIGNoYXJhY3RlcmlzdGljIGRlc2NyaXB0b3IgKi8KLSNkZWZpbmUgR0FUVF9DSEFSX0JJVF9XUklURV9BVVggMHgwMDAyCi0KLS8qIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVtZW50Ci0qLwotI2RlZmluZSBHQVRUX0FVVEhfUkVRX05PTkUgMAotI2RlZmluZSBHQVRUX0FVVEhfUkVRX05PX01JVE0gMSAvKiB1bmF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbiAqLwotI2RlZmluZSBHQVRUX0FVVEhfUkVRX01JVE0gMiAgICAvKiBhdXRoZW50aWNhdGVkIGVuY3J5cHRpb24gKi8KLSNkZWZpbmUgR0FUVF9BVVRIX1JFUV9TSUdORURfTk9fTUlUTSAzCi0jZGVmaW5lIEdBVFRfQVVUSF9SRVFfU0lHTkVEX01JVE0gNAotdHlwZWRlZiB1aW50OF90IHRHQVRUX0FVVEhfUkVROwotCi0vKiBBdHRyaWJ1dGUgVmFsdWUgc3RydWN0dXJlCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBjb25uX2lkOwotICB1aW50MTZfdCBoYW5kbGU7IC8qIGF0dHJpYnV0ZSBoYW5kbGUgKi8KLSAgdWludDE2X3Qgb2Zmc2V0OyAvKiBhdHRyaWJ1dGUgdmFsdWUgb2Zmc2V0LCBpZiBubyBvZmZmc2V0IGlzIG5lZWRlZCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgaWdub3JlIGl0ICovCi0gIHVpbnQxNl90IGxlbjsgICAgLyogbGVuZ3RoIG9mIGF0dHJpYnV0ZSB2YWx1ZSAqLwotICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcTsgICAgICAgICAgLyogIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgKi8KLSAgdWludDhfdCB2YWx1ZVtHQVRUX01BWF9BVFRSX0xFTl07IC8qIHRoZSBhY3R1YWwgYXR0cmlidXRlIHZhbHVlICovCi19IHRHQVRUX1ZBTFVFOwotCi0vKiBVbmlvbiBvZiB0aGUgZXZlbnQgZGF0YSB3aGljaCBpcyB1c2VkIGluIHRoZSBzZXJ2ZXIgcmVzcG9uZCBBUEkgdG8gY2FycnkgdGhlCi0gKiBzZXJ2ZXIgcmVzcG9uc2UgaW5mb3JtYXRpb24KLSovCi10eXBlZGVmIHVuaW9uIHsKLSAgLyogZGF0YSB0eXBlICAgICAgICAgICAgbWVtYmVyICAgICAgICAgIGV2ZW50ICAgKi8KLSAgdEdBVFRfVkFMVUUgYXR0cl92YWx1ZTsgLyogUkVBRCwgSEFORExFX1ZBTFVFX0lORCwgUFJFUEFSRV9XUklURSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRUFEX0JMT0IsIFJFQURfQllfVFlQRSAqLwotICB1aW50MTZfdCBoYW5kbGU7ICAgICAgICAvKiBXUklURSwgV1JJVEVfQkxPQiAqLwotCi19IHRHQVRUU19SU1A7Ci0KLSNkZWZpbmUgR0FUVF9QUkVQX1dSSVRFX0NBTkNFTCAweDAwCi0jZGVmaW5lIEdBVFRfUFJFUF9XUklURV9FWEVDIDB4MDEKLXR5cGVkZWYgdWludDhfdCB0R0FUVF9FWEVDX0ZMQUc7Ci0KLS8qIHJlYWQgcmVxdWVzdCBhbHdheXMgYmFzZWQgb24gVVVJRCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQxNl90IG9mZnNldDsKLSAgYm9vbCBpc19sb25nOwotICBidF9nYXR0X2RiX2F0dHJpYnV0ZV90eXBlX3QKLSAgICAgIGdhdHRfdHlwZTsgLyogYXJlIHdlIHdyaXRpbmcgY2hhcmFjdGVyaXN0aWMgb3IgZGVzY3JpcHRvciAqLwotfSB0R0FUVF9SRUFEX1JFUTsKLQotLyogd3JpdGUgcmVxdWVzdCBkYXRhICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGhhbmRsZTsgLyogYXR0cmlidXRlIGhhbmRsZSAqLwotICB1aW50MTZfdCBvZmZzZXQ7IC8qIGF0dHJpYnV0ZSB2YWx1ZSBvZmZzZXQsIGlmIG5vIG9mZmZzZXQgaXMgbmVlZGVkIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBpZ25vcmUgaXQgKi8KLSAgdWludDE2X3QgbGVuOyAgICAvKiBsZW5ndGggb2YgYXR0cmlidXRlIHZhbHVlICovCi0gIHVpbnQ4X3QgdmFsdWVbR0FUVF9NQVhfQVRUUl9MRU5dOyAvKiB0aGUgYWN0dWFsIGF0dHJpYnV0ZSB2YWx1ZSAqLwotICBib29sIG5lZWRfcnNwOyAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB3cml0ZSByZXNwb25zZSAqLwotICBib29sIGlzX3ByZXA7ICAgICAgICAgICAgICAgICAgICAgLyogaXMgcHJlcGFyZSB3cml0ZSAqLwotICBidF9nYXR0X2RiX2F0dHJpYnV0ZV90eXBlX3QKLSAgICAgIGdhdHRfdHlwZTsgLyogYXJlIHdlIHdyaXRpbmcgY2hhcmFjdGVyaXN0aWMgb3IgZGVzY3JpcHRvciAqLwotfSB0R0FUVF9XUklURV9SRVE7Ci0KLS8qIGNhbGxiYWNrIGRhdGEgZm9yIHNlcnZlciBhY2Nlc3MgcmVxdWVzdCBmcm9tIGNsaWVudCAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHRHQVRUX1JFQURfUkVRIHJlYWRfcmVxOyAvKiByZWFkIHJlcXVlc3QsIHJlYWQgYnkgVHlwZSwgcmVhZCBibG9iICovCi0KLSAgdEdBVFRfV1JJVEVfUkVRIHdyaXRlX3JlcTsgIC8qIHdyaXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVwYXJlIHdyaXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBibG9iICovCi0gIHVpbnQxNl90IGhhbmRsZTsgICAgICAgICAgICAvKiBoYW5kbGUgdmFsdWUgY29uZmlybWF0aW9uICovCi0gIHVpbnQxNl90IG10dTsgICAgICAgICAgICAgICAvKiBNVFUgZXhjaGFuZ2UgcmVxdWVzdCAqLwotICB0R0FUVF9FWEVDX0ZMQUcgZXhlY193cml0ZTsgLyogZXhlY3V0ZSB3cml0ZSAqLwotfSB0R0FUVFNfREFUQTsKLQotdHlwZWRlZiB1aW50OF90IHRHQVRUX1NFUlZfSUY7IC8qIEdBVFQgU2VydmljZSBJbnRlcmZhY2UgKi8KLQotZW51bSB7Ci0gIEdBVFRTX1JFUV9UWVBFX1JFQURfQ0hBUkFDVEVSSVNUSUMgPSAxLCAvKiBDaGFyIHJlYWQgcmVxdWVzdCAqLwotICBHQVRUU19SRVFfVFlQRV9SRUFEX0RFU0NSSVBUT1IsICAgICAgICAgLyogRGVzYyByZWFkIHJlcXVlc3QgKi8KLSAgR0FUVFNfUkVRX1RZUEVfV1JJVEVfQ0hBUkFDVEVSSVNUSUMsICAgIC8qIENoYXIgd3JpdGUgcmVxdWVzdCAqLwotICBHQVRUU19SRVFfVFlQRV9XUklURV9ERVNDUklQVE9SLCAgICAgICAgLyogRGVzYyB3cml0ZSByZXF1ZXN0ICovCi0gIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0VYRUMsICAgICAgICAgICAgICAvKiBFeGVjdXRlIHdyaXRlICovCi0gIEdBVFRTX1JFUV9UWVBFX01UVSwgICAgICAgICAgICAgICAgICAgICAvKiBNVFUgZXhjaGFuZ2UgaW5mb3JtYXRpb24gKi8KLSAgR0FUVFNfUkVRX1RZUEVfQ09ORiAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZSB2YWx1ZSBjb25maXJtYXRpb24gKi8KLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEdBVFRTX1JFUV9UWVBFOwotCi0vKiBDbGllbnQgVXNlZCBEYXRhIFN0cnVjdHVyZQotKi8KLS8qIGRlZmluaXRpb24gb2YgZGlmZmVyZW50IGRpc2NvdmVyeSB0eXBlcyAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEdBVFRfRElTQ19TUlZDX0FMTCA9IDEsIC8qIGRpc2NvdmVyIGFsbCBzZXJ2aWNlcyAqLwotICBHQVRUX0RJU0NfU1JWQ19CWV9VVUlELCAvKiBkaXNjb3ZlciBzZXJ2aWNlIG9mIGEgc3BlY2lhbCB0eXBlICovCi0gIEdBVFRfRElTQ19JTkNfU1JWQywgICAgIC8qIGRpc2NvdmVyIHRoZSBpbmNsdWRlZCBzZXJ2aWNlIHdpdGhpbiBhIHNlcnZpY2UgKi8KLSAgR0FUVF9ESVNDX0NIQVIsIC8qIGRpc2NvdmVyIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNlcnZpY2Ugd2l0aC93aXRob3V0IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50ICovCi0gIEdBVFRfRElTQ19DSEFSX0RTQ1BULCAvKiBkaXNjb3ZlciBjaGFyYWN0ZXJpc3RpYyBkZXNjcmlwdG9ycyBvZiBhIGNoYXJhY3RlciAqLwotICBHQVRUX0RJU0NfTUFYICAgICAgICAgLyogbWF4aW1udW4gZGlzY292ZXIgdHlwZSAqLwotfSB0R0FUVF9ESVNDX1RZUEU7Ci0KLS8qIEdBVFQgcmVhZCB0eXBlIGVudW1lcmF0aW9uCi0qLwotZW51bSB7Ci0gIEdBVFRfUkVBRF9CWV9UWVBFID0gMSwKLSAgR0FUVF9SRUFEX0JZX0hBTkRMRSwKLSAgR0FUVF9SRUFEX01VTFRJUExFLAotICBHQVRUX1JFQURfQ0hBUl9WQUxVRSwKLSAgR0FUVF9SRUFEX1BBUlRJQUwsCi0gIEdBVFRfUkVBRF9NQVgKLX07Ci10eXBlZGVmIHVpbnQ4X3QgdEdBVFRfUkVBRF9UWVBFOwotCi0vKiBSZWFkIEJ5IFR5cGUgUmVxdWVzdCAoR0FUVF9SRUFEX0JZX1RZUEUpIERhdGEKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxOwotICB1aW50MTZfdCBzX2hhbmRsZTsKLSAgdWludDE2X3QgZV9oYW5kbGU7Ci0gIGJsdWV0b290aDo6VXVpZCB1dWlkOwotfSB0R0FUVF9SRUFEX0JZX1RZUEU7Ci0KLS8qICAgR0FUVF9SRUFEX01VTFRJUExFIHJlcXVlc3QgZGF0YQotKi8KLSNkZWZpbmUgR0FUVF9NQVhfUkVBRF9NVUxUSV9IQU5ETEVTIFwKLSAgMTAgLyogTWF4IGF0dHJpYnV0ZXMgdG8gcmVhZCBpbiBvbmUgcmVxdWVzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcTsKLSAgdWludDE2X3QgbnVtX2hhbmRsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaGFuZGxlcyB0byByZWFkICovCi0gIHVpbnQxNl90IGhhbmRsZXNbR0FUVF9NQVhfUkVBRF9NVUxUSV9IQU5ETEVTXTsgLyogaGFuZGxlcyBsaXN0IHRvIGJlIHJlYWQgKi8KLSAgYm9vbCB2YXJpYWJsZV9sZW47Ci19IHRHQVRUX1JFQURfTVVMVEk7Ci0KLS8qICAgUmVhZCBCeSBIYW5kbGUgUmVxdWVzdCAoR0FUVF9SRUFEX0JZX0hBTkRMRSkgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcTsKLSAgdWludDE2X3QgaGFuZGxlOwotfSB0R0FUVF9SRUFEX0JZX0hBTkRMRTsKLQotLyogICBSRUFEX0JUX0hBTkRMRV9SZXF1ZXN0IGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXE7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3Qgb2Zmc2V0OwotfSB0R0FUVF9SRUFEX1BBUlRJQUw7Ci0KLS8qIFJlYWQgUmVxdWVzdCBEYXRhCi0qLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHRHQVRUX1JFQURfQllfVFlQRSBzZXJ2aWNlOwotICB0R0FUVF9SRUFEX0JZX1RZUEUgY2hhcl90eXBlOyAvKiBjaGFyYWN0ZXJpc2l0YyB0eXBlICovCi0gIHRHQVRUX1JFQURfTVVMVEkgcmVhZF9tdWx0aXBsZTsKLSAgdEdBVFRfUkVBRF9CWV9IQU5ETEUgYnlfaGFuZGxlOwotICB0R0FUVF9SRUFEX1BBUlRJQUwgcGFydGlhbDsKLX0gdEdBVFRfUkVBRF9QQVJBTTsKLQotLyogR0FUVCB3cml0ZSB0eXBlIGVudW1lcmF0aW9uICovCi1lbnVtIHsgR0FUVF9XUklURV9OT19SU1AgPSAxLCBHQVRUX1dSSVRFLCBHQVRUX1dSSVRFX1BSRVBBUkUgfTsKLXR5cGVkZWYgdWludDhfdCB0R0FUVF9XUklURV9UWVBFOwotCi0vKiBDbGllbnQgT3BlcmF0aW9uIENvbXBsZXRlIENhbGxiYWNrIERhdGEKLSovCi10eXBlZGVmIHVuaW9uIHsKLSAgdEdBVFRfVkFMVUUgYXR0X3ZhbHVlOwotICB1aW50MTZfdCBtdHU7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgY2lkOwotfSB0R0FUVF9DTF9DT01QTEVURTsKLQotLyogR0FUVCBjbGllbnQgb3BlcmF0aW9uIHR5cGUsIHVzZWQgaW4gY2xpZW50IGNhbGxiYWNrIGZ1bmN0aW9uCi0qLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEdBVFRDX09QVFlQRV9OT05FID0gMCwKLSAgR0FUVENfT1BUWVBFX0RJU0NPVkVSWSA9IDEsCi0gIEdBVFRDX09QVFlQRV9SRUFEID0gMiwKLSAgR0FUVENfT1BUWVBFX1dSSVRFID0gMywKLSAgR0FUVENfT1BUWVBFX0VYRV9XUklURSA9IDQsCi0gIEdBVFRDX09QVFlQRV9DT05GSUcgPSA1LAotICBHQVRUQ19PUFRZUEVfTk9USUZJQ0FUSU9OID0gNiwKLSAgR0FUVENfT1BUWVBFX0lORElDQVRJT04gPSA3LAotfSB0R0FUVENfT1BUWVBFOwotCi0vKiBjaGFyYWN0ZXJpc3RpYyBkZWNsYXJhdGlvbgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRfQ0hBUl9QUk9QIGNoYXJfcHJvcDsgLyogY2hhcmFjdGVyaXNpdGMgcHJvcGVydGllcyAqLwotICB1aW50MTZfdCB2YWxfaGFuZGxlOyAgICAgICAvKiBjaGFyYWN0ZXJpc3RpYyB2YWx1ZSBhdHRyaWJ1dGUgaGFuZGxlICovCi0gIGJsdWV0b290aDo6VXVpZCBjaGFyX3V1aWQ7IC8qIGNoYXJhY3RlcmlzdGljIFVVSUQgdHlwZSAqLwotfSB0R0FUVF9DSEFSX0RDTFJfVkFMOwotCi0vKiBwcmltYXJ5IHNlcnZpY2UgZ3JvdXAgZGF0YQotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgZV9oYW5kbGU7ICAgICAvKiBlbmRpbmcgaGFuZGxlIG9mIHRoZSBncm91cCAqLwotICBibHVldG9vdGg6OlV1aWQgc2VydmljZV90eXBlOyAvKiBncm91cCB0eXBlICovCi19IHRHQVRUX0dST1VQX1ZBTFVFOwotCi0vKiBpbmNsdWRlZCBzZXJ2aWNlIGF0dHJpYnV0ZSB2YWx1ZQotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYmx1ZXRvb3RoOjpVdWlkIHNlcnZpY2VfdHlwZTsgLyogaW5jbHVkZWQgc2VydmljZSBVVUlEICovCi0gIHVpbnQxNl90IHNfaGFuZGxlOyAgICAgLyogc3RhcnRpbmcgaGFuZGxlICovCi0gIHVpbnQxNl90IGVfaGFuZGxlOyAgICAgLyogZW5kaW5nIGhhbmRsZSAqLwotfSB0R0FUVF9JTkNMX1NSVkM7Ci0KLXR5cGVkZWYgdW5pb24gewotICB0R0FUVF9JTkNMX1NSVkMgaW5jbF9zZXJ2aWNlOyAgLyogaW5jbHVkZSBzZXJ2aWNlIHZhbHVlICovCi0gIHRHQVRUX0dST1VQX1ZBTFVFIGdyb3VwX3ZhbHVlOyAvKiBTZXJ2aWNlIFVVSUQgdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgdXNlZCB3aXRoIEdBVFRfRElTQ19TUlZDX0FMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgR0FUVF9ESVNDX1NSVkNfQllfVVVJRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBvZiBkaXNjb3ZlcnkgcmVzdWx0IGNhbGxiYWNrLiAqLwotCi0gIHVpbnQxNl90IGhhbmRsZTsgLyogV2hlbiB1c2VkIHdpdGggR0FUVF9ESVNDX0lOQ19TUlZDIHR5cGUgZGlzY292ZXJ5IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB0aGUgaW5jbHVkZWQgc2VydmljZSBzdGFydGluZyBoYW5kbGUuKi8KLQotICB0R0FUVF9DSEFSX0RDTFJfVkFMCi0gICAgICBkY2xyX3ZhbHVlOyAvKiBDaGFyYWN0ZXJpc3RpYyBkZWNsYXJhdGlvbiB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgdXNlZCB3aXRoIEdBVFRfRElTQ19DSEFSIHR5cGUgZGlzY292ZXJ5LiovCi19IHRHQVRUX0RJU0NfVkFMVUU7Ci0KLS8qIGRpc2NvdmVyIHJlc3VsdCByZWNvcmQKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJsdWV0b290aDo6VXVpZCB0eXBlOwotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHRHQVRUX0RJU0NfVkFMVUUgdmFsdWU7Ci19IHRHQVRUX0RJU0NfUkVTOwotCi0jZGVmaW5lIEdBVFRfTElOS19JRExFX1RJTUVPVVRfV0hFTl9OT19BUFAgIFwKLSAgMSAvKiBzdGFydCBhIGlkbGUgdGltZXIgZm9yIHRoaXMgZHVyYXRpb24gXAotICAgICB3aGVuIG5vIGFwcGxpY2F0aW9uIG5lZWQgdG8gdXNlIHRoZSBsaW5rICovCi0KLSNkZWZpbmUgR0FUVF9MSU5LX05PX0lETEVfVElNRU9VVCAweEZGRkYKLQotI2RlZmluZSBHQVRUX0lOVkFMSURfQUNMX0hBTkRMRSAweEZGRkYKLS8qIGRpc2NvdmVyIHJlc3VsdCBjYWxsYmFjayBmdW5jdGlvbiAqLwotdHlwZWRlZiB2b2lkKHRHQVRUX0RJU0NfUkVTX0NCKSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDX1JFUyogcF9kYXRhKTsKLQotLyogZGlzY292ZXIgY29tcGxldGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLXR5cGVkZWYgdm9pZCh0R0FUVF9ESVNDX0NNUExfQ0IpKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzKTsKLQotLyogRGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gcmVhZC93cml0ZS9kaXNjL2NvbmZpZyBvcGVyYXRpb24gaXMKLSAqIGNvbXBsZXRlZC4gKi8KLXR5cGVkZWYgdm9pZCh0R0FUVF9DTVBMX0NCQUNLKSh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsIHRHQVRUX0NMX0NPTVBMRVRFKiBwX2RhdGEpOwotCi0vKiBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGFuIGluaXRpYWxpemVkIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuICovCi10eXBlZGVmIHZvaWQodEdBVFRfQ09OTl9DQkFDSykodEdBVFRfSUYgZ2F0dF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faWQsIGJvb2wgY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qIGF0dHJpYnV0ZSByZXF1ZXN0IGNhbGxiYWNrIGZvciBBVFQgc2VydmVyICovCi10eXBlZGVmIHZvaWQodEdBVFRfUkVRX0NCQUNLKSh1aW50MTZfdCBjb25uX2lkLCB1aW50MzJfdCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSB0eXBlLCB0R0FUVFNfREFUQSogcF9kYXRhKTsKLQotLyogY2hhbm5lbCBjb25nZXN0aW9uL3VuY29uZ2VzdGlvbiBjYWxsYmFjayAqLwotdHlwZWRlZiB2b2lkKHRHQVRUX0NPTkdFU1RJT05fQ0JBQ0spKHVpbnQxNl90IGNvbm5faWQsIGJvb2wgY29uZ2VzdGVkKTsKLQotLyogRGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBlbmNyeXB0aW9uIGlzIGVzdGFibGlzaGVkLiAqLwotdHlwZWRlZiB2b2lkKHRHQVRUX0VOQ19DTVBMX0NCKSh0R0FUVF9JRiBnYXR0X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotCi0vKiBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHBoeSBpcyB1cGRhdGVkLiAqLwotdHlwZWRlZiB2b2lkKHRHQVRUX1BIWV9VUERBVEVfQ0IpKHRHQVRUX0lGIGdhdHRfaWYsIHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpOwotCi0vKiBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBhcmUgdXBkYXRlZCAqLwotdHlwZWRlZiB2b2lkKHRHQVRUX0NPTk5fVVBEQVRFX0NCKSh0R0FUVF9JRiBnYXR0X2lmLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgdEdBVFRfU1RBVFVTIHN0YXR1cyk7Ci0KLS8qIERlZmluZSB0aGUgc3RydWN0dXJlIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0byByZWdpc3RlciB3aXRoCi0gKiBHQVRULiBUaGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBjYWxsYmFjayBmdW5jdGlvbnMuIEFsbCBmdW5jdGlvbnMKLSAqIE1VU1QgYmUgcHJvdmlkZWQuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0R0FUVF9DT05OX0NCQUNLKiBwX2Nvbm5fY2J7bnVsbHB0cn07Ci0gIHRHQVRUX0NNUExfQ0JBQ0sqIHBfY21wbF9jYntudWxscHRyfTsKLSAgdEdBVFRfRElTQ19SRVNfQ0IqIHBfZGlzY19yZXNfY2J7bnVsbHB0cn07Ci0gIHRHQVRUX0RJU0NfQ01QTF9DQiogcF9kaXNjX2NtcGxfY2J7bnVsbHB0cn07Ci0gIHRHQVRUX1JFUV9DQkFDSyogcF9yZXFfY2J7bnVsbHB0cn07Ci0gIHRHQVRUX0VOQ19DTVBMX0NCKiBwX2VuY19jbXBsX2Nie251bGxwdHJ9OwotICB0R0FUVF9DT05HRVNUSU9OX0NCQUNLKiBwX2Nvbmdlc3Rpb25fY2J7bnVsbHB0cn07Ci0gIHRHQVRUX1BIWV9VUERBVEVfQ0IqIHBfcGh5X3VwZGF0ZV9jYntudWxscHRyfTsKLSAgdEdBVFRfQ09OTl9VUERBVEVfQ0IqIHBfY29ubl91cGRhdGVfY2J7bnVsbHB0cn07Ci19IHRHQVRUX0NCQUNLOwotCi0vKioqKioqKioqKioqKioqKiogIFN0YXJ0IEhhbmRsZSBNYW5hZ2VtZW50IERlZmluaXRpb25zICAgKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJsdWV0b290aDo6VXVpZCBhcHBfdXVpZDEyODsKLSAgYmx1ZXRvb3RoOjpVdWlkIHN2Y191dWlkOwotICB1aW50MTZfdCBzX2hhbmRsZTsKLSAgdWludDE2X3QgZV9oYW5kbGU7Ci0gIGJvb2wgaXNfcHJpbWFyeTsgLyogcHJpbWFyeSBzZXJ2aWNlIG9yIHNlY29uZGFyeSAqLwotfSB0R0FUVFNfSE5ETF9SQU5HRTsKLQotI2RlZmluZSBHQVRUU19TUlZfQ0hHX0NNRF9BRERfQ0xJRU5UIDEKLSNkZWZpbmUgR0FUVFNfU1JWX0NIR19DTURfVVBEQVRFX0NMSUVOVCAyCi0jZGVmaW5lIEdBVFRTX1NSVl9DSEdfQ01EX1JFTU9WRV9DTElFTlQgMwotI2RlZmluZSBHQVRUU19TUlZfQ0hHX0NNRF9SRUFEX05VTV9DTEVOVFMgNAotI2RlZmluZSBHQVRUU19TUlZfQ0hHX0NNRF9SRUFEX0NMRU5UIDUKLXR5cGVkZWYgdWludDhfdCB0R0FUVFNfU1JWX0NIR19DTUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIGJvb2wgc3J2X2NoYW5nZWQ7Ci19IHRHQVRUU19TUlZfQ0hHOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdEdBVFRTX1NSVl9DSEcgc3J2X2NoZzsKLSAgdWludDhfdCBjbGllbnRfcmVhZF9pbmRleDsgLyogb25seSB1c2VkIGZvciBzZXF1ZW50aWFsIHJlYWRpbmcgY2xpZW50IHNydiBjaGcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyAqLwotfSB0R0FUVFNfU1JWX0NIR19SRVE7Ci0KLXR5cGVkZWYgdW5pb24gewotICB0R0FUVFNfU1JWX0NIRyBzcnZfY2hnOwotICB1aW50OF90IG51bV9jbGllbnRzOwotfSB0R0FUVFNfU1JWX0NIR19SU1A7Ci0KLS8qIEF0dGlidXRlIHNlcnZlciBoYW5kbGUgcmFuZ2VzIE5WIHN0b3JhZ2UgY2FsbGJhY2sgZnVuY3Rpb25zCi0qLwotdHlwZWRlZiB2b2lkKHRHQVRUU19OVl9TQVZFX0NCQUNLKShib29sIGlzX3NhdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVFNfSE5ETF9SQU5HRSogcF9obmRsX3JhbmdlKTsKLXR5cGVkZWYgYm9vbCh0R0FUVFNfTlZfU1JWX0NIR19DQkFDSykodEdBVFRTX1NSVl9DSEdfQ01EIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1NSVl9DSEdfUkVRKiBwX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1NSVl9DSEdfUlNQKiBwX3JzcCk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEdBVFRTX05WX1NBVkVfQ0JBQ0sqIHBfbnZfc2F2ZV9jYWxsYmFjazsKLSAgdEdBVFRTX05WX1NSVl9DSEdfQ0JBQ0sqIHBfc3J2X2NoZ19jYWxsYmFjazsKLX0gdEdBVFRfQVBQTF9JTkZPOwotCi0vKioqKioqKioqKioqKioqKioqKiogIEVuZCBIYW5kbGUgTWFuYWdlbWVudCBEZWZpbml0aW9ucyAgICoqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdBVFQgUHJvZmlsZSBBUEkgRnVuY3Rpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR0FUVCBQcm9maWxlIFNlcnZlciBGdW5jdGlvbnMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUU19OVlJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBcHBsaWNhdGlvbiBtYW5hZ2VyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgZm9yCi0gKiAgICAgICAgICAgICAgICAgIE5WIHNhdmUgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGVyZSBjYW4gYmUgb25lIGFuZCBvbmx5IG9uZQotICogICAgICAgICAgICAgICAgICBOViBzYXZlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgcF9jYl9pbmZvIDogY2FsbGJhY2sgaW5mb3JtYWl0b24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVnaXN0ZXJlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBHQVRUU19OVlJlZ2lzdGVyKHRHQVRUX0FQUExfSU5GTyogcF9jYl9pbmZvKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEJUQV9HQVRUU19BZGRTZXJ2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBZGQgYSBzZXJ2aWNlLiBXaGVuIHNlcnZpY2UgaXMgcmVhZHksIGEgY2FsbGJhY2sKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQgQlRBX0dBVFRTX0FERF9TUlZDX0VWVCBpcyBjYWxsZWQgdG8gcmVwb3J0IHN0YXR1cwotICogICAgICAgICAgICAgICAgICBhbmQgaGFuZGxlcyB0byB0aGUgcHJvZmlsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIHNlcnZlcl9pZjogc2VydmVyIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgICAgc2VydmljZTogcG9pbnRlciBhcnJheSBkZXNjcmliaW5nIHNlcnZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gc2VydmljZSBhcnJheS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG9uIHN1Y2Nlc3MgR0FUVF9TRVJWSUNFX1NUQVJURUQgaXMgcmV0dXJuZWQsIGFuZAotICogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfaGFuZGxlIGZpZWxkIGluc2lkZSBzZXJ2aWNlIGVsZW1lbnRzIGFyZSBmaWxsZWQuCi0gKiAgICAgICAgICAgICAgICAgIG9uIGVycm9yIGVycm9yIHN0YXR1cyBpcyByZXR1cm5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBHQVRUU19BZGRTZXJ2aWNlKHRHQVRUX0lGIGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRnYXR0X2RiX2VsZW1lbnRfdCogc2VydmljZSwgaW50IGNvdW50KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRTX0RlbGV0ZVNlcnZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhIHNlcnZpY2UuCi0gKgotICogUGFyYW1ldGVyICAgICAgICBnYXR0X2lmICAgICAgIDogYXBwbGljYXRpb24gaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgIHBfc3ZjX3V1aWQgICAgOiBzZXJ2aWNlIFVVSUQKLSAqICAgICAgICAgICAgICAgICAgc3ZjX2luc3QgICAgICA6IGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGluc2lkZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIG9wZXJhdGlvbiBzdWNjZWVkLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEdBVFRTX0RlbGV0ZVNlcnZpY2UodEdBVFRfSUYgZ2F0dF9pZiwgYmx1ZXRvb3RoOjpVdWlkKiBwX3N2Y191dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdmNfaW5zdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUU19TdG9wU2VydmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RvcCBhIHNlcnZpY2UKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgICBzZXJ2aWNlX2hhbmRsZSA6IHRoaXMgaXMgdGhlIHN0YXJ0IGhhbmRsZSBvZiBhIHNlcnZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEdBVFRTX1N0b3BTZXJ2aWNlKHVpbnQxNl90IHNlcnZpY2VfaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRzX0hhbmRsZVZhbHVlSW5kaWNhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGhhbmRsZSB2YWx1ZSBpbmRpY2F0aW9uIHRvIGEgY2xpZW50LgotICoKLSAqIFBhcmFtZXRlciAgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICogICAgICAgICAgICAgICAgICBhdHRyX2hhbmRsZTogQXR0cmlidXRlIGhhbmRsZSBvZiB0aGlzIGhhbmRsZSB2YWx1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgdmFsX2xlbjogTGVuZ3RoIG9mIHRoZSBpbmRpY2F0ZWQgYXR0cmlidXRlIHZhbHVlLgotICogICAgICAgICAgICAgICAgICBwX3ZhbDogUG9pbnRlciB0byB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSBkYXRhLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIHN1Y2Vzc2Z1bGx5IHNlbnQgb3IgcXVldWVkOyBvdGhlcndpc2UgZXJyb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0R0FUVF9TVEFUVVMgR0FUVFNfSGFuZGxlVmFsdWVJbmRpY2F0aW9uKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZhbF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3ZhbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUU19IYW5kbGVWYWx1ZU5vdGlmaWNhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGhhbmRsZSB2YWx1ZSBub3RpZmljYXRpb24gdG8gYSBjbGllbnQuCi0gKgotICogUGFyYW1ldGVyICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgYXR0cl9oYW5kbGU6IEF0dHJpYnV0ZSBoYW5kbGUgb2YgdGhpcyBoYW5kbGUgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgIHZhbF9sZW46IExlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4KLSAqICAgICAgICAgICAgICAgICAgcF92YWw6IFBvaW50ZXIgdG8gdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgdmFsdWUgZGF0YS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfU1VDQ0VTUyBpZiBzdWNlc3NmdWxseSBzZW50OyBvdGhlcndpc2UgZXJyb3IgY29kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBHQVRUU19IYW5kbGVWYWx1ZU5vdGlmaWNhdGlvbih1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmFsX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF92YWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVFNfU2VuZFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgc2VydmVyIHJlc3BvbnNlIHRvIGNsaWVudC4KLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgdHJhbnNfaWQ6IHRyYW5zYWN0aW9uIGlkCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Ugc3RhdHVzCi0gKiAgICAgICAgICAgICAgICAgIHBfbXNnOiBwb2ludGVyIHRvIG1lc3NhZ2UgcGFyYW1ldGVycyBzdHJ1Y3R1cmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgc3VjZXNzZnVsbHkgc2VudDsgb3RoZXJ3aXNlIGVycm9yIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0R0FUVF9TVEFUVVMgR0FUVFNfU2VuZFJzcCh1aW50MTZfdCBjb25uX2lkLCB1aW50MzJfdCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB0R0FUVFNfUlNQKiBwX21zZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHQVRUIFByb2ZpbGUgQ2xpZW50IEZ1bmN0aW9ucyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRDX0NvbmZpZ3VyZU1UVQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29uZmlndXJlIHRoZSBBVFQgTVRVIHNpemUgZm9yCi0gKiAgICAgICAgICAgICAgICAgIGEgY29ubmVjdGlvbiBvbiBhbiBMRSB0cmFuc3BvcnQuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIGlkZW50aWZpZXIuCi0gKiAgICAgICAgICAgICAgICAgIG10dSAgICAtIGF0dHJpYnV0ZSBNVFUgc2l6ZS4uCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgY29tbWFuZCBzdGFydGVkIHN1Y2Nlc3NmdWxseS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBHQVRUQ19Db25maWd1cmVNVFUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgbXR1KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRDX0Rpc2NvdmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkbyBhIGRpc2NvdmVyeSBwcm9jZWR1cmUgb24gQVRUCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgZGlzY190eXBlOmRpc2NvdmVyeSB0eXBlLgotICogICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUgYW5kIGVuZF9oYW5kbGU6IHJhbmdlIG9mIGhhbmRsZXMgZm9yIGRpc2NvdmVyeQotICogICAgICAgICAgICAgICAgICB1dWlkOiB1dWlkIHRvIGRpc2NvdmVyeS4gc2V0IHRvIFV1aWQ6OmtFbXB0eSBmb3IgcmVxdWVzdHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkb24ndCBuZWVkIGl0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgY29tbWFuZCByZWNlaXZlZC9zZW50IHN1Y2Nlc3NmdWxseS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBHQVRUQ19EaXNjb3Zlcih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9oYW5kbGUsIHVpbnQxNl90IGVuZF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCk7Ci1leHRlcm4gdEdBVFRfU1RBVFVTIEdBVFRDX0Rpc2NvdmVyKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSwgdWludDE2X3QgZW5kX2hhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUQ19SZWFkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUKLSAqICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgc2VydmVyLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICogICAgICAgICAgICAgICAgICB0eXBlICAgIC0gYXR0cmlidXRlIHJlYWQgdHlwZS4KLSAqICAgICAgICAgICAgICAgICAgcF9yZWFkICAtIHJlYWQgb3BlcmF0aW9uIHBhcmFtZXRlcnMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBHQVRUX1NVQ0NFU1MgaWYgY29tbWFuZCBzdGFydGVkIHN1Y2Nlc3NmdWxseS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBHQVRUQ19SZWFkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1JFQURfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1JFQURfUEFSQU0qIHBfcmVhZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUQ19Xcml0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHNlcnZlci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGNvbm5faWQ6IGNvbm5lY3Rpb24gaWRlbnRpZmllci4KLSAqICAgICAgICAgICAgICAgICAgdHlwZSAgICAtIGF0dHJpYnV0ZSB3cml0ZSB0eXBlLgotICogICAgICAgICAgICAgICAgICBwX3dyaXRlICAtIHdyaXRlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGNvbW1hbmQgc3RhcnRlZCBzdWNjZXNzZnVsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0R0FUVF9TVEFUVVMgR0FUVENfV3JpdGUodWludDE2X3QgY29ubl9pZCwgdEdBVFRfV1JJVEVfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9WQUxVRSogcF93cml0ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUQ19FeGVjdXRlV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgYW4gRXhlY3V0ZSB3cml0ZSByZXF1ZXN0IHRvCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIGlkZW50aWZpZXIuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2V4ZWN1dGUgLSB0byBleGVjdXRlIG9yIGNhbmNlbCB0aGUgcHJlcGFyZSB3cml0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdChzKQotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGNvbW1hbmQgc3RhcnRlZCBzdWNjZXNzZnVsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0R0FUVF9TVEFUVVMgR0FUVENfRXhlY3V0ZVdyaXRlKHVpbnQxNl90IGNvbm5faWQsIGJvb2wgaXNfZXhlY3V0ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUQ19TZW5kSGFuZGxlVmFsdWVDb25maXJtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGEgaGFuZGxlIHZhbHVlIGNvbmZpcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBhcyByZXNwb25zZSB0byBhIGhhbmRsZSB2YWx1ZSBub3RpZmljYXRpb24gZnJvbSBzZXJ2ZXIuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIGlkZW50aWZpZXIuCi0gKiAgICAgICAgICAgICAgICAgIGhhbmRsZTogdGhlIGhhbmRsZSBvZiB0aGUgYXR0cmlidXRlIGNvbmZpcm1hdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEdBVFRfU1VDQ0VTUyBpZiBjb21tYW5kIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEdBVFRfU1RBVFVTIEdBVFRDX1NlbmRIYW5kbGVWYWx1ZUNvbmZpcm0odWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVF9TZXRJZGxlVGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiAoY29tbW9uIHRvIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIpIHNldHMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGlkbGUgdGltZW91dCBmb3IgYSB0YW5zcG9ydCBjb25uZWN0aW9uCi0gKgotICogUGFyYW1ldGVyICAgICAgICBiZF9hZGRyOiAgIHRhcmdldCBkZXZpY2UgYmQgYWRkcmVzcy4KLSAqICAgICAgICAgICAgICAgICAgaWRsZV90b3V0OiB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCi0gKiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhc25wb3J0IG9wdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgR0FUVF9TZXRJZGxlVGltZW91dChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBpZGxlX3RvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGFuICBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICB3aXRoIEdBVFQKLSAqCi0gKiBQYXJhbWV0ZXIgICAgICAgIHBfYXBwX3V1aWQxMjg6IEFwcGxpY2F0aW9uIFVVSUQKLSAqICAgICAgICAgICAgICAgICAgcF9jYl9pbmZvOiBjYWxsYmFjayBmdW5jdGlvbnMuCi0gKiAgICAgICAgICAgICAgICAgIGVhdHRfc3VwcG9ydDogc2V0IHN1cHBvcnQgZm9yIGVhdHQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIDAgZm9yIGVycm9yLCBvdGhlcndpc2UgdGhlIGluZGV4IG9mIHRoZSBjbGllbnQgcmVnaXN0ZXJlZAotICogICAgICAgICAgICAgICAgICB3aXRoIEdBVFQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX0lGIEdBVFRfUmVnaXN0ZXIoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBwX2FwcF91dWlkMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSwgdEdBVFRfQ0JBQ0sqIHBfY2JfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZWF0dF9zdXBwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBkZXJlZ2lzdGVyZWQgdGhlIGFwcGxpY2F0aW9uIGZyb20gR0FUVC4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGdhdHRfaWY6IGFwcGxpY2FpdG9uIGludGVyZmFjZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEdBVFRfRGVyZWdpc3Rlcih0R0FUVF9JRiBnYXR0X2lmKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfU3RhcnRJZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgcmVnaXN0cmF0aW9uIHRvIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBjYWxsYmFja3MgZm9yIHJlZ2lzdGVyZWQgaW50ZXJmYWNlLiAgRnVuY3Rpb24gbWF5Ci0gKiAgICAgICAgICAgICAgICAgIGNhbGwgYmFjayB3aXRoIGNvbm5lY3Rpb24gc3RhdHVzIGFuZCBxdWV1ZWQgbm90aWZpY2F0aW9ucwotICoKLSAqIFBhcmFtZXRlciAgICAgICAgZ2F0dF9pZjogYXBwbGljYWl0b24gaW50ZXJmYWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBHQVRUX1N0YXJ0SWYodEdBVFRfSUYgZ2F0dF9pZik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX0Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGUgYSBjb25uZWN0dGlvbiB0byBhIHJlbW90ZSBkZXZpY2Ugb24KLSAqICAgICAgICAgICAgICAgICAgR0FUVCBjaGFubmVsLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgZ2F0dF9pZjogYXBwbGljYWl0b24gaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHI6IHBlZXIgZGV2aWNlIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDogaXMgYSBkaXJlY3QgY29ubmVjdGlvbiBvciBhIGJhY2tncm91bmQgYXV0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IDogUGh5c2ljYWwgdHJhbnNwb3J0IGZvciBHQVRUIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJSL0VEUiBvciBMRSkKLSAqICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pc3RpYzogd2lsbCBub3Qga2VlcCBkZXZpY2UgY29ubmVjdGVkIGlmIG90aGVyIGFwcHMKLSAqICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QsIHdpbGwgbm90IHVwZGF0ZSBjb25uZWN0ZWQgYXBwcyBjb3VudGVyLCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgd29uJ3QgY2F1c2UgcGh5c2ljYWwgZGlzY29ubmVjdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgY29ubmVjdGlvbiBzdGFydGVkOyBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEdBVFRfQ29ubmVjdCh0R0FUVF9JRiBnYXR0X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wcG9ydHVuaXN0aWMpOwotZXh0ZXJuIGJvb2wgR0FUVF9Db25uZWN0KHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3Bwb3J0dW5pc3RpYywgdWludDhfdCBpbml0aWF0aW5nX3BoeXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgR0FUVF9DYW5jZWxDb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gaW5pdGlhdGlvbiB0byBhIHJlbW90ZSBkZXZpY2Ugb24gYQotICogICAgICAgICAgICAgICAgICBHQVRUIGNoYW5uZWwuCi0gKgotICogUGFyYW1ldGVycyAgICAgICBnYXR0X2lmOiBjbGllbnQgaW50ZXJmYWNlLiBJZiAwIHVzZWQgYXMgdW5jb25kaXRpb25hbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QsIHR5cGljYWxseSB1c2VkIGZvciBkaXJlY3QgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHI6IHBlZXIgZGV2aWNlIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIGlzX2RpcmVjdDogaXMgYSBkaXJlY3QgY29uZW5lY3Rpb24gb3IgYSBiYWNrZ3JvdW5kIGF1dG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNvbm5lY3Rpb24gc3RhcnRlZDsgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBHQVRUX0NhbmNlbENvbm5lY3QodEdBVFRfSUYgZ2F0dF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX0Rpc2Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERpc2Nvbm5lY3QgdGhlIEdBVFQgY2hhbm5lbCBmb3IgdGhpcyByZWdpc3RlcmVkIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgY29ubl9pZDogY29ubmVjdGlvbiBpZGVudGlmaWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgR0FUVF9TVUNDRVNTIGlmIGRpc2Nvbm5lY3RlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBHQVRUX0Rpc2Nvbm5lY3QodWludDE2X3QgY29ubl9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX0dldENvbm5lY3Rpb25JbmZvcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXNlIGNvbm5faWQgdG8gZmluZCBpdHMgYXNzb2NpYXRlZCBCRCBhZGRyZXNzIGFuZAotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpbnRlcmZhY2UKLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgICBjb25uX2lkOiBjb25uZWN0aW9uIGlkICAoaW5wdXQpCi0gKiAgICAgICAgICAgICAgICAgICBwX2dhdHRfaWY6IGFwcGxpY2FpdG9uIGludGVyZmFjZSAob3V0cHV0KQotICogICAgICAgICAgICAgICAgICAgYmRfYWRkcjogcGVlciBkZXZpY2UgYWRkcmVzcy4gKG91dHB1dCkKLSAqICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA6IHBoeXNpY2FsIHRyYW5zcG9ydCBvZiB0aGUgR0FUVCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJSL0VEUiBvciBMRSkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgdGhlIGxpZ2ljYWwgbGluayBpbmZvcm1hdGlvbiBpcyBmb3VuZCBmb3IgY29ubl9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBHQVRUX0dldENvbm5lY3Rpb25JbmZvcih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9JRiogcF9nYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQqIHBfdHJhbnNwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgdGhlIGNvbm5faWQgaWYgdGhlIGxvZ2ljYWwgbGluayBmb3IgYSBCRCBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgaXMgY29ubmVjdGVkCi0gKgotICogUGFyYW1ldGVycyAgICAgICAgZ2F0dF9pZjogYXBwbGljYWl0b24gaW50ZXJmYWNlIChpbnB1dCkKLSAqICAgICAgICAgICAgICAgICAgIGJkX2FkZHI6IHBlZXIgZGV2aWNlIGFkZHJlc3MuIChpbnB1dCkKLSAqICAgICAgICAgICAgICAgICAgIHBfY29ubl9pZDogY29ubmVjdGlvbiBpZCAgKG91dHB1dCkKLSAqICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA6ICBwaHlzaWNhbCB0cmFuc3BvcnQgb2YgdGhlIEdBVFQgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJSL0VEUiBvciBMRSkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgdGhlIGxpZ2ljYWwgbGluayBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgR0FUVF9HZXRDb25uSWRJZkNvbm5lY3RlZCh0R0FUVF9JRiBnYXR0X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9jb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBHQVRUX0NvbmZpZ1NlcnZpY2VDaGFuZ2VDQ0MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENvbmZpZ3VyZSBzZXJ2aWNlIGNoYW5nZSBpbmRpY2F0aW9uIG9uIHJlbW90ZSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEdBVFRfQ29uZmlnU2VydmljZUNoYW5nZUNDQyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLS8vIEVuYWJsZXMgdGhlIEdBVFQgcHJvZmlsZSBvbiB0aGUgZGV2aWNlLgotLy8gSXQgY2xlYXJzIG91dCB0aGUgY29udHJvbCBibG9ja3MsIGFuZCByZWdpc3RlcnMgd2l0aCBMMkNBUC4KLWV4dGVybiB2b2lkIGdhdHRfaW5pdCh2b2lkKTsKLQotLy8gRnJlZXMgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIEdBVFQgcHJvZmlsZS4KLWV4dGVybiB2b2lkIGdhdHRfZnJlZSh2b2lkKTsKLQotLy8gTGluayBlbmNyeXB0aW9uIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIGVuY3J5cHRpb24gcHJvY2VzcwotLy8gaW5pdGlhdGVkIG91dHNpZGUgR0FUVC4KLWV4dGVybiB2b2lkIGdhdHRfbm90aWZ5X2VuY19jbXBsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiogUmVzZXQgYmcgZGV2aWNlIGxpc3QuIElmIGNhbGxlZCBhZnRlciBjb250cm9sbGVyIHJlc2V0LCBzZXQgfGFmdGVyX3Jlc2V0fCB0bwotICogdHJ1ZSwgYXMgdGhlcmUgaXMgbm8gbmVlZCB0byB3aXBlIGNvbnRyb2xsZXIgYWNjZXB0bGlzdCBpbiB0aGlzIGNhc2UuICovCi1leHRlcm4gdm9pZCBnYXR0X3Jlc2V0X2JnZGV2X2xpc3QoYm9vbCBhZnRlcl9yZXNldCk7Ci0KLSNlbmRpZiAvKiBHQVRUX0FQSV9IICovCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2dhdHRkZWZzLmggYi9zdGFjay9pbmNsdWRlL2dhdHRkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODNkNmEuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9nYXR0ZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGludGVybmFsbHkgdXNlZCBBVFQgZGVmaW5pdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9HQVRUREVGU19ICi0jZGVmaW5lIF9HQVRUREVGU19ICi0KLSNkZWZpbmUgR0FUVF9JTExFR0FMX1VVSUQgMAotCi0vKiBHQVRUIGF0dHJpYnV0ZSB0eXBlcwotICovCi0jZGVmaW5lIEdBVFRfVVVJRF9QUklfU0VSVklDRSAweDI4MDAKLSNkZWZpbmUgR0FUVF9VVUlEX1NFQ19TRVJWSUNFIDB4MjgwMQotI2RlZmluZSBHQVRUX1VVSURfSU5DTFVERV9TRVJWSUNFIDB4MjgwMgotLyogIENoYXJhY3RlcmlzdGljIERlY2xhcmF0aW9uKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0NIQVJfREVDTEFSRSAweDI4MDMKLQotLyoJQ2hhcmFjdGVyaXN0aWMgRXh0ZW5kZWQgUHJvcGVydGllcyAqLwotI2RlZmluZSBHQVRUX1VVSURfQ0hBUl9FWFRfUFJPUCAweDI5MDAKLS8qICBDaGFyYWN0ZXJpc3RpYyBVc2VyIERlc2NyaXB0aW9uKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0NIQVJfREVTQ1JJUFRJT04gMHgyOTAxCi0vKiAgQ2xpZW50IENoYXJhY3RlcmlzdGljIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0NIQVJfQ0xJRU5UX0NPTkZJRyAweDI5MDIKLS8qICBTZXJ2ZXIgQ2hhcmFjdGVyaXN0aWMgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBHQVRUX1VVSURfQ0hBUl9TUlZSX0NPTkZJRyAweDI5MDMKLS8qICBDaGFyYWN0ZXJpc3RpYyBQcmVzZW50YXRpb24gRm9ybWF0Ki8KLSNkZWZpbmUgR0FUVF9VVUlEX0NIQVJfUFJFU0VOVF9GT1JNQVQgMHgyOTA0Ci0vKiAgQ2hhcmFjdGVyaXN0aWMgQWdncmVnYXRlIEZvcm1hdCovCi0jZGVmaW5lIEdBVFRfVVVJRF9DSEFSX0FHR19GT1JNQVQgMHgyOTA1Ci0vKiAgQ2hhcmFjdGVyaXN0aWMgVmFsaWQgUmFuZ2UgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0NIQVJfVkFMSURfUkFOR0UgMHgyOTA2Ci0jZGVmaW5lIEdBVFRfVVVJRF9FWFRfUlBUX1JFRl9ERVNDUiAweDI5MDcKLSNkZWZpbmUgR0FUVF9VVUlEX1JQVF9SRUZfREVTQ1IgMHgyOTA4Ci0KLS8qICBDbGllbnQgQ2hhcmFjdGVyaXN0aWMgQ29uZmlndXJhdGlvbiBiaXRzICovCi0jZGVmaW5lIEdBVFRfQ0hBUl9DTElFTlRfQ09ORklHX05PVElGSUNBVElPTiAweDAwMDEKLSNkZWZpbmUgR0FUVF9DSEFSX0NMSUVOVF9DT05GSUdfSU5ESUNUSU9OIDB4MDAwMgotCi0vKiBHQVAgUHJvZmlsZSBBdHRyaWJ1dGVzCi0gKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0dBUF9ERVZJQ0VfTkFNRSAweDJBMDAKLSNkZWZpbmUgR0FUVF9VVUlEX0dBUF9JQ09OIDB4MkEwMQotI2RlZmluZSBHQVRUX1VVSURfR0FQX1BSRUZfQ09OTl9QQVJBTSAweDJBMDQKLSNkZWZpbmUgR0FUVF9VVUlEX0dBUF9DRU5UUkFMX0FERFJfUkVTT0wgMHgyQUE2Ci0KLS8qIEF0dHJpYnV0ZSBQcm9maWxlIEF0dHJpYnV0ZSBVVUlEICovCi0jZGVmaW5lIEdBVFRfVVVJRF9HQVRUX1NSVl9DSEdEIDB4MkEwNQotLyogQXR0cmlidXRlIFByb3RvY29sIFRlc3QgKi8KLQotLyogTGluayBMb3NzIFNlcnZpY2UgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0FMRVJUX0xFVkVMIDB4MkEwNiAgICAvKiBBbGVydCBMZXZlbCAqLwotI2RlZmluZSBHQVRUX1VVSURfVFhfUE9XRVJfTEVWRUwgMHgyQTA3IC8qIFRYIHBvd2VyIGxldmVsICovCi0KLS8qIFRpbWUgUHJvZmlsZSAqLwotLyogQ3VycmVudCBUaW1lIFNlcnZpY2UgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0NVUlJFTlRfVElNRSAweDJBMkIgICAgLyogQ3VycmVudCBUaW1lICovCi0jZGVmaW5lIEdBVFRfVVVJRF9MT0NBTF9USU1FX0lORk8gMHgyQTBGIC8qIExvY2FsIHRpbWUgaW5mbyAqLwotI2RlZmluZSBHQVRUX1VVSURfUkVGX1RJTUVfSU5GTyAweDJBMTQgICAvKiByZWZlcmVuY2UgdGltZSBpbmZvcm1hdGlvbiAqLwotCi0vKiBOd0EgUHJvZmlsZSAqLwotI2RlZmluZSBHQVRUX1VVSURfTldfU1RBVFVTIDB4MkExOCAgLyogbmV0d29yayBhdmFpbGFiaWxpdHkgc3RhdHVzICovCi0jZGVmaW5lIEdBVFRfVVVJRF9OV19UUklHR0VSIDB4MkExQSAvKiBOZXR3b3JrIGF2YWlsYWJpbGl0eSB0cmlnZ2VyICovCi0KLS8qIHBob25lIGFsZXJ0ICovCi0jZGVmaW5lIEdBVFRfVVVJRF9BTEVSVF9TVEFUVVMgMHgyQTNGICAgLyogYWxlcnQgc3RhdHVzICovCi0jZGVmaW5lIEdBVFRfVVVJRF9SSU5HRVJfQ1AgMHgyQTQwICAgICAgLyogcmluZ2VyIGNvbnRyb2wgcG9pbnQgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX1JJTkdFUl9TRVRUSU5HIDB4MkE0MSAvKiByaW5nZXIgc2V0dGluZyAqLwotCi0vKiBHbHVjb3NlIFNlcnZpY2UgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX0dNX01FQVNVUkVNRU5UIDB4MkExOAotI2RlZmluZSBHQVRUX1VVSURfR01fQ09OVEVYVCAweDJBMzQKLSNkZWZpbmUgR0FUVF9VVUlEX0dNX0NPTlRST0xfUE9JTlQgMHgyQTUyCi0jZGVmaW5lIEdBVFRfVVVJRF9HTV9GRUFUVVJFIDB4MkE1MQotCi0vKiBkZXZpY2UgaW5mb3IgY2hhcmFjdGVyaXN0aWMgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX1NZU1RFTV9JRCAweDJBMjMKLSNkZWZpbmUgR0FUVF9VVUlEX01PREVMX05VTUJFUl9TVFIgMHgyQTI0Ci0jZGVmaW5lIEdBVFRfVVVJRF9TRVJJQUxfTlVNQkVSX1NUUiAweDJBMjUKLSNkZWZpbmUgR0FUVF9VVUlEX0ZXX1ZFUlNJT05fU1RSIDB4MkEyNgotI2RlZmluZSBHQVRUX1VVSURfSFdfVkVSU0lPTl9TVFIgMHgyQTI3Ci0jZGVmaW5lIEdBVFRfVVVJRF9TV19WRVJTSU9OX1NUUiAweDJBMjgKLSNkZWZpbmUgR0FUVF9VVUlEX01BTlVfTkFNRSAweDJBMjkKLSNkZWZpbmUgR0FUVF9VVUlEX0lFRUVfREFUQSAweDJBMkEKLSNkZWZpbmUgR0FUVF9VVUlEX1BOUF9JRCAweDJBNTAKLQotLyogSElEIGNoYXJhY3RlcmlzdGljcyAqLwotI2RlZmluZSBHQVRUX1VVSURfSElEX0lORk9STUFUSU9OIDB4MkE0QQotI2RlZmluZSBHQVRUX1VVSURfSElEX1JFUE9SVF9NQVAgMHgyQTRCCi0jZGVmaW5lIEdBVFRfVVVJRF9ISURfQ09OVFJPTF9QT0lOVCAweDJBNEMKLSNkZWZpbmUgR0FUVF9VVUlEX0hJRF9SRVBPUlQgMHgyQTRECi0jZGVmaW5lIEdBVFRfVVVJRF9ISURfUFJPVE9fTU9ERSAweDJBNEUKLSNkZWZpbmUgR0FUVF9VVUlEX0hJRF9CVF9LQl9JTlBVVCAweDJBMjIKLSNkZWZpbmUgR0FUVF9VVUlEX0hJRF9CVF9LQl9PVVRQVVQgMHgyQTMyCi0jZGVmaW5lIEdBVFRfVVVJRF9ISURfQlRfTU9VU0VfSU5QVVQgMHgyQTMzCi0KLS8qIEJhdHRlcnkgU2VydmljZSBjaGFyICovCi0jZGVmaW5lIEdBVFRfVVVJRF9CQVRURVJZX0xFVkVMIDB4MkExOQotCi0jZGVmaW5lIEdBVFRfVVVJRF9TQ19DT05UUk9MX1BPSU5UIDB4MkE1NQotI2RlZmluZSBHQVRUX1VVSURfU0VOU09SX0xPQ0FUSU9OIDB4MkE1RAotCi0vKiBSVU5ORVJTIFNQRUVEIEFORCBDQURFTkNFIFNFUlZJQ0UgICAgICAqLwotI2RlZmluZSBHQVRUX1VVSURfUlNDX01FQVNVUkVNRU5UIDB4MkE1MwotI2RlZmluZSBHQVRUX1VVSURfUlNDX0ZFQVRVUkUgMHgyQTU0Ci0KLS8qIENZQ0xJTkcgU1BFRUQgQU5EIENBREVOQ0UgU0VSVklDRSAgICAgICovCi0jZGVmaW5lIEdBVFRfVVVJRF9DU0NfTUVBU1VSRU1FTlQgMHgyQTVCCi0jZGVmaW5lIEdBVFRfVVVJRF9DU0NfRkVBVFVSRSAweDJBNUMKLQotLyogU2NhbiBQYXJhbWV0ZXIgY2hhcmF0Y2VyaXN0aWNzICovCi0jZGVmaW5lIEdBVFRfVVVJRF9TQ0FOX0lOVF9XSU5ET1cgMHgyQTRGCi0jZGVmaW5lIEdBVFRfVVVJRF9TQ0FOX1JFRlJFU0ggMHgyQTMxCi0KLS8qIEdBVFQgU2VydmljZSBjaGFyYWN0ZXJpc3RpY3MgKi8KLSNkZWZpbmUgR0FUVF9VVUlEX1NFUlZFUl9TVVBfRkVBVCAweDJCM0EKLSNkZWZpbmUgR0FUVF9VVUlEX0NMSUVOVF9TVVBfRkVBVCAweDJCMjkKLQotLyogRGF0YWJhc2UgSGFzaCBjaGFyYWN0ZXJpc3RpYyAqLwotI2RlZmluZSBHQVRUX1VVSURfREFUQUJBU0VfSEFTSCAweDJCMkEKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmggYi9zdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmY2YTYuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qCi0gKiAgRGVmaW5pdGlvbnMgZm9yIEhDSSBFcnJvciBDb2RlcyB0aGF0IGFyZSBwYXNzZWQgaW4gdGhlIGV2ZW50cwotICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgSENJX1NVQ0NFU1MgPSAweDAwLAotICBIQ0lfRVJSX0lMTEVHQUxfQ09NTUFORCA9IDB4MDEsCi0gIEhDSV9FUlJfTk9fQ09OTkVDVElPTiA9IDB4MDIsCi0gIEhDSV9FUlJfSFdfRkFJTFVSRSA9IDB4MDMsCi0gIEhDSV9FUlJfUEFHRV9USU1FT1VUID0gMHgwNCwKLSAgSENJX0VSUl9BVVRIX0ZBSUxVUkUgPSAweDA1LAotICBIQ0lfRVJSX0tFWV9NSVNTSU5HID0gMHgwNiwKLSAgSENJX0VSUl9NRU1PUllfRlVMTCA9IDB4MDcsCi0gIEhDSV9FUlJfQ09OTkVDVElPTl9UT1VUID0gMHgwOCwKLSAgSENJX0VSUl9NQVhfTlVNX09GX0NPTk5FQ1RJT05TID0gMHgwOSwKLSAgSENJX0VSUl9NQVhfTlVNX09GX1NDT1MgPSAweDBBLAotICBIQ0lfRVJSX0NPTk5FQ1RJT05fRVhJU1RTID0gMHgwQiwKLSAgSENJX0VSUl9DT01NQU5EX0RJU0FMTE9XRUQgPSAweDBDLAotICBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUyA9IDB4MEQsCi0gIEhDSV9FUlJfSE9TVF9SRUpFQ1RfU0VDVVJJVFkgPSAweDBFLAotICBIQ0lfRVJSX0hPU1RfUkVKRUNUX0RFVklDRSA9IDB4MEYsCi0gIEhDSV9FUlJfSE9TVF9USU1FT1VUID0gMHgxMCwgIC8vIHN0YWNrL2J0bS9idG1fYmxlX2dhcCwKLSAgSENJX0VSUl9JTExFR0FMX1BBUkFNRVRFUl9GTVQgPSAweDEyLAotICBIQ0lfRVJSX1BFRVJfVVNFUiA9IDB4MTMsCi0gIEhDSV9FUlJfQ09OTl9DQVVTRV9MT0NBTF9IT1NUID0gMHgxNiwKLSAgSENJX0VSUl9SRVBFQVRFRF9BVFRFTVBUUyA9IDB4MTcsCi0gIEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRCA9IDB4MTgsCi0gIEhDSV9FUlJfVU5TVVBQT1JURURfUkVNX0ZFQVRVUkUgPSAweDFBLCAgLy8gc3RhY2svYnRtL2J0bV9ibGVfZ2FwCi0gIEhDSV9FUlJfVU5TUEVDSUZJRUQgPSAweDFGLAotICBIQ0lfRVJSX0xNUF9SRVNQT05TRV9USU1FT1VUID0gMHgyMiwgICAgIC8vIEdBVFRfQ09OTl9MTVBfVElNRU9VVAotICBIQ0lfRVJSX0xNUF9FUlJfVFJBTlNfQ09MTElTSU9OID0gMHgyMywgIC8vIFRPRE8gcmVtb3ZlCi0gIEhDSV9FUlJfRU5DUllfTU9ERV9OT1RfQUNDRVBUQUJMRSA9IDB4MjUsCi0gIEhDSV9FUlJfVU5JVF9LRVlfVVNFRCA9IDB4MjYsCi0gIEhDSV9FUlJfUEFJUklOR19XSVRIX1VOSVRfS0VZX05PVF9TVVBQT1JURUQgPSAweDI5LAotICBIQ0lfRVJSX0RJRkZfVFJBTlNBQ1RJT05fQ09MTElTSU9OID0gMHgyQSwgIC8vIHN0YWNrL2J0bS9idG1fc2VjCi0gIEhDSV9FUlJfSU5TVUZGQ0lFTlRfU0VDVVJJVFkgPSAweDJGLCAgICAgICAgLy8gYnRpZi9idHUKLSAgSENJX0VSUl9ST0xFX1NXSVRDSF9QRU5ESU5HID0gMHgzMiwgICAgICAgICAvLyBzdGFjay9idG0vYnRtX3NjbwotICBIQ0lfRVJSX1JPTEVfU1dJVENIX0ZBSUxFRCA9IDB4MzUsCi0gIEhDSV9FUlJfSE9TVF9CVVNZX1BBSVJJTkcgPSAweDM4LCAgICAgICAgICAvLyBzdGFjay9idG0vYnRtX3NlYwotICBIQ0lfRVJSX1VOQUNDRVBUX0NPTk5fSU5URVJWQUwgPSAweDNCLCAgICAgLy8gc3RhY2svbDJjYXAvbDJjX2JsZQotICBIQ0lfRVJSX0FEVkVSVElTSU5HX1RJTUVPVVQgPSAweDNDLCAgICAgICAgLy8gc3RhY2svYnRtL2J0bV9ibGUKLSAgSENJX0VSUl9DT05OX0ZBSUxFRF9FU1RBQkxJU0hNRU5UID0gMHgzRSwgIC8vIEdBVFRfQ09OTl9GQUlMX0VTVEFCTElTSAotICBIQ0lfRVJSX0xJTUlUX1JFQUNIRUQgPSAweDQzLCAgICAgICAgICAgICAgLy8gc3RhY2svYnRtL2J0bV9ibGVfbXVsdGlfYWR2LmNjCi0KLSAgX0hDSV9FUlJfTUFYX0VSUiA9IDB4NDMsCi0gIEhDSV9FUlJfVU5ERUZJTkVEID0gMHhmZiwKLX0gdEhDSV9FUlJPUl9DT0RFOwotCi0jZGVmaW5lIEhDSV9FUlJfTUFYX0VSUiBfSENJX0VSUl9NQVhfRVJSICAvLyBIQUNLIGZvciBub3cgZm9yIFNNUAotCi1pbmxpbmUgc3RkOjpzdHJpbmcgaGNpX2Vycm9yX2NvZGVfdGV4dChjb25zdCB0SENJX0VSUk9SX0NPREUmIGVycm9yX2NvZGUpIHsKLSAgc3dpdGNoIChlcnJvcl9jb2RlKSB7Ci0gICAgY2FzZSBIQ0lfU1VDQ0VTUzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiU3VjY2VzcyIpOwotICAgIGNhc2UgSENJX0VSUl9JTExFR0FMX0NPTU1BTkQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIklsbGVnYWwgQ29tbWFuZCIpOwotICAgIGNhc2UgSENJX0VSUl9OT19DT05ORUNUSU9OOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVbmtub3duIENvbm5lY3Rpb24iKTsKLSAgICBjYXNlIEhDSV9FUlJfSFdfRkFJTFVSRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiSGFyZHdhcmUgRmFpbHVyZSIpOwotICAgIGNhc2UgSENJX0VSUl9QQUdFX1RJTUVPVVQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlBhZ2UgVGltZW91dCIpOwotICAgIGNhc2UgSENJX0VSUl9BVVRIX0ZBSUxVUkU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkF1dGhlbnRpY2F0aW9uIEZhaWx1cmUiKTsKLSAgICBjYXNlIEhDSV9FUlJfS0VZX01JU1NJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlBpbiBvciBLZXkgTWlzc2luZyIpOwotICAgIGNhc2UgSENJX0VSUl9NRU1PUllfRlVMTDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiTWVtb3J5IENhcGFjaXR5IEV4Y2VlZGVkIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0NPTk5FQ1RJT05fVE9VVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29ubmVjdGlvbiBUaW1lb3V0Iik7Ci0gICAgY2FzZSBIQ0lfRVJSX01BWF9OVU1fT0ZfQ09OTkVDVElPTlM6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkNvbm5lY3Rpb24gTGltaXQgRXhjZWVkZWQiKTsKLSAgICBjYXNlIEhDSV9FUlJfTUFYX05VTV9PRl9TQ09TOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJTeW5jaHJvbm91cyBDb25uZWN0aW9uIExpbWl0IEV4Y2VlZGVkIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0NPTk5FQ1RJT05fRVhJU1RTOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJDb25uZWN0aW9uIEFscmVhZHkgRXhpc3RzIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0NPTU1BTkRfRElTQUxMT1dFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29tbWFuZCBEaXNhbGxvd2VkIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29ubmVjdGlvbiBSZWplY3RlZCBMaW1pdGVkIFJlc291cmNlcyIpOwotICAgIGNhc2UgSENJX0VSUl9IT1NUX1JFSkVDVF9TRUNVUklUWToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29ubmVjdGlvbiBSZWplY3RlZCBTZWN1cml0eSBSZWFzb25zIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0hPU1RfUkVKRUNUX0RFVklDRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29ubmVjdGlvbiBSZWplY3RlZCBVbmFjY2VwdGFibGUgQmRBZGRyIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0hPU1RfVElNRU9VVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29ubmVjdGlvbiBBY2NlcHQgVGltZW91dCIpOwotICAgIGNhc2UgSENJX0VSUl9JTExFR0FMX1BBUkFNRVRFUl9GTVQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVuc3VwcG9ydGVkIEZlYXR1cmUgb3IgUGFyYW1ldGVyIFZhbHVlIik7Ci0gICAgY2FzZSBIQ0lfRVJSX1BFRVJfVVNFUjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiUmVtb3RlIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiIpOwotICAgIGNhc2UgSENJX0VSUl9DT05OX0NBVVNFX0xPQ0FMX0hPU1Q6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkxvY2FsIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiIpOwotICAgIGNhc2UgSENJX0VSUl9SRVBFQVRFRF9BVFRFTVBUUzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiUmVwZWF0ZWQgQXR0ZW1wdHMiKTsKLSAgICBjYXNlIEhDSV9FUlJfUEFJUklOR19OT1RfQUxMT1dFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiUGFpcmluZyBub3QgQWxsb3dlZCIpOwotICAgIGNhc2UgSENJX0VSUl9VTlNVUFBPUlRFRF9SRU1fRkVBVFVSRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVW5zdXBwb3J0ZWQgUmVtb3RlIG9yIExtcCBGZWF0dXJlIik7Ci0gICAgY2FzZSBIQ0lfRVJSX1VOU1BFQ0lGSUVEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVbnNwZWNpZmllZCBFcnJvciIpOwotICAgIGNhc2UgSENJX0VSUl9MTVBfUkVTUE9OU0VfVElNRU9VVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiR2F0dCBDb25uZWN0aW9uIExtcCBUaW1lb3V0Iik7Ci0gICAgY2FzZSBIQ0lfRVJSX0xNUF9FUlJfVFJBTlNfQ09MTElTSU9OOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJMaW5rIExheWVyIENvbGxpc2lvbiIpOwotICAgIGNhc2UgSENJX0VSUl9FTkNSWV9NT0RFX05PVF9BQ0NFUFRBQkxFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJFbmNyeXB0aW9uIE1vZGUgbm90IEFjY2VwdGFibGUiKTsKLSAgICBjYXNlIEhDSV9FUlJfVU5JVF9LRVlfVVNFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVW5pdCBLZXkgVXNlZCIpOwotICAgIGNhc2UgSENJX0VSUl9QQUlSSU5HX1dJVEhfVU5JVF9LRVlfTk9UX1NVUFBPUlRFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiUGFpcmluZyB3aXRoIFVuaXQgS2V5IFVuc3VwcG9ydGVkIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0RJRkZfVFJBTlNBQ1RJT05fQ09MTElTSU9OOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJEaWZmIFRyYW5zYWN0aW9uIENvbGxpc2lvbiIpOwotICAgIGNhc2UgSENJX0VSUl9JTlNVRkZDSUVOVF9TRUNVUklUWToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiSW5zdWZmaWNpZW50IFNlY3VyaXR5Iik7Ci0gICAgY2FzZSBIQ0lfRVJSX1JPTEVfU1dJVENIX1BFTkRJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlJvbGUgU3dpdGNoIFBlbmRpbmciKTsKLSAgICBjYXNlIEhDSV9FUlJfSE9TVF9CVVNZX1BBSVJJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkhvc3QgQnVzeSBQYWlyaW5nIik7Ci0gICAgY2FzZSBIQ0lfRVJSX1VOQUNDRVBUX0NPTk5fSU5URVJWQUw6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVuYWNjZXB0YWJsZSBDb25uZWN0aW9uIEludGVydmFsIik7Ci0gICAgY2FzZSBIQ0lfRVJSX0FEVkVSVElTSU5HX1RJTUVPVVQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkFkdmVydGlzaW5nIFRpbWVvdXQiKTsKLSAgICBjYXNlIEhDSV9FUlJfQ09OTl9GQUlMRURfRVNUQUJMSVNITUVOVDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQ29ubmVjdGlvbiBGYWlsZWQgRXN0YWJsaXNobWVudCIpOwotICAgIGNhc2UgSENJX0VSUl9MSU1JVF9SRUFDSEVEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJMaW1pdCBSZWFjaGVkIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoIlVua25vd24gRXJyb3JbJTAyaHhdIiwgZXJyb3JfY29kZSk7Ci0gIH0KLX0KLQotLy8gQ29udGV4dCBlcXVpdmFsZW5jZQotdXNpbmcgdEhDSV9TVEFUVVMgPSB0SENJX0VSUk9SX0NPREU7Ci1pbmxpbmUgc3RkOjpzdHJpbmcgaGNpX3N0YXR1c19jb2RlX3RleHQoY29uc3QgdEhDSV9TVEFUVVMmIHN0YXR1c19jb2RlKSB7Ci0gIHJldHVybiBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXR1c19jb2RlKTsKLX0KLQotdXNpbmcgdEhDSV9SRUFTT04gPSB0SENJX0VSUk9SX0NPREU7Ci1pbmxpbmUgc3RkOjpzdHJpbmcgaGNpX3JlYXNvbl9jb2RlX3RleHQoY29uc3QgdEhDSV9SRUFTT04mIHJlYXNvbl9jb2RlKSB7Ci0gIHJldHVybiBoY2lfZXJyb3JfY29kZV90ZXh0KHJlYXNvbl9jb2RlKTsKLX0KLQotLy8gQ29udmVyc2lvbiBmcm9tIHJhdyBwYWNrZXQgdmFsdWUKLWlubGluZSB0SENJX0VSUk9SX0NPREUgdG9faGNpX2Vycm9yX2NvZGUoY29uc3QgdWludDhfdCYgZXJyb3JfY29kZSkgewotICBpZiAoZXJyb3JfY29kZSA+IF9IQ0lfRVJSX01BWF9FUlIpIHJldHVybiBIQ0lfRVJSX1VOREVGSU5FRDsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHRIQ0lfRVJST1JfQ09ERT4oZXJyb3JfY29kZSk7Ci19Ci0KLWlubGluZSB0SENJX1NUQVRVUyB0b19oY2lfc3RhdHVzX2NvZGUoY29uc3QgdWludDhfdCYgc3RhdHVzX2NvZGUpIHsKLSAgaWYgKHN0YXR1c19jb2RlID4gX0hDSV9FUlJfTUFYX0VSUikgcmV0dXJuIEhDSV9FUlJfVU5ERUZJTkVEOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8dEhDSV9TVEFUVVM+KHN0YXR1c19jb2RlKTsKLX0KLQotaW5saW5lIHRIQ0lfUkVBU09OIHRvX2hjaV9yZWFzb25fY29kZShjb25zdCB1aW50OF90JiByZWFzb25fY29kZSkgewotICBpZiAocmVhc29uX2NvZGUgPiBfSENJX0VSUl9NQVhfRVJSKSByZXR1cm4gSENJX0VSUl9VTkRFRklORUQ7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx0SENJX1JFQVNPTj4ocmVhc29uX2NvZGUpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9oY2lfZXZ0X2xlbmd0aC5oIGIvc3RhY2svaW5jbHVkZS9oY2lfZXZ0X2xlbmd0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmFjZGIxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvaGNpX2V2dF9sZW5ndGguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLS8qCi0gKiAgRGVmaW5pdGlvbnMgZm9yIEhDSSBFdmVudCBQYXJhbWV0ZXIgTWluaW11bSBMZW5ndGgKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGNpX2V2ZW50X3BhcmFtZXRlcnNfbWluaW11bV9sZW5ndGhbXSA9IHsKLSAgICAwLCAgICAvLyAgMHgwMCAtIE4vQQotICAgIDEsICAgIC8vICAweDAxIC0gSENJX0lucXVpcnlfQ29tcGxldGUgRXZlbnQKLSAgICAxNSwgICAvLyAgMHgwMiAtIEhDSV9JbnF1aXJ5X1Jlc3VsdCBFdmVudCAoTnVtX1Jlc3BvbnNlcyA9IDEpCi0gICAgMTEsICAgLy8gIDB4MDMgLSBIQ0lfQ29ubmVjdGlvbl9Db21wbGV0ZSBFdmVudAotICAgIDEwLCAgIC8vICAweDA0IC0gSENJX0Nvbm5lY3Rpb25fUmVxdWVzdCBFdmVudAotICAgIDQsICAgIC8vICAweDA1IC0gSENJX0Rpc2Nvbm5lY3Rpb25fQ29tcGxldGUgRXZlbnQKLSAgICAzLCAgICAvLyAgMHgwNiAtIEhDSV9BdXRoZW50aWNhdGlvbl9Db21wbGV0ZSBFdmVudAotICAgIDI1NSwgIC8vICAweDA3IC0gSENJX1JlbW90ZV9OYW1lX1JlcXVlc3RfQ29tcGxldGUgRXZlbnQKLSAgICA0LCAgICAvLyAgMHgwOCAtIEhDSV9FbmNyeXB0aW9uX0NoYW5nZSBFdmVudAotICAgIDMsICAgIC8vICAweDA5IC0gSENJX0NoYW5nZV9Db25uZWN0aW9uX0xpbmtfS2V5X0NvbXBsZXRlIEV2ZW50Ci0gICAgNCwgICAgLy8gIDB4MEEgLSBIQ0lfQ2VudHJhbF9MaW5rX0tleV9Db21wbGV0ZSBFdmVudAotICAgIDExLCAgIC8vICAweDBCIC0gSENJX1JlYWRfUmVtb3RlX1N1cHBvcnRlZF9GZWF0dXJlc19Db21wbGV0ZSBFdmVudAotICAgIDgsICAgIC8vICAweDBDIC0gSENJX1JlYWRfUmVtb3RlX1ZlcnNpb25fSW5mb3JtYXRpb25fQ29tcGxldGUgRXZlbnQKLSAgICAyMSwgICAvLyAgMHgwRCAtIEhDSV9Rb1NfU2V0dXBfQ29tcGxldGUgRXZlbnQKLSAgICAzLCAgICAvLyAgMHgwRSAtIEhDSV9Db21tYW5kX0NvbXBsZXRlIEV2ZW50IChEZXBlbmRzIG9uIGNvbW1hbmQpCi0gICAgNCwgICAgLy8gIDB4MEYgLSBIQ0lfQ29tbWFuZF9TdGF0dXMgRXZlbnQKLSAgICAxLCAgICAvLyAgMHgxMCAtIEhDSV9IYXJkd2FyZV9FcnJvciBFdmVudAotICAgIDIsICAgIC8vICAweDExIC0gSENJX0ZsdXNoX09jY3VycmVkIEV2ZW50Ci0gICAgOCwgICAgLy8gIDB4MTIgLSBIQ0lfUm9sZV9DaGFuZ2UgRXZlbnQKLSAgICA1LCAgICAvLyAgMHgxMyAtIEhDSV9OdW1iZXJfT2ZfQ29tcGxldGVkX1BhY2tldHMgRXZlbnQgKE51bV9IYW5kbGVzID0gMSkKLSAgICA2LCAgICAvLyAgMHgxNCAtIEhDSV9Nb2RlX0NoYW5nZSBFdmVudAotICAgIDIzLCAgIC8vICAweDE1IC0gSENJX1JldHVybl9MaW5rX0tleXMgRXZlbnQgKE51bV9LZXlzID0gMSkKLSAgICA2LCAgICAvLyAgMHgxNiAtIEhDSV9QSU5fQ29kZV9SZXF1ZXN0IEV2ZW50Ci0gICAgNiwgICAgLy8gIDB4MTcgLSBIQ0lfTGlua19LZXlfUmVxdWVzdCBFdmVudAotICAgIDIzLCAgIC8vICAweDE4IC0gSENJX0xpbmtfS2V5X05vdGlmaWNhdGlvbiBFdmVudAotICAgIDMsICAgIC8vICAweDE5IC0gSENJX0xvb3BiYWNrX0NvbW1hbmQgRXZlbnQgKERlcGVuZHMgb24gY29tbWFuZCkKLSAgICAxLCAgICAvLyAgMHgxQSAtIEhDSV9EYXRhX0J1ZmZlcl9PdmVyZmxvdyBFdmVudAotICAgIDMsICAgIC8vICAweDFCIC0gSENJX01heF9TbG90c19DaGFuZ2UgRXZlbnQKLSAgICA1LCAgICAvLyAgMHgxQyAtIEhDSV9SZWFkX0Nsb2NrX09mZnNldF9Db21wbGV0ZSBFdmVudAotICAgIDUsICAgIC8vICAweDFEIC0gSENJX0Nvbm5lY3Rpb25fUGFja2V0X1R5cGVfQ2hhbmdlZCBFdmVudAotICAgIDIsICAgIC8vICAweDFFIC0gSENJX1FvU19WaW9sYXRpb24gRXZlbnQKLSAgICA3LCAgICAvLyAgMHgxRiAtIEhDSV9QYWdlX1NjYW5fTW9kZV9DaGFuZ2UgRXZlbnQgKERlcHJlY2F0ZWQpCi0gICAgNywgICAgLy8gIDB4MjAgLSBIQ0lfUGFnZV9TY2FuX1JlcGV0aXRpb25fTW9kZV9DaGFuZ2UgRXZlbnQKLSAgICAyMiwgICAvLyAgMHgyMSAtIEhDSV9GbG93X1NwZWNpZmljYXRpb25fQ29tcGxldCBFdmVudAotICAgIDE1LCAgIC8vICAweDIyIC0gSENJX0lucXVpcnlfUmVzdWx0X3dpdGhfUlNTSSBFdmVudCAoTnVtX1Jlc3BvbnNlcyA9IDEpCi0gICAgMTMsICAgLy8gIDB4MjMgLSBIQ0lfUmVhZF9SZW1vdGVfRXh0ZW5kZWRfRmVhdHVyZXNfQ29tcGxldGUgRXZlbnQKLSAgICAwLCAgICAvLyAgMHgyNCAtIE4vQQotICAgIDAsICAgIC8vICAweDI1IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4MjYgLSBOL0EKLSAgICAwLCAgICAvLyAgMHgyNyAtIE4vQQotICAgIDAsICAgIC8vICAweDI4IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4MjkgLSBOL0EKLSAgICAwLCAgICAvLyAgMHgyQSAtIE4vQQotICAgIDAsICAgIC8vICAweDJCIC0gTi9BCi0gICAgMTcsICAgLy8gIDB4MkMgLSBIQ0lfU3luY2hyb25vdXNfQ29ubmVjdGlvbl9Db21wbGV0ZSBFdmVudAotICAgIDksICAgIC8vICAweDJEIC0gSENJX1N5bmNocm9ub3VzX0Nvbm5lY3Rpb25fQ2hhbmdlZCBFdmVudAotICAgIDExLCAgIC8vICAweDJFIC0gSENJX1NuaWZmX1N1YnJhdGluZyBFdmVudAotICAgIDI1NSwgIC8vICAweDJGIC0gSENJX0V4dGVuZGVkX0lucXVpcnlfUmVzdWx0IEV2ZW50Ci0gICAgMywgICAgLy8gIDB4MzAgLSBIQ0lfRW5jcnlwdGlvbl9LZXlfUmVmcmVzaF9Db21wbGV0ZSBFdmVudAotICAgIDYsICAgIC8vICAweDMxIC0gSENJX0lPX0NhcGFiaWxpdHlfUmVxdWVzdCBFdmVudAotICAgIDksICAgIC8vICAweDMyIC0gSENJX0lPX0NhcGFiaWxpdHlfUmVzcG9uc2UgRXZlbnQKLSAgICAxMCwgICAvLyAgMHgzMyAtIEhDSV9Vc2VyX0NvbmZpcm1hdGlvbl9SZXF1ZXN0IEV2ZW50Ci0gICAgNiwgICAgLy8gIDB4MzQgLSBIQ0lfVXNlcl9QYXNza2V5X1JlcXVlc3QgRXZlbnQKLSAgICA2LCAgICAvLyAgMHgzNSAtIEhDSV9SZW1vdGVfT09CX0RhdGFfUmVxdWVzdCBFdmVudAotICAgIDcsICAgIC8vICAweDM2IC0gSENJX1NpbXBsZV9QYWlyaW5nX0NvbXBsZXRlIEV2ZW50Ci0gICAgMCwgICAgLy8gIDB4MzcgLSBOL0EKLSAgICA0LCAgICAvLyAgMHgzOCAtIEhDSV9MaW5rX1N1cGVydmlzaW9uX1RpbWVvdXRfQ2hhbmdlZCBFdmVudAotICAgIDIsICAgIC8vICAweDM5IC0gSENJX0VuaGFuY2VkX0ZsdXNoX0NvbXBsZXRlIEV2ZW50Ci0gICAgMCwgICAgLy8gIDB4M0EgLSBOL0EKLSAgICAxMCwgICAvLyAgMHgzQiAtIEhDSV9Vc2VyX1Bhc3NrZXlfTm90aWZpY2F0aW9uIEV2ZW50Ci0gICAgNywgICAgLy8gIDB4M0MgLSBIQ0lfS2V5cHJlc3NfTm90aWZpY2F0aW9uIEV2ZW50Ci0gICAgMTQsICAgLy8gIDB4M0QgLSBIQ0lfUmVtb3RlX0hvc3RfU3VwcG9ydGVkX0ZlYXR1cmVzX05vdGlmaWNhdGlvbiBFdmVudAotICAgIDAsICAgIC8vICAweDNFIC0gTEUgTWV0YSBldmVudAotICAgIDAsICAgIC8vICAweDNGIC0gTi9BCi0gICAgMiwgICAgLy8gIDB4NDAgLSBIQ0lfUGh5c2ljYWxfTGlua19Db21wbGV0ZSBFdmVudAotICAgIDEsICAgIC8vICAweDQxIC0gSENJX0NoYW5uZWxfU2VsZWN0ZWQgRXZlbnQKLSAgICAzLCAgICAvLyAgMHg0MiAtIEhDSV9EaXNjb25uZWN0aW9uX1BoeXNpY2FsX0xpbmtfQ29tcGxldGUgRXZlbnQKLSAgICAyLCAgICAvLyAgMHg0MyAtIEhDSV9QaHlzaWNhbF9MaW5rX0xvc3NfRWFybHlfV2FybmluZyBFdmVudAotICAgIDEsICAgIC8vICAweDQ0IC0gSENJX1BoeXNpY2FsX0xpbmtfUmVjb3ZlcnkgRXZlbnQKLSAgICA1LCAgICAvLyAgMHg0NSAtIEhDSV9Mb2dpY2FsX0xpbmtfQ29tcGxldGUgRXZlbnQKLSAgICA0LCAgICAvLyAgMHg0NiAtIEhDSV9EaXNjb25uZWN0aW9uX0xvZ2ljYWxfTGlua19Db21wbGV0ZSBFdmVudAotICAgIDMsICAgIC8vICAweDQ3IC0gSENJX0Zsb3dfU3BlY19Nb2RpZnlfQ29tcGxldGUgRXZlbnQKLSAgICA5LCAgICAvLyAgMHg0OCAtIEhDSV9OdW1iZXJfT2ZfQ29tcGxldGVkX0RhdGFfQmxvY2tzIEV2ZW50IChOdW1fSGFuZGxlcyA9IDEpCi0gICAgMiwgICAgLy8gIDB4NDkgLSBIQ0lfQU1QX1N0YXJ0X1Rlc3QgRXZlbnQKLSAgICAyLCAgICAvLyAgMHg0QSAtIEhDSV9BTVBfVGVzdF9FbmQgRXZlbnQKLSAgICAxOCwgICAvLyAgMHg0QiAtIEhDSV9BTVBfUmVjZWl2ZXJfUmVwb3J0IEV2ZW50Ci0gICAgMywgICAgLy8gIDB4NEMgLSBIQ0lfU2hvcnRfUmFuZ2VfTW9kZV9DaGFuZ2VfQ29tcGxldGUgRXZlbnQKLSAgICAyLCAgICAvLyAgMHg0RCAtIEhDSV9BTVBfU3RhdHVzX0NoYW5nZSBFdmVudAotICAgIDksICAgIC8vICAweDRFIC0gSENJX1RyaWdnZXJlZF9DbG9ja19DYXB0dXJlIEV2ZW50Ci0gICAgMSwgICAgLy8gIDB4NEYgLSBIQ0lfU3luY2hyb25pemF0aW9uX1RyYWluX0NvbXBsZXRlIEV2ZW50Ci0gICAgMjksICAgLy8gIDB4NTAgLSBIQ0lfU3luY2hyb25pemF0aW9uX1RyYWluX1JlY2VpdmVkIEV2ZW50Ci0gICAgMTgsICAgLy8gIDB4NTEgLSBIQ0lfQ29ubmVjdGlvbmxlc3NfUGVyaXBoZXJhbF9Ccm9hZGNhc3RfUmVjZWl2ZSBFdmVudAotICAgICAgICAgIC8vICAoRGF0YV9MZW5ndGggPSAwKQotICAgIDcsICAgIC8vICAweDUyIC0gSENJX0Nvbm5lY3Rpb25sZXNzX1BlcmlwaGVyYWxfQnJvYWRjYXN0X1RpbWVvdXQgRXZlbnQKLSAgICA3LCAgICAvLyAgMHg1MyAtIEhDSV9UcnVuY2F0ZWRfUGFnZV9Db21wbGV0ZSBFdmVudAotICAgIDAsICAgIC8vICAweDU0IC0gSENJX1BlcmlwaGVyYWxfUGFnZV9SZXNwb25zZV9UaW1lb3V0IEV2ZW50Ci0gICAgMTAsICAgLy8gIDB4NTUgLSBIQ0lfQ29ubmVjdGlvbmxlc3NfUGVyaXBoZXJhbF9Ccm9hZGNhc3RfQ2hhbm5lbF9NYXBfQ2hhbmdlCi0gICAgICAgICAgLy8gIEV2ZW50Ci0gICAgNCwgICAgLy8gIDB4NTYgLSBIQ0lfSW5xdWlyeV9SZXNwb25zZV9Ob3RpZmljYXRpb24gRXZlbnQKLSAgICAyLCAgICAvLyAgMHg1NyAtIEhDSV9BdXRoZW50aWNhdGVkX1BheWxvYWRfVGltZW91dF9FeHBpcmVkIEV2ZW50Ci0gICAgOCwgICAgLy8gIDB4NTggLSBIQ0lfU0FNX1N0YXR1c19DaGFuZ2UgRXZlbnQKLSAgICAwLCAgICAvLyAgMHg1OSAtIE4vQQotICAgIDAsICAgIC8vICAweDVBIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NUIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg1QyAtIE4vQQotICAgIDAsICAgIC8vICAweDVEIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NUUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg1RiAtIE4vQQotICAgIDAsICAgIC8vICAweDYwIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NjEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg2MiAtIE4vQQotICAgIDAsICAgIC8vICAweDYzIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NjQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg2NSAtIE4vQQotICAgIDAsICAgIC8vICAweDY2IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NjcgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg2OCAtIE4vQQotICAgIDAsICAgIC8vICAweDY5IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NkEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg2QiAtIE4vQQotICAgIDAsICAgIC8vICAweDZDIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NkQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg2RSAtIE4vQQotICAgIDAsICAgIC8vICAweDZGIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NzAgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg3MSAtIE4vQQotICAgIDAsICAgIC8vICAweDcyIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NzMgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg3NCAtIE4vQQotICAgIDAsICAgIC8vICAweDc1IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NzYgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg3NyAtIE4vQQotICAgIDAsICAgIC8vICAweDc4IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4NzkgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg3QSAtIE4vQQotICAgIDAsICAgIC8vICAweDdCIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4N0MgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg3RCAtIE4vQQotICAgIDAsICAgIC8vICAweDdFIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4N0YgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg4MCAtIE4vQQotICAgIDAsICAgIC8vICAweDgxIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4ODIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg4MyAtIE4vQQotICAgIDAsICAgIC8vICAweDg0IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4ODUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg4NiAtIE4vQQotICAgIDAsICAgIC8vICAweDg3IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4ODggLSBOL0EKLSAgICAwLCAgICAvLyAgMHg4OSAtIE4vQQotICAgIDAsICAgIC8vICAweDhBIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OEIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg4QyAtIE4vQQotICAgIDAsICAgIC8vICAweDhEIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OEUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg4RiAtIE4vQQotICAgIDAsICAgIC8vICAweDkwIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OTEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg5MiAtIE4vQQotICAgIDAsICAgIC8vICAweDkzIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OTQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg5NSAtIE4vQQotICAgIDAsICAgIC8vICAweDk2IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OTcgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg5OCAtIE4vQQotICAgIDAsICAgIC8vICAweDk5IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OUEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg5QiAtIE4vQQotICAgIDAsICAgIC8vICAweDlDIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4OUQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHg5RSAtIE4vQQotICAgIDAsICAgIC8vICAweDlGIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QTAgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhBMSAtIE4vQQotICAgIDAsICAgIC8vICAweEEyIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QTMgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhBNCAtIE4vQQotICAgIDAsICAgIC8vICAweEE1IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QTYgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhBNyAtIE4vQQotICAgIDAsICAgIC8vICAweEE4IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QTkgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhBQSAtIE4vQQotICAgIDAsICAgIC8vICAweEFCIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QUMgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhBRCAtIE4vQQotICAgIDAsICAgIC8vICAweEFFIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QUYgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhCMCAtIE4vQQotICAgIDAsICAgIC8vICAweEIxIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QjIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhCMyAtIE4vQQotICAgIDAsICAgIC8vICAweEI0IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QjUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhCNiAtIE4vQQotICAgIDAsICAgIC8vICAweEI3IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QjggLSBOL0EKLSAgICAwLCAgICAvLyAgMHhCOSAtIE4vQQotICAgIDAsICAgIC8vICAweEJBIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QkIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhCQyAtIE4vQQotICAgIDAsICAgIC8vICAweEJEIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QkUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhCRiAtIE4vQQotICAgIDAsICAgIC8vICAweEMwIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QzEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhDMiAtIE4vQQotICAgIDAsICAgIC8vICAweEMzIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QzQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhDNSAtIE4vQQotICAgIDAsICAgIC8vICAweEM2IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4QzcgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhDOCAtIE4vQQotICAgIDAsICAgIC8vICAweEM5IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4Q0EgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhDQiAtIE4vQQotICAgIDAsICAgIC8vICAweENDIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4Q0QgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhDRSAtIE4vQQotICAgIDAsICAgIC8vICAweENGIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RDAgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhEMSAtIE4vQQotICAgIDAsICAgIC8vICAweEQyIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RDMgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhENCAtIE4vQQotICAgIDAsICAgIC8vICAweEQ1IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RDYgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhENyAtIE4vQQotICAgIDAsICAgIC8vICAweEQ4IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RDkgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhEQSAtIE4vQQotICAgIDAsICAgIC8vICAweERCIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4REMgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhERCAtIE4vQQotICAgIDAsICAgIC8vICAweERFIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4REYgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhFMCAtIE4vQQotICAgIDAsICAgIC8vICAweEUxIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RTIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhFMyAtIE4vQQotICAgIDAsICAgIC8vICAweEU0IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RTUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhFNiAtIE4vQQotICAgIDAsICAgIC8vICAweEU3IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RTggLSBOL0EKLSAgICAwLCAgICAvLyAgMHhFOSAtIE4vQQotICAgIDAsICAgIC8vICAweEVBIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RUIgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhFQyAtIE4vQQotICAgIDAsICAgIC8vICAweEVEIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RUUgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhFRiAtIE4vQQotICAgIDAsICAgIC8vICAweEYwIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RjEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhGMiAtIE4vQQotICAgIDAsICAgIC8vICAweEYzIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RjQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhGNSAtIE4vQQotICAgIDAsICAgIC8vICAweEY2IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RjcgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhGOCAtIE4vQQotICAgIDAsICAgIC8vICAweEY5IC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RkEgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhGQiAtIE4vQQotICAgIDAsICAgIC8vICAweEZDIC0gTi9BCi0gICAgMCwgICAgLy8gIDB4RkQgLSBOL0EKLSAgICAwLCAgICAvLyAgMHhGRSAtIE4vQQotICAgIDAsICAgIC8vICAweEZGIC0gSENJX1ZlbmRvcl9TcGVjaWZpYyBFdmVudAotfTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvaGNpX21vZGUuaCBiL3N0YWNrL2luY2x1ZGUvaGNpX21vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNDQ0My4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2hjaV9tb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotLyogSENJIG1vZGUgZGVmZW5pdGlvbnMgKi8KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBIQ0lfTU9ERV9BQ1RJVkUgPSAweDAwLAotICBIQ0lfTU9ERV9IT0xEID0gMHgwMSwKLSAgSENJX01PREVfU05JRkYgPSAweDAyLAotICBIQ0lfTU9ERV9QQVJLID0gMHgwMywKLX0gdEhDSV9NT0RFOwotCi1pbmxpbmUgc3RkOjpzdHJpbmcgaGNpX21vZGVfdGV4dChjb25zdCB0SENJX01PREUmIG1vZGUpIHsKLSAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBIQ0lfTU9ERV9BQ1RJVkU6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImFjdGl2ZSIpOwotICAgIGNhc2UgSENJX01PREVfSE9MRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiaG9sZCIpOwotICAgIGNhc2UgSENJX01PREVfU05JRkY6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInNuaWZmIik7Ci0gICAgY2FzZSBIQ0lfTU9ERV9QQVJLOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJwYXJrIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2hjaWRlZnMuaCBiL3N0YWNrL2luY2x1ZGUvaGNpZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmM2NWExLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvaGNpZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEhDSURFRlNfSAotI2RlZmluZSBIQ0lERUZTX0gKLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLQotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTiAweDAxICAgICAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDEuMSAgICAgICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl8xXzIgMHgwMiAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDEuMiAgICAgICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl8yXzAgMHgwMyAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDIuMCAgICAgICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl8yXzEgMHgwNCAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDIuMSBbTGlzYm9uXSAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl8zXzAgMHgwNSAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDMuMCAgICAgICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl80XzAgMHgwNiAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDQuMCBbTEVdICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl80XzEgMHgwNyAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDQuMSAgICAgICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl80XzIgMHgwOCAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDQuMiAgICAgICAgICAqLwotI2RlZmluZSBIQ0lfUFJPVE9fVkVSU0lPTl81XzAgMHgwOSAvKiBWZXJzaW9uIGZvciBCVCBzcGVjIDUuMCAgICAgICAgICAqLwotCi0vKgotICogIERlZmluaXRpb25zIGZvciBIQ0kgZ3JvdXBzCi0qLwotI2RlZmluZSBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTICgweDAxIDw8IDEwKSAgICAgICAvKiAweDA0MDAgKi8KLSNkZWZpbmUgSENJX0dSUF9MSU5LX1BPTElDWV9DTURTICgweDAyIDw8IDEwKSAgICAgICAgLyogMHgwODAwICovCi0jZGVmaW5lIEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMgKDB4MDMgPDwgMTApIC8qIDB4MEMwMCAqLwotI2RlZmluZSBIQ0lfR1JQX0lORk9STUFUSU9OQUxfUEFSQU1TICgweDA0IDw8IDEwKSAgICAvKiAweDEwMDAgKi8KLSNkZWZpbmUgSENJX0dSUF9TVEFUVVNfUEFSQU1TICgweDA1IDw8IDEwKSAgICAgICAgICAgLyogMHgxNDAwICovCi0jZGVmaW5lIEhDSV9HUlBfVEVTVElOR19DTURTICgweDA2IDw8IDEwKSAgICAgICAgICAgIC8qIDB4MTgwMCAqLwotI2RlZmluZSBIQ0lfR1JQX0JMRV9DTURTICgweDA4IDw8IDEwKSAgICAgICAgICAgICAgIC8qIDB4MjAwMCAoTEUgQ29tbWFuZHMpICovCi0KLSNkZWZpbmUgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMgKDB4M0YgPDwgMTApIC8qIDB4RkMwMCAqLwotCi0vKgotICogIERlZmluaXRpb25zIGZvciBMaW5rIENvbnRyb2wgQ29tbWFuZHMKLSovCi0vKiBGb2xsb3dpbmcgb3Bjb2RlIGlzIHVzZWQgb25seSBpbiBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGZvciBmbG93IGNvbnRyb2wgKi8KLSNkZWZpbmUgSENJX0NPTU1BTkRfTk9ORSAweDAwMDAKLQotLyogQ29tbWFuZHMgb2YgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUyBncm91cCAqLwotI2RlZmluZSBIQ0lfSU5RVUlSWSAoMHgwMDAxIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0lOUVVJUllfQ0FOQ0VMICgweDAwMDIgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUEVSSU9ESUNfSU5RVUlSWV9NT0RFICgweDAwMDMgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfRVhJVF9QRVJJT0RJQ19JTlFVSVJZX01PREUgKDB4MDAwNCB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9DUkVBVEVfQ09OTkVDVElPTiAoMHgwMDA1IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0RJU0NPTk5FQ1QgKDB4MDAwNiB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9BRERfU0NPX0NPTk5FQ1RJT04gKDB4MDAwNyB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9DUkVBVEVfQ09OTkVDVElPTl9DQU5DRUwgKDB4MDAwOCB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9BQ0NFUFRfQ09OTkVDVElPTl9SRVFVRVNUICgweDAwMDkgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVCAoMHgwMDBBIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0xJTktfS0VZX1JFUVVFU1RfUkVQTFkgKDB4MDAwQiB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9MSU5LX0tFWV9SRVFVRVNUX05FR19SRVBMWSAoMHgwMDBDIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1BJTl9DT0RFX1JFUVVFU1RfUkVQTFkgKDB4MDAwRCB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9QSU5fQ09ERV9SRVFVRVNUX05FR19SRVBMWSAoMHgwMDBFIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0NIQU5HRV9DT05OX1BBQ0tFVF9UWVBFICgweDAwMEYgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfQVVUSEVOVElDQVRJT05fUkVRVUVTVEVEICgweDAwMTEgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX0NPTk5fRU5DUllQVElPTiAoMHgwMDEzIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0NIQU5HRV9DT05OX0xJTktfS0VZICgweDAwMTUgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfQ0VOVFJBTF9MSU5LX0tFWSAoMHgwMDE3IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1JNVF9OQU1FX1JFUVVFU1QgKDB4MDAxOSB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9STVRfTkFNRV9SRVFVRVNUX0NBTkNFTCAoMHgwMDFBIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfUk1UX0ZFQVRVUkVTICgweDAwMUIgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9STVRfRVhUX0ZFQVRVUkVTICgweDAwMUMgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9STVRfVkVSU0lPTl9JTkZPICgweDAwMUQgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9STVRfQ0xPQ0tfT0ZGU0VUICgweDAwMUYgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9MTVBfSEFORExFICgweDAwMjAgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfU0VUVVBfRVNDT19DT05ORUNUSU9OICgweDAwMjggfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfQUNDRVBUX0VTQ09fQ09OTkVDVElPTiAoMHgwMDI5IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1JFSkVDVF9FU0NPX0NPTk5FQ1RJT04gKDB4MDAyQSB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9JT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFkgKDB4MDAyQiB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9VU0VSX0NPTkZfUkVRVUVTVF9SRVBMWSAoMHgwMDJDIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1VTRVJfQ09ORl9WQUxVRV9ORUdfUkVQTFkgKDB4MDAyRCB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9VU0VSX1BBU1NLRVlfUkVRX1JFUExZICgweDAwMkUgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfVVNFUl9QQVNTS0VZX1JFUV9ORUdfUkVQTFkgKDB4MDAyRiB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9SRU1fT09CX0RBVEFfUkVRX1JFUExZICgweDAwMzAgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfUkVNX09PQl9EQVRBX1JFUV9ORUdfUkVQTFkgKDB4MDAzMyB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9JT19DQVBfUkVRX05FR19SRVBMWSAoMHgwMDM0IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLQotLyogQU1QIEhDSSAqLwotI2RlZmluZSBIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTksgKDB4MDAzNSB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSyAoMHgwMDM2IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOSyAoMHgwMDM3IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0NSRUFURV9MT0dJQ0FMX0xJTksgKDB4MDAzOCB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LICgweDAwMzkgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTksgKDB4MDAzQSB8IEhDSV9HUlBfTElOS19DT05UUk9MX0NNRFMpCi0jZGVmaW5lIEhDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMICgweDAwM0IgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfRkxPV19TUEVDX01PRElGWSAoMHgwMDNDIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLQotI2RlZmluZSBIQ0lfRU5IX1NFVFVQX0VTQ09fQ09OTkVDVElPTiAoMHgwMDNEIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX0VOSF9BQ0NFUFRfRVNDT19DT05ORUNUSU9OICgweDAwM0UgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotCi0vKiBDb25uZWN0aW9uTGVzcyBCcm9hZGNhc3QgKi8KLSNkZWZpbmUgSENJX1RSVU5DQVRFRF9QQUdFICgweDAwM0YgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfVFJVTkNBVEVEX1BBR0VfQ0FOQ0VMICgweDAwNDAgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX0NMQiAoMHgwMDQxIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1JFQ0VJVkVfQ0xCICgweDAwNDIgfCBIQ0lfR1JQX0xJTktfQ09OVFJPTF9DTURTKQotI2RlZmluZSBIQ0lfU1RBUlRfU1lOQ19UUkFJTiAoMHgwMDQzIHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLSNkZWZpbmUgSENJX1JFQ0VJVkVfU1lOQ19UUkFJTiAoMHgwMDQ0IHwgSENJX0dSUF9MSU5LX0NPTlRST0xfQ01EUykKLQotI2RlZmluZSBIQ0lfTElOS19DVFJMX0NNRFNfRklSU1QgSENJX0lOUVVJUlkKLSNkZWZpbmUgSENJX0xJTktfQ1RSTF9DTURTX0xBU1QgSENJX1JFQ0VJVkVfU1lOQ19UUkFJTgotCi0vKiBDb21tYW5kcyBvZiBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMgKi8KLSNkZWZpbmUgSENJX0hPTERfTU9ERSAoMHgwMDAxIHwgSENJX0dSUF9MSU5LX1BPTElDWV9DTURTKQotI2RlZmluZSBIQ0lfU05JRkZfTU9ERSAoMHgwMDAzIHwgSENJX0dSUF9MSU5LX1BPTElDWV9DTURTKQotI2RlZmluZSBIQ0lfRVhJVF9TTklGRl9NT0RFICgweDAwMDQgfCBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMpCi0jZGVmaW5lIEhDSV9QQVJLX01PREUgKDB4MDAwNSB8IEhDSV9HUlBfTElOS19QT0xJQ1lfQ01EUykKLSNkZWZpbmUgSENJX0VYSVRfUEFSS19NT0RFICgweDAwMDYgfCBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMpCi0jZGVmaW5lIEhDSV9RT1NfU0VUVVAgKDB4MDAwNyB8IEhDSV9HUlBfTElOS19QT0xJQ1lfQ01EUykKLSNkZWZpbmUgSENJX1JPTEVfRElTQ09WRVJZICgweDAwMDkgfCBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMpCi0jZGVmaW5lIEhDSV9TV0lUQ0hfUk9MRSAoMHgwMDBCIHwgSENJX0dSUF9MSU5LX1BPTElDWV9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9QT0xJQ1lfU0VUVElOR1MgKDB4MDAwQyB8IEhDSV9HUlBfTElOS19QT0xJQ1lfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1BPTElDWV9TRVRUSU5HUyAoMHgwMDBEIHwgSENJX0dSUF9MSU5LX1BPTElDWV9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9ERUZfUE9MSUNZX1NFVFRJTkdTICgweDAwMEUgfCBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9ERUZfUE9MSUNZX1NFVFRJTkdTICgweDAwMEYgfCBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMpCi0jZGVmaW5lIEhDSV9GTE9XX1NQRUNJRklDQVRJT04gKDB4MDAxMCB8IEhDSV9HUlBfTElOS19QT0xJQ1lfQ01EUykKLSNkZWZpbmUgSENJX1NOSUZGX1NVQl9SQVRFICgweDAwMTEgfCBIQ0lfR1JQX0xJTktfUE9MSUNZX0NNRFMpCi0KLSNkZWZpbmUgSENJX0xJTktfUE9MSUNZX0NNRFNfRklSU1QgSENJX0hPTERfTU9ERQotI2RlZmluZSBIQ0lfTElOS19QT0xJQ1lfQ01EU19MQVNUIEhDSV9TTklGRl9TVUJfUkFURQotCi0vKiBDb21tYW5kcyBvZiBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTICovCi0jZGVmaW5lIEhDSV9TRVRfRVZFTlRfTUFTSyAoMHgwMDAxIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFU0VUICgweDAwMDMgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX0VWRU5UX0ZJTFRFUiAoMHgwMDA1IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX0ZMVVNIICgweDAwMDggfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9QSU5fVFlQRSAoMHgwMDA5IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1BJTl9UWVBFICgweDAwMEEgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfR0VUX01XU19UUkFOU19MQVlFUl9DRkcgKDB4MDAwQyB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX1NUT1JFRF9MSU5LX0tFWSAoMHgwMDBEIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1NUT1JFRF9MSU5LX0tFWSAoMHgwMDExIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX0RFTEVURV9TVE9SRURfTElOS19LRVkgKDB4MDAxMiB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9DSEFOR0VfTE9DQUxfTkFNRSAoMHgwMDEzIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfTkFNRSAoMHgwMDE0IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfQ09OTl9BQ0NFUFRfVE9VVCAoMHgwMDE1IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX0NPTk5fQUNDRVBUX1RPVVQgKDB4MDAxNiB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX1BBR0VfVE9VVCAoMHgwMDE3IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1BBR0VfVE9VVCAoMHgwMDE4IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfU0NBTl9FTkFCTEUgKDB4MDAxOSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9TQ0FOX0VOQUJMRSAoMHgwMDFBIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfUEFHRVNDQU5fQ0ZHICgweDAwMUIgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfUEFHRVNDQU5fQ0ZHICgweDAwMUMgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9JTlFVSVJZU0NBTl9DRkcgKDB4MDAxRCB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9JTlFVSVJZU0NBTl9DRkcgKDB4MDAxRSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRSBcCi0gICgweDAwMUYgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfQVVUSEVOVElDQVRJT05fRU5BQkxFIFwKLSAgKDB4MDAyMCB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0VOQ1JZUFRJT05fTU9ERSAoMHgwMDIxIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX0VOQ1JZUFRJT05fTU9ERSAoMHgwMDIyIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfQ0xBU1NfT0ZfREVWSUNFICgweDAwMjMgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfQ0xBU1NfT0ZfREVWSUNFICgweDAwMjQgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9WT0lDRV9TRVRUSU5HUyAoMHgwMDI1IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1ZPSUNFX1NFVFRJTkdTICgweDAwMjYgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCBcCi0gICgweDAwMjcgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQgXAotICAoMHgwMDI4IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfTlVNX0JDQVNUX1JFWE1JVFMgKDB4MDAyOSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9OVU1fQkNBU1RfUkVYTUlUUyAoMHgwMDJBIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfSE9MRF9NT0RFX0FDVElWSVRZICgweDAwMkIgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfSE9MRF9NT0RFX0FDVElWSVRZICgweDAwMkMgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9UUkFOU01JVF9QT1dFUl9MRVZFTCAoMHgwMDJEIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfU0NPX0ZMT1dfQ1RSTF9FTkFCTEUgKDB4MDAyRSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9TQ09fRkxPV19DVFJMX0VOQUJMRSBcCi0gICgweDAwMkYgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX0hDX1RPX0hPU1RfRkxPV19DVFJMICgweDAwMzEgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfSE9TVF9CVUZGRVJfU0laRSAoMHgwMDMzIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX0hPU1RfTlVNX1BBQ0tFVFNfRE9ORSAoMHgwMDM1IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfTElOS19TVVBFUl9UT1VUICgweDAwMzYgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfTElOS19TVVBFUl9UT1VUICgweDAwMzcgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9OVU1fU1VQUE9SVEVEX0lBQyAoMHgwMDM4IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfQ1VSUkVOVF9JQUNfTEFQICgweDAwMzkgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfQ1VSUkVOVF9JQUNfTEFQICgweDAwM0EgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9QQUdFU0NBTl9QRVJJT0RfTU9ERSAoMHgwMDNCIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1BBR0VTQ0FOX1BFUklPRF9NT0RFIFwKLSAgKDB4MDAzQyB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX1BBR0VTQ0FOX01PREUgKDB4MDAzRCB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9QQUdFU0NBTl9NT0RFICgweDAwM0UgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX0FGSF9DSEFOTkVMUyAoMHgwMDNGIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLQotI2RlZmluZSBIQ0lfUkVBRF9JTlFTQ0FOX1RZUEUgKDB4MDA0MiB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9JTlFTQ0FOX1RZUEUgKDB4MDA0MyB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0lOUVVJUllfTU9ERSAoMHgwMDQ0IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX0lOUVVJUllfTU9ERSAoMHgwMDQ1IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfUEFHRVNDQU5fVFlQRSAoMHgwMDQ2IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1BBR0VTQ0FOX1RZUEUgKDB4MDA0NyB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0FGSF9BU1NFU1NNRU5UX01PREUgKDB4MDA0OCB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9BRkhfQVNTRVNTTUVOVF9NT0RFICgweDAwNDkgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9FWFRfSU5RX1JFU1BPTlNFICgweDAwNTEgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfRVhUX0lOUV9SRVNQT05TRSAoMHgwMDUyIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFRlJFU0hfRU5DUllQVElPTl9LRVkgKDB4MDA1MyB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX1NJTVBMRV9QQUlSSU5HX01PREUgKDB4MDA1NSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9TSU1QTEVfUEFJUklOR19NT0RFICgweDAwNTYgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9PT0JfREFUQSAoMHgwMDU3IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfSU5RX1RYX1BPV0VSX0xFVkVMICgweDAwNTggfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfSU5RX1RYX1BPV0VSX0xFVkVMICgweDAwNTkgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfUkVBRF9FUlJPTkVPVVNfREFUQV9SUFQgKDB4MDA1QSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9FUlJPTkVPVVNfREFUQV9SUFQgKDB4MDA1QiB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9FTkhBTkNFRF9GTFVTSCAoMHgwMDVGIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1NFTkRfS0VZUFJFU1NfTk9USUYgKDB4MDA2MCB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0KLS8qIEFNUCBIQ0kgKi8KLSNkZWZpbmUgSENJX1JFQURfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUIFwKLSAgKDB4MDA2MSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQgXAotICAoMHgwMDYyIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1NFVF9FVkVOVF9NQVNLX1BBR0VfMiAoMHgwMDYzIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfTE9DQVRJT05fREFUQSAoMHgwMDY0IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX0xPQ0FUSU9OX0RBVEEgKDB4MDA2NSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFICgweDAwNjYgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREUgKDB4MDA2NyB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0JFX0ZMVVNIX1RPVVQgKDB4MDA2OSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9CRV9GTFVTSF9UT1VUICgweDAwNkEgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotLyogODAyLjExIG9ubHkgKi8KLSNkZWZpbmUgSENJX1NIT1JUX1JBTkdFX01PREUgKDB4MDA2QiB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9SRUFEX0xFX0hPU1RfU1VQUE9SVCAoMHgwMDZDIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX0xFX0hPU1RfU1VQUE9SVCAoMHgwMDZEIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLQotLyogTVdTIGNvZXhpc3RlbmNlICovCi0jZGVmaW5lIEhDSV9TRVRfTVdTX0NIQU5ORUxfUEFSQU1FVEVSUyBcCi0gICgweDAwNkUgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX0VYVEVSTkFMX0ZSQU1FX0NPTkZJR1VSQVRJT04gXAotICAoMHgwMDZGIHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1NFVF9NV1NfU0lHTkFMSU5HICgweDAwNzAgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfU0VUX01XU19UUkFOU1BPUlRfTEFZRVIgKDB4MDA3MSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9TRVRfTVdTX1NDQU5fRlJFUVVFTkNZX1RBQkxFIFwKLSAgKDB4MDA3MiB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9TRVRfTVdTX1BBVFRFUk5fQ09ORklHVVJBVElPTiBcCi0gICgweDAwNzMgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotCi0vKiBDb25uZWN0aW9ubGVzcyBCcm9hZGNhc3QgKi8KLSNkZWZpbmUgSENJX1NFVF9SRVNFUlZFRF9MVF9BRERSICgweDAwNzQgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfREVMRVRFX1JFU0VSVkVEX0xUX0FERFIgKDB4MDA3NSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9DTEJfREFUQSAoMHgwMDc2IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1JFQURfU1lOQ19UUkFJTl9QQVJBTSAoMHgwMDc3IHwgSENJX0dSUF9IT1NUX0NPTlRfQkFTRUJBTkRfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1NZTkNfVFJBSU5fUEFSQU0gKDB4MDA3OCB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0KLSNkZWZpbmUgSENJX1JFQURfU0VDVVJFX0NPTk5TX1NVUFBPUlQgKDB4MDA3OSB8IEhDSV9HUlBfSE9TVF9DT05UX0JBU0VCQU5EX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9TRUNVUkVfQ09OTlNfU1VQUE9SVCBcCi0gICgweDAwN0EgfCBIQ0lfR1JQX0hPU1RfQ09OVF9CQVNFQkFORF9DTURTKQotI2RlZmluZSBIQ0lfQ09OVF9CQVNFQkFORF9DTURTX0ZJUlNUIEhDSV9TRVRfRVZFTlRfTUFTSwotI2RlZmluZSBIQ0lfQ09OVF9CQVNFQkFORF9DTURTX0xBU1QgSENJX1JFQURfU1lOQ19UUkFJTl9QQVJBTQotCi0vKiBDb21tYW5kcyBvZiBIQ0lfR1JQX0lORk9STUFUSU9OQUxfUEFSQU1TIGdyb3VwICovCi0jZGVmaW5lIEhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GTyAoMHgwMDAxIHwgSENJX0dSUF9JTkZPUk1BVElPTkFMX1BBUkFNUykKLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NNRFMgKDB4MDAwMiB8IEhDSV9HUlBfSU5GT1JNQVRJT05BTF9QQVJBTVMpCi0jZGVmaW5lIEhDSV9SRUFEX0xPQ0FMX0ZFQVRVUkVTICgweDAwMDMgfCBIQ0lfR1JQX0lORk9STUFUSU9OQUxfUEFSQU1TKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9FWFRfRkVBVFVSRVMgKDB4MDAwNCB8IEhDSV9HUlBfSU5GT1JNQVRJT05BTF9QQVJBTVMpCi0jZGVmaW5lIEhDSV9SRUFEX0JVRkZFUl9TSVpFICgweDAwMDUgfCBIQ0lfR1JQX0lORk9STUFUSU9OQUxfUEFSQU1TKQotI2RlZmluZSBIQ0lfUkVBRF9DT1VOVFJZX0NPREUgKDB4MDAwNyB8IEhDSV9HUlBfSU5GT1JNQVRJT05BTF9QQVJBTVMpCi0jZGVmaW5lIEhDSV9SRUFEX0JEX0FERFIgKDB4MDAwOSB8IEhDSV9HUlBfSU5GT1JNQVRJT05BTF9QQVJBTVMpCi0jZGVmaW5lIEhDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRSAoMHgwMDBBIHwgSENJX0dSUF9JTkZPUk1BVElPTkFMX1BBUkFNUykKLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDUyAoMHgwMDBCIHwgSENJX0dSUF9JTkZPUk1BVElPTkFMX1BBUkFNUykKLQotI2RlZmluZSBIQ0lfSU5GT1JNQVRJT05BTF9DTURTX0ZJUlNUIEhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GTwotI2RlZmluZSBIQ0lfSU5GT1JNQVRJT05BTF9DTURTX0xBU1QgSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDUwotCi0vKiBDb21tYW5kcyBvZiBIQ0lfR1JQX1NUQVRVU19QQVJBTVMgZ3JvdXAgKi8KLSNkZWZpbmUgSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUiAoMHgwMDAxIHwgSENJX0dSUF9TVEFUVVNfUEFSQU1TKQotI2RlZmluZSBIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUiAoMHgwMDAyIHwgSENJX0dSUF9TVEFUVVNfUEFSQU1TKQotI2RlZmluZSBIQ0lfR0VUX0xJTktfUVVBTElUWSAoMHgwMDAzIHwgSENJX0dSUF9TVEFUVVNfUEFSQU1TKQotI2RlZmluZSBIQ0lfUkVBRF9SU1NJICgweDAwMDUgfCBIQ0lfR1JQX1NUQVRVU19QQVJBTVMpCi0jZGVmaW5lIEhDSV9SRUFEX0FGSF9DSF9NQVAgKDB4MDAwNiB8IEhDSV9HUlBfU1RBVFVTX1BBUkFNUykKLSNkZWZpbmUgSENJX1JFQURfQ0xPQ0sgKDB4MDAwNyB8IEhDSV9HUlBfU1RBVFVTX1BBUkFNUykKLSNkZWZpbmUgSENJX1JFQURfRU5DUl9LRVlfU0laRSAoMHgwMDA4IHwgSENJX0dSUF9TVEFUVVNfUEFSQU1TKQotCi0vKiBBTVAgSENJICovCi0jZGVmaW5lIEhDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPICgweDAwMDkgfCBIQ0lfR1JQX1NUQVRVU19QQVJBTVMpCi0jZGVmaW5lIEhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQyAoMHgwMDBBIHwgSENJX0dSUF9TVEFUVVNfUEFSQU1TKQotI2RlZmluZSBIQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQyAoMHgwMDBCIHwgSENJX0dSUF9TVEFUVVNfUEFSQU1TKQotCi0jZGVmaW5lIEhDSV9TVEFUVVNfUEFSQU1TX0NNRFNfRklSU1QgSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUgotI2RlZmluZSBIQ0lfU1RBVFVTX1BBUkFNU19DTURTX0xBU1QgSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0MKLQotLyogQ29tbWFuZHMgb2YgSENJX0dSUF9URVNUSU5HX0NNRFMgZ3JvdXAgKi8KLSNkZWZpbmUgSENJX1JFQURfTE9PUEJBQ0tfTU9ERSAoMHgwMDAxIHwgSENJX0dSUF9URVNUSU5HX0NNRFMpCi0jZGVmaW5lIEhDSV9XUklURV9MT09QQkFDS19NT0RFICgweDAwMDIgfCBIQ0lfR1JQX1RFU1RJTkdfQ01EUykKLSNkZWZpbmUgSENJX0VOQUJMRV9ERVZfVU5ERVJfVEVTVF9NT0RFICgweDAwMDMgfCBIQ0lfR1JQX1RFU1RJTkdfQ01EUykKLSNkZWZpbmUgSENJX1dSSVRFX1NJTVBfUEFJUl9ERUJVR19NT0RFICgweDAwMDQgfCBIQ0lfR1JQX1RFU1RJTkdfQ01EUykKLQotLyogQU1QIEhDSSAqLwotI2RlZmluZSBIQ0lfRU5BQkxFX0FNUF9SQ1ZSX1JFUE9SVFMgKDB4MDAwNyB8IEhDSV9HUlBfVEVTVElOR19DTURTKQotI2RlZmluZSBIQ0lfQU1QX1RFU1RfRU5EICgweDAwMDggfCBIQ0lfR1JQX1RFU1RJTkdfQ01EUykKLSNkZWZpbmUgSENJX0FNUF9URVNUICgweDAwMDkgfCBIQ0lfR1JQX1RFU1RJTkdfQ01EUykKLQotI2RlZmluZSBIQ0lfVEVTVElOR19DTURTX0ZJUlNUIEhDSV9SRUFEX0xPT1BCQUNLX01PREUKLSNkZWZpbmUgSENJX1RFU1RJTkdfQ01EU19MQVNUIEhDSV9BTVBfVEVTVAotCi0jZGVmaW5lIEhDSV9WRU5ET1JfQ01EU19GSVJTVCAweDAwMDEKLSNkZWZpbmUgSENJX1ZFTkRPUl9DTURTX0xBU1QgMHhGRkZGCi0jZGVmaW5lIEhDSV9WU0NfTVVMVElfQVZfSEFORExFIDB4MEFBQQotI2RlZmluZSBIQ0lfVlNDX0JVUlNUX01PREVfSEFORExFIDB4MEJCQgotCi0vKiBCTEUgSENJIEdyb3VwIENvbW1hbmRzICovCi0vKiBDb21tYW5kcyBvZiBCTEUgQ29udHJvbGxlciBzZXR1cCBhbmQgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBIQ0lfQkxFX1NFVF9FVkVOVF9NQVNLICgweDAwMDEgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfQlVGRkVSX1NJWkUgKDB4MDAwMiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9MT0NBTF9TUFRfRkVBVCAoMHgwMDAzIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9XUklURV9MT0NBTF9TUFRfRkVBVCAoMHgwMDA0IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9XUklURV9SQU5ET01fQUREUiAoMHgwMDA1IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9XUklURV9BRFZfUEFSQU1TICgweDAwMDYgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfQURWX0NITkxfVFhfUE9XRVIgKDB4MDAwNyB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfV1JJVEVfQURWX0RBVEEgKDB4MDAwOCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfV1JJVEVfU0NBTl9SU1BfREFUQSAoMHgwMDA5IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9XUklURV9BRFZfRU5BQkxFICgweDAwMEEgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1dSSVRFX1NDQU5fUEFSQU1TICgweDAwMEIgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1dSSVRFX1NDQU5fRU5BQkxFICgweDAwMEMgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX0NSRUFURV9MTF9DT05OICgweDAwMEQgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX0NSRUFURV9DT05OX0NBTkNFTCAoMHgwMDBFIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9SRUFEX0FDQ0VQVExJU1RfU0laRSAoMHgwMDBGIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9DTEVBUl9BQ0NFUFRMSVNUICgweDAwMTAgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX0FERF9BQ0NFUFRMSVNUICgweDAwMTEgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFTU9WRV9BQ0NFUFRMSVNUICgweDAwMTIgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1VQRF9MTF9DT05OX1BBUkFNUyAoMHgwMDEzIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9TRVRfSE9TVF9DSE5MX0NMQVNTICgweDAwMTQgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfQ0hOTF9NQVAgKDB4MDAxNSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9SRU1PVEVfRkVBVCAoMHgwMDE2IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9FTkNSWVBUICgweDAwMTcgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JBTkQgKDB4MDAxOCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfU1RBUlRfRU5DICgweDAwMTkgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX0xUS19SRVFfUkVQTFkgKDB4MDAxQSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfTFRLX1JFUV9ORUdfUkVQTFkgKDB4MDAxQiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9TVVBQT1JURURfU1RBVEVTICgweDAwMUMgfCBIQ0lfR1JQX0JMRV9DTURTKQotLyogMHgwMDFELCAweDAwMUUgYW5kIDB4MDAxRiBhcmUgcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgSENJX0JMRV9SRUNFSVZFUl9URVNUICgweDAwMUQgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1RSQU5TTUlUVEVSX1RFU1QgKDB4MDAxRSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0vKiBCTEUgVEVTVCBDT01NQU5EUyAqLwotI2RlZmluZSBIQ0lfQkxFX1RFU1RfRU5EICgweDAwMUYgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JDX1BBUkFNX1JFUV9SRVBMWSAoMHgwMDIwIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9SQ19QQVJBTV9SRVFfTkVHX1JFUExZICgweDAwMjEgfCBIQ0lfR1JQX0JMRV9DTURTKQotCi0jZGVmaW5lIEhDSV9CTEVfU0VUX0RBVEFfTEVOR1RIICgweDAwMjIgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfREVGQVVMVF9EQVRBX0xFTkdUSCAoMHgwMDIzIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9XUklURV9ERUZBVUxUX0RBVEFfTEVOR1RIICgweDAwMjQgfCBIQ0lfR1JQX0JMRV9DTURTKQotCi0jZGVmaW5lIEhDSV9CTEVfQUREX0RFVl9SRVNPTFZJTkdfTElTVCAoMHgwMDI3IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9STV9ERVZfUkVTT0xWSU5HX0xJU1QgKDB4MDAyOCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfQ0xFQVJfUkVTT0xWSU5HX0xJU1QgKDB4MDAyOSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9SRVNPTFZJTkdfTElTVF9TSVpFICgweDAwMkEgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfUkVTT0xWQUJMRV9BRERSX1BFRVIgKDB4MDAyQiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9SRVNPTFZBQkxFX0FERFJfTE9DQUwgKDB4MDAyQyB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfU0VUX0FERFJfUkVTT0xVVElPTl9FTkFCTEUgKDB4MDAyRCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfU0VUX1JBTkRfUFJJVl9BRERSX1RJTU9VVCAoMHgwMDJFIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9SRUFEX01BWElNVU1fREFUQV9MRU5HVEggKDB4MDAyRiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9QSFkgKDB4MDAzMCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfU0VUX0RFRkFVTFRfUEhZICgweDAwMzEgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1NFVF9QSFkgKDB4MDAzMiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfRU5IX1JFQ0VJVkVSX1RFU1QgKDB4MDAzMyB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfRU5IX1RSQU5TTUlUVEVSX1RFU1QgKDB4MDAzNCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9TRVRfRVhUX0FEVkVSVElTSU5HX1JBTkRPTV9BRERSRVNTICgweDM1IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfUEFSQU0gKDB4MzYgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfU0VUX0VYVF9BRFZFUlRJU0lOR19EQVRBICgweDM3IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfU0NBTl9SRVNQICgweDM4IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9FWFRfQURWRVJUSVNJTkdfRU5BQkxFICgweDM5IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1JFQURfTUFYSU1VTV9BRFZFUlRJU0lOR19EQVRBX0xFTkdUSCAoMHgwMDNBIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1JFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9BRFZFUlRJU0lOR19TRVRTIFwKLSAgKDB4MDAzQiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9SRU1PVkVfQURWRVJUSVNJTkdfU0VUICgweDAwM0MgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfQ0xFQVJfQURWRVJUSVNJTkdfU0VUUyAoMHgwMDNEIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19QQVJBTSAoMHgwMDNFIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19EQVRBICgweDAwM0YgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfU0VUX1BFUklPRElDX0FEVkVSVElTSU5HX0VOQUJMRSAoMHgwMDQwIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9FWFRFTkRFRF9TQ0FOX1BBUkFNRVRFUlMgKDB4MDA0MSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUgKDB4MDA0MiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9FWFRFTkRFRF9DUkVBVEVfQ09OTkVDVElPTiAoMHgwMDQzIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQyAoMHgwMDQ0IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19DUkVBVEVfU1lOQ19DQU5DRUwgXAotICAoMHgwMDQ1IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9QRVJJT0RJQ19BRFZFUlRJU0lOR19URVJNSU5BVEVfU1lOQyBcCi0gICgweDAwNDYgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX0FERF9ERVZJQ0VfVE9fUEVSSU9ESUNfQURWRVJUSVNFUl9MSVNUIFwKLSAgKDB4MDA0NyB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVNT1ZFX0RFVklDRV9GUk9NX1BFUklPRElDX0FEVkVSVElTRVJfTElTVCBcCi0gICgweDAwNDggfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX0NMRUFSX1BFUklPRElDX0FEVkVSVElTRVJfTElTVCAoMHgwMDQ5IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0JMRV9SRUFEX1BFUklPRElDX0FEVkVSVElTRVJfTElTVF9TSVpFICgweDAwNEEgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfVFJBTlNNSVRfUE9XRVIgKDB4MDA0QiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfUkVBRF9SRl9DT01QRU5TX1BPV0VSICgweDAwNEMgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1dSSVRFX1JGX0NPTVBFTlNfUE9XRVIgKDB4MDA0RCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9CTEVfU0VUX1BSSVZBQ1lfTU9ERSAoMHgwMDRFIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9QRVJJT0RJQ19BRFZFUlRJU0lOR19SRUNFSVZFX0VOQUJMRSBcCi0gICgweDAwNTkgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUiAoMHgwMDVBIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1BFUklPRElDX0FEVkVSVElTSU5HX1NFVF9JTkZPX1RSQU5TRkVSIFwKLSAgKDB4MDA1QiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9TRVRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTSBcCi0gICgweDAwNUMgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfU0VUX0RFRkFVTFRfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9QQVJBTSBcCi0gICgweDAwNUQgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfQkxFX1JFQURfQlVGRkVSX1NJWkVfVjIgKDB4MDA2MCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9TRVRfSE9TVF9GRUFUVVJFICgweDAwNzQgfCBIQ0lfR1JQX0JMRV9DTURTKQotCi0vKiBMRSBHZXQgVmVuZG9yIENhcGFiaWxpdGllcyBDb21tYW5kIG9wY29kZSAqLwotI2RlZmluZSBIQ0lfQkxFX1ZFTkRPUl9DQVAgKDB4MDE1MyB8IEhDSV9HUlBfVkVORE9SX1NQRUNJRklDKQotI2RlZmluZSBIQ0lfTEVfUkVBRF9JU09fVFhfU1lOQyAoMHgwMDYxIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1NFVF9DSUdfUEFSQU1TICgweDAwNjIgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfU0VUX0NJR19QQVJBTVNfVEVTVCAoMHgwMDYzIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX0NSRUFURV9DSVMgKDB4MDA2NCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9SRU1PVkVfQ0lHICgweDAwNjUgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfQUNDRVBUX0NJU19SRVEgKDB4MDA2NiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9SRUpfQ0lTX1JFUSAoMHgwMDY3IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX0NSRUFURV9CSUcgKDB4MDA2OCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9DUkVBVEVfQklHX1RFU1QgKDB4MDA2OSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9URVJNX0JJRyAoMHgwMDZBIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX0JJR19DUkVBVEVfU1lOQyAoMHgwMDZCIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX0JJR19URVJNX1NZTkMgKDB4MDA2QyB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9SRVFfUEVFUl9TQ0EgKDB4MDA2RCB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9TRVRVUF9JU09fREFUQV9QQVRIICgweDAwNkUgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfUkVNT1ZFX0lTT19EQVRBX1BBVEggKDB4MDA2RiB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9JU09fVFJBTlNNSVRfVEVTVCAoMHgwMDcwIHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX0lTT19SRUNFSVZFX1RFU1QgKDB4MDA3MSB8IEhDSV9HUlBfQkxFX0NNRFMpCi0jZGVmaW5lIEhDSV9MRV9JU09fUkVBRF9URVNUX0NOVFJTICgweDAwNzIgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfSVNPX1RFU1RfRU5EICgweDAwNzMgfCBIQ0lfR1JQX0JMRV9DTURTKQotI2RlZmluZSBIQ0lfTEVfU0VUX0hPU1RfRkVBVFVSRSAoMHgwMDc0IHwgSENJX0dSUF9CTEVfQ01EUykKLSNkZWZpbmUgSENJX0xFX1JFQURfSVNPX0xJTktfUVVBTElUWSAoMHgwMDc1IHwgSENJX0dSUF9CTEVfQ01EUykKLQotLyogTXVsdGkgYWR2IG9wY29kZSAqLwotI2RlZmluZSBIQ0lfQkxFX01VTFRJX0FEViAoMHgwMTU0IHwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0KLS8qIEJhdGNoIHNjYW4gb3Bjb2RlICovCi0jZGVmaW5lIEhDSV9CTEVfQkFUQ0hfU0NBTiAoMHgwMTU2IHwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0KLS8qIEFEViBmaWx0ZXIgb3Bjb2RlICovCi0jZGVmaW5lIEhDSV9CTEVfQURWX0ZJTFRFUiAoMHgwMTU3IHwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0KLS8qIEVuZXJneSBpbmZvIG9wY29kZSAqLwotI2RlZmluZSBIQ0lfQkxFX0VORVJHWV9JTkZPICgweDAxNTkgfCBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQykKLQotLyogQ29udHJvbGxlciBkZWJ1ZyBpbmZvIG9wY29kZSAqLwotI2RlZmluZSBIQ0lfQ09OVFJPTExFUl9ERUJVR19JTkZPICgweDAxNUIgfCBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQykKLQotLyogQTJEUCBvZmZsb2FkIG9wY29kZSAqLwotI2RlZmluZSBIQ0lfQ09OVFJPTExFUl9BMkRQICgweDAxNUQgfCBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQykKLQotLyogQmx1ZXRvb3RoIFF1YWxpdHkgUmVwb3J0IG9wY29kZSAqLwotI2RlZmluZSBIQ0lfQ09OVFJPTExFUl9CUVIgKDB4MDE1RSB8IEhDSV9HUlBfVkVORE9SX1NQRUNJRklDKQotCi0vKiBCbHVldG9vdGggRHluYW1pYyBBdWRpbyBCdWZmZXIgb3Bjb2RlICovCi0jZGVmaW5lIEhDSV9DT05UUk9MTEVSX0RBQiAoMHgwMTVGIHwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0jZGVmaW5lIEhDSV9DT05UUk9MTEVSX0RBQl9HRVRfQlVGRkVSX1RJTUUgMHgwMQotI2RlZmluZSBIQ0lfQ09OVFJPTExFUl9EQUJfU0VUX0JVRkZFUl9USU1FIDB4MDIKLQotLyogc3ViY29kZSBmb3IgbXVsdGkgYWR2IGZlYXR1cmUgKi8KLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfU0VUX1BBUkFNIDB4MDEKLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfV1JJVEVfQURWX0RBVEEgMHgwMgotI2RlZmluZSBCVE1fQkxFX01VTFRJX0FEVl9XUklURV9TQ0FOX1JTUF9EQVRBIDB4MDMKLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfU0VUX1JBTkRPTV9BRERSIDB4MDQKLSNkZWZpbmUgQlRNX0JMRV9NVUxUSV9BRFZfRU5CIDB4MDUKLQotLyogbXVsdGkgYWR2IFZTRSBzdWJjb2RlICovCi0vKiBtdWx0aSBhZHYgaW5zdGFuY2Ugc3RhdGUgY2hhbmdlICovCi0jZGVmaW5lIEhDSV9WU0VfU1VCQ09ERV9CTEVfTVVMVElfQURWX1NUX0NIRyAweDU1Ci0KLS8qIHN1YmNvZGUgZm9yIGJhdGNoIHNjYW4gZmVhdHVyZSAqLwotI2RlZmluZSBCVE1fQkxFX0JBVENIX1NDQU5fRU5CX0RJU0FCX0NVU1RfRkVBVFVSRSAweDAxCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfU0NBTl9TRVRfU1RPUkFHRV9QQVJBTSAweDAyCi0jZGVmaW5lIEJUTV9CTEVfQkFUQ0hfU0NBTl9TRVRfUEFSQU1TIDB4MDMKLSNkZWZpbmUgQlRNX0JMRV9CQVRDSF9TQ0FOX1JFQURfUkVTVUxUUyAweDA0Ci0KLS8qIGJhdGNoIHNjYW4gVlNFIHN1YmNvZGUgKi8KLSNkZWZpbmUgSENJX1ZTRV9TVUJDT0RFX0JMRV9USFJFU0hPTERfU1VCX0VWVCAweDU0IC8qIFRocmVzaG9sZCBldmVudCAqLwotCi0vKiB0cmFja2luZyBzdWIgZXZlbnQgKi8KLSNkZWZpbmUgSENJX1ZTRV9TVUJDT0RFX0JMRV9UUkFDS0lOR19TVUJfRVZUIDB4NTYgLyogVHJhY2tpbmcgZXZlbnQgKi8KLQotLyogZGVidWcgaW5mbyBzdWIgZXZlbnQgKi8KLSNkZWZpbmUgSENJX1ZTRV9TVUJDT0RFX0RFQlVHX0lORk9fU1VCX0VWVCAweDU3Ci0KLS8qIEJsdWV0b290aCBRdWFsaXR5IFJlcG9ydCBzdWIgZXZlbnQgKi8KLSNkZWZpbmUgSENJX1ZTRV9TVUJDT0RFX0JRUl9TVUJfRVZUIDB4NTgKLQotLyogTEUgU3VwcG9ydGVkIFN0YXRlcyAqLwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19OT05fQ09OTl9BRFZfQklUID0gMDsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfQklUID0gMTsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfQklUID0gMjsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX0JJVCA9IDM7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX1BBU1NfU0NBTl9CSVQgPSA0OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19BQ1RJVkVfU0NBTl9CSVQgPSA1OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19JTklUX0JJVCA9IDY7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX1BFUklQSEVSQUxfQklUID0gNzsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfTk9OX0NPTk5fQURWX1BBU1NfU0NBTl9CSVQgPSA4OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19TQ0FOX0FEVl9QQVNTX1NDQU5fQklUID0gOTsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfUEFTU19TQ0FOX0JJVCA9IDEwOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfUEFTU19TQ0FOX0JJVCA9IDExOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19OT05fQ09OTl9BRFZfQUNUSVZFX1NDQU5fQklUID0gMTI7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX1NDQU5fQURWX0FDVElWRV9TQ0FOX0JJVCA9IDEzOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19DT05OX0FEVl9BQ1RJVkVfU0NBTl9CSVQgPSAxNDsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX0FDVElWRV9TQ0FOX0JJVCA9IDE1OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19OT05fQ09OTl9JTklUX0JJVCA9IDE2OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19TQ0FOX0FEVl9JTklUX0JJVCA9IDE3OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19OT05fQ09OTl9BRFZfQ0VOVFJBTF9CSVQgPSAxODsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfU0NBTl9BRFZfQ0VOVFJBTF9CSVQgPSAxOTsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfTk9OX0NPTk5fQURWX1BFUklQSEVSQUxfQklUID0gMjA7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX1NDQU5fQURWX1BFUklQSEVSQUxfQklUID0gMjE7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX1BBU1NfU0NBTl9JTklUX0JJVCA9IDIyOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19BQ1RJVkVfU0NBTl9JTklUX0JJVCA9IDIzOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19QQVNTX1NDQU5fQ0VOVFJBTF9CSVQgPSAyNDsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfQUNUSVZFX1NDQU5fQ0VOVFJBTF9CSVQgPSAyNTsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfUEFTU19TQ0FOX1BFUklQSEVSQUxfQklUID0gMjY7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX0FDVElWRV9TQ0FOX1BFUklQSEVSQUxfQklUID0gMjc7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX0lOSVRfQ0VOVFJBTF9CSVQgPSAyODsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfTE9XX0RVVFlfRElSX0FEVl9CSVQgPSAyOTsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfTE9fRFVUWV9ESVJfQURWX1BBU1NfU0NBTl9CSVQgPSAzMDsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfTE9fRFVUWV9ESVJfQURWX0FDVElWRV9TQ0FOX0JJVCA9IDMxOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19DT05OX0FEVl9JTklUX0JJVCA9IDMyOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19ISV9EVVRZX0RJUl9BRFZfSU5JVF9CSVQgPSAzMzsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfTE9fRFVUWV9ESVJfQURWX0lOSVRfQklUID0gMzQ7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX0NPTk5fQURWX0NFTlRSQUxfQklUID0gMzU7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX0hJX0RVVFlfRElSX0FEVl9DRU5UUkFMX0JJVCA9IDM2OwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19MT19EVVRZX0RJUl9BRFZfQ0VOVFJBTF9CSVQgPSAzNzsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfQ09OTl9BRFZfUEVSSVBIRVJBTF9CSVQgPSAzODsKLWNvbnN0ZXhwciB1aW50OF90IEhDSV9MRV9TVEFURVNfSElfRFVUWV9ESVJfQURWX1BFUklQSEVSQUxfQklUID0gMzk7Ci1jb25zdGV4cHIgdWludDhfdCBIQ0lfTEVfU1RBVEVTX0xPX0RVVFlfRElSX0FEVl9QRVJJUEhFUkFMX0JJVCA9IDQwOwotY29uc3RleHByIHVpbnQ4X3QgSENJX0xFX1NUQVRFU19JTklUX0NFTlRSQUxfUEVSSVBIRVJBTF9CSVQgPSA0MTsKLQotLyoKLSAqICBEZWZpbml0aW9ucyBmb3IgSENJIEV2ZW50cwotKi8KLSNkZWZpbmUgSENJX0lOUVVJUllfQ09NUF9FVlQgMHgwMQotI2RlZmluZSBIQ0lfSU5RVUlSWV9SRVNVTFRfRVZUIDB4MDIKLSNkZWZpbmUgSENJX0NPTk5FQ1RJT05fQ09NUF9FVlQgMHgwMwotI2RlZmluZSBIQ0lfQ09OTkVDVElPTl9SRVFVRVNUX0VWVCAweDA0Ci0jZGVmaW5lIEhDSV9ESVNDT05ORUNUSU9OX0NPTVBfRVZUIDB4MDUKLSNkZWZpbmUgSENJX0FVVEhFTlRJQ0FUSU9OX0NPTVBfRVZUIDB4MDYKLSNkZWZpbmUgSENJX1JNVF9OQU1FX1JFUVVFU1RfQ09NUF9FVlQgMHgwNwotI2RlZmluZSBIQ0lfRU5DUllQVElPTl9DSEFOR0VfRVZUIDB4MDgKLSNkZWZpbmUgSENJX0NIQU5HRV9DT05OX0xJTktfS0VZX0VWVCAweDA5Ci0jZGVmaW5lIEhDSV9DRU5UUkFMX0xJTktfS0VZX0NPTVBfRVZUIDB4MEEKLSNkZWZpbmUgSENJX1JFQURfUk1UX0ZFQVRVUkVTX0NPTVBfRVZUIDB4MEIKLSNkZWZpbmUgSENJX1JFQURfUk1UX1ZFUlNJT05fQ09NUF9FVlQgMHgwQwotI2RlZmluZSBIQ0lfUU9TX1NFVFVQX0NPTVBfRVZUIDB4MEQKLSNkZWZpbmUgSENJX0NPTU1BTkRfQ09NUExFVEVfRVZUIDB4MEUKLSNkZWZpbmUgSENJX0NPTU1BTkRfU1RBVFVTX0VWVCAweDBGCi0jZGVmaW5lIEhDSV9IQVJEV0FSRV9FUlJPUl9FVlQgMHgxMAotI2RlZmluZSBIQ0lfRkxVU0hfT0NDVVJFRF9FVlQgMHgxMQotI2RlZmluZSBIQ0lfUk9MRV9DSEFOR0VfRVZUIDB4MTIKLSNkZWZpbmUgSENJX05VTV9DT01QTF9EQVRBX1BLVFNfRVZUIDB4MTMKLSNkZWZpbmUgSENJX01PREVfQ0hBTkdFX0VWVCAweDE0Ci0jZGVmaW5lIEhDSV9SRVRVUk5fTElOS19LRVlTX0VWVCAweDE1Ci0jZGVmaW5lIEhDSV9QSU5fQ09ERV9SRVFVRVNUX0VWVCAweDE2Ci0jZGVmaW5lIEhDSV9MSU5LX0tFWV9SRVFVRVNUX0VWVCAweDE3Ci0jZGVmaW5lIEhDSV9MSU5LX0tFWV9OT1RJRklDQVRJT05fRVZUIDB4MTgKLSNkZWZpbmUgSENJX0xPT1BCQUNLX0NPTU1BTkRfRVZUIDB4MTkKLSNkZWZpbmUgSENJX0RBVEFfQlVGX09WRVJGTE9XX0VWVCAweDFBCi0jZGVmaW5lIEhDSV9NQVhfU0xPVFNfQ0hBTkdFRF9FVlQgMHgxQgotI2RlZmluZSBIQ0lfUkVBRF9DTE9DS19PRkZfQ09NUF9FVlQgMHgxQwotI2RlZmluZSBIQ0lfQ09OTl9QS1RfVFlQRV9DSEFOR0VfRVZUIDB4MUQKLSNkZWZpbmUgSENJX1FPU19WSU9MQVRJT05fRVZUIDB4MUUKLSNkZWZpbmUgSENJX1BBR0VfU0NBTl9NT0RFX0NIQU5HRV9FVlQgMHgxRgotI2RlZmluZSBIQ0lfUEFHRV9TQ0FOX1JFUF9NT0RFX0NITkdfRVZUIDB4MjAKLSNkZWZpbmUgSENJX0ZMT1dfU1BFQ0lGSUNBVElPTl9DT01QX0VWVCAweDIxCi0jZGVmaW5lIEhDSV9JTlFVSVJZX1JTU0lfUkVTVUxUX0VWVCAweDIyCi0jZGVmaW5lIEhDSV9SRUFEX1JNVF9FWFRfRkVBVFVSRVNfQ09NUF9FVlQgMHgyMwotI2RlZmluZSBIQ0lfRVNDT19DT05ORUNUSU9OX0NPTVBfRVZUIDB4MkMKLSNkZWZpbmUgSENJX0VTQ09fQ09OTkVDVElPTl9DSEFOR0VEX0VWVCAweDJECi0jZGVmaW5lIEhDSV9TTklGRl9TVUJfUkFURV9FVlQgMHgyRQotI2RlZmluZSBIQ0lfRVhURU5ERURfSU5RVUlSWV9SRVNVTFRfRVZUIDB4MkYKLSNkZWZpbmUgSENJX0VOQ1JZUFRJT05fS0VZX1JFRlJFU0hfQ09NUF9FVlQgMHgzMAotI2RlZmluZSBIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX0VWVCAweDMxCi0jZGVmaW5lIEhDSV9JT19DQVBBQklMSVRZX1JFU1BPTlNFX0VWVCAweDMyCi0jZGVmaW5lIEhDSV9VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX0VWVCAweDMzCi0jZGVmaW5lIEhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVF9FVlQgMHgzNAotI2RlZmluZSBIQ0lfUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfRVZUIDB4MzUKLSNkZWZpbmUgSENJX1NJTVBMRV9QQUlSSU5HX0NPTVBMRVRFX0VWVCAweDM2Ci0jZGVmaW5lIEhDSV9MSU5LX1NVUEVSX1RPVVRfQ0hBTkdFRF9FVlQgMHgzOAotI2RlZmluZSBIQ0lfRU5IQU5DRURfRkxVU0hfQ09NUExFVEVfRVZUIDB4MzkKLSNkZWZpbmUgSENJX1VTRVJfUEFTU0tFWV9OT1RJRllfRVZUIDB4M0IKLSNkZWZpbmUgSENJX0tFWVBSRVNTX05PVElGWV9FVlQgMHgzQwotI2RlZmluZSBIQ0lfUk1UX0hPU1RfU1VQX0ZFQVRfTk9USUZZX0VWVCAweDNECi0KLS8qIFVMUCBIQ0kgRXZlbnQgKi8KLSNkZWZpbmUgSENJX0JMRV9FVkVOVCAweDNlCi0vKiBVTFAgRXZlbnQgc3ViIGNvZGUgKi8KLSNkZWZpbmUgSENJX0JMRV9DT05OX0NPTVBMRVRFX0VWVCAweDAxCi0jZGVmaW5lIEhDSV9CTEVfQURWX1BLVF9SUFRfRVZUIDB4MDIKLSNkZWZpbmUgSENJX0JMRV9MTF9DT05OX1BBUkFNX1VQRF9FVlQgMHgwMwotI2RlZmluZSBIQ0lfQkxFX1JFQURfUkVNT1RFX0ZFQVRfQ01QTF9FVlQgMHgwNAotI2RlZmluZSBIQ0lfQkxFX0xUS19SRVFfRVZUIDB4MDUKLSNkZWZpbmUgSENJX0JMRV9SQ19QQVJBTV9SRVFfRVZUIDB4MDYKLSNkZWZpbmUgSENJX0JMRV9EQVRBX0xFTkdUSF9DSEFOR0VfRVZUIDB4MDcKLSNkZWZpbmUgSENJX0JMRV9FTkhBTkNFRF9DT05OX0NPTVBMRVRFX0VWVCAweDBhCi0jZGVmaW5lIEhDSV9CTEVfRElSRUNUX0FEVl9FVlQgMHgwYgotI2RlZmluZSBIQ0lfQkxFX1BIWV9VUERBVEVfQ09NUExFVEVfRVZUIDB4MGMKLSNkZWZpbmUgSENJX0xFX0VYVEVOREVEX0FEVkVSVElTSU5HX1JFUE9SVF9FVlQgMHgwRAotI2RlZmluZSBIQ0lfQkxFX1BFUklPRElDX0FEVl9TWU5DX0VTVF9FVlQgICAgICAweDBFCi0jZGVmaW5lIEhDSV9CTEVfUEVSSU9ESUNfQURWX1JFUE9SVF9FVlQgICAgICAgIDB4MEYKLSNkZWZpbmUgSENJX0JMRV9QRVJJT0RJQ19BRFZfU1lOQ19MT1NUX0VWVCAgICAgMHgxMAotI2RlZmluZSBIQ0lfQkxFX1NDQU5fVElNRU9VVF9FVlQgICAgICAgICAgICAgICAweDExCi0jZGVmaW5lIEhDSV9MRV9BRFZFUlRJU0lOR19TRVRfVEVSTUlOQVRFRF9FVlQgMHgxMgotI2RlZmluZSBIQ0lfQkxFX1NDQU5fUkVRX1JYX0VWVCAgICAgICAgICAgICAgICAweDEzCi0jZGVmaW5lIEhDSV9CTEVfQ0lTX0VTVF9FVlQgMHgxOQotI2RlZmluZSBIQ0lfQkxFX0NJU19SRVFfRVZUIDB4MWEKLSNkZWZpbmUgSENJX0JMRV9DUkVBVEVfQklHX0NQTF9FVlQgMHgxYgotI2RlZmluZSBIQ0lfQkxFX1RFUk1fQklHX0NQTF9FVlQgMHgxYwotI2RlZmluZSBIQ0lfQkxFX0JJR19TWU5DX0VTVF9FVlQgMHgxZAotI2RlZmluZSBIQ0lfQkxFX0JJR19TWU5DX0xPU1RfRVZUIDB4MWUKLSNkZWZpbmUgSENJX0JMRV9SRVFfUEVFUl9TQ0FfQ1BMX0VWVCAweDFmCi0KLSNkZWZpbmUgSENJX1ZFTkRPUl9TUEVDSUZJQ19FVlQgMHhGRiAvKiBWZW5kb3Igc3BlY2lmaWMgZXZlbnRzICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgSENJIGVuYWJsZSBldmVudAotKi8KLSNkZWZpbmUgSENJX0lOUVVJUllfUkVTVUxUX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMDAwMDIpCi0jZGVmaW5lIEhDSV9DT05ORUNUSU9OX0NPTVBMRVRFX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMDAwMDQpCi0jZGVmaW5lIEhDSV9DT05ORUNUSU9OX1JFUVVFU1RfRVYocCkgKCooKHVpbnQzMl90KikocCkpICYgMHgwMDAwMDAwOCkKLSNkZWZpbmUgSENJX0RJU0NPTk5FQ1RJT05fQ09NUExFVEVfRVYocCkgKCooKHVpbnQzMl90KikocCkpICYgMHgwMDAwMDAxMCkKLSNkZWZpbmUgSENJX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMDAwMjApCi0jZGVmaW5lIEhDSV9STVRfTkFNRV9SRVFVRVNUX0NPTVBMX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMDAwNDApCi0jZGVmaW5lIEhDSV9DSEFOR0VfQ09OTl9FTkNSUFRfRU5BQkxFX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMDAwODApCi0jZGVmaW5lIEhDSV9DSEFOR0VfQ09OTl9MSU5LX0tFWV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMDAwMTAwKQotI2RlZmluZSBIQ0lfQ0VOVFJBTF9MSU5LX0tFWV9DT01QTEVURV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMDAwMjAwKQotI2RlZmluZSBIQ0lfUkVBRF9STVRfRkVBVFVSRVNfQ09NUExfRVYocCkgKCooKHVpbnQzMl90KikocCkpICYgMHgwMDAwMDQwMCkKLSNkZWZpbmUgSENJX1JFQURfUk1UX1ZFUlNJT05fQ09NUExfRVYocCkgKCooKHVpbnQzMl90KikocCkpICYgMHgwMDAwMDgwMCkKLSNkZWZpbmUgSENJX1FPU19TRVRVUF9DT01QTEVURV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMDAxMDAwKQotI2RlZmluZSBIQ0lfQ09NTUFORF9DT01QTEVURV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMDAyMDAwKQotI2RlZmluZSBIQ0lfQ09NTUFORF9TVEFUVVNfRVYocCkgKCooKHVpbnQzMl90KikocCkpICYgMHgwMDAwNDAwMCkKLSNkZWZpbmUgSENJX0hBUkRXQVJFX0VSUk9SX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMDgwMDApCi0jZGVmaW5lIEhDSV9GTEFTSF9PQ0NVUkVEX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwMTAwMDApCi0jZGVmaW5lIEhDSV9ST0xFX0NIQU5HRV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMDIwMDAwKQotI2RlZmluZSBIQ0lfTlVNX0NPTVBMRVRFRF9QS1RTX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDAwNDAwMDApCi0jZGVmaW5lIEhDSV9NT0RFX0NIQU5HRV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMDgwMDAwKQotI2RlZmluZSBIQ0lfUkVUVVJOX0xJTktfS0VZU19FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMTAwMDAwKQotI2RlZmluZSBIQ0lfUElOX0NPREVfUkVRVUVTVF9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwMjAwMDAwKQotI2RlZmluZSBIQ0lfTElOS19LRVlfUkVRVUVTVF9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAwNDAwMDAwKQotI2RlZmluZSBIQ0lfTElOS19LRVlfTk9USUZJQ0FUSU9OX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDA4MDAwMDApCi0jZGVmaW5lIEhDSV9MT09QQkFDS19DT01NQU5EX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MDEwMDAwMDApCi0jZGVmaW5lIEhDSV9EQVRBX0JVRl9PVkVSRkxPV19FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDAyMDAwMDAwKQotI2RlZmluZSBIQ0lfTUFYX1NMT1RTX0NIQU5HRV9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDA0MDAwMDAwKQotI2RlZmluZSBIQ0lfUkVBRF9DTE9DS19PRkZTRVRfQ09NUF9FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDA4MDAwMDAwKQotI2RlZmluZSBIQ0lfQ09OTl9QS1RfVFlQRV9DSEFOR0VEX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MTAwMDAwMDApCi0jZGVmaW5lIEhDSV9RT1NfVklPTEFUSU9OX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4MjAwMDAwMDApCi0jZGVmaW5lIEhDSV9QQUdFX1NDQU5fTU9ERV9DSEFOR0VEX0VWKHApICgqKCh1aW50MzJfdCopKHApKSAmIDB4NDAwMDAwMDApCi0jZGVmaW5lIEhDSV9QQUdFX1NDQU5fUkVQX01PREVfQ0hOR19FVihwKSAoKigodWludDMyX3QqKShwKSkgJiAweDgwMDAwMDAwKQotCi0vKiB0aGUgZXZlbnQgbWFzayBmb3IgMi4wICsgRURSIGFuZCBsYXRlciAoaW5jbHVkZXMgTGlzYm9uIGV2ZW50cykgKi8KLSNkZWZpbmUgSENJX0RVTU9fRVZFTlRfTUFTS19FWFQgXAotICB7IDB4M0QsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfQotLyogIDB4MDAwMDFGRkYgRkZGRkZGRkYgRGVmYXVsdCAtIG5vIExpc2JvbiBldmVudHMKLSAgICAweDAwMDAwODAwIDAwMDAwMDAwIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ29tcGxldGUgRXZlbnQKLSAgICAweDAwMDAxMDAwIDAwMDAwMDAwIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ2hhbmdlZCBFdmVudAotICAgIDB4MDAwMDIwMDAgMDAwMDAwMDAgU25pZmYgU3VicmF0ZSBFdmVudAotICAgIDB4MDAwMDQwMDAgMDAwMDAwMDAgRXh0ZW5kZWQgSW5xdWlyeSBSZXN1bHQgRXZlbnQKLSAgICAweDAwMDA4MDAwIDAwMDAwMDAwIEVuY3J5cHRpb24gS2V5IFJlZnJlc2ggQ29tcGxldGUgRXZlbnQKLSAgICAweDAwMDEwMDAwIDAwMDAwMDAwIElPIENhcGFiaWxpdHkgUmVxdWVzdCBFdmVudAotICAgIDB4MDAwMjAwMDAgMDAwMDAwMDAgSU8gQ2FwYWJpbGl0eSBSZXNwb25zZSBFdmVudAotICAgIDB4MDAwNDAwMDAgMDAwMDAwMDAgVXNlciBDb25maXJtYXRpb24gUmVxdWVzdCBFdmVudAotICAgIDB4MDAwODAwMDAgMDAwMDAwMDAgVXNlciBQYXNza2V5IFJlcXVlc3QgRXZlbnQKLSAgICAweDAwMTAwMDAwIDAwMDAwMDAwIFJlbW90ZSBPT0IgRGF0YSBSZXF1ZXN0IEV2ZW50Ci0gICAgMHgwMDIwMDAwMCAwMDAwMDAwMCBTaW1wbGUgUGFpcmluZyBDb21wbGV0ZSBFdmVudAotICAgIDB4MDA0MDAwMDAgMDAwMDAwMDAgR2VuZXJpYyBBTVAgTGluayBLZXkgTm90aWZpY2F0aW9uIEV2ZW50Ci0gICAgMHgwMDgwMDAwMCAwMDAwMDAwMCBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQgQ2hhbmdlZCBFdmVudAotICAgIDB4MDEwMDAwMDAgMDAwMDAwMDAgRW5oYW5jZWQgRmx1c2ggQ29tcGxldGUgRXZlbnQKLSAgICAweDA0MDAwMDAwIDAwMDAwMDAwIFVzZXIgUGFzc2tleSBOb3RpZmljYXRpb24gRXZlbnQKLSAgICAweDA4MDAwMDAwIDAwMDAwMDAwIEtleXByZXNzIE5vdGlmaWNhdGlvbiBFdmVudAotICAgIDB4MTAwMDAwMDAgMDAwMDAwMDAgUmVtb3RlIEhvc3QgU3VwcG9ydGVkIEZlYXR1cmVzIE5vdGlmaWNhdGlvbiBFdmVudAotICAgIDB4MjAwMDAwMDAgMDAwMDAwMDAgTEUgTWV0YSBFdmVudAotICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgcGFja2V0IHR5cGUgbWFza3MgKEJUMS4yIGFuZCBCVDIuMCBkZWZpbml0aW9ucykKLSovCi10eXBlZGVmIGVudW0gOiB1aW50MTZfdCB7Ci0gIEhDSV9QS1RfVFlQRVNfTUFTS19OT18yX0RIMSA9IDB4MDAwMiwKLSAgSENJX1BLVF9UWVBFU19NQVNLX05PXzNfREgxID0gMHgwMDA0LAotICBIQ0lfUEtUX1RZUEVTX01BU0tfRE0xID0gMHgwMDA4LAotICBIQ0lfUEtUX1RZUEVTX01BU0tfREgxID0gMHgwMDEwLAotICBIQ0lfUEtUX1RZUEVTX01BU0tfSFYxID0gMHgwMDIwLAotICBIQ0lfUEtUX1RZUEVTX01BU0tfSFYyID0gMHgwMDQwLAotICBIQ0lfUEtUX1RZUEVTX01BU0tfSFYzID0gMHgwMDgwLAotICBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fMl9ESDMgPSAweDAxMDAsCi0gIEhDSV9QS1RfVFlQRVNfTUFTS19OT18zX0RIMyA9IDB4MDIwMCwKLSAgSENJX1BLVF9UWVBFU19NQVNLX0RNMyA9IDB4MDQwMCwKLSAgSENJX1BLVF9UWVBFU19NQVNLX0RIMyA9IDB4MDgwMCwKLSAgSENJX1BLVF9UWVBFU19NQVNLX05PXzJfREg1ID0gMHgxMDAwLAotICBIQ0lfUEtUX1RZUEVTX01BU0tfTk9fM19ESDUgPSAweDIwMDAsCi0gIEhDSV9QS1RfVFlQRVNfTUFTS19ETTUgPSAweDQwMDAsCi0gIEhDSV9QS1RfVFlQRVNfTUFTS19ESDUgPSAweDgwMDAsCi19IHRIQ0lfUEtUX1RZUEVfQklUTUFTSzsKLQotLyoKLSAqIERlZmluZSBwYXJhbWV0ZXJzIHRvIGFsbG93IHJvbGUgc3dpdGNoIGR1cmluZyBjcmVhdGUgY29ubmVjdGlvbgotKi8KLSNkZWZpbmUgSENJX0NSX0NPTk5fTk9UX0FMTE9XX1NXSVRDSCAweDAwCi0jZGVmaW5lIEhDSV9DUl9DT05OX0FMTE9XX1NXSVRDSCAweDAxCi0KLS8qIFBhZ2Ugc2NhbiBwZXJpb2QgbW9kZXMgKi8KLSNkZWZpbmUgSENJX1BBR0VfU0NBTl9SRVBfTU9ERV9SMSAweDAxCi0KLS8qIFBhZ2Ugc2NhbiBtb2RlcyAqLwotI2RlZmluZSBIQ0lfTUFOREFUQVJZX1BBR0VfU0NBTl9NT0RFIDB4MDAKLQotLyogUGFnZSBhbmQgaW5xdWlyeSBzY2FuIHR5cGVzICovCi0jZGVmaW5lIEhDSV9TQ0FOX1RZUEVfU1RBTkRBUkQgMHgwMAotI2RlZmluZSBIQ0lfREVGX1NDQU5fVFlQRSBIQ0lfU0NBTl9UWVBFX1NUQU5EQVJECi0KLS8qIERlZmluaXRpb25zIGZvciBFeHRlbmRlZCBJbnF1aXJ5IFJlc3BvbnNlICovCi0jZGVmaW5lIEhDSV9FWFRfSU5RX1JFU1BPTlNFX0xFTiAyNDAKLSNkZWZpbmUgSENJX0VJUl9GTEFHU19UWVBFIDB4MDEKLSNkZWZpbmUgSENJX0VJUl9NT1JFXzE2QklUU19VVUlEX1RZUEUgMHgwMgotI2RlZmluZSBIQ0lfRUlSX0NPTVBMRVRFXzE2QklUU19VVUlEX1RZUEUgMHgwMwotI2RlZmluZSBIQ0lfRUlSX01PUkVfMzJCSVRTX1VVSURfVFlQRSAweDA0Ci0jZGVmaW5lIEhDSV9FSVJfQ09NUExFVEVfMzJCSVRTX1VVSURfVFlQRSAweDA1Ci0jZGVmaW5lIEhDSV9FSVJfTU9SRV8xMjhCSVRTX1VVSURfVFlQRSAweDA2Ci0jZGVmaW5lIEhDSV9FSVJfQ09NUExFVEVfMTI4QklUU19VVUlEX1RZUEUgMHgwNwotI2RlZmluZSBIQ0lfRUlSX1NIT1JURU5FRF9MT0NBTF9OQU1FX1RZUEUgMHgwOAotI2RlZmluZSBIQ0lfRUlSX0NPTVBMRVRFX0xPQ0FMX05BTUVfVFlQRSAweDA5Ci0jZGVmaW5lIEhDSV9FSVJfVFhfUE9XRVJfTEVWRUxfVFlQRSAweDBBCi0jZGVmaW5lIEhDSV9FSVJfTUFOVUZBQ1RVUkVSX1NQRUNJRklDX1RZUEUgMHhGRgotI2RlZmluZSBIQ0lfRUlSX1NFUlZJQ0VfREFUQV9UWVBFIDB4MTYKLSNkZWZpbmUgSENJX0VJUl9TRVJWSUNFX0RBVEFfMTZCSVRTX1VVSURfVFlQRSAweDE2Ci0jZGVmaW5lIEhDSV9FSVJfU0VSVklDRV9EQVRBXzMyQklUU19VVUlEX1RZUEUgMHgyMAotI2RlZmluZSBIQ0lfRUlSX1NFUlZJQ0VfREFUQV8xMjhCSVRTX1VVSURfVFlQRSAweDIxCi0jZGVmaW5lIEhDSV9FSVJfT09CX0JEX0FERFJfVFlQRSAweDBDCi0jZGVmaW5lIEhDSV9FSVJfT09CX0NPRF9UWVBFIDB4MEQKLSNkZWZpbmUgSENJX0VJUl9PT0JfU1NQX0hBU0hfQ19UWVBFIDB4MEUKLSNkZWZpbmUgSENJX0VJUl9PT0JfU1NQX1JBTkRfUl9UWVBFIDB4MEYKLSNkZWZpbmUgSENJX0VJUl9SU0lfVFlQRSAweDJFCi0KLS8qIERlZmluaXRpb25zIGZvciBXcml0ZSBTaW1wbGUgUGFpcmluZyBNb2RlICovCi0jZGVmaW5lIEhDSV9TUF9NT0RFX0VOQUJMRUQgMHgwMQotCi0vKiBEZWZpbml0aW9ucyBmb3IgV3JpdGUgU2VjdXJlIENvbm5lY3Rpb25zIEhvc3QgU3VwcG9ydCAqLwotI2RlZmluZSBIQ0lfU0NfTU9ERV9FTkFCTEVEIDB4MDEKLQotLyogRmlsdGVycyB0aGF0IGFyZSBzZW50IGluIHNldCBmaWx0ZXIgY29tbWFuZCAqLwotI2RlZmluZSBIQ0lfRklMVEVSX0NPTk5FQ1RJT05fU0VUVVAgMHgwMgotCi0jZGVmaW5lIEhDSV9GSUxURVJfQ09ORF9ORVdfREVWSUNFIDB4MDAKLSNkZWZpbmUgSENJX0ZJTFRFUl9DT05EX0RFVklDRV9DTEFTUyAweDAxCi0jZGVmaW5lIEhDSV9GSUxURVJfQ09ORF9CRF9BRERSIDB4MDIKLQotLyogcm9sZSBzd2l0Y2ggZGlzYWJsZWQgKi8KLSNkZWZpbmUgSENJX0RPX0FVVE9fQUNDRVBUX0NPTk5FQ1QgMgotCi0vKiBQSU4gdHlwZSAqLwotI2RlZmluZSBIQ0lfUElOX1RZUEVfRklYRUQgMQotCi0vKiBTY2FuIGVuYWJsZSBmbGFncyAqLwotI2RlZmluZSBIQ0lfSU5RVUlSWV9TQ0FOX0VOQUJMRUQgMHgwMQotI2RlZmluZSBIQ0lfUEFHRV9TQ0FOX0VOQUJMRUQgMHgwMgotCi0vKiBQYWdlc2NhbiB0aW1lciBkZWZpbml0aW9ucyBpbiAwLjYyNSBtcyAqLwotI2RlZmluZSBIQ0lfREVGX1BBR0VTQ0FOX0lOVEVSVkFMIDB4MDgwMCAvKiAxLjI4IHNlYyAqLwotCi0vKiBQYXJhbWV0ZXIgZm9yIHBhZ2VzY2FuIHdpbmRvdyBpcyBwYXNzZWQgdG8gTEMgYW5kIGlzIGtlcHQgaW4gc2xvdHMgKi8KLSNkZWZpbmUgSENJX0RFRl9QQUdFU0NBTl9XSU5ET1cgMHgxMiAgIC8qIDExLjI1IG1zICAqLwotCi0vKiBJbnF1aXJ5c2NhbiB0aW1lciBkZWZpbml0aW9ucyBpbiAwLjYyNSBtcyAqLwotI2RlZmluZSBIQ0lfREVGX0lOUVVJUllTQ0FOX0lOVEVSVkFMIDB4MTAwMCAvKiAyLjU2IHNlYyAqLwotCi0vKiBQYXJhbWV0ZXIgZm9yIGlucXVpcnlzY2FuIHdpbmRvdyBpcyBwYXNzZWQgdG8gTEMgYW5kIGlzIGtlcHQgaW4gc2xvdHMgKi8KLSNkZWZpbmUgSENJX0RFRl9JTlFVSVJZU0NBTl9XSU5ET1cgMHgxMiAgIC8qIDExLjI1IG1zICovCi0KLS8qIEVuY3J5cHRpb24gbW9kZXMgKi8KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBIQ0lfRU5DUllQVF9NT0RFX0RJU0FCTEVEID0gMHgwMCwKLSAgSENJX0VOQ1JZUFRfTU9ERV9PTiA9IDB4MDEsCi0gIEhDSV9FTkNSWVBUX01PREVfT05fQlJfRURSX0FFU19DQ00gPSAweDAyLAotfSB0SENJX0VOQ1JZUFRfTU9ERTsKLQotLyogVm9pY2Ugc2V0dGluZ3MgKi8KLSNkZWZpbmUgSENJX0lOUF9DT0RJTkdfTElORUFSIDB4MDAwMCAvKiAwMDAwMDAwMDAwICovCi0jZGVmaW5lIEhDSV9JTlBfQ09ESU5HX1VfTEFXIDB4MDEwMCAgLyogMDEwMDAwMDAwMCAqLwotI2RlZmluZSBIQ0lfSU5QX0NPRElOR19BX0xBVyAweDAyMDAgIC8qIDEwMDAwMDAwMDAgKi8KLQotI2RlZmluZSBIQ0lfSU5QX0RBVEFfRk1UXzJTX0NPTVBMRU1FTlQgMHgwMDQwICAvKiAwMDAxMDAwMDAwICovCi0jZGVmaW5lIEhDSV9JTlBfREFUQV9GTVRfU0lHTl9NQUdOSVRVREUgMHgwMDgwIC8qIDAwMTAwMDAwMDAgKi8KLSNkZWZpbmUgSENJX0lOUF9EQVRBX0ZNVF9VTlNJR05FRCAweDAwYzAgICAgICAgLyogMDAxMTAwMDAwMCAqLwotCi0jZGVmaW5lIEhDSV9JTlBfU0FNUExFX1NJWkVfOEJJVCAweDAwMDAgIC8qIDAwMDAwMDAwMDAgKi8KLSNkZWZpbmUgSENJX0lOUF9TQU1QTEVfU0laRV8xNkJJVCAweDAwMjAgLyogMDAwMDEwMDAwMCAqLwotCi0jZGVmaW5lIEhDSV9JTlBfTElORUFSX1BDTV9CSVRfUE9TX09GRlMgMgotCi0jZGVmaW5lIEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9DVlNEIDB4MDAwMCAgICAgLyogMDAwMDAwMDAwMCAqLwotI2RlZmluZSBIQ0lfQUlSX0NPRElOR19GT1JNQVRfVV9MQVcgMHgwMDAxICAgIC8qIDAwMDAwMDAwMDEgKi8KLSNkZWZpbmUgSENJX0FJUl9DT0RJTkdfRk9STUFUX0FfTEFXIDB4MDAwMiAgICAvKiAwMDAwMDAwMDEwICovCi0jZGVmaW5lIEhDSV9BSVJfQ09ESU5HX0ZPUk1BVF9UUkFOU1BOVCAweDAwMDMgLyogMDAwMDAwMDAxMSAqLwotI2RlZmluZSBIQ0lfQUlSX0NPRElOR19GT1JNQVRfTUFTSyAweDAwMDMgICAgIC8qIDAwMDAwMDAwMTEgKi8KLQotLyogZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAxMTAwMDAwICovCi0jZGVmaW5lIEhDSV9ERUZBVUxUX1ZPSUNFX1NFVFRJTkdTICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChIQ0lfSU5QX0NPRElOR19MSU5FQVIgfCBIQ0lfSU5QX0RBVEFfRk1UXzJTX0NPTVBMRU1FTlQgfCBcCi0gICBIQ0lfSU5QX1NBTVBMRV9TSVpFXzE2QklUIHwgSENJX0FJUl9DT0RJTkdfRk9STUFUX0NWU0QpCi0KLS8qIFJldHJhbnNtaXQgdGltZXIgZGVmaW5pdGlvbnMgaW4gMC42MjUgKi8KLSNkZWZpbmUgSENJX01BWF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVCAweDA3RkYKLQotLyogRGVmYXVsdCBMaW5rIFN1cGVydmlzaW9uIHRpbWVvb3V0ICovCi0jZGVmaW5lIEhDSV9ERUZBVUxUX0lOQUNUX1RPVVQgMHg3RDAwICAgICAvKiBCUi9FRFIgKDIwIHNlY29uZHMpICovCi0KLS8qIFJlYWQgdHJhbnNtaXQgcG93ZXIgbGV2ZWwgcGFyYW1ldGVyICovCi0jZGVmaW5lIEhDSV9SRUFEX0NVUlJFTlQgMHgwMAotCi0vKiBMaW5rIHR5cGVzIGZvciBjb25uZWN0aW9uIGNvbXBsZXRlIGV2ZW50ICovCi0jZGVmaW5lIEhDSV9MSU5LX1RZUEVfU0NPIDB4MDAKLSNkZWZpbmUgSENJX0xJTktfVFlQRV9BQ0wgMHgwMQotI2RlZmluZSBIQ0lfTElOS19UWVBFX0VTQ08gMHgwMgotCi0vKiBMaW5rIEtleSBOb3RpZmljYXRpb24gRXZlbnQgKEtleSBUeXBlKSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBIQ0lfTEtFWV9UWVBFX0NPTUJJTkFUSU9OIDB4MDAKLSNkZWZpbmUgSENJX0xLRVlfVFlQRV9SRU1PVEVfVU5JVCAweDAyCi0jZGVmaW5lIEhDSV9MS0VZX1RZUEVfREVCVUdfQ09NQiAweDAzCi0jZGVmaW5lIEhDSV9MS0VZX1RZUEVfVU5BVVRIX0NPTUIgMHgwNAotI2RlZmluZSBIQ0lfTEtFWV9UWVBFX0FVVEhfQ09NQiAweDA1Ci0jZGVmaW5lIEhDSV9MS0VZX1RZUEVfQ0hBTkdFRF9DT01CIDB4MDYKLSNkZWZpbmUgSENJX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NiAweDA3Ci0jZGVmaW5lIEhDSV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2IDB4MDgKLQotLyogRGVmaW5lIGFuIGludmFsaWQgdmFsdWUgZm9yIGEgaGFuZGxlICovCi0jZGVmaW5lIEhDSV9JTlZBTElEX0hBTkRMRSAweEZGRkYKLQotLyogRGVmaW5lIHRoZSBwcmVhbWJsZSBsZW5ndGggZm9yIGFsbCBIQ0kgQ29tbWFuZHMuCi0gKiBUaGlzIGlzIDItYnl0ZXMgZm9yIG9wY29kZSBhbmQgMSBieXRlIGZvciBsZW5ndGgKLSovCi0jZGVmaW5lIEhDSUNfUFJFQU1CTEVfU0laRSAzCi0KLS8qIERlZmluZSB0aGUgcHJlYW1ibGUgbGVuZ3RoIGZvciBhbGwgSENJIEV2ZW50cwotICogVGhpcyBpcyAxLWJ5dGUgZm9yIG9wY29kZSBhbmQgMSBieXRlIGZvciBsZW5ndGgKLSovCi0jZGVmaW5lIEhDSUVfUFJFQU1CTEVfU0laRSAyCi0KLS8vIFBhY2tldCBib3VuZGFyeSBmbGFncwotY29uc3RleHByIHVpbnQ4X3Qga0ZJUlNUX05PTl9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRSA9IDB4MDsKLWNvbnN0ZXhwciB1aW50OF90IGtDT05USU5VSU5HX0ZSQUdNRU5UID0gMHgxOwotY29uc3RleHByIHVpbnQ4X3Qga0hDSV9GSVJTVF9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRSA9IDB4MjsKLQotc3RydWN0IEhjaURhdGFQcmVhbWJsZUJpdHMgewotICB1aW50MTZfdCBoYW5kbGUgOiAxMjsKLSAgdWludDE2X3QgYm91bmRhcnkgOiAyOwotICB1aW50MTZfdCBicm9hZGNhc3QgOiAxOwotICB1aW50MTZfdCB1bnVzZWQxNSA6IDE7Ci0gIHVpbnQxNl90IGxlbmd0aDsKLX07Ci1zdHJ1Y3QgSGNpRGF0YVByZWFtYmxlUmF3IHsKLSAgdWludDE2X3Qgd29yZDA7Ci0gIHVpbnQxNl90IHdvcmQxOwotfTsKLXVuaW9uIEhjaURhdGFQcmVhbWJsZSB7Ci0gIEhjaURhdGFQcmVhbWJsZUJpdHMgYml0czsKLSAgSGNpRGF0YVByZWFtYmxlUmF3IHJhdzsKLSAgdm9pZCBTZXJpYWxpemUodWludDhfdCogZGF0YSkgewotICAgICpkYXRhKysgPSAoKHJhdy53b3JkMCkgJiAweGZmKTsKLSAgICAqZGF0YSsrID0gKCgocmF3LndvcmQwKSA+PiA4KSAmIDB4ZmYpOwotICAgICpkYXRhKysgPSAoKHJhdy53b3JkMSkgJiAweGZmKTsKLSAgICAqZGF0YSsrID0gKCgocmF3LndvcmQxID4+IDgpKSAmIDB4ZmYpOwotICB9Ci0gIGJvb2wgSXNGbHVzaGFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJpdHMuYm91bmRhcnkgPT0ga0hDSV9GSVJTVF9BVVRPTUFUSUNBTExZX0ZMVVNIQUJMRTsKLSAgfQotICB2b2lkIFNldEZsdXNoYWJsZSgpIHsgYml0cy5ib3VuZGFyeSA9IGtIQ0lfRklSU1RfQVVUT01BVElDQUxMWV9GTFVTSEFCTEU7IH0KLX07Ci0jZGVmaW5lIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgc2l6ZW9mKEhjaURhdGFQcmVhbWJsZSkKLXN0YXRpY19hc3NlcnQoSENJX0RBVEFfUFJFQU1CTEVfU0laRSA9PSA0KTsKLXN0YXRpY19hc3NlcnQoc2l6ZW9mKEhjaURhdGFQcmVhbWJsZVJhdykgPT0gc2l6ZW9mKEhjaURhdGFQcmVhbWJsZUJpdHMpKTsKLQotLyogbG9jYWwgQmx1ZXRvb3RoIGNvbnRyb2xsZXIgaWQgZm9yIEFNUCBIQ0kgKi8KLSNkZWZpbmUgTE9DQUxfQlJfRURSX0NPTlRST0xMRVJfSUQgMAotCi0vKiBEZWZpbmUgdGhlIGV4dGVuZGVkIGZsb3cgc3BlY2lmaWNhdGlvbiBmaWVsZHMgdXNlZCBieSBBTVAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBpZDsKLSAgdWludDhfdCBzdHlwZTsKLSAgdWludDE2X3QgbWF4X3NkdV9zaXplOwotICB1aW50MzJfdCBzZHVfaW50ZXJfdGltZTsKLSAgdWludDMyX3QgYWNjZXNzX2xhdGVuY3k7Ci0gIHVpbnQzMl90IGZsdXNoX3RpbWVvdXQ7Ci19IHRIQ0lfRVhUX0ZMT1dfU1BFQzsKLQotLyogUGFyYW1ldGVyIGluZm9ybWF0aW9uIGZvciBIQ0lfQlJDTV9TRVRfQUNMX1BSSU9SSVRZICovCi0jZGVmaW5lIEhDSV9CUkNNX0FDTF9QUklPUklUWV9QQVJBTV9TSVpFIDMKLSNkZWZpbmUgSENJX0JSQ01fQUNMX1BSSU9SSVRZX0xPVyAweDAwCi0jZGVmaW5lIEhDSV9CUkNNX0FDTF9QUklPUklUWV9ISUdIIDB4RkYKLSNkZWZpbmUgSENJX0JSQ01fU0VUX0FDTF9QUklPUklUWSAoMHgwMDU3IHwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0KLSNkZWZpbmUgTE1QX0NPTVBJRF9HT09HTEUgMHhFMAotCi0vLyBUT0RPKHphY2hvdmVyZmxvdyk6IHJlbW92ZSB0aGlzIG9uY2UgYnJvYWRjb20gc3BlY2lmaWMgaGFja3MgYXJlIHJlbW92ZWQKLSNkZWZpbmUgTE1QX0NPTVBJRF9CUk9BRENPTSAxNQotCi0vKgotICogRGVmaW5lIHBhY2tldCBzaXplCi0qLwotI2RlZmluZSBIQ0lfRE0xX1BBQ0tFVF9TSVpFIDE3Ci0jZGVmaW5lIEhDSV9ESDFfUEFDS0VUX1NJWkUgMjcKLSNkZWZpbmUgSENJX0RNM19QQUNLRVRfU0laRSAxMjEKLSNkZWZpbmUgSENJX0RIM19QQUNLRVRfU0laRSAxODMKLSNkZWZpbmUgSENJX0RNNV9QQUNLRVRfU0laRSAyMjQKLSNkZWZpbmUgSENJX0RINV9QQUNLRVRfU0laRSAzMzkKLSNkZWZpbmUgSENJX0FVWDFfUEFDS0VUX1NJWkUgMjkKLSNkZWZpbmUgSENJX0hWMV9QQUNLRVRfU0laRSAxMAotI2RlZmluZSBIQ0lfSFYyX1BBQ0tFVF9TSVpFIDIwCi0jZGVmaW5lIEhDSV9IVjNfUEFDS0VUX1NJWkUgMzAKLSNkZWZpbmUgSENJX0RWX1BBQ0tFVF9TSVpFIDkKLSNkZWZpbmUgSENJX0VEUjJfREgxX1BBQ0tFVF9TSVpFIDU0Ci0jZGVmaW5lIEhDSV9FRFIyX0RIM19QQUNLRVRfU0laRSAzNjcKLSNkZWZpbmUgSENJX0VEUjJfREg1X1BBQ0tFVF9TSVpFIDY3OQotI2RlZmluZSBIQ0lfRURSM19ESDFfUEFDS0VUX1NJWkUgODMKLSNkZWZpbmUgSENJX0VEUjNfREgzX1BBQ0tFVF9TSVpFIDU1MgotI2RlZmluZSBIQ0lfRURSM19ESDVfUEFDS0VUX1NJWkUgMTAyMQotCi0vKiBGZWF0dXJlIFBhZ2VzICovCi0jZGVmaW5lIEhDSV9FWFRfRkVBVFVSRVNfUEFHRV9NQVggMyAgLy8gUGFyc2UgZmVhdHVyZSBwYWdlcyAwLTMKLQotI2RlZmluZSBIQ0lfRkVBVFVSRV9CWVRFU19QRVJfUEFHRSA4Ci0KLSNkZWZpbmUgSENJX0VYVF9GRUFUVVJFU19TVUNDRVNTX0VWVF9MRU4gMTMKLQotLyogTE1QIGZlYXR1cmVzIGVuY29kaW5nIC0gcGFnZSAwICovCi0jZGVmaW5lIEhDSV8zX1NMT1RfUEFDS0VUU19TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDEpCi0jZGVmaW5lIEhDSV81X1NMT1RfUEFDS0VUU19TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9FTkNSWVBUSU9OX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwNCkKLSNkZWZpbmUgSENJX1NMT1RfT0ZGU0VUX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwOCkKLSNkZWZpbmUgSENJX1RJTUlOR19BQ0NfU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDEwKQotI2RlZmluZSBIQ0lfU1dJVENIX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgyMCkKLSNkZWZpbmUgSENJX0hPTERfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4NDApCi0jZGVmaW5lIEhDSV9TTklGRl9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfUEFSS19NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgwMSkKLSNkZWZpbmUgSENJX1JTU0lfU1VQUE9SVEVEKHgpICgoeClbMV0gJiAweDAyKQotI2RlZmluZSBIQ0lfQ1FNX0RBVEFfUkFURV9TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9TQ09fTElOS19TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9IVjJfUEFDS0VUU19TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4MTApCi0jZGVmaW5lIEhDSV9IVjNfUEFDS0VUU19TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4MjApCi0jZGVmaW5lIEhDSV9MTVBfVV9MQVdfU1VQUE9SVEVEKHgpICgoeClbMV0gJiAweDQwKQotI2RlZmluZSBIQ0lfTE1QX0FfTEFXX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfTE1QX0NWU0RfU1VQUE9SVEVEKHgpICgoeClbMl0gJiAweDAxKQotI2RlZmluZSBIQ0lfUEFHSU5HX1NDSEVNRV9TVVBQT1JURUQoeCkgKCh4KVsyXSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9QT1dFUl9DVFJMX1NVUFBPUlRFRCh4KSAoKHgpWzJdICYgMHgwNCkKLSNkZWZpbmUgSENJX0xNUF9UUkFOU1BOVF9TVVBQT1JURUQoeCkgKCh4KVsyXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9GTE9XX0NUUkxfTEFHX1ZBTFVFKHgpICgoKHgpWzJdICYgMHg3MCkgPj4gNCkKLSNkZWZpbmUgSENJX0xNUF9CQ0FTVF9FTkNfU1VQUE9SVEVEKHgpICgoeClbMl0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9MTVBfU0NBVFRFUl9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzNdICYgMHgwMSkKLSNkZWZpbmUgSENJX0VEUl9BQ0xfMk1QU19TVVBQT1JURUQoeCkgKCh4KVszXSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9FRFJfQUNMXzNNUFNfU1VQUE9SVEVEKHgpICgoeClbM10gJiAweDA0KQotI2RlZmluZSBIQ0lfRU5IQU5DRURfSU5RX1NVUFBPUlRFRCh4KSAoKHgpWzNdICYgMHgwOCkKLSNkZWZpbmUgSENJX0xNUF9JTlRFUkxBQ0VEX0lOUV9TQ0FOX1NVUFBPUlRFRCh4KSAoKHgpWzNdICYgMHgxMCkKLSNkZWZpbmUgSENJX0xNUF9JTlRFUkxBQ0VEX1BBR0VfU0NBTl9TVVBQT1JURUQoeCkgKCh4KVszXSAmIDB4MjApCi0jZGVmaW5lIEhDSV9MTVBfSU5RX1JTU0lfU1VQUE9SVEVEKHgpICgoeClbM10gJiAweDQwKQotI2RlZmluZSBIQ0lfRVNDT19FVjNfU1VQUE9SVEVEKHgpICgoeClbM10gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9FU0NPX0VWNF9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9FU0NPX0VWNV9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9MTVBfQUJTRU5DRV9NQVNLU19TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9MTVBfQUZIX0NBUF9QRVJJUEhFUkFMX1NVUFBPUlRFRCh4KSAoKHgpWzRdICYgMHgwOCkKLSNkZWZpbmUgSENJX0xNUF9BRkhfQ0xBU1NfUEVSSVBIRVJBTF9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4MTApCi0jZGVmaW5lIEhDSV9CUkVEUl9OT1RfU1BUX1NVUFBPUlRFRCh4KSAoKHgpWzRdICYgMHgyMCkKLSNkZWZpbmUgSENJX0xFX1NQVF9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4NDApCi0jZGVmaW5lIEhDSV8zX1NMT1RfRURSX0FDTF9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4ODApCi0KLSNkZWZpbmUgSENJXzVfU0xPVF9FRFJfQUNMX1NVUFBPUlRFRCh4KSAoKHgpWzVdICYgMHgwMSkKLSNkZWZpbmUgSENJX1NOSUZGX1NVQl9SQVRFX1NVUFBPUlRFRCh4KSAoc3RhdGljX2Nhc3Q8Ym9vbD4oKHgpWzVdICYgMHgwMikpCi0jZGVmaW5lIEhDSV9BVE9NSUNfRU5DUllQVF9TVVBQT1JURUQoeCkgKCh4KVs1XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9MTVBfQUZIX0NBUF9NQVNUUl9TVVBQT1JURUQoeCkgKCh4KVs1XSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9MTVBfQUZIX0NMQVNTX01BU1RSX1NVUFBPUlRFRCh4KSAoKHgpWzVdICYgMHgxMCkKLSNkZWZpbmUgSENJX0VEUl9FU0NPXzJNUFNfU1VQUE9SVEVEKHgpICgoeClbNV0gJiAweDIwKQotI2RlZmluZSBIQ0lfRURSX0VTQ09fM01QU19TVVBQT1JURUQoeCkgKCh4KVs1XSAmIDB4NDApCi0jZGVmaW5lIEhDSV8zX1NMT1RfRURSX0VTQ09fU1VQUE9SVEVEKHgpICgoeClbNV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9FWFRfSU5RX1JTUF9TVVBQT1JURUQoeCkgKCh4KVs2XSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9TSU1VTF9MRV9CUkVEUl9TVVBQT1JURUQoeCkgKCh4KVs2XSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9BTlVNX1BJTl9DQVBfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDA0KQotI2RlZmluZSBIQ0lfU0lNUExFX1BBSVJJTkdfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDA4KQotI2RlZmluZSBIQ0lfRU5DQVBfUERVX1NVUFBPUlRFRCh4KSAoKHgpWzZdICYgMHgxMCkKLSNkZWZpbmUgSENJX0VSUk9SX0RBVEFfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDIwKQotLyogVGhpcyBmZWF0dXJlIGlzIGNhdXNpbmcgZnJlcXVlbnQgbGluayBkcm9wcyB3aGVuIGRvaW5nIGNhbGwgc3dpdGNoIHdpdGgKLSAqIGNlcnRhaW4gYXYvaGZwIGhlYWRzZXRzICovCi0vLyBUT0RPOiBtb3ZlIHRoZSBkaXNhYmxpbmcgc29tZXdoZXJlIGVsc2UKLSNkZWZpbmUgSENJX05PTl9GTFVTSEFCTEVfUEJfU1VQUE9SVEVEKHgpICgwKSAgLy8oKHgpWzZdICYgMHg0MCkKLSNkZWZpbmUgSENJX0xJTktfU1VQX1RPX0VWVF9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9JTlFfUkVTUF9UWF9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9MTVBfRVhURU5ERURfU1VQUE9SVEVEKHgpICgoeClbN10gJiAweDgwKQotCi0vKiBMTVAgZmVhdHVyZXMgZW5jb2RpbmcgLSBwYWdlIDEgKi8KLSNkZWZpbmUgSENJX1NTUF9IT1NUX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwMSkKLSNkZWZpbmUgSENJX0xFX0hPU1RfU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDAyKQotI2RlZmluZSBIQ0lfU0lNVUxfRFVNT19IT1NUX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwNCkKLSNkZWZpbmUgSENJX1NDX0hPU1RfU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDA4KQotCi0vKiBMTVAgZmVhdHVyZXMgZW5jb2RpbmcgLSBwYWdlIDIgKi8KLSNkZWZpbmUgSENJX0NTQl9DRU5UUkFMX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwMSkKLSNkZWZpbmUgSENJX0NTQl9QRVJJUEhFUkFMX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwMikKLSNkZWZpbmUgSENJX1NZTkNfVFJBSU5fQ0VOVFJBTF9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9TWU5DX1NDQU5fUEVSSVBIRVJBTF9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9JTlFfUkVTUF9OT1RJRl9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MTApCi0KLSNkZWZpbmUgSENJX1NDX0NUUkxSX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgwMSkKLSNkZWZpbmUgSENJX1BJTkdfU1VQUE9SVEVEKHgpICgoeClbMV0gJiAweDAyKQotCi0vKiAgTEUgZmVhdHVyZXMgZW5jb2RpbmcgLSBwYWdlIDAgKHRoZSBvbmx5IHBhZ2UgZm9yIG5vdykgKi8KLSNkZWZpbmUgSENJX0xFX0VOQ1JZUFRJT05fU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDAxKQotI2RlZmluZSBIQ0lfTEVfQ09OTl9QQVJBTV9SRVFfU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDAyKQotI2RlZmluZSBIQ0lfTEVfRVhUX1JFSl9JTkRfU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDA0KQotI2RlZmluZSBIQ0lfTEVfUEVSSVBIRVJBTF9JTklUX0ZFQVRfRVhDX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwOCkKLSNkZWZpbmUgSENJX0xFX0RBVEFfTEVOX0VYVF9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MjApCi0jZGVmaW5lIEhDSV9MRV9FTkhBTkNFRF9QUklWQUNZX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHg0MCkKLSNkZWZpbmUgSENJX0xFX0VYVF9TQ0FOX0ZJTFRFUl9QT0xJQ1lfU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9MRV8yTV9QSFlfU1VQUE9SVEVEKHgpICgoeClbMV0gJiAweDAxKQotI2RlZmluZSBIQ0lfTEVfQ09ERURfUEhZX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgwOCkKLSNkZWZpbmUgSENJX0xFX0VYVEVOREVEX0FEVkVSVElTSU5HX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgxMCkKLSNkZWZpbmUgSENJX0xFX1BFUklPRElDX0FEVkVSVElTSU5HX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgyMCkKLSNkZWZpbmUgSENJX0xFX1BFUklPRElDX0FEVkVSVElTSU5HX1NZTkNfVFJBTlNGRVJfU0VOREVSKHgpICgoeClbM10gJiAweDAxKQotI2RlZmluZSBIQ0lfTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9SRUNJUElFTlQoeCkgKCh4KVszXSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9MRV9DSVNfQ0VOVFJBTCh4KSAoKHgpWzNdICYgMHgxMCkKLSNkZWZpbmUgSENJX0xFX0NJU19QRVJJUEhFUkFMKHgpICgoeClbM10gJiAweDIwKQotI2RlZmluZSBIQ0lfTEVfSVNPX0JST0FEQ0FTVEVSKHgpICgoeClbM10gJiAweDQwKQotI2RlZmluZSBIQ0lfTEVfU1lOQ0hST05JWkVEX1JFQ0VJVkVSKHgpICgoeClbM10gJiAweDgwKQotCi0vKiBTdXBwb3J0ZWQgQ29tbWFuZHMqLwotI2RlZmluZSBIQ0lfTlVNX1NVUFBfQ09NTUFORFNfQllURVMgNjQKLQotI2RlZmluZSBIQ0lfSU5RVUlSWV9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9JTlFVSVJZX0NBTkNFTF9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9QRVJJT0RJQ19JTlFVSVJZX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgwNCkKLSNkZWZpbmUgSENJX0VYSVRfUEVSSU9ESUNfSU5RVUlSWV9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9DUkVBVEVfQ09OTl9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4MTApCi0jZGVmaW5lIEhDSV9ESVNDT05ORUNUX1NVUFBPUlRFRCh4KSAoKHgpWzBdICYgMHgyMCkKLSNkZWZpbmUgSENJX0FERF9TQ09fQ09OTl9TVVBQT1JURUQoeCkgKCh4KVswXSAmIDB4NDApCi0jZGVmaW5lIEhDSV9DQU5DRUxfQ1JFQVRFX0NPTk5fU1VQUE9SVEVEKHgpICgoeClbMF0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9BQ0NFUFRfQ09OTl9SRVFVRVNUX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgwMSkKLSNkZWZpbmUgSENJX1JFSkVDVF9DT05OX1JFUVVFU1RfU1VQUE9SVEVEKHgpICgoeClbMV0gJiAweDAyKQotI2RlZmluZSBIQ0lfTElOS19LRVlfUkVRVUVTVF9SRVBMWV9TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9MSU5LX0tFWV9SRVFVRVNUX05FR19SRVBMWV9TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9QSU5fQ09ERV9SRVFVRVNUX1JFUExZX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgxMCkKLSNkZWZpbmUgSENJX1BJTl9DT0RFX1JFUVVFU1RfTkVHX1JFUExZX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHgyMCkKLSNkZWZpbmUgSENJX0NIQU5HRV9DT05OX1BLVF9UWVBFX1NVUFBPUlRFRCh4KSAoKHgpWzFdICYgMHg0MCkKLSNkZWZpbmUgSENJX0FVVEhfUkVRVUVTVF9TVVBQT1JURUQoeCkgKCh4KVsxXSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX1NFVF9DT05OX0VOQ1JZUFRJT05fU1VQUE9SVEVEKHgpICgoeClbMl0gJiAweDAxKQotI2RlZmluZSBIQ0lfQ0hBTkdFX0NPTk5fTElOS19LRVlfU1VQUE9SVEVEKHgpICgoeClbMl0gJiAweDAyKQotI2RlZmluZSBIQ0lfQ0VOVFJBTF9MSU5LX0tFWV9TVVBQT1JURUQoeCkgKCh4KVsyXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9SRU1PVEVfTkFNRV9SRVFVRVNUX1NVUFBPUlRFRCh4KSAoKHgpWzJdICYgMHgwOCkKLSNkZWZpbmUgSENJX0NBTkNFTF9SRU1PVEVfTkFNRV9SRVFVRVNUX1NVUFBPUlRFRCh4KSAoKHgpWzJdICYgMHgxMCkKLSNkZWZpbmUgSENJX1JFQURfUkVNT1RFX1NVUFBfRkVBVFVSRVNfU1VQUE9SVEVEKHgpICgoeClbMl0gJiAweDIwKQotI2RlZmluZSBIQ0lfUkVBRF9SRU1PVEVfRVhUX0ZFQVRVUkVTX1NVUFBPUlRFRCh4KSAoKHgpWzJdICYgMHg0MCkKLSNkZWZpbmUgSENJX1JFQURfUkVNT1RFX1ZFUl9JTkZPX1NVUFBPUlRFRCh4KSAoKHgpWzJdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfUkVBRF9DTE9DS19PRkZTRVRfU1VQUE9SVEVEKHgpICgoeClbM10gJiAweDAxKQotI2RlZmluZSBIQ0lfUkVBRF9MTVBfSEFORExFX1NVUFBPUlRFRCh4KSAoKHgpWzNdICYgMHgwMikKLS8qIHJlc3Qgb2YgYml0cyBpbiAzLXJkIGJ5dGUgYXJlIHJlc2VydmVkICovCi0KLSNkZWZpbmUgSENJX0hPTERfTU9ERV9DTURfU1VQUE9SVEVEKHgpICgoeClbNF0gJiAweDAyKQotI2RlZmluZSBIQ0lfU05JRkZfTU9ERV9DTURfU1VQUE9SVEVEKHgpICgoeClbNF0gJiAweDA0KQotI2RlZmluZSBIQ0lfRVhJVF9TTklGRl9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzRdICYgMHgwOCkKLSNkZWZpbmUgSENJX1BBUktfU1RBVEVfU1VQUE9SVEVEKHgpICgoeClbNF0gJiAweDEwKQotI2RlZmluZSBIQ0lfRVhJVF9QQVJLX1NUQVRFX1NVUFBPUlRFRCh4KSAoKHgpWzRdICYgMHgyMCkKLSNkZWZpbmUgSENJX1FPU19TRVRVUF9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4NDApCi0jZGVmaW5lIEhDSV9ST0xFX0RJU0NPVkVSWV9TVVBQT1JURUQoeCkgKCh4KVs0XSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX1NXSVRDSF9ST0xFX1NVUFBPUlRFRCh4KSAoKHgpWzVdICYgMHgwMSkKLSNkZWZpbmUgSENJX1JFQURfTElOS19QT0xJQ1lfU0VUX1NVUFBPUlRFRCh4KSAoKHgpWzVdICYgMHgwMikKLSNkZWZpbmUgSENJX1dSSVRFX0xJTktfUE9MSUNZX1NFVF9TVVBQT1JURUQoeCkgKCh4KVs1XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9SRUFEX0RFRl9MSU5LX1BPTElDWV9TRVRfU1VQUE9SVEVEKHgpICgoeClbNV0gJiAweDA4KQotI2RlZmluZSBIQ0lfV1JJVEVfREVGX0xJTktfUE9MSUNZX1NFVF9TVVBQT1JURUQoeCkgKCh4KVs1XSAmIDB4MTApCi0jZGVmaW5lIEhDSV9GTE9XX1NQRUNJRklDQVRJT05fU1VQUE9SVEVEKHgpICgoeClbNV0gJiAweDIwKQotI2RlZmluZSBIQ0lfU0VUX0VWRU5UX01BU0tfU1VQUE9SVEVEKHgpICgoeClbNV0gJiAweDQwKQotI2RlZmluZSBIQ0lfUkVTRVRfU1VQUE9SVEVEKHgpICgoeClbNV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9TRVRfRVZFTlRfRklMVEVSX1NVUFBPUlRFRCh4KSAoKHgpWzZdICYgMHgwMSkKLSNkZWZpbmUgSENJX0ZMVVNIX1NVUFBPUlRFRCh4KSAoKHgpWzZdICYgMHgwMikKLSNkZWZpbmUgSENJX1JFQURfUElOX1RZUEVfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDA0KQotI2RlZmluZSBIQ0lfV1JJVEVfUElOX1RZUEVfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDA4KQotI2RlZmluZSBIQ0lfUkVBRF9TVE9SRURfTElOS19LRVlfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDIwKQotI2RlZmluZSBIQ0lfV1JJVEVfU1RPUkVEX0xJTktfS0VZX1NVUFBPUlRFRCh4KSAoKHgpWzZdICYgMHg0MCkKLSNkZWZpbmUgSENJX0RFTEVURV9TVE9SRURfTElOS19LRVlfU1VQUE9SVEVEKHgpICgoeClbNl0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9XUklURV9MT0NBTF9OQU1FX1NVUFBPUlRFRCh4KSAoKHgpWzddICYgMHgwMSkKLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfTkFNRV9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9SRUFEX0NPTk5fQUNDRVBUX1RPVVRfU1VQUE9SVEVEKHgpICgoeClbN10gJiAweDA0KQotI2RlZmluZSBIQ0lfV1JJVEVfQ09OTl9BQ0NFUFRfVE9VVF9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9SRUFEX1BBR0VfVE9VVF9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4MTApCi0jZGVmaW5lIEhDSV9XUklURV9QQUdFX1RPVVRfU1VQUE9SVEVEKHgpICgoeClbN10gJiAweDIwKQotI2RlZmluZSBIQ0lfUkVBRF9TQ0FOX0VOQUJMRV9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4NDApCi0jZGVmaW5lIEhDSV9XUklURV9TQ0FOX0VOQUJMRV9TVVBQT1JURUQoeCkgKCh4KVs3XSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX1JFQURfUEFHRV9TQ0FOX0FDVElWSVRZX1NVUFBPUlRFRCh4KSAoKHgpWzhdICYgMHgwMSkKLSNkZWZpbmUgSENJX1dSSVRFX1BBR0VfU0NBTl9BQ1RJVklUWV9TVVBQT1JURUQoeCkgKCh4KVs4XSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9SRUFEX0lOUVVSSVlfU0NBTl9BQ1RJVklUWV9TVVBQT1JURUQoeCkgKCh4KVs4XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9XUklURV9JTlFVUklZX1NDQU5fQUNUSVZJVFlfU1VQUE9SVEVEKHgpICgoeClbOF0gJiAweDA4KQotI2RlZmluZSBIQ0lfUkVBRF9BVVRIX0VOQUJMRV9TVVBQT1JURUQoeCkgKCh4KVs4XSAmIDB4MTApCi0jZGVmaW5lIEhDSV9XUklURV9BVVRIX0VOQUJMRV9TVVBQT1JURUQoeCkgKCh4KVs4XSAmIDB4MjApCi0jZGVmaW5lIEhDSV9SRUFEX0VOQ1JZUFRfRU5BQkxFX1NVUFBPUlRFRCh4KSAoKHgpWzhdICYgMHg0MCkKLSNkZWZpbmUgSENJX1dSSVRFX0VOQ1JZUFRfRU5BQkxFX1NVUFBPUlRFRCh4KSAoKHgpWzhdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfUkVBRF9DTEFTU19ERVZJQ0VfU1VQUE9SVEVEKHgpICgoeClbOV0gJiAweDAxKQotI2RlZmluZSBIQ0lfV1JJVEVfQ0xBU1NfREVWSUNFX1NVUFBPUlRFRCh4KSAoKHgpWzldICYgMHgwMikKLSNkZWZpbmUgSENJX1JFQURfVk9JQ0VfU0VUVElOR19TVVBQT1JURUQoeCkgKCh4KVs5XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9XUklURV9WT0lDRV9TRVRUSU5HX1NVUFBPUlRFRCh4KSAoKHgpWzldICYgMHgwOCkKLSNkZWZpbmUgSENJX1JFQURfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVRfU1VQUE9SVEVEKHgpICgoeClbOV0gJiAweDEwKQotI2RlZmluZSBIQ0lfV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVRfU1VQUE9SVEVEKHgpICgoeClbOV0gJiAweDIwKQotI2RlZmluZSBIQ0lfUkVBRF9OVU1fQlJPQURfUkVUUkFOU19TVVBQT1JURUQoeCkgKCh4KVs5XSAmIDB4NDApCi0jZGVmaW5lIEhDSV9XUklURV9OVU1fQlJPQURfUkVUUkFOU19TVVBQT1JURUQoeCkgKCh4KVs5XSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX1JFQURfSE9MRF9NT0RFX0FDVElWSVRZX1NVUFBPUlRFRCh4KSAoKHgpWzEwXSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9XUklURV9IT0xEX01PREVfQUNUSVZJVFlfU1VQUE9SVEVEKHgpICgoeClbMTBdICYgMHgwMikKLSNkZWZpbmUgSENJX1JFQURfVFJBTlNfUFdSX0xFVkVMX1NVUFBPUlRFRCh4KSAoKHgpWzEwXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9SRUFEX1NZTkNIX0ZMT1dfQ1RSTF9FTkFCTEVfU1VQUE9SVEVEKHgpICgoeClbMTBdICYgMHgwOCkKLSNkZWZpbmUgSENJX1dSSVRFX1NZTkNIX0ZMT1dfQ1RSTF9FTkFCTEVfU1VQUE9SVEVEKHgpICgoeClbMTBdICYgMHgxMCkKLSNkZWZpbmUgSENJX1NFVF9IT1NUX0NUUkxSX1RPX0hPU1RfRkNfU1VQUE9SVEVEKHgpICgoeClbMTBdICYgMHgyMCkKLSNkZWZpbmUgSENJX0hPU1RfQlVGRkVSX1NJWkVfU1VQUE9SVEVEKHgpICgoeClbMTBdICYgMHg0MCkKLSNkZWZpbmUgSENJX0hPU1RfTlVNX0NPTVBMRVRFRF9QS1RTX1NVUFBPUlRFRCh4KSAoKHgpWzEwXSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX1JFQURfTElOS19TVVBfVE9VVF9TVVBQT1JURUQoeCkgKCh4KVsxMV0gJiAweDAxKQotI2RlZmluZSBIQ0lfV1JJVEVfTElOS19TVVBfVE9VVF9TVVBQT1JURUQoeCkgKCh4KVsxMV0gJiAweDAyKQotI2RlZmluZSBIQ0lfUkVBRF9OVU1fU1VQUF9JQUNfU1VQUE9SVEVEKHgpICgoeClbMTFdICYgMHgwNCkKLSNkZWZpbmUgSENJX1JFQURfQ1VSUkVOVF9JQUNfTEFQX1NVUFBPUlRFRCh4KSAoKHgpWzExXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9XUklURV9DVVJSRU5UX0lBQ19MQVBfU1VQUE9SVEVEKHgpICgoeClbMTFdICYgMHgxMCkKLSNkZWZpbmUgSENJX1JFQURfUEFHRV9TQ0FOX1BFUl9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzExXSAmIDB4MjApCi0jZGVmaW5lIEhDSV9XUklURV9QQUdFX1NDQU5fUEVSX01PREVfU1VQUE9SVEVEKHgpICgoeClbMTFdICYgMHg0MCkKLSNkZWZpbmUgSENJX1JFQURfUEFHRV9TQ0FOX01PREVfU1VQUE9SVEVEKHgpICgoeClbMTFdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfV1JJVEVfUEFHRV9TQ0FOX01PREVfU1VQUE9SVEVEKHgpICgoeClbMTJdICYgMHgwMSkKLSNkZWZpbmUgSENJX1NFVF9BRkhfQ0hOTF9DTEFTU19TVVBQT1JURUQoeCkgKCh4KVsxMl0gJiAweDAyKQotI2RlZmluZSBIQ0lfUkVBRF9JTlFVSVJZX1NDQU5fVFlQRV9TVVBQT1JURUQoeCkgKCh4KVsxMl0gJiAweDEwKQotI2RlZmluZSBIQ0lfV1JJVEVfSU5RVUlSWV9TQ0FOX1RZUEVfU1VQUE9SVEVEKHgpICgoeClbMTJdICYgMHgyMCkKLSNkZWZpbmUgSENJX1JFQURfSU5RVUlSWV9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzEyXSAmIDB4NDApCi0jZGVmaW5lIEhDSV9XUklURV9JTlFVSVJZX01PREVfU1VQUE9SVEVEKHgpICgoeClbMTJdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfUkVBRF9QQUdFX1NDQU5fVFlQRV9TVVBQT1JURUQoeCkgKCh4KVsxM10gJiAweDAxKQotI2RlZmluZSBIQ0lfV1JJVEVfUEFHRV9TQ0FOX1RZUEVfU1VQUE9SVEVEKHgpICgoeClbMTNdICYgMHgwMikKLSNkZWZpbmUgSENJX1JFQURfQUZIX0NITkxfQVNTRVNTX01PREVfU1VQUE9SVEVEKHgpICgoeClbMTNdICYgMHgwNCkKLSNkZWZpbmUgSENJX1dSSVRFX0FGSF9DSE5MX0FTU0VTU19NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzEzXSAmIDB4MDgpCi0KLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfVkVSX0lORk9fU1VQUE9SVEVEKHgpICgoeClbMTRdICYgMHgwOCkKLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfU1VQX0NNRFNfU1VQUE9SVEVEKHgpICgoeClbMTRdICYgMHgxMCkKLSNkZWZpbmUgSENJX1JFQURfTE9DQUxfU1VQUF9GRUFUVVJFU19TVVBQT1JURUQoeCkgKCh4KVsxNF0gJiAweDIwKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9FWFRfRkVBVFVSRVNfU1VQUE9SVEVEKHgpICgoeClbMTRdICYgMHg0MCkKLSNkZWZpbmUgSENJX1JFQURfQlVGRkVSX1NJWkVfU1VQUE9SVEVEKHgpICgoeClbMTRdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfUkVBRF9DT1VOVFJZX0NPREVfU1VQUE9SVEVEKHgpICgoeClbMTVdICYgMHgwMSkKLSNkZWZpbmUgSENJX1JFQURfQkRfQUREUl9TVVBQT1JURUQoeCkgKCh4KVsxNV0gJiAweDAyKQotI2RlZmluZSBIQ0lfUkVBRF9GQUlMX0NPTlRBQ1RfQ05UUl9TVVBQT1JURUQoeCkgKCh4KVsxNV0gJiAweDA0KQotI2RlZmluZSBIQ0lfUkVTRVRfRkFJTF9DT05UQUNUX0NOVFJfU1VQUE9SVEVEKHgpICgoeClbMTVdICYgMHgwOCkKLSNkZWZpbmUgSENJX0dFVF9MSU5LX1FVQUxJVFlfU1VQUE9SVEVEKHgpICgoeClbMTVdICYgMHgxMCkKLSNkZWZpbmUgSENJX1JFQURfUlNTSV9TVVBQT1JURUQoeCkgKCh4KVsxNV0gJiAweDIwKQotI2RlZmluZSBIQ0lfUkVBRF9BRkhfQ0hfTUFQX1NVUFBPUlRFRCh4KSAoKHgpWzE1XSAmIDB4NDApCi0jZGVmaW5lIEhDSV9SRUFEX0JEX0NMT0NLX1NVUFBPUlRFRCh4KSAoKHgpWzE1XSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX1JFQURfTE9PUEJBQ0tfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVsxNl0gJiAweDAxKQotI2RlZmluZSBIQ0lfV1JJVEVfTE9PUEJBQ0tfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVsxNl0gJiAweDAyKQotI2RlZmluZSBIQ0lfRU5BQkxFX0RFVl9VTkRFUl9URVNUX1NVUFBPUlRFRCh4KSAoKHgpWzE2XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9TRVRVUF9TWU5DSF9DT05OX1NVUFBPUlRFRCh4KSAoKHgpWzE2XSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9BQ0NFUFRfU1lOQ0hfQ09OTl9TVVBQT1JURUQoeCkgKCh4KVsxNl0gJiAweDEwKQotI2RlZmluZSBIQ0lfUkVKRUNUX1NZTkNIX0NPTk5fU1VQUE9SVEVEKHgpICgoeClbMTZdICYgMHgyMCkKLQotI2RlZmluZSBIQ0lfUkVBRF9FWFRfSU5RVUlSWV9SRVNQX1NVUFBPUlRFRCh4KSAoKHgpWzE3XSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9XUklURV9FWFRfSU5RVUlSWV9SRVNQX1NVUFBPUlRFRCh4KSAoKHgpWzE3XSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9SRUZSRVNIX0VOQ1JZUFRJT05fS0VZX1NVUFBPUlRFRCh4KSAoKHgpWzE3XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9TTklGRl9TVUJfUkFURV9DTURfU1VQUE9SVEVEKHgpICgoeClbMTddICYgMHgxMCkKLSNkZWZpbmUgSENJX1JFQURfU0lNUExFX1BBSVJJTkdfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVsxN10gJiAweDIwKQotI2RlZmluZSBIQ0lfV1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVsxN10gJiAweDQwKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9PT0JfREFUQV9TVVBQT1JURUQoeCkgKCh4KVsxN10gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9SRUFEX0lOUVVJUllfUkVTUE9OU0VfVFhfUE9XRVJfU1VQUE9SVEVEKHgpICgoeClbMThdICYgMHgwMSkKLSNkZWZpbmUgSENJX1dSSVRFX0lOUVVJUllfUkVTUE9OU0VfVFhfUE9XRVJfU1VQUE9SVEVEKHgpICgoeClbMThdICYgMHgwMikKLSNkZWZpbmUgSENJX1JFQURfREVGQVVMVF9FUlJPTkVPVVNfREFUQV9SRVBPUlRJTkdfU1VQUE9SVEVEKHgpICgoeClbMThdICYgMHgwNCkKLSNkZWZpbmUgSENJX1dSSVRFX0RFRkFVTFRfRVJST05FT1VTX0RBVEFfUkVQT1JUSU5HX1NVUFBPUlRFRCh4KSAoKHgpWzE4XSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9JT19DQVBBQklMSVRZX1JFUVVFU1RfUkVQTFlfU1VQUE9SVEVEKHgpICgoeClbMThdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9SRVBMWV9TVVBQT1JURUQoeCkgKCh4KVsxOV0gJiAweDAxKQotI2RlZmluZSBIQ0lfVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9ORUdfUkVQTFlfU1VQUE9SVEVEKHgpICgoeClbMTldICYgMHgwMikKLSNkZWZpbmUgSENJX1VTRVJfUEFTU0tFWV9SRVFVRVNUX1JFUExZX1NVUFBPUlRFRCh4KSAoKHgpWzE5XSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVF9ORUdfUkVQTFlfU1VQUE9SVEVEKHgpICgoeClbMTldICYgMHgwOCkKLSNkZWZpbmUgSENJX1JFTU9URV9PT0JfREFUQV9SRVFVRVNUX1JFUExZX1NVUFBPUlRFRCh4KSAoKHgpWzE5XSAmIDB4MTApCi0jZGVmaW5lIEhDSV9XUklURV9TSU1QTEVfUEFJUklOR19EQkdfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVsxOV0gJiAweDIwKQotI2RlZmluZSBIQ0lfRU5IQU5DRURfRkxVU0hfU1VQUE9SVEVEKHgpICgoeClbMTldICYgMHg0MCkKLSNkZWZpbmUgSENJX1JFTU9URV9PT0JfREFUQV9SRVFVRVNUX05FR19SRVBMWV9TVVBQT1JURUQoeCkgKCh4KVsxOV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9TRU5EX05PVElGX1NVUFBPUlRFRCh4KSAoKHgpWzIwXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9JT19DQVBfUkVRX05FR19SRVBMWV9TVVBQT1JURUQoeCkgKCh4KVsyMF0gJiAweDA4KQotI2RlZmluZSBIQ0lfUkVBRF9FTkNSX0tFWV9TSVpFX1NVUFBPUlRFRCh4KSAoKHgpWzIwXSAmIDB4MTApCi0KLSNkZWZpbmUgSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LX1NVUFBPUlRFRCh4KSAoKHgpWzIxXSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOS19TVVBQT1JURUQoeCkgKCh4KVsyMV0gJiAweDAyKQotI2RlZmluZSBIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LX1NVUFBPUlRFRCh4KSAoKHgpWzIxXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9DUkVBVEVfTE9HSUNBTF9MSU5LX1NVUFBPUlRFRCh4KSAoKHgpWzIxXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LX1NVUFBPUlRFRCh4KSAoKHgpWzIxXSAmIDB4MTApCi0jZGVmaW5lIEhDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19TVVBQT1JURUQoeCkgKCh4KVsyMV0gJiAweDIwKQotI2RlZmluZSBIQ0lfTE9HSUNBTF9MSU5LX0NBTkNFTF9TVVBQT1JURUQoeCkgKCh4KVsyMV0gJiAweDQwKQotI2RlZmluZSBIQ0lfRkxPV19TUEVDX01PRElGWV9TVVBQT1JURUQoeCkgKCh4KVsyMV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9SRUFEX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVF9TVVBQT1JURUQoeCkgKCh4KVsyMl0gJiAweDAxKQotI2RlZmluZSBIQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUX1NVUFBPUlRFRCh4KSAoKHgpWzIyXSAmIDB4MDIpCi0jZGVmaW5lIEhDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJfU1VQUE9SVEVEKHgpICgoeClbMjJdICYgMHgwNCkKLSNkZWZpbmUgSENJX1JFQURfTE9DQVRJT05fREFUQV9TVVBQT1JURUQoeCkgKCh4KVsyMl0gJiAweDA4KQotI2RlZmluZSBIQ0lfV1JJVEVfTE9DQVRJT05fREFUQV9TVVBQT1JURUQoeCkgKCh4KVsyMl0gJiAweDEwKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9BTVBfSU5GT19TVVBQT1JURUQoeCkgKCh4KVsyMl0gJiAweDIwKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0NfU1VQUE9SVEVEKHgpICgoeClbMjJdICYgMHg0MCkKLSNkZWZpbmUgSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NfU1VQUE9SVEVEKHgpICgoeClbMjJdICYgMHg4MCkKLQotI2RlZmluZSBIQ0lfUkVBRF9GTE9XX0NPTlRST0xfTU9ERV9TVVBQT1JURUQoeCkgKCh4KVsyM10gJiAweDAxKQotI2RlZmluZSBIQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREVfU1VQUE9SVEVEKHgpICgoeClbMjNdICYgMHgwMikKLSNkZWZpbmUgSENJX1JFQURfREFUQV9CTE9DS19TSVpFX1NVUFBPUlRFRCh4KSAoKHgpWzIzXSAmIDB4MDQpCi0jZGVmaW5lIEhDSV9FTkFCTEVfQU1QX1JDVlJfUkVQT1JUU19TVVBQT1JURUQoeCkgKCh4KVsyM10gJiAweDIwKQotI2RlZmluZSBIQ0lfQU1QX1RFU1RfRU5EX1NVUFBPUlRFRCh4KSAoKHgpWzIzXSAmIDB4NDApCi0jZGVmaW5lIEhDSV9BTVBfVEVTVF9TVVBQT1JURUQoeCkgKCh4KVsyM10gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9SRUFEX1RSQU5TTUlUX1BPV0VSX0xFVkVMX1NVUFBPUlRFRCh4KSAoKHgpWzI0XSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9SRUFEX0JFX0ZMVVNIX1RPVVRfU1VQUE9SVEVEKHgpICgoeClbMjRdICYgMHgwNCkKLSNkZWZpbmUgSENJX1dSSVRFX0JFX0ZMVVNIX1RPVVRfU1VQUE9SVEVEKHgpICgoeClbMjRdICYgMHgwOCkKLSNkZWZpbmUgSENJX1NIT1JUX1JBTkdFX01PREVfU1VQUE9SVEVEKHgpICgoeClbMjRdICYgMHgxMCkKLQotI2RlZmluZSBIQ0lfRU5IX1NFVFVQX1NZTkNIX0NPTk5fU1VQUE9SVEVEKHgpICgoeClbMjldICYgMHgwOCkKLSNkZWZpbmUgSENJX0VOSF9BQ0NFUFRfU1lOQ0hfQ09OTl9TVVBQT1JURUQoeCkgKCh4KVsyOV0gJiAweDEwKQotI2RlZmluZSBIQ0lfUkVBRF9MT0NBTF9DT0RFQ1NfU1VQUE9SVEVEKHgpICgoeClbMjldICYgMHgyMCkKLSNkZWZpbmUgSENJX1NFVF9NV1NfQ0hBTk5FTF9QQVJBTUVURVJTX1NVUFBPUlRFRCh4KSAoKHgpWzI5XSAmIDB4NDApCi0jZGVmaW5lIEhDSV9TRVRfRVhURVJOQUxfRlJBTUVfQ09ORklHVVJBVElPTl9TVVBQT1JURUQoeCkgKCh4KVsyOV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9TRVRfTVdTX1NJR05BTElOR19TVVBQT1JURUQoeCkgKCh4KVszMF0gJiAweDAxKQotI2RlZmluZSBIQ0lfU0VUX01XU19UUkFOU1BPUlRfTEFZRVJfU1VQUE9SVEVEKHgpICgoeClbMzBdICYgMHgwMikKLSNkZWZpbmUgSENJX1NFVF9NV1NfU0NBTl9GUkVRVUVOQ1lfVEFCTEVfU1VQUE9SVEVEKHgpICgoeClbMzBdICYgMHgwNCkKLSNkZWZpbmUgSENJX0dFVF9NV1NfVFJBTlNfTEFZRVJfQ0ZHX1NVUFBPUlRFRCh4KSAoKHgpWzMwXSAmIDB4MDgpCi0jZGVmaW5lIEhDSV9TRVRfTVdTX1BBVFRFUk5fQ09ORklHVVJBVElPTl9TVVBQT1JURUQoeCkgKCh4KVszMF0gJiAweDEwKQotI2RlZmluZSBIQ0lfU0VUX1RSSUdfQ0xLX0NBUF9TVVBQT1JURUQoeCkgKCh4KVszMF0gJiAweDIwKQotI2RlZmluZSBIQ0lfVFJVTkNBVEVEX1BBR0VfU1VQUE9SVEVEKHgpICgoeClbMzBdICYgMHg0MCkKLSNkZWZpbmUgSENJX1RSVU5DQVRFRF9QQUdFX0NBTkNFTF9TVVBQT1JURUQoeCkgKCh4KVszMF0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9TRVRfQ09OTEVTU19QRVJJUEhFUkFMX0JSQ1NUX1NVUFBPUlRFRCh4KSAoKHgpWzMxXSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9TRVRfQ09OTEVTU19QRVJJUEhFUkFMX0JSQ1NUX1JFQ0VJVkVfU1VQUE9SVEVEKHgpICgoeClbMzFdICYgMHgwMikKLSNkZWZpbmUgSENJX1NUQVJUX1NZTkNfVFJBSU5fU1VQUE9SVEVEKHgpICgoeClbMzFdICYgMHgwNCkKLSNkZWZpbmUgSENJX1JFQ0VJVkVfU1lOQ19UUkFJTl9TVVBQT1JURUQoeCkgKCh4KVszMV0gJiAweDA4KQotI2RlZmluZSBIQ0lfU0VUX1JFU0VSVkVEX0xUX0FERFJfU1VQUE9SVEVEKHgpICgoeClbMzFdICYgMHgxMCkKLSNkZWZpbmUgSENJX0RFTEVURV9SRVNFUlZFRF9MVF9BRERSX1NVUFBPUlRFRCh4KSAoKHgpWzMxXSAmIDB4MjApCi0jZGVmaW5lIEhDSV9TRVRfQ09OTEVTU19QRVJJUEhFUkFMX0JSQ1NUX0RBVEFfU1VQUE9SVEVEKHgpICgoeClbMzFdICYgMHg0MCkKLSNkZWZpbmUgSENJX1JFQURfU1lOQ19UUkFJTl9QQVJBTV9TVVBQT1JURUQoeCkgKCh4KVszMV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9XUklURV9TWU5DX1RSQUlOX1BBUkFNX1NVUFBPUlRFRCh4KSAoKHgpWzMyXSAmIDB4MDEpCi0jZGVmaW5lIEhDSV9SRU1PVEVfT09CX0VYVEVOREVEX0RBVEFfUkVRVUVTVF9SRVBMWV9TVVBQT1JURUQoeCkgKCh4KVszMl0gJiAweDAyKQotI2RlZmluZSBIQ0lfUkVBRF9TRUNVUkVfQ09OTlNfU1VQUE9SVF9TVVBQT1JURUQoeCkgKCh4KVszMl0gJiAweDA0KQotI2RlZmluZSBIQ0lfV1JJVEVfU0VDVVJFX0NPTk5TX1NVUFBPUlRfU1VQUE9SVEVEKHgpICgoeClbMzJdICYgMHgwOCkKLSNkZWZpbmUgSENJX1JFQURfQVVUSEVOVF9QQVlMT0FEX1RPVVRfU1VQUE9SVEVEKHgpICgoeClbMzJdICYgMHgxMCkKLSNkZWZpbmUgSENJX1dSSVRFX0FVVEhFTlRfUEFZTE9BRF9UT1VUX1NVUFBPUlRFRCh4KSAoKHgpWzMyXSAmIDB4MjApCi0jZGVmaW5lIEhDSV9SRUFEX0xPQ0FMX09PQl9FWFRFTkRFRF9EQVRBX1NVUFBPUlRFRCh4KSAoKHgpWzMyXSAmIDB4NDApCi0jZGVmaW5lIEhDSV9XUklURV9TRUNVUkVfQ09OTkVDVElPTlNfVEVTVF9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzMyXSAmIDB4ODApCi0KLSNkZWZpbmUgSENJX0xFX1JDX0NPTk5fUEFSQU1fVVBEX1JQWV9TVVBQT1JURUQoeCkgKCh4KVszM10gJiAweDEwKQotI2RlZmluZSBIQ0lfTEVfUkNfQ09OTl9QQVJBTV9VUERfTkVHX1JQWV9TVVBQT1JURUQoeCkgKCh4KVszM10gJiAweDIwKQotCi0jZGVmaW5lIEhDSV9MRV9SRUFEX1BIWV9TVVBQT1JURUQoeCkgKCh4KVszNV0gJiAweDEwKQotI2RlZmluZSBIQ0lfTEVfU0VUX0RFRkFVTFRfUEhZX1NVUFBPUlRFRCh4KSAoKHgpWzM1XSAmIDB4MjApCi0jZGVmaW5lIEhDSV9MRV9TRVRfUEhZX1NVUFBPUlRFRCh4KSAoKHgpWzM1XSAmIDB4NDApCi0jZGVmaW5lIEhDSV9MRV9FTkhfUlhfVEVTVF9TVVBQT1JURUQoeCkgKCh4KVszNV0gJiAweDgwKQotCi0jZGVmaW5lIEhDSV9MRV9FTkhfVFhfVEVTVF9TVVBQT1JURUQoeCkgKCh4KVszNl0gJiAweDAxKQotCi0jZGVmaW5lIEhDSV9MRV9TRVRfUFJJVkFDWV9NT0RFX1NVUFBPUlRFRCh4KSAoKHgpWzM5XSAmIDB4MDQpCi0KLSNkZWZpbmUgSENJX0xFX1NFVF9IT1NUX0ZFQVRVUkVfU1VQUE9SVEVEKHgpICgoeClbNDRdICYgMHgwMikKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2hjaW1zZ3MuaCBiL3N0YWNrL2luY2x1ZGUvaGNpbXNncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI1OTNiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvaGNpbXNncy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSENJTVNHU19ICi0jZGVmaW5lIEhDSU1TR1NfSAotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFja19mb3J3YXJkLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvZXNjb19wYXJhbWV0ZXJzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXZvaWQgYnRlX21haW5faGNpX3NlbmQoQlRfSERSKiBwX21zZywgdWludDE2X3QgZXZlbnQpOwotCi0vKiBNZXNzYWdlIGJ5IG1lc3NhZ2UuLi4uICovCi0KLS8qIElucXVpcnkgKi8KLS8qIElucXVpcnkgQ2FuY2VsICovCi0KLS8qIFBlcmlvZGljIElucXVpcnkgTW9kZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19wZXJfaW5xX21vZGUodWludDE2X3QgbWF4X3BlcmlvZCwgdWludDE2X3QgbWluX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExBUCBpbnFfbGFwLCB1aW50OF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXNwb25zZV9jbnQpOwotCi0vKiBQZXJpb2RpYyBJbnF1aXJ5IE1vZGUgKi8KLQotLyogRXhpdCBQZXJpb2RpYyBJbnF1aXJ5IE1vZGUgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfZXhpdF9wZXJfaW5xKHZvaWQpOwotCi0vKiBDcmVhdGUgQ29ubmVjdGlvbiAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19jcmVhdGVfY29ubihjb25zdCBSYXdBZGRyZXNzJiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYWNrZXRfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQsIHVpbnQ4X3QgYWxsb3dfc3dpdGNoKTsKLQotLyogQ3JlYXRlIENvbm5lY3Rpb24gKi8KLQotLyogRGlzY29ubmVjdCAqLwotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbGVnYWN5IHsKLW5hbWVzcGFjZSBoY2kgewotc3RydWN0IEludGVyZmFjZSB7Ci0gIC8vIExJTktfQ09OVFJPTCAweDA0eHgKLSAgdm9pZCAoKlN0YXJ0SW5xdWlyeSkoY29uc3QgTEFQIGlucV9sYXAsIHVpbnQ4X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzcG9uc2VfY250KTsKLSAgdm9pZCAoKklucXVpcnlDYW5jZWwpKCk7Ci0gIHZvaWQgKCpTdGFydFBlcmlvZGljSW5xdWlyeU1vZGUpKHVpbnQxNl90IG1heF9wZXJpb2QsIHVpbnQxNl90IG1pbl9wZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExBUCBpbnFfbGFwLCB1aW50OF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlc3BvbnNlX2NudCk7Ci0gIHZvaWQgKCpFeGl0UGVyaW9kaWNJbnF1aXJ5TW9kZSkoKTsKLSAgdm9pZCAoKkNyZWF0ZUNvbm5lY3Rpb24pKGNvbnN0IFJhd0FkZHJlc3MmIGRlc3QsIHVpbnQxNl90IHBhY2tldF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLCB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2xvY2tfb2Zmc2V0LCB1aW50OF90IGFsbG93X3N3aXRjaCk7Ci0gIHZvaWQgKCpEaXNjb25uZWN0KSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKTsKLSAgLy8gVU5VU0VEIDB4MDQwNyBidHNuZF9oY2ljX2FkZF9TQ09fY29ubgotICB2b2lkICgqQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbCkoY29uc3QgUmF3QWRkcmVzcyYgZGVzdCk7Ci0gIHZvaWQgKCpBY2NlcHRDb25uZWN0aW9uUmVxdWVzdCkoY29uc3QgUmF3QWRkcmVzcyYgZGVzdCwgdWludDhfdCByb2xlKTsKLSAgdm9pZCAoKlJlamVjdENvbm5lY3Rpb25SZXF1ZXN0KShjb25zdCBSYXdBZGRyZXNzJiBkZXN0LCB1aW50OF90IHJlYXNvbik7Ci0gIHZvaWQgKCpMaW5rS2V5UmVxdWVzdFJlcGx5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGlua0tleSYgbGlua19rZXkpOwotICB2b2lkICgqTGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgdm9pZCAoKlBpbkNvZGVSZXF1ZXN0UmVwbHkpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcGluX2NvZGVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElOX0NPREUgcGluX2NvZGUpOwotICB2b2lkICgqUGluQ29kZVJlcXVlc3ROZWdhdGl2ZVJlcGx5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLSAgdm9pZCAoKkNoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlKSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHBhY2tldF90eXBlcyk7Ci0gIHZvaWQgKCpBdXRoZW50aWNhdGlvblJlcXVlc3RlZCkodWludDE2X3QgaGFuZGxlKTsKLSAgdm9pZCAoKlNldENvbm5lY3Rpb25FbmNyeXB0aW9uKSh1aW50MTZfdCBoYW5kbGUsIGJvb2wgZW5hYmxlKTsKLSAgdm9pZCAoKkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5KSgpOyAgLy8gMHgwNDE1LAotICAvLyBVTlVTRUQgMHgwNDE2Ci0gIHZvaWQgKCpDZW50cmFsTGlua0tleSkoKTsgIC8vIDB4MDQxNywKLSAgdm9pZCAoKlJlbW90ZU5hbWVSZXF1ZXN0KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLCB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCk7Ci0gIHZvaWQgKCpSZW1vdGVOYW1lUmVxdWVzdENhbmNlbCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0gIHZvaWQgKCpSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMpKHVpbnQxNl90IGhhbmRsZSk7Ci0gIHZvaWQgKCpSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcykodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHBhZ2VfbnVtKTsKLSAgdm9pZCAoKlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24pKHVpbnQxNl90IGhhbmRsZSk7Ci0gIHZvaWQgKCpSZWFkQ2xvY2tPZmZzZXQpKHVpbnQxNl90IGhhbmRsZSk7Ci0gIHZvaWQgKCpSZWFkTG1wSGFuZGxlKSh1aW50MTZfdCBoYW5kbGUpOwotICB2b2lkICgqU2V0dXBTeW5jaHJvbm91c0Nvbm5lY3Rpb24pKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2xhdGVuY3ksIHVpbnQxNl90IHZvaWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmV0cmFuc19lZmZvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGFja2V0X3R5cGVzKTsKLSAgdm9pZCAoKkFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvbikoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCB0cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgICB1aW50MzJfdCByZWNlaXZlX2JhbmR3aWR0aCwgdWludDE2X3QgbWF4X2xhdGVuY3ksIHVpbnQxNl90IGNvbnRlbnRfZm10LAotICAgICAgdWludDhfdCByZXRyYW5zX2VmZm9ydCwgdWludDE2X3QgcGFja2V0X3R5cGVzKTsKLSAgdm9pZCAoKlJlamVjdFN5bmNocm9ub3VzQ29ubmVjdGlvbikoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWFzb24pOwotICB2b2lkICgqSW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHksIHVpbnQ4X3Qgb29iX3ByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXV0aF9yZXEpOwotICB2b2lkICgqVXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBpc195ZXMpOwotICB2b2lkICgqVXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3llcyk7Ci0gIHZvaWQgKCpVc2VyUGFzc2tleVJlcXVlc3RSZXBseSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDMyX3QgdmFsdWUpOwotICB2b2lkICgqVXNlclBhc3NrZXlSZXF1ZXN0TmVnYXRpdmVSZXBseSkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0gIHZvaWQgKCpSZW1vdGVPb2JEYXRhUmVxdWVzdFJlcGx5KShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCBPY3RldDE2JiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgcik7Ci0gIHZvaWQgKCpSZW1vdGVPb2JEYXRhUmVxdWVzdE5lZ2F0aXZlUmVwbHkpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotICB2b2lkICgqSW9DYXBhYmlsaXR5UmVxdWVzdE5lZ2F0aXZlUmVwbHkpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcnJfY29kZSk7Ci0gIHZvaWQgKCpFbmhhbmNlZFNldHVwU3luY2hyb25vdXNDb25uZWN0aW9uKSh1aW50MTZfdCBjb25uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaF9lc2NvX3BhcmFtc190KiBwX3BhcmFtcyk7Ci0gIHZvaWQgKCpFbmhhbmNlZEFjY2VwdFN5bmNocm9ub3VzQ29ubmVjdGlvbikoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhfZXNjb19wYXJhbXNfdCogcF9wYXJhbXMpOwotICB2b2lkICgqUmVtb3RlT29iRXh0ZW5kZWREYXRhUmVxdWVzdFJlcGx5KSgpOwotCi0gIC8vIExJTktfUE9MSUNZIDB4MDh4eAotICB2b2lkICgqSG9sZE1vZGUpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X2hvbGRfcGVyaW9kLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ob2xkX3BlcmlvZCk7Ci0gIHZvaWQgKCpTbmlmZk1vZGUpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X3NuaWZmX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3NuaWZmX3BlcmlvZCwgdWludDE2X3Qgc25pZmZfYXR0ZW1wdCwKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc25pZmZfdGltZW91dCk7Ci0gIHZvaWQgKCpFeGl0U25pZmZNb2RlKSh1aW50MTZfdCBoYW5kbGUpOwotICB2b2lkICgqUW9zU2V0dXApKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBmbGFncywgdWludDhfdCBzZXJ2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9rZW5fcmF0ZSwgdWludDMyX3QgcGVhaywgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheV92YXIpOwotICAvLyBVTlVTRUQgMHgwODA4Ci0gIHZvaWQgKCpSb2xlRGlzY292ZXJ5KSgpOwotICB2b2lkICgqU3RhcnRSb2xlU3dpdGNoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJvbGUpOwotICB2b2lkICgqUmVhZExpbmtQb2xpY3lTZXR0aW5ncykoKTsKLSAgdm9pZCAoKldyaXRlTGlua1BvbGljeVNldHRpbmdzKSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHNldHRpbmdzKTsKLSAgdm9pZCAoKlJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKSgpOwotICB2b2lkICgqV3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKSh1aW50MTZfdCBzZXR0aW5ncyk7Ci0gIHZvaWQgKCpGbG93U3BlY2lmaWNhdGlvbikoKTsKLSAgdm9pZCAoKlNuaWZmU3VicmF0aW5nKSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3JlbW90ZV9sYXQsIHVpbnQxNl90IG1pbl9sb2NhbF9sYXQpOwotCi0gIC8vIENPTlRST0xMRVJfQU5EX0JBU0VCQU5EIDB4MEN4eAotICB2b2lkICgqU2V0RXZlbnRNYXNrKSgpOwotICB2b2lkICgqUmVzZXQpKCk7Ci0gIHZvaWQgKCpTZXRFdmVudEZpbHRlcikodWludDhfdCBmaWx0X3R5cGUsIHVpbnQ4X3QgZmlsdF9jb25kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZmlsdF9jb25kLCB1aW50OF90IGZpbHRfY29uZF9sZW4pOwotICB2b2lkICgqRmx1c2gpKCk7Ci0gIHZvaWQgKCpSZWFkUGluVHlwZSkoKTsKLSAgdm9pZCAoKldyaXRlUGluVHlwZSkodWludDhfdCB0eXBlKTsKLSAgdm9pZCAoKkNyZWF0ZU5ld1VuaXRLZXkpKCk7Ci0gIHZvaWQgKCpSZWFkU3RvcmVkTGlua0tleSkoKTsKLSAgdm9pZCAoKldyaXRlU3RvcmVkTGlua0tleSkoKTsKLSAgdm9pZCAoKkRlbGV0ZVN0b3JlZExpbmtLZXkpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgZGVsZXRlX2FsbF9mbGFnKTsKLSAgdm9pZCAoKldyaXRlTG9jYWxOYW1lKShCRF9OQU1FIG5hbWUpOwotICB2b2lkICgqUmVhZExvY2FsTmFtZSkoKTsKLSAgdm9pZCAoKlJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dCkoKTsKLSAgdm9pZCAoKldyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQpKHVpbnQxNl90IHRpbWVvdXQpOwotICB2b2lkICgqUmVhZFBhZ2VUaW1lb3V0KSgpOwotICB2b2lkICgqV3JpdGVQYWdlVGltZW91dCkoKTsKLSAgdm9pZCAoKlJlYWRTY2FuRW5hYmxlKSgpOwotICB2b2lkICgqV3JpdGVTY2FuRW5hYmxlKSh1aW50OF90IGZsYWcpOwotICB2b2lkICgqUmVhZFBhZ2VTY2FuQWN0aXZpdHkpKCk7Ci0gIHZvaWQgKCpXcml0ZVBhZ2VTY2FuQWN0aXZpdHkpKHVpbnQxNl90IGludGVydmFsLCB1aW50MTZfdCB3aW5kb3cpOwotICB2b2lkICgqUmVhZElucXVpcnlTY2FuQWN0aXZpdHkpKCk7Ci0gIHZvaWQgKCpXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHkpKHVpbnQxNl90IGludGVydmFsLCB1aW50MTZfdCB3aW5kb3cpOwotICB2b2lkICgqUmVhZEF1dGhlbnRpY2F0aW9uRW5hYmxlKSgpOwotICB2b2lkICgqV3JpdGVBdXRoZW50aWNhdGlvbkVuYWJsZSkodWludDhfdCBmbGFnKTsKLSAgdm9pZCAoKlJlYWRDbGFzc09mRGV2aWNlKSgpOwotICB2b2lkICgqV3JpdGVDbGFzc09mRGV2aWNlKShERVZfQ0xBU1MgZGV2X2NsYXNzKTsKLSAgdm9pZCAoKlJlYWRWb2ljZVNldHRpbmcpKCk7Ci0gIHZvaWQgKCpXcml0ZVZvaWNlU2V0dGluZykodWludDE2X3QgZmxhZ3MpOwotICB2b2lkICgqUmVhZEF1dG9tYXRpY0ZsdXNoVGltZW91dCkodWludDE2X3QgaGFuZGxlKTsKLSAgdm9pZCAoKldyaXRlQXV0b21hdGljRmx1c2hUaW1lb3V0KSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHRvdXQpOwotICB2b2lkICgqUmVhZE51bUJyb2FkY2FzdFJldHJhbnNtaXRzKSgpOwotICB2b2lkICgqV3JpdGVOdW1Ccm9hZGNhc3RSZXRyYW5zbWl0cykoKTsKLSAgdm9pZCAoKlJlYWRIb2xkTW9kZUFjdGl2aXR5KSgpOwotICB2b2lkICgqV3JpdGVIb2xkTW9kZUFjdGl2aXR5KSgpOwotICB2b2lkICgqUmVhZFRyYW5zbWl0UG93ZXJMZXZlbCkodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHR5cGUpOwotICB2b2lkICgqUmVhZFN5bmNocm9ub3VzRmxvd0NvbnRyb2xFbmFibGUpKCk7Ci0gIHZvaWQgKCpXcml0ZVN5bmNocm9ub3VzRmxvd0NvbnRyb2xFbmFibGUpKCk7Ci0gIHZvaWQgKCpTZXRDb250cm9sbGVyVG9Ib3N0Rmxvd0NvbnRyb2wpKCk7Ci0gIHZvaWQgKCpIb3N0QnVmZmVyU2l6ZSkoKTsKLSAgdm9pZCAoKkhvc3ROdW1Db21wbGV0ZWRQYWNrZXRzKSgpOwotICB2b2lkICgqUmVhZExpbmtTdXBlcnZpc2lvblRpbWVvdXQpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdGltZW91dCk7Ci0gIHZvaWQgKCpXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQpKCk7Ci0gIHZvaWQgKCpSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWMpKCk7Ci0gIHZvaWQgKCpSZWFkQ3VycmVudElhY0xhcCkoKTsKLSAgdm9pZCAoKldyaXRlQ3VycmVudElhY0xhcCkodWludDhfdCBudW1fY3VyX2lhYywgTEFQKiBjb25zdCBpYWNfbGFwKTsKLSAgdm9pZCAoKlNldEFmaEhvc3RDaGFubmVsQ2xhc3NpZmljYXRpb24pKCk7Ci0gIHZvaWQgKCpSZWFkSW5xdWlyeVNjYW5UeXBlKSgpOwotICB2b2lkICgqV3JpdGVJbnF1aXJ5U2NhblR5cGUpKHVpbnQ4X3QgdHlwZSk7Ci0gIHZvaWQgKCpSZWFkSW5xdWlyeU1vZGUpKCk7ICAvLyAweDBDNDQsCi0gIHZvaWQgKCpXcml0ZUlucXVpcnlNb2RlKSh1aW50OF90IG1vZGUpOwotICB2b2lkICgqUmVhZFBhZ2VTY2FuVHlwZSkoKTsgIC8vIDB4MEM0NiwKLSAgdm9pZCAoKldyaXRlUGFnZVNjYW5UeXBlKSh1aW50OF90IHR5cGUpOwotICB2b2lkICgqUmVhZEFmaENoYW5uZWxBc3Nlc3NtZW50TW9kZSkoKTsKLSAgdm9pZCAoKldyaXRlQWZoQ2hhbm5lbEFzc2Vzc21lbnRNb2RlKSgpOwotICB2b2lkICgqUmVhZEV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlKSgpOwotICB2b2lkICgqV3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZSkodm9pZCogYnVmZmVyLCB1aW50OF90IGZlY19yZXEpOwotICB2b2lkICgqUmVmcmVzaEVuY3J5cHRpb25LZXkpKCk7Ci0gIHZvaWQgKCpSZWFkU2ltcGxlUGFpcmluZ01vZGUpKCk7Ci0gIHZvaWQgKCpXcml0ZVNpbXBsZVBhaXJpbmdNb2RlKSgpOwotICB2b2lkICgqUmVhZExvY2FsT29iRGF0YSkoKTsKLSAgdm9pZCAoKlJlYWRJbnF1aXJ5UmVzcG9uc2VUcmFuc21pdFBvd2VyTGV2ZWwpKCk7Ci0gIHZvaWQgKCpXcml0ZUlucXVpcnlUcmFuc21pdFBvd2VyTGV2ZWwpKCk7Ci0gIHZvaWQgKCpFbmhhbmNlZEZsdXNoKSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFja2V0X3R5cGUpOwotICB2b2lkICgqU2VuZEtleXByZXNzTm90aWZpY2F0aW9uKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IG5vdGlmKTsKLQotICAvLyBTVEFUVVNfUEFSQU1FVEVSIDB4MTR4eFMKLSAgdm9pZCAoKlJlYWRGYWlsZWRDb250YWN0Q291bnRlcikodWludDE2X3QgaGFuZGxlKTsKLSAgdm9pZCAoKlJlc2V0RmFpbGVkQ29udGFjdENvdW50ZXIpKCk7Ci0gIHZvaWQgKCpSZWFkTGlua1F1YWxpdHkpKHVpbnQxNl90IGhhbmRsZSk7Ci0gIC8vIFVOVVNFRCAweDE0MDQKLSAgdm9pZCAoKlJlYWRSc3NpKSh1aW50MTZfdCBoYW5kbGUpOwotICB2b2lkICgqUmVhZEFmaENoYW5uZWxNYXApKCk7Ci0gIHZvaWQgKCpSZWFkQ2xvY2spKCk7Ci0gIHZvaWQgKCpSZWFkRW5jcnlwdGlvbktleVNpemUpKCk7Ci19OwotCi1jb25zdCBJbnRlcmZhY2UmIEdldEludGVyZmFjZSgpOwotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGxlZ2FjeQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi0vKiBEaXNjb25uZWN0ICovCi0KLS8qIEFkZCBTQ08gQ29ubmVjdGlvbiAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19hZGRfU0NPX2Nvbm4odWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBwYWNrZXRfdHlwZXMpOwotCi0vKiBBZGQgU0NPIENvbm5lY3Rpb24gKi8KLQotLyogQ3JlYXRlIENvbm5lY3Rpb24gQ2FuY2VsICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2NyZWF0ZV9jb25uX2NhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBkZXN0KTsKLQotLyogQ3JlYXRlIENvbm5lY3Rpb24gQ2FuY2VsICovCi0KLS8qIEFjY2VwdCBDb25uZWN0aW9uIFJlcXVlc3QgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYWNjZXB0X2Nvbm4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByb2xlKTsKLQotLyogQWNjZXB0IENvbm5lY3Rpb24gUmVxdWVzdCAqLwotCi0vKiBSZWplY3QgQ29ubmVjdGlvbiBSZXF1ZXN0ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlamVjdF9jb25uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVhc29uKTsKLQotLyogUmVqZWN0IENvbm5lY3Rpb24gUmVxdWVzdCAqLwotCi0vKiBMaW5rIEtleSBSZXF1ZXN0IFJlcGx5ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2xpbmtfa2V5X3JlcV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGlua0tleSYgbGlua19rZXkpOwotCi0vKiBMaW5rIEtleSBSZXF1ZXN0IFJlcGx5ICAqLwotCi0vKiBMaW5rIEtleSBSZXF1ZXN0IE5lZyBSZXBseSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19saW5rX2tleV9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qIExpbmsgS2V5IFJlcXVlc3QgTmVnIFJlcGx5ICAqLwotCi0vKiBQSU4gQ29kZSBSZXF1ZXN0IFJlcGx5ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3Bpbl9jb2RlX3JlcV9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fY29kZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSU5fQ09ERSBwaW5fY29kZSk7Ci0KLS8qIFBJTiBDb2RlIFJlcXVlc3QgUmVwbHkgICovCi0KLS8qIExpbmsgS2V5IFJlcXVlc3QgTmVnIFJlcGx5ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3Bpbl9jb2RlX25lZ19yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyogTGluayBLZXkgUmVxdWVzdCBOZWcgUmVwbHkgICovCi0KLS8qIENoYW5nZSBDb25uZWN0aW9uIFR5cGUgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHBhY2tldF90eXBlcyk7Ci0KLS8qIENoYW5nZSBDb25uZWN0aW9uIFR5cGUgKi8KLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19hdXRoX3JlcXVlc3QoCi0gICAgdWludDE2X3QgaGFuZGxlKTsgLyogQXV0aGVudGljYXRpb24gUmVxdWVzdCAqLwotCi0vKiBTZXQgQ29ubmVjdGlvbiBFbmNyeXB0aW9uICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3NldF9jb25uX2VuY3J5cHQodWludDE2X3QgaGFuZGxlLCBib29sIGVuYWJsZSk7Ci0vKiBTZXQgQ29ubmVjdGlvbiBFbmNyeXB0aW9uICovCi0KLS8qIFJlbW90ZSBOYW1lIFJlcXVlc3QgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfcm10X25hbWVfcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQpOwotLyogUmVtb3RlIE5hbWUgUmVxdWVzdCAqLwotCi0vKiBSZW1vdGUgTmFtZSBSZXF1ZXN0IENhbmNlbCAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ybXRfbmFtZV9yZXFfY2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotLyogUmVtb3RlIE5hbWUgUmVxdWVzdCBDYW5jZWwgKi8KLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ybXRfZmVhdHVyZXNfcmVxKAotICAgIHVpbnQxNl90IGhhbmRsZSk7IC8qIFJlbW90ZSBGZWF0dXJlcyBSZXF1ZXN0ICovCi0KLS8qIFJlbW90ZSBFeHRlbmRlZCBGZWF0dXJlcyAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ybXRfZXh0X2ZlYXR1cmVzKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYWdlX251bSk7Ci0vKiBSZW1vdGUgRXh0ZW5kZWQgRmVhdHVyZXMgKi8KLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ybXRfdmVyX3JlcSgKLSAgICB1aW50MTZfdCBoYW5kbGUpOyAvKiBSZW1vdGUgVmVyc2lvbiBJbmZvIFJlcXVlc3QgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfcmVhZF9ybXRfY2xrX29mZnNldCgKLSAgICB1aW50MTZfdCBoYW5kbGUpOyAvKiBSZW1vdGUgQ2xvY2sgT2Zmc2V0ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfbG1wX2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpOyAvKiBSZW1vdGUgTE1QIEhhbmRsZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19zZXR1cF9lc2NvX2Nvbm4odWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNtaXRfYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfbGF0ZW5jeSwgdWludDE2X3Qgdm9pY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJldHJhbnNfZWZmb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGFja2V0X3R5cGVzKTsKLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYWNjZXB0X2VzY29fY29ubigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCB0cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgdWludDMyX3QgcmVjZWl2ZV9iYW5kd2lkdGgsIHVpbnQxNl90IG1heF9sYXRlbmN5LCB1aW50MTZfdCBjb250ZW50X2ZtdCwKLSAgICB1aW50OF90IHJldHJhbnNfZWZmb3J0LCB1aW50MTZfdCBwYWNrZXRfdHlwZXMpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlamVjdF9lc2NvX2Nvbm4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlYXNvbik7Ci0vKiBIb2xkIE1vZGUgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfaG9sZF9tb2RlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X2hvbGRfcGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2hvbGRfcGVyaW9kKTsKLQotLyogSG9sZCBNb2RlICovCi0KLS8qIFNuaWZmIE1vZGUgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfc25pZmZfbW9kZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9zbmlmZl9wZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3NuaWZmX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzbmlmZl9hdHRlbXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNuaWZmX3RpbWVvdXQpOwotLyogU25pZmYgTW9kZSAqLwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2V4aXRfc25pZmZfbW9kZSh1aW50MTZfdCBoYW5kbGUpOyAvKiBFeGl0IFNuaWZmIE1vZGUgKi8KLQotLyogUGFyayBNb2RlICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3BhcmtfbW9kZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGJlYWNvbl9tYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBiZWFjb25fbWluX2ludGVydmFsKTsKLS8qIFBhcmsgTW9kZSAqLwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2V4aXRfcGFya19tb2RlKHVpbnQxNl90IGhhbmRsZSk7IC8qIEV4aXQgUGFyayBNb2RlICovCi0KLS8qIFFvUyBTZXR1cCAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19xb3Nfc2V0dXAodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZWFrLCB1aW50MzJfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyKTsKLS8qIFFvUyBTZXR1cCAqLwotCi0vKiBTd2l0Y2ggUm9sZSBSZXF1ZXN0ICovCi0KLS8qIFdyaXRlIFBvbGljeSBTZXR0aW5ncyAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9wb2xpY3lfc2V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3Qgc2V0dGluZ3MpOwotLyogV3JpdGUgUG9saWN5IFNldHRpbmdzICovCi0KLS8qIFdyaXRlIERlZmF1bHQgUG9saWN5IFNldHRpbmdzICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3dyaXRlX2RlZl9wb2xpY3lfc2V0KHVpbnQxNl90IHNldHRpbmdzKTsKLS8qIFdyaXRlIERlZmF1bHQgUG9saWN5IFNldHRpbmdzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIExpc2JvbiBGZWF0dXJlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNuaWZmIFN1YnJhdGluZyAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19zbmlmZl9zdWJfcmF0ZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9yZW1vdGVfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fbG9jYWxfbGF0KTsKLS8qIFNuaWZmIFN1YnJhdGluZyAqLwotCi0vKiBFeHRlbmRlZCBJbnF1aXJ5IFJlc3BvbnNlICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3dyaXRlX2V4dF9pbnF1aXJ5X3Jlc3BvbnNlKHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmZWNfcmVxKTsKLS8qIElPIENhcGFiaWxpdGllcyBSZXNwb25zZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19pb19jYXBfcmVxX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5LCB1aW50OF90IG9vYl9wcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXV0aF9yZXEpOwotLyogSU8gQ2FwYWJpbGl0aWVzIFJlcSBOZWcgUmVwbHkgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfaW9fY2FwX3JlcV9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcnJfY29kZSk7Ci0vKiBSZWFkIExvY2FsIE9PQiBEYXRhICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfbG9jYWxfb29iX2RhdGEodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfdXNlcl9jb25mX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfeWVzKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY191c2VyX3Bhc3NrZXlfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY191c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiBSZW1vdGUgT09CIERhdGEgUmVxdWVzdCBSZXBseSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19yZW1fb29iX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgYywgY29uc3QgT2N0ZXQxNiYgcik7Ci0KLS8qIFJlbW90ZSBPT0IgRGF0YSBSZXF1ZXN0IE5lZ2F0aXZlIFJlcGx5ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlbV9vb2JfbmVnX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi0vKiBSZWFkIFR4IFBvd2VyIExldmVsICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfaW5xX3R4X3Bvd2VyKHZvaWQpOwotCi0vKiBSZWFkIERlZmF1bHQgRXJyb25lb3VzIERhdGEgUmVwb3J0aW5nICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfZGVmYXVsdF9lcnJvbmVvdXNfZGF0YV9ycHQodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfZW5oYW5jZWRfZmx1c2godWludDE2X3QgaGFuZGxlLCB1aW50OF90IHBhY2tldF90eXBlKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19zZW5kX2tleXByZXNzX25vdGlmKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBub3RpZik7Ci0vKioqKiBlbmQgb2YgU2ltcGxlIFBhaXJpbmcgQ29tbWFuZHMgKioqKi8KLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19zZXRfZXZlbnRfZmlsdGVyKHVpbnQ4X3QgZmlsdF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdF9jb25kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZmlsdF9jb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdF9jb25kX2xlbik7Ci0vKiBTZXQgRXZlbnQgRmlsdGVyICovCi0KLS8qIERlbGV0ZSBTdG9yZWQgS2V5ICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2RlbGV0ZV9zdG9yZWRfa2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVsZXRlX2FsbF9mbGFnKTsKLS8qIERlbGV0ZSBTdG9yZWQgS2V5ICovCi0KLS8qIENoYW5nZSBMb2NhbCBOYW1lICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2NoYW5nZV9uYW1lKEJEX05BTUUgbmFtZSk7Ci0KLSNkZWZpbmUgSENJQ19QQVJBTV9TSVpFX1JFQURfQ01EIDAKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0xIDEKLQotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfV1JJVEVfUEFSQU0zIDMKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9waW5fdHlwZSh1aW50OF90IHR5cGUpOyAgICAvKiBXcml0ZSBQSU4gVHlwZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9hdXRvX2FjY2VwdCh1aW50OF90IGZsYWcpOyAvKiBXcml0ZSBBdXRvIEFjY2VwdCAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19yZWFkX25hbWUodm9pZCk7ICAgICAgICAgICAgICAgICAvKiBSZWFkIExvY2FsIE5hbWUgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfd3JpdGVfcGFnZV90b3V0KAotICAgIHVpbnQxNl90IHRpbWVvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSBQYWdlIFRpbW91dCAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9zY2FuX2VuYWJsZSh1aW50OF90IGZsYWcpOyAvKiBXcml0ZSBTY2FuIEVuYWJsZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9wYWdlc2Nhbl9jZmcoCi0gICAgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IHdpbmRvdyk7IC8qIFdyaXRlIFBhZ2UgU2NhbiBBY3Rpdml0eSAqLwotLyogV3JpdGUgUGFnZSBTY2FuIEFjdGl2aXR5ICovCi0KLS8qIFdyaXRlIElucXVpcnkgU2NhbiBBY3Rpdml0eSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9pbnFzY2FuX2NmZyh1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3Qgd2luZG93KTsKLS8qIFdyaXRlIElucXVpcnkgU2NhbiBBY3Rpdml0eSAqLwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3dyaXRlX2F1dGhfZW5hYmxlKAotICAgIHVpbnQ4X3QgZmxhZyk7IC8qIFdyaXRlIEF1dGhlbnRpY2F0aW9uIEVuYWJsZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9kZXZfY2xhc3MoCi0gICAgREVWX0NMQVNTIGRldik7IC8qIFdyaXRlIENsYXNzIG9mIERldmljZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV92b2ljZV9zZXR0aW5ncygKLSAgICB1aW50MTZfdCBmbGFncyk7IC8qIFdyaXRlIFZvaWNlIFNldHRpbmdzICovCi0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfd3JpdGVfYXV0b19mbHVzaF90b3V0KAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdGltZW91dCk7IC8qIFdyaXRlIFJldHJhbnNtaXQgVGltb3V0ICovCi0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfcmVhZF90eF9wb3dlcih1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eXBlKTsgLyogUmVhZCBUeCBQb3dlciAqLwotCi0vKiBSZWFkIHRyYW5zbWl0IHBvd2VyIGxldmVsIHBhcmFtZXRlciAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ob3N0X251bV94bWl0dGVkX3BrdHMoCi0gICAgdWludDhfdCBudW1faGFuZGxlcywgdWludDE2X3QqIGhhbmRsZSwKLSAgICB1aW50MTZfdCogbnVtX3BrdHMpOyAvKiBTZXQgSG9zdCBCdWZmZXIgU2l6ZSAqLwotCi0vKiBXcml0ZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfd3JpdGVfbGlua19zdXBlcl90b3V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdGltZW91dCk7Ci0vKiBXcml0ZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQgKi8KLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9jdXJfaWFjX2xhcCgKLSAgICB1aW50OF90IG51bV9jdXJfaWFjLCBMQVAqIGNvbnN0IGlhY19sYXApOyAvKiBXcml0ZSBDdXJyZW50IElBQyBMQVAgKi8KLS8qIFdyaXRlIEN1cnJlbnQgSUFDIExBUCAqLwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2dldF9saW5rX3F1YWxpdHkodWludDE2X3QgaGFuZGxlKTsgLyogR2V0IExpbmsgUXVhbGl0eSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19yZWFkX3Jzc2kodWludDE2X3QgaGFuZGxlKTsgICAgICAgIC8qIFJlYWQgUlNTSSAqLwotdXNpbmcgUmVhZEVuY0tleVNpemVDYiA9IGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QsIHVpbnQxNl90LCB1aW50OF90KT47Ci1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfZW5jcnlwdGlvbl9rZXlfc2l6ZSh1aW50MTZfdCBoYW5kbGUsIFJlYWRFbmNLZXlTaXplQ2IgY2IpOwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXIodWludDE2X3QgaGFuZGxlKTsKLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dCh1aW50MTZfdCBoYW5kbGUpOwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19lbmFibGVfdGVzdF9tb2RlKAotICAgIHZvaWQpOyAvKiBFbmFibGUgRGV2aWNlIFVuZGVyIFRlc3QgTW9kZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9wYWdlc2Nhbl90eXBlKAotICAgIHVpbnQ4X3QgdHlwZSk7IC8qIFdyaXRlIFBhZ2UgU2NhbiBUeXBlICovCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3dyaXRlX2lucXNjYW5fdHlwZSgKLSAgICB1aW50OF90IHR5cGUpOyAvKiBXcml0ZSBJbnF1aXJ5IFNjYW4gVHlwZSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9pbnF1aXJ5X21vZGUoCi0gICAgdWludDhfdCB0eXBlKTsgLyogV3JpdGUgSW5xdWlyeSBNb2RlICovCi0KLS8qIEVuaGFuY2VkIHNldHVwIFNDTyBjb25uZWN0aW9uIChDU0EyKSAqLwotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19lbmhhbmNlZF9zZXRfdXBfc3luY2hyb25vdXNfY29ubmVjdGlvbigKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFybXMpOwotCi0vKiBFbmhhbmNlZCBhY2NlcHQgU0NPIGNvbm5lY3Rpb24gcmVxdWVzdCAoQ1NBMikgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfZW5oYW5jZWRfYWNjZXB0X3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgZW5oX2VzY29fcGFyYW1zX3QqIHBfcGFybXMpOwotCi0jZGVmaW5lIEhDSV9EQVRBX0hBTkRMRV9NQVNLIDB4MEZGRgotCi0jZGVmaW5lIEhDSURfR0VUX0hBTkRMRV9FVkVOVChwKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgKHVpbnQxNl90KSgoKigodWludDhfdCopKChwKSArIDEpICsgKHApLT5vZmZzZXQpICsgXAotICAgICAgICAgICAgICAoKigodWludDhfdCopKChwKSArIDEpICsgKHApLT5vZmZzZXQgKyAxKSA8PCA4KSkpCi0KLSNkZWZpbmUgSENJRF9HRVRfSEFORExFKHUxNikgKHVpbnQxNl90KSgodTE2KSZIQ0lfREFUQV9IQU5ETEVfTUFTSykKLQotI2RlZmluZSBIQ0lfREFUQV9FVkVOVF9NQVNLIDMKLSNkZWZpbmUgSENJX0RBVEFfRVZFTlRfT0ZGU0VUIDEyCi0jZGVmaW5lIEhDSURfR0VUX0VWRU5UKHUxNikgXAotICAodWludDhfdCkoKCh1MTYpID4+IEhDSV9EQVRBX0VWRU5UX09GRlNFVCkgJiBIQ0lfREFUQV9FVkVOVF9NQVNLKQotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3ZlbmRvcl9zcGVjX2NtZCh2b2lkKiBidWZmZXIsIHVpbnQxNl90IG9wY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuLCB1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2NtZF9jcGx0X2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJMRSBDb21tYW5kcwotICogICAgICBOb3RlOiAibG9jYWxfY29udHJvbGxlcl9pZCIgaXMgZm9yIHRyYW5zcG9ydCwgbm90IGNvdW50ZWQgaW4gSENJCi0gKiAgICAgICAgICAgICBtZXNzYWdlIHNpemUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEhDSUNfQkxFX1JBTkRfRElfU0laRSA4Ci0KLSNkZWZpbmUgSENJQ19CTEVfQ0hOTF9NQVBfU0laRSA1Ci0jZGVmaW5lIEhDSUNfUEFSQU1fU0laRV9CTEVfUkVBRF9QSFkgMgotI2RlZmluZSBIQ0lDX1BBUkFNX1NJWkVfQkxFX1NFVF9QSFkgNwotCi0vKiBVTFAgSENJIGNvbW1hbmQgKi8KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9sb2NhbF91c2VkX2ZlYXQodWludDhfdCBmZWF0X3NldFs4XSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kb21fYWRkcihjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYWRkcik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3dyaXRlX2Fkdl9wYXJhbXMoCi0gICAgdWludDE2X3QgYWR2X2ludF9taW4sIHVpbnQxNl90IGFkdl9pbnRfbWF4LCB1aW50OF90IGFkdl90eXBlLAotICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZV9vd24sIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZV9kaXIsCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgZGlyZWN0X2JkYSwgdWludDhfdCBjaGFubmVsX21hcCwKLSAgICB1aW50OF90IGFkdl9maWx0ZXJfcG9saWN5KTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9hZHZfY2hubF90eF9wb3dlcih2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2Fkdl9kYXRhKHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIHBfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX3JzcF9kYXRhKHVpbnQ4X3QgZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3NjYW5fcnNwKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2Fkdl9lbmFibGUodWludDhfdCBhZHZfZW5hYmxlKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X3NjYW5fcGFyYW1zKHVpbnQ4X3Qgc2Nhbl90eXBlLCB1aW50MTZfdCBzY2FuX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzY2FuX3dpbiwgdWludDhfdCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX2ZpbHRlcl9wb2xpY3kpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfc2Nhbl9lbmFibGUodWludDhfdCBzY2FuX2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGR1cGxpY2F0ZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX2NyZWF0ZV9sbF9jb25uKAotICAgIHVpbnQxNl90IHNjYW5faW50LCB1aW50MTZfdCBzY2FuX3dpbiwgdWludDhfdCBpbml0X2ZpbHRlcl9wb2xpY3ksCi0gICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlX3BlZXIsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLAotICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZV9vd24sIHVpbnQxNl90IGNvbm5faW50X21pbiwgdWludDE2X3QgY29ubl9pbnRfbWF4LAotICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgIHVpbnQxNl90IG1heF9jZV9sZW4pOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9jcmVhdGVfY29ubl9jYW5jZWwodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfYWNjZXB0bGlzdF9zaXplKHZvaWQpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9jbGVhcl9hY2NlcHRsaXN0KAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfYWRkX2FjY2VwdGxpc3QoCi0gICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9yZW1vdmVfZnJvbV9hY2NlcHRsaXN0KAotICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfdXBkX2xsX2Nvbm5fcGFyYW1zKAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY29ubl9pbnRfbWluLCB1aW50MTZfdCBjb25uX2ludF9tYXgsCi0gICAgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9sZW4sCi0gICAgdWludDE2X3QgbWF4X2xlbik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9ob3N0X2NobmxfY2xhc3MoCi0gICAgdWludDhfdCBjaG5sX21hcFtIQ0lDX0JMRV9DSE5MX01BUF9TSVpFXSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfY2hubF9tYXAodWludDE2X3QgaGFuZGxlKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9yZW1vdGVfZmVhdCh1aW50MTZfdCBoYW5kbGUpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9lbmNyeXB0KHVpbnQ4X3QqIGtleSwgdWludDhfdCBrZXlfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwbGFpbl90ZXh0LCB1aW50OF90IHB0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9jbWRfY3BsdF9jYmFjayk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3JhbmQoYmFzZTo6Q2FsbGJhY2s8dm9pZChCVF9PQ1RFVDgpPiBjYik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3N0YXJ0X2VuYyh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByYW5kW0hDSUNfQkxFX1JBTkRfRElfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZWRpdiwgY29uc3QgT2N0ZXQxNiYgbHRrKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfbHRrX3JlcV9yZXBseSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IE9jdGV0MTYmIGx0ayk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX2x0a19yZXFfbmVnX3JlcGx5KHVpbnQxNl90IGhhbmRsZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfc3VwcG9ydGVkX3N0YXRlcyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfd3JpdGVfaG9zdF9zdXBwb3J0ZWQodWludDhfdCBsZV9ob3N0X3NwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2ltdWxfbGVfaG9zdF9zcHQpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9yZWFkX2hvc3Rfc3VwcG9ydGVkKHZvaWQpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9yZWNlaXZlcl90ZXN0KHVpbnQ4X3QgcnhfZnJlcSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3RyYW5zbWl0dGVyX3Rlc3QodWludDhfdCB0eF9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRlc3RfZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGF5bG9hZCk7Ci1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV90ZXN0X2VuZCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfcmNfcGFyYW1fcmVxX3JlcGx5KAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY29ubl9pbnRfbWluLCB1aW50MTZfdCBjb25uX2ludF9tYXgsCi0gICAgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgdWludDE2X3QgbWF4X2NlX2xlbik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3JjX3BhcmFtX3JlcV9uZWdfcmVwbHkodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlYXNvbik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9kYXRhX2xlbmd0aCh1aW50MTZfdCBjb25uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0eF9vY3RldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHhfdGltZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX2FkZF9kZXZpY2VfcmVzb2x2aW5nX2xpc3QodWludDhfdCBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIGlya19wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBpcmtfbG9jYWwpOwotCi1zdHJ1Y3Qgc2Nhbm5pbmdfcGh5X2NmZyB7Ci0gIHVpbnQ4X3Qgc2Nhbl90eXBlOwotICB1aW50MTZfdCBzY2FuX2ludDsKLSAgdWludDE2X3Qgc2Nhbl93aW47Ci19OwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfZXh0ZW5kZWRfc2Nhbl9wYXJhbXMoCi0gICAgdWludDhfdCBvd25fYWRkcmVzc190eXBlLCB1aW50OF90IHNjYW5uaW5nX2ZpbHRlcl9wb2xpY3ksCi0gICAgdWludDhfdCBzY2FubmluZ19waHlzLCBzY2FubmluZ19waHlfY2ZnKiBwaHlfY2ZnKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2V4dGVuZGVkX3NjYW5fZW5hYmxlKHVpbnQ4X3QgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdGVyX2R1cGxpY2F0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaW9kKTsKLQotc3RydWN0IEVYVF9DT05OX1BIWV9DRkcgewotICB1aW50MTZfdCBzY2FuX2ludDsKLSAgdWludDE2X3Qgc2Nhbl93aW47Ci0gIHVpbnQxNl90IGNvbm5faW50X21pbjsKLSAgdWludDE2X3QgY29ubl9pbnRfbWF4OwotICB1aW50MTZfdCBjb25uX2xhdGVuY3k7Ci0gIHVpbnQxNl90IHN1cF90aW1lb3V0OwotICB1aW50MTZfdCBtaW5fY2VfbGVuOwotICB1aW50MTZfdCBtYXhfY2VfbGVuOwotfTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfZXh0X2NyZWF0ZV9jb25uKHVpbnQ4X3QgaW5pdF9maWx0ZXJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWRkcl90eXBlX293biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkZHJfdHlwZV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVF9DT05OX1BIWV9DRkcqIHBoeV9jZmcpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9ybV9kZXZpY2VfcmVzb2x2aW5nX2xpc3QoCi0gICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlX3BlZXIsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X3ByaXZhY3lfbW9kZSh0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJpdmFjeV90eXBlKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3Qodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfcmVzb2x2YWJsZV9hZGRyX3BlZXIoCi0gICAgdWludDhfdCBhZGRyX3R5cGVfcGVlciwgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9yZWFkX3Jlc29sdmFibGVfYWRkcl9sb2NhbCgKLSAgICB1aW50OF90IGFkZHJfdHlwZV9wZWVyLCBjb25zdCBSYXdBZGRyZXNzJiBiZGFfcGVlcik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9hZGRyX3Jlc29sdXRpb25fZW5hYmxlKAotICAgIHVpbnQ4X3QgYWRkcl9yZXNvbHV0aW9uX2VuYWJsZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kX3ByaXZfYWRkcl90aW1lb3V0KHVpbnQxNl90IHJwYV90aW1vdXQpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfYXV0aGVudGljYXRlZF9wYXlsb2FkX3RvdXQodWludDE2X3QgaGFuZGxlKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY193cml0ZV9hdXRoZW50aWNhdGVkX3BheWxvYWRfdG91dCh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlYWRfaXNvX3R4X3N5bmMoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1zdHJ1Y3QgRVhUX0NJU19DRkcgewotICB1aW50OF90IGNpc19pZDsKLSAgdWludDE2X3QgbWF4X3NkdV9zaXplX210b3M7Ci0gIHVpbnQxNl90IG1heF9zZHVfc2l6ZV9zdG9tOwotICB1aW50OF90IHBoeV9tdG9zOwotICB1aW50OF90IHBoeV9zdG9tOwotICB1aW50OF90IHJ0bl9tdG9zOwotICB1aW50OF90IHJ0bl9zdG9tOwotfTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19zZXRfY2lnX3BhcmFtcygKLSAgICB1aW50OF90IGNpZ19pZCwgdWludDMyX3Qgc2R1X2l0dl9tdG9zLCB1aW50MzJfdCBzZHVfaXR2X3N0b20sIHVpbnQ4X3Qgc2NhLAotICAgIHVpbnQ4X3QgcGFja2luZywgdWludDhfdCBmcmFtaW5nLCB1aW50MTZfdCBtYXhfdHJhbnNfbGF0X3N0b20sCi0gICAgdWludDE2X3QgbWF4X3RyYW5zX2xhdF9tdG9zLCB1aW50OF90IGNpc19jbnQsIGNvbnN0IEVYVF9DSVNfQ0ZHKiBjaXNfY2ZnLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotc3RydWN0IEVYVF9DSVNfVEVTVF9DRkcgewotICB1aW50OF90IGNpc19pZDsKLSAgdWludDhfdCBuc2U7Ci0gIHVpbnQxNl90IG1heF9zZHVfc2l6ZV9tdG9zOwotICB1aW50MTZfdCBtYXhfc2R1X3NpemVfc3RvbTsKLSAgdWludDhfdCBtYXhfcGR1X210b3M7Ci0gIHVpbnQ4X3QgbWF4X3BkdV9zdG9tOwotICB1aW50OF90IHBoeV9tdG9zOwotICB1aW50OF90IHBoeV9zdG9tOwotICB1aW50OF90IGJuX210b3M7Ci0gIHVpbnQ4X3QgYm5fc3RvbTsKLX07Ci0KLXN0cnVjdCBFWFRfQ0lTX0NSRUFURV9DRkcgewotICB1aW50MTZfdCBjaXNfY29ubl9oYW5kbGU7Ci0gIHVpbnQxNl90IGFjbF9jb25uX2hhbmRsZTsKLX07Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2NpcygKLSAgICB1aW50OF90IG51bV9jaXMsIGNvbnN0IEVYVF9DSVNfQ1JFQVRFX0NGRyogY2lzX2NyZWF0ZV9jZmcsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3JlbW92ZV9jaWcoCi0gICAgdWludDhfdCBjaWdfaWQsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19hY2NlcHRfY2lzX3JlcSh1aW50MTZfdCBjb25uX2hhbmRsZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfcmVqX2Npc19yZXEoCi0gICAgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgcmVhc29uLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19yZXFfcGVlcl9zY2EodWludDE2X3QgY29ubl9oYW5kbGUpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2NyZWF0ZV9iaWcodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IGFkdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYmlzLCB1aW50MzJfdCBzZHVfaXR2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9zZHVfc2l6ZSwgdWludDE2X3QgbWF4X3RyYW5zX2xhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ0biwgdWludDhfdCBwaHksIHVpbnQ4X3QgcGFja2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZyYW1pbmcsIHVpbnQ4X3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGJjc3RfY29kZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfdGVybV9iaWcodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmlnX2NyZWF0ZV9zeW5jKHVpbnQ4X3QgYmlnX2hhbmRsZSwgdWludDE2X3Qgc3luY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGJjc3RfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbXNlLCB1aW50MTZfdCBiaWdfc3luY190aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYmlzKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19iaWdfdGVybV9zeW5jKAotICAgIHVpbnQ4X3QgYmlnX2hhbmRsZSwgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX3NldHVwX2lzb19kYXRhX3BhdGgoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyLCB1aW50OF90IGRhdGFfcGF0aF9pZCwKLSAgICB1aW50OF90IGNvZGVjX2lkX2Zvcm1hdCwgdWludDE2X3QgY29kZWNfaWRfY29tcGFueSwKLSAgICB1aW50MTZfdCBjb2RlY19pZF92ZW5kb3IsIHVpbnQzMl90IGNvbnRyb2xsZXJfZGVsYXksCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfY29uZiwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfcmVtb3ZlX2lzb19kYXRhX3BhdGgoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19yZWFkX2lzb19saW5rX3F1YWxpdHkoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19jcmVhdGVfc3luYygKLSAgICB1aW50OF90IG9wdGlvbnMsIHVpbnQ4X3QgYWR2X3NpZCwgdWludDhfdCBhZHZfYWRkcl90eXBlLAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkdl9hZGRyLCB1aW50MTZfdCBza2lwX251bSwgdWludDE2X3Qgc3luY190aW1lb3V0LAotICAgIHVpbnQ4X3Qgc3luY19jdGVfdHlwZSk7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX2NyZWF0ZV9zeW5jX2NhbmNlbCgKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3Rlcm1pbmF0ZV9zeW5jKAotICAgIHVpbnQxNl90IHN5bmNfaGFuZGxlLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaV9ibGVfYWRkX2RldmljZV90b19wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3QoCi0gICAgdWludDhfdCBhZHZfYWRkcl90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBhZHZfYWRkciwgdWludDhfdCBhZHZfc2lkLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpX2JsZV9yZW1vdmVfZGV2aWNlX2Zyb21fcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgIHVpbnQ4X3QgYWR2X2FkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYWR2X2FkZHIsIHVpbnQ4X3QgYWR2X3NpZCwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaV9ibGVfY2xlYXJfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpX2JsZV9yZWFkX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplKAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X3BlcmlvZGljX2FkdmVydGlzaW5nX3JlY2VpdmVfZW5hYmxlKAotICAgIHVpbnQxNl90IHN5bmNfaGFuZGxlLCBib29sIGVuYWJsZSwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYik7Ci0KLWV4dGVybiB2b2lkIGJ0c25kX2hjaWNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXIoCi0gICAgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQxNl90IHNlcnZpY2VfZGF0YSwgdWludDE2X3Qgc3luY19oYW5kbGUsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zZXRfaW5mb190cmFuc2ZlcigKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDE2X3Qgc2VydmljZV9kYXRhLCB1aW50OF90IGFkdl9oYW5kbGUsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpOwotCi1leHRlcm4gdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9wYXJhbXMoCi0gICAgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgbW9kZSwgdWludDE2X3Qgc2tpcCwgdWludDE2X3Qgc3luY190aW1lb3V0LAotICAgIHVpbnQ4X3QgY3RlX3R5cGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKTsKLQotZXh0ZXJuIHZvaWQKLWJ0c25kX2hjaWNfYmxlX3NldF9kZWZhdWx0X3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcGFyYW1zKAotICAgIHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IG1vZGUsIHVpbnQxNl90IHNraXAsIHVpbnQxNl90IHN5bmNfdGltZW91dCwKLSAgICB1aW50OF90IGN0ZV90eXBlLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9oaWRkX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9oaWRkX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWJkY2ZjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvaGlkZF9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqICBDb3B5cmlnaHQgMjAwMi0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgSElERF9BUElfSAotI2RlZmluZSBISUREX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hpZGRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBUeXBlIERlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZW51bSB7IEhJRF9DSEFOTkVMX0lOVFIsIEhJRF9DSEFOTkVMX0NUUkwgfTsKLQotLyoKLSAgICBISURfREhPU1RfRVZUX09QRU4gIC0gY29ubmVjdGVkIHRvIGhvc3QgZGV2aWNlIChDVFJMIGFuZCBJTlRSKSwgZGF0YSA9IG4vYQotICAgIEhJRF9ESE9TVF9FVlRfQ0xPU0UgLSBkaXNjb25uZWN0ZWQgZnJvbSBob3N0IGRldmljZSwgZGF0YT1yZWFzb24KLSAgICBISURfREhPU1RfRVZUX0dFVF9SRVBPUlQgLSBnb3QgR0VUX1JFUE9SVCBmcm9tIGhvc3QKLSAgICBISURfREhPU1RfRVZUX1NFVF9SRVBPUlQgLSBnb3QgU0VUX1JFUE9SVCBmcm9tIGhvc3QKLSAgICBISURfREhPU1RfRVZUX1NFVF9QUk9UT0NPTCAtIGdvdCBTRVRfUFJPVE9DT0wgZnJvbSBob3N0Ci0qLwotCi1lbnVtIHsKLSAgSElEX0RIT1NUX0VWVF9PUEVOLAotICBISURfREhPU1RfRVZUX0NMT1NFLAotICBISURfREhPU1RfRVZUX0dFVF9SRVBPUlQsCi0gIEhJRF9ESE9TVF9FVlRfU0VUX1JFUE9SVCwKLSAgSElEX0RIT1NUX0VWVF9TRVRfUFJPVE9DT0wsCi0gIEhJRF9ESE9TVF9FVlRfSU5UUl9EQVRBLAotICBISURfREhPU1RfRVZUX1ZDX1VOUExVRywKLSAgSElEX0RIT1NUX0VWVF9TVVNQRU5ELAotICBISURfREhPU1RfRVZUX0VYSVRfU1VTUEVORCwKLX07Ci10eXBlZGVmIHZvaWQodEhJRF9ERVZfSE9TVF9DQUxMQkFDSykoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLCBCVF9IRFIqIHBfYnVmKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZJbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplcyBjb250cm9sIGJsb2NrCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIEhJRF9EZXZJbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldlJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZWdpc3RlcnMgSElEIGRldmljZSB3aXRoIGxvd2VyIGxheWVycwotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfU1RBVFVTIEhJRF9EZXZSZWdpc3Rlcih0SElEX0RFVl9IT1NUX0NBTExCQUNLKiBob3N0X2NiYWNrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZEZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEZXJlZ2lzdGVycyBISUQgZGV2aWNlIHdpdGggbG93ZXIgbGF5ZXJzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0RldkRlcmVnaXN0ZXIodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2QWRkUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDcmVhdGVzIFNEUCByZWNvcmQgZm9yIEhJRCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfRGV2QWRkUmVjb3JkKHVpbnQzMl90IGhhbmRsZSwgY2hhciogcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9kZXNjcmlwdGlvbiwgY2hhciogcF9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1YmNsYXNzLCB1aW50MTZfdCBkZXNjX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGVzY19kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZTZW5kUmVwb3J0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyByZXBvcnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfRGV2U2VuZFJlcG9ydCh1aW50OF90IGNoYW5uZWwsIHVpbnQ4X3QgdHlwZSwgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHBfZGF0YSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2VmlydHVhbENhYmxlVW5wbHVnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kcyBWaXJ0dWFsIENhYmxlIFVucGx1ZwotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfU1RBVFVTIEhJRF9EZXZWaXJ0dWFsQ2FibGVVbnBsdWcodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2UGx1Z0RldmljZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgRXN0YWJsaXNoZXMgdmlydHVhbCBjYWJsZSB0byBnaXZlbiBob3N0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0RldlBsdWdEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2VW5wbHVnRGV2aWNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVbnBsdWdzIHZpcnR1YWwgY2FibGUgZnJvbSBnaXZlbiBob3N0Ci0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0RldlVucGx1Z0RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZDb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBDb25uZWN0cyB0byBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfRGV2Q29ubmVjdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZEaXNjb25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjb25uZWN0cyBmcm9tIGRldmljZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfU1RBVFVTIEhJRF9EZXZEaXNjb25uZWN0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldlNldEluY29taW5nUG9saWN5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIHBvbGljeSBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgKGFsbG93ZWQvZGlzYWxsb3dlZCkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfRGV2U2V0SW5jb21pbmdQb2xpY3koYm9vbCBhbGxvdyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2UmVwb3J0RXJyb3IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlcG9ydHMgZXJyb3IgZm9yIFNldCBSZXBvcnQgdmlhIEhBTkRTSEFLRQotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfU1RBVFVTIEhJRF9EZXZSZXBvcnRFcnJvcih1aW50OF90IGVycm9yKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZHZXREZXZpY2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJldHVybnMgdGhlIEJEIEFkZHJlc3Mgb2YgdmlydHVhbGx5IGNhYmxlZCBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfRGV2R2V0RGV2aWNlKFJhd0FkZHJlc3MqIGFkZHIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0RldlNldEluY29taW5nUW9zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIEluY29taW5nIFFvUyB2YWx1ZXMgZm9yIEludGVycnVwdCBMMkNBUCBDaGFubmVsCi0gKgotICogUmV0dXJucyAgICAgICAgICB0SElEX1NUQVRVUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0RldlNldEluY29taW5nUW9zKAotICAgIHVpbnQ4X3Qgc2VydmljZV90eXBlLCB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwgdWludDMyX3QgbGF0ZW5jeSwgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9EZXZTZXRPdXRnb2luZ1FvcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0cyBPdXRnb2luZyBRb1MgdmFsdWVzIGZvciBJbnRlcnJ1cHQgTDJDQVAgQ2hhbm5lbAotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfU1RBVFVTIEhJRF9EZXZTZXRPdXRnb2luZ1FvcygKLSAgICB1aW50OF90IHNlcnZpY2VfdHlwZSwgdWludDMyX3QgdG9rZW5fcmF0ZSwgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUsCi0gICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGxhdGVuY3ksIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfRGV2U2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgSElEIERldi4gSWYgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggYSB2YWx1ZSBvZiAweEZGLCBpdCBzaW1wbHkgcmVhZHMgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgbmV3IChjdXJyZW50KSB0cmFjZSBsZXZlbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDhfdCBISURfRGV2U2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBISUREX0FQSV9IICovCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2hpZGRlZnMuaCBiL3N0YWNrL2luY2x1ZGUvaGlkZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmQ3OGY5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvaGlkZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIEhJRCBwcm90b2NvbCBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSElEREVGU19ICi0jZGVmaW5lIEhJRERFRlNfSAotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotLyoKLSAqIHRISURfU1RBVFVTOiBISUQgcmVzdWx0IGNvZGVzLCByZXR1cm5lZCBieSBISUQgYW5kIGRldmljZSBhbmQgaG9zdCBmdW5jdGlvbnMuCi0qLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEhJRF9TVUNDRVNTID0gMCwKLSAgSElEX0VSUl9OT1RfUkVHSVNURVJFRCwKLSAgSElEX0VSUl9BTFJFQURZX1JFR0lTVEVSRUQsCi0gIEhJRF9FUlJfTk9fUkVTT1VSQ0VTLAotICBISURfRVJSX05PX0NPTk5FQ1RJT04sCi0gIEhJRF9FUlJfSU5WQUxJRF9QQVJBTSwKLSAgSElEX0VSUl9VTlNVUFBPUlRFRCwKLSAgSElEX0VSUl9VTktOT1dOX0NPTU1BTkQsCi0gIEhJRF9FUlJfQ09OR0VTVEVELAotICBISURfRVJSX0NPTk5fSU5fUFJPQ0VTUywKLSAgSElEX0VSUl9BTFJFQURZX0NPTk4sCi0gIEhJRF9FUlJfRElTQ09OTkVDVElORywKLSAgSElEX0VSUl9TRVRfQ09OTkFCTEVfRkFJTCwKLSAgLyogRGV2aWNlIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0gIEhJRF9FUlJfSE9TVF9VTktOT1dOLAotICBISURfRVJSX0wyQ0FQX0ZBSUxFRCwKLSAgSElEX0VSUl9BVVRIX0ZBSUxFRCwKLSAgSElEX0VSUl9TRFBfQlVTWSwKLSAgSElEX0VSUl9HQVRULAotCi0gIEhJRF9FUlJfSU5WQUxJRCA9IDB4RkYKLX0gdEhJRF9TVEFUVVM7Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgaGlkX3N0YXR1c190ZXh0KGNvbnN0IHRISURfU1RBVFVTJiBzdGF0dXMpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9TVUNDRVNTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfTk9UX1JFR0lTVEVSRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX0VSUl9BTFJFQURZX1JFR0lTVEVSRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX0VSUl9OT19SRVNPVVJDRVMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX0VSUl9OT19DT05ORUNUSU9OKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfSU5WQUxJRF9QQVJBTSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChISURfRVJSX1VOU1VQUE9SVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfVU5LTk9XTl9DT01NQU5EKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfQ09OR0VTVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfQ09OTl9JTl9QUk9DRVNTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfQUxSRUFEWV9DT05OKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfRElTQ09OTkVDVElORyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChISURfRVJSX1NFVF9DT05OQUJMRV9GQUlMKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfSE9TVF9VTktOT1dOKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfTDJDQVBfRkFJTEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKEhJRF9FUlJfQVVUSF9GQUlMRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX0VSUl9TRFBfQlVTWSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChISURfRVJSX0dBVFQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX0VSUl9JTlZBTElEKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOWyVoaHVdIiwgc3RhdHVzKTsKLSAgfQotfQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLQotI2RlZmluZSBISURfTDJDQVBfQ09OTl9GQUlMIFwKLSAgKDB4MDEwMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gQXR0ZW1wdCB3YXMgbWFkZSBidXQgZmFpbGVkICovCi0jZGVmaW5lIEhJRF9MMkNBUF9SRVFfRkFJTCAoMHgwMjAwKSAvKiBMMkNBUF9Db25uZWN0UmVxIEFQSSBmYWlsZWQgKi8KLSNkZWZpbmUgSElEX0wyQ0FQX0NGR19GQUlMIFwKLSAgKDB4MDQwMCkgLyogTDJDQVAgQ29uZmlndXJhdGlvbiB3YXMgcmVqZWN0ZWQgYnkgcGVlciAqLwotCi0vKiBEZWZpbmUgdGhlIEhJRCB0cmFuc2FjdGlvbiB0eXBlcwotKi8KLSNkZWZpbmUgSElEX1RSQU5TX0hBTkRTSEFLRSAoMCkKLSNkZWZpbmUgSElEX1RSQU5TX0NPTlRST0wgKDEpCi0jZGVmaW5lIEhJRF9UUkFOU19HRVRfUkVQT1JUICg0KQotI2RlZmluZSBISURfVFJBTlNfU0VUX1JFUE9SVCAoNSkKLSNkZWZpbmUgSElEX1RSQU5TX0dFVF9QUk9UT0NPTCAoNikKLSNkZWZpbmUgSElEX1RSQU5TX1NFVF9QUk9UT0NPTCAoNykKLSNkZWZpbmUgSElEX1RSQU5TX0dFVF9JRExFICg4KQotI2RlZmluZSBISURfVFJBTlNfU0VUX0lETEUgKDkpCi0jZGVmaW5lIEhJRF9UUkFOU19EQVRBICgxMCkKLSNkZWZpbmUgSElEX1RSQU5TX0RBVEFDICgxMSkKLQotI2RlZmluZSBISURfR0VUX1RSQU5TX0ZST01fSERSKHgpICgoKHgpID4+IDQpICYgMHgwZikKLSNkZWZpbmUgSElEX0dFVF9QQVJBTV9GUk9NX0hEUih4KSAoKHgpJjB4MGYpCi0jZGVmaW5lIEhJRF9CVUlMRF9IRFIodCwgcCkgKHVpbnQ4X3QpKCgodCkgPDwgNCkgfCAoKHApJjB4MGYpKQotCi0vKiBQYXJhbWV0ZXJzIGZvciBIYW5kc2hha2UKLSovCi0jZGVmaW5lIEhJRF9QQVJfSEFORFNIQUtFX1JTUF9TVUNDRVNTICgwKQotI2RlZmluZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfTk9UX1JFQURZICgxKQotI2RlZmluZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX0lOVkFMSURfUkVQX0lEICgyKQotI2RlZmluZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX1VOU1VQUE9SVEVEX1JFUSAoMykKLSNkZWZpbmUgSElEX1BBUl9IQU5EU0hBS0VfUlNQX0VSUl9JTlZBTElEX1BBUkFNICg0KQotI2RlZmluZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX1VOS05PV04gKDE0KQotI2RlZmluZSBISURfUEFSX0hBTkRTSEFLRV9SU1BfRVJSX0ZBVEFMICgxNSkKLQotLyogUGFyYW1ldGVycyBmb3IgQ29udHJvbAotKi8KLSNkZWZpbmUgSElEX1BBUl9DT05UUk9MX05PUCAoMCkKLSNkZWZpbmUgSElEX1BBUl9DT05UUk9MX0hBUkRfUkVTRVQgKDEpCi0jZGVmaW5lIEhJRF9QQVJfQ09OVFJPTF9TT0ZUX1JFU0VUICgyKQotI2RlZmluZSBISURfUEFSX0NPTlRST0xfU1VTUEVORCAoMykKLSNkZWZpbmUgSElEX1BBUl9DT05UUk9MX0VYSVRfU1VTUEVORCAoNCkKLSNkZWZpbmUgSElEX1BBUl9DT05UUk9MX1ZJUlRVQUxfQ0FCTEVfVU5QTFVHICg1KQotCi0vKiBEaWZmZXJlbnQgcmVwb3J0IHR5cGVzIGluIGdldCwgc2V0LCBkYXRhCi0qLwotI2RlZmluZSBISURfUEFSX1JFUF9UWVBFX01BU0sgKDB4MDMpCi0jZGVmaW5lIEhJRF9QQVJfUkVQX1RZUEVfT1RIRVIgKDB4MDApCi0jZGVmaW5lIEhJRF9QQVJfUkVQX1RZUEVfSU5QVVQgKDB4MDEpCi0jZGVmaW5lIEhJRF9QQVJfUkVQX1RZUEVfT1VUUFVUICgweDAyKQotI2RlZmluZSBISURfUEFSX1JFUF9UWVBFX0ZFQVRVUkUgKDB4MDMpCi0KLS8qIFBhcmFtZXRlcnMgZm9yIEdldCBSZXBvcnQKLSovCi0KLS8qIEJ1ZmZlciBzaXplIGluIHR3byBieXRlcyBhZnRlciBSZXBvcnQgSUQgKi8KLSNkZWZpbmUgSElEX1BBUl9HRVRfUkVQX0JVRlNJWkVfRk9MTE9XUyAoMHgwOCkKLQotLyogUGFyYW1ldGVycyBmb3IgUHJvdG9jb2wgVHlwZQotKi8KLSNkZWZpbmUgSElEX1BBUl9QUk9UT0NPTF9NQVNLICgweDAxKQotI2RlZmluZSBISURfUEFSX1BST1RPQ09MX1JFUE9SVCAoMHgwMSkKLSNkZWZpbmUgSElEX1BBUl9QUk9UT0NPTF9CT09UX01PREUgKDB4MDApCi0KLSNkZWZpbmUgSElEX1BBUl9SRVBfVFlQRV9NQVNLICgweDAzKQotCi0vKiBEZXNjcmlwdG9yIHR5cGVzIGluIHRoZSBTRFAgcmVjb3JkCi0qLwotI2RlZmluZSBISURfU0RQX0RFU0NSSVBUT1JfUkVQT1JUICgweDIyKQotI2RlZmluZSBISURfU0RQX0RFU0NSSVBUT1JfUEhZU0lDQUwgKDB4MjMpCi0KLXR5cGVkZWYgc3RydWN0IGRlc2NfaW5mbyB7Ci0gIHVpbnQxNl90IGRsX2xlbjsKLSAgdWludDhfdCogZHNjX2xpc3Q7Ci19IHRISURfREVWX0RTQ1BfSU5GTzsKLQotI2RlZmluZSBISURfU1NSX1BBUkFNX0lOVkFMSUQgMHhmZmZmCi0KLSNkZWZpbmUgSElERF9BUFBfREVTQ1JJUFRPUl9MRU4gMjA0OAotCi10eXBlZGVmIHN0cnVjdCBzZHBfaW5mbyB7Ci0gIGNoYXIgc3ZjX25hbWVbSElEX01BWF9TVkNfTkFNRV9MRU5dOyAgIC8qU2VydmljZSBOYW1lICovCi0gIGNoYXIgc3ZjX2Rlc2NyW0hJRF9NQVhfU1ZDX0RFU0NSX0xFTl07IC8qU2VydmljZSBEZXNjcmlwdGlvbiovCi0gIGNoYXIgcHJvdl9uYW1lW0hJRF9NQVhfUFJPVl9OQU1FX0xFTl07IC8qUHJvdmlkZXIgTmFtZS4qLwotICB1aW50MTZfdCByZWxfbnVtOyAgICAgICAgICAgICAgICAgICAgICAvKlJlbGVhc2UgTnVtYmVyICovCi0gIHVpbnQxNl90IGhwYXJzX3ZlcjsgICAgICAgICAgICAgICAgICAgIC8qSElEIFBhcnNlciBWZXJzaW9uLiovCi0gIHVpbnQxNl90IHNzcl9tYXhfbGF0ZW5jeTsgICAgICAgICAgICAgIC8qIEhJRFNTUkhvc3RNYXhMYXRlbmN5IHZhbHVlLCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURfU1NSX1BBUkFNX0lOVkFMSUQgbm90IHVzZWQqLwotICB1aW50MTZfdAotICAgICAgc3NyX21pbl90b3V0OyAgLyogSElEU1NSSG9zdE1pblRpbWVvdXQgdmFsdWUsIGlmIEhJRF9TU1JfUEFSQU1fSU5WQUxJRCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQqICovCi0gIHVpbnQ4X3Qgc3ViX2NsYXNzOyAvKkRldmljZSBTdWJjbGFzcy4qLwotICB1aW50OF90IGN0cnlfY29kZTsgLypDb3VudHJ5IENvZGUuKi8KLSAgdWludDE2X3Qgc3VwX3RpbWVvdXQ7IC8qIFN1cGVydmlzb3J5IFRpbWVvdXQgKi8KLQotICB0SElEX0RFVl9EU0NQX0lORk8gZHNjcF9pbmZvOyAvKiBEZXNjcmlwdG9yIGxpc3QgYW5kIFJlcG9ydCBsaXN0IHRvIGJlIHNldCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTRFAgcmVjb3JkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURfREVWX1VTRV9HTEJfU0RQX1JFQyBpcyBzZXQgdG8gZmFsc2UuKi8KLSAgdFNEUF9ESVNDX1JFQyogcF9zZHBfbGF5ZXJfcmVjOwotfSB0SElEX0RFVl9TRFBfSU5GTzsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2hpZGhfYXBpLmggYi9zdGFjay9pbmNsdWRlL2hpZGhfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzBmZTYuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9oaWRoX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDItMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEhJREhfQVBJX0gKLSNkZWZpbmUgSElESF9BUElfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oaWRkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQXR0cmlidXRlcyBtYXNrIHZhbHVlcyB0byBiZSB1c2VkIGluIEhJRF9Ib3N0QWRkRGV2IEFQSSAqLwotI2RlZmluZSBISURfVklSVFVBTF9DQUJMRSAweDAwMDEKLSNkZWZpbmUgSElEX05PUk1BTExZX0NPTk5FQ1RBQkxFIDB4MDAwMgotI2RlZmluZSBISURfUkVDT05OX0lOSVQgMHgwMDA0Ci0jZGVmaW5lIEhJRF9TRFBfRElTQUJMRSAweDAwMDgKLSNkZWZpbmUgSElEX0JBVFRFUllfUE9XRVIgMHgwMDEwCi0jZGVmaW5lIEhJRF9SRU1PVEVfV0FLRSAweDAwMjAKLSNkZWZpbmUgSElEX1NVUF9UT1VUX0FWTEJMIDB4MDA0MAotI2RlZmluZSBISURfU1NSX01BWF9MQVRFTkNZIDB4MDA4MAotI2RlZmluZSBISURfU1NSX01JTl9UT1VUIDB4MDEwMAotCi0jZGVmaW5lIEhJRF9TRUNfUkVRVUlSRUQgMHg4MDAwCi0jZGVmaW5lIEhJRF9BVFRSX01BU0tfSUdOT1JFIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBEZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgdm9pZCh0SElEX0hPU1RfU0RQX0NBTExCQUNLKSh1aW50MTZfdCByZXN1bHQsIHVpbnQxNl90IGF0dHJfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SElEX0RFVl9TRFBfSU5GTyogc2RwX3JlYyk7Ci0KLS8qIEhJRC1IT1NUIHJldHVybnMgdGhlIGV2ZW50cyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEKLSAqIHRISURfSE9TVF9ERVZfQ0FMTEJBQ0sKLSAqIEhJRF9IREVWX0VWVF9PUEVOICBDb25uZWN0ZWQgdG8gZGV2aWNlIHdpdGggSW50ZXJydXB0IGFuZCBDb250cm9sIENoYW5uZWxzCi0gKiAgICAgICAgICAgICAgICAgICAgaW4gT1BFTiBzdGF0ZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IE5BCi0gKiBISURfSERFVl9FVlRfQ0xPU0UgQ29ubmVjdGlvbiB3aXRoIGRldmljZSBpcyBjbG9zZWQuIERhdGEgPSByZWFzb24gY29kZS4KLSAqIEhJRF9IREVWX0VWVF9SRVRSWUlORyAgIExvc3QgY29ubmVjdGlvbiBpcyBiZWluZyByZS1jb25uZWN0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBSZXRyaWFsIG51bWJlcgotICogSElEX0hERVZfRVZUX0lOX1JFUE9SVCAgRGV2aWNlIHNlbnQgYW4gaW5wdXQgcmVwb3J0ICBEYXRhID0gUmVwb3J0IFR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRhdGEgPSBwb2ludGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHS0kgYnVmZmVyIHdpdGggcmVwb3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLikKLSAqIEhJRF9IREVWX0VWVF9IQU5EU0hBS0UgIERldmljZSBzZW50IFNFVF9SRVBPUlQgICAgICAgRGF0YSA9IFJlc3VsdC1jb2RlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkYXRhID0gTkEuCi0gKiBISURfSERFVl9FVlRfVkNfVU5QTFVHICBEZXZpY2Ugc2VudCBWaXJ0dWFsIFVucGx1ZyAgIERhdGEgPSBOQS4gcGRhdGEgPSBOQS4KLSAqLwotCi1lbnVtIHsKLSAgSElEX0hERVZfRVZUX09QRU4sCi0gIEhJRF9IREVWX0VWVF9DTE9TRSwKLSAgSElEX0hERVZfRVZUX1JFVFJZSU5HLAotICBISURfSERFVl9FVlRfSU5UUl9EQVRBLAotICBISURfSERFVl9FVlRfSU5UUl9EQVRDLAotICBISURfSERFVl9FVlRfQ1RSTF9EQVRBLAotICBISURfSERFVl9FVlRfQ1RSTF9EQVRDLAotICBISURfSERFVl9FVlRfSEFORFNIQUtFLAotICBISURfSERFVl9FVlRfVkNfVU5QTFVHCi19OwotdHlwZWRlZiB2b2lkKHRISURfSE9TVF9ERVZfQ0FMTEJBQ0spKAotICAgIHVpbnQ4X3QgZGV2X2hhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICB1aW50OF90IGV2ZW50LCAgLyogRXZlbnQgZnJvbSBISUQtREVWSUNFLiAqLwotICAgIHVpbnQzMl90IGRhdGEsICAvKiBJbnRlZ2VyIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgZXZlbnQuKi8KLSAgICBCVF9IRFIqIHBfYnVmKTsgLyogUG9pbnRlciBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV2ZW50LiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RHZXRTRFBSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGRldmljZSBTRFAgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdEhJRF9TVEFUVVMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRISURfU1RBVFVTIEhJRF9Ib3N0R2V0U0RQUmVjb3JkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRISURfSE9TVF9TRFBfQ0FMTEJBQ0sqIHNkcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdFJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBISUQtSG9zdCB3aXRoIGxvd2VyIGxheWVycy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfSG9zdFJlZ2lzdGVyKHRISURfSE9TVF9ERVZfQ0FMTEJBQ0sqIGRldl9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdERlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhvc3QgaXMgYWJvdXQgcG93ZXIgZG93bi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfSG9zdERlcmVnaXN0ZXIodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdEFkZERldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBjYWxsZWQgc28gSElELWhvc3QgbWF5IG1hbmFnZSB0aGlzIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfSG9zdEFkZERldihjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50MTZfdCBhdHRyX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEhJRF9Ib3N0UmVtb3ZlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBSZW1vdmVzIHRoZSBkZXZpY2UgZnJvbSB0aGUgbGlzdCBvZiBkZXZpY2VzIHRoYXQgdGhlIGhvc3QKLSAqICAgICAgICAgICAgICAgICAgaGFzIHRvIG1hbmFnZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRISURfU1RBVFVTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0SElEX1NUQVRVUyBISURfSG9zdFJlbW92ZURldih1aW50OF90IGRldl9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RPcGVuRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIGluaXRpYXRlIGEKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhdHRlbXB0IHRvIGEgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0hvc3RPcGVuRGV2KHVpbnQ4X3QgZGV2X2hhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdFdyaXRlRGV2Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBob3N0IGhhcyBhIHJlcG9ydCB0byBzZW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0hvc3RXcml0ZURldih1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3QgdF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXJhbSwgdWludDE2X3QgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVwb3J0X2lkLCBCVF9IRFIqIHBidWYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RDbG9zZURldgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBkaXNjb25uZWN0cyB0aGUgZGV2aWNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhJRF9TVEFUVVMgSElEX0hvc3RDbG9zZURldih1aW50OF90IGRldl9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBISURfSG9zdEluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgYmxvY2sgYW5kIHRyYWNlIHZhcmlhYmxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgSElEX0hvc3RJbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgSElEX0hvc3RTZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgdGhlIHRyYWNlIGxldmVsIGZvciBISUQgSG9zdC4gSWYgY2FsbGVkIHdpdGggdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgIDB4RkYsIGl0IHNpbXBseSByZWFkcyB0aGUgY3VycmVudCB0cmFjZSBsZXZlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBuZXcgKGN1cnJlbnQpIHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50OF90IEhJRF9Ib3N0U2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCk7Ci0KLSNlbmRpZiAvKiBISURIX0FQSV9IICovCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2lucV9oY2lfbGlua19pbnRlcmZhY2UuaCBiL3N0YWNrL2luY2x1ZGUvaW5xX2hjaV9saW5rX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdmZDA4Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvaW5xX2hjaV9saW5rX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gdm9pZCBidG1fcHJvY2Vzc19yZW1vdGVfbmFtZShjb25zdCBSYXdBZGRyZXNzKiBiZGEsIEJEX05BTUUgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4sIHVpbnQ4X3QgaGNpX3N0YXR1cyk7Ci0KLWV4dGVybiB2b2lkIGJ0bV9wcm9jZXNzX2lucV9yZXN1bHRzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgaGNpX2V2dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlucV9yZXNfbW9kZSk7Ci0KLWV4dGVybiB2b2lkIGJ0bV9wcm9jZXNzX2lucV9jb21wbGV0ZSh1aW50OF90IHN0YXR1cywgdWludDhfdCBtb2RlKTsKLWV4dGVybiB2b2lkIGJ0bV9wcm9jZXNzX2NhbmNlbF9jb21wbGV0ZSh1aW50OF90IHN0YXR1cywgdWludDhfdCBtb2RlKTsKLQotZXh0ZXJuIHZvaWQgYnRtX2FjbF9wcm9jZXNzX3NjYV9jbXBsX3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogZGF0YSk7Ci1leHRlcm4gdElOUV9EQl9FTlQqIGJ0bV9pbnFfZGJfbmV3KGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9sMmNfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDIxY2UuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9sMmNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgdGhlIEwyQ0FQIEFQSSBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEwyQ19BUElfSAotI2RlZmluZSBMMkNfQVBJX0gKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiaGNpZGVmcy5oIgotI2luY2x1ZGUgImwyY2RlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGVmaW5lIHRoZSBtaW5pbXVtIG9mZnNldCB0aGF0IEwyQ0FQIG5lZWRzIGluIGEgYnVmZmVyLiBUaGlzIGlzIG1hZGUgdXAgb2YKLSAqIEhDSSB0eXBlKDEpLCBsZW4oMiksIGhhbmRsZSgyKSwgTDJDQVAgbGVuKDIpIGFuZCBDSUQoMikgPT4gOQotICovCi0jZGVmaW5lIEwyQ0FQX01JTl9PRkZTRVQgMTMgLyogcGx1cyBjb250cm9sKDIpLCBTRFUgbGVuZ3RoKDIpICovCi0KLSNkZWZpbmUgTDJDQVBfTENDX1NEVV9MRU5HVEggMgotI2RlZmluZSBMMkNBUF9MQ0NfT0ZGU0VUIFwKLSAgKEwyQ0FQX01JTl9PRkZTRVQgKyBMMkNBUF9MQ0NfU0RVX0xFTkdUSCkgLyogcGx1cyBTRFUgbGVuZ3RoKDIpICovCi0KLSNkZWZpbmUgTDJDQVBfRkNTX0xFTkdUSCAyCi0KLS8qIHJlc3VsdCBjb2RlIGZvciBMMkNBX0RhdGFXcml0ZSgpICovCi0jZGVmaW5lIEwyQ0FQX0RXX0ZBSUxFRCBmYWxzZQotI2RlZmluZSBMMkNBUF9EV19TVUNDRVNTIHRydWUKLSNkZWZpbmUgTDJDQVBfRFdfQ09OR0VTVEVEIDIKLQotLyogVmFsdWVzIGZvciBwcmlvcml0eSBwYXJhbWV0ZXIgdG8gTDJDQV9TZXRBY2xQcmlvcml0eSAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEwyQ0FQX1BSSU9SSVRZX05PUk1BTCA9IDAsCi0gIEwyQ0FQX1BSSU9SSVRZX0hJR0ggPSAxLAotfSB0TDJDQVBfUFJJT1JJVFk7Ci0KLS8qIFZhbHVlcyBmb3IgcHJpb3JpdHkgcGFyYW1ldGVyIHRvIEwyQ0FfU2V0VHhQcmlvcml0eSAqLwotI2RlZmluZSBMMkNBUF9DSE5MX1BSSU9SSVRZX0hJR0ggMAotI2RlZmluZSBMMkNBUF9DSE5MX1BSSU9SSVRZX0xPVyAyCi0KLXR5cGVkZWYgdWludDhfdCB0TDJDQVBfQ0hOTF9QUklPUklUWTsKLQotLyogVmFsdWVzIGZvciBUeC9SeCBkYXRhIHJhdGUgcGFyYW1ldGVyIHRvIEwyQ0FfU2V0Q2hubERhdGFSYXRlICovCi0jZGVmaW5lIEwyQ0FQX0NITkxfREFUQV9SQVRFX0xPVyAxCi0KLXR5cGVkZWYgdWludDhfdCB0TDJDQVBfQ0hOTF9EQVRBX1JBVEU7Ci0KLS8qIERhdGEgUGFja2V0IEZsYWdzICAoYml0cyAyLTE1IGFyZSByZXNlcnZlZCkgKi8KLS8qIGxheWVyIHNwZWNpZmljIDE0LTE1IGJpdHMgYXJlIHVzZWQgZm9yIEZDUiBTQVIgKi8KLSNkZWZpbmUgTDJDQVBfRkxVU0hBQkxFX01BU0sgMHgwMDAzCi0jZGVmaW5lIEwyQ0FQX0ZMVVNIQUJMRV9DSF9CQVNFRCAweDAwMDAKLSNkZWZpbmUgTDJDQVBfRkxVU0hBQkxFX1BLVCAweDAwMDEKLSNkZWZpbmUgTDJDQVBfTk9OX0ZMVVNIQUJMRV9QS1QgMHgwMDAyCi0KLS8qIEwyQ0FfRmx1c2hDaGFubmVsIG51bV90b19mbHVzaCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBMMkNBUF9GTFVTSF9DSEFOU19BTEwgMHhmZmZmCi0jZGVmaW5lIEwyQ0FQX0ZMVVNIX0NIQU5TX0dFVCAweDAwMDAKLQotLyogVmFsdWVzIGZvciAnYWxsb3dlZF9tb2RlcycgZmllbGQgcGFzc2VkIGluIHN0cnVjdHVyZSB0TDJDQVBfRVJUTV9JTkZPCi0gKi8KLSNkZWZpbmUgTDJDQVBfRkNSX0NIQU5fT1BUX0JBU0lDICgxIDw8IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFKQotI2RlZmluZSBMMkNBUF9GQ1JfQ0hBTl9PUFRfRVJUTSAoMSA8PCBMMkNBUF9GQ1JfRVJUTV9NT0RFKQotCi0jZGVmaW5lIEwyQ0FQX0ZDUl9DSEFOX09QVF9BTExfTUFTSyBcCi0gIChMMkNBUF9GQ1JfQ0hBTl9PUFRfQkFTSUMgfCBMMkNBUF9GQ1JfQ0hBTl9PUFRfRVJUTSkKLQotLyogVmFsaWRpdHkgY2hlY2sgZm9yIFBTTS4gIFBTTSB2YWx1ZXMgbXVzdCBiZSBvZGQuICBBbHNvLCBhbGwgUFNNIHZhbHVlcyBtdXN0Ci0gKiBiZSBhc3NpZ25lZCBzdWNoIHRoYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbW9zdCBzaWdpZmljYW50Ci0gKiBvY3RldCBlcXVhbHMgemVyby4KLSAqLwotI2RlZmluZSBMMkNfSU5WQUxJRF9QU00ocHNtKSAoKChwc20pJjB4MDEwMSkgIT0gMHgwMDAxKQotI2RlZmluZSBMMkNfSVNfVkFMSURfUFNNKHBzbSkgKCgocHNtKSYweDAxMDEpID09IDB4MDAwMSkKLSNkZWZpbmUgTDJDX0lTX1ZBTElEX0xFX1BTTShwc20pICgoKHBzbSkgPiAweDAwMDApICYmICgocHNtKSA8IDB4MDEwMCkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgRGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0jZGVmaW5lIEwyQ0FQX0ZDUl9CQVNJQ19NT0RFIDB4MDAKLSNkZWZpbmUgTDJDQVBfRkNSX0VSVE1fTU9ERSAweDAzCi0jZGVmaW5lIEwyQ0FQX0ZDUl9MRV9DT0NfTU9ERSAweDA1Ci0KLSAgdWludDhfdCBtb2RlOwotCi0gIHVpbnQ4X3QgdHhfd2luX3N6OwotICB1aW50OF90IG1heF90cmFuc21pdDsKLSAgdWludDE2X3QgcnRyYW5zX3RvdXQ7Ci0gIHVpbnQxNl90IG1vbl90b3V0OwotICB1aW50MTZfdCBtcHM7Ci19IHRMMkNBUF9GQ1JfT1BUUzsKLQotLyogZGVmYXVsdCBvcHRpb25zIGZvciBFUlRNIG1vZGUgKi8KLWNvbnN0ZXhwciB0TDJDQVBfRkNSX09QVFMga0RlZmF1bHRFcnRtT3B0aW9ucyA9IHsKLSAgICBMMkNBUF9GQ1JfRVJUTV9NT0RFLAotICAgIDEwLCAgICAvKiBUeCB3aW5kb3cgc2l6ZSAqLwotICAgIDIwLCAgICAvKiBNYXhpbXVtIHRyYW5zbWlzc2lvbnMgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgKi8KLSAgICAyMDAwLCAgLyogUmV0cmFuc21pc3Npb24gdGltZW91dCAoMiBzZWNzKSAqLwotICAgIDEyMDAwLCAvKiBNb25pdG9yIHRpbWVvdXQgKDEyIHNlY3MpICovCi0gICAgMTAxMCAgIC8qIE1QUyBzZWdtZW50IHNpemUgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBxb3NfZmxhZ3M7ICAgICAgICAgIC8qIFRCRCAqLwotICB1aW50OF90IHNlcnZpY2VfdHlwZTsgICAgICAgLyogc2VlIGJlbG93ICovCi0gIHVpbnQzMl90IHRva2VuX3JhdGU7ICAgICAgICAvKiBieXRlcy9zZWNvbmQgKi8KLSAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemU7IC8qIGJ5dGVzICovCi0gIHVpbnQzMl90IHBlYWtfYmFuZHdpZHRoOyAgICAvKiBieXRlcy9zZWNvbmQgKi8KLSAgdWludDMyX3QgbGF0ZW5jeTsgICAgICAgICAgIC8qIG1pY3Jvc2Vjb25kcyAqLwotICB1aW50MzJfdCBkZWxheV92YXJpYXRpb247ICAgLyogbWljcm9zZWNvbmRzICovCi19IEZMT1dfU1BFQzsKLQotLyogVmFsdWVzIGZvciBzZXJ2aWNlX3R5cGUgKi8KLSNkZWZpbmUgU1ZDX1RZUEVfQkVTVF9FRkZPUlQgMQotI2RlZmluZSBTVkNfVFlQRV9HVUFSQU5URUVEIDIKLQotLyogRGVmaW5lIGEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gU2luY2UgdGhlCi0gKiBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCwgZm9yIGVhY2ggcGFyYW1ldGVyIHRoZXJlIGlzIGEgYm9vbGVhbiB0bwotICogdXNlIHRvIHNpZ25pZnkgaXRzIHByZXNlbmNlIG9yIGFic2VuY2UuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgcmVzdWx0OyAvKiBPbmx5IHVzZWQgaW4gY29uZmlybSBtZXNzYWdlcyAqLwotICBib29sIG10dV9wcmVzZW50OwotICB1aW50MTZfdCBtdHU7Ci0gIGJvb2wgcW9zX3ByZXNlbnQ7Ci0gIEZMT1dfU1BFQyBxb3M7Ci0gIGJvb2wgZmx1c2hfdG9fcHJlc2VudDsKLSAgdWludDE2X3QgZmx1c2hfdG87Ci0gIGJvb2wgZmNyX3ByZXNlbnQ7Ci0gIHRMMkNBUF9GQ1JfT1BUUyBmY3I7Ci0gIGJvb2wgZmNzX3ByZXNlbnQ7IC8qIE9wdGlvbmFsbHkgYnlwYXNzZXMgRkNTIGNoZWNrcyAqLwotICB1aW50OF90IGZjczsgICAgICAvKiAnMCcgaWYgZGVzaXJlIGlzIHRvIGJ5cGFzcyBGQ1MsIG90aGVyd2lzZSAnMScgKi8KLSAgYm9vbCBleHRfZmxvd19zcGVjX3ByZXNlbnQ7Ci0gIHRIQ0lfRVhUX0ZMT1dfU1BFQyBleHRfZmxvd19zcGVjOwotICB1aW50MTZfdCBmbGFnczsgLyogYml0IDA6IDAtbm8gY29udGludWF0aW9uLCAxLWNvbnRpbnVhdGlvbiAqLwotfSB0TDJDQVBfQ0ZHX0lORk87Ci0KLS8qIExFIGNyZWRpdCBiYXNlZCBMMkNBUCBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KLWNvbnN0ZXhwciB1aW50MTZfdCBMMkNBUF9MRV9NSU5fTVRVID0gMjM7ICAvLyBNaW5pbXVtIFNEVSBzaXplCi1jb25zdGV4cHIgdWludDE2X3QgTDJDQVBfTEVfTUlOX01QUyA9IDIzOwotY29uc3RleHByIHVpbnQxNl90IEwyQ0FQX0xFX01BWF9NUFMgPSA2NTUzMzsKLWNvbnN0ZXhwciB1aW50MTZfdCBMMkNBUF9MRV9DUkVESVRfTUFYID0gNjU1MzU7Ci0KLS8vIFRoaXMgaXMgaW5pdGlhbCBhbW91dCBvZiBjcmVkaXRzIHdlIHNlbmQsIGFuZCBhbW91bnQgdG8gd2hpY2ggd2UgaW5jcmVhc2UKLS8vIGNyZWRpdHMgb25jZSB0aGV5IGZhbGwgYmVsb3cgdGhyZXNob2xkCi1jb25zdGV4cHIgdWludDE2X3QgTDJDQVBfTEVfQ1JFRElUX0RFRkFVTFQgPSAweGZmZmY7Ci0KLS8vIElmIGNyZWRpdCBjb3VudCBvbiByZW1vdGUgZmFsbCBiZWxvdyB0aGlzIHZhbHVlLCB3ZSBzZW5kIGJhY2sgY3JlZGl0cyB0bwotLy8gcmVhY2ggZGVmYXVsdCB2YWx1ZS4KLWNvbnN0ZXhwciB1aW50MTZfdCBMMkNBUF9MRV9DUkVESVRfVEhSRVNIT0xEID0gMHgwMDQwOwotCi1zdGF0aWNfYXNzZXJ0KEwyQ0FQX0xFX0NSRURJVF9USFJFU0hPTEQgPCBMMkNBUF9MRV9DUkVESVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgIlRocmVzaG9sZCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBkZWZhdWx0IGNyZWRpdHMiKTsKLQotLyogRGVmaW5lIGEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciBMRSBMMkNBUAotICogY29ubmVjdGlvbiBvcmllbnRlZCBjaGFubmVscy4KLSAqLwotc3RydWN0IHRMMkNBUF9MRV9DRkdfSU5GTyB7Ci0gIHVpbnQxNl90IHJlc3VsdDsgLyogT25seSB1c2VkIGluIGNvbmZpcm0gbWVzc2FnZXMgKi8KLSAgdWludDE2X3QgbXR1ID0gMTAwOwotICB1aW50MTZfdCBtcHMgPSAxMDA7Ci0gIHVpbnQxNl90IGNyZWRpdHMgPSBMMkNBUF9MRV9DUkVESVRfREVGQVVMVDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDYWxsYmFjayBGdW5jdGlvbnMgUHJvdG90eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29ubmVjdGlvbiBpbmRpY2F0aW9uIGNhbGxiYWNrIHByb3RvdHlwZS4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICogICAgICAgICAgICAgIExvY2FsIENJRCBhc3NpZ25lZCB0byB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgIFBTTSB0aGF0IHRoZSByZW1vdGUgd2FudHMgdG8gY29ubmVjdCB0bwotICogICAgICAgICAgICAgIElkZW50aWZpZXIgdGhhdCB0aGUgcmVtb3RlIHNlbnQKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0NPTk5FQ1RfSU5EX0NCKShjb25zdCBSYXdBZGRyZXNzJiwgdWludDE2X3QsIHVpbnQxNl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KTsKLQotLyogQ29ubmVjdGlvbiBjb25maXJtYXRpb24gY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIExvY2FsIENJRAotICogICAgICAgICAgICAgIFJlc3VsdCAtIDAgPSBjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdEwyQ0FfRVJST1JfQ0IgaXMgaW52b2tlZAotICovCi10eXBlZGVmIHZvaWQodEwyQ0FfQ09OTkVDVF9DRk1fQ0IpKHVpbnQxNl90LCB1aW50MTZfdCk7Ci0KLS8qIENvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgTG9jYWwgQ0lEIGFzc2lnbmVkIHRvIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgUG9pbnRlciB0byBjb25maWd1cmF0aW9uIGluZm8KLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0NPTkZJR19JTkRfQ0IpKHVpbnQxNl90LCB0TDJDQVBfQ0ZHX0lORk8qKTsKLQotY29uc3RleHByIHVpbnQxNl90IEwyQ0FQX0lOSVRJQVRPUl9MT0NBTCA9IDE7Ci1jb25zdGV4cHIgdWludDE2X3QgTDJDQVBfSU5JVElBVE9SX1JFTU9URSA9IDA7Ci0vKiBDb25maWd1cmF0aW9uIGNvbmZpcm0gY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIExvY2FsIENJRCBhc3NpZ25lZCB0byB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgIEluaXRpYXRvciAoMSBmb3IgbG9jYWwsIDAgZm9yIHJlbW90ZSkKLSAqICAgICAgICAgICAgICBJbml0aWFsIGNvbmZpZyBmcm9tIHJlbW90ZQotICogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRMMkNBX0VSUk9SX0NCIGlzIGludm9rZWQKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0NPTkZJR19DRk1fQ0IpKHVpbnQxNl90LCB1aW50MTZfdCwgdEwyQ0FQX0NGR19JTkZPKik7Ci0KLS8qIERpc2Nvbm5lY3QgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgTG9jYWwgQ0lECi0gKiAgICAgICAgICAgICAgQm9vbGVhbiB3aGV0aGVyIHVwcGVyIGxheWVyIHNob3VsZCBhY2sgdGhpcwotICovCi10eXBlZGVmIHZvaWQodEwyQ0FfRElTQ09OTkVDVF9JTkRfQ0IpKHVpbnQxNl90LCBib29sKTsKLQotLyogRGlzY29ubmVjdCBjb25maXJtIGNhbGxiYWNrIHByb3RvdHlwZS4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICBMb2NhbCBDSUQKLSAqICAgICAgICAgICAgICBSZXN1bHQKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0RJU0NPTk5FQ1RfQ0ZNX0NCKSh1aW50MTZfdCwgdWludDE2X3QpOwotCi0vKiBEaXNjb25uZWN0IGNvbmZpcm0gY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIExvY2FsIENJRAotICogICAgICAgICAgICAgIFJlc3VsdAotICovCi10eXBlZGVmIHZvaWQodEwyQ0FfREFUQV9JTkRfQ0IpKHVpbnQxNl90LCBCVF9IRFIqKTsKLQotLyogQ29uZ2VzdGlvbiBzdGF0dXMgY2FsbGJhY2sgcHJvdHlwZS4gVGhpcyBjYWxsYmFjayBpcyBvcHRpb25hbC4gSWYKLSAqIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHNlbmQgZGF0YSB3aGVuIHRoZSB0cmFuc21pdCBxdWV1ZSBpcyBmdWxsLAotICogdGhlIGRhdGEgd2lsbCBhbnl3YXlzIGJlIGRyb3BwZWQuIFRoZSBwYXJhbWV0ZXIgaXM6Ci0gKiAgICAgICAgICAgICAgTG9jYWwgQ0lECi0gKiAgICAgICAgICAgICAgdHJ1ZSBpZiBjb25nZXN0ZWQsIGZhbHNlIGlmIHVuY29uZ2VzdGVkCi0gKi8KLXR5cGVkZWYgdm9pZCh0TDJDQV9DT05HRVNUSU9OX1NUQVRVU19DQikodWludDE2X3QsIGJvb2wpOwotCi0vKiBUcmFuc21pdCBjb21wbGV0ZSBjYWxsYmFjayBwcm90eXBlLiBUaGlzIGNhbGxiYWNrIGlzIG9wdGlvbmFsLiBJZgotICogc2V0LCBMMkNBUCB3aWxsIGNhbGwgaXQgd2hlbiBwYWNrZXRzIGFyZSBzZW50IG9yIGZsdXNoZWQuIElmIHRoZQotICogY291bnQgaXMgMHhGRkZGLCBpdCBtZWFucyBhbGwgcGFja2V0cyBhcmUgc2VudCBmb3IgdGhhdCBDSUQgKGVSVE0KLSAqIG1vZGUgb25seSkuIFRoZSBwYXJhbWV0ZXJzIGFyZToKLSAqICAgICAgICAgICAgICBMb2NhbCBDSUQKLSAqICAgICAgICAgICAgICBOdW1iZXIgb2YgU0RVcyBzZW50IG9yIGRyb3BwZWQKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX1RYX0NPTVBMRVRFX0NCKSh1aW50MTZfdCwgdWludDE2X3QpOwotCi0vKgotICogTm90aWZ5IHRoZSB1c2VyIHdoZW4gdGhlIHJlbW90ZSBzZW5kIGVycm9yIHJlc3VsdCBvbiBDb25uZWN0UnNwIG9yIENvbmZpZ1JzcAotICogVGhlIHBhcmFtZXRlcnMgYXJlOgotICogICAgICAgICAgICAgIExvY2FsIENJRAotICogICAgICAgICAgICAgIEVycm9yIHR5cGUgKEwyQ0FQX0NPTk5fT1RIRVJfRVJST1IgZm9yIENvbm5lY3RSc3AsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ0ZHX0ZBSUxFRF9OT19SRUFTT04gZm9yIENvbmZpZ1JzcCkKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0VSUk9SX0NCKSh1aW50MTZfdCwgdWludDE2X3QpOwotCi0vKiBDcmVhdGUgY3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24gcmVxdWVzdCBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqICAgICAgICAgICAgICBWZWN0b3Igb2YgYWxsb2NhdGVkIGxvY2FsIGNpZHMgdG8gYWNjZXB0Ci0gKiAgICAgICAgICAgICAgUFNNCi0gKiAgICAgICAgICAgICAgUGVlciBNVFUKLSAqICAgICAgICAgICAgICBJZGVudGlmaWVyIHRoYXQgdGhlIHJlbW90ZSBzZW50Ci0gKi8KLXR5cGVkZWYgdm9pZCh0TDJDQV9DUkVESVRfQkFTRURfQ09OTkVDVF9JTkRfQ0IpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgbGNpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQxNl90IHBlZXJfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpZGVudGlmaWVyKTsKLQotLyogQ3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24gY29uZmlybWF0aW9uIGNhbGxiYWNrIHByb3RvdHlwZS4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICogICAgICAgICAgICAgIENvbm5lY3RlZCBMb2NhbCBDSURzCi0gKiAgICAgICAgICAgICAgUGVlciBNVFUKLSAqICAgICAgICAgICAgICBSZXN1bHQgLSAwID0gY29ubmVjdGVkLCBub24temVybyBtZWFucyBDSUQgaXMgbm90IGNvbm5lY3RlZAotICovCi10eXBlZGVmIHZvaWQodEwyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfQ0ZNX0NCKShjb25zdCBSYXdBZGRyZXNzJiBiZGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVlcl9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpOwotCi0vKiBDcmVkaXQgYmFzZWQgcmVjb25maWd1cmF0aW9uIGNvbmZpcm0gY2FsbGJhY2sgcHJvdG90eXBlLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgTG9jYWwgQ0lEIGFzc2lnbmVkIHRvIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgbG9jYWwgb3IgcGVlciBjb25maWd1cmF0aW9uCi0gKiAgICAgICAgICAgICAgUG9pbnRlciB0byBjb25maWd1cmF0aW9uIGluZm8KLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0NSRURJVF9CQVNFRF9SRUNPTkZJR19DT01QTEVURURfQ0IpKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwgdWludDE2X3QgbGNpZCwgYm9vbCBpc19sb2NhbF9jZmcsCi0gICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZyk7Ci0KLS8qIERlZmluZSB0aGUgc3RydWN0dXJlIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0byByZWdpc3RlciB3aXRoCi0gKiBMMkNBUC4gVGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgY2FsbGJhY2sgZnVuY3Rpb25zLiBBbGwgZnVuY3Rpb25zCi0gKiBNVVNUIGJlIHByb3ZpZGVkLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlICJjb25uZWN0IHBlbmRpbmciCi0gKiBjYWxsYmFjayBhbmQgImNvbmdlc3Rpb24gc3RhdHVzIiBjYWxsYmFjay4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0TDJDQV9DT05ORUNUX0lORF9DQiogcEwyQ0FfQ29ubmVjdEluZF9DYjsKLSAgdEwyQ0FfQ09OTkVDVF9DRk1fQ0IqIHBMMkNBX0Nvbm5lY3RDZm1fQ2I7Ci0gIHRMMkNBX0NPTkZJR19JTkRfQ0IqIHBMMkNBX0NvbmZpZ0luZF9DYjsKLSAgdEwyQ0FfQ09ORklHX0NGTV9DQiogcEwyQ0FfQ29uZmlnQ2ZtX0NiOwotICB0TDJDQV9ESVNDT05ORUNUX0lORF9DQiogcEwyQ0FfRGlzY29ubmVjdEluZF9DYjsKLSAgdEwyQ0FfRElTQ09OTkVDVF9DRk1fQ0IqIHBMMkNBX0Rpc2Nvbm5lY3RDZm1fQ2I7Ci0gIHRMMkNBX0RBVEFfSU5EX0NCKiBwTDJDQV9EYXRhSW5kX0NiOwotICB0TDJDQV9DT05HRVNUSU9OX1NUQVRVU19DQiogcEwyQ0FfQ29uZ2VzdGlvblN0YXR1c19DYjsKLSAgdEwyQ0FfVFhfQ09NUExFVEVfQ0IqIHBMMkNBX1R4Q29tcGxldGVfQ2I7Ci0gIHRMMkNBX0VSUk9SX0NCKiBwTDJDQV9FcnJvcl9DYjsKLSAgdEwyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfSU5EX0NCKiBwTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RJbmRfQ2I7Ci0gIHRMMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX0NGTV9DQiogcEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0Q2ZtX0NiOwotICB0TDJDQV9DUkVESVRfQkFTRURfUkVDT05GSUdfQ09NUExFVEVEX0NCKgotICAgICAgcEwyQ0FfQ3JlZGl0QmFzZWRSZWNvbmZpZ0NvbXBsZXRlZF9DYjsKLX0gdEwyQ0FQX0FQUExfSU5GTzsKLQotLyogRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRvIGNyZWF0ZSBvciBhY2NlcHQKLSAqIGNvbm5lY3Rpb25zIHdpdGggZW5oYW5jZWQgcmV0cmFuc21pc3Npb24gbW9kZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHByZWZlcnJlZF9tb2RlOwotfSB0TDJDQVBfRVJUTV9JTkZPOwotCi0vKioKLSAqIFN0YWNrIG1hbmFnZW1lbnQgZGVjbGFyYXRpb25zCi0gKi8KLXZvaWQgbDJjX2luaXQoKTsKLXZvaWQgbDJjX2ZyZWUoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gQWxzbyBkb2VzIHNlY3VyaXR5IGZvciB5b3UKLXVpbnQxNl90IEwyQ0FfUmVnaXN0ZXIyKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXlfbXR1LCB1aW50MTZfdCByZXF1aXJlZF9yZW1vdGVfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE90aGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgZm9yIEwyQ0FQCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUFNNIHRvIHVzZSBvciB6ZXJvIGlmIGVycm9yLiBUeXBpY2FsbHksIHRoZSBQU00gcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgd2FzIHBhc3NlZCBpbiwgYnV0IGZvciBhbiBvdXRnb2luZy1vbmx5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBkeW5hbWljIFBTTSwgYSAidmlydHVhbCIgUFNNIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgY2FsbHMgdG8gTDJDQV9Db25uZWN0UmVxKCkgYW5kCi0gKiAgICAgICAgICAgICAgICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKCkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50MTZfdCBMMkNBX1JlZ2lzdGVyKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXlfbXR1LCB1aW50MTZfdCByZXF1aXJlZF9yZW1vdGVfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBkZXJlZ2lzdGVyIGZvciBMMkNBUAotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgTDJDQV9EZXJlZ2lzdGVyKHVpbnQxNl90IHBzbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0FsbG9jYXRlTGVQU00KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE90aGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZmluZCBhbiB1bnVzZWQgTEUgUFNNIGZvcgotICogICAgICAgICAgICAgICAgICBMMkNBUCBzZXJ2aWNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIExFX1BTTSB0byB1c2UgaWYgc3VjY2Vzcy4gT3RoZXJ3aXNlIHJldHVybnMgMC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEwyQ0FfQWxsb2NhdGVMZVBTTSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfRnJlZUxlUFNNCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlIGFuIGFzc2lnbmVkIExFIFBTTS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgTDJDQV9GcmVlTGVQU00odWludDE2X3QgcHNtKTsKLQotZXh0ZXJuIHVpbnQxNl90IEwyQ0FfQ29ubmVjdFJlcTIodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfQ29ubmVjdFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIEwyQ0FQCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBub3QgZXN0YWJsaXNoZWQgYXQgdGhpcyB0aW1lLAotICogICAgICAgICAgICAgICAgICBidXQgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IGdldHMgc3RhcnRlZC4gVGhlIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW52b2tlZCB3aGVuIGNvbm5lY3Rpb24gZXN0YWJsaXNoZXMgb3IgZmFpbHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgQ0lEIG9mIHRoZSBjb25uZWN0aW9uLCBvciAwIGlmIGl0IGZhaWxlZCB0byBzdGFydAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdWludDE2X3QgTDJDQV9Db25uZWN0UmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfUmVnaXN0ZXJMRUNvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBmb3IgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBPcmllbnRlZCBDaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUFNNIHRvIHVzZSBvciB6ZXJvIGlmIGVycm9yLiBUeXBpY2FsbHksIHRoZSBQU00gcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgd2FzIHBhc3NlZCBpbiwgYnV0IGZvciBhbiBvdXRnb2luZy1vbmx5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBkeW5hbWljIFBTTSwgYSAidmlydHVhbCIgUFNNIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgY2FsbHMgdG8gTDJDQV9Db25uZWN0TEVDb2NSZXEoKQotICogICAgICAgICAgICAgICAgICBhbmQgQlRNX1NldFNlY3VyaXR5TGV2ZWwoKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEwyQ0FfUmVnaXN0ZXJMRUNvYyh1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIHBfY2JfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsLCB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfRGVyZWdpc3RlckxFQ29jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPdGhlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRlcmVnaXN0ZXIgZm9yIEwyQ0FQCi0gKiAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gT3JpZW50ZWQgQ2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgTDJDQV9EZXJlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfQ29ubmVjdExFQ29jUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIaWdoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBjcmVhdGUgYW4gTDJDQVAgTEUgQ09DLgotICogICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGVzdGFibGlzaGVkIGF0IHRoaXMgdGltZSwKLSAqICAgICAgICAgICAgICAgICAgYnV0IGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBnZXRzIHN0YXJ0ZWQuIFRoZSBjYWxsYmFjawotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQgd2hlbiBjb25uZWN0aW9uIGVzdGFibGlzaGVzIG9yIGZhaWxzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIENJRCBvZiB0aGUgY29ubmVjdGlvbiwgb3IgMCBpZiBpdCBmYWlsZWQgdG8gc3RhcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEwyQ0FfQ29ubmVjdExFQ29jUmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgICBMMkNBX0dldFBlZXJMRUNvY0NvbmZpZwotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgIEdldCBwZWVycyBjb25maWd1cmF0aW9uIGZvciBMRSBDb25uZWN0aW9uIE9yaWVudGVkIENoYW5uZWwuCi0gKgotICogIFJldHVybiB2YWx1ZTogICAgdHJ1ZSBpZiBwZWVyIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBMMkNBX0dldFBlZXJMRUNvY0NvbmZpZyh1aW50MTZfdCBsY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICAgTDJDQV9SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgICBTdGFydCByZWNvbmZpZ3VyZSBwcm9jZWR1cmUgb24gQ29ubmVjdGlvbiBPcmllbnRlZCBDaGFubmVsLgotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgIHRydWUgaWYgcGVlciBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gYm9vbCBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBsY2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxCi0gKgotICogIERlc2NyaXB0aW9uICAgICAgV2l0aCB0aGlzIGZ1bmN0aW9uIEwyQ0FQIHdpbGwgaW5pdGlhdGUgc2V0dXAgb2YgdXAgdG8gNSBjcmVkaXQKLSAqICAgICAgICAgICAgICAgICAgIGJhc2VkIGNvbm5lY3Rpb25zIGZvciBnaXZlbiBwc20gdXNpbmcgcHJvdmlkZWQgY29uZmlndXJhdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIEwyQ0FQIHdpbGwgbm90aWZ5IHVzZXIgb24gdGhlIGNvbm5lY3Rpb24gcmVzdWx0LCBieSBjYWxsaW5nCi0gKiAgICAgICAgICAgICAgICAgICBwTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RDZm1fQ2IgZm9yIGVhY2ggY2lkIHdpdGggYSByZXN1bHQuCi0gKgotICogIFJldHVybiB2YWx1ZTogdmVjdG9yIG9mIGFsbG9jYXRlZCBsb2NhbCBjaWRzIGZvciB0aGUgY29ubmVjdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSZXEoCi0gICAgdWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwCi0gKgotICogIERlc2NyaXB0aW9uICAgICAgUmVzcG9uc2UgZm9yIHRoZSBwTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RJbmRfQ2Igd2hpY2ggaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uIGZvciBwZWVyIHJlcXVlc3RpbmcgY3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24uCi0gKgotICogIFJldHVybiB2YWx1ZTogdHJ1ZSBpZiBwZWVyIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBib29sIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgYWNjZXB0ZWRfbGNpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRpc2Nvbm5lY3QgYSBjaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkaXNjb25uZWN0IHNlbnQsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgTDJDQV9EaXNjb25uZWN0UmVxKHVpbnQxNl90IGNpZCk7Ci0KLWV4dGVybiBib29sIEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxKHVpbnQxNl90IGNpZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0RhdGFXcml0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIEwyQ0FQX0RXX1NVQ0NFU1MsIGlmIGRhdGEgYWNjZXB0ZWQsIGVsc2UgZmFsc2UKLSAqICAgICAgICAgICAgICAgICAgTDJDQVBfRFdfQ09OR0VTVEVELCBpZiBkYXRhIGFjY2VwdGVkIGFuZCB0aGUgY2hhbm5lbCBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmdlc3RlZAotICogICAgICAgICAgICAgICAgICBMMkNBUF9EV19GQUlMRUQsIGlmIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50OF90IEwyQ0FfRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpOwotCi1leHRlcm4gdWludDhfdCBMMkNBX0xFQ29jRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpOwotCi0vLyBHaXZlbiBhIGxvY2FsIGNoYW5uZWwgaWRlbnRpZmllciwgfGxjaWR8LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvdW5kCi0vLyByZW1vdGUgY2hhbm5lbCBpZGVudGlmaWVyLCB8cmNpZHwuIElmCi0vLyB8bGNpZHwgaXMgbm90IGtub3duIG9yIGlzIGludmFsaWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBhbmQgZG9lcyBub3QKLS8vIG1vZGlmeSB0aGUgdmFsdWUgcG9pbnRlZCBhdCBieSB8cmNpZHwuIHxyY2lkfCBtYXkgYmUgTlVMTC4KLWJvb2wgTDJDQV9HZXRSZW1vdGVDaWQodWludDE2X3QgbGNpZCwgdWludDE2X3QqIHJjaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIaWdoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGlkbGUgdGltZW91dCBmb3IKLSAqICAgICAgICAgICAgICAgICAgYSBjb25uZWN0aW9uLiBUaGUgImlkbGUgdGltZW91dCIgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgYSBjb25uZWN0aW9uIGNhbiByZW1haW4gdXAgd2l0aCBubyBMMkNBUCBjaGFubmVscyBvbiBpdC4KLSAqICAgICAgICAgICAgICAgICAgQSB0aW1lb3V0IG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHRvcm4KLSAqICAgICAgICAgICAgICAgICAgZG93biBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXN0IGNoYW5uZWwgaXMgcmVtb3ZlZC4KLSAqICAgICAgICAgICAgICAgICAgQSB0aW1lb3V0IG9mIDB4RkZGRiBtZWFucyBubyB0aW1lb3V0LiBWYWx1ZXMgYXJlIGluIHNlY29uZHMuCi0gKiAgICAgICAgICAgICAgICAgIEEgYmRfYWRkciBpcyB0aGUgcmVtb3RlIEJEIGFkZHJlc3MuIElmIGJkX2FkZHIgPQotICogICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzOjprQW55LCB0aGVuIHRoZSBpZGxlIHRpbWVvdXRzIGZvciBhbGwgYWN0aXZlCi0gKiAgICAgICAgICAgICAgICAgIGwyY2FwIGxpbmtzIHdpbGwgYmUgY2hhbmdlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgY29tbWFuZCBzdWNjZWVkZWQsIGZhbHNlIGlmIGZhaWxlZAotICoKLSAqIE5PVEUgICAgICAgICAgICAgVGhpcyB0aW1lb3V0IGFwcGxpZXMgdG8gYWxsIGxvZ2ljYWwgY2hhbm5lbHMgYWN0aXZlIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBBQ0wgbGluay4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgTDJDQVAuIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMHhGRiwgaXQgc2ltcGx5IHJlYWRzIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIG5ldyAoY3VycmVudCkgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQ4X3QgTDJDQV9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgdHJhY2VfbGV2ZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBMMkNBX0ZsdXNoQ2hhbm5lbAotICoKLSAqIERlc2NyaXB0aW9uICBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgbm9uZSwgc29tZSBvciBhbGwgYnVmZmVycyBxdWV1ZWQgdXAKLSAqICAgICAgICAgICAgICBmb3IgeG1pc3Npb24gZm9yIGEgcGFydGljdWxhciBDSUQuIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgTDJDQVBfRkxVU0hfQ0hBTlNfR0VUICgwKSwgaXQgc2ltcGx5IHJldHVybnMgdGhlIG51bWJlcgotICogICAgICAgICAgICAgIG9mIGJ1ZmZlcnMgcXVldWVkIGZvciB0aGF0IENJRCBMMkNBUF9GTFVTSF9DSEFOU19BTEwgKDB4ZmZmZikKLSAqICAgICAgICAgICAgICBmbHVzaGVzIGFsbCBidWZmZXJzLiAgQWxsIG90aGVyIHZhbHVlcyBzcGVjaWZpZXMgdGhlIG1heGltdW0KLSAqICAgICAgICAgICAgICBidWZmZXJzIHRvIGZsdXNoLgotICoKLSAqIFJldHVybnMgICAgICBOdW1iZXIgb2YgYnVmZmVycyBsZWZ0IHF1ZXVlZCBmb3IgdGhhdCBDSUQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEwyQ0FfRmx1c2hDaGFubmVsKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IG51bV90b19mbHVzaCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX1NldEFjbFByaW9yaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIHRoZSB0cmFuc21pc3Npb24gcHJpb3JpdHkgZm9yIGFuIEFDTCBjaGFubmVsLgotICogICAgICAgICAgICAgICAgICAoRm9yIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb25seSB0d28gdmFsdWVzIGFyZSB2YWxpZC4KLSAqICAgICAgICAgICAgICAgICAgTDJDQVBfUFJJT1JJVFlfTk9STUFMIGFuZCBMMkNBUF9QUklPUklUWV9ISUdIKS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYSB2YWxpZCBjaGFubmVsLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEwyQ0FfU2V0QWNsUHJpb3JpdHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX1BSSU9SSVRZIHByaW9yaXR5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0VHhQcmlvcml0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0cyB0aGUgdHJhbnNtaXNzaW9uIHByaW9yaXR5IGZvciBhIGNoYW5uZWwuIChGQ1IgTW9kZSkKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYSB2YWxpZCBjaGFubmVsLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEwyQ0FfU2V0VHhQcmlvcml0eSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IGEgY2hhbm5lbHMKLSAqICAgICAgICAgICAgICAgICAgZmx1c2hhYmlsaXR5IGZsYWdzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIENJRCBmb3VuZCwgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkodWludDE2X3QgY2lkLCBib29sIGlzX2ZsdXNoYWJsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICAgTDJDQV9HZXRQZWVyRmVhdHVyZXMKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgICBHZXQgYSBwZWVycyBmZWF0dXJlcyBhbmQgZml4ZWQgY2hhbm5lbCBtYXAKLSAqCi0gKiAgUGFyYW1ldGVyczogICAgICBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgICBQb2ludGVycyB0byBmZWF0dXJlcyBhbmQgY2hhbm5lbCBtYXNrIHN0b3JhZ2UgYXJlYQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgIHRydWUgaWYgcGVlciBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgTDJDQV9HZXRQZWVyRmVhdHVyZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX2V4dF9mZWF0LCB1aW50OF90KiBwX2NobmxfbWFzayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgQ2hhbm5lbCBjYWxsYmFjayBwcm90b3R5cGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRml4ZWQgY2hhbm5lbCBjb25uZWN0ZWQgYW5kIGRpc2Nvbm5lY3RlZC4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgY2hhbm5lbAotICogICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICogICAgICB0cnVlIGlmIGNoYW5uZWwgaXMgY29ubmVjdGVkLCBmYWxzZSBpZiBkaXNjb25uZWN0ZWQKLSAqICAgICAgUmVhc29uIGZvciBjb25uZWN0aW9uIGZhaWx1cmUKLSAqICAgICAgdHJhbnNwb3J0IDogcGh5c2ljYWwgdHJhbnNwb3J0LCBCUi9FRFIgb3IgTEUKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0ZJWEVEX0NITkxfQ0IpKHVpbnQxNl90LCBjb25zdCBSYXdBZGRyZXNzJiwgYm9vbCwgdWludDE2X3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCk7Ci0KLS8qIFNpZ25hbGxpbmcgZGF0YSByZWNlaXZlZC4gUGFyYW1ldGVycyBhcmUKLSAqICAgICAgY2hhbm5lbAotICogICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICogICAgICBQb2ludGVyIHRvIGJ1ZmZlciB3aXRoIGRhdGEKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0ZJWEVEX0RBVEFfQ0IpKHVpbnQxNl90LCBjb25zdCBSYXdBZGRyZXNzJiwgQlRfSERSKik7Ci0KLS8qIENvbmdlc3Rpb24gc3RhdHVzIGNhbGxiYWNrIHByb3R5cGUuIFRoaXMgY2FsbGJhY2sgaXMgb3B0aW9uYWwuIElmCi0gKiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBzZW5kIGRhdGEgd2hlbiB0aGUgdHJhbnNtaXQgcXVldWUgaXMgZnVsbCwKLSAqIHRoZSBkYXRhIHdpbGwgYW55d2F5cyBiZSBkcm9wcGVkLiBUaGUgcGFyYW1ldGVyIGlzOgotICogICAgICByZW1vdGUgQkRfQUREUgotICogICAgICB0cnVlIGlmIGNvbmdlc3RlZCwgZmFsc2UgaWYgdW5jb25nZXN0ZWQKLSAqLwotdHlwZWRlZiB2b2lkKHRMMkNBX0ZJWEVEX0NPTkdFU1RJT05fU1RBVFVTX0NCKShjb25zdCBSYXdBZGRyZXNzJiwgYm9vbCk7Ci0KLS8qIEZpeGVkIGNoYW5uZWwgcmVnaXN0cmF0aW9uIGluZm8gKHRoZSBjYWxsYmFjayBhZGRyZXNzZXMgYW5kIGNoYW5uZWwgY29uZmlnKQotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRMMkNBX0ZJWEVEX0NITkxfQ0IqIHBMMkNBX0ZpeGVkQ29ubl9DYjsKLSAgdEwyQ0FfRklYRURfREFUQV9DQiogcEwyQ0FfRml4ZWREYXRhX0NiOwotICB0TDJDQV9GSVhFRF9DT05HRVNUSU9OX1NUQVRVU19DQiogcEwyQ0FfRml4ZWRDb25nX0NiOwotCi0gIHVpbnQxNl90IGRlZmF1bHRfaWRsZV90b3V0OwotfSB0TDJDQVBfRklYRURfQ0hOTF9SRUc7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICBMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsCi0gKgotICogIERlc2NyaXB0aW9uICAgICBSZWdpc3RlciBhIGZpeGVkIGNoYW5uZWwuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICBGaXhlZCBDaGFubmVsICMKLSAqICAgICAgICAgICAgICAgICAgQ2hhbm5lbCBDYWxsYmFja3MgYW5kIGNvbmZpZwotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiByZWdpc3RlcmVkIE9LCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwodWludDE2X3QgZml4ZWRfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfRklYRURfQ0hOTF9SRUcqIHBfZnJlZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICBMMkNBX0Nvbm5lY3RGaXhlZENobmwKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgIENvbm5lY3QgYW4gZml4ZWQgc2lnbmFsbGluZyBjaGFubmVsIHRvIGEgcmVtb3RlIGRldmljZS4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEZpeGVkIENJRAotICogICAgICAgICAgICAgICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiBjb25uZWN0aW9uIHN0YXJ0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgTDJDQV9Db25uZWN0Rml4ZWRDaG5sKHVpbnQxNl90IGZpeGVkX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgIEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgIFdyaXRlIGRhdGEgb24gYSBmaXhlZCBzaWduYWxsaW5nIGNoYW5uZWwuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICBGaXhlZCBDSUQKLSAqICAgICAgICAgICAgICAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBidWZmZXIgb2YgdHlwZSBCVF9IRFIKLSAqCi0gKiBSZXR1cm4gdmFsdWUgICAgIEwyQ0FQX0RXX1NVQ0NFU1MsIGlmIGRhdGEgYWNjZXB0ZWQKLSAqICAgICAgICAgICAgICAgICAgTDJDQVBfRFdfRkFJTEVELCAgaWYgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQxNl90IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEodWludDE2X3QgZml4ZWRfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgTDJDQV9SZW1vdmVGaXhlZENobmwKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgIFJlbW92ZSBhIGZpeGVkIGNoYW5uZWwgdG8gYSByZW1vdGUgZGV2aWNlLgotICoKLSAqICBQYXJhbWV0ZXJzOiAgICAgRml4ZWQgQ0lECi0gKiAgICAgICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIElkbGUgdGltZW91dCB0byB1c2UgKG9yIDB4RkZGRiBpZiBkb24ndCBjYXJlKQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiBjaGFubmVsIHJlbW92ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgTDJDQV9SZW1vdmVGaXhlZENobmwodWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0TGVHYXR0VGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBpZGxlIHRpbWVvdXQgZm9yCi0gKiAgICAgICAgICAgICAgICAgIGEgZml4ZWQgY2hhbm5lbC4gVGhlICJpZGxlIHRpbWVvdXQiIGlzIHRoZSBhbW91bnQgb2YgdGltZQotICogICAgICAgICAgICAgICAgICB0aGF0IGEgY29ubmVjdGlvbiBjYW4gcmVtYWluIHVwIHdpdGggbm8gTDJDQVAgY2hhbm5lbHMgb24KLSAqICAgICAgICAgICAgICAgICAgaXQuIEEgdGltZW91dCBvZiB6ZXJvIG1lYW5zIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSB0b3JuCi0gKiAgICAgICAgICAgICAgICAgIGRvd24gaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGFzdCBjaGFubmVsIGlzIHJlbW92ZWQuCi0gKiAgICAgICAgICAgICAgICAgIEEgdGltZW91dCBvZiAweEZGRkYgbWVhbnMgbm8gdGltZW91dC4gVmFsdWVzIGFyZSBpbiBzZWNvbmRzLgotICogICAgICAgICAgICAgICAgICBBIGJkX2FkZHIgaXMgdGhlIHJlbW90ZSBCRCBhZGRyZXNzLiBJZiBiZF9hZGRyID0KLSAqICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzczo6a0FueSwgdGhlbiB0aGUgaWRsZSB0aW1lb3V0cyBmb3IgYWxsIGFjdGl2ZQotICogICAgICAgICAgICAgICAgICBsMmNhcCBsaW5rcyB3aWxsIGJlIGNoYW5nZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNvbW1hbmQgc3VjY2VlZGVkLCBmYWxzZSBpZiBmYWlsZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGJvb2wgTDJDQV9TZXRMZUdhdHRUaW1lb3V0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaWRsZV90b3V0KTsKLQotZXh0ZXJuIGJvb2wgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2ludCwgdWludDE2X3QgbWF4X2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zCi0gKgotICogIERlc2NyaXB0aW9uICAgICBVcGRhdGUgQkxFIGNvbm5lY3Rpb24gcGFyYW1ldGVycy4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIGVuYWJsZSBmbGFnCi0gKgotICogIFJldHVybiB2YWx1ZTogICB0cnVlIGlmIHVwZGF0ZSBzdGFydGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIEwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfR2V0QmxlQ29ublJvbGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29ubmVjdGlvbiByb2xlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbGluayByb2xlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdEhDSV9ST0xFIEwyQ0FfR2V0QmxlQ29ublJvbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLWV4dGVybiB2b2lkIEwyQ0FfQWRqdXN0Q29ubmVjdGlvbkludGVydmFscyh1aW50MTZfdCogbWluX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmxvb3JfaW50ZXJ2YWwpOwotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYW4gQUNMIG9yIExFIGxpbmsgdG8gdGhlIHJlbW90ZSBkZXZpY2UgaXMgZXN0YWJsaXNoZWQKLSAqLwotZXh0ZXJuIGJvb2wgTDJDQV9Jc0xpbmtFc3RhYmxpc2hlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci0KLSNlbmRpZiAvKiBMMkNfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvbDJjYXBfYWNsX2ludGVyZmFjZS5oIGIvc3RhY2svaW5jbHVkZS9sMmNhcF9hY2xfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzRmMWIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9sMmNhcF9hY2xfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBUaGlzIGhlYWRlciBjb250YWlucyBmdW5jdGlvbnMgZm9yIEwyY2FwLUFDTCB0byBpbnZva2UKLS8vCi12b2lkIGFjbF9hY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3Qgcm9sZSk7Ci12b2lkIGFjbF9jcmVhdGVfY2xhc3NpY19jb25uZWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhlcmVfYXJlX2hpZ2hfcHJpb3JpdHlfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYm9uZGluZyk7Ci1ib29sIGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLWJvb2wgYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uX3dpdGhfaWQodWludDhfdCBpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci12b2lkIGFjbF9yZWplY3RfY29ubmVjdGlvbl9yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVhc29uKTsKLXZvaWQgYWNsX3NlbmRfZGF0YV9wYWNrZXRfYnJfZWRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIEJUX0hEUiogcF9idWYpOwotdm9pZCBhY2xfc2VuZF9kYXRhX3BhY2tldF9ibGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgQlRfSERSKiBwX2J1Zik7Ci12b2lkIGFjbF93cml0ZV9hdXRvbWF0aWNfZmx1c2hfdGltZW91dChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmx1c2hfdGltZW91dCk7Ci0KLS8vIEFDTCBkYXRhIHJlY2VpdmVkIGZyb20gSENJLUFDTAotZXh0ZXJuIHZvaWQgbDJjX3Jjdl9hY2xfZGF0YShCVF9IRFIqIHBfbXNnKTsKLQotLy8gU2VnbWVudHMgaXMgc2VudCB0byBIQ0ktQUNMCi1leHRlcm4gdm9pZCBsMmNfbGlua19zZWdtZW50c194bWl0dGVkKEJUX0hEUiogcF9tc2cpOwotCi1leHRlcm4gdm9pZCBsMmNfbGlua19oY2lfY29ubl9yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLWV4dGVybiB2b2lkIGwyY3VfcmVzdWJtaXRfcGVuZGluZ19zZWNfcmVxKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRhKTsKLQotZXh0ZXJuIHZvaWQgbDJjX2xpbmtfcHJvY2Vzc19udW1fY29tcGxldGVkX3BrdHModWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKTsKLQotZXh0ZXJuIHZvaWQgbDJjX3BhY2tldHNfY29tcGxldGVkKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX3NlbnQpOwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9sMmNhcF9jb250cm9sbGVyX2ludGVyZmFjZS5oIGIvc3RhY2svaW5jbHVkZS9sMmNhcF9jb250cm9sbGVyX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTIyNmQ2Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvbDJjYXBfY29udHJvbGxlcl9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0vLyBUaGlzIGhlYWRlciBjb250YWlucyBmdW5jdGlvbnMgZm9yIENvbnRyb2xsZXIgTW9kdWxlIHRvIGludm9rZQotCi1leHRlcm4gdm9pZCBsMmN1X3NldF9ub25fZmx1c2hhYmxlX3BiZihib29sIGlzX3N1cHBvcnRlZCk7Ci0KLWV4dGVybiB2b2lkIGwyY19saW5rX2luaXQoKTsKLQotZXh0ZXJuIHZvaWQgbDJjX2xpbmtfcHJvY2Vzc3NfYmxlX251bV9idWZzKHVpbnQxNl90IG51bV9sbV9hY2xfYnVmcyk7Ci0KLWV4dGVybiB2b2lkIGwyY3VfZGV2aWNlX3Jlc2V0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9sMmNhcF9oY2lfbGlua19pbnRlcmZhY2UuaCBiL3N0YWNrL2luY2x1ZGUvbDJjYXBfaGNpX2xpbmtfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjhlYTguLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9sMmNhcF9oY2lfbGlua19pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgZnVuY3Rpb25zIGZvciBIQ0ktTGlua01hbmFnZW1lbnQgdG8gaW52b2tlCi0KLWV4dGVybiBib29sIGwyY19saW5rX2hjaV9kaXNjX2NvbXAodWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pOwotCi1leHRlcm4gdm9pZCBsMmNfbGlua19yb2xlX2NoYW5nZWQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdWludDhfdCBuZXdfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhjaV9zdGF0dXMpOwotCi1leHRlcm4gYm9vbCBsMmNibGVfY29ubl9jb21wKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRCTEVfQUREUl9UWVBFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl90aW1lb3V0KTsKLQotZXh0ZXJuIGJvb2wgbDJjYmxlX2Nvbm5fY29tcF9mcm9tX2FkZHJlc3Nfd2l0aF90eXBlKAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByb2xlLCBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0KTsKLQotZXh0ZXJuIHZvaWQgbDJjYmxlX3Byb2Nlc3NfY29ubl91cGRhdGVfZXZ0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCk7Ci0KLWV4dGVybiB2b2lkIGwyY2JsZV9wcm9jZXNzX2RhdGFfbGVuZ3RoX2NoYW5nZV9ldmVudCh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdHhfZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcnhfZGF0YV9sZW4pOwotCi0vLyBOb3RpZnkgdG8gTDJjYXAgbGF5ZXIgdGhhdCBBQ0wgZGF0YSBvciByZW1vdGUgdmVyc2lvbiBpcyByZWNlaXZlZAotZXh0ZXJuIHZvaWQgbDJjYmxlX25vdGlmeV9sZV9jb25uZWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk7Ci0KLXZvaWQgbDJjYmxlX3VzZV9wcmVmZXJyZWRfY29ubl9wYXJhbXMoY29uc3QgUmF3QWRkcmVzcyYgYmRhKTsKLQotZXh0ZXJuIHZvaWQgbDJjYmxlX3Byb2Nlc3NfcmNfcGFyYW1fcmVxdWVzdF9ldnQodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCk7Ci0KLS8vIEludm9rZWQgd2hlbiBIQ0kgbW9kZSBpcyBjaGFuZ2VkIHRvIEhDSV9NT0RFX0FDVElWRSBvciBIQ0lfTU9ERV9TTklGRgotZXh0ZXJuIHZvaWQgbDJjX09uSGNpTW9kZUNoYW5nZVNlbmRQZW5kaW5nUGFja2V0cyhSYXdBZGRyZXNzIHJlbW90ZSk7Ci0KLS8vIEludm9rZWQgd2hlbiBIQ0kgaW5kaWNhdGVzIHRvIEwyY2FwIHRvIGNoZWNrIFNlY3VyaXR5IHJlcXVpcmVtZW50Ci1leHRlcm4gdm9pZCBsMmN1X3Jlc3VibWl0X3BlbmRpbmdfc2VjX3JlcShjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSk7CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2wyY2FwX3NlY3VyaXR5X2ludGVyZmFjZS5oIGIvc3RhY2svaW5jbHVkZS9sMmNhcF9zZWN1cml0eV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NDVlZC4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2wyY2FwX3NlY3VyaXR5X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNwcmFnbWEgb25jZQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBUaGlzIGhlYWRlciBjb250YWlucyBmdW5jdGlvbnMgZm9yIFNlY3VyaXR5IE1vZHVsZSB0byBpbnZva2UKLQotZXh0ZXJuIHZvaWQgbDJjdV91cGRhdGVfbGNiXzRfYm9uZGluZyhjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYm9uZGluZyk7Ci0KLWV4dGVybiBib29sIGwyY3Vfc3RhcnRfcG9zdF9ib25kX3RpbWVyKHVpbnQxNl90IGhhbmRsZSk7Ci0KLWV4dGVybiB2b2lkIGwyY19waW5fY29kZV9yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotCi1leHRlcm4gdm9pZCBsMmN1X3Jlc3VibWl0X3BlbmRpbmdfc2VjX3JlcShjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSk7Ci0KLS8vIEVzdGFibGlzaCBBQ0wgbGluayB0byByZW1vdGUgZGV2aWNlIGZvciBTZWN1cml0eSBNYW5hZ2VyL1BhaXJpbmcuCi0vLyBSZXR1cm5zIEJUTV9DTURfU1RBUlRFRCBpZiBhbHJlYWR5IGNvbm5lY3RpbmcsIEJUTV9OT19SRVNPVVJDRVMgaWYgY2FuJ3QKLS8vIGFsbG9jYXRlIGxjYiwgQlRNX1NVQ0NFU1MgaWYgaW5pdGlhdGVkIHRoZSBjb25uZWN0aW9uCi10QlRNX1NUQVRVUyBsMmN1X0Nvbm5lY3RBY2xGb3JTZWN1cml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotZXh0ZXJuIHZvaWQgbDJjYmxlX3VwZGF0ZV9zZWNfYWN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHNlY19hY3QpOwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9sMmNkZWZzLmggYi9zdGFjay9pbmNsdWRlL2wyY2RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllYzZmYS4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL2wyY2RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEwyQ0RFRlNfSAotI2RlZmluZSBMMkNERUZTX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0vKiBMMkNBUCBjb21tYW5kIGNvZGVzCi0qLwotI2RlZmluZSBMMkNBUF9DTURfUkVKRUNUIDB4MDEKLSNkZWZpbmUgTDJDQVBfQ01EX0NPTk5fUkVRIDB4MDIKLSNkZWZpbmUgTDJDQVBfQ01EX0NPTk5fUlNQIDB4MDMKLSNkZWZpbmUgTDJDQVBfQ01EX0NPTkZJR19SRVEgMHgwNAotI2RlZmluZSBMMkNBUF9DTURfQ09ORklHX1JTUCAweDA1Ci0jZGVmaW5lIEwyQ0FQX0NNRF9ESVNDX1JFUSAweDA2Ci0jZGVmaW5lIEwyQ0FQX0NNRF9ESVNDX1JTUCAweDA3Ci0jZGVmaW5lIEwyQ0FQX0NNRF9FQ0hPX1JFUSAweDA4Ci0jZGVmaW5lIEwyQ0FQX0NNRF9FQ0hPX1JTUCAweDA5Ci0jZGVmaW5lIEwyQ0FQX0NNRF9JTkZPX1JFUSAweDBBCi0jZGVmaW5lIEwyQ0FQX0NNRF9JTkZPX1JTUCAweDBCCi0jZGVmaW5lIEwyQ0FQX0NNRF9BTVBfQ09OTl9SRVEgMHgwQwotI2RlZmluZSBMMkNBUF9DTURfQU1QX01PVkVfUkVRIDB4MEUKLSNkZWZpbmUgTDJDQVBfQ01EX0JMRV9VUERBVEVfUkVRIDB4MTIKLSNkZWZpbmUgTDJDQVBfQ01EX0JMRV9VUERBVEVfUlNQIDB4MTMKLSNkZWZpbmUgTDJDQVBfQ01EX0JMRV9DUkVESVRfQkFTRURfQ09OTl9SRVEgMHgxNAotI2RlZmluZSBMMkNBUF9DTURfQkxFX0NSRURJVF9CQVNFRF9DT05OX1JFUyAweDE1Ci0jZGVmaW5lIEwyQ0FQX0NNRF9CTEVfRkxPV19DVFJMX0NSRURJVCAweDE2Ci0vKiBFbmhhbmNlZCBDb0MgKi8KLSNkZWZpbmUgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9DT05OX1JFUSAweDE3Ci0jZGVmaW5lIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfQ09OTl9SRVMgMHgxOAotI2RlZmluZSBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUSAweDE5Ci0jZGVmaW5lIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVTIDB4MUEKLQotLyogRGVmaW5lIHNvbWUgcGFja2V0IGFuZCBoZWFkZXIgbGVuZ3RocwotKi8KLS8qIExlbmd0aCBhbmQgQ0lEICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9QS1RfT1ZFUkhFQUQgNAotLyogQ21kIGNvZGUsIElkIGFuZCBsZW5ndGggICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9PVkVSSEVBRCA0Ci0vKiBSZWFzb24gKGRhdGEgaXMgb3B0aW9uYWwpICAgICAgICAgICAgKi8KLSNkZWZpbmUgTDJDQVBfQ01EX1JFSkVDVF9MRU4gMgotLyogUFNNIGFuZCBzb3VyY2UgQ0lEICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0NPTk5fUkVRX0xFTiA0Ci0vKiBEZXN0IENJRCwgc291cmNlIENJRCwgcmVhc29uLCBzdGF0dXMgKi8KLSNkZWZpbmUgTDJDQVBfQ09OTl9SU1BfTEVOIDgKLS8qIERlc3QgQ0lELCBmbGFncyAoZGF0YSBpcyBvcHRpb25hbCkgICAqLwotI2RlZmluZSBMMkNBUF9DT05GSUdfUkVRX0xFTiA0Ci0vKiBEZXN0IENJRCwgZmxhZ3MsIHJlc3VsdCxkYXRhIG9wdGlvbmFsKi8KLSNkZWZpbmUgTDJDQVBfQ09ORklHX1JTUF9MRU4gNgotLyogRGVzdCBDSUQsIHNvdXJjZSBDSUQgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0RJU0NfUkVRX0xFTiA0Ci0vKiBEZXN0IENJRCwgc291cmNlIENJRCAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTDJDQVBfRElTQ19SU1BfTEVOIDQKLS8qIERhdGEgaXMgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9FQ0hPX1JFUV9MRU4gMAotLyogRGF0YSBpcyBvcHRpb25hbCAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0VDSE9fUlNQX0xFTiAwCi0vKiBJbmZvIHR5cGUsIHJlc3VsdCAoZGF0YSBpcyBvcHRpb25hbCkgKi8KLSNkZWZpbmUgTDJDQVBfSU5GT19SU1BfTEVOIDQKLQotLyogTWluIGFuZCBtYXggaW50ZXJ2YWwsIGxhdGVuY3ksIHRvdXQgICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9CTEVfVVBEX1JFUV9MRU4gOAotLyogUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9CTEVfVVBEX1JTUF9MRU4gMgotCi0vKiBMRV9QU00sIFNDSUQsIE1UVSwgTVBTLCBJbml0IENyZWRpdCAqLwotI2RlZmluZSBMMkNBUF9DTURfQkxFX0NSRURJVF9CQVNFRF9DT05OX1JFUV9MRU4gMTAKLS8qIERDSUQsIE1UVSwgTVBTLCBJbml0IGNyZWRpdCwgUmVzdWx0ICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9CTEVfQ1JFRElUX0JBU0VEX0NPTk5fUkVTX0xFTiAxMAotLyogQ0lELCBDcmVkaXQgKi8KLSNkZWZpbmUgTDJDQVBfQ01EX0JMRV9GTE9XX0NUUkxfQ1JFRElUX0xFTiA0Ci0KLS8qIExFIFBTTSwgTVRVLCBNUFMsIEluaXRpYWwgQ3JlZGl0cywgU0NJRFNbXSAqLwotI2RlZmluZSBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX0NPTk5fUkVRX01JTl9MRU4gOAotLyogTVRVLCBNUFMsIEluaXRpYWwgQ3JlZGl0cywgUmVzdWx0LCBEQ0lEU1tdICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfQ09OTl9SRVNfTUlOX0xFTiA4Ci0KLS8qIE1UVSwgTVBTLCBEQ0lEU1tdICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVRX01JTl9MRU4gNAotLyogUmVzdWx0ICovCi0jZGVmaW5lIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVTX0xFTiAyCi0KLS8qIERlZmluZSB0aGUgcGFja2V0IGJvdW5kYXJ5IGZsYWdzCi0qLwotI2RlZmluZSBMMkNBUF9QS1RfU1RBUlRfTk9OX0ZMVVNIQUJMRSAwCi0jZGVmaW5lIEwyQ0FQX1BLVF9TVEFSVCAyCi0jZGVmaW5lIEwyQ0FQX1BLVF9DT05USU5VRSAxCi0jZGVmaW5lIEwyQ0FQX1BLVF9UWVBFX1NISUZUIDEyCi0KLS8qIERlZmluZSB0aGUgTDJDQVAgY29ubmVjdGlvbiByZXN1bHQgY29kZXMKLSovCi10eXBlZGVmIGVudW0gOiB1aW50MTZfdCB7Ci0gIEwyQ0FQX0NPTk5fT0sgPSAwLAotICBMMkNBUF9DT05OX1BFTkRJTkcgPSAxLAotICBMMkNBUF9DT05OX05PX1BTTSA9IDIsCi0gIEwyQ0FQX0NPTk5fU0VDVVJJVFlfQkxPQ0sgPSAzLAotICBMMkNBUF9DT05OX05PX1JFU09VUkNFUyA9IDQsCi0gIEwyQ0FQX0NPTk5fT1RIRVJfRVJST1IgPSA1LAotICBMMkNBUF9DT05OX1RJTUVPVVQgPSAweEVFRUUsCi0gIC8qIEFkZCBhIGNvdXBsZSBvZiBvdXIgb3duIGZvciBpbnRlcm5hbCB1c2UgKi8KLSAgTDJDQVBfQ09OTl9OT19MSU5LID0gMjU1LAotICBMMkNBUF9DT05OX0NBTkNFTCA9IDI1NiwgLyogTDJDQVAgY29ubmVjdGlvbiBjYW5jZWxsZWQgKi8KLX0gdEwyQ0FQX0NPTk47Ci0KLS8qIERlZmluZSB0aGUgTEUgTDJDQVAgQ29ubmVjdGlvbiBSZXNwb25zZSBSZXN1bHQgY29kZXMKLSAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIEwyQ0FQX0xFX1JFU1VMVF9DT05OX09LID0gMCwKLSAgTDJDQVBfTEVfUkVTVUxUX05PX1BTTSA9IDIsCi0gIEwyQ0FQX0xFX1JFU1VMVF9OT19SRVNPVVJDRVMgPSA0LAotICBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0FVVEhFTlRJQ0FUSU9OID0gNSwKLSAgTDJDQVBfTEVfUkVTVUxUX0lOU1VGRklDSUVOVF9BVVRIT1JJWkFUSU9OID0gNiwKLSAgTDJDQVBfTEVfUkVTVUxUX0lOU1VGRklDSUVOVF9FTkNSWVBfS0VZX1NJWkUgPSA3LAotICBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0VOQ1JZUCA9IDgsCi0gIC8qIFdlIGRvbid0IGxpa2UgcGVlciBkZXZpY2UgcmVzcG9uc2UgKi8KLSAgTDJDQVBfTEVfUkVTVUxUX0lOVkFMSURfU09VUkNFX0NJRCA9IDksCi0gIEwyQ0FQX0xFX1JFU1VMVF9TT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEID0gMHgwQSwKLSAgTDJDQVBfTEVfUkVTVUxUX1VOQUNDRVBUQUJMRV9QQVJBTUVURVJTID0gMHgwQiwKLSAgTDJDQVBfTEVfUkVTVUxUX0lOVkFMSURfUEFSQU1FVEVSUyA9IDB4MEMKLX0gdEwyQ0FQX0xFX1JFU1VMVF9DT0RFOwotCi1pbmxpbmUgc3RkOjpzdHJpbmcgbDJjYXBfbGVfcmVzdWx0X2NvZGVfdGV4dCgKLSAgICBjb25zdCB0TDJDQVBfTEVfUkVTVUxUX0NPREUmIGNvZGUpIHsKLSAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfQ09OTl9PSzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygibGUgY29ubmVjdGlvbiBzdWNjZXNzIik7Ci0gICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfTk9fUFNNOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJsZSBubyBwc20gc2VydmljZSIpOwotICAgIGNhc2UgTDJDQVBfTEVfUkVTVUxUX05PX1JFU09VUkNFUzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygibGUgbm8gcmVzb3VyY2VzIik7Ci0gICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0FVVEhFTlRJQ0FUSU9OOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJsZSBhdXRoZW50aWNhdGlvbiBmYWlsZWQiKTsKLSAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9JTlNVRkZJQ0lFTlRfQVVUSE9SSVpBVElPTjoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygibGUgYXV0aG9yaXphdGlvbiBmYWlsZWQiKTsKLSAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9JTlNVRkZJQ0lFTlRfRU5DUllQX0tFWV9TSVpFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJsZSBlbmNyeXB0aW9uIGtleSBzaXplIGZhaWxlZCIpOwotICAgIGNhc2UgTDJDQVBfTEVfUkVTVUxUX0lOU1VGRklDSUVOVF9FTkNSWVA6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImxlIGVuY3J5cHRpb24gZmFpbGVkIik7Ci0gICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfSU5WQUxJRF9TT1VSQ0VfQ0lEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJsZSBpbnZhbGlkIHNvdXJjZSBjaGFubmVsIGlkZW50aWZpZXIiKTsKLSAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9TT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJsZSBzb3VyY2UgY2hhbm5lbCBpZGVudGlmaWVyIGJ1c3kiKTsKLSAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9VTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUzoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygibGUgdW5hY2NlcHRhYmxlIHBhcmFtZXRlcnMiKTsKLSAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9JTlZBTElEX1BBUkFNRVRFUlM6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImludmFsaWQgcGFyYW1ldGVycyIpOwotICB9Ci19Ci0KLS8qIENyZWRpdCBiYXNlZCByZWNvbmZpZyByZXN1bHRzIGNvZGUgKi8KLSNkZWZpbmUgTDJDQVBfUkVDT05GSUdfU1VDQ0VFRCAwCi0jZGVmaW5lIEwyQ0FQX1JFQ09ORklHX1JFRFVDVElPTl9NVFVfTk9fQUxMT1dFRCAxCi0jZGVmaW5lIEwyQ0FQX1JFQ09ORklHX1JFRFVDVElPTl9NUFNfTk9fQUxMT1dFRCAyCi0jZGVmaW5lIEwyQ0FQX1JFQ09ORklHX0lOVkFMSURfRENJRCAzCi0jZGVmaW5lIEwyQ0FQX1JFQ09ORklHX1VOQUNDQVBURURfUEFSQU0gNAotCi0vKiBEZWZpbmUgdGhlIEwyQ0FQIGNvbW1hbmQgcmVqZWN0IHJlYXNvbiBjb2RlcwotKi8KLSNkZWZpbmUgTDJDQVBfQ01EX1JFSl9OT1RfVU5ERVJTVE9PRCAwCi0jZGVmaW5lIEwyQ0FQX0NNRF9SRUpfTVRVX0VYQ0VFREVEIDEKLSNkZWZpbmUgTDJDQVBfQ01EX1JFSl9JTlZBTElEX0NJRCAyCi0KLS8qIEwyQ0FQIFByZWRlZmluZWQgQ0lEcwotKi8KLWVudW0gOiB1aW50MTZfdCB7Ci0gIEwyQ0FQX1NJR05BTExJTkdfQ0lEID0gMSwKLSAgTDJDQVBfQ09OTkVDVElPTkxFU1NfQ0lEID0gMiwKLSAgTDJDQVBfQU1QX0NJRCA9IDMsCi0gIEwyQ0FQX0FUVF9DSUQgPSA0LAotICBMMkNBUF9CTEVfU0lHTkFMTElOR19DSUQgPSA1LAotICBMMkNBUF9TTVBfQ0lEID0gNiwKLSAgTDJDQVBfU01QX0JSX0NJRCA9IDcsCi0gIEwyQ0FQX0JBU0VfQVBQTF9DSUQgPSAweDAwNDAsCi19OwotCi0vKiBGaXhlZCBDaGFubmVscyBtYXNrIGJpdHMgKi8KLQotLyogU2lnbmFsIGNoYW5uZWwgc3VwcG9ydGVkIChNYW5kYXRvcnkpICovCi0jZGVmaW5lIEwyQ0FQX0ZJWEVEX0NITkxfU0lHX0JJVCAoMSA8PCBMMkNBUF9TSUdOQUxMSU5HX0NJRCkKLQotLyogQ29ubmVjdGlvbmxlc3MgcmVjZXB0aW9uICovCi0jZGVmaW5lIEwyQ0FQX0ZJWEVEX0NITkxfQ05DVExFU1NfQklUICgxIDw8IEwyQ0FQX0NPTk5FQ1RJT05MRVNTX0NJRCkKLQotLyogQXR0cmlidXRlIHByb3RvY29sIHN1cHBvcnRlZCAqLwotI2RlZmluZSBMMkNBUF9GSVhFRF9DSE5MX0FUVF9CSVQgKDEgPDwgTDJDQVBfQVRUX0NJRCkKLQotLyogQkxFIFNpZ25hbGxpbmcgc3VwcG9ydGVkICovCi0jZGVmaW5lIEwyQ0FQX0ZJWEVEX0NITkxfQkxFX1NJR19CSVQgKDEgPDwgTDJDQVBfQkxFX1NJR05BTExJTkdfQ0lEKQotCi0vKiBCTEUgU2VjdXJpdHkgTWdyIHN1cHBvcnRlZCAqLwotI2RlZmluZSBMMkNBUF9GSVhFRF9DSE5MX1NNUF9CSVQgKDEgPDwgTDJDQVBfU01QX0NJRCkKLQotLyogU2VjdXJpdHkgTWdyIG92ZXIgQlIgc3VwcG9ydGVkICovCi0jZGVmaW5lIEwyQ0FQX0ZJWEVEX0NITkxfU01QX0JSX0JJVCAoMSA8PCBMMkNBUF9TTVBfQlJfQ0lEKQotCi0vKiBEZWZpbmUgdGhlIEwyQ0FQIGNvbmZpZ3VyYXRpb24gcmVzdWx0IGNvZGVzCi0qLwotI2RlZmluZSBMMkNBUF9DRkdfT0sgMAotI2RlZmluZSBMMkNBUF9DRkdfVU5BQ0NFUFRBQkxFX1BBUkFNUyAxCi0jZGVmaW5lIEwyQ0FQX0NGR19GQUlMRURfTk9fUkVBU09OIDIKLSNkZWZpbmUgTDJDQVBfQ0ZHX1VOS05PV05fT1BUSU9OUyAzCi0jZGVmaW5lIEwyQ0FQX0NGR19QRU5ESU5HIDQKLQotc3RhdGljX2Fzc2VydChMMkNBUF9DT05OX09USEVSX0VSUk9SICE9IEwyQ0FQX0NGR19GQUlMRURfTk9fUkVBU09OLAotICAgICAgICAgICAgICAiRGlmZmVyZW50IGVycm9yIGNvZGUgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciBDb25uZWN0IGVycm9yIGFuZCAiCi0gICAgICAgICAgICAgICJDb25maWcgZXJyb3IiKTsKLQotLyogRGVmaW5lIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uIG9wdGlvbiB0eXBlcwotKi8KLSNkZWZpbmUgTDJDQVBfQ0ZHX1RZUEVfTVRVIDB4MDEKLSNkZWZpbmUgTDJDQVBfQ0ZHX1RZUEVfRkxVU0hfVE9VVCAweDAyCi0jZGVmaW5lIEwyQ0FQX0NGR19UWVBFX1FPUyAweDAzCi0jZGVmaW5lIEwyQ0FQX0NGR19UWVBFX0ZDUiAweDA0Ci0jZGVmaW5lIEwyQ0FQX0NGR19UWVBFX0ZDUyAweDA1Ci0jZGVmaW5lIEwyQ0FQX0NGR19UWVBFX0VYVF9GTE9XIDB4MDYKLQotI2RlZmluZSBMMkNBUF9DRkdfTVRVX09QVElPTl9MRU4gMiAgICAgICAvKiBNVFUgb3B0aW9uIGxlbmd0aCAgICAqLwotI2RlZmluZSBMMkNBUF9DRkdfRkxVU0hfT1BUSU9OX0xFTiAyICAgICAvKiBGbHVzaCBvcHRpb24gbGVuICAgICAqLwotI2RlZmluZSBMMkNBUF9DRkdfUU9TX09QVElPTl9MRU4gMjIgICAgICAvKiBRT1Mgb3B0aW9uIGxlbmd0aCAgICAqLwotI2RlZmluZSBMMkNBUF9DRkdfRkNSX09QVElPTl9MRU4gOSAgICAgICAvKiBGQ1Igb3B0aW9uIGxlbmd0aCAgICAqLwotI2RlZmluZSBMMkNBUF9DRkdfRkNTX09QVElPTl9MRU4gMSAgICAgICAvKiBGQ1Igb3B0aW9uIGxlbmd0aCAgICAqLwotI2RlZmluZSBMMkNBUF9DRkdfRVhUX0ZMT1dfT1BUSU9OX0xFTiAxNiAvKiBFeHRlbmRlZCBGbG93IFNwZWMgICAqLwotI2RlZmluZSBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEIDIgICAgICAvKiBUeXBlIGFuZCBsZW5ndGggICAgICAqLwotCi0vKiBDb25maWd1cmF0aW9uIENtZC9Sc3AgRmxhZ3MgbWFzawotKi8KLSNkZWZpbmUgTDJDQVBfQ0ZHX0ZMQUdTX01BU0tfQ09OVCAweDAwMDEgLyogRmxhZ3MgbWFzazogQ29udGludWF0aW9uICovCi0KLS8qIEZDUyBDaGVjayBPcHRpb24gdmFsdWVzCi0qLwotI2RlZmluZSBMMkNBUF9DRkdfRkNTX0JZUEFTUyAwIC8qIEJ5cGFzcyB0aGUgRkNTIGluIHN0cmVhbWluZyBvciBFUlRNIG1vZGVzICovCi0jZGVmaW5lIEwyQ0FQX0NGR19GQ1NfVVNFIFwKLSAgMSAvKiBVc2UgdGhlIEZDUyBpbiBzdHJlYW1pbmcgb3IgRVJUTSBtb2RlcyBbZGVmYXVsdF0gKi8KLQotLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGNvbmZpZ3VyYXRpb24KLSovCi0jZGVmaW5lIEwyQ0FQX05PX0FVVE9NQVRJQ19GTFVTSCAweEZGRkYKLQotI2RlZmluZSBMMkNBUF9ERUZBVUxUX01UVSAoNjcyKQotI2RlZmluZSBMMkNBUF9ERUZBVUxUX1NFUlZfVFlQRSAxCi0jZGVmaW5lIEwyQ0FQX0RFRkFVTFRfVE9LRU5fUkFURSAwCi0jZGVmaW5lIEwyQ0FQX0RFRkFVTFRfQlVDS0VUX1NJWkUgMAotI2RlZmluZSBMMkNBUF9ERUZBVUxUX1BFQUtfQkFORFdJRFRIIDAKLSNkZWZpbmUgTDJDQVBfREVGQVVMVF9MQVRFTkNZIDB4RkZGRkZGRkYKLSNkZWZpbmUgTDJDQVBfREVGQVVMVF9ERUxBWSAweEZGRkZGRkZGCi0KLS8qIERlZmluZSB0aGUgTDJDQVAgZGlzY29ubmVjdCByZXN1bHQgY29kZXMKLSovCi0jZGVmaW5lIEwyQ0FQX0RJU0NfT0sgMAotI2RlZmluZSBMMkNBUF9ESVNDX1RJTUVPVVQgMHhFRUVFCi0KLS8qIERlZmluZSB0aGUgTDJDQVAgaW5mbyByZXNwIHJlc3VsdCBjb2RlcwotKi8KLSNkZWZpbmUgTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9TVUNDRVNTIDAKLSNkZWZpbmUgTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9OT1RfU1VQUE9SVEVEIDEKLQotLyogRGVmaW5lIHRoZSBpbmZvLXR5cGUgZmllbGRzIG9mIGluZm9ybWF0aW9uIHJlcXVlc3QgJiByZXNwb25zZQotKi8KLSNkZWZpbmUgTDJDQVBfQ09OTkxFU1NfTVRVX0lORk9fVFlQRSAweDAwMDEKLS8qIFVzZWQgaW4gSW5mb3JtYXRpb24gUmVxL1Jlc3BvbnNlICovCi0jZGVmaW5lIEwyQ0FQX0VYVEVOREVEX0ZFQVRVUkVTX0lORk9fVFlQRSAweDAwMDIKLS8qIFVzZWQgaW4gQU1QICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0ZJWEVEX0NIQU5ORUxTX0lORk9fVFlQRSAweDAwMDMKLQotLyogQ29ubmVjdGlvbmxlc3MgTVRVIHNpemUgICAgICAgICAgKi8KLSNkZWZpbmUgTDJDQVBfQ09OTkxFU1NfTVRVX0lORk9fU0laRSAyCi0vKiBFeHRlbmRlZCBmZWF0dXJlcyBhcnJheSBzaXplICAgICAqLwotI2RlZmluZSBMMkNBUF9FWFRFTkRFRF9GRUFUVVJFU19BUlJBWV9TSVpFIDQKLS8qIEZpeGVkIGNoYW5uZWwgYXJyYXkgc2l6ZSAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0ZJWEVEX0NITkxfQVJSQVlfU0laRSA4Ci0KLS8qIEV4dGVuZGVkIGZlYXR1cmVzIG1hc2sgYml0cwotKi8KLS8qIEVuaGFuY2VkIHJldHJhbnNtaXNzaW9uIG1vZGUgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0VYVEZFQV9FTkhfUkVUUkFOUyAweDAwMDAwMDA4Ci0vKiBTdHJlYW1pbmcgTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9FWFRGRUFfU1RSRUFNX01PREUgMHgwMDAwMDAxMAotLyogT3B0aW9uYWwgRkNTIChpZiBzZXQgTm8gRkNTIGRlc2lyZWQpICAgKi8KLSNkZWZpbmUgTDJDQVBfRVhURkVBX05PX0NSQyAweDAwMDAwMDIwCi0vKiBFeHRlbmRlZCBmbG93IHNwZWMgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9FWFRGRUFfRVhUX0ZMT1dfU1BFQyAweDAwMDAwMDQwCi0vKiBGaXhlZCBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9FWFRGRUFfRklYRURfQ0hOTFMgMHgwMDAwMDA4MAotLyogRXh0ZW5kZWQgV2luZG93IFNpemUgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTDJDQVBfRVhURkVBX0VYVF9XSU5ET1cgMHgwMDAwMDEwMAotLyogVW5pY2FzdCBDb25uZWN0aW9ubGVzcyBEYXRhIFJlY2VwdGlvbiAgKi8KLSNkZWZpbmUgTDJDQVBfRVhURkVBX1VDRF9SRUNFUFRJT04gMHgwMDAwMDIwMAotCi0vKiBNYXNrIGZvciBsb2NhbGx5IHN1cHBvcnRlZCBmZWF0dXJlcyB1c2VkIGluIEluZm9ybWF0aW9uIFJlc3BvbnNlCi0gKiAoZGVmYXVsdCB0byBub25lKSAqLwotI2lmbmRlZiBMMkNBUF9FWFRGRUFfU1VQUE9SVEVEX01BU0sKLSNkZWZpbmUgTDJDQVBfRVhURkVBX1NVUFBPUlRFRF9NQVNLIDAKLSNlbmRpZgotCi0vKiBNYXNrIGZvciBMRSBzdXBwb3J0ZWQgZmVhdHVyZXMgdXNlZCBpbiBJbmZvcm1hdGlvbiBSZXNwb25zZQotICogKGRlZmF1bHQgdG8gbm9uZSkgKi8KLSNpZm5kZWYgTDJDQVBfQkxFX0VYVEZFQV9NQVNLCi0jZGVmaW5lIEwyQ0FQX0JMRV9FWFRGRUFfTUFTSyAwCi0jZW5kaWYKLQotLyogRGVmaW5lIGEgdmFsdWUgdGhhdCB0ZWxscyBMMkNBUCB0byB1c2UgdGhlIGRlZmF1bHQgSENJIEFDTCBidWZmZXIgc2l6ZSAqLwotI2RlZmluZSBMMkNBUF9JTlZBTElEX0VSTV9CVUZfU0laRSAwCi0vKiBEZWZpbmUgYSB2YWx1ZSB0aGF0IHRlbGxzIEwyQ0FQIHRvIHVzZSB0aGUgZGVmYXVsdCBNUFMgKi8KLSNkZWZpbmUgTDJDQVBfREVGQVVMVF9FUk1fTVBTIDB4MDAwMAotCi0jZGVmaW5lIEwyQ0FQX0ZDUl9PVkVSSEVBRCAyICAgICAgICAgLyogQ29udHJvbCB3b3JkICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9GQ1NfTEVOIDIgICAgICAgICAgICAgIC8qIEZDUyB0YWtlcyAyIGJ5dGVzICovCi0jZGVmaW5lIEwyQ0FQX1NEVV9MRU5fT1ZFUkhFQUQgMiAgICAgLyogU0RVIGxlbmd0aCBmaWVsZCBpcyAyIGJ5dGVzICovCi0jZGVmaW5lIEwyQ0FQX1NEVV9MRU5fT0ZGU0VUIDIgICAgICAgLyogU0RVIGxlbmd0aCBvZmZzZXQgaXMgMiBieXRlcyAqLwotI2RlZmluZSBMMkNBUF9FWFRfQ09OVFJPTF9PVkVSSEVBRCA0IC8qIEV4dGVuZGVkIENvbnRyb2wgRmllbGQgICAgICAgKi8KLS8qIGxlbmd0aCgyKSwgY2hhbm5lbCgyKSwgY29udHJvbCg0KSwgU0RVIGxlbmd0aCgyKSBGQ1MoMikgKi8KLSNkZWZpbmUgTDJDQVBfTUFYX0hFQURFUl9GQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0VYVF9DT05UUk9MX09WRVJIRUFEICsgTDJDQVBfU0RVX0xFTl9PVkVSSEVBRCArIFwKLSAgIEwyQ0FQX0ZDU19MRU4pCi0KLS8qIFRPRE86IFRoaXMgdmFsdWUgY2FuIHByb2JhYmx5IGJlIG9wdGltaXplZCBwZXIgdHJhbnNwb3J0LCBhbmQgcGVyIEwyQ0FQCi0gKiBzb2NrZXQgdHlwZSwgYnV0IHRoaXMgc2hvdWxkIG5vdCBicmluZyBhbnkgYmlnIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4gRm9yCi0gKiBMRSBDb0MsIGl0IHNob3VsZCBiZSBiaWdnZXN0IG11bHRpcGxlIG9mICJQRFUgbGVuZ3RoIiBzbWFsbGVyIHRoYW4gMHhmZmZmIChzbwotICogZGVwZW5kIG9uIGNvbnRyb2xsZXIgYnVmZmVyIHNpemUpLCBmb3IgQ2xhc3NpYywgbWFraW5nIGl0IG11bHRpcGxlIG9mIFBEVQotICogbGVuZ3RoIGFuZCBhbHNvIG9mIHRoZSAzREg1IGFpciBpbmNsdWRpbmcgdGhlIGwyY2FwIGhlYWRlcnMgaW4gZWFjaCBwYWNrZXQuCi0gKi8KLSNkZWZpbmUgTDJDQVBfU0RVX0xFTkdUSF9NQVggKDgwODAgKyAyNiAtIChMMkNBUF9NSU5fT0ZGU0VUICsgNikpCi1jb25zdGV4cHIgdWludDE2X3QgTDJDQVBfU0RVX0xFTkdUSF9MRV9NQVggPSAweGZmZmY7Ci0KLS8qIFNBUiBiaXRzIGluIHRoZSBjb250cm9sIHdvcmQKLSovCi0vKiBDb250cm9sIHdvcmQgdG8gYmVnaW4gd2l0aCBmb3IgdW5zZWdtZW50ZWQgUERVKi8KLSNkZWZpbmUgTDJDQVBfRkNSX1VOU0VHX1NEVSAweDAwMDAKLS8qIC4uLmZvciBTdGFydGluZyBQRFUgb2YgYSBzZW1lbnRlZCBTRFUgKi8KLSNkZWZpbmUgTDJDQVBfRkNSX1NUQVJUX1NEVSAweDQwMDAKLS8qIC4uLmZvciBlbmRpbmcgUERVIG9mIGEgc2VnbWVudGVkIFNEVSAqLwotI2RlZmluZSBMMkNBUF9GQ1JfRU5EX1NEVSAweDgwMDAKLS8qIC4uLmZvciBjb250aW51YXRpb24gUERVIG9mIGEgc2VnbWVudGVkIFNEVSAqLwotI2RlZmluZSBMMkNBUF9GQ1JfQ09OVF9TRFUgMHhjMDAwCi0KLS8qIFN1cGVydmlzb3J5IGZyYW1lIHR5cGVzICovCi0vKiBTdXBlcnZpc29yeSBmcmFtZSAtIFJSICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9GQ1JfU1VQX1JSIDB4MDAwMAotLyogU3VwZXJ2aXNvcnkgZnJhbWUgLSBSRUogICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTDJDQVBfRkNSX1NVUF9SRUogMHgwMDAxCi0vKiBTdXBlcnZpc29yeSBmcmFtZSAtIFJOUiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMMkNBUF9GQ1JfU1VQX1JOUiAweDAwMDIKLS8qIFN1cGVydmlzb3J5IGZyYW1lIC0gU1JFSiAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9TVVBfU1JFSiAweDAwMDMKLQotLyogTWFzayB0byBnZXQgdGhlIFNBUiBiaXRzIGZyb20gY29udHJvbCB3b3JkICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9TQVJfQklUUyAweEMwMDAKLS8qIEJpdHMgdG8gc2hpZnQgcmlnaHQgdG8gZ2V0IHRoZSBTQVIgYml0cyBmcm9tIGN0cmwtd29yZCAqLwotI2RlZmluZSBMMkNBUF9GQ1JfU0FSX0JJVFNfU0hJRlQgMTQKLQotLyogTWFzayB0byBjaGVjayBpZiBhIFBEVSBpcyBTLWZyYW1lICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9TX0ZSQU1FX0JJVCAweDAwMDEKLS8qIE1hc2sgdG8gZ2V0IHRoZSByZXEtc2VxIGZyb20gY29udHJvbCB3b3JkICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9SRVFfU0VRX0JJVFMgMHgzRjAwCi0vKiBCaXRzIHRvIHNoaWZ0IHJpZ2h0IHRvIGdldCB0aGUgcmVxLXNlcSBmcm9tIGN0cmwtd29yZCAqLwotI2RlZmluZSBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTX1NISUZUIDgKLS8qIE1hc2sgb24gZ2V0IHRoZSB0eC1zZXEgZnJvbSBjb250cm9sIHdvcmQgKi8KLSNkZWZpbmUgTDJDQVBfRkNSX1RYX1NFUV9CSVRTIDB4MDA3RQotLyogQml0cyB0byBzaGlmdCByaWdodCB0byBnZXQgdGhlIHR4LXNlcSBmcm9tIGN0cmwtd29yZCAqLwotI2RlZmluZSBMMkNBUF9GQ1JfVFhfU0VRX0JJVFNfU0hJRlQgMQotCi0vKiBGLWJpdCBpbiB0aGUgY29udHJvbCB3b3JkIChTdXAgYW5kIEkgZnJhbWVzKSAgKi8KLSNkZWZpbmUgTDJDQVBfRkNSX0ZfQklUIDB4MDA4MAotLyogUC1iaXQgaW4gdGhlIGNvbnRyb2wgd29yZCAoU3VwIGZyYW1lcyBvbmx5KSAgICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9QX0JJVCAweDAwMTAKLQotI2RlZmluZSBMMkNBUF9GQ1JfRl9CSVRfU0hJRlQgNwotI2RlZmluZSBMMkNBUF9GQ1JfUF9CSVRfU0hJRlQgNAotCi0vKiBNYXNrIHRvIGdldCB0aGUgc2VnbWVudGF0aW9uIGJpdHMgZnJvbSBjdHJsLXdvcmQgKi8KLSNkZWZpbmUgTDJDQVBfRkNSX1NFR19CSVRTIDB4QzAwMAotLyogQml0cyB0byBzaGlmdCByaWdodCB0byBnZXQgdGhlIFMtYml0cyBmcm9tIGN0cmwtd29yZCAqLwotI2RlZmluZSBMMkNBUF9GQ1JfU1VQX1NISUZUIDIKLS8qIE1hc2sgdG8gZ2V0IHRoZSBzdXBlcnZpc29yeSBiaXRzIGZyb20gY3RybC13b3JkICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9TVVBfQklUUyAweDAwMEMKLQotLyogSW5pdGlhbCBzdGF0ZSBvZiB0aGUgQ1JDIHJlZ2lzdGVyICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9JTklUX0NSQyAwCi0vKiBNYXNrIGZvciBzZXF1ZW5jZSBudW1iZXJzIChyYW5nZSAwIC0gNjMpICovCi0jZGVmaW5lIEwyQ0FQX0ZDUl9TRVFfTU9EVUxPIDB4M0YKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL2xkYWNCVF9iY29fZm9yX2ZsdW9yaWRlLmggYi9zdGFjay9pbmNsdWRlL2xkYWNCVF9iY29fZm9yX2ZsdW9yaWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOWU1NDguLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9sZGFjQlRfYmNvX2Zvcl9mbHVvcmlkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIExEQUNCVF9CQ09fRk9SX0ZMVU9SSURFX0hfXwotI2RlZmluZSBMREFDQlRfQkNPX0ZPUl9GTFVPUklERV9IX18KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxjc3RkaW50PgotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2lmbmRlZiBMREFDX0JDT19BUEkKLSNkZWZpbmUgTERBQ19CQ09fQVBJCi0jZW5kaWYgLyogTERBQ19CQ09fQVBJICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMsIGRlY2xhcmF0aW9ucyBhbmQgbWFjcm9zIGZvciBhbgotICogaW1wbGltZW50YXRpb24gb2YgTERBQyBidWZmZXIgY29udHJvbCBvcGVyYXRpb24uCi0gKi8KLQotI2RlZmluZSBMREFDX0JDT19FUlJfTk9ORSAwCi0jZGVmaW5lIExEQUNfQkNPX0VSUl9GQVRBTCAoLTEpCi0KLS8qIExEQUMgQkNPIGhhbmRsZSB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBfbGRhY2J0X2Jjb19oYW5kbGUqIEhBTkRMRV9MREFDX0JDTzsKLQotdHlwZWRlZiB2b2lkICgqZGVjb2RlZF9kYXRhX2NhbGxiYWNrX3QpKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotLyogUHJlcGFyZSB0byB1c2UgTERBQyBCQ08uCi0gKiAgLSBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwYXNzaW5nIGRlY29kZWQgZGF0YS4KLSAqICAtIEFsbG9jYXRpb24gb2YgTERBQyBCQ08gaGFuZGxlLgotICogIEZvcm1hdAotICogICAgICBIQU5ETEVfTERBQ19CQ08gbGRhY19CQ09faW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spOwotICogIEFyZ3VtZW50cwotICogICAgICBkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2sKLSAqICAgICAgICAgICAgICBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IG91dHB1dHMgUENNIGRhdGEgYWZ0ZXIgZGVjb2RpbmcuCi0gKiAgICAgICAgICAgICAgKFNlZSBhbHNvIGEyZHBfY29kZWNfYXBpLmgpCi0gKiAgUmV0dXJuIHZhbHVlCi0gKiAgICAgIEhBTkRMRV9MREFDX0JDTyBmb3Igc3VjY2VzcywgTlVMTCBmb3IgZmFpbHVyZS4KLSAqLwotTERBQ19CQ09fQVBJIEhBTkRMRV9MREFDX0JDTwotbGRhY19CQ09faW5pdChkZWNvZGVkX2RhdGFfY2FsbGJhY2tfdCBkZWNvZGVfY2FsbGJhY2spOwotCi0vKiBFbmQgTERBQyBCQ08uCi0gKiAgLSBSZWxlYXNlIG9mIExEQUMgQkNPIGhhbmRsZS4KLSAqICBGb3JtYXQKLSAqICAgICAgaW50MzJfdCBsZGFjX0JDT19jbGVhbnVwKEhBTkRMRV9MREFDX0JDTyBoTGRhY0Jjbyk7Ci0gKiAgQXJndW1lbnRzCi0gKiAgICAgIEhBTkRMRV9MREFDX0JDTyAgaExkYWNCY28gICAgTERBQyBCQ08gaGFuZGxlLgotICogIFJldHVybiB2YWx1ZQotICogICAgICBpbnQzMl90IDogUHJvY2Vzc2luZyByZXN1bHQuCi0gKiAgICAgICAgICAgICAgTERBQ19CQ09fRVJSX05PTkU6U3VjY2Vzc2Z1bCBjb21wbGV0aW9uCi0gKiAgICAgICAgICAgICAgTERBQ19CQ09fRVJSX0ZBVEFMOkVycm9yCi0gKiAgTm90ZQotICogICAgICBUaGUgZnVuY3Rpb24gbGRhY19CQ09faW5pdCgpIHNoYWxsIGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzCi0gKiAgICAgIGZ1bmN0aW9uLgotICovCi1MREFDX0JDT19BUEkgaW50MzJfdCBsZGFjX0JDT19jbGVhbnVwKEhBTkRMRV9MREFDX0JDTyBoTGRhY0Jjbyk7Ci0KLS8qIERlY29kZSBMREFDIHBhY2tldHMuCi0gKiAtIFBlcmZvcm0gYnVmZmVyIGNvbnRyb2wgYW5kIGRlY29kZSBwcm9jZXNzaW5nLgotICogIEZvcm1hdAotICogICAgICBpbnQzMl90IGxkYWNfQkNPX2RlY29kZV9wYWNrZXQoSEFORExFX0xEQUNfQkNPIGhMZGFjQmNvLCB2b2lkICpkYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCk7Ci0gKiBBcmd1bWVudHMKLSAqICAgICAgSEFORExFX0xEQUNfQkNPICBoTGRhY0JjbyAgICBMREFDIEJDTyBoYW5kbGUuCi0gKiAgICAgIHZvaWQgKmRhdGEgICAgICAgICAgICAgICAgICAgTERBQyBwYWNrZXQuCi0gKiAgICAgIGludDMyX3QgbGVuZ3RoICAgICAgICAgICAgICAgTERBQyBwYWNrZXQgc2l6ZS4KLSAqIFJldHVybiB2YWx1ZQotICogICAgICBpbnQzMl90IDogUHJvY2Vzc2luZyByZXN1bHQuCi0gKiAgICAgICAgICAgICAgTERBQ19CQ09fRVJSX05PTkU6U3VjY2Vzc2Z1bCBjb21wbGV0aW9uCi0gKiAgICAgICAgICAgICAgTERBQ19CQ09fRVJSX0ZBVEFMOkVycm9yCi0gKiBOb3RlCi0gKiAgICAgIFRoZSBmdW5jdGlvbiBsZGFjX0JDT19pbml0KCkgc2hhbGwgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAqICAgICAgZnVuY3Rpb24uCi0gKi8KLUxEQUNfQkNPX0FQSSBpbnQzMl90IGxkYWNfQkNPX2RlY29kZV9wYWNrZXQoSEFORExFX0xEQUNfQkNPIGhMZGFjQmNvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhLCBpbnQzMl90IGxlbmd0aCk7Ci0KLS8qIFN0YXJ0IGRlY29kaW5nIHByb2Nlc3MuCi0gKiAgLSBTdGFydCBvciByZXN1bWUgZGVjb2RlciB0aHJlYWQuCi0gKiAgRm9ybWF0Ci0gKiAgICAgIGludDMyX3QgbGRhY19CQ09fc3RhcnQoSEFORExFX0xEQUNfQkNPIGhMZGFjQmNvKTsKLSAqICBBcmd1bWVudHMKLSAqICAgICAgSEFORExFX0xEQUNfQkNPICBoTGRhY0JjbyAgICBMREFDIEJDTyBoYW5kbGUuCi0gKiAgUmV0dXJuIHZhbHVlCi0gKiAgICAgIGludDMyX3QgOiBQcm9jZXNzaW5nIHJlc3VsdC4KLSAqICAgICAgICAgICAgICBMREFDX0JDT19FUlJfTk9ORTpTdWNjZXNzZnVsIGNvbXBsZXRpb24KLSAqICAgICAgICAgICAgICBMREFDX0JDT19FUlJfRkFUQUw6RXJyb3IKLSAqICBOb3RlCi0gKiAgICAgIFRoZSBmdW5jdGlvbiBsZGFjX0JDT19pbml0KCkgc2hhbGwgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAqICAgICAgZnVuY3Rpb24uCi0gKi8KLUxEQUNfQkNPX0FQSSBpbnQzMl90IGxkYWNfQkNPX3N0YXJ0KEhBTkRMRV9MREFDX0JDTyBoTGRhY0Jjbyk7Ci0KLS8qIFN1c3BlbmQgZGVjb2RpbmcgcHJvY2Vzcy4KLSAqICAtIFN1c3BlbmQgdGhlIGRlY29kZXIgdGhyZWFkLgotICogIEZvcm1hdAotICogICAgICBpbnQzMl90IGxkYWNfQkNPX3N1c3BlbmQoSEFORExFX0xEQUNfQkNPIGhMZGFjQmNvKTsKLSAqICBBcmd1bWVudHMKLSAqICAgICAgSEFORExFX0xEQUNfQkNPICBoTGRhY0JjbyAgICBMREFDIEJDTyBoYW5kbGUuCi0gKiAgUmV0dXJuIHZhbHVlCi0gKiAgICAgIGludDMyX3QgOiBQcm9jZXNzaW5nIHJlc3VsdC4KLSAqICAgICAgICAgICAgICBMREFDX0JDT19FUlJfTk9ORTpTdWNjZXNzZnVsIGNvbXBsZXRpb24KLSAqICAgICAgICAgICAgICBMREFDX0JDT19FUlJfRkFUQUw6RXJyb3IKLSAqICBOb3RlCi0gKiAgICAgIFRoZSBmdW5jdGlvbiBsZGFjX0JDT19pbml0KCkgc2hhbGwgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAqICAgICAgZnVuY3Rpb24uCi0gKi8KLUxEQUNfQkNPX0FQSSBpbnQzMl90IGxkYWNfQkNPX3N1c3BlbmQoSEFORExFX0xEQUNfQkNPIGhMZGFjQmNvKTsKLQotLyogQ29uZmlndXJlIGNvZGVjIGluZm9ybWF0aW9uLgotICogIC0gU2V0IHNhbXBsZSByYXRlLCBiaXRzL3NhbXBsZSBhbmQgY2hhbm5lbCBtb2RlLgotICogIEZvcm1hdAotICogICAgICBpbnQzMl90IGxkYWNfQkNPX2NvbmZpZ3VyZShIQU5ETEVfTERBQ19CQ08gaExkYWNCY28sCi0gKiAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVfcmF0ZSwgaW50MzJfdCBiaXRzX3Blcl9zYW1wbGUsCi0gKiAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsX21vZGUpOwotICogIEFyZ3VtZW50cwotICogICAgICBIQU5ETEVfTERBQ19CQ08gIGhMZGFjQmNvICAgIExEQUMgQkNPIGhhbmRsZS4KLSAqICAgICAgaW50MzJfdCBzYW1wbGVfcmF0ZSAgICAgICAgICBzYW1wbGUgcmF0ZS4KLSAqICAgICAgaW50MzJfdCBiaXRzX3Blcl9zYW1wbGUgICAgICBiaXRzL3NhbXBsZS4KLSAqICAgICAgaW50MzJfdCBjaGFubmVsX21vZGUgICAgICAgICBjaGFubmVsIG1vZGUuCi0gKiAgUmV0dXJuIHZhbHVlCi0gKiAgICAgIGludDMyX3QgOiBQcm9jZXNzaW5nIHJlc3VsdC4KLSAqICAgICAgICAgICAgICBMREFDX0JDT19FUlJfTk9ORTpTdWNjZXNzZnVsIGNvbXBsZXRpb24KLSAqICAgICAgICAgICAgICBMREFDX0JDT19FUlJfRkFUQUw6RXJyb3IKLSAqICBOb3RlCi0gKiAgICAgIFRoZSBmdW5jdGlvbiBsZGFjX0JDT19pbml0KCkgc2hhbGwgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAqICAgICAgZnVuY3Rpb24uCi0gKi8KLUxEQUNfQkNPX0FQSSBpbnQzMl90IGxkYWNfQkNPX2NvbmZpZ3VyZShIQU5ETEVfTERBQ19CQ08gaExkYWNCY28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxfbW9kZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBMREFDQlRfQkNPX0ZPUl9GTFVPUklERV9IX18gKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvcGFuX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9wYW5fYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzMyNzUuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9wYW5fYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgdGhlIFBBTiBBUEkgZGVmaW5pdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBQQU5fQVBJX0gKLSNkZWZpbmUgUEFOX0FQSV9ICi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYm5lcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIERlZmluZSB0aGUgbWluaW11bSBvZmZzZXQgbmVlZGVkIGluIGEgR0tJIGJ1ZmZlciBmb3IKLSAqIHNlbmRpbmcgUEFOIHBhY2tldHMuIE5vdGUsIHdlIGFyZSBjdXJyZW50bHkgbm90IHNlbmRpbmcKLSAqIGV4dGVuc2lvbiBoZWFkZXJzLCBidXQgbWF5IGluIHRoZSBmdXR1cmUsIHNvIGFsbG93Ci0gKiBzcGFjZSBmb3IgdGhlbQotKi8KLSNkZWZpbmUgUEFOX01JTklNVU1fT0ZGU0VUIEJORVBfTUlOSU1VTV9PRkZTRVQKLQotLyoKLSAqIFRoZSBoYW5kbGUgaXMgcGFzc2VkIGZyb20gQk5FUCB0byBQQU4uIFRoZSBzYW1lIGhhbmRsZSBpcyB1c2VkCi0gKiBiZXR3ZWVuIFBBTiBhbmQgYXBwbGljYXRpb24gYXMgd2VsbAotKi8KLSNkZWZpbmUgUEFOX0lOVkFMSURfSEFORExFIEJORVBfSU5WQUxJRF9IQU5ETEUKLQotLyogQml0IG1hcCBmb3IgUEFOIHJvbGVzICovCi0jZGVmaW5lIFBBTl9ST0xFX0NMSUVOVCAweDAxICAgICAvKiBQQU5VIHJvbGUgKi8KLSNkZWZpbmUgUEFOX1JPTEVfR1JPVVAgMHgwMiAgICAgIC8qIEFkaG9jIG5ldHdvcmsgZ3JvdXAgcm9sZSAqLwotI2RlZmluZSBQQU5fUk9MRV9OQVBfU0VSVkVSIDB4MDQgLyogTkFQIHJvbGUgKi8KLXR5cGVkZWYgdWludDhfdCB0UEFOX1JPTEU7Ci0KLWlubGluZSBjb25zdCBzdGQ6OnN0cmluZyBwYW5fcm9sZV90b190ZXh0KGNvbnN0IHRQQU5fUk9MRSYgcm9sZSkgewotICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCIlYyVjJWNbMHgleF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb2xlICYgUEFOX1JPTEVfQ0xJRU5UKSA/ICdDJyA6ICcuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm9sZSAmIFBBTl9ST0xFX0dST1VQKSA/ICdHJyA6ICcuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm9sZSAmIFBBTl9ST0xFX05BUF9TRVJWRVIpID8gJ04nIDogJy4nLCByb2xlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBEZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIERlZmluZSB0aGUgcmVzdWx0IGNvZGVzIGZyb20gUEFOICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgUEFOX1NVQ0NFU1MsIC8qIFN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBQQU5fRElTQ09OTkVDVEVEID0gQk5FUF9DT05OX0RJU0NPTk5FQ1RFRCwgLyogQ29ubmVjdGlvbiB0ZXJtaW5hdGVkICAgKi8KLSAgUEFOX0NPTk5fRkFJTEVEID0gQk5FUF9DT05OX0ZBSUxFRCwgICAvKiBDb25uZWN0aW9uIGZhaWxlZCAgICAgICAgICAgICAgICAgKi8KLSAgUEFOX05PX1JFU09VUkNFUyA9IEJORVBfTk9fUkVTT1VSQ0VTLCAvKiBObyByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgUEFOX01UVV9FWENFREVEID0gQk5FUF9NVFVfRVhDRURFRCwgICAvKiBBdHRlbXB0IHRvIHdyaXRlIGxvbmcgZGF0YSAgICAgICAgKi8KLSAgUEFOX0lOVkFMSURfT0ZGU0VUID0KLSAgICAgIEJORVBfSU5WQUxJRF9PRkZTRVQsIC8qIEluc3VmZmljaWVudCBvZmZzZXQgaW4gR0tJIGJ1ZmZlciAqLwotICBQQU5fQ09OTl9GQUlMRURfQ0ZHID0KLSAgICAgIEJORVBfQ09OTl9GQUlMRURfQ0ZHLCAvKiBDb25uZWN0aW9uIGZhaWxlZCBjb3Mgb2YgY29uZmlnICAgKi8KLSAgUEFOX0lOVkFMSURfU1JDX1JPTEUgPQotICAgICAgQk5FUF9DT05OX0ZBSUxFRF9TUkNfVVVJRCwgLyogQ29ubmVjdGlvbiBmYWlsZWQgd3Jvbmcgc291cmNlIFVVSUQgICAqLwotICBQQU5fSU5WQUxJRF9EU1RfUk9MRSA9Ci0gICAgICBCTkVQX0NPTk5fRkFJTEVEX0RTVF9VVUlELCAvKiBDb25uZWN0aW9uIGZhaWxlZCB3cm9uZyBkZXN0aW5hdGlvbiBVVUlEICovCi0gIFBBTl9DT05OX0ZBSUxFRF9VVUlEX1NJWkUgPQotICAgICAgQk5FUF9DT05OX0ZBSUxFRF9VVUlEX1NJWkUsIC8qIENvbm5lY3Rpb24gZmFpbGVkIHdyb25nIHNpemUgVVVJRCAgICovCi0gIFBBTl9RX1NJWkVfRVhDRUVERUQgPSBCTkVQX1FfU0laRV9FWENFRURFRCwgLyogVG9vIG1hbnkgYnVmZmVycyB0byBkZXN0ICovCi0gIFBBTl9UT09fTUFOWV9GSUxURVJTID0KLSAgICAgIEJORVBfVE9PX01BTllfRklMVEVSUywgLyogVG9vIG1hbnkgbG9jYWwgZmlsdGVycyBzcGVjaWZpZWQgICovCi0gIFBBTl9TRVRfRklMVEVSX0ZBSUwgPSBCTkVQX1NFVF9GSUxURVJfRkFJTCwgLyogU2V0IEZpbHRlciBmYWlsZWQgICovCi0gIFBBTl9XUk9OR19IQU5ETEUgPSBCTkVQX1dST05HX0hBTkRMRSwgICAvKiBXcm9uZyBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uICAqLwotICBQQU5fV1JPTkdfU1RBVEUgPSBCTkVQX1dST05HX1NUQVRFLCAgICAgLyogQ29ubmVjdGlvbiBpcyBpbiB3cm9uZyBzdGF0ZSAqLwotICBQQU5fU0VDVVJJVFlfRkFJTCA9IEJORVBfU0VDVVJJVFlfRkFJTCwgLyogRmFpbGVkIGJlY2F1c2Ugb2Ygc2VjdXJpdHkgKi8KLSAgUEFOX0lHTk9SRV9DTUQgPSBCTkVQX0lHTk9SRV9DTUQsICAgICAgIC8qIFRvIGlnbm9yZSB0aGUgcmN2ZCBjb21tYW5kICovCi0gIFBBTl9UWF9GTE9XX09OID0gQk5FUF9UWF9GTE9XX09OLCAgICAgICAvKiB0eCBkYXRhIGZsb3cgZW5hYmxlZCAqLwotICBQQU5fVFhfRkxPV19PRkYgPSBCTkVQX1RYX0ZMT1dfT0ZGLCAgICAgLyogdHggZGF0YSBmbG93IGRpc2FibGVkICovCi0gIFBBTl9GQUlMVVJFID0gMTksICAgICAgICAgICAgICAgICAgICAgICAvKiBGYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICovCi0gIFBBTl9IT1RTUE9UX0RJU0FCTEVEID0gMjAsICAgICAgICAgICAgICAvKiBIb3RzcG90IGRpc2FibGVkICAgICAgICAgICAgICovCi19IHRQQU5fUkVTVUxUOwotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nIHBhbl9yZXN1bHRfdGV4dChjb25zdCB0UEFOX1JFU1VMVCYgcmVzdWx0KSB7Ci0gIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fU1VDQ0VTUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fRElTQ09OTkVDVEVEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFBBTl9DT05OX0ZBSUxFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fTk9fUkVTT1VSQ0VTKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFBBTl9NVFVfRVhDRURFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fSU5WQUxJRF9PRkZTRVQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUEFOX0NPTk5fRkFJTEVEX0NGRyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fSU5WQUxJRF9TUkNfUk9MRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fSU5WQUxJRF9EU1RfUk9MRSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fQ09OTl9GQUlMRURfVVVJRF9TSVpFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFBBTl9RX1NJWkVfRVhDRUVERUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUEFOX1RPT19NQU5ZX0ZJTFRFUlMpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUEFOX1NFVF9GSUxURVJfRkFJTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fV1JPTkdfSEFORExFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFBBTl9XUk9OR19TVEFURSk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fU0VDVVJJVFlfRkFJTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fSUdOT1JFX0NNRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fVFhfRkxPV19PTik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChQQU5fVFhfRkxPV19PRkYpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUEFOX0ZBSUxVUkUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoUEFOX0hPVFNQT1RfRElTQUJMRUQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCJVTktOT1dOWyVoaHVdIiwgcmVzdWx0KTsKLSAgfQotfQotCi0jdW5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgIENhbGxiYWNrIEZ1bmN0aW9uIFByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGlzIGNhbGwgYmFjayBmdW5jdGlvbiB1c2VkIHRvIHJlcG9ydCBjb25uZWN0aW9uIHN0YXR1cwotICogICAgICB0byB0aGUgYXBwbGljYXRpb24uIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRydWUgbWVhbnMKLSAqICAgICAgdG8gY3JlYXRlIHRoZSBicmlkZ2UgYW5kIGZhbHNlIG1lYW5zIHRvIHJlbW92ZSBpdC4KLSovCi10eXBlZGVmIHZvaWQodFBBTl9DT05OX1NUQVRFX0NCKSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UEFOX1JFU1VMVCBzdGF0ZSwgYm9vbCBpc19yb2xlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjX3JvbGUsIHVpbnQ4X3QgZHN0X3JvbGUpOwotCi0vKiBUaGlzIGlzIGNhbGwgYmFjayBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBicmlkZ2UgZm9yIHRoZQotICogICAgICBDb25uZWN0ZWQgZGV2aWNlLiBUaGUgcGFyYW1ldGVyICJzdGF0ZSIgaW5kaWNhdGVzCi0gKiAgICAgIHdoZXRoZXIgdG8gY3JlYXRlIHRoZSBicmlkZ2Ugb3IgcmVtb3ZlIGl0LiB0cnVlIG1lYW5zCi0gKiAgICAgIHRvIGNyZWF0ZSB0aGUgYnJpZGdlIGFuZCBmYWxzZSBtZWFucyB0byByZW1vdmUgaXQuCi0qLwotdHlwZWRlZiB2b2lkKHRQQU5fQlJJREdFX1JFUV9DQikoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBzdGF0ZSk7Ci0KLS8qIERhdGEgcmVjZWl2ZWQgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgU291cmNlIEJEL0V0aGVybmV0IEFkZHJlc3MKLSAqICAgICAgICAgICAgICBEZXN0IEJEL0V0aGVybmV0IGFkZHJlc3MKLSAqICAgICAgICAgICAgICBQcm90b2NvbAotICogICAgICAgICAgICAgIEFkZHJlc3Mgb2YgYnVmZmVyIChvciBkYXRhIGlmIG5vbi1HS0kpCi0gKiAgICAgICAgICAgICAgTGVuZ3RoIG9mIGRhdGEgKG5vbi1HS0kpCi0gKiAgICAgICAgICAgICAgZXh0IGlzIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBpdCBoYXMgYWJ5IGV4dGVuc2lvbiBoZWFkZXJzCi0gKiAgICAgICAgICAgICAgRmxhZyB1c2VkIHRvIGluZGljYXRlIHRvIGZvcndhcmQgb24gTEFOCi0gKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtIFVzZSBpdCBmb3IgaW50ZXJuYWwgc3RhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0gU2VuZCBpdCBhY3Jvc3MgdGhlIGV0aGVybmV0IGFzIHdlbGwKLSovCi10eXBlZGVmIHZvaWQodFBBTl9EQVRBX0lORF9DQikodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgZHN0LCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgYm9vbCBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3J3YXJkKTsKLQotLyogRGF0YSBidWZmZXIgcmVjZWl2ZWQgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgU291cmNlIEJEL0V0aGVybmV0IEFkZHJlc3MKLSAqICAgICAgICAgICAgICBEZXN0IEJEL0V0aGVybmV0IGFkZHJlc3MKLSAqICAgICAgICAgICAgICBQcm90b2NvbAotICogICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgZXh0IGlzIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBpdCBoYXMgYWJ5IGV4dGVuc2lvbiBoZWFkZXJzCi0gKiAgICAgICAgICAgICAgRmxhZyB1c2VkIHRvIGluZGljYXRlIHRvIGZvcndhcmQgb24gTEFOCi0gKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtIFVzZSBpdCBmb3IgaW50ZXJuYWwgc3RhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0gU2VuZCBpdCBhY3Jvc3MgdGhlIGV0aGVybmV0IGFzIHdlbGwKLSovCi10eXBlZGVmIHZvaWQodFBBTl9EQVRBX0JVRl9JTkRfQ0IpKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBkc3QsIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCBib29sIGV4dCwgYm9vbCBmb3J3YXJkKTsKLQotLyogRmxvdyBjb250cm9sIGNhbGxiYWNrIGZvciBUWCBkYXRhLiBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEhhbmRsZSB0byB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgIEV2ZW50ICBmbG93IHN0YXR1cwotKi8KLXR5cGVkZWYgdm9pZCh0UEFOX1RYX0RBVEFfRkxPV19DQikodWludDE2X3QgaGFuZGxlLCB0UEFOX1JFU1VMVCBldmVudCk7Ci0KLS8qIEZpbHRlcnMgcmVjZWl2ZWQgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgSGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY2IgaXMgY2FsbGVkIGZvciBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgSWdub3JlIHRoaXMgaWYgaXQgaXMgaW5kaWNhdGlvbiwgb3RoZXJ3aXNlIGl0IGlzIHRoZSByZXN1bHQKLSAqICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZmlsdGVyIHNldCBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IHRoZSBsb2NhbAotICogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCi0gKiAgICAgICAgICAgICAgTnVtYmVyIG9mIHByb3RvY29sIGZpbHRlcnMgcHJlc2VudAotICogICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlcnMgc3RhcnQuIEZpbHRlcnMgYXJlIHByZXNlbnQgaW4gcGFpcnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIHN0YXJ0IG9mIHRoZSByYW5nZSBhbmQgZW5kIG9mIHRoZSByYW5nZS4KLSAqICAgICAgICAgICAgICAgICAgICAgIFRoZXkgd2lsbCBiZSBwcmVzZW50IGluIGJpZyBlbmRpYW4gb3JkZXIuIEZpcnN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICB0d28gYnl0ZXMgd2lsbCBiZSBzdGFydGluZyBvZiB0aGUgZmlyc3QgcmFuZ2UgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICBuZXh0IHR3byBieXRlcyB3aWxsIGJlIGVuZGluZyBvZiB0aGUgcmFuZ2UuCi0qLwotdHlwZWRlZiB2b2lkKHRQQU5fRklMVEVSX0lORF9DQikodWludDE2X3QgaGFuZGxlLCBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UEFOX1JFU1VMVCByZXN1bHQsIHVpbnQxNl90IG51bV9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9maWx0ZXJzKTsKLQotLyogTXVsdGljYXN0IEZpbHRlcnMgcmVjZWl2ZWQgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUuIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgSGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY2IgaXMgY2FsbGVkIGZvciBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgSWdub3JlIHRoaXMgaWYgaXQgaXMgaW5kaWNhdGlvbiwgb3RoZXJ3aXNlIGl0IGlzIHRoZSByZXN1bHQKLSAqICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZmlsdGVyIHNldCBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IHRoZSBsb2NhbAotICogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCi0gKiAgICAgICAgICAgICAgTnVtYmVyIG9mIG11bHRpY2FzdCBmaWx0ZXJzIHByZXNlbnQKLSAqICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXJzIHN0YXJ0LiBGaWx0ZXJzIGFyZSBwcmVzZW50IGluIHBhaXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBzdGFydCBvZiB0aGUgcmFuZ2UgYW5kIGVuZCBvZiB0aGUgcmFuZ2UuCi0gKiAgICAgICAgICAgICAgICAgICAgICBGaXJzdCBzaXggYnl0ZXMgd2lsbCBiZSBzdGFydGluZyBvZiB0aGUgZmlyc3QgcmFuZ2UgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICBuZXh0IHNpeCBieXRlcyB3aWxsIGJlIGVuZGluZyBvZiB0aGUgcmFuZ2UuCi0qLwotdHlwZWRlZiB2b2lkKHRQQU5fTUZJTFRFUl9JTkRfQ0IpKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQQU5fUkVTVUxUIHJlc3VsdCwgdWludDE2X3QgbnVtX21maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfbWZpbHRlcnMpOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlZ2lzdGVyIHdpdGggUEFOIHByb2ZpbGUKLSAqIEl0IGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBQQU5fUmVnaXN0ZXIgY2FsbC4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRQQU5fQ09OTl9TVEFURV9DQiogcGFuX2Nvbm5fc3RhdGVfY2I7IC8qIENvbm5lY3Rpb24gc3RhdGUgY2FsbGJhY2sgKi8KLSAgdFBBTl9CUklER0VfUkVRX0NCKiBwYW5fYnJpZGdlX3JlcV9jYjsgLyogQnJpZGdlIHJlcXVlc3QgY2FsbGJhY2sgKi8KLSAgdFBBTl9EQVRBX0lORF9DQiogcGFuX2RhdGFfaW5kX2NiOyAgICAgLyogRGF0YSBpbmRpY2F0aW9uIGNhbGxiYWNrICovCi0gIHRQQU5fREFUQV9CVUZfSU5EX0NCKgotICAgICAgcGFuX2RhdGFfYnVmX2luZF9jYjsgLyogRGF0YSBidWZmZXIgaW5kaWNhdGlvbiBjYWxsYmFjayAqLwotICB0UEFOX0ZJTFRFUl9JTkRfQ0IqCi0gICAgICBwYW5fcGZpbHRfaW5kX2NiOyAvKiBwcm90b2NvbCBmaWx0ZXIgaW5kaWNhdGlvbiBjYWxsYmFjayAqLwotICB0UEFOX01GSUxURVJfSU5EX0NCKgotICAgICAgcGFuX21maWx0X2luZF9jYjsgLyogbXVsdGljYXN0IGZpbHRlciBpbmRpY2F0aW9uIGNhbGxiYWNrICovCi0gIHRQQU5fVFhfREFUQV9GTE9XX0NCKiBwYW5fdHhfZGF0YV9mbG93X2NiOyAvKiBkYXRhIGZsb3cgY2FsbGJhY2sgKi8KLSAgY2hhciogdXNlcl9zZXJ2aWNlX25hbWU7ICAgICAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgbmFtZSBmb3IgUEFOVSByb2xlICovCi0gIGNoYXIqIGduX3NlcnZpY2VfbmFtZTsgICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2aWNlIG5hbWUgZm9yIEdOIHJvbGUgKi8KLSAgY2hhciogbmFwX3NlcnZpY2VfbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgbmFtZSBmb3IgTkFQIHJvbGUgKi8KLQotfSB0UEFOX1JFR0lTVEVSOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX1JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gcmVnaXN0ZXIKLSAqICAgICAgICAgICAgICAgICAgaXRzIGNhbGxiYWNrcyB3aXRoIFBBTiBwcm9maWxlLiBUaGUgYXBwbGljYXRpb24gdGhlbgotICogICAgICAgICAgICAgICAgICBzaG91bGQgc2V0IHRoZSBQQU4gcm9sZSBleHBsaWNpdGx5LgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcF9yZWdpc3RlciAtIGNvbnRhaW5zIGFsbCBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVycwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgUEFOX1JlZ2lzdGVyKHRQQU5fUkVHSVNURVIqIHBfcmVnaXN0ZXIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX0RlcmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBkZS1yZWdpc3RlcgotICogICAgICAgICAgICAgICAgICBpdHMgY2FsbGJhY2tzIHdpdGggUEFOIHByb2ZpbGUuIFRoaXMgd2lsbCBtYWtlIHRoZSBQQU4gdG8KLSAqICAgICAgICAgICAgICAgICAgYmVjb21lIGluYWN0aXZlLiBUaGlzIHdpbGwgZGVyZWdpc3RlciBQQU4gc2VydmljZXMgZnJvbSBTRFAKLSAqICAgICAgICAgICAgICAgICAgYW5kIGNsb3NlIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgUEFOX0RlcmVnaXN0ZXIodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fU2V0Um9sZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCB0aGUgUEFOCi0gKiAgICAgICAgICAgICAgICAgIHByb2ZpbGUgcm9sZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFBBTl9SZWdpc3Rlci4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgY2FsbGVkIGFueSB0aW1lIHRvIGNoYW5nZSB0aGUgUEFOIHJvbGUKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHJvbGUgICAgICAgIC0gaXMgYml0IG1hcCBvZiByb2xlcyB0byBiZSBhY3RpdmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5fUk9MRV9DTElFTlQgaXMgZm9yIFBBTlUgcm9sZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTl9ST0xFX05BUF9TRVJWRVIgaXMgZm9yIE5BUCByb2xlCi0gKiAgICAgICAgICAgICAgICAgIHNlY19tYXNrICAgIC0gU2VjdXJpdHkgbWFzayBmb3IgZGlmZmVyZW50IHJvbGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgYXJyYXkgb2YgdWludDhfdC4gVGhlIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IHRoZSBzZWN1cml0eSBmb3Igcm9sZXMgUEFOVSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTiBhbmQgTkFQIGluIG9yZGVyCi0gKgotICogICAgICAgICAgICAgICAgICBwX3VzZXJfbmFtZSAtIFNlcnZpY2UgbmFtZSBmb3IgUEFOVSByb2xlCi0gKiAgICAgICAgICAgICAgICAgIHBfbmFwX25hbWUgIC0gU2VydmljZSBuYW1lIGZvciBOQVAgcm9sZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIE5VTEwgaWYgdXNlciB3YW50cyBpdCB0byBiZSBkZWZhdWx0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICAgLSBpZiB0aGUgcm9sZSBpcyBzZXQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIFBBTl9GQUlMVVJFICAgICAtIGlmIHRoZSByb2xlIGlzIG5vdCB2YWxpZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdFBBTl9SRVNVTFQgUEFOX1NldFJvbGUodWludDhfdCByb2xlLCBjb25zdCBjaGFyKiBwX3VzZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX25hcF9uYW1lKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBBTl9Db25uZWN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gaW5pdGlhdGUgYQotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGV2aWNlCi0gKgotICogUGFyYW1ldGVyczogICAgICByZW1fYmRhICAgICAtIEJEIEFkZHIgb2YgdGhlIHJlbW90ZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgc3JjX3JvbGUgICAgLSBSb2xlIG9mIHRoZSBsb2NhbCBkZXZpY2UgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGRzdF9yb2xlICAgIC0gUm9sZSBvZiB0aGUgcmVtb3RlIGRldmljZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5fUk9MRV9DTElFTlQgaXMgZm9yIFBBTlUgcm9sZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTl9ST0xFX05BUF9TRVJWRVIgaXMgZm9yIE5BUCByb2xlCi0gKiAgICAgICAgICAgICAgICAgICpoYW5kbGUgICAgIC0gUG9pbnRlciBmb3IgcmV0dXJuaW5nIEhhbmRsZSB0byB0aGUgY29ubmVjdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgUEFOX1NVQ0NFU1MgLSBpZiB0aGUgY29ubmVjdGlvbiBpcyBpbml0aWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIFBBTl9OT19SRVNPVVJDRVMgLSByZXNvdXJjZXMgYXJlIG5vdCBzdWZmaWNlbnQKLSAqICAgICAgICAgICAgICAgICAgUEFOX0ZBSUxVUkUgICAgICAtIGlmIHRoZSBjb25uZWN0aW9uIGNhbm5vdCBiZSBpbml0aWF0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgY2FuIGJlIGJlY2F1c2Ugb2YgdGhlIGNvbWJpbmF0aW9uIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgYW5kIGRzdCByb2xlcyBtYXkgbm90IGJlIHZhbGlkIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGF0IHRoYXQgcG9pbnQgb2YgdGltZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdFBBTl9SRVNVTFQgUEFOX0Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdFBBTl9ST0xFIHNyY19yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQQU5fUk9MRSBkc3Rfcm9sZSwgdWludDE2X3QqIGhhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fRGlzY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB1c2VkIHRvIGRpc2Nvbm5lY3QgdGhlIGNvbm5lY3Rpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBQQU5fRkFJTFVSRSAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGZvdW5kIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbiBlcnJvciBpbiBkaXNjb25uZWN0aW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0UEFOX1JFU1VMVCBQQU5fRGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX1dyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHNlbmRzIGRhdGEgb3ZlciB0aGUgUEFOIGNvbm5lY3Rpb25zLiBJZiB0aGlzIGlzIGNhbGxlZAotICogICAgICAgICAgICAgICAgICBvbiBHTiBvciBOQVAgc2lkZSBhbmQgdGhlIHBhY2tldCBpcyBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0Ci0gKiAgICAgICAgICAgICAgICAgIGl0IHdpbGwgYmUgc2VudCBvbiBhbGwgdGhlIGxpbmtzLiBPdGhlcndpc2UgdGhlIGNvcnJlY3QgbGluawotICogICAgICAgICAgICAgICAgICBpcyBmb3VuZCBiYXNlZCBvbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZm9yd2FyZGVkIG9uCi0gKiAgICAgICAgICAgICAgICAgIGl0LiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBQQU5fU1VDQ0VTUyB0aGUgYXBwbGljYXRpb24KLSAqICAgICAgICAgICAgICAgICAgc2hvdWxkIHRha2UgY2FyZSBvZiByZWxlYXNpbmcgdGhlIG1lc3NhZ2UgYnVmZmVyCi0gKgotICogUGFyYW1ldGVyczogICAgICBkc3QgICAgICAtIE1BQyBvciBCRCBBZGRyIG9mIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgc3JjICAgICAgLSBNQUMgb3IgQkQgQWRkciBvZiB0aGUgc291cmNlIHdobyBzZW50IHRoaXMgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIHByb3RvY29sIC0gcHJvdG9jb2wgb2YgdGhlIGV0aGVybmV0IHBhY2tldCBsaWtlIElQIG9yIEFSUAotICogICAgICAgICAgICAgICAgICBwX2RhdGEgICAtIHBvaW50ZXIgdG8gdGhlIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgbGVuICAgICAgLSBsZW5ndGggb2YgdGhlIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgZXh0ICAgICAgLSB0byBpbmRpY2F0ZSB0aGF0IGV4dGVuc2lvbiBoZWFkZXJzIHByZXNlbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBBTl9TVUNDRVNTICAgICAgIC0gaWYgdGhlIGRhdGEgaXMgc2VudCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgUEFOX0ZBSUxVUkUgICAgICAgLSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgZm91bmQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yIGluIHNlbmRpbmcgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdFBBTl9SRVNVTFQgUEFOX1dyaXRlKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBzcmMsIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgYm9vbCBleHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX1dyaXRlQnVmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIHNlbmRzIGRhdGEgb3ZlciB0aGUgUEFOIGNvbm5lY3Rpb25zLiBJZiB0aGlzIGlzIGNhbGxlZAotICogICAgICAgICAgICAgICAgICBvbiBHTiBvciBOQVAgc2lkZSBhbmQgdGhlIHBhY2tldCBpcyBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0Ci0gKiAgICAgICAgICAgICAgICAgIGl0IHdpbGwgYmUgc2VudCBvbiBhbGwgdGhlIGxpbmtzLiBPdGhlcndpc2UgdGhlIGNvcnJlY3QgbGluawotICogICAgICAgICAgICAgICAgICBpcyBmb3VuZCBiYXNlZCBvbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZm9yd2FyZGVkIG9uCi0gKiAgICAgICAgICAgICAgICAgIGl0LiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBQQU5fU1VDQ0VTUyB0aGUgYXBwbGljYXRpb24KLSAqICAgICAgICAgICAgICAgICAgc2hvdWxkIHRha2UgY2FyZSBvZiByZWxlYXNpbmcgdGhlIG1lc3NhZ2UgYnVmZmVyCi0gKgotICogUGFyYW1ldGVyczogICAgICBkc3QgICAgICAtIE1BQyBvciBCRCBBZGRyIG9mIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgc3JjICAgICAgLSBNQUMgb3IgQkQgQWRkciBvZiB0aGUgc291cmNlIHdobyBzZW50IHRoaXMgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIHByb3RvY29sIC0gcHJvdG9jb2wgb2YgdGhlIGV0aGVybmV0IHBhY2tldCBsaWtlIElQIG9yIEFSUAotICogICAgICAgICAgICAgICAgICBwX2J1ZiAgICAtIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIGV4dCAgICAgIC0gdG8gaW5kaWNhdGUgdGhhdCBleHRlbnNpb24gaGVhZGVycyBwcmVzZW50Ci0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICAgICAtIGlmIHRoZSBkYXRhIGlzIHNlbnQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIFBBTl9GQUlMVVJFICAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGZvdW5kIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbiBlcnJvciBpbiBzZW5kaW5nIGRhdGEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRQQU5fUkVTVUxUIFBBTl9Xcml0ZUJ1Zih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgc3JjLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZiwgYm9vbCBleHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX1NldFByb3RvY29sRmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBwcm90b2NvbCBmaWx0ZXJzIG9uIHRoZSBwZWVyCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAtIGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgLSBudW1iZXIgb2YgcHJvdG9jb2wgZmlsdGVyIHJhbmdlcwotICogICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAtIGFycmF5IG9mIHN0YXJ0aW5nIHByb3RvY29sIG51bWJlcnMKLSAqICAgICAgICAgICAgICAgICAgZW5kICAgICAgICAgLSBhcnJheSBvZiBlbmRpbmcgcHJvdG9jb2wgbnVtYmVycwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBBTl9TVUNDRVNTICAgICBpZiBwcm90b2NvbCBmaWx0ZXJzIGFyZSBzZXQgc3VjY2Vzc2Z1bGx5Ci0gKiAgICAgICAgICAgICAgICAgIFBBTl9GQUlMVVJFICAgICBpZiBjb25uZWN0aW9uIG5vdCBmb3VuZCBvciBlcnJvciBpbiBzZXR0aW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB0UEFOX1JFU1VMVCBQQU5fU2V0UHJvdG9jb2xGaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9zdGFydF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2VuZF9hcnJheSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fU2V0TXVsdGljYXN0RmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBtdWx0aWNhc3QgZmlsdGVycyBvbiB0aGUgcGVlcgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG51bV9maWx0ZXJzIC0gbnVtYmVyIG9mIG11bHRpY2FzdCBmaWx0ZXIgcmFuZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHBfc3RhcnRfYXJyYXkgLSBQb2ludGVyIHRvIHNlcXVlbmNlIG9mIGJlZ2luaW5ncyBvZiBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgYWRkcmVzcyByYW5nZXMKLSAqICAgICAgICAgICAgICAgICAgcF9lbmRfYXJyYXkgICAtIFBvaW50ZXIgdG8gc2VxdWVuY2Ugb2YgZW5kcyBvZiBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgYWRkcmVzcyByYW5nZXMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICAgaWYgbXVsdGljYXN0IGZpbHRlcnMgYXJlIHNldCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgUEFOX0ZBSUxVUkUgICAgIGlmIGNvbm5lY3Rpb24gbm90IGZvdW5kIG9yIGVycm9yIGluIHNldHRpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRQQU5fUkVTVUxUIFBBTl9TZXRNdWx0aWNhc3RGaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fbWNhc3RfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3N0YXJ0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZW5kX2FycmF5KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBBTl9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBQQU4uIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMHhGRiwgaXQgc2ltcGx5IHJlYWRzIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIG5ldyAoY3VycmVudCkgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQ4X3QgUEFOX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX0luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBBTiB1bml0LiBJdCBzaG91bGQgYmUgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIGJlZm9yZSBhY2Nlc3NpbmcgYW55IG90aGVyIEFQSXMgdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJvbAotICogICAgICAgICAgICAgICAgICBibG9jay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgUEFOX0luaXQodm9pZCk7Ci0KLWV4dGVybiB2b2lkIFBBTl9EdW1wc3lzKGludCBmZCk7Ci0KLSNlbmRpZiAvKiBQQU5fQVBJX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaCBiL3N0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyODMyZi4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL3BvcnRfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgdGhlIFBPUlQgQVBJIGRlZmluaXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgUE9SVF9BUElfSAotI2RlZmluZSBQT1JUX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29uc3RhbnRzIGFuZCBUeXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBEZWZpbmUgcG9ydCBzZXR0aW5ncyBzdHJ1Y3R1cmUgc2VuZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUKLSAqIHNldCBzZXR0aW5ncyByZXF1ZXN0LCBvciB0byB0aGUgYXBwbGljYXRpb24gaW4gdGhlIHNldCBzZXR0aW5ncyBpbmRpY2F0aW9uLgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSNkZWZpbmUgUE9SVF9CQVVEX1JBVEVfOTYwMCAweDAzCi0KLSAgdWludDhfdCBiYXVkX3JhdGU7Ci0KLSNkZWZpbmUgUE9SVF84X0JJVFMgMHgwMwotCi0gIHVpbnQ4X3QgYnl0ZV9zaXplOwotCi0jZGVmaW5lIFBPUlRfT05FU1RPUEJJVCAweDAwCi0gIHVpbnQ4X3Qgc3RvcF9iaXRzOwotCi0jZGVmaW5lIFBPUlRfUEFSSVRZX05PIDB4MDAKLSAgdWludDhfdCBwYXJpdHk7Ci0KLSNkZWZpbmUgUE9SVF9PRERfUEFSSVRZIDB4MDAKLQotICB1aW50OF90IHBhcml0eV90eXBlOwotCi0jZGVmaW5lIFBPUlRfRkNfT0ZGIDB4MDAKLSNkZWZpbmUgUE9SVF9GQ19DVFNfT05fSU5QVVQgMHgwNAotI2RlZmluZSBQT1JUX0ZDX0NUU19PTl9PVVRQVVQgMHgwOAotCi0gIHVpbnQ4X3QgZmNfdHlwZTsKLQotICB1aW50OF90IHJ4X2NoYXIxOwotCi0jZGVmaW5lIFBPUlRfWE9OX0RDMSAweDExCi0gIHVpbnQ4X3QgeG9uX2NoYXI7Ci0KLSNkZWZpbmUgUE9SVF9YT0ZGX0RDMyAweDEzCi0gIHVpbnQ4X3QgeG9mZl9jaGFyOwotCi19IHRQT1JUX1NUQVRFOwotCi0vKgotICogRGVmaW5lIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGVzLiAgUGFyYW1ldGVycyBhcmUgc3BlY2lmaWMKLSAqIHRvIGVhY2ggZXZlbnQgYW5kIGFyZSBkZXNjcmliZWQgYmVsbG93Ci0qLwotdHlwZWRlZiBpbnQodFBPUlRfREFUQV9DQUxMQkFDSykodWludDE2X3QgcG9ydF9oYW5kbGUsIHZvaWQqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbik7Ci0KLSNkZWZpbmUgREFUQV9DT19DQUxMQkFDS19UWVBFX0lOQ09NSU5HIDEKLSNkZWZpbmUgREFUQV9DT19DQUxMQkFDS19UWVBFX09VVEdPSU5HX1NJWkUgMgotI2RlZmluZSBEQVRBX0NPX0NBTExCQUNLX1RZUEVfT1VUR09JTkcgMwotdHlwZWRlZiBpbnQodFBPUlRfREFUQV9DT19DQUxMQkFDSykodWludDE2X3QgcG9ydF9oYW5kbGUsIHVpbnQ4X3QqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCBpbnQgdHlwZSk7Ci0KLXR5cGVkZWYgdm9pZCh0UE9SVF9DQUxMQkFDSykodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpOwotCi0vKgotICogRGVmaW5lIGV2ZW50cyB0aGF0IHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gY2FuIHJlY2VpdmUgaW4gdGhlIGNhbGxiYWNrCi0qLwotCi0jZGVmaW5lIFBPUlRfRVZfUlhDSEFSIDB4MDAwMDAwMDEgIC8qIEFueSBDaGFyYWN0ZXIgcmVjZWl2ZWQgKi8KLSNkZWZpbmUgUE9SVF9FVl9SWEZMQUcgMHgwMDAwMDAwMiAgLyogUmVjZWl2ZWQgY2VydGFpbiBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgUE9SVF9FVl9UWEVNUFRZIDB4MDAwMDAwMDQgLyogVHJhbnNtaXR0IFF1ZXVlIEVtcHR5ICovCi0jZGVmaW5lIFBPUlRfRVZfQ1RTIDB4MDAwMDAwMDggICAgIC8qIENUUyBjaGFuZ2VkIHN0YXRlICovCi0jZGVmaW5lIFBPUlRfRVZfRFNSIDB4MDAwMDAwMTAgICAgIC8qIERTUiBjaGFuZ2VkIHN0YXRlICovCi0jZGVmaW5lIFBPUlRfRVZfUkxTRCAweDAwMDAwMDIwICAgIC8qIFJMU0QgY2hhbmdlZCBzdGF0ZSAqLwotI2RlZmluZSBQT1JUX0VWX0JSRUFLIDB4MDAwMDAwNDAgICAvKiBCUkVBSyByZWNlaXZlZCAqLwotI2RlZmluZSBQT1JUX0VWX0VSUiAweDAwMDAwMDgwICAgICAvKiBMaW5lIHN0YXR1cyBlcnJvciBvY2N1cnJlZCAqLwotI2RlZmluZSBQT1JUX0VWX1JJTkcgMHgwMDAwMDEwMCAgICAvKiBSaW5nIHNpZ25hbCBkZXRlY3RlZCAqLwotI2RlZmluZSBQT1JUX0VWX0NUU1MgMHgwMDAwMDQwMCAgICAvKiBDVFMgc3RhdGUgKi8KLSNkZWZpbmUgUE9SVF9FVl9EU1JTIDB4MDAwMDA4MDAgICAgLyogRFNSIHN0YXRlICovCi0jZGVmaW5lIFBPUlRfRVZfUkxTRFMgMHgwMDAwMTAwMCAgIC8qIFJMU0Qgc3RhdGUgKi8KLSNkZWZpbmUgUE9SVF9FVl9PVkVSUlVOIDB4MDAwMDIwMDAgLyogcmVjZWl2ZXIgYnVmZmVyIG92ZXJydW4gKi8KLSNkZWZpbmUgUE9SVF9FVl9UWENIQVIgMHgwMDAwNDAwMCAgLyogQW55IGNoYXJhY3RlciB0cmFuc21pdHRlZCAqLwotCi0vKiBSRkNPTU0gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCAqLwotI2RlZmluZSBQT1JUX0VWX0NPTk5FQ1RFRCAweDAwMDAwMjAwCi0vKiBVbmFibGUgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gIG9yIGRpc2Nvbm5lY3RlZCAqLwotI2RlZmluZSBQT1JUX0VWX0NPTk5FQ1RfRVJSIDB4MDAwMDgwMDAKLS8qIGRhdGEgZmxvdyBlbmFibGVkIGZsYWcgY2hhbmdlZCBieSByZW1vdGUgKi8KLSNkZWZpbmUgUE9SVF9FVl9GQyAweDAwMDEwMDAwCi0vKiBkYXRhIGZsb3cgZW5hYmxlIHN0YXR1cyB0cnVlID0gZW5hYmxlZCAqLwotI2RlZmluZSBQT1JUX0VWX0ZDUyAweDAwMDIwMDAwCi0KLS8qCi0gKiBEZWZpbmUgcG9ydCByZXN1bHQgY29kZXMKLSovCi0jZGVmaW5lIFBPUlRfU1VDQ0VTUyAwCi0KLSNkZWZpbmUgUE9SVF9FUlJfQkFTRSAwCi0KLSNkZWZpbmUgUE9SVF9VTktOT1dOX0VSUk9SIChQT1JUX0VSUl9CQVNFICsgMSkKLSNkZWZpbmUgUE9SVF9BTFJFQURZX09QRU5FRCAoUE9SVF9FUlJfQkFTRSArIDIpCi0jZGVmaW5lIFBPUlRfQ01EX1BFTkRJTkcgKFBPUlRfRVJSX0JBU0UgKyAzKQotI2RlZmluZSBQT1JUX0FQUF9OT1RfUkVHSVNURVJFRCAoUE9SVF9FUlJfQkFTRSArIDQpCi0jZGVmaW5lIFBPUlRfTk9fTUVNIChQT1JUX0VSUl9CQVNFICsgNSkKLSNkZWZpbmUgUE9SVF9OT19SRVNPVVJDRVMgKFBPUlRfRVJSX0JBU0UgKyA2KQotI2RlZmluZSBQT1JUX0JBRF9CRF9BRERSIChQT1JUX0VSUl9CQVNFICsgNykKLSNkZWZpbmUgUE9SVF9CQURfSEFORExFIChQT1JUX0VSUl9CQVNFICsgOSkKLSNkZWZpbmUgUE9SVF9OT1RfT1BFTkVEIChQT1JUX0VSUl9CQVNFICsgMTApCi0jZGVmaW5lIFBPUlRfTElORV9FUlIgKFBPUlRfRVJSX0JBU0UgKyAxMSkKLSNkZWZpbmUgUE9SVF9TVEFSVF9GQUlMRUQgKFBPUlRfRVJSX0JBU0UgKyAxMikKLSNkZWZpbmUgUE9SVF9QQVJfTkVHX0ZBSUxFRCAoUE9SVF9FUlJfQkFTRSArIDEzKQotI2RlZmluZSBQT1JUX1BPUlRfTkVHX0ZBSUxFRCAoUE9SVF9FUlJfQkFTRSArIDE0KQotI2RlZmluZSBQT1JUX1NFQ19GQUlMRUQgKFBPUlRfRVJSX0JBU0UgKyAxNSkKLSNkZWZpbmUgUE9SVF9QRUVSX0NPTk5FQ1RJT05fRkFJTEVEIChQT1JUX0VSUl9CQVNFICsgMTYpCi0jZGVmaW5lIFBPUlRfUEVFUl9GQUlMRUQgKFBPUlRfRVJSX0JBU0UgKyAxNykKLSNkZWZpbmUgUE9SVF9QRUVSX1RJTUVPVVQgKFBPUlRfRVJSX0JBU0UgKyAxOCkKLSNkZWZpbmUgUE9SVF9DTE9TRUQgKFBPUlRfRVJSX0JBU0UgKyAxOSkKLSNkZWZpbmUgUE9SVF9UWF9GVUxMIChQT1JUX0VSUl9CQVNFICsgMjApCi0jZGVmaW5lIFBPUlRfTE9DQUxfQ0xPU0VEIChQT1JUX0VSUl9CQVNFICsgMjEpCi0jZGVmaW5lIFBPUlRfTE9DQUxfVElNRU9VVCAoUE9SVF9FUlJfQkFTRSArIDIyKQotI2RlZmluZSBQT1JUX1RYX1FVRVVFX0RJU0FCTEVEIChQT1JUX0VSUl9CQVNFICsgMjMpCi0jZGVmaW5lIFBPUlRfUEFHRV9USU1FT1VUIChQT1JUX0VSUl9CQVNFICsgMjQpCi0jZGVmaW5lIFBPUlRfSU5WQUxJRF9TQ04gKFBPUlRfRVJSX0JBU0UgKyAyNSkKLQotI2RlZmluZSBQT1JUX0VSUl9NQVggKFBPUlRfRVJSX0JBU0UgKyAyNikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRXh0ZXJuYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbiBpcyB1c2VkIGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvCi0gKiAgICAgICAgICAgICAgICAgIGVzdGFibGlzaCBhIHNlcmlhbCBwb3J0IGNvbm5lY3Rpb24gdG8gdGhlIHBlZXIgZGV2aWNlLAotICogICAgICAgICAgICAgICAgICBvciBhbGxvdyBSRkNPTU0gdG8gYWNjZXB0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgc2NuICAgICAgICAgIC0gU2VydmljZSBDaGFubmVsIE51bWJlciBhcyByZWdpc3RlcmVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNEUCAoc2VydmVyKSBvciBvYnRhaW5lZCB1c2luZyBTRFAgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGVlciBkZXZpY2UgKGNsaWVudCkuCi0gKiAgICAgICAgICAgICAgICAgIGlzX3NlcnZlciAgICAtIHRydWUgaWYgcmVxdWVzdGluZyBhcHBsaWNhdGlvbiBpcyBhIHNlcnZlcgotICogICAgICAgICAgICAgICAgICBtdHUgICAgICAgICAgLSBNYXhpbXVtIGZyYW1lIHNpemUgdGhlIGFwcGxpY2F0aW9uIGNhbiBhY2NlcHQKLSAqICAgICAgICAgICAgICAgICAgYmRfYWRkciAgICAgIC0gYWRkcmVzcyBvZiB0aGUgcGVlciAoY2xpZW50KQotICogICAgICAgICAgICAgICAgICBtYXNrICAgICAgICAgLSBzcGVjaWZpZXMgZXZlbnRzIHRvIGJlIGVuYWJsZWQuICBBIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHplcm8gZGlzYWJsZXMgYWxsIGV2ZW50cy4KLSAqICAgICAgICAgICAgICAgICAgcF9oYW5kbGUgICAgIC0gT1VUIHBvaW50ZXIgdG8gdGhlIGhhbmRsZS4KLSAqICAgICAgICAgICAgICAgICAgcF9tZ210X2NiICAgIC0gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiB0byByZWNlaXZlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdXAvZG93biBldmVudHMuCi0gKiBOb3RlczoKLSAqCi0gKiBTZXJ2ZXIgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNjbiBwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMgaWYKLSAqIGl0IGlzIHJlYWR5IHRvIGFjY2VwdCBtdWx0aXBsZSBzaW11bHRlbmVvdXMgY29ubmVjdGlvbnMuCi0gKgotICogRExDSSBmb3IgdGhlIGNvbm5lY3Rpb24gaXMgKHNjbiAqIDIgKyAxKSBpZiBjbGllbnQgb3JpZ2luYXRlcyBjb25uZWN0aW9uIG9uCi0gKiBleGlzdGluZyBub25lIGluaXRpYXRvciBtdWx0aXBsZXhlciBjaGFubmVsLiAgT3RoZXJ3aXNlIGl0IGlzIChzY24gKiAyKS4KLSAqIEZvciB0aGUgc2VydmVyIERMQ0kgY2FuIGJlIGNoYW5nZWQgbGF0ZXIgaWYgY2xpZW50IHdpbGwgYmUgY2FsbGluZyBpdCB1c2luZwotICogKHNjbiAqIDIgKyAxKSBkbGNpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uV2l0aFNlY3VyaXR5KHVpbnQxNl90IHV1aWQsIHVpbnQ4X3Qgc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3NlcnZlciwgdWludDE2X3QgbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0NBTExCQUNLKiBwX21nbXRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19tYXNrKTsKLQotZXh0ZXJuIHZvaWQgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQodWludDMyX3Qgc2NuKTsKLQotZXh0ZXJuIGludCBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbih1aW50MTZfdCB1dWlkLCB1aW50OF90IHNjbiwgYm9vbCBpc19zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9DQUxMQkFDSyogcF9tZ210X2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9SZW1vdmVDb25uZWN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbG9zZSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIG9mIHRoZSBwb3J0IHJldHVybmVkIGluIHRoZSBPcGVuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24odWludDE2X3QgaGFuZGxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9SZW1vdmVTZXJ2ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsb3NlIHRoZSBzZXJ2ZXIgcG9ydC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgUkZDT01NX1JlbW92ZVNlcnZlcih1aW50MTZfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9TZXRFdmVudENhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgZXZlbnQgY2FsbGJhY2sgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgIC0gSGFuZGxlIG9mIHRoZSBwb3J0IHJldHVybmVkIGluIHRoZSBPcGVuCi0gKiAgICAgICAgICAgICAgICAgIHBfY2FsbGJhY2sgICAtIGFkZHJlc3Mgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHNob3VsZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgZnJvbSB0aGUgUkZDT01NIHdoZW4gYW4gZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBtYXNrIG9jY3Vycy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGludCBQT1JUX1NldEV2ZW50Q2FsbGJhY2sodWludDE2X3QgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9DQUxMQkFDSyogcF9wb3J0X2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfQ2xlYXJLZWVwSGFuZGxlRmxhZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIHRvIGNsZWFyIHRoZSBrZWVwIGhhbmRsZSBmbGFnLCB3aGljaCB3aWxsIGNhdXNlCi0gKiAgICAgICAgICAgICAgICAgIG5vdCB0byBrZWVwIHRoZSBwb3J0IGhhbmRsZSBvcGVuIHdoZW4gY2xvc2VkCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE9SVF9DbGVhcktlZXBIYW5kbGVGbGFnKHVpbnQxNl90IHBvcnRfaGFuZGxlKTsKLQotZXh0ZXJuIGludCBQT1JUX1NldERhdGFDT0NhbGxiYWNrKHVpbnQxNl90IHBvcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0RBVEFfQ09fQ0FMTEJBQ0sqIHBfcG9ydF9jYik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9TZXRFdmVudE1hc2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsb3NlIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAtIEhhbmRsZSBvZiB0aGUgcG9ydCByZXR1cm5lZCBpbiB0aGUgT3BlbgotICogICAgICAgICAgICAgICAgICBtYXNrICAgLSBzcGVjaWZpZXMgZXZlbnRzIHRvIGJlIGVuYWJsZWQuICBBIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHplcm8gZGlzYWJsZXMgYWxsIGV2ZW50cy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGludCBQT1JUX1NldEV2ZW50TWFzayh1aW50MTZfdCBwb3J0X2hhbmRsZSwgdWludDMyX3QgbWFzayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0NoZWNrQ29ubmVjdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFBPUlRfU1VDQ0VTUyBpZiBjb25uZWN0aW9uIHJlZmVyZW5jZWQKLSAqICAgICAgICAgICAgICAgICAgYnkgaGFuZGxlIGlzIHVwIGFuZCBydW5uaW5nCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIG9mIHRoZSBwb3J0IHJldHVybmVkIGluIHRoZSBPcGVuCi0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHIgICAgLSBPVVQgYmRfYWRkciBvZiB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBwX2xjaWQgICAgIC0gT1VUIEwyQ0FQJ3MgTENJRAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IFBPUlRfQ2hlY2tDb25uZWN0aW9uKHVpbnQxNl90IGhhbmRsZSwgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfbGNpZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0lzT3BlbmluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW55IFJGQ09NTSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG9wZW5pbmcgaW4gcHJvY2Vzcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHRydWUgaWYgYW55IGNvbm5lY3Rpb24gb3BlbmluZyBpcyBmb3VuZAotICogICAgICAgICAgICAgICAgICBiZF9hZGRyICAgIC0gYmRfYWRkciBvZiB0aGUgcGVlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBQT1JUX0lzT3BlbmluZyhSYXdBZGRyZXNzKiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfU2V0U3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBjb25uZWN0aW9uIGFjY29yZGluZyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIHRQT1JUX1NUQVRFIHN0cnVjdHVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfc2V0dGluZ3MgLSBQb2ludGVyIHRvIGEgdFBPUlRfU1RBVEUgc3RydWN0dXJlIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBjb25uZWN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IFBPUlRfU2V0U3RhdGUodWludDE2X3QgaGFuZGxlLCB0UE9SVF9TVEFURSogcF9zZXR0aW5ncyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0dldFN0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmaWxsIHRQT1JUX1NUQVRFIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IGNvbnRyb2wgc2V0dGluZ3MgZm9yIHRoZSBwb3J0Ci0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwX3NldHRpbmdzIC0gUG9pbnRlciB0byBhIHRQT1JUX1NUQVRFIHN0cnVjdHVyZSBpbiB3aGljaAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGludCBQT1JUX0dldFN0YXRlKHVpbnQxNl90IGhhbmRsZSwgdFBPUlRfU1RBVEUqIHBfc2V0dGluZ3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9GbG93Q29udHJvbF9NYXhDcmVkaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZGlyZWN0cyBhIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHBhc3MKLSAqICAgICAgICAgICAgICAgICAgZmxvdyBjb250cm9sIG1lc3NhZ2UgdG8gdGhlIHBlZXIgZGV2aWNlLiAgRW5hYmxlIGZsYWcgcGFzc2VkCi0gKiAgICAgICAgICAgICAgICAgIHNob3dzIGlmIHBvcnQgY2FuIGFjY2VwdCBtb3JlIGRhdGEuIEl0IGFsc28gc2VuZHMgbWF4IGNyZWRpdAotICogICAgICAgICAgICAgICAgICB3aGVuIGRhdGEgZmxvdyBlbmFibGVkCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBlbmFibGUgICAgIC0gZW5hYmxlcyBkYXRhIGZsb3cKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGludCBQT1JUX0Zsb3dDb250cm9sX01heENyZWRpdCh1aW50MTZfdCBoYW5kbGUsIGJvb2wgZW5hYmxlKTsKLQotI2RlZmluZSBQT1JUX0RUUkRTUl9PTiAweDAxCi0jZGVmaW5lIFBPUlRfQ1RTUlRTX09OIDB4MDIKLSNkZWZpbmUgUE9SVF9SSU5HX09OIDB4MDQKLSNkZWZpbmUgUE9SVF9EQ0RfT04gMHgwOAotCi0vKgotICogRGVmaW5lIGRlZmF1bHQgaW5pdGlhbCBsb2NhbCBtb2RlbSBzaWduYWxzIHN0YXRlIGFmdGVyIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKLSovCi0jZGVmaW5lIFBPUlRfT0JFWF9ERUZBVUxUX1NJR05BTF9TVEFURSBcCi0gIChQT1JUX0RUUkRTUl9PTiB8IFBPUlRfQ1RTUlRTX09OIHwgUE9SVF9EQ0RfT04pCi0jZGVmaW5lIFBPUlRfU1BQX0RFRkFVTFRfU0lHTkFMX1NUQVRFIFwKLSAgKFBPUlRfRFRSRFNSX09OIHwgUE9SVF9DVFNSVFNfT04gfCBQT1JUX0RDRF9PTikKLSNkZWZpbmUgUE9SVF9QUFBfREVGQVVMVF9TSUdOQUxfU1RBVEUgXAotICAoUE9SVF9EVFJEU1JfT04gfCBQT1JUX0NUU1JUU19PTiB8IFBPUlRfRENEX09OKQotI2RlZmluZSBQT1JUX0RVTl9ERUZBVUxUX1NJR05BTF9TVEFURSAoUE9SVF9EVFJEU1JfT04gfCBQT1JUX0NUU1JUU19PTikKLQotI2RlZmluZSBQT1JUX0VSUl9CUkVBSyAweDAxICAgLyogQnJlYWsgY29uZGl0aW9uIG9jY3VyZWQgb24gdGhlIHBlZXIgZGV2aWNlICovCi0jZGVmaW5lIFBPUlRfRVJSX09WRVJSVU4gMHgwMiAvKiBPdmVycnVuIGlzIHJlcG9ydGVkIGJ5IHBlZXIgZGV2aWNlICovCi0jZGVmaW5lIFBPUlRfRVJSX0ZSQU1FIDB4MDQgICAvKiBGcmFtaW5nIGVycm9yIHJlcG9ydGVkIGJ5IHBlZXIgZGV2aWNlICovCi0jZGVmaW5lIFBPUlRfRVJSX1JYT1ZFUiAweDA4ICAvKiBJbnB1dCBxdWV1ZSBvdmVyZmxvdyBvY2N1cmVkICovCi0jZGVmaW5lIFBPUlRfRVJSX1RYRlVMTCAweDEwICAvKiBPdXRwdXQgcXVldWUgb3ZlcmZsb3cgb2NjdXJlZCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9SZWFkRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTm9ybWFsbHkgYXBwbGljYXRpb24gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgcmVjZWl2aW5nCi0gKiAgICAgICAgICAgICAgICAgIFBPUlRfRVZUX1JYQ0hBUiBldmVudC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAgICAgIC0gRGF0YSBhcmVhCi0gKiAgICAgICAgICAgICAgICAgIG1heF9sZW4gICAgIC0gQnl0ZSBjb3VudCByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcF9sZW4gICAgICAgLSBCeXRlIGNvdW50IHJlY2VpdmVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgUE9SVF9SZWFkRGF0YSh1aW50MTZfdCBoYW5kbGUsIGNoYXIqIHBfZGF0YSwgdWludDE2X3QgbWF4X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9Xcml0ZURhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGxlZ2FjeSBhcHBsaWNhdGlvbiB0bwotICogICAgICAgICAgICAgICAgICBzZW5kIGRhdGEuCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwX2RhdGEgICAgICAtIERhdGEgYXJlYQotICogICAgICAgICAgICAgICAgICBtYXhfbGVuICAgICAtIEJ5dGUgY291bnQgdG8gd3JpdGUKLSAqICAgICAgICAgICAgICAgICAgcF9sZW4gICAgICAgLSBCeXRlcyB3cml0dGVuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgUE9SVF9Xcml0ZURhdGEodWludDE2X3QgaGFuZGxlLCBjb25zdCBjaGFyKiBwX2RhdGEsIHVpbnQxNl90IG1heF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2xlbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX1dyaXRlRGF0YUNPCi0gKgotICogRGVzY3JpcHRpb24gICAgICBOb3JtYWxseSBub3QgR0tJIGF3YXJlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRvIHNlbmQgZGF0YSB0byB0aGUgcG9ydCBieSBjYWxsb3V0IGZ1bmN0aW9ucy4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgUE9SVF9Xcml0ZURhdGFDTyh1aW50MTZfdCBoYW5kbGUsIGludCogcF9sZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUkZDT01NX0luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluaXRpYWxpemUgUkZDT01NIGxheWVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIFJGQ09NTV9Jbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgdGhlIHRyYWNlIGxldmVsIGZvciBSRkNPTU0uIElmIGNhbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMHhGRiwgaXQgc2ltcGx5IHJlYWRzIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIG5ldyAoY3VycmVudCkgdHJhY2UgbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHVpbnQ4X3QgUE9SVF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfR2V0UmVzdWx0U3RyaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgYSBnaXZlbgotICogICAgICAgICAgICAgICAgICByZXN1bHQgY29kZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGEgcG9pbnRlciB0byB0aGUgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgcmVzdWx0LiBOb3RlIHRoYXQgdGhlIHN0cmluZyByZXR1cm5lZCBtdXN0IG5vdCBiZSBmcmVlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGNvbnN0IGNoYXIqIFBPUlRfR2V0UmVzdWx0U3RyaW5nKGNvbnN0IHVpbnQ4X3QgcmVzdWx0X2NvZGUpOwotCi0jZW5kaWYgLyogUE9SVF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9wb3J0X2V4dC5oIGIvc3RhY2svaW5jbHVkZS9wb3J0X2V4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhmMjkzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvcG9ydF9leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsIGRlZmluaXRpb25zIG9mIFBvcnQgRW11bGF0aW9uIGVudGl0eSB1bml0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBQT1JURVhUX0gKLSNkZWZpbmUgUE9SVEVYVF9ICi0KLWV4dGVybiB2b2lkIHJmY29tbV9wb3J0X3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSk7Ci1leHRlcm4gdm9pZCByZmNvbW1fbWNiX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvcHJvZmlsZXNfYXBpLmggYi9zdGFjay9pbmNsdWRlL3Byb2ZpbGVzX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTMzZGViLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvcHJvZmlsZXNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFBST0ZJTEVTX0FQSV9ICi0jZGVmaW5lIFBST0ZJTEVTX0FQSV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvbnN0YW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEJUX1BBU1MgMCAvKiBVc2VkIGZvciBnZW5lcmFsIHN1Y2Nlc3NmdWwgZnVuY3Rpb24gcmV0dXJucyAqLwotCi0vKioqIFBvcnQgZW50aXR5IHBhc3NlcyBiYWNrIDggYml0IGVycm9yczsgd2lsbCB1c2UgdXBwZXIgYnl0ZSBvZmZzZXQgKioqLwotI2RlZmluZSBHQVBfRVJSX0dSUCAweDAxMDAgICAvKiBiYXNlIG9mZnNldCBmb3IgR0FQIHByb2ZpbGUgKi8KLQotI2VuZGlmIC8qIFBST0ZJTEVTX0FQSV9IICovCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL3JmY2RlZnMuaCBiL3N0YWNrL2luY2x1ZGUvcmZjZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTliM2NlLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvcmZjZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIFJGQ09NTSBwcm90b2NvbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFJGQ0RFRlNfSAotI2RlZmluZSBSRkNERUZTX0gKLQotI2RlZmluZSBQT1JUX01BWF9SRkNfUE9SVFMgMzEKLQotLyoKLSAqICBJZiBub3RoaW5nIGlzIG5lZ290aWF0ZWQgTVRVIHNob3VsZCBiZSAxMjcKLSovCi0jZGVmaW5lIFJGQ09NTV9ERUZBVUxUX01UVSAxMjcKLQotLyoKLSAqIERlZmluZSB1c2VkIGJ5IFJGQ09NTSBUUyBmcmFtZSB0eXBlcwotKi8KLSNkZWZpbmUgUkZDT01NX1NBQk1FIDB4MkYKLSNkZWZpbmUgUkZDT01NX1VBIDB4NjMKLSNkZWZpbmUgUkZDT01NX0RNIDB4MEYKLSNkZWZpbmUgUkZDT01NX0RJU0MgMHg0MwotI2RlZmluZSBSRkNPTU1fVUlIIDB4RUYKLQotLyoKLSAqIERlZmVuaXRpb25zIGZvciB0aGUgVFMgY29udHJvbCBmcmFtZXMKLSovCi0jZGVmaW5lIFJGQ09NTV9DVFJMX0ZSQU1FX0xFTiAzCi0jZGVmaW5lIFJGQ09NTV9NSU5fT0ZGU0VUIDUgLyogY3RybCAyICwgbGVuIDEgb3IgMiBieXRlcywgY3JlZGl0IDEgYnl0ZSAqLwotI2RlZmluZSBSRkNPTU1fREFUQV9PVkVSSEVBRCAoUkZDT01NX01JTl9PRkZTRVQgKyAxKSAvKiBhZGQgMSBmb3IgY2hlY2tzdW0gKi8KLQotI2RlZmluZSBSRkNPTU1fRUEgMQotI2RlZmluZSBSRkNPTU1fRUFfTUFTSyAweDAxCi0jZGVmaW5lIFJGQ09NTV9DUl9NQVNLIDB4MDIKLSNkZWZpbmUgUkZDT01NX1NISUZUX0NSIDEKLSNkZWZpbmUgUkZDT01NX1NISUZUX0RMQ0kgMgotI2RlZmluZSBSRkNPTU1fU0hJRlRfRExDSTIgNgotI2RlZmluZSBSRkNPTU1fUEYgMHgxMAotI2RlZmluZSBSRkNPTU1fUEZfTUFTSyAweDEwCi0jZGVmaW5lIFJGQ09NTV9QRl9PRkZTRVQgNAotI2RlZmluZSBSRkNPTU1fU0hJRlRfTEVOR1RIMSAxCi0jZGVmaW5lIFJGQ09NTV9TSElGVF9MRU5HVEgyIDcKLSNkZWZpbmUgUkZDT01NX1NISUZUX01YX0NUUkxfVFlQRSAyCi0KLSNkZWZpbmUgUkZDT01NX0lOSVRJQVRPUl9DTUQgMQotI2RlZmluZSBSRkNPTU1fSU5JVElBVE9SX1JTUCAwCi0jZGVmaW5lIFJGQ09NTV9SRVNQT05ERVJfQ01EIDAKLSNkZWZpbmUgUkZDT01NX1JFU1BPTkRFUl9SU1AgMQotCi0jZGVmaW5lIFJGQ09NTV9QQVJTRV9DVFJMX0ZJRUxEKGVhLCBjciwgZGxjaSwgcF9kYXRhKSAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGVhKSA9ICoocF9kYXRhKSZSRkNPTU1fRUE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGNyKSA9ICgqKHBfZGF0YSkmUkZDT01NX0NSX01BU0spID4+IFJGQ09NTV9TSElGVF9DUjsgICBcCi0gICAgKGRsY2kpID0gKihwX2RhdGEpKysgPj4gUkZDT01NX1NISUZUX0RMQ0k7ICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoZWEpKSAoZGxjaSkgKz0gKihwX2RhdGEpKysgPDwgUkZDT01NX1NISUZUX0RMQ0kyOyBcCi0gIH0KLQotI2RlZmluZSBSRkNPTU1fRk9STUFUX0NUUkxfRklFTEQocF9kYXRhLCBlYSwgY3IsIGRsY2kpIFwKLSAgKCoocF9kYXRhKSsrID0gKGVhKSB8IChjcikgfCAoKGRsY2kpIDw8IFJGQ09NTV9TSElGVF9ETENJKSkKLQotI2RlZmluZSBSRkNPTU1fUEFSU0VfVFlQRV9GSUVMRCh0eXBlLCBwZiwgcF9kYXRhKSAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0eXBlKSA9ICoocF9kYXRhKSAmIH5SRkNPTU1fUEZfTUFTSzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChwZikgPSAoKihwX2RhdGEpKysgJiBSRkNPTU1fUEZfTUFTSykgPj4gUkZDT01NX1BGX09GRlNFVDsgXAotICB9Ci0KLSNkZWZpbmUgUkZDT01NX0ZPUk1BVF9UWVBFX0ZJRUxEKHBfZGF0YSwgdHlwZSwgcGYpICAgICAgICAgICAgIFwKLSAgKihwX2RhdGEpKysgPSAoKHR5cGUpIHwgKChwZikgPDwgUkZDT01NX1BGX09GRlNFVCkpIHsgICAgICAgIFwKLSAgICAodHlwZSkgPSAqKHBfZGF0YSkgJiB+UkZDT01NX1BGX01BU0s7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocGYpID0gKCoocF9kYXRhKSsrICYgUkZDT01NX1BGX01BU0spID4+IFJGQ09NTV9QRl9PRkZTRVQ7IFwKLSAgfQotCi0jZGVmaW5lIFJGQ09NTV9GUkFNRV9JU19DTUQoaW5pdGlhdG9yLCBjcikgXAotICAoKChpbml0aWF0b3IpICYmICEoY3IpKSB8fCAoIShpbml0aWF0b3IpICYmIChjcikpKQotCi0jZGVmaW5lIFJGQ09NTV9GUkFNRV9JU19SU1AoaW5pdGlhdG9yLCBjcikgXAotICAoKChpbml0aWF0b3IpICYmIChjcikpIHx8ICghKGluaXRpYXRvcikgJiYgIShjcikpKQotCi0jZGVmaW5lIFJGQ09NTV9DUihpbml0aWF0b3IsIGlzX2NvbW1hbmQpIFwKLSAgKCgoKGluaXRpYXRvcikgJiYgKGlzX2NvbW1hbmQpKSB8fCAoIShpbml0aWF0b3IpICYmICEoaXNfY29tbWFuZCkpKSA8PCAxKQotCi0jZGVmaW5lIFJGQ09NTV9JX0NSKGlzX2NvbW1hbmQpICgoaXNfY29tbWFuZCkgPyAweDAyIDogMHgwMCkKLQotI2RlZmluZSBSRkNPTU1fTUFYX0RMQ0kgNjEKLQotI2RlZmluZSBSRkNPTU1fVkFMSURfRExDSShkbGNpKSBcCi0gICgoKGRsY2kpID09IDApIHx8ICgoKGRsY2kpID49IDIpICYmICgoZGxjaSkgPD0gUkZDT01NX01BWF9ETENJKSkpCi0KLS8qIFBvcnQgTmVnb3RpYXRpb24gKFBOKSAqLwotI2RlZmluZSBSRkNPTU1fUE5fRExDSV9NQVNLIDB4M0YKLQotI2RlZmluZSBSRkNPTU1fUE5fRlJBTV9UWVBFX1VJSCAweDAwCi0jZGVmaW5lIFJGQ09NTV9QTl9GUkFNRV9UWVBFX01BU0sgMHgwRgotCi0jZGVmaW5lIFJGQ09NTV9QTl9DT05WX0xBWUVSX01BU0sgMHhGMAotI2RlZmluZSBSRkNPTU1fUE5fQ09OVl9MQVlFUl9UWVBFXzEgMAotI2RlZmluZSBSRkNPTU1fUE5fQ09OVl9MQVlFUl9DQkZDX0kgMHhGMAotI2RlZmluZSBSRkNPTU1fUE5fQ09OVl9MQVlFUl9DQkZDX1IgMHhFMAotCi0jZGVmaW5lIFJGQ09NTV9QTl9QUklPUklUWV9NQVNLIDB4M0YKLSNkZWZpbmUgUkZDT01NX1BOX1BSSU9SSVRZXzAgMAotCi0jZGVmaW5lIFJGQ09NTV9QTl9LX01BU0sgMHgwNwotCi0jZGVmaW5lIFJGQ09NTV9UMV9EU0VDIDAgLyogTm9uZSBuZWdvdGlhYmxlIGluIFJGQ09NTSAqLwotI2RlZmluZSBSRkNPTU1fTjIgMCAgICAgIC8qIE51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgKi8KLSNkZWZpbmUgUkZDT01NX0sgMCAgICAgICAvKiBXaW5kb3cgc2l6ZSAqLwotI2RlZmluZSBSRkNPTU1fS19NQVggNyAgIC8qIE1heCB2YWx1ZSBvZiBLIGZvciBjcmVkaXQgYmFzZWQgZmxvdyBjb250cm9sICovCi0KLSNkZWZpbmUgUkZDT01NX01TQ19GQyAweDAyICAvKiBGbG93IGNvbnRyb2wqLwotI2RlZmluZSBSRkNPTU1fTVNDX1JUQyAweDA0IC8qIFJlYWR5IHRvIGNvbW11bmljYXRlKi8KLSNkZWZpbmUgUkZDT01NX01TQ19SVFIgMHgwOCAvKiBSZWFkeSB0byByZWNlaXZlKi8KLSNkZWZpbmUgUkZDT01NX01TQ19JQyAweDQwICAvKiBJbmNvbW1pbmcgY2FsbCBpbmRpY2F0b3IqLwotI2RlZmluZSBSRkNPTU1fTVNDX0RWIDB4ODAgIC8qIERhdGEgVmFsaWQqLwotCi0jZGVmaW5lIFJGQ09NTV9NU0NfU0hJRlRfQlJFQUsgNAotI2RlZmluZSBSRkNPTU1fTVNDX0JSRUFLX01BU0sgMHhGMAotI2RlZmluZSBSRkNPTU1fTVNDX0JSRUFLX1BSRVNFTlRfTUFTSyAweDAyCi0KLSNkZWZpbmUgUkZDT01NX0JBVURfUkFURV8yNDAwIDB4MDAKLSNkZWZpbmUgUkZDT01NX0JBVURfUkFURV80ODAwIDB4MDEKLSNkZWZpbmUgUkZDT01NX0JBVURfUkFURV83MjAwIDB4MDIKLSNkZWZpbmUgUkZDT01NX0JBVURfUkFURV85NjAwIDB4MDMKLSNkZWZpbmUgUkZDT01NX0JBVURfUkFURV8xOTIwMCAweDA0Ci0jZGVmaW5lIFJGQ09NTV9CQVVEX1JBVEVfMzg0MDAgMHgwNQotI2RlZmluZSBSRkNPTU1fQkFVRF9SQVRFXzU3NjAwIDB4MDYKLSNkZWZpbmUgUkZDT01NX0JBVURfUkFURV8xMTUyMDAgMHgwNwotI2RlZmluZSBSRkNPTU1fQkFVRF9SQVRFXzIzMDQwMCAweDA4Ci0KLSNkZWZpbmUgUkZDT01NXzVfQklUUyAweDAwCi0jZGVmaW5lIFJGQ09NTV82X0JJVFMgMHgwMQotI2RlZmluZSBSRkNPTU1fN19CSVRTIDB4MDIKLSNkZWZpbmUgUkZDT01NXzhfQklUUyAweDAzCi0KLSNkZWZpbmUgUkZDT01NX1JQTl9CSVRTX01BU0sgMHgwMwotI2RlZmluZSBSRkNPTU1fUlBOX0JJVFNfU0hJRlQgMAotCi0jZGVmaW5lIFJGQ09NTV9PTkVTVE9QQklUIDB4MDAKLSNkZWZpbmUgUkZDT01NX09ORTVTVE9QQklUUyAweDAxCi0KLSNkZWZpbmUgUkZDT01NX1JQTl9TVE9QX0JJVFNfTUFTSyAweDAxCi0jZGVmaW5lIFJGQ09NTV9SUE5fU1RPUF9CSVRTX1NISUZUIDIKLQotI2RlZmluZSBSRkNPTU1fUEFSSVRZX05PIDB4MDAKLSNkZWZpbmUgUkZDT01NX1BBUklUWV9ZRVMgMHgwMQotI2RlZmluZSBSRkNPTU1fUlBOX1BBUklUWV9NQVNLIDB4MDEKLSNkZWZpbmUgUkZDT01NX1JQTl9QQVJJVFlfU0hJRlQgMwotCi0jZGVmaW5lIFJGQ09NTV9PRERfUEFSSVRZIDB4MDAKLSNkZWZpbmUgUkZDT01NX0VWRU5fUEFSSVRZIDB4MDEKLSNkZWZpbmUgUkZDT01NX01BUktfUEFSSVRZIDB4MDIKLSNkZWZpbmUgUkZDT01NX1NQQUNFX1BBUklUWSAweDAzCi0KLSNkZWZpbmUgUkZDT01NX1JQTl9QQVJJVFlfVFlQRV9NQVNLIDB4MDMKLSNkZWZpbmUgUkZDT01NX1JQTl9QQVJJVFlfVFlQRV9TSElGVCA0Ci0KLSNkZWZpbmUgUkZDT01NX0ZDX09GRiAweDAwCi0jZGVmaW5lIFJGQ09NTV9GQ19YT05YT0ZGX09OX0lOUFVUIDB4MDEKLSNkZWZpbmUgUkZDT01NX0ZDX1hPTlhPRkZfT05fT1VUUFVUIDB4MDIKLSNkZWZpbmUgUkZDT01NX0ZDX1JUUl9PTl9JTlBVVCAweDA0Ci0jZGVmaW5lIFJGQ09NTV9GQ19SVFJfT05fT1VUUFVUIDB4MDgKLSNkZWZpbmUgUkZDT01NX0ZDX1JUQ19PTl9JTlBVVCAweDEwCi0jZGVmaW5lIFJGQ09NTV9GQ19SVENfT05fT1VUUFVUIDB4MjAKLSNkZWZpbmUgUkZDT01NX0ZDX01BU0sgMHgzRgotCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fQklUX1JBVEUgMHgwMDAxCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fREFUQV9CSVRTIDB4MDAwMgotI2RlZmluZSBSRkNPTU1fUlBOX1BNX1NUT1BfQklUUyAweDAwMDQKLSNkZWZpbmUgUkZDT01NX1JQTl9QTV9QQVJJVFkgMHgwMDA4Ci0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fUEFSSVRZX1RZUEUgMHgwMDEwCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fWE9OX0NIQVIgMHgwMDIwCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fWE9GRl9DSEFSIDB4MDA0MAotI2RlZmluZSBSRkNPTU1fUlBOX1BNX1hPTlhPRkZfT05fSU5QVVQgMHgwMTAwCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fWE9OWE9GRl9PTl9PVVRQVVQgMHgwMjAwCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fUlRSX09OX0lOUFVUIDB4MDQwMAotI2RlZmluZSBSRkNPTU1fUlBOX1BNX1JUUl9PTl9PVVRQVVQgMHgwODAwCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fUlRDX09OX0lOUFVUIDB4MTAwMAotI2RlZmluZSBSRkNPTU1fUlBOX1BNX1JUQ19PTl9PVVRQVVQgMHgyMDAwCi0jZGVmaW5lIFJGQ09NTV9SUE5fUE1fTUFTSyAweDNGN0YKLQotI2RlZmluZSBSRkNPTU1fUkxTX0VSUk9SIDB4MDEKLSNkZWZpbmUgUkZDT01NX1JMU19PVkVSUlVOIDB4MDIKLSNkZWZpbmUgUkZDT01NX1JMU19QQVJJVFkgMHgwNAotI2RlZmluZSBSRkNPTU1fUkxTX0ZSQU1JTkcgMHgwOAotCi0vKiBNdWx0aXBsZXhvciBjaGFubmVsIHVzZXMgRExDSSAwICovCi0jZGVmaW5lIFJGQ09NTV9NWF9ETENJIDAKLQotLyoKLSAqIERlZmluZSBSRkNPTU0gTXVsdGlwbGV4ZXIgbWVzc2FnZSB0eXBlcwotKi8KLSNkZWZpbmUgUkZDT01NX01YX1BOIDB4ODAKLSNkZWZpbmUgUkZDT01NX01YX1BOX0xFTiA4Ci0KLSNkZWZpbmUgUkZDT01NX01YX0NMRCAweEMwCi0jZGVmaW5lIFJGQ09NTV9NWF9DTERfTEVOIDAKLQotI2RlZmluZSBSRkNPTU1fTVhfVEVTVCAweDIwCi0KLSNkZWZpbmUgUkZDT01NX01YX0ZDT04gMHhBMAotI2RlZmluZSBSRkNPTU1fTVhfRkNPTl9MRU4gMAotCi0jZGVmaW5lIFJGQ09NTV9NWF9GQ09GRiAweDYwCi0jZGVmaW5lIFJGQ09NTV9NWF9GQ09GRl9MRU4gMAotCi0jZGVmaW5lIFJGQ09NTV9NWF9NU0MgMHhFMAotI2RlZmluZSBSRkNPTU1fTVhfTVNDX0xFTl9OT19CUkVBSyAyCi0jZGVmaW5lIFJGQ09NTV9NWF9NU0NfTEVOX1dJVEhfQlJFQUsgMwotCi0jZGVmaW5lIFJGQ09NTV9NWF9OU0MgMHgxMAotI2RlZmluZSBSRkNPTU1fTVhfTlNDX0xFTiAxCi0KLSNkZWZpbmUgUkZDT01NX01YX1JQTiAweDkwCi0jZGVmaW5lIFJGQ09NTV9NWF9SUE5fUkVRX0xFTiAxCi0jZGVmaW5lIFJGQ09NTV9NWF9SUE5fTEVOIDgKLQotI2RlZmluZSBSRkNPTU1fTVhfUkxTIDB4NTAKLSNkZWZpbmUgUkZDT01NX01YX1JMU19MRU4gMgotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL3Njb19jbGllbnRfY2FsbGJhY2tzLmggYi9zdGFjay9pbmNsdWRlL3Njb19jbGllbnRfY2FsbGJhY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDgyZWIuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9zY29fY2xpZW50X2NhbGxiYWNrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLQotc3RydWN0IHNjb19jbGllbnRfY2FsbGJhY2tfcyB7Ci0gIHRCVE1fU0NPX0NCIG9uX2Nvbm5lY3RlZDsKLSAgdEJUTV9TQ09fQ0Igb25fZGlzY29ubmVjdGVkOwotICB0QlRNX0VTQ09fQ0JBQ0sgb25fc2NvX2V2ZW50OwotfTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvc2NvX2hjaV9saW5rX2ludGVyZmFjZS5oIGIvc3RhY2svaW5jbHVkZS9zY29faGNpX2xpbmtfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDk5ZjUuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9zY29faGNpX2xpbmtfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInR5cGVzL2NsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0cnVjdCB0QlRNX0VTQ09fREFUQTsKLQotZXh0ZXJuIGJvb2wgYnRtX2lzX3Njb19hY3RpdmUodWludDE2X3QgaGFuZGxlKTsKLWV4dGVybiB2b2lkIGJ0bV9zY29fY2hrX3BlbmRfdW5wYXJrKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfaGFuZGxlKTsKLWV4dGVybiB2b2lkIGJ0bV9zY29fY29ubl9yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBjb25zdCBERVZfQ0xBU1MmIGRldl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsaW5rX3R5cGUpOwotZXh0ZXJuIHZvaWQgYnRtX3Njb19jb25uZWN0ZWQodEhDSV9TVEFUVVMgaGNpX3N0YXR1cywgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGNpX2hhbmRsZSwgdEJUTV9FU0NPX0RBVEEqIHBfZXNjb19kYXRhKTsKLWV4dGVybiBib29sIGJ0bV9zY29fcmVtb3ZlZCh1aW50MTZfdCBoY2lfaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pOwotCi12b2lkIGJ0bV9zY29fb25fZGlzY29ubmVjdGVkKHVpbnQxNl90IGhjaV9oYW5kbGUsIHRIQ0lfUkVBU09OIHJlYXNvbik7Ci12b2lkIGJ0bV9zY29fb25fZXNjb19jb25uZWN0X3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjp0eXBlczo6Q2xhc3NPZkRldmljZSYpOwotdm9pZCBidG1fc2NvX29uX3Njb19jb25uZWN0X3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OnR5cGVzOjpDbGFzc09mRGV2aWNlJik7CmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL3NkcF9hcGkuaCBiL3N0YWNrL2luY2x1ZGUvc2RwX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJmMDA0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvc2RwX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIFNEUF9BUElfSAotI2RlZmluZSBTRFBfQVBJX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJzZHBkZWZzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdWNjZXNzIGNvZGUgYW5kIGVycm9yIGNvZGVzICovCi10eXBlZGVmIGVudW0gOiB1aW50MTZfdCB7Ci0gIFNEUF9TVUNDRVNTID0gMHgwMDAwLAotICBTRFBfSU5WQUxJRF9WRVJTSU9OID0gMHgwMDAxLAotICBTRFBfSU5WQUxJRF9TRVJWX1JFQ19IREwgPSAweDAwMDIsCi0gIFNEUF9JTlZBTElEX1JFUV9TWU5UQVggPSAweDAwMDMsCi0gIFNEUF9JTlZBTElEX1BEVV9TSVpFID0gMHgwMDA0LAotICBTRFBfSU5WQUxJRF9DT05UX1NUQVRFID0gMHgwMDA1LAotICBTRFBfTk9fUkVTT1VSQ0VTID0gMHgwMDA2LAotICBTRFBfRElfUkVHX0ZBSUxFRCA9IDB4MDAwNywKLSAgU0RQX0RJX0RJU0NfRkFJTEVEID0gMHgwMDA4LAotICBTRFBfTk9fRElfUkVDT1JEX0ZPVU5EID0gMHgwMDA5LAotICBTRFBfRVJSX0FUVFJfTk9UX1BSRVNFTlQgPSAweDAwMEEsCi0gIFNEUF9JTExFR0FMX1BBUkFNRVRFUiA9IDB4MDAwQiwKLQotICBISURfU0RQX05PX1NFUlZfVVVJRCA9IChTRFBfSUxMRUdBTF9QQVJBTUVURVIgKyAxKSwKLSAgSElEX1NEUF9NQU5EQVRPUllfTUlTU0lORywKLQotICBTRFBfTk9fUkVDU19NQVRDSCA9IDB4RkZGMCwKLSAgU0RQX0NPTk5fRkFJTEVEID0gMHhGRkYxLAotICBTRFBfQ0ZHX0ZBSUxFRCA9IDB4RkZGMiwKLSAgU0RQX0dFTkVSSUNfRVJST1IgPSAweEZGRjMsCi0gIFNEUF9EQl9GVUxMID0gMHhGRkY0LAotICBTRFBfQ0FOQ0VMID0gMHhGRkY4LAotfSB0U0RQX1NUQVRVUzsKLXVzaW5nIHRTRFBfUkVTVUxUID0gdFNEUF9TVEFUVVM7Ci11c2luZyB0U0RQX1JFQVNPTiA9IHRTRFBfU1RBVFVTOwotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotaW5saW5lIHN0ZDo6c3RyaW5nIHNkcF9zdGF0dXNfdGV4dChjb25zdCB0U0RQX1NUQVRVUyYgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfU1VDQ0VTUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfSU5WQUxJRF9WRVJTSU9OKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNEUF9JTlZBTElEX1NFUlZfUkVDX0hETCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfSU5WQUxJRF9SRVFfU1lOVEFYKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNEUF9JTlZBTElEX1BEVV9TSVpFKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNEUF9JTlZBTElEX0NPTlRfU1RBVEUpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU0RQX05PX1JFU09VUkNFUyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfRElfUkVHX0ZBSUxFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfRElfRElTQ19GQUlMRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU0RQX05PX0RJX1JFQ09SRF9GT1VORCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfRVJSX0FUVFJfTk9UX1BSRVNFTlQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU0RQX0lMTEVHQUxfUEFSQU1FVEVSKTsKLQotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX1NEUF9OT19TRVJWX1VVSUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoSElEX1NEUF9NQU5EQVRPUllfTUlTU0lORyk7Ci0KLSAgICBDQVNFX1JFVFVSTl9URVhUKFNEUF9OT19SRUNTX01BVENIKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNEUF9DT05OX0ZBSUxFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfQ0ZHX0ZBSUxFRCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfR0VORVJJQ19FUlJPUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfREJfRlVMTCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTRFBfQ0FOQ0VMKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOWyVoaHVdIiwgc3RhdHVzKTsKLSAgfQotfQotI3VuZGVmIENBU0VfUkVUVVJOX1RFWFQKLQotLyogTWFza3MgZm9yIGF0dHJfdmFsdWUgZmllbGQgb2YgdFNEUF9ESVNDX0FUVFIgKi8KLSNkZWZpbmUgU0RQX0RJU0NfQVRUUl9MRU5fTUFTSyAweDBGRkYKLSNkZWZpbmUgU0RQX0RJU0NfQVRUUl9UWVBFKGxlbl90eXBlKSAoKGxlbl90eXBlKSA+PiAxMikKLSNkZWZpbmUgU0RQX0RJU0NfQVRUUl9MRU4obGVuX3R5cGUpICgobGVuX3R5cGUpJlNEUF9ESVNDX0FUVFJfTEVOX01BU0spCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIHByb3RvY29sIGxpc3QgaXRlbXMgKGxpc3RfZWxlbSBpbiB0U0RQX1BST1RPQ09MX0VMRU0pICovCi0jZGVmaW5lIFNEUF9NQVhfTElTVF9FTEVNUyAzCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgRGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiBkaXNjb3ZlcnkgaXMgY29tcGxldGUuICovCi10eXBlZGVmIHZvaWQodFNEUF9ESVNDX0NNUExfQ0IpKHRTRFBfUkVTVUxUIHJlc3VsdCk7Ci10eXBlZGVmIHZvaWQodFNEUF9ESVNDX0NNUExfQ0IyKSh0U0RQX1JFU1VMVCByZXN1bHQsIGNvbnN0IHZvaWQqIHVzZXJfZGF0YSk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyBwZWVyX2FkZHI7Ci0gIHVpbnQxNl90IHBlZXJfbXR1OwotfSB0U0RQX0RSX09QRU47Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCogcF9kYXRhOwotICB1aW50MTZfdCBkYXRhX2xlbjsKLX0gdFNEUF9EUl9EQVRBOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdFNEUF9EUl9PUEVOIG9wZW47Ci0gIHRTRFBfRFJfREFUQSBkYXRhOwotfSB0U0RQX0RBVEE7Ci0KLS8qIERlZmluZSBhIHN0cnVjdHVyZSB0byBob2xkIHRoZSBkaXNjb3ZlcmVkIHNlcnZpY2UgaW5mb3JtYXRpb24uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuaW9uIHsKLSAgICB1aW50OF90IHU4OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBpbnRlZ2VyICAgICAgICAgICAgKi8KLSAgICB1aW50MTZfdCB1MTY7ICAgICAgICAgICAgICAgICAgICAgICAvKiAxNi1iaXQgaW50ZWdlciAgICAgICAgICAgKi8KLSAgICB1aW50MzJfdCB1MzI7ICAgICAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgaW50ZWdlciAgICAgICAgICAgKi8KLSAgICBzdHJ1Y3QgdF9zZHBfZGlzY19hdHRyKiBwX3N1Yl9hdHRyOyAvKiBBZGRyIG9mIGZpcnN0IHN1Yi1hdHRyIChsaXN0KSovCi0gICAgdWludDhfdCBhcnJheVtdOyAgICAgICAgICAgICAgICAgICAgLyogVmFyaWFibGUgbGVuZ3RoIGZpZWxkICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxleGlibGUgYXJyYXkgbWVtYmVyICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVxdWlyaW5nIGJhY2tpbmcgc3RvcmUgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJvbSBTRFAgREIgICAgKi8KLSAgfSB2OwotCi19IHRTRFBfRElTQ19BVFZBTDsKLQotdHlwZWRlZiBzdHJ1Y3QgdF9zZHBfZGlzY19hdHRyIHsKLSAgc3RydWN0IHRfc2RwX2Rpc2NfYXR0ciogcF9uZXh0X2F0dHI7IC8qIEFkZHIgb2YgbmV4dCBsaW5rZWQgYXR0ciAgICAgKi8KLSAgdWludDE2X3QgYXR0cl9pZDsgICAgICAgICAgICAgICAgICAgIC8qIEF0dHJpYnV0ZSBJRCAgICAgICAgICAgICAgICAgKi8KLSAgdWludDE2X3QgYXR0cl9sZW5fdHlwZTsgICAgICAgICAgICAgIC8qIExlbmd0aCBhbmQgdHlwZSBmaWVsZHMgICAgICAgKi8KLSAgdFNEUF9ESVNDX0FUVkFMIGF0dHJfdmFsdWU7ICAgICAgICAgIC8qIFZhcmlhYmxlIGxlbmd0aCBlbnRyeSBkYXRhICAgKi8KLX0gdFNEUF9ESVNDX0FUVFI7Ci0KLXR5cGVkZWYgc3RydWN0IHRfc2RwX2Rpc2NfcmVjIHsKLSAgdFNEUF9ESVNDX0FUVFIqIHBfZmlyc3RfYXR0cjsgICAgICAvKiBGaXJzdCBhdHRyaWJ1dGUgb2YgcmVjb3JkICAgICovCi0gIHN0cnVjdCB0X3NkcF9kaXNjX3JlYyogcF9uZXh0X3JlYzsgLyogQWRkciBvZiBuZXh0IGxpbmtlZCByZWNvcmQgICAqLwotICB1aW50MzJfdCB0aW1lX3JlYWQ7ICAgICAgICAgICAgICAgIC8qIFRoZSB0aW1lIHRoZSByZWNvcmQgd2FzIHJlYWQgKi8KLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRfYWRkcjsgICAgICAgICAvKiBSZW1vdGUgQkQgYWRkcmVzcyAgICAgICAgICAgICovCi19IHRTRFBfRElTQ19SRUM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgbWVtX3NpemU7ICAgICAgICAgIC8qIE1lbW9yeSBzaXplIG9mIHRoZSBEQiAgICAgICAgKi8KLSAgdWludDMyX3QgbWVtX2ZyZWU7ICAgICAgICAgIC8qIE1lbW9yeSBzdGlsbCBhdmFpbGFibGUgICAgICAgKi8KLSAgdFNEUF9ESVNDX1JFQyogcF9maXJzdF9yZWM7IC8qIEFkZHIgb2YgZmlyc3QgcmVjb3JkIGluIERCICAgKi8KLSAgdWludDE2X3QgbnVtX3V1aWRfZmlsdGVyczsgIC8qIE51bWJlciBvZiBVVUlkcyB0byBmaWx0ZXIgICAgKi8KLSAgYmx1ZXRvb3RoOjpVdWlkIHV1aWRfZmlsdGVyc1tTRFBfTUFYX1VVSURfRklMVEVSU107IC8qIFVVSURzIHRvIGZpbHRlciAqLwotICB1aW50MTZfdCBudW1fYXR0cl9maWx0ZXJzOyAvKiBOdW1iZXIgb2YgYXR0cmlidXRlIGZpbHRlcnMgICovCi0gIHVpbnQxNl90IGF0dHJfZmlsdGVyc1tTRFBfTUFYX0FUVFJfRklMVEVSU107IC8qIEF0dHJpYnV0ZXMgdG8gZmlsdGVyICovCi0gIHVpbnQ4X3QqIHBfZnJlZV9tZW07IC8qIFBvaW50ZXIgdG8gZnJlZSBtZW1vcnkgICAgICAgKi8KLSAgdWludDhfdCoKLSAgICAgIHJhd19kYXRhOyAvKiBSZWNlaXZlZCByZWNvcmQgZnJvbSBzZXJ2ZXIuIGFsbG9jYXRlZC9yZWxlYXNlZCBieSBjbGllbnQgICovCi0gIHVpbnQzMl90IHJhd19zaXplOyAvKiBzaXplIG9mIHJhd19kYXRhICovCi0gIHVpbnQzMl90IHJhd191c2VkOyAvKiBsZW5ndGggb2YgcmF3X2RhdGEgdXNlZCAqLwotfSB0U0RQX0RJU0NPVkVSWV9EQjsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBhZGQgcHJvdG9jb2wgbGlzdHMgYW5kIGZpbmQgcHJvdG9jb2wgZWxlbWVudHMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgcHJvdG9jb2xfdXVpZDsKLSAgdWludDE2X3QgbnVtX3BhcmFtczsKLSAgdWludDE2X3QgcGFyYW1zW1NEUF9NQVhfUFJPVE9DT0xfUEFSQU1TXTsKLX0gdFNEUF9QUk9UT0NPTF9FTEVNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IG51bV9lbGVtczsKLSAgdFNEUF9QUk9UT0NPTF9FTEVNIGxpc3RfZWxlbVtTRFBfTUFYX0xJU1RfRUxFTVNdOwotfSB0U0RQX1BST1RPX0xJU1RfRUxFTTsKLQotLyogRGV2aWNlIElkZW50aWZpY2F0aW9uIChESSkgZGF0YSBzdHJ1Y3R1cmUKLSovCi0vKiBVc2VkIHRvIHNldCB0aGUgREkgcmVjb3JkICovCi10eXBlZGVmIHN0cnVjdCB0X3NkcF9kaV9yZWNvcmQgewotICB1aW50MTZfdCB2ZW5kb3I7Ci0gIHVpbnQxNl90IHZlbmRvcl9pZF9zb3VyY2U7Ci0gIHVpbnQxNl90IHByb2R1Y3Q7Ci0gIHVpbnQxNl90IHZlcnNpb247Ci0gIGJvb2wgcHJpbWFyeV9yZWNvcmQ7Ci0gIGNoYXIgY2xpZW50X2V4ZWN1dGFibGVfdXJsW1NEUF9NQVhfQVRUUl9MRU5dOyAvKiBvcHRpb25hbCAqLwotICBjaGFyIHNlcnZpY2VfZGVzY3JpcHRpb25bU0RQX01BWF9BVFRSX0xFTl07ICAgLyogb3B0aW9uYWwgKi8KLSAgY2hhciBkb2N1bWVudGF0aW9uX3VybFtTRFBfTUFYX0FUVFJfTEVOXTsgICAgIC8qIG9wdGlvbmFsICovCi19IHRTRFBfRElfUkVDT1JEOwotCi0vKiBVc2VkIHRvIGdldCB0aGUgREkgcmVjb3JkICovCi10eXBlZGVmIHN0cnVjdCB0X3NkcF9kaV9nZXRfcmVjb3JkIHsKLSAgdWludDE2X3Qgc3BlY19pZDsKLSAgdFNEUF9ESV9SRUNPUkQgcmVjOwotfSB0U0RQX0RJX0dFVF9SRUNPUkQ7Ci0KLS8qIEFQSSBpbnRvIHRoZSBTRFAgbGF5ZXIgZm9yIHNlcnZpY2UgZGlzY292ZXJ5LiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0luaXREaXNjb3ZlcnlEYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBhIGRpc2NvdmVyeSBkYXRhYmFzZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgb25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgYmFkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0luaXREaXNjb3ZlcnlEYih0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdWludDMyX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV91dWlkLCBjb25zdCBibHVldG9vdGg6OlV1aWQqIHBfdXVpZF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9hdHRyLCBjb25zdCB1aW50MTZfdCogcF9hdHRyX2xpc3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2gKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FuY2VscyBhbiBhY3RpdmUgcXVlcnkgdG8gYW4gU0RQIHNlcnZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZGlzY292ZXJ5IGNhbmNlbGxlZCwgZmFsc2UgaWYgYSBtYXRjaGluZyBhY3Rpdml0eSBpcwotICogICAgICAgICAgICAgICAgICBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2goY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHF1ZXJpZXMgYW4gU0RQIHNlcnZlciBmb3IgaW5mb3JtYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGRpc2NvdmVyeSBzdGFydGVkLCBmYWxzZSBpZiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcXVlcmllcyBhbiBTRFAgc2VydmVyIGZvciBpbmZvcm1hdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBBUEkgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBTRFBfU2VydmljZVNlYXJjaFJlcXVlc3QgaXMgdGhhdCB0aGlzIG9uZSBkb2VzIGEKLSAqICAgICAgICAgICAgICAgICAgY29tYmluZWQgU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QgU0RQIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkaXNjb3Zlcnkgc3RhcnRlZCwgZmFsc2UgaWYgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcXVlcmllcyBhbiBTRFAgc2VydmVyIGZvciBpbmZvcm1hdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBBUEkgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBTRFBfU2VydmljZVNlYXJjaFJlcXVlc3QgaXMgdGhhdCB0aGlzIG9uZSBkb2VzIGEKLSAqICAgICAgICAgICAgICAgICAgY29tYmluZWQgU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QgU0RQIGZ1bmN0aW9uIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHVzZXIgZGF0YSBwaWdneWJhY2sKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZGlzY292ZXJ5IHN0YXJ0ZWQsIGZhbHNlIGlmIGZhaWxlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QyKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQ01QTF9DQjIqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogdXNlcl9kYXRhKTsKLQotLyogQVBJIG9mIHV0aWxpdGllcyB0byBmaW5kIGRhdGEgaW4gdGhlIGxvY2FsIGRpc2NvdmVyeSBkYXRhYmFzZSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBhbiBTRFAgZGlzY292ZXJ5IHJlY29yZCBmb3IgYQotICogICAgICAgICAgICAgICAgICBzcGVjaWZpYyBhdHRyaWJ1dGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIG1hdGNoaW5nIGF0dHJpYnV0ZSBlbnRyeSwgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U0RQX0RJU0NfQVRUUiogU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRTZXJ2aWNlSW5EYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBxdWVyaWVzIGFuIFNEUCBkYXRhYmFzZSBmb3IgYSBzcGVjaWZpYwotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBJZiB0aGUgcF9zdGFydF9yZWMgcG9pbnRlciBpcyBOVUxMLCBpdCBsb29rcyBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGFiYXNlLCBlbHNlIGl0IGNvbnRpbnVlcyBmcm9tIHRoZQotICogICAgICAgICAgICAgICAgICBuZXh0IHJlY29yZCBhZnRlciBwX3N0YXJ0X3JlYy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gcmVjb3JkIGNvbnRhaW5pbmcgc2VydmljZSBjbGFzcywgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U0RQX0RJU0NfUkVDKiBTRFBfRmluZFNlcnZpY2VJbkRiKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9GaW5kU2VydmljZVVVSURJbkRiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHF1ZXJpZXMgYW4gU0RQIGRhdGFiYXNlIGZvciBhIHNwZWNpZmljCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIElmIHRoZSBwX3N0YXJ0X3JlYyBwb2ludGVyIGlzIE5VTEwsIGl0IGxvb2tzIGZyb20KLSAqICAgICAgICAgICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YWJhc2UsIGVsc2UgaXQgY29udGludWVzIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgIG5leHQgcmVjb3JkIGFmdGVyIHBfc3RhcnRfcmVjLgotICoKLSAqIE5PVEUgICAgICAgICAgICAgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBwcmV2aW91cwotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbiAiU0RQX0ZpbmRTZXJ2aWNlSW5EYigpIiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMKLSAqICAgICAgICAgICAgICAgICAgYSBVdWlkIGlucHV0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byByZWNvcmQgY29udGFpbmluZyBzZXJ2aWNlIGNsYXNzLCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTRFBfRElTQ19SRUMqIFNEUF9GaW5kU2VydmljZVVVSURJbkRiKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9zdGFydF9yZWMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgMTI4LWJpdCBzZXJ2aWNlIFVVSUQgd2l0aGluIGEgcmVjb3JkLAotICogICAgICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbnkuCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX3JlYyAgICAgIC0gcG9pbnRlciB0byBhIFNEUCByZWNvcmQuCi0gKiAgICAgICAgICAgICAgICAgIHBfdXVpZCAgICAgLSBvdXRwdXQgcGFyYW1ldGVyIHRvIHNhdmUgdGhlIFVVSUQgZm91bmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdChjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OlV1aWQqIHBfdXVpZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfRmluZFNlcnZpY2VJbkRiXzEyOGJpdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUXVlcnkgYW4gU0RQIGRhdGFiYXNlIGZvciBhIHNwZWNpZmljIHNlcnZpY2UuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBwX3N0YXJ0X3JlYyBwb2ludGVyIGlzIE5VTEwsIGxvb2sgZnJvbSB0aGUgYmVnaW5uaW5nCi0gKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBkYXRhYmFzZSwgZWxzZSBjb250aW51ZSBmcm9tIHRoZSBuZXh0IHJlY29yZCBhZnRlcgotICogICAgICAgICAgICAgICAgICBwX3N0YXJ0X3JlYy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gcmVjb3JkIGNvbnRhaW5pbmcgc2VydmljZSBjbGFzcywgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U0RQX0RJU0NfUkVDKiBTRFBfRmluZFNlcnZpY2VJbkRiXzEyOGJpdChjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IGEgc3BlY2lmaWMgZGlzY292ZXJ5IHJlY29yZCBmb3IgYQotICogICAgICAgICAgICAgICAgICBwcm90b2NvbCBsaXN0IGVsZW1lbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgSWYgZm91bmQsIHRoZSBwYXNzZWQgcHJvdG9jb2wgbGlzdCBlbGVtZW50IGlzIGZpbGxlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF5ZXJfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRQcm9maWxlVmVyc2lvbkluUmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IGEgc3BlY2lmaWMgZGlzY292ZXJ5IHJlY29yZCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIFByb2ZpbGUgbGlzdCBkZXNjcmlwdG9yLCBhbmQgcHVsbHMgb3V0IHRoZSB2ZXJzaW9uIG51bWJlci4KLSAqICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gbnVtYmVyIGNvbnNpc3RzIG9mIGFuIDgtYml0IG1ham9yIHZlcnNpb24gYW5kCi0gKiAgICAgICAgICAgICAgICAgIGFuIDgtYml0IG1pbm9yIHZlcnNpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgSWYgZm91bmQsIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIHRoYXQgd2VyZQotICogICAgICAgICAgICAgICAgICBwYXNzZWQgaW4gYXJlIGZpbGxlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9maWxlX3V1aWQsIHVpbnQxNl90KiBwX3ZlcnNpb24pOwotCi0vKiBBUEkgaW50byBTRFAgZm9yIGxvY2FsIHNlcnZpY2UgZGF0YWJhc2UgdXBkYXRlcyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0NyZWF0ZVJlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY3JlYXRlIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZS4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UgQVBJLiBUaGUKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkIGlzIGNyZWF0ZWQgZW1wdHksIHRlaCBhcHBsaWNhdGlvbiBzaG91bGQgdGhlbiBjYWxsCi0gKiAgICAgICAgICAgICAgICAgICJhZGRfYXR0cmlidXRlIiB0byBhZGQgdGhlIHJlY29yZCdzIGF0dHJpYnV0ZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZWNvcmQgaGFuZGxlIGlmIE9LLCBlbHNlIDAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQzMl90IFNEUF9DcmVhdGVSZWNvcmQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfRGVsZXRlUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSByZWNvcmQgKG9yIGFsbCByZWNvcmRzKQotICogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBkYXRhYmFzZS4gVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UKLSAqICAgICAgICAgICAgICAgICAgbWFpbnRlbmFuY2UgQVBJLgotICoKLSAqICAgICAgICAgICAgICAgICAgSWYgYSByZWNvcmQgaGFuZGxlIG9mIDAgaXMgcGFzc2VkLCBhbGwgcmVjb3JkcyBhcmUgZGVsZXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgc3VjY2VlZGVkLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0RlbGV0ZVJlY29yZCh1aW50MzJfdCBoYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0FkZEF0dHJpYnV0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGFuIGF0dHJpYnV0ZSB0byBhIHJlY29yZC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UgQVBJLgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzCi0gKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggdGhlIG5ldyB2YWx1ZS4KLSAqCi0gKiBOT1RFICAgICAgICAgICAgIEF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBwYXNzZWQgYXMgYSBCaWcgRW5kaWFuIHN0cmVhbS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYWRkZWQgT0ssIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfQWRkQXR0cmlidXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9pZCwgdWludDhfdCBhdHRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXR0cl9sZW4sIHVpbnQ4X3QqIHBfdmFsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRTZXF1ZW5jZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGEgc2VxdWVuY2UgdG8gYSByZWNvcmQuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgd291bGQgYmUgdGhyb3VnaCB0aGUgU0RQIGRhdGFiYXNlIG1haW50ZW5hbmNlIEFQSS4KLSAqICAgICAgICAgICAgICAgICAgSWYgdGhlIHNlcXVlbmNlIGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzIHJlcGxhY2VkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggdGhlIG5ldyBzZXF1ZW5jZS4KLSAqCi0gKiBOT1RFICAgICAgICAgICAgIEVsZW1lbnQgdmFsdWVzIG11c3QgYmUgcGFzc2VkIGFzIGEgQmlnIEVuZGlhbiBzdHJlYW0uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFNlcXVlbmNlKHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9pZCwgdWludDE2X3QgbnVtX2VsZW0sCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR5cGVbXSwgdWludDhfdCBsZW5bXSwgdWludDhfdCogcF92YWxbXSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfQWRkVXVpZFNlcXVlbmNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBVVUlEIHNlcXVlbmNlIHRvIGEgcmVjb3JkLgotICogICAgICAgICAgICAgICAgICBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZSBBUEkuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBzZXF1ZW5jZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcmVjb3JkLCBpdCBpcyByZXBsYWNlZAotICogICAgICAgICAgICAgICAgICB3aXRoIHRoZSBuZXcgc2VxdWVuY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFV1aWRTZXF1ZW5jZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IGF0dHJfaWQsIHVpbnQxNl90IG51bV91dWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF91dWlkcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfQWRkUHJvdG9jb2xMaXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBwcm90b2NvbCBkZXNjcmlwdG9yIGxpc3QgdG8KLSAqICAgICAgICAgICAgICAgICAgYSByZWNvcmQuIFRoaXMgd291bGQgYmUgdGhyb3VnaCB0aGUgU0RQIGRhdGFiYXNlCi0gKiAgICAgICAgICAgICAgICAgIG1haW50ZW5hbmNlIEFQSS4gSWYgdGhlIHByb3RvY29sIGxpc3QgYWxyZWFkeSBleGlzdHMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIHJlY29yZCwgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFByb3RvY29sTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9lbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfUFJPVE9DT0xfRUxFTSogcF9lbGVtX2xpc3QpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0FkZEFkZGl0aW9uUHJvdG9MaXN0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGEgcHJvdG9jb2wgZGVzY3JpcHRvciBsaXN0IHRvCi0gKiAgICAgICAgICAgICAgICAgIGEgcmVjb3JkLiBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZQotICogICAgICAgICAgICAgICAgICBBUEkuIElmIHRoZSBwcm90b2NvbCBsaXN0IGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0Ci0gKiAgICAgICAgICAgICAgICAgIGlzIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBsaXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9BZGRBZGRpdGlvblByb3RvTGlzdHModWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1BST1RPX0xJU1RfRUxFTSogcF9wcm90b19saXN0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhIHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0IHRvCi0gKiAgICAgICAgICAgICAgICAgIGEgcmVjb3JkLiBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZQotICogICAgICAgICAgICAgICAgICBBUEkuIElmIHRoZSB2ZXJzaW9uIGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzCi0gKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBvbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFByb2ZpbGVEZXNjcmlwdG9yTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IHByb2ZpbGVfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRMYW5ndWFnZUJhc2VBdHRySURMaXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBsYW5ndWFnZSBiYXNlIGF0dHIgbGlzdCB0bwotICogICAgICAgICAgICAgICAgICBhIHJlY29yZC4gVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgQVBJLiBJZiB0aGUgdmVyc2lvbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcmVjb3JkLCBpdCBpcwotICogICAgICAgICAgICAgICAgICByZXBsYWNlZCB3aXRoIHRoZSBuZXcgb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9BZGRMYW5ndWFnZUJhc2VBdHRySURMaXN0KHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgbGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2hhcl9lbmMsIHVpbnQxNl90IGJhc2VfaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGEgc2VydmljZSBsaXN0IHRvIGEgcmVjb3JkLgotICogICAgICAgICAgICAgICAgICBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZSBBUEkuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBzZXJ2aWNlIGxpc3QgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHJlY29yZCwgaXQgaXMKLSAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9zZXJ2aWNlX3V1aWRzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9EZWxldGVBdHRyaWJ1dGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlbGV0ZSBhbiBhdHRyaWJ1dGUgZnJvbSBhIHJlY29yZC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UgQVBJLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZWxldGVkIE9LLCBlbHNlIGZhbHNlIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9EZWxldGVBdHRyaWJ1dGUodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX2lkKTsKLQotLyogRGV2aWNlIElkZW50aWZpY2F0aW9uIEFQSXMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9TZXRMb2NhbERpUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBESSByZWNvcmQgdG8gdGhlIGxvY2FsIFNEUCBkYXRhYmFzZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFJldHVybnMgU0RQX1NVQ0NFU1MgaWYgcmVjb3JkIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZWxzZSBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBTRFBfU2V0TG9jYWxEaVJlY29yZChjb25zdCB0U0RQX0RJX1JFQ09SRCogZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF9oYW5kbGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0RpRGlzY292ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcXVlcmllcyBhIHJlbW90ZSBkZXZpY2UgZm9yIERJIGluZm9ybWF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgU0RQX1NVQ0NFU1MgaWYgcXVlcnkgc3RhcnRlZCBzdWNjZXNzZnVsbHksIGVsc2UgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFNEUF9TVEFUVVMgU0RQX0RpRGlzY292ZXIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MzJfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfR2V0TnVtRGlSZWNvcmRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZWFyY2hlcyBzcGVjaWZpZWQgZGF0YWJhc2UgZm9yIERJIHJlY29yZHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG51bWJlciBvZiBESSByZWNvcmRzIGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgU0RQX0dldE51bURpUmVjb3Jkcyhjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfR2V0RGlSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgcmVtb3RlIGRldmljZSdzIERJIHJlY29yZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICBTRFBfU1VDQ0VTUyBpZiByZWNvcmQgcmV0cmlldmVkLCBlbHNlIGVycm9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IFNEUF9HZXREaVJlY29yZCh1aW50OF90IGdldFJlY29yZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElfR0VUX1JFQ09SRCogZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIFNEUC4gSWYgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiAweEZGLCBpdCBzaW1wbHkgcmVhZHMgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgbmV3IChjdXJyZW50KSB0cmFjZSBsZXZlbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IFNEUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9GaW5kU2VydmljZVVVSURJblJlYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCB0aGUgc2VydmljZSBVVUlEIHdpdGhpbiBhIHJlY29yZCwKLSAqICAgICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW55LgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcF9yZWMgICAgICAtIHBvaW50ZXIgdG8gYSBTRFAgcmVjb3JkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9GaW5kU2VydmljZVVVSURJblJlYyhjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6VXVpZCogcF91dWlkKTsKLQotI2VuZGlmIC8qIFNEUF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9zZHBkZWZzLmggYi9zdGFjay9pbmNsdWRlL3NkcGRlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlYTNlMi4uMDAwMDAwMAotLS0gYS9zdGFjay9pbmNsdWRlL3NkcGRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBTRFAgQVBJCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBTRFBfREVGU19ICi0jZGVmaW5lIFNEUF9ERUZTX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0vKiBEZWZpbmUgdGhlIHNlcnZpY2UgYXR0cmlidXRlIElEcy4KLSovCi0jZGVmaW5lIEFUVFJfSURfU0VSVklDRV9SRUNPUkRfSERMIDB4MDAwMAotI2RlZmluZSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCAweDAwMDEKLSNkZWZpbmUgQVRUUl9JRF9TRVJWSUNFX0lEIDB4MDAwMwotI2RlZmluZSBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVCAweDAwMDQKLSNkZWZpbmUgQVRUUl9JRF9CUk9XU0VfR1JPVVBfTElTVCAweDAwMDUKLSNkZWZpbmUgQVRUUl9JRF9MQU5HVUFHRV9CQVNFX0FUVFJfSURfTElTVCAweDAwMDYKLSNkZWZpbmUgQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCAweDAwMDkKLSNkZWZpbmUgQVRUUl9JRF9ET0NVTUVOVEFUSU9OX1VSTCAweDAwMEEKLSNkZWZpbmUgQVRUUl9JRF9DTElFTlRfRVhFX1VSTCAweDAwMEIKLSNkZWZpbmUgQVRUUl9JRF9BRERJVElPTl9QUk9UT19ERVNDX0xJU1RTIDB4MDAwRAotCi0jZGVmaW5lIExBTkdVQUdFX0JBU0VfSUQgMHgwMTAwCi0jZGVmaW5lIEFUVFJfSURfU0VSVklDRV9OQU1FIChMQU5HVUFHRV9CQVNFX0lEICsgMHgwMDAwKQotI2RlZmluZSBBVFRSX0lEX1NFUlZJQ0VfREVTQ1JJUFRJT04gKExBTkdVQUdFX0JBU0VfSUQgKyAweDAwMDEpCi0jZGVmaW5lIEFUVFJfSURfUFJPVklERVJfTkFNRSAoTEFOR1VBR0VfQkFTRV9JRCArIDB4MDAwMikKLQotLyogRGV2aWNlIElkZW50aWZpY2F0aW9uIChESSkKLSovCi0jZGVmaW5lIEFUVFJfSURfU1BFQ0lGSUNBVElPTl9JRCAweDAyMDAKLSNkZWZpbmUgQVRUUl9JRF9WRU5ET1JfSUQgMHgwMjAxCi0jZGVmaW5lIEFUVFJfSURfUFJPRFVDVF9JRCAweDAyMDIKLSNkZWZpbmUgQVRUUl9JRF9QUk9EVUNUX1ZFUlNJT04gMHgwMjAzCi0jZGVmaW5lIEFUVFJfSURfUFJJTUFSWV9SRUNPUkQgMHgwMjA0Ci0jZGVmaW5lIEFUVFJfSURfVkVORE9SX0lEX1NPVVJDRSAweDAyMDUKLQotI2RlZmluZSBCTFVFVE9PVEhfRElfU1BFQ0lGSUNBVElPTiAweDAxMDMgLyogMS4zICovCi0jZGVmaW5lIERJX1ZFTkRPUl9JRF9TT1VSQ0VfQlRTSUcgMHgwMDAxCi0jZGVmaW5lIERJX1ZFTkRPUl9JRF9TT1VSQ0VfVVNCSUYgMHgwMDAyCi0KLSNkZWZpbmUgQVRUUl9JRF9HT0VQX0wyQ0FQX1BTTSAweDAyMDAKLQotI2RlZmluZSBBVFRSX0lEX05FVFdPUksgMHgwMzAxCi0jZGVmaW5lIEFUVFJfSURfRkFYX0NMQVNTXzFfU1VQUE9SVCAweDAzMDIKLSNkZWZpbmUgQVRUUl9JRF9SRU1PVEVfQVVESU9fVk9MVU1FX0NPTlRST0wgMHgwMzAyCi0jZGVmaW5lIEFUVFJfSURfU1VQUE9SVEVEX0ZPUk1BVFNfTElTVCAweDAzMDMKLSNkZWZpbmUgQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVMgMHgwMzExICAgICAgICAgLyogSEZQLCBCSVAgKi8KLSNkZWZpbmUgQVRUUl9JRF9TVVBQT1JURURfUkVQT1NJVE9SSUVTIDB4MDMxNCAgLyogUGhvbmUgYm9vayBhY2Nlc3MgUHJvZmlsZSAqLwotI2RlZmluZSBBVFRSX0lEX01BU19JTlNUQU5DRV9JRCAweDAzMTUgICAgICAgICAvKiBNQVAgcHJvZmlsZSAqLwotI2RlZmluZSBBVFRSX0lEX1NVUFBPUlRFRF9NU0dfVFlQRSAweDAzMTYgICAgICAvKiBNQVAgcHJvZmlsZSAqLwotI2RlZmluZSBBVFRSX0lEX01BUF9TVVBQT1JURURfRkVBVFVSRVMgMHgwMzE3ICAvKiBNQVAgcHJvZmlsZSAqLwotI2RlZmluZSBBVFRSX0lEX1BCQVBfU1VQUE9SVEVEX0ZFQVRVUkVTIDB4MDMxNyAvKiBQQkFQIHByb2ZpbGUgKi8KLQotLyogVGhlc2UgdmFsdWVzIGFyZSBmb3IgdGhlIFBBTiBwcm9maWxlICovCi0jZGVmaW5lIEFUVFJfSURfU0VDVVJJVFlfREVTQ1JJUFRJT04gMHgwMzBBCi0jZGVmaW5lIEFUVFJfSURfTkVUX0FDQ0VTU19UWVBFIDB4MDMwQgotI2RlZmluZSBBVFRSX0lEX01BWF9ORVRfQUNDRVNTX1JBVEUgMHgwMzBDCi0KLS8qIFRoZXNlIHZhbHVlcyBhcmUgZm9yIEhJRCBwcm9maWxlICovCi0jZGVmaW5lIEFUVFJfSURfSElEX0RFVklDRV9SRUxOVU0gMHgwMjAwCi0jZGVmaW5lIEFUVFJfSURfSElEX1BBUlNFUl9WRVJTSU9OIDB4MDIwMQotI2RlZmluZSBBVFRSX0lEX0hJRF9ERVZJQ0VfU1VCQ0xBU1MgMHgwMjAyCi0jZGVmaW5lIEFUVFJfSURfSElEX0NPVU5UUllfQ09ERSAweDAyMDMKLSNkZWZpbmUgQVRUUl9JRF9ISURfVklSVFVBTF9DQUJMRSAweDAyMDQKLSNkZWZpbmUgQVRUUl9JRF9ISURfUkVDT05ORUNUX0lOSVRJQVRFIDB4MDIwNQotI2RlZmluZSBBVFRSX0lEX0hJRF9ERVNDUklQVE9SX0xJU1QgMHgwMjA2Ci0jZGVmaW5lIEFUVFJfSURfSElEX0xBTkdVQUdFX0lEX0JBU0UgMHgwMjA3Ci0jZGVmaW5lIEFUVFJfSURfSElEX1NEUF9ESVNBQkxFIDB4MDIwOAotI2RlZmluZSBBVFRSX0lEX0hJRF9CQVRURVJZX1BPV0VSIDB4MDIwOQotI2RlZmluZSBBVFRSX0lEX0hJRF9SRU1PVEVfV0FLRSAweDAyMEEKLSNkZWZpbmUgQVRUUl9JRF9ISURfUFJPRklMRV9WRVJTSU9OIDB4MDIwQgotI2RlZmluZSBBVFRSX0lEX0hJRF9MSU5LX1NVUEVSVklTSU9OX1RPIDB4MDIwQwotI2RlZmluZSBBVFRSX0lEX0hJRF9OT1JNQUxMWV9DT05ORUNUQUJMRSAweDAyMEQKLSNkZWZpbmUgQVRUUl9JRF9ISURfQk9PVF9ERVZJQ0UgMHgwMjBFCi0jZGVmaW5lIEFUVFJfSURfSElEX1NTUl9IT1NUX01BWF9MQVQgMHgwMjBGCi0jZGVmaW5lIEFUVFJfSURfSElEX1NTUl9IT1NUX01JTl9UT1VUIDB4MDIxMAotCi0vKiBEZWZpbmUgY29tbW9uIDE2LWJpdCBwcm90b2NvbCBVVUlEcwotKi8KLSNkZWZpbmUgVVVJRF9QUk9UT0NPTF9SRkNPTU0gMHgwMDAzCi0jZGVmaW5lIFVVSURfUFJPVE9DT0xfT0JFWCAweDAwMDgKLSNkZWZpbmUgVVVJRF9QUk9UT0NPTF9CTkVQIDB4MDAwRgotI2RlZmluZSBVVUlEX1BST1RPQ09MX0hJRFAgMHgwMDExCi0jZGVmaW5lIFVVSURfUFJPVE9DT0xfQVZDVFAgMHgwMDE3Ci0jZGVmaW5lIFVVSURfUFJPVE9DT0xfQVZEVFAgMHgwMDE5Ci0jZGVmaW5lIFVVSURfUFJPVE9DT0xfTDJDQVAgMHgwMTAwCi0jZGVmaW5lIFVVSURfUFJPVE9DT0xfQVRUIDB4MDAwNwotCi0vKiBEZWZpbmUgY29tbW9uIDE2LWJpdCBzZXJ2aWNlIGNsYXNzIFVVSURzCi0qLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19TRVJWSUNFX0RJU0NPVkVSWV9TRVJWRVIgMFgxMDAwCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0JST1dTRV9HUk9VUF9ERVNDUklQVE9SIDBYMTAwMQotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQIDBYMTAwMgotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19TRVJJQUxfUE9SVCAwWDExMDEKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfTEFOX0FDQ0VTU19VU0lOR19QUFAgMFgxMTAyCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0RJQUxVUF9ORVRXT1JLSU5HIDBYMTEwMwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19JUk1DX1NZTkMgMFgxMTA0Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX09CRVhfT0JKRUNUX1BVU0ggMFgxMTA1Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX09CRVhfRklMRV9UUkFOU0ZFUiAwWDExMDYKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfSVJNQ19TWU5DX0NPTU1BTkQgMFgxMTA3Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0hFQURTRVQgMFgxMTA4Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0NPUkRMRVNTX1RFTEVQSE9OWSAwWDExMDkKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU09VUkNFIDBYMTEwQQotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19BVURJT19TSU5LIDBYMTEwQgotLyogQXVkaW8vVmlkZW8gQ29udHJvbCBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVCAwWDExMEMKLS8qIEFkdmFuY2VkIEF1ZGlvIERpc3RyaWJ1dGlvbiBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0FEVl9BVURJT19ESVNUUklCVVRJT04gMFgxMTBECi0vKiBBdWRpby9WaWRlbyBDb250cm9sIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0wgMFgxMTBFCi0vKiBBdWRpby9WaWRlbyBDb250cm9sIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNX0NUUkxfQ09OVFJPTCAwWDExMEYKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfSU5URVJDT00gMFgxMTEwCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0ZBWCAwWDExMTEKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVF9BVURJT19HQVRFV0FZIDBYMTExMgotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19XQVAgMFgxMTEzCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1dBUF9DTElFTlQgMFgxMTE0Ci0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1BBTlUgMFgxMTE1ICAgICAgICAgICAgICAgICAgICAvKiBQQU4gcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19OQVAgMFgxMTE2ICAgICAgICAgICAgICAgICAgICAgLyogUEFOIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfR04gMFgxMTE3ICAgICAgICAgICAgICAgICAgICAgIC8qIFBBTiBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0RJUkVDVF9QUklOVElORyAwWDExMTggICAgICAgICAvKiBCUFAgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19SRUZFUkVOQ0VfUFJJTlRJTkcgMFgxMTE5ICAgICAgLyogQlBQIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfSU1BR0lORyAwWDExMUEgICAgICAgICAgICAgICAgIC8qIEltYWdpbmcgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19JTUFHSU5HX1JFU1BPTkRFUiAwWDExMUIgICAgICAgLyogSW1hZ2luZyBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0lNQUdJTkdfQVVUT19BUkNISVZFIDBYMTExQyAgICAvKiBJbWFnaW5nIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfSU1BR0lOR19SRUZfT0JKRUNUUyAwWDExMUQgICAgIC8qIEltYWdpbmcgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUUgMFgxMTFFICAgICAgICAgICAgLyogSGFuZHNmcmVlIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFIDBYMTExRiAgICAgICAgICAgIC8qIEhhbmRzZnJlZSBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0RJUl9QUlRfUkVGX09CSl9TRVJWSUNFIDBYMTEyMCAvKiBCUFAgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19SRUZMRUNURURfVUkgMFgxMTIxICAgICAgICAgICAgLyogQlBQIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQkFTSUNfUFJJTlRJTkcgMFgxMTIyICAgICAgICAgIC8qIEJQUCBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1BSSU5USU5HX1NUQVRVUyAwWDExMjMgICAgICAgICAvKiBCUFAgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19IVU1BTl9JTlRFUkZBQ0UgMFgxMTI0ICAgICAgICAgLyogSElEIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfQ0FCTEVfUkVQTEFDRU1FTlQgMFgxMTI1ICAgICAgIC8qIEhDUlAgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19IQ1JQX1BSSU5UIDBYMTEyNiAgICAgICAgICAgICAgLyogSENSUCBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0hDUlBfU0NBTiAwWDExMjcgICAgICAgICAgICAgICAvKiBIQ1JQIHByb2ZpbGUgKi8KLS8qIENBUEkgTWVzc2FnZSBUcmFuc3BvcnQgUHJvdG9jb2wqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19DT01NT05fSVNETl9BQ0NFU1MgMFgxMTI4Ci0vKiBWaWRlbyBDb25mZXJlbmNpbmcgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19WSURFT19DT05GRVJFTkNJTkdfR1cgMFgxMTI5Ci0vKiBVbnJlc3RyaWN0ZWQgRGlnaXRhbCBJbmZvcm1hdGlvbiBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1VESV9NVCAwWDExMkEKLS8qIFVucmVzdHJpY3RlZCBEaWdpdGFsIEluZm9ybWF0aW9uIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfVURJX1RBIDBYMTEyQgotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19WQ1AgMFgxMTJDICAgICAgLyogVmlkZW8gQ29uZmVyZW5jaW5nIHByb2ZpbGUgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfU0FQIDBYMTEyRCAgICAgIC8qIFNJTSBBY2Nlc3MgcHJvZmlsZSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19QQkFQX1BDRSAwWDExMkUgLyogUGhvbmVib29rIEFjY2VzcyAtIFBDRSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19QQkFQX1BTRSAwWDExMkYgLyogUGhvbmVib29rIEFjY2VzcyAtIFBTRSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19QSE9ORV9BQ0NFU1MgMHgxMTMwCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFMgMHgxMTMxICAgICAgLyogSGVhZHNldCAtIEhTLCBmcm9tIEhTUCB2MS4yICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX1BOUF9JTkZPUk1BVElPTiAwWDEyMDAgLyogRGV2aWNlIElkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0dFTkVSSUNfTkVUV09SS0lORyAwWDEyMDEKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfR0VORVJJQ19GSUxFVFJBTlNGRVIgMFgxMjAyCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0dFTkVSSUNfQVVESU8gMFgxMjAzCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0dFTkVSSUNfVEVMRVBIT05ZIDBYMTIwNAotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19VUE5QX1NFUlZJQ0UgMFgxMjA1ICAgICAgIC8qIFVQTlBfU2VydmljZSBbRVNEUF0gKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfVVBOUF9JUF9TRVJWSUNFIDBYMTIwNiAgICAvKiBVUE5QX0lQX1NlcnZpY2UgW0VTRFBdICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0VTRFBfVVBOUF9JUF9QQU4gMFgxMzAwICAgLyogVVBOUF9JUF9QQU4gW0VTRFBdICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0VTRFBfVVBOUF9JUF9MQVAgMFgxMzAxICAgLyogVVBOUF9JUF9MQVAgW0VTRFBdICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0VTRFBfVVBOUF9JUF9MMkNBUCAwWDEzMDIgLyogVVBOUF9MMkNBUCBbRVNEUF0gKi8KLQotLyogVmlkZW8gRGlzdHJpYnV0aW9uIFByb2ZpbGUgKFZEUCkgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfVklERU9fU09VUkNFIDBYMTMwMwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19WSURFT19TSU5LIDBYMTMwNAotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19WSURFT19ESVNUUklCVVRJT04gMFgxMzA1Ci0KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfSERQX1BST0ZJTEUgMFgxNDAwICAgIC8qIEhlYWx0aCBEZXZpY2UgcHJvZmlsZSAoSERQKSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19IRFBfU09VUkNFIDBYMTQwMSAgICAgLyogSGVhbHRoIERldmljZSBwcm9maWxlIChIRFApICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0hEUF9TSU5LIDBYMTQwMiAgICAgICAvKiBIZWFsdGggRGV2aWNlIHByb2ZpbGUgKEhEUCkgKi8KLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfTUFQX1BST0ZJTEUgMFgxMTM0ICAgIC8qIE1BUCBwcm9maWxlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX01FU1NBR0VfQUNDRVNTIDBYMTEzMiAvKiBNZXNzYWdlIEFjY2VzcyBTZXJ2aWNlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX01FU1NBR0VfTk9USUZJQ0FUSU9OIFwKLSAgMFgxMTMzIC8qIE1lc3NhZ2UgTm90aWZpY2F0aW9uIFNlcnZpY2UgKi8KLQotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19HQVBfU0VSVkVSIDB4MTgwMAotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19HQVRUX1NFUlZFUiAweDE4MDEKLSNkZWZpbmUgVVVJRF9TRVJWQ0xBU1NfREVWSUNFX0lORk8gMHgxODBBICAgICAvKiBkZXZpY2UgaW5mbyBzZXJ2aWNlICovCi0jZGVmaW5lIFVVSURfU0VSVkNMQVNTX0xFX0hJRCAweDE4MTIgICAgIC8qICBISUQgb3ZlciBMRSAqLwotI2RlZmluZSBVVUlEX1NFUlZDTEFTU19TQ0FOX1BBUkFNIDB4MTgxMyAvKiBTY2FuIFBhcmFtZXRlciBzZXJ2aWNlICovCi0KLSNkZWZpbmUgVVVJRF9DT0RFQ19DVlNEIDB4MDAwMSAvKiBDVlNEICovCi0jZGVmaW5lIFVVSURfQ09ERUNfTVNCQyAweDAwMDIgLyogbVNCQyAqLwotCi0vKiBEZWZpbmUgYWxsIHRoZSAnRGVzY3JpcHRvciBUeXBlJyB2YWx1ZXMuCi0qLwotI2RlZmluZSBVSU5UX0RFU0NfVFlQRSAxCi0jZGVmaW5lIFRXT19DT01QX0lOVF9ERVNDX1RZUEUgMgotI2RlZmluZSBVVUlEX0RFU0NfVFlQRSAzCi0jZGVmaW5lIFRFWFRfU1RSX0RFU0NfVFlQRSA0Ci0jZGVmaW5lIEJPT0xFQU5fREVTQ19UWVBFIDUKLSNkZWZpbmUgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA2Ci0jZGVmaW5lIERBVEFfRUxFX0FMVF9ERVNDX1RZUEUgNwotI2RlZmluZSBVUkxfREVTQ19UWVBFIDgKLQotLyogRGVmaW5lIGFsbCB0aGUgIkRlc2NyaXB0b3IgU2l6ZSIgdmFsdWVzLgotKi8KLSNkZWZpbmUgU0laRV9PTkVfQllURSAwCi0jZGVmaW5lIFNJWkVfVFdPX0JZVEVTIDEKLSNkZWZpbmUgU0laRV9GT1VSX0JZVEVTIDIKLSNkZWZpbmUgU0laRV9FSUdIVF9CWVRFUyAzCi0jZGVmaW5lIFNJWkVfU0lYVEVFTl9CWVRFUyA0Ci0jZGVmaW5lIFNJWkVfSU5fTkVYVF9CWVRFIDUKLSNkZWZpbmUgU0laRV9JTl9ORVhUX1dPUkQgNgotI2RlZmluZSBTSVpFX0lOX05FWFRfTE9ORyA3Ci0KLS8qIExhbmd1YWdlIEVuY29kaW5nIENvbnN0YW50cyAqLwotI2RlZmluZSBMQU5HX0lEX0NPREVfRU5HTElTSCAoKHVpbnQxNl90KTB4NjU2ZSkgICAgIC8qICJlbiIgKi8KLSNkZWZpbmUgTEFOR19JRF9DSEFSX0VOQ09ERV9VVEY4ICgodWludDE2X3QpMHgwMDZhKSAvKiBVVEYtOCAqLwotCi0vKiBDb25zdGFudHMgdXNlZCBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5LiAgVGhlc2UgZGVmaW5lIG92ZXJsYXBwaW5nIGF0dHJpYnV0ZQotICogdmFsdWVzICovCi0jZGVmaW5lIEFUVFJfSURfREFUQV9TVE9SRVNfT1JfTkVUV09SSyAweDAzMDEKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL3NlY19oY2lfbGlua19pbnRlcmZhY2UuaCBiL3N0YWNrL2luY2x1ZGUvc2VjX2hjaV9saW5rX2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdjMDEyLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvc2VjX2hjaV9saW5rX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBUaGlzIGhlYWRlciBjb250YWlucyBmdW5jdGlvbnMgZm9yIEhDSUYtU2VjdXJpdHkgTWFuYWdlbWVudCB0byBpbnZva2UKLS8vCi0KLXZvaWQgYnRtX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZSh1aW50OF90KiBwKTsKLXZvaWQgYnRtX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZSh1aW50OF90KiBwKTsKLXZvaWQgYnRtX2lvX2NhcGFiaWxpdGllc19yZXEoY29uc3QgUmF3QWRkcmVzcyYgcCk7Ci12b2lkIGJ0bV9pb19jYXBhYmlsaXRpZXNfcnNwKHVpbnQ4X3QqIHApOwotdm9pZCBidG1fcHJvY19zcF9yZXFfZXZ0KHRCVE1fU1BfRVZUIGV2ZW50LCB1aW50OF90KiBwKTsKLXZvaWQgYnRtX3JlYWRfaW5xX3R4X3Bvd2VyX2NvbXBsZXRlKHVpbnQ4X3QqIHApOwotdm9pZCBidG1fcmVhZF9sb2NhbF9vb2JfY29tcGxldGUodWludDhfdCogcCk7Ci12b2lkIGJ0bV9yZW1fb29iX3JlcSh1aW50OF90KiBwKTsKLXZvaWQgYnRtX3NlY19hdXRoX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLXZvaWQgYnRtX3NlY19kaXNjb25uZWN0ZWQodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pOwotdm9pZCBidG1fc2VjX2VuY3J5cHRfY2hhbmdlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jcl9lbmFibGUpOwotdm9pZCBidG1fc2VjX2xpbmtfa2V5X25vdGlmaWNhdGlvbihjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgbGlua19rZXksIHVpbnQ4X3Qga2V5X3R5cGUpOwotdm9pZCBidG1fc2VjX2xpbmtfa2V5X3JlcXVlc3QodWludDhfdCogcF9ldmVudCk7Ci12b2lkIGJ0bV9zZWNfcGluX2NvZGVfcmVxdWVzdCh1aW50OF90KiBwX2V2ZW50KTsKLXZvaWQgYnRtX3NlY19ybXRfaG9zdF9zdXBwb3J0X2ZlYXRfZXZ0KHVpbnQ4X3QqIHApOwotdm9pZCBidG1fc2VjX3JtdF9uYW1lX3JlcXVlc3RfY29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJkX25hbWUsIHRIQ0lfU1RBVFVTIHN0YXR1cyk7Ci12b2lkIGJ0bV9zZWNfdXBkYXRlX2Nsb2NrX29mZnNldCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGNsb2NrX29mZnNldCk7Ci12b2lkIGJ0bV9zaW1wbGVfcGFpcl9jb21wbGV0ZSh1aW50OF90KiBwKTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvc2VjdXJpdHlfY2xpZW50X2NhbGxiYWNrcy5oIGIvc3RhY2svaW5jbHVkZS9zZWN1cml0eV9jbGllbnRfY2FsbGJhY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTlmZjEuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9zZWN1cml0eV9jbGllbnRfY2FsbGJhY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTZWN1cml0eSBNYW5hZ2VyIENhbGxiYWNrIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdXRob3JpemUgZGV2aWNlIGZvciBzZXJ2aWNlLiAgUGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICBTZXJ2aWNlIElkIChOVUxMIC0gdW5rbm93biBzZXJ2aWNlIG9yIHVudXNlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQlRNX1NFQ19TRVJWSUNFX05BTUVfTEVOIHNldCB0byAwXSkKLSAqLwotdHlwZWRlZiB1aW50OF90KHRCVE1fQVVUSE9SSVpFX0NBTExCQUNLKSh1aW50OF90IHNlcnZpY2VfaWQpOwotCi0vKiBHZXQgUElOIGZvciB0aGUgY29ubmVjdGlvbi4gIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqICAgICAgICAgICAgICBEZXZpY2UgQ2xhc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgQkQgTmFtZSBvZiByZW1vdGUKLSAqICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIG1pbmltdW0gcGluIGNvZGUgbGVuZ3RoIHRvIGJlIDE2IGRpZ2l0cwotICovCi10eXBlZGVmIHVpbnQ4X3QodEJUTV9QSU5fQ0FMTEJBQ0spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fQkRfTkFNRSBiZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1pbl8xNl9kaWdpdCk7Ci0KLS8qIE5ldyBMaW5rIEtleSBmb3IgdGhlIGNvbm5lY3Rpb24uICBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgTGluayBLZXkKLSAqICAgICAgICAgICAgICBLZXkgVHlwZTogQ29tYmluYXRpb24sIExvY2FsIFVuaXQsIG9yIFJlbW90ZSBVbml0Ci0gKi8KLXR5cGVkZWYgdWludDhfdCh0QlRNX0xJTktfS0VZX0NBTExCQUNLKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CRF9OQU1FIGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGlua0tleSYga2V5LCB1aW50OF90IGtleV90eXBlKTsKLQotLyogUmVtb3RlIE5hbWUgUmVzb2x2ZWQuICBQYXJhbWV0ZXJzIGFyZQotICogICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgQkQgTmFtZSBvZiByZW1vdGUKLSAqLwotdHlwZWRlZiB2b2lkKHRCVE1fUk1UX05BTUVfQ0FMTEJBQ0spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JEX05BTUUgYmRfbmFtZSk7Ci0KLS8qIEF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlIGZvciB0aGUgY29ubmVjdGlvbi4gIFBhcmFtZXRlcnMgYXJlCi0gKiAgICAgICAgICAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqICAgICAgICAgICAgICBEZXZpY2UgQ2xhc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgQkQgTmFtZSBvZiByZW1vdGUKLSAqCi0gKi8KLXR5cGVkZWYgdm9pZCh0QlRNX0FVVEhfQ09NUExFVEVfQ0FMTEJBQ0spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfQ0xBU1MgZGV2X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CRF9OQU1FIGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JFQVNPTiByZWFzb24pOwotCi1zdHJ1Y3QgdEJUTV9BUFBMX0lORk8gewotICB0QlRNX1BJTl9DQUxMQkFDSyogcF9waW5fY2FsbGJhY2t7bnVsbHB0cn07Ci0gIHRCVE1fTElOS19LRVlfQ0FMTEJBQ0sqIHBfbGlua19rZXlfY2FsbGJhY2t7bnVsbHB0cn07Ci0gIHRCVE1fQVVUSF9DT01QTEVURV9DQUxMQkFDSyogcF9hdXRoX2NvbXBsZXRlX2NhbGxiYWNre251bGxwdHJ9OwotICB0QlRNX0JPTkRfQ0FOQ0VMX0NNUExfQ0FMTEJBQ0sqIHBfYm9uZF9jYW5jZWxfY21wbF9jYWxsYmFja3tudWxscHRyfTsKLSAgdEJUTV9TUF9DQUxMQkFDSyogcF9zcF9jYWxsYmFja3tudWxscHRyfTsKLSAgdEJUTV9MRV9DQUxMQkFDSyogcF9sZV9jYWxsYmFja3tudWxscHRyfTsKLSAgdEJUTV9MRV9LRVlfQ0FMTEJBQ0sqIHBfbGVfa2V5X2NhbGxiYWNre251bGxwdHJ9OwotfTsKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvc21wX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9zbXBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMTI3NjEuLjAwMDAwMDAKLS0tIGEvc3RhY2svaW5jbHVkZS9zbXBfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFNNUCBBUEkgZnVuY3Rpb24gZXh0ZXJuYWwgZGVmaW5pdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgU01QX0FQSV9ICi0jZGVmaW5lIFNNUF9BUElfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgInNtcF9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQVBJIG9mIFNNUCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX0luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFNNUCB1bml0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBTTVBfSW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBTTVAuICBJZiBjYWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDB4RkYsIGl0IHNpbXBseSByZXR1cm5zIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG5ldyBvciBjdXJyZW50IHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB1aW50OF90IFNNUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlciBmb3IgdGhlIFNNUCBzZXJ2aWNlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBTTVBfUmVnaXN0ZXIodFNNUF9DQUxMQkFDSyogcF9jYmFjayk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTTVBfUGFpcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgYSBTTVAgcGFpcmluZy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFNNUF9TVEFSVEVEIGlmIGJvbmQgc3RhcnRlZCwgZWxzZSBvdGhlcndpc2UgZXhjZXB0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdFNNUF9TVEFUVVMgU01QX1BhaXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTTVBfQlJfUGFpcldpdGgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IGEgU01QIHBhaXJpbmcgb3ZlciBCUi9FRFIuCi0gKgotICogUmV0dXJucyAgICAgICAgICBTTVBfU1RBUlRFRCBpZiBwYWlyaW5nIHN0YXJ0ZWQsIG90aGVyd2lzZSB0aGUgcmVhc29uIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgZmFpbHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRTTVBfU1RBVFVTIFNNUF9CUl9QYWlyV2l0aChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9QYWlyQ2FuY2VsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjYW5jZWwgYSBTTVAgcGFpcmluZy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgLSBwYWlyaW5nIGNhbmNlbGxlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gYm9vbCBTTVBfUGFpckNhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9TZWN1cml0eUdyYW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBncmFudCBzZWN1cml0eSBwcm9jZXNzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAtIHBlZXIgZGV2aWNlIGJkIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIHJlcyAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBTTVBfUkVQRUFURURfQVRURU1QVFMgaXMgdG9vIG1hbnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBTTVBfU2VjdXJpdHlHcmFudChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0U01QX1NUQVRVUyByZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX1Bhc3NrZXlSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgU2VjdXJpdHkgTWFuYWdlciBzdWJtaXR0ZWQKLSAqICAgICAgICAgICAgICAgICAgUGFzc2tleSByZXF1ZXN0IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgIC0gQWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciB3aGljaCBQSU4gd2FzIHJlcXVlc3RlZAotICogICAgICAgICAgICAgICAgICByZXMgICAgICAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIFNNUF9TVUNDRVNTIGlmIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgcGFzc2tleSAgLSBudW1lcmljIHZhbHVlIGluIHRoZSByYW5nZSBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9NSU5fUEFTU0tFWV9WQUwoMCkgLQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9NQVhfUEFTU0tFWV9WQUwoOTk5OTk5KDB4RjQyM0YpKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgU01QX1Bhc3NrZXlSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc2tleSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTTVBfQ29uZmlybVJlcGx5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBTZWN1cml0eSBNYW5hZ2VyIHN1Ym1pdHRlZAotICogICAgICAgICAgICAgICAgICBudW1lcmljIGNvbXBhcmlzb24gcmVxdWVzdCB0byB0aGUgYXBwbGljYXRpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBiZF9hZGRyICAgICAgLSBBZGRyZXNzIG9mIHRoZSBkZXZpY2Ugd2l0aCB3aGljaCBudW1lcmljCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24gd2FzIHJlcXVlc3RlZAotICogICAgICAgICAgICAgICAgICByZXMgICAgICAgICAgLSBjb21wYXJpc29uIHJlc3VsdCBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIFNNUF9Db25maXJtUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX09vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBTTVBfT09CX1JFUV9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAgICAgIC0gU00gUmFuZG9taXplciAgQy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgU01QX09vYkRhdGFSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0U01QX1NUQVRVUyByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuLCB1aW50OF90KiBwX2RhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX1NlY3VyZUNvbm5lY3Rpb25Pb2JEYXRhUmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb3ZpZGUgdGhlIFNDIE9PQiBkYXRhIGZvcgotICogICAgICAgICAgICAgICAgICBTTVAgaW4gcmVzcG9uc2UgdG8gU01QX1NDX09PQl9SRVFfRVZUCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX2RhdGEgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRhdGEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgU01QX1NlY3VyZUNvbm5lY3Rpb25Pb2JEYXRhUmVwbHkodWludDhfdCogcF9kYXRhKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9DckxvY1NjT29iRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgYSBwdWJsaWMga2V5IHRvIGJlCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBhIHJlbW90ZSBkZXZpY2UgdmlhIGFuIE91dCBvZiBCYW5kIHRyYW5zcG9ydAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdm9pZCBTTVBfQ3JMb2NTY09vYkRhdGEoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9DbGVhckxvY1NjT29iRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2xlYXIgb3V0IHRoZSBPT0Igc3RvcmVkIGxvY2FsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIFNNUF9DbGVhckxvY1NjT29iRGF0YSgpOwotCi0vLyBDYWxsZWQgd2hlbiBMVEsgcmVxdWVzdCBpcyByZWNlaXZlZCBmcm9tIGNvbnRyb2xsZXIuCi1leHRlcm4gYm9vbCBzbXBfcHJvY19sdGtfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZGEpOwotCi0vLyBDYWxsZWQgd2hlbiBsaW5rIGlzIGVuY3J5cHRlZCBhbmQgbm90aWZpZWQgdG8gcGVyaXBoZXJhbCBkZXZpY2UuCi0vLyBQcm9jZWVkIHRvIHNlbmQgTFRLLCBESVYgYW5kIEVSIHRvIGNlbnRyYWwgaWYgYm9uZGluZyB0aGUgZGV2aWNlcy4KLWV4dGVybiB2b2lkIHNtcF9saW5rX2VuY3J5cHRlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QgZW5jcl9lbmFibGUpOwotCi0jZW5kaWYgLyogU01QX0FQSV9IICovCmRpZmYgLS1naXQgYS9zdGFjay9pbmNsdWRlL3NtcF9hcGlfdHlwZXMuaCBiL3N0YWNrL2luY2x1ZGUvc21wX2FwaV90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFlOWY0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvc21wX2FwaV90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgU01QX0FQSV9UWVBFU19ICi0jZGVmaW5lIFNNUF9BUElfVFlQRVNfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIiAgLy8gTXVzdCBiZSBmaXJzdCB0byBkZWZpbmUgYnVpbGQgY29uZmlndXJhdGlvbgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyogU01QIGNvbW1hbmQgY29kZSAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIFNNUF9PUENPREVfUEFJUklOR19SRVEgPSAweDAxLAotICBTTVBfT1BDT0RFX1BBSVJJTkdfUlNQID0gMHgwMiwKLSAgU01QX09QQ09ERV9DT05GSVJNID0gMHgwMywKLSAgU01QX09QQ09ERV9SQU5EID0gMHgwNCwKLSAgU01QX09QQ09ERV9QQUlSSU5HX0ZBSUxFRCA9IDB4MDUsCi0gIFNNUF9PUENPREVfRU5DUllQVF9JTkZPID0gMHgwNiwKLSAgU01QX09QQ09ERV9DRU5UUkFMX0lEID0gMHgwNywKLSAgU01QX09QQ09ERV9JREVOVElUWV9JTkZPID0gMHgwOCwKLSAgU01QX09QQ09ERV9JRF9BRERSID0gMHgwOSwKLSAgU01QX09QQ09ERV9TSUdOX0lORk8gPSAweDBBLAotICBTTVBfT1BDT0RFX1NFQ19SRVEgPSAweDBCLAotICBTTVBfT1BDT0RFX1BBSVJfUFVCTElDX0tFWSA9IDB4MEMsCi0gIFNNUF9PUENPREVfUEFJUl9ESEtFWV9DSEVDSyA9IDB4MEQsCi0gIFNNUF9PUENPREVfUEFJUl9LRVlQUl9OT1RJRiA9IDB4MEUsCi0gIFNNUF9PUENPREVfTUFYID0gU01QX09QQ09ERV9QQUlSX0tFWVBSX05PVElGLAotICBTTVBfT1BDT0RFX01JTiA9IFNNUF9PUENPREVfUEFJUklOR19SRVEsCi0gIC8vIE5PVEU6IEZvciBzb21lIHJlYXNvbiB0aGlzIGlzIG91dHNpZGUgdGhlIE1BWC9NSU4gdmFsdWVzCi0gIFNNUF9PUENPREVfUEFJUl9DT01NSVRNID0gMHgwRiwKLX0gdFNNUF9PUENPREU7Ci0KLSNkZWZpbmUgQ0FTRV9SRVRVUk5fVEVYVChjb2RlKSBcCi0gIGNhc2UgY29kZTogICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAjY29kZQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgc21wX29wY29kZV90ZXh0KGNvbnN0IHRTTVBfT1BDT0RFJiBvcGNvZGUpIHsKLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNNUF9PUENPREVfUEFJUklOR19SRVEpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9QQUlSSU5HX1JTUCk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTTVBfT1BDT0RFX0NPTkZJUk0pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9SQU5EKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNNUF9PUENPREVfUEFJUklOR19GQUlMRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9FTkNSWVBUX0lORk8pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9DRU5UUkFMX0lEKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNNUF9PUENPREVfSURFTlRJVFlfSU5GTyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTTVBfT1BDT0RFX0lEX0FERFIpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9TSUdOX0lORk8pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9TRUNfUkVRKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNNUF9PUENPREVfUEFJUl9QVUJMSUNfS0VZKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKFNNUF9PUENPREVfUEFJUl9ESEtFWV9DSEVDSyk7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChTTVBfT1BDT0RFX1BBSVJfS0VZUFJfTk9USUYpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoU01QX09QQ09ERV9QQUlSX0NPTU1JVE0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV046JWhodSIsIG9wY29kZSk7Ci0gIH0KLX0KLSN1bmRlZiBDQVNFX1JFVFVSTl9URVhUCi0KLS8qIFNNUCBldmVudCB0eXBlICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgU01QX0VWVF9OT05FID0gMCwgICAgICAgICAgIC8qIERlZmF1bHQgbm8gZXZlbnQgKi8KLSAgU01QX0lPX0NBUF9SRVFfRVZUID0gMSwgICAgIC8qIElPIGNhcGFiaWxpdHkgcmVxdWVzdCBldmVudCAqLwotICBTTVBfU0VDX1JFUVVFU1RfRVZUID0gMiwgICAgLyogU01QIHBhaXJpbmcgcmVxdWVzdCAqLwotICBTTVBfUEFTU0tFWV9OT1RJRl9FVlQgPSAzLCAgLyogcGFzc2tleSBub3RpZmljYXRpb24gZXZlbnQgKi8KLSAgU01QX1BBU1NLRVlfUkVRX0VWVCA9IDQsICAgIC8qIHBhc3NrZXkgcmVxdWVzdCBldmVudCAqLwotICBTTVBfT09CX1JFUV9FVlQgPSA1LCAgICAgICAgLyogT09CIHJlcXVlc3QgZXZlbnQgKi8KLSAgU01QX05DX1JFUV9FVlQgPSA2LCAgICAgICAgIC8qIE51bWVyaWMgQ29tcGFyaXNvbiByZXF1ZXN0IGV2ZW50ICovCi0gIFNNUF9DT01QTFRfRVZUID0gNywgICAgICAgICAvKiBTTVAgY29tcGxldGUgZXZlbnQgKi8KLSAgU01QX1BFRVJfS0VZUFJfTk9UX0VWVCA9IDgsIC8qIFBlZXIga2V5cHJlc3Mgbm90aWZpY2F0aW9uICovCi0KLSAgLyogU0MgT09CIHJlcXVlc3QgZXZlbnQgKGJvdGggbG9jYWwgYW5kIHBlZXIgT09CIGRhdGEgY2FuIGJlIGV4cGVjdGVkIGluCi0gICAqIHJlc3BvbnNlKSAqLwotICBTTVBfU0NfT09CX1JFUV9FVlQgPSA5LAotICAvKiBTQyBPT0IgbG9jYWwgZGF0YSBzZXQgaXMgY3JlYXRlZCAoYXMgcmVzdWx0IG9mIFNNUF9DckxvY1NjT29iRGF0YSguLi4pKSAqLwotICBTTVBfU0NfTE9DX09PQl9EQVRBX1VQX0VWVCA9IDEwLAotICBTTVBfVU5VU0VEMTEgPSAxMSwKLSAgU01QX0JSX0tFWVNfUkVRX0VWVCA9IDEyLCAvKiBTTVAgb3ZlciBCUiBrZXlzIHJlcXVlc3QgZXZlbnQgKi8KLSAgU01QX1VOVVNFRDEzID0gMTMsCi0gIFNNUF9DT05TRU5UX1JFUV9FVlQgPSAxNCwgLyogQ29uc2VudCByZXF1ZXN0IGV2ZW50ICovCi19IHRTTVBfRVZUOwotCi0vKiBwYWlyaW5nIGZhaWx1cmUgcmVhc29uIGNvZGUgKi8KLXR5cGVkZWYgZW51bSA6IHVpbnQ4X3QgewotICBTTVBfU1VDQ0VTUyA9IDAsCi0gIFNNUF9QQVNTS0VZX0VOVFJZX0ZBSUwgPSAweDAxLAotICBTTVBfT09CX0ZBSUwgPSAweDAyLAotICBTTVBfUEFJUl9BVVRIX0ZBSUwgPSAweDAzLAotICBTTVBfQ09ORklSTV9WQUxVRV9FUlIgPSAweDA0LAotICBTTVBfUEFJUl9OT1RfU1VQUE9SVCA9IDB4MDUsCi0gIFNNUF9FTkNfS0VZX1NJWkUgPSAweDA2LAotICBTTVBfSU5WQUxJRF9DTUQgPSAweDA3LAotICBTTVBfUEFJUl9GQUlMX1VOS05PV04gPSAweDA4LAotICBTTVBfUkVQRUFURURfQVRURU1QVFMgPSAweDA5LAotICBTTVBfSU5WQUxJRF9QQVJBTUVURVJTID0gMHgwQSwKLSAgU01QX0RIS0VZX0NIS19GQUlMID0gMHgwQiwKLSAgU01QX05VTUVSSUNfQ09NUEFSX0ZBSUwgPSAweDBDLAotICBTTVBfQlJfUEFSSU5HX0lOX1BST0dSID0gMHgwRCwKLSAgU01QX1hUUkFOU19ERVJJVkVfTk9UX0FMTE9XID0gMHgwRSwKLSAgU01QX01BWF9GQUlMX1JTTl9QRVJfU1BFQyA9IFNNUF9YVFJBTlNfREVSSVZFX05PVF9BTExPVywKLQotICAvKiBzZWxmIGRlZmluZWQgZXJyb3IgY29kZSAqLwotICBTTVBfUEFJUl9JTlRFUk5BTF9FUlIgPSAoU01QX01BWF9GQUlMX1JTTl9QRVJfU1BFQyArIDB4MDEpLCAvKiAweDBGICovCi0KLSAgLyogVW5rbm93biBJTyBjYXBhYmlsaXR5LCB1bmFibGUgdG8gZGVjaWRlIGFzc29jaWF0aW9uIG1vZGVsICovCi0gIFNNUF9VTktOT1dOX0lPX0NBUCA9IChTTVBfTUFYX0ZBSUxfUlNOX1BFUl9TUEVDICsgMHgwMiksIC8qIDB4MTAgKi8KLQotICBTTVBfQlVTWSA9IChTTVBfTUFYX0ZBSUxfUlNOX1BFUl9TUEVDICsgMHgwNSksICAgICAgICAvKiAweDEzICovCi0gIFNNUF9FTkNfRkFJTCA9IChTTVBfTUFYX0ZBSUxfUlNOX1BFUl9TUEVDICsgMHgwNiksICAgIC8qIDB4MTQgKi8KLSAgU01QX1NUQVJURUQgPSAoU01QX01BWF9GQUlMX1JTTl9QRVJfU1BFQyArIDB4MDcpLCAgICAgLyogMHgxNSAqLwotICBTTVBfUlNQX1RJTUVPVVQgPSAoU01QX01BWF9GQUlMX1JTTl9QRVJfU1BFQyArIDB4MDgpLCAvKiAweDE2ICovCi0KLSAgLyogVW5zcGVjaWZpZWQgZmFpbHVyZSByZWFzb24gKi8KLSAgU01QX0ZBSUwgPSAoU01QX01BWF9GQUlMX1JTTl9QRVJfU1BFQyArIDB4MEEpLCAvKiAweDE4ICovCi0KLSAgU01QX0NPTk5fVE9VVCA9IChTTVBfTUFYX0ZBSUxfUlNOX1BFUl9TUEVDICsgMHgwQiksIC8qIDB4MTkgKi8KLX0gdFNNUF9TVEFUVVM7Ci0KLS8qIERldmljZSBJTyBjYXBhYmlsaXR5ICovCi0jZGVmaW5lIFNNUF9JT19DQVBfSU8gQlRNX0lPX0NBUF9JTyAgICAgICAgIC8qIERpc3BsYXlZZXNObyAqLwotI2RlZmluZSBTTVBfSU9fQ0FQX0tCRElTUCBCVE1fSU9fQ0FQX0tCRElTUCAvKiBLZXlib2FyZCBEaXNwbGF5ICovCi0jZGVmaW5lIFNNUF9JT19DQVBfTUFYIEJUTV9JT19DQVBfTUFYCi10eXBlZGVmIHVpbnQ4X3QgdFNNUF9JT19DQVA7Ci0KLS8qIE9PQiBkYXRhIHByZXNlbnQgb3Igbm90ICovCi1lbnVtIHsgU01QX09PQl9OT05FLCBTTVBfT09CX1BSRVNFTlQsIFNNUF9PT0JfVU5LTk9XTiB9OwotdHlwZWRlZiB1aW50OF90IHRTTVBfT09CX0ZMQUc7Ci0KLS8qIHR5cGUgb2YgT09CIGRhdGEgcmVxdWlyZWQgZnJvbSBhcHBsaWNhdGlvbiAqLwotZW51bSB7IFNNUF9PT0JfSU5WQUxJRF9UWVBFLCBTTVBfT09CX1BFRVIsIFNNUF9PT0JfTE9DQUwsIFNNUF9PT0JfQk9USCB9OwotdHlwZWRlZiB1aW50OF90IHRTTVBfT09CX0RBVEFfVFlQRTsKLQotZW51bSA6IHVpbnQ4X3QgewotICBTTVBfQVVUSF9OT19CT05EID0gMHgwMCwKLSAgLyogbm8gTUlUTSwgTm8gQm9uZGluZywgZW5jcnlwdGlvbiBvbmx5ICovCi0gIFNNUF9BVVRIX05CX0VOQ19PTkxZID0gMHgwMCwgIC8vKFNNUF9BVVRIX01BU0sgfCBCVE1fQVVUSF9TUF9OTykKLSAgU01QX0FVVEhfQk9ORCA9ICgxdSA8PCAwKSwKLSAgU01QX0FVVEhfVU5VU0VEID0gKDF1IDw8IDEpLAotICAvKiBTTVAgQXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnQgKi8KLSAgU01QX0FVVEhfWU5fQklUID0gKDF1IDw8IDIpLAotICBTTVBfU0NfU1VQUE9SVF9CSVQgPSAoMXUgPDwgMyksCi0gIFNNUF9LUF9TVVBQT1JUX0JJVCA9ICgxdSA8PCA0KSwKLSAgU01QX0g3X1NVUFBPUlRfQklUID0gKDF1IDw8IDUpLAotfTsKLQotI2RlZmluZSBTTVBfQVVUSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKFNNUF9BVVRIX0JPTkQgfCBTTVBfQVVUSF9ZTl9CSVQgfCBTTVBfU0NfU1VQUE9SVF9CSVQgfCBTTVBfS1BfU1VQUE9SVF9CSVQgfCBcCi0gICBTTVBfSDdfU1VQUE9SVF9CSVQpCi0KLS8qIFNlY3VyZSBDb25uZWN0aW9ucywgbm8gTUlUTSwgbm8gQm9uZGluZyAqLwotI2RlZmluZSBTTVBfQVVUSF9TQ19FTkNfT05MWSAoU01QX0g3X1NVUFBPUlRfQklUIHwgU01QX1NDX1NVUFBPUlRfQklUKQotCi0vKiBTZWN1cmUgQ29ubmVjdGlvbnMsIE1JVE0sIEJvbmRpbmcgKi8KLSNkZWZpbmUgU01QX0FVVEhfU0NfTUlUTV9HQiBcCi0gIChTTVBfSDdfU1VQUE9SVF9CSVQgfCBTTVBfU0NfU1VQUE9SVF9CSVQgfCBTTVBfQVVUSF9ZTl9CSVQgfCBTTVBfQVVUSF9CT05EKQotCi10eXBlZGVmIHVpbnQ4X3QgdFNNUF9BVVRIX1JFUTsKLQotI2RlZmluZSBTTVBfU0VDX05PTkUgMAotI2RlZmluZSBTTVBfU0VDX1VOQVVUSEVOVElDQVRFICgxIDw8IDApCi0jZGVmaW5lIFNNUF9TRUNfQVVUSEVOVElDQVRFRCAoMSA8PCAyKQotdHlwZWRlZiB1aW50OF90IHRTTVBfU0VDX0xFVkVMOwotCi0vKiBNYXhpbXVtIEVuY3J5cHRpb24gS2V5IFNpemUgcmFuZ2UgKi8KLSNkZWZpbmUgU01QX0VOQ1JfS0VZX1NJWkVfTUlOIDcKLSNkZWZpbmUgU01QX0VOQ1JfS0VZX1NJWkVfTUFYIDE2Ci0KLS8qIFNNUCBrZXkgdHlwZXMgKi8KLWVudW0gdFNNUF9LRVlTX0JJVE1BU0sgOiB1aW50OF90IHsKLSAgU01QX1NFQ19LRVlfVFlQRV9FTkMgPSAoMSA8PCAwKSwgIC8qIGVuY3J5cHRpb24ga2V5ICovCi0gIFNNUF9TRUNfS0VZX1RZUEVfSUQgPSAoMSA8PCAxKSwgICAvKiBpZGVudGl0eSBrZXkgKi8KLSAgU01QX1NFQ19LRVlfVFlQRV9DU1JLID0gKDEgPDwgMiksIC8qIHBlcmlwaGVyYWwgQ1NSSyAqLwotICBTTVBfU0VDX0tFWV9UWVBFX0xLID0gKDEgPDwgMyksICAgLyogQlIvRURSIGxpbmsga2V5ICovCi19OwotdHlwZWRlZiB1aW50OF90IHRTTVBfS0VZUzsKLQotY29uc3RleHByIHRTTVBfS0VZUyBTTVBfQlJfU0VDX0RFRkFVTFRfS0VZID0KLSAgICAoU01QX1NFQ19LRVlfVFlQRV9FTkMgfCBTTVBfU0VDX0tFWV9UWVBFX0lEIHwgU01QX1NFQ19LRVlfVFlQRV9DU1JLKTsKLQotLyogZGVmYXVsdCBzZWN1cml0eSBrZXkgZGlzdHJpYnV0aW9uIHZhbHVlICovCi1jb25zdGV4cHIgdFNNUF9LRVlTIFNNUF9TRUNfREVGQVVMVF9LRVkgPQotICAgIChTTVBfU0VDX0tFWV9UWVBFX0VOQyB8IFNNUF9TRUNfS0VZX1RZUEVfSUQgfCBTTVBfU0VDX0tFWV9UWVBFX0NTUksgfAotICAgICBTTVBfU0VDX0tFWV9UWVBFX0xLKTsKLQotI2RlZmluZSBTTVBfU0NfS0VZX09VVF9PRl9SQU5HRSA1IC8qIG91dCBvZiByYW5nZSAqLwotdHlwZWRlZiB1aW50OF90IHRTTVBfU0NfS0VZX1RZUEU7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgQlRNX1NQX0lPX1JFUV9FVlQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdFNNUF9JT19DQVAgaW9fY2FwOyAgICAgLyogbG9jYWwgSU8gY2FwYWJpbGl0aWVzICovCi0gIHRTTVBfT09CX0ZMQUcgb29iX2RhdGE7IC8qIE9PQiBkYXRhIHByZXNlbnQgKGxvY2FsbHkpIGZvciB0aGUgcGVlciBkZXZpY2UgKi8KLSAgdFNNUF9BVVRIX1JFUSBhdXRoX3JlcTsgLyogQXV0aGVudGljYXRpb24gcmVxdWlyZWQgKGZvciBsb2NhbCBkZXZpY2UpICovCi0gIHVpbnQ4X3QgbWF4X2tleV9zaXplOyAgIC8qIG1heCBlbmNyeXB0aW9uIGtleSBzaXplICovCi0gIHRTTVBfS0VZUyBpbml0X2tleXM7ICAgIC8qIGluaXRpYXRvciBrZXlzIHRvIGJlIGRpc3RyaWJ1dGVkICovCi0gIHRTTVBfS0VZUyByZXNwX2tleXM7ICAgIC8qIHJlc3BvbmRlciBrZXlzICovCi19IHRTTVBfSU9fUkVROwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRTTVBfU1RBVFVTIHJlYXNvbjsKLSAgdFNNUF9TRUNfTEVWRUwgc2VjX2xldmVsOwotICBib29sIGlzX3BhaXJfY2FuY2VsOwotICBib29sIHNtcF9vdmVyX2JyOwotfSB0U01QX0NNUEw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgQlRfT0NURVQzMiB4OwotICBCVF9PQ1RFVDMyIHk7Ci19IHRTTVBfUFVCTElDX0tFWTsKLQotLyogdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmZvIHNlbnQgdG8gdGhlIHBlZXIgdmlhIE9PQiBpbnRlcmZhY2UgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBwcmVzZW50OwotICBPY3RldDE2IHJhbmRvbWl6ZXI7Ci0gIE9jdGV0MTYgY29tbWl0bWVudDsKLQotICB0QkxFX0JEX0FERFIgYWRkcl9zZW50X3RvOwotICBCVF9PQ1RFVDMyIHByaXZhdGVfa2V5X3VzZWQ7IC8qIGlzIHVzZWQgdG8gY2FsY3VsYXRlOiAqLwotICAvKiBwdWJsX2tleV91c2VkID0gUC0yNTYocHJpdmF0ZV9rZXlfdXNlZCwgY3VydmVfcDI1Ni5HKSAtIHNlbmQgaXQgdG8gdGhlICovCi0gIC8qIG90aGVyIHNpZGUgKi8KLSAgLyogZGhrZXkgPSBQLTI1Nihwcml2YXRlX2tleV91c2VkLCBwdWJsIGtleSByY3ZkIGZyb20gdGhlIG90aGVyIHNpZGUpICovCi0gIHRTTVBfUFVCTElDX0tFWSBwdWJsX2tleV91c2VkOyAvKiBQLTI1Nihwcml2YXRlX2tleV91c2VkLCBjdXJ2ZV9wMjU2LkcpICovCi19IHRTTVBfTE9DX09PQl9EQVRBOwotCi0vKiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGluZm8gcmVjZWl2ZWQgZnJvbSB0aGUgcGVlciB2aWEgT09CIGludGVyZmFjZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIHByZXNlbnQ7Ci0gIE9jdGV0MTYgcmFuZG9taXplcjsKLSAgT2N0ZXQxNiBjb21taXRtZW50OwotICB0QkxFX0JEX0FERFIgYWRkcl9yY3ZkX2Zyb207Ci19IHRTTVBfUEVFUl9PT0JfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0U01QX0xPQ19PT0JfREFUQSBsb2Nfb29iX2RhdGE7Ci0gIHRTTVBfUEVFUl9PT0JfREFUQSBwZWVyX29vYl9kYXRhOwotfSB0U01QX1NDX09PQl9EQVRBOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdWludDMyX3QgcGFzc2tleTsKLSAgdFNNUF9JT19SRVEgaW9fcmVxOyAvKiBJTyByZXF1ZXN0ICovCi0gIHRTTVBfQ01QTCBjbXBsdDsKLSAgdFNNUF9PT0JfREFUQV9UWVBFIHJlcV9vb2JfdHlwZTsKLSAgdFNNUF9MT0NfT09CX0RBVEEgbG9jX29vYl9kYXRhOwotfSB0U01QX0VWVF9EQVRBOwotCi0vKiBBRVMgRW5jcnlwdGlvbiBvdXRwdXQgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBzdGF0dXM7Ci0gIHVpbnQ4X3QgcGFyYW1fbGVuOwotICB1aW50MTZfdCBvcGNvZGU7Ci0gIHVpbnQ4X3QgcGFyYW1fYnVmW09DVEVUMTZfTEVOXTsKLX0gdFNNUF9FTkM7Ci0KLS8qIFNlY3VyaXR5IE1hbmFnZXIgZXZlbnRzIC0gQ2FsbGVkIGJ5IHRoZSBzdGFjayB3aGVuIFNlY3VyaXR5IE1hbmFnZXIgcmVsYXRlZAotICogZXZlbnRzIG9jY3VyLiovCi10eXBlZGVmIHRCVE1fU1RBVFVTKHRTTVBfQ0FMTEJBQ0spKHRTTVBfRVZUIGV2ZW50LCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0VWVF9EQVRBKiBwX2RhdGEpOwotCi0jZW5kaWYgIC8vIFNNUF9BUElfVFlQRVNfSApkaWZmIC0tZ2l0IGEvc3RhY2svaW5jbHVkZS9zcnZjX2FwaS5oIGIvc3RhY2svaW5jbHVkZS9zcnZjX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2M4YzdmLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvc3J2Y19hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFNSVkNfRElTX0FQSV9ICi0jZGVmaW5lIFNSVkNfRElTX0FQSV9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJnYXR0ZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgRElTX1NVQ0NFU1MgR0FUVF9TVUNDRVNTCi0jZGVmaW5lIERJU19JTExFR0FMX1BBUkFNIEdBVFRfSUxMRUdBTF9QQVJBTUVURVIKLSNkZWZpbmUgRElTX05PX1JFU09VUkNFUyBHQVRUX05PX1JFU09VUkNFUwotdHlwZWRlZiB1aW50OF90IHRESVNfU1RBVFVTOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBEYXRhIHN0cnVjdHVyZSBmb3IgRElTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBESVNfQVRUUl9TWVNfSURfQklUIDB4MDAwMQotI2RlZmluZSBESVNfQVRUUl9NT0RFTF9OVU1fQklUIDB4MDAwMgotI2RlZmluZSBESVNfQVRUUl9TRVJJQUxfTlVNX0JJVCAweDAwMDQKLSNkZWZpbmUgRElTX0FUVFJfRldfTlVNX0JJVCAweDAwMDgKLSNkZWZpbmUgRElTX0FUVFJfSFdfTlVNX0JJVCAweDAwMTAKLSNkZWZpbmUgRElTX0FUVFJfU1dfTlVNX0JJVCAweDAwMjAKLSNkZWZpbmUgRElTX0FUVFJfTUFOVV9OQU1FX0JJVCAweDAwNDAKLSNkZWZpbmUgRElTX0FUVFJfSUVFRV9EQVRBX0JJVCAweDAwODAKLSNkZWZpbmUgRElTX0FUVFJfUE5QX0lEX0JJVCAweDAxMDAKLXR5cGVkZWYgdWludDE2X3QgdERJU19BVFRSX01BU0s7Ci0KLXR5cGVkZWYgdERJU19BVFRSX01BU0sgdERJU19BVFRSX0JJVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLX0gdERJU19TVFJJTkc7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDE2X3QgdmVuZG9yX2lkOwotICB1aW50MTZfdCBwcm9kdWN0X2lkOwotICB1aW50MTZfdCBwcm9kdWN0X3ZlcnNpb247Ci0gIHVpbnQ4X3QgdmVuZG9yX2lkX3NyYzsKLQotfSB0RElTX1BOUF9JRDsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnQ2NF90IHN5c3RlbV9pZDsKLSAgdERJU19QTlBfSUQgcG5wX2lkOwotICB0RElTX1NUUklORyBkYXRhX3N0cjsKLX0gdERJU19BVFRSOwotCi0jZGVmaW5lIERJU19NQVhfU1RSSU5HX0RBVEEgNwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGF0dHJfbWFzazsKLSAgdWludDY0X3Qgc3lzdGVtX2lkOwotICB0RElTX1BOUF9JRCBwbnBfaWQ7Ci0gIHVpbnQ4X3QqIGRhdGFfc3RyaW5nW0RJU19NQVhfU1RSSU5HX0RBVEFdOwotfSB0RElTX1ZBTFVFOwotCi10eXBlZGVmIHZvaWQodERJU19SRUFEX0NCQUNLKShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB0RElTX1ZBTFVFKiBwX2Rpc192YWx1ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERhdGEgc3RydWN0dXJlIHVzZWQgYnkgQmF0dGVyeSBTZXJ2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRhOwotICBib29sIG5lZWRfcnNwOwotICB1aW50MTZfdCBjbHRfY2ZnOwotfSB0QkFfV1JJVEVfREFUQTsKLQotI2RlZmluZSBCQV9SRUFEX0NMVF9DRkdfUkVRIDEKLSNkZWZpbmUgQkFfUkVBRF9QUkVfRk1UX1JFUSAyCi0jZGVmaW5lIEJBX1JFQURfUlBUX1JFRl9SRVEgMwotI2RlZmluZSBCQV9SRUFEX0xFVkVMX1JFUSA0Ci0jZGVmaW5lIEJBX1dSSVRFX0NMVF9DRkdfUkVRIDUKLQotdHlwZWRlZiB2b2lkKHRCQV9DQkFDSykodWludDhfdCBhcHBfaWQsIHVpbnQ4X3QgZXZlbnQsIHRCQV9XUklURV9EQVRBKiBwX2RhdGEpOwotCi0jZGVmaW5lIEJBX0xFVkVMX05PVElGWSAweDAxCi0jZGVmaW5lIEJBX0xFVkVMX1BSRV9GTVQgMHgwMgotI2RlZmluZSBCQV9MRVZFTF9SUFRfUkVGIDB4MDQKLXR5cGVkZWYgdWludDhfdCB0QkFfTEVWRUxfREVTQ1I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpc19wcmk7Ci0gIHRCQV9MRVZFTF9ERVNDUiBiYV9sZXZlbF9kZXNjcjsKLSAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQ7Ci0gIHRCQV9DQkFDSyogcF9jYmFjazsKLQotfSB0QkFfUkVHX0lORk87Ci0KLXR5cGVkZWYgdW5pb24gewotICB1aW50OF90IGJhX2xldmVsOwotICB1aW50MTZfdCBjbHRfY2ZnOwotICB0R0FUVF9DSEFSX1JQVF9SRUYgcnB0X3JlZjsKLSAgdEdBVFRfQ0hBUl9QUkVTIHByZXNfZm10OwotfSB0QkFfUlNQX0RBVEE7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybmFsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTZXJ2aWNlIEVuZ2luZSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNydmNfZW5nX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemEgdGhlIEdBVFQgU2VydmljZSBlbmdpbmUsIHJlZ2lzdGVyIGEgR0FUVAotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhcyBmb3IgYSBjZW50cmFsIHNlcnZpY2UgbWFuYWdlbWVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRHQVRUX1NUQVRVUyBzcnZjX2VuZ19pbml0KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBESVMgU2VydmVyIEZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIERJU19TckluaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemEgdGhlIERldmljZSBJbmZvcm1hdGlvbiBTZXJ2aWNlIFNlcnZlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHRESVNfU1RBVFVTIERJU19TckluaXQodERJU19BVFRSX01BU0sgZGlzX2F0dHJfbWFzayk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgRElTX1NyVXBkYXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBVcGRhdGUgdGhlIERJUyBzZXJ2ZXIgYXR0cmlidXRlIHZhbHVlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdERJU19TVEFUVVMgRElTX1NyVXBkYXRlKHRESVNfQVRUUl9CSVQgZGlzX2F0dHJfYml0LCB0RElTX0FUVFIqIHBfaW5mbyk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBESVMgQ2xpZW50IEZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBESVNfUmVhZERJU0luZm8KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYWQgcmVtb3RlIGRldmljZSBESVMgaW5mb3JtYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBib29sIERJU19SZWFkRElTSW5mbyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RElTX1JFQURfQ0JBQ0sqIHBfY2JhY2ssIHRESVNfQVRUUl9NQVNLIG1hc2spOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWNrL2luY2x1ZGUvc3RhY2tfbWV0cmljc19sb2dnaW5nLmggYi9zdGFjay9pbmNsdWRlL3N0YWNrX21ldHJpY3NfbG9nZ2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA1ZjMwLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2luY2x1ZGUvc3RhY2tfbWV0cmljc19sb2dnaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvZW51bXMucGIuaD4KLSNpbmNsdWRlIDxmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoL2hjaS9lbnVtcy5wYi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXZvaWQgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXZlbnRfdmFsdWUpOwotCi12b2lkIGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQoCi0gICAgY29uc3QgUmF3QWRkcmVzcyogYWRkcmVzcywgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwgdWludDE2X3QgbGlua190eXBlLAotICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSk7Ci0KLXZvaWQgbG9nX3NtcF9wYWlyaW5nX2V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNtcF9mYWlsX3JlYXNvbik7Ci0KLXZvaWQgbG9nX3NkcF9hdHRyaWJ1dGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cmlidXRlX2lkLCBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSk7Ci0KLXZvaWQgbG9nX21hbnVmYWN0dXJlcl9pbmZvKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvc3RhY2svbDJjYXAvbDJjX2FwaS5jYyBiL3N0YWNrL2wyY2FwL2wyY19hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDdkMzMuLjAwMDAwMDAKLS0tIGEvc3RhY2svbDJjYXAvbDJjX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEwyQ0FQIEFQSSBjb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9sMmNhcCIKLQotI2luY2x1ZGUgIm1haW4vc2hpbS9sMmNfYXBpLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0bV9zZWMuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiICAvLyBUT0RPIFJlbW92ZQotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBidHNuZF9oY2ljX2VuaGFuY2VkX2ZsdXNoKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhY2tldF90eXBlKTsgIC8vIFRPRE8gUmVtb3ZlCi0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLQotdEJUX1RSQU5TUE9SVCBsMmNfZ2V0X3RyYW5zcG9ydF9mcm9tX2ZpeGVkX2NpZCh1aW50MTZfdCBmaXhlZF9jaWQpIHsKLSAgaWYgKGZpeGVkX2NpZCA+PSBMMkNBUF9BVFRfQ0lEICYmIGZpeGVkX2NpZCA8PSBMMkNBUF9TTVBfQ0lEKQotICAgIHJldHVybiBCVF9UUkFOU1BPUlRfTEU7Ci0gIHJldHVybiBCVF9UUkFOU1BPUlRfQlJfRURSOwotfQotCi11aW50MTZfdCBMMkNBX1JlZ2lzdGVyMih1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIHBfY2JfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlX3Nub29wLCB0TDJDQVBfRVJUTV9JTkZPKiBwX2VydG1faW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCkgewotICBhdXRvIHJldCA9IEwyQ0FfUmVnaXN0ZXIocHNtLCBwX2NiX2luZm8sIGVuYWJsZV9zbm9vcCwgcF9lcnRtX2luZm8sIG15X210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX3JlbW90ZV9tdHUsIHNlY19sZXZlbCk7Ci0gIEJUTV9TZXRTZWN1cml0eUxldmVsKGZhbHNlLCAiIiwgMCwgc2VjX2xldmVsLCBwc20sIDAsIDApOwotICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9SZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBmb3IgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgc2VydmljZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQU00gdG8gdXNlIG9yIHplcm8gaWYgZXJyb3IuIFR5cGljYWxseSwgdGhlIFBTTSByZXR1cm5lZAotICogICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB3YXMgcGFzc2VkIGluLCBidXQgZm9yIGFuIG91dGdvaW5nLW9ubHkKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIGR5bmFtaWMgUFNNLCBhICJ2aXJ0dWFsIiBQU00gaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgYW5kIHNob3VsZCBiZSB1c2VkIGluIHRoZSBjYWxscyB0byBMMkNBX0Nvbm5lY3RSZXEoKSwKLSAqICAgICAgICAgICAgICAgICAgTDJDQV9FcnRtQ29ubmVjdFJlcSgpIGFuZCBMMkNBX0RlcmVnaXN0ZXIoKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBMMkNBX1JlZ2lzdGVyKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV9zbm9vcCwgdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVnaXN0ZXIocHNtLCBwX2NiX2luZm8sIGVuYWJsZV9zbm9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZXJ0bV9pbmZvLCBteV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9yZW1vdGVfbXR1LCBzZWNfbGV2ZWwpOwotICB9Ci0KLSAgY29uc3QgYm9vbCBjb25maWdfY2ZtX2NiID0gKHBfY2JfaW5mby5wTDJDQV9Db25maWdDZm1fQ2IgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IGJvb2wgY29uZmlnX2luZF9jYiA9IChwX2NiX2luZm8ucEwyQ0FfQ29uZmlnSW5kX0NiICE9IG51bGxwdHIpOwotICBjb25zdCBib29sIGRhdGFfaW5kX2NiID0gKHBfY2JfaW5mby5wTDJDQV9EYXRhSW5kX0NiICE9IG51bGxwdHIpOwotICBjb25zdCBib29sIGRpc2Nvbm5lY3RfaW5kX2NiID0gKHBfY2JfaW5mby5wTDJDQV9EaXNjb25uZWN0SW5kX0NiICE9IG51bGxwdHIpOwotCi0gIHRMMkNfUkNCKiBwX3JjYjsKLSAgdWludDE2X3QgdnBzbSA9IHBzbTsKLQotICAvKiBWZXJpZnkgdGhhdCB0aGUgcmVxdWlyZWQgY2FsbGJhY2sgaW5mbyBoYXMgYmVlbiBmaWxsZWQgaW4KLSAgKiogICAgICBOb3RlOiAgQ29ubmVjdGlvbiBjYWxsYmFja3MgYXJlIHJlcXVpcmVkIGJ1dCBub3QgY2hlY2tlZAotICAqKiAgICAgICAgICAgICBmb3IgaGVyZSBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRvIGJlIG9ubHkgYSBjbGllbnQKLSAgKiogICAgICAgICAgICAgb3Igb25seSBhIHNlcnZlci4KLSAgKi8KLSAgaWYgKCFjb25maWdfY2ZtX2NiIHx8ICFkYXRhX2luZF9jYiB8fCAhZGlzY29ubmVjdF9pbmRfY2IpIHsKLSAgICBMT0dfRVJST1IoCi0gICAgICAgICJMMkNBUCAtIG5vIGNiIHJlZ2lzdGVyaW5nIFBTTTogMHglMDR4IGNmZ19jZm06JXUgY2ZnX2luZDoldSIKLSAgICAgICAgIiBkYXRhX2luZDoldSBkaXNjb25faW50OiV1IiwKLSAgICAgICAgcHNtLCBjb25maWdfY2ZtX2NiLCBjb25maWdfaW5kX2NiLCBkYXRhX2luZF9jYiwgZGlzY29ubmVjdF9pbmRfY2IpOwotICAgIHJldHVybiAoMCk7Ci0gIH0KLQotICAvKiBWZXJpZnkgUFNNIGlzIHZhbGlkICovCi0gIGlmIChMMkNfSU5WQUxJRF9QU00ocHNtKSkgewotICAgIExPR19FUlJPUigiTDJDQVAgLSBpbnZhbGlkIFBTTSB2YWx1ZSwgUFNNOiAweCUwNHgiLCBwc20pOwotICAgIHJldHVybiAoMCk7Ci0gIH0KLQotICAvKiBDaGVjayBpZiB0aGlzIGlzIGEgcmVnaXN0cmF0aW9uIGZvciBhbiBvdXRnb2luZy1vbmx5IGNvbm5lY3Rpb24gdG8gKi8KLSAgLyogYSBkeW5hbWljIFBTTS4gSWYgc28sIGFsbG9jYXRlIGEgInZpcnR1YWwiIFBTTSBmb3IgdGhlIGFwcCB0byB1c2UuICovCi0gIGlmICgocHNtID49IDB4MTAwMSkgJiYgKHBfY2JfaW5mby5wTDJDQV9Db25uZWN0SW5kX0NiID09IE5VTEwpKSB7Ci0gICAgZm9yICh2cHNtID0gMHgxMDAyOyB2cHNtIDwgMHg4MDAwOyB2cHNtICs9IDIpIHsKLSAgICAgIHBfcmNiID0gbDJjdV9maW5kX3JjYl9ieV9wc20odnBzbSk7Ci0gICAgICBpZiAocF9yY2IgPT0gTlVMTCkgYnJlYWs7Ci0gICAgfQotCi0gICAgTE9HX0RFQlVHKCJMMkNBUCAtIFJlYWwgUFNNOiAweCUwNHggIFZpcnR1YWwgUFNNOiAweCUwNHgiLCBwc20sIHZwc20pOwotICB9Ci0KLSAgLyogSWYgcmVnaXN0cmF0aW9uIGJsb2NrIGFscmVhZHkgdGhlcmUsIGp1c3Qgb3ZlcndyaXRlIGl0ICovCi0gIHBfcmNiID0gbDJjdV9maW5kX3JjYl9ieV9wc20odnBzbSk7Ci0gIGlmIChwX3JjYiA9PSBOVUxMKSB7Ci0gICAgcF9yY2IgPSBsMmN1X2FsbG9jYXRlX3JjYih2cHNtKTsKLSAgICBpZiAocF9yY2IgPT0gTlVMTCkgewotICAgICAgTE9HX1dBUk4oIkwyQ0FQIC0gbm8gUkNCIGF2YWlsYWJsZSwgUFNNOiAweCUwNHggIHZQU006IDB4JTA0eCIsIHBzbSwKLSAgICAgICAgICAgICAgIHZwc20pOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIH0KLQotICBMT0dfSU5GTygiTDJDQVAgUmVnaXN0ZXJlZCBzZXJ2aWNlIGNsYXNzaWMgUFNNOiAweCUwNHgiLCBwc20pOwotICBwX3JjYi0+bG9nX3BhY2tldHMgPSBlbmFibGVfc25vb3A7Ci0gIHBfcmNiLT5hcGkgPSBwX2NiX2luZm87Ci0gIHBfcmNiLT5yZWFsX3BzbSA9IHBzbTsKLSAgcF9yY2ItPmVydG1faW5mbyA9IHBfZXJ0bV9pbmZvID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IHRMMkNBUF9FUlRNX0lORk97TDJDQVBfRkNSX0JBU0lDX01PREV9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgOiAqcF9lcnRtX2luZm87Ci0gIHBfcmNiLT5teV9tdHUgPSBteV9tdHU7Ci0gIHBfcmNiLT5yZXF1aXJlZF9yZW1vdGVfbXR1ID0KLSAgICAgIHN0ZDo6bWF4PHVpbnQxNl90PihyZXF1aXJlZF9yZW1vdGVfbXR1LCBMMkNBUF9NSU5fTVRVKTsKLQotICByZXR1cm4gKHZwc20pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9EZXJlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPdGhlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRlLXJlZ2lzdGVyIGZvciBMMkNBUAotICogICAgICAgICAgICAgICAgICBzZXJ2aWNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMMkNBX0RlcmVnaXN0ZXIodWludDE2X3QgcHNtKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGVyZWdpc3Rlcihwc20pOwotICB9Ci0KLSAgdEwyQ19SQ0IqIHBfcmNiOwotICB0TDJDX0NDQiogcF9jY2I7Ci0gIHRMMkNfTENCKiBwX2xjYjsKLSAgaW50IGlpOwotCi0gIEwyQ0FQX1RSQUNFX0FQSSgiTDJDQVAgLSBMMkNBX0RlcmVnaXN0ZXIoKSBjYWxsZWQgZm9yIFBTTTogMHglMDR4IiwgcHNtKTsKLQotICBwX3JjYiA9IGwyY3VfZmluZF9yY2JfYnlfcHNtKHBzbSk7Ci0gIGlmIChwX3JjYiAhPSBOVUxMKSB7Ci0gICAgcF9sY2IgPSAmbDJjYi5sY2JfcG9vbFswXTsKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfTDJDQVBfTElOS1M7IGlpKyssIHBfbGNiKyspIHsKLSAgICAgIGlmIChwX2xjYi0+aW5fdXNlKSB7Ci0gICAgICAgIHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsKLSAgICAgICAgaWYgKChwX2NjYiA9PSBOVUxMKSB8fCAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0RJU0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBfY2NiLT5pbl91c2UpICYmCi0gICAgICAgICAgICAoKHBfY2NiLT5jaG5sX3N0YXRlID09IENTVF9XNF9MMkNBUF9ESVNDT05ORUNUX1JTUCkgfHwKLSAgICAgICAgICAgICAocF9jY2ItPmNobmxfc3RhdGUgPT0gQ1NUX1c0X0wyQ0FfRElTQ09OTkVDVF9SU1ApKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfY2NiLT5wX3JjYiA9PSBwX3JjYikgewotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfRElTQ09OTkVDVF9SRVEsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGwyY3VfcmVsZWFzZV9yY2IocF9yY2IpOwotICB9IGVsc2UgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gUFNNOiAweCUwNHggbm90IGZvdW5kIGZvciBkZXJlZ2lzdHJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwc20pOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0FsbG9jYXRlTGVQU00KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRvIGZpbmQgYW4gdW51c2VkIExFIFBTTSBmb3IgTDJDQVAgc2VydmljZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBMRV9QU00gdG8gdXNlIGlmIHN1Y2Nlc3MuIE90aGVyd2lzZSByZXR1cm5zIDAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEwyQ0FfQWxsb2NhdGVMZVBTTSh2b2lkKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfQWxsb2NhdGVMZVBTTSgpOwotICB9Ci0KLSAgYm9vbCBkb25lID0gZmFsc2U7Ci0gIHVpbnQxNl90IHBzbSA9IGwyY2IubGVfZHluX3BzbTsKLSAgdWludDE2X3QgY291bnQgPSAwOwotCi0gIEwyQ0FQX1RSQUNFX0FQSSgiJXM6IGxhc3QgcHNtPSVkIiwgX19mdW5jX18sIHBzbSk7Ci0gIHdoaWxlICghZG9uZSkgewotICAgIGNvdW50Kys7Ci0gICAgaWYgKGNvdW50ID4gTEVfRFlOQU1JQ19QU01fUkFOR0UpIHsKLSAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKCIlczogT3V0IG9mIGZyZWUgQkxFIFBTTSIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHBzbSsrOwotICAgIGlmIChwc20gPiBMRV9EWU5BTUlDX1BTTV9FTkQpIHsKLSAgICAgIHBzbSA9IExFX0RZTkFNSUNfUFNNX1NUQVJUOwotICAgIH0KLQotICAgIGlmICghbDJjYi5sZV9keW5fcHNtX2Fzc2lnbmVkW3BzbSAtIExFX0RZTkFNSUNfUFNNX1NUQVJUXSkgewotICAgICAgLyogbWFrZSBzdXJlIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHNtIGlzIG5vdCB1c2VkIHJpZ2h0IG5vdyAqLwotICAgICAgaWYgKGwyY3VfZmluZF9ibGVfcmNiX2J5X3BzbShwc20pKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzOiBzdXBwb3NlZGx5LWZyZWUgUFNNPSVkIGhhdmUgYWxsb2NhdGVkIHJjYiEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwc20pOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgbDJjYi5sZV9keW5fcHNtX2Fzc2lnbmVkW3BzbSAtIExFX0RZTkFNSUNfUFNNX1NUQVJUXSA9IHRydWU7Ci0gICAgICBMMkNBUF9UUkFDRV9ERUJVRygiJXM6IGFzc2lnbmVkIFBTTT0lZCIsIF9fZnVuY19fLCBwc20pOwotICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgbDJjYi5sZV9keW5fcHNtID0gcHNtOwotCi0gIHJldHVybiAocHNtKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfRnJlZUxlUFNNCi0gKgotICogRGVzY3JpcHRpb24gICAgICBGcmVlIGFuIGFzc2lnbmVkIExFIFBTTS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMMkNBX0ZyZWVMZVBTTSh1aW50MTZfdCBwc20pIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9GcmVlTGVQU00ocHNtKTsKLSAgfQotCi0gIEwyQ0FQX1RSQUNFX0FQSSgiJXM6IHRvIGZyZWUgcHNtPSVkIiwgX19mdW5jX18sIHBzbSk7Ci0KLSAgaWYgKChwc20gPCBMRV9EWU5BTUlDX1BTTV9TVEFSVCkgfHwgKHBzbSA+IExFX0RZTkFNSUNfUFNNX0VORCkpIHsKLSAgICBMMkNBUF9UUkFDRV9FUlJPUigiJXM6IEludmFsaWQgUFNNPSVkIHZhbHVlISIsIF9fZnVuY19fLCBwc20pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghbDJjYi5sZV9keW5fcHNtX2Fzc2lnbmVkW3BzbSAtIExFX0RZTkFNSUNfUFNNX1NUQVJUXSkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzOiBQU009JWQgd2FzIG5vdCBhbGxvY2F0ZWQhIiwgX19mdW5jX18sIHBzbSk7Ci0gIH0KLSAgbDJjYi5sZV9keW5fcHNtX2Fzc2lnbmVkW3BzbSAtIExFX0RZTkFNSUNfUFNNX1NUQVJUXSA9IGZhbHNlOwotfQotCi11aW50MTZfdCBMMkNBX0Nvbm5lY3RSZXEyKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwpIHsKLSAgQlRNX1NldFNlY3VyaXR5TGV2ZWwodHJ1ZSwgIiIsIDAsIHNlY19sZXZlbCwgcHNtLCAwLCAwKTsKLSAgcmV0dXJuIEwyQ0FfQ29ubmVjdFJlcShwc20sIHBfYmRfYWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0Nvbm5lY3RSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBMMkNBUAotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLgotICogICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGVzdGFibGlzaGVkIGF0IHRoaXMgdGltZSwKLSAqICAgICAgICAgICAgICAgICAgYnV0IGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBnZXRzIHN0YXJ0ZWQuIFRoZSBjYWxsYmFjawotICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQgd2hlbiBjb25uZWN0aW9uIGVzdGFibGlzaGVzIG9yIGZhaWxzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdGhlIENJRCBvZiB0aGUgY29ubmVjdGlvbiwgb3IgMCBpZiBpdCBmYWlsZWQgdG8gc3RhcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgTDJDQV9Db25uZWN0UmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfQ29ubmVjdFJlcShwc20sIHBfYmRfYWRkcik7Ci0gIH0KLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICJCREEgIiA8PCBwX2JkX2FkZHIKLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiBQU006IDB4JTA0eCIsIHBzbSk7Ci0KLSAgLyogRmFpbCBpZiB3ZSBoYXZlIG5vdCBlc3RhYmxpc2hlZCBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBjb250cm9sbGVyICovCi0gIGlmICghQlRNX0lzRGV2aWNlVXAoKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBCVFUgbm90IHJlYWR5IjsKLSAgICByZXR1cm4gMDsKLSAgfQotICAvKiBGYWlsIGlmIHRoZSBQU00gaXMgbm90IHJlZ2lzdGVyZWQgKi8KLSAgdEwyQ19SQ0IqIHBfcmNiID0gbDJjdV9maW5kX3JjYl9ieV9wc20ocHNtKTsKLSAgaWYgKHBfcmNiID09IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbm8gUkNCLCBQU009IiA8PCBsb2doZXgocHNtKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIEZpcnN0LCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgbGluayB0byB0aGUgcmVtb3RlICovCi0gIC8qIGFzc3VtZSBhbGwgRVJUTSBsMmNhcCBjb25uZWN0aW9uIGlzIGdvaW5nIG92ZXIgQlIvRURSIGZvciBub3cgKi8KLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKHBfYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIGlmIChwX2xjYiA9PSBudWxscHRyKSB7Ci0gICAgLyogTm8gbGluay4gR2V0IGFuIExDQiBhbmQgc3RhcnQgbGluayBlc3RhYmxpc2htZW50ICovCi0gICAgcF9sY2IgPSBsMmN1X2FsbG9jYXRlX2xjYihwX2JkX2FkZHIsIGZhbHNlLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICAvKiBjdXJyZW50bHkgdXNlIEJSL0VEUiBmb3IgRVJUTSBtb2RlIGwyY2FwIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAocF9sY2IgPT0gbnVsbHB0cikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogY29ubmVjdGlvbiBub3Qgc3RhcnRlZCBmb3IgUFNNPSIgPDwgbG9naGV4KHBzbSkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBwX2xjYj0iIDw8IHBfbGNiOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGwyY3VfY3JlYXRlX2Nvbm5fYnJfZWRyKHBfbGNiKTsKLSAgfQotCi0gIC8qIEFsbG9jYXRlIGEgY2hhbm5lbCBjb250cm9sIGJsb2NrICovCi0gIHRMMkNfQ0NCKiBwX2NjYiA9IGwyY3VfYWxsb2NhdGVfY2NiKHBfbGNiLCAwKTsKLSAgaWYgKHBfY2NiID09IG51bGxwdHIpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbm8gQ0NCLCBQU009IiA8PCBsb2doZXgocHNtKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIFNhdmUgcmVnaXN0cmF0aW9uIGluZm8gKi8KLSAgcF9jY2ItPnBfcmNiID0gcF9yY2I7Ci0KLSAgcF9jY2ItPmNvbm5lY3Rpb25faW5pdGlhdG9yID0gTDJDQVBfSU5JVElBVE9SX0xPQ0FMOwotCi0gIC8qIElmIGxpbmsgaXMgdXAsIHN0YXJ0IHRoZSBMMkNBUCBjb25uZWN0aW9uICovCi0gIGlmIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfQ09OTkVDVEVEKSB7Ci0gICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQV9DT05ORUNUX1JFUSwgbnVsbHB0cik7Ci0gIH0gZWxzZSBpZiAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0RJU0NPTk5FQ1RJTkcpIHsKLSAgICAvKiBJZiBsaW5rIGlzIGRpc2Nvbm5lY3RpbmcsIHNhdmUgbGluayBpbmZvIHRvIHJldHJ5IGFmdGVyIGRpc2Nvbm5lY3QKLSAgICAgKiBQb3NzaWJsZSBSYWNlIGNvbmRpdGlvbiB3aGVuIGEgcmVjb25uZWN0IG9jY3VycwotICAgICAqIG9uIHRoZSBjaGFubmVsIGR1cmluZyBhIGRpc2Nvbm5lY3Qgb2YgbGluay4gVGhpcwotICAgICAqIGNjYiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmV0cmllZCBhZnRlciBsaW5rIGRpc2Nvbm5lY3QKLSAgICAgKiBhcnJpdmVzCi0gICAgICovCi0gICAgTDJDQVBfVFJBQ0VfREVCVUcoIkwyQ0FQIEFQSSAtIGxpbmsgZGlzY29ubmVjdGluZzogUkVUUlkgTEFURVIiKTsKLQotICAgIC8qIFNhdmUgY2NiIHNvIGl0IGNhbiBiZSBzdGFydGVkIGFmdGVyIGRpc2Nvbm5lY3QgaXMgZmluaXNoZWQgKi8KLSAgICBwX2xjYi0+cF9wZW5kaW5nX2NjYiA9IHBfY2NiOwotICB9Ci0KLSAgTDJDQVBfVFJBQ0VfQVBJKCJMMkNBUCAtIEwyQ0FfY29ubl9yZXEocHNtOiAweCUwNHgpIHJldHVybmVkIENJRDogMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgIHBzbSwgcF9jY2ItPmxvY2FsX2NpZCk7Ci0KLSAgLyogUmV0dXJuIHRoZSBsb2NhbCBDSUQgYXMgb3VyIGhhbmRsZSAqLwotICByZXR1cm4gcF9jY2ItPmxvY2FsX2NpZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfUmVnaXN0ZXJMRUNvYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgT3RoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlciBmb3IgTDJDQVAKLSAqICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBPcmllbnRlZCBDaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUFNNIHRvIHVzZSBvciB6ZXJvIGlmIGVycm9yLiBUeXBpY2FsbHksIHRoZSBQU00gcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgd2FzIHBhc3NlZCBpbiwgYnV0IGZvciBhbiBvdXRnb2luZy1vbmx5Ci0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBkeW5hbWljIFBTTSwgYSAidmlydHVhbCIgUFNNIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgY2FsbHMgdG8gTDJDQV9Db25uZWN0TEVDb2NSZXEoKQotICogICAgICAgICAgICAgICAgICBhbmQgTDJDQV9EZXJlZ2lzdGVyTEVDb2MoKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBMMkNBX1JlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsLCB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVnaXN0ZXJMRUNvYyhwc20sIHBfY2JfaW5mbywgc2VjX2xldmVsLCBjZmcpOwotICB9Ci0KLSAgaWYgKHBfY2JfaW5mby5wTDJDQV9Db25uZWN0SW5kX0NiICE9IG51bGxwdHIgfHwgcHNtIDwgTEVfRFlOQU1JQ19QU01fU1RBUlQpIHsKLSAgICAvLyAgSWYgd2UgcmVnaXN0ZXIgTEUgQ09DIGZvciBvdXRnb2luZyBjb25uZWN0aW9uIG9ubHksIGRvbid0IHJlZ2lzdGVyIHdpdGgKLSAgICAvLyAgQlRNX1NlYywgYmVjYXVzZSBpdCdzIGhhbmRsZWQgYnkgTDJDQV9Db25uZWN0TEVDb2NSZXEuCi0gICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwoZmFsc2UsICIiLCAwLCBzZWNfbGV2ZWwsIHBzbSwgMCwgMCk7Ci0gIH0KLQotICAvKiBWZXJpZnkgdGhhdCB0aGUgcmVxdWlyZWQgY2FsbGJhY2sgaW5mbyBoYXMgYmVlbiBmaWxsZWQgaW4KLSAgKiogICAgICBOb3RlOiAgQ29ubmVjdGlvbiBjYWxsYmFja3MgYXJlIHJlcXVpcmVkIGJ1dCBub3QgY2hlY2tlZAotICAqKiAgICAgICAgICAgICBmb3IgaGVyZSBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRvIGJlIG9ubHkgYSBjbGllbnQKLSAgKiogICAgICAgICAgICAgb3Igb25seSBhIHNlcnZlci4KLSAgKi8KLSAgaWYgKCghcF9jYl9pbmZvLnBMMkNBX0RhdGFJbmRfQ2IpIHx8ICghcF9jYl9pbmZvLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IpKSB7Ci0gICAgTE9HX0VSUk9SKCJObyBjYiByZWdpc3RlcmluZyBCTEUgUFNNOiAweCUwNHgiLCBwc20pOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogVmVyaWZ5IFBTTSBpcyB2YWxpZCAqLwotICBpZiAoIUwyQ19JU19WQUxJRF9MRV9QU00ocHNtKSkgewotICAgIExPR19FUlJPUigiSW52YWxpZCBCTEUgUFNNIHZhbHVlLCBQU006IDB4JTA0eCIsIHBzbSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB0TDJDX1JDQiogcF9yY2I7Ci0gIHVpbnQxNl90IHZwc20gPSBwc207Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHJlZ2lzdHJhdGlvbiBmb3IgYW4gb3V0Z29pbmctb25seSBjb25uZWN0aW9uIHRvICovCi0gIC8qIGEgZHluYW1pYyBQU00uIElmIHNvLCBhbGxvY2F0ZSBhICJ2aXJ0dWFsIiBQU00gZm9yIHRoZSBhcHAgdG8gdXNlLiAqLwotICBpZiAoKHBzbSA+PSBMRV9EWU5BTUlDX1BTTV9TVEFSVCkgJiYKLSAgICAgIChwX2NiX2luZm8ucEwyQ0FfQ29ubmVjdEluZF9DYiA9PSBOVUxMKSkgewotICAgIHZwc20gPSBMMkNBX0FsbG9jYXRlTGVQU00oKTsKLSAgICBpZiAodnBzbSA9PSAwKSB7Ci0gICAgICBMT0dfRVJST1IoIk91dCBvZiBmcmVlIEJMRSBQU00iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIExPR19ERUJVRygiUmVhbCBQU006IDB4JTA0eCAgVmlydHVhbCBQU006IDB4JTA0eCIsIHBzbSwgdnBzbSk7Ci0gIH0KLQotICAvKiBJZiByZWdpc3RyYXRpb24gYmxvY2sgYWxyZWFkeSB0aGVyZSwganVzdCBvdmVyd3JpdGUgaXQgKi8KLSAgcF9yY2IgPSBsMmN1X2ZpbmRfYmxlX3JjYl9ieV9wc20odnBzbSk7Ci0gIGlmIChwX3JjYiA9PSBOVUxMKSB7Ci0gICAgTE9HX0RFQlVHKCJBbGxvY2F0ZSByY3AgZm9yIFZpcnR1YWwgUFNNOiAweCUwNHgiLCB2cHNtKTsKLSAgICBwX3JjYiA9IGwyY3VfYWxsb2NhdGVfYmxlX3JjYih2cHNtKTsKLSAgICBpZiAocF9yY2IgPT0gTlVMTCkgewotICAgICAgTE9HX1dBUk4oIk5vIEJMRSBSQ0IgYXZhaWxhYmxlLCBQU006IDB4JTA0eCAgdlBTTTogMHglMDR4IiwgcHNtLCB2cHNtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIExPR19JTkZPKCJSZWdpc3RlcmVkIHNlcnZpY2UgTEUgQ09DIFBTTTogMHglMDR4IiwgcHNtKTsKLSAgcF9yY2ItPmFwaSA9IHBfY2JfaW5mbzsKLSAgcF9yY2ItPnJlYWxfcHNtID0gcHNtOwotICBwX3JjYi0+Y29jX2NmZyA9IGNmZzsKLQotICByZXR1cm4gdnBzbTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfRGVyZWdpc3RlckxFQ29jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPdGhlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRlLXJlZ2lzdGVyIGZvciBMMkNBUAotICogICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIE9yaWVudGVkIENoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTDJDQV9EZXJlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGVyZWdpc3RlckxFQ29jKHBzbSk7Ci0gIH0KLQotICBMMkNBUF9UUkFDRV9BUEkoIiVzIGNhbGxlZCBmb3IgUFNNOiAweCUwNHgiLCBfX2Z1bmNfXywgcHNtKTsKLQotICB0TDJDX1JDQiogcF9yY2IgPSBsMmN1X2ZpbmRfYmxlX3JjYl9ieV9wc20ocHNtKTsKLSAgaWYgKHBfcmNiID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyBQU006IDB4JTA0eCBub3QgZm91bmQgZm9yIGRlcmVnaXN0cmF0aW9uIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBwc20pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRMMkNfTENCKiBwX2xjYiA9ICZsMmNiLmxjYl9wb29sWzBdOwotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MMkNBUF9MSU5LUzsgaSsrLCBwX2xjYisrKSB7Ci0gICAgaWYgKCFwX2xjYi0+aW5fdXNlIHx8IHBfbGNiLT50cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSBjb250aW51ZTsKLQotICAgIHRMMkNfQ0NCKiBwX2NjYiA9IHBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2I7Ci0gICAgaWYgKChwX2NjYiA9PSBOVUxMKSB8fCAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0RJU0NPTk5FQ1RJTkcpKSBjb250aW51ZTsKLQotICAgIGlmIChwX2NjYi0+aW5fdXNlICYmIChwX2NjYi0+Y2hubF9zdGF0ZSA9PSBDU1RfVzRfTDJDQVBfRElTQ09OTkVDVF9SU1AgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPT0gQ1NUX1c0X0wyQ0FfRElTQ09OTkVDVF9SU1ApKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAocF9jY2ItPnBfcmNiID09IHBfcmNiKQotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JFUSwgTlVMTCk7Ci0gIH0KLQotICBsMmN1X3JlbGVhc2VfYmxlX3JjYihwX3JjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0Nvbm5lY3RMRUNvY1JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIEwyQ0FQCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uIE5vdGUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBub3QgZXN0YWJsaXNoZWQgYXQKLSAqICAgICAgICAgICAgICAgICAgdGhpcyB0aW1lLCBidXQgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IGdldHMgc3RhcnRlZC4gVGhlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCB3aGVuIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgZXN0YWJsaXNoZXMgb3IgZmFpbHMuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICBQU006IEwyQ0FQIFBTTSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgQkQgYWRkcmVzcyBvZiB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBMb2NhbCBDb2MgY29uZmlndXJhdGlvbnMKLQotICogUmV0dXJucyAgICAgICAgICB0aGUgQ0lEIG9mIHRoZSBjb25uZWN0aW9uLCBvciAwIGlmIGl0IGZhaWxlZCB0byBzdGFydAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBMMkNBX0Nvbm5lY3RMRUNvY1JlcSh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcsIHVpbnQxNl90IHNlY19sZXZlbCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Nvbm5lY3RMRUNvY1JlcShwc20sIHBfYmRfYWRkciwgcF9jZmcpOwotICB9Ci0KLSAgQlRNX1NldFNlY3VyaXR5TGV2ZWwodHJ1ZSwgIiIsIDAsIHNlY19sZXZlbCwgcHNtLCAwLCAwKTsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHBfYmRfYWRkcgotICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiIFBTTTogMHglMDR4IiwgcHNtKTsKLQotICAvKiBGYWlsIGlmIHdlIGhhdmUgbm90IGVzdGFibGlzaGVkIGNvbW11bmljYXRpb25zIHdpdGggdGhlIGNvbnRyb2xsZXIgKi8KLSAgaWYgKCFCVE1fSXNEZXZpY2VVcCgpKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiJXMgQlRVIG5vdCByZWFkeSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIEZhaWwgaWYgdGhlIFBTTSBpcyBub3QgcmVnaXN0ZXJlZCAqLwotICB0TDJDX1JDQiogcF9yY2IgPSBsMmN1X2ZpbmRfYmxlX3JjYl9ieV9wc20ocHNtKTsKLSAgaWYgKHBfcmNiID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyBObyBCTEUgUkNCLCBQU006IDB4JTA0eCIsIF9fZnVuY19fLCBwc20pOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyogRmlyc3QsIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBsZSBsaW5rIHRvIHRoZSByZW1vdGUgKi8KLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKHBfYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKHBfbGNiID09IE5VTEwpIHsKLSAgICAvKiBObyBsaW5rLiBHZXQgYW4gTENCIGFuZCBzdGFydCBsaW5rIGVzdGFibGlzaG1lbnQgKi8KLSAgICBwX2xjYiA9IGwyY3VfYWxsb2NhdGVfbGNiKHBfYmRfYWRkciwgZmFsc2UsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgaWYgKChwX2xjYiA9PSBOVUxMKQotICAgICAgICAvKiBjdXJyZW50bHkgdXNlIEJSL0VEUiBmb3IgRVJUTSBtb2RlIGwyY2FwIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgfHwgKCFsMmN1X2NyZWF0ZV9jb25uX2xlKHBfbGNiKSkpIHsKLSAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzIGNvbm4gbm90IHN0YXJ0ZWQgZm9yIFBTTTogMHglMDR4ICBwX2xjYjogMHglMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBzbSwgcF9sY2IpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgLyogQWxsb2NhdGUgYSBjaGFubmVsIGNvbnRyb2wgYmxvY2sgKi8KLSAgdEwyQ19DQ0IqIHBfY2NiID0gbDJjdV9hbGxvY2F0ZV9jY2IocF9sY2IsIDApOwotICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzIG5vIENDQiwgUFNNOiAweCUwNHgiLCBfX2Z1bmNfXywgcHNtKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIFNhdmUgcmVnaXN0cmF0aW9uIGluZm8gKi8KLSAgcF9jY2ItPnBfcmNiID0gcF9yY2I7Ci0KLSAgcF9jY2ItPmNvbm5lY3Rpb25faW5pdGlhdG9yID0gTDJDQVBfSU5JVElBVE9SX0xPQ0FMOwotCi0gIC8qIFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gKi8KLSAgaWYgKHBfY2ZnKSB7Ci0gICAgcF9jY2ItPmxvY2FsX2Nvbm5fY2ZnID0gKnBfY2ZnOwotICAgIHBfY2NiLT5yZW1vdGVfY3JlZGl0X2NvdW50ID0gcF9jZmctPmNyZWRpdHM7Ci0gIH0KLQotICAvKiBJZiBsaW5rIGlzIHVwLCBzdGFydCB0aGUgTDJDQVAgY29ubmVjdGlvbiAqLwotICBpZiAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RFRCkgewotICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCIlcyBMRSBMaW5rIGlzIHVwIiwgX19mdW5jX18pOwotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQV9DT05ORUNUX1JFUSwgTlVMTCk7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgbGluayBpcyBkaXNjb25uZWN0aW5nLCBzYXZlIGxpbmsgaW5mbyB0byByZXRyeSBhZnRlciBkaXNjb25uZWN0Ci0gICAqIFBvc3NpYmxlIFJhY2UgY29uZGl0aW9uIHdoZW4gYSByZWNvbm5lY3Qgb2NjdXJzCi0gICAqIG9uIHRoZSBjaGFubmVsIGR1cmluZyBhIGRpc2Nvbm5lY3Qgb2YgbGluay4gVGhpcwotICAgKiBjY2Igd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJldHJpZWQgYWZ0ZXIgbGluayBkaXNjb25uZWN0Ci0gICAqIGFycml2ZXMKLSAgICovCi0gIGVsc2UgaWYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9ESVNDT05ORUNUSU5HKSB7Ci0gICAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzIGxpbmsgZGlzY29ubmVjdGluZzogUkVUUlkgTEFURVIiLCBfX2Z1bmNfXyk7Ci0KLSAgICAvKiBTYXZlIGNjYiBzbyBpdCBjYW4gYmUgc3RhcnRlZCBhZnRlciBkaXNjb25uZWN0IGlzIGZpbmlzaGVkICovCi0gICAgcF9sY2ItPnBfcGVuZGluZ19jY2IgPSBwX2NjYjsKLSAgfQotCi0gIEwyQ0FQX1RSQUNFX0FQSSgiJXMocHNtOiAweCUwNHgpIHJldHVybmVkIENJRDogMHglMDR4IiwgX19mdW5jX18sIHBzbSwKLSAgICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotCi0gIC8qIFJldHVybiB0aGUgbG9jYWwgQ0lEIGFzIG91ciBoYW5kbGUgKi8KLSAgcmV0dXJuIHBfY2NiLT5sb2NhbF9jaWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICAgTDJDQV9HZXRQZWVyTEVDb2NDb25maWcKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgICBHZXQgYSBwZWVycyBjb25maWd1cmF0aW9uIGZvciBMRSBDb25uZWN0aW9uIE9yaWVudGVkCi0gKiAgICAgICAgICAgICAgICAgICBDaGFubmVsLgotICoKLSAqICBQYXJhbWV0ZXJzOiAgICAgIGxvY2FsIGNoYW5uZWwgaWQKLSAqICAgICAgICAgICAgICAgICAgIFBvaW50ZXJzIHRvIHBlZXJzIGNvbmZpZ3VyYXRpb24gc3RvcmFnZSBhcmVhCi0gKgotICogIFJldHVybiB2YWx1ZTogICAgdHJ1ZSBpZiBwZWVyIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnKHVpbnQxNl90IGxjaWQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRQZWVyTEVDb2NDb25maWcobGNpZCwgcGVlcl9jZmcpOwotICB9Ci0KLSAgTDJDQVBfVFJBQ0VfQVBJKCIlcyBDSUQ6IDB4JTA0eCIsIF9fZnVuY19fLCBsY2lkKTsKLQotICB0TDJDX0NDQiogcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChOVUxMLCBsY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9FUlJPUigiJXMgTm8gQ0NCIGZvciBDSUQ6MHglMDR4IiwgX19mdW5jX18sIGxjaWQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChwZWVyX2NmZyAhPSBOVUxMKQotICAgIG1lbWNweShwZWVyX2NmZywgJnBfY2NiLT5wZWVyX2Nvbm5fY2ZnLCBzaXplb2YodEwyQ0FQX0xFX0NGR19JTkZPKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVzcG9uc2UgZm9yIHRoZSBwTDJDQV9DcmVkaXRCYXNlZENvbm5lY3RJbmRfQ2Igd2hpY2ggaXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGluZGljYXRpb24gZm9yIHBlZXIgcmVxdWVzdGluZyBjcmVkaXQgYmFzZWQgY29ubmVjdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIEJEIGFkZHJlc3Mgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciBvZiB0aGUgdHJhbnNhY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgVmVjdG9yIG9mIGFjY2VwdGVkIGxjaWRzIGJ5IHVwcGVyIGxheWVyCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQIHJlc3VsdAotICogICAgICAgICAgICAgICAgICBMb2NhbCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AoCi0gICAgICAgIHBfYmRfYWRkciwgaWQsIGFjY2VwdGVkX2xjaWRzLCByZXN1bHQsIHBfY2ZnKTsKLSAgfQotCi0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBCREE6ICIgPDwgcF9iZF9hZGRyCi0gICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgbnVtIG9mIGNpZHM6ICVkIFJlc3VsdDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoYWNjZXB0ZWRfbGNpZHMuc2l6ZSgpKSwgK3Jlc3VsdCk7Ci0KLSAgLyogRmlyc3QsIGZpbmQgdGhlIGxpbmsgY29udHJvbCBibG9jayAqLwotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocF9iZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBpZiAocF9sY2IgPT0gTlVMTCkgewotICAgIC8qIE5vIGxpbmsuIEdldCBhbiBMQ0IgYW5kIHN0YXJ0IGxpbmsgZXN0YWJsaXNobWVudCAqLwotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzIG5vIExDQiIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBOb3csIGZpbmQgdGhlIGNoYW5uZWwgY29udHJvbCBibG9jay4gV2Uga2VwdCBsZWFkIGNpZC4KLSAgICovCi0gIHRMMkNfQ0NCKiBwX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKHBfbGNiLCBwX2xjYi0+cGVuZGluZ19sZWFkX2NpZCk7Ci0KLSAgZm9yICh1aW50MTZfdCBjaWQgOiBhY2NlcHRlZF9sY2lkcykgewotICAgIHRMMkNfQ0NCKiB0ZW1wX3BfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQocF9sY2IsIGNpZCk7Ci0gICAgaWYgKHRlbXBfcF9jY2IgPT0gTlVMTCkgewotICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygiJXMgbm8gQ0NCIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChwX2NmZykgewotICAgICAgdGVtcF9wX2NjYi0+bG9jYWxfY29ubl9jZmcgPSAqcF9jZmc7Ci0gICAgICB0ZW1wX3BfY2NiLT5yZW1vdGVfY3JlZGl0X2NvdW50ID0gcF9jZmctPmNyZWRpdHM7Ci0gICAgfQotICB9Ci0KLSAgLyogVGhlIElEcyBtdXN0IG1hdGNoICovCi0gIGlmIChwX2NjYi0+cmVtb3RlX2lkICE9IGlkKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiJXMgYmFkIGlkLiBFeHBlY3RlZDogJWQgIEdvdDogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5yZW1vdGVfaWQsIGlkKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB0TDJDX0NPTk5fSU5GTyBjb25uX2luZm87Ci0gIGNvbm5faW5mby5sY2lkcyA9IGFjY2VwdGVkX2xjaWRzOwotICBjb25uX2luZm8uYmRfYWRkciA9IHBfYmRfYWRkcjsKLSAgY29ubl9pbmZvLmwyY2FwX3Jlc3VsdCA9IHJlc3VsdDsKLQotICBpZiAoYWNjZXB0ZWRfbGNpZHMuc2l6ZSgpID4gMCkgewotICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQLCAmY29ubl9pbmZvKTsKLSAgfSBlbHNlIHsKLSAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUF9ORUcsCi0gICAgICAgICAgICAgICAgICAgICZjb25uX2luZm8pOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxCi0gKgotICogIERlc2NyaXB0aW9uICAgICAgSW5pdGlhdGUgQ3JlYXRlIENyZWRpdCBCYXNlZCBjb25uZWN0aW9ucy4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgICBQU00gZm9yIHRoZSBMMkNBUCBjaGFubmVsCi0gKiAgICAgICAgICAgICAgICAgICBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgICBMb2NhbCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiAgUmV0dXJuIHZhbHVlOiAgICBWZWN0b3Igb2YgYWxsb2NhdGVkIGxvY2FsIGNpZHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxKHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcShwc20sIHBfYmRfYWRkciwgcF9jZmcpOwotICB9Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIEJEQTogIiA8PCBwX2JkX2FkZHIKLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiBQU006IDB4JTA0eCIsIHBzbSk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGFsbG9jYXRlZF9jaWRzOwotCi0gIC8qIEZhaWwgaWYgd2UgaGF2ZSBub3QgZXN0YWJsaXNoZWQgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgY29udHJvbGxlciAqLwotICBpZiAoIUJUTV9Jc0RldmljZVVwKCkpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyBCVFUgbm90IHJlYWR5IiwgX19mdW5jX18pOwotICAgIHJldHVybiBhbGxvY2F0ZWRfY2lkczsKLSAgfQotCi0gIGlmICghcF9jZmcpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyBwX2NmZyBpcyBOVUxMIiwgX19mdW5jX18pOwotICAgIHJldHVybiBhbGxvY2F0ZWRfY2lkczsKLSAgfQotCi0gIC8qIEZhaWwgaWYgdGhlIFBTTSBpcyBub3QgcmVnaXN0ZXJlZCAqLwotICB0TDJDX1JDQiogcF9yY2IgPSBsMmN1X2ZpbmRfYmxlX3JjYl9ieV9wc20ocHNtKTsKLSAgaWYgKHBfcmNiID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyBObyBCTEUgUkNCLCBQU006IDB4JTA0eCIsIF9fZnVuY19fLCBwc20pOwotICAgIHJldHVybiBhbGxvY2F0ZWRfY2lkczsKLSAgfQotCi0gIC8qIEZpcnN0LCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgbGUgbGluayB0byB0aGUgcmVtb3RlICovCi0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihwX2JkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIGlmIChwX2xjYiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiJXMgTm8gbGluayBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGFsbG9jYXRlZF9jaWRzOwotICB9Ci0KLSAgaWYgKHBfbGNiLT5saW5rX3N0YXRlICE9IExTVF9DT05ORUNURUQpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyBpbmNvcnJlY3QgbGluayBzdGF0ZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbGNiLT5saW5rX3N0YXRlKTsKLSAgICByZXR1cm4gYWxsb2NhdGVkX2NpZHM7Ci0gIH0KLQotICBMMkNBUF9UUkFDRV9ERUJVRygiJXMgTEUgTGluayBpcyB1cCIsIF9fZnVuY19fKTsKLQotICB0TDJDX0NDQiogcF9jY2JfcHJpbWFyeTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgIC8qIEFsbG9jYXRlIGEgY2hhbm5lbCBjb250cm9sIGJsb2NrICovCi0gICAgdEwyQ19DQ0IqIHBfY2NiID0gbDJjdV9hbGxvY2F0ZV9jY2IocF9sY2IsIDApOwotICAgIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzIG5vIENDQiwgUFNNOiAweCUwNHgiLCBfX2Z1bmNfXywgcHNtKTsKLSAgICAgICAgcmV0dXJuIGFsbG9jYXRlZF9jaWRzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcF9jY2ItPmVjb2MgPSB0cnVlOwotICAgIHBfY2NiLT5sb2NhbF9jb25uX2NmZyA9ICpwX2NmZzsKLSAgICBwX2NjYi0+cmVtb3RlX2NyZWRpdF9jb3VudCA9IHBfY2ZnLT5jcmVkaXRzOwotICAgIC8qIFNhdmUgcmVnaXN0cmF0aW9uIGluZm8gKi8KLSAgICBwX2NjYi0+cF9yY2IgPSBwX3JjYjsKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICBwX2NjYl9wcmltYXJ5ID0gcF9jY2I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE9ubHkgcHJpbWFyeSBjaGFubmVsIHdlIGtlZXAgaW4gY2xvc2VkIHN0YXRlLCBhcyBpbiB0aGF0Ci0gICAgICAgKiBjb250ZXh0IHdlIHdpbGwgcnVuIHN0YXRlIG1hY2hpbmUgd2hlcmUgc2VjdXJpdHkgaXMgY2hlY2tlZCBldGMuCi0gICAgICAgKiBPdGhlcnMgd2UgY2FuIGRpcmVjdGx5IHB1dCBpbnRvIHdhaXRpbmcgZm9yIGNvbm5lY3QKLSAgICAgICAqIHJlc3BvbnNlLCBzbyB0aG9zZSBhcmUgbm90IGNvbmZ1c2VkIGJ5IHN5c3RlbSBhcyBpbmNvbW1pbmcgY29ubmVjdGlvbnMKLSAgICAgICAqLwotICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfVzRfTDJDQVBfQ09OTkVDVF9SU1A7Ci0gICAgfQotCi0gICAgYWxsb2NhdGVkX2NpZHMucHVzaF9iYWNrKHBfY2NiLT5sb2NhbF9jaWQpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KShhbGxvY2F0ZWRfY2lkcy5zaXplKCkpOyBpKyspCi0gICAgcF9sY2ItPnBlbmRpbmdfZWNvY19jb25uZWN0aW9uX2NpZHNbaV0gPSBhbGxvY2F0ZWRfY2lkc1tpXTsKLQotICBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5fY250ID0gKHVpbnQxNl90KShhbGxvY2F0ZWRfY2lkcy5zaXplKCkpOwotICBsMmNfY3NtX2V4ZWN1dGUocF9jY2JfcHJpbWFyeSwgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUkVRLCBOVUxMKTsKLQotICBMMkNBUF9UUkFDRV9BUEkoIiVzKHBzbTogMHglMDR4KSByZXR1cm5lZCBDSUQ6IDB4JTA0eCIsIF9fZnVuY19fLCBwc20sCi0gICAgICAgICAgICAgICAgICBwX2NjYl9wcmltYXJ5LT5sb2NhbF9jaWQpOwotCi0gIHJldHVybiBhbGxvY2F0ZWRfY2lkczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgICBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcQotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IHJlY29uZmlndXJlIHByb2NlZHVyZSBvbiBDb25uZWN0aW9uIE9yaWVudGVkIENoYW5uZWwuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICAgVmVjdG9yIG9mIGNoYW5uZWxzIGZvciB3aGljaCBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBjaGFuZ2VkCi0gKiAgICAgICAgICAgICAgICAgICBOZXcgbG9jYWwgY2hhbm5lbCBjb25maWd1cmF0aW9uCi0gKgotICogIFJldHVybiB2YWx1ZTogICAgdHJ1ZSBpZiBwZWVyIGlzIGNvbm5lY3RlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgTDJDQV9SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxKGJkYSwgbGNpZHMsIHBfY2ZnKTsKLSAgfQotCi0gIHRMMkNfQ0NCKiBwX2NjYjsKLQotICBMMkNBUF9UUkFDRV9BUEkoIkwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxKCkgIik7Ci0KLSAgaWYgKGxjaWRzLmVtcHR5KCkpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIGxjaWRzIGdpdmVuIHRvICVzIiwgX19mdW5jX18pOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgZm9yICh1aW50MTZfdCBjaWQgOiBsY2lkcykgewotICAgIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQoTlVMTCwgY2lkKTsKLQotICAgIGlmICghcF9jY2IpIHsKLSAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gbm8gQ0NCIGZvciBMMkNBX2NmZ19yZXEsIENJRDogJWQiLCBjaWQpOwotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYgKChwX2NjYi0+bG9jYWxfY29ubl9jZmcubXR1ID4gcF9jZmctPm10dSkgfHwKLSAgICAgICAgKHBfY2NiLT5sb2NhbF9jb25uX2NmZy5tcHMgPiBwX2NmZy0+bXBzKSkgewotICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBNUFMgb3IgTVRVIHJlZHVjdGlvbiwgQ0lEOiAlZCIsIGNpZCk7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocF9jZmctPm10dSA+IEwyQ0FQX01UVV9TSVpFKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBhZGp1c3QgTVRVOiAldSB0b28gbGFyZ2UiLCBwX2NmZy0+bXR1KTsKLSAgICBwX2NmZy0+bXR1ID0gTDJDQVBfTVRVX1NJWkU7Ci0gIH0KLQotICAvKiBNYXJrIGFsbCB0aGUgcF9jY2JzIHdoaWNoIGdvaW5nIHRvIGJlIHJlY29uZmlndXJlZCAqLwotICBmb3IgKHVpbnQxNl90IGNpZCA6IGxjaWRzKSB7Ci0gICAgTDJDQVBfVFJBQ0VfQVBJKCIgY2lkOiAlZCIsIGNpZCk7Ci0gICAgcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChOVUxMLCBjaWQpOwotICAgIGlmICghcF9jY2IpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIk1pc3NpbmcgY2lkPyAiIDw8IGludChjaWQpOwotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQotICAgIHBfY2NiLT5yZWNvbmZpZ19zdGFydGVkID0gdHJ1ZTsKLSAgfQotCi0gIHRMMkNfTENCKiBwX2xjYiA9IHBfY2NiLT5wX2xjYjsKLQotICAvKiBIYWNrIHdhcm5pbmcgLSB0aGUgd2hvbGUgcmVjb25maWcgd2UgYXJlIGRvaW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdAotICAgKiBwX2NjYi4gSW4gdGhlIHBfbGNwIHdlIHN0b3JlIGNvbmZpZ3VyYXRpb24gYW5kIGNpZCBpbiB3aGljaCBjb250ZXh0IHdlIGFyZQotICAgKiBkb2luZyByZWNvbmZpZ3VyYXRpb24uCi0gICAqLwotICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7IHBfY2NiID0gcF9jY2ItPnBfbmV4dF9jY2IpCi0gICAgaWYgKChwX2NjYi0+aW5fdXNlKSAmJiAocF9jY2ItPmVjb2MpICYmIChwX2NjYi0+cmVjb25maWdfc3RhcnRlZCkpIHsKLSAgICAgIHBfY2NiLT5wX2xjYi0+cGVuZGluZ19lY29jX3JlY29uZmlnX2NmZyA9ICpwX2NmZzsKLSAgICAgIHBfY2NiLT5wX2xjYi0+cGVuZGluZ19lY29jX3JlY29uZmlnX2NudCA9IGxjaWRzLnNpemUoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SRVEsIHBfY2ZnKTsKLQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9EaXNjb25uZWN0UmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIaWdoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBkaXNjb25uZWN0IGEgY2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZGlzY29ubmVjdCBzZW50LCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9EaXNjb25uZWN0UmVxKHVpbnQxNl90IGNpZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Rpc2Nvbm5lY3RSZXEoY2lkKTsKLSAgfQotCi0gIHRMMkNfQ0NCKiBwX2NjYjsKLQotICAvKiBGaW5kIHRoZSBjaGFubmVsIGNvbnRyb2wgYmxvY2suIFdlIGRvbid0IGtub3cgdGhlIGxpbmsgaXQgaXMgb24uICovCi0gIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQoTlVMTCwgY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICBMT0dfV0FSTigiTDJDQVAgLSBubyBDQ0IgZm9yIEwyQ0FfZGlzY19yZXEsIENJRDogJWQiLCBjaWQpOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgTE9HX0RFQlVHKCJMMkNBUCBMb2NhbCBkaXNjb25uZWN0IHJlcXVlc3QgQ0lEOiAweCUwNHgiLCBjaWQpOwotCi0gIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfRElTQ09OTkVDVF9SRVEsIE5VTEwpOwotCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLWJvb2wgTDJDQV9EaXNjb25uZWN0TEVDb2NSZXEodWludDE2X3QgY2lkKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGlzY29ubmVjdExFQ29jUmVxKGNpZCk7Ci0gIH0KLSAgcmV0dXJuIEwyQ0FfRGlzY29ubmVjdFJlcShjaWQpOwotfQotCi1ib29sIEwyQ0FfR2V0UmVtb3RlQ2lkKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90KiByY2lkKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfR2V0UmVtb3RlQ2lkKGxjaWQsIHJjaWQpOwotICB9Ci0KLSAgdEwyQ19DQ0IqIGNvbnRyb2xfYmxvY2sgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChOVUxMLCBsY2lkKTsKLSAgaWYgKCFjb250cm9sX2Jsb2NrKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHJjaWQpICpyY2lkID0gY29udHJvbF9ibG9jay0+cmVtb3RlX2NpZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBpZGxlIHRpbWVvdXQgZm9yCi0gKiAgICAgICAgICAgICAgICAgIGEgY29ubmVjdGlvbi4gVGhlICJpZGxlIHRpbWVvdXQiIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIGEgY29ubmVjdGlvbiBjYW4gcmVtYWluIHVwIHdpdGggbm8gTDJDQVAgY2hhbm5lbHMgb24gaXQuCi0gKiAgICAgICAgICAgICAgICAgIEEgdGltZW91dCBvZiB6ZXJvIG1lYW5zIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSB0b3JuCi0gKiAgICAgICAgICAgICAgICAgIGRvd24gaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGFzdCBjaGFubmVsIGlzIHJlbW92ZWQuCi0gKiAgICAgICAgICAgICAgICAgIEEgdGltZW91dCBvZiAweEZGRkYgbWVhbnMgbm8gdGltZW91dC4gVmFsdWVzIGFyZSBpbiBzZWNvbmRzLgotICogICAgICAgICAgICAgICAgICBBIGJkX2FkZHIgaXMgdGhlIHJlbW90ZSBCRCBhZGRyZXNzLiBJZiBiZF9hZGRyID0KLSAqICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzczo6a0FueSwgdGhlbiB0aGUgaWRsZSB0aW1lb3V0cyBmb3IgYWxsIGFjdGl2ZQotICogICAgICAgICAgICAgICAgICBsMmNhcCBsaW5rcyB3aWxsIGJlIGNoYW5nZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNvbW1hbmQgc3VjY2VlZGVkLCBmYWxzZSBpZiBmYWlsZWQKLSAqCi0gKiBOT1RFICAgICAgICAgICAgIFRoaXMgdGltZW91dCBhcHBsaWVzIHRvIGFsbCBsb2dpY2FsIGNoYW5uZWxzIGFjdGl2ZSBvbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgQUNMIGxpbmsuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcihiZF9hZGRyLCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiOwotCi0gIGlmIChSYXdBZGRyZXNzOjprQW55ICE9IGJkX2FkZHIpIHsKLSAgICBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZF9hZGRyLCB0cmFuc3BvcnQpOwotICAgIGlmICgocF9sY2IpICYmIChwX2xjYi0+aW5fdXNlKSAmJiAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RFRCkpIHsKLSAgICAgIHBfbGNiLT5pZGxlX3RpbWVvdXQgPSB0aW1lb3V0OwotCi0gICAgICBpZiAoIXBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2IpIGwyY3Vfbm9fZHluYW1pY19jY2JzKHBfbGNiKTsKLSAgICB9IGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgeHg7Ci0gICAgdEwyQ19MQ0IqIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07Ci0KLSAgICBmb3IgKHh4ID0gMDsgeHggPCBNQVhfTDJDQVBfTElOS1M7IHh4KyssIHBfbGNiKyspIHsKLSAgICAgIGlmICgocF9sY2ItPmluX3VzZSkgJiYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQpKSB7Ci0gICAgICAgIHBfbGNiLT5pZGxlX3RpbWVvdXQgPSB0aW1lb3V0OwotCi0gICAgICAgIGlmICghcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYikgbDJjdV9ub19keW5hbWljX2NjYnMocF9sY2IpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBMMkNBUC4gSWYgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiAweEZGLCBpdCBzaW1wbHkgcmVhZHMgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgbmV3IChjdXJyZW50KSB0cmFjZSBsZXZlbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEwyQ0FfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBpZiAobmV3X2xldmVsICE9IDB4RkYpIGwyY2IubDJjYXBfdHJhY2VfbGV2ZWwgPSBuZXdfbGV2ZWw7Ci0KLSAgcmV0dXJuIChsMmNiLmwyY2FwX3RyYWNlX2xldmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0QWNsUHJpb3JpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgdGhlIHRyYW5zbWlzc2lvbiBwcmlvcml0eSBmb3IgYSBjaGFubmVsLgotICogICAgICAgICAgICAgICAgICAoRm9yIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb25seSB0d28gdmFsdWVzIGFyZSB2YWxpZC4KLSAqICAgICAgICAgICAgICAgICAgTDJDQVBfUFJJT1JJVFlfTk9STUFMIGFuZCBMMkNBUF9QUklPUklUWV9ISUdIKS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYSB2YWxpZCBjaGFubmVsLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9TZXRBY2xQcmlvcml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0TDJDQVBfUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9TZXRBY2xQcmlvcml0eShiZF9hZGRyLCBwcmlvcml0eSk7Ci0gIH0KLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IGJkX2FkZHIKLSAgICAgICAgICA8PCAiLCBwcmlvcml0eTogIiA8PCBzdGQ6OnRvX3N0cmluZyhwcmlvcml0eSk7Ci0gIHJldHVybiAobDJjdV9zZXRfYWNsX3ByaW9yaXR5KGJkX2FkZHIsIHByaW9yaXR5LCBmYWxzZSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9TZXRUeFByaW9yaXR5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXRzIHRoZSB0cmFuc21pc3Npb24gcHJpb3JpdHkgZm9yIGEgY2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYSB2YWxpZCBjaGFubmVsLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgTDJDQV9TZXRUeFByaW9yaXR5KHVpbnQxNl90IGNpZCwgdEwyQ0FQX0NITkxfUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9TZXRUeFByaW9yaXR5KGNpZCwgcHJpb3JpdHkpOwotICB9Ci0KLSAgdEwyQ19DQ0IqIHBfY2NiOwotCi0gIEwyQ0FQX1RSQUNFX0FQSSgiTDJDQV9TZXRUeFByaW9yaXR5KCkgIENJRDogMHglMDR4LCBwcmlvcml0eTolZCIsIGNpZCwKLSAgICAgICAgICAgICAgICAgIHByaW9yaXR5KTsKLQotICAvKiBGaW5kIHRoZSBjaGFubmVsIGNvbnRyb2wgYmxvY2suIFdlIGRvbid0IGtub3cgdGhlIGxpbmsgaXQgaXMgb24uICovCi0gIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQoTlVMTCwgY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIENDQiBmb3IgTDJDQV9TZXRUeFByaW9yaXR5LCBDSUQ6ICVkIiwgY2lkKTsKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQotCi0gIC8qIGl0IHdpbGwgdXBkYXRlIHRoZSBvcmRlciBvZiBDQ0IgaW4gTENCIGJ5IHByaW9yaXR5IGFuZCB1cGRhdGUgcm91bmQgcm9iaW4KLSAgICogc2VydmljZSB2YXJpYWJsZXMgKi8KLSAgbDJjdV9jaGFuZ2VfcHJpX2NjYihwX2NjYiwgcHJpb3JpdHkpOwotCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICAgTDJDQV9HZXRQZWVyRmVhdHVyZXMKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgICBHZXQgYSBwZWVycyBmZWF0dXJlcyBhbmQgZml4ZWQgY2hhbm5lbCBtYXAKLSAqCi0gKiAgUGFyYW1ldGVyczogICAgICBCRCBhZGRyZXNzIG9mIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgICBQb2ludGVycyB0byBmZWF0dXJlcyBhbmQgY2hhbm5lbCBtYXNrIHN0b3JhZ2UgYXJlYQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgIHRydWUgaWYgcGVlciBpcyBjb25uZWN0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX0dldFBlZXJGZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCogcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRQZWVyRmVhdHVyZXMoYmRfYWRkciwgcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NobmxfbWFzayk7Ci0gIH0KLQotICB0TDJDX0xDQiogcF9sY2I7Ci0KLSAgLyogV2UgbXVzdCBhbHJlYWR5IGhhdmUgYSBsaW5rIHRvIHRoZSByZW1vdGUgKi8KLSAgcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIoYmRfYWRkciwgQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gIGlmIChwX2xjYiA9PSBOVUxMKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgTm8gQkRBOiAiIDw8IGJkX2FkZHI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiIEJEQTogIiA8PCBiZF9hZGRyCi0gICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgRXh0RmVhOiAweCUwOHggQ2hubF9NYXNrWzBdOiAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xjYi0+cGVlcl9leHRfZmVhLCBwX2xjYi0+cGVlcl9jaG5sX21hc2tbMF0pOwotCi0gICpwX2V4dF9mZWF0ID0gcF9sY2ItPnBlZXJfZXh0X2ZlYTsKLQotICBtZW1jcHkocF9jaG5sX21hc2ssIHBfbGNiLT5wZWVyX2NobmxfbWFzaywgTDJDQVBfRklYRURfQ0hOTF9BUlJBWV9TSVpFKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgIEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgIFJlZ2lzdGVyIGEgZml4ZWQgY2hhbm5lbC4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEZpeGVkIENoYW5uZWwgIwotICogICAgICAgICAgICAgICAgICBDaGFubmVsIENhbGxiYWNrcyBhbmQgY29uZmlnCi0gKgotICogIFJldHVybiB2YWx1ZTogICAtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdGQ6OnN0cmluZyBmaXhlZF9jaGFubmVsX3RleHQoY29uc3QgdWludDE2X3QmIGZpeGVkX2NpZCkgewotICBzd2l0Y2ggKGZpeGVkX2NpZCkgewotICAgIGNhc2UgTDJDQVBfU0lHTkFMTElOR19DSUQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImJyX2VkciBzaWduYWxsaW5nIik7Ci0gICAgY2FzZSBMMkNBUF9DT05ORUNUSU9OTEVTU19DSUQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImNvbm5lY3Rpb25sZXNzIik7Ci0gICAgY2FzZSBMMkNBUF9BTVBfQ0lEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJhbXAiKTsKLSAgICBjYXNlIEwyQ0FQX0FUVF9DSUQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoImF0dCIpOwotICAgIGNhc2UgTDJDQVBfQkxFX1NJR05BTExJTkdfQ0lEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJibGUgc2lnbmFsbGluZyIpOwotICAgIGNhc2UgTDJDQVBfU01QX0NJRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygic21wIik7Ci0gICAgY2FzZSBMMkNBUF9TTVBfQlJfQ0lEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJicl9lZHIgc21wIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygidW5rbm93biIpOwotICB9Ci19Ci0KLWJvb2wgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbCh1aW50MTZfdCBmaXhlZF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0ZJWEVEX0NITkxfUkVHKiBwX2ZyZWcpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbChmaXhlZF9jaWQsIHBfZnJlZyk7Ci0gIH0KLQotICBpZiAoKGZpeGVkX2NpZCA8IEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwpIHx8Ci0gICAgICAoZml4ZWRfY2lkID4gTDJDQVBfTEFTVF9GSVhFRF9DSE5MKSkgewotICAgIExPR19FUlJPUigiSW52YWxpZCBmaXhlZCBDSUQ6IDB4JTA0eCIsIGZpeGVkX2NpZCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbDJjYi5maXhlZF9yZWdbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0gPSAqcF9mcmVnOwotICBMT0dfREVCVUcoIlJlZ2lzdGVyZWQgZml4ZWQgY2hhbm5lbDolcyIsCi0gICAgICAgICAgICBmaXhlZF9jaGFubmVsX3RleHQoZml4ZWRfY2lkKS5jX3N0cigpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICBMMkNBX0Nvbm5lY3RGaXhlZENobmwKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgIENvbm5lY3QgYW4gZml4ZWQgc2lnbmFsbGluZyBjaGFubmVsIHRvIGEgcmVtb3RlIGRldmljZS4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEZpeGVkIENJRAotICogICAgICAgICAgICAgICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiBjb25uZWN0aW9uIHN0YXJ0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX0Nvbm5lY3RGaXhlZENobmwodWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfQ29ubmVjdEZpeGVkQ2hubChmaXhlZF9jaWQsIHJlbV9iZGEpOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0KLSAgTE9HX0RFQlVHKCIgZml4ZWRfY2lkOjB4JTA0eCIsIGZpeGVkX2NpZCk7Ci0KLSAgLy8gQ2hlY2sgQ0lEIGlzIHZhbGlkIGFuZCByZWdpc3RlcmVkCi0gIGlmICgoZml4ZWRfY2lkIDwgTDJDQVBfRklSU1RfRklYRURfQ0hOTCkgfHwKLSAgICAgIChmaXhlZF9jaWQgPiBMMkNBUF9MQVNUX0ZJWEVEX0NITkwpIHx8Ci0gICAgICAobDJjYi5maXhlZF9yZWdbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0ucEwyQ0FfRml4ZWREYXRhX0NiID09Ci0gICAgICAgTlVMTCkpIHsKLSAgICBMT0dfRVJST1IoIkludmFsaWQgZml4ZWRfY2lkOjB4JTA0eCIsIGZpeGVkX2NpZCk7Ci0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIH0KLQotICAvLyBGYWlsIGlmIEJUIGlzIG5vdCB5ZXQgdXAKLSAgaWYgKCFCVE1fSXNEZXZpY2VVcCgpKSB7Ci0gICAgTE9HX1dBUk4oIkJ0IGNvbnRyb2xsZXIgaXMgbm90IHJlYWR5IGZpeGVkX2NpZDoweCUwNHgiLCBmaXhlZF9jaWQpOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgaWYgKGZpeGVkX2NpZCA+PSBMMkNBUF9BVFRfQ0lEICYmIGZpeGVkX2NpZCA8PSBMMkNBUF9TTVBfQ0lEKQotICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLQotICB0TDJDX0JMRV9GSVhFRF9DSE5MU19NQVNLIHBlZXJfY2hhbm5lbF9tYXNrOwotCi0gIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhIGxpbmsgdG8gdGhlIHJlbW90ZSwgY2hlY2sgaWYgaXQgc3VwcG9ydHMgdGhhdCBDSUQKLSAgcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocmVtX2JkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfbGNiICE9IE5VTEwpIHsKLSAgICAvLyBGaXhlZCBjaGFubmVscyBhcmUgbWFuZGF0b3J5IG9uIExFIHRyYW5zcG9ydHMgc28gaWdub3JlIHRoZSByZWNlaXZlZAotICAgIC8vIGNoYW5uZWwgbWFzayBhbmQgdXNlIHRoZSBsb2NhbGx5IGNhY2hlZCBMRSBjaGFubmVsIG1hc2suCi0KLSAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkKLSAgICAgIHBlZXJfY2hhbm5lbF9tYXNrID0gbDJjYi5sMmNfYmxlX2ZpeGVkX2NobmxzX21hc2s7Ci0gICAgZWxzZQotICAgICAgcGVlcl9jaGFubmVsX21hc2sgPSBwX2xjYi0+cGVlcl9jaG5sX21hc2tbMF07Ci0KLSAgICAvLyBDaGVjayBmb3Igc3VwcG9ydGVkIGNoYW5uZWwKLSAgICBpZiAoIShwZWVyX2NoYW5uZWxfbWFzayAmICgxIDw8IGZpeGVkX2NpZCkpKSB7Ci0gICAgICBMT0dfSU5GTygiUGVlciBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBmaXhlZF9jaWQ6MHglMDR4IiwgZml4ZWRfY2lkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgYSBDQ0IgYW5kIGxpbmsgdGhlIGxjYiB0byBpdAotICAgIGlmICghbDJjdV9pbml0aWFsaXplX2ZpeGVkX2NjYihwX2xjYiwgZml4ZWRfY2lkKSkgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBhbGxvY2F0ZSBmaXhlZCBjaGFubmVsIHJlc291cmNlIGZpeGVkX2NpZDoweCUwNHgiLAotICAgICAgICAgICAgICAgZml4ZWRfY2lkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyByYWNpbmcgd2l0aCBkaXNjb25uZWN0aW5nLCBxdWV1ZSB0aGUgY29ubmVjdGlvbiByZXF1ZXN0Ci0gICAgaWYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9ESVNDT05ORUNUSU5HKSB7Ci0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIkxpbmsgaXMgZGlzY29ubmVjdGluZyBzbyBkZWZlcnJpbmcgY29ubmVjdGlvbiBmaXhlZF9jaWQ6MHglMDR4IiwKLSAgICAgICAgICBmaXhlZF9jaWQpOwotICAgICAgLyogU2F2ZSBjY2Igc28gaXQgY2FuIGJlIHN0YXJ0ZWQgYWZ0ZXIgZGlzY29ubmVjdCBpcyBmaW5pc2hlZCAqLwotICAgICAgcF9sY2ItPnBfcGVuZGluZ19jY2IgPQotICAgICAgICAgIHBfbGNiLT5wX2ZpeGVkX2NjYnNbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF07Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAoKmwyY2IuZml4ZWRfcmVnW2ZpeGVkX2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdLnBMMkNBX0ZpeGVkQ29ubl9DYikoCi0gICAgICAgIGZpeGVkX2NpZCwgcF9sY2ItPnJlbW90ZV9iZF9hZGRyLCB0cnVlLCAwLCBwX2xjYi0+dHJhbnNwb3J0KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIE5vIGxpbmsuIEdldCBhbiBMQ0IgYW5kIHN0YXJ0IGxpbmsgZXN0YWJsaXNobWVudAotICBwX2xjYiA9IGwyY3VfYWxsb2NhdGVfbGNiKHJlbV9iZGEsIGZhbHNlLCB0cmFuc3BvcnQpOwotICBpZiAocF9sY2IgPT0gTlVMTCkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gYWxsb2NhdGUgbGluayByZXNvdXJjZSBmb3IgY29ubmVjdGlvbiBmaXhlZF9jaWQ6MHglMDR4IiwKLSAgICAgICAgICAgICBmaXhlZF9jaWQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEdldCBhIENDQiBhbmQgbGluayB0aGUgbGNiIHRvIGl0Ci0gIGlmICghbDJjdV9pbml0aWFsaXplX2ZpeGVkX2NjYihwX2xjYiwgZml4ZWRfY2lkKSkgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gYWxsb2NhdGUgZml4ZWQgY2hhbm5lbCByZXNvdXJjZSBmaXhlZF9jaWQ6MHglMDR4IiwKLSAgICAgICAgICAgICBmaXhlZF9jaWQpOwotICAgIGwyY3VfcmVsZWFzZV9sY2IocF9sY2IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgYm9vbCByZXQgPSBsMmN1X2NyZWF0ZV9jb25uX2xlKHBfbGNiKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBjcmVhdGUgZml4ZWQgY2hhbm5lbCBsZSBjb25uZWN0aW9uIGZpeGVkX2NpZDoweCUwNHgiLAotICAgICAgICAgICAgICAgZml4ZWRfY2lkKTsKLSAgICAgIGwyY3VfcmVsZWFzZV9sY2IocF9sY2IpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBsMmN1X2NyZWF0ZV9jb25uX2JyX2VkcihwX2xjYik7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZ1bmN0aW9uICAgICAgICBMMkNBX1NlbmRGaXhlZENobmxEYXRhCi0gKgotICogIERlc2NyaXB0aW9uICAgICBXcml0ZSBkYXRhIG9uIGEgZml4ZWQgY2hhbm5lbC4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIEZpeGVkIENJRAotICogICAgICAgICAgICAgICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICogICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1ZmZlciBvZiB0eXBlIEJUX0hEUgotICoKLSAqIFJldHVybiB2YWx1ZSAgICAgTDJDQVBfRFdfU1VDQ0VTUywgaWYgZGF0YSBhY2NlcHRlZAotICogICAgICAgICAgICAgICAgICBMMkNBUF9EV19GQUlMRUQsICBpZiBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBMMkNBX1NlbmRGaXhlZENobmxEYXRhKHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1NlbmRGaXhlZENobmxEYXRhKGZpeGVkX2NpZCwgcmVtX2JkYSwgcF9idWYpOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0KLSAgaWYgKGZpeGVkX2NpZCA+PSBMMkNBUF9BVFRfQ0lEICYmIGZpeGVkX2NpZCA8PSBMMkNBUF9TTVBfQ0lEKQotICAgIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLQotICBpZiAoKGZpeGVkX2NpZCA8IEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwpIHx8Ci0gICAgICAoZml4ZWRfY2lkID4gTDJDQVBfTEFTVF9GSVhFRF9DSE5MKSB8fAotICAgICAgKGwyY2IuZml4ZWRfcmVnW2ZpeGVkX2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdLnBMMkNBX0ZpeGVkRGF0YV9DYiA9PQotICAgICAgIE5VTEwpKSB7Ci0gICAgTE9HX1dBUk4oIk5vIHNlcnZpY2UgcmVnaXN0ZXJlZCBvciBpbnZhbGlkIENJRDogMHglMDR4IiwgZml4ZWRfY2lkKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIChMMkNBUF9EV19GQUlMRUQpOwotICB9Ci0KLSAgaWYgKCFCVE1fSXNEZXZpY2VVcCgpKSB7Ci0gICAgTE9HX1dBUk4oIkNvbnRyb2xsZXIgaXMgbm90IHJlYWR5IENJRDogMHglMDR4IiwgZml4ZWRfY2lkKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIChMMkNBUF9EV19GQUlMRUQpOwotICB9Ci0KLSAgcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocmVtX2JkYSwgdHJhbnNwb3J0KTsKLSAgaWYgKHBfbGNiID09IE5VTEwgfHwgcF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0RJU0NPTk5FQ1RJTkcpIHsKLSAgICAvKiBpZiBsaW5rIGlzIGRpc2Nvbm5lY3RpbmcsIGFsc28gcmVwb3J0IGRhdGEgc2VuZGluZyBmYWlsdXJlICovCi0gICAgTE9HX1dBUk4oIkxpbmsgaXMgZGlzY29ubmVjdGluZyBvciBkb2VzIG5vdCBleGlzdCBDSUQ6IDB4JTA0eCIsIGZpeGVkX2NpZCk7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybiAoTDJDQVBfRFdfRkFJTEVEKTsKLSAgfQotCi0gIHRMMkNfQkxFX0ZJWEVEX0NITkxTX01BU0sgcGVlcl9jaGFubmVsX21hc2s7Ci0KLSAgLy8gU2VsZWN0IHBlZXIgY2hhbm5lbHMgbWFzayB0byB1c2UgZGVwZW5kaW5nIG9uIHRyYW5zcG9ydAotICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkKLSAgICBwZWVyX2NoYW5uZWxfbWFzayA9IGwyY2IubDJjX2JsZV9maXhlZF9jaG5sc19tYXNrOwotICBlbHNlCi0gICAgcGVlcl9jaGFubmVsX21hc2sgPSBwX2xjYi0+cGVlcl9jaG5sX21hc2tbMF07Ci0KLSAgaWYgKChwZWVyX2NoYW5uZWxfbWFzayAmICgxIDw8IGZpeGVkX2NpZCkpID09IDApIHsKLSAgICBMT0dfV0FSTigiUGVlciBkb2VzIG5vdCBzdXBwb3J0IGZpeGVkIGNoYW5uZWwgQ0lEOiAweCUwNHgiLCBmaXhlZF9jaWQpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm4gKEwyQ0FQX0RXX0ZBSUxFRCk7Ci0gIH0KLQotICBwX2J1Zi0+ZXZlbnQgPSAwOwotICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBMMkNBUF9GTFVTSEFCTEVfQ0hfQkFTRUQ7Ci0KLSAgaWYgKCFwX2xjYi0+cF9maXhlZF9jY2JzW2ZpeGVkX2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdKSB7Ci0gICAgaWYgKCFsMmN1X2luaXRpYWxpemVfZml4ZWRfY2NiKHBfbGNiLCBmaXhlZF9jaWQpKSB7Ci0gICAgICBMT0dfV0FSTigiTm8gY2hhbm5lbCBjb250cm9sIGJsb2NrIGZvdW5kIGZvciBDSUQ6IDB4JTR4IiwgZml4ZWRfY2lkKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybiAoTDJDQVBfRFdfRkFJTEVEKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocF9sY2ItPnBfZml4ZWRfY2Nic1tmaXhlZF9jaWQgLSBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MXS0+Y29uZ19zZW50KSB7Ci0gICAgTE9HX1dBUk4oCi0gICAgICAgICJVbmFibGUgdG8gc2VuZCBkYXRhIGR1ZSB0byBjb25nZXN0aW9uIENJRDogMHglMDR4IHhtaXRfaG9sZF9xLmNvdW50OiAiCi0gICAgICAgICIlenUgYnVmZl9xdW90YTogJXUiLAotICAgICAgICBmaXhlZF9jaWQsCi0gICAgICAgIGZpeGVkX3F1ZXVlX2xlbmd0aCgKLSAgICAgICAgICAgIHBfbGNiLT5wX2ZpeGVkX2NjYnNbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0KLSAgICAgICAgICAgICAgICAtPnhtaXRfaG9sZF9xKSwKLSAgICAgICAgcF9sY2ItPnBfZml4ZWRfY2Nic1tmaXhlZF9jaWQgLSBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MXS0+YnVmZl9xdW90YSk7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybiAoTDJDQVBfRFdfRkFJTEVEKTsKLSAgfQotCi0gIExPR19ERUJVRygiRW5xdWV1ZWQgZGF0YSBmb3IgQ0lEOiAweCUwNHggbGVuOiVodSIsIGZpeGVkX2NpZCwgcF9idWYtPmxlbik7Ci0gIGwyY19lbnF1ZXVlX3BlZXJfZGF0YShwX2xjYi0+cF9maXhlZF9jY2JzW2ZpeGVkX2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgTlVMTCk7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgbm8gZHluYW1pYyBDQ0Igb24gdGhlIGxpbmssIHJlc3RhcnQgdGhlIGlkbGUgdGltZXIgZWFjaCB0aW1lCi0gIC8vIHNvbWV0aGluZyBpcyBzZW50Ci0gIGlmIChwX2xjYi0+aW5fdXNlICYmIHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQgJiYKLSAgICAgICFwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiKSB7Ci0gICAgbDJjdV9ub19keW5hbWljX2NjYnMocF9sY2IpOwotICB9Ci0KLSAgaWYgKHBfbGNiLT5wX2ZpeGVkX2NjYnNbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0tPmNvbmdfc2VudCkgewotICAgIExPR19ERUJVRygiTGluayBjb25nZXN0ZWQgZm9yIENJRDogMHglMDR4IiwgZml4ZWRfY2lkKTsKLSAgICByZXR1cm4gKEwyQ0FQX0RXX0NPTkdFU1RFRCk7Ci0gIH0KLQotICByZXR1cm4gKEwyQ0FQX0RXX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgTDJDQV9SZW1vdmVGaXhlZENobmwKLSAqCi0gKiAgRGVzY3JpcHRpb24gICAgIFJlbW92ZSBhIGZpeGVkIGNoYW5uZWwgdG8gYSByZW1vdGUgZGV2aWNlLgotICoKLSAqICBQYXJhbWV0ZXJzOiAgICAgRml4ZWQgQ0lECi0gKiAgICAgICAgICAgICAgICAgIEJEIEFkZHJlc3Mgb2YgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIElkbGUgdGltZW91dCB0byB1c2UgKG9yIDB4RkZGRiBpZiBkb24ndCBjYXJlKQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiBjaGFubmVsIHJlbW92ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX1JlbW92ZUZpeGVkQ2hubCh1aW50MTZfdCBmaXhlZF9jaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZW1vdmVGaXhlZENobmwoZml4ZWRfY2lkLCByZW1fYmRhKTsKLSAgfQotCi0gIHRMMkNfTENCKiBwX2xjYjsKLSAgdEwyQ19DQ0IqIHBfY2NiOwotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0KLSAgLyogQ2hlY2sgQ0lEIGlzIHZhbGlkIGFuZCByZWdpc3RlcmVkICovCi0gIGlmICgoZml4ZWRfY2lkIDwgTDJDQVBfRklSU1RfRklYRURfQ0hOTCkgfHwKLSAgICAgIChmaXhlZF9jaWQgPiBMMkNBUF9MQVNUX0ZJWEVEX0NITkwpIHx8Ci0gICAgICAobDJjYi5maXhlZF9yZWdbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0ucEwyQ0FfRml4ZWREYXRhX0NiID09Ci0gICAgICAgTlVMTCkpIHsKLSAgICBMMkNBUF9UUkFDRV9FUlJPUigiTDJDQV9SZW1vdmVGaXhlZENobmwoKSAgSW52YWxpZCBDSUQ6IDB4JTA0eCIsIGZpeGVkX2NpZCk7Ci0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIH0KLQotICBpZiAoZml4ZWRfY2lkID49IEwyQ0FQX0FUVF9DSUQgJiYgZml4ZWRfY2lkIDw9IEwyQ0FQX1NNUF9DSUQpCi0gICAgdHJhbnNwb3J0ID0gQlRfVFJBTlNQT1JUX0xFOwotCi0gIC8qIElzIGEgZml4ZWQgY2hhbm5lbCBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBCREEgPyovCi0gIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKHJlbV9iZGEsIHRyYW5zcG9ydCk7Ci0KLSAgaWYgKCgocF9sY2IpID09IE5VTEwpIHx8Ci0gICAgICAoIXBfbGNiLT5wX2ZpeGVkX2NjYnNbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0pKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHJlbV9iZGEKLSAgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgQ0lEOiAweCUwNHggbm90IGNvbm5lY3RlZCIsIGZpeGVkX2NpZCk7Ci0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIH0KLQotICBWTE9HKDIpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHJlbV9iZGEKLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiBDSUQ6IDB4JTA0eCIsIGZpeGVkX2NpZCk7Ci0KLSAgLyogUmVsZWFzZSB0aGUgQ0NCLCBzdGFydGluZyBhbiBpbmFjdGl2aXR5IHRpbWVvdXQgb24gdGhlIExDQiBpZiBubyBvdGhlciBDQ0JzCi0gICAqIGV4aXN0ICovCi0gIHBfY2NiID0gcF9sY2ItPnBfZml4ZWRfY2Nic1tmaXhlZF9jaWQgLSBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MXTsKLQotICBwX2xjYi0+cF9maXhlZF9jY2JzW2ZpeGVkX2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdID0gTlVMTDsKLSAgcF9sY2ItPlNldERpc2Nvbm5lY3RSZWFzb24oSENJX0VSUl9DT05OX0NBVVNFX0xPQ0FMX0hPU1QpOwotCi0gIC8vIFJldGFpbiB0aGUgbGluayBmb3IgYSBmZXcgbW9yZSBzZWNvbmRzIGFmdGVyIFNNUCBwYWlyaW5nIGlzIGRvbmUsIHNpbmNlCi0gIC8vIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGFsd2F5cyBkb2VzIHNlcnZpY2UgZGlzY292ZXJ5IGFmdGVyIHBhaXJpbmcgaXMKLSAgLy8gY29tcGxldGUuIFRoaXMgd2lsbCBhdm9pZCB0aGUgbGluayBkb3duIChwYWlyaW5nIGlzIGNvbXBsZXRlKSBhbmQgYW4KLSAgLy8gaW1tZWRpYXRlIHJlLWNvbm5lY3Rpb24gZm9yIHNlcnZpY2UgZGlzY292ZXJ5LgotICAvLyBTb21lIGRldmljZXMgZG8gbm90IGRvIGF1dG8gYWR2ZXJ0aXNpbmcgd2hlbiBsaW5rIGlzIGRyb3BwZWQsIHRodXMgZmFpbAotICAvLyB0aGUgc2Vjb25kIGNvbm5lY3Rpb24gYW5kIHNlcnZpY2UgZGlzY292ZXJ5LgotICBpZiAoKGZpeGVkX2NpZCA9PSBMMkNBUF9BVFRfQ0lEKSAmJiAhcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYikKLSAgICBwX2xjYi0+aWRsZV90aW1lb3V0ID0gMDsKLQotICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9TZXRMZUdhdHRUaW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBIaWdoZXIgbGF5ZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGlkbGUgdGltZW91dCBmb3IKLSAqICAgICAgICAgICAgICAgICAgYSBmaXhlZCBjaGFubmVsLiBUaGUgImlkbGUgdGltZW91dCIgaXMgdGhlIGFtb3VudCBvZiB0aW1lCi0gKiAgICAgICAgICAgICAgICAgIHRoYXQgYSBjb25uZWN0aW9uIGNhbiByZW1haW4gdXAgd2l0aCBubyBMMkNBUCBjaGFubmVscyBvbgotICogICAgICAgICAgICAgICAgICBpdC4gQSB0aW1lb3V0IG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHRvcm4KLSAqICAgICAgICAgICAgICAgICAgZG93biBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXN0IGNoYW5uZWwgaXMgcmVtb3ZlZC4KLSAqICAgICAgICAgICAgICAgICAgQSB0aW1lb3V0IG9mIDB4RkZGRiBtZWFucyBubyB0aW1lb3V0LiBWYWx1ZXMgYXJlIGluIHNlY29uZHMuCi0gKiAgICAgICAgICAgICAgICAgIEEgYmRfYWRkciBpcyB0aGUgcmVtb3RlIEJEIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGNvbW1hbmQgc3VjY2VlZGVkLCBmYWxzZSBpZiBmYWlsZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX1NldExlR2F0dFRpbWVvdXQoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDE2X3QgaWRsZV90b3V0KSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfU2V0TGVHYXR0VGltZW91dChyZW1fYmRhLCBpZGxlX3RvdXQpOwotICB9Ci0KLSAgY29uc3RleHByIHVpbnQxNl90IGtBdHRDaWQgPSA0OwotCi0gIC8qIElzIGEgZml4ZWQgY2hhbm5lbCBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBCREEgPyovCi0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihyZW1fYmRhLCBCVF9UUkFOU1BPUlRfTEUpOwotICBpZiAoKChwX2xjYikgPT0gTlVMTCkgfHwKLSAgICAgICghcF9sY2ItPnBfZml4ZWRfY2Nic1trQXR0Q2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0pKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHJlbV9iZGEKLSAgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgQ0lEOiAweCUwNHggbm90IGNvbm5lY3RlZCIsIGtBdHRDaWQpOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgcF9sY2ItPnBfZml4ZWRfY2Nic1trQXR0Q2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0tPmZpeGVkX2NobmxfaWRsZV90b3V0ID0KLSAgICAgIGlkbGVfdG91dDsKLQotICBpZiAocF9sY2ItPmluX3VzZSAmJiBwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfQ09OTkVDVEVEICYmCi0gICAgICAhcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYikgewotICAgIC8qIElmIHRoZXJlIGFyZSBubyBkeW5hbWljIENDQnMsIChyZSlzdGFydCB0aGUgaWRsZSB0aW1lciBpbiBjYXNlIHdlIGNoYW5nZWQKLSAgICAgKiBpdCAqLwotICAgIGwyY3Vfbm9fZHluYW1pY19jY2JzKHBfbGNiKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgTDJDQV9EYXRhV3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEhpZ2hlciBsYXllcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEuCi0gKgotICogUmV0dXJucyAgICAgICAgICBMMkNBUF9EV19TVUNDRVNTLCBpZiBkYXRhIGFjY2VwdGVkLCBlbHNlIGZhbHNlCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQX0RXX0NPTkdFU1RFRCwgaWYgZGF0YSBhY2NlcHRlZCBhbmQgdGhlIGNoYW5uZWwgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgTDJDQVBfRFdfRkFJTEVELCBpZiBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IEwyQ0FfRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9EYXRhV3JpdGUoY2lkLCBwX2RhdGEpOwotICB9Ci0KLSAgTDJDQVBfVFJBQ0VfQVBJKCJMMkNBX0RhdGFXcml0ZSgpICBDSUQ6IDB4JTA0eCAgTGVuOiAlZCIsIGNpZCwgcF9kYXRhLT5sZW4pOwotICByZXR1cm4gbDJjX2RhdGFfd3JpdGUoY2lkLCBwX2RhdGEsIEwyQ0FQX0ZMVVNIQUJMRV9DSF9CQVNFRCk7Ci19Ci0KLXVpbnQ4X3QgTDJDQV9MRUNvY0RhdGFXcml0ZSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfTEVDb2NEYXRhV3JpdGUoY2lkLCBwX2RhdGEpOwotICB9Ci0KLSAgcmV0dXJuIEwyQ0FfRGF0YVdyaXRlKGNpZCwgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGlnaGVyIGxheWVycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IGEgY2hhbm5lbHMKLSAqICAgICAgICAgICAgICAgICAgZmx1c2hhYmlsaXR5IGZsYWdzCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIENJRCBmb3VuZCwgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSh1aW50MTZfdCBjaWQsIGJvb2wgaXNfZmx1c2hhYmxlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiBibHVldG9vdGg6OnNoaW06OkwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eShjaWQsIGlzX2ZsdXNoYWJsZSk7Ci0gIH0KLQotICB0TDJDX0NDQiogcF9jY2I7Ci0KLSAgLyogRmluZCB0aGUgY2hhbm5lbCBjb250cm9sIGJsb2NrLiBXZSBkb24ndCBrbm93IHRoZSBsaW5rIGl0IGlzIG9uLiAqLwotICBwX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKE5VTEwsIGNpZCk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBubyBDQ0IgZm9yIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSwgQ0lEOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaWQpOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgcF9jY2ItPmlzX2ZsdXNoYWJsZSA9IGlzX2ZsdXNoYWJsZTsKLQotICBMMkNBUF9UUkFDRV9BUEkoIkwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSgpICBDSUQ6IDB4JTA0eCAgaXNfZmx1c2hhYmxlOiAlZCIsCi0gICAgICAgICAgICAgICAgICBjaWQsIGlzX2ZsdXNoYWJsZSk7Ci0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgTDJDQV9GbHVzaENoYW5uZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIG5vbmUsIHNvbWUgb3IgYWxsIGJ1ZmZlcnMgcXVldWVkIHVwCi0gKiAgICAgICAgICAgICAgZm9yIHhtaXNzaW9uIGZvciBhIHBhcnRpY3VsYXIgQ0lELiBJZiBjYWxsZWQgd2l0aAotICogICAgICAgICAgICAgIEwyQ0FQX0ZMVVNIX0NIQU5TX0dFVCAoMCksIGl0IHNpbXBseSByZXR1cm5zIHRoZSBudW1iZXIKLSAqICAgICAgICAgICAgICBvZiBidWZmZXJzIHF1ZXVlZCBmb3IgdGhhdCBDSUQgTDJDQVBfRkxVU0hfQ0hBTlNfQUxMICgweGZmZmYpCi0gKiAgICAgICAgICAgICAgZmx1c2hlcyBhbGwgYnVmZmVycy4gIEFsbCBvdGhlciB2YWx1ZXMgc3BlY2lmaWVzIHRoZSBtYXhpbXVtCi0gKiAgICAgICAgICAgICAgYnVmZmVycyB0byBmbHVzaC4KLSAqCi0gKiBSZXR1cm5zICAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMgbGVmdCBxdWV1ZWQgZm9yIHRoYXQgQ0lECi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IEwyQ0FfRmx1c2hDaGFubmVsKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IG51bV90b19mbHVzaCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0ZsdXNoQ2hhbm5lbChsY2lkLCBudW1fdG9fZmx1c2gpOwotICB9Ci0KLSAgdEwyQ19DQ0IqIHBfY2NiOwotICB0TDJDX0xDQiogcF9sY2I7Ci0gIHVpbnQxNl90IG51bV9sZWZ0ID0gMCwgbnVtX2ZsdXNoZWQxID0gMCwgbnVtX2ZsdXNoZWQyID0gMDsKLQotICBwX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKE5VTEwsIGxjaWQpOwotCi0gIGlmICghcF9jY2IgfHwgKHBfY2NiLT5wX2xjYiA9PSBOVUxMKSkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICJMMkNBX0ZsdXNoQ2hhbm5lbCgpICBhYm5vcm1hbGx5IHJldHVybmluZyAwICBDSUQ6IDB4JTA0eCIsIGxjaWQpOwotICAgIHJldHVybiAoMCk7Ci0gIH0KLSAgcF9sY2IgPSBwX2NjYi0+cF9sY2I7Ci0KLSAgaWYgKG51bV90b19mbHVzaCAhPSBMMkNBUF9GTFVTSF9DSEFOU19HRVQpIHsKLSAgICBMMkNBUF9UUkFDRV9BUEkoCi0gICAgICAgICJMMkNBX0ZsdXNoQ2hhbm5lbCAoRkxVU0gpICBDSUQ6IDB4JTA0eCAgTnVtVG9GbHVzaDogJWQgIFFDOiAldSAgIgotICAgICAgICAicEZpcnN0OiAweCUwOHgiLAotICAgICAgICBsY2lkLCBudW1fdG9fZmx1c2gsIGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NjYi0+eG1pdF9ob2xkX3EpLAotICAgICAgICBmaXhlZF9xdWV1ZV90cnlfcGVla19maXJzdChwX2NjYi0+eG1pdF9ob2xkX3EpKTsKLSAgfSBlbHNlIHsKLSAgICBMMkNBUF9UUkFDRV9BUEkoIkwyQ0FfRmx1c2hDaGFubmVsIChRVUVSWSkgIENJRDogMHglMDR4IiwgbGNpZCk7Ci0gIH0KLQotICAvKiBDYW5ub3QgZmx1c2ggZVJUTSBidWZmZXJzIG9uY2UgdGhleSBoYXZlIGEgc2VxdWVuY2UgbnVtYmVyICovCi0gIGlmIChwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgIT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkgewotICAgIGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlciA9IGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpOwotICAgIGlmIChudW1fdG9fZmx1c2ggIT0gTDJDQVBfRkxVU0hfQ0hBTlNfR0VUKSB7Ci0gICAgICAvKiBJZiB0aGUgY29udHJvbGxlciBzdXBwb3J0cyBlbmhhbmNlZCBmbHVzaCwgZmx1c2ggdGhlIGRhdGEgcXVldWVkIGF0IHRoZQotICAgICAgICogY29udHJvbGxlciAqLwotICAgICAgaWYgKGNvbnRyb2xsZXItPnN1cHBvcnRzX25vbl9mbHVzaGFibGVfcGIoKSAmJgotICAgICAgICAgIChCVE1fR2V0TnVtU2NvTGlua3MoKSA9PSAwKSkgewotICAgICAgICAvKiBUaGUgb25seSBwYWNrZXQgdHlwZSBkZWZpbmVkIC0gMCAtIEF1dG9tYXRpY2FsbHktRmx1c2hhYmxlIE9ubHkgKi8KLSAgICAgICAgYnRzbmRfaGNpY19lbmhhbmNlZF9mbHVzaChwX2xjYi0+SGFuZGxlKCksIDApOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEl0ZXJhdGUgdGhvdWdoIGxpc3QgYW5kIGZsdXNoIHRoZSBhbW91bnQgcmVxdWVzdGVkIGZyb20KLSAgICAvLyB0aGUgdHJhbnNtaXQgZGF0YSBxdWV1ZSB0aGF0IHNhdGlzZnkgdGhlIGxheWVyIGFuZCBldmVudCBjb25kaXRpb25zLgotICAgIGZvciAoY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUgPSBsaXN0X2JlZ2luKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xKTsKLSAgICAgICAgIChudW1fdG9fZmx1c2ggPiAwKSAmJiBub2RlICE9IGxpc3RfZW5kKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xKTspIHsKLSAgICAgIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilsaXN0X25vZGUobm9kZSk7Ci0gICAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpOwotICAgICAgaWYgKChwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPT0gMCkgJiYgKHBfYnVmLT5ldmVudCA9PSBsY2lkKSkgewotICAgICAgICBudW1fdG9fZmx1c2gtLTsKLSAgICAgICAgbnVtX2ZsdXNoZWQxKys7Ci0KLSAgICAgICAgbGlzdF9yZW1vdmUocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EsIHBfYnVmKTsKLSAgICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIElmIG5lZWRlZCwgZmx1c2ggYnVmZmVycyBpbiB0aGUgQ0NCIHhtaXQgaG9sZCBxdWV1ZSAqLwotICB3aGlsZSAoKG51bV90b19mbHVzaCAhPSAwKSAmJiAoIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT54bWl0X2hvbGRfcSkpKSB7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT54bWl0X2hvbGRfcSk7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIG51bV90b19mbHVzaC0tOwotICAgIG51bV9mbHVzaGVkMisrOwotICB9Ci0KLSAgLyogSWYgYXBwIG5lZWRzIHRvIHRyYWNrIGFsbCBwYWNrZXRzLCBjYWxsIGl0ICovCi0gIGlmICgocF9jY2ItPnBfcmNiKSAmJiAocF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfVHhDb21wbGV0ZV9DYikgJiYKLSAgICAgIChudW1fZmx1c2hlZDIpKQotICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfVHhDb21wbGV0ZV9DYikocF9jY2ItPmxvY2FsX2NpZCwgbnVtX2ZsdXNoZWQyKTsKLQotICAvKiBOb3cgY291bnQgaG93IG1hbnkgYXJlIGxlZnQgKi8KLSAgZm9yIChjb25zdCBsaXN0X25vZGVfdCogbm9kZSA9IGxpc3RfYmVnaW4ocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EpOwotICAgICAgIG5vZGUgIT0gbGlzdF9lbmQocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EpOyBub2RlID0gbGlzdF9uZXh0KG5vZGUpKSB7Ci0gICAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKWxpc3Rfbm9kZShub2RlKTsKLSAgICBpZiAocF9idWYtPmV2ZW50ID09IGxjaWQpIG51bV9sZWZ0Kys7Ci0gIH0KLQotICAvKiBBZGQgaW4gdGhlIG51bWJlciBpbiB0aGUgQ0NCIHhtaXQgcXVldWUgKi8KLSAgbnVtX2xlZnQgKz0gZml4ZWRfcXVldWVfbGVuZ3RoKHBfY2NiLT54bWl0X2hvbGRfcSk7Ci0KLSAgLyogUmV0dXJuIHRoZSBsb2NhbCBudW1iZXIgb2YgYnVmZmVycyBsZWZ0IGZvciB0aGUgQ0lEICovCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCJMMkNBX0ZsdXNoQ2hhbm5lbCgpICBmbHVzaGVkOiAldSArICV1LCAgbnVtX2xlZnQ6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgbnVtX2ZsdXNoZWQxLCBudW1fZmx1c2hlZDIsIG51bV9sZWZ0KTsKLQotICAvKiBJZiB3ZSB3ZXJlIGNvbmdlc3RlZCwgYW5kIG5vdyB3ZSBhcmUgbm90LCB0ZWxsIHRoZSBhcHAgKi8KLSAgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24ocF9jY2IpOwotCi0gIHJldHVybiAobnVtX2xlZnQpOwotfQotCi1ib29sIEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0lzTGlua0VzdGFibGlzaGVkKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIH0KLQotICByZXR1cm4gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKGJkX2FkZHIsIHRyYW5zcG9ydCkgIT0gbnVsbHB0cjsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2wyY2FwL2wyY19ibGUuY2MgYi9zdGFjay9sMmNhcC9sMmNfYmxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkyNDg5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2wyY2FwL2wyY19ibGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgdGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyByZWxhdGluZyB0byBCTEUgbWFuYWdlbWVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImwyY19ibGUiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGFfaGVhcmluZ19haWRfYXBpLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNfaW50LmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2tfY29uZmlnLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdEwyQ0FQX0xFX1JFU1VMVF9DT0RFIGJ0bV9ibGVfc3RhcnRfc2VjX2NoZWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHNtLCBib29sIGlzX29yaWdpbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSk7Ci0KLWV4dGVybiB0QlRNX0NCIGJ0bV9jYjsKLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotCi1zdGF0aWMgdm9pZCBsMmNibGVfc3RhcnRfY29ubl91cGRhdGUodEwyQ19MQ0IqIHBfbGNiKTsKLWV4dGVybiB2b2lkIGdhdHRfbm90aWZ5X2Nvbm5fdXBkYXRlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZSwgdWludDE2X3QgaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRnVuY3Rpb24gICAgICAgIEwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcwotICoKLSAqICBEZXNjcmlwdGlvbiAgICAgVXBkYXRlIEJMRSBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCi0gKgotICogIFBhcmFtZXRlcnM6ICAgICBCRCBBZGRyZXNzIG9mIHJlbW90ZQotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgdHJ1ZSBpZiB1cGRhdGUgc3RhcnRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIEwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2ludCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9MZUNvbm5lY3Rpb25VcGRhdGUocmVtX2JkYSwgbWluX2ludCwgbWF4X2ludCwgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiOwotCi0gIC8qIFNlZSBpZiB3ZSBoYXZlIGEgbGluayBjb250cm9sIGJsb2NrIGZvciB0aGUgcmVtb3RlIGRldmljZSAqLwotICBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihyZW1fYmRhLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIC8qIElmIHdlIGRvIG5vdCBoYXZlIG9uZSwgY3JlYXRlIG9uZSBhbmQgYWNjZXB0IHRoZSBjb25uZWN0aW9uLiAqLwotICBpZiAoIXBfbGNiIHx8ICFCVE1fSXNBY2xDb25uZWN0aW9uVXAocmVtX2JkYSwgQlRfVFJBTlNQT1JUX0xFKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIC0gdW5rbm93biBCRF9BRERSICIgPDwgcmVtX2JkYTsKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQotCi0gIGlmIChwX2xjYi0+dHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIC0gQkRfQUREUiAiIDw8IHJlbV9iZGEgPDwgIiBub3QgTEUiOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiOiBCRF9BRERSPSIgPDwgcmVtX2JkYSA8PCAiLCBtaW5faW50PSIgPDwgbWluX2ludAotICAgICAgICAgIDw8ICIsIG1heF9pbnQ9IiA8PCBtYXhfaW50IDw8ICIsIG1pbl9jZV9sZW49IiA8PCBtaW5fY2VfbGVuCi0gICAgICAgICAgPDwgIiwgbWF4X2NlX2xlbj0iIDw8IG1heF9jZV9sZW47Ci0KLSAgcF9sY2ItPm1pbl9pbnRlcnZhbCA9IG1pbl9pbnQ7Ci0gIHBfbGNiLT5tYXhfaW50ZXJ2YWwgPSBtYXhfaW50OwotICBwX2xjYi0+bGF0ZW5jeSA9IGxhdGVuY3k7Ci0gIHBfbGNiLT50aW1lb3V0ID0gdGltZW91dDsKLSAgcF9sY2ItPmNvbm5fdXBkYXRlX21hc2sgfD0gTDJDX0JMRV9ORVdfQ09OTl9QQVJBTTsKLSAgcF9sY2ItPm1pbl9jZV9sZW4gPSBtaW5fY2VfbGVuOwotICBwX2xjYi0+bWF4X2NlX2xlbiA9IG1heF9jZV9sZW47Ci0KLSAgbDJjYmxlX3N0YXJ0X2Nvbm5fdXBkYXRlKHBfbGNiKTsKLQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zCi0gKgotICogIERlc2NyaXB0aW9uICAgICBFbmFibGUgb3IgZGlzYWJsZSB1cGRhdGUgYmFzZWQgb24gdGhlIHJlcXVlc3QgZnJvbSB0aGUgcGVlcgotICoKLSAqICBQYXJhbWV0ZXJzOiAgICAgQkQgQWRkcmVzcyBvZiByZW1vdGUKLSAqCi0gKiAgUmV0dXJuIHZhbHVlOiAgIHRydWUgaWYgdXBkYXRlIHN0YXJ0ZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgYm9vbCBlbmFibGUpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zKHJlbV9iZGEsIGVuYWJsZSk7Ci0gIH0KLQotICBpZiAoc3RhY2tfY29uZmlnX2dldF9pbnRlcmZhY2UoKS0+Z2V0X3B0c19jb25uX3VwZGF0ZXNfZGlzYWJsZWQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiOwotCi0gIC8qIFNlZSBpZiB3ZSBoYXZlIGEgbGluayBjb250cm9sIGJsb2NrIGZvciB0aGUgcmVtb3RlIGRldmljZSAqLwotICBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihyZW1fYmRhLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIGlmICghcF9sY2IpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIiAtIHVua25vd24gQkRfQUREUiAiIDw8IHJlbV9iZGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgVkxPRygyKSA8PCBfX2Z1bmNfXyA8PCAiIC0gQkRfQUREUiAiIDw8IHJlbV9iZGEKLSAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIiBlbmFibGUgJWQgY3VycmVudCB1cGQgc3RhdGUgMHglMDJ4IiwgZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayk7Ci0KLSAgaWYgKHBfbGNiLT50cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgLSBCRF9BRERSICIgPDwgcmVtX2JkYQotICAgICAgICAgICAgICAgICA8PCAiIG5vdCBMRSwgbGluayByb2xlICIgPDwgcF9sY2ItPkxpbmtSb2xlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGVuYWJsZSkKLSAgICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayAmPSB+TDJDX0JMRV9DT05OX1VQREFURV9ESVNBQkxFOwotICBlbHNlCi0gICAgcF9sY2ItPmNvbm5fdXBkYXRlX21hc2sgfD0gTDJDX0JMRV9DT05OX1VQREFURV9ESVNBQkxFOwotCi0gIGwyY2JsZV9zdGFydF9jb25uX3VwZGF0ZShwX2xjYik7Ci0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotaGNpX3JvbGVfdCBMMkNBX0dldEJsZUNvbm5Sb2xlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpKSB7Ci0gICAgcmV0dXJuIGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRCbGVDb25uUm9sZShiZF9hZGRyKTsKLSAgfQotCi0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBpZiAocF9sY2IgPT0gbnVsbHB0cikgewotICAgIHJldHVybiBIQ0lfUk9MRV9VTktOT1dOOwotICB9Ci0gIHJldHVybiBwX2xjYi0+TGlua1JvbGUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiBUaGlzIGZ1bmN0aW9uIG5vdGlmaXkgdGhlIGwyY2FwIGNvbm5lY3Rpb24gdG8gdGhlIGFwcCBsYXllcgotICoKLSAqIFJldHVybnMgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY2JsZV9ub3RpZnlfbGVfY29ubmVjdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKGJkYSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgaWYgKHBfbGNiID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiUmVjZWl2ZWQgbm90aWZpY2F0aW9uIGZvciBsZSBjb25uZWN0aW9uIGJ1dCBubyBsY2IgZm91bmQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoQlRNX0lzQWNsQ29ubmVjdGlvblVwKGJkYSwgQlRfVFJBTlNQT1JUX0xFKSAmJgotICAgICAgcF9sY2ItPmxpbmtfc3RhdGUgIT0gTFNUX0NPTk5FQ1RFRCkgewotICAgIC8qIHVwZGF0ZSBsaW5rIHN0YXR1cyAqLwotICAgIC8vIFRPRE8gTW92ZSB0aGlzIGJhY2sgaW50byBhY2wgbGF5ZXIKLSAgICBidG1fZXN0YWJsaXNoX2NvbnRpbnVlX2Zyb21fYWRkcmVzcyhiZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gICAgLyogdXBkYXRlIGwyY2FwIGxpbmsgc3RhdHVzIGFuZCBzZW5kIGNhbGxiYWNrICovCi0gICAgcF9sY2ItPmxpbmtfc3RhdGUgPSBMU1RfQ09OTkVDVEVEOwotICAgIGwyY3VfcHJvY2Vzc19maXhlZF9jaG5sX3Jlc3AocF9sY2IpOwotICB9Ci0KLSAgLyogRm9yIGFsbCBjaGFubmVscywgc2VuZCB0aGUgZXZlbnQgdGhyb3VnaCB0aGVpciBGU01zICovCi0gIGZvciAodEwyQ19DQ0IqIHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7Ci0gICAgICAgcF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYikgewotICAgIGlmIChwX2NjYi0+Y2hubF9zdGF0ZSA9PSBDU1RfQ0xPU0VEKQotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTFBfQ09OTkVDVF9DRk0sIE5VTEwpOwotICB9Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIEhDSSBDb25uZWN0aW9uIENvbXBsZXRlIGV2ZW50IGlzIHJlY2VpdmVkLgotICovCi1ib29sIGwyY2JsZV9jb25uX2NvbXAodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJvbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSB0eXBlLCB1aW50MTZfdCBjb25uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0KSB7Ci0gIC8vIHJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCA9PiBzY2FubmVyIGNvbXBsZXRlZCBjb25uZWN0aW9uCi0gIC8vIHJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCA9PiBhZHZlcnRpc2VyIGNvbXBsZXRlZCBjb25uZWN0aW9uCi0KLSAgLyogU2VlIGlmIHdlIGhhdmUgYSBsaW5rIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSByZW1vdGUgZGV2aWNlICovCi0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgLyogSWYgd2UgZG8gbm90IGhhdmUgb25lLCBjcmVhdGUgb25lLiB0aGlzIGlzIGF1dG8gY29ubmVjdGlvbiBjb21wbGV0ZS4gKi8KLSAgaWYgKCFwX2xjYikgewotICAgIHBfbGNiID0gbDJjdV9hbGxvY2F0ZV9sY2IoYmRhLCBmYWxzZSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgICBpZiAoIXBfbGNiKSB7Ci0gICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBsaW5rIHJlc291cmNlIGZvciBsZSBhY2wgY29ubmVjdGlvbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIWwyY3VfaW5pdGlhbGl6ZV9maXhlZF9jY2IocF9sY2IsIEwyQ0FQX0FUVF9DSUQpKSB7Ci0gICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGNoYW5uZWwgcmVzb3VyY2UgZm9yIGxlIGFjbCBjb25uZWN0aW9uIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAocm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMICYmIHBfbGNiLT5saW5rX3N0YXRlICE9IExTVF9DT05ORUNUSU5HKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiUmVjZWl2ZWQgbGUgYWNsIGNvbm5lY3Rpb24gYXMgcm9sZSBjZW50cmFsIGJ1dCBub3QgaW4gY29ubmVjdGluZyAiCi0gICAgICAgICJzdGF0ZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChyb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIGFsYXJtX2NhbmNlbChwX2xjYi0+bDJjX2xjYl90aW1lcik7Ci0KLSAgLyogU2F2ZSB0aGUgaGFuZGxlICovCi0gIGwyY3Vfc2V0X2xjYl9oYW5kbGUoKnBfbGNiLCBoYW5kbGUpOwotCi0gIC8qIENvbm5lY3RlZCBPSy4gQ2hhbmdlIHN0YXRlIHRvIGNvbm5lY3RlZCwgd2Ugd2VyZSBzY2FubmluZyBzbyB3ZSBhcmUgY2VudHJhbAotICAgKi8KLSAgaWYgKHJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgIHBfbGNiLT5TZXRMaW5rUm9sZUFzQ2VudHJhbCgpOwotICB9IGVsc2UgewotICAgIHBfbGNiLT5TZXRMaW5rUm9sZUFzUGVyaXBoZXJhbCgpOwotICB9Ci0KLSAgcF9sY2ItPnRyYW5zcG9ydCA9IEJUX1RSQU5TUE9SVF9MRTsKLQotICAvKiB1cGRhdGUgbGluayBwYXJhbWV0ZXIsIHNldCBwZXJpcGhlcmFsIGxpbmsgYXMgbm9uLXNwZWMgZGVmYXVsdCB1cG9uIGxpbmsgdXAKLSAgICovCi0gIHBfbGNiLT5taW5faW50ZXJ2YWwgPSBwX2xjYi0+bWF4X2ludGVydmFsID0gY29ubl9pbnRlcnZhbDsKLSAgcF9sY2ItPnRpbWVvdXQgPSBjb25uX3RpbWVvdXQ7Ci0gIHBfbGNiLT5sYXRlbmN5ID0gY29ubl9sYXRlbmN5OwotICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayA9IEwyQ19CTEVfTk9UX0RFRkFVTFRfUEFSQU07Ci0KLSAgcF9sY2ItPnBlZXJfY2hubF9tYXNrWzBdID0gTDJDQVBfRklYRURfQ0hOTF9BVFRfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfRklYRURfQ0hOTF9CTEVfU0lHX0JJVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0ZJWEVEX0NITkxfU01QX0JJVDsKLQotICBpZiAocm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKSB7Ci0gICAgaWYgKCFjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKQotICAgICAgICAgICAgIC0+c3VwcG9ydHNfYmxlX3BlcmlwaGVyYWxfaW5pdGlhdGVkX2ZlYXR1cmVfZXhjaGFuZ2UoKSkgewotICAgICAgcF9sY2ItPmxpbmtfc3RhdGUgPSBMU1RfQ09OTkVDVEVEOwotICAgICAgbDJjdV9wcm9jZXNzX2ZpeGVkX2NobmxfcmVzcChwX2xjYik7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGwyY2JsZV9jb25uX2NvbXBfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgcm9sZSwgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICB1aW50MTZfdCBjb25uX2ludGVydmFsLCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IGNvbm5fdGltZW91dCkgewotICByZXR1cm4gbDJjYmxlX2Nvbm5fY29tcChoYW5kbGUsIHJvbGUsIGFkZHJlc3Nfd2l0aF90eXBlLmJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc193aXRoX3R5cGUudHlwZSwgY29ubl9pbnRlcnZhbCwgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3RpbWVvdXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBGdW5jdGlvbiAgICAgICAgbDJjYmxlX3N0YXJ0X2Nvbm5fdXBkYXRlCi0gKgotICogIERlc2NyaXB0aW9uICAgICBTdGFydCB0aGUgQkxFIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHVwZGF0ZSBwcm9jZXNzIGJhc2VkIG9uCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1cy4KLSAqCi0gKiAgUGFyYW1ldGVyczogICAgIGxjYiA6IGwyY2FwIGxpbmsgY29udHJvbCBibG9jawotICoKLSAqICBSZXR1cm4gdmFsdWU6ICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBsMmNibGVfc3RhcnRfY29ubl91cGRhdGUodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIHVpbnQxNl90IG1pbl9jb25uX2ludCwgbWF4X2Nvbm5faW50LCBwZXJpcGhlcmFsX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RvdXQ7Ci0gIGlmICghQlRNX0lzQWNsQ29ubmVjdGlvblVwKHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFKSkgewotICAgIExPRyhFUlJPUikgPDwgIk5vIGtub3duIGNvbm5lY3Rpb24gQUNMIGZvciAiIDw8IHBfbGNiLT5yZW1vdGVfYmRfYWRkcjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUT0RPKGFybWFuc2l0byk6IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBjYWxsIHdhc24ndCBiZWluZyB1c2VkIGJ1dCB0aGUKLSAgLy8gbG9naWMgb2YgdGhpcyBmdW5jdGlvbiBtaWdodCBiZSBkZXBlbmRpbmcgb24gaXRzIHNpZGUgZWZmZWN0cy4gV2Ugc2hvdWxkCi0gIC8vIHZlcmlmeSBpZiB0aGlzIGNhbGwgaXMgbmVlZGVkIGF0IGFsbCBhbmQgcmVtb3ZlIGl0IG90aGVyd2lzZS4KLSAgYnRtX2ZpbmRfb3JfYWxsb2NfZGV2KHBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0KLSAgaWYgKHBfbGNiLT5jb25uX3VwZGF0ZV9tYXNrICYgTDJDX0JMRV9VUERBVEVfUEVORElORykgcmV0dXJuOwotCi0gIGlmIChwX2xjYi0+Y29ubl91cGRhdGVfbWFzayAmIEwyQ19CTEVfQ09OTl9VUERBVEVfRElTQUJMRSkgewotICAgIC8qIGFwcGxpY2F0aW9uIHJlcXVlc3RzIHRvIGRpc2FibGUgcGFyYW1ldGVycyB1cGRhdGUuCi0gICAgICAgSWYgcGFyYW1ldGVycyBhcmUgYWxyZWFkeSB1cGRhdGVkLCBsZXRzIHNldCB0aGVtCi0gICAgICAgdXAgdG8gd2hhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgZHVyaW5nIGNvbm5lY3Rpb24gZXN0YWJsaXNoZW1lbnQgKi8KLSAgICBpZiAocF9sY2ItPmNvbm5fdXBkYXRlX21hc2sgJiBMMkNfQkxFX05PVF9ERUZBVUxUX1BBUkFNICYmCi0gICAgICAgIC8qIGN1cnJlbnQgY29ubmVjdGlvbiBpbnRlcnZhbCBpcyBncmVhdGVyIHRoYW4gZGVmYXVsdCBtaW4gKi8KLSAgICAgICAgcF9sY2ItPm1pbl9pbnRlcnZhbCA+IEJUTV9CTEVfQ09OTl9JTlRfTUlOKSB7Ci0gICAgICAvKiB1c2UgNy41IG1zIGFzIGZhc3QgY29ubmVjdGlvbiBwYXJhbWV0ZXIsIDAgcGVyaXBoZXJhbCBsYXRlbmN5ICovCi0gICAgICBtaW5fY29ubl9pbnQgPSBtYXhfY29ubl9pbnQgPSBCVE1fQkxFX0NPTk5fSU5UX01JTjsKLQotICAgICAgTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzKCZtaW5fY29ubl9pbnQsICZtYXhfY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0JMRV9DT05OX0lOVF9NSU4pOwotCi0gICAgICBwZXJpcGhlcmFsX2xhdGVuY3kgPSBCVE1fQkxFX0NPTk5fUEVSSVBIRVJBTF9MQVRFTkNZX0RFRjsKLSAgICAgIHN1cGVydmlzaW9uX3RvdXQgPSBCVE1fQkxFX0NPTk5fVElNRU9VVF9ERUY7Ci0KLSAgICAgIC8qIGlmIGJvdGggc2lkZSA0LjEsIG9yIHdlIGFyZSBjZW50cmFsIGRldmljZSwgc2VuZCBIQ0kgY29tbWFuZCAqLwotICAgICAgaWYgKHBfbGNiLT5Jc0xpbmtSb2xlQ2VudHJhbCgpCi0gICAgICAgICAgfHwgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAtPnN1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcl9yZXF1ZXN0KCkgJiYKLSAgICAgICAgICAgICAgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyc19yZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgcF9sY2ItPnJlbW90ZV9iZF9hZGRyKSkKLSAgICAgICkgewotICAgICAgICBidHNuZF9oY2ljX2JsZV91cGRfbGxfY29ubl9wYXJhbXMocF9sY2ItPkhhbmRsZSgpLCBtaW5fY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29ubl9pbnQsIHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzaW9uX3RvdXQsIDAsIDApOwotICAgICAgICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayB8PSBMMkNfQkxFX1VQREFURV9QRU5ESU5HOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfYmxlX3Bhcl9yZXEocF9sY2IsIG1pbl9jb25uX2ludCwgbWF4X2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RvdXQpOwotICAgICAgfQotICAgICAgcF9sY2ItPmNvbm5fdXBkYXRlX21hc2sgJj0gfkwyQ19CTEVfTk9UX0RFRkFVTFRfUEFSQU07Ci0gICAgICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayB8PSBMMkNfQkxFX05FV19DT05OX1BBUkFNOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBhcHBsaWNhdGlvbiBhbGxvd3MgdG8gZG8gdXBkYXRlLCBpZiB3ZSB3ZXJlIGRlbGF5aW5nIG9uZSBkbyBpdCBub3cgKi8KLSAgICBpZiAocF9sY2ItPmNvbm5fdXBkYXRlX21hc2sgJiBMMkNfQkxFX05FV19DT05OX1BBUkFNKSB7Ci0gICAgICAvKiBpZiBib3RoIHNpZGUgNC4xLCBvciB3ZSBhcmUgY2VudHJhbCBkZXZpY2UsIHNlbmQgSENJIGNvbW1hbmQgKi8KLSAgICAgIGlmIChwX2xjYi0+SXNMaW5rUm9sZUNlbnRyYWwoKQotICAgICAgICAgIHx8IChjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAgLT5zdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJfcmVxdWVzdCgpICYmCi0gICAgICAgICAgICAgIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgIHBfbGNiLT5yZW1vdGVfYmRfYWRkcikpCi0gICAgICApIHsKLSAgICAgICAgYnRzbmRfaGNpY19ibGVfdXBkX2xsX2Nvbm5fcGFyYW1zKHBfbGNiLT5IYW5kbGUoKSwgcF9sY2ItPm1pbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbGNiLT5tYXhfaW50ZXJ2YWwsIHBfbGNiLT5sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9sY2ItPnRpbWVvdXQsIHBfbGNiLT5taW5fY2VfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9sY2ItPm1heF9jZV9sZW4pOwotICAgICAgICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayB8PSBMMkNfQkxFX1VQREFURV9QRU5ESU5HOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfYmxlX3Bhcl9yZXEocF9sY2IsIHBfbGNiLT5taW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbGNiLT5tYXhfaW50ZXJ2YWwsIHBfbGNiLT5sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xjYi0+dGltZW91dCk7Ci0gICAgICB9Ci0gICAgICBwX2xjYi0+Y29ubl91cGRhdGVfbWFzayAmPSB+TDJDX0JMRV9ORVdfQ09OTl9QQVJBTTsKLSAgICAgIHBfbGNiLT5jb25uX3VwZGF0ZV9tYXNrIHw9IEwyQ19CTEVfTk9UX0RFRkFVTFRfUEFSQU07Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfcHJvY2Vzc19jb25uX3VwZGF0ZV9ldnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgY29ubmVjdGlvbiB1cGRhdGUgcmVxdWVzdCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbiB1cGRhdGUgcmVzcG9uc2UgaXMKLSAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjYmxlX3Byb2Nlc3NfY29ubl91cGRhdGVfZXZ0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIC8qIFNlZSBpZiB3ZSBoYXZlIGEgbGluayBjb250cm9sIGJsb2NrIGZvciB0aGUgcmVtb3RlIGRldmljZSAqLwotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAoIXBfbGNiKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiJXM6IEludmFsaWQgaGFuZGxlOiAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfbGNiLT5jb25uX3VwZGF0ZV9tYXNrICY9IH5MMkNfQkxFX1VQREFURV9QRU5ESU5HOwotCi0gIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlczogRXJyb3Igc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICB9Ci0KLSAgbDJjYmxlX3N0YXJ0X2Nvbm5fdXBkYXRlKHBfbGNiKTsKLQotICBMMkNBUF9UUkFDRV9ERUJVRygiJXM6IGNvbm5fdXBkYXRlX21hc2s9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgcF9sY2ItPmNvbm5fdXBkYXRlX21hc2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjYmxlX3Byb2Nlc3Nfc2lnX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHNpZ25hbGxpbmcgcGFja2V0IGlzIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgIG9uIHRoZSBCTEUgc2lnbmFsbGluZyBDSUQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNibGVfcHJvY2Vzc19zaWdfY21kKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCogcCwgdWludDE2X3QgcGt0X2xlbikgewotICB1aW50OF90KiBwX3BrdF9lbmQ7Ci0gIHVpbnQ4X3QgY21kX2NvZGUsIGlkOwotICB1aW50MTZfdCBjbWRfbGVuOwotICB1aW50MTZfdCBtaW5faW50ZXJ2YWwsIG1heF9pbnRlcnZhbCwgbGF0ZW5jeSwgdGltZW91dDsKLSAgdEwyQ19DT05OX0lORk8gY29uX2luZm87Ci0gIHVpbnQxNl90IGxjaWQgPSAwLCByY2lkID0gMCwgbXR1ID0gMCwgbXBzID0gMCwgaW5pdGlhbF9jcmVkaXQgPSAwOwotICB0TDJDX0NDQiAqcF9jY2IgPSBOVUxMLCAqdGVtcF9wX2NjYiA9IE5VTEw7Ci0gIHRMMkNfUkNCKiBwX3JjYjsKLSAgdWludDE2X3QgY3JlZGl0OwotICB1aW50OF90IG51bV9vZl9jaGFubmVsczsKLQotICBwX3BrdF9lbmQgPSBwICsgcGt0X2xlbjsKLQotICBpZiAocCArIDQgPiBwX3BrdF9lbmQpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjgwMjYxNTg1Iik7Ci0gICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCByZWFkIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDgoY21kX2NvZGUsIHApOwotICBTVFJFQU1fVE9fVUlOVDgoaWQsIHApOwotICBTVFJFQU1fVE9fVUlOVDE2KGNtZF9sZW4sIHApOwotCi0gIC8qIENoZWNrIGNvbW1hbmQgbGVuZ3RoIGRvZXMgbm90IGV4Y2VlZCBwYWNrZXQgbGVuZ3RoICovCi0gIGlmICgocCArIGNtZF9sZW4pID4gcF9wa3RfZW5kKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIkwyQ0FQIC0gTEUgLSBmb3JtYXQgZXJyb3IsIHBrdF9sZW46ICVkICBjbWRfbGVuOiAlZCAgY29kZTogJWQiLAotICAgICAgICBwa3RfbGVuLCBjbWRfbGVuLCBjbWRfY29kZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChjbWRfY29kZSkgewotICAgIGNhc2UgTDJDQVBfQ01EX1JFSkVDVDoKLSAgICAgIHAgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNBUF9DTURfRUNIT19SRVE6Ci0gICAgY2FzZSBMMkNBUF9DTURfRUNIT19SU1A6Ci0gICAgY2FzZSBMMkNBUF9DTURfSU5GT19SU1A6Ci0gICAgY2FzZSBMMkNBUF9DTURfSU5GT19SRVE6Ci0gICAgICBsMmN1X3NlbmRfcGVlcl9jbWRfcmVqZWN0KHBfbGNiLCBMMkNBUF9DTURfUkVKX05PVF9VTkRFUlNUT09ELCBpZCwgMCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDQVBfQ01EX0JMRV9VUERBVEVfUkVROgotICAgICAgaWYgKHAgKyA4ID4gcF9wa3RfZW5kKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiODAyNjE1ODUiKTsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCByZWFkIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG1pbl9pbnRlcnZhbCwgcCk7IC8qIDB4MDAwNiAtIDB4MEM4MCAqLwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihtYXhfaW50ZXJ2YWwsIHApOyAvKiAweDAwMDYgLSAweDBDODAgKi8KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYobGF0ZW5jeSwgcCk7ICAgICAgLyogMHgwMDAwIC0gMHgwM0U4ICovCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KHRpbWVvdXQsIHApOyAgICAgIC8qIDB4MDAwQSAtIDB4MEM4MCAqLwotICAgICAgLyogSWYgd2UgYXJlIGEgY2VudHJhbCwgdGhlIHBlcmlwaGVyYWwgd2FudHMgdG8gdXBkYXRlIHRoZSBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAocF9sY2ItPklzTGlua1JvbGVDZW50cmFsKCkpIHsKLSAgICAgICAgTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzKCZtaW5faW50ZXJ2YWwsICZtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fQkxFX0NPTk5fSU5UX01JTl9MSU1JVCk7Ci0KLSAgICAgICAgaWYgKG1pbl9pbnRlcnZhbCA8IEJUTV9CTEVfQ09OTl9JTlRfTUlOIHx8Ci0gICAgICAgICAgICBtaW5faW50ZXJ2YWwgPiBCVE1fQkxFX0NPTk5fSU5UX01BWCB8fAotICAgICAgICAgICAgbWF4X2ludGVydmFsIDwgQlRNX0JMRV9DT05OX0lOVF9NSU4gfHwKLSAgICAgICAgICAgIG1heF9pbnRlcnZhbCA+IEJUTV9CTEVfQ09OTl9JTlRfTUFYIHx8Ci0gICAgICAgICAgICBsYXRlbmN5ID4gQlRNX0JMRV9DT05OX0xBVEVOQ1lfTUFYIHx8Ci0gICAgICAgICAgICAvKih0aW1lb3V0ID49IG1heF9pbnRlcnZhbCAmJiBsYXRlbmN5ID4gKHRpbWVvdXQgKiAxMC8obWF4X2ludGVydmFsCi0gICAgICAgICAgICAgICAqIDEuMjUpIC0gMSkpIHx8Ki8KLSAgICAgICAgICAgIHRpbWVvdXQgPCBCVE1fQkxFX0NPTk5fU1VQX1RPVVRfTUlOIHx8Ci0gICAgICAgICAgICB0aW1lb3V0ID4gQlRNX0JMRV9DT05OX1NVUF9UT1VUX01BWCB8fAotICAgICAgICAgICAgbWF4X2ludGVydmFsIDwgbWluX2ludGVydmFsKSB7Ci0gICAgICAgICAgbDJjdV9zZW5kX3BlZXJfYmxlX3Bhcl9yc3AocF9sY2IsIEwyQ0FQX0NGR19VTkFDQ0VQVEFCTEVfUEFSQU1TLCBpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbDJjdV9zZW5kX3BlZXJfYmxlX3Bhcl9yc3AocF9sY2IsIEwyQ0FQX0NGR19PSywgaWQpOwotCi0gICAgICAgICAgcF9sY2ItPm1pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnZhbDsKLSAgICAgICAgICBwX2xjYi0+bWF4X2ludGVydmFsID0gbWF4X2ludGVydmFsOwotICAgICAgICAgIHBfbGNiLT5sYXRlbmN5ID0gbGF0ZW5jeTsKLSAgICAgICAgICBwX2xjYi0+dGltZW91dCA9IHRpbWVvdXQ7Ci0gICAgICAgICAgcF9sY2ItPmNvbm5fdXBkYXRlX21hc2sgfD0gTDJDX0JMRV9ORVdfQ09OTl9QQVJBTTsKLQotICAgICAgICAgIGwyY2JsZV9zdGFydF9jb25uX3VwZGF0ZShwX2xjYik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZQotICAgICAgICBsMmN1X3NlbmRfcGVlcl9jbWRfcmVqZWN0KHBfbGNiLCBMMkNBUF9DTURfUkVKX05PVF9VTkRFUlNUT09ELCBpZCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNBUF9DTURfQkxFX1VQREFURV9SU1A6Ci0gICAgICBwICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9DT05OX1JFUTogewotICAgICAgaWYgKHAgKyAxMCA+IHBfcGt0X2VuZCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfQ09OTl9SRVEgbGVuIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGNvbl9pbmZvLnBzbSwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG10dSwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG1wcywgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGluaXRpYWxfY3JlZGl0LCBwKTsKLQotICAgICAgLyogQ2hlY2sgaG93IG1hbnkgY2hhbm5lbHMgcmVtb3RlIHNpZGUgd2FudHMuICovCi0gICAgICBudW1fb2ZfY2hhbm5lbHMgPSAocF9wa3RfZW5kIC0gcCkgLyBzaXplb2YodWludDE2X3QpOwotCi0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIlJlY3YgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9DT05OX1JFUSB3aXRoICIKLSAgICAgICAgICAibXR1ID0gJWQsICIKLSAgICAgICAgICAibXBzID0gJWQsICIKLSAgICAgICAgICAiaW5pdGlhbCBjcmVkaXQgPSAlZCIKLSAgICAgICAgICAibnVtX29mX2NoYW5uZWxzID0gJWQiLAotICAgICAgICAgIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdCwgbnVtX29mX2NoYW5uZWxzKTsKLQotICAgICAgaWYgKHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubl9jbnQgPiAwKSB7Ci0gICAgICAgIExPR19XQVJOKCJMMkNBUCAtIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfQ09OTl9SRVEgY29sbGlzaW9uOiIpOwotICAgICAgICBsMmN1X3JlamVjdF9jcmVkaXRfYmFzZWRfY29ubl9yZXEocF9sY2IsIGlkLCBudW1fb2ZfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9MRV9SRVNVTFRfTk9fUkVTT1VSQ0VTKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5fY250ID0gbnVtX29mX2NoYW5uZWxzOwotCi0gICAgICAvKiBDaGVjayBQU00gU3VwcG9ydCAqLwotICAgICAgcF9yY2IgPSBsMmN1X2ZpbmRfYmxlX3JjYl9ieV9wc20oY29uX2luZm8ucHNtKTsKLSAgICAgIGlmIChwX3JjYiA9PSBOVUxMKSB7Ci0gICAgICAgIExPR19XQVJOKCJMMkNBUCAtIHJjdmQgY29ubiByZXEgZm9yIHVua25vd24gUFNNOiAweCUwNHgiLCBjb25faW5mby5wc20pOwotICAgICAgICBsMmN1X3JlamVjdF9jcmVkaXRfYmFzZWRfY29ubl9yZXEocF9sY2IsIGlkLCBudW1fb2ZfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9MRV9SRVNVTFRfTk9fUFNNKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoIXBfcmNiLT5hcGkucEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0SW5kX0NiKSB7Ci0gICAgICAgIExPR19XQVJOKCJMMkNBUCAtIHJjdmQgY29ubiByZXEgZm9yIG91dGdvaW5nLW9ubHkgY29ubmVjdGlvbiBQU006ICVkIiwKLSAgICAgICAgICAgICAgICAgY29uX2luZm8ucHNtKTsKLSAgICAgICAgbDJjdV9yZWplY3RfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHBfbGNiLCBpZCwgbnVtX29mX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ09OTl9OT19QU00pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAobXR1IDwgTDJDQVBfQ1JFRElUX0JBU0VEX01JTl9NVFUgfHwKLSAgICAgICAgICBtcHMgPCBMMkNBUF9DUkVESVRfQkFTRURfTUlOX01QUyB8fCBtcHMgPiBMMkNBUF9MRV9NQVhfTVBTKSB7Ci0gICAgICAgIExPR19FUlJPUigiTDJDQVAgZG9uJ3QgbGlrZSB0aGUgcGFyYW1zIik7Ci0gICAgICAgIGwyY3VfcmVqZWN0X2NyZWRpdF9iYXNlZF9jb25uX3JlcShwX2xjYiwgaWQsIG51bV9vZl9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0xFX1JFU1VMVF9JTlZBTElEX1BBUkFNRVRFUlMpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGJvb2wgbGVhZF9jaWRfc2V0ID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX29mX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyY2lkLCBwKTsKLSAgICAgICAgdGVtcF9wX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfcmVtb3RlX2NpZChwX2xjYiwgcmNpZCk7Ci0gICAgICAgIGlmICh0ZW1wX3BfY2NiKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIkwyQ0FQIC0gcmN2ZCBjb25uIHJlcSBmb3IgZHVwbGljYXRlZCBjaWQ6IDB4JTA0eCIsIHJjaWQpOwotICAgICAgICAgIHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzW2ldID0gMDsKLSAgICAgICAgICBwX2xjYi0+cGVuZGluZ19sMmNhcF9yZXN1bHQgPQotICAgICAgICAgICAgICBMMkNBUF9MRV9SRVNVTFRfU09VUkNFX0NJRF9BTFJFQURZX0FMTE9DQVRFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiBBbGxvY2F0ZSBhIGNjYiBmb3IgdGhpcy4qLwotICAgICAgICAgIHRlbXBfcF9jY2IgPSBsMmN1X2FsbG9jYXRlX2NjYihwX2xjYiwgMCk7Ci0gICAgICAgICAgaWYgKHRlbXBfcF9jY2IgPT0gTlVMTCkgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJMMkNBUCAtIHVuYWJsZSB0byBhbGxvY2F0ZSBDQ0IiKTsKLSAgICAgICAgICAgIHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzW2ldID0gMDsKLSAgICAgICAgICAgIHBfbGNiLT5wZW5kaW5nX2wyY2FwX3Jlc3VsdCA9IEwyQ0FQX0xFX1JFU1VMVF9OT19SRVNPVVJDRVM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB0ZW1wX3BfY2NiLT5lY29jID0gdHJ1ZTsKLSAgICAgICAgICB0ZW1wX3BfY2NiLT5yZW1vdGVfaWQgPSBpZDsKLSAgICAgICAgICB0ZW1wX3BfY2NiLT5wX3JjYiA9IHBfcmNiOwotICAgICAgICAgIHRlbXBfcF9jY2ItPnJlbW90ZV9jaWQgPSByY2lkOwotCi0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jb25uX2NmZy5tdHUgPSBtdHU7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jb25uX2NmZy5tcHMgPSBtcHM7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jb25uX2NmZy5jcmVkaXRzID0gaW5pdGlhbF9jcmVkaXQ7Ci0KLSAgICAgICAgICB0ZW1wX3BfY2NiLT50eF9tcHMgPSBtcHM7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+YmxlX3NkdSA9IE5VTEw7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+YmxlX3NkdV9sZW5ndGggPSAwOwotICAgICAgICAgIHRlbXBfcF9jY2ItPmlzX2ZpcnN0X3NlZyA9IHRydWU7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPSBMMkNBUF9GQ1JfTEVfQ09DX01PREU7Ci0KLSAgICAgICAgICAvKiBUaGlzIGxpc3Qgd2lsbCBiZSB1c2VkIHRvIHByZXBhcmUgcmVzcG9uc2UgKi8KLSAgICAgICAgICBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5lY3Rpb25fY2lkc1tpXSA9IHRlbXBfcF9jY2ItPmxvY2FsX2NpZDsKLQotICAgICAgICAgIC8qVGhpcyBpcyBnb2luZyB0byBiZSBvdXIgbGVhZCBwX2NjYiBmb3Igc3RhdGUgbWFjaGluZSAqLwotICAgICAgICAgIGlmICghbGVhZF9jaWRfc2V0KSB7Ci0gICAgICAgICAgICBwX2NjYiA9IHRlbXBfcF9jY2I7Ci0gICAgICAgICAgICBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXR1ID0gTDJDQVBfU0RVX0xFTkdUSF9MRV9NQVg7Ci0gICAgICAgICAgICBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXBzID0KLSAgICAgICAgICAgICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FjbF9kYXRhX3NpemVfYmxlKCk7Ci0gICAgICAgICAgICBwX2xjYi0+cGVuZGluZ19sZWFkX2NpZCA9IHBfY2NiLT5sb2NhbF9jaWQ7Ci0gICAgICAgICAgICBsZWFkX2NpZF9zZXQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIWxlYWRfY2lkX3NldCkgewotICAgICAgICBMT0dfRVJST1IoIkwyQ0FQIC0gdW5hYmxlIHRvIGFsbG9jYXRlIENDQiIpOwotICAgICAgICBsMmN1X3JlamVjdF9jcmVkaXRfYmFzZWRfY29ubl9yZXEocF9sY2IsIGlkLCBudW1fb2ZfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xjYi0+cGVuZGluZ19sMmNhcF9yZXN1bHQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIExPR19ERUJVRygiTDJDQVAgLSBwcm9jZXNzaW5nIHBlZXIgY3JlZGl0IGJhc2VkIGNvbm5lY3QgcmVxdWVzdCIpOwotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUkVRLCBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfQ09OTl9SRVM6Ci0gICAgICBpZiAocCArIDIgPiBwX3BrdF9lbmQpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX0NPTk5fUkVTIGxlbiI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoIlJlY3YgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9DT05OX1JFUyIpOwotICAgICAgLyogRm9yIGFsbCBjaGFubmVscywgc2VlIHdob3NlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGlzIGlkICovCi0gICAgICBmb3IgKHRlbXBfcF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyB0ZW1wX3BfY2NiOwotICAgICAgICAgICB0ZW1wX3BfY2NiID0gdGVtcF9wX2NjYi0+cF9uZXh0X2NjYikgewotICAgICAgICBpZiAodGVtcF9wX2NjYi0+bG9jYWxfaWQgPT0gaWQpIHsKLSAgICAgICAgICBwX2NjYiA9IHRlbXBfcF9jY2I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFwX2NjYikgewotICAgICAgICBMMkNBUF9UUkFDRV9ERUJVRygiIENhbm5vdCBmaW5kIG1hdGNoaW5nIGNvbm5lY3Rpb24gcmVxIik7Ci0gICAgICAgIGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCA9IEwyQ0FQX0xFX1JFU1VMVF9JTlZBTElEX1NPVVJDRV9DSUQ7Ci0gICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQX05FRywgJmNvbl9pbmZvKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG10dSwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG1wcywgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGluaXRpYWxfY3JlZGl0LCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoY29uX2luZm8ubDJjYXBfcmVzdWx0LCBwKTsKLQotICAgICAgLyogV2hlbiBvbmUgb2YgdGhlc2UgcmVzdWx0IGlzIHNlbnQgYmFjayB0aGF0IG1lYW5zLAotICAgICAgICogYWxsIHRoZSBjaGFubmVscyBoYXMgYmVlbiByZWplY3RlZAotICAgICAgICovCi0gICAgICBpZiAoY29uX2luZm8ubDJjYXBfcmVzdWx0ID09IEwyQ0FQX0xFX1JFU1VMVF9OT19QU00gfHwKLSAgICAgICAgICBjb25faW5mby5sMmNhcF9yZXN1bHQgPT0KLSAgICAgICAgICAgICAgTDJDQVBfTEVfUkVTVUxUX0lOU1VGRklDSUVOVF9BVVRIRU5USUNBVElPTiB8fAotICAgICAgICAgIGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCA9PSBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0VOQ1JZUCB8fAotICAgICAgICAgIGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCA9PSBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0FVVEhPUklaQVRJT04gfHwKLSAgICAgICAgICBjb25faW5mby5sMmNhcF9yZXN1bHQgPT0gTDJDQVBfTEVfUkVTVUxUX1VOQUNDRVBUQUJMRV9QQVJBTUVURVJTIHx8Ci0gICAgICAgICAgY29uX2luZm8ubDJjYXBfcmVzdWx0ID09IEwyQ0FQX0xFX1JFU1VMVF9JTlZBTElEX1BBUkFNRVRFUlMpIHsKLSAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQX05FRywKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb25faW5mbyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmIChtdHUgPCBMMkNBUF9DUkVESVRfQkFTRURfTUlOX01UVSB8fAotICAgICAgICAgIG1wcyA8IEwyQ0FQX0NSRURJVF9CQVNFRF9NSU5fTVBTIHx8IG1wcyA+IEwyQ0FQX0xFX01BWF9NUFMpIHsKLSAgICAgICAgTDJDQVBfVFJBQ0VfRVJST1IoIkwyQ0FQIC0gaW52YWxpZCBwYXJhbXMiKTsKLSAgICAgICAgY29uX2luZm8ubDJjYXBfcmVzdWx0ID0gTDJDQVBfTEVfUkVTVUxUX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQX05FRywKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb25faW5mbyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiBBdCBsZWFzdCBzb21lIG9mIHRoZSBjaGFubmVscyBoYXMgYmVlbiBjcmVhdGVkIGFuZCBwYXJhbWV0ZXJzIGFyZQotICAgICAgICogZ29vZCovCi0gICAgICBudW1fb2ZfY2hhbm5lbHMgPSAocF9wa3RfZW5kIC0gcCkgLyBzaXplb2YodWludDE2X3QpOwotICAgICAgaWYgKG51bV9vZl9jaGFubmVscyAhPSBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5fY250KSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIkluY29ycmVjdCByZXNwb25zZS4iCi0gICAgICAgICAgICAiZXhwZWN0ZWQgbnVtIG9mIGNoYW5uZWxzID0gJWQiLAotICAgICAgICAgICAgInJlY2VpdmVkIG51bSBvZiBjaGFubmVscyA9ICVkIiwgbnVtX29mX2NoYW5uZWxzLAotICAgICAgICAgICAgcF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIm10dSA9ICVkLCAiCi0gICAgICAgICAgIm1wcyA9ICVkLCAiCi0gICAgICAgICAgImluaXRpYWxfY3JlZGl0ID0gJWQsICIKLSAgICAgICAgICAiY29uX2luZm8ubDJjYXBfcmVzdWx0ID0gJWQiCi0gICAgICAgICAgIm51bV9vZl9jaGFubmVscyA9ICVkIiwKLSAgICAgICAgICBtdHUsIG1wcywgaW5pdGlhbF9jcmVkaXQsIGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCwgbnVtX29mX2NoYW5uZWxzKTsKLQotICAgICAgY29uX2luZm8ucGVlcl9tdHUgPSBtdHU7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQxNl90IGNpZCA9IHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzW2ldOwotICAgICAgICB0ZW1wX3BfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQocF9sY2IsIGNpZCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYodGVtcF9wX2NjYi0+cmVtb3RlX2NpZCwgcCk7Ci0KLSAgICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAibG9jYWwgY2lkID0gJWQgIgotICAgICAgICAgICAgInJlbW90ZSBjaWQgPSAlZCIsCi0gICAgICAgICAgICBjaWQsIHRlbXBfcF9jY2ItPnJlbW90ZV9jaWQpOwotCi0gICAgICAgIC8qIENoZWNrIGlmIHBlZXIgYWNjZXB0ZWQgY2hhbm5lbCwgaWYgbm90IHJlbGVhc2UgdGhlIG9uZSBub3QKLSAgICAgICAgICogY3JlYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHRlbXBfcF9jY2ItPnJlbW90ZV9jaWQgPT0gMCkgewotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZSh0ZW1wX3BfY2NiLCBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQX05FRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbl9pbmZvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0ZW1wX3BfY2NiLT50eF9tcHMgPSBtcHM7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+YmxlX3NkdSA9IE5VTEw7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+YmxlX3NkdV9sZW5ndGggPSAwOwotICAgICAgICAgIHRlbXBfcF9jY2ItPmlzX2ZpcnN0X3NlZyA9IHRydWU7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPSBMMkNBUF9GQ1JfTEVfQ09DX01PREU7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jb25uX2NmZy5tdHUgPSBtdHU7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jb25uX2NmZy5tcHMgPSBtcHM7Ci0gICAgICAgICAgdGVtcF9wX2NjYi0+cGVlcl9jb25uX2NmZy5jcmVkaXRzID0gaW5pdGlhbF9jcmVkaXQ7Ci0KLSAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUodGVtcF9wX2NjYiwgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbl9pbmZvKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5fY250ID0gMDsKLSAgICAgIG1lbXNldChwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5lY3Rpb25fY2lkcywgMCwKLSAgICAgICAgICAgICBMMkNBUF9DUkVESVRfQkFTRURfTUFYX0NJRFMpOwotCi0gICAgICBicmVhazsKLSAgICBjYXNlIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVROiB7Ci0gICAgICBpZiAocCArIDYgPiBwX3BrdF9lbmQpIHsKLSAgICAgICAgbDJjdV9zZW5kX2JsZV9yZWNvbmZpZ19yc3AocF9sY2IsIGlkLCBMMkNBUF9SRUNPTkZJR19VTkFDQ0FQVEVEX1BBUkFNKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG10dSwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG1wcywgcCk7Ci0KLSAgICAgIC8qIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAobXR1IDwgTDJDQVBfQ1JFRElUX0JBU0VEX01JTl9NVFUgfHwKLSAgICAgICAgICBtcHMgPCBMMkNBUF9DUkVESVRfQkFTRURfTUlOX01QUyB8fCBtcHMgPiBMMkNBUF9MRV9NQVhfTVBTKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKCJMMkNBUCAtIGludmFsaWQgcGFyYW1zIik7Ci0gICAgICAgIGwyY3Vfc2VuZF9ibGVfcmVjb25maWdfcnNwKHBfbGNiLCBpZCwgTDJDQVBfUkVDT05GSUdfVU5BQ0NBUFRFRF9QQVJBTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogQ2hlY2sgaG93IG1hbnkgY2hhbm5lbHMgcmVtb3RlIHNpZGUgd2FudHMgdG8gcmVjb25maWd1cmUgKi8KLSAgICAgIG51bV9vZl9jaGFubmVscyA9IChwX3BrdF9lbmQgLSBwKSAvIHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICJSZWN2IEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVRIHdpdGggIgotICAgICAgICAgICJtdHUgPSAlZCwgIgotICAgICAgICAgICJtcHMgPSAlZCwgIgotICAgICAgICAgICJudW1fb2ZfY2hhbm5lbHMgPSAlZCIsCi0gICAgICAgICAgbXR1LCBtcHMsIG51bV9vZl9jaGFubmVscyk7Ci0KLSAgICAgIHVpbnQ4X3QqIHBfdG1wID0gcDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX29mX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyY2lkLCBwX3RtcCk7Ci0gICAgICAgIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHBfbGNiLCByY2lkKTsKLSAgICAgICAgaWYgKCFwX2NjYikgewotICAgICAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICJMMkNBUCAtIHJjdmQgY29uZmlnIHJlcSBmb3Igbm9uIGV4aXN0aW5nIGNpZDogMHglMDR4IiwgcmNpZCk7Ci0gICAgICAgICAgbDJjdV9zZW5kX2JsZV9yZWNvbmZpZ19yc3AocF9sY2IsIGlkLCBMMkNBUF9SRUNPTkZJR19JTlZBTElEX0RDSUQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2NjYi0+cGVlcl9jb25uX2NmZy5tdHUgPiBtdHUpIHsKLSAgICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgICAiTDJDQVAgLSByY3ZkIGNvbmZpZyByZXEgbXR1IHJlZHVjdGlvbiBuZXcgbXR1IDwgbXR1ICglZCA8ICVkKSIsCi0gICAgICAgICAgICAgIG10dSwgcF9jY2ItPnBlZXJfY29ubl9jZmcubXR1KTsKLSAgICAgICAgICBsMmN1X3NlbmRfYmxlX3JlY29uZmlnX3JzcChwX2xjYiwgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfUkVDT05GSUdfUkVEVUNUSU9OX01UVV9OT19BTExPV0VEKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9jY2ItPnBlZXJfY29ubl9jZmcubXBzID4gbXBzKSB7Ci0gICAgICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIkwyQ0FQIC0gcmN2ZCBjb25maWcgcmVxIG1wcyByZWR1Y3Rpb24gbmV3IG1wcyA8IG1wcyAoJWQgPCAlZCkiLAotICAgICAgICAgICAgICBtdHUsIHBfY2NiLT5wZWVyX2Nvbm5fY2ZnLm10dSk7Ci0gICAgICAgICAgbDJjdV9zZW5kX2JsZV9yZWNvbmZpZ19yc3AocF9sY2IsIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX1JFQ09ORklHX1JFRFVDVElPTl9NUFNfTk9fQUxMT1dFRCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX29mX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyY2lkLCBwKTsKLQotICAgICAgICAvKiBTdG9yZSBuZXcgdmFsdWVzICovCi0gICAgICAgIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHBfbGNiLCByY2lkKTsKLSAgICAgICAgcF9jY2ItPnBlZXJfY29ubl9jZmcubXR1ID0gbXR1OwotICAgICAgICBwX2NjYi0+cGVlcl9jb25uX2NmZy5tcHMgPSBtcHM7Ci0gICAgICAgIHBfY2NiLT50eF9tcHMgPSBtcHM7Ci0KLSAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPIGxlX2NmZzsKLSAgICAgICAgbGVfY2ZnLm1wcyA9IG1wczsKLSAgICAgICAgbGVfY2ZnLm10dSA9IG10dTsKLQotICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVRLCAmbGVfY2ZnKTsKLSAgICAgIH0KLQotICAgICAgbDJjdV9zZW5kX2JsZV9yZWNvbmZpZ19yc3AocF9sY2IsIGlkLCBMMkNBUF9SRUNPTkZJR19TVUNDRUVEKTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUzogewotICAgICAgdWludDE2X3QgcmVzdWx0OwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZXN1bHQsIHApOwotCi0gICAgICBMMkNBUF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiUmVjdiBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUyBmb3IgIgotICAgICAgICAgICJyZXN1bHQgPSAweCUwNHgiLAotICAgICAgICAgIHJlc3VsdCk7Ci0KLSAgICAgIHBfbGNiLT5wZW5kaW5nX2Vjb2NfcmVjb25maWdfY2ZnLnJlc3VsdCA9IHJlc3VsdDsKLQotICAgICAgLyogQWxsIGNoYW5uZWxzIHdoaWNoIGFyZSBpbiByZWNvbmZpZ3VyYXRpb24gc3RhdGUgYXJlIG1hcmtlZCB3aXRoCi0gICAgICAgKiByZWNvbmZpZ19zdGFydGVkIGZsYWcuIEZpbmQgaXQgYW5kIHNlbmQgcmVzcG9uc2UKLSAgICAgICAqLwotICAgICAgZm9yICh0ZW1wX3BfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgdGVtcF9wX2NjYjsKLSAgICAgICAgICAgdGVtcF9wX2NjYiA9IHRlbXBfcF9jY2ItPnBfbmV4dF9jY2IpIHsKLSAgICAgICAgaWYgKCh0ZW1wX3BfY2NiLT5pbl91c2UpICYmICh0ZW1wX3BfY2NiLT5yZWNvbmZpZ19zdGFydGVkKSkgewotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZSh0ZW1wX3BfY2NiLCBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JTUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfbGNiLT5wZW5kaW5nX2Vjb2NfcmVjb25maWdfY2ZnKTsKLQotICAgICAgICAgIHRlbXBfcF9jY2ItPnJlY29uZmlnX3N0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IEwyQ0FQX0NGR19PSykgewotICAgICAgICAgICAgdGVtcF9wX2NjYi0+bG9jYWxfY29ubl9jZmcgPSBwX2xjYi0+cGVuZGluZ19lY29jX3JlY29uZmlnX2NmZzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBMMkNBUF9DTURfQkxFX0NSRURJVF9CQVNFRF9DT05OX1JFUToKLSAgICAgIGlmIChwICsgMTAgPiBwX3BrdF9lbmQpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI4MDI2MTU4NSIpOwotICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIHJlYWQiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoY29uX2luZm8ucHNtLCBwKTsKLSAgICAgIFNUUkVBTV9UT19VSU5UMTYocmNpZCwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG10dSwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KG1wcywgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KGluaXRpYWxfY3JlZGl0LCBwKTsKLQotICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIlJlY3YgTDJDQVBfQ01EX0JMRV9DUkVESVRfQkFTRURfQ09OTl9SRVEgd2l0aCAiCi0gICAgICAgICAgIm10dSA9ICVkLCAiCi0gICAgICAgICAgIm1wcyA9ICVkLCAiCi0gICAgICAgICAgImluaXRpYWwgY3JlZGl0ID0gJWQiLAotICAgICAgICAgIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdCk7Ci0KLSAgICAgIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHBfbGNiLCByY2lkKTsKLSAgICAgIGlmIChwX2NjYikgewotICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIHJjdmQgY29ubiByZXEgZm9yIGR1cGxpY2F0ZWQgY2lkOiAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjaWQpOwotICAgICAgICBsMmN1X3JlamVjdF9ibGVfY29jX2Nvbm5lY3Rpb24oCi0gICAgICAgICAgICBwX2xjYiwgaWQsIEwyQ0FQX0xFX1JFU1VMVF9TT1VSQ0VfQ0lEX0FMUkVBRFlfQUxMT0NBVEVEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHBfcmNiID0gbDJjdV9maW5kX2JsZV9yY2JfYnlfcHNtKGNvbl9pbmZvLnBzbSk7Ci0gICAgICBpZiAocF9yY2IgPT0gTlVMTCkgewotICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIHJjdmQgY29ubiByZXEgZm9yIHVua25vd24gUFNNOiAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbl9pbmZvLnBzbSk7Ci0gICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb2NfY29ubmVjdGlvbihwX2xjYiwgaWQsIEwyQ0FQX0xFX1JFU1VMVF9OT19QU00pOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghcF9yY2ItPmFwaS5wTDJDQV9Db25uZWN0SW5kX0NiKSB7Ci0gICAgICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIkwyQ0FQIC0gcmN2ZCBjb25uIHJlcSBmb3Igb3V0Z29pbmctb25seSBjb25uZWN0aW9uIFBTTTogJWQiLAotICAgICAgICAgICAgICBjb25faW5mby5wc20pOwotICAgICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb2NfY29ubmVjdGlvbihwX2xjYiwgaWQsIEwyQ0FQX0NPTk5fTk9fUFNNKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSBhIGNjYiBmb3IgdGhpcy4qLwotICAgICAgcF9jY2IgPSBsMmN1X2FsbG9jYXRlX2NjYihwX2xjYiwgMCk7Ci0gICAgICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgICAgICBMMkNBUF9UUkFDRV9FUlJPUigiTDJDQVAgLSB1bmFibGUgdG8gYWxsb2NhdGUgQ0NCIik7Ci0gICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb25uZWN0aW9uKHBfY2NiLCBpZCwgTDJDQVBfQ09OTl9OT19SRVNPVVJDRVMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLyogdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmIChtdHUgPCBMMkNBUF9MRV9NSU5fTVRVIHx8IG1wcyA8IEwyQ0FQX0xFX01JTl9NUFMgfHwKLSAgICAgICAgICBtcHMgPiBMMkNBUF9MRV9NQVhfTVBTKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKCJMMkNBUCBkbyBub3QgbGlrZSB0aGUgcGFyYW1zIik7Ci0gICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb25uZWN0aW9uKHBfY2NiLCBpZCwgTDJDQVBfQ09OTl9OT19SRVNPVVJDRVMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgcF9jY2ItPnJlbW90ZV9pZCA9IGlkOwotICAgICAgcF9jY2ItPnBfcmNiID0gcF9yY2I7Ci0gICAgICBwX2NjYi0+cmVtb3RlX2NpZCA9IHJjaWQ7Ci0KLSAgICAgIHBfY2NiLT5sb2NhbF9jb25uX2NmZy5tdHUgPSBMMkNBUF9TRFVfTEVOR1RIX0xFX01BWDsKLSAgICAgIHBfY2NiLT5sb2NhbF9jb25uX2NmZy5tcHMgPQotICAgICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWNsX2RhdGFfc2l6ZV9ibGUoKTsKLSAgICAgIHBfY2NiLT5sb2NhbF9jb25uX2NmZy5jcmVkaXRzID0gTDJDQVBfTEVfQ1JFRElUX0RFRkFVTFQsCi0KLSAgICAgIHBfY2NiLT5wZWVyX2Nvbm5fY2ZnLm10dSA9IG10dTsKLSAgICAgIHBfY2NiLT5wZWVyX2Nvbm5fY2ZnLm1wcyA9IG1wczsKLSAgICAgIHBfY2NiLT5wZWVyX2Nvbm5fY2ZnLmNyZWRpdHMgPSBpbml0aWFsX2NyZWRpdDsKLQotICAgICAgcF9jY2ItPnR4X21wcyA9IG1wczsKLSAgICAgIHBfY2NiLT5ibGVfc2R1ID0gTlVMTDsKLSAgICAgIHBfY2NiLT5ibGVfc2R1X2xlbmd0aCA9IDA7Ci0gICAgICBwX2NjYi0+aXNfZmlyc3Rfc2VnID0gdHJ1ZTsKLSAgICAgIHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSA9IEwyQ0FQX0ZDUl9MRV9DT0NfTU9ERTsKLQotICAgICAgcF9jY2ItPmNvbm5lY3Rpb25faW5pdGlhdG9yID0gTDJDQVBfSU5JVElBVE9SX1JFTU9URTsKLQotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SRVEsICZjb25faW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDQVBfQ01EX0JMRV9DUkVESVRfQkFTRURfQ09OTl9SRVM6Ci0gICAgICBMMkNBUF9UUkFDRV9ERUJVRygiUmVjdiBMMkNBUF9DTURfQkxFX0NSRURJVF9CQVNFRF9DT05OX1JFUyIpOwotICAgICAgLyogRm9yIGFsbCBjaGFubmVscywgc2VlIHdob3NlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGlzIGlkICovCi0gICAgICBmb3IgKHRlbXBfcF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyB0ZW1wX3BfY2NiOwotICAgICAgICAgICB0ZW1wX3BfY2NiID0gdGVtcF9wX2NjYi0+cF9uZXh0X2NjYikgewotICAgICAgICBpZiAodGVtcF9wX2NjYi0+bG9jYWxfaWQgPT0gaWQpIHsKLSAgICAgICAgICBwX2NjYiA9IHRlbXBfcF9jY2I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwX2NjYikgewotICAgICAgICBMMkNBUF9UUkFDRV9ERUJVRygiSSByZW1lbWJlciB0aGUgY29ubmVjdGlvbiByZXEiKTsKLSAgICAgICAgaWYgKHAgKyAxMCA+IHBfcGt0X2VuZCkgewotICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiODAyNjE1ODUiKTsKLSAgICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIHJlYWQiOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYocF9jY2ItPnJlbW90ZV9jaWQsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHBfY2NiLT5wZWVyX2Nvbm5fY2ZnLm10dSwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYocF9jY2ItPnBlZXJfY29ubl9jZmcubXBzLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihwX2NjYi0+cGVlcl9jb25uX2NmZy5jcmVkaXRzLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjb25faW5mby5sMmNhcF9yZXN1bHQsIHApOwotICAgICAgICBjb25faW5mby5yZW1vdGVfY2lkID0gcF9jY2ItPnJlbW90ZV9jaWQ7Ci0KLSAgICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAicmVtb3RlX2NpZCA9ICVkLCAiCi0gICAgICAgICAgICAibXR1ID0gJWQsICIKLSAgICAgICAgICAgICJtcHMgPSAlZCwgIgotICAgICAgICAgICAgImluaXRpYWxfY3JlZGl0ID0gJWQsICIKLSAgICAgICAgICAgICJjb25faW5mby5sMmNhcF9yZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICBwX2NjYi0+cmVtb3RlX2NpZCwgcF9jY2ItPnBlZXJfY29ubl9jZmcubXR1LAotICAgICAgICAgICAgcF9jY2ItPnBlZXJfY29ubl9jZmcubXBzLCBwX2NjYi0+cGVlcl9jb25uX2NmZy5jcmVkaXRzLAotICAgICAgICAgICAgY29uX2luZm8ubDJjYXBfcmVzdWx0KTsKLQotICAgICAgICAvKiB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycyAqLwotICAgICAgICBpZiAocF9jY2ItPnBlZXJfY29ubl9jZmcubXR1IDwgTDJDQVBfTEVfTUlOX01UVSB8fAotICAgICAgICAgICAgcF9jY2ItPnBlZXJfY29ubl9jZmcubXBzIDwgTDJDQVBfTEVfTUlOX01QUyB8fAotICAgICAgICAgICAgcF9jY2ItPnBlZXJfY29ubl9jZmcubXBzID4gTDJDQVBfTEVfTUFYX01QUykgewotICAgICAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKCJMMkNBUCBkbyBub3QgbGlrZSB0aGUgcGFyYW1zIik7Ci0gICAgICAgICAgY29uX2luZm8ubDJjYXBfcmVzdWx0ID0gTDJDQVBfTEVfUkVTVUxUX05PX1JFU09VUkNFUzsKLSAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9DT05ORUNUX1JTUF9ORUcsICZjb25faW5mbyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2NjYi0+dHhfbXBzID0gcF9jY2ItPnBlZXJfY29ubl9jZmcubXBzOwotICAgICAgICBwX2NjYi0+YmxlX3NkdSA9IE5VTEw7Ci0gICAgICAgIHBfY2NiLT5ibGVfc2R1X2xlbmd0aCA9IDA7Ci0gICAgICAgIHBfY2NiLT5pc19maXJzdF9zZWcgPSB0cnVlOwotICAgICAgICBwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPSBMMkNBUF9GQ1JfTEVfQ09DX01PREU7Ci0KLSAgICAgICAgaWYgKGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCA9PSBMMkNBUF9MRV9SRVNVTFRfQ09OTl9PSykKLSAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9DT05ORUNUX1JTUCwgJmNvbl9pbmZvKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQX05FRywgJmNvbl9pbmZvKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCJJIERPIE5PVCByZW1lbWJlciB0aGUgY29ubmVjdGlvbiByZXEiKTsKLSAgICAgICAgY29uX2luZm8ubDJjYXBfcmVzdWx0ID0gTDJDQVBfTEVfUkVTVUxUX0lOVkFMSURfU09VUkNFX0NJRDsKLSAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1BfTkVHLCAmY29uX2luZm8pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0FQX0NNRF9CTEVfRkxPV19DVFJMX0NSRURJVDoKLSAgICAgIGlmIChwICsgNCA+IHBfcGt0X2VuZCkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjgwMjYxNTg1Iik7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgImludmFsaWQgcmVhZCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgU1RSRUFNX1RPX1VJTlQxNihsY2lkLCBwKTsKLSAgICAgIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHBfbGNiLCBsY2lkKTsKLSAgICAgIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCIlcyBDcmVkaXQgcmVjZWl2ZWQgZm9yIHVua25vd24gY2hhbm5lbCBpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsY2lkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYoY3JlZGl0LCBwKTsKLSAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX1JFQ1ZfRkxPV19DT05UUk9MX0NSRURJVCwgJmNyZWRpdCk7Ci0gICAgICBMMkNBUF9UUkFDRV9ERUJVRygiJXMgQ3JlZGl0IHJlY2VpdmVkIiwgX19mdW5jX18pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0FQX0NNRF9ESVNDX1JFUToKLSAgICAgIGlmIChwICsgNCA+IHBfcGt0X2VuZCkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc0MTIxNjU5Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFNUUkVBTV9UT19VSU5UMTYobGNpZCwgcCk7Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KHJjaWQsIHApOwotCi0gICAgICBwX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKHBfbGNiLCBsY2lkKTsKLSAgICAgIGlmIChwX2NjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChwX2NjYi0+cmVtb3RlX2NpZCA9PSByY2lkKSB7Ci0gICAgICAgICAgcF9jY2ItPnJlbW90ZV9pZCA9IGlkOwotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUkVRLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Rpc2NfcnNwKHBfbGNiLCBpZCwgbGNpZCwgcmNpZCk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNBUF9DTURfRElTQ19SU1A6Ci0gICAgICBpZiAocCArIDQgPiBwX3BrdF9lbmQpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI4MDI2MTU4NSIpOwotICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIHJlYWQiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBTVFJFQU1fVE9fVUlOVDE2KHJjaWQsIHApOwotICAgICAgU1RSRUFNX1RPX1VJTlQxNihsY2lkLCBwKTsKLQotICAgICAgcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChwX2xjYiwgbGNpZCk7Ci0gICAgICBpZiAocF9jY2IgIT0gTlVMTCkgewotICAgICAgICBpZiAoKHBfY2NiLT5yZW1vdGVfY2lkID09IHJjaWQpICYmIChwX2NjYi0+bG9jYWxfaWQgPT0gaWQpKQotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUlNQLCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gTEUgLSB1bmtub3duIGNtZCBjb2RlOiAlZCIsIGNtZF9jb2RlKTsKLSAgICAgIGwyY3Vfc2VuZF9wZWVyX2NtZF9yZWplY3QocF9sY2IsIEwyQ0FQX0NNRF9SRUpfTk9UX1VOREVSU1RPT0QsIGlkLCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIGluaXRhdGUgYSBkaXJlY3QgY29ubmVjdGlvbi4gUmV0dXJucyB0cnVlIGlmIGNvbm5lY3Rpb24KLSAqIGluaXRpYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAqLwotYm9vbCBsMmNibGVfY3JlYXRlX2Nvbm4odEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIGlmICghYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uKHBfbGNiLT5yZW1vdGVfYmRfYWRkcikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9DT05ORUNUSU5HOwotCi0gIC8vIFRPRE86IHdlIHNob3VsZCBub3QgbmVlZCB0aGlzIHRpbWVyIGF0IGFsbCwgdGhlIGNvbm5lY3Rpb24gZmFpbHVyZSBzaG91bGQKLSAgLy8gYmUgcmVwb3J0ZWQgZnJvbSBsb3dlciBsYXllcgotICBhbGFybV9zZXRfb25fbWxvb3AocF9sY2ItPmwyY19sY2JfdGltZXIsIEwyQ0FQX0JMRV9MSU5LX0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGwyY19sY2JfdGltZXJfdGltZW91dCwgcF9sY2IpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19saW5rX3Byb2Nlc3NzX2JsZV9udW1fYnVmcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhICJjb250cm9sbGVyIGJ1ZmZlciBzaXplIgotICogICAgICAgICAgICAgICAgICBldmVudCBpcyBmaXJzdCByZWNlaXZlZCBmcm9tIHRoZSBjb250cm9sbGVyLiBJdCB1cGRhdGVzCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBMMkNBUCB2YWx1ZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2xpbmtfcHJvY2Vzc3NfYmxlX251bV9idWZzKHVpbnQxNl90IG51bV9sbV9ibGVfYnVmcykgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobnVtX2xtX2JsZV9idWZzID09IDApIHsKLSAgICBudW1fbG1fYmxlX2J1ZnMgPSBMMkNfREVGX05VTV9CTEVfQlVGX1NIQVJFRDsKLSAgICBsMmNiLm51bV9sbV9hY2xfYnVmcyAtPSBMMkNfREVGX05VTV9CTEVfQlVGX1NIQVJFRDsKLSAgfQotCi0gIGwyY2IubnVtX2xtX2JsZV9idWZzID0gbnVtX2xtX2JsZV9idWZzOwotICBsMmNiLmNvbnRyb2xsZXJfbGVfeG1pdF93aW5kb3cgPSBudW1fbG1fYmxlX2J1ZnM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfYmxlX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBsaW5rIGlzIGNyZWF0ZWQgb3IgcmVtb3ZlZAotICogICAgICAgICAgICAgICAgICB0byBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBwYWNrZXRzIGVhY2ggbGluayBtYXkgc2VuZCB0bwotICogICAgICAgICAgICAgICAgICB0aGUgSENJIHdpdGhvdXQgYW4gYWNrIGNvbWluZyBiYWNrLgotICoKLSAqICAgICAgICAgICAgICAgICAgQ3VycmVudGx5LCB0aGlzIGlzIGEgc2ltcGxlIGFsbG9jYXRpb24sIGRpdmlkaW5nIHRoZQotICogICAgICAgICAgICAgICAgICBudW1iZXIgb2YgQ29udHJvbGxlciBQYWNrZXRzIGJ5IHRoZSBudW1iZXIgb2YgbGlua3MuIEluCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBmdXR1cmUsIFFPUyBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBleGFtaW5lZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfYmxlX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24odm9pZCkgewotICB1aW50MTZfdCBxcSwgeXksIHFxX3JlbWFpbmRlcjsKLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB1aW50MTZfdCBoaV9xdW90YSwgbG93X3F1b3RhOwotICB1aW50MTZfdCBudW1fbG93cHJpX2xpbmtzID0gMDsKLSAgdWludDE2X3QgbnVtX2hpcHJpX2xpbmtzID0gMDsKLSAgdWludDE2X3QgY29udHJvbGxlcl94bWl0X3F1b3RhID0gbDJjYi5udW1fbG1fYmxlX2J1ZnM7Ci0gIHVpbnQxNl90IGhpZ2hfcHJpX2xpbmtfcXVvdGEgPSBMMkNBUF9ISUdIX1BSSV9NSU5fWE1JVF9RVU9UQV9BOwotCi0gIC8qIElmIG5vIGxpbmtzIGFjdGl2ZSwgcmVzZXQgYnVmZmVyIHF1b3RhcyBhbmQgY29udHJvbGxlciBidWZmZXJzICovCi0gIGlmIChsMmNiLm51bV9ibGVfbGlua3NfYWN0aXZlID09IDApIHsKLSAgICBsMmNiLmNvbnRyb2xsZXJfbGVfeG1pdF93aW5kb3cgPSBsMmNiLm51bV9sbV9ibGVfYnVmczsKLSAgICBsMmNiLmJsZV9yb3VuZF9yb2Jpbl9xdW90YSA9IGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQgPSAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEZpcnN0LCBjb3VudCB0aGUgbGlua3MgKi8KLSAgZm9yICh5eSA9IDAsIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07IHl5IDwgTUFYX0wyQ0FQX0xJTktTOyB5eSsrLCBwX2xjYisrKSB7Ci0gICAgaWYgKHBfbGNiLT5pbl91c2UgJiYgcF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIGlmIChwX2xjYi0+YWNsX3ByaW9yaXR5ID09IEwyQ0FQX1BSSU9SSVRZX0hJR0gpCi0gICAgICAgIG51bV9oaXByaV9saW5rcysrOwotICAgICAgZWxzZQotICAgICAgICBudW1fbG93cHJpX2xpbmtzKys7Ci0gICAgfQotICB9Ci0KLSAgLyogbm93IGFkanVzdCBoaWdoIHByaW9yaXR5IGxpbmsgcXVvdGEgKi8KLSAgbG93X3F1b3RhID0gbnVtX2xvd3ByaV9saW5rcyA/IDEgOiAwOwotICB3aGlsZSAoKG51bV9oaXByaV9saW5rcyAqIGhpZ2hfcHJpX2xpbmtfcXVvdGEgKyBsb3dfcXVvdGEpID4KLSAgICAgICAgIGNvbnRyb2xsZXJfeG1pdF9xdW90YSkKLSAgICBoaWdoX3ByaV9saW5rX3F1b3RhLS07Ci0KLSAgLyogV29yayBvdXQgdGhlIHhtaXQgcXVvdGEgYW5kIGJ1ZmZlciBxdW90YSBoaWdoIGFuZCBsb3cgcHJpb3JpdGllcyAqLwotICBoaV9xdW90YSA9IG51bV9oaXByaV9saW5rcyAqIGhpZ2hfcHJpX2xpbmtfcXVvdGE7Ci0gIGxvd19xdW90YSA9Ci0gICAgICAoaGlfcXVvdGEgPCBjb250cm9sbGVyX3htaXRfcXVvdGEpID8gY29udHJvbGxlcl94bWl0X3F1b3RhIC0gaGlfcXVvdGEgOiAxOwotCi0gIC8qIFdvcmsgb3V0IGFuZCBzYXZlIHRoZSBIQ0kgeG1pdCBxdW90YSBmb3IgZWFjaCBsb3cgcHJpb3JpdHkgbGluayAqLwotCi0gIC8qIElmIGVhY2ggbG93IHByaW9yaXR5IGxpbmsgY2Fubm90IGhhdmUgYXQgbGVhc3Qgb25lIGJ1ZmZlciAqLwotICBpZiAobnVtX2xvd3ByaV9saW5rcyA+IGxvd19xdW90YSkgewotICAgIGwyY2IuYmxlX3JvdW5kX3JvYmluX3F1b3RhID0gbG93X3F1b3RhOwotICAgIHFxID0gcXFfcmVtYWluZGVyID0gMDsKLSAgfQotICAvKiBJZiBlYWNoIGxvdyBwcmlvcml0eSBsaW5rIGNhbiBoYXZlIGF0IGxlYXN0IG9uZSBidWZmZXIgKi8KLSAgZWxzZSBpZiAobnVtX2xvd3ByaV9saW5rcyA+IDApIHsKLSAgICBsMmNiLmJsZV9yb3VuZF9yb2Jpbl9xdW90YSA9IDA7Ci0gICAgbDJjYi5ibGVfcm91bmRfcm9iaW5fdW5hY2tlZCA9IDA7Ci0gICAgcXEgPSBsb3dfcXVvdGEgLyBudW1fbG93cHJpX2xpbmtzOwotICAgIHFxX3JlbWFpbmRlciA9IGxvd19xdW90YSAlIG51bV9sb3dwcmlfbGlua3M7Ci0gIH0KLSAgLyogSWYgbm8gbG93IHByaW9yaXR5IGxpbmsgKi8KLSAgZWxzZSB7Ci0gICAgbDJjYi5ibGVfcm91bmRfcm9iaW5fcXVvdGEgPSAwOwotICAgIGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQgPSAwOwotICAgIHFxID0gcXFfcmVtYWluZGVyID0gMDsKLSAgfQotICBMMkNBUF9UUkFDRV9FVkVOVCgKLSAgICAgICJsMmNfYmxlX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24gIG51bV9oaXByaTogJXUgIG51bV9sb3dwcmk6ICV1ICAiCi0gICAgICAibG93X3F1b3RhOiAldSAgcm91bmRfcm9iaW5fcXVvdGE6ICV1ICBxcTogJXUiLAotICAgICAgbnVtX2hpcHJpX2xpbmtzLCBudW1fbG93cHJpX2xpbmtzLCBsb3dfcXVvdGEsIGwyY2IuYmxlX3JvdW5kX3JvYmluX3F1b3RhLAotICAgICAgcXEpOwotCi0gIC8qIE5vdywgYXNzaWduIHRoZSBxdW90YXMgdG8gZWFjaCBsaW5rICovCi0gIGZvciAoeXkgPSAwLCBwX2xjYiA9ICZsMmNiLmxjYl9wb29sWzBdOyB5eSA8IE1BWF9MMkNBUF9MSU5LUzsgeXkrKywgcF9sY2IrKykgewotICAgIGlmIChwX2xjYi0+aW5fdXNlICYmIHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgICBpZiAocF9sY2ItPmFjbF9wcmlvcml0eSA9PSBMMkNBUF9QUklPUklUWV9ISUdIKSB7Ci0gICAgICAgIHBfbGNiLT5saW5rX3htaXRfcXVvdGEgPSBoaWdoX3ByaV9saW5rX3F1b3RhOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogU2FmZXR5IGNoZWNrIGluIGNhc2Ugd2Ugc3dpdGNoZWQgdG8gcm91bmQtcm9iaW4gd2l0aCBzb21ldGhpbmcKLSAgICAgICAgICogb3V0c3RhbmRpbmcgKi8KLSAgICAgICAgLyogaWYgc2VudF9ub3RfYWNrZWQgaXMgYWRkZWQgaW50byByb3VuZF9yb2Jpbl91bmFja2VkIHRoZW4gZG8gbm90IGFkZAotICAgICAgICAgKiBpdCBhZ2FpbiAqLwotICAgICAgICAvKiBsMmNhcCBrZWVwcyB1cGRhdGluZyBzZW50X25vdF9hY2tlZCBmb3IgZXhpdGluZyBmcm9tIHJvdW5kIHJvYmluICovCi0gICAgICAgIGlmICgocF9sY2ItPmxpbmtfeG1pdF9xdW90YSA+IDApICYmIChxcSA9PSAwKSkKLSAgICAgICAgICBsMmNiLmJsZV9yb3VuZF9yb2Jpbl91bmFja2VkICs9IHBfbGNiLT5zZW50X25vdF9hY2tlZDsKLQotICAgICAgICBwX2xjYi0+bGlua194bWl0X3F1b3RhID0gcXE7Ci0gICAgICAgIGlmIChxcV9yZW1haW5kZXIgPiAwKSB7Ci0gICAgICAgICAgcF9sY2ItPmxpbmtfeG1pdF9xdW90YSsrOwotICAgICAgICAgIHFxX3JlbWFpbmRlci0tOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEwyQ0FQX1RSQUNFX0VWRU5UKAotICAgICAgICAgICJsMmNfYmxlX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24gTENCICVkICAgUHJpb3JpdHk6ICVkICBYbWl0UXVvdGE6ICVkIiwKLSAgICAgICAgICB5eSwgcF9sY2ItPmFjbF9wcmlvcml0eSwgcF9sY2ItPmxpbmtfeG1pdF9xdW90YSk7Ci0KLSAgICAgIEwyQ0FQX1RSQUNFX0VWRU5UKCIgICAgICAgIFNlbnROb3RBY2tlZDogJWQgIFJSVW5hY2tlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9sY2ItPnNlbnRfbm90X2Fja2VkLCBsMmNiLnJvdW5kX3JvYmluX3VuYWNrZWQpOwotCi0gICAgICAvKiBUaGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBoYXZlIHJlYWRqdXN0ZWQgdGhlIGxpbmsgcXVvdGFzIGFuZCAqLwotICAgICAgLyogdGhpcyBsaW5rIG1heSBoYXZlIHNlbnQgYW55dGhpbmcgYnV0IHNvbWUgb3RoZXIgbGluayBzZW50IHBhY2tldHMgc28gKi8KLSAgICAgIC8qIHNvIHdlIG1heSBuZWVkIGEgdGltZXIgdG8ga2ljayBvZmYgdGhpcyBsaW5rJ3MgdHJhbnNtaXNzaW9ucy4gKi8KLSAgICAgIGlmICgocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RFRCkgJiYKLSAgICAgICAgICAoIWxpc3RfaXNfZW1wdHkocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EpKSAmJgotICAgICAgICAgIChwX2xjYi0+c2VudF9ub3RfYWNrZWQgPCBwX2xjYi0+bGlua194bWl0X3F1b3RhKSkgewotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9sY2ItPmwyY19sY2JfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9MSU5LX0ZMT1dfQ09OVFJPTF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2xjYl90aW1lcl90aW1lb3V0LCBwX2xjYik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcHJvY2VzcyBMRSBSZW1vdGUgQ29ubmVjdGlvbiBQYXJhbWV0ZXIgUmVxdWVzdCBFdmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGludF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludF9tYXgsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9oYW5kbGUoaGFuZGxlKTsKLQotICBpZiAocF9sY2IgIT0gTlVMTCkgewotICAgIHBfbGNiLT5taW5faW50ZXJ2YWwgPSBpbnRfbWluOwotICAgIHBfbGNiLT5tYXhfaW50ZXJ2YWwgPSBpbnRfbWF4OwotICAgIHBfbGNiLT5sYXRlbmN5ID0gbGF0ZW5jeTsKLSAgICBwX2xjYi0+dGltZW91dCA9IHRpbWVvdXQ7Ci0KLSAgICAvKiBpZiB1cGRhdGUgaXMgZW5hYmxlZCwgYWx3YXlzIGFjY2VwdCBjb25uZWN0aW9uIHBhcmFtZXRlciB1cGRhdGUgKi8KLSAgICBpZiAoKHBfbGNiLT5jb25uX3VwZGF0ZV9tYXNrICYgTDJDX0JMRV9DT05OX1VQREFURV9ESVNBQkxFKSA9PSAwKSB7Ci0gICAgICBidHNuZF9oY2ljX2JsZV9yY19wYXJhbV9yZXFfcmVwbHkoaGFuZGxlLCBpbnRfbWluLCBpbnRfbWF4LCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsIDAsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICBMMkNBUF9UUkFDRV9FVkVOVCgiTDJDQVAgLSBMRSAtIHVwZGF0ZSBjdXJyZW50bHkgZGlzYWJsZWQiKTsKLSAgICAgIHBfbGNiLT5jb25uX3VwZGF0ZV9tYXNrIHw9IEwyQ19CTEVfTkVXX0NPTk5fUEFSQU07Ci0gICAgICBidHNuZF9oY2ljX2JsZV9yY19wYXJhbV9yZXFfbmVnX3JlcGx5KGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENJX0VSUl9VTkFDQ0VQVF9DT05OX0lOVEVSVkFMKTsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJObyBsaW5rIHRvIHVwZGF0ZSBjb25uZWN0aW9uIHBhcmFtZXRlciIpCi0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY2JsZV91cGRhdGVfZGF0YV9sZW5ndGgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlIGxpbmsgdHggZGF0YSBsZW5ndGggaWYgYXBwbGljYWJsZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY2JsZV91cGRhdGVfZGF0YV9sZW5ndGgodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIHVpbnQxNl90IHR4X210dSA9IDA7Ci0gIHVpbnQxNl90IGkgPSAwOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAvKiBTZWUgaWYgd2UgaGF2ZSBhIGxpbmsgY29udHJvbCBibG9jayBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KLSAgaWYgKHBfbGNiID09IE5VTEwpIHJldHVybjsKLQotICBmb3IgKGkgPSAwOyBpIDwgTDJDQVBfTlVNX0ZJWEVEX0NITkxTOyBpKyspIHsKLSAgICBpZiAoaSArIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwgIT0gTDJDQVBfQkxFX1NJR05BTExJTkdfQ0lEKSB7Ci0gICAgICBpZiAoKHBfbGNiLT5wX2ZpeGVkX2NjYnNbaV0gIT0gTlVMTCkgJiYKLSAgICAgICAgICAodHhfbXR1IDwgKHBfbGNiLT5wX2ZpeGVkX2NjYnNbaV0tPnR4X2RhdGFfbGVuICsgTDJDQVBfUEtUX09WRVJIRUFEKSkpCi0gICAgICAgIHR4X210dSA9IHBfbGNiLT5wX2ZpeGVkX2NjYnNbaV0tPnR4X2RhdGFfbGVuICsgTDJDQVBfUEtUX09WRVJIRUFEOwotICAgIH0KLSAgfQotCi0gIGlmICh0eF9tdHUgPiBCVE1fQkxFX0RBVEFfU0laRV9NQVgpIHR4X210dSA9IEJUTV9CTEVfREFUQV9TSVpFX01BWDsKLQotICAvKiB1cGRhdGUgVFggZGF0YSBsZW5ndGggaWYgY2hhbmdlZCAqLwotICBpZiAocF9sY2ItPnR4X2RhdGFfbGVuICE9IHR4X210dSkKLSAgICBCVE1fU2V0QmxlRGF0YUxlbmd0aChwX2xjYi0+cmVtb3RlX2JkX2FkZHIsIHR4X210dSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfcHJvY2Vzc19kYXRhX2xlbmd0aF9jaGFuZ2VfZXZ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIGRhdGEgbGVuZ3RoIGNoYW5nZSBldmVudAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY2JsZV9wcm9jZXNzX2RhdGFfbGVuZ3RoX2NoYW5nZV9ldmVudCh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0eF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJ4X2RhdGFfbGVuKSB7Ci0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0KLSAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzIFRYIGRhdGEgbGVuID0gJWQiLCBfX2Z1bmNfXywgdHhfZGF0YV9sZW4pOwotICBpZiAocF9sY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIGlmICh0eF9kYXRhX2xlbiA+IDApIHBfbGNiLT50eF9kYXRhX2xlbiA9IHR4X2RhdGFfbGVuOwotCi0gIC8qIGlnbm9yZSByeF9kYXRhIGxlbiBmb3Igbm93ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlcXVlc3QgZm9yCi0gKiAgICAgICAgICAgICAgICAgIExFIGNvbm5lY3Rpb24gb3JpZW50ZWQgY2hhbm5lbHMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcSh0TDJDX0NDQiogcF9jY2IpIHsKLSAgaWYgKCFwX2NjYikgcmV0dXJuOwotCi0gIGlmIChwX2NjYi0+cF9sY2IgJiYgcF9jY2ItPnBfbGNiLT50cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTEUgbGluayBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfY2NiLT5lY29jKSB7Ci0gICAgbDJjdV9zZW5kX3BlZXJfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHBfY2NiKTsKLSAgfSBlbHNlIHsKLSAgICBsMmN1X3NlbmRfcGVlcl9ibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHBfY2NiKTsKLSAgfQotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIExFIENyZWRpdCBCYXNlZCBDb25uZWN0aW9uIFJlc3BvbnNlIGZvcgotICogICAgICAgICAgICAgICAgICBMRSBjb25uZWN0aW9uIG9yaWVudGVkIGNoYW5uZWxzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXModEwyQ19DQ0IqIHBfY2NiLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgaWYgKCFwX2NjYikgcmV0dXJuOwotCi0gIGlmIChwX2NjYi0+cF9sY2IgJiYgcF9jY2ItPnBfbGNiLT50cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTEUgbGluayBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcyhwX2NjYiwgcmVzdWx0KTsKLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjYmxlX3NlbmRfZmxvd19jb250cm9sX2NyZWRpdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBmbG93IGNvbnRyb2wgY3JlZGl0cyBmb3IKLSAqICAgICAgICAgICAgICAgICAgTEUgY29ubmVjdGlvbiBvcmllbnRlZCBjaGFubmVscy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNibGVfc2VuZF9mbG93X2NvbnRyb2xfY3JlZGl0KHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgY3JlZGl0X3ZhbHVlKSB7Ci0gIGlmICghcF9jY2IpIHJldHVybjsKLQotICBpZiAocF9jY2ItPnBfbGNiICYmIHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkxFIGxpbmsgZG9lc24ndCBleGlzdCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGwyY3Vfc2VuZF9wZWVyX2JsZV9mbG93X2NvbnRyb2xfY3JlZGl0KHBfY2NiLCBjcmVkaXRfdmFsdWUpOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfc2VuZF9wZWVyX2Rpc2NfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGRpc2Nvbm5lY3QgcmVxdWVzdAotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlciBMRSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNibGVfc2VuZF9wZWVyX2Rpc2NfcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBMMkNBUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmICghcF9jY2IpIHJldHVybjsKLQotICBpZiAocF9jY2ItPnBfbGNiICYmIHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkxFIGxpbmsgZG9lc24ndCBleGlzdCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfZGlzY29ubl9yZXEocF9jY2IpOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNibGVfc2VjX2NvbXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc2VjdXJpdHkgcHJvY2VkdXJlIGZvciBhbiBMRQotICogICAgICAgICAgICAgICAgICBDT0MgbGluayBpcyBkb25lCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjYmxlX3NlY19jb21wKGNvbnN0IFJhd0FkZHJlc3MqIGJkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLCB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEgPSAqYmRhOwotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocF9iZGEsIEJUX1RSQU5TUE9SVF9MRSk7Ci0gIHRMMkNBUF9TRUNfREFUQSogcF9idWYgPSBOVUxMOwotICB1aW50OF90IHNlY19hY3Q7Ci0KLSAgaWYgKCFwX2xjYikgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzOiBzZWN1cml0eSBjb21wbGV0ZSBmb3IgdW5rbm93biBkZXZpY2UuIGJkYT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmRhLT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNlY19hY3QgPSBwX2xjYi0+c2VjX2FjdDsKLSAgcF9sY2ItPnNlY19hY3QgPSAwOwotCi0gIGlmICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9sY2ItPmxlX3NlY19wZW5kaW5nX3EpKSB7Ci0gICAgcF9idWYgPSAodEwyQ0FQX1NFQ19EQVRBKilmaXhlZF9xdWV1ZV9kZXF1ZXVlKHBfbGNiLT5sZV9zZWNfcGVuZGluZ19xKTsKLSAgICBpZiAoIXBfYnVmKSB7Ci0gICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICIlcyBTZWN1cml0eSBjb21wbGV0ZSBmb3IgcmVxdWVzdCBub3QgaW5pdGlhdGVkIGZyb20gTDJDQVAiLAotICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgICAoKihwX2J1Zi0+cF9jYWxsYmFjaykpKHBfYmRhLCBCVF9UUkFOU1BPUlRfTEUsIHBfYnVmLT5wX3JlZl9kYXRhLCBzdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc2VjX2FjdCA9PSBCVE1fU0VDX0VOQ1JZUFRfTUlUTSkgewotICAgICAgICBpZiAoQlRNX0lzTGlua0tleUF1dGhlZChwX2JkYSwgdHJhbnNwb3J0KSkKLSAgICAgICAgICAoKihwX2J1Zi0+cF9jYWxsYmFjaykpKHBfYmRhLCBCVF9UUkFOU1BPUlRfTEUsIHBfYnVmLT5wX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzIE1JVE0gUHJvdGVjdGlvbiBOb3QgcHJlc2VudCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAoKihwX2J1Zi0+cF9jYWxsYmFjaykpKHBfYmRhLCBCVF9UUkFOU1BPUlRfTEUsIHBfYnVmLT5wX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX0ZBSUxFRF9PTl9TRUNVUklUWSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCIlcyBNSVRNIFByb3RlY3Rpb24gbm90IHJlcXVpcmVkIHNlY19hY3QgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwX2xjYi0+c2VjX2FjdCk7Ci0KLSAgICAgICAgKCoocF9idWYtPnBfY2FsbGJhY2spKShwX2JkYSwgQlRfVFJBTlNQT1JUX0xFLCBwX2J1Zi0+cF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiJXMgU2VjdXJpdHkgY29tcGxldGUgZm9yIHJlcXVlc3Qgbm90IGluaXRpYXRlZCBmcm9tIEwyQ0FQIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotICBvc2lfZnJlZShwX2J1Zik7Ci0KLSAgd2hpbGUgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2xjYi0+bGVfc2VjX3BlbmRpbmdfcSkpIHsKLSAgICBwX2J1ZiA9ICh0TDJDQVBfU0VDX0RBVEEqKWZpeGVkX3F1ZXVlX2RlcXVldWUocF9sY2ItPmxlX3NlY19wZW5kaW5nX3EpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBCVE1fU1VDQ0VTUykKLSAgICAgICgqKHBfYnVmLT5wX2NhbGxiYWNrKSkocF9iZGEsIEJUX1RSQU5TUE9SVF9MRSwgcF9idWYtPnBfcmVmX2RhdGEsIHN0YXR1cyk7Ci0gICAgZWxzZQotICAgICAgbDJibGVfc2VjX2FjY2Vzc19yZXEocF9iZGEsIHBfYnVmLT5wc20sIHBfYnVmLT5pc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPnBfY2FsbGJhY2ssIHBfYnVmLT5wX3JlZl9kYXRhKTsKLQotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJibGVfc2VjX2FjY2Vzc19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IExFIENPQyBsaW5rIHRvIG1lZXQgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IHJlcXVpcmVtZW50IGZvciB0aGUgbGluawotICoKLSAqIFJldHVybnMgICAgICAgICAgUmV0dXJucyAgLSBMMkNBUCBMRSBDb25uZWN0aW9uIFJlc3BvbnNlIFJlc3VsdCBDb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10TDJDQVBfTEVfUkVTVUxUX0NPREUgbDJibGVfc2VjX2FjY2Vzc19yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfU0VDX0NCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpIHsKLSAgdEwyQ0FQX0xFX1JFU1VMVF9DT0RFIHJlc3VsdDsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gTlVMTDsKLQotICBpZiAoIXBfY2FsbGJhY2spIHsKLSAgICBMT0dfRVJST1IoIk5vIGNhbGxiYWNrIGZ1bmN0aW9uIik7Ci0gICAgcmV0dXJuIEwyQ0FQX0xFX1JFU1VMVF9OT19SRVNPVVJDRVM7Ci0gIH0KLQotICBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIGlmICghcF9sY2IpIHsKLSAgICBMT0dfRVJST1IoIlNlY3VyaXR5IGNoZWNrIGZvciB1bmtub3duIGRldmljZSIpOwotICAgIHBfY2FsbGJhY2soYmRfYWRkciwgQlRfVFJBTlNQT1JUX0xFLCBwX3JlZl9kYXRhLCBCVE1fVU5LTk9XTl9BRERSKTsKLSAgICByZXR1cm4gTDJDQVBfTEVfUkVTVUxUX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIHRMMkNBUF9TRUNfREFUQSogcF9idWYgPQotICAgICAgKHRMMkNBUF9TRUNfREFUQSopb3NpX21hbGxvYygodWludDE2X3Qpc2l6ZW9mKHRMMkNBUF9TRUNfREFUQSkpOwotICBpZiAoIXBfYnVmKSB7Ci0gICAgTE9HX0VSUk9SKCJObyByZXNvdXJjZXMgZm9yIGNvbm5lY3Rpb24iKTsKLSAgICBwX2NhbGxiYWNrKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9MRSwgcF9yZWZfZGF0YSwgQlRNX05PX1JFU09VUkNFUyk7Ci0gICAgcmV0dXJuIEwyQ0FQX0xFX1JFU1VMVF9OT19SRVNPVVJDRVM7Ci0gIH0KLQotICBwX2J1Zi0+cHNtID0gcHNtOwotICBwX2J1Zi0+aXNfb3JpZ2luYXRvciA9IGlzX29yaWdpbmF0b3I7Ci0gIHBfYnVmLT5wX2NhbGxiYWNrID0gcF9jYWxsYmFjazsKLSAgcF9idWYtPnBfcmVmX2RhdGEgPSBwX3JlZl9kYXRhOwotICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfbGNiLT5sZV9zZWNfcGVuZGluZ19xLCBwX2J1Zik7Ci0gIHJlc3VsdCA9IGJ0bV9ibGVfc3RhcnRfc2VjX2NoZWNrKGJkX2FkZHIsIHBzbSwgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmwyY2JsZV9zZWNfY29tcCwgcF9yZWZfZGF0YSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRqdXN0IHRoZSBjb25uZWN0aW9uIGludGVydmFscyBiYXNlZCBvbiB2YXJpb3VzCi0gKiBjb25zdHJhaW50cy4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIEhlYXJpbmcgQWlkIGRldmljZQotICogYm9uZGVkLCB0aGUgbWluaW11bSBpbnRlcnZhbCBpcyByYWlzZWQuIE9uIHJldHVybiwgbWluX2ludGVydmFsIGFuZAotICogbWF4X2ludGVydmFsIGFyZSB1cGRhdGVkLiAqLwotdm9pZCBMMkNBX0FkanVzdENvbm5lY3Rpb25JbnRlcnZhbHModWludDE2X3QqIG1pbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmbG9vcl9pbnRlcnZhbCkgewotICB1aW50MTZfdCBwaG9uZV9taW5faW50ZXJ2YWwgPSBmbG9vcl9pbnRlcnZhbDsKLQotICBpZiAoSGVhcmluZ0FpZDo6R2V0RGV2aWNlQ291bnQoKSA+IDApIHsKLSAgICAvLyBXaGVuIHRoZXJlIGFyZSBib25kZWQgSGVhcmluZyBBaWQgZGV2aWNlcywgd2Ugd2lsbCBjb25zdHJhaW5lZCB0aGlzCi0gICAgLy8gbWluaW11bSBpbnRlcnZhbC4KLSAgICBwaG9uZV9taW5faW50ZXJ2YWwgPSBCVE1fQkxFX0NPTk5fSU5UX01JTl9IRUFSSU5HQUlEOwotICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCIlczogSGF2ZSBIZWFyaW5nIEFpZHMuIE1pbi4gaW50ZXJ2YWwgaXMgc2V0IHRvICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGhvbmVfbWluX2ludGVydmFsKTsKLSAgfQotCi0gIGlmICgqbWluX2ludGVydmFsIDwgcGhvbmVfbWluX2ludGVydmFsKSB7Ci0gICAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzOiByZXF1ZXN0ZWQgbWluX2ludGVydmFsPSVkIHRvbyBzbWFsbC4gU2V0IHRvICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKm1pbl9pbnRlcnZhbCwgcGhvbmVfbWluX2ludGVydmFsKTsKLSAgICAqbWluX2ludGVydmFsID0gcGhvbmVfbWluX2ludGVydmFsOwotICB9Ci0KLSAgLy8gV2hpbGUgdGhpcyBjb3VsZCByZXN1bHQgaW4gY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHRoYXQgZmFsbAotICAvLyBvdXRzaWRlIGZvIHRoZSByYW5nZSByZXF1ZXN0ZWQsIHRoaXMgd2lsbCBhbGxvdyB0aGUgY29ubmVjdGlvbgotICAvLyB0byByZW1haW4gZXN0YWJsaXNoZWQuCi0gIC8vIEluIG90aGVyIHdvcmRzLCB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgY2VydGFpbiBwZXJpcGhlcmFscy4KLSAgaWYgKCptYXhfaW50ZXJ2YWwgPCBwaG9uZV9taW5faW50ZXJ2YWwpIHsKLSAgICBMMkNBUF9UUkFDRV9ERUJVRygiJXM6IHJlcXVlc3RlZCBtYXhfaW50ZXJ2YWw9JWQgdG9vIHNtYWxsLiBTZXQgdG8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqbWF4X2ludGVydmFsLCBwaG9uZV9taW5faW50ZXJ2YWwpOwotICAgICptYXhfaW50ZXJ2YWwgPSBwaG9uZV9taW5faW50ZXJ2YWw7Ci0gIH0KLX0KLQotdm9pZCBsMmNibGVfdXNlX3ByZWZlcnJlZF9jb25uX3BhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKGJkYSwgQlRfVFJBTlNQT1JUX0xFKTsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfb3JfYWxsb2NfZGV2KGJkYSk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGFueSBwcmVmZXJyZWQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLCBzZXQgdGhlbSBub3cgKi8KLSAgaWYgKChwX2xjYiAhPSBOVUxMKSAmJiAocF9kZXZfcmVjICE9IE5VTEwpICYmCi0gICAgICAocF9kZXZfcmVjLT5jb25uX3BhcmFtcy5taW5fY29ubl9pbnQgPj0gQlRNX0JMRV9DT05OX0lOVF9NSU4pICYmCi0gICAgICAocF9kZXZfcmVjLT5jb25uX3BhcmFtcy5taW5fY29ubl9pbnQgPD0gQlRNX0JMRV9DT05OX0lOVF9NQVgpICYmCi0gICAgICAocF9kZXZfcmVjLT5jb25uX3BhcmFtcy5tYXhfY29ubl9pbnQgPj0gQlRNX0JMRV9DT05OX0lOVF9NSU4pICYmCi0gICAgICAocF9kZXZfcmVjLT5jb25uX3BhcmFtcy5tYXhfY29ubl9pbnQgPD0gQlRNX0JMRV9DT05OX0lOVF9NQVgpICYmCi0gICAgICAocF9kZXZfcmVjLT5jb25uX3BhcmFtcy5wZXJpcGhlcmFsX2xhdGVuY3kgPD0gQlRNX0JMRV9DT05OX0xBVEVOQ1lfTUFYKSAmJgotICAgICAgKHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMuc3VwZXJ2aXNpb25fdG91dCA+PSBCVE1fQkxFX0NPTk5fU1VQX1RPVVRfTUlOKSAmJgotICAgICAgKHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMuc3VwZXJ2aXNpb25fdG91dCA8PSBCVE1fQkxFX0NPTk5fU1VQX1RPVVRfTUFYKSAmJgotICAgICAgKChwX2xjYi0+bWluX2ludGVydmFsIDwgcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5taW5fY29ubl9pbnQgJiYKLSAgICAgICAgcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5taW5fY29ubl9pbnQgIT0gQlRNX0JMRV9DT05OX1BBUkFNX1VOREVGKSB8fAotICAgICAgIChwX2xjYi0+bWluX2ludGVydmFsID4gcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5tYXhfY29ubl9pbnQpIHx8Ci0gICAgICAgKHBfbGNiLT5sYXRlbmN5ID4gcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5wZXJpcGhlcmFsX2xhdGVuY3kpIHx8Ci0gICAgICAgKHBfbGNiLT50aW1lb3V0ID4gcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5zdXBlcnZpc2lvbl90b3V0KSkpIHsKLSAgICBCVE1fVFJBQ0VfREVCVUcoCi0gICAgICAgICIlczogSEFORExFPSVkIG1pbl9jb25uX2ludD0lZCBtYXhfY29ubl9pbnQ9JWQgcGVyaXBoZXJhbF9sYXRlbmN5PSVkICIKLSAgICAgICAgInN1cGVydmlzaW9uX3RvdXQ9JWQiLAotICAgICAgICBfX2Z1bmNfXywgcF9sY2ItPkhhbmRsZSgpLCBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLm1pbl9jb25uX2ludCwKLSAgICAgICAgcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5tYXhfY29ubl9pbnQsCi0gICAgICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMucGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLnN1cGVydmlzaW9uX3RvdXQpOwotCi0gICAgcF9sY2ItPm1pbl9pbnRlcnZhbCA9IHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMubWluX2Nvbm5faW50OwotICAgIHBfbGNiLT5tYXhfaW50ZXJ2YWwgPSBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLm1heF9jb25uX2ludDsKLSAgICBwX2xjYi0+dGltZW91dCA9IHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMuc3VwZXJ2aXNpb25fdG91dDsKLSAgICBwX2xjYi0+bGF0ZW5jeSA9IHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMucGVyaXBoZXJhbF9sYXRlbmN5OwotCi0gICAgYnRzbmRfaGNpY19ibGVfdXBkX2xsX2Nvbm5fcGFyYW1zKAotICAgICAgICBwX2xjYi0+SGFuZGxlKCksIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMubWluX2Nvbm5faW50LAotICAgICAgICBwX2Rldl9yZWMtPmNvbm5fcGFyYW1zLm1heF9jb25uX2ludCwKLSAgICAgICAgcF9kZXZfcmVjLT5jb25uX3BhcmFtcy5wZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgIHBfZGV2X3JlYy0+Y29ubl9wYXJhbXMuc3VwZXJ2aXNpb25fdG91dCwgMCwgMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL2wyY2FwL2wyY19jc20uY2MgYi9zdGFjay9sMmNhcC9sMmNfY3NtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIyOWQxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2wyY2FwL2wyY19jc20uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBMMkNBUCBjaGFubmVsIHN0YXRlIG1hY2hpbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMT0dfVEFHICJsMmNfY3NtIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgImwyY19pbnQuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGwyY19jc21fY2xvc2VkKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGwyY19jc21fb3JpZ193NF9zZWNfY29tcCh0TDJDX0NDQiogcF9jY2IsIHRMMkNFVlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGwyY19jc21fdGVybV93NF9zZWNfY29tcCh0TDJDX0NDQiogcF9jY2IsIHRMMkNFVlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGwyY19jc21fdzRfbDJjYXBfY29ubmVjdF9yc3AodEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgbDJjX2NzbV93NF9sMmNhX2Nvbm5lY3RfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgbDJjX2NzbV9jb25maWcodEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LCB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgbDJjX2NzbV9vcGVuKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIGwyY19jc21fdzRfbDJjYXBfZGlzY29ubmVjdF9yc3AodEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgbDJjX2NzbV93NF9sMmNhX2Rpc2Nvbm5lY3RfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotCi1zdGF0aWMgY29uc3QgY2hhciogbDJjX2NzbV9nZXRfZXZlbnRfbmFtZSh0TDJDRVZUIGV2ZW50KTsKLQotLy8gU2VuZCBhIGNvbm5lY3QgcmVzcG9uc2Ugd2l0aCByZXN1bHQgT0sgYW5kIGFkanVzdCB0aGUgc3RhdGUgbWFjaGluZQotc3RhdGljIHZvaWQgbDJjX2NzbV9zZW5kX2Nvbm5lY3RfcnNwKHRMMkNfQ0NCKiBwX2NjYikgewotICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBX0NPTk5FQ1RfUlNQLCBOVUxMKTsKLX0KLQotLy8gU2VuZCBhIGNvbmZpZyByZXF1ZXN0IGFuZCBhZGp1c3QgdGhlIHN0YXRlIG1hY2hpbmUKLXN0YXRpYyB2b2lkIGwyY19jc21fc2VuZF9jb25maWdfcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICB0TDJDQVBfQ0ZHX0lORk8gY29uZmlne307Ci0gIGNvbmZpZy5tdHVfcHJlc2VudCA9IHRydWU7Ci0gIGNvbmZpZy5tdHUgPSBwX2NjYi0+cF9yY2ItPm15X210dTsKLSAgcF9jY2ItPm1heF9yeF9tdHUgPSBjb25maWcubXR1OwotICBpZiAocF9jY2ItPnBfcmNiLT5lcnRtX2luZm8ucHJlZmVycmVkX21vZGUgIT0gTDJDQVBfRkNSX0JBU0lDX01PREUpIHsKLSAgICBjb25maWcuZmNyX3ByZXNlbnQgPSB0cnVlOwotICAgIGNvbmZpZy5mY3IgPSBrRGVmYXVsdEVydG1PcHRpb25zOwotICB9Ci0gIHBfY2NiLT5vdXJfY2ZnID0gY29uZmlnOwotICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBX0NPTkZJR19SRVEsICZjb25maWcpOwotfQotCi0vLyBTZW5kIGEgY29uZmlnIHJlc3BvbnNlIHdpdGggcmVzdWx0IE9LIGFuZCBhZGp1c3QgdGhlIHN0YXRlIG1hY2hpbmUKLXN0YXRpYyB2b2lkIGwyY19jc21fc2VuZF9jb25maWdfcnNwX29rKHRMMkNfQ0NCKiBwX2NjYikgewotICB0TDJDQVBfQ0ZHX0lORk8gY29uZmlne307Ci0gIGNvbmZpZy5yZXN1bHQgPSBMMkNBUF9DRkdfT0s7Ci0gIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfQ09ORklHX1JTUCwgJmNvbmZpZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGwyY19jc21fc2VuZF9kaXNjb25uZWN0X3JzcCh0TDJDX0NDQiogcF9jY2IpIHsKLSAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JTUCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGwyY19jc21faW5kaWNhdGVfY29ubmVjdGlvbl9vcGVuKHRMMkNfQ0NCKiBwX2NjYikgewotICBpZiAocF9jY2ItPmNvbm5lY3Rpb25faW5pdGlhdG9yID09IEwyQ0FQX0lOSVRJQVRPUl9MT0NBTCkgewotICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfQ29ubmVjdENmbV9DYikocF9jY2ItPmxvY2FsX2NpZCwgTDJDQVBfQ09OTl9PSyk7Ci0gIH0gZWxzZSB7Ci0gICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9Db25uZWN0SW5kX0NiKSgKLSAgICAgICAgcF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkciwgcF9jY2ItPmxvY2FsX2NpZCwgcF9jY2ItPnBfcmNiLT5wc20sCi0gICAgICAgIHBfY2NiLT5yZW1vdGVfaWQpOwotICB9Ci0gIGlmIChwX2NjYi0+Y2hubF9zdGF0ZSA9PSBDU1RfT1BFTiAmJiAhcF9jY2ItPnBfbGNiLT5pc190cmFuc3BvcnRfYmxlKCkpIHsKLSAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0NvbmZpZ0NmbV9DYikoCi0gICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2NiLT5jb25uZWN0aW9uX2luaXRpYXRvciwgJnBfY2NiLT5wZWVyX2NmZyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19jc21fZXhlY3V0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgc3RhdGUgbWFjaGluZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfY3NtX2V4ZWN1dGUodEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgaWYgKCFsMmN1X2lzX2NjYl9hY3RpdmUocF9jY2IpKSB7Ci0gICAgTE9HX1dBUk4oIkNDQiBub3QgaW4gdXNlLCBldmVudCAoJWQpIGNhbm5vdCBiZSBwcm9jZXNzZWQiLCBldmVudCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HX0RFQlVHKCJFbnRyeSBjaG5sX3N0YXRlPSVzIFslZF0sIGV2ZW50PSVzIFslZF0iLAotICAgICAgICAgICAgY2hhbm5lbF9zdGF0ZV90ZXh0KHBfY2NiLT5jaG5sX3N0YXRlKS5jX3N0cigpLCBwX2NjYi0+Y2hubF9zdGF0ZSwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpLCBldmVudCk7Ci0KLSAgc3dpdGNoIChwX2NjYi0+Y2hubF9zdGF0ZSkgewotICAgIGNhc2UgQ1NUX0NMT1NFRDoKLSAgICAgIGwyY19jc21fY2xvc2VkKHBfY2NiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDU1RfT1JJR19XNF9TRUNfQ09NUDoKLSAgICAgIGwyY19jc21fb3JpZ193NF9zZWNfY29tcChwX2NjYiwgZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ1NUX1RFUk1fVzRfU0VDX0NPTVA6Ci0gICAgICBsMmNfY3NtX3Rlcm1fdzRfc2VjX2NvbXAocF9jY2IsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENTVF9XNF9MMkNBUF9DT05ORUNUX1JTUDoKLSAgICAgIGwyY19jc21fdzRfbDJjYXBfY29ubmVjdF9yc3AocF9jY2IsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENTVF9XNF9MMkNBX0NPTk5FQ1RfUlNQOgotICAgICAgbDJjX2NzbV93NF9sMmNhX2Nvbm5lY3RfcnNwKHBfY2NiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDU1RfQ09ORklHOgotICAgICAgbDJjX2NzbV9jb25maWcocF9jY2IsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENTVF9PUEVOOgotICAgICAgbDJjX2NzbV9vcGVuKHBfY2NiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDU1RfVzRfTDJDQVBfRElTQ09OTkVDVF9SU1A6Ci0gICAgICBsMmNfY3NtX3c0X2wyY2FwX2Rpc2Nvbm5lY3RfcnNwKHBfY2NiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDU1RfVzRfTDJDQV9ESVNDT05ORUNUX1JTUDoKLSAgICAgIGwyY19jc21fdzRfbDJjYV9kaXNjb25uZWN0X3JzcChwX2NjYiwgZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlVuaGFuZGxlZCBzdGF0ZSAlZCwgZXZlbnQgJWQiLCBwX2NjYi0+Y2hubF9zdGF0ZSwgZXZlbnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19jc21fY2xvc2VkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIGNoYW5uZWwgaXMgaW4KLSAqICAgICAgICAgICAgICAgICAgQ0xPU0VEIHN0YXRlLiBUaGlzIHN0YXRlIGV4aXN0cyBvbmx5IHdoZW4gdGhlIGxpbmsgaXMKLSAqICAgICAgICAgICAgICAgICAgYmVpbmcgaW5pdGlhbGx5IGVzdGFibGlzaGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBsMmNfY3NtX2Nsb3NlZCh0TDJDX0NDQiogcF9jY2IsIHRMMkNFVlQgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICB0TDJDX0NPTk5fSU5GTyogcF9jaSA9ICh0TDJDX0NPTk5fSU5GTyopcF9kYXRhOwotICB1aW50MTZfdCBsb2NhbF9jaWQgPSBwX2NjYi0+bG9jYWxfY2lkOwotICB0TDJDQV9ESVNDT05ORUNUX0lORF9DQiogZGlzY29ubmVjdF9pbmQ7Ci0KLSAgaWYgKHBfY2NiLT5wX3JjYiA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKCJMQ0lEOiAweCUwNHggIHN0OiBDTE9TRUQgIGV2dDogJXMgcF9yY2IgPT0gTlVMTCIsCi0gICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkaXNjb25uZWN0X2luZCA9IHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2I7Ci0KLSAgTE9HX0RFQlVHKCJMQ0lEOiAweCUwNHggIHN0OiBDTE9TRUQgIGV2dDogJXMiLCBwX2NjYi0+bG9jYWxfY2lkLAotICAgICAgICAgICAgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEwyQ0VWVF9MUF9ESVNDT05ORUNUX0lORDogLyogTGluayB3YXMgZGlzY29ubmVjdGVkICovCi0gICAgICBMT0dfREVCVUcoIkNhbGxpbmcgRGlzY29ubmVjdF9JbmRfQ2IoKSwgQ0lEOiAweCUwNHggIE5vIENvbmYgTmVlZGVkIiwKLSAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkKTsKLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgKCpkaXNjb25uZWN0X2luZCkobG9jYWxfY2lkLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0xQX0NPTk5FQ1RfQ0ZNOiAvKiBMaW5rIGNhbWUgdXAgICAgICAgICAqLwotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9PUklHX1c0X1NFQ19DT01QOwotICAgICAgICBsMmJsZV9zZWNfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX2NjYi0+cF9yY2ItPnBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgJmwyY19saW5rX3NlY19jb21wMiwgcF9jY2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfT1JJR19XNF9TRUNfQ09NUDsKLSAgICAgICAgYnRtX3NlY19sMmNhcF9hY2Nlc3NfcmVxKHBfY2NiLT5wX2xjYi0+cmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+cF9yY2ItPnBzbSwgdHJ1ZSwgJmwyY19saW5rX3NlY19jb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MUF9DT05ORUNUX0NGTV9ORUc6IC8qIExpbmsgZmFpbGVkICAgICAgICAgICovCi0gICAgICBpZiAocF9jaS0+c3RhdHVzID09IEhDSV9FUlJfQ09OTkVDVElPTl9FWElTVFMpIHsKLSAgICAgICAgYnRtX2FjbF9ub3RpZl9jb25uX2NvbGxpc2lvbihwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Vycm9yX0NiKShsb2NhbF9jaWQsIEwyQ0FQX0NPTk5fT1RIRVJfRVJST1IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX1JFUTogLyogQVBJIGNvbm5lY3QgcmVxdWVzdCAgKi8KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NPTk5FQ1RfUkVROgotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9PUklHX1c0X1NFQ19DT01QOwotICAgICAgICBsMmJsZV9zZWNfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX2NjYi0+cF9yY2ItPnBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgJmwyY19saW5rX3NlY19jb21wMiwgcF9jY2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFCVE1fU2V0TGlua1BvbGljeUFjdGl2ZU1vZGUocF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkcikpIHsKLSAgICAgICAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHNldCBsaW5rIHBvbGljeSBhY3RpdmUiKTsKLSAgICAgICAgfQotICAgICAgICAvKiBJZiBzZWMgYWNjZXNzIGRvZXMgbm90IHJlc3VsdCBpbiBzdGFydGVkIFNFQ19DT00gb3IgQ09NUF9ORUcgYXJlCi0gICAgICAgICAqIGFscmVhZHkgcHJvY2Vzc2VkICovCi0gICAgICAgIGlmIChidG1fc2VjX2wyY2FwX2FjY2Vzc19yZXEoCi0gICAgICAgICAgICAgICAgcF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkciwgcF9jY2ItPnBfcmNiLT5wc20sIHRydWUsCi0gICAgICAgICAgICAgICAgJmwyY19saW5rX3NlY19jb21wLCBwX2NjYikgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfT1JJR19XNF9TRUNfQ09NUDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9TRUNfQ09NUDoKLSAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX1c0X0wyQ0FQX0NPTk5FQ1RfUlNQOwotCi0gICAgICAvKiBXYWl0IGZvciB0aGUgaW5mbyByZXNwIGluIHRoaXMgc3RhdGUgYmVmb3JlIHNlbmRpbmcgY29ubmVjdCByZXEgKGlmCi0gICAgICAgKiBuZWVkZWQpICovCi0gICAgICBpZiAoIXBfY2NiLT5wX2xjYi0+dzRfaW5mb19yc3ApIHsKLSAgICAgICAgLyogTmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBjb21wYXRpYmxlIGNoYW5uZWwgdG8gY29udGludWUgKi8KLSAgICAgICAgaWYgKCFsMmNfZmNyX2Noa19jaGFuX21vZGVzKHBfY2NiKSkgewotICAgICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRXJyb3JfQ2IpKGxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DT05OX09USEVSX0VSUk9SKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsMmN1X3NlbmRfcGVlcl9jb25uZWN0X3JlcShwX2NjYik7Ci0gICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DSE5MX0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2NjYl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfU0VDX0NPTVBfTkVHOiAvKiBzb21ldGhpbmcgaXMgcmVhbGx5IGJhZCB3aXRoIHNlY3VyaXR5ICovCi0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRXJyb3JfQ2IpKGxvY2FsX2NpZCwgTDJDQVBfQ09OTl9PVEhFUl9FUlJPUik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9DT05ORUNUX1JFUTogLyogUGVlciBjb25uZWN0IHJlcXVlc3QgKi8KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DT05ORUNUX1JFUToKLSAgICAgIC8qIHN0b3AgbGluayB0aW1lciB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIEEyTVAsIFNlY3VyaXR5LCBhbmQKLSAgICAgICAqIEwyQ0FQICovCi0gICAgICBhbGFybV9jYW5jZWwocF9jY2ItPnBfbGNiLT5sMmNfbGNiX3RpbWVyKTsKLQotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9URVJNX1c0X1NFQ19DT01QOwotICAgICAgICB0TDJDQVBfTEVfUkVTVUxUX0NPREUgcmVzdWx0ID0gbDJibGVfc2VjX2FjY2Vzc19yZXEoCi0gICAgICAgICAgICBwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX2NjYi0+cF9yY2ItPnBzbSwgZmFsc2UsCi0gICAgICAgICAgICAmbDJjX2xpbmtfc2VjX2NvbXAyLCBwX2NjYik7Ci0KLSAgICAgICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9JTlNVRkZJQ0lFTlRfQVVUSE9SSVpBVElPTjoKLSAgICAgICAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9VTkFDQ0VQVEFCTEVfUEFSQU1FVEVSUzoKLSAgICAgICAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9JTlZBTElEX1BBUkFNRVRFUlM6Ci0gICAgICAgICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0FVVEhFTlRJQ0FUSU9OOgotICAgICAgICAgIGNhc2UgTDJDQVBfTEVfUkVTVUxUX0lOU1VGRklDSUVOVF9FTkNSWVBfS0VZX1NJWkU6Ci0gICAgICAgICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0VOQ1JZUDoKLSAgICAgICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb25uZWN0aW9uKHBfY2NiLCBwX2NjYi0+cmVtb3RlX2lkLCByZXN1bHQpOwotICAgICAgICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9DT05OX09LOgotICAgICAgICAgIGNhc2UgTDJDQVBfTEVfUkVTVUxUX05PX1BTTToKLSAgICAgICAgICBjYXNlIEwyQ0FQX0xFX1JFU1VMVF9OT19SRVNPVVJDRVM6Ci0gICAgICAgICAgY2FzZSBMMkNBUF9MRV9SRVNVTFRfSU5WQUxJRF9TT1VSQ0VfQ0lEOgotICAgICAgICAgIGNhc2UgTDJDQVBfTEVfUkVTVUxUX1NPVVJDRV9DSURfQUxSRUFEWV9BTExPQ0FURUQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFCVE1fU2V0TGlua1BvbGljeUFjdGl2ZU1vZGUocF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkcikpIHsKLSAgICAgICAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHNldCBsaW5rIHBvbGljeSBhY3RpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9URVJNX1c0X1NFQ19DT01QOwotICAgICAgICBhdXRvIHN0YXR1cyA9IGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+cF9yY2ItPnBzbSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsMmNfbGlua19zZWNfY29tcCwgcF9jY2IpOwotICAgICAgICBpZiAoc3RhdHVzID09IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgICAgIC8vIHN0YXJ0ZWQgdGhlIHNlY3VyaXR5IHByb2Nlc3MsIHRlbGwgdGhlIHBlZXIgdG8gc2V0IGEgbG9uZ2VyIHRpbWVyCi0gICAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yc3AocF9jY2IsIEwyQ0FQX0NPTk5fUEVORElORywgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTE9HX0lORk8oIkNoZWNrIHNlY3VyaXR5IGZvciBwc20gMHglMDR4LCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgICAgIHBfY2NiLT5wX3JjYi0+cHNtLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX1RJTUVPVVQ6Ci0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRXJyb3JfQ2IpKGxvY2FsX2NpZCwgTDJDQVBfQ09OTl9PVEhFUl9FUlJPUik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RBVEE6ICAgICAgLyogUGVlciBkYXRhIHBhY2tldCByY3ZkICAgICovCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9EQVRBX1dSSVRFOiAvKiBVcHBlciBsYXllciBkYXRhIHRvIHNlbmQgKi8KLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfRElTQ09OTkVDVF9SRVE6IC8qIFVwcGVyIHdhbnRzIHRvIGRpc2Nvbm5lY3QgKi8KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJIYW5kbGluZyB1bmV4cGVjdGVkIGV2ZW50OiVzIiwgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotICB9Ci0gIExPR19ERUJVRygiRXhpdCBjaG5sX3N0YXRlPSVzIFslZF0sIGV2ZW50PSVzIFslZF0iLAotICAgICAgICAgICAgY2hhbm5lbF9zdGF0ZV90ZXh0KHBfY2NiLT5jaG5sX3N0YXRlKS5jX3N0cigpLCBwX2NjYi0+Y2hubF9zdGF0ZSwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpLCBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfY3NtX29yaWdfdzRfc2VjX2NvbXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBDU1RfT1JJR19XNF9TRUNfQ09NUCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbDJjX2NzbV9vcmlnX3c0X3NlY19jb21wKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdEwyQ0FfRElTQ09OTkVDVF9JTkRfQ0IqIGRpc2Nvbm5lY3RfaW5kID0KLSAgICAgIHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2I7Ci0gIHVpbnQxNl90IGxvY2FsX2NpZCA9IHBfY2NiLT5sb2NhbF9jaWQ7Ci0KLSAgTE9HX0RFQlVHKCIlcyAtIExDSUQ6IDB4JTA0eCAgc3Q6IE9SSUdfVzRfU0VDX0NPTVAgIGV2dDogJXMiLAotICAgICAgICAgICAgKChwX2NjYi0+cF9sY2IpICYmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpKQotICAgICAgICAgICAgICAgID8gIkxFICIKLSAgICAgICAgICAgICAgICA6ICIiLAotICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotCi0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEwyQ0VWVF9MUF9ESVNDT05ORUNUX0lORDogLyogTGluayB3YXMgZGlzY29ubmVjdGVkICovCi0gICAgICBMT0dfREVCVUcoIkNhbGxpbmcgRGlzY29ubmVjdF9JbmRfQ2IoKSwgQ0lEOiAweCUwNHggIE5vIENvbmYgTmVlZGVkIiwKLSAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkKTsKLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgKCpkaXNjb25uZWN0X2luZCkobG9jYWxfY2lkLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX1NFQ19SRV9TRU5EX0NNRDogLyogQlRNIGhhcyBlbm91Z2ggaW5mbyB0byBwcm9jZWVkICovCi0gICAgY2FzZSBMMkNFVlRfTFBfQ09OTkVDVF9DRk06ICAvKiBMaW5rIGNhbWUgdXAgICAgICAgICAqLwotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBsMmJsZV9zZWNfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX2NjYi0+cF9yY2ItPnBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZsMmNfbGlua19zZWNfY29tcDIsIHBfY2NiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfcmNiLT5wc20sIHRydWUsICZsMmNfbGlua19zZWNfY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2NiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfU0VDX0NPTVA6IC8qIFNlY3VyaXR5IGNvbXBsZXRlZCBzdWNjZXNzICovCi0gICAgICAvKiBXYWl0IGZvciB0aGUgaW5mbyByZXNwIGluIHRoaXMgc3RhdGUgYmVmb3JlIHNlbmRpbmcgY29ubmVjdCByZXEgKGlmCi0gICAgICAgKiBuZWVkZWQpICovCi0gICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9XNF9MMkNBUF9DT05ORUNUX1JTUDsKLSAgICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgICBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHBfY2NiKTsgLyogU3RhcnQgQ29ubmVjdGlvbiAgICAgKi8KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghcF9jY2ItPnBfbGNiLT53NF9pbmZvX3JzcCkgewotICAgICAgICAgIC8qIE5lZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgY29tcGF0aWJsZSBjaGFubmVsIHRvIGNvbnRpbnVlICovCi0gICAgICAgICAgaWYgKCFsMmNfZmNyX2Noa19jaGFuX21vZGVzKHBfY2NiKSkgewotICAgICAgICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Vycm9yX0NiKShsb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DT05OX09USEVSX0VSUk9SKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0NITkxfQ09OTkVDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yZXEocF9jY2IpOyAvKiBTdGFydCBDb25uZWN0aW9uICAgICAqLwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9TRUNfQ09NUF9ORUc6Ci0gICAgICAvKiBJZiBsYXN0IGNoYW5uZWwgaW1tZWRpYXRlbHkgZGlzY29ubmVjdCB0aGUgQUNMIGZvciBiZXR0ZXIgc2VjdXJpdHkuCi0gICAgICAgICBBbHNvIHByZXZlbnRzIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBCVE0gYW5kIEwyQ0FQICovCi0gICAgICBpZiAoKHBfY2NiID09IHBfY2NiLT5wX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiKSAmJgotICAgICAgICAgIChwX2NjYiA9PSBwX2NjYi0+cF9sY2ItPmNjYl9xdWV1ZS5wX2xhc3RfY2NiKSkgewotICAgICAgICBwX2NjYi0+cF9sY2ItPmlkbGVfdGltZW91dCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9FcnJvcl9DYikobG9jYWxfY2lkLCBMMkNBUF9DT05OX09USEVSX0VSUk9SKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9EQVRBX1dSSVRFOiAvKiBVcHBlciBsYXllciBkYXRhIHRvIHNlbmQgKi8KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9EQVRBOiAgICAgIC8qIFBlZXIgZGF0YSBwYWNrZXQgcmN2ZCAgICAqLwotICAgICAgb3NpX2ZyZWUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JFUTogLyogVXBwZXIgd2FudHMgdG8gZGlzY29ubmVjdCAqLwotICAgICAgLyogVGVsbCBzZWN1cml0eSBtYW5hZ2VyIHRvIGFib3J0ICovCi0gICAgICBidG1fc2VjX2Fib3J0X2FjY2Vzc19yZXEocF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJIYW5kbGluZyB1bmV4cGVjdGVkIGV2ZW50OiVzIiwgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotICB9Ci0gIExPR19ERUJVRygiRXhpdCBjaG5sX3N0YXRlPSVzIFslZF0sIGV2ZW50PSVzIFslZF0iLAotICAgICAgICAgICAgY2hhbm5lbF9zdGF0ZV90ZXh0KHBfY2NiLT5jaG5sX3N0YXRlKS5jX3N0cigpLCBwX2NjYi0+Y2hubF9zdGF0ZSwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpLCBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfY3NtX3Rlcm1fdzRfc2VjX2NvbXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBDU1RfVEVSTV9XNF9TRUNfQ09NUCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbDJjX2NzbV90ZXJtX3c0X3NlY19jb21wKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgTE9HX0RFQlVHKCJMQ0lEOiAweCUwNHggIHN0OiBURVJNX1c0X1NFQ19DT01QICBldnQ6ICVzIiwgcF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBMMkNFVlRfTFBfRElTQ09OTkVDVF9JTkQ6IC8qIExpbmsgd2FzIGRpc2Nvbm5lY3RlZCAqLwotICAgICAgLyogVGVsbCBzZWN1cml0eSBtYW5hZ2VyIHRvIGFib3J0ICovCi0gICAgICBidG1fc2VjX2Fib3J0X2FjY2Vzc19yZXEocF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9TRUNfQ09NUDoKLSAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX1c0X0wyQ0FfQ09OTkVDVF9SU1A7Ci0KLSAgICAgIC8qIFdhaXQgZm9yIHRoZSBpbmZvIHJlc3AgaW4gbmV4dCBzdGF0ZSBiZWZvcmUgc2VuZGluZyBjb25uZWN0IGluZCAoaWYKLSAgICAgICAqIG5lZWRlZCkgKi8KLSAgICAgIGlmICghcF9jY2ItPnBfbGNiLT53NF9pbmZvX3JzcCkgewotICAgICAgICBMT0dfREVCVUcoIk5vdCB3YWl0aW5nIGZvciBpbmZvIHJlc3BvbnNlLCBzZW5kaW5nIGNvbm5lY3QgcmVzcG9uc2UiKTsKLSAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBnZXQgaW5mbyBmcm9tIHBlZXIgb3IgYWxyZWFkeSByZXRyaWV2ZWQgc28gY29udGludWUgKi8KLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotCi0gICAgICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCAhPSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgICBMT0dfREVCVUcoIk5vdCBMRSBjb25uZWN0aW9uLCBzZW5kaW5nIGNvbmZpZ3VyZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgbDJjX2NzbV9zZW5kX2Nvbm5lY3RfcnNwKHBfY2NiKTsKLSAgICAgICAgICBsMmNfY3NtX3NlbmRfY29uZmlnX3JlcShwX2NjYik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHBfY2NiLT5lY29jKSB7Ci0gICAgICAgICAgICAvKiBIYW5kbGUgQ3JlZGl0IEJhc2VkIENvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgIExPR19ERUJVRygiQ2FsbGluZyBDcmVkaXRCYXNlZENvbm5lY3RfSW5kX0NiKCksIG51bSBvZiBjaWRzOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubl9jbnQpOwotCi0gICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gcGVuZGluZ19jaWRzOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudDsgaSsrKSB7Ci0gICAgICAgICAgICAgIHVpbnQxNl90IGNpZCA9IHBfY2NiLT5wX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5lY3Rpb25fY2lkc1tpXTsKLSAgICAgICAgICAgICAgaWYgKGNpZCAhPSAwKSBwZW5kaW5nX2NpZHMucHVzaF9iYWNrKGNpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0SW5kX0NiKSgKLSAgICAgICAgICAgICAgICBwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwZW5kaW5nX2NpZHMsIHBfY2NiLT5wX3JjYi0+cHNtLAotICAgICAgICAgICAgICAgIHBfY2NiLT5wZWVyX2NmZy5tdHUsIHBfY2NiLT5yZW1vdGVfaWQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBIYW5kbGUgQkxFIENvQyAqLwotICAgICAgICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIENvbm5lY3RfSW5kX0NiKCksIENJRDogMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkKTsKLSAgICAgICAgICAgIGwyY19jc21fc2VuZF9jb25uZWN0X3JzcChwX2NjYik7Ci0gICAgICAgICAgICBsMmNfY3NtX2luZGljYXRlX2Nvbm5lY3Rpb25fb3BlbihwX2NjYik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKgotICAgICAgICAqKiBMMkNBUCBDb25uZWN0IFJlc3BvbnNlIHdpbGwgYmUgc2VudCBvdXQgYnkgMyBzZWMgdGltZXIgZXhwaXJhdGlvbgotICAgICAgICAqKiBiZWNhdXNlIEJsdWVzb2xlaWwgZG9lc24ndCByZXNwb25kIHRvIEwyQ0FQIEluZm9ybWF0aW9uIFJlcXVlc3QuCi0gICAgICAgICoqIEJsdWVzb2xlaWwgc2VlbXMgdG8gZGlzY29ubmVjdCBBQ0wgbGluayBhcyBmYWlsdXJlIGNhc2UsIGJlY2F1c2UKLSAgICAgICAgKiogaXQgdGFrZXMgdG9vIGxvbmcgKDR+N3NlY3MpIHRvIGdldCByZXNwb25zZS4KLSAgICAgICAgKiogcHJvZHVjdCB2ZXJzaW9uIDogQmx1ZXNvbGVpbCAyLjEuMS4wIEVEUiBSZWxlYXNlIDA2MDEyMwotICAgICAgICAqKiBzdGFjayB2ZXJzaW9uICAgOiAwNS4wNC4xMS4yMDA2MDExOQotICAgICAgICAqLwotCi0gICAgICAgIC8qIENhbmNlbCBjY2IgdGltZXIgYXMgc2VjdXJpdHkgY29tcGxldGUuIHdhaXRpbmcgZm9yIHc0X2luZm9fcnNwCi0gICAgICAgICoqIG9uY2UgaW5mbyByc3AgcmVjZWl2ZWQsIGNvbm5lY3Rpb24gcnNwIHRpbWVyIHdpbGwgYmUgc3RhcnRlZAotICAgICAgICAqKiB3aGlsZSBzZW5kaW5nIGNvbm5lY3Rpb24gaW5kIHRvIHByb2ZpbGVzCi0gICAgICAgICovCi0gICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+bDJjX2NjYl90aW1lcik7Ci0KLSAgICAgICAgLyogV2FpdGluZyBmb3IgdGhlIGluZm8gcmVzcCwgdGVsbCB0aGUgcGVlciB0byBzZXQgYSBsb25nZXIgdGltZXIgKi8KLSAgICAgICAgTE9HX0RFQlVHKCJXYWl0aW5nIGZvciBpbmZvIHJlc3BvbnNlLCBzZW5kaW5nIGNvbm5lY3QgcGVuZGluZyIpOwotICAgICAgICBsMmN1X3NlbmRfcGVlcl9jb25uZWN0X3JzcChwX2NjYiwgTDJDQVBfQ09OTl9QRU5ESU5HLCAwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfU0VDX0NPTVBfTkVHOgotICAgICAgaWYgKCgodEwyQ19DT05OX0lORk8qKXBfZGF0YSktPnN0YXR1cyA9PSBCVE1fREVMQVlfQ0hFQ0spIHsKLSAgICAgICAgLyogc3RhcnQgYSB0aW1lciAtIGVuY3J5cHRpb24gY2hhbmdlIG5vdCByZWNlaXZlZCBiZWZvcmUgTDJDQVAgY29ubmVjdAotICAgICAgICAgKiByZXEgKi8KLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfREVMQVlfQ0hFQ0tfU000X1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpCi0gICAgICAgICAgbDJjdV9yZWplY3RfYmxlX2Nvbm5lY3Rpb24oCi0gICAgICAgICAgICAgIHBfY2NiLCBwX2NjYi0+cmVtb3RlX2lkLAotICAgICAgICAgICAgICBMMkNBUF9MRV9SRVNVTFRfSU5TVUZGSUNJRU5UX0FVVEhFTlRJQ0FUSU9OKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Nvbm5lY3RfcnNwKHBfY2NiLCBMMkNBUF9DT05OX1NFQ1VSSVRZX0JMT0NLLCAwKTsKLSAgICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfREFUQV9XUklURTogLyogVXBwZXIgbGF5ZXIgZGF0YSB0byBzZW5kICovCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfREFUQTogICAgICAvKiBQZWVyIGRhdGEgcGFja2V0IHJjdmQgICAgKi8KLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfRElTQ09OTkVDVF9SRVE6IC8qIFVwcGVyIHdhbnRzIHRvIGRpc2Nvbm5lY3QgKi8KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9ESVNDT05ORUNUX1JFUTogLyogUGVlciBkaXNjb25uZWN0ZWQgcmVxdWVzdCAqLwotICAgICAgbDJjdV9zZW5kX3BlZXJfZGlzY19yc3AocF9jY2ItPnBfbGNiLCBwX2NjYi0+cmVtb3RlX2lkLCBwX2NjYi0+bG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnJlbW90ZV9jaWQpOwotCi0gICAgICAvKiBUZWxsIHNlY3VyaXR5IG1hbmFnZXIgdG8gYWJvcnQgKi8KLSAgICAgIGJ0bV9zZWNfYWJvcnRfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyKTsKLQotICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX1RJTUVPVVQ6Ci0gICAgICAvKiBTTTQgcmVsYXRlZC4gKi8KLSAgICAgIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHBfY2NiLT5wX2xjYi0+SGFuZGxlKCksIEhDSV9FUlJfQVVUSF9GQUlMVVJFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfU0VDX1JFX1NFTkRfQ01EOiAvKiBCVE0gaGFzIGVub3VnaCBpbmZvIHRvIHByb2NlZWQgKi8KLSAgICAgIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX2NjYi0+cF9yY2ItPnBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJmwyY19saW5rX3NlY19jb21wLCBwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIkhhbmRsaW5nIHVuZXhwZWN0ZWQgZXZlbnQ6JXMiLCBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0gIH0KLSAgTE9HX0RFQlVHKCJFeGl0IGNobmxfc3RhdGU9JXMgWyVkXSwgZXZlbnQ9JXMgWyVkXSIsCi0gICAgICAgICAgICBjaGFubmVsX3N0YXRlX3RleHQocF9jY2ItPmNobmxfc3RhdGUpLmNfc3RyKCksIHBfY2NiLT5jaG5sX3N0YXRlLAotICAgICAgICAgICAgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCksIGV2ZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19jc21fdzRfbDJjYXBfY29ubmVjdF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBDU1RfVzRfTDJDQVBfQ09OTkVDVF9SU1Agc3RhdGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGwyY19jc21fdzRfbDJjYXBfY29ubmVjdF9yc3AodEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdEwyQ19DT05OX0lORk8qIHBfY2kgPSAodEwyQ19DT05OX0lORk8qKXBfZGF0YTsKLSAgdEwyQ0FfRElTQ09OTkVDVF9JTkRfQ0IqIGRpc2Nvbm5lY3RfaW5kID0KLSAgICAgIHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2I7Ci0gIHRMMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX0NGTV9DQiogY3JlZGl0X2Jhc2VkX2Nvbm5lY3RfY2ZtID0KLSAgICAgIHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0NyZWRpdEJhc2VkQ29ubmVjdENmbV9DYjsKLSAgdWludDE2X3QgbG9jYWxfY2lkID0gcF9jY2ItPmxvY2FsX2NpZDsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gcF9jY2ItPnBfbGNiOwotCi0gIExPR19ERUJVRygiTENJRDogMHglMDR4ICBzdDogVzRfTDJDQVBfQ09OX1JTUCAgZXZ0OiAlcyIsIHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgTDJDRVZUX0xQX0RJU0NPTk5FQ1RfSU5EOiAvKiBMaW5rIHdhcyBkaXNjb25uZWN0ZWQgKi8KLSAgICAgIC8qIFNlbmQgZGlzYyBpbmRpY2F0aW9uIHVubGVzcyBwZWVyIHRvIHBlZXIgcmFjZSBjb25kaXRpb24gQU5EIG5vcm1hbAotICAgICAgICogZGlzY29ubmVjdCAqLwotICAgICAgLyogKigodWludDhfdCAqKXBfZGF0YSkgIT0gSENJX0VSUl9QRUVSX1VTRVIgaGFwcGVucyB3aGVuIHBlZXIgZGV2aWNlIHRyeQotICAgICAgICogdG8gZGlzY29ubmVjdCBmb3Igbm9ybWFsIHJlYXNvbiAqLwotICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfQ0xPU0VEOwotICAgICAgaWYgKChwX2NjYi0+ZmxhZ3MgJiBDQ0JfRkxBR19OT19SRVRSWSkgfHwgIXBfZGF0YSB8fAotICAgICAgICAgICgqKCh1aW50OF90KilwX2RhdGEpICE9IEhDSV9FUlJfUEVFUl9VU0VSKSkgewotICAgICAgICBMT0dfREVCVUcoIkNhbGxpbmcgRGlzY29ubmVjdF9JbmRfQ2IoKSwgQ0lEOiAweCUwNHggIE5vIENvbmYgTmVlZGVkIiwKLSAgICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICAgKCpkaXNjb25uZWN0X2luZCkobG9jYWxfY2lkLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBwX2NjYi0+ZmxhZ3MgfD0gQ0NCX0ZMQUdfTk9fUkVUUlk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQOiAvKiBHb3QgcGVlciBjb25uZWN0IGNvbmZpcm0gKi8KLSAgICAgIHBfY2NiLT5yZW1vdGVfY2lkID0gcF9jaS0+cmVtb3RlX2NpZDsKLSAgICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgLyogQ29ubmVjdGlvbiBpcyBjb21wbGV0ZWQgKi8KLSAgICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5sMmNfY2NiX3RpbWVyKTsKLSAgICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfT1BFTjsKLSAgICAgICAgbDJjX2NzbV9pbmRpY2F0ZV9jb25uZWN0aW9uX29wZW4ocF9jY2IpOwotICAgICAgICBwX2NjYi0+bG9jYWxfY29ubl9jZmcgPSBwX2NjYi0+cF9yY2ItPmNvY19jZmc7Ci0gICAgICAgIHBfY2NiLT5yZW1vdGVfY3JlZGl0X2NvdW50ID0gcF9jY2ItPnBfcmNiLT5jb2NfY2ZnLmNyZWRpdHM7Ci0gICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfQ09OTkVDVF9SU1AsIE5VTEwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfQ09ORklHOwotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfQ0ZHX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgIH0KLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBDb25uZWN0X0NmbV9DYigpLCBDSUQ6IDB4JTA0eCwgU3VjY2VzcyIsCi0gICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0KLSAgICAgIGwyY19jc21fc2VuZF9jb25maWdfcmVxKHBfY2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1BfUE5EOiAvKiBHb3QgcGVlciBjb25uZWN0IHBlbmRpbmcgKi8KLSAgICAgIHBfY2NiLT5yZW1vdGVfY2lkID0gcF9jaS0+cmVtb3RlX2NpZDsKLSAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NjYi0+bDJjX2NjYl90aW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DSE5MX0NPTk5FQ1RfRVhUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2NjYl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUDoKLSAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+bDJjX2NjYl90aW1lcik7Ci0gICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9PUEVOOwotICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICJDYWxsaW5nIGNyZWRpdF9iYXNlZF9jb25uZWN0X2NmbSgpLCIKLSAgICAgICAgICAiY2lkICVkLCByZXN1bHQgMHglMDR4IiwKLSAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBMMkNBUF9DT05OX09LKTsKLQotICAgICAgKCpjcmVkaXRfYmFzZWRfY29ubmVjdF9jZm0pKHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgcF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NpLT5wZWVyX210dSwgTDJDQVBfQ09OTl9PSyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUF9ORUc6Ci0gICAgICBMT0dfREVCVUcoCi0gICAgICAgICAgIkNhbGxpbmcgcEwyQ0FfRXJyb3JfQ2IoKSwiCi0gICAgICAgICAgImNpZCAlZCwgcmVzdWx0IDB4JTA0eCIsCi0gICAgICAgICAgbG9jYWxfY2lkLCBwX2NpLT5sMmNhcF9yZXN1bHQpOwotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9FcnJvcl9DYikobG9jYWxfY2lkLCBwX2NpLT5sMmNhcF9yZXN1bHQpOwotCi0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1BfTkVHOiAvKiBQZWVyIHJlamVjdGVkIGNvbm5lY3Rpb24gKi8KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBMMkNBUCBjb25uZWN0aW9uIHJlamVjdGVkLCBsY2lkPSIKLSAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgocF9jY2ItPmxvY2FsX2NpZCkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCByZWFzb249IiA8PCBsb2doZXgocF9jaS0+bDJjYXBfcmVzdWx0KTsKLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9FcnJvcl9DYikobG9jYWxfY2lkLCBMMkNBUF9DT05OX09USEVSX0VSUk9SKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfVElNRU9VVDoKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBMMkNBUCBjb25uZWN0aW9uIHRpbWVvdXQiOwotCi0gICAgICBpZiAocF9jY2ItPmVjb2MpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5fY250OyBpKyspIHsKLSAgICAgICAgICB1aW50MTZfdCBjaWQgPSBwX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5lY3Rpb25fY2lkc1tpXTsKLSAgICAgICAgICB0TDJDX0NDQiogdGVtcF9wX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKHBfbGNiLCBjaWQpOwotICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBsY2lkPSAiIDw8IGxvZ2hleChjaWQpOwotICAgICAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRXJyb3JfQ2IpKHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ09OTl9USU1FT1VUKTsKLSAgICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHRlbXBfcF9jY2IpOwotICAgICAgICB9Ci0gICAgICAgIHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubl9jbnQgPSAwOwotICAgICAgICBtZW1zZXQocF9sY2ItPnBlbmRpbmdfZWNvY19jb25uZWN0aW9uX2NpZHMsIDAsCi0gICAgICAgICAgICAgICBMMkNBUF9DUkVESVRfQkFTRURfTUFYX0NJRFMpOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogbGNpZD0gIiA8PCBsb2doZXgocF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Vycm9yX0NiKShsb2NhbF9jaWQsIEwyQ0FQX0NPTk5fT1RIRVJfRVJST1IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RJU0NPTk5FQ1RfUkVROiAvKiBVcHBlciB3YW50cyB0byBkaXNjb25uZWN0ICovCi0gICAgICAvKiBJZiB3ZSBrbm93IHBlZXIgQ0lEIGZyb20gY29ubmVjdCBwZW5kaW5nLCB3ZSBjYW4gc2VuZCBkaXNjb25uZWN0ICovCi0gICAgICBpZiAocF9jY2ItPnJlbW90ZV9jaWQgIT0gMCkgewotICAgICAgICBsMmN1X3NlbmRfcGVlcl9kaXNjX3JlcShwX2NjYik7Ci0gICAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX1c0X0wyQ0FQX0RJU0NPTk5FQ1RfUlNQOwotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DSE5MX0RJU0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdEwyQ0FfRElTQ09OTkVDVF9DRk1fQ0IqIGRpc2Nvbm5lY3RfY2ZtID0KLSAgICAgICAgICAgIHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RDZm1fQ2I7Ci0gICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgICBpZiAoZGlzY29ubmVjdF9jZm0gIT0gbnVsbHB0cikgewotICAgICAgICAgICgqZGlzY29ubmVjdF9jZm0pKGxvY2FsX2NpZCwgTDJDQVBfQ09OTl9OT19MSU5LKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RBVEFfV1JJVEU6IC8qIFVwcGVyIGxheWVyIGRhdGEgdG8gc2VuZCAqLwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RBVEE6ICAgICAgLyogUGVlciBkYXRhIHBhY2tldCByY3ZkICAgICovCi0gICAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9JTkZPX1JTUDoKLSAgICAgIC8qIE5lZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgY29tcGF0aWJsZSBjaGFubmVsIHRvIGNvbnRpbnVlICovCi0gICAgICBpZiAoIWwyY19mY3JfY2hrX2NoYW5fbW9kZXMocF9jY2IpKSB7Ci0gICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Vycm9yX0NiKShsb2NhbF9jaWQsIEwyQ0FQX0NPTk5fT1RIRVJfRVJST1IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogV2UgaGF2ZSBmZWF0dXJlIGluZm8sIHNvIG5vdyBzZW5kIHBlZXIgY29ubmVjdCByZXF1ZXN0ICovCi0gICAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NjYi0+bDJjX2NjYl90aW1lciwgTDJDQVBfQ0hOTF9DT05ORUNUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yZXEocF9jY2IpOyAvKiBTdGFydCBDb25uZWN0aW9uICAgICAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJIYW5kbGluZyB1bmV4cGVjdGVkIGV2ZW50OiVzIiwgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotICB9Ci0gIExPR19ERUJVRygiRXhpdCBjaG5sX3N0YXRlPSVzIFslZF0sIGV2ZW50PSVzIFslZF0iLAotICAgICAgICAgICAgY2hhbm5lbF9zdGF0ZV90ZXh0KHBfY2NiLT5jaG5sX3N0YXRlKS5jX3N0cigpLCBwX2NjYi0+Y2hubF9zdGF0ZSwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpLCBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfY3NtX3c0X2wyY2FfY29ubmVjdF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBDU1RfVzRfTDJDQV9DT05ORUNUX1JTUCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbDJjX2NzbV93NF9sMmNhX2Nvbm5lY3RfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdEwyQ19DT05OX0lORk8qIHBfY2k7Ci0gIHRMMkNBX0RJU0NPTk5FQ1RfSU5EX0NCKiBkaXNjb25uZWN0X2luZCA9Ci0gICAgICBwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9EaXNjb25uZWN0SW5kX0NiOwotICB1aW50MTZfdCBsb2NhbF9jaWQgPSBwX2NjYi0+bG9jYWxfY2lkOwotCi0gIExPR19ERUJVRygiTENJRDogMHglMDR4ICBzdDogVzRfTDJDQV9DT05fUlNQICBldnQ6ICVzIiwgcF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBMMkNFVlRfTFBfRElTQ09OTkVDVF9JTkQ6IC8qIExpbmsgd2FzIGRpc2Nvbm5lY3RlZCAqLwotICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIERpc2Nvbm5lY3RfSW5kX0NiKCksIENJRDogMHglMDR4ICBObyBDb25mIE5lZWRlZCIsCi0gICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICgqZGlzY29ubmVjdF9pbmQpKGxvY2FsX2NpZCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUDoKLSAgICAgIHBfY2kgPSAodEwyQ19DT05OX0lORk8qKXBfZGF0YTsKLSAgICAgIGlmIChwX2NjYi0+cF9sY2IgJiYgcF9jY2ItPnBfbGNiLT50cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgICAgIExPR19XQVJOKCJMRSBsaW5rIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbDJjdV9zZW5kX3BlZXJfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzKHBfY2NiLCBwX2NpLT5sY2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NpLT5sMmNhcF9yZXN1bHQpOwotICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5sMmNfY2NiX3RpbWVyKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQxNl90IGNpZCA9IHBfY2NiLT5wX2xjYi0+cGVuZGluZ19lY29jX2Nvbm5lY3Rpb25fY2lkc1tpXTsKLSAgICAgICAgdEwyQ19DQ0IqIHRlbXBfcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChwX2NjYi0+cF9sY2IsIGNpZCk7Ci0gICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQocF9jaS0+bGNpZHMuYmVnaW4oKSwgcF9jaS0+bGNpZHMuZW5kKCksIGNpZCk7Ci0gICAgICAgIGlmIChpdCAhPSBwX2NpLT5sY2lkcy5lbmQoKSkgewotICAgICAgICAgIHRlbXBfcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfT1BFTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHRlbXBfcF9jY2IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudCA9IDA7Ci0gICAgICBtZW1zZXQocF9jY2ItPnBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzLCAwLAotICAgICAgICAgICAgIEwyQ0FQX0NSRURJVF9CQVNFRF9NQVhfQ0lEUyk7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ09OTkVDVF9SU1A6Ci0gICAgICBwX2NpID0gKHRMMkNfQ09OTl9JTkZPKilwX2RhdGE7Ci0gICAgICBpZiAocF9jY2ItPnBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgICAgIC8qIFJlc3VsdCBzaG91bGQgYmUgT0sgb3IgUmVqZWN0ICovCi0gICAgICAgIGlmICgoIXBfY2kpIHx8IChwX2NpLT5sMmNhcF9yZXN1bHQgPT0gTDJDQVBfQ09OTl9PSykpIHsKLSAgICAgICAgICBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzKHBfY2NiLCBMMkNBUF9DT05OX09LKTsKLSAgICAgICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9PUEVOOwotICAgICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+bDJjX2NjYl90aW1lcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcyhwX2NjYiwgcF9jaS0+bDJjYXBfcmVzdWx0KTsKLSAgICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogUmVzdWx0IHNob3VsZCBiZSBPSyBvciBQRU5ESU5HICovCi0gICAgICAgIGlmICgoIXBfY2kpIHx8IChwX2NpLT5sMmNhcF9yZXN1bHQgPT0gTDJDQVBfQ09OTl9PSykpIHsKLSAgICAgICAgICBMT0dfREVCVUcoIlNlbmRpbmcgY29ubmVjdGlvbiBvayBmb3IgQlJfRURSIik7Ci0gICAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yc3AocF9jY2IsIEwyQ0FQX0NPTk5fT0ssIDApOwotICAgICAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX0NPTkZJRzsKLSAgICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfQ0ZHX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIElmIHBlbmRpbmcsIHN0YXkgaW4gc2FtZSBzdGF0ZSBhbmQgc3RhcnQgZXh0ZW5kZWQgdGltZXIgKi8KLSAgICAgICAgICBMT0dfREVCVUcoIlNlbmRpbmcgY29ubmVjdGlvbiByZXN1bHQgJWQgYW5kIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHBfY2ktPmwyY2FwX3Jlc3VsdCwgcF9jaS0+bDJjYXBfc3RhdHVzKTsKLSAgICAgICAgICBsMmN1X3NlbmRfcGVlcl9jb25uZWN0X3JzcChwX2NjYiwgcF9jaS0+bDJjYXBfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ktPmwyY2FwX3N0YXR1cyk7Ci0gICAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DSE5MX0NPTk5FQ1RfRVhUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQX05FRzoKLSAgICAgIHBfY2kgPSAodEwyQ19DT05OX0lORk8qKXBfZGF0YTsKLSAgICAgIGlmIChwX2NjYi0+cF9sY2IgJiYgcF9jY2ItPnBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgICAgIGwyY3Vfc2VuZF9wZWVyX2NyZWRpdF9iYXNlZF9jb25uX3JlcyhwX2NjYiwgcF9jaS0+bGNpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NpLT5sMmNhcF9yZXN1bHQpOwotICAgICAgfQotICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5sMmNfY2NiX3RpbWVyKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcF9jY2ItPnBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubl9jbnQ7IGkrKykgewotICAgICAgICB1aW50MTZfdCBjaWQgPSBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uZWN0aW9uX2NpZHNbaV07Ci0gICAgICAgIHRMMkNfQ0NCKiB0ZW1wX3BfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQocF9jY2ItPnBfbGNiLCBjaWQpOwotICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHRlbXBfcF9jY2IpOwotICAgICAgfQotCi0gICAgICBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudCA9IDA7Ci0gICAgICBtZW1zZXQocF9jY2ItPnBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzLCAwLAotICAgICAgICAgICAgIEwyQ0FQX0NSRURJVF9CQVNFRF9NQVhfQ0lEUyk7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ09OTkVDVF9SU1BfTkVHOgotICAgICAgcF9jaSA9ICh0TDJDX0NPTk5fSU5GTyopcF9kYXRhOwotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkKLSAgICAgICAgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcyhwX2NjYiwgcF9jaS0+bDJjYXBfcmVzdWx0KTsKLSAgICAgIGVsc2UKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yc3AocF9jY2IsIHBfY2ktPmwyY2FwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jaS0+bDJjYXBfc3RhdHVzKTsKLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9USU1FT1VUOgotICAgICAgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yc3AocF9jY2IsIEwyQ0FQX0NPTk5fTk9fUFNNLCAwKTsKLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBEaXNjb25uZWN0X0luZF9DYigpLCBDSUQ6IDB4JTA0eCAgTm8gQ29uZiBOZWVkZWQiLAotICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICAoKmRpc2Nvbm5lY3RfaW5kKShsb2NhbF9jaWQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9EQVRBX1dSSVRFOiAvKiBVcHBlciBsYXllciBkYXRhIHRvIHNlbmQgKi8KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9EQVRBOiAgICAgIC8qIFBlZXIgZGF0YSBwYWNrZXQgcmN2ZCAgICAqLwotICAgICAgb3NpX2ZyZWUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JFUTogLyogVXBwZXIgd2FudHMgdG8gZGlzY29ubmVjdCAqLwotICAgICAgbDJjdV9zZW5kX3BlZXJfZGlzY19yZXEocF9jY2IpOwotICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfVzRfTDJDQVBfRElTQ09OTkVDVF9SU1A7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfRElTQ09OTkVDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9JTkZPX1JTUDoKLSAgICAgIC8qIFdlIGhhdmUgZmVhdHVyZSBpbmZvLCBzbyBub3cgZ2l2ZSB0aGUgdXBwZXIgbGF5ZXIgY29ubmVjdCBJTkQgKi8KLSAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NjYi0+bDJjX2NjYl90aW1lciwgTDJDQVBfQ0hOTF9DT05ORUNUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2NjYl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0gICAgICBMT0dfREVCVUcoIkNhbGxpbmcgQ29ubmVjdF9JbmRfQ2IoKSwgQ0lEOiAweCUwNHgiLCBwX2NjYi0+bG9jYWxfY2lkKTsKLQotICAgICAgbDJjX2NzbV9zZW5kX2Nvbm5lY3RfcnNwKHBfY2NiKTsKLSAgICAgIGwyY19jc21fc2VuZF9jb25maWdfcmVxKHBfY2NiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIkhhbmRsaW5nIHVuZXhwZWN0ZWQgZXZlbnQ6JXMiLCBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0gIH0KLSAgTE9HX0RFQlVHKCJFeGl0IGNobmxfc3RhdGU9JXMgWyVkXSwgZXZlbnQ9JXMgWyVkXSIsCi0gICAgICAgICAgICBjaGFubmVsX3N0YXRlX3RleHQocF9jY2ItPmNobmxfc3RhdGUpLmNfc3RyKCksIHBfY2NiLT5jaG5sX3N0YXRlLAotICAgICAgICAgICAgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCksIGV2ZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19jc21fY29uZmlnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIGNoYW5uZWwgaXMgaW4KLSAqICAgICAgICAgICAgICAgICAgQ09ORklHIHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBsMmNfY3NtX2NvbmZpZyh0TDJDX0NDQiogcF9jY2IsIHRMMkNFVlQgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnID0gKHRMMkNBUF9DRkdfSU5GTyopcF9kYXRhOwotICB0TDJDQV9ESVNDT05ORUNUX0lORF9DQiogZGlzY29ubmVjdF9pbmQgPQotICAgICAgcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRGlzY29ubmVjdEluZF9DYjsKLSAgdWludDE2X3QgbG9jYWxfY2lkID0gcF9jY2ItPmxvY2FsX2NpZDsKLSAgdWludDhfdCBjZmdfcmVzdWx0OwotICB0TDJDX0xDQiogcF9sY2IgPSBwX2NjYi0+cF9sY2I7Ci0gIHRMMkNfQ0NCKiB0ZW1wX3BfY2NiOwotICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfbGVfY2ZnID0gKHRMMkNBUF9MRV9DRkdfSU5GTyopcF9kYXRhOwotCi0gIExPR19ERUJVRygiTENJRDogMHglMDR4ICBzdDogQ09ORklHICBldnQ6ICVzIiwgcF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBMMkNFVlRfTFBfRElTQ09OTkVDVF9JTkQ6IC8qIExpbmsgd2FzIGRpc2Nvbm5lY3RlZCAqLwotICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIERpc2Nvbm5lY3RfSW5kX0NiKCksIENJRDogMHglMDR4ICBObyBDb25mIE5lZWRlZCIsCi0gICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICgqZGlzY29ubmVjdF9pbmQpKGxvY2FsX2NpZCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVROgotICAgICAgLyogRm9yIGVjb2MgcmVjb25maWcgaXMgaGFuZGxlZCBiZWxvdyBpbiBsMmNfYmxlLiBJbiBjYXNlIG9mIHN1Y2Nlc3MKLSAgICAgICAqIGxldCB1cyBub3RpZnkgdXBwZXIgbGF5ZXIgYWJvdXQgdGhlIHJlY29uZmlnCi0gICAgICAgKi8KLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBMZVJlY29uZmlnQ29tcGxldGVkX0NiKCksIENJRDogMHglMDR4IiwKLSAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkKTsKLQotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9DcmVkaXRCYXNlZFJlY29uZmlnQ29tcGxldGVkX0NiKSgKLSAgICAgICAgICBwX2xjYi0+cmVtb3RlX2JkX2FkZHIsIHBfY2NiLT5sb2NhbF9jaWQsIGZhbHNlLCBwX2xlX2NmZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DT05GSUdfUkVROiAvKiBQZWVyIGNvbmZpZyByZXF1ZXN0ICAgKi8KLSAgICAgIGNmZ19yZXN1bHQgPSBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcmVxKHBfY2NiLCBwX2NmZyk7Ci0gICAgICBpZiAoY2ZnX3Jlc3VsdCA9PSBMMkNBUF9QRUVSX0NGR19PSykgewotICAgICAgICBMT0dfREVCVUcoIkNhbGxpbmcgQ29uZmlnX1JlcV9DYigpLCBDSUQ6IDB4JTA0eCwgQy1iaXQgJWQiLAotICAgICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgKHBfY2ZnLT5mbGFncyAmIEwyQ0FQX0NGR19GTEFHU19NQVNLX0NPTlQpKTsKLSAgICAgICAgbDJjX2NzbV9zZW5kX2NvbmZpZ19yc3Bfb2socF9jY2IpOwotICAgICAgICBpZiAocF9jY2ItPmNvbmZpZ19kb25lICYgT0JfQ0ZHX0RPTkUpIHsKLSAgICAgICAgICBpZiAocF9jY2ItPnJlbW90ZV9jb25maWdfcnNwX3Jlc3VsdCA9PSBMMkNBUF9DRkdfT0spIHsKLSAgICAgICAgICAgIGwyY19jc21faW5kaWNhdGVfY29ubmVjdGlvbl9vcGVuKHBfY2NiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBfY2NiLT5jb25uZWN0aW9uX2luaXRpYXRvciA9PSBMMkNBUF9JTklUSUFUT1JfTE9DQUwpIHsKLSAgICAgICAgICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9FcnJvcl9DYikocF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ0ZHX0ZBSUxFRF9OT19SRUFTT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChjZmdfcmVzdWx0ID09IEwyQ0FQX1BFRVJfQ0ZHX0RJU0NPTk5FQ1QpIHsKLSAgICAgICAgLyogRGlzY29ubmVjdCBpZiBjaGFubmVscyBhcmUgaW5jb21wYXRpYmxlICovCi0gICAgICAgIExPR19ERUJVRygiaW5jb21wYXRpYmxlIGNvbmZpZ3VyYXRpb25zIGRpc2Nvbm5lY3QiKTsKLSAgICAgICAgbDJjdV9kaXNjb25uZWN0X2NobmwocF9jY2IpOwotICAgICAgfSBlbHNlIC8qIFJldHVybiBlcnJvciB0byBwZWVyIHNvIGl0IGNhbiByZW5lZ290aWF0ZSBpZiBwb3NzaWJsZSAqLwotICAgICAgewotICAgICAgICBMT0dfREVCVUcoImluY29tcGF0aWJsZSBjb25maWd1cmF0aW9ucyB0cnlpbmcgcmVjb25maWciKTsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29uZmlnX3JzcChwX2NjYiwgcF9jZmcpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DUkVESVRfQkFTRURfUkVDT05GSUdfUlNQOgotICAgICAgcF9jY2ItPmNvbmZpZ19kb25lIHw9IE9CX0NGR19ET05FOwotICAgICAgcF9jY2ItPmNvbmZpZ19kb25lIHw9IFJFQ09ORklHX0ZMQUc7Ci0gICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9PUEVOOwotICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5sMmNfY2NiX3RpbWVyKTsKLQotICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIENvbmZpZ19Sc3BfQ2IoKSwgQ0lEOiAweCUwNHgiLCBwX2NjYi0+bG9jYWxfY2lkKTsKLQotICAgICAgcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfQ3JlZGl0QmFzZWRSZWNvbmZpZ0NvbXBsZXRlZF9DYigKLSAgICAgICAgICBwX2xjYi0+cmVtb3RlX2JkX2FkZHIsIHBfY2NiLT5sb2NhbF9jaWQsIHRydWUsIHBfbGVfY2ZnKTsKLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ09ORklHX1JTUDogLyogUGVlciBjb25maWcgcmVzcG9uc2UgICovCi0gICAgICBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcnNwKHBfY2NiLCBwX2NmZyk7Ci0KLSAgICAgIC8qIFRCRDogV2hlbiBjb25maWcgb3B0aW9ucyBncm93IGJleW9uZyBtaW5pbXVtIE1UVSAoNDggYnl0ZXMpCi0gICAgICAgKiAgICAgIGxvZ2ljIG5lZWRzIHRvIGJlIGFkZGVkIHRvIGhhbmRsZSByZXNwb25zZXMgd2l0aAotICAgICAgICogICAgICBjb250aW51YXRpb24gYml0IHNldCBpbiBmbGFncyBmaWVsZC4KLSAgICAgICAqICAgICAgIDEuIFNlbmQgYWRkaXRpb25hbCBjb25maWcgcmVxdWVzdCBvdXQgdW50aWwgQy1iaXQgaXMgY2xlYXJlZCBpbgotICAgICAgICogcmVzcG9uc2UKLSAgICAgICAqLwotICAgICAgcF9jY2ItPmNvbmZpZ19kb25lIHw9IE9CX0NGR19ET05FOwotCi0gICAgICBpZiAocF9jY2ItPmNvbmZpZ19kb25lICYgSUJfQ0ZHX0RPTkUpIHsKLSAgICAgICAgLyogVmVyaWZ5IHR3byBzaWRlcyBhcmUgaW4gY29tcGF0aWJsZSBtb2RlcyBiZWZvcmUgY29udGludWluZyAqLwotICAgICAgICBpZiAocF9jY2ItPm91cl9jZmcuZmNyLm1vZGUgIT0gcF9jY2ItPnBlZXJfY2ZnLmZjci5tb2RlKSB7Ci0gICAgICAgICAgbDJjdV9zZW5kX3BlZXJfZGlzY19yZXEocF9jY2IpOwotICAgICAgICAgIExPR19XQVJOKAotICAgICAgICAgICAgICAiQ2FsbGluZyBEaXNjb25uZWN0X0luZF9DYihJbmNvbXBhdGlibGUgQ0ZHKSwgQ0lEOiAiCi0gICAgICAgICAgICAgICIweCUwNHggIE5vIENvbmYgTmVlZGVkIiwKLSAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICAgICAgKCpkaXNjb25uZWN0X2luZCkobG9jYWxfY2lkLCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2NjYi0+Y29uZmlnX2RvbmUgfD0gUkVDT05GSUdfRkxBRzsKLSAgICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfT1BFTjsKLSAgICAgICAgbDJjX2xpbmtfYWRqdXN0X2NobmxfYWxsb2NhdGlvbigpOwotICAgICAgICBhbGFybV9jYW5jZWwocF9jY2ItPmwyY19jY2JfdGltZXIpOwotCi0gICAgICAgIC8qIElmIHVzaW5nIGVSVE0gYW5kIHdhaXRpbmcgZm9yIGFuIEFDSywgcmVzdGFydCB0aGUgQUNLIHRpbWVyICovCi0gICAgICAgIGlmIChwX2NjYi0+ZmNyYi53YWl0X2FjaykgbDJjX2Zjcl9zdGFydF90aW1lcihwX2NjYik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICoqIGNoZWNrIHBfY2NiLT5vdXJfY2ZnLmZjci5tb25fdG91dCBhbmQKLSAgICAgICAgICpwX2NjYi0+b3VyX2NmZy5mY3IucnRyYW5zX3RvdXQKLSAgICAgICAgICoqIHdlIG1heSBzZXQgdGhlbSB0byB6ZXJvIHdoZW4gc2VuZGluZyBjb25maWcgcmVxdWVzdCBkdXJpbmcKLSAgICAgICAgICpyZW5lZ290aWF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKHBfY2NiLT5vdXJfY2ZnLmZjci5tb2RlID09IEwyQ0FQX0ZDUl9FUlRNX01PREUpICYmCi0gICAgICAgICAgICAoKHBfY2NiLT5vdXJfY2ZnLmZjci5tb25fdG91dCA9PSAwKSB8fAotICAgICAgICAgICAgIChwX2NjYi0+b3VyX2NmZy5mY3IucnRyYW5zX3RvdXQpKSkgewotICAgICAgICAgIGwyY19mY3JfYWRqX21vbml0b3JfcmV0cmFuX3RpbWVvdXQocF9jY2IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VlIGlmIHdlIGNhbiBmb3J3YXJkIGFueXRoaW5nIG9uIHRoZSBob2xkIHF1ZXVlICovCi0gICAgICAgIGlmICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnhtaXRfaG9sZF9xKSkgewotICAgICAgICAgIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2NjYi0+cF9sY2IsIDAsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBDb25maWdfUnNwX0NiKCksIENJRDogMHglMDR4IiwgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICBwX2NjYi0+cmVtb3RlX2NvbmZpZ19yc3BfcmVzdWx0ID0gcF9jZmctPnJlc3VsdDsKLSAgICAgIGlmIChwX2NjYi0+Y29uZmlnX2RvbmUgJiBJQl9DRkdfRE9ORSkgewotICAgICAgICBsMmNfY3NtX2luZGljYXRlX2Nvbm5lY3Rpb25fb3BlbihwX2NjYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NPTkZJR19SU1BfTkVHOiAvKiBQZWVyIGNvbmZpZyBlcnJvciByc3AgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgVGltZXIgKi8KLSAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+bDJjX2NjYl90aW1lcik7Ci0KLSAgICAgIC8qIElmIGZhaWx1cmUgd2FzIGNoYW5uZWwgbW9kZSB0cnkgdG8gcmVuZWdvdGlhdGUgKi8KLSAgICAgIGlmICghbDJjX2Zjcl9yZW5lZ290aWF0ZV9jaGFuKHBfY2NiLCBwX2NmZykpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIENvbmZpZ19Sc3BfQ2IoKSwgQ0lEOiAweCUwNHgsIEZhaWx1cmU6ICVkIiwKLSAgICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2ZnLT5yZXN1bHQpOwotICAgICAgICBpZiAocF9jY2ItPmNvbm5lY3Rpb25faW5pdGlhdG9yID09IEwyQ0FQX0lOSVRJQVRPUl9MT0NBTCkgewotICAgICAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRXJyb3JfQ2IpKHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ0ZHX0ZBSUxFRF9OT19SRUFTT04pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUkVROiAvKiBQZWVyIGRpc2Nvbm5lY3RlZCByZXF1ZXN0ICovCi0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfRElTQ09OTkVDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfVzRfTDJDQV9ESVNDT05ORUNUX1JTUDsKLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBEaXNjb25uZWN0X0luZF9DYigpLCBDSUQ6IDB4JTA0eCAgQ29uZiBOZWVkZWQiLAotICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9EaXNjb25uZWN0SW5kX0NiKShwX2NjYi0+bG9jYWxfY2lkLCB0cnVlKTsKLSAgICAgIGwyY19jc21fc2VuZF9kaXNjb25uZWN0X3JzcChwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUToKLSAgICAgIGwyY3Vfc2VuZF9jcmVkaXRfYmFzZWRfcmVjb25maWdfcmVxKHBfY2NiLCAodEwyQ0FQX0xFX0NGR19JTkZPKilwX2RhdGEpOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0NGR19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQV9DT05GSUdfUkVROiAvKiBVcHBlciBsYXllciBjb25maWcgcmVxICAgKi8KLSAgICAgIGwyY3VfcHJvY2Vzc19vdXJfY2ZnX3JlcShwX2NjYiwgcF9jZmcpOwotICAgICAgbDJjdV9zZW5kX3BlZXJfY29uZmlnX3JlcShwX2NjYiwgcF9jZmcpOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0NGR19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NPTkZJR19SU1A6IC8qIFVwcGVyIGxheWVyIGNvbmZpZyByc3AgICAqLwotICAgICAgbDJjdV9wcm9jZXNzX291cl9jZmdfcnNwKHBfY2NiLCBwX2NmZyk7Ci0KLSAgICAgIHBfY2NiLT5jb25maWdfZG9uZSB8PSBJQl9DRkdfRE9ORTsKLQotICAgICAgaWYgKHBfY2NiLT5jb25maWdfZG9uZSAmIE9CX0NGR19ET05FKSB7Ci0gICAgICAgIC8qIFZlcmlmeSB0d28gc2lkZXMgYXJlIGluIGNvbXBhdGlibGUgbW9kZXMgYmVmb3JlIGNvbnRpbnVpbmcgKi8KLSAgICAgICAgaWYgKHBfY2NiLT5vdXJfY2ZnLmZjci5tb2RlICE9IHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSkgewotICAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Rpc2NfcmVxKHBfY2NiKTsKLSAgICAgICAgICBMT0dfV0FSTigKLSAgICAgICAgICAgICAgIkNhbGxpbmcgRGlzY29ubmVjdF9JbmRfQ2IoSW5jb21wYXRpYmxlIENGRyksIENJRDogIgotICAgICAgICAgICAgICAiMHglMDR4ICBObyBDb25mIE5lZWRlZCIsCi0gICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgICAgICgqZGlzY29ubmVjdF9pbmQpKGxvY2FsX2NpZCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcF9jY2ItPmNvbmZpZ19kb25lIHw9IFJFQ09ORklHX0ZMQUc7Ci0gICAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX09QRU47Ci0gICAgICAgIGwyY19saW5rX2FkanVzdF9jaG5sX2FsbG9jYXRpb24oKTsKLSAgICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5sMmNfY2NiX3RpbWVyKTsKLSAgICAgIH0KLQotICAgICAgbDJjdV9zZW5kX3BlZXJfY29uZmlnX3JzcChwX2NjYiwgcF9jZmcpOwotCi0gICAgICAvKiBJZiB1c2luZyBlUlRNIGFuZCB3YWl0aW5nIGZvciBhbiBBQ0ssIHJlc3RhcnQgdGhlIEFDSyB0aW1lciAqLwotICAgICAgaWYgKHBfY2NiLT5mY3JiLndhaXRfYWNrKSBsMmNfZmNyX3N0YXJ0X3RpbWVyKHBfY2NiKTsKLQotICAgICAgLyogU2VlIGlmIHdlIGNhbiBmb3J3YXJkIGFueXRoaW5nIG9uIHRoZSBob2xkIHF1ZXVlICovCi0gICAgICBpZiAoKHBfY2NiLT5jaG5sX3N0YXRlID09IENTVF9PUEVOKSAmJgotICAgICAgICAgICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnhtaXRfaG9sZF9xKSkpIHsKLSAgICAgICAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfY2NiLT5wX2xjYiwgMCwgTlVMTCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfRElTQ09OTkVDVF9SRVE6IC8qIFVwcGVyIHdhbnRzIHRvIGRpc2Nvbm5lY3QgKi8KLSAgICAgIGwyY3Vfc2VuZF9wZWVyX2Rpc2NfcmVxKHBfY2NiKTsKLSAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX1c0X0wyQ0FQX0RJU0NPTk5FQ1RfUlNQOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0RJU0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfREFUQTogLyogUGVlciBkYXRhIHBhY2tldCByY3ZkICAgICovCi0gICAgICBMT0dfREVCVUcoIkNhbGxpbmcgRGF0YUluZF9DYigpLCBDSUQ6IDB4JTA0eCIsIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgaWYgKHBfY2NiLT5sb2NhbF9jaWQgPj0gTDJDQVBfRklSU1RfRklYRURfQ0hOTCAmJgotICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQgPD0gTDJDQVBfTEFTVF9GSVhFRF9DSE5MKSB7Ci0gICAgICAgIGlmIChwX2NjYi0+bG9jYWxfY2lkIDwgTDJDQVBfQkFTRV9BUFBMX0NJRCkgewotICAgICAgICAgIGlmIChsMmNiLmZpeGVkX3JlZ1twX2NjYi0+bG9jYWxfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0KLSAgICAgICAgICAgICAgICAgIC5wTDJDQV9GaXhlZERhdGFfQ2IgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcF9jY2ItPm1ldHJpY3Mucngoc3RhdGljX2Nhc3Q8QlRfSERSKj4ocF9kYXRhKS0+bGVuKTsKLSAgICAgICAgICAgICgqbDJjYi5maXhlZF9yZWdbcF9jY2ItPmxvY2FsX2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdCi0gICAgICAgICAgICAgICAgICAucEwyQ0FfRml4ZWREYXRhX0NiKShwX2NjYi0+bG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCVF9IRFIqKXBfZGF0YSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwX2RhdGEgIT0gbnVsbHB0cikgb3NpX2ZyZWVfYW5kX3Jlc2V0KCZwX2RhdGEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHBfZGF0YSkgcF9jY2ItPm1ldHJpY3Mucngoc3RhdGljX2Nhc3Q8QlRfSERSKj4ocF9kYXRhKS0+bGVuKTsKLSAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRGF0YUluZF9DYikocF9jY2ItPmxvY2FsX2NpZCwgKEJUX0hEUiopcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9EQVRBX1dSSVRFOiAvKiBVcHBlciBsYXllciBkYXRhIHRvIHNlbmQgKi8KLSAgICAgIGlmIChwX2NjYi0+Y29uZmlnX2RvbmUgJiBPQl9DRkdfRE9ORSkKLSAgICAgICAgbDJjX2VucXVldWVfcGVlcl9kYXRhKHBfY2NiLCAoQlRfSERSKilwX2RhdGEpOwotICAgICAgZWxzZQotICAgICAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9USU1FT1VUOgotICAgICAgaWYgKHBfY2NiLT5lY29jKSB7Ci0gICAgICAgIGZvciAodGVtcF9wX2NjYiA9IHBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2I7IHRlbXBfcF9jY2I7Ci0gICAgICAgICAgICAgdGVtcF9wX2NjYiA9IHRlbXBfcF9jY2ItPnBfbmV4dF9jY2IpIHsKLSAgICAgICAgICBpZiAoKHRlbXBfcF9jY2ItPmluX3VzZSkgJiYgKHRlbXBfcF9jY2ItPnJlY29uZmlnX3N0YXJ0ZWQpKSB7Ci0gICAgICAgICAgICAoKnRlbXBfcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfRGlzY29ubmVjdEluZF9DYikoCi0gICAgICAgICAgICAgICAgdGVtcF9wX2NjYi0+bG9jYWxfY2lkLCBmYWxzZSk7Ci0gICAgICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHRlbXBfcF9jY2IpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHBfY2NiLT5wX2xjYi0+SGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDSV9FUlJfQ09OTl9DQVVTRV9MT0NBTF9IT1NUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBsMmN1X3NlbmRfcGVlcl9kaXNjX3JlcShwX2NjYik7Ci0gICAgICBMT0dfREVCVUcoIkNhbGxpbmcgRGlzY29ubmVjdF9JbmRfQ2IoKSwgQ0lEOiAweCUwNHggIE5vIENvbmYgTmVlZGVkIiwKLSAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkKTsKLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgKCpkaXNjb25uZWN0X2luZCkobG9jYWxfY2lkLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJIYW5kbGluZyB1bmV4cGVjdGVkIGV2ZW50OiVzIiwgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotICB9Ci0gIExPR19ERUJVRygiRXhpdCBjaG5sX3N0YXRlPSVzIFslZF0sIGV2ZW50PSVzIFslZF0iLAotICAgICAgICAgICAgY2hhbm5lbF9zdGF0ZV90ZXh0KHBfY2NiLT5jaG5sX3N0YXRlKS5jX3N0cigpLCBwX2NjYi0+Y2hubF9zdGF0ZSwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpLCBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfY3NtX29wZW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBPUEVOIHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBsMmNfY3NtX29wZW4odEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgdWludDE2X3QgbG9jYWxfY2lkID0gcF9jY2ItPmxvY2FsX2NpZDsKLSAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZzsKLSAgdEwyQ19DSE5MX1NUQVRFIHRlbXBzdGF0ZTsKLSAgdWludDhfdCB0ZW1wY2ZnZG9uZTsKLSAgdWludDhfdCBjZmdfcmVzdWx0OwotICB1aW50MTZfdCBjcmVkaXQgPSAwOwotICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfbGVfY2ZnID0gKHRMMkNBUF9MRV9DRkdfSU5GTyopcF9kYXRhOwotCi0gIExPR19ERUJVRygiTENJRDogMHglMDR4ICBzdDogT1BFTiAgZXZ0OiAlcyIsIHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgTDJDRVZUX0xQX0RJU0NPTk5FQ1RfSU5EOiAvKiBMaW5rIHdhcyBkaXNjb25uZWN0ZWQgKi8KLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBEaXNjb25uZWN0X0luZF9DYigpLCBDSUQ6IDB4JTA0eCAgTm8gQ29uZiBOZWVkZWQiLAotICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICBpZiAocF9jY2ItPnBfcmNiKQotICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IpKGxvY2FsX2NpZCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVROgotICAgICAgLyogRm9yIGVjb2MgcmVjb25maWcgaXMgaGFuZGxlZCBiZWxvdyBpbiBsMmNfYmxlLiBJbiBjYXNlIG9mIHN1Y2Nlc3MKLSAgICAgICAqIGxldCB1cyBub3RpZnkgdXBwZXIgbGF5ZXIgYWJvdXQgdGhlIHJlY29uZmlnCi0gICAgICAgKi8KLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBMZVJlY29uZmlnQ29tcGxldGVkX0NiKCksIENJRDogMHglMDR4IiwKLSAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkKTsKLQotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9DcmVkaXRCYXNlZFJlY29uZmlnQ29tcGxldGVkX0NiKSgKLSAgICAgICAgICBwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX2NjYi0+bG9jYWxfY2lkLCBmYWxzZSwgcF9sZV9jZmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DT05GSUdfUkVROiAvKiBQZWVyIGNvbmZpZyByZXF1ZXN0ICAgKi8KLSAgICAgIHBfY2ZnID0gKHRMMkNBUF9DRkdfSU5GTyopcF9kYXRhOwotCi0gICAgICB0ZW1wc3RhdGUgPSBwX2NjYi0+Y2hubF9zdGF0ZTsKLSAgICAgIHRlbXBjZmdkb25lID0gcF9jY2ItPmNvbmZpZ19kb25lOwotICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfQ09ORklHOwotICAgICAgLy8gY2xlYXIgY2FjaGVkIGNvbmZpZ3VyYXRpb24gaW4gY2FzZSByZWNvbmZpZyB0YWtlcyBwbGFjZSBsYXRlcgotICAgICAgcF9jY2ItPnBlZXJfY2ZnLm10dV9wcmVzZW50ID0gZmFsc2U7Ci0gICAgICBwX2NjYi0+cGVlcl9jZmcuZmx1c2hfdG9fcHJlc2VudCA9IGZhbHNlOwotICAgICAgcF9jY2ItPnBlZXJfY2ZnLnFvc19wcmVzZW50ID0gZmFsc2U7Ci0gICAgICBwX2NjYi0+Y29uZmlnX2RvbmUgJj0gfklCX0NGR19ET05FOwotCi0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfQ0ZHX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2NjYl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0KLSAgICAgIGNmZ19yZXN1bHQgPSBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcmVxKHBfY2NiLCBwX2NmZyk7Ci0gICAgICBpZiAoY2ZnX3Jlc3VsdCA9PSBMMkNBUF9QRUVSX0NGR19PSykgewotICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0NvbmZpZ0luZF9DYikocF9jY2ItPmxvY2FsX2NpZCwgcF9jZmcpOwotICAgICAgICBsMmNfY3NtX3NlbmRfY29uZmlnX3JzcF9vayhwX2NjYik7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEVycm9yIGluIGNvbmZpZyBwYXJhbWV0ZXJzOiByZXNldCBzdGF0ZSBhbmQgY29uZmlnIGZsYWcgKi8KLSAgICAgIGVsc2UgaWYgKGNmZ19yZXN1bHQgPT0gTDJDQVBfUEVFUl9DRkdfVU5BQ0NFUFRBQkxFKSB7Ci0gICAgICAgIGFsYXJtX2NhbmNlbChwX2NjYi0+bDJjX2NjYl90aW1lcik7Ci0gICAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gdGVtcHN0YXRlOwotICAgICAgICBwX2NjYi0+Y29uZmlnX2RvbmUgPSB0ZW1wY2ZnZG9uZTsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29uZmlnX3JzcChwX2NjYiwgcF9jZmcpOwotICAgICAgfSBlbHNlIC8qIEwyQ0FQX1BFRVJfQ0ZHX0RJU0NPTk5FQ1QgKi8KLSAgICAgIHsKLSAgICAgICAgLyogRGlzY29ubmVjdCBpZiBjaGFubmVscyBhcmUgaW5jb21wYXRpYmxlCi0gICAgICAgICAqIE5vdGUgdGhpcyBzaG91bGQgbm90IG9jY3VyIGlmIHJlY29uZmlndXJlCi0gICAgICAgICAqIHNpbmNlIHRoaXMgc2hvdWxkIGhhdmUgbmV2ZXIgcGFzc2VkIG9yaWdpbmFsIGNvbmZpZy4KLSAgICAgICAgICovCi0gICAgICAgIGwyY3VfZGlzY29ubmVjdF9jaG5sKHBfY2NiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfRElTQ09OTkVDVF9SRVE6IC8qIFBlZXIgZGlzY29ubmVjdGVkIHJlcXVlc3QgKi8KLSAgICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCAhPSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgaWYgKCFCVE1fU2V0TGlua1BvbGljeUFjdGl2ZU1vZGUocF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkcikpIHsKLSAgICAgICAgICBMT0dfV0FSTigiVW5hYmxlIHRvIHNldCBsaW5rIHBvbGljeSBhY3RpdmUiKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9XNF9MMkNBX0RJU0NPTk5FQ1RfUlNQOwotICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0RJU0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgIExPR19ERUJVRygiQ2FsbGluZyBEaXNjb25uZWN0X0luZF9DYigpLCBDSUQ6IDB4JTA0eCAgQ29uZiBOZWVkZWQiLAotICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgICAgKCpwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9EaXNjb25uZWN0SW5kX0NiKShwX2NjYi0+bG9jYWxfY2lkLCB0cnVlKTsKLSAgICAgIGwyY19jc21fc2VuZF9kaXNjb25uZWN0X3JzcChwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RBVEE6IC8qIFBlZXIgZGF0YSBwYWNrZXQgcmN2ZCAgICAqLwotICAgICAgaWYgKChwX2NjYi0+cF9yY2IpICYmIChwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9EYXRhSW5kX0NiKSkgewotICAgICAgICBwX2NjYi0+bWV0cmljcy5yeChzdGF0aWNfY2FzdDxCVF9IRFIqPihwX2RhdGEpLT5sZW4pOwotICAgICAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0RhdGFJbmRfQ2IpKHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJUX0hEUiopcF9kYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JFUTogLyogVXBwZXIgd2FudHMgdG8gZGlzY29ubmVjdCAqLwotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICAvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBpbiBzbmlmZiBtb2RlICovCi0gICAgICAgIGlmICghQlRNX1NldExpbmtQb2xpY3lBY3RpdmVNb2RlKHBfY2NiLT5wX2xjYi0+cmVtb3RlX2JkX2FkZHIpKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIlVuYWJsZSB0byBzZXQgbGluayBwb2xpY3kgYWN0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkKLSAgICAgICAgbDJjYmxlX3NlbmRfcGVlcl9kaXNjX3JlcShwX2NjYik7Ci0gICAgICBlbHNlCi0gICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Rpc2NfcmVxKHBfY2NiKTsKLQotICAgICAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfVzRfTDJDQVBfRElTQ09OTkVDVF9SU1A7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfRElTQ09OTkVDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RBVEFfV1JJVEU6IC8qIFVwcGVyIGxheWVyIGRhdGEgdG8gc2VuZCAqLwotICAgICAgbDJjX2VucXVldWVfcGVlcl9kYXRhKHBfY2NiLCAoQlRfSERSKilwX2RhdGEpOwotICAgICAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfY2NiLT5wX2xjYiwgMCwgTlVMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUToKLSAgICAgIHBfY2NiLT5jaG5sX3N0YXRlID0gQ1NUX0NPTkZJRzsKLSAgICAgIHBfY2NiLT5jb25maWdfZG9uZSAmPSB+T0JfQ0ZHX0RPTkU7Ci0KLSAgICAgIGwyY3Vfc2VuZF9jcmVkaXRfYmFzZWRfcmVjb25maWdfcmVxKHBfY2NiLCAodEwyQ0FQX0xFX0NGR19JTkZPKilwX2RhdGEpOwotCi0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsIEwyQ0FQX0NITkxfQ0ZHX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2NjYl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ09ORklHX1JFUTogLyogVXBwZXIgbGF5ZXIgY29uZmlnIHJlcSAgICovCi0gICAgICBMT0dfRVJST1IoCi0gICAgICAgICAgIkRyb3BwaW5nIEwyQ0FQIHJlLWNvbmZpZyByZXF1ZXN0IGJlY2F1c2UgdGhlcmUgaXMgbm8gdXNhZ2UgYW5kICIKLSAgICAgICAgICAic2hvdWxkIG5vdCBiZSBpbnZva2VkIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX1RJTUVPVVQ6Ci0gICAgICAvKiBQcm9jZXNzIHRoZSBtb25pdG9yL3JldHJhbnNtaXNzaW9uIHRpbWUtb3V0cyBpbiBmbG93IGNvbnRyb2wvcmV0cmFucwotICAgICAgICogbW9kZSAqLwotICAgICAgaWYgKHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKQotICAgICAgICBsMmNfZmNyX3Byb2NfdG91dChwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0FDS19USU1FT1VUOgotICAgICAgbDJjX2Zjcl9wcm9jX2Fja190b3V0KHBfY2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9TRU5EX0ZMT1dfQ09OVFJPTF9DUkVESVQ6Ci0gICAgICBMT0dfREVCVUcoIlNlbmRpbmcgY3JlZGl0Iik7Ci0gICAgICBjcmVkaXQgPSAqKHVpbnQxNl90KilwX2RhdGE7Ci0gICAgICBsMmNibGVfc2VuZF9mbG93X2NvbnRyb2xfY3JlZGl0KHBfY2NiLCBjcmVkaXQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9SRUNWX0ZMT1dfQ09OVFJPTF9DUkVESVQ6Ci0gICAgICBjcmVkaXQgPSAqKHVpbnQxNl90KilwX2RhdGE7Ci0gICAgICBMT0dfREVCVUcoIkNyZWRpdHMgcmVjZWl2ZWQgJWQiLCBjcmVkaXQpOwotICAgICAgaWYgKChwX2NjYi0+cGVlcl9jb25uX2NmZy5jcmVkaXRzICsgY3JlZGl0KSA+IEwyQ0FQX0xFX0NSRURJVF9NQVgpIHsKLSAgICAgICAgLyogd2UgaGF2ZSByZWNlaXZlZCBjcmVkaXRzIG1vcmUgdGhhbiBtYXggY29jIGNyZWRpdHMsCi0gICAgICAgICAqIHNvIGRpc2Nvbm5lY3RpbmcgdGhlIExlIENvYyBDaGFubmVsCi0gICAgICAgICAqLwotICAgICAgICBsMmNibGVfc2VuZF9wZWVyX2Rpc2NfcmVxKHBfY2NiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfY2NiLT5wZWVyX2Nvbm5fY2ZnLmNyZWRpdHMgKz0gY3JlZGl0OwotICAgICAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIkhhbmRsaW5nIHVuZXhwZWN0ZWQgZXZlbnQ6JXMiLCBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0gIH0KLSAgTE9HX0RFQlVHKCJFeGl0IGNobmxfc3RhdGU9JXMgWyVkXSwgZXZlbnQ9JXMgWyVkXSIsCi0gICAgICAgICAgICBjaGFubmVsX3N0YXRlX3RleHQocF9jY2ItPmNobmxfc3RhdGUpLmNfc3RyKCksIHBfY2NiLT5jaG5sX3N0YXRlLAotICAgICAgICAgICAgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCksIGV2ZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19jc21fdzRfbDJjYXBfZGlzY29ubmVjdF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBDU1RfVzRfTDJDQVBfRElTQ09OTkVDVF9SU1Agc3RhdGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGwyY19jc21fdzRfbDJjYXBfZGlzY29ubmVjdF9yc3AodEwyQ19DQ0IqIHBfY2NiLCB0TDJDRVZUIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdEwyQ0FfRElTQ09OTkVDVF9DRk1fQ0IqIGRpc2Nvbm5lY3RfY2ZtID0KLSAgICAgIHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RDZm1fQ2I7Ci0gIHVpbnQxNl90IGxvY2FsX2NpZCA9IHBfY2NiLT5sb2NhbF9jaWQ7Ci0KLSAgTE9HX0RFQlVHKCJMQ0lEOiAweCUwNHggIHN0OiBXNF9MMkNBUF9ESVNDX1JTUCAgZXZ0OiAlcyIsIHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0KLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUlNQOiAvKiBQZWVyIGRpc2Nvbm5lY3QgcmVzcG9uc2UgKi8KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgaWYgKGRpc2Nvbm5lY3RfY2ZtICE9IG51bGxwdHIpIHsKLSAgICAgICAgKCpkaXNjb25uZWN0X2NmbSkobG9jYWxfY2lkLCBMMkNBUF9ESVNDX09LKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfRElTQ09OTkVDVF9SRVE6IC8qIFBlZXIgZGlzY29ubmVjdCByZXF1ZXN0ICAqLwotICAgICAgbDJjdV9zZW5kX3BlZXJfZGlzY19yc3AocF9jY2ItPnBfbGNiLCBwX2NjYi0+cmVtb3RlX2lkLCBwX2NjYi0+bG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnJlbW90ZV9jaWQpOwotICAgICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgICBpZiAoZGlzY29ubmVjdF9jZm0gIT0gbnVsbHB0cikgewotICAgICAgICAoKmRpc2Nvbm5lY3RfY2ZtKShsb2NhbF9jaWQsIEwyQ0FQX0RJU0NfT0spOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MUF9ESVNDT05ORUNUX0lORDogLyogTGluayB3YXMgZGlzY29ubmVjdGVkICovCi0gICAgY2FzZSBMMkNFVlRfVElNRU9VVDogICAgICAgICAgIC8qIFRpbWVvdXQgKi8KLSAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICAgICAgaWYgKGRpc2Nvbm5lY3RfY2ZtICE9IG51bGxwdHIpIHsKLSAgICAgICAgKCpkaXNjb25uZWN0X2NmbSkobG9jYWxfY2lkLCBMMkNBUF9ESVNDX1RJTUVPVVQpOwotICAgICAgfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RBVEE6ICAgICAgLyogUGVlciBkYXRhIHBhY2tldCByY3ZkICAgICovCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9EQVRBX1dSSVRFOiAvKiBVcHBlciBsYXllciBkYXRhIHRvIHNlbmQgKi8KLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJIYW5kbGluZyB1bmV4cGVjdGVkIGV2ZW50OiVzIiwgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCkpOwotICB9Ci0gIExPR19ERUJVRygiRXhpdCBjaG5sX3N0YXRlPSVzIFslZF0sIGV2ZW50PSVzIFslZF0iLAotICAgICAgICAgICAgY2hhbm5lbF9zdGF0ZV90ZXh0KHBfY2NiLT5jaG5sX3N0YXRlKS5jX3N0cigpLCBwX2NjYi0+Y2hubF9zdGF0ZSwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpLCBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfY3NtX3c0X2wyY2FfZGlzY29ubmVjdF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgY2hhbm5lbCBpcyBpbgotICogICAgICAgICAgICAgICAgICBDU1RfVzRfTDJDQV9ESVNDT05ORUNUX1JTUCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbDJjX2NzbV93NF9sMmNhX2Rpc2Nvbm5lY3RfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0VWVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdEwyQ0FfRElTQ09OTkVDVF9JTkRfQ0IqIGRpc2Nvbm5lY3RfaW5kID0KLSAgICAgIHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2I7Ci0gIHVpbnQxNl90IGxvY2FsX2NpZCA9IHBfY2NiLT5sb2NhbF9jaWQ7Ci0KLSAgTE9HX0RFQlVHKCJMQ0lEOiAweCUwNHggIHN0OiBXNF9MMkNBX0RJU0NfUlNQICBldnQ6ICVzIiwgcF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUoZXZlbnQpKTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBMMkNFVlRfTFBfRElTQ09OTkVDVF9JTkQ6IC8qIExpbmsgd2FzIGRpc2Nvbm5lY3RlZCAqLwotICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIERpc2Nvbm5lY3RfSW5kX0NiKCksIENJRDogMHglMDR4ICBObyBDb25mIE5lZWRlZCIsCi0gICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICgqZGlzY29ubmVjdF9pbmQpKGxvY2FsX2NpZCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9USU1FT1VUOgotICAgICAgbDJjdV9zZW5kX3BlZXJfZGlzY19yc3AocF9jY2ItPnBfbGNiLCBwX2NjYi0+cmVtb3RlX2lkLCBwX2NjYi0+bG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnJlbW90ZV9jaWQpOwotICAgICAgTE9HX0RFQlVHKCJDYWxsaW5nIERpc2Nvbm5lY3RfSW5kX0NiKCksIENJRDogMHglMDR4ICBObyBDb25mIE5lZWRlZCIsCi0gICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgICgqZGlzY29ubmVjdF9pbmQpKGxvY2FsX2NpZCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RJU0NPTk5FQ1RfUkVROiAvKiBVcHBlciBkaXNjb25uZWN0IHJlcXVlc3QgKi8KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RJU0NPTk5FQ1RfUlNQOiAvKiBVcHBlciBkaXNjb25uZWN0IHJlc3BvbnNlICovCi0gICAgICBsMmN1X3NlbmRfcGVlcl9kaXNjX3JzcChwX2NjYi0+cF9sY2IsIHBfY2NiLT5yZW1vdGVfaWQsIHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+cmVtb3RlX2NpZCk7Ci0gICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfREFUQTogICAgICAvKiBQZWVyIGRhdGEgcGFja2V0IHJjdmQgICAgKi8KLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RBVEFfV1JJVEU6IC8qIFVwcGVyIGxheWVyIGRhdGEgdG8gc2VuZCAqLwotICAgICAgb3NpX2ZyZWUocF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIkhhbmRsaW5nIHVuZXhwZWN0ZWQgZXZlbnQ6JXMiLCBsMmNfY3NtX2dldF9ldmVudF9uYW1lKGV2ZW50KSk7Ci0gIH0KLSAgTE9HX0RFQlVHKCJFeGl0IGNobmxfc3RhdGU9JXMgWyVkXSwgZXZlbnQ9JXMgWyVkXSIsCi0gICAgICAgICAgICBjaGFubmVsX3N0YXRlX3RleHQocF9jY2ItPmNobmxfc3RhdGUpLmNfc3RyKCksIHBfY2NiLT5jaG5sX3N0YXRlLAotICAgICAgICAgICAgbDJjX2NzbV9nZXRfZXZlbnRfbmFtZShldmVudCksIGV2ZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19jc21fZ2V0X2V2ZW50X25hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXZlbnQgbmFtZS4KLSAqCi0gKiBOT1RFICAgICAgICAgICAgIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgdG8gc2F2ZSBtZW1vcnkuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIHRoZSBuYW1lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCBjaGFyKiBsMmNfY3NtX2dldF9ldmVudF9uYW1lKHRMMkNFVlQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgTDJDRVZUX0xQX0NPTk5FQ1RfQ0ZNOiAvKiBMb3dlciBsYXllciBjb25uZWN0IGNvbmZpcm0gICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIkxPV0VSX0xBWUVSX0NPTk5FQ1RfQ0ZNIik7Ci0gICAgY2FzZSBMMkNFVlRfTFBfQ09OTkVDVF9DRk1fTkVHOiAvKiBMb3dlciBsYXllciBjb25uZWN0IGNvbmZpcm0gKGZhaWxlZCkgKi8KLSAgICAgIHJldHVybiAoIkxPV0VSX0xBWUVSX0NPTk5FQ1RfQ0ZNX05FRyIpOwotICAgIGNhc2UgTDJDRVZUX0xQX0NPTk5FQ1RfSU5EOiAvKiBMb3dlciBsYXllciBjb25uZWN0IGluZGljYXRpb24gICAgICAgKi8KLSAgICAgIHJldHVybiAoIkxPV0VSX0xBWUVSX0NPTk5FQ1RfSU5EIik7Ci0gICAgY2FzZSBMMkNFVlRfTFBfRElTQ09OTkVDVF9JTkQ6IC8qIExvd2VyIGxheWVyIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbiAgICAqLwotICAgICAgcmV0dXJuICgiTE9XRVJfTEFZRVJfRElTQ09OTkVDVF9JTkQiKTsKLQotICAgIGNhc2UgTDJDRVZUX1NFQ19DT01QOiAvKiBTZWN1cml0eSBjbGVhcmVkIHN1Y2Nlc3NmdWxseSAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIlNFQ1VSSVRZX0NPTVBMRVRFIik7Ci0gICAgY2FzZSBMMkNFVlRfU0VDX0NPTVBfTkVHOiAvKiBTZWN1cml0eSBwcm9jZWR1cmUgZmFpbGVkICAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIlNFQ1VSSVRZX0NPTVBMRVRFX05FRyIpOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SRVE6IC8qIFBlZXIgY29ubmVjdGlvbiByZXF1ZXN0ICAgICAgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiUEVFUl9DT05ORUNUX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQOiAvKiBQZWVyIGNvbm5lY3Rpb24gcmVzcG9uc2UgICAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIlBFRVJfQ09OTkVDVF9SU1AiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DT05ORUNUX1JTUF9QTkQ6IC8qIFBlZXIgY29ubmVjdGlvbiByZXNwb25zZSBwZW5kaW5nICovCi0gICAgICByZXR1cm4gKCJQRUVSX0NPTk5FQ1RfUlNQX1BORCIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQX05FRzogLyogUGVlciBjb25uZWN0aW9uIHJlc3BvbnNlIChmYWlsZWQpICovCi0gICAgICByZXR1cm4gKCJQRUVSX0NPTk5FQ1RfUlNQX05FRyIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NPTkZJR19SRVE6IC8qIFBlZXIgY29uZmlndXJhdGlvbiByZXF1ZXN0ICAgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiUEVFUl9DT05GSUdfUkVRIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ09ORklHX1JTUDogLyogUGVlciBjb25maWd1cmF0aW9uIHJlc3BvbnNlICAgICAgICAgICovCi0gICAgICByZXR1cm4gKCJQRUVSX0NPTkZJR19SU1AiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9DT05GSUdfUlNQX05FRzogLyogUGVlciBjb25maWd1cmF0aW9uIHJlc3BvbnNlIChmYWlsZWQpICovCi0gICAgICByZXR1cm4gKCJQRUVSX0NPTkZJR19SU1BfTkVHIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfRElTQ09OTkVDVF9SRVE6IC8qIFBlZXIgZGlzY29ubmVjdCByZXF1ZXN0ICAgICAgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiUEVFUl9ESVNDT05ORUNUX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUlNQOiAvKiBQZWVyIGRpc2Nvbm5lY3QgcmVzcG9uc2UgICAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIlBFRVJfRElTQ09OTkVDVF9SU1AiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBUF9EQVRBOiAvKiBQZWVyIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIlBFRVJfREFUQSIpOwotCi0gICAgY2FzZSBMMkNFVlRfTDJDQV9DT05ORUNUX1JFUTogLyogVXBwZXIgbGF5ZXIgY29ubmVjdCByZXF1ZXN0ICAgICAgICAgICovCi0gICAgICByZXR1cm4gKCJVUFBFUl9MQVlFUl9DT05ORUNUX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ09OTkVDVF9SU1A6IC8qIFVwcGVyIGxheWVyIGNvbm5lY3QgcmVzcG9uc2UgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiVVBQRVJfTEFZRVJfQ09OTkVDVF9SU1AiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NPTk5FQ1RfUlNQX05FRzogLyogVXBwZXIgbGF5ZXIgY29ubmVjdCByZXNwb25zZSAoZmFpbGVkKSovCi0gICAgICByZXR1cm4gKCJVUFBFUl9MQVlFUl9DT05ORUNUX1JTUF9ORUciKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NPTkZJR19SRVE6IC8qIFVwcGVyIGxheWVyIGNvbmZpZyByZXF1ZXN0ICAgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiVVBQRVJfTEFZRVJfQ09ORklHX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ09ORklHX1JTUDogLyogVXBwZXIgbGF5ZXIgY29uZmlnIHJlc3BvbnNlICAgICAgICAgICovCi0gICAgICByZXR1cm4gKCJVUFBFUl9MQVlFUl9DT05GSUdfUlNQIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JFUTogLyogVXBwZXIgbGF5ZXIgZGlzY29ubmVjdCByZXF1ZXN0ICAgICAgICovCi0gICAgICByZXR1cm4gKCJVUFBFUl9MQVlFUl9ESVNDT05ORUNUX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfRElTQ09OTkVDVF9SU1A6IC8qIFVwcGVyIGxheWVyIGRpc2Nvbm5lY3QgcmVzcG9uc2UgICAgICAqLwotICAgICAgcmV0dXJuICgiVVBQRVJfTEFZRVJfRElTQ09OTkVDVF9SU1AiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RBVEFfUkVBRDogLyogVXBwZXIgbGF5ZXIgZGF0YSByZWFkICAgICAgICAgICAgICAgICovCi0gICAgICByZXR1cm4gKCJVUFBFUl9MQVlFUl9EQVRBX1JFQUQiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0RBVEFfV1JJVEU6IC8qIFVwcGVyIGxheWVyIGRhdGEgd3JpdGUgICAgICAgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiVVBQRVJfTEFZRVJfREFUQV9XUklURSIpOwotICAgIGNhc2UgTDJDRVZUX1RJTUVPVVQ6IC8qIFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgcmV0dXJuICgiVElNRU9VVCIpOwotICAgIGNhc2UgTDJDRVZUX1NFQ19SRV9TRU5EX0NNRDoKLSAgICAgIHJldHVybiAoIlNFQ19SRV9TRU5EX0NNRCIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0lORk9fUlNQOiAvKiBQZWVyIGluZm9ybWF0aW9uIHJlc3BvbnNlICAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIkwyQ0VWVF9MMkNBUF9JTkZPX1JTUCIpOwotICAgIGNhc2UgTDJDRVZUX0FDS19USU1FT1VUOgotICAgICAgcmV0dXJuICgiTDJDRVZUX0FDS19USU1FT1VUIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQV9TRU5EX0ZMT1dfQ09OVFJPTF9DUkVESVQ6IC8qIFVwcGVyIGxheWVyIHNlbmQgY3JlZGl0IHBhY2tldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiAoIlNFTkRfRkxPV19DT05UUk9MX0NSRURJVCIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUkVROiAvKiBVcHBlciBsYXllciBjcmVkaXQgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCByZXF1ZXN0ICovCi0gICAgICByZXR1cm4gKCJTRU5EX0NSRURJVF9CQVNFRF9DT05ORUNUX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQOiAvKiBVcHBlciBsYXllciBjcmVkaXQgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCByZXNwb25zZSAqLwotICAgICAgcmV0dXJuICgiU0VORF9DUkVESVRfQkFTRURfQ09OTkVDVF9SU1AiKTsKLSAgICBjYXNlIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SRVE6IC8qIFVwcGVyIGxheWVyIGNyZWRpdCBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWcgcmVxdWVzdCAqLwotICAgICAgcmV0dXJuICgiU0VORF9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVRIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfUkVDVl9GTE9XX0NPTlRST0xfQ1JFRElUOiAvKiBQZWVyIHNlbmQgY3JlZGl0IHBhY2tldCAqLwotICAgICAgcmV0dXJuICgiUkVDVl9GTE9XX0NPTlRST0xfQ1JFRElUIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUkVROiAvKiBQZWVyIHNlbmQgY3JlZGl0IGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHJlcXVlc3QgKi8KLSAgICAgIHJldHVybiAoIlJFQ1ZfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUkVRIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQOiAvKiBQZWVyIHNlbmQgY3JlZGl0IGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHJlc3BvbnNlICovCi0gICAgICByZXR1cm4gKCJSRUNWX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUCIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUF9ORUc6IC8qIFBlZXIgc2VuZCByZWplY3QgY3JlZGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgY29ubmVjdCByZXNwb25zZSAqLwotICAgICAgcmV0dXJuICgiUkVDVl9DUkVESVRfQkFTRURfQ09OTkVDVF9SU1BfTkVHIik7Ci0gICAgY2FzZSBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUTogLyogUGVlciBzZW5kIGNyZWRpdCBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uZmlnIHJlcXVlc3QgKi8KLSAgICAgIHJldHVybiAoIlJFQ1ZfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUSIpOwotICAgIGNhc2UgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SU1A6IC8qIFBlZXIgc2VuZCBjcmVkaXQgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmZpZyByZXNwb25zZSAqLwotICAgICAgcmV0dXJuICgiUkVDVl9DUkVESVRfQkFTRURfUkVDT05GSUdfUlNQIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoIj8/Pz8gVU5LTk9XTiBFVkVOVCIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZW5xdWV1ZV9wZWVyX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEVucXVldWVzIGRhdGEgZGVzdGluZWQgZm9yIHRoZSBwZWVyIGluIHRoZSBjY2IuIEhhbmRsZXMKLSAqICAgICAgICAgICAgICAgICAgRkNSIHNlZ21lbnRhdGlvbiBhbmQgY2hlY2tzIGZvciBjb25nZXN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19lbnF1ZXVlX3BlZXJfZGF0YSh0TDJDX0NDQiogcF9jY2IsIEJUX0hEUiogcF9idWYpIHsKLSAgQ0hFQ0socF9jY2IgIT0gbnVsbHB0cik7Ci0KLSAgcF9jY2ItPm1ldHJpY3MudHgocF9idWYtPmxlbik7Ci0KLSAgdWludDhfdCogcDsKLQotICBpZiAocF9jY2ItPnBlZXJfY2ZnLmZjci5tb2RlICE9IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFKSB7Ci0gICAgcF9idWYtPmV2ZW50ID0gMDsKLSAgfSBlbHNlIHsKLSAgICAvKiBTYXZlIHRoZSBjaGFubmVsIElEIGZvciBmYXN0ZXIgY291bnRpbmcgKi8KLSAgICBwX2J1Zi0+ZXZlbnQgPSBwX2NjYi0+bG9jYWxfY2lkOwotCi0gICAgLyogU3RlcCBiYWNrIHRvIGFkZCB0aGUgTDJDQVAgaGVhZGVyICovCi0gICAgcF9idWYtPm9mZnNldCAtPSBMMkNBUF9QS1RfT1ZFUkhFQUQ7Ci0gICAgcF9idWYtPmxlbiArPSBMMkNBUF9QS1RfT1ZFUkhFQUQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSAqLwotICAgIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICAgLyogTm93IHRoZSBMMkNBUCBoZWFkZXIgKi8KLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfYnVmLT5sZW4gLSBMMkNBUF9QS1RfT1ZFUkhFQUQpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPnJlbW90ZV9jaWQpOwotICB9Ci0KLSAgaWYgKHBfY2NiLT54bWl0X2hvbGRfcSA9PSBOVUxMKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiZW1wdHkgcXVldWU6IHBfY2NiID0gJXAgcF9jY2ItPmluX3VzZSA9ICVkIHBfY2NiLT5jaG5sX3N0YXRlID0gJWQgIgotICAgICAgICAicF9jY2ItPmxvY2FsX2NpZCA9ICV1IHBfY2NiLT5yZW1vdGVfY2lkID0gJXUiLAotICAgICAgICBwX2NjYiwgcF9jY2ItPmluX3VzZSwgcF9jY2ItPmNobmxfc3RhdGUsIHBfY2NiLT5sb2NhbF9jaWQsCi0gICAgICAgIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgfSBlbHNlIHsKLSAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfY2NiLT54bWl0X2hvbGRfcSwgcF9idWYpOwotICB9Ci0KLSAgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24ocF9jY2IpOwotCi0gIC8qIGlmIG5ldyBwYWNrZXQgaXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gc2VydmluZyBjY2IgYW5kIGl0IGlzIG5vdCBvdmVycnVuICovCi0gIGlmICgocF9jY2ItPnBfbGNiLT5ycl9wcmkgPiBwX2NjYi0+Y2NiX3ByaW9yaXR5KSAmJgotICAgICAgKHBfY2NiLT5wX2xjYi0+cnJfc2VydltwX2NjYi0+Y2NiX3ByaW9yaXR5XS5xdW90YSA+IDApKSB7Ci0gICAgLyogc2VuZCBvdXQgaGlnaGVyIHByaW9yaXR5IHBhY2tldCAqLwotICAgIHBfY2NiLT5wX2xjYi0+cnJfcHJpID0gcF9jY2ItPmNjYl9wcmlvcml0eTsKLSAgfQotCi0gIC8qIGlmIHdlIGFyZSBkb2luZyBhIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcsIHNldCB0aGUgZmxhZyAqLwotICBpZiAocF9jY2ItPnBfbGNiLT5saW5rX3htaXRfcXVvdGEgPT0gMCkgbDJjYi5jaGVja19yb3VuZF9yb2JpbiA9IHRydWU7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9sMmNhcC9sMmNfZmNyLmNjIGIvc3RhY2svbDJjYXAvbDJjX2Zjci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxN2U1MC4uMDAwMDAwMAotLS0gYS9zdGFjay9sMmNhcC9sMmNfZmNyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTg3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgTDJDQVAgMS4yIEZsb3cgQ29udHJvbCBhbmQgcmV0cmFuc21pc3Npb25zCi0gKiAgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJjb21tb24vdGltZV91dGlsLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgImwyY19pbnQuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0KLS8qIEZsYWcgcGFzc2VkIHRvIHJldHJhbnNtaXRfaV9mcmFtZXMoKSB3aGVuIGFsbCBwYWNrZXRzIHNob3VsZCBiZSByZXRyYW5zbWl0dGVkCi0gKi8KLSNkZWZpbmUgTDJDX0ZDUl9SRVRYX0FMTF9QS1RTIDB4RkYKLQotLyogdGhpcyBpcyB0aGUgbWluaW1hbCBvZmZzZXQgcmVxdWlyZWQgYnkgT0JYIHRvIHByb2Nlc3MgaW5jb21pbmcgcGFja2V0cyAqLwotc3RhdGljIGNvbnN0IHVpbnQxNl90IE9CWF9CVUZfTUlOX09GRlNFVCA9IDQ7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBTQVJfdHlwZXNbXSA9IHsiVW5zZWdtZW50ZWQiLCAiU3RhcnQiLCAiRW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGludWF0aW9uIn07Ci1zdGF0aWMgY29uc3QgY2hhciogU1VQX3R5cGVzW10gPSB7IlJSIiwgIlJFSiIsICJSTlIiLCAiU1JFSiJ9OwotCi0vKiBMb29rLXVwIHRhYmxlIGZvciB0aGUgQ1JDIGNhbGN1bGF0aW9uICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY3JjdGFiWzI1Nl0gPSB7Ci0gICAgMHgwMDAwLCAweGMwYzEsIDB4YzE4MSwgMHgwMTQwLCAweGMzMDEsIDB4MDNjMCwgMHgwMjgwLCAweGMyNDEsIDB4YzYwMSwKLSAgICAweDA2YzAsIDB4MDc4MCwgMHhjNzQxLCAweDA1MDAsIDB4YzVjMSwgMHhjNDgxLCAweDA0NDAsIDB4Y2MwMSwgMHgwY2MwLAotICAgIDB4MGQ4MCwgMHhjZDQxLCAweDBmMDAsIDB4Y2ZjMSwgMHhjZTgxLCAweDBlNDAsIDB4MGEwMCwgMHhjYWMxLCAweGNiODEsCi0gICAgMHgwYjQwLCAweGM5MDEsIDB4MDljMCwgMHgwODgwLCAweGM4NDEsIDB4ZDgwMSwgMHgxOGMwLCAweDE5ODAsIDB4ZDk0MSwKLSAgICAweDFiMDAsIDB4ZGJjMSwgMHhkYTgxLCAweDFhNDAsIDB4MWUwMCwgMHhkZWMxLCAweGRmODEsIDB4MWY0MCwgMHhkZDAxLAotICAgIDB4MWRjMCwgMHgxYzgwLCAweGRjNDEsIDB4MTQwMCwgMHhkNGMxLCAweGQ1ODEsIDB4MTU0MCwgMHhkNzAxLCAweDE3YzAsCi0gICAgMHgxNjgwLCAweGQ2NDEsIDB4ZDIwMSwgMHgxMmMwLCAweDEzODAsIDB4ZDM0MSwgMHgxMTAwLCAweGQxYzEsIDB4ZDA4MSwKLSAgICAweDEwNDAsIDB4ZjAwMSwgMHgzMGMwLCAweDMxODAsIDB4ZjE0MSwgMHgzMzAwLCAweGYzYzEsIDB4ZjI4MSwgMHgzMjQwLAotICAgIDB4MzYwMCwgMHhmNmMxLCAweGY3ODEsIDB4Mzc0MCwgMHhmNTAxLCAweDM1YzAsIDB4MzQ4MCwgMHhmNDQxLCAweDNjMDAsCi0gICAgMHhmY2MxLCAweGZkODEsIDB4M2Q0MCwgMHhmZjAxLCAweDNmYzAsIDB4M2U4MCwgMHhmZTQxLCAweGZhMDEsIDB4M2FjMCwKLSAgICAweDNiODAsIDB4ZmI0MSwgMHgzOTAwLCAweGY5YzEsIDB4Zjg4MSwgMHgzODQwLCAweDI4MDAsIDB4ZThjMSwgMHhlOTgxLAotICAgIDB4Mjk0MCwgMHhlYjAxLCAweDJiYzAsIDB4MmE4MCwgMHhlYTQxLCAweGVlMDEsIDB4MmVjMCwgMHgyZjgwLCAweGVmNDEsCi0gICAgMHgyZDAwLCAweGVkYzEsIDB4ZWM4MSwgMHgyYzQwLCAweGU0MDEsIDB4MjRjMCwgMHgyNTgwLCAweGU1NDEsIDB4MjcwMCwKLSAgICAweGU3YzEsIDB4ZTY4MSwgMHgyNjQwLCAweDIyMDAsIDB4ZTJjMSwgMHhlMzgxLCAweDIzNDAsIDB4ZTEwMSwgMHgyMWMwLAotICAgIDB4MjA4MCwgMHhlMDQxLCAweGEwMDEsIDB4NjBjMCwgMHg2MTgwLCAweGExNDEsIDB4NjMwMCwgMHhhM2MxLCAweGEyODEsCi0gICAgMHg2MjQwLCAweDY2MDAsIDB4YTZjMSwgMHhhNzgxLCAweDY3NDAsIDB4YTUwMSwgMHg2NWMwLCAweDY0ODAsIDB4YTQ0MSwKLSAgICAweDZjMDAsIDB4YWNjMSwgMHhhZDgxLCAweDZkNDAsIDB4YWYwMSwgMHg2ZmMwLCAweDZlODAsIDB4YWU0MSwgMHhhYTAxLAotICAgIDB4NmFjMCwgMHg2YjgwLCAweGFiNDEsIDB4NjkwMCwgMHhhOWMxLCAweGE4ODEsIDB4Njg0MCwgMHg3ODAwLCAweGI4YzEsCi0gICAgMHhiOTgxLCAweDc5NDAsIDB4YmIwMSwgMHg3YmMwLCAweDdhODAsIDB4YmE0MSwgMHhiZTAxLCAweDdlYzAsIDB4N2Y4MCwKLSAgICAweGJmNDEsIDB4N2QwMCwgMHhiZGMxLCAweGJjODEsIDB4N2M0MCwgMHhiNDAxLCAweDc0YzAsIDB4NzU4MCwgMHhiNTQxLAotICAgIDB4NzcwMCwgMHhiN2MxLCAweGI2ODEsIDB4NzY0MCwgMHg3MjAwLCAweGIyYzEsIDB4YjM4MSwgMHg3MzQwLCAweGIxMDEsCi0gICAgMHg3MWMwLCAweDcwODAsIDB4YjA0MSwgMHg1MDAwLCAweDkwYzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNjMCwKLSAgICAweDUyODAsIDB4OTI0MSwgMHg5NjAxLCAweDU2YzAsIDB4NTc4MCwgMHg5NzQxLCAweDU1MDAsIDB4OTVjMSwgMHg5NDgxLAotICAgIDB4NTQ0MCwgMHg5YzAxLCAweDVjYzAsIDB4NWQ4MCwgMHg5ZDQxLCAweDVmMDAsIDB4OWZjMSwgMHg5ZTgxLCAweDVlNDAsCi0gICAgMHg1YTAwLCAweDlhYzEsIDB4OWI4MSwgMHg1YjQwLCAweDk5MDEsIDB4NTljMCwgMHg1ODgwLCAweDk4NDEsIDB4ODgwMSwKLSAgICAweDQ4YzAsIDB4NDk4MCwgMHg4OTQxLCAweDRiMDAsIDB4OGJjMSwgMHg4YTgxLCAweDRhNDAsIDB4NGUwMCwgMHg4ZWMxLAotICAgIDB4OGY4MSwgMHg0ZjQwLCAweDhkMDEsIDB4NGRjMCwgMHg0YzgwLCAweDhjNDEsIDB4NDQwMCwgMHg4NGMxLCAweDg1ODEsCi0gICAgMHg0NTQwLCAweDg3MDEsIDB4NDdjMCwgMHg0NjgwLCAweDg2NDEsIDB4ODIwMSwgMHg0MmMwLCAweDQzODAsIDB4ODM0MSwKLSAgICAweDQxMDAsIDB4ODFjMSwgMHg4MDgxLCAweDQwNDAsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMKLSovCi1zdGF0aWMgYm9vbCBwcm9jZXNzX3JlcXNlcSh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IGN0cmxfd29yZCk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX3NfZnJhbWUodEwyQ19DQ0IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmLCB1aW50MTZfdCBjdHJsX3dvcmQpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19pX2ZyYW1lKHRMMkNfQ0NCKiBwX2NjYiwgQlRfSERSKiBwX2J1ZiwgdWludDE2X3QgY3RybF93b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVsYXlfYWNrKTsKLXN0YXRpYyBib29sIHJldHJhbnNtaXRfaV9mcmFtZXModEwyQ19DQ0IqIHBfY2NiLCB1aW50OF90IHR4X3NlcSk7Ci1zdGF0aWMgdm9pZCBwcmVwYXJlX0lfZnJhbWUodEwyQ19DQ0IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmV0cmFuc21pc3Npb24pOwotc3RhdGljIGJvb2wgZG9fc2FyX3JlYXNzZW1ibHkodEwyQ19DQ0IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY3RybF93b3JkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19mY3JfdXBkY3JjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBDUkMgdXNpbmcgdGhlIGxvb2stdXAgdGFibGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBDUkMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGwyY19mY3JfdXBkY3JjKHVuc2lnbmVkIHNob3J0IGljcmMsIHVuc2lnbmVkIGNoYXIqIGljcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWNudCkgewotICB1bnNpZ25lZCBzaG9ydCBjcmMgPSBpY3JjOwotICB1bnNpZ25lZCBjaGFyKiBjcCA9IGljcDsKLSAgaW50IGNudCA9IGljbnQ7Ci0KLSAgd2hpbGUgKGNudC0tKSB7Ci0gICAgY3JjID0gKChjcmMgPj4gOCkgJiAweGZmKSBeIGNyY3RhYlsoY3JjICYgMHhmZikgXiAqY3ArK107Ci0gIH0KLQotICByZXR1cm4gKGNyYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX3R4X2dldF9mY3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIENSQyBmb3IgYSBmcmFtZSB0byBiZSBUWGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgQ1JDCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50MTZfdCBsMmNfZmNyX3R4X2dldF9mY3MoQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90KiBwID0gKCh1aW50OF90KikocF9idWYgKyAxKSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIHJldHVybiAobDJjX2Zjcl91cGRjcmMoTDJDQVBfRkNSX0lOSVRfQ1JDLCBwLCBwX2J1Zi0+bGVuKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX3J4X2dldF9mY3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIENSQyBmb3IgYSByZWNlaXZlZCBmcmFtZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIENSQwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDE2X3QgbDJjX2Zjcl9yeF9nZXRfZmNzKEJUX0hEUiogcF9idWYpIHsKLSAgdWludDhfdCogcCA9ICgodWludDhfdCopKHBfYnVmICsgMSkpICsgcF9idWYtPm9mZnNldDsKLQotICAvKiBvZmZzZXQgcG9pbnRzIHBhc3QgdGhlIEwyQ0FQIGhlYWRlciwgYnV0IHRoZSBDUkMgY2hlY2sgaW5jbHVkZXMgaXQgKi8KLSAgcCAtPSBMMkNBUF9QS1RfT1ZFUkhFQUQ7Ci0KLSAgcmV0dXJuICgKLSAgICAgIGwyY19mY3JfdXBkY3JjKEwyQ0FQX0ZDUl9JTklUX0NSQywgcCwgcF9idWYtPmxlbiArIEwyQ0FQX1BLVF9PVkVSSEVBRCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2Zjcl9zdGFydF90aW1lcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIChtb25pdG9yIG9yIHJldHJhbnNtaXNzaW9uKSB0aW1lci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIC0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfZmNyX3N0YXJ0X3RpbWVyKHRMMkNfQ0NCKiBwX2NjYikgewotICBDSEVDSyhwX2NjYiAhPSBOVUxMKTsKLSAgdWludDMyX3QgdG91dDsKLQotICAvKiBUaGUgdGltZXJzIHdoaWNoIGFyZSBpbiBtaWxsaXNlY29uZHMgKi8KLSAgaWYgKHBfY2NiLT5mY3JiLndhaXRfYWNrKSB7Ci0gICAgdG91dCA9ICh1aW50MzJfdClwX2NjYi0+b3VyX2NmZy5mY3IubW9uX3RvdXQ7Ci0gIH0gZWxzZSB7Ci0gICAgdG91dCA9ICh1aW50MzJfdClwX2NjYi0+b3VyX2NmZy5mY3IucnRyYW5zX3RvdXQ7Ci0gIH0KLQotICAvKiBPbmx5IHN0YXJ0IGEgdGltZXIgdGhhdCB3YXMgbm90IHN0YXJ0ZWQgKi8KLSAgaWYgKCFhbGFybV9pc19zY2hlZHVsZWQocF9jY2ItPmZjcmIubW9uX3JldHJhbnNfdGltZXIpKSB7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5mY3JiLm1vbl9yZXRyYW5zX3RpbWVyLCB0b3V0LAotICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2Zjcl9zdG9wX3RpbWVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0b3BzIHRoZSAobW9uaXRvciBvciB0cmFuc21pc3Npb24pIHRpbWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19mY3Jfc3RvcF90aW1lcih0TDJDX0NDQiogcF9jY2IpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0gIGFsYXJtX2NhbmNlbChwX2NjYi0+ZmNyYi5tb25fcmV0cmFuc190aW1lcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX2NsZWFudXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSB2YXJpYWJsZSB1c2VkIGZvcgotICogICAgICAgICAgICAgICAgICBmbG93LWNvbnRyb2wvcmV0cmFucy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIC0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfZmNyX2NsZWFudXAodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICB0TDJDX0ZDUkIqIHBfZmNyYiA9ICZwX2NjYi0+ZmNyYjsKLQotICBhbGFybV9mcmVlKHBfZmNyYi0+bW9uX3JldHJhbnNfdGltZXIpOwotICBwX2ZjcmItPm1vbl9yZXRyYW5zX3RpbWVyID0gTlVMTDsKLSAgYWxhcm1fZnJlZShwX2ZjcmItPmFja190aW1lcik7Ci0gIHBfZmNyYi0+YWNrX3RpbWVyID0gTlVMTDsKLQotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9mY3JiLT5wX3J4X3NkdSk7Ci0KLSAgZml4ZWRfcXVldWVfZnJlZShwX2ZjcmItPndhaXRpbmdfZm9yX2Fja19xLCBvc2lfZnJlZSk7Ci0gIHBfZmNyYi0+d2FpdGluZ19mb3JfYWNrX3EgPSBOVUxMOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUocF9mY3JiLT5zcmVqX3Jjdl9ob2xkX3EsIG9zaV9mcmVlKTsKLSAgcF9mY3JiLT5zcmVqX3Jjdl9ob2xkX3EgPSBOVUxMOwotCi0gIGZpeGVkX3F1ZXVlX2ZyZWUocF9mY3JiLT5yZXRyYW5zX3EsIG9zaV9mcmVlKTsKLSAgcF9mY3JiLT5yZXRyYW5zX3EgPSBOVUxMOwotCi0gIG1lbXNldChwX2ZjcmIsIDAsIHNpemVvZih0TDJDX0ZDUkIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19mY3JfY2xvbmVfYnVmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgY29waWVzIHJlcXVlc3RlZCBwYXJ0IG9mIGEKLSAqICAgICAgICAgICAgICAgICAgYnVmZmVyIGF0IGEgbmV3LW9mZnNldC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gbmV3IGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CVF9IRFIqIGwyY19mY3JfY2xvbmVfYnVmKEJUX0hEUiogcF9idWYsIHVpbnQxNl90IG5ld19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5vX29mX2J5dGVzKSB7Ci0gIENIRUNLKHBfYnVmICE9IE5VTEwpOwotICAvKgotICAgKiBOT1RFOiBXZSBhbGxvY2F0ZSBleHRyYSBMMkNBUF9GQ1NfTEVOIG9jdGV0cywgaW4gY2FzZSB3ZSBuZWVkIHRvIHB1dAotICAgKiB0aGUgRkNTIChGcmFtZSBDaGVjayBTZXF1ZW5jZSkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICAgKi8KLSAgdWludDE2X3QgYnVmX3NpemUgPSBub19vZl9ieXRlcyArIHNpemVvZihCVF9IRFIpICsgbmV3X29mZnNldCArIEwyQ0FQX0ZDU19MRU47Ci0gIEJUX0hEUiogcF9idWYyID0gKEJUX0hEUiopb3NpX21hbGxvYyhidWZfc2l6ZSk7Ci0KLSAgcF9idWYyLT5vZmZzZXQgPSBuZXdfb2Zmc2V0OwotICBwX2J1ZjItPmxlbiA9IG5vX29mX2J5dGVzOwotICBtZW1jcHkoKCh1aW50OF90KikocF9idWYyICsgMSkpICsgcF9idWYyLT5vZmZzZXQsCi0gICAgICAgICAoKHVpbnQ4X3QqKShwX2J1ZiArIDEpKSArIHBfYnVmLT5vZmZzZXQsIG5vX29mX2J5dGVzKTsKLQotICByZXR1cm4gKHBfYnVmMik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX2lzX2Zsb3dfY29udHJvbGxlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIENDQiBpcyBmbG93IGNvbnRyb2xsZWQgYnkgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFRoZSBjb250cm9sIHdvcmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBsMmNfZmNyX2lzX2Zsb3dfY29udHJvbGxlZCh0TDJDX0NDQiogcF9jY2IpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0gIGlmIChwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkgewotICAgIC8qIENoZWNrIGlmIHJlbW90ZSBzaWRlIGZsb3dlZCB1cyBvZmYgb3IgdGhlIHRyYW5zbWl0IHdpbmRvdyBpcyBmdWxsICovCi0gICAgaWYgKChwX2NjYi0+ZmNyYi5yZW1vdGVfYnVzeSkgfHwKLSAgICAgICAgKGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NjYi0+ZmNyYi53YWl0aW5nX2Zvcl9hY2tfcSkgPj0KLSAgICAgICAgIHBfY2NiLT5wZWVyX2NmZy5mY3IudHhfd2luX3N6KSkgewotICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwcmVwYXJlX0lfZnJhbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgRkNSIHZhcmlhYmxlcyBpbiBhbiBJLWZyYW1lIHRoYXQgaXMKLSAqICAgICAgICAgICAgICAgICAgYWJvdXQgdG8gYmUgc2VudCB0byBIQ0kgZm9yIHRyYW5zbWlzc2lvbi4gVGhpcyBtYXkgYmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGZpcnN0IHRpbWUgdGhlIEktZnJhbWUgaXMgc2VudCwgb3IgYSByZXRyYW5zbWlzc2lvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwcmVwYXJlX0lfZnJhbWUodEwyQ19DQ0IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmV0cmFuc21pc3Npb24pIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0gIENIRUNLKHBfYnVmICE9IE5VTEwpOwotICB0TDJDX0ZDUkIqIHBfZmNyYiA9ICZwX2NjYi0+ZmNyYjsKLSAgdWludDhfdCogcDsKLSAgdWludDE2X3QgZmNzOwotICB1aW50MTZfdCBjdHJsX3dvcmQ7Ci0gIGJvb2wgc2V0X2ZfYml0ID0gcF9mY3JiLT5zZW5kX2ZfcnNwOwotCi0gIHBfZmNyYi0+c2VuZF9mX3JzcCA9IGZhbHNlOwotCi0gIGlmIChpc19yZXRyYW5zbWlzc2lvbikgewotICAgIC8qIEdldCB0aGUgb2xkIGNvbnRyb2wgd29yZCBhbmQgY2xlYXIgb3V0IHRoZSBvbGQgcmVxX3NlcSBhbmQgRiBiaXRzICovCi0gICAgcCA9ICgodWludDhfdCopKHBfYnVmICsgMSkpICsgcF9idWYtPm9mZnNldCArIEwyQ0FQX1BLVF9PVkVSSEVBRDsKLQotICAgIFNUUkVBTV9UT19VSU5UMTYoY3RybF93b3JkLCBwKTsKLQotICAgIGN0cmxfd29yZCAmPSB+KEwyQ0FQX0ZDUl9SRVFfU0VRX0JJVFMgKyBMMkNBUF9GQ1JfRl9CSVQpOwotICB9IGVsc2UgewotICAgIGN0cmxfd29yZCA9IHBfYnVmLT5sYXllcl9zcGVjaWZpYyAmIEwyQ0FQX0ZDUl9TRUdfQklUUzsgLyogU0FSIGJpdHMgKi8KLSAgICBjdHJsX3dvcmQgfD0KLSAgICAgICAgKHBfZmNyYi0+bmV4dF90eF9zZXEgPDwgTDJDQVBfRkNSX1RYX1NFUV9CSVRTX1NISUZUKTsgLyogVHggU2VxICovCi0KLSAgICBwX2ZjcmItPm5leHRfdHhfc2VxID0gKHBfZmNyYi0+bmV4dF90eF9zZXEgKyAxKSAmIEwyQ0FQX0ZDUl9TRVFfTU9EVUxPOwotICB9Ci0KLSAgLyogU2V0IHRoZSBGLWJpdCBhbmQgcmVxc2VxIG9ubHkgaWYgdXNpbmcgcmUtdHJhbnNtaXNzaW9uIG1vZGUgKi8KLSAgaWYgKHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKSB7Ci0gICAgaWYgKHNldF9mX2JpdCkgY3RybF93b3JkIHw9IEwyQ0FQX0ZDUl9GX0JJVDsKLQotICAgIGN0cmxfd29yZCB8PSAocF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCkgPDwgTDJDQVBfRkNSX1JFUV9TRVFfQklUU19TSElGVDsKLQotICAgIHBfZmNyYi0+bGFzdF9hY2tfc2VudCA9IHBfY2NiLT5mY3JiLm5leHRfc2VxX2V4cGVjdGVkOwotCi0gICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5mY3JiLmFja190aW1lcik7Ci0gIH0KLQotICAvKiBTZXQgdGhlIGNvbnRyb2wgd29yZCAqLwotICBwID0gKCh1aW50OF90KikocF9idWYgKyAxKSkgKyBwX2J1Zi0+b2Zmc2V0ICsgTDJDQVBfUEtUX09WRVJIRUFEOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgY3RybF93b3JkKTsKLQotICAvKiBDb21wdXRlIHRoZSBGQ1MgYW5kIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaWYgbm90IGJ5cGFzc2VkICovCi0gIC8qIGxlbmd0aCBmaWVsZCBpbiBsMmNhcCBoZWFkZXIgaGFzIHRvIGluY2x1ZGUgRkNTIGxlbmd0aCAqLwotICBwID0gKCh1aW50OF90KikocF9idWYgKyAxKSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfYnVmLT5sZW4gKyBMMkNBUF9GQ1NfTEVOIC0gTDJDQVBfUEtUX09WRVJIRUFEKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIEZDUyAqLwotICBmY3MgPSBsMmNfZmNyX3R4X2dldF9mY3MocF9idWYpOwotCi0gIC8qIFBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBhbmQgcHV0IHRoZSBGQ1MgdGhlcmUgKi8KLSAgLyoKLSAgICogTk9URTogSGVyZSB3ZSBhc3N1bWUgdGhlIGFsbG9jYXRlZCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCi0gICAqIHRvIGluY2x1ZGUgZXh0cmEgTDJDQVBfRkNTX0xFTiBvY3RldHMgYXQgdGhlIGVuZC4KLSAgICovCi0gIHAgPSAoKHVpbnQ4X3QqKShwX2J1ZiArIDEpKSArIHBfYnVmLT5vZmZzZXQgKyBwX2J1Zi0+bGVuOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgZmNzKTsKLQotICBwX2J1Zi0+bGVuICs9IEwyQ0FQX0ZDU19MRU47Ci0KLSAgaWYgKGlzX3JldHJhbnNtaXNzaW9uKSB7Ci0gICAgTDJDQVBfVFJBQ0VfRVZFTlQoCi0gICAgICAgICJMMkNBUCBlUlRNIFJlVHggSS1mcmFtZSAgQ0lEOiAweCUwNHggIExlbjogJXUgIFNBUjogJXMgIFR4U2VxOiAldSAgIgotICAgICAgICAiUmVxU2VxOiAldSAgRjogJXUiLAotICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2J1Zi0+bGVuLAotICAgICAgICBTQVJfdHlwZXNbKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TQVJfQklUUykgPj4gTDJDQVBfRkNSX1NBUl9CSVRTX1NISUZUXSwKLSAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9UWF9TRVFfQklUUykgPj4gTDJDQVBfRkNSX1RYX1NFUV9CSVRTX1NISUZULAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1JFUV9TRVFfQklUUykgPj4gTDJDQVBfRkNSX1JFUV9TRVFfQklUU19TSElGVCwKLSAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9GX0JJVCkgPj4gTDJDQVBfRkNSX0ZfQklUX1NISUZUKTsKLSAgfSBlbHNlIHsKLSAgICBMMkNBUF9UUkFDRV9FVkVOVCgKLSAgICAgICAgIkwyQ0FQIGVSVE0gVHggSS1mcmFtZSBDSUQ6IDB4JTA0eCAgTGVuOiAldSAgU0FSOiAlLTEycyAgVHhTZXE6ICV1ICAiCi0gICAgICAgICJSZXFTZXE6ICV1ICBGOiAldSIsCi0gICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIHBfYnVmLT5sZW4sCi0gICAgICAgIFNBUl90eXBlc1soY3RybF93b3JkICYgTDJDQVBfRkNSX1NBUl9CSVRTKSA+PiBMMkNBUF9GQ1JfU0FSX0JJVFNfU0hJRlRdLAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1RYX1NFUV9CSVRTKSA+PiBMMkNBUF9GQ1JfVFhfU0VRX0JJVFNfU0hJRlQsCi0gICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTKSA+PiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTX1NISUZULAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX0ZfQklUKSA+PiBMMkNBUF9GQ1JfRl9CSVRfU0hJRlQpOwotICB9Ci0KLSAgLyogU3RhcnQgdGhlIHJldHJhbnNtaXNzaW9uIHRpbWVyIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcgKi8KLSAgaWYgKHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKQotICAgIGwyY19mY3Jfc3RhcnRfdGltZXIocF9jY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2Zjcl9zZW5kX1NfZnJhbWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBhbmQgc2VuZHMgYW4gUy1mcmFtZSBmb3IgdHJhbnNtaXNzaW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19mY3Jfc2VuZF9TX2ZyYW1lKHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgZnVuY3Rpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGZfYml0KSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICB1aW50OF90KiBwOwotICB1aW50MTZfdCBjdHJsX3dvcmQ7Ci0gIHVpbnQxNl90IGZjczsKLQotICBpZiAoKCFwX2NjYi0+aW5fdXNlKSB8fCAocF9jY2ItPmNobmxfc3RhdGUgIT0gQ1NUX09QRU4pKSByZXR1cm47Ci0KLSAgaWYgKHBmX2JpdCA9PSBMMkNBUF9GQ1JfUF9CSVQpIHsKLSAgICBwX2NjYi0+ZmNyYi53YWl0X2FjayA9IHRydWU7Ci0KLSAgICBsMmNfZmNyX3N0b3BfdGltZXIocF9jY2IpOyAvKiBSZXN0YXJ0IHRoZSBtb25pdG9yIHRpbWVyICovCi0gICAgbDJjX2Zjcl9zdGFydF90aW1lcihwX2NjYik7Ci0gIH0KLQotICAvKiBDcmVhdGUgdGhlIGNvbnRyb2wgd29yZCB0byB1c2UgKi8KLSAgY3RybF93b3JkID0gKGZ1bmN0aW9uX2NvZGUgPDwgTDJDQVBfRkNSX1NVUF9TSElGVCkgfCBMMkNBUF9GQ1JfU19GUkFNRV9CSVQ7Ci0gIGN0cmxfd29yZCB8PSAocF9jY2ItPmZjcmIubmV4dF9zZXFfZXhwZWN0ZWQgPDwgTDJDQVBfRkNSX1JFUV9TRVFfQklUU19TSElGVCk7Ci0gIGN0cmxfd29yZCB8PSBwZl9iaXQ7Ci0KLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoTDJDQVBfQ01EX0JVRl9TSVpFKTsKLSAgcF9idWYtPm9mZnNldCA9IEhDSV9EQVRBX1BSRUFNQkxFX1NJWkU7Ci0gIHBfYnVmLT5sZW4gPSBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9GQ1JfT1ZFUkhFQUQ7Ci0KLSAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgKi8KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0KLSAgLyogUHV0IGluIHRoZSBMMkNBUCBoZWFkZXIgKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBMMkNBUF9GQ1JfT1ZFUkhFQUQgKyBMMkNBUF9GQ1NfTEVOKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+cmVtb3RlX2NpZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgY3RybF93b3JkKTsKLQotICAvKiBDb21wdXRlIHRoZSBGQ1MgYW5kIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaWYgbm90IGJ5cGFzc2VkICovCi0gIGZjcyA9IGwyY19mY3JfdHhfZ2V0X2ZjcyhwX2J1Zik7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBmY3MpOwotICBwX2J1Zi0+bGVuICs9IEwyQ0FQX0ZDU19MRU47Ci0KLSAgLyogTm93LCB0aGUgSENJIHRyYW5zcG9ydCBoZWFkZXIgKi8KLSAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gTDJDQVBfTk9OX0ZMVVNIQUJMRV9QS1Q7Ci0gIGwyY3Vfc2V0X2FjbF9oY2lfaGVhZGVyKHBfYnVmLCBwX2NjYik7Ci0KLSAgaWYgKCgoKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TVVBfQklUUykgPj4gTDJDQVBfRkNSX1NVUF9TSElGVCkgPT0gMSkgfHwKLSAgICAgICgoKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TVVBfQklUUykgPj4gTDJDQVBfRkNSX1NVUF9TSElGVCkgPT0gMykpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiTDJDQVAgZVJUTSBUeCBTLWZyYW1lICBDSUQ6IDB4JTA0eCAgY3RybHdvcmQ6IDB4JTA0eCAgVHlwZTogJXMgICIKLSAgICAgICAgIlJlcVNlcTogJXUgIFA6ICV1ICBGOiAldSIsCi0gICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIGN0cmxfd29yZCwKLSAgICAgICAgU1VQX3R5cGVzWyhjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfU1VQX0JJVFMpID4+IEwyQ0FQX0ZDUl9TVVBfU0hJRlRdLAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1JFUV9TRVFfQklUUykgPj4gTDJDQVBfRkNSX1JFUV9TRVFfQklUU19TSElGVCwKLSAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9QX0JJVCkgPj4gTDJDQVBfRkNSX1BfQklUX1NISUZULAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX0ZfQklUKSA+PiBMMkNBUF9GQ1JfRl9CSVRfU0hJRlQpOwotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiAgICAgICAgICAgICAgICAgIEJ1ZiBMZW46ICV1IiwgcF9idWYtPmxlbik7Ci0gIH0gZWxzZSB7Ci0gICAgTDJDQVBfVFJBQ0VfRVZFTlQoCi0gICAgICAgICJMMkNBUCBlUlRNIFR4IFMtZnJhbWUgIENJRDogMHglMDR4ICBjdHJsd29yZDogMHglMDR4ICBUeXBlOiAlcyAgIgotICAgICAgICAiUmVxU2VxOiAldSAgUDogJXUgIEY6ICV1IiwKLSAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgY3RybF93b3JkLAotICAgICAgICBTVVBfdHlwZXNbKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TVVBfQklUUykgPj4gTDJDQVBfRkNSX1NVUF9TSElGVF0sCi0gICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTKSA+PiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTX1NISUZULAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1BfQklUKSA+PiBMMkNBUF9GQ1JfUF9CSVRfU0hJRlQsCi0gICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfRl9CSVQpID4+IEwyQ0FQX0ZDUl9GX0JJVF9TSElGVCk7Ci0gICAgTDJDQVBfVFJBQ0VfRVZFTlQoIiAgICAgICAgICAgICAgICAgIEJ1ZiBMZW46ICV1IiwgcF9idWYtPmxlbik7Ci0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBwX2J1Zik7Ci0KLSAgcF9jY2ItPmZjcmIubGFzdF9hY2tfc2VudCA9IHBfY2NiLT5mY3JiLm5leHRfc2VxX2V4cGVjdGVkOwotCi0gIGFsYXJtX2NhbmNlbChwX2NjYi0+ZmNyYi5hY2tfdGltZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2Zjcl9wcm9jX3BkdQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHByb2Nlc3Npbmcgb2YgYQotICogICAgICAgICAgICAgICAgICByZWNlaXZlZCBQRFUgd2hlbiBpbiBmbG93IGNvbnRyb2wgYW5kL29yIHJldHJhbnNtaXNzaW9uCi0gKiAgICAgICAgICAgICAgICAgIG1vZGVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19mY3JfcHJvY19wZHUodEwyQ19DQ0IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICBDSEVDSyhwX2J1ZiAhPSBOVUxMKTsKLSAgdWludDhfdCogcDsKLSAgdWludDE2X3QgZmNzOwotICB1aW50MTZfdCBtaW5fcGR1X2xlbjsKLSAgdWludDE2X3QgY3RybF93b3JkOwotCi0gIC8qIENoZWNrIHRoZSBsZW5ndGggKi8KLSAgbWluX3BkdV9sZW4gPSAodWludDE2X3QpKEwyQ0FQX0ZDU19MRU4gKyBMMkNBUF9GQ1JfT1ZFUkhFQUQpOwotCi0gIGlmIChwX2J1Zi0+bGVuIDwgbWluX3BkdV9sZW4pIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJSeCBMMkNBUCBQRFU6IENJRDogMHglMDR4ICBMZW4gdG9vIHNob3J0OiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2J1Zi0+bGVuKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogR2V0IHRoZSBjb250cm9sIHdvcmQgKi8KLSAgcCA9ICgodWludDhfdCopKHBfYnVmICsgMSkpICsgcF9idWYtPm9mZnNldDsKLSAgU1RSRUFNX1RPX1VJTlQxNihjdHJsX3dvcmQsIHApOwotCi0gIGlmIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfU19GUkFNRV9CSVQpIHsKLSAgICBpZiAoKCgoY3RybF93b3JkICYgTDJDQVBfRkNSX1NVUF9CSVRTKSA+PiBMMkNBUF9GQ1JfU1VQX1NISUZUKSA9PSAxKSB8fAotICAgICAgICAoKChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfU1VQX0JJVFMpID4+IEwyQ0FQX0ZDUl9TVVBfU0hJRlQpID09IDMpKSB7Ci0gICAgICAvKiBSRUogb3IgU1JFSiAqLwotICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiTDJDQVAgZVJUTSBSeCBTLWZyYW1lOiBjaWQ6IDB4JTA0eCAgTGVuOiAldSAgVHlwZTogJXMgIFJlcVNlcTogJXUgICIKLSAgICAgICAgICAiUDogJXUgIEY6ICV1IiwKLSAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2J1Zi0+bGVuLAotICAgICAgICAgIFNVUF90eXBlc1soY3RybF93b3JkICYgTDJDQVBfRkNSX1NVUF9CSVRTKSA+PiBMMkNBUF9GQ1JfU1VQX1NISUZUXSwKLSAgICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1JFUV9TRVFfQklUUykgPj4gTDJDQVBfRkNSX1JFUV9TRVFfQklUU19TSElGVCwKLSAgICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1BfQklUKSA+PiBMMkNBUF9GQ1JfUF9CSVRfU0hJRlQsCi0gICAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9GX0JJVCkgPj4gTDJDQVBfRkNSX0ZfQklUX1NISUZUKTsKLSAgICB9IGVsc2UgewotICAgICAgTDJDQVBfVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgIkwyQ0FQIGVSVE0gUnggUy1mcmFtZTogY2lkOiAweCUwNHggIExlbjogJXUgIFR5cGU6ICVzICBSZXFTZXE6ICV1ICAiCi0gICAgICAgICAgIlA6ICV1ICBGOiAldSIsCi0gICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgcF9idWYtPmxlbiwKLSAgICAgICAgICBTVVBfdHlwZXNbKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TVVBfQklUUykgPj4gTDJDQVBfRkNSX1NVUF9TSElGVF0sCi0gICAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9SRVFfU0VRX0JJVFMpID4+IEwyQ0FQX0ZDUl9SRVFfU0VRX0JJVFNfU0hJRlQsCi0gICAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9QX0JJVCkgPj4gTDJDQVBfRkNSX1BfQklUX1NISUZULAotICAgICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfRl9CSVQpID4+IEwyQ0FQX0ZDUl9GX0JJVF9TSElGVCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEwyQ0FQX1RSQUNFX0VWRU5UKAotICAgICAgICAiTDJDQVAgZVJUTSBSeCBJLWZyYW1lOiBjaWQ6IDB4JTA0eCAgTGVuOiAldSAgU0FSOiAlLTEycyAgVHhTZXE6ICV1ICAiCi0gICAgICAgICJSZXFTZXE6ICV1ICBGOiAldSIsCi0gICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIHBfYnVmLT5sZW4sCi0gICAgICAgIFNBUl90eXBlc1soY3RybF93b3JkICYgTDJDQVBfRkNSX1NBUl9CSVRTKSA+PiBMMkNBUF9GQ1JfU0FSX0JJVFNfU0hJRlRdLAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX1RYX1NFUV9CSVRTKSA+PiBMMkNBUF9GQ1JfVFhfU0VRX0JJVFNfU0hJRlQsCi0gICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTKSA+PiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTX1NISUZULAotICAgICAgICAoY3RybF93b3JkICYgTDJDQVBfRkNSX0ZfQklUKSA+PiBMMkNBUF9GQ1JfRl9CSVRfU0hJRlQpOwotICB9Ci0KLSAgTDJDQVBfVFJBQ0VfRVZFTlQoCi0gICAgICAiICAgICAgZVJUTSBSeCBOeHRfdHhfc2VxICV1LCBMc3RfcnhfYWNrICV1LCBOeHRfc2VxX2V4cCAldSwgTHN0X2Fja19zbnQgIgotICAgICAgIiV1LCB3dF9xLmNudCAldSwgdHJpZXMgJXUiLAotICAgICAgcF9jY2ItPmZjcmIubmV4dF90eF9zZXEsIHBfY2NiLT5mY3JiLmxhc3RfcnhfYWNrLAotICAgICAgcF9jY2ItPmZjcmIubmV4dF9zZXFfZXhwZWN0ZWQsIHBfY2NiLT5mY3JiLmxhc3RfYWNrX3NlbnQsCi0gICAgICBmaXhlZF9xdWV1ZV9sZW5ndGgocF9jY2ItPmZjcmIud2FpdGluZ19mb3JfYWNrX3EpLCBwX2NjYi0+ZmNyYi5udW1fdHJpZXMpOwotCi0gIC8qIFZlcmlmeSBGQ1MgaWYgdXNpbmcgKi8KLSAgcCA9ICgodWludDhfdCopKHBfYnVmICsgMSkpICsgcF9idWYtPm9mZnNldCArIHBfYnVmLT5sZW4gLSBMMkNBUF9GQ1NfTEVOOwotCi0gIC8qIEV4dHJhY3QgYW5kIGRyb3AgdGhlIEZDUyBmcm9tIHRoZSBwYWNrZXQgKi8KLSAgU1RSRUFNX1RPX1VJTlQxNihmY3MsIHApOwotICBwX2J1Zi0+bGVuIC09IEwyQ0FQX0ZDU19MRU47Ci0KLSAgaWYgKGwyY19mY3JfcnhfZ2V0X2ZjcyhwX2J1ZikgIT0gZmNzKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiUnggTDJDQVAgUERVOiBDSUQ6IDB4JTA0eCAgQkFEIEZDUyIsIHBfY2NiLT5sb2NhbF9jaWQpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBHZXQgdGhlIGNvbnRyb2wgd29yZCAqLwotICBwID0gKCh1aW50OF90KikocF9idWYgKyAxKSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gIFNUUkVBTV9UT19VSU5UMTYoY3RybF93b3JkLCBwKTsKLQotICBwX2J1Zi0+bGVuIC09IEwyQ0FQX0ZDUl9PVkVSSEVBRDsKLSAgcF9idWYtPm9mZnNldCArPSBMMkNBUF9GQ1JfT1ZFUkhFQUQ7Ci0KLSAgLyogSWYgd2UgaGFkIGEgcG9sbCBiaXQgb3V0c3RhbmRpbmcsIGNoZWNrIGlmIHdlIGdvdCBhIGZpbmFsIHJlc3BvbnNlICovCi0gIGlmIChwX2NjYi0+ZmNyYi53YWl0X2FjaykgewotICAgIC8qIElmIGZpbmFsIGJpdCBub3Qgc2V0LCBpZ25vcmUgdGhlIGZyYW1lIHVubGVzcyBpdCBpcyBhIHBvbGxlZCBTLWZyYW1lICovCi0gICAgaWYgKCEoY3RybF93b3JkICYgTDJDQVBfRkNSX0ZfQklUKSkgewotICAgICAgaWYgKChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfUF9CSVQpICYmCi0gICAgICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TX0ZSQU1FX0JJVCkpIHsKLSAgICAgICAgaWYgKHBfY2NiLT5mY3JiLnNyZWpfc2VudCkKLSAgICAgICAgICBsMmNfZmNyX3NlbmRfU19mcmFtZShwX2NjYiwgTDJDQVBfRkNSX1NVUF9TUkVKLCBMMkNBUF9GQ1JfRl9CSVQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbDJjX2Zjcl9zZW5kX1NfZnJhbWUocF9jY2IsIEwyQ0FQX0ZDUl9TVVBfUlIsIEwyQ0FQX0ZDUl9GX0JJVCk7Ci0KLSAgICAgICAgLyogR290IGEgcG9sbCB3aGlsZSBpbiB3YWl0X2FjayBzdGF0ZSwgc28gcmUtc3RhcnQgb3VyIHRpbWVyIHdpdGgKLSAgICAgICAgICogMS1zZWNvbmQgKi8KLSAgICAgICAgLyogVGhpcyBpcyBhIHNtYWxsIG9wdGltaXphdGlvbi4uLiB0aGUgbW9uaXRvciB0aW1lciBpcyAxMiBzZWNzLCBidXQgd2UKLSAgICAgICAgICogc2F3ICovCi0gICAgICAgIC8qIHRoYXQgaWYgdGhlIG90aGVyIHNpZGUgc2VuZHMgdXMgYSBwb2xsIHdoZW4gd2UgYXJlIHdhaXRpbmcgZm9yIGEKLSAgICAgICAgICogZmluYWwsICAqLwotICAgICAgICAvKiB0aGVuIGl0IHNwZWVkcyB1cCByZWNvdmVyeSBzaWduaWZpY2FudGx5IGlmIHdlIHBvbGwgaXQgYmFjayBzb29uCi0gICAgICAgICAqIGFmdGVyIGl0cyBwb2xsLiAqLwotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmZjcmIubW9uX3JldHJhbnNfdGltZXIsIEJUXzFTRUNfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19jY2JfdGltZXJfdGltZW91dCwgcF9jY2IpOwotICAgICAgfQotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBfY2NiLT5mY3JiLndhaXRfYWNrID0gZmFsc2U7Ci0KLSAgICAvKiBQIGFuZCBGIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KLSAgICBpZiAoY3RybF93b3JkICYgTDJDQVBfRkNSX1NfRlJBTUVfQklUKSBjdHJsX3dvcmQgJj0gfkwyQ0FQX0ZDUl9QX0JJVDsKLQotICAgIGlmIChmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+ZmNyYi53YWl0aW5nX2Zvcl9hY2tfcSkpCi0gICAgICBwX2NjYi0+ZmNyYi5udW1fdHJpZXMgPSAwOwotCi0gICAgbDJjX2Zjcl9zdG9wX3RpbWVyKHBfY2NiKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBPdGhlcndpc2UsIGVuc3VyZSB0aGUgZmluYWwgYml0IGlzIGlnbm9yZWQgKi8KLSAgICBjdHJsX3dvcmQgJj0gfkwyQ0FQX0ZDUl9GX0JJVDsKLSAgfQotCi0gIC8qIFByb2Nlc3MgcmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgKi8KLSAgaWYgKCFwcm9jZXNzX3JlcXNlcShwX2NjYiwgY3RybF93b3JkKSkgewotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBQcm9jZXNzIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYW4gUy1mcmFtZSBvciBhbiBJLWZyYW1lICovCi0gIGlmIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfU19GUkFNRV9CSVQpCi0gICAgcHJvY2Vzc19zX2ZyYW1lKHBfY2NiLCBwX2J1ZiwgY3RybF93b3JkKTsKLSAgZWxzZQotICAgIHByb2Nlc3NfaV9mcmFtZShwX2NjYiwgcF9idWYsIGN0cmxfd29yZCwgZmFsc2UpOwotCi0gIC8qIFJldHVybiBpZiB0aGUgY2hhbm5lbCBnb3QgZGlzY29ubmVjdGVkIGJ5IGEgYmFkIHBhY2tldCBvciBtYXgKLSAgICogcmV0cmFuc21pc3Npb25zICovCi0gIGlmICgoIXBfY2NiLT5pbl91c2UpIHx8IChwX2NjYi0+Y2hubF9zdGF0ZSAhPSBDU1RfT1BFTikpIHJldHVybjsKLQotICAvKiBJZiB3ZSBoYXZlIHNvbWUgYnVmZmVycyBoZWxkIHdoaWxlIGRvaW5nIFNSRUosIGFuZCBTUkVKIGhhcyBjbGVhcmVkLAotICAgKiBwcm9jZXNzIHRoZW0gbm93ICovCi0gIGlmICgoIXBfY2NiLT5mY3JiLnNyZWpfc2VudCkgJiYKLSAgICAgICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPmZjcmIuc3Jlal9yY3ZfaG9sZF9xKSkpIHsKLSAgICBmaXhlZF9xdWV1ZV90KiB0ZW1wX3EgPSBwX2NjYi0+ZmNyYi5zcmVqX3Jjdl9ob2xkX3E7Ci0gICAgcF9jY2ItPmZjcmIuc3Jlal9yY3ZfaG9sZF9xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLQotICAgIHdoaWxlICgocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZSh0ZW1wX3EpKSAhPSBOVUxMKSB7Ci0gICAgICBpZiAocF9jY2ItPmluX3VzZSAmJiAocF9jY2ItPmNobmxfc3RhdGUgPT0gQ1NUX09QRU4pKSB7Ci0gICAgICAgIC8qIEdldCB0aGUgY29udHJvbCB3b3JkICovCi0gICAgICAgIHAgPSAoKHVpbnQ4X3QqKShwX2J1ZiArIDEpKSArIHBfYnVmLT5vZmZzZXQgLSBMMkNBUF9GQ1JfT1ZFUkhFQUQ7Ci0KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjdHJsX3dvcmQsIHApOwotCi0gICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgImwyY19mY3JfcHJvY19wZHUoKSBDSUQ6IDB4JTA0eCAgUHJvY2VzcyBCdWZmZXIgZnJvbSBTUkVKX0hvbGRfUSAgICIKLSAgICAgICAgICAgICJUeFNlcTogJXUgIEV4cGVjdGVkX1NlcTogJXUiLAotICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfVFhfU0VRX0JJVFMpID4+IEwyQ0FQX0ZDUl9UWF9TRVFfQklUU19TSElGVCwKLSAgICAgICAgICAgIHBfY2NiLT5mY3JiLm5leHRfc2VxX2V4cGVjdGVkKTsKLQotICAgICAgICAvKiBQcm9jZXNzIHRoZSBTUkVKIGhlbGQgSS1mcmFtZSwgYnV0IGRvIG5vdCBzZW5kIGFuIFJSIGZvciBlYWNoCi0gICAgICAgICAqIGluZGl2aWR1YWwgZnJhbWUgKi8KLSAgICAgICAgcHJvY2Vzc19pX2ZyYW1lKHBfY2NiLCBwX2J1ZiwgY3RybF93b3JkLCB0cnVlKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0KLSAgICAgIC8qIElmIG1vcmUgZnJhbWVzIHdlcmUgbG9zdCBkdXJpbmcgU1JFSiwgc2VuZCBhIFJFSiAqLwotICAgICAgaWYgKHBfY2NiLT5mY3JiLnJlal9hZnRlcl9zcmVqKSB7Ci0gICAgICAgIHBfY2NiLT5mY3JiLnJlal9hZnRlcl9zcmVqID0gZmFsc2U7Ci0gICAgICAgIHBfY2NiLT5mY3JiLnJlal9zZW50ID0gdHJ1ZTsKLQotICAgICAgICBsMmNfZmNyX3NlbmRfU19mcmFtZShwX2NjYiwgTDJDQVBfRkNSX1NVUF9SRUosIDApOwotICAgICAgfQotICAgIH0KLSAgICBmaXhlZF9xdWV1ZV9mcmVlKHRlbXBfcSwgTlVMTCk7Ci0KLSAgICAvKiBOb3csIGlmIG5lZWRlZCwgc2VuZCBvbmUgUlIgZm9yIHRoZSB3aG9sZSBoZWxkIHF1ZXVlICovCi0gICAgaWYgKCghcF9jY2ItPmZjcmIucmVqX3NlbnQpICYmICghcF9jY2ItPmZjcmIuc3Jlal9zZW50KSAmJgotICAgICAgICAocF9jY2ItPmZjcmIubmV4dF9zZXFfZXhwZWN0ZWQgIT0gcF9jY2ItPmZjcmIubGFzdF9hY2tfc2VudCkpCi0gICAgICBsMmNfZmNyX3NlbmRfU19mcmFtZShwX2NjYiwgTDJDQVBfRkNSX1NVUF9SUiwgMCk7Ci0gICAgZWxzZSB7Ci0gICAgICBMMkNBUF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAibDJjX2Zjcl9wcm9jX3BkdSgpIG5vdCBzZW5kaW5nIFJSIENJRDogMHglMDR4ICBsb2NhbF9idXN5OiVkICIKLSAgICAgICAgICAicmVqX3NlbnQ6JWQgc3Jlal9zZW50OiVkIEV4cGVjdGVkX1NlcToldSBMYXN0X0FjazoldSIsCi0gICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgMCwgcF9jY2ItPmZjcmIucmVqX3NlbnQsIHBfY2NiLT5mY3JiLnNyZWpfc2VudCwKLSAgICAgICAgICBwX2NjYi0+ZmNyYi5uZXh0X3NlcV9leHBlY3RlZCwgcF9jY2ItPmZjcmIubGFzdF9hY2tfc2VudCk7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgYSB3aW5kb3cgaGFzIG9wZW5lZCwgY2hlY2sgaWYgd2UgY2FuIHNlbmQgYW55IG1vcmUgcGFja2V0cyAqLwotICBpZiAoKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+ZmNyYi5yZXRyYW5zX3EpIHx8Ci0gICAgICAgIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT54bWl0X2hvbGRfcSkpICYmCi0gICAgICAoIXBfY2NiLT5mY3JiLndhaXRfYWNrKSAmJiAoIWwyY19mY3JfaXNfZmxvd19jb250cm9sbGVkKHBfY2NiKSkpIHsKLSAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2xjY19wcm9jX3BkdQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHByb2Nlc3Npbmcgb2YgYQotICogICAgICAgICAgICAgICAgICByZWNlaXZlZCBQRFUgd2hlbiBpbiBMRSBDb2MgZmxvdyBjb250cm9sIG1vZGVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19sY2NfcHJvY19wZHUodEwyQ19DQ0IqIHBfY2NiLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICBDSEVDSyhwX2J1ZiAhPSBOVUxMKTsKLSAgdWludDhfdCogcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0gIHVpbnQxNl90IHNkdV9sZW5ndGg7Ci0gIEJUX0hEUiogcF9kYXRhID0gTlVMTDsKLQotICAvKiBCdWZmZXIgbGVuZ3RoIHNob3VsZCBub3QgZXhjZWVkIGxvY2FsIG1wcyAqLwotICBpZiAocF9idWYtPmxlbiA+IHBfY2NiLT5sb2NhbF9jb25uX2NmZy5tcHMpIHsKLSAgICAvKiBEaXNjYXJkIHRoZSBidWZmZXIgKi8KLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfY2NiLT5pc19maXJzdF9zZWcpIHsKLSAgICBpZiAocF9idWYtPmxlbiA8IHNpemVvZihzZHVfbGVuZ3RoKSkgewotICAgICAgTDJDQVBfVFJBQ0VfRVJST1IoIiVzOiBidWZmZXIgbGVuZ3RoPSVkIHRvbyBzbWFsbC4gTmVlZCBhdCBsZWFzdCAyLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9idWYtPmxlbik7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZygweDUzNGU0NTU0LCAiMTIwNjY1NjE2IiwgLTEsIE5VTEwsIDApOwotICAgICAgLyogRGlzY2FyZCB0aGUgYnVmZmVyICovCi0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFNUUkVBTV9UT19VSU5UMTYoc2R1X2xlbmd0aCwgcCk7Ci0KLSAgICAvKiBDaGVjayB0aGUgU0RVIExlbmd0aCB3aXRoIGxvY2FsIE1UVSBzaXplICovCi0gICAgaWYgKHNkdV9sZW5ndGggPiBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXR1KSB7Ci0gICAgICAvKiBEaXNjYXJkIHRoZSBidWZmZXIgKi8KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwX2J1Zi0+bGVuIC09IHNpemVvZihzZHVfbGVuZ3RoKTsKLSAgICBwX2J1Zi0+b2Zmc2V0ICs9IHNpemVvZihzZHVfbGVuZ3RoKTsKLQotICAgIGlmIChzZHVfbGVuZ3RoIDwgcF9idWYtPmxlbikgewotICAgICAgTDJDQVBfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIHNkdV9sZW5ndGg6ICVkIiwgX19mdW5jX18sIHNkdV9sZW5ndGgpOwotICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coMHg1MzRlNDU1NCwgIjExMjMyMTE4MCIsIC0xLCBOVUxMLCAwKTsKLSAgICAgIC8qIERpc2NhcmQgdGhlIGJ1ZmZlciAqLwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBfZGF0YSA9IChCVF9IRFIqKW9zaV9tYWxsb2MoQlRfSERSX1NJWkUgKyBzZHVfbGVuZ3RoKTsKLSAgICBpZiAocF9kYXRhID09IE5VTEwpIHsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwX2NjYi0+YmxlX3NkdSA9IHBfZGF0YTsKLSAgICBwX2RhdGEtPmxlbiA9IDA7Ci0gICAgcF9jY2ItPmJsZV9zZHVfbGVuZ3RoID0gc2R1X2xlbmd0aDsKLSAgICBMMkNBUF9UUkFDRV9ERUJVRygiJXMgU0RVIExlbmd0aCA9ICVkIiwgX19mdW5jX18sIHNkdV9sZW5ndGgpOwotICAgIHBfZGF0YS0+b2Zmc2V0ID0gMDsKLQotICB9IGVsc2UgewotICAgIHBfZGF0YSA9IHBfY2NiLT5ibGVfc2R1OwotICAgIGlmIChwX2J1Zi0+bGVuID4gKHBfY2NiLT5ibGVfc2R1X2xlbmd0aCAtIHBfZGF0YS0+bGVuKSkgewotICAgICAgTDJDQVBfVFJBQ0VfRVJST1IoIiVzOiBidWZmZXIgbGVuZ3RoPSVkIHRvbyBiaWcuIG1heD0lZC4gRHJvcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9kYXRhLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAocF9jY2ItPmJsZV9zZHVfbGVuZ3RoIC0gcF9kYXRhLT5sZW4pKTsKLSAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKDB4NTM0ZTQ1NTQsICI3NTI5ODY1MiIsIC0xLCBOVUxMLCAwKTsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgICAgLyogVGhyb3cgYXdheSBhbGwgcGVuZGluZyBmcmFnbWVudHMgYW5kIGRpc2Nvbm5lY3RzICovCi0gICAgICBwX2NjYi0+aXNfZmlyc3Rfc2VnID0gdHJ1ZTsKLSAgICAgIG9zaV9mcmVlKHBfY2NiLT5ibGVfc2R1KTsKLSAgICAgIHBfY2NiLT5ibGVfc2R1ID0gTlVMTDsKLSAgICAgIHBfY2NiLT5ibGVfc2R1X2xlbmd0aCA9IDA7Ci0gICAgICBsMmN1X2Rpc2Nvbm5lY3RfY2hubChwX2NjYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgbWVtY3B5KCh1aW50OF90KikocF9kYXRhICsgMSkgKyBwX2RhdGEtPm9mZnNldCArIHBfZGF0YS0+bGVuLAotICAgICAgICAgKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwgcF9idWYtPmxlbik7Ci0gIHBfZGF0YS0+bGVuICs9IHBfYnVmLT5sZW47Ci0gIHAgPSAodWludDhfdCopKHBfZGF0YSArIDEpICsgcF9kYXRhLT5vZmZzZXQ7Ci0gIGlmIChwX2RhdGEtPmxlbiA9PSBwX2NjYi0+YmxlX3NkdV9sZW5ndGgpIHsKLSAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9EQVRBLCBwX2RhdGEpOwotICAgIHBfY2NiLT5pc19maXJzdF9zZWcgPSB0cnVlOwotICAgIHBfY2NiLT5ibGVfc2R1ID0gTlVMTDsKLSAgICBwX2NjYi0+YmxlX3NkdV9sZW5ndGggPSAwOwotICB9IGVsc2UgaWYgKHBfZGF0YS0+bGVuIDwgcF9jY2ItPmJsZV9zZHVfbGVuZ3RoKSB7Ci0gICAgcF9jY2ItPmlzX2ZpcnN0X3NlZyA9IGZhbHNlOwotICB9Ci0KLSAgb3NpX2ZyZWUocF9idWYpOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX3Byb2NfdG91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGEgdGltZW91dC4gV2Ugc2hvdWxkIGJlIGluIGVycm9yIHJlY292ZXJ5IHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19mY3JfcHJvY190b3V0KHRMMkNfQ0NCKiBwX2NjYikgewotICBDSEVDSyhwX2NjYiAhPSBOVUxMKTsKLSAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAibDJjX2Zjcl9wcm9jX3RvdXQ6ICBDSUQ6IDB4JTA0eCAgbnVtX3RyaWVzOiAldSAobWF4OiAldSkgIHdhaXRfYWNrOiAldSAgIgotICAgICAgImFja19xX2NvdW50OiAldSIsCi0gICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2NjYi0+ZmNyYi5udW1fdHJpZXMsIHBfY2NiLT5wZWVyX2NmZy5mY3IubWF4X3RyYW5zbWl0LAotICAgICAgcF9jY2ItPmZjcmIud2FpdF9hY2ssIGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NjYi0+ZmNyYi53YWl0aW5nX2Zvcl9hY2tfcSkpOwotCi0gIGlmICgocF9jY2ItPnBlZXJfY2ZnLmZjci5tYXhfdHJhbnNtaXQgIT0gMCkgJiYKLSAgICAgICgrK3BfY2NiLT5mY3JiLm51bV90cmllcyA+IHBfY2NiLT5wZWVyX2NmZy5mY3IubWF4X3RyYW5zbWl0KSkgewotICAgIGwyY3VfZGlzY29ubmVjdF9jaG5sKHBfY2NiKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoIXBfY2NiLT5mY3JiLnNyZWpfc2VudCAmJiAhcF9jY2ItPmZjcmIucmVqX3NlbnQpIHsKLSAgICAgIGwyY19mY3Jfc2VuZF9TX2ZyYW1lKHBfY2NiLCBMMkNBUF9GQ1JfU1VQX1JSLCBMMkNBUF9GQ1JfUF9CSVQpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2Zjcl9wcm9jX2Fja190b3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZW5kIFJSL1JOUiBpZiB3ZSBoYXZlIG5vdCBhY2tlZCBJIGZyYW1lCi0gKgotICogUmV0dXJucyAgICAgICAgICAtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2Zjcl9wcm9jX2Fja190b3V0KHRMMkNfQ0NCKiBwX2NjYikgewotICBDSEVDSyhwX2NjYiAhPSBOVUxMKTsKLSAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAibDJjX2Zjcl9wcm9jX2Fja190b3V0OiAgQ0lEOiAweCUwNHggU3RhdGU6ICV1ICBXYWNrOiV1ICBScTolZCAgQWNrZWQ6JWQiLAotICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgcF9jY2ItPmNobmxfc3RhdGUsIHBfY2NiLT5mY3JiLndhaXRfYWNrLAotICAgICAgcF9jY2ItPmZjcmIubmV4dF9zZXFfZXhwZWN0ZWQsIHBfY2NiLT5mY3JiLmxhc3RfYWNrX3NlbnQpOwotCi0gIGlmICgocF9jY2ItPmNobmxfc3RhdGUgPT0gQ1NUX09QRU4pICYmICghcF9jY2ItPmZjcmIud2FpdF9hY2spICYmCi0gICAgICAocF9jY2ItPmZjcmIubGFzdF9hY2tfc2VudCAhPSBwX2NjYi0+ZmNyYi5uZXh0X3NlcV9leHBlY3RlZCkpIHsKLSAgICBsMmNfZmNyX3NlbmRfU19mcmFtZShwX2NjYiwgTDJDQVBfRkNSX1NVUF9SUiwgMCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHByb2Nlc3NfcmVxc2VxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgcmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIC0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgcHJvY2Vzc19yZXFzZXEodEwyQ19DQ0IqIHBfY2NiLCB1aW50MTZfdCBjdHJsX3dvcmQpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0gIHRMMkNfRkNSQiogcF9mY3JiID0gJnBfY2NiLT5mY3JiOwotICB1aW50OF90IHJlcV9zZXEsIG51bV9idWZzX2Fja2VkLCB4eDsKLSAgdWludDE2X3QgbHM7Ci0gIHVpbnQxNl90IGZ1bGxfc2R1c194bWl0dGVkOwotCi0gIC8qIFJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyIGRvZXMgbm90IGFjayBhbnl0aGluZyBmb3IgU1JFSiB3aXRoIFAtYml0IHNldCB0bwotICAgKiB6ZXJvICovCi0gIGlmICgoY3RybF93b3JkICYgTDJDQVBfRkNSX1NfRlJBTUVfQklUKSAmJgotICAgICAgKChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfU1VQX0JJVFMpID09Ci0gICAgICAgKEwyQ0FQX0ZDUl9TVVBfU1JFSiA8PCBMMkNBUF9GQ1JfU1VQX1NISUZUKSkgJiYKLSAgICAgICgoY3RybF93b3JkICYgTDJDQVBfRkNSX1BfQklUKSA9PSAwKSkgewotICAgIC8qIElmIGFueXRoaW5nIHN0aWxsIHdhaXRpbmcgZm9yIGFjaywgcmVzdGFydCB0aGUgdGltZXIgaWYgaXQgd2FzIHN0b3BwZWQgKi8KLSAgICBpZiAoIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfZmNyYi0+d2FpdGluZ19mb3JfYWNrX3EpKQotICAgICAgbDJjX2Zjcl9zdGFydF90aW1lcihwX2NjYik7Ci0KLSAgICByZXR1cm4gKHRydWUpOwotICB9Ci0KLSAgLyogRXh0cmFjdCB0aGUgcmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSB0aGUgY29udHJvbCB3b3JkICovCi0gIHJlcV9zZXEgPQotICAgICAgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9SRVFfU0VRX0JJVFMpID4+IEwyQ0FQX0ZDUl9SRVFfU0VRX0JJVFNfU0hJRlQ7Ci0KLSAgbnVtX2J1ZnNfYWNrZWQgPSAocmVxX3NlcSAtIHBfZmNyYi0+bGFzdF9yeF9hY2spICYgTDJDQVBfRkNSX1NFUV9NT0RVTE87Ci0KLSAgLyogVmVyaWZ5IHRoZSByZXF1ZXN0IHNlcXVlbmNlIGlzIGluIHJhbmdlIGJlZm9yZSBwcm9jZWVkaW5nICovCi0gIGlmIChudW1fYnVmc19hY2tlZCA+IGZpeGVkX3F1ZXVlX2xlbmd0aChwX2ZjcmItPndhaXRpbmdfZm9yX2Fja19xKSkgewotICAgIC8qIFRoZSBjaGFubmVsIGlzIGNsb3NlZCBpZiBSZXFTZXEgaXMgbm90IGluIHJhbmdlICovCi0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIkwyQ0FQIGVSVE0gRnJhbWUgQkFEIFJlcV9TZXEgLSBjdHJsX3dvcmQ6IDB4JTA0eCAgcmVxX3NlcSAweCUwMnggICIKLSAgICAgICAgImxhc3RfcnhfYWNrOiAweCUwMnggIFFDb3VudDogJXUiLAotICAgICAgICBjdHJsX3dvcmQsIHJlcV9zZXEsIHBfZmNyYi0+bGFzdF9yeF9hY2ssCi0gICAgICAgIGZpeGVkX3F1ZXVlX2xlbmd0aChwX2ZjcmItPndhaXRpbmdfZm9yX2Fja19xKSk7Ci0KLSAgICBsMmN1X2Rpc2Nvbm5lY3RfY2hubChwX2NjYik7Ci0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIH0KLQotICBwX2ZjcmItPmxhc3RfcnhfYWNrID0gcmVxX3NlcTsKLQotICAvKiBOb3cgd2UgY2FuIHJlbGVhc2UgYWxsIGFja25vd2xlZGdlZCBmcmFtZXMsIGFuZCByZXN0YXJ0IHRoZSByZXRyYW5zbWlzc2lvbgotICAgKiB0aW1lciBpZiBuZWVkZWQgKi8KLSAgaWYgKG51bV9idWZzX2Fja2VkICE9IDApIHsKLSAgICBwX2ZjcmItPm51bV90cmllcyA9IDA7Ci0gICAgZnVsbF9zZHVzX3htaXR0ZWQgPSAwOwotCi0gICAgZm9yICh4eCA9IDA7IHh4IDwgbnVtX2J1ZnNfYWNrZWQ7IHh4KyspIHsKLSAgICAgIEJUX0hEUiogcF90bXAgPQotICAgICAgICAgIChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfZmNyYi0+d2FpdGluZ19mb3JfYWNrX3EpOwotICAgICAgbHMgPSBwX3RtcC0+bGF5ZXJfc3BlY2lmaWMgJiBMMkNBUF9GQ1JfU0FSX0JJVFM7Ci0KLSAgICAgIGlmICgobHMgPT0gTDJDQVBfRkNSX1VOU0VHX1NEVSkgfHwgKGxzID09IEwyQ0FQX0ZDUl9FTkRfU0RVKSkKLSAgICAgICAgZnVsbF9zZHVzX3htaXR0ZWQrKzsKLQotICAgICAgb3NpX2ZyZWUocF90bXApOwotICAgIH0KLQotICAgIC8qIElmIHdlIGFyZSBzdGlsbCBpbiBhIHdhaXRfYWNrIHN0YXRlLCBkbyBub3QgbWVzcyB3aXRoIHRoZSB0aW1lciAqLwotICAgIGlmICghcF9jY2ItPmZjcmIud2FpdF9hY2spIGwyY19mY3Jfc3RvcF90aW1lcihwX2NjYik7Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNhbGwgdGhlICJwYWNrZXRfc2VudCIgY2FsbGJhY2sgKi8KLSAgICBpZiAoKHBfY2NiLT5wX3JjYikgJiYgKHBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX1R4Q29tcGxldGVfQ2IpICYmCi0gICAgICAgIChmdWxsX3NkdXNfeG1pdHRlZCkpIHsKLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZVJUTSwgaWYgYWxsIHBhY2tldHMgc2VudCwgc2VuZCAweEZGRkYgKi8KLSAgICAgIGlmIChmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2ZjcmItPndhaXRpbmdfZm9yX2Fja19xKSAmJgotICAgICAgICAgIGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT54bWl0X2hvbGRfcSkpIHsKLSAgICAgICAgZnVsbF9zZHVzX3htaXR0ZWQgPSAweEZGRkY7Ci0gICAgICB9Ci0KLSAgICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfVHhDb21wbGV0ZV9DYikocF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9zZHVzX3htaXR0ZWQpOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGFueXRoaW5nIHN0aWxsIHdhaXRpbmcgZm9yIGFjaywgcmVzdGFydCB0aGUgdGltZXIgaWYgaXQgd2FzIHN0b3BwZWQgKi8KLSAgaWYgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2ZjcmItPndhaXRpbmdfZm9yX2Fja19xKSkKLSAgICBsMmNfZmNyX3N0YXJ0X3RpbWVyKHBfY2NiKTsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHByb2Nlc3Nfc19mcmFtZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHJvY2VzcyBhbiBTIGZyYW1lCi0gKgotICogUmV0dXJucyAgICAgICAgICAtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc19mcmFtZSh0TDJDX0NDQiogcF9jY2IsIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY3RybF93b3JkKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICBDSEVDSyhwX2J1ZiAhPSBOVUxMKTsKLQotICB0TDJDX0ZDUkIqIHBfZmNyYiA9ICZwX2NjYi0+ZmNyYjsKLSAgdWludDE2X3Qgc19mcmFtZV90eXBlID0KLSAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfU1VQX0JJVFMpID4+IEwyQ0FQX0ZDUl9TVVBfU0hJRlQ7Ci0gIGJvb2wgcmVtb3RlX3dhc19idXN5OwotICBib29sIGFsbF9vayA9IHRydWU7Ci0KLSAgaWYgKHBfYnVmLT5sZW4gIT0gMCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkluY29ycmVjdCBTLWZyYW1lIExlbmd0aCAoJWQpIiwgcF9idWYtPmxlbik7Ci0gIH0KLQotICBMMkNBUF9UUkFDRV9ERUJVRygicHJvY2Vzc19zX2ZyYW1lIGN0cmxfd29yZCAweCUwNHggZmNyYl9yZW1vdGVfYnVzeTolZCIsCi0gICAgICAgICAgICAgICAgICAgIGN0cmxfd29yZCwgcF9mY3JiLT5yZW1vdGVfYnVzeSk7Ci0KLSAgaWYgKGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9QX0JJVCkgewotICAgIHBfZmNyYi0+cmVqX3NlbnQgPSBmYWxzZTsgIC8qIEFmdGVyIGNoZWNrcG9pbnQsIHdlIGNhbiBzZW5kIGFub2hlciBSRUogKi8KLSAgICBwX2ZjcmItPnNlbmRfZl9yc3AgPSB0cnVlOyAvKiBTZXQgYSBmbGFnIGluIGNhc2UgYW4gSS1mcmFtZSBpcyBwZW5kaW5nICovCi0gIH0KLQotICBzd2l0Y2ggKHNfZnJhbWVfdHlwZSkgewotICAgIGNhc2UgTDJDQVBfRkNSX1NVUF9SUjoKLSAgICAgIHJlbW90ZV93YXNfYnVzeSA9IHBfZmNyYi0+cmVtb3RlX2J1c3k7Ci0gICAgICBwX2ZjcmItPnJlbW90ZV9idXN5ID0gZmFsc2U7Ci0KLSAgICAgIGlmICgoY3RybF93b3JkICYgTDJDQVBfRkNSX0ZfQklUKSB8fCAocmVtb3RlX3dhc19idXN5KSkKLSAgICAgICAgYWxsX29rID0gcmV0cmFuc21pdF9pX2ZyYW1lcyhwX2NjYiwgTDJDX0ZDUl9SRVRYX0FMTF9QS1RTKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMMkNBUF9GQ1JfU1VQX1JFSjoKLSAgICAgIHBfZmNyYi0+cmVtb3RlX2J1c3kgPSBmYWxzZTsKLSAgICAgIGFsbF9vayA9IHJldHJhbnNtaXRfaV9mcmFtZXMocF9jY2IsIEwyQ19GQ1JfUkVUWF9BTExfUEtUUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDQVBfRkNSX1NVUF9STlI6Ci0gICAgICBwX2ZjcmItPnJlbW90ZV9idXN5ID0gdHJ1ZTsKLSAgICAgIGwyY19mY3Jfc3RvcF90aW1lcihwX2NjYik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTDJDQVBfRkNSX1NVUF9TUkVKOgotICAgICAgcF9mY3JiLT5yZW1vdGVfYnVzeSA9IGZhbHNlOwotICAgICAgYWxsX29rID0gcmV0cmFuc21pdF9pX2ZyYW1lcygKLSAgICAgICAgICBwX2NjYiwgKHVpbnQ4X3QpKChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfUkVRX1NFUV9CSVRTKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfRkNSX1JFUV9TRVFfQklUU19TSElGVCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoYWxsX29rKSB7Ci0gICAgLyogSWYgcG9sbGVkLCB3ZSBuZWVkIHRvIHJlc3BvbmQgd2l0aCBGLWJpdC4gTm90ZSwgd2UgbWF5IGhhdmUgc2VudCBhCi0gICAgICogSS1mcmFtZSB3aXRoIHRoZSBGLWJpdCAqLwotICAgIGlmIChwX2ZjcmItPnNlbmRfZl9yc3ApIHsKLSAgICAgIGlmIChwX2ZjcmItPnNyZWpfc2VudCkKLSAgICAgICAgbDJjX2Zjcl9zZW5kX1NfZnJhbWUocF9jY2IsIEwyQ0FQX0ZDUl9TVVBfU1JFSiwgTDJDQVBfRkNSX0ZfQklUKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbDJjX2Zjcl9zZW5kX1NfZnJhbWUocF9jY2IsIEwyQ0FQX0ZDUl9TVVBfUlIsIEwyQ0FQX0ZDUl9GX0JJVCk7Ci0KLSAgICAgIHBfZmNyYi0+c2VuZF9mX3JzcCA9IGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMMkNBUF9UUkFDRV9ERUJVRygicHJvY2Vzc19zX2ZyYW1lIGhpdF9tYXhfcmV0cmllcyIpOwotICB9Ci0KLSAgb3NpX2ZyZWUocF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcHJvY2Vzc19pX2ZyYW1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIGFuIEkgZnJhbWUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIC0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcHJvY2Vzc19pX2ZyYW1lKHRMMkNfQ0NCKiBwX2NjYiwgQlRfSERSKiBwX2J1ZiwgdWludDE2X3QgY3RybF93b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVsYXlfYWNrKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICBDSEVDSyhwX2J1ZiAhPSBOVUxMKTsKLQotICB0TDJDX0ZDUkIqIHBfZmNyYiA9ICZwX2NjYi0+ZmNyYjsKLSAgdWludDhfdCB0eF9zZXEsIG51bV9sb3N0LCBudW1fdG9fYWNrLCBuZXh0X3NyZWo7Ci0KLSAgLyogSWYgd2Ugd2VyZSBkb2luZyBjaGVja3BvaW50IHJlY292ZXJ5LCBmaXJzdCByZXRyYW5zbWl0IGFsbCB1bmFja2VkIEktZnJhbWVzCi0gICAqLwotICBpZiAoY3RybF93b3JkICYgTDJDQVBfRkNSX0ZfQklUKSB7Ci0gICAgaWYgKCFyZXRyYW5zbWl0X2lfZnJhbWVzKHBfY2NiLCBMMkNfRkNSX1JFVFhfQUxMX1BLVFMpKSB7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLyogRXh0cmFjdCB0aGUgc2VxdWVuY2UgbnVtYmVyICovCi0gIHR4X3NlcSA9IChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfVFhfU0VRX0JJVFMpID4+IEwyQ0FQX0ZDUl9UWF9TRVFfQklUU19TSElGVDsKLQotICAvKiBDaGVjayBpZiB0eC1zZXF1ZW5jZSBpcyB0aGUgZXhwZWN0ZWQgb25lICovCi0gIGlmICh0eF9zZXEgIT0gcF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCkgewotICAgIG51bV9sb3N0ID0gKHR4X3NlcSAtIHBfZmNyYi0+bmV4dF9zZXFfZXhwZWN0ZWQpICYgTDJDQVBfRkNSX1NFUV9NT0RVTE87Ci0KLSAgICAvKiBJcyB0aGUgZnJhbWUgYSBkdXBsaWNhdGUgPyBJZiBzbywganVzdCBkcm9wIGl0ICovCi0gICAgaWYgKG51bV9sb3N0ID49IHBfY2NiLT5vdXJfY2ZnLmZjci50eF93aW5fc3opIHsKLSAgICAgIC8qIER1cGxpY2F0ZSAtIHNpbXBseSBkcm9wIGl0ICovCi0gICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICJwcm9jZXNzX2lfZnJhbWUoKSBEcm9wcGluZyBEdXBsaWNhdGUgRnJhbWUgdHhfc2VxOiV1ICBFeHBlY3RlZFR4U2VxICIKLSAgICAgICAgICAiJXUiLAotICAgICAgICAgIHR4X3NlcSwgcF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCk7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgInByb2Nlc3NfaV9mcmFtZSgpIENJRDogMHglMDR4ICBMb3N0OiAldSAgdHhfc2VxOiV1ICBFeHBUeFNlcSAldSAgIgotICAgICAgICAgICJSZWo6ICV1ICBTUmVqOiAldSIsCi0gICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgbnVtX2xvc3QsIHR4X3NlcSwgcF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCwKLSAgICAgICAgICBwX2ZjcmItPnJlal9zZW50LCBwX2ZjcmItPnNyZWpfc2VudCk7Ci0KLSAgICAgIGlmIChwX2ZjcmItPnNyZWpfc2VudCkgewotICAgICAgICAvKiBJZiBTUkVKIHNlbnQsIHNhdmUgdGhlIGZyYW1lIGZvciBsYXRlciBwcm9jZXNzaW5nIGFzIGxvbmcgYXMgaXQgaXMgaW4KLSAgICAgICAgICogc2VxdWVuY2UgKi8KLSAgICAgICAgbmV4dF9zcmVqID0KLSAgICAgICAgICAgICgoKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChwX2ZjcmItPnNyZWpfcmN2X2hvbGRfcSkpCi0gICAgICAgICAgICAgICAgIC0+bGF5ZXJfc3BlY2lmaWMgKwotICAgICAgICAgICAgIDEpICYKLSAgICAgICAgICAgIEwyQ0FQX0ZDUl9TRVFfTU9EVUxPOwotCi0gICAgICAgIGlmICgodHhfc2VxID09IG5leHRfc3JlaikgJiYKLSAgICAgICAgICAgIChmaXhlZF9xdWV1ZV9sZW5ndGgocF9mY3JiLT5zcmVqX3Jjdl9ob2xkX3EpIDwKLSAgICAgICAgICAgICBwX2NjYi0+b3VyX2NmZy5mY3IudHhfd2luX3N6KSkgewotICAgICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgICAicHJvY2Vzc19pX2ZyYW1lKCkgTG9zdDogJXUgIHR4X3NlcToldSAgRXhwVHhTZXEgJXUgIFJlajogJXUgICIKLSAgICAgICAgICAgICAgIlNSZWoxIiwKLSAgICAgICAgICAgICAgbnVtX2xvc3QsIHR4X3NlcSwgcF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCwgcF9mY3JiLT5yZWpfc2VudCk7Ci0KLSAgICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSB0eF9zZXE7Ci0gICAgICAgICAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX2ZjcmItPnNyZWpfcmN2X2hvbGRfcSwgcF9idWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAgICJwcm9jZXNzX2lfZnJhbWUoKSBDSUQ6IDB4JTA0eCAgZnJhbWUgZHJvcHBlZCBpbiBTcmVqIFNlbnQgIgotICAgICAgICAgICAgICAibmV4dF9zcmVqOiV1ICBob2xkX3EuY291bnQ6JXUgIHdpbl9zejoldSIsCi0gICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIG5leHRfc3JlaiwKLSAgICAgICAgICAgICAgZml4ZWRfcXVldWVfbGVuZ3RoKHBfZmNyYi0+c3Jlal9yY3ZfaG9sZF9xKSwKLSAgICAgICAgICAgICAgcF9jY2ItPm91cl9jZmcuZmNyLnR4X3dpbl9zeik7Ci0KLSAgICAgICAgICBwX2ZjcmItPnJlal9hZnRlcl9zcmVqID0gdHJ1ZTsKLSAgICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocF9mY3JiLT5yZWpfc2VudCkgewotICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAgICAgInByb2Nlc3NfaV9mcmFtZSgpIENJRDogMHglMDR4ICBMb3N0OiAldSAgdHhfc2VxOiV1ICBFeHBUeFNlcSAldSAgIgotICAgICAgICAgICAgIlJlajogMSAgU1JlajogJXUiLAotICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgbnVtX2xvc3QsIHR4X3NlcSwgcF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCwKLSAgICAgICAgICAgIHBfZmNyYi0+c3Jlal9zZW50KTsKLQotICAgICAgICAvKiBJZiBSRUogc2VudCwganVzdCBkcm9wIHRoZSBmcmFtZSAqLwotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMMkNBUF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICJwcm9jZXNzX2lfZnJhbWUoKSBDSUQ6IDB4JTA0eCAgdHhfc2VxOiV1ICBFeHBUeFNlcSAldSAgUmVqOiAldSIsCi0gICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCB0eF9zZXEsIHBfZmNyYi0+bmV4dF9zZXFfZXhwZWN0ZWQsCi0gICAgICAgICAgICBwX2ZjcmItPnJlal9zZW50KTsKLQotICAgICAgICAvKiBJZiBvbmx5IG9uZSBsb3N0LCB3ZSB3aWxsIHNlbmQgU1JFSiwgb3RoZXJ3aXNlIHdlIHdpbGwgc2VuZCBSRUogKi8KLSAgICAgICAgaWYgKG51bV9sb3N0ID4gMSkgewotICAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgICAgICBwX2ZjcmItPnJlal9zZW50ID0gdHJ1ZTsKLSAgICAgICAgICBsMmNfZmNyX3NlbmRfU19mcmFtZShwX2NjYiwgTDJDQVBfRkNSX1NVUF9SRUosIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9mY3JiLT5zcmVqX3Jjdl9ob2xkX3EpKSB7Ci0gICAgICAgICAgICBMMkNBUF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICAgICAicHJvY2Vzc19pX2ZyYW1lKCkgQ0lEOiAweCUwNHggIHNlbmRpbmcgU1JFSiB0eF9zZXE6JWQgIgotICAgICAgICAgICAgICAgICJob2xkX3EuY291bnQ6JXUiLAotICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIHR4X3NlcSwKLSAgICAgICAgICAgICAgICBmaXhlZF9xdWV1ZV9sZW5ndGgocF9mY3JiLT5zcmVqX3Jjdl9ob2xkX3EpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gdHhfc2VxOwotICAgICAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUocF9mY3JiLT5zcmVqX3Jjdl9ob2xkX3EsIHBfYnVmKTsKLSAgICAgICAgICBwX2ZjcmItPnNyZWpfc2VudCA9IHRydWU7Ci0gICAgICAgICAgbDJjX2Zjcl9zZW5kX1NfZnJhbWUocF9jY2IsIEwyQ0FQX0ZDUl9TVVBfU1JFSiwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYWxhcm1fY2FuY2VsKHBfY2NiLT5mY3JiLmFja190aW1lcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFNlcSBudW1iZXIgaXMgdGhlIG5leHQgZXhwZWN0ZWQuIENsZWFyIHBvc3NpYmxlIHJlamVjdCBleGNlcHRpb24gaW4gY2FzZSBpdAotICAgKiBvY2N1cmVkICovCi0gIHBfZmNyYi0+cmVqX3NlbnQgPSBwX2ZjcmItPnNyZWpfc2VudCA9IGZhbHNlOwotCi0gIC8qIEFkanVzdCB0aGUgbmV4dF9zZXEsIHNvIHRoYXQgaWYgdGhlIHVwcGVyIGxheWVyIHNlbmRzIG1vcmUgZGF0YSBpbiB0aGUKLSAgICAgY2FsbGJhY2sKLSAgICAgY29udGV4dCwgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIGFja2VkIGJ5IGFuIEktZnJhbWUuICovCi0gIHBfZmNyYi0+bmV4dF9zZXFfZXhwZWN0ZWQgPSAodHhfc2VxICsgMSkgJiBMMkNBUF9GQ1JfU0VRX01PRFVMTzsKLQotICAvKiBJZiBhbnkgU0FSIHByb2JsZW0gaW4gZVJUTSBtb2RlLCBzcGVjIHNheXMgZGlzY29ubmVjdC4gKi8KLSAgaWYgKCFkb19zYXJfcmVhc3NlbWJseShwX2NjYiwgcF9idWYsIGN0cmxfd29yZCkpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJwcm9jZXNzX2lfZnJhbWUoKSBDSUQ6IDB4JTA0eCAgcmVhc3NlbWJseSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gICAgbDJjdV9kaXNjb25uZWN0X2NobmwocF9jY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJSIG9wdGltaXphdGlvbiAtIGlmIHBlZXIgY2FuIHN0aWxsIHNlbmQgdXMgbW9yZSwgdGhlbiBzdGFydCBhbiBBQ0sgdGltZXIKLSAgICovCi0gIG51bV90b19hY2sgPSAocF9mY3JiLT5uZXh0X3NlcV9leHBlY3RlZCAtIHBfZmNyYi0+bGFzdF9hY2tfc2VudCkgJgotICAgICAgICAgICAgICAgTDJDQVBfRkNSX1NFUV9NT0RVTE87Ci0KLSAgaWYgKG51bV90b19hY2sgPCBwX2NjYi0+ZmNyYi5tYXhfaGVsZF9hY2tzKSBkZWxheV9hY2sgPSB0cnVlOwotCi0gIC8qIFdlIHNob3VsZCBuZXZlIG5ldmVyIGFjayBmcmFtZSBpZiB3ZSBhcmUgbm90IGluIE9QRU4gc3RhdGUgKi8KLSAgaWYgKChudW1fdG9fYWNrICE9IDApICYmIHBfY2NiLT5pbl91c2UgJiYgKHBfY2NiLT5jaG5sX3N0YXRlID09IENTVF9PUEVOKSkgewotICAgIC8qIElmIG5vIGZyYW1lcyBhcmUgYXdhaXRpbmcgdHJhbnNtaXNzaW9uIG9yIGFyZSBoZWxkLCBzZW5kIGFuIFJSIG9yIFJOUgotICAgICAqIFMtZnJhbWUgZm9yIGFjayAqLwotICAgIGlmIChkZWxheV9hY2spIHsKLSAgICAgIC8qIElmIGl0IGlzIHRoZSBmaXJzdCBJIGZyYW1lIHdlIGRpZCBub3QgYWNrLCBzdGFydCBhY2sgdGltZXIgKi8KLSAgICAgIGlmICghYWxhcm1faXNfc2NoZWR1bGVkKHBfY2NiLT5mY3JiLmFja190aW1lcikpIHsKLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5mY3JiLmFja190aW1lciwgTDJDQVBfRkNSX0FDS19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2ZjcmJfYWNrX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+eG1pdF9ob2xkX3EpIHx8Ci0gICAgICAgICAgICAgICAgbDJjX2Zjcl9pc19mbG93X2NvbnRyb2xsZWQocF9jY2IpKSAmJgotICAgICAgICAgICAgICAgZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPmZjcmIuc3Jlal9yY3ZfaG9sZF9xKSkgewotICAgICAgbDJjX2Zjcl9zZW5kX1NfZnJhbWUocF9jY2IsIEwyQ0FQX0ZDUl9TVVBfUlIsIDApOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZG9fc2FyX3JlYXNzZW1ibHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgU0FSIGJpdHMgYW5kIHJlLWFzc2VtYmxlIGZyYW1lCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFsbCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBkb19zYXJfcmVhc3NlbWJseSh0TDJDX0NDQiogcF9jY2IsIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjdHJsX3dvcmQpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0gIENIRUNLKHBfYnVmICE9IE5VTEwpOwotCi0gIHRMMkNfRkNSQiogcF9mY3JiID0gJnBfY2NiLT5mY3JiOwotICB1aW50MTZfdCBzYXJfdHlwZSA9IGN0cmxfd29yZCAmIEwyQ0FQX0ZDUl9TRUdfQklUUzsKLSAgYm9vbCBwYWNrZXRfb2sgPSB0cnVlOwotICB1aW50OF90KiBwOwotCi0gIC8qIENoZWNrIGlmIHRoZSBTQVIgc3RhdGUgaXMgY29ycmVjdCAqLwotICBpZiAoKHNhcl90eXBlID09IEwyQ0FQX0ZDUl9VTlNFR19TRFUpIHx8IChzYXJfdHlwZSA9PSBMMkNBUF9GQ1JfU1RBUlRfU0RVKSkgewotICAgIGlmIChwX2ZjcmItPnBfcnhfc2R1ICE9IE5VTEwpIHsKLSAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgIlNBUiAtIGdvdCB1bmV4cGVjdGVkIHVuc2VnbWVudGVkIG9yIHN0YXJ0IFNEVSAgRXhwZWN0ZWQgbGVuOiAldSAgIgotICAgICAgICAgICJHb3Qgc28gZmFyOiAldSIsCi0gICAgICAgICAgcF9mY3JiLT5yeF9zZHVfbGVuLCBwX2ZjcmItPnBfcnhfc2R1LT5sZW4pOwotCi0gICAgICBwYWNrZXRfb2sgPSBmYWxzZTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCi0gICAgaWYgKChzYXJfdHlwZSA9PSBMMkNBUF9GQ1JfU1RBUlRfU0RVKSAmJgotICAgICAgICAocF9idWYtPmxlbiA8IEwyQ0FQX1NEVV9MRU5fT1ZFUkhFQUQpKSB7Ci0gICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJTQVIgc3RhcnQgcGFja2V0IHRvbyBzaG9ydDogJXUiLCBwX2J1Zi0+bGVuKTsKLSAgICAgIHBhY2tldF9vayA9IGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAocF9mY3JiLT5wX3J4X3NkdSA9PSBOVUxMKSB7Ci0gICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJTQVIgLSBnb3QgdW5leHBlY3RlZCBjb250IG9yIGVuZCBTRFUiKTsKLSAgICAgIHBhY2tldF9vayA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmICgocGFja2V0X29rKSAmJiAoc2FyX3R5cGUgIT0gTDJDQVBfRkNSX1VOU0VHX1NEVSkpIHsKLSAgICBwID0gKCh1aW50OF90KikocF9idWYgKyAxKSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICAgLyogRm9yIHN0YXJ0IFNEVSBwYWNrZXQsIGV4dHJhY3QgdGhlIFNEVSBsZW5ndGggKi8KLSAgICBpZiAoc2FyX3R5cGUgPT0gTDJDQVBfRkNSX1NUQVJUX1NEVSkgewotICAgICAgLyogR2V0IHRoZSBTRFUgbGVuZ3RoICovCi0gICAgICBTVFJFQU1fVE9fVUlOVDE2KHBfZmNyYi0+cnhfc2R1X2xlbiwgcCk7Ci0gICAgICBwX2J1Zi0+b2Zmc2V0ICs9IDI7Ci0gICAgICBwX2J1Zi0+bGVuIC09IDI7Ci0KLSAgICAgIGlmIChwX2ZjcmItPnJ4X3NkdV9sZW4gPiBwX2NjYi0+bWF4X3J4X210dSkgewotICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJTQVIgLSBTRFUgbGVuOiAldSAgbGFyZ2VyIHRoYW4gTVRVOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mY3JiLT5yeF9zZHVfbGVuLCBwX2NjYi0+bWF4X3J4X210dSk7Ci0gICAgICAgIHBhY2tldF9vayA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9mY3JiLT5wX3J4X3NkdSA9IChCVF9IRFIqKW9zaV9tYWxsb2MoCi0gICAgICAgICAgICBCVF9IRFJfU0laRSArIE9CWF9CVUZfTUlOX09GRlNFVCArIHBfZmNyYi0+cnhfc2R1X2xlbik7Ci0gICAgICAgIHBfZmNyYi0+cF9yeF9zZHUtPm9mZnNldCA9IE9CWF9CVUZfTUlOX09GRlNFVDsKLSAgICAgICAgcF9mY3JiLT5wX3J4X3NkdS0+bGVuID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGFja2V0X29rKSB7Ci0gICAgICBpZiAoKHBfZmNyYi0+cF9yeF9zZHUtPmxlbiArIHBfYnVmLT5sZW4pID4gcF9mY3JiLT5yeF9zZHVfbGVuKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIlNBUiAtIFNEVSBsZW4gZXhjZWVkZWQgIFR5cGU6ICV1ICAgTGVuZ3RoczogJXUgJXUgJXUiLCBzYXJfdHlwZSwKLSAgICAgICAgICAgIHBfZmNyYi0+cF9yeF9zZHUtPmxlbiwgcF9idWYtPmxlbiwgcF9mY3JiLT5yeF9zZHVfbGVuKTsKLSAgICAgICAgcGFja2V0X29rID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKChzYXJfdHlwZSA9PSBMMkNBUF9GQ1JfRU5EX1NEVSkgJiYKLSAgICAgICAgICAgICAgICAgKChwX2ZjcmItPnBfcnhfc2R1LT5sZW4gKyBwX2J1Zi0+bGVuKSAhPSBwX2ZjcmItPnJ4X3NkdV9sZW4pKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIlNBUiAtIFNEVSBlbmQgcmN2ZCBidXQgU0RVIGluY29tcGxldGU6ICV1ICV1ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ZjcmItPnBfcnhfc2R1LT5sZW4sIHBfYnVmLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mY3JiLT5yeF9zZHVfbGVuKTsKLSAgICAgICAgcGFja2V0X29rID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtZW1jcHkoKCh1aW50OF90KikocF9mY3JiLT5wX3J4X3NkdSArIDEpKSArIHBfZmNyYi0+cF9yeF9zZHUtPm9mZnNldCArCi0gICAgICAgICAgICAgICAgICAgcF9mY3JiLT5wX3J4X3NkdS0+bGVuLAotICAgICAgICAgICAgICAgcCwgcF9idWYtPmxlbik7Ci0KLSAgICAgICAgcF9mY3JiLT5wX3J4X3NkdS0+bGVuICs9IHBfYnVmLT5sZW47Ci0KLSAgICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgICBwX2J1ZiA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKHNhcl90eXBlID09IEwyQ0FQX0ZDUl9FTkRfU0RVKSB7Ci0gICAgICAgICAgcF9idWYgPSBwX2ZjcmItPnBfcnhfc2R1OwotICAgICAgICAgIHBfZmNyYi0+cF9yeF9zZHUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwYWNrZXRfb2spIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gIH0gZWxzZSBpZiAocF9idWYgIT0gTlVMTCkgewotICAgIGlmIChwX2NjYi0+bG9jYWxfY2lkIDwgTDJDQVBfQkFTRV9BUFBMX0NJRCAmJgotICAgICAgICAocF9jY2ItPmxvY2FsX2NpZCA+PSBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MICYmCi0gICAgICAgICBwX2NjYi0+bG9jYWxfY2lkIDw9IEwyQ0FQX0xBU1RfRklYRURfQ0hOTCkpIHsKLSAgICAgIGlmIChsMmNiLmZpeGVkX3JlZ1twX2NjYi0+bG9jYWxfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0KLSAgICAgICAgICAgICAgLnBMMkNBX0ZpeGVkRGF0YV9DYikKLSAgICAgICAgKCpsMmNiLmZpeGVkX3JlZ1twX2NjYi0+bG9jYWxfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0KLSAgICAgICAgICAgICAgLnBMMkNBX0ZpeGVkRGF0YV9DYikocF9jY2ItPmxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkciwgcF9idWYpOwotICAgIH0gZWxzZQotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfREFUQSwgcF9idWYpOwotICB9Ci0KLSAgcmV0dXJuIChwYWNrZXRfb2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmV0cmFuc21pdF9pX2ZyYW1lcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXRyYW5zbWl0cyBpLWZyYW1lcyBhd2FpdGluZyBhY2tzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICAtIHRydWUgaWYgcmV0cmFuc21pdHRlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCByZXRyYW5zbWl0X2lfZnJhbWVzKHRMMkNfQ0NCKiBwX2NjYiwgdWludDhfdCB0eF9zZXEpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0KLSAgQlRfSERSKiBwX2J1ZiA9IE5VTEw7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQ4X3QgYnVmX3NlcTsKLSAgdWludDE2X3QgY3RybF93b3JkOwotCi0gIGlmICgoIWZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT5mY3JiLndhaXRpbmdfZm9yX2Fja19xKSkgJiYKLSAgICAgIChwX2NjYi0+cGVlcl9jZmcuZmNyLm1heF90cmFuc21pdCAhPSAwKSAmJgotICAgICAgKHBfY2NiLT5mY3JiLm51bV90cmllcyA+PSBwX2NjYi0+cGVlcl9jZmcuZmNyLm1heF90cmFuc21pdCkpIHsKLSAgICBMMkNBUF9UUkFDRV9FVkVOVCgKLSAgICAgICAgIk1heCBUcmllcyBFeGNlZWRlZDogIChsYXN0X2FjcTogJWQgIENJRDogMHglMDR4ICBudW1fdHJpZXM6ICV1IChtYXg6ICIKLSAgICAgICAgIiV1KSBhY2tfcV9jb3VudDogJXUiLAotICAgICAgICBwX2NjYi0+ZmNyYi5sYXN0X3J4X2FjaywgcF9jY2ItPmxvY2FsX2NpZCwgcF9jY2ItPmZjcmIubnVtX3RyaWVzLAotICAgICAgICBwX2NjYi0+cGVlcl9jZmcuZmNyLm1heF90cmFuc21pdCwKLSAgICAgICAgZml4ZWRfcXVldWVfbGVuZ3RoKHBfY2NiLT5mY3JiLndhaXRpbmdfZm9yX2Fja19xKSk7Ci0KLSAgICBsMmN1X2Rpc2Nvbm5lY3RfY2hubChwX2NjYik7Ci0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIH0KLQotICAvKiB0eF9zZXEgaW5kaWNhdGVzIHdoZXRoZXIgdG8gcmV0cmFuc21pdCBhIHNwZWNpZmljIHNlcXVlbmNlIG9yIGFsbCAoaWYgPT0KLSAgICogTDJDX0ZDUl9SRVRYX0FMTF9QS1RTKSAqLwotICBsaXN0X3QqIGxpc3RfYWNrID0gTlVMTDsKLSAgY29uc3QgbGlzdF9ub2RlX3QqIG5vZGVfYWNrID0gTlVMTDsKLSAgaWYgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+ZmNyYi53YWl0aW5nX2Zvcl9hY2tfcSkpIHsKLSAgICBsaXN0X2FjayA9IGZpeGVkX3F1ZXVlX2dldF9saXN0KHBfY2NiLT5mY3JiLndhaXRpbmdfZm9yX2Fja19xKTsKLSAgICBub2RlX2FjayA9IGxpc3RfYmVnaW4obGlzdF9hY2spOwotICB9Ci0gIGlmICh0eF9zZXEgIT0gTDJDX0ZDUl9SRVRYX0FMTF9QS1RTKSB7Ci0gICAgLyogSWYgc2VuZGluZyBvbmx5IG9uZSwgdGhlIHNlcXVlbmNlIG51bWJlciB0ZWxscyB1cyB3aGljaCBvbmUuIExvb2sgZm9yIGl0LgotICAgICovCi0gICAgaWYgKGxpc3RfYWNrICE9IE5VTEwpIHsKLSAgICAgIGZvciAoOyBub2RlX2FjayAhPSBsaXN0X2VuZChsaXN0X2Fjayk7IG5vZGVfYWNrID0gbGlzdF9uZXh0KG5vZGVfYWNrKSkgewotICAgICAgICBwX2J1ZiA9IChCVF9IRFIqKWxpc3Rfbm9kZShub2RlX2Fjayk7Ci0gICAgICAgIC8qIEdldCB0aGUgb2xkIGNvbnRyb2wgd29yZCAqLwotICAgICAgICBwID0gKCh1aW50OF90KikocF9idWYgKyAxKSkgKyBwX2J1Zi0+b2Zmc2V0ICsgTDJDQVBfUEtUX09WRVJIRUFEOwotCi0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY3RybF93b3JkLCBwKTsKLQotICAgICAgICBidWZfc2VxID0KLSAgICAgICAgICAgIChjdHJsX3dvcmQgJiBMMkNBUF9GQ1JfVFhfU0VRX0JJVFMpID4+IEwyQ0FQX0ZDUl9UWF9TRVFfQklUU19TSElGVDsKLQotICAgICAgICBMMkNBUF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICJyZXRyYW5zbWl0X2lfZnJhbWVzKCkgICBjdXIgc2VxOiAldSAgbG9va2luZyBmb3I6ICV1IiwgYnVmX3NlcSwKLSAgICAgICAgICAgIHR4X3NlcSk7Ci0KLSAgICAgICAgaWYgKHR4X3NlcSA9PSBidWZfc2VxKSBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXBfYnVmKSB7Ci0gICAgICBMMkNBUF9UUkFDRV9FUlJPUigicmV0cmFuc21pdF9pX2ZyYW1lcygpIFVOS05PV04gc2VxOiAldSAgcV9jb3VudDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc2VxLAotICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfcXVldWVfbGVuZ3RoKHBfY2NiLT5mY3JiLndhaXRpbmdfZm9yX2Fja19xKSk7Ci0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBJdGVyYXRlIHRob3VnaCBsaXN0IGFuZCBmbHVzaCB0aGUgYW1vdW50IHJlcXVlc3RlZCBmcm9tCi0gICAgLy8gdGhlIHRyYW5zbWl0IGRhdGEgcXVldWUgdGhhdCBzYXRpc2Z5IHRoZSBsYXllciBhbmQgZXZlbnQgY29uZGl0aW9ucy4KLSAgICBmb3IgKGxpc3Rfbm9kZV90KiBub2RlX3RtcCA9IGxpc3RfYmVnaW4ocF9jY2ItPnBfbGNiLT5saW5rX3htaXRfZGF0YV9xKTsKLSAgICAgICAgIG5vZGVfdG1wICE9IGxpc3RfZW5kKHBfY2NiLT5wX2xjYi0+bGlua194bWl0X2RhdGFfcSk7KSB7Ci0gICAgICBCVF9IRFIqIHBfdG1wID0gKEJUX0hEUiopbGlzdF9ub2RlKG5vZGVfdG1wKTsKLSAgICAgIG5vZGVfdG1wID0gbGlzdF9uZXh0KG5vZGVfdG1wKTsKLQotICAgICAgLyogRG8gbm90IGZsdXNoIG90aGVyIENJRHMgb3IgcGFydGlhbCBzZWdtZW50cyAqLwotICAgICAgaWYgKChwX3RtcC0+bGF5ZXJfc3BlY2lmaWMgPT0gMCkgJiYgKHBfdG1wLT5ldmVudCA9PSBwX2NjYi0+bG9jYWxfY2lkKSkgewotICAgICAgICBsaXN0X3JlbW92ZShwX2NjYi0+cF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EsIHBfdG1wKTsKLSAgICAgICAgb3NpX2ZyZWUocF90bXApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsc28gZmx1c2ggb3VyIHJldHJhbnNtaXNzaW9uIHF1ZXVlICovCi0gICAgd2hpbGUgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+ZmNyYi5yZXRyYW5zX3EpKQotICAgICAgb3NpX2ZyZWUoZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUocF9jY2ItPmZjcmIucmV0cmFuc19xKSk7Ci0KLSAgICBpZiAobGlzdF9hY2sgIT0gTlVMTCkgbm9kZV9hY2sgPSBsaXN0X2JlZ2luKGxpc3RfYWNrKTsKLSAgfQotCi0gIGlmIChsaXN0X2FjayAhPSBOVUxMKSB7Ci0gICAgd2hpbGUgKG5vZGVfYWNrICE9IGxpc3RfZW5kKGxpc3RfYWNrKSkgewotICAgICAgcF9idWYgPSAoQlRfSERSKilsaXN0X25vZGUobm9kZV9hY2spOwotICAgICAgbm9kZV9hY2sgPSBsaXN0X25leHQobm9kZV9hY2spOwotCi0gICAgICBCVF9IRFIqIHBfYnVmMiA9IGwyY19mY3JfY2xvbmVfYnVmKHBfYnVmLCBwX2J1Zi0+b2Zmc2V0LCBwX2J1Zi0+bGVuKTsKLSAgICAgIGlmIChwX2J1ZjIpIHsKLSAgICAgICAgcF9idWYyLT5sYXllcl9zcGVjaWZpYyA9IHBfYnVmLT5sYXllcl9zcGVjaWZpYzsKLQotICAgICAgICBmaXhlZF9xdWV1ZV9lbnF1ZXVlKHBfY2NiLT5mY3JiLnJldHJhbnNfcSwgcF9idWYyKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCh0eF9zZXEgIT0gTDJDX0ZDUl9SRVRYX0FMTF9QS1RTKSB8fCAocF9idWYyID09IE5VTEwpKSBicmVhazsKLSAgICB9Ci0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBOVUxMKTsKLQotICBpZiAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfY2NiLT5mY3JiLndhaXRpbmdfZm9yX2Fja19xKSkgewotICAgIHBfY2NiLT5mY3JiLm51bV90cmllcysrOwotICAgIGwyY19mY3Jfc3RhcnRfdGltZXIocF9jY2IpOwotICB9Ci0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19mY3JfZ2V0X25leHRfeG1pdF9zZHVfc2VnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBHZXQgdGhlIG5leHQgU0RVIHNlZ21lbnQgdG8gdHJhbnNtaXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIGJ1ZmZlciB3aXRoIHNlZ21lbnQgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CVF9IRFIqIGwyY19mY3JfZ2V0X25leHRfeG1pdF9zZHVfc2VnKHRMMkNfQ0NCKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X3BhY2tldF9sZW5ndGgpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0KLSAgYm9vbCBmaXJzdF9zZWcgPSBmYWxzZSwgLyogVGhlIHNlZ21lbnQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgZGF0YSAgKi8KLSAgICAgIG1pZF9zZWcgPSBmYWxzZSwgICAgLyogVGhlIHNlZ21lbnQgaXMgdGhlIG1pZGRsZSBwYXJ0IG9mIGRhdGEgKi8KLSAgICAgIGxhc3Rfc2VnID0gZmFsc2U7ICAgLyogVGhlIHNlZ21lbnQgaXMgdGhlIGxhc3QgcGFydCBvZiBkYXRhICAgKi8KLSAgdWludDE2X3Qgc2R1X2xlbiA9IDA7Ci0gIEJUX0hEUiAqcF9idWYsICpwX3htaXQ7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQxNl90IG1heF9wZHUgPSBwX2NjYi0+dHhfbXBzIC8qIE5lZWRlZD8gLSBMMkNBUF9NQVhfSEVBREVSX0ZDUyovOwotCi0gIC8qIElmIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZSByZXRyYW5zbWl0IHF1ZXVlLCB0aGF0IGdvZXMgZmlyc3QKLSAgKi8KLSAgcF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2NjYi0+ZmNyYi5yZXRyYW5zX3EpOwotICBpZiAocF9idWYgIT0gTlVMTCkgewotICAgIC8qIFVwZGF0ZSBSeCBTZXEgYW5kIEZDUyBpZiB3ZSBhY2tlZCBzb21lIHBhY2tldHMgd2hpbGUgdGhpcyBvbmUgd2FzIHF1ZXVlZAotICAgICAqLwotICAgIHByZXBhcmVfSV9mcmFtZShwX2NjYiwgcF9idWYsIHRydWUpOwotCi0gICAgcF9idWYtPmV2ZW50ID0gcF9jY2ItPmxvY2FsX2NpZDsKLQotICAgIHJldHVybiAocF9idWYpOwotICB9Ci0KLSAgLyogRm9yIEJEL0VEUiBjb250cm9sbGVyLCBtYXhfcGFja2V0X2xlbmd0aCBpcyBzZXQgdG8gMCAgICAgICAgICAgICAqLwotICAvKiBGb3IgQU1QIGNvbnRyb2xsZXIsIG1heF9wYWNrZXRfbGVuZ3RoIGlzIHNldCBieSBhdmFpbGFibGUgYmxvY2tzICovCi0gIGlmICgobWF4X3BhY2tldF9sZW5ndGggPiBMMkNBUF9NQVhfSEVBREVSX0ZDUykgJiYKLSAgICAgIChtYXhfcGR1ICsgTDJDQVBfTUFYX0hFQURFUl9GQ1MgPiBtYXhfcGFja2V0X2xlbmd0aCkpIHsKLSAgICBtYXhfcGR1ID0gbWF4X3BhY2tldF9sZW5ndGggLSBMMkNBUF9NQVhfSEVBREVSX0ZDUzsKLSAgfQotCi0gIHBfYnVmID0gKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QocF9jY2ItPnhtaXRfaG9sZF9xKTsKLQotICAvKiBJZiB0aGVyZSBpcyBtb3JlIGRhdGEgdGhhbiB0aGUgTVBTLCBpdCByZXF1aXJlcyBzZWdtZW50YXRpb24gKi8KLSAgaWYgKHBfYnVmLT5sZW4gPiBtYXhfcGR1KSB7Ci0gICAgLyogV2UgYXJlIHVzaW5nIHRoZSAiZXZlbnQiIGZpZWxkIHRvIHRlbGwgaXMgaWYgd2UgYWxyZWFkeSBzdGFydGVkCi0gICAgICogc2VnbWVudGF0aW9uICovCi0gICAgaWYgKHBfYnVmLT5ldmVudCA9PSAwKSB7Ci0gICAgICBmaXJzdF9zZWcgPSB0cnVlOwotICAgICAgc2R1X2xlbiA9IHBfYnVmLT5sZW47Ci0gICAgfSBlbHNlCi0gICAgICBtaWRfc2VnID0gdHJ1ZTsKLQotICAgIC8qIEdldCBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgdGhhdCBjYW4gYmUgc2VudCBpbiBhIFBEVSAqLwotICAgIHBfeG1pdCA9IGwyY19mY3JfY2xvbmVfYnVmKHBfYnVmLCBMMkNBUF9NSU5fT0ZGU0VUICsgTDJDQVBfU0RVX0xFTl9PRkZTRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3BkdSk7Ci0KLSAgICBpZiAocF94bWl0ICE9IE5VTEwpIHsKLSAgICAgIHBfYnVmLT5ldmVudCA9IHBfY2NiLT5sb2NhbF9jaWQ7Ci0gICAgICBwX3htaXQtPmV2ZW50ID0gcF9jY2ItPmxvY2FsX2NpZDsKLQotICAgICAgcF9idWYtPmxlbiAtPSBtYXhfcGR1OwotICAgICAgcF9idWYtPm9mZnNldCArPSBtYXhfcGR1OwotCi0gICAgICAvKiBjb3B5IFBCRiBzZXR0aW5nICovCi0gICAgICBwX3htaXQtPmxheWVyX3NwZWNpZmljID0gcF9idWYtPmxheWVyX3NwZWNpZmljOwotICAgIH0gZWxzZSAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuIGlmIHRoZSBhcHBsaWNhdGlvbiBoYXMgY29uZmlndXJlZCBidWZmZXJzCi0gICAgICAgICAgICAgIGNvcnJlY3RseSAqLwotICAgIHsKLSAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJMMkNBUCAtIGNhbm5vdCBnZXQgYnVmZmVyIGZvciBzZWdtZW50YXRpb24sIG1heF9wZHU6ICV1IiwgbWF4X3BkdSk7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLSAgfSBlbHNlIC8qIFVzZSB0aGUgb3JpZ2luYWwgYnVmZmVyIGlmIG5vIHNlZ21lbnRhdGlvbiwgb3IgdGhlIGxhc3Qgc2VnbWVudCAqLwotICB7Ci0gICAgcF94bWl0ID0gKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUocF9jY2ItPnhtaXRfaG9sZF9xKTsKLQotICAgIGlmIChwX3htaXQtPmV2ZW50ICE9IDApIGxhc3Rfc2VnID0gdHJ1ZTsKLQotICAgIHBfeG1pdC0+ZXZlbnQgPSBwX2NjYi0+bG9jYWxfY2lkOwotICB9Ci0KLSAgLyogU3RlcCBiYWNrIHRvIGFkZCB0aGUgTDJDQVAgaGVhZGVycyAqLwotICBwX3htaXQtPm9mZnNldCAtPSAoTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfRkNSX09WRVJIRUFEKTsKLSAgcF94bWl0LT5sZW4gKz0gTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfRkNSX09WRVJIRUFEOwotCi0gIGlmIChmaXJzdF9zZWcpIHsKLSAgICBwX3htaXQtPm9mZnNldCAtPSBMMkNBUF9TRFVfTEVOX09WRVJIRUFEOwotICAgIHBfeG1pdC0+bGVuICs9IEwyQ0FQX1NEVV9MRU5fT1ZFUkhFQUQ7Ci0gIH0KLQotICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSAqLwotICBwID0gKHVpbnQ4X3QqKShwX3htaXQgKyAxKSArIHBfeG1pdC0+b2Zmc2V0OwotCi0gIC8qIE5vdyB0aGUgTDJDQVAgaGVhZGVyICovCi0KLSAgLyogTm90ZTogaWYgRkNTIGhhcyB0byBiZSBpbmNsdWRlZCB0aGVuIHRoZSBsZW5ndGggaXMgcmVjYWxjdWxhdGVkIGxhdGVyICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF94bWl0LT5sZW4gLSBMMkNBUF9QS1RfT1ZFUkhFQUQpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPnJlbW90ZV9jaWQpOwotCi0gIGlmIChmaXJzdF9zZWcpIHsKLSAgICAvKiBTa2lwIGNvbnRyb2wgd29yZCBhbmQgYWRkIFNEVSBsZW5ndGggKi8KLSAgICBwICs9IDI7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBzZHVfbGVuKTsKLQotICAgIC8qIFdlIHdpbGwgc3RvcmUgdGhlIFNBUiB0eXBlIGluIGxheWVyLXNwZWNpZmljICovCi0gICAgLyogbGF5ZXJfc3BlY2lmaWMgaXMgc2hhcmVkIHdpdGggZmx1c2hhYmxlIGZsYWcoYml0cyAwLTEpLCBkb24ndCBjbGVhciBpdCAqLwotICAgIHBfeG1pdC0+bGF5ZXJfc3BlY2lmaWMgfD0gTDJDQVBfRkNSX1NUQVJUX1NEVTsKLQotICAgIGZpcnN0X3NlZyA9IGZhbHNlOwotICB9IGVsc2UgaWYgKG1pZF9zZWcpCi0gICAgcF94bWl0LT5sYXllcl9zcGVjaWZpYyB8PSBMMkNBUF9GQ1JfQ09OVF9TRFU7Ci0gIGVsc2UgaWYgKGxhc3Rfc2VnKQotICAgIHBfeG1pdC0+bGF5ZXJfc3BlY2lmaWMgfD0gTDJDQVBfRkNSX0VORF9TRFU7Ci0gIGVsc2UKLSAgICBwX3htaXQtPmxheWVyX3NwZWNpZmljIHw9IEwyQ0FQX0ZDUl9VTlNFR19TRFU7Ci0KLSAgcHJlcGFyZV9JX2ZyYW1lKHBfY2NiLCBwX3htaXQsIGZhbHNlKTsKLQotICBpZiAocF9jY2ItPnBlZXJfY2ZnLmZjci5tb2RlID09IEwyQ0FQX0ZDUl9FUlRNX01PREUpIHsKLSAgICBCVF9IRFIqIHBfd2FjayA9Ci0gICAgICAgIGwyY19mY3JfY2xvbmVfYnVmKHBfeG1pdCwgSENJX0RBVEFfUFJFQU1CTEVfU0laRSwgcF94bWl0LT5sZW4pOwotCi0gICAgaWYgKCFwX3dhY2spIHsKLSAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJMMkNBUCAtIG5vIGJ1ZmZlciBmb3IgeG1pdCBjbG9uaW5nLCBDSUQ6IDB4JTA0eCAgTGVuZ3RoOiAldSIsCi0gICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgcF94bWl0LT5sZW4pOwotCi0gICAgICAvKiBXZSB3aWxsIG5vdCBzYXZlIHRoZSBGQ1MgaW4gY2FzZSB3ZSByZWNvbmZpZ3VyZSBhbmQgY2hhbmdlIG9wdGlvbnMgKi8KLSAgICAgIHBfeG1pdC0+bGVuIC09IEwyQ0FQX0ZDU19MRU47Ci0KLSAgICAgIC8qIFByZXRlbmQgd2Ugc2VudCBpdCBhbmQgaXQgZ290IGxvc3QgKi8KLSAgICAgIGZpeGVkX3F1ZXVlX2VucXVldWUocF9jY2ItPmZjcmIud2FpdGluZ19mb3JfYWNrX3EsIHBfeG1pdCk7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBXZSB3aWxsIG5vdCBzYXZlIHRoZSBGQ1MgaW4gY2FzZSB3ZSByZWNvbmZpZ3VyZSBhbmQgY2hhbmdlIG9wdGlvbnMgKi8KLSAgICAgIHBfd2Fjay0+bGVuIC09IEwyQ0FQX0ZDU19MRU47Ci0KLSAgICAgIHBfd2Fjay0+bGF5ZXJfc3BlY2lmaWMgPSBwX3htaXQtPmxheWVyX3NwZWNpZmljOwotICAgICAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX2NjYi0+ZmNyYi53YWl0aW5nX2Zvcl9hY2tfcSwgcF93YWNrKTsKLSAgICB9Ci0KLSAgfQotCi0gIHJldHVybiAocF94bWl0KTsKLX0KLQotLyoqIEdldCB0aGUgbmV4dCBQRFUgdG8gdHJhbnNtaXQgZm9yIExFIGNvbm5lY3Rpb24gb3JpZW50ZWQgY2hhbm5lbC4gUmV0dXJucwotICogcG9pbnRlciB0byBidWZmZXIgd2l0aCBQRFUuIHxsYXN0X3BpZWNlX29mX3NkdXwgd2lsbCBiZSBzZXQgdG8gdHJ1ZSwgaWYKLSAqIHJldHVybmVkIFBEVSBpcyBsYXN0IHBpZWNlIGZyb20gdGhpcyBTRFUuKi8KLUJUX0hEUiogbDJjX2xjY19nZXRfbmV4dF94bWl0X3NkdV9zZWcodEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBsYXN0X3BpZWNlX29mX3NkdSkgewotICB1aW50MTZfdCBtYXhfcGR1ID0gcF9jY2ItPnBlZXJfY29ubl9jZmcubXBzIC0gNCAvKiBMZW5ndGggYW5kIENJRCAqLzsKLQotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QocF9jY2ItPnhtaXRfaG9sZF9xKTsKLSAgYm9vbCBmaXJzdF9wZHUgPSAocF9idWYtPmV2ZW50ID09IDApID8gdHJ1ZSA6IGZhbHNlOwotCi0gIHVpbnQxNl90IG5vX29mX2J5dGVzX3RvX3NlbmQgPSBzdGQ6Om1pbigKLSAgICAgIHBfYnVmLT5sZW4sCi0gICAgICAodWludDE2X3QpKGZpcnN0X3BkdSA/IChtYXhfcGR1IC0gTDJDQVBfTENDX1NEVV9MRU5HVEgpIDogbWF4X3BkdSkpOwotICBib29sIGxhc3RfcGR1ID0gKG5vX29mX2J5dGVzX3RvX3NlbmQgPT0gcF9idWYtPmxlbik7Ci0KLSAgLyogR2V0IGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSB0aGF0IGNhbiBiZSBzZW50IGluIGEgUERVICovCi0gIEJUX0hEUiogcF94bWl0ID0KLSAgICAgIGwyY19mY3JfY2xvbmVfYnVmKHBfYnVmLCBmaXJzdF9wZHUgPyBMMkNBUF9MQ0NfT0ZGU0VUIDogTDJDQVBfTUlOX09GRlNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vX29mX2J5dGVzX3RvX3NlbmQpOwotCi0gIHBfYnVmLT5ldmVudCA9IHBfY2NiLT5sb2NhbF9jaWQ7Ci0gIHBfeG1pdC0+ZXZlbnQgPSBwX2NjYi0+bG9jYWxfY2lkOwotCi0gIGlmIChmaXJzdF9wZHUpIHsKLSAgICBwX3htaXQtPm9mZnNldCAtPSBMMkNBUF9MQ0NfU0RVX0xFTkdUSDsgLyogZm9yIHdyaXRpbmcgdGhlIFNEVSBsZW5ndGguICovCi0gICAgdWludDhfdCogcCA9ICh1aW50OF90KikocF94bWl0ICsgMSkgKyBwX3htaXQtPm9mZnNldDsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfYnVmLT5sZW4pOwotICAgIHBfeG1pdC0+bGVuICs9IEwyQ0FQX0xDQ19TRFVfTEVOR1RIOwotICB9Ci0KLSAgcF9idWYtPmxlbiAtPSBub19vZl9ieXRlc190b19zZW5kOwotICBwX2J1Zi0+b2Zmc2V0ICs9IG5vX29mX2J5dGVzX3RvX3NlbmQ7Ci0KLSAgLyogY29weSBQQkYgc2V0dGluZyAqLwotICBwX3htaXQtPmxheWVyX3NwZWNpZmljID0gcF9idWYtPmxheWVyX3NwZWNpZmljOwotCi0gIGlmIChsYXN0X3BpZWNlX29mX3NkdSkgKmxhc3RfcGllY2Vfb2Zfc2R1ID0gbGFzdF9wZHU7Ci0KLSAgaWYgKGxhc3RfcGR1KSB7Ci0gICAgcF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2NjYi0+eG1pdF9ob2xkX3EpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfQotCi0gIC8qIFN0ZXAgYmFjayB0byBhZGQgdGhlIEwyQ0FQIGhlYWRlcnMgKi8KLSAgcF94bWl0LT5vZmZzZXQgLT0gTDJDQVBfUEtUX09WRVJIRUFEOwotICBwX3htaXQtPmxlbiArPSBMMkNBUF9QS1RfT1ZFUkhFQUQ7Ci0KLSAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgKi8KLSAgdWludDhfdCogcCA9ICh1aW50OF90KikocF94bWl0ICsgMSkgKyBwX3htaXQtPm9mZnNldDsKLQotICAvKiBOb3RlOiBpZiBGQ1MgaGFzIHRvIGJlIGluY2x1ZGVkIHRoZW4gdGhlIGxlbmd0aCBpcyByZWNhbGN1bGF0ZWQgbGF0ZXIgKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX3htaXQtPmxlbiAtIEwyQ0FQX1BLVF9PVkVSSEVBRCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPnJlbW90ZV9jaWQpOwotICByZXR1cm4gKHBfeG1pdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25maWd1cmF0aW9uIG5lZ290aWF0aW9uIGZ1bmN0aW9ucwotICoKLSAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIGluIG5lZ290aWF0aW5nIGNoYW5uZWwgbW9kZXMgZHVyaW5nCi0gKiBjb25maWd1cmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2Zjcl9jaGtfY2hhbl9tb2RlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVmFsaWRhdGVzIGFuZCBhZGp1c3RzIGlmIG5lY2Vzc2FyeSwgdGhlIEZDUiBvcHRpb25zCi0gKiAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHJlbW90ZSBFWFQgZmVhdHVyZXMuCi0gKgotICogICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIGFzc3VtZXMgcGVlciBFWFQgRmVhdHVyZXMgaGF2ZSBiZWVuIHJlY2VpdmVkLgotICogICAgICAgICAgICAgICAgICAgICAgQmFzaWMgbW9kZSBpcyB1c2VkIGlmIEZDUiBPcHRpb25zIGhhdmUgbm90IGJlZW4gcmVjZWl2ZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHVpbnQ4X3QgLSBub256ZXJvIGlmIGNhbiBjb250aW51ZSwgJzAnIGlmIG5vIGNvbXBhdGlibGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgbDJjX2Zjcl9jaGtfY2hhbl9tb2Rlcyh0TDJDX0NDQiogcF9jY2IpIHsKLSAgQ0hFQ0socF9jY2IgIT0gTlVMTCk7Ci0KLSAgLyogUmVtb3ZlIG5vbmJhc2ljIG9wdGlvbnMgdGhhdCB0aGUgcGVlciBkb2VzIG5vdCBzdXBwb3J0ICovCi0gIGlmICghKHBfY2NiLT5wX2xjYi0+cGVlcl9leHRfZmVhICYgTDJDQVBfRVhURkVBX0VOSF9SRVRSQU5TKSAmJgotICAgICAgcF9jY2ItPnBfcmNiLT5lcnRtX2luZm8ucHJlZmVycmVkX21vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICJMMkNBUCAtIFBlZXIgZG9lcyBub3Qgc3VwcG9ydCBvdXIgZGVzaXJlZCBjaGFubmVsIHR5cGVzIik7Ci0gICAgcF9jY2ItPnBfcmNiLT5lcnRtX2luZm8ucHJlZmVycmVkX21vZGUgPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19mY3JfYWRqX21vbml0b3JfcmV0cmFuX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE92ZXJyaWRlcyBtb25pdG9yL3JldHJhbnMgdGltZXIgdmFsdWUgYmFzZWQgb24gY29udHJvbGxlcgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19mY3JfYWRqX21vbml0b3JfcmV0cmFuX3RpbWVvdXQodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotCi0gIC8qIGFkanVzdCBvdXIgbW9uaXRvci9yZXRyYW4gdGltZW91dCAqLwotICBpZiAocF9jY2ItPm91dF9jZmdfZmNyX3ByZXNlbnQpIHsKLSAgICAvKgotICAgICoqIGlmIHdlIHJlcXVlc3RkIEVSVE0gb3IgYWNjZXB0ZWQgRVJUTQotICAgICoqIFdlIG1heSBhY2NlcHQgRVJUTSBldmVuIGlmIHdlIGRpZG4ndCByZXF1ZXN0IEVSVE0sIGluIGNhc2Ugb2YgcmVxdWVzdGluZwotICAgICpTVFJFQU0KLSAgICAqLwotICAgIGlmICgocF9jY2ItPm91cl9jZmcuZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkgfHwKLSAgICAgICAgKHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKSkgewotICAgICAgLyogdXBwZXIgbGF5ZXIgc2V0dGluZyBpcyBpZ25vcmVkICovCi0gICAgICBwX2NjYi0+b3VyX2NmZy5mY3IubW9uX3RvdXQgPSBMMkNBUF9NSU5fTU9OSVRPUl9UT1VUOwotICAgICAgcF9jY2ItPm91cl9jZmcuZmNyLnJ0cmFuc190b3V0ID0gTDJDQVBfTUlOX1JFVFJBTlNfVE9VVDsKLSAgICB9IGVsc2UgewotICAgICAgcF9jY2ItPm91cl9jZmcuZmNyLm1vbl90b3V0ID0gMDsKLSAgICAgIHBfY2NiLT5vdXJfY2ZnLmZjci5ydHJhbnNfdG91dCA9IDA7Ci0gICAgfQotCi0gICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICJsMmNfZmNyX2Fkal9tb25pdG9yX3JldHJhbl90aW1lb3V0OiBtb25fdG91dDolZCwgcnRyYW5zX3RvdXQ6JWQiLAotICAgICAgICBwX2NjYi0+b3VyX2NmZy5mY3IubW9uX3RvdXQsIHBfY2NiLT5vdXJfY2ZnLmZjci5ydHJhbnNfdG91dCk7Ci0gIH0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX2Fkal9vdXJfcnNwX29wdGlvbnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE92ZXJyaWRlcyBhbnkgbmVjY2VzYXJ5IEZDUiBvcHRpb25zIHBhc3NlZCBpbiBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FfQ29uZmlnUnNwIGJhc2VkIG9uIG91ciBGQ1Igb3B0aW9ucy4KLSAqICAgICAgICAgICAgICAgICAgT25seSBtYWtlcyBhZGp1c3RtZW50cyBpZiBjaGFubmVsIGlzIGluIEVSVE0gbW9kZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfZmNyX2Fkal9vdXJfcnNwX29wdGlvbnModEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICBDSEVDSyhwX2NmZyAhPSBOVUxMKTsKLQotICAvKiBhZGp1c3Qgb3VyIG1vbml0b3IvcmV0cmFuIHRpbWVvdXQgKi8KLSAgbDJjX2Zjcl9hZGpfbW9uaXRvcl9yZXRyYW5fdGltZW91dChwX2NjYik7Ci0KLSAgcF9jZmctPmZjcl9wcmVzZW50ID0gcF9jY2ItPm91dF9jZmdfZmNyX3ByZXNlbnQ7Ci0KLSAgaWYgKHBfY2ZnLT5mY3JfcHJlc2VudCkgewotICAgIC8qIFRlbXBvcmFyeSAtIHVudGlsIGEgYmV0dGVyIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCAqLwotICAgIC8qIElmIHBlZXIncyB0eF93bmRfc3ogcmVxdWlyZXMgdG9vIG1hbnkgYnVmZmVycyBmb3IgdXMgdG8gc3VwcG9ydCwgdGhlbgotICAgICAqIGFkanVzdCBpdC4gRm9yIG5vdywgcmVzcG9uZCB3aXRoIG91ciBvd24gdHhfd25kX3N6LiAqLwotICAgIC8qIE5vdGU6IHBlZXIgaXMgbm90IGd1YXJhbnRlZWQgdG8gb2JleSBvdXIgYWRqdXN0bWVudCAqLwotICAgIGlmIChwX2NjYi0+cGVlcl9jZmcuZmNyLnR4X3dpbl9zeiA+IHBfY2NiLT5vdXJfY2ZnLmZjci50eF93aW5fc3opIHsKLSAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCIlczogYWRqdXN0aW5nIHJlcXVlc3RlZCB0eF93aW5fc3ogZnJvbSAlaSB0byAlaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9jY2ItPnBlZXJfY2ZnLmZjci50eF93aW5fc3osCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+b3VyX2NmZy5mY3IudHhfd2luX3N6KTsKLSAgICAgIHBfY2NiLT5wZWVyX2NmZy5mY3IudHhfd2luX3N6ID0gcF9jY2ItPm91cl9jZmcuZmNyLnR4X3dpbl9zejsKLSAgICB9Ci0KLSAgICBwX2NmZy0+ZmNyLm1vZGUgPSBwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGU7Ci0gICAgcF9jZmctPmZjci50eF93aW5fc3ogPSBwX2NjYi0+cGVlcl9jZmcuZmNyLnR4X3dpbl9zejsKLSAgICBwX2NmZy0+ZmNyLm1heF90cmFuc21pdCA9IHBfY2NiLT5wZWVyX2NmZy5mY3IubWF4X3RyYW5zbWl0OwotICAgIHBfY2ZnLT5mY3IubXBzID0gcF9jY2ItPnBlZXJfY2ZnLmZjci5tcHM7Ci0gICAgcF9jZmctPmZjci5ydHJhbnNfdG91dCA9IHBfY2NiLT5vdXJfY2ZnLmZjci5ydHJhbnNfdG91dDsKLSAgICBwX2NmZy0+ZmNyLm1vbl90b3V0ID0gcF9jY2ItPm91cl9jZmcuZmNyLm1vbl90b3V0OwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX3JlbmVnb3RpYXRlX2NoYW4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCB1cG9uIHVuc3VjY2Vzc2Z1bCBwZWVyIHJlc3BvbnNlIHRvIGNvbmZpZyByZXF1ZXN0LgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgZXJyb3IgaXMgYmVjYXVzZSBvZiB0aGUgY2hhbm5lbCBtb2RlLCBpdCB3aWxsIHRyeQotICogICAgICAgICAgICAgICAgICB0byByZXNlbmQgdXNpbmcgYW5vdGhlciBzdXBwb3J0ZWQgb3B0aW9uYWwgY2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgcmVzZW50IGNvbmZpZ3VyYXRpb24sIEZhbHNlIGlmIGNoYW5uZWwgbWF0Y2hlcyBvcgotICogICAgICAgICAgICAgICAgICBjYW5ub3QgbWF0Y2guCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgbDJjX2Zjcl9yZW5lZ290aWF0ZV9jaGFuKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBDSEVDSyhwX2NjYiAhPSBOVUxMKTsKLSAgQ0hFQ0socF9jZmcgIT0gTlVMTCk7Ci0KLSAgdWludDhfdCBwZWVyX21vZGUgPSBwX2NjYi0+b3VyX2NmZy5mY3IubW9kZTsKLSAgYm9vbCBjYW5fcmVuZWdvdGlhdGU7Ci0KLSAgLyogU2tpcCBpZiB0aGlzIGlzIGEgcmVjb25maWd1cmF0aW9uIGZyb20gT1BFTiBTVEFURSBvciBpZiBGQ1IgaXMgbm90IHJldHVybmVkCi0gICAqLwotICBpZiAoIXBfY2ZnLT5mY3JfcHJlc2VudCB8fCAocF9jY2ItPmNvbmZpZ19kb25lICYgUkVDT05GSUdfRkxBRykpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogT25seSByZXRyeSBpZiB0aGVyZSBhcmUgbW9yZSBjaGFubmVsIG9wdGlvbnMgdG8gdHJ5ICovCi0gIGlmIChwX2NmZy0+cmVzdWx0ID09IEwyQ0FQX0NGR19VTkFDQ0VQVEFCTEVfUEFSQU1TKSB7Ci0gICAgcGVlcl9tb2RlID0gKHBfY2ZnLT5mY3JfcHJlc2VudCkgPyBwX2NmZy0+ZmNyLm1vZGUgOiBMMkNBUF9GQ1JfQkFTSUNfTU9ERTsKLQotICAgIGlmIChwX2NjYi0+b3VyX2NmZy5mY3IubW9kZSAhPSBwZWVyX21vZGUpIHsKLSAgICAgIGlmICgoLS1wX2NjYi0+ZmNyX2NmZ190cmllcykgPT0gMCkgewotICAgICAgICBwX2NmZy0+cmVzdWx0ID0gTDJDQVBfQ0ZHX0ZBSUxFRF9OT19SRUFTT047Ci0gICAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoImwyY19mY3JfcmVuZWdvdGlhdGVfY2hhbiAoTWF4IHJldHJpZXMgZXhjZWVkZWQpIik7Ci0gICAgICB9Ci0KLSAgICAgIGNhbl9yZW5lZ290aWF0ZSA9IGZhbHNlOwotCi0gICAgICAvKiBUcnkgYW5vdGhlciBzdXBwb3J0ZWQgbW9kZSBpZiBhdmFpbGFibGUgYmFzZWQgb24gb3VyIGxhc3QgYXR0ZW1wdGVkCi0gICAgICAgKiBjaGFubmVsICovCi0gICAgICBzd2l0Y2ggKHBfY2NiLT5vdXJfY2ZnLmZjci5tb2RlKSB7Ci0gICAgICAgIGNhc2UgTDJDQVBfRkNSX0VSVE1fTU9ERToKLSAgICAgICAgICAvKiBXZSBjYW4gdHJ5IGJhc2ljIGZvciBhbnkgb3RoZXIgcGVlciBtb2RlIGlmIHdlIHN1cHBvcnQgaXQgKi8KLSAgICAgICAgICBpZiAocF9jY2ItPnBfcmNiLT5lcnRtX2luZm8ucHJlZmVycmVkX21vZGUgJiBMMkNBUF9GQ1JfQkFTSUNfTU9ERSkgewotICAgICAgICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzKFRyeWluZyBCYXNpYykiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBjYW5fcmVuZWdvdGlhdGUgPSB0cnVlOwotICAgICAgICAgICAgcF9jY2ItPm91cl9jZmcuZmNyLm1vZGUgPSBMMkNBUF9GQ1JfQkFTSUNfTU9ERTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvKiBBbGwgb3RoZXIgc2NlbmFyaW9zIGNhbm5vdCBiZSByZW5lZ290aWF0ZWQgKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGNhbl9yZW5lZ290aWF0ZSkgewotICAgICAgICBwX2NjYi0+b3VyX2NmZy5mY3JfcHJlc2VudCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKHBfY2NiLT5vdXJfY2ZnLmZjci5tb2RlID09IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFKSB7Ci0gICAgICAgICAgcF9jY2ItPm91cl9jZmcuZmNzX3ByZXNlbnQgPSBmYWxzZTsKLSAgICAgICAgICBwX2NjYi0+b3VyX2NmZy5leHRfZmxvd19zcGVjX3ByZXNlbnQgPSBmYWxzZTsKLQotICAgICAgICAgIC8qIEJhc2ljIE1vZGUgdXNlcyBBQ0wgRGF0YSBQb29sLCBtYWtlIHN1cmUgdGhlIE1UVSBmaXRzICovCi0gICAgICAgICAgaWYgKChwX2NmZy0+bXR1X3ByZXNlbnQpICYmIChwX2NmZy0+bXR1ID4gTDJDQVBfTVRVX1NJWkUpKSB7Ci0gICAgICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIGFkanVzdCBNVFU6ICV1IHRvbyBsYXJnZSIsIHBfY2ZnLT5tdHUpOwotICAgICAgICAgICAgcF9jZmctPm10dSA9IEwyQ0FQX01UVV9TSVpFOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGwyY3VfcHJvY2Vzc19vdXJfY2ZnX3JlcShwX2NjYiwgJnBfY2NiLT5vdXJfY2ZnKTsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfY29uZmlnX3JlcShwX2NjYiwgJnBfY2NiLT5vdXJfY2ZnKTsKLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5sMmNfY2NiX3RpbWVyLCBMMkNBUF9DSE5MX0NGR19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2NjYl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0gICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogRGlzY29ubmVjdCBpZiB0aGUgY2hhbm5lbHMgZG8gbm90IG1hdGNoICovCi0gIGlmIChwX2NjYi0+b3VyX2NmZy5mY3IubW9kZSAhPSBwZWVyX21vZGUpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkMgQ0ZHOiAgQ2hhbm5lbHMgaW5jb21wYXRpYmxlIChsb2NhbCAlZCwgcGVlciAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPm91cl9jZmcuZmNyLm1vZGUsIHBlZXJfbW9kZSk7Ci0gICAgbDJjdV9kaXNjb25uZWN0X2NobmwocF9jY2IpOwotICB9Ci0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfZmNyX3Byb2Nlc3NfcGVlcl9jZmdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBGQ1Igb3B0aW9ucyBwYXNzZWQKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHBlZXIncyBjb25maWd1cmF0aW9uIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB1aW50OF90IC0gTDJDQVBfUEVFUl9DRkdfT0ssIEwyQ0FQX1BFRVJfQ0ZHX1VOQUNDRVBUQUJMRSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMMkNBUF9QRUVSX0NGR19ESVNDT05ORUNULgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IGwyY19mY3JfcHJvY2Vzc19wZWVyX2NmZ19yZXEodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIENIRUNLKHBfY2NiICE9IE5VTEwpOwotICBDSEVDSyhwX2NmZyAhPSBOVUxMKTsKLQotICB1aW50MTZfdCBtYXhfcmV0cmFuc19zaXplOwotICB1aW50OF90IGZjcl9vayA9IEwyQ0FQX1BFRVJfQ0ZHX09LOwotCi0gIHBfY2NiLT5wX2xjYi0+dzRfaW5mb19yc3AgPQotICAgICAgZmFsc2U7IC8qIEhhbmRsZXMgVDYxeCBTb255RXJpY3Nzb24gQnVnIGluIEluZm8gUmVxdWVzdCAqLwotCi0gIEwyQ0FQX1RSQUNFX0VWRU5UKAotICAgICAgImwyY19mY3JfcHJvY2Vzc19wZWVyX2NmZ19yZXEoKSBDRkcgZmNyX3ByZXNlbnQ6JWQgZmNyLm1vZGU6JWQgQ0NCIEZDUiAiCi0gICAgICAibW9kZTolZCBwcmVmZXJyZWQ6ICV1IiwKLSAgICAgIHBfY2ZnLT5mY3JfcHJlc2VudCwgcF9jZmctPmZjci5tb2RlLCBwX2NjYi0+b3VyX2NmZy5mY3IubW9kZSwKLSAgICAgIHBfY2NiLT5wX3JjYi0+ZXJ0bV9pbmZvLnByZWZlcnJlZF9tb2RlKTsKLQotICAvKiBJZiBQZWVyIHdhbnRzIGJhc2ljLCB3ZSBhcmUgZG9uZSAoYWNjZXB0IGl0IG9yIGRpc2Nvbm5lY3QpICovCi0gIGlmIChwX2NmZy0+ZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0JBU0lDX01PREUpIHsKLSAgICAvKiBJZiB3ZSBkbyBub3QgYWxsb3cgYmFzaWMsIGRpc2Nvbm5lY3QgKi8KLSAgICBpZiAocF9jY2ItPnBfcmNiLT5lcnRtX2luZm8ucHJlZmVycmVkX21vZGUgIT0gTDJDQVBfRkNSX0JBU0lDX01PREUpCi0gICAgICBmY3Jfb2sgPSBMMkNBUF9QRUVSX0NGR19ESVNDT05ORUNUOwotICB9Ci0KLSAgLyogTmVlZCB0byBuZWdvdGlhdGUgaWYgb3VyIG1vZGVzIGFyZSBub3QgdGhlIHNhbWUgKi8KLSAgZWxzZSBpZiAocF9jZmctPmZjci5tb2RlICE9IHBfY2NiLT5wX3JjYi0+ZXJ0bV9pbmZvLnByZWZlcnJlZF9tb2RlKSB7Ci0gICAgLyogSWYgcGVlciB3YW50cyBhIG1vZGUgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IHRoZW4gcmV0cnkgb3VyIG1vZGUgKGV4LgotICAgICpydHgvZmxjKSwgT1IKLSAgICAqKiBJZiB3ZSB3YW50IEVSVE0gYW5kIHRoZXkgd2FudGVkIHN0cmVhbWluZyByZXRyeSBvdXIgbW9kZS4KLSAgICAqKiBOb3RlOiBJZiB3ZSBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGV5IHN1cHBvcnQgb3VyIG1vZGUgcHJldmlvdXNseQotICAgICoqICAgICAgIGZyb20gdGhlaXIgRVhGIG1hc2suCi0gICAgKi8KLSAgICBpZiAoKCgoMSA8PCBwX2NmZy0+ZmNyLm1vZGUpICYgTDJDQVBfRkNSX0NIQU5fT1BUX0FMTF9NQVNLKSA9PSAwKSB8fAotICAgICAgICAocF9jY2ItPnBfcmNiLT5lcnRtX2luZm8ucHJlZmVycmVkX21vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkpIHsKLSAgICAgIHBfY2ZnLT5mY3IubW9kZSA9IHBfY2NiLT5vdXJfY2ZnLmZjci5tb2RlOwotICAgICAgcF9jZmctPmZjci50eF93aW5fc3ogPSBwX2NjYi0+b3VyX2NmZy5mY3IudHhfd2luX3N6OwotICAgICAgcF9jZmctPmZjci5tYXhfdHJhbnNtaXQgPSBwX2NjYi0+b3VyX2NmZy5mY3IubWF4X3RyYW5zbWl0OwotICAgICAgZmNyX29rID0gTDJDQVBfUEVFUl9DRkdfVU5BQ0NFUFRBQkxFOwotICAgIH0KLQotICAgIC8qIElmIHdlIHdhbnRlZCBiYXNpYywgdGhlbiB0cnkgdG8gcmVuZWdvdGlhdGUgaXQgKi8KLSAgICBlbHNlIGlmIChwX2NjYi0+cF9yY2ItPmVydG1faW5mby5wcmVmZXJyZWRfbW9kZSA9PSBMMkNBUF9GQ1JfQkFTSUNfTU9ERSkgewotICAgICAgcF9jZmctPmZjci5tb2RlID0gTDJDQVBfRkNSX0JBU0lDX01PREU7Ci0gICAgICBwX2NmZy0+ZmNyLm1heF90cmFuc21pdCA9IHBfY2ZnLT5mY3IudHhfd2luX3N6ID0gMDsKLSAgICAgIHBfY2ZnLT5mY3IucnRyYW5zX3RvdXQgPSBwX2NmZy0+ZmNyLm1vbl90b3V0ID0gcF9jZmctPmZjci5tcHMgPSAwOwotICAgICAgcF9jY2ItPm91cl9jZmcuZmNyLnJ0cmFuc190b3V0ID0gcF9jY2ItPm91cl9jZmcuZmNyLm1vbl90b3V0ID0KLSAgICAgICAgICBwX2NjYi0+b3VyX2NmZy5mY3IubXBzID0gMDsKLSAgICAgIGZjcl9vayA9IEwyQ0FQX1BFRVJfQ0ZHX1VOQUNDRVBUQUJMRTsKLSAgICB9Ci0gIH0KLQotICAvKiBDb25maWd1cmF0aW9uIGZvciBGQ1IgY2hhbm5lbHMgc28gbWFrZSBhbnkgYWRqdXN0bWVudHMgYW5kIGZ3ZCB0byB1cHBlcgotICAgKiBsYXllciAqLwotICBpZiAoZmNyX29rID09IEwyQ0FQX1BFRVJfQ0ZHX09LKSB7Ci0gICAgLyogYnkgZGVmYXVsdCBkb24ndCBuZWVkIHRvIHNlbmQgcGFyYW1zIGluIHRoZSByZXNwb25zZSAqLwotICAgIHBfY2NiLT5vdXRfY2ZnX2Zjcl9wcmVzZW50ID0gZmFsc2U7Ci0KLSAgICAvKiBNYWtlIGFueSBuZWVkZWQgYWRqdXN0bWVudHMgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgcGVlciAqLwotICAgIGlmIChwX2NmZy0+ZmNyX3ByZXNlbnQgJiYgcF9jZmctPmZjci5tb2RlICE9IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFKSB7Ci0gICAgICAvKiBQZWVyIGRlc2lyZXMgdG8gYnlwYXNzIEZDUyBjaGVjaywgYW5kIHN0cmVhbWluZyBvciBFUlRNIG1vZGUgKi8KLSAgICAgIGlmIChwX2NmZy0+ZmNzX3ByZXNlbnQpIHsKLSAgICAgICAgcF9jY2ItPnBlZXJfY2ZnLmZjcyA9IHBfY2ZnLT5mY3M7Ci0gICAgICB9Ci0KLSAgICAgIG1heF9yZXRyYW5zX3NpemUgPSBCVF9ERUZBVUxUX0JVRkZFUl9TSVpFIC0gc2l6ZW9mKEJUX0hEUikgLQotICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX01JTl9PRkZTRVQgLSBMMkNBUF9TRFVfTEVOX09GRlNFVCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfRkNTX0xFTjsKLQotICAgICAgLyogRW5zdXJlIHRoZSBNUFMgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSBNVFUgKi8KLSAgICAgIGlmICgocF9jZmctPmZjci5tcHMgPT0gMCkgfHwgKHBfY2ZnLT5mY3IubXBzID4gcF9jY2ItPnBlZXJfY2ZnLm10dSkpIHsKLSAgICAgICAgcF9jZmctPmZjci5tcHMgPSBwX2NjYi0+cGVlcl9jZmcubXR1OwotICAgICAgICBwX2NjYi0+b3V0X2NmZ19mY3JfcHJlc2VudCA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEVuc3VyZSB0aGUgTVBTIGlzIG5vdCBiaWdnZXIgdGhhbiBvdXIgcmV0cmFuc21pc3Npb24gYnVmZmVyICovCi0gICAgICBpZiAocF9jZmctPmZjci5tcHMgPiBtYXhfcmV0cmFuc19zaXplKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCJDRkc6IE92ZXJyaWRpbmcgTVBTIHRvICVkIChvcmlnICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9yZXRyYW5zX3NpemUsIHBfY2ZnLT5mY3IubXBzKTsKLQotICAgICAgICBwX2NmZy0+ZmNyLm1wcyA9IG1heF9yZXRyYW5zX3NpemU7Ci0gICAgICAgIHBfY2NiLT5vdXRfY2ZnX2Zjcl9wcmVzZW50ID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBfY2ZnLT5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKSB7Ci0gICAgICAgIC8qIEFsd2F5cyByZXNwb25kIHdpdGggRkNSIEVSVE0gcGFyYW1ldGVycyAqLwotICAgICAgICBwX2NjYi0+b3V0X2NmZ19mY3JfcHJlc2VudCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogRXZlcnl0aGluZyBvaywgc28gc2F2ZSB0aGUgcGVlcidzIGFkanVzdGVkIGZjciBvcHRpb25zICovCi0gICAgcF9jY2ItPnBlZXJfY2ZnLmZjciA9IHBfY2ZnLT5mY3I7Ci0KLSAgfSBlbHNlIGlmIChmY3Jfb2sgPT0gTDJDQVBfUEVFUl9DRkdfVU5BQ0NFUFRBQkxFKSB7Ci0gICAgLyogQWxsb3cgcGVlciBvbmx5IG9uZSByZXRyeSBmb3IgbW9kZSAqLwotICAgIGlmIChwX2NjYi0+cGVlcl9jZmdfYWxyZWFkeV9yZWplY3RlZCkKLSAgICAgIGZjcl9vayA9IEwyQ0FQX1BFRVJfQ0ZHX0RJU0NPTk5FQ1Q7Ci0gICAgZWxzZQotICAgICAgcF9jY2ItPnBlZXJfY2ZnX2FscmVhZHlfcmVqZWN0ZWQgPSB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIChmY3Jfb2spOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svbDJjYXAvbDJjX2ludC5oIGIvc3RhY2svbDJjYXAvbDJjX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNiYTY0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL2wyY2FwL2wyY19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBMMkNBUCBpbnRlcm5hbCBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEwyQ19JTlRfSAotI2RlZmluZSBMMkNfSU5UX0gKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNhcF9hY2xfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibDJjYXBfY29udHJvbGxlcl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJsMmNhcF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJsMmNhcF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xpc3QuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgTDJDQVBfTUlOX01UVSA0OCAvKiBNaW5pbXVtIGFjY2VwdGFibGUgTVRVIGlzIDQ4IGJ5dGVzICovCi0KLWNvbnN0ZXhwciB1aW50MTZfdCBMMkNBUF9DUkVESVRfQkFTRURfTUlOX01UVSA9IDY0OwotY29uc3RleHByIHVpbnQxNl90IEwyQ0FQX0NSRURJVF9CQVNFRF9NSU5fTVBTID0gNjQ7Ci0jZGVmaW5lIEwyQ0FQX05PX0lETEVfVElNRU9VVCAweEZGRkYKLQotLyoKLSAqIFRpbWVvdXQgdmFsdWVzIChpbiBtaWxsaXNlY29uZHMpLgotICovCi0jZGVmaW5lIEwyQ0FQX0xJTktfUk9MRV9TV0lUQ0hfVElNRU9VVF9NUyAoMTAgKiAxMDAwKSAgLyogMTAgc2Vjb25kcyAqLwotI2RlZmluZSBMMkNBUF9MSU5LX0NPTk5FQ1RfVElNRU9VVF9NUyAoNjAgKiAxMDAwKSAgICAgIC8qIDMwIHNlY29uZHMgKi8KLSNkZWZpbmUgTDJDQVBfTElOS19DT05ORUNUX0VYVF9USU1FT1VUX01TICgxMjAgKiAxMDAwKSAvKiAxMjAgc2Vjb25kcyAqLwotI2RlZmluZSBMMkNBUF9MSU5LX0ZMT1dfQ09OVFJPTF9USU1FT1VUX01TICgyICogMTAwMCkgIC8qIDIgc2Vjb25kcyAqLwotI2RlZmluZSBMMkNBUF9MSU5LX0RJU0NPTk5FQ1RfVElNRU9VVF9NUyAoMzAgKiAxMDAwKSAgIC8qIDMwIHNlY29uZHMgKi8KLSNkZWZpbmUgTDJDQVBfQ0hOTF9DT05ORUNUX1RJTUVPVVRfTVMgKDYwICogMTAwMCkgICAgICAvKiA2MCBzZWNvbmRzICovCi0jZGVmaW5lIEwyQ0FQX0NITkxfQ09OTkVDVF9FWFRfVElNRU9VVF9NUyAoMTIwICogMTAwMCkgLyogMTIwIHNlY29uZHMgKi8KLSNkZWZpbmUgTDJDQVBfQ0hOTF9DRkdfVElNRU9VVF9NUyAoMzAgKiAxMDAwKSAgICAgICAgICAvKiAzMCBzZWNvbmRzICovCi0jZGVmaW5lIEwyQ0FQX0NITkxfRElTQ09OTkVDVF9USU1FT1VUX01TICgxMCAqIDEwMDApICAgLyogMTAgc2Vjb25kcyAqLwotI2RlZmluZSBMMkNBUF9ERUxBWV9DSEVDS19TTTRfVElNRU9VVF9NUyAoMiAqIDEwMDApICAgIC8qIDIgc2Vjb25kcyAqLwotI2RlZmluZSBMMkNBUF9XQUlUX0lORk9fUlNQX1RJTUVPVVRfTVMgKDMgKiAxMDAwKSAgICAgIC8qIDMgc2Vjb25kcyAqLwotI2RlZmluZSBMMkNBUF9CTEVfTElOS19DT05ORUNUX1RJTUVPVVRfTVMgKDMwICogMTAwMCkgIC8qIDMwIHNlY29uZHMgKi8KLSNkZWZpbmUgTDJDQVBfRkNSX0FDS19USU1FT1VUX01TIDIwMCAgICAgICAgICAgICAgICAgICAvKiAyMDAgbWlsbGlzZWNvbmRzICovCi0KLS8qIERlZmluZSB0aGUgcG9zc2libGUgTDJDQVAgY2hhbm5lbCBzdGF0ZXMuIFRoZSBuYW1lcyBvZgotICogdGhlIHN0YXRlcyBtYXkgc2VlbSBhIGJpdCBzdHJhbmdlLCBidXQgdGhleSBhcmUgdGFrZW4gZnJvbQotICogdGhlIEJsdWV0b290aCBzcGVjaWZpY2F0aW9uLgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gIENTVF9DTE9TRUQsICAgICAgICAgICAgICAgICAgLyogQ2hhbm5lbCBpcyBpbiBjbG9zZWQgc3RhdGUgKi8KLSAgQ1NUX09SSUdfVzRfU0VDX0NPTVAsICAgICAgICAvKiBPcmlnaW5hdG9yIHdhaXRzIHNlY3VyaXR5IGNsZWFyZW5jZSAqLwotICBDU1RfVEVSTV9XNF9TRUNfQ09NUCwgICAgICAgIC8qIEFjY2VwdG9yIHdhaXRzIHNlY3VyaXR5IGNsZWFyZW5jZSAqLwotICBDU1RfVzRfTDJDQVBfQ09OTkVDVF9SU1AsICAgIC8qIFdhaXRpbmcgZm9yIHBlZXIgY29uZW5jdCByZXNwb25zZSAqLwotICBDU1RfVzRfTDJDQV9DT05ORUNUX1JTUCwgICAgIC8qIFdhaXRpbmcgZm9yIHVwcGVyIGxheWVyIGNvbm5lY3QgcnNwICovCi0gIENTVF9DT05GSUcsICAgICAgICAgICAgICAgICAgLyogTmVnb3RpYXRpbmcgY29uZmlndXJhdGlvbiAqLwotICBDU1RfT1BFTiwgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgdHJhbnNmZXIgc3RhdGUgKi8KLSAgQ1NUX1c0X0wyQ0FQX0RJU0NPTk5FQ1RfUlNQLCAvKiBXYWl0aW5nIGZvciBwZWVyIGRpc2Nvbm5lY3QgcnNwICovCi0gIENTVF9XNF9MMkNBX0RJU0NPTk5FQ1RfUlNQICAgLyogV2FpdGluZyBmb3IgdXBwZXIgbGF5ZXIgZGlzYyByc3AgKi8KLX0gdEwyQ19DSE5MX1NUQVRFOwotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGNoYW5uZWxfc3RhdGVfdGV4dChjb25zdCB0TDJDX0NITkxfU1RBVEUmIHN0YXRlKSB7Ci0gIHN3aXRjaCAoc3RhdGUpIHsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENTVF9DTE9TRUQpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ1NUX09SSUdfVzRfU0VDX0NPTVApOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ1NUX1RFUk1fVzRfU0VDX0NPTVApOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ1NUX1c0X0wyQ0FQX0NPTk5FQ1RfUlNQKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENTVF9XNF9MMkNBX0NPTk5FQ1RfUlNQKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENTVF9DT05GSUcpOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ1NUX09QRU4pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQ1NUX1c0X0wyQ0FQX0RJU0NPTk5FQ1RfUlNQKTsKLSAgICBDQVNFX1JFVFVSTl9URVhUKENTVF9XNF9MMkNBX0RJU0NPTk5FQ1RfUlNQKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOWyVoaHVdIiwgc3RhdGUpOwotICB9Ci19Ci0jdW5kZWYgQ0FTRV9SRVRVUk5fVEVYVAotCi0vKiBEZWZpbmUgdGhlIHBvc3NpYmxlIEwyQ0FQIGxpbmsgc3RhdGVzCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgTFNUX0RJU0NPTk5FQ1RFRCwKLSAgTFNUX0NPTk5FQ1RfSE9MRElORywKLSAgTFNUX0NPTk5FQ1RJTkdfV0FJVF9TV0lUQ0gsCi0gIExTVF9DT05ORUNUSU5HLAotICBMU1RfQ09OTkVDVEVELAotICBMU1RfRElTQ09OTkVDVElORwotfSB0TDJDX0xJTktfU1RBVEU7Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBsaW5rX3N0YXRlX3RleHQoY29uc3QgdEwyQ19MSU5LX1NUQVRFJiBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBMU1RfRElTQ09OTkVDVEVEOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJMU1RfRElTQ09OTkVDVEVEIik7Ci0gICAgY2FzZSBMU1RfQ09OTkVDVF9IT0xESU5HOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJMU1RfQ09OTkVDVF9IT0xESU5HIik7Ci0gICAgY2FzZSBMU1RfQ09OTkVDVElOR19XQUlUX1NXSVRDSDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiTFNUX0NPTk5FQ1RJTkdfV0FJVF9TV0lUQ0giKTsKLSAgICBjYXNlIExTVF9DT05ORUNUSU5HOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJMU1RfQ09OTkVDVElORyIpOwotICAgIGNhc2UgTFNUX0NPTk5FQ1RFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiTFNUX0NPTk5FQ1RFRCIpOwotICAgIGNhc2UgTFNUX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkxTVF9ESVNDT05ORUNUSU5HIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiVU5LTk9XTiIpOwotICB9Ci19Ci0KLS8qIERlZmluZSBpbnB1dCBldmVudHMgdG8gdGhlIEwyQ0FQIGxpbmsgYW5kIGNoYW5uZWwgc3RhdGUgbWFjaGluZXMuIFRoZSBuYW1lcwotICogb2YgdGhlIGV2ZW50cyBtYXkgc2VlbSBhIGJpdCBzdHJhbmdlLCBidXQgdGhleSBhcmUgdGFrZW4gZnJvbQotICogdGhlIEJsdWV0b290aCBzcGVjaWZpY2F0aW9uLgotKi8KLXR5cGVkZWYgZW51bSA6IHVpbnQxNl90IHsKLSAgLyogTG93ZXIgbGF5ZXIgKi8KLSAgTDJDRVZUX0xQX0NPTk5FQ1RfQ0ZNID0gMCwgICAgIC8qIGNvbm5lY3QgY29uZmlybSAqLwotICBMMkNFVlRfTFBfQ09OTkVDVF9DRk1fTkVHID0gMSwgLyogY29ubmVjdCBjb25maXJtIChmYWlsZWQpICovCi0gIEwyQ0VWVF9MUF9DT05ORUNUX0lORCA9IDIsICAgICAvKiBjb25uZWN0IGluZGljYXRpb24gKi8KLSAgTDJDRVZUX0xQX0RJU0NPTk5FQ1RfSU5EID0gMywgIC8qIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbiAqLwotCi0gIC8qIFNlY3VyaXR5ICovCi0gIEwyQ0VWVF9TRUNfQ09NUCA9IDcsICAgICAvKiBjbGVhcmVkIHN1Y2Nlc3NmdWxseSAqLwotICBMMkNFVlRfU0VDX0NPTVBfTkVHID0gOCwgLyogcHJvY2VkdXJlIGZhaWxlZCAqLwotCi0gIC8qIFBlZXIgY29ubmVjdGlvbiAqLwotICBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SRVEgPSAxMCwgICAgIC8qIHJlcXVlc3QgKi8KLSAgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQID0gMTEsICAgICAvKiByZXNwb25zZSAqLwotICBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1BfUE5EID0gMTIsIC8qIHJlc3BvbnNlIHBlbmRpbmcgKi8KLSAgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUlNQX05FRyA9IDEzLCAvKiByZXNwb25zZSAoZmFpbGVkKSAqLwotCi0gIC8qIFBlZXIgY29uZmlndXJhdGlvbiAqLwotICBMMkNFVlRfTDJDQVBfQ09ORklHX1JFUSA9IDE0LCAgICAgLyogcmVxdWVzdCAqLwotICBMMkNFVlRfTDJDQVBfQ09ORklHX1JTUCA9IDE1LCAgICAgLyogcmVzcG9uc2UgKi8KLSAgTDJDRVZUX0wyQ0FQX0NPTkZJR19SU1BfTkVHID0gMTYsIC8qIHJlc3BvbnNlIChmYWlsZWQpICovCi0KLSAgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUkVRID0gMTcsIC8qIFBlZXIgZGlzY29ubmVjdCByZXF1ZXN0ICovCi0gIEwyQ0VWVF9MMkNBUF9ESVNDT05ORUNUX1JTUCA9IDE4LCAvKiBQZWVyIGRpc2Nvbm5lY3QgcmVzcG9uc2UgKi8KLSAgTDJDRVZUX0wyQ0FQX0lORk9fUlNQID0gMTksICAgICAgIC8qIFBlZXIgaW5mb3JtYXRpb24gcmVzcG9uc2UgKi8KLSAgTDJDRVZUX0wyQ0FQX0RBVEEgPSAyMCwgICAgICAgICAgIC8qIFBlZXIgZGF0YSAqLwotCi0gIC8qIFVwcGVyIGxheWVyICovCi0gIEwyQ0VWVF9MMkNBX0NPTk5FQ1RfUkVRID0gMjEsICAgICAvKiBjb25uZWN0IHJlcXVlc3QgKi8KLSAgTDJDRVZUX0wyQ0FfQ09OTkVDVF9SU1AgPSAyMiwgICAgIC8qIGNvbm5lY3QgcmVzcG9uc2UgKi8KLSAgTDJDRVZUX0wyQ0FfQ09OTkVDVF9SU1BfTkVHID0gMjMsIC8qIGNvbm5lY3QgcmVzcG9uc2UgKGZhaWxlZCkqLwotICBMMkNFVlRfTDJDQV9DT05GSUdfUkVRID0gMjQsICAgICAgLyogY29uZmlnIHJlcXVlc3QgKi8KLSAgTDJDRVZUX0wyQ0FfQ09ORklHX1JTUCA9IDI1LCAgICAgIC8qIGNvbmZpZyByZXNwb25zZSAqLwotICBMMkNFVlRfTDJDQV9ESVNDT05ORUNUX1JFUSA9IDI3LCAgLyogZGlzY29ubmVjdCByZXF1ZXN0ICovCi0gIEwyQ0VWVF9MMkNBX0RJU0NPTk5FQ1RfUlNQID0gMjgsICAvKiBkaXNjb25uZWN0IHJlc3BvbnNlICovCi0gIEwyQ0VWVF9MMkNBX0RBVEFfUkVBRCA9IDI5LCAgICAgICAvKiBkYXRhIHJlYWQgKi8KLSAgTDJDRVZUX0wyQ0FfREFUQV9XUklURSA9IDMwLCAgICAgIC8qIGRhdGEgd3JpdGUgKi8KLQotICBMMkNFVlRfVElNRU9VVCA9IDMyLCAgICAgICAgIC8qIFRpbWVvdXQgKi8KLSAgTDJDRVZUX1NFQ19SRV9TRU5EX0NNRCA9IDMzLCAvKiBidG1fc2VjIGhhcyBlbm91Z2ggaW5mbyB0byBwcm9jZWVkICovCi0KLSAgTDJDRVZUX0FDS19USU1FT1VUID0gMzQsIC8qIFJSIGRlbGF5IHRpbWVvdXQgKi8KLQotICBMMkNFVlRfTDJDQV9TRU5EX0ZMT1dfQ09OVFJPTF9DUkVESVQgPSAzNSwgLyogVXBwZXIgbGF5ZXIgY3JlZGl0IHBhY2tldCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUGVlciBjcmVkaXQgYmFzZWQgY29ubmVjdGlvbiAqLwotICBMMkNFVlRfTDJDQVBfUkVDVl9GTE9XX0NPTlRST0xfQ1JFRElUID0gMzYsIC8qIGNyZWRpdCBwYWNrZXQgKi8KLSAgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9DT05ORUNUX1JFUSA9Ci0gICAgICAzNywgLyogY3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24gcmVxdWVzdCAqLwotICBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQID0KLSAgICAgIDM4LCAvKiBhY2NlcHRlZCBjcmVkaXQgYmFzZWQgY29ubmVjdGlvbiAqLwotICBMMkNFVlRfTDJDQVBfQ1JFRElUX0JBU0VEX0NPTk5FQ1RfUlNQX05FRyA9Ci0gICAgICAzOSwgLyogcmVqZWN0ZWQgY3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24gKi8KLSAgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SRVEgPQotICAgICAgNDAsIC8qIGNyZWRpdCBiYXNlZCByZWNvbmZpZyByZXF1ZXN0Ki8KLSAgTDJDRVZUX0wyQ0FQX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SU1AgPQotICAgICAgNDEsIC8qIGNyZWRpdCBiYXNlZCByZWNvbmZpZyByZXNwb25zZSAqLwotCi0gIC8qIFVwcGVyIGxheWVyIGNyZWRpdCBiYXNlZCBjb25uZWN0aW9uICovCi0gIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX1JFUSA9IDQyLCAgICAgLyogY29ubmVjdCByZXF1ZXN0ICovCi0gIEwyQ0VWVF9MMkNBX0NSRURJVF9CQVNFRF9DT05ORUNUX1JTUCA9IDQzLCAgICAgLyogY29ubmVjdCByZXNwb25zZSAqLwotICBMMkNFVlRfTDJDQV9DUkVESVRfQkFTRURfQ09OTkVDVF9SU1BfTkVHID0gNDQsIC8qIGNvbm5lY3QgcmVzcG9uc2UgKGZhaWxlZCkqLwotICBMMkNFVlRfTDJDQV9DUkVESVRfQkFTRURfUkVDT05GSUdfUkVRID0gNDUsICAgIC8qIHJlY29uZmlnIHJlcXVlc3QgKi8KLX0gdEwyQ0VWVDsKLQotLyogQ29uc3RhbnRzIGZvciBMRSBEeW5hbWljIFBTTSB2YWx1ZXMgKi8KLSNkZWZpbmUgTEVfRFlOQU1JQ19QU01fU1RBUlQgMHgwMDgwCi0jZGVmaW5lIExFX0RZTkFNSUNfUFNNX0VORCAweDAwRkYKLSNkZWZpbmUgTEVfRFlOQU1JQ19QU01fUkFOR0UgKExFX0RZTkFNSUNfUFNNX0VORCAtIExFX0RZTkFNSUNfUFNNX1NUQVJUICsgMSkKLQotLyogUmV0dXJuIHZhbHVlcyBmb3IgbDJjdV9wcm9jZXNzX3BlZXJfY2ZnX3JlcSgpICovCi0jZGVmaW5lIEwyQ0FQX1BFRVJfQ0ZHX1VOQUNDRVBUQUJMRSAwCi0jZGVmaW5lIEwyQ0FQX1BFRVJfQ0ZHX09LIDEKLSNkZWZpbmUgTDJDQVBfUEVFUl9DRkdfRElTQ09OTkVDVCAyCi0KLS8qIGVMMkNBUCBvcHRpb24gY29uc3RhbnRzICovCi0vKiBNaW4gcmV0cmFuc21pc3Npb24gdGltZW91dCBpZiBubyBmbHVzaCB0aW1lb3V0IG9yIFBCRiAqLwotI2RlZmluZSBMMkNBUF9NSU5fUkVUUkFOU19UT1VUIDIwMDAKLS8qIE1pbiBtb25pdG9yIHRpbWVvdXQgaWYgbm8gZmx1c2ggdGltZW91dCBvciBQQkYgKi8KLSNkZWZpbmUgTDJDQVBfTUlOX01PTklUT1JfVE9VVCAxMjAwMAotCi0jZGVmaW5lIEwyQ0FQX01BWF9GQ1JfQ0ZHX1RSSUVTIDIgLyogQ29uZmlnIGF0dGVtcHRzIGJlZm9yZSBkaXNjb25uZWN0aW5nICovCi0KLXR5cGVkZWYgdWludDhfdCB0TDJDX0JMRV9GSVhFRF9DSE5MU19NQVNLOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgbmV4dF90eF9zZXE7ICAgICAgIC8qIE5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIGJlIFR4J2VkICovCi0gIHVpbnQ4X3QgbGFzdF9yeF9hY2s7ICAgICAgIC8qIExhc3Qgc2VxdWVuY2UgbnVtYmVyIGFjaydlZCBieSB0aGUgcGVlciAqLwotICB1aW50OF90IG5leHRfc2VxX2V4cGVjdGVkOyAvKiBOZXh0IHBlZXIgc2VxdWVuY2UgbnVtYmVyIGV4cGVjdGVkICovCi0gIHVpbnQ4X3QgbGFzdF9hY2tfc2VudDsgICAgIC8qIExhc3QgcGVlciBzZXF1ZW5jZSBudW1iZXIgYWNrJ2VkICovCi0gIHVpbnQ4X3QgbnVtX3RyaWVzOyAgICAgICAgIC8qIE51bWJlciBvZiByZXRyaWVzIHRvIHNlbmQgYSBwYWNrZXQgKi8KLSAgdWludDhfdCBtYXhfaGVsZF9hY2tzOyAgICAgLyogTWF4IGFja3Mgd2UgY2FuIGhvbGQgYmVmb3JlIHNlbmRpbmcgKi8KLQotICBib29sIHJlbW90ZV9idXN5OyAvKiB0cnVlIGlmIHBlZXIgaGFzIGZsb3dlZCB1cyBvZmYgKi8KLQotICBib29sIHJlal9zZW50OyAgICAgICAvKiBSZWplY3Qgd2FzIHNlbnQgKi8KLSAgYm9vbCBzcmVqX3NlbnQ7ICAgICAgLyogU2VsZWN0aXZlIFJlamVjdCB3YXMgc2VudCAqLwotICBib29sIHdhaXRfYWNrOyAgICAgICAvKiBUcmFuc21pdHRlciBpcyB3YWl0aW5nIGFjayAocG9sbCBzZW50KSAqLwotICBib29sIHJlal9hZnRlcl9zcmVqOyAvKiBTZW5kIGEgUkVKIHdoZW4gU1JFSiBjbGVhcnMgKi8KLQotICBib29sIHNlbmRfZl9yc3A7IC8qIFdlIG5lZWQgdG8gc2VuZCBhbiBGLWJpdCByZXNwb25zZSAqLwotCi0gIHVpbnQxNl90IHJ4X3NkdV9sZW47IC8qIExlbmd0aCBvZiB0aGUgU0RVIGJlaW5nIHJlY2VpdmVkICovCi0gIEJUX0hEUiogcF9yeF9zZHU7ICAgIC8qIEJ1ZmZlciBob2xkaW5nIHRoZSBTRFUgYmVpbmcgcmVjZWl2ZWQgKi8KLSAgZml4ZWRfcXVldWVfdCoKLSAgICAgIHdhaXRpbmdfZm9yX2Fja19xOyAgICAgICAgICAvKiBCdWZmZXJzIHNlbnQgYW5kIHdhaXRpbmcgZm9yIHBlZXIgdG8gYWNrICovCi0gIGZpeGVkX3F1ZXVlX3QqIHNyZWpfcmN2X2hvbGRfcTsgLyogQnVmZmVycyByY3ZkIGJ1dCBoZWxkIHBlbmRpbmcgU1JFSiByc3AgKi8KLSAgZml4ZWRfcXVldWVfdCogcmV0cmFuc19xOyAgICAgICAvKiBCdWZmZXJzIGJlaW5nIHJldHJhbnNtaXR0ZWQgKi8KLQotICBhbGFybV90KiBhY2tfdGltZXI7ICAgICAgICAgLyogVGltZXIgZGVsYXlpbmcgUlIgKi8KLSAgYWxhcm1fdCogbW9uX3JldHJhbnNfdGltZXI7IC8qIFRpbWVyIE1vbml0b3Igb3IgUmV0cmFuc21pc3Npb24gKi8KLQotfSB0TDJDX0ZDUkI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgYm9vbCBpbl91c2U7Ci0gIGJvb2wgbG9nX3BhY2tldHM7Ci0gIHVpbnQxNl90IHBzbTsKLSAgdWludDE2X3QgcmVhbF9wc207IC8qIFRoaXMgbWF5IGJlIGEgZHVtbXkgUkNCIGZvciBhbiBvL2IgY29ubmVjdGlvbiBidXQgKi8KLSAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIHJlYWwgUFNNIHRoYXQgd2UgbmVlZCB0byBjb25uZWN0IHRvICovCi0gIHRMMkNBUF9BUFBMX0lORk8gYXBpOwotICB0TDJDQVBfRVJUTV9JTkZPIGVydG1faW5mbzsKLSAgdEwyQ0FQX0xFX0NGR19JTkZPIGNvY19jZmc7Ci0gIHVpbnQxNl90IG15X210dTsKLSAgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dTsKLX0gdEwyQ19SQ0I7Ci0KLSNpZm5kZWYgTDJDQVBfQ0JCX0RFRkFVTFRfREFUQV9SQVRFX0JVRkZfUVVPVEEKLSNkZWZpbmUgTDJDQVBfQ0JCX0RFRkFVTFRfREFUQV9SQVRFX0JVRkZfUVVPVEEgMTAwCi0jZW5kaWYKLQotdHlwZWRlZiB2b2lkKHRMMkNBUF9TRUNfQ0JBQ0spKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFzbnBvcnQsIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgcmVzdWx0KTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBwc207Ci0gIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0OwotICBib29sIGlzX29yaWdpbmF0b3I7Ci0gIHRMMkNBUF9TRUNfQ0JBQ0sqIHBfY2FsbGJhY2s7Ci0gIHZvaWQqIHBfcmVmX2RhdGE7Ci19IHRMMkNBUF9TRUNfREFUQTsKLQotLyogRGVmaW5lIGEgY2hhbm5lbCBjb250cm9sIGJsb2NrIChDQ0IpLiBUaGVyZSBtYXkgYmUgbWFueSBjaGFubmVsIGNvbnRyb2wKLSAqIGJsb2NrcyBiZXR3ZWVuIHRoZSBzYW1lIHR3byBCbHVldG9vdGggZGV2aWNlcyAoaS5lLiBvbiB0aGUgc2FtZSBsaW5rKS4KLSAqIEVhY2ggQ0NCIGhhcyB1bmlxdWUgbG9jYWwgYW5kIHJlbW90ZSBDSURzLiBBbGwgY2hhbm5lbCBjb250cm9sIGJsb2NrcyBvbgotICogdGhlIHNhbWUgcGh5c2ljYWwgbGluayBhbmQgYXJlIGNoYWluZWQgdG9nZXRoZXIuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgdF9sMmNfY2NiIHsKLSAgYm9vbCBpbl91c2U7ICAgICAgICAgICAgICAgIC8qIHRydWUgd2hlbiBpbiB1c2UsIGZhbHNlIHdoZW4gbm90ICovCi0gIHRMMkNfQ0hOTF9TVEFURSBjaG5sX3N0YXRlOyAvKiBDaGFubmVsIHN0YXRlICovCi0gIHRMMkNBUF9MRV9DRkdfSU5GTwotICAgICAgbG9jYWxfY29ubl9jZmc7IC8qIE91ciBjb25maWcgZm9yIGJsZSBjb25uIG9yaWVudGVkIGNoYW5uZWwgKi8KLSAgdEwyQ0FQX0xFX0NGR19JTkZPCi0gICAgICBwZWVyX2Nvbm5fY2ZnOyAgICAgICAvKiBQZWVyIGRldmljZSBjb25maWcgYmxlIGNvbm4gb3JpZW50ZWQgY2hhbm5lbCAqLwotICBib29sIGlzX2ZpcnN0X3NlZzsgICAgICAgLyogRHRlcm1pbmUgd2hldGhlciB0aGUgcmVjZWl2ZWQgcGFja2V0IGlzIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBvciBub3QgKi8KLSAgQlRfSERSKiBibGVfc2R1OyAgICAgICAgIC8qIEJ1ZmZlciBmb3Igc3RvcmluZyB1bmFzc2VtYmxlZCBzZHUqLwotICB1aW50MTZfdCBibGVfc2R1X2xlbmd0aDsgLyogTGVuZ3RoIG9mIHVuYXNzZW1ibGVkIHNkdSBsZW5ndGgqLwotICBzdHJ1Y3QgdF9sMmNfY2NiKiBwX25leHRfY2NiOyAvKiBOZXh0IENDQiBpbiB0aGUgY2hhaW4gKi8KLSAgc3RydWN0IHRfbDJjX2NjYiogcF9wcmV2X2NjYjsgLyogUHJldmlvdXMgQ0NCIGluIHRoZSBjaGFpbiAqLwotICBzdHJ1Y3QgdF9sMmNfbGlua2NiKiBwX2xjYjsgICAvKiBMaW5rIHRoaXMgQ0NCIGlzIGFzc2lnbmVkIHRvICovCi0KLSAgdWludDE2X3QgbG9jYWxfY2lkOyAgLyogTG9jYWwgQ0lEICovCi0gIHVpbnQxNl90IHJlbW90ZV9jaWQ7IC8qIFJlbW90ZSBDSUQgKi8KLQotICBhbGFybV90KiBsMmNfY2NiX3RpbWVyOyAvKiBDQ0IgVGltZXIgRW50cnkgKi8KLQotICB0TDJDX1JDQiogcF9yY2I7ICAgICAgLyogUmVnaXN0cmF0aW9uIENCIGZvciB0aGlzIENoYW5uZWwgKi8KLQotI2RlZmluZSBJQl9DRkdfRE9ORSAweDAxCi0jZGVmaW5lIE9CX0NGR19ET05FIDB4MDIKLSNkZWZpbmUgUkVDT05GSUdfRkxBRyAweDA0IC8qIFRydWUgYWZ0ZXIgaW5pdGlhbCBjb25maWd1cmF0aW9uICovCi0KLSAgdWludDhfdCBjb25maWdfZG9uZTsgLyogQ29uZmlndXJhdGlvbiBmbGFnIHdvcmQgKi8KLSAgdWludDE2X3QgcmVtb3RlX2NvbmZpZ19yc3BfcmVzdWx0OyAvKiBUaGUgY29uZmlnIHJzcCByZXN1bHQgZnJvbSByZW1vdGUgKi8KLSAgdWludDhfdCBsb2NhbF9pZDsgICAgLyogVHJhbnNhY3Rpb24gSUQgZm9yIGxvY2FsIHRyYW5zICovCi0gIHVpbnQ4X3QgcmVtb3RlX2lkOyAgIC8qIFRyYW5zYWN0aW9uIElEIGZvciBsb2NhbCAqLwotCi0jZGVmaW5lIENDQl9GTEFHX05PX1JFVFJZIDB4MDEgICAgIC8qIG5vIG1vcmUgcmV0cnkgKi8KLSNkZWZpbmUgQ0NCX0ZMQUdfU0VOVF9QRU5ESU5HIDB4MDIgLyogYWxyZWFkeSBzZW50IHBlbmRpbmcgcmVzcG9uc2UgKi8KLSAgdWludDhfdCBmbGFnczsKLQotICBib29sIGNvbm5lY3Rpb25faW5pdGlhdG9yOyAvKiB0cnVlIGlmIHdlIHNlbnQgQ29ubmVjdFJlcSAqLwotCi0gIHRMMkNBUF9DRkdfSU5GTyBvdXJfY2ZnOyAgICAgICAgICAvKiBPdXIgc2F2ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0gIHRMMkNBUF9DRkdfSU5GTyBwZWVyX2NmZzsgICAgICAgICAvKiBQZWVyJ3Mgc2F2ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0KLSAgZml4ZWRfcXVldWVfdCogeG1pdF9ob2xkX3E7IC8qIFRyYW5zbWl0IGRhdGEgaG9sZCBxdWV1ZSAqLwotICBib29sIGNvbmdfc2VudDsgICAgICAgICAgICAgLyogU2V0IHdoZW4gY29uZ2VzdGVkIHN0YXR1cyBzZW50ICovCi0gIHVpbnQxNl90IGJ1ZmZfcXVvdGE7ICAgICAgICAvKiBCdWZmZXIgcXVvdGEgYmVmb3JlIHNlbmRpbmcgY29uZ2VzdGlvbiAqLwotCi0gIHRMMkNBUF9DSE5MX1BSSU9SSVRZIGNjYl9wcmlvcml0eTsgIC8qIENoYW5uZWwgcHJpb3JpdHkgKi8KLSAgdEwyQ0FQX0NITkxfREFUQV9SQVRFIHR4X2RhdGFfcmF0ZTsgLyogQ2hhbm5lbCBUeCBkYXRhIHJhdGUgKi8KLSAgdEwyQ0FQX0NITkxfREFUQV9SQVRFIHJ4X2RhdGFfcmF0ZTsgLyogQ2hhbm5lbCBSeCBkYXRhIHJhdGUgKi8KLQotICAvKiBGaWVsZHMgdXNlZCBmb3IgZUwyQ0FQICovCi0gIHRMMkNBUF9FUlRNX0lORk8gZXJ0bV9pbmZvOwotICB0TDJDX0ZDUkIgZmNyYjsKLSAgdWludDE2X3QgdHhfbXBzOyAvKiBUWCBNUFMgYWRqdXN0ZWQgYmFzZWQgb24gY3VycmVudCBjb250cm9sbGVyICovCi0gIHVpbnQxNl90IG1heF9yeF9tdHU7Ci0gIHVpbnQ4X3QgZmNyX2NmZ190cmllczsgICAgICAgICAgLyogTWF4IG51bWJlciBvZiBuZWdvdGlhdGlvbiBhdHRlbXB0cyAqLwotICBib29sIHBlZXJfY2ZnX2FscmVhZHlfcmVqZWN0ZWQ7IC8qIElmIG1vZGUgcmVqZWN0ZWQgb25jZSwgc2V0IHRvIHRydWUgKi8KLSAgYm9vbCBvdXRfY2ZnX2Zjcl9wcmVzZW50OyAvKiB0cnVlIGlmIGNmZyByZXNwb25zZSBzaG91bGtkIGluY2x1ZGUgZmNyIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIGJvb2wgaXNfZmx1c2hhYmxlOyAvKiB0cnVlIGlmIGNoYW5uZWwgaXMgZmx1c2hhYmxlICovCi0KLSAgdWludDE2X3QgZml4ZWRfY2hubF9pZGxlX3RvdXQ7IC8qIElkbGUgdGltZW91dCB0byB1c2UgZm9yIHRoZSBmaXhlZCBjaGFubmVsICovCi0gIHVpbnQxNl90IHR4X2RhdGFfbGVuOwotCi0gIC8qIE51bWJlciBvZiBMRSBmcmFtZXMgdGhhdCB0aGUgcmVtb3RlIGNhbiBzZW5kIHRvIHVzIChjcmVkaXQgY291bnQgaW4KLSAgICogcmVtb3RlKS4gVmFsaWQgb25seSBmb3IgTEUgQ29DICovCi0gIHVpbnQxNl90IHJlbW90ZV9jcmVkaXRfY291bnQ7Ci0KLSAgLyogdXNlZCB0byBpbmRpY2F0ZSB0aGF0IEVDT0MgaXMgdXNlZCAqLwotICBib29sIGVjb2N7ZmFsc2V9OwotICBib29sIHJlY29uZmlnX3N0YXJ0ZWQ7Ci0KLSAgc3RydWN0IHsKLSAgICBzdHJ1Y3QgewotICAgICAgdW5zaWduZWQgYnl0ZXN7MH07Ci0gICAgICB1bnNpZ25lZCBwYWNrZXRzezB9OwotICAgICAgdm9pZCBvcGVyYXRvcigpKHVuc2lnbmVkIGJ5dGVzKSB7Ci0gICAgICAgIHRoaXMtPmJ5dGVzICs9IGJ5dGVzOwotICAgICAgICB0aGlzLT5wYWNrZXRzKys7Ci0gICAgICB9Ci0gICAgfSByeCwgdHg7Ci0gICAgc3RydWN0IHsKLSAgICAgIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGJ5dGVzezB9OwotICAgICAgICB1bnNpZ25lZCBwYWNrZXRzezB9OwotICAgICAgICB2b2lkIG9wZXJhdG9yKCkodW5zaWduZWQgYnl0ZXMpIHsKLSAgICAgICAgICB0aGlzLT5ieXRlcyArPSBieXRlczsKLSAgICAgICAgICB0aGlzLT5wYWNrZXRzKys7Ci0gICAgICAgIH0KLSAgICAgIH0gcngsIHR4OwotICAgIH0gZHJvcHBlZDsKLSAgfSBtZXRyaWNzOwotCi19IHRMMkNfQ0NCOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlZmluZSBhIHF1ZXVlIG9mIGxpbmtlZCBDQ0JzLgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEwyQ19DQ0IqIHBfZmlyc3RfY2NiOyAvKiBUaGUgZmlyc3QgY2hhbm5lbCBpbiB0aGlzIHF1ZXVlICovCi0gIHRMMkNfQ0NCKiBwX2xhc3RfY2NiOyAgLyogVGhlIGxhc3QgIGNoYW5uZWwgaW4gdGhpcyBxdWV1ZSAqLwotfSB0TDJDX0NDQl9ROwotCi0vKiBSb3VuZC1Sb2JpbiBzZXJ2aWNlIGZvciB0aGUgc2FtZSBwcmlvcml0eSBjaGFubmVscyAqLwotI2RlZmluZSBMMkNBUF9OVU1fQ0hOTF9QUklPUklUWSBcCi0gIDMgLyogVG90YWwgbnVtYmVyIG9mIHByaW9yaXR5IGdyb3VwIChoaWdoLCBtZWRpdW0sIGxvdykqLwotI2RlZmluZSBMMkNBUF9DSE5MX1BSSU9SSVRZX1dFSUdIVCBcCi0gIDUgLyogd2VpZ2h0IHBlciBwcmlvcml0eSBmb3IgYnVyc3QgdHJhbnNtaXNzaW9uIHF1b3RhICovCi0jZGVmaW5lIEwyQ0FQX0dFVF9QUklPUklUWV9RVU9UQShwcmkpIFwKLSAgKChMMkNBUF9OVU1fQ0hOTF9QUklPUklUWSAtIChwcmkpKSAqIEwyQ0FQX0NITkxfUFJJT1JJVFlfV0VJR0hUKQotCi0jZGVmaW5lIEwyQ0FQX0NSRURJVF9CQVNFRF9NQVhfQ0lEUyA1Ci0KLS8qIENDQnMgd2l0aGluIHRoZSBzYW1lIExDQiBhcmUgc2VydmVkIGluIHJvdW5kIHJvYmluIHdpdGggcHJpb3JpdHkgSXQgd2lsbCBtYWtlCi0gKiBzdXJlIHRoYXQgbG93IHByaW9yaXR5IGNoYW5uZWwgKGZvciBleGFtcGxlLCBIRiBzaWduYWxpbmcgb24gUkZDT01NKSBjYW4gYmUKLSAqIHNlbnQgdG8gdGhlIGhlYWRzZXQgZXZlbiBpZiBoaWdoZXIgcHJpb3JpdHkgY2hhbm5lbCAoZm9yIGV4YW1wbGUsIEFWIG1lZGlhCi0gKiBjaGFubmVsKSBpcyBjb25nZXN0ZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0TDJDX0NDQiogcF9zZXJ2ZV9jY2I7IC8qIGN1cnJlbnQgc2VydmluZyBjY2Igd2l0aGluIHByaW9yaXR5IGdyb3VwICovCi0gIHRMMkNfQ0NCKiBwX2ZpcnN0X2NjYjsgLyogZmlyc3QgY2NiIG9mIHByaW9yaXR5IGdyb3VwICovCi0gIHVpbnQ4X3QgbnVtX2NjYjsgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGluIHByaW9yaXR5IGdyb3VwICovCi0gIHVpbnQ4X3QgcXVvdGE7ICAgICAgICAgLyogYnVyc3QgdHJhbnNtaXNzaW9uIHF1b3RhICovCi19IHRMMkNfUlJfU0VSVjsKLQotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIC8qIGRpc2FibGUgdXBkYXRlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyAqLwotICBMMkNfQkxFX0NPTk5fVVBEQVRFX0RJU0FCTEUgPSAoMXUgPDwgMCksCi0gIC8qIG5ldyBjb25uZWN0aW9uIHBhcmFtZXRlciB0byBiZSBzZXQgKi8KLSAgTDJDX0JMRV9ORVdfQ09OTl9QQVJBTSA9ICgxdSA8PCAxKSwKLSAgLyogd2FpdGluZyBmb3IgY29ubmVjdGlvbiB1cGRhdGUgZmluaXNoZWQgKi8KLSAgTDJDX0JMRV9VUERBVEVfUEVORElORyA9ICgxdSA8PCAyKSwKLSAgLyogbm90IHVzaW5nIGRlZmF1bHQgY29ubmVjdGlvbiBwYXJhbWV0ZXJzICovCi0gIEwyQ19CTEVfTk9UX0RFRkFVTFRfUEFSQU0gPSAoMXUgPDwgMyksCi19IHRDT05OX1VQREFURV9NQVNLOwotCi0vKiBEZWZpbmUgYSBsaW5rIGNvbnRyb2wgYmxvY2suIFRoZXJlIGlzIG9uZSBsaW5rIGNvbnRyb2wgYmxvY2sgYmV0d2VlbgotICogdGhpcyBkZXZpY2UgYW5kIGFueSBvdGhlciBkZXZpY2UgKGkuZS4gQkQgQUREUikuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgdF9sMmNfbGlua2NiIHsKLSAgYm9vbCBpbl91c2U7IC8qIHRydWUgd2hlbiBpbiB1c2UsIGZhbHNlIHdoZW4gbm90ICovCi0gIHRMMkNfTElOS19TVEFURSBsaW5rX3N0YXRlOwotCi0gIGFsYXJtX3QqIGwyY19sY2JfdGltZXI7IC8qIFRpbWVyIGVudHJ5IGZvciB0aW1lb3V0IGV2dCAqLwotIHByaXZhdGU6Ci0gIHVpbnQxNl90IGhhbmRsZV87IC8qIFRoZSBoYW5kbGUgdXNlZCB3aXRoIExNICovCi0gIGZyaWVuZCB2b2lkIGwyY3Vfc2V0X2xjYl9oYW5kbGUoc3RydWN0IHRfbDJjX2xpbmtjYiYgcF9sY2IsIHVpbnQxNl90IGhhbmRsZSk7Ci0gIHZvaWQgU2V0SGFuZGxlKHVpbnQxNl90IGhhbmRsZSkgeyBoYW5kbGVfID0gaGFuZGxlOyB9Ci0KLSBwdWJsaWM6Ci0gIHVpbnQxNl90IEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KLSAgdm9pZCBJbnZhbGlkYXRlSGFuZGxlKCkgeyBoYW5kbGVfID0gSENJX0lOVkFMSURfSEFORExFOyB9Ci0KLSAgdEwyQ19DQ0JfUSBjY2JfcXVldWU7IC8qIFF1ZXVlIG9mIENDQnMgb24gdGhpcyBMQ0IgKi8KLQotICB0TDJDX0NDQiogcF9wZW5kaW5nX2NjYjsgIC8qIGNjYiBvZiB3YWl0aW5nIGNoYW5uZWwgZHVyaW5nIGxpbmsgZGlzY29ubmVjdCAqLwotICBhbGFybV90KiBpbmZvX3Jlc3BfdGltZXI7IC8qIFRpbWVyIGVudHJ5IGZvciBpbmZvIHJlc3AgdGltZW91dCBldnQgKi8KLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRfYWRkcjsgLyogVGhlIEJEIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSAqLwotCi0gcHJpdmF0ZToKLSAgdEhDSV9ST0xFIGxpbmtfcm9sZV97SENJX1JPTEVfQ0VOVFJBTH07IC8qIENlbnRyYWwgb3IgcGVyaXBoZXJhbCAqLwotIHB1YmxpYzoKLSAgdEhDSV9ST0xFIExpbmtSb2xlKCkgY29uc3QgeyByZXR1cm4gbGlua19yb2xlXzsgfQotICBib29sIElzTGlua1JvbGVDZW50cmFsKCkgY29uc3QgeyByZXR1cm4gbGlua19yb2xlXyA9PSBIQ0lfUk9MRV9DRU5UUkFMOyB9Ci0gIGJvb2wgSXNMaW5rUm9sZVBlcmlwaGVyYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxpbmtfcm9sZV8gPT0gSENJX1JPTEVfUEVSSVBIRVJBTDsKLSAgfQotICB2b2lkIFNldExpbmtSb2xlQXNDZW50cmFsKCkgeyBsaW5rX3JvbGVfID0gSENJX1JPTEVfQ0VOVFJBTDsgfQotICB2b2lkIFNldExpbmtSb2xlQXNQZXJpcGhlcmFsKCkgeyBsaW5rX3JvbGVfID0gSENJX1JPTEVfUEVSSVBIRVJBTDsgfQotCi0gIHVpbnQ4X3Qgc2lnbmFsX2lkOyAgICAgICAgICAgICAgICAvKiBTaWduYWxsaW5nIGNoYW5uZWwgaWQgKi8KLSAgdWludDhfdCBjdXJfZWNob19pZDsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgaWQgdmFsdWUgZm9yIGVjaG8gcmVxdWVzdCAqLwotICB1aW50MTZfdCBpZGxlX3RpbWVvdXQ7ICAgICAgICAgICAgLyogSWRsZSB0aW1lb3V0ICovCi0gcHJpdmF0ZToKLSAgYm9vbCBpc19ib25kaW5nX3tmYWxzZX07ICAgICAgICAgIC8qIFRydWUgLSBsaW5rIGFjdGl2ZSBvbmx5IGZvciBib25kaW5nICovCi0gcHVibGljOgotICBib29sIElzQm9uZGluZygpIGNvbnN0IHsgcmV0dXJuIGlzX2JvbmRpbmdfOyB9Ci0gIHZvaWQgU2V0Qm9uZGluZygpIHsgaXNfYm9uZGluZ18gPSB0cnVlOyB9Ci0gIHZvaWQgUmVzZXRCb25kaW5nKCkgeyBpc19ib25kaW5nXyA9IGZhbHNlOyB9Ci0KLSAgdWludDE2X3QgbGlua194bWl0X3F1b3RhOyAvKiBOdW0gb3V0c3RhbmRpbmcgcGt0cyBhbGxvd2VkICovCi0gIGJvb2wgaXNfcm91bmRfcm9iaW5fc2NoZWR1bGluZygpIGNvbnN0IHsgcmV0dXJuIGxpbmtfeG1pdF9xdW90YSA9PSAwOyB9Ci0KLSAgdWludDE2X3Qgc2VudF9ub3RfYWNrZWQ7ICAvKiBOdW0gcGFja2V0cyBzZW50IGJ1dCBub3QgYWNrZWQgKi8KLSAgdm9pZCB1cGRhdGVfb3V0c3RhbmRpbmdfcGFja2V0cyh1aW50MTZfdCBwYWNrZXRzX2Fja2VkKSB7Ci0gICAgaWYgKHNlbnRfbm90X2Fja2VkID4gcGFja2V0c19hY2tlZCkKLSAgICAgIHNlbnRfbm90X2Fja2VkIC09IHBhY2tldHNfYWNrZWQ7Ci0gICAgZWxzZQotICAgICAgc2VudF9ub3RfYWNrZWQgPSAwOwotICB9Ci0KLSAgYm9vbCBwYXJ0aWFsX3NlZ21lbnRfYmVpbmdfc2VudDsgLyogU2V0IHRydWUgd2hlbiBhIHBhcnRpYWwgc2VnbWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBiZWluZyBzZW50LiAqLwotICBib29sIHc0X2luZm9fcnNwOyAgICAgICAgICAgICAgICAvKiB0cnVlIHdoZW4gaW5mbyByZXF1ZXN0IGlzIGFjdGl2ZSAqLwotICB1aW50MzJfdCBwZWVyX2V4dF9mZWE7ICAgICAgICAgICAvKiBQZWVyJ3MgZXh0ZW5kZWQgZmVhdHVyZXMgbWFzayAqLwotICBsaXN0X3QqIGxpbmtfeG1pdF9kYXRhX3E7ICAgICAgICAvKiBMaW5rIHRyYW5zbWl0IGRhdGEgYnVmZmVyIHF1ZXVlICovCi0KLSAgdWludDhfdCBwZWVyX2NobmxfbWFza1tMMkNBUF9GSVhFRF9DSE5MX0FSUkFZX1NJWkVdOwotCi0gIHRMMkNBUF9QUklPUklUWSBhY2xfcHJpb3JpdHk7Ci0gIGJvb2wgaXNfbm9ybWFsX3ByaW9yaXR5KCkgY29uc3QgewotICAgIHJldHVybiBhY2xfcHJpb3JpdHkgPT0gTDJDQVBfUFJJT1JJVFlfTk9STUFMOwotICB9Ci0gIGJvb2wgaXNfaGlnaF9wcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGFjbF9wcmlvcml0eSA9PSBMMkNBUF9QUklPUklUWV9ISUdIOyB9Ci0gIGJvb2wgc2V0X3ByaW9yaXR5KHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSkgewotICAgIGlmIChhY2xfcHJpb3JpdHkgIT0gcHJpb3JpdHkpIHsKLSAgICAgIGFjbF9wcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHRMMkNfQ0NCKiBwX2ZpeGVkX2NjYnNbTDJDQVBfTlVNX0ZJWEVEX0NITkxTXTsKLQotIHByaXZhdGU6Ci0gIHRIQ0lfUkVBU09OIGRpc2NfcmVhc29uX3tIQ0lfRVJSX1VOREVGSU5FRH07Ci0KLSBwdWJsaWM6Ci0gIHRIQ0lfUkVBU09OIERpc2Nvbm5lY3RSZWFzb24oKSBjb25zdCB7IHJldHVybiBkaXNjX3JlYXNvbl87IH0KLSAgdm9pZCBTZXREaXNjb25uZWN0UmVhc29uKHRIQ0lfUkVBU09OIGRpc2NfcmVhc29uKSB7Ci0gICAgZGlzY19yZWFzb25fID0gZGlzY19yZWFzb247Ci0gIH0KLQotICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydDsKLSAgYm9vbCBpc190cmFuc3BvcnRfYnJfZWRyKCkgY29uc3QgeyByZXR1cm4gdHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFI7IH0KLSAgYm9vbCBpc190cmFuc3BvcnRfYmxlKCkgY29uc3QgeyByZXR1cm4gdHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRTsgfQotCi0gIHVpbnQxNl90IHR4X2RhdGFfbGVuOyAvKiB0eCBkYXRhIGxlbmd0aCB1c2VkIGluIGRhdGEgbGVuZ3RoIGV4dGVuc2lvbiAqLwotICBmaXhlZF9xdWV1ZV90KiBsZV9zZWNfcGVuZGluZ19xOyAvKiBMRSBjb2MgY2hhbm5lbHMgd2FpdGluZyBmb3Igc2VjdXJpdHkgY2hlY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiAqLwotICB1aW50OF90IHNlY19hY3Q7Ci0KLSAgdWludDhfdCBjb25uX3VwZGF0ZV9tYXNrOwotCi0gIHVpbnQxNl90IG1pbl9pbnRlcnZhbDsgLyogcGFyYW1ldGVycyBhcyByZXF1ZXN0ZWQgYnkgcGVyaXBoZXJhbCAqLwotICB1aW50MTZfdCBtYXhfaW50ZXJ2YWw7Ci0gIHVpbnQxNl90IGxhdGVuY3k7Ci0gIHVpbnQxNl90IHRpbWVvdXQ7Ci0gIHVpbnQxNl90IG1pbl9jZV9sZW47Ci0gIHVpbnQxNl90IG1heF9jZV9sZW47Ci0KLSAgLyogZWFjaCBwcmlvcml0eSBncm91cCBpcyBsaW1pdGVkIGJ1cnN0IHRyYW5zbWlzc2lvbiAqLwotICAvKiByb3VuZCByb2JpbiBzZXJ2aWNlIGZvciB0aGUgc2FtZSBwcmlvcml0eSBjaGFubmVscyAqLwotICB0TDJDX1JSX1NFUlYgcnJfc2VydltMMkNBUF9OVU1fQ0hOTF9QUklPUklUWV07Ci0gIHVpbnQ4X3QgcnJfcHJpOyAvKiBjdXJyZW50IHNlcnZpbmcgcHJpb3JpdHkgZ3JvdXAgKi8KLQotICAvKiBQZW5kaW5nIEVDT0MgcmVjb25maWd1cmF0aW9uIGRhdGEgKi8KLSAgdEwyQ0FQX0xFX0NGR19JTkZPIHBlbmRpbmdfZWNvY19yZWNvbmZpZ19jZmc7Ci0gIHVpbnQ4X3QgcGVuZGluZ19lY29jX3JlY29uZmlnX2NudDsKLQotICAvKiBUaGlzIGlzIHRvIGtlZXAgbGlzdCBvZiBsb2NhbCBjaWRzIHVzZSBpbiB0aGUKLSAgICogY3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24gcmVzcG9uc2UuCi0gICAqLwotICB1aW50MTZfdCBwZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzW0wyQ0FQX0NSRURJVF9CQVNFRF9NQVhfQ0lEU107Ci0gIHVpbnQ4X3QgcGVuZGluZ19lY29jX2Nvbm5fY250OwotCi0gIHVpbnQxNl90IHBlbmRpbmdfbGVhZF9jaWQ7Ci0gIHVpbnQxNl90IHBlbmRpbmdfbDJjYXBfcmVzdWx0OwotCi0gIHVuc2lnbmVkIG51bWJlcl9vZl9hY3RpdmVfZHluYW1pY19jaGFubmVscygpIGNvbnN0IHsKLSAgICB1bnNpZ25lZCBjbnQgPSAwOwotICAgIGNvbnN0IHRMMkNfQ0NCKiBjdXIgPSBjY2JfcXVldWUucF9maXJzdF9jY2I7Ci0gICAgd2hpbGUgKGN1ciAhPSBudWxscHRyKSB7Ci0gICAgICBjbnQrKzsKLSAgICAgIGN1ciA9IGN1ci0+cF9uZXh0X2NjYjsKLSAgICB9Ci0gICAgcmV0dXJuIGNudDsKLSAgfQotfSB0TDJDX0xDQjsKLQotLyogRGVmaW5lIHRoZSBMMkNBUCBjb250cm9sIHN0cnVjdHVyZQotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBsMmNhcF90cmFjZV9sZXZlbDsKLSAgdWludDE2X3QgY29udHJvbGxlcl94bWl0X3dpbmRvdzsgLyogVG90YWwgQUNMIHdpbmRvdyBmb3IgYWxsIGxpbmtzICovCi0KLSAgdWludDE2X3Qgcm91bmRfcm9iaW5fcXVvdGE7ICAgLyogUm91bmQtcm9iaW4gbGluayBxdW90YSAqLwotICB1aW50MTZfdCByb3VuZF9yb2Jpbl91bmFja2VkOyAvKiBSb3VuZC1yb2JpbiB1bmFja2VkICovCi0gIGJvb2wgaXNfY2xhc3NpY19yb3VuZF9yb2Jpbl9xdW90YV9hdmFpbGFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJvdW5kX3JvYmluX3VuYWNrZWQgPCByb3VuZF9yb2Jpbl9xdW90YTsKLSAgfQotICB2b2lkIHVwZGF0ZV9vdXRzdGFuZGluZ19jbGFzc2ljX3BhY2tldHModWludDE2X3QgbnVtX3BhY2tldHNfYWNrZWQpIHsKLSAgICBpZiAocm91bmRfcm9iaW5fdW5hY2tlZCA+IG51bV9wYWNrZXRzX2Fja2VkKQotICAgICAgcm91bmRfcm9iaW5fdW5hY2tlZCAtPSBudW1fcGFja2V0c19hY2tlZDsKLSAgICBlbHNlCi0gICAgICByb3VuZF9yb2Jpbl91bmFja2VkID0gMDsKLSAgfQotCi0gIGJvb2wgY2hlY2tfcm91bmRfcm9iaW47ICAgICAgIC8qIERvIGEgcm91bmQgcm9iaW4gY2hlY2sgKi8KLQotICBib29sIGlzX2NvbmdfY2JhY2tfY29udGV4dDsKLQotICB0TDJDX0xDQiBsY2JfcG9vbFtNQVhfTDJDQVBfTElOS1NdOyAgICAvKiBMaW5rIENvbnRyb2wgQmxvY2sgcG9vbCAqLwotICB0TDJDX0NDQiBjY2JfcG9vbFtNQVhfTDJDQVBfQ0hBTk5FTFNdOyAvKiBDaGFubmVsIENvbnRyb2wgQmxvY2sgcG9vbCAqLwotICB0TDJDX1JDQiByY2JfcG9vbFtNQVhfTDJDQVBfQ0xJRU5UU107ICAvKiBSZWdpc3RyYXRpb24gaW5mbyBwb29sICovCi0KLSAgdEwyQ19DQ0IqIHBfZnJlZV9jY2JfZmlyc3Q7IC8qIFBvaW50ZXIgdG8gZmlyc3QgZnJlZSBDQ0IgKi8KLSAgdEwyQ19DQ0IqIHBfZnJlZV9jY2JfbGFzdDsgIC8qIFBvaW50ZXIgdG8gbGFzdCAgZnJlZSBDQ0IgKi8KLQotICBib29sIGRpc2FsbG93X3N3aXRjaDsgICAgIC8qIGZhbHNlLCB0byBhbGxvdyBzd2l0Y2ggYXQgY3JlYXRlIGNvbm4gKi8KLSAgdWludDE2X3QgbnVtX2xtX2FjbF9idWZzOyAvKiAjIG9mIEFDTCBidWZmZXJzIG9uIGNvbnRyb2xsZXIgKi8KLSAgdWludDE2X3QgaWRsZV90aW1lb3V0OyAgICAvKiBJZGxlIHRpbWVvdXQgKi8KLQotICBsaXN0X3QqIHJjdl9wZW5kaW5nX3E7ICAgICAgIC8qIFJlY3YgcGVuZGluZyBxdWV1ZSAqLwotICBhbGFybV90KiByZWNlaXZlX2hvbGRfdGltZXI7IC8qIFRpbWVyIGVudHJ5IGZvciByY3YgaG9sZCAqLwotCi0gIHRMMkNfTENCKiBwX2N1cl9oY2l0X2xjYjsgIC8qIEN1cnJlbnQgSENJIFRyYW5zcG9ydCBidWZmZXIgKi8KLSAgdWludDE2X3QgbnVtX3VzZWRfbGNiczsgICAgLyogTnVtYmVyIG9mIGFjdGl2ZSBsaW5rIGNvbnRyb2wgYmxvY2tzICovCi0KLSAgdWludDE2X3Qgbm9uX2ZsdXNoYWJsZV9wYmY7IC8qIEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFIGlmIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzICovCi0gIC8qIE90aGVyd2lzZSwgTDJDQVBfUEtUX1NUQVJUICovCi0KLSNpZiAoTDJDQVBfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotICB1aW50MzJfdCB0ZXN0X2luZm9fcmVzcDsgLyogQ29uZm9ybWFuY2UgdGVzdGluZyBuZWVkcyBhIGR5bmFtaWMgcmVzcG9uc2UgKi8KLSNlbmRpZgotCi0gIHRMMkNBUF9GSVhFRF9DSE5MX1JFRwotICAgICAgZml4ZWRfcmVnW0wyQ0FQX05VTV9GSVhFRF9DSE5MU107IC8qIFJlZyBpbmZvIGZvciBmaXhlZCBjaGFubmVscyAqLwotCi0gIHVpbnQxNl90IG51bV9ibGVfbGlua3NfYWN0aXZlOyAvKiBOdW1iZXIgb2YgTEUgbGlua3MgYWN0aXZlICovCi0gIHVpbnQxNl90IGNvbnRyb2xsZXJfbGVfeG1pdF93aW5kb3c7IC8qIFRvdGFsIEFDTCB3aW5kb3cgZm9yIGFsbCBsaW5rcyAqLwotICB0TDJDX0JMRV9GSVhFRF9DSE5MU19NQVNLIGwyY19ibGVfZml4ZWRfY2hubHNfbWFzazsgIC8vIExFIGZpeGVkIGNoYW5uZWxzIG1hc2sKLSAgdWludDE2X3QgbnVtX2xtX2JsZV9idWZzOyAgICAgICAgIC8qICMgb2YgQUNMIGJ1ZmZlcnMgb24gY29udHJvbGxlciAqLwotICB1aW50MTZfdCBibGVfcm91bmRfcm9iaW5fcXVvdGE7ICAgLyogUm91bmQtcm9iaW4gbGluayBxdW90YSAqLwotICB1aW50MTZfdCBibGVfcm91bmRfcm9iaW5fdW5hY2tlZDsgLyogUm91bmQtcm9iaW4gdW5hY2tlZCAqLwotICBib29sIGlzX2JsZV9yb3VuZF9yb2Jpbl9xdW90YV9hdmFpbGFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJsZV9yb3VuZF9yb2Jpbl91bmFja2VkIDwgYmxlX3JvdW5kX3JvYmluX3F1b3RhOwotICB9Ci0gIHZvaWQgdXBkYXRlX291dHN0YW5kaW5nX2xlX3BhY2tldHModWludDE2X3QgbnVtX3BhY2tldHNfYWNrZWQpIHsKLSAgICBpZiAoYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQgPiBudW1fcGFja2V0c19hY2tlZCkKLSAgICAgIGJsZV9yb3VuZF9yb2Jpbl91bmFja2VkIC09IG51bV9wYWNrZXRzX2Fja2VkOwotICAgIGVsc2UKLSAgICAgIGJsZV9yb3VuZF9yb2Jpbl91bmFja2VkID0gMDsKLSAgfQotCi0gIGJvb2wgYmxlX2NoZWNrX3JvdW5kX3JvYmluOyAgICAgICAvKiBEbyBhIHJvdW5kIHJvYmluIGNoZWNrICovCi0gIHRMMkNfUkNCIGJsZV9yY2JfcG9vbFtCTEVfTUFYX0wyQ0FQX0NMSUVOVFNdOyAvKiBSZWdpc3RyYXRpb24gaW5mbyBwb29sICovCi0KLSAgdWludDE2X3QgbGVfZHluX3BzbTsgLyogTmV4dCBMRSBkeW5hbWljIFBTTSB2YWx1ZSB0byB0cnkgdG8gYXNzaWduICovCi0gIGJvb2wgbGVfZHluX3BzbV9hc3NpZ25lZFtMRV9EWU5BTUlDX1BTTV9SQU5HRV07IC8qIFRhYmxlIG9mIGFzc2lnbmVkIExFIFBTTSAqLwotCi19IHRMMkNfQ0I7Ci0KLS8qIERlZmluZSBhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbm5lY3Rpb24uCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgYmV0d2VlbiBmdW5jdGlvbnMsIGFuZCBub3QgYWxsIHRoZQotICogZmllbGRzIHdpbGwgYWx3YXlzIGJlIGZpbGxlZCBpbi4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFJhd0FkZHJlc3MgYmRfYWRkcjsgICAgLyogUmVtb3RlIEJEIGFkZHJlc3MgKi8KLSAgdWludDhfdCBzdGF0dXM7ICAgICAgICAvKiBDb25uZWN0aW9uIHN0YXR1cyAqLwotICB1aW50MTZfdCBwc207ICAgICAgICAgIC8qIFBTTSBvZiB0aGUgY29ubmVjdGlvbiAqLwotICB1aW50MTZfdCBsMmNhcF9yZXN1bHQ7IC8qIEwyQ0FQIHJlc3VsdCAqLwotICB1aW50MTZfdCBsMmNhcF9zdGF0dXM7IC8qIEwyQ0FQIHN0YXR1cyAqLwotICB1aW50MTZfdCByZW1vdGVfY2lkOyAgIC8qIFJlbW90ZSBDSUQgKi8KLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGxjaWRzOyAvKiBVc2VkIHdoZW4gY3JlZGl0IGJhc2VkIGlzIHVzZWQqLwotICB1aW50MTZfdCBwZWVyX210dTsgICAgIC8qIFBlZXIgTVRVICovCi19IHRMMkNfQ09OTl9JTkZPOwotCi10eXBlZGVmIHZvaWQodEwyQ19GQ1JfTUdNVF9FVlRfSERMUikodWludDhfdCwgdEwyQ19DQ0IqKTsKLQotLyogVGhlIG9mZnNldCBpbiBhIGJ1ZmZlciB0aGF0IEwyQ0FQIHdpbGwgdXNlIHdoZW4gYnVpbGRpbmcgY29tbWFuZHMuCi0qLwotI2RlZmluZSBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgMAotCi0vKiBOdW1iZXIgb2YgQUNMIGJ1ZmZlcnMgdG8gdXNlIGZvciBoaWdoIHByaW9yaXR5IGNoYW5uZWwKLSovCi0jZGVmaW5lIEwyQ0FQX0hJR0hfUFJJX01JTl9YTUlUX1FVT1RBX0EgKEwyQ0FQX0hJR0hfUFJJX01JTl9YTUlUX1FVT1RBKQotCi0vKiBMMkNBUCBnbG9iYWwgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotZXh0ZXJuIHRMMkNfQ0IgbDJjYjsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGwyY19tYWluLmNjCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLWV4dGVybiB2b2lkIGwyY19yZWNlaXZlX2hvbGRfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiB2b2lkIGwyY19jY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiB2b2lkIGwyY19sY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiB2b2lkIGwyY19mY3JiX2Fja190aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotZXh0ZXJuIHVpbnQ4X3QgbDJjX2RhdGFfd3JpdGUodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSwgdWludDE2X3QgZmxhZyk7Ci1leHRlcm4gdm9pZCBsMmNfcHJvY2Vzc19oZWxkX3BhY2tldHMoYm9vbCB0aW1lZF9vdXQpOwotCi1leHRlcm4gdEwyQ19MQ0IqIGwyY3VfYWxsb2NhdGVfbGNiKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgYm9vbCBpc19ib25kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdm9pZCBsMmN1X3JlbGVhc2VfbGNiKHRMMkNfTENCKiBwX2xjYik7Ci1leHRlcm4gdEwyQ19MQ0IqIGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1leHRlcm4gdEwyQ19MQ0IqIGwyY3VfZmluZF9sY2JfYnlfaGFuZGxlKHVpbnQxNl90IGhhbmRsZSk7Ci0KLWV4dGVybiBib29sIGwyY3Vfc2V0X2FjbF9wcmlvcml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2V0X2FmdGVyX3JzKTsKLQotZXh0ZXJuIHZvaWQgbDJjdV9lbnF1ZXVlX2NjYih0TDJDX0NDQiogcF9jY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9kZXF1ZXVlX2NjYih0TDJDX0NDQiogcF9jY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9jaGFuZ2VfcHJpX2NjYih0TDJDX0NDQiogcF9jY2IsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5KTsKLQotZXh0ZXJuIHRMMkNfQ0NCKiBsMmN1X2FsbG9jYXRlX2NjYih0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGNpZCk7Ci1leHRlcm4gdm9pZCBsMmN1X3JlbGVhc2VfY2NiKHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdEwyQ19DQ0IqIGwyY3VfZmluZF9jY2JfYnlfY2lkKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgbG9jYWxfY2lkKTsKLWV4dGVybiB0TDJDX0NDQiogbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHRMMkNfTENCKiBwX2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlbW90ZV9jaWQpOwotZXh0ZXJuIGJvb2wgbDJjX2lzX2NtZF9yZWplY3RlZCh1aW50OF90IGNtZF9jb2RlLCB1aW50OF90IGlkLCB0TDJDX0xDQiogcF9sY2IpOwotCi1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9jbWRfcmVqZWN0KHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlbV9pZCwgdWludDE2X3QgcDEsIHVpbnQxNl90IHAyKTsKLWV4dGVybiB2b2lkIGwyY3Vfc2VuZF9wZWVyX2Nvbm5lY3RfcmVxKHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25uZWN0X3JzcCh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN0YXR1cyk7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25maWdfcmVxKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25maWdfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25maWdfcmVqKHRMMkNfQ0NCKiBwX2NjYiwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2xlbiwgdWludDE2X3QgcmVqX2xlbik7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9kaXNjX3JlcSh0TDJDX0NDQiogcF9jY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9zZW5kX3BlZXJfZGlzY19yc3AodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90IHJlbW90ZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxvY2FsX2NpZCwgdWludDE2X3QgcmVtb3RlX2NpZCk7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9lY2hvX3JzcCh0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGRhdGFfbGVuKTsKLWV4dGVybiB2b2lkIGwyY3Vfc2VuZF9wZWVyX2luZm9fcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZm9fdHlwZSk7Ci1leHRlcm4gdm9pZCBsMmN1X3JlamVjdF9jb25uZWN0aW9uKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVtb3RlX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZW1faWQsIHVpbnQxNl90IHJlc3VsdCk7Ci1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9pbmZvX3JlcSh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGluZm9fdHlwZSk7Ci1leHRlcm4gdm9pZCBsMmN1X3NldF9hY2xfaGNpX2hlYWRlcihCVF9IRFIqIHBfYnVmLCB0TDJDX0NDQiogcF9jY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24odEwyQ19DQ0IqIHBfY2NiKTsKLWV4dGVybiB2b2lkIGwyY3VfZGlzY29ubmVjdF9jaG5sKHRMMkNfQ0NCKiBwX2NjYik7Ci0KLWV4dGVybiB2b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcmVxKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgbWluX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9pbnQsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KTsKLWV4dGVybiB2b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZW1faWQpOwotZXh0ZXJuIHZvaWQgbDJjdV9yZWplY3RfYmxlX2Nvbm5lY3Rpb24odEwyQ19DQ0IqIHBfY2NiLCB1aW50OF90IHJlbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCk7Ci1leHRlcm4gdm9pZCBsMmN1X3JlamVjdF9jcmVkaXRfYmFzZWRfY29ubl9yZXEodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90IHJlbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9vZl9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpOwotZXh0ZXJuIHZvaWQgbDJjdV9yZWplY3RfYmxlX2NvY19jb25uZWN0aW9uKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KTsKLWV4dGVybiB2b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXModEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpOwotZXh0ZXJuIHZvaWQgbDJjdV9zZW5kX3BlZXJfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzKAotICAgIHRMMkNfQ0NCKiBwX2NjYiwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBhY2NlcHRlZF9sY2lkcywgdWludDE2X3QgcmVzdWx0KTsKLQotZXh0ZXJuIHZvaWQgbDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcSh0TDJDX0NDQiogcF9jY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9zZW5kX3BlZXJfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHRMMkNfQ0NCKiBwX2NjYik7Ci0KLWV4dGVybiB2b2lkIGwyY3Vfc2VuZF9ibGVfcmVjb25maWdfcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpOwotZXh0ZXJuIHZvaWQgbDJjdV9zZW5kX2NyZWRpdF9iYXNlZF9yZWNvbmZpZ19yZXEodEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2RhdGEpOwotCi1leHRlcm4gdm9pZCBsMmN1X3NlbmRfcGVlcl9ibGVfZmxvd19jb250cm9sX2NyZWRpdCh0TDJDX0NDQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjcmVkaXRfdmFsdWUpOwotZXh0ZXJuIHZvaWQgbDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9kaXNjb25uX3JlcSh0TDJDX0NDQiogcF9jY2IpOwotCi1leHRlcm4gYm9vbCBsMmN1X2luaXRpYWxpemVfZml4ZWRfY2NiKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgZml4ZWRfY2lkKTsKLWV4dGVybiB2b2lkIGwyY3Vfbm9fZHluYW1pY19jY2JzKHRMMkNfTENCKiBwX2xjYik7Ci1leHRlcm4gdm9pZCBsMmN1X3Byb2Nlc3NfZml4ZWRfY2hubF9yZXNwKHRMMkNfTENCKiBwX2xjYik7Ci1leHRlcm4gYm9vbCBsMmN1X2lzX2NjYl9hY3RpdmUodEwyQ19DQ0IqIHBfY2NiKTsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGZvciBCcm9hZGNvbSBBd2FyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotZXh0ZXJuIHRMMkNfUkNCKiBsMmN1X2FsbG9jYXRlX3JjYih1aW50MTZfdCBwc20pOwotZXh0ZXJuIHRMMkNfUkNCKiBsMmN1X2ZpbmRfcmNiX2J5X3BzbSh1aW50MTZfdCBwc20pOwotZXh0ZXJuIHZvaWQgbDJjdV9yZWxlYXNlX3JjYih0TDJDX1JDQiogcF9yY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9yZWxlYXNlX2JsZV9yY2IodEwyQ19SQ0IqIHBfcmNiKTsKLWV4dGVybiB0TDJDX1JDQiogbDJjdV9hbGxvY2F0ZV9ibGVfcmNiKHVpbnQxNl90IHBzbSk7Ci1leHRlcm4gdEwyQ19SQ0IqIGwyY3VfZmluZF9ibGVfcmNiX2J5X3BzbSh1aW50MTZfdCBwc20pOwotCi1leHRlcm4gdWludDhfdCBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcmVxKHRMMkNfQ0NCKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1leHRlcm4gdm9pZCBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1leHRlcm4gdm9pZCBsMmN1X3Byb2Nlc3Nfb3VyX2NmZ19yZXEodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLWV4dGVybiB2b2lkIGwyY3VfcHJvY2Vzc19vdXJfY2ZnX3JzcCh0TDJDX0NDQiogcF9jY2IsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotCi1leHRlcm4gdEwyQ19MQ0IqIGwyY3VfZmluZF9sY2JfYnlfc3RhdGUodEwyQ19MSU5LX1NUQVRFIHN0YXRlKTsKLWV4dGVybiBib29sIGwyY3VfbGNiX2Rpc2Nvbm5lY3Rpbmcodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGwyY3VfY3JlYXRlX2Nvbm5fYnJfZWRyKHRMMkNfTENCKiBwX2xjYik7Ci1leHRlcm4gYm9vbCBsMmN1X2NyZWF0ZV9jb25uX2xlKHRMMkNfTENCKiBwX2xjYik7Ci1leHRlcm4gdm9pZCBsMmN1X2NyZWF0ZV9jb25uX2FmdGVyX3N3aXRjaCh0TDJDX0xDQiogcF9sY2IpOwotZXh0ZXJuIHZvaWQgbDJjdV9hZGp1c3Rfb3V0X21wcyh0TDJDX0NDQiogcF9jY2IpOwotCi0vKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgbDJjX2xpbmsuY2MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWV4dGVybiB2b2lkIGwyY19saW5rX3RpbWVvdXQodEwyQ19MQ0IqIHBfbGNiKTsKLWV4dGVybiB2b2lkIGwyY19pbmZvX3Jlc3BfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiB2b2lkIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKTsKLWV4dGVybiB2b2lkIGwyY19saW5rX2FkanVzdF9hbGxvY2F0aW9uKHZvaWQpOwotCi1leHRlcm4gdm9pZCBsMmNfbGlua19zZWNfY29tcChjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFzbnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLCB0QlRNX1NUQVRVUyBzdGF0dXMpOwotZXh0ZXJuIHZvaWQgbDJjX2xpbmtfc2VjX2NvbXAyKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYXNucG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLCB0QlRNX1NUQVRVUyBzdGF0dXMpOwotZXh0ZXJuIHZvaWQgbDJjX2xpbmtfYWRqdXN0X2NobmxfYWxsb2NhdGlvbih2b2lkKTsKLQotI2lmIChMMkNBUF9DT05GT1JNQU5DRV9URVNUSU5HID09IFRSVUUpCi0vKiBVc2VkIG9ubHkgZm9yIGNvbmZvcm1hbmNlIHRlc3RpbmcgKi8KLWV4dGVybiB2b2lkIGwyY3Vfc2V0X2luZm9fcnNwX21hc2sodWludDMyX3QgbWFzayk7Ci0jZW5kaWYKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGwyY19jc20uY2MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWV4dGVybiB2b2lkIGwyY19jc21fZXhlY3V0ZSh0TDJDX0NDQiogcF9jY2IsIHRMMkNFVlQgZXZlbnQsIHZvaWQqIHBfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGwyY19lbnF1ZXVlX3BlZXJfZGF0YSh0TDJDX0NDQiogcF9jY2IsIEJUX0hEUiogcF9idWYpOwotCi0vKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgbDJjX2Zjci5jYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotZXh0ZXJuIHZvaWQgbDJjX2Zjcl9jbGVhbnVwKHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBsMmNfZmNyX3Byb2NfcGR1KHRMMkNfQ0NCKiBwX2NjYiwgQlRfSERSKiBwX2J1Zik7Ci1leHRlcm4gdm9pZCBsMmNfZmNyX3Byb2NfdG91dCh0TDJDX0NDQiogcF9jY2IpOwotZXh0ZXJuIHZvaWQgbDJjX2Zjcl9wcm9jX2Fja190b3V0KHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBsMmNfZmNyX3NlbmRfU19mcmFtZSh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IGZ1bmN0aW9uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwZl9iaXQpOwotZXh0ZXJuIEJUX0hEUiogbDJjX2Zjcl9jbG9uZV9idWYoQlRfSERSKiBwX2J1ZiwgdWludDE2X3QgbmV3X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5vX29mX2J5dGVzKTsKLWV4dGVybiBib29sIGwyY19mY3JfaXNfZmxvd19jb250cm9sbGVkKHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gQlRfSERSKiBsMmNfZmNyX2dldF9uZXh0X3htaXRfc2R1X3NlZyh0TDJDX0NDQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfcGFja2V0X2xlbmd0aCk7Ci1leHRlcm4gdm9pZCBsMmNfZmNyX3N0YXJ0X3RpbWVyKHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBsMmNfbGNjX3Byb2NfcGR1KHRMMkNfQ0NCKiBwX2NjYiwgQlRfSERSKiBwX2J1Zik7Ci1leHRlcm4gQlRfSERSKiBsMmNfbGNjX2dldF9uZXh0X3htaXRfc2R1X3NlZyh0TDJDX0NDQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBsYXN0X3BpZWNlX29mX3NkdSk7Ci0KLS8qIENvbmZpZ3VyYXRpb24gbmVnb3RpYXRpb24gKi8KLWV4dGVybiB1aW50OF90IGwyY19mY3JfY2hrX2NoYW5fbW9kZXModEwyQ19DQ0IqIHBfY2NiKTsKLQotZXh0ZXJuIHZvaWQgbDJjX2Zjcl9hZGpfb3VyX3JzcF9vcHRpb25zKHRMMkNfQ0NCKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfcGVlcl9jZmcpOwotZXh0ZXJuIGJvb2wgbDJjX2Zjcl9yZW5lZ290aWF0ZV9jaGFuKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1leHRlcm4gdWludDhfdCBsMmNfZmNyX3Byb2Nlc3NfcGVlcl9jZmdfcmVxKHRMMkNfQ0NCKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1leHRlcm4gdm9pZCBsMmNfZmNyX2Fkal9tb25pdG9yX3JldHJhbl90aW1lb3V0KHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBsMmNfZmNyX3N0b3BfdGltZXIodEwyQ19DQ0IqIHBfY2NiKTsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGwyY19ibGUuY2MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWV4dGVybiBib29sIGwyY2JsZV9jcmVhdGVfY29ubih0TDJDX0xDQiogcF9sY2IpOwotZXh0ZXJuIHZvaWQgbDJjYmxlX3Byb2Nlc3Nfc2lnX2NtZCh0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBrdF9sZW4pOwotZXh0ZXJuIHZvaWQgbDJjX2JsZV9saW5rX2FkanVzdF9hbGxvY2F0aW9uKHZvaWQpOwotCi1leHRlcm4gdm9pZCBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHRMMkNfQ0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzKHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgcmVzdWx0KTsKLWV4dGVybiB2b2lkIGwyY2JsZV9zZW5kX3BlZXJfZGlzY19yZXEodEwyQ19DQ0IqIHBfY2NiKTsKLWV4dGVybiB2b2lkIGwyY2JsZV9zZW5kX2Zsb3dfY29udHJvbF9jcmVkaXQodEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjcmVkaXRfdmFsdWUpOwotZXh0ZXJuIHRMMkNBUF9MRV9SRVNVTFRfQ09ERSBsMmJsZV9zZWNfYWNjZXNzX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX1NFQ19DQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIGwyY2JsZV91cGRhdGVfZGF0YV9sZW5ndGgodEwyQ19MQ0IqIHBfbGNiKTsKLQotZXh0ZXJuIHZvaWQgbDJjdV9wcm9jZXNzX2ZpeGVkX2Rpc2NfY2JhY2sodEwyQ19MQ0IqIHBfbGNiKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9sMmNhcC9sMmNfbGluay5jYyBiL3N0YWNrL2wyY2FwL2wyY19saW5rLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQ4NmZjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2wyY2FwL2wyY19saW5rLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgZnVuY3Rpb25zIHJlbGF0aW5nIHRvIGxpbmsgbWFuYWdlbWVudC4gQSAibGluayIKLSAqICBpcyBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGlzIGRldmljZSBhbmQgYW5vdGhlciBkZXZpY2UuIE9ubHkgQUNMIGxpbmtzCi0gKiAgYXJlIG1hbmFnZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTE9HX1RBRyAibDJjX2xpbmsiCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi1ib29sIEJUTV9SZWFkUG93ZXJNb2RlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVE1fUE1fTU9ERSogcF9tb2RlKTsKLWJvb2wgYnRtX2Rldl9zdXBwb3J0X3JvbGVfc3dpdGNoKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotdEJUTV9TVEFUVVMgYnRtX3NlY19kaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKTsKLXZvaWQgYnRtX2FjbF9jcmVhdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGlua19yb2xlLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci12b2lkIGJ0bV9hY2xfcmVtb3ZlZCh1aW50MTZfdCBoYW5kbGUpOwotdm9pZCBidG1fYWNsX3NldF9wYWdpbmcoYm9vbCB2YWx1ZSk7Ci12b2lkIGJ0bV9ibGVfZGVjcmVtZW50X2xpbmtfdG9wb2xvZ3lfbWFzayh1aW50OF90IGxpbmtfcm9sZSk7Ci12b2lkIGJ0bV9zY29fYWNsX3JlbW92ZWQoY29uc3QgUmF3QWRkcmVzcyogYmRhKTsKLQotc3RhdGljIHZvaWQgbDJjX2xpbmtfc2VuZF90b19sb3dlcih0TDJDX0xDQiogcF9sY2IsIEJUX0hEUiogcF9idWYpOwotc3RhdGljIEJUX0hEUiogbDJjdV9nZXRfbmV4dF9idWZmZXJfdG9fc2VuZCh0TDJDX0xDQiogcF9sY2IpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2xpbmtfaGNpX2Nvbm5fcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIEhDSSBDb25uZWN0aW9uIFJlcXVlc3QKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQgaXMgcmVjZWl2ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2xpbmtfaGNpX2Nvbm5fcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB0TDJDX0xDQiogcF9sY2JfY3VyOwotICBpbnQgeHg7Ci0gIGJvb2wgbm9fbGlua3M7Ci0KLSAgLyogU2VlIGlmIHdlIGhhdmUgYSBsaW5rIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSByZW1vdGUgZGV2aWNlICovCi0gIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgb25lLCBjcmVhdGUgb25lIGFuZCBhY2NlcHQgdGhlIGNvbm5lY3Rpb24uICovCi0gIGlmICghcF9sY2IpIHsKLSAgICBwX2xjYiA9IGwyY3VfYWxsb2NhdGVfbGNiKGJkX2FkZHIsIGZhbHNlLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICBpZiAoIXBfbGNiKSB7Ci0gICAgICBidHNuZF9oY2ljX3JlamVjdF9jb25uKGJkX2FkZHIsIEhDSV9FUlJfSE9TVF9SRUpFQ1RfUkVTT1VSQ0VTKTsKLSAgICAgIExPR19FUlJPUigiTDJDQVAgZmFpbGVkIHRvIGFsbG9jYXRlIExDQiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vX2xpbmtzID0gdHJ1ZTsKLQotICAgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBjb25uZWN0aW9uLCBhY2NlcHQgYXMgYSBjZW50cmFsICovCi0gICAgZm9yICh4eCA9IDAsIHBfbGNiX2N1ciA9ICZsMmNiLmxjYl9wb29sWzBdOyB4eCA8IE1BWF9MMkNBUF9MSU5LUzsKLSAgICAgICAgIHh4KyssIHBfbGNiX2N1cisrKSB7Ci0gICAgICBpZiAocF9sY2JfY3VyID09IHBfbGNiKSBjb250aW51ZTsKLQotICAgICAgaWYgKHBfbGNiX2N1ci0+aW5fdXNlKSB7Ci0gICAgICAgIG5vX2xpbmtzID0gZmFsc2U7Ci0gICAgICAgIHBfbGNiLT5TZXRMaW5rUm9sZUFzQ2VudHJhbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobm9fbGlua3MpIHsKLSAgICAgIGlmICghYnRtX2Rldl9zdXBwb3J0X3JvbGVfc3dpdGNoKGJkX2FkZHIpKQotICAgICAgICBwX2xjYi0+U2V0TGlua1JvbGVBc1BlcmlwaGVyYWwoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcF9sY2ItPlNldExpbmtSb2xlQXNDZW50cmFsKCk7Ci0gICAgfQotCi0gICAgLyogVGVsbCB0aGUgb3RoZXIgc2lkZSB3ZSBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gKi8KLSAgICBhY2xfYWNjZXB0X2Nvbm5lY3Rpb25fcmVxdWVzdChiZF9hZGRyLCBwX2xjYi0+TGlua1JvbGUoKSk7Ci0KLSAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9DT05ORUNUSU5HOwotCi0gICAgLyogU3RhcnQgYSB0aW1lciB3YWl0aW5nIGZvciBjb25uZWN0IGNvbXBsZXRlICovCi0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5sMmNfbGNiX3RpbWVyLCBMMkNBUF9MSU5LX0NPTk5FQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgbDJjX2xjYl90aW1lcl90aW1lb3V0LCBwX2xjYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogV2UgYWxyZWFkeSBoYWQgYSBsaW5rIGNvbnRyb2wgYmxvY2suIENoZWNrIHdoYXQgc3RhdGUgaXQgaXMgaW4KLSAgICovCi0gIGlmICgocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RJTkcpIHx8Ci0gICAgICAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RfSE9MRElORykpIHsKLSAgICBpZiAoIWJ0bV9kZXZfc3VwcG9ydF9yb2xlX3N3aXRjaChiZF9hZGRyKSkKLSAgICAgIHBfbGNiLT5TZXRMaW5rUm9sZUFzUGVyaXBoZXJhbCgpOwotICAgIGVsc2UKLSAgICAgIHBfbGNiLT5TZXRMaW5rUm9sZUFzQ2VudHJhbCgpOwotCi0gICAgYWNsX2FjY2VwdF9jb25uZWN0aW9uX3JlcXVlc3QoYmRfYWRkciwgcF9sY2ItPkxpbmtSb2xlKCkpOwotCi0gICAgcF9sY2ItPmxpbmtfc3RhdGUgPSBMU1RfQ09OTkVDVElORzsKLSAgfSBlbHNlIGlmIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfRElTQ09OTkVDVElORykgewotICAgIGFjbF9yZWplY3RfY29ubmVjdGlvbl9yZXF1ZXN0KGJkX2FkZHIsIEhDSV9FUlJfSE9TVF9SRUpFQ1RfREVWSUNFKTsKLSAgfSBlbHNlIHsKLSAgICBMT0dfRVJST1IoIkwyQ0FQIGdvdCBjb25uX3JlcSB3aGlsZSBjb25uZWN0ZWQgKHN0YXRlOiVkKS4gUmVqZWN0IGl0IiwKLSAgICAgICAgICAgICAgcF9sY2ItPmxpbmtfc3RhdGUpOwotICAgIGFjbF9yZWplY3RfY29ubmVjdGlvbl9yZXF1ZXN0KGJkX2FkZHIsIEhDSV9FUlJfQ09OTkVDVElPTl9FWElTVFMpOwotICB9Ci19Ci0KLXZvaWQgbDJjX2xpbmtfaGNpX2Nvbm5fY29tcCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdEwyQ19DT05OX0lORk8gY2k7Ci0gIHRMMkNfTENCKiBwX2xjYjsKLSAgdEwyQ19DQ0IqIHBfY2NiOwotCi0gIC8qIFNhdmUgdGhlIHBhcmFtZXRlcnMgKi8KLSAgY2kuc3RhdHVzID0gc3RhdHVzOwotICBjaS5iZF9hZGRyID0gcF9iZGE7Ci0KLSAgLyogU2VlIGlmIHdlIGhhdmUgYSBsaW5rIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSByZW1vdGUgZGV2aWNlICovCi0gIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKGNpLmJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgb25lLCBhbGxvY2F0ZSBvbmUgKi8KLSAgaWYgKHBfbGNiID09IG51bGxwdHIpIHsKLSAgICBwX2xjYiA9IGwyY3VfYWxsb2NhdGVfbGNiKGNpLmJkX2FkZHIsIGZhbHNlLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICBpZiAocF9sY2IgPT0gbnVsbHB0cikgewotICAgICAgTE9HX1dBUk4oIkZhaWxlZCB0byBhbGxvY2F0ZSBhbiBMQ0IiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX0RFQlVHKCJBbGxvY2F0ZWQgbDJjYXAgY29udHJvbCBibG9jayBmb3IgbmV3IGNvbm5lY3Rpb24gc3RhdGU6JXMiLAotICAgICAgICAgICAgICBsaW5rX3N0YXRlX3RleHQocF9sY2ItPmxpbmtfc3RhdGUpLmNfc3RyKCkpOwotICAgIHBfbGNiLT5saW5rX3N0YXRlID0gTFNUX0NPTk5FQ1RJTkc7Ci0gIH0KLQotICBpZiAoKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQpICYmCi0gICAgICAoc3RhdHVzID09IEhDSV9FUlJfQ09OTkVDVElPTl9FWElTVFMpKSB7Ci0gICAgTE9HX1dBUk4oIkNvbm5lY3Rpb24gYWxyZWFkeSBleGlzdHMgaGFuZGxlOjB4JTA0eCIsIGhhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKHBfbGNiLT5saW5rX3N0YXRlICE9IExTVF9DT05ORUNUSU5HKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiTGluayByZWNlaXZlZCB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gY29tcGxldGUgc3RhdGU6JXMgc3RhdHVzOiVzICIKLSAgICAgICAgImhhbmRsZToweCUwNHgiLAotICAgICAgICBsaW5rX3N0YXRlX3RleHQocF9sY2ItPmxpbmtfc3RhdGUpLmNfc3RyKCksCi0gICAgICAgIGhjaV9lcnJvcl9jb2RlX3RleHQoc3RhdHVzKS5jX3N0cigpLCBwX2xjYi0+SGFuZGxlKCkpOwotICAgIGlmIChzdGF0dXMgIT0gSENJX1NVQ0NFU1MpIHsKLSAgICAgIExPR19FUlJPUigiRGlzY29ubmVjdGluZy4uLiIpOwotICAgICAgbDJjX2xpbmtfaGNpX2Rpc2NfY29tcChwX2xjYi0+SGFuZGxlKCksIHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFNhdmUgdGhlIGhhbmRsZSAqLwotICBsMmN1X3NldF9sY2JfaGFuZGxlKCpwX2xjYiwgaGFuZGxlKTsKLQotICBpZiAoY2kuc3RhdHVzID09IEhDSV9TVUNDRVNTKSB7Ci0gICAgLyogQ29ubmVjdGVkIE9LLiBDaGFuZ2Ugc3RhdGUgdG8gY29ubmVjdGVkICovCi0gICAgcF9sY2ItPmxpbmtfc3RhdGUgPSBMU1RfQ09OTkVDVEVEOwotCi0gICAgLyogR2V0IHRoZSBwZWVyIGluZm9ybWF0aW9uIGlmIHRoZSBsMmNhcCBmbG93LWNvbnRyb2wvcnRyYW5zIGlzIHN1cHBvcnRlZCAqLwotICAgIGwyY3Vfc2VuZF9wZWVyX2luZm9fcmVxKHBfbGNiLCBMMkNBUF9FWFRFTkRFRF9GRUFUVVJFU19JTkZPX1RZUEUpOwotCi0gICAgaWYgKHBfbGNiLT5Jc0JvbmRpbmcoKSkgewotICAgICAgTE9HX0RFQlVHKCJMaW5rIGlzIGRlZGljYXRlZCBib25kaW5nIGhhbmRsZToweCUwNHgiLCBwX2xjYi0+SGFuZGxlKCkpOwotICAgICAgaWYgKGwyY3Vfc3RhcnRfcG9zdF9ib25kX3RpbWVyKGhhbmRsZSkpIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgdGhlIHRpbWVvdXRzIGluIHRoZSBob2xkIHF1ZXVlICovCi0gICAgbDJjX3Byb2Nlc3NfaGVsZF9wYWNrZXRzKGZhbHNlKTsKLQotICAgIGFsYXJtX2NhbmNlbChwX2xjYi0+bDJjX2xjYl90aW1lcik7Ci0KLSAgICAvKiBGb3IgYWxsIGNoYW5uZWxzLCBzZW5kIHRoZSBldmVudCB0aHJvdWdoIHRoZWlyIEZTTXMgKi8KLSAgICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7Ci0gICAgICAgICBwX2NjYiA9IHBfY2NiLT5wX25leHRfY2NiKSB7Ci0gICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MUF9DT05ORUNUX0NGTSwgJmNpKTsKLSAgICB9Ci0KLSAgICBpZiAoIXBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2IpIHsKLSAgICAgIHVpbnQ2NF90IHRpbWVvdXRfbXMgPSBMMkNBUF9MSU5LX1NUQVJUVVBfVE9VVCAqIDEwMDA7Ci0gICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9sY2ItPmwyY19sY2JfdGltZXIsIHRpbWVvdXRfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2xjYl90aW1lcl90aW1lb3V0LCBwX2xjYik7Ci0gICAgfQotICB9Ci0gIC8qIE1heCBudW1iZXIgb2YgYWNsIGNvbm5lY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhlcmUncyBhbiBsY2IgZGlzY29ubmVjdGluZyBzZXQgdGhpcyBvbmUgdG8gaG9sZGluZyAqLwotICBlbHNlIGlmICgoY2kuc3RhdHVzID09IEhDSV9FUlJfTUFYX05VTV9PRl9DT05ORUNUSU9OUykgJiYKLSAgICAgICAgICAgbDJjdV9sY2JfZGlzY29ubmVjdGluZygpKSB7Ci0gICAgTE9HX1dBUk4oIkRlbGF5aW5nIGNvbm5lY3Rpb24gYXMgcmVhY2hlZCBtYXggbnVtYmVyIG9mIGxpbmtzOiV1IiwKLSAgICAgICAgICAgICBIQ0lfRVJSX01BWF9OVU1fT0ZfQ09OTkVDVElPTlMpOwotICAgIHBfbGNiLT5saW5rX3N0YXRlID0gTFNUX0NPTk5FQ1RfSE9MRElORzsKLSAgICBwX2xjYi0+SW52YWxpZGF0ZUhhbmRsZSgpOwotICB9IGVsc2UgewotICAgIC8qIEp1c3QgaW4gY2FzZSBhcHAgZGVjaWRlcyB0byB0cnkgYWdhaW4gaW4gdGhlIGNhbGxiYWNrIGNvbnRleHQgKi8KLSAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9ESVNDT05ORUNUSU5HOwotCi0gICAgLyogQ29ubmVjdGlvbiBmYWlsZWQuIEZvciBhbGwgY2hhbm5lbHMsIHNlbmQgdGhlIGV2ZW50IHRocm91Z2ggKi8KLSAgICAvKiB0aGVpciBGU01zLiBUaGUgQ0NCcyBzaG91bGQgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgTENCICAqLwotICAgIGZvciAocF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyBwX2NjYjspIHsKLSAgICAgIHRMMkNfQ0NCKiBwbiA9IHBfY2NiLT5wX25leHRfY2NiOwotCi0gICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MUF9DT05ORUNUX0NGTV9ORUcsICZjaSk7Ci0KLSAgICAgIHBfY2NiID0gcG47Ci0gICAgfQotCi0gICAgTE9HX0lORk8oIkRpc2Nvbm5lY3RpbmcgbGluayBoYW5kbGU6MHglMDR4IHN0YXR1czolcyIsIHBfbGNiLT5IYW5kbGUoKSwKLSAgICAgICAgICAgICBoY2lfZXJyb3JfY29kZV90ZXh0KHN0YXR1cykuY19zdHIoKSk7Ci0gICAgcF9sY2ItPlNldERpc2Nvbm5lY3RSZWFzb24oc3RhdHVzKTsKLSAgICAvKiBSZWxlYXNlIHRoZSBMQ0IgKi8KLSAgICBpZiAocF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYiA9PSBOVUxMKQotICAgICAgbDJjdV9yZWxlYXNlX2xjYihwX2xjYik7Ci0gICAgZWxzZSAvKiB0aGVyZSBhcmUgYW55IENDQnMgcmVtYWluaW5nICovCi0gICAgewotICAgICAgaWYgKGNpLnN0YXR1cyA9PSBIQ0lfRVJSX0NPTk5FQ1RJT05fRVhJU1RTKSB7Ci0gICAgICAgIC8qIHdlIGFyZSBpbiBjb2xsaXNpb24gc2l0dWF0aW9uLCB3YWl0IGZvciBjb25uZWN0dGlvbiByZXF1ZXN0IGZyb20KLSAgICAgICAgICogY29udHJvbGxlciAqLwotICAgICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9DT05ORUNUSU5HOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbDJjdV9jcmVhdGVfY29ubl9icl9lZHIocF9sY2IpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2xpbmtfc2VjX2NvbXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVxdWlyZWQgc2VjdXJpdHkgcHJvY2VkdXJlcwotICogICAgICAgICAgICAgICAgICBhcmUgY29tcGxldGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19saW5rX3NlY19jb21wKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgc3RhdHVzKSB7Ci0gIGwyY19saW5rX3NlY19jb21wMigqcF9iZGEsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgc3RhdHVzKTsKLX0KLQotdm9pZCBsMmNfbGlua19zZWNfY29tcDIoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1RBVFVTIHN0YXR1cykgewotICB0TDJDX0NPTk5fSU5GTyBjaTsKLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB0TDJDX0NDQiogcF9jY2I7Ci0gIHRMMkNfQ0NCKiBwX25leHRfY2NiOwotCi0gIExPR19ERUJVRygiYnRtX3N0YXR1cz0lcywgQkRfQUREUj0lcywgdHJhbnNwb3J0PSVzIiwKLSAgICAgICAgICAgIGJ0bV9zdGF0dXNfdGV4dChzdGF0dXMpLmNfc3RyKCksIFBSSVZBVEVfQUREUkVTUyhwX2JkYSksCi0gICAgICAgICAgICBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCkpOwotCi0gIGlmIChzdGF0dXMgPT0gQlRNX1NVQ0NFU1NfTk9fU0VDVVJJVFkpIHsKLSAgICBzdGF0dXMgPSBCVE1fU1VDQ0VTUzsKLSAgfQotCi0gIC8qIFNhdmUgdGhlIHBhcmFtZXRlcnMgKi8KLSAgY2kuc3RhdHVzID0gc3RhdHVzOwotICBjaS5iZF9hZGRyID0gcF9iZGE7Ci0KLSAgcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocF9iZGEsIHRyYW5zcG9ydCk7Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBvbmUsIHRoaXMgaXMgYW4gZXJyb3IgKi8KLSAgaWYgKCFwX2xjYikgewotICAgIExPR19XQVJOKCJMMkNBUCBnb3Qgc2VjX2NvbXAgZm9yIHVua25vd24gQkRfQUREUiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIE1hdGNoIHBfY2NiIHdpdGggcF9yZWZfZGF0YSByZXR1cm5lZCBieSBzZWMgbWFuYWdlciAqLwotICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7IHBfY2NiID0gcF9uZXh0X2NjYikgewotICAgIHBfbmV4dF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYjsKLQotICAgIGlmIChwX2NjYiA9PSBwX3JlZl9kYXRhKSB7Ci0gICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICBjYXNlIEJUTV9TVUNDRVNTOgotICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX1NFQ19DT01QLCAmY2kpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlRNX0RFTEFZX0NIRUNLOgotICAgICAgICAgIC8qIHN0YXJ0IGEgdGltZXIgLSBlbmNyeXB0aW9uIGNoYW5nZSBub3QgcmVjZWl2ZWQgYmVmb3JlIEwyQ0FQIGNvbm5lY3QKLSAgICAgICAgICAgKiByZXEgKi8KLSAgICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPmwyY19jY2JfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0RFTEFZX0NIRUNLX1NNNF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfY2NiX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9TRUNfQ09NUF9ORUcsICZjaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19saW5rX2hjaV9kaXNjX2NvbXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gSENJIERpc2Nvbm5lY3QgQ29tcGxldGUKLSAqICAgICAgICAgICAgICAgICAgZXZlbnQgaXMgcmVjZWl2ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHRoZSBsaW5rIGlzIGtub3duIGFib3V0LCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgbDJjX2xpbmtfaGNpX2Rpc2NfY29tcCh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUkVBU09OIHJlYXNvbikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2hhbmRsZShoYW5kbGUpOwotICB0TDJDX0NDQiogcF9jY2I7Ci0gIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgYm9vbCBsY2JfaXNfZnJlZSA9IHRydWU7Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBvbmUsIG1heWJlIGFuIFNDTyBsaW5rLiBTZW5kIHRvIE1NICovCi0gIGlmICghcF9sY2IpIHsKLSAgICBzdGF0dXMgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBwX2xjYi0+U2V0RGlzY29ubmVjdFJlYXNvbihyZWFzb24pOwotCi0gICAgLyogSnVzdCBpbiBjYXNlIGFwcCBkZWNpZGVzIHRvIHRyeSBhZ2FpbiBpbiB0aGUgY2FsbGJhY2sgY29udGV4dCAqLwotICAgIHBfbGNiLT5saW5rX3N0YXRlID0gTFNUX0RJU0NPTk5FQ1RJTkc7Ci0KLSAgICAvKiBDaGVjayBmb3IgQkxFIGFuZCBoYW5kbGUgdGhhdCBkaWZmZXJlbnRseSAqLwotICAgIGlmIChwX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkKLSAgICAgIGJ0bV9ibGVfZGVjcmVtZW50X2xpbmtfdG9wb2xvZ3lfbWFzayhwX2xjYi0+TGlua1JvbGUoKSk7Ci0gICAgLyogTGluayBpcyBkaXNjb25uZWN0ZWQuIEZvciBhbGwgY2hhbm5lbHMsIHNlbmQgdGhlIGV2ZW50IHRocm91Z2ggKi8KLSAgICAvKiB0aGVpciBGU01zLiBUaGUgQ0NCcyBzaG91bGQgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgTENCICAgICAqLwotICAgIGZvciAocF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyBwX2NjYjspIHsKLSAgICAgIHRMMkNfQ0NCKiBwbiA9IHBfY2NiLT5wX25leHRfY2NiOwotCi0gICAgICAvKiBLZWVwIGNvbm5lY3QgcGVuZGluZyBjb250cm9sIGJsb2NrIChpZiBleGlzdHMpCi0gICAgICAgKiBQb3NzaWJsZSBSYWNlIGNvbmRpdGlvbiB3aGVuIGEgcmVjb25uZWN0IG9jY3VycwotICAgICAgICogb24gdGhlIGNoYW5uZWwgZHVyaW5nIGEgZGlzY29ubmVjdCBvZiBsaW5rLiBUaGlzCi0gICAgICAgKiBjY2Igd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJldHJpZWQgYWZ0ZXIgbGluayBkaXNjb25uZWN0Ci0gICAgICAgKiBhcnJpdmVzCi0gICAgICAgKi8KLSAgICAgIGlmIChwX2NjYiAhPSBwX2xjYi0+cF9wZW5kaW5nX2NjYikgewotICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MUF9ESVNDT05ORUNUX0lORCwgJnJlYXNvbik7Ci0gICAgICB9Ci0gICAgICBwX2NjYiA9IHBuOwotICAgIH0KLQotICAgIGlmIChwX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpCi0gICAgICAvKiBUZWxsIFNDTyBtYW5hZ2VtZW50IHRvIGRyb3AgYW55IFNDT3Mgb24gdGhpcyBBQ0wgKi8KLSAgICAgIGJ0bV9zY29fYWNsX3JlbW92ZWQoJnBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0KLSAgICAvKiBJZiB3YWl0aW5nIGZvciBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3QgaXMgcGVuZGluZyBzdGFydCB0aGUgcmVjb25uZWN0Ci0gICAgICAgbm93Ci0gICAgICAgcmFjZSBjb25kaXRpb24gd2hlcmUgbGF5ZXIgYWJvdmUgaXNzdWVkIGNvbm5lY3QgcmVxdWVzdCBvbiBsaW5rIHRoYXQgd2FzCi0gICAgICAgZGlzY29ubmVjdGluZwotICAgICAqLwotICAgIGlmIChwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiICE9IE5VTEwgfHwgcF9sY2ItPnBfcGVuZGluZ19jY2IpIHsKLSAgICAgIExPR19ERUJVRygibDJjX2xpbmtfaGNpX2Rpc2NfY29tcDogUmVzdGFydGluZyBwZW5kaW5nIEFDTCByZXF1ZXN0Iik7Ci0gICAgICAvKiBSZWxlYXNlIGFueSBoZWxkIGJ1ZmZlcnMgKi8KLSAgICAgIHdoaWxlICghbGlzdF9pc19lbXB0eShwX2xjYi0+bGlua194bWl0X2RhdGFfcSkpIHsKLSAgICAgICAgQlRfSERSKiBwX2J1ZiA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxCVF9IRFIqPihsaXN0X2Zyb250KHBfbGNiLT5saW5rX3htaXRfZGF0YV9xKSk7Ci0gICAgICAgIGxpc3RfcmVtb3ZlKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xLCBwX2J1Zik7Ci0gICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIH0KLSAgICAgIC8qIGZvciBMRSBsaW5rLCBhbHdheXMgZHJvcCBhbmQgcmUtb3BlbiB0byBlbnN1cmUgdG8gZ2V0IExFIHJlbW90ZSBmZWF0dXJlCi0gICAgICAgKi8KLSAgICAgIGlmIChwX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBidG1fYWNsX3JlbW92ZWQoaGFuZGxlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byByZS11c2UgdGhlIExDQiB3aXRob3V0IGRyb3BwaW5nIGl0LCByZWxlYXNlIGFsbAotICAgICAgICBmaXhlZCBjaGFubmVscwotICAgICAgICBoZXJlICovCi0gICAgICAgIGludCB4eDsKLSAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgTDJDQVBfTlVNX0ZJWEVEX0NITkxTOyB4eCsrKSB7Ci0gICAgICAgICAgaWYgKHBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdICYmCi0gICAgICAgICAgICAgIHBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdICE9IHBfbGNiLT5wX3BlbmRpbmdfY2NiKSB7Ci0gICAgICAgICAgICAoKmwyY2IuZml4ZWRfcmVnW3h4XS5wTDJDQV9GaXhlZENvbm5fQ2IpKAotICAgICAgICAgICAgICAgIHh4ICsgTDJDQVBfRklSU1RfRklYRURfQ0hOTCwgcF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBwX2xjYi0+RGlzY29ubmVjdFJlYXNvbigpLCBwX2xjYi0+dHJhbnNwb3J0KTsKLSAgICAgICAgICAgIGlmIChwX2xjYi0+cF9maXhlZF9jY2JzW3h4XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHBfZml4ZWRfY2Nic1slZF0gaXMgTlVMTCByZW1vdGVfYmRfYWRkciA9ICVzICIKLSAgICAgICAgICAgICAgICAgICJwX2xjYiA9ICVwIGluX3VzZSA9ICVkIGxpbmtfc3RhdGUgPSAlZCBoYW5kbGUgPSAlZCAiCi0gICAgICAgICAgICAgICAgICAibGlua19yb2xlID0gJWQgaXNfYm9uZGluZyA9ICVkIGRpc2NfcmVhc29uID0gJWQgdHJhbnNwb3J0ID0gIgotICAgICAgICAgICAgICAgICAgIiVkIiwKLSAgICAgICAgICAgICAgICAgIHh4LCBwX2xjYi0+cmVtb3RlX2JkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBwX2xjYiwKLSAgICAgICAgICAgICAgICAgIHBfbGNiLT5pbl91c2UsIHBfbGNiLT5saW5rX3N0YXRlLCBwX2xjYi0+SGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICBwX2xjYi0+TGlua1JvbGUoKSwgcF9sY2ItPklzQm9uZGluZygpLAotICAgICAgICAgICAgICAgICAgcF9sY2ItPkRpc2Nvbm5lY3RSZWFzb24oKSwgcF9sY2ItPnRyYW5zcG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDSyhwX2xjYi0+cF9maXhlZF9jY2JzW3h4XSAhPSBOVUxMKTsKLSAgICAgICAgICAgIGwyY3VfcmVsZWFzZV9jY2IocF9sY2ItPnBfZml4ZWRfY2Nic1t4eF0pOwotCi0gICAgICAgICAgICBwX2xjYi0+cF9maXhlZF9jY2JzW3h4XSA9IE5VTEw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgaWYgKGwyY3VfY3JlYXRlX2Nvbm5fbGUocF9sY2IpKQotICAgICAgICAgIGxjYl9pc19mcmVlID0gZmFsc2U7IC8qIHN0aWxsIHVzaW5nIHRoaXMgbGNiICovCi0gICAgICB9IGVsc2UgewotICAgICAgICBsMmN1X2NyZWF0ZV9jb25uX2JyX2VkcihwX2xjYik7Ci0gICAgICAgIGxjYl9pc19mcmVlID0gZmFsc2U7IC8qIHN0aWxsIHVzaW5nIHRoaXMgbGNiICovCi0gICAgICB9Ci0gICAgfQotCi0gICAgcF9sY2ItPnBfcGVuZGluZ19jY2IgPSBOVUxMOwotCi0gICAgLyogUmVsZWFzZSB0aGUgTENCICovCi0gICAgaWYgKGxjYl9pc19mcmVlKSBsMmN1X3JlbGVhc2VfbGNiKHBfbGNiKTsKLSAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYSBmcmVlIGFjbCBjb25uZWN0aW9uLCBzZWUgaWYgYW55IGxjYnMgYXJlIHBlbmRpbmcgKi8KLSAgaWYgKGxjYl9pc19mcmVlICYmCi0gICAgICAoKHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9zdGF0ZShMU1RfQ09OTkVDVF9IT0xESU5HKSkgIT0gTlVMTCkpIHsKLSAgICAvKiB3ZSBmb3VuZCBvbmUtLSBjcmVhdGUgYSBjb25uZWN0aW9uICovCi0gICAgbDJjdV9jcmVhdGVfY29ubl9icl9lZHIocF9sY2IpOwotICB9Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19saW5rX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBsaW5rIHRpbWVyIGV4cGlyZXMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfbGlua190aW1lb3V0KHRMMkNfTENCKiBwX2xjYikgewotICB0TDJDX0NDQiogcF9jY2I7Ci0gIHRCVE1fU1RBVFVTIHJjOwotCi0gIExPR19ERUJVRygiTDJDQVAgLSBsMmNfbGlua190aW1lb3V0KCkgbGluayBzdGF0ZTolcyBpc19ib25kaW5nOiVzIiwKLSAgICAgICAgICAgIGxpbmtfc3RhdGVfdGV4dChwX2xjYi0+bGlua19zdGF0ZSkuY19zdHIoKSwKLSAgICAgICAgICAgIGxvZ2Jvb2wocF9sY2ItPklzQm9uZGluZygpKS5jX3N0cigpKTsKLQotICAvKiBJZiBsaW5rIHdhcyBjb25uZWN0aW5nIG9yIGRpc2Nvbm5lY3RpbmcsIGNsZWFyIGFsbCBjaGFubmVscyBhbmQgZHJvcCB0aGUKLSAgICogTENCICovCi0gIGlmICgocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RJTkdfV0FJVF9TV0lUQ0gpIHx8Ci0gICAgICAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RJTkcpIHx8Ci0gICAgICAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RfSE9MRElORykgfHwKLSAgICAgIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfRElTQ09OTkVDVElORykpIHsKLSAgICBwX2xjYi0+cF9wZW5kaW5nX2NjYiA9IE5VTEw7Ci0KLSAgICAvKiBGb3IgYWxsIGNoYW5uZWxzLCBzZW5kIGEgZGlzY29ubmVjdCBpbmRpY2F0aW9uIGV2ZW50IHRocm91Z2ggKi8KLSAgICAvKiB0aGVpciBGU01zLiBUaGUgQ0NCcyBzaG91bGQgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgTENCICAgKi8KLSAgICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7KSB7Ci0gICAgICB0TDJDX0NDQiogcG4gPSBwX2NjYi0+cF9uZXh0X2NjYjsKLQotICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTFBfRElTQ09OTkVDVF9JTkQsIE5VTEwpOwotCi0gICAgICBwX2NjYiA9IHBuOwotICAgIH0KLQotICAgIC8qIFJlbGVhc2UgdGhlIExDQiAqLwotICAgIGwyY3VfcmVsZWFzZV9sY2IocF9sY2IpOwotICB9Ci0KLSAgLyogSWYgbGluayBpcyBjb25uZWN0ZWQsIGNoZWNrIGZvciBpbmFjdGl2aXR5IHRpbWVvdXQgKi8KLSAgaWYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQpIHsKLSAgICAvKiBJZiBubyBjaGFubmVscyBpbiB1c2UsIGRyb3AgdGhlIGxpbmsuICovCi0gICAgaWYgKCFwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiKSB7Ci0gICAgICB1aW50NjRfdCB0aW1lb3V0X21zOwotICAgICAgYm9vbCBzdGFydF90aW1lb3V0ID0gdHJ1ZTsKLQotICAgICAgTE9HX1dBUk4oIlRPRE86IFJlbW92ZSB0aGlzIGNhbGxiYWNrIGludG8gYmNtX3NlY19kaXNjb25uZWN0Iik7Ci0gICAgICByYyA9IGJ0bV9zZWNfZGlzY29ubmVjdChwX2xjYi0+SGFuZGxlKCksIEhDSV9FUlJfUEVFUl9VU0VSKTsKLQotICAgICAgaWYgKHJjID09IEJUTV9DTURfU1RPUkVEKSB7Ci0gICAgICAgIC8qIFNlY3VyaXR5IE1hbmFnZXIgd2lsbCB0YWtlIGNhcmUgb2YgZGlzY29ubmVjdGluZywgc3RhdGUgd2lsbCBiZQotICAgICAgICAgKiB1cGRhdGVkIGF0IHRoYXQgdGltZSAqLwotICAgICAgICBzdGFydF90aW1lb3V0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKHJjID09IEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9ESVNDT05ORUNUSU5HOwotICAgICAgICB0aW1lb3V0X21zID0gTDJDQVBfTElOS19ESVNDT05ORUNUX1RJTUVPVVRfTVM7Ci0gICAgICB9IGVsc2UgaWYgKHJjID09IEJUTV9TVUNDRVNTKSB7Ci0gICAgICAgIGwyY3VfcHJvY2Vzc19maXhlZF9kaXNjX2NiYWNrKHBfbGNiKTsKLSAgICAgICAgLyogQlRNIFNFQyB3aWxsIG1ha2Ugc3VyZSB0aGF0IGxpbmsgaXMgcmVsZWFzZSAocHJvYmFibHkgYWZ0ZXIgcGFpcmluZwotICAgICAgICAgKiBpcyBkb25lKSAqLwotICAgICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9ESVNDT05ORUNUSU5HOwotICAgICAgICBzdGFydF90aW1lb3V0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKHJjID09IEJUTV9CVVNZKSB7Ci0gICAgICAgIC8qIEJUTSBpcyBzdGlsbCBleGVjdXRpbmcgc2VjdXJpdHkgcHJvY2Vzcy4gTGV0IGxjYiBzdGF5IGFzIGNvbm5lY3RlZCAqLwotICAgICAgICBzdGFydF90aW1lb3V0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKHBfbGNiLT5Jc0JvbmRpbmcoKSkgewotICAgICAgICBhY2xfZGlzY29ubmVjdF9mcm9tX2hhbmRsZShwX2xjYi0+SGFuZGxlKCksIEhDSV9FUlJfUEVFUl9VU0VSKTsKLSAgICAgICAgbDJjdV9wcm9jZXNzX2ZpeGVkX2Rpc2NfY2JhY2socF9sY2IpOwotICAgICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9ESVNDT05ORUNUSU5HOwotICAgICAgICB0aW1lb3V0X21zID0gTDJDQVBfTElOS19ESVNDT05ORUNUX1RJTUVPVVRfTVM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBwcm9iYWJseSBubyBidWZmZXIgdG8gc2VuZCBkaXNjb25uZWN0ICovCi0gICAgICAgIHRpbWVvdXRfbXMgPSBCVF8xU0VDX1RJTUVPVVRfTVM7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdGFydF90aW1lb3V0KSB7Ci0gICAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2xjYi0+bDJjX2xjYl90aW1lciwgdGltZW91dF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19sY2JfdGltZXJfdGltZW91dCwgcF9sY2IpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDaGVjayBpbiBjYXNlIHdlIHdlcmUgZmxvdyBjb250cm9sbGVkICovCi0gICAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIE5VTEwpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2luZm9fcmVzcF90aW1lcl90aW1lb3V0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGluZm8gcmVxdWVzdCB0aW1lcyBvdXQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfaW5mb19yZXNwX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgewotICB0TDJDX0xDQiogcF9sY2IgPSAodEwyQ19MQ0IqKWRhdGE7Ci0gIHRMMkNfQ0NCKiBwX2NjYjsKLSAgdEwyQ19DT05OX0lORk8gY2k7Ci0KLSAgLyogSWYgd2UgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGluZm8gcmVzcG9uc2UsIGp1c3QgY29udGludWUgdXNpbmcgYmFzaWMgaWYKLSAgICogYWxsb3dlZCAqLwotICBpZiAocF9sY2ItPnc0X2luZm9fcnNwKSB7Ci0gICAgLyogSWYgd2FpdGluZyBmb3Igc2VjdXJpdHkgY29tcGxldGUsIHJlc3RhcnQgdGhlIGluZm8gcmVzcG9uc2UgdGltZXIgKi8KLSAgICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7Ci0gICAgICAgICBwX2NjYiA9IHBfY2NiLT5wX25leHRfY2NiKSB7Ci0gICAgICBpZiAoKHBfY2NiLT5jaG5sX3N0YXRlID09IENTVF9PUklHX1c0X1NFQ19DT01QKSB8fAotICAgICAgICAgIChwX2NjYi0+Y2hubF9zdGF0ZSA9PSBDU1RfVEVSTV9XNF9TRUNfQ09NUCkpIHsKLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5pbmZvX3Jlc3BfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9XQUlUX0lORk9fUlNQX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfaW5mb19yZXNwX3RpbWVyX3RpbWVvdXQsIHBfbGNiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHBfbGNiLT53NF9pbmZvX3JzcCA9IGZhbHNlOwotCi0gICAgLyogSWYgbGluayBpcyBpbiBwcm9jZXNzIG9mIGJlaW5nIGJyb3VnaHQgdXAgKi8KLSAgICBpZiAoKHBfbGNiLT5saW5rX3N0YXRlICE9IExTVF9ESVNDT05ORUNURUQpICYmCi0gICAgICAgIChwX2xjYi0+bGlua19zdGF0ZSAhPSBMU1RfRElTQ09OTkVDVElORykpIHsKLSAgICAgIC8qIE5vdGlmeSBhY3RpdmUgY2hhbm5lbHMgdGhhdCBwZWVyIGluZm8gaXMgZmluaXNoZWQgKi8KLSAgICAgIGlmIChwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiKSB7Ci0gICAgICAgIGNpLnN0YXR1cyA9IEhDSV9TVUNDRVNTOwotICAgICAgICBjaS5iZF9hZGRyID0gcF9sY2ItPnJlbW90ZV9iZF9hZGRyOwotCi0gICAgICAgIGZvciAocF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyBwX2NjYjsKLSAgICAgICAgICAgICBwX2NjYiA9IHBfY2NiLT5wX25leHRfY2NiKSB7Ci0gICAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfSU5GT19SU1AsICZjaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19saW5rX2FkanVzdF9hbGxvY2F0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbGluayBpcyBjcmVhdGVkIG9yIHJlbW92ZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gY2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcGFja2V0cyBlYWNoIGxpbmsgbWF5IHNlbmQgdG8KLSAqICAgICAgICAgICAgICAgICAgdGhlIEhDSSB3aXRob3V0IGFuIGFjayBjb21pbmcgYmFjay4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSwgdGhpcyBpcyBhIHNpbXBsZSBhbGxvY2F0aW9uLCBkaXZpZGluZyB0aGUKLSAqICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIENvbnRyb2xsZXIgUGFja2V0cyBieSB0aGUgbnVtYmVyIG9mIGxpbmtzLiBJbgotICogICAgICAgICAgICAgICAgICB0aGUgZnV0dXJlLCBRT1MgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24odm9pZCkgewotICB1aW50MTZfdCBxcSwgeXksIHFxX3JlbWFpbmRlcjsKLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB1aW50MTZfdCBoaV9xdW90YSwgbG93X3F1b3RhOwotICB1aW50MTZfdCBudW1fbG93cHJpX2xpbmtzID0gMDsKLSAgdWludDE2X3QgbnVtX2hpcHJpX2xpbmtzID0gMDsKLSAgdWludDE2X3QgY29udHJvbGxlcl94bWl0X3F1b3RhID0gbDJjYi5udW1fbG1fYWNsX2J1ZnM7Ci0gIHVpbnQxNl90IGhpZ2hfcHJpX2xpbmtfcXVvdGEgPSBMMkNBUF9ISUdIX1BSSV9NSU5fWE1JVF9RVU9UQV9BOwotICBib29sIGlzX3NoYXJlX2J1ZmZlciA9Ci0gICAgICAobDJjYi5udW1fbG1fYmxlX2J1ZnMgPT0gTDJDX0RFRl9OVU1fQkxFX0JVRl9TSEFSRUQpID8gdHJ1ZSA6IGZhbHNlOwotCi0gIC8qIElmIG5vIGxpbmtzIGFjdGl2ZSwgcmVzZXQgYnVmZmVyIHF1b3RhcyBhbmQgY29udHJvbGxlciBidWZmZXJzICovCi0gIGlmIChsMmNiLm51bV91c2VkX2xjYnMgPT0gMCkgewotICAgIGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdyA9IGwyY2IubnVtX2xtX2FjbF9idWZzOwotICAgIGwyY2Iucm91bmRfcm9iaW5fcXVvdGEgPSBsMmNiLnJvdW5kX3JvYmluX3VuYWNrZWQgPSAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEZpcnN0LCBjb3VudCB0aGUgbGlua3MgKi8KLSAgZm9yICh5eSA9IDAsIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07IHl5IDwgTUFYX0wyQ0FQX0xJTktTOyB5eSsrLCBwX2xjYisrKSB7Ci0gICAgaWYgKHBfbGNiLT5pbl91c2UgJiYKLSAgICAgICAgKGlzX3NoYXJlX2J1ZmZlciB8fCBwX2xjYi0+dHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9MRSkpIHsKLSAgICAgIGlmIChwX2xjYi0+YWNsX3ByaW9yaXR5ID09IEwyQ0FQX1BSSU9SSVRZX0hJR0gpCi0gICAgICAgIG51bV9oaXByaV9saW5rcysrOwotICAgICAgZWxzZQotICAgICAgICBudW1fbG93cHJpX2xpbmtzKys7Ci0gICAgfQotICB9Ci0KLSAgLyogbm93IGFkanVzdCBoaWdoIHByaW9yaXR5IGxpbmsgcXVvdGEgKi8KLSAgbG93X3F1b3RhID0gbnVtX2xvd3ByaV9saW5rcyA/IDEgOiAwOwotICB3aGlsZSAoKG51bV9oaXByaV9saW5rcyAqIGhpZ2hfcHJpX2xpbmtfcXVvdGEgKyBsb3dfcXVvdGEpID4KLSAgICAgICAgIGNvbnRyb2xsZXJfeG1pdF9xdW90YSkKLSAgICBoaWdoX3ByaV9saW5rX3F1b3RhLS07Ci0KLSAgLyogV29yayBvdXQgdGhlIHhtaXQgcXVvdGEgYW5kIGJ1ZmZlciBxdW90YSBoaWdoIGFuZCBsb3cgcHJpb3JpdGllcyAqLwotICBoaV9xdW90YSA9IG51bV9oaXByaV9saW5rcyAqIGhpZ2hfcHJpX2xpbmtfcXVvdGE7Ci0gIGxvd19xdW90YSA9Ci0gICAgICAoaGlfcXVvdGEgPCBjb250cm9sbGVyX3htaXRfcXVvdGEpID8gY29udHJvbGxlcl94bWl0X3F1b3RhIC0gaGlfcXVvdGEgOiAxOwotCi0gIC8qIFdvcmsgb3V0IGFuZCBzYXZlIHRoZSBIQ0kgeG1pdCBxdW90YSBmb3IgZWFjaCBsb3cgcHJpb3JpdHkgbGluayAqLwotCi0gIC8qIElmIGVhY2ggbG93IHByaW9yaXR5IGxpbmsgY2Fubm90IGhhdmUgYXQgbGVhc3Qgb25lIGJ1ZmZlciAqLwotICBpZiAobnVtX2xvd3ByaV9saW5rcyA+IGxvd19xdW90YSkgewotICAgIGwyY2Iucm91bmRfcm9iaW5fcXVvdGEgPSBsb3dfcXVvdGE7Ci0gICAgcXEgPSBxcV9yZW1haW5kZXIgPSAxOwotICB9Ci0gIC8qIElmIGVhY2ggbG93IHByaW9yaXR5IGxpbmsgY2FuIGhhdmUgYXQgbGVhc3Qgb25lIGJ1ZmZlciAqLwotICBlbHNlIGlmIChudW1fbG93cHJpX2xpbmtzID4gMCkgewotICAgIGwyY2Iucm91bmRfcm9iaW5fcXVvdGEgPSAwOwotICAgIGwyY2Iucm91bmRfcm9iaW5fdW5hY2tlZCA9IDA7Ci0gICAgcXEgPSBsb3dfcXVvdGEgLyBudW1fbG93cHJpX2xpbmtzOwotICAgIHFxX3JlbWFpbmRlciA9IGxvd19xdW90YSAlIG51bV9sb3dwcmlfbGlua3M7Ci0gIH0KLSAgLyogSWYgbm8gbG93IHByaW9yaXR5IGxpbmsgKi8KLSAgZWxzZSB7Ci0gICAgbDJjYi5yb3VuZF9yb2Jpbl9xdW90YSA9IDA7Ci0gICAgbDJjYi5yb3VuZF9yb2Jpbl91bmFja2VkID0gMDsKLSAgICBxcSA9IHFxX3JlbWFpbmRlciA9IDE7Ci0gIH0KLQotICBMT0dfREVCVUcoCi0gICAgICAibDJjX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24gIG51bV9oaXByaTogJXUgIG51bV9sb3dwcmk6ICV1ICBsb3dfcXVvdGE6ICIKLSAgICAgICIldSAgcm91bmRfcm9iaW5fcXVvdGE6ICV1ICBxcTogJXUiLAotICAgICAgbnVtX2hpcHJpX2xpbmtzLCBudW1fbG93cHJpX2xpbmtzLCBsb3dfcXVvdGEsIGwyY2Iucm91bmRfcm9iaW5fcXVvdGEsIHFxKTsKLQotICAvKiBOb3csIGFzc2lnbiB0aGUgcXVvdGFzIHRvIGVhY2ggbGluayAqLwotICBmb3IgKHl5ID0gMCwgcF9sY2IgPSAmbDJjYi5sY2JfcG9vbFswXTsgeXkgPCBNQVhfTDJDQVBfTElOS1M7IHl5KyssIHBfbGNiKyspIHsKLSAgICBpZiAocF9sY2ItPmluX3VzZSAmJgotICAgICAgICAoaXNfc2hhcmVfYnVmZmVyIHx8IHBfbGNiLT50cmFuc3BvcnQgIT0gQlRfVFJBTlNQT1JUX0xFKSkgewotICAgICAgaWYgKHBfbGNiLT5hY2xfcHJpb3JpdHkgPT0gTDJDQVBfUFJJT1JJVFlfSElHSCkgewotICAgICAgICBwX2xjYi0+bGlua194bWl0X3F1b3RhID0gaGlnaF9wcmlfbGlua19xdW90YTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFNhZmV0eSBjaGVjayBpbiBjYXNlIHdlIHN3aXRjaGVkIHRvIHJvdW5kLXJvYmluIHdpdGggc29tZXRoaW5nCi0gICAgICAgICAqIG91dHN0YW5kaW5nICovCi0gICAgICAgIC8qIGlmIHNlbnRfbm90X2Fja2VkIGlzIGFkZGVkIGludG8gcm91bmRfcm9iaW5fdW5hY2tlZCB0aGVuIGRvbid0IGFkZCBpdAotICAgICAgICAgKiBhZ2FpbiAqLwotICAgICAgICAvKiBsMmNhcCBrZWVwcyB1cGRhdGluZyBzZW50X25vdF9hY2tlZCBmb3IgZXhpdGluZyBmcm9tIHJvdW5kIHJvYmluICovCi0gICAgICAgIGlmICgocF9sY2ItPmxpbmtfeG1pdF9xdW90YSA+IDApICYmIChxcSA9PSAwKSkKLSAgICAgICAgICBsMmNiLnJvdW5kX3JvYmluX3VuYWNrZWQgKz0gcF9sY2ItPnNlbnRfbm90X2Fja2VkOwotCi0gICAgICAgIHBfbGNiLT5saW5rX3htaXRfcXVvdGEgPSBxcTsKLSAgICAgICAgaWYgKHFxX3JlbWFpbmRlciA+IDApIHsKLSAgICAgICAgICBwX2xjYi0+bGlua194bWl0X3F1b3RhKys7Ci0gICAgICAgICAgcXFfcmVtYWluZGVyLS07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICJsMmNfbGlua19hZGp1c3RfYWxsb2NhdGlvbiBMQ0IgJWQgICBQcmlvcml0eTogJWQgIFhtaXRRdW90YTogJWQiLCB5eSwKLSAgICAgICAgICBwX2xjYi0+YWNsX3ByaW9yaXR5LCBwX2xjYi0+bGlua194bWl0X3F1b3RhKTsKLQotICAgICAgTE9HX0RFQlVHKCIgICAgICAgIFNlbnROb3RBY2tlZDogJWQgIFJSVW5hY2tlZDogJWQiLAotICAgICAgICAgICAgICAgIHBfbGNiLT5zZW50X25vdF9hY2tlZCwgbDJjYi5yb3VuZF9yb2Jpbl91bmFja2VkKTsKLQotICAgICAgLyogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgaGF2ZSByZWFkanVzdGVkIHRoZSBsaW5rIHF1b3RhcyBhbmQgKi8KLSAgICAgIC8qIHRoaXMgbGluayBtYXkgaGF2ZSBzZW50IGFueXRoaW5nIGJ1dCBzb21lIG90aGVyIGxpbmsgc2VudCBwYWNrZXRzIHNvICovCi0gICAgICAvKiBzbyB3ZSBtYXkgbmVlZCBhIHRpbWVyIHRvIGtpY2sgb2ZmIHRoaXMgbGluaydzIHRyYW5zbWlzc2lvbnMuICovCi0gICAgICBpZiAoKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQpICYmCi0gICAgICAgICAgKCFsaXN0X2lzX2VtcHR5KHBfbGNiLT5saW5rX3htaXRfZGF0YV9xKSkgJiYKLSAgICAgICAgICAocF9sY2ItPnNlbnRfbm90X2Fja2VkIDwgcF9sY2ItPmxpbmtfeG1pdF9xdW90YSkpIHsKLSAgICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5sMmNfbGNiX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfTElOS19GTE9XX0NPTlRST0xfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19sY2JfdGltZXJfdGltZW91dCwgcF9sY2IpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2xpbmtfYWRqdXN0X2NobmxfYWxsb2NhdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcGFja2V0cwotICogICAgICAgICAgICAgICAgICBlYWNoIG5vbi1GJkVDIGNoYW5uZWwgbWF5IGhhdmUgb3V0c3RhbmRpbmcuCi0gKgotICogICAgICAgICAgICAgICAgICBDdXJyZW50bHksIHRoaXMgaXMgYSBzaW1wbGUgYWxsb2NhdGlvbiwgZGl2aWRpbmcgdGhlIG51bWJlcgotICogICAgICAgICAgICAgICAgICBvZiBwYWNrZXRzIGFsbG9jYXRlZCB0byB0aGUgbGluayBieSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgotICogICAgICAgICAgICAgICAgICBJbiB0aGUgZnV0dXJlLCBRT1MgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2xpbmtfYWRqdXN0X2NobmxfYWxsb2NhdGlvbih2b2lkKSB7Ci0gIC8qIGFzc2lnbiBidWZmZXIgcXVvdGEgdG8gZWFjaCBjaGFubmVsIGJhc2VkIG9uIGl0cyBkYXRhIHJhdGUgcmVxdWlyZW1lbnQgKi8KLSAgZm9yICh1aW50OF90IHh4ID0gMDsgeHggPCBNQVhfTDJDQVBfQ0hBTk5FTFM7IHh4KyspIHsKLSAgICB0TDJDX0NDQiogcF9jY2IgPSBsMmNiLmNjYl9wb29sICsgeHg7Ci0KLSAgICBpZiAoIXBfY2NiLT5pbl91c2UpIGNvbnRpbnVlOwotCi0gICAgdEwyQ0FQX0NITkxfREFUQV9SQVRFIGRhdGFfcmF0ZSA9IHBfY2NiLT50eF9kYXRhX3JhdGUgKyBwX2NjYi0+cnhfZGF0YV9yYXRlOwotICAgIHBfY2NiLT5idWZmX3F1b3RhID0gTDJDQVBfQ0JCX0RFRkFVTFRfREFUQV9SQVRFX0JVRkZfUVVPVEEgKiBkYXRhX3JhdGU7Ci0gICAgTE9HX0RFQlVHKAotICAgICAgICAiQ0lEOjB4JTA0eCBGQ1IgTW9kZToldSBQcmlvcml0eToldSBUeERhdGFSYXRlOiV1IFJ4RGF0YVJhdGU6JXUgIgotICAgICAgICAiUXVvdGE6JXUiLAotICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUsIHBfY2NiLT5jY2JfcHJpb3JpdHksCi0gICAgICAgIHBfY2NiLT50eF9kYXRhX3JhdGUsIHBfY2NiLT5yeF9kYXRhX3JhdGUsIHBfY2NiLT5idWZmX3F1b3RhKTsKLQotICAgIC8qIHF1b3RhIG1heSBiZSBjaGFuZ2Ugc28gY2hlY2sgY29uZ2VzdGlvbiAqLwotICAgIGwyY3VfY2hlY2tfY2hhbm5lbF9jb25nZXN0aW9uKHBfY2NiKTsKLSAgfQotfQotCi12b2lkIGwyY19saW5rX2luaXQoKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIC8vIEdEIEwyY2FwIGdldHMgdGhpcyBpbmZvIHRocm91Z2ggR0QgQUNMCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7Ci0KLSAgbDJjYi5udW1fbG1fYWNsX2J1ZnMgPSBjb250cm9sbGVyLT5nZXRfYWNsX2J1ZmZlcl9jb3VudF9jbGFzc2ljKCk7Ci0gIGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdyA9IGNvbnRyb2xsZXItPmdldF9hY2xfYnVmZmVyX2NvdW50X2NsYXNzaWMoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19saW5rX3JvbGVfY2hhbmdlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hhbiBhIGxpbmsncyBjZW50cmFsL3BlcmlwaGVyYWwKLSAqcm9sZSBjaGFuZ2UgZXZlbnQgaXMgcmVjZWl2ZWQuIEl0IHNpbXBseSB1cGRhdGVzIHRoZSBsaW5rIGNvbnRyb2wgYmxvY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2xpbmtfcm9sZV9jaGFuZ2VkKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQ4X3QgbmV3X3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhjaV9zdGF0dXMpIHsKLSAgLyogTWFrZSBzdXJlIG5vdCBjYWxsZWQgZnJvbSBIQ0kgQ29tbWFuZCBTdGF0dXMgKGJkX2FkZHIgYW5kIG5ld19yb2xlIGFyZQotICAgKiBpbnZhbGlkKSAqLwotICBpZiAoYmRfYWRkciAhPSBudWxscHRyKSB7Ci0gICAgLyogSWYgaGVyZSBjYW1lIGZvcm0gaGNpIHJvbGUgY2hhbmdlIGV2ZW50ICovCi0gICAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKCpiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICBpZiAocF9sY2IpIHsKLSAgICAgIGlmIChuZXdfcm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgICAgIHBfbGNiLT5TZXRMaW5rUm9sZUFzQ2VudHJhbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9sY2ItPlNldExpbmtSb2xlQXNQZXJpcGhlcmFsKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFJlc2V0IGhpZ2ggcHJpb3JpdHkgbGluayBpZiBuZWVkZWQgKi8KLSAgICAgIGlmIChoY2lfc3RhdHVzID09IEhDSV9TVUNDRVNTKQotICAgICAgICBsMmN1X3NldF9hY2xfcHJpb3JpdHkoKmJkX2FkZHIsIHBfbGNiLT5hY2xfcHJpb3JpdHksIHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qIENoZWNrIGlmIGFueSBMQ0Igd2FzIHdhaXRpbmcgZm9yIHN3aXRjaCB0byBiZSBjb21wbGV0ZWQgKi8KLSAgdEwyQ19MQ0IqIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07Ci0gIGZvciAodWludDhfdCB4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwX2xjYisrKSB7Ci0gICAgaWYgKChwX2xjYi0+aW5fdXNlKSAmJiAocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RJTkdfV0FJVF9TV0lUQ0gpKSB7Ci0gICAgICBsMmN1X2NyZWF0ZV9jb25uX2FmdGVyX3N3aXRjaChwX2xjYik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfcGluX2NvZGVfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hhbiBhIHBpbi1jb2RlIHJlcXVlc3QgaXMgcmVjZWl2ZWQKLSAqICAgICAgICAgICAgICAgICAgb24gYSBjb25uZWN0aW9uLiBJZiB0aGVyZSBhcmUgbm8gY2hhbm5lbHMgYWN0aXZlIHlldCBvbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgbGluaywgaXQgZXh0ZW5kcyB0aGUgbGluayBmaXJzdCBjb25uZWN0aW9uIHRpbWVyLiAgTWFrZSBzdXJlCi0gKiAgICAgICAgICAgICAgICAgIHRoYXQgaW5hY3Rpdml0eSB0aW1lciBpcyBub3QgZXh0ZW5kZWQgaWYgUElOIGNvZGUgaGFwcGVucwotICogICAgICAgICAgICAgICAgICB0byBiZSBhZnRlciBsYXN0IGNjYiByZWxlYXNlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfcGluX2NvZGVfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICBpZiAoKHBfbGNiKSAmJiAoIXBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2IpKSB7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5sMmNfbGNiX3RpbWVyLCBMMkNBUF9MSU5LX0NPTk5FQ1RfRVhUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIGwyY19sY2JfdGltZXJfdGltZW91dCwgcF9sY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfbGlua19jaGVja19wb3dlcl9tb2RlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBwb3dlciBtb2RlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBsaW5rIGlzIGdvaW5nIHRvIGJlIGFjdGl2ZSBmcm9tIHBhcmsKLSAqICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgbm90aGluZyB0byBzZW5kIG9yIG5vdCBpbiBwYXJrIG1vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgbDJjX2xpbmtfY2hlY2tfcG93ZXJfbW9kZSh0TDJDX0xDQiogcF9sY2IpIHsKLSAgYm9vbCBuZWVkX3RvX2FjdGl2ZSA9IGZhbHNlOwotCi0gIC8qCi0gICAqIFdlIG9ubHkgc3dpdGNoIHBhcmsgdG8gYWN0aXZlIG9ubHkgaWYgd2UgaGF2ZSB1bnNlbnQgcGFja2V0cwotICAgKi8KLSAgaWYgKGxpc3RfaXNfZW1wdHkocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EpKSB7Ci0gICAgZm9yICh0TDJDX0NDQiogcF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyBwX2NjYjsKLSAgICAgICAgIHBfY2NiID0gcF9jY2ItPnBfbmV4dF9jY2IpIHsKLSAgICAgIGlmICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnhtaXRfaG9sZF9xKSkgewotICAgICAgICBuZWVkX3RvX2FjdGl2ZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBuZWVkX3RvX2FjdGl2ZSA9IHRydWU7Ci0gIH0KLQotICAvKiBpZiB3ZSBoYXZlIHBhY2tldHMgdG8gc2VuZCAqLwotICBpZiAobmVlZF90b19hY3RpdmUgJiYgIXBfbGNiLT5pc190cmFuc3BvcnRfYmxlKCkpIHsKLSAgICAvKiBjaGVjayBwb3dlciBtb2RlICovCi0gICAgdEJUTV9QTV9NT0RFIG1vZGU7Ci0gICAgaWYgKEJUTV9SZWFkUG93ZXJNb2RlKHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgJm1vZGUpKSB7Ci0gICAgICBpZiAobW9kZSA9PSBCVE1fUE1fU1RTX1BFTkRJTkcpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJMQ0IoMHgleCkgaXMgaW4gUE0gcGVuZGluZyBzdGF0ZSIsIHBfbGNiLT5IYW5kbGUoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGl0IGNhbiBzZW5kIHBhY2tldHMKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIEhvc3QgQ29udHJvbGxlci4gSXQgbWF5IGJlIHBhc3NlZCB0aGUgYWRkcmVzcyBvZgotICogICAgICAgICAgICAgICAgICBhIHBhY2tldCB0byBzZW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGxvY2FsX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpIHsKLSAgYm9vbCBzaW5nbGVfd3JpdGUgPSBmYWxzZTsKLQotICAvKiBTYXZlIHRoZSBjaGFubmVsIElEIGZvciBmYXN0ZXIgY291bnRpbmcgKi8KLSAgaWYgKHBfYnVmKSB7Ci0gICAgcF9idWYtPmV2ZW50ID0gbG9jYWxfY2lkOwotICAgIGlmIChsb2NhbF9jaWQgIT0gMCkgewotICAgICAgc2luZ2xlX3dyaXRlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotICAgIGxpc3RfYXBwZW5kKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xLCBwX2J1Zik7Ci0KLSAgICBpZiAocF9sY2ItPmxpbmtfeG1pdF9xdW90YSA9PSAwKSB7Ci0gICAgICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpCi0gICAgICAgIGwyY2IuYmxlX2NoZWNrX3JvdW5kX3JvYmluID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgbDJjYi5jaGVja19yb3VuZF9yb2JpbiA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSB1bmNvbmdlc3RlZCBjYWxsYmFjayBjb250ZXh0IGJyZWFrIHJlY3Vyc2l2ZQotICAgKmNhbGxpbmcuCi0gICAqKiBUaGlzIExDQiB3aWxsIGJlIHNlcnZlZCB3aGVuIHJlY2VpdmluZyBudW1iZXIgb2YgY29tcGxldGVkIHBhY2tldCBldmVudC4KLSAgICovCi0gIGlmIChsMmNiLmlzX2NvbmdfY2JhY2tfY29udGV4dCkgewotICAgIExPR19JTkZPKCJza2lwcGluZywgaXNfY29uZ19jYmFja19jb250ZXh0PXRydWUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBJZiB3ZSBhcmUgaW4gYSBzY2VuYXJpbyB3aGVyZSB0aGVyZSBhcmUgbm90IGVub3VnaCBidWZmZXJzIGZvciBlYWNoIGxpbmsgdG8KLSAgKiogaGF2ZSBhdCBsZWFzdCAxLCB0aGVuIGRvIGEgcm91bmQtcm9iaW4gZm9yIGFsbCB0aGUgTENCcwotICAqLwotICBpZiAoKHBfbGNiID09IE5VTEwpIHx8IChwX2xjYi0+bGlua194bWl0X3F1b3RhID09IDApKSB7Ci0gICAgTE9HX0RFQlVHKCJSb3VuZCByb2JpbiIpOwotICAgIGlmIChwX2xjYiA9PSBOVUxMKSB7Ci0gICAgICBwX2xjYiA9IGwyY2IubGNiX3Bvb2w7Ci0gICAgfSBlbHNlIGlmICghc2luZ2xlX3dyaXRlKSB7Ci0gICAgICBwX2xjYisrOwotICAgIH0KLQotICAgIC8qIExvb3AgdGhyb3VnaCwgc3RhcnRpbmcgYXQgdGhlIG5leHQgKi8KLSAgICBmb3IgKGludCB4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwX2xjYisrKSB7Ci0gICAgICAvKiBDaGVjayBmb3Igd3JhcGFyb3VuZCAqLwotICAgICAgaWYgKHBfbGNiID09ICZsMmNiLmxjYl9wb29sW01BWF9MMkNBUF9MSU5LU10pIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07Ci0KLSAgICAgIC8qIElmIGNvbnRyb2xsZXIgd2luZG93IGlzIGZ1bGwsIG5vdGhpbmcgdG8gZG8gKi8KLSAgICAgIGlmICgoKGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdyA9PSAwIHx8Ci0gICAgICAgICAgICAobDJjYi5yb3VuZF9yb2Jpbl91bmFja2VkID49IGwyY2Iucm91bmRfcm9iaW5fcXVvdGEpKSAmJgotICAgICAgICAgICAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSkgfHwKLSAgICAgICAgICAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUgJiYKLSAgICAgICAgICAgKGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQgPj0gbDJjYi5ibGVfcm91bmRfcm9iaW5fcXVvdGEgfHwKLSAgICAgICAgICAgIGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdyA9PSAwKSkpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJTa2lwcGluZyBsY2IgJWQgZHVlIHRvIGNvbnRyb2xsZXIgd2luZG93IGZ1bGwiLCB4eCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoKCFwX2xjYi0+aW5fdXNlKSB8fCAocF9sY2ItPnBhcnRpYWxfc2VnbWVudF9iZWluZ19zZW50KSB8fAotICAgICAgICAgIChwX2xjYi0+bGlua19zdGF0ZSAhPSBMU1RfQ09OTkVDVEVEKSB8fAotICAgICAgICAgIChwX2xjYi0+bGlua194bWl0X3F1b3RhICE9IDApIHx8IChsMmNfbGlua19jaGVja19wb3dlcl9tb2RlKHBfbGNiKSkpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJTa2lwcGluZyBsY2IgJWQgZHVlIHRvIHF1b3RhIiwgeHgpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogU2VlIGlmIHdlIGNhbiBzZW5kIGFueXRoaW5nIGZyb20gdGhlIExpbmsgUXVldWUgKi8KLSAgICAgIGlmICghbGlzdF9pc19lbXB0eShwX2xjYi0+bGlua194bWl0X2RhdGFfcSkpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJTZW5kaW5nIHRvIGxvd2VyIGxheWVyIik7Ci0gICAgICAgIHBfYnVmID0gKEJUX0hEUiopbGlzdF9mcm9udChwX2xjYi0+bGlua194bWl0X2RhdGFfcSk7Ci0gICAgICAgIGxpc3RfcmVtb3ZlKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xLCBwX2J1Zik7Ci0gICAgICAgIGwyY19saW5rX3NlbmRfdG9fbG93ZXIocF9sY2IsIHBfYnVmKTsKLSAgICAgIH0gZWxzZSBpZiAoc2luZ2xlX3dyaXRlKSB7Ci0gICAgICAgIC8qIElmIG9ubHkgZG9pbmcgb25lIHdyaXRlLCBicmVhayBvdXQgKi8KLSAgICAgICAgTE9HX0RFQlVHKCJzaW5nbGVfd3JpdGUgaXMgdHJ1ZSwgc2tpcHBpbmciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvKiBJZiBub3RoaW5nIG9uIHRoZSBsaW5rIHF1ZXVlLCBjaGVjayB0aGUgY2hhbm5lbCBxdWV1ZSAqLwotICAgICAgZWxzZSB7Ci0gICAgICAgIExPR19ERUJVRygiQ2hlY2sgbmV4dCBidWZmZXIiKTsKLSAgICAgICAgcF9idWYgPSBsMmN1X2dldF9uZXh0X2J1ZmZlcl90b19zZW5kKHBfbGNiKTsKLSAgICAgICAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICAgICAgICBMT0dfREVCVUcoIlNlbmRpbmcgbmV4dCBidWZmZXIiKTsKLSAgICAgICAgICBsMmNfbGlua19zZW5kX3RvX2xvd2VyKHBfbGNiLCBwX2J1Zik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiB3ZSBmaW5pc2hlZCB3aXRob3V0IHVzaW5nIHVwIG91ciBxdW90YSwgbm8gbmVlZCBmb3IgYSBzYWZldHkgY2hlY2sgKi8KLSAgICBpZiAoKGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdyA+IDApICYmCi0gICAgICAgIChsMmNiLnJvdW5kX3JvYmluX3VuYWNrZWQgPCBsMmNiLnJvdW5kX3JvYmluX3F1b3RhKSAmJgotICAgICAgICAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSkKLSAgICAgIGwyY2IuY2hlY2tfcm91bmRfcm9iaW4gPSBmYWxzZTsKLQotICAgIGlmICgobDJjYi5jb250cm9sbGVyX2xlX3htaXRfd2luZG93ID4gMCkgJiYKLSAgICAgICAgKGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQgPCBsMmNiLmJsZV9yb3VuZF9yb2Jpbl9xdW90YSkgJiYKLSAgICAgICAgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSkKLSAgICAgIGwyY2IuYmxlX2NoZWNrX3JvdW5kX3JvYmluID0gZmFsc2U7Ci0gIH0gZWxzZSAvKiBpZiB0aGlzIGlzIG5vdCByb3VuZC1yb2JpbiBzZXJ2aWNlICovCi0gIHsKLSAgICAvKiBJZiBhIHBhcnRpYWwgc2VnbWVudCBpcyBiZWluZyBzZW50LCBjYW4ndCBzZW5kIGFueXRoaW5nIGVsc2UgKi8KLSAgICBpZiAoKHBfbGNiLT5wYXJ0aWFsX3NlZ21lbnRfYmVpbmdfc2VudCkgfHwKLSAgICAgICAgKHBfbGNiLT5saW5rX3N0YXRlICE9IExTVF9DT05ORUNURUQpIHx8Ci0gICAgICAgIChsMmNfbGlua19jaGVja19wb3dlcl9tb2RlKHBfbGNiKSkpIHsKLSAgICAgIExPR19JTkZPKCJBIHBhcnRpYWwgc2VnbWVudCBpcyBiZWluZyBzZW50LCBjYW5ub3Qgc2VuZCBhbnl0aGluZyBlbHNlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPR19ERUJVRygKLSAgICAgICAgIkRpcmVjdCBzZW5kLCB0cmFuc3BvcnQ9JWQsIHhtaXRfd2luZG93PSVkLCBsZV94bWl0X3dpbmRvdz0lZCwgIgotICAgICAgICAic2VudF9ub3RfYWNrZWQ9JWQsIGxpbmtfeG1pdF9xdW90YT0lZCIsCi0gICAgICAgIHBfbGNiLT50cmFuc3BvcnQsIGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdywKLSAgICAgICAgbDJjYi5jb250cm9sbGVyX2xlX3htaXRfd2luZG93LCBwX2xjYi0+c2VudF9ub3RfYWNrZWQsCi0gICAgICAgIHBfbGNiLT5saW5rX3htaXRfcXVvdGEpOwotCi0gICAgLyogU2VlIGlmIHdlIGNhbiBzZW5kIGFueXRoaW5nIGZyb20gdGhlIGxpbmsgcXVldWUgKi8KLSAgICB3aGlsZSAoKChsMmNiLmNvbnRyb2xsZXJfeG1pdF93aW5kb3cgIT0gMCAmJgotICAgICAgICAgICAgIChwX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIpKSB8fAotICAgICAgICAgICAgKGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdyAhPSAwICYmCi0gICAgICAgICAgICAgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSkpICYmCi0gICAgICAgICAgIChwX2xjYi0+c2VudF9ub3RfYWNrZWQgPCBwX2xjYi0+bGlua194bWl0X3F1b3RhKSkgewotICAgICAgaWYgKGxpc3RfaXNfZW1wdHkocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EpKSB7Ci0gICAgICAgIExPR19ERUJVRygiTm8gdHJhbnNtaXQgZGF0YSwgc2tpcHBpbmciKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBMT0dfREVCVUcoIlNlbmRpbmcgdG8gbG93ZXIgbGF5ZXIiKTsKLSAgICAgIHBfYnVmID0gKEJUX0hEUiopbGlzdF9mcm9udChwX2xjYi0+bGlua194bWl0X2RhdGFfcSk7Ci0gICAgICBsaXN0X3JlbW92ZShwX2xjYi0+bGlua194bWl0X2RhdGFfcSwgcF9idWYpOwotICAgICAgbDJjX2xpbmtfc2VuZF90b19sb3dlcihwX2xjYiwgcF9idWYpOwotICAgIH0KLQotICAgIGlmICghc2luZ2xlX3dyaXRlKSB7Ci0gICAgICAvKiBTZWUgaWYgd2UgY2FuIHNlbmQgYW55dGhpbmcgZm9yIGFueSBjaGFubmVsICovCi0gICAgICBMT0dfREVCVUcoIlRyeWluZyB0byBzZW5kIG90aGVyIGRhdGEgd2hlbiBzaW5nbGVfd3JpdGUgaXMgZmFsc2UiKTsKLSAgICAgIHdoaWxlICgoKGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdyAhPSAwICYmCi0gICAgICAgICAgICAgICAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSkgfHwKLSAgICAgICAgICAgICAgKGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdyAhPSAwICYmCi0gICAgICAgICAgICAgICAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpKSkgJiYKLSAgICAgICAgICAgICAocF9sY2ItPnNlbnRfbm90X2Fja2VkIDwgcF9sY2ItPmxpbmtfeG1pdF9xdW90YSkpIHsKLSAgICAgICAgcF9idWYgPSBsMmN1X2dldF9uZXh0X2J1ZmZlcl90b19zZW5kKHBfbGNiKTsKLSAgICAgICAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICAgICAgICBMT0dfREVCVUcoIk5vIG5leHQgYnVmZmVyLCBza2lwcGluZyIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIExPR19ERUJVRygiU2VuZGluZyB0byBsb3dlciBsYXllciIpOwotICAgICAgICBsMmNfbGlua19zZW5kX3RvX2xvd2VyKHBfbGNiLCBwX2J1Zik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgaGF2ZSByZWFkanVzdGVkIHRoZSBsaW5rIHF1b3RhcyBhbmQgICovCi0gICAgLyogdGhpcyBsaW5rIG1heSBoYXZlIHNlbnQgYW55dGhpbmcgYnV0IHNvbWUgb3RoZXIgbGluayBzZW50IHBhY2tldHMgc28gICovCi0gICAgLyogc28gd2UgbWF5IG5lZWQgYSB0aW1lciB0byBraWNrIG9mZiB0aGlzIGxpbmsncyB0cmFuc21pc3Npb25zLiAgICAgICAgICovCi0gICAgaWYgKCghbGlzdF9pc19lbXB0eShwX2xjYi0+bGlua194bWl0X2RhdGFfcSkpICYmCi0gICAgICAgIChwX2xjYi0+c2VudF9ub3RfYWNrZWQgPCBwX2xjYi0+bGlua194bWl0X3F1b3RhKSkgewotICAgICAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5sMmNfbGNiX3RpbWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0xJTktfRkxPV19DT05UUk9MX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbDJjX2xjYl90aW1lcl90aW1lb3V0LCBwX2xjYik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgbDJjX09uSGNpTW9kZUNoYW5nZVNlbmRQZW5kaW5nUGFja2V0cyhSYXdBZGRyZXNzIHJlbW90ZSkgewotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocmVtb3RlLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfbGNiICE9IE5VTEwpIHsKLSAgICAvKiBUaGVyZSBtaWdodCBiZSBhbnkgcGVuZGluZyBwYWNrZXRzIGR1ZSB0byBTTklGRiBvciBQRU5ESU5HIHN0YXRlICovCi0gICAgLyogVHJpZ2dlciBMMkMgdG8gc3RhcnQgdHJhbnNtaXNzaW9uIG9mIHRoZSBwZW5kaW5nIHBhY2tldHMuICovCi0gICAgQlRNX1RSQUNFX0RFQlVHKAotICAgICAgICAiYnRtIG1vZGUgY2hhbmdlIHRvIGFjdGl2ZTsgY2hlY2sgbDJjX2xpbmsgZm9yIG91dGdvaW5nIHBhY2tldHMiKTsKLSAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfbGlua19zZW5kX3RvX2xvd2VyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyB0aGUgYnVmZmVyIGZvciBIQ0kgdHJhbnNtaXNzaW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGwyY19saW5rX3NlbmRfdG9fbG93ZXJfYnJfZWRyKHRMMkNfTENCKiBwX2xjYiwgQlRfSERSKiBwX2J1ZikgewotICBjb25zdCB1aW50MTZfdCBhY2xfcGFja2V0X3NpemVfY2xhc3NpYyA9Ci0gICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FjbF9wYWNrZXRfc2l6ZV9jbGFzc2ljKCk7Ci0gIGNvbnN0IHVpbnQxNl90IGFjbF9kYXRhX3NpemVfY2xhc3NpYyA9Ci0gICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FjbF9kYXRhX3NpemVfY2xhc3NpYygpOwotICBjb25zdCB1aW50MTZfdCBsaW5rX3htaXRfcXVvdGEgPSBwX2xjYi0+bGlua194bWl0X3F1b3RhOwotICBjb25zdCBib29sIGlzX2Jkcl9hbmRfZml0c19pbl9idWZmZXIgPQotICAgICAgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpCi0gICAgICAgICAgPyB0cnVlCi0gICAgICAgICAgOiAocF9idWYtPmxlbiA8PSBhY2xfcGFja2V0X3NpemVfY2xhc3NpYyk7Ci0KLSAgaWYgKGlzX2Jkcl9hbmRfZml0c19pbl9idWZmZXIpIHsKLSAgICBpZiAobGlua194bWl0X3F1b3RhID09IDApIHsKLSAgICAgIGwyY2Iucm91bmRfcm9iaW5fdW5hY2tlZCsrOwotICAgIH0KLSAgICBwX2xjYi0+c2VudF9ub3RfYWNrZWQrKzsKLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotICAgIGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdy0tOwotICB9IGVsc2UgewotICAgIHVpbnQxNl90IG51bV9zZWdzID0KLSAgICAgICAgKHBfYnVmLT5sZW4gLSBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsgYWNsX2RhdGFfc2l6ZV9jbGFzc2ljIC0gMSkgLwotICAgICAgICBhY2xfZGF0YV9zaXplX2NsYXNzaWM7Ci0KLSAgICAvKiBJZiBkb2luZyByb3VuZC1yb2JpbiwgdGhlbiBvbmx5IDEgc2VnbWVudCBlYWNoIHRpbWUgKi8KLSAgICBpZiAocF9sY2ItPmxpbmtfeG1pdF9xdW90YSA9PSAwKSB7Ci0gICAgICBudW1fc2VncyA9IDE7Ci0gICAgICBwX2xjYi0+cGFydGlhbF9zZWdtZW50X2JlaW5nX3NlbnQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBNdWx0aS1zZWdtZW50IHBhY2tldC4gTWFrZSBzdXJlIGl0IGNhbiBmaXQgKi8KLSAgICAgIGlmIChudW1fc2VncyA+IGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdykgewotICAgICAgICBudW1fc2VncyA9IGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdzsKLSAgICAgICAgcF9sY2ItPnBhcnRpYWxfc2VnbWVudF9iZWluZ19zZW50ID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKG51bV9zZWdzID4gKHBfbGNiLT5saW5rX3htaXRfcXVvdGEgLSBwX2xjYi0+c2VudF9ub3RfYWNrZWQpKSB7Ci0gICAgICAgIG51bV9zZWdzID0gKHBfbGNiLT5saW5rX3htaXRfcXVvdGEgLSBwX2xjYi0+c2VudF9ub3RfYWNrZWQpOwotICAgICAgICBwX2xjYi0+cGFydGlhbF9zZWdtZW50X2JlaW5nX3NlbnQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHBfbGNiLT5zZW50X25vdF9hY2tlZCArPSBudW1fc2VnczsKLSAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBudW1fc2VnczsKLSAgICBsMmNiLmNvbnRyb2xsZXJfeG1pdF93aW5kb3cgLT0gbnVtX3NlZ3M7Ci0gICAgaWYgKHBfbGNiLT5saW5rX3htaXRfcXVvdGEgPT0gMCkgbDJjYi5yb3VuZF9yb2Jpbl91bmFja2VkICs9IG51bV9zZWdzOwotICB9Ci0gIGFjbF9zZW5kX2RhdGFfcGFja2V0X2JyX2VkcihwX2xjYi0+cmVtb3RlX2JkX2FkZHIsIHBfYnVmKTsKLSAgTE9HX0RFQlVHKCJUb3RhbFdpbj0lZCxIbmRsPTB4JXgsUXVvdGE9JWQsVW5hY2s9JWQsUlJRdW90YT0lZCxSUlVuYWNrPSVkIiwKLSAgICAgICAgICAgIGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdywgcF9sY2ItPkhhbmRsZSgpLAotICAgICAgICAgICAgcF9sY2ItPmxpbmtfeG1pdF9xdW90YSwgcF9sY2ItPnNlbnRfbm90X2Fja2VkLAotICAgICAgICAgICAgbDJjYi5yb3VuZF9yb2Jpbl9xdW90YSwgbDJjYi5yb3VuZF9yb2Jpbl91bmFja2VkKTsKLX0KLQotc3RhdGljIHZvaWQgbDJjX2xpbmtfc2VuZF90b19sb3dlcl9ibGUodEwyQ19MQ0IqIHBfbGNiLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIGNvbnN0IHVpbnQxNl90IGFjbF9wYWNrZXRfc2l6ZV9ibGUgPQotICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9hY2xfcGFja2V0X3NpemVfYmxlKCk7Ci0gIGNvbnN0IHVpbnQxNl90IGFjbF9kYXRhX3NpemVfYmxlID0KLSAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWNsX2RhdGFfc2l6ZV9ibGUoKTsKLSAgY29uc3QgdWludDE2X3QgbGlua194bWl0X3F1b3RhID0gcF9sY2ItPmxpbmtfeG1pdF9xdW90YTsKLSAgY29uc3QgYm9vbCBpc19ibGVfYW5kX2ZpdHNfaW5fYnVmZmVyID0gKHBfYnVmLT5sZW4gPD0gYWNsX3BhY2tldF9zaXplX2JsZSk7Ci0KLSAgaWYgKGlzX2JsZV9hbmRfZml0c19pbl9idWZmZXIpIHsKLSAgICBpZiAobGlua194bWl0X3F1b3RhID09IDApIHsKLSAgICAgIGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQrKzsKLSAgICB9Ci0gICAgcF9sY2ItPnNlbnRfbm90X2Fja2VkKys7Ci0gICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gMDsKLSAgICBsMmNiLmNvbnRyb2xsZXJfbGVfeG1pdF93aW5kb3ctLTsKLSAgfSBlbHNlIHsKLSAgICB1aW50MTZfdCBudW1fc2VncyA9Ci0gICAgICAgIChwX2J1Zi0+bGVuIC0gSENJX0RBVEFfUFJFQU1CTEVfU0laRSArIGFjbF9kYXRhX3NpemVfYmxlIC0gMSkgLwotICAgICAgICBhY2xfZGF0YV9zaXplX2JsZTsKLQotICAgIC8qIElmIGRvaW5nIHJvdW5kLXJvYmluLCB0aGVuIG9ubHkgMSBzZWdtZW50IGVhY2ggdGltZSAqLwotICAgIGlmIChwX2xjYi0+bGlua194bWl0X3F1b3RhID09IDApIHsKLSAgICAgIG51bV9zZWdzID0gMTsKLSAgICAgIHBfbGNiLT5wYXJ0aWFsX3NlZ21lbnRfYmVpbmdfc2VudCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE11bHRpLXNlZ21lbnQgcGFja2V0LiBNYWtlIHN1cmUgaXQgY2FuIGZpdCAqLwotICAgICAgaWYgKG51bV9zZWdzID4gbDJjYi5jb250cm9sbGVyX2xlX3htaXRfd2luZG93KSB7Ci0gICAgICAgIG51bV9zZWdzID0gbDJjYi5jb250cm9sbGVyX2xlX3htaXRfd2luZG93OwotICAgICAgICBwX2xjYi0+cGFydGlhbF9zZWdtZW50X2JlaW5nX3NlbnQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAobnVtX3NlZ3MgPiAocF9sY2ItPmxpbmtfeG1pdF9xdW90YSAtIHBfbGNiLT5zZW50X25vdF9hY2tlZCkpIHsKLSAgICAgICAgbnVtX3NlZ3MgPSAocF9sY2ItPmxpbmtfeG1pdF9xdW90YSAtIHBfbGNiLT5zZW50X25vdF9hY2tlZCk7Ci0gICAgICAgIHBfbGNiLT5wYXJ0aWFsX3NlZ21lbnRfYmVpbmdfc2VudCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcF9sY2ItPnNlbnRfbm90X2Fja2VkICs9IG51bV9zZWdzOwotICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IG51bV9zZWdzOwotICAgIGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdyAtPSBudW1fc2VnczsKLSAgICBpZiAocF9sY2ItPmxpbmtfeG1pdF9xdW90YSA9PSAwKSBsMmNiLmJsZV9yb3VuZF9yb2Jpbl91bmFja2VkICs9IG51bV9zZWdzOwotICB9Ci0gIGFjbF9zZW5kX2RhdGFfcGFja2V0X2JsZShwX2xjYi0+cmVtb3RlX2JkX2FkZHIsIHBfYnVmKTsKLSAgTE9HX0RFQlVHKCJUb3RhbFdpbj0lZCxIbmRsPTB4JXgsUXVvdGE9JWQsVW5hY2s9JWQsUlJRdW90YT0lZCxSUlVuYWNrPSVkIiwKLSAgICAgICAgICAgIGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdywgcF9sY2ItPkhhbmRsZSgpLAotICAgICAgICAgICAgcF9sY2ItPmxpbmtfeG1pdF9xdW90YSwgcF9sY2ItPnNlbnRfbm90X2Fja2VkLAotICAgICAgICAgICAgbDJjYi5ibGVfcm91bmRfcm9iaW5fcXVvdGEsIGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQpOwotfQotCi1zdGF0aWMgdm9pZCBsMmNfbGlua19zZW5kX3RvX2xvd2VyKHRMMkNfTENCKiBwX2xjYiwgQlRfSERSKiBwX2J1ZikgewotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSB7Ci0gICAgbDJjX2xpbmtfc2VuZF90b19sb3dlcl9icl9lZHIocF9sY2IsIHBfYnVmKTsKLSAgfSBlbHNlIHsKLSAgICBsMmNfbGlua19zZW5kX3RvX2xvd2VyX2JsZShwX2xjYiwgcF9idWYpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfbGlua19wcm9jZXNzX251bV9jb21wbGV0ZWRfcGt0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhICJudW1iZXItb2YtY29tcGxldGVkLXBhY2tldHMiCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50IGlzIHJlY2VpdmVkIGZyb20gdGhlIGNvbnRyb2xsZXIuIEl0IHVwZGF0ZXMgYWxsIHRoZQotICogICAgICAgICAgICAgICAgICBMQ0IgdHJhbnNtaXQgY291bnRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY19saW5rX3Byb2Nlc3NfbnVtX2NvbXBsZXRlZF9wa3RzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCBudW1faGFuZGxlcywgeHg7Ci0gIHVpbnQxNl90IGhhbmRsZTsKLSAgdWludDE2X3QgbnVtX3NlbnQ7Ci0gIHRMMkNfTENCKiBwX2xjYjsKLQotICBpZiAoZXZ0X2xlbiA+IDApIHsKLSAgICBTVFJFQU1fVE9fVUlOVDgobnVtX2hhbmRsZXMsIHApOwotICB9IGVsc2UgewotICAgIG51bV9oYW5kbGVzID0gMDsKLSAgfQotCi0gIGlmIChudW1faGFuZGxlcyA+IGV2dF9sZW4gLyAoMiAqIHNpemVvZih1aW50MTZfdCkpKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNDE2MTc2MDEiKTsKLSAgICBudW1faGFuZGxlcyA9IGV2dF9sZW4gLyAoMiAqIHNpemVvZih1aW50MTZfdCkpOwotICB9Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgbnVtX2hhbmRsZXM7IHh4KyspIHsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGhhbmRsZSwgcCk7Ci0gICAgLyogRXh0cmFjdCB0aGUgaGFuZGxlICovCi0gICAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci0gICAgU1RSRUFNX1RPX1VJTlQxNihudW1fc2VudCwgcCk7Ci0KLSAgICBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0KLSAgICBpZiAocF9sY2IpIHsKLSAgICAgIGlmIChwX2xjYiAmJiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpKQotICAgICAgICBsMmNiLmNvbnRyb2xsZXJfbGVfeG1pdF93aW5kb3cgKz0gbnVtX3NlbnQ7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLyogTWFpbnRhaW4gdGhlIHRvdGFsIHdpbmRvdyB0byB0aGUgY29udHJvbGxlciAqLwotICAgICAgICBsMmNiLmNvbnRyb2xsZXJfeG1pdF93aW5kb3cgKz0gbnVtX3NlbnQ7Ci0gICAgICB9Ci0gICAgICAvKiBJZiBkb2luZyByb3VuZC1yb2JpbiwgYWRqdXN0IGNvbW11bmFsIGNvdW50cyAqLwotICAgICAgaWYgKHBfbGNiLT5saW5rX3htaXRfcXVvdGEgPT0gMCkgewotICAgICAgICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgICAvKiBEb24ndCBnbyBuZWdhdGl2ZSAqLwotICAgICAgICAgIGlmIChsMmNiLmJsZV9yb3VuZF9yb2Jpbl91bmFja2VkID4gbnVtX3NlbnQpCi0gICAgICAgICAgICBsMmNiLmJsZV9yb3VuZF9yb2Jpbl91bmFja2VkIC09IG51bV9zZW50OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIERvbid0IGdvIG5lZ2F0aXZlICovCi0gICAgICAgICAgaWYgKGwyY2Iucm91bmRfcm9iaW5fdW5hY2tlZCA+IG51bV9zZW50KQotICAgICAgICAgICAgbDJjYi5yb3VuZF9yb2Jpbl91bmFja2VkIC09IG51bV9zZW50OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGwyY2Iucm91bmRfcm9iaW5fdW5hY2tlZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogRG9uJ3QgZ28gbmVnYXRpdmUgKi8KLSAgICAgIGlmIChwX2xjYi0+c2VudF9ub3RfYWNrZWQgPiBudW1fc2VudCkKLSAgICAgICAgcF9sY2ItPnNlbnRfbm90X2Fja2VkIC09IG51bV9zZW50OwotICAgICAgZWxzZQotICAgICAgICBwX2xjYi0+c2VudF9ub3RfYWNrZWQgPSAwOwotCi0gICAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIE5VTEwpOwotCi0gICAgICAvKiBJZiB3ZSB3ZXJlIGRvaW5nIHJvdW5kLXJvYmluIGZvciBsb3cgcHJpb3JpdHkgbGlua3MsIGNoZWNrICdlbSAqLwotICAgICAgaWYgKChwX2xjYi0+YWNsX3ByaW9yaXR5ID09IEwyQ0FQX1BSSU9SSVRZX0hJR0gpICYmCi0gICAgICAgICAgKGwyY2IuY2hlY2tfcm91bmRfcm9iaW4pICYmCi0gICAgICAgICAgKGwyY2Iucm91bmRfcm9iaW5fdW5hY2tlZCA8IGwyY2Iucm91bmRfcm9iaW5fcXVvdGEpKSB7Ci0gICAgICAgIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhOVUxMLCAwLCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIGlmICgocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpICYmCi0gICAgICAgICAgKHBfbGNiLT5hY2xfcHJpb3JpdHkgPT0gTDJDQVBfUFJJT1JJVFlfSElHSCkgJiYKLSAgICAgICAgICAoKGwyY2IuYmxlX2NoZWNrX3JvdW5kX3JvYmluKSAmJgotICAgICAgICAgICAobDJjYi5ibGVfcm91bmRfcm9iaW5fdW5hY2tlZCA8IGwyY2IuYmxlX3JvdW5kX3JvYmluX3F1b3RhKSkpIHsKLSAgICAgICAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKE5VTEwsIDAsIE5VTEwpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwX2xjYikgewotICAgICAgaWYgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgICAgIExPR19ERUJVRygiVG90YWxXaW49JWQsTGlua1VuYWNrKDB4JXgpPSVkLFJSQ2hlY2s9JWQsUlJVbmFjaz0lZCIsCi0gICAgICAgICAgICAgICAgICBsMmNiLmNvbnRyb2xsZXJfbGVfeG1pdF93aW5kb3csIHBfbGNiLT5IYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgIHBfbGNiLT5zZW50X25vdF9hY2tlZCwgbDJjYi5ibGVfY2hlY2tfcm91bmRfcm9iaW4sCi0gICAgICAgICAgICAgICAgICBsMmNiLmJsZV9yb3VuZF9yb2Jpbl91bmFja2VkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19ERUJVRygiVG90YWxXaW49JWQsTGlua1VuYWNrKDB4JXgpPSVkLFJSQ2hlY2s9JWQsUlJVbmFjaz0lZCIsCi0gICAgICAgICAgICAgICAgICBsMmNiLmNvbnRyb2xsZXJfeG1pdF93aW5kb3csIHBfbGNiLT5IYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgIHBfbGNiLT5zZW50X25vdF9hY2tlZCwgbDJjYi5jaGVja19yb3VuZF9yb2JpbiwKLSAgICAgICAgICAgICAgICAgIGwyY2Iucm91bmRfcm9iaW5fdW5hY2tlZCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19ERUJVRygiVG90YWxXaW49JWQgIExFX1dpbjogJWQsIEhhbmRsZT0weCV4LCBSUkNoZWNrPSVkLCBSUlVuYWNrPSVkIiwKLSAgICAgICAgICAgICAgICBsMmNiLmNvbnRyb2xsZXJfeG1pdF93aW5kb3csIGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdywKLSAgICAgICAgICAgICAgICBoYW5kbGUsIGwyY2IuYmxlX2NoZWNrX3JvdW5kX3JvYmluLAotICAgICAgICAgICAgICAgIGwyY2IuYmxlX3JvdW5kX3JvYmluX3VuYWNrZWQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGwyY19wYWNrZXRzX2NvbXBsZXRlZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9zZW50KSB7Ci0gIHRMMkNfTENCKiBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIGlmIChwX2xjYiA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfbGNiLT51cGRhdGVfb3V0c3RhbmRpbmdfcGFja2V0cyhudW1fc2VudCk7Ci0KLSAgc3dpdGNoIChwX2xjYi0+dHJhbnNwb3J0KSB7Ci0gICAgY2FzZSBCVF9UUkFOU1BPUlRfQlJfRURSOgotICAgICAgbDJjYi5jb250cm9sbGVyX3htaXRfd2luZG93ICs9IG51bV9zZW50OwotICAgICAgaWYgKHBfbGNiLT5pc19yb3VuZF9yb2Jpbl9zY2hlZHVsaW5nKCkpCi0gICAgICAgIGwyY2IudXBkYXRlX291dHN0YW5kaW5nX2NsYXNzaWNfcGFja2V0cyhudW1fc2VudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1RSQU5TUE9SVF9MRToKLSAgICAgIGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdyArPSBudW1fc2VudDsKLSAgICAgIGlmIChwX2xjYi0+aXNfcm91bmRfcm9iaW5fc2NoZWR1bGluZygpKQotICAgICAgICBsMmNiLnVwZGF0ZV9vdXRzdGFuZGluZ19sZV9wYWNrZXRzKG51bV9zZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlVua25vd24gdHJhbnNwb3J0IHJlY2VpdmVkOiV1IiwgcF9sY2ItPnRyYW5zcG9ydCk7Ci0gICAgICByZXR1cm47Ci0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIE5VTEwpOwotCi0gIGlmIChwX2xjYi0+aXNfaGlnaF9wcmlvcml0eSgpKSB7Ci0gICAgc3dpdGNoIChwX2xjYi0+dHJhbnNwb3J0KSB7Ci0gICAgICBjYXNlIEJUX1RSQU5TUE9SVF9MRToKLSAgICAgICAgaWYgKGwyY2IuYmxlX2NoZWNrX3JvdW5kX3JvYmluICYmCi0gICAgICAgICAgICBsMmNiLmlzX2JsZV9yb3VuZF9yb2Jpbl9xdW90YV9hdmFpbGFibGUoKSkKLSAgICAgICAgICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMoTlVMTCwgMCwgTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCVF9UUkFOU1BPUlRfQlJfRURSOgotICAgICAgICBpZiAobDJjYi5jaGVja19yb3VuZF9yb2JpbiAmJgotICAgICAgICAgICAgbDJjYi5pc19jbGFzc2ljX3JvdW5kX3JvYmluX3F1b3RhX2F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKE5VTEwsIDAsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfbGlua19zZWdtZW50c194bWl0dGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBIQ0kgSW50ZXJmYWNlIHdoZW4gYW4gQUNMCi0gKiAgICAgICAgICAgICAgICAgIGRhdGEgcGFja2V0IHNlZ21lbnQgaXMgdHJhbnNtaXR0ZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2xpbmtfc2VnbWVudHNfeG1pdHRlZChCVF9IRFIqIHBfbXNnKSB7Ci0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBwX21zZy0+b2Zmc2V0OwotCi0gIC8qIEV4dHJhY3QgdGhlIGhhbmRsZSAqLwotICB1aW50MTZfdCBoYW5kbGV7SENJX0lOVkFMSURfSEFORExFfTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICBoYW5kbGUgPSBIQ0lEX0dFVF9IQU5ETEUoaGFuZGxlKTsKLQotICAvKiBGaW5kIHRoZSBMQ0IgYmFzZWQgb24gdGhlIGhhbmRsZSAqLwotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAocF9sY2IgPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCBzZWdtZW50IGNvbXBsZXRlIGZvciB1bmtub3duIGNvbm5lY3Rpb24gaGFuZGxlOiVkIiwKLSAgICAgICAgICAgICBoYW5kbGUpOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9sY2ItPmxpbmtfc3RhdGUgIT0gTFNUX0NPTk5FQ1RFRCkgewotICAgIExPR19JTkZPKCJSZWNlaXZlZCBzZWdtZW50IGNvbXBsZXRlIGZvciB1bmNvbm5lY3RlZCBjb25uZWN0aW9uIGhhbmRsZTolZDoiLAotICAgICAgICAgICAgIGhhbmRsZSk7Ci0gICAgb3NpX2ZyZWUocF9tc2cpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEVucXVldWUgdGhlIGJ1ZmZlciB0byB0aGUgaGVhZCBvZiB0aGUgdHJhbnNtaXQgcXVldWUsIGFuZCBzZWUgKi8KLSAgLyogaWYgd2UgY2FuIHRyYW5zbWl0IGFueXRoaW5nIG1vcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBsaXN0X3ByZXBlbmQocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EsIHBfbXNnKTsKLQotICBwX2xjYi0+cGFydGlhbF9zZWdtZW50X2JlaW5nX3NlbnQgPSBmYWxzZTsKLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIE5VTEwpOwotfQotCi10QlRNX1NUQVRVUyBsMmN1X0Nvbm5lY3RBY2xGb3JTZWN1cml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Db25uZWN0Rm9yU2VjdXJpdHkoYmRfYWRkcik7Ci0gICAgcmV0dXJuIEJUTV9TVUNDRVNTOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9iZF9hZGRyKGJkX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICBpZiAocF9sY2IgJiYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICBwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfQ09OTkVDVElORykpIHsKLSAgICBMT0dfV0FSTigiQ29ubmVjdGlvbiBhbHJlYWR5IGV4aXN0cyIpOwotICAgIHJldHVybiBCVE1fQ01EX1NUQVJURUQ7Ci0gIH0KLQotICAvKiBNYWtlIHN1cmUgYW4gTDJjYXAgbGluayBjb250cm9sIGJsb2NrIGlzIGF2YWlsYWJsZSAqLwotICBpZiAoIXBfbGNiICYmCi0gICAgICAocF9sY2IgPSBsMmN1X2FsbG9jYXRlX2xjYihiZF9hZGRyLCB0cnVlLCBCVF9UUkFOU1BPUlRfQlJfRURSKSkgPT0gTlVMTCkgewotICAgIExPR19XQVJOKCJmYWlsZWQgYWxsb2NhdGUgTENCIGZvciAlcyIsIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gQlRNX05PX1JFU09VUkNFUzsKLSAgfQotCi0gIGwyY3VfY3JlYXRlX2Nvbm5fYnJfZWRyKHBfbGNiKTsKLSAgYnRtX2FjbF9zZXRfcGFnaW5nKHRydWUpOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgbDJjYmxlX3VwZGF0ZV9zZWNfYWN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHNlY19hY3QpIHsKLSAgdEwyQ19MQ0IqIGxjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfTEUpOwotICBsY2ItPnNlY19hY3QgPSBzZWNfYWN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2dldF9uZXh0X2NoYW5uZWxfaW5fcnIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGdldCB0aGUgbmV4dCBjaGFubmVsIHRvIHNlbmQgb24gYSBsaW5rLiBJdCBhbHNvIGFkanVzdHMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIENDQiBxdWV1ZSB0byBkbyBhIGJhc2ljIHByaW9yaXR5IGFuZCByb3VuZC1yb2JpbiBzY2hlZHVsaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBDQ0Igb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10TDJDX0NDQiogbDJjdV9nZXRfbmV4dF9jaGFubmVsX2luX3JyKHRMMkNfTENCKiBwX2xjYikgewotICB0TDJDX0NDQiogcF9zZXJ2ZV9jY2IgPSBOVUxMOwotICB0TDJDX0NDQiogcF9jY2I7Ci0KLSAgaW50IGksIGo7Ci0KLSAgLyogc2NhbiBhbGwgb2YgcHJpb3JpdHkgdW50aWwgZmluZGluZyBhIGNoYW5uZWwgdG8gc2VydmUgKi8KLSAgZm9yIChpID0gMDsgKGkgPCBMMkNBUF9OVU1fQ0hOTF9QUklPUklUWSkgJiYgKCFwX3NlcnZlX2NjYik7IGkrKykgewotICAgIC8qIHNjYW4gYWxsIGNoYW5uZWwgd2l0aGluIHNlcnZpbmcgcHJpb3JpdHkgZ3JvdXAgdW50aWwgZmluZGluZyBhIGNoYW5uZWwgdG8KLSAgICAgKiBzZXJ2ZSAqLwotICAgIGZvciAoaiA9IDA7IChqIDwgcF9sY2ItPnJyX3NlcnZbcF9sY2ItPnJyX3ByaV0ubnVtX2NjYikgJiYgKCFwX3NlcnZlX2NjYik7Ci0gICAgICAgICBqKyspIHsKLSAgICAgIC8qIHNjYW5pbmcgZnJvbSBuZXh0IHNlcnZpbmcgY2hhbm5lbCAqLwotICAgICAgcF9jY2IgPSBwX2xjYi0+cnJfc2VydltwX2xjYi0+cnJfcHJpXS5wX3NlcnZlX2NjYjsKLQotICAgICAgaWYgKCFwX2NjYikgewotICAgICAgICBMT0dfRVJST1IoInBfc2VydmVfY2NiIGlzIE5VTEwsIHJyX3ByaT0lZCIsIHBfbGNiLT5ycl9wcmkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgICAgTE9HX0RFQlVHKCJSUiBzY2FuIHByaT0lZCwgbGNpZD0weCUwNHgsIHFfY291dD0lenUiLCBwX2NjYi0+Y2NiX3ByaW9yaXR5LAotICAgICAgICAgICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NjYi0+eG1pdF9ob2xkX3EpKTsKLQotICAgICAgLyogc3RvcmUgdGhlIG5leHQgc2VydmluZyBjaGFubmVsICovCi0gICAgICAvKiB0aGlzIGNoYW5uZWwgaXMgdGhlIGxhc3QgY2hhbm5lbCBvZiBpdHMgcHJpb3JpdHkgZ3JvdXAgKi8KLSAgICAgIGlmICgocF9jY2ItPnBfbmV4dF9jY2IgPT0gTlVMTCkgfHwKLSAgICAgICAgICAocF9jY2ItPnBfbmV4dF9jY2ItPmNjYl9wcmlvcml0eSAhPSBwX2NjYi0+Y2NiX3ByaW9yaXR5KSkgewotICAgICAgICAvKiBuZXh0IHNlcnZpbmcgY2hhbm5lbCBpcyBzZXQgdG8gdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIGdyb3VwICovCi0gICAgICAgIHBfbGNiLT5ycl9zZXJ2W3BfbGNiLT5ycl9wcmldLnBfc2VydmVfY2NiID0KLSAgICAgICAgICAgIHBfbGNiLT5ycl9zZXJ2W3BfbGNiLT5ycl9wcmldLnBfZmlyc3RfY2NiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogbmV4dCBzZXJ2aW5nIGNoYW5uZWwgaXMgc2V0IHRvIHRoZSBuZXh0IGNoYW5uZWwgaW4gdGhlIGdyb3VwICovCi0gICAgICAgIHBfbGNiLT5ycl9zZXJ2W3BfbGNiLT5ycl9wcmldLnBfc2VydmVfY2NiID0gcF9jY2ItPnBfbmV4dF9jY2I7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX2NjYi0+Y2hubF9zdGF0ZSAhPSBDU1RfT1BFTikgY29udGludWU7Ci0KLSAgICAgIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJDb25uZWN0aW9uIG9yaWVudGVkIGNoYW5uZWwiKTsKLSAgICAgICAgaWYgKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT54bWl0X2hvbGRfcSkpIGNvbnRpbnVlOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBlTDJDQVAgb3B0aW9uIGluIHVzZSAqLwotICAgICAgICBpZiAocF9jY2ItPnBlZXJfY2ZnLmZjci5tb2RlICE9IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFKSB7Ci0gICAgICAgICAgaWYgKHBfY2NiLT5mY3JiLndhaXRfYWNrIHx8IHBfY2NiLT5mY3JiLnJlbW90ZV9idXN5KSBjb250aW51ZTsKLQotICAgICAgICAgIGlmIChmaXhlZF9xdWV1ZV9pc19lbXB0eShwX2NjYi0+ZmNyYi5yZXRyYW5zX3EpKSB7Ci0gICAgICAgICAgICBpZiAoZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnhtaXRfaG9sZF9xKSkgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8qIElmIGluIGVSVE0gbW9kZSwgY2hlY2sgZm9yIHdpbmRvdyBjbG9zdXJlICovCi0gICAgICAgICAgICBpZiAoKHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfRVJUTV9NT0RFKSAmJgotICAgICAgICAgICAgICAgIChsMmNfZmNyX2lzX2Zsb3dfY29udHJvbGxlZChwX2NjYikpKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfY2NiLT54bWl0X2hvbGRfcSkpIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGZvdW5kIGEgY2hhbm5lbCB0byBzZXJ2ZSAqLwotICAgICAgcF9zZXJ2ZV9jY2IgPSBwX2NjYjsKLSAgICAgIC8qIGRlY3JlYXNlIHF1b3RhIG9mIGl0cyBwcmlvcml0eSBncm91cCAqLwotICAgICAgcF9sY2ItPnJyX3NlcnZbcF9sY2ItPnJyX3ByaV0ucXVvdGEtLTsKLSAgICB9Ci0KLSAgICAvKiBpZiB0aGVyZSBpcyBubyBtb3JlIHF1b3RhIG9mIHRoZSBwcmlvcml0eSBncm91cCBvciBubyBjaGFubmVsIHRvIGhhdmUKLSAgICAgKiBkYXRhIHRvIHNlbmQgKi8KLSAgICBpZiAoKHBfbGNiLT5ycl9zZXJ2W3BfbGNiLT5ycl9wcmldLnF1b3RhID09IDApIHx8ICghcF9zZXJ2ZV9jY2IpKSB7Ci0gICAgICAvKiBzZXJ2ZSBuZXh0IHByaW9yaXR5IGdyb3VwICovCi0gICAgICBwX2xjYi0+cnJfcHJpID0gKHBfbGNiLT5ycl9wcmkgKyAxKSAlIEwyQ0FQX05VTV9DSE5MX1BSSU9SSVRZOwotICAgICAgLyogaW5pdGlhbGl6ZSBpdHMgcXVvdGEgKi8KLSAgICAgIHBfbGNiLT5ycl9zZXJ2W3BfbGNiLT5ycl9wcmldLnF1b3RhID0KLSAgICAgICAgICBMMkNBUF9HRVRfUFJJT1JJVFlfUVVPVEEocF9sY2ItPnJyX3ByaSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBfc2VydmVfY2NiKSB7Ci0gICAgTE9HX0RFQlVHKCJSUiBzZXJ2aWNlIHByaT0lZCwgcXVvdGE9JWQsIGxjaWQ9MHglMDR4IiwKLSAgICAgICAgICAgICAgcF9zZXJ2ZV9jY2ItPmNjYl9wcmlvcml0eSwKLSAgICAgICAgICAgICAgcF9sY2ItPnJyX3NlcnZbcF9zZXJ2ZV9jY2ItPmNjYl9wcmlvcml0eV0ucXVvdGEsCi0gICAgICAgICAgICAgIHBfc2VydmVfY2NiLT5sb2NhbF9jaWQpOwotICB9Ci0KLSAgcmV0dXJuIHBfc2VydmVfY2NiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2dldF9uZXh0X2J1ZmZlcl90b19zZW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBnZXQgdGhlIG5leHQgYnVmZmVyIHRvIHNlbmQgb24gYSBsaW5rLiBJdCBhbHNvIGFkanVzdHMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIENDQiBxdWV1ZSB0byBkbyBhIGJhc2ljIHByaW9yaXR5IGFuZCByb3VuZC1yb2JpbiBzY2hlZHVsaW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBidWZmZXIgb3IgTlVMTAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CVF9IRFIqIGwyY3VfZ2V0X25leHRfYnVmZmVyX3RvX3NlbmQodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIHRMMkNfQ0NCKiBwX2NjYjsKLSAgQlRfSERSKiBwX2J1ZjsKLQotICAvKiBIaWdoZXN0IHByaW9yaXR5IGFyZSBmaXhlZCBjaGFubmVscyAqLwotICBpbnQgeHg7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgTDJDQVBfTlVNX0ZJWEVEX0NITkxTOyB4eCsrKSB7Ci0gICAgcF9jY2IgPSBwX2xjYi0+cF9maXhlZF9jY2JzW3h4XTsKLSAgICBpZiAocF9jY2IgPT0gTlVMTCkgY29udGludWU7Ci0KLSAgICAvKiBlTDJDQVAgb3B0aW9uIGluIHVzZSAqLwotICAgIGlmIChwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgIT0gTDJDQVBfRkNSX0JBU0lDX01PREUpIHsKLSAgICAgIGlmIChwX2NjYi0+ZmNyYi53YWl0X2FjayB8fCBwX2NjYi0+ZmNyYi5yZW1vdGVfYnVzeSkgY29udGludWU7Ci0KLSAgICAgIC8qIE5vIG1vcmUgY2hlY2tzIG5lZWRlZCBpZiBzZW5kaW5nIGZyb20gdGhlIHJlYXRyYW5zbWl0IHF1ZXVlICovCi0gICAgICBpZiAoZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPmZjcmIucmV0cmFuc19xKSkgewotICAgICAgICBpZiAoZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnhtaXRfaG9sZF9xKSkgY29udGludWU7Ci0KLSAgICAgICAgLyogSWYgaW4gZVJUTSBtb2RlLCBjaGVjayBmb3Igd2luZG93IGNsb3N1cmUgKi8KLSAgICAgICAgaWYgKChwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0VSVE1fTU9ERSkgJiYKLSAgICAgICAgICAgIChsMmNfZmNyX2lzX2Zsb3dfY29udHJvbGxlZChwX2NjYikpKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBwX2J1ZiA9IGwyY19mY3JfZ2V0X25leHRfeG1pdF9zZHVfc2VnKHBfY2NiLCAwKTsKLSAgICAgIGlmIChwX2J1ZiAhPSBOVUxMKSB7Ci0gICAgICAgIGwyY3VfY2hlY2tfY2hhbm5lbF9jb25nZXN0aW9uKHBfY2NiKTsKLSAgICAgICAgbDJjdV9zZXRfYWNsX2hjaV9oZWFkZXIocF9idWYsIHBfY2NiKTsKLSAgICAgICAgcmV0dXJuIChwX2J1Zik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9jY2ItPnhtaXRfaG9sZF9xKSkgewotICAgICAgICBwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT54bWl0X2hvbGRfcSk7Ci0gICAgICAgIGlmIChOVUxMID09IHBfYnVmKSB7Ci0gICAgICAgICAgTE9HX0VSUk9SKCJObyBkYXRhIHRvIGJlIHNlbnQiKTsKLSAgICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgICAgICB9Ci0KLSAgICAgICAgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24ocF9jY2IpOwotICAgICAgICBsMmN1X3NldF9hY2xfaGNpX2hlYWRlcihwX2J1ZiwgcF9jY2IpOwotICAgICAgICByZXR1cm4gKHBfYnVmKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBnZXQgbmV4dCBzZXJ2aW5nIGNoYW5uZWwgaW4gcm91bmQtcm9iaW4gKi8KLSAgcF9jY2IgPSBsMmN1X2dldF9uZXh0X2NoYW5uZWxfaW5fcnIocF9sY2IpOwotCi0gIC8qIFJldHVybiBpZiBubyBidWZmZXIgKi8KLSAgaWYgKHBfY2NiID09IE5VTEwpIHJldHVybiAoTlVMTCk7Ci0KLSAgaWYgKHBfY2NiLT5wX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgIC8qIENoZWNrIGNyZWRpdHMgKi8KLSAgICBpZiAocF9jY2ItPnBlZXJfY29ubl9jZmcuY3JlZGl0cyA9PSAwKSB7Ci0gICAgICBMT0dfREVCVUcoIk5vIGNyZWRpdHMgdG8gc2VuZCBwYWNrZXRzIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBib29sIGxhc3RfcGllY2Vfb2Zfc2R1ID0gZmFsc2U7Ci0gICAgcF9idWYgPSBsMmNfbGNjX2dldF9uZXh0X3htaXRfc2R1X3NlZyhwX2NjYiwgJmxhc3RfcGllY2Vfb2Zfc2R1KTsKLSAgICBwX2NjYi0+cGVlcl9jb25uX2NmZy5jcmVkaXRzLS07Ci0KLSAgICBpZiAobGFzdF9waWVjZV9vZl9zZHUpIHsKLSAgICAgIC8vIFRPRE86IHNlbmQgY2FsbGJhY2sgdXAgdGhlIHN0YWNrLiBJbnZlc3RpZ2F0ZSBzZXR0aW5nIHBfY2JpLT5jYiB0bwotICAgICAgLy8gbm90aWZ5IGFmdGVyIGNvbnRyb2xsZXIgYWNrIHNlbmQuCi0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgaWYgKHBfY2NiLT5wZWVyX2NmZy5mY3IubW9kZSAhPSBMMkNBUF9GQ1JfQkFTSUNfTU9ERSkgewotICAgICAgcF9idWYgPSBsMmNfZmNyX2dldF9uZXh0X3htaXRfc2R1X3NlZyhwX2NjYiwgMCk7Ci0gICAgICBpZiAocF9idWYgPT0gTlVMTCkgcmV0dXJuIChOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgcF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2NjYi0+eG1pdF9ob2xkX3EpOwotICAgICAgaWYgKE5VTEwgPT0gcF9idWYpIHsKLSAgICAgICAgTE9HX0VSUk9SKCIjMjogTm8gZGF0YSB0byBiZSBzZW50Iik7Ci0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBfY2NiLT5wX3JjYiAmJiBwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9UeENvbXBsZXRlX0NiICYmCi0gICAgICAocF9jY2ItPnBlZXJfY2ZnLmZjci5tb2RlICE9IEwyQ0FQX0ZDUl9FUlRNX01PREUpKQotICAgICgqcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfVHhDb21wbGV0ZV9DYikocF9jY2ItPmxvY2FsX2NpZCwgMSk7Ci0KLSAgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24ocF9jY2IpOwotCi0gIGwyY3Vfc2V0X2FjbF9oY2lfaGVhZGVyKHBfYnVmLCBwX2NjYik7Ci0KLSAgcmV0dXJuIChwX2J1Zik7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9sMmNhcC9sMmNfbWFpbi5jYyBiL3N0YWNrL2wyY2FwL2wyY19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg2ZjAzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL2wyY2FwL2wyY19tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBMMkNBUCBlbnRyeSBwb2ludHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2wyY19tYWluIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9idHNub29wLmgiCi0jaW5jbHVkZSAiaGNpbXNncy5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNfaW50LmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcHJvY2Vzc19sMmNhcF9jbWQodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90KiBwLCB1aW50MTZfdCBwa3RfbGVuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgRyBMIE8gQiBBIEwgICAgICBMIDIgQyBBIFAgICAgICAgRCBBIFQgQSAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEwyQ19DQiBsMmNiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX3Jjdl9hY2xfZGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgSENJIEludGVyZmFjZSB3aGVuIGFuIEFDTAotICogICAgICAgICAgICAgICAgICBkYXRhIHBhY2tldCBpcyByZWNlaXZlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfcmN2X2FjbF9kYXRhKEJUX0hEUiogcF9tc2cpIHsKLSAgdWludDhfdCogcCA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0KLSAgLyogRXh0cmFjdCB0aGUgaGFuZGxlICovCi0gIHVpbnQxNl90IGhhbmRsZTsKLSAgU1RSRUFNX1RPX1VJTlQxNihoYW5kbGUsIHApOwotICB1aW50OF90IHBrdF90eXBlID0gSENJRF9HRVRfRVZFTlQoaGFuZGxlKTsKLSAgaGFuZGxlID0gSENJRF9HRVRfSEFORExFKGhhbmRsZSk7Ci0KLSAgLyogU2luY2UgdGhlIEhDSSBUcmFuc3BvcnQgaXMgcHV0dGluZyBzZWdtZW50ZWQgcGFja2V0cyBiYWNrIHRvZ2V0aGVyLCB3ZSAqLwotICAvKiBzaG91bGQgbmV2ZXIgZ2V0IGEgdmFsaWQgcGFja2V0IHdpdGggdGhlIHR5cGUgc2V0IHRvICJjb250aW51YXRpb24iICAgICovCi0gIGlmIChwa3RfdHlwZSA9PSBMMkNBUF9QS1RfQ09OVElOVUUpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIHJlY2VpdmVkIHBhY2tldCBjb250aW51YXRpb24iKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgaGNpX2xlbjsKLSAgU1RSRUFNX1RPX1VJTlQxNihoY2lfbGVuLCBwKTsKLSAgaWYgKGhjaV9sZW4gPCBMMkNBUF9QS1RfT1ZFUkhFQUQgfHwgaGNpX2xlbiAhPSBwX21zZy0+bGVuIC0gNCkgewotICAgIC8qIFJlbW90ZS1kZWNsYXJlZCBwYWNrZXQgc2l6ZSBtdXN0IG1hdGNoIEhDSV9BQ0wgc2l6ZSAtIEFDTCBoZWFkZXIgKDQpICovCi0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBnb3QgaW5jb3JyZWN0IGhjaSBoZWFkZXIiKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDE2X3QgbDJjYXBfbGVuLCByY3ZfY2lkOwotICBTVFJFQU1fVE9fVUlOVDE2KGwyY2FwX2xlbiwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UMTYocmN2X2NpZCwgcCk7Ci0KLSAgLyogRmluZCB0aGUgTENCIGJhc2VkIG9uIHRoZSBoYW5kbGUgKi8KLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKCFwX2xjYikgewotICAgIC8qIFRoZXJlIGlzIGEgc2xpZ2h0IHBvc3NpYmlsaXR5IChzcGVjaWZpY2FsbHkgd2l0aCBVU0IpIHRoYXQgd2UgZ2V0IGFuICovCi0gICAgLyogTDJDQVAgY29ubmVjdGlvbiByZXF1ZXN0IGJlZm9yZSB3ZSBnZXQgdGhlIEhDSSBjb25uZWN0aW9uIGNvbXBsZXRlLiAgKi8KLSAgICAvKiBTbyBmb3IgdGhlc2UgdHlwZXMgb2YgbWVzc2FnZXMsIGhvbGQgdGhlbSBmb3IgdXAgdG8gMiBzZWNvbmRzLiAgICAgICAqLwotICAgIGlmIChsMmNhcF9sZW4gPT0gMCkgewotICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygicmVjZWl2ZWQgZW1wdHkgTDJDQVAgcGFja2V0Iik7Ci0gICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQ4X3QgY21kX2NvZGU7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGNtZF9jb2RlLCBwKTsKLQotICAgIGlmICgocF9tc2ctPmxheWVyX3NwZWNpZmljICE9IDApIHx8IChyY3ZfY2lkICE9IEwyQ0FQX1NJR05BTExJTkdfQ0lEKSB8fAotICAgICAgICAoY21kX2NvZGUgIT0gTDJDQVBfQ01EX0lORk9fUkVRICYmIGNtZF9jb2RlICE9IEwyQ0FQX0NNRF9DT05OX1JFUSkpIHsKLSAgICAgIGJvb2wgcWNvbV9kZWJ1Z19sb2cgPSAoaGFuZGxlID09IDM4MDQgJiYgKChyY3ZfY2lkICYgMHhmZikgPT0gMHhmZikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmxheWVyX3NwZWNpZmljID09IDApOwotCi0gICAgICBpZiAoIXFjb21fZGVidWdfbG9nKSB7Ci0gICAgICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIkwyQ0FQIC0gcmN2ZCBBQ0wgZm9yIHVua25vd24gaGFuZGxlOiVkIGxzOiVkIGNpZDolZCBvcGNvZGU6JWQgY3VyICIKLSAgICAgICAgICAgICJjb3VudDolZCIsCi0gICAgICAgICAgICBoYW5kbGUsIHBfbXNnLT5sYXllcl9zcGVjaWZpYywgcmN2X2NpZCwgY21kX2NvZGUsCi0gICAgICAgICAgICBsaXN0X2xlbmd0aChsMmNiLnJjdl9wZW5kaW5nX3EpKTsKLSAgICAgIH0KLQotICAgICAgb3NpX2ZyZWUocF9tc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICJMMkNBUCAtIGhvbGRpbmcgQUNMIGZvciB1bmtub3duIGhhbmRsZTolZCBsczolZCBjaWQ6JWQgb3Bjb2RlOiVkIGN1ciAiCi0gICAgICAgICJjb3VudDolZCIsCi0gICAgICAgIGhhbmRsZSwgcF9tc2ctPmxheWVyX3NwZWNpZmljLCByY3ZfY2lkLCBjbWRfY29kZSwKLSAgICAgICAgbGlzdF9sZW5ndGgobDJjYi5yY3ZfcGVuZGluZ19xKSk7Ci0gICAgcF9tc2ctPmxheWVyX3NwZWNpZmljID0gMjsKLSAgICBsaXN0X2FwcGVuZChsMmNiLnJjdl9wZW5kaW5nX3EsIHBfbXNnKTsKLQotICAgIGlmIChsaXN0X2xlbmd0aChsMmNiLnJjdl9wZW5kaW5nX3EpID09IDEpIHsKLSAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChsMmNiLnJlY2VpdmVfaG9sZF90aW1lciwgQlRfMVNFQ19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIGwyY19yZWNlaXZlX2hvbGRfdGltZXJfdGltZW91dCwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGhlYWRlciAqLwotICBwX21zZy0+b2Zmc2V0ICs9IDQ7Ci0KLSAgLyogZm9yIEJMRSBjaGFubmVsLCBhbHdheXMgbm90aWZ5IGNvbm5lY3Rpb24gd2hlbiBBQ0wgZGF0YSByZWNlaXZlZCBvbiB0aGUKLSAgICogbGluayAqLwotICBpZiAocF9sY2IgJiYgcF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUgJiYKLSAgICAgIHBfbGNiLT5saW5rX3N0YXRlICE9IExTVF9ESVNDT05ORUNUSU5HKSB7Ci0gICAgLyogb25seSBwcm9jZXNzIGZpeGVkIGNoYW5uZWwgZGF0YSBhcyBjaGFubmVsIG9wZW4gaW5kaWNhdGlvbiB3aGVuIGxpbmsgaXMKLSAgICAgKiBub3QgaW4gZGlzY29ubmVjdGluZyBtb2RlICovCi0gICAgbDJjYmxlX25vdGlmeV9sZV9jb25uZWN0aW9uKHBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0gIH0KLQotICAvKiBGaW5kIHRoZSBDQ0IgZm9yIHRoaXMgQ0lEICovCi0gIHRMMkNfQ0NCKiBwX2NjYiA9IE5VTEw7Ci0gIGlmIChyY3ZfY2lkID49IEwyQ0FQX0JBU0VfQVBQTF9DSUQpIHsKLSAgICBwX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKHBfbGNiLCByY3ZfY2lkKTsKLSAgICBpZiAoIXBfY2NiKSB7Ci0gICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIHVua25vd24gQ0lEOiAweCUwNHgiLCByY3ZfY2lkKTsKLSAgICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBwX21zZy0+bGVuID0gaGNpX2xlbiAtIEwyQ0FQX1BLVF9PVkVSSEVBRDsKLSAgcF9tc2ctPm9mZnNldCArPSBMMkNBUF9QS1RfT1ZFUkhFQUQ7Ci0KLSAgaWYgKGwyY2FwX2xlbiAhPSBwX21zZy0+bGVuKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBiYWQgbGVuZ3RoIGluIHBrdC4gRXhwOiAlZCAgQWN0OiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsMmNhcF9sZW4sIHBfbXNnLT5sZW4pOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBTZW5kIHRoZSBkYXRhIHRocm91Z2ggdGhlIGNoYW5uZWwgc3RhdGUgbWFjaGluZSAqLwotICBpZiAocmN2X2NpZCA9PSBMMkNBUF9TSUdOQUxMSU5HX0NJRCkgewotICAgIHByb2Nlc3NfbDJjYXBfY21kKHBfbGNiLCBwLCBsMmNhcF9sZW4pOwotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocmN2X2NpZCA9PSBMMkNBUF9DT05ORUNUSU9OTEVTU19DSUQpIHsKLSAgICAvKiBwcm9jZXNzX2Nvbm5lY3Rpb25sZXNzX2RhdGEgKHBfbGNiKTsgKi8KLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJjdl9jaWQgPT0gTDJDQVBfQkxFX1NJR05BTExJTkdfQ0lEKSB7Ci0gICAgbDJjYmxlX3Byb2Nlc3Nfc2lnX2NtZChwX2xjYiwgcCwgbDJjYXBfbGVuKTsKLSAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKChyY3ZfY2lkID49IEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwpICYmCi0gICAgICAocmN2X2NpZCA8PSBMMkNBUF9MQVNUX0ZJWEVEX0NITkwpICYmCi0gICAgICAobDJjYi5maXhlZF9yZWdbcmN2X2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdLnBMMkNBX0ZpeGVkRGF0YV9DYiAhPQotICAgICAgIE5VTEwpKSB7Ci0gICAgLyogb25seSBwcm9jZXNzIGZpeGVkIGNoYW5uZWwgZGF0YSB3aGVuIGxpbmsgaXMgb3BlbiBvciB3YWl0IGZvciBkYXRhCi0gICAgICogaW5kaWNhdGlvbiAqLwotICAgIGlmICghcF9sY2IgfHwgcF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0RJU0NPTk5FQ1RJTkcgfHwKLSAgICAgICAgIWwyY3VfaW5pdGlhbGl6ZV9maXhlZF9jY2IocF9sY2IsIHJjdl9jaWQpKSB7Ci0gICAgICBvc2lfZnJlZShwX21zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogSWYgbm8gQ0NCIGZvciB0aGlzIGNoYW5uZWwsIGFsbG9jYXRlIG9uZSAqLwotICAgIHBfY2NiID0gcF9sY2ItPnBfZml4ZWRfY2Nic1tyY3ZfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF07Ci0gICAgcF9jY2ItPm1ldHJpY3MucngocF9tc2ctPmxlbik7Ci0KLSAgICBpZiAocF9jY2ItPnBlZXJfY2ZnLmZjci5tb2RlICE9IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFKQotICAgICAgbDJjX2Zjcl9wcm9jX3BkdShwX2NjYiwgcF9tc2cpOwotICAgIGVsc2UKLSAgICAgICgqbDJjYi5maXhlZF9yZWdbcmN2X2NpZCAtIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkxdLnBMMkNBX0ZpeGVkRGF0YV9DYikoCi0gICAgICAgICAgcmN2X2NpZCwgcF9sY2ItPnJlbW90ZV9iZF9hZGRyLCBwX21zZyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFwX2NjYikgewotICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBsMmNfbGNjX3Byb2NfcGR1KHBfY2NiLCBwX21zZyk7Ci0KLSAgICAvKiBUaGUgcmVtb3RlIGRldmljZSBoYXMgb25lIGxlc3MgY3JlZGl0IGxlZnQgKi8KLSAgICAtLXBfY2NiLT5yZW1vdGVfY3JlZGl0X2NvdW50OwotCi0gICAgLyogSWYgdGhlIGNyZWRpdHMgbGVmdCBvbiB0aGUgcmVtb3RlIGRldmljZSBhcmUgZ2V0dGluZyBsb3csIHNlbmQgc29tZSAqLwotICAgIGlmIChwX2NjYi0+cmVtb3RlX2NyZWRpdF9jb3VudCA8PSBMMkNBUF9MRV9DUkVESVRfVEhSRVNIT0xEKSB7Ci0gICAgICB1aW50MTZfdCBjcmVkaXRzID0gTDJDQVBfTEVfQ1JFRElUX0RFRkFVTFQgLSBwX2NjYi0+cmVtb3RlX2NyZWRpdF9jb3VudDsKLSAgICAgIHBfY2NiLT5yZW1vdGVfY3JlZGl0X2NvdW50ID0gTDJDQVBfTEVfQ1JFRElUX0RFRkFVTFQ7Ci0KLSAgICAgIC8qIFJldHVybiBiYWNrIGNyZWRpdHMgKi8KLSAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfU0VORF9GTE9XX0NPTlRST0xfQ1JFRElULCAmY3JlZGl0cyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIEJhc2ljIG1vZGUgcGFja2V0cyBnbyBzdHJhaWdodCB0byB0aGUgc3RhdGUgbWFjaGluZSAqLwotICAgIGlmIChwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0JBU0lDX01PREUpCi0gICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9EQVRBLCBwX21zZyk7Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBlUlRNIG9yIHN0cmVhbWluZyBtb2RlLCBzbyB3ZSBuZWVkIHRvIHZhbGlkYXRlIHN0YXRlcyBmaXJzdCAqLwotICAgICAgaWYgKChwX2NjYi0+Y2hubF9zdGF0ZSA9PSBDU1RfT1BFTikgfHwgKHBfY2NiLT5jaG5sX3N0YXRlID09IENTVF9DT05GSUcpKQotICAgICAgICBsMmNfZmNyX3Byb2NfcGR1KHBfY2NiLCBwX21zZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIG9zaV9mcmVlKHBfbXNnKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHByb2Nlc3NfbDJjYXBfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBMMkNBUCBzaWduYWxsaW5nIENJRAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2wyY2FwX2NtZCh0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QqIHAsIHVpbnQxNl90IHBrdF9sZW4pIHsKLSAgdEwyQ19DT05OX0lORk8gY29uX2luZm87Ci0KLSAgLyogaWYgbDJjYXAgY29tbWFuZCByZWNlaXZlZCBpbiBDSUQgMSBvbiB0b3Agb2YgYW4gTEUgbGluaywgaWdub3JlIHRoaXMKLSAgICogY29tbWFuZCAqLwotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBMT0dfSU5GTygiRHJvcHBpbmcgZGF0YSBvbiBDSUQgMSBmb3IgTEUgbGluayIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlamVjdCB0aGUgcGFja2V0IGlmIGl0IGV4Y2VlZHMgdGhlIGRlZmF1bHQgU2lnbmFsbGluZyBDaGFubmVsIE1UVSAqLwotICBib29sIHBrdF9zaXplX3JlaiA9IGZhbHNlOwotICBpZiAocGt0X2xlbiA+IEwyQ0FQX0RFRkFVTFRfTVRVKSB7Ci0gICAgLyogQ29yZSBTcGVjIHJlcXVpcmVzIGEgc2luZ2xlIHJlc3BvbnNlIHRvIHRoZSBmaXJzdCBjb21tYW5kIGZvdW5kIGluIGEKLSAgICAgKiBtdWx0aS1jb21tYW5kIEwyY2FwIHBhY2tldC4gIElmIG9ubHkgcmVzcG9uc2VzIGluIHRoZSBwYWNrZXQsIHRoZW4gaXQKLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQuIEhlcmUgd2Ugc2ltcGx5IG1hcmsgdGhlIGJhZCBwYWNrZXQgYW5kIGRlY2lkZSB3aGljaCBjbWQKLSAgICAgKiBJRCB0byByZWplY3QgbGF0ZXIgKi8KLSAgICBwa3Rfc2l6ZV9yZWogPSB0cnVlOwotICAgIExPR19XQVJOKCJTaWduYWxpbmcgcGt0X2xlbj0lZCBleGNlZWRzIE1UVSBzaXplICVkIiwgcGt0X2xlbiwKLSAgICAgICAgICAgICBMMkNBUF9ERUZBVUxUX01UVSk7Ci0gIH0KLQotICB1aW50OF90KiBwX25leHRfY21kID0gcDsKLSAgdWludDhfdCogcF9wa3RfZW5kID0gcCArIHBrdF9sZW47Ci0KLSAgdEwyQ0FQX0NGR19JTkZPIGNmZ19pbmZvOwotICBtZW1zZXQoJmNmZ19pbmZvLCAwLCBzaXplb2YoY2ZnX2luZm8pKTsKLQotICAvKiBBbiBMMkNBUCBwYWNrZXQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgY29tbWFuZHMgKi8KLSAgd2hpbGUgKHRydWUpIHsKLSAgICAvKiBTbWFsbGVzdCBjb21tYW5kIGlzIDQgYnl0ZXMgKi8KLSAgICBwID0gcF9uZXh0X2NtZDsKLSAgICBpZiAocCA+IChwX3BrdF9lbmQgLSA0KSkgYnJlYWs7Ci0KLSAgICB1aW50OF90IGNtZF9jb2RlLCBpZDsKLSAgICB1aW50MTZfdCBjbWRfbGVuOwotICAgIFNUUkVBTV9UT19VSU5UOChjbWRfY29kZSwgcCk7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KGlkLCBwKTsKLSAgICBTVFJFQU1fVE9fVUlOVDE2KGNtZF9sZW4sIHApOwotCi0gICAgaWYgKGNtZF9sZW4gPiBCVF9TTUFMTF9CVUZGRVJfU0laRSkgewotICAgICAgTE9HX1dBUk4oIkNvbW1hbmQgc2l6ZSAldSBleGNlZWRzIGxpbWl0ICVkIiwgY21kX2xlbiwKLSAgICAgICAgICAgICAgIEJUX1NNQUxMX0JVRkZFUl9TSVpFKTsKLSAgICAgIGwyY3Vfc2VuZF9wZWVyX2NtZF9yZWplY3QocF9sY2IsIEwyQ0FQX0NNRF9SRUpfTVRVX0VYQ0VFREVELCBpZCwgMCwgMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgY29tbWFuZCBsZW5ndGggZG9lcyBub3QgZXhjZWVkIHBhY2tldCBsZW5ndGggKi8KLSAgICBwX25leHRfY21kID0gcCArIGNtZF9sZW47Ci0gICAgaWYgKHBfbmV4dF9jbWQgPiBwX3BrdF9lbmQpIHsKLSAgICAgIExPR19XQVJOKCJjbWRfbGVuID4gcGt0X2xlbiwgcGt0X2xlbj0lZCwgY21kX2xlbj0lZCwgY29kZT0lZCIsIHBrdF9sZW4sCi0gICAgICAgICAgICAgICBjbWRfbGVuLCBjbWRfY29kZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBMT0dfREVCVUcoImNtZF9jb2RlOiAlZCwgaWQ6JWQsIGNtZF9sZW46JWQiLCBjbWRfY29kZSwgaWQsIGNtZF9sZW4pOwotCi0gICAgLyogQmFkIEwyQ0FQIHBhY2tldCBsZW5ndGgsIGxvb2sgZm9yIGNtZCB0byByZWplY3QgKi8KLSAgICBpZiAocGt0X3NpemVfcmVqKSB7Ci0gICAgICAvKiBJZiBjb21tYW5kIGZvdW5kIHJlamVjdGVkIGl0IGFuZCB3ZSdyZSBkb25lLCBvdGhlcndpc2Uga2VlcCBsb29raW5nICovCi0gICAgICBpZiAobDJjX2lzX2NtZF9yZWplY3RlZChjbWRfY29kZSwgaWQsIHBfbGNiKSkgewotICAgICAgICBMT0dfV0FSTigiUmVqZWN0ZWQgY29tbWFuZCAlZCBkdWUgdG8gYmFkIHBhY2tldCBsZW5ndGgiLCBjbWRfY29kZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19XQVJOKCJObyBuZWVkIHRvIHJlamVjdCBjb21tYW5kICVkIGZvciBiYWQgcGFja2V0IGxlbiIsIGNtZF9jb2RlKTsKLSAgICAgICAgY29udGludWU7IC8qIExvb2sgZm9yIG5leHQgY21kL3Jlc3BvbnNlIGluIGN1cnJlbnQgcGFja2V0ICovCi0gICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChjbWRfY29kZSkgewotICAgICAgY2FzZSBMMkNBUF9DTURfUkVKRUNUOgotICAgICAgICB1aW50MTZfdCByZWpfcmVhc29uOwotICAgICAgICBpZiAocCArIDIgPiBwX25leHRfY21kKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX1JFSkVDVCIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHJlal9yZWFzb24sIHApOwotICAgICAgICBpZiAocmVqX3JlYXNvbiA9PSBMMkNBUF9DTURfUkVKX01UVV9FWENFRURFRCkgewotICAgICAgICAgIHVpbnQxNl90IHJlal9tdHU7Ci0gICAgICAgICAgaWYgKHAgKyAyID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX1JFSl9NVFVfRVhDRUVERUQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZWpfbXR1LCBwKTsKLSAgICAgICAgICAvKiBXaGF0IHRvIGRvIHdpdGggdGhlIE1UVSByZWplY3QgPyBXZSBoYXZlIG5lZ290aWF0ZWQgYW4gTVRVLiBGb3Igbm93Ci0gICAgICAgICAgICogd2Ugd2lsbCBpZ25vcmUgaXQgYW5kIGxldCBhIGhpZ2hlciBwcm90b2NvbCB0aW1lb3V0IHRha2UgY2FyZSBvZiBpdAotICAgICAgICAgICAqLwotICAgICAgICAgIExPR19XQVJOKCJNVFUgcmVqIEhhbmRsZTogJWQgTVRVOiAlZCIsIHBfbGNiLT5IYW5kbGUoKSwgcmVqX210dSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlal9yZWFzb24gPT0gTDJDQVBfQ01EX1JFSl9JTlZBTElEX0NJRCkgewotICAgICAgICAgIHVpbnQxNl90IGxjaWQsIHJjaWQ7Ci0gICAgICAgICAgaWYgKHAgKyA0ID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX1JFSl9JTlZBTElEX0NJRCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHJjaWQsIHApOwotICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYobGNpZCwgcCk7Ci0KLSAgICAgICAgICBMT0dfV0FSTigiUmVqZWN0ZWQgZHVlIHRvIGludmFsaWQgQ0lELCBMQ0lEOiAweCUwNHggUkNJRDogMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICBsY2lkLCByY2lkKTsKLQotICAgICAgICAgIC8qIFJlbW90ZSBDSUQgaW52YWxpZC4gVHJlYXQgYXMgYSBkaXNjb25uZWN0ICovCi0gICAgICAgICAgdEwyQ19DQ0IqIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQocF9sY2IsIGxjaWQpOwotICAgICAgICAgIGlmICgocF9jY2IgIT0gTlVMTCkgJiYgKHBfY2NiLT5yZW1vdGVfY2lkID09IHJjaWQpKSB7Ci0gICAgICAgICAgICAvKiBGYWtlIGxpbmsgZGlzY29ubmVjdCAtIG5vIHJlcGx5IGlzIGdlbmVyYXRlZCAqLwotICAgICAgICAgICAgTE9HX1dBUk4oIlJlbW90ZSBDSUQgaXMgaW52YWxpZCwgdHJlYXQgYXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MUF9ESVNDT05ORUNUX0lORCwgTlVMTCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU29ueUVyaWNzc29uIEluZm8gcmVxdWVzdCBCdWcgd29ya2Fyb3VuZCAoQ29udGludWUgY29ubmVjdGlvbikgKi8KLSAgICAgICAgZWxzZSBpZiAocmVqX3JlYXNvbiA9PSBMMkNBUF9DTURfUkVKX05PVF9VTkRFUlNUT09EICYmCi0gICAgICAgICAgICAgICAgIHBfbGNiLT53NF9pbmZvX3JzcCkgewotICAgICAgICAgIGFsYXJtX2NhbmNlbChwX2xjYi0+aW5mb19yZXNwX3RpbWVyKTsKLQotICAgICAgICAgIHBfbGNiLT53NF9pbmZvX3JzcCA9IGZhbHNlOwotICAgICAgICAgIHRMMkNfQ09OTl9JTkZPIGNpOwotICAgICAgICAgIGNpLnN0YXR1cyA9IEhDSV9TVUNDRVNTOwotICAgICAgICAgIGNpLmJkX2FkZHIgPSBwX2xjYi0+cmVtb3RlX2JkX2FkZHI7Ci0KLSAgICAgICAgICAvKiBGb3IgYWxsIGNoYW5uZWxzLCBzZW5kIHRoZSBldmVudCB0aHJvdWdoIHRoZWlyIEZTTXMgKi8KLSAgICAgICAgICBmb3IgKHRMMkNfQ0NCKiBwX2NjYiA9IHBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2I7IHBfY2NiOwotICAgICAgICAgICAgICAgcF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYikgewotICAgICAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfSU5GT19SU1AsICZjaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEwyQ0FQX0NNRF9DT05OX1JFUTogewotICAgICAgICB1aW50MTZfdCByY2lkOwotICAgICAgICBpZiAocCArIDQgPiBwX25leHRfY21kKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX0NPTk5fUkVRIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY29uX2luZm8ucHNtLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyY2lkLCBwKTsKLSAgICAgICAgdEwyQ19SQ0IqIHBfcmNiID0gbDJjdV9maW5kX3JjYl9ieV9wc20oY29uX2luZm8ucHNtKTsKLSAgICAgICAgaWYgKCFwX3JjYikgewotICAgICAgICAgIExPR19XQVJOKCJSY3ZkIGNvbm4gcmVxIGZvciB1bmtub3duIFBTTTogJWQiLCBjb25faW5mby5wc20pOwotICAgICAgICAgIGwyY3VfcmVqZWN0X2Nvbm5lY3Rpb24ocF9sY2IsIHJjaWQsIGlkLCBMMkNBUF9DT05OX05PX1BTTSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKCFwX3JjYi0+YXBpLnBMMkNBX0Nvbm5lY3RJbmRfQ2IpIHsKLSAgICAgICAgICAgIExPR19XQVJOKCJSY3ZkIGNvbm4gcmVxIGZvciBvdXRnb2luZy1vbmx5IGNvbm5lY3Rpb24gUFNNOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjb25faW5mby5wc20pOwotICAgICAgICAgICAgbDJjdV9yZWplY3RfY29ubmVjdGlvbihwX2xjYiwgcmNpZCwgaWQsIEwyQ0FQX0NPTk5fTk9fUFNNKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0TDJDX0NDQiogcF9jY2IgPSBsMmN1X2FsbG9jYXRlX2NjYihwX2xjYiwgMCk7Ci0gICAgICAgIGlmIChwX2NjYiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgQ0NCIik7Ci0gICAgICAgICAgbDJjdV9yZWplY3RfY29ubmVjdGlvbihwX2xjYiwgcmNpZCwgaWQsIEwyQ0FQX0NPTk5fTk9fUkVTT1VSQ0VTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwX2NjYi0+cmVtb3RlX2lkID0gaWQ7Ci0gICAgICAgIHBfY2NiLT5wX3JjYiA9IHBfcmNiOwotICAgICAgICBwX2NjYi0+cmVtb3RlX2NpZCA9IHJjaWQ7Ci0gICAgICAgIHBfY2NiLT5jb25uZWN0aW9uX2luaXRpYXRvciA9IEwyQ0FQX0lOSVRJQVRPUl9SRU1PVEU7Ci0KLSAgICAgICAgaWYgKHBfcmNiLT5wc20gPT0gQlRfUFNNX1JGQ09NTSkgewotICAgICAgICAgIGJ0c25vb3BfZ2V0X2ludGVyZmFjZSgpLT5hZGRfcmZjX2wyY19jaGFubmVsKAotICAgICAgICAgICAgICBwX2xjYi0+SGFuZGxlKCksIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgICAgICAgfSBlbHNlIGlmIChwX3JjYi0+bG9nX3BhY2tldHMpIHsKLSAgICAgICAgICBidHNub29wX2dldF9pbnRlcmZhY2UoKS0+YWxsb3dsaXN0X2wyY19jaGFubmVsKAotICAgICAgICAgICAgICBwX2xjYi0+SGFuZGxlKCksIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0NPTk5FQ1RfUkVRLCAmY29uX2luZm8pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMMkNBUF9DTURfQ09OTl9SU1A6IHsKLSAgICAgICAgdWludDE2X3QgbGNpZDsKLSAgICAgICAgaWYgKHAgKyA4ID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgIExPR19XQVJOKCJOb3QgZW5vdWdoIGRhdGEgZm9yIEwyQ0FQX0NNRF9DT05OX1JFUSIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNvbl9pbmZvLnJlbW90ZV9jaWQsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGxjaWQsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCwgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY29uX2luZm8ubDJjYXBfc3RhdHVzLCBwKTsKLQotICAgICAgICB0TDJDX0NDQiogcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChwX2xjYiwgbGNpZCk7Ci0gICAgICAgIGlmICghcF9jY2IpIHsKLSAgICAgICAgICBMT0dfV0FSTigibm8gQ0NCIGZvciBjb25uIHJzcCwgTENJRDogJWQgUkNJRDogJWQiLCBsY2lkLAotICAgICAgICAgICAgICAgICAgIGNvbl9pbmZvLnJlbW90ZV9jaWQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwX2NjYi0+bG9jYWxfaWQgIT0gaWQpIHsKLSAgICAgICAgICBMT0dfV0FSTigiY29uIHJzcCAtIGJhZCBJRC4gRXhwOiAlZCBHb3Q6ICVkIiwgcF9jY2ItPmxvY2FsX2lkLCBpZCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uX2luZm8ubDJjYXBfcmVzdWx0ID09IEwyQ0FQX0NPTk5fT0spCi0gICAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1AsICZjb25faW5mbyk7Ci0gICAgICAgIGVsc2UgaWYgKGNvbl9pbmZvLmwyY2FwX3Jlc3VsdCA9PSBMMkNBUF9DT05OX1BFTkRJTkcpCi0gICAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1BfUE5ELCAmY29uX2luZm8pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfQ09OTkVDVF9SU1BfTkVHLCAmY29uX2luZm8pOwotCi0gICAgICAgIHRMMkNfUkNCKiBwX3JjYiA9IHBfY2NiLT5wX3JjYjsKLSAgICAgICAgaWYgKHBfcmNiLT5wc20gPT0gQlRfUFNNX1JGQ09NTSkgewotICAgICAgICAgIGJ0c25vb3BfZ2V0X2ludGVyZmFjZSgpLT5hZGRfcmZjX2wyY19jaGFubmVsKAotICAgICAgICAgICAgICBwX2xjYi0+SGFuZGxlKCksIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgICAgICAgfSBlbHNlIGlmIChwX3JjYi0+bG9nX3BhY2tldHMpIHsKLSAgICAgICAgICBidHNub29wX2dldF9pbnRlcmZhY2UoKS0+YWxsb3dsaXN0X2wyY19jaGFubmVsKAotICAgICAgICAgICAgICBwX2xjYi0+SGFuZGxlKCksIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEwyQ0FQX0NNRF9DT05GSUdfUkVROiB7Ci0gICAgICAgIHVpbnQ4X3QqIHBfY2ZnX2VuZCA9IHAgKyBjbWRfbGVuOwotICAgICAgICBib29sIGNmZ19yZWogPSBmYWxzZTsKLSAgICAgICAgdWludDE2X3QgY2ZnX3Jlal9sZW4gPSAwOwotCi0gICAgICAgIHVpbnQxNl90IGxjaWQ7Ci0gICAgICAgIGlmIChwICsgNCA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DTURfQ09ORklHX1JFUSIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGxjaWQsIHApOwotICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNmZ19pbmZvLmZsYWdzLCBwKTsKLQotICAgICAgICB1aW50OF90KiBwX2NmZ19zdGFydCA9IHA7Ci0KLSAgICAgICAgY2ZnX2luZm8uZmx1c2hfdG9fcHJlc2VudCA9IGNmZ19pbmZvLm10dV9wcmVzZW50ID0KLSAgICAgICAgICAgIGNmZ19pbmZvLnFvc19wcmVzZW50ID0gY2ZnX2luZm8uZmNyX3ByZXNlbnQgPSBjZmdfaW5mby5mY3NfcHJlc2VudCA9Ci0gICAgICAgICAgICAgICAgZmFsc2U7Ci0KLSAgICAgICAgd2hpbGUgKHAgPCBwX2NmZ19lbmQpIHsKLSAgICAgICAgICB1aW50OF90IGNmZ19jb2RlLCBjZmdfbGVuOwotICAgICAgICAgIGlmIChwICsgMiA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgIExPR19XQVJOKCJOb3QgZW5vdWdoIGRhdGEgZm9yIEwyQ0FQX0NNRF9DT05GSUdfUkVRIHN1Yl9ldmVudCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2NvZGUsIHApOwotICAgICAgICAgIFNUUkVBTV9UT19VSU5UOChjZmdfbGVuLCBwKTsKLQotICAgICAgICAgIHN3aXRjaCAoY2ZnX2NvZGUgJiAweDdGKSB7Ci0gICAgICAgICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX01UVToKLSAgICAgICAgICAgICAgY2ZnX2luZm8ubXR1X3ByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoY2ZnX2xlbiAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTk4NzA0NTEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHAgKyBjZmdfbGVuID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzQyMDIwNDEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5tdHUsIHApOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9GTFVTSF9UT1VUOgotICAgICAgICAgICAgICBjZmdfaW5mby5mbHVzaF90b19wcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGNmZ19sZW4gIT0gMikgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE5ODcwNDUxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChwICsgY2ZnX2xlbiA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc0MjAyMDQxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY2ZnX2luZm8uZmx1c2hfdG8sIHApOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9RT1M6Ci0gICAgICAgICAgICAgIGNmZ19pbmZvLnFvc19wcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGNmZ19sZW4gIT0gMiArIDUgKiA0KSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTk4NzA0NTEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHAgKyBjZmdfbGVuID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzQyMDIwNDEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19pbmZvLnFvcy5xb3NfZmxhZ3MsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8ucW9zLnNlcnZpY2VfdHlwZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8ucW9zLnRva2VuX3JhdGUsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKGNmZ19pbmZvLnFvcy50b2tlbl9idWNrZXRfc2l6ZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8ucW9zLnBlYWtfYmFuZHdpZHRoLCBwKTsKLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQzMihjZmdfaW5mby5xb3MubGF0ZW5jeSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8ucW9zLmRlbGF5X3ZhcmlhdGlvbiwgcCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX0ZDUjoKLSAgICAgICAgICAgICAgY2ZnX2luZm8uZmNyX3ByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoY2ZnX2xlbiAhPSAzICsgMyAqIDIpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExOTg3MDQ1MSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAocCArIGNmZ19sZW4gPiBwX25leHRfY21kKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NDIwMjA0MSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8uZmNyLm1vZGUsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8uZmNyLnR4X3dpbl9zeiwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UOChjZmdfaW5mby5mY3IubWF4X3RyYW5zbWl0LCBwKTsKLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5mY3IucnRyYW5zX3RvdXQsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNmZ19pbmZvLmZjci5tb25fdG91dCwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY2ZnX2luZm8uZmNyLm1wcywgcCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX0ZDUzoKLSAgICAgICAgICAgICAgY2ZnX2luZm8uZmNzX3ByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoY2ZnX2xlbiAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTk4NzA0NTEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHAgKyBjZmdfbGVuID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzQyMDIwNDEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19pbmZvLmZjcywgcCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX0VYVF9GTE9XOgotICAgICAgICAgICAgICBjZmdfaW5mby5leHRfZmxvd19zcGVjX3ByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoY2ZnX2xlbiAhPSAyICsgMiArIDMgKiA0KSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTk4NzA0NTEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHAgKyBjZmdfbGVuID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzQyMDIwNDEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19pbmZvLmV4dF9mbG93X3NwZWMuaWQsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8uZXh0X2Zsb3dfc3BlYy5zdHlwZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY2ZnX2luZm8uZXh0X2Zsb3dfc3BlYy5tYXhfc2R1X3NpemUsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKGNmZ19pbmZvLmV4dF9mbG93X3NwZWMuc2R1X2ludGVyX3RpbWUsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKGNmZ19pbmZvLmV4dF9mbG93X3NwZWMuYWNjZXNzX2xhdGVuY3ksIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKGNmZ19pbmZvLmV4dF9mbG93X3NwZWMuZmx1c2hfdGltZW91dCwgcCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgb3B0aW9uIGxlbmd0aCAqLwotICAgICAgICAgICAgICBpZiAoKGNmZ19sZW4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEKSA8PSBjbWRfbGVuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHAgKyBjZmdfbGVuID4gcF9uZXh0X2NtZCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIHAgKz0gY2ZnX2xlbjsKLSAgICAgICAgICAgICAgICBpZiAoKGNmZ19jb2RlICYgMHg4MCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgY2ZnX3Jlal9sZW4gKz0gY2ZnX2xlbiArIEwyQ0FQX0NGR19PUFRJT05fT1ZFUkhFQUQ7Ci0gICAgICAgICAgICAgICAgICBjZmdfcmVqID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLyogYmFkIGxlbmd0aDsgZm9yY2UgbG9vcCBleGl0ICovCi0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHAgPSBwX2NmZ19lbmQ7Ci0gICAgICAgICAgICAgICAgY2ZnX3JlaiA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdEwyQ19DQ0IqIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQocF9sY2IsIGxjaWQpOwotICAgICAgICBpZiAocF9jY2IpIHsKLSAgICAgICAgICBwX2NjYi0+cmVtb3RlX2lkID0gaWQ7Ci0gICAgICAgICAgaWYgKGNmZ19yZWopIHsKLSAgICAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2NvbmZpZ19yZWooCi0gICAgICAgICAgICAgICAgcF9jY2IsIHBfY2ZnX3N0YXJ0LCAodWludDE2X3QpKGNtZF9sZW4gLSBMMkNBUF9DT05GSUdfUkVRX0xFTiksCi0gICAgICAgICAgICAgICAgY2ZnX3Jlal9sZW4pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9DT05GSUdfUkVRLCAmY2ZnX2luZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvKiB1cGRhdGVkIHNwZWMgc2F5cyBzZW5kIGNvbW1hbmQgcmVqZWN0IG9uIGludmFsaWQgY2lkICovCi0gICAgICAgICAgbDJjdV9zZW5kX3BlZXJfY21kX3JlamVjdChwX2xjYiwgTDJDQVBfQ01EX1JFSl9JTlZBTElEX0NJRCwgaWQsIDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEwyQ0FQX0NNRF9DT05GSUdfUlNQOiB7Ci0gICAgICAgIHVpbnQ4X3QqIHBfY2ZnX2VuZCA9IHAgKyBjbWRfbGVuOwotICAgICAgICB1aW50MTZfdCBsY2lkOwotICAgICAgICBpZiAocCArIDYgPiBwX25leHRfY21kKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX0NPTkZJR19SU1AiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihsY2lkLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5mbGFncywgcCk7Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY2ZnX2luZm8ucmVzdWx0LCBwKTsKLQotICAgICAgICBjZmdfaW5mby5mbHVzaF90b19wcmVzZW50ID0gY2ZnX2luZm8ubXR1X3ByZXNlbnQgPQotICAgICAgICAgICAgY2ZnX2luZm8ucW9zX3ByZXNlbnQgPSBjZmdfaW5mby5mY3JfcHJlc2VudCA9IGNmZ19pbmZvLmZjc19wcmVzZW50ID0KLSAgICAgICAgICAgICAgICBmYWxzZTsKLQotICAgICAgICB3aGlsZSAocCA8IHBfY2ZnX2VuZCkgewotICAgICAgICAgIHVpbnQ4X3QgY2ZnX2NvZGUsIGNmZ19sZW47Ci0gICAgICAgICAgaWYgKHAgKyAyID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX0NPTkZJR19SU1Agc3ViX2V2ZW50Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIFNUUkVBTV9UT19VSU5UOChjZmdfY29kZSwgcCk7Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19sZW4sIHApOwotCi0gICAgICAgICAgc3dpdGNoIChjZmdfY29kZSAmIDB4N0YpIHsKLSAgICAgICAgICAgIGNhc2UgTDJDQVBfQ0ZHX1RZUEVfTVRVOgotICAgICAgICAgICAgICBjZmdfaW5mby5tdHVfcHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmIChwICsgMiA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DRkdfVFlQRV9NVFUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5tdHUsIHApOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9GTFVTSF9UT1VUOgotICAgICAgICAgICAgICBjZmdfaW5mby5mbHVzaF90b19wcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKHAgKyAyID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgICAgIExPR19XQVJOKCJOb3QgZW5vdWdoIGRhdGEgZm9yIEwyQ0FQX0NGR19UWVBFX0ZMVVNIX1RPVVQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5mbHVzaF90bywgcCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX1FPUzoKLSAgICAgICAgICAgICAgY2ZnX2luZm8ucW9zX3ByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAocCArIDIgKyA1ICogNCA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DRkdfVFlQRV9RT1MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19pbmZvLnFvcy5xb3NfZmxhZ3MsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8ucW9zLnNlcnZpY2VfdHlwZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8ucW9zLnRva2VuX3JhdGUsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDMyKGNmZ19pbmZvLnFvcy50b2tlbl9idWNrZXRfc2l6ZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8ucW9zLnBlYWtfYmFuZHdpZHRoLCBwKTsKLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQzMihjZmdfaW5mby5xb3MubGF0ZW5jeSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8ucW9zLmRlbGF5X3ZhcmlhdGlvbiwgcCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX0ZDUjoKLSAgICAgICAgICAgICAgY2ZnX2luZm8uZmNyX3ByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAocCArIDMgKyAzICogMiA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DRkdfVFlQRV9GQ1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19pbmZvLmZjci5tb2RlLCBwKTsKLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQ4KGNmZ19pbmZvLmZjci50eF93aW5fc3osIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8uZmNyLm1heF90cmFuc21pdCwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYoY2ZnX2luZm8uZmNyLnJ0cmFuc190b3V0LCBwKTsKLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5mY3IubW9uX3RvdXQsIHApOwotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGNmZ19pbmZvLmZjci5tcHMsIHApOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9GQ1M6Ci0gICAgICAgICAgICAgIGNmZ19pbmZvLmZjc19wcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKHAgKyAxID4gcF9uZXh0X2NtZCkgewotICAgICAgICAgICAgICAgIExPR19XQVJOKCJOb3QgZW5vdWdoIGRhdGEgZm9yIEwyQ0FQX0NGR19UWVBFX0ZDUyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8uZmNzLCBwKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTDJDQVBfQ0ZHX1RZUEVfRVhUX0ZMT1c6Ci0gICAgICAgICAgICAgIGNmZ19pbmZvLmV4dF9mbG93X3NwZWNfcHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmIChwICsgMiArIDIgKyAzICogNCA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DRkdfVFlQRV9FWFRfRkxPVyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgoY2ZnX2luZm8uZXh0X2Zsb3dfc3BlYy5pZCwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UOChjZmdfaW5mby5leHRfZmxvd19zcGVjLnN0eXBlLCBwKTsKLSAgICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihjZmdfaW5mby5leHRfZmxvd19zcGVjLm1heF9zZHVfc2l6ZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8uZXh0X2Zsb3dfc3BlYy5zZHVfaW50ZXJfdGltZSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8uZXh0X2Zsb3dfc3BlYy5hY2Nlc3NfbGF0ZW5jeSwgcCk7Ci0gICAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMzIoY2ZnX2luZm8uZXh0X2Zsb3dfc3BlYy5mbHVzaF90aW1lb3V0LCBwKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdEwyQ19DQ0IqIHBfY2NiID0gbDJjdV9maW5kX2NjYl9ieV9jaWQocF9sY2IsIGxjaWQpOwotICAgICAgICBpZiAocF9jY2IpIHsKLSAgICAgICAgICBpZiAocF9jY2ItPmxvY2FsX2lkICE9IGlkKSB7Ci0gICAgICAgICAgICBMT0dfV0FSTigiY2ZnIHJzcCAtIGJhZCBJRC4gRXhwOiAlZCBHb3Q6ICVkIiwgcF9jY2ItPmxvY2FsX2lkLCBpZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNmZ19pbmZvLnJlc3VsdCA9PSBMMkNBUF9DRkdfT0spIHsKLSAgICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0NPTkZJR19SU1AsICZjZmdfaW5mbyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0NPTkZJR19SU1BfTkVHLCAmY2ZnX2luZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBMT0dfV0FSTigiUmN2ZCBjZmcgcnNwIGZvciB1bmtub3duIENJRDogMHglMDR4IiwgbGNpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTDJDQVBfQ01EX0RJU0NfUkVROiB7Ci0gICAgICAgIHVpbnQxNl90IGxjaWQsIHJjaWQ7Ci0gICAgICAgIGlmIChwICsgNCA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DTURfRElTQ19SRVEiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihsY2lkLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyY2lkLCBwKTsKLQotICAgICAgICB0TDJDX0NDQiogcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChwX2xjYiwgbGNpZCk7Ci0gICAgICAgIGlmIChwX2NjYikgewotICAgICAgICAgIGlmIChwX2NjYi0+cmVtb3RlX2NpZCA9PSByY2lkKSB7Ci0gICAgICAgICAgICBwX2NjYi0+cmVtb3RlX2lkID0gaWQ7Ci0gICAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9MMkNBUF9ESVNDT05ORUNUX1JFUSwgJmNvbl9pbmZvKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Rpc2NfcnNwKHBfbGNiLCBpZCwgbGNpZCwgcmNpZCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTDJDQVBfQ01EX0RJU0NfUlNQOiB7Ci0gICAgICAgIHVpbnQxNl90IGxjaWQsIHJjaWQ7Ci0gICAgICAgIGlmIChwICsgNCA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DTURfRElTQ19SU1AiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyY2lkLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihsY2lkLCBwKTsKLQotICAgICAgICB0TDJDX0NDQiogcF9jY2IgPSBsMmN1X2ZpbmRfY2NiX2J5X2NpZChwX2xjYiwgbGNpZCk7Ci0gICAgICAgIGlmIChwX2NjYikgewotICAgICAgICAgIGlmICgocF9jY2ItPnJlbW90ZV9jaWQgPT0gcmNpZCkgJiYgKHBfY2NiLT5sb2NhbF9pZCA9PSBpZCkpIHsKLSAgICAgICAgICAgIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FQX0RJU0NPTk5FQ1RfUlNQLCAmY29uX2luZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMMkNBUF9DTURfRUNIT19SRVE6Ci0gICAgICAgIGwyY3Vfc2VuZF9wZWVyX2VjaG9fcnNwKHBfbGNiLCBpZCwgcCwgY21kX2xlbik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEwyQ0FQX0NNRF9JTkZPX1JFUTogewotICAgICAgICB1aW50MTZfdCBpbmZvX3R5cGU7Ci0gICAgICAgIGlmIChwICsgMiA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICBMT0dfV0FSTigiTm90IGVub3VnaCBkYXRhIGZvciBMMkNBUF9DTURfSU5GT19SRVEiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihpbmZvX3R5cGUsIHApOwotICAgICAgICBsMmN1X3NlbmRfcGVlcl9pbmZvX3JzcChwX2xjYiwgaWQsIGluZm9fdHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEwyQ0FQX0NNRF9JTkZPX1JTUDoKLSAgICAgICAgLyogU3RvcCB0aGUgbGluayBjb25uZWN0IHRpbWVyIGlmIHNlbnQgYmVmb3JlIEwyQ0FQIGNvbm5lY3Rpb24gaXMgdXAgKi8KLSAgICAgICAgaWYgKHBfbGNiLT53NF9pbmZvX3JzcCkgewotICAgICAgICAgIGFsYXJtX2NhbmNlbChwX2xjYi0+aW5mb19yZXNwX3RpbWVyKTsKLSAgICAgICAgICBwX2xjYi0+dzRfaW5mb19yc3AgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQxNl90IGluZm9fdHlwZSwgcmVzdWx0OwotICAgICAgICBpZiAocCArIDQgPiBwX25leHRfY21kKSB7Ci0gICAgICAgICAgTE9HX1dBUk4oIk5vdCBlbm91Z2ggZGF0YSBmb3IgTDJDQVBfQ01EX0lORk9fUlNQIik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNUUkVBTV9UT19VSU5UMTYoaW5mb190eXBlLCBwKTsKLSAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihyZXN1bHQsIHApOwotCi0gICAgICAgIGlmICgoaW5mb190eXBlID09IEwyQ0FQX0VYVEVOREVEX0ZFQVRVUkVTX0lORk9fVFlQRSkgJiYKLSAgICAgICAgICAgIChyZXN1bHQgPT0gTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9TVUNDRVNTKSkgewotICAgICAgICAgIGlmIChwICsgNCA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgIExPR19XQVJOKCJOb3QgZW5vdWdoIGRhdGEgZm9yIEwyQ0FQX0NNRF9JTkZPX1JTUCBzdWJfZXZlbnQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQzMihwX2xjYi0+cGVlcl9leHRfZmVhLCBwKTsKLQotICAgICAgICAgIGlmIChwX2xjYi0+cGVlcl9leHRfZmVhICYgTDJDQVBfRVhURkVBX0ZJWEVEX0NITkxTKSB7Ci0gICAgICAgICAgICBsMmN1X3NlbmRfcGVlcl9pbmZvX3JlcShwX2xjYiwgTDJDQVBfRklYRURfQ0hBTk5FTFNfSU5GT19UWVBFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsMmN1X3Byb2Nlc3NfZml4ZWRfY2hubF9yZXNwKHBfbGNiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5mb190eXBlID09IEwyQ0FQX0ZJWEVEX0NIQU5ORUxTX0lORk9fVFlQRSkgewotICAgICAgICAgIGlmIChyZXN1bHQgPT0gTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBpZiAocCArIEwyQ0FQX0ZJWEVEX0NITkxfQVJSQVlfU0laRSA+IHBfbmV4dF9jbWQpIHsKLSAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTEyMTUxNzMiKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHBfbGNiLT5wZWVyX2NobmxfbWFzaywgcCwgTDJDQVBfRklYRURfQ0hOTF9BUlJBWV9TSVpFKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBsMmN1X3Byb2Nlc3NfZml4ZWRfY2hubF9yZXNwKHBfbGNiKTsKLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgdEwyQ19DT05OX0lORk8gY2k7Ci0gICAgICAgICAgY2kuc3RhdHVzID0gSENJX1NVQ0NFU1M7Ci0gICAgICAgICAgY2kuYmRfYWRkciA9IHBfbGNiLT5yZW1vdGVfYmRfYWRkcjsKLSAgICAgICAgICBmb3IgKHRMMkNfQ0NCKiBwX2NjYiA9IHBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2I7IHBfY2NiOwotICAgICAgICAgICAgICAgcF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYikgewotICAgICAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfTDJDQVBfSU5GT19SU1AsICZjaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfV0FSTigiQmFkIGNtZCBjb2RlOiAlZCIsIGNtZF9jb2RlKTsKLSAgICAgICAgbDJjdV9zZW5kX3BlZXJfY21kX3JlamVjdChwX2xjYiwgTDJDQVBfQ01EX1JFSl9OT1RfVU5ERVJTVE9PRCwgaWQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19wcm9jZXNzX2hlbGRfcGFja2V0cwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYW55IEwyQ0FQIHBhY2tldHMgdGhhdCBhcnJpdmVkCi0gKiAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgSENJIGNvbm5lY3Rpb24gY29tcGxldGUgYXJyaXZlZC4gSXQgaXMgYSB3b3JrCi0gKiAgICAgICAgICAgICAgICAgIGFyb3VuZCBmb3IgYmFkbHkgYmVoYXZlZCBjb250cm9sbGVycy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmNfcHJvY2Vzc19oZWxkX3BhY2tldHMoYm9vbCB0aW1lZF9vdXQpIHsKLSAgaWYgKGxpc3RfaXNfZW1wdHkobDJjYi5yY3ZfcGVuZGluZ19xKSkgcmV0dXJuOwotCi0gIGlmICghdGltZWRfb3V0KSB7Ci0gICAgYWxhcm1fY2FuY2VsKGwyY2IucmVjZWl2ZV9ob2xkX3RpbWVyKTsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCBIT0xEIENPTlRJTlVFIik7Ci0gIH0gZWxzZSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgSE9MRCBUSU1FT1VUIik7Ci0gIH0KLQotICBmb3IgKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlID0gbGlzdF9iZWdpbihsMmNiLnJjdl9wZW5kaW5nX3EpOwotICAgICAgIG5vZGUgIT0gbGlzdF9lbmQobDJjYi5yY3ZfcGVuZGluZ19xKTspIHsKLSAgICBCVF9IRFIqIHBfYnVmID0gc3RhdGljX2Nhc3Q8QlRfSERSKj4obGlzdF9ub2RlKG5vZGUpKTsKLSAgICBub2RlID0gbGlzdF9uZXh0KG5vZGUpOwotICAgIGlmICghdGltZWRfb3V0IHx8ICghcF9idWYtPmxheWVyX3NwZWNpZmljKSB8fAotICAgICAgICAoLS1wX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPT0gMCkpIHsKLSAgICAgIGxpc3RfcmVtb3ZlKGwyY2IucmN2X3BlbmRpbmdfcSwgcF9idWYpOwotICAgICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gMHhGRkZGOwotICAgICAgbDJjX3Jjdl9hY2xfZGF0YShwX2J1Zik7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgYW55b25lIHN0aWxsIGluIHRoZSBxdWV1ZSwgcmVzdGFydCB0aGUgdGltZW91dCAqLwotICBpZiAoIWxpc3RfaXNfZW1wdHkobDJjYi5yY3ZfcGVuZGluZ19xKSkgewotICAgIGFsYXJtX3NldF9vbl9tbG9vcChsMmNiLnJlY2VpdmVfaG9sZF90aW1lciwgQlRfMVNFQ19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBsMmNfcmVjZWl2ZV9ob2xkX3RpbWVyX3RpbWVvdXQsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmNfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhdCBzdGFydHVwIHRvIGluaXRpYWxpemUKLSAqICAgICAgICAgICAgICAgICAgYWxsIHRoZSBMMkNBUCBzdHJ1Y3R1cmVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjX2luaXQodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICAvLyBMMkNBUCBpbml0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IEdEIHN0YWNrIG1hbmFnZXIKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQxNl90IHh4OwotCi0gIG1lbXNldCgmbDJjYiwgMCwgc2l6ZW9mKHRMMkNfQ0IpKTsKLQotICAvKiB0aGUgTEUgUFNNIGlzIGluY3JlYXNlZCBieSAxIGJlZm9yZSBiZWluZyB1c2VkICovCi0gIGwyY2IubGVfZHluX3BzbSA9IExFX0RZTkFNSUNfUFNNX1NUQVJUIC0gMTsKLQotICAvKiBQdXQgYWxsIHRoZSBjaGFubmVsIGNvbnRyb2wgYmxvY2tzIG9uIHRoZSBmcmVlIHF1ZXVlICovCi0gIGZvciAoeHggPSAwOyB4eCA8IE1BWF9MMkNBUF9DSEFOTkVMUyAtIDE7IHh4KyspIHsKLSAgICBsMmNiLmNjYl9wb29sW3h4XS5wX25leHRfY2NiID0gJmwyY2IuY2NiX3Bvb2xbeHggKyAxXTsKLSAgfQotCi0gIC8qIGl0IHdpbGwgYmUgc2V0IHRvIEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFIGlmIGNvbnRyb2xsZXIgc3VwcG9ydHMgKi8KLSAgbDJjYi5ub25fZmx1c2hhYmxlX3BiZiA9IEwyQ0FQX1BLVF9TVEFSVCA8PCBMMkNBUF9QS1RfVFlQRV9TSElGVDsKLQotICBsMmNiLnBfZnJlZV9jY2JfZmlyc3QgPSAmbDJjYi5jY2JfcG9vbFswXTsKLSAgbDJjYi5wX2ZyZWVfY2NiX2xhc3QgPSAmbDJjYi5jY2JfcG9vbFtNQVhfTDJDQVBfQ0hBTk5FTFMgLSAxXTsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgaWRsZSB0aW1lb3V0ICovCi0gIGwyY2IuaWRsZV90aW1lb3V0ID0gTDJDQVBfTElOS19JTkFDVElWSVRZX1RPVVQ7Ci0KLSNpZiBkZWZpbmVkKEwyQ0FQX0lOSVRJQUxfVFJBQ0VfTEVWRUwpCi0gIGwyY2IubDJjYXBfdHJhY2VfbGV2ZWwgPSBMMkNBUF9JTklUSUFMX1RSQUNFX0xFVkVMOwotI2Vsc2UKLSAgbDJjYi5sMmNhcF90cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX05PTkU7IC8qIE5vIHRyYWNlcyAqLwotI2VuZGlmCi0KLSNpZiAoTDJDQVBfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotICAvKiBDb25mb3JtYW5jZSB0ZXN0aW5nIG5lZWRzIGEgZHluYW1pYyByZXNwb25zZSAqLwotICBsMmNiLnRlc3RfaW5mb19yZXNwID0gTDJDQVBfRVhURkVBX1NVUFBPUlRFRF9NQVNLOwotI2VuZGlmCi0KLSAgLyogTnVtYmVyIG9mIEFDTCBidWZmZXJzIHRvIHVzZSBmb3IgaGlnaCBwcmlvcml0eSBjaGFubmVsICovCi0KLSAgbDJjYi5sMmNfYmxlX2ZpeGVkX2NobmxzX21hc2sgPSBMMkNBUF9GSVhFRF9DSE5MX0FUVF9CSVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0ZJWEVEX0NITkxfQkxFX1NJR19CSVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0ZJWEVEX0NITkxfU01QX0JJVDsKLQotICBsMmNiLnJjdl9wZW5kaW5nX3EgPSBsaXN0X25ldyhOVUxMKTsKLSAgQ0hFQ0sobDJjYi5yY3ZfcGVuZGluZ19xICE9IE5VTEwpOwotCi0gIGwyY2IucmVjZWl2ZV9ob2xkX3RpbWVyID0gYWxhcm1fbmV3KCJsMmMucmVjZWl2ZV9ob2xkX3RpbWVyIik7Ci19Ci0KLXZvaWQgbDJjX2ZyZWUodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICAvLyBMMkNBUCBjbGVhbnVwIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEdEIHN0YWNrIG1hbmFnZXIKLSAgICByZXR1cm47Ci0gIH0KLQotICBsaXN0X2ZyZWUobDJjYi5yY3ZfcGVuZGluZ19xKTsKLSAgbDJjYi5yY3ZfcGVuZGluZ19xID0gTlVMTDsKLX0KLQotdm9pZCBsMmNfcmVjZWl2ZV9ob2xkX3RpbWVyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICAvKiBVcGRhdGUgdGhlIHRpbWVvdXRzIGluIHRoZSBob2xkIHF1ZXVlICovCi0gIGwyY19wcm9jZXNzX2hlbGRfcGFja2V0cyh0cnVlKTsKLX0KLQotdm9pZCBsMmNfY2NiX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgewotICB0TDJDX0NDQiogcF9jY2IgPSAodEwyQ19DQ0IqKWRhdGE7Ci0KLSAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfVElNRU9VVCwgTlVMTCk7Ci19Ci0KLXZvaWQgbDJjX2ZjcmJfYWNrX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgewotICB0TDJDX0NDQiogcF9jY2IgPSAodEwyQ19DQ0IqKWRhdGE7Ci0KLSAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfQUNLX1RJTUVPVVQsIE5VTEwpOwotfQotCi12b2lkIGwyY19sY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIHRMMkNfTENCKiBwX2xjYiA9ICh0TDJDX0xDQiopZGF0YTsKLQotICBsMmNfbGlua190aW1lb3V0KHBfbGNiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY19kYXRhX3dyaXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBUEkgZnVuY3Rpb25zIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB3cml0ZSBkYXRhLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTDJDQVBfRFdfU1VDQ0VTUywgaWYgZGF0YSBhY2NlcHRlZCwgZWxzZSBmYWxzZQotICogICAgICAgICAgICAgICAgICBMMkNBUF9EV19DT05HRVNURUQsIGlmIGRhdGEgYWNjZXB0ZWQgYW5kIHRoZSBjaGFubmVsIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZ2VzdGVkCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FQX0RXX0ZBSUxFRCwgaWYgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBsMmNfZGF0YV93cml0ZSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhLCB1aW50MTZfdCBmbGFncykgewotICAvKiBGaW5kIHRoZSBjaGFubmVsIGNvbnRyb2wgYmxvY2suIFdlIGRvbid0IGtub3cgdGhlIGxpbmsgaXQgaXMgb24uICovCi0gIHRMMkNfQ0NCKiBwX2NjYiA9IGwyY3VfZmluZF9jY2JfYnlfY2lkKE5VTEwsIGNpZCk7Ci0gIGlmICghcF9jY2IpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIENDQiBmb3IgTDJDQV9EYXRhV3JpdGUsIENJRDogJWQiLCBjaWQpOwotICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgcmV0dXJuIChMMkNBUF9EV19GQUlMRUQpOwotICB9Ci0KLSAgLyogU2VuZGluZyBtZXNzYWdlIGJpZ2dlciB0aGFuIG10dSBzaXplIG9mIHBlZXIgaXMgYSB2aW9sYXRpb24gb2YgcHJvdG9jb2wgKi8KLSAgdWludDE2X3QgbXR1OwotCi0gIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpCi0gICAgbXR1ID0gcF9jY2ItPnBlZXJfY29ubl9jZmcubXR1OwotICBlbHNlCi0gICAgbXR1ID0gcF9jY2ItPnBlZXJfY2ZnLm10dTsKLQotICBpZiAocF9kYXRhLT5sZW4gPiBtdHUpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiTDJDQVAgLSBDSUQ6IDB4JTA0eCAgY2Fubm90IHNlbmQgbWVzc2FnZSBiaWdnZXIgdGhhbiBwZWVyJ3MgbXR1IHNpemU6ICIKLSAgICAgICAgImxlbj0ldSBtdHU9JXUiLAotICAgICAgICBjaWQsIHBfZGF0YS0+bGVuLCBtdHUpOwotICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgcmV0dXJuIChMMkNBUF9EV19GQUlMRUQpOwotICB9Ci0KLSAgLyogY2hhbm5lbCBiYXNlZCwgcGFja2V0IGJhc2VkIGZsdXNoYWJsZSBvciBub24tZmx1c2hhYmxlICovCi0gIHBfZGF0YS0+bGF5ZXJfc3BlY2lmaWMgPSBmbGFnczsKLQotICAvKiBJZiBhbHJlYWR5IGNvbmdlc3RlZCwgZG8gbm90IGFjY2VwdCBhbnkgbW9yZSBwYWNrZXRzICovCi0gIGlmIChwX2NjYi0+Y29uZ19zZW50KSB7Ci0gICAgTDJDQVBfVFJBQ0VfRVJST1IoCi0gICAgICAgICJMMkNBUCAtIENJRDogMHglMDR4IGNhbm5vdCBzZW5kLCBhbHJlYWR5IGNvbmdlc3RlZCAgIgotICAgICAgICAieG1pdF9ob2xkX3EuY291bnQ6ICV1ICBidWZmX3F1b3RhOiAldSIsCi0gICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NjYi0+eG1pdF9ob2xkX3EpLAotICAgICAgICBwX2NjYi0+YnVmZl9xdW90YSk7Ci0KLSAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgIHJldHVybiAoTDJDQVBfRFdfRkFJTEVEKTsKLSAgfQotCi0gIGwyY19jc21fZXhlY3V0ZShwX2NjYiwgTDJDRVZUX0wyQ0FfREFUQV9XUklURSwgcF9kYXRhKTsKLQotICBpZiAocF9jY2ItPmNvbmdfc2VudCkgcmV0dXJuIChMMkNBUF9EV19DT05HRVNURUQpOwotCi0gIHJldHVybiAoTDJDQVBfRFdfU1VDQ0VTUyk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9sMmNhcC9sMmNfdXRpbHMuY2MgYi9zdGFjay9sMmNhcC9sMmNfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2NiZGIuLjAwMDAwMDAKLS0tIGEvc3RhY2svbDJjYXAvbDJjX3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBMMkNBUCB1dGlsaXR5IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExPR19UQUcgImwyY191dGlscyIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImhjaS9pbmNsdWRlL2J0c25vb3AuaCIKLSNpbmNsdWRlICJsMmNfaW50LmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdEwyQ19DQ0IqIGwyY3VfZ2V0X25leHRfY2hhbm5lbF9pbl9ycih0TDJDX0xDQiogcF9sY2IpOyAvLyBUT0RPIE1vdmUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfYWxsb2NhdGVfbGNiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIGZvciBhbiB1bnVzZWQgTENCCi0gKgotICogUmV0dXJucyAgICAgICAgICBMQ0IgYWRkcmVzcyBvciBOVUxMIGlmIG5vbmUgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdEwyQ19MQ0IqIGwyY3VfYWxsb2NhdGVfbGNiKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgYm9vbCBpc19ib25kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIGludCB4eDsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwX2xjYisrKSB7Ci0gICAgaWYgKCFwX2xjYi0+aW5fdXNlKSB7Ci0gICAgICBhbGFybV9mcmVlKHBfbGNiLT5sMmNfbGNiX3RpbWVyKTsKLSAgICAgIGFsYXJtX2ZyZWUocF9sY2ItPmluZm9fcmVzcF90aW1lcik7Ci0gICAgICBtZW1zZXQocF9sY2IsIDAsIHNpemVvZih0TDJDX0xDQikpOwotCi0gICAgICBwX2xjYi0+cmVtb3RlX2JkX2FkZHIgPSBwX2JkX2FkZHI7Ci0KLSAgICAgIHBfbGNiLT5pbl91c2UgPSB0cnVlOwotICAgICAgcF9sY2ItPmxpbmtfc3RhdGUgPSBMU1RfRElTQ09OTkVDVEVEOwotICAgICAgcF9sY2ItPkludmFsaWRhdGVIYW5kbGUoKTsKLSAgICAgIHBfbGNiLT5sMmNfbGNiX3RpbWVyID0gYWxhcm1fbmV3KCJsMmNfbGNiLmwyY19sY2JfdGltZXIiKTsKLSAgICAgIHBfbGNiLT5pbmZvX3Jlc3BfdGltZXIgPSBhbGFybV9uZXcoImwyY19sY2IuaW5mb19yZXNwX3RpbWVyIik7Ci0gICAgICBwX2xjYi0+aWRsZV90aW1lb3V0ID0gbDJjYi5pZGxlX3RpbWVvdXQ7Ci0gICAgICBwX2xjYi0+c2lnbmFsX2lkID0gMTsgLyogc3BlYyBkb2VzIG5vdCBhbGxvdyAnMCcgKi8KLSAgICAgIGlmIChpc19ib25kaW5nKSB7Ci0gICAgICAgIHBfbGNiLT5TZXRCb25kaW5nKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwX2xjYi0+UmVzZXRCb25kaW5nKCk7Ci0gICAgICB9Ci0gICAgICBwX2xjYi0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgICAgcF9sY2ItPnR4X2RhdGFfbGVuID0KLSAgICAgICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2JsZV9kZWZhdWx0X2RhdGFfcGFja2V0X2xlbmd0aCgpOwotICAgICAgcF9sY2ItPmxlX3NlY19wZW5kaW5nX3EgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotCi0gICAgICBpZiAodHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSkgewotICAgICAgICBsMmNiLm51bV9ibGVfbGlua3NfYWN0aXZlKys7Ci0gICAgICAgIGwyY19ibGVfbGlua19hZGp1c3RfYWxsb2NhdGlvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbDJjYi5udW1fdXNlZF9sY2JzKys7Ci0gICAgICAgIGwyY19saW5rX2FkanVzdF9hbGxvY2F0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBwX2xjYi0+bGlua194bWl0X2RhdGFfcSA9IGxpc3RfbmV3KE5VTEwpOwotICAgICAgcmV0dXJuIChwX2xjYik7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm8gZnJlZSBMQ0IgZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotdm9pZCBsMmN1X3NldF9sY2JfaGFuZGxlKHN0cnVjdCB0X2wyY19saW5rY2ImIHBfbGNiLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgaWYgKHBfbGNiLkhhbmRsZSgpICE9IEhDSV9JTlZBTElEX0hBTkRMRSkgewotICAgIExPR19XQVJOKCJTaG91bGQgbm90IHJlcGxhY2UgYWN0aXZlIGhhbmRsZTolaHUgd2l0aCBuZXcgaGFuZGxlOiVodSIsCi0gICAgICAgICAgICAgcF9sY2IuSGFuZGxlKCksIGhhbmRsZSk7Ci0gIH0KLSAgcF9sY2IuU2V0SGFuZGxlKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3VwZGF0ZV9sY2JfNF9ib25kaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBNYXJrIHRoZSBsY2IgZm9yIGJvbmRpbmcuIFVzZWQgd2hlbiBib25kaW5nIHRha2VzIHBsYWNlIG9uCi0gKiAgICAgICAgICAgICAgICAgIGFuIGV4aXN0aW5nIEFDTCBjb25uZWN0aW9uLiAgKFByZS1MaXNib24gZGV2aWNlcykKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIE5vdGhpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3VwZGF0ZV9sY2JfNF9ib25kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgYm9vbCBpc19ib25kaW5nKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIGJsdWV0b290aDo6c2hpbTo6TDJDQV9TZXRCb25kaW5nU3RhdGUocF9iZF9hZGRyLCBpc19ib25kaW5nKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0TDJDX0xDQiogcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIocF9iZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICBpZiAocF9sY2IpIHsKLSAgICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHBfYmRfYWRkcgotICAgICAgICAgICAgPDwgIiBpc19ib25kaW5nOiAiIDw8IGlzX2JvbmRpbmc7Ci0gICAgaWYgKGlzX2JvbmRpbmcpIHsKLSAgICAgIHBfbGNiLT5TZXRCb25kaW5nKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfbGNiLT5SZXNldEJvbmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfcmVsZWFzZV9sY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbGVhc2UgYW4gTENCLiBBbGwgdGltZXJzIHdpbGwgYmUgc3RvcHBlZCBhbmQgZnJlZWQsCi0gKiAgICAgICAgICAgICAgICAgIGNoYW5uZWxzIGRyb3BwZWQsIGJ1ZmZlcnMgcmV0dXJuZWQgZXRjLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcmVsZWFzZV9sY2IodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIHRMMkNfQ0NCKiBwX2NjYjsKLQotICBwX2xjYi0+aW5fdXNlID0gZmFsc2U7Ci0gIHBfbGNiLT5SZXNldEJvbmRpbmcoKTsKLQotICAvKiBTdG9wIGFuZCBmcmVlIHRpbWVycyAqLwotICBhbGFybV9mcmVlKHBfbGNiLT5sMmNfbGNiX3RpbWVyKTsKLSAgcF9sY2ItPmwyY19sY2JfdGltZXIgPSBOVUxMOwotICBhbGFybV9mcmVlKHBfbGNiLT5pbmZvX3Jlc3BfdGltZXIpOwotICBwX2xjYi0+aW5mb19yZXNwX3RpbWVyID0gTlVMTDsKLQotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSAvKiBSZWxlYXNlIGFsbCBTQ08gbGlua3MgKi8KLSAgICBCVE1fUmVtb3ZlU2NvKHBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0KLSAgaWYgKHBfbGNiLT5zZW50X25vdF9hY2tlZCA+IDApIHsKLSAgICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIGwyY2IuY29udHJvbGxlcl9sZV94bWl0X3dpbmRvdyArPSBwX2xjYi0+c2VudF9ub3RfYWNrZWQ7Ci0gICAgICBpZiAobDJjYi5jb250cm9sbGVyX2xlX3htaXRfd2luZG93ID4gbDJjYi5udW1fbG1fYmxlX2J1ZnMpIHsKLSAgICAgICAgbDJjYi5jb250cm9sbGVyX2xlX3htaXRfd2luZG93ID0gbDJjYi5udW1fbG1fYmxlX2J1ZnM7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGwyY2IuY29udHJvbGxlcl94bWl0X3dpbmRvdyArPSBwX2xjYi0+c2VudF9ub3RfYWNrZWQ7Ci0gICAgICBpZiAobDJjYi5jb250cm9sbGVyX3htaXRfd2luZG93ID4gbDJjYi5udW1fbG1fYWNsX2J1ZnMpIHsKLSAgICAgICAgbDJjYi5jb250cm9sbGVyX3htaXRfd2luZG93ID0gbDJjYi5udW1fbG1fYWNsX2J1ZnM7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgbDJjdV9wcm9jZXNzX2ZpeGVkX2Rpc2NfY2JhY2socF9sY2IpOwotCi0gIC8qIEVuc3VyZSBubyBDQ0JzIGxlZnQgb24gdGhpcyBMQ0IgKi8KLSAgZm9yIChwX2NjYiA9IHBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2I7IHBfY2NiOwotICAgICAgIHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYikgewotICAgIGwyY3VfcmVsZWFzZV9jY2IocF9jY2IpOwotICB9Ci0KLSAgLyogVGVsbCBCVE0gQWNsIG1hbmFnZW1lbnQgdGhlIGxpbmsgd2FzIHJlbW92ZWQgKi8KLSAgaWYgKChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfQ09OTkVDVEVEKSB8fAotICAgICAgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9ESVNDT05ORUNUSU5HKSkKLSAgICBidG1fYWNsX3JlbW92ZWQocF9sY2ItPkhhbmRsZSgpKTsKLQotICAvKiBSZWxlYXNlIGFueSBoZWxkIGJ1ZmZlcnMgKi8KLSAgaWYgKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xKSB7Ci0gICAgd2hpbGUgKCFsaXN0X2lzX2VtcHR5KHBfbGNiLT5saW5rX3htaXRfZGF0YV9xKSkgewotICAgICAgQlRfSERSKiBwX2J1ZiA9IHN0YXRpY19jYXN0PEJUX0hEUio+KGxpc3RfZnJvbnQocF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EpKTsKLSAgICAgIGxpc3RfcmVtb3ZlKHBfbGNiLT5saW5rX3htaXRfZGF0YV9xLCBwX2J1Zik7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgfQotICAgIGxpc3RfZnJlZShwX2xjYi0+bGlua194bWl0X2RhdGFfcSk7Ci0gICAgcF9sY2ItPmxpbmtfeG1pdF9kYXRhX3EgPSBOVUxMOwotICB9Ci0KLSAgLyogUmUtYWRqdXN0IGZsb3cgY29udHJvbCB3aW5kb3dzIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBnbyBuZWdhdGl2ZSAqLwotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBpZiAobDJjYi5udW1fYmxlX2xpbmtzX2FjdGl2ZSA+PSAxKSBsMmNiLm51bV9ibGVfbGlua3NfYWN0aXZlLS07Ci0KLSAgICBsMmNfYmxlX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24oKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAobDJjYi5udW1fdXNlZF9sY2JzID49IDEpIGwyY2IubnVtX3VzZWRfbGNicy0tOwotCi0gICAgbDJjX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24oKTsKLSAgfQotCi0gIC8qIENoZWNrIGFuZCByZWxlYXNlIGFsbCB0aGUgTEUgQ09DIGNvbm5lY3Rpb25zIHdhaXRpbmcgZm9yIHNlY3VyaXR5ICovCi0gIGlmIChwX2xjYi0+bGVfc2VjX3BlbmRpbmdfcSkgewotICAgIHdoaWxlICghZml4ZWRfcXVldWVfaXNfZW1wdHkocF9sY2ItPmxlX3NlY19wZW5kaW5nX3EpKSB7Ci0gICAgICB0TDJDQVBfU0VDX0RBVEEqIHBfYnVmID0KLSAgICAgICAgICAodEwyQ0FQX1NFQ19EQVRBKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX2xjYi0+bGVfc2VjX3BlbmRpbmdfcSk7Ci0gICAgICBpZiAocF9idWYtPnBfY2FsbGJhY2spCi0gICAgICAgIHBfYnVmLT5wX2NhbGxiYWNrKHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgcF9sY2ItPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPnBfcmVmX2RhdGEsIEJUTV9ERVZfUkVTRVQpOwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgIH0KLSAgICBmaXhlZF9xdWV1ZV9mcmVlKHBfbGNiLT5sZV9zZWNfcGVuZGluZ19xLCBOVUxMKTsKLSAgICBwX2xjYi0+bGVfc2VjX3BlbmRpbmdfcSA9IE5VTEw7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vayB0aHJvdWdoIGFsbCBhY3RpdmUgTENCcyBmb3IgYSBtYXRjaCBiYXNlZCBvbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcmVtb3RlIEJEIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIG1hdGNoZWQgTENCLCBvciBOVUxMIGlmIG5vIG1hdGNoCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRMMkNfTENCKiBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBpbnQgeHg7Ci0gIHRMMkNfTENCKiBwX2xjYiA9ICZsMmNiLmxjYl9wb29sWzBdOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IE1BWF9MMkNBUF9MSU5LUzsgeHgrKywgcF9sY2IrKykgewotICAgIGlmICgocF9sY2ItPmluX3VzZSkgJiYgcF9sY2ItPnRyYW5zcG9ydCA9PSB0cmFuc3BvcnQgJiYKLSAgICAgICAgKHBfbGNiLT5yZW1vdGVfYmRfYWRkciA9PSBwX2JkX2FkZHIpKSB7Ci0gICAgICByZXR1cm4gKHBfbGNiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBtYXRjaCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjX2lzX2NtZF9yZWplY3RlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2tzIGlmIGNtZF9jb2RlIGlzIGNvbW1hbmQgb3IgcmVzcG9uc2UKLSAqICAgICAgICAgICAgICAgICAgSWYgYSBjb21tYW5kIGl0IHdpbGwgYmUgcmVqZWN0ZWQgcGVyIHNwZWMuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEgaWxsZWdhbCBwYWNrZXQgbGVuZ3RoIGlzCi0gKiAgICAgICAgICAgICAgICAgIGRldGVjdGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICAtIHRydWUgaWYgY21kX2NvZGUgaXMgYSBjb21tYW5kIGFuZCBpdCBpcyByZWplY3RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHJlc3BvbnNlIGNvZGUuIChjb21tYW5kIG5vdCByZWplY3RlZCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBsMmNfaXNfY21kX3JlamVjdGVkKHVpbnQ4X3QgY21kX2NvZGUsIHVpbnQ4X3Qgc2lnbmFsX2lkLCB0TDJDX0xDQiogcF9sY2IpIHsKLSAgc3dpdGNoIChjbWRfY29kZSkgewotICAgIGNhc2UgTDJDQVBfQ01EX0NPTk5fUkVROgotICAgIGNhc2UgTDJDQVBfQ01EX0NPTkZJR19SRVE6Ci0gICAgY2FzZSBMMkNBUF9DTURfRElTQ19SRVE6Ci0gICAgY2FzZSBMMkNBUF9DTURfRUNIT19SRVE6Ci0gICAgY2FzZSBMMkNBUF9DTURfSU5GT19SRVE6Ci0gICAgY2FzZSBMMkNBUF9DTURfQU1QX0NPTk5fUkVROgotICAgIGNhc2UgTDJDQVBfQ01EX0FNUF9NT1ZFX1JFUToKLSAgICBjYXNlIEwyQ0FQX0NNRF9CTEVfVVBEQVRFX1JFUToKLSAgICAgIGwyY3Vfc2VuZF9wZWVyX2NtZF9yZWplY3QocF9sY2IsIEwyQ0FQX0NNRF9SRUpfTVRVX0VYQ0VFREVELCBzaWduYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0RFRkFVTFRfTVRVLCAwKTsKLSAgICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkR1bXBpbmcgZmlyc3QgQ29tbWFuZCAoJWQpIiwgY21kX2NvZGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBkZWZhdWx0OiAvKiBPdGhlcndpc2UgYSByZXNwb25zZSAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2J1aWxkX2hlYWRlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGRzIHRoZSBMMkNBUCBjb21tYW5kIHBhY2tldCBoZWFkZXIKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gYWxsb2NhdGVkIHBhY2tldCBvciBOVUxMIGlmIG5vIHJlc291cmNlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CVF9IRFIqIGwyY3VfYnVpbGRfaGVhZGVyKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgbGVuLCB1aW50OF90IGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzaWduYWxfaWQpIHsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoTDJDQVBfQ01EX0JVRl9TSVpFKTsKLSAgdWludDhfdCogcDsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfU0VORF9DTURfT0ZGU0VUOwotICBwX2J1Zi0+bGVuID0KLSAgICAgIGxlbiArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKyBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQ7Ci0KLSAgLyogUHV0IGluIEhDSSBoZWFkZXIgLSBoYW5kbGUgKyBwa3QgYm91bmRhcnkgKi8KLSAgaWYgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSB7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCAocF9sY2ItPkhhbmRsZSgpIHwgKEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKSkpOwotICB9IGVsc2UgewotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9sY2ItPkhhbmRsZSgpIHwgbDJjYi5ub25fZmx1c2hhYmxlX3BiZik7Ci0gIH0KLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGxlbiArIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgbGVuICsgTDJDQVBfQ01EX09WRVJIRUFEKTsKLQotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIEwyQ0FQX0JMRV9TSUdOQUxMSU5HX0NJRCk7Ci0gIH0gZWxzZSB7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBMMkNBUF9TSUdOQUxMSU5HX0NJRCk7Ci0gIH0KLQotICAvKiBQdXQgaW4gTDJDQVAgY29tbWFuZCBoZWFkZXIgKi8KLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGNtZCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBzaWduYWxfaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGxlbik7Ci0KLSAgcmV0dXJuIChwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2Fkal9pZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2tzIGZvciB2YWxpZCBJRCBiYXNlZCBvbiBzcGVjaWZpZWQgbWFzawotICogICAgICAgICAgICAgICAgICBhbmQgYWRqdXN0cyB0aGUgaWQgaWYgaW52YWxpZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X2Fkal9pZCh0TDJDX0xDQiogcF9sY2IpIHsKLSAgaWYgKHBfbGNiLT5zaWduYWxfaWQgPT0gMCkgewotICAgIHBfbGNiLT5zaWduYWxfaWQrKzsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9zZW5kX3BlZXJfY21kX3JlamVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgImNvbW1hbmQgcmVqZWN0IiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2NtZF9yZWplY3QodEwyQ19MQ0IqIHBfbGNiLCB1aW50MTZfdCByZWFzb24sIHVpbnQ4X3QgcmVtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHAxLCB1aW50MTZfdCBwMikgewotICB1aW50MTZfdCBwYXJhbV9sZW47Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgLyogUHV0IGluIEwyQ0FQIHBhY2tldCBoZWFkZXIgKi8KLSAgaWYgKHJlYXNvbiA9PSBMMkNBUF9DTURfUkVKX01UVV9FWENFRURFRCkKLSAgICBwYXJhbV9sZW4gPSAyOwotICBlbHNlIGlmIChyZWFzb24gPT0gTDJDQVBfQ01EX1JFSl9JTlZBTElEX0NJRCkKLSAgICBwYXJhbV9sZW4gPSA0OwotICBlbHNlCi0gICAgcGFyYW1fbGVuID0gMDsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCAodWludDE2X3QpKEwyQ0FQX0NNRF9SRUpFQ1RfTEVOICsgcGFyYW1fbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfUkVKRUNULCByZW1faWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gbm8gYnVmZmVyIGNtZF9yZWoiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCByZWFzb24pOwotCi0gIGlmIChwYXJhbV9sZW4gPj0gMikgVUlOVDE2X1RPX1NUUkVBTShwLCBwMSk7Ci0KLSAgaWYgKHBhcmFtX2xlbiA+PSA0KSBVSU5UMTZfVE9fU1RSRUFNKHAsIHAyKTsKLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Nvbm5lY3RfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAiY29ubmVjdGlvbiByZXF1ZXN0IiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2Nvbm5lY3RfcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIC8qIENyZWF0ZSBhbiBpZGVudGlmaWVyIGZvciB0aGlzIHBhY2tldCAqLwotICBwX2NjYi0+cF9sY2ItPnNpZ25hbF9pZCsrOwotICBsMmN1X2Fkal9pZChwX2NjYi0+cF9sY2IpOwotCi0gIHBfY2NiLT5sb2NhbF9pZCA9IHBfY2NiLT5wX2xjYi0+c2lnbmFsX2lkOwotCi0gIHBfYnVmID0gbDJjdV9idWlsZF9oZWFkZXIocF9jY2ItPnBfbGNiLCBMMkNBUF9DT05OX1JFUV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0NPTk5fUkVRLCBwX2NjYi0+bG9jYWxfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gbm8gYnVmZmVyIGZvciBjb25uX3JlcSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5wX3JjYi0+cmVhbF9wc20pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5sb2NhbF9jaWQpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2NjYi0+cF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2Nvbm5lY3RfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAiY29ubmVjdGlvbiByZXNwb25zZSIgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25uZWN0X3JzcCh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhdHVzKSB7Ci0gIGlmIChyZXN1bHQgPT0gTDJDQVBfQ09OTl9QRU5ESU5HKSB7Ci0gICAgLyogaWYgd2UgYWxyZWFkeSBzZW50IHBlbmRpbmcgcmVzcG9uc2UgKi8KLSAgICBpZiAocF9jY2ItPmZsYWdzICYgQ0NCX0ZMQUdfU0VOVF9QRU5ESU5HKSB7Ci0gICAgICBMT0dfREVCVUcoIkFscmVhZHkgc2VudCBjb25uZWN0aW9uIHBlbmRpbmcsIG5vdCBzZW5kaW5nIGFnYWluIik7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfY2NiLT5mbGFncyB8PSBDQ0JfRkxBR19TRU5UX1BFTkRJTkc7Ci0gICAgfQotICB9Ci0KLSAgQlRfSERSKiBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfY2NiLT5wX2xjYiwgTDJDQVBfQ09OTl9SU1BfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0NPTk5fUlNQLCBwX2NjYi0+cmVtb3RlX2lkKTsKLSAgaWYgKHBfYnVmID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigibm8gYnVmZmVyIGZvciBjb25uX3JzcCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKwotICAgICAgICAgICAgICAgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5sb2NhbF9jaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCByZXN1bHQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHN0YXR1cyk7Ci0KLSAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfY2NiLT5wX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9yZWplY3RfY29ubmVjdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgImNvbm5lY3Rpb24gcmVzcG9uc2UgbmVnIiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgQ0NCIChub24tZXhpc3RhbnQgUFNNIG9yIG5vIHJlc291cmNlcykuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9yZWplY3RfY29ubmVjdGlvbih0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IHJlbW90ZV9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZW1faWQsIHVpbnQxNl90IHJlc3VsdCkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIHBfYnVmID0KLSAgICAgIGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCBMMkNBUF9DT05OX1JTUF9MRU4sIEwyQ0FQX0NNRF9DT05OX1JTUCwgcmVtX2lkKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIGJ1ZmZlciBmb3IgY29ubl9yZXEiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCAwKTsgLyogTG9jYWwgQ0lEIG9mIDAgICAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHJlbW90ZV9jaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHJlc3VsdCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMCk7IC8qIFN0YXR1cyBvZiAwICAgICAgKi8KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9jcmVkaXRfYmFzZWRfcmVjb25maWdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAicmVjb29uZmlndXJhdGlvbiByZXF1ZXN0IiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9jcmVkaXRfYmFzZWRfcmVjb25maWdfcmVxKHRMMkNfQ0NCKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50MTZfdCBjbWRfbGVuOwotICB1aW50OF90KiBwOwotICB0TDJDX0xDQiogcF9sY2IgPSBwX2NjYi0+cF9sY2I7Ci0gIHRMMkNfQ0NCKiBwX2NjYl90ZW1wOwotCi0gIGNtZF9sZW4gPSBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUV9NSU5fTEVOICsKLSAgICAgICAgICAgIHNpemVvZih1aW50MTZfdCkgKiBwX2xjYi0+cGVuZGluZ19lY29jX3JlY29uZmlnX2NudDsKLQotICAvKiBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBwYWNrZXQgKi8KLSAgcF9sY2ItPnNpZ25hbF9pZCsrOwotICBsMmN1X2Fkal9pZChwX2xjYik7Ci0KLSAgcF9jY2ItPmxvY2FsX2lkID0gcF9sY2ItPnNpZ25hbF9pZDsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCBjbWRfbGVuLCBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xjYi0+c2lnbmFsX2lkKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJsMmN1X3NlbmRfcmVjb25maWdfcmVxIC0gbm8gYnVmZmVyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCJsMmN1X3NlbmRfcmVjb25maWdfcmVxIG51bWJlciBvZiBjaWRzOiAlZCBtdHU6JWQgbXBzOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgcF9sY2ItPnBlbmRpbmdfZWNvY19yZWNvbmZpZ19jbnQsIHBfY2ZnLT5tdHUsIHBfY2ZnLT5tcHMpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jZmctPm10dSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jZmctPm1wcyk7Ci0KLSAgZm9yIChwX2NjYl90ZW1wID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2JfdGVtcDsKLSAgICAgICBwX2NjYl90ZW1wID0gcF9jY2JfdGVtcC0+cF9uZXh0X2NjYikgewotICAgIGlmICgocF9jY2JfdGVtcC0+aW5fdXNlKSAmJiAocF9jY2JfdGVtcC0+ZWNvYykgJiYKLSAgICAgICAgKHBfY2NiX3RlbXAtPnJlY29uZmlnX3N0YXJ0ZWQpKQotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYl90ZW1wLT5sb2NhbF9jaWQpOwotICB9Ci0KLSAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9jb25maWdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAiY29uZmlndXJhdGlvbiByZXF1ZXN0IiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2NvbmZpZ19yZXEodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQxNl90IGNmZ19sZW4gPSAwOwotICB1aW50OF90KiBwOwotCi0gIC8qIENyZWF0ZSBhbiBpZGVudGlmaWVyIGZvciB0aGlzIHBhY2tldCAqLwotICBwX2NjYi0+cF9sY2ItPnNpZ25hbF9pZCsrOwotICBsMmN1X2Fkal9pZChwX2NjYi0+cF9sY2IpOwotCi0gIHBfY2NiLT5sb2NhbF9pZCA9IHBfY2NiLT5wX2xjYi0+c2lnbmFsX2lkOwotCi0gIGlmIChwX2NmZy0+bXR1X3ByZXNlbnQpCi0gICAgY2ZnX2xlbiArPSBMMkNBUF9DRkdfTVRVX09QVElPTl9MRU4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEOwotICBpZiAocF9jZmctPmZsdXNoX3RvX3ByZXNlbnQpCi0gICAgY2ZnX2xlbiArPSBMMkNBUF9DRkdfRkxVU0hfT1BUSU9OX0xFTiArIEwyQ0FQX0NGR19PUFRJT05fT1ZFUkhFQUQ7Ci0gIGlmIChwX2NmZy0+cW9zX3ByZXNlbnQpCi0gICAgY2ZnX2xlbiArPSBMMkNBUF9DRkdfUU9TX09QVElPTl9MRU4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEOwotICBpZiAocF9jZmctPmZjcl9wcmVzZW50KQotICAgIGNmZ19sZW4gKz0gTDJDQVBfQ0ZHX0ZDUl9PUFRJT05fTEVOICsgTDJDQVBfQ0ZHX09QVElPTl9PVkVSSEVBRDsKLSAgaWYgKHBfY2ZnLT5mY3NfcHJlc2VudCkKLSAgICBjZmdfbGVuICs9IEwyQ0FQX0NGR19GQ1NfT1BUSU9OX0xFTiArIEwyQ0FQX0NGR19PUFRJT05fT1ZFUkhFQUQ7Ci0gIGlmIChwX2NmZy0+ZXh0X2Zsb3dfc3BlY19wcmVzZW50KQotICAgIGNmZ19sZW4gKz0gTDJDQVBfQ0ZHX0VYVF9GTE9XX09QVElPTl9MRU4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEOwotCi0gIHBfYnVmID0gbDJjdV9idWlsZF9oZWFkZXIocF9jY2ItPnBfbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoTDJDQVBfQ09ORklHX1JFUV9MRU4gKyBjZmdfbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfQ09ORklHX1JFUSwgcF9jY2ItPmxvY2FsX2lkKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIGJ1ZmZlciBmb3IgY29ubl9yZXEiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+cmVtb3RlX2NpZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jZmctPmZsYWdzKTsgLyogRmxhZ3MgKGNvbnRpbnVhdGlvbikgKi8KLQotICAvKiBOb3csIHB1dCB0aGUgb3B0aW9ucyAqLwotICBpZiAocF9jZmctPm10dV9wcmVzZW50KSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19UWVBFX01UVSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19NVFVfT1BUSU9OX0xFTik7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NmZy0+bXR1KTsKLSAgfQotICBpZiAocF9jZmctPmZsdXNoX3RvX3ByZXNlbnQpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX1RZUEVfRkxVU0hfVE9VVCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19GTFVTSF9PUFRJT05fTEVOKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2ZnLT5mbHVzaF90byk7Ci0gIH0KLSAgaWYgKHBfY2ZnLT5xb3NfcHJlc2VudCkgewotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBMMkNBUF9DRkdfVFlQRV9RT1MpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBMMkNBUF9DRkdfUU9TX09QVElPTl9MRU4pOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NmZy0+cW9zLnFvc19mbGFncyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ZnLT5xb3Muc2VydmljZV90eXBlKTsKLSAgICBVSU5UMzJfVE9fU1RSRUFNKHAsIHBfY2ZnLT5xb3MudG9rZW5fcmF0ZSk7Ci0gICAgVUlOVDMyX1RPX1NUUkVBTShwLCBwX2NmZy0+cW9zLnRva2VuX2J1Y2tldF9zaXplKTsKLSAgICBVSU5UMzJfVE9fU1RSRUFNKHAsIHBfY2ZnLT5xb3MucGVha19iYW5kd2lkdGgpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPnFvcy5sYXRlbmN5KTsKLSAgICBVSU5UMzJfVE9fU1RSRUFNKHAsIHBfY2ZnLT5xb3MuZGVsYXlfdmFyaWF0aW9uKTsKLSAgfQotICBpZiAocF9jZmctPmZjcl9wcmVzZW50KSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19UWVBFX0ZDUik7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19GQ1JfT1BUSU9OX0xFTik7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ZnLT5mY3IubW9kZSk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ZnLT5mY3IudHhfd2luX3N6KTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jZmctPmZjci5tYXhfdHJhbnNtaXQpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jZmctPmZjci5ydHJhbnNfdG91dCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NmZy0+ZmNyLm1vbl90b3V0KTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2ZnLT5mY3IubXBzKTsKLSAgfQotCi0gIGlmIChwX2NmZy0+ZmNzX3ByZXNlbnQpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX1RZUEVfRkNTKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX0ZDU19PUFRJT05fTEVOKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jZmctPmZjcyk7Ci0gIH0KLQotICBpZiAocF9jZmctPmV4dF9mbG93X3NwZWNfcHJlc2VudCkgewotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBMMkNBUF9DRkdfVFlQRV9FWFRfRkxPVyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19FWFRfRkxPV19PUFRJT05fTEVOKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jZmctPmV4dF9mbG93X3NwZWMuaWQpOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NmZy0+ZXh0X2Zsb3dfc3BlYy5zdHlwZSk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NmZy0+ZXh0X2Zsb3dfc3BlYy5tYXhfc2R1X3NpemUpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPmV4dF9mbG93X3NwZWMuc2R1X2ludGVyX3RpbWUpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPmV4dF9mbG93X3NwZWMuYWNjZXNzX2xhdGVuY3kpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPmV4dF9mbG93X3NwZWMuZmx1c2hfdGltZW91dCk7Ci0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9jb25maWdfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAiY29uZmlndXJhdGlvbiByZXNwb25zZSIgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25maWdfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50MTZfdCBjZmdfbGVuID0gMDsKLSAgdWludDhfdCogcDsKLQotICAvKiBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBwYWNrZXQgKi8KLSAgaWYgKHBfY2ZnLT5tdHVfcHJlc2VudCkKLSAgICBjZmdfbGVuICs9IEwyQ0FQX0NGR19NVFVfT1BUSU9OX0xFTiArIEwyQ0FQX0NGR19PUFRJT05fT1ZFUkhFQUQ7Ci0gIGlmIChwX2NmZy0+Zmx1c2hfdG9fcHJlc2VudCkKLSAgICBjZmdfbGVuICs9IEwyQ0FQX0NGR19GTFVTSF9PUFRJT05fTEVOICsgTDJDQVBfQ0ZHX09QVElPTl9PVkVSSEVBRDsKLSAgaWYgKHBfY2ZnLT5xb3NfcHJlc2VudCkKLSAgICBjZmdfbGVuICs9IEwyQ0FQX0NGR19RT1NfT1BUSU9OX0xFTiArIEwyQ0FQX0NGR19PUFRJT05fT1ZFUkhFQUQ7Ci0gIGlmIChwX2NmZy0+ZmNyX3ByZXNlbnQpCi0gICAgY2ZnX2xlbiArPSBMMkNBUF9DRkdfRkNSX09QVElPTl9MRU4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEOwotICBpZiAocF9jZmctPmV4dF9mbG93X3NwZWNfcHJlc2VudCkKLSAgICBjZmdfbGVuICs9IEwyQ0FQX0NGR19FWFRfRkxPV19PUFRJT05fTEVOICsgTDJDQVBfQ0ZHX09QVElPTl9PVkVSSEVBRDsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfY2NiLT5wX2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKEwyQ0FQX0NPTkZJR19SU1BfTEVOICsgY2ZnX2xlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0NPTkZJR19SU1AsIHBfY2NiLT5yZW1vdGVfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gbm8gYnVmZmVyIGZvciBjb25uX3JlcSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5yZW1vdGVfY2lkKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLAotICAgICAgICAgICAgICAgICAgIHBfY2ZnLT5mbGFncyk7IC8qIEZsYWdzIChjb250aW51YXRpb24pIE11c3QgbWF0Y2ggcmVxdWVzdCAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2ZnLT5yZXN1bHQpOwotCi0gIC8qIE5vdywgcHV0IHRoZSBvcHRpb25zICovCi0gIGlmIChwX2NmZy0+bXR1X3ByZXNlbnQpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX1RZUEVfTVRVKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX01UVV9PUFRJT05fTEVOKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2ZnLT5tdHUpOwotICB9Ci0gIGlmIChwX2NmZy0+Zmx1c2hfdG9fcHJlc2VudCkgewotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBMMkNBUF9DRkdfVFlQRV9GTFVTSF9UT1VUKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX0ZMVVNIX09QVElPTl9MRU4pOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jZmctPmZsdXNoX3RvKTsKLSAgfQotICBpZiAocF9jZmctPnFvc19wcmVzZW50KSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19UWVBFX1FPUyk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19RT1NfT1BUSU9OX0xFTik7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ZnLT5xb3MucW9zX2ZsYWdzKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jZmctPnFvcy5zZXJ2aWNlX3R5cGUpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPnFvcy50b2tlbl9yYXRlKTsKLSAgICBVSU5UMzJfVE9fU1RSRUFNKHAsIHBfY2ZnLT5xb3MudG9rZW5fYnVja2V0X3NpemUpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPnFvcy5wZWFrX2JhbmR3aWR0aCk7Ci0gICAgVUlOVDMyX1RPX1NUUkVBTShwLCBwX2NmZy0+cW9zLmxhdGVuY3kpOwotICAgIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9jZmctPnFvcy5kZWxheV92YXJpYXRpb24pOwotICB9Ci0gIGlmIChwX2NmZy0+ZmNyX3ByZXNlbnQpIHsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX1RZUEVfRkNSKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX0ZDUl9PUFRJT05fTEVOKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jZmctPmZjci5tb2RlKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jZmctPmZjci50eF93aW5fc3opOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NmZy0+ZmNyLm1heF90cmFuc21pdCk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+b3VyX2NmZy5mY3IucnRyYW5zX3RvdXQpOwotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPm91cl9jZmcuZmNyLm1vbl90b3V0KTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2ZnLT5mY3IubXBzKTsKLSAgfQotCi0gIGlmIChwX2NmZy0+ZXh0X2Zsb3dfc3BlY19wcmVzZW50KSB7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19UWVBFX0VYVF9GTE9XKTsKLSAgICBVSU5UOF9UT19TVFJFQU0ocCwgTDJDQVBfQ0ZHX0VYVF9GTE9XX09QVElPTl9MRU4pOwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NmZy0+ZXh0X2Zsb3dfc3BlYy5pZCk7Ci0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ZnLT5leHRfZmxvd19zcGVjLnN0eXBlKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2ZnLT5leHRfZmxvd19zcGVjLm1heF9zZHVfc2l6ZSk7Ci0gICAgVUlOVDMyX1RPX1NUUkVBTShwLCBwX2NmZy0+ZXh0X2Zsb3dfc3BlYy5zZHVfaW50ZXJfdGltZSk7Ci0gICAgVUlOVDMyX1RPX1NUUkVBTShwLCBwX2NmZy0+ZXh0X2Zsb3dfc3BlYy5hY2Nlc3NfbGF0ZW5jeSk7Ci0gICAgVUlOVDMyX1RPX1NUUkVBTShwLCBwX2NmZy0+ZXh0X2Zsb3dfc3BlYy5mbHVzaF90aW1lb3V0KTsKLSAgfQotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2NjYi0+cF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2NvbmZpZ19yZWoKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGFuZCBzZW5kIGFuIEwyQ0FQICJjb25maWd1cmF0aW9uIHJlamVjdCIgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25maWdfcmVqKHRMMkNfQ0NCKiBwX2NjYiwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfbGVuLCB1aW50MTZfdCByZWpfbGVuKSB7Ci0gIHVpbnQxNl90IGxlbiwgY2ZnX2xlbiwgYnVmX3NwYWNlLCBsZW4xOwotICB1aW50OF90ICpwLCAqcF9oY2lfbGVuLCAqcF9kYXRhX2VuZDsKLSAgdWludDhfdCBjZmdfY29kZTsKLQotICBMMkNBUF9UUkFDRV9ERUJVRygibDJjdV9zZW5kX3BlZXJfY29uZmlnX3JlajogZGF0YV9sZW49JWQsIHJlal9sZW49JWQiLAotICAgICAgICAgICAgICAgICAgICBkYXRhX2xlbiwgcmVqX2xlbik7Ci0KLSAgbGVuID0gQlRfSERSX1NJWkUgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsgTDJDQVBfUEtUX09WRVJIRUFEICsKLSAgICAgICAgTDJDQVBfQ01EX09WRVJIRUFEICsgTDJDQVBfQ09ORklHX1JTUF9MRU47Ci0gIGxlbjEgPSAweEZGRkYgLSBsZW47Ci0gIGlmIChyZWpfbGVuID4gbGVuMSkgewotICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAiTDJDQVAgLSBjZmdfcmVqIHBrdCBzaXplIGV4Y2VlZHMgYnVmZmVyIGRlc2lnbiBtYXggbGltaXQuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MobGVuICsgcmVqX2xlbik7Ci0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9TRU5EX0NNRF9PRkZTRVQ7Ci0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQ7Ci0KLSAgY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyID0gY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCk7Ci0KLS8qIFB1dCBpbiBIQ0kgaGVhZGVyIC0gaGFuZGxlICsgcGt0IGJvdW5kYXJ5ICovCi0gIGlmIChjb250cm9sbGVyLT5zdXBwb3J0c19ub25fZmx1c2hhYmxlX3BiKCkpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIChwX2NjYi0+cF9sY2ItPkhhbmRsZSgpIHwgKEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBMMkNBUF9QS1RfVFlQRV9TSElGVCkpKTsKLSAgfSBlbHNlCi0gIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIChwX2NjYi0+cF9sY2ItPkhhbmRsZSgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTDJDQVBfUEtUX1NUQVJUIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKSkpOwotICB9Ci0KLSAgLyogUmVtZW1iZXIgdGhlIEhDSSBoZWFkZXIgbGVuZ3RoIHBvc2l0aW9uLCBhbmQgc2F2ZSBzcGFjZSBmb3IgaXQgKi8KLSAgcF9oY2lfbGVuID0gcDsKLSAgcCArPSAyOwotCi0gIC8qIFB1dCBpbiBMMkNBUCBwYWNrZXQgaGVhZGVyICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgTDJDQVBfQ01EX09WRVJIRUFEICsgTDJDQVBfQ09ORklHX1JTUF9MRU4gKyByZWpfbGVuKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBMMkNBUF9TSUdOQUxMSU5HX0NJRCk7Ci0KLSAgLyogUHV0IGluIEwyQ0FQIGNvbW1hbmQgaGVhZGVyICovCi0gIFVJTlQ4X1RPX1NUUkVBTShwLCBMMkNBUF9DTURfQ09ORklHX1JTUCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NjYi0+cmVtb3RlX2lkKTsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIEwyQ0FQX0NPTkZJR19SU1BfTEVOICsgcmVqX2xlbik7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+cmVtb3RlX2NpZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMCk7IC8qIEZsYWdzID0gMCAobm8gY29udGludWF0aW9uKSAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIEwyQ0FQX0NGR19VTktOT1dOX09QVElPTlMpOwotCi0gIGJ1Zl9zcGFjZSA9IHJlal9sZW47Ci0KLSAgLyogTm93LCBwdXQgdGhlIHJlamVjdGVkIG9wdGlvbnMgKi8KLSAgcF9kYXRhX2VuZCA9IHBfZGF0YSArIGRhdGFfbGVuOwotICB3aGlsZSAocF9kYXRhIDwgcF9kYXRhX2VuZCkgewotICAgIGNmZ19jb2RlID0gKnBfZGF0YTsKLSAgICBjZmdfbGVuID0gKihwX2RhdGEgKyAxKTsKLQotICAgIHN3aXRjaCAoY2ZnX2NvZGUgJiAweDdGKSB7Ci0gICAgICAvKiBza2lwIGtub3duIG9wdGlvbnMgKi8KLSAgICAgIGNhc2UgTDJDQVBfQ0ZHX1RZUEVfTVRVOgotICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9GTFVTSF9UT1VUOgotICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9RT1M6Ci0gICAgICBjYXNlIEwyQ0FQX0NGR19UWVBFX0ZDUjoKLSAgICAgIGNhc2UgTDJDQVBfQ0ZHX1RZUEVfRkNTOgotICAgICAgY2FzZSBMMkNBUF9DRkdfVFlQRV9FWFRfRkxPVzoKLSAgICAgICAgcF9kYXRhICs9IGNmZ19sZW4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEOwotICAgICAgICBicmVhazsKLQotICAgICAgLyogdW5rbm93biBvcHRpb25zOyBjb3B5IGludG8gcnNwIGlmIG5vdCBoaW50cyAqLwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogc2FuaXR5IGNoZWNrIG9wdGlvbiBsZW5ndGggKi8KLSAgICAgICAgaWYgKChjZmdfbGVuICsgTDJDQVBfQ0ZHX09QVElPTl9PVkVSSEVBRCkgPD0gZGF0YV9sZW4pIHsKLSAgICAgICAgICBpZiAoKGNmZ19jb2RlICYgMHg4MCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKGJ1Zl9zcGFjZSA+PSAoY2ZnX2xlbiArIEwyQ0FQX0NGR19PUFRJT05fT1ZFUkhFQUQpKSB7Ci0gICAgICAgICAgICAgIG1lbWNweShwLCBwX2RhdGEsIGNmZ19sZW4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEKTsKLSAgICAgICAgICAgICAgcCArPSBjZmdfbGVuICsgTDJDQVBfQ0ZHX09QVElPTl9PVkVSSEVBRDsKLSAgICAgICAgICAgICAgYnVmX3NwYWNlIC09IChjZmdfbGVuICsgTDJDQVBfQ0ZHX09QVElPTl9PVkVSSEVBRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIGNmZ19yZWogZXhjZWVkcyBhbGxvY2F0ZWQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgIHBfZGF0YSA9IHBfZGF0YV9lbmQ7IC8qIGZvcmNlIGxvb3AgZXhpdCAqLwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcF9kYXRhICs9IGNmZ19sZW4gKyBMMkNBUF9DRkdfT1BUSU9OX09WRVJIRUFEOwotICAgICAgICB9Ci0gICAgICAgIC8qIGJhZCBsZW5ndGg7IGZvcmNlIGxvb3AgZXhpdCAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBwX2RhdGEgPSBwX2RhdGFfZW5kOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGxlbiA9ICh1aW50MTZfdCkocCAtIHBfaGNpX2xlbiAtIDIpOwotICBVSU5UMTZfVE9fU1RSRUFNKHBfaGNpX2xlbiwgbGVuKTsKLQotICBwX2J1Zi0+bGVuID0gbGVuICsgNDsKLQotICBMMkNBUF9UUkFDRV9ERUJVRygiTDJDQVAgLSBjZmdfcmVqIHBrdCBoY2lfbGVuPSVkLCBsMmNhcF9sZW49JWQiLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgIChMMkNBUF9DTURfT1ZFUkhFQUQgKyBMMkNBUF9DT05GSUdfUlNQX0xFTiArIHJlal9sZW4pKTsKLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9kaXNjX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgImRpc2Nvbm5lY3QgcmVxdWVzdCIgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9kaXNjX3JlcSh0TDJDX0NDQiogcF9jY2IpIHsKLSAgQlRfSERSICpwX2J1ZiwgKnBfYnVmMjsKLSAgdWludDhfdCogcDsKLQotICBpZiAoKCFwX2NjYikgfHwgKHBfY2NiLT5wX2xjYiA9PSBOVUxMKSkgewotICAgIEwyQ0FQX1RSQUNFX0VSUk9SKCIlcyBMMkNBUCAtIGNjYiBvciBsY2IgaW52YWxpZCIsIF9fZnVuY19fKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBwYWNrZXQgKi8KLSAgcF9jY2ItPnBfbGNiLT5zaWduYWxfaWQrKzsKLSAgbDJjdV9hZGpfaWQocF9jY2ItPnBfbGNiKTsKLQotICBwX2NjYi0+bG9jYWxfaWQgPSBwX2NjYi0+cF9sY2ItPnNpZ25hbF9pZDsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfY2NiLT5wX2xjYiwgTDJDQVBfRElTQ19SRVFfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0NNRF9ESVNDX1JFUSwgcF9jY2ItPmxvY2FsX2lkKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIGJ1ZmZlciBmb3IgZGlzY19yZXEiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+cmVtb3RlX2NpZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPmxvY2FsX2NpZCk7Ci0KLSAgLyogTW92ZSBhbGwgcXVldWVkIGRhdGEgcGFja2V0cyB0byB0aGUgTENCLiBJbiBGQ1IgbW9kZSwgYXNzdW1lIHRoZSBoaWdoZXIKLSAgICAgbGF5ZXIgY2hlY2tzIHRoYXQgYWxsIGJ1ZmZlcnMgYXJlIHNlbnQgYmVmb3JlIGRpc2Nvbm5lY3RpbmcuCi0gICovCi0gIGlmIChwX2NjYi0+cGVlcl9jZmcuZmNyLm1vZGUgPT0gTDJDQVBfRkNSX0JBU0lDX01PREUpIHsKLSAgICB3aGlsZSAoKHBfYnVmMiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfY2NiLT54bWl0X2hvbGRfcSkpICE9Ci0gICAgICAgICAgIE5VTEwpIHsKLSAgICAgIGwyY3Vfc2V0X2FjbF9oY2lfaGVhZGVyKHBfYnVmMiwgcF9jY2IpOwotICAgICAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfY2NiLT5wX2xjYiwgcF9jY2ItPmxvY2FsX2NpZCwgcF9idWYyKTsKLSAgICB9Ci0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9kaXNjX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgImRpc2Nvbm5lY3QgcmVzcG9uc2UiIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHBlZXIuCi0gKgotICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGRpc2Nvbm5lY3QKLSAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGVhZCBvZiB0aGUgQ0NCIGFkZHJlc3MsIGFzIGl0IG1heSBiZSBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gc2VuZCBhIGRpc2Nvbm5lY3QgcmVzcG9uc2Ugd2hlbiB0aGVyZSBpcyBubyBDQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9zZW5kX3BlZXJfZGlzY19yc3AodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90IHJlbW90ZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbG9jYWxfY2lkLCB1aW50MTZfdCByZW1vdGVfY2lkKSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgcF9idWYgPSBsMmN1X2J1aWxkX2hlYWRlcihwX2xjYiwgTDJDQVBfRElTQ19SU1BfTEVOLCBMMkNBUF9DTURfRElTQ19SU1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX2lkKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIGJ1ZmZlciBmb3IgZGlzY19yc3AiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBsb2NhbF9jaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHJlbW90ZV9jaWQpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9zZW5kX3BlZXJfZWNob19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGFuZCBzZW5kIGFuIEwyQ0FQICJlY2hvIHJlc3BvbnNlIiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2VjaG9fcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCBzaWduYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgZGF0YV9sZW4pIHsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgdWludDhfdCogcDsKLSAgdWludDE2X3QgbWF4bGVuOwotICAvKiBGaWx0ZXIgb3V0IGR1cGxpY2F0ZSBJRHMgb3IgaWYgYXZhaWxhYmxlIGJ1ZmZlcnMgYXJlIGxvdyAoaW50cnVkZXIKLSAgICogY2hlY2tpbmcpICovCi0gIGlmICghc2lnbmFsX2lkIHx8IHNpZ25hbF9pZCA9PSBwX2xjYi0+Y3VyX2VjaG9faWQpIHsKLSAgICAvKiBEdW1wIHRoaXMgcmVxdWVzdCBzaW5jZSBpdCBpcyBpbGxlZ2FsICovCi0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgaWdub3JpbmcgZHVwbGljYXRlIGVjaG8gcmVxdWVzdCAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbF9pZCk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UKLSAgICBwX2xjYi0+Y3VyX2VjaG9faWQgPSBzaWduYWxfaWQ7Ci0KLSAgdWludDE2X3QgYWNsX2RhdGFfc2l6ZSA9Ci0gICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FjbF9kYXRhX3NpemVfY2xhc3NpYygpOwotICB1aW50MTZfdCBhY2xfcGFja2V0X3NpemUgPQotICAgICAgY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPmdldF9hY2xfcGFja2V0X3NpemVfY2xhc3NpYygpOwotICAvKiBEb24ndCByZXR1cm4gZGF0YSBpZiBpdCBkb2VzIG5vdCBmaXQgaW4gQUNMIGFuZCBMMkNBUCBNVFUgKi8KLSAgbWF4bGVuID0gKEwyQ0FQX0NNRF9CVUZfU0laRSA+IGFjbF9wYWNrZXRfc2l6ZSkKLSAgICAgICAgICAgICAgID8gYWNsX2RhdGFfc2l6ZQotICAgICAgICAgICAgICAgOiAodWludDE2X3QpTDJDQVBfQ01EX0JVRl9TSVpFOwotICBtYXhsZW4gLT0KLSAgICAgICh1aW50MTZfdCkoQlRfSERSX1NJWkUgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsgTDJDQVBfUEtUX09WRVJIRUFEICsKLSAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX09WRVJIRUFEICsgTDJDQVBfRUNIT19SU1BfTEVOKTsKLQotICBpZiAoZGF0YV9sZW4gPiBtYXhsZW4pIGRhdGFfbGVuID0gMDsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCAodWludDE2X3QpKEwyQ0FQX0VDSE9fUlNQX0xFTiArIGRhdGFfbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfRUNIT19SU1AsIHNpZ25hbF9pZCk7Ci0gIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBubyBidWZmZXIgZm9yIGVjaG9fcnNwIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIGlmIChkYXRhX2xlbikgewotICAgIEFSUkFZX1RPX1NUUkVBTShwLCBwX2RhdGEsIGRhdGFfbGVuKTsKLSAgfQotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9zZW5kX3BlZXJfaW5mb19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGFuZCBzZW5kIGFuIEwyQ0FQICJpbmZvIHJlcXVlc3QiIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHBlZXIuCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9pbmZvX3JlcSh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGluZm9fdHlwZSkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIC8qIENyZWF0ZSBhbiBpZGVudGlmaWVyIGZvciB0aGlzIHBhY2tldCAqLwotICBwX2xjYi0+c2lnbmFsX2lkKys7Ci0gIGwyY3VfYWRqX2lkKHBfbGNiKTsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCAyLCBMMkNBUF9DTURfSU5GT19SRVEsIHBfbGNiLT5zaWduYWxfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIkwyQ0FQIC0gbm8gYnVmZmVyIGZvciBpbmZvX3JlcSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEwyQ0FQX1RSQUNFX0VWRU5UKCJsMmN1X3NlbmRfcGVlcl9pbmZvX3JlcTogdHlwZSAweCUwNHgiLCBpbmZvX3R5cGUpOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGluZm9fdHlwZSk7Ci0KLSAgcF9sY2ItPnc0X2luZm9fcnNwID0gdHJ1ZTsKLSAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5pbmZvX3Jlc3BfdGltZXIsIEwyQ0FQX1dBSVRfSU5GT19SU1BfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgIGwyY19pbmZvX3Jlc3BfdGltZXJfdGltZW91dCwgcF9sY2IpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9zZW5kX3BlZXJfaW5mb19yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGFuZCBzZW5kIGFuIEwyQ0FQICJpbmZvIHJlc3BvbnNlIiBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2luZm9fcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1vdGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZm9fdHlwZSkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotICB1aW50MTZfdCBsZW4gPSBMMkNBUF9JTkZPX1JTUF9MRU47Ci0KLSNpZiAoTDJDQVBfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotICBpZiAoKGluZm9fdHlwZSA9PSBMMkNBUF9FWFRFTkRFRF9GRUFUVVJFU19JTkZPX1RZUEUpICYmCi0gICAgICAobDJjYi50ZXN0X2luZm9fcmVzcCAmCi0gICAgICAgKEwyQ0FQX0VYVEZFQV9FTkhfUkVUUkFOUyB8IEwyQ0FQX0VYVEZFQV9TVFJFQU1fTU9ERSB8Ci0gICAgICAgIEwyQ0FQX0VYVEZFQV9OT19DUkMgfCBMMkNBUF9FWFRGRUFfRVhUX0ZMT1dfU1BFQyB8Ci0gICAgICAgIEwyQ0FQX0VYVEZFQV9GSVhFRF9DSE5MUyB8IEwyQ0FQX0VYVEZFQV9FWFRfV0lORE9XIHwKLSAgICAgICAgTDJDQVBfRVhURkVBX1VDRF9SRUNFUFRJT04pKSkKLSNlbHNlCi0gIGlmICgoaW5mb190eXBlID09IEwyQ0FQX0VYVEVOREVEX0ZFQVRVUkVTX0lORk9fVFlQRSkgJiYKLSAgICAgIChMMkNBUF9FWFRGRUFfU1VQUE9SVEVEX01BU0sgJgotICAgICAgIChMMkNBUF9FWFRGRUFfRU5IX1JFVFJBTlMgfCBMMkNBUF9FWFRGRUFfU1RSRUFNX01PREUgfAotICAgICAgICBMMkNBUF9FWFRGRUFfTk9fQ1JDIHwgTDJDQVBfRVhURkVBX0ZJWEVEX0NITkxTIHwKLSAgICAgICAgTDJDQVBfRVhURkVBX1VDRF9SRUNFUFRJT04pKSAhPSAwKQotI2VuZGlmCi0gIHsKLSAgICBsZW4gKz0gTDJDQVBfRVhURU5ERURfRkVBVFVSRVNfQVJSQVlfU0laRTsKLSAgfSBlbHNlIGlmIChpbmZvX3R5cGUgPT0gTDJDQVBfRklYRURfQ0hBTk5FTFNfSU5GT19UWVBFKSB7Ci0gICAgbGVuICs9IEwyQ0FQX0ZJWEVEX0NITkxfQVJSQVlfU0laRTsKLSAgfSBlbHNlIGlmIChpbmZvX3R5cGUgPT0gTDJDQVBfQ09OTkxFU1NfTVRVX0lORk9fVFlQRSkgewotICAgIGxlbiArPSBMMkNBUF9DT05OTEVTU19NVFVfSU5GT19TSVpFOwotICB9Ci0KLSAgcF9idWYgPSBsMmN1X2J1aWxkX2hlYWRlcihwX2xjYiwgbGVuLCBMMkNBUF9DTURfSU5GT19SU1AsIHJlbW90ZV9pZCk7Ci0gIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBubyBidWZmZXIgZm9yIGluZm9fcnNwIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaW5mb190eXBlKTsKLQotI2lmIChMMkNBUF9DT05GT1JNQU5DRV9URVNUSU5HID09IFRSVUUpCi0gIGlmICgoaW5mb190eXBlID09IEwyQ0FQX0VYVEVOREVEX0ZFQVRVUkVTX0lORk9fVFlQRSkgJiYKLSAgICAgIChsMmNiLnRlc3RfaW5mb19yZXNwICYKLSAgICAgICAoTDJDQVBfRVhURkVBX0VOSF9SRVRSQU5TIHwgTDJDQVBfRVhURkVBX1NUUkVBTV9NT0RFIHwKLSAgICAgICAgTDJDQVBfRVhURkVBX1VDRF9SRUNFUFRJT04pKSkKLSNlbHNlCi0gIGlmICgoaW5mb190eXBlID09IEwyQ0FQX0VYVEVOREVEX0ZFQVRVUkVTX0lORk9fVFlQRSkgJiYKLSAgICAgIChMMkNBUF9FWFRGRUFfU1VQUE9SVEVEX01BU0sgJgotICAgICAgIChMMkNBUF9FWFRGRUFfRU5IX1JFVFJBTlMgfCBMMkNBUF9FWFRGRUFfU1RSRUFNX01PREUgfAotICAgICAgICBMMkNBUF9FWFRGRUFfVUNEX1JFQ0VQVElPTikpICE9IDApCi0jZW5kaWYKLSAgewotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9TVUNDRVNTKTsKLSAgICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICAgIC8qIG9wdGlvbmFsIGRhdGEgYXJlIG5vdCBhZGRlZCBmb3Igbm93ICovCi0gICAgICBVSU5UMzJfVE9fU1RSRUFNKHAsIEwyQ0FQX0JMRV9FWFRGRUFfTUFTSyk7Ci0gICAgfSBlbHNlIHsKLSNpZiAoTDJDQVBfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotICAgICAgVUlOVDMyX1RPX1NUUkVBTShwLCBsMmNiLnRlc3RfaW5mb19yZXNwKTsKLSNlbHNlCi0gICAgICBVSU5UMzJfVE9fU1RSRUFNKHAsCi0gICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0VYVEZFQV9TVVBQT1JURURfTUFTSyB8IEwyQ0FQX0VYVEZFQV9GSVhFRF9DSE5MUyk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0gZWxzZSBpZiAoaW5mb190eXBlID09IEwyQ0FQX0ZJWEVEX0NIQU5ORUxTX0lORk9fVFlQRSkgewotICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9TVUNDRVNTKTsKLSAgICBtZW1zZXQocCwgMCwgTDJDQVBfRklYRURfQ0hOTF9BUlJBWV9TSVpFKTsKLQotICAgIHBbMF0gPSBMMkNBUF9GSVhFRF9DSE5MX1NJR19CSVQ7Ci0KLSAgICBpZiAoTDJDQVBfRVhURkVBX1NVUFBPUlRFRF9NQVNLICYgTDJDQVBfRVhURkVBX1VDRF9SRUNFUFRJT04pCi0gICAgICBwWzBdIHw9IEwyQ0FQX0ZJWEVEX0NITkxfQ05DVExFU1NfQklUOwotCi0gICAgewotICAgICAgaW50IHh4OwotCi0gICAgICBmb3IgKHh4ID0gMDsgeHggPCBMMkNBUF9OVU1fRklYRURfQ0hOTFM7IHh4KyspIHsKLSAgICAgICAgLyogU2tpcCBmaXhlZCBjaGFubmVscyBub3QgdXNlZCBvbiBCUi9FRFItQUNMIGxpbmsgKi8KLSAgICAgICAgaWYgKCh4eCA+PSBMMkNBUF9BVFRfQ0lEIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTCkgJiYKLSAgICAgICAgICAgICh4eCA8PSBMMkNBUF9TTVBfQ0lEIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTCkpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGwyY2IuZml4ZWRfcmVnW3h4XS5wTDJDQV9GaXhlZENvbm5fQ2IgIT0gTlVMTCkKLSAgICAgICAgICBwWyh4eCArIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwpIC8gOF0gfD0KLSAgICAgICAgICAgICAgMSA8PCAoKHh4ICsgTDJDQVBfRklSU1RfRklYRURfQ0hOTCkgJSA4KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoaW5mb190eXBlID09IEwyQ0FQX0NPTk5MRVNTX01UVV9JTkZPX1RZUEUpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIEwyQ0FQX0lORk9fUkVTUF9SRVNVTFRfU1VDQ0VTUyk7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTShwLCBMMkNBUF9NVFVfU0laRSk7Ci0gIH0gZWxzZSB7Ci0gICAgVUlOVDE2X1RPX1NUUkVBTSgKLSAgICAgICAgcCwgTDJDQVBfSU5GT19SRVNQX1JFU1VMVF9OT1RfU1VQUE9SVEVEKTsgLyogJ25vdCBzdXBwb3J0ZWQnICovCi0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9lbnF1ZXVlX2NjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgcXVldWUgQ0NCIGJ5IHByaW9yaXR5LiBUaGUgZmlyc3QgQ0NCIGlzIGhpZ2hlc3QgcHJpb3JpdHkgYW5kCi0gKiAgICAgICAgICAgICAgICAgIGlzIHNlcnZlZCBhdCBmaXJzdC4gVGhlIENDQiBpcyBxdWV1ZWQgdG8gYW4gTExDQiBvciBhbiBMQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9lbnF1ZXVlX2NjYih0TDJDX0NDQiogcF9jY2IpIHsKLSAgdEwyQ19DQ0IqIHBfY2NiMTsKLSAgdEwyQ19DQ0JfUSogcF9xID0gTlVMTDsKLQotICAvKiBGaW5kIG91dCB3aGljaCBxdWV1ZSB0aGUgY2hhbm5lbCBpcyBvbgotICAqLwotICBpZiAocF9jY2ItPnBfbGNiICE9IE5VTEwpIHBfcSA9ICZwX2NjYi0+cF9sY2ItPmNjYl9xdWV1ZTsKLQotICBpZiAoKCFwX2NjYi0+aW5fdXNlKSB8fCAocF9xID09IE5VTEwpKSB7Ci0gICAgTDJDQVBfVFJBQ0VfRVJST1IoIiVzOiBDSUQ6IDB4JTA0eCBFUlJPUiBpbl91c2U6ICV1ICBwX2xjYjogJXAiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2NjYi0+aW5fdXNlLCBwX2NjYi0+cF9sY2IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCJsMmN1X2VucXVldWVfY2NiIENJRDogMHglMDR4ICBwcmlvcml0eTogJWQiLAotICAgICAgICAgICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkLCBwX2NjYi0+Y2NiX3ByaW9yaXR5KTsKLQotICAvKiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHdlIGdvIGF0IHRoZSBmcm9udCAqLwotICBpZiAoIXBfcS0+cF9maXJzdF9jY2IpIHsKLSAgICBwX3EtPnBfZmlyc3RfY2NiID0gcF9xLT5wX2xhc3RfY2NiID0gcF9jY2I7Ci0gICAgcF9jY2ItPnBfbmV4dF9jY2IgPSBwX2NjYi0+cF9wcmV2X2NjYiA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcF9jY2IxID0gcF9xLT5wX2ZpcnN0X2NjYjsKLQotICAgIHdoaWxlIChwX2NjYjEgIT0gTlVMTCkgewotICAgICAgLyogSW5zZXJ0IG5ldyBjY2IgYXQgdGhlIGVuZCBvZiB0aGUgc2FtZSBwcmlvcml0eS4gTG93ZXIgbnVtYmVyLCBoaWdoZXIKLSAgICAgICAqIHByaW9yaXR5ICovCi0gICAgICBpZiAocF9jY2ItPmNjYl9wcmlvcml0eSA8IHBfY2NiMS0+Y2NiX3ByaW9yaXR5KSB7Ci0gICAgICAgIC8qIEFyZSB3ZSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgPyAqLwotICAgICAgICBpZiAocF9jY2IxID09IHBfcS0+cF9maXJzdF9jY2IpCi0gICAgICAgICAgcF9xLT5wX2ZpcnN0X2NjYiA9IHBfY2NiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcF9jY2IxLT5wX3ByZXZfY2NiLT5wX25leHRfY2NiID0gcF9jY2I7Ci0KLSAgICAgICAgcF9jY2ItPnBfbmV4dF9jY2IgPSBwX2NjYjE7Ci0gICAgICAgIHBfY2NiLT5wX3ByZXZfY2NiID0gcF9jY2IxLT5wX3ByZXZfY2NiOwotICAgICAgICBwX2NjYjEtPnBfcHJldl9jY2IgPSBwX2NjYjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHBfY2NiMSA9IHBfY2NiMS0+cF9uZXh0X2NjYjsKLSAgICB9Ci0KLSAgICAvKiBJZiB3ZSBhcmUgbG93ZXIgdGhlbiBhbnlvbmUgaW4gdGhlIGxpc3QsIHdlIGdvIGF0IHRoZSBlbmQgKi8KLSAgICBpZiAoIXBfY2NiMSkgewotICAgICAgLyogYWRkIG5ldyBjY2IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLwotICAgICAgcF9xLT5wX2xhc3RfY2NiLT5wX25leHRfY2NiID0gcF9jY2I7Ci0KLSAgICAgIHBfY2NiLT5wX25leHRfY2NiID0gTlVMTDsKLSAgICAgIHBfY2NiLT5wX3ByZXZfY2NiID0gcF9xLT5wX2xhc3RfY2NiOwotICAgICAgcF9xLT5wX2xhc3RfY2NiID0gcF9jY2I7Ci0gICAgfQotICB9Ci0KLSAgLyogQWRkaW5nIENDQiBpbnRvIHJvdW5kIHJvYmluIHNlcnZpY2UgdGFibGUgb2YgaXRzIExDQiAqLwotICBpZiAocF9jY2ItPnBfbGNiICE9IE5VTEwpIHsKLSAgICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoaXMgcHJpb3JpdHkgZ3JvdXAgKi8KLSAgICBpZiAocF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLm51bV9jY2IgPT0gMCkgewotICAgICAgLyogU2V0IHRoZSBmaXJzdCBjaGFubmVsIHRvIHRoaXMgQ0NCICovCi0gICAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ucF9maXJzdF9jY2IgPSBwX2NjYjsKLSAgICAgIC8qIFNldCB0aGUgbmV4dCBzZXJ2aW5nIGNoYW5uZWwgaW4gdGhpcyBncm91cCB0byB0aGlzIENDQiAqLwotICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLnBfc2VydmVfY2NiID0gcF9jY2I7Ci0gICAgICAvKiBJbml0aWFsaXplIHF1b3RhIG9mIHRoaXMgcHJpb3JpdHkgZ3JvdXAgYmFzZWQgb24gaXRzIHByaW9yaXR5ICovCi0gICAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ucXVvdGEgPQotICAgICAgICAgIEwyQ0FQX0dFVF9QUklPUklUWV9RVU9UQShwX2NjYi0+Y2NiX3ByaW9yaXR5KTsKLSAgICB9Ci0gICAgLyogaW5jcmVhc2UgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoaXMgZ3JvdXAgKi8KLSAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ubnVtX2NjYisrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfZGVxdWV1ZV9jY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGRlcXVldWUgQ0NCIGZyb20gYSBxdWV1ZQotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfZGVxdWV1ZV9jY2IodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIHRMMkNfQ0NCX1EqIHBfcSA9IE5VTEw7Ci0KLSAgTDJDQVBfVFJBQ0VfREVCVUcoImwyY3VfZGVxdWV1ZV9jY2IgIENJRDogMHglMDR4IiwgcF9jY2ItPmxvY2FsX2NpZCk7Ci0KLSAgLyogRmluZCBvdXQgd2hpY2ggcXVldWUgdGhlIGNoYW5uZWwgaXMgb24KLSAgKi8KLSAgaWYgKHBfY2NiLT5wX2xjYiAhPSBOVUxMKSBwX3EgPSAmcF9jY2ItPnBfbGNiLT5jY2JfcXVldWU7Ci0KLSAgaWYgKCghcF9jY2ItPmluX3VzZSkgfHwgKHBfcSA9PSBOVUxMKSB8fCAocF9xLT5wX2ZpcnN0X2NjYiA9PSBOVUxMKSkgewotICAgIEwyQ0FQX1RSQUNFX0VSUk9SKAotICAgICAgICAibDJjdV9kZXF1ZXVlX2NjYiAgQ0lEOiAweCUwNHggRVJST1IgaW5fdXNlOiAldSAgcF9sY2I6IDB4JTA4eCAgcF9xOiAiCi0gICAgICAgICIweCUwOHggIHBfcS0+cF9maXJzdF9jY2I6IDB4JTA4eCIsCi0gICAgICAgIHBfY2NiLT5sb2NhbF9jaWQsIHBfY2NiLT5pbl91c2UsIHBfY2NiLT5wX2xjYiwgcF9xLAotICAgICAgICBwX3EgPyBwX3EtPnBfZmlyc3RfY2NiIDogMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogUmVtb3ZpbmcgQ0NCIGZyb20gcm91bmQgcm9iaW4gc2VydmljZSB0YWJsZSBvZiBpdHMgTENCICovCi0gIGlmIChwX2NjYi0+cF9sY2IgIT0gTlVMTCkgewotICAgIC8qIGRlY3JlYXNlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGlzIHByaW9yaXR5IGdyb3VwICovCi0gICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLm51bV9jY2ItLTsKLQotICAgIC8qIGlmIGl0IHdhcyB0aGUgbGFzdCBjaGFubmVsIGluIHRoZSBwcmlvcml0eSBncm91cCAqLwotICAgIGlmIChwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ubnVtX2NjYiA9PSAwKSB7Ci0gICAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ucF9maXJzdF9jY2IgPSBOVUxMOwotICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLnBfc2VydmVfY2NiID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgLyogaWYgaXQgaXMgdGhlIGZpcnN0IGNoYW5uZWwgb2YgdGhpcyBncm91cCAqLwotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+cnJfc2VydltwX2NjYi0+Y2NiX3ByaW9yaXR5XS5wX2ZpcnN0X2NjYiA9PSBwX2NjYikgewotICAgICAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ucF9maXJzdF9jY2IgPQotICAgICAgICAgICAgcF9jY2ItPnBfbmV4dF9jY2I7Ci0gICAgICB9Ci0gICAgICAvKiBpZiBpdCBpcyB0aGUgbmV4dCBzZXJ2aW5nIGNoYW5uZWwgb2YgdGhpcyBncm91cCAqLwotICAgICAgaWYgKHBfY2NiLT5wX2xjYi0+cnJfc2VydltwX2NjYi0+Y2NiX3ByaW9yaXR5XS5wX3NlcnZlX2NjYiA9PSBwX2NjYikgewotICAgICAgICAvKiBzaW1wbHksIHN0YXJ0IHNlcnZpbmcgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbCAqLwotICAgICAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ucF9zZXJ2ZV9jY2IgPQotICAgICAgICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLnBfZmlyc3RfY2NiOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChwX2NjYiA9PSBwX3EtPnBfZmlyc3RfY2NiKSB7Ci0gICAgLyogV2UgYXJlIHJlbW92aW5nIHRoZSBmaXJzdCBpbiBhIHF1ZXVlICovCi0gICAgcF9xLT5wX2ZpcnN0X2NjYiA9IHBfY2NiLT5wX25leHRfY2NiOwotCi0gICAgaWYgKHBfcS0+cF9maXJzdF9jY2IpCi0gICAgICBwX3EtPnBfZmlyc3RfY2NiLT5wX3ByZXZfY2NiID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICBwX3EtPnBfbGFzdF9jY2IgPSBOVUxMOwotICB9IGVsc2UgaWYgKHBfY2NiID09IHBfcS0+cF9sYXN0X2NjYikgewotICAgIC8qIFdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBpbiBhIHF1ZXVlICovCi0gICAgcF9xLT5wX2xhc3RfY2NiID0gcF9jY2ItPnBfcHJldl9jY2I7Ci0gICAgcF9xLT5wX2xhc3RfY2NiLT5wX25leHRfY2NiID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICAvKiBJbiB0aGUgbWlkZGxlIG9mIGEgY2hhaW4uICovCi0gICAgcF9jY2ItPnBfcHJldl9jY2ItPnBfbmV4dF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYjsKLSAgICBwX2NjYi0+cF9uZXh0X2NjYi0+cF9wcmV2X2NjYiA9IHBfY2NiLT5wX3ByZXZfY2NiOwotICB9Ci0KLSAgcF9jY2ItPnBfbmV4dF9jY2IgPSBwX2NjYi0+cF9wcmV2X2NjYiA9IE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfY2hhbmdlX3ByaV9jY2IKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgLQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfY2hhbmdlX3ByaV9jY2IodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0hOTF9QUklPUklUWSBwcmlvcml0eSkgewotICBpZiAocF9jY2ItPmNjYl9wcmlvcml0eSAhPSBwcmlvcml0eSkgewotICAgIC8qIElmIENDQiBpcyBub3QgdGhlIG9ubHkgZ3V5IG9uIHRoZSBxdWV1ZSAqLwotICAgIGlmICgocF9jY2ItPnBfbmV4dF9jY2IgIT0gTlVMTCkgfHwgKHBfY2NiLT5wX3ByZXZfY2NiICE9IE5VTEwpKSB7Ci0gICAgICBMMkNBUF9UUkFDRV9ERUJVRygiVXBkYXRlIENDQiBsaXN0IGluIGxvZ2ljYWwgbGluayIpOwotCi0gICAgICAvKiBSZW1vdmUgQ0NCIGZyb20gcXVldWUgYW5kIHJlLXF1ZXVlIGl0IGF0IG5ldyBwcmlvcml0eSAqLwotICAgICAgbDJjdV9kZXF1ZXVlX2NjYihwX2NjYik7Ci0KLSAgICAgIHBfY2NiLT5jY2JfcHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICAgIGwyY3VfZW5xdWV1ZV9jY2IocF9jY2IpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIElmIENDQiBpcyB0aGUgb25seSBndXkgb24gdGhlIHF1ZXVlLCBubyBuZWVkIHRvIHJlLWVucXVldWUgKi8KLSAgICAgIC8qIHVwZGF0ZSBvbmx5IHJvdW5kIHJvYmluIHNlcnZpY2UgZGF0YSAqLwotICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLm51bV9jY2IgPSAwOwotICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLnBfZmlyc3RfY2NiID0gTlVMTDsKLSAgICAgIHBfY2NiLT5wX2xjYi0+cnJfc2VydltwX2NjYi0+Y2NiX3ByaW9yaXR5XS5wX3NlcnZlX2NjYiA9IE5VTEw7Ci0KLSAgICAgIHBfY2NiLT5jY2JfcHJpb3JpdHkgPSBwcmlvcml0eTsKLQotICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLnBfZmlyc3RfY2NiID0gcF9jY2I7Ci0gICAgICBwX2NjYi0+cF9sY2ItPnJyX3NlcnZbcF9jY2ItPmNjYl9wcmlvcml0eV0ucF9zZXJ2ZV9jY2IgPSBwX2NjYjsKLSAgICAgIHBfY2NiLT5wX2xjYi0+cnJfc2VydltwX2NjYi0+Y2NiX3ByaW9yaXR5XS5xdW90YSA9Ci0gICAgICAgICAgTDJDQVBfR0VUX1BSSU9SSVRZX1FVT1RBKHBfY2NiLT5jY2JfcHJpb3JpdHkpOwotICAgICAgcF9jY2ItPnBfbGNiLT5ycl9zZXJ2W3BfY2NiLT5jY2JfcHJpb3JpdHldLm51bV9jY2IgPSAxOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9hbGxvY2F0ZV9jY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgQ2hhbm5lbCBDb250cm9sIEJsb2NrIGFuZAotICogICAgICAgICAgICAgICAgICBhdHRhY2hlcyBpdCB0byBhIGxpbmsgY29udHJvbCBibG9jay4gVGhlIGxvY2FsIENJRAotICogICAgICAgICAgICAgICAgICBpcyBhbHNvIGFzc2lnbmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBDQ0IsIG9yIE5VTEwgaWYgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10TDJDX0NDQiogbDJjdV9hbGxvY2F0ZV9jY2IodEwyQ19MQ0IqIHBfbGNiLCB1aW50MTZfdCBjaWQpIHsKLSAgTE9HX0RFQlVHKCJjaWQgMHglMDR4IiwgY2lkKTsKLSAgaWYgKCFsMmNiLnBfZnJlZV9jY2JfZmlyc3QpIHsKLSAgICBMT0dfRVJST1IoIkZpcnN0IGZyZWUgY2NiIGlzIG51bGwgZm9yIGNpZCAweCUwNHgiLCBjaWQpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHRMMkNfQ0NCKiBwX2NjYjsKLSAgLyogSWYgYSBDSUQgd2FzIHBhc3NlZCBpbiwgdXNlIHRoYXQsIGVsc2UgdGFrZSB0aGUgZmlyc3QgZnJlZSBvbmUgKi8KLSAgaWYgKGNpZCA9PSAwKSB7Ci0gICAgcF9jY2IgPSBsMmNiLnBfZnJlZV9jY2JfZmlyc3Q7Ci0gICAgbDJjYi5wX2ZyZWVfY2NiX2ZpcnN0ID0gcF9jY2ItPnBfbmV4dF9jY2I7Ci0gIH0gZWxzZSB7Ci0gICAgdEwyQ19DQ0IqIHBfcHJldiA9IG51bGxwdHI7Ci0KLSAgICBwX2NjYiA9ICZsMmNiLmNjYl9wb29sW2NpZCAtIEwyQ0FQX0JBU0VfQVBQTF9DSURdOwotCi0gICAgaWYgKHBfY2NiID09IGwyY2IucF9mcmVlX2NjYl9maXJzdCkgewotICAgICAgbDJjYi5wX2ZyZWVfY2NiX2ZpcnN0ID0gcF9jY2ItPnBfbmV4dF9jY2I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAocF9wcmV2ID0gbDJjYi5wX2ZyZWVfY2NiX2ZpcnN0OyBwX3ByZXYgIT0gbnVsbHB0cjsKLSAgICAgICAgICAgcF9wcmV2ID0gcF9wcmV2LT5wX25leHRfY2NiKSB7Ci0gICAgICAgIGlmIChwX3ByZXYtPnBfbmV4dF9jY2IgPT0gcF9jY2IpIHsKLSAgICAgICAgICBwX3ByZXYtPnBfbmV4dF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYjsKLQotICAgICAgICAgIGlmIChwX2NjYiA9PSBsMmNiLnBfZnJlZV9jY2JfbGFzdCkgewotICAgICAgICAgICAgbDJjYi5wX2ZyZWVfY2NiX2xhc3QgPSBwX3ByZXY7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwX3ByZXYgPT0gbnVsbHB0cikgewotICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBmaW5kIENDQiBmb3IgQ0lEIDB4JTA0eCBpbiB0aGUgZnJlZSBsaXN0IiwgY2lkKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcF9jY2ItPnBfbmV4dF9jY2IgPSBwX2NjYi0+cF9wcmV2X2NjYiA9IG51bGxwdHI7Ci0KLSAgcF9jY2ItPmluX3VzZSA9IHRydWU7Ci0KLSAgLyogR2V0IGEgQ0lEIGZvciB0aGUgY29ubmVjdGlvbiAqLwotICBwX2NjYi0+bG9jYWxfY2lkID0gTDJDQVBfQkFTRV9BUFBMX0NJRCArICh1aW50MTZfdCkocF9jY2IgLSBsMmNiLmNjYl9wb29sKTsKLQotICBwX2NjYi0+cF9sY2IgPSBwX2xjYjsKLSAgcF9jY2ItPnBfcmNiID0gbnVsbHB0cjsKLQotICAvKiBTZXQgcHJpb3JpdHkgdGhlbiBpbnNlcnQgY2NiIGludG8gTENCIHF1ZXVlIChpZiB3ZSBoYXZlIGFuIExDQikgKi8KLSAgcF9jY2ItPmNjYl9wcmlvcml0eSA9IEwyQ0FQX0NITkxfUFJJT1JJVFlfTE9XOwotCi0gIGlmIChwX2xjYikgbDJjdV9lbnF1ZXVlX2NjYihwX2NjYik7Ci0KLSAgLyogUHV0IGluIGRlZmF1bHQgdmFsdWVzIGZvciBjb25maWd1cmF0aW9uICovCi0gIG1lbXNldCgmcF9jY2ItPm91cl9jZmcsIDAsIHNpemVvZih0TDJDQVBfQ0ZHX0lORk8pKTsKLSAgbWVtc2V0KCZwX2NjYi0+cGVlcl9jZmcsIDAsIHNpemVvZih0TDJDQVBfQ0ZHX0lORk8pKTsKLQotICAvKiBQdXQgaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIGxvY2FsL3BlZXIgY29uZmlndXJhdGlvbnMgKi8KLSAgcF9jY2ItPm91cl9jZmcuZmx1c2hfdG8gPSBwX2NjYi0+cGVlcl9jZmcuZmx1c2hfdG8gPSBMMkNBUF9OT19BVVRPTUFUSUNfRkxVU0g7Ci0gIHBfY2NiLT5vdXJfY2ZnLm10dSA9IHBfY2NiLT5wZWVyX2NmZy5tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKLSAgcF9jY2ItPm91cl9jZmcucW9zLnNlcnZpY2VfdHlwZSA9IHBfY2NiLT5wZWVyX2NmZy5xb3Muc2VydmljZV90eXBlID0KLSAgICAgIEwyQ0FQX0RFRkFVTFRfU0VSVl9UWVBFOwotICBwX2NjYi0+b3VyX2NmZy5xb3MudG9rZW5fcmF0ZSA9IHBfY2NiLT5wZWVyX2NmZy5xb3MudG9rZW5fcmF0ZSA9Ci0gICAgICBMMkNBUF9ERUZBVUxUX1RPS0VOX1JBVEU7Ci0gIHBfY2NiLT5vdXJfY2ZnLnFvcy50b2tlbl9idWNrZXRfc2l6ZSA9IHBfY2NiLT5wZWVyX2NmZy5xb3MudG9rZW5fYnVja2V0X3NpemUgPQotICAgICAgTDJDQVBfREVGQVVMVF9CVUNLRVRfU0laRTsKLSAgcF9jY2ItPm91cl9jZmcucW9zLnBlYWtfYmFuZHdpZHRoID0gcF9jY2ItPnBlZXJfY2ZnLnFvcy5wZWFrX2JhbmR3aWR0aCA9Ci0gICAgICBMMkNBUF9ERUZBVUxUX1BFQUtfQkFORFdJRFRIOwotICBwX2NjYi0+b3VyX2NmZy5xb3MubGF0ZW5jeSA9IHBfY2NiLT5wZWVyX2NmZy5xb3MubGF0ZW5jeSA9Ci0gICAgICBMMkNBUF9ERUZBVUxUX0xBVEVOQ1k7Ci0gIHBfY2NiLT5vdXJfY2ZnLnFvcy5kZWxheV92YXJpYXRpb24gPSBwX2NjYi0+cGVlcl9jZmcucW9zLmRlbGF5X3ZhcmlhdGlvbiA9Ci0gICAgICBMMkNBUF9ERUZBVUxUX0RFTEFZOwotCi0gIHBfY2NiLT5wZWVyX2NmZ19hbHJlYWR5X3JlamVjdGVkID0gZmFsc2U7Ci0gIHBfY2NiLT5mY3JfY2ZnX3RyaWVzID0gTDJDQVBfTUFYX0ZDUl9DRkdfVFJJRVM7Ci0KLSAgYWxhcm1fZnJlZShwX2NjYi0+ZmNyYi5hY2tfdGltZXIpOwotICBwX2NjYi0+ZmNyYi5hY2tfdGltZXIgPSBhbGFybV9uZXcoImwyY19mY3JiLmFja190aW1lciIpOwotCi0gIC8qICBDU1A0MDg2MzkgRml4OiBXaGVuIEwyQ0FQIHNlbmQgYW1wIG1vdmUgY2hhbm5lbCByZXF1ZXN0IG9yIHJlY2VpdmUKLSAgICAqIEwyQ0VWVF9BTVBfTU9WRV9SRVEgZG8gZm9sbG93aW5nIHNlcXVlbmNlLiBTZW5kIGNoYW5uZWwgbW92ZQotICAgICogcmVxdWVzdCAtPiBTdG9wIHJldHJhbnMvbW9uaXRvciB0aW1lciAtPiBDaGFuZ2UgY2hhbm5lbCBzdGF0ZSB0bwotICAgKiBDU1RfQU1QX01PVklORy4gKi8KLSAgYWxhcm1fZnJlZShwX2NjYi0+ZmNyYi5tb25fcmV0cmFuc190aW1lcik7Ci0gIHBfY2NiLT5mY3JiLm1vbl9yZXRyYW5zX3RpbWVyID0gYWxhcm1fbmV3KCJsMmNfZmNyYi5tb25fcmV0cmFuc190aW1lciIpOwotCi0gIHBfY2NiLT5tYXhfcnhfbXR1ID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtCi0gICAgICAgICAgICAgICAgICAgICAgKEwyQ0FQX01JTl9PRkZTRVQgKyBMMkNBUF9TRFVfTEVOX09GRlNFVCArIEwyQ0FQX0ZDU19MRU4pOwotICBwX2NjYi0+dHhfbXBzID0gQlRfREVGQVVMVF9CVUZGRVJfU0laRSAtIDMyOwotCi0gIHBfY2NiLT54bWl0X2hvbGRfcSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIHBfY2NiLT5mY3JiLnNyZWpfcmN2X2hvbGRfcSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIHBfY2NiLT5mY3JiLnJldHJhbnNfcSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIHBfY2NiLT5mY3JiLndhaXRpbmdfZm9yX2Fja19xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLQotICBwX2NjYi0+Y29uZ19zZW50ID0gZmFsc2U7Ci0gIHBfY2NiLT5idWZmX3F1b3RhID0gMjsgLyogVGhpcyBnZXRzIHNldCBhZnRlciBjb25maWcgKi8KLQotICAvKiBJZiBDQ0Igd2FzIHJlc2VydmVkIENvbmZpZ19Eb25lIGNhbiBhbHJlYWR5IGhhdmUgc29tZSB2YWx1ZSAqLwotICBpZiAoY2lkID09IDApIHsKLSAgICBwX2NjYi0+Y29uZmlnX2RvbmUgPSAwOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiY2lkIDB4JTA0eCBjb25maWdfZG9uZToweCV4IiwgY2lkLCBwX2NjYi0+Y29uZmlnX2RvbmUpOwotICB9Ci0KLSAgcF9jY2ItPmNobmxfc3RhdGUgPSBDU1RfQ0xPU0VEOwotICBwX2NjYi0+ZmxhZ3MgPSAwOwotICBwX2NjYi0+dHhfZGF0YV9yYXRlID0gTDJDQVBfQ0hOTF9EQVRBX1JBVEVfTE9XOwotICBwX2NjYi0+cnhfZGF0YV9yYXRlID0gTDJDQVBfQ0hOTF9EQVRBX1JBVEVfTE9XOwotCi0gIHBfY2NiLT5pc19mbHVzaGFibGUgPSBmYWxzZTsKLSAgcF9jY2ItPmVjb2MgPSBmYWxzZTsKLQotICBhbGFybV9mcmVlKHBfY2NiLT5sMmNfY2NiX3RpbWVyKTsKLSAgcF9jY2ItPmwyY19jY2JfdGltZXIgPSBhbGFybV9uZXcoImwyYy5sMmNfY2NiX3RpbWVyIik7Ci0KLSAgbDJjX2xpbmtfYWRqdXN0X2NobmxfYWxsb2NhdGlvbigpOwotCi0gIHJldHVybiBwX2NjYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc3RhcnRfcG9zdF9ib25kX3RpbWVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgQUNMIExpbmsgaW5hY3Rpdml0eSB0aW1lciBhZnRlcgotICogICAgICAgICAgICAgICAgICBkZWRpY2F0ZWQgYm9uZGluZwotICogICAgICAgICAgICAgICAgICBUaGlzIHRpbWVyIGNhbiBiZSBsb25nZXIgdGhhbiB0aGUgbm9ybWFsIGxpbmsgaW5hY3Rpdml0eQotICogICAgICAgICAgICAgICAgICB0aW1lciBmb3Igc29tZSBwbGF0Zm9ybXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sICAtIHRydWUgaWYgaWRsZSB0aW1lciBzdGFydGVkIG9yIGRpc2Nvbm5lY3QgaW5pdGlhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlcmUncyBvbmUgb3IgbW9yZSBwZW5kaW5nIENDQidzIGV4aXN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgbDJjdV9zdGFydF9wb3N0X2JvbmRfdGltZXIodWludDE2X3QgaGFuZGxlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiID0gbDJjdV9maW5kX2xjYl9ieV9oYW5kbGUoaGFuZGxlKTsKLQotICBpZiAoIXBfbGNiKSByZXR1cm4gKHRydWUpOwotCi0gIHBfbGNiLT5SZXNldEJvbmRpbmcoKTsKLQotICAvKiBPbmx5IHN0YXJ0IHRpbWVyIGlmIG5vIGNvbnRyb2wgYmxvY2tzIGFsbG9jYXRlZCAqLwotICBpZiAocF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYiAhPSBOVUxMKSByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBJZiBubyBjaGFubmVscyBvbiB0aGUgY29ubmVjdGlvbiwgc3RhcnQgaWRsZSB0aW1lb3V0ICovCi0gIGlmICgocF9sY2ItPmxpbmtfc3RhdGUgPT0gTFNUX0NPTk5FQ1RFRCkgfHwKLSAgICAgIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfQ09OTkVDVElORykgfHwKLSAgICAgIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfRElTQ09OTkVDVElORykpIHsKLSAgICB1aW50NjRfdCB0aW1lb3V0X21zID0gTDJDQVBfQk9ORElOR19USU1FT1VUICogMTAwMDsKLQotICAgIGlmIChwX2xjYi0+aWRsZV90aW1lb3V0ID09IDApIHsKLSAgICAgIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHBfbGNiLT5IYW5kbGUoKSwgSENJX0VSUl9QRUVSX1VTRVIpOwotICAgICAgcF9sY2ItPmxpbmtfc3RhdGUgPSBMU1RfRElTQ09OTkVDVElORzsKLSAgICAgIHRpbWVvdXRfbXMgPSBMMkNBUF9MSU5LX0RJU0NPTk5FQ1RfVElNRU9VVF9NUzsKLSAgICB9Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfbGNiLT5sMmNfbGNiX3RpbWVyLCB0aW1lb3V0X21zLCBsMmNfbGNiX3RpbWVyX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfbGNiKTsKLSAgICByZXR1cm4gKHRydWUpOwotICB9Ci0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3JlbGVhc2VfY2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGEgQ2hhbm5lbCBDb250cm9sIEJsb2NrLiBUaGUgdGltZXIKLSAqICAgICAgICAgICAgICAgICAgaXMgc3RvcHBlZCwgYW55IGF0dGFjaGVkIGJ1ZmZlcnMgZnJlZWQsIGFuZCB0aGUgQ0NCIGlzCi0gKiAgICAgICAgICAgICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgbGluayBjb250cm9sIGJsb2NrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcmVsZWFzZV9jY2IodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIHRMMkNfTENCKiBwX2xjYiA9IHBfY2NiLT5wX2xjYjsKLSAgdEwyQ19SQ0IqIHBfcmNiID0gcF9jY2ItPnBfcmNiOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCJsMmN1X3JlbGVhc2VfY2NiOiBjaWQgMHglMDR4ICBpbl91c2U6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgcF9jY2ItPmxvY2FsX2NpZCwgcF9jY2ItPmluX3VzZSk7Ci0KLSAgLyogSWYgYWxyZWFkeSByZWxlYXNlZCwgY291bGQgYmUgcmFjZSBjb25kaXRpb24gKi8KLSAgaWYgKCFwX2NjYi0+aW5fdXNlKSByZXR1cm47Ci0KLSAgYnRzbm9vcF9nZXRfaW50ZXJmYWNlKCktPmNsZWFyX2wyY2FwX2FsbG93bGlzdCgKLSAgICAgIHBfbGNiLT5IYW5kbGUoKSwgcF9jY2ItPmxvY2FsX2NpZCwgcF9jY2ItPnJlbW90ZV9jaWQpOwotCi0gIGlmIChwX3JjYiAmJiAocF9yY2ItPnBzbSAhPSBwX3JjYi0+cmVhbF9wc20pKSB7Ci0gICAgQlRNX1NlY0NsclNlcnZpY2VCeVBzbShwX3JjYi0+cHNtKTsKLSAgfQotCi0gIC8qIEZyZWUgdGhlIHRpbWVyICovCi0gIGFsYXJtX2ZyZWUocF9jY2ItPmwyY19jY2JfdGltZXIpOwotICBwX2NjYi0+bDJjX2NjYl90aW1lciA9IE5VTEw7Ci0KLSAgZml4ZWRfcXVldWVfZnJlZShwX2NjYi0+eG1pdF9ob2xkX3EsIG9zaV9mcmVlKTsKLSAgcF9jY2ItPnhtaXRfaG9sZF9xID0gTlVMTDsKLQotICBsMmNfZmNyX2NsZWFudXAocF9jY2IpOwotCi0gIC8qIENoYW5uZWwgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBhbnkgTENCIGlmIGl0IHdhcyBqdXN0IHByZS1yZXNlcnZlZCAqLwotICBpZiAoKHBfbGNiKSAmJiAoKHBfY2NiLT5sb2NhbF9jaWQgPj0gTDJDQVBfQkFTRV9BUFBMX0NJRCkpKSB7Ci0gICAgbDJjdV9kZXF1ZXVlX2NjYihwX2NjYik7Ci0KLSAgICAvKiBEZWxpbmsgdGhlIENDQiBmcm9tIHRoZSBMQ0IgKi8KLSAgICBwX2NjYi0+cF9sY2IgPSBOVUxMOwotICB9Ci0KLSAgLyogUHV0IHRoZSBDQ0IgYmFjayBvbiB0aGUgZnJlZSBwb29sICovCi0gIGlmICghbDJjYi5wX2ZyZWVfY2NiX2ZpcnN0KSB7Ci0gICAgbDJjYi5wX2ZyZWVfY2NiX2ZpcnN0ID0gcF9jY2I7Ci0gICAgbDJjYi5wX2ZyZWVfY2NiX2xhc3QgPSBwX2NjYjsKLSAgICBwX2NjYi0+cF9uZXh0X2NjYiA9IE5VTEw7Ci0gICAgcF9jY2ItPnBfcHJldl9jY2IgPSBOVUxMOwotICB9IGVsc2UgewotICAgIHBfY2NiLT5wX25leHRfY2NiID0gTlVMTDsKLSAgICBwX2NjYi0+cF9wcmV2X2NjYiA9IGwyY2IucF9mcmVlX2NjYl9sYXN0OwotICAgIGwyY2IucF9mcmVlX2NjYl9sYXN0LT5wX25leHRfY2NiID0gcF9jY2I7Ci0gICAgbDJjYi5wX2ZyZWVfY2NiX2xhc3QgPSBwX2NjYjsKLSAgfQotCi0gIC8qIEZsYWcgYXMgbm90IGluIHVzZSAqLwotICBwX2NjYi0+aW5fdXNlID0gZmFsc2U7Ci0KLSAgLyogSWYgbm8gY2hhbm5lbHMgb24gdGhlIGNvbm5lY3Rpb24sIHN0YXJ0IGlkbGUgdGltZW91dCAqLwotICBpZiAoKHBfbGNiKSAmJiBwX2xjYi0+aW5fdXNlKSB7Ci0gICAgaWYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNURUQpIHsKLSAgICAgIGlmICghcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYikgewotICAgICAgICAvLyBDbG9zaW5nIGEgc2VjdXJpdHkgY2hhbm5lbCBvbiBMRSBkZXZpY2Ugc2hvdWxkIG5vdCBzdGFydCBjb25uZWN0aW9uCi0gICAgICAgIC8vIHRpbWVvdXQKLSAgICAgICAgaWYgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFICYmCi0gICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkID09IEwyQ0FQX1NNUF9DSUQpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGwyY3Vfbm9fZHluYW1pY19jY2JzKHBfbGNiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIExpbmsgaXMgc3RpbGwgYWN0aXZlLCBhZGp1c3QgY2hhbm5lbCBxdW90YXMuICovCi0gICAgICAgIGwyY19saW5rX2FkanVzdF9jaG5sX2FsbG9jYXRpb24oKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBfbGNiLT5saW5rX3N0YXRlID09IExTVF9DT05ORUNUSU5HKSB7Ci0gICAgICBpZiAoIXBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2IpIHsKLSAgICAgICAgaWYgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFICYmCi0gICAgICAgICAgICBwX2NjYi0+bG9jYWxfY2lkID09IEwyQ0FQX0FUVF9DSUQpIHsKLSAgICAgICAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCIlcyAtIGRpc2Nvbm5lY3RpbmcgdGhlIExFIGxpbmsiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgbDJjdV9ub19keW5hbWljX2NjYnMocF9sY2IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2ZpbmRfY2NiX2J5X3JlbW90ZV9jaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgdGhyb3VnaCBhbGwgYWN0aXZlIENDQnMgb24gYSBsaW5rIGZvciBhIG1hdGNoIGJhc2VkCi0gKiAgICAgICAgICAgICAgICAgIG9uIHRoZSByZW1vdGUgQ0lELgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBtYXRjaGVkIENDQiwgb3IgTlVMTCBpZiBubyBtYXRjaAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10TDJDX0NDQiogbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVtb3RlX2NpZCkgewotICB0TDJDX0NDQiogcF9jY2I7Ci0KLSAgLyogSWYgTENCIGlzIE5VTEwsIGxvb2sgdGhyb3VnaCBhbGwgYWN0aXZlIGxpbmtzICovCi0gIGlmICghcF9sY2IpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7IHBfY2NiID0gcF9jY2ItPnBfbmV4dF9jY2IpCi0gICAgICBpZiAoKHBfY2NiLT5pbl91c2UpICYmIChwX2NjYi0+cmVtb3RlX2NpZCA9PSByZW1vdGVfY2lkKSkgcmV0dXJuIChwX2NjYik7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBtYXRjaCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9hbGxvY2F0ZV9yY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIExvb2sgdGhyb3VnaCB0aGUgUmVnaXN0cmF0aW9uIENvbnRyb2wgQmxvY2tzIGZvciBhIGZyZWUKLSAqICAgICAgICAgICAgICAgICAgb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgUkNCIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRMMkNfUkNCKiBsMmN1X2FsbG9jYXRlX3JjYih1aW50MTZfdCBwc20pIHsKLSAgdEwyQ19SQ0IqIHBfcmNiID0gJmwyY2IucmNiX3Bvb2xbMF07Ci0gIHVpbnQxNl90IHh4OwotCi0gIGZvciAoeHggPSAwOyB4eCA8IE1BWF9MMkNBUF9DTElFTlRTOyB4eCsrLCBwX3JjYisrKSB7Ci0gICAgaWYgKCFwX3JjYi0+aW5fdXNlKSB7Ci0gICAgICBwX3JjYi0+aW5fdXNlID0gdHJ1ZTsKLSAgICAgIHBfcmNiLT5wc20gPSBwc207Ci0gICAgICByZXR1cm4gKHBfcmNiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBmcmVlIFJDQiBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9hbGxvY2F0ZV9ibGVfcmNiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIHRocm91Z2ggdGhlIEJMRSBSZWdpc3RyYXRpb24gQ29udHJvbCBCbG9ja3MgZm9yIGEgZnJlZQotICogICAgICAgICAgICAgICAgICBvbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBCTEUgUkNCIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRMMkNfUkNCKiBsMmN1X2FsbG9jYXRlX2JsZV9yY2IodWludDE2X3QgcHNtKSB7Ci0gIHRMMkNfUkNCKiBwX3JjYiA9ICZsMmNiLmJsZV9yY2JfcG9vbFswXTsKLSAgdWludDE2X3QgeHg7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQkxFX01BWF9MMkNBUF9DTElFTlRTOyB4eCsrLCBwX3JjYisrKSB7Ci0gICAgaWYgKCFwX3JjYi0+aW5fdXNlKSB7Ci0gICAgICBwX3JjYi0+aW5fdXNlID0gdHJ1ZTsKLSAgICAgIHBfcmNiLT5wc20gPSBwc207Ci0gICAgICByZXR1cm4gKHBfcmNiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBmcmVlIFJDQiBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9yZWxlYXNlX3JjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTWFyayBhbiBSQ0IgYXMgbm8gbG9uZ2V0IGluIHVzZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcmVsZWFzZV9yY2IodEwyQ19SQ0IqIHBfcmNiKSB7Ci0gIHBfcmNiLT5pbl91c2UgPSBmYWxzZTsKLSAgcF9yY2ItPnBzbSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3JlbGVhc2VfYmxlX3JjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTWFyayBhbiBMRSBSQ0IgYXMgbm8gbG9uZ2VyIGluIHVzZQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcmVsZWFzZV9ibGVfcmNiKHRMMkNfUkNCKiBwX3JjYikgewotICBMMkNBX0ZyZWVMZVBTTShwX3JjYi0+cHNtKTsKLSAgcF9yY2ItPmluX3VzZSA9IGZhbHNlOwotICBwX3JjYi0+cHNtID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfZGlzY29ubmVjdF9jaG5sCi0gKgotICogRGVzY3JpcHRpb24gICAgICBEaXNjb25uZWN0IGEgY2hhbm5lbC4gVHlwaWNhbGx5LCB0aGlzIGlzIGR1ZSB0byBlaXRoZXIKLSAqICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGEgYmFkIGNvbmZpZ3VyYXRpb24sICBiYWQgcGFja2V0IG9yIG1heF9yZXRyaWVzCi0gKiAgICAgICAgICAgICAgICAgIGV4cGlyaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfZGlzY29ubmVjdF9jaG5sKHRMMkNfQ0NCKiBwX2NjYikgewotICB1aW50MTZfdCBsb2NhbF9jaWQgPSBwX2NjYi0+bG9jYWxfY2lkOwotCi0gIGlmIChsb2NhbF9jaWQgPj0gTDJDQVBfQkFTRV9BUFBMX0NJRCkgewotICAgIHRMMkNBX0RJU0NPTk5FQ1RfSU5EX0NCKiBwX2Rpc2NfY2IgPQotICAgICAgICBwX2NjYi0+cF9yY2ItPmFwaS5wTDJDQV9EaXNjb25uZWN0SW5kX0NiOwotCi0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiTDJDQVAgLSBkaXNjb25uZWN0X2NobmwgQ0lEOiAweCUwNHgiLCBsb2NhbF9jaWQpOwotCi0gICAgbDJjdV9zZW5kX3BlZXJfZGlzY19yZXEocF9jY2IpOwotCi0gICAgbDJjdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0KLSAgICAoKnBfZGlzY19jYikobG9jYWxfY2lkLCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZmFpbHVyZSBvbiB0aGUgQU1QIGNoYW5uZWwsIHByb2JhYmx5IG5lZWQgdG8gZGlzY29ubmVjdCBBQ0wgKi8KLSAgICBMMkNBUF9UUkFDRV9FUlJPUigiTDJDQVAgLSBkaXNjb25uZWN0X2NobmwgQ0lEOiAweCUwNHggSWdub3JlZCIsIGxvY2FsX2NpZCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfZmluZF9yY2JfYnlfcHNtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIHRocm91Z2ggdGhlIFJlZ2lzdHJhdGlvbiBDb250cm9sIEJsb2NrcyB0byBzZWUgaWYKLSAqICAgICAgICAgICAgICAgICAgYW55b25lIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIHRoZSBQU00gaW4gcXVlc3Rpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIFJDQiBvciBOVUxMIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10TDJDX1JDQiogbDJjdV9maW5kX3JjYl9ieV9wc20odWludDE2X3QgcHNtKSB7Ci0gIHRMMkNfUkNCKiBwX3JjYiA9ICZsMmNiLnJjYl9wb29sWzBdOwotICB1aW50MTZfdCB4eDsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBNQVhfTDJDQVBfQ0xJRU5UUzsgeHgrKywgcF9yY2IrKykgewotICAgIGlmICgocF9yY2ItPmluX3VzZSkgJiYgKHBfcmNiLT5wc20gPT0gcHNtKSkgcmV0dXJuIChwX3JjYik7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBtYXRjaCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9maW5kX2JsZV9yY2JfYnlfcHNtCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIHRocm91Z2ggdGhlIEJMRSBSZWdpc3RyYXRpb24gQ29udHJvbCBCbG9ja3MgdG8gc2VlIGlmCi0gKiAgICAgICAgICAgICAgICAgIGFueW9uZSByZWdpc3RlcmVkIHRvIGhhbmRsZSB0aGUgUFNNIGluIHF1ZXN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBCTEUgUkNCIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRMMkNfUkNCKiBsMmN1X2ZpbmRfYmxlX3JjYl9ieV9wc20odWludDE2X3QgcHNtKSB7Ci0gIHRMMkNfUkNCKiBwX3JjYiA9ICZsMmNiLmJsZV9yY2JfcG9vbFswXTsKLSAgdWludDE2X3QgeHg7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgQkxFX01BWF9MMkNBUF9DTElFTlRTOyB4eCsrLCBwX3JjYisrKSB7Ci0gICAgaWYgKChwX3JjYi0+aW5fdXNlKSAmJiAocF9yY2ItPnBzbSA9PSBwc20pKSByZXR1cm4gKHBfcmNiKTsKLSAgfQotCi0gIC8qIElmIGhlcmUsIG5vIG1hdGNoIGZvdW5kICovCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBwZWVyIHNlbmRzIHVzIGEgImNvbmZpZwotICogICAgICAgICAgICAgICAgICByZXF1ZXN0IiBtZXNzYWdlLiBJdCBleHRyYWN0cyB0aGUgY29uZmlndXJhdGlvbiBvZiBpbnRlcmVzdAotICogICAgICAgICAgICAgICAgICBhbmQgc2F2ZXMgaXQgaW4gdGhlIENDQi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIE5vdGU6ICBOZWdvdGlhdGlvbiBvZiB0aGUgRkNSIGNoYW5uZWwgdHlwZSBpcyBoYW5kbGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5LCBhbGwgb3RoZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHVwcGVyIGxheWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdWludDhfdCAtIEwyQ0FQX1BFRVJfQ0ZHX09LIGlmIHBhc3NlZCB0byB1cHBlciBsYXllciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX1BFRVJfQ0ZHX1VOQUNDRVBUQUJMRSBpZiBhdXRvbWF0aWNhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZGVkIHRvIGJlY2F1c2UgcGFyYW1ldGVycyBhcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bm5hY2NlcHRhYmxlIGZyb20gYSBzcGVjaWZpY2F0aW9uIHBvaW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygdmlldy4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX1BFRVJfQ0ZHX0RJU0NPTk5FQ1QgaWYgbm8gY29tcGF0aWJsZSBjaGFubmVsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXMgYmV0d2VlbiB0aGUgdHdvIGRldmljZXMsIGFuZCBzaGFsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNsb3NlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcmVxKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBib29sIG10dV9vayA9IHRydWU7Ci0gIGJvb2wgcW9zX3R5cGVfb2sgPSB0cnVlOwotICBib29sIGZsdXNoX3RvX29rID0gdHJ1ZTsKLSAgYm9vbCBmY3Jfb2sgPSB0cnVlOwotICB1aW50OF90IGZjcl9zdGF0dXM7Ci0gIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUgPQotICAgICAgc3RkOjptYXg8dWludDE2X3Q+KEwyQ0FQX01JTl9NVFUsIHBfY2NiLT5wX3JjYi0+cmVxdWlyZWRfcmVtb3RlX210dSk7Ci0KLSAgLyogSWdub3JlIEZDUiBwYXJhbWV0ZXJzIGZvciBiYXNpYyBtb2RlICovCi0gIGlmICghcF9jZmctPmZjcl9wcmVzZW50KSBwX2NmZy0+ZmNyLm1vZGUgPSBMMkNBUF9GQ1JfQkFTSUNfTU9ERTsKLQotICBpZiAoIXBfY2ZnLT5tdHVfcHJlc2VudCAmJiByZXF1aXJlZF9yZW1vdGVfbXR1ID4gTDJDQVBfREVGQVVMVF9NVFUpIHsKLSAgICAvLyBXZSByZWplY3QgaWYgd2UgaGF2ZSBhIE1UVSByZXF1aXJlbWVudCBoaWdoZXIgdGhhbiBkZWZhdWx0IE1UVQotICAgIHBfY2ZnLT5tdHUgPSByZXF1aXJlZF9yZW1vdGVfbXR1OwotICAgIG10dV9vayA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHBfY2ZnLT5tdHVfcHJlc2VudCkgewotICAgIC8qIE1ha2Ugc3VyZSBNVFUgaXMgYXQgbGVhc3QgdGhlIG1pbmltdW0gKi8KLSAgICBpZiAocF9jZmctPm10dSA+PSByZXF1aXJlZF9yZW1vdGVfbXR1KSB7Ci0gICAgICAvKiBJbiBiYXNpYyBtb2RlLCBsaW1pdCB0aGUgTVRVIHRvIG91ciBidWZmZXIgc2l6ZSAqLwotICAgICAgaWYgKCghcF9jZmctPmZjcl9wcmVzZW50KSAmJiAocF9jZmctPm10dSA+IEwyQ0FQX01UVV9TSVpFKSkKLSAgICAgICAgcF9jZmctPm10dSA9IEwyQ0FQX01UVV9TSVpFOwotCi0gICAgICAvKiBTYXZlIHRoZSBhY2NlcHRlZCB2YWx1ZSBpbiBjYXNlIG9mIHJlbmVnb3RpYXRpb24gKi8KLSAgICAgIHBfY2NiLT5wZWVyX2NmZy5tdHUgPSBwX2NmZy0+bXR1OwotICAgICAgcF9jY2ItPnBlZXJfY2ZnLm10dV9wcmVzZW50ID0gdHJ1ZTsKLSAgICB9IGVsc2UgLyogSWxsZWdhbCBNVFUgdmFsdWUgKi8KLSAgICB7Ci0gICAgICBwX2NmZy0+bXR1ID0gcmVxdWlyZWRfcmVtb3RlX210dTsKLSAgICAgIG10dV9vayA9IGZhbHNlOwotICAgIH0KLSAgfQotICAvKiBSZWxvYWQgbXR1IGZyb20gYSBwcmV2aW91c2x5IGFjY2VwdGVkIGNvbmZpZyByZXF1ZXN0ICovCi0gIGVsc2UgaWYgKHBfY2NiLT5wZWVyX2NmZy5tdHVfcHJlc2VudCAmJiAhKHBfY2NiLT5jb25maWdfZG9uZSAmIElCX0NGR19ET05FKSkgewotICAgIHBfY2ZnLT5tdHVfcHJlc2VudCA9IHRydWU7Ci0gICAgcF9jZmctPm10dSA9IHBfY2NiLT5wZWVyX2NmZy5tdHU7Ci0gIH0KLQotICAvKiBWZXJpZnkgdGhhdCB0aGUgZmx1c2ggdGltZW91dCBpcyBhIHZhbGlkIHZhbHVlICgwIGlzIGlsbGVnYWwpICovCi0gIGlmIChwX2NmZy0+Zmx1c2hfdG9fcHJlc2VudCkgewotICAgIGlmICghcF9jZmctPmZsdXNoX3RvKSB7Ci0gICAgICBwX2NmZy0+Zmx1c2hfdG8gPSAweEZGRkY7IC8qIEluZmluaXRlIHJldHJhbnNtaXNzaW9ucyAoc3BlYyBkZWZhdWx0KSAqLwotICAgICAgZmx1c2hfdG9fb2sgPSBmYWxzZTsKLSAgICB9IGVsc2UgLyogU2F2ZSB0aGUgYWNjZXB0ZWQgdmFsdWUgaW4gY2FzZSBvZiByZW5lZ290aWF0aW9uICovCi0gICAgewotICAgICAgcF9jY2ItPnBlZXJfY2ZnLmZsdXNoX3RvX3ByZXNlbnQgPSB0cnVlOwotICAgICAgcF9jY2ItPnBlZXJfY2ZnLmZsdXNoX3RvID0gcF9jZmctPmZsdXNoX3RvOwotICAgIH0KLSAgfQotICAvKiBSZWxvYWQgZmx1c2hfdG8gZnJvbSBhIHByZXZpb3VzbHkgYWNjZXB0ZWQgY29uZmlnIHJlcXVlc3QgKi8KLSAgZWxzZSBpZiAocF9jY2ItPnBlZXJfY2ZnLmZsdXNoX3RvX3ByZXNlbnQgJiYKLSAgICAgICAgICAgIShwX2NjYi0+Y29uZmlnX2RvbmUgJiBJQl9DRkdfRE9ORSkpIHsKLSAgICBwX2NmZy0+Zmx1c2hfdG9fcHJlc2VudCA9IHRydWU7Ci0gICAgcF9jZmctPmZsdXNoX3RvID0gcF9jY2ItPnBlZXJfY2ZnLmZsdXNoX3RvOwotICB9Ci0KLSAgLyogU2F2ZSB0aGUgUU9TIHNldHRpbmdzIHRoZSB0aGUgcGVlciBpcyB1c2luZyAqLwotICBpZiAocF9jZmctPnFvc19wcmVzZW50KSB7Ci0gICAgLyogTWFrZSBzdXJlIHNlcnZpY2UgdHlwZSBpcyBub3QgYSByZXNlcnZlZCB2YWx1ZTsgb3RoZXJ3aXNlIGxldCB1cHBlcgotICAgICAgIGxheWVyIGRlY2lkZSBpZiBhY2NlcHRhYmxlCi0gICAgKi8KLSAgICBpZiAocF9jZmctPnFvcy5zZXJ2aWNlX3R5cGUgPD0gU1ZDX1RZUEVfR1VBUkFOVEVFRCkgewotICAgICAgcF9jY2ItPnBlZXJfY2ZnLnFvcyA9IHBfY2ZnLT5xb3M7Ci0gICAgICBwX2NjYi0+cGVlcl9jZmcucW9zX3ByZXNlbnQgPSB0cnVlOwotICAgIH0gZWxzZSAvKiBJbGxlZ2FsIHNlcnZpY2UgdHlwZSB2YWx1ZSAqLwotICAgIHsKLSAgICAgIHBfY2ZnLT5xb3Muc2VydmljZV90eXBlID0gU1ZDX1RZUEVfQkVTVF9FRkZPUlQ7Ci0gICAgICBxb3NfdHlwZV9vayA9IGZhbHNlOwotICAgIH0KLSAgfQotICAvKiBSZWxvYWQgUU9TIGZyb20gYSBwcmV2aW91c2x5IGFjY2VwdGVkIGNvbmZpZyByZXF1ZXN0ICovCi0gIGVsc2UgaWYgKHBfY2NiLT5wZWVyX2NmZy5xb3NfcHJlc2VudCAmJiAhKHBfY2NiLT5jb25maWdfZG9uZSAmIElCX0NGR19ET05FKSkgewotICAgIHBfY2ZnLT5xb3NfcHJlc2VudCA9IHRydWU7Ci0gICAgcF9jZmctPnFvcyA9IHBfY2NiLT5wZWVyX2NmZy5xb3M7Ci0gIH0KLQotICBmY3Jfc3RhdHVzID0gbDJjX2Zjcl9wcm9jZXNzX3BlZXJfY2ZnX3JlcShwX2NjYiwgcF9jZmcpOwotICBpZiAoZmNyX3N0YXR1cyA9PSBMMkNBUF9QRUVSX0NGR19ESVNDT05ORUNUKSB7Ci0gICAgLyogTm90aWZ5IGNhbGxlciB0byBkaXNjb25uZWN0IHRoZSBjaGFubmVsIChpbmNvbXBhdGlibGUgbW9kZXMpICovCi0gICAgcF9jZmctPnJlc3VsdCA9IEwyQ0FQX0NGR19GQUlMRURfTk9fUkVBU09OOwotICAgIHBfY2ZnLT5tdHVfcHJlc2VudCA9IHBfY2ZnLT5xb3NfcHJlc2VudCA9IHBfY2ZnLT5mbHVzaF90b19wcmVzZW50ID0gMDsKLQotICAgIHJldHVybiAoTDJDQVBfUEVFUl9DRkdfRElTQ09OTkVDVCk7Ci0gIH0KLQotICBmY3Jfb2sgPSAoZmNyX3N0YXR1cyA9PSBMMkNBUF9QRUVSX0NGR19PSyk7Ci0KLSAgLyogUmV0dXJuIGFueSB1bmFjY2VwdGFibGUgcGFyYW1ldGVycyAqLwotICBpZiAobXR1X29rICYmIGZsdXNoX3RvX29rICYmIHFvc190eXBlX29rICYmIGZjcl9vaykgewotICAgIGwyY3VfYWRqdXN0X291dF9tcHMocF9jY2IpOwotICAgIHJldHVybiAoTDJDQVBfUEVFUl9DRkdfT0spOwotICB9IGVsc2UgewotICAgIHBfY2ZnLT5yZXN1bHQgPSBMMkNBUF9DRkdfVU5BQ0NFUFRBQkxFX1BBUkFNUzsKLQotICAgIGlmIChtdHVfb2spIHBfY2ZnLT5tdHVfcHJlc2VudCA9IGZhbHNlOwotICAgIGlmIChmbHVzaF90b19vaykgcF9jZmctPmZsdXNoX3RvX3ByZXNlbnQgPSBmYWxzZTsKLSAgICBpZiAocW9zX3R5cGVfb2spIHBfY2ZnLT5xb3NfcHJlc2VudCA9IGZhbHNlOwotICAgIGlmIChmY3Jfb2spIHBfY2ZnLT5mY3JfcHJlc2VudCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIChMMkNBUF9QRUVSX0NGR19VTkFDQ0VQVEFCTEUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3Byb2Nlc3NfcGVlcl9jZmdfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBwZWVyIHNlbmRzIHVzIGEgImNvbmZpZwotICogICAgICAgICAgICAgICAgICByZXNwb25zZSIgbWVzc2FnZS4gSXQgZXh0cmFjdHMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgaW50ZXJlc3QKLSAqICAgICAgICAgICAgICAgICAgYW5kIHNhdmVzIGl0IGluIHRoZSBDQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9wcm9jZXNzX3BlZXJfY2ZnX3JzcCh0TDJDX0NDQiogcF9jY2IsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgLyogSWYgd2Ugd2FudGVkIFFvUyBhbmQgdGhlIHBlZXIgc2VuZHMgdXMgYSBwb3NpdGl2ZSByZXNwb25zZSB3aXRoIFFvUywgdXNlCi0gICAqIGhpcyB2YWx1ZXMgKi8KLSAgaWYgKChwX2NmZy0+cW9zX3ByZXNlbnQpICYmIChwX2NjYi0+b3VyX2NmZy5xb3NfcHJlc2VudCkpCi0gICAgcF9jY2ItPm91cl9jZmcucW9zID0gcF9jZmctPnFvczsKLQotICBpZiAocF9jZmctPmZjcl9wcmVzZW50KSB7Ci0gICAgLyogU2F2ZSB0aGUgcmV0cmFuc21pc3Npb24gYW5kIG1vbml0b3IgdGltZW91dCB2YWx1ZXMgKi8KLSAgICBpZiAocF9jZmctPmZjci5tb2RlID09IEwyQ0FQX0ZDUl9FUlRNX01PREUpIHsKLSAgICAgIHBfY2NiLT5wZWVyX2NmZy5mY3IucnRyYW5zX3RvdXQgPSBwX2NmZy0+ZmNyLnJ0cmFuc190b3V0OwotICAgICAgcF9jY2ItPnBlZXJfY2ZnLmZjci5tb25fdG91dCA9IHBfY2ZnLT5mY3IubW9uX3RvdXQ7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBtYXggbnVtYmVyIG9mIHBhY2tldHMgZm9yIHdoaWNoIHdlIGNhbiBkZWxheSBzZW5kaW5nIGFuIGFjawotICAgICAqLwotICAgIGlmIChwX2NmZy0+ZmNyLnR4X3dpbl9zeiA8IHBfY2NiLT5vdXJfY2ZnLmZjci50eF93aW5fc3opCi0gICAgICBwX2NjYi0+ZmNyYi5tYXhfaGVsZF9hY2tzID0gcF9jZmctPmZjci50eF93aW5fc3ogLyAzOwotICAgIGVsc2UKLSAgICAgIHBfY2NiLT5mY3JiLm1heF9oZWxkX2Fja3MgPSBwX2NjYi0+b3VyX2NmZy5mY3IudHhfd2luX3N6IC8gMzsKLQotICAgIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgICAibDJjdV9wcm9jZXNzX3BlZXJfY2ZnX3JzcCgpOiBwZWVyIHR4X3dpbl9zejogJWQsIG91ciB0eF93aW5fc3o6ICVkLCAiCi0gICAgICAgICJtYXhfaGVsZF9hY2tzOiAlZCIsCi0gICAgICAgIHBfY2ZnLT5mY3IudHhfd2luX3N6LCBwX2NjYi0+b3VyX2NmZy5mY3IudHhfd2luX3N6LAotICAgICAgICBwX2NjYi0+ZmNyYi5tYXhfaGVsZF9hY2tzKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9wcm9jZXNzX291cl9jZmdfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHNlbmQgYSAiY29uZmlnIHJlcXVlc3QiCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuIEl0IGV4dHJhY3RzIHRoZSBjb25maWd1cmF0aW9uIG9mIGludGVyZXN0IGFuZCBzYXZlcwotICogICAgICAgICAgICAgICAgICBpdCBpbiB0aGUgQ0NCLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcHJvY2Vzc19vdXJfY2ZnX3JlcSh0TDJDX0NDQiogcF9jY2IsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgLyogU2F2ZSB0aGUgUU9TIHNldHRpbmdzIHdlIGFyZSB1c2luZyBmb3IgdHJhbnNtaXQgKi8KLSAgaWYgKHBfY2ZnLT5xb3NfcHJlc2VudCkgewotICAgIHBfY2NiLT5vdXJfY2ZnLnFvc19wcmVzZW50ID0gdHJ1ZTsKLSAgICBwX2NjYi0+b3VyX2NmZy5xb3MgPSBwX2NmZy0+cW9zOwotICB9Ci0KLSAgaWYgKHBfY2ZnLT5mY3JfcHJlc2VudCkgewotICAgIC8qIE92ZXJyaWRlIEZDUiBvcHRpb25zIGlmIGF0dGVtcHRpbmcgc3RyZWFtaW5nIG9yIGJhc2ljICovCi0gICAgaWYgKHBfY2ZnLT5mY3IubW9kZSA9PSBMMkNBUF9GQ1JfQkFTSUNfTU9ERSkKLSAgICAgIG1lbXNldCgmcF9jZmctPmZjciwgMCwgc2l6ZW9mKHRMMkNBUF9GQ1JfT1BUUykpOwotICAgIGVsc2UgewotICAgICAgLyogT24gQlIvRURSLCB0aW1lciB2YWx1ZXMgYXJlIHplcm8gaW4gY29uZmlnIHJlcXVlc3QgKi8KLSAgICAgIC8qIE9uIGNsYXNzIDIgQU1QLCB0aW1lciB2YWx1ZSBpbiBjb25maWcgcmVxdWVzdCBzaGFsbCBiZSBub24tMCBwcm9jZXNzaW5nCi0gICAgICAgKiB0aW1lICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgdGltZXIgdmFsdWUgaW4gY29uZmlnIHJlc3BvbnNlIHNoYWxsIGJlIGdyZWF0ZXIgdGhhbgotICAgICAgICogcmVjZWl2ZWQgcHJvY2Vzc2luZyB0aW1lICovCi0gICAgICBwX2NmZy0+ZmNyLm1vbl90b3V0ID0gcF9jZmctPmZjci5ydHJhbnNfdG91dCA9IDA7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSB0aHJlc2hvbGQgdG8gc2VuZCBhY2tzIChtYXkgYmUgdXBkYXRlZCBpbiB0aGUgY2ZnIHJlc3BvbnNlKSAqLwotICAgIHBfY2NiLT5mY3JiLm1heF9oZWxkX2Fja3MgPSBwX2NmZy0+ZmNyLnR4X3dpbl9zeiAvIDM7Ci0KLSAgICAvKiBJbmNsdWRlIEZDUyBvcHRpb24gb25seSBpZiBwZWVyIGNhbiBoYW5kbGUgaXQgKi8KLSAgICBpZiAoKHBfY2NiLT5wX2xjYi0+cGVlcl9leHRfZmVhICYgTDJDQVBfRVhURkVBX05PX0NSQykgPT0gMCkgewotICAgICAgcF9jZmctPmZjc19wcmVzZW50ID0gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHBfY2ZnLT5mY3IubW9kZSA9IEwyQ0FQX0ZDUl9CQVNJQ19NT0RFOwotICB9Ci0KLSAgcF9jY2ItPm91cl9jZmcuZmNyLm1vZGUgPSBwX2NmZy0+ZmNyLm1vZGU7Ci0gIHBfY2NiLT5vdXJfY2ZnLmZjcl9wcmVzZW50ID0gcF9jZmctPmZjcl9wcmVzZW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9wcm9jZXNzX291cl9jZmdfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHNlbmQgdGhlIHBlZXIgYSAiY29uZmlnCi0gKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIiBtZXNzYWdlLiBJdCBleHRyYWN0cyB0aGUgY29uZmlndXJhdGlvbiBvZiBpbnRlcmVzdAotICogICAgICAgICAgICAgICAgICBhbmQgc2F2ZXMgaXQgaW4gdGhlIENDQi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3Byb2Nlc3Nfb3VyX2NmZ19yc3AodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIC8qIElmIHBlZXIgd2FudHMgUW9TLCB3ZSBhcmUgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhIHBvc2l0aXZlCi0gICAqIHJlc3BvbnNlICovCi0gIGlmICgocF9jZmctPnFvc19wcmVzZW50KSAmJiAocF9jY2ItPnBlZXJfY2ZnLnFvc19wcmVzZW50KSkKLSAgICBwX2NjYi0+cGVlcl9jZmcucW9zID0gcF9jZmctPnFvczsKLSAgZWxzZQotICAgIHBfY2ZnLT5xb3NfcHJlc2VudCA9IGZhbHNlOwotCi0gIGwyY19mY3JfYWRqX291cl9yc3Bfb3B0aW9ucyhwX2NjYiwgcF9jZmcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9kZXZpY2VfcmVzZXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVzZXQgb2YgdGhlIGRldmljZSBpcwotICogICAgICAgICAgICAgICAgICBjb21wbGV0ZWQuICBGb3IgYWxsIGFjdGl2ZSBjb25uZWN0aW9uIHNpbXVsYXRlIEhDSV9ESVNDCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9kZXZpY2VfcmVzZXQodm9pZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQgeHg7Ci0gIHRMMkNfTENCKiBwX2xjYiA9ICZsMmNiLmxjYl9wb29sWzBdOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IE1BWF9MMkNBUF9MSU5LUzsgeHgrKywgcF9sY2IrKykgewotICAgIGlmICgocF9sY2ItPmluX3VzZSkgJiYgKHBfbGNiLT5IYW5kbGUoKSAhPSBIQ0lfSU5WQUxJRF9IQU5ETEUpKSB7Ci0gICAgICBsMmNfbGlua19oY2lfZGlzY19jb21wKHBfbGNiLT5IYW5kbGUoKSwgSENJX0VSUl9VTkRFRklORUQpOwotICAgIH0KLSAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhbiBhY2wgY29ubmVjdGlvbiB0byBhIExFIGRldmljZS4KLSAqIFJldHVybnMgdHJ1ZSBpZiByZXF1ZXN0IHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuICovCi1ib29sIGwyY3VfY3JlYXRlX2Nvbm5fbGUodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIGlmICghY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX2JsZSgpKSByZXR1cm4gZmFsc2U7Ci0gIHBfbGNiLT50cmFuc3BvcnQgPSBCVF9UUkFOU1BPUlRfTEU7Ci0gIHJldHVybiAobDJjYmxlX2NyZWF0ZV9jb25uKHBfbGNiKSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIGFuIGFjbCBjb25uZWN0aW9uIHRvIGEgQ2xhc3NpYyBkZXZpY2UgdmlhIEhDSS4gKi8KLXZvaWQgbDJjdV9jcmVhdGVfY29ubl9icl9lZHIodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIGNvbnN0IGJvb2wgY29udHJvbGxlcl9zdXBwb3J0c19yb2xlX3N3aXRjaCA9Ci0gICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+c3VwcG9ydHNfcm9sZV9zd2l0Y2goKTsKLQotICAvKiBXaGlsZSBjcmVhdGluZyBhIG5ldyBjbGFzc2ljIGNvbm5lY3Rpb24sIGNoZWNrIGNoZWNrIGFsbCB0aGUgb3RoZXIKLSAgICogYWN0aXZlIGNvbm5lY3Rpb25zIHdoZXJlIHdlIGFyZSBub3QgU0NPIG5vciBjZW50cmFsLgotICAgKiBJZiBvdXIgY29udHJvbGxlciBzdXBwb3J0cyByb2xlIHN3aXRjaGluZywgdHJ5IHN3aXRjaGluZwotICAgKiByb2xlcyBiYWNrIHRvIENFTlRSQUwgb24gdGhvc2UgY29ubmVjdGlvbnMuCi0gICAqLwotICB0TDJDX0xDQiogcF9sY2JfY3VyID0gJmwyY2IubGNiX3Bvb2xbMF07Ci0gIGZvciAodWludDhfdCB4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwX2xjYl9jdXIrKykgewotICAgIGlmIChwX2xjYl9jdXIgPT0gcF9sY2IpIGNvbnRpbnVlOwotICAgIGlmICghcF9sY2JfY3VyLT5pbl91c2UpIGNvbnRpbnVlOwotICAgIGlmIChCVE1fSXNTY29BY3RpdmVCeUJkYWRkcihwX2xjYl9jdXItPnJlbW90ZV9iZF9hZGRyKSkgewotICAgICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIiVzIENlbnRyYWwgcGVyaXBoZXJhbCBzd2l0Y2ggbm90IGFsbG93ZWQgd2hlbiBTQ08gYWN0aXZlIiwgX19mdW5jX18pOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChwX2xjYi0+SXNMaW5rUm9sZUNlbnRyYWwoKSkgY29udGludWU7Ci0gICAgLyogVGhlIExNUF9zd2l0Y2hfcmVxIHNoYWxsIGJlIHNlbnQgb25seSBpZiB0aGUgQUNMIGxvZ2ljYWwgdHJhbnNwb3J0Ci0gICAgICAgaXMgaW4gYWN0aXZlIG1vZGUsIHdoZW4gZW5jcnlwdGlvbiBpcyBkaXNhYmxlZCwgYW5kIGFsbCBzeW5jaHJvbm91cwotICAgICAgIGxvZ2ljYWwgdHJhbnNwb3J0cyBvbiB0aGUgc2FtZSBwaHlzaWNhbCBsaW5rIGFyZSBkaXNhYmxlZC4iICovCi0KLSAgICAvKjRfMV9UT0RPIGNoZWNrICBpZiBidG1fY2IuZGV2Y2IubG9jYWxfZmVhdHVyZXMgdG8gYmUgdXNlZCBpbnN0ZWFkICovCi0gICAgaWYgKGNvbnRyb2xsZXJfc3VwcG9ydHNfcm9sZV9zd2l0Y2gpIHsKLSAgICAgIC8qIG1hcmsgdGhpcyBsY2Igd2FpdGluZyBmb3Igc3dpdGNoIHRvIGJlIGNvbXBsZXRlZCBhbmQKLSAgICAgICAgIHN0YXJ0IHN3aXRjaCBvbiB0aGUgb3RoZXIgb25lICovCi0gICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9DT05ORUNUSU5HX1dBSVRfU1dJVENIOwotICAgICAgcF9sY2ItPlNldExpbmtSb2xlQXNDZW50cmFsKCk7Ci0KLSAgICAgIGlmIChCVE1fU3dpdGNoUm9sZVRvQ2VudHJhbChwX2xjYl9jdXItPnJlbW90ZV9iZF9hZGRyKSA9PQotICAgICAgICAgIEJUTV9DTURfU1RBUlRFRCkgewotICAgICAgICBhbGFybV9zZXRfb25fbWxvb3AocF9sY2ItPmwyY19sY2JfdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9MSU5LX1JPTEVfU1dJVENIX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsMmNfbGNiX3RpbWVyX3RpbWVvdXQsIHBfbGNiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9DT05ORUNUSU5HOwotICBsMmN1X2NyZWF0ZV9jb25uX2FmdGVyX3N3aXRjaChwX2xjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2dldF9udW1faGlfcHJpb3JpdHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdldHMgdGhlIG51bWJlciBvZiBoaWdoIHByaW9yaXR5IGNoYW5uZWxzLgotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBsMmN1X2dldF9udW1faGlfcHJpb3JpdHkodm9pZCkgewotICB1aW50OF90IG5vX2hpID0gMDsKLSAgaW50IHh4OwotICB0TDJDX0xDQiogcF9sY2IgPSAmbDJjYi5sY2JfcG9vbFswXTsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBNQVhfTDJDQVBfTElOS1M7IHh4KyssIHBfbGNiKyspIHsKLSAgICBpZiAoKHBfbGNiLT5pbl91c2UpICYmIChwX2xjYi0+YWNsX3ByaW9yaXR5ID09IEwyQ0FQX1BSSU9SSVRZX0hJR0gpKSB7Ci0gICAgICBub19oaSsrOwotICAgIH0KLSAgfQotICByZXR1cm4gbm9faGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2NyZWF0ZV9jb25uX2FmdGVyX3N3aXRjaAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjb250aW51ZXMgYSBjb25uZWN0aW9uIGNyZWF0aW9uIHBvc3NpYmx5IGFmdGVyCi0gKiAgICAgICAgICAgICAgICAgIGEgcm9sZSBzd2l0Y2guCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9jcmVhdGVfY29ubl9hZnRlcl9zd2l0Y2godEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIGNvbnN0IGJvb2wgdGhlcmVfYXJlX2hpZ2hfcHJpb3JpdHlfY2hhbm5lbHMgPQotICAgICAgKGwyY3VfZ2V0X251bV9oaV9wcmlvcml0eSgpID4gMCk7Ci0KLSAgYWNsX2NyZWF0ZV9jbGFzc2ljX2Nvbm5lY3Rpb24ocF9sY2ItPnJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZV9hcmVfaGlnaF9wcmlvcml0eV9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9sY2ItPklzQm9uZGluZygpKTsKLQotICBhbGFybV9zZXRfb25fbWxvb3AocF9sY2ItPmwyY19sY2JfdGltZXIsIEwyQ0FQX0xJTktfQ09OTkVDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgbDJjX2xjYl90aW1lcl90aW1lb3V0LCBwX2xjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2ZpbmRfbGNiX2J5X3N0YXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIHRocm91Z2ggYWxsIGFjdGl2ZSBMQ0JzIGZvciBhIG1hdGNoIGJhc2VkIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBMQ0Igc3RhdGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIGZpcnN0IG1hdGNoZWQgTENCLCBvciBOVUxMIGlmIG5vIG1hdGNoCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRMMkNfTENCKiBsMmN1X2ZpbmRfbGNiX2J5X3N0YXRlKHRMMkNfTElOS19TVEFURSBzdGF0ZSkgewotICB1aW50MTZfdCBpOwotICB0TDJDX0xDQiogcF9sY2IgPSAmbDJjYi5sY2JfcG9vbFswXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0wyQ0FQX0xJTktTOyBpKyssIHBfbGNiKyspIHsKLSAgICBpZiAoKHBfbGNiLT5pbl91c2UpICYmIChwX2xjYi0+bGlua19zdGF0ZSA9PSBzdGF0ZSkpIHsKLSAgICAgIHJldHVybiAocF9sY2IpOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGhlcmUsIG5vIG1hdGNoIGZvdW5kICovCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2xjYl9kaXNjb25uZWN0aW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBPbiBlYWNoIGFjdGl2ZSBsY2IsIGNoZWNrIGlmIHRoZSBsY2IgaXMgaW4gZGlzY29ubmVjdGluZwotICogICAgICAgICAgICAgICAgICBzdGF0ZSwgb3IgaWYgdGhlcmUgYXJlIG5vIGNjYidzIG9uIHRoZSBsY2IgKGltcGx5aW5nCi0gICAgICAgICAgICAgICAgICAgIGlkbGUgdGltZW91dCBpcyBydW5uaW5nKSwgb3IgaWYgbGFzdCBjY2Igb24gdGhlIGxpbmsKLSAgICAgICAgICAgICAgICAgICAgaXMgaW4gZGlzY29ubmVjdGluZyBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYW55IG9mIGFib3ZlIGNvbmRpdGlvbnMgbWV0LCBmYWxzZSBvdGhlcndpc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBsMmN1X2xjYl9kaXNjb25uZWN0aW5nKHZvaWQpIHsKLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB0TDJDX0NDQiogcF9jY2I7Ci0gIHVpbnQxNl90IGk7Ci0gIGJvb2wgc3RhdHVzID0gZmFsc2U7Ci0KLSAgcF9sY2IgPSAmbDJjYi5sY2JfcG9vbFswXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0wyQ0FQX0xJTktTOyBpKyssIHBfbGNiKyspIHsKLSAgICBpZiAocF9sY2ItPmluX3VzZSkgewotICAgICAgLyogbm8gY2NicyBvbiBsY2IsIG9yIGxjYiBpcyBpbiBkaXNjb25uZWN0aW5nIHN0YXRlICovCi0gICAgICBpZiAoKCFwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiKSB8fAotICAgICAgICAgIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfRElTQ09OTkVDVElORykpIHsKLSAgICAgICAgc3RhdHVzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvKiBvbmx5IG9uZSBjY2IgbGVmdCBvbiBsY2IgKi8KLSAgICAgIGVsc2UgaWYgKHBfbGNiLT5jY2JfcXVldWUucF9maXJzdF9jY2IgPT0gcF9sY2ItPmNjYl9xdWV1ZS5wX2xhc3RfY2NiKSB7Ci0gICAgICAgIHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsKLQotICAgICAgICBpZiAoKHBfY2NiLT5pbl91c2UpICYmCi0gICAgICAgICAgICAoKHBfY2NiLT5jaG5sX3N0YXRlID09IENTVF9XNF9MMkNBUF9ESVNDT05ORUNUX1JTUCkgfHwKLSAgICAgICAgICAgICAocF9jY2ItPmNobmxfc3RhdGUgPT0gQ1NUX1c0X0wyQ0FfRElTQ09OTkVDVF9SU1ApKSkgewotICAgICAgICAgIHN0YXR1cyA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2V0X2FjbF9wcmlvcml0eQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0cyB0aGUgdHJhbnNtaXNzaW9uIHByaW9yaXR5IGZvciBhIGNoYW5uZWwuCi0gKiAgICAgICAgICAgICAgICAgIChGb3IgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvbmx5IHR3byB2YWx1ZXMgYXJlIHZhbGlkLgotICogICAgICAgICAgICAgICAgICBMMkNBUF9QUklPUklUWV9OT1JNQUwgYW5kIEwyQ0FQX1BSSU9SSVRZX0hJR0gpLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhIHZhbGlkIGNoYW5uZWwsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib29sIGwyY3Vfc2V0X2FjbF9wcmlvcml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0TDJDQVBfUFJJT1JJVFkgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2V0X2FmdGVyX3JzKSB7Ci0gIHRMMkNfTENCKiBwX2xjYjsKLSAgdWludDhfdCogcHA7Ci0gIHVpbnQ4X3QgY29tbWFuZFtIQ0lfQlJDTV9BQ0xfUFJJT1JJVFlfUEFSQU1fU0laRV07Ci0gIHVpbnQ4X3QgdnNfcGFyYW07Ci0KLSAgQVBQTF9UUkFDRV9FVkVOVCgiU0VUIEFDTCBQUklPUklUWSAlZCIsIHByaW9yaXR5KTsKLQotICAvKiBGaW5kIHRoZSBsaW5rIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBhY2wgY2hhbm5lbCAqLwotICBwX2xjYiA9IGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihiZF9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgaWYgKHBfbGNiID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJMMkNBUCAtIG5vIExDQiBmb3IgTDJDQV9TZXRBY2xQcmlvcml0eSIpOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgaWYgKGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYnRfdmVyc2lvbigpLT5tYW51ZmFjdHVyZXIgPT0KLSAgICAgIExNUF9DT01QSURfQlJPQURDT00pIHsKLSAgICAvKiBDYWxsZWQgZnJvbSBhYm92ZSBMMkNBUCB0aHJvdWdoIEFQSTsgc2VuZCBWU0MgaWYgY2hhbmdlZCAqLwotICAgIGlmICgoIXJlc2V0X2FmdGVyX3JzICYmIChwcmlvcml0eSAhPSBwX2xjYi0+YWNsX3ByaW9yaXR5KSkgfHwKLSAgICAgICAgLyogQ2FsbGVkIGJlY2F1c2Ugb2YgYSBjZW50cmFsL3BlcmlwaGVyYWwgcm9sZSBzd2l0Y2g7IGlmIGhpZ2ggcmVzZW5kCi0gICAgICAgICAgIFZTQyAqLwotICAgICAgICAocmVzZXRfYWZ0ZXJfcnMgJiYgcF9sY2ItPmFjbF9wcmlvcml0eSA9PSBMMkNBUF9QUklPUklUWV9ISUdIKSkgewotICAgICAgcHAgPSBjb21tYW5kOwotCi0gICAgICB2c19wYXJhbSA9IChwcmlvcml0eSA9PSBMMkNBUF9QUklPUklUWV9ISUdIKSA/IEhDSV9CUkNNX0FDTF9QUklPUklUWV9ISUdICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEhDSV9CUkNNX0FDTF9QUklPUklUWV9MT1c7Ci0KLSAgICAgIFVJTlQxNl9UT19TVFJFQU0ocHAsIHBfbGNiLT5IYW5kbGUoKSk7Ci0gICAgICBVSU5UOF9UT19TVFJFQU0ocHAsIHZzX3BhcmFtKTsKLQotICAgICAgQlRNX1ZlbmRvclNwZWNpZmljQ29tbWFuZChIQ0lfQlJDTV9TRVRfQUNMX1BSSU9SSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0lfQlJDTV9BQ0xfUFJJT1JJVFlfUEFSQU1fU0laRSwgY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotICB9Ci0KLSAgLyogQWRqdXN0IGxtcCBidWZmZXIgYWxsb2NhdGlvbiBmb3IgdGhpcyBjaGFubmVsIGlmIHByaW9yaXR5IGNoYW5nZWQgKi8KLSAgaWYgKHBfbGNiLT5hY2xfcHJpb3JpdHkgIT0gcHJpb3JpdHkpIHsKLSAgICBwX2xjYi0+YWNsX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgbDJjX2xpbmtfYWRqdXN0X2FsbG9jYXRpb24oKTsKLSAgfQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NldF9ub25fZmx1c2hhYmxlX3BiZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgc2V0IEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFIGlmIGNvbnRyb2xsZXIgc3Vwb29ydHMKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NldF9ub25fZmx1c2hhYmxlX3BiZihib29sIGlzX3N1cHBvcnRlZCkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoaXNfc3VwcG9ydGVkKQotICAgIGwyY2Iubm9uX2ZsdXNoYWJsZV9wYmYgPQotICAgICAgICAoTDJDQVBfUEtUX1NUQVJUX05PTl9GTFVTSEFCTEUgPDwgTDJDQVBfUEtUX1RZUEVfU0hJRlQpOwotICBlbHNlCi0gICAgbDJjYi5ub25fZmx1c2hhYmxlX3BiZiA9IChMMkNBUF9QS1RfU1RBUlQgPDwgTDJDQVBfUEtUX1RZUEVfU0hJRlQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9yZXN1Ym1pdF9wZW5kaW5nX3NlY19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcmVxdWlyZWQgc2VjdXJpdHkgcHJvY2VkdXJlcwotICogICAgICAgICAgICAgICAgICBhcmUgY29tcGxldGVkIGFuZCBhbnkgcGVuZGluZyByZXF1ZXN0cyBjYW4gYmUgcmUtc3VibWl0dGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcmVzdWJtaXRfcGVuZGluZ19zZWNfcmVxKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRhKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2dkX2wyY2FwX2VuYWJsZWQoKSkgewotICAgIC8vIEdEIEwyY2FwIHdpbGwgZW5mb3JjZSBzZWN1cml0eSB3aGVuIGNvbmRpdGlvbiBjaGFuZ2VkCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEwyQ19MQ0IqIHBfbGNiOwotICB0TDJDX0NDQiogcF9jY2I7Ci0gIHRMMkNfQ0NCKiBwX25leHRfY2NiOwotICBpbnQgeHg7Ci0KLSAgTDJDQVBfVFJBQ0VfREVCVUcoImwyY3VfcmVzdWJtaXRfcGVuZGluZ19zZWNfcmVxICBwX2JkYTogMHglMDh4IiwgcF9iZGEpOwotCi0gIC8qIElmIHdlIGFyZSBjYWxsZWQgd2l0aCBhIEJEQSwgb25seSByZXN1Ym1pdCBmb3IgdGhhdCBCREEgKi8KLSAgaWYgKHBfYmRhKSB7Ci0gICAgcF9sY2IgPSBsMmN1X2ZpbmRfbGNiX2J5X2JkX2FkZHIoKnBfYmRhLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLQotICAgIC8qIElmIHdlIGRvbid0IGhhdmUgb25lLCB0aGlzIGlzIGFuIGVycm9yICovCi0gICAgaWYgKHBfbGNiKSB7Ci0gICAgICAvKiBGb3IgYWxsIGNoYW5uZWxzLCBzZW5kIHRoZSBldmVudCB0aHJvdWdoIHRoZWlyIEZTTXMgKi8KLSAgICAgIGZvciAocF9jY2IgPSBwX2xjYi0+Y2NiX3F1ZXVlLnBfZmlyc3RfY2NiOyBwX2NjYjsgcF9jY2IgPSBwX25leHRfY2NiKSB7Ci0gICAgICAgIHBfbmV4dF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYjsKLSAgICAgICAgbDJjX2NzbV9leGVjdXRlKHBfY2NiLCBMMkNFVlRfU0VDX1JFX1NFTkRfQ01ELCBOVUxMKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgTDJDQVBfVFJBQ0VfV0FSTklORygibDJjdV9yZXN1Ym1pdF9wZW5kaW5nX3NlY19yZXEgLSB1bmtub3duIEJEX0FERFIiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogTm8gQkRBIHBhc2VzZWQgaW4sIHNvIGNoZWNrIGFsbCBsaW5rcyAqLwotICAgIGZvciAoeHggPSAwLCBwX2xjYiA9ICZsMmNiLmxjYl9wb29sWzBdOyB4eCA8IE1BWF9MMkNBUF9MSU5LUzsKLSAgICAgICAgIHh4KyssIHBfbGNiKyspIHsKLSAgICAgIGlmIChwX2xjYi0+aW5fdXNlKSB7Ci0gICAgICAgIC8qIEZvciBhbGwgY2hhbm5lbHMsIHNlbmQgdGhlIGV2ZW50IHRocm91Z2ggdGhlaXIgRlNNcyAqLwotICAgICAgICBmb3IgKHBfY2NiID0gcF9sY2ItPmNjYl9xdWV1ZS5wX2ZpcnN0X2NjYjsgcF9jY2I7IHBfY2NiID0gcF9uZXh0X2NjYikgewotICAgICAgICAgIHBfbmV4dF9jY2IgPSBwX2NjYi0+cF9uZXh0X2NjYjsKLSAgICAgICAgICBsMmNfY3NtX2V4ZWN1dGUocF9jY2IsIEwyQ0VWVF9TRUNfUkVfU0VORF9DTUQsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLSNpZiAoTDJDQVBfQ09ORk9STUFOQ0VfVEVTVElORyA9PSBUUlVFKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2V0X2luZm9fcnNwX21hc2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBzY3JpcHQgd3JhcHBlciB0byBjaGFuZ2UgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGluZm8gcmVzcCBtYXNrIGZvciBjb25mb3JtYW5jZSB0ZXN0aW5nLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBDQ0IsIG9yIE5VTEwgaWYgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2V0X2luZm9fcnNwX21hc2sodWludDMyX3QgbWFzaykgeyBsMmNiLnRlc3RfaW5mb19yZXNwID0gbWFzazsgfQotI2VuZGlmIC8qIEwyQ0FQX0NPTkZPUk1BTkNFX1RFU1RJTkcgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfYWRqdXN0X291dF9tcHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldHMgb3VyIE1QUyBiYXNlZCBvbiBjdXJyZW50IGNvbnRyb2xsZXIgY2FwYWJpbGl0aWVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9hZGp1c3Rfb3V0X21wcyh0TDJDX0NDQiogcF9jY2IpIHsKLSAgdWludDE2X3QgcGFja2V0X3NpemU7Ci0KLSAgLyogb24gdGhlIHR4IHNpZGUgTVRVIGlzIHNlbGVjdGVkIGJhc2VkIG9uIHBhY2tldCBzaXplIG9mIHRoZSBjb250cm9sbGVyICovCi0gIHBhY2tldF9zaXplID0gQlRNX0dldE1heFBhY2tldFNpemUocF9jY2ItPnBfbGNiLT5yZW1vdGVfYmRfYWRkcik7Ci0KLSAgaWYgKHBhY2tldF9zaXplIDw9IChMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9GQ1JfT1ZFUkhFQUQgKwotICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX1NEVV9MRU5fT1ZFUkhFQUQgKyBMMkNBUF9GQ1NfTEVOKSkgewotICAgIC8qIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nICovCi0gICAgTDJDQVBfVFJBQ0VfRVJST1IoCi0gICAgICAgICJsMmN1X2FkanVzdF9vdXRfbXBzIGJhZCBwYWNrZXQgc2l6ZTogJXUgIHdpbGwgdXNlIE1QUzogJXUiLAotICAgICAgICBwYWNrZXRfc2l6ZSwgcF9jY2ItPnBlZXJfY2ZnLmZjci5tcHMpOwotICAgIHBfY2NiLT50eF9tcHMgPSBwX2NjYi0+cGVlcl9jZmcuZmNyLm1wczsKLSAgfSBlbHNlIHsKLSAgICBwYWNrZXRfc2l6ZSAtPSAoTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfRkNSX09WRVJIRUFEICsKLSAgICAgICAgICAgICAgICAgICAgTDJDQVBfU0RVX0xFTl9PVkVSSEVBRCArIEwyQ0FQX0ZDU19MRU4pOwotCi0gICAgLyogV2UgdHJ5IHRvIG5lZ290aWF0ZSBNVFUgdGhhdCBlYWNoIHBhY2tldCBjYW4gYmUgc3BsaXQgaW50byB3aG9sZQotICAgIG51bWJlciBvZiBtYXggcGFja2V0cy4gIEZvciBleGFtcGxlIGlmIGxpbmsgaXMgMS4yIG1heCBwYWNrZXQgc2l6ZSBpcyAzMzkKLSAgICBieXRlcy4KLSAgICBBdCBmaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgd2hvbGUgcGFja2V0cyBpdCBpcy4gIE1BWCBMMkNBUCBpcyAxNjkxICsgNAotICAgIG92ZXJoZWFkLgotICAgIDE2OTUsIHRoYXQgd2lsbCBiZSA1IERoNSBwYWNrZXRzLiAgTm93IG1heGltdW0gTDJDQVAgcGFja2V0IGlzCi0gICAgNSAqIDMzOSA9IDE2OTUuIE1pbnVzIDQgYnl0ZXMgTDJDQVAgaGVhZGVyIDE2OTEuCi0KLSAgICBGb3IgRURSIDIuMCBwYWNrZXQgc2l6ZSBpcyAxMDI3LiAgU28gd2UgYmV0dGVyIHNlbmQgUkZDT01NIHBhY2tldCBhcyAxIDNESDUKLSAgICBwYWNrZXQKLSAgICAxICogMTAyNyA9IDEwMjcuICBNaW51cyA0IGJ5dGVzIEwyQ0FQIGhlYWRlciAxMDIzLiAgKi8KLSAgICBpZiAocF9jY2ItPnBlZXJfY2ZnLmZjci5tcHMgPj0gcGFja2V0X3NpemUpCi0gICAgICBwX2NjYi0+dHhfbXBzID0gcF9jY2ItPnBlZXJfY2ZnLmZjci5tcHMgLyBwYWNrZXRfc2l6ZSAqIHBhY2tldF9zaXplOwotICAgIGVsc2UKLSAgICAgIHBfY2NiLT50eF9tcHMgPSBwX2NjYi0+cGVlcl9jZmcuZmNyLm1wczsKLQotICAgIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgICAibDJjdV9hZGp1c3Rfb3V0X21wcyB1c2UgJWQgICBCYXNlZCBvbiBwZWVyX2NmZy5mY3IubXBzOiAldSAgIgotICAgICAgICAicGFja2V0X3NpemU6ICV1IiwKLSAgICAgICAgcF9jY2ItPnR4X21wcywgcF9jY2ItPnBlZXJfY2ZnLmZjci5tcHMsIHBhY2tldF9zaXplKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9pbml0aWFsaXplX2ZpeGVkX2NjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSBhIGZpeGVkIGNoYW5uZWwncyBDQ0IKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgb3IgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBsMmN1X2luaXRpYWxpemVfZml4ZWRfY2NiKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgZml4ZWRfY2lkKSB7Ci0gIHRMMkNfQ0NCKiBwX2NjYjsKLQotICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBDQ0IsIHRoZW4gc2ltcGx5IHJldHVybiAqLwotICBwX2NjYiA9IHBfbGNiLT5wX2ZpeGVkX2NjYnNbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF07Ci0gIGlmICgocF9jY2IgIT0gTlVMTCkgJiYgcF9jY2ItPmluX3VzZSkgewotICAgIC8qCi0gICAgICogTk9URTogVGhlICJpbl91c2UiIGNoZWNrIGlzIG5lZWRlZCB0byBpZ25vcmUgbGVmdG92ZXIgZW50cmllcwotICAgICAqIHRoYXQgaGF2ZSBiZWVuIGFscmVhZHkgcmVsZWFzZWQgYnkgbDJjdV9yZWxlYXNlX2NjYigpLgotICAgICAqLwotICAgIHJldHVybiAodHJ1ZSk7Ci0gIH0KLQotICBwX2NjYiA9IGwyY3VfYWxsb2NhdGVfY2NiKE5VTEwsIDApOwotICBpZiAocF9jY2IgPT0gTlVMTCkgcmV0dXJuIChmYWxzZSk7Ci0KLSAgYWxhcm1fY2FuY2VsKHBfbGNiLT5sMmNfbGNiX3RpbWVyKTsKLQotICAvKiBTZXQgQ0lEIGZvciB0aGUgY29ubmVjdGlvbiAqLwotICBwX2NjYi0+bG9jYWxfY2lkID0gZml4ZWRfY2lkOwotICBwX2NjYi0+cmVtb3RlX2NpZCA9IGZpeGVkX2NpZDsKLQotICBwX2NjYi0+aXNfZmx1c2hhYmxlID0gZmFsc2U7Ci0KLSAgLyogTGluayBjY2IgdG8gbGNiIGFuZCBsY2IgdG8gY2NiICovCi0gIHBfbGNiLT5wX2ZpeGVkX2NjYnNbZml4ZWRfY2lkIC0gTDJDQVBfRklSU1RfRklYRURfQ0hOTF0gPSBwX2NjYjsKLSAgcF9jY2ItPnBfbGNiID0gcF9sY2I7Ci0KLSAgLyogVGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiwgc28gaWYgdGhlIGxpbmsgaXMgdXAsIHRoZSBjaGFubmVsIGlzIHVwICovCi0gIGlmIChwX2xjYi0+bGlua19zdGF0ZSA9PSBMU1RfQ09OTkVDVEVEKSBwX2NjYi0+Y2hubF9zdGF0ZSA9IENTVF9PUEVOOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBpZGxlIHRpbWVvdXQgdmFsdWUgdG8gdXNlICovCi0gIHBfY2NiLT5maXhlZF9jaG5sX2lkbGVfdG91dCA9Ci0gICAgICBsMmNiLmZpeGVkX3JlZ1tmaXhlZF9jaWQgLSBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MXS5kZWZhdWx0X2lkbGVfdG91dDsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfbm9fZHluYW1pY19jY2JzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBIYW5kbGVzIHRoZSBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZHluYW1pYyBDQ0JzLiBJZgotICogICAgICAgICAgICAgICAgICB0aGVyZSBhcmUgYW55IGZpeGVkIENDQnMsIHN0YXJ0IHRoZSBsb25nZXN0IG9mIHRoZSBmaXhlZCBDQ0IKLSAqICAgICAgICAgICAgICAgICAgdGltZW91dHMsIG90aGVyd2lzZSBzdGFydCB0aGUgZGVmYXVsdCBsaW5rIGlkbGUgdGltZW91dCBvcgotICogICAgICAgICAgICAgICAgICBkaXNjb25uZWN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfbm9fZHluYW1pY19jY2JzKHRMMkNfTENCKiBwX2xjYikgewotICB0QlRNX1NUQVRVUyByYzsKLSAgdWludDY0X3QgdGltZW91dF9tcyA9IHBfbGNiLT5pZGxlX3RpbWVvdXQgKiAxMDAwOwotICBib29sIHN0YXJ0X3RpbWVvdXQgPSB0cnVlOwotCi0gIGludCB4eDsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBMMkNBUF9OVU1fRklYRURfQ0hOTFM7IHh4KyspIHsKLSAgICBpZiAoKHBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdICE9IE5VTEwpICYmCi0gICAgICAgIChwX2xjYi0+cF9maXhlZF9jY2JzW3h4XS0+Zml4ZWRfY2hubF9pZGxlX3RvdXQgKiAxMDAwID4gdGltZW91dF9tcykpIHsKLQotICAgICAgaWYgKHBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdLT5maXhlZF9jaG5sX2lkbGVfdG91dCA9PSBMMkNBUF9OT19JRExFX1RJTUVPVVQpIHsKLSAgICAgICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCIlcyBOTyBJRExFIHRpbWVvdXQgc2V0IGZvciBmaXhlZCBjaWQgMHglMDR4IiwgX19mdW5jX18sCi0gICAgICAgICAgICBwX2xjYi0+cF9maXhlZF9jY2JzW3h4XS0+bG9jYWxfY2lkKTsKLSAgICAgICAgIHN0YXJ0X3RpbWVvdXQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHRpbWVvdXRfbXMgPSBwX2xjYi0+cF9maXhlZF9jY2JzW3h4XS0+Zml4ZWRfY2hubF9pZGxlX3RvdXQgKiAxMDAwOwotICAgIH0KLSAgfQotCi0gIC8qIElmIHRoZSBsaW5rIGlzIHBhaXJpbmcsIGRvIG5vdCBtZXNzIHdpdGggdGhlIHRpbWVvdXRzICovCi0gIGlmIChwX2xjYi0+SXNCb25kaW5nKCkpIHJldHVybjsKLQotICBpZiAodGltZW91dF9tcyA9PSAwKSB7Ci0gICAgTDJDQVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICJsMmN1X25vX2R5bmFtaWNfY2NicygpIElETEUgdGltZXIgMCwgZGlzY29ubmVjdGluZyBsaW5rIik7Ci0KLSAgICByYyA9IGJ0bV9zZWNfZGlzY29ubmVjdChwX2xjYi0+SGFuZGxlKCksIEhDSV9FUlJfUEVFUl9VU0VSKTsKLSAgICBpZiAocmMgPT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICBsMmN1X3Byb2Nlc3NfZml4ZWRfZGlzY19jYmFjayhwX2xjYik7Ci0gICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9ESVNDT05ORUNUSU5HOwotICAgICAgdGltZW91dF9tcyA9IEwyQ0FQX0xJTktfRElTQ09OTkVDVF9USU1FT1VUX01TOwotICAgIH0gZWxzZSBpZiAocmMgPT0gQlRNX1NVQ0NFU1MpIHsKLSAgICAgIGwyY3VfcHJvY2Vzc19maXhlZF9kaXNjX2NiYWNrKHBfbGNiKTsKLSAgICAgIC8qIEJUTSBTRUMgd2lsbCBtYWtlIHN1cmUgdGhhdCBsaW5rIGlzIHJlbGVhc2UgKHByb2JhYmx5IGFmdGVyIHBhaXJpbmcgaXMKLSAgICAgICAqIGRvbmUpICovCi0gICAgICBwX2xjYi0+bGlua19zdGF0ZSA9IExTVF9ESVNDT05ORUNUSU5HOwotICAgICAgc3RhcnRfdGltZW91dCA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAocF9sY2ItPklzQm9uZGluZygpKSB7Ci0gICAgICBhY2xfZGlzY29ubmVjdF9mcm9tX2hhbmRsZShwX2xjYi0+SGFuZGxlKCksIEhDSV9FUlJfUEVFUl9VU0VSKTsKLSAgICAgIGwyY3VfcHJvY2Vzc19maXhlZF9kaXNjX2NiYWNrKHBfbGNiKTsKLSAgICAgIHBfbGNiLT5saW5rX3N0YXRlID0gTFNUX0RJU0NPTk5FQ1RJTkc7Ci0gICAgICB0aW1lb3V0X21zID0gTDJDQVBfTElOS19ESVNDT05ORUNUX1RJTUVPVVRfTVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHByb2JhYmx5IG5vIGJ1ZmZlciB0byBzZW5kIGRpc2Nvbm5lY3QgKi8KLSAgICAgIHRpbWVvdXRfbXMgPSBCVF8xU0VDX1RJTUVPVVRfTVM7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0YXJ0X3RpbWVvdXQpIHsKLSAgICBMMkNBUF9UUkFDRV9ERUJVRygiJXMgc3RhcnRpbmcgSURMRSB0aW1lb3V0OiAlZCBtcyIsIF9fZnVuY19fLCB0aW1lb3V0X21zKTsKLSAgICBhbGFybV9zZXRfb25fbWxvb3AocF9sY2ItPmwyY19sY2JfdGltZXIsIHRpbWVvdXRfbXMsIGwyY19sY2JfdGltZXJfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9sY2IpOwotICB9IGVsc2UgewotICAgIGFsYXJtX2NhbmNlbChwX2xjYi0+bDJjX2xjYl90aW1lcik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfcHJvY2Vzc19maXhlZF9jaG5sX3Jlc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIGhhbmRsZSBhIGZpeGVkIGNoYW5uZWwgcmVzcG9uc2UgKG9yIGxhY2sgdGhlcmVvZikKLSAqICAgICAgICAgICAgICAgICAgaWYgdGhlIGxpbmsgZmFpbGVkLCBvciBhIGZpeGVkIGNoYW5uZWwgcmVzcG9uc2Ugd2FzCi0gKiAgICAgICAgICAgICAgICAgIG5vdCByZWNlaXZlZCwgdGhlIGJpdGZpZWxkIGlzIGFsbCB6ZXJvcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3Byb2Nlc3NfZml4ZWRfY2hubF9yZXNwKHRMMkNfTENCKiBwX2xjYikgewotICBpZiAocF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfQlJfRURSKSB7Ci0gICAgLyogaWdub3JlIGFsbCBub3QgYXNzaWduZWQgQlIvRURSIGNoYW5uZWxzICovCi0gICAgcF9sY2ItPnBlZXJfY2hubF9tYXNrWzBdICY9Ci0gICAgICAgIChMMkNBUF9GSVhFRF9DSE5MX1NJR19CSVQgfCBMMkNBUF9GSVhFRF9DSE5MX0NOQ1RMRVNTX0JJVCB8Ci0gICAgICAgICBMMkNBUF9GSVhFRF9DSE5MX1NNUF9CUl9CSVQpOwotICB9IGVsc2UKLSAgICBwX2xjYi0+cGVlcl9jaG5sX21hc2tbMF0gPSBsMmNiLmwyY19ibGVfZml4ZWRfY2hubHNfbWFzazsKLQotICAvKiBUZWxsIGFsbCByZWdpc3RlcmVkIGZpeGVkIGNoYW5uZWxzIGFib3V0IHRoZSBjb25uZWN0aW9uICovCi0gIGZvciAoaW50IHh4ID0gMDsgeHggPCBMMkNBUF9OVU1fRklYRURfQ0hOTFM7IHh4KyspIHsKLSAgICB1aW50MTZfdCBjaGFubmVsX2lkID0geHggKyBMMkNBUF9GSVJTVF9GSVhFRF9DSE5MOwotCi0gICAgLyogU2VlIEJUIFNwZWMgVmVyIDUuMCB8IFZvbCAzLCBQYXJ0IEEgMi4xIHRhYmxlIDIuMSBhbmQgMi4yICovCi0KLSAgICAvKiBza2lwIHNlbmRpbmcgTEUgZml4IGNoYW5uZWwgY2FsbGJhY2tzIG9uIEJSL0VEUiBsaW5rcyAqLwotICAgIGlmIChwX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9CUl9FRFIgJiYKLSAgICAgICAgY2hhbm5lbF9pZCA+PSBMMkNBUF9BVFRfQ0lEICYmIGNoYW5uZWxfaWQgPD0gTDJDQVBfU01QX0NJRCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogc2tpcCBzZW5kaW5nIEJSIGZpeCBjaGFubmVsIGNhbGxiYWNrcyBvbiBMRSBsaW5rcyAqLwotICAgIGlmIChwX2xjYi0+dHJhbnNwb3J0ID09IEJUX1RSQU5TUE9SVF9MRSAmJiBjaGFubmVsX2lkID09IEwyQ0FQX1NNUF9CUl9DSUQpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmICghbDJjYi5maXhlZF9yZWdbeHhdLnBMMkNBX0ZpeGVkQ29ubl9DYikgY29udGludWU7Ci0KLSAgICBpZiAocF9sY2ItPnBlZXJfY2hubF9tYXNrWyhjaGFubmVsX2lkKSAvIDhdICYgKDEgPDwgKChjaGFubmVsX2lkKSAlIDgpKSkgewotICAgICAgaWYgKHBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdKQotICAgICAgICBwX2xjYi0+cF9maXhlZF9jY2JzW3h4XS0+Y2hubF9zdGF0ZSA9IENTVF9PUEVOOwotICAgICAgKCpsMmNiLmZpeGVkX3JlZ1t4eF0ucEwyQ0FfRml4ZWRDb25uX0NiKSgKLSAgICAgICAgICBjaGFubmVsX2lkLCBwX2xjYi0+cmVtb3RlX2JkX2FkZHIsIHRydWUsIDAsIHBfbGNiLT50cmFuc3BvcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAoKmwyY2IuZml4ZWRfcmVnW3h4XS5wTDJDQV9GaXhlZENvbm5fQ2IpKAotICAgICAgICAgIGNoYW5uZWxfaWQsIHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgZmFsc2UsIHBfbGNiLT5EaXNjb25uZWN0UmVhc29uKCksCi0gICAgICAgICAgcF9sY2ItPnRyYW5zcG9ydCk7Ci0KLSAgICAgIGlmIChwX2xjYi0+cF9maXhlZF9jY2JzW3h4XSkgewotICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdKTsKLSAgICAgICAgcF9sY2ItPnBfZml4ZWRfY2Nic1t4eF0gPSBOVUxMOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9wcm9jZXNzX2ZpeGVkX2Rpc2NfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmQgbDJjYXAgZml4ZWQgY2hhbm5lbCBkaXNjb25uZWN0aW9uIGNhbGxiYWNrIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcHJvY2Vzc19maXhlZF9kaXNjX2NiYWNrKHRMMkNfTENCKiBwX2xjYikgewotCi0gIC8qIFNlbGVjdCBwZWVyIGNoYW5uZWxzIG1hc2sgdG8gdXNlIGRlcGVuZGluZyBvbiB0cmFuc3BvcnQgKi8KLSAgdWludDhfdCBwZWVyX2NoYW5uZWxfbWFzayA9IHBfbGNiLT5wZWVyX2NobmxfbWFza1swXTsKLQotICAvLyBGb3IgTEUsIHJlc2V0IHRoZSBzdG9yZWQgcGVlciBjaGFubmVsIG1hc2sKLSAgaWYgKHBfbGNiLT50cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0xFKSBwX2xjYi0+cGVlcl9jaG5sX21hc2tbMF0gPSAwOwotCi0gIGZvciAoaW50IHh4ID0gMDsgeHggPCBMMkNBUF9OVU1fRklYRURfQ0hOTFM7IHh4KyspIHsKLSAgICBpZiAocF9sY2ItPnBfZml4ZWRfY2Nic1t4eF0pIHsKLSAgICAgIGlmIChwX2xjYi0+cF9maXhlZF9jY2JzW3h4XSAhPSBwX2xjYi0+cF9wZW5kaW5nX2NjYikgewotICAgICAgICB0TDJDX0NDQiogcF9sMmNfY2hubF9jdHJsX2Jsb2NrOwotICAgICAgICBwX2wyY19jaG5sX2N0cmxfYmxvY2sgPSBwX2xjYi0+cF9maXhlZF9jY2JzW3h4XTsKLSAgICAgICAgcF9sY2ItPnBfZml4ZWRfY2Nic1t4eF0gPSBOVUxMOwotICAgICAgICBsMmN1X3JlbGVhc2VfY2NiKHBfbDJjX2NobmxfY3RybF9ibG9jayk7Ci0gICAgICAgICgqbDJjYi5maXhlZF9yZWdbeHhdLnBMMkNBX0ZpeGVkQ29ubl9DYikoCi0gICAgICAgICAgICB4eCArIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwsIHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgZmFsc2UsCi0gICAgICAgICAgICBwX2xjYi0+RGlzY29ubmVjdFJlYXNvbigpLCBwX2xjYi0+dHJhbnNwb3J0KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChwZWVyX2NoYW5uZWxfbWFzayAmICgxIDw8ICh4eCArIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwpKSkgJiYKLSAgICAgICAgICAgICAgIChsMmNiLmZpeGVkX3JlZ1t4eF0ucEwyQ0FfRml4ZWRDb25uX0NiICE9IE5VTEwpKQotICAgICAgKCpsMmNiLmZpeGVkX3JlZ1t4eF0ucEwyQ0FfRml4ZWRDb25uX0NiKSgKLSAgICAgICAgICB4eCArIEwyQ0FQX0ZJUlNUX0ZJWEVEX0NITkwsIHBfbGNiLT5yZW1vdGVfYmRfYWRkciwgZmFsc2UsCi0gICAgICAgICAgcF9sY2ItPkRpc2Nvbm5lY3RSZWFzb24oKSwgcF9sY2ItPnRyYW5zcG9ydCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhIEJMRSBwYXJhbWV0ZXIgdXBkYXRlIHJlcXVlc3QgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9ibGVfcGFyX3JlcSh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IG1pbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9pbnQsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgdWludDhfdCogcDsKLQotICAvKiBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBwYWNrZXQgKi8KLSAgcF9sY2ItPnNpZ25hbF9pZCsrOwotICBsMmN1X2Fkal9pZChwX2xjYik7Ci0KLSAgcF9idWYgPSBsMmN1X2J1aWxkX2hlYWRlcihwX2xjYiwgTDJDQVBfQ01EX0JMRV9VUERfUkVRX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfQkxFX1VQREFURV9SRVEsIHBfbGNiLT5zaWduYWxfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoImwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcmVxIC0gbm8gYnVmZmVyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgbWluX2ludCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgbWF4X2ludCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgbGF0ZW5jeSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgdGltZW91dCk7Ci0KLSAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9ibGVfcGFyX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYSBCTEUgcGFyYW1ldGVyIHVwZGF0ZSByZXNwb25zZSBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHRoZSBwZWVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlbV9pZCkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIHBfYnVmID0gbDJjdV9idWlsZF9oZWFkZXIocF9sY2IsIEwyQ0FQX0NNRF9CTEVfVVBEX1JTUF9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0JMRV9VUERBVEVfUlNQLCByZW1faWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoImwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcnNwIC0gbm8gYnVmZmVyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcmVhc29uKTsKLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGFuZCBzZW5kIGEgQkxFIHBhY2tldCB0byBlc3RhYmxpc2ggTEUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBvcmllbnRlZCBMMkNBUCBjaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXEodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHRMMkNfTENCKiBwX2xjYiA9IE5VTEw7Ci0gIHVpbnQxNl90IG10dTsKLSAgdWludDE2X3QgbXBzOwotICB1aW50MTZfdCBpbml0aWFsX2NyZWRpdDsKLQotICBpZiAoIXBfY2NiKSByZXR1cm47Ci0gIHBfbGNiID0gcF9jY2ItPnBfbGNiOwotCi0gIC8qIENyZWF0ZSBhbiBpZGVudGlmaWVyIGZvciB0aGlzIHBhY2tldCAqLwotICBwX2NjYi0+cF9sY2ItPnNpZ25hbF9pZCsrOwotICBsMmN1X2Fkal9pZChwX2NjYi0+cF9sY2IpOwotCi0gIHBfY2NiLT5sb2NhbF9pZCA9IHBfY2NiLT5wX2xjYi0+c2lnbmFsX2lkOwotCi0gIHBfYnVmID0KLSAgICAgIGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCBMMkNBUF9DTURfQkxFX0NSRURJVF9CQVNFRF9DT05OX1JFUV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfQkxFX0NSRURJVF9CQVNFRF9DT05OX1JFUSwgcF9sY2ItPnNpZ25hbF9pZCk7Ci0gIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygibDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcSAtIG5vIGJ1ZmZlciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBtdHUgPSBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXR1OwotICBtcHMgPSBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXBzOwotICBpbml0aWFsX2NyZWRpdCA9IHBfY2NiLT5sb2NhbF9jb25uX2NmZy5jcmVkaXRzOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgImwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXEgUFNNOjB4JTA0eCBsb2NhbF9jaWQ6JWRcCi0gICAgICAgICAgICAgICAgbXR1OiVkIG1wczolZCBpbml0aWFsX2NyZWRpdDolZCIsCi0gICAgICBwX2NjYi0+cF9yY2ItPnJlYWxfcHNtLCBwX2NjYi0+bG9jYWxfY2lkLCBtdHUsIG1wcywgaW5pdGlhbF9jcmVkaXQpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPnBfcmNiLT5yZWFsX3BzbSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPmxvY2FsX2NpZCk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgbXR1KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBtcHMpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGluaXRpYWxfY3JlZGl0KTsKLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3Vfc2VuZF9wZWVyX2NyZWRpdF9iYXNlZF9jb25uX3JlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYSBCTEUgcGFja2V0IHRvIGVzdGFibGlzaCBlbmhhbmNlZCBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG9yaWVudGVkIEwyQ0FQIGNoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9zZW5kX3BlZXJfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotICB0TDJDX0xDQiogcF9sY2IgPSBOVUxMOwotICB1aW50MTZfdCBtdHU7Ci0gIHVpbnQxNl90IG1wczsKLSAgdWludDE2X3QgaW5pdGlhbF9jcmVkaXQ7Ci0KLSAgaWYgKCFwX2NjYikgcmV0dXJuOwotCi0gIHBfbGNiID0gcF9jY2ItPnBfbGNiOwotCi0gIC8qIENyZWF0ZSBhbiBpZGVudGlmaWVyIGZvciB0aGlzIHBhY2tldCAqLwotICBwX2NjYi0+cF9sY2ItPnNpZ25hbF9pZCsrOwotICBsMmN1X2Fkal9pZChwX2NjYi0+cF9sY2IpOwotCi0gIHBfY2NiLT5sb2NhbF9pZCA9IHBfbGNiLT5zaWduYWxfaWQ7Ci0KLSAgcF9idWYgPSBsMmN1X2J1aWxkX2hlYWRlcihwX2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX0NPTk5fUkVRX01JTl9MRU4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogcF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX0NPTk5fUkVRLCBwX2NjYi0+bG9jYWxfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoIiVzIC0gbm8gYnVmZmVyIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBtdHUgPSBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXR1OwotICBtcHMgPSBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXBzOwotICBpbml0aWFsX2NyZWRpdCA9IHBfY2NiLT5sb2NhbF9jb25uX2NmZy5jcmVkaXRzOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgIiVzIFBTTToweCUwNHggbXR1OiVkIG1wczolZCBpbml0aWFsX2NyZWRpdDolZCwgY2lkc19jbnQgJWQiLCBfX2Z1bmNfXywKLSAgICAgIHBfY2NiLT5wX3JjYi0+cmVhbF9wc20sIG10dSwgbXBzLCBpbml0aWFsX2NyZWRpdCwKLSAgICAgIHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubl9jbnQpOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPnBfcmNiLT5yZWFsX3BzbSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgbXR1KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBtcHMpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGluaXRpYWxfY3JlZGl0KTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubl9jbnQ7IGkrKykgewotICAgIHVpbnQxNl90IGNpZCA9IHBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzW2ldOwotICAgIEwyQ0FQX1RSQUNFX0RFQlVHKCJcblx0IGNpZDogIiwgY2lkKTsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNpZCk7Ci0gIH0KLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb2NfY29ubmVjdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgIkNyZWRpdCBiYXNlZCBjb25uZWN0aW9uIHJlcyIKLSAqICAgICAgICAgICAgICAgICAgbWVzc2FnZSB0byB0aGUgcGVlci4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG5vbi1zdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIGNhc2VzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3VfcmVqZWN0X2JsZV9jb2NfY29ubmVjdGlvbih0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QgcmVtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgcF9idWYgPSBsMmN1X2J1aWxkX2hlYWRlcihwX2xjYiwgTDJDQVBfQ01EX0JMRV9DUkVESVRfQkFTRURfQ09OTl9SRVNfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0NNRF9CTEVfQ1JFRElUX0JBU0VEX0NPTk5fUkVTLCByZW1faWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoImwyY3VfcmVqZWN0X2JsZV9jb2NfY29ubmVjdGlvbiAtIG5vIGJ1ZmZlciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDApOyAvKiBMb2NhbCBDSUQgb2YgMCAgICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMCk7IC8qIE1UVSAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDApOyAvKiBNUFMgKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCAwKTsgLyogaW5pdGlhbCBjcmVkaXQgKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCByZXN1bHQpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9yZWplY3RfY3JlZGl0X2Jhc2VkX2Nvbm5lY3Rpb25fcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAiY3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24KLSAqcmVzIiBtZXNzYWdlIHRvIHRoZSBwZWVyLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3Igbm9uLXN1Y2Nlc3MgY2FzZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9yZWplY3RfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9vZl9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotICB1aW50OF90IHJzcF9sZW4gPSBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX0NPTk5fUkVTX01JTl9MRU4gKwotICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDE2X3QpICogbnVtX29mX2NoYW5uZWxzOwotCi0gIHBfYnVmID0gbDJjdV9idWlsZF9oZWFkZXIocF9sY2IsIHJzcF9sZW4sIEwyQ0FQX0NNRF9DUkVESVRfQkFTRURfQ09OTl9SRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtX2lkKTsKLSAgaWYgKHBfYnVmID09IE5VTEwpIHsKLSAgICBMMkNBUF9UUkFDRV9XQVJOSU5HKCJsMmN1X3JlamVjdF9jcmVkaXRfYmFzZWRfY29ubl9yZXEgLSBubyBidWZmZXIiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgbWVtc2V0KHAsIDAsIHJzcF9sZW4pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIEwyQ0FQX0NSRURJVF9CQVNFRF9NSU5fTVRVKTsgLyogZHVtbXkgTVRVIHRvIHNhdGlzeSBQVFMgKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBMMkNBUF9DUkVESVRfQkFTRURfTUlOX01QUyk7IC8qIGR1bW15IE1QUyB0byBzYXRpc3kgUFRTKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCAxKTsgLyogZHVtbXkgaW5pdGlhbCBjcmVkaXQgdG8gc2F0aXN5IFBUUyAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHJlc3VsdCk7Ci0KLSAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9jcmVkaXRfYmFzZWRfY29ubl9yZXMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGFuZCBzZW5kIGFuIEwyQ0FQICJDcmVkaXQgYmFzZWQgY29ubmVjdGlvbiByZXMiCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdG8gdGhlIHBlZXIuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGNhc2Ugb2YKLSAqICAgICAgICAgICAgICAgICAgc3VjY2Vzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBsMmN1X3NlbmRfcGVlcl9jcmVkaXRfYmFzZWRfY29ubl9yZXModEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBhY2NlcHRlZF9jaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICB1aW50OF90IHJzcF9sZW4gPSBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX0NPTk5fUkVTX01JTl9MRU4gKwotICAgICAgICAgICAgICAgICAgICBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudCAqIHNpemVvZih1aW50MTZfdCk7Ci0KLSAgcF9idWYgPSBsMmN1X2J1aWxkX2hlYWRlcihwX2NjYi0+cF9sY2IsIHJzcF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9DT05OX1JFUywgcF9jY2ItPnJlbW90ZV9pZCk7Ci0gIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygiJXMgLSBubyBidWZmZXIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIG1lbXNldChwLCAwLCByc3BfbGVuKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+bG9jYWxfY29ubl9jZmcubXR1KTsgICAgIC8qIE1UVSAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5sb2NhbF9jb25uX2NmZy5tcHMpOyAgICAgLyogTVBTICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPmxvY2FsX2Nvbm5fY2ZnLmNyZWRpdHMpOyAvKiBpbml0aWFsIGNyZWRpdCAqLwotCi0gIGlmIChyZXN1bHQgPT0gTDJDQVBfQ09OTl9PSykgewotICAgIC8qIEluIGNhc2Ugb2Ygc3VjY2Vzcywgd2UgbmVlZCB0byBjaGVjayBpZiBzdGFjawotICAgICAqIGRpZCBub3QgaGF2ZSBwcmV2aW91cyByZXN1bHQgc3RvcmVkIGUuZy4gd2hlbiB0aGVyZSB3YXMgbm8KLSAgICAgKiByZXNvdXJjZXMgZm9yIGFsbG9jYXRpb24gYWxsIHRoZSByZXF1cmVzdGVkIGNoYW5uZWxzLAotICAgICAqIGJlZm9yZSB1c2VyIGluZGljYXRpb24uCi0gICAgICovCi0gICAgcmVzdWx0ID0gcF9jY2ItPnBfbGNiLT5wZW5kaW5nX2wyY2FwX3Jlc3VsdDsKLSAgfQotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcmVzdWx0KTsKLQotICAvKiBXZSBuZWVkIHRvIGtlZXAgb3JkZXIgZnJvbSB0aGUgcmVxdWVzdC4KLSAgICogaWYgdGhpcyB2ZWN0b3IgY29udGFpcyAwIGl0IG1lYW5zIGNoYW5uZWwgaGFzIGJlZW4gcmVqZWN0ZWQgYnkKLSAgICogdGhlIHN0YWNrLgotICAgKiBJZiB0aGVyZSBpcyB2YWxpZCBjaWQsIHdlIG5lZWQgdG8gdmVyaWZ5IGlmIGl0IGlzIGFjY2VwdGVkIGJ5IHVwcGVyIGxheWVyLgotICAgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19jb25uX2NudDsgaSsrKSB7Ci0gICAgdWludDE2X3QgY2lkID0gcF9jY2ItPnBfbGNiLT5wZW5kaW5nX2Vjb2NfY29ubmVjdGlvbl9jaWRzW2ldOwotICAgIGlmIChjaWQgPT0gMCkgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCAwKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKGFjY2VwdGVkX2NpZHMuYmVnaW4oKSwgYWNjZXB0ZWRfY2lkcy5lbmQoKSwgY2lkKTsKLSAgICBpZiAoaXQgIT0gYWNjZXB0ZWRfY2lkcy5lbmQoKSkgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBjaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIDApOwotICAgIH0KLSAgfQotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2NjYi0+cF9sY2IsIDAsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfcmVqZWN0X2JsZV9jb25uZWN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhbiBMMkNBUCAiQ3JlZGl0IGJhc2VkIGNvbm5lY3Rpb24gcmVzIgotICogICAgICAgICAgICAgICAgICBtZXNzYWdlIHRvIHRoZSBwZWVyLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3Igbm9uLXN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgY2FzZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9yZWplY3RfYmxlX2Nvbm5lY3Rpb24odEwyQ19DQ0IqIHBfY2NiLCB1aW50OF90IHJlbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KSB7Ci0gIGlmIChwX2NjYi0+ZWNvYykKLSAgICBsMmN1X3JlamVjdF9jcmVkaXRfYmFzZWRfY29ubl9yZXEoCi0gICAgICAgIHBfY2NiLT5wX2xjYiwgcmVtX2lkLCBwX2NjYi0+cF9sY2ItPnBlbmRpbmdfZWNvY19yZWNvbmZpZ19jbnQsIHJlc3VsdCk7Ci0gIGVsc2UKLSAgICBsMmN1X3JlamVjdF9ibGVfY29jX2Nvbm5lY3Rpb24ocF9jY2ItPnBfbGNiLCByZW1faWQsIHJlc3VsdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfYmxlX3JlY29uZmlnX3JzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgIkNyZWRpdCBiYXNlZCByZWNvbmZpZyByZXMiCi0gKiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgdG8gdGhlIHBlZXIuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBub24tc3VjY2VzcwotICogICAgICAgICAgICAgICAgICBjYXNlcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGwyY3Vfc2VuZF9ibGVfcmVjb25maWdfcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCJsMmN1X3NlbmRfYmxlX3JlY29uZmlnX3JzcCByZXN1bHQgMHgwNCV4IiwgcmVzdWx0KTsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCBMMkNBUF9DTURfQ1JFRElUX0JBU0VEX1JFQ09ORklHX1JFU19MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SRVMsIHJlbV9pZCk7Ci0gIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygibDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcyAtIG5vIGJ1ZmZlciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBtZW1zZXQocCwgMCwgTDJDQVBfQ01EX0NSRURJVF9CQVNFRF9SRUNPTkZJR19SRVNfTEVOKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCByZXN1bHQpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYW4gTDJDQVAgIkNyZWRpdCBiYXNlZCBjb25uZWN0aW9uIHJlcyIKLSAqICAgICAgICAgICAgICAgICAgbWVzc2FnZSB0byB0aGUgcGVlci4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gY2FzZSBvZgotICogICAgICAgICAgICAgICAgICBzdWNjZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXModEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCkgewotICBCVF9IRFIqIHBfYnVmOwotICB1aW50OF90KiBwOwotCi0gIEwyQ0FQX1RSQUNFX0RFQlVHKCJsMmN1X3NlbmRfcGVlcl9ibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzIik7Ci0gIHBfYnVmID0KLSAgICAgIGwyY3VfYnVpbGRfaGVhZGVyKHBfY2NiLT5wX2xjYiwgTDJDQVBfQ01EX0JMRV9DUkVESVRfQkFTRURfQ09OTl9SRVNfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ01EX0JMRV9DUkVESVRfQkFTRURfQ09OTl9SRVMsIHBfY2NiLT5yZW1vdGVfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoImwyY3Vfc2VuZF9wZWVyX2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXMgLSBubyBidWZmZXIiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfU0VORF9DTURfT0ZGU0VUICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRSArCi0gICAgICBMMkNBUF9QS1RfT1ZFUkhFQUQgKyBMMkNBUF9DTURfT1ZFUkhFQUQ7Ci0KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+bG9jYWxfY2lkKTsgICAgICAgICAgICAgIC8qIExvY2FsIENJRCAqLwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5sb2NhbF9jb25uX2NmZy5tdHUpOyAgICAgLyogTVRVICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPmxvY2FsX2Nvbm5fY2ZnLm1wcyk7ICAgICAvKiBNUFMgKi8KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+bG9jYWxfY29ubl9jZmcuY3JlZGl0cyk7IC8qIGluaXRpYWwgY3JlZGl0ICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcmVzdWx0KTsKLQotICBsMmNfbGlua19jaGVja19zZW5kX3BrdHMocF9jY2ItPnBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9ibGVfZmxvd19jb250cm9sX2NyZWRpdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgYW5kIHNlbmQgYSBCTEUgcGFja2V0IHRvIGdpdmUgY3JlZGl0cyB0byBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBmb3IgTEUgY29ubmVjdGlvbiBvcmllbnRlZCBMMkNBUCBjaGFubmVsLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9mbG93X2NvbnRyb2xfY3JlZGl0KHRMMkNfQ0NCKiBwX2NjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY3JlZGl0X3ZhbHVlKSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHRMMkNfTENCKiBwX2xjYiA9IE5VTEw7Ci0KLSAgaWYgKCFwX2NjYikgcmV0dXJuOwotICBwX2xjYiA9IHBfY2NiLT5wX2xjYjsKLQotICAvKiBDcmVhdGUgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBwYWNrZXQgKi8KLSAgcF9jY2ItPnBfbGNiLT5zaWduYWxfaWQrKzsKLSAgbDJjdV9hZGpfaWQocF9jY2ItPnBfbGNiKTsKLQotICBwX2NjYi0+bG9jYWxfaWQgPSBwX2NjYi0+cF9sY2ItPnNpZ25hbF9pZDsKLQotICBwX2J1ZiA9IGwyY3VfYnVpbGRfaGVhZGVyKHBfbGNiLCBMMkNBUF9DTURfQkxFX0ZMT1dfQ1RSTF9DUkVESVRfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX0NNRF9CTEVfRkxPV19DVFJMX0NSRURJVCwgcF9sY2ItPnNpZ25hbF9pZCk7Ci0gIGlmIChwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgTDJDQVBfVFJBQ0VfV0FSTklORygibDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcSAtIG5vIGJ1ZmZlciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9TRU5EX0NNRF9PRkZTRVQgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFICsKLSAgICAgIEwyQ0FQX1BLVF9PVkVSSEVBRCArIEwyQ0FQX0NNRF9PVkVSSEVBRDsKLQotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5sb2NhbF9jaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNyZWRpdF92YWx1ZSk7Ci0KLSAgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHBfbGNiLCAwLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X3NlbmRfcGVlcl9ibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBhbmQgc2VuZCBhIEJMRSBwYWNrZXQgdG8gZGlzY29ubmVjdCBMRSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG9yaWVudGVkIEwyQ0FQIGNoYW5uZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9kaXNjb25uX3JlcSh0TDJDX0NDQiogcF9jY2IpIHsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgdWludDhfdCogcDsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gTlVMTDsKLSAgTDJDQVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICghcF9jY2IpIHJldHVybjsKLSAgcF9sY2IgPSBwX2NjYi0+cF9sY2I7Ci0KLSAgLyogQ3JlYXRlIGFuIGlkZW50aWZpZXIgZm9yIHRoaXMgcGFja2V0ICovCi0gIHBfY2NiLT5wX2xjYi0+c2lnbmFsX2lkKys7Ci0gIGwyY3VfYWRqX2lkKHBfY2NiLT5wX2xjYik7Ci0KLSAgcF9jY2ItPmxvY2FsX2lkID0gcF9jY2ItPnBfbGNiLT5zaWduYWxfaWQ7Ci0gIHBfYnVmID0gbDJjdV9idWlsZF9oZWFkZXIocF9sY2IsIEwyQ0FQX0RJU0NfUkVRX0xFTiwgTDJDQVBfQ01EX0RJU0NfUkVRLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbGNiLT5zaWduYWxfaWQpOwotICBpZiAocF9idWYgPT0gTlVMTCkgewotICAgIEwyQ0FQX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICJsMmN1X3NlbmRfcGVlcl9ibGVfY3JlZGl0X2Jhc2VkX2Rpc2Nvbm5fcmVxIC0gbm8gYnVmZmVyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX1NFTkRfQ01EX09GRlNFVCArIEhDSV9EQVRBX1BSRUFNQkxFX1NJWkUgKwotICAgICAgTDJDQVBfUEtUX09WRVJIRUFEICsgTDJDQVBfQ01EX09WRVJIRUFEOwotCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jY2ItPnJlbW90ZV9jaWQpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5sb2NhbF9jaWQpOwotCi0gIGwyY19saW5rX2NoZWNrX3NlbmRfcGt0cyhwX2xjYiwgMCwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb25zIHVzZWQgYnkgYm90aCBGdWxsIGFuZCBMaWdodCBTdGFjawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfZmluZF9sY2JfYnlfaGFuZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBMb29rIHRocm91Z2ggYWxsIGFjdGl2ZSBMQ0JzIGZvciBhIG1hdGNoIGJhc2VkIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBIQ0kgaGFuZGxlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBtYXRjaGVkIExDQiwgb3IgTlVMTCBpZiBubyBtYXRjaAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10TDJDX0xDQiogbDJjdV9maW5kX2xjYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIGludCB4eDsKLSAgdEwyQ19MQ0IqIHBfbGNiID0gJmwyY2IubGNiX3Bvb2xbMF07Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgTUFYX0wyQ0FQX0xJTktTOyB4eCsrLCBwX2xjYisrKSB7Ci0gICAgaWYgKChwX2xjYi0+aW5fdXNlKSAmJiAocF9sY2ItPkhhbmRsZSgpID09IGhhbmRsZSkpIHsKLSAgICAgIHJldHVybiAocF9sY2IpOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGhlcmUsIG5vIG1hdGNoIGZvdW5kICovCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBsMmN1X2ZpbmRfY2NiX2J5X2NpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vayB0aHJvdWdoIGFsbCBhY3RpdmUgQ0NCcyBvbiBhIGxpbmsgZm9yIGEgbWF0Y2ggYmFzZWQKLSAqICAgICAgICAgICAgICAgICAgb24gdGhlIGxvY2FsIENJRC4gSWYgcGFzc2VkIHRoZSBsaW5rIHBvaW50ZXIgaXMgTlVMTCwgYWxsCi0gKiAgICAgICAgICAgICAgICAgIGFjdGl2ZSBsaW5rcyBhcmUgc2VhcmNoZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBwb2ludGVyIHRvIG1hdGNoZWQgQ0NCLCBvciBOVUxMIGlmIG5vIG1hdGNoCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRMMkNfQ0NCKiBsMmN1X2ZpbmRfY2NiX2J5X2NpZCh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGxvY2FsX2NpZCkgewotICB0TDJDX0NDQiogcF9jY2IgPSBOVUxMOwotICBpZiAobG9jYWxfY2lkID49IEwyQ0FQX0JBU0VfQVBQTF9DSUQpIHsKLSAgICAvKiBmaW5kIHRoZSBhc3NvY2lhdGVkIENDQiBieSAiaW5kZXgiICovCi0gICAgbG9jYWxfY2lkIC09IEwyQ0FQX0JBU0VfQVBQTF9DSUQ7Ci0KLSAgICBpZiAobG9jYWxfY2lkID49IE1BWF9MMkNBUF9DSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0KLSAgICBwX2NjYiA9IGwyY2IuY2NiX3Bvb2wgKyBsb2NhbF9jaWQ7Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhlIENDQiBpcyBpbiB1c2UgKi8KLSAgICBpZiAoIXBfY2NiLT5pbl91c2UpIHsKLSAgICAgIHBfY2NiID0gTlVMTDsKLSAgICB9Ci0gICAgLyogbWFrZSBzdXJlIGl0J3MgZm9yIHRoZSBzYW1lIExDQiAqLwotICAgIGVsc2UgaWYgKHBfbGNiICYmIHBfbGNiICE9IHBfY2NiLT5wX2xjYikgewotICAgICAgcF9jY2IgPSBOVUxMOwotICAgIH0KLSAgfQotICByZXR1cm4gKHBfY2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgbDJjdV9zZXRfYWNsX2hjaV9oZWFkZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNldCBIQ0kgaGFuZGxlIGZvciBBQ0wgcGFja2V0Ci0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgbDJjdV9zZXRfYWNsX2hjaV9oZWFkZXIoQlRfSERSKiBwX2J1ZiwgdEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0KLSAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgbWludXMgNCBieXRlcyBmb3IgdGhlIHBhY2tldAotICAgKiBoZWFkZXIgKi8KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQgLSBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFOwotCi0gIGlmIChwX2NjYi0+cF9sY2ItPnRyYW5zcG9ydCA9PSBCVF9UUkFOU1BPUlRfTEUpIHsKLSAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIHBfY2NiLT5wX2xjYi0+SGFuZGxlKCkgfCAoTDJDQVBfUEtUX1NUQVJUX05PTl9GTFVTSEFCTEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTDJDQVBfUEtUX1RZUEVfU0hJRlQpKTsKLQotICAgIHVpbnQxNl90IGFjbF9kYXRhX3NpemUgPQotICAgICAgICBjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKS0+Z2V0X2FjbF9kYXRhX3NpemVfYmxlKCk7Ci0gICAgLyogVGhlIEhDSSB0cmFuc3BvcnQgd2lsbCBzZWdtZW50IHRoZSBidWZmZXJzLiAqLwotICAgIGlmIChwX2J1Zi0+bGVuID4gYWNsX2RhdGFfc2l6ZSkgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBhY2xfZGF0YV9zaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2J1Zi0+bGVuKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCgocF9idWYtPmxheWVyX3NwZWNpZmljICYgTDJDQVBfRkxVU0hBQkxFX01BU0spID09Ci0gICAgICAgICBMMkNBUF9GTFVTSEFCTEVfQ0hfQkFTRUQpICYmCi0gICAgICAgIChwX2NjYi0+aXNfZmx1c2hhYmxlKSkgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+cF9sY2ItPkhhbmRsZSgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMMkNBUF9QS1RfU1RBUlQgPDwgTDJDQVBfUEtUX1RZUEVfU0hJRlQpKTsKLSAgICB9IGVsc2UgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NjYi0+cF9sY2ItPkhhbmRsZSgpIHwgbDJjYi5ub25fZmx1c2hhYmxlX3BiZik7Ci0gICAgfQotCi0gICAgdWludDE2X3QgYWNsX2RhdGFfc2l6ZSA9Ci0gICAgICAgIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWNsX2RhdGFfc2l6ZV9jbGFzc2ljKCk7Ci0gICAgLyogVGhlIEhDSSB0cmFuc3BvcnQgd2lsbCBzZWdtZW50IHRoZSBidWZmZXJzLiAqLwotICAgIGlmIChwX2J1Zi0+bGVuID4gYWNsX2RhdGFfc2l6ZSkgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBhY2xfZGF0YV9zaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2J1Zi0+bGVuKTsKLSAgICB9Ci0gIH0KLSAgcF9idWYtPm9mZnNldCAtPSBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFOwotICBwX2J1Zi0+bGVuICs9IEhDSV9EQVRBX1BSRUFNQkxFX1NJWkU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfY29uZ2VzdGlvbl9zdGF0dXNfdG9fYWxsX2NsaWVudHModEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXR1cykgewotICBwX2NjYi0+Y29uZ19zZW50ID0gc3RhdHVzOwotCi0gIGlmIChwX2NjYi0+cF9yY2IgJiYgcF9jY2ItPnBfcmNiLT5hcGkucEwyQ0FfQ29uZ2VzdGlvblN0YXR1c19DYikgewotICAgIEwyQ0FQX1RSQUNFX0RFQlVHKAotICAgICAgICAiTDJDQVAgLSBDYWxsaW5nIENvbmdlc3Rpb25TdGF0dXNfQ2IgKCVkKSwgQ0lEOiAweCUwNHggIgotICAgICAgICAieG1pdF9ob2xkX3EuY291bnQ6ICV1ICBidWZmX3F1b3RhOiAldSIsCi0gICAgICAgIHN0YXR1cywgcF9jY2ItPmxvY2FsX2NpZCwgZml4ZWRfcXVldWVfbGVuZ3RoKHBfY2NiLT54bWl0X2hvbGRfcSksCi0gICAgICAgIHBfY2NiLT5idWZmX3F1b3RhKTsKLQotICAgIC8qIFByZXZlbnQgcmVjdXJzaXZlIGNhbGxpbmcgKi8KLSAgICBpZiAoc3RhdHVzID09IGZhbHNlKSBsMmNiLmlzX2NvbmdfY2JhY2tfY29udGV4dCA9IHRydWU7Ci0KLSAgICAoKnBfY2NiLT5wX3JjYi0+YXBpLnBMMkNBX0Nvbmdlc3Rpb25TdGF0dXNfQ2IpKHBfY2NiLT5sb2NhbF9jaWQsIHN0YXR1cyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IGZhbHNlKSBsMmNiLmlzX2NvbmdfY2JhY2tfY29udGV4dCA9IGZhbHNlOwotICB9Ci0gIGVsc2UgewotICAgIGZvciAodWludDhfdCB4eCA9IDA7IHh4IDwgTDJDQVBfTlVNX0ZJWEVEX0NITkxTOyB4eCsrKSB7Ci0gICAgICBpZiAocF9jY2ItPnBfbGNiLT5wX2ZpeGVkX2NjYnNbeHhdID09IHBfY2NiKSB7Ci0gICAgICAgIGlmIChsMmNiLmZpeGVkX3JlZ1t4eF0ucEwyQ0FfRml4ZWRDb25nX0NiICE9IE5VTEwpCi0gICAgICAgICAgKCpsMmNiLmZpeGVkX3JlZ1t4eF0ucEwyQ0FfRml4ZWRDb25nX0NiKShwX2NjYi0+cF9sY2ItPnJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qIGNoZWNrIGlmIGFueSBjaGFuZ2UgaW4gY29uZ2VzdGlvbiBzdGF0dXMgKi8KLXZvaWQgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24odEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIC8qIElmIHRoZSBDQ0IgcXVldWUgbGltaXQgaXMgc3ViamVjdCB0byBhIHF1b3RhLCBjaGVjayBmb3IgY29uZ2VzdGlvbiBpZiB0aGlzCi0gICAqIGNoYW5uZWwgaGFzIG91dGdvaW5nIHRyYWZmaWMgKi8KLSAgaWYgKHBfY2NiLT5idWZmX3F1b3RhID09IDApIHJldHVybjsKLQotICBzaXplX3QgcV9jb3VudCA9IGZpeGVkX3F1ZXVlX2xlbmd0aChwX2NjYi0+eG1pdF9ob2xkX3EpOwotCi0gIGlmIChwX2NjYi0+Y29uZ19zZW50KSB7Ci0gICAgLyogaWYgY2hhbm5lbCB3YXMgY29uZ2VzdGVkLCBidXQgaXMgbm90IGNvbmdlc3RlZCBub3csIHRlbGwgdGhlIGFwcCAqLwotICAgIGlmIChxX2NvdW50IDw9IChwX2NjYi0+YnVmZl9xdW90YSAvIDIpKQotICAgICAgc2VuZF9jb25nZXN0aW9uX3N0YXR1c190b19hbGxfY2xpZW50cyhwX2NjYiwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIC8qIGlmIGNoYW5uZWwgd2FzIG5vdCBjb25nZXN0ZWQsIGJ1dCBpcyBjb25nZXN0ZWQgbm93LCB0ZWxsIHRoZSBhcHAgKi8KLSAgICBpZiAocV9jb3VudCA+IHBfY2NiLT5idWZmX3F1b3RhKQotICAgICAgc2VuZF9jb25nZXN0aW9uX3N0YXR1c190b19hbGxfY2xpZW50cyhwX2NjYiwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGwyY3VfaXNfY2NiX2FjdGl2ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgaWYgQ2hhbm5lbCBDb250cm9sIEJsb2NrIGlzIGluIHVzZSBvciByZWxlYXNlZAotICoKLSAqIFJldHVybnMgICAgICAgICAgYm9vbCAgICAtIHRydWUgaWYgQ2hhbm5lbCBDb250cm9sIEJsb2NrIGlzIGluIHVzZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgcF9jY2IgaXMgbnVsbCBvciBpcyByZWxlYXNlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBsMmN1X2lzX2NjYl9hY3RpdmUodEwyQ19DQ0IqIHBfY2NiKSB7IHJldHVybiAocF9jY2IgJiYgcF9jY2ItPmluX3VzZSk7IH0KZGlmZiAtLWdpdCBhL3N0YWNrL21ldHJpY3Mvc3RhY2tfbWV0cmljc19sb2dnaW5nLmNjIGIvc3RhY2svbWV0cmljcy9zdGFja19tZXRyaWNzX2xvZ2dpbmcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yzc3MzkuLjAwMDAwMDAKLS0tIGEvc3RhY2svbWV0cmljcy9zdGFja19tZXRyaWNzX2xvZ2dpbmcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9tZXRyaWNzX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zdGFja19tZXRyaWNzX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIGxvZ19jbGFzc2ljX3BhaXJpbmdfZXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoYWRkcmVzcywgaGFuZGxlLCBoY2lfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lfZXZlbnQsIGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbl9jb2RlLCBldmVudF92YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgYmx1ZXRvb3RoOjpjb21tb246OkxvZ0NsYXNzaWNQYWlyaW5nRXZlbnQoYWRkcmVzcywgaGFuZGxlLCBoY2lfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9ldmVudCwgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25fY29kZSwgZXZlbnRfdmFsdWUpOwotICB9Ci19Ci0KLXZvaWQgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzLCB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LCB1aW50MTZfdCBoY2lfYmxlX2V2ZW50LAotICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlKSB7Ci0gIGlmIChibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkpIHsKLSAgICBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY0xpbmtMYXllckNvbm5lY3Rpb25FdmVudCgKLSAgICAgICAgYWRkcmVzcywgY29ubmVjdGlvbl9oYW5kbGUsIGRpcmVjdGlvbiwgbGlua190eXBlLCBoY2lfY21kLCBoY2lfZXZlbnQsCi0gICAgICAgIGhjaV9ibGVfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlKTsKLSAgfSBlbHNlIHsKLSAgICBibHVldG9vdGg6OmNvbW1vbjo6TG9nTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgICAgICBhZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSwgZGlyZWN0aW9uLCBsaW5rX3R5cGUsIGhjaV9jbWQsIGhjaV9ldmVudCwKLSAgICAgICAgaGNpX2JsZV9ldmVudCwgY21kX3N0YXR1cywgcmVhc29uX2NvZGUpOwotICB9Ci19Ci0KLXZvaWQgbG9nX3NtcF9wYWlyaW5nX2V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNtcF9mYWlsX3JlYXNvbikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNTbXBQYWlyaW5nRXZlbnQoYWRkcmVzcywgc21wX2NtZCwgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtcF9mYWlsX3JlYXNvbik7Ci0gIH0gZWxzZSB7Ci0gICAgYmx1ZXRvb3RoOjpjb21tb246OkxvZ1NtcFBhaXJpbmdFdmVudChhZGRyZXNzLCBzbXBfY21kLCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXBfZmFpbF9yZWFzb24pOwotICB9Ci19Ci0KLXZvaWQgbG9nX3NkcF9hdHRyaWJ1dGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cmlidXRlX2lkLCBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNTZHBBdHRyaWJ1dGUoYWRkcmVzcywgcHJvdG9jb2xfdXVpZCwgYXR0cmlidXRlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9zaXplLCBhdHRyaWJ1dGVfdmFsdWUpOwotICB9IGVsc2UgewotICAgIGJsdWV0b290aDo6Y29tbW9uOjpMb2dTZHBBdHRyaWJ1dGUoYWRkcmVzcywgcHJvdG9jb2xfdXVpZCwgYXR0cmlidXRlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3NpemUsIGF0dHJpYnV0ZV92YWx1ZSk7Ci0gIH0KLX0KLQotdm9pZCBsb2dfbWFudWZhY3R1cmVyX2luZm8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbikgewotICBpZiAoYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpKSB7Ci0gICAgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNNYW51ZmFjdHVyZXJJbmZvKAotICAgICAgICBhZGRyZXNzLCBzb3VyY2VfdHlwZSwgc291cmNlX25hbWUsIG1hbnVmYWN0dXJlciwgbW9kZWwsCi0gICAgICAgIGhhcmR3YXJlX3ZlcnNpb24sIHNvZnR3YXJlX3ZlcnNpb24pOwotICB9IGVsc2UgewotICAgIGJsdWV0b290aDo6Y29tbW9uOjpMb2dNYW51ZmFjdHVyZXJJbmZvKGFkZHJlc3MsIHNvdXJjZV90eXBlLCBzb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXIsIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlX3ZlcnNpb24sIHNvZnR3YXJlX3ZlcnNpb24pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3RhY2svcGFuL3Bhbl9hcGkuY2MgYi9zdGFjay9wYW4vcGFuX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjNTNmZi4uMDAwMDAwMAotLS0gYS9zdGFjay9wYW4vcGFuX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDcwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1haW4gZnVuY3Rpb25zIHRvIHN1cHBvcnQgUEFOIHByb2ZpbGUKLSAqICBjb21tYW5kcyBhbmQgZXZlbnRzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcGFuX2FwaS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibmVwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fbG9nX2hpc3RvcnkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcGRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9wYW4vcGFuX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1uYW1lc3BhY2UgewotY29uc3RleHByIGNoYXIga0J0bUxvZ1RhZ1tdID0gIlBBTiI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fUmVnaXN0ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byByZWdpc3RlcgotICogICAgICAgICAgICAgICAgICBpdHMgY2FsbGJhY2tzIHdpdGggUEFOIHByb2ZpbGUuIFRoZSBhcHBsaWNhdGlvbiB0aGVuCi0gKiAgICAgICAgICAgICAgICAgIHNob3VsZCBzZXQgdGhlIFBBTiByb2xlIGV4cGxpY2l0bHkuCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX3JlZ2lzdGVyIC0gY29udGFpbnMgYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBBTl9SZWdpc3Rlcih0UEFOX1JFR0lTVEVSKiBwX3JlZ2lzdGVyKSB7Ci0gIGlmICghcF9yZWdpc3RlcikgcmV0dXJuOwotCi0gIHBhbl9yZWdpc3Rlcl93aXRoX2JuZXAoKTsKLQotICBwYW5fY2IucGFuX2Nvbm5fc3RhdGVfY2IgPSBwX3JlZ2lzdGVyLT5wYW5fY29ubl9zdGF0ZV9jYjsKLSAgcGFuX2NiLnBhbl9icmlkZ2VfcmVxX2NiID0gcF9yZWdpc3Rlci0+cGFuX2JyaWRnZV9yZXFfY2I7Ci0gIHBhbl9jYi5wYW5fZGF0YV9idWZfaW5kX2NiID0gcF9yZWdpc3Rlci0+cGFuX2RhdGFfYnVmX2luZF9jYjsKLSAgcGFuX2NiLnBhbl9kYXRhX2luZF9jYiA9IHBfcmVnaXN0ZXItPnBhbl9kYXRhX2luZF9jYjsKLSAgcGFuX2NiLnBhbl9wZmlsdF9pbmRfY2IgPSBwX3JlZ2lzdGVyLT5wYW5fcGZpbHRfaW5kX2NiOwotICBwYW5fY2IucGFuX21maWx0X2luZF9jYiA9IHBfcmVnaXN0ZXItPnBhbl9tZmlsdF9pbmRfY2I7Ci0gIHBhbl9jYi5wYW5fdHhfZGF0YV9mbG93X2NiID0gcF9yZWdpc3Rlci0+cGFuX3R4X2RhdGFfZmxvd19jYjsKLQotICBCVE1fTG9nSGlzdG9yeShrQnRtTG9nVGFnLCBSYXdBZGRyZXNzOjprRW1wdHksICJSZWdpc3RlcmVkIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fRGVyZWdpc3RlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGRlLXJlZ2lzdGVyCi0gKiAgICAgICAgICAgICAgICAgIGl0cyBjYWxsYmFja3Mgd2l0aCBQQU4gcHJvZmlsZS4gVGhpcyB3aWxsIG1ha2UgdGhlIFBBTiB0bwotICogICAgICAgICAgICAgICAgICBiZWNvbWUgaW5hY3RpdmUuIFRoaXMgd2lsbCBkZXJlZ2lzdGVyIFBBTiBzZXJ2aWNlcyBmcm9tIFNEUAotICogICAgICAgICAgICAgICAgICBhbmQgY2xvc2UgYWxsIGFjdGl2ZSBjb25uZWN0aW9ucwotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgbm9uZQotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQQU5fRGVyZWdpc3Rlcih2b2lkKSB7Ci0gIHBhbl9jYi5wYW5fYnJpZGdlX3JlcV9jYiA9IE5VTEw7Ci0gIHBhbl9jYi5wYW5fZGF0YV9idWZfaW5kX2NiID0gTlVMTDsKLSAgcGFuX2NiLnBhbl9kYXRhX2luZF9jYiA9IE5VTEw7Ci0gIHBhbl9jYi5wYW5fY29ubl9zdGF0ZV9jYiA9IE5VTEw7Ci0gIHBhbl9jYi5wYW5fcGZpbHRfaW5kX2NiID0gTlVMTDsKLSAgcGFuX2NiLnBhbl9tZmlsdF9pbmRfY2IgPSBOVUxMOwotCi0gIFBBTl9TZXRSb2xlKFBBTl9ST0xFX0lOQUNUSVZFLCBOVUxMLCBOVUxMKTsKLSAgQk5FUF9EZXJlZ2lzdGVyKCk7Ci0KLSAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgUmF3QWRkcmVzczo6a0VtcHR5LCAiVW5yZWdpc3RlcmVkIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fU2V0Um9sZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCB0aGUgUEFOCi0gKiAgICAgICAgICAgICAgICAgIHByb2ZpbGUgcm9sZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFBBTl9SZWdpc3Rlci4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgY2FsbGVkIGFueSB0aW1lIHRvIGNoYW5nZSB0aGUgUEFOIHJvbGUKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHJvbGUgICAgICAgIC0gaXMgYml0IG1hcCBvZiByb2xlcyB0byBiZSBhY3RpdmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5fUk9MRV9DTElFTlQgaXMgZm9yIFBBTlUgcm9sZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTl9ST0xFX05BUF9TRVJWRVIgaXMgZm9yIE5BUCByb2xlCi0gKiAgICAgICAgICAgICAgICAgIHBfdXNlcl9uYW1lIC0gU2VydmljZSBuYW1lIGZvciBQQU5VIHJvbGUKLSAqICAgICAgICAgICAgICAgICAgcF9uYXBfbmFtZSAgLSBTZXJ2aWNlIG5hbWUgZm9yIE5BUCByb2xlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIE5VTEwgaWYgdXNlciB3YW50cyB0aGUgZGVmYXVsdAotICoKLSAqIFJldHVybnMgICAgICAgICAgUEFOX1NVQ0NFU1MgICAgIC0gaWYgdGhlIHJvbGUgaXMgc2V0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBQQU5fRkFJTFVSRSAgICAgLSBpZiB0aGUgcm9sZSBpcyBub3QgdmFsaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFBBTl9SRVNVTFQgUEFOX1NldFJvbGUodWludDhfdCByb2xlLCBjb25zdCBjaGFyKiBwX3VzZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfbmFwX25hbWUpIHsKLSAgLyogQ2hlY2sgaWYgaXQgaXMgYSBzaHV0ZG93biByZXF1ZXN0ICovCi0gIGlmIChyb2xlID09IFBBTl9ST0xFX0lOQUNUSVZFKSB7Ci0gICAgcGFuX2Nsb3NlX2FsbF9jb25uZWN0aW9ucygpOwotICAgIHBhbl9jYi5yb2xlID0gcm9sZTsKLSAgICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBwX2Rlc2M7Ci0KLSAgLyogSWYgdGhlIHJvbGUgaXMgbm90IGEgdmFsaWQgY29tYmluYXRpb24gcmVqZWN0IGl0ICovCi0gIGlmICgoIShyb2xlICYgKFBBTl9ST0xFX0NMSUVOVCB8IFBBTl9ST0xFX05BUF9TRVJWRVIpKSkgJiYKLSAgICAgIHJvbGUgIT0gUEFOX1JPTEVfSU5BQ1RJVkUpIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTiByb2xlICVkIGlzIGludmFsaWQiLCByb2xlKTsKLSAgICByZXR1cm4gUEFOX0ZBSUxVUkU7Ci0gIH0KLQotICAvKiBJZiB0aGUgY3VycmVudCBhY3RpdmUgcm9sZSBpcyBzYW1lIGFzIHRoZSByb2xlIGJlaW5nIHNldCBkbyBub3RoaW5nICovCi0gIGlmIChwYW5fY2Iucm9sZSA9PSByb2xlKSB7Ci0gICAgUEFOX1RSQUNFX0VWRU5UKCJQQU4gcm9sZSBhbHJlYWR5IHdhcyBzZXQgdG86ICVkIiwgcm9sZSk7Ci0gICAgcmV0dXJuIFBBTl9TVUNDRVNTOwotICB9Ci0KLSAgLyogUmVnaXN0ZXIgYWxsIHRoZSByb2xlcyB3aXRoIFNEUCAqLwotICBQQU5fVFJBQ0VfQVBJKCJQQU5fU2V0Um9sZSgpIGNhbGxlZCB3aXRoIHJvbGUgMHgleCIsIHJvbGUpOwotICBpZiAocm9sZSAmIFBBTl9ST0xFX05BUF9TRVJWRVIpIHsKLSAgICAvKiBDaGVjayB0aGUgc2VydmljZSBuYW1lICovCi0gICAgaWYgKChwX25hcF9uYW1lID09IE5VTEwpIHx8ICgqcF9uYXBfbmFtZSA9PSAwKSkKLSAgICAgIHBfbmFwX25hbWUgPSBQQU5fTkFQX0RFRkFVTFRfU0VSVklDRV9OQU1FOwotCi0gICAgLyogUmVnaXN0ZXJpbmcgZm9yIE5BUCBzZXJ2aWNlIHdpdGggU0RQICovCi0gICAgcF9kZXNjID0gUEFOX05BUF9ERUZBVUxUX0RFU0NSSVBUSU9OOwotCi0gICAgaWYgKHBhbl9jYi5wYW5fbmFwX3NkcF9oYW5kbGUgIT0gMCkKLSAgICAgIFNEUF9EZWxldGVSZWNvcmQocGFuX2NiLnBhbl9uYXBfc2RwX2hhbmRsZSk7Ci0KLSAgICBwYW5fY2IucGFuX25hcF9zZHBfaGFuZGxlID0KLSAgICAgICAgcGFuX3JlZ2lzdGVyX3dpdGhfc2RwKFVVSURfU0VSVkNMQVNTX05BUCwgcF9uYXBfbmFtZSwgcF9kZXNjKTsKLSAgICBidGFfc3lzX2FkZF91dWlkKFVVSURfU0VSVkNMQVNTX05BUCk7Ci0gIH0KLSAgLyogSWYgdGhlIE5BUCByb2xlIGlzIGFscmVhZHkgYWN0aXZlIGFuZCBub3cgYmVpbmcgY2xlYXJlZCBkZWxldGUgdGhlIHJlY29yZAotICAgKi8KLSAgZWxzZSBpZiAocGFuX2NiLnJvbGUgJiBQQU5fUk9MRV9OQVBfU0VSVkVSKSB7Ci0gICAgaWYgKHBhbl9jYi5wYW5fbmFwX3NkcF9oYW5kbGUgIT0gMCkgewotICAgICAgU0RQX0RlbGV0ZVJlY29yZChwYW5fY2IucGFuX25hcF9zZHBfaGFuZGxlKTsKLSAgICAgIHBhbl9jYi5wYW5fbmFwX3NkcF9oYW5kbGUgPSAwOwotICAgICAgYnRhX3N5c19yZW1vdmVfdXVpZChVVUlEX1NFUlZDTEFTU19OQVApOwotICAgIH0KLSAgfQotCi0gIGlmIChyb2xlICYgUEFOX1JPTEVfQ0xJRU5UKSB7Ci0gICAgLyogQ2hlY2sgdGhlIHNlcnZpY2UgbmFtZSAqLwotICAgIGlmICgocF91c2VyX25hbWUgPT0gTlVMTCkgfHwgKCpwX3VzZXJfbmFtZSA9PSAwKSkKLSAgICAgIHBfdXNlcl9uYW1lID0gUEFOX1BBTlVfREVGQVVMVF9TRVJWSUNFX05BTUU7Ci0KLSAgICAvKiBSZWdpc3RlcmluZyBmb3IgUEFOVSBzZXJ2aWNlIHdpdGggU0RQICovCi0gICAgcF9kZXNjID0gUEFOX1BBTlVfREVGQVVMVF9ERVNDUklQVElPTjsKLSAgICBpZiAocGFuX2NiLnBhbl91c2VyX3NkcF9oYW5kbGUgIT0gMCkKLSAgICAgIFNEUF9EZWxldGVSZWNvcmQocGFuX2NiLnBhbl91c2VyX3NkcF9oYW5kbGUpOwotCi0gICAgcGFuX2NiLnBhbl91c2VyX3NkcF9oYW5kbGUgPQotICAgICAgICBwYW5fcmVnaXN0ZXJfd2l0aF9zZHAoVVVJRF9TRVJWQ0xBU1NfUEFOVSwgcF91c2VyX25hbWUsIHBfZGVzYyk7Ci0gICAgYnRhX3N5c19hZGRfdXVpZChVVUlEX1NFUlZDTEFTU19QQU5VKTsKLSAgfQotICAvKiBJZiB0aGUgUEFOVSByb2xlIGlzIGFscmVhZHkgYWN0aXZlIGFuZCBub3cgYmVpbmcgY2xlYXJlZCBkZWxldGUgdGhlIHJlY29yZAotICAgKi8KLSAgZWxzZSBpZiAocGFuX2NiLnJvbGUgJiBQQU5fUk9MRV9DTElFTlQpIHsKLSAgICBpZiAocGFuX2NiLnBhbl91c2VyX3NkcF9oYW5kbGUgIT0gMCkgewotICAgICAgU0RQX0RlbGV0ZVJlY29yZChwYW5fY2IucGFuX3VzZXJfc2RwX2hhbmRsZSk7Ci0gICAgICBwYW5fY2IucGFuX3VzZXJfc2RwX2hhbmRsZSA9IDA7Ci0gICAgICBidGFfc3lzX3JlbW92ZV91dWlkKFVVSURfU0VSVkNMQVNTX1BBTlUpOwotICAgIH0KLSAgfQotCi0gIHBhbl9jYi5yb2xlID0gcm9sZTsKLSAgUEFOX1RSQUNFX0VWRU5UKCJQQU4gcm9sZSBzZXQgdG86ICVkIiwgcm9sZSk7Ci0KLSAgQlRNX0xvZ0hpc3Rvcnkoa0J0bUxvZ1RhZywgUmF3QWRkcmVzczo6a0VtcHR5LCAiUm9sZSBjaGFuZ2UiLAotICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoInJvbGU6MHgleCIsIHJvbGUpKTsKLSAgcmV0dXJuIFBBTl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX0Nvbm5lY3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBpbml0aWF0ZSBhCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBkZXZpY2UKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHJlbV9iZGEgICAgIC0gQkQgQWRkciBvZiB0aGUgcmVtb3RlIGRldmljZQotICogICAgICAgICAgICAgICAgICBzcmNfcm9sZSAgICAtIFJvbGUgb2YgdGhlIGxvY2FsIGRldmljZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgZHN0X3JvbGUgICAgLSBSb2xlIG9mIHRoZSByZW1vdGUgZGV2aWNlIGZvciB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTl9ST0xFX0NMSUVOVCBpcyBmb3IgUEFOVSByb2xlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFOX1JPTEVfTkFQX1NFUlZFUiBpcyBmb3IgTkFQIHJvbGUKLSAqICAgICAgICAgICAgICAgICAgKmhhbmRsZSAgICAgLSBQb2ludGVyIGZvciByZXR1cm5pbmcgSGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW5pdGlhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgUEFOX05PX1JFU09VUkNFUyAtIHJlc291cmNlcyBhcmUgbm90IHN1ZmZpY2VudAotICogICAgICAgICAgICAgICAgICBQQU5fRkFJTFVSRSAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gY2Fubm90IGJlIGluaXRpYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBjYW4gYmUgYmVjYXVzZSBvZiB0aGUgY29tYmluYXRpb24gb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyBhbmQgZHN0IHJvbGVzIG1heSBub3QgYmUgdmFsaWQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgYXQgdGhhdCBwb2ludCBvZiB0aW1lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRQQU5fUkVTVUxUIFBBTl9Db25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHRQQU5fUk9MRSBzcmNfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRQQU5fUk9MRSBkc3Rfcm9sZSwgdWludDE2X3QqIGhhbmRsZSkgewotICB1aW50MzJfdCBteF9jaGFuX2lkOwotCi0gIC8qCi0gICoqIEluaXRpYWxpemUgdGhlIGhhbmRsZSBzbyB0aGF0IGluIGNhc2Ugb2YgZmFpbHVyZSByZXR1cm4gdmFsdWVzCi0gICoqIHRoZSBwcm9maWxlIHdpbGwgbm90IGdldCBjb25mdXNlZAotICAqLwotICAqaGFuZGxlID0gQk5FUF9JTlZBTElEX0hBTkRMRTsKLQotICAvKiBDaGVjayBpZiBQQU4gaXMgYWN0aXZlIG9yIG5vdCAqLwotICBpZiAoIShwYW5fY2Iucm9sZSAmIHNyY19yb2xlKSkgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIGlzIG5vdCBhY3RpdmUgZm9yIHRoZSByb2xlICVkIiwgc3JjX3JvbGUpOwotICAgIHJldHVybiBQQU5fRkFJTFVSRTsKLSAgfQotCi0gIC8qIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBwcm9jZWVkaW5nICovCi0gIGlmICgoc3JjX3JvbGUgIT0gUEFOX1JPTEVfQ0xJRU5UICYmIHNyY19yb2xlICE9IFBBTl9ST0xFX05BUF9TRVJWRVIpIHx8Ci0gICAgICAoZHN0X3JvbGUgIT0gUEFOX1JPTEVfQ0xJRU5UICYmIGRzdF9yb2xlICE9IFBBTl9ST0xFX05BUF9TRVJWRVIpKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCJFaXRoZXIgc291cmNlICVkIG9yIGRlc3RpbmF0aW9uIHJvbGUgJWQgaXMgaW52YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgIHNyY19yb2xlLCBkc3Rfcm9sZSk7Ci0gICAgcmV0dXJuIFBBTl9GQUlMVVJFOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgY29ubmVjdGlvbiBleGlzdHMgZm9yIHRoaXMgcmVtb3RlIGRldmljZSAqLwotICB0UEFOX0NPTk4qIHBjYiA9IHBhbl9nZXRfcGNiX2J5X2FkZHIocmVtX2JkYSk7Ci0KLSAgdWludDE2X3Qgc3JjX3V1aWQsIGRzdF91dWlkOwotICAvKiBJZiB3ZSBhcmUgUEFOVSBmb3IgdGhpcyByb2xlIHZhbGlkYXRlIGRlc3RpbmF0aW9uIHJvbGUgKi8KLSAgaWYgKHNyY19yb2xlID09IFBBTl9ST0xFX0NMSUVOVCkgewotICAgIGlmICgocGFuX2NiLm51bV9jb25ucyA+IDEpIHx8IChwYW5fY2IubnVtX2Nvbm5zICYmICghcGNiKSkpIHsKLSAgICAgIC8qCi0gICAgICAqKiBJZiB0aGUgcmVxdWVzdCBpcyBub3QgZm9yIGV4aXN0aW5nIGNvbm5lY3Rpb24gcmVqZWN0IGl0Ci0gICAgICAqKiBiZWNhdXNlIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIHdlIGNhbm5vdCBhY2NlcHQKLSAgICAgICoqIGFub3RoZXIgY29ubmVjdGlvbiBpbiBQQU5VIHJvbGUKLSAgICAgICovCi0gICAgICBQQU5fVFJBQ0VfRVJST1IoCi0gICAgICAgICAgIkNhbm5vdCBtYWtlIFBBTlUgY29ubmVjdGlvbnMgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSAiCi0gICAgICAgICAgImNvbm5lY3Rpb24iKTsKLSAgICAgIHJldHVybiBQQU5fSU5WQUxJRF9TUkNfUk9MRTsKLSAgICB9Ci0KLSAgICBzcmNfdXVpZCA9IFVVSURfU0VSVkNMQVNTX1BBTlU7Ci0gICAgaWYgKGRzdF9yb2xlID09IFBBTl9ST0xFX0NMSUVOVCkgewotICAgICAgZHN0X3V1aWQgPSBVVUlEX1NFUlZDTEFTU19QQU5VOwotICAgIH0gZWxzZSB7Ci0gICAgICBkc3RfdXVpZCA9IFVVSURfU0VSVkNMQVNTX05BUDsKLSAgICB9Ci0gICAgbXhfY2hhbl9pZCA9IGRzdF91dWlkOwotICB9Ci0gIC8qIElmIGRlc3RpbmF0aW9uIGlzIFBBTlUgcm9sZSB2YWxpZGF0ZSBzb3VyY2Ugcm9sZSAqLwotICBlbHNlIGlmIChkc3Rfcm9sZSA9PSBQQU5fUk9MRV9DTElFTlQpIHsKLSAgICBpZiAocGFuX2NiLm51bV9jb25ucyAmJiBwYW5fY2IuYWN0aXZlX3JvbGUgPT0gUEFOX1JPTEVfQ0xJRU5UICYmICFwY2IpIHsKLSAgICAgIFBBTl9UUkFDRV9FUlJPUigiRGV2aWNlIGFscmVhZHkgaGF2ZSBhIGNvbm5lY3Rpb24gaW4gUEFOVSByb2xlIik7Ci0gICAgICByZXR1cm4gUEFOX0lOVkFMSURfU1JDX1JPTEU7Ci0gICAgfQotCi0gICAgZHN0X3V1aWQgPSBVVUlEX1NFUlZDTEFTU19QQU5VOwotICAgIHNyY191dWlkID0gVVVJRF9TRVJWQ0xBU1NfTkFQOwotICAgIG14X2NoYW5faWQgPSBzcmNfdXVpZDsKLSAgfQotICAvKiBUaGUgcm9sZSBjb21iaW5hdGlvbiBpcyBub3QgdmFsaWQgKi8KLSAgZWxzZSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKAotICAgICAgICAiU291cmNlICVkIGFuZCBEZXN0aW5hdGlvbiByb2xlcyAlZCBhcmUgbm90IHZhbGlkIGNvbWJpbmF0aW9uIiwKLSAgICAgICAgc3JjX3JvbGUsIGRzdF9yb2xlKTsKLSAgICByZXR1cm4gUEFOX0ZBSUxVUkU7Ci0gIH0KLQotICAvKiBBbGxvY2F0ZSBjb250cm9sIGJsb2NrIGFuZCBpbml0aWF0ZSBjb25uZWN0aW9uICovCi0gIGlmICghcGNiKSBwY2IgPSBwYW5fYWxsb2NhdGVfcGNiKHJlbV9iZGEsIEJORVBfSU5WQUxJRF9IQU5ETEUpOwotICBpZiAoIXBjYikgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIENvbm5lY3Rpb24gZmFpbGVkIGJlY2F1c2Ugb2Ygbm8gcmVzb3VyY2VzIik7Ci0gICAgcmV0dXJuIFBBTl9OT19SRVNPVVJDRVM7Ci0gIH0KLQotICBWTE9HKDApIDw8IF9fZnVuY19fIDw8ICIgZm9yIEJEIEFkZHI6ICIgPDwgcmVtX2JkYTsKLSAgaWYgKHBjYi0+Y29uX3N0YXRlID09IFBBTl9TVEFURV9JRExFKSB7Ci0gICAgcGFuX2NiLm51bV9jb25ucysrOwotICB9IGVsc2UgaWYgKHBjYi0+Y29uX3N0YXRlID09IFBBTl9TVEFURV9DT05ORUNURUQpIHsKLSAgICBwY2ItPmNvbl9mbGFncyB8PSBQQU5fRkxBR1NfQ09OTl9DT01QTEVURUQ7Ci0gIH0gZWxzZQotICAgIC8qIFBBTiBjb25uZWN0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzICovCi0gICAgcmV0dXJuIFBBTl9XUk9OR19TVEFURTsKLQotICBwY2ItPmNvbl9zdGF0ZSA9IFBBTl9TVEFURV9DT05OX1NUQVJUOwotICBwY2ItPnBydl9zcmNfdXVpZCA9IHBjYi0+c3JjX3V1aWQ7Ci0gIHBjYi0+cHJ2X2RzdF91dWlkID0gcGNiLT5kc3RfdXVpZDsKLQotICBwY2ItPnNyY191dWlkID0gc3JjX3V1aWQ7Ci0gIHBjYi0+ZHN0X3V1aWQgPSBkc3RfdXVpZDsKLQotICB0Qk5FUF9SRVNVTFQgcmV0ID0KLSAgICAgIEJORVBfQ29ubmVjdChyZW1fYmRhLCBVdWlkOjpGcm9tMTZCaXQoc3JjX3V1aWQpLAotICAgICAgICAgICAgICAgICAgIFV1aWQ6OkZyb20xNkJpdChkc3RfdXVpZCksICYocGNiLT5oYW5kbGUpLCBteF9jaGFuX2lkKTsKLSAgaWYgKHJldCAhPSBCTkVQX1NVQ0NFU1MpIHsKLSAgICBwYW5fcmVsZWFzZV9wY2IocGNiKTsKLSAgICByZXR1cm4gKHRQQU5fUkVTVUxUKXJldDsKLSAgfQotCi0gIFBBTl9UUkFDRV9ERUJVRygiUEFOX0Nvbm5lY3QoKSBjdXJyZW50IGFjdGl2ZSByb2xlIHNldCB0byAlZCIsIHNyY19yb2xlKTsKLSAgcGFuX2NiLnBydl9hY3RpdmVfcm9sZSA9IHBhbl9jYi5hY3RpdmVfcm9sZTsKLSAgcGFuX2NiLmFjdGl2ZV9yb2xlID0gc3JjX3JvbGU7Ci0gICpoYW5kbGUgPSBwY2ItPmhhbmRsZTsKLQotICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fRGlzY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyB1c2VkIHRvIGRpc2Nvbm5lY3QgdGhlIGNvbm5lY3Rpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBQQU5fRkFJTFVSRSAgICAgIC0gaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGZvdW5kIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhbiBlcnJvciBpbiBkaXNjb25uZWN0aW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRQQU5fUkVTVUxUIFBBTl9EaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSkgewotICB0UEFOX0NPTk4qIHBjYjsKLSAgdEJORVBfUkVTVUxUIHJlc3VsdDsKLQotICAvKiBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBleGlzdHMgKi8KLSAgcGNiID0gcGFuX2dldF9wY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIGlmICghcGNiKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gY29ubmVjdGlvbiBub3QgZm91bmQgZm9yIHRoZSBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIHJldHVybiBQQU5fRkFJTFVSRTsKLSAgfQotCi0gIHJlc3VsdCA9IEJORVBfRGlzY29ubmVjdChwY2ItPmhhbmRsZSk7Ci0gIGlmIChwY2ItPmNvbl9zdGF0ZSAhPSBQQU5fU1RBVEVfSURMRSkgcGFuX2NiLm51bV9jb25ucy0tOwotCi0gIGlmIChwYW5fY2IucGFuX2JyaWRnZV9yZXFfY2IgJiYgcGNiLT5zcmNfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19OQVApCi0gICAgKCpwYW5fY2IucGFuX2JyaWRnZV9yZXFfY2IpKHBjYi0+cmVtX2JkYSwgZmFsc2UpOwotCi0gIEJUTV9Mb2dIaXN0b3J5KGtCdG1Mb2dUYWcsIHBjYi0+cmVtX2JkYSwgIkRpc2Nvbm5lY3QiKTsKLQotICBwYW5fcmVsZWFzZV9wY2IocGNiKTsKLQotICBpZiAocmVzdWx0ICE9IEJORVBfU1VDQ0VTUykgewotICAgIFBBTl9UUkFDRV9FVkVOVCgiRXJyb3IgaW4gY2xvc2luZyBQQU4gY29ubmVjdGlvbiIpOwotICAgIHJldHVybiBQQU5fRkFJTFVSRTsKLSAgfQotCi0gIFBBTl9UUkFDRV9FVkVOVCgiUEFOIGNvbm5lY3Rpb24gY2xvc2VkIik7Ci0gIHJldHVybiBQQU5fU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBBTl9Xcml0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBzZW5kcyBkYXRhIG92ZXIgdGhlIFBBTiBjb25uZWN0aW9ucy4gSWYgdGhpcyBpcyBjYWxsZWQKLSAqICAgICAgICAgICAgICAgICAgb24gR04gb3IgTkFQIHNpZGUgYW5kIHRoZSBwYWNrZXQgaXMgbXVsdGljYXN0IG9yIGJyb2FkY2FzdAotICogICAgICAgICAgICAgICAgICBpdCB3aWxsIGJlIHNlbnQgb24gYWxsIHRoZSBsaW5rcy4gT3RoZXJ3aXNlIHRoZSBjb3JyZWN0IGxpbmsKLSAqICAgICAgICAgICAgICAgICAgaXMgZm91bmQgYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGZvcndhcmRlZCBvbgotICogICAgICAgICAgICAgICAgICBpdC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgIC0gaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBkc3QgICAgICAtIE1BQyBvciBCRCBBZGRyIG9mIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgc3JjICAgICAgLSBNQUMgb3IgQkQgQWRkciBvZiB0aGUgc291cmNlIHdobyBzZW50IHRoaXMgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIHByb3RvY29sIC0gcHJvdG9jb2wgb2YgdGhlIGV0aGVybmV0IHBhY2tldCBsaWtlIElQIG9yIEFSUAotICogICAgICAgICAgICAgICAgICBwX2RhdGEgICAtIHBvaW50ZXIgdG8gdGhlIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgbGVuICAgICAgLSBsZW5ndGggb2YgdGhlIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgZXh0ICAgICAgLSB0byBpbmRpY2F0ZSB0aGF0IGV4dGVuc2lvbiBoZWFkZXJzIHByZXNlbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBBTl9TVUNDRVNTICAgICAgIC0gaWYgdGhlIGRhdGEgaXMgc2VudCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgUEFOX0ZBSUxVUkUgICAgICAgLSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgZm91bmQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yIGluIHNlbmRpbmcgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10UEFOX1JFU1VMVCBQQU5fV3JpdGUodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgc3JjLCB1aW50MTZfdCBwcm90b2NvbCwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgYm9vbCBleHQpIHsKLSAgaWYgKHBhbl9jYi5yb2xlID09IFBBTl9ST0xFX0lOQUNUSVZFIHx8ICFwYW5fY2IubnVtX2Nvbm5zKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCIlcyBQQU4gaXMgbm90IGFjdGl2ZSwgZGF0YSB3cml0ZSBmYWlsZWQuIiwgX19mdW5jX18pOwotICAgIHJldHVybiBQQU5fRkFJTFVSRTsKLSAgfQotCi0gIC8vIElmIHRoZSBwYWNrZXQgaXMgYnJvYWRjYXN0IG9yIG11bHRpY2FzdCwgd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBjcmVhdGUKLSAgLy8gYSBjb3B5IG9mIHRoZSBwYWNrZXQgZm9yIGVhY2ggY29ubmVjdGlvbi4gV2UgY2FuIHNhdmUgb25lIGV4dHJhIGNvcHkKLSAgLy8gYnkgZmFzdC1wYXRoaW5nIGhlcmUgYW5kIGNhbGxpbmcgQk5FUF9Xcml0ZSBpbnN0ZWFkIG9mIHBsYWNpbmcgdGhlIHBhY2tldAotICAvLyBpbiBhIEJUX0hEUiBidWZmZXIsIGNhbGxpbmcgQk5FUF9Xcml0ZSwgYW5kIHRoZW4gZnJlZWluZyB0aGUgYnVmZmVyLgotICBpZiAoZHN0LmFkZHJlc3NbMF0gJiAweDAxKSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7ICsraSkgewotICAgICAgaWYgKHBhbl9jYi5wY2JbaV0uY29uX3N0YXRlID09IFBBTl9TVEFURV9DT05ORUNURUQpCi0gICAgICAgIEJORVBfV3JpdGUocGFuX2NiLnBjYltpXS5oYW5kbGUsIGRzdCwgcF9kYXRhLCBsZW4sIHByb3RvY29sLCAmc3JjLCBleHQpOwotICAgIH0KLSAgICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci0gIH0KLQotICBCVF9IRFIqIGJ1ZmZlciA9IChCVF9IRFIqKW9zaV9tYWxsb2MoUEFOX0JVRl9TSVpFKTsKLSAgYnVmZmVyLT5sZW4gPSBsZW47Ci0gIGJ1ZmZlci0+b2Zmc2V0ID0gUEFOX01JTklNVU1fT0ZGU0VUOwotICBtZW1jcHkoKHVpbnQ4X3QqKWJ1ZmZlciArIHNpemVvZihCVF9IRFIpICsgYnVmZmVyLT5vZmZzZXQsIHBfZGF0YSwKLSAgICAgICAgIGJ1ZmZlci0+bGVuKTsKLQotICByZXR1cm4gUEFOX1dyaXRlQnVmKGhhbmRsZSwgZHN0LCBzcmMsIHByb3RvY29sLCBidWZmZXIsIGV4dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fV3JpdGVCdWYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgc2VuZHMgZGF0YSBvdmVyIHRoZSBQQU4gY29ubmVjdGlvbnMuIElmIHRoaXMgaXMgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIG9uIEdOIG9yIE5BUCBzaWRlIGFuZCB0aGUgcGFja2V0IGlzIG11bHRpY2FzdCBvciBicm9hZGNhc3QKLSAqICAgICAgICAgICAgICAgICAgaXQgd2lsbCBiZSBzZW50IG9uIGFsbCB0aGUgbGlua3MuIE90aGVyd2lzZSB0aGUgY29ycmVjdCBsaW5rCi0gKiAgICAgICAgICAgICAgICAgIGlzIGZvdW5kIGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBmb3J3YXJkZWQgb24KLSAqICAgICAgICAgICAgICAgICAgaXQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IFBBTl9TVUNDRVNTLCB0aGUgYXBwbGljYXRpb24KLSAqICAgICAgICAgICAgICAgICAgc2hvdWxkIHRha2UgY2FyZSBvZiByZWxlYXNpbmcgdGhlIG1lc3NhZ2UgYnVmZmVyLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGRzdCAgICAgIC0gTUFDIG9yIEJEIEFkZHIgb2YgdGhlIGRlc3RpbmF0aW9uIGRldmljZQotICogICAgICAgICAgICAgICAgICBzcmMgICAgICAtIE1BQyBvciBCRCBBZGRyIG9mIHRoZSBzb3VyY2Ugd2hvIHNlbnQgdGhpcyBwYWNrZXQKLSAqICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgLSBwcm90b2NvbCBvZiB0aGUgZXRoZXJuZXQgcGFja2V0IGxpa2UgSVAgb3IgQVJQCi0gKiAgICAgICAgICAgICAgICAgIHBfYnVmICAgIC0gcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgZXh0ICAgICAgLSB0byBpbmRpY2F0ZSB0aGF0IGV4dGVuc2lvbiBoZWFkZXJzIHByZXNlbnQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBBTl9TVUNDRVNTICAgICAgIC0gaWYgdGhlIGRhdGEgaXMgc2VudCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgUEFOX0ZBSUxVUkUgICAgICAgLSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgZm91bmQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGVycm9yIGluIHNlbmRpbmcgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10UEFOX1JFU1VMVCBQQU5fV3JpdGVCdWYodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgc3JjLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCBib29sIGV4dCkgewotICB0UEFOX0NPTk4qIHBjYjsKLSAgdWludDE2X3QgaTsKLSAgdEJORVBfUkVTVUxUIHJlc3VsdDsKLQotICBpZiAocGFuX2NiLnJvbGUgPT0gUEFOX1JPTEVfSU5BQ1RJVkUgfHwgKCEocGFuX2NiLm51bV9jb25ucykpKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gaXMgbm90IGFjdGl2ZSBEYXRhIHdyaXRlIGZhaWxlZCIpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm4gUEFOX0ZBSUxVUkU7Ci0gIH0KLQotICAvKiBDaGVjayBpZiBpdCBpcyBicm9hZGNhc3Qgb3IgbXVsdGljYXN0IHBhY2tldCAqLwotICBpZiAoZHN0LmFkZHJlc3NbMF0gJiAweDAxKSB7Ci0gICAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KilwX2J1ZiArIHNpemVvZihCVF9IRFIpICsgcF9idWYtPm9mZnNldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgKytpKSB7Ci0gICAgICBpZiAocGFuX2NiLnBjYltpXS5jb25fc3RhdGUgPT0gUEFOX1NUQVRFX0NPTk5FQ1RFRCkKLSAgICAgICAgQk5FUF9Xcml0ZShwYW5fY2IucGNiW2ldLmhhbmRsZSwgZHN0LCBkYXRhLCBwX2J1Zi0+bGVuLCBwcm90b2NvbCwgJnNyYywKLSAgICAgICAgICAgICAgICAgICBleHQpOwotICAgIH0KLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIFBBTl9TVUNDRVNTOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgdGhlIGRhdGEgd3JpdGUgaXMgb24gUEFOVSBzaWRlICovCi0gIGlmIChwYW5fY2IuYWN0aXZlX3JvbGUgPT0gUEFOX1JPTEVfQ0xJRU5UKSB7Ci0gICAgLyogRGF0YSB3cml0ZSBpcyBvbiBQQU5VIGNvbm5lY3Rpb24gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrKSB7Ci0gICAgICBpZiAocGFuX2NiLnBjYltpXS5jb25fc3RhdGUgPT0gUEFOX1NUQVRFX0NPTk5FQ1RFRCAmJgotICAgICAgICAgIHBhbl9jYi5wY2JbaV0uc3JjX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gTUFYX1BBTl9DT05OUykgewotICAgICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gRG9uJ3QgaGF2ZSBhbnkgdXNlciBjb25uZWN0aW9ucyIpOwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgcmV0dXJuIFBBTl9GQUlMVVJFOwotICAgIH0KLQotICAgIHJlc3VsdCA9Ci0gICAgICAgIEJORVBfV3JpdGVCdWYocGFuX2NiLnBjYltpXS5oYW5kbGUsIGRzdCwgcF9idWYsIHByb3RvY29sLCAmc3JjLCBleHQpOwotICAgIGlmIChyZXN1bHQgPT0gQk5FUF9JR05PUkVfQ01EKSB7Ci0gICAgICBQQU5fVFJBQ0VfREVCVUcoIlBBTiBpZ25vcmVkIGRhdGEgd3JpdGUgZm9yIFBBTlUgY29ubmVjdGlvbiIpOwotICAgICAgcmV0dXJuICh0UEFOX1JFU1VMVClyZXN1bHQ7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQk5FUF9TVUNDRVNTKSB7Ci0gICAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTiBmYWlsZWQgdG8gd3JpdGUgZGF0YSBmb3IgdGhlIFBBTlUgY29ubmVjdGlvbiIpOwotICAgICAgcmV0dXJuICh0UEFOX1JFU1VMVClyZXN1bHQ7Ci0gICAgfQotCi0gICAgcGFuX2NiLnBjYltpXS53cml0ZS5vY3RldHMgKz0gcF9idWYtPmxlbjsKLSAgICBwYW5fY2IucGNiW2ldLndyaXRlLnBhY2tldHMrKzsKLQotICAgIFBBTl9UUkFDRV9ERUJVRygiUEFOIHN1Y2Nlc3NmdWxseSB3cm90ZSBkYXRhIGZvciB0aGUgUEFOVSBjb25uZWN0aW9uIik7Ci0gICAgcmV0dXJuIFBBTl9TVUNDRVNTOwotICB9Ci0KLSAgLyogZmluZG91dCB0byB3aGljaCBjb25uZWN0aW9uIHRoZSBkYXRhIGlzIG1lYW50IGZvciAqLwotICBwY2IgPSBwYW5fZ2V0X3BjYl9ieV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKCFwY2IpIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTiBCdWYgd3JpdGUgZm9yIHdyb25nIGhhbmRsZSIpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm4gUEFOX0ZBSUxVUkU7Ci0gIH0KLQotICBpZiAocGNiLT5jb25fc3RhdGUgIT0gUEFOX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIEJ1ZiB3cml0ZSB3aGVuIGNvbm4gaXMgbm90IGFjdGl2ZSIpOwotICAgIHBjYi0+d3JpdGUuZHJvcHMrKzsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuIFBBTl9GQUlMVVJFOwotICB9Ci0KLSAgcmVzdWx0ID0gQk5FUF9Xcml0ZUJ1ZihwY2ItPmhhbmRsZSwgZHN0LCBwX2J1ZiwgcHJvdG9jb2wsICZzcmMsIGV4dCk7Ci0gIGlmIChyZXN1bHQgPT0gQk5FUF9JR05PUkVfQ01EKSB7Ci0gICAgUEFOX1RSQUNFX0RFQlVHKCJQQU4gaWdub3JlZCBkYXRhIGJ1ZiB3cml0ZSB0byBQQU5VIik7Ci0gICAgcGNiLT53cml0ZS5lcnJvcnMrKzsKLSAgICByZXR1cm4gUEFOX0lHTk9SRV9DTUQ7Ci0gIH0gZWxzZSBpZiAocmVzdWx0ICE9IEJORVBfU1VDQ0VTUykgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIGZhaWxlZCB0byBzZW5kIGRhdGEgYnVmIHRvIHRoZSBQQU5VIik7Ci0gICAgcGNiLT53cml0ZS5lcnJvcnMrKzsKLSAgICByZXR1cm4gKHRQQU5fUkVTVUxUKXJlc3VsdDsKLSAgfQotCi0gIHBjYi0+d3JpdGUub2N0ZXRzICs9IHBfYnVmLT5sZW47Ci0gIHBjYi0+d3JpdGUucGFja2V0cysrOwotCi0gIFBBTl9UUkFDRV9ERUJVRygiUEFOIHN1Y2Nlc3NmdWxseSBzZW50IGRhdGEgYnVmIHRvIHRoZSBQQU5VIik7Ci0KLSAgcmV0dXJuIFBBTl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUEFOX1NldFByb3RvY29sRmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBwcm90b2NvbCBmaWx0ZXJzIG9uIHRoZSBwZWVyCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAtIGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgLSBudW1iZXIgb2YgcHJvdG9jb2wgZmlsdGVyIHJhbmdlcwotICogICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAtIGFycmF5IG9mIHN0YXJ0aW5nIHByb3RvY29sIG51bWJlcnMKLSAqICAgICAgICAgICAgICAgICAgZW5kICAgICAgICAgLSBhcnJheSBvZiBlbmRpbmcgcHJvdG9jb2wgbnVtYmVycwotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBBTl9TVUNDRVNTICAgIGlmIHByb3RvY29sIGZpbHRlcnMgYXJlIHNldCBzdWNjZXNzZnVsbHkKLSAqICAgICAgICAgICAgICAgICAgUEFOX0ZBSUxVUkUgICAgaWYgY29ubmVjdGlvbiBub3QgZm91bmQgb3IgZXJyb3IgaW4gc2V0dGluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10UEFOX1JFU1VMVCBQQU5fU2V0UHJvdG9jb2xGaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3N0YXJ0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9lbmRfYXJyYXkpIHsKLSAgdFBBTl9DT05OKiBwY2I7Ci0KLSAgLyogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gZXhpc3RzICovCi0gIHBjYiA9IHBhbl9nZXRfcGNiX2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAoIXBjYikgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIGNvbm5lY3Rpb24gbm90IGZvdW5kIGZvciB0aGUgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICByZXR1cm4gUEFOX0ZBSUxVUkU7Ci0gIH0KLQotICB0Qk5FUF9SRVNVTFQgcmVzdWx0ID0gQk5FUF9TZXRQcm90b2NvbEZpbHRlcnMocGNiLT5oYW5kbGUsIG51bV9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF9hcnJheSwgcF9lbmRfYXJyYXkpOwotICBpZiAocmVzdWx0ICE9IEJORVBfU1VDQ0VTUykgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIGZhaWxlZCB0byBzZXQgcHJvdG9jb2wgZmlsdGVycyBmb3IgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICByZXR1cm4gKHRQQU5fUkVTVUxUKXJlc3VsdDsKLSAgfQotCi0gIFBBTl9UUkFDRV9BUEkoIlBBTiBzdWNjZXNzZnVsbHkgc2VudCBwcm90b2NvbCBmaWx0ZXJzIGZvciBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fU2V0TXVsdGljYXN0RmlsdGVycwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBtdWx0aWNhc3QgZmlsdGVycyBvbiB0aGUgcGVlcgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIG51bV9maWx0ZXJzIC0gbnVtYmVyIG9mIG11bHRpY2FzdCBmaWx0ZXIgcmFuZ2VzCi0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0ICAgICAgIC0gYXJyYXkgb2Ygc3RhcnRpbmcgbXVsdGljYXN0IGZpbHRlciBhZGRyZXNzZXMKLSAqICAgICAgICAgICAgICAgICAgZW5kICAgICAgICAgLSBhcnJheSBvZiBlbmRpbmcgbXVsdGljYXN0IGZpbHRlciBhZGRyZXNzZXMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBQQU5fU1VDQ0VTUyAgICBpZiBtdWx0aWNhc3QgZmlsdGVycyBhcmUgc2V0IHN1Y2Nlc3NmdWxseQotICogICAgICAgICAgICAgICAgICBQQU5fRkFJTFVSRSAgICBpZiBjb25uZWN0aW9uIG5vdCBmb3VuZCBvciBlcnJvciBpbiBzZXR0aW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRQQU5fUkVTVUxUIFBBTl9TZXRNdWx0aWNhc3RGaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX21jYXN0X2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3N0YXJ0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9lbmRfYXJyYXkpIHsKLSAgdFBBTl9DT05OKiBwY2I7Ci0KLSAgLyogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gZXhpc3RzICovCi0gIHBjYiA9IHBhbl9nZXRfcGNiX2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAoIXBjYikgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIGNvbm5lY3Rpb24gbm90IGZvdW5kIGZvciB0aGUgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICByZXR1cm4gUEFOX0ZBSUxVUkU7Ci0gIH0KLQotICB0Qk5FUF9SRVNVTFQgcmVzdWx0ID0gQk5FUF9TZXRNdWx0aWNhc3RGaWx0ZXJzKHBjYi0+aGFuZGxlLCBudW1fbWNhc3RfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X2FycmF5LCBwX2VuZF9hcnJheSk7Ci0gIGlmIChyZXN1bHQgIT0gQk5FUF9TVUNDRVNTKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gZmFpbGVkIHRvIHNldCBtdWx0aWNhc3QgZmlsdGVycyBmb3IgaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKLSAgICByZXR1cm4gKHRQQU5fUkVTVUxUKXJlc3VsdDsKLSAgfQotCi0gIFBBTl9UUkFDRV9BUEkoIlBBTiBzdWNjZXNzZnVsbHkgc2VudCBtdWx0aWNhc3QgZmlsdGVycyBmb3IgaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICBoYW5kbGUpOwotICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQQU5fU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0cmFjZSBsZXZlbCBmb3IgUEFOLiBJZiBjYWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDB4RkYsIGl0IHNpbXBseSByZWFkcyB0aGUgY3VycmVudCB0cmFjZSBsZXZlbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBuZXcgKGN1cnJlbnQpIHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgUEFOX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKQotICAgIHBhbl9jYi50cmFjZV9sZXZlbCA9IG5ld19sZXZlbDsKLSAgZWxzZQotICAgIHBhbl9kdW1wX3N0YXR1cygpOwotCi0gIHJldHVybiAocGFuX2NiLnRyYWNlX2xldmVsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBBTl9Jbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQQU4gbW9kdWxlIHZhcmlhYmxlcwotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgbm9uZQotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBBTl9Jbml0KHZvaWQpIHsKLSAgbWVtc2V0KCZwYW5fY2IsIDAsIHNpemVvZih0UEFOX0NCKSk7Ci0KLSNpZiBkZWZpbmVkKFBBTl9JTklUSUFMX1RSQUNFX0xFVkVMKQotICBwYW5fY2IudHJhY2VfbGV2ZWwgPSBQQU5fSU5JVElBTF9UUkFDRV9MRVZFTDsKLSNlbHNlCi0gIHBhbl9jYi50cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX05PTkU7IC8qIE5vIHRyYWNlcyAqLwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgRFVNUFNZU19UQUcgInNoaW06OmxlZ2FjeTo6cGFuIgotdm9pZCBQQU5fRHVtcHN5cyhpbnQgZmQpIHsKLSAgTE9HX0RVTVBTWVNfVElUTEUoZmQsIERVTVBTWVNfVEFHKTsKLQotICBMT0dfRFVNUFNZUyhmZCwgIkNvbm5lY3Rpb25zOiVoaHUgcm9sZXMgY29uZmlndXJlZDolcyBjdXJyZW50OiVzIHByZXZpb3VzOiVzIiwKLSAgICAgICAgICAgICAgcGFuX2NiLm51bV9jb25ucywgcGFuX3JvbGVfdG9fdGV4dChwYW5fY2Iucm9sZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgcGFuX3JvbGVfdG9fdGV4dChwYW5fY2IuYWN0aXZlX3JvbGUpLmNfc3RyKCksCi0gICAgICAgICAgICAgIHBhbl9yb2xlX3RvX3RleHQocGFuX2NiLnBydl9hY3RpdmVfcm9sZSkuY19zdHIoKSk7Ci0gIGNvbnN0IHRQQU5fQ09OTiogcGNiID0gJnBhbl9jYi5wY2JbMF07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrLCBwY2IrKykgewotICAgIGlmIChwY2ItPmNvbl9zdGF0ZSA9PSBQQU5fU1RBVEVfSURMRSkgY29udGludWU7Ci0gICAgTE9HX0RVTVBTWVMoZmQsICIgIElkOiVkIHBlZXI6JXMiLCBpLCBQUklWQVRFX0FERFJFU1MocGNiLT5yZW1fYmRhKSk7Ci0gICAgTE9HX0RVTVBTWVMoCi0gICAgICAgIGZkLAotICAgICAgICAiICAgIHJ4X3BhY2tldHM6JS01bHUgcnhfb2N0ZXRzOiUtOGx1IHJ4X2Vycm9yczolLTVsdSByeF9kcm9wczolLTVsdSIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKXBjYi0+cmVhZC5wYWNrZXRzLCAodW5zaWduZWQgbG9uZylwY2ItPnJlYWQub2N0ZXRzLAotICAgICAgICAodW5zaWduZWQgbG9uZylwY2ItPnJlYWQuZXJyb3JzLCAodW5zaWduZWQgbG9uZylwY2ItPnJlYWQuZHJvcHMpOwotICAgIExPR19EVU1QU1lTKAotICAgICAgICBmZCwKLSAgICAgICAgIiAgICB0eF9wYWNrZXRzOiUtNWx1IHR4X29jdGV0czolLThsdSB0eF9lcnJvcnM6JS01bHUgdHhfZHJvcHM6JS01bHUiLAotICAgICAgICAodW5zaWduZWQgbG9uZylwY2ItPndyaXRlLnBhY2tldHMsICh1bnNpZ25lZCBsb25nKXBjYi0+d3JpdGUub2N0ZXRzLAotICAgICAgICAodW5zaWduZWQgbG9uZylwY2ItPndyaXRlLmVycm9ycywgKHVuc2lnbmVkIGxvbmcpcGNiLT53cml0ZS5kcm9wcyk7Ci0gICAgTE9HX0RVTVBTWVMoZmQsCi0gICAgICAgICAgICAgICAgIiAgICBzcmNfdXVpZDoweCUwNHhbcHJldjoweCUwNHhdIGRzdF91dWlkOjB4JTA0eFtwcmV2OjB4JTA0eF0gIgotICAgICAgICAgICAgICAgICJiYWRfcGt0czolaHUiLAotICAgICAgICAgICAgICAgIHBjYi0+c3JjX3V1aWQsIHBjYi0+ZHN0X3V1aWQsIHBjYi0+cHJ2X3NyY191dWlkLAotICAgICAgICAgICAgICAgIHBjYi0+cHJ2X2RzdF91dWlkLCBwY2ItPmJhZF9wa3RzX3JjdmQpOwotICB9Ci19Ci0jdW5kZWYgRFVNUFNZU19UQUcKZGlmZiAtLWdpdCBhL3N0YWNrL3Bhbi9wYW5faW50LmggYi9zdGFjay9wYW4vcGFuX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDlkNWVjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Bhbi9wYW5faW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgaW50ZXJuYWxseSB1c2VkIFBBTiBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgUEFOX0lOVF9ICi0jZGVmaW5lIFBBTl9JTlRfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wYW5fYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKgotICogVGhpcyByb2xlIGlzIHVzZWQgdG8gc2h1dGRvd24gdGhlIHByb2ZpbGUuIFVzZWQgaW50ZXJuYWxseQotICogQXBwbGljYXRpb25zIHNob3VsZCBjYWxsIFBBTl9EZXJlZ2lzdGVyIHRvIHNodXRkb3duIHRoZSBwcm9maWxlCi0gKi8KLSNkZWZpbmUgUEFOX1JPTEVfSU5BQ1RJVkUgMAotCi0jZGVmaW5lIFBBTl9QUk9GSUxFX1ZFUlNJT04gMHgwMTAwIC8qIFZlcnNpb24gMS4wMCAqLwotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgUEFOX1NUQVRFX0lETEUgPSAwLAotICBQQU5fU1RBVEVfQ09OTl9TVEFSVCA9IDEsCi0gIFBBTl9TVEFURV9DT05ORUNURUQgPSAyLAotfSB0UEFOX1NUQVRFOwotCi0vKiBEZWZpbmUgdGhlIFBBTiBDb25uZWN0aW9uIENvbnRyb2wgQmxvY2sKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0UEFOX1NUQVRFIGNvbl9zdGF0ZTsKLQotI2RlZmluZSBQQU5fRkxBR1NfQ09OTl9DT01QTEVURUQgMHgwMQotICB1aW50OF90IGNvbl9mbGFnczsKLQotICB1aW50MTZfdCBoYW5kbGU7Ci0gIFJhd0FkZHJlc3MgcmVtX2JkYTsKLQotICB1aW50MTZfdCBiYWRfcGt0c19yY3ZkOwotICB1aW50MTZfdCBzcmNfdXVpZDsKLSAgdWludDE2X3QgZHN0X3V1aWQ7Ci0gIHVpbnQxNl90IHBydl9zcmNfdXVpZDsKLSAgdWludDE2X3QgcHJ2X2RzdF91dWlkOwotICB1aW50MTZfdCBpcF9hZGRyX2tub3duOwotICB1aW50MzJfdCBpcF9hZGRyOwotCi0gIHN0cnVjdCB7Ci0gICAgc2l6ZV90IG9jdGV0c3swfTsKLSAgICBzaXplX3QgcGFja2V0c3swfTsKLSAgICBzaXplX3QgZXJyb3JzezB9OwotICAgIHNpemVfdCBkcm9wc3swfTsKLSAgfSB3cml0ZSwgcmVhZDsKLQotfSB0UEFOX0NPTk47Ci0KLS8qICBUaGUgbWFpbiBQQU4gY29udHJvbCBibG9jawotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRQQU5fUk9MRSByb2xlOwotICB0UEFOX1JPTEUgYWN0aXZlX3JvbGU7Ci0gIHRQQU5fUk9MRSBwcnZfYWN0aXZlX3JvbGU7Ci0gIHRQQU5fQ09OTiBwY2JbTUFYX1BBTl9DT05OU107Ci0KLSAgdFBBTl9DT05OX1NUQVRFX0NCKiBwYW5fY29ubl9zdGF0ZV9jYjsgLyogQ29ubmVjdGlvbiBzdGF0ZSBjYWxsYmFjayAqLwotICB0UEFOX0JSSURHRV9SRVFfQ0IqIHBhbl9icmlkZ2VfcmVxX2NiOwotICB0UEFOX0RBVEFfSU5EX0NCKiBwYW5fZGF0YV9pbmRfY2I7Ci0gIHRQQU5fREFUQV9CVUZfSU5EX0NCKiBwYW5fZGF0YV9idWZfaW5kX2NiOwotICB0UEFOX0ZJTFRFUl9JTkRfQ0IqCi0gICAgICBwYW5fcGZpbHRfaW5kX2NiOyAvKiBwcm90b2NvbCBmaWx0ZXIgaW5kaWNhdGlvbiBjYWxsYmFjayAqLwotICB0UEFOX01GSUxURVJfSU5EX0NCKgotICAgICAgcGFuX21maWx0X2luZF9jYjsgLyogbXVsdGljYXN0IGZpbHRlciBpbmRpY2F0aW9uIGNhbGxiYWNrICovCi0gIHRQQU5fVFhfREFUQV9GTE9XX0NCKiBwYW5fdHhfZGF0YV9mbG93X2NiOwotCi0gIGNoYXIqIHVzZXJfc2VydmljZV9uYW1lOwotICBjaGFyKiBnbl9zZXJ2aWNlX25hbWU7Ci0gIGNoYXIqIG5hcF9zZXJ2aWNlX25hbWU7Ci0gIHVpbnQzMl90IHBhbl91c2VyX3NkcF9oYW5kbGU7Ci0gIHVpbnQzMl90IHBhbl9nbl9zZHBfaGFuZGxlOwotICB1aW50MzJfdCBwYW5fbmFwX3NkcF9oYW5kbGU7Ci0gIHVpbnQ4X3QgbnVtX2Nvbm5zOwotICB1aW50OF90IHRyYWNlX2xldmVsOwotfSB0UEFOX0NCOwotCi0vKiBHbG9iYWwgUEFOIGRhdGEKLSAqLwotZXh0ZXJuIHRQQU5fQ0IgcGFuX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgcGFuX3JlZ2lzdGVyX3dpdGhfYm5lcCh2b2lkKTsKLWV4dGVybiB2b2lkIHBhbl9jb25uX2luZF9jYih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgcmVtb3RlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBsb2NhbF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcm9sZV9jaGFuZ2UpOwotZXh0ZXJuIHZvaWQgcGFuX2Nvbm5lY3Rfc3RhdGVfY2IodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJORVBfUkVTVUxUIHJlc3VsdCwgYm9vbCBpc19yb2xlX2NoYW5nZSk7Ci1leHRlcm4gdm9pZCBwYW5fZGF0YV9idWZfaW5kX2NiKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBkc3QsIHVpbnQxNl90IHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCBib29sIGV4dCk7Ci1leHRlcm4gdm9pZCBwYW5fdHhfZGF0YV9mbG93X2NiKHVpbnQxNl90IGhhbmRsZSwgdEJORVBfUkVTVUxUIGV2ZW50KTsKLXZvaWQgcGFuX3Byb3RvX2ZpbHRfaW5kX2NiKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJORVBfUkVTVUxUIHJlc3VsdCwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMpOwotdm9pZCBwYW5fbWNhc3RfZmlsdF9pbmRfY2IodWludDE2X3QgaGFuZGxlLCBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0Qk5FUF9SRVNVTFQgcmVzdWx0LCB1aW50MTZfdCBudW1fZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZmlsdGVycyk7Ci1leHRlcm4gdWludDMyX3QgcGFuX3JlZ2lzdGVyX3dpdGhfc2RwKHVpbnQxNl90IHV1aWQsIGNvbnN0IGNoYXIqIHBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcF9kZXNjKTsKLWV4dGVybiB0UEFOX0NPTk4qIHBhbl9hbGxvY2F0ZV9wY2IoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEsIHVpbnQxNl90IGhhbmRsZSk7Ci1leHRlcm4gdFBBTl9DT05OKiBwYW5fZ2V0X3BjYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKTsKLWV4dGVybiB0UEFOX0NPTk4qIHBhbl9nZXRfcGNiX2J5X2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpOwotZXh0ZXJuIHZvaWQgcGFuX2Nsb3NlX2FsbF9jb25uZWN0aW9ucyh2b2lkKTsKLWV4dGVybiB2b2lkIHBhbl9yZWxlYXNlX3BjYih0UEFOX0NPTk4qIHBfcGNiKTsKLWV4dGVybiB2b2lkIHBhbl9kdW1wX3N0YXR1cyh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9wYW4vcGFuX21haW4uY2MgYi9zdGFjay9wYW4vcGFuX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzExNTEuLjAwMDAwMDAKLS0tIGEvc3RhY2svcGFuL3Bhbl9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1haW4gZnVuY3Rpb25zIHRvIHN1cHBvcnQgUEFOIHByb2ZpbGUKLSAqICBjb21tYW5kcyBhbmQgZXZlbnRzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2JuZXBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcGRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9wYW4vcGFuX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi10UEFOX0NCIHBhbl9jYjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBhbl9yZWdpc3Rlcl93aXRoX2JuZXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIFBBTiBwcm9maWxlIHdpdGggQk5FUAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgbm9uZQotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHBhbl9yZWdpc3Rlcl93aXRoX2JuZXAodm9pZCkgewotICB0Qk5FUF9SRUdJU1RFUiByZWdfaW5mbzsKLQotICBtZW1zZXQoJnJlZ19pbmZvLCAwLCBzaXplb2YodEJORVBfUkVHSVNURVIpKTsKLQotICByZWdfaW5mby5wX2Nvbm5faW5kX2NiID0gcGFuX2Nvbm5faW5kX2NiOwotICByZWdfaW5mby5wX2Nvbm5fc3RhdGVfY2IgPSBwYW5fY29ubmVjdF9zdGF0ZV9jYjsKLSAgcmVnX2luZm8ucF9kYXRhX2J1Zl9jYiA9IHBhbl9kYXRhX2J1Zl9pbmRfY2I7Ci0gIHJlZ19pbmZvLnBfZGF0YV9pbmRfY2IgPSBOVUxMOwotICByZWdfaW5mby5wX3R4X2RhdGFfZmxvd19jYiA9IHBhbl90eF9kYXRhX2Zsb3dfY2I7Ci0gIHJlZ19pbmZvLnBfZmlsdGVyX2luZF9jYiA9IHBhbl9wcm90b19maWx0X2luZF9jYjsKLSAgcmVnX2luZm8ucF9tZmlsdGVyX2luZF9jYiA9IHBhbl9tY2FzdF9maWx0X2luZF9jYjsKLQotICBCTkVQX1JlZ2lzdGVyKCZyZWdfaW5mbyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwYW5fY29ubl9pbmRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIEJORVAgYXMgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uIGNhbGxiYWNrLiBCTkVQIHdpbGwgY2FsbCB0aGlzIHdoZW4gdGhlcmUgaXMKLSAqICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiByZXF1ZXN0IGZyb20gdGhlIHBlZXIuIFBBTiBzaG91bGQgY2FsbAotICogICAgICAgICAgICAgICAgICBCTkVQX0Nvbm5lY3RSZXNwIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gYWNjZXB0IHRoZQotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIG9yIHJlamVjdAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfYmRhICAgICAgIC0gQkQgQWRkciBvZiB0aGUgcGVlciByZXF1ZXN0aW5nIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHJlbW90ZV91dWlkICAgICAtIFVVSUQgb2YgdGhlIHNvdXJjZSByb2xlIChwZWVyIGRldmljZSByb2xlKQotICogICAgICAgICAgICAgICAgICBsb2NhbF91dWlkICAgICAgLSBVVUlEIG9mIHRoZSBkZXN0aW5hdGlvbiByb2xlIChsb2NhbCBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSkKLSAqICAgICAgICAgICAgICAgICAgaXNfcm9sZV9jaGFuZ2UgIC0gRmxhZyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgcm9sZSBjaGFuZ2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwYW5fY29ubl9pbmRfY2IodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQmIHJlbW90ZV91dWlkLCBjb25zdCBVdWlkJiBsb2NhbF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yb2xlX2NoYW5nZSkgewotICAvKiBJZiB3ZSBhcmUgaW4gR04gb3IgTkFQIHJvbGUgYW5kIGhhdmUgb25lIG9yIG1vcmUgYWN0aXZlIGNvbm5lY3Rpb25zIGFuZCB0aGUKLSAgICogcmVjZWl2ZWQgY29ubmVjdGlvbiBpcyBmb3IgdXNlciByb2xlIHJlamVjdCBpdC4gSWYgd2UgYXJlIGluIHVzZXIgcm9sZSB3aXRoCi0gICAqIG9uZSBjb25uZWN0aW9uIGFjdGl2ZSByZWplY3QgdGhlIGNvbm5lY3Rpb24uIEFsbG9jYXRlIFBDQiBhbmQgc3RvcmUgdGhlCi0gICAqIHBhcmFtZXRlcnMuIE1ha2UgYnJpZGdlIHJlcXVlc3QgdG8gdGhlIGhvc3Qgc3lzdGVtIGlmIGNvbm5lY3Rpb24gaXMgZm9yIE5BUAotICAgKi8KLQotICBpZiAoIXJlbW90ZV91dWlkLklzMTZCaXQoKSkgewotICAgIFBBTl9UUkFDRV9FUlJPUigiUEFOIENvbm5lY3Rpb24gZmFpbGVkIGJlY2F1c2Ugb2Ygd3JvbmcgcmVtb3RlIFVVSUQgIik7Ci0gICAgQk5FUF9Db25uZWN0UmVzcChoYW5kbGUsIEJORVBfQ09OTl9GQUlMRURfU1JDX1VVSUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghbG9jYWxfdXVpZC5JczE2Qml0KCkpIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTiBDb25uZWN0aW9uIGZhaWxlZCBiZWNhdXNlIG9mIHdyb25nIGxvY2FsIFVVSUQgIik7Ci0gICAgQk5FUF9Db25uZWN0UmVzcChoYW5kbGUsIEJORVBfQ09OTl9GQUlMRURfRFNUX1VVSUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQxNl90IHJlbW90ZV91dWlkMTYgPSByZW1vdGVfdXVpZC5BczE2Qml0KCk7Ci0gIHVpbnQxNl90IGxvY2FsX3V1aWQxNiA9IGxvY2FsX3V1aWQuQXMxNkJpdCgpOwotCi0gIFBBTl9UUkFDRV9FVkVOVCgKLSAgICAgICIlcyAtIGhhbmRsZSAlZCwgY3VycmVudCByb2xlICVkLCBkc3QgdXVpZCAweCV4LCBzcmMgdXVpZCAweCV4LCByb2xlICIKLSAgICAgICJjaGFuZ2UgJXMiLAotICAgICAgX19mdW5jX18sIGhhbmRsZSwgcGFuX2NiLnJvbGUsIGxvY2FsX3V1aWQxNiwgcmVtb3RlX3V1aWQxNiwKLSAgICAgIGlzX3JvbGVfY2hhbmdlID8gIllFUyIgOiAiTk8iKTsKLQotICAvKiBDaGVjayBpZiB0aGUgc291cmNlIFVVSUQgaXMgYSB2YWxpZCBvbmUgKi8KLSAgaWYgKHJlbW90ZV91dWlkMTYgIT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSAmJgotICAgICAgcmVtb3RlX3V1aWQxNiAhPSBVVUlEX1NFUlZDTEFTU19OQVAgJiYKLSAgICAgIHJlbW90ZV91dWlkMTYgIT0gVVVJRF9TRVJWQ0xBU1NfR04pIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlNyYyBVVUlEIDB4JXggaXMgbm90IHZhbGlkIiwgcmVtb3RlX3V1aWQxNik7Ci0gICAgQk5FUF9Db25uZWN0UmVzcChoYW5kbGUsIEJORVBfQ09OTl9GQUlMRURfU1JDX1VVSUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIENoZWNrIGlmIHRoZSBkZXN0aW5hdGlvbiBVVUlEIGlzIGEgdmFsaWQgb25lICovCi0gIGlmIChsb2NhbF91dWlkMTYgIT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSAmJgotICAgICAgbG9jYWxfdXVpZDE2ICE9IFVVSURfU0VSVkNMQVNTX05BUCAmJiBsb2NhbF91dWlkMTYgIT0gVVVJRF9TRVJWQ0xBU1NfR04pIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIkRzdCBVVUlEIDB4JXggaXMgbm90IHZhbGlkIiwgbG9jYWxfdXVpZDE2KTsKLSAgICBCTkVQX0Nvbm5lY3RSZXNwKGhhbmRsZSwgQk5FUF9DT05OX0ZBSUxFRF9EU1RfVVVJRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgY3VycmVudGx5IHdlIHN1cHBvcnQgdGhlIGRlc3RpbmF0aW9uIHJvbGUgcmVxdWVzdGVkICovCi0gIGlmICgoKCEocGFuX2NiLnJvbGUgJiBVVUlEX1NFUlZDTEFTU19QQU5VKSkgJiYKLSAgICAgICBsb2NhbF91dWlkMTYgPT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSkgfHwKLSAgICAgICgoIShwYW5fY2Iucm9sZSAmIFVVSURfU0VSVkNMQVNTX0dOKSkgJiYKLSAgICAgICBsb2NhbF91dWlkMTYgPT0gVVVJRF9TRVJWQ0xBU1NfR04pIHx8Ci0gICAgICAoKCEocGFuX2NiLnJvbGUgJiBVVUlEX1NFUlZDTEFTU19OQVApKSAmJgotICAgICAgIGxvY2FsX3V1aWQxNiA9PSBVVUlEX1NFUlZDTEFTU19OQVApKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKAotICAgICAgICAiUEFOIENvbm5lY3Rpb24gZmFpbGVkIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgZGVzdGluYXRpb24gVVVJRCAweCV4IiwKLSAgICAgICAgbG9jYWxfdXVpZDE2KTsKLSAgICBCTkVQX0Nvbm5lY3RSZXNwKGhhbmRsZSwgQk5FUF9DT05OX0ZBSUxFRF9EU1RfVVVJRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogQ2hlY2sgZm9yIHZhbGlkIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSB0aHJlZSBQQU4gcHJvZmlsZSByb2xlcyAqLwotICAvKgotICAgKiBGb3IgcmVmZXJlbmNlLCBzZWUgVGFibGUgMSBpbiBQQU4gUHJvZmlsZSB2MS4wIHNwZWMuCi0gICAqIE5vdGU6IHRoZSByZW1vdGUgaXMgdGhlIGluaXRpYXRvci4KLSAgICovCi0gIGJvb2wgaXNfdmFsaWRfaW50ZXJhY3Rpb24gPSBmYWxzZTsKLSAgc3dpdGNoIChyZW1vdGVfdXVpZDE2KSB7Ci0gICAgY2FzZSBVVUlEX1NFUlZDTEFTU19OQVA6Ci0gICAgY2FzZSBVVUlEX1NFUlZDTEFTU19HTjoKLSAgICAgIGlmIChsb2NhbF91dWlkMTYgPT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSkgaXNfdmFsaWRfaW50ZXJhY3Rpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVVUlEX1NFUlZDTEFTU19QQU5VOgotICAgICAgaXNfdmFsaWRfaW50ZXJhY3Rpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgLyoKLSAgICogRXhwbGljaXRseSBkaXNhYmxlIGNvbm5lY3Rpb25zIHRvIHRoZSBsb2NhbCBQQU5VIGlmIHRoZSByZW1vdGUgaXMKLSAgICogbm90IFBBTlUuCi0gICAqLwotICBpZiAoKGxvY2FsX3V1aWQxNiA9PSBVVUlEX1NFUlZDTEFTU19QQU5VKSAmJgotICAgICAgKHJlbW90ZV91dWlkMTYgIT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSkpIHsKLSAgICBpc192YWxpZF9pbnRlcmFjdGlvbiA9IGZhbHNlOwotICB9Ci0gIGlmICghaXNfdmFsaWRfaW50ZXJhY3Rpb24pIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoCi0gICAgICAgICJQQU4gQ29ubmVjdGlvbiBmYWlsZWQgYmVjYXVzZSBvZiBpbnZhbGlkIFBBTiBwcm9maWxlIHJvbGVzICIKLSAgICAgICAgImludGVyYWN0aW9uOiBSZW1vdGUgVVVJRCAweCV4IExvY2FsIFVVSUQgMHgleCIsCi0gICAgICAgIHJlbW90ZV91dWlkMTYsIGxvY2FsX3V1aWQxNik7Ci0gICAgQk5FUF9Db25uZWN0UmVzcChoYW5kbGUsIEJORVBfQ09OTl9GQUlMRURfU1JDX1VVSUQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgcmVxX3JvbGU7Ci0gIC8qIFJlcXVlc3RlZCBkZXN0aW5hdGlvbiByb2xlIGlzICovCi0gIGlmIChsb2NhbF91dWlkMTYgPT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSkKLSAgICByZXFfcm9sZSA9IFBBTl9ST0xFX0NMSUVOVDsKLSAgZWxzZQotICAgIHJlcV9yb2xlID0gUEFOX1JPTEVfTkFQX1NFUlZFUjsKLQotICAvKiBJZiB0aGUgY29ubmVjdGlvbiBpbmRpY2F0aW9uIGlzIGZvciB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbgotICAqKiBDaGVjayBpZiB0aGUgbmV3IGRlc3RpbmF0aW9uIHJvbGUgaXMgYWNjZXB0YWJsZQotICAqLwotICB0UEFOX0NPTk4qIHBjYiA9IHBhbl9nZXRfcGNiX2J5X2hhbmRsZShoYW5kbGUpOwotICBpZiAocGNiKSB7Ci0gICAgaWYgKHBhbl9jYi5udW1fY29ubnMgPiAxICYmIGxvY2FsX3V1aWQxNiA9PSBVVUlEX1NFUlZDTEFTU19QQU5VKSB7Ci0gICAgICAvKiBUaGVyZSBhcmUgY29ubmVjdGlvbnMgb3RoZXIgdGhhbiB0aGlzIG9uZQotICAgICAgKiogc28gd2UgY2Fubid0IGFjY2VwdCBQQU5VIHJvbGUuIFJlamVjdAotICAgICAgKi8KLSAgICAgIFBBTl9UUkFDRV9FUlJPUigKLSAgICAgICAgICAiRHN0IFVVSUQgc2hvdWxkIGJlIGVpdGhlciBHTiBvciBOQVAgb25seSBiZWNhdXNlIHRoZXJlIGFyZSBvdGhlciAiCi0gICAgICAgICAgImNvbm5lY3Rpb25zIik7Ci0gICAgICBCTkVQX0Nvbm5lY3RSZXNwKGhhbmRsZSwgQk5FUF9DT05OX0ZBSUxFRF9EU1RfVVVJRCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogSWYgaXQgaXMgYWxyZWFkeSBpbiBjb25uZWN0ZWQgc3RhdGUgY2hlY2sgZm9yIGJyaWRnaW5nIHN0YXR1cyAqLwotICAgIGlmIChwY2ItPmNvbl9zdGF0ZSA9PSBQQU5fU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICBQQU5fVFJBQ0VfRVZFTlQoIlBBTiBSb2xlIGNoYW5naW5nIE5ldyBTcmMgMHgleCBEc3QgMHgleCIsIHJlbW90ZV91dWlkMTYsCi0gICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdXVpZDE2KTsKLQotICAgICAgcGNiLT5wcnZfc3JjX3V1aWQgPSBwY2ItPnNyY191dWlkOwotICAgICAgcGNiLT5wcnZfZHN0X3V1aWQgPSBwY2ItPmRzdF91dWlkOwotCi0gICAgICBpZiAocGNiLT5zcmNfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19OQVAgJiYKLSAgICAgICAgICBsb2NhbF91dWlkMTYgIT0gVVVJRF9TRVJWQ0xBU1NfTkFQKSB7Ci0gICAgICAgIC8qIFJlbW92ZSBicmlkZ2luZyAqLwotICAgICAgICBpZiAocGFuX2NiLnBhbl9icmlkZ2VfcmVxX2NiKQotICAgICAgICAgICgqcGFuX2NiLnBhbl9icmlkZ2VfcmVxX2NiKShwY2ItPnJlbV9iZGEsIGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogU2V0IHRoZSBsYXRlc3QgYWN0aXZlIFBBTiByb2xlICovCi0gICAgcGFuX2NiLmFjdGl2ZV9yb2xlID0gcmVxX3JvbGU7Ci0gICAgcGNiLT5zcmNfdXVpZCA9IGxvY2FsX3V1aWQxNjsKLSAgICBwY2ItPmRzdF91dWlkID0gcmVtb3RlX3V1aWQxNjsKLSAgICBCTkVQX0Nvbm5lY3RSZXNwKGhhbmRsZSwgQk5FUF9TVUNDRVNTKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSB7Ci0gICAgLyogSWYgdGhpcyBhIG5ldyBjb25uZWN0aW9uIGFuZCBkZXN0aW5hdGlvbiBpcyBQQU5VIHJvbGUgYW5kCi0gICAgKiogd2UgYWxyZWFkeSBoYXZlIGEgY29ubmVjdGlvbiB0aGVuIHJlamVjdCB0aGUgcmVxdWVzdC4KLSAgICAqKiBJZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiBpbiBQQU5VIHJvbGUgdGhlbiByZWplY3QgaXQKLSAgICAqLwotICAgIGlmIChwYW5fY2IubnVtX2Nvbm5zICYmIChsb2NhbF91dWlkMTYgPT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5fY2IuYWN0aXZlX3JvbGUgPT0gUEFOX1JPTEVfQ0xJRU5UKSkgewotICAgICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gYWxyZWFkeSBoYXZlIGEgY29ubmVjdGlvbiBhbmQgY2FuJ3QgYmUgdXNlciIpOwotICAgICAgQk5FUF9Db25uZWN0UmVzcChoYW5kbGUsIEJORVBfQ09OTl9GQUlMRURfRFNUX1VVSUQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8qIFRoaXMgaXMgYSBuZXcgY29ubmVjdGlvbiAqLwotICBQQU5fVFJBQ0VfREVCVUcoIk5ldyBjb25uZWN0aW9uIGluZGljYXRpb24gZm9yIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gIHBjYiA9IHBhbl9hbGxvY2F0ZV9wY2IocF9iZGEsIGhhbmRsZSk7Ci0gIGlmICghcGNiKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gbm8gY29udHJvbCBibG9jayBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKLSAgICBCTkVQX0Nvbm5lY3RSZXNwKGhhbmRsZSwgQk5FUF9DT05OX0ZBSUxFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgUEFOX1RSQUNFX0VWRU5UKCJQQU4gY29ubmVjdGlvbiBkZXN0aW5hdGlvbiBVVUlEIGlzIDB4JXgiLCBsb2NhbF91dWlkMTYpOwotICAvKiBTZXQgdGhlIGxhdGVzdCBhY3RpdmUgUEFOIHJvbGUgKi8KLSAgcGFuX2NiLmFjdGl2ZV9yb2xlID0gcmVxX3JvbGU7Ci0gIHBjYi0+c3JjX3V1aWQgPSBsb2NhbF91dWlkMTY7Ci0gIHBjYi0+ZHN0X3V1aWQgPSByZW1vdGVfdXVpZDE2OwotICBwY2ItPmNvbl9zdGF0ZSA9IFBBTl9TVEFURV9DT05OX1NUQVJUOwotICBwYW5fY2IubnVtX2Nvbm5zKys7Ci0KLSAgQk5FUF9Db25uZWN0UmVzcChoYW5kbGUsIEJORVBfU1VDQ0VTUyk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBhbl9jb25uZWN0X3N0YXRlX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCBCTkVQIGFzIGNvbm5lY3Rpb24gc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgY2hhbmdlIGNhbGxiYWNrLiBCTkVQIHdpbGwgY2FsbCB0aGlzIHdoZW4gdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgaXMgZXN0YWJsaXNoZWQgc3VjY2Vzc2Z1bGx5IG9yIHRlcm1pbmF0ZWQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uIGdpdmVuIGluIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uIGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgIHJlbV9iZGEgLSByZW1vdGUgZGV2aWNlIGJkIGFkZHIKLSAqICAgICAgICAgICAgICAgICAgcmVzdWx0ICAtIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIHVwIG9yIGRvd24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJORVBfU1VDQ0VTUyBpZiB0aGUgY29ubmVjdGlvbiBpcyB1cCBhbGwgb3RoZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBpbmRpY2F0ZSBhcHByb3ByaWF0ZSBlcnJvcnMuCi0gKiAgICAgICAgICAgICAgICAgIGlzX3JvbGVfY2hhbmdlIC0gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgcm9sZSBjaGFuZ2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwYW5fY29ubmVjdF9zdGF0ZV9jYih1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCTkVQX1JFU1VMVCByZXN1bHQsIGJvb2wgaXNfcm9sZV9jaGFuZ2UpIHsKLSAgdFBBTl9DT05OKiBwY2I7Ci0gIHVpbnQ4X3QgcGVlcl9yb2xlOwotCi0gIFBBTl9UUkFDRV9FVkVOVCgicGFuX2Nvbm5lY3Rfc3RhdGVfY2IgLSBmb3IgaGFuZGxlICVkLCByZXN1bHQgJWQiLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICByZXN1bHQpOwotICBwY2IgPSBwYW5fZ2V0X3BjYl9ieV9oYW5kbGUoaGFuZGxlKTsKLSAgaWYgKCFwY2IpIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTiBTdGF0ZSBjaGFuZ2UgaW5kaWNhdGlvbiBmb3Igd3JvbmcgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBnZXR0aW5nIHRlcm1pbmF0ZWQgcmVtb3ZlIGJyaWRnaW5nICovCi0gIGlmIChyZXN1bHQgIT0gQk5FUF9TVUNDRVNTKSB7Ci0gICAgLyogSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNvbm5lY3Rpb24gaXMgZG93biAqLwotICAgIGlmIChwYW5fY2IucGFuX2Nvbm5fc3RhdGVfY2IpCi0gICAgICAoKnBhbl9jYi5wYW5fY29ubl9zdGF0ZV9jYikocGNiLT5oYW5kbGUsIHBjYi0+cmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodFBBTl9SRVNVTFQpcmVzdWx0LCBpc19yb2xlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5fUk9MRV9JTkFDVElWRSwgUEFOX1JPTEVfSU5BQ1RJVkUpOwotCi0gICAgLyogQ2hlY2sgaWYgdGhpcyBmYWlsdXJlIGlzIGZvciByb2xlIGNoYW5nZSBvbmx5ICovCi0gICAgaWYgKHBjYi0+Y29uX3N0YXRlICE9IFBBTl9TVEFURV9DT05ORUNURUQgJiYKLSAgICAgICAgKHBjYi0+Y29uX2ZsYWdzICYgUEFOX0ZMQUdTX0NPTk5fQ09NUExFVEVEKSkgewotICAgICAgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWVzICovCi0gICAgICBQQU5fVFJBQ0VfRVZFTlQoInJlc3RvcmluZyB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBhY3RpdmUiKTsKLSAgICAgIHBjYi0+Y29uX3N0YXRlID0gUEFOX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgIHBjYi0+Y29uX2ZsYWdzICY9ICh+UEFOX0ZMQUdTX0NPTk5fQ09NUExFVEVEKTsKLQotICAgICAgcGNiLT5zcmNfdXVpZCA9IHBjYi0+cHJ2X3NyY191dWlkOwotICAgICAgcGNiLT5kc3RfdXVpZCA9IHBjYi0+cHJ2X2RzdF91dWlkOwotICAgICAgcGFuX2NiLmFjdGl2ZV9yb2xlID0gcGFuX2NiLnBydl9hY3RpdmVfcm9sZTsKLQotICAgICAgaWYgKChwY2ItPnNyY191dWlkID09IFVVSURfU0VSVkNMQVNTX05BUCkgJiYgcGFuX2NiLnBhbl9icmlkZ2VfcmVxX2NiKQotICAgICAgICAoKnBhbl9jYi5wYW5fYnJpZGdlX3JlcV9jYikocGNiLT5yZW1fYmRhLCB0cnVlKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwY2ItPmNvbl9zdGF0ZSA9PSBQQU5fU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAvKiBJZiB0aGUgY29ubmVjdGlvbnMgZGVzdGluYXRpb24gcm9sZSBpcyBOQVAgcmVtb3ZlIGJyaWRnaW5nICovCi0gICAgICBpZiAoKHBjYi0+c3JjX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfTkFQKSAmJiBwYW5fY2IucGFuX2JyaWRnZV9yZXFfY2IpCi0gICAgICAgICgqcGFuX2NiLnBhbl9icmlkZ2VfcmVxX2NiKShwY2ItPnJlbV9iZGEsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwYW5fY2IubnVtX2Nvbm5zLS07Ci0gICAgcGFuX3JlbGVhc2VfcGNiKHBjYik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogUmVxdWVzdGVkIGRlc3RpbmF0aW9uIHJvbGUgaXMgKi8KLSAgaWYgKHBjYi0+c3JjX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfUEFOVSkKLSAgICBwYW5fY2IuYWN0aXZlX3JvbGUgPSBQQU5fUk9MRV9DTElFTlQ7Ci0gIGVsc2UKLSAgICBwYW5fY2IuYWN0aXZlX3JvbGUgPSBQQU5fUk9MRV9OQVBfU0VSVkVSOwotCi0gIGlmIChwY2ItPmRzdF91dWlkID09IFVVSURfU0VSVkNMQVNTX1BBTlUpCi0gICAgcGVlcl9yb2xlID0gUEFOX1JPTEVfQ0xJRU5UOwotICBlbHNlCi0gICAgcGVlcl9yb2xlID0gUEFOX1JPTEVfTkFQX1NFUlZFUjsKLQotICBwY2ItPmNvbl9zdGF0ZSA9IFBBTl9TVEFURV9DT05ORUNURUQ7Ci0KLSAgLyogSW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNvbm5lY3Rpb24gaXMgZG93biAqLwotICBpZiAocGFuX2NiLnBhbl9jb25uX3N0YXRlX2NiKQotICAgICgqcGFuX2NiLnBhbl9jb25uX3N0YXRlX2NiKShwY2ItPmhhbmRsZSwgcGNiLT5yZW1fYmRhLCBQQU5fU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcm9sZV9jaGFuZ2UsIHBhbl9jYi5hY3RpdmVfcm9sZSwgcGVlcl9yb2xlKTsKLQotICAvKiBDcmVhdGUgYnJpZGdlIGlmIHRoZSBkZXN0aW5hdGlvbiByb2xlIGlzIE5BUCAqLwotICBpZiAocGFuX2NiLnBhbl9icmlkZ2VfcmVxX2NiICYmIHBjYi0+c3JjX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfTkFQKSB7Ci0gICAgUEFOX1RSQUNFX0VWRU5UKCJQQU4gcmVxdWVzdGluZyBmb3IgYnJpZGdlIik7Ci0gICAgKCpwYW5fY2IucGFuX2JyaWRnZV9yZXFfY2IpKHBjYi0+cmVtX2JkYSwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBhbl9kYXRhX2J1Zl9pbmRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIEJORVAgYXMgZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbiBjYWxsYmFjay4gQk5FUCB3aWxsIGNhbGwgdGhpcyB3aGVuIHRoZSBwZWVyIHNlbmRzCi0gKiAgICAgICAgICAgICAgICAgIGFueSBkYXRhIG9uIHRoaXMgY29ubmVjdGlvbi4gUEFOIGlzIHJlc3BvbnNpYmxlIHRvIHJlbGVhc2UKLSAqICAgICAgICAgICAgICAgICAgdGhlIGJ1ZmZlcgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHNyYyAgICAgICAgIC0gc291cmNlIEJEIEFkZHIKLSAqICAgICAgICAgICAgICAgICAgZHN0ICAgICAgICAgLSBkZXN0aW5hdGlvbiBCRCBBZGRyCi0gKiAgICAgICAgICAgICAgICAgIHByb3RvY29sICAgIC0gTmV0d29yayBwcm90b2NvbCBvZiB0aGUgRXRoIHBhY2tldAotICogICAgICAgICAgICAgICAgICBwX2J1ZiAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIGV4dCAgICAgICAgIC0gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZGF0YSBjb250YWlucyBhbnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gaGVhZGVycyBiZWZvcmUgdGhlIHBheWxvYWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwYW5fZGF0YV9idWZfaW5kX2NiKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGRzdCwgdWludDE2X3QgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZiwgYm9vbCBleHQpIHsKLSAgdFBBTl9DT05OICpwY2IsICpkc3RfcGNiOwotICB0Qk5FUF9SRVNVTFQgcmVzdWx0OwotICB1aW50MTZfdCBpLCBsZW47Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgYm9vbCBmb3J3YXJkID0gZmFsc2U7Ci0KLSAgLyogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gcmlnaHQgc3RhdGUgKi8KLSAgcGNiID0gcGFuX2dldF9wY2JfYnlfaGFuZGxlKGhhbmRsZSk7Ci0gIGlmICghcGNiKSB7Ci0gICAgUEFOX1RSQUNFX0VSUk9SKCJQQU4gRGF0YSBidWZmZXIgaW5kaWNhdGlvbiBmb3Igd3JvbmcgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBjYi0+Y29uX3N0YXRlICE9IFBBTl9TVEFURV9DT05ORUNURUQpIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTiBEYXRhIGluZGljYXRpb24gaW4gd3Jvbmcgc3RhdGUgJWQgZm9yIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHBjYi0+Y29uX3N0YXRlLCBoYW5kbGUpOwotICAgIHBjYi0+cmVhZC5kcm9wcysrOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBsZW4gPSBwX2J1Zi0+bGVuOwotCi0gIHBjYi0+cmVhZC5vY3RldHMgKz0gbGVuOwotICBwY2ItPnJlYWQucGFja2V0cysrOwotCi0gIFBBTl9UUkFDRV9FVkVOVCgKLSAgICAgICJwYW5fZGF0YV9idWZfaW5kX2NiIC0gZm9yIGhhbmRsZSAlZCwgcHJvdG9jb2wgMHgleCwgbGVuZ3RoICVkLCBleHQgJWQiLAotICAgICAgaGFuZGxlLCBwcm90b2NvbCwgbGVuLCBleHQpOwotCi0gIGlmIChwY2ItPnNyY191dWlkID09IFVVSURfU0VSVkNMQVNTX05BUCkKLSAgICBmb3J3YXJkID0gdHJ1ZTsKLSAgZWxzZQotICAgIGZvcndhcmQgPSBmYWxzZTsKLQotICAvKiBDaGVjayBpZiBpdCBpcyBicm9hZGNhc3Qgb3IgbXVsdGljYXN0IHBhY2tldCAqLwotICBpZiAocGNiLT5zcmNfdXVpZCAhPSBVVUlEX1NFUlZDTEFTU19QQU5VKSB7Ci0gICAgaWYgKGRzdC5hZGRyZXNzWzBdICYgMHgwMSkgewotICAgICAgUEFOX1RSQUNFX0RFQlVHKAotICAgICAgICAgICJQQU4gcmVjZWl2ZWQgYnJvYWRjYXN0IHBhY2tldCBvbiBoYW5kbGUgJWQsIHNyYyB1dWlkIDB4JXgiLCBoYW5kbGUsCi0gICAgICAgICAgcGNiLT5zcmNfdXVpZCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrKSB7Ci0gICAgICAgIGlmIChwYW5fY2IucGNiW2ldLmNvbl9zdGF0ZSA9PSBQQU5fU1RBVEVfQ09OTkVDVEVEICYmCi0gICAgICAgICAgICBwYW5fY2IucGNiW2ldLmhhbmRsZSAhPSBoYW5kbGUgJiYKLSAgICAgICAgICAgIHBjYi0+c3JjX3V1aWQgPT0gcGFuX2NiLnBjYltpXS5zcmNfdXVpZCkgewotICAgICAgICAgIEJORVBfV3JpdGUocGFuX2NiLnBjYltpXS5oYW5kbGUsIGRzdCwgcF9kYXRhLCBsZW4sIHByb3RvY29sLCAmc3JjLAotICAgICAgICAgICAgICAgICAgICAgZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAocGFuX2NiLnBhbl9kYXRhX2J1Zl9pbmRfY2IpCi0gICAgICAgICgqcGFuX2NiLnBhbl9kYXRhX2J1Zl9pbmRfY2IpKHBjYi0+aGFuZGxlLCBzcmMsIGRzdCwgcHJvdG9jb2wsIHBfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQsIGZvcndhcmQpOwotICAgICAgZWxzZSBpZiAocGFuX2NiLnBhbl9kYXRhX2luZF9jYikKLSAgICAgICAgKCpwYW5fY2IucGFuX2RhdGFfaW5kX2NiKShwY2ItPmhhbmRsZSwgc3JjLCBkc3QsIHByb3RvY29sLCBwX2RhdGEsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQsIGZvcndhcmQpOwotCi0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgaXQgaXMgZm9yIGFueSBvdGhlciBQQU4gY29ubmVjdGlvbiAqLwotICAgIGRzdF9wY2IgPSBwYW5fZ2V0X3BjYl9ieV9hZGRyKGRzdCk7Ci0gICAgaWYgKGRzdF9wY2IpIHsKLSAgICAgIFBBTl9UUkFDRV9FVkVOVCgKLSAgICAgICAgICAiJXMgLSBkZXN0aW5hdGlvbiBQQU5VIGZvdW5kIG9uIGhhbmRsZSAlZCBhbmQgc2VuZGluZyBkYXRhLCBsZW46ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgZHN0X3BjYi0+aGFuZGxlLCBsZW4pOwotCi0gICAgICByZXN1bHQgPQotICAgICAgICAgIEJORVBfV3JpdGUoZHN0X3BjYi0+aGFuZGxlLCBkc3QsIHBfZGF0YSwgbGVuLCBwcm90b2NvbCwgJnNyYywgZXh0KTsKLSAgICAgIGlmIChyZXN1bHQgIT0gQk5FUF9TVUNDRVNTICYmIHJlc3VsdCAhPSBCTkVQX0lHTk9SRV9DTUQpCi0gICAgICAgIFBBTl9UUkFDRV9FUlJPUigiRmFpbGVkIHRvIHdyaXRlIGRhdGEgZm9yIFBBTiBjb25uZWN0aW9uIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RfcGNiLT5oYW5kbGUpOwotICAgICAgcGNiLT5yZWFkLmVycm9ycysrOwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8qIFNlbmQgaXQgb3ZlciB0aGUgTEFOIG9yIGdpdmUgaXQgdG8gaG9zdCBzb2Z0d2FyZSAqLwotICBpZiAocGFuX2NiLnBhbl9kYXRhX2J1Zl9pbmRfY2IpCi0gICAgKCpwYW5fY2IucGFuX2RhdGFfYnVmX2luZF9jYikocGNiLT5oYW5kbGUsIHNyYywgZHN0LCBwcm90b2NvbCwgcF9idWYsIGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkKTsKLSAgZWxzZSBpZiAocGFuX2NiLnBhbl9kYXRhX2luZF9jYikKLSAgICAoKnBhbl9jYi5wYW5fZGF0YV9pbmRfY2IpKHBjYi0+aGFuZGxlLCBzcmMsIGRzdCwgcHJvdG9jb2wsIHBfZGF0YSwgbGVuLCBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkKTsKLSAgb3NpX2ZyZWUocF9idWYpOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwYW5fcHJvdG9fZmlsdF9pbmRfY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIEJORVAgdG8gcmVjZWl2ZSB0eCBkYXRhCi0gKiAgICAgICAgICBmbG93IHN0YXR1cwotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICBldmVudCAgICAgICAtIGZsb3cgc3RhdHVzCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcGFuX3R4X2RhdGFfZmxvd19jYih1aW50MTZfdCBoYW5kbGUsIHRCTkVQX1JFU1VMVCByZXN1bHQpIHsKLSAgaWYgKHBhbl9jYi5wYW5fdHhfZGF0YV9mbG93X2NiKQotICAgICgqcGFuX2NiLnBhbl90eF9kYXRhX2Zsb3dfY2IpKGhhbmRsZSwgKHRQQU5fUkVTVUxUKXJlc3VsdCk7Ci0KLSAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcGFuX3Byb3RvX2ZpbHRfaW5kX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCBCTkVQIGFzIHByb3RvIGZpbHRlcgotICogICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uIGNhbGxiYWNrLiBCTkVQIHdpbGwgY2FsbCB0aGlzIHdoZW4gdGhlIHBlZXIgc2VuZHMKLSAqICAgICAgICAgICAgICAgICAgYW55IHByb3RvY29sIGZpbHRlciBzZXQgZm9yIHRoZSBjb25uZWN0aW9uIG9yIHRvIGluZGljYXRlCi0gKiAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgdGhlIHByb3RvY29sIGZpbHRlciBzZXQgYnkgdGhlIGxvY2FsIGRldmljZQotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAgLSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGluZGljYXRpb24gIC0gdHJ1ZSBpZiB0aGlzIGlzIGluZGljYXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiBpdCBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgcmVzdWx0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGV2aWNlIHByb3RvY29sIGZpbHRlciBzZXQKLSAqICAgICAgICAgICAgICAgICAgcmVzdWx0ICAgICAgLSBUaGlzIGdpdmVzIHRoZSByZXN1bHQgb2YgdGhlIGZpbHRlciBzZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgLSBudW1iZXIgb2YgZmlsdGVycyBzZXQgYnkgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHBfZmlsdGVycyAgIC0gcG9pbnRlciB0byB0aGUgZmlsdGVycyBzZXQgYnkgdGhlIHBlZXIgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcGFuX3Byb3RvX2ZpbHRfaW5kX2NiKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJORVBfUkVTVUxUIHJlc3VsdCwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMpIHsKLSAgUEFOX1RSQUNFX0VWRU5UKAotICAgICAgInBhbl9wcm90b19maWx0X2luZF9jYiAtIGNhbGxlZCBmb3IgaGFuZGxlICVkIHdpdGggaW5kICVkLCByZXN1bHQgJWQsICIKLSAgICAgICJudW0gJWQiLAotICAgICAgaGFuZGxlLCBpbmRpY2F0aW9uLCByZXN1bHQsIG51bV9maWx0ZXJzKTsKLQotICBpZiAocGFuX2NiLnBhbl9wZmlsdF9pbmRfY2IpCi0gICAgKCpwYW5fY2IucGFuX3BmaWx0X2luZF9jYikoaGFuZGxlLCBpbmRpY2F0aW9uLCAodFBBTl9SRVNVTFQpcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9maWx0ZXJzLCBwX2ZpbHRlcnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcGFuX21jYXN0X2ZpbHRfaW5kX2NiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCBCTkVQIGFzIG1jYXN0IGZpbHRlcgotICogICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uIGNhbGxiYWNrLiBCTkVQIHdpbGwgY2FsbCB0aGlzIHdoZW4gdGhlIHBlZXIgc2VuZHMKLSAqICAgICAgICAgICAgICAgICAgYW55IG11bHRpY2FzdCBmaWx0ZXIgc2V0IGZvciB0aGUgY29ubmVjdGlvbiBvciB0byBpbmRpY2F0ZQotICogICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBtdWx0aWNhc3QgZmlsdGVyIHNldCBieSB0aGUgbG9jYWwgZGV2aWNlCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgICAtIGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbiAgLSB0cnVlIGlmIHRoaXMgaXMgaW5kaWNhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIGl0IGlzIGNhbGxlZCB0byBnaXZlIHRoZSByZXN1bHQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBkZXZpY2UgbXVsdGljYXN0IGZpbHRlciBzZXQKLSAqICAgICAgICAgICAgICAgICAgcmVzdWx0ICAgICAgLSBUaGlzIGdpdmVzIHRoZSByZXN1bHQgb2YgdGhlIGZpbHRlciBzZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMgLSBudW1iZXIgb2YgZmlsdGVycyBzZXQgYnkgdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIHBfZmlsdGVycyAgIC0gcG9pbnRlciB0byB0aGUgZmlsdGVycyBzZXQgYnkgdGhlIHBlZXIgZGV2aWNlCi0gKgotICogUmV0dXJucyAgICAgICAgICBub25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcGFuX21jYXN0X2ZpbHRfaW5kX2NiKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJORVBfUkVTVUxUIHJlc3VsdCwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2ZpbHRlcnMpIHsKLSAgUEFOX1RSQUNFX0VWRU5UKAotICAgICAgInBhbl9tY2FzdF9maWx0X2luZF9jYiAtIGNhbGxlZCBmb3IgaGFuZGxlICVkIHdpdGggaW5kICVkLCByZXN1bHQgJWQsICIKLSAgICAgICJudW0gJWQiLAotICAgICAgaGFuZGxlLCBpbmRpY2F0aW9uLCByZXN1bHQsIG51bV9maWx0ZXJzKTsKLQotICBpZiAocGFuX2NiLnBhbl9tZmlsdF9pbmRfY2IpCi0gICAgKCpwYW5fY2IucGFuX21maWx0X2luZF9jYikoaGFuZGxlLCBpbmRpY2F0aW9uLCAodFBBTl9SRVNVTFQpcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9maWx0ZXJzLCBwX2ZpbHRlcnMpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svcGFuL3Bhbl91dGlscy5jYyBiL3N0YWNrL3Bhbi9wYW5fdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTJkZGYuLjAwMDAwMDAKLS0tIGEvc3RhY2svcGFuL3Bhbl91dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1haW4gZnVuY3Rpb25zIHRvIHN1cHBvcnQgUEFOIHByb2ZpbGUKLSAqICBjb21tYW5kcyBhbmQgZXZlbnRzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9wYW4vcGFuX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFuX3Byb3RvX2VsZW1fZGF0YVtdID0gewotICAgIDB4MzUsIDB4MTgsICAgICAgIC8qIGRhdGEgZWxlbWVudCBzZXF1ZW5jZSBvZiBsZW5ndGggMHgxOCBieXRlcyAqLwotICAgIDB4MzUsIDB4MDYsICAgICAgIC8qIGRhdGEgZWxlbWVudCBzZXF1ZW5jZSBmb3IgTDJDQVAgZGVzY3JpcHRvciAqLwotICAgIDB4MTksIDB4MDEsIDB4MDAsIC8qIFVVSUQgZm9yIEwyQ0FQIC0gMHgwMTAwICovCi0gICAgMHgwOSwgMHgwMCwgMHgwRiwgLyogUFNNIGZvciBCTkVQIC0gMHgwMDBGICovCi0gICAgMHgzNSwgMHgwRSwgICAgICAgLyogZGF0YSBlbGVtZW50IHNlcWVuY2UgZm9yIEJORVAgZGVzY3JpcHRvciAqLwotICAgIDB4MTksIDB4MDAsIDB4MEYsIC8qIFVVSUQgZm9yIEJORVAgLSAweDAwMEYgKi8KLSAgICAweDA5LCAweDAxLAotICAgIDB4MDAsIC8qIEJORVAgc3BlY2lmaWMgcGFyYW1ldGVyIDAgLS0gVmVyc2lvbiBvZiBCTkVQID0gdmVyc2lvbiAxID0gMHgwMDAxCi0gICAgICAgICAgICovCi0gICAgMHgzNSwKLSAgICAweDA2LCAvKiBCTkVQIHNwZWNpZmljIHBhcmFtZXRlciAxIC0tIFN1cHBvcnRlZCBuZXR3b3JrIHBhY2tldCB0eXBlIGxpc3QgKi8KLSAgICAweDA5LCAweDA4LCAweDAwLCAvKiBuZXR3b3JrIHBhY2tldCB0eXBlIElQdjQgPSAweDA4MDAgKi8KLSAgICAweDA5LCAweDA4LCAweDA2ICAvKiBuZXR3b3JrIHBhY2tldCB0eXBlIEFSUCAgPSAweDA4MDYgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwYW5fcmVnaXN0ZXJfd2l0aF9zZHAKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDMyX3QgcGFuX3JlZ2lzdGVyX3dpdGhfc2RwKHVpbnQxNl90IHV1aWQsIGNvbnN0IGNoYXIqIHBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX2Rlc2MpIHsKLSAgdWludDMyX3Qgc2RwX2hhbmRsZTsKLSAgdWludDE2X3QgYnJvd3NlX2xpc3QgPSBVVUlEX1NFUlZDTEFTU19QVUJMSUNfQlJPV1NFX0dST1VQOwotICB1aW50MTZfdCBzZWN1cml0eSA9IDA7Ci0gIHVpbnQzMl90IHByb3RvX2xlbiA9ICh1aW50MzJfdClwYW5fcHJvdG9fZWxlbV9kYXRhWzFdOwotCi0gIC8qIENyZWF0ZSBhIHJlY29yZCAqLwotICBzZHBfaGFuZGxlID0gU0RQX0NyZWF0ZVJlY29yZCgpOwotCi0gIGlmIChzZHBfaGFuZGxlID09IDApIHsKLSAgICBQQU5fVFJBQ0VfRVJST1IoIlBBTl9TZXRSb2xlIC0gY291bGQgbm90IGNyZWF0ZSBTRFAgcmVjb3JkIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBTZXJ2aWNlIENsYXNzIElEIExpc3QgKi8KLSAgU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChzZHBfaGFuZGxlLCAxLCAmdXVpZCk7Ci0KLSAgLyogQWRkIHByb3RvY29sIGVsZW1lbnQgc2VxdWVuY2UgZnJvbSB0aGUgY29uc3RhbnQgc3RyaW5nICovCi0gIFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9QUk9UT0NPTF9ERVNDX0xJU1QsCi0gICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgcHJvdG9fbGVuLAotICAgICAgICAgICAgICAgICAgICh1aW50OF90KikocGFuX3Byb3RvX2VsZW1fZGF0YSArIDIpKTsKLQotICAvKiBMYW5ndWFnZSBiYXNlICovCi0gIFNEUF9BZGRMYW5ndWFnZUJhc2VBdHRySURMaXN0KHNkcF9oYW5kbGUsIExBTkdfSURfQ09ERV9FTkdMSVNILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQU5HX0lEX0NIQVJfRU5DT0RFX1VURjgsIExBTkdVQUdFX0JBU0VfSUQpOwotCi0gIC8qIFByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ICovCi0gIFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3Qoc2RwX2hhbmRsZSwgdXVpZCwgUEFOX1BST0ZJTEVfVkVSU0lPTik7Ci0KLSAgLyogU2VydmljZSBOYW1lICovCi0gIFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX05BTUUsIFRFWFRfU1RSX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAodWludDhfdCkoc3RybGVuKHBfbmFtZSkgKyAxKSwgKHVpbnQ4X3QqKXBfbmFtZSk7Ci0KLSAgLyogU2VydmljZSBkZXNjcmlwdGlvbiAqLwotICBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfU0VSVklDRV9ERVNDUklQVElPTiwgVEVYVF9TVFJfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICh1aW50OF90KShzdHJsZW4ocF9kZXNjKSArIDEpLCAodWludDhfdCopcF9kZXNjKTsKLQotICAvKiBTZWN1cml0eSBkZXNjcmlwdGlvbiAqLwotICAvLyBPbmx5IE5BUCBhbmQgUEFOVSBoYXMgc2VydmljZSBsZXZlbCBzZWN1cml0eTsgR04gaGFzIG5vIHNlY3VyaXR5Ci0gIGlmICh1dWlkID09IFVVSURfU0VSVkNMQVNTX05BUCB8fCB1dWlkID09IFVVSURfU0VSVkNMQVNTX1BBTlUpIHsKLSAgICBVSU5UMTZfVE9fQkVfRklFTEQoJnNlY3VyaXR5LCAweDAwMDEpOwotICB9Ci0gIFNEUF9BZGRBdHRyaWJ1dGUoc2RwX2hhbmRsZSwgQVRUUl9JRF9TRUNVUklUWV9ERVNDUklQVElPTiwgVUlOVF9ERVNDX1RZUEUsIDIsCi0gICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKSZzZWN1cml0eSk7Ci0KLSAgaWYgKHV1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfTkFQKSB7Ci0gICAgdWludDE2X3QgTmV0QWNjZXNzVHlwZSA9IDB4MDAwNTsgICAgICAvKiBFdGhlcm5ldCAqLwotICAgIHVpbnQzMl90IE5ldEFjY2Vzc1JhdGUgPSAweDAwMDEzMTJEMDsgLyogMTBNYi9zZWMgKi8KLSAgICB1aW50OF90IGFycmF5WzEwXSwgKnA7Ci0KLSAgICAvKiBOZXQgYWNjZXNzIHR5cGUuICovCi0gICAgcCA9IGFycmF5OwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgTmV0QWNjZXNzVHlwZSk7Ci0gICAgU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX05FVF9BQ0NFU1NfVFlQRSwgVUlOVF9ERVNDX1RZUEUsIDIsCi0gICAgICAgICAgICAgICAgICAgICBhcnJheSk7Ci0KLSAgICAvKiBOZXQgYWNjZXNzIHJhdGUuICovCi0gICAgcCA9IGFycmF5OwotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocCwgTmV0QWNjZXNzUmF0ZSk7Ci0gICAgU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX01BWF9ORVRfQUNDRVNTX1JBVEUsIFVJTlRfREVTQ19UWVBFLCA0LAotICAgICAgICAgICAgICAgICAgICAgYXJyYXkpOwotICB9Ci0KLSAgLyogTWFrZSB0aGUgc2VydmljZSBicm93c2FibGUgKi8KLSAgU0RQX0FkZFV1aWRTZXF1ZW5jZShzZHBfaGFuZGxlLCBBVFRSX0lEX0JST1dTRV9HUk9VUF9MSVNULCAxLCAmYnJvd3NlX2xpc3QpOwotCi0gIHJldHVybiBzZHBfaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcGFuX2FsbG9jYXRlX3BjYgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10UEFOX0NPTk4qIHBhbl9hbGxvY2F0ZV9wY2IoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEsIHVpbnQxNl90IGhhbmRsZSkgewotICB1aW50MTZfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBNQVhfUEFOX0NPTk5TOyBpKyspIHsKLSAgICBpZiAocGFuX2NiLnBjYltpXS5jb25fc3RhdGUgIT0gUEFOX1NUQVRFX0lETEUgJiYKLSAgICAgICAgcGFuX2NiLnBjYltpXS5oYW5kbGUgPT0gaGFuZGxlKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrKSB7Ci0gICAgaWYgKHBhbl9jYi5wY2JbaV0uY29uX3N0YXRlICE9IFBBTl9TVEFURV9JRExFICYmCi0gICAgICAgIHBhbl9jYi5wY2JbaV0ucmVtX2JkYSA9PSBwX2JkYSkKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykgewotICAgIGlmIChwYW5fY2IucGNiW2ldLmNvbl9zdGF0ZSA9PSBQQU5fU1RBVEVfSURMRSkgewotICAgICAgbWVtc2V0KCYocGFuX2NiLnBjYltpXSksIDAsIHNpemVvZih0UEFOX0NPTk4pKTsKLSAgICAgIHBhbl9jYi5wY2JbaV0ucmVtX2JkYSA9IHBfYmRhOwotICAgICAgcGFuX2NiLnBjYltpXS5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICByZXR1cm4gJihwYW5fY2IucGNiW2ldKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwYW5fZ2V0X3BjYl9ieV9oYW5kbGUKLSAqCi0gKiBEZXNjcmlwdGlvbgotICoKLSAqIFJldHVybnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFBBTl9DT05OKiBwYW5fZ2V0X3BjYl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIHVpbnQxNl90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykgewotICAgIGlmIChwYW5fY2IucGNiW2ldLmNvbl9zdGF0ZSAhPSBQQU5fU1RBVEVfSURMRSAmJgotICAgICAgICBwYW5fY2IucGNiW2ldLmhhbmRsZSA9PSBoYW5kbGUpCi0gICAgICByZXR1cm4gJihwYW5fY2IucGNiW2ldKTsKLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcGFuX2dldF9wY2JfYnlfYWRkcgotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10UEFOX0NPTk4qIHBhbl9nZXRfcGNiX2J5X2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgdWludDE2X3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrKSB7Ci0gICAgaWYgKHBhbl9jYi5wY2JbaV0uY29uX3N0YXRlID09IFBBTl9TVEFURV9JRExFKSBjb250aW51ZTsKLQotICAgIGlmIChwYW5fY2IucGNiW2ldLnJlbV9iZGEgPT0gcF9iZGEpIHJldHVybiAmKHBhbl9jYi5wY2JbaV0pOwotCi0gICAgLyoKLSAgICBpZiAocGFuX2NiLnBjYltpXS5tZmlsdGVyX3ByZXNlbnQgJiYKLSAgICAgICAgcF9iZGEgPT0gcGFuX2NiLnBjYltpXS5tdWx0aV9jYXN0X2JyaWRnZSkKLSAgICAgICAgcmV0dXJuICYocGFuX2NiLnBjYltpXSk7Ci0gICAgKi8KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcGFuX2Nsb3NlX2FsbF9jb25uZWN0aW9ucwotICoKLSAqIERlc2NyaXB0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcGFuX2Nsb3NlX2FsbF9jb25uZWN0aW9ucyh2b2lkKSB7Ci0gIHVpbnQxNl90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE1BWF9QQU5fQ09OTlM7IGkrKykgewotICAgIGlmIChwYW5fY2IucGNiW2ldLmNvbl9zdGF0ZSAhPSBQQU5fU1RBVEVfSURMRSkgewotICAgICAgQk5FUF9EaXNjb25uZWN0KHBhbl9jYi5wY2JbaV0uaGFuZGxlKTsKLSAgICAgIHBhbl9jYi5wY2JbaV0uY29uX3N0YXRlID0gUEFOX1NUQVRFX0lETEU7Ci0gICAgfQotICB9Ci0KLSAgcGFuX2NiLmFjdGl2ZV9yb2xlID0gUEFOX1JPTEVfSU5BQ1RJVkU7Ci0gIHBhbl9jYi5udW1fY29ubnMgPSAwOwotICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwYW5fcmVsZWFzZV9wY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYSBQQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcGFuX3JlbGVhc2VfcGNiKHRQQU5fQ09OTiogcF9wY2IpIHsKLSAgLyogRHJvcCBhbnkgcmVzcG9uc2UgcG9pbnRlciB3ZSBtYXkgYmUgaG9sZGluZyAqLwotICBtZW1zZXQocF9wY2IsIDAsIHNpemVvZih0UEFOX0NPTk4pKTsKLSAgcF9wY2ItPmNvbl9zdGF0ZSA9IFBBTl9TVEFURV9JRExFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcGFuX2R1bXBfc3RhdHVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGR1bXBzIHRoZSBwYW4gY29udHJvbCBibG9jayBhbmQgY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBibG9ja3MgaW5mb3JtYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwYW5fZHVtcF9zdGF0dXModm9pZCkgewotI2lmIChQQU5fU1VQUE9SVFNfREVCVUdfRFVNUCA9PSBUUlVFKQotICB1aW50MTZfdCBpOwotICB0UEFOX0NPTk4qIHBfcGNiOwotCi0gIFBBTl9UUkFDRV9ERUJVRygiUEFOIHJvbGUgJXgsIGFjdGl2ZSByb2xlICVkLCBudW1fY29ubnMgJWQiLCBwYW5fY2Iucm9sZSwKLSAgICAgICAgICAgICAgICAgIHBhbl9jYi5hY3RpdmVfcm9sZSwgcGFuX2NiLm51bV9jb25ucyk7Ci0KLSAgZm9yIChpID0gMCwgcF9wY2IgPSBwYW5fY2IucGNiOyBpIDwgTUFYX1BBTl9DT05OUzsgaSsrLCBwX3BjYisrKSB7Ci0gICAgVkxPRygxKSA8PCAraSA8PCAiIHN0YXRlOiIgPDwgcF9wY2ItPmNvbl9zdGF0ZQotICAgICAgICAgICAgPDwgIiwgaGFuZGxlOiIgPDwgcF9wY2ItPmhhbmRsZSA8PCAiLCBzcmMiIDw8IHBfcGNiLT5zcmNfdXVpZAotICAgICAgICAgICAgPDwgIiwgQkQ6IiA8PCBwX3BjYi0+cmVtX2JkYTsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zdGFjay9yZmNvbW0vcG9ydF9hcGkuY2MgYi9zdGFjay9yZmNvbW0vcG9ydF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmI3MzEuLjAwMDAwMDAKLS0tIGEvc3RhY2svcmZjb21tL3BvcnRfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyB0aGUgU2VyaWFsIFBvcnQgQVBJIGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3BvcnRfYXBpIgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcGRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcmZjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgZXJyb3IoZm10LCAuLi4pIFwKLSAgTE9HX0VSUk9SKCIjIyBFUlJPUiA6ICVzOiAiIGZtdCAiIyMiLCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXykKLQotLyogTWFwcGluZyBmcm9tIFBPUlRfKiByZXN1bHQgY29kZXMgdG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncy4gKi8KLXN0YXRpYyBjb25zdCBjaGFyKiByZXN1bHRfY29kZV9zdHJpbmdzW10gPSB7IlN1Y2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHJlYWR5IG9wZW5lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21tYW5kIHBlbmRpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwIG5vdCByZWdpc3RlcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyByZXNvdXJjZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIEJEIGFkZHJlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zcGVjaWZpZWQgZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGhhbmRsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgb3BlbmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmUgZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnQgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciBuZWdvdGlhdGlvbiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9ydCBuZWdvdGlhdGlvbiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VjIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZWVyIGNvbm5lY3Rpb24gZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlZXIgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlZXIgdGltZW91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbG9zZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFggZnVsbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCBjbG9zZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jYWwgdGltZW91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWCBxdWV1ZSBkaXNhYmxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYWdlIHRpbWVvdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBTQ04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biByZXN1bHQgY29kZSJ9OwotCi1pbnQgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb25XaXRoU2VjdXJpdHkodWludDE2X3QgdXVpZCwgdWludDhfdCBzY24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19zZXJ2ZXIsIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9DQUxMQkFDSyogcF9tZ210X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19tYXNrKSB7Ci0gIHJmY29tbV9zZWN1cml0eV9yZWNvcmRzW3Njbl0gPSBzZWNfbWFzazsKLQotICByZXR1cm4gUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24odXVpZCwgc2NuLCBpc19zZXJ2ZXIsIG10dSwgYmRfYWRkciwgcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21nbXRfY2IpOwotfQotCi1leHRlcm4gdm9pZCBSRkNPTU1fQ2xlYXJTZWN1cml0eVJlY29yZCh1aW50MzJfdCBzY24pIHsKLSAgcmZjb21tX3NlY3VyaXR5X3JlY29yZHMuZXJhc2Uoc2NuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbiBmdW5jdGlvbiBpcyB1c2VkIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRvIGVzdGFibGlzaCBzZXJpYWwgcG9ydCBjb25uZWN0aW9uIHRvIHRoZSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZSwgb3IgYWxsb3cgUkZDT01NIHRvIGFjY2VwdCBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHNjbiAgICAgICAgICAtIFNlcnZpY2UgQ2hhbm5lbCBOdW1iZXIgYXMgcmVnaXN0ZXJlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTRFAgKHNlcnZlcikgb3Igb2J0YWluZWQgdXNpbmcgU0RQIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBlZXIgZGV2aWNlIChjbGllbnQpLgotICogICAgICAgICAgICAgICAgICBpc19zZXJ2ZXIgICAgLSB0cnVlIGlmIHJlcXVlc3RpbmcgYXBwbGljYXRpb24gaXMgYSBzZXJ2ZXIKLSAqICAgICAgICAgICAgICAgICAgbXR1ICAgICAgICAgIC0gTWF4aW11bSBmcmFtZSBzaXplIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWNjZXB0Ci0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHIgICAgICAtIGFkZHJlc3Mgb2YgdGhlIHBlZXIgKGNsaWVudCkKLSAqICAgICAgICAgICAgICAgICAgbWFzayAgICAgICAgIC0gc3BlY2lmaWVzIGV2ZW50cyB0byBiZSBlbmFibGVkLiAgQSB2YWx1ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB6ZXJvIGRpc2FibGVzIGFsbCBldmVudHMuCi0gKiAgICAgICAgICAgICAgICAgIHBfaGFuZGxlICAgICAtIE9VVCBwb2ludGVyIHRvIHRoZSBoYW5kbGUuCi0gKiAgICAgICAgICAgICAgICAgIHBfbWdtdF9jYiAgICAtIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVjZWl2ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHVwL2Rvd24gZXZlbnRzLgotICogTm90ZXM6Ci0gKgotICogU2VydmVyIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzY24gcGFyYW1ldGVyIG11bHRpcGxlIHRpbWVzIGlmCi0gKiBpdCBpcyByZWFkeSB0byBhY2NlcHQgbXVsdGlwbGUgc2ltdWx0ZW5lb3VzIGNvbm5lY3Rpb25zLgotICoKLSAqIERMQ0kgZm9yIHRoZSBjb25uZWN0aW9uIGlzIChzY24gKiAyICsgMSkgaWYgY2xpZW50IG9yaWdpbmF0ZXMgY29ubmVjdGlvbiBvbgotICogZXhpc3Rpbmcgbm9uZSBpbml0aWF0b3IgbXVsdGlwbGV4ZXIgY2hhbm5lbC4gIE90aGVyd2lzZSBpdCBpcyAoc2NuICogMikuCi0gKiBGb3IgdGhlIHNlcnZlciBETENJIGNhbiBiZSBjaGFuZ2VkIGxhdGVyIGlmIGNsaWVudCB3aWxsIGJlIGNhbGxpbmcgaXQgdXNpbmcKLSAqIChzY24gKiAyICsgMSkgZGxjaS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKHVpbnQxNl90IHV1aWQsIHVpbnQ4X3Qgc2NuLCBib29sIGlzX3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtdHUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfaGFuZGxlLCB0UE9SVF9DQUxMQkFDSyogcF9tZ210X2NiKSB7Ci0gICpwX2hhbmRsZSA9IDA7Ci0KLSAgaWYgKChzY24gPT0gMCkgfHwgKHNjbiA+PSBQT1JUX01BWF9SRkNfUE9SVFMpKSB7Ci0gICAgLy8gU2VydmVyIENoYW5uZWwgTnVtYmVyIChTQ04pIHNob3VsZCBiZSBpbiByYW5nZSBbMSwgMzBdCi0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBJbnZhbGlkIFNDTiwgYmRfYWRkcj0iIDw8IGJkX2FkZHIKLSAgICAgICAgICAgICAgIDw8ICIsIHNjbj0iIDw8IHN0YXRpY19jYXN0PGludD4oc2NuKQotICAgICAgICAgICAgICAgPDwgIiwgaXNfc2VydmVyPSIgPDwgaXNfc2VydmVyCi0gICAgICAgICAgICAgICA8PCAiLCBtdHU9IiA8PCBzdGF0aWNfY2FzdDxpbnQ+KG10dSkKLSAgICAgICAgICAgICAgIDw8ICIsIHV1aWQ9IiA8PCBsb2doZXgodXVpZCk7Ci0gICAgcmV0dXJuIChQT1JUX0lOVkFMSURfU0NOKTsKLSAgfQotCi0gIC8vIEZvciBjbGllbnQgdGhhdCBvcmlnaW5hdGVzIGNvbm5lY3Rpb24gb24gdGhlIGV4aXN0aW5nIG5vbmUgaW5pdGlhdG9yCi0gIC8vIG11bHRpcGxleGVyIGNoYW5uZWwsIERMQ0kgc2hvdWxkIGJlIG9kZC4KLSAgdWludDhfdCBkbGNpOwotICB0UkZDX01DQiogcF9tY2IgPSBwb3J0X2ZpbmRfbWNiKGJkX2FkZHIpOwotICBpZiAocF9tY2IgJiYgIXBfbWNiLT5pc19pbml0aWF0b3IgJiYgIWlzX3NlcnZlcikgewotICAgIGRsY2kgPSBzdGF0aWNfY2FzdDx1aW50OF90Pigoc2NuIDw8IDEpICsgMSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGxjaSA9IChzY24gPDwgMSk7Ci0gIH0KLQotICAvLyBPbiB0aGUgY2xpZW50IHNpZGUsIGRvIG5vdCBhbGxvdyB0aGUgc2FtZSAoZGxjaSwgYmRfYWRkcikgdG8gYmUgb3BlbmVkCi0gIC8vIHR3aWNlIGJ5IGFwcGxpY2F0aW9uCi0gIHRQT1JUKiBwX3BvcnQ7Ci0gIGlmICghaXNfc2VydmVyKSB7Ci0gICAgcF9wb3J0ID0gcG9ydF9maW5kX3BvcnQoZGxjaSwgYmRfYWRkcik7Ci0gICAgaWYgKHBfcG9ydCAhPSBudWxscHRyKSB7Ci0gICAgICAvLyBpZiBleGlzdGluZyBwb3J0IGlzIGFsc28gYSBjbGllbnQgcG9ydCwgZXJyb3Igb3V0Ci0gICAgICBpZiAoIXBfcG9ydC0+aXNfc2VydmVyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogYWxyZWFkeSBhdCBvcGVuZWQgc3RhdGUgIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4ocF9wb3J0LT5zdGF0ZSkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBSRkNfc3RhdGU9IiA8PCBzdGF0aWNfY2FzdDxpbnQ+KHBfcG9ydC0+cmZjLnN0YXRlKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIE1DQl9zdGF0ZT0iCi0gICAgICAgICAgICAgICAgICAgPDwgKHBfcG9ydC0+cmZjLnBfbWNiID8gcF9wb3J0LT5yZmMucF9tY2ItPnN0YXRlIDogMCkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBiZF9hZGRyPSIgPDwgYmRfYWRkciA8PCAiLCBzY249IiA8PCBzdGQ6OnRvX3N0cmluZyhzY24pCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgaXNfc2VydmVyPSIgPDwgaXNfc2VydmVyIDw8ICIsIG10dT0iIDw8IG10dQotICAgICAgICAgICAgICAgICAgIDw8ICIsIHV1aWQ9IiA8PCBsb2doZXgodXVpZCkgPDwgIiwgZGxjaT0iIDw8ICtkbGNpCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgcF9tY2I9IiA8PCBwX21jYgotICAgICAgICAgICAgICAgICAgIDw8ICIsIHBvcnQ9IiA8PCBzdGQ6OnRvX3N0cmluZyhwX3BvcnQtPmhhbmRsZSk7Ci0gICAgICAgICpwX2hhbmRsZSA9IHBfcG9ydC0+aGFuZGxlOwotICAgICAgICByZXR1cm4gKFBPUlRfQUxSRUFEWV9PUEVORUQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIE9uIHRoZSBzZXJ2ZXIgc2lkZSwgYWx3YXlzIGFsbG9jYXRlIGEgbmV3IHBvcnQuCi0gIHBfcG9ydCA9IHBvcnRfYWxsb2NhdGVfcG9ydChkbGNpLCBiZF9hZGRyKTsKLSAgaWYgKHBfcG9ydCA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBubyByZXNvdXJjZXMsIGJkX2FkZHI9IiA8PCBiZF9hZGRyCi0gICAgICAgICAgICAgICA8PCAiLCBzY249IiA8PCBzdGQ6OnRvX3N0cmluZyhzY24pIDw8ICIsIGlzX3NlcnZlcj0iIDw8IGlzX3NlcnZlcgotICAgICAgICAgICAgICAgPDwgIiwgbXR1PSIgPDwgbXR1IDw8ICIsIHV1aWQ9IiA8PCBsb2doZXgodXVpZCkKLSAgICAgICAgICAgICAgIDw8ICIsIGRsY2k9IiA8PCArZGxjaTsKLSAgICByZXR1cm4gUE9SVF9OT19SRVNPVVJDRVM7Ci0gIH0KLSAgKnBfaGFuZGxlID0gcF9wb3J0LT5oYW5kbGU7Ci0KLSAgLy8gR2V0IGRlZmF1bHQgc2lnbmFsIHN0YXRlCi0gIHN3aXRjaCAodXVpZCkgewotICAgIGNhc2UgVVVJRF9QUk9UT0NPTF9PQkVYOgotICAgICAgcF9wb3J0LT5kZWZhdWx0X3NpZ25hbF9zdGF0ZSA9IFBPUlRfT0JFWF9ERUZBVUxUX1NJR05BTF9TVEFURTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfU0VSSUFMX1BPUlQ6Ci0gICAgICBwX3BvcnQtPmRlZmF1bHRfc2lnbmFsX3N0YXRlID0gUE9SVF9TUFBfREVGQVVMVF9TSUdOQUxfU1RBVEU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0xBTl9BQ0NFU1NfVVNJTkdfUFBQOgotICAgICAgcF9wb3J0LT5kZWZhdWx0X3NpZ25hbF9zdGF0ZSA9IFBPUlRfUFBQX0RFRkFVTFRfU0lHTkFMX1NUQVRFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVVUlEX1NFUlZDTEFTU19ESUFMVVBfTkVUV09SS0lORzoKLSAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0ZBWDoKLSAgICAgIHBfcG9ydC0+ZGVmYXVsdF9zaWduYWxfc3RhdGUgPSBQT1JUX0RVTl9ERUZBVUxUX1NJR05BTF9TVEFURTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwX3BvcnQtPmRlZmF1bHRfc2lnbmFsX3N0YXRlID0KLSAgICAgICAgICAoUE9SVF9EVFJEU1JfT04gfCBQT1JUX0NUU1JUU19PTiB8IFBPUlRfRENEX09OKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gQXNzaWduIHBvcnQgc3BlY2lmaWMgdmFsdWVzCi0gIHBfcG9ydC0+c3RhdGUgPSBQT1JUX1NUQVRFX09QRU5JTkc7Ci0gIHBfcG9ydC0+dXVpZCA9IHV1aWQ7Ci0gIHBfcG9ydC0+aXNfc2VydmVyID0gaXNfc2VydmVyOwotICBwX3BvcnQtPnNjbiA9IHNjbjsKLSAgcF9wb3J0LT5ldl9tYXNrID0gMDsKLQotICAvLyBGaW5kIE1UVQotICAvLyBJZiB0aGUgTVRVIGlzIG5vdCBzcGVjaWZpZWQgKDApLCBrZWVwIE1UVSBkZWNpc2lvbiB1bnRpbCB0aGUgUE4gZnJhbWUgaGFzCi0gIC8vIHRvIGJlIHNlbmQgYXQgdGhhdCB0aW1lIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGVzdGFibGlzaGVkIGFuZCB3ZSB3aWxsIGtub3cKLSAgLy8gZm9yIHN1cmUgb3VyIHByZWZlcmVkIE1UVQotICB1aW50MTZfdCByZmNvbW1fbXR1ID0gTDJDQVBfTVRVX1NJWkUgLSBSRkNPTU1fREFUQV9PVkVSSEVBRDsKLSAgaWYgKG10dSkgewotICAgIHBfcG9ydC0+bXR1ID0gKG10dSA8IHJmY29tbV9tdHUpID8gbXR1IDogcmZjb21tX210dTsKLSAgfSBlbHNlIHsKLSAgICBwX3BvcnQtPm10dSA9IHJmY29tbV9tdHU7Ci0gIH0KLQotICAvLyBPdGhlciBzdGF0ZXMKLSAgLy8gc2VydmVyIGRvZXNuJ3QgbmVlZCB0byByZWxlYXNlIHBvcnQgd2hlbiBjbG9zaW5nCi0gIGlmIChpc19zZXJ2ZXIpIHsKLSAgICBwX3BvcnQtPmtlZXBfcG9ydF9oYW5kbGUgPSB0cnVlOwotICAgIC8vIGtlZXAgbXR1IHRoYXQgdXNlciBhc2tlZCwgcF9wb3J0LT5tdHUgY291bGQgYmUgdXBkYXRlZCBkdXJpbmcgcGFyYW0KLSAgICAvLyBuZWdvdGlhdGlvbgotICAgIHBfcG9ydC0+a2VlcF9tdHUgPSBwX3BvcnQtPm10dTsKLSAgfQotICBwX3BvcnQtPmxvY2FsX2N0cmwubW9kZW1fc2lnbmFsID0gcF9wb3J0LT5kZWZhdWx0X3NpZ25hbF9zdGF0ZTsKLSAgcF9wb3J0LT5sb2NhbF9jdHJsLmZjID0gZmFsc2U7Ci0gIHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrID0gcF9tZ210X2NiOwotICBwX3BvcnQtPmJkX2FkZHIgPSBiZF9hZGRyOwotCi0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBiZF9hZGRyPSIgPDwgYmRfYWRkcgotICAgICAgICAgICAgPDwgIiwgc2NuPSIgPDwgc3RkOjp0b19zdHJpbmcoc2NuKSA8PCAiLCBpc19zZXJ2ZXI9IiA8PCBpc19zZXJ2ZXIKLSAgICAgICAgICAgIDw8ICIsIG10dT0iIDw8IG10dSA8PCAiLCB1dWlkPSIgPDwgbG9naGV4KHV1aWQpCi0gICAgICAgICAgICA8PCAiLCBkbGNpPSIgPDwgc3RkOjp0b19zdHJpbmcoZGxjaSkKLSAgICAgICAgICAgIDw8ICIsIHNpZ25hbF9zdGF0ZT0iIDw8IGxvZ2hleChwX3BvcnQtPmRlZmF1bHRfc2lnbmFsX3N0YXRlKQotICAgICAgICAgICAgPDwgIiwgcF9wb3J0PSIgPDwgcF9wb3J0OwotCi0gIC8vIElmIHRoaXMgaXMgbm90IGluaXRpYXRvciBvZiB0aGUgY29ubmVjdGlvbiBuZWVkIHRvIGp1c3Qgd2FpdAotICBpZiAocF9wb3J0LT5pc19zZXJ2ZXIpIHsKLSAgICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci0gIH0KLQotICAvLyBPcGVuIHdpbGwgYmUgY29udGludWVkIGFmdGVyIHNlY3VyaXR5IGNoZWNrcyBhcmUgcGFzc2VkCi0gIHJldHVybiBwb3J0X29wZW5fY29udGludWUocF9wb3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9SZW1vdmVDb25uZWN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbG9zZSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24odWludDE2X3QgaGFuZGxlKSB7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0KLSAgUkZDT01NX1RSQUNFX0FQSSgiUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24oKSBoYW5kbGU6JWQiLCBoYW5kbGUpOwotCi0gIC8qIENoZWNrIGlmIGhhbmRsZSBpcyB2YWxpZCB0byBhdm9pZCBjcmFzaGluZyAqLwotICBpZiAoKGhhbmRsZSA9PSAwKSB8fCAoaGFuZGxlID4gTUFYX1JGQ19QT1JUUykpIHsKLSAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIlJGQ09NTV9SZW1vdmVDb25uZWN0aW9uKCkgQkFEIGhhbmRsZTolZCIsIGhhbmRsZSk7Ci0gICAgcmV0dXJuIChQT1JUX0JBRF9IQU5ETEUpOwotICB9Ci0gIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdOwotCi0gIGlmICghcF9wb3J0LT5pbl91c2UgfHwgKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9DTE9TRUQpKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VWRU5UKCJSRkNPTU1fUmVtb3ZlQ29ubmVjdGlvbigpIE5vdCBvcGVuZWQ6JWQiLCBoYW5kbGUpOwotICAgIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLSAgfQotCi0gIHBfcG9ydC0+c3RhdGUgPSBQT1JUX1NUQVRFX0NMT1NJTkc7Ci0KLSAgcG9ydF9zdGFydF9jbG9zZShwX3BvcnQpOwotCi0gIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9SZW1vdmVTZXJ2ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsb3NlIHRoZSBzZXJ2ZXIgcG9ydC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBSRkNPTU1fUmVtb3ZlU2VydmVyKHVpbnQxNl90IGhhbmRsZSkgewotICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgdG8gYXZvaWQgY3Jhc2hpbmcgKi8KLSAgaWYgKChoYW5kbGUgPT0gMCkgfHwgKGhhbmRsZSA+IE1BWF9SRkNfUE9SVFMpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBiYWQgaGFuZGxlICIgPDwgaGFuZGxlOwotICAgIHJldHVybiAoUE9SVF9CQURfSEFORExFKTsKLSAgfQotICB0UE9SVCogcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbaGFuZGxlIC0gMV07Ci0KLSAgLyogRG8gbm90IHJlcG9ydCBhbnkgZXZlbnRzIHRvIHRoZSBjbGllbnQgYW55IG1vcmUuICovCi0gIHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrID0gbnVsbHB0cjsKLQotICBpZiAoIXBfcG9ydC0+aW5fdXNlIHx8IChwX3BvcnQtPnN0YXRlID09IFBPUlRfU1RBVEVfQ0xPU0VEKSkgewotICAgIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogaGFuZGxlICIgPDwgaGFuZGxlIDw8ICIgbm90IG9wZW5lZCI7Ci0gICAgcmV0dXJuIChQT1JUX1NVQ0NFU1MpOwotICB9Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBoYW5kbGU9IiA8PCBoYW5kbGU7Ci0KLSAgLyogdGhpcyBwb3J0IHdpbGwgYmUgZGVhbGxvY2F0ZWQgYWZ0ZXIgY2xvc2luZyAqLwotICBwX3BvcnQtPmtlZXBfcG9ydF9oYW5kbGUgPSBmYWxzZTsKLSAgcF9wb3J0LT5zdGF0ZSA9IFBPUlRfU1RBVEVfQ0xPU0lORzsKLQotICBwb3J0X3N0YXJ0X2Nsb3NlKHBfcG9ydCk7Ci0KLSAgcmV0dXJuIChQT1JUX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9TZXRFdmVudENhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm92aWRlIGFuIGFkZHJlc3Mgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBldmVudHMKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBtYXNrIG9jY3VyZXMuCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwX2NhbGxiYWNrIC0gYWRkcmVzcyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggc2hvdWxkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgZnJvbSB0aGUgUkZDT01NIHdoZW4gYW4gZXZlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgbWFzayBvY2N1cmVzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBPUlRfU2V0RXZlbnRDYWxsYmFjayh1aW50MTZfdCBwb3J0X2hhbmRsZSwgdFBPUlRfQ0FMTEJBQ0sqIHBfcG9ydF9jYikgewotICB0UE9SVCogcF9wb3J0OwotCi0gIC8qIENoZWNrIGlmIGhhbmRsZSBpcyB2YWxpZCB0byBhdm9pZCBjcmFzaGluZyAqLwotICBpZiAoKHBvcnRfaGFuZGxlID09IDApIHx8IChwb3J0X2hhbmRsZSA+IE1BWF9SRkNfUE9SVFMpKSB7Ci0gICAgcmV0dXJuIChQT1JUX0JBRF9IQU5ETEUpOwotICB9Ci0KLSAgcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbcG9ydF9oYW5kbGUgLSAxXTsKLQotICBpZiAoIXBfcG9ydC0+aW5fdXNlIHx8IChwX3BvcnQtPnN0YXRlID09IFBPUlRfU1RBVEVfQ0xPU0VEKSkgewotICAgIHJldHVybiAoUE9SVF9OT1RfT1BFTkVEKTsKLSAgfQotCi0gIFJGQ09NTV9UUkFDRV9BUEkoIlBPUlRfU2V0RXZlbnRDYWxsYmFjaygpIGhhbmRsZTolZCIsIHBvcnRfaGFuZGxlKTsKLQotICBwX3BvcnQtPnBfY2FsbGJhY2sgPSBwX3BvcnRfY2I7Ci0KLSAgcmV0dXJuIChQT1JUX1NVQ0NFU1MpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfQ2xlYXJLZWVwSGFuZGxlRmxhZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xlYXIgdGhlIGtlZXAgaGFuZGxlIGZsYWcsIHdoaWNoIHdpbGwgY2F1c2Ugbm90IHRvIGtlZXAgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBvcnQgaGFuZGxlIG9wZW4gd2hlbiBjbG9zZWQKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAtIEhhbmRsZSByZXR1cm5lZCBpbiB0aGUgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgUE9SVF9DbGVhcktlZXBIYW5kbGVGbGFnKHVpbnQxNl90IHBvcnRfaGFuZGxlKSB7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0KLSAgLyogQ2hlY2sgaWYgaGFuZGxlIGlzIHZhbGlkIHRvIGF2b2lkIGNyYXNoaW5nICovCi0gIGlmICgocG9ydF9oYW5kbGUgPT0gMCkgfHwgKHBvcnRfaGFuZGxlID4gTUFYX1JGQ19QT1JUUykpIHsKLSAgICByZXR1cm4gKFBPUlRfQkFEX0hBTkRMRSk7Ci0gIH0KLQotICBwX3BvcnQgPSAmcmZjX2NiLnBvcnQucG9ydFtwb3J0X2hhbmRsZSAtIDFdOwotICBwX3BvcnQtPmtlZXBfcG9ydF9oYW5kbGUgPSAwOwotICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX1NldENPRGF0YUNhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHdoZW4gYSBkYXRhIHBhY2tldCBpcyByZWNlaXZlZAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAtIEhhbmRsZSByZXR1cm5lZCBpbiB0aGUgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcF9jYWxsYmFjayAtIGFkZHJlc3Mgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHNob3VsZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSB3aGVuIGRhdGEgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZC4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQT1JUX1NldERhdGFDT0NhbGxiYWNrKHVpbnQxNl90IHBvcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBPUlRfREFUQV9DT19DQUxMQkFDSyogcF9wb3J0X2NiKSB7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0KLSAgUkZDT01NX1RSQUNFX0FQSSgiUE9SVF9TZXREYXRhQ09DYWxsYmFjaygpIGhhbmRsZTolZCBjYiAweCV4IiwgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgcF9wb3J0X2NiKTsKLQotICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgdG8gYXZvaWQgY3Jhc2hpbmcgKi8KLSAgaWYgKChwb3J0X2hhbmRsZSA9PSAwKSB8fCAocG9ydF9oYW5kbGUgPiBNQVhfUkZDX1BPUlRTKSkgewotICAgIHJldHVybiAoUE9SVF9CQURfSEFORExFKTsKLSAgfQotCi0gIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W3BvcnRfaGFuZGxlIC0gMV07Ci0KLSAgaWYgKCFwX3BvcnQtPmluX3VzZSB8fCAocF9wb3J0LT5zdGF0ZSA9PSBQT1JUX1NUQVRFX0NMT1NFRCkpIHsKLSAgICByZXR1cm4gKFBPUlRfTk9UX09QRU5FRCk7Ci0gIH0KLQotICBwX3BvcnQtPnBfZGF0YV9jb19jYWxsYmFjayA9IHBfcG9ydF9jYjsKLQotICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX1NldEV2ZW50TWFzawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2xvc2UgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAtIEhhbmRsZSByZXR1cm5lZCBpbiB0aGUgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgbWFzayAgIC0gQml0bWFzayBvZiB0aGUgZXZlbnRzIHRoZSBob3N0IGlzIGludGVyZXN0ZWQgaW4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBPUlRfU2V0RXZlbnRNYXNrKHVpbnQxNl90IHBvcnRfaGFuZGxlLCB1aW50MzJfdCBtYXNrKSB7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0KLSAgUkZDT01NX1RSQUNFX0FQSSgiUE9SVF9TZXRFdmVudE1hc2soKSBoYW5kbGU6JWQgbWFzazoweCV4IiwgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgbWFzayk7Ci0KLSAgLyogQ2hlY2sgaWYgaGFuZGxlIGlzIHZhbGlkIHRvIGF2b2lkIGNyYXNoaW5nICovCi0gIGlmICgocG9ydF9oYW5kbGUgPT0gMCkgfHwgKHBvcnRfaGFuZGxlID4gTUFYX1JGQ19QT1JUUykpIHsKLSAgICByZXR1cm4gKFBPUlRfQkFEX0hBTkRMRSk7Ci0gIH0KLQotICBwX3BvcnQgPSAmcmZjX2NiLnBvcnQucG9ydFtwb3J0X2hhbmRsZSAtIDFdOwotCi0gIGlmICghcF9wb3J0LT5pbl91c2UgfHwgKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9DTE9TRUQpKSB7Ci0gICAgcmV0dXJuIChQT1JUX05PVF9PUEVORUQpOwotICB9Ci0KLSAgcF9wb3J0LT5ldl9tYXNrID0gbWFzazsKLQotICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0NoZWNrQ29ubmVjdGlvbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFBPUlRfU1VDQ0VTUyBpZiBjb25uZWN0aW9uIHJlZmVyZW5jZWQKLSAqICAgICAgICAgICAgICAgICAgYnkgaGFuZGxlIGlzIHVwIGFuZCBydW5uaW5nCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBiZF9hZGRyICAgIC0gT1VUIGJkX2FkZHIgb2YgdGhlIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgcF9sY2lkICAgICAtIE9VVCBMMkNBUCdzIExDSUQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBPUlRfQ2hlY2tDb25uZWN0aW9uKHVpbnQxNl90IGhhbmRsZSwgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9sY2lkKSB7Ci0gIC8qIENoZWNrIGlmIGhhbmRsZSBpcyB2YWxpZCB0byBhdm9pZCBjcmFzaGluZyAqLwotICBpZiAoKGhhbmRsZSA9PSAwKSB8fCAoaGFuZGxlID4gTUFYX1JGQ19QT1JUUykpIHsKLSAgICByZXR1cm4gKFBPUlRfQkFEX0hBTkRMRSk7Ci0gIH0KLSAgdFBPUlQqIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdOwotICBSRkNPTU1fVFJBQ0VfREVCVUcoCi0gICAgICAiJXM6IGhhbmRsZT0lZCwgaW5fdXNlPSVkLCBwb3J0X3N0YXRlPSVkLCBwX21jYj0lcCwgcGVlcl9yZWFkeT0lZCwgIgotICAgICAgInJmY19zdGF0ZT0lZCIsCi0gICAgICBfX2Z1bmNfXywgaGFuZGxlLCBwX3BvcnQtPmluX3VzZSwgcF9wb3J0LT5zdGF0ZSwgcF9wb3J0LT5yZmMucF9tY2IsCi0gICAgICAocF9wb3J0LT5yZmMucF9tY2IgPyBwX3BvcnQtPnJmYy5wX21jYi0+cGVlcl9yZWFkeSA6IC0xKSwKLSAgICAgIHBfcG9ydC0+cmZjLnN0YXRlKTsKLQotICBpZiAoIXBfcG9ydC0+aW5fdXNlIHx8IChwX3BvcnQtPnN0YXRlID09IFBPUlRfU1RBVEVfQ0xPU0VEKSkgewotICAgIHJldHVybiAoUE9SVF9OT1RfT1BFTkVEKTsKLSAgfQotCi0gIGlmICghcF9wb3J0LT5yZmMucF9tY2IgfHwgIXBfcG9ydC0+cmZjLnBfbWNiLT5wZWVyX3JlYWR5IHx8Ci0gICAgICAocF9wb3J0LT5yZmMuc3RhdGUgIT0gUkZDX1NUQVRFX09QRU5FRCkpIHsKLSAgICByZXR1cm4gKFBPUlRfTElORV9FUlIpOwotICB9Ci0KLSAgKmJkX2FkZHIgPSBwX3BvcnQtPnJmYy5wX21jYi0+YmRfYWRkcjsKLSAgaWYgKHBfbGNpZCkgKnBfbGNpZCA9IHBfcG9ydC0+cmZjLnBfbWNiLT5sY2lkOwotCi0gIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfSXNPcGVuaW5nCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgUkZDT01NIGNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgb3BlbmluZyBpbiBwcm9jZXNzLgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgdHJ1ZSBpZiBhbnkgY29ubmVjdGlvbiBvcGVuaW5nIGlzIGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgIGJkX2FkZHIgICAgLSBiZF9hZGRyIG9mIHRoZSBwZWVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgUE9SVF9Jc09wZW5pbmcoUmF3QWRkcmVzcyogYmRfYWRkcikgewotICAvKiBDaGVjayBmb3IgYW55IHJmY19tY2Igd2hpY2ggaXMgaW4gdGhlIG1pZGRsZSBvZiBvcGVuaW5nLiAqLwotICBmb3IgKGF1dG8mIG11bHRpcGxleGVyX2NiIDogcmZjX2NiLnBvcnQucmZjX21jYikgewotICAgIGlmICgobXVsdGlwbGV4ZXJfY2Iuc3RhdGUgPiBSRkNfTVhfU1RBVEVfSURMRSkgJiYKLSAgICAgICAgKG11bHRpcGxleGVyX2NiLnN0YXRlIDwgUkZDX01YX1NUQVRFX0NPTk5FQ1RFRCkpIHsKLSAgICAgICpiZF9hZGRyID0gbXVsdGlwbGV4ZXJfY2IuYmRfYWRkcjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtdWx0aXBsZXhlcl9jYi5zdGF0ZSA9PSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICBib29sIGZvdW5kX3BvcnQgPSBmYWxzZTsKLSAgICAgIHRQT1JUKiBwX3BvcnQgPSBudWxscHRyOwotCi0gICAgICBmb3IgKHRQT1JUJiBwb3J0IDogcmZjX2NiLnBvcnQucG9ydCkgewotICAgICAgICBpZiAocG9ydC5yZmMucF9tY2IgPT0gJm11bHRpcGxleGVyX2NiKSB7Ci0gICAgICAgICAgZm91bmRfcG9ydCA9IHRydWU7Ci0gICAgICAgICAgcF9wb3J0ID0gJnBvcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCghZm91bmRfcG9ydCkgfHwKLSAgICAgICAgICAoZm91bmRfcG9ydCAmJiAocF9wb3J0LT5yZmMuc3RhdGUgPCBSRkNfU1RBVEVfT1BFTkVEKSkpIHsKLSAgICAgICAgLyogUG9ydCBpcyBub3QgZXN0YWJsaXNoZWQgeWV0LiAqLwotICAgICAgICAqYmRfYWRkciA9IG11bHRpcGxleGVyX2NiLmJkX2FkZHI7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfU2V0U3RhdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBjb25uZWN0aW9uIGFjY29yZGluZyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIHRQT1JUX1NUQVRFIHN0cnVjdHVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfc2V0dGluZ3MgLSBQb2ludGVyIHRvIGEgdFBPUlRfU1RBVEUgc3RydWN0dXJlIGNvbnRhaW5pbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBjb25uZWN0aW9uLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBPUlRfU2V0U3RhdGUodWludDE2X3QgaGFuZGxlLCB0UE9SVF9TVEFURSogcF9zZXR0aW5ncykgewotICB0UE9SVCogcF9wb3J0OwotICB1aW50OF90IGJhdWRfcmF0ZTsKLQotICBSRkNPTU1fVFJBQ0VfQVBJKCJQT1JUX1NldFN0YXRlKCkgaGFuZGxlOiVkIiwgaGFuZGxlKTsKLQotICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgdG8gYXZvaWQgY3Jhc2hpbmcgKi8KLSAgaWYgKChoYW5kbGUgPT0gMCkgfHwgKGhhbmRsZSA+IE1BWF9SRkNfUE9SVFMpKSB7Ci0gICAgcmV0dXJuIChQT1JUX0JBRF9IQU5ETEUpOwotICB9Ci0KLSAgcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbaGFuZGxlIC0gMV07Ci0KLSAgaWYgKCFwX3BvcnQtPmluX3VzZSB8fCAocF9wb3J0LT5zdGF0ZSA9PSBQT1JUX1NUQVRFX0NMT1NFRCkpIHsKLSAgICByZXR1cm4gKFBPUlRfTk9UX09QRU5FRCk7Ci0gIH0KLQotICBpZiAocF9wb3J0LT5saW5lX3N0YXR1cykgewotICAgIHJldHVybiAoUE9SVF9MSU5FX0VSUik7Ci0gIH0KLQotICBSRkNPTU1fVFJBQ0VfQVBJKCJQT1JUX1NldFN0YXRlKCkgaGFuZGxlOiVkIEZDX1RZUEU6MHgleCIsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICBwX3NldHRpbmdzLT5mY190eXBlKTsKLQotICBiYXVkX3JhdGUgPSBwX3BvcnQtPnVzZXJfcG9ydF9wYXJzLmJhdWRfcmF0ZTsKLSAgcF9wb3J0LT51c2VyX3BvcnRfcGFycyA9ICpwX3NldHRpbmdzOwotCi0gIC8qIGZvciBub3cgd2UndmUgYmVlbiBhc2tlZCB0byBwYXNzIG9ubHkgYmF1ZCByYXRlICovCi0gIGlmIChiYXVkX3JhdGUgIT0gcF9zZXR0aW5ncy0+YmF1ZF9yYXRlKSB7Ci0gICAgcG9ydF9zdGFydF9wYXJfbmVnKHBfcG9ydCk7Ci0gIH0KLSAgcmV0dXJuIChQT1JUX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9HZXRTdGF0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmlsbCB0UE9SVF9TVEFURSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVtdCBjb250cm9sIHNldHRpbmdzIGZvciB0aGUgcG9ydAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAtIEhhbmRsZSByZXR1cm5lZCBpbiB0aGUgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcF9zZXR0aW5ncyAtIFBvaW50ZXIgdG8gYSB0UE9SVF9TVEFURSBzdHJ1Y3R1cmUgaW4gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQT1JUX0dldFN0YXRlKHVpbnQxNl90IGhhbmRsZSwgdFBPUlRfU1RBVEUqIHBfc2V0dGluZ3MpIHsKLSAgdFBPUlQqIHBfcG9ydDsKLQotICBSRkNPTU1fVFJBQ0VfQVBJKCJQT1JUX0dldFN0YXRlKCkgaGFuZGxlOiVkIiwgaGFuZGxlKTsKLQotICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgdG8gYXZvaWQgY3Jhc2hpbmcgKi8KLSAgaWYgKChoYW5kbGUgPT0gMCkgfHwgKGhhbmRsZSA+IE1BWF9SRkNfUE9SVFMpKSB7Ci0gICAgcmV0dXJuIChQT1JUX0JBRF9IQU5ETEUpOwotICB9Ci0KLSAgcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbaGFuZGxlIC0gMV07Ci0KLSAgaWYgKCFwX3BvcnQtPmluX3VzZSB8fCAocF9wb3J0LT5zdGF0ZSA9PSBQT1JUX1NUQVRFX0NMT1NFRCkpIHsKLSAgICByZXR1cm4gKFBPUlRfTk9UX09QRU5FRCk7Ci0gIH0KLQotICBpZiAocF9wb3J0LT5saW5lX3N0YXR1cykgewotICAgIHJldHVybiAoUE9SVF9MSU5FX0VSUik7Ci0gIH0KLQotICAqcF9zZXR0aW5ncyA9IHBfcG9ydC0+dXNlcl9wb3J0X3BhcnM7Ci0gIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfRmxvd0NvbnRyb2xfTWF4Q3JlZGl0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGRpcmVjdHMgYSBzcGVjaWZpZWQgY29ubmVjdGlvbiB0byBwYXNzCi0gKiAgICAgICAgICAgICAgICAgIGZsb3cgY29udHJvbCBtZXNzYWdlIHRvIHRoZSBwZWVyIGRldmljZS4gIEVuYWJsZSBmbGFnIHBhc3NlZAotICogICAgICAgICAgICAgICAgICBzaG93cyBpZiBwb3J0IGNhbiBhY2NlcHQgbW9yZSBkYXRhLiBJdCBhbHNvIHNlbmRzIG1heCBjcmVkaXQKLSAqICAgICAgICAgICAgICAgICAgd2hlbiBkYXRhIGZsb3cgZW5hYmxlZAotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgaGFuZGxlICAgICAtIEhhbmRsZSByZXR1cm5lZCBpbiB0aGUgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgZW5hYmxlICAgICAtIGVuYWJsZXMgZGF0YSBmbG93Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IFBPUlRfRmxvd0NvbnRyb2xfTWF4Q3JlZGl0KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBlbmFibGUpIHsKLSAgdFBPUlQqIHBfcG9ydDsKLSAgYm9vbCBvbGRfZmM7Ci0gIHVpbnQzMl90IGV2ZW50czsKLQotICBSRkNPTU1fVFJBQ0VfQVBJKCJQT1JUX0Zsb3dDb250cm9sKCkgaGFuZGxlOiVkIGVuYWJsZTogJWQiLCBoYW5kbGUsIGVuYWJsZSk7Ci0KLSAgLyogQ2hlY2sgaWYgaGFuZGxlIGlzIHZhbGlkIHRvIGF2b2lkIGNyYXNoaW5nICovCi0gIGlmICgoaGFuZGxlID09IDApIHx8IChoYW5kbGUgPiBNQVhfUkZDX1BPUlRTKSkgewotICAgIHJldHVybiAoUE9SVF9CQURfSEFORExFKTsKLSAgfQotCi0gIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdOwotCi0gIGlmICghcF9wb3J0LT5pbl91c2UgfHwgKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9DTE9TRUQpKSB7Ci0gICAgcmV0dXJuIChQT1JUX05PVF9PUEVORUQpOwotICB9Ci0KLSAgaWYgKCFwX3BvcnQtPnJmYy5wX21jYikgewotICAgIHJldHVybiAoUE9SVF9OT1RfT1BFTkVEKTsKLSAgfQotCi0gIHBfcG9ydC0+cngudXNlcl9mYyA9ICFlbmFibGU7Ci0KLSAgaWYgKHBfcG9ydC0+cmZjLnBfbWNiLT5mbG93ID09IFBPUlRfRkNfQ1JFRElUKSB7Ci0gICAgaWYgKCFwX3BvcnQtPnJ4LnVzZXJfZmMpIHsKLSAgICAgIHBvcnRfZmxvd19jb250cm9sX3BlZXIocF9wb3J0LCB0cnVlLCBwX3BvcnQtPmNyZWRpdF9yeCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG9sZF9mYyA9IHBfcG9ydC0+bG9jYWxfY3RybC5mYzsKLQotICAgIC8qIEZDIGlzIHNldCBpZiB1c2VyIGlzIHNldCBvciBwZWVyIGlzIHNldCAqLwotICAgIHBfcG9ydC0+bG9jYWxfY3RybC5mYyA9IChwX3BvcnQtPnJ4LnVzZXJfZmMgfCBwX3BvcnQtPnJ4LnBlZXJfZmMpOwotCi0gICAgaWYgKHBfcG9ydC0+bG9jYWxfY3RybC5mYyAhPSBvbGRfZmMpIHBvcnRfc3RhcnRfY29udHJvbChwX3BvcnQpOwotICB9Ci0KLSAgLyogTmVlZCB0byB0YWtlIGNhcmUgb2YgdGhlIGNhc2Ugd2hlbiB3ZSBjb3VsZCBub3QgZGVsaXZlciBldmVudHMgKi8KLSAgLyogdG8gdGhlIGFwcGxpY2F0aW9uIGJlY2F1c2Ugd2Ugd2VyZSBmbG93IGNvbnRyb2xsZWQgKi8KLSAgaWYgKGVuYWJsZSAmJiAocF9wb3J0LT5yeC5xdWV1ZV9zaXplICE9IDApKSB7Ci0gICAgZXZlbnRzID0gUE9SVF9FVl9SWENIQVI7Ci0gICAgaWYgKHBfcG9ydC0+cnhfZmxhZ19ldl9wZW5kaW5nKSB7Ci0gICAgICBwX3BvcnQtPnJ4X2ZsYWdfZXZfcGVuZGluZyA9IGZhbHNlOwotICAgICAgZXZlbnRzIHw9IFBPUlRfRVZfUlhGTEFHOwotICAgIH0KLQotICAgIGV2ZW50cyAmPSBwX3BvcnQtPmV2X21hc2s7Ci0gICAgaWYgKHBfcG9ydC0+cF9jYWxsYmFjayAmJiBldmVudHMpIHsKLSAgICAgIHBfcG9ydC0+cF9jYWxsYmFjayhldmVudHMsIHBfcG9ydC0+aGFuZGxlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChQT1JUX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9SZWFkRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTm9ybWFsbHkgbm90IEdLSSBhd2FyZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBhZnRlciByZWNlaXZpbmcgUE9SVF9FVl9SWENIQVIgZXZlbnQuCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBwX2RhdGEgICAgICAtIERhdGEgYXJlYQotICogICAgICAgICAgICAgICAgICBtYXhfbGVuICAgICAtIEJ5dGUgY291bnQgcmVxdWVzdGVkCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVuICAgICAgIC0gQnl0ZSBjb3VudCByZWNlaXZlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE9SVF9SZWFkRGF0YSh1aW50MTZfdCBoYW5kbGUsIGNoYXIqIHBfZGF0YSwgdWludDE2X3QgbWF4X2xlbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2xlbikgewotICB0UE9SVCogcF9wb3J0OwotICBCVF9IRFIqIHBfYnVmOwotICB1aW50MTZfdCBjb3VudDsKLQotICBSRkNPTU1fVFJBQ0VfQVBJKCJQT1JUX1JlYWREYXRhKCkgaGFuZGxlOiVkIG1heF9sZW46JWQiLCBoYW5kbGUsIG1heF9sZW4pOwotCi0gIC8qIEluaXRpYWxpemUgdGhpcyBpbiBjYXNlIG9mIGFuIGVycm9yICovCi0gICpwX2xlbiA9IDA7Ci0KLSAgLyogQ2hlY2sgaWYgaGFuZGxlIGlzIHZhbGlkIHRvIGF2b2lkIGNyYXNoaW5nICovCi0gIGlmICgoaGFuZGxlID09IDApIHx8IChoYW5kbGUgPiBNQVhfUkZDX1BPUlRTKSkgewotICAgIHJldHVybiAoUE9SVF9CQURfSEFORExFKTsKLSAgfQotCi0gIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdOwotCi0gIGlmICghcF9wb3J0LT5pbl91c2UgfHwgKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9DTE9TRUQpKSB7Ci0gICAgcmV0dXJuIChQT1JUX05PVF9PUEVORUQpOwotICB9Ci0KLSAgaWYgKHBfcG9ydC0+bGluZV9zdGF0dXMpIHsKLSAgICByZXR1cm4gKFBPUlRfTElORV9FUlIpOwotICB9Ci0KLSAgaWYgKGZpeGVkX3F1ZXVlX2lzX2VtcHR5KHBfcG9ydC0+cngucXVldWUpKSByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci0KLSAgY291bnQgPSAwOwotCi0gIHdoaWxlIChtYXhfbGVuKSB7Ci0gICAgcF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfcGVla19maXJzdChwX3BvcnQtPnJ4LnF1ZXVlKTsKLSAgICBpZiAocF9idWYgPT0gTlVMTCkgYnJlYWs7Ci0KLSAgICBpZiAocF9idWYtPmxlbiA+IG1heF9sZW4pIHsKLSAgICAgIG1lbWNweShwX2RhdGEsICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQsIG1heF9sZW4pOwotICAgICAgcF9idWYtPm9mZnNldCArPSBtYXhfbGVuOwotICAgICAgcF9idWYtPmxlbiAtPSBtYXhfbGVuOwotCi0gICAgICAqcF9sZW4gKz0gbWF4X2xlbjsKLQotICAgICAgbXV0ZXhfZ2xvYmFsX2xvY2soKTsKLQotICAgICAgcF9wb3J0LT5yeC5xdWV1ZV9zaXplIC09IG1heF9sZW47Ci0KLSAgICAgIG11dGV4X2dsb2JhbF91bmxvY2soKTsKLQotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1lbWNweShwX2RhdGEsICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQsIHBfYnVmLT5sZW4pOwotCi0gICAgICAqcF9sZW4gKz0gcF9idWYtPmxlbjsKLSAgICAgIG1heF9sZW4gLT0gcF9idWYtPmxlbjsKLQotICAgICAgbXV0ZXhfZ2xvYmFsX2xvY2soKTsKLQotICAgICAgcF9wb3J0LT5yeC5xdWV1ZV9zaXplIC09IHBfYnVmLT5sZW47Ci0KLSAgICAgIGlmIChtYXhfbGVuKSB7Ci0gICAgICAgIHBfZGF0YSArPSBwX2J1Zi0+bGVuOwotICAgICAgfQotCi0gICAgICBvc2lfZnJlZShmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX3BvcnQtPnJ4LnF1ZXVlKSk7Ci0KLSAgICAgIG11dGV4X2dsb2JhbF91bmxvY2soKTsKLQotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIH0KLQotICBpZiAoKnBfbGVuID09IDEpIHsKLSAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfUmVhZERhdGEgcXVldWU6JWQgcmV0dXJuZWQ6JWQgJXgiLAotICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPnJ4LnF1ZXVlX3NpemUsICpwX2xlbiwgKHBfZGF0YVswXSkpOwotICB9IGVsc2UgewotICAgIFJGQ09NTV9UUkFDRV9FVkVOVCgiUE9SVF9SZWFkRGF0YSBxdWV1ZTolZCByZXR1cm5lZDolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+cngucXVldWVfc2l6ZSwgKnBfbGVuKTsKLSAgfQotCi0gIC8qIElmIHJmY29tbSBzdXNwZW5kZWQgdHJhZmZpYyBmcm9tIHRoZSBwZWVyIGJhc2VkIG9uIHRoZSByeF9xdWV1ZV9zaXplICovCi0gIC8qIGNoZWNrIGlmIGl0IGNhbiBiZSByZXN1bWVkIG5vdyAqLwotICBwb3J0X2Zsb3dfY29udHJvbF9wZWVyKHBfcG9ydCwgdHJ1ZSwgY291bnQpOwotCi0gIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBvcnRfd3JpdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gd2hlbiBhIGRhdGEgcGFja2V0IGlzIHJlY2VpdmVkIGZyb20gdGhlIGFwcGVyCi0gKiAgICAgICAgICAgICAgICAgIGxheWVyIHRhc2suCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX3BvcnQgICAgIC0gcG9pbnRlciB0byBhZGRyZXNzIG9mIHBvcnQgY29udHJvbCBibG9jawotICogICAgICAgICAgICAgICAgICBwX2J1ZiAgICAgIC0gcG9pbnRlciB0byBhZGRyZXNzIG9mIGJ1ZmZlciB3aXRoIGRhdGEsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcG9ydF93cml0ZSh0UE9SVCogcF9wb3J0LCBCVF9IRFIqIHBfYnVmKSB7Ci0gIC8qIFdlIHNob3VsZCBub3QgYWxsb3cgdG8gd3JpdGUgZGF0YSBpbiB0byBzZXJ2ZXIgcG9ydCB3aGVuIGNvbm5lY3Rpb24gaXMgbm90Ci0gICAqIG9wZW5lZCAqLwotICBpZiAocF9wb3J0LT5pc19zZXJ2ZXIgJiYgKHBfcG9ydC0+cmZjLnN0YXRlICE9IFJGQ19TVEFURV9PUEVORUQpKSB7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybiAoUE9SVF9DTE9TRUQpOwotICB9Ci0KLSAgLyogS2VlcCB0aGUgZGF0YSBpbiBwZW5kaW5nIHF1ZXVlIGlmIHBlZXIgZG9lcyBub3QgYWxsb3cgZGF0YSwgb3IgKi8KLSAgLyogUGVlciBpcyBub3QgcmVhZHkgb3IgUG9ydCBpcyBub3QgeWV0IG9wZW5lZCBvciBpbml0aWFsIHBvcnQgY29udHJvbCAqLwotICAvKiBjb21tYW5kIGhhcyBub3QgYmVlbiBzZW50ICovCi0gIGlmIChwX3BvcnQtPnR4LnBlZXJfZmMgfHwgIXBfcG9ydC0+cmZjLnBfbWNiIHx8Ci0gICAgICAhcF9wb3J0LT5yZmMucF9tY2ItPnBlZXJfcmVhZHkgfHwKLSAgICAgIChwX3BvcnQtPnJmYy5zdGF0ZSAhPSBSRkNfU1RBVEVfT1BFTkVEKSB8fAotICAgICAgKChwX3BvcnQtPnBvcnRfY3RybCAmIChQT1JUX0NUUkxfUkVRX1NFTlQgfCBQT1JUX0NUUkxfSU5EX1JFQ0VJVkVEKSkgIT0KLSAgICAgICAoUE9SVF9DVFJMX1JFUV9TRU5UIHwgUE9SVF9DVFJMX0lORF9SRUNFSVZFRCkpKSB7Ci0gICAgaWYgKChwX3BvcnQtPnR4LnF1ZXVlX3NpemUgPiBQT1JUX1RYX0NSSVRJQ0FMX1dNKSB8fAotICAgICAgICAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfcG9ydC0+dHgucXVldWUpID4gUE9SVF9UWF9CVUZfQ1JJVElDQUxfV00pKSB7Ci0gICAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiUE9SVF9Xcml0ZTogUXVldWUgc2l6ZTogJWQiLCBwX3BvcnQtPnR4LnF1ZXVlX3NpemUpOwotCi0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0KLSAgICAgIGlmICgocF9wb3J0LT5wX2NhbGxiYWNrICE9IE5VTEwpICYmIChwX3BvcnQtPmV2X21hc2sgJiBQT1JUX0VWX0VSUikpCi0gICAgICAgIHBfcG9ydC0+cF9jYWxsYmFjayhQT1JUX0VWX0VSUiwgcF9wb3J0LT5oYW5kbGUpOwotCi0gICAgICByZXR1cm4gKFBPUlRfVFhfRlVMTCk7Ci0gICAgfQotCi0gICAgUkZDT01NX1RSQUNFX0VWRU5UKAotICAgICAgICAiUE9SVF9Xcml0ZSA6IERhdGEgaXMgZW5xdWVkLiBmbG93IGRpc2FibGVkICVkIHBlZXJfcmVhZHkgJWQgc3RhdGUgJWQgIgotICAgICAgICAiY3RybF9zdGF0ZSAleCIsCi0gICAgICAgIHBfcG9ydC0+dHgucGVlcl9mYywKLSAgICAgICAgKHBfcG9ydC0+cmZjLnBfbWNiICYmIHBfcG9ydC0+cmZjLnBfbWNiLT5wZWVyX3JlYWR5KSwgcF9wb3J0LT5yZmMuc3RhdGUsCi0gICAgICAgIHBfcG9ydC0+cG9ydF9jdHJsKTsKLQotICAgIGZpeGVkX3F1ZXVlX2VucXVldWUocF9wb3J0LT50eC5xdWV1ZSwgcF9idWYpOwotICAgIHBfcG9ydC0+dHgucXVldWVfc2l6ZSArPSBwX2J1Zi0+bGVuOwotCi0gICAgcmV0dXJuIChQT1JUX0NNRF9QRU5ESU5HKTsKLSAgfSBlbHNlIHsKLSAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfV3JpdGUgOiBEYXRhIGlzIGJlaW5nIHNlbnQiKTsKLQotICAgIFJGQ09NTV9EYXRhUmVxKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksIHBfYnVmKTsKLSAgICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfV3JpdGVEYXRhQ08KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIE5vcm1hbGx5IG5vdCBHS0kgYXdhcmUgYXBwbGljYXRpb24gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgdG8gc2VuZCBkYXRhIHRvIHRoZSBwb3J0IGJ5IGNhbGxvdXQgZnVuY3Rpb25zCi0gKgotICogUGFyYW1ldGVyczogICAgICBoYW5kbGUgICAgIC0gSGFuZGxlIHJldHVybmVkIGluIHRoZSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBmZCAgICAgICAgIC0gc29ja2V0IGZkCi0gKiAgICAgICAgICAgICAgICAgIHBfbGVuICAgICAgLSBCeXRlIGNvdW50IHJldHVybmVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQT1JUX1dyaXRlRGF0YUNPKHVpbnQxNl90IGhhbmRsZSwgaW50KiBwX2xlbikgewotICB0UE9SVCogcF9wb3J0OwotICBCVF9IRFIqIHBfYnVmOwotICB1aW50MzJfdCBldmVudCA9IDA7Ci0gIGludCByYyA9IDA7Ci0gIHVpbnQxNl90IGxlbmd0aDsKLQotICBSRkNPTU1fVFJBQ0VfQVBJKCJQT1JUX1dyaXRlRGF0YUNPKCkgaGFuZGxlOiVkIiwgaGFuZGxlKTsKLSAgKnBfbGVuID0gMDsKLQotICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgdG8gYXZvaWQgY3Jhc2hpbmcgKi8KLSAgaWYgKChoYW5kbGUgPT0gMCkgfHwgKGhhbmRsZSA+IE1BWF9SRkNfUE9SVFMpKSB7Ci0gICAgcmV0dXJuIChQT1JUX0JBRF9IQU5ETEUpOwotICB9Ci0gIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdOwotCi0gIGlmICghcF9wb3J0LT5pbl91c2UgfHwgKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9DTE9TRUQpKSB7Ci0gICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIlBPUlRfV3JpdGVEYXRhQnlGZCgpIG5vIHBvcnQgc3RhdGU6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+c3RhdGUpOwotICAgIHJldHVybiAoUE9SVF9OT1RfT1BFTkVEKTsKLSAgfQotCi0gIGlmICghcF9wb3J0LT5wZWVyX210dSkgewotICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiUE9SVF9Xcml0ZURhdGFCeUZkKCkgcGVlcl9tdHU6JWQiLCBwX3BvcnQtPnBlZXJfbXR1KTsKLSAgICByZXR1cm4gKFBPUlRfVU5LTk9XTl9FUlJPUik7Ci0gIH0KLSAgaW50IGF2YWlsYWJsZSA9IDA7Ci0gIC8vIGlmKGlvY3RsKGZkLCBGSU9OUkVBRCwgJmF2YWlsYWJsZSkgPCAwKQotICBpZiAoIXBfcG9ydC0+cF9kYXRhX2NvX2NhbGxiYWNrKGhhbmRsZSwgKHVpbnQ4X3QqKSZhdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF2YWlsYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9DT19DQUxMQkFDS19UWVBFX09VVEdPSU5HX1NJWkUpKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKAotICAgICAgICAicF9kYXRhX2NvX2NhbGxiYWNrIERBVEFfQ09fQ0FMTEJBQ0tfVFlQRV9JTkNPTUlOR19TSVpFIGZhaWxlZCwgIgotICAgICAgICAiYXZhaWxhYmxlOiVkIiwKLSAgICAgICAgYXZhaWxhYmxlKTsKLSAgICByZXR1cm4gKFBPUlRfVU5LTk9XTl9FUlJPUik7Ci0gIH0KLSAgaWYgKGF2YWlsYWJsZSA9PSAwKSByZXR1cm4gUE9SVF9TVUNDRVNTOwotICAvKiBMZW5ndGggZm9yIGVhY2ggYnVmZmVyIGlzIHRoZSBzbWFsbGVyIG9mIEdLSSBidWZmZXIsIHBlZXIgTVRVLCBvciBtYXhfbGVuCi0gICAqLwotICBsZW5ndGggPSBSRkNPTU1fREFUQV9CVUZfU0laRSAtCi0gICAgICAgICAgICh1aW50MTZfdCkoc2l6ZW9mKEJUX0hEUikgKyBMMkNBUF9NSU5fT0ZGU0VUICsgUkZDT01NX0RBVEFfT1ZFUkhFQUQpOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWZmZXJzIHNjaGVkdWxlZCBmb3IgdHJhbnNtaXNzaW9uIGNoZWNrIGlmIHJlcXVlc3RlZCAqLwotICAvKiBkYXRhIGZpdHMgaW50byB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAqLwotICBtdXRleF9nbG9iYWxfbG9jaygpOwotCi0gIHBfYnVmID0gKEJUX0hEUiopZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChwX3BvcnQtPnR4LnF1ZXVlKTsKLSAgaWYgKChwX2J1ZiAhPSBOVUxMKSAmJgotICAgICAgKCgoaW50KXBfYnVmLT5sZW4gKyBhdmFpbGFibGUpIDw9IChpbnQpcF9wb3J0LT5wZWVyX210dSkgJiYKLSAgICAgICgoKGludClwX2J1Zi0+bGVuICsgYXZhaWxhYmxlKSA8PSAoaW50KWxlbmd0aCkpIHsKLSAgICAvLyBpZihyZWN2KGZkLCAodWludDhfdCAqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCArIHBfYnVmLT5sZW4sCi0gICAgLy8gYXZhaWxhYmxlLCAwKSAhPSBhdmFpbGFibGUpCi0gICAgaWYgKCFwX3BvcnQtPnBfZGF0YV9jb19jYWxsYmFjaygKLSAgICAgICAgICAgIGhhbmRsZSwgKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCArIHBfYnVmLT5sZW4sCi0gICAgICAgICAgICBhdmFpbGFibGUsIERBVEFfQ09fQ0FMTEJBQ0tfVFlQRV9PVVRHT0lORykpCi0KLSAgICB7Ci0gICAgICBlcnJvcigKLSAgICAgICAgICAicF9kYXRhX2NvX2NhbGxiYWNrIERBVEFfQ09fQ0FMTEJBQ0tfVFlQRV9PVVRHT0lORyBmYWlsZWQsICIKLSAgICAgICAgICAiYXZhaWxhYmxlOiVkIiwKLSAgICAgICAgICBhdmFpbGFibGUpOwotICAgICAgbXV0ZXhfZ2xvYmFsX3VubG9jaygpOwotICAgICAgcmV0dXJuIChQT1JUX1VOS05PV05fRVJST1IpOwotICAgIH0KLSAgICAvLyBtZW1jcHkgKCh1aW50OF90ICopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0ICsgcF9idWYtPmxlbiwgcF9kYXRhLAotICAgIC8vIG1heF9sZW4pOwotICAgIHBfcG9ydC0+dHgucXVldWVfc2l6ZSArPSAodWludDE2X3QpYXZhaWxhYmxlOwotCi0gICAgKnBfbGVuID0gYXZhaWxhYmxlOwotICAgIHBfYnVmLT5sZW4gKz0gKHVpbnQxNl90KWF2YWlsYWJsZTsKLQotICAgIG11dGV4X2dsb2JhbF91bmxvY2soKTsKLQotICAgIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLSAgfQotCi0gIG11dGV4X2dsb2JhbF91bmxvY2soKTsKLQotICAvLyBpbnQgbWF4X3JlYWQgPSBsZW5ndGggPCBwX3BvcnQtPnBlZXJfbXR1ID8gbGVuZ3RoIDogcF9wb3J0LT5wZWVyX210dTsKLQotICAvLyBtYXhfcmVhZCA9IGF2YWlsYWJsZSA8IG1heF9yZWFkID8gYXZhaWxhYmxlIDogbWF4X3JlYWQ7Ci0KLSAgd2hpbGUgKGF2YWlsYWJsZSkgewotICAgIC8qIGlmIHdlJ3JlIG92ZXIgYnVmZmVyIGhpZ2ggd2F0ZXIgbWFyaywgd2UncmUgZG9uZSAqLwotICAgIGlmICgocF9wb3J0LT50eC5xdWV1ZV9zaXplID4gUE9SVF9UWF9ISUdIX1dNKSB8fAotICAgICAgICAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfcG9ydC0+dHgucXVldWUpID4gUE9SVF9UWF9CVUZfSElHSF9XTSkpIHsKLSAgICAgIHBvcnRfZmxvd19jb250cm9sX3VzZXIocF9wb3J0KTsKLSAgICAgIGV2ZW50IHw9IFBPUlRfRVZfRkM7Ci0gICAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgInR4IHF1ZXVlIGlzIGZ1bGwsdHgucXVldWVfc2l6ZTolZCx0eC5xdWV1ZS5jb3VudDolZCxhdmFpbGFibGU6JWQiLAotICAgICAgICAgIHBfcG9ydC0+dHgucXVldWVfc2l6ZSwgZml4ZWRfcXVldWVfbGVuZ3RoKHBfcG9ydC0+dHgucXVldWUpLAotICAgICAgICAgIGF2YWlsYWJsZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBjb250aW51ZSB3aXRoIHJmY29tbSBkYXRhIHdyaXRlICovCi0gICAgcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9EQVRBX0JVRl9TSVpFKTsKLSAgICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVCArIFJGQ09NTV9NSU5fT0ZGU0VUOwotICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLQotICAgIGlmIChwX3BvcnQtPnBlZXJfbXR1IDwgbGVuZ3RoKSBsZW5ndGggPSBwX3BvcnQtPnBlZXJfbXR1OwotICAgIGlmIChhdmFpbGFibGUgPCAoaW50KWxlbmd0aCkgbGVuZ3RoID0gKHVpbnQxNl90KWF2YWlsYWJsZTsKLSAgICBwX2J1Zi0+bGVuID0gbGVuZ3RoOwotICAgIHBfYnVmLT5ldmVudCA9IEJUX0VWVF9UT19CVFVfU1BfREFUQTsKLQotICAgIC8vIG1lbWNweSAoKHVpbnQ4X3QgKikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQsIHBfZGF0YSwgbGVuZ3RoKTsKLSAgICAvLyBpZihyZWN2KGZkLCAodWludDhfdCAqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwgKGludClsZW5ndGgsIDApICE9Ci0gICAgLy8gKGludClsZW5ndGgpCi0gICAgaWYgKCFwX3BvcnQtPnBfZGF0YV9jb19jYWxsYmFjayhoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBEQVRBX0NPX0NBTExCQUNLX1RZUEVfT1VUR09JTkcpKSB7Ci0gICAgICBlcnJvcigKLSAgICAgICAgICAicF9kYXRhX2NvX2NhbGxiYWNrIERBVEFfQ09fQ0FMTEJBQ0tfVFlQRV9PVVRHT0lORyBmYWlsZWQsIGxlbmd0aDolZCIsCi0gICAgICAgICAgbGVuZ3RoKTsKLSAgICAgIHJldHVybiAoUE9SVF9VTktOT1dOX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfV3JpdGVEYXRhICVkIGJ5dGVzIiwgbGVuZ3RoKTsKLQotICAgIHJjID0gcG9ydF93cml0ZShwX3BvcnQsIHBfYnVmKTsKLQotICAgIC8qIElmIHF1ZXVlIHdlbnQgYmVsb3cgdGhlIHRocmVhc2hvbGQgbmVlZCB0byBzZW5kIGZsb3cgY29udHJvbCAqLwotICAgIGV2ZW50IHw9IHBvcnRfZmxvd19jb250cm9sX3VzZXIocF9wb3J0KTsKLQotICAgIGlmIChyYyA9PSBQT1JUX1NVQ0NFU1MpIGV2ZW50IHw9IFBPUlRfRVZfVFhDSEFSOwotCi0gICAgaWYgKChyYyAhPSBQT1JUX1NVQ0NFU1MpICYmIChyYyAhPSBQT1JUX0NNRF9QRU5ESU5HKSkgYnJlYWs7Ci0KLSAgICAqcF9sZW4gKz0gbGVuZ3RoOwotICAgIGF2YWlsYWJsZSAtPSAoaW50KWxlbmd0aDsKLSAgfQotICBpZiAoIWF2YWlsYWJsZSAmJiAocmMgIT0gUE9SVF9DTURfUEVORElORykgJiYgKHJjICE9IFBPUlRfVFhfUVVFVUVfRElTQUJMRUQpKQotICAgIGV2ZW50IHw9IFBPUlRfRVZfVFhFTVBUWTsKLQotICAvKiBNYXNrIG91dCBhbGwgZXZlbnRzIHRoYXQgYXJlIG5vdCBvZiBpbnRlcmVzdCB0byB1c2VyICovCi0gIGV2ZW50ICY9IHBfcG9ydC0+ZXZfbWFzazsKLQotICAvKiBTZW5kIGV2ZW50IHRvIHRoZSBhcHBsaWNhdGlvbiAqLwotICBpZiAocF9wb3J0LT5wX2NhbGxiYWNrICYmIGV2ZW50KSAocF9wb3J0LT5wX2NhbGxiYWNrKShldmVudCwgcF9wb3J0LT5oYW5kbGUpOwotCi0gIHJldHVybiAoUE9SVF9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfV3JpdGVEYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBOb3JtYWxseSBub3QgR0tJIGF3YXJlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHRvIHNlbmQgZGF0YSB0byB0aGUgcG9ydC4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGhhbmRsZSAgICAgLSBIYW5kbGUgcmV0dXJuZWQgaW4gdGhlIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAgICAgIC0gRGF0YSBhcmVhCi0gKiAgICAgICAgICAgICAgICAgIG1heF9sZW4gICAgIC0gQnl0ZSBjb3VudCByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcF9sZW4gICAgICAgLSBCeXRlIGNvdW50IHJlY2VpdmVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQT1JUX1dyaXRlRGF0YSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IGNoYXIqIHBfZGF0YSwgdWludDE2X3QgbWF4X2xlbiwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9sZW4pIHsKLSAgdFBPUlQqIHBfcG9ydDsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgdWludDMyX3QgZXZlbnQgPSAwOwotICBpbnQgcmMgPSAwOwotICB1aW50MTZfdCBsZW5ndGg7Ci0KLSAgUkZDT01NX1RSQUNFX0FQSSgiUE9SVF9Xcml0ZURhdGEoKSBtYXhfbGVuOiVkIiwgbWF4X2xlbik7Ci0KLSAgKnBfbGVuID0gMDsKLQotICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgdG8gYXZvaWQgY3Jhc2hpbmcgKi8KLSAgaWYgKChoYW5kbGUgPT0gMCkgfHwgKGhhbmRsZSA+IE1BWF9SRkNfUE9SVFMpKSB7Ci0gICAgcmV0dXJuIChQT1JUX0JBRF9IQU5ETEUpOwotICB9Ci0gIHBfcG9ydCA9ICZyZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdOwotCi0gIGlmICghcF9wb3J0LT5pbl91c2UgfHwgKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9DTE9TRUQpKSB7Ci0gICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIlBPUlRfV3JpdGVEYXRhKCkgbm8gcG9ydCBzdGF0ZTolZCIsIHBfcG9ydC0+c3RhdGUpOwotICAgIHJldHVybiAoUE9SVF9OT1RfT1BFTkVEKTsKLSAgfQotCi0gIGlmICghbWF4X2xlbiB8fCAhcF9wb3J0LT5wZWVyX210dSkgewotICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiUE9SVF9Xcml0ZURhdGEoKSBwZWVyX210dTolZCIsIHBfcG9ydC0+cGVlcl9tdHUpOwotICAgIHJldHVybiAoUE9SVF9VTktOT1dOX0VSUk9SKTsKLSAgfQotCi0gIC8qIExlbmd0aCBmb3IgZWFjaCBidWZmZXIgaXMgdGhlIHNtYWxsZXIgb2YgR0tJIGJ1ZmZlciwgcGVlciBNVFUsIG9yIG1heF9sZW4KLSAgICovCi0gIGxlbmd0aCA9IFJGQ09NTV9EQVRBX0JVRl9TSVpFIC0KLSAgICAgICAgICAgKHVpbnQxNl90KShzaXplb2YoQlRfSERSKSArIEwyQ0FQX01JTl9PRkZTRVQgKyBSRkNPTU1fREFUQV9PVkVSSEVBRCk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGJ1ZmZlcnMgc2NoZWR1bGVkIGZvciB0cmFuc21pc3Npb24gY2hlY2sgaWYgcmVxdWVzdGVkICovCi0gIC8qIGRhdGEgZml0cyBpbnRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlICovCi0gIG11dGV4X2dsb2JhbF9sb2NrKCk7Ci0KLSAgcF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfcGVla19sYXN0KHBfcG9ydC0+dHgucXVldWUpOwotICBpZiAoKHBfYnVmICE9IE5VTEwpICYmICgocF9idWYtPmxlbiArIG1heF9sZW4pIDw9IHBfcG9ydC0+cGVlcl9tdHUpICYmCi0gICAgICAoKHBfYnVmLT5sZW4gKyBtYXhfbGVuKSA8PSBsZW5ndGgpKSB7Ci0gICAgbWVtY3B5KCh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQgKyBwX2J1Zi0+bGVuLCBwX2RhdGEsIG1heF9sZW4pOwotICAgIHBfcG9ydC0+dHgucXVldWVfc2l6ZSArPSBtYXhfbGVuOwotCi0gICAgKnBfbGVuID0gbWF4X2xlbjsKLSAgICBwX2J1Zi0+bGVuICs9IG1heF9sZW47Ci0KLSAgICBtdXRleF9nbG9iYWxfdW5sb2NrKCk7Ci0KLSAgICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci0gIH0KLQotICBtdXRleF9nbG9iYWxfdW5sb2NrKCk7Ci0KLSAgd2hpbGUgKG1heF9sZW4pIHsKLSAgICAvKiBpZiB3ZSdyZSBvdmVyIGJ1ZmZlciBoaWdoIHdhdGVyIG1hcmssIHdlJ3JlIGRvbmUgKi8KLSAgICBpZiAoKHBfcG9ydC0+dHgucXVldWVfc2l6ZSA+IFBPUlRfVFhfSElHSF9XTSkgfHwKLSAgICAgICAgKGZpeGVkX3F1ZXVlX2xlbmd0aChwX3BvcnQtPnR4LnF1ZXVlKSA+IFBPUlRfVFhfQlVGX0hJR0hfV00pKQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBjb250aW51ZSB3aXRoIHJmY29tbSBkYXRhIHdyaXRlICovCi0gICAgcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9EQVRBX0JVRl9TSVpFKTsKLSAgICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVCArIFJGQ09NTV9NSU5fT0ZGU0VUOwotICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKLQotICAgIGlmIChwX3BvcnQtPnBlZXJfbXR1IDwgbGVuZ3RoKSBsZW5ndGggPSBwX3BvcnQtPnBlZXJfbXR1OwotICAgIGlmIChtYXhfbGVuIDwgbGVuZ3RoKSBsZW5ndGggPSBtYXhfbGVuOwotICAgIHBfYnVmLT5sZW4gPSBsZW5ndGg7Ci0gICAgcF9idWYtPmV2ZW50ID0gQlRfRVZUX1RPX0JUVV9TUF9EQVRBOwotCi0gICAgbWVtY3B5KCh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQsIHBfZGF0YSwgbGVuZ3RoKTsKLQotICAgIFJGQ09NTV9UUkFDRV9FVkVOVCgiUE9SVF9Xcml0ZURhdGEgJWQgYnl0ZXMiLCBsZW5ndGgpOwotCi0gICAgcmMgPSBwb3J0X3dyaXRlKHBfcG9ydCwgcF9idWYpOwotCi0gICAgLyogSWYgcXVldWUgd2VudCBiZWxvdyB0aGUgdGhyZWFzaG9sZCBuZWVkIHRvIHNlbmQgZmxvdyBjb250cm9sICovCi0gICAgZXZlbnQgfD0gcG9ydF9mbG93X2NvbnRyb2xfdXNlcihwX3BvcnQpOwotCi0gICAgaWYgKHJjID09IFBPUlRfU1VDQ0VTUykgZXZlbnQgfD0gUE9SVF9FVl9UWENIQVI7Ci0KLSAgICBpZiAoKHJjICE9IFBPUlRfU1VDQ0VTUykgJiYgKHJjICE9IFBPUlRfQ01EX1BFTkRJTkcpKSBicmVhazsKLQotICAgICpwX2xlbiArPSBsZW5ndGg7Ci0gICAgbWF4X2xlbiAtPSBsZW5ndGg7Ci0gICAgcF9kYXRhICs9IGxlbmd0aDsKLSAgfQotICBpZiAoIW1heF9sZW4gJiYgKHJjICE9IFBPUlRfQ01EX1BFTkRJTkcpICYmIChyYyAhPSBQT1JUX1RYX1FVRVVFX0RJU0FCTEVEKSkKLSAgICBldmVudCB8PSBQT1JUX0VWX1RYRU1QVFk7Ci0KLSAgLyogTWFzayBvdXQgYWxsIGV2ZW50cyB0aGF0IGFyZSBub3Qgb2YgaW50ZXJlc3QgdG8gdXNlciAqLwotICBldmVudCAmPSBwX3BvcnQtPmV2X21hc2s7Ci0KLSAgLyogU2VuZCBldmVudCB0byB0aGUgYXBwbGljYXRpb24gKi8KLSAgaWYgKHBfcG9ydC0+cF9jYWxsYmFjayAmJiBldmVudCkgKHBfcG9ydC0+cF9jYWxsYmFjaykoZXZlbnQsIHBfcG9ydC0+aGFuZGxlKTsKLQotICByZXR1cm4gKFBPUlRfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fSW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBSRkNPTU0gbGF5ZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fSW5pdCh2b2lkKSB7Ci0gIG1lbXNldCgmcmZjX2NiLCAwLCBzaXplb2YodFJGQ19DQikpOyAvKiBJbml0IFJGQ09NTSBjb250cm9sIGJsb2NrICovCi0gIHJmY29tbV9zZWN1cml0eV9yZWNvcmRzID0ge307Ci0gIHJmY19sY2lkX21jYiA9IHt9OwotCi0gIHJmY19jYi5yZmMubGFzdF9tdXggPSBNQVhfQkRfQ09OTkVDVElPTlM7Ci0KLSNpZiBkZWZpbmVkKFJGQ09NTV9JTklUSUFMX1RSQUNFX0xFVkVMKQotICByZmNfY2IudHJhY2VfbGV2ZWwgPSBSRkNPTU1fSU5JVElBTF9UUkFDRV9MRVZFTDsKLSNlbHNlCi0gIHJmY19jYi50cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX05PTkU7IC8qIE5vIHRyYWNlcyAqLwotI2VuZGlmCi0KLSAgcmZjb21tX2wyY2FwX2lmX2luaXQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfU2V0VHJhY2VMZXZlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU2V0IHRoZSB0cmFjZSBsZXZlbCBmb3IgUkZDT01NLiBJZiBjYWxsZWQgd2l0aCAweEZGLCBpdAotICogICAgICAgICAgICAgICAgICBzaW1wbHkgcmVhZHMgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgbmV3IChjdXJyZW50KSB0cmFjZSBsZXZlbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IFBPUlRfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBpZiAobmV3X2xldmVsICE9IDB4RkYpIHJmY19jYi50cmFjZV9sZXZlbCA9IG5ld19sZXZlbDsKLQotICByZXR1cm4gKHJmY19jYi50cmFjZV9sZXZlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0dldFJlc3VsdFN0cmluZwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZm9yIGEgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgcmVzdWx0IGNvZGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICBhIHBvaW50ZXIgdG8gdGhlIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhlIGdpdmVuIHJlc3VsdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciogUE9SVF9HZXRSZXN1bHRTdHJpbmcoY29uc3QgdWludDhfdCByZXN1bHRfY29kZSkgewotICBpZiAocmVzdWx0X2NvZGUgPiBQT1JUX0VSUl9NQVgpIHsKLSAgICByZXR1cm4gcmVzdWx0X2NvZGVfc3RyaW5nc1tQT1JUX0VSUl9NQVhdOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdF9jb2RlX3N0cmluZ3NbcmVzdWx0X2NvZGVdOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svcmZjb21tL3BvcnRfaW50LmggYi9zdGFjay9yZmNvbW0vcG9ydF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1YzMxNC4uMDAwMDAwMAotLS0gYS9zdGFjay9yZmNvbW0vcG9ydF9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGludGVybmFsIHRvIHRoZSBQT1JUIHVuaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgUE9SVF9JTlRfSAotI2RlZmluZSBQT1JUX0lOVF9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcG9ydF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3JmY2RlZnMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKgotICogRmxvdyBjb250cm9sIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGUgbXV4Ci0qLwotI2RlZmluZSBQT1JUX0ZDX1VOREVGSU5FRCAwIC8qIG11eCBmbG93IGNvbnRyb2wgbWVjaGFuaXNtIG5vdCBkZWZpbmVkIHlldCAqLwotI2RlZmluZSBQT1JUX0ZDX1RTNzEwIDEgICAgIC8qIHVzZSBUUyAwNy4xMCBmbG93IGNvbnRyb2wgICovCi0jZGVmaW5lIFBPUlRfRkNfQ1JFRElUIDIgICAgLyogdXNlIFJGQ09NTSBjcmVkaXQgYmFzZWQgZmxvdyBjb250cm9sICovCi0KLS8qCi0gKiBEZWZpbmUgUG9ydCBEYXRhIFRyYW5zZmVyZSBjb250cm9sIGJsb2NrCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBmaXhlZF9xdWV1ZV90KiBxdWV1ZTsgLyogUXVldWUgb2YgYnVmZmVycyB3YWl0aW5nIHRvIGJlIHNlbnQgKi8KLSAgYm9vbCBwZWVyX2ZjOyAvKiB0cnVlIGlmIGZsb3cgY29udHJvbCBpcyBzZXQgYmFzZWQgb24gcGVlcidzIHJlcXVlc3QgKi8KLSAgYm9vbCB1c2VyX2ZjOyAvKiB0cnVlIGlmIGZsb3cgY29udHJvbCBpcyBzZXQgYmFzZWQgb24gdXNlcidzIHJlcXVlc3QgICovCi0gIHVpbnQzMl90IHF1ZXVlX3NpemU7ICAgICAgICAvKiBOdW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgcXVldWUgKi8KLSAgdFBPUlRfQ0FMTEJBQ0sqIHBfY2FsbGJhY2s7IC8qIEFkZHJlc3Mgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi19IHRQT1JUX0RBVEE7Ci0KLS8qCi0gKiBQb3J0IGNvbnRyb2wgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBtb2RlbSBpbmZvCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotI2RlZmluZSBNT0RFTV9TSUdOQUxfRFRSRFNSIDB4MDEKLSNkZWZpbmUgTU9ERU1fU0lHTkFMX1JUU0NUUyAweDAyCi0jZGVmaW5lIE1PREVNX1NJR05BTF9SSSAweDA0Ci0jZGVmaW5lIE1PREVNX1NJR05BTF9EQ0QgMHgwOAotCi0gIHVpbnQ4X3QgbW9kZW1fc2lnbmFsOyAvKiBbRFRSL0RTUiB8IFJUUy9DVFMgfCBSSSB8IERDRCBdICovCi0KLSAgdWludDhfdCBicmVha19zaWduYWw7IC8qIDAtMyBzIGluIHN0ZXBzIG9mIDIwMCBtcyAqLwotCi0gIHVpbnQ4X3QgZGlzY2FyZF9idWZmZXJzOyAvKiAwIC0gZG8gbm90IGRpc2NhcmQsIDEgLSBkaXNjYXJkICovCi0KLSNkZWZpbmUgUkZDT01NX0NUUkxfQlJFQUtfQVNBUCAwCi0jZGVmaW5lIFJGQ09NTV9DVFJMX0JSRUFLX0lOX1NFUSAxCi0KLSAgdWludDhfdCBicmVha19zaWduYWxfc2VxOyAvKiBhcyBzb29uIGFzIHBvc3NpYmxlIHwgaW4gc2VxdWVuY2UgKGRlZmF1bHQpICovCi0KLSAgYm9vbCBmYzsgLyogdHJ1ZSB3aGVuIHRoZSBkZXZpY2UgaXMgdW5hYmxlIHRvIGFjY2VwdCBmcmFtZXMgKi8KLX0gdFBPUlRfQ1RSTDsKLQotLyoKLSAqIFJGQ09NTSBtdWx0aXBsZXhlciBDb250cm9sIEJsb2NrCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBhbGFybV90KiBtY2JfdGltZXIgPSBudWxscHRyOyAgIC8qIE1DQiB0aW1lciAqLwotICBmaXhlZF9xdWV1ZV90KiBjbWRfcSA9IG51bGxwdHI7IC8qIFF1ZXVlIGZvciBjb21tYW5kIG1lc3NhZ2VzIG9uIHRoaXMgbXV4ICovCi0gIHVpbnQ4X3QgcG9ydF9oYW5kbGVzW1JGQ09NTV9NQVhfRExDSSArIDFdOyAvKiBBcnJheSBmb3IgcXVpY2sgYWNjZXNzIHRvICAqLwotICAvKiBwb3J0IGhhbmRsZXMgYmFzZWQgb24gZGxjaSAgICAgICAgKi8KLSAgUmF3QWRkcmVzcyBiZF9hZGRyID0KLSAgICAgIFJhd0FkZHJlc3M6OmtFbXB0eTsgICAgICAgICAgICAgICAgLyogQkQgQUREUiBvZiB0aGUgcGVlciBpZiBpbml0aWF0b3IgKi8KLSAgdWludDE2X3QgbGNpZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jYWwgY2lkIHVzZWQgZm9yIHRoaXMgY2hhbm5lbCAqLwotICB1aW50MTZfdCBwZWVyX2wyY2FwX210dTsgLyogTWF4IGZyYW1lIHRoYXQgY2FuIGJlIHNlbnQgdG8gcGVlciBMMkNBUCAqLwotICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgLyogQ3VycmVudCBtdWx0aXBsZXhlciBjaGFubmVsIHN0YXRlICovCi0gIHVpbnQ4X3QgaXNfaW5pdGlhdG9yOyAgICAvKiB0cnVlIGlmIHRoaXMgc2lkZSBzZW5kcyBTQUJNRSAoZGxjaT0wKSAqLwotICBib29sIHJlc3RhcnRfcmVxdWlyZWQ7ICAvKiB0cnVlIGlmIGhhcyB0byByZXN0YXJ0IGNoYW5uZWwgYWZ0ZXIgZGlzYyAqLwotICBib29sIHBlZXJfcmVhZHk7ICAgICAgICAvKiBUcnVlIGlmIG90aGVyIHNpZGUgY2FuIGFjY2VwdCBmcmFtZXMgKi8KLSAgdWludDhfdCBmbG93OyAgICAgICAgICAgLyogZmxvdyBjb250cm9sIG1lY2hhbmlzbSBmb3IgdGhpcyBtdXggKi8KLSAgYm9vbCBsMmNhcF9jb25nZXN0ZWQ7ICAgLyogdHJ1ZSBpZiBMMkNBUCBpcyBjb25nZXN0ZWQgKi8KLSAgYm9vbCBpc19kaXNjX2luaXRpYXRvcjsgLyogdHJ1ZSBpZiBpbml0aWF0ZWQgZGlzYyBvZiBwb3J0ICovCi0gIHVpbnQxNl90Ci0gICAgICBwZW5kaW5nX2xjaWQ7IC8qIHN0b3JlIExDSUQgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gd2hpbGUgY29ubmVjdGluZyAqLwotICBib29sIHBlbmRpbmdfY29uZmlndXJlX2NvbXBsZXRlOyAgICAgICAvKiB0cnVlIGlmIGNvbmZpcXVyYXRpb24gb2YgdGhlIHBlbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB3YXMgY29tcGxldGVkKi8KLSAgdEwyQ0FQX0NGR19JTkZPIHBlbmRpbmdfY2ZnX2luZm8gPSB7fTsgLyogc3RvcmUgY29uZmlndXJlIGluZm8gZm9yIGluY29taW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHdoaWxlIGNvbm5lY3RpbmcgKi8KLX0gdFJGQ19NQ0I7Ci0KLS8qCi0gKiBSRkNPTU0gUG9ydCBDb25uZWN0aW9uIENvbnRyb2wgQmxvY2sKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qgc3RhdGU7IC8qIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gKi8KLQotI2RlZmluZSBSRkNfUlNQX1BOIDB4MDEKLSNkZWZpbmUgUkZDX1JTUF9SUE5fUkVQTFkgMHgwMgotI2RlZmluZSBSRkNfUlNQX1JQTiAweDA0Ci0jZGVmaW5lIFJGQ19SU1BfTVNDIDB4MDgKLSNkZWZpbmUgUkZDX1JTUF9STFMgMHgxMAotCi0gIHVpbnQ4X3QgZXhwZWN0ZWRfcnNwOwotCi0gIHRSRkNfTUNCKiBwX21jYjsKLQotICBhbGFybV90KiBwb3J0X3RpbWVyOwotfSB0UkZDX1BPUlQ7Ci0KLS8qCi0gKiBEZWZpbmUgY29udHJvbCBibG9jayBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IFBPUlQgY29ubmVjdGlvbgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBoYW5kbGU7ICAvLyBTdGFydGluZyBmcm9tIDEsIHVuaXF1ZSBmb3IgdGhpcyBvYmplY3QKLSAgYm9vbCBpbl91c2U7IC8qIFRydWUgd2hlbiBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkICovCi0KLSNkZWZpbmUgUE9SVF9TVEFURV9DTE9TRUQgMAotI2RlZmluZSBQT1JUX1NUQVRFX09QRU5JTkcgMQotI2RlZmluZSBQT1JUX1NUQVRFX09QRU5FRCAyCi0jZGVmaW5lIFBPUlRfU1RBVEVfQ0xPU0lORyAzCi0KLSAgdWludDhfdCBzdGF0ZTsgLyogU3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uICovCi0KLSAgdWludDhfdCBzY247ICAgLyogU2VydmljZSBjaGFubmVsIG51bWJlciAqLwotICB1aW50MTZfdCB1dWlkOyAvKiBTZXJ2aWNlIFVVSUQgKi8KLQotICBSYXdBZGRyZXNzIGJkX2FkZHI7IC8qIEJEIEFERFIgb2YgdGhlIGRldmljZSBmb3IgdGhlIG11bHRpcGxleGVyIGNoYW5uZWwgKi8KLSAgYm9vbCBpc19zZXJ2ZXI7ICAvKiB0cnVlIGlmIHRoZSBzZXJ2ZXIgYXBwbGljYXRpb24gKi8KLSAgdWludDhfdCBkbGNpOyAgICAvKiBETENJIG9mIHRoZSBjb25uZWN0aW9uICovCi0KLSAgdWludDhfdCBlcnJvcjsgLyogTGFzdCBlcnJvciBkZXRlY3RlZCAqLwotCi0gIHVpbnQ4X3QgbGluZV9zdGF0dXM7IC8qIExpbmUgc3RhdHVzIGFzIHJlcG9ydGVkIGJ5IHBlZXIgKi8KLQotICB1aW50OF90IGRlZmF1bHRfc2lnbmFsX3N0YXRlOyAvKiBJbml0aWFsIHNpZ25hbCBzdGF0ZSBkZXBlbmRpbmcgb24gdXVpZCAqLwotCi0gIHVpbnQxNl90IG10dTsgICAgICAvKiBNYXggTVRVIHRoYXQgcG9ydCBjYW4gcmVjZWl2ZSAqLwotICB1aW50MTZfdCBwZWVyX210dTsgLyogTWF4IE1UVSB0aGF0IHBvcnQgY2FuIHNlbmQgKi8KLQotICB0UE9SVF9EQVRBIHR4OyAvKiBDb250cm9sIGJsb2NrIGZvciBkYXRhIGZyb20gYXBwIHRvIHBlZXIgKi8KLSAgdFBPUlRfREFUQSByeDsgLyogQ29udHJvbCBibG9jayBmb3IgZGF0YSBmcm9tIHBlZXIgdG8gYXBwICovCi0KLSAgdFBPUlRfU1RBVEUgdXNlcl9wb3J0X3BhcnM7IC8qIFBvcnQgcGFyYW1ldGVycyBmb3IgdXNlciBjb25uZWN0aW9uICovCi0gIHRQT1JUX1NUQVRFIHBlZXJfcG9ydF9wYXJzOyAvKiBQb3J0IHBhcmFtZXRlcnMgZm9yIHVzZXIgY29ubmVjdGlvbiAqLwotCi0gIHRQT1JUX0NUUkwgbG9jYWxfY3RybDsKLSAgdFBPUlRfQ1RSTCBwZWVyX2N0cmw7Ci0KLSNkZWZpbmUgUE9SVF9DVFJMX1JFUV9TRU5UIDB4MDEKLSNkZWZpbmUgUE9SVF9DVFJMX1JFUV9DT05GSVJNRUQgMHgwMgotI2RlZmluZSBQT1JUX0NUUkxfSU5EX1JFQ0VJVkVEIDB4MDQKLSNkZWZpbmUgUE9SVF9DVFJMX0lORF9SRVNQT05ERUQgMHgwOAotCi0gIHVpbnQ4X3QgcG9ydF9jdHJsOyAvKiBNb2RlbSBTdGF0dXMgQ29tbWFuZCAgKi8KLQotICBib29sIHJ4X2ZsYWdfZXZfcGVuZGluZzsgLyogUlhGTEFHIENoYXJhY3RlciBpcyByZWNlaXZlZCAqLwotCi0gIHRSRkNfUE9SVCByZmM7IC8qIFJGQ09NTSBwb3J0IGNvbnRyb2wgYmxvY2sgKi8KLQotICB1aW50MzJfdCBldl9tYXNrOyAgICAgICAgICAgLyogRXZlbnQgbWFzayBmb3IgdGhlIGNhbGxiYWNrICovCi0gIHRQT1JUX0NBTExCQUNLKiBwX2NhbGxiYWNrOyAvKiBQb2ludGVyIHRvIHVzZXJzIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gIHRQT1JUX0NBTExCQUNLKgotICAgICAgcF9tZ210X2NhbGxiYWNrOyAvKiBDYWxsYmFjayBmdW5jdGlvbiB0byByZWNlaXZlIGNvbm5lY3Rpb24gdXAvZG93biAqLwotICB0UE9SVF9EQVRBX0NBTExCQUNLKgotICAgICAgcF9kYXRhX2NhbGxiYWNrOyAvKiBDYWxsYmFjayBmdW5jdGlvbiB0byByZWNlaXZlIGRhdGEgaW5kaWNhdGlvbnMgKi8KLSAgdFBPUlRfREFUQV9DT19DQUxMQkFDSyoKLSAgICAgIHBfZGF0YV9jb19jYWxsYmFjazsgLyogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBjYWxsb3V0cyBhbmQgZmxvd2N0cmwgKi8KLSAgdWludDE2X3QgY3JlZGl0X3R4OyAgICAgLyogRmxvdyBjb250cm9sIGNyZWRpdHMgZm9yIHR4IHBhdGggKi8KLSAgdWludDE2X3QgY3JlZGl0X3J4OyAgICAgLyogRmxvdyBjb250cm9sIGNyZWRpdHMgZm9yIHJ4IHBhdGgsIHRoaXMgaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgcGVlciBpcyBhbGxvd2VkIHRvIHNlbnQgKi8KLSAgdWludDE2X3QKLSAgICAgIGNyZWRpdF9yeF9tYXg7IC8qIE1heCBudW1iZXIgb2YgY3JlZGl0cyB3ZSB3aWxsIGFsbG93IHRoaXMgZ3V5IHRvIHNlbnQgKi8KLSAgdWludDE2X3QgY3JlZGl0X3J4X2xvdzsgICAvKiBOdW1iZXIgb2YgY3JlZGl0cyB3aGVuIHdlIHNlbmQgY3JlZGl0IHVwZGF0ZSAqLwotICB1aW50MTZfdCByeF9idWZfY3JpdGljYWw7IC8qIHBvcnQgcmVjZWl2ZSBxdWV1ZSBjcml0aWNhbCB3YXRlcm1hcmsgbGV2ZWwgKi8KLSAgYm9vbCBrZWVwX3BvcnRfaGFuZGxlOyAgICAvKiB0cnVlIGlmIHBvcnQgaXMgbm90IGRlYWxsb2NhdGVkIHdoZW4gY2xvc2luZyAqLwotICAvKiBpdCBpcyBzZXQgdG8gdHJ1ZSBmb3Igc2VydmVyIHdoZW4gYWxsb2NhdGluZyBwb3J0ICovCi0gIHVpbnQxNl90IGtlZXBfbXR1OyAvKiBNYXggTVRVIHRoYXQgcG9ydCBjYW4gcmVjZWl2ZSBieSBzZXJ2ZXIgKi8KLX0gdFBPUlQ7Ci0KLS8qIERlZmluZSB0aGUgUE9SVC9SRkNPTU0gY29udHJvbCBzdHJ1Y3R1cmUKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRQT1JUIHBvcnRbTUFYX1JGQ19QT1JUU107ICAgICAgICAgICAgLyogUG9ydCBpbmZvIHBvb2wgKi8KLSAgdFJGQ19NQ0IgcmZjX21jYltNQVhfQkRfQ09OTkVDVElPTlNdOyAvKiBSRkNPTU0gYmRfY29ubmVjdGlvbnMgcG9vbCAqLwotfSB0UE9SVF9DQjsKLQotLyoKLSAqIEZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgcG9ydF91dGlscy5jYwotKi8KLWV4dGVybiB0UE9SVCogcG9ydF9hbGxvY2F0ZV9wb3J0KHVpbnQ4X3QgZGxjaSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gdm9pZCBwb3J0X3NldF9kZWZhdWx0cyh0UE9SVCogcF9wb3J0KTsKLWV4dGVybiB2b2lkIHBvcnRfc2VsZWN0X210dSh0UE9SVCogcF9wb3J0KTsKLWV4dGVybiB2b2lkIHBvcnRfcmVsZWFzZV9wb3J0KHRQT1JUKiBwX3BvcnQpOwotZXh0ZXJuIHRQT1JUKiBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSk7Ci1leHRlcm4gdFJGQ19NQ0IqIHBvcnRfZmluZF9tY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik7Ci1leHRlcm4gdFBPUlQqIHBvcnRfZmluZF9kbGNpX3BvcnQodWludDhfdCBkbGNpKTsKLWV4dGVybiB0UE9SVCogcG9ydF9maW5kX3BvcnQodWludDhfdCBkbGNpLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKTsKLWV4dGVybiB1aW50MzJfdCBwb3J0X2dldF9zaWduYWxfY2hhbmdlcyh0UE9SVCogcF9wb3J0LCB1aW50OF90IG9sZF9zaWduYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2lnbmFsKTsKLWV4dGVybiB1aW50MzJfdCBwb3J0X2Zsb3dfY29udHJvbF91c2VyKHRQT1JUKiBwX3BvcnQpOwotZXh0ZXJuIHZvaWQgcG9ydF9mbG93X2NvbnRyb2xfcGVlcih0UE9SVCogcF9wb3J0LCBib29sIGVuYWJsZSwgdWludDE2X3QgY291bnQpOwotCi0vKgotICogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBwb3J0X3JmYy5jYwotKi8KLWV4dGVybiBpbnQgcG9ydF9vcGVuX2NvbnRpbnVlKHRQT1JUKiBwX3BvcnQpOwotZXh0ZXJuIHZvaWQgcG9ydF9zdGFydF9wb3J0X29wZW4odFBPUlQqIHBfcG9ydCk7Ci1leHRlcm4gdm9pZCBwb3J0X3N0YXJ0X3Bhcl9uZWcodFBPUlQqIHBfcG9ydCk7Ci1leHRlcm4gdm9pZCBwb3J0X3N0YXJ0X2NvbnRyb2wodFBPUlQqIHBfcG9ydCk7Ci1leHRlcm4gdm9pZCBwb3J0X3N0YXJ0X2Nsb3NlKHRQT1JUKiBwX3BvcnQpOwotZXh0ZXJuIHZvaWQgcG9ydF9yZmNfY2xvc2VkKHRQT1JUKiBwX3BvcnQsIHVpbnQ4X3QgcmVzKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9yZmNvbW0vcG9ydF9yZmMuY2MgYi9zdGFjay9yZmNvbW0vcG9ydF9yZmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2U2YWYuLjAwMDAwMDAKLS0tIGEvc3RhY2svcmZjb21tL3BvcnRfcmZjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgcG9ydCBlbXVsYXRpb24gZW50aXR5IGFuZCBSRkNPTU0KLSAqICBjb21tdW5pY2F0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdHJhY2UuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9tdXRleC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9wb3J0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfaW50LmgiCi0KLS8qCi0gKiBMb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9ucwotKi8KLXVpbnQzMl90IHBvcnRfcmZjX3NlbmRfdHhfZGF0YSh0UE9SVCogcF9wb3J0KTsKLXZvaWQgcG9ydF9yZmNfY2xvc2VkKHRQT1JUKiBwX3BvcnQsIHVpbnQ4X3QgcmVzKTsKLXZvaWQgcG9ydF9nZXRfY3JlZGl0cyh0UE9SVCogcF9wb3J0LCB1aW50OF90IGspOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9vcGVuX2NvbnRpbnVlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBzZWN1cml0eSBtYW5hZ2VyIGNvbXBsZXRlcwotICogICAgICAgICAgICAgICAgICByZXF1aXJlZCBzZWN1cml0eSBjaGVja3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBwb3J0X29wZW5fY29udGludWUodFBPUlQqIHBfcG9ydCkgewotICBSRkNPTU1fVFJBQ0VfRVZFTlQoInBvcnRfb3Blbl9jb250aW51ZSwgcF9wb3J0OiVwIiwgcF9wb3J0KTsKLQotICAvKiBDaGVjayBpZiBtdWx0aXBsZXhlciBjaGFubmVsIGhhcyBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQgKi8KLSAgdFJGQ19NQ0IqIHBfbWNiID0gcmZjX2FsbG9jX211bHRpcGxleGVyX2NoYW5uZWwocF9wb3J0LT5iZF9hZGRyLCB0cnVlKTsKLSAgaWYgKHBfbWNiID09IG51bGxwdHIpIHsKLSAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygicG9ydF9vcGVuX2NvbnRpbnVlIG5vIG14IGNoYW5uZWwiKTsKLSAgICBwb3J0X3JlbGVhc2VfcG9ydChwX3BvcnQpOwotICAgIHJldHVybiAoUE9SVF9OT19SRVNPVVJDRVMpOwotICB9Ci0KLSAgcF9wb3J0LT5yZmMucF9tY2IgPSBwX21jYjsKLQotICBwX21jYi0+cG9ydF9oYW5kbGVzW3BfcG9ydC0+ZGxjaV0gPSBwX3BvcnQtPmhhbmRsZTsKLQotICAvKiBDb25uZWN0aW9uIGlzIHVwIGFuZCB3ZSBrbm93IGxvY2FsIGFuZCByZW1vdGUgZmVhdHVyZXMsIHNlbGVjdCBNVFUgKi8KLSAgcG9ydF9zZWxlY3RfbXR1KHBfcG9ydCk7Ci0KLSAgaWYgKHBfbWNiLT5zdGF0ZSA9PSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgUkZDT01NX1BhcmFtZXRlck5lZ290aWF0aW9uUmVxdWVzdChwX21jYiwgcF9wb3J0LT5kbGNpLCBwX3BvcnQtPm10dSk7Ci0gIH0gZWxzZSBpZiAoKHBfbWNiLT5zdGF0ZSA9PSBSRkNfTVhfU1RBVEVfSURMRSkgfHwKLSAgICAgICAgICAgICAocF9tY2ItPnN0YXRlID09IFJGQ19NWF9TVEFURV9ESVNDX1dBSVRfVUEpKSB7Ci0gICAgLy8gSW4gUkZDX01YX1NUQVRFX0lETEUgc3RhdGUsIE1YIHN0YXRlIG1hY2hpbmUgd2lsbCBjcmVhdGUgY29ubmVjdGlvbgotICAgIC8vIEluIFJGQ19NWF9TVEFURV9ESVNDX1dBSVRfVUEgc3RhdGUsIE1YIHN0YXRlIG1hY2hpbmUgd2lsbCByZWNyZWF0ZQotICAgIC8vIGNvbm5lY3Rpb24gYWZ0ZXIgZGlzY29ubmVjdGluZyBpcyBjb21wbGV0ZWQKLSAgICBSRkNPTU1fU3RhcnRSZXEocF9tY2IpOwotICB9IGVsc2UgewotICAgIC8vIE1YIHN0YXRlIG1hY2hpbmUgaWdub3JlcyBSRkNfTVhfRVZFTlRfU1RBUlRfUkVRIGluIHRoZXNlIHN0YXRlcwotICAgIC8vIFdoZW4gaXQgZW50ZXJzIFJGQ19NWF9TVEFURV9DT05ORUNURUQsIGl0IHdpbGwgY2hlY2sgYW55IG9wZW5uaW5nIHBvcnRzCi0gICAgUkZDT01NX1RSQUNFX0RFQlVHKAotICAgICAgICAicG9ydF9vcGVuX2NvbnRpbnVlOiBteCBzdGF0ZSglZCkgbXggY2hhbm5lbCBpcyBvcGVubmluZyIsCi0gICAgICAgIHBfbWNiLT5zdGF0ZSk7Ci0gIH0KLSAgcmV0dXJuIChQT1JUX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9zdGFydF9jb250cm9sCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgQlRVX1RBU0sgY29udGV4dCB0bwotICogICAgICAgICAgICAgICAgICBzZW5kIGNvbnRyb2wgaW5mb3JtYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwb3J0X3N0YXJ0X2NvbnRyb2wodFBPUlQqIHBfcG9ydCkgewotICB0UkZDX01DQiogcF9tY2IgPSBwX3BvcnQtPnJmYy5wX21jYjsKLQotICBpZiAocF9tY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIFJGQ09NTV9Db250cm9sUmVxKHBfbWNiLCBwX3BvcnQtPmRsY2ksICZwX3BvcnQtPmxvY2FsX2N0cmwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9zdGFydF9wYXJfbmVnCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgQlRVX1RBU0sgY29udGV4dCB0bwotICogICAgICAgICAgICAgICAgICBzZW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwb3J0X3N0YXJ0X3Bhcl9uZWcodFBPUlQqIHBfcG9ydCkgewotICB0UkZDX01DQiogcF9tY2IgPSBwX3BvcnQtPnJmYy5wX21jYjsKLQotICBpZiAocF9tY2IgPT0gTlVMTCkgcmV0dXJuOwotCi0gIFJGQ09NTV9Qb3J0UGFyYW1ldGVyTmVnb3RpYXRpb25SZXF1ZXN0KHBfbWNiLCBwX3BvcnQtPmRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3BvcnQtPnVzZXJfcG9ydF9wYXJzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBvcnRfc3RhcnRfY2xvc2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBCVFVfVEFTSyBjb250ZXh0IHRvCi0gKiAgICAgICAgICAgICAgICAgIHJlbGVhc2UgRExDCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcG9ydF9zdGFydF9jbG9zZSh0UE9SVCogcF9wb3J0KSB7Ci0gIHRSRkNfTUNCKiBwX21jYiA9IHBfcG9ydC0+cmZjLnBfbWNiOwotICB1aW50OF90IG9sZF9zaWduYWxzOwotICB1aW50MzJfdCBldmVudHMgPSAwOwotCi0gIC8qIEF0IGZpcnN0IGluZGljYXRlIHRvIHRoZSB1c2VyIHRoYXQgc2lnbmFscyBvbiB0aGUgY29ubmVjdGlvbiB3ZXJlIGRyb3BwZWQKLSAgICovCi0gIHBfcG9ydC0+bGluZV9zdGF0dXMgfD0gTElORV9TVEFUVVNfRkFJTEVEOwotICBvbGRfc2lnbmFscyA9IHBfcG9ydC0+cGVlcl9jdHJsLm1vZGVtX3NpZ25hbDsKLQotICBwX3BvcnQtPnBlZXJfY3RybC5tb2RlbV9zaWduYWwgJj0KLSAgICAgIH4oUE9SVF9EVFJEU1JfT04gfCBQT1JUX0NUU1JUU19PTiB8IFBPUlRfRENEX09OKTsKLQotICBldmVudHMgfD0gcG9ydF9nZXRfc2lnbmFsX2NoYW5nZXMocF9wb3J0LCBvbGRfc2lnbmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+cGVlcl9jdHJsLm1vZGVtX3NpZ25hbCk7Ci0KLSAgaWYgKHBfcG9ydC0+ZXZfbWFzayAmIFBPUlRfRVZfQ09OTkVDVF9FUlIpIGV2ZW50cyB8PSBQT1JUX0VWX0NPTk5FQ1RfRVJSOwotCi0gIGlmIChwX3BvcnQtPmV2X21hc2sgJiBQT1JUX0VWX0VSUikgZXZlbnRzIHw9IFBPUlRfRVZfRVJSOwotCi0gIGlmICgocF9wb3J0LT5wX2NhbGxiYWNrICE9IE5VTEwpICYmIGV2ZW50cykKLSAgICBwX3BvcnQtPnBfY2FsbGJhY2soZXZlbnRzLCBwX3BvcnQtPmhhbmRsZSk7Ci0KLSAgLyogQ2hlY2sgaWYgUkZDT01NIHNpZGUgaGFzIGJlZW4gY2xvc2VkIHdoaWxlIHRoZSBtZXNzYWdlIHdhcyBxdWV1ZWQgKi8KLSAgaWYgKChwX21jYiA9PSBOVUxMKSB8fCAocF9wb3J0LT5yZmMuc3RhdGUgPT0gUkZDX1NUQVRFX0NMT1NFRCkpIHsKLSAgICAvKiBDYWxsIG1hbmFnZW1lbnQgY2FsbGJhY2sgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgcG9ydF9yZWxlYXNlX3BvcnQoKSB0bwotICAgICAqIGNsZWFyIHRQb3J0ICovCi0gICAgaWYgKHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrKQotICAgICAgcF9wb3J0LT5wX21nbXRfY2FsbGJhY2soUE9SVF9DTE9TRUQsIHBfcG9ydC0+aGFuZGxlKTsKLQotICAgIHBvcnRfcmVsZWFzZV9wb3J0KHBfcG9ydCk7Ci0gIH0gZWxzZSB7Ci0gICAgUkZDT01NX0RsY1JlbGVhc2VSZXEocF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfU3RhcnRDbmYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSBsYXllciB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGluZyBvZiB0aGUgbXVsdGlwbGV4ZXIgY2hhbm5lbCBpcyBjb21wbGV0ZWQuCi0gKiAgICAgICAgICAgICAgICAgIENvbnRpbnVlIGVzdGFibGlzaGluZyBvZiB0aGUgY29ubmVjdGlvbiBmb3IgYWxsIHBvcnRzIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgYXJlIGluIHRoZSBPUEVOSU5HIHN0YXRlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE9SVF9TdGFydENuZih0UkZDX01DQiogcF9tY2IsIHVpbnQxNl90IHJlc3VsdCkgewotICBib29sIG5vX3BvcnRzX3VwID0gdHJ1ZTsKLQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIiVzOiByZXN1bHQgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKLQotICB0UE9SVCogcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbMF07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JGQ19QT1JUUzsgaSsrLCBwX3BvcnQrKykgewotICAgIGlmIChwX3BvcnQtPnJmYy5wX21jYiA9PSBwX21jYikgewotICAgICAgbm9fcG9ydHNfdXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBSRkNPTU1fU1VDQ0VTUykgewotICAgICAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoIiVzOiBkbGNpICVkIiwgX19mdW5jX18sIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICAgIFJGQ09NTV9QYXJhbWV0ZXJOZWdvdGlhdGlvblJlcXVlc3QocF9tY2IsIHBfcG9ydC0+ZGxjaSwgcF9wb3J0LT5tdHUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzOiBmYWlsZWQgcmVzdWx0OiVkIiwgX19mdW5jX18sIHJlc3VsdCk7Ci0KLSAgICAgICAgLyogV2FybmluZzogcmVzdWx0IGlzIGFsc28gc2V0IHRvIDQgd2hlbiBsMmNhcCBjb25uZWN0aW9uCi0gICAgICAgICAgIGZhaWxzIGR1ZSB0byBsMmNhcCBjb25uZWN0IGNuZiAobm9fcmVzb3VyY2VzKSAqLwotICAgICAgICBpZiAocmVzdWx0ID09IEhDSV9FUlJfUEFHRV9USU1FT1VUKSB7Ci0gICAgICAgICAgcF9wb3J0LT5lcnJvciA9IFBPUlRfUEFHRV9USU1FT1VUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBfcG9ydC0+ZXJyb3IgPSBQT1JUX1NUQVJUX0ZBSUxFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJmY19yZWxlYXNlX211bHRpcGxleGVyX2NoYW5uZWwocF9tY2IpOwotCi0gICAgICAgIC8qIFNlbmQgZXZlbnQgdG8gdGhlIGFwcGxpY2F0aW9uICovCi0gICAgICAgIGlmIChwX3BvcnQtPnBfY2FsbGJhY2sgJiYgKHBfcG9ydC0+ZXZfbWFzayAmIFBPUlRfRVZfQ09OTkVDVF9FUlIpKSB7Ci0gICAgICAgICAgKHBfcG9ydC0+cF9jYWxsYmFjaykoUE9SVF9FVl9DT05ORUNUX0VSUiwgcF9wb3J0LT5oYW5kbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrKSB7Ci0gICAgICAgICAgcF9wb3J0LT5wX21nbXRfY2FsbGJhY2soUE9SVF9TVEFSVF9GQUlMRUQsIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBvcnRfcmVsZWFzZV9wb3J0KHBfcG9ydCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogVGhlcmUgY2FuIGJlIGEgc2l0dWF0aW9uIHdoZW4gYWZ0ZXIgc3RhcnRpbmcgY29ubmVjdGlvbiwgdXNlciBjbG9zZXMgdGhlICovCi0gIC8qIHBvcnQsIHdlIGNhbiBjYXRjaCBpdCBoZXJlIHRvIGNsb3NlIG11bHRpcGxleG9yIGNoYW5uZWwgKi8KLSAgaWYgKG5vX3BvcnRzX3VwKSB7Ci0gICAgcmZjX2NoZWNrX21jYl9hY3RpdmUocF9tY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX1N0YXJ0SW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSRkNPTU0gbGF5ZXIgd2hlbgotICogICAgICAgICAgICAgICAgICBzb21lIHBlZXIgZGV2aWNlIHdhbnRzIHRvIGVzdGFibGlzaCBhIG11bHRpcGxleGVyCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uICBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHBvcnRzIG9wZW4gd2l0aCB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIG9yIG5vdCBhc3NpZ25lZCBtdWx0aXBsZXhlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX1N0YXJ0SW5kKHRSRkNfTUNCKiBwX21jYikgewotICB0UE9SVCogcF9wb3J0OwotICBpbnQgaTsKLQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfU3RhcnRJbmQiKTsKLQotICBwX3BvcnQgPSAmcmZjX2NiLnBvcnQucG9ydFswXTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9SRkNfUE9SVFM7IGkrKywgcF9wb3J0KyspIHsKLSAgICBpZiAoKHBfcG9ydC0+cmZjLnBfbWNiID09IE5VTEwpIHx8IChwX3BvcnQtPnJmYy5wX21jYiA9PSBwX21jYikpIHsKLSAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiUE9SVF9TdGFydEluZCwgUkZDT01NX1N0YXJ0UnNwIFJGQ09NTV9TVUNDRVNTOiBwX21jYjolcCIsIHBfbWNiKTsKLSAgICAgIFJGQ09NTV9TdGFydFJzcChwX21jYiwgUkZDT01NX1NVQ0NFU1MpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBSRkNPTU1fU3RhcnRSc3AocF9tY2IsIFJGQ09NTV9FUlJPUik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX1Bhck5lZ0luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgUkZDT01NIGxheWVyIHRvIGNoYW5nZQotICogICAgICAgICAgICAgICAgICBETENJIHBhcmFtZXRlcnMgKGN1cnJlbnRseSBvbmx5IE1UVSBpcyBuZWdvdGlhdGVkKS4KLSAqICAgICAgICAgICAgICAgICAgSWYgY2FuIG5vdCBmaW5kIHRoZSBwb3J0IGRvIG5vdCBhY2NlcHQgdGhlIHJlcXVlc3QuCi0gKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSBzYXZlIHRoZSBNVFUgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIHBlZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE9SVF9QYXJOZWdJbmQodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHVpbnQxNl90IG10dSwgdWludDhfdCBjbCwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrKSB7Ci0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiJXM6IGJkX2FkZHI9JXMsIGRsY2k9JWQsIG10dT0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBkbGNpLCBtdHUpOwotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpOwotICBpZiAoIXBfcG9ydCkgewotICAgIC8qIFRoaXMgY2FuIGJlIGEgZmlyc3QgcmVxdWVzdCBmb3IgdGhpcyBwb3J0ICovCi0gICAgcF9wb3J0ID0gcG9ydF9maW5kX2RsY2lfcG9ydChkbGNpKTsKLSAgICBpZiAoIXBfcG9ydCkgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBEaXNjb25uZWN0IFJGQ09NTSwgcG9ydCBub3QgZm91bmQsIGRsY2k9IgotICAgICAgICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhkbGNpKSA8PCAiLCBwX21jYj0iIDw8IHBfbWNiCi0gICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkcjsKLSAgICAgIC8qIElmIHRoZSBwb3J0IGNhbm5vdCBiZSBvcGVuZWQsIHNlbmQgYSBETS4gIFBlciBFcnJhdGEgMTIwNSAqLwotICAgICAgcmZjX3NlbmRfZG0ocF9tY2IsIGRsY2ksIGZhbHNlKTsKLSAgICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgcG9ydCBvcGVuLCBzb21lIGhlYWRzZXRzIGhhdmUKLSAgICAgIHByb2JsZW0sIHRoZXkgZG9uJ3QgZGlzY29ubmVjdCBpZiB3ZSBzZW5kIERNICovCi0gICAgICByZmNfY2hlY2tfbWNiX2FjdGl2ZShwX21jYik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFJGQ09NTV9UUkFDRV9FVkVOVCgiJXM6IHBvcnRfaGFuZGxlc1tkbGNpOiVkXTolZC0+JWQiLCBfX2Z1bmNfXywgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPnBvcnRfaGFuZGxlc1tkbGNpXSwgcF9wb3J0LT5oYW5kbGUpOwotICAgIHBfbWNiLT5wb3J0X2hhbmRsZXNbZGxjaV0gPSBwX3BvcnQtPmhhbmRsZTsKLSAgfQotCi0gIHBfcG9ydC0+YmRfYWRkciA9IHBfbWNiLT5iZF9hZGRyOwotCi0gIC8qIENvbm5lY3Rpb24gaXMgdXAgYW5kIHdlIGtub3cgbG9jYWwgYW5kIHJlbW90ZSBmZWF0dXJlcywgc2VsZWN0IE1UVSAqLwotICBwb3J0X3NlbGVjdF9tdHUocF9wb3J0KTsKLQotICBwX3BvcnQtPnJmYy5wX21jYiA9IHBfbWNiOwotICBwX3BvcnQtPm10dSA9IChwX3BvcnQtPm10dSA8IG10dSkgPyBwX3BvcnQtPm10dSA6IG10dTsKLSAgcF9wb3J0LT5wZWVyX210dSA9IHBfcG9ydC0+bXR1OwotCi0gIC8qIE5lZ290aWF0ZSB0aGUgZmxvdyBjb250cm9sIG1lY2hhbmlzbS4gIElmIGZsb3cgY29udHJvbCBtZWNoYW5pc20gZm9yICovCi0gIC8qIG11eCBoYXMgbm90IGJlZW4gc2V0IHlldCwgc2V0IGl0IG5vdy4gIElmIGVpdGhlciB3ZSBvciBwZWVyIHdhbnRzIFRTIDA3LjEwLAotICAgKi8KLSAgLyogdXNlIHRoYXQuICBPdGhlcndpc2UgYm90aCBtdXN0IHdhbnQgY3JlZGl0IGJhc2VkLCBzbyB1c2UgdGhhdC4gSWYgZmxvdyBpcwotICAgKi8KLSAgLyogYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIG11eCwgd2UgcmVzcG9uZCB3aXRoIHRoYXQgdmFsdWUuICovCi0gIGlmIChwX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX1VOREVGSU5FRCkgewotICAgIGlmICgoUE9SVF9GQ19ERUZBVUxUID09IFBPUlRfRkNfVFM3MTApIHx8Ci0gICAgICAgIChjbCA9PSBSRkNPTU1fUE5fQ09OVl9MQVlFUl9UWVBFXzEpKSB7Ci0gICAgICBwX21jYi0+ZmxvdyA9IFBPUlRfRkNfVFM3MTA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfbWNiLT5mbG93ID0gUE9SVF9GQ19DUkVESVQ7Ci0gICAgfQotICB9Ci0KLSAgLyogUmVnYXJkbGVzcyBvZiBvdXIgZmxvdyBjb250cm9sIG1lY2hhbmlzbSwgaWYgdGhlIFBOIGNsIGlzIHplcm8sIHdlIG11c3QgKi8KLSAgLyogcmVzcG9uZCB3aXRoIHplcm8uICAiQSByZXNwb25kaW5nIGltcGxlbWVudGF0aW9uIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gMTQKLSAgICovCi0gIC8qIGlmIChhbmQgb25seSBpZikgdGhlIFBOIHJlcXVlc3Qgd2FzIDE1LiIgIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgUE4gaXMgc2VudAotICAgKi8KLSAgLyogYWZ0ZXIgdGhlIERMQ0kgaXMgYWxyZWFkeSBlc3RhYmxpc2hlZC0tIHRoZSBQTiBpbiB0aGF0IGNhc2UgbXVzdCBoYXZlIGNsID0KLSAgICogMC4gKi8KLSAgLyogU2VlIFJGQ09NTSBzcGVjIDUuNS4zICovCi0gIHVpbnQ4X3Qgb3VyX2NsOwotICB1aW50OF90IG91cl9rOwotICBpZiAoY2wgPT0gUkZDT01NX1BOX0NPTlZfTEFZRVJfVFlQRV8xKSB7Ci0gICAgb3VyX2NsID0gUkZDT01NX1BOX0NPTlZfTEFZRVJfVFlQRV8xOwotICAgIG91cl9rID0gMDsKLSAgfSBlbHNlIGlmIChwX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX0NSRURJVCkgewotICAgIC8qIGdldCBjcmVkaXRzICovCi0gICAgcG9ydF9nZXRfY3JlZGl0cyhwX3BvcnQsIGspOwotCi0gICAgLyogU2V0IGNvbnZlcmdlbmNlIGxheWVyIGFuZCBudW1iZXIgb2YgY3JlZGl0cyAoaykgKi8KLSAgICBvdXJfY2wgPSBSRkNPTU1fUE5fQ09OVl9MQVlFUl9DQkZDX1I7Ci0gICAgb3VyX2sgPSAocF9wb3J0LT5jcmVkaXRfcnhfbWF4IDwgUkZDT01NX0tfTUFYKSA/IHBfcG9ydC0+Y3JlZGl0X3J4X21heAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSRkNPTU1fS19NQVg7Ci0gICAgcF9wb3J0LT5jcmVkaXRfcnggPSBvdXJfazsKLSAgfSBlbHNlIHsKLSAgICAvKiBtdXN0IG5vdCBiZSB1c2luZyBjcmVkaXQgYmFzZWQgZmxvdyBjb250cm9sOyB1c2UgVFMgNy4xMCAqLwotICAgIG91cl9jbCA9IFJGQ09NTV9QTl9DT05WX0xBWUVSX1RZUEVfMTsKLSAgICBvdXJfayA9IDA7Ci0gIH0KLSAgUkZDT01NX1BhcmFtZXRlck5lZ290aWF0aW9uUmVzcG9uc2UocF9tY2IsIGRsY2ksIHBfcG9ydC0+bXR1LCBvdXJfY2wsIG91cl9rKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfUGFyTmVnQ25mCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSRkNPTU0gbGF5ZXIgdG8gY2hhbmdlCi0gKiAgICAgICAgICAgICAgICAgIERMQ0kgcGFyYW1ldGVycyAoY3VycmVudGx5IG9ubHkgTVRVIGlzIG5lZ290aWF0ZWQpLgotICogICAgICAgICAgICAgICAgICBTYXZlIHRoZSBNVFUgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIHBlZXIuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBjb25maXJtYXRpb24gaXMgcmVjZWl2ZWQgZHVyaW5nIHRoZSBwb3J0IG9wZW5pbmcKLSAqICAgICAgICAgICAgICAgICAgcHJvY2VkdXJlIHNlbmQgRXN0YWJsaXNoUmVxdWVzdCB0byBjb250aW51ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX1Bhck5lZ0NuZih0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgdWludDE2X3QgbXR1LCB1aW50OF90IGNsLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGspIHsKLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJQT1JUX1Bhck5lZ0NuZiBkbGNpOiVkIG10dTolZCBjbDogJWQgazogJWQiLCBkbGNpLCBtdHUsCi0gICAgICAgICAgICAgICAgICAgICBjbCwgayk7Ci0gIHRQT1JUKiBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0gIGlmICghcF9wb3J0KSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHBvcnQgaXMgbnVsbCBmb3IgIiA8PCBwX21jYi0+YmRfYWRkcjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBGbG93IGNvbnRyb2wgbWVjaGFuaXNtIG5vdCBzZXQgeWV0LiAgTmVnb3RpYXRlIGZsb3cgY29udHJvbCBtZWNoYW5pc20uICovCi0gIGlmIChwX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX1VOREVGSU5FRCkgewotICAgIC8qIE91ciBzdGFjayBpcyBjb25maWd1cmVkIGZvciBUUzA3LjEwIGFuZCB0aGV5IHJlc3BvbmRlZCB3aXRoIGNyZWRpdC1iYXNlZC4KLSAgICAgKi8KLSAgICAvKiBUaGlzIGlzIGlsbGVnYWwtLSBuZWdvdGlhdGlvbiBmYWlscy4gKi8KLSAgICBpZiAoKFBPUlRfRkNfREVGQVVMVCA9PSBQT1JUX0ZDX1RTNzEwKSAmJgotICAgICAgICAoY2wgPT0gUkZDT01NX1BOX0NPTlZfTEFZRVJfQ0JGQ19SKSkgewotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBuZWdvdGlhdGlvbiBmYWlscywgaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgIHJmY19zZW5kX2Rpc2MocF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGNsID09IFJGQ09NTV9QTl9DT05WX0xBWUVSX0NCRkNfUikgewotICAgICAgLy8gT3VyIHN0YWNrIGlzIGNvbmZpZ3VyZWQgZm9yIGNyZWRpdC1iYXNlZCBhbmQgdGhleSByZXNwb25kZWQgd2l0aAotICAgICAgLy8gY3JlZGl0LWJhc2VkLgotICAgICAgcF9tY2ItPmZsb3cgPSBQT1JUX0ZDX0NSRURJVDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhleSByZXNwb25kZWQgd2l0aCBhbnkgb3RoZXIgdmFsdWUuICBUcmVhdCB0aGlzIGFzIG5lZ290aWF0aW9uIHRvCi0gICAgICAvLyBUUzA3LjEwLgotICAgICAgcF9tY2ItPmZsb3cgPSBQT1JUX0ZDX1RTNzEwOwotICAgIH0KLSAgfQotICAvKiBJZiBtdXggZmxvdyBjb250cm9sIG1lY2hhbmlzbSBzZXQsIHdlIGhvbm9yIHRoYXQgc2V0dGluZyByZWdhcmRsZXNzIG9mICovCi0gIC8qIHRoZSBDTCB2YWx1ZSBpbiB0aGVpciByZXNwb25zZS4gIFRoaXMgYWxsb3dzIHVzIHRvIGdyYWNlZnVsbHkgYWNjZXB0IGFueSAqLwotICAvKiBpbGxlZ2FsIFBOIG5lZ290aWF0aW9uIHNjZW5hcmlvcy4gKi8KLQotICBwX3BvcnQtPm10dSA9IChwX3BvcnQtPm10dSA8IG10dSkgPyBwX3BvcnQtPm10dSA6IG10dTsKLSAgcF9wb3J0LT5wZWVyX210dSA9IHBfcG9ydC0+bXR1OwotCi0gIGlmIChwX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX0NSRURJVCkgewotICAgIHBvcnRfZ2V0X2NyZWRpdHMocF9wb3J0LCBrKTsKLSAgfQotCi0gIGlmIChwX3BvcnQtPnN0YXRlID09IFBPUlRfU1RBVEVfT1BFTklORykKLSAgICBSRkNPTU1fRGxjRXN0YWJsaXNoUmVxKHBfbWNiLCBwX3BvcnQtPmRsY2ksIHBfcG9ydC0+bXR1KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfRGxjRXN0YWJsaXNoSW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSRkNPTU0gbGF5ZXIgd2hlbiBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZSB3YW50cyB0byBlc3RhYmxpc2ggYSBuZXcgRExDLiAgSWYgdGhpcyBpcyBub3QgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGZpcnN0IG1lc3NhZ2UgaW4gdGhlIGVzdGFibGlzaG1lbnQgcHJvY2VkdXJlIHBvcnRfaGFuZGxlCi0gKiAgICAgICAgICAgICAgICAgIGhhcyBhIGhhbmRsZSB0byB0aGUgcG9ydCBjb250cm9sIGJsb2NrIG90aGVyd2lzZSB0aGUgY29udHJvbAotICogICAgICAgICAgICAgICAgICBibG9jayBzaG91bGQgYmUgZm91bmQgYmFzZWQgb24gdGhlIG11bGlwbGV4ZXIgY2hhbm5lbCBhbmQKLSAqICAgICAgICAgICAgICAgICAgZGxjaS4gIFRoZSBibG9jayBzaG91bGQgYmUgYWxsb2NhdGVkIGFsbG9jYXRlZCBiZWZvcmUKLSAqICAgICAgICAgICAgICAgICAgbWVhbmluZyB0aGF0IGFwcGxpY2F0aW9uIGFscmVhZHkgbWFkZSBvcGVuLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBPUlRfRGxjRXN0YWJsaXNoSW5kKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB1aW50MTZfdCBtdHUpIHsKLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLQotICBSRkNPTU1fVFJBQ0VfREVCVUcoCi0gICAgICAiUE9SVF9EbGNFc3RhYmxpc2hJbmQgcF9tY2I6JXAsIGRsY2k6JWQgbXR1OiVkaSwgcF9wb3J0OiVwIiwgcF9tY2IsIGRsY2ksCi0gICAgICBtdHUsIHBfcG9ydCk7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIiBwX21jYiBhZGRyOiIgPDwgcF9tY2ItPmJkX2FkZHI7Ci0KLSAgaWYgKCFwX3BvcnQpIHsKLSAgICAvKiBUaGlzIGNhbiBiZSBhIGZpcnN0IHJlcXVlc3QgZm9yIHRoaXMgcG9ydCAqLwotICAgIHBfcG9ydCA9IHBvcnRfZmluZF9kbGNpX3BvcnQoZGxjaSk7Ci0gICAgaWYgKCFwX3BvcnQpIHsKLSAgICAgIFJGQ09NTV9EbGNFc3RhYmxpc2hSc3AocF9tY2IsIGRsY2ksIDAsIFJGQ09NTV9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHBfbWNiLT5wb3J0X2hhbmRsZXNbZGxjaV0gPSBwX3BvcnQtPmhhbmRsZTsKLSAgfQotCi0gIC8qIElmIEwyQ0FQJ3MgbXR1IGxlc3MgdGhlbiBSRkNPTU0ncyB0YWtlIGl0ICovCi0gIGlmIChtdHUgJiYgKG10dSA8IHBfcG9ydC0+cGVlcl9tdHUpKSBwX3BvcnQtPnBlZXJfbXR1ID0gbXR1OwotCi0gIC8qIElmIHRoZXJlIHdhcyBhbiBpbmFjdGl2aXR5IHRpbWVyIHJ1bm5pbmcgZm9yIE1DQiBzdG9wIGl0ICovCi0gIHJmY190aW1lcl9zdG9wKHBfbWNiKTsKLQotICBSRkNPTU1fRGxjRXN0YWJsaXNoUnNwKHBfbWNiLCBkbGNpLCBwX3BvcnQtPm10dSwgUkZDT01NX1NVQ0NFU1MpOwotCi0gIC8qIFRoaXMgaXMgdGhlIHNlcnZlciBzaWRlLiAgSWYgYXBwbGljYXRpb24gd2FudHMgdG8ga25vdyB3aGVuIGNvbm5lY3Rpb24gKi8KLSAgLyogaXMgZXN0YWJsaXNoZWQsIHRoYXRzIHRoZSBwbGFjZSAqLwotICBpZiAocF9wb3J0LT5wX2NhbGxiYWNrICYmIChwX3BvcnQtPmV2X21hc2sgJiBQT1JUX0VWX0NPTk5FQ1RFRCkpCi0gICAgKHBfcG9ydC0+cF9jYWxsYmFjaykoUE9SVF9FVl9DT05ORUNURUQsIHBfcG9ydC0+aGFuZGxlKTsKLQotICBpZiAocF9wb3J0LT5wX21nbXRfY2FsbGJhY2spCi0gICAgcF9wb3J0LT5wX21nbXRfY2FsbGJhY2soUE9SVF9TVUNDRVNTLCBwX3BvcnQtPmhhbmRsZSk7Ci0KLSAgcF9wb3J0LT5zdGF0ZSA9IFBPUlRfU1RBVEVfT1BFTkVEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9EbGNFc3RhYmxpc2hDbmYKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSBsYXllciB3aGVuIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgYWNrbm93bGVkZ2VzIGVzdGFibGlzaCBwcm9jZWR1cmUgKFNBQk1FL1VBKS4gIFNlbmQgcmVwbHkKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHVzZXIgYW5kIHNldCBzdGF0ZSB0byBPUEVORUQgaWYgcmVzdWx0IHdhcwotICogICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX0RsY0VzdGFibGlzaENuZih0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgdWludDE2X3QgbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpIHsKLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfRGxjRXN0YWJsaXNoQ25mIGRsY2k6JWQgbXR1OiVkIHJlc3VsdDolZCIsIGRsY2ksIG10dSwKLSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0KLSAgaWYgKCFwX3BvcnQpIHJldHVybjsKLQotICBpZiAocmVzdWx0ICE9IFJGQ09NTV9TVUNDRVNTKSB7Ci0gICAgcF9wb3J0LT5lcnJvciA9IFBPUlRfU1RBUlRfRkFJTEVEOwotICAgIHBvcnRfcmZjX2Nsb3NlZChwX3BvcnQsIFBPUlRfU1RBUlRfRkFJTEVEKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBJZiBMMkNBUCdzIG10dSBsZXNzIHRoZW4gUkZDT01NJ3MgdGFrZSBpdCAqLwotICBpZiAobXR1ICYmIChtdHUgPCBwX3BvcnQtPnBlZXJfbXR1KSkgcF9wb3J0LT5wZWVyX210dSA9IG10dTsKLQotICAvKiBJZiB0aGVyZSB3YXMgYW4gaW5hY3Rpdml0eSB0aW1lciBydW5uaW5nIGZvciBNQ0Igc3RvcCBpdCAqLwotICByZmNfdGltZXJfc3RvcChwX21jYik7Ci0KLSAgaWYgKHBfcG9ydC0+cF9jYWxsYmFjayAmJiAocF9wb3J0LT5ldl9tYXNrICYgUE9SVF9FVl9DT05ORUNURUQpKQotICAgIChwX3BvcnQtPnBfY2FsbGJhY2spKFBPUlRfRVZfQ09OTkVDVEVELCBwX3BvcnQtPmhhbmRsZSk7Ci0KLSAgaWYgKHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrKQotICAgIHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrKFBPUlRfU1VDQ0VTUywgcF9wb3J0LT5oYW5kbGUpOwotCi0gIHBfcG9ydC0+c3RhdGUgPSBQT1JUX1NUQVRFX09QRU5FRDsKLQotICAvKiBSUE4gaXMgcmVxdWlyZWQgb25seSBpZiB3ZSB3YW50IHRvIHRlbGwgRFRFIGhvdyB0aGUgcG9ydCBzaG91bGQgYmUgb3BlbmVkCi0gICAqLwotICBpZiAoKHBfcG9ydC0+dXVpZCA9PSBVVUlEX1NFUlZDTEFTU19ESUFMVVBfTkVUV09SS0lORykgfHwKLSAgICAgIChwX3BvcnQtPnV1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfRkFYKSkKLSAgICBSRkNPTU1fUG9ydFBhcmFtZXRlck5lZ290aWF0aW9uUmVxdWVzdChwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBlbHNlCi0gICAgUkZDT01NX0NvbnRyb2xSZXEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgJnBfcG9ydC0+bG9jYWxfY3RybCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX1BvcnROZWdJbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSBsYXllciB3aGVuIHBlZXIKLSAqICAgICAgICAgICAgICAgICAgZGV2aWNlIHdhbnRzIHRvIHNldCBwYXJhbWV0ZXJzIG9mIHRoZSBwb3J0LiAgQXMgcGVyIHRoZSBzcGVjCi0gKiAgICAgICAgICAgICAgICAgIHRoaXMgbWVzc2FnZSBoYXMgdG8gYmUgc2VudCBiZWZvcmUgdGhlIGZpcnN0IGRhdGEgcGFja2V0Ci0gKiAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2VudCBiZWZvcmUgZXN0YWJsaXNoLiAgVGhlIGJsb2NrIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmVmb3JlIG1lYW5pbmcgdGhhdCBhcHBsaWNhdGlvbiBhbHJlYWR5IG1hZGUgb3Blbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX1BvcnROZWdJbmQodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHRQT1JUX1NUQVRFKiBwX3BhcnMsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYXJhbV9tYXNrKSB7Ci0gIHRQT1JUKiBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJQT1JUX1BvcnROZWdJbmQiKTsKLQotICBpZiAoIXBfcG9ydCkgewotICAgIC8qIFRoaXMgY2FuIGJlIGEgZmlyc3QgcmVxdWVzdCBmb3IgdGhpcyBwb3J0ICovCi0gICAgcF9wb3J0ID0gcG9ydF9maW5kX2RsY2lfcG9ydChkbGNpKTsKLSAgICBpZiAoIXBfcG9ydCkgewotICAgICAgUkZDT01NX1BvcnRQYXJhbWV0ZXJOZWdvdGlhdGlvblJlc3BvbnNlKHBfbWNiLCBkbGNpLCBwX3BhcnMsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwX21jYi0+cG9ydF9oYW5kbGVzW2RsY2ldID0gcF9wb3J0LT5oYW5kbGU7Ci0gIH0KLQotICAvKiBDaGVjayBpZiB0aGUgZmxvdyBjb250cm9sIGlzIGFjY2VwdGFibGUgb24gbG9jYWwgc2lkZSAqLwotICBwX3BvcnQtPnBlZXJfcG9ydF9wYXJzID0gKnBfcGFyczsKLSAgUkZDT01NX1BvcnRQYXJhbWV0ZXJOZWdvdGlhdGlvblJlc3BvbnNlKHBfbWNiLCBkbGNpLCBwX3BhcnMsIHBhcmFtX21hc2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9Qb3J0TmVnQ25mCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSRkNPTU0gbGF5ZXIgdG8gY2hhbmdlCi0gKiAgICAgICAgICAgICAgICAgIHN0YXRlIGZvciB0aGUgcG9ydC4gIFByb3BhZ2F0ZSBjaGFuZ2UgdG8gdGhlIHVzZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE9SVF9Qb3J0TmVnQ25mKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdFBPUlRfU1RBVEUqIHBfcGFycywgdWludDE2X3QgcmVzdWx0KSB7Ci0gIHRQT1JUKiBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJQT1JUX1BvcnROZWdDbmYiKTsKLQotICBpZiAoIXBfcG9ydCkgewotICAgIFJGQ09NTV9UUkFDRV9XQVJOSU5HKCJQT1JUX1BvcnROZWdDbmYgbm8gcG9ydCIpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBQb3J0IG5lZ290aWF0aW9uIGZhaWxlZC4gRHJvcCB0aGUgY29ubmVjdGlvbiAqLwotICBpZiAocmVzdWx0ICE9IFJGQ09NTV9TVUNDRVNTKSB7Ci0gICAgcF9wb3J0LT5lcnJvciA9IFBPUlRfUE9SVF9ORUdfRkFJTEVEOwotCi0gICAgUkZDT01NX0RsY1JlbGVhc2VSZXEocF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0KLSAgICBwb3J0X3JmY19jbG9zZWQocF9wb3J0LCBQT1JUX1BPUlRfTkVHX0ZBSUxFRCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCEocF9wb3J0LT5wb3J0X2N0cmwgJiBQT1JUX0NUUkxfUkVRX1NFTlQpKSB7Ci0gICAgUkZDT01NX0NvbnRyb2xSZXEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgJnBfcG9ydC0+bG9jYWxfY3RybCk7Ci0gIH0gZWxzZSB7Ci0gICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIlBPUlRfUG9ydE5lZ0NuZiBDb250cm9sIEFscmVhZHkgc2VudCIpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0NvbnRyb2xJbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSBsYXllciBvbiB0aGUgbW9kZW0KLSAqICAgICAgICAgICAgICAgICAgc2lnbmFsIGNoYW5nZS4gIFByb3BhZ2F0ZSBjaGFuZ2UgdG8gdGhlIHVzZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE9SVF9Db250cm9sSW5kKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB0UE9SVF9DVFJMKiBwX3BhcnMpIHsKLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLSAgdWludDMyX3QgZXZlbnQ7Ci0gIHVpbnQ4X3Qgb2xkX3NpZ25hbHM7Ci0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJQT1JUX0NvbnRyb2xJbmQiKTsKLQotICBpZiAoIXBfcG9ydCkgcmV0dXJuOwotCi0gIG9sZF9zaWduYWxzID0gcF9wb3J0LT5wZWVyX2N0cmwubW9kZW1fc2lnbmFsOwotCi0gIGV2ZW50ID0gcG9ydF9nZXRfc2lnbmFsX2NoYW5nZXMocF9wb3J0LCBvbGRfc2lnbmFscywgcF9wYXJzLT5tb2RlbV9zaWduYWwpOwotCi0gIHBfcG9ydC0+cGVlcl9jdHJsID0gKnBfcGFyczsKLQotICBpZiAoIShwX3BvcnQtPnBvcnRfY3RybCAmIFBPUlRfQ1RSTF9SRVFfU0VOVCkpIHsKLSAgICBSRkNPTU1fQ29udHJvbFJlcShwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLCAmcF9wb3J0LT5sb2NhbF9jdHJsKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIHJlY2VpdmVkIGNvbnRyb2wgUkZDT01NIGlzIGNvbm5lY3RlZCAqLwotICAgIGlmICghKHBfcG9ydC0+cG9ydF9jdHJsICYgUE9SVF9DVFJMX0lORF9SRUNFSVZFRCkpIHsKLSAgICAgIGV2ZW50IHw9IChQT1JUX0VWX0NPTk5FQ1RFRCAmIHBfcG9ydC0+ZXZfbWFzayk7Ci0gICAgfQotCi0gICAgaWYgKHBfcG9ydC0+cG9ydF9jdHJsICYgUE9SVF9DVFJMX1JFUV9DT05GSVJNRUQpIHsKLSAgICAgIGV2ZW50IHw9IHBvcnRfcmZjX3NlbmRfdHhfZGF0YShwX3BvcnQpOwotICAgIH0KLSAgfQotCi0gIHBfcG9ydC0+cG9ydF9jdHJsIHw9IChQT1JUX0NUUkxfSU5EX1JFQ0VJVkVEIHwgUE9SVF9DVFJMX0lORF9SRVNQT05ERUQpOwotCi0gIGlmIChwX3BhcnMtPmJyZWFrX3NpZ25hbCkgZXZlbnQgfD0gKFBPUlRfRVZfQlJFQUsgJiBwX3BvcnQtPmV2X21hc2spOwotCi0gIC8qIGV4ZWN1dGUgY2FsbCBiYWNrIGZ1bmN0aW9uIG9ubHkgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJlZ2lzdGVyZWQgZm9yIGV2ZW50cwotICAgKi8KLSAgaWYgKGV2ZW50ICYmIHBfcG9ydC0+cF9jYWxsYmFjaykgKHBfcG9ydC0+cF9jYWxsYmFjaykoZXZlbnQsIHBfcG9ydC0+aGFuZGxlKTsKLQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoCi0gICAgICAiUE9SVF9Db250cm9sSW5kIERUUl9EU1IgOiAlZCwgUlRTX0NUUyA6ICVkLCBSSSA6ICVkLCBEQ0QgOiAlZCIsCi0gICAgICAoKHBfcG9ydC0+cGVlcl9jdHJsLm1vZGVtX3NpZ25hbCAmIE1PREVNX1NJR05BTF9EVFJEU1IpID8gMSA6IDApLAotICAgICAgKChwX3BvcnQtPnBlZXJfY3RybC5tb2RlbV9zaWduYWwgJiBNT0RFTV9TSUdOQUxfUlRTQ1RTKSA/IDEgOiAwKSwKLSAgICAgICgocF9wb3J0LT5wZWVyX2N0cmwubW9kZW1fc2lnbmFsICYgTU9ERU1fU0lHTkFMX1JJKSA/IDEgOiAwKSwKLSAgICAgICgocF9wb3J0LT5wZWVyX2N0cmwubW9kZW1fc2lnbmFsICYgTU9ERU1fU0lHTkFMX0RDRCkgPyAxIDogMCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9Db250cm9sQ25mCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSRkNPTU0gbGF5ZXIgd2hlbgotICogICAgICAgICAgICAgICAgICBwZWVyIGFja25vd2xlZ2VzIGNoYW5nZSBvZiB0aGUgbW9kZW0gc2lnbmFscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX0NvbnRyb2xDbmYodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksCi0gICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0UE9SVF9DVFJMKiBwX3BhcnMpIHsKLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLSAgdWludDMyX3QgZXZlbnQgPSAwOwotCi0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiUE9SVF9Db250cm9sQ25mIik7Ci0KLSAgaWYgKCFwX3BvcnQpIHJldHVybjsKLQotICBpZiAoIShwX3BvcnQtPnBvcnRfY3RybCAmIFBPUlRfQ1RSTF9SRVFfQ09ORklSTUVEKSkgewotICAgIHBfcG9ydC0+cG9ydF9jdHJsIHw9IFBPUlRfQ1RSTF9SRVFfQ09ORklSTUVEOwotCi0gICAgaWYgKHBfcG9ydC0+cG9ydF9jdHJsICYgUE9SVF9DVFJMX0lORF9SRUNFSVZFRCkKLSAgICAgIGV2ZW50ID0gKHBfcG9ydC0+ZXZfbWFzayAmIFBPUlRfRVZfQ09OTkVDVEVEKTsKLSAgfQotCi0gIGlmIChwX3BvcnQtPnBvcnRfY3RybCAmIFBPUlRfQ1RSTF9JTkRfUkVDRUlWRUQpIHsKLSAgICBldmVudCB8PSBwb3J0X3JmY19zZW5kX3R4X2RhdGEocF9wb3J0KTsKLSAgfQotCi0gIC8qIGV4ZWN1dGUgY2FsbCBiYWNrIGZ1bmN0aW9uIG9ubHkgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJlZ2lzdGVyZWQgZm9yIGV2ZW50cwotICAgKi8KLSAgaWYgKGV2ZW50ICYmIHBfcG9ydC0+cF9jYWxsYmFjaykgKHBfcG9ydC0+cF9jYWxsYmFjaykoZXZlbnQsIHBfcG9ydC0+aGFuZGxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfTGluZVN0YXR1c0luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgUkZDT01NIGxheWVyIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgcGVlciBpbmRpY2F0ZXMgY2hhbmdlIGluIHRoZSBsaW5lIHN0YXR1cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBPUlRfTGluZVN0YXR1c0luZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgdWludDhfdCBsaW5lX3N0YXR1cykgewotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpOwotICB1aW50MzJfdCBldmVudCA9IDA7Ci0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJQT1JUX0xpbmVTdGF0dXNJbmQiKTsKLQotICBpZiAoIXBfcG9ydCkgcmV0dXJuOwotCi0gIHBfcG9ydC0+bGluZV9zdGF0dXMgfD0gbGluZV9zdGF0dXM7Ci0KLSAgaWYgKGxpbmVfc3RhdHVzICYgUE9SVF9FUlJfT1ZFUlJVTikgZXZlbnQgfD0gUE9SVF9FVl9PVkVSUlVOOwotCi0gIGlmIChsaW5lX3N0YXR1cyAmIFBPUlRfRVJSX0JSRUFLKSBldmVudCB8PSBQT1JUX0VWX0JSRUFLOwotCi0gIGlmIChsaW5lX3N0YXR1cyAmIH4oUE9SVF9FUlJfT1ZFUlJVTiB8IFBPUlRfRVJSX0JSRUFLKSkgZXZlbnQgfD0gUE9SVF9FVl9FUlI7Ci0KLSAgaWYgKChwX3BvcnQtPnBfY2FsbGJhY2sgIT0gTlVMTCkgJiYgKHBfcG9ydC0+ZXZfbWFzayAmIGV2ZW50KSkKLSAgICBwX3BvcnQtPnBfY2FsbGJhY2soKHBfcG9ydC0+ZXZfbWFzayAmIGV2ZW50KSwgcF9wb3J0LT5oYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUE9SVF9EbGNSZWxlYXNlSW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSRkNPTU0gbGF5ZXIgd2hlbgotICogICAgICAgICAgICAgICAgICBETEMgY29ubmVjdGlvbiBpcyByZWxlYXNlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX0RsY1JlbGVhc2VJbmQodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2kpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBkbGNpPSIgPDwgc3RkOjp0b19zdHJpbmcoZGxjaSkKLSAgICAgICAgICA8PCAiLCBiZF9hZGRyPSIgPDwgcF9tY2ItPmJkX2FkZHI7Ci0gIHRQT1JUKiBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0gIGlmICghcF9wb3J0KSByZXR1cm47Ci0gIHBvcnRfcmZjX2Nsb3NlZChwX3BvcnQsIFBPUlRfQ0xPU0VEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfQ2xvc2VJbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSBsYXllciB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVyIGNvbm5lY3Rpb24gaXMgcmVsZWFzZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE9SVF9DbG9zZUluZCh0UkZDX01DQiogcF9tY2IpIHsKLSAgdFBPUlQqIHBfcG9ydDsKLSAgaW50IGk7Ci0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJQT1JUX0Nsb3NlSW5kIik7Ci0KLSAgcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbMF07Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfUkZDX1BPUlRTOyBpKyssIHBfcG9ydCsrKSB7Ci0gICAgaWYgKHBfcG9ydC0+cmZjLnBfbWNiID09IHBfbWNiKSB7Ci0gICAgICBwb3J0X3JmY19jbG9zZWQocF9wb3J0LCBQT1JUX1BFRVJfQ09OTkVDVElPTl9GQUlMRUQpOwotICAgIH0KLSAgfQotICByZmNfcmVsZWFzZV9tdWx0aXBsZXhlcl9jaGFubmVsKHBfbWNiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBvcnRfVGltZU91dENsb3NlTXV4Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIFJGQ09NTSB0aW1lc291dCBvbiBhIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgYXMgYSByZXN1bHQgbXVsdGlwbGV4ZXIgY29ubmVjdGlvbiBpcyBjbG9zZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUG9ydF9UaW1lT3V0Q2xvc2VNdXgodFJGQ19NQ0IqIHBfbWNiKSB7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0gIGludCBpOwotCi0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiUG9ydF9UaW1lT3V0Q2xvc2VNdXgiKTsKLQotICBwX3BvcnQgPSAmcmZjX2NiLnBvcnQucG9ydFswXTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9SRkNfUE9SVFM7IGkrKywgcF9wb3J0KyspIHsKLSAgICBpZiAocF9wb3J0LT5yZmMucF9tY2IgPT0gcF9tY2IpIHsKLSAgICAgIHBvcnRfcmZjX2Nsb3NlZChwX3BvcnQsIFBPUlRfUEVFUl9USU1FT1VUKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFBPUlRfRGF0YUluZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgUkZDT01NIGxheWVyIHdoZW4gZGF0YQotICogICAgICAgICAgICAgICAgICBidWZmZXIgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQT1JUX0RhdGFJbmQodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIEJUX0hEUiogcF9idWYpIHsKLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLSAgdWludDhfdCByeF9jaGFyMTsKLSAgdWludDMyX3QgZXZlbnRzID0gMDsKLSAgdWludDhfdCogcDsKLSAgaW50IGk7Ci0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKAotICAgICAgIlBPUlRfRGF0YUluZCB3aXRoIGRhdGEgbGVuZ3RoICVkLCBwX21jYjolcCxwX3BvcnQ6JXAsZGxjaTolZCIsCi0gICAgICBwX2J1Zi0+bGVuLCBwX21jYiwgcF9wb3J0LCBkbGNpKTsKLSAgaWYgKCFwX3BvcnQpIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIElmIGNsaWVudCByZWdpc3RlcmVkIGNhbGxvdXQgY2FsbGJhY2sgd2l0aCBmbG93IGNvbnRyb2wgd2UgY2FuIGp1c3QgZGVsaXZlcgotICAgKiByZWNlaXZlIGRhdGEgKi8KLSAgaWYgKHBfcG9ydC0+cF9kYXRhX2NvX2NhbGxiYWNrKSB7Ci0gICAgLyogQW5vdGhlciBwYWNrZXQgaXMgZGVsaXZlcmVkIHRvIHVzZXIuICBTZW5kIGNyZWRpdHMgdG8gcGVlciBpZiByZXF1aXJlZCAqLwotICAgIGlmIChwX3BvcnQtPnBfZGF0YV9jb19jYWxsYmFjayhwX3BvcnQtPmhhbmRsZSwgKHVpbnQ4X3QqKXBfYnVmLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9DT19DQUxMQkFDS19UWVBFX0lOQ09NSU5HKSkgewotICAgICAgcG9ydF9mbG93X2NvbnRyb2xfcGVlcihwX3BvcnQsIHRydWUsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwb3J0X2Zsb3dfY29udHJvbF9wZWVyKHBfcG9ydCwgZmFsc2UsIDApOwotICAgIH0KLSAgICAvLyBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIElmIGNsaWVudCByZWdpc3RlcmVkIGNhbGxiYWNrIHdlIGNhbiBqdXN0IGRlbGl2ZXIgcmVjZWl2ZSBkYXRhICovCi0gIGlmIChwX3BvcnQtPnBfZGF0YV9jYWxsYmFjaykgewotICAgIC8qIEFub3RoZXIgcGFja2V0IGlzIGRlbGl2ZXJlZCB0byB1c2VyLiAgU2VuZCBjcmVkaXRzIHRvIHBlZXIgaWYgcmVxdWlyZWQgKi8KLSAgICBwb3J0X2Zsb3dfY29udHJvbF9wZWVyKHBfcG9ydCwgdHJ1ZSwgMSk7Ci0gICAgcF9wb3J0LT5wX2RhdGFfY2FsbGJhY2socF9wb3J0LT5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwgcF9idWYtPmxlbik7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotICAvKiBDaGVjayBpZiByeCBxdWV1ZSBleGNlZWRzIHRoZSBsaW1pdCAqLwotICBpZiAoKHBfcG9ydC0+cngucXVldWVfc2l6ZSArIHBfYnVmLT5sZW4gPiBQT1JUX1JYX0NSSVRJQ0FMX1dNKSB8fAotICAgICAgKGZpeGVkX3F1ZXVlX2xlbmd0aChwX3BvcnQtPnJ4LnF1ZXVlKSArIDEgPiBwX3BvcnQtPnJ4X2J1Zl9jcml0aWNhbCkpIHsKLSAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfRGF0YUluZC4gQnVmZmVyIG92ZXIgcnVuLiBEcm9wcGluZyB0aGUgYnVmZmVyIik7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIFJGQ09NTV9MaW5lU3RhdHVzUmVxKHBfbWNiLCBkbGNpLCBMSU5FX1NUQVRVU19PVkVSUlVOKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogSWYgdXNlciByZWdpc3RlcmVkIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gYSBwYXJ0aWN1bGFyIGJ5dGUgaXMgKi8KLSAgLyogcmVjZWl2ZWQgd2UgbWFzdCBjaGVjayBhbGwgcmVjZWl2ZWQgYnl0ZXMgKi8KLSAgaWYgKCgocnhfY2hhcjEgPSBwX3BvcnQtPnVzZXJfcG9ydF9wYXJzLnJ4X2NoYXIxKSAhPSAwKSAmJgotICAgICAgKHBfcG9ydC0+ZXZfbWFzayAmIFBPUlRfRVZfUlhGTEFHKSkgewotICAgIGZvciAoaSA9IDAsIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OyBpIDwgcF9idWYtPmxlbjsKLSAgICAgICAgIGkrKykgewotICAgICAgaWYgKCpwKysgPT0gcnhfY2hhcjEpIHsKLSAgICAgICAgZXZlbnRzIHw9IFBPUlRfRVZfUlhGTEFHOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBtdXRleF9nbG9iYWxfbG9jaygpOwotCi0gIGZpeGVkX3F1ZXVlX2VucXVldWUocF9wb3J0LT5yeC5xdWV1ZSwgcF9idWYpOwotICBwX3BvcnQtPnJ4LnF1ZXVlX3NpemUgKz0gcF9idWYtPmxlbjsKLQotICBtdXRleF9nbG9iYWxfdW5sb2NrKCk7Ci0KLSAgLyogcGVyZm9ybSBmbG93IGNvbnRyb2wgcHJvY2VkdXJlcyBpZiBuZWNlc3NhcnkgKi8KLSAgcG9ydF9mbG93X2NvbnRyb2xfcGVlcihwX3BvcnQsIGZhbHNlLCAwKTsKLQotICAvKiBJZiB1c2VyIGluZGljYXRlZCBmbG93IGNvbnRyb2wgY2FuIG5vdCBkZWxpdmVyIGFueSBub3RpZmljYXRpb25zIHRvIHRoZW0gKi8KLSAgaWYgKHBfcG9ydC0+cngudXNlcl9mYykgewotICAgIGlmIChldmVudHMgJiBQT1JUX0VWX1JYRkxBRykgewotICAgICAgcF9wb3J0LT5yeF9mbGFnX2V2X3BlbmRpbmcgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBldmVudHMgfD0gUE9SVF9FVl9SWENIQVI7Ci0KLSAgLyogTWFzayBvdXQgYWxsIGV2ZW50cyB0aGF0IGFyZSBub3Qgb2YgaW50ZXJlc3QgdG8gdXNlciAqLwotICBldmVudHMgJj0gcF9wb3J0LT5ldl9tYXNrOwotCi0gIGlmIChwX3BvcnQtPnBfY2FsbGJhY2sgJiYgZXZlbnRzKSBwX3BvcnQtPnBfY2FsbGJhY2soZXZlbnRzLCBwX3BvcnQtPmhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBQT1JUX0Zsb3dJbmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIFJGQ09NTSBsYXllciBvbiB0aGUgZmxvdwotICogICAgICAgICAgICAgICAgICBjb250cm9sIHNpZ25hbCBjaGFuZ2UuICBQcm9wYWdhdGUgY2hhbmdlIHRvIHRoZSB1c2VyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBPUlRfRmxvd0luZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBlbmFibGVfZGF0YSkgewotICB0UE9SVCogcF9wb3J0ID0gKHRQT1JUKilOVUxMOwotICB1aW50MzJfdCBldmVudHMgPSAwOwotICBpbnQgaTsKLQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfRmxvd0luZCBmYzolZCIsIGVuYWJsZV9kYXRhKTsKLQotICBpZiAoZGxjaSA9PSAwKSB7Ci0gICAgcF9tY2ItPnBlZXJfcmVhZHkgPSBlbmFibGVfZGF0YTsKLSAgfSBlbHNlIHsKLSAgICBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0gICAgaWYgKHBfcG9ydCA9PSBOVUxMKSByZXR1cm47Ci0KLSAgICBwX3BvcnQtPnR4LnBlZXJfZmMgPSAhZW5hYmxlX2RhdGE7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JGQ19QT1JUUzsgaSsrKSB7Ci0gICAgLyogSWYgRExDSSBpcyAwIGV2ZW50IGFwcGxpZXMgdG8gYWxsIHBvcnRzICovCi0gICAgaWYgKGRsY2kgPT0gMCkgewotICAgICAgcF9wb3J0ID0gJnJmY19jYi5wb3J0LnBvcnRbaV07Ci0gICAgICBpZiAoIXBfcG9ydC0+aW5fdXNlIHx8IChwX3BvcnQtPnJmYy5wX21jYiAhPSBwX21jYikgfHwKLSAgICAgICAgICAocF9wb3J0LT5yZmMuc3RhdGUgIT0gUkZDX1NUQVRFX09QRU5FRCkpCi0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBldmVudHMgPSAwOwotCi0gICAgLyogQ2hlY2sgaWYgZmxvdyBvZiBkYXRhIGlzIHN0aWxsIGVuYWJsZWQgKi8KLSAgICBldmVudHMgfD0gcG9ydF9mbG93X2NvbnRyb2xfdXNlcihwX3BvcnQpOwotCi0gICAgLyogQ2hlY2sgaWYgZGF0YSBjYW4gYmUgc2VudCBhbmQgc2VuZCBpdCAqLwotICAgIGV2ZW50cyB8PSBwb3J0X3JmY19zZW5kX3R4X2RhdGEocF9wb3J0KTsKLQotICAgIC8qIE1hc2sgb3V0IGFsbCBldmVudHMgdGhhdCBhcmUgbm90IG9mIGludGVyZXN0IHRvIHVzZXIgKi8KLSAgICBldmVudHMgJj0gcF9wb3J0LT5ldl9tYXNrOwotCi0gICAgLyogU2VuZCBldmVudCB0byB0aGUgYXBwbGljYXRpb24gKi8KLSAgICBpZiAocF9wb3J0LT5wX2NhbGxiYWNrICYmIGV2ZW50cykKLSAgICAgIChwX3BvcnQtPnBfY2FsbGJhY2spKGV2ZW50cywgcF9wb3J0LT5oYW5kbGUpOwotCi0gICAgLyogSWYgRExDSSBpcyBub3QgMCBldmVudCBhcHBsaWVzIHRvIG9uZSBwb3J0IG9ubHkgKi8KLSAgICBpZiAoZGxjaSAhPSAwKSBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9yZmNfc2VuZF90eF9kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIHdoZW4gZm9yd2FyZCBkYXRhIGNhbiBiZSBzZW50IHRvIHRoZSBwZWVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQzMl90IHBvcnRfcmZjX3NlbmRfdHhfZGF0YSh0UE9SVCogcF9wb3J0KSB7Ci0gIHVpbnQzMl90IGV2ZW50cyA9IDA7Ci0gIEJUX0hEUiogcF9idWY7Ci0KLSAgLyogaWYgdGhlcmUgaXMgZGF0YSB0byBiZSBzZW50ICovCi0gIGlmIChwX3BvcnQtPnR4LnF1ZXVlX3NpemUgPiAwKSB7Ci0gICAgLyogd2hpbGUgdGhlIHJmY29tbSBwZWVyIGlzIG5vdCBmbG93IGNvbnRyb2xsaW5nIHVzLCBhbmQgcGVlciBpcyByZWFkeSAqLwotICAgIHdoaWxlICghcF9wb3J0LT50eC5wZWVyX2ZjICYmIHBfcG9ydC0+cmZjLnBfbWNiICYmCi0gICAgICAgICAgIHBfcG9ydC0+cmZjLnBfbWNiLT5wZWVyX3JlYWR5KSB7Ci0gICAgICAvKiBnZXQgZGF0YSBmcm9tIHR4IHF1ZXVlIGFuZCBzZW5kIGl0ICovCi0gICAgICBtdXRleF9nbG9iYWxfbG9jaygpOwotCi0gICAgICBwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfcG9ydC0+dHgucXVldWUpOwotICAgICAgaWYgKHBfYnVmICE9IE5VTEwpIHsKLSAgICAgICAgcF9wb3J0LT50eC5xdWV1ZV9zaXplIC09IHBfYnVmLT5sZW47Ci0KLSAgICAgICAgbXV0ZXhfZ2xvYmFsX3VubG9jaygpOwotCi0gICAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygiU2VuZGluZyBSRkNPTU1fRGF0YVJlcSB0eC5xdWV1ZV9zaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+dHgucXVldWVfc2l6ZSk7Ci0KLSAgICAgICAgUkZDT01NX0RhdGFSZXEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgcF9idWYpOwotCi0gICAgICAgIGV2ZW50cyB8PSBQT1JUX0VWX1RYQ0hBUjsKLQotICAgICAgICBpZiAocF9wb3J0LT50eC5xdWV1ZV9zaXplID09IDApIHsKLSAgICAgICAgICBldmVudHMgfD0gUE9SVF9FVl9UWEVNUFRZOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBxdWV1ZSBpcyBlbXB0eS0tIGFsbCBkYXRhIHNlbnQgKi8KLSAgICAgIGVsc2UgewotICAgICAgICBtdXRleF9nbG9iYWxfdW5sb2NrKCk7Ci0KLSAgICAgICAgZXZlbnRzIHw9IFBPUlRfRVZfVFhFTVBUWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIElmIHdlIGZsb3cgY29udHJvbGxlZCB1c2VyIGJhc2VkIG9uIHRoZSBxdWV1ZSBzaXplIGVuYWJsZSBkYXRhIGFnYWluICovCi0gICAgZXZlbnRzIHw9IHBvcnRfZmxvd19jb250cm9sX3VzZXIocF9wb3J0KTsKLSAgfQotICByZXR1cm4gKGV2ZW50cyAmIHBfcG9ydC0+ZXZfbWFzayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwb3J0X3JmY19jbG9zZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCB3aGVuIFJGQ09NTSBwb3J0IGlzIGNsb3NlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHBvcnRfcmZjX2Nsb3NlZCh0UE9SVCogcF9wb3J0LCB1aW50OF90IHJlcykgewotICB1aW50OF90IG9sZF9zaWduYWxzOwotICB1aW50MzJfdCBldmVudHMgPSAwOwotICB0UkZDX01DQiogcF9tY2IgPSBwX3BvcnQtPnJmYy5wX21jYjsKLQotICBpZiAoKHBfcG9ydC0+c3RhdGUgPT0gUE9SVF9TVEFURV9PUEVOSU5HKSAmJiAocF9wb3J0LT5pc19zZXJ2ZXIpKSB7Ci0gICAgLyogVGhlIHNlcnZlciBzaWRlIHdhcyBub3QgaW5mb3JtZWQgdGhhdCBjb25uZWN0aW9uIGlzIHVwLCBpZ25vcmUgKi8KLSAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygicG9ydF9yZmNfY2xvc2VkIGluIE9QRU5JTkcgc3RhdGUgaWdub3JlZCIpOwotCi0gICAgcmZjX3BvcnRfdGltZXJfc3RvcChwX3BvcnQpOwotICAgIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX0NMT1NFRDsKLQotICAgIGlmIChwX21jYikgewotICAgICAgcF9tY2ItPnBvcnRfaGFuZGxlc1twX3BvcnQtPmRsY2ldID0gMDsKLQotICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgcG9ydHMgb3BlbmVkIG9uIHRoaXMgTUNCIHJlbGVhc2UgaXQgKi8KLSAgICAgIHJmY19jaGVja19tY2JfYWN0aXZlKHBfbWNiKTsKLSAgICAgIHBfcG9ydC0+cmZjLnBfbWNiID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBOZWVkIHRvIHJlc3RvcmUgRExDSSB0byBsaXN0ZW5pbmcgc3RhdGUKLSAgICAgKiBpZiB0aGUgc2VydmVyIHdhcyBvbiB0aGUgaW5pdGlhdGluZyBSRkMKLSAgICAgKi8KLSAgICBwX3BvcnQtPmRsY2kgJj0gMHhmZTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICgocF9wb3J0LT5zdGF0ZSAhPSBQT1JUX1NUQVRFX0NMT1NJTkcpICYmCi0gICAgICAocF9wb3J0LT5zdGF0ZSAhPSBQT1JUX1NUQVRFX0NMT1NFRCkpIHsKLSAgICBwX3BvcnQtPmxpbmVfc3RhdHVzIHw9IExJTkVfU1RBVFVTX0ZBSUxFRDsKLQotICAgIG9sZF9zaWduYWxzID0gcF9wb3J0LT5wZWVyX2N0cmwubW9kZW1fc2lnbmFsOwotCi0gICAgcF9wb3J0LT5wZWVyX2N0cmwubW9kZW1fc2lnbmFsICY9Ci0gICAgICAgIH4oUE9SVF9EVFJEU1JfT04gfCBQT1JUX0NUU1JUU19PTiB8IFBPUlRfRENEX09OKTsKLQotICAgIGV2ZW50cyB8PSBwb3J0X2dldF9zaWduYWxfY2hhbmdlcyhwX3BvcnQsIG9sZF9zaWduYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPnBlZXJfY3RybC5tb2RlbV9zaWduYWwpOwotCi0gICAgaWYgKHBfcG9ydC0+ZXZfbWFzayAmIFBPUlRfRVZfQ09OTkVDVF9FUlIpIGV2ZW50cyB8PSBQT1JUX0VWX0NPTk5FQ1RfRVJSOwotICB9Ci0KLSAgaWYgKChwX3BvcnQtPnBfY2FsbGJhY2sgIT0gTlVMTCkgJiYgZXZlbnRzKQotICAgIHBfcG9ydC0+cF9jYWxsYmFjayhldmVudHMsIHBfcG9ydC0+aGFuZGxlKTsKLQotICBpZiAocF9wb3J0LT5wX21nbXRfY2FsbGJhY2spIHBfcG9ydC0+cF9tZ210X2NhbGxiYWNrKHJlcywgcF9wb3J0LT5oYW5kbGUpOwotCi0gIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX0NMT1NFRDsKLQotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogUkZDT01NIGNvbm5lY3Rpb24gY2xvc2VkLCBpbmRleD0iCi0gICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhwX3BvcnQtPmhhbmRsZSkKLSAgICAgICAgICAgIDw8ICIsIHN0YXRlPSIgPDwgc3RkOjp0b19zdHJpbmcocF9wb3J0LT5zdGF0ZSkKLSAgICAgICAgICAgIDw8ICIsIHJlYXNvbj0iIDw8IFBPUlRfR2V0UmVzdWx0U3RyaW5nKHJlcykgPDwgIlsiCi0gICAgICAgICAgICA8PCBzdGQ6OnRvX3N0cmluZyhyZXMpIDw8ICJdLCBVVUlEPSIgPDwgbG9naGV4KHBfcG9ydC0+dXVpZCkKLSAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX3BvcnQtPmJkX2FkZHIKLSAgICAgICAgICAgIDw8ICIsIGlzX3NlcnZlcj0iIDw8IHBfcG9ydC0+aXNfc2VydmVyOwotCi0gIHBvcnRfcmVsZWFzZV9wb3J0KHBfcG9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwb3J0X2dldF9jcmVkaXRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIGNyZWRpdHMuCi0gKiAgICAgICAgICAgICAgICAgIEFkanVzdCBtYXggbnVtYmVyIG9mIHJ4IGNyZWRpdHMgYmFzZWQgb24gbmVnb3RpYXRlZCBNVFUuCi0gKiAgICAgICAgICAgICAgICAgIENoZWNrIG1heCBhbGxvd2VkIG51bSBvZiBieXRlcywgbWF4IGFsbG93ZWQgbnVtIGJ1ZmZlcnMsCi0gKiAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBsZXNzIHRoZW4gMjU1Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcG9ydF9nZXRfY3JlZGl0cyh0UE9SVCogcF9wb3J0LCB1aW50OF90IGspIHsKLSAgcF9wb3J0LT5jcmVkaXRfdHggPSBrOwotICBpZiAocF9wb3J0LT5jcmVkaXRfdHggPT0gMCkgcF9wb3J0LT50eC5wZWVyX2ZjID0gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3JmY29tbS9wb3J0X3V0aWxzLmNjIGIvc3RhY2svcmZjb21tL3BvcnRfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmJhZjkuLjAwMDAwMDAKLS0tIGEvc3RhY2svcmZjb21tL3BvcnRfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBQb3J0IEVtdWxhdGlvbiBlbnRpdHkgdXRpbGl0aWVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcG9ydF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcmZjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0YXRpYyBjb25zdCB0UE9SVF9TVEFURSBkZWZhdWx0X3BvcnRfcGFycyA9IHsKLSAgICBQT1JUX0JBVURfUkFURV85NjAwLAotICAgIFBPUlRfOF9CSVRTLAotICAgIFBPUlRfT05FU1RPUEJJVCwKLSAgICBQT1JUX1BBUklUWV9OTywKLSAgICBQT1JUX09ERF9QQVJJVFksCi0gICAgUE9SVF9GQ19PRkYsCi0gICAgMCwgLyogTm8gcnhfY2hhciAqLwotICAgIFBPUlRfWE9OX0RDMSwKLSAgICBQT1JUX1hPRkZfREMzLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBvcnRfYWxsb2NhdGVfcG9ydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgTG9vayB0aHJvdWdoIHRoZSBQb3J0IENvbnRyb2wgQmxvY2tzIGZvciBhIGZyZWUgb25lLiAgTm90ZQotICogICAgICAgICAgICAgICAgICB0aGF0IG9uZSBzZXJ2ZXIgY2FuIG9wZW4gc2V2ZXJhbCBwb3J0cyB3aXRoIHRoZSBzYW1lIFNDTgotICogICAgICAgICAgICAgICAgICBpZiBpdCBjYW4gc3VwcG9ydCBzaW11bHRlbmVvdXMgcmVxdWVzdHMgZnJvbSBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICAgICAgY2xpZW50cy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIFBPUlQgb3IgTlVMTCBpZiBub3QgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFBPUlQqIHBvcnRfYWxsb2NhdGVfcG9ydCh1aW50OF90IGRsY2ksIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdWludDhfdCBwb3J0X2luZGV4ID0gcmZjX2NiLnJmYy5sYXN0X3BvcnRfaW5kZXggKyBzdGF0aWNfY2FzdDx1aW50OF90PigxKTsKLSAgLy8gTG9vcCBhdCBtb3N0IE1BWF9SRkNfUE9SVFMgaXRlbXMKLSAgZm9yIChpbnQgbG9vcF9jb3VudGVyID0gMDsgbG9vcF9jb3VudGVyIDwgTUFYX1JGQ19QT1JUUzsKLSAgICAgICBsb29wX2NvdW50ZXIrKywgcG9ydF9pbmRleCsrKSB7Ci0gICAgaWYgKHBvcnRfaW5kZXggPj0gTUFYX1JGQ19QT1JUUykgewotICAgICAgcG9ydF9pbmRleCA9IDA7Ci0gICAgfQotICAgIHRQT1JUKiBwX3BvcnQgPSAmcmZjX2NiLnBvcnQucG9ydFtwb3J0X2luZGV4XTsKLSAgICBpZiAoIXBfcG9ydC0+aW5fdXNlKSB7Ci0gICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBhbHJlYWR5IGNhbGxlZCBwb3J0X3JlbGVhc2VfcG9ydCBvbiB0aGlzCi0gICAgICBtZW1zZXQocF9wb3J0LCAwLCBzaXplb2YodFBPUlQpKTsKLSAgICAgIHBfcG9ydC0+aW5fdXNlID0gdHJ1ZTsKLSAgICAgIC8vIGhhbmRsZSBpcyBhIHBvcnQgaGFuZGxlIHN0YXJ0aW5nIGZyb20gMQotICAgICAgcF9wb3J0LT5oYW5kbGUgPSBwb3J0X2luZGV4ICsgc3RhdGljX2Nhc3Q8dWludDhfdD4oMSk7Ci0gICAgICAvLyBEdXJpbmcgdGhlIG9wZW4gc2V0IGRlZmF1bHQgc3RhdGUgZm9yIHRoZSBwb3J0IGNvbm5lY3Rpb24KLSAgICAgIHBvcnRfc2V0X2RlZmF1bHRzKHBfcG9ydCk7Ci0gICAgICBwX3BvcnQtPnJmYy5wb3J0X3RpbWVyID0gYWxhcm1fbmV3KCJyZmNvbW1fcG9ydC5wb3J0X3RpbWVyIik7Ci0gICAgICBwX3BvcnQtPmRsY2kgPSBkbGNpOwotICAgICAgcF9wb3J0LT5iZF9hZGRyID0gYmRfYWRkcjsKLSAgICAgIHJmY19jYi5yZmMubGFzdF9wb3J0X2luZGV4ID0gcG9ydF9pbmRleDsKLSAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiJXM6IHJmY19jYi5wb3J0LnBvcnRbJWRdOiVwIGNob3NlbiwgIgotICAgICAgICAgICJsYXN0X3BvcnRfaW5kZXg6JWQsIGJkX2FkZHI9JXMiLAotICAgICAgICAgIF9fZnVuY19fLCBwb3J0X2luZGV4LCBwX3BvcnQsIHJmY19jYi5yZmMubGFzdF9wb3J0X2luZGV4LAotICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBwX3BvcnQ7Ci0gICAgfQotICB9Ci0gIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBydW5uaW5nIG91dCBvZiBmcmVlIHBvcnRzIGZvciBkbGNpICIKLSAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGRsY2kpIDw8ICIsIGJkX2FkZHIgIiA8PCBiZF9hZGRyOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBvcnRfc2V0X2RlZmF1bHRzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTZXQgZGVmdWFsdCBwb3J0IHBhcmFtZXRlcnMKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcG9ydF9zZXRfZGVmYXVsdHModFBPUlQqIHBfcG9ydCkgewotICBwX3BvcnQtPmV2X21hc2sgPSAwOwotICBwX3BvcnQtPnBfY2FsbGJhY2sgPSBudWxscHRyOwotICBwX3BvcnQtPnBvcnRfY3RybCA9IDA7Ci0gIHBfcG9ydC0+ZXJyb3IgPSAwOwotICBwX3BvcnQtPmxpbmVfc3RhdHVzID0gMDsKLSAgcF9wb3J0LT5yeF9mbGFnX2V2X3BlbmRpbmcgPSBmYWxzZTsKLSAgcF9wb3J0LT5wZWVyX210dSA9IFJGQ09NTV9ERUZBVUxUX01UVTsKLQotICBwX3BvcnQtPnVzZXJfcG9ydF9wYXJzID0gZGVmYXVsdF9wb3J0X3BhcnM7Ci0gIHBfcG9ydC0+cGVlcl9wb3J0X3BhcnMgPSBkZWZhdWx0X3BvcnRfcGFyczsKLQotICBwX3BvcnQtPmNyZWRpdF90eCA9IDA7Ci0gIHBfcG9ydC0+Y3JlZGl0X3J4ID0gMDsKLQotICBtZW1zZXQoJnBfcG9ydC0+bG9jYWxfY3RybCwgMCwgc2l6ZW9mKHBfcG9ydC0+bG9jYWxfY3RybCkpOwotICBtZW1zZXQoJnBfcG9ydC0+cGVlcl9jdHJsLCAwLCBzaXplb2YocF9wb3J0LT5wZWVyX2N0cmwpKTsKLSAgbWVtc2V0KCZwX3BvcnQtPnJ4LCAwLCBzaXplb2YocF9wb3J0LT5yeCkpOwotICBtZW1zZXQoJnBfcG9ydC0+dHgsIDAsIHNpemVvZihwX3BvcnQtPnR4KSk7Ci0KLSAgcF9wb3J0LT50eC5xdWV1ZSA9IGZpeGVkX3F1ZXVlX25ldyhTSVpFX01BWCk7Ci0gIHBfcG9ydC0+cngucXVldWUgPSBmaXhlZF9xdWV1ZV9uZXcoU0laRV9NQVgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9zZWxlY3RfbXR1Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTZWxlY3QgTVRVIHdoaWNoIHdpbGwgYmVzdCBzZXJ2ZSBjb25uZWN0aW9uIGZyb20gb3VyCi0gKiAgICAgICAgICAgICAgICAgIHBvaW50IG9mIHZpZXcuCi0gKiAgICAgICAgICAgICAgICAgIElmIG91ciBkZXZpY2UgaXMgMS4yIG9yIGxvd2VyIHdlIGNhbGN1bGF0ZSBob3cgbWFueSBESDVzCi0gKiAgICAgICAgICAgICAgICAgIGZpdCBpbnRvIDEgUkZDT01NIGJ1ZmZlci4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcG9ydF9zZWxlY3RfbXR1KHRQT1JUKiBwX3BvcnQpIHsKLSAgdWludDE2X3QgcGFja2V0X3NpemU7Ci0KLSAgLyogV2lsbCBzZWxlY3QgTVRVIG9ubHkgaWYgYXBwbGljYXRpb24gZGlkIG5vdCBzZXR1cCBzb21ldGhpbmcgKi8KLSAgaWYgKHBfcG9ydC0+bXR1ID09IDApIHsKLSAgICAvKiBmaW5kIHBhY2tldCBzaXplIHdoaWNoIGNvbm5lY3Rpb24gc3VwcG9ydHMgKi8KLSAgICBwYWNrZXRfc2l6ZSA9Ci0gICAgICAgIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLnBlZXIuQlRNX0dldE1heFBhY2tldFNpemUocF9wb3J0LT5iZF9hZGRyKTsKLSAgICBpZiAocGFja2V0X3NpemUgPT0gMCkgewotICAgICAgLyogc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcgKi8KLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBiYWQgcGFja2V0IHNpemUgMCBmb3IiIDw8IHBfcG9ydC0+YmRfYWRkcjsKLSAgICAgIHBfcG9ydC0+bXR1ID0gUkZDT01NX0RFRkFVTFRfTVRVOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBXZSB0cnkgdG8gbmVnb3RpYXRlIE1UVSB0aGF0IGVhY2ggcGFja2V0IGNhbiBiZSBzcGxpdCBpbnRvIHdob2xlCi0gICAgICBudW1iZXIgb2YgbWF4IHBhY2tldHMuICBGb3IgZXhhbXBsZSBpZiBsaW5rIGlzIDEuMiBtYXggcGFja2V0IHNpemUgaXMgMzM5Ci0gICAgICBieXRlcy4KLSAgICAgIEF0IGZpcnN0IGNhbGN1bGF0ZSBob3cgbWFueSB3aG9sZSBwYWNrZXRzIGl0IGlzLiAgTUFYIEwyQ0FQIGlzIDE2OTEgKyA0Ci0gICAgICBvdmVyaGVhZC4KLSAgICAgIDE2OTUsIHRoYXQgd2lsbCBiZSA1IERoNSBwYWNrZXRzLiAgTm93IG1heGltdW0gUkZDT01NIHBhY2tldCBpcwotICAgICAgNSAqIDMzOSA9IDE2OTUuIE1pbnVzIDQgYnl0ZXMgTDJDQVAgaGVhZGVyIDE2OTEuICBNaW51cyBSRkNPTU0gNiBieXRlcwotICAgICAgaGVhZGVyIG92ZXJoZWFkIDE2ODUKLQotICAgICAgRm9yIEVEUiAyLjAgcGFja2V0IHNpemUgaXMgMTAyNy4gIFNvIHdlIGJldHRlciBzZW5kIFJGQ09NTSBwYWNrZXQgYXMgMQotICAgICAgM0RINSBwYWNrZXQKLSAgICAgIDEgKiAxMDI3ID0gMTAyNy4gIE1pbnVzIDQgYnl0ZXMgTDJDQVAgaGVhZGVyIDEwMjMuICBNaW51cyBSRkNPTU0gNiBieXRlcwotICAgICAgaGVhZGVyIG92ZXJoZWFkIDEwMTcgKi8KLSAgICAgIGlmICgoTDJDQVBfTVRVX1NJWkUgKyBMMkNBUF9QS1RfT1ZFUkhFQUQpID49IHBhY2tldF9zaXplKSB7Ci0gICAgICAgIHBfcG9ydC0+bXR1ID0gKChMMkNBUF9NVFVfU0laRSArIEwyQ0FQX1BLVF9PVkVSSEVBRCkgLyBwYWNrZXRfc2l6ZSAqCi0gICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9zaXplKSAtCi0gICAgICAgICAgICAgICAgICAgICAgUkZDT01NX0RBVEFfT1ZFUkhFQUQgLSBMMkNBUF9QS1RfT1ZFUkhFQUQ7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygiJXM6IHNlbGVjdGVkICVkIGJhc2VkIG9uIGNvbm5lY3Rpb24gc3BlZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfcG9ydC0+bXR1KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfcG9ydC0+bXR1ID0gTDJDQVBfTVRVX1NJWkUgLSBSRkNPTU1fREFUQV9PVkVSSEVBRDsKLSAgICAgICAgUkZDT01NX1RSQUNFX0RFQlVHKCIlczogc2VsZWN0ZWQgJWQgYmFzZWQgb24gbDJjYXAgUERVIHNpemUiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+bXR1KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgUkZDT01NX1RSQUNFX0RFQlVHKCIlczogYXBwbGljYXRpb24gc2VsZWN0ZWQgJWQiLCBfX2Z1bmNfXywgcF9wb3J0LT5tdHUpOwotICB9Ci0gIHBfcG9ydC0+Y3JlZGl0X3J4X21heCA9IChQT1JUX1JYX0hJR0hfV00gLyBwX3BvcnQtPm10dSk7Ci0gIGlmIChwX3BvcnQtPmNyZWRpdF9yeF9tYXggPiBQT1JUX1JYX0JVRl9ISUdIX1dNKQotICAgIHBfcG9ydC0+Y3JlZGl0X3J4X21heCA9IFBPUlRfUlhfQlVGX0hJR0hfV007Ci0gIHBfcG9ydC0+Y3JlZGl0X3J4X2xvdyA9IChQT1JUX1JYX0xPV19XTSAvIHBfcG9ydC0+bXR1KTsKLSAgaWYgKHBfcG9ydC0+Y3JlZGl0X3J4X2xvdyA+IFBPUlRfUlhfQlVGX0xPV19XTSkKLSAgICBwX3BvcnQtPmNyZWRpdF9yeF9sb3cgPSBQT1JUX1JYX0JVRl9MT1dfV007Ci0gIHBfcG9ydC0+cnhfYnVmX2NyaXRpY2FsID0gKFBPUlRfUlhfQ1JJVElDQUxfV00gLyBwX3BvcnQtPm10dSk7Ci0gIGlmIChwX3BvcnQtPnJ4X2J1Zl9jcml0aWNhbCA+IFBPUlRfUlhfQlVGX0NSSVRJQ0FMX1dNKQotICAgIHBfcG9ydC0+cnhfYnVmX2NyaXRpY2FsID0gUE9SVF9SWF9CVUZfQ1JJVElDQUxfV007Ci0gIFJGQ09NTV9UUkFDRV9ERUJVRygKLSAgICAgICIlczogY3JlZGl0X3J4X21heCAlZCwgY3JlZGl0X3J4X2xvdyAlZCwgcnhfYnVmX2NyaXRpY2FsICVkIiwgX19mdW5jX18sCi0gICAgICBwX3BvcnQtPmNyZWRpdF9yeF9tYXgsIHBfcG9ydC0+Y3JlZGl0X3J4X2xvdywgcF9wb3J0LT5yeF9idWZfY3JpdGljYWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9yZWxlYXNlX3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlbGVhc2UgcG9ydCBjb250cm9sIGJsb2NrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byB0aGUgUE9SVCBvciBOVUxMIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHBvcnRfcmVsZWFzZV9wb3J0KHRQT1JUKiBwX3BvcnQpIHsKLSAgUkZDT01NX1RSQUNFX0RFQlVHKCIlcyBwX3BvcnQ6ICVwIHN0YXRlOiAlZCBrZWVwX2hhbmRsZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgIHBfcG9ydCwgcF9wb3J0LT5yZmMuc3RhdGUsIHBfcG9ydC0+a2VlcF9wb3J0X2hhbmRsZSk7Ci0KLSAgbXV0ZXhfZ2xvYmFsX2xvY2soKTsKLSAgQlRfSERSKiBwX2J1ZjsKLSAgd2hpbGUgKChwX2J1ZiA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfcG9ydC0+cngucXVldWUpKSAhPQotICAgICAgICAgbnVsbHB0cikgewotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgfQotICBwX3BvcnQtPnJ4LnF1ZXVlX3NpemUgPSAwOwotCi0gIHdoaWxlICgocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX3BvcnQtPnR4LnF1ZXVlKSkgIT0KLSAgICAgICAgIG51bGxwdHIpIHsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gIH0KLSAgcF9wb3J0LT50eC5xdWV1ZV9zaXplID0gMDsKLSAgbXV0ZXhfZ2xvYmFsX3VubG9jaygpOwotCi0gIGFsYXJtX2NhbmNlbChwX3BvcnQtPnJmYy5wb3J0X3RpbWVyKTsKLQotICBwX3BvcnQtPnN0YXRlID0gUE9SVF9TVEFURV9DTE9TRUQ7Ci0KLSAgaWYgKHBfcG9ydC0+cmZjLnN0YXRlID09IFJGQ19TVEFURV9DTE9TRUQpIHsKLSAgICBpZiAocF9wb3J0LT5yZmMucF9tY2IpIHsKLSAgICAgIHBfcG9ydC0+cmZjLnBfbWNiLT5wb3J0X2hhbmRsZXNbcF9wb3J0LT5kbGNpXSA9IDA7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHBvcnRzIG9wZW5lZCBvbiB0aGlzIE1DQiByZWxlYXNlIGl0ICovCi0gICAgICByZmNfY2hlY2tfbWNiX2FjdGl2ZShwX3BvcnQtPnJmYy5wX21jYik7Ci0gICAgfQotCi0gICAgcmZjX3BvcnRfdGltZXJfc3RvcChwX3BvcnQpOwotCi0gICAgbXV0ZXhfZ2xvYmFsX2xvY2soKTsKLSAgICBmaXhlZF9xdWV1ZV9mcmVlKHBfcG9ydC0+dHgucXVldWUsIG51bGxwdHIpOwotICAgIHBfcG9ydC0+dHgucXVldWUgPSBudWxscHRyOwotICAgIGZpeGVkX3F1ZXVlX2ZyZWUocF9wb3J0LT5yeC5xdWV1ZSwgbnVsbHB0cik7Ci0gICAgcF9wb3J0LT5yeC5xdWV1ZSA9IG51bGxwdHI7Ci0gICAgbXV0ZXhfZ2xvYmFsX3VubG9jaygpOwotCi0gICAgaWYgKHBfcG9ydC0+a2VlcF9wb3J0X2hhbmRsZSkgewotICAgICAgUkZDT01NX1RSQUNFX0RFQlVHKCIlcyBSZS1pbml0aWFsaXplIGhhbmRsZTogJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPmhhbmRsZSk7Ci0KLSAgICAgIC8qIHNhdmUgZXZlbnQgbWFzayBhbmQgY2FsbGJhY2sgKi8KLSAgICAgIHVpbnQzMl90IG1hc2sgPSBwX3BvcnQtPmV2X21hc2s7Ci0gICAgICB0UE9SVF9DQUxMQkFDSyogcF9wb3J0X2NiID0gcF9wb3J0LT5wX2NhbGxiYWNrOwotICAgICAgdFBPUlRfU1RBVEUgdXNlcl9wb3J0X3BhcnMgPSBwX3BvcnQtPnVzZXJfcG9ydF9wYXJzOwotCi0gICAgICBwb3J0X3NldF9kZWZhdWx0cyhwX3BvcnQpOwotCi0gICAgICAvKiByZXN0b3JlICovCi0gICAgICBwX3BvcnQtPmV2X21hc2sgPSBtYXNrOwotICAgICAgcF9wb3J0LT5wX2NhbGxiYWNrID0gcF9wb3J0X2NiOwotICAgICAgcF9wb3J0LT51c2VyX3BvcnRfcGFycyA9IHVzZXJfcG9ydF9wYXJzOwotICAgICAgcF9wb3J0LT5tdHUgPSBwX3BvcnQtPmtlZXBfbXR1OwotCi0gICAgICBwX3BvcnQtPnN0YXRlID0gUE9SVF9TVEFURV9PUEVOSU5HOwotICAgICAgcF9wb3J0LT5yZmMucF9tY2IgPSBudWxscHRyOwotICAgICAgaWYgKHBfcG9ydC0+aXNfc2VydmVyKSBwX3BvcnQtPmRsY2kgJj0gMHhmZTsKLQotICAgICAgcF9wb3J0LT5sb2NhbF9jdHJsLm1vZGVtX3NpZ25hbCA9IHBfcG9ydC0+ZGVmYXVsdF9zaWduYWxfc3RhdGU7Ci0gICAgICBwX3BvcnQtPmJkX2FkZHIgPSBSYXdBZGRyZXNzOjprQW55OwotICAgIH0gZWxzZSB7Ci0gICAgICBSRkNPTU1fVFJBQ0VfREVCVUcoIiVzIENsZWFuLXVwIGhhbmRsZTogJWQiLCBfX2Z1bmNfXywgcF9wb3J0LT5oYW5kbGUpOwotICAgICAgYWxhcm1fZnJlZShwX3BvcnQtPnJmYy5wb3J0X3RpbWVyKTsKLSAgICAgIG1lbXNldChwX3BvcnQsIDAsIHNpemVvZih0UE9SVCkpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9maW5kX21jYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgY29ubmVjdGlvbiBleGlzdHMgdG8gZGV2aWNlIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgdGhlIGFkZHJlc3MuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRSRkNfTUNCKiBwb3J0X2ZpbmRfbWNiKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgZm9yICh0UkZDX01DQiYgbWNiIDogcmZjX2NiLnBvcnQucmZjX21jYikgewotICAgIGlmICgobWNiLnN0YXRlICE9IFJGQ19NWF9TVEFURV9JRExFKSAmJiAobWNiLmJkX2FkZHIgPT0gYmRfYWRkcikpIHsKLSAgICAgIC8qIE11bHRpcGxleGVyIGNoYW5uZWwgZm91bmQgZG8gbm90IGNoYW5nZSBhbnl0aGluZyAqLwotICAgICAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBmb3VuZCBiZF9hZGRyPSIgPDwgYmRfYWRkcgotICAgICAgICAgICAgICA8PCAiLCByZmNfbWNiPSIgPDwgJm1jYiA8PCAiLCBsY2lkPSIgPDwgbG9naGV4KG1jYi5sY2lkKTsKLSAgICAgIHJldHVybiAmbWNiOwotICAgIH0KLSAgfQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICI6IG5vdCBmb3VuZCwgYmRfYWRkcjoiIDw8IGJkX2FkZHI7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9maW5kX21jYl9kbGNpX3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgcG9ydCBvbiB0aGUgbXVsdGlwbGV4ZXIgY2hhbm5lbCBiYXNlZCBvbiBETENJLiAgSWYKLSAqICAgICAgICAgICAgICAgICAgdGhpcyBwb3J0IHdpdGggRExDSSBub3QgZm91bmQgdHJ5IHRvIHVzZSBldmVuIERMQ0kuICBUaGlzCi0gKiAgICAgICAgICAgICAgICAgIGlzIGZvciB0aGUgY2FzZSB3aGVuIGNsaWVudCBpcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbiBvbgotICogICAgICAgICAgICAgICAgICBub25lLWluaXRpYXRvciBNQ0IuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBQT1JUIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRQT1JUKiBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSkgewotICBpZiAoIXBfbWNiKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBwX21jYiBpcyBudWxsLCBkbGNpPSIgPDwgc3RkOjp0b19zdHJpbmcoZGxjaSk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBpZiAoZGxjaSA+IFJGQ09NTV9NQVhfRExDSSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBETENJICIgPDwgc3RkOjp0b19zdHJpbmcoZGxjaSkKLSAgICAgICAgICAgICAgICAgPDwgIiBpcyB0b28gbGFyZ2UsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkcgotICAgICAgICAgICAgICAgICA8PCAiLCBwX21jYj0iIDw8IHBfbWNiOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgdWludDhfdCBoYW5kbGUgPSBwX21jYi0+cG9ydF9oYW5kbGVzW2RsY2ldOwotICBpZiAoaGFuZGxlID09IDApIHsKLSAgICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIjogQ2Fubm90IGZpbmQgYWxsb2NhdGVkIFJGQ09NTSBhcHAgcG9ydCBmb3IgRExDSSAiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGRsY2kpIDw8ICIgb24gIiA8PCBwX21jYi0+YmRfYWRkcgotICAgICAgICAgICAgICA8PCAiLCBwX21jYj0iIDw8IHBfbWNiOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiAmcmZjX2NiLnBvcnQucG9ydFtoYW5kbGUgLSAxXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBvcnRfZmluZF9kbGNpX3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgcG9ydCB3aXRoIERMQ0kgbm90IGFzc2lnbmVkIHRvIG11bHRpcGxleGVyIGNoYW5uZWwKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIFBPUlQgb3IgTlVMTCBpZiBub3QgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFBPUlQqIHBvcnRfZmluZF9kbGNpX3BvcnQodWludDhfdCBkbGNpKSB7Ci0gIGZvciAodFBPUlQmIHBvcnQgOiByZmNfY2IucG9ydC5wb3J0KSB7Ci0gICAgaWYgKHBvcnQuaW5fdXNlICYmIChwb3J0LnJmYy5wX21jYiA9PSBudWxscHRyKSkgewotICAgICAgaWYgKHBvcnQuZGxjaSA9PSBkbGNpKSB7Ci0gICAgICAgIHJldHVybiAmcG9ydDsKLSAgICAgIH0gZWxzZSBpZiAoKGRsY2kgJiAweDAxKSAmJiAocG9ydC5kbGNpID09IChkbGNpIC0gMSkpKSB7Ci0gICAgICAgIHBvcnQuZGxjaSsrOwotICAgICAgICByZXR1cm4gJnBvcnQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcG9ydF9maW5kX3BvcnQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEZpbmQgcG9ydCB3aXRoIERMQ0ksIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIFBPUlQgb3IgTlVMTCBpZiBub3QgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFBPUlQqIHBvcnRfZmluZF9wb3J0KHVpbnQ4X3QgZGxjaSwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBmb3IgKHRQT1JUJiBwb3J0IDogcmZjX2NiLnBvcnQucG9ydCkgewotICAgIGlmIChwb3J0LmluX3VzZSAmJiAocG9ydC5kbGNpID09IGRsY2kpICYmIChwb3J0LmJkX2FkZHIgPT0gYmRfYWRkcikpIHsKLSAgICAgIHJldHVybiAmcG9ydDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwb3J0X2Zsb3dfY29udHJvbF91c2VyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayB0aGUgY3VycmVudCB1c2VyIGZsb3cgY29udHJvbCBhbmQgaWYgbmVjZXNzYXJ5IHJldHVybgotICogICAgICAgICAgICAgICAgICBldmVudHMgdG8gYmUgc2VuZCB0byB0aGUgdXNlciBiYXNlZCBvbiB0aGUgdXNlcidzIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICBmbG93IGNvbnRyb2wgdHlwZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGV2ZW50IG1hc2sgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQzMl90IHBvcnRfZmxvd19jb250cm9sX3VzZXIodFBPUlQqIHBfcG9ydCkgewotICB1aW50MzJfdCBldmVudCA9IDA7Ci0KLSAgLyogRmxvdyBjb250cm9sIHRvIHRoZSB1c2VyIGNhbiBiZSBjYXVzZWQgYnkgZmxvdyBjb250cm9sbGluZyBieSB0aGUgcGVlciAqLwotICAvKiAoRmxvd0luZCwgb3IgZmxvdyBjb250cm9sIGJ5IHRoZSBwZWVyIFJGQ09NTSAoRmNvbikgb3IgaW50ZXJuYWxseSBpZiAqLwotICAvKiB0eF9xdWV1ZSBpcyBmdWxsICovCi0gIGJvb2wgZmMgPSBwX3BvcnQtPnR4LnBlZXJfZmMgfHwgIXBfcG9ydC0+cmZjLnBfbWNiIHx8Ci0gICAgICAgICAgICAhcF9wb3J0LT5yZmMucF9tY2ItPnBlZXJfcmVhZHkgfHwKLSAgICAgICAgICAgIChwX3BvcnQtPnR4LnF1ZXVlX3NpemUgPiBQT1JUX1RYX0hJR0hfV00pIHx8Ci0gICAgICAgICAgICAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfcG9ydC0+dHgucXVldWUpID4gUE9SVF9UWF9CVUZfSElHSF9XTSk7Ci0KLSAgaWYgKHBfcG9ydC0+dHgudXNlcl9mYyA9PSBmYykgcmV0dXJuICgwKTsKLQotICBwX3BvcnQtPnR4LnVzZXJfZmMgPSBmYzsKLQotICBpZiAoZmMpCi0gICAgZXZlbnQgPSBQT1JUX0VWX0ZDOwotICBlbHNlCi0gICAgZXZlbnQgPSBQT1JUX0VWX0ZDIHwgUE9SVF9FVl9GQ1M7Ci0KLSAgcmV0dXJuIChldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwb3J0X2dldF9zaWduYWxfY2hhbmdlcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2hlY2sgbW9kZW0gc2lnbmFscyB0aGF0IGhhcyBiZWVuIGNoYW5nZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGV2ZW50IG1hc2sgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQzMl90IHBvcnRfZ2V0X3NpZ25hbF9jaGFuZ2VzKHRQT1JUKiBwX3BvcnQsIHVpbnQ4X3Qgb2xkX3NpZ25hbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNpZ25hbCkgewotICB1aW50OF90IGNoYW5nZWRfc2lnbmFscyA9IChzaWduYWwgXiBvbGRfc2lnbmFscyk7Ci0gIHVpbnQzMl90IGV2ZW50cyA9IDA7Ci0KLSAgaWYgKGNoYW5nZWRfc2lnbmFscyAmIFBPUlRfRFRSRFNSX09OKSB7Ci0gICAgZXZlbnRzIHw9IFBPUlRfRVZfRFNSOwotCi0gICAgaWYgKHNpZ25hbCAmIFBPUlRfRFRSRFNSX09OKSBldmVudHMgfD0gUE9SVF9FVl9EU1JTOwotICB9Ci0KLSAgaWYgKGNoYW5nZWRfc2lnbmFscyAmIFBPUlRfQ1RTUlRTX09OKSB7Ci0gICAgZXZlbnRzIHw9IFBPUlRfRVZfQ1RTOwotCi0gICAgaWYgKHNpZ25hbCAmIFBPUlRfQ1RTUlRTX09OKSBldmVudHMgfD0gUE9SVF9FVl9DVFNTOwotICB9Ci0KLSAgaWYgKGNoYW5nZWRfc2lnbmFscyAmIFBPUlRfUklOR19PTikgZXZlbnRzIHw9IFBPUlRfRVZfUklORzsKLQotICBpZiAoY2hhbmdlZF9zaWduYWxzICYgUE9SVF9EQ0RfT04pIHsKLSAgICBldmVudHMgfD0gUE9SVF9FVl9STFNEOwotCi0gICAgaWYgKHNpZ25hbCAmIFBPUlRfRENEX09OKSBldmVudHMgfD0gUE9SVF9FVl9STFNEUzsKLSAgfQotCi0gIHJldHVybiAocF9wb3J0LT5ldl9tYXNrICYgZXZlbnRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHBvcnRfZmxvd19jb250cm9sX3BlZXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgZmxvdyBjb250cm9sIG1lc3NhZ2VzIHRvIHRoZSBwZWVyIGZvciBib3RoIGVuYWJsaW5nCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBkaXNhYmxpbmcgZmxvdyBjb250cm9sLCBmb3IgYm90aCBjcmVkaXQtYmFzZWQgYW5kCi0gKiAgICAgICAgICAgICAgICAgIFRTIDA3LjEwIGZsb3cgY29udHJvbCBtZWNoYW5pc21zLgotICoKLSAqIFJldHVybnMgICAgICAgICAgbm90aGluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHBvcnRfZmxvd19jb250cm9sX3BlZXIodFBPUlQqIHBfcG9ydCwgYm9vbCBlbmFibGUsIHVpbnQxNl90IGNvdW50KSB7Ci0gIGlmICghcF9wb3J0LT5yZmMucF9tY2IpIHJldHVybjsKLQotICAvKiBJZiB1c2luZyBjcmVkaXQgYmFzZWQgZmxvdyBjb250cm9sICovCi0gIGlmIChwX3BvcnQtPnJmYy5wX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX0NSRURJVCkgewotICAgIC8qIGlmIHdhbnQgdG8gZW5hYmxlIGZsb3cgZnJvbSBwZWVyICovCi0gICAgaWYgKGVuYWJsZSkgewotICAgICAgLyogdXBkYXRlIHJ4IGNyZWRpdHMgKi8KLSAgICAgIGlmIChjb3VudCA+IHBfcG9ydC0+Y3JlZGl0X3J4KSB7Ci0gICAgICAgIHBfcG9ydC0+Y3JlZGl0X3J4ID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfcG9ydC0+Y3JlZGl0X3J4IC09IGNvdW50OwotICAgICAgfQotCi0gICAgICAvKiBJZiBjcmVkaXQgY291bnQgaXMgbGVzcyB0aGFuIGxvdyBjcmVkaXQgd2F0ZXJtYXJrLCBhbmQgdXNlciAqLwotICAgICAgLyogZGlkIG5vdCBmb3JjZSBmbG93IGNvbnRyb2wsIHNlbmQgYSBjcmVkaXQgdXBkYXRlICovCi0gICAgICAvKiBUaGVyZSBtaWdodCBiZSBhIHNwZWNpYWwgY2FzZSB3aGVuIHdlIGp1c3QgYWRqdXN0ZWQgcnhfbWF4ICovCi0gICAgICBpZiAoKHBfcG9ydC0+Y3JlZGl0X3J4IDw9IHBfcG9ydC0+Y3JlZGl0X3J4X2xvdykgJiYgIXBfcG9ydC0+cngudXNlcl9mYyAmJgotICAgICAgICAgIChwX3BvcnQtPmNyZWRpdF9yeF9tYXggPiBwX3BvcnQtPmNyZWRpdF9yeCkpIHsKLSAgICAgICAgcmZjX3NlbmRfY3JlZGl0KHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkocF9wb3J0LT5jcmVkaXRfcnhfbWF4IC0gcF9wb3J0LT5jcmVkaXRfcngpKTsKLQotICAgICAgICBwX3BvcnQtPmNyZWRpdF9yeCA9IHBfcG9ydC0+Y3JlZGl0X3J4X21heDsKLQotICAgICAgICBwX3BvcnQtPnJ4LnBlZXJfZmMgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogZWxzZSB3YW50IHRvIGRpc2FibGUgZmxvdyBmcm9tIHBlZXIgKi8KLSAgICBlbHNlIHsKLSAgICAgIC8qIGlmIGNsaWVudCByZWdpc3RlcmVkIGRhdGEgY2FsbGJhY2ssIGp1c3QgZG8gd2hhdCB0aGV5IHdhbnQgKi8KLSAgICAgIGlmIChwX3BvcnQtPnBfZGF0YV9jYWxsYmFjayB8fCBwX3BvcnQtPnBfZGF0YV9jb19jYWxsYmFjaykgewotICAgICAgICBwX3BvcnQtPnJ4LnBlZXJfZmMgPSB0cnVlOwotICAgICAgfQotICAgICAgLyogaWYgcXVldWUgY291bnQgcmVhY2hlZCBjcmVkaXQgcnggbWF4LCBzZXQgcGVlciBmYyAqLwotICAgICAgZWxzZSBpZiAoZml4ZWRfcXVldWVfbGVuZ3RoKHBfcG9ydC0+cngucXVldWUpID49IHBfcG9ydC0+Y3JlZGl0X3J4X21heCkgewotICAgICAgICBwX3BvcnQtPnJ4LnBlZXJfZmMgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBlbHNlIHVzaW5nIFRTIDA3LjEwIGZsb3cgY29udHJvbCAqLwotICBlbHNlIHsKLSAgICAvKiBpZiB3YW50IHRvIGVuYWJsZSBmbG93IGZyb20gcGVlciAqLwotICAgIGlmIChlbmFibGUpIHsKLSAgICAgIC8qIElmIHJmY29tbSBzdXNwZW5kZWQgdHJhZmZpYyBmcm9tIHRoZSBwZWVyIGJhc2VkIG9uIHRoZSByeF9xdWV1ZV9zaXplICovCi0gICAgICAvKiBjaGVjayBpZiBpdCBjYW4gYmUgcmVzdW1lZCBub3cgKi8KLSAgICAgIGlmIChwX3BvcnQtPnJ4LnBlZXJfZmMgJiYgKHBfcG9ydC0+cngucXVldWVfc2l6ZSA8IFBPUlRfUlhfTE9XX1dNKSAmJgotICAgICAgICAgIChmaXhlZF9xdWV1ZV9sZW5ndGgocF9wb3J0LT5yeC5xdWV1ZSkgPCBQT1JUX1JYX0JVRl9MT1dfV00pKSB7Ci0gICAgICAgIHBfcG9ydC0+cngucGVlcl9mYyA9IGZhbHNlOwotCi0gICAgICAgIC8qIElmIHVzZXIgZGlkIG5vdCBmb3JjZSBmbG93IGNvbnRyb2wgYWxsb3cgdHJhZmZpYyBub3cgKi8KLSAgICAgICAgaWYgKCFwX3BvcnQtPnJ4LnVzZXJfZmMpCi0gICAgICAgICAgUkZDT01NX0Zsb3dSZXEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIGVsc2Ugd2FudCB0byBkaXNhYmxlIGZsb3cgZnJvbSBwZWVyICovCi0gICAgZWxzZSB7Ci0gICAgICAvKiBpZiBjbGllbnQgcmVnaXN0ZXJlZCBkYXRhIGNhbGxiYWNrLCBqdXN0IGRvIHdoYXQgdGhleSB3YW50ICovCi0gICAgICBpZiAocF9wb3J0LT5wX2RhdGFfY2FsbGJhY2sgfHwgcF9wb3J0LT5wX2RhdGFfY29fY2FsbGJhY2spIHsKLSAgICAgICAgcF9wb3J0LT5yeC5wZWVyX2ZjID0gdHJ1ZTsKLSAgICAgICAgUkZDT01NX0Zsb3dSZXEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgZmFsc2UpOwotICAgICAgfQotICAgICAgLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHJ4IHF1ZXVlLiAgSWYgaXQgZXhjZWVkcyBjZXJ0YWluICovCi0gICAgICAvKiBsZXZlbCBhbmQgZmxvdyBjb250cm9sIGhhcyBub3QgYmVlbiBzZW50IHRvIHRoZSBwZWVyIGRvIGl0IG5vdyAqLwotICAgICAgZWxzZSBpZiAoKChwX3BvcnQtPnJ4LnF1ZXVlX3NpemUgPiBQT1JUX1JYX0hJR0hfV00pIHx8Ci0gICAgICAgICAgICAgICAgKGZpeGVkX3F1ZXVlX2xlbmd0aChwX3BvcnQtPnJ4LnF1ZXVlKSA+IFBPUlRfUlhfQlVGX0hJR0hfV00pKSAmJgotICAgICAgICAgICAgICAgIXBfcG9ydC0+cngucGVlcl9mYykgewotICAgICAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlBPUlRfRGF0YUluZCBEYXRhIHJlYWNoZWQgSFcuIFNlbmRpbmcgRkMgc2V0LiIpOwotCi0gICAgICAgIHBfcG9ydC0+cngucGVlcl9mYyA9IHRydWU7Ci0gICAgICAgIFJGQ09NTV9GbG93UmVxKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksIGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3JmY29tbS9yZmNfZXZlbnQuaCBiL3N0YWNrL3JmY29tbS9yZmNfZXZlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkMjQwMC4uMDAwMDAwMAotLS0gYS9zdGFjay9yZmNvbW0vcmZjX2V2ZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLS8qCi0gKiBFdmVudHMgdGhhdCBjYW4gYmUgcmVjZWl2ZWQgYnkgbXVsdGlwbGV4ZXIgYXMgd2VsbCBhcyBwb3J0IHN0YXRlIG1hY2hpbmVzCi0gKi8KLXR5cGVkZWYgdWludDhfdCB0UkZDX0VWRU5UOwotI2RlZmluZSBSRkNfRVZFTlRfU0FCTUUgMAotI2RlZmluZSBSRkNfRVZFTlRfVUEgMQotI2RlZmluZSBSRkNfRVZFTlRfRE0gMgotI2RlZmluZSBSRkNfRVZFTlRfRElTQyAzCi0jZGVmaW5lIFJGQ19FVkVOVF9VSUggNAotI2RlZmluZSBSRkNfRVZFTlRfVElNRU9VVCA1Ci0jZGVmaW5lIFJGQ19FVkVOVF9CQURfRlJBTUUgNTAKLS8qCi0gKiBNdWx0aXBsZXhlciBldmVudHMKLSAqLwotdHlwZWRlZiB1aW50OF90IHRSRkNfTVhfRVZFTlQ7Ci0jZGVmaW5lIFJGQ19NWF9FVkVOVF9TQUJNRSBSRkNfRVZFTlRfU0FCTUUKLSNkZWZpbmUgUkZDX01YX0VWRU5UX1VBIFJGQ19FVkVOVF9VQQotI2RlZmluZSBSRkNfTVhfRVZFTlRfRE0gUkZDX0VWRU5UX0RNCi0jZGVmaW5lIFJGQ19NWF9FVkVOVF9ESVNDIFJGQ19FVkVOVF9ESVNDCi0jZGVmaW5lIFJGQ19NWF9FVkVOVF9VSUggUkZDX0VWRU5UX1VJSAotI2RlZmluZSBSRkNfTVhfRVZFTlRfVElNRU9VVCBSRkNfRVZFTlRfVElNRU9VVAotI2RlZmluZSBSRkNfTVhfRVZFTlRfU1RBUlRfUkVRIDYKLSNkZWZpbmUgUkZDX01YX0VWRU5UX1NUQVJUX1JTUCA3Ci0jZGVmaW5lIFJGQ19NWF9FVkVOVF9DTE9TRV9SRVEgOAotI2RlZmluZSBSRkNfTVhfRVZFTlRfQ09OTl9DTkYgOQotI2RlZmluZSBSRkNfTVhfRVZFTlRfQ09OTl9JTkQgMTAKLSNkZWZpbmUgUkZDX01YX0VWRU5UX0NPTkZfQ05GIDExCi0jZGVmaW5lIFJGQ19NWF9FVkVOVF9DT05GX0lORCAxMgotI2RlZmluZSBSRkNfTVhfRVZFTlRfUU9TX1ZJT0xBVElPTl9JTkQgMTMKLSNkZWZpbmUgUkZDX01YX0VWRU5UX0RJU0NfSU5EIDE0Ci0KLS8qCi0gKiBQb3J0IGV2ZW50cwotICovCi10eXBlZGVmIHVpbnQ4X3QgdFJGQ19QT1JUX0VWRU5UOwotI2RlZmluZSBSRkNfUE9SVF9FVkVOVF9TQUJNRSBSRkNfRVZFTlRfU0FCTUUKLSNkZWZpbmUgUkZDX1BPUlRfRVZFTlRfVUEgUkZDX0VWRU5UX1VBCi0jZGVmaW5lIFJGQ19QT1JUX0VWRU5UX0RNIFJGQ19FVkVOVF9ETQotI2RlZmluZSBSRkNfUE9SVF9FVkVOVF9ESVNDIFJGQ19FVkVOVF9ESVNDCi0jZGVmaW5lIFJGQ19QT1JUX0VWRU5UX1VJSCBSRkNfRVZFTlRfVUlICi0jZGVmaW5lIFJGQ19QT1JUX0VWRU5UX1RJTUVPVVQgUkZDX0VWRU5UX1RJTUVPVVQKLSNkZWZpbmUgUkZDX1BPUlRfRVZFTlRfT1BFTiA5Ci0jZGVmaW5lIFJGQ19QT1JUX0VWRU5UX0VTVEFCTElTSF9SU1AgMTEKLSNkZWZpbmUgUkZDX1BPUlRfRVZFTlRfQ0xPU0UgMTIKLSNkZWZpbmUgUkZDX1BPUlRfRVZFTlRfQ0xFQVIgMTMKLSNkZWZpbmUgUkZDX1BPUlRfRVZFTlRfREFUQSAxNAotI2RlZmluZSBSRkNfUE9SVF9FVkVOVF9TRUNfQ09NUExFVEUgMTUKZGlmZiAtLWdpdCBhL3N0YWNrL3JmY29tbS9yZmNfaW50LmggYi9zdGFjay9yZmNvbW0vcmZjX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjljOTZiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3JmY29tbS9yZmNfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byB0aGUgUkZDIHVuaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgUkZDX0lOVF9ICi0jZGVmaW5lIFJGQ19JTlRfSAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX3N0YXR1cy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9wb3J0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfZXZlbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKgotICogRGVmaW5lIFJGQ09NTSByZXN1bHQgY29kZXMKLSovCi0jZGVmaW5lIFJGQ09NTV9TVUNDRVNTIDAKLSNkZWZpbmUgUkZDT01NX0VSUk9SIDEKLSNkZWZpbmUgUkZDT01NX1NFQ1VSSVRZX0VSUiAxMTIKLQotLyoKLSAqIERlZmluZSBtYXggYW5kIG1pbiBSRkNPTU0gTVRVIChOMSkKLSovCi0jZGVmaW5lIFJGQ09NTV9NSU5fTVRVIDIzCi0jZGVmaW5lIFJGQ09NTV9NQVhfTVRVIDMyNzY3Ci0KLWV4dGVybiB2b2lkIFJGQ09NTV9TdGFydFJlcSh0UkZDX01DQiogcF9tY2IpOwotZXh0ZXJuIHZvaWQgUkZDT01NX1N0YXJ0UnNwKHRSRkNfTUNCKiBwX21jYiwgdWludDE2X3QgcmVzdWx0KTsKLQotZXh0ZXJuIHZvaWQgUkZDT01NX0RsY0VzdGFibGlzaFJlcSh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgdWludDE2X3QgbXR1KTsKLWV4dGVybiB2b2lkIFJGQ09NTV9EbGNFc3RhYmxpc2hSc3AodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KTsKLQotZXh0ZXJuIHZvaWQgUkZDT01NX0RhdGFSZXEodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIEJUX0hEUiogcF9idWYpOwotCi1leHRlcm4gdm9pZCBSRkNPTU1fRGxjUmVsZWFzZVJlcSh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSk7Ci0KLWV4dGVybiB2b2lkIFJGQ09NTV9QYXJhbWV0ZXJOZWdvdGlhdGlvblJlcXVlc3QodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSk7Ci1leHRlcm4gdm9pZCBSRkNPTU1fUGFyYW1ldGVyTmVnb3RpYXRpb25SZXNwb25zZSh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSwgdWludDhfdCBjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgayk7Ci0KLWV4dGVybiB2b2lkIFJGQ09NTV9GbG93UmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCBib29sIHN0YXRlKTsKLQotZXh0ZXJuIHZvaWQgUkZDT01NX1BvcnRQYXJhbWV0ZXJOZWdvdGlhdGlvblJlcXVlc3QodFJGQ19NQ0IqIHBfbWNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBPUlRfU1RBVEUqIHBfcGFycyk7Ci1leHRlcm4gdm9pZCBSRkNPTU1fUG9ydFBhcmFtZXRlck5lZ290aWF0aW9uUmVzcG9uc2UodFJGQ19NQ0IqIHBfbWNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9TVEFURSogcF9wYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBhcmFtX21hc2spOwotCi1leHRlcm4gdm9pZCBSRkNPTU1fQ29udHJvbFJlcSh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0NUUkwqIHBfcGFycyk7Ci1leHRlcm4gdm9pZCBSRkNPTU1fQ29udHJvbFJzcCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0NUUkwqIHBfcGFycyk7Ci0KLWV4dGVybiB2b2lkIFJGQ09NTV9MaW5lU3RhdHVzUmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsaW5lX3N0YXR1cyk7Ci0vKgotICogRGVmaW5lIGxvZ2ljYWwgc3RydWN0IHVzZWQgZm9yIHNlbmRpbmcgYW5kIGRlY29kaW5nIE1YIGZyYW1lcwotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBkbGNpOwotICB1aW50OF90IHR5cGU7Ci0gIHVpbnQ4X3QgY3I7Ci0gIHVpbnQ4X3QgZWE7Ci0gIHVpbnQ4X3QgcGY7Ci0gIHVpbnQ4X3QgY3JlZGl0OwotCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgdWludDhfdCBkbGNpOwotICAgICAgdWludDhfdCBmcmFtZV90eXBlOwotICAgICAgdWludDhfdCBjb252X2xheWVyOwotICAgICAgdWludDhfdCBwcmlvcml0eTsKLSAgICAgIHVpbnQ4X3QgdDE7Ci0gICAgICB1aW50MTZfdCBtdHU7Ci0gICAgICB1aW50OF90IG4yOwotICAgICAgdWludDhfdCBrOwotICAgIH0gcG47Ci0gICAgc3RydWN0IHsKLSAgICAgIHVpbnQ4X3QqIHBfZGF0YTsKLSAgICAgIHVpbnQxNl90IGRhdGFfbGVuOwotICAgIH0gdGVzdDsKLSAgICBzdHJ1Y3QgewotICAgICAgdWludDhfdCBkbGNpOwotICAgICAgdWludDhfdCBzaWduYWxzOwotICAgICAgdWludDhfdCBicmVha19wcmVzZW50OwotICAgICAgdWludDhfdCBicmVha19kdXJhdGlvbjsKLSAgICB9IG1zYzsKLSAgICBzdHJ1Y3QgewotICAgICAgdWludDhfdCBlYTsKLSAgICAgIHVpbnQ4X3QgY3I7Ci0gICAgICB1aW50OF90IHR5cGU7Ci0gICAgfSBuc2M7Ci0gICAgc3RydWN0IHsKLSAgICAgIHVpbnQ4X3QgZGxjaTsKLSAgICAgIHVpbnQ4X3QgaXNfcmVxdWVzdDsKLSAgICAgIHVpbnQ4X3QgYmF1ZF9yYXRlOwotICAgICAgdWludDhfdCBieXRlX3NpemU7Ci0gICAgICB1aW50OF90IHN0b3BfYml0czsKLSAgICAgIHVpbnQ4X3QgcGFyaXR5OwotICAgICAgdWludDhfdCBwYXJpdHlfdHlwZTsKLSAgICAgIHVpbnQ4X3QgZmNfdHlwZTsKLSAgICAgIHVpbnQ4X3QgeG9uX2NoYXI7Ci0gICAgICB1aW50OF90IHhvZmZfY2hhcjsKLSAgICAgIHVpbnQxNl90IHBhcmFtX21hc2s7Ci0gICAgfSBycG47Ci0gICAgc3RydWN0IHsKLSAgICAgIHVpbnQ4X3QgZGxjaTsKLSAgICAgIHVpbnQ4X3QgbGluZV9zdGF0dXM7Ci0gICAgfSBybHM7Ci0gIH0gdTsKLX0gTVhfRlJBTUU7Ci0KLSNkZWZpbmUgTElORV9TVEFUVVNfTk9fRVJST1IgMHgwMAotI2RlZmluZSBMSU5FX1NUQVRVU19PVkVSUlVOIDB4MDIgIC8qIFJlY2VpdmUgT3ZlcnJ1biBFcnJvciAgICovCi0jZGVmaW5lIExJTkVfU1RBVFVTX1JYUEFSSVRZIDB4MDQgLyogUmVjZWl2ZSBQYXJpdHkgRXJyb3IgICAgKi8KLSNkZWZpbmUgTElORV9TVEFUVVNfRlJBTUUgMHgwOCAgICAvKiBSZWNlaXZlIEZyYW1pbmcgZXJyb3IgICAqLwotI2RlZmluZSBMSU5FX1NUQVRVU19GQUlMRUQgMHgxMCAgIC8qIENvbm5lY3Rpb24gRmFpbGVkICAgICAgICovCi0KLS8qCi0gKiBEZWZpbmUgc3RhdGVzIGFuZCBldmVudHMgZm9yIHRoZSBSRkMgbXVsdGlwbGV4ZXIgc3RhdGUgbWFjaGluZQotKi8KLXR5cGVkZWYgZW51bSA6IHVpbnQxNl90IHsKLSAgUkZDX01YX1NUQVRFX0lETEUgPSAwLAotICBSRkNfTVhfU1RBVEVfV0FJVF9DT05OX0NORiA9IDEsCi0gIFJGQ19NWF9TVEFURV9DT05GSUdVUkUgPSAyLAotICBSRkNfTVhfU1RBVEVfU0FCTUVfV0FJVF9VQSA9IDMsCi0gIFJGQ19NWF9TVEFURV9XQUlUX1NBQk1FID0gNCwKLSAgUkZDX01YX1NUQVRFX0NPTk5FQ1RFRCA9IDUsCi0gIFJGQ19NWF9TVEFURV9ESVNDX1dBSVRfVUEgPSA2LAotfSB0UkZDX01YX1NUQVRFOwotCi1pbmxpbmUgc3RkOjpzdHJpbmcgcmZjb21tX214X3N0YXRlX3RleHQodFJGQ19NWF9TVEFURSBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBSRkNfTVhfU1RBVEVfSURMRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiaWRsZSIpOwotICAgIGNhc2UgUkZDX01YX1NUQVRFX1dBSVRfQ09OTl9DTkY6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIndhaXRfY29uZmlnIik7Ci0gICAgY2FzZSBSRkNfTVhfU1RBVEVfQ09ORklHVVJFOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJjb25maWd1cmUiKTsKLSAgICBjYXNlIFJGQ19NWF9TVEFURV9TQUJNRV9XQUlUX1VBOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJzYWJtZV93YWl0X3VhIik7Ci0gICAgY2FzZSBSRkNfTVhfU1RBVEVfV0FJVF9TQUJNRToKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygid2FpdF9zYWJtZSIpOwotICAgIGNhc2UgUkZDX01YX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiY29ubmVjdGVkIik7Ci0gICAgY2FzZSBSRkNfTVhfU1RBVEVfRElTQ19XQUlUX1VBOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJkaXNjb25uZWN0X3dhaXRfdWEiKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJVTktOT1dOIik7Ci0gIH0KLX0KLQotLyoKLSAqIERlZmluZSBwb3J0IHN0YXRlcwotICovCi0jZGVmaW5lIFJGQ19TVEFURV9DTE9TRUQgMAotI2RlZmluZSBSRkNfU1RBVEVfU0FCTUVfV0FJVF9VQSAxCi0jZGVmaW5lIFJGQ19TVEFURV9PUklHX1dBSVRfU0VDX0NIRUNLIDIKLSNkZWZpbmUgUkZDX1NUQVRFX1RFUk1fV0FJVF9TRUNfQ0hFQ0sgMwotI2RlZmluZSBSRkNfU1RBVEVfT1BFTkVEIDQKLSNkZWZpbmUgUkZDX1NUQVRFX0RJU0NfV0FJVF9VQSA1Ci0KLS8qIHNlY29uZHMgdG8gd2FpdCBmb3IgcmVwbHkgd2l0aCBQb2xsIGJpdCAqLwotI2RlZmluZSBSRkNfVDFfVElNRU9VVCAyMAotLyogc2Vjb25kcyB0byB3YWl0IGZvciByZXBseSB3aXRoIFBvbGwgYml0IG90aGVyIHRoYW4gTVggKi8KLSNkZWZpbmUgUkZDX1BPUlRfVDFfVElNRU9VVCA2MAotLyogdGltZW91dCB0byB3YWl0IGZvciBNeCBVSUggKi8KLSNkZWZpbmUgUkZDX1QyX1RJTUVPVVQgMjAKLS8qIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGFuZCB3ZSBzZW5kIERJU0Mgd2Ugc2hvdWxkIG5vdCB3YWl0IGZvciBtaW4gKi8KLSNkZWZpbmUgUkZDX0RJU0NfVElNRU9VVCAzCi0jZGVmaW5lIFJGQ19DTE9TRV9USU1FT1VUIDEwCi0vKiBmaXJzdCBjb25uZWN0aW9uIHRvIGJlIGVzdGFibGlzaGVkIG9uIE14ICovCi0jZGVmaW5lIFJGQ09NTV9DT05OX1RJTUVPVVQgMTIwCi0KLS8qIERlZmluZSBSRkNvbW0gY29udHJvbCBibG9jawotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTVhfRlJBTUUgcnhfZnJhbWU7Ci0gIHRMMkNBUF9BUFBMX0lORk8gcmVnX2luZm87IC8qIEwyQ0FQIFJlZ2lzdHJhdGlvbiBpbmZvICovCi0KLSAgYm9vbCBwZWVyX3J4X2Rpc2FibGVkOyAvKiBJZiB0cnVlIHBlZXIgc2VudCBGQ09GRiAqLwotICB1aW50OF90IGxhc3RfbXV4OyAgICAgIC8qIExhc3QgbXV4IGFsbG9jYXRlZCAqLwotICB1aW50OF90IGxhc3RfcG9ydF9pbmRleDsgIC8vIEluZGV4IG9mIGxhc3QgcG9ydCBhbGxvY2F0ZWQgaW4gcmZjX2NiLnBvcnQKLX0gdFJGQ09NTV9DQjsKLQotLyogTWFpbiBDb250cm9sIEJsb2NrIGZvciB0aGUgUkZDT01NIExheWVyIChQT1JUIGFuZCBSRkMpICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRSRkNPTU1fQ0IgcmZjOwotICB0UE9SVF9DQiBwb3J0OwotICB1aW50OF90IHRyYWNlX2xldmVsOwotfSB0UkZDX0NCOwotCi1leHRlcm4gdFJGQ19DQiByZmNfY2I7Ci0KLWV4dGVybiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QgLyogc2NuICovLCB1aW50MTZfdCAvKiBzZWNfbWFzayAqLz4KLSAgICByZmNvbW1fc2VjdXJpdHlfcmVjb3JkczsKLQotLyogTUNCIGJhc2VkIG9uIHRoZSBMMkNBUCdzIGxjaWQgKi8KLWV4dGVybiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QgLyogY2lkICovLCB0UkZDX01DQio+IHJmY19sY2lkX21jYjsKLQotLyogVGltZXIgcnVubmluZyBvbiB0aGUgbXVsdGlwbGV4b3IgY2hhbm5lbCB3aGlsZSBubyBETENJIGNvbm5lY3Rpb24gaXMgb3BlbiAqLwotI2RlZmluZSBSRkNfTUNCX0lOSVRfSU5BQ1RfVElNRVIgNjAgLyogaW4gc2Vjb25kcyAqLwotCi0vKiBUaW1lciBydW5uaW5nIG9uIHRoZSBtdWx0aXBsZXhvciBjaGFubmVsIGFmdGVyIGxhc3QgRExDSSBpcyByZWxlYXNlZCAqLwotI2RlZmluZSBSRkNfTUNCX1JFTEVBU0VfSU5BQ1RfVElNRVIgMjAgLyogaW4gc2Vjb25kcyAqLwotCi0jaWZkZWYgUkZDT01NX1BSRUNBTENfRkNTCi0KLSNkZWZpbmUgUkZDT01NX1NBQk1FX0ZDUyhwX2RhdGEsIGNyLCBkbGNpKSByZmNfc2FibWVfZmNzW2NyXVtkbGNpXQotI2RlZmluZSBSRkNPTU1fVUFfRkNTKHBfZGF0YSwgY3IsIGRsY2kpIHJmY191YV9mY3NbY3JdW2RsY2ldCi0jZGVmaW5lIFJGQ09NTV9ETV9GQ1MocF9kYXRhLCBjciwgZGxjaSkgcmZjX2RtX2Zjc1tjcl1bZGxjaV0KLSNkZWZpbmUgUkZDT01NX0RJU0NfRkNTKHBfZGF0YSwgY3IsIGRsY2kpIHJmY19kaXNjX2Zjc1tjcl1bZGxjaV0KLSNkZWZpbmUgUkZDT01NX1VJSF9GQ1MocF9kYXRhLCBkbGNpKSByZmNfdWloX2Zjc1tkbGNpXQotCi0jZWxzZQotCi1leHRlcm4gdWludDhfdCByZmNfY2FsY19mY3ModWludDE2X3QgbGVuLCB1aW50OF90KiBwKTsKLQotI2RlZmluZSBSRkNPTU1fU0FCTUVfRkNTKHBfZGF0YSwgY3IsIGRsY2kpIHJmY19jYWxjX2ZjcygzLCBwX2RhdGEpCi0jZGVmaW5lIFJGQ09NTV9VQV9GQ1MocF9kYXRhLCBjciwgZGxjaSkgcmZjX2NhbGNfZmNzKDMsIHBfZGF0YSkKLSNkZWZpbmUgUkZDT01NX0RNX0ZDUyhwX2RhdGEsIGNyLCBkbGNpKSByZmNfY2FsY19mY3MoMywgcF9kYXRhKQotI2RlZmluZSBSRkNPTU1fRElTQ19GQ1MocF9kYXRhLCBjciwgZGxjaSkgcmZjX2NhbGNfZmNzKDMsIHBfZGF0YSkKLSNkZWZpbmUgUkZDT01NX1VJSF9GQ1MocF9kYXRhLCBkbGNpKSByZmNfY2FsY19mY3MoMiwgcF9kYXRhKQotCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgcmZjX214X3NtX2V4ZWN1dGUodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKTsKLQotLyoKLSAqIEZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgcmZjX3BvcnRfZnNtLmNjCi0qLwotZXh0ZXJuIHZvaWQgcmZjX3BvcnRfc21fZXhlY3V0ZSh0UE9SVCogcF9wb3J0LCB0UkZDX1BPUlRfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSk7Ci0KLWV4dGVybiB2b2lkIHJmY19wcm9jZXNzX3BuKHRSRkNfTUNCKiBwX3JmY19tY2IsIGJvb2wgaXNfY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1YX0ZSQU1FKiBwX2ZyYW1lKTsKLWV4dGVybiB2b2lkIHJmY19wcm9jZXNzX21zYyh0UkZDX01DQiogcF9yZmNfbWNiLCBib29sIGlzX2NvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVhfRlJBTUUqIHBfZnJhbWUpOwotZXh0ZXJuIHZvaWQgcmZjX3Byb2Nlc3NfcnBuKHRSRkNfTUNCKiBwX3JmY19tY2IsIGJvb2wgaXNfY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVlc3QsIE1YX0ZSQU1FKiBwX2ZyYW1lKTsKLWV4dGVybiB2b2lkIHJmY19wcm9jZXNzX3Jscyh0UkZDX01DQiogcF9yZmNfbWNiLCBib29sIGlzX2NvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVhfRlJBTUUqIHBfZnJhbWUpOwotZXh0ZXJuIHZvaWQgcmZjX3Byb2Nlc3NfbnNjKHRSRkNfTUNCKiBwX3JmY19tY2IsIE1YX0ZSQU1FKiBwX2ZyYW1lKTsKLWV4dGVybiB2b2lkIHJmY19wcm9jZXNzX3Rlc3RfcnNwKHRSRkNfTUNCKiBwX3JmY19tY2IsIEJUX0hEUiogcF9idWYpOwotZXh0ZXJuIHZvaWQgcmZjX3Byb2Nlc3NfZmNvbih0UkZDX01DQiogcF9yZmNfbWNiLCBib29sIGlzX2NvbW1hbmQpOwotZXh0ZXJuIHZvaWQgcmZjX3Byb2Nlc3NfZmNvZmYodFJGQ19NQ0IqIHBfcmZjX21jYiwgYm9vbCBpc19jb21tYW5kKTsKLWV4dGVybiB2b2lkIHJmY19wcm9jZXNzX2wyY2FwX2Nvbmdlc3Rpb24odFJGQ19NQ0IqIHBfbWNiLCBib29sIGlzX2Nvbmdlc3RlZCk7Ci0KLXZvaWQgcmZjX29uX2wyY2FwX2Vycm9yKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci0KLS8qCi0gKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIHJmY191dGlscy5jYwotKi8KLXRSRkNfTUNCKiByZmNfYWxsb2NfbXVsdGlwbGV4ZXJfY2hhbm5lbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5pdGlhdG9yKTsKLWV4dGVybiB2b2lkIHJmY19yZWxlYXNlX211bHRpcGxleGVyX2NoYW5uZWwodFJGQ19NQ0IqIHBfcmZjX21jYik7Ci1leHRlcm4gdm9pZCByZmNfdGltZXJfc3RhcnQodFJGQ19NQ0IqIHBfcmZjX21jYiwgdWludDE2X3QgdGltZW91dCk7Ci1leHRlcm4gdm9pZCByZmNfdGltZXJfc3RvcCh0UkZDX01DQiogcF9yZmNfbWNiKTsKLWV4dGVybiB2b2lkIHJmY19wb3J0X3RpbWVyX3N0YXJ0KHRQT1JUKiBwX3BvcnQsIHVpbnQxNl90IHRvdXQpOwotZXh0ZXJuIHZvaWQgcmZjX3BvcnRfdGltZXJfc3RvcCh0UE9SVCogcF9wb3J0KTsKLQotYm9vbCByZmNfY2hlY2tfZmNzKHVpbnQxNl90IGxlbiwgdWludDhfdCogcCwgdWludDhfdCByZWNlaXZlZF9mY3MpOwotdFJGQ19NQ0IqIHJmY19maW5kX2xjaWRfbWNiKHVpbnQxNl90IGxjaWQpOwotZXh0ZXJuIHZvaWQgcmZjX3NhdmVfbGNpZF9tY2IodFJGQ19NQ0IqIHBfcmZjX21jYiwgdWludDE2X3QgbGNpZCk7Ci1leHRlcm4gdm9pZCByZmNfY2hlY2tfbWNiX2FjdGl2ZSh0UkZDX01DQiogcF9tY2IpOwotZXh0ZXJuIHZvaWQgcmZjX3BvcnRfY2xvc2VkKHRQT1JUKiBwX3BvcnQpOwotZXh0ZXJuIHZvaWQgcmZjX3NlY19jaGVja19jb21wbGV0ZShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgcmVzKTsKLWV4dGVybiB2b2lkIHJmY19pbmNfY3JlZGl0KHRQT1JUKiBwX3BvcnQsIHVpbnQ4X3QgY3JlZGl0KTsKLWV4dGVybiB2b2lkIHJmY19kZWNfY3JlZGl0KHRQT1JUKiBwX3BvcnQpOwotZXh0ZXJuIHZvaWQgcmZjX2NoZWNrX3NlbmRfY21kKHRSRkNfTUNCKiBwX21jYiwgQlRfSERSKiBwX2J1Zik7Ci0KLS8qCi0gKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIHJmY190c19mcmFtZXMuY2MKLSovCi1leHRlcm4gdm9pZCByZmNfc2VuZF9zYWJtZSh0UkZDX01DQiogcF9yZmNfbWNiLCB1aW50OF90IGRsY2kpOwotZXh0ZXJuIHZvaWQgcmZjX3NlbmRfdWEodFJGQ19NQ0IqIHBfcmZjX21jYiwgdWludDhfdCBkbGNpKTsKLWV4dGVybiB2b2lkIHJmY19zZW5kX2RtKHRSRkNfTUNCKiBwX3JmY19tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBwZik7Ci1leHRlcm4gdm9pZCByZmNfc2VuZF9kaXNjKHRSRkNfTUNCKiBwX3JmY19tY2IsIHVpbnQ4X3QgZGxjaSk7Ci1leHRlcm4gdm9pZCByZmNfc2VuZF9wbih0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBpc19jb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1LCB1aW50OF90IGNsLCB1aW50OF90IGspOwotZXh0ZXJuIHZvaWQgcmZjX3NlbmRfdGVzdCh0UkZDX01DQiogcF9yZmNfbWNiLCBib29sIGlzX2NvbW1hbmQsIEJUX0hEUiogcF9idWYpOwotZXh0ZXJuIHZvaWQgcmZjX3NlbmRfbXNjKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCBib29sIGlzX2NvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdFBPUlRfQ1RSTCogcF9wYXJzKTsKLWV4dGVybiB2b2lkIHJmY19zZW5kX3Jscyh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBpc19jb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzKTsKLWV4dGVybiB2b2lkIHJmY19zZW5kX3Jwbih0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBpc19jb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX1NUQVRFKiBwX3BhcnMsIHVpbnQxNl90IG1hc2spOwotZXh0ZXJuIHZvaWQgcmZjX3NlbmRfZmNvbih0UkZDX01DQiogcF9tY2IsIGJvb2wgaXNfY29tbWFuZCk7Ci1leHRlcm4gdm9pZCByZmNfc2VuZF9mY29mZih0UkZDX01DQiogcF9tY2IsIGJvb2wgaXNfY29tbWFuZCk7Ci1leHRlcm4gdm9pZCByZmNfc2VuZF9idWZfdWloKHRSRkNfTUNCKiBwX3JmY19tY2IsIHVpbnQ4X3QgZGxjaSwgQlRfSERSKiBwX2J1Zik7Ci1leHRlcm4gdm9pZCByZmNfc2VuZF9jcmVkaXQodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHVpbnQ4X3QgY3JlZGl0KTsKLWV4dGVybiB2b2lkIHJmY19wcm9jZXNzX214X21lc3NhZ2UodFJGQ19NQ0IqIHBfcmZjX21jYiwgQlRfSERSKiBwX2J1Zik7Ci1leHRlcm4gdFJGQ19FVkVOVCByZmNfcGFyc2VfZGF0YSh0UkZDX01DQiogcF9yZmNfbWNiLCBNWF9GUkFNRSogcF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpOwotCi0vKiBDYWxsIGJhY2sgZnVuY3Rpb25zIGZyb20gUkZDT01NICovCi1leHRlcm4gdm9pZCByZmNvbW1fbDJjYXBfaWZfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgUE9SVF9TdGFydEluZCh0UkZDX01DQiogcF9tY2IpOwotZXh0ZXJuIHZvaWQgUE9SVF9TdGFydENuZih0UkZDX01DQiogcF9tY2IsIHVpbnQxNl90IHJlc3VsdCk7Ci0KLWV4dGVybiB2b2lkIFBPUlRfQ2xvc2VJbmQodFJGQ19NQ0IqIHBfbWNiKTsKLWV4dGVybiB2b2lkIFBvcnRfVGltZU91dENsb3NlTXV4KHRSRkNfTUNCKiBwX21jYik7Ci0KLWV4dGVybiB2b2lkIFBPUlRfRGxjRXN0YWJsaXNoSW5kKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB1aW50MTZfdCBtdHUpOwotZXh0ZXJuIHZvaWQgUE9SVF9EbGNFc3RhYmxpc2hDbmYodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCk7Ci0KLWV4dGVybiB2b2lkIFBPUlRfRGF0YUluZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgQlRfSERSKiBwX2J1Zik7Ci0KLWV4dGVybiB2b2lkIFBPUlRfRGxjUmVsZWFzZUluZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSk7Ci0KLWV4dGVybiB2b2lkIFBPUlRfUGFyTmVnSW5kKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB1aW50MTZfdCBtdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNsLCB1aW50OF90IGspOwotZXh0ZXJuIHZvaWQgUE9SVF9QYXJOZWdDbmYodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2wsIHVpbnQ4X3Qgayk7Ci0KLWV4dGVybiB2b2lkIFBPUlRfRmxvd0luZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBmYyk7Ci0KLWV4dGVybiB2b2lkIFBPUlRfUG9ydE5lZ0luZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgdFBPUlRfU1RBVEUqIHBfcGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYXJhbV9tYXNrKTsKLWV4dGVybiB2b2lkIFBPUlRfUG9ydE5lZ0NuZih0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgdFBPUlRfU1RBVEUqIHBfcGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpOwotCi1leHRlcm4gdm9pZCBQT1JUX0NvbnRyb2xJbmQodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHRQT1JUX0NUUkwqIHBfcGFycyk7Ci1leHRlcm4gdm9pZCBQT1JUX0NvbnRyb2xDbmYodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIHRQT1JUX0NUUkwqIHBfcGFycyk7Ci0KLWV4dGVybiB2b2lkIFBPUlRfTGluZVN0YXR1c0luZCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxpbmVfc3RhdHVzKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9yZmNvbW0vcmZjX2wyY2FwX2lmLmNjIGIvc3RhY2svcmZjb21tL3JmY19sMmNhcF9pZi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2ZmQ2ZS4uMDAwMDAwMAotLS0gYS9zdGFjay9yZmNvbW0vcmZjX2wyY2FwX2lmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIEwyQ0FQIGludGVyZmFjZSBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcG9ydF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcmZjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyoKLSAqIERlZmluZSBDYWxsYmFjayBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIGJ5IEwyQ0FQCi0qLwotc3RhdGljIHZvaWQgUkZDT01NX0Nvbm5lY3RJbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBzbSwgdWludDhfdCBpZCk7Ci1zdGF0aWMgdm9pZCBSRkNPTU1fQ29ubmVjdENuZih1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBlcnIpOwotc3RhdGljIHZvaWQgUkZDT01NX0NvbmZpZ0luZCh1aW50MTZfdCBsY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXN0YXRpYyB2b2lkIFJGQ09NTV9Db25maWdDbmYodWludDE2X3QgbGNpZCwgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXN0YXRpYyB2b2lkIFJGQ09NTV9EaXNjb25uZWN0SW5kKHVpbnQxNl90IGxjaWQsIGJvb2wgaXNfY2xlYXIpOwotc3RhdGljIHZvaWQgUkZDT01NX0J1ZkRhdGFJbmQodWludDE2X3QgbGNpZCwgQlRfSERSKiBwX2J1Zik7Ci1zdGF0aWMgdm9pZCBSRkNPTU1fQ29uZ2VzdGlvblN0YXR1c0luZCh1aW50MTZfdCBsY2lkLCBib29sIGlzX2Nvbmdlc3RlZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNvbW1fbDJjYXBfaWZfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHRoZSBSRkNPTU0gdGFzayBzdGFydHVwCi0gKiAgICAgICAgICAgICAgICAgIHRvIHJlZ2lzdGVyIGludGVyZmFjZSBmdW5jdGlvbnMgd2l0aCBMMkNBUC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNvbW1fbDJjYXBfaWZfaW5pdCh2b2lkKSB7Ci0gIHRMMkNBUF9BUFBMX0lORk8qIHBfbDJjID0gJnJmY19jYi5yZmMucmVnX2luZm87Ci0KLSAgcF9sMmMtPnBMMkNBX0Nvbm5lY3RJbmRfQ2IgPSBSRkNPTU1fQ29ubmVjdEluZDsKLSAgcF9sMmMtPnBMMkNBX0Nvbm5lY3RDZm1fQ2IgPSBSRkNPTU1fQ29ubmVjdENuZjsKLSAgcF9sMmMtPnBMMkNBX0NvbmZpZ0luZF9DYiA9IFJGQ09NTV9Db25maWdJbmQ7Ci0gIHBfbDJjLT5wTDJDQV9Db25maWdDZm1fQ2IgPSBSRkNPTU1fQ29uZmlnQ25mOwotICBwX2wyYy0+cEwyQ0FfRGlzY29ubmVjdEluZF9DYiA9IFJGQ09NTV9EaXNjb25uZWN0SW5kOwotICBwX2wyYy0+cEwyQ0FfRGF0YUluZF9DYiA9IFJGQ09NTV9CdWZEYXRhSW5kOwotICBwX2wyYy0+cEwyQ0FfQ29uZ2VzdGlvblN0YXR1c19DYiA9IFJGQ09NTV9Db25nZXN0aW9uU3RhdHVzSW5kOwotICBwX2wyYy0+cEwyQ0FfVHhDb21wbGV0ZV9DYiA9IE5VTEw7Ci0gIHBfbDJjLT5wTDJDQV9FcnJvcl9DYiA9IHJmY19vbl9sMmNhcF9lcnJvcjsKLQotICBMMkNBX1JlZ2lzdGVyKEJUX1BTTV9SRkNPTU0sIHJmY19jYi5yZmMucmVnX2luZm8sIHRydWUgLyogZW5hYmxlX3Nub29wICovLAotICAgICAgICAgICAgICAgIG51bGxwdHIsIEwyQ0FQX01UVV9TSVpFLCAwLCAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9Db25uZWN0SW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IEwyQ0FQIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgTDJDQV9Db25uZWN0SW5kIHJlY2VpdmVkLiAgQWxsb2NhdGUgbXVsdGlwbGV4ZXIgY29udHJvbAotICogICAgICAgICAgICAgICAgICBibG9jayBhbmQgZGlzcGF0Y2ggdGhlIGV2ZW50IHRvIGl0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9Db25uZWN0SW5kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IHBzbSwgdWludDhfdCBpZCkgewotICB0UkZDX01DQiogcF9tY2IgPSByZmNfYWxsb2NfbXVsdGlwbGV4ZXJfY2hhbm5lbChiZF9hZGRyLCBmYWxzZSk7Ci0KLSAgaWYgKChwX21jYikgJiYgKHBfbWNiLT5zdGF0ZSAhPSBSRkNfTVhfU1RBVEVfSURMRSkpIHsKLSAgICAvKiBpZiB0aGlzIGlzIGNvbGxpc2lvbiBjYXNlICovCi0gICAgaWYgKChwX21jYi0+aXNfaW5pdGlhdG9yKSAmJiAocF9tY2ItPnN0YXRlID09IFJGQ19NWF9TVEFURV9XQUlUX0NPTk5fQ05GKSkgewotICAgICAgcF9tY2ItPnBlbmRpbmdfbGNpZCA9IGxjaWQ7Ci0KLSAgICAgIC8qIHdhaXQgcmFuZG9tIHRpbWVvdXQgKDIgLSAxMikgdG8gcmVzb2x2ZSBjb2xsaXNpb24gKi8KLSAgICAgIC8qIGlmIHBlZXIgZ2l2ZXMgdXAgdGhlbiBsb2NhbCBkZXZpY2UgcmVqZWN0cyBpbmNvbWluZyBjb25uZWN0aW9uIGFuZAotICAgICAgICogY29udGludWVzIGFzIGluaXRpYXRvciAqLwotICAgICAgLyogaWYgdGltZW91dCwgbG9jYWwgZGV2aWNlIGRpc2Nvbm5lY3RzIG91dGdvaW5nIGNvbm5lY3Rpb24gYW5kIGNvbnRpbnVlcwotICAgICAgICogYXMgYWNjZXB0b3IgKi8KLSAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiUkZDT01NX0Nvbm5lY3RJbmQgc3RhcnQgdGltZXIgZm9yIGNvbGxpc2lvbiwgaW5pdGlhdG9yJ3MgIgotICAgICAgICAgICJMQ0lEKDB4JXgpLCBhY2NlcHRvcidzIExDSUQoMHgleCkiLAotICAgICAgICAgIHBfbWNiLT5sY2lkLCBwX21jYi0+cGVuZGluZ19sY2lkKTsKLQotICAgICAgcmZjX3RpbWVyX3N0YXJ0KAotICAgICAgICAgIHBfbWNiLAotICAgICAgICAgICh1aW50MTZfdCkoYmx1ZXRvb3RoOjpjb21tb246OnRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCkgJSAxMCArIDIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgLyogd2UgY2Fubm90IGFjY2VwdCBjb25uZWN0aW9uIHJlcXVlc3QgZnJvbSBwZWVyIGF0IHRoaXMgc3RhdGUgKi8KLSAgICAgIC8qIGRvbid0IHVwZGF0ZSBsY2lkICovCi0gICAgICBwX21jYiA9IG51bGxwdHI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIHN0b3JlIG1jYiBldmVuIGlmIG51bGwgKi8KLSAgICByZmNfc2F2ZV9sY2lkX21jYihwX21jYiwgbGNpZCk7Ci0gIH0KLQotICBpZiAocF9tY2IgPT0gbnVsbHB0cikgewotICAgIEwyQ0FfRGlzY29ubmVjdFJlcShsY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcF9tY2ItPmxjaWQgPSBsY2lkOwotCi0gIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfQ09OTl9JTkQsICZpZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fQ29ubmVjdENuZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBMMkNBUCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FfQ29ubmVjdENuZiByZWNlaXZlZC4gIFNhdmUgTDJDQVAgaGFuZGxlIGFuZCBkaXNwYXRjaAotICogICAgICAgICAgICAgICAgICBldmVudCB0byB0aGUgRlNNLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9Db25uZWN0Q25mKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0UkZDX01DQiogcF9tY2IgPSByZmNfZmluZF9sY2lkX21jYihsY2lkKTsKLQotICBpZiAoIXBfbWNiKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKCJSRkNPTU1fQ29ubmVjdENuZiBMQ0lEOjB4JXgiLCBsY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9tY2ItPnBlbmRpbmdfbGNpZCkgewotICAgIC8qIGlmIHBlZXIgcmVqZWN0cyBvdXIgY29ubmVjdCByZXF1ZXN0IGJ1dCBwZWVyJ3MgY29ubmVjdCByZXF1ZXN0IGlzIHBlbmRpbmcKLSAgICAgKi8KLSAgICBpZiAocmVzdWx0ICE9IEwyQ0FQX0NPTk5fT0spIHsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgUkZDT01NX1RSQUNFX0RFQlVHKCJSRkNPTU1fQ29ubmVjdENuZiBwZWVyIGdhdmUgdXAgcGVuZGluZyBMQ0lEKDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwX21jYi0+cGVuZGluZ19sY2lkKTsKLQotICAgICAgLyogUGVlciBnYXZlIHVwIGl0cyBjb25uZWN0aW9uIHJlcXVlc3QsIG1ha2Ugc3VyZSBjbGVhbmluZyB1cCBMMkNBUAotICAgICAgICogY2hhbm5lbCAqLwotICAgICAgTDJDQV9EaXNjb25uZWN0UmVxKHBfbWNiLT5wZW5kaW5nX2xjaWQpOwotCi0gICAgICBwX21jYi0+cGVuZGluZ19sY2lkID0gMDsKLSAgICB9Ci0gIH0KLQotICAvKiBTYXZlIExDSUQgdG8gYmUgdXNlZCBpbiBhbGwgY29uc2VjdXRpdmUgY2FsbHMgdG8gTDJDQVAgKi8KLSAgcF9tY2ItPmxjaWQgPSBsY2lkOwotCi0gIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfQ09OTl9DTkYsICZyZXN1bHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUkZDT01NX0NvbmZpZ0luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBMMkNBUCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FfQ29uZmlnSW5kIHJlY2VpdmVkLiAgU2F2ZSBwYXJhbWV0ZXJzIGluIHRoZSBjb250cm9sCi0gKiAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCBkaXNwYXRjaCBldmVudCB0byB0aGUgRlNNLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9Db25maWdJbmQodWludDE2X3QgbGNpZCwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICB0UkZDX01DQiogcF9tY2IgPSByZmNfZmluZF9sY2lkX21jYihsY2lkKTsKLQotICBpZiAoIXBfbWNiKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKCJSRkNPTU1fQ29uZmlnSW5kIExDSUQ6MHgleCIsIGxjaWQpOwotICAgIGZvciAoYXV0byYgW2NpZCwgbWNiXSA6IHJmY19sY2lkX21jYikgewotICAgICAgaWYgKG1jYiAhPSBudWxscHRyICYmIG1jYi0+cGVuZGluZ19sY2lkID09IGxjaWQpIHsKLSAgICAgICAgdEwyQ0FQX0NGR19JTkZPIGwyY2FwX2NmZ19pbmZvKCpwX2NmZyk7Ci0gICAgICAgIG1jYi0+cGVuZGluZ19jb25maWd1cmVfY29tcGxldGUgPSB0cnVlOwotICAgICAgICBtY2ItPnBlbmRpbmdfY2ZnX2luZm8gPSBsMmNhcF9jZmdfaW5mbzsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICByZmNfbXhfc21fZXhlY3V0ZShwX21jYiwgUkZDX01YX0VWRU5UX0NPTkZfSU5ELCAodm9pZCopcF9jZmcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUkZDT01NX0NvbmZpZ0NuZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBMMkNBUCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIEwyQ0FfQ29uZmlnQ25mIHJlY2VpdmVkLiAgU2F2ZSBMMkNBUCBoYW5kbGUgYW5kIGRpc3BhdGNoCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50IHRvIHRoZSBGU00uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUkZDT01NX0NvbmZpZ0NuZih1aW50MTZfdCBsY2lkLCBVTlVTRURfQVRUUiB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBSRkNPTU1fQ29uZmlnSW5kKGxjaWQsIHBfY2ZnKTsKLQotICB0UkZDX01DQiogcF9tY2IgPSByZmNfZmluZF9sY2lkX21jYihsY2lkKTsKLQotICBpZiAoIXBfbWNiKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKCJSRkNPTU1fQ29uZmlnQ25mIG5vIE1DQiBMQ0lEOjB4JXgiLCBsY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludHB0cl90IHJlc3VsdF9hc19wdHIgPSBMMkNBUF9DRkdfT0s7Ci0gIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfQ09ORl9DTkYsICh2b2lkKilyZXN1bHRfYXNfcHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9EaXNjb25uZWN0SW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IEwyQ0FQIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgTDJDQV9EaXNjb25uZWN0SW5kIHJlY2VpdmVkLiAgRGlzcGF0Y2ggZXZlbnQgdG8gdGhlIEZTTS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fRGlzY29ubmVjdEluZCh1aW50MTZfdCBsY2lkLCBib29sIGlzX2NvbmZfbmVlZGVkKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogbGNpZD0iIDw8IGxvZ2hleChsY2lkKQotICAgICAgICAgIDw8ICIsIGlzX2NvbmZfbmVlZGVkPSIgPDwgaXNfY29uZl9uZWVkZWQ7Ci0gIHRSRkNfTUNCKiBwX21jYiA9IHJmY19maW5kX2xjaWRfbWNiKGxjaWQpOwotICBpZiAoIXBfbWNiKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IG5vIG1jYiBmb3IgbGNpZCAiIDw8IGxvZ2hleChsY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcmZjX214X3NtX2V4ZWN1dGUocF9tY2IsIFJGQ19NWF9FVkVOVF9ESVNDX0lORCwgbnVsbHB0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fQnVmRGF0YUluZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBMMkNBUCB3aGVuCi0gKiAgICAgICAgICAgICAgICAgIGRhdGEgUkZDT01NIGZyYW1lIGlzIHJlY2VpdmVkLiAgUGFyc2UgdGhlIGZyYW1lcywgY2hlY2sKLSAqICAgICAgICAgICAgICAgICAgdGhlIGNoZWNrc3VtIGFuZCBkaXNwYXRjaCBldmVudCB0byBtdWx0aXBsZXhlciBvciBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgIHN0YXRlIG1hY2hpbmUgZGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBkZXN0aW5hdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fQnVmRGF0YUluZCh1aW50MTZfdCBsY2lkLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIHRSRkNfTUNCKiBwX21jYiA9IHJmY19maW5kX2xjaWRfbWNiKGxjaWQpOwotCi0gIGlmICghcF9tY2IpIHsKLSAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18gPDwgIjogQ2Fubm90IGZpbmQgUkZDT01NIG11bHRpcGxleGVyIGZvciBsY2lkICIKLSAgICAgICAgICAgICAgICAgPDwgbG9naGV4KGxjaWQpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0UkZDX0VWRU5UIGV2ZW50ID0gcmZjX3BhcnNlX2RhdGEocF9tY2IsICZyZmNfY2IucmZjLnJ4X2ZyYW1lLCBwX2J1Zik7Ci0KLSAgLyogSWYgdGhlIGZyYW1lIGRpZCBub3QgcGFzcyB2YWxpZGF0aW9uIGp1c3QgaWdub3JlIGl0ICovCi0gIGlmIChldmVudCA9PSBSRkNfRVZFTlRfQkFEX0ZSQU1FKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJhZCBSRkNPTU0gZnJhbWUgZnJvbSBsY2lkPSIgPDwgbG9naGV4KGxjaWQpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkciA8PCAiLCBwX21jYj0iIDw8IHBfbWNiOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocmZjX2NiLnJmYy5yeF9mcmFtZS5kbGNpID09IFJGQ09NTV9NWF9ETENJKSB7Ci0gICAgUkZDT01NX1RSQUNFX0RFQlVHKCIlczogaGFuZGxlIG11bHRpcGxleGVyIGV2ZW50ICVkLCBwX21jYj0lcCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICBldmVudCwgcF9tY2IpOwotICAgIC8qIFRha2Ugc3BlY2lhbCBjYXJlIG9mIHRoZSBNdWx0aXBsZXhlciBDb250cm9sIE1lc3NhZ2VzICovCi0gICAgaWYgKGV2ZW50ID09IFJGQ19FVkVOVF9VSUgpIHsKLSAgICAgIHJmY19wcm9jZXNzX214X21lc3NhZ2UocF9tY2IsIHBfYnVmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBPdGhlciBtdWx0aXBsZXhlciBldmVudHMgZ28gdG8gc3RhdGUgbWFjaGluZSAqLwotICAgIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBzdGF0aWNfY2FzdDx0UkZDX01YX0VWRU5UPihldmVudCksIG51bGxwdHIpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUaGUgZnJhbWUgd2FzIHJlY2VpdmVkIG9uIHRoZSBkYXRhIGNoYW5uZWwgRExDSSwgdmVyaWZ5IHRoYXQgRExDIGV4aXN0cyAqLwotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIHJmY19jYi5yZmMucnhfZnJhbWUuZGxjaSk7Ci0gIGlmIChwX3BvcnQgPT0gbnVsbHB0ciB8fCAhcF9wb3J0LT5yZmMucF9tY2IpIHsKLSAgICAvKiBJZiB0aGlzIGlzIGEgU0FCTUUgb24gbmV3IHBvcnQsIGNoZWNrIGlmIGFueSBhcHAgaXMgd2FpdGluZyBmb3IgaXQgKi8KLSAgICBpZiAoZXZlbnQgIT0gUkZDX0VWRU5UX1NBQk1FKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBubyBmb3Igbm9uZS1TQUJNRSBldmVudCwgbGNpZD0iIDw8IGxvZ2hleChsY2lkKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkciA8PCAiLCBwX21jYj0iIDw8IHBfbWNiOwotICAgICAgaWYgKChwX21jYi0+aXNfaW5pdGlhdG9yICYmICFyZmNfY2IucmZjLnJ4X2ZyYW1lLmNyKSB8fAotICAgICAgICAgICghcF9tY2ItPmlzX2luaXRpYXRvciAmJiByZmNfY2IucmZjLnJ4X2ZyYW1lLmNyKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgICAgPDwgIjogRGlzY29ubmVjdGluZyBSRkNPTU0sIGxjaWQ9IiA8PCBsb2doZXgobGNpZCkKLSAgICAgICAgICAgICAgICAgICA8PCAiLCBiZF9hZGRyPSIgPDwgcF9tY2ItPmJkX2FkZHIgPDwgIiwgcF9tY2I9IiA8PCBwX21jYjsKLSAgICAgICAgcmZjX3NlbmRfZG0ocF9tY2IsIHJmY19jYi5yZmMucnhfZnJhbWUuZGxjaSwgcmZjX2NiLnJmYy5yeF9mcmFtZS5wZik7Ci0gICAgICB9Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcF9wb3J0ID0gcG9ydF9maW5kX2RsY2lfcG9ydChyZmNfY2IucmZjLnJ4X2ZyYW1lLmRsY2kpOwotICAgIGlmIChwX3BvcnQgPT0gbnVsbHB0cikgewotICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOkRpc2Nvbm5lY3RpbmcgUkZDT01NLCBubyBwb3J0IGZvciBkbGNpICIKLSAgICAgICAgICAgICAgICAgPDwgK3JmY19jYi5yZmMucnhfZnJhbWUuZGxjaSA8PCAiLCBsY2lkPSIgPDwgbG9naGV4KGxjaWQpCi0gICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkciA8PCAiLCBwX21jYj0iIDw8IHBfbWNiOwotICAgICAgcmZjX3NlbmRfZG0ocF9tY2IsIHJmY19jYi5yZmMucnhfZnJhbWUuZGxjaSwgdHJ1ZSk7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFJGQ09NTV9UUkFDRV9ERUJVRygiJXM6IHBvcnRfaGFuZGxlc1tkbGNpPSVkXTolZC0+JWQsIHBfbWNiPSVwIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgIHJmY19jYi5yZmMucnhfZnJhbWUuZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPnBvcnRfaGFuZGxlc1tyZmNfY2IucmZjLnJ4X2ZyYW1lLmRsY2ldLAotICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPmhhbmRsZSk7Ci0gICAgcF9tY2ItPnBvcnRfaGFuZGxlc1tyZmNfY2IucmZjLnJ4X2ZyYW1lLmRsY2ldID0gcF9wb3J0LT5oYW5kbGU7Ci0gICAgcF9wb3J0LT5yZmMucF9tY2IgPSBwX21jYjsKLSAgfQotCi0gIGlmIChldmVudCA9PSBSRkNfRVZFTlRfVUlIKSB7Ci0gICAgUkZDT01NX1RSQUNFX0RFQlVHKCIlczogSGFuZGxpbmcgVUlIIGV2ZW50LCBidWZfbGVuPSV1LCBjcmVkaXQ9JXUiLAotICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9idWYtPmxlbiwgcmZjX2NiLnJmYy5yeF9mcmFtZS5jcmVkaXQpOwotICAgIGlmIChwX2J1Zi0+bGVuID4gMCkgewotICAgICAgcmZjX3BvcnRfc21fZXhlY3V0ZShwX3BvcnQsIHN0YXRpY19jYXN0PHRSRkNfUE9SVF9FVkVOVD4oZXZlbnQpLCBwX2J1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICB9Ci0KLSAgICBpZiAocmZjX2NiLnJmYy5yeF9mcmFtZS5jcmVkaXQgIT0gMCkgewotICAgICAgcmZjX2luY19jcmVkaXQocF9wb3J0LCByZmNfY2IucmZjLnJ4X2ZyYW1lLmNyZWRpdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0gIHJmY19wb3J0X3NtX2V4ZWN1dGUocF9wb3J0LCBzdGF0aWNfY2FzdDx0UkZDX1BPUlRfRVZFTlQ+KGV2ZW50KSwgbnVsbHB0cik7Ci0gIG9zaV9mcmVlKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9Db25nZXN0aW9uU3RhdHVzSW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IEwyQ0FQIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgZGF0YSBSRkNPTU0gTDJDQVAgY29uZ2VzdGlvbiBzdGF0dXMgY2hhbmdlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9Db25nZXN0aW9uU3RhdHVzSW5kKHVpbnQxNl90IGxjaWQsIGJvb2wgaXNfY29uZ2VzdGVkKSB7Ci0gIHRSRkNfTUNCKiBwX21jYiA9IHJmY19maW5kX2xjaWRfbWNiKGxjaWQpOwotCi0gIGlmICghcF9tY2IpIHsKLSAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIlJGQ09NTV9Db25nZXN0aW9uU3RhdHVzSW5kIGRyb3BwZWQgTENJRDoweCV4IiwgbGNpZCk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgewotICAgIFJGQ09NTV9UUkFDRV9FVkVOVCgiUkZDT01NX0Nvbmdlc3Rpb25TdGF0dXNJbmQgTENJRDoweCV4IiwgbGNpZCk7Ci0gIH0KLSAgcmZjX3Byb2Nlc3NfbDJjYXBfY29uZ2VzdGlvbihwX21jYiwgaXNfY29uZ2VzdGVkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19maW5kX2xjaWRfbWNiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgTUNCIGJsb2NrIHN1cHBvcnRpbmcgbG9jYWwgY2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRSRkNfTUNCKiByZmNfZmluZF9sY2lkX21jYih1aW50MTZfdCBsY2lkKSB7Ci0gIHRSRkNfTUNCKiBwX21jYiA9IHJmY19sY2lkX21jYltsY2lkXTsKLSAgaWYgKHBfbWNiICE9IG51bGxwdHIpIHsKLSAgICBpZiAocF9tY2ItPmxjaWQgIT0gbGNpZCkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICJMQ0lEIHJldXNlZCBsY2lkPToiIDw8IGxvZ2hleChsY2lkKQotICAgICAgICAgICAgICAgICAgIDw8ICIsIGN1cnJlbnRfbGNpZD0iIDw8IGxvZ2hleChwX21jYi0+bGNpZCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBfbWNiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NhdmVfbGNpZF9tY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBNQ0IgYmxvY2sgc3VwcG9ydGluZyBsb2NhbCBjaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfc2F2ZV9sY2lkX21jYih0UkZDX01DQiogcF9tY2IsIHVpbnQxNl90IGxjaWQpIHsKLSAgYXV0byBtY2JfaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGxjaWQpOwotICByZmNfbGNpZF9tY2JbbWNiX2luZGV4XSA9IHBfbWNiOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svcmZjb21tL3JmY19teF9mc20uY2MgYi9zdGFjay9yZmNvbW0vcmZjX214X2ZzbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3OTk2Yy4uMDAwMDAwMAotLS0gYS9zdGFjay9yZmNvbW0vcmZjX214X2ZzbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBzdGF0ZSBtYWNoaW5lIGFuZCBhY3Rpb24gcm91dGluZXMgZm9yIG11bHRpcGxleGVyCi0gKiAgY2hhbm5lbCBvZiB0aGUgUkZDT01NIHVuaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9wb3J0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfaW50LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2RlZmluZSBMMkNBUF9TVUNDRVNTIDAKLSNkZWZpbmUgTDJDQVBfRVJST1IgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICBMIE8gQyBBIEwgICAgRiBVIE4gQyBUIEkgTyBOICAgICBQIFIgTyBUIE8gVCBZIFAgRSBTICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZmNfbXhfc21fc3RhdGVfaWRsZSh0UkZDX01DQiogcF9tY2IsIHRSRkNfTVhfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgcmZjX214X3NtX3N0YXRlX3dhaXRfY29ubl9jbmYodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIHJmY19teF9zbV9zdGF0ZV9jb25maWd1cmUodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgcmZjX214X3NtX3NhYm1lX3dhaXRfdWEodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIHJmY19teF9zbV9zdGF0ZV93YWl0X3NhYm1lKHRSRkNfTUNCKiBwX21jYiwgdFJGQ19NWF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSk7Ci1zdGF0aWMgdm9pZCByZmNfbXhfc21fc3RhdGVfY29ubmVjdGVkKHRSRkNfTUNCKiBwX21jYiwgdFJGQ19NWF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIHJmY19teF9zbV9zdGF0ZV9kaXNjX3dhaXRfdWEodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotCi1zdGF0aWMgdm9pZCByZmNfbXhfY29uZl9pbmQodFJGQ19NQ0IqIHBfbWNiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKTsKLXN0YXRpYyB2b2lkIHJmY19teF9jb25mX2NuZih0UkZDX01DQiogcF9tY2IsIHVpbnQxNl90IHJlc3VsdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfbXhfc21fZXhlY3V0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBtdWx0aXBsZXhvciBldmVudHMgdGhyb3VnaCB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgbWFjaGluZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfbXhfc21fZXhlY3V0ZSh0UkZDX01DQiogcF9tY2IsIHRSRkNfTVhfRVZFTlQgZXZlbnQsIHZvaWQqIHBfZGF0YSkgewotICBDSEVDSyhwX21jYiAhPSBudWxscHRyKSA8PCBfX2Z1bmNfXyA8PCAiOiBOVUxMIG1jYiBmb3IgZXZlbnQgIiA8PCBldmVudDsKLQotICBMT0dfSU5GTygKLSAgICAgICJSRkNPTU0gcGVlcjolcyBldmVudDolZCBzdGF0ZTolcyIsIFBSSVZBVEVfQUREUkVTUyhwX21jYi0+YmRfYWRkciksCi0gICAgICBldmVudCwKLSAgICAgIHJmY29tbV9teF9zdGF0ZV90ZXh0KHN0YXRpY19jYXN0PHRSRkNfTVhfU1RBVEU+KHBfbWNiLT5zdGF0ZSkpLmNfc3RyKCkpOwotCi0gIHN3aXRjaCAocF9tY2ItPnN0YXRlKSB7Ci0gICAgY2FzZSBSRkNfTVhfU1RBVEVfSURMRToKLSAgICAgIHJmY19teF9zbV9zdGF0ZV9pZGxlKHBfbWNiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRkNfTVhfU1RBVEVfV0FJVF9DT05OX0NORjoKLSAgICAgIHJmY19teF9zbV9zdGF0ZV93YWl0X2Nvbm5fY25mKHBfbWNiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRkNfTVhfU1RBVEVfQ09ORklHVVJFOgotICAgICAgcmZjX214X3NtX3N0YXRlX2NvbmZpZ3VyZShwX21jYiwgZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkZDX01YX1NUQVRFX1NBQk1FX1dBSVRfVUE6Ci0gICAgICByZmNfbXhfc21fc2FibWVfd2FpdF91YShwX21jYiwgZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkZDX01YX1NUQVRFX1dBSVRfU0FCTUU6Ci0gICAgICByZmNfbXhfc21fc3RhdGVfd2FpdF9zYWJtZShwX21jYiwgZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkZDX01YX1NUQVRFX0NPTk5FQ1RFRDoKLSAgICAgIHJmY19teF9zbV9zdGF0ZV9jb25uZWN0ZWQocF9tY2IsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJGQ19NWF9TVEFURV9ESVNDX1dBSVRfVUE6Ci0gICAgICByZmNfbXhfc21fc3RhdGVfZGlzY193YWl0X3VhKHBfbWNiLCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgdW5leHBlY3RlZCBldmVudDolaHUgaW4gc3RhdGU6JWhodSIsIGV2ZW50LAotICAgICAgICAgICAgICAgIHBfbWNiLT5zdGF0ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19teF9zbV9zdGF0ZV9pZGxlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIG11bHRpcGxleGVyIGlzIGluCi0gKiAgICAgICAgICAgICAgICAgIElETEUgc3RhdGUuIFRoaXMgc3RhdGUgZXhpc3RzIHdoZW4gY29ubmVjdGlvbiBpcyBiZWluZwotICogICAgICAgICAgICAgICAgICBpbml0aWFsbHkgZXN0YWJsaXNoZWQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX214X3NtX3N0YXRlX2lkbGUodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUkZDX01YX0VWRU5UX1NUQVJUX1JFUTogewotICAgICAgLyogSW5pdGlhbGl6ZSBMMkNBUCBNVFUgKi8KLSAgICAgIHBfbWNiLT5wZWVyX2wyY2FwX210dSA9IEwyQ0FQX0RFRkFVTFRfTVRVIC0gUkZDT01NX01JTl9PRkZTRVQgLSAxOwotCi0gICAgICB1aW50MTZfdCBsY2lkID0gTDJDQV9Db25uZWN0UmVxKEJUX1BTTV9SRkNPTU0sIHBfbWNiLT5iZF9hZGRyKTsKLSAgICAgIGlmIChsY2lkID09IDApIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBmYWlsZWQgdG8gb3BlbiBMMkNBUCBjaGFubmVsIGZvciAiCi0gICAgICAgICAgICAgICAgICAgPDwgcF9tY2ItPmJkX2FkZHI7Ci0gICAgICAgIHJmY19zYXZlX2xjaWRfbWNiKG51bGxwdHIsIHBfbWNiLT5sY2lkKTsKLSAgICAgICAgcF9tY2ItPmxjaWQgPSAwOwotICAgICAgICBQT1JUX1N0YXJ0Q25mKHBfbWNiLCBSRkNPTU1fRVJST1IpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwX21jYi0+bGNpZCA9IGxjaWQ7Ci0gICAgICAvKiBTYXZlIGVudHJ5IGZvciBxdWlja2VyIGFjY2VzcyB0byBtY2IgYmFzZWQgb24gdGhlIExDSUQgKi8KLSAgICAgIHJmY19zYXZlX2xjaWRfbWNiKHBfbWNiLCBwX21jYi0+bGNpZCk7Ci0KLSAgICAgIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9XQUlUX0NPTk5fQ05GOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0NPTk5fSU5EOgotCi0gICAgICByZmNfdGltZXJfc3RhcnQocF9tY2IsIFJGQ09NTV9DT05OX1RJTUVPVVQpOwotCi0gICAgICBwX21jYi0+c3RhdGUgPSBSRkNfTVhfU1RBVEVfQ09ORklHVVJFOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfU0FCTUU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX1VBOgotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RNOgotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfRElTQzoKLSAgICAgIHJmY19zZW5kX2RtKHBfbWNiLCBSRkNPTU1fTVhfRExDSSwgdHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9VSUg6Ci0gICAgICByZmNfc2VuZF9kbShwX21jYiwgUkZDT01NX01YX0RMQ0ksIGZhbHNlKTsKLSAgICAgIHJldHVybjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIk14IGVycm9yIHN0YXRlICVkIGV2ZW50ICVkIiwgcF9tY2ItPnN0YXRlLCBldmVudCk7Ci0gICAgICByZXR1cm47Ci0gIH0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJSRkNPTU0gTVggaWdub3JlZCAtIGV2dDolZCBpbiBzdGF0ZTolZCIsIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPnN0YXRlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19teF9zbV9zdGF0ZV93YWl0X2Nvbm5fY25mCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIG11bHRpcGxleGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgIHdhaXRpbmcgZm9yIENvbm5lY3Rpb24gQ29uZmlybSBmcm9tIEwyQ0FQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19teF9zbV9zdGF0ZV93YWl0X2Nvbm5fY25mKHRSRkNfTUNCKiBwX21jYiwgdFJGQ19NWF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKSB7Ci0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiJXM6IGV2dCAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9TVEFSVF9SRVE6Ci0gICAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIk14IGVycm9yIHN0YXRlICVkIGV2ZW50ICVkIiwgcF9tY2ItPnN0YXRlLCBldmVudCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICAvKiBUaGVyZSBpcyBzb21lIG5ldyB0aW1pbmcgc28gdGhhdCBDb25maWcgSW5kIGNvbWVzIGJlZm9yZSBzZWN1cml0eSBpcwotICAgICAgIGNvbXBsZXRlZAotICAgICAgIHNvIHdlIGFyZSBzdGlsbCB3YWl0aW5nIGZvIHRoZSBjb25maXJtYXRpb24uICovCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfQ09ORl9JTkQ6Ci0gICAgICByZmNfbXhfY29uZl9pbmQocF9tY2IsICh0TDJDQVBfQ0ZHX0lORk8qKXBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9DT05OX0NORjoKLSAgICAgIGlmICgqKCh1aW50MTZfdCopcF9kYXRhKSAhPSBMMkNBUF9TVUNDRVNTKSB7Ci0gICAgICAgIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9JRExFOwotCi0gICAgICAgIFBPUlRfU3RhcnRDbmYocF9tY2IsICooKHVpbnQxNl90KilwX2RhdGEpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0NPTkZJR1VSRTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RJU0NfSU5EOgotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0lETEU7Ci0gICAgICBQT1JUX0Nsb3NlSW5kKHBfbWNiKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX1RJTUVPVVQ6Ci0gICAgICBwX21jYi0+c3RhdGUgPSBSRkNfTVhfU1RBVEVfSURMRTsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX21jYi0+bGNpZCk7Ci0KLSAgICAgIC8qIHdlIGdhdmUgdXAgb3V0Z29pbmcgY29ubmVjdGlvbiByZXF1ZXN0IHRoZW4gdHJ5IHBlZXIncyByZXF1ZXN0ICovCi0gICAgICBpZiAocF9tY2ItPnBlbmRpbmdfbGNpZCkgewotICAgICAgICB1aW50MTZfdCBpOwotICAgICAgICB1aW50OF90IGhhbmRsZTsKLQotICAgICAgICBSRkNPTU1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAiUkZDT01NIE1YIHJldHJ5IGFzIGFjY2VwdG9yIGluIGNvbGxpc2lvbiBjYXNlIC0gZXZ0OiVkIGluICIKLSAgICAgICAgICAgICJzdGF0ZTolZCIsCi0gICAgICAgICAgICBldmVudCwgcF9tY2ItPnN0YXRlKTsKLQotICAgICAgICByZmNfc2F2ZV9sY2lkX21jYihOVUxMLCBwX21jYi0+bGNpZCk7Ci0gICAgICAgIHBfbWNiLT5sY2lkID0gcF9tY2ItPnBlbmRpbmdfbGNpZDsKLSAgICAgICAgcmZjX3NhdmVfbGNpZF9tY2IocF9tY2IsIHBfbWNiLT5sY2lkKTsKLQotICAgICAgICBwX21jYi0+aXNfaW5pdGlhdG9yID0gZmFsc2U7Ci0KLSAgICAgICAgLyogdXBkYXRlIGRpcmVjdGlvbiBiaXQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFJGQ09NTV9NQVhfRExDSTsgaSArPSAyKSB7Ci0gICAgICAgICAgaGFuZGxlID0gcF9tY2ItPnBvcnRfaGFuZGxlc1tpXTsKLSAgICAgICAgICBpZiAoaGFuZGxlICE9IDApIHsKLSAgICAgICAgICAgIHBfbWNiLT5wb3J0X2hhbmRsZXNbaV0gPSAwOwotICAgICAgICAgICAgcF9tY2ItPnBvcnRfaGFuZGxlc1tpICsgMV0gPSBoYW5kbGU7Ci0gICAgICAgICAgICByZmNfY2IucG9ydC5wb3J0W2hhbmRsZSAtIDFdLmRsY2kgKz0gMTsKLSAgICAgICAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygiUkZDT01NIE1YIC0gRExDSTolZCAtPiAlZCIsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmZjX2NiLnBvcnQucG9ydFtoYW5kbGUgLSAxXS5kbGNpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZmNfbXhfc21fZXhlY3V0ZShwX21jYiwgUkZDX01YX0VWRU5UX0NPTk5fSU5ELCBudWxscHRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFBPUlRfQ2xvc2VJbmQocF9tY2IpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgZXZlbnQ6JWh1IGluIHN0YXRlOiVoaHUiLCBldmVudCwKLSAgICAgICAgICAgICAgICBwX21jYi0+c3RhdGUpOwotICB9Ci0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiUkZDT01NIE1YIGlnbm9yZWQgLSBldnQ6JWQgaW4gc3RhdGU6JWQiLCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIHBfbWNiLT5zdGF0ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfbXhfc21fc3RhdGVfY29uZmlndXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIG11bHRpcGxleGVyIGluIHRoZQotICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19teF9zbV9zdGF0ZV9jb25maWd1cmUodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIiVzOiBldmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9TVEFSVF9SRVE6Ci0gICAgY2FzZSBSRkNfTVhfRVZFTlRfQ09OTl9DTkY6Ci0KLSAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiTXggZXJyb3Igc3RhdGUgJWQgZXZlbnQgJWQiLCBwX21jYi0+c3RhdGUsIGV2ZW50KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0NPTkZfSU5EOgotICAgICAgcmZjX214X2NvbmZfaW5kKHBfbWNiLCAodEwyQ0FQX0NGR19JTkZPKilwX2RhdGEpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfQ09ORl9DTkY6Ci0gICAgICByZmNfbXhfY29uZl9jbmYocF9tY2IsICh1aW50cHRyX3QpcF9kYXRhKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RJU0NfSU5EOgotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0lETEU7Ci0gICAgICBQT1JUX0Nsb3NlSW5kKHBfbWNiKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX1RJTUVPVVQ6Ci0gICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEwyQ0FQIGNvbmZpZ3VyYXRpb24gdGltZW91dCBmb3IgIgotICAgICAgICAgICAgICAgICA8PCBwX21jYi0+YmRfYWRkcjsKLSAgICAgIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9JRExFOwotICAgICAgTDJDQV9EaXNjb25uZWN0UmVxKHBfbWNiLT5sY2lkKTsKLQotICAgICAgUE9SVF9TdGFydENuZihwX21jYiwgUkZDT01NX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGV2ZW50OiVodSBpbiBzdGF0ZTolaGh1IiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgcF9tY2ItPnN0YXRlKTsKLSAgfQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlJGQ09NTSBNWCBpZ25vcmVkIC0gZXZ0OiVkIGluIHN0YXRlOiVkIiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICBwX21jYi0+c3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX214X3NtX3NhYm1lX3dhaXRfdWEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiB0aGUgbXVsdGlwbGV4ZXIgc2VudAotICogICAgICAgICAgICAgICAgICBTQUJNRSBhbmQgaXMgd2FpdGluZyBmb3IgVUEgcmVwbHkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX214X3NtX3NhYm1lX3dhaXRfdWEodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB2b2lkKiBwX2RhdGEpIHsKLSAgUkZDT01NX1RSQUNFX0VWRU5UKCIlczogZXZlbnQgJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBSRkNfTVhfRVZFTlRfU1RBUlRfUkVROgotICAgIGNhc2UgUkZDX01YX0VWRU5UX0NPTk5fQ05GOgotICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJNeCBlcnJvciBzdGF0ZSAlZCBldmVudCAlZCIsIHBfbWNiLT5zdGF0ZSwgZXZlbnQpOwotICAgICAgcmV0dXJuOwotCi0gICAgLyogd29ya2Fyb3VuZDogd2UgZG9uJ3Qgc3VwcG9ydCByZWNvbmZpZyAqLwotICAgIC8qIGNvbW1lbnRlZCBvdXQgdW50aWwgd2Ugc3VwcG9ydCByZWNvbmZpZwotICAgIGNhc2UgUkZDX01YX0VWRU5UX0NPTkZfSU5EOgotICAgICAgICByZmNfbXhfY29uZl9pbmQgKHBfbWNiLCAodEwyQ0FQX0NGR19JTkZPICopcF9kYXRhKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfQ09ORl9DTkY6Ci0gICAgICAgIHJmY19teF9jb25mX2NuZiAocF9tY2IsICh0TDJDQVBfQ0ZHX0lORk8gKilwX2RhdGEpOwotICAgICAgICByZXR1cm47Ci0gICAgKi8KLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RJU0NfSU5EOgotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0lETEU7Ci0gICAgICBQT1JUX0Nsb3NlSW5kKHBfbWNiKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX1VBOgotICAgICAgcmZjX3RpbWVyX3N0b3AocF9tY2IpOwotCi0gICAgICBwX21jYi0+c3RhdGUgPSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgcF9tY2ItPnBlZXJfcmVhZHkgPSB0cnVlOwotCi0gICAgICBQT1JUX1N0YXJ0Q25mKHBfbWNiLCBSRkNPTU1fU1VDQ0VTUyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9ETToKLSAgICAgIHJmY190aW1lcl9zdG9wKHBfbWNiKTsKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfQ09ORl9JTkQ6IC8qIHdvcmthcm91bmQ6IHdlIGRvbid0IHN1cHBvcnQgcmVjb25maWcgKi8KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9DT05GX0NORjogLyogd29ya2Fyb3VuZDogd2UgZG9uJ3Qgc3VwcG9ydCByZWNvbmZpZyAqLwotICAgIGNhc2UgUkZDX01YX0VWRU5UX1RJTUVPVVQ6Ci0gICAgICBwX21jYi0+c3RhdGUgPSBSRkNfTVhfU1RBVEVfSURMRTsKLSAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX21jYi0+bGNpZCk7Ci0KLSAgICAgIFBPUlRfU3RhcnRDbmYocF9tY2IsIFJGQ09NTV9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgdW5leHBlY3RlZCBldmVudDolaHUgaW4gc3RhdGU6JWhodSIsIGV2ZW50LAotICAgICAgICAgICAgICAgIHBfbWNiLT5zdGF0ZSk7Ci0gIH0KLSAgUkZDT01NX1RSQUNFX0VWRU5UKCJSRkNPTU0gTVggaWdub3JlZCAtIGV2dDolZCBpbiBzdGF0ZTolZCIsIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPnN0YXRlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19teF9zbV9zdGF0ZV93YWl0X3NhYm1lCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIG11bHRpcGxleGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgIHdhaXRpbmcgZm9yIFNBQk1FIG9uIHRoZSBhY2NlcHRvciBzaWRlIGFmdGVyIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfbXhfc21fc3RhdGVfd2FpdF9zYWJtZSh0UkZDX01DQiogcF9tY2IsIHRSRkNfTVhfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIiVzOiBldmVudCAlZCIsIF9fZnVuY19fLCBldmVudCk7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9ESVNDX0lORDoKLSAgICAgIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9JRExFOwotICAgICAgUE9SVF9DbG9zZUluZChwX21jYik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9TQUJNRToKLSAgICAgIC8qIGlmIHdlIGdhdmUgdXAgb3V0Z29pbmcgY29ubmVjdGlvbiByZXF1ZXN0ICovCi0gICAgICBpZiAocF9tY2ItPnBlbmRpbmdfbGNpZCkgewotICAgICAgICBwX21jYi0+cGVuZGluZ19sY2lkID0gMDsKLQotICAgICAgICByZmNfc2VuZF91YShwX21jYiwgUkZDT01NX01YX0RMQ0kpOwotCi0gICAgICAgIHJmY190aW1lcl9zdG9wKHBfbWNiKTsKLSAgICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgcF9tY2ItPnBlZXJfcmVhZHkgPSB0cnVlOwotCi0gICAgICAgIC8qIE1YIGNoYW5uZWwgY29sbGlzaW9uIGhhcyBiZWVuIHJlc29sdmVkLCBjb250aW51ZSB0byBvcGVuIHBvcnRzICovCi0gICAgICAgIFBPUlRfU3RhcnRDbmYocF9tY2IsIFJGQ09NTV9TVUNDRVNTKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJmY190aW1lcl9zdG9wKHBfbWNiKTsKLSAgICAgICAgUE9SVF9TdGFydEluZChwX21jYik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9TVEFSVF9SU1A6Ci0gICAgICBpZiAoKigodWludDE2X3QqKXBfZGF0YSkgIT0gUkZDT01NX1NVQ0NFU1MpCi0gICAgICAgIHJmY19zZW5kX2RtKHBfbWNiLCBSRkNPTU1fTVhfRExDSSwgdHJ1ZSk7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgcmZjX3NlbmRfdWEocF9tY2IsIFJGQ09NTV9NWF9ETENJKTsKLQotICAgICAgICBwX21jYi0+c3RhdGUgPSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBwX21jYi0+cGVlcl9yZWFkeSA9IHRydWU7Ci0gICAgICAgIFBPUlRfU3RhcnRDbmYocF9tY2IsIFJGQ09NTV9TVUNDRVNTKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0NPTkZfSU5EOiAvKiB3b3JrYXJvdW5kOiB3ZSBkb24ndCBzdXBwb3J0IHJlY29uZmlnICovCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfQ09ORl9DTkY6IC8qIHdvcmthcm91bmQ6IHdlIGRvbid0IHN1cHBvcnQgcmVjb25maWcgKi8KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9USU1FT1VUOgotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0lETEU7Ci0gICAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEocF9tY2ItPmxjaWQpOwotCi0gICAgICBQT1JUX0Nsb3NlSW5kKHBfbWNiKTsKLSAgICAgIHJldHVybjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigiUkZDT01NIE1YIGlnbm9yZWQgLSBldnQ6JWQgaW4gc3RhdGU6JWQiLCBldmVudCwgcF9tY2ItPnN0YXRlKTsKLSAgfQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlJGQ09NTSBNWCBpZ25vcmVkIC0gZXZ0OiVkIGluIHN0YXRlOiVkIiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICBwX21jYi0+c3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX214X3NtX3N0YXRlX2Nvbm5lY3RlZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGV2ZW50cyB3aGVuIHRoZSBtdWx0aXBsZXhlciBpcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgQ09OTkVDVEVEIHN0YXRlCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX214X3NtX3N0YXRlX2Nvbm5lY3RlZCh0UkZDX01DQiogcF9tY2IsIHRSRkNfTVhfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogcF9kYXRhKSB7Ci0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiJXM6IGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLQotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBSRkNfTVhfRVZFTlRfVElNRU9VVDoKLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9DTE9TRV9SRVE6Ci0gICAgICByZmNfdGltZXJfc3RhcnQocF9tY2IsIFJGQ19ESVNDX1RJTUVPVVQpOwotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0RJU0NfV0FJVF9VQTsKLSAgICAgIHJmY19zZW5kX2Rpc2MocF9tY2IsIFJGQ09NTV9NWF9ETENJKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RJU0NfSU5EOgotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0lETEU7Ci0gICAgICBQT1JUX0Nsb3NlSW5kKHBfbWNiKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RJU0M6Ci0gICAgICAvKiBSZXBseSB3aXRoIFVBLiAgSWYgaW5pdGlhdG9yIGJyaW5nIGRvd24gTDJDQVAgY29ubmVjdGlvbiAqLwotICAgICAgLyogSWYgc2VydmVyIHdhaXQgZm9yIHNvbWUgdGltZSBpZiBjbGllbnQgZGVjaWRlIHRvIHJlaW5pdGlhdGUgY2hhbm5lbCAqLwotICAgICAgcmZjX3NlbmRfdWEocF9tY2IsIFJGQ09NTV9NWF9ETENJKTsKLSAgICAgIGlmIChwX21jYi0+aXNfaW5pdGlhdG9yKSB7Ci0gICAgICAgIEwyQ0FfRGlzY29ubmVjdFJlcShwX21jYi0+bGNpZCk7Ci0gICAgICB9Ci0gICAgICAvKiBub3RpZnkgYWxsIHBvcnRzIHRoYXQgY29ubmVjdGlvbiBpcyBnb25lICovCi0gICAgICBQT1JUX0Nsb3NlSW5kKHBfbWNiKTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGV2ZW50OiVodSBpbiBzdGF0ZTolaGh1IiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgcF9tY2ItPnN0YXRlKTsKLSAgfQotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIlJGQ09NTSBNWCBpZ25vcmVkIC0gZXZ0OiVkIGluIHN0YXRlOiVkIiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICBwX21jYi0+c3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX214X3NtX3N0YXRlX2Rpc2Nfd2FpdF91YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGV2ZW50cyB3aGVuIHRoZSBtdWx0aXBsZXhlciBzZW50Ci0gKiAgICAgICAgICAgICAgICAgIERJU0MgYW5kIGlzIHdhaXRpbmcgZm9yIFVBIHJlcGx5LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19teF9zbV9zdGF0ZV9kaXNjX3dhaXRfdWEodFJGQ19NQ0IqIHBfbWNiLCB0UkZDX01YX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBCVF9IRFIqIHBfYnVmOwotCi0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiJXM6IGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUkZDX01YX0VWRU5UX1VBOgotICAgIGNhc2UgUkZDX01YX0VWRU5UX0RNOgotICAgIGNhc2UgUkZDX01YX0VWRU5UX1RJTUVPVVQ6Ci0gICAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEocF9tY2ItPmxjaWQpOwotCi0gICAgICBpZiAocF9tY2ItPnJlc3RhcnRfcmVxdWlyZWQpIHsKLSAgICAgICAgLyogU3RhcnQgUmVxdWVzdCB3YXMgcmVjZWl2ZWQgd2hpbGUgZGlzY29ubmVjdGluZy4gIEV4ZWN1dGUgaXQgYWdhaW4gKi8KLSAgICAgICAgdWludDE2X3QgbGNpZCA9IEwyQ0FfQ29ubmVjdFJlcShCVF9QU01fUkZDT01NLCBwX21jYi0+YmRfYWRkcik7Ci0gICAgICAgIGlmIChsY2lkID09IDApIHsKLSAgICAgICAgICByZmNfc2F2ZV9sY2lkX21jYihOVUxMLCBwX21jYi0+bGNpZCk7Ci0gICAgICAgICAgcF9tY2ItPmxjaWQgPSAwOwotICAgICAgICAgIFBPUlRfU3RhcnRDbmYocF9tY2IsIFJGQ09NTV9FUlJPUik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBfbWNiLT5sY2lkID0gbGNpZDsKLSAgICAgICAgLyogU2F2ZSBlbnRyeSBmb3IgcXVpY2tlciBhY2Nlc3MgdG8gbWNiIGJhc2VkIG9uIHRoZSBMQ0lEICovCi0gICAgICAgIHJmY19zYXZlX2xjaWRfbWNiKHBfbWNiLCBwX21jYi0+bGNpZCk7Ci0KLSAgICAgICAgLyogY2xlYW4gdXAgYmVmb3JlIHJldXNlIGl0ICovCi0gICAgICAgIHdoaWxlICgocF9idWYgPSAoQlRfSERSKilmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZShwX21jYi0+Y21kX3EpKSAhPSBOVUxMKQotICAgICAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgICAgICByZmNfdGltZXJfc3RhcnQocF9tY2IsIFJGQ19NQ0JfSU5JVF9JTkFDVF9USU1FUik7Ci0KLSAgICAgICAgcF9tY2ItPmlzX2luaXRpYXRvciA9IHRydWU7Ci0gICAgICAgIHBfbWNiLT5yZXN0YXJ0X3JlcXVpcmVkID0gZmFsc2U7Ci0KLSAgICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX1dBSVRfQ09OTl9DTkY7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJmY19yZWxlYXNlX211bHRpcGxleGVyX2NoYW5uZWwocF9tY2IpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfTVhfRVZFTlRfRElTQzoKLSAgICAgIHJmY19zZW5kX3VhKHBfbWNiLCBSRkNPTU1fTVhfRExDSSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9VSUg6Ci0gICAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgICAgcmZjX3NlbmRfZG0ocF9tY2IsIFJGQ09NTV9NWF9ETENJLCBmYWxzZSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9TVEFSVF9SRVE6Ci0gICAgICBwX21jYi0+cmVzdGFydF9yZXF1aXJlZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9ESVNDX0lORDoKLSAgICAgIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9JRExFOwotICAgICAgUE9SVF9DbG9zZUluZChwX21jYik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9DTE9TRV9SRVE6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19NWF9FVkVOVF9RT1NfVklPTEFUSU9OX0lORDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgZXZlbnQ6JWh1IGluIHN0YXRlOiVoaHUiLCBldmVudCwKLSAgICAgICAgICAgICAgICBwX21jYi0+c3RhdGUpOwotICB9Ci0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiUkZDT01NIE1YIGlnbm9yZWQgLSBldnQ6JWQgaW4gc3RhdGU6JWQiLCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIHBfbWNiLT5zdGF0ZSk7Ci19Ci0KLXZvaWQgcmZjX29uX2wyY2FwX2Vycm9yKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0UkZDX01DQiogcF9tY2IgPSByZmNfZmluZF9sY2lkX21jYihsY2lkKTsKLSAgaWYgKHBfbWNiID09IG51bGxwdHIpIHJldHVybjsKLQotICBpZiAocmVzdWx0ID09IEwyQ0FQX0NPTk5fT1RIRVJfRVJST1IpIHsKLSAgICAvKiBpZiBwZWVyIHJlamVjdHMgb3VyIGNvbm5lY3QgcmVxdWVzdCBidXQgcGVlcidzIGNvbm5lY3QgcmVxdWVzdCBpcyBwZW5kaW5nCi0gICAgICovCi0gICAgaWYgKHBfbWNiLT5wZW5kaW5nX2xjaWQpIHsKLSAgICAgIFJGQ09NTV9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiUkZDT01NX0Nvbm5lY3RDbmYgcmV0cnkgYXMgYWNjZXB0b3Igb24gcGVuZGluZyBMQ0lEKDB4JXgpIiwKLSAgICAgICAgICBwX21jYi0+cGVuZGluZ19sY2lkKTsKLQotICAgICAgLyogcmVtb3ZlIG1jYiBmcm9tIG1hcHBpbmcgdGFibGUgKi8KLSAgICAgIHJmY19zYXZlX2xjaWRfbWNiKE5VTEwsIHBfbWNiLT5sY2lkKTsKLQotICAgICAgcF9tY2ItPmxjaWQgPSBwX21jYi0+cGVuZGluZ19sY2lkOwotICAgICAgcF9tY2ItPmlzX2luaXRpYXRvciA9IGZhbHNlOwotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX0lETEU7Ci0KLSAgICAgIC8qIHN0b3JlIG1jYiBpbnRvIG1hcHBpbmcgdGFibGUgKi8KLSAgICAgIHJmY19zYXZlX2xjaWRfbWNiKHBfbWNiLCBwX21jYi0+bGNpZCk7Ci0KLSAgICAgIC8qIHVwZGF0ZSBkaXJlY3Rpb24gYml0ICovCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJGQ09NTV9NQVhfRExDSTsgaSArPSAyKSB7Ci0gICAgICAgIHVpbnQ4X3QgaGFuZGxlID0gcF9tY2ItPnBvcnRfaGFuZGxlc1tpXTsKLSAgICAgICAgaWYgKGhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgcF9tY2ItPnBvcnRfaGFuZGxlc1tpXSA9IDA7Ci0gICAgICAgICAgcF9tY2ItPnBvcnRfaGFuZGxlc1tpICsgMV0gPSBoYW5kbGU7Ci0gICAgICAgICAgcmZjX2NiLnBvcnQucG9ydFtoYW5kbGUgLSAxXS5kbGNpICs9IDE7Ci0gICAgICAgICAgUkZDT01NX1RSQUNFX0RFQlVHKCJSRkNPTU0gTVgsIHBvcnRfaGFuZGxlPSVkLCBETENJWyVkLT4lZF0iLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJmY19jYi5wb3J0LnBvcnRbaGFuZGxlIC0gMV0uZGxjaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfQ09OTl9JTkQsIG51bGxwdHIpOwotICAgICAgaWYgKHBfbWNiLT5wZW5kaW5nX2NvbmZpZ3VyZV9jb21wbGV0ZSkgewotICAgICAgICBMT0dfSU5GTygiQ29uZmlndXJhdGlvbiBvZiB0aGUgcGVuZGluZyBjb25uZWN0aW9uIHdhcyBjb21wbGV0ZWQiKTsKLSAgICAgICAgcF9tY2ItPnBlbmRpbmdfY29uZmlndXJlX2NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgIHVpbnRwdHJfdCByZXN1bHRfYXNfcHRyID0gTDJDQVBfQ0ZHX09LOwotICAgICAgICByZmNfbXhfc21fZXhlY3V0ZShwX21jYiwgUkZDX01YX0VWRU5UX0NPTkZfSU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9tY2ItPnBlbmRpbmdfY2ZnX2luZm8pOwotICAgICAgICByZmNfbXhfc21fZXhlY3V0ZShwX21jYiwgUkZDX01YX0VWRU5UX0NPTkZfQ05GLCAodm9pZCopcmVzdWx0X2FzX3B0cik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcF9tY2ItPmxjaWQgPSBsY2lkOwotICAgIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfQ09OTl9DTkYsICZyZXN1bHQpOwotICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBMMkNBUF9DRkdfRkFJTEVEX05PX1JFQVNPTikgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZmFpbGVkIHRvIGNvbmZpZ3VyZSBMMkNBUCBmb3IgIgotICAgICAgICAgICAgICAgPDwgcF9tY2ItPmJkX2FkZHI7Ci0gICAgaWYgKHBfbWNiLT5pc19pbml0aWF0b3IpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogZGlzY29ubmVjdCBMMkNBUCBkdWUgdG8gY29uZmlnIGZhaWx1cmUgZm9yICIKLSAgICAgICAgICAgICAgICAgPDwgcF9tY2ItPmJkX2FkZHI7Ci0gICAgICBQT1JUX1N0YXJ0Q25mKHBfbWNiLCByZXN1bHQpOwotICAgICAgTDJDQV9EaXNjb25uZWN0UmVxKHBfbWNiLT5sY2lkKTsKLSAgICB9Ci0gICAgcmZjX3JlbGVhc2VfbXVsdGlwbGV4ZXJfY2hhbm5lbChwX21jYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19teF9jb25mX2NuZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEwyQ0FfQ29uZmlnQ25mIG1lc3NhZ2UgZnJvbSB0aGUKLSAqICAgICAgICAgICAgICAgICAgTDJDQVAuICBJZiByZXN1bHQgaXMgbm90IHN1Y2Nlc3MgdGVsbCB1cHBlciBsYXllciB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIHN0YXJ0IGhhcyBub3QgYmVlbiBhY2NlcHRlZC4gIElmIGluaXRpYXRvciBzZW5kIFNBQk1FCi0gKiAgICAgICAgICAgICAgICAgIG9uIERMQ0kgMC4gIFQxIGlzIHN0aWxsIHJ1bm5pbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJmY19teF9jb25mX2NuZih0UkZDX01DQiogcF9tY2IsIHVpbnQxNl90IHJlc3VsdCkgewotICBpZiAocF9tY2ItPnN0YXRlID09IFJGQ19NWF9TVEFURV9DT05GSUdVUkUpIHsKLSAgICBpZiAocF9tY2ItPmlzX2luaXRpYXRvcikgewotICAgICAgcF9tY2ItPnN0YXRlID0gUkZDX01YX1NUQVRFX1NBQk1FX1dBSVRfVUE7Ci0gICAgICByZmNfc2VuZF9zYWJtZShwX21jYiwgUkZDT01NX01YX0RMQ0kpOwotICAgICAgcmZjX3RpbWVyX3N0YXJ0KHBfbWNiLCBSRkNfVDFfVElNRU9VVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9XQUlUX1NBQk1FOwotICAgICAgcmZjX3RpbWVyX3N0YXJ0KAotICAgICAgICAgIHBfbWNiLCBSRkNPTU1fQ09OTl9USU1FT1VUKTsgLyogLSBpbmNyZWFzZWQgZnJvbSBUMj0yMCB0byBDT05OPTEyMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGxvdyB0aGUgdXNlciBtb3JlIHRoYW4gMTAgc2VjIHRvIHR5cGUgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbiB3aGljaCBjYW4gYmUgZS5nLiAxNiBkaWdpdHMgKi8KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19teF9jb25mX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEwyQ0FfQ29uZmlnSW5kIG1lc3NhZ2UgZnJvbSB0aGUKLSAqICAgICAgICAgICAgICAgICAgTDJDQVAuICBTZW5kIHRoZSBMMkNBX0NvbmZpZ1JzcCBtZXNzYWdlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZmNfbXhfY29uZl9pbmQodFJGQ19NQ0IqIHBfbWNiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIC8qIFNhdmUgcGVlciBMMkNBUCBNVFUgaWYgcHJlc2VudCAqLwotICAvKiBSRkNPTU0gYWRkcyAzLTQgYnl0ZXMgaW4gdGhlIGJlZ2lubmluZyBhbmQgMSBieXRlcyBGQ1MgKi8KLSAgaWYgKHBfY2ZnLT5tdHVfcHJlc2VudCkgewotICAgIHBfbWNiLT5wZWVyX2wyY2FwX210dSA9IHBfY2ZnLT5tdHUgLSBSRkNPTU1fTUlOX09GRlNFVCAtIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcF9tY2ItPnBlZXJfbDJjYXBfbXR1ID0gTDJDQVBfREVGQVVMVF9NVFUgLSBSRkNPTU1fTUlOX09GRlNFVCAtIDE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3JmY29tbS9yZmNfcG9ydF9mc20uY2MgYi9zdGFjay9yZmNvbW0vcmZjX3BvcnRfZnNtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmE3MjczLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3JmY29tbS9yZmNfcG9ydF9mc20uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgc3RhdGUgbWFjaGluZSBhbmQgYWN0aW9uIHJvdXRpbmVzIGZvciBhIHBvcnQgb2YgdGhlCi0gKiAgUkZDT01NIHVuaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImhjaS9pbmNsdWRlL2J0c25vb3AuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9wb3J0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfaW50LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotc3RhdGljIGNvbnN0IHN0ZDo6c2V0PHVpbnQxNl90PiB1dWlkX2xvZ2dpbmdfYWNjZXB0bGlzdCA9IHsKLSAgICBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVksCi0gICAgVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcmZjX3BvcnRfc21fc3RhdGVfY2xvc2VkKHRQT1JUKiBwX3BvcnQsIHRSRkNfUE9SVF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgcmZjX3BvcnRfc21fc2FibWVfd2FpdF91YSh0UE9SVCogcF9wb3J0LCB0UkZDX1BPUlRfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSk7Ci1zdGF0aWMgdm9pZCByZmNfcG9ydF9zbV9vcGVuZWQodFBPUlQqIHBfcG9ydCwgdFJGQ19QT1JUX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSk7Ci1zdGF0aWMgdm9pZCByZmNfcG9ydF9zbV9vcmlnX3dhaXRfc2VjX2NoZWNrKHRQT1JUKiBwX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRSRkNfUE9SVF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIHJmY19wb3J0X3NtX3Rlcm1fd2FpdF9zZWNfY2hlY2sodFBPUlQqIHBfcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFJGQ19QT1JUX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotc3RhdGljIHZvaWQgcmZjX3BvcnRfc21fZGlzY193YWl0X3VhKHRQT1JUKiBwX3BvcnQsIHRSRkNfUE9SVF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpOwotCi1zdGF0aWMgdm9pZCByZmNfcG9ydF91cGxpbmtfZGF0YSh0UE9SVCogcF9wb3J0LCBCVF9IRFIqIHBfYnVmKTsKLQotc3RhdGljIHZvaWQgcmZjX3NldF9wb3J0X3N0YXRlKHRQT1JUX1NUQVRFKiBwb3J0X3BhcnMsIE1YX0ZSQU1FKiBwX2ZyYW1lKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wb3J0X3NtX2V4ZWN1dGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgcG9ydCBldmVudHMgdGhyb3VnaCB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgbWFjaGluZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfcG9ydF9zbV9leGVjdXRlKHRQT1JUKiBwX3BvcnQsIHRSRkNfUE9SVF9FVkVOVCBldmVudCwgdm9pZCogcF9kYXRhKSB7Ci0gIENIRUNLKHBfcG9ydCAhPSBudWxscHRyKSA8PCBfX2Z1bmNfXyA8PCAiOiBOVUxMIHBvcnQgZXZlbnQgIiA8PCBldmVudDsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBCRF9BRERSPSIgPDwgcF9wb3J0LT5iZF9hZGRyCi0gICAgICAgICAgPDwgIiwgUE9SVD0iIDw8IHN0ZDo6dG9fc3RyaW5nKHBfcG9ydC0+aGFuZGxlKQotICAgICAgICAgIDw8ICIsIFNUQVRFPSIgPDwgc3RkOjp0b19zdHJpbmcocF9wb3J0LT5yZmMuc3RhdGUpCi0gICAgICAgICAgPDwgIiwgRVZFTlQ9IiA8PCBldmVudDsKLSAgc3dpdGNoIChwX3BvcnQtPnJmYy5zdGF0ZSkgewotICAgIGNhc2UgUkZDX1NUQVRFX0NMT1NFRDoKLSAgICAgIHJmY19wb3J0X3NtX3N0YXRlX2Nsb3NlZChwX3BvcnQsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJGQ19TVEFURV9TQUJNRV9XQUlUX1VBOgotICAgICAgcmZjX3BvcnRfc21fc2FibWVfd2FpdF91YShwX3BvcnQsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJGQ19TVEFURV9PUklHX1dBSVRfU0VDX0NIRUNLOgotICAgICAgcmZjX3BvcnRfc21fb3JpZ193YWl0X3NlY19jaGVjayhwX3BvcnQsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJGQ19TVEFURV9URVJNX1dBSVRfU0VDX0NIRUNLOgotICAgICAgcmZjX3BvcnRfc21fdGVybV93YWl0X3NlY19jaGVjayhwX3BvcnQsIGV2ZW50LCBwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJGQ19TVEFURV9PUEVORUQ6Ci0gICAgICByZmNfcG9ydF9zbV9vcGVuZWQocF9wb3J0LCBldmVudCwgcF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRkNfU1RBVEVfRElTQ19XQUlUX1VBOgotICAgICAgcmZjX3BvcnRfc21fZGlzY193YWl0X3VhKHBfcG9ydCwgZXZlbnQsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3BvcnRfc21fc3RhdGVfY2xvc2VkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZXZlbnRzIHdoZW4gdGhlIHBvcnQgaXMgaW4KLSAqICAgICAgICAgICAgICAgICAgQ0xPU0VEIHN0YXRlLiBUaGlzIHN0YXRlIGV4aXN0cyB3aGVuIHBvcnQgaXMKLSAqICAgICAgICAgICAgICAgICAgYmVpbmcgaW5pdGlhbGx5IGVzdGFibGlzaGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wb3J0X3NtX3N0YXRlX2Nsb3NlZCh0UE9SVCogcF9wb3J0LCB0UkZDX1BPUlRfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgdWludDMyX3Qgc2NuID0gKHVpbnQzMl90KShwX3BvcnQtPmRsY2kgLyAyKTsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfT1BFTjoKLSAgICAgIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX09SSUdfV0FJVF9TRUNfQ0hFQ0s7Ci0gICAgICBpZiAocmZjb21tX3NlY3VyaXR5X3JlY29yZHMuY291bnQoc2NuKSA9PSAwKSB7Ci0gICAgICAgIHJmY19zZWNfY2hlY2tfY29tcGxldGUobnVsbHB0ciwgQlRfVFJBTlNQT1JUX0JSX0VEUiwgcF9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0KHBfcG9ydC0+cmZjLnBfbWNiLT5iZF9hZGRyLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZmNvbW1fc2VjdXJpdHlfcmVjb3Jkc1tzY25dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmZjX3NlY19jaGVja19jb21wbGV0ZSwgcF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfQ0xPU0U6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfQ0xFQVI6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0RBVEE6Ci0gICAgICBvc2lfZnJlZShwX2RhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1NBQk1FOgotICAgICAgLyogbWFrZSBzdXJlIHRoZSBtdWx0aXBsZXhlciBkaXNjb25uZWN0IHRpbWVyIGlzIG5vdCBydW5uaW5nIChyZWNvbm5lY3QKLSAgICAgICAqIGNhc2UpICovCi0gICAgICByZmNfdGltZXJfc3RvcChwX3BvcnQtPnJmYy5wX21jYik7Ci0KLSAgICAgIC8qIE9wZW4gd2lsbCBiZSBjb250aW51ZWQgYWZ0ZXIgc2VjdXJpdHkgY2hlY2tzIGFyZSBwYXNzZWQgKi8KLSAgICAgIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX1RFUk1fV0FJVF9TRUNfQ0hFQ0s7Ci0gICAgICBpZiAocmZjb21tX3NlY3VyaXR5X3JlY29yZHMuY291bnQoc2NuKSA9PSAwKSB7Ci0gICAgICAgIHJmY19zZWNfY2hlY2tfY29tcGxldGUobnVsbHB0ciwgQlRfVFJBTlNQT1JUX0JSX0VEUiwgcF9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9OT19SRVNPVVJDRVMpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0KHBfcG9ydC0+cmZjLnBfbWNiLT5iZF9hZGRyLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZmNvbW1fc2VjdXJpdHlfcmVjb3Jkc1tzY25dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmZjX3NlY19jaGVja19jb21wbGV0ZSwgcF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVUE6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0RNOgotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBSRkNfRVZFTlRfRE0sIGluZGV4PSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPmhhbmRsZSk7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVUlIOgotICAgICAgb3NpX2ZyZWUocF9kYXRhKTsKLSAgICAgIHJmY19zZW5kX2RtKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksIGZhbHNlKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfRElTQzoKLSAgICAgIHJmY19zZW5kX2RtKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksIGZhbHNlKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVElNRU9VVDoKLSAgICAgIFBvcnRfVGltZU91dENsb3NlTXV4KHBfcG9ydC0+cmZjLnBfbWNiKTsKLSAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiUG9ydCBlcnJvciBzdGF0ZSAlZCBldmVudCAlZCIsIHBfcG9ydC0+cmZjLnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGV2ZW50OiVodSBpbiBzdGF0ZTolaGh1IiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgcF9wb3J0LT5yZmMuc3RhdGUpOwotICB9Ci0KLSAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIlBvcnQgc3RhdGUgY2xvc2VkIEV2ZW50IGlnbm9yZWQgJWQiLCBldmVudCk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wb3J0X3NtX3NhYm1lX3dhaXRfdWEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiBTQUJNRSBvbiB0aGUgRExDIHdhcwotICogICAgICAgICAgICAgICAgICBzZW50IGFuZCBTTSBpcyB3YWl0aW5nIGZvciBVQSBvciBETS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfcG9ydF9zbV9zYWJtZV93YWl0X3VhKHRQT1JUKiBwX3BvcnQsIHRSRkNfUE9SVF9FVkVOVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfT1BFTjoKLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0VTVEFCTElTSF9SU1A6Ci0gICAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIlBvcnQgZXJyb3Igc3RhdGUgJWQgZXZlbnQgJWQiLCBwX3BvcnQtPnJmYy5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0NMT1NFOgotICAgICAgcmZjX3BvcnRfdGltZXJfc3RhcnQocF9wb3J0LCBSRkNfRElTQ19USU1FT1VUKTsKLSAgICAgIHJmY19zZW5kX2Rpc2MocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICBwX3BvcnQtPnJmYy5leHBlY3RlZF9yc3AgPSAwOwotICAgICAgcF9wb3J0LT5yZmMuc3RhdGUgPSBSRkNfU1RBVEVfRElTQ19XQUlUX1VBOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9DTEVBUjoKLSAgICAgIFJGQ09NTV9UUkFDRV9XQVJOSU5HKCIlcywgUkZDX1BPUlRfRVZFTlRfQ0xFQVIsIGluZGV4PSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPmhhbmRsZSk7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfREFUQToKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVUE6Ci0gICAgICByZmNfcG9ydF90aW1lcl9zdG9wKHBfcG9ydCk7Ci0gICAgICBwX3BvcnQtPnJmYy5zdGF0ZSA9IFJGQ19TVEFURV9PUEVORUQ7Ci0KLSAgICAgIGlmICh1dWlkX2xvZ2dpbmdfYWNjZXB0bGlzdC5maW5kKHBfcG9ydC0+dXVpZCkgIT0KLSAgICAgICAgICB1dWlkX2xvZ2dpbmdfYWNjZXB0bGlzdC5lbmQoKSkgewotICAgICAgICBidHNub29wX2dldF9pbnRlcmZhY2UoKS0+YWxsb3dsaXN0X3JmY19kbGNpKHBfcG9ydC0+cmZjLnBfbWNiLT5sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICB9Ci0KLSAgICAgIFBPUlRfRGxjRXN0YWJsaXNoQ25mKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPnJmYy5wX21jYi0+cGVlcl9sMmNhcF9tdHUsIFJGQ09NTV9TVUNDRVNTKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfRE06Ci0gICAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiJXMsIFJGQ19FVkVOVF9ETSwgaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgIHBfcG9ydC0+cmZjLnBfbWNiLT5pc19kaXNjX2luaXRpYXRvciA9IHRydWU7Ci0gICAgICBQT1JUX0RsY0VzdGFibGlzaENuZihwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0LT5yZmMucF9tY2ItPnBlZXJfbDJjYXBfbXR1LCBSRkNPTU1fRVJST1IpOwotICAgICAgcmZjX3BvcnRfY2xvc2VkKHBfcG9ydCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0RJU0M6Ci0gICAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiJXMsIFJGQ19FVkVOVF9ESVNDLCBpbmRleD0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0LT5oYW5kbGUpOwotICAgICAgcmZjX3NlbmRfdWEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICBQT1JUX0RsY0VzdGFibGlzaENuZihwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0LT5yZmMucF9tY2ItPnBlZXJfbDJjYXBfbXR1LCBSRkNPTU1fRVJST1IpOwotICAgICAgcmZjX3BvcnRfY2xvc2VkKHBfcG9ydCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1NBQk1FOgotICAgICAgLyogQ29udGludWUgdG8gd2FpdCBmb3IgdGhlIFVBIHRoZSBTQUJNRSB0aGlzIHNpZGUgc2VudCAqLwotICAgICAgcmZjX3NlbmRfdWEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1VJSDoKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1RJTUVPVVQ6Ci0gICAgICBwX3BvcnQtPnJmYy5zdGF0ZSA9IFJGQ19TVEFURV9DTE9TRUQ7Ci0gICAgICBQT1JUX0RsY0VzdGFibGlzaENuZihwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0LT5yZmMucF9tY2ItPnBlZXJfbDJjYXBfbXR1LCBSRkNPTU1fRVJST1IpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgZXZlbnQ6JWh1IGluIHN0YXRlOiVoaHUiLCBldmVudCwKLSAgICAgICAgICAgICAgICBwX3BvcnQtPnJmYy5zdGF0ZSk7Ci0gIH0KLSAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIlBvcnQgc3RhdGUgc2FibWVfd2FpdF91YSBFdmVudCBpZ25vcmVkICVkIiwgZXZlbnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3BvcnRfc21fdGVybV93YWl0X3NlY19jaGVjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGV2ZW50cyBmb3IgdGhlIHBvcnQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgIFdBSVRfU0VDX0NIRUNLIHN0YXRlLiAgU0FCTUUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGVlciBhbmQgU2VjdXJpdHkgTWFuYWdlciB2ZXJpZmVzIGFkZHJlc3MsIGJlZm9yZSB3ZSBjYW4KLSAqICAgICAgICAgICAgICAgICAgc2VuZCBFU1RBQkxJU0hfSU5EIHRvIHRoZSBQb3J0IGVudGl0eQotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wb3J0X3NtX3Rlcm1fd2FpdF9zZWNfY2hlY2sodFBPUlQqIHBfcG9ydCwgdFJGQ19QT1JUX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfZGF0YSkgewotICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9TRUNfQ09NUExFVEU6Ci0gICAgICBpZiAoKigodWludDhfdCopcF9kYXRhKSAhPSBCVE1fU1VDQ0VTUykgewotICAgICAgICAvKiBBdXRoZW50aWNhdGlvbi9hdXRob3JpemF0aW9uIGZhaWxlZC4gIElmIGxpbmsgaXMgc3RpbGwgICovCi0gICAgICAgIC8qIHVwIHNlbmQgRE0gYW5kIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3RhcnQgaW5hY3RpdmUgdGltZXIgKi8KLSAgICAgICAgaWYgKHBfcG9ydC0+cmZjLnBfbWNiKSB7Ci0gICAgICAgICAgcmZjX3NlbmRfZG0ocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgdHJ1ZSk7Ci0gICAgICAgICAgcF9wb3J0LT5yZmMucF9tY2ItPmlzX2Rpc2NfaW5pdGlhdG9yID0gdHJ1ZTsKLSAgICAgICAgICBwb3J0X3JmY19jbG9zZWQocF9wb3J0LCBQT1JUX1NFQ19GQUlMRUQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBQT1JUX0RsY0VzdGFibGlzaEluZChwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPnJmYy5wX21jYi0+cGVlcl9sMmNhcF9tdHUpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9PUEVOOgotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfQ0xPU0U6Ci0gICAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIlBvcnQgZXJyb3Igc3RhdGUgJWQgZXZlbnQgJWQiLCBwX3BvcnQtPnJmYy5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0NMRUFSOgotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBSRkNfUE9SVF9FVkVOVF9DTEVBUiwgaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgIGJ0bV9zZWNfYWJvcnRfYWNjZXNzX3JlcShwX3BvcnQtPnJmYy5wX21jYi0+YmRfYWRkcik7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfREFUQToKLSAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiUG9ydCBlcnJvciBzdGF0ZSBUZXJtIFdhaXQgU2VjIGV2ZW50IERhdGEiKTsKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1NBQk1FOgotICAgICAgLyogSWdub3JlIFNBQk1FIHJldHJhbnNtaXNzaW9uIGlmIGNsaWVudCBkYXJlcyB0byBkbyBzbyAqLwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9ESVNDOgotICAgICAgYnRtX3NlY19hYm9ydF9hY2Nlc3NfcmVxKHBfcG9ydC0+cmZjLnBfbWNiLT5iZF9hZGRyKTsKLSAgICAgIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX0NMT1NFRDsKLSAgICAgIHJmY19zZW5kX3VhKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2kpOwotCi0gICAgICBQT1JUX0RsY1JlbGVhc2VJbmQocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1VJSDoKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0VTVEFCTElTSF9SU1A6Ci0gICAgICBpZiAoKigodWludDhfdCopcF9kYXRhKSAhPSBSRkNPTU1fU1VDQ0VTUykgewotICAgICAgICBpZiAocF9wb3J0LT5yZmMucF9tY2IpCi0gICAgICAgICAgcmZjX3NlbmRfZG0ocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgdHJ1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZmNfc2VuZF91YShwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpKTsKLSAgICAgICAgcF9wb3J0LT5yZmMuc3RhdGUgPSBSRkNfU1RBVEVfT1BFTkVEOwotCi0gICAgICAgIGlmICh1dWlkX2xvZ2dpbmdfYWNjZXB0bGlzdC5maW5kKHBfcG9ydC0+dXVpZCkgIT0KLSAgICAgICAgICAgIHV1aWRfbG9nZ2luZ19hY2NlcHRsaXN0LmVuZCgpKSB7Ci0gICAgICAgICAgYnRzbm9vcF9nZXRfaW50ZXJmYWNlKCktPmFsbG93bGlzdF9yZmNfZGxjaShwX3BvcnQtPnJmYy5wX21jYi0+bGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0VSUk9SKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGV2ZW50OiVodSBpbiBzdGF0ZTolaGh1IiwgZXZlbnQsCi0gICAgICAgICAgICAgICAgcF9wb3J0LT5yZmMuc3RhdGUpOwotICB9Ci0gIFJGQ09NTV9UUkFDRV9XQVJOSU5HKCJQb3J0IHN0YXRlIHRlcm1fd2FpdF9zZWNfY2hlY2sgRXZlbnQgaWdub3JlZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wb3J0X3NtX29yaWdfd2FpdF9zZWNfY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgZm9yIHRoZSBwb3J0IGluIHRoZQotICogICAgICAgICAgICAgICAgICBPUklHX1dBSVRfU0VDX0NIRUNLIHN0YXRlLiAgUkZDT01NIGlzIHdhaXRpbmcgZm9yIFNlY3VyaXR5Ci0gKiAgICAgICAgICAgICAgICAgIG1hbmFnZXIgdG8gZmluaXNoIGJlZm9yZSBzZW5kaW5nIFNBQk1FIHRvIHRoZSBwZWVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3BvcnRfc21fb3JpZ193YWl0X3NlY19jaGVjayh0UE9SVCogcF9wb3J0LCB0UkZDX1BPUlRfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9kYXRhKSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1NFQ19DT01QTEVURToKLSAgICAgIGlmICgqKCh1aW50OF90KilwX2RhdGEpICE9IEJUTV9TVUNDRVNTKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICIlcywgUkZDX1BPUlRfRVZFTlRfU0VDX0NPTVBMRVRFLCBpbmRleD0lZCwgcmVzdWx0PSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICBldmVudCwgcF9wb3J0LT5oYW5kbGUsICooKHVpbnQ4X3QqKXBfZGF0YSkpOwotICAgICAgICBwX3BvcnQtPnJmYy5wX21jYi0+aXNfZGlzY19pbml0aWF0b3IgPSB0cnVlOwotICAgICAgICBQT1JUX0RsY0VzdGFibGlzaENuZihwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRkNPTU1fU0VDVVJJVFlfRVJSKTsKLSAgICAgICAgcmZjX3BvcnRfY2xvc2VkKHBfcG9ydCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJmY19zZW5kX3NhYm1lKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2kpOwotICAgICAgcmZjX3BvcnRfdGltZXJfc3RhcnQocF9wb3J0LCBSRkNfUE9SVF9UMV9USU1FT1VUKTsKLSAgICAgIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX1NBQk1FX1dBSVRfVUE7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX09QRU46Ci0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9TQUJNRTogLyogUGVlciBzaG91bGQgbm90IHVzZSB0aGUgc2FtZSBkbGNpICovCi0gICAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIlBvcnQgZXJyb3Igc3RhdGUgJWQgZXZlbnQgJWQiLCBwX3BvcnQtPnJmYy5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0NMT1NFOgotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBSRkNfUE9SVF9FVkVOVF9DTE9TRSwgaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgIGJ0bV9zZWNfYWJvcnRfYWNjZXNzX3JlcShwX3BvcnQtPnJmYy5wX21jYi0+YmRfYWRkcik7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfREFUQToKLSAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiUG9ydCBlcnJvciBzdGF0ZSBPcmlnIFdhaXQgU2VjIGV2ZW50IERhdGEiKTsKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1VJSDoKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgdW5leHBlY3RlZCBldmVudDolaHUgaW4gc3RhdGU6JWhodSIsIGV2ZW50LAotICAgICAgICAgICAgICAgIHBfcG9ydC0+cmZjLnN0YXRlKTsKLSAgfQotICBSRkNPTU1fVFJBQ0VfV0FSTklORygiUG9ydCBzdGF0ZSBvcmlnX3dhaXRfc2VjX2NoZWNrIEV2ZW50IGlnbm9yZWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcG9ydF9zbV9vcGVuZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgZm9yIHRoZSBwb3J0IGluIHRoZSBPUEVORUQKLSAqICAgICAgICAgICAgICAgICAgc3RhdGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfcG9ydF9zbV9vcGVuZWQodFBPUlQqIHBfcG9ydCwgdFJGQ19QT1JUX0VWRU5UIGV2ZW50LCB2b2lkKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfT1BFTjoKLSAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiUG9ydCBlcnJvciBzdGF0ZSAlZCBldmVudCAlZCIsIHBfcG9ydC0+cmZjLnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfQ0xPU0U6Ci0gICAgICByZmNfcG9ydF90aW1lcl9zdGFydChwX3BvcnQsIFJGQ19ESVNDX1RJTUVPVVQpOwotICAgICAgcmZjX3NlbmRfZGlzYyhwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpKTsKLSAgICAgIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCA9IDA7Ci0gICAgICBwX3BvcnQtPnJmYy5zdGF0ZSA9IFJGQ19TVEFURV9ESVNDX1dBSVRfVUE7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0NMRUFSOgotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBSRkNfUE9SVF9FVkVOVF9DTEVBUiwgaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgIHJmY19wb3J0X2Nsb3NlZChwX3BvcnQpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9EQVRBOgotICAgICAgLyogU2VuZCBjcmVkaXRzIGluIHRoZSBmcmFtZS4gIFBhc3MgdGhlbSBpbiB0aGUgbGF5ZXIgc3BlY2lmaWMgbWVtYmVyIG9mCi0gICAgICAgKiB0aGUgaGRyLiAqLwotICAgICAgLyogVGhlcmUgbWlnaHQgYmUgYW4gaW5pdGlhbCBjYXNlIHdoZW4gd2UgcmVkdWNlZCByeF9tYXggYW5kIGNyZWRpdF9yeCBpcwotICAgICAgICogc3RpbGwgKi8KLSAgICAgIC8qIGJpZ2dlci4gIE1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzZW5kIDI1NSAqLwotICAgICAgaWYgKChwX3BvcnQtPnJmYy5wX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX0NSRURJVCkgJiYKLSAgICAgICAgICAoKChCVF9IRFIqKXBfZGF0YSktPmxlbiA8IHBfcG9ydC0+cGVlcl9tdHUpICYmCi0gICAgICAgICAgKCFwX3BvcnQtPnJ4LnVzZXJfZmMpICYmCi0gICAgICAgICAgKHBfcG9ydC0+Y3JlZGl0X3J4X21heCA+IHBfcG9ydC0+Y3JlZGl0X3J4KSkgewotICAgICAgICAoKEJUX0hEUiopcF9kYXRhKS0+bGF5ZXJfc3BlY2lmaWMgPQotICAgICAgICAgICAgKHVpbnQ4X3QpKHBfcG9ydC0+Y3JlZGl0X3J4X21heCAtIHBfcG9ydC0+Y3JlZGl0X3J4KTsKLSAgICAgICAgcF9wb3J0LT5jcmVkaXRfcnggPSBwX3BvcnQtPmNyZWRpdF9yeF9tYXg7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAoKEJUX0hEUiopcF9kYXRhKS0+bGF5ZXJfc3BlY2lmaWMgPSAwOwotICAgICAgfQotICAgICAgcmZjX3NlbmRfYnVmX3VpaChwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLCAoQlRfSERSKilwX2RhdGEpOwotICAgICAgcmZjX2RlY19jcmVkaXQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVUE6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1NBQk1FOgotICAgICAgcmZjX3NlbmRfdWEocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0RNOgotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBSRkNfRVZFTlRfRE0sIGluZGV4PSVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnQtPmhhbmRsZSk7Ci0gICAgICBQT1JUX0RsY1JlbGVhc2VJbmQocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSk7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfRElTQzoKLSAgICAgIHBfcG9ydC0+cmZjLnN0YXRlID0gUkZDX1NUQVRFX0NMT1NFRDsKLSAgICAgIHJmY19zZW5kX3VhKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2kpOwotICAgICAgaWYgKCFmaXhlZF9xdWV1ZV9pc19lbXB0eShwX3BvcnQtPnJ4LnF1ZXVlKSkgewotICAgICAgICAvKiBnaXZlIGEgY2hhbmNlIHRvIHVwcGVyIHN0YWNrIHRvIGNsb3NlIHBvcnQgcHJvcGVybHkgKi8KLSAgICAgICAgUkZDT01NX1RSQUNFX0RFQlVHKCJwb3J0IHF1ZXVlIGlzIG5vdCBlbXB0eSIpOwotICAgICAgICByZmNfcG9ydF90aW1lcl9zdGFydChwX3BvcnQsIFJGQ19ESVNDX1RJTUVPVVQpOwotICAgICAgfSBlbHNlCi0gICAgICAgIFBPUlRfRGxjUmVsZWFzZUluZChwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVUlIOgotICAgICAgcmZjX3BvcnRfdXBsaW5rX2RhdGEocF9wb3J0LCAoQlRfSERSKilwX2RhdGEpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9USU1FT1VUOgotICAgICAgUG9ydF9UaW1lT3V0Q2xvc2VNdXgocF9wb3J0LT5yZmMucF9tY2IpOwotICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJQb3J0IGVycm9yIHN0YXRlICVkIGV2ZW50ICVkIiwgcF9wb3J0LT5yZmMuc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgZXZlbnQ6JWh1IGluIHN0YXRlOiVoaHUiLCBldmVudCwKLSAgICAgICAgICAgICAgICBwX3BvcnQtPnJmYy5zdGF0ZSk7Ci0gIH0KLSAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIlBvcnQgc3RhdGUgb3BlbmVkIEV2ZW50IGlnbm9yZWQgJWQiLCBldmVudCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcG9ydF9zbV9kaXNjX3dhaXRfdWEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudHMgd2hlbiBESVNDIG9uIHRoZSBETEMgd2FzCi0gKiAgICAgICAgICAgICAgICAgIHNlbnQgYW5kIFNNIGlzIHdhaXRpbmcgZm9yIFVBIG9yIERNLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wb3J0X3NtX2Rpc2Nfd2FpdF91YSh0UE9SVCogcF9wb3J0LCB0UkZDX1BPUlRfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX2RhdGEpIHsKLSAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfT1BFTjoKLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0VTVEFCTElTSF9SU1A6Ci0gICAgICBSRkNPTU1fVFJBQ0VfRVJST1IoIlBvcnQgZXJyb3Igc3RhdGUgJWQgZXZlbnQgJWQiLCBwX3BvcnQtPnJmYy5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0NMRUFSOgotICAgICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzLCBSRkNfUE9SVF9FVkVOVF9DTEVBUiwgaW5kZXg9JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCBwX3BvcnQtPmhhbmRsZSk7Ci0gICAgICByZmNfcG9ydF9jbG9zZWQocF9wb3J0KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfREFUQToKLSAgICAgIG9zaV9mcmVlKHBfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1VBOgotICAgICAgcF9wb3J0LT5yZmMucF9tY2ItPmlzX2Rpc2NfaW5pdGlhdG9yID0gdHJ1ZTsKLSAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOyAvKiBGQUxMVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRkNfUE9SVF9FVkVOVF9ETToKLSAgICAgIFJGQ09NTV9UUkFDRV9XQVJOSU5HKCIlcywgUkZDX0VWRU5UX0RNfFJGQ19FVkVOVF9VQVslZF0sIGluZGV4PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBldmVudCwgcF9wb3J0LT5oYW5kbGUpOwotICAgICAgcmZjX3BvcnRfY2xvc2VkKHBfcG9ydCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX1NBQk1FOgotICAgICAgcmZjX3NlbmRfZG0ocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgdHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ19QT1JUX0VWRU5UX0RJU0M6Ci0gICAgICByZmNfc2VuZF9kbShwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLCB0cnVlKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVUlIOgotICAgICAgb3NpX2ZyZWUocF9kYXRhKTsKLSAgICAgIHJmY19zZW5kX2RtKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksIGZhbHNlKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDX1BPUlRfRVZFTlRfVElNRU9VVDoKLSAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiJXMsIFJGQ19FVkVOVF9USU1FT1VULCBpbmRleD0lZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydC0+aGFuZGxlKTsKLSAgICAgIHJmY19wb3J0X2Nsb3NlZChwX3BvcnQpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfRVJST1IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgZXZlbnQ6JWh1IGluIHN0YXRlOiVoaHUiLCBldmVudCwKLSAgICAgICAgICAgICAgICBwX3BvcnQtPnJmYy5zdGF0ZSk7Ci0gIH0KLQotICBSRkNPTU1fVFJBQ0VfV0FSTklORygiUG9ydCBzdGF0ZSBkaXNjX3dhaXRfdWEgRXZlbnQgaWdub3JlZCAlZCIsIGV2ZW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wb3J0X3VwbGlua19kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdXBsaW5rIGluZm9ybWF0aW9uIGRhdGEgZnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3BvcnRfdXBsaW5rX2RhdGEodFBPUlQqIHBfcG9ydCwgQlRfSERSKiBwX2J1ZikgewotICBQT1JUX0RhdGFJbmQocF9wb3J0LT5yZmMucF9tY2IsIHBfcG9ydC0+ZGxjaSwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3Byb2Nlc3NfcG4KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBETEMgcGFyYW1ldGVyIG5lZ290aWF0aW9uIGZyYW1lLgotICogICAgICAgICAgICAgICAgICBSZWNvcmQgTVRVIGFuZCBwYXNzIGluZGljYXRpb24gdG8gdGhlIHVwcGVyIGxheWVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wcm9jZXNzX3BuKHRSRkNfTUNCKiBwX21jYiwgYm9vbCBpc19jb21tYW5kLCBNWF9GUkFNRSogcF9mcmFtZSkgewotICBSRkNPTU1fVFJBQ0VfREVCVUcoIiVzOiBpc19pbml0aWF0b3I9JWQsIGlzX2NtZD0lZCwgc3RhdGU9JWQsIGJkX2FkZHI9JXMiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfbWNiLT5pc19pbml0aWF0b3IsIGlzX2NvbW1hbmQsIHBfbWNiLT5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgIHBfbWNiLT5iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIHVpbnQ4X3QgZGxjaSA9IHBfZnJhbWUtPmRsY2k7Ci0KLSAgaWYgKGlzX2NvbW1hbmQpIHsKLSAgICAvKiBJZ25vcmUgaWYgTXVsdGlwbGV4ZXIgaXMgYmVpbmcgc2h1dCBkb3duICovCi0gICAgaWYgKHBfbWNiLT5zdGF0ZSAhPSBSRkNfTVhfU1RBVEVfRElTQ19XQUlUX1VBKSB7Ci0gICAgICBQT1JUX1Bhck5lZ0luZChwX21jYiwgZGxjaSwgcF9mcmFtZS0+dS5wbi5tdHUsIHBfZnJhbWUtPnUucG4uY29udl9sYXllciwKLSAgICAgICAgICAgICAgICAgICAgIHBfZnJhbWUtPnUucG4uayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXwotICAgICAgICAgICAgICAgICAgIDw8ICI6IE1YIFBOIHdoaWxlIGRpc2Nvbm5lY3RpbmcsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkcgotICAgICAgICAgICAgICAgICAgIDw8ICIsIHBfbWNiPSIgPDwgcF9tY2I7Ci0gICAgICByZmNfc2VuZF9kbShwX21jYiwgZGxjaSwgZmFsc2UpOwotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotICAvKiBJZiB3ZSBhcmUgbm90IGF3YWl0aW5nIHJlc3BvbnNlIGp1c3QgaWdub3JlIGl0ICovCi0gIHRQT1JUKiBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0gIGlmICgocF9wb3J0ID09IG51bGxwdHIpIHx8ICEocF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwICYgUkZDX1JTUF9QTikpIHsKLSAgICBMT0coV0FSTklORykgPDwgIjogSWdub3JlIHVud2FudGVkIHJlc3BvbnNlLCBwX21jYj0iIDw8IHBfbWNiCi0gICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkcgotICAgICAgICAgICAgICAgICA8PCAiLCBkbGNpPSIgPDwgc3RkOjp0b19zdHJpbmcoZGxjaSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwICY9IH5SRkNfUlNQX1BOOwotCi0gIHJmY19wb3J0X3RpbWVyX3N0b3AocF9wb3J0KTsKLQotICBQT1JUX1Bhck5lZ0NuZihwX21jYiwgZGxjaSwgcF9mcmFtZS0+dS5wbi5tdHUsIHBfZnJhbWUtPnUucG4uY29udl9sYXllciwKLSAgICAgICAgICAgICAgICAgcF9mcmFtZS0+dS5wbi5rKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wcm9jZXNzX3JwbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFJlbW90ZSBETEMgcGFyYW1ldGVyIG5lZ290aWF0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGNvbW1hbmQvcmVzcG9uc2UuICBQYXNzIGNvbW1hbmQgdG8gdGhlIHVzZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3Byb2Nlc3NfcnBuKHRSRkNfTUNCKiBwX21jYiwgYm9vbCBpc19jb21tYW5kLCBib29sIGlzX3JlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICBNWF9GUkFNRSogcF9mcmFtZSkgewotICB0UE9SVF9TVEFURSBwb3J0X3BhcnM7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0KLSAgcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIHBfZnJhbWUtPmRsY2kpOwotICBpZiAocF9wb3J0ID09IG51bGxwdHIpIHsKLSAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBjb21tYW5kIG9uIHRoZSBwb3J0ICovCi0gICAgaWYgKGlzX2NvbW1hbmQpIHsKLSAgICAgIG1lbXNldCgmcG9ydF9wYXJzLCAwLCBzaXplb2YodFBPUlRfU1RBVEUpKTsKLSAgICAgIHJmY19zZXRfcG9ydF9zdGF0ZSgmcG9ydF9wYXJzLCBwX2ZyYW1lKTsKLQotICAgICAgUE9SVF9Qb3J0TmVnSW5kKHBfbWNiLCBwX2ZyYW1lLT5kbGNpLCAmcG9ydF9wYXJzLAotICAgICAgICAgICAgICAgICAgICAgIHBfZnJhbWUtPnUucnBuLnBhcmFtX21hc2spOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoaXNfY29tbWFuZCAmJiBpc19yZXF1ZXN0KSB7Ci0gICAgLyogVGhpcyBpcyB0aGUgc3BlY2lhbCBzaXR1YXRpb24gd2hlbiBwZWVyIGp1c3QgcmVxdWVzdCBsb2NhbCBwYXJzICovCi0gICAgcmZjX3NlbmRfcnBuKHBfbWNiLCBwX2ZyYW1lLT5kbGNpLCBmYWxzZSwgJnBfcG9ydC0+cGVlcl9wb3J0X3BhcnMsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBvcnRfcGFycyA9IHBfcG9ydC0+cGVlcl9wb3J0X3BhcnM7Ci0KLSAgcmZjX3NldF9wb3J0X3N0YXRlKCZwb3J0X3BhcnMsIHBfZnJhbWUpOwotCi0gIGlmIChpc19jb21tYW5kKSB7Ci0gICAgUE9SVF9Qb3J0TmVnSW5kKHBfbWNiLCBwX2ZyYW1lLT5kbGNpLCAmcG9ydF9wYXJzLAotICAgICAgICAgICAgICAgICAgICBwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGF3YWl0aW5nIHJlc3BvbnNlIGp1c3QgaWdub3JlIGl0ICovCi0gIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBwX2ZyYW1lLT5kbGNpKTsKLSAgaWYgKChwX3BvcnQgPT0gbnVsbHB0cikgfHwKLSAgICAgICEocF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwICYgKFJGQ19SU1BfUlBOIHwgUkZDX1JTUF9SUE5fUkVQTFkpKSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBpZ25vcmUgRExDIHBhcmFtZXRlciBuZWdvdGlhdGlvbiBhcyB3ZSBhcmUiCi0gICAgICAgICAgICAgICAgIDw8ICIgbm90IHdhaXRpbmcgZm9yIGFueSI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSWYgd2Ugc2VudCBhIHJlcXVlc3QgZm9yIHBvcnQgcGFyYW1ldGVycyB0byB0aGUgcGVlciBpdCBpcyByZXBseWluZyB3aXRoICovCi0gIC8qIG1hc2sgMC4gKi8KLSAgcmZjX3BvcnRfdGltZXJfc3RvcChwX3BvcnQpOwotCi0gIGlmIChwX3BvcnQtPnJmYy5leHBlY3RlZF9yc3AgJiBSRkNfUlNQX1JQTl9SRVBMWSkgewotICAgIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCAmPSB+UkZDX1JTUF9SUE5fUkVQTFk7Ci0KLSAgICBwX3BvcnQtPnBlZXJfcG9ydF9wYXJzID0gcG9ydF9wYXJzOwotCi0gICAgaWYgKChwb3J0X3BhcnMuZmNfdHlwZSA9PQotICAgICAgICAgKFJGQ09NTV9GQ19SVFJfT05fSU5QVVQgfCBSRkNPTU1fRkNfUlRSX09OX09VVFBVVCkpIHx8Ci0gICAgICAgIChwb3J0X3BhcnMuZmNfdHlwZSA9PQotICAgICAgICAgKFJGQ09NTV9GQ19SVENfT05fSU5QVVQgfCBSRkNPTU1fRkNfUlRDX09OX09VVFBVVCkpKSB7Ci0gICAgICAvKiBUaGlzIGlzIHNhdGlzZmFjdG9yeSBwb3J0IHBhcmFtZXRlcnMuICBTZXQgbWFzayBhcyBpdCB3YXMgT2sgKi8KLSAgICAgIHBfZnJhbWUtPnUucnBuLnBhcmFtX21hc2sgPSBSRkNPTU1fUlBOX1BNX01BU0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEN1cnJlbnQgcGVlciBwYXJhbWV0ZXJzIGFyZSBub3QgZ29vZCwgdHJ5IHRvIGZpeCB0aGVtICovCi0gICAgICBwX3BvcnQtPnBlZXJfcG9ydF9wYXJzLmZjX3R5cGUgPQotICAgICAgICAgIChSRkNPTU1fRkNfUlRSX09OX0lOUFVUIHwgUkZDT01NX0ZDX1JUUl9PTl9PVVRQVVQpOwotCi0gICAgICBwX3BvcnQtPnJmYy5leHBlY3RlZF9yc3AgfD0gUkZDX1JTUF9SUE47Ci0gICAgICByZmNfc2VuZF9ycG4ocF9tY2IsIHBfZnJhbWUtPmRsY2ksIHRydWUsICZwX3BvcnQtPnBlZXJfcG9ydF9wYXJzLAotICAgICAgICAgICAgICAgICAgIFJGQ09NTV9SUE5fUE1fUlRSX09OX0lOUFVUIHwgUkZDT01NX1JQTl9QTV9SVFJfT05fT1VUUFVUKTsKLSAgICAgIHJmY19wb3J0X3RpbWVyX3N0YXJ0KHBfcG9ydCwgUkZDX1QyX1RJTUVPVVQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlCi0gICAgcF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwICY9IH5SRkNfUlNQX1JQTjsKLQotICAvKiBDaGVjayBpZiBhbGwgc3VnZ2VzdGVkIHBhcmFtZXRlcnMgd2VyZSBhY2NlcHRlZCAqLwotICBpZiAoKChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYKLSAgICAgICAgKFJGQ09NTV9SUE5fUE1fUlRSX09OX0lOUFVUIHwgUkZDT01NX1JQTl9QTV9SVFJfT05fT1VUUFVUKSkgPT0KLSAgICAgICAoUkZDT01NX1JQTl9QTV9SVFJfT05fSU5QVVQgfCBSRkNPTU1fUlBOX1BNX1JUUl9PTl9PVVRQVVQpKSB8fAotICAgICAgKChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYKLSAgICAgICAgKFJGQ09NTV9SUE5fUE1fUlRDX09OX0lOUFVUIHwgUkZDT01NX1JQTl9QTV9SVENfT05fT1VUUFVUKSkgPT0KLSAgICAgICAoUkZDT01NX1JQTl9QTV9SVENfT05fSU5QVVQgfCBSRkNPTU1fUlBOX1BNX1JUQ19PTl9PVVRQVVQpKSkgewotICAgIFBPUlRfUG9ydE5lZ0NuZihwX21jYiwgcF9wb3J0LT5kbGNpLCAmcG9ydF9wYXJzLCBSRkNPTU1fU1VDQ0VTUyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSWYgd2Ugd2VyZSBwcm9wb3NpbmcgUlRSIGZsb3cgY29udHJvbCB0cnkgUlRDIGZsb3cgY29udHJvbCAqLwotICAvKiBJZiB3ZSB3ZXJlIHByb3Bvc2luZyBSVEMgZmxvdyBjb250cm9sIHRyeSBubyBmbG93IGNvbnRyb2wgKi8KLSAgLyogb3RoZXJ3aXNlIGRyb3AgdGhlIGNvbm5lY3Rpb24gKi8KLSAgaWYgKHBfcG9ydC0+cGVlcl9wb3J0X3BhcnMuZmNfdHlwZSA9PQotICAgICAgKFJGQ09NTV9GQ19SVFJfT05fSU5QVVQgfCBSRkNPTU1fRkNfUlRSX09OX09VVFBVVCkpIHsKLSAgICAvKiBDdXJyZW50IHBlZXIgcGFyYW1ldGVycyBhcmUgbm90IGdvb2QsIHRyeSB0byBmaXggdGhlbSAqLwotICAgIHBfcG9ydC0+cGVlcl9wb3J0X3BhcnMuZmNfdHlwZSA9Ci0gICAgICAgIChSRkNPTU1fRkNfUlRDX09OX0lOUFVUIHwgUkZDT01NX0ZDX1JUQ19PTl9PVVRQVVQpOwotCi0gICAgcF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwIHw9IFJGQ19SU1BfUlBOOwotCi0gICAgcmZjX3NlbmRfcnBuKHBfbWNiLCBwX2ZyYW1lLT5kbGNpLCB0cnVlLCAmcF9wb3J0LT5wZWVyX3BvcnRfcGFycywKLSAgICAgICAgICAgICAgICAgUkZDT01NX1JQTl9QTV9SVENfT05fSU5QVVQgfCBSRkNPTU1fUlBOX1BNX1JUQ19PTl9PVVRQVVQpOwotICAgIHJmY19wb3J0X3RpbWVyX3N0YXJ0KHBfcG9ydCwgUkZDX1QyX1RJTUVPVVQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIE90aGVyIHNpZGUgZG9lcyBub3Qgc3VwcG9ydCBmbG93IGNvbnRyb2wgKi8KLSAgaWYgKHBfcG9ydC0+cGVlcl9wb3J0X3BhcnMuZmNfdHlwZSA9PQotICAgICAgKFJGQ09NTV9GQ19SVENfT05fSU5QVVQgfCBSRkNPTU1fRkNfUlRDX09OX09VVFBVVCkpIHsKLSAgICBwX3BvcnQtPnBlZXJfcG9ydF9wYXJzLmZjX3R5cGUgPSBSRkNPTU1fRkNfT0ZGOwotICAgIFBPUlRfUG9ydE5lZ0NuZihwX21jYiwgcF9wb3J0LT5kbGNpLCAmcG9ydF9wYXJzLCBSRkNPTU1fU1VDQ0VTUyk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wcm9jZXNzX21zYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIE1vZGVtIFN0YXR1cyBDb21tYW5kLgotICogICAgICAgICAgICAgICAgICBQYXNzIGNvbW1hbmQgdG8gdGhlIHVzZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3Byb2Nlc3NfbXNjKHRSRkNfTUNCKiBwX21jYiwgYm9vbCBpc19jb21tYW5kLCBNWF9GUkFNRSogcF9mcmFtZSkgewotICB0UE9SVF9DVFJMIHBhcnM7Ci0gIHRQT1JUKiBwX3BvcnQ7Ci0gIHVpbnQ4X3QgbW9kZW1fc2lnbmFscyA9IHBfZnJhbWUtPnUubXNjLnNpZ25hbHM7Ci0gIGJvb2wgbmV3X3BlZXJfZmMgPSBmYWxzZTsKLQotICBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgcF9mcmFtZS0+ZGxjaSk7Ci0gIGlmIChwX3BvcnQgPT0gTlVMTCkgcmV0dXJuOwotCi0gIHBhcnMubW9kZW1fc2lnbmFsID0gMDsKLQotICBpZiAobW9kZW1fc2lnbmFscyAmIFJGQ09NTV9NU0NfUlRDKSBwYXJzLm1vZGVtX3NpZ25hbCB8PSBNT0RFTV9TSUdOQUxfRFRSRFNSOwotCi0gIGlmIChtb2RlbV9zaWduYWxzICYgUkZDT01NX01TQ19SVFIpIHBhcnMubW9kZW1fc2lnbmFsIHw9IE1PREVNX1NJR05BTF9SVFNDVFM7Ci0KLSAgaWYgKG1vZGVtX3NpZ25hbHMgJiBSRkNPTU1fTVNDX0lDKSBwYXJzLm1vZGVtX3NpZ25hbCB8PSBNT0RFTV9TSUdOQUxfUkk7Ci0KLSAgaWYgKG1vZGVtX3NpZ25hbHMgJiBSRkNPTU1fTVNDX0RWKSBwYXJzLm1vZGVtX3NpZ25hbCB8PSBNT0RFTV9TSUdOQUxfRENEOwotCi0gIHBhcnMuZmMgPSAoKG1vZGVtX3NpZ25hbHMgJiBSRkNPTU1fTVNDX0ZDKSA9PSBSRkNPTU1fTVNDX0ZDKTsKLQotICBwYXJzLmJyZWFrX3NpZ25hbCA9Ci0gICAgICAocF9mcmFtZS0+dS5tc2MuYnJlYWtfcHJlc2VudCkgPyBwX2ZyYW1lLT51Lm1zYy5icmVha19kdXJhdGlvbiA6IDA7Ci0gIHBhcnMuZGlzY2FyZF9idWZmZXJzID0gMDsKLSAgcGFycy5icmVha19zaWduYWxfc2VxID0gUkZDT01NX0NUUkxfQlJFQUtfSU5fU0VROyAvKiB0aGlzIGlzIGRlZmF1bHQgKi8KLQotICAvKiBDaGVjayBpZiB0aGlzIGNvbW1hbmQgaXMgcGFzc2VkIG9ubHkgdG8gaW5kaWNhdGUgZmxvdyBjb250cm9sICovCi0gIGlmIChpc19jb21tYW5kKSB7Ci0gICAgcmZjX3NlbmRfbXNjKHBfbWNiLCBwX2ZyYW1lLT5kbGNpLCBmYWxzZSwgJnBhcnMpOwotCi0gICAgaWYgKHBfcG9ydC0+cmZjLnBfbWNiLT5mbG93ICE9IFBPUlRfRkNfQ1JFRElUKSB7Ci0gICAgICAvKiBTcGVjIDEuMSBpbmRpY2F0ZXMgdGhhdCBvbmx5IEZDIGJpdCBpcyB1c2VkIGZvciBmbG93IGNvbnRyb2wgKi8KLSAgICAgIHBfcG9ydC0+cGVlcl9jdHJsLmZjID0gbmV3X3BlZXJfZmMgPSBwYXJzLmZjOwotCi0gICAgICBpZiAobmV3X3BlZXJfZmMgIT0gcF9wb3J0LT50eC5wZWVyX2ZjKQotICAgICAgICBQT1JUX0Zsb3dJbmQocF9tY2IsIHBfZnJhbWUtPmRsY2ksIChib29sKSFuZXdfcGVlcl9mYyk7Ci0gICAgfQotCi0gICAgUE9SVF9Db250cm9sSW5kKHBfbWNiLCBwX2ZyYW1lLT5kbGNpLCAmcGFycyk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGF3YWl0aW5nIHJlc3BvbnNlIGp1c3QgaWdub3JlIGl0ICovCi0gIGlmICghKHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCAmIFJGQ19SU1BfTVNDKSkgcmV0dXJuOwotCi0gIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCAmPSB+UkZDX1JTUF9NU0M7Ci0KLSAgcmZjX3BvcnRfdGltZXJfc3RvcChwX3BvcnQpOwotCi0gIFBPUlRfQ29udHJvbENuZihwX3BvcnQtPnJmYy5wX21jYiwgcF9wb3J0LT5kbGNpLCAmcGFycyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcHJvY2Vzc19ybHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBSZW1vdGUgTGluZSBTdGF0dXMgY29tbWFuZC4KLSAqICAgICAgICAgICAgICAgICAgUGFzcyBjb21tYW5kIHRvIHRoZSB1c2VyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wcm9jZXNzX3Jscyh0UkZDX01DQiogcF9tY2IsIGJvb2wgaXNfY29tbWFuZCwgTVhfRlJBTUUqIHBfZnJhbWUpIHsKLSAgdFBPUlQqIHBfcG9ydDsKLQotICBpZiAoaXNfY29tbWFuZCkgewotICAgIFBPUlRfTGluZVN0YXR1c0luZChwX21jYiwgcF9mcmFtZS0+ZGxjaSwgcF9mcmFtZS0+dS5ybHMubGluZV9zdGF0dXMpOwotICAgIHJmY19zZW5kX3JscyhwX21jYiwgcF9mcmFtZS0+ZGxjaSwgZmFsc2UsIHBfZnJhbWUtPnUucmxzLmxpbmVfc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgcF9mcmFtZS0+ZGxjaSk7Ci0KLSAgICAvKiBJZiB3ZSBhcmUgbm90IGF3YWl0aW5nIHJlc3BvbnNlIGp1c3QgaWdub3JlIGl0ICovCi0gICAgaWYgKCFwX3BvcnQgfHwgIShwX3BvcnQtPnJmYy5leHBlY3RlZF9yc3AgJiBSRkNfUlNQX1JMUykpIHJldHVybjsKLQotICAgIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCAmPSB+UkZDX1JTUF9STFM7Ci0KLSAgICByZmNfcG9ydF90aW1lcl9zdG9wKHBfcG9ydCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wcm9jZXNzX25zYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIE5vbmUgU3VwcG9ydGVkIENvbW1hbmQgZnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3Byb2Nlc3NfbnNjKFVOVVNFRF9BVFRSIHRSRkNfTUNCKiBwX21jYiwKLSAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIE1YX0ZSQU1FKiBwX2ZyYW1lKSB7fQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3Byb2Nlc3NfdGVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFRlc3QgZnJhbWUuICBJZiB0aGlzIGlzIGEgY29tbWFuZAotICogICAgICAgICAgICAgICAgICByZXBseSB0byBpdC4gIE90aGVyd2lzZSBwYXNzIHJlc3BvbnNlIHRvIHRoZSB1c2VyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wcm9jZXNzX3Rlc3RfcnNwKFVOVVNFRF9BVFRSIHRSRkNfTUNCKiBwX21jYiwgQlRfSERSKiBwX2J1ZikgewotICBvc2lfZnJlZShwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcHJvY2Vzc19mY29uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgRkNPTiBmcmFtZS4gIFRoZSBwZWVyIGVudGl0eSBpcyBhYmxlCi0gKiAgICAgICAgICAgICAgICAgIHRvIHJlY2VpdmUgbmV3IGluZm9ybWF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3Byb2Nlc3NfZmNvbih0UkZDX01DQiogcF9tY2IsIGJvb2wgaXNfY29tbWFuZCkgewotICBpZiAoaXNfY29tbWFuZCkgewotICAgIHJmY19jYi5yZmMucGVlcl9yeF9kaXNhYmxlZCA9IGZhbHNlOwotCi0gICAgcmZjX3NlbmRfZmNvbihwX21jYiwgZmFsc2UpOwotCi0gICAgaWYgKCFwX21jYi0+bDJjYXBfY29uZ2VzdGVkKSBQT1JUX0Zsb3dJbmQocF9tY2IsIDAsIHRydWUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcHJvY2Vzc19mY29mZgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEZDT0ZGIGZyYW1lLiAgVGhlIHBlZXIgZW50aXR5IGlzCi0gKiAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byByZWNlaXZlIG5ldyBpbmZvcm1hdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wcm9jZXNzX2Zjb2ZmKHRSRkNfTUNCKiBwX21jYiwgYm9vbCBpc19jb21tYW5kKSB7Ci0gIGlmIChpc19jb21tYW5kKSB7Ci0gICAgcmZjX2NiLnJmYy5wZWVyX3J4X2Rpc2FibGVkID0gdHJ1ZTsKLQotICAgIGlmICghcF9tY2ItPmwyY2FwX2Nvbmdlc3RlZCkgUE9SVF9GbG93SW5kKHBfbWNiLCAwLCBmYWxzZSk7Ci0KLSAgICByZmNfc2VuZF9mY29mZihwX21jYiwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcHJvY2Vzc19sMmNhcF9jb25nZXN0aW9uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgTDJDQVAgY29uZ2VzdGlvbiBtZXNzYWdlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wcm9jZXNzX2wyY2FwX2Nvbmdlc3Rpb24odFJGQ19NQ0IqIHBfbWNiLCBib29sIGlzX2Nvbmdlc3RlZCkgewotICBwX21jYi0+bDJjYXBfY29uZ2VzdGVkID0gaXNfY29uZ2VzdGVkOwotCi0gIGlmICghaXNfY29uZ2VzdGVkKSB7Ci0gICAgcmZjX2NoZWNrX3NlbmRfY21kKHBfbWNiLCBudWxscHRyKTsKLSAgfQotCi0gIGlmICghcmZjX2NiLnJmYy5wZWVyX3J4X2Rpc2FibGVkKSB7Ci0gICAgUE9SVF9GbG93SW5kKHBfbWNiLCAwLCAhaXNfY29uZ2VzdGVkKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NldF9wb3J0X3BhcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdFBPUlRfU1RBVEUgc3RydWN0dXJlIGdpdmVuIGEKLSAqICAgICAgICAgICAgICAgICAgcF9mcmFtZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHJmY19zZXRfcG9ydF9zdGF0ZSh0UE9SVF9TVEFURSogcG9ydF9wYXJzLCBNWF9GUkFNRSogcF9mcmFtZSkgewotICBpZiAocF9mcmFtZS0+dS5ycG4ucGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fQklUX1JBVEUpCi0gICAgcG9ydF9wYXJzLT5iYXVkX3JhdGUgPSBwX2ZyYW1lLT51LnJwbi5iYXVkX3JhdGU7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9EQVRBX0JJVFMpCi0gICAgcG9ydF9wYXJzLT5ieXRlX3NpemUgPSBwX2ZyYW1lLT51LnJwbi5ieXRlX3NpemU7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9TVE9QX0JJVFMpCi0gICAgcG9ydF9wYXJzLT5zdG9wX2JpdHMgPSBwX2ZyYW1lLT51LnJwbi5zdG9wX2JpdHM7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9QQVJJVFkpCi0gICAgcG9ydF9wYXJzLT5wYXJpdHkgPSBwX2ZyYW1lLT51LnJwbi5wYXJpdHk7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9QQVJJVFlfVFlQRSkKLSAgICBwb3J0X3BhcnMtPnBhcml0eV90eXBlID0gcF9mcmFtZS0+dS5ycG4ucGFyaXR5X3R5cGU7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYKLSAgICAgIChSRkNPTU1fUlBOX1BNX1hPTlhPRkZfT05fSU5QVVQgfCBSRkNPTU1fUlBOX1BNX1hPTlhPRkZfT05fT1VUUFVUIHwKLSAgICAgICBSRkNPTU1fUlBOX1BNX1JUUl9PTl9JTlBVVCB8IFJGQ09NTV9SUE5fUE1fUlRSX09OX09VVFBVVCB8Ci0gICAgICAgUkZDT01NX1JQTl9QTV9SVENfT05fSU5QVVQgfCBSRkNPTU1fUlBOX1BNX1JUQ19PTl9PVVRQVVQpKQotICAgIHBvcnRfcGFycy0+ZmNfdHlwZSA9IHBfZnJhbWUtPnUucnBuLmZjX3R5cGU7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9YT05fQ0hBUikKLSAgICBwb3J0X3BhcnMtPnhvbl9jaGFyID0gcF9mcmFtZS0+dS5ycG4ueG9uX2NoYXI7Ci0gIGlmIChwX2ZyYW1lLT51LnJwbi5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9YT0ZGX0NIQVIpCi0gICAgcG9ydF9wYXJzLT54b2ZmX2NoYXIgPSBwX2ZyYW1lLT51LnJwbi54b2ZmX2NoYXI7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9yZmNvbW0vcmZjX3BvcnRfaWYuY2MgYi9zdGFjay9yZmNvbW0vcmZjX3BvcnRfaWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGJkMDEuLjAwMDAwMDAKLS0tIGEvc3RhY2svcmZjb21tL3JmY19wb3J0X2lmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgY2FsbGFibGUgYnkgYW4gYXBwbGljYXRpb24KLSAqIHJ1bm5pbmcgb24gdG9wIG9mIFJGQ09NTQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9wb3J0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfaW50LmgiCi0KLXRSRkNfQ0IgcmZjX2NiOwotc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCB1aW50MTZfdD4gcmZjb21tX3NlY3VyaXR5X3JlY29yZHM7Ci1zdGQ6OnVub3JkZXJlZF9tYXA8dWludDE2X3QgLyogc2NpICovLCB0UkZDX01DQio+IHJmY19sY2lkX21jYjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9TdGFydFJlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFN0YXJ0IFJlcXVlc3QgZnJvbSB0aGUgdXBwZXIgbGF5ZXIuCi0gKiAgICAgICAgICAgICAgICAgIElmIFJGQ09NTSBtdWx0aXBsZXhlciBjaGFubmVsIGNhbiBub3QgYmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgIHNlbmQgc3RhcnQgbm90IGFjY2VwdGVkIGNvbmZpcm1hdGlvbi4gIE90aGVyd2lzZSBkaXNwYXRjaAotICogICAgICAgICAgICAgICAgICBzdGFydCBldmVudCB0byB0aGUgc3RhdGUgbWFjaGluZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fU3RhcnRSZXEodFJGQ19NQ0IqIHBfbWNiKSB7Ci0gIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfU1RBUlRfUkVRLCBudWxscHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9TdGFydFJzcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFN0YXJ0IFJlc3BvbnNlIGZyb20gdGhlIHVwcGVyIGxheWVyLgotICogICAgICAgICAgICAgICAgICBTYXZlIHVwcGVyIGxheWVyIGhhbmRsZSBhbmQgcmVzdWx0IG9mIHRoZSBTdGFydCBJbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSBjb250cm9sIGJsb2NrIGFuZCBkaXNwYXRjaCBldmVudCB0byB0aGUgRlNNLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9TdGFydFJzcCh0UkZDX01DQiogcF9tY2IsIHVpbnQxNl90IHJlc3VsdCkgewotICByZmNfbXhfc21fZXhlY3V0ZShwX21jYiwgUkZDX01YX0VWRU5UX1NUQVJUX1JTUCwgJnJlc3VsdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fRGxjRXN0YWJsaXNoUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdXNlciBhcHAgdG8gZXN0YWJsaXNoCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWMgZGxjaSBvbiBhIHNwZWNpZmljIGJkIGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgSXQgd2lsbCBhbGxvY2F0ZSBSRkNPTU0gY29ubmVjdGlvbiBjb250cm9sIGJsb2NrIGlmIG5vdAotICogICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmVmb3JlIGFuZCBkaXNwYXRjaCBvcGVuIGV2ZW50IHRvIHRoZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICBtYWNoaW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9EbGNFc3RhYmxpc2hSZXEodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbXR1KSB7Ci0gIGlmIChwX21jYi0+c3RhdGUgIT0gUkZDX01YX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgIFBPUlRfRGxjRXN0YWJsaXNoQ25mKHBfbWNiLCBkbGNpLCAwLCBSRkNPTU1fRVJST1IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRQT1JUKiBwX3BvcnQgPSBwb3J0X2ZpbmRfbWNiX2RsY2lfcG9ydChwX21jYiwgZGxjaSk7Ci0gIGlmIChwX3BvcnQgPT0gbnVsbHB0cikgewotICAgIFJGQ09NTV9UUkFDRV9XQVJOSU5HKCIlcyBVbmFibGUgdG8gZmluZCBETENJIHBvcnQgZGxjaTolZCIsIF9fZnVuY19fLCBkbGNpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICByZmNfcG9ydF9zbV9leGVjdXRlKHBfcG9ydCwgUkZDX1BPUlRfRVZFTlRfT1BFTiwgbnVsbHB0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fRGxjRXN0YWJsaXNoUnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgcG9ydCBlbXVsYXRpb24gZW50aXR5Ci0gKiAgICAgICAgICAgICAgICAgIGFja3MgRXN0YWJsaXNoIEluZGljYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUkZDT01NX0RsY0VzdGFibGlzaFJzcCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBtdHUsIHVpbnQxNl90IHJlc3VsdCkgewotICBpZiAoKHBfbWNiLT5zdGF0ZSAhPSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEKSAmJiAocmVzdWx0ID09IFJGQ09NTV9TVUNDRVNTKSkgewotICAgIFBPUlRfRGxjUmVsZWFzZUluZChwX21jYiwgZGxjaSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLSAgaWYgKHBfcG9ydCA9PSBudWxscHRyKSB7Ci0gICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzIFVuYWJsZSB0byBmaW5kIERMQ0kgcG9ydCBkbGNpOiVkIiwgX19mdW5jX18sIGRsY2kpOwotICAgIHJldHVybjsKLSAgfQotICByZmNfcG9ydF9zbV9leGVjdXRlKHBfcG9ydCwgUkZDX1BPUlRfRVZFTlRfRVNUQUJMSVNIX1JTUCwgJnJlc3VsdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fUGFyYW1ldGVyTmVnb3RpYXRpb25SZXF1ZXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdXNlciBhcHAgdG8gc3RhcnQKLSAqICAgICAgICAgICAgICAgICAgRExDIHBhcmFtZXRlciBuZWdvdGlhdGlvbi4gIFBvcnQgZW11bGF0aW9uIGNhbiBzZW5kIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgcmVxdWVzdCBiZWZvcmUgYWN0dWFsbHkgZXN0YWJsaXNoaW5nIHRoZSBETEMuICBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgICAgIGNhc2UgdGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgUkZDT01NIGNvbm5lY3Rpb24gY29udHJvbAotICogICAgICAgICAgICAgICAgICBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fUGFyYW1ldGVyTmVnb3RpYXRpb25SZXF1ZXN0KHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG10dSkgewotICB1aW50OF90IGZsb3c7Ci0gIHVpbnQ4X3QgY2w7Ci0gIHVpbnQ4X3QgazsKLQotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpOwotICBpZiAocF9wb3J0ID09IG51bGxwdHIpIHsKLSAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiJXMgVW5hYmxlIHRvIGZpbmQgRExDSSBwb3J0IGRsY2k6JWQiLCBfX2Z1bmNfXywgZGxjaSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfbWNiLT5zdGF0ZSAhPSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgcF9wb3J0LT5lcnJvciA9IFBPUlRfUEFSX05FR19GQUlMRUQ7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogTmVnb3RpYXRlIHRoZSBmbG93IGNvbnRyb2wgbWVjaGFuaXNtLiAgSWYgZmxvdyBjb250cm9sIG1lY2hhbmlzbSBmb3IgKi8KLSAgLyogbXV4IGhhcyBub3QgYmVlbiBzZXQgeWV0LCB1c2Ugb3VyIGRlZmF1bHQgdmFsdWUuICBJZiBpdCBoYXMgYmVlbiBzZXQsICovCi0gIC8qIHVzZSB0aGF0IHZhbHVlLiAqLwotICBmbG93ID0gKHBfbWNiLT5mbG93ID09IFBPUlRfRkNfVU5ERUZJTkVEKSA/IFBPUlRfRkNfREVGQVVMVCA6IHBfbWNiLT5mbG93OwotCi0gIC8qIFNldCBjb252ZXJnZW5jZSBsYXllciBhbmQgbnVtYmVyIG9mIGNyZWRpdHMgKGspICovCi0gIGlmIChmbG93ID09IFBPUlRfRkNfQ1JFRElUKSB7Ci0gICAgY2wgPSBSRkNPTU1fUE5fQ09OVl9MQVlFUl9DQkZDX0k7Ci0gICAgayA9IChwX3BvcnQtPmNyZWRpdF9yeF9tYXggPCBSRkNPTU1fS19NQVgpID8gcF9wb3J0LT5jcmVkaXRfcnhfbWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUkZDT01NX0tfTUFYOwotICAgIHBfcG9ydC0+Y3JlZGl0X3J4ID0gazsKLSAgfSBlbHNlIHsKLSAgICBjbCA9IFJGQ09NTV9QTl9DT05WX0xBWUVSX1RZUEVfMTsKLSAgICBrID0gMDsKLSAgfQotCi0gIC8qIFNlbmQgUGFyYW1ldGVyIE5lZ290aWF0aW9uIENvbW1hbmQgVUlIIGZyYW1lICovCi0gIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCB8PSBSRkNfUlNQX1BOOwotCi0gIHJmY19zZW5kX3BuKHBfbWNiLCBkbGNpLCB0cnVlLCBtdHUsIGNsLCBrKTsKLQotICByZmNfcG9ydF90aW1lcl9zdGFydChwX3BvcnQsIFJGQ19UMl9USU1FT1VUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9QYXJhbWV0ZXJOZWdvdGlhdGlvblJlc3BvbnNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdXNlciBhcHAgdG8gYWNrbm93bGVkZ2UKLSAqICAgICAgICAgICAgICAgICAgRExDIHBhcmFtZXRlciBuZWdvdGlhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fUGFyYW1ldGVyTmVnb3RpYXRpb25SZXNwb25zZSh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1LCB1aW50OF90IGNsLCB1aW50OF90IGspIHsKLSAgaWYgKHBfbWNiLT5zdGF0ZSAhPSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEKSByZXR1cm47Ci0KLSAgLyogU2VuZCBQYXJhbWV0ZXIgTmVnb3RpYXRpb24gUmVzcG9uc2UgVUlIIGZyYW1lICovCi0gIHJmY19zZW5kX3BuKHBfbWNiLCBkbGNpLCBmYWxzZSwgbXR1LCBjbCwgayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBSRkNPTU1fUG9ydFBhcmFtZXRlck5lZ290aWF0aW9uUmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHVzZXIgYXBwIHRvIHN0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgIFJlbW90ZSBQb3J0IHBhcmFtZXRlciBuZWdvdGlhdGlvbi4gIFBvcnQgZW11bGF0aW9uIGNhbgotICogICAgICAgICAgICAgICAgICBzZW5kIHRoaXMgcmVxdWVzdCBiZWZvcmUgYWN0dWFsbHkgZXN0YWJsaXNoaW5nIHRoZSBETEMuCi0gKiAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBSRkNPTU0gY29ubmVjdGlvbgotICogICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9Qb3J0UGFyYW1ldGVyTmVnb3RpYXRpb25SZXF1ZXN0KHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9TVEFURSogcF9wYXJzKSB7Ci0gIGlmIChwX21jYi0+c3RhdGUgIT0gUkZDX01YX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgIFBPUlRfUG9ydE5lZ0NuZihwX21jYiwgZGxjaSwgbnVsbHB0ciwgUkZDT01NX0VSUk9SKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpOwotICBpZiAocF9wb3J0ID09IG51bGxwdHIpIHsKLSAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiJXMgVW5hYmxlIHRvIGZpbmQgRExDSSBwb3J0IGRsY2k6JWQiLCBfX2Z1bmNfXywgZGxjaSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogU2VuZCBQYXJhbWV0ZXIgTmVnb3RpYXRpb24gQ29tbWFuZCBVSUggZnJhbWUgKi8KLSAgaWYgKCFwX3BhcnMpCi0gICAgcF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwIHw9IFJGQ19SU1BfUlBOX1JFUExZOwotICBlbHNlCi0gICAgcF9wb3J0LT5yZmMuZXhwZWN0ZWRfcnNwIHw9IFJGQ19SU1BfUlBOOwotCi0gIHJmY19zZW5kX3JwbihwX21jYiwgZGxjaSwgdHJ1ZSwgcF9wYXJzLCBSRkNPTU1fUlBOX1BNX01BU0spOwotICByZmNfcG9ydF90aW1lcl9zdGFydChwX3BvcnQsIFJGQ19UMl9USU1FT1VUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9Qb3J0UGFyYW1ldGVyTmVnb3RpYXRpb25SZXNwb25zZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHVzZXIgYXBwIHRvIGFja25vd2xlZGdlCi0gKiAgICAgICAgICAgICAgICAgIFBvcnQgcGFyYW1ldGVycyBuZWdvdGlhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSRkNPTU1fUG9ydFBhcmFtZXRlck5lZ290aWF0aW9uUmVzcG9uc2UodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9TVEFURSogcF9wYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGFyYW1fbWFzaykgewotICBpZiAocF9tY2ItPnN0YXRlICE9IFJGQ19NWF9TVEFURV9DT05ORUNURUQpIHJldHVybjsKLQotICByZmNfc2VuZF9ycG4ocF9tY2IsIGRsY2ksIGZhbHNlLCBwX3BhcnMsIHBhcmFtX21hc2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUkZDT01NX0NvbnRyb2xSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwb3J0IGVudGl0eSB0byBzZW5kIGNvbnRyb2wKLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB0byByZW1vdGUgcG9ydCBlbXVsYXRpb24gZW50aXR5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9Db250cm9sUmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB0UE9SVF9DVFJMKiBwX3BhcnMpIHsKLSAgdFBPUlQqIHBfcG9ydCA9IHBvcnRfZmluZF9tY2JfZGxjaV9wb3J0KHBfbWNiLCBkbGNpKTsKLSAgaWYgKHBfcG9ydCA9PSBudWxscHRyKSB7Ci0gICAgUkZDT01NX1RSQUNFX1dBUk5JTkcoIiVzIFVuYWJsZSB0byBmaW5kIERMQ0kgcG9ydCBkbGNpOiVkIiwgX19mdW5jX18sIGRsY2kpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICgocF9wb3J0LT5zdGF0ZSAhPSBQT1JUX1NUQVRFX09QRU5FRCkgfHwKLSAgICAgIChwX3BvcnQtPnJmYy5zdGF0ZSAhPSBSRkNfU1RBVEVfT1BFTkVEKSkKLSAgICByZXR1cm47Ci0KLSAgcF9wb3J0LT5wb3J0X2N0cmwgfD0gUE9SVF9DVFJMX1JFUV9TRU5UOwotCi0gIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCB8PSBSRkNfUlNQX01TQzsKLQotICByZmNfc2VuZF9tc2MocF9tY2IsIGRsY2ksIHRydWUsIHBfcGFycyk7Ci0gIHJmY19wb3J0X3RpbWVyX3N0YXJ0KHBfcG9ydCwgUkZDX1QyX1RJTUVPVVQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgUkZDT01NX0Zsb3dSZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwb3J0IGVudGl0eSB3aGVuIGZsb3cKLSAqICAgICAgICAgICAgICAgICAgY29udHJvbCBzdGF0ZSBoYXMgY2hhbmdlZC4gIEVuYWJsZSBmbGFnIHBhc3NlZCBzaG93cyBpZgotICogICAgICAgICAgICAgICAgICBwb3J0IGNhbiBhY2NlcHQgbW9yZSBkYXRhLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9GbG93UmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCBib29sIGVuYWJsZSkgewotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpOwotICBpZiAocF9wb3J0ID09IG51bGxwdHIpIHsKLSAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiJXMgVW5hYmxlIHRvIGZpbmQgRExDSSBwb3J0IGRsY2k6JWQiLCBfX2Z1bmNfXywgZGxjaSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKChwX3BvcnQtPnN0YXRlICE9IFBPUlRfU1RBVEVfT1BFTkVEKSB8fAotICAgICAgKHBfcG9ydC0+cmZjLnN0YXRlICE9IFJGQ19TVEFURV9PUEVORUQpKQotICAgIHJldHVybjsKLQotICBwX3BvcnQtPmxvY2FsX2N0cmwuZmMgPSAhZW5hYmxlOwotCi0gIHBfcG9ydC0+cmZjLmV4cGVjdGVkX3JzcCB8PSBSRkNfUlNQX01TQzsKLQotICByZmNfc2VuZF9tc2MocF9tY2IsIGRsY2ksIHRydWUsICZwX3BvcnQtPmxvY2FsX2N0cmwpOwotICByZmNfcG9ydF90aW1lcl9zdGFydChwX3BvcnQsIFJGQ19UMl9USU1FT1VUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9MaW5lU3RhdHVzUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgcG9ydCBlbnRpdHkgd2hlbiBsaW5lCi0gKiAgICAgICAgICAgICAgICAgIHN0YXR1cyBzaG91bGQgYmUgZGVsaXZlcmVkIHRvIHRoZSBwZWVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9MaW5lU3RhdHVzUmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB1aW50OF90IHN0YXR1cykgewotICB0UE9SVCogcF9wb3J0ID0gcG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpOwotICBpZiAocF9wb3J0ID09IG51bGxwdHIpIHsKLSAgICBSRkNPTU1fVFJBQ0VfV0FSTklORygiJXMgVW5hYmxlIHRvIGZpbmQgRExDSSBwb3J0IGRsY2k6JWQiLCBfX2Z1bmNfXywgZGxjaSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKChwX3BvcnQtPnN0YXRlICE9IFBPUlRfU1RBVEVfT1BFTkVEKSB8fAotICAgICAgKHBfcG9ydC0+cmZjLnN0YXRlICE9IFJGQ19TVEFURV9PUEVORUQpKQotICAgIHJldHVybjsKLQotICBwX3BvcnQtPnJmYy5leHBlY3RlZF9yc3AgfD0gUkZDX1JTUF9STFM7Ci0KLSAgcmZjX3NlbmRfcmxzKHBfbWNiLCBkbGNpLCB0cnVlLCBzdGF0dXMpOwotICByZmNfcG9ydF90aW1lcl9zdGFydChwX3BvcnQsIFJGQ19UMl9USU1FT1VUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9EbGNSZWxlYXNlUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgUE9SVCB1bml0IHRvIGNsb3NlIERMQwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9EbGNSZWxlYXNlUmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpKSB7Ci0gIHJmY19wb3J0X3NtX2V4ZWN1dGUocG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpLAotICAgICAgICAgICAgICAgICAgICAgIFJGQ19QT1JUX0VWRU5UX0NMT1NFLCBudWxscHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFJGQ09NTV9EYXRhUmVxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdXNlciBhcHAgdG8gc2VuZCBkYXRhIGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJGQ09NTV9EYXRhUmVxKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIHJmY19wb3J0X3NtX2V4ZWN1dGUocG9ydF9maW5kX21jYl9kbGNpX3BvcnQocF9tY2IsIGRsY2kpLCBSRkNfUE9SVF9FVkVOVF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgIHBfYnVmKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3JmY29tbS9yZmNfdHNfZnJhbWVzLmNjIGIvc3RhY2svcmZjb21tL3JmY190c19mcmFtZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDJkNzQuLjAwMDAwMDAKLS0tIGEvc3RhY2svcmZjb21tL3JmY190c19mcmFtZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIHNlbmQgVFMgMDcuMTAgZnJhbWVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9yZmNkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svcmZjb21tL3BvcnRfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svcmZjb21tL3JmY19pbnQuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NlbmRfc2FibWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgU0FCTUUgZnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlbmRfc2FibWUodFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2kpIHsKLSAgdWludDhfdCogcF9kYXRhOwotICB1aW50OF90IGNyID0gUkZDT01NX0NSKHBfbWNiLT5pc19pbml0aWF0b3IsIHRydWUpOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhSRkNPTU1fQ01EX0JVRl9TSVpFKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBTQUJNRSBmcmFtZSwgY29tbWFuZCwgUEYgPSAxLCBkbGNpICovCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IGNyIHwgKGRsY2kgPDwgUkZDT01NX1NISUZUX0RMQ0kpOwotICAqcF9kYXRhKysgPSBSRkNPTU1fU0FCTUUgfCBSRkNPTU1fUEY7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IDA7Ci0KLSAgKnBfZGF0YSA9Ci0gICAgICBSRkNPTU1fU0FCTUVfRkNTKCh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQsIGNyLCBkbGNpKTsKLQotICBwX2J1Zi0+bGVuID0gNDsKLQotICByZmNfY2hlY2tfc2VuZF9jbWQocF9tY2IsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19zZW5kX3VhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIFVBIGZyYW1lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19zZW5kX3VhKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpKSB7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgdWludDhfdCBjciA9IFJGQ09NTV9DUihwX21jYi0+aXNfaW5pdGlhdG9yLCBmYWxzZSk7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9DTURfQlVGX1NJWkUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIC8qIHVhIGZyYW1lLCByZXNwb25zZSwgUEYgPSAxLCBkbGNpICovCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IGNyIHwgKGRsY2kgPDwgUkZDT01NX1NISUZUX0RMQ0kpOwotICAqcF9kYXRhKysgPSBSRkNPTU1fVUEgfCBSRkNPTU1fUEY7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IDA7Ci0KLSAgKnBfZGF0YSA9IFJGQ09NTV9VQV9GQ1MoKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVCwgY3IsIGRsY2kpOwotCi0gIHBfYnVmLT5sZW4gPSA0OwotCi0gIHJmY19jaGVja19zZW5kX2NtZChwX21jYiwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NlbmRfZG0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgRE0gZnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlbmRfZG0odFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIGJvb2wgcGYpIHsKLSAgdWludDhfdCogcF9kYXRhOwotICB1aW50OF90IGNyID0gUkZDT01NX0NSKHBfbWNiLT5pc19pbml0aWF0b3IsIGZhbHNlKTsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoUkZDT01NX0NNRF9CVUZfU0laRSk7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfZGF0YSA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgLyogRE0gZnJhbWUsIHJlc3BvbnNlLCBQRiA9IDEsIGRsY2kgKi8KLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgY3IgfCAoZGxjaSA8PCBSRkNPTU1fU0hJRlRfRExDSSk7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9ETSB8ICgocGYpID8gUkZDT01NX1BGIDogMCk7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IDA7Ci0KLSAgKnBfZGF0YSA9IFJGQ09NTV9ETV9GQ1MoKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVCwgY3IsIGRsY2kpOwotCi0gIHBfYnVmLT5sZW4gPSA0OwotCi0gIHJmY19jaGVja19zZW5kX2NtZChwX21jYiwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NlbmRfZGlzYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBESVNDIGZyYW1lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19zZW5kX2Rpc2ModFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2kpIHsKLSAgdWludDhfdCogcF9kYXRhOwotICB1aW50OF90IGNyID0gUkZDT01NX0NSKHBfbWNiLT5pc19pbml0aWF0b3IsIHRydWUpOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhSRkNPTU1fQ01EX0JVRl9TSVpFKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBESVNDIGZyYW1lLCBjb21tYW5kLCBQRiA9IDEsIGRsY2kgKi8KLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgY3IgfCAoZGxjaSA8PCBSRkNPTU1fU0hJRlRfRExDSSk7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9ESVNDIHwgUkZDT01NX1BGOwotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCAwOwotCi0gICpwX2RhdGEgPSBSRkNPTU1fRElTQ19GQ1MoKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVCwgY3IsIGRsY2kpOwotCi0gIHBfYnVmLT5sZW4gPSA0OwotCi0gIHJmY19jaGVja19zZW5kX2NtZChwX21jYiwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NlbmRfYnVmX3VpaAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBVSUggZnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlbmRfYnVmX3VpaCh0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQ4X3QgY3IgPSBSRkNPTU1fQ1IocF9tY2ItPmlzX2luaXRpYXRvciwgdHJ1ZSk7Ci0gIHVpbnQ4X3QgY3JlZGl0czsKLQotICBwX2J1Zi0+b2Zmc2V0IC09IFJGQ09NTV9DVFJMX0ZSQU1FX0xFTjsKLSAgaWYgKHBfYnVmLT5sZW4gPiAxMjcpIHsKLSAgICBwX2J1Zi0+b2Zmc2V0LS07Ci0gIH0KLQotICBpZiAoZGxjaSkgewotICAgIGNyZWRpdHMgPSAodWludDhfdClwX2J1Zi0+bGF5ZXJfc3BlY2lmaWM7Ci0gIH0gZWxzZSB7Ci0gICAgY3JlZGl0cyA9IDA7Ci0gIH0KLQotICBpZiAoY3JlZGl0cykgewotICAgIHBfYnVmLT5vZmZzZXQtLTsKLSAgfQotCi0gIHBfZGF0YSA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0KLSAgLyogVUlIIGZyYW1lLCBjb21tYW5kLCBQRiA9IDAsIGRsY2kgKi8KLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgY3IgfCAoZGxjaSA8PCBSRkNPTU1fU0hJRlRfRExDSSk7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9VSUggfCAoKGNyZWRpdHMpID8gUkZDT01NX1BGIDogMCk7Ci0gIGlmIChwX2J1Zi0+bGVuIDw9IDEyNykgewotICAgICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IChwX2J1Zi0+bGVuIDw8IDEpOwotICAgIHBfYnVmLT5sZW4gKz0gMzsKLSAgfSBlbHNlIHsKLSAgICAqcF9kYXRhKysgPSAocF9idWYtPmxlbiAmIDB4N2YpIDw8IDE7Ci0gICAgKnBfZGF0YSsrID0gcF9idWYtPmxlbiA+PiBSRkNPTU1fU0hJRlRfTEVOR1RIMjsKLSAgICBwX2J1Zi0+bGVuICs9IDQ7Ci0gIH0KLQotICBpZiAoY3JlZGl0cykgewotICAgICpwX2RhdGErKyA9IGNyZWRpdHM7Ci0gICAgcF9idWYtPmxlbisrOwotICB9Ci0KLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCArIHBfYnVmLT5sZW4rKzsKLQotICAqcF9kYXRhID0gUkZDT01NX1VJSF9GQ1MoKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldCwgZGxjaSk7Ci0KLSAgaWYgKGRsY2kgPT0gUkZDT01NX01YX0RMQ0kpIHsKLSAgICByZmNfY2hlY2tfc2VuZF9jbWQocF9tY2IsIHBfYnVmKTsKLSAgfSBlbHNlIHsKLSAgICBMMkNBX0RhdGFXcml0ZShwX21jYi0+bGNpZCwgcF9idWYpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfc2VuZF9wbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBETEMgUGFyYW1ldGVycyBOZWdvdGlhdGlvbiBGcmFtZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfc2VuZF9wbih0UkZDX01DQiogcF9tY2IsIHVpbnQ4X3QgZGxjaSwgYm9vbCBpc19jb21tYW5kLCB1aW50MTZfdCBtdHUsCi0gICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2wsIHVpbnQ4X3QgaykgewotICB1aW50OF90KiBwX2RhdGE7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9DTURfQlVGX1NJWkUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUICsgUkZDT01NX0NUUkxfRlJBTUVfTEVOOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9JX0NSKGlzX2NvbW1hbmQpIHwgUkZDT01NX01YX1BOOwotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCAoUkZDT01NX01YX1BOX0xFTiA8PCAxKTsKLQotICAqcF9kYXRhKysgPSBkbGNpOwotICAqcF9kYXRhKysgPSBSRkNPTU1fUE5fRlJBTV9UWVBFX1VJSCB8IGNsOwotCi0gIC8qIEl0IGFwcGVhcmVkIHRoYXQgd2UgbmVlZCB0byByZXBseSB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IGJpdHMgYXMgd2UKLSAgKnJlY2VpdmVkLgotICAqKiBXZSB3aWxsIHVzZSB0aGUgZmFjdCB0aGF0IHdlIHJlcGx5IGluIHRoZSBzYW1lIGNvbnRleHQgc28gcnhfZnJhbWUgY2FuCi0gICpzdGlsbCBiZSB1c2VkLgotICAqLwotICBpZiAoaXNfY29tbWFuZCkgewotICAgICpwX2RhdGErKyA9IFJGQ09NTV9QTl9QUklPUklUWV8wOwotICB9IGVsc2UgewotICAgICpwX2RhdGErKyA9IHJmY19jYi5yZmMucnhfZnJhbWUudS5wbi5wcmlvcml0eTsKLSAgfQotICAqcF9kYXRhKysgPSBSRkNPTU1fVDFfRFNFQzsKLSAgKnBfZGF0YSsrID0gbXR1ICYgMHhGRjsKLSAgKnBfZGF0YSsrID0gbXR1ID4+IDg7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9OMjsKLSAgKnBfZGF0YSA9IGs7Ci0KLSAgLyogVG90YWwgbGVuZ3RoIGlzIHNpemVvZiBQTiBkYXRhICsgbXggaGVhZGVyIDIgKi8KLSAgcF9idWYtPmxlbiA9IFJGQ09NTV9NWF9QTl9MRU4gKyAyOwotCi0gIHJmY19zZW5kX2J1Zl91aWgocF9tY2IsIFJGQ09NTV9NWF9ETENJLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfc2VuZF9mY29uCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIEZsb3cgQ29udHJvbCBPbiBDb21tYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19zZW5kX2Zjb24odFJGQ19NQ0IqIHBfbWNiLCBib29sIGlzX2NvbW1hbmQpIHsKLSAgdWludDhfdCogcF9kYXRhOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhSRkNPTU1fQ01EX0JVRl9TSVpFKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVCArIFJGQ09NTV9DVFJMX0ZSQU1FX0xFTjsKLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCBSRkNPTU1fSV9DUihpc19jb21tYW5kKSB8IFJGQ09NTV9NWF9GQ09OOwotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCAoUkZDT01NX01YX0ZDT05fTEVOIDw8IDEpOwotCi0gIC8qIFRvdGFsIGxlbmd0aCBpcyBzaXplb2YgRkNPTiBkYXRhICsgbXggaGVhZGVyIDIgKi8KLSAgcF9idWYtPmxlbiA9IFJGQ09NTV9NWF9GQ09OX0xFTiArIDI7Ci0KLSAgcmZjX3NlbmRfYnVmX3VpaChwX21jYiwgUkZDT01NX01YX0RMQ0ksIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19zZW5kX2Zjb2ZmCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIEZsb3cgQ29udHJvbCBPZmYgQ29tbWFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfc2VuZF9mY29mZih0UkZDX01DQiogcF9tY2IsIGJvb2wgaXNfY29tbWFuZCkgewotICB1aW50OF90KiBwX2RhdGE7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9DTURfQlVGX1NJWkUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUICsgUkZDT01NX0NUUkxfRlJBTUVfTEVOOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9JX0NSKGlzX2NvbW1hbmQpIHwgUkZDT01NX01YX0ZDT0ZGOwotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCAoUkZDT01NX01YX0ZDT0ZGX0xFTiA8PCAxKTsKLQotICAvKiBUb3RhbCBsZW5ndGggaXMgc2l6ZW9mIEZDT0ZGIGRhdGEgKyBteCBoZWFkZXIgMiAqLwotICBwX2J1Zi0+bGVuID0gUkZDT01NX01YX0ZDT0ZGX0xFTiArIDI7Ci0KLSAgcmZjX3NlbmRfYnVmX3VpaChwX21jYiwgUkZDT01NX01YX0RMQ0ksIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19zZW5kX21zYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBNb2RlbSBTdGF0dXMgQ29tbWFuZCBGcmFtZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfc2VuZF9tc2ModFJGQ19NQ0IqIHBfbWNiLCB1aW50OF90IGRsY2ksIGJvb2wgaXNfY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgIHRQT1JUX0NUUkwqIHBfcGFycykgewotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQ4X3Qgc2lnbmFsczsKLSAgdWludDhfdCBicmVha19kdXJhdGlvbjsKLSAgdWludDhfdCBsZW47Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9DTURfQlVGX1NJWkUpOwotCi0gIHNpZ25hbHMgPSBwX3BhcnMtPm1vZGVtX3NpZ25hbDsKLSAgYnJlYWtfZHVyYXRpb24gPSBwX3BhcnMtPmJyZWFrX3NpZ25hbDsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVCArIFJGQ09NTV9DVFJMX0ZSQU1FX0xFTjsKLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICBpZiAoYnJlYWtfZHVyYXRpb24pCi0gICAgbGVuID0gUkZDT01NX01YX01TQ19MRU5fV0lUSF9CUkVBSzsKLSAgZWxzZQotICAgIGxlbiA9IFJGQ09NTV9NWF9NU0NfTEVOX05PX0JSRUFLOwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9JX0NSKGlzX2NvbW1hbmQpIHwgUkZDT01NX01YX01TQzsKLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgKGxlbiA8PCAxKTsKLQotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCBSRkNPTU1fQ1JfTUFTSyB8IChkbGNpIDw8IFJGQ09NTV9TSElGVF9ETENJKTsKLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgKChwX3BhcnMtPmZjKSA/IFJGQ09NTV9NU0NfRkMgOiAwKSB8Ci0gICAgICAgICAgICAgICgoc2lnbmFscyAmIE1PREVNX1NJR05BTF9EVFJEU1IpID8gUkZDT01NX01TQ19SVEMgOiAwKSB8Ci0gICAgICAgICAgICAgICgoc2lnbmFscyAmIE1PREVNX1NJR05BTF9SVFNDVFMpID8gUkZDT01NX01TQ19SVFIgOiAwKSB8Ci0gICAgICAgICAgICAgICgoc2lnbmFscyAmIE1PREVNX1NJR05BTF9SSSkgPyBSRkNPTU1fTVNDX0lDIDogMCkgfAotICAgICAgICAgICAgICAoKHNpZ25hbHMgJiBNT0RFTV9TSUdOQUxfRENEKSA/IFJGQ09NTV9NU0NfRFYgOiAwKTsKLQotICBpZiAoYnJlYWtfZHVyYXRpb24pIHsKLSAgICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCBSRkNPTU1fTVNDX0JSRUFLX1BSRVNFTlRfTUFTSyB8Ci0gICAgICAgICAgICAgICAgKGJyZWFrX2R1cmF0aW9uIDw8IFJGQ09NTV9NU0NfU0hJRlRfQlJFQUspOwotICB9Ci0KLSAgLyogVG90YWwgbGVuZ3RoIGlzIHNpemVvZiBNU0MgZGF0YSArIG14IGhlYWRlciAyICovCi0gIHBfYnVmLT5sZW4gPSBsZW4gKyAyOwotCi0gIHJmY19zZW5kX2J1Zl91aWgocF9tY2IsIFJGQ09NTV9NWF9ETENJLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfc2VuZF9ybHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgUmVtb3RlIExpbmUgU3RhdHVzIENvbW1hbmQgRnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlbmRfcmxzKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCBib29sIGlzX2NvbW1hbmQsCi0gICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgewotICB1aW50OF90KiBwX2RhdGE7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9DTURfQlVGX1NJWkUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUICsgUkZDT01NX0NUUkxfRlJBTUVfTEVOOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9JX0NSKGlzX2NvbW1hbmQpIHwgUkZDT01NX01YX1JMUzsKLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgKFJGQ09NTV9NWF9STFNfTEVOIDw8IDEpOwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9DUl9NQVNLIHwgKGRsY2kgPDwgUkZDT01NX1NISUZUX0RMQ0kpOwotICAqcF9kYXRhKysgPSBSRkNPTU1fUkxTX0VSUk9SIHwgc3RhdHVzOwotCi0gIC8qIFRvdGFsIGxlbmd0aCBpcyBzaXplb2YgUkxTIGRhdGEgKyBteCBoZWFkZXIgMiAqLwotICBwX2J1Zi0+bGVuID0gUkZDT01NX01YX1JMU19MRU4gKyAyOwotCi0gIHJmY19zZW5kX2J1Zl91aWgocF9tY2IsIFJGQ09NTV9NWF9ETENJLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfc2VuZF9uc2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgTm9uIFN1cHBvcnRlZCBDb21tYW5kIFJlc3BvbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19zZW5kX25zYyh0UkZDX01DQiogcF9tY2IpIHsKLSAgdWludDhfdCogcF9kYXRhOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhSRkNPTU1fQ01EX0JVRl9TSVpFKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVCArIFJGQ09NTV9DVFJMX0ZSQU1FX0xFTjsKLSAgcF9kYXRhID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLQotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCBSRkNPTU1fSV9DUihmYWxzZSkgfCBSRkNPTU1fTVhfTlNDOwotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCAoUkZDT01NX01YX05TQ19MRU4gPDwgMSk7Ci0KLSAgKnBfZGF0YSsrID0gcmZjX2NiLnJmYy5yeF9mcmFtZS5lYSB8Ci0gICAgICAgICAgICAgIChyZmNfY2IucmZjLnJ4X2ZyYW1lLmNyIDw8IFJGQ09NTV9TSElGVF9DUikgfAotICAgICAgICAgICAgICByZmNfY2IucmZjLnJ4X2ZyYW1lLnR5cGU7Ci0KLSAgLyogVG90YWwgbGVuZ3RoIGlzIHNpemVvZiBOU0MgZGF0YSArIG14IGhlYWRlciAyICovCi0gIHBfYnVmLT5sZW4gPSBSRkNPTU1fTVhfTlNDX0xFTiArIDI7Ci0KLSAgcmZjX3NlbmRfYnVmX3VpaChwX21jYiwgUkZDT01NX01YX0RMQ0ksIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19zZW5kX3JwbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBSZW1vdGUgUG9ydCBOZWdvdGlhdGlvbiBDb21tYW5kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlbmRfcnBuKHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCBib29sIGlzX2NvbW1hbmQsCi0gICAgICAgICAgICAgICAgICB0UE9SVF9TVEFURSogcF9wYXJzLCB1aW50MTZfdCBtYXNrKSB7Ci0gIHVpbnQ4X3QqIHBfZGF0YTsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoUkZDT01NX0NNRF9CVUZfU0laRSk7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQgKyBSRkNPTU1fQ1RSTF9GUkFNRV9MRU47Ci0gIHBfZGF0YSA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0KLSAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgUkZDT01NX0lfQ1IoaXNfY29tbWFuZCkgfCBSRkNPTU1fTVhfUlBOOwotCi0gIGlmICghcF9wYXJzKSB7Ci0gICAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgKFJGQ09NTV9NWF9SUE5fUkVRX0xFTiA8PCAxKTsKLQotICAgICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9DUl9NQVNLIHwgKGRsY2kgPDwgUkZDT01NX1NISUZUX0RMQ0kpOwotCi0gICAgcF9idWYtPmxlbiA9IFJGQ09NTV9NWF9SUE5fUkVRX0xFTiArIDI7Ci0gIH0gZWxzZSB7Ci0gICAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgKFJGQ09NTV9NWF9SUE5fTEVOIDw8IDEpOwotCi0gICAgKnBfZGF0YSsrID0gUkZDT01NX0VBIHwgUkZDT01NX0NSX01BU0sgfCAoZGxjaSA8PCBSRkNPTU1fU0hJRlRfRExDSSk7Ci0gICAgKnBfZGF0YSsrID0gcF9wYXJzLT5iYXVkX3JhdGU7Ci0gICAgKnBfZGF0YSsrID0gKHBfcGFycy0+Ynl0ZV9zaXplIDw8IFJGQ09NTV9SUE5fQklUU19TSElGVCkgfAotICAgICAgICAgICAgICAgIChwX3BhcnMtPnN0b3BfYml0cyA8PCBSRkNPTU1fUlBOX1NUT1BfQklUU19TSElGVCkgfAotICAgICAgICAgICAgICAgIChwX3BhcnMtPnBhcml0eSA8PCBSRkNPTU1fUlBOX1BBUklUWV9TSElGVCkgfAotICAgICAgICAgICAgICAgIChwX3BhcnMtPnBhcml0eV90eXBlIDw8IFJGQ09NTV9SUE5fUEFSSVRZX1RZUEVfU0hJRlQpOwotICAgICpwX2RhdGErKyA9IHBfcGFycy0+ZmNfdHlwZTsKLSAgICAqcF9kYXRhKysgPSBwX3BhcnMtPnhvbl9jaGFyOwotICAgICpwX2RhdGErKyA9IHBfcGFycy0+eG9mZl9jaGFyOwotICAgICpwX2RhdGErKyA9IChtYXNrICYgMHhGRik7Ci0gICAgKnBfZGF0YSsrID0gKG1hc2sgPj4gOCk7Ci0KLSAgICAvKiBUb3RhbCBsZW5ndGggaXMgc2l6ZW9mIFJQTiBkYXRhICsgbXggaGVhZGVyIDIgKi8KLSAgICBwX2J1Zi0+bGVuID0gUkZDT01NX01YX1JQTl9MRU4gKyAyOwotICB9Ci0KLSAgcmZjX3NlbmRfYnVmX3VpaChwX21jYiwgUkZDT01NX01YX0RMQ0ksIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19zZW5kX3Rlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VuZHMgVGVzdCBmcmFtZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfc2VuZF90ZXN0KHRSRkNfTUNCKiBwX21jYiwgYm9vbCBpc19jb21tYW5kLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIC8qIFNoaWZ0IGJ1ZmZlciB0byBnaXZlIHNwYWNlIGZvciBoZWFkZXIgKi8KLSAgaWYgKHBfYnVmLT5vZmZzZXQgPCAoTDJDQVBfTUlOX09GRlNFVCArIFJGQ09NTV9NSU5fT0ZGU0VUICsgMikpIHsKLSAgICB1aW50OF90KiBwX3NyYyA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQgKyBwX2J1Zi0+bGVuIC0gMTsKLSAgICBCVF9IRFIqIHBfbmV3X2J1ZiA9Ci0gICAgICAgIChCVF9IRFIqKW9zaV9tYWxsb2MocF9idWYtPmxlbiArIChMMkNBUF9NSU5fT0ZGU0VUICsgUkZDT01NX01JTl9PRkZTRVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiArIHNpemVvZihCVF9IRFIpICsgMSkpOwotCi0gICAgcF9uZXdfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUICsgUkZDT01NX01JTl9PRkZTRVQgKyAyOwotICAgIHBfbmV3X2J1Zi0+bGVuID0gcF9idWYtPmxlbjsKLQotICAgIHVpbnQ4X3QqIHBfZGVzdCA9Ci0gICAgICAgICh1aW50OF90KikocF9uZXdfYnVmICsgMSkgKyBwX25ld19idWYtPm9mZnNldCArIHBfbmV3X2J1Zi0+bGVuIC0gMTsKLQotICAgIGZvciAodWludDE2X3QgeHggPSAwOyB4eCA8IHBfYnVmLT5sZW47IHh4KyspICpwX2Rlc3QtLSA9ICpwX3NyYy0tOwotCi0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHBfYnVmID0gcF9uZXdfYnVmOwotICB9Ci0KLSAgLyogQWRqdXN0IG9mZnNldCBieSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGdvaW5nIHRvIGZpbGwgKi8KLSAgcF9idWYtPm9mZnNldCAtPSAyOwotICB1aW50OF90KiBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IFJGQ09NTV9JX0NSKGlzX2NvbW1hbmQpIHwgUkZDT01NX01YX1RFU1Q7Ci0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IChwX2J1Zi0+bGVuIDw8IDEpOwotCi0gIHBfYnVmLT5sZW4gKz0gMjsKLQotICByZmNfc2VuZF9idWZfdWloKHBfbWNiLCBSRkNPTU1fTVhfRExDSSwgcF9idWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3NlbmRfY3JlZGl0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgZmxvdyBjb250cm9sIGNyZWRpdCBpbiBVSUggZnJhbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlbmRfY3JlZGl0KHRSRkNfTUNCKiBwX21jYiwgdWludDhfdCBkbGNpLCB1aW50OF90IGNyZWRpdCkgewotICB1aW50OF90KiBwX2RhdGE7Ci0gIHVpbnQ4X3QgY3IgPSBSRkNPTU1fQ1IocF9tY2ItPmlzX2luaXRpYXRvciwgdHJ1ZSk7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKFJGQ09NTV9DTURfQlVGX1NJWkUpOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotCi0gICpwX2RhdGErKyA9IFJGQ09NTV9FQSB8IGNyIHwgKGRsY2kgPDwgUkZDT01NX1NISUZUX0RMQ0kpOwotICAqcF9kYXRhKysgPSBSRkNPTU1fVUlIIHwgUkZDT01NX1BGOwotICAqcF9kYXRhKysgPSBSRkNPTU1fRUEgfCAwOwotICAqcF9kYXRhKysgPSBjcmVkaXQ7Ci0gICpwX2RhdGEgPSBSRkNPTU1fVUlIX0ZDUygodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0LCBkbGNpKTsKLQotICBwX2J1Zi0+bGVuID0gNTsKLQotICByZmNfY2hlY2tfc2VuZF9jbWQocF9tY2IsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wYXJzZV9kYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBkYXRhIHBhY2tldCByZWNlaXZlZCBmcm9tIEwyQ0FQCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRSRkNfRVZFTlQgcmZjX3BhcnNlX2RhdGEodFJGQ19NQ0IqIHBfbWNiLCBNWF9GUkFNRSogcF9mcmFtZSwgQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90IGVhZCwgZWFsLCBmY3M7Ci0gIHVpbnQ4X3QqIHBfZGF0YSA9ICh1aW50OF90KikocF9idWYgKyAxKSArIHBfYnVmLT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfc3RhcnQgPSBwX2RhdGE7Ci0gIHVpbnQxNl90IGxlbjsKLQotICBpZiAocF9idWYtPmxlbiA8IFJGQ09NTV9DVFJMX0ZSQU1FX0xFTikgewotICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIExlbmd0aDE6ICVkIiwgcF9idWYtPmxlbik7Ci0gICAgcmV0dXJuIChSRkNfRVZFTlRfQkFEX0ZSQU1FKTsKLSAgfQotCi0gIFJGQ09NTV9QQVJTRV9DVFJMX0ZJRUxEKGVhZCwgcF9mcmFtZS0+Y3IsIHBfZnJhbWUtPmRsY2ksIHBfZGF0YSk7Ci0gIGlmICghZWFkKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgQWRkcmVzcyhFQSBtdXN0IGJlIDEpIik7Ci0gICAgcmV0dXJuIChSRkNfRVZFTlRfQkFEX0ZSQU1FKTsKLSAgfQotICBSRkNPTU1fUEFSU0VfVFlQRV9GSUVMRChwX2ZyYW1lLT50eXBlLCBwX2ZyYW1lLT5wZiwgcF9kYXRhKTsKLQotICBlYWwgPSAqKHBfZGF0YSkmUkZDT01NX0VBOwotICBsZW4gPSAqKHBfZGF0YSkrKyA+PiBSRkNPTU1fU0hJRlRfTEVOR1RIMTsKLSAgaWYgKGVhbCA9PSAwICYmIHBfYnVmLT5sZW4gPiBSRkNPTU1fQ1RSTF9GUkFNRV9MRU4pIHsKLSAgICBsZW4gKz0gKCoocF9kYXRhKSsrIDw8IFJGQ09NTV9TSElGVF9MRU5HVEgyKTsKLSAgfSBlbHNlIGlmIChlYWwgPT0gMCkgewotICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIExlbmd0aCB3aGVuIEVBTCA9IDA6ICVkIiwgcF9idWYtPmxlbik7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3ODI4ODAxOCIpOwotICAgIHJldHVybiBSRkNfRVZFTlRfQkFEX0ZSQU1FOwotICB9Ci0KLSAgaWYgKHBfYnVmLT5sZW4gPCAoMyArICFlYWQgKyAhZWFsICsgMSkpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyMDI1NTgwNSIpOwotICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIExlbmd0aDogJWQiLCBwX2J1Zi0+bGVuKTsKLSAgICByZXR1cm4gUkZDX0VWRU5UX0JBRF9GUkFNRTsKLSAgfQotICBwX2J1Zi0+bGVuIC09ICgzICsgIWVhZCArICFlYWwgKyAxKTsgLyogQWRkaXRpb25hbCAxIGZvciBGQ1MgKi8KLSAgcF9idWYtPm9mZnNldCArPSAoMyArICFlYWQgKyAhZWFsKTsKLQotICAvKiBoYW5kbGUgY3JlZGl0IGlmIGNyZWRpdCBiYXNlZCBmbG93IGNvbnRyb2wgKi8KLSAgaWYgKChwX21jYi0+ZmxvdyA9PSBQT1JUX0ZDX0NSRURJVCkgJiYgKHBfZnJhbWUtPnR5cGUgPT0gUkZDT01NX1VJSCkgJiYKLSAgICAgIChwX2ZyYW1lLT5kbGNpICE9IFJGQ09NTV9NWF9ETENJKSAmJiAocF9mcmFtZS0+cGYgPT0gMSkpIHsKLSAgICBpZiAocF9idWYtPmxlbiA8IHNpemVvZih1aW50OF90KSkgewotICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgTGVuZ3RoIGluIGZsb3cgY29udHJvbDogJWQiLCBwX2J1Zi0+bGVuKTsKLSAgICAgIHJldHVybiBSRkNfRVZFTlRfQkFEX0ZSQU1FOwotICAgIH0KLSAgICBwX2ZyYW1lLT5jcmVkaXQgPSAqcF9kYXRhKys7Ci0gICAgcF9idWYtPmxlbi0tOwotICAgIHBfYnVmLT5vZmZzZXQrKzsKLSAgfSBlbHNlIHsKLSAgICBwX2ZyYW1lLT5jcmVkaXQgPSAwOwotICB9Ci0KLSAgaWYgKHBfYnVmLT5sZW4gIT0gbGVuKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgTGVuZ3RoMiAlZCAlZCIsIHBfYnVmLT5sZW4sIGxlbik7Ci0gICAgcmV0dXJuIChSRkNfRVZFTlRfQkFEX0ZSQU1FKTsKLSAgfQotCi0gIGZjcyA9ICoocF9kYXRhICsgbGVuKTsKLQotICAvKiBBbGwgY29udHJvbCBmcmFtZXMgdGhhdCB3ZSBhcmUgc2VuZGluZyBhcmUgc2VudCB3aXRoIFA9MSwgZXhwZWN0ICovCi0gIC8qIHJlcGx5IHdpdGggRj0xICovCi0gIC8qIEFjY29yZGluZyB0byBUUyAwNy4xMCBzcGVjIGl2YWxpZCBmcmFtZXMgYXJlIGRpc2NhcmRlZCB3aXRob3V0ICovCi0gIC8qIG5vdGlmaWNhdGlvbiB0byB0aGUgc2VuZGVyICovCi0gIHN3aXRjaCAocF9mcmFtZS0+dHlwZSkgewotICAgIGNhc2UgUkZDT01NX1NBQk1FOgotICAgICAgaWYgKFJGQ09NTV9GUkFNRV9JU19SU1AocF9tY2ItPmlzX2luaXRpYXRvciwgcF9mcmFtZS0+Y3IpIHx8Ci0gICAgICAgICAgIXBfZnJhbWUtPnBmIHx8IGxlbiB8fCAhUkZDT01NX1ZBTElEX0RMQ0kocF9mcmFtZS0+ZGxjaSkgfHwKLSAgICAgICAgICAhcmZjX2NoZWNrX2ZjcyhSRkNPTU1fQ1RSTF9GUkFNRV9MRU4sIHBfc3RhcnQsIGZjcykpIHsKLSAgICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgU0FCTUUiKTsKLSAgICAgICAgcmV0dXJuIChSRkNfRVZFTlRfQkFEX0ZSQU1FKTsKLSAgICAgIH0gZWxzZQotICAgICAgICByZXR1cm4gKFJGQ19FVkVOVF9TQUJNRSk7Ci0KLSAgICBjYXNlIFJGQ09NTV9VQToKLSAgICAgIGlmIChSRkNPTU1fRlJBTUVfSVNfQ01EKHBfbWNiLT5pc19pbml0aWF0b3IsIHBfZnJhbWUtPmNyKSB8fAotICAgICAgICAgICFwX2ZyYW1lLT5wZiB8fCBsZW4gfHwgIVJGQ09NTV9WQUxJRF9ETENJKHBfZnJhbWUtPmRsY2kpIHx8Ci0gICAgICAgICAgIXJmY19jaGVja19mY3MoUkZDT01NX0NUUkxfRlJBTUVfTEVOLCBwX3N0YXJ0LCBmY3MpKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIFVBIik7Ci0gICAgICAgIHJldHVybiAoUkZDX0VWRU5UX0JBRF9GUkFNRSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIChSRkNfRVZFTlRfVUEpOwotCi0gICAgY2FzZSBSRkNPTU1fRE06Ci0gICAgICBpZiAoUkZDT01NX0ZSQU1FX0lTX0NNRChwX21jYi0+aXNfaW5pdGlhdG9yLCBwX2ZyYW1lLT5jcikgfHwgbGVuIHx8Ci0gICAgICAgICAgIVJGQ09NTV9WQUxJRF9ETENJKHBfZnJhbWUtPmRsY2kpIHx8Ci0gICAgICAgICAgIXJmY19jaGVja19mY3MoUkZDT01NX0NUUkxfRlJBTUVfTEVOLCBwX3N0YXJ0LCBmY3MpKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIERNIik7Ci0gICAgICAgIHJldHVybiAoUkZDX0VWRU5UX0JBRF9GUkFNRSk7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIChSRkNfRVZFTlRfRE0pOwotCi0gICAgY2FzZSBSRkNPTU1fRElTQzoKLSAgICAgIGlmIChSRkNPTU1fRlJBTUVfSVNfUlNQKHBfbWNiLT5pc19pbml0aWF0b3IsIHBfZnJhbWUtPmNyKSB8fAotICAgICAgICAgICFwX2ZyYW1lLT5wZiB8fCBsZW4gfHwgIVJGQ09NTV9WQUxJRF9ETENJKHBfZnJhbWUtPmRsY2kpIHx8Ci0gICAgICAgICAgIXJmY19jaGVja19mY3MoUkZDT01NX0NUUkxfRlJBTUVfTEVOLCBwX3N0YXJ0LCBmY3MpKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIERJU0MiKTsKLSAgICAgICAgcmV0dXJuIChSRkNfRVZFTlRfQkFEX0ZSQU1FKTsKLSAgICAgIH0gZWxzZQotICAgICAgICByZXR1cm4gKFJGQ19FVkVOVF9ESVNDKTsKLQotICAgIGNhc2UgUkZDT01NX1VJSDoKLSAgICAgIGlmICghUkZDT01NX1ZBTElEX0RMQ0kocF9mcmFtZS0+ZGxjaSkpIHsKLSAgICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgVUlIIC0gaW52YWxpZCBETENJIik7Ci0gICAgICAgIHJldHVybiAoUkZDX0VWRU5UX0JBRF9GUkFNRSk7Ci0gICAgICB9IGVsc2UgaWYgKCFyZmNfY2hlY2tfZmNzKDIsIHBfc3RhcnQsIGZjcykpIHsKLSAgICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgVUlIIC0gRkNTIik7Ci0gICAgICAgIHJldHVybiAoUkZDX0VWRU5UX0JBRF9GUkFNRSk7Ci0gICAgICB9IGVsc2UgaWYgKFJGQ09NTV9GUkFNRV9JU19SU1AocF9tY2ItPmlzX2luaXRpYXRvciwgcF9mcmFtZS0+Y3IpKSB7Ci0gICAgICAgIC8qIHdlIGFzc3VtZSB0aGF0IHRoaXMgaXMgb2sgdG8gYWxsb3cgYmFkIGltcGxlbWVudGF0aW9ucyB0byB3b3JrICovCi0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIFVJSCAtIHJlc3BvbnNlIik7Ci0gICAgICAgIHJldHVybiAoUkZDX0VWRU5UX1VJSCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKFJGQ19FVkVOVF9VSUgpOwotICAgICAgfQotICB9Ci0KLSAgcmV0dXJuIChSRkNfRVZFTlRfQkFEX0ZSQU1FKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19wcm9jZXNzX214X21lc3NhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIFVJSCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhlCi0gKiAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVyIGNvbnRyb2wgY2hhbm5lbC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfcHJvY2Vzc19teF9tZXNzYWdlKHRSRkNfTUNCKiBwX21jYiwgQlRfSERSKiBwX2J1ZikgewotICB1aW50OF90KiBwX2RhdGEgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBNWF9GUkFNRSogcF9yeF9mcmFtZSA9ICZyZmNfY2IucmZjLnJ4X2ZyYW1lOwotICB1aW50MTZfdCBsZW5ndGggPSBwX2J1Zi0+bGVuOwotICB1aW50OF90IGVhLCBjciwgbXhfbGVuOwotCi0gIGlmIChsZW5ndGggPCAyKSB7Ci0gICAgUkZDT01NX1RSQUNFX0VSUk9SKAotICAgICAgICAiJXM6IElsbGVnYWwgTVggRnJhbWUgbGVuIHdoZW4gcmVhZGluZyBFQSwgQy9SLiBsZW46JWQgPCAyIiwgX19mdW5jX18sCi0gICAgICAgIGxlbmd0aCk7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE5MzcwNjUiKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBfcnhfZnJhbWUtPmVhID0gKnBfZGF0YSAmIFJGQ09NTV9FQTsKLSAgcF9yeF9mcmFtZS0+Y3IgPSAoKnBfZGF0YSAmIFJGQ09NTV9DUl9NQVNLKSA+PiBSRkNPTU1fU0hJRlRfQ1I7Ci0gIHBfcnhfZnJhbWUtPnR5cGUgPSAqcF9kYXRhKysgJiB+KFJGQ09NTV9DUl9NQVNLIHwgUkZDT01NX0VBX01BU0spOwotCi0gIGlmICghcF9yeF9mcmFtZS0+ZWEgfHwgIWxlbmd0aCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IEludmFsaWQgTVggZnJhbWUgZWE9IiA8PCBzdGQ6OnRvX3N0cmluZyhwX3J4X2ZyYW1lLT5lYSkKLSAgICAgICAgICAgICAgIDw8ICIsIGxlbj0iIDw8IGxlbmd0aCA8PCAiLCBiZF9hZGRyPSIgPDwgcF9tY2ItPmJkX2FkZHI7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxlbmd0aC0tOwotCi0gIGJvb2wgaXNfY29tbWFuZCA9IHBfcnhfZnJhbWUtPmNyOwotCi0gIGVhID0gKnBfZGF0YSAmIFJGQ09NTV9FQTsKLQotICBteF9sZW4gPSAqcF9kYXRhKysgPj4gUkZDT01NX1NISUZUX0xFTkdUSDE7Ci0gIGxlbmd0aC0tOwotCi0gIGlmICghZWEpIHsKLSAgICBpZiAobGVuZ3RoIDwgMSkgewotICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCIlczogSWxsZWdhbCBNWCBGcmFtZSB3aGVuIEVBID0gMC4gbGVuOiVkIDwgMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGxlbmd0aCk7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTkzNzA2NSIpOwotICAgICAgb3NpX2ZyZWUocF9idWYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBteF9sZW4gKz0gKnBfZGF0YSsrIDw8IFJGQ09NTV9TSElGVF9MRU5HVEgyOwotICAgIGxlbmd0aC0tOwotICB9Ci0KLSAgaWYgKG14X2xlbiAhPSBsZW5ndGgpIHsKLSAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJhZCBNWCBmcmFtZSwgcF9tY2I9IiA8PCBwX21jYgotICAgICAgICAgICAgICAgPDwgIiwgYmRfYWRkcj0iIDw8IHBfbWNiLT5iZF9hZGRyOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBSRkNPTU1fVFJBQ0VfREVCVUcoIiVzOiB0eXBlPTB4JTAyeCwgYmRfYWRkcj0lcyIsIF9fZnVuY19fLCBwX3J4X2ZyYW1lLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgcF9tY2ItPmJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgc3dpdGNoIChwX3J4X2ZyYW1lLT50eXBlKSB7Ci0gICAgY2FzZSBSRkNPTU1fTVhfUE46Ci0gICAgICBpZiAobGVuZ3RoICE9IFJGQ09NTV9NWF9QTl9MRU4pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBJbnZhbGlkIFBOIGxlbmd0aCwgcF9tY2I9IiA8PCBwX21jYgotICAgICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHBfcnhfZnJhbWUtPmRsY2kgPSAqcF9kYXRhKysgJiBSRkNPTU1fUE5fRExDSV9NQVNLOwotICAgICAgcF9yeF9mcmFtZS0+dS5wbi5mcmFtZV90eXBlID0gKnBfZGF0YSAmIFJGQ09NTV9QTl9GUkFNRV9UWVBFX01BU0s7Ci0gICAgICBwX3J4X2ZyYW1lLT51LnBuLmNvbnZfbGF5ZXIgPSAqcF9kYXRhKysgJiBSRkNPTU1fUE5fQ09OVl9MQVlFUl9NQVNLOwotICAgICAgcF9yeF9mcmFtZS0+dS5wbi5wcmlvcml0eSA9ICpwX2RhdGErKyAmIFJGQ09NTV9QTl9QUklPUklUWV9NQVNLOwotICAgICAgcF9yeF9mcmFtZS0+dS5wbi50MSA9ICpwX2RhdGErKzsKLSAgICAgIHBfcnhfZnJhbWUtPnUucG4ubXR1ID0gKnBfZGF0YSArICgqKHBfZGF0YSArIDEpIDw8IDgpOwotICAgICAgcF9kYXRhICs9IDI7Ci0gICAgICBwX3J4X2ZyYW1lLT51LnBuLm4yID0gKnBfZGF0YSsrOwotICAgICAgcF9yeF9mcmFtZS0+dS5wbi5rID0gKnBfZGF0YSsrICYgUkZDT01NX1BOX0tfTUFTSzsKLQotICAgICAgaWYgKCFwX3J4X2ZyYW1lLT5kbGNpIHx8ICFSRkNPTU1fVkFMSURfRExDSShwX3J4X2ZyYW1lLT5kbGNpKSB8fAotICAgICAgICAgIChwX3J4X2ZyYW1lLT51LnBuLm10dSA8IFJGQ09NTV9NSU5fTVRVKSB8fAotICAgICAgICAgIChwX3J4X2ZyYW1lLT51LnBuLm10dSA+IFJGQ09NTV9NQVhfTVRVKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IEJhZCBQTiBmcmFtZSwgcF9tY2I9IiA8PCBwX21jYgotICAgICAgICAgICAgICAgICAgIDw8ICIsIGJkX2FkZHI9IiA8PCBwX21jYi0+YmRfYWRkcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgICAgcmZjX3Byb2Nlc3NfcG4ocF9tY2IsIGlzX2NvbW1hbmQsIHBfcnhfZnJhbWUpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNPTU1fTVhfVEVTVDoKLSAgICAgIGlmICghbGVuZ3RoKSBicmVhazsKLQotICAgICAgcF9yeF9mcmFtZS0+dS50ZXN0LnBfZGF0YSA9IHBfZGF0YTsKLSAgICAgIHBfcnhfZnJhbWUtPnUudGVzdC5kYXRhX2xlbiA9IGxlbmd0aDsKLQotICAgICAgcF9idWYtPm9mZnNldCArPSAyOwotICAgICAgcF9idWYtPmxlbiAtPSAyOwotCi0gICAgICBpZiAoaXNfY29tbWFuZCkKLSAgICAgICAgcmZjX3NlbmRfdGVzdChwX21jYiwgZmFsc2UsIHBfYnVmKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmZjX3Byb2Nlc3NfdGVzdF9yc3AocF9tY2IsIHBfYnVmKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDT01NX01YX0ZDT046Ci0gICAgICBpZiAobGVuZ3RoICE9IFJGQ09NTV9NWF9GQ09OX0xFTikgYnJlYWs7Ci0KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgICAgcmZjX3Byb2Nlc3NfZmNvbihwX21jYiwgaXNfY29tbWFuZCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ09NTV9NWF9GQ09GRjoKLSAgICAgIGlmIChsZW5ndGggIT0gUkZDT01NX01YX0ZDT0ZGX0xFTikgYnJlYWs7Ci0KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgICAgcmZjX3Byb2Nlc3NfZmNvZmYocF9tY2IsIGlzX2NvbW1hbmQpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBSRkNPTU1fTVhfTVNDOgotICAgICAgaWYgKGxlbmd0aCAhPSBSRkNPTU1fTVhfTVNDX0xFTl9XSVRIX0JSRUFLICYmCi0gICAgICAgICAgbGVuZ3RoICE9IFJGQ09NTV9NWF9NU0NfTEVOX05PX0JSRUFLKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiJXM6IElsbGVnYWwgTVggTVNDIEZyYW1lIGxlbjolZCIsIF9fZnVuY19fLCBsZW5ndGgpOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTkzNzA2NSIpOwotICAgICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVhID0gKnBfZGF0YSAmIFJGQ09NTV9FQTsKLSAgICAgIGNyID0gKCpwX2RhdGEgJiBSRkNPTU1fQ1JfTUFTSykgPj4gUkZDT01NX1NISUZUX0NSOwotICAgICAgcF9yeF9mcmFtZS0+ZGxjaSA9ICpwX2RhdGErKyA+PiBSRkNPTU1fU0hJRlRfRExDSTsKLQotICAgICAgaWYgKCFlYSB8fCAhY3IgfHwgIXBfcnhfZnJhbWUtPmRsY2kgfHwKLSAgICAgICAgICAhUkZDT01NX1ZBTElEX0RMQ0kocF9yeF9mcmFtZS0+ZGxjaSkpIHsKLSAgICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKCJCYWQgTVNDIGZyYW1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBwX3J4X2ZyYW1lLT51Lm1zYy5zaWduYWxzID0gKnBfZGF0YSsrOwotCi0gICAgICBpZiAobXhfbGVuID09IFJGQ09NTV9NWF9NU0NfTEVOX1dJVEhfQlJFQUspIHsKLSAgICAgICAgcF9yeF9mcmFtZS0+dS5tc2MuYnJlYWtfcHJlc2VudCA9Ci0gICAgICAgICAgICAqcF9kYXRhICYgUkZDT01NX01TQ19CUkVBS19QUkVTRU5UX01BU0s7Ci0gICAgICAgIHBfcnhfZnJhbWUtPnUubXNjLmJyZWFrX2R1cmF0aW9uID0KLSAgICAgICAgICAgICgqcF9kYXRhICYgUkZDT01NX01TQ19CUkVBS19NQVNLKSA+PiBSRkNPTU1fTVNDX1NISUZUX0JSRUFLOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9yeF9mcmFtZS0+dS5tc2MuYnJlYWtfcHJlc2VudCA9IGZhbHNlOwotICAgICAgICBwX3J4X2ZyYW1lLT51Lm1zYy5icmVha19kdXJhdGlvbiA9IDA7Ci0gICAgICB9Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0KLSAgICAgIHJmY19wcm9jZXNzX21zYyhwX21jYiwgaXNfY29tbWFuZCwgcF9yeF9mcmFtZSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFJGQ09NTV9NWF9OU0M6Ci0gICAgICBpZiAoKGxlbmd0aCAhPSBSRkNPTU1fTVhfTlNDX0xFTikgfHwgIWlzX2NvbW1hbmQpIGJyZWFrOwotCi0gICAgICBwX3J4X2ZyYW1lLT51Lm5zYy5lYSA9ICpwX2RhdGEgJiBSRkNPTU1fRUE7Ci0gICAgICBwX3J4X2ZyYW1lLT51Lm5zYy5jciA9ICgqcF9kYXRhICYgUkZDT01NX0NSX01BU0spID4+IFJGQ09NTV9TSElGVF9DUjsKLSAgICAgIHBfcnhfZnJhbWUtPnUubnNjLnR5cGUgPSAqcF9kYXRhKysgPj4gUkZDT01NX1NISUZUX0RMQ0k7Ci0KLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLQotICAgICAgcmZjX3Byb2Nlc3NfbnNjKHBfbWNiLCBwX3J4X2ZyYW1lKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDT01NX01YX1JQTjoKLSAgICAgIGlmICgobGVuZ3RoICE9IFJGQ09NTV9NWF9SUE5fUkVRX0xFTikgJiYgKGxlbmd0aCAhPSBSRkNPTU1fTVhfUlBOX0xFTikpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBlYSA9ICpwX2RhdGEgJiBSRkNPTU1fRUE7Ci0gICAgICBjciA9ICgqcF9kYXRhICYgUkZDT01NX0NSX01BU0spID4+IFJGQ09NTV9TSElGVF9DUjsKLSAgICAgIHBfcnhfZnJhbWUtPmRsY2kgPSAqcF9kYXRhKysgPj4gUkZDT01NX1NISUZUX0RMQ0k7Ci0KLSAgICAgIGlmICghZWEgfHwgIWNyIHx8ICFwX3J4X2ZyYW1lLT5kbGNpIHx8Ci0gICAgICAgICAgIVJGQ09NTV9WQUxJRF9ETENJKHBfcnhfZnJhbWUtPmRsY2kpKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIFJQTiBmcmFtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgcF9yeF9mcmFtZS0+dS5ycG4uaXNfcmVxdWVzdCA9IChsZW5ndGggPT0gUkZDT01NX01YX1JQTl9SRVFfTEVOKTsKLQotICAgICAgaWYgKCFwX3J4X2ZyYW1lLT51LnJwbi5pc19yZXF1ZXN0KSB7Ci0gICAgICAgIHBfcnhfZnJhbWUtPnUucnBuLmJhdWRfcmF0ZSA9ICpwX2RhdGErKzsKLSAgICAgICAgcF9yeF9mcmFtZS0+dS5ycG4uYnl0ZV9zaXplID0KLSAgICAgICAgICAgICgqcF9kYXRhID4+IFJGQ09NTV9SUE5fQklUU19TSElGVCkgJiBSRkNPTU1fUlBOX0JJVFNfTUFTSzsKLSAgICAgICAgcF9yeF9mcmFtZS0+dS5ycG4uc3RvcF9iaXRzID0KLSAgICAgICAgICAgICgqcF9kYXRhID4+IFJGQ09NTV9SUE5fU1RPUF9CSVRTX1NISUZUKSAmIFJGQ09NTV9SUE5fU1RPUF9CSVRTX01BU0s7Ci0gICAgICAgIHBfcnhfZnJhbWUtPnUucnBuLnBhcml0eSA9Ci0gICAgICAgICAgICAoKnBfZGF0YSA+PiBSRkNPTU1fUlBOX1BBUklUWV9TSElGVCkgJiBSRkNPTU1fUlBOX1BBUklUWV9NQVNLOwotICAgICAgICBwX3J4X2ZyYW1lLT51LnJwbi5wYXJpdHlfdHlwZSA9Ci0gICAgICAgICAgICAoKnBfZGF0YSsrID4+IFJGQ09NTV9SUE5fUEFSSVRZX1RZUEVfU0hJRlQpICYKLSAgICAgICAgICAgIFJGQ09NTV9SUE5fUEFSSVRZX1RZUEVfTUFTSzsKLQotICAgICAgICBwX3J4X2ZyYW1lLT51LnJwbi5mY190eXBlID0gKnBfZGF0YSsrICYgUkZDT01NX0ZDX01BU0s7Ci0gICAgICAgIHBfcnhfZnJhbWUtPnUucnBuLnhvbl9jaGFyID0gKnBfZGF0YSsrOwotICAgICAgICBwX3J4X2ZyYW1lLT51LnJwbi54b2ZmX2NoYXIgPSAqcF9kYXRhKys7Ci0gICAgICAgIHBfcnhfZnJhbWUtPnUucnBuLnBhcmFtX21hc2sgPQotICAgICAgICAgICAgKCpwX2RhdGEgKyAoKihwX2RhdGEgKyAxKSA8PCA4KSkgJiBSRkNPTU1fUlBOX1BNX01BU0s7Ci0gICAgICB9Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0KLSAgICAgIHJmY19wcm9jZXNzX3JwbihwX21jYiwgaXNfY29tbWFuZCwgcF9yeF9mcmFtZS0+dS5ycG4uaXNfcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICBwX3J4X2ZyYW1lKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgUkZDT01NX01YX1JMUzoKLSAgICAgIGlmIChsZW5ndGggIT0gUkZDT01NX01YX1JMU19MRU4pIGJyZWFrOwotCi0gICAgICBlYSA9ICpwX2RhdGEgJiBSRkNPTU1fRUE7Ci0gICAgICBjciA9ICgqcF9kYXRhICYgUkZDT01NX0NSX01BU0spID4+IFJGQ09NTV9TSElGVF9DUjsKLQotICAgICAgcF9yeF9mcmFtZS0+ZGxjaSA9ICpwX2RhdGErKyA+PiBSRkNPTU1fU0hJRlRfRExDSTsKLSAgICAgIHBfcnhfZnJhbWUtPnUucmxzLmxpbmVfc3RhdHVzID0gKCpwX2RhdGEgJiB+MHgwMSk7Ci0KLSAgICAgIGlmICghZWEgfHwgIWNyIHx8ICFwX3J4X2ZyYW1lLT5kbGNpIHx8Ci0gICAgICAgICAgIVJGQ09NTV9WQUxJRF9ETENJKHBfcnhfZnJhbWUtPmRsY2kpKSB7Ci0gICAgICAgIFJGQ09NTV9UUkFDRV9FUlJPUigiQmFkIFJQTiBmcmFtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgb3NpX2ZyZWUocF9idWYpOwotCi0gICAgICByZmNfcHJvY2Vzc19ybHMocF9tY2IsIGlzX2NvbW1hbmQsIHBfcnhfZnJhbWUpOwotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgb3NpX2ZyZWUocF9idWYpOwotCi0gIGlmIChpc19jb21tYW5kKSByZmNfc2VuZF9uc2MocF9tY2IpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svcmZjb21tL3JmY191dGlscy5jYyBiL3N0YWNrL3JmY29tbS9yZmNfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZWI3MWIuLjAwMDAwMDAKLS0tIGEvc3RhY2svcmZjb21tL3JmY191dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvbGxlY3Rpb24gb2YgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCB0aGUgUkZDT01NIHVuaXQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2V4dC5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX2NhbGNfZmNzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBSZXZlcnNlZCBDUkMgVGFibGUgLCA4LWJpdCwgcG9seT0weDA3Ci0gKiAgICAgICAgICAgICAgICAgIChHU00gMDcuMTAgVFMgMTAxIDM2OSBWNi4zLjApCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmZjX2NyY3RhYmxlW10gPSB7Ci0gICAgMHgwMCwgMHg5MSwgMHhFMywgMHg3MiwgMHgwNywgMHg5NiwgMHhFNCwgMHg3NSwgMHgwRSwgMHg5RiwgMHhFRCwKLSAgICAweDdDLCAweDA5LCAweDk4LCAweEVBLCAweDdCLCAweDFDLCAweDhELCAweEZGLCAweDZFLCAweDFCLCAweDhBLAotICAgIDB4RjgsIDB4NjksIDB4MTIsIDB4ODMsIDB4RjEsIDB4NjAsIDB4MTUsIDB4ODQsIDB4RjYsIDB4NjcsIDB4MzgsCi0gICAgMHhBOSwgMHhEQiwgMHg0QSwgMHgzRiwgMHhBRSwgMHhEQywgMHg0RCwgMHgzNiwgMHhBNywgMHhENSwgMHg0NCwKLSAgICAweDMxLCAweEEwLCAweEQyLCAweDQzLCAweDI0LCAweEI1LCAweEM3LCAweDU2LCAweDIzLCAweEIyLCAweEMwLAotICAgIDB4NTEsIDB4MkEsIDB4QkIsIDB4QzksIDB4NTgsIDB4MkQsIDB4QkMsIDB4Q0UsIDB4NUYsCi0KLSAgICAweDcwLCAweEUxLCAweDkzLCAweDAyLCAweDc3LCAweEU2LCAweDk0LCAweDA1LCAweDdFLCAweEVGLCAweDlELAotICAgIDB4MEMsIDB4NzksIDB4RTgsIDB4OUEsIDB4MEIsIDB4NkMsIDB4RkQsIDB4OEYsIDB4MUUsIDB4NkIsIDB4RkEsCi0gICAgMHg4OCwgMHgxOSwgMHg2MiwgMHhGMywgMHg4MSwgMHgxMCwgMHg2NSwgMHhGNCwgMHg4NiwgMHgxNywgMHg0OCwKLSAgICAweEQ5LCAweEFCLCAweDNBLCAweDRGLCAweERFLCAweEFDLCAweDNELCAweDQ2LCAweEQ3LCAweEE1LCAweDM0LAotICAgIDB4NDEsIDB4RDAsIDB4QTIsIDB4MzMsIDB4NTQsIDB4QzUsIDB4QjcsIDB4MjYsIDB4NTMsIDB4QzIsIDB4QjAsCi0gICAgMHgyMSwgMHg1QSwgMHhDQiwgMHhCOSwgMHgyOCwgMHg1RCwgMHhDQywgMHhCRSwgMHgyRiwKLQotICAgIDB4RTAsIDB4NzEsIDB4MDMsIDB4OTIsIDB4RTcsIDB4NzYsIDB4MDQsIDB4OTUsIDB4RUUsIDB4N0YsIDB4MEQsCi0gICAgMHg5QywgMHhFOSwgMHg3OCwgMHgwQSwgMHg5QiwgMHhGQywgMHg2RCwgMHgxRiwgMHg4RSwgMHhGQiwgMHg2QSwKLSAgICAweDE4LCAweDg5LCAweEYyLCAweDYzLCAweDExLCAweDgwLCAweEY1LCAweDY0LCAweDE2LCAweDg3LCAweEQ4LAotICAgIDB4NDksIDB4M0IsIDB4QUEsIDB4REYsIDB4NEUsIDB4M0MsIDB4QUQsIDB4RDYsIDB4NDcsIDB4MzUsIDB4QTQsCi0gICAgMHhEMSwgMHg0MCwgMHgzMiwgMHhBMywgMHhDNCwgMHg1NSwgMHgyNywgMHhCNiwgMHhDMywgMHg1MiwgMHgyMCwKLSAgICAweEIxLCAweENBLCAweDVCLCAweDI5LCAweEI4LCAweENELCAweDVDLCAweDJFLCAweEJGLAotCi0gICAgMHg5MCwgMHgwMSwgMHg3MywgMHhFMiwgMHg5NywgMHgwNiwgMHg3NCwgMHhFNSwgMHg5RSwgMHgwRiwgMHg3RCwKLSAgICAweEVDLCAweDk5LCAweDA4LCAweDdBLCAweEVCLCAweDhDLCAweDFELCAweDZGLCAweEZFLCAweDhCLCAweDFBLAotICAgIDB4NjgsIDB4RjksIDB4ODIsIDB4MTMsIDB4NjEsIDB4RjAsIDB4ODUsIDB4MTQsIDB4NjYsIDB4RjcsIDB4QTgsCi0gICAgMHgzOSwgMHg0QiwgMHhEQSwgMHhBRiwgMHgzRSwgMHg0QywgMHhERCwgMHhBNiwgMHgzNywgMHg0NSwgMHhENCwKLSAgICAweEExLCAweDMwLCAweDQyLCAweEQzLCAweEI0LCAweDI1LCAweDU3LCAweEM2LCAweEIzLCAweDIyLCAweDUwLAotICAgIDB4QzEsIDB4QkEsIDB4MkIsIDB4NTksIDB4QzgsIDB4QkQsIDB4MkMsIDB4NUUsIDB4Q0Z9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX2NhbGNfZmNzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSBGQ1MgZm9yIHRoZSBSRkNPTU0gZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgKEdTTSAwNy4xMCBUUyAxMDEgMzY5IFY2LjMuMCkKLSAqCi0gKiBJbnB1dCAgICAgICAgICAgIGxlbiAtIG51bWJlciBvZiBieXRlcyBpbiB0aGUgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICBwICAgLSBwb2ludHMgdG8gbWVzc2FnZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IHJmY19jYWxjX2Zjcyh1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHApIHsKLSAgdWludDhfdCBmY3MgPSAweEZGOwotCi0gIHdoaWxlIChsZW4tLSkgewotICAgIGZjcyA9IHJmY19jcmN0YWJsZVtmY3MgXiAqcCsrXTsKLSAgfQotCi0gIC8qIE9uZXMgY29tcGxpbWVudCAqLwotICByZXR1cm4gKDB4RkYgLSBmY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX2NoZWNrX2ZjcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgRkNTIGZvciB0aGUgUkZDT01NIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgIChHU00gMDcuMTAgVFMgMTAxIDM2OSBWNi4zLjApCi0gKgotICogSW5wdXQgICAgICAgICAgICBsZW4gICAgICAgICAgLSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgcCAgICAgICAgICAgIC0gcG9pbnRzIHRvIG1lc3NhZ2UKLSAqICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRfZmNzIC0gcmVjZWl2ZWQgRkNTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgcmZjX2NoZWNrX2Zjcyh1aW50MTZfdCBsZW4sIHVpbnQ4X3QqIHAsIHVpbnQ4X3QgcmVjZWl2ZWRfZmNzKSB7Ci0gIHVpbnQ4X3QgZmNzID0gMHhGRjsKLQotICB3aGlsZSAobGVuLS0pIHsKLSAgICBmY3MgPSByZmNfY3JjdGFibGVbZmNzIF4gKnArK107Ci0gIH0KLQotICAvKiBPbmVzIGNvbXBsaW1lbnQgKi8KLSAgZmNzID0gcmZjX2NyY3RhYmxlW2ZjcyBeIHJlY2VpdmVkX2Zjc107Ci0KLSAgLyoweENGIGlzIHRoZSByZXZlcnNlZCBvcmRlciBvZiAxMTExMDAxMS4qLwotICByZXR1cm4gKGZjcyA9PSAweENGKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19hbGxvY19tdWx0aXBsZXhlcl9jaGFubmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZXhpc3Rpbmcgb3IgbmV3IGNvbnRyb2wgYmxvY2sgZm9yCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBhZGRyZXNzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10UkZDX01DQiogcmZjX2FsbG9jX211bHRpcGxleGVyX2NoYW5uZWwoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2luaXRpYXRvcikgewotICBpbnQgaSwgajsKLSAgdFJGQ19NQ0IqIHBfbWNiID0gTlVMTDsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBiZF9hZGRyOiIgPDwgYmRfYWRkcjsKLSAgUkZDT01NX1RSQUNFX0RFQlVHKCJyZmNfYWxsb2NfbXVsdGlwbGV4ZXJfY2hhbm5lbDppc19pbml0aWF0b3I6JWQiLAotICAgICAgICAgICAgICAgICAgICAgaXNfaW5pdGlhdG9yKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JEX0NPTk5FQ1RJT05TOyBpKyspIHsKLSAgICBSRkNPTU1fVFJBQ0VfREVCVUcoCi0gICAgICAgICJyZmNfYWxsb2NfbXVsdGlwbGV4ZXJfY2hhbm5lbCByZmNfY2IucG9ydC5yZmNfbWNiWyVkXS5zdGF0ZTolZCIsIGksCi0gICAgICAgIHJmY19jYi5wb3J0LnJmY19tY2JbaV0uc3RhdGUpOwotICAgIFZMT0coMSkgPDwgIihyZmNfY2IucG9ydC5yZmNfbWNiW2ldLmJkX2FkZHI6IgotICAgICAgICAgICAgPDwgcmZjX2NiLnBvcnQucmZjX21jYltpXS5iZF9hZGRyOwotCi0gICAgaWYgKChyZmNfY2IucG9ydC5yZmNfbWNiW2ldLnN0YXRlICE9IFJGQ19NWF9TVEFURV9JRExFKSAmJgotICAgICAgICByZmNfY2IucG9ydC5yZmNfbWNiW2ldLmJkX2FkZHIgPT0gYmRfYWRkcikgewotICAgICAgLyogTXVsdGlwbGV4ZXIgY2hhbm5lbCBmb3VuZCBkbyBub3QgY2hhbmdlIGFueXRoaW5nICovCi0gICAgICAvKiBJZiB0aGVyZSB3YXMgYW4gaW5hY3Rpdml0eSB0aW1lciBydW5uaW5nIHN0b3AgaXQgbm93ICovCi0gICAgICBpZiAocmZjX2NiLnBvcnQucmZjX21jYltpXS5zdGF0ZSA9PSBSRkNfTVhfU1RBVEVfQ09OTkVDVEVEKQotICAgICAgICByZmNfdGltZXJfc3RvcCgmcmZjX2NiLnBvcnQucmZjX21jYltpXSk7Ci0gICAgICBSRkNPTU1fVFJBQ0VfREVCVUcoCi0gICAgICAgICAgInJmY19hbGxvY19tdWx0aXBsZXhlcl9jaGFubmVsOmlzX2luaXRpYXRvcjolZCwgZm91bmQsIHN0YXRlOiVkLCAiCi0gICAgICAgICAgInBfbWNiOiVwIiwKLSAgICAgICAgICBpc19pbml0aWF0b3IsIHJmY19jYi5wb3J0LnJmY19tY2JbaV0uc3RhdGUsICZyZmNfY2IucG9ydC5yZmNfbWNiW2ldKTsKLSAgICAgIHJldHVybiAoJnJmY19jYi5wb3J0LnJmY19tY2JbaV0pOwotICAgIH0KLSAgfQotCi0gIC8qIGNvbm5lY3Rpb24gd2l0aCBiZF9hZGRyIGRvZXMgbm90IGV4aXN0ICovCi0gIGZvciAoaSA9IDAsIGogPSByZmNfY2IucmZjLmxhc3RfbXV4ICsgMTsgaSA8IE1BWF9CRF9DT05ORUNUSU9OUzsgaSsrLCBqKyspIHsKLSAgICBpZiAoaiA+PSBNQVhfQkRfQ09OTkVDVElPTlMpIGogPSAwOwotCi0gICAgcF9tY2IgPSAmcmZjX2NiLnBvcnQucmZjX21jYltqXTsKLSAgICBpZiAocmZjX2NiLnBvcnQucmZjX21jYltqXS5zdGF0ZSA9PSBSRkNfTVhfU1RBVEVfSURMRSkgewotICAgICAgLyogTmV3IG11bHRpcGxleGVyIGNvbnRyb2wgYmxvY2sgKi8KLSAgICAgIGFsYXJtX2ZyZWUocF9tY2ItPm1jYl90aW1lcik7Ci0gICAgICBmaXhlZF9xdWV1ZV9mcmVlKHBfbWNiLT5jbWRfcSwgTlVMTCk7Ci0gICAgICBtZW1zZXQocF9tY2IsIDAsIHNpemVvZih0UkZDX01DQikpOwotICAgICAgcF9tY2ItPmJkX2FkZHIgPSBiZF9hZGRyOwotICAgICAgUkZDT01NX1RSQUNFX0RFQlVHKAotICAgICAgICAgICJyZmNfYWxsb2NfbXVsdGlwbGV4ZXJfY2hhbm5lbDppc19pbml0aWF0b3I6JWQsIGNyZWF0ZSBuZXcgcF9tY2I6JXAsICIKLSAgICAgICAgICAiaW5kZXg6JWQiLAotICAgICAgICAgIGlzX2luaXRpYXRvciwgJnJmY19jYi5wb3J0LnJmY19tY2Jbal0sIGopOwotCi0gICAgICBwX21jYi0+bWNiX3RpbWVyID0gYWxhcm1fbmV3KCJyZmNvbW1fbWNiLm1jYl90aW1lciIpOwotICAgICAgcF9tY2ItPmNtZF9xID0gZml4ZWRfcXVldWVfbmV3KFNJWkVfTUFYKTsKLQotICAgICAgcF9tY2ItPmlzX2luaXRpYXRvciA9IGlzX2luaXRpYXRvcjsKLQotICAgICAgcmZjX3RpbWVyX3N0YXJ0KHBfbWNiLCBSRkNfTUNCX0lOSVRfSU5BQ1RfVElNRVIpOwotCi0gICAgICByZmNfY2IucmZjLmxhc3RfbXV4ID0gKHVpbnQ4X3QpajsKLSAgICAgIHJldHVybiAocF9tY2IpOwotICAgIH0KLSAgfQotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3JlbGVhc2VfbXVsdGlwbGV4ZXJfY2hhbm5lbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVsZWFzZSBhIG11bHRpcGxleGVyIGNvbnRyb2wgYmxvY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfcmVsZWFzZV9tdWx0aXBsZXhlcl9jaGFubmVsKHRSRkNfTUNCKiBwX21jYikgewotICAvKiBSZW1vdmUgdGhlIE1DQiBmcm9tIHRoZSBtYXBwaW5nIHRhYmxlICovCi0gIHJmY19zYXZlX2xjaWRfbWNiKE5VTEwsIHBfbWNiLT5sY2lkKTsKLQotICAvKiBSZW1vdmUgdGhlIE1DQiBmcm9tIHRoZSBwb3J0cyAqLwotICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9SRkNfUE9SVFM7IGkrKykgewotICAgIGlmIChyZmNfY2IucG9ydC5wb3J0W2ldLnJmYy5wX21jYiA9PSBwX21jYikKLSAgICAgIHJmY19jYi5wb3J0LnBvcnRbaV0ucmZjLnBfbWNiID0gTlVMTDsKLSAgfQotCi0gIHJmY190aW1lcl9zdG9wKHBfbWNiKTsKLSAgYWxhcm1fZnJlZShwX21jYi0+bWNiX3RpbWVyKTsKLQotICBmaXhlZF9xdWV1ZV9mcmVlKHBfbWNiLT5jbWRfcSwgb3NpX2ZyZWUpOwotCi0gIG1lbXNldChwX21jYiwgMCwgc2l6ZW9mKHRSRkNfTUNCKSk7Ci0gIHBfbWNiLT5zdGF0ZSA9IFJGQ19NWF9TVEFURV9JRExFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX3RpbWVyX3N0YXJ0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBTdGFydCBSRkMgVGltZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfdGltZXJfc3RhcnQodFJGQ19NQ0IqIHBfbWNiLCB1aW50MTZfdCB0aW1lb3V0KSB7Ci0gIFJGQ09NTV9UUkFDRV9FVkVOVCgiJXMgLSB0aW1lb3V0OiVkIHNlY29uZHMiLCBfX2Z1bmNfXywgdGltZW91dCk7Ci0KLSAgdWludDY0X3QgaW50ZXJ2YWxfbXMgPSB0aW1lb3V0ICogMTAwMDsKLSAgYWxhcm1fc2V0X29uX21sb29wKHBfbWNiLT5tY2JfdGltZXIsIGludGVydmFsX21zLCByZmNvbW1fbWNiX3RpbWVyX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICBwX21jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfdGltZXJfc3RvcAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RvcCBSRkMgVGltZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfdGltZXJfc3RvcCh0UkZDX01DQiogcF9tY2IpIHsKLSAgUkZDT01NX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBhbGFybV9jYW5jZWwocF9tY2ItPm1jYl90aW1lcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcG9ydF90aW1lcl9zdGFydAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgUkZDIFRpbWVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3BvcnRfdGltZXJfc3RhcnQodFBPUlQqIHBfcG9ydCwgdWludDE2X3QgdGltZW91dCkgewotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIiVzIC0gdGltZW91dDolZCBzZWNvbmRzIiwgX19mdW5jX18sIHRpbWVvdXQpOwotCi0gIHVpbnQ2NF90IGludGVydmFsX21zID0gdGltZW91dCAqIDEwMDA7Ci0gIGFsYXJtX3NldF9vbl9tbG9vcChwX3BvcnQtPnJmYy5wb3J0X3RpbWVyLCBpbnRlcnZhbF9tcywKLSAgICAgICAgICAgICAgICAgICAgIHJmY29tbV9wb3J0X3RpbWVyX3RpbWVvdXQsIHBfcG9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcG9ydF90aW1lcl9zdG9wCi0gKgotICogRGVzY3JpcHRpb24gICAgICBTdG9wIFJGQyBUaW1lcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJmY19wb3J0X3RpbWVyX3N0b3AodFBPUlQqIHBfcG9ydCkgewotICBSRkNPTU1fVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIGFsYXJtX2NhbmNlbChwX3BvcnQtPnJmYy5wb3J0X3RpbWVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19jaGVja19tY2JfYWN0aXZlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVjayBpZiB0aGVyZSBhcmUgYW55IG9wZW5lZCBwb3J0cyBvbiB0aGUgTUNCIGlmIG5vdAotICogICAgICAgICAgICAgICAgICBzdGFydCBNQ0IgSW5hY3QgdGltZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX2NoZWNrX21jYl9hY3RpdmUodFJGQ19NQ0IqIHBfbWNiKSB7Ci0gIHVpbnQxNl90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFJGQ09NTV9NQVhfRExDSTsgaSsrKSB7Ci0gICAgaWYgKHBfbWNiLT5wb3J0X2hhbmRsZXNbaV0gIT0gMCkgewotICAgICAgcF9tY2ItPmlzX2Rpc2NfaW5pdGlhdG9yID0gZmFsc2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIC8qIFRoZSBsYXN0IHBvcnQgd2FzIERJU0NlZC4gIE9uIHRoZSBjbGllbnQgc2lkZSBzdGFydCBkaXNjb25uZWN0aW5nIE14ICovCi0gIC8qIE9uIHRoZSBzZXJ2ZXIgc2lkZSBzdGFydCBpbmFjdGl2aXR5IHRpbWVyICovCi0gIGlmIChwX21jYi0+aXNfZGlzY19pbml0aWF0b3IpIHsKLSAgICBwX21jYi0+aXNfZGlzY19pbml0aWF0b3IgPSBmYWxzZTsKLSAgICByZmNfbXhfc21fZXhlY3V0ZShwX21jYiwgUkZDX01YX0VWRU5UX0NMT1NFX1JFUSwgTlVMTCk7Ci0gIH0gZWxzZQotICAgIHJmY190aW1lcl9zdGFydChwX21jYiwgUkZDX01DQl9SRUxFQVNFX0lOQUNUX1RJTUVSKTsKLX0KLQotdm9pZCByZmNvbW1fcG9ydF90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgdFBPUlQqIHBfcG9ydCA9ICh0UE9SVCopZGF0YTsKLQotICByZmNfcG9ydF9zbV9leGVjdXRlKHBfcG9ydCwgUkZDX1BPUlRfRVZFTlRfVElNRU9VVCwgTlVMTCk7Ci19Ci0KLXZvaWQgcmZjb21tX21jYl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgdFJGQ19NQ0IqIHBfbWNiID0gKHRSRkNfTUNCKilkYXRhOwotCi0gIHJmY19teF9zbV9leGVjdXRlKHBfbWNiLCBSRkNfTVhfRVZFTlRfVElNRU9VVCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfc2VjX2NoZWNrX2NvbXBsZXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gU2VjdXJpdHkgTWFuYWdlciBmaW5pc2hlcwotICogICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb24gb2YgdGhlIHNlcnZpY2Ugc2lkZSBjb25uZWN0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3NlY19jaGVja19jb21wbGV0ZShVTlVTRURfQVRUUiBjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEsIHRCVE1fU1RBVFVTIHJlcykgewotICB0UE9SVCogcF9wb3J0ID0gKHRQT1JUKilwX3JlZl9kYXRhOwotCi0gIC8qIFZlcmlmeSB0aGF0IFBPUlQgaXMgc3RpbGwgd2FpdGluZyBmb3IgU2VjdXJpdHkgdG8gY29tcGxldGUgKi8KLSAgaWYgKCFwX3BvcnQtPmluX3VzZSB8fAotICAgICAgKChwX3BvcnQtPnJmYy5zdGF0ZSAhPSBSRkNfU1RBVEVfT1JJR19XQUlUX1NFQ19DSEVDSykgJiYKLSAgICAgICAocF9wb3J0LT5yZmMuc3RhdGUgIT0gUkZDX1NUQVRFX1RFUk1fV0FJVF9TRUNfQ0hFQ0spKSkKLSAgICByZXR1cm47Ci0KLSAgcmZjX3BvcnRfc21fZXhlY3V0ZSgodFBPUlQqKXBfcmVmX2RhdGEsIFJGQ19QT1JUX0VWRU5UX1NFQ19DT01QTEVURSwgJnJlcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfcG9ydF9jbG9zZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBwb3J0IGlzIHJlbGVhc2VkIGJhc2VkIG9uIHRoZQotICogICAgICAgICAgICAgICAgICBldmVudCByZWNlaXZlZCBmcm9tIHRoZSBsb3dlciBsYXllciwgdHlwaWNhbGx5IEwyQ0FQCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gZG93biwgRElTQywgb3IgRE0gZnJhbWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX3BvcnRfY2xvc2VkKHRQT1JUKiBwX3BvcnQpIHsKLSAgdFJGQ19NQ0IqIHBfbWNiID0gcF9wb3J0LT5yZmMucF9tY2I7Ci0gIHJmY19wb3J0X3RpbWVyX3N0b3AocF9wb3J0KTsKLSAgcF9wb3J0LT5yZmMuc3RhdGUgPSBSRkNfU1RBVEVfQ0xPU0VEOwotCi0gIC8qIElmIG11bHRpcGxleGVyIGNoYW5uZWwgd2FzIHVwIG1hcmsgaXQgYXMgZG93biAqLwotICBpZiAocF9tY2IpIHsKLSAgICBwX21jYi0+cG9ydF9oYW5kbGVzW3BfcG9ydC0+ZGxjaV0gPSAwOwotCi0gICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgcG9ydHMgb3BlbmVkIG9uIHRoaXMgTUNCIHJlbGVhc2UgaXQgKi8KLSAgICByZmNfY2hlY2tfbWNiX2FjdGl2ZShwX21jYik7Ci0gIH0KLQotICAvKiBOb3RpZnkgcG9ydCB0aGF0IFJGQyBjb25uZWN0aW9uIGlzIGdvbmUgKi8KLSAgcG9ydF9yZmNfY2xvc2VkKHBfcG9ydCwgUE9SVF9DTE9TRUQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcmZjX2luY19jcmVkaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNyZWRpdCBpcyByZWNlaXZlZCBpbiBhIFVJSAotICogICAgICAgICAgICAgICAgICBmcmFtZS4gIEl0IGluY3JlbWVudHMgdGhlIFRYIGNyZWRpdCBjb3VudCwgYW5kIGlmIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgZmxvdyBoYWQgaGFsdGVkLCBpdCByZXN0YXJ0cyBpdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfaW5jX2NyZWRpdCh0UE9SVCogcF9wb3J0LCB1aW50OF90IGNyZWRpdCkgewotICBpZiAocF9wb3J0LT5yZmMucF9tY2ItPmZsb3cgPT0gUE9SVF9GQ19DUkVESVQpIHsKLSAgICBwX3BvcnQtPmNyZWRpdF90eCArPSBjcmVkaXQ7Ci0KLSAgICBSRkNPTU1fVFJBQ0VfRVZFTlQoInJmY19pbmNfY3JlZGl0OiVkIiwgcF9wb3J0LT5jcmVkaXRfdHgpOwotCi0gICAgaWYgKHBfcG9ydC0+dHgucGVlcl9mYykgUE9SVF9GbG93SW5kKHBfcG9ydC0+cmZjLnBfbWNiLCBwX3BvcnQtPmRsY2ksIHRydWUpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICByZmNfZGVjX2NyZWRpdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgVUlIIGZyYW1lIG9mIHVzZXIgZGF0YSBpcwotICogICAgICAgICAgICAgICAgICBzZW50LiAgSXQgZGVjcmVtZW50cyB0aGUgY3JlZGl0IGNvdW50LiAgSWYgY3JlZGl0IGNvdW50Ci0gKiAgICAgICAgICAgICAgICAgIFJlYWNoZXMgemVybywgcGVlcl9mYyBpcyBzZXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmZjX2RlY19jcmVkaXQodFBPUlQqIHBfcG9ydCkgewotICBpZiAocF9wb3J0LT5yZmMucF9tY2ItPmZsb3cgPT0gUE9SVF9GQ19DUkVESVQpIHsKLSAgICBpZiAocF9wb3J0LT5jcmVkaXRfdHggPiAwKSBwX3BvcnQtPmNyZWRpdF90eC0tOwotCi0gICAgaWYgKHBfcG9ydC0+Y3JlZGl0X3R4ID09IDApIHBfcG9ydC0+dHgucGVlcl9mYyA9IHRydWU7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHJmY19jaGVja19zZW5kX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBhbiBSRkNPTU0gY29tbWFuZCBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgIG9yIHRvIGhhbmRsZSB0aGUgUkZDT01NIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByZmNfY2hlY2tfc2VuZF9jbWQodFJGQ19NQ0IqIHBfbWNiLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIC8qIGlmIHBhc3NlZCBhIGJ1ZmZlciBxdWV1ZSBpdCAqLwotICBpZiAocF9idWYgIT0gTlVMTCkgewotICAgIGlmIChwX21jYi0+Y21kX3EgPT0gTlVMTCkgewotICAgICAgUkZDT01NX1RSQUNFX0VSUk9SKAotICAgICAgICAgICIlczogZW1wdHkgcXVldWU6IHBfbWNiID0gJXAgcF9tY2ItPmxjaWQgPSAldSBjYWNoZWQgcF9tY2IgPSAlcCIsCi0gICAgICAgICAgX19mdW5jX18sIHBfbWNiLCBwX21jYi0+bGNpZCwgcmZjX2ZpbmRfbGNpZF9tY2IocF9tY2ItPmxjaWQpKTsKLSAgICB9Ci0gICAgZml4ZWRfcXVldWVfZW5xdWV1ZShwX21jYi0+Y21kX3EsIHBfYnVmKTsKLSAgfQotCi0gIC8qIGhhbmRsZSBxdWV1ZSBpZiBMMkNBUCBub3QgY29uZ2VzdGVkICovCi0gIHdoaWxlICghcF9tY2ItPmwyY2FwX2Nvbmdlc3RlZCkgewotICAgIEJUX0hEUiogcCA9IChCVF9IRFIqKWZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHBfbWNiLT5jbWRfcSk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgYnJlYWs7Ci0gICAgTDJDQV9EYXRhV3JpdGUocF9tY2ItPmxjaWQsIHApOwotICB9Ci19CmRpZmYgLS1naXQgYS9zdGFjay9zZHAvc2RwX2FwaS5jYyBiL3N0YWNrL3NkcC9zZHBfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzMyYzU0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3NkcC9zZHBfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIHRoaXMgZmlsZSBjb250YWlucyBTRFAgaW50ZXJmYWNlIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gUFRSX1RPX1VJTlQKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBDIEwgSSBFIE4gVCAgICBGIFUgTiBDIFQgSSBPIE4gICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0luaXREaXNjb3ZlcnlEYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBhIGRpc2NvdmVyeSBkYXRhYmFzZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHBfZGIgICAgICAgIC0gKGlucHV0KSBhZGRyZXNzIG9mIGFuIGFyZWEgb2YgbWVtb3J5IHdoZXJlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXJ5IGRhdGFiYXNlIGlzIG1hbmFnZWQuCi0gKiAgICAgICAgICAgICAgICAgIGxlbiAgICAgICAgIC0gKGlucHV0KSBzaXplIChpbiBieXRlcykgb2YgdGhlIG1lbW9yeQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBUaGlzIG11c3QgYmUgbGFyZ2VyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRTRFBfRElTQ09WRVJZX0RCKQotICogICAgICAgICAgICAgICAgICBudW1fdXVpZCAgICAtIChpbnB1dCkgbnVtYmVyIG9mIFVVSUQgZmlsdGVycyBhcHBsaWVkCi0gKiAgICAgICAgICAgICAgICAgIHBfdXVpZF9saXN0IC0gKGlucHV0KSBsaXN0IG9mIFVVSUQgZmlsdGVycwotICogICAgICAgICAgICAgICAgICBudW1fYXR0ciAgICAtIChpbnB1dCkgbnVtYmVyIG9mIGF0dHJpYnV0ZSBmaWx0ZXJzIGFwcGxpZWQKLSAqICAgICAgICAgICAgICAgICAgcF9hdHRyX2xpc3QgLSAoaW5wdXQpIGxpc3Qgb2YgYXR0cmlidXRlIGZpbHRlcnMKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgb25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgYmFkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0luaXREaXNjb3ZlcnlEYih0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdWludDMyX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV91dWlkLCBjb25zdCBVdWlkKiBwX3V1aWRfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fYXR0ciwgY29uc3QgdWludDE2X3QqIHBfYXR0cl9saXN0KSB7Ci0gIHVpbnQxNl90IHh4OwotCi0gIC8qIHZlcmlmeSB0aGUgcGFyYW1ldGVycyAqLwotICBpZiAocF9kYiA9PSBOVUxMIHx8IChzaXplb2YodFNEUF9ESVNDT1ZFUllfREIpID4gbGVuKSB8fAotICAgICAgbnVtX2F0dHIgPiBTRFBfTUFYX0FUVFJfRklMVEVSUyB8fCBudW1fdXVpZCA+IFNEUF9NQVhfVVVJRF9GSUxURVJTKSB7Ci0gICAgU0RQX1RSQUNFX0VSUk9SKAotICAgICAgICAiU0RQX0luaXREaXNjb3ZlcnlEYiBJbGxlZ2FsIHBhcmFtOiBwX2RiIDB4JXgsIGxlbiAlZCwgbnVtX3V1aWQgJWQsICIKLSAgICAgICAgIm51bV9hdHRyICVkIiwKLSAgICAgICAgUFRSX1RPX1VJTlQocF9kYiksIGxlbiwgbnVtX3V1aWQsIG51bV9hdHRyKTsKLQotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgbWVtc2V0KHBfZGIsIDAsIChzaXplX3QpbGVuKTsKLQotICBwX2RiLT5tZW1fc2l6ZSA9IGxlbiAtIHNpemVvZih0U0RQX0RJU0NPVkVSWV9EQik7Ci0gIHBfZGItPm1lbV9mcmVlID0gcF9kYi0+bWVtX3NpemU7Ci0gIHBfZGItPnBfZmlyc3RfcmVjID0gTlVMTDsKLSAgcF9kYi0+cF9mcmVlX21lbSA9ICh1aW50OF90KikocF9kYiArIDEpOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IG51bV91dWlkOyB4eCsrKSBwX2RiLT51dWlkX2ZpbHRlcnNbeHhdID0gKnBfdXVpZF9saXN0Kys7Ci0KLSAgcF9kYi0+bnVtX3V1aWRfZmlsdGVycyA9IG51bV91dWlkOwotCi0gIGZvciAoeHggPSAwOyB4eCA8IG51bV9hdHRyOyB4eCsrKSBwX2RiLT5hdHRyX2ZpbHRlcnNbeHhdID0gKnBfYXR0cl9saXN0Kys7Ci0KLSAgLyogc29ydCBhdHRyaWJ1dGVzICovCi0gIHNkcHVfc29ydF9hdHRyX2xpc3QobnVtX2F0dHIsIHBfZGIpOwotCi0gIHBfZGItPm51bV9hdHRyX2ZpbHRlcnMgPSBudW1fYXR0cjsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9DYW5jZWxTZXJ2aWNlU2VhcmNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbmNlbHMgYW4gYWN0aXZlIHF1ZXJ5IHRvIGFuIFNEUCBzZXJ2ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGRpc2NvdmVyeSBjYW5jZWxsZWQsIGZhbHNlIGlmIGEgbWF0Y2hpbmcgYWN0aXZpdHkgaXMKLSAqICAgICAgICAgICAgICAgICAgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9DYW5jZWxTZXJ2aWNlU2VhcmNoKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiKSB7Ci0gIHRDT05OX0NCKiBwX2NjYiA9IHNkcHVfZmluZF9jY2JfYnlfZGIocF9kYik7Ci0gIGlmICghcF9jY2IpIHJldHVybiAoZmFsc2UpOwotCi0gIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfQ0FOQ0VMKTsKLSAgcF9jY2ItPmRpc2Nfc3RhdGUgPSBTRFBfRElTQ19XQUlUX0NBTkNFTDsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9TZXJ2aWNlU2VhcmNoUmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBxdWVyaWVzIGFuIFNEUCBzZXJ2ZXIgZm9yIGluZm9ybWF0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkaXNjb3Zlcnkgc3RhcnRlZCwgZmFsc2UgaWYgZmFpbGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9TZXJ2aWNlU2VhcmNoUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKSB7Ci0gIHRDT05OX0NCKiBwX2NjYjsKLQotICAvKiBTcGVjaWZpYyBCRCBhZGRyZXNzICovCi0gIHBfY2NiID0gc2RwX2Nvbm5fb3JpZ2luYXRlKHBfYmRfYWRkcik7Ci0KLSAgaWYgKCFwX2NjYikgcmV0dXJuIChmYWxzZSk7Ci0KLSAgcF9jY2ItPmRpc2Nfc3RhdGUgPSBTRFBfRElTQ19XQUlUX0NPTk47Ci0gIHBfY2NiLT5wX2RiID0gcF9kYjsKLSAgcF9jY2ItPnBfY2IgPSBwX2NiOwotCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcXVlcmllcyBhbiBTRFAgc2VydmVyIGZvciBpbmZvcm1hdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBBUEkgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBTRFBfU2VydmljZVNlYXJjaFJlcXVlc3QgaXMgdGhhdCB0aGlzIG9uZSBkb2VzIGEKLSAqICAgICAgICAgICAgICAgICAgY29tYmluZWQgU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QgU0RQIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAoVGhpcyBpcyBmb3IgVW5wbHVnIFRlc3RpbmcpCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGRpc2NvdmVyeSBzdGFydGVkLCBmYWxzZSBpZiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IpIHsKLSAgdENPTk5fQ0IqIHBfY2NiOwotCi0gIC8qIFNwZWNpZmljIEJEIGFkZHJlc3MgKi8KLSAgcF9jY2IgPSBzZHBfY29ubl9vcmlnaW5hdGUocF9iZF9hZGRyKTsKLQotICBpZiAoIXBfY2NiKSByZXR1cm4gKGZhbHNlKTsKLQotICBwX2NjYi0+ZGlzY19zdGF0ZSA9IFNEUF9ESVNDX1dBSVRfQ09OTjsKLSAgcF9jY2ItPnBfZGIgPSBwX2RiOwotICBwX2NjYi0+cF9jYiA9IHBfY2I7Ci0KLSAgcF9jY2ItPmlzX2F0dHJfc2VhcmNoID0gdHJ1ZTsKLQotICByZXR1cm4gKHRydWUpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcXVlcmllcyBhbiBTRFAgc2VydmVyIGZvciBpbmZvcm1hdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBBUEkgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICBTRFBfU2VydmljZVNlYXJjaFJlcXVlc3QgaXMgdGhhdCB0aGlzIG9uZSBkb2VzIGEKLSAqICAgICAgICAgICAgICAgICAgY29tYmluZWQgU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QgU0RQIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAoVGhpcyBpcyBmb3IgVW5wbHVnIFRlc3RpbmcpCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGRpc2NvdmVyeSBzdGFydGVkLCBmYWxzZSBpZiBmYWlsZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0Mihjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IyKiBwX2NiMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgdENPTk5fQ0IqIHBfY2NiOwotCi0gIC8qIFNwZWNpZmljIEJEIGFkZHJlc3MgKi8KLSAgcF9jY2IgPSBzZHBfY29ubl9vcmlnaW5hdGUocF9iZF9hZGRyKTsKLQotICBpZiAoIXBfY2NiKSByZXR1cm4gKGZhbHNlKTsKLQotICBwX2NjYi0+ZGlzY19zdGF0ZSA9IFNEUF9ESVNDX1dBSVRfQ09OTjsKLSAgcF9jY2ItPnBfZGIgPSBwX2RiOwotICBwX2NjYi0+cF9jYjIgPSBwX2NiMjsKLQotICBwX2NjYi0+aXNfYXR0cl9zZWFyY2ggPSB0cnVlOwotICBwX2NjYi0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOwotCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfRmluZEF0dHJpYnV0ZUluUmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGFuIFNEUCBkaXNjb3ZlcnkgcmVjb3JkIGZvciBhCi0gKiAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGF0dHJpYnV0ZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gbWF0Y2hpbmcgYXR0cmlidXRlIGVudHJ5LCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTRFBfRElTQ19BVFRSKiBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9pZCkgewotICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyOwotCi0gIHBfYXR0ciA9IHBfcmVjLT5wX2ZpcnN0X2F0dHI7Ci0gIHdoaWxlIChwX2F0dHIpIHsKLSAgICBpZiAocF9hdHRyLT5hdHRyX2lkID09IGF0dHJfaWQpIHJldHVybiAocF9hdHRyKTsKLQotICAgIHBfYXR0ciA9IHBfYXR0ci0+cF9uZXh0X2F0dHI7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBtYXRjaGluZyBhdHRyaWJ1dGUgZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9GaW5kU2VydmljZVVVSURJblJlYwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgc2VydmljZSBVVUlEIHdpdGhpbiBhCi0gKiAgICAgICAgICAgICAgICAgIHJlY29yZCBpZiB0aGVyZSBpcyBhbnkuCi0gKgotICogUGFyYW1ldGVyczogICAgICBwX3JlYyAgICAgIC0gcG9pbnRlciB0byBhIFNEUCByZWNvcmQuCi0gKiAgICAgICAgICAgICAgICAgIHBfdXVpZCAgICAgLSBvdXRwdXQgcGFyYW1ldGVyIHRvIHNhdmUgdGhlIFVVSUQgZm91bmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLCBVdWlkKiBwX3V1aWQpIHsKLSAgdFNEUF9ESVNDX0FUVFIgKnBfYXR0ciwgKnBfc2F0dHIsICpwX2V4dHJhX3NhdHRyOwotCi0gIHBfYXR0ciA9IHBfcmVjLT5wX2ZpcnN0X2F0dHI7Ci0KLSAgd2hpbGUgKHBfYXR0cikgewotICAgIGlmICgocF9hdHRyLT5hdHRyX2lkID09IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUKSAmJgotICAgICAgICAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkpIHsKLSAgICAgIGZvciAocF9zYXR0ciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7IHBfc2F0dHI7Ci0gICAgICAgICAgIHBfc2F0dHIgPSBwX3NhdHRyLT5wX25leHRfYXR0cikgewotICAgICAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFVVSURfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfTEVOKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFV1aWQ6OmtOdW1CeXRlczE2KSB7Ci0gICAgICAgICAgICAqcF91dWlkID0gVXVpZDo6RnJvbTE2Qml0KHBfc2F0dHItPmF0dHJfdmFsdWUudi51MTYpOwotICAgICAgICAgIH0gZWxzZSBpZiAoU0RQX0RJU0NfQVRUUl9MRU4ocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgICAgICAgKnBfdXVpZCA9IFV1aWQ6OkZyb20xMjhCaXRCRShwX3NhdHRyLT5hdHRyX3ZhbHVlLnYuYXJyYXkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoU0RQX0RJU0NfQVRUUl9MRU4ocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgIFV1aWQ6OmtOdW1CeXRlczMyKSB7Ci0gICAgICAgICAgICAqcF91dWlkID0gVXVpZDo6RnJvbTMyQml0KHBfc2F0dHItPmF0dHJfdmFsdWUudi51MzIpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVja2luZyBmb3IgVG95b3RhIEcgQmxvY2sgQ2FyIEtpdDoKLSAgICAgICAgKiogIFRoaXMgY2FyIGtpdCBwdXRzIGFuIGV4dHJhIGRhdGEgZWxlbWVudCBzZXF1ZW5jZQotICAgICAgICAqKiAgd2hlcmUgdGhlIFVVSUQgaXMgc3VwcG9zZSB0byBiZSEhIQotICAgICAgICAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09Ci0gICAgICAgICAgICAgIERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpIHsKLSAgICAgICAgICAgIC8qIExvb2sgdGhyb3VnaCBkYXRhIGVsZW1lbnQgc2VxdWVuY2UgdW50aWwgbm8gbW9yZSBVVUlEcyAqLwotICAgICAgICAgICAgZm9yIChwX2V4dHJhX3NhdHRyID0gcF9zYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7Ci0gICAgICAgICAgICAgICAgIHBfZXh0cmFfc2F0dHI7IHBfZXh0cmFfc2F0dHIgPSBwX2V4dHJhX3NhdHRyLT5wX25leHRfYXR0cikgewotICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcGFzdCB0aGlzIHRvIHNlZSBpZiB0aGUgbmV4dCBhdHRyaWJ1dCBpcyBVVUlEICovCi0gICAgICAgICAgICAgIGlmICgoU0RQX0RJU0NfQVRUUl9UWVBFKHBfZXh0cmFfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09Ci0gICAgICAgICAgICAgICAgICAgVVVJRF9ERVNDX1RZUEUpCi0gICAgICAgICAgICAgICAgICAvKiBvbmx5IHN1cHBvcnQgMTYgYml0cyBVVUlEIGZvciBub3cgKi8KLSAgICAgICAgICAgICAgICAgICYmIChTRFBfRElTQ19BVFRSX0xFTihwX2V4dHJhX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSAyKSkgewotICAgICAgICAgICAgICAgICpwX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQocF9leHRyYV9zYXR0ci0+YXR0cl92YWx1ZS52LnUxNik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChwX2F0dHItPmF0dHJfaWQgPT0gQVRUUl9JRF9TRVJWSUNFX0lEKSB7Ci0gICAgICBpZiAoKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFVVSURfREVTQ19UWVBFKQotICAgICAgICAgIC8qIG9ubHkgc3VwcG9ydCAxNiBiaXRzIFVVSUQgZm9yIG5vdyAqLwotICAgICAgICAgICYmIChTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDIpKSB7Ci0gICAgICAgICpwX3V1aWQgPSBVdWlkOjpGcm9tMTZCaXQocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2KTsKLSAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcF9hdHRyID0gcF9hdHRyLT5wX25leHRfYXR0cjsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWNfMTI4Yml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIHRoZSAxMjgtYml0IHNlcnZpY2UgVVVJRAotICogICAgICAgICAgICAgICAgICB3aXRoaW4gYSByZWNvcmQgaWYgdGhlcmUgaXMgYW55LgotICoKLSAqIFBhcmFtZXRlcnM6ICAgICAgcF9yZWMgICAgICAtIHBvaW50ZXIgdG8gYSBTRFAgcmVjb3JkLgotICogICAgICAgICAgICAgICAgICBwX3V1aWQgICAgIC0gb3V0cHV0IHBhcmFtZXRlciB0byBzYXZlIHRoZSBVVUlEIGZvdW5kLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9GaW5kU2VydmljZVVVSURJblJlY18xMjhiaXQoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsIFV1aWQqIHBfdXVpZCkgewotICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyID0gcF9yZWMtPnBfZmlyc3RfYXR0cjsKLSAgd2hpbGUgKHBfYXR0cikgewotICAgIGlmICgocF9hdHRyLT5hdHRyX2lkID09IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUKSAmJgotICAgICAgICAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkpIHsKLSAgICAgIHRTRFBfRElTQ19BVFRSKiBwX3NhdHRyID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgIHdoaWxlIChwX3NhdHRyKSB7Ci0gICAgICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVVVJRF9ERVNDX1RZUEUpIHsKLSAgICAgICAgICAvKiBvbmx5IHN1cHBvcnQgMTI4IGJpdHMgVVVJRCBmb3Igbm93ICovCi0gICAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfTEVOKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDE2KSB7Ci0gICAgICAgICAgICAqcF91dWlkID0gVXVpZDo6RnJvbTEyOEJpdEJFKHBfc2F0dHItPmF0dHJfdmFsdWUudi5hcnJheSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgaWYgKHBfYXR0ci0+YXR0cl9pZCA9PSBBVFRSX0lEX1NFUlZJQ0VfSUQpIHsKLSAgICAgIGlmICgoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVVVJRF9ERVNDX1RZUEUpCi0gICAgICAgICAgLyogb25seSBzdXBwb3J0IDEyOCBiaXRzIFVVSUQgZm9yIG5vdyAqLwotICAgICAgICAgICYmIChTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDE2KSkgewotICAgICAgICAqcF91dWlkID0gVXVpZDo6RnJvbTEyOEJpdEJFKHBfYXR0ci0+YXR0cl92YWx1ZS52LmFycmF5KTsKLSAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcF9hdHRyID0gcF9hdHRyLT5wX25leHRfYXR0cjsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfRmluZFNlcnZpY2VJbkRiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHF1ZXJpZXMgYW4gU0RQIGRhdGFiYXNlIGZvciBhIHNwZWNpZmljCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIElmIHRoZSBwX3N0YXJ0X3JlYyBwb2ludGVyIGlzIE5VTEwsIGl0IGxvb2tzIGZyb20KLSAqICAgICAgICAgICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YWJhc2UsIGVsc2UgaXQgY29udGludWVzIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgIG5leHQgcmVjb3JkIGFmdGVyIHBfc3RhcnRfcmVjLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byByZWNvcmQgY29udGFpbmluZyBzZXJ2aWNlIGNsYXNzLCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTRFBfRElTQ19SRUMqIFNEUF9GaW5kU2VydmljZUluRGIoY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2VfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9zdGFydF9yZWMpIHsKLSAgdFNEUF9ESVNDX1JFQyogcF9yZWM7Ci0gIHRTRFBfRElTQ19BVFRSICpwX2F0dHIsICpwX3NhdHRyLCAqcF9leHRyYV9zYXR0cjsKLQotICAvKiBNdXN0IGhhdmUgYSB2YWxpZCBkYXRhYmFzZSAqLwotICBpZiAocF9kYiA9PSBOVUxMKSByZXR1cm4gKE5VTEwpOwotCi0gIGlmICghcF9zdGFydF9yZWMpCi0gICAgcF9yZWMgPSBwX2RiLT5wX2ZpcnN0X3JlYzsKLSAgZWxzZQotICAgIHBfcmVjID0gcF9zdGFydF9yZWMtPnBfbmV4dF9yZWM7Ci0KLSAgd2hpbGUgKHBfcmVjKSB7Ci0gICAgcF9hdHRyID0gcF9yZWMtPnBfZmlyc3RfYXR0cjsKLSAgICB3aGlsZSAocF9hdHRyKSB7Ci0gICAgICBpZiAoKHBfYXR0ci0+YXR0cl9pZCA9PSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCkgJiYKLSAgICAgICAgICAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkpIHsKLSAgICAgICAgZm9yIChwX3NhdHRyID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsgcF9zYXR0cjsKLSAgICAgICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgICBpZiAoKFNEUF9ESVNDX0FUVFJfVFlQRShwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSBVVUlEX0RFU0NfVFlQRSkgJiYKLSAgICAgICAgICAgICAgKFNEUF9ESVNDX0FUVFJfTEVOKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDIpKSB7Ci0gICAgICAgICAgICBTRFBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICAgIlNEUF9GaW5kU2VydmljZUluRGIgLSBwX3NhdHRyIHZhbHVlID0gMHgleCBzZXJ2aWNldXVpZCA9IDB4JXgiLAotICAgICAgICAgICAgICAgIHBfc2F0dHItPmF0dHJfdmFsdWUudi51MTYsIHNlcnZpY2VfdXVpZCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZV91dWlkID09IFVVSURfU0VSVkNMQVNTX0hEUF9QUk9GSUxFKSB7Ci0gICAgICAgICAgICAgIGlmICgocF9zYXR0ci0+YXR0cl92YWx1ZS52LnUxNiA9PSBVVUlEX1NFUlZDTEFTU19IRFBfU09VUkNFKSB8fAotICAgICAgICAgICAgICAgICAgKHBfc2F0dHItPmF0dHJfdmFsdWUudi51MTYgPT0gVVVJRF9TRVJWQ0xBU1NfSERQX1NJTkspKSB7Ci0gICAgICAgICAgICAgICAgU0RQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgICAgICAgICAiU0RQX0ZpbmRTZXJ2aWNlSW5EYiBmb3VuZCBIRFAgc291cmNlIG9yIHNpbmtcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAocF9yZWMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfVFlQRShwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSBVVUlEX0RFU0NfVFlQRSAmJgotICAgICAgICAgICAgICAoc2VydmljZV91dWlkID09IDAgfHwKLSAgICAgICAgICAgICAgIChTRFBfRElTQ19BVFRSX0xFTihwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSAyICYmCi0gICAgICAgICAgICAgICAgcF9zYXR0ci0+YXR0cl92YWx1ZS52LnUxNiA9PSBzZXJ2aWNlX3V1aWQpKSkKLSAgICAgICAgICAvKiBmb3IgYSBzcGVjaWZpYyB1dWlkLCBvciBhbnkgb25lICovCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChwX3JlYyk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogQ2hlY2tpbmcgZm9yIFRveW90YSBHIEJsb2NrIENhciBLaXQ6Ci0gICAgICAgICAgKiogIFRoaXMgY2FyIGtpdCBwdXRzIGFuIGV4dHJhIGRhdGEgZWxlbWVudCBzZXF1ZW5jZQotICAgICAgICAgICoqICB3aGVyZSB0aGUgVVVJRCBpcyBzdXBwb3NlIHRvIGJlISEhCi0gICAgICAgICAgKi8KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgICAgICBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgICAgIC8qIExvb2sgdGhyb3VnaCBkYXRhIGVsZW1lbnQgc2VxdWVuY2UgdW50aWwgbm8gbW9yZSBVVUlEcyAqLwotICAgICAgICAgICAgICBmb3IgKHBfZXh0cmFfc2F0dHIgPSBwX3NhdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgICAgICAgICAgICAgICBwX2V4dHJhX3NhdHRyOyBwX2V4dHJhX3NhdHRyID0gcF9leHRyYV9zYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcGFzdCB0aGlzIHRvIHNlZSBpZiB0aGUgbmV4dCBhdHRyaWJ1dCBpcyBVVUlEICovCi0gICAgICAgICAgICAgICAgaWYgKChTRFBfRElTQ19BVFRSX1RZUEUocF9leHRyYV9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgIFVVSURfREVTQ19UWVBFKSAmJgotICAgICAgICAgICAgICAgICAgICAoU0RQX0RJU0NfQVRUUl9MRU4ocF9leHRyYV9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGEgc3BlY2lmaWMgdXVpZCwgb3IgYW55IG9uZSAqLwotICAgICAgICAgICAgICAgICAgICAmJiAoKHBfZXh0cmFfc2F0dHItPmF0dHJfdmFsdWUudi51MTYgPT0gc2VydmljZV91dWlkKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNlcnZpY2VfdXVpZCA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAocF9yZWMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAocF9hdHRyLT5hdHRyX2lkID09IEFUVFJfSURfU0VSVklDRV9JRCkgewotICAgICAgICBpZiAoKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFVVSURfREVTQ19UWVBFKSAmJgotICAgICAgICAgICAgKFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gMikKLSAgICAgICAgICAgIC8qIGZpbmQgYSBzcGVjaWZpYyBVVUlEIG9yIGFueW9uZSAqLwotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICgocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2ID09IHNlcnZpY2VfdXVpZCkgfHwgc2VydmljZV91dWlkID09IDApKQotICAgICAgICAgIHJldHVybiAocF9yZWMpOwotICAgICAgfQotCi0gICAgICBwX2F0dHIgPSBwX2F0dHItPnBfbmV4dF9hdHRyOwotICAgIH0KLQotICAgIHBfcmVjID0gcF9yZWMtPnBfbmV4dF9yZWM7Ci0gIH0KLSAgLyogSWYgaGVyZSwgbm8gbWF0Y2hpbmcgVVVJRCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRTZXJ2aWNlSW5EYl8xMjhiaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFF1ZXJ5IGFuIFNEUCBkYXRhYmFzZSBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlLiBJZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcF9zdGFydF9yZWMgcG9pbnRlciBpcyBOVUxMLCBpdCBsb29rcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKLSAqICAgICAgICAgICAgICAgICAgdGhlIGRhdGFiYXNlLCBlbHNlIGl0IGNvbnRpbnVlcyBmcm9tIHRoZSBuZXh0IHJlY29yZCBhZnRlcgotICogICAgICAgICAgICAgICAgICBwX3N0YXJ0X3JlYy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMga2VwdCBzZXBhcmF0ZSBmcm9tIFNEUF9GaW5kU2VydmljZUluRGIKLSAqICAgICAgICAgICAgICAgICAgc2luY2UgdGhhdCBBUEkgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIG9ubHkgMTYtYml0IFVVSURzCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHJlY29yZCBjb250YWluaW5nIHNlcnZpY2UgY2xhc3MsIG9yIE5VTEwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFNEUF9ESVNDX1JFQyogU0RQX0ZpbmRTZXJ2aWNlSW5EYl8xMjhiaXQoY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3N0YXJ0X3JlYykgewotICB0U0RQX0RJU0NfUkVDKiBwX3JlYzsKLSAgdFNEUF9ESVNDX0FUVFIgKnBfYXR0ciwgKnBfc2F0dHI7Ci0KLSAgLyogTXVzdCBoYXZlIGEgdmFsaWQgZGF0YWJhc2UgKi8KLSAgaWYgKHBfZGIgPT0gTlVMTCkgcmV0dXJuIChOVUxMKTsKLQotICBpZiAoIXBfc3RhcnRfcmVjKQotICAgIHBfcmVjID0gcF9kYi0+cF9maXJzdF9yZWM7Ci0gIGVsc2UKLSAgICBwX3JlYyA9IHBfc3RhcnRfcmVjLT5wX25leHRfcmVjOwotCi0gIHdoaWxlIChwX3JlYykgewotICAgIHBfYXR0ciA9IHBfcmVjLT5wX2ZpcnN0X2F0dHI7Ci0gICAgd2hpbGUgKHBfYXR0cikgewotICAgICAgaWYgKChwX2F0dHItPmF0dHJfaWQgPT0gQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QpICYmCi0gICAgICAgICAgKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09Ci0gICAgICAgICAgIERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpKSB7Ci0gICAgICAgIGZvciAocF9zYXR0ciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7IHBfc2F0dHI7Ci0gICAgICAgICAgICAgcF9zYXR0ciA9IHBfc2F0dHItPnBfbmV4dF9hdHRyKSB7Ci0gICAgICAgICAgaWYgKChTRFBfRElTQ19BVFRSX1RZUEUocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVVVJRF9ERVNDX1RZUEUpICYmCi0gICAgICAgICAgICAgIChTRFBfRElTQ19BVFRSX0xFTihwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSAxNikpIHsKLSAgICAgICAgICAgIHJldHVybiAocF9yZWMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAocF9hdHRyLT5hdHRyX2lkID09IEFUVFJfSURfU0VSVklDRV9JRCkgewotICAgICAgICBpZiAoKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFVVSURfREVTQ19UWVBFKSAmJgotICAgICAgICAgICAgKFNEUF9ESVNDX0FUVFJfTEVOKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gMTYpKQotICAgICAgICAgIHJldHVybiAocF9yZWMpOwotICAgICAgfQotCi0gICAgICBwX2F0dHIgPSBwX2F0dHItPnBfbmV4dF9hdHRyOwotICAgIH0KLQotICAgIHBfcmVjID0gcF9yZWMtPnBfbmV4dF9yZWM7Ci0gIH0KLSAgLyogSWYgaGVyZSwgbm8gbWF0Y2hpbmcgVVVJRCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRTZXJ2aWNlVVVJREluRGIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFF1ZXJ5IGFuIFNEUCBkYXRhYmFzZSBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlLiBJZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcF9zdGFydF9yZWMgcG9pbnRlciBpcyBOVUxMLCBpdCBsb29rcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKLSAqICAgICAgICAgICAgICAgICAgdGhlIGRhdGFiYXNlLCBlbHNlIGl0IGNvbnRpbnVlcyBmcm9tIHRoZSBuZXh0IHJlY29yZCBhZnRlcgotICogICAgICAgICAgICAgICAgICBwX3N0YXJ0X3JlYy4KLSAqCi0gKiBOT1RFICAgICAgICAgICAgIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgcHJldmlvdXMKLSAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gIlNEUF9GaW5kU2VydmljZUluRGIoKSIgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzCi0gKiAgICAgICAgICAgICAgICAgIGEgVXVpZCBpbnB1dAotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byByZWNvcmQgY29udGFpbmluZyBzZXJ2aWNlIGNsYXNzLCBvciBOVUxMCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTRFBfRElTQ19SRUMqIFNEUF9GaW5kU2VydmljZVVVSURJbkRiKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKSB7Ci0gIHRTRFBfRElTQ19SRUMqIHBfcmVjOwotICB0U0RQX0RJU0NfQVRUUiAqcF9hdHRyLCAqcF9zYXR0cjsKLQotICAvKiBNdXN0IGhhdmUgYSB2YWxpZCBkYXRhYmFzZSAqLwotICBpZiAocF9kYiA9PSBOVUxMKSByZXR1cm4gKE5VTEwpOwotCi0gIGlmICghcF9zdGFydF9yZWMpCi0gICAgcF9yZWMgPSBwX2RiLT5wX2ZpcnN0X3JlYzsKLSAgZWxzZQotICAgIHBfcmVjID0gcF9zdGFydF9yZWMtPnBfbmV4dF9yZWM7Ci0KLSAgd2hpbGUgKHBfcmVjKSB7Ci0gICAgcF9hdHRyID0gcF9yZWMtPnBfZmlyc3RfYXR0cjsKLSAgICB3aGlsZSAocF9hdHRyKSB7Ci0gICAgICBpZiAoKHBfYXR0ci0+YXR0cl9pZCA9PSBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCkgJiYKLSAgICAgICAgICAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkpIHsKLSAgICAgICAgZm9yIChwX3NhdHRyID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsgcF9zYXR0cjsKLSAgICAgICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFVVSURfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoc2RwdV9jb21wYXJlX3V1aWRfd2l0aF9hdHRyKHV1aWQsIHBfc2F0dHIpKSByZXR1cm4gKHBfcmVjKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYgKHBfYXR0ci0+YXR0cl9pZCA9PSBBVFRSX0lEX1NFUlZJQ0VfSUQpIHsKLSAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IFVVSURfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgaWYgKHNkcHVfY29tcGFyZV91dWlkX3dpdGhfYXR0cih1dWlkLCBwX2F0dHIpKSByZXR1cm4gKHBfcmVjKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwX2F0dHIgPSBwX2F0dHItPnBfbmV4dF9hdHRyOwotICAgIH0KLQotICAgIHBfcmVjID0gcF9yZWMtPnBfbmV4dF9yZWM7Ci0gIH0KLSAgLyogSWYgaGVyZSwgbm8gbWF0Y2hpbmcgVVVJRCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2ZpbGxfcHJvdG9fZWxlbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHByb3RvY29sIGVsZW1lbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgSWYgZm91bmQsIHRoZSBwYXNzZWQgcHJvdG9jb2wgbGlzdCBlbGVtZW50IGlzIGZpbGxlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgc2RwX2ZpbGxfcHJvdG9fZWxlbShjb25zdCB0U0RQX0RJU0NfQVRUUiogcF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXllcl91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1BST1RPQ09MX0VMRU0qIHBfZWxlbSkgewotICB0U0RQX0RJU0NfQVRUUiogcF9zYXR0cjsKLQotICAvKiBXYWxrIHRocm91Z2ggdGhlIHByb3RvY29sIGRlc2NyaXB0b3IgbGlzdCAqLwotICBmb3IgKHBfYXR0ciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7IHBfYXR0cjsKLSAgICAgICBwX2F0dHIgPSBwX2F0dHItPnBfbmV4dF9hdHRyKSB7Ci0gICAgLyogU2FmZXR5IGNoZWNrIC0gZWFjaCBlbnRyeSBzaG91bGQgaXRzZWxmIGJlIGEgc2VxdWVuY2UgKi8KLSAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgIT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkKLSAgICAgIHJldHVybiAoZmFsc2UpOwotCi0gICAgLyogTm93LCBzZWUgaWYgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBsYXllciB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLwotICAgIGZvciAocF9zYXR0ciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7IHBfc2F0dHI7Ci0gICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgIC8qIFNEUF9UUkFDRV9ERUJVRyAoIlNEUCAtIHBfc2F0dHIgMHgleCwgbGF5ZXJfdXVpZDoweCV4LCB1MTY6MHgleCMjIyMiLAotICAgICAgICAgIHBfc2F0dHIsIGxheWVyX3V1aWQsIHBfc2F0dHItPmF0dHJfdmFsdWUudi51MTYpOyAqLwotCi0gICAgICBpZiAoKFNEUF9ESVNDX0FUVFJfVFlQRShwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSBVVUlEX0RFU0NfVFlQRSkgJiYKLSAgICAgICAgICAoU0RQX0RJU0NfQVRUUl9MRU4ocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gMikgJiYKLSAgICAgICAgICAocF9zYXR0ci0+YXR0cl92YWx1ZS52LnUxNiA9PSBsYXllcl91dWlkKSkgewotICAgICAgICAvKiBCaW5nby4gTm93IGZpbGwgaW4gdGhlIHBhc3NlZCBlbGVtZW50ICovCi0gICAgICAgIHBfZWxlbS0+cHJvdG9jb2xfdXVpZCA9IGxheWVyX3V1aWQ7Ci0gICAgICAgIHBfZWxlbS0+bnVtX3BhcmFtcyA9IDA7Ci0KLSAgICAgICAgLyogU3RvcmUgdGhlIHBhcmFtZXRlcnMsIGlmIGFueSAqLwotICAgICAgICBmb3IgKHBfc2F0dHIgPSBwX3NhdHRyLT5wX25leHRfYXR0cjsgcF9zYXR0cjsKLSAgICAgICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpICE9IFVJTlRfREVTQ19UWVBFKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBpZiAoU0RQX0RJU0NfQVRUUl9MRU4ocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gMikKLSAgICAgICAgICAgIHBfZWxlbS0+cGFyYW1zW3BfZWxlbS0+bnVtX3BhcmFtcysrXSA9IHBfc2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcF9lbGVtLT5wYXJhbXNbcF9lbGVtLT5udW1fcGFyYW1zKytdID0gcF9zYXR0ci0+YXR0cl92YWx1ZS52LnU4OwotCi0gICAgICAgICAgaWYgKHBfZWxlbS0+bnVtX3BhcmFtcyA+PSBTRFBfTUFYX1BST1RPQ09MX1BBUkFNUykgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IGEgc3BlY2lmaWMgZGlzY292ZXJ5IHJlY29yZCBmb3IgYQotICogICAgICAgICAgICAgICAgICBwcm90b2NvbCBsaXN0IGVsZW1lbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgSWYgZm91bmQsIHRoZSBwYXNzZWQgcHJvdG9jb2wgbGlzdCBlbGVtZW50IGlzIGZpbGxlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF5ZXJfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW0pIHsKLSAgdFNEUF9ESVNDX0FUVFIqIHBfYXR0cjsKLQotICBwX2F0dHIgPSBwX3JlYy0+cF9maXJzdF9hdHRyOwotICB3aGlsZSAocF9hdHRyKSB7Ci0gICAgLyogRmluZCB0aGUgcHJvdG9jb2wgZGVzY3JpcHRvciBsaXN0ICovCi0gICAgaWYgKChwX2F0dHItPmF0dHJfaWQgPT0gQVRUUl9JRF9QUk9UT0NPTF9ERVNDX0xJU1QpICYmCi0gICAgICAgIChTRFBfRElTQ19BVFRSX1RZUEUocF9hdHRyLT5hdHRyX2xlbl90eXBlKSA9PSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSkgewotICAgICAgcmV0dXJuIHNkcF9maWxsX3Byb3RvX2VsZW0ocF9hdHRyLCBsYXllcl91dWlkLCBwX2VsZW0pOwotICAgIH0KLSAgICBwX2F0dHIgPSBwX2F0dHItPnBfbmV4dF9hdHRyOwotICB9Ci0gIC8qIElmIGhlcmUsIG5vIG1hdGNoIGZvdW5kICovCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0ZpbmRQcm9maWxlVmVyc2lvbkluUmVjCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IGEgc3BlY2lmaWMgZGlzY292ZXJ5IHJlY29yZCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgIFByb2ZpbGUgbGlzdCBkZXNjcmlwdG9yLCBhbmQgcHVsbHMgb3V0IHRoZSB2ZXJzaW9uIG51bWJlci4KLSAqICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gbnVtYmVyIGNvbnNpc3RzIG9mIGFuIDgtYml0IG1ham9yIHZlcnNpb24gYW5kCi0gKiAgICAgICAgICAgICAgICAgIGFuIDgtYml0IG1pbm9yIHZlcnNpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgSWYgZm91bmQsIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIHRoYXQgd2VyZQotICogICAgICAgICAgICAgICAgICBwYXNzZWQgaW4gYXJlIGZpbGxlZCBpbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9maWxlX3V1aWQsIHVpbnQxNl90KiBwX3ZlcnNpb24pIHsKLSAgdFNEUF9ESVNDX0FUVFIgKnBfYXR0ciwgKnBfc2F0dHI7Ci0KLSAgcF9hdHRyID0gcF9yZWMtPnBfZmlyc3RfYXR0cjsKLSAgd2hpbGUgKHBfYXR0cikgewotICAgIC8qIEZpbmQgdGhlIHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ICovCi0gICAgaWYgKChwX2F0dHItPmF0dHJfaWQgPT0gQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCkgJiYKLSAgICAgICAgKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpKSB7Ci0gICAgICAvKiBXYWxrIHRocm91Z2ggdGhlIHByb3RvY29sIGRlc2NyaXB0b3IgbGlzdCAqLwotICAgICAgZm9yIChwX2F0dHIgPSBwX2F0dHItPmF0dHJfdmFsdWUudi5wX3N1Yl9hdHRyOyBwX2F0dHI7Ci0gICAgICAgICAgIHBfYXR0ciA9IHBfYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgLyogU2FmZXR5IGNoZWNrIC0gZWFjaCBlbnRyeSBzaG91bGQgaXRzZWxmIGJlIGEgc2VxdWVuY2UgKi8KLSAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfVFlQRShwX2F0dHItPmF0dHJfbGVuX3R5cGUpICE9IERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpCi0gICAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgICAgICAgLyogTm93LCBzZWUgaWYgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBwcm9maWxlIFVVSUQgd2UgYXJlIGludGVyZXN0ZWQgaW4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAocF9zYXR0ciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7IHBfc2F0dHI7Ci0gICAgICAgICAgICAgcF9zYXR0ciA9IHBfc2F0dHItPnBfbmV4dF9hdHRyKSB7Ci0gICAgICAgICAgaWYgKChTRFBfRElTQ19BVFRSX1RZUEUocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVVVJRF9ERVNDX1RZUEUpICYmCi0gICAgICAgICAgICAgIChTRFBfRElTQ19BVFRSX0xFTihwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PQotICAgICAgICAgICAgICAgMikgLyogPC0gVGhpcyBpcyBieXRlcywgbm90IHNpemUgY29kZSEgKi8KLSAgICAgICAgICAgICAgJiYgKHBfc2F0dHItPmF0dHJfdmFsdWUudi51MTYgPT0gcHJvZmlsZV91dWlkKSkgewotICAgICAgICAgICAgLyogTm93IGZpbGwgaW4gdGhlIG1ham9yIGFuZCBtaW5vciBudW1iZXJzICovCi0gICAgICAgICAgICAvKiBpZiB0aGUgYXR0cmlidXRlIG1hdGNoZXMgdGhlIGRlc2NyaXB0aW9uIGZvciB2ZXJzaW9uICh0eXBlIFVJTlQsCi0gICAgICAgICAgICAgKiBzaXplIDIgYnl0ZXMpICovCi0gICAgICAgICAgICBwX3NhdHRyID0gcF9zYXR0ci0+cF9uZXh0X2F0dHI7Ci0KLSAgICAgICAgICAgIGlmICgoU0RQX0RJU0NfQVRUUl9UWVBFKHBfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09Ci0gICAgICAgICAgICAgICAgIFVJTlRfREVTQ19UWVBFKSAmJgotICAgICAgICAgICAgICAgIChTRFBfRElTQ19BVFRSX0xFTihwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSA9PSAyKSkgewotICAgICAgICAgICAgICAvKiBUaGUgaGlnaCBvcmRlciA4IGJpdHMgaXMgdGhlIG1ham9yIG51bWJlciwgbG93IG9yZGVyIGlzIHRoZQotICAgICAgICAgICAgICAgKiBtaW5vciBudW1iZXIgKGJpZyBlbmRpYW4pICovCi0gICAgICAgICAgICAgICpwX3ZlcnNpb24gPSBwX3NhdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotCi0gICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7IC8qIFRoZSB0eXBlIGFuZC9vciBzaXplIHdhcyBub3QgdmFsaWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBsaXN0IHZlcnNpb24gKi8KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQotICAgIHBfYXR0ciA9IHBfYXR0ci0+cF9uZXh0X2F0dHI7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBtYXRjaCBmb3VuZCAqLwotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgIERldmljZSBJZGVudGlmaWNhdGlvbiAoREkpIENsaWVudCBGdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfRGlEaXNjb3ZlcgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBxdWVyaWVzIGEgcmVtb3RlIGRldmljZSBmb3IgREkgaW5mb3JtYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICBTRFBfU1VDQ0VTUyBpZiBxdWVyeSBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgZWxzZSBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U0RQX1NUQVRVUyBTRFBfRGlEaXNjb3Zlcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsIHVpbnQzMl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKSB7Ci0gIHRTRFBfU1RBVFVTIHJlc3VsdCA9IFNEUF9ESV9ESVNDX0ZBSUxFRDsKLSAgdWludDE2X3QgbnVtX3V1aWRzID0gMTsKLSAgdWludDE2X3QgZGlfdXVpZCA9IFVVSURfU0VSVkNMQVNTX1BOUF9JTkZPUk1BVElPTjsKLQotICAvKiBidWlsZCB1dWlkIGZvciBkYiBpbml0ICovCi0gIFV1aWQgaW5pdF91dWlkID0gVXVpZDo6RnJvbTE2Qml0KGRpX3V1aWQpOwotCi0gIGlmIChTRFBfSW5pdERpc2NvdmVyeURiKHBfZGIsIGxlbiwgbnVtX3V1aWRzLCAmaW5pdF91dWlkLCAwLCBOVUxMKSkKLSAgICBpZiAoU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0KHJlbW90ZV9kZXZpY2UsIHBfZGIsIHBfY2IpKQotICAgICAgcmVzdWx0ID0gU0RQX1NVQ0NFU1M7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9HZXROdW1EaVJlY29yZHMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlYXJjaGVzIHNwZWNpZmllZCBkYXRhYmFzZSBmb3IgREkgcmVjb3JkcwotICoKLSAqIFJldHVybnMgICAgICAgICAgbnVtYmVyIG9mIERJIHJlY29yZHMgZm91bmQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBTRFBfR2V0TnVtRGlSZWNvcmRzKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiKSB7Ci0gIHVpbnQ4X3QgbnVtX3JlY29yZHMgPSAwOwotICB0U0RQX0RJU0NfUkVDKiBwX2N1cnJfcmVjb3JkID0gTlVMTDsKLQotICBkbyB7Ci0gICAgcF9jdXJyX3JlY29yZCA9IFNEUF9GaW5kU2VydmljZUluRGIocF9kYiwgVVVJRF9TRVJWQ0xBU1NfUE5QX0lORk9STUFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3Vycl9yZWNvcmQpOwotICAgIGlmIChwX2N1cnJfcmVjb3JkKSBudW1fcmVjb3JkcysrOwotICB9IHdoaWxlIChwX2N1cnJfcmVjb3JkKTsKLQotICByZXR1cm4gbnVtX3JlY29yZHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfQXR0clN0cmluZ0NvcHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY29weSBnaXZlbiBhdHRyaWJ1dGUgdG8gc3BlY2lmaWVkIGJ1ZmZlciBhcyBhCi0gKiAgICAgICAgICAgICAgICAgIHN0cmluZwotICoKLSAqIFJldHVybnMgICAgICAgICAgbm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBTRFBfQXR0clN0cmluZ0NvcHkoY2hhciogZHN0LCBjb25zdCB0U0RQX0RJU0NfQVRUUiogcF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRzdF9zaXplKSB7Ci0gIGlmIChkc3QgPT0gTlVMTCkgcmV0dXJuOwotICBpZiAocF9hdHRyKSB7Ci0gICAgdWludDE2X3QgbGVuID0gU0RQX0RJU0NfQVRUUl9MRU4ocF9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICBpZiAobGVuID4gZHN0X3NpemUgLSAxKSB7Ci0gICAgICBsZW4gPSBkc3Rfc2l6ZSAtIDE7Ci0gICAgfQotICAgIG1lbWNweShkc3QsIChjb25zdCB2b2lkKilwX2F0dHItPmF0dHJfdmFsdWUudi5hcnJheSwgbGVuKTsKLSAgICBkc3RbbGVuXSA9ICdcMCc7Ci0gIH0gZWxzZSB7Ci0gICAgZHN0WzBdID0gJ1wwJzsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX0dldERpUmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhIHJlbW90ZSBkZXZpY2UncyBESSByZWNvcmQgZnJvbQotICogICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgU0RQX1NVQ0NFU1MgaWYgcmVjb3JkIHJldHJpZXZlZCwgZWxzZSBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBTRFBfR2V0RGlSZWNvcmQodWludDhfdCBnZXRfcmVjb3JkX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElfR0VUX1JFQ09SRCogcF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgewotICB1aW50MTZfdCByZXN1bHQgPSBTRFBfTk9fRElfUkVDT1JEX0ZPVU5EOwotICB1aW50OF90IGN1cnJfcmVjb3JkX2luZGV4ID0gMTsKLQotICB0U0RQX0RJU0NfUkVDKiBwX2N1cnJfcmVjb3JkID0gTlVMTDsKLQotICAvKiBmaW5kIHRoZSByZXF1ZXN0ZWQgU0RQIHJlY29yZCBpbiB0aGUgZGlzY292ZXJ5IGRhdGFiYXNlICovCi0gIGRvIHsKLSAgICBwX2N1cnJfcmVjb3JkID0gU0RQX0ZpbmRTZXJ2aWNlSW5EYihwX2RiLCBVVUlEX1NFUlZDTEFTU19QTlBfSU5GT1JNQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJyX3JlY29yZCk7Ci0gICAgaWYgKHBfY3Vycl9yZWNvcmQpIHsKLSAgICAgIGlmIChjdXJyX3JlY29yZF9pbmRleCsrID09IGdldF9yZWNvcmRfaW5kZXgpIHsKLSAgICAgICAgcmVzdWx0ID0gU0RQX1NVQ0NFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSB3aGlsZSAocF9jdXJyX3JlY29yZCk7Ci0KLSAgaWYgKHJlc3VsdCA9PSBTRFBfU1VDQ0VTUykgewotICAgIC8qIGNvcHkgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFNEUCByZWNvcmQgdG8gdGhlIERJIHJlY29yZCAqLwotICAgIHRTRFBfRElTQ19BVFRSKiBwX2N1cnJfYXR0ciA9IE5VTEw7Ci0KLSAgICAvKiBDbGllbnRFeGVjdXRhYmxlVVJMIGlzIG9wdGlvbmFsICovCi0gICAgcF9jdXJyX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfY3Vycl9yZWNvcmQsIEFUVFJfSURfQ0xJRU5UX0VYRV9VUkwpOwotICAgIFNEUF9BdHRyU3RyaW5nQ29weShwX2RldmljZV9pbmZvLT5yZWMuY2xpZW50X2V4ZWN1dGFibGVfdXJsLCBwX2N1cnJfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgU0RQX01BWF9BVFRSX0xFTik7Ci0KLSAgICAvKiBTZXJ2aWNlIERlc2NyaXB0aW9uIGlzIG9wdGlvbmFsICovCi0gICAgcF9jdXJyX2F0dHIgPQotICAgICAgICBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfY3Vycl9yZWNvcmQsIEFUVFJfSURfU0VSVklDRV9ERVNDUklQVElPTik7Ci0gICAgU0RQX0F0dHJTdHJpbmdDb3B5KHBfZGV2aWNlX2luZm8tPnJlYy5zZXJ2aWNlX2Rlc2NyaXB0aW9uLCBwX2N1cnJfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgU0RQX01BWF9BVFRSX0xFTik7Ci0KLSAgICAvKiBEb2N1bWVudGF0aW9uVVJMIGlzIG9wdGlvbmFsICovCi0gICAgcF9jdXJyX2F0dHIgPQotICAgICAgICBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfY3Vycl9yZWNvcmQsIEFUVFJfSURfRE9DVU1FTlRBVElPTl9VUkwpOwotICAgIFNEUF9BdHRyU3RyaW5nQ29weShwX2RldmljZV9pbmZvLT5yZWMuZG9jdW1lbnRhdGlvbl91cmwsIHBfY3Vycl9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICBTRFBfTUFYX0FUVFJfTEVOKTsKLQotICAgIHBfY3Vycl9hdHRyID0KLSAgICAgICAgU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX2N1cnJfcmVjb3JkLCBBVFRSX0lEX1NQRUNJRklDQVRJT05fSUQpOwotICAgIGlmIChwX2N1cnJfYXR0cikKLSAgICAgIHBfZGV2aWNlX2luZm8tPnNwZWNfaWQgPSBwX2N1cnJfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBTRFBfRVJSX0FUVFJfTk9UX1BSRVNFTlQ7Ci0KLSAgICBwX2N1cnJfYXR0ciA9IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9jdXJyX3JlY29yZCwgQVRUUl9JRF9WRU5ET1JfSUQpOwotICAgIGlmIChwX2N1cnJfYXR0cikKLSAgICAgIHBfZGV2aWNlX2luZm8tPnJlYy52ZW5kb3IgPSBwX2N1cnJfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBTRFBfRVJSX0FUVFJfTk9UX1BSRVNFTlQ7Ci0KLSAgICBwX2N1cnJfYXR0ciA9Ci0gICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9jdXJyX3JlY29yZCwgQVRUUl9JRF9WRU5ET1JfSURfU09VUkNFKTsKLSAgICBpZiAocF9jdXJyX2F0dHIpCi0gICAgICBwX2RldmljZV9pbmZvLT5yZWMudmVuZG9yX2lkX3NvdXJjZSA9IHBfY3Vycl9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IFNEUF9FUlJfQVRUUl9OT1RfUFJFU0VOVDsKLQotICAgIHBfY3Vycl9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX2N1cnJfcmVjb3JkLCBBVFRSX0lEX1BST0RVQ1RfSUQpOwotICAgIGlmIChwX2N1cnJfYXR0cikKLSAgICAgIHBfZGV2aWNlX2luZm8tPnJlYy5wcm9kdWN0ID0gcF9jdXJyX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gU0RQX0VSUl9BVFRSX05PVF9QUkVTRU5UOwotCi0gICAgcF9jdXJyX2F0dHIgPQotICAgICAgICBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfY3Vycl9yZWNvcmQsIEFUVFJfSURfUFJPRFVDVF9WRVJTSU9OKTsKLSAgICBpZiAocF9jdXJyX2F0dHIpCi0gICAgICBwX2RldmljZV9pbmZvLT5yZWMudmVyc2lvbiA9IHBfY3Vycl9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IFNEUF9FUlJfQVRUUl9OT1RfUFJFU0VOVDsKLQotICAgIHBfY3Vycl9hdHRyID0gU0RQX0ZpbmRBdHRyaWJ1dGVJblJlYyhwX2N1cnJfcmVjb3JkLCBBVFRSX0lEX1BSSU1BUllfUkVDT1JEKTsKLSAgICBpZiAocF9jdXJyX2F0dHIpCi0gICAgICBwX2RldmljZV9pbmZvLT5yZWMucHJpbWFyeV9yZWNvcmQgPSAoYm9vbClwX2N1cnJfYXR0ci0+YXR0cl92YWx1ZS52LnU4OwotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IFNEUF9FUlJfQVRUUl9OT1RfUFJFU0VOVDsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICBEZXZpY2UgSWRlbnRpZmljYXRpb24gKERJKSBTZXJ2ZXIgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX1NldExvY2FsRGlSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkcyBhIERJIHJlY29yZCB0byB0aGUgbG9jYWwgU0RQIGRhdGFiYXNlLgotICoKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIFNEUF9TVUNDRVNTIGlmIHJlY29yZCBhZGRlZCBzdWNjZXNzZnVsbHksIGVsc2UgZXJyb3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3QgU0RQX1NldExvY2FsRGlSZWNvcmQoY29uc3QgdFNEUF9ESV9SRUNPUkQqIHBfZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF9oYW5kbGUpIHsKLSAgdWludDE2X3QgcmVzdWx0ID0gU0RQX1NVQ0NFU1M7Ci0gIHVpbnQzMl90IGhhbmRsZTsKLSAgdWludDE2X3QgZGlfdXVpZCA9IFVVSURfU0VSVkNMQVNTX1BOUF9JTkZPUk1BVElPTjsKLSAgdWludDE2X3QgZGlfc3BlY2lkID0gQkxVRVRPT1RIX0RJX1NQRUNJRklDQVRJT047Ci0gIHVpbnQ4X3QgdGVtcF91MTZbMl07Ci0gIHVpbnQ4X3QqIHBfdGVtcDsKLSAgdWludDhfdCB1ODsKLQotICAqcF9oYW5kbGUgPSAwOwotICBpZiAocF9kZXZpY2VfaW5mbyA9PSBOVUxMKSByZXR1cm4gU0RQX0lMTEVHQUxfUEFSQU1FVEVSOwotCi0gIC8qIGlmIHJlY29yZCBpcyB0byBiZSBwcmltYXJ5IHJlY29yZCwgZ2V0IGhhbmRsZSB0byByZXBsYWNlIG9sZCBwcmltYXJ5ICovCi0gIGlmIChwX2RldmljZV9pbmZvLT5wcmltYXJ5X3JlY29yZCAmJiBzZHBfY2Iuc2VydmVyX2RiLmRpX3ByaW1hcnlfaGFuZGxlKQotICAgIGhhbmRsZSA9IHNkcF9jYi5zZXJ2ZXJfZGIuZGlfcHJpbWFyeV9oYW5kbGU7Ci0gIGVsc2UgewotICAgIGhhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgICBpZiAoaGFuZGxlID09IDApIHJldHVybiBTRFBfTk9fUkVTT1VSQ0VTOwotICB9Ci0KLSAgKnBfaGFuZGxlID0gaGFuZGxlOwotCi0gIC8qIGJ1aWxkIHRoZSBTRFAgZW50cnkgKi8KLSAgLyogQWRkIHRoZSBVVUlEIHRvIHRoZSBTZXJ2aWNlIENsYXNzIElEIExpc3QgKi8KLSAgaWYgKCEoU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChoYW5kbGUsIDEsICZkaV91dWlkKSkpCi0gICAgcmVzdWx0ID0gU0RQX0RJX1JFR19GQUlMRUQ7Ci0KLSAgLyogbWFuZGF0b3J5ICovCi0gIGlmIChyZXN1bHQgPT0gU0RQX1NVQ0NFU1MpIHsKLSAgICBwX3RlbXAgPSB0ZW1wX3UxNjsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfdGVtcCwgZGlfc3BlY2lkKTsKLSAgICBpZiAoIShTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9TUEVDSUZJQ0FUSU9OX0lELCBVSU5UX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaV9zcGVjaWQpLCB0ZW1wX3UxNikpKQotICAgICAgcmVzdWx0ID0gU0RQX0RJX1JFR19GQUlMRUQ7Ci0gIH0KLQotICAvKiBvcHRpb25hbCAtIGlmIHN0cmluZyBpcyBudWxsLCBkbyBub3QgYWRkIGF0dHJpYnV0ZSAqLwotICBpZiAocmVzdWx0ID09IFNEUF9TVUNDRVNTKSB7Ci0gICAgaWYgKHBfZGV2aWNlX2luZm8tPmNsaWVudF9leGVjdXRhYmxlX3VybFswXSAhPSAnXDAnKSB7Ci0gICAgICBpZiAoISgoc3RybGVuKHBfZGV2aWNlX2luZm8tPmNsaWVudF9leGVjdXRhYmxlX3VybCkgKyAxIDw9Ci0gICAgICAgICAgICAgU0RQX01BWF9BVFRSX0xFTikgJiYKLSAgICAgICAgICAgIFNEUF9BZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgaGFuZGxlLCBBVFRSX0lEX0NMSUVOVF9FWEVfVVJMLCBVUkxfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3RybGVuKHBfZGV2aWNlX2luZm8tPmNsaWVudF9leGVjdXRhYmxlX3VybCkgKyAxKSwKLSAgICAgICAgICAgICAgICAodWludDhfdCopcF9kZXZpY2VfaW5mby0+Y2xpZW50X2V4ZWN1dGFibGVfdXJsKSkpCi0gICAgICAgIHJlc3VsdCA9IFNEUF9ESV9SRUdfRkFJTEVEOwotICAgIH0KLSAgfQotCi0gIC8qIG9wdGlvbmFsIC0gaWYgc3RyaW5nIGlzIG51bGwsIGRvIG5vdCBhZGQgYXR0cmlidXRlICovCi0gIGlmIChyZXN1bHQgPT0gU0RQX1NVQ0NFU1MpIHsKLSAgICBpZiAocF9kZXZpY2VfaW5mby0+c2VydmljZV9kZXNjcmlwdGlvblswXSAhPSAnXDAnKSB7Ci0gICAgICBpZiAoISgoc3RybGVuKHBfZGV2aWNlX2luZm8tPnNlcnZpY2VfZGVzY3JpcHRpb24pICsgMSA8PQotICAgICAgICAgICAgIFNEUF9NQVhfQVRUUl9MRU4pICYmCi0gICAgICAgICAgICBTRFBfQWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIGhhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX0RFU0NSSVBUSU9OLCBURVhUX1NUUl9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4ocF9kZXZpY2VfaW5mby0+c2VydmljZV9kZXNjcmlwdGlvbikgKyAxKSwKLSAgICAgICAgICAgICAgICAodWludDhfdCopcF9kZXZpY2VfaW5mby0+c2VydmljZV9kZXNjcmlwdGlvbikpKQotICAgICAgICByZXN1bHQgPSBTRFBfRElfUkVHX0ZBSUxFRDsKLSAgICB9Ci0gIH0KLQotICAvKiBvcHRpb25hbCAtIGlmIHN0cmluZyBpcyBudWxsLCBkbyBub3QgYWRkIGF0dHJpYnV0ZSAqLwotICBpZiAocmVzdWx0ID09IFNEUF9TVUNDRVNTKSB7Ci0gICAgaWYgKHBfZGV2aWNlX2luZm8tPmRvY3VtZW50YXRpb25fdXJsWzBdICE9ICdcMCcpIHsKLSAgICAgIGlmICghKChzdHJsZW4ocF9kZXZpY2VfaW5mby0+ZG9jdW1lbnRhdGlvbl91cmwpICsgMSA8PQotICAgICAgICAgICAgIFNEUF9NQVhfQVRUUl9MRU4pICYmCi0gICAgICAgICAgICBTRFBfQWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIGhhbmRsZSwgQVRUUl9JRF9ET0NVTUVOVEFUSU9OX1VSTCwgVVJMX0RFU0NfVFlQRSwKLSAgICAgICAgICAgICAgICAodWludDMyX3QpKHN0cmxlbihwX2RldmljZV9pbmZvLT5kb2N1bWVudGF0aW9uX3VybCkgKyAxKSwKLSAgICAgICAgICAgICAgICAodWludDhfdCopcF9kZXZpY2VfaW5mby0+ZG9jdW1lbnRhdGlvbl91cmwpKSkKLSAgICAgICAgcmVzdWx0ID0gU0RQX0RJX1JFR19GQUlMRUQ7Ci0gICAgfQotICB9Ci0KLSAgLyogbWFuZGF0b3J5ICovCi0gIGlmIChyZXN1bHQgPT0gU0RQX1NVQ0NFU1MpIHsKLSAgICBwX3RlbXAgPSB0ZW1wX3UxNjsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfdGVtcCwgcF9kZXZpY2VfaW5mby0+dmVuZG9yKTsKLSAgICBpZiAoIShTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9WRU5ET1JfSUQsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBfZGV2aWNlX2luZm8tPnZlbmRvciksIHRlbXBfdTE2KSkpCi0gICAgICByZXN1bHQgPSBTRFBfRElfUkVHX0ZBSUxFRDsKLSAgfQotCi0gIC8qIG1hbmRhdG9yeSAqLwotICBpZiAocmVzdWx0ID09IFNEUF9TVUNDRVNTKSB7Ci0gICAgcF90ZW1wID0gdGVtcF91MTY7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3RlbXAsIHBfZGV2aWNlX2luZm8tPnByb2R1Y3QpOwotICAgIGlmICghKFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1BST0RVQ1RfSUQsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBfZGV2aWNlX2luZm8tPnByb2R1Y3QpLCB0ZW1wX3UxNikpKQotICAgICAgcmVzdWx0ID0gU0RQX0RJX1JFR19GQUlMRUQ7Ci0gIH0KLQotICAvKiBtYW5kYXRvcnkgKi8KLSAgaWYgKHJlc3VsdCA9PSBTRFBfU1VDQ0VTUykgewotICAgIHBfdGVtcCA9IHRlbXBfdTE2OwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF90ZW1wLCBwX2RldmljZV9pbmZvLT52ZXJzaW9uKTsKLSAgICBpZiAoIShTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9QUk9EVUNUX1ZFUlNJT04sIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBfZGV2aWNlX2luZm8tPnZlcnNpb24pLCB0ZW1wX3UxNikpKQotICAgICAgcmVzdWx0ID0gU0RQX0RJX1JFR19GQUlMRUQ7Ci0gIH0KLQotICAvKiBtYW5kYXRvcnkgKi8KLSAgaWYgKHJlc3VsdCA9PSBTRFBfU1VDQ0VTUykgewotICAgIHU4ID0gKHVpbnQ4X3QpcF9kZXZpY2VfaW5mby0+cHJpbWFyeV9yZWNvcmQ7Ci0gICAgaWYgKCEoU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfUFJJTUFSWV9SRUNPUkQsIEJPT0xFQU5fREVTQ19UWVBFLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnU4KSkpCi0gICAgICByZXN1bHQgPSBTRFBfRElfUkVHX0ZBSUxFRDsKLSAgfQotCi0gIC8qIG1hbmRhdG9yeSAqLwotICBpZiAocmVzdWx0ID09IFNEUF9TVUNDRVNTKSB7Ci0gICAgcF90ZW1wID0gdGVtcF91MTY7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3RlbXAsIHBfZGV2aWNlX2luZm8tPnZlbmRvcl9pZF9zb3VyY2UpOwotICAgIGlmICghKFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1ZFTkRPUl9JRF9TT1VSQ0UsIFVJTlRfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBfZGV2aWNlX2luZm8tPnZlbmRvcl9pZF9zb3VyY2UpLCB0ZW1wX3UxNikpKQotICAgICAgcmVzdWx0ID0gU0RQX0RJX1JFR19GQUlMRUQ7Ci0gIH0KLQotICBpZiAocmVzdWx0ICE9IFNEUF9TVUNDRVNTKQotICAgIFNEUF9EZWxldGVSZWNvcmQoaGFuZGxlKTsKLSAgZWxzZSBpZiAocF9kZXZpY2VfaW5mby0+cHJpbWFyeV9yZWNvcmQpCi0gICAgc2RwX2NiLnNlcnZlcl9kYi5kaV9wcmltYXJ5X2hhbmRsZSA9IGhhbmRsZTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU0RQX1NldFRyYWNlTGV2ZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdHJhY2UgbGV2ZWwgZm9yIFNEUC4gSWYgY2FsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiAweEZGLCBpdCBzaW1wbHkgcmVhZHMgdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgbmV3IChjdXJyZW50KSB0cmFjZSBsZXZlbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IFNEUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7Ci0gIGlmIChuZXdfbGV2ZWwgIT0gMHhGRikgc2RwX2NiLnRyYWNlX2xldmVsID0gbmV3X2xldmVsOwotCi0gIHJldHVybiAoc2RwX2NiLnRyYWNlX2xldmVsKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3NkcC9zZHBfZGIuY2MgYi9zdGFjay9zZHAvc2RwX2RiLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWFiYWY5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3NkcC9zZHBfZGIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICB0aGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoZSBkYXRhYmFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGZpbmRfdXVpZF9pbl9zZXEodWludDhfdCogcCwgdWludDMyX3Qgc2VxX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9oaXNfdXVpZCwgdWludDE2X3QgaGlzX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lc3RfbGV2ZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2RiX3NlcnZpY2Vfc2VhcmNoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhIHJlY29yZCB0aGF0IGNvbnRhaW5zIHRoZQotICogICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgVUlEcy4gSXQgaXMgcGFzc2VkIGVpdGhlciBOVUxMIHRvIHN0YXJ0IGF0IHRoZQotICogICAgICAgICAgICAgICAgICBiZWdpbm5pbmcsIG9yIHRoZSBwcmV2aW91cyByZWNvcmQgZm91bmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCB0U0RQX1JFQ09SRCogc2RwX2RiX3NlcnZpY2Vfc2VhcmNoKGNvbnN0IHRTRFBfUkVDT1JEKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdFNEUF9VVUlEX1NFUSogcF9zZXEpIHsKLSAgdWludDE2X3QgeHgsIHl5OwotICBjb25zdCB0U0RQX0FUVFJJQlVURSogcF9hdHRyOwotICB0U0RQX1JFQ09SRCogcF9lbmQgPSAmc2RwX2NiLnNlcnZlcl9kYi5yZWNvcmRbc2RwX2NiLnNlcnZlcl9kYi5udW1fcmVjb3Jkc107Ci0KLSAgLyogSWYgTlVMTCwgc3RhcnQgYXQgdGhlIGJlZ2lubmluZywgZWxzZSBzdGFydCBhdCB0aGUgZmlyc3Qgc3BlY2lmaWVkIHJlY29yZAotICAgKi8KLSAgaWYgKCFwX3JlYykKLSAgICBwX3JlYyA9ICZzZHBfY2Iuc2VydmVyX2RiLnJlY29yZFswXTsKLSAgZWxzZQotICAgIHBfcmVjKys7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSByZWNvcmRzLiBUaGUgc3BlYyBzYXlzIHRoYXQgYSBtYXRjaCBvY2N1cnMgaWYgKi8KLSAgLyogdGhlIHJlY29yZCBjb250YWlucyBhbGwgdGhlIHBhc3NlZCBVVUlEcyBpbiBpdC4gICAgICAgICAgICAgICAgKi8KLSAgZm9yICg7IHBfcmVjIDwgcF9lbmQ7IHBfcmVjKyspIHsKLSAgICBmb3IgKHl5ID0gMDsgeXkgPCBwX3NlcS0+bnVtX3VpZHM7IHl5KyspIHsKLSAgICAgIHBfYXR0ciA9ICZwX3JlYy0+YXR0cmlidXRlWzBdOwotICAgICAgZm9yICh4eCA9IDA7IHh4IDwgcF9yZWMtPm51bV9hdHRyaWJ1dGVzOyB4eCsrLCBwX2F0dHIrKykgewotICAgICAgICBpZiAocF9hdHRyLT50eXBlID09IFVVSURfREVTQ19UWVBFKSB7Ci0gICAgICAgICAgaWYgKHNkcHVfY29tcGFyZV91dWlkX2FycmF5cyhwX2F0dHItPnZhbHVlX3B0ciwgcF9hdHRyLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zZXEtPnV1aWRfZW50cnlbeXldLnZhbHVlWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXEtPnV1aWRfZW50cnlbeXldLmxlbikpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChwX2F0dHItPnR5cGUgPT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgewotICAgICAgICAgIGlmIChmaW5kX3V1aWRfaW5fc2VxKHBfYXR0ci0+dmFsdWVfcHRyLCBwX2F0dHItPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zZXEtPnV1aWRfZW50cnlbeXldLnZhbHVlWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VxLT51dWlkX2VudHJ5W3l5XS5sZW4sIDApKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qIElmIGFueSBVVUlEIHdhcyBub3QgZm91bmQsICBvbiB0byB0aGUgbmV4dCByZWNvcmQgKi8KLSAgICAgIGlmICh4eCA9PSBwX3JlYy0+bnVtX2F0dHJpYnV0ZXMpIGJyZWFrOwotICAgIH0KLQotICAgIC8qIElmIGV2ZXJ5IFVVSUQgd2FzIGZvdW5kIGluIHRoZSByZWNvcmQsIHJldHVybiB0aGUgcmVjb3JkICovCi0gICAgaWYgKHl5ID09IHBfc2VxLT5udW1fdWlkcykgcmV0dXJuIChwX3JlYyk7Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBtb3JlIHJlY29yZHMgZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGZpbmRfdXVpZF9pbl9zZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgYSBkYXRhIGVsZW1lbnQgc2VxdWVuY3QgZm9yIGEgVVVJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgZm91bmQsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2wgZmluZF91dWlkX2luX3NlcSh1aW50OF90KiBwLCB1aW50MzJfdCBzZXFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3V1aWQsIHVpbnQxNl90IHV1aWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmVzdF9sZXZlbCkgewotICB1aW50OF90KiBwX2VuZCA9IHAgKyBzZXFfbGVuOwotICB1aW50OF90IHR5cGU7Ci0gIHVpbnQzMl90IGxlbjsKLQotICAvKiBBIGxpdHRsZSBzYWZldHkgY2hlY2sgdG8gYXZvaWQgZXhjZXNzaXZlIHJlY3Vyc2lvbiAqLwotICBpZiAobmVzdF9sZXZlbCA+IDMpIHJldHVybiAoZmFsc2UpOwotCi0gIHdoaWxlIChwIDwgcF9lbmQpIHsKLSAgICB0eXBlID0gKnArKzsKLSAgICBwID0gc2RwdV9nZXRfbGVuX2Zyb21fdHlwZShwLCBwX2VuZCwgdHlwZSwgJmxlbik7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCAocCArIGxlbikgPiBwX2VuZCkgewotICAgICAgU0RQX1RSQUNFX1dBUk5JTkcoIiVzOiBiYWQgbGVuZ3RoIiwgX19mdW5jX18pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHR5cGUgPSB0eXBlID4+IDM7Ci0gICAgaWYgKHR5cGUgPT0gVVVJRF9ERVNDX1RZUEUpIHsKLSAgICAgIGlmIChzZHB1X2NvbXBhcmVfdXVpZF9hcnJheXMocCwgbGVuLCBwX3V1aWQsIHV1aWRfbGVuKSkgcmV0dXJuICh0cnVlKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgewotICAgICAgaWYgKGZpbmRfdXVpZF9pbl9zZXEocCwgbGVuLCBwX3V1aWQsIHV1aWRfbGVuLCBuZXN0X2xldmVsICsgMSkpCi0gICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgfQotICAgIHAgPSBwICsgbGVuOwotICB9Ci0KLSAgLyogSWYgaGVyZSwgZmFpbGVkIHRvIG1hdGNoICovCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2RiX2ZpbmRfcmVjb3JkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhIHJlY29yZCB3aXRoIGEgc3BlY2lmaWMgaGFuZGxlCi0gKiAgICAgICAgICAgICAgICAgIEl0IGlzIHBhc3NlZCB0aGUgaGFuZGxlIG9mIHRoZSByZWNvcmQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNvcmQsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U0RQX1JFQ09SRCogc2RwX2RiX2ZpbmRfcmVjb3JkKHVpbnQzMl90IGhhbmRsZSkgewotICB0U0RQX1JFQ09SRCogcF9yZWM7Ci0gIHRTRFBfUkVDT1JEKiBwX2VuZCA9ICZzZHBfY2Iuc2VydmVyX2RiLnJlY29yZFtzZHBfY2Iuc2VydmVyX2RiLm51bV9yZWNvcmRzXTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHJlY29yZHMgZm9yIHRoZSBjYWxsZXIncyBoYW5kbGUgKi8KLSAgZm9yIChwX3JlYyA9ICZzZHBfY2Iuc2VydmVyX2RiLnJlY29yZFswXTsgcF9yZWMgPCBwX2VuZDsgcF9yZWMrKykgewotICAgIGlmIChwX3JlYy0+cmVjb3JkX2hhbmRsZSA9PSBoYW5kbGUpIHJldHVybiAocF9yZWMpOwotICB9Ci0KLSAgLyogUmVjb3JkIHdpdGggdGhhdCBoYW5kbGUgbm90IGZvdW5kLiAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2RiX2ZpbmRfYXR0cl9pbl9yZWMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgYSByZWNvcmQgZm9yIHNwZWNpZmljIGF0dHJpYnV0ZXMuCi0gKiAgICAgICAgICAgICAgICAgIEl0IGlzIHBhc3NlZCBhIHBvaW50ZXIgdG8gdGhlIHJlY29yZC4gSWYgdGhlIHJlY29yZCBjb250YWlucwotICogICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSwgKHRoZSBjYWxsZXIgbWF5IHNwZWNpZnkgYmUgYSByYW5nZQotICogICAgICAgICAgICAgICAgICBvZiBhdHRyaWJ1dGVzKSwgdGhlIGF0dHJpYnV0ZSBpcyByZXR1cm5lZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IHRTRFBfQVRUUklCVVRFKiBzZHBfZGJfZmluZF9hdHRyX2luX3JlYyhjb25zdCB0U0RQX1JFQ09SRCogcF9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhcnRfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfYXR0cikgewotICBjb25zdCB0U0RQX0FUVFJJQlVURSogcF9hdDsKLSAgdWludDE2X3QgeHg7Ci0KLSAgLyogTm90ZSB0aGF0IHRoZSBhdHRyaWJ1dGVzIGluIGEgcmVjb3JkIGFyZSBhc3N1bWVkIHRvIGJlIGluIHNvcnRlZCBvcmRlciAqLwotICBmb3IgKHh4ID0gMCwgcF9hdCA9ICZwX3JlYy0+YXR0cmlidXRlWzBdOyB4eCA8IHBfcmVjLT5udW1fYXR0cmlidXRlczsKLSAgICAgICB4eCsrLCBwX2F0KyspIHsKLSAgICBpZiAoKHBfYXQtPmlkID49IHN0YXJ0X2F0dHIpICYmIChwX2F0LT5pZCA8PSBlbmRfYXR0cikpIHJldHVybiAocF9hdCk7Ci0gIH0KLQotICAvKiBObyBtYXRjaGluZyBhdHRyaWJ1dGUgZm91bmQgKi8KLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9jb21wb3NlX3Byb3RvX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvbXBvc2UgYSBkYXRhIHNlcXVlbmNlIGZyb20KLSAqICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgZWxlbWVudCBsaXN0IHN0cnVjdCBwb2ludGVyCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHNlcXVlbmNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2RwX2NvbXBvc2VfcHJvdG9fbGlzdCh1aW50OF90KiBwLCB1aW50MTZfdCBudW1fZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1BST1RPQ09MX0VMRU0qIHBfZWxlbV9saXN0KSB7Ci0gIHVpbnQxNl90IHh4LCB5eSwgbGVuOwotICBib29sIGlzX3JmY29tbV9zY247Ci0gIHVpbnQ4X3QqIHBfaGVhZCA9IHA7Ci0gIHVpbnQ4X3QqIHBfbGVuOwotCi0gIC8qIEZpcnN0LCBidWlsZCB0aGUgcHJvdG9jb2wgbGlzdC4gVGhpcyBjb25zaXN0cyBvZiBhIHNldCBvZiBkYXRhIGVsZW1lbnQKLSAgKiogc2VxdWVuY2VzLCBvbmUgZm9yIGVhY2ggbGF5ZXIuIEVhY2ggbGF5ZXIgc2VxdWVuY2UgY29uc2lzdHMgb2YgbGF5ZXIncwotICAqKiBVVUlEIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzCi0gICovCi0gIGZvciAoeHggPSAwOyB4eCA8IG51bV9lbGVtOyB4eCsrLCBwX2VsZW1fbGlzdCsrKSB7Ci0gICAgbGVuID0gMyArIChwX2VsZW1fbGlzdC0+bnVtX3BhcmFtcyAqIDMpOwotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCAoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9CWVRFKTsKLQotICAgIHBfbGVuID0gcDsKLSAgICAqcCsrID0gKHVpbnQ4X3QpbGVuOwotCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChVVUlEX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfVFdPX0JZVEVTKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIHBfZWxlbV9saXN0LT5wcm90b2NvbF91dWlkKTsKLQotICAgIGlmIChwX2VsZW1fbGlzdC0+cHJvdG9jb2xfdXVpZCA9PSBVVUlEX1BST1RPQ09MX1JGQ09NTSkKLSAgICAgIGlzX3JmY29tbV9zY24gPSB0cnVlOwotICAgIGVsc2UKLSAgICAgIGlzX3JmY29tbV9zY24gPSBmYWxzZTsKLQotICAgIGZvciAoeXkgPSAwOyB5eSA8IHBfZWxlbV9saXN0LT5udW1fcGFyYW1zOyB5eSsrKSB7Ci0gICAgICBpZiAoaXNfcmZjb21tX3NjbikgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9PTkVfQllURSk7Ci0gICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBwX2VsZW1fbGlzdC0+cGFyYW1zW3l5XSk7Ci0KLSAgICAgICAgKnBfbGVuIC09IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICAgICAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIHBfZWxlbV9saXN0LT5wYXJhbXNbeXldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChwIC0gcF9oZWFkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9DcmVhdGVSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNyZWF0ZSBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgd291bGQgYmUgdGhyb3VnaCB0aGUgU0RQIGRhdGFiYXNlIG1haW50ZW5hbmNlIEFQSS4gVGhlCi0gKiAgICAgICAgICAgICAgICAgIHJlY29yZCBpcyBjcmVhdGVkIGVtcHR5LCB0ZWggYXBwbGljYXRpb24gc2hvdWxkIHRoZW4gY2FsbAotICogICAgICAgICAgICAgICAgICAiYWRkX2F0dHJpYnV0ZSIgdG8gYWRkIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUmVjb3JkIGhhbmRsZSBpZiBPSywgZWxzZSAwLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MzJfdCBTRFBfQ3JlYXRlUmVjb3JkKHZvaWQpIHsKLSAgdWludDMyX3QgaGFuZGxlOwotICB1aW50OF90IGJ1Zls0XTsKLSAgdFNEUF9EQiogcF9kYiA9ICZzZHBfY2Iuc2VydmVyX2RiOwotCi0gIC8qIEZpcnN0LCBjaGVjayBpZiB0aGVyZSBpcyBhIGZyZWUgcmVjb3JkICovCi0gIGlmIChwX2RiLT5udW1fcmVjb3JkcyA8IFNEUF9NQVhfUkVDT1JEUykgewotICAgIG1lbXNldCgmcF9kYi0+cmVjb3JkW3BfZGItPm51bV9yZWNvcmRzXSwgMCwgc2l6ZW9mKHRTRFBfUkVDT1JEKSk7Ci0KLSAgICAvKiBXZSB3aWxsIHVzZSBhIGhhbmRsZSBvZiB0aGUgZmlyc3QgdW5yZXNlcnZlZCBoYW5kbGUgcGx1cyBsYXN0IHJlY29yZAotICAgICoqIG51bWJlciArIDEgKi8KLSAgICBpZiAocF9kYi0+bnVtX3JlY29yZHMpCi0gICAgICBoYW5kbGUgPSBwX2RiLT5yZWNvcmRbcF9kYi0+bnVtX3JlY29yZHMgLSAxXS5yZWNvcmRfaGFuZGxlICsgMTsKLSAgICBlbHNlCi0gICAgICBoYW5kbGUgPSAweDEwMDAwOwotCi0gICAgcF9kYi0+cmVjb3JkW3BfZGItPm51bV9yZWNvcmRzXS5yZWNvcmRfaGFuZGxlID0gaGFuZGxlOwotCi0gICAgcF9kYi0+bnVtX3JlY29yZHMrKzsKLSAgICBTRFBfVFJBQ0VfREVCVUcoIlNEUF9DcmVhdGVSZWNvcmQgb2ssIG51bV9yZWNvcmRzOiVkIiwgcF9kYi0+bnVtX3JlY29yZHMpOwotICAgIC8qIEFkZCB0aGUgZmlyc3QgYXR0cmlidXRlICh0aGUgaGFuZGxlKSBhdXRvbWF0aWNhbGx5ICovCi0gICAgVUlOVDMyX1RPX0JFX0ZJRUxEKGJ1ZiwgaGFuZGxlKTsKLSAgICBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9TRVJWSUNFX1JFQ09SRF9IREwsIFVJTlRfREVTQ19UWVBFLCA0LAotICAgICAgICAgICAgICAgICAgICAgYnVmKTsKLQotICAgIHJldHVybiAocF9kYi0+cmVjb3JkW3BfZGItPm51bV9yZWNvcmRzIC0gMV0ucmVjb3JkX2hhbmRsZSk7Ci0gIH0gZWxzZQotICAgIFNEUF9UUkFDRV9FUlJPUigiU0RQX0NyZWF0ZVJlY29yZCBmYWlsLCBleGNlZWQgbWF4aW11bSByZWNvcmRzOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgU0RQX01BWF9SRUNPUkRTKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9EZWxldGVSZWNvcmQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhIHJlY29yZCAob3IgYWxsIHJlY29yZHMpCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRhdGFiYXNlLiBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZQotICogICAgICAgICAgICAgICAgICBtYWludGVuYW5jZSBBUEkuCi0gKgotICogICAgICAgICAgICAgICAgICBJZiBhIHJlY29yZCBoYW5kbGUgb2YgMCBpcyBwYXNzZWQsIGFsbCByZWNvcmRzIGFyZSBkZWxldGVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBzdWNjZWVkZWQsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfRGVsZXRlUmVjb3JkKHVpbnQzMl90IGhhbmRsZSkgewotICB1aW50MTZfdCB4eCwgeXksIHp6OwotICB0U0RQX1JFQ09SRCogcF9yZWMgPSAmc2RwX2NiLnNlcnZlcl9kYi5yZWNvcmRbMF07Ci0KLSAgaWYgKGhhbmRsZSA9PSAwIHx8IHNkcF9jYi5zZXJ2ZXJfZGIubnVtX3JlY29yZHMgPT0gMCkgewotICAgIC8qIERlbGV0ZSBhbGwgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2UgKi8KLSAgICBzZHBfY2Iuc2VydmVyX2RiLm51bV9yZWNvcmRzID0gMDsKLQotICAgIC8qIHJlcXVpcmUgbmV3IERJIHJlY29yZCB0byBiZSBjcmVhdGVkIGluIFNEUF9TZXRMb2NhbERpUmVjb3JkICovCi0gICAgc2RwX2NiLnNlcnZlcl9kYi5kaV9wcmltYXJ5X2hhbmRsZSA9IDA7Ci0KLSAgICByZXR1cm4gKHRydWUpOwotICB9IGVsc2UgewotICAgIC8qIEZpbmQgdGhlIHJlY29yZCBpbiB0aGUgZGF0YWJhc2UgKi8KLSAgICBmb3IgKHh4ID0gMDsgeHggPCBzZHBfY2Iuc2VydmVyX2RiLm51bV9yZWNvcmRzOyB4eCsrLCBwX3JlYysrKSB7Ci0gICAgICBpZiAocF9yZWMtPnJlY29yZF9oYW5kbGUgPT0gaGFuZGxlKSB7Ci0gICAgICAgIC8qIEZvdW5kIGl0LiBTaGlmdCBldmVyeXRoaW5nIHVwIG9uZSAqLwotICAgICAgICBmb3IgKHl5ID0geHg7IHl5IDwgc2RwX2NiLnNlcnZlcl9kYi5udW1fcmVjb3JkcyAtIDE7IHl5KyssIHBfcmVjKyspIHsKLSAgICAgICAgICAqcF9yZWMgPSAqKHBfcmVjICsgMSk7Ci0KLSAgICAgICAgICAvKiBBZGp1c3QgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBwb2ludGVyIGZvciBlYWNoIGF0dHJpYnV0ZSAqLwotICAgICAgICAgIGZvciAoenogPSAwOyB6eiA8IHBfcmVjLT5udW1fYXR0cmlidXRlczsgenorKykKLSAgICAgICAgICAgIHBfcmVjLT5hdHRyaWJ1dGVbenpdLnZhbHVlX3B0ciAtPSBzaXplb2YodFNEUF9SRUNPUkQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2RwX2NiLnNlcnZlcl9kYi5udW1fcmVjb3Jkcy0tOwotCi0gICAgICAgIFNEUF9UUkFDRV9ERUJVRygiU0RQX0RlbGV0ZVJlY29yZCBvaywgbnVtX3JlY29yZHM6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc2RwX2NiLnNlcnZlcl9kYi5udW1fcmVjb3Jkcyk7Ci0gICAgICAgIC8qIGlmIHdlJ3JlIGRlbGV0aW5nIHRoZSBwcmltYXJ5IERJIHJlY29yZCwgY2xlYXIgdGhlICovCi0gICAgICAgIC8qIHZhbHVlIGluIHRoZSBjb250cm9sIGJsb2NrICovCi0gICAgICAgIGlmIChzZHBfY2Iuc2VydmVyX2RiLmRpX3ByaW1hcnlfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgICAgIHNkcF9jYi5zZXJ2ZXJfZGIuZGlfcHJpbWFyeV9oYW5kbGUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfQWRkQXR0cmlidXRlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYW4gYXR0cmlidXRlIHRvIGEgcmVjb3JkLgotICogICAgICAgICAgICAgICAgICBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZSBBUEkuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHJlY29yZCwgaXQgaXMKLSAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHZhbHVlLgotICoKLSAqIE5PVEUgICAgICAgICAgICAgQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHBhc3NlZCBhcyBhIEJpZyBFbmRpYW4gc3RyZWFtLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9BZGRBdHRyaWJ1dGUodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX2lkLCB1aW50OF90IGF0dHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRyX2xlbiwgdWludDhfdCogcF92YWwpIHsKLSAgdWludDE2X3QgeHgsIHl5LCB6ejsKLSAgdFNEUF9SRUNPUkQqIHBfcmVjID0gJnNkcF9jYi5zZXJ2ZXJfZGIucmVjb3JkWzBdOwotCi0gIGlmIChzZHBfY2IudHJhY2VfbGV2ZWwgPj0gQlRfVFJBQ0VfTEVWRUxfREVCVUcpIHsKLSAgICBpZiAoKGF0dHJfdHlwZSA9PSBVSU5UX0RFU0NfVFlQRSkgfHwKLSAgICAgICAgKGF0dHJfdHlwZSA9PSBUV09fQ09NUF9JTlRfREVTQ19UWVBFKSB8fAotICAgICAgICAoYXR0cl90eXBlID09IFVVSURfREVTQ19UWVBFKSB8fAotICAgICAgICAoYXR0cl90eXBlID09IERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpIHx8Ci0gICAgICAgIChhdHRyX3R5cGUgPT0gREFUQV9FTEVfQUxUX0RFU0NfVFlQRSkpIHsKLSAgICAgIHVpbnQ4X3QgbnVtX2FycmF5WzQwMF07Ci0gICAgICB1aW50MzJfdCBsZW4gPSAoYXR0cl9sZW4gPiAyMDApID8gMjAwIDogYXR0cl9sZW47Ci0KLSAgICAgIG51bV9hcnJheVswXSA9ICdcMCc7Ci0gICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoKGNoYXIqKSZudW1fYXJyYXlbaSAqIDJdLCBzaXplb2YobnVtX2FycmF5KSAtIGkgKiAyLCAiJTAyWCIsCi0gICAgICAgICAgICAgICAgICh1aW50OF90KShwX3ZhbFtpXSkpOwotICAgICAgfQotICAgICAgU0RQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICJTRFBfQWRkQXR0cmlidXRlOiBoYW5kbGU6JVgsIGlkOiUwNFgsIHR5cGU6JWQsIGxlbjolZCwgcF92YWw6JXAsICIKLSAgICAgICAgICAiKnBfdmFsOiVzIiwKLSAgICAgICAgICBoYW5kbGUsIGF0dHJfaWQsIGF0dHJfdHlwZSwgYXR0cl9sZW4sIHBfdmFsLCBudW1fYXJyYXkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl90eXBlID09IEJPT0xFQU5fREVTQ19UWVBFKSB7Ci0gICAgICBTRFBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgIlNEUF9BZGRBdHRyaWJ1dGU6IGhhbmRsZTolWCwgaWQ6JTA0WCwgdHlwZTolZCwgbGVuOiVkLCBwX3ZhbDolcCwgIgotICAgICAgICAgICIqcF92YWw6JWQiLAotICAgICAgICAgIGhhbmRsZSwgYXR0cl9pZCwgYXR0cl90eXBlLCBhdHRyX2xlbiwgcF92YWwsICpwX3ZhbCk7Ci0gICAgfSBlbHNlIGlmICgoYXR0cl90eXBlID09IFRFWFRfU1RSX0RFU0NfVFlQRSkgfHwKLSAgICAgICAgICAgICAgIChhdHRyX3R5cGUgPT0gVVJMX0RFU0NfVFlQRSkpIHsKLSAgICAgIGlmIChwX3ZhbFthdHRyX2xlbiAtIDFdID09ICdcMCcpIHsKLSAgICAgICAgU0RQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIlNEUF9BZGRBdHRyaWJ1dGU6IGhhbmRsZTolWCwgaWQ6JTA0WCwgdHlwZTolZCwgbGVuOiVkLCBwX3ZhbDolcCwgIgotICAgICAgICAgICAgIipwX3ZhbDolcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGF0dHJfaWQsIGF0dHJfdHlwZSwgYXR0cl9sZW4sIHBfdmFsLCAoY2hhciopcF92YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgU0RQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgIlNEUF9BZGRBdHRyaWJ1dGU6IGhhbmRsZTolWCwgaWQ6JTA0WCwgdHlwZTolZCwgbGVuOiVkLCBwX3ZhbDolcCIsCi0gICAgICAgICAgICBoYW5kbGUsIGF0dHJfaWQsIGF0dHJfdHlwZSwgYXR0cl9sZW4sIHBfdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgU0RQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICJTRFBfQWRkQXR0cmlidXRlOiBoYW5kbGU6JVgsIGlkOiUwNFgsIHR5cGU6JWQsIGxlbjolZCwgcF92YWw6JXAiLAotICAgICAgICAgIGhhbmRsZSwgYXR0cl9pZCwgYXR0cl90eXBlLCBhdHRyX2xlbiwgcF92YWwpOwotICAgIH0KLSAgfQotCi0gIC8qIEZpbmQgdGhlIHJlY29yZCBpbiB0aGUgZGF0YWJhc2UgKi8KLSAgZm9yICh6eiA9IDA7IHp6IDwgc2RwX2NiLnNlcnZlcl9kYi5udW1fcmVjb3JkczsgenorKywgcF9yZWMrKykgewotICAgIGlmIChwX3JlYy0+cmVjb3JkX2hhbmRsZSA9PSBoYW5kbGUpIHsKLSAgICAgIHRTRFBfQVRUUklCVVRFKiBwX2F0dHIgPSAmcF9yZWMtPmF0dHJpYnV0ZVswXTsKLQotICAgICAgLyogRm91bmQgdGhlIHJlY29yZC4gTm93LCBzZWUgaWYgdGhlIGF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cyAqLwotICAgICAgZm9yICh4eCA9IDA7IHh4IDwgcF9yZWMtPm51bV9hdHRyaWJ1dGVzOyB4eCsrLCBwX2F0dHIrKykgewotICAgICAgICAvKiBUaGUgYXR0cmlidXRlIGV4aXN0cy4gcmVwbGFjZSBpdCAqLwotICAgICAgICBpZiAocF9hdHRyLT5pZCA9PSBhdHRyX2lkKSB7Ci0gICAgICAgICAgU0RQX0RlbGV0ZUF0dHJpYnV0ZShoYW5kbGUsIGF0dHJfaWQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwX2F0dHItPmlkID4gYXR0cl9pZCkgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX3JlYy0+bnVtX2F0dHJpYnV0ZXMgPT0gU0RQX01BWF9SRUNfQVRUUikgcmV0dXJuIChmYWxzZSk7Ci0KLSAgICAgIC8qIElmIG5vdCBmb3VuZCwgc2VlIGlmIHdlIGNhbiBhbGxvY2F0ZSBhIG5ldyBlbnRyeSAqLwotICAgICAgaWYgKHh4ID09IHBfcmVjLT5udW1fYXR0cmlidXRlcykKLSAgICAgICAgcF9hdHRyID0gJnBfcmVjLT5hdHRyaWJ1dGVbcF9yZWMtPm51bV9hdHRyaWJ1dGVzXTsKLSAgICAgIGVsc2UgewotICAgICAgICAvKiBTaW5jZSB0aGUgYXR0cmlidXRlcyBhcmUga2VwdCBpbiBzb3J0ZWQgb3JkZXIsIGluc2VydCBvdXJzIGhlcmUgKi8KLSAgICAgICAgZm9yICh5eSA9IHBfcmVjLT5udW1fYXR0cmlidXRlczsgeXkgPiB4eDsgeXktLSkKLSAgICAgICAgICBwX3JlYy0+YXR0cmlidXRlW3l5XSA9IHBfcmVjLT5hdHRyaWJ1dGVbeXkgLSAxXTsKLSAgICAgIH0KLQotICAgICAgcF9hdHRyLT5pZCA9IGF0dHJfaWQ7Ci0gICAgICBwX2F0dHItPnR5cGUgPSBhdHRyX3R5cGU7Ci0gICAgICBwX2F0dHItPmxlbiA9IGF0dHJfbGVuOwotCi0gICAgICBpZiAocF9yZWMtPmZyZWVfcGFkX3B0ciArIGF0dHJfbGVuID49IFNEUF9NQVhfUEFEX0xFTikgewotICAgICAgICAvKiBkbyB0cnVuY2F0ZSBvbmx5IGZvciB0ZXh0IHN0cmluZyB0eXBlIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgaWYgKGF0dHJfdHlwZSA9PSBURVhUX1NUUl9ERVNDX1RZUEUpIHsKLSAgICAgICAgICBTRFBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICAgIlNEUF9BZGRBdHRyaWJ1dGU6IGF0dHJfbGVuOiVkIHRvbyBsb25nLiB0cnVuY2F0ZSB0byAoJWQpIiwKLSAgICAgICAgICAgICAgYXR0cl9sZW4sIFNEUF9NQVhfUEFEX0xFTiAtIHBfcmVjLT5mcmVlX3BhZF9wdHIpOwotCi0gICAgICAgICAgYXR0cl9sZW4gPSBTRFBfTUFYX1BBRF9MRU4gLSBwX3JlYy0+ZnJlZV9wYWRfcHRyOwotICAgICAgICAgIHBfdmFsW1NEUF9NQVhfUEFEX0xFTiAtIHBfcmVjLT5mcmVlX3BhZF9wdHJdID0gJ1wwJzsKLSAgICAgICAgICBwX3ZhbFtTRFBfTUFYX1BBRF9MRU4gLSBwX3JlYy0+ZnJlZV9wYWRfcHRyICsgMV0gPSAnXDAnOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICBhdHRyX2xlbiA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoYXR0cl9sZW4gPiAwKSAmJiAocF92YWwgIT0gMCkpIHsKLSAgICAgICAgcF9hdHRyLT5sZW4gPSBhdHRyX2xlbjsKLSAgICAgICAgbWVtY3B5KCZwX3JlYy0+YXR0cl9wYWRbcF9yZWMtPmZyZWVfcGFkX3B0cl0sIHBfdmFsLCAoc2l6ZV90KWF0dHJfbGVuKTsKLSAgICAgICAgcF9hdHRyLT52YWx1ZV9wdHIgPSAmcF9yZWMtPmF0dHJfcGFkW3BfcmVjLT5mcmVlX3BhZF9wdHJdOwotICAgICAgICBwX3JlYy0+ZnJlZV9wYWRfcHRyICs9IGF0dHJfbGVuOwotICAgICAgfSBlbHNlIGlmICgoYXR0cl9sZW4gPT0gMCAmJgotICAgICAgICAgICAgICAgICAgcF9hdHRyLT5sZW4gIT0KLSAgICAgICAgICAgICAgICAgICAgICAwKSB8fCAvKiBpZiB0cnVuY2F0ZSB0byAwIGxlbmd0aCwgc2ltcGx5IGRvbid0IGFkZCAqLwotICAgICAgICAgICAgICAgICBwX3ZhbCA9PSAwKSB7Ci0gICAgICAgIFNEUF9UUkFDRV9FUlJPUigKLSAgICAgICAgICAgICJTRFBfQWRkQXR0cmlidXRlIGZhaWwsIGxlbmd0aCBleGNlZWQgbWF4aW11bTogSUQgJWQ6IGF0dHJfbGVuOiVkICIsCi0gICAgICAgICAgICBhdHRyX2lkLCBhdHRyX2xlbik7Ci0gICAgICAgIHBfYXR0ci0+aWQgPSBwX2F0dHItPnR5cGUgPSBwX2F0dHItPmxlbiA9IDA7Ci0gICAgICAgIHJldHVybiAoZmFsc2UpOwotICAgICAgfQotICAgICAgcF9yZWMtPm51bV9hdHRyaWJ1dGVzKys7Ci0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLSAgfQotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRTZXF1ZW5jZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWRkIGEgc2VxdWVuY2UgdG8gYSByZWNvcmQuCi0gKiAgICAgICAgICAgICAgICAgIFRoaXMgd291bGQgYmUgdGhyb3VnaCB0aGUgU0RQIGRhdGFiYXNlIG1haW50ZW5hbmNlIEFQSS4KLSAqICAgICAgICAgICAgICAgICAgSWYgdGhlIHNlcXVlbmNlIGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzIHJlcGxhY2VkCi0gKiAgICAgICAgICAgICAgICAgIHdpdGggdGhlIG5ldyBzZXF1ZW5jZS4KLSAqCi0gKiBOT1RFICAgICAgICAgICAgIEVsZW1lbnQgdmFsdWVzIG11c3QgYmUgcGFzc2VkIGFzIGEgQmlnIEVuZGlhbiBzdHJlYW0uCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFNlcXVlbmNlKHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9pZCwgdWludDE2X3QgbnVtX2VsZW0sCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR5cGVbXSwgdWludDhfdCBsZW5bXSwgdWludDhfdCogcF92YWxbXSkgewotICB1aW50MTZfdCB4eDsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCogcF9oZWFkOwotICBib29sIHJlc3VsdDsKLSAgdWludDhfdCogcF9idWZmID0KLSAgICAgICh1aW50OF90Kilvc2lfbWFsbG9jKHNpemVvZih1aW50OF90KSAqIFNEUF9NQVhfQVRUUl9MRU4gKiAyKTsKLQotICBwID0gcF9idWZmOwotCi0gIC8qIEZpcnN0LCBidWlsZCB0aGUgc2VxdWVuY2UgKi8KLSAgZm9yICh4eCA9IDA7IHh4IDwgbnVtX2VsZW07IHh4KyspIHsKLSAgICBwX2hlYWQgPSBwOwotICAgIHN3aXRjaCAobGVuW3h4XSkgewotICAgICAgY2FzZSAxOgotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKHR5cGVbeHhdIDw8IDMpIHwgU0laRV9PTkVfQllURSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKHR5cGVbeHhdIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsICh0eXBlW3h4XSA8PCAzKSB8IFNJWkVfRk9VUl9CWVRFUyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA4OgotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKHR5cGVbeHhdIDw8IDMpIHwgU0laRV9FSUdIVF9CWVRFUyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxNjoKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsICh0eXBlW3h4XSA8PCAzKSB8IFNJWkVfU0lYVEVFTl9CWVRFUyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsICh0eXBlW3h4XSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9CWVRFKTsKLSAgICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIGxlblt4eF0pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBUlJBWV9UT19CRV9TVFJFQU0ocCwgcF92YWxbeHhdLCBsZW5beHhdKTsKLQotICAgIGlmIChwIC0gcF9idWZmID4gU0RQX01BWF9BVFRSX0xFTikgewotICAgICAgLyogZ28gYmFjayB0byBiZWZvcmUgd2UgYWRkIHRoaXMgZWxlbWVudCAqLwotICAgICAgcCA9IHBfaGVhZDsKLSAgICAgIGlmIChwX2hlYWQgPT0gcF9idWZmKSB7Ci0gICAgICAgIC8qIHRoZSBmaXJzdCBlbGVtZW50IGV4Y2VlZCB0aGUgbWF4IGxlbmd0aCAqLwotICAgICAgICBTRFBfVFJBQ0VfRVJST1IoIlNEUF9BZGRTZXF1ZW5jZSAtIHRvbyBsb25nKGF0dHJpYnV0ZSBpcyBub3QgYWRkZWQpISEiKTsKLSAgICAgICAgb3NpX2ZyZWUocF9idWZmKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlCi0gICAgICAgIFNEUF9UUkFDRV9FUlJPUigiU0RQX0FkZFNlcXVlbmNlIC0gdG9vIGxvbmcsIGFkZCAlZCBlbGVtZW50cyBvZiAlZCIsIHh4LAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2VsZW0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJlc3VsdCA9IFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBhdHRyX2lkLCBEQVRBX0VMRV9TRVFfREVTQ19UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkocCAtIHBfYnVmZiksIHBfYnVmZik7Ci0gIG9zaV9mcmVlKHBfYnVmZik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfQWRkVXVpZFNlcXVlbmNlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBVVUlEIHNlcXVlbmNlIHRvIGEgcmVjb3JkLgotICogICAgICAgICAgICAgICAgICBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZSBBUEkuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBzZXF1ZW5jZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcmVjb3JkLCBpdCBpcyByZXBsYWNlZAotICogICAgICAgICAgICAgICAgICB3aXRoIHRoZSBuZXcgc2VxdWVuY2UuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFV1aWRTZXF1ZW5jZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IGF0dHJfaWQsIHVpbnQxNl90IG51bV91dWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF91dWlkcykgewotICB1aW50MTZfdCB4eDsKLSAgdWludDhfdCogcDsKLSAgaW50MzJfdCBtYXhfbGVuID0gU0RQX01BWF9BVFRSX0xFTiAtIDM7Ci0gIGJvb2wgcmVzdWx0OwotICB1aW50OF90KiBwX2J1ZmYgPQotICAgICAgKHVpbnQ4X3QqKW9zaV9tYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogU0RQX01BWF9BVFRSX0xFTiAqIDIpOwotCi0gIHAgPSBwX2J1ZmY7Ci0KLSAgLyogRmlyc3QsIGJ1aWxkIHRoZSBzZXF1ZW5jZSAqLwotICBmb3IgKHh4ID0gMDsgeHggPCBudW1fdXVpZHM7IHh4KyssIHBfdXVpZHMrKykgewotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCAoVVVJRF9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX1RXT19CWVRFUyk7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCAqcF91dWlkcyk7Ci0KLSAgICBpZiAoKHAgLSBwX2J1ZmYpID4gbWF4X2xlbikgewotICAgICAgU0RQX1RSQUNFX1dBUk5JTkcoIlNEUF9BZGRVdWlkU2VxdWVuY2UgLSB0b28gbG9uZywgYWRkICVkIHV1aWRzIG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHh4LCBudW1fdXVpZHMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmVzdWx0ID0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIGF0dHJfaWQsIERBVEFfRUxFX1NFUV9ERVNDX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShwIC0gcF9idWZmKSwgcF9idWZmKTsKLSAgb3NpX2ZyZWUocF9idWZmKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRQcm90b2NvbExpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhIHByb3RvY29sIGRlc2NyaXB0b3IgbGlzdCB0bwotICogICAgICAgICAgICAgICAgICBhIHJlY29yZC4gVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UKLSAqICAgICAgICAgICAgICAgICAgbWFpbnRlbmFuY2UgQVBJLiBJZiB0aGUgcHJvdG9jb2wgbGlzdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgcmVjb3JkLCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBuZXcgbGlzdC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgYWRkZWQgT0ssIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTRFBfQWRkUHJvdG9jb2xMaXN0KHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2VsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW1fbGlzdCkgewotICBpbnQgb2Zmc2V0OwotICBib29sIHJlc3VsdDsKLSAgdWludDhfdCogcF9idWZmID0KLSAgICAgICh1aW50OF90Kilvc2lfbWFsbG9jKHNpemVvZih1aW50OF90KSAqIFNEUF9NQVhfQVRUUl9MRU4gKiAyKTsKLQotICBvZmZzZXQgPSBzZHBfY29tcG9zZV9wcm90b19saXN0KHBfYnVmZiwgbnVtX2VsZW0sIHBfZWxlbV9saXN0KTsKLSAgcmVzdWx0ID0gU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfUFJPVE9DT0xfREVTQ19MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfRUxFX1NFUV9ERVNDX1RZUEUsICh1aW50MzJfdClvZmZzZXQsIHBfYnVmZik7Ci0gIG9zaV9mcmVlKHBfYnVmZik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTRFBfQWRkQWRkaXRpb25Qcm90b0xpc3RzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBwcm90b2NvbCBkZXNjcmlwdG9yIGxpc3QgdG8KLSAqICAgICAgICAgICAgICAgICAgYSByZWNvcmQuIFRoaXMgd291bGQgYmUgdGhyb3VnaCB0aGUgU0RQIGRhdGFiYXNlIG1haW50ZW5hbmNlCi0gKiAgICAgICAgICAgICAgICAgIEFQSS4gSWYgdGhlIHByb3RvY29sIGxpc3QgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHJlY29yZCwgaXQKLSAqICAgICAgICAgICAgICAgICAgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZEFkZGl0aW9uUHJvdG9MaXN0cyh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9lbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfUFJPVE9fTElTVF9FTEVNKiBwX3Byb3RvX2xpc3QpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHVpbnQ4X3QqIHA7Ci0gIHVpbnQ4X3QqIHBfbGVuOwotICBpbnQgb2Zmc2V0OwotICBib29sIHJlc3VsdDsKLSAgdWludDhfdCogcF9idWZmID0KLSAgICAgICh1aW50OF90Kilvc2lfbWFsbG9jKHNpemVvZih1aW50OF90KSAqIFNEUF9NQVhfQVRUUl9MRU4gKiAyKTsKLQotICBwID0gcF9idWZmOwotCi0gIC8qIGZvciBlYWNoIFByb3RvY29sRGVzY3JpcHRvckxpc3QgKi8KLSAgZm9yICh4eCA9IDA7IHh4IDwgbnVtX2VsZW07IHh4KyssIHBfcHJvdG9fbGlzdCsrKSB7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChEQVRBX0VMRV9TRVFfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9JTl9ORVhUX0JZVEUpOwotICAgIHBfbGVuID0gcCsrOwotCi0gICAgb2Zmc2V0ID0gc2RwX2NvbXBvc2VfcHJvdG9fbGlzdChwLCBwX3Byb3RvX2xpc3QtPm51bV9lbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJvdG9fbGlzdC0+bGlzdF9lbGVtKTsKLSAgICBwICs9IG9mZnNldDsKLQotICAgICpwX2xlbiA9ICh1aW50OF90KShwIC0gcF9sZW4gLSAxKTsKLSAgfQotICByZXN1bHQgPQotICAgICAgU0RQX0FkZEF0dHJpYnV0ZShoYW5kbGUsIEFUVFJfSURfQURESVRJT05fUFJPVE9fREVTQ19MSVNUUywKLSAgICAgICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgKHVpbnQzMl90KShwIC0gcF9idWZmKSwgcF9idWZmKTsKLSAgb3NpX2ZyZWUocF9idWZmKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhIHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0IHRvCi0gKiAgICAgICAgICAgICAgICAgIGEgcmVjb3JkLiBUaGlzIHdvdWxkIGJlIHRocm91Z2ggdGhlIFNEUCBkYXRhYmFzZSBtYWludGVuYW5jZQotICogICAgICAgICAgICAgICAgICBBUEkuIElmIHRoZSB2ZXJzaW9uIGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzCi0gKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBvbmUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIGFkZGVkIE9LLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgU0RQX0FkZFByb2ZpbGVEZXNjcmlwdG9yTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IHByb2ZpbGVfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIGJvb2wgcmVzdWx0OwotICB1aW50OF90KiBwX2J1ZmYgPSAodWludDhfdCopb3NpX21hbGxvYyhzaXplb2YodWludDhfdCkgKiBTRFBfTUFYX0FUVFJfTEVOKTsKLQotICBwID0gcF9idWZmICsgMjsKLQotICAvKiBGaXJzdCwgYnVpbGQgdGhlIHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0LiBUaGlzIGNvbnNpc3RzIG9mIGEgZGF0YSBlbGVtZW50Ci0gICAqIHNlcXVlbmNlLiAqLwotICAvKiBUaGUgc2VxdWVuY2UgY29uc2lzdHMgb2YgcHJvZmlsZSdzIFVVSUQgYW5kIHZlcnNpb24gbnVtYmVyICAqLwotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVVSURfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIHByb2ZpbGVfdXVpZCk7Ci0KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChVSU5UX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfVFdPX0JZVEVTKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCB2ZXJzaW9uKTsKLQotICAvKiBBZGQgaW4gdHlwZSBhbmQgbGVuZ3RoIGZpZWxkcyAqLwotICAqcF9idWZmID0gKHVpbnQ4X3QpKChEQVRBX0VMRV9TRVFfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9JTl9ORVhUX0JZVEUpOwotICAqKHBfYnVmZiArIDEpID0gKHVpbnQ4X3QpKHAgLSAocF9idWZmICsgMikpOwotCi0gIHJlc3VsdCA9Ci0gICAgICBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgKHVpbnQzMl90KShwIC0gcF9idWZmKSwgcF9idWZmKTsKLSAgb3NpX2ZyZWUocF9idWZmKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRMYW5ndWFnZUJhc2VBdHRySURMaXN0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgYSBsYW5ndWFnZSBiYXNlIGF0dHIgbGlzdCB0bwotICogICAgICAgICAgICAgICAgICBhIHJlY29yZC4gVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgQVBJLiBJZiB0aGUgdmVyc2lvbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcmVjb3JkLCBpdCBpcwotICogICAgICAgICAgICAgICAgICByZXBsYWNlZCB3aXRoIHRoZSBuZXcgb25lLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9BZGRMYW5ndWFnZUJhc2VBdHRySURMaXN0KHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgbGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2hhcl9lbmMsIHVpbnQxNl90IGJhc2VfaWQpIHsKLSAgdWludDhfdCogcDsKLSAgYm9vbCByZXN1bHQ7Ci0gIHVpbnQ4X3QqIHBfYnVmZiA9ICh1aW50OF90Kilvc2lfbWFsbG9jKHNpemVvZih1aW50OF90KSAqIFNEUF9NQVhfQVRUUl9MRU4pOwotCi0gIHAgPSBwX2J1ZmY7Ci0KLSAgLyogRmlyc3QsIGJ1aWxkIHRoZSBsYW5ndWFnZSBiYXNlIGRlc2NyaXB0b3IgbGlzdC4gVGhpcyBjb25zaXN0cyBvZiBhIGRhdGEgKi8KLSAgLyogZWxlbWVudCBzZXF1ZW5jZS4gVGhlIHNlcXVlbmNlIGNvbnNpc3RzIG9mIDkgYnl0ZXMgKDMgVUlOdDE2IGZpZWxkcykgICAgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChVSU5UX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfVFdPX0JZVEVTKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBsYW5nKTsKLQotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIGNoYXJfZW5jKTsKLQotICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIGJhc2VfaWQpOwotCi0gIHJlc3VsdCA9Ci0gICAgICBTRFBfQWRkQXR0cmlidXRlKGhhbmRsZSwgQVRUUl9JRF9MQU5HVUFHRV9CQVNFX0FUVFJfSURfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgKHVpbnQzMl90KShwIC0gcF9idWZmKSwgcF9idWZmKTsKLSAgb3NpX2ZyZWUocF9idWZmKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCBhIHNlcnZpY2UgbGlzdCB0byBhIHJlY29yZC4KLSAqICAgICAgICAgICAgICAgICAgVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UgQVBJLgotICogICAgICAgICAgICAgICAgICBJZiB0aGUgc2VydmljZSBsaXN0IGFscmVhZHkgZXhpc3RzIGluIHRoZSByZWNvcmQsIGl0IGlzCi0gKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBsaXN0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBhZGRlZCBPSywgZWxzZSBmYWxzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfc2VydmljZV91dWlkcykgewotICB1aW50MTZfdCB4eDsKLSAgdWludDhfdCogcDsKLSAgYm9vbCByZXN1bHQ7Ci0gIHVpbnQ4X3QqIHBfYnVmZiA9Ci0gICAgICAodWludDhfdCopb3NpX21hbGxvYyhzaXplb2YodWludDhfdCkgKiBTRFBfTUFYX0FUVFJfTEVOICogMik7Ci0KLSAgcCA9IHBfYnVmZjsKLQotICBmb3IgKHh4ID0gMDsgeHggPCBudW1fc2VydmljZXM7IHh4KyssIHBfc2VydmljZV91dWlkcysrKSB7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIChVVUlEX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfVFdPX0JZVEVTKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsICpwX3NlcnZpY2VfdXVpZHMpOwotICB9Ci0KLSAgcmVzdWx0ID0KLSAgICAgIFNEUF9BZGRBdHRyaWJ1dGUoaGFuZGxlLCBBVFRSX0lEX1NFUlZJQ0VfQ0xBU1NfSURfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSwgKHVpbnQzMl90KShwIC0gcF9idWZmKSwgcF9idWZmKTsKLSAgb3NpX2ZyZWUocF9idWZmKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNEUF9EZWxldGVBdHRyaWJ1dGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhbiBhdHRyaWJ1dGUgZnJvbSBhCi0gKiAgICAgICAgICAgICAgICAgIHJlY29yZC4gVGhpcyB3b3VsZCBiZSB0aHJvdWdoIHRoZSBTRFAgZGF0YWJhc2UgbWFpbnRlbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgQVBJLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBkZWxldGVkIE9LLCBlbHNlIGZhbHNlIGlmIG5vdCBmb3VuZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNEUF9EZWxldGVBdHRyaWJ1dGUodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX2lkKSB7Ci0gIHRTRFBfUkVDT1JEKiBwX3JlYyA9ICZzZHBfY2Iuc2VydmVyX2RiLnJlY29yZFswXTsKLSAgdWludDhfdCogcGFkX3B0cjsKLSAgdWludDMyX3QgbGVuOyAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGVudHJ5ICovCi0KLSAgLyogRmluZCB0aGUgcmVjb3JkIGluIHRoZSBkYXRhYmFzZSAqLwotICBmb3IgKHVpbnQxNl90IHJlY29yZF9pbmRleCA9IDA7IHJlY29yZF9pbmRleCA8IHNkcF9jYi5zZXJ2ZXJfZGIubnVtX3JlY29yZHM7IHJlY29yZF9pbmRleCsrLCBwX3JlYysrKSB7Ci0gICAgaWYgKHBfcmVjLT5yZWNvcmRfaGFuZGxlID09IGhhbmRsZSkgewotICAgICAgdFNEUF9BVFRSSUJVVEUqIHBfYXR0ciA9ICZwX3JlYy0+YXR0cmlidXRlWzBdOwotCi0gICAgICBTRFBfVFJBQ0VfQVBJKCJEZWxldGluZyBhdHRyX2lkIDB4JTA0eCBmb3IgaGFuZGxlIDB4JXgiLCBhdHRyX2lkLCBoYW5kbGUpOwotICAgICAgLyogRm91bmQgaXQuIE5vdywgZmluZCB0aGUgYXR0cmlidXRlICovCi0gICAgICBmb3IgKHVpbnQxNl90IGF0dHJpYnV0ZV9pbmRleCA9IDA7IGF0dHJpYnV0ZV9pbmRleCA8IHBfcmVjLT5udW1fYXR0cmlidXRlczsgYXR0cmlidXRlX2luZGV4KyssIHBfYXR0cisrKSB7Ci0gICAgICAgIGlmIChwX2F0dHItPmlkID09IGF0dHJfaWQpIHsKLSAgICAgICAgICBwYWRfcHRyID0gcF9hdHRyLT52YWx1ZV9wdHI7Ci0gICAgICAgICAgbGVuID0gcF9hdHRyLT5sZW47Ci0KLSAgICAgICAgICBpZiAobGVuKSB7Ci0gICAgICAgICAgICBmb3IgKHVpbnQxNl90IHp6ID0gMDsgenogPCBwX3JlYy0+bnVtX2F0dHJpYnV0ZXM7IHp6KyspIHsKLSAgICAgICAgICAgICAgaWYgKHBfcmVjLT5hdHRyaWJ1dGVbenpdLnZhbHVlX3B0ciA+IHBhZF9wdHIpCi0gICAgICAgICAgICAgICAgcF9yZWMtPmF0dHJpYnV0ZVt6el0udmFsdWVfcHRyIC09IGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBGb3VuZCBpdC4gU2hpZnQgZXZlcnl0aGluZyB1cCBvbmUgKi8KLSAgICAgICAgICBwX3JlYy0+bnVtX2F0dHJpYnV0ZXMtLTsKLQotICAgICAgICAgIGZvciAodWludDE2X3QgenogPSBhdHRyaWJ1dGVfaW5kZXg7IHp6IDwgcF9yZWMtPm51bV9hdHRyaWJ1dGVzOyB6eisrLCBwX2F0dHIrKykgewotICAgICAgICAgICAgKnBfYXR0ciA9ICoocF9hdHRyICsgMSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogYWRqdXN0IGF0dHJpYnV0ZSB2YWx1ZXMgaWYgbmVlZGVkICovCi0gICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgdWludDE2X3QgbGFzdF9hdHRyaWJ1dGVfdG9fYWRqdXN0ID0KLSAgICAgICAgICAgICAgICAocF9yZWMtPmZyZWVfcGFkX3B0ciAtICgocGFkX3B0ciArIGxlbikgLSAmcF9yZWMtPmF0dHJfcGFkWzBdKSk7Ci0gICAgICAgICAgICBmb3IgKHVpbnQxNl90IHp6ID0gMDsgenogPCBsYXN0X2F0dHJpYnV0ZV90b19hZGp1c3Q7IHp6KyssIHBhZF9wdHIrKykgewotICAgICAgICAgICAgICAqcGFkX3B0ciA9ICoocGFkX3B0ciArIGxlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX3JlYy0+ZnJlZV9wYWRfcHRyIC09IGxlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuICh0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBJZiBoZXJlLCBub3QgZm91bmQgKi8KLSAgcmV0dXJuIChmYWxzZSk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9zZHAvc2RwX2Rpc2NvdmVyeS5jYyBiL3N0YWNrL3NkcC9zZHBfZGlzY292ZXJ5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTBlODExLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3NkcC9zZHBfZGlzY292ZXJ5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgdGhpcyBmaWxlIGNvbnRhaW5zIFNEUCBkaXNjb3ZlcnkgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJzZHBfZGlzY292ZXJ5IgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL3NkcC9zZHBpbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX3NlYXJjaF9yc3AodENPTk5fQ0IqIHBfY2NiLCB1aW50OF90KiBwX3JlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXBseV9lbmQpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX2F0dHJfcnNwKHRDT05OX0NCKiBwX2NjYiwgdWludDhfdCogcF9yZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlcGx5X2VuZCk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX3NlcnZpY2Vfc2VhcmNoX2F0dHJfcnNwKHRDT05OX0NCKiBwX2NjYiwgdWludDhfdCogcF9yZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXBseV9lbmQpOwotc3RhdGljIHVpbnQ4X3QqIHNhdmVfYXR0cl9zZXEodENPTk5fQ0IqIHBfY2NiLCB1aW50OF90KiBwLCB1aW50OF90KiBwX21zZ19lbmQpOwotc3RhdGljIHRTRFBfRElTQ19SRUMqIGFkZF9yZWNvcmQodFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSk7Ci1zdGF0aWMgdWludDhfdCogYWRkX2F0dHIodWludDhfdCogcCwgdWludDhfdCogcF9lbmQsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBhdHRyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19BVFRSKiBwX3BhcmVudF9hdHRyLCB1aW50OF90IG5lc3RfbGV2ZWwpOwotCi0vKiBTYWZldHkgY2hlY2sgaW4gY2FzZSB3ZSBnbyBjcmF6eSAqLwotI2RlZmluZSBNQVhfTkVTVF9MRVZFTFMgNQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9idWlsZF91dWlkX3NlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgYSBVVUlEIHNlcXVlbmNlIGZyb20gdGhlIGxpc3Qgb2YKLSAqICAgICAgICAgICAgICAgICAgcGFzc2VkIFVVSURzLiBJdCBpcyBhbHNvIHBhc3NlZCB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgIGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gbmV4dCBieXRlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCogc2RwdV9idWlsZF91dWlkX3NlcSh1aW50OF90KiBwX291dCwgdWludDE2X3QgbnVtX3V1aWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXVpZCogcF91dWlkX2xpc3QpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHVpbnQ4X3QqIHBfbGVuOwotCi0gIC8qIEZpcnN0IHRoaW5nIGlzIHRoZSBkYXRhIGVsZW1lbnQgaGVhZGVyICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKERBVEFfRUxFX1NFUV9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX0lOX05FWFRfQllURSk7Ci0KLSAgLyogUmVtZW1iZXIgd2hlcmUgdGhlIGxlbmd0aCBnb2VzLiBMZWF2ZSBzcGFjZSBmb3IgaXQuICovCi0gIHBfbGVuID0gcF9vdXQ7Ci0gIHBfb3V0ICs9IDE7Ci0KLSAgLyogTm93LCBsb29wIHRocm91Z2ggYW5kIHB1dCBpbiBhbGwgdGhlIFVVSUQocykgKi8KLSAgZm9yICh4eCA9IDA7IHh4IDwgbnVtX3V1aWRzOyB4eCsrLCBwX3V1aWRfbGlzdCsrKSB7Ci0gICAgaW50IGxlbiA9IHBfdXVpZF9saXN0LT5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpOwotICAgIGlmIChsZW4gPT0gVXVpZDo6a051bUJ5dGVzMTYpIHsKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKFVVSURfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX291dCwgcF91dWlkX2xpc3QtPkFzMTZCaXQoKSk7Ci0gICAgfSBlbHNlIGlmIChsZW4gPT0gVXVpZDo6a051bUJ5dGVzMzIpIHsKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKFVVSURfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9GT1VSX0JZVEVTKTsKLSAgICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9vdXQsIHBfdXVpZF9saXN0LT5BczMyQml0KCkpOwotICAgIH0gZWxzZSBpZiAobGVuID09IFV1aWQ6OmtOdW1CeXRlczEyOCkgewotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LCAoVVVJRF9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX1NJWFRFRU5fQllURVMpOwotICAgICAgQVJSQVlfVE9fQkVfU1RSRUFNKHBfb3V0LCBwX3V1aWRfbGlzdC0+VG8xMjhCaXRCRSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpVXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgICB9IGVsc2UgewotICAgICAgRENIRUNLKDApIDw8ICJTRFA6IFBhc3NlZCBVVUlEIGhhcyBpbnZhbGlkIGxlbmd0aCAiIDw8IGxlbjsKLSAgICB9Ci0gIH0KLQotICAvKiBOb3csIHB1dCBpbiB0aGUgbGVuZ3RoICovCi0gIHh4ID0gKHVpbnQxNl90KShwX291dCAtIHBfbGVuIC0gMSk7Ci0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX2xlbiwgeHgpOwotCi0gIHJldHVybiAocF9vdXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX3NuZF9zZXJ2aWNlX3NlYXJjaF9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYSBzZXJ2aWNlIHNlYXJjaCByZXF1ZXN0IHRvIHRoZSBTRFAgc2VydmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZHBfc25kX3NlcnZpY2Vfc2VhcmNoX3JlcSh0Q09OTl9DQiogcF9jY2IsIHVpbnQ4X3QgY29udF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NvbnQpIHsKLSAgdWludDhfdCAqcCwgKnBfc3RhcnQsICpwX3BhcmFtX2xlbjsKLSAgQlRfSERSKiBwX2NtZCA9IChCVF9IRFIqKW9zaV9tYWxsb2MoU0RQX0RBVEFfQlVGX1NJWkUpOwotICB1aW50MTZfdCBwYXJhbV9sZW47Ci0KLSAgLyogUHJlcGFyZSB0aGUgYnVmZmVyIGZvciBzZW5kaW5nIHRoZSBwYWNrZXQgdG8gTDJDQVAgKi8KLSAgcF9jbWQtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHAgPSBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX2NtZCArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBCdWlsZCBhIHNlcnZpY2Ugc2VhcmNoIHJlcXVlc3QgcGFja2V0ICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBTRFBfUERVX1NFUlZJQ0VfU0VBUkNIX1JFUSk7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgcF9jY2ItPnRyYW5zYWN0aW9uX2lkKTsKLSAgcF9jY2ItPnRyYW5zYWN0aW9uX2lkKys7Ci0KLSAgLyogU2tpcCB0aGUgbGVuZ3RoLCB3ZSBuZWVkIHRvIGFkZCBpdCBhdCB0aGUgZW5kICovCi0gIHBfcGFyYW1fbGVuID0gcDsKLSAgcCArPSAyOwotCi0vKiBCdWlsZCB0aGUgVUlEIHNlcXVlbmNlLiAqLwotICBwID0gc2RwdV9idWlsZF91dWlkX3NlcShwLCBwX2NjYi0+cF9kYi0+bnVtX3V1aWRfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfZGItPnV1aWRfZmlsdGVycyk7Ci0KLSAgLyogU2V0IG1heCBzZXJ2aWNlIHJlY29yZCBjb3VudCAqLwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIHNkcF9jYi5tYXhfcmVjc19wZXJfc2VhcmNoKTsKLQotICAvKiBTZXQgY29udGludWF0aW9uIHN0YXRlICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBjb250X2xlbik7Ci0KLSAgLyogaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHJlcXVlc3QgKi8KLSAgaWYgKGNvbnRfbGVuICYmIHBfY29udCkgewotICAgIG1lbWNweShwLCBwX2NvbnQsIGNvbnRfbGVuKTsKLSAgICBwICs9IGNvbnRfbGVuOwotICB9Ci0KLSAgLyogR28gYmFjayBhbmQgcHV0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGludG8gdGhlIGJ1ZmZlciAqLwotICBwYXJhbV9sZW4gPSAodWludDE2X3QpKHAgLSBwX3BhcmFtX2xlbiAtIDIpOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcGFyYW1fbGVuLCBwYXJhbV9sZW4pOwotCi0gIHBfY2NiLT5kaXNjX3N0YXRlID0gU0RQX0RJU0NfV0FJVF9IQU5ETEVTOwotCi0gIC8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBTRFAgZGF0YSBpbiB0aGUgYnVmZmVyICovCi0gIHBfY21kLT5sZW4gPSAodWludDE2X3QpKHAgLSBwX3N0YXJ0KTsKLQotICBMMkNBX0RhdGFXcml0ZShwX2NjYi0+Y29ubmVjdGlvbl9pZCwgcF9jbWQpOwotCi0gIC8qIFN0YXJ0IGluYWN0aXZpdHkgdGltZXIgKi8KLSAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5zZHBfY29ubl90aW1lciwgU0RQX0lOQUNUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICBzZHBfY29ubl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHBfZGlzY19jb25uZWN0ZWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gU0RQIGRpc2NvdmVyeSBhdHRlbXB0IGlzCi0gKiAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzZHBfZGlzY19jb25uZWN0ZWQodENPTk5fQ0IqIHBfY2NiKSB7Ci0gIGlmIChwX2NjYi0+aXNfYXR0cl9zZWFyY2gpIHsKLSAgICBwX2NjYi0+ZGlzY19zdGF0ZSA9IFNEUF9ESVNDX1dBSVRfU0VBUkNIX0FUVFI7Ci0KLSAgICBwcm9jZXNzX3NlcnZpY2Vfc2VhcmNoX2F0dHJfcnNwKHBfY2NiLCBOVUxMLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBGaXJzdCBzdGVwIGlzIHRvIGdldCBhIGxpc3Qgb2YgdGhlIGhhbmRsZXMgZnJvbSB0aGUgc2VydmVyLiAqLwotICAgIC8qIFdlIGFyZSBub3Qgc2VhcmNoaW5nIGZvciBhIHNwZWNpZmljIGF0dHJpYnV0ZSwgc28gd2Ugd2lsbCAgICovCi0gICAgLyogZmlyc3Qgc2VhcmNoIGZvciB0aGUgc2VydmljZSwgdGhlbiBnZXQgYWxsIGF0dHJpYnV0ZXMgb2YgaXQgKi8KLQotICAgIHBfY2NiLT5udW1faGFuZGxlcyA9IDA7Ci0gICAgc2RwX3NuZF9zZXJ2aWNlX3NlYXJjaF9yZXEocF9jY2IsIDAsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHBfZGlzY19zZXJ2ZXJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcmVzcG9uc2UgZnJvbQotICogICAgICAgICAgICAgICAgICB0aGUgc2VydmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNkcF9kaXNjX3NlcnZlcl9yc3AodENPTk5fQ0IqIHBfY2NiLCBCVF9IRFIqIHBfbXNnKSB7Ci0gIHVpbnQ4X3QgKnAsIHJzcF9wZHU7Ci0gIGJvb2wgaW52YWxpZF9wZHUgPSB0cnVlOwotCi0gIC8qIHN0b3AgaW5hY3Rpdml0eSB0aW1lciB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSAqLwotICBhbGFybV9jYW5jZWwocF9jY2ItPnNkcF9jb25uX3RpbWVyKTsKLQotICAvKiBHb3QgYSByZXBseSEhIENoZWNrIHdoYXQgd2UgZ290IGJhY2sgKi8KLSAgcCA9ICh1aW50OF90KikocF9tc2cgKyAxKSArIHBfbXNnLT5vZmZzZXQ7Ci0gIHVpbnQ4X3QqIHBfZW5kID0gcCArIHBfbXNnLT5sZW47Ci0KLSAgaWYgKHBfbXNnLT5sZW4gPCAxKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3OTg4MzU2OCIpOwotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfR0VORVJJQ19FUlJPUik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQkVfU1RSRUFNX1RPX1VJTlQ4KHJzcF9wZHUsIHApOwotCi0gIHBfbXNnLT5sZW4tLTsKLQotICBzd2l0Y2ggKHJzcF9wZHUpIHsKLSAgICBjYXNlIFNEUF9QRFVfU0VSVklDRV9TRUFSQ0hfUlNQOgotICAgICAgaWYgKHBfY2NiLT5kaXNjX3N0YXRlID09IFNEUF9ESVNDX1dBSVRfSEFORExFUykgewotICAgICAgICBwcm9jZXNzX3NlcnZpY2Vfc2VhcmNoX3JzcChwX2NjYiwgcCwgcF9lbmQpOwotICAgICAgICBpbnZhbGlkX3BkdSA9IGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNEUF9QRFVfU0VSVklDRV9BVFRSX1JTUDoKLSAgICAgIGlmIChwX2NjYi0+ZGlzY19zdGF0ZSA9PSBTRFBfRElTQ19XQUlUX0FUVFIpIHsKLSAgICAgICAgcHJvY2Vzc19zZXJ2aWNlX2F0dHJfcnNwKHBfY2NiLCBwLCBwX2VuZCk7Ci0gICAgICAgIGludmFsaWRfcGR1ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0RQX1BEVV9TRVJWSUNFX1NFQVJDSF9BVFRSX1JTUDoKLSAgICAgIGlmIChwX2NjYi0+ZGlzY19zdGF0ZSA9PSBTRFBfRElTQ19XQUlUX1NFQVJDSF9BVFRSKSB7Ci0gICAgICAgIHByb2Nlc3Nfc2VydmljZV9zZWFyY2hfYXR0cl9yc3AocF9jY2IsIHAsIHBfZW5kKTsKLSAgICAgICAgaW52YWxpZF9wZHUgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGludmFsaWRfcGR1KSB7Ci0gICAgU0RQX1RSQUNFX1dBUk5JTkcoIlNEUCAtIFVuZXhwLiBQRFU6ICVkIGluIHN0YXRlOiAlZCIsIHJzcF9wZHUsCi0gICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPmRpc2Nfc3RhdGUpOwotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfR0VORVJJQ19FUlJPUik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcHJvY2Vzc19zZXJ2aWNlX3NlYXJjaF9yc3AKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBzZWFyY2ggcmVzcG9uc2UgZnJvbQotICogICAgICAgICAgICAgICAgICB0aGUgc2VydmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NlcnZpY2Vfc2VhcmNoX3JzcCh0Q09OTl9DQiogcF9jY2IsIHVpbnQ4X3QqIHBfcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlcGx5X2VuZCkgewotICB1aW50MTZfdCB4eDsKLSAgdWludDE2X3QgdG90YWwsIGN1cl9oYW5kbGVzLCBvcmlnOwotICB1aW50OF90IGNvbnRfbGVuOwotCi0gIGlmIChwX3JlcGx5ICsgOCA+IHBfcmVwbHlfZW5kKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NDI0OTg0MiIpOwotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfR0VORVJJQ19FUlJPUik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8qIFNraXAgdHJhbnNhY3Rpb24sIGFuZCBwYXJhbSBsZW4gKi8KLSAgcF9yZXBseSArPSA0OwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KHRvdGFsLCBwX3JlcGx5KTsKLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihjdXJfaGFuZGxlcywgcF9yZXBseSk7Ci0KLSAgb3JpZyA9IHBfY2NiLT5udW1faGFuZGxlczsKLSAgcF9jY2ItPm51bV9oYW5kbGVzICs9IGN1cl9oYW5kbGVzOwotICBpZiAocF9jY2ItPm51bV9oYW5kbGVzID09IDApIHsKLSAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gUmN2ZCBTZXJ2aWNlU2VhcmNoUnNwLCBubyBtYXRjaGVzIik7Ci0gICAgc2RwX2Rpc2Nvbm5lY3QocF9jY2IsIFNEUF9OT19SRUNTX01BVENIKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBTYXZlIHRoZSBoYW5kbGVzIHRoYXQgbWF0Y2guIFdlIHdpbGwgY2FuIG9ubHkgcHJvY2VzcyBhIGNlcnRhaW4gbnVtYmVyLiAqLwotICBpZiAodG90YWwgPiBzZHBfY2IubWF4X3JlY3NfcGVyX3NlYXJjaCkgdG90YWwgPSBzZHBfY2IubWF4X3JlY3NfcGVyX3NlYXJjaDsKLSAgaWYgKHBfY2NiLT5udW1faGFuZGxlcyA+IHNkcF9jYi5tYXhfcmVjc19wZXJfc2VhcmNoKQotICAgIHBfY2NiLT5udW1faGFuZGxlcyA9IHNkcF9jYi5tYXhfcmVjc19wZXJfc2VhcmNoOwotCi0gIGlmIChwX3JlcGx5ICsgKChwX2NjYi0+bnVtX2hhbmRsZXMgLSBvcmlnKSAqIDQpICsgMSA+IHBfcmVwbHlfZW5kKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NDI0OTg0MiIpOwotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfR0VORVJJQ19FUlJPUik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yICh4eCA9IG9yaWc7IHh4IDwgcF9jY2ItPm51bV9oYW5kbGVzOyB4eCsrKQotICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9jY2ItPmhhbmRsZXNbeHhdLCBwX3JlcGx5KTsKLQotICBCRV9TVFJFQU1fVE9fVUlOVDgoY29udF9sZW4sIHBfcmVwbHkpOwotICBpZiAoY29udF9sZW4gIT0gMCkgewotICAgIGlmIChjb250X2xlbiA+IFNEUF9NQVhfQ09OVElOVUFUSU9OX0xFTikgewotICAgICAgc2RwX2Rpc2Nvbm5lY3QocF9jY2IsIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocF9yZXBseSArIGNvbnRfbGVuID4gcF9yZXBseV9lbmQpIHsKLSAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjgxNjE1NDYiKTsKLSAgICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfSU5WQUxJRF9DT05UX1NUQVRFKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLyogc3RheSBpbiB0aGUgc2FtZSBzdGF0ZSAqLwotICAgIHNkcF9zbmRfc2VydmljZV9zZWFyY2hfcmVxKHBfY2NiLCBjb250X2xlbiwgcF9yZXBseSk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogY2hhbmdlIHN0YXRlICovCi0gICAgcF9jY2ItPmRpc2Nfc3RhdGUgPSBTRFBfRElTQ19XQUlUX0FUVFI7Ci0KLSAgICAvKiBLaWNrIG9mZiB0aGUgZmlyc3QgYXR0cmlidXRlIHJlcXVlc3QgKi8KLSAgICBwcm9jZXNzX3NlcnZpY2VfYXR0cl9yc3AocF9jY2IsIE5VTEwsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHBfY29weV9yYXdfZGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgY29weSB0aGUgcmF3IGRhdGEKLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICBib29sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzZnVsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgbm90IGNvcGllZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBzZHBfY29weV9yYXdfZGF0YSh0Q09OTl9DQiogcF9jY2IsIGJvb2wgb2Zmc2V0KSB7Ci0gIHVuc2lnbmVkIGludCBjcHlfbGVuLCByZW1fbGVuOwotICB1aW50MzJfdCBsaXN0X2xlbjsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCogcF9lbmQ7Ci0gIHVpbnQ4X3QgdHlwZTsKLQotICBpZiAocF9jY2ItPnBfZGItPnJhd19kYXRhKSB7Ci0gICAgY3B5X2xlbiA9IHBfY2NiLT5wX2RiLT5yYXdfc2l6ZSAtIHBfY2NiLT5wX2RiLT5yYXdfdXNlZDsKLSAgICBsaXN0X2xlbiA9IHBfY2NiLT5saXN0X2xlbjsKLSAgICBwID0gJnBfY2NiLT5yc3BfbGlzdFswXTsKLSAgICBwX2VuZCA9ICZwX2NjYi0+cnNwX2xpc3RbMF0gKyBsaXN0X2xlbjsKLQotICAgIGlmIChvZmZzZXQpIHsKLSAgICAgIGNweV9sZW4gLT0gMTsKLSAgICAgIHR5cGUgPSAqcCsrOwotICAgICAgdWludDhfdCogb2xkX3AgPSBwOwotICAgICAgcCA9IHNkcHVfZ2V0X2xlbl9mcm9tX3R5cGUocCwgcF9lbmQsIHR5cGUsICZsaXN0X2xlbik7Ci0gICAgICBpZiAocCA9PSBOVUxMIHx8IChwICsgbGlzdF9sZW4pID4gcF9lbmQpIHsKLSAgICAgICAgU0RQX1RSQUNFX1dBUk5JTkcoIiVzOiBiYWQgbGVuZ3RoIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoKGludCljcHlfbGVuIDwgKHAgLSBvbGRfcCkpIHsKLSAgICAgICAgU0RQX1RSQUNFX1dBUk5JTkcoIiVzOiBubyBieXRlcyBsZWZ0IGZvciBkYXRhIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjcHlfbGVuIC09IChwIC0gb2xkX3ApOwotICAgIH0KLSAgICBpZiAobGlzdF9sZW4gPCBjcHlfbGVuKSB7Ci0gICAgICBjcHlfbGVuID0gbGlzdF9sZW47Ci0gICAgfQotICAgIHJlbV9sZW4gPSBTRFBfTUFYX0xJU1RfQllURV9DT1VOVCAtICh1bnNpZ25lZCBpbnQpKHAgLSAmcF9jY2ItPnJzcF9saXN0WzBdKTsKLSAgICBpZiAoY3B5X2xlbiA+IHJlbV9sZW4pIHsKLSAgICAgIFNEUF9UUkFDRV9XQVJOSU5HKCJyZW1fbGVuIDolZCBsZXNzIHRoYW4gY3B5X2xlbjolZCIsIHJlbV9sZW4sIGNweV9sZW4pOwotICAgICAgY3B5X2xlbiA9IHJlbV9sZW47Ci0gICAgfQotICAgIG1lbWNweSgmcF9jY2ItPnBfZGItPnJhd19kYXRhW3BfY2NiLT5wX2RiLT5yYXdfdXNlZF0sIHAsIGNweV9sZW4pOwotICAgIHBfY2NiLT5wX2RiLT5yYXdfdXNlZCArPSBjcHlfbGVuOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgcHJvY2Vzc19zZXJ2aWNlX2F0dHJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgYXR0cmlidXRlIHJlc3BvbnNlCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHNlcnZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX2F0dHJfcnNwKHRDT05OX0NCKiBwX2NjYiwgdWludDhfdCogcF9yZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlcGx5X2VuZCkgewotICB1aW50OF90ICpwX3N0YXJ0LCAqcF9wYXJhbV9sZW47Ci0gIHVpbnQxNl90IHBhcmFtX2xlbiwgbGlzdF9ieXRlX2NvdW50OwotICBib29sIGNvbnRfcmVxdWVzdF9uZWVkZWQgPSBmYWxzZTsKLQotICAvKiBJZiBwX3JlcGx5IGlzIE5VTEwsIHdlIHdlcmUgY2FsbGVkIGFmdGVyIHRoZSByZWNvcmRzIGhhbmRsZXMgd2VyZSByZWFkICovCi0gIGlmIChwX3JlcGx5KSB7Ci0gICAgaWYgKHBfcmVwbHkgKyA0IC8qIHRyYW5zYWN0aW9uIElEIGFuZCBsZW5ndGggKi8gKyBzaXplb2YobGlzdF9ieXRlX2NvdW50KSA+Ci0gICAgICAgIHBfcmVwbHlfZW5kKSB7Ci0gICAgICBzZHBfZGlzY29ubmVjdChwX2NjYiwgU0RQX0lOVkFMSURfUERVX1NJWkUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFNraXAgdHJhbnNhY3Rpb24gSUQgYW5kIGxlbmd0aCAqLwotICAgIHBfcmVwbHkgKz0gNDsKLQotICAgIEJFX1NUUkVBTV9UT19VSU5UMTYobGlzdF9ieXRlX2NvdW50LCBwX3JlcGx5KTsKLQotICAgIC8qIENvcHkgdGhlIHJlc3BvbnNlIHRvIHRoZSBzY3JhdGNocGFkLiBGaXJzdCwgYSBzYWZldHkgY2hlY2sgb24gdGhlIGxlbmd0aAotICAgICAqLwotICAgIGlmICgocF9jY2ItPmxpc3RfbGVuICsgbGlzdF9ieXRlX2NvdW50KSA+IFNEUF9NQVhfTElTVF9CWVRFX0NPVU5UKSB7Ci0gICAgICBzZHBfZGlzY29ubmVjdChwX2NjYiwgU0RQX0lOVkFMSURfUERVX1NJWkUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwX2NjYi0+cnNwX2xpc3QgPT0gTlVMTCkKLSAgICAgIHBfY2NiLT5yc3BfbGlzdCA9ICh1aW50OF90Kilvc2lfbWFsbG9jKFNEUF9NQVhfTElTVF9CWVRFX0NPVU5UKTsKLSAgICBtZW1jcHkoJnBfY2NiLT5yc3BfbGlzdFtwX2NjYi0+bGlzdF9sZW5dLCBwX3JlcGx5LCBsaXN0X2J5dGVfY291bnQpOwotICAgIHBfY2NiLT5saXN0X2xlbiArPSBsaXN0X2J5dGVfY291bnQ7Ci0gICAgcF9yZXBseSArPSBsaXN0X2J5dGVfY291bnQ7Ci0gICAgaWYgKCpwX3JlcGx5KSB7Ci0gICAgICBpZiAoKnBfcmVwbHkgPiBTRFBfTUFYX0NPTlRJTlVBVElPTl9MRU4pIHsKLSAgICAgICAgc2RwX2Rpc2Nvbm5lY3QocF9jY2IsIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBjb250X3JlcXVlc3RfbmVlZGVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgU0RQX1RSQUNFX1dBUk5JTkcoInByb2Nlc3Nfc2VydmljZV9hdHRyX3JzcCIpOwotICAgICAgaWYgKCFzZHBfY29weV9yYXdfZGF0YShwX2NjYiwgZmFsc2UpKSB7Ci0gICAgICAgIFNEUF9UUkFDRV9FUlJPUigic2RwX2NvcHlfcmF3X2RhdGEgZmFpbGVkIik7Ci0gICAgICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfSUxMRUdBTF9QQVJBTUVURVIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNhdmUgdGhlIHJlc3BvbnNlIGluIHRoZSBkYXRhYmFzZS4gU3RvcCBvbiBhbnkgZXJyb3IgKi8KLSAgICAgIGlmICghc2F2ZV9hdHRyX3NlcShwX2NjYiwgJnBfY2NiLT5yc3BfbGlzdFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmcF9jY2ItPnJzcF9saXN0W3BfY2NiLT5saXN0X2xlbl0pKSB7Ci0gICAgICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfREJfRlVMTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBfY2NiLT5saXN0X2xlbiA9IDA7Ci0gICAgICBwX2NjYi0+Y3VyX2hhbmRsZSsrOwotICAgIH0KLSAgfQotCi0gIC8qIE5vdywgYXNrIGZvciB0aGUgbmV4dCBoYW5kbGUuIFJlLXVzZSB0aGUgYnVmZmVyIHdlIGp1c3QgZ290LiAqLwotICBpZiAocF9jY2ItPmN1cl9oYW5kbGUgPCBwX2NjYi0+bnVtX2hhbmRsZXMpIHsKLSAgICBCVF9IRFIqIHBfbXNnID0gKEJUX0hEUiopb3NpX21hbGxvYyhTRFBfREFUQV9CVUZfU0laRSk7Ci0gICAgdWludDhfdCogcDsKLQotICAgIHBfbXNnLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICAgIHAgPSBwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX21zZyArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAgIC8qIEdldCBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VydmVyICovCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIFNEUF9QRFVfU0VSVklDRV9BVFRSX1JFUSk7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBwX2NjYi0+dHJhbnNhY3Rpb25faWQpOwotICAgIHBfY2NiLT50cmFuc2FjdGlvbl9pZCsrOwotCi0gICAgLyogU2tpcCB0aGUgbGVuZ3RoLCB3ZSBuZWVkIHRvIGFkZCBpdCBhdCB0aGUgZW5kICovCi0gICAgcF9wYXJhbV9sZW4gPSBwOwotICAgIHAgKz0gMjsKLQotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocCwgcF9jY2ItPmhhbmRsZXNbcF9jY2ItPmN1cl9oYW5kbGVdKTsKLQotICAgIC8qIE1heCBhdHRyaWJ1dGUgYnl0ZSBjb3VudCAqLwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocCwgc2RwX2NiLm1heF9hdHRyX2xpc3Rfc2l6ZSk7Ci0KLSAgICAvKiBJZiBubyBhdHRyaWJ1dGUgZmlsdGVycywgYnVpbGQgYSB3aWxkY2FyZCBhdHRyaWJ1dGUgc2VxdWVuY2UgKi8KLSAgICBpZiAocF9jY2ItPnBfZGItPm51bV9hdHRyX2ZpbHRlcnMpCi0gICAgICBwID0gc2RwdV9idWlsZF9hdHRyaWJfc2VxKHAsIHBfY2NiLT5wX2RiLT5hdHRyX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5wX2RiLT5udW1fYXR0cl9maWx0ZXJzKTsKLSAgICBlbHNlCi0gICAgICBwID0gc2RwdV9idWlsZF9hdHRyaWJfc2VxKHAsIE5VTEwsIDApOwotCi0gICAgLyogV2FzIHRoaXMgYSBjb250aW51YXRpb24gcmVxdWVzdCA/ICovCi0gICAgaWYgKGNvbnRfcmVxdWVzdF9uZWVkZWQpIHsKLSAgICAgIGlmICgocF9yZXBseSArICpwX3JlcGx5ICsgMSkgPD0gcF9yZXBseV9lbmQpIHsKLSAgICAgICAgbWVtY3B5KHAsIHBfcmVwbHksICpwX3JlcGx5ICsgMSk7Ci0gICAgICAgIHAgKz0gKnBfcmVwbHkgKyAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2ODE2MTU0NiIpOwotICAgICAgfQotICAgIH0gZWxzZQotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHAsIDApOwotCi0gICAgLyogR28gYmFjayBhbmQgcHV0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGludG8gdGhlIGJ1ZmZlciAqLwotICAgIHBhcmFtX2xlbiA9ICh1aW50MTZfdCkocCAtIHBfcGFyYW1fbGVuIC0gMik7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3BhcmFtX2xlbiwgcGFyYW1fbGVuKTsKLQotICAgIC8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBTRFAgZGF0YSBpbiB0aGUgYnVmZmVyICovCi0gICAgcF9tc2ctPmxlbiA9ICh1aW50MTZfdCkocCAtIHBfc3RhcnQpOwotCi0gICAgTDJDQV9EYXRhV3JpdGUocF9jY2ItPmNvbm5lY3Rpb25faWQsIHBfbXNnKTsKLQotICAgIC8qIFN0YXJ0IGluYWN0aXZpdHkgdGltZXIgKi8KLSAgICBhbGFybV9zZXRfb25fbWxvb3AocF9jY2ItPnNkcF9jb25uX3RpbWVyLCBTRFBfSU5BQ1RfVElNRU9VVF9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgc2RwX2Nvbm5fdGltZXJfdGltZW91dCwgcF9jY2IpOwotICB9IGVsc2UgewotICAgIHNkcHVfbG9nX2F0dHJpYnV0ZV9tZXRyaWNzKHBfY2NiLT5kZXZpY2VfYWRkcmVzcywgcF9jY2ItPnBfZGIpOwotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfU1VDQ0VTUyk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwcm9jZXNzX3NlcnZpY2Vfc2VhcmNoX2F0dHJfcnNwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgc2VhcmNoIGF0dHJpYnV0ZQotICogICAgICAgICAgICAgICAgICByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc2VydmljZV9zZWFyY2hfYXR0cl9yc3AodENPTk5fQ0IqIHBfY2NiLCB1aW50OF90KiBwX3JlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlcGx5X2VuZCkgewotICB1aW50OF90ICpwLCAqcF9zdGFydCwgKnBfZW5kLCAqcF9wYXJhbV9sZW47Ci0gIHVpbnQ4X3QgdHlwZTsKLSAgdWludDMyX3Qgc2VxX2xlbjsKLSAgdWludDE2X3QgcGFyYW1fbGVuLCBsaXN0c19ieXRlX2NvdW50ID0gMDsKLSAgYm9vbCBjb250X3JlcXVlc3RfbmVlZGVkID0gZmFsc2U7Ci0KLSAgLyogSWYgcF9yZXBseSBpcyBOVUxMLCB3ZSB3ZXJlIGNhbGxlZCBmb3IgdGhlIGluaXRpYWwgcmVhZCAqLwotICBpZiAocF9yZXBseSkgewotICAgIGlmIChwX3JlcGx5ICsgNCAvKiB0cmFuc2FjdGlvbiBJRCBhbmQgbGVuZ3RoICovICsgc2l6ZW9mKGxpc3RzX2J5dGVfY291bnQpID4KLSAgICAgICAgcF9yZXBseV9lbmQpIHsKLSAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzk4ODQyOTIiKTsKLSAgICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfSU5WQUxJRF9QRFVfU0laRSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogU2tpcCB0cmFuc2FjdGlvbiBJRCBhbmQgbGVuZ3RoICovCi0gICAgcF9yZXBseSArPSA0OwotCi0gICAgQkVfU1RSRUFNX1RPX1VJTlQxNihsaXN0c19ieXRlX2NvdW50LCBwX3JlcGx5KTsKLQotICAgIC8qIENvcHkgdGhlIHJlc3BvbnNlIHRvIHRoZSBzY3JhdGNocGFkLiBGaXJzdCwgYSBzYWZldHkgY2hlY2sgb24gdGhlIGxlbmd0aAotICAgICAqLwotICAgIGlmICgocF9jY2ItPmxpc3RfbGVuICsgbGlzdHNfYnl0ZV9jb3VudCkgPiBTRFBfTUFYX0xJU1RfQllURV9DT1VOVCkgewotICAgICAgc2RwX2Rpc2Nvbm5lY3QocF9jY2IsIFNEUF9JTlZBTElEX1BEVV9TSVpFKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocF9yZXBseSArIGxpc3RzX2J5dGVfY291bnQgKyAxIC8qIGNvbnRpbnVhdGlvbiAqLyA+IHBfcmVwbHlfZW5kKSB7Ci0gICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc5ODg0MjkyIik7Ci0gICAgICBzZHBfZGlzY29ubmVjdChwX2NjYiwgU0RQX0lOVkFMSURfUERVX1NJWkUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwX2NjYi0+cnNwX2xpc3QgPT0gTlVMTCkKLSAgICAgIHBfY2NiLT5yc3BfbGlzdCA9ICh1aW50OF90Kilvc2lfbWFsbG9jKFNEUF9NQVhfTElTVF9CWVRFX0NPVU5UKTsKLSAgICBtZW1jcHkoJnBfY2NiLT5yc3BfbGlzdFtwX2NjYi0+bGlzdF9sZW5dLCBwX3JlcGx5LCBsaXN0c19ieXRlX2NvdW50KTsKLSAgICBwX2NjYi0+bGlzdF9sZW4gKz0gbGlzdHNfYnl0ZV9jb3VudDsKLSAgICBwX3JlcGx5ICs9IGxpc3RzX2J5dGVfY291bnQ7Ci0gICAgaWYgKCpwX3JlcGx5KSB7Ci0gICAgICBpZiAoKnBfcmVwbHkgPiBTRFBfTUFYX0NPTlRJTlVBVElPTl9MRU4pIHsKLSAgICAgICAgc2RwX2Rpc2Nvbm5lY3QocF9jY2IsIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGNvbnRfcmVxdWVzdF9uZWVkZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qIElmIGNvbnRpbnVhdGlvbiByZXF1ZXN0IChvciBmaXJzdCB0aW1lIHJlcXVlc3QpICovCi0gIGlmICgoY29udF9yZXF1ZXN0X25lZWRlZCkgfHwgKCFwX3JlcGx5KSkgewotICAgIEJUX0hEUiogcF9tc2cgPSAoQlRfSERSKilvc2lfbWFsbG9jKFNEUF9EQVRBX0JVRl9TSVpFKTsKLSAgICB1aW50OF90KiBwOwotCi0gICAgcF9tc2ctPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gICAgcCA9IHBfc3RhcnQgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gICAgLyogQnVpbGQgYSBzZXJ2aWNlIHNlYXJjaCByZXF1ZXN0IHBhY2tldCAqLwotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwLCBTRFBfUERVX1NFUlZJQ0VfU0VBUkNIX0FUVFJfUkVRKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHAsIHBfY2NiLT50cmFuc2FjdGlvbl9pZCk7Ci0gICAgcF9jY2ItPnRyYW5zYWN0aW9uX2lkKys7Ci0KLSAgICAvKiBTa2lwIHRoZSBsZW5ndGgsIHdlIG5lZWQgdG8gYWRkIGl0IGF0IHRoZSBlbmQgKi8KLSAgICBwX3BhcmFtX2xlbiA9IHA7Ci0gICAgcCArPSAyOwotCi0vKiBCdWlsZCB0aGUgVUlEIHNlcXVlbmNlLiAqLwotICAgIHAgPSBzZHB1X2J1aWxkX3V1aWRfc2VxKHAsIHBfY2NiLT5wX2RiLT5udW1fdXVpZF9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2NiLT5wX2RiLT51dWlkX2ZpbHRlcnMpOwotCi0gICAgLyogTWF4IGF0dHJpYnV0ZSBieXRlIGNvdW50ICovCi0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwLCBzZHBfY2IubWF4X2F0dHJfbGlzdF9zaXplKTsKLQotICAgIC8qIElmIG5vIGF0dHJpYnV0ZSBmaWx0ZXJzLCBidWlsZCBhIHdpbGRjYXJkIGF0dHJpYnV0ZSBzZXF1ZW5jZSAqLwotICAgIGlmIChwX2NjYi0+cF9kYi0+bnVtX2F0dHJfZmlsdGVycykKLSAgICAgIHAgPSBzZHB1X2J1aWxkX2F0dHJpYl9zZXEocCwgcF9jY2ItPnBfZGItPmF0dHJfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jY2ItPnBfZGItPm51bV9hdHRyX2ZpbHRlcnMpOwotICAgIGVsc2UKLSAgICAgIHAgPSBzZHB1X2J1aWxkX2F0dHJpYl9zZXEocCwgTlVMTCwgMCk7Ci0KLSAgICAvKiBObyBjb250aW51YXRpb24gZm9yIGZpcnN0IHJlcXVlc3QgKi8KLSAgICBpZiAocF9yZXBseSkgewotICAgICAgaWYgKChwX3JlcGx5ICsgKnBfcmVwbHkgKyAxKSA8PSBwX3JlcGx5X2VuZCkgewotICAgICAgICBtZW1jcHkocCwgcF9yZXBseSwgKnBfcmVwbHkgKyAxKTsKLSAgICAgICAgcCArPSAqcF9yZXBseSArIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY4MTYxNTQ2Iik7Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocCwgMCk7Ci0KLSAgICAvKiBHbyBiYWNrIGFuZCBwdXQgdGhlIHBhcmFtZXRlciBsZW5ndGggaW50byB0aGUgYnVmZmVyICovCi0gICAgcGFyYW1fbGVuID0gcCAtIHBfcGFyYW1fbGVuIC0gMjsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcGFyYW1fbGVuLCBwYXJhbV9sZW4pOwotCi0gICAgLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIFNEUCBkYXRhIGluIHRoZSBidWZmZXIgKi8KLSAgICBwX21zZy0+bGVuID0gcCAtIHBfc3RhcnQ7Ci0KLSAgICBMMkNBX0RhdGFXcml0ZShwX2NjYi0+Y29ubmVjdGlvbl9pZCwgcF9tc2cpOwotCi0gICAgLyogU3RhcnQgaW5hY3Rpdml0eSB0aW1lciAqLwotICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NjYi0+c2RwX2Nvbm5fdGltZXIsIFNEUF9JTkFDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICBzZHBfY29ubl90aW1lcl90aW1lb3V0LCBwX2NjYik7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBXZSBub3cgaGF2ZSB0aGUgZnVsbCByZXNwb25zZSwgd2hpY2ggaXMgYSBzZXF1ZW5jZSBvZiBzZXF1ZW5jZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIGlmICghc2RwX2NvcHlfcmF3X2RhdGEocF9jY2IsIHRydWUpKSB7Ci0gICAgTE9HX0VSUk9SKCJzZHBfY29weV9yYXdfZGF0YSBmYWlsZWQiKTsKLSAgICBzZHBfZGlzY29ubmVjdChwX2NjYiwgU0RQX0lMTEVHQUxfUEFSQU1FVEVSKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwID0gJnBfY2NiLT5yc3BfbGlzdFswXTsKLQotICAvKiBUaGUgY29udGVudHMgaXMgYSBzZXF1ZW5jZSBvZiBhdHRyaWJ1dGUgc2VxdWVuY2VzICovCi0gIHR5cGUgPSAqcCsrOwotCi0gIGlmICgodHlwZSA+PiAzKSAhPSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSB7Ci0gICAgTE9HX1dBUk4oIldyb25nIGVsZW1lbnQgaW4gYXR0cl9yc3AgdHlwZToweCUwMngiLCB0eXBlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcCA9IHNkcHVfZ2V0X2xlbl9mcm9tX3R5cGUocCwgcCArIHBfY2NiLT5saXN0X2xlbiwgdHlwZSwgJnNlcV9sZW4pOwotICBpZiAocCA9PSBOVUxMIHx8IChwICsgc2VxX2xlbikgPiAocCArIHBfY2NiLT5saXN0X2xlbikpIHsKLSAgICBMT0dfV0FSTigiSWxsZWdhbCBzZWFyY2ggYXR0cmlidXRlIGxlbmd0aCIpOwotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfSUxMRUdBTF9QQVJBTUVURVIpOwotICAgIHJldHVybjsKLSAgfQotICBwX2VuZCA9ICZwX2NjYi0+cnNwX2xpc3RbcF9jY2ItPmxpc3RfbGVuXTsKLQotICBpZiAoKHAgKyBzZXFfbGVuKSAhPSBwX2VuZCkgewotICAgIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfSU5WQUxJRF9DT05UX1NUQVRFKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB3aGlsZSAocCA8IHBfZW5kKSB7Ci0gICAgcCA9IHNhdmVfYXR0cl9zZXEocF9jY2IsIHAsICZwX2NjYi0+cnNwX2xpc3RbcF9jY2ItPmxpc3RfbGVuXSk7Ci0gICAgaWYgKCFwKSB7Ci0gICAgICBzZHBfZGlzY29ubmVjdChwX2NjYiwgU0RQX0RCX0ZVTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8qIFNpbmNlIHdlIGdvdCBldmVyeXRoaW5nIHdlIG5lZWQsIGRpc2Nvbm5lY3QgdGhlIGNhbGwgKi8KLSAgc2RwdV9sb2dfYXR0cmlidXRlX21ldHJpY3MocF9jY2ItPmRldmljZV9hZGRyZXNzLCBwX2NjYi0+cF9kYik7Ci0gIHNkcF9kaXNjb25uZWN0KHBfY2NiLCBTRFBfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzYXZlX2F0dHJfc2VxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcmVzcG9uc2UgZnJvbQotICogICAgICAgICAgICAgICAgICB0aGUgc2VydmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBuZXh0IGJ5dGUgb3IgTlVMTCBpZiBlcnJvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCogc2F2ZV9hdHRyX3NlcSh0Q09OTl9DQiogcF9jY2IsIHVpbnQ4X3QqIHAsIHVpbnQ4X3QqIHBfbXNnX2VuZCkgewotICB1aW50MzJfdCBzZXFfbGVuLCBhdHRyX2xlbjsKLSAgdWludDE2X3QgYXR0cl9pZDsKLSAgdWludDhfdCB0eXBlLCAqcF9zZXFfZW5kOwotICB0U0RQX0RJU0NfUkVDKiBwX3JlYzsKLQotICB0eXBlID0gKnArKzsKLQotICBpZiAoKHR5cGUgPj4gMykgIT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgewotICAgIFNEUF9UUkFDRV9XQVJOSU5HKCJTRFAgLSBXcm9uZyB0eXBlOiAweCUwMnggaW4gYXR0cl9yc3AiLCB0eXBlKTsKLSAgICByZXR1cm4gKE5VTEwpOwotICB9Ci0gIHAgPSBzZHB1X2dldF9sZW5fZnJvbV90eXBlKHAsIHBfbXNnX2VuZCwgdHlwZSwgJnNlcV9sZW4pOwotICBpZiAocCA9PSBOVUxMIHx8IChwICsgc2VxX2xlbikgPiBwX21zZ19lbmQpIHsKLSAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gQmFkIGxlbiBpbiBhdHRyX3JzcCAlZCIsIHNlcV9sZW4pOwotICAgIHJldHVybiAoTlVMTCk7Ci0gIH0KLQotICAvKiBDcmVhdGUgYSByZWNvcmQgKi8KLSAgcF9yZWMgPSBhZGRfcmVjb3JkKHBfY2NiLT5wX2RiLCBwX2NjYi0+ZGV2aWNlX2FkZHJlc3MpOwotICBpZiAoIXBfcmVjKSB7Ci0gICAgU0RQX1RSQUNFX1dBUk5JTkcoIlNEUCAtIERCIGZ1bGwgYWRkX3JlY29yZCIpOwotICAgIHJldHVybiAoTlVMTCk7Ci0gIH0KLQotICBwX3NlcV9lbmQgPSBwICsgc2VxX2xlbjsKLQotICB3aGlsZSAocCA8IHBfc2VxX2VuZCkgewotICAgIC8qIEZpcnN0IGdldCB0aGUgYXR0cmlidXRlIElEICovCi0gICAgdHlwZSA9ICpwKys7Ci0gICAgcCA9IHNkcHVfZ2V0X2xlbl9mcm9tX3R5cGUocCwgcF9tc2dfZW5kLCB0eXBlLCAmYXR0cl9sZW4pOwotICAgIGlmIChwID09IE5VTEwgfHwgKHAgKyBhdHRyX2xlbikgPiBwX3NlcV9lbmQpIHsKLSAgICAgIFNEUF9UUkFDRV9XQVJOSU5HKCIlczogQmFkIGxlbiBpbiBhdHRyX3JzcCAlZCIsIF9fZnVuY19fLCBhdHRyX2xlbik7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLSAgICBpZiAoKCh0eXBlID4+IDMpICE9IFVJTlRfREVTQ19UWVBFKSB8fCAoYXR0cl9sZW4gIT0gMikpIHsKLSAgICAgIFNEUF9UUkFDRV9XQVJOSU5HKCJTRFAgLSBCYWQgdHlwZTogMHglMDJ4IG9yIGxlbjogJWQgaW4gYXR0cl9yc3AiLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9sZW4pOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gICAgQkVfU1RSRUFNX1RPX1VJTlQxNihhdHRyX2lkLCBwKTsKLQotICAgIC8qIE5vdywgYWRkIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KLSAgICBwID0gYWRkX2F0dHIocCwgcF9zZXFfZW5kLCBwX2NjYi0+cF9kYiwgcF9yZWMsIGF0dHJfaWQsIE5VTEwsIDApOwotCi0gICAgaWYgKCFwKSB7Ci0gICAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gREIgZnVsbCBhZGRfYXR0ciIpOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYWRkX3JlY29yZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgc3BhY2UgZm9yIGEgcmVjb3JkIGZyb20gdGhlIERCLgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBuZXh0IGJ5dGUgaW4gZGF0YSBzdHJlYW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFNEUF9ESVNDX1JFQyogYWRkX3JlY29yZCh0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgdFNEUF9ESVNDX1JFQyogcF9yZWM7Ci0KLSAgLyogU2VlIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgZGF0YWJhc2UgKi8KLSAgaWYgKHBfZGItPm1lbV9mcmVlIDwgc2l6ZW9mKHRTRFBfRElTQ19SRUMpKSByZXR1cm4gKE5VTEwpOwotCi0gIHBfcmVjID0gKHRTRFBfRElTQ19SRUMqKXBfZGItPnBfZnJlZV9tZW07Ci0gIHBfZGItPnBfZnJlZV9tZW0gKz0gc2l6ZW9mKHRTRFBfRElTQ19SRUMpOwotICBwX2RiLT5tZW1fZnJlZSAtPSBzaXplb2YodFNEUF9ESVNDX1JFQyk7Ci0KLSAgcF9yZWMtPnBfZmlyc3RfYXR0ciA9IE5VTEw7Ci0gIHBfcmVjLT5wX25leHRfcmVjID0gTlVMTDsKLQotICBwX3JlYy0+cmVtb3RlX2JkX2FkZHIgPSBwX2JkYTsKLQotICAvKiBBZGQgdGhlIHJlY29yZCB0byB0aGUgZW5kIG9mIGNoYWluICovCi0gIGlmICghcF9kYi0+cF9maXJzdF9yZWMpCi0gICAgcF9kYi0+cF9maXJzdF9yZWMgPSBwX3JlYzsKLSAgZWxzZSB7Ci0gICAgdFNEUF9ESVNDX1JFQyogcF9yZWMxID0gcF9kYi0+cF9maXJzdF9yZWM7Ci0KLSAgICB3aGlsZSAocF9yZWMxLT5wX25leHRfcmVjKSBwX3JlYzEgPSBwX3JlYzEtPnBfbmV4dF9yZWM7Ci0KLSAgICBwX3JlYzEtPnBfbmV4dF9yZWMgPSBwX3JlYzsKLSAgfQotCi0gIHJldHVybiAocF9yZWMpOwotfQotCi0jZGVmaW5lIFNEUF9BRERJVElPTkFMX0xJU1RfTUFTSyAweDgwCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgYWRkX2F0dHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHNwYWNlIGZvciBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgREIKLSAqICAgICAgICAgICAgICAgICAgYW5kIGNvcGllcyB0aGUgZGF0YSBpbnRvIGl0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgcG9pbnRlciB0byBuZXh0IGJ5dGUgaW4gZGF0YSBzdHJlYW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3QqIGFkZF9hdHRyKHVpbnQ4X3QqIHAsIHVpbnQ4X3QqIHBfZW5kLCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYywgdWludDE2X3QgYXR0cl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQVRUUiogcF9wYXJlbnRfYXR0ciwgdWludDhfdCBuZXN0X2xldmVsKSB7Ci0gIHRTRFBfRElTQ19BVFRSKiBwX2F0dHI7Ci0gIHVpbnQzMl90IGF0dHJfbGVuOwotICB1aW50MzJfdCB0b3RhbF9sZW47Ci0gIHVpbnQxNl90IGF0dHJfdHlwZTsKLSAgdWludDE2X3QgaWQ7Ci0gIHVpbnQ4X3QgdHlwZTsKLSAgdWludDhfdCogcF9hdHRyX2VuZDsKLSAgdWludDhfdCBpc19hZGRpdGlvbmFsX2xpc3QgPSBuZXN0X2xldmVsICYgU0RQX0FERElUSU9OQUxfTElTVF9NQVNLOwotCi0gIG5lc3RfbGV2ZWwgJj0gfihTRFBfQURESVRJT05BTF9MSVNUX01BU0spOwotCi0gIHR5cGUgPSAqcCsrOwotICBwID0gc2RwdV9nZXRfbGVuX2Zyb21fdHlwZShwLCBwX2VuZCwgdHlwZSwgJmF0dHJfbGVuKTsKLSAgaWYgKHAgPT0gTlVMTCB8fCAocCArIGF0dHJfbGVuKSA+IHBfZW5kKSB7Ci0gICAgU0RQX1RSQUNFX1dBUk5JTkcoIiVzOiBiYWQgbGVuZ3RoIGluIGF0dHJfcnNwIiwgX19mdW5jX18pOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGF0dHJfbGVuICY9IFNEUF9ESVNDX0FUVFJfTEVOX01BU0s7Ci0gIGF0dHJfdHlwZSA9ICh0eXBlID4+IDMpICYgMHgwZjsKLQotICAvKiBTZWUgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBkYXRhYmFzZSAqLwotICBpZiAoYXR0cl9sZW4gPiA0KQotICAgIHRvdGFsX2xlbiA9IGF0dHJfbGVuIC0gNCArICh1aW50MTZfdClzaXplb2YodFNEUF9ESVNDX0FUVFIpOwotICBlbHNlCi0gICAgdG90YWxfbGVuID0gc2l6ZW9mKHRTRFBfRElTQ19BVFRSKTsKLQotICBwX2F0dHJfZW5kID0gcCArIGF0dHJfbGVuOwotICBpZiAocF9hdHRyX2VuZCA+IHBfZW5kKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTU5MDAwNDMiKTsKLSAgICBTRFBfVFJBQ0VfV0FSTklORygiJXM6IFNEUCAtIEF0dHJpYnV0ZSBsZW5ndGggYmV5b25kIHBfZW5kIiwgX19mdW5jX18pOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLyogRW5zdXJlIGl0IGlzIGEgbXVsdGlwbGUgb2YgNCAqLwotICB0b3RhbF9sZW4gPSAodG90YWxfbGVuICsgMykgJiB+MzsKLQotICAvKiBTZWUgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBkYXRhYmFzZSAqLwotICBpZiAocF9kYi0+bWVtX2ZyZWUgPCB0b3RhbF9sZW4pIHJldHVybiAoTlVMTCk7Ci0KLSAgcF9hdHRyID0gKHRTRFBfRElTQ19BVFRSKilwX2RiLT5wX2ZyZWVfbWVtOwotICBwX2F0dHItPmF0dHJfaWQgPSBhdHRyX2lkOwotICBwX2F0dHItPmF0dHJfbGVuX3R5cGUgPSAodWludDE2X3QpYXR0cl9sZW4gfCAoYXR0cl90eXBlIDw8IDEyKTsKLSAgcF9hdHRyLT5wX25leHRfYXR0ciA9IE5VTEw7Ci0KLSAgLyogU3RvcmUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLwotICBzd2l0Y2ggKGF0dHJfdHlwZSkgewotICAgIGNhc2UgVUlOVF9ERVNDX1RZUEU6Ci0gICAgICBpZiAoKGlzX2FkZGl0aW9uYWxfbGlzdCAhPSAwKSAmJiAoYXR0cl9sZW4gPT0gMikpIHsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihpZCwgcCk7Ci0gICAgICAgIGlmIChpZCAhPSBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVCkKLSAgICAgICAgICBwIC09IDI7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIC8qIFJlc2VydmUgdGhlIG1lbW9yeSBmb3IgdGhlIGF0dHJpYnV0ZSBub3csIGFzIHdlIG5lZWQgdG8gYWRkCi0gICAgICAgICAgICogc3ViLWF0dHJpYnV0ZXMgKi8KLSAgICAgICAgICBwX2RiLT5wX2ZyZWVfbWVtICs9IHNpemVvZih0U0RQX0RJU0NfQVRUUik7Ci0gICAgICAgICAgcF9kYi0+bWVtX2ZyZWUgLT0gc2l6ZW9mKHRTRFBfRElTQ19BVFRSKTsKLSAgICAgICAgICB0b3RhbF9sZW4gPSAwOwotCi0gICAgICAgICAgLyogU0RQX1RSQUNFX0RFQlVHICgiU0RQIC0gYXR0ciBuZXN0IGxldmVsOiVkKGxpc3QpIiwgbmVzdF9sZXZlbCk7ICovCi0gICAgICAgICAgaWYgKG5lc3RfbGV2ZWwgPj0gTUFYX05FU1RfTEVWRUxTKSB7Ci0gICAgICAgICAgICBTRFBfVFJBQ0VfRVJST1IoIlNEUCAtIGF0dHIgbmVzdGluZyB0b28gZGVlcCIpOwotICAgICAgICAgICAgcmV0dXJuIHBfYXR0cl9lbmQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogTm93LCBhZGQgdGhlIGxpc3QgZW50cnkgKi8KLSAgICAgICAgICBwID0gYWRkX2F0dHIocCwgcF9lbmQsIHBfZGIsIHBfcmVjLCBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgcF9hdHRyLCAodWludDhfdCkobmVzdF9sZXZlbCArIDEpKTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLyogRkFMTFRIUk9VR0ggKi8KLQotICAgIGNhc2UgVFdPX0NPTVBfSU5UX0RFU0NfVFlQRToKLSAgICAgIHN3aXRjaCAoYXR0cl9sZW4pIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIHBfYXR0ci0+YXR0cl92YWx1ZS52LnU4ID0gKnArKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2LCBwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTMyLCBwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgcF9hdHRyLT5hdHRyX3ZhbHVlLnYuYXJyYXksIChpbnQzMl90KWF0dHJfbGVuKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBVVUlEX0RFU0NfVFlQRToKLSAgICAgIHN3aXRjaCAoYXR0cl9sZW4pIHsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2LCBwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTMyLCBwKTsKLSAgICAgICAgICBpZiAocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTMyIDwgMHgxMDAwMCkgewotICAgICAgICAgICAgYXR0cl9sZW4gPSAyOwotICAgICAgICAgICAgcF9hdHRyLT5hdHRyX2xlbl90eXBlID0gKHVpbnQxNl90KWF0dHJfbGVuIHwgKGF0dHJfdHlwZSA8PCAxMik7Ci0gICAgICAgICAgICBwX2F0dHItPmF0dHJfdmFsdWUudi51MTYgPSAodWludDE2X3QpcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTMyOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAvKiBTZWUgaWYgd2UgY2FuIGNvbXByZXNzIHRoZSBVVUlEIGRvd24gdG8gMTYgb3IgMzJiaXQgVVVJRHMgKi8KLSAgICAgICAgICBpZiAoc2RwdV9pc19iYXNlX3V1aWQocCkpIHsKLSAgICAgICAgICAgIGlmICgocFswXSA9PSAwKSAmJiAocFsxXSA9PSAwKSkgewotICAgICAgICAgICAgICBwX2F0dHItPmF0dHJfbGVuX3R5cGUgPQotICAgICAgICAgICAgICAgICAgKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSAmIH5TRFBfRElTQ19BVFRSX0xFTl9NQVNLKSB8IDI7Ci0gICAgICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX2F0dHItPmF0dHJfdmFsdWUudi51MTYsIHApOwotICAgICAgICAgICAgICBwICs9IFV1aWQ6OmtOdW1CeXRlczEyOCAtIDQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBwX2F0dHItPmF0dHJfbGVuX3R5cGUgPQotICAgICAgICAgICAgICAgICAgKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSAmIH5TRFBfRElTQ19BVFRSX0xFTl9NQVNLKSB8IDQ7Ci0gICAgICAgICAgICAgIEJFX1NUUkVBTV9UT19VSU5UMzIocF9hdHRyLT5hdHRyX3ZhbHVlLnYudTMyLCBwKTsKLSAgICAgICAgICAgICAgcCArPSBVdWlkOjprTnVtQnl0ZXMxMjggLSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCRV9TVFJFQU1fVE9fQVJSQVkocCwgcF9hdHRyLT5hdHRyX3ZhbHVlLnYuYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXR0cl9sZW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gYmFkIGxlbiBpbiBVVUlEIGF0dHI6ICVkIiwgYXR0cl9sZW4pOwotICAgICAgICAgIHJldHVybiBwX2F0dHJfZW5kOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBVEFfRUxFX1NFUV9ERVNDX1RZUEU6Ci0gICAgY2FzZSBEQVRBX0VMRV9BTFRfREVTQ19UWVBFOgotICAgICAgLyogUmVzZXJ2ZSB0aGUgbWVtb3J5IGZvciB0aGUgYXR0cmlidXRlIG5vdywgYXMgd2UgbmVlZCB0byBhZGQKLSAgICAgICAqIHN1Yi1hdHRyaWJ1dGVzICovCi0gICAgICBwX2RiLT5wX2ZyZWVfbWVtICs9IHNpemVvZih0U0RQX0RJU0NfQVRUUik7Ci0gICAgICBwX2RiLT5tZW1fZnJlZSAtPSBzaXplb2YodFNEUF9ESVNDX0FUVFIpOwotICAgICAgdG90YWxfbGVuID0gMDsKLQotICAgICAgLyogU0RQX1RSQUNFX0RFQlVHICgiU0RQIC0gYXR0ciBuZXN0IGxldmVsOiVkIiwgbmVzdF9sZXZlbCk7ICovCi0gICAgICBpZiAobmVzdF9sZXZlbCA+PSBNQVhfTkVTVF9MRVZFTFMpIHsKLSAgICAgICAgU0RQX1RSQUNFX0VSUk9SKCJTRFAgLSBhdHRyIG5lc3RpbmcgdG9vIGRlZXAiKTsKLSAgICAgICAgcmV0dXJuIHBfYXR0cl9lbmQ7Ci0gICAgICB9Ci0gICAgICBpZiAoaXNfYWRkaXRpb25hbF9saXN0ICE9IDAgfHwKLSAgICAgICAgICBhdHRyX2lkID09IEFUVFJfSURfQURESVRJT05fUFJPVE9fREVTQ19MSVNUUykKLSAgICAgICAgbmVzdF9sZXZlbCB8PSBTRFBfQURESVRJT05BTF9MSVNUX01BU0s7Ci0gICAgICAvKiBTRFBfVFJBQ0VfREVCVUcgKCJTRFAgLSBhdHRyIG5lc3QgbGV2ZWw6MHgleChmaW5pc2gpIiwgbmVzdF9sZXZlbCk7ICovCi0KLSAgICAgIHdoaWxlIChwIDwgcF9hdHRyX2VuZCkgewotICAgICAgICAvKiBOb3csIGFkZCB0aGUgbGlzdCBlbnRyeSAqLwotICAgICAgICBwID0gYWRkX2F0dHIocCwgcF9lbmQsIHBfZGIsIHBfcmVjLCAwLCBwX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAodWludDhfdCkobmVzdF9sZXZlbCArIDEpKTsKLQotICAgICAgICBpZiAoIXApIHJldHVybiAoTlVMTCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVEVYVF9TVFJfREVTQ19UWVBFOgotICAgIGNhc2UgVVJMX0RFU0NfVFlQRToKLSAgICAgIEJFX1NUUkVBTV9UT19BUlJBWShwLCBwX2F0dHItPmF0dHJfdmFsdWUudi5hcnJheSwgKGludDMyX3QpYXR0cl9sZW4pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJPT0xFQU5fREVTQ19UWVBFOgotICAgICAgc3dpdGNoIChhdHRyX2xlbikgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTggPSAqcCsrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIFNEUF9UUkFDRV9XQVJOSU5HKCJTRFAgLSBiYWQgbGVuIGluIGJvb2xlYW4gYXR0cjogJWQiLCBhdHRyX2xlbik7Ci0gICAgICAgICAgcmV0dXJuIHBfYXR0cl9lbmQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6IC8qIHN3aXRjaCAoYXR0cl90eXBlKSAqLwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBwX2RiLT5wX2ZyZWVfbWVtICs9IHRvdGFsX2xlbjsKLSAgcF9kYi0+bWVtX2ZyZWUgLT0gdG90YWxfbGVuOwotCi0gIC8qIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluICovCi0gIGlmICghcF9wYXJlbnRfYXR0cikgewotICAgIGlmICghcF9yZWMtPnBfZmlyc3RfYXR0cikKLSAgICAgIHBfcmVjLT5wX2ZpcnN0X2F0dHIgPSBwX2F0dHI7Ci0gICAgZWxzZSB7Ci0gICAgICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyMSA9IHBfcmVjLT5wX2ZpcnN0X2F0dHI7Ci0KLSAgICAgIHdoaWxlIChwX2F0dHIxLT5wX25leHRfYXR0cikgcF9hdHRyMSA9IHBfYXR0cjEtPnBfbmV4dF9hdHRyOwotCi0gICAgICBwX2F0dHIxLT5wX25leHRfYXR0ciA9IHBfYXR0cjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFwX3BhcmVudF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cikgewotICAgICAgcF9wYXJlbnRfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHIgPSBwX2F0dHI7Ci0gICAgICAvKiBTRFBfVFJBQ0VfREVCVUcgKCJwYXJlbnQ6MHgleChpZDolZCksIGNoOjB4JXgoaWQ6JWQpIiwKLSAgICAgICAgICBwX3BhcmVudF9hdHRyLCBwX3BhcmVudF9hdHRyLT5hdHRyX2lkLCBwX2F0dHIsIHBfYXR0ci0+YXR0cl9pZCk7ICovCi0gICAgfSBlbHNlIHsKLSAgICAgIHRTRFBfRElTQ19BVFRSKiBwX2F0dHIxID0gcF9wYXJlbnRfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7Ci0gICAgICAvKiBTRFBfVFJBQ0VfREVCVUcgKCJwYXJlbnQ6MHgleChpZDolZCksIGNoMToweCV4KGlkOiVkKSIsCi0gICAgICAgICAgcF9wYXJlbnRfYXR0ciwgcF9wYXJlbnRfYXR0ci0+YXR0cl9pZCwgcF9hdHRyMSwgcF9hdHRyMS0+YXR0cl9pZCk7ICovCi0KLSAgICAgIHdoaWxlIChwX2F0dHIxLT5wX25leHRfYXR0cikgcF9hdHRyMSA9IHBfYXR0cjEtPnBfbmV4dF9hdHRyOwotCi0gICAgICBwX2F0dHIxLT5wX25leHRfYXR0ciA9IHBfYXR0cjsKLSAgICAgIC8qIFNEUF9UUkFDRV9ERUJVRyAoIm5ldyBjaDoweCV4KGlkOiVkKSIsIHBfYXR0ciwgcF9hdHRyLT5hdHRyX2lkKTsgKi8KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKHApOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc2RwL3NkcF9tYWluLmNjIGIvc3RhY2svc2RwL3NkcF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDljMjJjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3NkcC9zZHBfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBTRFAgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gbWVtc2V0Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIFVOVVNFRF9BVFRSCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgRyBMIE8gQiBBIEwgICAgICBTIEQgUCAgICAgICBEIEEgVCBBICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFNEUF9DQiBzZHBfY2I7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgIEwgTyBDIEEgTCAgICBGIFUgTiBDIFQgSSBPIE4gICAgIFAgUiBPIFQgTyBUIFkgUCBFIFMgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNkcF9jb25uZWN0X2luZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgcHNtLCB1aW50OF90IGwyY2FwX2lkKTsKLXN0YXRpYyB2b2lkIHNkcF9jb25maWdfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZyk7Ci1zdGF0aWMgdm9pZCBzZHBfY29uZmlnX2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpOwotc3RhdGljIHZvaWQgc2RwX2Rpc2Nvbm5lY3RfaW5kKHVpbnQxNl90IGwyY2FwX2NpZCwgYm9vbCBhY2tfbmVlZGVkKTsKLXN0YXRpYyB2b2lkIHNkcF9kYXRhX2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIEJUX0hEUiogcF9tc2cpOwotCi1zdGF0aWMgdm9pZCBzZHBfY29ubmVjdF9jZm0odWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCByZXN1bHQpOwotc3RhdGljIHZvaWQgc2RwX2Rpc2Nvbm5lY3RfY2ZtKHVpbnQxNl90IGwyY2FwX2NpZCwgdWludDE2X3QgcmVzdWx0KTsKLXN0YXRpYyB2b2lkIHNkcF9vbl9sMmNhcF9lcnJvcih1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHBfaW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgU0RQIHVuaXQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc2RwX2luaXQodm9pZCkgewotICAvKiBDbGVhcnMgYWxsIHN0cnVjdHVyZXMgYW5kIGxvY2FsIFNEUCBkYXRhYmFzZSAoaWYgU2VydmVyIGlzIGVuYWJsZWQpICovCi0gIG1lbXNldCgmc2RwX2NiLCAwLCBzaXplb2YodFNEUF9DQikpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgU0RQX01BWF9DT05ORUNUSU9OUzsgaSsrKSB7Ci0gICAgc2RwX2NiLmNjYltpXS5zZHBfY29ubl90aW1lciA9IGFsYXJtX25ldygic2RwLnNkcF9jb25uX3RpbWVyIik7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uLiBXZSBvbmx5IGNhcmUgYWJvdXQgTVRVICovCi0gIHNkcF9jYi5sMmNhcF9teV9jZmcubXR1X3ByZXNlbnQgPSB0cnVlOwotICBzZHBfY2IubDJjYXBfbXlfY2ZnLm10dSA9IFNEUF9NVFVfU0laRTsKLQotICBzZHBfY2IubWF4X2F0dHJfbGlzdF9zaXplID0gU0RQX01UVV9TSVpFIC0gMTY7Ci0gIHNkcF9jYi5tYXhfcmVjc19wZXJfc2VhcmNoID0gU0RQX01BWF9ESVNDX1NFUlZFUl9SRUNTOwotCi0gIHNkcF9jYi50cmFjZV9sZXZlbCA9IEJUX1RSQUNFX0xFVkVMX1dBUk5JTkc7Ci0KLSAgc2RwX2NiLnJlZ19pbmZvLnBMMkNBX0Nvbm5lY3RJbmRfQ2IgPSBzZHBfY29ubmVjdF9pbmQ7Ci0gIHNkcF9jYi5yZWdfaW5mby5wTDJDQV9Db25uZWN0Q2ZtX0NiID0gc2RwX2Nvbm5lY3RfY2ZtOwotICBzZHBfY2IucmVnX2luZm8ucEwyQ0FfQ29uZmlnSW5kX0NiID0gc2RwX2NvbmZpZ19pbmQ7Ci0gIHNkcF9jYi5yZWdfaW5mby5wTDJDQV9Db25maWdDZm1fQ2IgPSBzZHBfY29uZmlnX2NmbTsKLSAgc2RwX2NiLnJlZ19pbmZvLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IgPSBzZHBfZGlzY29ubmVjdF9pbmQ7Ci0gIHNkcF9jYi5yZWdfaW5mby5wTDJDQV9EaXNjb25uZWN0Q2ZtX0NiID0gc2RwX2Rpc2Nvbm5lY3RfY2ZtOwotICBzZHBfY2IucmVnX2luZm8ucEwyQ0FfRGF0YUluZF9DYiA9IHNkcF9kYXRhX2luZDsKLSAgc2RwX2NiLnJlZ19pbmZvLnBMMkNBX0Vycm9yX0NiID0gc2RwX29uX2wyY2FwX2Vycm9yOwotCi0gIC8qIE5vdywgcmVnaXN0ZXIgd2l0aCBMMkNBUCAqLwotICBpZiAoIUwyQ0FfUmVnaXN0ZXIyKEJUX1BTTV9TRFAsIHNkcF9jYi5yZWdfaW5mbywgdHJ1ZSAvKiBlbmFibGVfc25vb3AgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgU0RQX01UVV9TSVpFLCAwLCBCVE1fU0VDX05PTkUpKSB7Ci0gICAgU0RQX1RSQUNFX0VSUk9SKCJTRFAgUmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotICB9Ci19Ci0KLXZvaWQgc2RwX2ZyZWUodm9pZCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IFNEUF9NQVhfQ09OTkVDVElPTlM7IGkrKykgewotICAgIGFsYXJtX2ZyZWUoc2RwX2NiLmNjYltpXS5zZHBfY29ubl90aW1lcik7Ci0gICAgc2RwX2NiLmNjYltpXS5zZHBfY29ubl90aW1lciA9IE5VTEw7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9jb25uZWN0X2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFuIGluYm91bmQgY29ubmVjdGlvbiBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gTDJDQVAuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGFjdGluZyBhcyBhCi0gKiAgICAgICAgICAgICAgICAgIHNlcnZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2RwX2Nvbm5lY3RfaW5kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGwyY2FwX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBwc20sIHVpbnQ4X3QgbDJjYXBfaWQpIHsKLSAgdENPTk5fQ0IqIHBfY2NiID0gc2RwdV9hbGxvY2F0ZV9jY2IoKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHJldHVybjsKLQotICAvKiBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFwcHJvcHJpYXRlIHN0YXRlLCB3YWl0aW5nIGZvciBjb25maWcgc2V0dXAuICovCi0gIHBfY2NiLT5jb25fc3RhdGUgPSBTRFBfU1RBVEVfQ0ZHX1NFVFVQOwotCi0gIC8qIFNhdmUgdGhlIEJEIEFkZHJlc3MgYW5kIENoYW5uZWwgSUQuICovCi0gIHBfY2NiLT5kZXZpY2VfYWRkcmVzcyA9IGJkX2FkZHI7Ci0gIHBfY2NiLT5jb25uZWN0aW9uX2lkID0gbDJjYXBfY2lkOwotfQotCi1zdGF0aWMgdm9pZCBzZHBfb25fbDJjYXBfZXJyb3IodWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgdENPTk5fQ0IqIHBfY2NiID0gc2RwdV9maW5kX2NjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfY2NiID09IG51bGxwdHIpIHJldHVybjsKLSAgc2RwX2Rpc2Nvbm5lY3QocF9jY2IsIFNEUF9DRkdfRkFJTEVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9jb25uZWN0X2NmbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb25uZWN0IGNvbmZpcm0gZXZlbnRzCi0gKiAgICAgICAgICAgICAgICAgIGZyb20gTDJDQVAuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB3ZSBhcmUgYWN0aW5nIGFzIGEKLSAqICAgICAgICAgICAgICAgICAgY2xpZW50IGFuZCBoYXZlIHNlbnQgYSBjb25uZWN0IHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNkcF9jb25uZWN0X2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsIHVpbnQxNl90IHJlc3VsdCkgewotICB0Q09OTl9DQiogcF9jY2I7Ci0KLSAgLyogRmluZCBDQ0IgYmFzZWQgb24gQ0lEICovCi0gIHBfY2NiID0gc2RwdV9maW5kX2NjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gUmN2ZCBjb25uIGNuZiBmb3IgdW5rbm93biBDSUQgMHgleCIsIGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogSWYgdGhlIGNvbm5lY3Rpb24gcmVzcG9uc2UgY29udGFpbnMgc3VjY2VzcyBzdGF0dXMsIHRoZW4gKi8KLSAgLyogVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZSBhbmQgc3RhcnR1cCB0aGUgdGltZXIuICAgICAgKi8KLSAgaWYgKChyZXN1bHQgPT0gTDJDQVBfQ09OTl9PSykgJiYgKHBfY2NiLT5jb25fc3RhdGUgPT0gU0RQX1NUQVRFX0NPTk5fU0VUVVApKSB7Ci0gICAgcF9jY2ItPmNvbl9zdGF0ZSA9IFNEUF9TVEFURV9DRkdfU0VUVVA7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBpbnZva2VkIHdpdGggbm9uIE9LIHN0YXR1cyI7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9jb25maWdfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgTDJDQVAgY29uZmlndXJhdGlvbiBpbmRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZHBfY29uZmlnX2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgdENPTk5fQ0IqIHBfY2NiOwotCi0gIC8qIEZpbmQgQ0NCIGJhc2VkIG9uIENJRCAqLwotICBwX2NjYiA9IHNkcHVfZmluZF9jY2JfYnlfY2lkKGwyY2FwX2NpZCk7Ci0gIGlmIChwX2NjYiA9PSBOVUxMKSB7Ci0gICAgU0RQX1RSQUNFX1dBUk5JTkcoIlNEUCAtIFJjdmQgTDJDQVAgY2ZnIGluZCwgdW5rbm93biBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFJlbWVtYmVyIHRoZSByZW1vdGUgTVRVIHNpemUgKi8KLSAgaWYgKCFwX2NmZy0+bXR1X3ByZXNlbnQpIHsKLSAgICAvKiB1c2UgbWluKEwyQ0FQX0RFRkFVTFRfTVRVLFNEUF9NVFVfU0laRSkgZm9yIEdLSSBidWZmZXIgc2l6ZSByZWFzb25zICovCi0gICAgcF9jY2ItPnJlbV9tdHVfc2l6ZSA9Ci0gICAgICAgIChMMkNBUF9ERUZBVUxUX01UVSA+IFNEUF9NVFVfU0laRSkgPyBTRFBfTVRVX1NJWkUgOiBMMkNBUF9ERUZBVUxUX01UVTsKLSAgfSBlbHNlIHsKLSAgICBpZiAocF9jZmctPm10dSA+IFNEUF9NVFVfU0laRSkKLSAgICAgIHBfY2NiLT5yZW1fbXR1X3NpemUgPSBTRFBfTVRVX1NJWkU7Ci0gICAgZWxzZQotICAgICAgcF9jY2ItPnJlbV9tdHVfc2l6ZSA9IHBfY2ZnLT5tdHU7Ci0gIH0KLQotICBTRFBfVFJBQ0VfRVZFTlQoIlNEUCAtIFJjdmQgY2ZnIGluZCwgc2VudCBjZmcgY2ZtLCBDSUQ6IDB4JXgiLCBsMmNhcF9jaWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2NvbmZpZ19jZm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBMMkNBUCBjb25maWd1cmF0aW9uIGNvbmZpcm1hdGlvbgotICogICAgICAgICAgICAgICAgICBldmVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2RwX2NvbmZpZ19jZm0odWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCBpbml0aWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIHNkcF9jb25maWdfaW5kKGwyY2FwX2NpZCwgcF9jZmcpOwotCi0gIHRDT05OX0NCKiBwX2NjYjsKLQotICBTRFBfVFJBQ0VfRVZFTlQoIlNEUCAtIFJjdmQgY2ZnIGNmbSwgQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9jY2IgPSBzZHB1X2ZpbmRfY2NiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgIFNEUF9UUkFDRV9XQVJOSU5HKCJTRFAgLSBSY3ZkIEwyQ0FQIGNmZyBpbmQsIHVua25vd24gQ0lEOiAweCV4IiwgbDJjYXBfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBGb3Igbm93LCBhbHdheXMgYWNjZXB0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgb3RoZXIgc2lkZSAqLwotICBwX2NjYi0+Y29uX3N0YXRlID0gU0RQX1NUQVRFX0NPTk5FQ1RFRDsKLQotICBpZiAocF9jY2ItPmNvbl9mbGFncyAmIFNEUF9GTEFHU19JU19PUklHKSB7Ci0gICAgc2RwX2Rpc2NfY29ubmVjdGVkKHBfY2NiKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBTdGFydCBpbmFjdGl2aXR5IHRpbWVyICovCi0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2NiLT5zZHBfY29ubl90aW1lciwgU0RQX0lOQUNUX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIHNkcF9jb25uX3RpbWVyX3RpbWVvdXQsIHBfY2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2Rpc2Nvbm5lY3RfaW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYSBkaXNjb25uZWN0IGV2ZW50IGZyb20gTDJDQVAuIElmCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCB0bywgd2UgYWNrIHRoZSBkaXNjb25uZWN0IGJlZm9yZSBkcm9wcGluZyB0aGUgQ0NCCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNkcF9kaXNjb25uZWN0X2luZCh1aW50MTZfdCBsMmNhcF9jaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICB0Q09OTl9DQiogcF9jY2I7Ci0KLSAgLyogRmluZCBDQ0IgYmFzZWQgb24gQ0lEICovCi0gIHBfY2NiID0gc2RwdV9maW5kX2NjYl9ieV9jaWQobDJjYXBfY2lkKTsKLSAgaWYgKHBfY2NiID09IE5VTEwpIHsKLSAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gUmN2ZCBMMkNBUCBkaXNjLCB1bmtub3duIENJRDogMHgleCIsIGwyY2FwX2NpZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU0RQX1RSQUNFX0VWRU5UKCJTRFAgLSBSY3ZkIEwyQ0FQIGRpc2MsIENJRDogMHgleCIsIGwyY2FwX2NpZCk7Ci0gIC8qIFRlbGwgdGhlIHVzZXIgaWYgdGhlcmUgaXMgYSBjYWxsYmFjayAqLwotICBpZiAocF9jY2ItPnBfY2IpCi0gICAgKCpwX2NjYi0+cF9jYikoKChwX2NjYi0+Y29uX3N0YXRlID09IFNEUF9TVEFURV9DT05ORUNURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IFNEUF9TVUNDRVNTCi0gICAgICAgICAgICAgICAgICAgICAgICA6IFNEUF9DT05OX0ZBSUxFRCkpOwotICBlbHNlIGlmIChwX2NjYi0+cF9jYjIpCi0gICAgKCpwX2NjYi0+cF9jYjIpKAotICAgICAgICAoKHBfY2NiLT5jb25fc3RhdGUgPT0gU0RQX1NUQVRFX0NPTk5FQ1RFRCkgPyBTRFBfU1VDQ0VTUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTRFBfQ09OTl9GQUlMRUQpLAotICAgICAgICBwX2NjYi0+dXNlcl9kYXRhKTsKLQotICBzZHB1X3JlbGVhc2VfY2NiKHBfY2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9kYXRhX2luZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBkYXRhIGlzIHJlY2VpdmVkIGZyb20gTDJDQVAuCi0gKiAgICAgICAgICAgICAgICAgIGlmIHdlIGFyZSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgY29ubmVjdGlvbiwgd2UgYXJlIHRoZSBTRFAKLSAqICAgICAgICAgICAgICAgICAgY2xpZW50LCBhbmQgdGhlIHJlY2VpdmVkIG1lc3NhZ2UgaXMgcXVldWVkIGZvciB0aGUgY2xpZW50LgotICoKLSAqICAgICAgICAgICAgICAgICAgSWYgd2UgYXJlIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbiwgd2UgYXJlIHRoZSBTRFAKLSAqICAgICAgICAgICAgICAgICAgc2VydmVyLCBzbyB0aGUgbWVzc2FnZSBpcyBwYXNzZWQgdG8gdGhlIHNlcnZlciBwcm9jZXNzaW5nCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZHBfZGF0YV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCBCVF9IRFIqIHBfbXNnKSB7Ci0gIHRDT05OX0NCKiBwX2NjYjsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9jY2IgPSBzZHB1X2ZpbmRfY2NiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9jY2IgIT0gTlVMTCkgewotICAgIGlmIChwX2NjYi0+Y29uX3N0YXRlID09IFNEUF9TVEFURV9DT05ORUNURUQpIHsKLSAgICAgIGlmIChwX2NjYi0+Y29uX2ZsYWdzICYgU0RQX0ZMQUdTX0lTX09SSUcpCi0gICAgICAgIHNkcF9kaXNjX3NlcnZlcl9yc3AocF9jY2IsIHBfbXNnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2RwX3NlcnZlcl9oYW5kbGVfY2xpZW50X3JlcShwX2NjYiwgcF9tc2cpOwotICAgIH0gZWxzZSB7Ci0gICAgICBTRFBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAiU0RQIC0gSWdub3JlZCBMMkNBUCBkYXRhIHdoaWxlIGluIHN0YXRlOiAlZCwgQ0lEOiAweCV4IiwKLSAgICAgICAgICBwX2NjYi0+Y29uX3N0YXRlLCBsMmNhcF9jaWQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBTRFBfVFJBQ0VfV0FSTklORygiU0RQIC0gUmN2ZCBMMkNBUCBkYXRhLCB1bmtub3duIENJRDogMHgleCIsIGwyY2FwX2NpZCk7Ci0gIH0KLQotICBvc2lfZnJlZShwX21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHBfY29ubl9vcmlnaW5hdGUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIEFQSSB0byBvcmlnaW5hdGUgYQotICogICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Q09OTl9DQiogc2RwX2Nvbm5fb3JpZ2luYXRlKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkcikgewotICB0Q09OTl9DQiogcF9jY2I7Ci0gIHVpbnQxNl90IGNpZDsKLQotICAvKiBBbGxvY2F0ZSBhIG5ldyBDQ0IuIFJldHVybiBpZiBub25lIGF2YWlsYWJsZS4gKi8KLSAgcF9jY2IgPSBzZHB1X2FsbG9jYXRlX2NjYigpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgIFNEUF9UUkFDRV9XQVJOSU5HKCIlczogbm8gc3BhcmUgQ0NCIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgcF9iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIChOVUxMKTsKLSAgfQotCi0gIFNEUF9UUkFDRV9FVkVOVCgiJXM6IFNEUCAtIE9yaWdpbmF0ZSBzdGFydGVkIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2JkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAvKiBXZSBhcmUgdGhlIG9yaWdpbmF0b3Igb2YgdGhpcyBjb25uZWN0aW9uICovCi0gIHBfY2NiLT5jb25fZmxhZ3MgfD0gU0RQX0ZMQUdTX0lTX09SSUc7Ci0KLSAgLyogU2F2ZSB0aGUgQkQgQWRkcmVzcyBhbmQgQ2hhbm5lbCBJRC4gKi8KLSAgcF9jY2ItPmRldmljZV9hZGRyZXNzID0gcF9iZF9hZGRyOwotCi0gIC8qIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgYXBwcm9wcmlhdGUgc3RhdGUsIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gY29uZmlybS4KLSAgICovCi0gIHBfY2NiLT5jb25fc3RhdGUgPSBTRFBfU1RBVEVfQ09OTl9TRVRVUDsKLQotICBjaWQgPSBMMkNBX0Nvbm5lY3RSZXEyKEJUX1BTTV9TRFAsIHBfYmRfYWRkciwgQlRNX1NFQ19OT05FKTsKLQotICAvKiBDaGVjayBpZiBMMkNBUCBzdGFydGVkIHRoZSBjb25uZWN0aW9uIHByb2Nlc3MgKi8KLSAgaWYgKGNpZCA9PSAwKSB7Ci0gICAgU0RQX1RSQUNFX1dBUk5JTkcoIiVzOiBTRFAgLSBPcmlnaW5hdGUgZmFpbGVkIGZvciBwZWVyICVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgcF9iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgc2RwdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gICAgcmV0dXJuIChOVUxMKTsKLSAgfQotICBwX2NjYi0+Y29ubmVjdGlvbl9pZCA9IGNpZDsKLSAgcmV0dXJuIChwX2NjYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHBfZGlzY29ubmVjdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBkaXNjb25uZWN0cyBhIGNvbm5lY3Rpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc2RwX2Rpc2Nvbm5lY3QodENPTk5fQ0IqIHBfY2NiLCB0U0RQX1JFQVNPTiByZWFzb24pIHsKLSAgU0RQX1RSQUNFX0VWRU5UKCJTRFAgLSBkaXNjb25uZWN0ICBDSUQ6IDB4JXgiLCBwX2NjYi0+Y29ubmVjdGlvbl9pZCk7Ci0KLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gSUQgKi8KLSAgaWYgKHBfY2NiLT5jb25uZWN0aW9uX2lkICE9IDApIHsKLSAgICBMMkNBX0Rpc2Nvbm5lY3RSZXEocF9jY2ItPmNvbm5lY3Rpb25faWQpOwotICAgIHBfY2NiLT5kaXNjb25uZWN0X3JlYXNvbiA9IHJlYXNvbjsKLSAgfQotCi0gIC8qIElmIGF0IHNldHVwIHN0YXRlLCB3ZSBtYXkgbm90IGdldCBjYWxsYmFjayBpbmQgZnJvbSBMMkNBUCAqLwotICAvKiBDYWxsIHVzZXIgY2FsbGJhY2sgaW1tZWRpYXRlbHkgKi8KLSAgaWYgKHBfY2NiLT5jb25fc3RhdGUgPT0gU0RQX1NUQVRFX0NPTk5fU0VUVVApIHsKLSAgICAvKiBUZWxsIHRoZSB1c2VyIGlmIHRoZXJlIGlzIGEgY2FsbGJhY2sgKi8KLSAgICBpZiAocF9jY2ItPnBfY2IpCi0gICAgICAoKnBfY2NiLT5wX2NiKShyZWFzb24pOwotICAgIGVsc2UgaWYgKHBfY2NiLT5wX2NiMikKLSAgICAgICgqcF9jY2ItPnBfY2IyKShyZWFzb24sIHBfY2NiLT51c2VyX2RhdGEpOwotCi0gICAgc2RwdV9yZWxlYXNlX2NjYihwX2NjYik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9kaXNjb25uZWN0X2NmbQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGEgZGlzY29ubmVjdCBjb25maXJtIGV2ZW50IGZyb20gTDJDQVAuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNkcF9kaXNjb25uZWN0X2NmbSh1aW50MTZfdCBsMmNhcF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgcmVzdWx0KSB7Ci0gIHRDT05OX0NCKiBwX2NjYjsKLQotICAvKiBGaW5kIENDQiBiYXNlZCBvbiBDSUQgKi8KLSAgcF9jY2IgPSBzZHB1X2ZpbmRfY2NiX2J5X2NpZChsMmNhcF9jaWQpOwotICBpZiAocF9jY2IgPT0gTlVMTCkgewotICAgIFNEUF9UUkFDRV9XQVJOSU5HKCJTRFAgLSBSY3ZkIEwyQ0FQIGRpc2MgY2ZtLCB1bmtub3duIENJRDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgbDJjYXBfY2lkKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTRFBfVFJBQ0VfRVZFTlQoIlNEUCAtIFJjdmQgTDJDQVAgZGlzYyBjZm0sIENJRDogMHgleCIsIGwyY2FwX2NpZCk7Ci0KLSAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gIGlmIChwX2NjYi0+cF9jYikKLSAgICAoKnBfY2NiLT5wX2NiKShzdGF0aWNfY2FzdDx0U0RQX1NUQVRVUz4ocF9jY2ItPmRpc2Nvbm5lY3RfcmVhc29uKSk7Ci0gIGVsc2UgaWYgKHBfY2NiLT5wX2NiMikKLSAgICAoKnBfY2NiLT5wX2NiMikoc3RhdGljX2Nhc3Q8dFNEUF9TVEFUVVM+KHBfY2NiLT5kaXNjb25uZWN0X3JlYXNvbiksCi0gICAgICAgICAgICAgICAgICAgIHBfY2NiLT51c2VyX2RhdGEpOwotCi0gIHNkcHVfcmVsZWFzZV9jY2IocF9jY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwX2Nvbm5fdGltZXJfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSB0aW1lb3V0LiBDdXJyZW50bHksIHdlIHNpbXBseSBzZW5kCi0gKiAgICAgICAgICAgICAgICAgIGEgZGlzY29ubmVjdCByZXF1ZXN0IHRvIEwyQ0FQLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNkcF9jb25uX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgewotICB0Q09OTl9DQiogcF9jY2IgPSAodENPTk5fQ0IqKWRhdGE7Ci0KLSAgU0RQX1RSQUNFX0VWRU5UKCJTRFAgLSBDQ0IgdGltZW91dCBpbiBzdGF0ZTogJWQgIENJRDogMHgleCIsIHBfY2NiLT5jb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICBwX2NjYi0+Y29ubmVjdGlvbl9pZCk7Ci0KLSAgTDJDQV9EaXNjb25uZWN0UmVxKHBfY2NiLT5jb25uZWN0aW9uX2lkKTsKLSAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrICovCi0gIGlmIChwX2NjYi0+cF9jYikKLSAgICAoKnBfY2NiLT5wX2NiKShTRFBfQ09OTl9GQUlMRUQpOwotICBlbHNlIGlmIChwX2NjYi0+cF9jYjIpCi0gICAgKCpwX2NjYi0+cF9jYjIpKFNEUF9DT05OX0ZBSUxFRCwgcF9jY2ItPnVzZXJfZGF0YSk7Ci0gIHNkcHVfcmVsZWFzZV9jY2IocF9jY2IpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc2RwL3NkcF9zZXJ2ZXIuY2MgYi9zdGFjay9zZHAvc2RwX3NlcnZlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4NmZiMS4uMDAwMDAwMAotLS0gYS9zdGFjay9zZHAvc2RwX3NlcnZlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDg0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIFNEUCBzZXJ2ZXIgZnVuY3Rpb25zLgotICogIFRoaXMgaXMgbWFpbmx5IGRlYWxpbmcgd2l0aCBjbGllbnQgcmVxdWVzdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gbWVtY3B5Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvaW50ZXJvcC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZyY19kZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9zZHAvc2RwaW50LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVzZXJ2ZSBvdXQgb2YgU0RQIE1UVSBmb3IgcmVzcG9uc2UgZGF0YSAqLwotI2RlZmluZSBTRFBfTUFYX1NFUlZJQ0VfUlNQSERSX0xFTiAxMgotI2RlZmluZSBTRFBfTUFYX1NFUlZBVFRSX1JTUEhEUl9MRU4gMTAKLSNkZWZpbmUgU0RQX01BWF9BVFRSX1JTUEhEUl9MRU4gMTAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgTCBPIEMgQSBMICAgIEYgVSBOIEMgVCBJIE8gTiAgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX3NlYXJjaCh0Q09OTl9DQiogcF9jY2IsIHVpbnQxNl90IHRyYW5zX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGFyYW1fbGVuLCB1aW50OF90KiBwX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXFfZW5kKTsKLQotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX2F0dHJfcmVxKHRDT05OX0NCKiBwX2NjYiwgdWludDE2X3QgdHJhbnNfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBhcmFtX2xlbiwgdWludDhfdCogcF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXFfZW5kKTsKLQotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX3NlYXJjaF9hdHRyX3JlcSh0Q09OTl9DQiogcF9jY2IsIHVpbnQxNl90IHRyYW5zX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGFyYW1fbGVuLCB1aW50OF90KiBwX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXFfZW5kKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgIEUgUiBSIE8gUiAgIFQgRSBYIFQgICBTIFQgUiBJIE4gRyBTICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBubyB0ZXh0IHN0cmluZywgYnV0IHdlIGFsbG93IHRoZSBzdHJpbmdzIHRvIGJlICAgICAgKi8KLS8qIGNvbmZpZ3VyZWQgaW4gdGFyZ2V0LmggaWYgcGVvcGxlIHdhbnQgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBTRFBfVEVYVF9CQURfSEVBREVSCi0jZGVmaW5lIFNEUF9URVhUX0JBRF9IRUFERVIgTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgU0RQX1RFWFRfQkFEX1BEVQotI2RlZmluZSBTRFBfVEVYVF9CQURfUERVIE5VTEwKLSNlbmRpZgotCi0jaWZuZGVmIFNEUF9URVhUX0JBRF9VVUlEX0xJU1QKLSNkZWZpbmUgU0RQX1RFWFRfQkFEX1VVSURfTElTVCBOVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBTRFBfVEVYVF9CQURfSEFORExFCi0jZGVmaW5lIFNEUF9URVhUX0JBRF9IQU5ETEUgTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgU0RQX1RFWFRfQkFEX0FUVFJfTElTVAotI2RlZmluZSBTRFBfVEVYVF9CQURfQVRUUl9MSVNUIE5VTEwKLSNlbmRpZgotCi0jaWZuZGVmIFNEUF9URVhUX0JBRF9DT05UX0xFTgotI2RlZmluZSBTRFBfVEVYVF9CQURfQ09OVF9MRU4gTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgU0RQX1RFWFRfQkFEX0NPTlRfSU5YCi0jZGVmaW5lIFNEUF9URVhUX0JBRF9DT05UX0lOWCBOVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBTRFBfVEVYVF9CQURfTUFYX1JFQ09SRFNfTElTVAotI2RlZmluZSBTRFBfVEVYVF9CQURfTUFYX1JFQ09SRFNfTElTVCBOVUxMCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcF9zZXJ2ZXJfaGFuZGxlX2NsaWVudF9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgaXMgdGhlIG1haW4gZGlzcGF0Y2hlciBvZiB0aGUgU0RQIHNlcnZlci4gSXQgaXMgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIHdoZW4gYW55IGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSBMMkNBUCwgYW5kIGRpc3BhdGNoZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc2RwX3NlcnZlcl9oYW5kbGVfY2xpZW50X3JlcSh0Q09OTl9DQiogcF9jY2IsIEJUX0hEUiogcF9tc2cpIHsKLSAgdWludDhfdCogcF9yZXEgPSAodWludDhfdCopKHBfbXNnICsgMSkgKyBwX21zZy0+b2Zmc2V0OwotICB1aW50OF90KiBwX3JlcV9lbmQgPSBwX3JlcSArIHBfbXNnLT5sZW47Ci0gIHVpbnQ4X3QgcGR1X2lkOwotICB1aW50MTZfdCB0cmFuc19udW0sIHBhcmFtX2xlbjsKLQotICAvKiBTdGFydCBpbmFjdGl2aXR5IHRpbWVyICovCi0gIGFsYXJtX3NldF9vbl9tbG9vcChwX2NjYi0+c2RwX2Nvbm5fdGltZXIsIFNEUF9JTkFDVF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgc2RwX2Nvbm5fdGltZXJfdGltZW91dCwgcF9jY2IpOwotCi0gIGlmIChwX3JlcSArIHNpemVvZihwZHVfaWQpICsgc2l6ZW9mKHRyYW5zX251bSkgPiBwX3JlcV9lbmQpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY5Mzg0MTI0Iik7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNjkzNDI1MzEiKTsKLSAgICB0cmFuc19udW0gPSAwOwotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX1JFUV9TWU5UQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RQX1RFWFRfQkFEX0hFQURFUik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogVGhlIGZpcnN0IGJ5dGUgaW4gdGhlIG1lc3NhZ2UgaXMgdGhlIHBkdSB0eXBlICovCi0gIHBkdV9pZCA9ICpwX3JlcSsrOwotCi0gIC8qIEV4dHJhY3QgdGhlIHRyYW5zYWN0aW9uIG51bWJlciBhbmQgcGFyYW1ldGVyIGxlbmd0aCAqLwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KHRyYW5zX251bSwgcF9yZXEpOwotCi0gIGlmIChwX3JlcSArIHNpemVvZihwYXJhbV9sZW4pID4gcF9yZXFfZW5kKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2OTM4NDEyNCIpOwotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTY5MzQyNTMxIik7Ci0gICAgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IocF9jY2IsIHRyYW5zX251bSwgU0RQX0lOVkFMSURfUkVRX1NZTlRBWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFBfVEVYVF9CQURfSEVBREVSKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCRV9TVFJFQU1fVE9fVUlOVDE2KHBhcmFtX2xlbiwgcF9yZXEpOwotCi0gIGlmICgocF9yZXEgKyBwYXJhbV9sZW4pICE9IHBfcmVxX2VuZCkgewotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX1BEVV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9IRUFERVIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAocGR1X2lkKSB7Ci0gICAgY2FzZSBTRFBfUERVX1NFUlZJQ0VfU0VBUkNIX1JFUToKLSAgICAgIHByb2Nlc3Nfc2VydmljZV9zZWFyY2gocF9jY2IsIHRyYW5zX251bSwgcGFyYW1fbGVuLCBwX3JlcSwgcF9yZXFfZW5kKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTRFBfUERVX1NFUlZJQ0VfQVRUUl9SRVE6Ci0gICAgICBwcm9jZXNzX3NlcnZpY2VfYXR0cl9yZXEocF9jY2IsIHRyYW5zX251bSwgcGFyYW1fbGVuLCBwX3JlcSwgcF9yZXFfZW5kKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTRFBfUERVX1NFUlZJQ0VfU0VBUkNIX0FUVFJfUkVROgotICAgICAgcHJvY2Vzc19zZXJ2aWNlX3NlYXJjaF9hdHRyX3JlcShwX2NjYiwgdHJhbnNfbnVtLCBwYXJhbV9sZW4sIHBfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JlcV9lbmQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IocF9jY2IsIHRyYW5zX251bSwgU0RQX0lOVkFMSURfUkVRX1NZTlRBWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9QRFUpOwotICAgICAgU0RQX1RSQUNFX1dBUk5JTkcoIlNEUCAtIHNlcnZlciBnb3QgdW5rbm93biBQRFU6IDB4JXgiLCBwZHVfaWQpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHByb2Nlc3Nfc2VydmljZV9zZWFyY2gKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIHNlcnZpY2Ugc2VhcmNoIHJlcXVlc3QgZnJvbSB0aGUKLSAqICAgICAgICAgICAgICAgICAgY2xpZW50LiBJdCBidWlsZHMgYSByZXBseSBtZXNzYWdlIHdpdGggaW5mbyBmcm9tIHRoZQotICogICAgICAgICAgICAgICAgICBkYXRhYmFzZSwgYW5kIHNlbmRzIHRoZSByZXBseSBiYWNrIHRvIHRoZSBjbGllbnQuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfc2VydmljZV9zZWFyY2godENPTk5fQ0IqIHBfY2NiLCB1aW50MTZfdCB0cmFuc19udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBhcmFtX2xlbiwgdWludDhfdCogcF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVxX2VuZCkgewotICB1aW50MTZfdCBtYXhfcmVwbGllcywgY3VyX2hhbmRsZXMsIHJlbV9oYW5kbGVzLCBjb250X29mZnNldDsKLSAgdFNEUF9VVUlEX1NFUSB1aWRfc2VxOwotICB1aW50OF90ICpwX3JzcCwgKnBfcnNwX3N0YXJ0LCAqcF9yc3BfcGFyYW1fbGVuOwotICB1aW50MTZfdCByc3BfcGFyYW1fbGVuLCBudW1fcnNwX2hhbmRsZXMsIHh4OwotICB1aW50MzJfdCByc3BfaGFuZGxlc1tTRFBfTUFYX1JFQ09SRFNdID0gezB9OwotICBjb25zdCB0U0RQX1JFQ09SRCogcF9yZWMgPSBOVUxMOwotICBib29sIGlzX2NvbnQgPSBmYWxzZTsKLQotICBwX3JlcSA9IHNkcHVfZXh0cmFjdF91aWRfc2VxKHBfcmVxLCBwYXJhbV9sZW4sICZ1aWRfc2VxKTsKLQotICBpZiAoKCFwX3JlcSkgfHwgKCF1aWRfc2VxLm51bV91aWRzKSkgewotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX1JFUV9TWU5UQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RQX1RFWFRfQkFEX1VVSURfTElTVCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogR2V0IHRoZSBtYXggcmVwbGllcyB3ZSBjYW4gc2VuZC4gQ2FwIGl0IGF0IG91ciBtYXggYW55d2F5cy4gKi8KLSAgaWYgKHBfcmVxICsgc2l6ZW9mKG1heF9yZXBsaWVzKSArIHNpemVvZih1aW50OF90KSA+IHBfcmVxX2VuZCkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjkzODQxMjQiKTsKLSAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfSU5WQUxJRF9SRVFfU1lOVEFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9NQVhfUkVDT1JEU19MSVNUKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihtYXhfcmVwbGllcywgcF9yZXEpOwotCi0gIGlmIChtYXhfcmVwbGllcyA+IFNEUF9NQVhfUkVDT1JEUykgbWF4X3JlcGxpZXMgPSBTRFBfTUFYX1JFQ09SRFM7Ci0KLSAgLyogR2V0IGEgbGlzdCBvZiBoYW5kbGVzIHRoYXQgbWF0Y2ggdGhlIFVVSURzIGdpdmVuIHRvIHVzICovCi0gIGZvciAobnVtX3JzcF9oYW5kbGVzID0gMDsgbnVtX3JzcF9oYW5kbGVzIDwgbWF4X3JlcGxpZXM7KSB7Ci0gICAgcF9yZWMgPSBzZHBfZGJfc2VydmljZV9zZWFyY2gocF9yZWMsICZ1aWRfc2VxKTsKLQotICAgIGlmIChwX3JlYykKLSAgICAgIHJzcF9oYW5kbGVzW251bV9yc3BfaGFuZGxlcysrXSA9IHBfcmVjLT5yZWNvcmRfaGFuZGxlOwotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiByZXF1ZXN0ICovCi0gIGlmICgqcF9yZXEpIHsKLSAgICBpZiAoKnBfcmVxKysgIT0gU0RQX0NPTlRJTlVBVElPTl9MRU4gfHwKLSAgICAgICAgKHBfcmVxICsgc2l6ZW9mKGNvbnRfb2Zmc2V0KSA+IHBfcmVxX2VuZCkpIHsKLSAgICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFBfVEVYVF9CQURfQ09OVF9MRU4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGNvbnRfb2Zmc2V0LCBwX3JlcSk7Ci0KLSAgICBpZiAoY29udF9vZmZzZXQgIT0gcF9jY2ItPmNvbnRfb2Zmc2V0IHx8IG51bV9yc3BfaGFuZGxlcyA8IGNvbnRfb2Zmc2V0KSB7Ci0gICAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfSU5WQUxJRF9DT05UX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RQX1RFWFRfQkFEX0NPTlRfSU5YKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZW1faGFuZGxlcyA9Ci0gICAgICAgIG51bV9yc3BfaGFuZGxlcyAtIGNvbnRfb2Zmc2V0OyAvKiBleHRyYWN0IHRoZSByZW1haW5pbmcgaGFuZGxlcyAqLwotICB9IGVsc2UgewotICAgIHJlbV9oYW5kbGVzID0gbnVtX3JzcF9oYW5kbGVzOwotICAgIGNvbnRfb2Zmc2V0ID0gMDsKLSAgICBwX2NjYi0+Y29udF9vZmZzZXQgPSAwOwotICB9Ci0KLSAgLyogQ2FsY3VsYXRlIGhvdyBtYW55IGhhbmRsZXMgd2lsbCBmaXQgaW4gb25lIFBEVSAqLwotICBjdXJfaGFuZGxlcyA9Ci0gICAgICAodWludDE2X3QpKChwX2NjYi0+cmVtX210dV9zaXplIC0gU0RQX01BWF9TRVJWSUNFX1JTUEhEUl9MRU4pIC8gNCk7Ci0KLSAgaWYgKHJlbV9oYW5kbGVzIDw9IGN1cl9oYW5kbGVzKQotICAgIGN1cl9oYW5kbGVzID0gcmVtX2hhbmRsZXM7Ci0gIGVsc2UgLyogQ29udGludWF0aW9uIGlzIHNldCAqLwotICB7Ci0gICAgcF9jY2ItPmNvbnRfb2Zmc2V0ICs9IGN1cl9oYW5kbGVzOwotICAgIGlzX2NvbnQgPSB0cnVlOwotICB9Ci0KLSAgLyogR2V0IGEgYnVmZmVyIHRvIHVzZSB0byBidWlsZCB0aGUgcmVzcG9uc2UgKi8KLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoU0RQX0RBVEFfQlVGX1NJWkUpOwotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9yc3AgPSBwX3JzcF9zdGFydCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSByc3BvbnNlICovCi0gIFVJTlQ4X1RPX0JFX1NUUkVBTShwX3JzcCwgU0RQX1BEVV9TRVJWSUNFX1NFQVJDSF9SU1ApOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcnNwLCB0cmFuc19udW0pOwotCi0gIC8qIFNraXAgdGhlIGxlbmd0aCwgd2UgbmVlZCB0byBhZGQgaXQgYXQgdGhlIGVuZCAqLwotICBwX3JzcF9wYXJhbV9sZW4gPSBwX3JzcDsKLSAgcF9yc3AgKz0gMjsKLQotICAvKiBQdXQgaW4gdG90YWwgYW5kIGN1cnJlbnQgbnVtYmVyIG9mIGhhbmRsZXMsIGFuZCBoYW5kbGVzIHRoZW1zZWx2ZXMgKi8KLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3JzcCwgbnVtX3JzcF9oYW5kbGVzKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3JzcCwgY3VyX2hhbmRsZXMpOwotCi0gIC8qICBTRFBfVFJBQ0VfREVCVUcoIlNEUCBTZXJ2aWNlIFJzcDogdG90aGRsICVkLCBjdXJoZGxyICVkLCBzdGFydCAlZCwgZW5kICVkLAotICAgICBjb250ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX3JzcF9oYW5kbGVzLCBjdXJfaGFuZGxlcywgY29udF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRfb2Zmc2V0ICsgY3VyX2hhbmRsZXMtMSwgaXNfY29udCk7ICovCi0gIGZvciAoeHggPSBjb250X29mZnNldDsgeHggPCBjb250X29mZnNldCArIGN1cl9oYW5kbGVzOyB4eCsrKQotICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9yc3AsIHJzcF9oYW5kbGVzW3h4XSk7Ci0KLSAgaWYgKGlzX2NvbnQpIHsKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9yc3AsIFNEUF9DT05USU5VQVRJT05fTEVOKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcnNwLCBwX2NjYi0+Y29udF9vZmZzZXQpOwotICB9IGVsc2UKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9yc3AsIDApOwotCi0gIC8qIEdvIGJhY2sgYW5kIHB1dCB0aGUgcGFyYW1ldGVyIGxlbmd0aCBpbnRvIHRoZSBidWZmZXIgKi8KLSAgcnNwX3BhcmFtX2xlbiA9IHBfcnNwIC0gcF9yc3BfcGFyYW1fbGVuIC0gMjsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3JzcF9wYXJhbV9sZW4sIHJzcF9wYXJhbV9sZW4pOwotCi0gIC8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBTRFAgZGF0YSBpbiB0aGUgYnVmZmVyICovCi0gIHBfYnVmLT5sZW4gPSBwX3JzcCAtIHBfcnNwX3N0YXJ0OwotCi0gIC8qIFNlbmQgdGhlIGJ1ZmZlciB0aHJvdWdoIEwyQ0FQICovCi0gIEwyQ0FfRGF0YVdyaXRlKHBfY2NiLT5jb25uZWN0aW9uX2lkLCBwX2J1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBwcm9jZXNzX3NlcnZpY2VfYXR0cl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBhdHRyaWJ1dGUgcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQuCi0gKiAgICAgICAgICAgICAgICAgIEl0IGJ1aWxkcyBhIHJlcGx5IG1lc3NhZ2Ugd2l0aCBpbmZvIGZyb20gdGhlIGRhdGFiYXNlLAotICogICAgICAgICAgICAgICAgICBhbmQgc2VuZHMgdGhlIHJlcGx5IGJhY2sgdG8gdGhlIGNsaWVudC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcHJvY2Vzc19zZXJ2aWNlX2F0dHJfcmVxKHRDT05OX0NCKiBwX2NjYiwgdWludDE2X3QgdHJhbnNfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBhcmFtX2xlbiwgdWludDhfdCogcF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9yZXFfZW5kKSB7Ci0gIHVpbnQxNl90IG1heF9saXN0X2xlbiwgbGVuX3RvX3NlbmQsIGNvbnRfb2Zmc2V0OwotICBpbnQxNl90IHJlbV9sZW47Ci0gIHRTRFBfQVRUUl9TRVEgYXR0cl9zZXEsIGF0dHJfc2VxX3NhdjsKLSAgdWludDhfdCAqcF9yc3AsICpwX3JzcF9zdGFydCwgKnBfcnNwX3BhcmFtX2xlbjsKLSAgdWludDE2X3QgcnNwX3BhcmFtX2xlbiwgeHg7Ci0gIHVpbnQzMl90IHJlY19oYW5kbGU7Ci0gIGNvbnN0IHRTRFBfUkVDT1JEKiBwX3JlYzsKLSAgY29uc3QgdFNEUF9BVFRSSUJVVEUqIHBfYXR0cjsKLSAgYm9vbCBpc19jb250ID0gZmFsc2U7Ci0gIHVpbnQxNl90IGF0dHJfbGVuOwotCi0gIGlmIChwX3JlcSArIHNpemVvZihyZWNfaGFuZGxlKSArIHNpemVvZihtYXhfbGlzdF9sZW4pID4gcF9yZXFfZW5kKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2OTM4NDEyNCIpOwotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX1NFUlZfUkVDX0hETCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFBfVEVYVF9CQURfSEFORExFKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBFeHRyYWN0IHRoZSByZWNvcmQgaGFuZGxlICovCi0gIEJFX1NUUkVBTV9UT19VSU5UMzIocmVjX2hhbmRsZSwgcF9yZXEpOwotICBwYXJhbV9sZW4gLT0gc2l6ZW9mKHJlY19oYW5kbGUpOwotCi0gIC8qIEdldCB0aGUgbWF4IGxpc3QgbGVuZ3RoIHdlIGNhbiBzZW5kLiBDYXAgaXQgYXQgTVRVIHNpemUgbWludXMgb3ZlcmhlYWQgKi8KLSAgQkVfU1RSRUFNX1RPX1VJTlQxNihtYXhfbGlzdF9sZW4sIHBfcmVxKTsKLSAgcGFyYW1fbGVuIC09IHNpemVvZihtYXhfbGlzdF9sZW4pOwotCi0gIGlmIChtYXhfbGlzdF9sZW4gPiAocF9jY2ItPnJlbV9tdHVfc2l6ZSAtIFNEUF9NQVhfQVRUUl9SU1BIRFJfTEVOKSkKLSAgICBtYXhfbGlzdF9sZW4gPSBwX2NjYi0+cmVtX210dV9zaXplIC0gU0RQX01BWF9BVFRSX1JTUEhEUl9MRU47Ci0KLSAgcF9yZXEgPSBzZHB1X2V4dHJhY3RfYXR0cl9zZXEocF9yZXEsIHBhcmFtX2xlbiwgJmF0dHJfc2VxKTsKLQotICBpZiAoKCFwX3JlcSkgfHwgKCFhdHRyX3NlcS5udW1fYXR0cikgfHwKLSAgICAgIChwX3JlcSArIHNpemVvZih1aW50OF90KSA+IHBfcmVxX2VuZCkpIHsKLSAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfSU5WQUxJRF9SRVFfU1lOVEFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9BVFRSX0xJU1QpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1lbWNweSgmYXR0cl9zZXFfc2F2LCAmYXR0cl9zZXEsIHNpemVvZih0U0RQX0FUVFJfU0VRKSk7Ci0KLSAgLyogRmluZCBhIHJlY29yZCB3aXRoIHRoZSByZWNvcmQgaGFuZGxlICovCi0gIHBfcmVjID0gc2RwX2RiX2ZpbmRfcmVjb3JkKHJlY19oYW5kbGUpOwotICBpZiAoIXBfcmVjKSB7Ci0gICAgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IocF9jY2IsIHRyYW5zX251bSwgU0RQX0lOVkFMSURfU0VSVl9SRUNfSERMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9IQU5ETEUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChtYXhfbGlzdF9sZW4gPCA0KSB7Ci0gICAgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IocF9jY2IsIHRyYW5zX251bSwgU0RQX0lMTEVHQUxfUEFSQU1FVEVSLCBOVUxMKTsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY4Nzc2MDU0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogRnJlZSBhbmQgcmVhbGxvY2F0ZSBidWZmZXIgKi8KLSAgb3NpX2ZyZWUocF9jY2ItPnJzcF9saXN0KTsKLSAgcF9jY2ItPnJzcF9saXN0ID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MobWF4X2xpc3RfbGVuKTsKLQotICAvKiBDaGVjayBpZiB0aGlzIGlzIGEgY29udGludWF0aW9uIHJlcXVlc3QgKi8KLSAgaWYgKCpwX3JlcSkgewotICAgIGlmICgqcF9yZXErKyAhPSBTRFBfQ09OVElOVUFUSU9OX0xFTiB8fAotICAgICAgICAocF9yZXEgKyBzaXplb2YoY29udF9vZmZzZXQpID4gcF9yZXFfZW5kKSkgewotICAgICAgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IocF9jY2IsIHRyYW5zX251bSwgU0RQX0lOVkFMSURfQ09OVF9TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9DT05UX0xFTik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEJFX1NUUkVBTV9UT19VSU5UMTYoY29udF9vZmZzZXQsIHBfcmVxKTsKLQotICAgIGlmIChjb250X29mZnNldCAhPSBwX2NjYi0+Y29udF9vZmZzZXQpIHsKLSAgICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFBfVEVYVF9CQURfQ09OVF9JTlgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpc19jb250ID0gdHJ1ZTsKLQotICAgIC8qIEluaXRpYWxpc2UgZm9yIGNvbnRpbnVhdGlvbiByZXNwb25zZSAqLwotICAgIHBfcnNwID0gJnBfY2NiLT5yc3BfbGlzdFswXTsKLSAgICBhdHRyX3NlcS5hdHRyX2VudHJ5W3BfY2NiLT5jb250X2luZm8ubmV4dF9hdHRyX2luZGV4XS5zdGFydCA9Ci0gICAgICAgIHBfY2NiLT5jb250X2luZm8ubmV4dF9hdHRyX3N0YXJ0X2lkOwotICB9IGVsc2UgewotICAgIHBfY2NiLT5jb250X29mZnNldCA9IDA7Ci0gICAgcF9yc3AgPSAmcF9jY2ItPnJzcF9saXN0WzNdOyAvKiBMZWF2ZSBzcGFjZSBmb3IgZGF0YSBlbGVtIGRlc2NyICovCi0KLSAgICAvKiBSZXNldCBjb250aW51YXRpb24gcGFyYW1ldGVycyBpbiBwX2NjYiAqLwotICAgIHBfY2NiLT5jb250X2luZm8ucHJldl9zZHBfcmVjID0gTlVMTDsKLSAgICBwX2NjYi0+Y29udF9pbmZvLm5leHRfYXR0cl9pbmRleCA9IDA7Ci0gICAgcF9jY2ItPmNvbnRfaW5mby5hdHRyX29mZnNldCA9IDA7Ci0gIH0KLQotICAvKiBTZWFyY2ggZm9yIGF0dHJpYnV0ZXMgdGhhdCBtYXRjaCB0aGUgbGlzdCBnaXZlbiB0byB1cyAqLwotICBmb3IgKHh4ID0gcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfaW5kZXg7IHh4IDwgYXR0cl9zZXEubnVtX2F0dHI7IHh4KyspIHsKLSAgICBwX2F0dHIgPSBzZHBfZGJfZmluZF9hdHRyX2luX3JlYyhwX3JlYywgYXR0cl9zZXEuYXR0cl9lbnRyeVt4eF0uc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zZXEuYXR0cl9lbnRyeVt4eF0uZW5kKTsKLQotICAgIGlmIChwX2F0dHIpIHsKLSAgICAgIC8qIENoZWNrIGlmIGF0dHJpYnV0ZSBmaXRzLiBBc3N1bWUgMy1ieXRlIHZhbHVlIHR5cGUvbGVuZ3RoICovCi0gICAgICByZW1fbGVuID0gbWF4X2xpc3RfbGVuIC0gKGludDE2X3QpKHBfcnNwIC0gJnBfY2NiLT5yc3BfbGlzdFswXSk7Ci0KLSAgICAgIC8qIGp1c3QgaW4gY2FzZSAqLwotICAgICAgaWYgKHJlbV9sZW4gPD0gMCkgewotICAgICAgICBwX2NjYi0+Y29udF9pbmZvLm5leHRfYXR0cl9pbmRleCA9IHh4OwotICAgICAgICBwX2NjYi0+Y29udF9pbmZvLm5leHRfYXR0cl9zdGFydF9pZCA9IHBfYXR0ci0+aWQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBhdHRyX2xlbiA9IHNkcHVfZ2V0X2F0dHJpYl9lbnRyeV9sZW4ocF9hdHRyKTsKLSAgICAgIC8qIGlmIHRoZXJlIGlzIGEgcGFydGlhbCBhdHRyaWJ1dGUgcGVuZGluZyB0byBiZSBzZW50ICovCi0gICAgICBpZiAocF9jY2ItPmNvbnRfaW5mby5hdHRyX29mZnNldCkgewotICAgICAgICBpZiAoYXR0cl9sZW4gPCBwX2NjYi0+Y29udF9pbmZvLmF0dHJfb2Zmc2V0KSB7Ci0gICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3OTIxNzc3MCIpOwotICAgICAgICAgIExPRyhFUlJPUikgPDwgIm9mZnNldCBpcyBiaWdnZXIgdGhhbiBhdHRyaWJ1dGUgbGVuZ3RoIjsKLSAgICAgICAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfSU5WQUxJRF9DT05UX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9DT05UX0xFTik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBfcnNwID0gc2RwdV9idWlsZF9wYXJ0aWFsX2F0dHJpYl9lbnRyeShwX3JzcCwgcF9hdHRyLCByZW1fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfY2NiLT5jb250X2luZm8uYXR0cl9vZmZzZXQpOwotCi0gICAgICAgIC8qIElmIHRoZSBwYXJ0aWFsIGF0dHJpYiBjb3VsZCBub3QgYmVlbiBmdWxseSBhZGRlZCB5ZXQgKi8KLSAgICAgICAgaWYgKHBfY2NiLT5jb250X2luZm8uYXR0cl9vZmZzZXQgIT0gYXR0cl9sZW4pCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVsc2UgLyogSWYgdGhlIHBhcnRpYWwgYXR0cmliIGhhcyBiZWVuIGFkZGVkIGluIGZ1bGwgYnkgbm93ICovCi0gICAgICAgICAgcF9jY2ItPmNvbnRfaW5mby5hdHRyX29mZnNldCA9IDA7IC8qIHJlc2V0IGF0dHJfb2Zmc2V0ICovCi0gICAgICB9IGVsc2UgaWYgKHJlbV9sZW4gPAotICAgICAgICAgICAgICAgICBhdHRyX2xlbikgLyogTm90IGVub3VnaCBzcGFjZSBmb3IgYXR0ci4uLiBzbyBhZGQgcGFydGlhbGx5ICovCi0gICAgICB7Ci0gICAgICAgIGlmIChhdHRyX2xlbiA+PSBTRFBfTUFYX0FUVFJfTEVOKSB7Ci0gICAgICAgICAgU0RQX1RSQUNFX0VSUk9SKCJTRFAgYXR0ciB0b28gYmlnOiBtYXhfbGlzdF9sZW49JWQsYXR0cl9sZW49JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGlzdF9sZW4sIGF0dHJfbGVuKTsKLSAgICAgICAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfTk9fUkVTT1VSQ0VTLCBOVUxMKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhZGQgdGhlIHBhcnRpYWwgYXR0cmlidXRlIGlmIHBvc3NpYmxlICovCi0gICAgICAgIHBfcnNwID0gc2RwdV9idWlsZF9wYXJ0aWFsX2F0dHJpYl9lbnRyeSgKLSAgICAgICAgICAgIHBfcnNwLCBwX2F0dHIsICh1aW50MTZfdClyZW1fbGVuLCAmcF9jY2ItPmNvbnRfaW5mby5hdHRyX29mZnNldCk7Ci0KLSAgICAgICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfaW5kZXggPSB4eDsKLSAgICAgICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfc3RhcnRfaWQgPSBwX2F0dHItPmlkOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSAvKiBidWlsZCB0aGUgd2hvbGUgYXR0cmlidXRlICovCi0gICAgICAgIHBfcnNwID0gc2RwdV9idWlsZF9hdHRyaWJfZW50cnkocF9yc3AsIHBfYXR0cik7Ci0KLSAgICAgIC8qIElmIGRvaW5nIGEgcmFuZ2UsIHN0aWNrIHdpdGggdGhpcyBvbmUgdGlsbCBubyBtb3JlIGF0dHJpYnV0ZXMgZm91bmQgKi8KLSAgICAgIGlmIChhdHRyX3NlcS5hdHRyX2VudHJ5W3h4XS5zdGFydCAhPSBhdHRyX3NlcS5hdHRyX2VudHJ5W3h4XS5lbmQpIHsKLSAgICAgICAgLyogVXBkYXRlIGZvciBuZXh0IHRpbWUgdGhyb3VnaCAqLwotICAgICAgICBhdHRyX3NlcS5hdHRyX2VudHJ5W3h4XS5zdGFydCA9IHBfYXR0ci0+aWQgKyAxOwotCi0gICAgICAgIHh4LS07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qIElmIGFsbCB0aGUgYXR0cmlidXRlcyBoYXZlIGJlZW4gYWNjb21vZGF0ZWQgaW4gcF9yc3AsCi0gICAgIHJlc2V0IG5leHRfYXR0cl9pbmRleCAqLwotICBpZiAoeHggPT0gYXR0cl9zZXEubnVtX2F0dHIpIHBfY2NiLT5jb250X2luZm8ubmV4dF9hdHRyX2luZGV4ID0gMDsKLQotICBsZW5fdG9fc2VuZCA9ICh1aW50MTZfdCkocF9yc3AgLSAmcF9jY2ItPnJzcF9saXN0WzBdKTsKLSAgY29udF9vZmZzZXQgPSAwOwotCi0gIGlmICghaXNfY29udCkgewotICAgIHBfY2NiLT5saXN0X2xlbiA9IHNkcHVfZ2V0X2F0dHJpYl9zZXFfbGVuKHBfcmVjLCAmYXR0cl9zZXFfc2F2KSArIDM7Ci0gICAgLyogUHV0IGluIHRoZSBzZXF1ZW5jZSBoZWFkZXIgKDIgb3IgMyBieXRlcykgKi8KLSAgICBpZiAocF9jY2ItPmxpc3RfbGVuID4gMjU1KSB7Ci0gICAgICBwX2NjYi0+cnNwX2xpc3RbMF0gPQotICAgICAgICAgICh1aW50OF90KSgoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9XT1JEKTsKLSAgICAgIHBfY2NiLT5yc3BfbGlzdFsxXSA9ICh1aW50OF90KSgocF9jY2ItPmxpc3RfbGVuIC0gMykgPj4gOCk7Ci0gICAgICBwX2NjYi0+cnNwX2xpc3RbMl0gPSAodWludDhfdCkocF9jY2ItPmxpc3RfbGVuIC0gMyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnRfb2Zmc2V0ID0gMTsKLQotICAgICAgcF9jY2ItPnJzcF9saXN0WzFdID0KLSAgICAgICAgICAodWludDhfdCkoKERBVEFfRUxFX1NFUV9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX0lOX05FWFRfQllURSk7Ci0gICAgICBwX2NjYi0+cnNwX2xpc3RbMl0gPSAodWludDhfdCkocF9jY2ItPmxpc3RfbGVuIC0gMyk7Ci0KLSAgICAgIHBfY2NiLT5saXN0X2xlbi0tOwotICAgICAgbGVuX3RvX3NlbmQtLTsKLSAgICB9Ci0gIH0KLQotICAvKiBHZXQgYSBidWZmZXIgdG8gdXNlIHRvIGJ1aWxkIHRoZSByZXNwb25zZSAqLwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhTRFBfREFUQV9CVUZfU0laRSk7Ci0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX3JzcCA9IHBfcnNwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIHJzcG9uc2UgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfcnNwLCBTRFBfUERVX1NFUlZJQ0VfQVRUUl9SU1ApOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcnNwLCB0cmFuc19udW0pOwotCi0gIC8qIFNraXAgdGhlIHBhcmFtZXRlciBsZW5ndGgsIGFkZCBpdCB3aGVuIHdlIGtub3cgdGhlIGxlbmd0aCAqLwotICBwX3JzcF9wYXJhbV9sZW4gPSBwX3JzcDsKLSAgcF9yc3AgKz0gMjsKLQotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcnNwLCBsZW5fdG9fc2VuZCk7Ci0KLSAgbWVtY3B5KHBfcnNwLCAmcF9jY2ItPnJzcF9saXN0W2NvbnRfb2Zmc2V0XSwgbGVuX3RvX3NlbmQpOwotICBwX3JzcCArPSBsZW5fdG9fc2VuZDsKLQotICBwX2NjYi0+Y29udF9vZmZzZXQgKz0gbGVuX3RvX3NlbmQ7Ci0KLSAgLyogSWYgYW55dGhpbmcgbGVmdCB0byBzZW5kLCBjb250aW51YXRpb24gbmVlZGVkICovCi0gIGlmIChwX2NjYi0+Y29udF9vZmZzZXQgPCBwX2NjYi0+bGlzdF9sZW4pIHsKLSAgICBpc19jb250ID0gdHJ1ZTsKLQotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX3JzcCwgU0RQX0NPTlRJTlVBVElPTl9MRU4pOwotICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9yc3AsIHBfY2NiLT5jb250X29mZnNldCk7Ci0gIH0gZWxzZQotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX3JzcCwgMCk7Ci0KLSAgLyogR28gYmFjayBhbmQgcHV0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGludG8gdGhlIGJ1ZmZlciAqLwotICByc3BfcGFyYW1fbGVuID0gcF9yc3AgLSBwX3JzcF9wYXJhbV9sZW4gLSAyOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcnNwX3BhcmFtX2xlbiwgcnNwX3BhcmFtX2xlbik7Ci0KLSAgLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIFNEUCBkYXRhIGluIHRoZSBidWZmZXIgKi8KLSAgcF9idWYtPmxlbiA9IHBfcnNwIC0gcF9yc3Bfc3RhcnQ7Ci0KLSAgLyogU2VuZCB0aGUgYnVmZmVyIHRocm91Z2ggTDJDQVAgKi8KLSAgTDJDQV9EYXRhV3JpdGUocF9jY2ItPmNvbm5lY3Rpb25faWQsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHByb2Nlc3Nfc2VydmljZV9zZWFyY2hfYXR0cl9yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGNvbWJpbmVkIHNlcnZpY2Ugc2VhcmNoIGFuZAotICogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgcmVhZCByZXF1ZXN0IGZyb20gdGhlIGNsaWVudC4gSXQgYnVpbGRzIGEgcmVwbHkKLSAqICAgICAgICAgICAgICAgICAgbWVzc2FnZSB3aXRoIGluZm8gZnJvbSB0aGUgZGF0YWJhc2UsIGFuZCBzZW5kcyB0aGUgcmVwbHkKLSAqICAgICAgICAgICAgICAgICAgYmFjayB0byB0aGUgY2xpZW50LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NlcnZpY2Vfc2VhcmNoX2F0dHJfcmVxKHRDT05OX0NCKiBwX2NjYiwgdWludDE2X3QgdHJhbnNfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYXJhbV9sZW4sIHVpbnQ4X3QqIHBfcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3JlcV9lbmQpIHsKLSAgdWludDE2X3QgbWF4X2xpc3RfbGVuOwotICBpbnQxNl90IHJlbV9sZW47Ci0gIHVpbnQxNl90IGxlbl90b19zZW5kLCBjb250X29mZnNldDsKLSAgdFNEUF9VVUlEX1NFUSB1aWRfc2VxOwotICB1aW50OF90ICpwX3JzcCwgKnBfcnNwX3N0YXJ0LCAqcF9yc3BfcGFyYW1fbGVuOwotICB1aW50MTZfdCByc3BfcGFyYW1fbGVuLCB4eDsKLSAgY29uc3QgdFNEUF9SRUNPUkQqIHBfcmVjOwotICB0U0RQX0FUVFJfU0VRIGF0dHJfc2VxLCBhdHRyX3NlcV9zYXY7Ci0gIGNvbnN0IHRTRFBfQVRUUklCVVRFKiBwX2F0dHI7Ci0gIHRTRFBfQVRUUklCVVRFIGF0dHJfc2F2OwotICBib29sIG1heHhlZF9vdXQgPSBmYWxzZSwgaXNfY29udCA9IGZhbHNlOwotICB1aW50OF90KiBwX3NlcV9zdGFydDsKLSAgdWludDE2X3Qgc2VxX2xlbiwgYXR0cl9sZW47Ci0KLSAgLyogRXh0cmFjdCB0aGUgVVVJRCBzZXF1ZW5jZSB0byBzZWFyY2ggZm9yICovCi0gIHBfcmVxID0gc2RwdV9leHRyYWN0X3VpZF9zZXEocF9yZXEsIHBhcmFtX2xlbiwgJnVpZF9zZXEpOwotCi0gIGlmICgoIXBfcmVxKSB8fCAoIXVpZF9zZXEubnVtX3VpZHMpIHx8Ci0gICAgICAocF9yZXEgKyBzaXplb2YodWludDE2X3QpID4gcF9yZXFfZW5kKSkgewotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX1JFUV9TWU5UQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RQX1RFWFRfQkFEX1VVSURfTElTVCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogR2V0IHRoZSBtYXggbGlzdCBsZW5ndGggd2UgY2FuIHNlbmQuIENhcCBpdCBhdCBvdXIgbWF4IGxpc3QgbGVuZ3RoLiAqLwotICBCRV9TVFJFQU1fVE9fVUlOVDE2KG1heF9saXN0X2xlbiwgcF9yZXEpOwotCi0gIGlmIChtYXhfbGlzdF9sZW4gPiAocF9jY2ItPnJlbV9tdHVfc2l6ZSAtIFNEUF9NQVhfU0VSVkFUVFJfUlNQSERSX0xFTikpCi0gICAgbWF4X2xpc3RfbGVuID0gcF9jY2ItPnJlbV9tdHVfc2l6ZSAtIFNEUF9NQVhfU0VSVkFUVFJfUlNQSERSX0xFTjsKLQotICBwYXJhbV9sZW4gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4ocF9yZXFfZW5kIC0gcF9yZXEpOwotICBwX3JlcSA9IHNkcHVfZXh0cmFjdF9hdHRyX3NlcShwX3JlcSwgcGFyYW1fbGVuLCAmYXR0cl9zZXEpOwotCi0gIGlmICgoIXBfcmVxKSB8fCAoIWF0dHJfc2VxLm51bV9hdHRyKSB8fAotICAgICAgKHBfcmVxICsgc2l6ZW9mKHVpbnQ4X3QpID4gcF9yZXFfZW5kKSkgewotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX1JFUV9TWU5UQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RQX1RFWFRfQkFEX0FUVFJfTElTVCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbWVtY3B5KCZhdHRyX3NlcV9zYXYsICZhdHRyX3NlcSwgc2l6ZW9mKHRTRFBfQVRUUl9TRVEpKTsKLQotICBpZiAobWF4X2xpc3RfbGVuIDwgNCkgewotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTExFR0FMX1BBUkFNRVRFUiwgTlVMTCk7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2ODgxNzk2NiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEZyZWUgYW5kIHJlYWxsb2NhdGUgYnVmZmVyICovCi0gIG9zaV9mcmVlKHBfY2NiLT5yc3BfbGlzdCk7Ci0gIHBfY2NiLT5yc3BfbGlzdCA9ICh1aW50OF90Kilvc2lfbWFsbG9jKG1heF9saXN0X2xlbik7Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiByZXF1ZXN0ICovCi0gIGlmICgqcF9yZXEpIHsKLSAgICBpZiAoKnBfcmVxKysgIT0gU0RQX0NPTlRJTlVBVElPTl9MRU4gfHwKLSAgICAgICAgKHBfcmVxICsgc2l6ZW9mKHVpbnQxNl90KSA+IHBfcmVxX2VuZCkpIHsKLSAgICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFBfVEVYVF9CQURfQ09OVF9MRU4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGNvbnRfb2Zmc2V0LCBwX3JlcSk7Ci0KLSAgICBpZiAoY29udF9vZmZzZXQgIT0gcF9jY2ItPmNvbnRfb2Zmc2V0KSB7Ci0gICAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfSU5WQUxJRF9DT05UX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RQX1RFWFRfQkFEX0NPTlRfSU5YKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaXNfY29udCA9IHRydWU7Ci0KLSAgICAvKiBJbml0aWFsaXNlIGZvciBjb250aW51YXRpb24gcmVzcG9uc2UgKi8KLSAgICBwX3JzcCA9ICZwX2NjYi0+cnNwX2xpc3RbMF07Ci0gICAgYXR0cl9zZXEuYXR0cl9lbnRyeVtwX2NjYi0+Y29udF9pbmZvLm5leHRfYXR0cl9pbmRleF0uc3RhcnQgPQotICAgICAgICBwX2NjYi0+Y29udF9pbmZvLm5leHRfYXR0cl9zdGFydF9pZDsKLSAgfSBlbHNlIHsKLSAgICBwX2NjYi0+Y29udF9vZmZzZXQgPSAwOwotICAgIHBfcnNwID0gJnBfY2NiLT5yc3BfbGlzdFszXTsgLyogTGVhdmUgc3BhY2UgZm9yIGRhdGEgZWxlbSBkZXNjciAqLwotCi0gICAgLyogUmVzZXQgY29udGludWF0aW9uIHBhcmFtZXRlcnMgaW4gcF9jY2IgKi8KLSAgICBwX2NjYi0+Y29udF9pbmZvLnByZXZfc2RwX3JlYyA9IE5VTEw7Ci0gICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfaW5kZXggPSAwOwotICAgIHBfY2NiLT5jb250X2luZm8ubGFzdF9hdHRyX3NlcV9kZXNjX3NlbnQgPSBmYWxzZTsKLSAgICBwX2NjYi0+Y29udF9pbmZvLmF0dHJfb2Zmc2V0ID0gMDsKLSAgfQotCi0gIC8qIEdldCBhIGxpc3Qgb2YgaGFuZGxlcyB0aGF0IG1hdGNoIHRoZSBVVUlEcyBnaXZlbiB0byB1cyAqLwotICBmb3IgKHBfcmVjID0gc2RwX2RiX3NlcnZpY2Vfc2VhcmNoKHBfY2NiLT5jb250X2luZm8ucHJldl9zZHBfcmVjLCAmdWlkX3NlcSk7Ci0gICAgICAgcF9yZWM7IHBfcmVjID0gc2RwX2RiX3NlcnZpY2Vfc2VhcmNoKHBfcmVjLCAmdWlkX3NlcSkpIHsKLSAgICAvKiBBbGxvdyBzcGFjZSBmb3IgYXR0cmlidXRlIHNlcXVlbmNlIHR5cGUgYW5kIGxlbmd0aCAqLwotICAgIHBfc2VxX3N0YXJ0ID0gcF9yc3A7Ci0gICAgaWYgKCFwX2NjYi0+Y29udF9pbmZvLmxhc3RfYXR0cl9zZXFfZGVzY19zZW50KSB7Ci0gICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gaW5jbHVkZSBhIG5ldyBzZXJ2aWNlIGluIHRoZSBjdXJyZW50Ci0gICAgICAgKiByZXNwb25zZSAqLwotICAgICAgcmVtX2xlbiA9IG1heF9saXN0X2xlbiAtIChpbnQxNl90KShwX3JzcCAtICZwX2NjYi0+cnNwX2xpc3RbMF0pOwotICAgICAgaWYgKHJlbV9sZW4gPCAzKSB7Ci0gICAgICAgIC8qIE5vdCBlbm91Z2ggcm9vbS4gVXBkYXRlIGNvbnRpbnVhdGlvbiBpbmZvIGZvciBuZXh0IHJlc3BvbnNlICovCi0gICAgICAgIHBfY2NiLT5jb250X2luZm8ubmV4dF9hdHRyX2luZGV4ID0gMDsKLSAgICAgICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfc3RhcnRfaWQgPSBhdHRyX3NlcS5hdHRyX2VudHJ5WzBdLnN0YXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHBfcnNwICs9IDM7Ci0gICAgfQotCi0gICAgLyogR2V0IGEgbGlzdCBvZiBoYW5kbGVzIHRoYXQgbWF0Y2ggdGhlIFVVSURzIGdpdmVuIHRvIHVzICovCi0gICAgZm9yICh4eCA9IHBfY2NiLT5jb250X2luZm8ubmV4dF9hdHRyX2luZGV4OyB4eCA8IGF0dHJfc2VxLm51bV9hdHRyOyB4eCsrKSB7Ci0gICAgICBwX2F0dHIgPSBzZHBfZGJfZmluZF9hdHRyX2luX3JlYyhwX3JlYywgYXR0cl9zZXEuYXR0cl9lbnRyeVt4eF0uc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3NlcS5hdHRyX2VudHJ5W3h4XS5lbmQpOwotCi0gICAgICBpZiAocF9hdHRyKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgY29udGFpbiBBVlJDUCBwcm9maWxlIGRlc2NyaXB0aW9uIGxpc3QKLSAgICAgICAgdWludDE2X3QgYXZyY3BfdmVyc2lvbiA9IHNkcHVfaXNfYXZyY3BfcHJvZmlsZV9kZXNjcmlwdGlvbl9saXN0KHBfYXR0cik7Ci0gICAgICAgIGlmIChhdnJjcF92ZXJzaW9uID4gQVZSQ19SRVZfMV80ICYmCi0gICAgICAgICAgICBpbnRlcm9wX21hdGNoX2FkZHIoSU5URVJPUF9BVlJDUF8xXzRfT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBfY2NiLT5kZXZpY2VfYWRkcmVzcykpKSB7Ci0gICAgICAgICAgU0RQX1RSQUNFX0RFQlVHKAotICAgICAgICAgICAgICAiJXMsIGRldmljZT0lcyBpcyBvbmx5IGFjY2VwdCBBVlJDUCAxLjQsIHJlcGx5IEFWUkNQIDEuNCAiCi0gICAgICAgICAgICAgICJpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBwX2NjYi0+ZGV2aWNlX2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICBtZW1jcHkoJmF0dHJfc2F2LCBwX2F0dHIsIHNpemVvZih0U0RQX0FUVFJJQlVURSkpOwotICAgICAgICAgIGF0dHJfc2F2LnZhbHVlX3B0clthdHRyX3Nhdi5sZW4gLSAxXSA9IDB4MDQ7Ci0gICAgICAgICAgcF9hdHRyID0gJmF0dHJfc2F2OwotICAgICAgICB9Ci0gICAgICAgIC8qIENoZWNrIGlmIGF0dHJpYnV0ZSBmaXRzLiBBc3N1bWUgMy1ieXRlIHZhbHVlIHR5cGUvbGVuZ3RoICovCi0gICAgICAgIHJlbV9sZW4gPSBtYXhfbGlzdF9sZW4gLSAoaW50MTZfdCkocF9yc3AgLSAmcF9jY2ItPnJzcF9saXN0WzBdKTsKLQotICAgICAgICAvKiBqdXN0IGluIGNhc2UgKi8KLSAgICAgICAgaWYgKHJlbV9sZW4gPD0gMCkgewotICAgICAgICAgIHBfY2NiLT5jb250X2luZm8ubmV4dF9hdHRyX2luZGV4ID0geHg7Ci0gICAgICAgICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfc3RhcnRfaWQgPSBwX2F0dHItPmlkOwotICAgICAgICAgIG1heHhlZF9vdXQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXR0cl9sZW4gPSBzZHB1X2dldF9hdHRyaWJfZW50cnlfbGVuKHBfYXR0cik7Ci0gICAgICAgIC8qIGlmIHRoZXJlIGlzIGEgcGFydGlhbCBhdHRyaWJ1dGUgcGVuZGluZyB0byBiZSBzZW50ICovCi0gICAgICAgIGlmIChwX2NjYi0+Y29udF9pbmZvLmF0dHJfb2Zmc2V0KSB7Ci0gICAgICAgICAgaWYgKGF0dHJfbGVuIDwgcF9jY2ItPmNvbnRfaW5mby5hdHRyX29mZnNldCkgewotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3OTIxNzc3MCIpOwotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAib2Zmc2V0IGlzIGJpZ2dlciB0aGFuIGF0dHJpYnV0ZSBsZW5ndGgiOwotICAgICAgICAgICAgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IocF9jY2IsIHRyYW5zX251bSwgU0RQX0lOVkFMSURfQ09OVF9TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEUF9URVhUX0JBRF9DT05UX0xFTik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIHBfcnNwID0gc2RwdV9idWlsZF9wYXJ0aWFsX2F0dHJpYl9lbnRyeSgKLSAgICAgICAgICAgICAgcF9yc3AsIHBfYXR0ciwgcmVtX2xlbiwgJnBfY2NiLT5jb250X2luZm8uYXR0cl9vZmZzZXQpOwotCi0gICAgICAgICAgLyogSWYgdGhlIHBhcnRpYWwgYXR0cmliIGNvdWxkIG5vdCBiZWVuIGZ1bGx5IGFkZGVkIHlldCAqLwotICAgICAgICAgIGlmIChwX2NjYi0+Y29udF9pbmZvLmF0dHJfb2Zmc2V0ICE9IGF0dHJfbGVuKSB7Ci0gICAgICAgICAgICBtYXh4ZWRfb3V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gZWxzZSAvKiBJZiB0aGUgcGFydGlhbCBhdHRyaWIgaGFzIGJlZW4gYWRkZWQgaW4gZnVsbCBieSBub3cgKi8KLSAgICAgICAgICAgIHBfY2NiLT5jb250X2luZm8uYXR0cl9vZmZzZXQgPSAwOyAvKiByZXNldCBhdHRyX29mZnNldCAqLwotICAgICAgICB9IGVsc2UgaWYgKHJlbV9sZW4gPAotICAgICAgICAgICAgICAgICAgIGF0dHJfbGVuKSAvKiBOb3QgZW5vdWdoIHNwYWNlIGZvciBhdHRyLi4uIHNvIGFkZCBwYXJ0aWFsbHkgKi8KLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyX2xlbiA+PSBTRFBfTUFYX0FUVFJfTEVOKSB7Ci0gICAgICAgICAgICBTRFBfVFJBQ0VfRVJST1IoIlNEUCBhdHRyIHRvbyBiaWc6IG1heF9saXN0X2xlbj0lZCxhdHRyX2xlbj0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xpc3RfbGVuLCBhdHRyX2xlbik7Ci0gICAgICAgICAgICBzZHB1X2J1aWxkX25fc2VuZF9lcnJvcihwX2NjYiwgdHJhbnNfbnVtLCBTRFBfTk9fUkVTT1VSQ0VTLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBhZGQgdGhlIHBhcnRpYWwgYXR0cmlidXRlIGlmIHBvc3NpYmxlICovCi0gICAgICAgICAgcF9yc3AgPSBzZHB1X2J1aWxkX3BhcnRpYWxfYXR0cmliX2VudHJ5KAotICAgICAgICAgICAgICBwX3JzcCwgcF9hdHRyLCAodWludDE2X3QpcmVtX2xlbiwgJnBfY2NiLT5jb250X2luZm8uYXR0cl9vZmZzZXQpOwotCi0gICAgICAgICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfaW5kZXggPSB4eDsKLSAgICAgICAgICBwX2NjYi0+Y29udF9pbmZvLm5leHRfYXR0cl9zdGFydF9pZCA9IHBfYXR0ci0+aWQ7Ci0gICAgICAgICAgbWF4eGVkX291dCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSAvKiBidWlsZCB0aGUgd2hvbGUgYXR0cmlidXRlICovCi0gICAgICAgICAgcF9yc3AgPSBzZHB1X2J1aWxkX2F0dHJpYl9lbnRyeShwX3JzcCwgcF9hdHRyKTsKLQotICAgICAgICAvKiBJZiBkb2luZyBhIHJhbmdlLCBzdGljayB3aXRoIHRoaXMgb25lIHRpbGwgbm8gbW9yZSBhdHRyaWJ1dGVzIGZvdW5kCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYXR0cl9zZXEuYXR0cl9lbnRyeVt4eF0uc3RhcnQgIT0gYXR0cl9zZXEuYXR0cl9lbnRyeVt4eF0uZW5kKSB7Ci0gICAgICAgICAgLyogVXBkYXRlIGZvciBuZXh0IHRpbWUgdGhyb3VnaCAqLwotICAgICAgICAgIGF0dHJfc2VxLmF0dHJfZW50cnlbeHhdLnN0YXJ0ID0gcF9hdHRyLT5pZCArIDE7Ci0KLSAgICAgICAgICB4eC0tOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogR28gYmFjayBhbmQgcHV0IHRoZSB0eXBlIGFuZCBsZW5ndGggaW50byB0aGUgYnVmZmVyICovCi0gICAgaWYgKCFwX2NjYi0+Y29udF9pbmZvLmxhc3RfYXR0cl9zZXFfZGVzY19zZW50KSB7Ci0gICAgICBzZXFfbGVuID0gc2RwdV9nZXRfYXR0cmliX3NlcV9sZW4ocF9yZWMsICZhdHRyX3NlcV9zYXYpOwotICAgICAgaWYgKHNlcV9sZW4gIT0gMCkgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9zZXFfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9XT1JEKTsKLSAgICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3NlcV9zdGFydCwgc2VxX2xlbik7Ci0KLSAgICAgICAgaWYgKG1heHhlZF9vdXQpIHBfY2NiLT5jb250X2luZm8ubGFzdF9hdHRyX3NlcV9kZXNjX3NlbnQgPSB0cnVlOwotICAgICAgfSBlbHNlCi0gICAgICAgIHBfcnNwID0gcF9zZXFfc3RhcnQ7Ci0gICAgfQotCi0gICAgaWYgKG1heHhlZF9vdXQpIGJyZWFrOwotCi0gICAgLyogUmVzdG9yZSB0aGUgYXR0cl9zZXEgdG8gbG9vayBmb3IgaW4gdGhlIG5leHQgc2RwIHJlY29yZCAqLwotICAgIG1lbWNweSgmYXR0cl9zZXEsICZhdHRyX3NlcV9zYXYsIHNpemVvZih0U0RQX0FUVFJfU0VRKSk7Ci0KLSAgICAvKiBSZXNldCB0aGUgbmV4dCBhdHRyIGluZGV4ICovCi0gICAgcF9jY2ItPmNvbnRfaW5mby5uZXh0X2F0dHJfaW5kZXggPSAwOwotICAgIHBfY2NiLT5jb250X2luZm8ucHJldl9zZHBfcmVjID0gcF9yZWM7Ci0gICAgcF9jY2ItPmNvbnRfaW5mby5sYXN0X2F0dHJfc2VxX2Rlc2Nfc2VudCA9IGZhbHNlOwotICB9Ci0KLSAgLyogcmVzcG9uc2UgbGVuZ3RoICovCi0gIGxlbl90b19zZW5kID0gKHVpbnQxNl90KShwX3JzcCAtICZwX2NjYi0+cnNwX2xpc3RbMF0pOwotICBjb250X29mZnNldCA9IDA7Ci0KLSAgLy8gVGhlIGN1cnJlbnQgU0RQIHNlcnZlciBkZXNpZ24gaGFzIGEgY3JpdGljYWwgZmxhdyB3aGVyZSBpdCBjYW4gcnVuIGludG8KLSAgLy8gYW4gaW5maW5pdGUgcmVxdWVzdC9yZXNwb25zZSBsb29wIHdpdGggdGhlIGNsaWVudC4gSGVyZSdzIHRoZSBzY2VuYXJpbzoKLSAgLy8gLSBjbGllbnQgbWFrZXMgU0RQIHJlcXVlc3QKLSAgLy8gLSBzZXJ2ZXIgcmV0dXJucyB0aGUgZmlyc3QgZnJhZ21lbnQgb2YgdGhlIHJlc3BvbnNlIHdpdGggYSBjb250aW51YXRpb24KLSAgLy8gICB0b2tlbgotICAvLyAtIGFuIFNEUCByZWNvcmQgaXMgZGVsZXRlZCBmcm9tIHRoZSBzZXJ2ZXIKLSAgLy8gLSBjbGllbnQgaXNzdWVzIGFub3RoZXIgcmVxdWVzdCB3aXRoIHByZXZpb3VzIGNvbnRpbnVhdGlvbiB0b2tlbgotICAvLyAtIHNlcnZlciBoYXMgbm90aGluZyB0byBzZW5kIGJhY2sgYmVjYXVzZSB0aGUgcmVjb3JkIGlzIHVuYXZhaWxhYmxlIGJ1dAotICAvLyAgIGluIHRoZSBmaXJzdCBmcmFnbWVudCwgaXQgaGFkIHNwZWNpZmllZCBtb3JlIHJlc3BvbnNlIGJ5dGVzIHRoYW4gYXJlCi0gIC8vICAgbm93IGF2YWlsYWJsZQotICAvLyAtIHNlcnZlciBzZW5kcyBiYWNrIG5vIGFkZGl0aW9uYWwgcmVzcG9uc2UgYnl0ZXMgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAgLy8gICBjb250aW51YXRpb24gdG9rZW4KLSAgLy8gLSBjbGllbnQgaXNzdWVzIGFub3RoZXIgcmVxdWVzdCB3aXRoIHRoZSBjb250aW51YXRpb24gdG9rZW4sIGFuZCB0aGUKLSAgLy8gICBwcm9jZXNzIHJlcGVhdHMKLSAgLy8KLSAgLy8gV2Ugd29yayBhcm91bmQgdGhpcyBkZXNpZ24gZmxhdyBoZXJlIGJ5IGNoZWNraW5nIGlmIHdlIHdpbGwgbWFrZSBmb3J3YXJkCi0gIC8vIHByb2dyZXNzIChpLmUuIHdlIHdpbGwgc2VuZCA+IDAgcmVzcG9uc2UgYnl0ZXMpIG9uIGEgY29udGludWVkIHJlcXVlc3QuCi0gIC8vIElmIG5vdCwgd2UgbXVzdCBoYXZlIHJ1biBpbnRvIHRoZSBhYm92ZSBzaXR1YXRpb24gYW5kIHdlIHRlbGwgdGhlIHBlZXIgYW4KLSAgLy8gZXJyb3Igb2NjdXJyZWQuCi0gIC8vCi0gIC8vIFRPRE8oc2hhcnZpbCk6IHJld3JpdGUgU0RQIHNlcnZlci4KLSAgaWYgKGlzX2NvbnQgJiYgbGVuX3RvX3NlbmQgPT0gMCkgewotICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHBfY2NiLCB0cmFuc19udW0sIFNEUF9JTlZBTElEX0NPTlRfU1RBVEUsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIElmIGZpcnN0IHJlc3BvbnNlLCBpbnNlcnQgc2VxdWVuY2UgaGVhZGVyICovCi0gIGlmICghaXNfY29udCkgewotICAgIC8qIEdldCB0aGUgdG90YWwgbGlzdCBsZW5ndGggZm9yIHJlcXVlc3RlZCB1aWQgYW5kIGF0dHJpYnV0ZSBzZXF1ZW5jZSAqLwotICAgIHBfY2NiLT5saXN0X2xlbiA9IHNkcHVfZ2V0X2xpc3RfbGVuKCZ1aWRfc2VxLCAmYXR0cl9zZXFfc2F2KSArIDM7Ci0gICAgLyogUHV0IGluIHRoZSBzZXF1ZW5jZSBoZWFkZXIgKDIgb3IgMyBieXRlcykgKi8KLSAgICBpZiAocF9jY2ItPmxpc3RfbGVuID4gMjU1KSB7Ci0gICAgICBwX2NjYi0+cnNwX2xpc3RbMF0gPQotICAgICAgICAgICh1aW50OF90KSgoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9XT1JEKTsKLSAgICAgIHBfY2NiLT5yc3BfbGlzdFsxXSA9ICh1aW50OF90KSgocF9jY2ItPmxpc3RfbGVuIC0gMykgPj4gOCk7Ci0gICAgICBwX2NjYi0+cnNwX2xpc3RbMl0gPSAodWludDhfdCkocF9jY2ItPmxpc3RfbGVuIC0gMyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnRfb2Zmc2V0ID0gMTsKLQotICAgICAgcF9jY2ItPnJzcF9saXN0WzFdID0KLSAgICAgICAgICAodWludDhfdCkoKERBVEFfRUxFX1NFUV9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX0lOX05FWFRfQllURSk7Ci0gICAgICBwX2NjYi0+cnNwX2xpc3RbMl0gPSAodWludDhfdCkocF9jY2ItPmxpc3RfbGVuIC0gMyk7Ci0KLSAgICAgIHBfY2NiLT5saXN0X2xlbi0tOwotICAgICAgbGVuX3RvX3NlbmQtLTsKLSAgICB9Ci0gIH0KLQotICAvKiBHZXQgYSBidWZmZXIgdG8gdXNlIHRvIGJ1aWxkIHRoZSByZXNwb25zZSAqLwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhTRFBfREFUQV9CVUZfU0laRSk7Ci0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX3JzcCA9IHBfcnNwX3N0YXJ0ID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIHJzcG9uc2UgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfcnNwLCBTRFBfUERVX1NFUlZJQ0VfU0VBUkNIX0FUVFJfUlNQKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3JzcCwgdHJhbnNfbnVtKTsKLQotICAvKiBTa2lwIHRoZSBwYXJhbWV0ZXIgbGVuZ3RoLCBhZGQgaXQgd2hlbiB3ZSBrbm93IHRoZSBsZW5ndGggKi8KLSAgcF9yc3BfcGFyYW1fbGVuID0gcF9yc3A7Ci0gIHBfcnNwICs9IDI7Ci0KLSAgLyogU3RyZWFtIHRoZSBsaXN0IGxlbmd0aCB0byBzZW5kICovCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9yc3AsIGxlbl90b19zZW5kKTsKLQotICAvKiBjb3B5IGZyb20gcnNwX2xpc3QgdG8gdGhlIGFjdHVhbCBidWZmZXIgdG8gYmUgc2VudCAqLwotICBtZW1jcHkocF9yc3AsICZwX2NjYi0+cnNwX2xpc3RbY29udF9vZmZzZXRdLCBsZW5fdG9fc2VuZCk7Ci0gIHBfcnNwICs9IGxlbl90b19zZW5kOwotCi0gIHBfY2NiLT5jb250X29mZnNldCArPSBsZW5fdG9fc2VuZDsKLQotICAvKiBJZiBhbnl0aGluZyBsZWZ0IHRvIHNlbmQsIGNvbnRpbnVhdGlvbiBuZWVkZWQgKi8KLSAgaWYgKHBfY2NiLT5jb250X29mZnNldCA8IHBfY2NiLT5saXN0X2xlbikgewotICAgIGlzX2NvbnQgPSB0cnVlOwotCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfcnNwLCBTRFBfQ09OVElOVUFUSU9OX0xFTik7Ci0gICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3JzcCwgcF9jY2ItPmNvbnRfb2Zmc2V0KTsKLSAgfSBlbHNlCi0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfcnNwLCAwKTsKLQotICAvKiBHbyBiYWNrIGFuZCBwdXQgdGhlIHBhcmFtZXRlciBsZW5ndGggaW50byB0aGUgYnVmZmVyICovCi0gIHJzcF9wYXJhbV9sZW4gPSBwX3JzcCAtIHBfcnNwX3BhcmFtX2xlbiAtIDI7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9yc3BfcGFyYW1fbGVuLCByc3BfcGFyYW1fbGVuKTsKLQotICAvKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgU0RQIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLwotICBwX2J1Zi0+bGVuID0gcF9yc3AgLSBwX3JzcF9zdGFydDsKLQotICAvKiBTZW5kIHRoZSBidWZmZXIgdGhyb3VnaCBMMkNBUCAqLwotICBMMkNBX0RhdGFXcml0ZShwX2NjYi0+Y29ubmVjdGlvbl9pZCwgcF9idWYpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc2RwL3NkcF91dGlscy5jYyBiL3N0YWNrL3NkcC9zZHBfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDc4YWUuLjAwMDAwMDAKLS0tIGEvc3RhY2svc2RwL3NkcF91dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDExOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgU0RQIHV0aWxpdHkgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZyY19kZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcGRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3N0YWNrX21ldHJpY3NfbG9nZ2luZy5oIgotI2luY2x1ZGUgInN0YWNrL3NkcC9zZHBpbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2RwX2Jhc2VfdXVpZFtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVGLCAweDlCLCAweDM0LCAweEZCfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgc3RkOjphcnJheTxjaGFyLCBzaXplb2YoVCk+IHRvX2xpdHRsZV9lbmRpYW5fYXJyYXkoVCB4KSB7Ci0gIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgInRvX2xpdHRsZV9lbmRpYW5fYXJyYXkgcGFyYW1ldGVyIG11c3QgYmUgaW50ZWdyYWwuIik7Ci0gIHN0ZDo6YXJyYXk8Y2hhciwgc2l6ZW9mKFQpPiBhcnJheSA9IHt9OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgYXJyYXlbaV0gPSBzdGF0aWNfY2FzdDxjaGFyPigoeCA+PiAoOCAqIGkpKSAmIDB4RkYpOwotICB9Ci0gIHJldHVybiBhcnJheTsKLX0KLQotLyoqCi0gKiBGaW5kIHRoZSBsaXN0IG9mIHByb2ZpbGUgdmVyc2lvbnMgZnJvbSBCbHVldG9vdGggUHJvZmlsZSBEZXNjcmlwdG9yIGxpc3QKLSAqIGF0dHJpYnV0ZSBpbiBhIFNEUCByZWNvcmQKLSAqCi0gKiBAcGFyYW0gcF9yZWMgU0RQIHJlY29yZCB0byBzZWFyY2gKLSAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgPFVVSUQsIFZFUlNJT04+IHBhaXJzLCBlbXB0eSBpZiBub3QgZm91bmQKLSAqLwotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiBzZHB1X2ZpbmRfcHJvZmlsZV92ZXJzaW9uKAotICAgIHRTRFBfRElTQ19SRUMqIHBfcmVjKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+PiByZXN1bHQ7Ci0gIGZvciAodFNEUF9ESVNDX0FUVFIqIHBfYXR0ciA9IHBfcmVjLT5wX2ZpcnN0X2F0dHI7IHBfYXR0ciAhPSBudWxscHRyOwotICAgICAgIHBfYXR0ciA9IHBfYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAvLyBGaW5kIHRoZSBwcm9maWxlIGRlc2NyaXB0b3IgbGlzdCAqLwotICAgIGlmIChwX2F0dHItPmF0dHJfaWQgIT0gQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCB8fAotICAgICAgICBTRFBfRElTQ19BVFRSX1RZUEUocF9hdHRyLT5hdHRyX2xlbl90eXBlKSAhPSBEQVRBX0VMRV9TRVFfREVTQ19UWVBFKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLy8gV2FsayB0aHJvdWdoIHRoZSBwcm90b2NvbCBkZXNjcmlwdG9yIGxpc3QKLSAgICBmb3IgKHRTRFBfRElTQ19BVFRSKiBwX3NhdHRyID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgICAgIHBfc2F0dHIgIT0gbnVsbHB0cjsgcF9zYXR0ciA9IHBfc2F0dHItPnBfbmV4dF9hdHRyKSB7Ci0gICAgICAvLyBTYWZldHkgY2hlY2sgLSBlYWNoIGVudHJ5IHNob3VsZCBpdHNlbGYgYmUgYSBzZXF1ZW5jZQotICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfVFlQRShwX3NhdHRyLT5hdHRyX2xlbl90eXBlKSAhPQotICAgICAgICAgIERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IERlc2NyaXB0b3IgdHlwZSBpcyBub3Qgc2VxdWVuY2U6ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGxvZ2hleChTRFBfRElTQ19BVFRSX1RZUEUocF9zYXR0ci0+YXR0cl9sZW5fdHlwZSkpOwotICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4+KCk7Ci0gICAgICB9Ci0gICAgICAvLyBOb3csIHNlZSBpZiB0aGUgZW50cnkgY29udGFpbnMgdGhlIHByb2ZpbGUgVVVJRCB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotICAgICAgZm9yICh0U0RQX0RJU0NfQVRUUiogcF9zc2F0dHIgPSBwX3NhdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgICAgICAgcF9zc2F0dHIgIT0gbnVsbHB0cjsgcF9zc2F0dHIgPSBwX3NzYXR0ci0+cF9uZXh0X2F0dHIpIHsKLSAgICAgICAgaWYgKFNEUF9ESVNDX0FUVFJfVFlQRShwX3NzYXR0ci0+YXR0cl9sZW5fdHlwZSkgIT0gVVVJRF9ERVNDX1RZUEUgfHwKLSAgICAgICAgICAgIFNEUF9ESVNDX0FUVFJfTEVOKHBfc3NhdHRyLT5hdHRyX2xlbl90eXBlKSAhPSAyKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDE2X3QgdXVpZCA9IHBfc3NhdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgICAgICAvLyBOZXh0IGF0dHJpYnV0ZSBzaG91bGQgYmUgdGhlIHZlcnNpb24gYXR0cmlidXRlCi0gICAgICAgIHRTRFBfRElTQ19BVFRSKiB2ZXJzaW9uX2F0dHIgPSBwX3NzYXR0ci0+cF9uZXh0X2F0dHI7Ci0gICAgICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUodmVyc2lvbl9hdHRyLT5hdHRyX2xlbl90eXBlKSAhPSBVSU5UX0RFU0NfVFlQRSB8fAotICAgICAgICAgICAgU0RQX0RJU0NfQVRUUl9MRU4odmVyc2lvbl9hdHRyLT5hdHRyX2xlbl90eXBlKSAhPSAyKSB7Ci0gICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJhZCB2ZXJzaW9uIHR5cGUgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBsb2doZXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFBfRElTQ19BVFRSX1RZUEUodmVyc2lvbl9hdHRyLT5hdHRyX2xlbl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgb3IgbGVuZ3RoICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgU0RQX0RJU0NfQVRUUl9MRU4odmVyc2lvbl9hdHRyLT5hdHRyX2xlbl90eXBlKTsKLSAgICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD4+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSGlnaCBvcmRlciA4IGJpdHMgaXMgdGhlIG1ham9yIG51bWJlciwgbG93IG9yZGVyIGlzIHRoZQotICAgICAgICAvLyBtaW5vciBudW1iZXIgKGJpZyBlbmRpYW4pCi0gICAgICAgIHVpbnQxNl90IHZlcnNpb24gPSB2ZXJzaW9uX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gICAgICAgIHJlc3VsdC5lbXBsYWNlX2JhY2sodXVpZCwgdmVyc2lvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRmluZCB0aGUgbW9zdCBzcGVjaWZpYyAxNi1iaXQgc2VydmljZSB1dWlkIHJlcHJlc2VudGVkIGJ5IGEgU0RQIHJlY29yZAotICoKLSAqIEBwYXJhbSBwX3JlYyBwb2ludGVyIHRvIGEgU0RQIHJlY29yZAotICogQHJldHVybiBtb3N0IHNwZWNpZmljIDE2LWJpdCBzZXJ2aWNlIHV1aWQsIDAgaWYgbm90IGZvdW5kCi0gKi8KLXN0YXRpYyB1aW50MTZfdCBzZHB1X2ZpbmRfbW9zdF9zcGVjaWZpY19zZXJ2aWNlX3V1aWQodFNEUF9ESVNDX1JFQyogcF9yZWMpIHsKLSAgZm9yICh0U0RQX0RJU0NfQVRUUiogcF9hdHRyID0gcF9yZWMtPnBfZmlyc3RfYXR0cjsgcF9hdHRyICE9IG51bGxwdHI7Ci0gICAgICAgcF9hdHRyID0gcF9hdHRyLT5wX25leHRfYXR0cikgewotICAgIGlmIChwX2F0dHItPmF0dHJfaWQgPT0gQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1QgJiYKLSAgICAgICAgU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgewotICAgICAgdFNEUF9ESVNDX0FUVFIqIHBfZmlyc3RfYXR0ciA9IHBfYXR0ci0+YXR0cl92YWx1ZS52LnBfc3ViX2F0dHI7Ci0gICAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfZmlyc3RfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVVVJRF9ERVNDX1RZUEUgJiYKLSAgICAgICAgICBTRFBfRElTQ19BVFRSX0xFTihwX2ZpcnN0X2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDIpIHsKLSAgICAgICAgcmV0dXJuIHBfZmlyc3RfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgICAgIH0gZWxzZSBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfZmlyc3RfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgICAgICAgREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgewotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBUb3lvdGEgRyBCbG9jayBjYXIga2l0OgotICAgICAgICAvLyBJdCBpbmNvcnJlY3RseSBwdXRzIGFuIGV4dHJhIGRhdGEgZWxlbWVudCBzZXF1ZW5jZSBpbiB0aGlzIGF0dHJpYnV0ZQotICAgICAgICBmb3IgKHRTRFBfRElTQ19BVFRSKiBwX2V4dHJhX3NhdHRyID0KLSAgICAgICAgICAgICAgICAgcF9maXJzdF9hdHRyLT5hdHRyX3ZhbHVlLnYucF9zdWJfYXR0cjsKLSAgICAgICAgICAgICBwX2V4dHJhX3NhdHRyICE9IG51bGxwdHI7Ci0gICAgICAgICAgICAgcF9leHRyYV9zYXR0ciA9IHBfZXh0cmFfc2F0dHItPnBfbmV4dF9hdHRyKSB7Ci0gICAgICAgICAgLy8gUmV0dXJuIHRoZSBmaXJzdCBVVUlEIGRhdGEgZWxlbWVudAotICAgICAgICAgIGlmIChTRFBfRElTQ19BVFRSX1RZUEUocF9leHRyYV9zYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0KLSAgICAgICAgICAgICAgICAgIFVVSURfREVTQ19UWVBFICYmCi0gICAgICAgICAgICAgIFNEUF9ESVNDX0FUVFJfTEVOKHBfZXh0cmFfc2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBwX2V4dHJhX3NhdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IEJhZCBTZXJ2aWNlIENsYXNzIElEIGxpc3QgYXR0cmlidXRlIjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwX2F0dHItPmF0dHJfaWQgPT0gQVRUUl9JRF9TRVJWSUNFX0lEKSB7Ci0gICAgICBpZiAoU0RQX0RJU0NfQVRUUl9UWVBFKHBfYXR0ci0+YXR0cl9sZW5fdHlwZSkgPT0gVVVJRF9ERVNDX1RZUEUgJiYKLSAgICAgICAgICBTRFBfRElTQ19BVFRSX0xFTihwX2F0dHItPmF0dHJfbGVuX3R5cGUpID09IDIpIHsKLSAgICAgICAgcmV0dXJuIHBfYXR0ci0+YXR0cl92YWx1ZS52LnUxNjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgc2RwdV9sb2dfYXR0cmlidXRlX21ldHJpY3MoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgewotICBDSEVDS19ORShwX2RiLCBudWxscHRyKTsKLSAgYm9vbCBoYXNfZGlfcmVjb3JkID0gZmFsc2U7Ci0gIGZvciAodFNEUF9ESVNDX1JFQyogcF9yZWMgPSBwX2RiLT5wX2ZpcnN0X3JlYzsgcF9yZWMgIT0gbnVsbHB0cjsKLSAgICAgICBwX3JlYyA9IHBfcmVjLT5wX25leHRfcmVjKSB7Ci0gICAgdWludDE2X3Qgc2VydmljZV91dWlkID0gc2RwdV9maW5kX21vc3Rfc3BlY2lmaWNfc2VydmljZV91dWlkKHBfcmVjKTsKLSAgICBpZiAoc2VydmljZV91dWlkID09IDApIHsKLSAgICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBza2lwcGluZyByZWNvcmQgd2l0aG91dCBzZXJ2aWNlIHV1aWQgIiA8PCBiZGE7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLy8gTG9nIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9maWxlIHJvbGUKLSAgICAvLyBUaGlzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBCbHVldG9vdGggUHJvZmlsZSBEZXNjcmlwdG9yIExpc3QKLSAgICBsb2dfc2RwX2F0dHJpYnV0ZShiZGEsIHNlcnZpY2VfdXVpZCwgMCwgMCwgbnVsbHB0cik7Ci0gICAgLy8gTG9nIHByb2ZpbGUgdmVyc2lvbiBmcm9tIEJsdWV0b290aCBQcm9maWxlIERlc2NyaXB0b3IgTGlzdAotICAgIGF1dG8gdXVpZF92ZXJzaW9uX2FycmF5ID0gc2RwdV9maW5kX3Byb2ZpbGVfdmVyc2lvbihwX3JlYyk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiB1dWlkX3ZlcnNpb25fcGFpciA6IHV1aWRfdmVyc2lvbl9hcnJheSkgewotICAgICAgdWludDE2X3QgcHJvZmlsZV91dWlkID0gdXVpZF92ZXJzaW9uX3BhaXIuZmlyc3Q7Ci0gICAgICB1aW50MTZfdCB2ZXJzaW9uID0gdXVpZF92ZXJzaW9uX3BhaXIuc2Vjb25kOwotICAgICAgYXV0byB2ZXJzaW9uX2FycmF5ID0gdG9fbGl0dGxlX2VuZGlhbl9hcnJheSh2ZXJzaW9uKTsKLSAgICAgIGxvZ19zZHBfYXR0cmlidXRlKGJkYSwgcHJvZmlsZV91dWlkLCBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9hcnJheS5zaXplKCksIHZlcnNpb25fYXJyYXkuZGF0YSgpKTsKLSAgICB9Ci0gICAgLy8gTG9nIHByb3RvY29sIHZlcnNpb24gZnJvbSBQcm90b2NvbCBEZXNjcmlwdG9yIExpc3QKLSAgICB1aW50MTZfdCBwcm90b2NvbF91dWlkID0gMDsKLSAgICBzd2l0Y2ggKHNlcnZpY2VfdXVpZCkgewotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19BVURJT19TT1VSQ0U6Ci0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0FVRElPX1NJTks6Ci0gICAgICAgIHByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX0FWRFRQOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfQVZfUkVNT1RFX0NPTlRST0w6Ci0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX0NPTlRST0w6Ci0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0FWX1JFTV9DVFJMX1RBUkdFVDoKLSAgICAgICAgcHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfQVZDVFA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19QQU5VOgotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19HTjoKLSAgICAgICAgcHJvdG9jb2xfdXVpZCA9IFVVSURfUFJPVE9DT0xfQk5FUDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChwcm90b2NvbF91dWlkICE9IDApIHsKLSAgICAgIHRTRFBfUFJPVE9DT0xfRUxFTSBwcm90b2NvbF9lbGVtZW50cyA9IHt9OwotICAgICAgaWYgKFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjKHBfcmVjLCBwcm90b2NvbF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b2NvbF9lbGVtZW50cykpIHsKLSAgICAgICAgaWYgKHByb3RvY29sX2VsZW1lbnRzLm51bV9wYXJhbXMgPj0gMSkgewotICAgICAgICAgIHVpbnQxNl90IHZlcnNpb24gPSBwcm90b2NvbF9lbGVtZW50cy5wYXJhbXNbMF07Ci0gICAgICAgICAgYXV0byB2ZXJzaW9uX2FycmF5ID0gdG9fbGl0dGxlX2VuZGlhbl9hcnJheSh2ZXJzaW9uKTsKLSAgICAgICAgICBsb2dfc2RwX2F0dHJpYnV0ZShiZGEsIHByb3RvY29sX3V1aWQsIEFUVFJfSURfUFJPVE9DT0xfREVTQ19MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fYXJyYXkuc2l6ZSgpLCB2ZXJzaW9uX2FycmF5LmRhdGEoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gTG9nIHByb2ZpbGUgc3VwcG9ydGVkIGZlYXR1cmVzIGZyb20gdmFyaW91cyBzdXBwb3J0ZWQgZmVhdHVyZSBhdHRyaWJ1dGVzCi0gICAgc3dpdGNoIChzZXJ2aWNlX3V1aWQpIHsKLSAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFOgotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUU6Ci0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0FWX1JFTU9URV9DT05UUk9MOgotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9DT05UUk9MOgotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19BVl9SRU1fQ1RSTF9UQVJHRVQ6Ci0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX0FVRElPX1NPVVJDRToKLSAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfQVVESU9fU0lOSzogewotICAgICAgICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyID0KLSAgICAgICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfU1VQUE9SVEVEX0ZFQVRVUkVTKTsKLSAgICAgICAgaWYgKHBfYXR0ciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDE2X3Qgc3VwcG9ydGVkX2ZlYXR1cmVzID0gcF9hdHRyLT5hdHRyX3ZhbHVlLnYudTE2OwotICAgICAgICBhdXRvIHZlcnNpb25fYXJyYXkgPSB0b19saXR0bGVfZW5kaWFuX2FycmF5KHN1cHBvcnRlZF9mZWF0dXJlcyk7Ci0gICAgICAgIGxvZ19zZHBfYXR0cmlidXRlKGJkYSwgc2VydmljZV91dWlkLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9hcnJheS5zaXplKCksIHZlcnNpb25fYXJyYXkuZGF0YSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFVVSURfU0VSVkNMQVNTX01FU1NBR0VfTk9USUZJQ0FUSU9OOgotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19NRVNTQUdFX0FDQ0VTUzogewotICAgICAgICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyID0KLSAgICAgICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIEFUVFJfSURfTUFQX1NVUFBPUlRFRF9GRUFUVVJFUyk7Ci0gICAgICAgIGlmIChwX2F0dHIgPT0gbnVsbHB0cikgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG1hcF9zdXBwb3J0ZWRfZmVhdHVyZXMgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MzI7Ci0gICAgICAgIGF1dG8gZmVhdHVyZXNfYXJyYXkgPSB0b19saXR0bGVfZW5kaWFuX2FycmF5KG1hcF9zdXBwb3J0ZWRfZmVhdHVyZXMpOwotICAgICAgICBsb2dfc2RwX2F0dHJpYnV0ZShiZGEsIHNlcnZpY2VfdXVpZCwgQVRUUl9JRF9NQVBfU1VQUE9SVEVEX0ZFQVRVUkVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19hcnJheS5zaXplKCksIGZlYXR1cmVzX2FycmF5LmRhdGEoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBVVUlEX1NFUlZDTEFTU19QQkFQX1BDRToKLSAgICAgIGNhc2UgVVVJRF9TRVJWQ0xBU1NfUEJBUF9QU0U6IHsKLSAgICAgICAgdFNEUF9ESVNDX0FUVFIqIHBfYXR0ciA9Ci0gICAgICAgICAgICBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1BCQVBfU1VQUE9SVEVEX0ZFQVRVUkVTKTsKLSAgICAgICAgaWYgKHBfYXR0ciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgcGJhcF9zdXBwb3J0ZWRfZmVhdHVyZXMgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MzI7Ci0gICAgICAgIGF1dG8gZmVhdHVyZXNfYXJyYXkgPSB0b19saXR0bGVfZW5kaWFuX2FycmF5KHBiYXBfc3VwcG9ydGVkX2ZlYXR1cmVzKTsKLSAgICAgICAgbG9nX3NkcF9hdHRyaWJ1dGUoYmRhLCBzZXJ2aWNlX3V1aWQsIEFUVFJfSURfUEJBUF9TVVBQT1JURURfRkVBVFVSRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2FycmF5LnNpemUoKSwgZmVhdHVyZXNfYXJyYXkuZGF0YSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzZXJ2aWNlX3V1aWQgPT0gVVVJRF9TRVJWQ0xBU1NfUE5QX0lORk9STUFUSU9OKSB7Ci0gICAgICBoYXNfZGlfcmVjb3JkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgLy8gTG9nIHRoZSBmaXJzdCBESSByZWNvcmQgaWYgdGhlcmUgaXMgb25lCi0gIGlmIChoYXNfZGlfcmVjb3JkKSB7Ci0gICAgdFNEUF9ESV9HRVRfUkVDT1JEIGRpX3JlY29yZCA9IHt9OwotICAgIGlmIChTRFBfR2V0RGlSZWNvcmQoMSwgJmRpX3JlY29yZCwgcF9kYikgPT0gU0RQX1NVQ0NFU1MpIHsKLSAgICAgIGF1dG8gdmVyc2lvbl9hcnJheSA9IHRvX2xpdHRsZV9lbmRpYW5fYXJyYXkoZGlfcmVjb3JkLnNwZWNfaWQpOwotICAgICAgbG9nX3NkcF9hdHRyaWJ1dGUoYmRhLCBVVUlEX1NFUlZDTEFTU19QTlBfSU5GT1JNQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBBVFRSX0lEX1NQRUNJRklDQVRJT05fSUQsIHZlcnNpb25fYXJyYXkuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9hcnJheS5kYXRhKCkpOwotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAvLyBbTiAtIG5hdGl2ZV06OlNEUDo6W0RJUCAtIERldmljZSBJRCBQcm9maWxlXQotICAgICAgc3MgPDwgIk46U0RQOjpESVA6OiIgPDwgbG9naGV4KGRpX3JlY29yZC5yZWMudmVuZG9yX2lkX3NvdXJjZSk7Ci0gICAgICBsb2dfbWFudWZhY3R1cmVyX2luZm8oCi0gICAgICAgICAgYmRhLCBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtOjpERVZJQ0VfSU5GT19JTlRFUk5BTCwKLSAgICAgICAgICBzcy5zdHIoKSwgbG9naGV4KGRpX3JlY29yZC5yZWMudmVuZG9yKSwgbG9naGV4KGRpX3JlY29yZC5yZWMucHJvZHVjdCksCi0gICAgICAgICAgbG9naGV4KGRpX3JlY29yZC5yZWMudmVyc2lvbiksICIiKTsKLQotICAgICAgc3RkOjpzdHJpbmcgYmRhX3N0cmluZyA9IGJkYS5Ub1N0cmluZygpOwotICAgICAgLy8gd3JpdGUgbWFudWZhY3R1cmVyLCBtb2RlbCwgSFcgdmVyc2lvbiB0byBjb25maWcKLSAgICAgIGJ0aWZfY29uZmlnX3NldF9pbnQoYmRhX3N0cmluZywgQlRfQ09ORklHX0tFWV9TRFBfRElfTUFOVUZBQ1RVUkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkaV9yZWNvcmQucmVjLnZlbmRvcik7Ci0gICAgICBidGlmX2NvbmZpZ19zZXRfaW50KGJkYV9zdHJpbmcsIEJUX0NPTkZJR19LRVlfU0RQX0RJX01PREVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkaV9yZWNvcmQucmVjLnByb2R1Y3QpOwotICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZGFfc3RyaW5nLCBCVF9DT05GSUdfS0VZX1NEUF9ESV9IV19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkaV9yZWNvcmQucmVjLnZlcnNpb24pOwotICAgICAgYnRpZl9jb25maWdfc2V0X2ludChiZGFfc3RyaW5nLCBCVF9DT05GSUdfS0VZX1NEUF9ESV9WRU5ET1JfSURfU1JDLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkaV9yZWNvcmQucmVjLnZlbmRvcl9pZF9zb3VyY2UpOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9maW5kX2NjYl9ieV9jaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIENDQiB0YWJsZSBmb3IgYW4gZW50cnkgd2l0aCB0aGUKLSAqICAgICAgICAgICAgICAgICAgcGFzc2VkIENJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRoZSBDQ0IgYWRkcmVzcywgb3IgTlVMTCBpZiBub3QgZm91bmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRDT05OX0NCKiBzZHB1X2ZpbmRfY2NiX2J5X2NpZCh1aW50MTZfdCBjaWQpIHsKLSAgdWludDE2X3QgeHg7Ci0gIHRDT05OX0NCKiBwX2NjYjsKLQotICAvKiBMb29rIHRocm91Z2ggZWFjaCBjb25uZWN0aW9uIGNvbnRyb2wgYmxvY2sgKi8KLSAgZm9yICh4eCA9IDAsIHBfY2NiID0gc2RwX2NiLmNjYjsgeHggPCBTRFBfTUFYX0NPTk5FQ1RJT05TOyB4eCsrLCBwX2NjYisrKSB7Ci0gICAgaWYgKChwX2NjYi0+Y29uX3N0YXRlICE9IFNEUF9TVEFURV9JRExFKSAmJiAocF9jY2ItPmNvbm5lY3Rpb25faWQgPT0gY2lkKSkKLSAgICAgIHJldHVybiAocF9jY2IpOwotICB9Ci0KLSAgLyogSWYgaGVyZSwgbm90IGZvdW5kICovCi0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHB1X2ZpbmRfY2NiX2J5X2RiCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBDQ0IgdGFibGUgZm9yIGFuIGVudHJ5IHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NlZCBkaXNjb3ZlcnkgZGIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0aGUgQ0NCIGFkZHJlc3MsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Q09OTl9DQiogc2RwdV9maW5kX2NjYl9ieV9kYihjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgewotICB1aW50MTZfdCB4eDsKLSAgdENPTk5fQ0IqIHBfY2NiOwotCi0gIGlmIChwX2RiKSB7Ci0gICAgLyogTG9vayB0aHJvdWdoIGVhY2ggY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICovCi0gICAgZm9yICh4eCA9IDAsIHBfY2NiID0gc2RwX2NiLmNjYjsgeHggPCBTRFBfTUFYX0NPTk5FQ1RJT05TOyB4eCsrLCBwX2NjYisrKSB7Ci0gICAgICBpZiAoKHBfY2NiLT5jb25fc3RhdGUgIT0gU0RQX1NUQVRFX0lETEUpICYmIChwX2NjYi0+cF9kYiA9PSBwX2RiKSkKLSAgICAgICAgcmV0dXJuIChwX2NjYik7Ci0gICAgfQotICB9Ci0gIC8qIElmIGhlcmUsIG5vdCBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9hbGxvY2F0ZV9jY2IKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IENDQi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIENDQiBhZGRyZXNzLCBvciBOVUxMIGlmIG5vbmUgYXZhaWxhYmxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10Q09OTl9DQiogc2RwdV9hbGxvY2F0ZV9jY2Iodm9pZCkgewotICB1aW50MTZfdCB4eDsKLSAgdENPTk5fQ0IqIHBfY2NiOwotCi0gIC8qIExvb2sgdGhyb3VnaCBlYWNoIGNvbm5lY3Rpb24gY29udHJvbCBibG9jayBmb3IgYSBmcmVlIG9uZSAqLwotICBmb3IgKHh4ID0gMCwgcF9jY2IgPSBzZHBfY2IuY2NiOyB4eCA8IFNEUF9NQVhfQ09OTkVDVElPTlM7IHh4KyssIHBfY2NiKyspIHsKLSAgICBpZiAocF9jY2ItPmNvbl9zdGF0ZSA9PSBTRFBfU1RBVEVfSURMRSkgewotICAgICAgYWxhcm1fdCogYWxhcm0gPSBwX2NjYi0+c2RwX2Nvbm5fdGltZXI7Ci0gICAgICBtZW1zZXQocF9jY2IsIDAsIHNpemVvZih0Q09OTl9DQikpOwotICAgICAgcF9jY2ItPnNkcF9jb25uX3RpbWVyID0gYWxhcm07Ci0gICAgICByZXR1cm4gKHBfY2NiKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiBoZXJlLCBubyBmcmVlIENDQiBmb3VuZCAqLwotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9yZWxlYXNlX2NjYgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhIENDQi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzZHB1X3JlbGVhc2VfY2NiKHRDT05OX0NCKiBwX2NjYikgewotICAvKiBFbnN1cmUgdGltZXIgaXMgc3RvcHBlZCAqLwotICBhbGFybV9jYW5jZWwocF9jY2ItPnNkcF9jb25uX3RpbWVyKTsKLQotICAvKiBEcm9wIGFueSByZXNwb25zZSBwb2ludGVyIHdlIG1heSBiZSBob2xkaW5nICovCi0gIHBfY2NiLT5jb25fc3RhdGUgPSBTRFBfU1RBVEVfSURMRTsKLSAgcF9jY2ItPmlzX2F0dHJfc2VhcmNoID0gZmFsc2U7Ci0KLSAgLyogRnJlZSB0aGUgcmVzcG9uc2UgYnVmZmVyICovCi0gIGlmIChwX2NjYi0+cnNwX2xpc3QpIFNEUF9UUkFDRV9ERUJVRygicmVsZWFzaW5nIFNEUCByc3BfbGlzdCIpOwotICBvc2lfZnJlZV9hbmRfcmVzZXQoKHZvaWQqKikmcF9jY2ItPnJzcF9saXN0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcHVfYnVpbGRfYXR0cmliX3NlcQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgYW4gYXR0cmlidXRlIHNlcXVlbmNlIGZyb20gdGhlIGxpc3Qgb2YKLSAqICAgICAgICAgICAgICAgICAgcGFzc2VkIGF0dHJpYnV0ZXMuIEl0IGlzIGFsc28gcGFzc2VkIHRoZSBhZGRyZXNzIG9mIHRoZQotICogICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyLgotICoKLSAqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byBuZXh0IGJ5dGUgaW4gdGhlIG91dHB1dCBidWZmZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QqIHNkcHVfYnVpbGRfYXR0cmliX3NlcSh1aW50OF90KiBwX291dCwgdWludDE2X3QqIHBfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fYXR0cnMpIHsKLSAgdWludDE2X3QgeHg7Ci0KLSAgLyogRmlyc3QgdGhpbmcgaXMgdGhlIGRhdGEgZWxlbWVudCBoZWFkZXIuIFNlZSBpZiB0aGUgbGVuZ3RoIGZpdHMgMSBieXRlICovCi0gIC8qIElmIG5vIGF0dHJpYnV0ZXMsIGFzc3VtZSBhIDQtYnl0ZSB3aWxkY2FyZCAqLwotICBpZiAoIXBfYXR0cikKLSAgICB4eCA9IDU7Ci0gIGVsc2UKLSAgICB4eCA9IG51bV9hdHRycyAqIDM7Ci0KLSAgaWYgKHh4ID4gMjU1KSB7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9XT1JEKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfb3V0LCB4eCk7Ci0gIH0gZWxzZSB7Ci0gICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAoREFUQV9FTEVfU0VRX0RFU0NfVFlQRSA8PCAzKSB8IFNJWkVfSU5fTkVYVF9CWVRFKTsKLSAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9vdXQsIHh4KTsKLSAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzIHNwZWNpZmllZCwgYXNzdW1lIGNhbGxlciB3YW50cyB3aWxkY2FyZCAqLwotICBpZiAoIXBfYXR0cikgewotICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9GT1VSX0JZVEVTKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfb3V0LCAwKTsKLSAgICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfb3V0LCAweEZGRkYpOwotICB9IGVsc2UgewotICAgIC8qIExvb3AgdGhyb3VnaCBhbmQgcHV0IGluIGFsbCB0aGUgYXR0cmlidXRlcyhzKSAqLwotICAgIGZvciAoeHggPSAwOyB4eCA8IG51bV9hdHRyczsgeHgrKywgcF9hdHRyKyspIHsKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKFVJTlRfREVTQ19UWVBFIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICAgICAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX291dCwgKnBfYXR0cik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChwX291dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHB1X2J1aWxkX2F0dHJpYl9lbnRyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBidWlsZHMgYW4gYXR0cmlidXRlIGVudHJ5IGZyb20gdGhlIHBhc3NlZAotICogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgcmVjb3JkLiBJdCBpcyBhbHNvIHBhc3NlZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gbmV4dCBieXRlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90KiBzZHB1X2J1aWxkX2F0dHJpYl9lbnRyeSh1aW50OF90KiBwX291dCwgY29uc3QgdFNEUF9BVFRSSUJVVEUqIHBfYXR0cikgewotICAvKiBGaXJzdCwgc3RvcmUgdGhlIGF0dHJpYnV0ZSBJRC4gR29lcyBhcyBhIFVJTlQgKi8KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LCAoVUlOVF9ERVNDX1RZUEUgPDwgMykgfCBTSVpFX1RXT19CWVRFUyk7Ci0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9vdXQsIHBfYXR0ci0+aWQpOwotCi0gIC8qIHRoZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGRiIHJlY29yZC4KLSAgICogYXNzdW1pbmcgdGhlIGF0dHJpYnV0ZSBsZW4gaXMgbGVzcyB0aGFuIFNEUF9NQVhfQVRUUl9MRU4gKi8KLSAgc3dpdGNoIChwX2F0dHItPnR5cGUpIHsKLSAgICBjYXNlIFRFWFRfU1RSX0RFU0NfVFlQRTogICAgIC8qIDQgKi8KLSAgICBjYXNlIERBVEFfRUxFX1NFUV9ERVNDX1RZUEU6IC8qIDYgKi8KLSAgICBjYXNlIERBVEFfRUxFX0FMVF9ERVNDX1RZUEU6IC8qIDcgKi8KLSAgICBjYXNlIFVSTF9ERVNDX1RZUEU6ICAgICAgICAgIC8qIDggKi8KLSNpZiAoU0RQX01BWF9BVFRSX0xFTiA+IDB4RkZGRikKLSAgICAgIGlmIChwX2F0dHItPmxlbiA+IDB4RkZGRikgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9vdXQsIChwX2F0dHItPnR5cGUgPDwgMykgfCBTSVpFX0lOX05FWFRfTE9ORyk7Ci0gICAgICAgIFVJTlQzMl9UT19CRV9TVFJFQU0ocF9vdXQsIHBfYXR0ci0+bGVuKTsKLSAgICAgIH0gZWxzZQotI2VuZGlmIC8qIDB4RkZGRiAtIDB4RkYgKi8KLSNpZiAoU0RQX01BWF9BVFRSX0xFTiA+IDB4RkYpCi0gICAgICAgICAgaWYgKHBfYXR0ci0+bGVuID4gMHhGRikgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9vdXQsIChwX2F0dHItPnR5cGUgPDwgMykgfCBTSVpFX0lOX05FWFRfV09SRCk7Ci0gICAgICAgIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9vdXQsIHBfYXR0ci0+bGVuKTsKLSAgICAgIH0gZWxzZQotI2VuZGlmIC8qIDB4RkYgYW5kIGxlc3MqLwotICAgICAgewotICAgICAgICBVSU5UOF9UT19CRV9TVFJFQU0ocF9vdXQsIChwX2F0dHItPnR5cGUgPDwgMykgfCBTSVpFX0lOX05FWFRfQllURSk7Ci0gICAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgcF9hdHRyLT5sZW4pOwotICAgICAgfQotCi0gICAgICBpZiAocF9hdHRyLT52YWx1ZV9wdHIgIT0gTlVMTCkgewotICAgICAgICBBUlJBWV9UT19CRV9TVFJFQU0ocF9vdXQsIHBfYXR0ci0+dmFsdWVfcHRyLCAoaW50KXBfYXR0ci0+bGVuKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIChwX291dCk7Ci0gIH0KLQotICAvKiBOb3csIHN0b3JlIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KLSAgc3dpdGNoIChwX2F0dHItPmxlbikgewotICAgIGNhc2UgMToKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKHBfYXR0ci0+dHlwZSA8PCAzKSB8IFNJWkVfT05FX0JZVEUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LCAocF9hdHRyLT50eXBlIDw8IDMpIHwgU0laRV9UV09fQllURVMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LCAocF9hdHRyLT50eXBlIDw8IDMpIHwgU0laRV9GT1VSX0JZVEVTKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKHBfYXR0ci0+dHlwZSA8PCAzKSB8IFNJWkVfRUlHSFRfQllURVMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIFVJTlQ4X1RPX0JFX1NUUkVBTShwX291dCwgKHBfYXR0ci0+dHlwZSA8PCAzKSB8IFNJWkVfU0lYVEVFTl9CWVRFUyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LCAocF9hdHRyLT50eXBlIDw8IDMpIHwgU0laRV9JTl9ORVhUX0JZVEUpOwotICAgICAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfb3V0LCBwX2F0dHItPmxlbik7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChwX2F0dHItPnZhbHVlX3B0ciAhPSBOVUxMKSB7Ci0gICAgQVJSQVlfVE9fQkVfU1RSRUFNKHBfb3V0LCBwX2F0dHItPnZhbHVlX3B0ciwgKGludClwX2F0dHItPmxlbik7Ci0gIH0KLQotICByZXR1cm4gKHBfb3V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBhbmQgc2VuZHMgYW4gZXJyb3IgcGFja2V0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNkcHVfYnVpbGRfbl9zZW5kX2Vycm9yKHRDT05OX0NCKiBwX2NjYiwgdWludDE2X3QgdHJhbnNfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcnJvcl9jb2RlLCBjaGFyKiBwX2Vycm9yX3RleHQpIHsKLSAgdWludDhfdCAqcF9yc3AsICpwX3JzcF9zdGFydCwgKnBfcnNwX3BhcmFtX2xlbjsKLSAgdWludDE2X3QgcnNwX3BhcmFtX2xlbjsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoU0RQX0RBVEFfQlVGX1NJWkUpOwotCi0gIFNEUF9UUkFDRV9XQVJOSU5HKCJTRFAgLSBzZHB1X2J1aWxkX25fc2VuZF9lcnJvciAgY29kZTogMHgleCAgQ0lEOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSwgcF9jY2ItPmNvbm5lY3Rpb25faWQpOwotCi0gIC8qIFNlbmQgdGhlIHBhY2tldCB0byBMMkNBUCAqLwotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9yc3AgPSBwX3JzcF9zdGFydCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgVUlOVDhfVE9fQkVfU1RSRUFNKHBfcnNwLCBTRFBfUERVX0VSUk9SX1JFU1BPTlNFKTsKLSAgVUlOVDE2X1RPX0JFX1NUUkVBTShwX3JzcCwgdHJhbnNfbnVtKTsKLQotICAvKiBTa2lwIHRoZSBwYXJhbWV0ZXIgbGVuZ3RoLCB3ZSBuZWVkIHRvIGFkZCBpdCBhdCB0aGUgZW5kICovCi0gIHBfcnNwX3BhcmFtX2xlbiA9IHBfcnNwOwotICBwX3JzcCArPSAyOwotCi0gIFVJTlQxNl9UT19CRV9TVFJFQU0ocF9yc3AsIGVycm9yX2NvZGUpOwotCi0gIC8qIFVucGx1Z2Zlc3QgZXhhbXBsZSB0cmFjZXMgZG8gbm90IGhhdmUgYW55IGVycm9yIHRleHQgKi8KLSAgaWYgKHBfZXJyb3JfdGV4dCkKLSAgICBBUlJBWV9UT19CRV9TVFJFQU0ocF9yc3AsIHBfZXJyb3JfdGV4dCwgKGludClzdHJsZW4ocF9lcnJvcl90ZXh0KSk7Ci0KLSAgLyogR28gYmFjayBhbmQgcHV0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGludG8gdGhlIGJ1ZmZlciAqLwotICByc3BfcGFyYW1fbGVuID0gcF9yc3AgLSBwX3JzcF9wYXJhbV9sZW4gLSAyOwotICBVSU5UMTZfVE9fQkVfU1RSRUFNKHBfcnNwX3BhcmFtX2xlbiwgcnNwX3BhcmFtX2xlbik7Ci0KLSAgLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIFNEUCBkYXRhIGluIHRoZSBidWZmZXIgKi8KLSAgcF9idWYtPmxlbiA9IHBfcnNwIC0gcF9yc3Bfc3RhcnQ7Ci0KLSAgLyogU2VuZCB0aGUgYnVmZmVyIHRocm91Z2ggTDJDQVAgKi8KLSAgTDJDQV9EYXRhV3JpdGUocF9jY2ItPmNvbm5lY3Rpb25faWQsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcHVfZXh0cmFjdF91aWRfc2VxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIGEgVVVJRCBzZXF1ZW5jZSBmcm9tIHRoZSBwYXNzZWQgaW5wdXQKLSAqICAgICAgICAgICAgICAgICAgYnVmZmVyLCBhbmQgcHV0cyBpdCBpbnRvIHRoZSBwYXNzZWQgb3V0cHV0IGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIG5leHQgYnl0ZSBpbiB0aGUgaW5wdXQgYnVmZmVyIGFmdGVyIHRoZSBzZXF1ZW5jZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCogc2RwdV9leHRyYWN0X3VpZF9zZXEodWludDhfdCogcCwgdWludDE2X3QgcGFyYW1fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9VVUlEX1NFUSogcF9zZXEpIHsKLSAgdWludDhfdCogcF9zZXFfZW5kOwotICB1aW50OF90IGRlc2NyLCB0eXBlLCBzaXplOwotICB1aW50MzJfdCBzZXFfbGVuLCB1dWlkX2xlbjsKLQotICAvKiBBc3N1bWUgbm9uZSBmb3VuZCAqLwotICBwX3NlcS0+bnVtX3VpZHMgPSAwOwotCi0gIC8qIEEgVUlEIHNlcXVlbmNlIGlzIGNvbXBvc2VkIG9mIGEgYnVuY2ggb2YgVUlEcy4gKi8KLSAgaWYgKHNpemVvZihkZXNjcikgPiBwYXJhbV9sZW4pIHJldHVybiAoTlVMTCk7Ci0gIHBhcmFtX2xlbiAtPSBzaXplb2YoZGVzY3IpOwotCi0gIEJFX1NUUkVBTV9UT19VSU5UOChkZXNjciwgcCk7Ci0gIHR5cGUgPSBkZXNjciA+PiAzOwotICBzaXplID0gZGVzY3IgJiA3OwotCi0gIGlmICh0eXBlICE9IERBVEFfRUxFX1NFUV9ERVNDX1RZUEUpIHJldHVybiAoTlVMTCk7Ci0KLSAgc3dpdGNoIChzaXplKSB7Ci0gICAgY2FzZSBTSVpFX1RXT19CWVRFUzoKLSAgICAgIHNlcV9sZW4gPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSVpFX0ZPVVJfQllURVM6Ci0gICAgICBzZXFfbGVuID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0laRV9TSVhURUVOX0JZVEVTOgotICAgICAgc2VxX2xlbiA9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSVpFX0lOX05FWFRfQllURToKLSAgICAgIGlmIChzaXplb2YodWludDhfdCkgPiBwYXJhbV9sZW4pIHJldHVybiAoTlVMTCk7Ci0gICAgICBwYXJhbV9sZW4gLT0gc2l6ZW9mKHVpbnQ4X3QpOwotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHNlcV9sZW4sIHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSVpFX0lOX05FWFRfV09SRDoKLSAgICAgIGlmIChzaXplb2YodWludDE2X3QpID4gcGFyYW1fbGVuKSByZXR1cm4gKE5VTEwpOwotICAgICAgcGFyYW1fbGVuIC09IHNpemVvZih1aW50MTZfdCk7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHNlcV9sZW4sIHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSVpFX0lOX05FWFRfTE9ORzoKLSAgICAgIGlmIChzaXplb2YodWludDMyX3QpID4gcGFyYW1fbGVuKSByZXR1cm4gKE5VTEwpOwotICAgICAgcGFyYW1fbGVuIC09IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHNlcV9sZW4sIHApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gIH0KLQotICBpZiAoc2VxX2xlbiA+IHBhcmFtX2xlbikgcmV0dXJuIChOVUxMKTsKLQotICBwX3NlcV9lbmQgPSBwICsgc2VxX2xlbjsKLQotICAvKiBMb29wIHRocm91Z2gsIGV4dHJhY3RpbmcgdGhlIFVJRHMgKi8KLSAgZm9yICg7IHAgPCBwX3NlcV9lbmQ7KSB7Ci0gICAgQkVfU1RSRUFNX1RPX1VJTlQ4KGRlc2NyLCBwKTsKLSAgICB0eXBlID0gZGVzY3IgPj4gMzsKLSAgICBzaXplID0gZGVzY3IgJiA3OwotCi0gICAgaWYgKHR5cGUgIT0gVVVJRF9ERVNDX1RZUEUpIHJldHVybiAoTlVMTCk7Ci0KLSAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgIGNhc2UgU0laRV9UV09fQllURVM6Ci0gICAgICAgIHV1aWRfbGVuID0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJWkVfRk9VUl9CWVRFUzoKLSAgICAgICAgdXVpZF9sZW4gPSA0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0laRV9TSVhURUVOX0JZVEVTOgotICAgICAgICB1dWlkX2xlbiA9IDE2OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0laRV9JTl9ORVhUX0JZVEU6Ci0gICAgICAgIGlmIChwICsgc2l6ZW9mKHVpbnQ4X3QpID4gcF9zZXFfZW5kKSByZXR1cm4gTlVMTDsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQ4KHV1aWRfbGVuLCBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJWkVfSU5fTkVYVF9XT1JEOgotICAgICAgICBpZiAocCArIHNpemVvZih1aW50MTZfdCkgPiBwX3NlcV9lbmQpIHJldHVybiBOVUxMOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHV1aWRfbGVuLCBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJWkVfSU5fTkVYVF9MT05HOgotICAgICAgICBpZiAocCArIHNpemVvZih1aW50MzJfdCkgPiBwX3NlcV9lbmQpIHJldHVybiBOVUxMOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHV1aWRfbGVuLCBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICAgIC8qIElmIFVVSUQgbGVuZ3RoIGlzIHZhbGlkLCBjb3B5IGl0IGFjcm9zcyAqLwotICAgIGlmICgoKHV1aWRfbGVuID09IDIpIHx8ICh1dWlkX2xlbiA9PSA0KSB8fCAodXVpZF9sZW4gPT0gMTYpKSAmJgotICAgICAgICAocCArIHV1aWRfbGVuIDw9IHBfc2VxX2VuZCkpIHsKLSAgICAgIHBfc2VxLT51dWlkX2VudHJ5W3Bfc2VxLT5udW1fdWlkc10ubGVuID0gKHVpbnQxNl90KXV1aWRfbGVuOwotICAgICAgQkVfU1RSRUFNX1RPX0FSUkFZKHAsIHBfc2VxLT51dWlkX2VudHJ5W3Bfc2VxLT5udW1fdWlkc10udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGludCl1dWlkX2xlbik7Ci0gICAgICBwX3NlcS0+bnVtX3VpZHMrKzsKLSAgICB9IGVsc2UKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSAgICAvKiBXZSBjYW4gb25seSBkbyBzbyBtYW55ICovCi0gICAgaWYgKHBfc2VxLT5udW1fdWlkcyA+PSBNQVhfVVVJRFNfUEVSX1NFUSkgcmV0dXJuIChOVUxMKTsKLSAgfQotCi0gIGlmIChwICE9IHBfc2VxX2VuZCkgcmV0dXJuIChOVUxMKTsKLQotICByZXR1cm4gKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9leHRyYWN0X2F0dHJfc2VxCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIGFuIGF0dHJpYnV0ZSBzZXF1ZW5jZSBmcm9tIHRoZSBwYXNzZWQKLSAqICAgICAgICAgICAgICAgICAgaW5wdXQgYnVmZmVyLCBhbmQgcHV0cyBpdCBpbnRvIHRoZSBwYXNzZWQgb3V0cHV0IGxpc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIG5leHQgYnl0ZSBpbiB0aGUgaW5wdXQgYnVmZmVyIGFmdGVyIHRoZSBzZXF1ZW5jZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCogc2RwdV9leHRyYWN0X2F0dHJfc2VxKHVpbnQ4X3QqIHAsIHVpbnQxNl90IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0FUVFJfU0VRKiBwX3NlcSkgewotICB1aW50OF90KiBwX2VuZF9saXN0OwotICB1aW50OF90IGRlc2NyLCB0eXBlLCBzaXplOwotICB1aW50MzJfdCBsaXN0X2xlbiwgYXR0cl9sZW47Ci0KLSAgLyogQXNzdW1lIG5vbmUgZm91bmQgKi8KLSAgcF9zZXEtPm51bV9hdHRyID0gMDsKLQotICAvKiBHZXQgYXR0cmlidXRlIHNlcXVlbmNlIGluZm8gKi8KLSAgaWYgKHBhcmFtX2xlbiA8IHNpemVvZihkZXNjcikpIHJldHVybiBOVUxMOwotICBwYXJhbV9sZW4gLT0gc2l6ZW9mKGRlc2NyKTsKLSAgQkVfU1RSRUFNX1RPX1VJTlQ4KGRlc2NyLCBwKTsKLSAgdHlwZSA9IGRlc2NyID4+IDM7Ci0gIHNpemUgPSBkZXNjciAmIDc7Ci0KLSAgaWYgKHR5cGUgIT0gREFUQV9FTEVfU0VRX0RFU0NfVFlQRSkgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoIChzaXplKSB7Ci0gICAgY2FzZSBTSVpFX0lOX05FWFRfQllURToKLSAgICAgIGlmIChwYXJhbV9sZW4gPCBzaXplb2YodWludDhfdCkpIHJldHVybiBOVUxMOwotICAgICAgcGFyYW1fbGVuIC09IHNpemVvZih1aW50OF90KTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UOChsaXN0X2xlbiwgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0laRV9JTl9ORVhUX1dPUkQ6Ci0gICAgICBpZiAocGFyYW1fbGVuIDwgc2l6ZW9mKHVpbnQxNl90KSkgcmV0dXJuIE5VTEw7Ci0gICAgICBwYXJhbV9sZW4gLT0gc2l6ZW9mKHVpbnQxNl90KTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYobGlzdF9sZW4sIHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNJWkVfSU5fTkVYVF9MT05HOgotICAgICAgaWYgKHBhcmFtX2xlbiA8IHNpemVvZih1aW50MzJfdCkpIHJldHVybiBOVUxMOwotICAgICAgcGFyYW1fbGVuIC09IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKGxpc3RfbGVuLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKGxpc3RfbGVuID4gcGFyYW1fbGVuKSByZXR1cm4gTlVMTDsKLQotICBwX2VuZF9saXN0ID0gcCArIGxpc3RfbGVuOwotCi0gIC8qIExvb3AgdGhyb3VnaCwgZXh0cmFjdGluZyB0aGUgYXR0cmlidXRlIElEcyAqLwotICBmb3IgKDsgcCA8IHBfZW5kX2xpc3Q7KSB7Ci0gICAgQkVfU1RSRUFNX1RPX1VJTlQ4KGRlc2NyLCBwKTsKLSAgICB0eXBlID0gZGVzY3IgPj4gMzsKLSAgICBzaXplID0gZGVzY3IgJiA3OwotCi0gICAgaWYgKHR5cGUgIT0gVUlOVF9ERVNDX1RZUEUpIHJldHVybiBOVUxMOwotCi0gICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICBjYXNlIFNJWkVfVFdPX0JZVEVTOgotICAgICAgICBhdHRyX2xlbiA9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTSVpFX0ZPVVJfQllURVM6Ci0gICAgICAgIGF0dHJfbGVuID0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJWkVfSU5fTkVYVF9CWVRFOgotICAgICAgICBpZiAocCArIHNpemVvZih1aW50OF90KSA+IHBfZW5kX2xpc3QpIHJldHVybiBOVUxMOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDgoYXR0cl9sZW4sIHApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0laRV9JTl9ORVhUX1dPUkQ6Ci0gICAgICAgIGlmIChwICsgc2l6ZW9mKHVpbnQxNl90KSA+IHBfZW5kX2xpc3QpIHJldHVybiBOVUxMOwotICAgICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KGF0dHJfbGVuLCBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJWkVfSU5fTkVYVF9MT05HOgotICAgICAgICBpZiAocCArIHNpemVvZih1aW50MzJfdCkgPiBwX2VuZF9saXN0KSByZXR1cm4gTlVMTDsKLSAgICAgICAgQkVfU1RSRUFNX1RPX1VJTlQzMihhdHRyX2xlbiwgcCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEF0dHJpYnV0ZSBsZW5ndGggbXVzdCBiZSAyLWJ5dGVzIG9yIDQtYnl0ZXMgZm9yIGEgcGFpcmVkIGVudHJ5LiAqLwotICAgIGlmIChwICsgYXR0cl9sZW4gPiBwX2VuZF9saXN0KSByZXR1cm4gTlVMTDsKLSAgICBpZiAoYXR0cl9sZW4gPT0gMikgewotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX3NlcS0+YXR0cl9lbnRyeVtwX3NlcS0+bnVtX2F0dHJdLnN0YXJ0LCBwKTsKLSAgICAgIHBfc2VxLT5hdHRyX2VudHJ5W3Bfc2VxLT5udW1fYXR0cl0uZW5kID0KLSAgICAgICAgICBwX3NlcS0+YXR0cl9lbnRyeVtwX3NlcS0+bnVtX2F0dHJdLnN0YXJ0OwotICAgIH0gZWxzZSBpZiAoYXR0cl9sZW4gPT0gNCkgewotICAgICAgQkVfU1RSRUFNX1RPX1VJTlQxNihwX3NlcS0+YXR0cl9lbnRyeVtwX3NlcS0+bnVtX2F0dHJdLnN0YXJ0LCBwKTsKLSAgICAgIEJFX1NUUkVBTV9UT19VSU5UMTYocF9zZXEtPmF0dHJfZW50cnlbcF9zZXEtPm51bV9hdHRyXS5lbmQsIHApOwotICAgIH0gZWxzZQotICAgICAgcmV0dXJuIChOVUxMKTsKLQotICAgIC8qIFdlIGNhbiBvbmx5IGRvIHNvIG1hbnkgKi8KLSAgICBpZiAoKytwX3NlcS0+bnVtX2F0dHIgPj0gTUFYX0FUVFJfUEVSX1NFUSkgcmV0dXJuIChOVUxMKTsKLSAgfQotCi0gIHJldHVybiAocCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHB1X2dldF9sZW5fZnJvbV90eXBlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGxlbmd0aAotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90KiBzZHB1X2dldF9sZW5fZnJvbV90eXBlKHVpbnQ4X3QqIHAsIHVpbnQ4X3QqIHBfZW5kLCB1aW50OF90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX2xlbikgewotICB1aW50OF90IHU4OwotICB1aW50MTZfdCB1MTY7Ci0gIHVpbnQzMl90IHUzMjsKLQotICBzd2l0Y2ggKHR5cGUgJiA3KSB7Ci0gICAgY2FzZSBTSVpFX09ORV9CWVRFOgotICAgICAgKnBfbGVuID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0laRV9UV09fQllURVM6Ci0gICAgICAqcF9sZW4gPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSVpFX0ZPVVJfQllURVM6Ci0gICAgICAqcF9sZW4gPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSVpFX0VJR0hUX0JZVEVTOgotICAgICAgKnBfbGVuID0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0laRV9TSVhURUVOX0JZVEVTOgotICAgICAgKnBfbGVuID0gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNJWkVfSU5fTkVYVF9CWVRFOgotICAgICAgaWYgKHAgKyAxID4gcF9lbmQpIHsKLSAgICAgICAgKnBfbGVuID0gMDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDgodTgsIHApOwotICAgICAgKnBfbGVuID0gdTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNJWkVfSU5fTkVYVF9XT1JEOgotICAgICAgaWYgKHAgKyAyID4gcF9lbmQpIHsKLSAgICAgICAgKnBfbGVuID0gMDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDE2KHUxNiwgcCk7Ci0gICAgICAqcF9sZW4gPSB1MTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNJWkVfSU5fTkVYVF9MT05HOgotICAgICAgaWYgKHAgKyA0ID4gcF9lbmQpIHsKLSAgICAgICAgKnBfbGVuID0gMDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBCRV9TVFJFQU1fVE9fVUlOVDMyKHUzMiwgcCk7Ci0gICAgICAqcF9sZW4gPSAodWludDE2X3QpdTMyOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9pc19iYXNlX3V1aWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGEgMTI4LWJpdCBVVUlEIHdpdGggdGhlIGJhc2UgdG8gc2VlIGlmCi0gKiAgICAgICAgICAgICAgICAgIGl0IG1hdGNoZXMuIE9ubHkgdGhlIGxhc3QgMTIgYnl0ZXMgYXJlIGNvbXBhcmVkLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBtYXRjaGVkLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgc2RwdV9pc19iYXNlX3V1aWQodWludDhfdCogcF91dWlkKSB7Ci0gIHVpbnQxNl90IHh4OwotCi0gIGZvciAoeHggPSA0OyB4eCA8IFV1aWQ6OmtOdW1CeXRlczEyODsgeHgrKykKLSAgICBpZiAocF91dWlkW3h4XSAhPSBzZHBfYmFzZV91dWlkW3h4XSkgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogSWYgaGVyZSwgbWF0Y2hlZCAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9jb21wYXJlX3V1aWRfYXJyYXlzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNvbXBhcmVzIDIgQkUgVVVJRHMuIElmIG5lZWRlZCwgdGhleSBhcmUKLSAqICAgICAgICAgICAgICAgICAgZXhwYW5kZWQgdG8gMTI4LWJpdCBVVUlEcywgdGhlbiBjb21wYXJlZC4KLSAqCi0gKiBOT1RFICAgICAgICAgICAgIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgYXJyYXlzIGFyZSBpbiBCaWcgRW5kaWFuIGZvcm1hdAotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiBtYXRjaGVkLCBlbHNlIGZhbHNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgc2RwdV9jb21wYXJlX3V1aWRfYXJyYXlzKGNvbnN0IHVpbnQ4X3QqIHBfdXVpZDEsIHVpbnQzMl90IGxlbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX3V1aWQyLCB1aW50MTZfdCBsZW4yKSB7Ci0gIHVpbnQ4X3QgbnUxW1V1aWQ6OmtOdW1CeXRlczEyOF07Ci0gIHVpbnQ4X3QgbnUyW1V1aWQ6OmtOdW1CeXRlczEyOF07Ci0KLSAgaWYgKCgobGVuMSAhPSAyKSAmJiAobGVuMSAhPSA0KSAmJiAobGVuMSAhPSAxNikpIHx8Ci0gICAgICAoKGxlbjIgIT0gMikgJiYgKGxlbjIgIT0gNCkgJiYgKGxlbjIgIT0gMTYpKSkgewotICAgIFNEUF9UUkFDRV9FUlJPUigiJXM6IGludmFsaWQgbGVuZ3RoIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIElmIGxlbmd0aHMgbWF0Y2gsIGRvIGEgc3RyYWlnaHQgY29tcGFyZSAqLwotICBpZiAobGVuMSA9PSBsZW4yKSB7Ci0gICAgaWYgKGxlbjEgPT0gMikKLSAgICAgIHJldHVybiAoKHBfdXVpZDFbMF0gPT0gcF91dWlkMlswXSkgJiYgKHBfdXVpZDFbMV0gPT0gcF91dWlkMlsxXSkpOwotICAgIGlmIChsZW4xID09IDQpCi0gICAgICByZXR1cm4gKChwX3V1aWQxWzBdID09IHBfdXVpZDJbMF0pICYmIChwX3V1aWQxWzFdID09IHBfdXVpZDJbMV0pICYmCi0gICAgICAgICAgICAgIChwX3V1aWQxWzJdID09IHBfdXVpZDJbMl0pICYmIChwX3V1aWQxWzNdID09IHBfdXVpZDJbM10pKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKG1lbWNtcChwX3V1aWQxLCBwX3V1aWQyLCAoc2l6ZV90KWxlbjEpID09IDApOwotICB9IGVsc2UgaWYgKGxlbjEgPiBsZW4yKSB7Ci0gICAgLyogSWYgdGhlIGxlbjEgd2FzIDQtYnl0ZSwgKHNvIGxlbjIgaXMgMi1ieXRlKSwgY29tcGFyZSBvbiB0aGUgZmx5ICovCi0gICAgaWYgKGxlbjEgPT0gNCkgewotICAgICAgcmV0dXJuICgocF91dWlkMVswXSA9PSAwKSAmJiAocF91dWlkMVsxXSA9PSAwKSAmJgotICAgICAgICAgICAgICAocF91dWlkMVsyXSA9PSBwX3V1aWQyWzBdKSAmJiAocF91dWlkMVszXSA9PSBwX3V1aWQyWzFdKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vcm1hbGl6ZSBVVUlEcyB0byAxNi1ieXRlIGZvcm0sIHRoZW4gY29tcGFyZS4gTGVuMSBtdXN0IGJlIDE2ICovCi0gICAgICBtZW1jcHkobnUxLCBwX3V1aWQxLCBVdWlkOjprTnVtQnl0ZXMxMjgpOwotICAgICAgbWVtY3B5KG51Miwgc2RwX2Jhc2VfdXVpZCwgVXVpZDo6a051bUJ5dGVzMTI4KTsKLQotICAgICAgaWYgKGxlbjIgPT0gNCkKLSAgICAgICAgbWVtY3B5KG51MiwgcF91dWlkMiwgbGVuMik7Ci0gICAgICBlbHNlIGlmIChsZW4yID09IDIpCi0gICAgICAgIG1lbWNweShudTIgKyAyLCBwX3V1aWQyLCBsZW4yKTsKLQotICAgICAgcmV0dXJuIChtZW1jbXAobnUxLCBudTIsIFV1aWQ6OmtOdW1CeXRlczEyOCkgPT0gMCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIGxlbjIgaXMgZ3JlYXRlciB0aGFuIGxlbjEgKi8KLSAgICAvKiBJZiB0aGUgbGVuMiB3YXMgNC1ieXRlLCAoc28gbGVuMSBpcyAyLWJ5dGUpLCBjb21wYXJlIG9uIHRoZSBmbHkgKi8KLSAgICBpZiAobGVuMiA9PSA0KSB7Ci0gICAgICByZXR1cm4gKChwX3V1aWQyWzBdID09IDApICYmIChwX3V1aWQyWzFdID09IDApICYmCi0gICAgICAgICAgICAgIChwX3V1aWQyWzJdID09IHBfdXVpZDFbMF0pICYmIChwX3V1aWQyWzNdID09IHBfdXVpZDFbMV0pKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogTm9ybWFsaXplIFVVSURzIHRvIDE2LWJ5dGUgZm9ybSwgdGhlbiBjb21wYXJlLiBMZW4xIG11c3QgYmUgMTYgKi8KLSAgICAgIG1lbWNweShudTIsIHBfdXVpZDIsIFV1aWQ6OmtOdW1CeXRlczEyOCk7Ci0gICAgICBtZW1jcHkobnUxLCBzZHBfYmFzZV91dWlkLCBVdWlkOjprTnVtQnl0ZXMxMjgpOwotCi0gICAgICBpZiAobGVuMSA9PSA0KQotICAgICAgICBtZW1jcHkobnUxLCBwX3V1aWQxLCAoc2l6ZV90KWxlbjEpOwotICAgICAgZWxzZSBpZiAobGVuMSA9PSAyKQotICAgICAgICBtZW1jcHkobnUxICsgMiwgcF91dWlkMSwgKHNpemVfdClsZW4xKTsKLQotICAgICAgcmV0dXJuIChtZW1jbXAobnUxLCBudTIsIFV1aWQ6OmtOdW1CeXRlczEyOCkgPT0gMCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHB1X2NvbXBhcmVfdXVpZF93aXRoX2F0dHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgYSBCVCBVVUlEIHN0cnVjdHVyZSB3aXRoIHRoZSBVVUlEIGluCi0gKiAgICAgICAgICAgICAgICAgIGFuIFNEUCBhdHRyaWJ1dGUgcmVjb3JkLiBJZiBuZWVkZWQsIHRoZXkgYXJlIGV4cGFuZGVkIHRvCi0gKiAgICAgICAgICAgICAgICAgIDEyOC1iaXQgVVVJRHMsIHRoZW4gY29tcGFyZWQuCi0gKgotICogTk9URSAgICAgICAgICAgLSBpdCBpcyBhc3N1bWVkIHRoYXQgQlQgVVVJRCBzdHJ1Y3R1cmVzIGFyZSBjb21wcmVzc2VkIHRvIHRoZQotICogICAgICAgICAgICAgICAgICBzbWFsbGVzdCBwb3NzaWJsZSBVVUlEcyAoYnkgcmVtb3ZpbmcgdGhlIGJhc2UgU0RQIFVVSUQpLgotICogICAgICAgICAgICAgICAgLSBpdCBpcyBhbHNvIGFzc3VtZWQgdGhhdCB0aGUgZGlzY292ZXJ5IGF0cmlidXRlIGlzIGNvbXByZXNzZWQKLSAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIG1hdGNoZWQsIGVsc2UgZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBzZHB1X2NvbXBhcmVfdXVpZF93aXRoX2F0dHIoY29uc3QgVXVpZCYgdXVpZCwgdFNEUF9ESVNDX0FUVFIqIHBfYXR0cikgewotICBpbnQgbGVuID0gdXVpZC5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpOwotICBpZiAobGVuID09IDIpIHJldHVybiB1dWlkLkFzMTZCaXQoKSA9PSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7Ci0gIGlmIChsZW4gPT0gNCkgcmV0dXJuIHV1aWQuQXMzMkJpdCgpID09IHBfYXR0ci0+YXR0cl92YWx1ZS52LnUzMjsKLSAgaWYgKG1lbWNtcCh1dWlkLlRvMTI4Qml0QkUoKS5kYXRhKCksICh2b2lkKilwX2F0dHItPmF0dHJfdmFsdWUudi5hcnJheSwKLSAgICAgICAgICAgICBVdWlkOjprTnVtQnl0ZXMxMjgpID09IDApCi0gICAgcmV0dXJuICh0cnVlKTsKLQotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcHVfc29ydF9hdHRyX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNvcnRzIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGluIG51bWVyaWMgb3JkZXIgZnJvbSBsb3dlc3QgdG8KLSAqICAgICAgICAgICAgICAgICAgaGlnaGVzdCB0byBjb25mb3JtIHRvIFNEUCBzcGVjaWZpY2F0aW9uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc2RwdV9zb3J0X2F0dHJfbGlzdCh1aW50MTZfdCBudW1fYXR0ciwgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIpIHsKLSAgdWludDE2X3QgaTsKLSAgdWludDE2X3QgeDsKLQotICAvKiBEb25lIGlmIG5vIGF0dHJpYnV0ZXMgdG8gc29ydCAqLwotICBpZiAobnVtX2F0dHIgPD0gMSkgewotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChudW1fYXR0ciA+IFNEUF9NQVhfQVRUUl9GSUxURVJTKSB7Ci0gICAgbnVtX2F0dHIgPSBTRFBfTUFYX0FUVFJfRklMVEVSUzsKLSAgfQotCi0gIG51bV9hdHRyLS07IC8qIGZvciB0aGUgZm9yLWxvb3AgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9hdHRyOykgewotICAgIGlmIChwX2RiLT5hdHRyX2ZpbHRlcnNbaV0gPiBwX2RiLT5hdHRyX2ZpbHRlcnNbaSArIDFdKSB7Ci0gICAgICAvKiBzd2FwIHRoZSBhdHRyaWJ1dGUgSURzIGFuZCBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KLSAgICAgIHggPSBwX2RiLT5hdHRyX2ZpbHRlcnNbaV07Ci0gICAgICBwX2RiLT5hdHRyX2ZpbHRlcnNbaV0gPSBwX2RiLT5hdHRyX2ZpbHRlcnNbaSArIDFdOwotICAgICAgcF9kYi0+YXR0cl9maWx0ZXJzW2kgKyAxXSA9IHg7Ci0KLSAgICAgIGkgPSAwOwotICAgIH0gZWxzZQotICAgICAgaSsrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHB1X2dldF9saXN0X2xlbgotICoKLSAqIERlc2NyaXB0aW9uICAgICAgZ2V0cyB0aGUgdG90YWwgbGlzdCBsZW5ndGggaW4gdGhlIHNkcCBkYXRhYmFzZSBmb3IgYSBnaXZlbgotICogICAgICAgICAgICAgICAgICB1aWQgc2VxdWVuY2UgYW5kIGF0dHIgc2VxdWVuY2UKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3Qgc2RwdV9nZXRfbGlzdF9sZW4odFNEUF9VVUlEX1NFUSogdWlkX3NlcSwgdFNEUF9BVFRSX1NFUSogYXR0cl9zZXEpIHsKLSAgY29uc3QgdFNEUF9SRUNPUkQqIHBfcmVjOwotICB1aW50MTZfdCBsZW4gPSAwOwotICB1aW50MTZfdCBsZW4xOwotCi0gIGZvciAocF9yZWMgPSBzZHBfZGJfc2VydmljZV9zZWFyY2goTlVMTCwgdWlkX3NlcSk7IHBfcmVjOwotICAgICAgIHBfcmVjID0gc2RwX2RiX3NlcnZpY2Vfc2VhcmNoKHBfcmVjLCB1aWRfc2VxKSkgewotICAgIGxlbiArPSAzOwotCi0gICAgbGVuMSA9IHNkcHVfZ2V0X2F0dHJpYl9zZXFfbGVuKHBfcmVjLCBhdHRyX3NlcSk7Ci0KLSAgICBpZiAobGVuMSAhPSAwKQotICAgICAgbGVuICs9IGxlbjE7Ci0gICAgZWxzZQotICAgICAgbGVuIC09IDM7Ci0gIH0KLSAgcmV0dXJuIGxlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNkcHVfZ2V0X2F0dHJpYl9zZXFfbGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBnZXRzIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmljIGF0dHJpYnV0ZXMgaW4gYSBnaXZlbgotICogICAgICAgICAgICAgICAgICBzZHAgcmVjb3JkCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IHNkcHVfZ2V0X2F0dHJpYl9zZXFfbGVuKGNvbnN0IHRTRFBfUkVDT1JEKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRTRFBfQVRUUl9TRVEqIGF0dHJfc2VxKSB7Ci0gIGNvbnN0IHRTRFBfQVRUUklCVVRFKiBwX2F0dHI7Ci0gIHVpbnQxNl90IGxlbjEgPSAwOwotICB1aW50MTZfdCB4eDsKLSAgYm9vbCBpc19yYW5nZSA9IGZhbHNlOwotICB1aW50MTZfdCBzdGFydF9pZCA9IDAsIGVuZF9pZCA9IDA7Ci0KLSAgZm9yICh4eCA9IDA7IHh4IDwgYXR0cl9zZXEtPm51bV9hdHRyOyB4eCsrKSB7Ci0gICAgaWYgKCFpc19yYW5nZSkgewotICAgICAgc3RhcnRfaWQgPSBhdHRyX3NlcS0+YXR0cl9lbnRyeVt4eF0uc3RhcnQ7Ci0gICAgICBlbmRfaWQgPSBhdHRyX3NlcS0+YXR0cl9lbnRyeVt4eF0uZW5kOwotICAgIH0KLSAgICBwX2F0dHIgPSBzZHBfZGJfZmluZF9hdHRyX2luX3JlYyhwX3JlYywgc3RhcnRfaWQsIGVuZF9pZCk7Ci0gICAgaWYgKHBfYXR0cikgewotICAgICAgbGVuMSArPSBzZHB1X2dldF9hdHRyaWJfZW50cnlfbGVuKHBfYXR0cik7Ci0KLSAgICAgIC8qIElmIGRvaW5nIGEgcmFuZ2UsIHN0aWNrIHdpdGggdGhpcyBvbmUgdGlsbCBubyBtb3JlIGF0dHJpYnV0ZXMgZm91bmQgKi8KLSAgICAgIGlmIChzdGFydF9pZCAhPSBlbmRfaWQpIHsKLSAgICAgICAgLyogVXBkYXRlIGZvciBuZXh0IHRpbWUgdGhyb3VnaCAqLwotICAgICAgICBzdGFydF9pZCA9IHBfYXR0ci0+aWQgKyAxOwotICAgICAgICB4eC0tOwotICAgICAgICBpc19yYW5nZSA9IHRydWU7Ci0gICAgICB9IGVsc2UKLSAgICAgICAgaXNfcmFuZ2UgPSBmYWxzZTsKLSAgICB9IGVsc2UKLSAgICAgIGlzX3JhbmdlID0gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGxlbjE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzZHB1X2dldF9hdHRyaWJfZW50cnlfbGVuCi0gKgotICogRGVzY3JpcHRpb24gICAgICBnZXRzIHRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBhdHRyaWJ1dGUKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3Qgc2RwdV9nZXRfYXR0cmliX2VudHJ5X2xlbihjb25zdCB0U0RQX0FUVFJJQlVURSogcF9hdHRyKSB7Ci0gIHVpbnQxNl90IGxlbiA9IDM7Ci0KLSAgLyogdGhlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgZGIgcmVjb3JkLgotICAgKiBhc3N1bWluZyB0aGUgYXR0cmlidXRlIGxlbiBpcyBsZXNzIHRoYW4gU0RQX01BWF9BVFRSX0xFTiAqLwotICBzd2l0Y2ggKHBfYXR0ci0+dHlwZSkgewotICAgIGNhc2UgVEVYVF9TVFJfREVTQ19UWVBFOiAgICAgLyogNCAqLwotICAgIGNhc2UgREFUQV9FTEVfU0VRX0RFU0NfVFlQRTogLyogNiAqLwotICAgIGNhc2UgREFUQV9FTEVfQUxUX0RFU0NfVFlQRTogLyogNyAqLwotICAgIGNhc2UgVVJMX0RFU0NfVFlQRTogICAgICAgICAgLyogOCAqLwotI2lmIChTRFBfTUFYX0FUVFJfTEVOID4gMHhGRkZGKQotICAgICAgaWYgKHBfYXR0ci0+bGVuID4gMHhGRkZGKSB7Ci0gICAgICAgIGxlbiArPSA1OwotICAgICAgfSBlbHNlCi0jZW5kaWYgLyogMHhGRkZGIC0gMHhGRiAqLwotI2lmIChTRFBfTUFYX0FUVFJfTEVOID4gMHhGRikKLSAgICAgICAgICBpZiAocF9hdHRyLT5sZW4gPiAweEZGKSB7Ci0gICAgICAgIGxlbiArPSAzOwotICAgICAgfSBlbHNlCi0jZW5kaWYgLyogMHhGRiBhbmQgbGVzcyovCi0gICAgICB7Ci0gICAgICAgIGxlbiArPSAyOwotICAgICAgfQotICAgICAgbGVuICs9IHBfYXR0ci0+bGVuOwotICAgICAgcmV0dXJuIGxlbjsKLSAgfQotCi0gIC8qIE5vdywgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLwotICBzd2l0Y2ggKHBfYXR0ci0+bGVuKSB7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA4OgotICAgIGNhc2UgMTY6Ci0gICAgICBsZW4gKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBsZW4gKz0gMjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgbGVuICs9IHBfYXR0ci0+bGVuOwotICByZXR1cm4gbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9idWlsZF9wYXJ0aWFsX2F0dHJpYl9lbnRyeQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBmaWxscyBhIGJ1ZmZlciB3aXRoIHBhcnRpYWwgYXR0cmlidXRlLiBJdCBpcwotICogICAgICAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgdGhlIG1heGltdW0gc2l6ZSBvZiBhbnkgYXR0cmlidXRlIGlzIDI1NiBieXRlcy4KLSAqCi0gKiAgICAgICAgICAgICAgICAgIHBfb3V0OiBvdXRwdXQgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgIHBfYXR0cjogYXR0cmlidXRlIHRvIGJlIGNvcGllZCBwYXJ0aWFsbHkgaW50byBwX291dAotICogICAgICAgICAgICAgICAgICByZW1fbGVuOiBudW0gYnl0ZXMgdG8gY29weSBpbnRvIHBfb3V0Ci0gKiAgICAgICAgICAgICAgICAgIG9mZnNldDogY3VycmVudCBzdGFydCBvZmZzZXQgd2l0aGluIHRoZSBhdHRyIHRoYXQgbmVlZHMgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb3BpZWQKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gbmV4dCBieXRlIGluIHRoZSBvdXRwdXQgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICBvZmZzZXQgaXMgYWxzbyB1cGRhdGVkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QqIHNkcHVfYnVpbGRfcGFydGlhbF9hdHRyaWJfZW50cnkodWludDhfdCogcF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRTRFBfQVRUUklCVVRFKiBwX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDE2X3QqIG9mZnNldCkgewotICB1aW50OF90KiBwX2F0dHJfYnVmZiA9Ci0gICAgICAodWludDhfdCopb3NpX21hbGxvYyhzaXplb2YodWludDhfdCkgKiBTRFBfTUFYX0FUVFJfTEVOKTsKLSAgc2RwdV9idWlsZF9hdHRyaWJfZW50cnkocF9hdHRyX2J1ZmYsIHBfYXR0cik7Ci0KLSAgdWludDE2X3QgYXR0cl9sZW4gPSBzZHB1X2dldF9hdHRyaWJfZW50cnlfbGVuKHBfYXR0cik7Ci0KLSAgaWYgKGxlbiA+IFNEUF9NQVhfQVRUUl9MRU4pIHsKLSAgICBTRFBfVFJBQ0VfRVJST1IoIiVzIGxlbiAlZCBleGNlZWRzIFNEUF9NQVhfQVRUUl9MRU4iLCBfX2Z1bmNfXywgbGVuKTsKLSAgICBsZW4gPSBTRFBfTUFYX0FUVFJfTEVOOwotICB9Ci0KLSAgc2l6ZV90IGxlbl90b19jb3B5ID0KLSAgICAgICgoYXR0cl9sZW4gLSAqb2Zmc2V0KSA8IGxlbikgPyAoYXR0cl9sZW4gLSAqb2Zmc2V0KSA6IGxlbjsKLSAgbWVtY3B5KHBfb3V0LCAmcF9hdHRyX2J1ZmZbKm9mZnNldF0sIGxlbl90b19jb3B5KTsKLQotICBwX291dCA9ICZwX291dFtsZW5fdG9fY29weV07Ci0gICpvZmZzZXQgKz0gbGVuX3RvX2NvcHk7Ci0KLSAgb3NpX2ZyZWUocF9hdHRyX2J1ZmYpOwotICByZXR1cm4gcF9vdXQ7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc2RwdV9pc19hdnJjcF9wcm9maWxlX2Rlc2NyaXB0aW9uX2xpc3QKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gY2hlY2sgaWYgYXR0aXJidXRlIGNvbnRhaW4gQVZSQ1AgcHJvZmlsZQotICogICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBsaXN0Ci0gKgotICogICAgICAgICAgICAgICAgICBwX2F0dHI6IGF0dGlidXRlIHRvIGJlIGNoZWNrCi0gKgotICogUmV0dXJucyAgICAgICAgICBBVlJDUCBwcm9maWxlIHZlcnNpb24gaWYgbWF0Y2hlZCwgZWxzZSAwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQxNl90IHNkcHVfaXNfYXZyY3BfcHJvZmlsZV9kZXNjcmlwdGlvbl9saXN0KGNvbnN0IHRTRFBfQVRUUklCVVRFKiBwX2F0dHIpIHsKLSAgaWYgKHBfYXR0ci0+aWQgIT0gQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVCB8fCBwX2F0dHItPmxlbiAhPSA4KSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB1aW50OF90KiBwX3V1aWQgPSBwX2F0dHItPnZhbHVlX3B0ciArIDM7Ci0gIC8vIENoZWNrIGlmIEFWUkNQIHByb2ZpbGUgVVVJRAotICBpZiAocF91dWlkWzBdICE9IDB4MTEgfHwgcF91dWlkWzFdICE9IDB4ZSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHVpbnQ4X3QgcF92ZXJzaW9uID0gKihwX3V1aWQgKyA0KTsKLSAgc3dpdGNoIChwX3ZlcnNpb24pIHsKLSAgICBjYXNlIDB4MDoKLSAgICAgIHJldHVybiBBVlJDX1JFVl8xXzA7Ci0gICAgY2FzZSAweDM6Ci0gICAgICByZXR1cm4gQVZSQ19SRVZfMV8zOwotICAgIGNhc2UgMHg0OgotICAgICAgcmV0dXJuIEFWUkNfUkVWXzFfNDsKLSAgICBjYXNlIDB4NToKLSAgICAgIHJldHVybiBBVlJDX1JFVl8xXzU7Ci0gICAgY2FzZSAweDY6Ci0gICAgICByZXR1cm4gQVZSQ19SRVZfMV82OwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc2RwL3NkcGludC5oIGIvc3RhY2svc2RwL3NkcGludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDgxNmRkLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3NkcC9zZHBpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBpbnRlcm5hbGx5IHVzZWQgU0RQIGRlZmluaXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBTRFBfSU5UX0gKLSNkZWZpbmUgU0RQX0lOVF9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLyogQ29udGludWF0aW9uIGxlbmd0aCAtIHdlIHVzZSBhIDItYnl0ZSBvZmZzZXQgKi8KLSNkZWZpbmUgU0RQX0NPTlRJTlVBVElPTl9MRU4gMgotI2RlZmluZSBTRFBfTUFYX0NPTlRJTlVBVElPTl9MRU4gMTYgLyogQXMgcGVyIHRoZSBzcGVjICovCi0KLS8qIFRpbWVvdXQgZGVmaW5pdGlvbnMuICovCi0jZGVmaW5lIFNEUF9JTkFDVF9USU1FT1VUX01TICgzMCAqIDEwMDApIC8qIEluYWN0aXZpdHkgdGltZW91dCAoaW4gbXMpICovCi0KLS8qIERlZmluZSB0aGUgUHJvdG9jb2wgRGF0YSBVbml0IChQRFUpIHR5cGVzLgotICovCi0jZGVmaW5lIFNEUF9QRFVfRVJST1JfUkVTUE9OU0UgMHgwMQotI2RlZmluZSBTRFBfUERVX1NFUlZJQ0VfU0VBUkNIX1JFUSAweDAyCi0jZGVmaW5lIFNEUF9QRFVfU0VSVklDRV9TRUFSQ0hfUlNQIDB4MDMKLSNkZWZpbmUgU0RQX1BEVV9TRVJWSUNFX0FUVFJfUkVRIDB4MDQKLSNkZWZpbmUgU0RQX1BEVV9TRVJWSUNFX0FUVFJfUlNQIDB4MDUKLSNkZWZpbmUgU0RQX1BEVV9TRVJWSUNFX1NFQVJDSF9BVFRSX1JFUSAweDA2Ci0jZGVmaW5lIFNEUF9QRFVfU0VSVklDRV9TRUFSQ0hfQVRUUl9SU1AgMHgwNwotCi0vKiBNYXggVVVJRHMgYW5kIGF0dHJpYnV0ZXMgd2Ugc3VwcG9ydCBwZXIgc2VxdWVuY2UgKi8KLSNkZWZpbmUgTUFYX1VVSURTX1BFUl9TRVEgMTYKLSNkZWZpbmUgTUFYX0FUVFJfUEVSX1NFUSAxNgotCi0vKiBNYXggbGVuZ3RoIHdlIHN1cHBvcnQgZm9yIGFueSBhdHRyaWJ1dGUgKi8KLSNpZmRlZiBTRFBfTUFYX0FUVFJfTEVOCi0jZGVmaW5lIE1BWF9BVFRSX0xFTiBTRFBfTUFYX0FUVFJfTEVOCi0jZWxzZQotI2RlZmluZSBNQVhfQVRUUl9MRU4gMjU2Ci0jZW5kaWYKLQotLyogSW50ZXJuYWwgVVVJRCBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQ4X3QgdmFsdWVbYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMxMjhdOwotfSB0VUlEX0VOVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBudW1fdWlkczsKLSAgdFVJRF9FTlQgdXVpZF9lbnRyeVtNQVhfVVVJRFNfUEVSX1NFUV07Ci19IHRTRFBfVVVJRF9TRVE7Ci0KLS8qIEludGVybmFsIGF0dHJpYnV0ZSBzZXF1ZW5jZSBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBzdGFydDsKLSAgdWludDE2X3QgZW5kOwotfSB0QVRUX0VOVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCBudW1fYXR0cjsKLSAgdEFUVF9FTlQgYXR0cl9lbnRyeVtNQVhfQVRUUl9QRVJfU0VRXTsKLX0gdFNEUF9BVFRSX1NFUTsKLQotLyogRGVmaW5lIHRoZSBhdHRyaWJ1dGUgZWxlbWVudCBvZiB0aGUgU0RQIGRhdGFiYXNlIHJlY29yZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBsZW47ICAgICAgIC8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgZW50cnkgKi8KLSAgdWludDhfdCogdmFsdWVfcHRyOyAvKiBQb2ludHMgdG8gYXR0cl9wYWQgKi8KLSAgdWludDE2X3QgaWQ7Ci0gIHVpbnQ4X3QgdHlwZTsKLX0gdFNEUF9BVFRSSUJVVEU7Ci0KLS8qIEFuIFNEUCByZWNvcmQgY29uc2lzdHMgb2YgYSBoYW5kbGUsIGFuZCAxIG9yIG1vcmUgYXR0cmlidXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCByZWNvcmRfaGFuZGxlOwotICB1aW50MzJfdCBmcmVlX3BhZF9wdHI7Ci0gIHVpbnQxNl90IG51bV9hdHRyaWJ1dGVzOwotICB0U0RQX0FUVFJJQlVURSBhdHRyaWJ1dGVbU0RQX01BWF9SRUNfQVRUUl07Ci0gIHVpbnQ4X3QgYXR0cl9wYWRbU0RQX01BWF9QQURfTEVOXTsKLX0gdFNEUF9SRUNPUkQ7Ci0KLS8qIERlZmluZSB0aGUgU0RQIGRhdGFiYXNlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90Ci0gICAgICBkaV9wcmltYXJ5X2hhbmRsZTsgLyogRGV2aWNlIElEIFByaW1hcnkgcmVjb3JkIG9yIE5VTEwgaWYgbm9uZXhpc3RlbnQgKi8KLSAgdWludDE2X3QgbnVtX3JlY29yZHM7Ci0gIHRTRFBfUkVDT1JEIHJlY29yZFtTRFBfTUFYX1JFQ09SRFNdOwotfSB0U0RQX0RCOwotCi0vKiBDb250aW51YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBTRFAgc2VydmVyIHJlc3BvbnNlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IG5leHRfYXR0cl9pbmRleDsgICAgLyogYXR0ciBpbmRleCBmb3IgbmV4dCBjb250aW51YXRpb24gcmVzcG9uc2UgKi8KLSAgdWludDE2X3QgbmV4dF9hdHRyX3N0YXJ0X2lkOyAvKiBhdHRyIGlkIHRvIHN0YXJ0IHdpdGggZm9yIHRoZSBhdHRyIGluZGV4IGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBjb250LiByZXNwb25zZSAqLwotICBjb25zdCB0U0RQX1JFQ09SRCogcHJldl9zZHBfcmVjOyAvKiBsYXN0IHNkcCByZWNvcmQgdGhhdCB3YXMgY29tcGxldGVseSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXNwb25zZSAqLwotICBib29sIGxhc3RfYXR0cl9zZXFfZGVzY19zZW50OyAvKiB3aGV0aGVyIGF0dHIgc2VxIGxlbmd0aCBoYXMgYmVlbiBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgKi8KLSAgdWludDE2X3QgYXR0cl9vZmZzZXQ7IC8qIG9mZnNldCB3aXRoaW4gdGhlIGF0dHIgdG8ga2VlcCB0cmFrIG9mIHBhcnRpYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhlIHJlc3BvbnNlcyAqLwotfSB0U0RQX0NPTlRfSU5GTzsKLQotLyogRGVmaW5lIHRoZSBTRFAgQ29ubmVjdGlvbiBDb250cm9sIEJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0jZGVmaW5lIFNEUF9TVEFURV9JRExFIDAKLSNkZWZpbmUgU0RQX1NUQVRFX0NPTk5fU0VUVVAgMQotI2RlZmluZSBTRFBfU1RBVEVfQ0ZHX1NFVFVQIDIKLSNkZWZpbmUgU0RQX1NUQVRFX0NPTk5FQ1RFRCAzCi0gIHVpbnQ4X3QgY29uX3N0YXRlOwotCi0jZGVmaW5lIFNEUF9GTEFHU19JU19PUklHIDB4MDEKLSNkZWZpbmUgU0RQX0ZMQUdTX0hJU19DRkdfRE9ORSAweDAyCi0jZGVmaW5lIFNEUF9GTEFHU19NWV9DRkdfRE9ORSAweDA0Ci0gIHVpbnQ4X3QgY29uX2ZsYWdzOwotCi0gIFJhd0FkZHJlc3MgZGV2aWNlX2FkZHJlc3M7Ci0gIGFsYXJtX3QqIHNkcF9jb25uX3RpbWVyOwotICB1aW50MTZfdCByZW1fbXR1X3NpemU7Ci0gIHVpbnQxNl90IGNvbm5lY3Rpb25faWQ7Ci0gIHVpbnQxNl90IGxpc3RfbGVuOyAvKiBsZW5ndGggb2YgdGhlIHJlc3BvbnNlIGluIHRoZSBHS0kgYnVmZmVyICovCi0gIHVpbnQ4X3QqIHJzcF9saXN0OyAvKiBwb2ludGVyIHRvIEdLSSBidWZmZXIgaG9sZGluZyByZXNwb25zZSAqLwotCi0gIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiOyAvKiBEYXRhYmFzZSB0byBzYXZlIGluZm8gaW50byAgICovCi0gIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiOyAvKiBDYWxsYmFjayBmb3IgZGlzY292ZXJ5IGRvbmUgICovCi0gIHRTRFBfRElTQ19DTVBMX0NCMioKLSAgICAgIHBfY2IyOyAvKiBDYWxsYmFjayBmb3IgZGlzY292ZXJ5IGRvbmUgcGlnZ3kgYmFjayB3aXRoIHRoZSB1c2VyIGRhdGEgKi8KLSAgY29uc3Qgdm9pZCogdXNlcl9kYXRhOyAvKiBwaWdneSBiYWNrIHVzZXIgZGF0YSAqLwotICB1aW50MzJfdAotICAgICAgaGFuZGxlc1tTRFBfTUFYX0RJU0NfU0VSVkVSX1JFQ1NdOyAvKiBEaXNjb3ZlcmVkIHNlcnZlciByZWNvcmQgaGFuZGxlcyAqLwotICB1aW50MTZfdCBudW1faGFuZGxlczsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2VydmVyIGhhbmRsZXMgICAgICovCi0gIHVpbnQxNl90IGN1cl9oYW5kbGU7ICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgaGFuZGxlIGJlaW5nIHByb2Nlc3NlZCAqLwotICB1aW50MTZfdCB0cmFuc2FjdGlvbl9pZDsKLSAgdWludDE2X3QgZGlzY29ubmVjdF9yZWFzb247IC8qIERpc2Nvbm5lY3QgcmVhc29uICAgICAgICAgICAgKi8KLQotI2RlZmluZSBTRFBfRElTQ19XQUlUX0NPTk4gMAotI2RlZmluZSBTRFBfRElTQ19XQUlUX0hBTkRMRVMgMQotI2RlZmluZSBTRFBfRElTQ19XQUlUX0FUVFIgMgotI2RlZmluZSBTRFBfRElTQ19XQUlUX1NFQVJDSF9BVFRSIDMKLSNkZWZpbmUgU0RQX0RJU0NfV0FJVF9DQU5DRUwgNQotCi0gIHVpbnQ4X3QgZGlzY19zdGF0ZTsKLSAgdWludDhfdCBpc19hdHRyX3NlYXJjaDsKLQotICB1aW50MTZfdCBjb250X29mZnNldDsgICAgIC8qIENvbnRpbnVhdGlvbiBzdGF0ZSBkYXRhIGluIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgKi8KLSAgdFNEUF9DT05UX0lORk8gY29udF9pbmZvOyAvKiBzdHJ1Y3R1cmUgdG8gaG9sZCBjb250aW51YXRpb24gaW5mb3JtYXRpb24gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZlciByZXNwb25zZSAqLwotCi19IHRDT05OX0NCOwotCi0vKiAgVGhlIG1haW4gU0RQIGNvbnRyb2wgYmxvY2sgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdEwyQ0FQX0NGR19JTkZPIGwyY2FwX215X2NmZzsgLyogTXkgTDJDQVAgY29uZmlnICAgICAqLwotICB0Q09OTl9DQiBjY2JbU0RQX01BWF9DT05ORUNUSU9OU107Ci0gIHRTRFBfREIgc2VydmVyX2RiOwotICB0TDJDQVBfQVBQTF9JTkZPIHJlZ19pbmZvOyAgICAvKiBMMkNBUCBSZWdpc3RyYXRpb24gaW5mbyAqLwotICB1aW50MTZfdCBtYXhfYXR0cl9saXN0X3NpemU7ICAvKiBNYXggYXR0cmlidXRlIGxpc3Qgc2l6ZSB0byB1c2UgICAqLwotICB1aW50MTZfdCBtYXhfcmVjc19wZXJfc2VhcmNoOyAvKiBNYXggcmVjb3JkcyB3ZSB3YW50IHBlciBzZWFhcmNoICAqLwotICB1aW50OF90IHRyYWNlX2xldmVsOwotfSB0U0RQX0NCOwotCi0vKiBHbG9iYWwgU0RQIGRhdGEgKi8KLWV4dGVybiB0U0RQX0NCIHNkcF9jYjsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHNkcF9tYWluLmNjICovCi1leHRlcm4gdm9pZCBzZHBfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHNkcF9mcmVlKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2RwX2Rpc2Nvbm5lY3QodENPTk5fQ0IqIHBfY2NiLCB0U0RQX1JFQVNPTiByZWFzb24pOwotCi1leHRlcm4gdm9pZCBzZHBfY29ubl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpOwotCi1leHRlcm4gdENPTk5fQ0IqIHNkcF9jb25uX29yaWdpbmF0ZShjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIpOwotCi0vKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgc2RwX3V0aWxzLmNjCi0gKi8KLWV4dGVybiB2b2lkIHNkcHVfbG9nX2F0dHJpYnV0ZV9tZXRyaWNzKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiKTsKLWV4dGVybiB0Q09OTl9DQiogc2RwdV9maW5kX2NjYl9ieV9jaWQodWludDE2X3QgY2lkKTsKLWV4dGVybiB0Q09OTl9DQiogc2RwdV9maW5kX2NjYl9ieV9kYihjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYik7Ci1leHRlcm4gdENPTk5fQ0IqIHNkcHVfYWxsb2NhdGVfY2NiKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2RwdV9yZWxlYXNlX2NjYih0Q09OTl9DQiogcF9jY2IpOwotCi1leHRlcm4gdWludDhfdCogc2RwdV9idWlsZF9hdHRyaWJfc2VxKHVpbnQ4X3QqIHBfb3V0LCB1aW50MTZfdCogcF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fYXR0cnMpOwotZXh0ZXJuIHVpbnQ4X3QqIHNkcHVfYnVpbGRfYXR0cmliX2VudHJ5KHVpbnQ4X3QqIHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRTRFBfQVRUUklCVVRFKiBwX2F0dHIpOwotZXh0ZXJuIHZvaWQgc2RwdV9idWlsZF9uX3NlbmRfZXJyb3IodENPTk5fQ0IqIHBfY2NiLCB1aW50MTZfdCB0cmFuc19udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcnJvcl9jb2RlLCBjaGFyKiBwX2Vycm9yX3RleHQpOwotCi1leHRlcm4gdWludDhfdCogc2RwdV9leHRyYWN0X2F0dHJfc2VxKHVpbnQ4X3QqIHAsIHVpbnQxNl90IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9BVFRSX1NFUSogcF9zZXEpOwotZXh0ZXJuIHVpbnQ4X3QqIHNkcHVfZXh0cmFjdF91aWRfc2VxKHVpbnQ4X3QqIHAsIHVpbnQxNl90IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1VVSURfU0VRKiBwX3NlcSk7Ci0KLWV4dGVybiB1aW50OF90KiBzZHB1X2dldF9sZW5fZnJvbV90eXBlKHVpbnQ4X3QqIHAsIHVpbnQ4X3QqIHBfZW5kLCB1aW50OF90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF9sZW4pOwotZXh0ZXJuIGJvb2wgc2RwdV9pc19iYXNlX3V1aWQodWludDhfdCogcF91dWlkKTsKLWV4dGVybiBib29sIHNkcHVfY29tcGFyZV91dWlkX2FycmF5cyhjb25zdCB1aW50OF90KiBwX3V1aWQxLCB1aW50MzJfdCBsZW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfdXVpZDIsIHVpbnQxNl90IGxlbjIpOwotZXh0ZXJuIGJvb2wgc2RwdV9jb21wYXJlX3V1aWRfd2l0aF9hdHRyKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQVRUUiogcF9hdHRyKTsKLQotZXh0ZXJuIHZvaWQgc2RwdV9zb3J0X2F0dHJfbGlzdCh1aW50MTZfdCBudW1fYXR0ciwgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIpOwotZXh0ZXJuIHVpbnQxNl90IHNkcHVfZ2V0X2xpc3RfbGVuKHRTRFBfVVVJRF9TRVEqIHVpZF9zZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9BVFRSX1NFUSogYXR0cl9zZXEpOwotZXh0ZXJuIHVpbnQxNl90IHNkcHVfZ2V0X2F0dHJpYl9zZXFfbGVuKGNvbnN0IHRTRFBfUkVDT1JEKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0U0RQX0FUVFJfU0VRKiBhdHRyX3NlcSk7Ci1leHRlcm4gdWludDE2X3Qgc2RwdV9nZXRfYXR0cmliX2VudHJ5X2xlbihjb25zdCB0U0RQX0FUVFJJQlVURSogcF9hdHRyKTsKLWV4dGVybiB1aW50OF90KiBzZHB1X2J1aWxkX3BhcnRpYWxfYXR0cmliX2VudHJ5KHVpbnQ4X3QqIHBfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdFNEUF9BVFRSSUJVVEUqIHBfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgdWludDE2X3QqIG9mZnNldCk7Ci1leHRlcm4gdWludDE2X3Qgc2RwdV9pc19hdnJjcF9wcm9maWxlX2Rlc2NyaXB0aW9uX2xpc3QoCi0gICAgY29uc3QgdFNEUF9BVFRSSUJVVEUqIHBfYXR0cik7Ci0KLS8qIEZ1bmN0aW9ucyBwcm92aWRlZCBieSBzZHBfZGIuY2MKLSAqLwotZXh0ZXJuIGNvbnN0IHRTRFBfUkVDT1JEKiBzZHBfZGJfc2VydmljZV9zZWFyY2goY29uc3QgdFNEUF9SRUNPUkQqIHBfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdFNEUF9VVUlEX1NFUSogcF9zZXEpOwotZXh0ZXJuIHRTRFBfUkVDT1JEKiBzZHBfZGJfZmluZF9yZWNvcmQodWludDMyX3QgaGFuZGxlKTsKLWV4dGVybiBjb25zdCB0U0RQX0FUVFJJQlVURSogc2RwX2RiX2ZpbmRfYXR0cl9pbl9yZWMoY29uc3QgdFNEUF9SRUNPUkQqIHBfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdGFydF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfYXR0cik7Ci0KLS8qIEZ1bmN0aW9ucyBwcm92aWRlZCBieSBzZHBfc2VydmVyLmNjCi0gKi8KLWV4dGVybiB2b2lkIHNkcF9zZXJ2ZXJfaGFuZGxlX2NsaWVudF9yZXEodENPTk5fQ0IqIHBfY2NiLCBCVF9IRFIqIHBfbXNnKTsKLQotLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHNkcF9kaXNjb3ZlcnkuY2MKLSAqLwotZXh0ZXJuIHZvaWQgc2RwX2Rpc2NfY29ubmVjdGVkKHRDT05OX0NCKiBwX2NjYik7Ci1leHRlcm4gdm9pZCBzZHBfZGlzY19zZXJ2ZXJfcnNwKHRDT05OX0NCKiBwX2NjYiwgQlRfSERSKiBwX21zZyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3RhY2svc21wL2NyeXB0b190b29sYm94LmggYi9zdGFjay9zbXAvY3J5cHRvX3Rvb2xib3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmY2VmZi4uMDAwMDAwMAotLS0gYS9zdGFjay9zbXAvY3J5cHRvX3Rvb2xib3guaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF90eXBlcy5oIgotCi0vKiBGdW5jdGlvbnMgYmVsb3cgaW1wbGVtZW50IGNyeXB0b2dyYXBoaWMgdG9vbGJveCwgYXMgZGVzY3JpYmVkIGluIEJUIFNwZWMKLSAqIFZlciA1LjAgfCBWb2wgMywgUGFydCBIIENSWVBUT0dSQVBISUMgVE9PTEJPWC4gUGxlYXNlIHNlZSB0aGUgc3BlYyBmb3IKLSAqIGRlc2NyaXB0aW9uLgotICoKLSAqIEV4YW1wbGUgb2YgdXNhZ2UgaXMgYXZhbGlhYmxlIGluIGNyeXB0b2dyYXBoaWNfdG9vbGJveF90ZXN0LmNjICovCi0KLWV4dGVybiBPY3RldDE2IHNtcF9jYWxjdWxhdGVfZjQodWludDhfdCogdSwgdWludDhfdCogdiwgY29uc3QgT2N0ZXQxNiYgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB6KTsKLWV4dGVybiB1aW50MzJfdCBzbXBfY2FsY3VsYXRlX2cyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiB5KTsKLWV4dGVybiB2b2lkIHNtcF9jYWxjdWxhdGVfZjUodWludDhfdCogdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhMSwgdWludDhfdCogYTIsIE9jdGV0MTYqIG1hY19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIGx0ayk7Ci1leHRlcm4gT2N0ZXQxNiBzbXBfY2FsY3VsYXRlX2Y2KGNvbnN0IE9jdGV0MTYmIHcsIGNvbnN0IE9jdGV0MTYmIG4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBuMiwgY29uc3QgT2N0ZXQxNiYgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaW9jYXAsIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMik7Ci1leHRlcm4gT2N0ZXQxNiBzbXBfY2FsY3VsYXRlX2g2KGNvbnN0IE9jdGV0MTYmIHcsIHN0ZDo6YXJyYXk8dWludDhfdCwgND4ga2V5aWQpOwotZXh0ZXJuIE9jdGV0MTYgc21wX2NhbGN1bGF0ZV9oNyhjb25zdCBPY3RldDE2JiBzYWx0LCBjb25zdCBPY3RldDE2JiB3KTsKLWV4dGVybiBPY3RldDE2IHNtcF9jYWxjdWxhdGVfbHRrX3RvX2xpbmtfa2V5KGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcpOwotZXh0ZXJuIE9jdGV0MTYgc21wX2NhbGN1bGF0ZV9saW5rX2tleV90b19sdGsoY29uc3QgT2N0ZXQxNiYgbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9oNyk7CmRpZmYgLS1naXQgYS9zdGFjay9zbXAvcF8yNTZfY3VydmVwYXJhLmNjIGIvc3RhY2svc21wL3BfMjU2X2N1cnZlcGFyYS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkZjI2Ni4uMDAwMDAwMAotLS0gYS9zdGFjay9zbXAvcF8yNTZfY3VydmVwYXJhLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHNpbXBsZSBwYWlyaW5nIGFsZ29yaXRobXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAicF8yNTZfZWNjX3BwLmgiCi0KLXZvaWQgcF8yNTZfaW5pdF9jdXJ2ZSgpIHsKLSAgZWxsaXB0aWNfY3VydmVfdCogZWMgPSAmY3VydmVfcDI1NjsKLQotICBlYy0+cFs3XSA9IDB4RkZGRkZGRkY7Ci0gIGVjLT5wWzZdID0gMHgwMDAwMDAwMTsKLSAgZWMtPnBbNV0gPSAweDA7Ci0gIGVjLT5wWzRdID0gMHgwOwotICBlYy0+cFszXSA9IDB4MDsKLSAgZWMtPnBbMl0gPSAweEZGRkZGRkZGOwotICBlYy0+cFsxXSA9IDB4RkZGRkZGRkY7Ci0gIGVjLT5wWzBdID0gMHhGRkZGRkZGRjsKLQotICBtZW1zZXQoZWMtPm9tZWdhLCAwLCBLRVlfTEVOR1RIX0RXT1JEU19QMjU2KTsKLSAgbWVtc2V0KGVjLT5hLCAwLCBLRVlfTEVOR1RIX0RXT1JEU19QMjU2KTsKLQotICBlYy0+YV9taW51czMgPSB0cnVlOwotCi0gIC8vIGIKLSAgZWMtPmJbN10gPSAweDVhYzYzNWQ4OwotICBlYy0+Yls2XSA9IDB4YWEzYTkzZTc7Ci0gIGVjLT5iWzVdID0gMHhiM2ViYmQ1NTsKLSAgZWMtPmJbNF0gPSAweDc2OTg4NmJjOwotICBlYy0+YlszXSA9IDB4NjUxZDA2YjA7Ci0gIGVjLT5iWzJdID0gMHhjYzUzYjBmNjsKLSAgZWMtPmJbMV0gPSAweDNiY2UzYzNlOwotICBlYy0+YlswXSA9IDB4MjdkMjYwNGI7Ci0KLSAgLy8gYmFzZSBwb2ludAotICBlYy0+Ry54WzddID0gMHg2YjE3ZDFmMjsKLSAgZWMtPkcueFs2XSA9IDB4ZTEyYzQyNDc7Ci0gIGVjLT5HLnhbNV0gPSAweGY4YmNlNmU1OwotICBlYy0+Ry54WzRdID0gMHg2M2E0NDBmMjsKLSAgZWMtPkcueFszXSA9IDB4NzcwMzdkODE7Ci0gIGVjLT5HLnhbMl0gPSAweDJkZWIzM2EwOwotICBlYy0+Ry54WzFdID0gMHhmNGExMzk0NTsKLSAgZWMtPkcueFswXSA9IDB4ZDg5OGMyOTY7Ci0KLSAgZWMtPkcueVs3XSA9IDB4NGZlMzQyZTI7Ci0gIGVjLT5HLnlbNl0gPSAweGZlMWE3ZjliOwotICBlYy0+Ry55WzVdID0gMHg4ZWU3ZWI0YTsKLSAgZWMtPkcueVs0XSA9IDB4N2MwZjllMTY7Ci0gIGVjLT5HLnlbM10gPSAweDJiY2UzMzU3OwotICBlYy0+Ry55WzJdID0gMHg2YjMxNWVjZTsKLSAgZWMtPkcueVsxXSA9IDB4Y2JiNjQwNjg7Ci0gIGVjLT5HLnlbMF0gPSAweDM3YmY1MWY1OwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc21wL3BfMjU2X2VjY19wcC5jYyBiL3N0YWNrL3NtcC9wXzI1Nl9lY2NfcHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjM2OGEuLjAwMDAwMDAKLS0tIGEvc3RhY2svc21wL3BfMjU2X2VjY19wcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA2LTIwMTUgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgc2ltcGxlIHBhaXJpbmcgYWxnb3JpdGhtcyB1c2luZyBFbGxpcHRpYyBDdXJ2ZQotICogIENyeXB0b2dyYXBoeSBmb3IgcHJpdmF0ZSBwdWJsaWMga2V5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJwXzI1Nl9lY2NfcHAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInBfMjU2X211bHRwcmVjaXNpb24uaCIKLQotZWxsaXB0aWNfY3VydmVfdCBjdXJ2ZTsKLWVsbGlwdGljX2N1cnZlX3QgY3VydmVfcDI1NjsKLQotc3RhdGljIHZvaWQgcF8yNTZfaW5pdF9wb2ludChQb2ludCogcSkgeyBtZW1zZXQocSwgMCwgc2l6ZW9mKFBvaW50KSk7IH0KLQotc3RhdGljIHZvaWQgcF8yNTZfY29weV9wb2ludChQb2ludCogcSwgUG9pbnQqIHApIHsKLSAgbWVtY3B5KHEsIHAsIHNpemVvZihQb2ludCkpOwotfQotCi0vLyBxPTJxCi1zdGF0aWMgdm9pZCBFQ0NfRG91YmxlKFBvaW50KiBxLCBQb2ludCogcCkgewotICB1aW50MzJfdCB0MVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QgdDJbS0VZX0xFTkdUSF9EV09SRFNfUDI1Nl07Ci0gIHVpbnQzMl90IHQzW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCogeDE7Ci0gIHVpbnQzMl90KiB4MzsKLSAgdWludDMyX3QqIHkxOwotICB1aW50MzJfdCogeTM7Ci0gIHVpbnQzMl90KiB6MTsKLSAgdWludDMyX3QqIHozOwotCi0gIGlmIChtdWx0aXByZWNpc2lvbl9pc3plcm8ocC0+eikpIHsKLSAgICBtdWx0aXByZWNpc2lvbl9pbml0KHEtPnopOwotICAgIHJldHVybjsgIC8vIHJldHVybiBpbmZpbml0eQotICB9Ci0KLSAgeDEgPSBwLT54OwotICB5MSA9IHAtPnk7Ci0gIHoxID0gcC0+ejsKLSAgeDMgPSBxLT54OwotICB5MyA9IHEtPnk7Ci0gIHozID0gcS0+ejsKLQotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh0MSwgejEpOyAgICAgIC8vIHQxPXoxXjIKLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh0MiwgeDEsIHQxKTsgICAgICAgICAgICAvLyB0Mj14MS10MQotICBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHQxLCB4MSwgdDEpOyAgICAgICAgICAgIC8vIHQxPXgxK3QxCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHQyLCB0MSwgdDIpOyAgLy8gdDI9dDIqdDEKLSAgbXVsdGlwcmVjaXNpb25fbHNoaWZ0X21vZCh0MywgdDIpOwotICBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHQyLCB0MywgdDIpOyAgLy8gdDI9M3QyCi0KLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QoejMsIHkxLCB6MSk7ICAvLyB6Mz15MSp6MQotICBtdWx0aXByZWNpc2lvbl9sc2hpZnRfbW9kKHozLCB6Myk7Ci0KLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QoeTMsIHkxKTsgIC8vIHkzPXkxXjIKLSAgbXVsdGlwcmVjaXNpb25fbHNoaWZ0X21vZCh5MywgeTMpOwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh0MywgeTMsIHgxKTsgIC8vIHQzPXkzKngxPXgxKnkxXjIKLSAgbXVsdGlwcmVjaXNpb25fbHNoaWZ0X21vZCh0MywgdDMpOwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh5MywgeTMpOyAgLy8geTM9eTNeMj15MV40Ci0gIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QoeTMsIHkzKTsKLQotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh4MywgdDIpOyAgICAgIC8vIHgzPXQyXjIKLSAgbXVsdGlwcmVjaXNpb25fbHNoaWZ0X21vZCh0MSwgdDMpOyAgICAgICAgICAgICAvLyB0MT0ydDMKLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh4MywgeDMsIHQxKTsgICAgICAgICAgICAvLyB4Mz14My10MQotICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHQxLCB0MywgeDMpOyAgICAgICAgICAgIC8vIHQxPXQzLXgzCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHQxLCB0MSwgdDIpOyAgLy8gdDE9dDEqdDIKLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh5MywgdDEsIHkzKTsgICAgICAgICAgICAvLyB5Mz10MS15MwotfQotCi0vLyBxPXErcCwgICAgIHpwIG11c3QgYmUgMQotc3RhdGljIHZvaWQgRUNDX0FkZChQb2ludCogciwgUG9pbnQqIHAsIFBvaW50KiBxKSB7Ci0gIHVpbnQzMl90IHQxW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCB0MltLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QqIHgxOwotICB1aW50MzJfdCogeDI7Ci0gIHVpbnQzMl90KiB4MzsKLSAgdWludDMyX3QqIHkxOwotICB1aW50MzJfdCogeTI7Ci0gIHVpbnQzMl90KiB5MzsKLSAgdWludDMyX3QqIHoxOwotICB1aW50MzJfdCogejI7Ci0gIHVpbnQzMl90KiB6MzsKLQotICB4MSA9IHAtPng7Ci0gIHkxID0gcC0+eTsKLSAgejEgPSBwLT56OwotICB4MiA9IHEtPng7Ci0gIHkyID0gcS0+eTsKLSAgejIgPSBxLT56OwotICB4MyA9IHItPng7Ci0gIHkzID0gci0+eTsKLSAgejMgPSByLT56OwotCi0gIC8vIGlmIFE9aW5maW5pdHksIHJldHVybiBwCi0gIGlmIChtdWx0aXByZWNpc2lvbl9pc3plcm8oejIpKSB7Ci0gICAgcF8yNTZfY29weV9wb2ludChyLCBwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBpZiBQPWluZmluaXR5LCByZXR1cm4gcQotICBpZiAobXVsdGlwcmVjaXNpb25faXN6ZXJvKHoxKSkgewotICAgIHBfMjU2X2NvcHlfcG9pbnQociwgcSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QodDEsIHoxKTsgICAgICAvLyB0MT16MV4yCi0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHQyLCB6MSwgdDEpOyAgLy8gdDI9dDEqejEKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QodDEsIHgyLCB0MSk7ICAvLyB0MT10MSp4MgotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh0MiwgeTIsIHQyKTsgIC8vIHQyPXQyKnkyCi0KLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh0MSwgdDEsIHgxKTsgIC8vIHQxPXQxLXgxCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QodDIsIHQyLCB5MSk7ICAvLyB0Mj10Mi15MQotCi0gIGlmIChtdWx0aXByZWNpc2lvbl9pc3plcm8odDEpKSB7Ci0gICAgaWYgKG11bHRpcHJlY2lzaW9uX2lzemVybyh0MikpIHsKLSAgICAgIEVDQ19Eb3VibGUociwgcSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIG11bHRpcHJlY2lzaW9uX2luaXQoejMpOwotICAgICAgcmV0dXJuOyAgLy8gcmV0dXJuIGluZmluaXR5Ci0gICAgfQotICB9Ci0KLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QoejMsIHoxLCB0MSk7ICAvLyB6Mz16MSp0MQotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh5MywgdDEpOyAgICAgIC8vIHQzPXQxXjIKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QoejEsIHkzLCB0MSk7ICAvLyB0ND10Myp0MQotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh5MywgeTMsIHgxKTsgIC8vIHQzPXQzKngxCi0gIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodDEsIHkzKTsgICAgICAgICAgICAgLy8gdDE9Mip0MwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh4MywgdDIpOyAgICAgIC8vIHgzPXQyXjIKLSAgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh4MywgeDMsIHQxKTsgICAgICAgICAgICAvLyB4Mz14My10MQotICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHgzLCB4MywgejEpOyAgICAgICAgICAgIC8vIHgzPXgzLXQ0Ci0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QoeTMsIHkzLCB4Myk7ICAgICAgICAgICAgLy8gdDM9dDMteDMKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QoeTMsIHkzLCB0Mik7ICAvLyB0Mz10Myp0MgotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh6MSwgejEsIHkxKTsgIC8vIHQ0PXQ0KnQxCi0gIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QoeTMsIHkzLCB6MSk7Ci19Ci0KLS8vIENvbXB1dGluZyB0aGUgTm9uLUFkamFjZW50IEZvcm0gb2YgYSBwb3NpdGl2ZSBpbnRlZ2VyCi1zdGF0aWMgdm9pZCBFQ0NfTkFGKHVpbnQ4X3QqIG5hZiwgdWludDMyX3QqIE51bU5BRiwgdWludDMyX3QqIGspIHsKLSAgdWludDMyX3Qgc2lnbjsKLSAgaW50IGkgPSAwOwotICBpbnQgajsKLSAgdWludDMyX3QgdmFyOwotCi0gIHdoaWxlICgodmFyID0gbXVsdGlwcmVjaXNpb25fbW9zdF9zaWduYml0cyhrKSkgPj0gMSkgewotICAgIGlmIChrWzBdICYgMHgwMSkgIC8vIGsgaXMgb2RkCi0gICAgewotICAgICAgc2lnbiA9IChrWzBdICYgMHgwMyk7ICAvLyAxIG9yIDMKLQotICAgICAgLy8gayA9IGstbmFmW2ldCi0gICAgICBpZiAoc2lnbiA9PSAxKQotICAgICAgICBrWzBdID0ga1swXSAmIDB4RkZGRkZGRkU7Ci0gICAgICBlbHNlIHsKLSAgICAgICAga1swXSA9IGtbMF0gKyAxOwotICAgICAgICBpZiAoa1swXSA9PSAwKSAgLy8gb3ZlcmZsb3cKLSAgICAgICAgewotICAgICAgICAgIGogPSAxOwotICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGtbal0rKzsKLSAgICAgICAgICB9IHdoaWxlIChrW2orK10gPT0gMCk7ICAvLyBvdmVyZmxvdwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICBzaWduID0gMDsKLQotICAgIG11bHRpcHJlY2lzaW9uX3JzaGlmdChrLCBrKTsKLSAgICBuYWZbaSAvIDRdIHw9IChzaWduKSA8PCAoKGkgJSA0KSAqIDIpOwotICAgIGkrKzsKLSAgfQotCi0gICpOdW1OQUYgPSBpOwotfQotCi0vLyBCaW5hcnkgTm9uLUFkamFjZW50IEZvcm0gZm9yIHBvaW50IG11bHRpcGxpY2F0aW9uCi12b2lkIEVDQ19Qb2ludE11bHRfQmluX05BRihQb2ludCogcSwgUG9pbnQqIHAsIHVpbnQzMl90KiBuKSB7Ci0gIHVpbnQzMl90IHNpZ247Ci0gIHVpbnQ4X3QgbmFmWzI1NiAvIDQgKyAxXTsKLSAgdWludDMyX3QgTnVtTmFmOwotICBQb2ludCBtaW51c19wOwotICBQb2ludCByOwotICB1aW50MzJfdCogbW9kcDsKLQotICBtb2RwID0gY3VydmVfcDI1Ni5wOwotCi0gIHBfMjU2X2luaXRfcG9pbnQoJnIpOwotICBtdWx0aXByZWNpc2lvbl9pbml0KHAtPnopOwotICBwLT56WzBdID0gMTsKLQotICAvLyBpbml0aWFsaXphdGlvbgotICBwXzI1Nl9pbml0X3BvaW50KHEpOwotCi0gIC8vIC1wCi0gIG11bHRpcHJlY2lzaW9uX2NvcHkobWludXNfcC54LCBwLT54KTsKLSAgbXVsdGlwcmVjaXNpb25fc3ViKG1pbnVzX3AueSwgbW9kcCwgcC0+eSk7Ci0KLSAgbXVsdGlwcmVjaXNpb25faW5pdChtaW51c19wLnopOwotICBtaW51c19wLnpbMF0gPSAxOwotCi0gIC8vIE5BRgotICBtZW1zZXQobmFmLCAwLCBzaXplb2YobmFmKSk7Ci0gIEVDQ19OQUYobmFmLCAmTnVtTmFmLCBuKTsKLQotICBmb3IgKGludCBpID0gTnVtTmFmIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBwXzI1Nl9jb3B5X3BvaW50KCZyLCBxKTsKLSAgICBFQ0NfRG91YmxlKHEsICZyKTsKLSAgICBzaWduID0gKG5hZltpIC8gNF0gPj4gKChpICUgNCkgKiAyKSkgJiAweDAzOwotCi0gICAgaWYgKHNpZ24gPT0gMSkgewotICAgICAgcF8yNTZfY29weV9wb2ludCgmciwgcSk7Ci0gICAgICBFQ0NfQWRkKHEsICZyLCBwKTsKLSAgICB9IGVsc2UgaWYgKHNpZ24gPT0gMykgewotICAgICAgcF8yNTZfY29weV9wb2ludCgmciwgcSk7Ci0gICAgICBFQ0NfQWRkKHEsICZyLCAmbWludXNfcCk7Ci0gICAgfQotICB9Ci0KLSAgbXVsdGlwcmVjaXNpb25faW52X21vZChtaW51c19wLngsIHEtPnopOwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZChxLT56LCBtaW51c19wLngpOwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZChxLT54LCBxLT54LCBxLT56KTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QocS0+eiwgcS0+eiwgbWludXNfcC54KTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfbXVsdF9tb2QocS0+eSwgcS0+eSwgcS0+eik7Ci19Ci0KLWJvb2wgRUNDX1ZhbGlkYXRlUG9pbnQoY29uc3QgUG9pbnQmIHB0KSB7Ci0gIHBfMjU2X2luaXRfY3VydmUoKTsKLQotICAvLyBFbnN1cmUgeV4yID0geF4zICsgYSp4ICsgYiAobW9kIHApOyBhID0gLTMKLQotICAvLyB5XjIgbW9kIHAKLSAgdWludDMyX3QgeTJfbW9kW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdID0gezB9OwotICBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh5Ml9tb2QsICh1aW50MzJfdCopcHQueSk7Ci0KLSAgLy8gUmlnaHQgaGFuZCBzaWRlIGNhbGN1bGF0aW9uCi0gIHVpbnQzMl90IHJoc1tLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA9IHswfTsKLSAgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QocmhzLCAodWludDMyX3QqKXB0LngpOwotICB1aW50MzJfdCB0aHJlZVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA9IHswfTsKLSAgdGhyZWVbMF0gPSAzOwotICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKHJocywgcmhzLCB0aHJlZSk7Ci0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHJocywgcmhzLCAodWludDMyX3QqKXB0LngpOwotICBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHJocywgcmhzLCBjdXJ2ZV9wMjU2LmIpOwotCi0gIHJldHVybiBtdWx0aXByZWNpc2lvbl9jb21wYXJlKHJocywgeTJfbW9kKSA9PSAwOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc21wL3BfMjU2X2VjY19wcC5oIGIvc3RhY2svc21wL3BfMjU2X2VjY19wcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZmMGE4Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3NtcC9wXzI1Nl9lY2NfcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHNpbXBsZSBwYWlyaW5nIGFsZ29yaXRobXMgdXNpbmcgRWxsaXB0aWMgQ3VydmUKLSAqQ3J5cHRvZ3JhcGh5IGZvciBwcml2YXRlIHB1YmxpYyBrZXkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRib29sPgotI2luY2x1ZGUgInBfMjU2X211bHRwcmVjaXNpb24uaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCB4W0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCB5W0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCB6W0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotfSBQb2ludDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBjdXJ2ZSdzIGNvZWZmaWNpZW50cwotICB1aW50MzJfdCBhW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotICB1aW50MzJfdCBiW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotCi0gIC8vIHdoZXRoZXIgYSBpcyAtMwotICBpbnQgYV9taW51czM7Ci0KLSAgLy8gcHJpbWUgbW9kdWx1cwotICB1aW50MzJfdCBwW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdOwotCi0gIC8vIE9tZWdhLCBwID0gMl5tIC1vbWVnYQotICB1aW50MzJfdCBvbWVnYVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLQotICAvLyBiYXNlIHBvaW50LCBhIHBvaW50IG9uIEUgb2Ygb3JkZXIgcgotICBQb2ludCBHOwotCi19IGVsbGlwdGljX2N1cnZlX3Q7Ci0KLWV4dGVybiBlbGxpcHRpY19jdXJ2ZV90IGN1cnZlOwotZXh0ZXJuIGVsbGlwdGljX2N1cnZlX3QgY3VydmVfcDI1NjsKLQotYm9vbCBFQ0NfVmFsaWRhdGVQb2ludChjb25zdCBQb2ludCYgcCk7Ci0KLXZvaWQgRUNDX1BvaW50TXVsdF9CaW5fTkFGKFBvaW50KiBxLCBQb2ludCogcCwgdWludDMyX3QqIG4pOwotCi0jZGVmaW5lIEVDQ19Qb2ludE11bHQocSwgcCwgbikgRUNDX1BvaW50TXVsdF9CaW5fTkFGKHEsIHAsIG4pCi0KLXZvaWQgcF8yNTZfaW5pdF9jdXJ2ZSgpOwpkaWZmIC0tZ2l0IGEvc3RhY2svc21wL3BfMjU2X211bHRwcmVjaXNpb24uY2MgYi9zdGFjay9zbXAvcF8yNTZfbXVsdHByZWNpc2lvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxMDgyOS4uMDAwMDAwMAotLS0gYS9zdGFjay9zbXAvcF8yNTZfbXVsdHByZWNpc2lvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA2LTIwMTUgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgc2ltcGxlIHBhaXJpbmcgYWxnb3JpdGhtcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwXzI1Nl9tdWx0cHJlY2lzaW9uLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAicF8yNTZfZWNjX3BwLmgiCi0KLXZvaWQgbXVsdGlwcmVjaXNpb25faW5pdCh1aW50MzJfdCogYykgewotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSBjW2ldID0gMDsKLX0KLQotdm9pZCBtdWx0aXByZWNpc2lvbl9jb3B5KHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSkgewotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSBjW2ldID0gYVtpXTsKLX0KLQotaW50IG11bHRpcHJlY2lzaW9uX2NvbXBhcmUodWludDMyX3QqIGEsIHVpbnQzMl90KiBiKSB7Ci0gIGZvciAoaW50IGkgPSBLRVlfTEVOR1RIX0RXT1JEU19QMjU2IC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBpZiAoYVtpXSA+IGJbaV0pIHJldHVybiAxOwotICAgIGlmIChhW2ldIDwgYltpXSkgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbXVsdGlwcmVjaXNpb25faXN6ZXJvKHVpbnQzMl90KiBhKSB7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBLRVlfTEVOR1RIX0RXT1JEU19QMjU2OyBpKyspCi0gICAgaWYgKGFbaV0pIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotCi11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9kd29yZF9iaXRzKHVpbnQzMl90IGEpIHsKLSAgdWludDMyX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IERXT1JEX0JJVFM7IGkrKywgYSA+Pj0gMSkKLSAgICBpZiAoYSA9PSAwKSBicmVhazsKLQotICByZXR1cm4gaTsKLX0KLQotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbW9zdF9zaWduZHdvcmRzKHVpbnQzMl90KiBhKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSBLRVlfTEVOR1RIX0RXT1JEU19QMjU2IC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgaWYgKGFbaV0pIGJyZWFrOwotICByZXR1cm4gKGkgKyAxKTsKLX0KLQotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbW9zdF9zaWduYml0cyh1aW50MzJfdCogYSkgewotICBpbnQgYU1vc3RTaWduRFdPUkRzOwotCi0gIGFNb3N0U2lnbkRXT1JEcyA9IG11bHRpcHJlY2lzaW9uX21vc3Rfc2lnbmR3b3JkcyhhKTsKLSAgaWYgKGFNb3N0U2lnbkRXT1JEcyA9PSAwKSByZXR1cm4gMDsKLQotICByZXR1cm4gKCgoYU1vc3RTaWduRFdPUkRzIC0gMSkgPDwgRFdPUkRfQklUU19TSElGVCkgKwotICAgICAgICAgIG11bHRpcHJlY2lzaW9uX2R3b3JkX2JpdHMoYVthTW9zdFNpZ25EV09SRHMgLSAxXSkpOwotfQotCi11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9hZGQodWludDMyX3QqIGMsIHVpbnQzMl90KiBhLCB1aW50MzJfdCogYikgewotICB1aW50MzJfdCBjYXJyaWVyOwotICB1aW50MzJfdCB0ZW1wOwotCi0gIGNhcnJpZXIgPSAwOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSB7Ci0gICAgdGVtcCA9IGFbaV0gKyBjYXJyaWVyOwotICAgIGNhcnJpZXIgPSAodGVtcCA8IGNhcnJpZXIpOwotICAgIHRlbXAgKz0gYltpXTsKLSAgICBjYXJyaWVyIHw9ICh0ZW1wIDwgYltpXSk7Ci0gICAgY1tpXSA9IHRlbXA7Ci0gIH0KLQotICByZXR1cm4gY2FycmllcjsKLX0KLQotLy8gYz1hLWIKLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX3N1Yih1aW50MzJfdCogYywgdWludDMyX3QqIGEsIHVpbnQzMl90KiBiKSB7Ci0gIHVpbnQzMl90IGJvcnJvdzsKLSAgdWludDMyX3QgdGVtcDsKLQotICBib3Jyb3cgPSAwOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSB7Ci0gICAgdGVtcCA9IGFbaV0gLSBib3Jyb3c7Ci0gICAgYm9ycm93ID0gKHRlbXAgPiBhW2ldKTsKLSAgICBjW2ldID0gdGVtcCAtIGJbaV07Ci0gICAgYm9ycm93IHw9IChjW2ldID4gdGVtcCk7Ci0gIH0KLQotICByZXR1cm4gYm9ycm93OwotfQotCi0vLyBjID0gYSA8PCAxCi12b2lkIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodWludDMyX3QqIGMsIHVpbnQzMl90KiBhKSB7Ci0gIHVpbnQzMl90IGNhcnJpZXI7Ci0gIHVpbnQzMl90KiBtb2RwID0gY3VydmVfcDI1Ni5wOwotCi0gIGNhcnJpZXIgPSBtdWx0aXByZWNpc2lvbl9sc2hpZnQoYywgYSk7Ci0gIGlmIChjYXJyaWVyKSB7Ci0gICAgbXVsdGlwcmVjaXNpb25fc3ViKGMsIGMsIG1vZHApOwotICB9IGVsc2UgaWYgKG11bHRpcHJlY2lzaW9uX2NvbXBhcmUoYywgbW9kcCkgPj0gMCkgewotICAgIG11bHRpcHJlY2lzaW9uX3N1YihjLCBjLCBtb2RwKTsKLSAgfQotfQotCi0vLyBjPWE+PjEKLXZvaWQgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSkgewotICBpbnQgajsKLSAgdWludDMyX3QgYiA9IDE7Ci0KLSAgaiA9IERXT1JEX0JJVFMgLSBiOwotCi0gIHVpbnQzMl90IGNhcnJpZXIgPSAwOwotICB1aW50MzJfdCB0ZW1wOwotICBmb3IgKGludCBpID0gS0VZX0xFTkdUSF9EV09SRFNfUDI1NiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdGVtcCA9IGFbaV07ICAvLyBpbiBjYXNlIG9mIGM9PWEKLSAgICBjW2ldID0gKHRlbXAgPj4gYikgfCBjYXJyaWVyOwotICAgIGNhcnJpZXIgPSB0ZW1wIDw8IGo7Ci0gIH0KLX0KLQotLy8gQ3VydmUgc3BlY2lmaWMgb3B0aW1pemF0aW9uIHdoZW4gcCBpcyBhIHBzZXVkby1NZXJzZW5ucyBwcmltZSwKLS8vIHA9Ml4oS0VZX0xFTkdUSF9CSVRTKS1vbWVnYQotdm9pZCBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19tdWx0X21vZCh1aW50MzJfdCogYywgdWludDMyX3QqIGEsIHVpbnQzMl90KiBiKSB7Ci0gIHVpbnQzMl90IGNjWzIgKiBLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLQotICBtdWx0aXByZWNpc2lvbl9tdWx0KGNjLCBhLCBiKTsKLSAgbXVsdGlwcmVjaXNpb25fZmFzdF9tb2RfUDI1NihjLCBjYyk7Ci19Ci0KLS8vIEN1cnZlIHNwZWNpZmljIG9wdGltaXphdGlvbiB3aGVuIHAgaXMgYSBwc2V1ZG8tTWVyc2VubnMgcHJpbWUKLXZvaWQgbXVsdGlwcmVjaXNpb25fbWVyc2VubnNfc3F1YV9tb2QodWludDMyX3QqIGMsIHVpbnQzMl90KiBhKSB7Ci0gIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKGMsIGEsIGEpOwotfQotCi0vLyBjPShhK2IpIG1vZCBwLCBiPHAsIGE8cAotdm9pZCBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSwgdWludDMyX3QqIGIpIHsKLSAgdWludDMyX3QgY2FycmllcjsKLSAgdWludDMyX3QqIG1vZHAgPSBjdXJ2ZV9wMjU2LnA7Ci0KLSAgY2FycmllciA9IG11bHRpcHJlY2lzaW9uX2FkZChjLCBhLCBiKTsKLSAgaWYgKGNhcnJpZXIpIHsKLSAgICBtdWx0aXByZWNpc2lvbl9zdWIoYywgYywgbW9kcCk7Ci0gIH0gZWxzZSBpZiAobXVsdGlwcmVjaXNpb25fY29tcGFyZShjLCBtb2RwKSA+PSAwKSB7Ci0gICAgbXVsdGlwcmVjaXNpb25fc3ViKGMsIGMsIG1vZHApOwotICB9Ci19Ci0KLS8vIGM9KGEtYikgbW9kIHAsIGE8cCwgYjxwCi12b2lkIG11bHRpcHJlY2lzaW9uX3N1Yl9tb2QodWludDMyX3QqIGMsIHVpbnQzMl90KiBhLCB1aW50MzJfdCogYikgewotICB1aW50MzJfdCBib3Jyb3c7Ci0gIHVpbnQzMl90KiBtb2RwID0gY3VydmVfcDI1Ni5wOwotCi0gIGJvcnJvdyA9IG11bHRpcHJlY2lzaW9uX3N1YihjLCBhLCBiKTsKLSAgaWYgKGJvcnJvdykgbXVsdGlwcmVjaXNpb25fYWRkKGMsIGMsIG1vZHApOwotfQotCi0vLyBjPWE8PGIsIGI8RFdPUkRfQklUUywgYyBoYXMgYSBidWZmZXIgc2l6ZSBvZiBOdW11aW50MzJfdHMrMQotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbHNoaWZ0KHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSkgewotICBpbnQgajsKLSAgdWludDMyX3QgYiA9IDE7Ci0gIGogPSBEV09SRF9CSVRTIC0gYjsKLQotICB1aW50MzJfdCBjYXJyaWVyID0gMDsKLSAgdWludDMyX3QgdGVtcDsKLQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaSsrKSB7Ci0gICAgdGVtcCA9IGFbaV07ICAvLyBpbiBjYXNlIGM9PWEKLSAgICBjW2ldID0gKHRlbXAgPDwgYikgfCBjYXJyaWVyOwotICAgIGNhcnJpZXIgPSB0ZW1wID4+IGo7Ci0gIH0KLQotICByZXR1cm4gY2FycmllcjsKLX0KLQotLy8gYz1hKmI7IGMgbXVzdCBoYXZlIGEgYnVmZmVyIG9mIDIqS2V5X0xFTkdUSF91aW50MzJfdFMsIGMgIT0gYSAhPSBiCi12b2lkIG11bHRpcHJlY2lzaW9uX211bHQodWludDMyX3QqIGMsIHVpbnQzMl90KiBhLCB1aW50MzJfdCogYikgewotICB1aW50MzJfdCBXOwotICB1aW50MzJfdCBVOwotICB1aW50MzJfdCBWOwotCi0gIFUgPSBWID0gVyA9IDA7Ci0gIG11bHRpcHJlY2lzaW9uX2luaXQoYyk7Ci0KLSAgLy8gYXNzdW1lIGxpdHRsZSBlbmRpYW4gcmlnaHQgbm93Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBLRVlfTEVOR1RIX0RXT1JEU19QMjU2OyBpKyspIHsKLSAgICBVID0gMDsKLSAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgS0VZX0xFTkdUSF9EV09SRFNfUDI1NjsgaisrKSB7Ci0gICAgICB1aW50NjRfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPSAoKHVpbnQ2NF90KWFbaV0pICogKCh1aW50NjRfdCliW2pdKTsKLSAgICAgIFcgPSByZXN1bHQgPj4gMzI7Ci0gICAgICBWID0gYVtpXSAqIGJbal07Ci0gICAgICBWID0gViArIFU7Ci0gICAgICBVID0gKFYgPCBVKTsKLSAgICAgIFUgKz0gVzsKLSAgICAgIFYgPSBWICsgY1tpICsgal07Ci0gICAgICBVICs9IChWIDwgY1tpICsgal0pOwotICAgICAgY1tpICsgal0gPSBWOwotICAgIH0KLSAgICBjW2kgKyBLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA9IFU7Ci0gIH0KLX0KLQotdm9pZCBtdWx0aXByZWNpc2lvbl9mYXN0X21vZF9QMjU2KHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSkgewotICB1aW50MzJfdCBBOwotICB1aW50MzJfdCBCOwotICB1aW50MzJfdCBDOwotICB1aW50MzJfdCBEOwotICB1aW50MzJfdCBFOwotICB1aW50MzJfdCBGOwotICB1aW50MzJfdCBHOwotICB1aW50OF90IFVBOwotICB1aW50OF90IFVCOwotICB1aW50OF90IFVDOwotICB1aW50OF90IFVEOwotICB1aW50OF90IFVFOwotICB1aW50OF90IFVGOwotICB1aW50OF90IFVHOwotICB1aW50MzJfdCBVOwotICB1aW50MzJfdCogbW9kcCA9IGN1cnZlX3AyNTYucDsKLQotICAvLyBDID0gYVsxM10gKyBhWzE0XSArIGFbMTVdOwotICBDID0gYVsxM107Ci0gIEMgKz0gYVsxNF07Ci0gIFVDID0gKEMgPCBhWzE0XSk7Ci0gIEMgKz0gYVsxNV07Ci0gIFVDICs9IChDIDwgYVsxNV0pOwotCi0gIC8vIEUgPSBhWzhdICsgYVs5XTsKLSAgRSA9IGFbOF07Ci0gIEUgKz0gYVs5XTsKLSAgVUUgPSAoRSA8IGFbOV0pOwotCi0gIC8vIEYgPSBhWzldICsgYVsxMF07Ci0gIEYgPSBhWzldOwotICBGICs9IGFbMTBdOwotICBVRiA9IChGIDwgYVsxMF0pOwotCi0gIC8vIEcgPSBhWzEwXSArIGFbMTFdCi0gIEcgPSBhWzEwXTsKLSAgRyArPSBhWzExXTsKLSAgVUcgPSAoRyA8IGFbMTFdKTsKLQotICAvLyBCID0gYVsxMl0gKyBhWzEzXSArIGFbMTRdICsgYVsxNV0gPT0gQyArIGFbMTJdCi0gIEIgPSBDOwotICBVQiA9IFVDOwotICBCICs9IGFbMTJdOwotICBVQiArPSAoQiA8IGFbMTJdKTsKLQotICAvLyBBID0gYVsxMV0gKyBhWzEyXSArIGFbMTNdICsgYVsxNF0gPT0gQiArIGFbMTFdIC0gYVsxNV0KLSAgQSA9IEI7Ci0gIFVBID0gVUI7Ci0gIEEgKz0gYVsxMV07Ci0gIFVBICs9IChBIDwgYVsxMV0pOwotICBVQSAtPSAoQSA8IGFbMTVdKTsKLSAgQSAtPSBhWzE1XTsKLQotICAvLyBEID0gYVsxMF0gKyBhWzExXSArIGFbMTJdICsgYVsxM10gPT0gQSArIGFbMTBdIC0gYVsxNF0KLSAgRCA9IEE7Ci0gIFVEID0gVUE7Ci0gIEQgKz0gYVsxMF07Ci0gIFVEICs9IChEIDwgYVsxMF0pOwotICBVRCAtPSAoRCA8IGFbMTRdKTsKLSAgRCAtPSBhWzE0XTsKLQotICBjWzBdID0gYVswXTsKLSAgY1swXSArPSBFOwotICBVID0gKGNbMF0gPCBFKTsKLSAgVSArPSBVRTsKLSAgVSAtPSAoY1swXSA8IEEpOwotICBVIC09IFVBOwotICBjWzBdIC09IEE7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbMV0gPCBVVSk7Ci0gICAgY1sxXSA9IGFbMV0gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzFdID0gYVsxXSArIFU7Ci0gICAgVSA9IChjWzFdIDwgYVsxXSk7Ci0gIH0KLQotICBjWzFdICs9IEY7Ci0gIFUgKz0gKGNbMV0gPCBGKTsKLSAgVSArPSBVRjsKLSAgVSAtPSAoY1sxXSA8IEIpOwotICBVIC09IFVCOwotICBjWzFdIC09IEI7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbMl0gPCBVVSk7Ci0gICAgY1syXSA9IGFbMl0gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzJdID0gYVsyXSArIFU7Ci0gICAgVSA9IChjWzJdIDwgYVsyXSk7Ci0gIH0KLQotICBjWzJdICs9IEc7Ci0gIFUgKz0gKGNbMl0gPCBHKTsKLSAgVSArPSBVRzsKLSAgVSAtPSAoY1syXSA8IEMpOwotICBVIC09IFVDOwotICBjWzJdIC09IEM7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbM10gPCBVVSk7Ci0gICAgY1szXSA9IGFbM10gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzNdID0gYVszXSArIFU7Ci0gICAgVSA9IChjWzNdIDwgYVszXSk7Ci0gIH0KLQotICBjWzNdICs9IEE7Ci0gIFUgKz0gKGNbM10gPCBBKTsKLSAgVSArPSBVQTsKLSAgY1szXSArPSBhWzExXTsKLSAgVSArPSAoY1szXSA8IGFbMTFdKTsKLSAgY1szXSArPSBhWzEyXTsKLSAgVSArPSAoY1szXSA8IGFbMTJdKTsKLSAgVSAtPSAoY1szXSA8IGFbMTRdKTsKLSAgY1szXSAtPSBhWzE0XTsKLSAgVSAtPSAoY1szXSA8IGFbMTVdKTsKLSAgY1szXSAtPSBhWzE1XTsKLSAgVSAtPSAoY1szXSA8IEUpOwotICBVIC09IFVFOwotICBjWzNdIC09IEU7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbNF0gPCBVVSk7Ci0gICAgY1s0XSA9IGFbNF0gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzRdID0gYVs0XSArIFU7Ci0gICAgVSA9IChjWzRdIDwgYVs0XSk7Ci0gIH0KLQotICBjWzRdICs9IEI7Ci0gIFUgKz0gKGNbNF0gPCBCKTsKLSAgVSArPSBVQjsKLSAgVSAtPSAoY1s0XSA8IGFbMTVdKTsKLSAgY1s0XSAtPSBhWzE1XTsKLSAgY1s0XSArPSBhWzEyXTsKLSAgVSArPSAoY1s0XSA8IGFbMTJdKTsKLSAgY1s0XSArPSBhWzEzXTsKLSAgVSArPSAoY1s0XSA8IGFbMTNdKTsKLSAgVSAtPSAoY1s0XSA8IEYpOwotICBVIC09IFVGOwotICBjWzRdIC09IEY7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbNV0gPCBVVSk7Ci0gICAgY1s1XSA9IGFbNV0gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzVdID0gYVs1XSArIFU7Ci0gICAgVSA9IChjWzVdIDwgYVs1XSk7Ci0gIH0KLQotICBjWzVdICs9IEM7Ci0gIFUgKz0gKGNbNV0gPCBDKTsKLSAgVSArPSBVQzsKLSAgY1s1XSArPSBhWzEzXTsKLSAgVSArPSAoY1s1XSA8IGFbMTNdKTsKLSAgY1s1XSArPSBhWzE0XTsKLSAgVSArPSAoY1s1XSA8IGFbMTRdKTsKLSAgVSAtPSAoY1s1XSA8IEcpOwotICBVIC09IFVHOwotICBjWzVdIC09IEc7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbNl0gPCBVVSk7Ci0gICAgY1s2XSA9IGFbNl0gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzZdID0gYVs2XSArIFU7Ci0gICAgVSA9IChjWzZdIDwgYVs2XSk7Ci0gIH0KLQotICBjWzZdICs9IEM7Ci0gIFUgKz0gKGNbNl0gPCBDKTsKLSAgVSArPSBVQzsKLSAgY1s2XSArPSBhWzE0XTsKLSAgVSArPSAoY1s2XSA8IGFbMTRdKTsKLSAgY1s2XSArPSBhWzE0XTsKLSAgVSArPSAoY1s2XSA8IGFbMTRdKTsKLSAgY1s2XSArPSBhWzE1XTsKLSAgVSArPSAoY1s2XSA8IGFbMTVdKTsKLSAgVSAtPSAoY1s2XSA8IEUpOwotICBVIC09IFVFOwotICBjWzZdIC09IEU7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgdWludDMyX3QgVVU7Ci0gICAgVVUgPSAwIC0gVTsKLSAgICBVID0gKGFbN10gPCBVVSk7Ci0gICAgY1s3XSA9IGFbN10gLSBVVTsKLSAgfSBlbHNlIHsKLSAgICBjWzddID0gYVs3XSArIFU7Ci0gICAgVSA9IChjWzddIDwgYVs3XSk7Ci0gIH0KLQotICBjWzddICs9IGFbMTVdOwotICBVICs9IChjWzddIDwgYVsxNV0pOwotICBjWzddICs9IGFbMTVdOwotICBVICs9IChjWzddIDwgYVsxNV0pOwotICBjWzddICs9IGFbMTVdOwotICBVICs9IChjWzddIDwgYVsxNV0pOwotICBjWzddICs9IGFbOF07Ci0gIFUgKz0gKGNbN10gPCBhWzhdKTsKLSAgVSAtPSAoY1s3XSA8IEQpOwotICBVIC09IFVEOwotICBjWzddIC09IEQ7Ci0KLSAgaWYgKFUgJiAweDgwMDAwMDAwKSB7Ci0gICAgd2hpbGUgKFUpIHsKLSAgICAgIG11bHRpcHJlY2lzaW9uX2FkZChjLCBjLCBtb2RwKTsKLSAgICAgIFUrKzsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoVSkgewotICAgIHdoaWxlIChVKSB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9zdWIoYywgYywgbW9kcCk7Ci0gICAgICBVLS07Ci0gICAgfQotICB9Ci0KLSAgaWYgKG11bHRpcHJlY2lzaW9uX2NvbXBhcmUoYywgbW9kcCkgPj0gMCkgbXVsdGlwcmVjaXNpb25fc3ViKGMsIGMsIG1vZHApOwotfQotCi12b2lkIG11bHRpcHJlY2lzaW9uX2ludl9tb2QodWludDMyX3QqIGFtaW51cywgdWludDMyX3QqIHUpIHsKLSAgdWludDMyX3QgdltLRVlfTEVOR1RIX0RXT1JEU19QMjU2XTsKLSAgdWludDMyX3QgQVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2ICsgMV07Ci0gIHVpbnQzMl90IENbS0VZX0xFTkdUSF9EV09SRFNfUDI1NiArIDFdOwotICB1aW50MzJfdCogbW9kcCA9IGN1cnZlX3AyNTYucDsKLQotICBtdWx0aXByZWNpc2lvbl9jb3B5KHYsIG1vZHApOwotICBtdWx0aXByZWNpc2lvbl9pbml0KEEpOwotICBtdWx0aXByZWNpc2lvbl9pbml0KEMpOwotICBBWzBdID0gMTsKLQotICB3aGlsZSAoIW11bHRpcHJlY2lzaW9uX2lzemVybyh1KSkgewotICAgIHdoaWxlICghKHVbMF0gJiAweDAxKSkgIC8vIHUgaXMgZXZlbgotICAgIHsKLSAgICAgIG11bHRpcHJlY2lzaW9uX3JzaGlmdCh1LCB1KTsKLSAgICAgIGlmICghKEFbMF0gJiAweDAxKSkgIC8vIEEgaXMgZXZlbgotICAgICAgICBtdWx0aXByZWNpc2lvbl9yc2hpZnQoQSwgQSk7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgQVtLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA9IG11bHRpcHJlY2lzaW9uX2FkZChBLCBBLCBtb2RwKTsgIC8vIEEgPUErcAotICAgICAgICBtdWx0aXByZWNpc2lvbl9yc2hpZnQoQSwgQSk7Ci0gICAgICAgIEFbS0VZX0xFTkdUSF9EV09SRFNfUDI1NiAtIDFdIHw9IChBW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdIDw8IDMxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoISh2WzBdICYgMHgwMSkpICAvLyB2IGlzIGV2ZW4KLSAgICB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9yc2hpZnQodiwgdik7Ci0gICAgICBpZiAoIShDWzBdICYgMHgwMSkpICAvLyBDIGlzIGV2ZW4KLSAgICAgIHsKLSAgICAgICAgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KEMsIEMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ1tLRVlfTEVOR1RIX0RXT1JEU19QMjU2XSA9IG11bHRpcHJlY2lzaW9uX2FkZChDLCBDLCBtb2RwKTsgIC8vIEMgPUMrcAotICAgICAgICBtdWx0aXByZWNpc2lvbl9yc2hpZnQoQywgQyk7Ci0gICAgICAgIENbS0VZX0xFTkdUSF9EV09SRFNfUDI1NiAtIDFdIHw9IChDW0tFWV9MRU5HVEhfRFdPUkRTX1AyNTZdIDw8IDMxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobXVsdGlwcmVjaXNpb25fY29tcGFyZSh1LCB2KSA+PSAwKSB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9zdWIodSwgdSwgdik7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKEEsIEEsIEMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9zdWIodiwgdiwgdSk7Ci0gICAgICBtdWx0aXByZWNpc2lvbl9zdWJfbW9kKEMsIEMsIEEpOwotICAgIH0KLSAgfQotCi0gIGlmIChtdWx0aXByZWNpc2lvbl9jb21wYXJlKEMsIG1vZHApID49IDApCi0gICAgbXVsdGlwcmVjaXNpb25fc3ViKGFtaW51cywgQywgbW9kcCk7Ci0gIGVsc2UKLSAgICBtdWx0aXByZWNpc2lvbl9jb3B5KGFtaW51cywgQyk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9zbXAvcF8yNTZfbXVsdHByZWNpc2lvbi5oIGIvc3RhY2svc21wL3BfMjU2X211bHRwcmVjaXNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmOTYzNi4uMDAwMDAwMAotLS0gYS9zdGFjay9zbXAvcF8yNTZfbXVsdHByZWNpc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwNi0yMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgcGFpcmluZyBhbGdvcml0aG1zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2RlZmluZSBEV09SRF9CSVRTIDMyCi0jZGVmaW5lIERXT1JEX0JZVEVTIDQKLSNkZWZpbmUgRFdPUkRfQklUU19TSElGVCA1Ci0KLSNkZWZpbmUgS0VZX0xFTkdUSF9EV09SRFNfUDI1NiA4Ci0vKiBBcml0aG1ldGljIE9wZXJhdGlvbnMgKi8KLQotaW50IG11bHRpcHJlY2lzaW9uX2NvbXBhcmUodWludDMyX3QqIGEsIHVpbnQzMl90KiBiKTsKLWludCBtdWx0aXByZWNpc2lvbl9pc3plcm8odWludDMyX3QqIGEpOwotdm9pZCBtdWx0aXByZWNpc2lvbl9pbml0KHVpbnQzMl90KiBjKTsKLXZvaWQgbXVsdGlwcmVjaXNpb25fY29weSh1aW50MzJfdCogYywgdWludDMyX3QqIGEpOwotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fZHdvcmRfYml0cyh1aW50MzJfdCBhKTsKLXVpbnQzMl90IG11bHRpcHJlY2lzaW9uX21vc3Rfc2lnbmR3b3Jkcyh1aW50MzJfdCogYSk7Ci11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9tb3N0X3NpZ25iaXRzKHVpbnQzMl90KiBhKTsKLXZvaWQgbXVsdGlwcmVjaXNpb25faW52X21vZCh1aW50MzJfdCogYW1pbnVzLCB1aW50MzJfdCogYSk7Ci11aW50MzJfdCBtdWx0aXByZWNpc2lvbl9hZGQodWludDMyX3QqIGMsIHVpbnQzMl90KiBhLCB1aW50MzJfdCogYik7ICAvLyBjPWErYgotdm9pZCBtdWx0aXByZWNpc2lvbl9hZGRfbW9kKHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSwgdWludDMyX3QqIGIpOwotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fc3ViKHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSwgdWludDMyX3QqIGIpOyAgLy8gYz1hLWIKLXZvaWQgbXVsdGlwcmVjaXNpb25fc3ViX21vZCh1aW50MzJfdCogYywgdWludDMyX3QqIGEsIHVpbnQzMl90KiBiKTsKLXZvaWQgbXVsdGlwcmVjaXNpb25fcnNoaWZ0KHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSk7ICAvLyBjPWE+PjEsIHJldHVybiBjYXJyaWVyCi12b2lkIG11bHRpcHJlY2lzaW9uX2xzaGlmdF9tb2QodWludDMyX3QqIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGEpOyAgLy8gYz1hPDxiLCByZXR1cm4gY2FycmllcgotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbHNoaWZ0KHVpbnQzMl90KiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhKTsgIC8vIGM9YTw8YiwgcmV0dXJuIGNhcnJpZXIKLXZvaWQgbXVsdGlwcmVjaXNpb25fbXVsdCh1aW50MzJfdCogYywgdWludDMyX3QqIGEsIHVpbnQzMl90KiBiKTsgIC8vIGM9YSpiCi12b2lkIG11bHRpcHJlY2lzaW9uX21lcnNlbm5zX211bHRfbW9kKHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSwgdWludDMyX3QqIGIpOwotdm9pZCBtdWx0aXByZWNpc2lvbl9tZXJzZW5uc19zcXVhX21vZCh1aW50MzJfdCogYywgdWludDMyX3QqIGEpOwotdWludDMyX3QgbXVsdGlwcmVjaXNpb25fbHNoaWZ0KHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSk7Ci12b2lkIG11bHRpcHJlY2lzaW9uX211bHQodWludDMyX3QqIGMsIHVpbnQzMl90KiBhLCB1aW50MzJfdCogYik7Ci12b2lkIG11bHRpcHJlY2lzaW9uX2Zhc3RfbW9kKHVpbnQzMl90KiBjLCB1aW50MzJfdCogYSk7Ci12b2lkIG11bHRpcHJlY2lzaW9uX2Zhc3RfbW9kX1AyNTYodWludDMyX3QqIGMsIHVpbnQzMl90KiBhKTsKZGlmZiAtLWdpdCBhL3N0YWNrL3NtcC9zbXBfYWN0LmNjIGIvc3RhY2svc21wL3NtcF9hY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjU0NGEuLjAwMDAwMDAKLS0tIGEvc3RhY2svc21wL3NtcF9hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAic21wX2FjdCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXBpLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJpbnRlcm5hbF9pbmNsdWRlL2J0X3RhcmdldC5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zbXBfYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svc21wL3BfMjU2X2VjY19wcC5oIgotI2luY2x1ZGUgInN0YWNrL3NtcC9zbXBfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi0jZGVmaW5lIFNNUF9LRVlfRElTVF9UWVBFX01BWCA0Ci0KLWNvbnN0IHRTTVBfQUNUIHNtcF9kaXN0cmlidXRlX2FjdFtdID0gewotICAgIHNtcF9nZW5lcmF0ZV9sdGssICAgICAgIC8qIFNNUF9TRUNfS0VZX1RZUEVfRU5DIC0gJzEnIGJpdCBpbmRleCAqLwotICAgIHNtcF9zZW5kX2lkX2luZm8sICAgICAgIC8qIFNNUF9TRUNfS0VZX1RZUEVfSUQgLSAnMScgYml0IGluZGV4ICovCi0gICAgc21wX2dlbmVyYXRlX2NzcmssICAgICAgLyogU01QX1NFQ19LRVlfVFlQRV9DU1JLIC0gJzEnIGJpdCBpbmRleCAqLwotICAgIHNtcF9zZXRfZGVyaXZlX2xpbmtfa2V5IC8qIFNNUF9TRUNfS0VZX1RZUEVfTEsgLSAnMScgYml0IGluZGV4ICovCi19OwotCi1zdGF0aWMgYm9vbCBwdHNfdGVzdF9zZW5kX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX2ZhaWx1cmUodFNNUF9DQiogcF9jYikgewotICB0U01QX1NUQVRVUyByZWFzb24gPSBwX2NiLT5jZXJ0X2ZhaWx1cmU7Ci0gIGlmIChyZWFzb24gPT0gU01QX1BBSVJfQVVUSF9GQUlMIHx8IHJlYXNvbiA9PSBTTVBfUEFJUl9GQUlMX1VOS05PV04gfHwKLSAgICAgIHJlYXNvbiA9PSBTTVBfUEFJUl9OT1RfU1VQUE9SVCB8fCByZWFzb24gPT0gU01QX1BBU1NLRVlfRU5UUllfRkFJTCB8fAotICAgICAgcmVhc29uID09IFNNUF9SRVBFQVRFRF9BVFRFTVBUUykgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSByZWFzb247Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF91cGRhdGVfa2V5X21hc2sKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBrZXkgbWFzayBmb3Igc2VuZGluZyBvciByZWNlaXZpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc21wX3VwZGF0ZV9rZXlfbWFzayh0U01QX0NCKiBwX2NiLCB1aW50OF90IGtleV90eXBlLCBib29sIHJlY3YpIHsKLSAgU01QX1RSQUNFX0RFQlVHKAotICAgICAgIiVzIGJlZm9yZSB1cGRhdGUgcm9sZT0lZCByZWN2PSVkIGxvY2FsX2lfa2V5ID0gJTAyeCwgbG9jYWxfcl9rZXkgPSAlMDJ4IiwKLSAgICAgIF9fZnVuY19fLCBwX2NiLT5yb2xlLCByZWN2LCBwX2NiLT5sb2NhbF9pX2tleSwgcF9jYi0+bG9jYWxfcl9rZXkpOwotCi0gIGlmICgoKHBfY2ItPmxlX3NlY3VyZV9jb25uZWN0aW9uc19tb2RlX2lzX3VzZWQpIHx8IChwX2NiLT5zbXBfb3Zlcl9icikpICYmCi0gICAgICAoKGtleV90eXBlID09IFNNUF9TRUNfS0VZX1RZUEVfRU5DKSB8fAotICAgICAgIChrZXlfdHlwZSA9PSBTTVBfU0VDX0tFWV9UWVBFX0xLKSkpIHsKLSAgICAvKiBpbiBMRSBTQyBtb2RlIExUSywgQ1NSSyBhbmQgQlIvRURSIExLIGFyZSBkZXJpdmVkIGxvY2FsbHkgaW5zdGVhZCBvZgotICAgICoqIGJlaW5nIGV4Y2hhbmdlZCB3aXRoIHRoZSBwZWVyICovCi0gICAgcF9jYi0+bG9jYWxfaV9rZXkgJj0gfmtleV90eXBlOwotICAgIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IH5rZXlfdHlwZTsKLSAgfSBlbHNlIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpIHsKLSAgICBpZiAocmVjdikKLSAgICAgIHBfY2ItPmxvY2FsX2lfa2V5ICY9IH5rZXlfdHlwZTsKLSAgICBlbHNlCi0gICAgICBwX2NiLT5sb2NhbF9yX2tleSAmPSB+a2V5X3R5cGU7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHJlY3YpCi0gICAgICBwX2NiLT5sb2NhbF9yX2tleSAmPSB+a2V5X3R5cGU7Ci0gICAgZWxzZQotICAgICAgcF9jYi0+bG9jYWxfaV9rZXkgJj0gfmtleV90eXBlOwotICB9Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCJ1cGRhdGVkIGxvY2FsX2lfa2V5ID0gJTAyeCwgbG9jYWxfcl9rZXkgPSAlMDJ4IiwKLSAgICAgICAgICAgICAgICAgIHBfY2ItPmxvY2FsX2lfa2V5LCBwX2NiLT5sb2NhbF9yX2tleSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NlbmRfYXBwX2NiYWNrCi0gKiBEZXNjcmlwdGlvbiAgbm90aWZpZXMgYXBwbGljYXRpb24gYWJvdXQgdGhlIGV2ZW50cyB0aGUgYXBwbGljYXRpb24gaXMKLSAqICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2VuZF9hcHBfY2JhY2sodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRTTVBfRVZUX0RBVEEgY2JfZGF0YTsKLSAgdEJUTV9TVEFUVVMgY2FsbGJhY2tfcmM7Ci0gIHVpbnQ4X3QgcmVtb3RlX2xtcF92ZXJzaW9uID0gMDsKLSAgaWYgKHBfY2ItPnBfY2FsbGJhY2sgJiYgcF9jYi0+Y2JfZXZ0ICE9IDApIHsKLSAgICBzd2l0Y2ggKHBfY2ItPmNiX2V2dCkgewotICAgICAgY2FzZSBTTVBfSU9fQ0FQX1JFUV9FVlQ6Ci0gICAgICAgIGNiX2RhdGEuaW9fcmVxLmF1dGhfcmVxID0gcF9jYi0+cGVlcl9hdXRoX3JlcTsKLSAgICAgICAgY2JfZGF0YS5pb19yZXEub29iX2RhdGEgPSBTTVBfT09CX05PTkU7Ci0gICAgICAgIGNiX2RhdGEuaW9fcmVxLmlvX2NhcCA9IGJ0aWZfc3RvcmFnZV9nZXRfbG9jYWxfaW9fY2Fwc19ibGUoKTsKLSAgICAgICAgY2JfZGF0YS5pb19yZXEubWF4X2tleV9zaXplID0gU01QX01BWF9FTkNfS0VZX1NJWkU7Ci0gICAgICAgIGNiX2RhdGEuaW9fcmVxLmluaXRfa2V5cyA9IHBfY2ItPmxvY2FsX2lfa2V5OwotICAgICAgICBjYl9kYXRhLmlvX3JlcS5yZXNwX2tleXMgPSBwX2NiLT5sb2NhbF9yX2tleTsKLSAgICAgICAgTE9HX0RFQlVHKCJOb3RpZnkgYXBwIGlvX2NhcCA9ICVoaHUiLCBjYl9kYXRhLmlvX3JlcS5pb19jYXApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTTVBfTkNfUkVRX0VWVDoKLSAgICAgICAgY2JfZGF0YS5wYXNza2V5ID0gcF9kYXRhLT5wYXNza2V5OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU01QX1NDX09PQl9SRVFfRVZUOgotICAgICAgICBjYl9kYXRhLnJlcV9vb2JfdHlwZSA9IHBfZGF0YS0+cmVxX29vYl90eXBlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU01QX1NDX0xPQ19PT0JfREFUQV9VUF9FVlQ6Ci0gICAgICAgIGNiX2RhdGEubG9jX29vYl9kYXRhID0gcF9jYi0+c2Nfb29iX2RhdGEubG9jX29vYl9kYXRhOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTTVBfQlJfS0VZU19SRVFfRVZUOgotICAgICAgICBjYl9kYXRhLmlvX3JlcS5hdXRoX3JlcSA9IDA7Ci0gICAgICAgIGNiX2RhdGEuaW9fcmVxLm9vYl9kYXRhID0gU01QX09PQl9OT05FOwotICAgICAgICBjYl9kYXRhLmlvX3JlcS5pb19jYXAgPSAwOwotICAgICAgICBjYl9kYXRhLmlvX3JlcS5tYXhfa2V5X3NpemUgPSBTTVBfTUFYX0VOQ19LRVlfU0laRTsKLSAgICAgICAgY2JfZGF0YS5pb19yZXEuaW5pdF9rZXlzID0gU01QX0JSX1NFQ19ERUZBVUxUX0tFWTsKLSAgICAgICAgY2JfZGF0YS5pb19yZXEucmVzcF9rZXlzID0gU01QX0JSX1NFQ19ERUZBVUxUX0tFWTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19FUlJPUigiVW5leHBlY3RlZCBldmVudDolaGh1IiwgcF9jYi0+Y2JfZXZ0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FsbGJhY2tfcmMgPQotICAgICAgICAoKnBfY2ItPnBfY2FsbGJhY2spKHBfY2ItPmNiX2V2dCwgcF9jYi0+cGFpcmluZ19iZGEsICZjYl9kYXRhKTsKLQotICAgIGlmIChjYWxsYmFja19yYyA9PSBCVE1fU1VDQ0VTUykgewotICAgICAgc3dpdGNoIChwX2NiLT5jYl9ldnQpIHsKLSAgICAgICAgY2FzZSBTTVBfSU9fQ0FQX1JFUV9FVlQ6Ci0gICAgICAgICAgcF9jYi0+bG9jX2F1dGhfcmVxID0gY2JfZGF0YS5pb19yZXEuYXV0aF9yZXE7Ci0gICAgICAgICAgcF9jYi0+bG9jYWxfaW9fY2FwYWJpbGl0eSA9IGNiX2RhdGEuaW9fcmVxLmlvX2NhcDsKLSAgICAgICAgICBwX2NiLT5sb2Nfb29iX2ZsYWcgPSBjYl9kYXRhLmlvX3JlcS5vb2JfZGF0YTsKLSAgICAgICAgICBwX2NiLT5sb2NfZW5jX3NpemUgPSBjYl9kYXRhLmlvX3JlcS5tYXhfa2V5X3NpemU7Ci0gICAgICAgICAgcF9jYi0+bG9jYWxfaV9rZXkgPSBjYl9kYXRhLmlvX3JlcS5pbml0X2tleXM7Ci0gICAgICAgICAgcF9jYi0+bG9jYWxfcl9rZXkgPSBjYl9kYXRhLmlvX3JlcS5yZXNwX2tleXM7Ci0KLSAgICAgICAgICBpZiAoIShwX2NiLT5sb2NfYXV0aF9yZXEgJiBTTVBfQVVUSF9CT05EKSkgewotICAgICAgICAgICAgTE9HX0lORk8oIk5vbiBib25kaW5nOiBObyBrZXlzIHdpbGwgYmUgZXhjaGFuZ2VkIik7Ci0gICAgICAgICAgICBwX2NiLT5sb2NhbF9pX2tleSA9IDA7Ci0gICAgICAgICAgICBwX2NiLT5sb2NhbF9yX2tleSA9IDA7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgICAiUmVtb3RlIHJlcXVlc3QgSU8gY2FwYWJpbGl0aWVzIHByZWNvbmRpdGlvbiBhdXRoX3JlcTogMHglMDJ4LCIKLSAgICAgICAgICAgICAgIiBpb19jYXA6ICVkIGxvY19vb2JfZmxhZzogJWQgbG9jX2VuY19zaXplOiAlZCwgIgotICAgICAgICAgICAgICAibG9jYWxfaV9rZXk6IDB4JTAyeCwgbG9jYWxfcl9rZXk6IDB4JTAyeCIsCi0gICAgICAgICAgICAgIHBfY2ItPmxvY19hdXRoX3JlcSwgcF9jYi0+bG9jYWxfaW9fY2FwYWJpbGl0eSwgcF9jYi0+bG9jX29vYl9mbGFnLAotICAgICAgICAgICAgICBwX2NiLT5sb2NfZW5jX3NpemUsIHBfY2ItPmxvY2FsX2lfa2V5LCBwX2NiLT5sb2NhbF9yX2tleSk7Ci0KLSAgICAgICAgICBwX2NiLT5zZWN1cmVfY29ubmVjdGlvbnNfb25seV9tb2RlX3JlcXVpcmVkID0KLSAgICAgICAgICAgICAgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgICAgLyoganVzdCBmb3IgUFRTLCBmb3JjZSBTQyBiaXQgKi8KLSAgICAgICAgICBpZiAocF9jYi0+c2VjdXJlX2Nvbm5lY3Rpb25zX29ubHlfbW9kZV9yZXF1aXJlZCkgewotICAgICAgICAgICAgcF9jYi0+bG9jX2F1dGhfcmVxIHw9IFNNUF9TQ19TVVBQT1JUX0JJVDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIUJUTV9SZWFkUmVtb3RlVmVyc2lvbihwX2NiLT5wYWlyaW5nX2JkYSwgJnJlbW90ZV9sbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyKSkgewotICAgICAgICAgICAgTE9HX1dBUk4oCi0gICAgICAgICAgICAgICAgIlNNUCBVbmFibGUgdG8gZGV0ZXJtaW5lIHJlbW90ZSBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgInJlbW90ZV9sbXBfdmVyc2lvbjolaHUiLAotICAgICAgICAgICAgICAgIHJlbW90ZV9sbXBfdmVyc2lvbik7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCFibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmICghcF9jYi0+c2VjdXJlX2Nvbm5lY3Rpb25zX29ubHlfbW9kZV9yZXF1aXJlZCAmJgotICAgICAgICAgICAgICAgICghKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9TQ19TVVBQT1JUX0JJVCkgfHwKLSAgICAgICAgICAgICAgICAgcmVtb3RlX2xtcF92ZXJzaW9uIDwgSENJX1BST1RPX1ZFUlNJT05fNF8yIHx8Ci0gICAgICAgICAgICAgICAgIGludGVyb3BfbWF0Y2hfYWRkcihJTlRFUk9QX0RJU0FCTEVfTEVfU0VDVVJFX0NPTk5FQ1RJT05TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MqKSZwX2NiLT5wYWlyaW5nX2JkYSkpKSB7Ci0gICAgICAgICAgICAgIHBfY2ItPmxvY19hdXRoX3JlcSAmPSB+U01QX1NDX1NVUFBPUlRfQklUOwotICAgICAgICAgICAgICBwX2NiLT5sb2NfYXV0aF9yZXEgJj0gflNNUF9LUF9TVVBQT1JUX0JJVDsKLSAgICAgICAgICAgICAgcF9jYi0+bG9jYWxfaV9rZXkgJj0gflNNUF9TRUNfS0VZX1RZUEVfTEs7Ci0gICAgICAgICAgICAgIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVtb3RlX2xtcF92ZXJzaW9uIDwgSENJX1BST1RPX1ZFUlNJT05fNV8wKSB7Ci0gICAgICAgICAgICAgIHBfY2ItPmxvY19hdXRoX3JlcSAmPSB+U01QX0g3X1NVUFBPUlRfQklUOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIExPR19ERUJVRygKLSAgICAgICAgICAgICAgIlJlbW90ZSByZXF1ZXN0IElPIGNhcGFiaWxpdGllcyBwb3N0Y29uZGl0aW9uIGF1dGhfcmVxOiAweCUwMngsIgotICAgICAgICAgICAgICAiIGxvY2FsX2lfa2V5OiAweCUwMngsIGxvY2FsX3Jfa2V5OiAweCUwMngiLAotICAgICAgICAgICAgICBwX2NiLT5sb2NfYXV0aF9yZXEsIHBfY2ItPmxvY2FsX2lfa2V5LCBwX2NiLT5sb2NhbF9yX2tleSk7Ci0KLSAgICAgICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0lPX1JTUF9FVlQsIE5VTEwpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU01QX0JSX0tFWVNfUkVRX0VWVDoKLSAgICAgICAgICBwX2NiLT5sb2NfZW5jX3NpemUgPSBjYl9kYXRhLmlvX3JlcS5tYXhfa2V5X3NpemU7Ci0gICAgICAgICAgcF9jYi0+bG9jYWxfaV9rZXkgPSBjYl9kYXRhLmlvX3JlcS5pbml0X2tleXM7Ci0gICAgICAgICAgcF9jYi0+bG9jYWxfcl9rZXkgPSBjYl9kYXRhLmlvX3JlcS5yZXNwX2tleXM7Ci0gICAgICAgICAgcF9jYi0+bG9jX2F1dGhfcmVxIHw9IFNNUF9IN19TVVBQT1JUX0JJVDsKLQotICAgICAgICAgIHBfY2ItPmxvY2FsX2lfa2V5ICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotICAgICAgICAgIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotCi0gICAgICAgICAgTE9HX0RFQlVHKAotICAgICAgICAgICAgICAiZm9yIFNNUCBvdmVyIEJSIG1heF9rZXlfc2l6ZTogMHglMDJ4LCBsb2NhbF9pX2tleTogMHglMDJ4LCAiCi0gICAgICAgICAgICAgICJsb2NhbF9yX2tleTogMHglMDJ4LCBwX2NiLT5sb2NfYXV0aF9yZXE6IDB4JTAyeCIsCi0gICAgICAgICAgICAgIHBfY2ItPmxvY19lbmNfc2l6ZSwgcF9jYi0+bG9jYWxfaV9rZXksIHBfY2ItPmxvY2FsX3Jfa2V5LAotICAgICAgICAgICAgICBwX2NiLT5sb2NfYXV0aF9yZXEpOwotCi0gICAgICAgICAgc21wX2JyX3N0YXRlX21hY2hpbmVfZXZlbnQocF9jYiwgU01QX0JSX0tFWVNfUlNQX0VWVCwgTlVMTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gRXhwZWN0ZWQsIGJ1dCBub3RoaW5nIHRvIGRvCi0gICAgICAgIGNhc2UgU01QX1NDX0xPQ19PT0JfREFUQV9VUF9FVlQ6Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfRVJST1IoIlVuZXhwZWN0ZWQgZXZlbnQ6ICVoaHUiLCBwX2NiLT5jYl9ldnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghcF9jYi0+Y2JfZXZ0ICYmIHBfY2ItPmRpc2NhcmRfc2VjX3JlcSkgewotICAgIHBfY2ItPmRpc2NhcmRfc2VjX3JlcSA9IGZhbHNlOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfRElTQ0FSRF9TRUNfUkVRX0VWVCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfc2VuZF9wYWlyX2ZhaWwKLSAqIERlc2NyaXB0aW9uICBwYWlyaW5nIGZhaWx1cmUgdG8gcGVlciBkZXZpY2UgaWYgbmVlZGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NlbmRfcGFpcl9mYWlsKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBwX2NiLT5zdGF0dXMgPSBwX2RhdGEtPnN0YXR1czsKLSAgcF9jYi0+ZmFpbHVyZSA9IHBfZGF0YS0+c3RhdHVzOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXM6IHN0YXR1cz0lZCBmYWlsdXJlPSVkICIsIF9fZnVuY19fLCBwX2NiLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICBwX2NiLT5mYWlsdXJlKTsKLQotICBpZiAocF9jYi0+c3RhdHVzIDw9IFNNUF9NQVhfRkFJTF9SU05fUEVSX1NQRUMgJiYKLSAgICAgIHBfY2ItPnN0YXR1cyAhPSBTTVBfU1VDQ0VTUykgewotICAgIHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX1BBSVJJTkdfRkFJTEVELCBwX2NiKTsKLSAgICBwX2NiLT53YWl0X2Zvcl9hdXRob3JpemF0aW9uX2NvbXBsZXRlID0gdHJ1ZTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9zZW5kX3BhaXJfcmVxCi0gKiBEZXNjcmlwdGlvbiAgYWN0aW9ucyByZWxhdGVkIHRvIHNlbmRpbmcgcGFpcmluZyByZXF1ZXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2VuZF9wYWlyX3JlcSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KHBfY2ItPnBhaXJpbmdfYmRhKTsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICAvKiBlcmFzZSBhbGwga2V5cyB3aGVuIGNlbnRyYWwgc2VuZHMgcGFpcmluZyByZXEqLwotICBpZiAocF9kZXZfcmVjKSBidG1fc2VjX2NsZWFyX2JsZV9rZXlzKHBfZGV2X3JlYyk7Ci0gIC8qIGRvIG5vdCBtYW5pcHVsYXRlIHRoZSBrZXksIGxldCBhcHAgZGVjaWRlLAotICAgICBsZWF2ZSBvdXQgdG8gQlRNIHRvIG1hbmRhdGUga2V5IGRpc3RyaWJ1dGlvbiBmb3IgYm9uZGluZyBjYXNlICovCi0gIHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX1BBSVJJTkdfUkVRLCBwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfc2VuZF9wYWlyX3JzcAotICogRGVzY3JpcHRpb24gIGFjdGlvbnMgcmVsYXRlZCB0byBzZW5kaW5nIHBhaXJpbmcgcmVzcG9uc2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9zZW5kX3BhaXJfcnNwKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHBfY2ItPmxvY2FsX2lfa2V5ICY9IHBfY2ItPnBlZXJfaV9rZXk7Ci0gIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IHBfY2ItPnBlZXJfcl9rZXk7Ci0KLSAgaWYgKHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX1BBSVJJTkdfUlNQLCBwX2NiKSkgewotICAgIGlmIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9PSBTTVBfTU9ERUxfU0VDX0NPTk5fT09CKQotICAgICAgc21wX3VzZV9vb2JfcHJpdmF0ZV9rZXkocF9jYiwgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgc21wX2RlY2lkZV9hc3NvY2lhdGlvbl9tb2RlbChwX2NiLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9zZW5kX2NvbmZpcm0KLSAqIERlc2NyaXB0aW9uICBzZW5kIGNvbmZpcm1hdGlvbiB0byB0aGUgcGVlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NlbmRfY29uZmlybSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX3NlbmRfY21kKFNNUF9PUENPREVfQ09ORklSTSwgcF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NlbmRfaW5pdAotICogRGVzY3JpcHRpb24gIHByb2Nlc3MgcGFpcmluZyBpbml0aWFsaXplciB0byBwZXJpcGhlcmFsIGRldmljZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NlbmRfaW5pdCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX3NlbmRfY21kKFNNUF9PUENPREVfSU5JVCwgcF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NlbmRfcmFuZAotICogRGVzY3JpcHRpb24gIHNlbmQgcGFpcmluZyByYW5kb20gdG8gdGhlIHBlZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9zZW5kX3JhbmQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX1JBTkQsIHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9zZW5kX3BhaXJfcHVibGljX2tleQotICogRGVzY3JpcHRpb24gIHNlbmQgcGFpcmluZyBwdWJsaWMga2V5IGNvbW1hbmQgdG8gdGhlIHBlZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9zZW5kX3BhaXJfcHVibGljX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX3NlbmRfY21kKFNNUF9PUENPREVfUEFJUl9QVUJMSUNfS0VZLCBwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBTTVBfU0VORF9DT01NSVRNRU5UCi0gKiBEZXNjcmlwdGlvbiBzZW5kIGNvbW1pdG1lbnQgY29tbWFuZCB0byB0aGUgcGVlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NlbmRfY29tbWl0bWVudCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX3NlbmRfY21kKFNNUF9PUENPREVfUEFJUl9DT01NSVRNLCBwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfc2VuZF9kaGtleV9jaGVjawotICogRGVzY3JpcHRpb24gc2VuZCBESEtleSBDaGVjayBjb21tYW5kIHRvIHRoZSBwZWVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2VuZF9kaGtleV9jaGVjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX3NlbmRfY21kKFNNUF9PUENPREVfUEFJUl9ESEtFWV9DSEVDSywgcF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NlbmRfa2V5cHJlc3Nfbm90aWZpY2F0aW9uCi0gKiBEZXNjcmlwdGlvbiBzZW5kIEtleXByZXNzIE5vdGlmaWNhdGlvbiBjb21tYW5kIHRvIHRoZSBwZWVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2VuZF9rZXlwcmVzc19ub3RpZmljYXRpb24odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHBfY2ItPmxvY2FsX2tleXByZXNzX25vdGlmaWNhdGlvbiA9IHBfZGF0YS0+c3RhdHVzOwotICBzbXBfc2VuZF9jbWQoU01QX09QQ09ERV9QQUlSX0tFWVBSX05PVElGLCBwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfc2VuZF9lbmNfaW5mbwotICogRGVzY3JpcHRpb24gIHNlbmQgZW5jcnlwdGlvbiBpbmZvcm1hdGlvbiBjb21tYW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NlbmRfZW5jX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlczogcF9jYi0+bG9jX2VuY19zaXplID0gJWQiLCBfX2Z1bmNfXywgcF9jYi0+bG9jX2VuY19zaXplKTsKLSAgc21wX3VwZGF0ZV9rZXlfbWFzayhwX2NiLCBTTVBfU0VDX0tFWV9UWVBFX0VOQywgZmFsc2UpOwotCi0gIHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX0VOQ1JZUFRfSU5GTywgcF9jYik7Ci0gIHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX0NFTlRSQUxfSUQsIHBfY2IpOwotCi0gIC8qIHNhdmUgdGhlIERJViBhbmQga2V5IHNpemUgaW5mb3JtYXRpb24gd2hlbiBhY3RpbmcgYXMgcGVyaXBoZXJhbCBkZXZpY2UgKi8KLSAgdEJUTV9MRV9LRVlfVkFMVUUgbGVfa2V5ID0gewotICAgICAgLmxlbmNfa2V5ID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5sdGsgPSBwX2NiLT5sdGssCi0gICAgICAgICAgICAgIC5kaXYgPSBwX2NiLT5kaXYsCi0gICAgICAgICAgICAgIC5rZXlfc2l6ZSA9IHBfY2ItPmxvY19lbmNfc2l6ZSwKLSAgICAgICAgICAgICAgLnNlY19sZXZlbCA9IHBfY2ItPnNlY19sZXZlbCwKLSAgICAgICAgICB9LAotICB9OwotCi0gIGlmICgocF9jYi0+cGVlcl9hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpICYmCi0gICAgICAocF9jYi0+bG9jX2F1dGhfcmVxICYgU01QX0FVVEhfQk9ORCkpCi0gICAgYnRtX3NlY19zYXZlX2xlX2tleShwX2NiLT5wYWlyaW5nX2JkYSwgQlRNX0xFX0tFWV9MRU5DLCAmbGVfa2V5LCB0cnVlKTsKLQotICBTTVBfVFJBQ0VfV0FSTklORygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgc21wX2tleV9kaXN0cmlidXRpb24ocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NlbmRfaWRfaW5mbwotICogRGVzY3JpcHRpb24gIHNlbmQgSUQgaW5mb3JtYXRpb24gY29tbWFuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9zZW5kX2lkX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHNtcF91cGRhdGVfa2V5X21hc2socF9jYiwgU01QX1NFQ19LRVlfVFlQRV9JRCwgZmFsc2UpOwotCi0gIHNtcF9zZW5kX2NtZChTTVBfT1BDT0RFX0lERU5USVRZX0lORk8sIHBfY2IpOwotICBzbXBfc2VuZF9jbWQoU01QX09QQ09ERV9JRF9BRERSLCBwX2NiKTsKLQotICBpZiAoKHBfY2ItPnBlZXJfYXV0aF9yZXEgJiBTTVBfQVVUSF9CT05EKSAmJgotICAgICAgKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpKQotICAgIGJ0bV9zZWNfc2F2ZV9sZV9rZXkocF9jYi0+cGFpcmluZ19iZGEsIEJUTV9MRV9LRVlfTElELCBudWxscHRyLCB0cnVlKTsKLQotICBzbXBfa2V5X2Rpc3RyaWJ1dGlvbl9ieV90cmFuc3BvcnQocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKiAgc2VuZCBDU1JLIGNvbW1hbmQuICovCi12b2lkIHNtcF9zZW5kX2NzcmtfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX3VwZGF0ZV9rZXlfbWFzayhwX2NiLCBTTVBfU0VDX0tFWV9UWVBFX0NTUkssIGZhbHNlKTsKLQotICBpZiAoc21wX3NlbmRfY21kKFNNUF9PUENPREVfU0lHTl9JTkZPLCBwX2NiKSkgewotICAgIHRCVE1fTEVfS0VZX1ZBTFVFIGtleSA9IHsKLSAgICAgICAgLmxjc3JrX2tleSA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLmRpdiA9IHBfY2ItPmRpdiwKLSAgICAgICAgICAgICAgICAuc2VjX2xldmVsID0gcF9jYi0+c2VjX2xldmVsLAotICAgICAgICAgICAgICAgIC5jb3VudGVyID0gMCwgLyogaW5pdGlhbGl6ZSB0aGUgbG9jYWwgY291bnRlciAqLwotICAgICAgICAgICAgICAgIC5jc3JrID0gcF9jYi0+Y3NyaywKLSAgICAgICAgICAgIH0sCi0gICAgfTsKLSAgICBidG1fc2VjX3NhdmVfbGVfa2V5KHBfY2ItPnBhaXJpbmdfYmRhLCBCVE1fTEVfS0VZX0xDU1JLLCAma2V5LCB0cnVlKTsKLSAgfQotCi0gIHNtcF9rZXlfZGlzdHJpYnV0aW9uX2J5X3RyYW5zcG9ydChwX2NiLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfc2VuZF9sdGtfcmVwbHkKLSAqIERlc2NyaXB0aW9uICBzZW5kIExUSyByZXBseQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NlbmRfbHRrX3JlcGx5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIE9jdGV0MTYgc3RrOwotICBtZW1jcHkoc3RrLmRhdGEoKSwgcF9kYXRhLT5rZXkucF9kYXRhLCBzdGsuc2l6ZSgpKTsKLSAgLyogc2VuZCBzdGsgYXMgTFRLIHJlc3BvbnNlICovCi0gIGJ0bV9ibGVfbHRrX3JlcXVlc3RfcmVwbHkocF9jYi0+cGFpcmluZ19iZGEsIHRydWUsIHN0ayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3Byb2Nfc2VjX3JlcQotICogRGVzY3JpcHRpb24gIHByb2Nlc3Mgc2VjdXJpdHkgcmVxdWVzdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jX3NlY19yZXEodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRCVE1fTEVfQVVUSF9SRVEgYXV0aF9yZXEgPSAqKHRCVE1fTEVfQVVUSF9SRVEqKXBfZGF0YS0+cF9kYXRhOwotICB0QlRNX0JMRV9TRUNfUkVRX0FDVCBzZWNfcmVxX2FjdDsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzOiBhdXRoX3JlcT0weCV4IiwgX19mdW5jX18sIGF1dGhfcmVxKTsKLQotICBwX2NiLT5jYl9ldnQgPSBTTVBfRVZUX05PTkU7Ci0KLSAgYnRtX2JsZV9saW5rX3NlY19jaGVjayhwX2NiLT5wYWlyaW5nX2JkYSwgYXV0aF9yZXEsICZzZWNfcmVxX2FjdCk7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlczogc2VjX3JlcV9hY3Q9MHgleCIsIF9fZnVuY19fLCBzZWNfcmVxX2FjdCk7Ci0KLSAgc3dpdGNoIChzZWNfcmVxX2FjdCkgewotICAgIGNhc2UgQlRNX0JMRV9TRUNfUkVRX0FDVF9FTkNSWVBUOgotICAgICAgU01QX1RSQUNFX0RFQlVHKCIlczogQlRNX0JMRV9TRUNfUkVRX0FDVF9FTkNSWVBUIiwgX19mdW5jX18pOwotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9FTkNfUkVRX0VWVCwgTlVMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX0JMRV9TRUNfUkVRX0FDVF9QQUlSOgotICAgICAgcF9jYi0+c2VjdXJlX2Nvbm5lY3Rpb25zX29ubHlfbW9kZV9yZXF1aXJlZCA9Ci0gICAgICAgICAgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgPyB0cnVlIDogZmFsc2U7Ci0KLSAgICAgIC8qIHJlc3BvbmQgdG8gbm9uIFNDIHBhaXJpbmcgcmVxdWVzdCBhcyBmYWlsdXJlIGluIFNDIG9ubHkgbW9kZSAqLwotICAgICAgaWYgKHBfY2ItPnNlY3VyZV9jb25uZWN0aW9uc19vbmx5X21vZGVfcmVxdWlyZWQgJiYKLSAgICAgICAgICAoYXV0aF9yZXEgJiBTTVBfU0NfU1VQUE9SVF9CSVQpID09IDApIHsKLSAgICAgICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfUEFJUl9BVVRIX0ZBSUw7Ci0gICAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBpbml0aWFsaXplIGxvY2FsIGkvciBrZXkgdG8gYmUgZGVmYXVsdCBrZXlzICovCi0gICAgICAgIHBfY2ItPnBlZXJfYXV0aF9yZXEgPSBhdXRoX3JlcTsKLSAgICAgICAgcF9jYi0+bG9jYWxfcl9rZXkgPSBwX2NiLT5sb2NhbF9pX2tleSA9IFNNUF9TRUNfREVGQVVMVF9LRVk7Ci0gICAgICAgIHBfY2ItPmNiX2V2dCA9IFNNUF9TRUNfUkVRVUVTVF9FVlQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRNX0JMRV9TRUNfUkVRX0FDVF9ESVNDQVJEOgotICAgICAgcF9jYi0+ZGlzY2FyZF9zZWNfcmVxID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIGRvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3Byb2Nfc2VjX2dyYW50Ci0gKiBEZXNjcmlwdGlvbiAgcHJvY2VzcyBzZWN1cml0eSBncmFudC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jX3NlY19ncmFudCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCByZXMgPSBwX2RhdGEtPnN0YXR1czsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKHJlcyAhPSBTTVBfU1VDQ0VTUykgewotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgcF9kYXRhKTsKLSAgfSBlbHNlIC8qb3RoZXJ3aXNlLCBzdGFydCBwYWlyaW5nICovCi0gIHsKLSAgICAvKiBzZW5kIElPIHJlcXVlc3QgY2FsbGJhY2sgKi8KLSAgICBwX2NiLT5jYl9ldnQgPSBTTVBfSU9fQ0FQX1JFUV9FVlQ7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfcHJvY19wYWlyX2ZhaWwKLSAqIERlc2NyaXB0aW9uICBwcm9jZXNzIHBhaXJpbmcgZmFpbHVyZSBmcm9tIHBlZXIgZGV2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY19wYWlyX2ZhaWwodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHBfY2ItPnJjdmRfY21kX2xlbiA8IDIpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTIxNDczOSIpOwotICAgIFNNUF9UUkFDRV9XQVJOSU5HKCIlczogcmN2ZF9jbWRfbGVuICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAyIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9jYi0+cmN2ZF9jbWRfbGVuKTsKLSAgICBwX2NiLT5zdGF0dXMgPSBTTVBfSU5WQUxJRF9QQVJBTUVURVJTOwotICB9IGVsc2UgewotICAgIHBfY2ItPnN0YXR1cyA9IHBfZGF0YS0+c3RhdHVzOwotICB9Ci0KLSAgLyogQ2FuY2VsIHBlbmRpbmcgYXV0aCBjb21wbGV0ZSB0aW1lciBpZiBzZXQgKi8KLSAgYWxhcm1fY2FuY2VsKHBfY2ItPmRlbGF5ZWRfYXV0aF90aW1lcl9lbnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jX3BhaXJfY21kCi0gKiBEZXNjcmlwdGlvbiAgUHJvY2VzcyB0aGUgU01QIHBhaXJpbmcgcmVxdWVzdC9yZXNwb25zZSBmcm9tIHBlZXIgZGV2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY19wYWlyX2NtZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMgPSBidG1fZmluZF9kZXYocF9jYi0+cGFpcmluZ19iZGEpOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXM6IHBhaXJpbmdfYmRhPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2NiLT5wYWlyaW5nX2JkYS5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIC8qIGVyYXNlIGFsbCBrZXlzIGlmIGl0IGlzIHBlcmlwaGVyYWwgcHJvYyBwYWlyaW5nIHJlcSAqLwotICBpZiAocF9kZXZfcmVjICYmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpKQotICAgIGJ0bV9zZWNfY2xlYXJfYmxlX2tleXMocF9kZXZfcmVjKTsKLQotICBwX2NiLT5mbGFncyB8PSBTTVBfUEFJUl9GTEFHX0VOQ19BRlRFUl9QQUlSOwotCi0gIGlmIChzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9sZW5ndGgocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTg1MDcwNiIpOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX1VJTlQ4KHBfY2ItPnBlZXJfaW9fY2FwcywgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChwX2NiLT5wZWVyX29vYl9mbGFnLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHBfY2ItPnBlZXJfYXV0aF9yZXEsIHApOwotICBTVFJFQU1fVE9fVUlOVDgocF9jYi0+cGVlcl9lbmNfc2l6ZSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChwX2NiLT5wZWVyX2lfa2V5LCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHBfY2ItPnBlZXJfcl9rZXksIHApOwotCi0gIGlmIChzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9wYXJhbWV0ZXJzKHBfY2IpKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9JTlZBTElEX1BBUkFNRVRFUlM7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBQVFMgVGVzdGluZyBmYWlsdXJlIG1vZGVzCi0gIGlmIChwdHNfdGVzdF9zZW5kX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlX2ZhaWx1cmUocF9jYikpIHJldHVybjsKLQotICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKSB7Ci0gICAgaWYgKCEocF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSkgewotICAgICAgLyogcGVlciAoY2VudHJhbCkgc3RhcnRlZCBwYWlyaW5nIHNlbmRpbmcgUGFpcmluZyBSZXF1ZXN0ICovCi0gICAgICBwX2NiLT5sb2NhbF9pX2tleSA9IHBfY2ItPnBlZXJfaV9rZXk7Ci0gICAgICBwX2NiLT5sb2NhbF9yX2tleSA9IHBfY2ItPnBlZXJfcl9rZXk7Ci0KLSAgICAgIHBfY2ItPmNiX2V2dCA9IFNNUF9TRUNfUkVRVUVTVF9FVlQ7Ci0gICAgfSBlbHNlIC8qIHVwZGF0ZSBsb2NhbCBpL3Iga2V5IGFjY29yZGluZyB0byBwYWlyaW5nIHJlcXVlc3QgKi8KLSAgICB7Ci0gICAgICAvKiBwYWlyaW5nIHN0YXJ0ZWQgd2l0aCB0aGlzIHNpZGUgKHBlcmlwaGVyYWwpIHNlbmRpbmcgU2VjdXJpdHkgUmVxdWVzdCAqLwotICAgICAgcF9jYi0+bG9jYWxfaV9rZXkgJj0gcF9jYi0+cGVlcl9pX2tleTsKLSAgICAgIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IHBfY2ItPnBlZXJfcl9rZXk7Ci0gICAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9IHNtcF9zZWxlY3RfYXNzb2NpYXRpb25fbW9kZWwocF9jYik7Ci0KLSAgICAgIGlmIChwX2NiLT5zZWN1cmVfY29ubmVjdGlvbnNfb25seV9tb2RlX3JlcXVpcmVkICYmCi0gICAgICAgICAgKCEocF9jYi0+bGVfc2VjdXJlX2Nvbm5lY3Rpb25zX21vZGVfaXNfdXNlZCkgfHwKLSAgICAgICAgICAgKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsID09Ci0gICAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTKSkpIHsKLSAgICAgICAgU01QX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIiVzOiBwYWlyaW5nIGZhaWxlZCAtIHBlcmlwaGVyYWwgcmVxdWlyZXMgc2VjdXJlIGNvbm5lY3Rpb24gb25seSAiCi0gICAgICAgICAgICAibW9kZSIsCi0gICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1BBSVJfQVVUSF9GQUlMOwotICAgICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9PSBTTVBfTU9ERUxfU0VDX0NPTk5fT09CKSB7Ci0gICAgICAgIGlmIChzbXBfcmVxdWVzdF9vb2JfZGF0YShwX2NiKSkgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc21wX3NlbmRfcGFpcl9yc3AocF9jYiwgTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgLyogQ2VudHJhbCByZWNlaXZlcyBwYWlyaW5nIHJlc3BvbnNlICovCi0gIHsKLSAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9IHNtcF9zZWxlY3RfYXNzb2NpYXRpb25fbW9kZWwocF9jYik7Ci0KLSAgICBpZiAocF9jYi0+c2VjdXJlX2Nvbm5lY3Rpb25zX29ubHlfbW9kZV9yZXF1aXJlZCAmJgotICAgICAgICAoIShwX2NiLT5sZV9zZWN1cmVfY29ubmVjdGlvbnNfbW9kZV9pc191c2VkKSB8fAotICAgICAgICAgKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsID09IFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MpKSkgewotICAgICAgU01QX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJDZW50cmFsIHJlcXVpcmVzIHNlY3VyZSBjb25uZWN0aW9uIG9ubHkgbW9kZSAiCi0gICAgICAgICAgImJ1dCBpdCBjYW4ndCBiZSBwcm92aWRlZCAtPiBDZW50cmFsIGZhaWxzIHBhaXJpbmciKTsKLSAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9QQUlSX0FVVEhfRkFJTDsKLSAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsID09IFNNUF9NT0RFTF9TRUNfQ09OTl9PT0IpIHsKLSAgICAgIGlmIChzbXBfcmVxdWVzdF9vb2JfZGF0YShwX2NiKSkgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBzbXBfZGVjaWRlX2Fzc29jaWF0aW9uX21vZGVsKHBfY2IsIE5VTEwpOwotICAgIH0KLSAgfQotfQotCi0vKiogcHJvY2VzcyBwYWlyaW5nIGNvbmZpcm0gZnJvbSBwZWVyIGRldmljZSAqLwotdm9pZCBzbXBfcHJvY19jb25maXJtKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9wYXJhbWV0ZXJzKHBfY2IpKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9JTlZBTElEX1BBUkFNRVRFUlM7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocF9kYXRhKSB7Ci0gICAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgIC8qIHNhdmUgdGhlIFNDb25maXJtIGZvciBjb21wYXJpc29uIGxhdGVyICovCi0gICAgICBTVFJFQU1fVE9fQVJSQVkocF9jYi0+cmNvbmZpcm0uZGF0YSgpLCBwLCBPQ1RFVDE2X0xFTik7Ci0gICAgfQotICB9Ci0KLSAgcF9jYi0+ZmxhZ3MgfD0gU01QX1BBSVJfRkxBR1NfQ01EX0NPTkZJUk07Ci19Ci0KLS8qKiBwcm9jZXNzIHBhaXJpbmcgaW5pdGlhbGl6ZXIgZnJvbSBwZWVyIGRldmljZSAqLwotdm9pZCBzbXBfcHJvY19pbml0KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90KiBwID0gcF9kYXRhLT5wX2RhdGE7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoc21wX2NvbW1hbmRfaGFzX2ludmFsaWRfcGFyYW1ldGVycyhwX2NiKSkgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogc2F2ZSB0aGUgU1JhbmQgZm9yIGNvbXBhcmlzb24gKi8KLSAgU1RSRUFNX1RPX0FSUkFZKHBfY2ItPnJyYW5kLmRhdGEoKSwgcCwgT0NURVQxNl9MRU4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jX3JhbmQKLSAqIERlc2NyaXB0aW9uICBwcm9jZXNzIHBhaXJpbmcgcmFuZG9tIChub25jZSkgZnJvbSBwZWVyIGRldmljZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3Byb2NfcmFuZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnMocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHNhdmUgdGhlIFNSYW5kIGZvciBjb21wYXJpc29uICovCi0gIFNUUkVBTV9UT19BUlJBWShwX2NiLT5ycmFuZC5kYXRhKCksIHAsIE9DVEVUMTZfTEVOKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfcHJvY2Vzc19wYWlyaW5nX3B1YmxpY19rZXkKLSAqIERlc2NyaXB0aW9uICBwcm9jZXNzIHBhaXJpbmcgcHVibGljIGtleSBjb21tYW5kIGZyb20gdGhlIHBlZXIgZGV2aWNlCi0gKiAgICAgICAgICAgICAgLSBzYXZlcyB0aGUgcGVlciBwdWJsaWMga2V5OwotICogICAgICAgICAgICAgIC0gc2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHBlZXIgcHVibGljIGtleSBpcyByZWNlaXZlZDsKLSAqICAgICAgICAgICAgICAtIGNhbGxzIHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzKC4uLikuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3Byb2Nlc3NfcGFpcmluZ19wdWJsaWNfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90KiBwID0gcF9kYXRhLT5wX2RhdGE7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoc21wX2NvbW1hbmRfaGFzX2ludmFsaWRfcGFyYW1ldGVycyhwX2NiKSkgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX0FSUkFZKHBfY2ItPnBlZXJfcHVibF9rZXkueCwgcCwgQlRfT0NURVQzMl9MRU4pOwotICBTVFJFQU1fVE9fQVJSQVkocF9jYi0+cGVlcl9wdWJsX2tleS55LCBwLCBCVF9PQ1RFVDMyX0xFTik7Ci0KLSAgUG9pbnQgcHQ7Ci0gIG1lbWNweShwdC54LCBwX2NiLT5wZWVyX3B1Ymxfa2V5LngsIEJUX09DVEVUMzJfTEVOKTsKLSAgbWVtY3B5KHB0LnksIHBfY2ItPnBlZXJfcHVibF9rZXkueSwgQlRfT0NURVQzMl9MRU4pOwotCi0gIGlmICghbWVtY21wKHBfY2ItPnBlZXJfcHVibF9rZXkueCwgcF9jYi0+bG9jX3B1Ymxfa2V5LngsIEJUX09DVEVUMzJfTEVOKSkgewotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc0ODg2ODM4Iik7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIlJlbW90ZSBhbmQgbG9jYWwgcHVibGljIGtleXMgY2FuJ3QgbWF0Y2giKTsKLSAgICB0U01QX0lOVF9EQVRBIHNtcDsKLSAgICBzbXAuc3RhdHVzID0gU01QX1BBSVJfQVVUSF9GQUlMOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFFQ0NfVmFsaWRhdGVQb2ludChwdCkpIHsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcyMzc3Nzc0Iik7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXA7Ci0gICAgc21wLnN0YXR1cyA9IFNNUF9QQUlSX0FVVEhfRkFJTDsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXApOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfY2ItPmZsYWdzIHw9IFNNUF9QQUlSX0ZMQUdfSEFWRV9QRUVSX1BVQkxfS0VZOwotCi0gIHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzKHBfY2IsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jZXNzX3BhaXJpbmdfY29tbWl0bWVudAotICogRGVzY3JpcHRpb24gIHByb2Nlc3MgcGFpcmluZyBjb21taXRtZW50IGZyb20gcGVlciBkZXZpY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jZXNzX3BhaXJpbmdfY29tbWl0bWVudCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnMocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfY2ItPmZsYWdzIHw9IFNNUF9QQUlSX0ZMQUdfSEFWRV9QRUVSX0NPTU07Ci0KLSAgaWYgKHAgIT0gTlVMTCkgewotICAgIFNUUkVBTV9UT19BUlJBWShwX2NiLT5yZW1vdGVfY29tbWl0bWVudC5kYXRhKCksIHAsIE9DVEVUMTZfTEVOKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jZXNzX2Roa2V5X2NoZWNrCi0gKiBEZXNjcmlwdGlvbiAgcHJvY2VzcyBESEtleSBDaGVjayBmcm9tIHBlZXIgZGV2aWNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY2Vzc19kaGtleV9jaGVjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnMocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwICE9IE5VTEwpIHsKLSAgICBTVFJFQU1fVE9fQVJSQVkocF9jYi0+cmVtb3RlX2Roa2V5X2NoZWNrLmRhdGEoKSwgcCwgT0NURVQxNl9MRU4pOwotICB9Ci0KLSAgcF9jYi0+ZmxhZ3MgfD0gU01QX1BBSVJfRkxBR19IQVZFX1BFRVJfREhLX0NISzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24KLSAqIERlc2NyaXB0aW9uICBwcm9jZXNzIHBhaXJpbmcga2V5cHJlc3Mgbm90aWZpY2F0aW9uIGZyb20gcGVlciBkZXZpY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jZXNzX2tleXByZXNzX25vdGlmaWNhdGlvbih0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHBfY2ItPnN0YXR1cyA9IHBfZGF0YS0+c3RhdHVzOwotCi0gIGlmIChzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9wYXJhbWV0ZXJzKHBfY2IpKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9JTlZBTElEX1BBUkFNRVRFUlM7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgU1RSRUFNX1RPX1VJTlQ4KHBfY2ItPnBlZXJfa2V5cHJlc3Nfbm90aWZpY2F0aW9uLCBwKTsKLSAgfSBlbHNlIHsKLSAgICBwX2NiLT5wZWVyX2tleXByZXNzX25vdGlmaWNhdGlvbiA9IFNNUF9TQ19LRVlfT1VUX09GX1JBTkdFOwotICB9Ci0gIHBfY2ItPmNiX2V2dCA9IFNNUF9QRUVSX0tFWVBSX05PVF9FVlQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX2JyX3Byb2Nlc3NfcGFpcmluZ19jb21tYW5kCi0gKiBEZXNjcmlwdGlvbiAgUHJvY2VzcyB0aGUgU01QIHBhaXJpbmcgcmVxdWVzdC9yZXNwb25zZSBmcm9tIHBlZXIgZGV2aWNlIHZpYQotICogICAgICAgICAgICAgIEJSL0VEUiB0cmFuc3BvcnQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfYnJfcHJvY2Vzc19wYWlyaW5nX2NvbW1hbmQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QqIHAgPSBwX2RhdGEtPnBfZGF0YTsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KHBfY2ItPnBhaXJpbmdfYmRhKTsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICAvKiByZWplY3RpbmcgQlIgcGFpcmluZyByZXF1ZXN0IG92ZXIgbm9uLVNDIEJSIGxpbmsgKi8KLSAgaWYgKCFwX2Rldl9yZWMtPm5ld19lbmNyeXB0aW9uX2tleV9pc19wMjU2ICYmCi0gICAgICBwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1hUUkFOU19ERVJJVkVfTk9UX0FMTE9XOwotICAgIHNtcF9icl9zdGF0ZV9tYWNoaW5lX2V2ZW50KHBfY2IsIFNNUF9CUl9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBlcmFzZSBhbGwga2V5cyBpZiBpdCBpcyBwZXJpcGhlcmFsIHByb2MgcGFpcmluZyByZXEqLwotICBpZiAocF9kZXZfcmVjICYmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpKQotICAgIGJ0bV9zZWNfY2xlYXJfYmxlX2tleXMocF9kZXZfcmVjKTsKLQotICBwX2NiLT5mbGFncyB8PSBTTVBfUEFJUl9GTEFHX0VOQ19BRlRFUl9QQUlSOwotCi0gIGlmIChzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9sZW5ndGgocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTIxMzkwOSIpOwotICAgIHNtcF9icl9zdGF0ZV9tYWNoaW5lX2V2ZW50KHBfY2IsIFNNUF9CUl9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTVFJFQU1fVE9fVUlOVDgocF9jYi0+cGVlcl9pb19jYXBzLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHBfY2ItPnBlZXJfb29iX2ZsYWcsIHApOwotICBTVFJFQU1fVE9fVUlOVDgocF9jYi0+cGVlcl9hdXRoX3JlcSwgcCk7Ci0gIFNUUkVBTV9UT19VSU5UOChwX2NiLT5wZWVyX2VuY19zaXplLCBwKTsKLSAgU1RSRUFNX1RPX1VJTlQ4KHBfY2ItPnBlZXJfaV9rZXksIHApOwotICBTVFJFQU1fVE9fVUlOVDgocF9jYi0+cGVlcl9yX2tleSwgcCk7Ci0KLSAgaWYgKHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnMocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudChwX2NiLCBTTVBfQlJfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogcGVlciAoY2VudHJhbCkgc3RhcnRlZCBwYWlyaW5nIHNlbmRpbmcgUGFpcmluZyBSZXF1ZXN0ICovCi0gIC8qIG9yIGJlaW5nIGNlbnRyYWwgZGV2aWNlIGFsd2F5cyB1c2UgcmVjZWl2ZWQgaS9yIGtleSBhcyBrZXlzIHRvIGRpc3RyaWJ1dGUKLSAgICovCi0gIHBfY2ItPmxvY2FsX2lfa2V5ID0gcF9jYi0+cGVlcl9pX2tleTsKLSAgcF9jYi0+bG9jYWxfcl9rZXkgPSBwX2NiLT5wZWVyX3Jfa2V5OwotCi0gIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpIHsKLSAgICBwX2Rldl9yZWMtPm5ld19lbmNyeXB0aW9uX2tleV9pc19wMjU2ID0gZmFsc2U7Ci0gICAgLyogc2hvcnRjdXQgdG8gc2tpcCBTZWN1cml0eSBHcmFudCBzdGVwICovCi0gICAgcF9jYi0+Y2JfZXZ0ID0gU01QX0JSX0tFWVNfUkVRX0VWVDsKLSAgfSBlbHNlIHsKLSAgICAvKiBDZW50cmFsIHJlY2VpdmVzIHBhaXJpbmcgcmVzcG9uc2UgKi8KLSAgICBTTVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICIlcyBjZW50cmFsIHJjdnMgdmFsaWQgUEFJUklORyBSRVNQT05TRS4iCi0gICAgICAgICIgU3VwcG9zZWQgdG8gbW92ZSB0byBrZXkgZGlzdHJpYnV0aW9uIHBoYXNlLiAiLAotICAgICAgICBfX2Z1bmNfXyk7Ci0gIH0KLQotICAvKiBhdXRoX3JlcSByZWNlaXZlZCB2aWEgQlIvRURSIFNNIGNoYW5uZWwgaXMgc2V0IHRvIDAsCi0gICAgIGJ1dCBldmVyeXRoaW5nIGRlcml2ZWQvZXhjaGFuZ2VkIGhhcyB0byBiZSBzYXZlZCAqLwotICBwX2NiLT5wZWVyX2F1dGhfcmVxIHw9IFNNUF9BVVRIX0JPTkQ7Ci0gIHBfY2ItPmxvY19hdXRoX3JlcSB8PSBTTVBfQVVUSF9CT05EOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9icl9wcm9jZXNzX3NlY3VyaXR5X2dyYW50Ci0gKiBEZXNjcmlwdGlvbiAgcHJvY2VzcyBzZWN1cml0eSBncmFudCBpbiBjYXNlIG9mIHBhaXJpbmcgb3ZlciBCUi9FRFIgdHJhbnNwb3J0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChwX2RhdGEtPnN0YXR1cyAhPSBTTVBfU1VDQ0VTUykgewotICAgIHNtcF9icl9zdGF0ZV9tYWNoaW5lX2V2ZW50KHBfY2IsIFNNUF9CUl9BVVRIX0NNUExfRVZULCBwX2RhdGEpOwotICB9IGVsc2UgewotICAgIC8qIG90aGVyd2lzZSwgc3RhcnQgcGFpcmluZzsgc2VuZCBJTyByZXF1ZXN0IGNhbGxiYWNrICovCi0gICAgcF9jYi0+Y2JfZXZ0ID0gU01QX0JSX0tFWVNfUkVRX0VWVDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9icl9jaGVja19hdXRob3JpemF0aW9uX3JlcXVlc3QKLSAqIERlc2NyaXB0aW9uICBzZXRzIHRoZSBTTVAga2VzIHRvIGJlIGRlcml2ZWQvZGlzdHJpYnV0ZSBvdmVyIEJSL0VEUiB0cmFuc3BvcnQKLSAqICAgICAgICAgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIGRpc3RyaWJ1dGlvbi9kZXJpdmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfYnJfY2hlY2tfYXV0aG9yaXphdGlvbl9yZXF1ZXN0KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIHJjdnMgaV9rZXlzPTB4JXggcl9rZXlzPTB4JXggKGktaW5pdGlhdG9yIHItcmVzcG9uZGVyKSIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9jYi0+bG9jYWxfaV9rZXksIHBfY2ItPmxvY2FsX3Jfa2V5KTsKLQotICAvKiBJbiBMRSBTQyBtb2RlIExLIGZpZWxkIGlzIGlnbm9yZWQgd2hlbiBCUi9FRFIgdHJhbnNwb3J0IGlzIHVzZWQgKi8KLSAgcF9jYi0+bG9jYWxfaV9rZXkgJj0gflNNUF9TRUNfS0VZX1RZUEVfTEs7Ci0gIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotCi0gIC8qIEluIExFIFNDIG1vZGUgb25seSBJUkssIElBSSwgQ1NSSyBhcmUgZXhjaGFuZ2VkIHdpdGggdGhlIHBlZXIuCi0gICoqIFNldCBsb2NhbF9yX2tleSBvbiBjZW50cmFsIHRvIGV4cGVjdCBvbmx5IHRoZXNlIGtleXMuICovCi0gIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICBwX2NiLT5sb2NhbF9yX2tleSAmPSAoU01QX1NFQ19LRVlfVFlQRV9JRCB8IFNNUF9TRUNfS0VZX1RZUEVfQ1NSSyk7Ci0gIH0KLQotICAvKiBDaGVjayBpZiBINyBmdW5jdGlvbiBuZWVkcyB0byBiZSB1c2VkIGZvciBrZXkgZGVyaXZhdGlvbiovCi0gIGlmICgocF9jYi0+bG9jX2F1dGhfcmVxICYgU01QX0g3X1NVUFBPUlRfQklUKSAmJgotICAgICAgKHBfY2ItPnBlZXJfYXV0aF9yZXEgJiBTTVBfSDdfU1VQUE9SVF9CSVQpKSB7Ci0gICAgcF9jYi0+a2V5X2Rlcml2YXRpb25faDdfdXNlZCA9IFRSVUU7Ci0gIH0KLSAgU01QX1RSQUNFX0RFQlVHKCIlczogdXNlIGg3ID0gJWQiLCBfX2Z1bmNfXywgcF9jYi0+a2V5X2Rlcml2YXRpb25faDdfdXNlZCk7Ci0KLSAgLyogU01QIG92ZXIgQlIvRURSIHNob3VsZCBhbHdheXMgYmUgdXNlZCB3aXRoIENUS0QsIHNvIGRlcml2ZSBMVEsgZnJvbQotICAgKiBMSyBiZWZvcmUgcmVjZWl2aW5nIGtleXMgKi8KLSAgaWYgKChwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwgJiYKLSAgICAgICAocF9jYi0+bG9jYWxfaV9rZXkgJiBTTVBfU0VDX0tFWV9UWVBFX0VOQykpIHx8Ci0gICAgICAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMICYmCi0gICAgICAgKHBfY2ItPmxvY2FsX3Jfa2V5ICYgU01QX1NFQ19LRVlfVFlQRV9FTkMpKSkgewotICAgIHNtcF9nZW5lcmF0ZV9sdGsocF9jYiwgcF9kYXRhKTsKLSAgfQotCi0gIFNNUF9UUkFDRV9ERUJVRygKLSAgICAgICIlcyByY3ZzIHVwZ3JhZGVzOiBpX2tleXM9MHgleCByX2tleXM9MHgleCAoaS1pbml0aWF0b3Igci1yZXNwb25kZXIpIiwKLSAgICAgIF9fZnVuY19fLCBwX2NiLT5sb2NhbF9pX2tleSwgcF9jYi0+bG9jYWxfcl9rZXkpOwotCi0gIGlmICgvKigocF9jYi0+cGVlcl9hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpIHx8Ci0gICAgICAgICAgKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpKSAmJiovCi0gICAgICAocF9jYi0+bG9jYWxfaV9rZXkgfHwgcF9jYi0+bG9jYWxfcl9rZXkpKSB7Ci0gICAgc21wX2JyX3N0YXRlX21hY2hpbmVfZXZlbnQocF9jYiwgU01QX0JSX0JPTkRfUkVRX0VWVCwgTlVMTCk7Ci0KLSAgICAvKiBpZiBubyBwZWVyIGtleSBpcyBleHBlY3RlZCwgc3RhcnQgY2VudHJhbCBrZXkgZGlzdHJpYnV0aW9uICovCi0gICAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCAmJiBwX2NiLT5sb2NhbF9yX2tleSA9PSAwKQotICAgICAgc21wX2tleV9kaXN0cmlidXRpb25fYnlfdHJhbnNwb3J0KHBfY2IsIE5VTEwpOwotICB9IGVsc2UgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfU1VDQ0VTUzsKLSAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudChwX2NiLCBTTVBfQlJfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfYnJfc2VsZWN0X25leHRfa2V5Ci0gKiBEZXNjcmlwdGlvbiAgc2VsZWN0cyB0aGUgbmV4dCBrZXkgdG8gZGVyaXZlL3NlbmQgd2hlbiBCUi9FRFIgdHJhbnNwb3J0IGlzCi0gKiAgICAgICAgICAgICAgdXNlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9icl9zZWxlY3RfbmV4dF9rZXkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMgcm9sZT0lZCAoMC1jZW50cmFsKSByX2tleXM9MHgleCBpX2tleXM9MHgleCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgcF9jYi0+cm9sZSwgcF9jYi0+bG9jYWxfcl9rZXksIHBfY2ItPmxvY2FsX2lfa2V5KTsKLQotICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMIHx8Ci0gICAgICAoIXBfY2ItPmxvY2FsX3Jfa2V5ICYmIHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkpIHsKLSAgICBzbXBfa2V5X3BpY2tfa2V5KHBfY2IsIHBfZGF0YSk7Ci0gIH0KLQotICBpZiAoIXBfY2ItPmxvY2FsX2lfa2V5ICYmICFwX2NiLT5sb2NhbF9yX2tleSkgewotICAgIC8qIHN0YXRlIGNoZWNrIHRvIHByZXZlbnQgcmUtZW50cmFuY2UgKi8KLSAgICBpZiAoc21wX2dldF9icl9zdGF0ZSgpID09IFNNUF9CUl9TVEFURV9CT05EX1BFTkRJTkcpIHsKLSAgICAgIGlmIChwX2NiLT50b3RhbF90eF91bmFja2VkID09IDApIHsKLSAgICAgICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfU1VDQ0VTUzsKLSAgICAgICAgc21wX2JyX3N0YXRlX21hY2hpbmVfZXZlbnQocF9jYiwgU01QX0JSX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcF9jYi0+d2FpdF9mb3JfYXV0aG9yaXphdGlvbl9jb21wbGV0ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKiBwcm9jZXNzIGVuY3J5cHRpb24gaW5mb3JtYXRpb24gZnJvbSBwZWVyIGRldmljZSAqLwotdm9pZCBzbXBfcHJvY19lbmNfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCogcCA9IHBfZGF0YS0+cF9kYXRhOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnMocF9jYikpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0lOVkFMSURfUEFSQU1FVEVSUzsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExMTkzNzA2NSIpOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU1RSRUFNX1RPX0FSUkFZKHBfY2ItPmx0ay5kYXRhKCksIHAsIE9DVEVUMTZfTEVOKTsKLQotICBzbXBfa2V5X2Rpc3RyaWJ1dGlvbihwX2NiLCBOVUxMKTsKLX0KLQotLyoqIHByb2Nlc3MgY2VudHJhbCBJRCBmcm9tIHBlcmlwaGVyYWwgZGV2aWNlICovCi12b2lkIHNtcF9wcm9jX2NlbnRyYWxfaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QqIHAgPSBwX2RhdGEtPnBfZGF0YTsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChwX2NiLT5yY3ZkX2NtZF9sZW4gPCAxMSkgeyAgLy8gMShDb2RlKSArIDIoRURJVikgKyA4KFJhbmQpCi0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE5MzcwMjciKTsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzOiBJbnZhbGlkIGNvbW1hbmQgbGVuZ3RoOiAlZCwgc2hvdWxkIGJlIGF0IGxlYXN0IDExIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfY2ItPnJjdmRfY21kX2xlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc21wX3VwZGF0ZV9rZXlfbWFzayhwX2NiLCBTTVBfU0VDX0tFWV9UWVBFX0VOQywgdHJ1ZSk7Ci0KLSAgdEJUTV9MRV9LRVlfVkFMVUUgbGVfa2V5ID0gewotICAgICAgLnBlbmNfa2V5ID0ge30sCi0gIH07Ci0gIFNUUkVBTV9UT19VSU5UMTYobGVfa2V5LnBlbmNfa2V5LmVkaXYsIHApOwotICBTVFJFQU1fVE9fQVJSQVkobGVfa2V5LnBlbmNfa2V5LnJhbmQsIHAsIEJUX09DVEVUOF9MRU4pOwotCi0gIC8qIHN0b3JlIHRoZSBlbmNyeXB0aW9uIGtleXMgZnJvbSBwZWVyIGRldmljZSAqLwotICBsZV9rZXkucGVuY19rZXkubHRrID0gcF9jYi0+bHRrOwotICBsZV9rZXkucGVuY19rZXkuc2VjX2xldmVsID0gcF9jYi0+c2VjX2xldmVsOwotICBsZV9rZXkucGVuY19rZXkua2V5X3NpemUgPSBwX2NiLT5sb2NfZW5jX3NpemU7Ci0KLSAgaWYgKChwX2NiLT5wZWVyX2F1dGhfcmVxICYgU01QX0FVVEhfQk9ORCkgJiYKLSAgICAgIChwX2NiLT5sb2NfYXV0aF9yZXEgJiBTTVBfQVVUSF9CT05EKSkKLSAgICBidG1fc2VjX3NhdmVfbGVfa2V5KHBfY2ItPnBhaXJpbmdfYmRhLCBCVE1fTEVfS0VZX1BFTkMsICZsZV9rZXksIHRydWUpOwotCi0gIHNtcF9rZXlfZGlzdHJpYnV0aW9uKHBfY2IsIE5VTEwpOwotfQotCi0vKiogcHJvY2VzcyBpZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHBlZXIgZGV2aWNlICovCi12b2lkIHNtcF9wcm9jX2lkX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QqIHAgPSBwX2RhdGEtPnBfZGF0YTsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9wYXJhbWV0ZXJzKHBfY2IpKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9JTlZBTElEX1BBUkFNRVRFUlM7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTE5MzcwNjUiKTsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19BUlJBWShwX2NiLT50ay5kYXRhKCksIHAsIE9DVEVUMTZfTEVOKTsgLyogcmV1c2UgVEsgZm9yIElSSyAqLwotICBzbXBfa2V5X2Rpc3RyaWJ1dGlvbl9ieV90cmFuc3BvcnQocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKiBwcm9jZXNzIGlkZW50aXR5IGFkZHJlc3MgZnJvbSBwZWVyIGRldmljZSAqLwotdm9pZCBzbXBfcHJvY19pZF9hZGRyKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90KiBwID0gcF9kYXRhLT5wX2RhdGE7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoc21wX2NvbW1hbmRfaGFzX2ludmFsaWRfcGFyYW1ldGVycyhwX2NiKSkgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExMjE0NzcwIik7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzbXBfdXBkYXRlX2tleV9tYXNrKHBfY2IsIFNNUF9TRUNfS0VZX1RZUEVfSUQsIHRydWUpOwotCi0gIHRCVE1fTEVfS0VZX1ZBTFVFIHBpZF9rZXkgPSB7Ci0gICAgICAucGlkX2tleSA9IHt9LAotICB9OwotICA7Ci0gIFNUUkVBTV9UT19VSU5UOChwaWRfa2V5LnBpZF9rZXkuaWRlbnRpdHlfYWRkcl90eXBlLCBwKTsKLSAgU1RSRUFNX1RPX0JEQUREUihwaWRfa2V5LnBpZF9rZXkuaWRlbnRpdHlfYWRkciwgcCk7Ci0gIHBpZF9rZXkucGlkX2tleS5pcmsgPSBwX2NiLT50azsKLQotICAvKiB0byB1c2UgYXMgQkRfQUREUiBmb3IgbGsgZGVyaXZlZCBmcm9tIGx0ayAqLwotICBwX2NiLT5pZF9hZGRyX3JjdmQgPSB0cnVlOwotICBwX2NiLT5pZF9hZGRyX3R5cGUgPSBwaWRfa2V5LnBpZF9rZXkuaWRlbnRpdHlfYWRkcl90eXBlOwotICBwX2NiLT5pZF9hZGRyID0gcGlkX2tleS5waWRfa2V5LmlkZW50aXR5X2FkZHI7Ci0KLSAgLyogc3RvcmUgdGhlIElEIGtleSBmcm9tIHBlZXIgZGV2aWNlICovCi0gIGlmICgocF9jYi0+cGVlcl9hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpICYmCi0gICAgICAocF9jYi0+bG9jX2F1dGhfcmVxICYgU01QX0FVVEhfQk9ORCkpCi0gICAgYnRtX3NlY19zYXZlX2xlX2tleShwX2NiLT5wYWlyaW5nX2JkYSwgQlRNX0xFX0tFWV9QSUQsICZwaWRfa2V5LCB0cnVlKTsKLSAgc21wX2tleV9kaXN0cmlidXRpb25fYnlfdHJhbnNwb3J0KHBfY2IsIE5VTEwpOwotfQotCi0vKiBwcm9jZXNzIHNlY3VyaXR5IGluZm9ybWF0aW9uIGZyb20gcGVlciBkZXZpY2UgKi8KLXZvaWQgc21wX3Byb2Nfc3JrX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAoc21wX2NvbW1hbmRfaGFzX2ludmFsaWRfcGFyYW1ldGVycyhwX2NiKSkgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfSU5WQUxJRF9QQVJBTUVURVJTOwotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTExMjE0NDcwIik7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzbXBfdXBkYXRlX2tleV9tYXNrKHBfY2IsIFNNUF9TRUNfS0VZX1RZUEVfQ1NSSywgdHJ1ZSk7Ci0KLSAgLyogc2F2ZSBDU1JLIHRvIHNlY3VyaXR5IHJlY29yZCAqLwotICB0QlRNX0xFX0tFWV9WQUxVRSBsZV9rZXkgPSB7Ci0gICAgICAucGNzcmtfa2V5ID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5zZWNfbGV2ZWwgPSBwX2NiLT5zZWNfbGV2ZWwsCi0gICAgICAgICAgfSwKLSAgfTsKLQotICAvKiBnZXQgcGVlciBDU1JLICovCi0gIG1heWJlX25vbl9hbGlnbmVkX21lbWNweShsZV9rZXkucGNzcmtfa2V5LmNzcmsuZGF0YSgpLCBwX2RhdGEtPnBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DVEVUMTZfTEVOKTsKLQotICAvKiBpbml0aWFsaXplIHRoZSBwZWVyIGNvdW50ZXIgKi8KLSAgbGVfa2V5LnBjc3JrX2tleS5jb3VudGVyID0gMDsKLQotICBpZiAoKHBfY2ItPnBlZXJfYXV0aF9yZXEgJiBTTVBfQVVUSF9CT05EKSAmJgotICAgICAgKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpKQotICAgIGJ0bV9zZWNfc2F2ZV9sZV9rZXkocF9jYi0+cGFpcmluZ19iZGEsIEJUTV9MRV9LRVlfUENTUkssICZsZV9rZXksIHRydWUpOwotICBzbXBfa2V5X2Rpc3RyaWJ1dGlvbl9ieV90cmFuc3BvcnQocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3Byb2NfY29tcGFyZQotICogRGVzY3JpcHRpb24gIHByb2Nlc3MgY29tcGFyZSB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3Byb2NfY29tcGFyZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKCFtZW1jbXAocF9jYi0+cmNvbmZpcm0uZGF0YSgpLCBwX2RhdGEtPmtleS5wX2RhdGEsIE9DVEVUMTZfTEVOKSkgewotICAgIC8qIGNvbXBhcmUgdGhlIG1heCBlbmNyeXB0aW9uIGtleSBzaXplLCBhbmQgc2F2ZSB0aGUgc21hbGxlciBvbmUgZm9yIHRoZQotICAgICAqIGxpbmsgKi8KLSAgICBpZiAocF9jYi0+cGVlcl9lbmNfc2l6ZSA8IHBfY2ItPmxvY19lbmNfc2l6ZSkKLSAgICAgIHBfY2ItPmxvY19lbmNfc2l6ZSA9IHBfY2ItPnBlZXJfZW5jX3NpemU7Ci0KLSAgICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKQotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9SQU5EX0VWVCwgTlVMTCk7Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBjZW50cmFsIGRldmljZSBhbHdheXMgdXNlIHJlY2VpdmVkIGkvciBrZXkgYXMga2V5cyB0byBkaXN0cmlidXRlICovCi0gICAgICBwX2NiLT5sb2NhbF9pX2tleSA9IHBfY2ItPnBlZXJfaV9rZXk7Ci0gICAgICBwX2NiLT5sb2NhbF9yX2tleSA9IHBfY2ItPnBlZXJfcl9rZXk7Ci0KLSAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfRU5DX1JFUV9FVlQsIE5VTEwpOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfQ09ORklSTV9WQUxVRV9FUlI7Ci0gICAgcF9jYi0+ZmFpbHVyZSA9IFNNUF9DT05GSVJNX1ZBTFVFX0VSUjsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3Byb2Nfc2xfa2V5Ci0gKiBEZXNjcmlwdGlvbiAgcHJvY2VzcyBrZXkgcmVhZHkgZXZlbnRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3Byb2Nfc2xfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90IGtleV90eXBlID0gcF9kYXRhLT5rZXkua2V5X3R5cGU7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKGtleV90eXBlID09IFNNUF9LRVlfVFlQRV9USykgewotICAgIHNtcF9nZW5lcmF0ZV9zcmFuZF9tcmFuZF9jb25maXJtKHBfY2IsIE5VTEwpOwotICB9IGVsc2UgaWYgKGtleV90eXBlID09IFNNUF9LRVlfVFlQRV9DRk0pIHsKLSAgICBzbXBfc2V0X3N0YXRlKFNNUF9TVEFURV9XQUlUX0NPTkZJUk0pOwotCi0gICAgaWYgKHBfY2ItPmZsYWdzICYgU01QX1BBSVJfRkxBR1NfQ01EX0NPTkZJUk0pCi0gICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0NPTkZJUk1fRVZULCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9zdGFydF9lbmMKLSAqIERlc2NyaXB0aW9uICBzdGFydCBlbmNyeXB0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc3RhcnRfZW5jKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB0QlRNX1NUQVRVUyBjbWQ7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKHBfZGF0YSAhPSBOVUxMKSB7Ci0gICAgY21kID0gYnRtX2JsZV9zdGFydF9lbmNyeXB0KHBfY2ItPnBhaXJpbmdfYmRhLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT2N0ZXQxNiopcF9kYXRhLT5rZXkucF9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBjbWQgPSBidG1fYmxlX3N0YXJ0X2VuY3J5cHQocF9jYi0+cGFpcmluZ19iZGEsIGZhbHNlLCBOVUxMKTsKLSAgfQotCi0gIGlmIChjbWQgIT0gQlRNX0NNRF9TVEFSVEVEICYmIGNtZCAhPSBCVE1fQlVTWSkgewotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfRU5DX0ZBSUw7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jX2Rpc2NhcmQKLSAqIERlc2NyaXB0aW9uICAgcHJvY2Vzc2luZyBmb3IgZGlzY2FyZCBzZWN1cml0eSByZXF1ZXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY19kaXNjYXJkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBpZiAoIShwX2NiLT5mbGFncyAmIFNNUF9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQpKQotICAgIHNtcF9yZXNldF9jb250cm9sX3ZhbHVlKHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9lbmNfY21wbAotICogRGVzY3JpcHRpb24gICBlbmNyeXB0aW9uIHN1Y2Nlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9lbmNfY21wbCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCBlbmNfZW5hYmxlID0gcF9kYXRhLT5zdGF0dXM7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBlbmNfZW5hYmxlID8gU01QX1NVQ0NFU1MgOiBTTVBfRU5DX0ZBSUw7Ci0gIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX2NoZWNrX2F1dGhfcmVxCi0gKiBEZXNjcmlwdGlvbiAgY2hlY2sgYXV0aGVudGljYXRpb24gcmVxdWVzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NoZWNrX2F1dGhfcmVxKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90IGVuY19lbmFibGUgPSBwX2RhdGEtPnN0YXR1czsKLQotICBTTVBfVFJBQ0VfREVCVUcoCi0gICAgICAiJXMgcmN2cyBlbmNfZW5hYmxlPSVkIGlfa2V5cz0weCV4IHJfa2V5cz0weCV4IChpLWluaXRpYXRvciByLXJlc3BvbmRlcikiLAotICAgICAgX19mdW5jX18sIGVuY19lbmFibGUsIHBfY2ItPmxvY2FsX2lfa2V5LCBwX2NiLT5sb2NhbF9yX2tleSk7Ci0gIGlmIChlbmNfZW5hYmxlID09IDEpIHsKLSAgICBpZiAocF9jYi0+bGVfc2VjdXJlX2Nvbm5lY3Rpb25zX21vZGVfaXNfdXNlZCkgewotICAgICAgLyogSW4gTEUgU0MgbW9kZSBMVEsgaXMgdXNlZCBpbnN0ZWFkIG9mIFNUSyBhbmQgaGFzIHRvIGJlIGFsd2F5cyBzYXZlZCAqLwotICAgICAgcF9jYi0+bG9jYWxfaV9rZXkgfD0gU01QX1NFQ19LRVlfVFlQRV9FTkM7Ci0gICAgICBwX2NiLT5sb2NhbF9yX2tleSB8PSBTTVBfU0VDX0tFWV9UWVBFX0VOQzsKLQotICAgICAgLyogSW4gTEUgU0MgbW9kZSBMSyBpcyBkZXJpdmVkIGZyb20gTFRLIG9ubHkgaWYgYm90aCBzaWRlcyByZXF1ZXN0IGl0ICovCi0gICAgICBpZiAoIShwX2NiLT5sb2NhbF9pX2tleSAmIFNNUF9TRUNfS0VZX1RZUEVfTEspIHx8Ci0gICAgICAgICAgIShwX2NiLT5sb2NhbF9yX2tleSAmIFNNUF9TRUNfS0VZX1RZUEVfTEspKSB7Ci0gICAgICAgIHBfY2ItPmxvY2FsX2lfa2V5ICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotICAgICAgICBwX2NiLT5sb2NhbF9yX2tleSAmPSB+U01QX1NFQ19LRVlfVFlQRV9MSzsKLSAgICAgIH0KLQotICAgICAgLyogSW4gTEUgU0MgbW9kZSBvbmx5IElSSywgSUFJLCBDU1JLIGFyZSBleGNoYW5nZWQgd2l0aCB0aGUgcGVlci4KLSAgICAgICoqIFNldCBsb2NhbF9yX2tleSBvbiBjZW50cmFsIHRvIGV4cGVjdCBvbmx5IHRoZXNlIGtleXMuCi0gICAgICAqLwotICAgICAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgICAgICBwX2NiLT5sb2NhbF9yX2tleSAmPSAoU01QX1NFQ19LRVlfVFlQRV9JRCB8IFNNUF9TRUNfS0VZX1RZUEVfQ1NSSyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGluIGxlZ2FjeSBtb2RlIGRlcml2YXRpb24gb2YgQlIvRURSIExLIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIHBfY2ItPmxvY2FsX2lfa2V5ICY9IH5TTVBfU0VDX0tFWV9UWVBFX0xLOwotICAgICAgcF9jYi0+bG9jYWxfcl9rZXkgJj0gflNNUF9TRUNfS0VZX1RZUEVfTEs7Ci0gICAgfQotICAgIFNNUF9UUkFDRV9ERUJVRygKLSAgICAgICAgIiVzIHJjdnMgdXBncmFkZXM6IGlfa2V5cz0weCV4IHJfa2V5cz0weCV4IChpLWluaXRpYXRvciByLXJlc3BvbmRlcikiLAotICAgICAgICBfX2Z1bmNfXywgcF9jYi0+bG9jYWxfaV9rZXksIHBfY2ItPmxvY2FsX3Jfa2V5KTsKLQotICAgIGlmICgvKigocF9jYi0+cGVlcl9hdXRoX3JlcSAmIFNNUF9BVVRIX0JPTkQpIHx8Ci0gICAgICAgICAocF9jYi0+bG9jX2F1dGhfcmVxICYgU01QX0FVVEhfQk9ORCkpICYmKi8KLSAgICAgICAgKHBfY2ItPmxvY2FsX2lfa2V5IHx8IHBfY2ItPmxvY2FsX3Jfa2V5KSkgewotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9CT05EX1JFUV9FVlQsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBlbmNfZW5hYmxlID8gU01QX1NVQ0NFU1MgOiBTTVBfRU5DX0ZBSUw7Ci0gICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIH0KLSAgfSBlbHNlIGlmIChlbmNfZW5hYmxlID09IDApIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gZW5jX2VuYWJsZSA/IFNNUF9TVUNDRVNTIDogU01QX0VOQ19GQUlMOwotICAgIC8qIGlmIGZhaWxlZCBmb3IgZW5jcnlwdGlvbiBhZnRlciBwYWlyaW5nLCBzZW5kIGNhbGxiYWNrICovCi0gICAgaWYgKHBfY2ItPmZsYWdzICYgU01QX1BBSVJfRkxBR19FTkNfQUZURVJfUEFJUikKLSAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgLyogaWYgZW5jIGZhaWxlZCBmb3Igb2xkIHNlY3VyaXR5IGluZm9ybWF0aW9uICovCi0gICAgLyogaWYgY2VudHJhbCBkZXZpY2UsIGNsZWFuIHVwIGFuZCBhYmNrIHRvIGlkbGU7IHBlcmlwaGVyYWwgZGV2aWNlIGRvCi0gICAgICogbm90aGluZyAqLwotICAgIGVsc2UgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfa2V5X3BpY2tfa2V5Ci0gKiBEZXNjcmlwdGlvbiAgUGljayBhIGtleSBkaXN0cmlidXRpb24gZnVuY3Rpb24gYmFzZWQgb24gdGhlIGtleSBtYXNrLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2tleV9waWNrX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCBrZXlfdG9fZGlzdCA9IChwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpID8gcF9jYi0+bG9jYWxfcl9rZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcF9jYi0+bG9jYWxfaV9rZXk7Ci0gIHVpbnQ4X3QgaSA9IDA7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyBrZXlfdG9fZGlzdD0weCV4IiwgX19mdW5jX18sIGtleV90b19kaXN0KTsKLSAgd2hpbGUgKGkgPCBTTVBfS0VZX0RJU1RfVFlQRV9NQVgpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoImtleSB0byBzZW5kID0gJTAyeCwgaSA9ICVkIiwga2V5X3RvX2Rpc3QsIGkpOwotCi0gICAgaWYgKGtleV90b19kaXN0ICYgKDEgPDwgaSkpIHsKLSAgICAgIFNNUF9UUkFDRV9ERUJVRygic21wX2Rpc3RyaWJ1dGVfYWN0WyVkXSIsIGkpOwotICAgICAgKCpzbXBfZGlzdHJpYnV0ZV9hY3RbaV0pKHBfY2IsIHBfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaSsrOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9rZXlfZGlzdHJpYnV0aW9uCi0gKiBEZXNjcmlwdGlvbiAgc3RhcnQga2V5IGRpc3RyaWJ1dGlvbiBpZiByZXF1aXJlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9rZXlfZGlzdHJpYnV0aW9uKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIHJvbGU9JWQgKDAtY2VudHJhbCkgcl9rZXlzPTB4JXggaV9rZXlzPTB4JXgiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIHBfY2ItPnJvbGUsIHBfY2ItPmxvY2FsX3Jfa2V5LCBwX2NiLT5sb2NhbF9pX2tleSk7Ci0KLSAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCB8fAotICAgICAgKCFwX2NiLT5sb2NhbF9yX2tleSAmJiBwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpKSB7Ci0gICAgc21wX2tleV9waWNrX2tleShwX2NiLCBwX2RhdGEpOwotICB9Ci0KLSAgaWYgKCFwX2NiLT5sb2NhbF9pX2tleSAmJiAhcF9jYi0+bG9jYWxfcl9rZXkpIHsKLSAgICAvKiBzdGF0ZSBjaGVjayB0byBwcmV2ZW50IHJlLWVudHJhbnQgKi8KLSAgICBpZiAoc21wX2dldF9zdGF0ZSgpID09IFNNUF9TVEFURV9CT05EX1BFTkRJTkcpIHsKLSAgICAgIGlmIChwX2NiLT5kZXJpdmVfbGspIHsKLSAgICAgICAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KHBfY2ItPnBhaXJpbmdfYmRhKTsKLSAgICAgICAgaWYgKCEocF9kZXZfcmVjLT5zZWNfZmxhZ3MgJiBCVE1fU0VDX0xFX0xJTktfS0VZX0FVVEhFRCkgJiYKLSAgICAgICAgICAgIChwX2Rldl9yZWMtPnNlY19mbGFncyAmIEJUTV9TRUNfTElOS19LRVlfQVVUSEVEKSkgewotICAgICAgICAgIFNNUF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAgICAgIiVzIEJSIGtleSBpcyBoaWdoZXIgc2VjdXJpdHkgdGhhbiBleGlzdGluZyBMRSBrZXlzLCBkb24ndCAiCi0gICAgICAgICAgICAgICJkZXJpdmUgTEsgZnJvbSBMVEsiLAotICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNTg4NTQwOTciKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzbXBfZGVyaXZlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleShwX2NiLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBwX2NiLT5kZXJpdmVfbGsgPSBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBfY2ItPnRvdGFsX3R4X3VuYWNrZWQgPT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0ZWFkIG9mIGRlY2xhcmluZyBhdXRob3JpemF0aW9uIGNvbXBsZXRlIGltbWVkaWF0ZWx5LAotICAgICAgICAgKiBkZWxheSB0aGUgZXZlbnQgZnJvbSBiZWluZyBzZW50IGJ5IFNNUF9ERUxBWUVEX0FVVEhfVElNRU9VVF9NUy4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgdGhlIHBlcmlwaGVyYWwgdG8gc2VuZCBvdmVyIFBhaXJpbmcgRmFpbGVkIGlmIHRoZQotICAgICAgICAgKiBsYXN0IGtleSBpcyByZWplY3RlZC4gIER1cmluZyB0aGlzIHdhaXRpbmcgd2luZG93LCB0aGUKLSAgICAgICAgICogc3RhdGUgc2hvdWxkIHJlbWFpbiBpbiBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFhbGFybV9pc19zY2hlZHVsZWQocF9jYi0+ZGVsYXllZF9hdXRoX3RpbWVyX2VudCkpIHsKLSAgICAgICAgICBTTVBfVFJBQ0VfREVCVUcoIiVzIGRlbGF5aW5nIGF1dGggY29tcGxldGUuIiwgX19mdW5jX18pOwotICAgICAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NiLT5kZWxheWVkX2F1dGhfdGltZXJfZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTVBfREVMQVlFRF9BVVRIX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtcF9kZWxheWVkX2F1dGhfY29tcGxldGVfdGltZW91dCwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBfY2ItPndhaXRfZm9yX2F1dGhvcml6YXRpb25fY29tcGxldGUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfZGVjaWRlX2Fzc29jaWF0aW9uX21vZGVsCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbGVjdCBhc3NvYyBtb2RlbCB0byBiZSB1c2VkIGZvcgotICogICAgICAgICAgICAgICAgICBTVEsgZ2VuZXJhdGlvbiBhbmQgdG8gc3RhcnQgU1RLIGdlbmVyYXRpb24gcHJvY2Vzcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfZGVjaWRlX2Fzc29jaWF0aW9uX21vZGVsKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB0U01QX0VWRU5UIGludF9ldnQgPSBTTVBfTk9QX0VWVDsKLSAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyBBc3NvY2lhdGlvbiBNb2RlbCA9ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCk7Ci0KLSAgc3dpdGNoIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCkgewotICAgIGNhc2UgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWTogLyogVEsgPSAwLCBnbyBjYWxjdWxhdGUgQ29uZmlybSAqLwotICAgICAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCAmJgotICAgICAgICAgICgocF9jYi0+cGVlcl9hdXRoX3JlcSAmIFNNUF9BVVRIX1lOX0JJVCkgIT0gMCkgJiYKLSAgICAgICAgICAoKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9BVVRIX1lOX0JJVCkgPT0gMCkpIHsKLSAgICAgICAgU01QX1RSQUNFX0VSUk9SKAotICAgICAgICAgICAgIklPIGNhcGFiaWxpdHkgZG9lcyBub3QgbWVldCBhdXRoZW50aWNhdGlvbiByZXF1aXJlbWVudCIpOwotICAgICAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1BBSVJfQVVUSF9GQUlMOwotICAgICAgICBpbnRfZXZ0ID0gU01QX0FVVEhfQ01QTF9FVlQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWlzX2F0dl9kZXZpY2UoKSAmJgotICAgICAgICAgICAgKHBfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHkgPT0gU01QX0lPX0NBUF9JTyB8fAotICAgICAgICAgICAgIHBfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHkgPT0gU01QX0lPX0NBUF9LQkRJU1ApKSB7Ci0gICAgICAgICAgLyogZGlzcGxheSBjb25zZW50IGRpYWxvZyBpZiB0aGlzIGRldmljZSBoYXMgYSBkaXNwbGF5ICovCi0gICAgICAgICAgU01QX1RSQUNFX0RFQlVHKCJFTkNSWVBUSU9OX09OTFkgc2hvd2luZyBDb25zZW50IERpYWxvZyIpOwotICAgICAgICAgIHBfY2ItPmNiX2V2dCA9IFNNUF9DT05TRU5UX1JFUV9FVlQ7Ci0gICAgICAgICAgc21wX3NldF9zdGF0ZShTTVBfU1RBVEVfV0FJVF9OT05DRSk7Ci0gICAgICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9TQ19EU1BMX05DX0VWVCwgTlVMTCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcF9jYi0+c2VjX2xldmVsID0gU01QX1NFQ19VTkFVVEhFTlRJQ0FURTsKLSAgICAgICAgICBTTVBfVFJBQ0VfRVZFTlQoInBfY2ItPnNlY19sZXZlbCA9JWQgKFNNUF9TRUNfVU5BVVRIRU5USUNBVEUpICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnNlY19sZXZlbCk7Ci0KLSAgICAgICAgICB0U01QX0tFWSBrZXk7Ci0gICAgICAgICAga2V5LmtleV90eXBlID0gU01QX0tFWV9UWVBFX1RLOwotICAgICAgICAgIGtleS5wX2RhdGEgPSBwX2NiLT50ay5kYXRhKCk7Ci0gICAgICAgICAgc21wX2ludF9kYXRhLmtleSA9IGtleTsKLQotICAgICAgICAgIHBfY2ItPnRrID0gezB9OwotICAgICAgICAgIC8qIFRLLCByZWFkeSAgKi8KLSAgICAgICAgICBpbnRfZXZ0ID0gU01QX0tFWV9SRUFEWV9FVlQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTTVBfTU9ERUxfUEFTU0tFWToKLSAgICAgIHBfY2ItPnNlY19sZXZlbCA9IFNNUF9TRUNfQVVUSEVOVElDQVRFRDsKLSAgICAgIFNNUF9UUkFDRV9FVkVOVCgicF9jYi0+c2VjX2xldmVsID0lZCAoU01QX1NFQ19BVVRIRU5USUNBVEVEKSAiLAotICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnNlY19sZXZlbCk7Ci0KLSAgICAgIHBfY2ItPmNiX2V2dCA9IFNNUF9QQVNTS0VZX1JFUV9FVlQ7Ci0gICAgICBpbnRfZXZ0ID0gU01QX1RLX1JFUV9FVlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU01QX01PREVMX09PQjoKLSAgICAgIFNNUF9UUkFDRV9FUlJPUigiQXNzb2NpYXRpb24gTW9kZWwgPSBTTVBfTU9ERUxfT09CIik7Ci0gICAgICBwX2NiLT5zZWNfbGV2ZWwgPSBTTVBfU0VDX0FVVEhFTlRJQ0FURUQ7Ci0gICAgICBTTVBfVFJBQ0VfRVZFTlQoInBfY2ItPnNlY19sZXZlbCA9JWQgKFNNUF9TRUNfQVVUSEVOVElDQVRFRCkgIiwKLSAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5zZWNfbGV2ZWwpOwotCi0gICAgICBwX2NiLT5jYl9ldnQgPSBTTVBfT09CX1JFUV9FVlQ7Ci0gICAgICBpbnRfZXZ0ID0gU01QX1RLX1JFUV9FVlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU01QX01PREVMX0tFWV9OT1RJRjoKLSAgICAgIHBfY2ItPnNlY19sZXZlbCA9IFNNUF9TRUNfQVVUSEVOVElDQVRFRDsKLSAgICAgIFNNUF9UUkFDRV9ERUJVRygiTmVlZCB0byBnZW5lcmF0ZSBQYXNza2V5Iik7Ci0KLSAgICAgIC8qIGdlbmVyYXRlIHBhc3NrZXkgYW5kIG5vdGlmeSBhcHBsaWNhdGlvbiAqLwotICAgICAgc21wX2dlbmVyYXRlX3Bhc3NrZXkocF9jYiwgTlVMTCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUzoKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9OVU1fQ09NUDoKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0VOVDoKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1A6Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fT09COgotICAgICAgaW50X2V2dCA9IFNNUF9QVUJMX0tFWV9FWENIX1JFUV9FVlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU01QX01PREVMX09VVF9PRl9SQU5HRToKLSAgICAgIFNNUF9UUkFDRV9FUlJPUigiQXNzb2NpYXRpb24gTW9kZWwgPSBTTVBfTU9ERUxfT1VUX09GX1JBTkdFIChmYWlsZWQpIik7Ci0gICAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1VOS05PV05fSU9fQ0FQOwotICAgICAgaW50X2V2dCA9IFNNUF9BVVRIX0NNUExfRVZUOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgU01QX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJBc3NvY2lhdGlvbiBNb2RlbCA9ICVkIChTT01FVEhJTkcgSVMgV1JPTkcgV0lUSCBUSEUgQ09ERSkiLAotICAgICAgICAgIHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsKTsKLSAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfVU5LTk9XTl9JT19DQVA7Ci0gICAgICBpbnRfZXZ0ID0gU01QX0FVVEhfQ01QTF9FVlQ7Ci0gIH0KLQotICBTTVBfVFJBQ0VfRVZFTlQoInNlY19sZXZlbD0lZCAiLCBwX2NiLT5zZWNfbGV2ZWwpOwotICBpZiAoaW50X2V2dCkgc21wX3NtX2V2ZW50KHBfY2IsIGludF9ldnQsICZzbXBfaW50X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlCi0gKiBEZXNjcmlwdGlvbiAgcHJvY2VzcyBJTyByZXNwb25zZSBmb3IgYSBwZXJpcGhlcmFsIGRldmljZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBpZiAocF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSB7Ci0gICAgLyogcGFpcmluZyBzdGFydGVkIGJ5IGxvY2FsIChwZXJpcGhlcmFsKSBTZWN1cml0eSBSZXF1ZXN0ICovCi0gICAgc21wX3NldF9zdGF0ZShTTVBfU1RBVEVfU0VDX1JFUV9QRU5ESU5HKTsKLSAgICBzbXBfc2VuZF9jbWQoU01QX09QQ09ERV9TRUNfUkVRLCBwX2NiKTsKLSAgfSBlbHNlIC8qIHBsYW4gdG8gc2VuZCBwYWlyaW5nIHJlc3BvbmQgKi8KLSAgewotICAgIC8qIHBhaXJpbmcgc3RhcnRlZCBieSBwZWVyIChjZW50cmFsKSBQYWlyaW5nIFJlcXVlc3QgKi8KLSAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9IHNtcF9zZWxlY3RfYXNzb2NpYXRpb25fbW9kZWwocF9jYik7Ci0KLSAgICBpZiAocF9jYi0+c2VjdXJlX2Nvbm5lY3Rpb25zX29ubHlfbW9kZV9yZXF1aXJlZCAmJgotICAgICAgICAoIShwX2NiLT5sZV9zZWN1cmVfY29ubmVjdGlvbnNfbW9kZV9pc191c2VkKSB8fAotICAgICAgICAgKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsID09IFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MpKSkgewotICAgICAgU01QX1RSQUNFX0VSUk9SKAotICAgICAgICAgICJQZXJpcGhlcmFsIHJlcXVpcmVzIHNlY3VyZSBjb25uZWN0aW9uIG9ubHkgbW9kZSAiCi0gICAgICAgICAgImJ1dCBpdCBjYW4ndCBiZSBwcm92aWRlZCAtPiBQZXJpcGhlcmFsIGZhaWxzIHBhaXJpbmciKTsKLSAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9QQUlSX0FVVEhfRkFJTDsKLSAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgYXJlIGRvaW5nIFNNUF9NT0RFTF9TRUNfQ09OTl9PT0Igd2UgZG9uJ3QgbmVlZCB0byByZXF1ZXN0IE9PQiBkYXRhCi0gICAgLy8gbG9jYWxseSBpZiBsb2Nfb29iX2ZsYWcgPT0gMHgwMCBiL2MgdGhlcmUgaXMgbm8gT09CIGRhdGEgdG8gZ2l2ZS4gIEluIHRoZQotICAgIC8vIGV2ZW50IHRoZSBsb2Nfb29iX2ZsYWcgaXMgcHJlc2VudCB2YWx1ZSwgd2Ugc2hvdWxkIHJlcXVlc3QgdGhlIE9PQiBkYXRhCi0gICAgLy8gbG9jYWxseTsgb3RoZXJ3aXNlIGZhaWwuCi0gICAgLy8gSWYgd2UgYXJlIHRoZSBpbml0aWF0b3IgdGhlIE9PQiBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gc3RvcmVkIGFuZCB3aWxsIGJlCi0gICAgLy8gY29sbGVjdGVkIGluIHRoZSBzdGF0ZW1hY2hpbmUgbGF0ZXIuCi0gICAgLy8KLSAgICAvLyBsb2Nfb29iX2ZsYWcgY291bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdFNNUF9PT0JfRkxBRyBlbnVtIHZhbHVlczoKLSAgICAvLyBTTVBfT09CX05PTkUgPSAwCi0gICAgLy8gU01QX09PQl9QUkVTRU5UID0gMQotICAgIC8vIFNNUF9PT0JfVU5LTk9XTiA9IDIKLSAgICAvLwotICAgIC8vIFRoZSBvbmx5IHRpbWUgQW5kcm9pZCBjYXJlcyBhYm91dCBuZWVkaW5nIHRvIHByb3ZpZGUgdGhlIHBlZXIgb29iIGRhdGEKLSAgICAvLyBoZXJlIHdvdWxkIGJlIGluIHRoZSBhZHZlcnRpc2VyIHNpdHVhdGlvbiBvciByb2xlLiAgSWYgdGhlCi0gICAgLy8gZGV2aWNlIGlzIGRvaW5nIHRoZSBjb25uZWN0aW5nIGl0IHdpbGwgbm90IG5lZWQgdG8gZ2V0IHRoZSBkYXRhIGFnYWluIGFzCi0gICAgLy8gaXQgd2FzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIGluaXRpYXRpb24gY2FsbC4KLSAgICAvLwotICAgIC8vIGxvY19vb2JfZmxhZyBzaG91bGQgb25seSBlcXVhbCBTTVBfT09CX1BSRVNFTlQgd2hlbiBQRUVSIERBVEEgZXhpc3RzIGFuZAotICAgIC8vIGRldmljZSBpcyB0aGUgYWR2ZXJ0aXNlciBhcyBvcHBvc2VkIHRvIGJlaW5nIHRoZSBjb25uZWN0b3IuCi0gICAgaWYgKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsID09IFNNUF9NT0RFTF9TRUNfQ09OTl9PT0IpIHsKLSAgICAgIHN3aXRjaCAocF9jYi0+bG9jX29vYl9mbGFnKSB7Ci0gICAgICAgIGNhc2UgU01QX09PQl9OT05FOgotICAgICAgICAgIExPR19JTkZPKCJTTVBfTU9ERUxfU0VDX0NPTk5fT09CIHdpdGggU01QX09PQl9OT05FIik7Ci0gICAgICAgICAgc21wX3NlbmRfcGFpcl9yc3AocF9jYiwgTlVMTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU01QX09PQl9QUkVTRU5UOgotICAgICAgICAgIExPR19JTkZPKCJTTVBfTU9ERUxfU0VDX0NPTk5fT09CIHdpdGggU01QX09PQl9QUkVTRU5UIik7Ci0gICAgICAgICAgaWYgKHNtcF9yZXF1ZXN0X29vYl9kYXRhKHBfY2IpKSByZXR1cm47Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU01QX09PQl9VTktOT1dOOgotICAgICAgICAgIExPR19XQVJOKCJTTVBfTU9ERUxfU0VDX0NPTk5fT09CIHdpdGggU01QX09PQl9VTktOT1dOIik7Ci0gICAgICAgICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgICAgICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9QQUlSX0FVVEhfRkFJTDsKLSAgICAgICAgICBzbXBfc2VuZF9wYWlyX2ZhaWwocF9jYiwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFBUUyBUZXN0aW5nIGZhaWx1cmUgbW9kZXMKLSAgICBpZiAocHRzX3Rlc3Rfc2VuZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZV9mYWlsdXJlKHBfY2IpKSByZXR1cm47Ci0KLSAgICBzbXBfc2VuZF9wYWlyX3JzcChwX2NiLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZQotICogRGVzY3JpcHRpb24gIHByb2Nlc3MgYXBwbGljYXRpb24ga2V5cyByZXNwb25zZSBmb3IgYSBwZXJpcGhlcmFsIGRldmljZQotICogICAgICAgICAgICAgIChCUi9FRFIgdHJhbnNwb3J0KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZSh0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHNtcF9icl9zZW5kX3BhaXJfcmVzcG9uc2UocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX2JyX3NlbmRfcGFpcl9yZXNwb25zZQotICogRGVzY3JpcHRpb24gIGFjdGlvbnMgcmVsYXRlZCB0byBzZW5kaW5nIHBhaXJpbmcgcmVzcG9uc2Ugb3ZlciBCUi9FRFIKLSAqICAgICAgICAgICAgICB0cmFuc3BvcnQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfYnJfc2VuZF9wYWlyX3Jlc3BvbnNlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHBfY2ItPmxvY2FsX2lfa2V5ICY9IHBfY2ItPnBlZXJfaV9rZXk7Ci0gIHBfY2ItPmxvY2FsX3Jfa2V5ICY9IHBfY2ItPnBlZXJfcl9rZXk7Ci0KLSAgc21wX3NlbmRfY21kKFNNUF9PUENPREVfUEFJUklOR19SU1AsIHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfcGFpcmluZ19jbXBsCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbmQgdGhlIHBhaXJpbmcgY29tcGxldGUKLSAqICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgYW5kIHJlbW92ZSB0aGUgY29ubmVjdGlvbiBpZiBuZWVkZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcGFpcmluZ19jbXBsKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBpZiAocF9jYi0+dG90YWxfdHhfdW5hY2tlZCA9PSAwKSB7Ci0gICAgLyogcHJvY2VzcyB0aGUgcGFpcmluZyBjb21wbGV0ZSAqLwotICAgIHNtcF9wcm9jX3BhaXJpbmdfY21wbChwX2NiKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfcGFpcl90ZXJtaW5hdGUKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCB0aGUgcGFpcmluZyBjb21wbGV0ZQotICogICAgICAgICAgICAgICAgICBjYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSBjb25uZWN0aW9uIGlmIG5lZWRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wYWlyX3Rlcm1pbmF0ZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgcF9jYi0+c3RhdHVzID0gU01QX0NPTk5fVE9VVDsKLSAgc21wX3Byb2NfcGFpcmluZ19jbXBsKHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfaWRsZV90ZXJtaW5hdGUKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjYWxsZWRpbiBpZGxlIHN0YXRlIHRvIGRldGVybWluZSB0byBzZW5kCi0gKiAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlIG9yIG5vdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9pZGxlX3Rlcm1pbmF0ZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgaWYgKHBfY2ItPmZsYWdzICYgU01QX1BBSVJfRkxBR1NfV0VfU1RBUlRFRF9ERCkgewotICAgIFNNUF9UUkFDRV9ERUJVRygiUGFpcmluZyB0ZXJtaW5hdGVkIGF0IElETEUgc3RhdGUuIik7Ci0gICAgcF9jYi0+c3RhdHVzID0gU01QX0ZBSUw7Ci0gICAgc21wX3Byb2NfcGFpcmluZ19jbXBsKHBfY2IpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX2JvdGhfaGF2ZV9wdWJsaWNfa2V5cwotICogRGVzY3JpcHRpb24gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBib3RoIGxvY2FsIGFuZCBwZWVyIHB1YmxpYyBrZXlzIGFyZQotICogICAgICAgICAgICAgIHNhdmVkLgotICogICAgICAgICAgICAgIEFjdGlvbnM6Ci0gKiAgICAgICAgICAgICAgLSBpbnZva2VzIERIS2V5IGNvbXB1dGF0aW9uOwotICogICAgICAgICAgICAgIC0gb24gcGVyaXBoZXJhbCBzaWRlIGludm9rZXMgc2VuZGluZyBsb2NhbCBwdWJsaWMga2V5IHRvIHRoZQotICpwZWVyLgotICogICAgICAgICAgICAgIC0gaW52b2tlcyBTQyBwaGFzZSAxIHByb2Nlc3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfYm90aF9oYXZlX3B1YmxpY19rZXlzKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIC8qIGludm9rZXMgREhLZXkgY29tcHV0YXRpb24gKi8KLSAgc21wX2NvbXB1dGVfZGhrZXkocF9jYik7Ci0KLSAgLyogb24gcGVyaXBoZXJhbCBzaWRlIGludm9rZXMgc2VuZGluZyBsb2NhbCBwdWJsaWMga2V5IHRvIHRoZSBwZWVyICovCi0gIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX1BFUklQSEVSQUwpIHNtcF9zZW5kX3BhaXJfcHVibGljX2tleShwX2NiLCBOVUxMKTsKLQotICBzbXBfc21fZXZlbnQocF9jYiwgU01QX1NDX0RIS0VZX0NNUExUX0VWVCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3N0YXJ0X3NlY3VyZV9jb25uZWN0aW9uX3BoYXNlMQotICogRGVzY3JpcHRpb24gIFN0YXJ0IFNlY3VyZSBDb25uZWN0aW9uIHBoYXNlMSBpLmUuIGludm9rZXMgaW5pdGlhbGl6YXRpb24gb2YKLSAqICAgICAgICAgICAgICBTZWN1cmUgQ29ubmVjdGlvbiBwaGFzZSAxIHBhcmFtZXRlcnMgYW5kIHN0YXJ0cyBidWlsZGluZy9zZW5kaW5nCi0gKiAgICAgICAgICAgICAgdG8gdGhlIHBlZXIgbWVzc2FnZXMgYXBwcm9wcmlhdGUgZm9yIHRoZSByb2xlIGFuZCBhc3NvY2lhdGlvbgotICogICAgICAgICAgICAgIG1vZGVsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3N0YXJ0X3NlY3VyZV9jb25uZWN0aW9uX3BoYXNlMSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocF9jYi0+c2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwgPT0gU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUykgewotICAgIHBfY2ItPnNlY19sZXZlbCA9IFNNUF9TRUNfVU5BVVRIRU5USUNBVEU7Ci0gICAgU01QX1RSQUNFX0VWRU5UKCJwX2NiLT5zZWNfbGV2ZWwgPSVkIChTTVBfU0VDX1VOQVVUSEVOVElDQVRFKSAiLAotICAgICAgICAgICAgICAgICAgICBwX2NiLT5zZWNfbGV2ZWwpOwotICB9IGVsc2UgewotICAgIHBfY2ItPnNlY19sZXZlbCA9IFNNUF9TRUNfQVVUSEVOVElDQVRFRDsKLSAgICBTTVBfVFJBQ0VfRVZFTlQoInBfY2ItPnNlY19sZXZlbCA9JWQgKFNNUF9TRUNfQVVUSEVOVElDQVRFRCkgIiwKLSAgICAgICAgICAgICAgICAgICAgcF9jYi0+c2VjX2xldmVsKTsKLSAgfQotCi0gIHN3aXRjaCAocF9jYi0+c2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwpIHsKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1M6Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fTlVNX0NPTVA6Ci0gICAgICBwX2NiLT5sb2NhbF9yYW5kb20gPSB7MH07Ci0gICAgICBzbXBfc3RhcnRfbm9uY2VfZ2VuZXJhdGlvbihwX2NiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5UOgotICAgICAgLyogdXNlciBoYXMgdG8gcHJvdmlkZSBwYXNza2V5ICovCi0gICAgICBwX2NiLT5jYl9ldnQgPSBTTVBfUEFTU0tFWV9SRVFfRVZUOwotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9US19SRVFfRVZULCBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRElTUDoKLSAgICAgIC8qIHBhc3NrZXkgaGFzIHRvIGJlIHByb3ZpZGVkIHRvIHVzZXIgKi8KLSAgICAgIFNNUF9UUkFDRV9ERUJVRygiTmVlZCB0byBnZW5lcmF0ZSBTQyBQYXNza2V5Iik7Ci0gICAgICBzbXBfZ2VuZXJhdGVfcGFzc2tleShwX2NiLCBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX09PQjoKLSAgICAgIC8qIHVzZSB0aGUgYXZhaWxhYmxlIE9PQiBpbmZvcm1hdGlvbiAqLwotICAgICAgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fb29iX2RhdGEocF9jYiwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgU01QX1RSQUNFX0VSUk9SKCJBc3NvY2lhdGlvbiBNb2RlbCA9ICVkIGlzIG5vdCB1c2VkIGluIExFIFNDIiwKLSAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jZXNzX2xvY2FsX25vbmNlCi0gKiBEZXNjcmlwdGlvbiAgVGhlIGZ1bmN0aW9uIHByb2Nlc3NlcyBuZXcgbG9jYWwgbm9uY2UuCi0gKgotICogTm90ZSAgICAgICAgIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBpbiBTQyBwaGFzZTEuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY2Vzc19sb2NhbF9ub25jZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBzd2l0Y2ggKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsKSB7Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTOgotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX05VTV9DT01QOgotICAgICAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkgewotICAgICAgICAvKiBwZXJpcGhlcmFsIGNhbGN1bGF0ZXMgYW5kIHNlbmRzIGxvY2FsIGNvbW1pdG1lbnQgKi8KLSAgICAgICAgc21wX2NhbGN1bGF0ZV9sb2NhbF9jb21taXRtZW50KHBfY2IpOwotICAgICAgICBzbXBfc2VuZF9jb21taXRtZW50KHBfY2IsIE5VTEwpOwotICAgICAgICAvKiBwZXJpcGhlcmFsIGhhcyB0byB3YWl0IGZvciBwZWVyIG5vbmNlICovCi0gICAgICAgIHNtcF9zZXRfc3RhdGUoU01QX1NUQVRFX1dBSVRfTk9OQ0UpOwotICAgICAgfSBlbHNlIC8qIGkuZS4gY2VudHJhbCAqLwotICAgICAgewotICAgICAgICBpZiAocF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHX0hBVkVfUEVFUl9DT01NKSB7Ci0gICAgICAgICAgLyogcGVyaXBoZXJhbCBjb21taXRtZW50IGlzIGFscmVhZHkgcmVjZWl2ZWQsIHNlbmQgbG9jYWwgbm9uY2UsIHdhaXQKLSAgICAgICAgICAgKiBmb3IgcmVtb3RlIG5vbmNlKi8KLSAgICAgICAgICBTTVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICAgICAgICJjZW50cmFsIGluIGFzc29jIG1vZGUgPSAlZCAiCi0gICAgICAgICAgICAgICJhbHJlYWR5IHJjdmQgcGVyaXBoZXJhbCBjb21taXRtZW50IC0gcmFjZSBjb25kaXRpb24iLAotICAgICAgICAgICAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCk7Ci0gICAgICAgICAgcF9jYi0+ZmxhZ3MgJj0gflNNUF9QQUlSX0ZMQUdfSEFWRV9QRUVSX0NPTU07Ci0gICAgICAgICAgc21wX3NlbmRfcmFuZChwX2NiLCBOVUxMKTsKLSAgICAgICAgICBzbXBfc2V0X3N0YXRlKFNNUF9TVEFURV9XQUlUX05PTkNFKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9FTlQ6Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9ESVNQOgotICAgICAgc21wX2NhbGN1bGF0ZV9sb2NhbF9jb21taXRtZW50KHBfY2IpOwotCi0gICAgICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgICAgIHNtcF9zZW5kX2NvbW1pdG1lbnQocF9jYiwgTlVMTCk7Ci0gICAgICB9IGVsc2UgLyogcGVyaXBoZXJhbCAqLwotICAgICAgewotICAgICAgICBpZiAocF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHX0hBVkVfUEVFUl9DT01NKSB7Ci0gICAgICAgICAgLyogY2VudHJhbCBjb21taXRtZW50IGlzIGFscmVhZHkgcmVjZWl2ZWQgKi8KLSAgICAgICAgICBzbXBfc2VuZF9jb21taXRtZW50KHBfY2IsIE5VTEwpOwotICAgICAgICAgIHNtcF9zZXRfc3RhdGUoU01QX1NUQVRFX1dBSVRfTk9OQ0UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9PT0I6Ci0gICAgICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgICAgIHNtcF9zZW5kX3JhbmQocF9jYiwgTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIHNtcF9zZXRfc3RhdGUoU01QX1NUQVRFX1dBSVRfTk9OQ0UpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNNUF9UUkFDRV9FUlJPUigiQXNzb2NpYXRpb24gTW9kZWwgPSAlZCBpcyBub3QgdXNlZCBpbiBMRSBTQyIsCi0gICAgICAgICAgICAgICAgICAgICAgcF9jYi0+c2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfcHJvY2Vzc19wZWVyX25vbmNlCi0gKiBEZXNjcmlwdGlvbiAgVGhlIGZ1bmN0aW9uIHByb2Nlc3NlcyBuZXdseSByZWNlaXZlZCBhbmQgc2F2ZWQgaW4gQ0IgcGVlcgotICogICAgICAgICAgICAgIG5vbmNlLiBUaGUgYWN0aW9ucyBkZXBlbmQgb24gdGhlIHNlbGVjdGVkIGFzc29jaWF0aW9uIG1vZGVsIGFuZAotICogICAgICAgICAgICAgIHRoZSByb2xlLgotICoKLSAqIE5vdGUgICAgICAgICBJdCBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgaW4gU0MgcGhhc2UxLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3Byb2Nlc3NfcGVlcl9ub25jZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyBzdGFydCAiLCBfX2Z1bmNfXyk7Ci0KLSAgLy8gUFRTIFRlc3RpbmcgZmFpbHVyZSBtb2RlcwotICBpZiAocF9jYi0+Y2VydF9mYWlsdXJlID09IFNNUF9DT05GSVJNX1ZBTFVFX0VSUikgewotICAgIFNNUF9UUkFDRV9FUlJPUigiJXMgZmFpbHVyZSBjYXNlID0gJWQiLCBfX2Z1bmNfXywgcF9jYi0+Y2VydF9mYWlsdXJlKTsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0NPTkZJUk1fVkFMVUVfRVJSOwotICAgIHBfY2ItPmZhaWx1cmUgPSBTTVBfQ09ORklSTV9WQUxVRV9FUlI7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gUFRTIFRlc3RpbmcgZmFpbHVyZSBtb2RlcyAoZm9yIExUKQotICBpZiAoKHBfY2ItPmNlcnRfZmFpbHVyZSA9PSBTTVBfTlVNRVJJQ19DT01QQVJfRkFJTCkgJiYKLSAgICAgIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9PSBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTKSAmJgotICAgICAgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkpIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzIGZhaWx1cmUgY2FzZSA9ICVkIiwgX19mdW5jX18sIHBfY2ItPmNlcnRfZmFpbHVyZSk7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9OVU1FUklDX0NPTVBBUl9GQUlMOwotICAgIHBfY2ItPmZhaWx1cmUgPSBTTVBfTlVNRVJJQ19DT01QQVJfRkFJTDsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAocF9jYi0+c2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwpIHsKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1M6Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fTlVNX0NPTVA6Ci0gICAgICAvKiBpbiB0aGVzZSBtb2RlbHMgb25seSBjZW50cmFsIHJlY2VpdmVzIGNvbW1pdG1lbnQgKi8KLSAgICAgIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICAgICAgaWYgKCFzbXBfY2hlY2tfY29tbWl0bWVudChwX2NiKSkgewotICAgICAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfQ09ORklSTV9WQUxVRV9FUlI7Ci0gICAgICAgICAgcF9jYi0+ZmFpbHVyZSA9IFNNUF9DT05GSVJNX1ZBTFVFX0VSUjsKLSAgICAgICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBwZXJpcGhlcmFsIHNlbmRzIGxvY2FsIG5vbmNlICovCi0gICAgICAgIHNtcF9zZW5kX3JhbmQocF9jYiwgTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9PSBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTKSB7Ci0gICAgICAgIGlmICghaXNfYXR2X2RldmljZSgpICYmCi0gICAgICAgICAgICAocF9jYi0+bG9jYWxfaW9fY2FwYWJpbGl0eSA9PSBTTVBfSU9fQ0FQX0lPIHx8Ci0gICAgICAgICAgICAgcF9jYi0+bG9jYWxfaW9fY2FwYWJpbGl0eSA9PSBTTVBfSU9fQ0FQX0tCRElTUCkpIHsKLSAgICAgICAgICAvKiBkaXNwbGF5IGNvbnNlbnQgZGlhbG9nICovCi0gICAgICAgICAgU01QX1RSQUNFX0RFQlVHKCJKVVNUIFdPUktTIHNob3dpbmcgQ29uc2VudCBEaWFsb2ciKTsKLSAgICAgICAgICBwX2NiLT5jYl9ldnQgPSBTTVBfQ09OU0VOVF9SRVFfRVZUOwotICAgICAgICAgIHNtcF9zZXRfc3RhdGUoU01QX1NUQVRFX1dBSVRfTk9OQ0UpOwotICAgICAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfU0NfRFNQTF9OQ19FVlQsIE5VTEwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIGdvIGRpcmVjdGx5IHRvIHBoYXNlIDIgKi8KLSAgICAgICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX1NDX1BIQVNFMV9DTVBMVF9FVlQsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgLyogbnVtZXJpYyBjb21wYXJpc29uICovCi0gICAgICB7Ci0gICAgICAgIHNtcF9zZXRfc3RhdGUoU01QX1NUQVRFX1dBSVRfTk9OQ0UpOwotICAgICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX1NDX0NBTENfTkNfRVZULCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5UOgotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRElTUDoKLSAgICAgIGlmICghc21wX2NoZWNrX2NvbW1pdG1lbnQocF9jYikgJiYKLSAgICAgICAgICBwX2NiLT5jZXJ0X2ZhaWx1cmUgIT0gU01QX05VTUVSSUNfQ09NUEFSX0ZBSUwpIHsKLSAgICAgICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfQ09ORklSTV9WQUxVRV9FUlI7Ci0gICAgICAgIHBfY2ItPmZhaWx1cmUgPSBTTVBfQ09ORklSTV9WQUxVRV9FUlI7Ci0gICAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKSB7Ci0gICAgICAgIHNtcF9zZW5kX3JhbmQocF9jYiwgTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgrK3BfY2ItPnJvdW5kIDwgMjApIHsKLSAgICAgICAgc21wX3NldF9zdGF0ZShTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVCk7Ci0gICAgICAgIHBfY2ItPmZsYWdzICY9IH5TTVBfUEFJUl9GTEFHX0hBVkVfUEVFUl9DT01NOwotICAgICAgICBzbXBfc3RhcnRfbm9uY2VfZ2VuZXJhdGlvbihwX2NiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfU0NfUEhBU0UxX0NNUExUX0VWVCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9PT0I6Ci0gICAgICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9QRVJJUEhFUkFMKSB7Ci0gICAgICAgIHNtcF9zZW5kX3JhbmQocF9jYiwgTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfU0NfUEhBU0UxX0NNUExUX0VWVCwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgU01QX1RSQUNFX0VSUk9SKCJBc3NvY2lhdGlvbiBNb2RlbCA9ICVkIGlzIG5vdCB1c2VkIGluIExFIFNDIiwKLSAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMgZW5kICIsIF9fZnVuY19fKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfbWF0Y2hfZGhrZXlfY2hlY2tzCi0gKiBEZXNjcmlwdGlvbiAgY2hlY2tzIGlmIHRoZSBjYWxjdWxhdGVkIHBlZXIgREhLZXkgQ2hlY2sgdmFsdWUgaXMgdGhlIHNhbWUgYXMKLSAqICAgICAgICAgICAgICByZWNlaXZlZCBmcm9tIHRoZSBwZWVyIERIS2V5IGNoZWNrIHZhbHVlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX21hdGNoX2Roa2V5X2NoZWNrcyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAobWVtY21wKHBfZGF0YS0+a2V5LnBfZGF0YSwgcF9jYi0+cmVtb3RlX2Roa2V5X2NoZWNrLmRhdGEoKSwKLSAgICAgICAgICAgICBPQ1RFVDE2X0xFTikpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygiZGhrZXkgY2hja3MgZG8gbm8gbWF0Y2giKTsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX0RIS0VZX0NIS19GQUlMOwotICAgIHBfY2ItPmZhaWx1cmUgPSBTTVBfREhLRVlfQ0hLX0ZBSUw7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTTVBfVFJBQ0VfRVZFTlQoImRoa2V5IGNoY2tzIG1hdGNoIik7Ci0KLSAgLyogY29tcGFyZSB0aGUgbWF4IGVuY3J5cHRpb24ga2V5IHNpemUsIGFuZCBzYXZlIHRoZSBzbWFsbGVyIG9uZSBmb3IgdGhlIGxpbmsKLSAgICovCi0gIGlmIChwX2NiLT5wZWVyX2VuY19zaXplIDwgcF9jYi0+bG9jX2VuY19zaXplKQotICAgIHBfY2ItPmxvY19lbmNfc2l6ZSA9IHBfY2ItPnBlZXJfZW5jX3NpemU7Ci0KLSAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkgewotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfUEFJUl9ESEtFWV9DSENLX0VWVCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogY2VudHJhbCBkZXZpY2UgYWx3YXlzIHVzZSByZWNlaXZlZCBpL3Iga2V5IGFzIGtleXMgdG8gZGlzdHJpYnV0ZSAqLwotICAgIHBfY2ItPmxvY2FsX2lfa2V5ID0gcF9jYi0+cGVlcl9pX2tleTsKLSAgICBwX2NiLT5sb2NhbF9yX2tleSA9IHBfY2ItPnBlZXJfcl9rZXk7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9FTkNfUkVRX0VWVCwgTlVMTCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfbW92ZV90b19zZWN1cmVfY29ubmVjdGlvbnNfcGhhc2UyCi0gKiBEZXNjcmlwdGlvbiAgU2lnbmFsIFN0YXRlIE1hY2hpbmUgdG8gc3RhcnQgU0MgcGhhc2UgMiBpbml0aWFsaXphdGlvbiAodG8KLSAqICAgICAgICAgICAgICBjb21wdXRlIGxvY2FsIERIS2V5IENoZWNrIHZhbHVlKS4KLSAqCi0gKiBOb3RlICAgICAgICAgU00gaXMgc3VwcG9zZWQgdG8gYmUgaW4gdGhlIHN0YXRlIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMyX1NUQVJULgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX21vdmVfdG9fc2VjdXJlX2Nvbm5lY3Rpb25zX3BoYXNlMih0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBzbXBfc21fZXZlbnQocF9jYiwgU01QX1NDX1BIQVNFMV9DTVBMVF9FVlQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9waGFzZV8yX2Roa2V5X2NoZWNrc19hcmVfcHJlc2VudAotICogRGVzY3JpcHRpb24gIGdlbmVyYXRlcyBldmVudCBpZiBkaGtleSBjaGVjayBmcm9tIHRoZSBwZWVyIGlzIGFscmVhZHkKLSAqICAgICAgICAgICAgICByZWNlaXZlZC4KLSAqCi0gKiBOb3RlICAgICAgICAgSXQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbiBwZXJpcGhlcmFsIHRvIHByZXZlbnQgcmFjZQotICpjb25kaXRpb24uIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlciBwZXJpcGhlcmFsIGRoa2V5IGNoZWNrIGlzCi0gKiAgICAgICAgICAgICAgY2FsY3VsYXRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9waGFzZV8yX2Roa2V5X2NoZWNrc19hcmVfcHJlc2VudCh0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHBfY2ItPmZsYWdzICYgU01QX1BBSVJfRkxBR19IQVZFX1BFRVJfREhLX0NISykKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX1NDXzJfREhDS19DSEtTX1BSRVNfRVZULCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfd2FpdF9mb3JfYm90aF9wdWJsaWNfa2V5cwotICogRGVzY3JpcHRpb24gIGdlbmVyYXRlcyBTTVBfQk9USF9QVUJMX0tFWVNfUkNWRF9FVlQgZXZlbnQgd2hlbiBib3RoIGxvY2FsIGFuZAotICogICAgICAgICAgICAgIGNlbnRyYWwgcHVibGljIGtleXMgYXJlIGF2YWlsYWJsZS4KLSAqCi0gKiBOb3RlICAgICAgICAgb24gdGhlIHBlcmlwaGVyYWwgaXQgaXMgdXNlZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmICgocF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHX0hBVkVfUEVFUl9QVUJMX0tFWSkgJiYKLSAgICAgIChwX2NiLT5mbGFncyAmIFNNUF9QQUlSX0ZMQUdfSEFWRV9MT0NBTF9QVUJMX0tFWSkpIHsKLSAgICBpZiAoKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkgJiYKLSAgICAgICAgKChwX2NiLT5yZXFfb29iX3R5cGUgPT0gU01QX09PQl9MT0NBTCkgfHwKLSAgICAgICAgIChwX2NiLT5yZXFfb29iX3R5cGUgPT0gU01QX09PQl9CT1RIKSkpIHsKLSAgICAgIHNtcF9zZXRfc3RhdGUoU01QX1NUQVRFX1BVQkxJQ19LRVlfRVhDSCk7Ci0gICAgfQotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQk9USF9QVUJMX0tFWVNfUkNWRF9FVlQsIE5VTEwpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3N0YXJ0X3Bhc3NrZXlfdmVyaWZpY2F0aW9uCi0gKiBEZXNjcmlwdGlvbiAgU3RhcnRzIFNDIHBhc3NrZXkgZW50cnkgdmVyaWZpY2F0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3N0YXJ0X3Bhc3NrZXlfdmVyaWZpY2F0aW9uKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB1aW50OF90KiBwID0gTlVMTDsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBwID0gcF9jYi0+bG9jYWxfcmFuZG9tLmRhdGEoKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwLCBwX2RhdGEtPnBhc3NrZXkpOwotCi0gIHAgPSBwX2NiLT5wZWVyX3JhbmRvbS5kYXRhKCk7Ci0gIFVJTlQzMl9UT19TVFJFQU0ocCwgcF9kYXRhLT5wYXNza2V5KTsKLQotICBwX2NiLT5yb3VuZCA9IDA7Ci0gIHNtcF9zdGFydF9ub25jZV9nZW5lcmF0aW9uKHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX29vYl9kYXRhCi0gKiBEZXNjcmlwdGlvbiAgUHJvY2Vzc2VzIGxvY2FsL3BlZXIgU0MgT09CIGRhdGEgcmVjZWl2ZWQgZnJvbSBzb21ld2hlcmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9vb2JfZGF0YSh0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICB0U01QX1NDX09PQl9EQVRBKiBwX3NjX29vYl9kYXRhID0gJnBfY2ItPnNjX29vYl9kYXRhOwotICBpZiAocF9zY19vb2JfZGF0YS0+bG9jX29vYl9kYXRhLnByZXNlbnQpIHsKLSAgICBwX2NiLT5sb2NhbF9yYW5kb20gPSBwX3NjX29vYl9kYXRhLT5sb2Nfb29iX2RhdGEucmFuZG9taXplcjsKLSAgfSBlbHNlIHsKLSAgICBTTVBfVFJBQ0VfRVZFTlQoIiVzOiBsb2NhbCBPT0IgcmFuZG9taXplciBpcyBhYnNlbnQiLCBfX2Z1bmNfXyk7Ci0gICAgcF9jYi0+bG9jYWxfcmFuZG9tID0gezB9OwotICB9Ci0KLSAgaWYgKCFwX3NjX29vYl9kYXRhLT5wZWVyX29vYl9kYXRhLnByZXNlbnQpIHsKLSAgICBTTVBfVFJBQ0VfRVZFTlQoIiVzOiBwZWVyIE9PQiBkYXRhIGlzIGFic2VudCIsIF9fZnVuY19fKTsKLSAgICBwX2NiLT5wZWVyX3JhbmRvbSA9IHswfTsKLSAgfSBlbHNlIHsKLSAgICBwX2NiLT5wZWVyX3JhbmRvbSA9IHBfc2Nfb29iX2RhdGEtPnBlZXJfb29iX2RhdGEucmFuZG9taXplcjsKLSAgICBwX2NiLT5yZW1vdGVfY29tbWl0bWVudCA9IHBfc2Nfb29iX2RhdGEtPnBlZXJfb29iX2RhdGEuY29tbWl0bWVudDsKLQotICAgIC8qIGNoZWNrIGNvbW1pdG1lbnQgKi8KLSAgICBpZiAoIXNtcF9jaGVja19jb21taXRtZW50KHBfY2IpKSB7Ci0gICAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfQ09ORklSTV9WQUxVRV9FUlI7Ci0gICAgICBwX2NiLT5mYWlsdXJlID0gU01QX0NPTkZJUk1fVkFMVUVfRVJSOwotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocF9jYi0+cGVlcl9vb2JfZmxhZyAhPSBTTVBfT09CX1BSRVNFTlQpIHsKLSAgICAgIC8qIHRoZSBwZWVyIGRvZXNuJ3QgaGF2ZSBsb2NhbCByYW5kb21pc2VyICovCi0gICAgICBTTVBfVFJBQ0VfRVZFTlQoCi0gICAgICAgICAgIiVzOiBwZWVyIGRpZG4ndCByZWNlaXZlIGxvY2FsIE9PQiBkYXRhLCBzZXQgbG9jYWwgcmFuZG9taXplciB0byAwIiwKLSAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICBwX2NiLT5sb2NhbF9yYW5kb20gPSB7MH07Ci0gICAgfQotICB9Ci0KLSAgcHJpbnQxMjgocF9jYi0+bG9jYWxfcmFuZG9tLCAoY29uc3QgdWludDhfdCopImxvY2FsIE9PQiByYW5kb21pemVyIik7Ci0gIHByaW50MTI4KHBfY2ItPnBlZXJfcmFuZG9tLCAoY29uc3QgdWludDhfdCopInBlZXIgT09CIHJhbmRvbWl6ZXIiKTsKLSAgc21wX3N0YXJ0X25vbmNlX2dlbmVyYXRpb24ocF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NldF9sb2NhbF9vb2Jfa2V5cwotICogRGVzY3JpcHRpb24gIFNhdmVzIGNhbGN1bGF0ZWQgcHJpdmF0ZS9wdWJsaWMga2V5cyBpbgotICogICAgICAgICAgICAgIHNjX29vYl9kYXRhLmxvY19vb2JfZGF0YSwgc3RhcnRzIG5vbmNlIGdlbmVyYXRpb24KLSAqICAgICAgICAgICAgICAodG8gYmUgc2F2ZWQgaW4gc2Nfb29iX2RhdGEubG9jX29vYl9kYXRhLnJhbmRvbWl6ZXIpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NldF9sb2NhbF9vb2Jfa2V5cyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBtZW1jcHkocF9jYi0+c2Nfb29iX2RhdGEubG9jX29vYl9kYXRhLnByaXZhdGVfa2V5X3VzZWQsIHBfY2ItPnByaXZhdGVfa2V5LAotICAgICAgICAgQlRfT0NURVQzMl9MRU4pOwotICBwX2NiLT5zY19vb2JfZGF0YS5sb2Nfb29iX2RhdGEucHVibF9rZXlfdXNlZCA9IHBfY2ItPmxvY19wdWJsX2tleTsKLSAgc21wX3N0YXJ0X25vbmNlX2dlbmVyYXRpb24ocF9jYik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NldF9sb2NhbF9vb2JfcmFuZG9tX2NvbW1pdG1lbnQKLSAqIERlc2NyaXB0aW9uICBTYXZlcyBjYWxjdWxhdGVkIHJhbmRvbWl6ZXIgYW5kIGNvbW1pdG1lbnQgaW4KLSAqICAgICAgICAgICAgICBzY19vb2JfZGF0YS5sb2Nfb29iX2RhdGEsIHBhc3NlcyBzY19vb2JfZGF0YS5sb2Nfb29iX2RhdGEgdXAKLSAqICAgICAgICAgICAgICBmb3Igc2FmZWtlZXBpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2V0X2xvY2FsX29vYl9yYW5kb21fY29tbWl0bWVudCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgcF9jYi0+c2Nfb29iX2RhdGEubG9jX29vYl9kYXRhLnJhbmRvbWl6ZXIgPSBwX2NiLT5yYW5kOwotCi0gIHBfY2ItPnNjX29vYl9kYXRhLmxvY19vb2JfZGF0YS5jb21taXRtZW50ID0KLSAgICAgIGNyeXB0b190b29sYm94OjpmNChwX2NiLT5zY19vb2JfZGF0YS5sb2Nfb29iX2RhdGEucHVibF9rZXlfdXNlZC54LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnNjX29vYl9kYXRhLmxvY19vb2JfZGF0YS5wdWJsX2tleV91c2VkLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+c2Nfb29iX2RhdGEubG9jX29vYl9kYXRhLnJhbmRvbWl6ZXIsIDApOwotCi0gIHBfY2ItPnNjX29vYl9kYXRhLmxvY19vb2JfZGF0YS5wcmVzZW50ID0gdHJ1ZTsKLQotICAvKiBwYXNzIGNyZWF0ZWQgT09CIGRhdGEgdXAgKi8KLSAgcF9jYi0+Y2JfZXZ0ID0gU01QX1NDX0xPQ19PT0JfREFUQV9VUF9FVlQ7Ci0gIHNtcF9zZW5kX2FwcF9jYmFjayhwX2NiLCBOVUxMKTsKLQotICAvLyBTdG9yZSB0aGUgZGF0YSBmb3IgbGF0ZXIgdXNlIHdoZW4gd2UgYXJlIHBhaXJlZCB3aXRoCi0gIC8vIEV2ZW50IHRob3VnaCB0aGUgZG9jIGFib3ZlIHNheXMgdG8gcGFzcyB1cCBmb3Igc2FmZSBrZWVwaW5nIGl0IG5ldmVyIGdldHMKLSAgLy8ga2VwdCBzYWZlLiBBZGRpdGlvbmFsbHksIHdoZW4gd2UgbmVlZCB0aGUgZGF0YSB0byBtYWtlIGEgZGVjaXNpb24gd2UKLSAgLy8gd291bGRuJ3QgaGF2ZSBpdC4gIFRoaXMgd2lsbCBzYXZlIHRoZSBzY19vb2JfZGF0YSBpbiB0aGUgc21wX2tleXMuY2Mgc3VjaAotICAvLyB0aGF0IHdoZW4gd2UgcmVjZWl2ZSBhIHJlcXVlc3QgdG8gY3JlYXRlIG5ldyBrZXlzIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUKLSAgLy8gc2Nfb29iX2RhdGEgZXhpc3RzIGFuZCB1dGlsaXplIHRoZSBrZXlzIHRoYXQgYXJlIHN0b3JlZCB0aGVyZSBvdGhlcndpc2UgdGhlCi0gIC8vIGNvbm5lY3RvciB3aWxsIGZhaWwgY29tbWl0bWVudCBjaGVjayBhbmQgZGhrZXkgZXhjaGFuZ2UuCi0gIHNtcF9zYXZlX2xvY2FsX29vYl9kYXRhKHBfY2IpOwotCi0gIHNtcF9jYl9jbGVhbnVwKHBfY2IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2xpbmtfZW5jcnlwdGVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGxpbmsgaXMgZW5jcnlwdGVkIGFuZCBub3RpZmllZAotICogICAgICAgICAgICAgICAgICB0byB0aGUgcGVyaXBoZXJhbCBkZXZpY2UuIFByb2NlZWQgdG8gdG8gc2VuZCBMVEssIERJViBhbmQgRVIKLSAqdG8gY2VudHJhbCBpZiBib25kaW5nIHRoZSBkZXZpY2VzLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfbGlua19lbmNyeXB0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90IGVuY3JfZW5hYmxlKSB7Ci0gIHRTTVBfQ0IqIHBfY2IgPSAmc21wX2NiOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXM6IGVuY3JfZW5hYmxlPSVkIiwgX19mdW5jX18sIGVuY3JfZW5hYmxlKTsKLQotICBpZiAoc21wX2NiLnBhaXJpbmdfYmRhID09IGJkYSkgewotICAgIC8qIGVuY3J5cHRpb24gY29tcGxldGVkIHdpdGggU1RLLCByZW1lbWJlciB0aGUga2V5IHNpemUgbm93LCBjb3VsZCBiZQotICAgICAqIG92ZXJ3cml0dGVuIHdoZW4ga2V5IGV4Y2hhbmdlIGhhcHBlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmIChwX2NiLT5sb2NfZW5jX3NpemUgIT0gMCAmJiBlbmNyX2VuYWJsZSkgewotICAgICAgLyogdXBkYXRlIHRoZSBsaW5rIGVuY3J5cHRpb24ga2V5IHNpemUgaWYgYSBTTVAgcGFpcmluZyBqdXN0IHBlcmZvcm1lZCAqLwotICAgICAgYnRtX2JsZV91cGRhdGVfc2VjX2tleV9zaXplKGJkYSwgcF9jYi0+bG9jX2VuY19zaXplKTsKLSAgICB9Ci0KLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YSA9IHsKLSAgICAgICAgLy8gVE9ETyBUaGlzIGlzIG5vdCBhIHRTTVBfU1RBVFVTCi0gICAgICAgIC5zdGF0dXMgPSBzdGF0aWNfY2FzdDx0U01QX1NUQVRVUz4oZW5jcl9lbmFibGUpLAotICAgIH07Ci0KLSAgICBzbXBfc21fZXZlbnQoJnNtcF9jYiwgU01QX0VOQ1JZUFRFRF9FVlQsICZzbXBfaW50X2RhdGEpOwotICB9Ci19Ci0KLXZvaWQgc21wX2NhbmNlbF9zdGFydF9lbmNyeXB0aW9uX2F0dGVtcHQoKSB7Ci0gIFNNUF9UUkFDRV9FUlJPUigiJXM6IEVuY3J5cHRpb24gcmVxdWVzdCBjYW5jZWxsZWQiLCBfX2Z1bmNfXyk7Ci0gIHNtcF9zbV9ldmVudCgmc21wX2NiLCBTTVBfRElTQ0FSRF9TRUNfUkVRX0VWVCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfcHJvY19sdGtfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBMVEsgcmVxdWVzdCBpcyByZWNlaXZlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgc21wX3Byb2NfbHRrX3JlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMgc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBzbXBfY2Iuc3RhdGUpOwotICBib29sIG1hdGNoID0gZmFsc2U7Ci0KLSAgaWYgKGJkYSA9PSBzbXBfY2IucGFpcmluZ19iZGEpIHsKLSAgICBtYXRjaCA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KGJkYSk7Ci0gICAgaWYgKHBfZGV2X3JlYyAhPSBOVUxMICYmIHBfZGV2X3JlYy0+YmxlLnBzZXVkb19hZGRyID09IHNtcF9jYi5wYWlyaW5nX2JkYSAmJgotICAgICAgICBwX2Rldl9yZWMtPmJsZS5wc2V1ZG9fYWRkciAhPSBSYXdBZGRyZXNzOjprRW1wdHkpIHsKLSAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWF0Y2ggJiYgc21wX2NiLnN0YXRlID09IFNNUF9TVEFURV9FTkNSWVBUSU9OX1BFTkRJTkcpIHsKLSAgICBzbXBfc21fZXZlbnQoJnNtcF9jYiwgU01QX0VOQ19SRVFfRVZULCBOVUxMKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX2xvbmdfdGVybV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgU0MgTFRLLgotICogICAgICAgICAgICAgICAgICBTQyBMVEsgaXMgY2FsY3VsYXRlZCBhbmQgdXNlZCBpbnN0ZWFkIG9mIFNUSy4KLSAqICAgICAgICAgICAgICAgICAgSGVyZSBTQyBMVEsgaXMgc2F2ZWQgaW4gQkxFIERCLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX2xvbmdfdGVybV9rZXkodm9pZCkgewotICB0U01QX0NCKiBwX2NiID0gJnNtcF9jYjsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBzbXBfc2F2ZV9zZWN1cmVfY29ubmVjdGlvbnNfbG9uZ190ZXJtX2tleShwX2NiKTsKLQotICBzbXBfdXBkYXRlX2tleV9tYXNrKHBfY2IsIFNNUF9TRUNfS0VZX1RZUEVfRU5DLCBmYWxzZSk7Ci0gIHNtcF9rZXlfZGlzdHJpYnV0aW9uKHBfY2IsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3NldF9kZXJpdmVfbGlua19rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgQlIvRURSIExLIGhhcyB0byBiZSBkZXJpdmVkIGZyb20gTFRLIGFmdGVyIGFsbCBrZXlzIGFyZQotICogICAgICAgICAgICAgICAgICBkaXN0cmlidXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2V0X2Rlcml2ZV9saW5rX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgcF9jYi0+ZGVyaXZlX2xrID0gdHJ1ZTsKLSAgc21wX3VwZGF0ZV9rZXlfbWFzayhwX2NiLCBTTVBfU0VDX0tFWV9UWVBFX0xLLCBmYWxzZSk7Ci0gIHNtcF9rZXlfZGlzdHJpYnV0aW9uKHBfY2IsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2Rlcml2ZV9saW5rX2tleV9mcm9tX2xvbmdfdGVybV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlcml2ZSBCUi9FRFIgTEsgZnJvbSBMVEsuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2Rlcml2ZV9saW5rX2tleV9mcm9tX2xvbmdfdGVybV9rZXkodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHRTTVBfU1RBVFVTIHN0YXR1cyA9IFNNUF9QQUlSX0ZBSUxfVU5LTk9XTjsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBpZiAoIXNtcF9jYWxjdWxhdGVfbGlua19rZXlfZnJvbV9sb25nX3Rlcm1fa2V5KHBfY2IpKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKCIlcyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2JyX3Byb2Nlc3NfbGlua19rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgQlIvRURSIExLOgotICogICAgICAgICAgICAgICAgICAtIHRvIGRlcml2ZSBTTVAgTFRLIGZyb20gQlIvRURSIExLOwotICogICAgICAgICAgICAgICAgICAtIHRvIHNhdmUgU01QIExUSy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfYnJfcHJvY2Vzc19saW5rX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdFNNUF9TVEFUVVMgc3RhdHVzID0gU01QX1BBSVJfRkFJTF9VTktOT1dOOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmICghc21wX2NhbGN1bGF0ZV9sb25nX3Rlcm1fa2V5X2Zyb21fbGlua19rZXkocF9jYikpIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzOiBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0JSX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihwX2NiLT5wYWlyaW5nX2JkYSk7Ci0gIGlmIChwX2Rldl9yZWMpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIiVzOiBkZXZfdHlwZSA9ICVkICIsIF9fZnVuY19fLCBwX2Rldl9yZWMtPmRldmljZV90eXBlKTsKLSAgICBwX2Rldl9yZWMtPmRldmljZV90eXBlIHw9IEJUX0RFVklDRV9UWVBFX0JMRTsKLSAgfSBlbHNlIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzIGZhaWxlZCB0byBmaW5kIFNlY3VyaXR5IFJlY29yZCIsIF9fZnVuY19fKTsKLSAgfQotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXM6IExUSyBkZXJpdmF0aW9uIGZyb20gTEsgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gIHNtcF9zYXZlX3NlY3VyZV9jb25uZWN0aW9uc19sb25nX3Rlcm1fa2V5KHBfY2IpOwotICBzbXBfdXBkYXRlX2tleV9tYXNrKHBfY2IsIFNNUF9TRUNfS0VZX1RZUEVfRU5DLCBmYWxzZSk7Ci0gIHNtcF9icl9zZWxlY3RfbmV4dF9rZXkocF9jYiwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX2tleV9kaXN0cmlidXRpb25fYnlfdHJhbnNwb3J0Ci0gKiBEZXNjcmlwdGlvbiAgZGVwZW5kaW5nIG9uIHRoZSB0cmFuc3BvcnQgdXNlZCBhdCB0aGUgbW9tZW50IGNhbGxzIGVpdGhlcgotICogICAgICAgICAgICAgIHNtcF9rZXlfZGlzdHJpYnV0aW9uKC4uLikgb3Igc21wX2JyX2tleV9kaXN0cmlidXRpb24oLi4uKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9rZXlfZGlzdHJpYnV0aW9uX2J5X3RyYW5zcG9ydCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgaWYgKHBfY2ItPnNtcF9vdmVyX2JyKSB7Ci0gICAgc21wX2JyX3NlbGVjdF9uZXh0X2tleShwX2NiLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBzbXBfa2V5X2Rpc3RyaWJ1dGlvbihwX2NiLCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfYnJfcGFpcmluZ19jb21wbGV0ZQotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIHRoZSBwYWlyaW5nIGNvbXBsZXRlCi0gKiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIGNvbm5lY3Rpb24gaWYgbmVlZGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2JyX3BhaXJpbmdfY29tcGxldGUodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHBfY2ItPnRvdGFsX3R4X3VuYWNrZWQgPT0gMCkgewotICAgIC8qIHByb2Nlc3MgdGhlIHBhaXJpbmcgY29tcGxldGUgKi8KLSAgICBzbXBfcHJvY19wYWlyaW5nX2NtcGwocF9jYik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3NtcC9zbXBfYXBpLmNjIGIvc3RhY2svc21wL3NtcF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzAzMzQuLjAwMDAwMDAKLS0tIGEvc3RhY2svc21wL3NtcF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTTVAgaW50ZXJmYWNlIHVzZWQgYnkKLSAqICBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gcnVuIG92ZXIgYW4gU01QLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAic21wX2FwaS5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImdkL29zL2xvZy5oIgotI2luY2x1ZGUgImdkL29zL3JhbmQuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAicF8yNTZfZWNjX3BwLmgiCi0jaW5jbHVkZSAic21wX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fZGV2LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX0luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFNNUCB1bml0LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNNUF9Jbml0KHZvaWQpIHsKLSAgaWYgKGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpIHsKLSAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBTTVBfSW5pdCBiZWNhdXNlIEdEIGlzIGVuYWJsZWQiOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1lbXNldCgmc21wX2NiLCAwLCBzaXplb2YodFNNUF9DQikpOwotICBzbXBfY2Iuc21wX3JzcF90aW1lcl9lbnQgPSBhbGFybV9uZXcoInNtcC5zbXBfcnNwX3RpbWVyX2VudCIpOwotICBzbXBfY2IuZGVsYXllZF9hdXRoX3RpbWVyX2VudCA9IGFsYXJtX25ldygic21wLmRlbGF5ZWRfYXV0aF90aW1lcl9lbnQiKTsKLQotI2lmIGRlZmluZWQoU01QX0lOSVRJQUxfVFJBQ0VfTEVWRUwpCi0gIHNtcF9jYi50cmFjZV9sZXZlbCA9IFNNUF9JTklUSUFMX1RSQUNFX0xFVkVMOwotI2Vsc2UKLSAgc21wX2NiLnRyYWNlX2xldmVsID0gQlRfVFJBQ0VfTEVWRUxfTk9ORTsgLyogTm8gdHJhY2VzICovCi0jZW5kaWYKLSAgU01QX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBzbXBfbDJjYXBfaWZfaW5pdCgpOwotICAvKiBpbml0aWFsaXphdGlvbiBvZiBQLTI1NiBwYXJhbWV0ZXJzICovCi0gIHBfMjU2X2luaXRfY3VydmUoKTsKLQotICAvKiBJbml0aWFsaXplIGZhaWx1cmUgY2FzZSBmb3IgY2VydGlmaWNhdGlvbiAqLwotICBzbXBfY2IuY2VydF9mYWlsdXJlID0gc3RhdGljX2Nhc3Q8dFNNUF9TVEFUVVM+KAotICAgICAgc3RhY2tfY29uZmlnX2dldF9pbnRlcmZhY2UoKS0+Z2V0X3B0c19zbXBfZmFpbHVyZV9jYXNlKCkpOwotICBpZiAoc21wX2NiLmNlcnRfZmFpbHVyZSkKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzIFBUUyBGQUlMVVJFIE1PREUgSU4gRUZGRUNUIChDQVNFICVkKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICBzbXBfY2IuY2VydF9mYWlsdXJlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9TZXRUcmFjZUxldmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHRyYWNlIGxldmVsIGZvciBTTVAuICBJZiBjYWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIDB4RkYsIGl0IHNpbXBseSByZXR1cm5zIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsLgotICoKLSAqICAgICAgICAgICAgICAgICAgSW5wdXQgUGFyYW1ldGVyczoKLSAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAgVGhlIGxldmVsIHRvIHNldCB0aGUgR0FUVCB0cmFjaW5nIHRvOgotICogICAgICAgICAgICAgICAgICAgICAgMHhmZi1yZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcuCi0gKiAgICAgICAgICAgICAgICAgICAgICAwLXR1cm5zIG9mZiB0cmFjaW5nLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMS1FcnJvcnMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSAyLVdhcm5pbmdzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gMy1BUElzLgotICogICAgICAgICAgICAgICAgICAgICAgPj0gNC1FdmVudHMuCi0gKiAgICAgICAgICAgICAgICAgICAgICA+PSA1LURlYnVnLgotICoKLSAqIFJldHVybnMgICAgICAgICAgVGhlIG5ldyBvciBjdXJyZW50IHRyYWNlIGxldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgU01QX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgaWYgKG5ld19sZXZlbCAhPSAweEZGKSBzbXBfY2IudHJhY2VfbGV2ZWwgPSBuZXdfbGV2ZWw7Ci0KLSAgcmV0dXJuIChzbXBfY2IudHJhY2VfbGV2ZWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX1JlZ2lzdGVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVyIGZvciB0aGUgU01QIHNlcnZpY2VzIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIFNNUF9SZWdpc3Rlcih0U01QX0NBTExCQUNLKiBwX2NiYWNrKSB7Ci0gIExPR19BU1NFUlQoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpCi0gICAgICA8PCAiTGVnYWN5IFNNUCBBUEkgc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdoZW4gR0QgU2VjdXJpdHkgaXMgdXNlZCI7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCJTTVBfUmVnaXN0ZXIgc3RhdGU9JWQiLCBzbXBfY2Iuc3RhdGUpOwotCi0gIGlmIChzbXBfY2IucF9jYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKCJTTVBfUmVnaXN0ZXI6IGR1cGxpY2F0ZSByZWdpc3RyYXRpb24sIG92ZXJ3cml0ZSBpdCIpOwotICB9Ci0gIHNtcF9jYi5wX2NhbGxiYWNrID0gcF9jYmFjazsKLQotICByZXR1cm4gKHRydWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX1BhaXIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCB0byBwZXJmb3JtIGEgU01QIHBhaXJpbmcgd2l0aCBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4gRGV2aWNlIHN1cHBvcnQgb25lIFNNUCBwYWlyaW5nIGF0IG9uZSB0aW1lLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAtIHBlZXIgZGV2aWNlIGJkIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBOb25lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTTVBfU1RBVFVTIFNNUF9QYWlyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgTE9HX0FTU0VSVCghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkKLSAgICAgIDw8ICJMZWdhY3kgU01QIEFQSSBzaG91bGQgbm90IGJlIGludm9rZWQgd2hlbiBHRCBTZWN1cml0eSBpcyB1c2VkIjsKLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlczogc3RhdGU9JWQgYnJfc3RhdGU9JWQgZmxhZz0weCV4LCBiZF9hZGRyPSVzIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICBwX2NiLT5zdGF0ZSwgcF9jYi0+YnJfc3RhdGUsIHBfY2ItPmZsYWdzLAotICAgICAgICAgICAgICAgICAgYmRfYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmIChwX2NiLT5zdGF0ZSAhPSBTTVBfU1RBVEVfSURMRSB8fAotICAgICAgcF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REIHx8IHBfY2ItPnNtcF9vdmVyX2JyKSB7Ci0gICAgLyogcGVuZGluZyBzZWN1cml0eSBvbiBnb2luZywgcmVqZWN0IHRoaXMgb25lICovCi0gICAgcmV0dXJuIFNNUF9CVVNZOwotICB9IGVsc2UgewotICAgIHBfY2ItPmZsYWdzID0gU01QX1BBSVJfRkxBR1NfV0VfU1RBUlRFRF9ERDsKLSAgICBwX2NiLT5wYWlyaW5nX2JkYSA9IGJkX2FkZHI7Ci0KLSAgICBpZiAoIUwyQ0FfQ29ubmVjdEZpeGVkQ2hubChMMkNBUF9TTVBfQ0lELCBiZF9hZGRyKSkgewotICAgICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1BBSVJfSU5URVJOQUxfRVJSOwotICAgICAgcF9jYi0+c3RhdHVzID0gU01QX1BBSVJfSU5URVJOQUxfRVJSOwotICAgICAgU01QX1RSQUNFX0VSUk9SKCIlczogTDJDIGNvbm5lY3QgZml4ZWQgY2hhbm5lbCBmYWlsZWQuIiwgX19mdW5jX18pOwotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICAgIHJldHVybiBTTVBfUEFJUl9JTlRFUk5BTF9FUlI7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNNUF9TVEFSVEVEOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTTVBfQlJfUGFpcldpdGgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IGEgU01QIHBhaXJpbmcgb3ZlciBCUi9FRFIuCi0gKiAgICAgICAgICAgICAgICAgIERldmljZSBzdXBwb3J0IG9uZSBTTVAgcGFpcmluZyBhdCBvbmUgdGltZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGJkX2FkZHIgLSBwZWVyIGRldmljZSBiZCBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgU01QX1NUQVJURUQgaWYgcGFpcmluZyBzdGFydGVkLCBvdGhlcndpc2UgdGhlIHJlYXNvbiBmb3IKLSAqICAgICAgICAgICAgICAgICAgZmFpbHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdFNNUF9TVEFUVVMgU01QX0JSX1BhaXJXaXRoKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgTE9HX0FTU0VSVCghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkKLSAgICAgIDw8ICJMZWdhY3kgU01QIEFQSSBzaG91bGQgbm90IGJlIGludm9rZWQgd2hlbiBHRCBTZWN1cml0eSBpcyB1c2VkIjsKLQotICB0U01QX0NCKiBwX2NiID0gJnNtcF9jYjsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzOiBzdGF0ZT0lZCBicl9zdGF0ZT0lZCBmbGFnPTB4JXgsIGJkX2FkZHI9JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgIHBfY2ItPnN0YXRlLCBwX2NiLT5icl9zdGF0ZSwgcF9jYi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgaWYgKHBfY2ItPnN0YXRlICE9IFNNUF9TVEFURV9JRExFIHx8IHBfY2ItPnNtcF9vdmVyX2JyIHx8Ci0gICAgICBwX2NiLT5mbGFncyAmIFNNUF9QQUlSX0ZMQUdTX1dFX1NUQVJURURfREQpIHsKLSAgICAvKiBwZW5kaW5nIHNlY3VyaXR5IG9uIGdvaW5nLCByZWplY3QgdGhpcyBvbmUgKi8KLSAgICByZXR1cm4gU01QX0JVU1k7Ci0gIH0KLQotICBwX2NiLT5yb2xlID0gSENJX1JPTEVfQ0VOVFJBTDsKLSAgcF9jYi0+ZmxhZ3MgPSBTTVBfUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REOwotICBwX2NiLT5zbXBfb3Zlcl9iciA9IHRydWU7Ci0gIHBfY2ItPnBhaXJpbmdfYmRhID0gYmRfYWRkcjsKLQotICBpZiAoIUwyQ0FfQ29ubmVjdEZpeGVkQ2hubChMMkNBUF9TTVBfQlJfQ0lELCBiZF9hZGRyKSkgewotICAgIFNNUF9UUkFDRV9FUlJPUigiJXM6IEwyQyBjb25uZWN0IGZpeGVkIGNoYW5uZWwgZmFpbGVkLiIsIF9fZnVuY19fKTsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1BBSVJfSU5URVJOQUxfRVJSOwotICAgIHBfY2ItPnN0YXR1cyA9IFNNUF9QQUlSX0lOVEVSTkFMX0VSUjsKLSAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudChwX2NiLCBTTVBfQlJfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuIFNNUF9QQUlSX0lOVEVSTkFMX0VSUjsKLSAgfQotCi0gIHJldHVybiBTTVBfU1RBUlRFRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9QYWlyQ2FuY2VsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGNhbGwgdG8gY2FuY2VsIGEgU01QIHBhaXJpbmcgd2l0aCBwZWVyIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzICAgICAgIGJkX2FkZHIgLSBwZWVyIGRldmljZSBiZCBhZGRyZXNzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSAtIFBhaXJpbmluZyBpcyBjYW5jZWxsZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBTTVBfUGFpckNhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIExPR19BU1NFUlQoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpCi0gICAgICA8PCAiTGVnYWN5IFNNUCBBUEkgc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdoZW4gR0QgU2VjdXJpdHkgaXMgdXNlZCI7Ci0KLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCJTTVBfQ2FuY2VsUGFpciBzdGF0ZT0lZCBmbGFnPTB4JXggIiwgcF9jYi0+c3RhdGUsCi0gICAgICAgICAgICAgICAgICBwX2NiLT5mbGFncyk7Ci0gIGlmIChwX2NiLT5zdGF0ZSAhPSBTTVBfU1RBVEVfSURMRSAmJiBwX2NiLT5wYWlyaW5nX2JkYSA9PSBiZF9hZGRyKSB7Ci0gICAgcF9jYi0+aXNfcGFpcl9jYW5jZWwgPSB0cnVlOwotICAgIFNNUF9UUkFDRV9ERUJVRygiQ2FuY2VsIFBhaXJpbmc6IHNldCBmYWlsIHJlYXNvbiBVbmtub3duIik7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9QQUlSX0ZBSUxfVU5LTk9XTjsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9TZWN1cml0eUdyYW50Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBncmFudCBzZWN1cml0eSBwcm9jZXNzLgotICoKLSAqIFBhcmFtZXRlcnMgICAgICAgYmRfYWRkciAtIHBlZXIgZGV2aWNlIGJkIGFkZHJlc3MuCi0gKiAgICAgICAgICAgICAgICAgIHJlcyAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBTTVBfUkVQRUFURURfQVRURU1QVFMgaWYgdG9vIG1hbnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRzLgotICoKLSAqIFJldHVybnMgICAgICAgICAgTm9uZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNNUF9TZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRTTVBfU1RBVFVTIHJlcykgewotICBMT0dfQVNTRVJUKCFibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpKQotICAgICAgPDwgIkxlZ2FjeSBTTVAgQVBJIHNob3VsZCBub3QgYmUgaW52b2tlZCB3aGVuIEdEIFNlY3VyaXR5IGlzIHVzZWQiOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiU01QX1NlY3VyaXR5R3JhbnQgIik7Ci0KLSAgLy8gSWYganVzdCBzaG93aW5nIGNvbnNlbnQgZGlhbG9nLCBzZW5kIHJlc3BvbnNlCi0gIGlmIChzbXBfY2IuY2JfZXZ0ID09IFNNUF9DT05TRU5UX1JFUV9FVlQpIHsKLSAgICAvLyBJZiBKVVNUV09SS1MsIHRoaXMgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBjb25zZW50IGRpYWxvZwotICAgIGlmIChzbXBfY2Iuc2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwgPT0gU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUykgewotICAgICAgaWYgKHJlcyA9PSBTTVBfU1VDQ0VTUykgewotICAgICAgICBzbXBfc21fZXZlbnQoJnNtcF9jYiwgU01QX1NDX05DX09LX0VWVCwgTlVMTCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTTVBfVFJBQ0VfV0FSTklORygiJXMoKSAtIENvbnNlbnQgZGlhbG9nIGZhaWxzIGZvciBKVVNUV09SS1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7Ci0gICAgICAgIC8qIHNlbmQgcGFpcmluZyBmYWlsdXJlICovCi0gICAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX05VTUVSSUNfQ09NUEFSX0ZBSUw7Ci0gICAgICAgIHNtcF9zbV9ldmVudCgmc21wX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzbXBfY2Iuc2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwgPT0gU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSkgewotICAgICAgaWYgKHJlcyA9PSBTTVBfU1VDQ0VTUykgewotICAgICAgICBzbXBfY2Iuc2VjX2xldmVsID0gU01QX1NFQ19VTkFVVEhFTlRJQ0FURTsKLQotICAgICAgICB0U01QX0tFWSBrZXk7Ci0gICAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgICBrZXkua2V5X3R5cGUgPSBTTVBfS0VZX1RZUEVfVEs7Ci0gICAgICAgIGtleS5wX2RhdGEgPSBzbXBfY2IudGsuZGF0YSgpOwotICAgICAgICBzbXBfaW50X2RhdGEua2V5ID0ga2V5OwotCi0gICAgICAgIHNtcF9jYi50ayA9IHswfTsKLSAgICAgICAgc21wX3NtX2V2ZW50KCZzbXBfY2IsIFNNUF9LRVlfUkVBRFlfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNNUF9UUkFDRV9XQVJOSU5HKCIlcygpIC0gQ29uc2VudCBkaWFsb2cgZmFpbHMgZm9yIEVOQ1JZUFRJT05fT05MWSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKLSAgICAgICAgLyogc2VuZCBwYWlyaW5nIGZhaWx1cmUgKi8KLSAgICAgICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfTlVNRVJJQ19DT01QQVJfRkFJTDsKLSAgICAgICAgc21wX3NtX2V2ZW50KCZzbXBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHNtcF9jYi5zbXBfb3Zlcl9icikgewotICAgIGlmIChzbXBfY2IuYnJfc3RhdGUgIT0gU01QX0JSX1NUQVRFX1dBSVRfQVBQX1JTUCB8fAotICAgICAgICBzbXBfY2IuY2JfZXZ0ICE9IFNNUF9TRUNfUkVRVUVTVF9FVlQgfHwgc21wX2NiLnBhaXJpbmdfYmRhICE9IGJkX2FkZHIpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBjbGVhciB0aGUgU01QX1NFQ19SRVFVRVNUX0VWVCBldmVudCBhZnRlciBnZXQgZ3JhbnQgKi8KLSAgICAvKiBhdm9pZCBnZW5lcmF0aW5nIGR1cGxpY2F0ZSBwYWlyIHJlcXVlc3QgKi8KLSAgICBzbXBfY2IuY2JfZXZ0ID0gU01QX0VWVF9OT05FOwotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSByZXM7Ci0gICAgc21wX2JyX3N0YXRlX21hY2hpbmVfZXZlbnQoJnNtcF9jYiwgU01QX0JSX0FQSV9TRUNfR1JBTlRfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzbXBfY2Iuc3RhdGUgIT0gU01QX1NUQVRFX1dBSVRfQVBQX1JTUCB8fAotICAgICAgc21wX2NiLmNiX2V2dCAhPSBTTVBfU0VDX1JFUVVFU1RfRVZUIHx8IHNtcF9jYi5wYWlyaW5nX2JkYSAhPSBiZF9hZGRyKQotICAgIHJldHVybjsKLSAgLyogY2xlYXIgdGhlIFNNUF9TRUNfUkVRVUVTVF9FVlQgZXZlbnQgYWZ0ZXIgZ2V0IGdyYW50ICovCi0gIC8qIGF2b2lkIGdlbmVyYXRlIGR1cGxpY2F0ZSBwYWlyIHJlcXVlc3QgKi8KLSAgc21wX2NiLmNiX2V2dCA9IFNNUF9FVlRfTk9ORTsKLSAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSByZXM7Ci0gIHNtcF9zbV9ldmVudCgmc21wX2NiLCBTTVBfQVBJX1NFQ19HUkFOVF9FVlQsICZzbXBfaW50X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX1Bhc3NrZXlSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgU2VjdXJpdHkgTWFuYWdlciBzdWJtaXR0ZWQKLSAqICAgICAgICAgICAgICAgICAgcGFzc2tleSByZXF1ZXN0IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgLSBBZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIHdoaWNoIHBhc3NrZXkgd2FzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAtIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIFNNUF9TVUNDRVNTIGlmIHN1Y2Nlc3MKLSAqICAgICAgICAgICAgICAgICAgcGFzc2tleSAtIG51bWVyaWMgdmFsdWUgaW4gdGhlIHJhbmdlIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fTUlOX1BBU1NLRVlfVkFMKDApIC0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9NQVhfUEFTU0tFWV9WQUwoOTk5OTk5KDB4RjQyM0YpKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTTVBfUGFzc2tleVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgTE9HX0FTU0VSVCghYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zaGltX2VuYWJsZWQoKSkKLSAgICAgIDw8ICJMZWdhY3kgU01QIEFQSSBzaG91bGQgbm90IGJlIGludm9rZWQgd2hlbiBHRCBTZWN1cml0eSBpcyB1c2VkIjsKLQotICB0U01QX0NCKiBwX2NiID0gJnNtcF9jYjsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIlNNUF9QYXNza2V5UmVwbHk6IEtleTogJWQgIFJlc3VsdDolZCIsIHBhc3NrZXksIHJlcyk7Ci0KLSAgLyogSWYgdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb3IgaGFzIGJlZW4gY2FuY2VsZWQsIGlnbm9yZSB0aGUgcmVwbHkgKi8KLSAgaWYgKHBfY2ItPmNiX2V2dCAhPSBTTVBfUEFTU0tFWV9SRVFfRVZUKSB7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIlNNUF9QYXNza2V5UmVwbHkoKSAtIFdyb25nIFN0YXRlOiAlZCIsIHBfY2ItPnN0YXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYmRfYWRkciAhPSBwX2NiLT5wYWlyaW5nX2JkYSkgewotICAgIFNNUF9UUkFDRV9FUlJPUigiU01QX1Bhc3NrZXlSZXBseSgpIC0gV3JvbmcgQkQgQWRkciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChidG1fZmluZF9kZXYoYmRfYWRkcikgPT0gTlVMTCkgewotICAgIFNNUF9UUkFDRV9FUlJPUigiU01QX1Bhc3NrZXlSZXBseSgpIC0gbm8gZGV2IENCIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBhc3NrZXkgPiBCVE1fTUFYX1BBU1NLRVlfVkFMIHx8IHJlcyAhPSBTTVBfU1VDQ0VTUykgewotICAgIFNNUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiU01QX1Bhc3NrZXlSZXBseSgpIC0gV3Jvbmcga2V5IGxlbjogJWQgb3IgcGFzc2tleSBlbnRyeSBmYWlsIiwKLSAgICAgICAgcGFzc2tleSk7Ci0gICAgLyogc2VuZCBwYWlyaW5nIGZhaWx1cmUgKi8KLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1BBU1NLRVlfRU5UUllfRkFJTDsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotCi0gIH0gZWxzZSBpZiAocF9jYi0+c2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwgPT0KLSAgICAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9FTlQpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEucGFzc2tleSA9IHBhc3NrZXk7Ci0gICAgc21wX3NtX2V2ZW50KCZzbXBfY2IsIFNNUF9TQ19LRVlfUkVBRFlfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBzbXBfY29udmVydF9zdHJpbmdfdG9fdGsoJnBfY2ItPnRrLCBwYXNza2V5KTsKLSAgfQotCi0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9Db25maXJtUmVwbHkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIFNlY3VyaXR5IE1hbmFnZXIgc3VibWl0dGVkCi0gKiAgICAgICAgICAgICAgICAgIG51bWVyaWMgY29tcGFyaXNvbiByZXF1ZXN0IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGRldmljZSB3aXRoIHdoaWNoIG51bWVyaWMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbiB3YXMgcmVxdWVzdGVkCi0gKiAgICAgICAgICAgICAgICAgIHJlcyAgICAgICAgICAtIGNvbXBhcmlzb24gcmVzdWx0IFNNUF9TVUNDRVNTIGlmIHN1Y2Nlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTTVBfQ29uZmlybVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVzKSB7Ci0gIExPR19BU1NFUlQoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpCi0gICAgICA8PCAiTGVnYWN5IFNNUCBBUEkgc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdoZW4gR0QgU2VjdXJpdHkgaXMgdXNlZCI7Ci0KLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlczogUmVzdWx0OiVkIiwgX19mdW5jX18sIHJlcyk7Ci0KLSAgLyogSWYgdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb3IgaGFzIGJlZW4gY2FuY2VsZWQsIGlnbm9yZSB0aGUgcmVwbHkgKi8KLSAgaWYgKHBfY2ItPmNiX2V2dCAhPSBTTVBfTkNfUkVRX0VWVCkgewotICAgIFNNUF9UUkFDRV9XQVJOSU5HKCIlcygpIC0gV3JvbmcgU3RhdGU6ICVkIiwgX19mdW5jX18sIHBfY2ItPnN0YXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYmRfYWRkciAhPSBwX2NiLT5wYWlyaW5nX2JkYSkgewotICAgIFNNUF9UUkFDRV9FUlJPUigiJXMoKSAtIFdyb25nIEJEIEFkZHIiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGJ0bV9maW5kX2RldihiZF9hZGRyKSA9PSBOVUxMKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKCIlcygpIC0gbm8gZGV2IENCIiwgX19mdW5jX18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChyZXMgIT0gU01QX1NVQ0NFU1MpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygiJXMoKSAtIE51bWVyaWMgQ29tcGFyaXNvbiBmYWlscyIsIF9fZnVuY19fKTsKLSAgICAvKiBzZW5kIHBhaXJpbmcgZmFpbHVyZSAqLwotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5zdGF0dXMgPSBTTVBfTlVNRVJJQ19DT01QQVJfRkFJTDsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICB9IGVsc2UgewotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfU0NfTkNfT0tfRVZULCBOVUxMKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX09vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBTTVBfT09CX1JFUV9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIGJkX2FkZHIgICAgIC0gQWRkcmVzcyBvZiB0aGUgcGVlciBkZXZpY2UKLSAqICAgICAgICAgICAgICAgICAgcmVzICAgICAgICAgLSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBTTVBfU1VDQ0VTUyBpZiBzdWNjZXNzCi0gKiAgICAgICAgICAgICAgICAgIHBfZGF0YSAgICAgIC0gc2ltcGxlIHBhaXJpbmcgUmFuZG9taXplciAgQy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTTVBfT29iRGF0YVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRTTVBfU1RBVFVTIHJlcywgdWludDhfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhKSB7Ci0gIExPR19BU1NFUlQoIWJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkpCi0gICAgICA8PCAiTGVnYWN5IFNNUCBBUEkgc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdoZW4gR0QgU2VjdXJpdHkgaXMgdXNlZCI7Ci0KLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0gIHRTTVBfS0VZIGtleTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIFN0YXRlOiAlZCAgcmVzOiVkIiwgX19mdW5jX18sIHNtcF9jYi5zdGF0ZSwgcmVzKTsKLQotICAvKiBJZiB0aW1lb3V0IGFscmVhZHkgZXhwaXJlZCBvciBoYXMgYmVlbiBjYW5jZWxlZCwgaWdub3JlIHRoZSByZXBseSAqLwotICBpZiAocF9jYi0+c3RhdGUgIT0gU01QX1NUQVRFX1dBSVRfQVBQX1JTUCB8fCBwX2NiLT5jYl9ldnQgIT0gU01QX09PQl9SRVFfRVZUKQotICAgIHJldHVybjsKLQotICBpZiAocmVzICE9IFNNUF9TVUNDRVNTIHx8IGxlbiA9PSAwIHx8ICFwX2RhdGEpIHsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX09PQl9GQUlMOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGxlbiA+IE9DVEVUMTZfTEVOKSBsZW4gPSBPQ1RFVDE2X0xFTjsKLQotICAgIG1lbWNweShwX2NiLT50ay5kYXRhKCksIHBfZGF0YSwgbGVuKTsKLQotICAgIGtleS5rZXlfdHlwZSA9IFNNUF9LRVlfVFlQRV9USzsKLSAgICBrZXkucF9kYXRhID0gcF9jYi0+dGsuZGF0YSgpOwotCi0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLmtleSA9IGtleTsKLSAgICBzbXBfc21fZXZlbnQoJnNtcF9jYiwgU01QX0tFWV9SRUFEWV9FVlQsICZzbXBfaW50X2RhdGEpOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBTTVBfU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvdmlkZSB0aGUgU0MgT09CIGRhdGEgZm9yCi0gKiAgICAgICAgICAgICAgICAgIFNNUCBpbiByZXNwb25zZSB0byBTTVBfU0NfT09CX1JFUV9FVlQKLSAqCi0gKiBQYXJhbWV0ZXJzOiAgICAgIHBfZGF0YSAgICAgIC0gcG9pbnRlciB0byB0aGUgZGF0YQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNNUF9TZWN1cmVDb25uZWN0aW9uT29iRGF0YVJlcGx5KHVpbnQ4X3QqIHBfZGF0YSkgewotICB0U01QX0NCKiBwX2NiID0gJnNtcF9jYjsKLQotICB0U01QX1NDX09PQl9EQVRBKiBwX29vYiA9ICh0U01QX1NDX09PQl9EQVRBKilwX2RhdGE7Ci0gIGlmICghcF9vb2IpIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzIHJlY2VpdmVkIG5vIGRhdGEiLCBfX2Z1bmNfXyk7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9PT0JfRkFJTDsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNNUF9UUkFDRV9FVkVOVCgKLSAgICAgICIlcyByZXFfb29iX3R5cGU6ICVkLCBsb2Nfb29iX2RhdGEucHJlc2VudDogJWQsICIKLSAgICAgICJwZWVyX29vYl9kYXRhLnByZXNlbnQ6ICVkIiwKLSAgICAgIF9fZnVuY19fLCBwX2NiLT5yZXFfb29iX3R5cGUsIHBfb29iLT5sb2Nfb29iX2RhdGEucHJlc2VudCwKLSAgICAgIHBfb29iLT5wZWVyX29vYl9kYXRhLnByZXNlbnQpOwotCi0gIGlmIChwX2NiLT5zdGF0ZSAhPSBTTVBfU1RBVEVfV0FJVF9BUFBfUlNQIHx8Ci0gICAgICBwX2NiLT5jYl9ldnQgIT0gU01QX1NDX09PQl9SRVFfRVZUKQotICAgIHJldHVybjsKLQotICBib29sIGRhdGFfbWlzc2luZyA9IGZhbHNlOwotICBzd2l0Y2ggKHBfY2ItPnJlcV9vb2JfdHlwZSkgewotICAgIGNhc2UgU01QX09PQl9QRUVSOgotICAgICAgaWYgKCFwX29vYi0+cGVlcl9vb2JfZGF0YS5wcmVzZW50KSBkYXRhX21pc3NpbmcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTTVBfT09CX0xPQ0FMOgotICAgICAgaWYgKCFwX29vYi0+bG9jX29vYl9kYXRhLnByZXNlbnQpIGRhdGFfbWlzc2luZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNNUF9PT0JfQk9USDoKLSAgICAgIC8vIENoZWNrIGZvciBwcmV2aW91cyBsb2NhbCBPT0IgZGF0YSBpbiBjYWNoZQotICAgICAgLy8gVGhpcyB3b3VsZCBiZSBpbiB0aGUgY2FzZSBkYXRhIHdhcyBnZW5lcmF0ZWQgQkVGT1JFIHBhaXJpbmcgd2FzCi0gICAgICAvLyBhdHRlbXB0ZWQgYW5kIHRoaXMgaW5zdGFuY2UgaXMgdGhlIGNvbm5lY3RvciBvciBwYWlyaW5nIGluaXRpYXRvci4KLSAgICAgIC8vIFtOT1RJQ0VdOiBPdmVycmlkZGluZyBkYXRhIHByZXNlbnQgaGVyZSBpZiB0aGUgZGF0YSBleGlzdHMgc28gc3RhdGUKLSAgICAgIC8vIG1hY2hpbmUgYXNrcyBmb3IgaXQgbGF0ZXIKLSAgICAgIHBfb29iLT5sb2Nfb29iX2RhdGEucHJlc2VudCA9IHNtcF9oYXNfbG9jYWxfb29iX2RhdGEoKTsKLSAgICAgIGlmICghcF9vb2ItPmxvY19vb2JfZGF0YS5wcmVzZW50IHx8ICFwX29vYi0+cGVlcl9vb2JfZGF0YS5wcmVzZW50KQotICAgICAgICBkYXRhX21pc3NpbmcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNNUF9UUkFDRV9FVkVOVCgiVW5leHBlY3RlZCBPT0IgZGF0YSB0eXBlIHJlcXVlc3RlZC4gRmFpbCBPT0IiKTsKLSAgICAgIGRhdGFfbWlzc2luZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICBpZiAoZGF0YV9taXNzaW5nKSB7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9PT0JfRkFJTDsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBfY2ItPnNjX29vYl9kYXRhID0gKnBfb29iOwotCi0gIHNtcF9pbnRfZGF0YS5wX2RhdGEgPSBwX2RhdGE7Ci0gIHNtcF9zbV9ldmVudCgmc21wX2NiLCBTTVBfU0NfT09CX0RBVEFfRVZULCAmc21wX2ludF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIFNNUF9DckxvY1NjT29iRGF0YQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgYSBwdWJsaWMga2V5IHRvIGJlCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBhIHJlbW90ZSBkZXZpY2UgdmlhIE91dCBvZiBCYW5kIHRyYW5zcG9ydC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTTVBfQ3JMb2NTY09vYkRhdGEoKSB7Ci0gIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICBzbXBfc21fZXZlbnQoJnNtcF9jYiwgU01QX0NSX0xPQ19TQ19PT0JfREFUQV9FVlQsICZzbXBfaW50X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgU01QX0NsZWFyTG9jU2NPb2JEYXRhCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjbGVhciBvdXQgdGhlIE9PQiBzdG9yZWQgbG9jYWxseS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTTVBfQ2xlYXJMb2NTY09vYkRhdGEoKSB7IHNtcF9jbGVhcl9sb2NhbF9vb2JfZGF0YSgpOyB9CmRpZmYgLS1naXQgYS9zdGFjay9zbXAvc21wX2JyX21haW4uY2MgYi9zdGFjay9zbXAvc21wX2JyX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTFkOWQuLjAwMDAwMDAKLS0tIGEvc3RhY2svc21wL3NtcF9icl9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTQtMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic21wX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0KLWNvbnN0IGNoYXIqIGNvbnN0IHNtcF9icl9zdGF0ZV9uYW1lW1NNUF9CUl9TVEFURV9NQVggKyAxXSA9IHsKLSAgICAiU01QX0JSX1NUQVRFX0lETEUiLCAiU01QX0JSX1NUQVRFX1dBSVRfQVBQX1JTUCIsCi0gICAgIlNNUF9CUl9TVEFURV9QQUlSX1JFUV9SU1AiLCAiU01QX0JSX1NUQVRFX0JPTkRfUEVORElORyIsCi0gICAgIlNNUF9CUl9TVEFURV9PVVRfT0ZfUkFOR0UifTsKLQotY29uc3QgY2hhciogY29uc3Qgc21wX2JyX2V2ZW50X25hbWVbU01QX0JSX01BWF9FVlRdID0gewotICAgICJCUl9QQUlSSU5HX1JFUV9FVlQiLCAgICAgIkJSX1BBSVJJTkdfUlNQX0VWVCIsCi0gICAgIkJSX0NPTkZJUk1fRVZUIiwgICAgICAgICAiQlJfUkFORF9FVlQiLAotICAgICJCUl9QQUlSSU5HX0ZBSUxFRF9FVlQiLCAgIkJSX0VOQ1JQVElPTl9JTkZPX0VWVCIsCi0gICAgIkJSX0NFTlRSQUxfSURfRVZUIiwgICAgICAiQlJfSURfSU5GT19FVlQiLAotICAgICJCUl9JRF9BRERSX0VWVCIsICAgICAgICAgIkJSX1NJR05fSU5GT19FVlQiLAotICAgICJCUl9TRUNVUklUWV9SRVFfRVZUIiwgICAgIkJSX1BBSVJfUFVCTElDX0tFWV9FVlQiLAotICAgICJCUl9QQUlSX0RIS0VZX0NIQ0tfRVZUIiwgIkJSX1BBSVJfS0VZUFJfTk9USUZfRVZUIiwKLSAgICAiQlJfS0VZX1JFQURZX0VWVCIsICAgICAgICJCUl9FTkNSWVBURURfRVZUIiwKLSAgICAiQlJfTDJDQVBfQ09OTl9FVlQiLCAgICAgICJCUl9MMkNBUF9ESVNDT05OX0VWVCIsCi0gICAgIkJSX0tFWVNfUlNQX0VWVCIsICAgICAgICAiQlJfQVBJX1NFQ19HUkFOVF9FVlQiLAotICAgICJCUl9US19SRVFfRVZUIiwgICAgICAgICAgIkJSX0FVVEhfQ01QTF9FVlQiLAotICAgICJCUl9FTkNfUkVRX0VWVCIsICAgICAgICAgIkJSX0JPTkRfUkVRX0VWVCIsCi0gICAgIkJSX0RJU0NBUkRfU0VDX1JFUV9FVlQiLCAiQlJfT1VUX09GX1JBTkdFX0VWVCJ9OwotCi1jb25zdCBjaGFyKiBzbXBfZ2V0X2JyX2V2ZW50X25hbWUodFNNUF9CUl9FVkVOVCBldmVudCk7Ci1jb25zdCBjaGFyKiBzbXBfZ2V0X2JyX3N0YXRlX25hbWUodFNNUF9CUl9TVEFURSBzdGF0ZSk7Ci0KLSNkZWZpbmUgU01QX0JSX1NNX0lHTk9SRSAwCi0jZGVmaW5lIFNNUF9CUl9OVU1fQUNUSU9OUyAyCi0jZGVmaW5lIFNNUF9CUl9TTUVfTkVYVF9TVEFURSAyCi0jZGVmaW5lIFNNUF9CUl9TTV9OVU1fQ09MUyAzCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0U01QX0JSX1NNX1RCTClbU01QX0JSX1NNX05VTV9DT0xTXTsKLQotZW51bSB7Ci0gIFNNUF9TRU5EX1BBSVJfUkVRLAotICBTTVBfQlJfU0VORF9QQUlSX1JTUCwKLSAgU01QX1NFTkRfUEFJUl9GQUlMLAotICBTTVBfU0VORF9JRF9JTkZPLAotICBTTVBfQlJfUFJPQ19QQUlSX0NNRCwKLSAgU01QX1BST0NfUEFJUl9GQUlMLAotICBTTVBfUFJPQ19JRF9JTkZPLAotICBTTVBfUFJPQ19JRF9BRERSLAotICBTTVBfUFJPQ19TUktfSU5GTywKLSAgU01QX0JSX1BST0NfU0VDX0dSQU5ULAotICBTTVBfQlJfUFJPQ19TTF9LRVlTX1JTUCwKLSAgU01QX0JSX0tFWV9ESVNUUklCVVRJT04sCi0gIFNNUF9CUl9QQUlSSU5HX0NPTVBMRVRFLAotICBTTVBfU0VORF9BUFBfQ0JBQ0ssCi0gIFNNUF9CUl9DSEVDS19BVVRIX1JFUSwKLSAgU01QX1BBSVJfVEVSTUlOQVRFLAotICBTTVBfSURMRV9URVJNSU5BVEUsCi0gIFNNUF9CUl9TTV9OT19BQ1RJT04KLX07Ci0KLXN0YXRpYyBjb25zdCB0U01QX0FDVCBzbXBfYnJfc21fYWN0aW9uW10gPSB7Ci0gICAgc21wX3NlbmRfcGFpcl9yZXEsICAgICAgICAgICAgICAgICAgICAgICAvKiBTTVBfU0VORF9QQUlSX1JFUSAqLwotICAgIHNtcF9icl9zZW5kX3BhaXJfcmVzcG9uc2UsICAgICAgICAgICAgICAgLyogU01QX0JSX1NFTkRfUEFJUl9SU1AgKi8KLSAgICBzbXBfc2VuZF9wYWlyX2ZhaWwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNNUF9TRU5EX1BBSVJfRkFJTCAqLwotICAgIHNtcF9zZW5kX2lkX2luZm8sICAgICAgICAgICAgICAgICAgICAgICAgLyogU01QX1NFTkRfSURfSU5GTyAqLwotICAgIHNtcF9icl9wcm9jZXNzX3BhaXJpbmdfY29tbWFuZCwgICAgICAgICAgLyogU01QX0JSX1BST0NfUEFJUl9DTUQgKi8KLSAgICBzbXBfcHJvY19wYWlyX2ZhaWwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNNUF9QUk9DX1BBSVJfRkFJTCAqLwotICAgIHNtcF9wcm9jX2lkX2luZm8sICAgICAgICAgICAgICAgICAgICAgICAgLyogU01QX1BST0NfSURfSU5GTyAqLwotICAgIHNtcF9wcm9jX2lkX2FkZHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogU01QX1BST0NfSURfQUREUiAqLwotICAgIHNtcF9wcm9jX3Nya19pbmZvLCAgICAgICAgICAgICAgICAgICAgICAgLyogU01QX1BST0NfU1JLX0lORk8gKi8KLSAgICBzbXBfYnJfcHJvY2Vzc19zZWN1cml0eV9ncmFudCwgICAgICAgICAgIC8qIFNNUF9CUl9QUk9DX1NFQ19HUkFOVCAqLwotICAgIHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZSwgLyogU01QX0JSX1BST0NfU0xfS0VZU19SU1AgKi8KLSAgICBzbXBfYnJfc2VsZWN0X25leHRfa2V5LCAgICAgICAgICAgICAgICAgIC8qIFNNUF9CUl9LRVlfRElTVFJJQlVUSU9OICovCi0gICAgc21wX2JyX3BhaXJpbmdfY29tcGxldGUsICAgICAgICAgICAgICAgICAvKiBTTVBfQlJfUEFJUklOR19DT01QTEVURSAqLwotICAgIHNtcF9zZW5kX2FwcF9jYmFjaywgICAgICAgICAgICAgICAgICAgICAgLyogU01QX1NFTkRfQVBQX0NCQUNLICovCi0gICAgc21wX2JyX2NoZWNrX2F1dGhvcml6YXRpb25fcmVxdWVzdCwgICAgICAvKiBTTVBfQlJfQ0hFQ0tfQVVUSF9SRVEgKi8KLSAgICBzbXBfcGFpcl90ZXJtaW5hdGUsICAgICAgICAgICAgICAgICAgICAgIC8qIFNNUF9QQUlSX1RFUk1JTkFURSAqLwotICAgIHNtcF9pZGxlX3Rlcm1pbmF0ZSAgICAgICAgICAgICAgICAgICAgICAgLyogU01QX0lETEVfVEVSTUlOQVRFICovCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfYnJfYWxsX3RhYmxlW11bU01QX0JSX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBCUl9QQUlSSU5HX0ZBSUxFRCAqLwotICAgIHtTTVBfUFJPQ19QQUlSX0ZBSUwsIFNNUF9CUl9QQUlSSU5HX0NPTVBMRVRFLCBTTVBfQlJfU1RBVEVfSURMRX0sCi0gICAgLyogQlJfQVVUSF9DTVBMICovCi0gICAge1NNUF9TRU5EX1BBSVJfRkFJTCwgU01QX0JSX1BBSVJJTkdfQ09NUExFVEUsIFNNUF9CUl9TVEFURV9JRExFfSwKLSAgICAvKiBCUl9MMkNBUF9ESVNDT05OICovCi0gICAge1NNUF9QQUlSX1RFUk1JTkFURSwgU01QX0JSX1NNX05PX0FDVElPTiwgU01QX0JSX1NUQVRFX0lETEV9fTsKLQotLyoqKioqKioqKioqKiBTTVAgQ2VudHJhbCBGU00gU3RhdGUvRXZlbnQgSW5kaXJlY3Rpb24gVGFibGUgKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfYnJfY2VudHJhbF9lbnRyeV9tYXBbXVtTTVBfQlJfU1RBVEVfTUFYXSA9IHsKLSAgICAvKiBicl9zdGF0ZSBuYW1lOiAgICAgICAgICAgICAgIElkbGUgICAgICBXYWl0QXBwICBQYWlyICAgIEJvbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc3AgICAgICBSZXFSc3AgIFBlbmQgICAgICAgKi8KLSAgICAvKiBCUl9QQUlSSU5HX1JFUSAgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX1BBSVJJTkdfUlNQICAgICAgICAgICAqLyB7MCwgMCwgMSwgMH0sCi0gICAgLyogQlJfQ09ORklSTSAgICAgICAgICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9SQU5EICAgICAgICAgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX1BBSVJJTkdfRkFJTEVEICAgICAgICAqLyB7MCwgMHg4MSwgMHg4MSwgMH0sCi0gICAgLyogQlJfRU5DUlBUSU9OX0lORk8gICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9DRU5UUkFMX0lEICAgICAgICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9JRF9JTkZPICAgICAgICAgICAgICAgKi8gezAsIDAsIDAsIDF9LAotICAgIC8qIEJSX0lEX0FERFIgICAgICAgICAgICAgICAqLyB7MCwgMCwgMCwgMn0sCi0gICAgLyogQlJfU0lHTl9JTkZPICAgICAgICAgICAgICovIHswLCAwLCAwLCAzfSwKLSAgICAvKiBCUl9TRUNVUklUWV9SRVEgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX1BBSVJfUFVCTElDX0tFWV9FVlQgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfUEFJUl9ESEtFWV9DSENLX0VWVCAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9QQUlSX0tFWVBSX05PVElGX0VWVCAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX0tFWV9SRUFEWSAgICAgICAgICAgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfRU5DUllQVEVEICAgICAgICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9MMkNBUF9DT05OICAgICAgICAgICAgKi8gezEsIDAsIDAsIDB9LAotICAgIC8qIEJSX0wyQ0FQX0RJU0NPTk4gICAgICAgICAqLyB7MiwgMHg4MywgMHg4MywgMHg4M30sCi0gICAgLyogQlJfS0VZU19SU1AgICAgICAgICAgICAgICovIHswLCAxLCAwLCAwfSwKLSAgICAvKiBCUl9BUElfU0VDX0dSQU5UICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX1RLX1JFUSAgICAgICAgICAgICAgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfQVVUSF9DTVBMICAgICAgICAgICAgICovIHswLCAweDgyLCAweDgyLCAweDgyfSwKLSAgICAvKiBCUl9FTkNfUkVRICAgICAgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX0JPTkRfUkVRICAgICAgICAgICAgICAqLyB7MCwgMCwgMiwgMH0sCi0gICAgLyogQlJfRElTQ0FSRF9TRUNfUkVRICAgICAgICovIHswLCAwLCAwLCAwfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9icl9jZW50cmFsX2lkbGVfdGFibGVbXVtTTVBfQlJfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgIC8qIEJSX0wyQ0FQX0NPTk4gKi8KLSAgICB7U01QX1NFTkRfQVBQX0NCQUNLLCBTTVBfQlJfU01fTk9fQUNUSU9OLCBTTVBfQlJfU1RBVEVfV0FJVF9BUFBfUlNQfSwKLSAgICAvKiBCUl9MMkNBUF9ESVNDT05OICovCi0gICAge1NNUF9JRExFX1RFUk1JTkFURSwgU01QX0JSX1NNX05PX0FDVElPTiwgU01QX0JSX1NUQVRFX0lETEV9fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QKLSAgICBzbXBfYnJfY2VudHJhbF93YWl0X2FwcGxuX3Jlc3BvbnNlX3RhYmxlW11bU01QX0JSX1NNX05VTV9DT0xTXSA9IHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAgICAgLyogQlJfS0VZU19SU1AgKi8KLSAgICAgICAge1NNUF9TRU5EX1BBSVJfUkVRLCBTTVBfQlJfU01fTk9fQUNUSU9OLCBTTVBfQlJfU1RBVEVfUEFJUl9SRVFfUlNQfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90Ci0gICAgc21wX2JyX2NlbnRyYWxfcGFpcl9yZXF1ZXN0X3Jlc3BvbnNlX3RhYmxlW11bU01QX0JSX1NNX05VTV9DT0xTXSA9IHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgICAgIC8qIEJSX1BBSVJJTkdfUlNQICovCi0gICAgICAgIHtTTVBfQlJfUFJPQ19QQUlSX0NNRCwgU01QX0JSX0NIRUNLX0FVVEhfUkVRLAotICAgICAgICAgU01QX0JSX1NUQVRFX1BBSVJfUkVRX1JTUH0sCi0gICAgICAgIC8qIEJSX0JPTkRfUkVRICovCi0gICAgICAgIHtTTVBfQlJfU01fTk9fQUNUSU9OLCBTTVBfQlJfU01fTk9fQUNUSU9OLCBTTVBfQlJfU1RBVEVfQk9ORF9QRU5ESU5HfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9icl9jZW50cmFsX2JvbmRfcGVuZGluZ190YWJsZVtdW1NNUF9CUl9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogQlJfSURfSU5GTyAqLwotICAgIHtTTVBfUFJPQ19JRF9JTkZPLCBTTVBfQlJfU01fTk9fQUNUSU9OLCBTTVBfQlJfU1RBVEVfQk9ORF9QRU5ESU5HfSwKLSAgICAvKiBCUl9JRF9BRERSICovCi0gICAge1NNUF9QUk9DX0lEX0FERFIsIFNNUF9CUl9TTV9OT19BQ1RJT04sIFNNUF9CUl9TVEFURV9CT05EX1BFTkRJTkd9LAotICAgIC8qIEJSX1NJR05fSU5GTyAqLwotICAgIHtTTVBfUFJPQ19TUktfSU5GTywgU01QX0JSX1NNX05PX0FDVElPTiwgU01QX0JSX1NUQVRFX0JPTkRfUEVORElOR319OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfYnJfcGVyaXBoZXJhbF9lbnRyeV9tYXBbXVtTTVBfQlJfU1RBVEVfTUFYXSA9IHsKLSAgICAvKiBicl9zdGF0ZSBuYW1lOiAgICAgICAgICAgICAgIElkbGUgICAgICBXYWl0QXBwICBQYWlyICAgIEJvbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc3AgICAgICBSZXFSc3AgIFBlbmQgICAgICAqLwotICAgIC8qIEJSX1BBSVJJTkdfUkVRICAgICAgICAgICAqLyB7MSwgMCwgMCwgMH0sCi0gICAgLyogQlJfUEFJUklOR19SU1AgICAgICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9DT05GSVJNICAgICAgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX1JBTkQgICAgICAgICAgICAgICAgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfUEFJUklOR19GQUlMRUQgICAgICAgICovIHswLCAweDgxLCAweDgxLCAweDgxfSwKLSAgICAvKiBCUl9FTkNSUFRJT05fSU5GTyAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX0NFTlRSQUxfSUQgICAgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX0lEX0lORk8gICAgICAgICAgICAgICAqLyB7MCwgMCwgMCwgMX0sCi0gICAgLyogQlJfSURfQUREUiAgICAgICAgICAgICAgICovIHswLCAwLCAwLCAyfSwKLSAgICAvKiBCUl9TSUdOX0lORk8gICAgICAgICAgICAgKi8gezAsIDAsIDAsIDN9LAotICAgIC8qIEJSX1NFQ1VSSVRZX1JFUSAgICAgICAgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfUEFJUl9QVUJMSUNfS0VZX0VWVCAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9QQUlSX0RIS0VZX0NIQ0tfRVZUICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX1BBSVJfS0VZUFJfTk9USUZfRVZUICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfS0VZX1JFQURZICAgICAgICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9FTkNSWVBURUQgICAgICAgICAgICAgKi8gezAsIDAsIDAsIDB9LAotICAgIC8qIEJSX0wyQ0FQX0NPTk4gICAgICAgICAgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfTDJDQVBfRElTQ09OTiAgICAgICAgICovIHswLCAweDgzLCAweDgzLCAweDgzfSwKLSAgICAvKiBCUl9LRVlTX1JTUCAgICAgICAgICAgICAgKi8gezAsIDIsIDAsIDB9LAotICAgIC8qIEJSX0FQSV9TRUNfR1JBTlQgICAgICAgICAqLyB7MCwgMSwgMCwgMH0sCi0gICAgLyogQlJfVEtfUkVRICAgICAgICAgICAgICAgICovIHswLCAwLCAwLCAwfSwKLSAgICAvKiBCUl9BVVRIX0NNUEwgICAgICAgICAgICAgKi8gezAsIDB4ODIsIDB4ODIsIDB4ODJ9LAotICAgIC8qIEJSX0VOQ19SRVEgICAgICAgICAgICAgICAqLyB7MCwgMCwgMCwgMH0sCi0gICAgLyogQlJfQk9ORF9SRVEgICAgICAgICAgICAgICovIHswLCAzLCAwLCAwfSwKLSAgICAvKiBCUl9ESVNDQVJEX1NFQ19SRVEgICAgICAgKi8gezAsIDAsIDAsIDB9fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX2JyX3BlcmlwaGVyYWxfaWRsZV90YWJsZVtdW1NNUF9CUl9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogQlJfUEFJUklOR19SRVEgKi8KLSAgICB7U01QX0JSX1BST0NfUEFJUl9DTUQsIFNNUF9TRU5EX0FQUF9DQkFDSywgU01QX0JSX1NUQVRFX1dBSVRfQVBQX1JTUH19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdAotICAgIHNtcF9icl9wZXJpcGhlcmFsX3dhaXRfYXBwbG5fcmVzcG9uc2VfdGFibGVbXVtTTVBfQlJfU01fTlVNX0NPTFNdID0gewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAgICAgLyogQlJfQVBJX1NFQ19HUkFOVCAqLwotICAgICAgICB7U01QX0JSX1BST0NfU0VDX0dSQU5ULCBTTVBfU0VORF9BUFBfQ0JBQ0ssIFNNUF9CUl9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiBCUl9LRVlTX1JTUCAqLwotICAgICAgICB7U01QX0JSX1BST0NfU0xfS0VZU19SU1AsIFNNUF9CUl9DSEVDS19BVVRIX1JFUSwKLSAgICAgICAgIFNNUF9CUl9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiBCUl9CT05EX1JFUSAqLwotICAgICAgICB7U01QX0JSX0tFWV9ESVNUUklCVVRJT04sIFNNUF9CUl9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfQlJfU1RBVEVfQk9ORF9QRU5ESU5HfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90Ci0gICAgc21wX2JyX3BlcmlwaGVyYWxfYm9uZF9wZW5kaW5nX3RhYmxlW11bU01QX0JSX1NNX05VTV9DT0xTXSA9IHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgICAgIC8qIEJSX0lEX0lORk8gKi8KLSAgICAgICAge1NNUF9QUk9DX0lEX0lORk8sIFNNUF9CUl9TTV9OT19BQ1RJT04sIFNNUF9CUl9TVEFURV9CT05EX1BFTkRJTkd9LAotICAgICAgICAvKiBCUl9JRF9BRERSICovCi0gICAgICAgIHtTTVBfUFJPQ19JRF9BRERSLCBTTVBfQlJfU01fTk9fQUNUSU9OLCBTTVBfQlJfU1RBVEVfQk9ORF9QRU5ESU5HfSwKLSAgICAgICAgLyogQlJfU0lHTl9JTkZPICovCi0gICAgICAgIHtTTVBfUFJPQ19TUktfSU5GTywgU01QX0JSX1NNX05PX0FDVElPTiwgU01QX0JSX1NUQVRFX0JPTkRfUEVORElOR319OwotCi1zdGF0aWMgY29uc3QgdFNNUF9CUl9TTV9UQkwgc21wX2JyX3N0YXRlX3RhYmxlW11bMl0gPSB7Ci0gICAgLyogU01QX0JSX1NUQVRFX0lETEUgKi8KLSAgICB7c21wX2JyX2NlbnRyYWxfaWRsZV90YWJsZSwgc21wX2JyX3BlcmlwaGVyYWxfaWRsZV90YWJsZX0sCi0KLSAgICAvKiBTTVBfQlJfU1RBVEVfV0FJVF9BUFBfUlNQICovCi0gICAge3NtcF9icl9jZW50cmFsX3dhaXRfYXBwbG5fcmVzcG9uc2VfdGFibGUsCi0gICAgIHNtcF9icl9wZXJpcGhlcmFsX3dhaXRfYXBwbG5fcmVzcG9uc2VfdGFibGV9LAotCi0gICAgLyogU01QX0JSX1NUQVRFX1BBSVJfUkVRX1JTUCAqLwotICAgIHtzbXBfYnJfY2VudHJhbF9wYWlyX3JlcXVlc3RfcmVzcG9uc2VfdGFibGUsIE5VTEx9LAotCi0gICAgLyogU01QX0JSX1NUQVRFX0JPTkRfUEVORElORyAqLwotICAgIHtzbXBfYnJfY2VudHJhbF9ib25kX3BlbmRpbmdfdGFibGUsIHNtcF9icl9wZXJpcGhlcmFsX2JvbmRfcGVuZGluZ190YWJsZX0sCi19OwotCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0U01QX0JSX0VOVFJZX1RCTClbU01QX0JSX1NUQVRFX01BWF07Ci0KLXN0YXRpYyBjb25zdCB0U01QX0JSX0VOVFJZX1RCTCBzbXBfYnJfZW50cnlfdGFibGVbXSA9IHsKLSAgICBzbXBfYnJfY2VudHJhbF9lbnRyeV9tYXAsIHNtcF9icl9wZXJpcGhlcmFsX2VudHJ5X21hcH07Ci0KLSNkZWZpbmUgU01QX0JSX0FMTF9UQUJMRV9NQVNLIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfc2V0X2JyX3N0YXRlCi0gKiBSZXR1cm5zICAgICAgTm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NldF9icl9zdGF0ZSh0U01QX0JSX1NUQVRFIGJyX3N0YXRlKSB7Ci0gIGlmIChicl9zdGF0ZSA8IFNNUF9CUl9TVEFURV9NQVgpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIkJSX1N0YXRlIGNoYW5nZTogJXMoJWQpID09PiAlcyglZCkiLAotICAgICAgICAgICAgICAgICAgICBzbXBfZ2V0X2JyX3N0YXRlX25hbWUoc21wX2NiLmJyX3N0YXRlKSwgc21wX2NiLmJyX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICBzbXBfZ2V0X2JyX3N0YXRlX25hbWUoYnJfc3RhdGUpLCBicl9zdGF0ZSk7Ci0gICAgc21wX2NiLmJyX3N0YXRlID0gYnJfc3RhdGU7Ci0gIH0gZWxzZSB7Ci0gICAgU01QX1RSQUNFX0RFQlVHKCIlcyBpbnZhbGlkIGJyX3N0YXRlID0lZCIsIF9fZnVuY19fLCBicl9zdGF0ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfZ2V0X2JyX3N0YXRlCi0gKiBSZXR1cm5zICAgICAgVGhlIHNtcF9iciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTTVBfQlJfU1RBVEUgc21wX2dldF9icl9zdGF0ZSh2b2lkKSB7IHJldHVybiBzbXBfY2IuYnJfc3RhdGU7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfZ2V0X2JyX3N0YXRlX25hbWUKLSAqIFJldHVybnMgICAgICBUaGUgc21wX2JyIHN0YXRlIG5hbWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciogc21wX2dldF9icl9zdGF0ZV9uYW1lKHRTTVBfQlJfU1RBVEUgYnJfc3RhdGUpIHsKLSAgY29uc3QgY2hhciogcF9zdHIgPSBzbXBfYnJfc3RhdGVfbmFtZVtTTVBfQlJfU1RBVEVfTUFYXTsKLQotICBpZiAoYnJfc3RhdGUgPCBTTVBfQlJfU1RBVEVfTUFYKSBwX3N0ciA9IHNtcF9icl9zdGF0ZV9uYW1lW2JyX3N0YXRlXTsKLQotICByZXR1cm4gcF9zdHI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9nZXRfYnJfZXZlbnRfbmFtZQotICogUmV0dXJucyAgICAgIFRoZSBzbXBfYnIgZXZlbnQgbmFtZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyKiBzbXBfZ2V0X2JyX2V2ZW50X25hbWUodFNNUF9CUl9FVkVOVCBldmVudCkgewotICBjb25zdCBjaGFyKiBwX3N0ciA9IHNtcF9icl9ldmVudF9uYW1lW1NNUF9CUl9NQVhfRVZUIC0gMV07Ci0KLSAgaWYgKGV2ZW50IDwgU01QX0JSX01BWF9FVlQpIHsKLSAgICBwX3N0ciA9IHNtcF9icl9ldmVudF9uYW1lW2V2ZW50IC0gMV07Ci0gIH0KLSAgcmV0dXJuIHBfc3RyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudAotICoKLSAqIERlc2NyaXB0aW9uICBIYW5kbGUgZXZlbnRzIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLiBJdCBsb29rcyB1cCB0aGUgZW50cnkKLSAqICAgICAgICAgICAgICBpbiB0aGUgc21wX2JyX2VudHJ5X3RhYmxlIGFycmF5LgotICogICAgICAgICAgICAgIElmIGl0IGlzIGEgdmFsaWQgZW50cnksIGl0IGdldHMgdGhlIHN0YXRlIHRhYmxlLiBTZXQgdGhlIG5leHQKLSAqICAgICAgICAgICAgICBzdGF0ZSwgaWYgbm90IE5VTEwgc3RhdGUuIEV4ZWN1dGUgdGhlIGFjdGlvbiBmdW5jdGlvbiBhY2NvcmRpbmcKLSAqICAgICAgICAgICAgICB0byB0aGUgc3RhdGUgdGFibGUuIElmIHRoZSBzdGF0ZSByZXR1cm5lZCBieSBhY3Rpb24gZnVuY3Rpb24gaXMKLSAqICAgICAgICAgICAgICBub3QgTlVMTCBzdGF0ZSwgYWRqdXN0IHRoZSBuZXcgc3RhdGUgdG8gdGhlIHJldHVybmVkIHN0YXRlLgotICoKLSAqIFJldHVybnMgICAgICB2b2lkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9icl9zdGF0ZV9tYWNoaW5lX2V2ZW50KHRTTVBfQ0IqIHBfY2IsIHRTTVBfQlJfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICB0U01QX0JSX1NUQVRFIGN1cnJfc3RhdGUgPSBwX2NiLT5icl9zdGF0ZTsKLSAgdFNNUF9CUl9TTV9UQkwgc3RhdGVfdGFibGU7Ci0gIHVpbnQ4X3QgYWN0aW9uLCBlbnRyeTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIm1haW4gJXMiLCBfX2Z1bmNfXyk7Ci0gIGlmIChjdXJyX3N0YXRlID49IFNNUF9CUl9TVEFURV9NQVgpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIkludmFsaWQgYnJfc3RhdGU6ICVkIiwgY3Vycl9zdGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBfY2ItPnJvbGUgPiBIQ0lfUk9MRV9QRVJJUEhFUkFMKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKCIlczogaW52YWxpZCByb2xlICVkIiwgX19mdW5jX18sIHBfY2ItPnJvbGUpOwotICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiODAxNDU5NDYiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0U01QX0JSX0VOVFJZX1RCTCBlbnRyeV90YWJsZSA9IHNtcF9icl9lbnRyeV90YWJsZVtwX2NiLT5yb2xlXTsKLQotICBTTVBfVFJBQ0VfREVCVUcoCi0gICAgICAiU01QIFJvbGU6ICVzIFN0YXRlOiBbJXMgKCVkKV0sIEV2ZW50OiBbJXMgKCVkKV0iLAotICAgICAgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkgPyAiUGVyaXBoZXJhbCIgOiAiQ2VudHJhbCIsCi0gICAgICBzbXBfZ2V0X2JyX3N0YXRlX25hbWUocF9jYi0+YnJfc3RhdGUpLCBwX2NiLT5icl9zdGF0ZSwKLSAgICAgIHNtcF9nZXRfYnJfZXZlbnRfbmFtZShldmVudCksIGV2ZW50KTsKLQotICAvKiBsb29rIHVwIHRoZSBzdGF0ZSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgLyogbG9va3VwIGVudHJ5IC8gdyBldmVudCAmIGN1cnJfc3RhdGUgKi8KLSAgLyogSWYgZW50cnkgaXMgaWdub3JlLCByZXR1cm4uCi0gICAqIE90aGVyd2lzZSwgZ2V0IHN0YXRlIHRhYmxlIChhY2NvcmRpbmcgdG8gY3Vycl9zdGF0ZSBvciBhbGxfc3RhdGUpICovCi0gIGlmICgoZXZlbnQgPD0gU01QX0JSX01BWF9FVlQpICYmCi0gICAgICAoKGVudHJ5ID0gZW50cnlfdGFibGVbZXZlbnQgLSAxXVtjdXJyX3N0YXRlXSkgIT0gU01QX0JSX1NNX0lHTk9SRSkpIHsKLSAgICBpZiAoZW50cnkgJiBTTVBfQlJfQUxMX1RBQkxFX01BU0spIHsKLSAgICAgIGVudHJ5ICY9IH5TTVBfQlJfQUxMX1RBQkxFX01BU0s7Ci0gICAgICBzdGF0ZV90YWJsZSA9IHNtcF9icl9hbGxfdGFibGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXRlX3RhYmxlID0gc21wX2JyX3N0YXRlX3RhYmxlW2N1cnJfc3RhdGVdW3BfY2ItPnJvbGVdOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIklnbm9yZSBldmVudCBbJXMgKCVkKV0gaW4gc3RhdGUgWyVzICglZCldIiwKLSAgICAgICAgICAgICAgICAgICAgc21wX2dldF9icl9ldmVudF9uYW1lKGV2ZW50KSwgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIHNtcF9nZXRfYnJfc3RhdGVfbmFtZShjdXJyX3N0YXRlKSwgY3Vycl9zdGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogR2V0IHBvc3NpYmxlIG5leHQgc3RhdGUgZnJvbSBzdGF0ZSB0YWJsZS4gKi8KLQotICBzbXBfc2V0X2JyX3N0YXRlKHN0YXRlX3RhYmxlW2VudHJ5IC0gMV1bU01QX0JSX1NNRV9ORVhUX1NUQVRFXSk7Ci0KLSAgLyogSWYgYWN0aW9uIGlzIG5vdCBpZ25vcmUsIGNsZWFyIHBhcmFtLCBleGVjIGFjdGlvbiBhbmQgZ2V0IG5leHQgc3RhdGUuCi0gICAqIFRoZSBhY3Rpb24gZnVuY3Rpb24gbWF5IHNldCB0aGUgUGFyYW0gZm9yIGNiYWNrLgotICAgKiBEZXBlbmRpbmcgb24gcGFyYW0sIGNhbGwgY2JhY2sgb3IgZnJlZSBidWZmZXIuICovCi0gIC8qIGV4ZWN1dGUgYWN0aW9uIGZ1bmN0aW9ucyAqLwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBTTVBfQlJfTlVNX0FDVElPTlM7IGkrKykgewotICAgIGFjdGlvbiA9IHN0YXRlX3RhYmxlW2VudHJ5IC0gMV1baV07Ci0gICAgaWYgKGFjdGlvbiAhPSBTTVBfQlJfU01fTk9fQUNUSU9OKSB7Ci0gICAgICAoKnNtcF9icl9zbV9hY3Rpb25bYWN0aW9uXSkocF9jYiwgcF9kYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFNNUF9UUkFDRV9ERUJVRygicmVzdWx0IHN0YXRlID0gJXMiLCBzbXBfZ2V0X2JyX3N0YXRlX25hbWUocF9jYi0+YnJfc3RhdGUpKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3NtcC9zbXBfaW50LmggYi9zdGFjay9zbXAvc21wX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Q1MmY5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3NtcC9zbXBfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgaW50ZXJuYWxseSB1c2VkIFNNUCBkZWZpbml0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIFNNUF9JTlRfSAotI2RlZmluZSBTTVBfSU5UX0gKLQotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgInNtcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgLyogTGVnYWN5IG1vZGUgKi8KLSAgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSA9IDAsIC8qIEp1c3QgV29ya3MgbW9kZWwgKi8KLSAgU01QX01PREVMX1BBU1NLRVkgPSAxLCAgICAgICAgIC8qIFBhc3NrZXkgRW50cnkgbW9kZWwsIGlucHV0IHRoZSBrZXkgKi8KLSAgU01QX01PREVMX09PQiA9IDIsICAgICAgICAgICAgIC8qIE9PQiBtb2RlbCAqLwotICBTTVBfTU9ERUxfS0VZX05PVElGID0gMywgICAgICAgLyogUGFzc2tleSBFbnRyeSBtb2RlbCwgZGlzcGxheSB0aGUga2V5ICovCi0gIC8qIFNlY3VyZSBjb25uZWN0aW9ucyBtb2RlICovCi0gIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MgPSA0LCAgIC8qIEp1c3QgV29ya3MgbW9kZWwgKi8KLSAgU01QX01PREVMX1NFQ19DT05OX05VTV9DT01QID0gNSwgICAgLyogTnVtZXJpYyBDb21wYXJpc29uIG1vZGVsICovCi0gIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0VOVCA9IDYsIC8qIFBhc3NrZXkgRW50cnkgbW9kZWwsICovCi0gIC8qIHRoaXMgc2lkZSBpbnB1dHMgdGhlIGtleSAqLwotICBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9ESVNQID0gNywgLyogUGFzc2tleSBFbnRyeSBtb2RlbCwgKi8KLSAgLyogdGhpcyBzaWRlIGRpc3BsYXlzIHRoZSBrZXkgKi8KLSAgU01QX01PREVMX1NFQ19DT05OX09PQiA9IDgsIC8qIFNlY3VyZSBDb25uZWN0aW9ucyBtb2RlLCBPT0IgbW9kZWwgKi8KLSAgU01QX01PREVMX09VVF9PRl9SQU5HRSA9IDksCi19IHRTTVBfQVNTT19NT0RFTDsKLQotI2lmbmRlZiBTTVBfTUFYX0NPTk4KLSNkZWZpbmUgU01QX01BWF9DT05OIDIKLSNlbmRpZgotCi0jZGVmaW5lIFNNUF9XQUlUX0ZPUl9SU1BfVElNRU9VVF9NUyAoMzAgKiAxMDAwKQotI2RlZmluZSBTTVBfREVMQVlFRF9BVVRIX1RJTUVPVVRfTVMgNTAwCi0KLSNkZWZpbmUgU01QX09QQ09ERV9JTklUIDB4MDQKLQotLyogU01QIGV2ZW50cyAqLwotdHlwZWRlZiBlbnVtIDogdWludDhfdCB7Ci0gIFNNUF9OT1BfRVZUID0gMCwKLSAgU01QX0NPTkZJUk1fRVZUID0gU01QX09QQ09ERV9DT05GSVJNLCAgLy8gMHgwMwotICBTTVBfUkFORF9FVlQgPSBTTVBfT1BDT0RFX1JBTkQsICAgICAgICAvLyAweDA0Ci0KLSAgU01QX1BBSVJfQ09NTUlUTV9FVlQgPSBTTVBfT1BDT0RFX1BBSVJfQ09NTUlUTSwgICAgIC8vIDB4MGYKLSAgU01QX1NFTEZfREVGX0VWVCA9IChTTVBfUEFJUl9DT01NSVRNX0VWVCArIDEpLCAgICAgIC8vIDB4MTAKLSAgU01QX0tFWV9SRUFEWV9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCksICAgICAgICAgICAgIC8vIDB4MDQKLSAgU01QX0VOQ1JZUFRFRF9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDEpLCAgICAgICAgIC8vIDB4MDUKLSAgU01QX0wyQ0FQX0NPTk5fRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyAyKSwgICAgICAgIC8vIDB4MDYKLSAgU01QX0wyQ0FQX0RJU0NPTk5fRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyAzKSwgICAgIC8vIDB4MDcKLSAgU01QX0lPX1JTUF9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDQpLCAgICAgICAgICAgIC8vIDB4MDgKLSAgU01QX0FQSV9TRUNfR1JBTlRfRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyA1KSwgICAgIC8vIDB4MDkKLSAgU01QX1RLX1JFUV9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDYpLCAgICAgICAgICAgIC8vIDB4MGEKLSAgU01QX0FVVEhfQ01QTF9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDcpLCAgICAgICAgIC8vIDB4MGIKLSAgU01QX0VOQ19SRVFfRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyA4KSwgICAgICAgICAgIC8vIDB4MGMKLSAgU01QX0JPTkRfUkVRX0VWVCA9IChTTVBfU0VMRl9ERUZfRVZUICsgOSksICAgICAgICAgIC8vIDB4MGQKLSAgU01QX0RJU0NBUkRfU0VDX1JFUV9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDEwKSwgIC8vIDB4MGUKLQotICBTTVBfQlJfUEFJUl9LRVlQUl9OT1RJRl9FVlQgPSBTTVBfT1BDT0RFX1BBSVJfS0VZUFJfTk9USUYsCi0gIC8qIG5vdCBvdmVyIEJSL0VEUiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDBlCi0gIFNNUF9CUl9TRUxGX0RFRl9FVlQgPSBTTVBfQlJfUEFJUl9LRVlQUl9OT1RJRl9FVlQsICAgICAgICAvLyAweDBlCi0gIFNNUF9CUl9LRVlfUkVBRFlfRVZUID0gKFNNUF9CUl9TRUxGX0RFRl9FVlQgKyAxKSwgICAgICAgICAvLyAweDBmCi0gIFNNUF9CUl9FTkNSWVBURURfRVZUID0gKFNNUF9CUl9TRUxGX0RFRl9FVlQgKyAyKSwgICAgICAgICAvLyAweDEwCi0gIFNNUF9CUl9MMkNBUF9DT05OX0VWVCA9IChTTVBfQlJfU0VMRl9ERUZfRVZUICsgMyksICAgICAgICAvLyAweDExCi0gIFNNUF9CUl9MMkNBUF9ESVNDT05OX0VWVCA9IChTTVBfQlJfU0VMRl9ERUZfRVZUICsgNCksICAgICAvLyAweDEyCi0gIFNNUF9CUl9LRVlTX1JTUF9FVlQgPSAoU01QX0JSX1NFTEZfREVGX0VWVCArIDUpLCAgICAgICAgICAvLyAweDEzCi0gIFNNUF9CUl9BUElfU0VDX0dSQU5UX0VWVCA9IChTTVBfQlJfU0VMRl9ERUZfRVZUICsgNiksICAgICAvLyAweDE0Ci0gIFNNUF9CUl9US19SRVFfRVZUID0gKFNNUF9CUl9TRUxGX0RFRl9FVlQgKyA3KSwgICAgICAgICAgICAvLyAweDE1Ci0gIFNNUF9CUl9BVVRIX0NNUExfRVZUID0gKFNNUF9CUl9TRUxGX0RFRl9FVlQgKyA4KSwgICAgICAgICAvLyAweDE2Ci0gIFNNUF9CUl9FTkNfUkVRX0VWVCA9IChTTVBfQlJfU0VMRl9ERUZfRVZUICsgOSksICAgICAgICAgICAvLyAweDE3Ci0gIFNNUF9CUl9CT05EX1JFUV9FVlQgPSAoU01QX0JSX1NFTEZfREVGX0VWVCArIDEwKSwgICAgICAgICAvLyAweDE4Ci0gIFNNUF9CUl9ESVNDQVJEX1NFQ19SRVFfRVZUID0gKFNNUF9CUl9TRUxGX0RFRl9FVlQgKyAxMSksICAvLyAweDE5Ci0gIFNNUF9CUl9NQVhfRVZUID0gKFNNUF9CUl9TRUxGX0RFRl9FVlQgKyAxMiksICAgICAgICAgICAgICAvLyAweDFhCi0KLSAgU01QX1BBSVJfREhLRVlfQ0hDS19FVlQgPSBTTVBfT1BDT0RFX1BBSVJfREhLRVlfQ0hFQ0ssICAvLyAweDBkCi0KLSAgLyogcmVxdWVzdCB0byBzdGFydCBwdWJsaWMgIGtleSBleGNoYW5nZSAqLwotICBTTVBfUFVCTF9LRVlfRVhDSF9SRVFfRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyAxMSksICAvLyAweDFiCi0KLSAgLyogbG9jYWwgcHVibGljIGtleSBjcmVhdGVkICovCi0gIFNNUF9MT0NfUFVCTF9LRVlfQ1JURF9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDEyKSwgIC8vIDB4MWMKLQotICAvKiBib3RoIGxvY2FsIGFuZCBwZWVyIHB1YmxpYyBrZXlzIGFyZSBzYXZlZCBpbiBjYiAqLwotICBTTVBfQk9USF9QVUJMX0tFWVNfUkNWRF9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDEzKSwgIC8vIDB4MWQKLQotICAvKiBESEtleSBjb21wdXRhdGlvbiBpcyBjb21wbGV0ZWQsIHRpbWUgdG8gc3RhcnQgU0MgcGhhc2UxICovCi0gIFNNUF9TQ19ESEtFWV9DTVBMVF9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDE0KSwgIC8vIDB4MWQKLQotICAvKiBuZXcgbG9jYWwgbm9uY2UgaXMgZ2VuZXJhdGVkIGFuZCBzYXZlZCBpbiBwX2NiLT5yYW5kICovCi0gIFNNUF9IQVZFX0xPQ19OT05DRV9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDE1KSwgIC8vIDB4MWYKLQotICAvKiB0aW1lIHRvIHN0YXJ0IFNDIHBoYXNlMiAqLwotICBTTVBfU0NfUEhBU0UxX0NNUExUX0VWVCA9IChTTVBfU0VMRl9ERUZfRVZUICsgMTYpLCAgLy8gMHgyMAotCi0gIC8qIHJlcXVlc3QgdG8gY2FsY3VsYXRlIG51bWJlciBmb3IgdXNlciBjaGVjay4gVXNlZCBvbmx5IGluIHRoZSBudW1lcmljCi0gICAqIGNvbXBhcmUgcHJvdG9jb2wgKi8KLSAgU01QX1NDX0NBTENfTkNfRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyAxNyksICAvLyAweDIxCi0KLSAgLyogUmVxdWVzdCB0byBkaXNwbGF5IHRoZSBudW1iZXIgZm9yIHVzZXIgY2hlY2sgdG8gdGhlIHVzZXIuKi8KLSAgLyogVXNlZCBvbmx5IGluIHRoZSBudW1lcmljIGNvbXBhcmUgcHJvdG9jb2wgKi8KLSAgU01QX1NDX0RTUExfTkNfRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyAxOCksICAvLyAweDIyCi0KLSAgLyogdXNlciBjb25maXJtcyAnT0snIG51bWVyaWMgY29tcGFyaXNvbiByZXF1ZXN0ICovCi0gIFNNUF9TQ19OQ19PS19FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDE5KSwgIC8vIDB4MjMKLQotICAvKiBib3RoIGxvY2FsIGFuZCBwZWVyIERIS2V5IENoZWNrcyBhcmUgYWxyZWFkeSBwcmVzZW50IC0gaXQgaXMgdXNlZCBvbgotICAgKiBwZXJpcGhlcmFsIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiAqLwotICBTTVBfU0NfMl9ESENLX0NIS1NfUFJFU19FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDIwKSwgIC8vIDB4MjQKLQotICAvKiBzYW1lIG1lYW5pbmcgYXMgU01QX0tFWV9SRUFEWV9FVlQgdG8gc2VwYXJhdGUgYmV0d2VlbiBTQyBhbmQgbGVnYWN5IGFjdGlvbnMKLSAgICovCi0gIFNNUF9TQ19LRVlfUkVBRFlfRVZUID0gKFNNUF9TRUxGX0RFRl9FVlQgKyAyMSksICAgICAgICAgICAgIC8vIDB4MjUKLSAgU01QX0tFWVBSRVNTX05PVElGSUNBVElPTl9FVkVOVCA9IChTTVBfU0VMRl9ERUZfRVZUICsgMjIpLCAgLy8gMHgyNgotCi0gIC8qIFNDIE9PQiBkYXRhIGZyb20gc29tZSByZXBvc2l0b3J5IGlzIHByb3ZpZGVkICovCi0gIFNNUF9TQ19PT0JfREFUQV9FVlQgPSAoU01QX1NFTEZfREVGX0VWVCArIDIzKSwgIC8vIDB4MjcKLQotICBTTVBfQ1JfTE9DX1NDX09PQl9EQVRBX0VWVCA9IChTTVBfU0VMRl9ERUZfRVZUICsgMjQpLCAgLy8gMHgyOAotICBTTVBfTUFYX0VWVCA9IFNNUF9DUl9MT0NfU0NfT09CX0RBVEFfRVZULCAgICAgICAgICAgICAgLy8gMHgyOAotfSB0U01QX0VWRU5UOwotdHlwZWRlZiB0U01QX0VWRU5UIHRTTVBfQlJfRVZFTlQ7Ci0KLS8qIEFzc3VtcHRpb24gaXQncyBvbmx5IHVzaW5nIHRoZSBsb3cgOCBiaXRzLCBpZiBiaWdnZXIgdGhhbiB0aGF0LCBuZWVkIHRvCi0gKiBleHBhbmQgaXQgdG8gMTYgYml0cyAqLwotI2RlZmluZSBTTVBfU0VDX0tFWV9NQVNLIDB4MDBmZgotCi0vKiBTTVAgcGFpcmluZyBzdGF0ZSAqLwotZW51bSB7Ci0gIFNNUF9TVEFURV9JRExFLAotICBTTVBfU1RBVEVfV0FJVF9BUFBfUlNQLAotICBTTVBfU1RBVEVfU0VDX1JFUV9QRU5ESU5HLAotICBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQLAotICBTTVBfU1RBVEVfV0FJVF9DT05GSVJNLAotICBTTVBfU1RBVEVfQ09ORklSTSwKLSAgU01QX1NUQVRFX1JBTkQsCi0gIFNNUF9TVEFURV9QVUJMSUNfS0VZX0VYQ0gsCi0gIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMxX1NUQVJULAotICBTTVBfU1RBVEVfV0FJVF9DT01NSVRNRU5ULAotICBTTVBfU1RBVEVfV0FJVF9OT05DRSwKLSAgU01QX1NUQVRFX1NFQ19DT05OX1BIUzJfU1RBUlQsCi0gIFNNUF9TVEFURV9XQUlUX0RIS19DSEVDSywKLSAgU01QX1NUQVRFX0RIS19DSEVDSywKLSAgU01QX1NUQVRFX0VOQ1JZUFRJT05fUEVORElORywKLSAgU01QX1NUQVRFX0JPTkRfUEVORElORywKLSAgU01QX1NUQVRFX0NSRUFURV9MT0NBTF9TRUNfQ09OTl9PT0JfREFUQSwKLSAgU01QX1NUQVRFX01BWAotfTsKLXR5cGVkZWYgdWludDhfdCB0U01QX1NUQVRFOwotCi0vKiBTTVAgb3ZlciBCUi9FRFIgcGFpcmluZyBzdGF0ZXMgKi8KLWVudW0gewotICBTTVBfQlJfU1RBVEVfSURMRSA9IFNNUF9TVEFURV9JRExFLAotICBTTVBfQlJfU1RBVEVfV0FJVF9BUFBfUlNQLAotICBTTVBfQlJfU1RBVEVfUEFJUl9SRVFfUlNQLAotICBTTVBfQlJfU1RBVEVfQk9ORF9QRU5ESU5HLAotICBTTVBfQlJfU1RBVEVfTUFYCi19OwotdHlwZWRlZiB1aW50OF90IHRTTVBfQlJfU1RBVEU7Ci0KLWVudW0gewotICBTTVBfS0VZX1RZUEVfVEssCi0gIFNNUF9LRVlfVFlQRV9DRk0sCi0gIFNNUF9LRVlfVFlQRV9DTVAsCi0gIFNNUF9LRVlfVFlQRV9QRUVSX0RIS19DSENLLAotICBTTVBfS0VZX1RZUEVfU1RLLAotICBTTVBfS0VZX1RZUEVfTFRLCi19OwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGtleV90eXBlOwotICB1aW50OF90KiBwX2RhdGE7Ci19IHRTTVBfS0VZOwotCi10eXBlZGVmIHVuaW9uIHsKLSAgdWludDhfdCogcF9kYXRhOyAvKiB1aW50OF90IHR5cGUgZGF0YSBwb2ludGVyICovCi0gIHRTTVBfS0VZIGtleTsKLSAgdFNNUF9TVEFUVVMgc3RhdHVzOwotICB1aW50MzJfdCBwYXNza2V5OwotICB0U01QX09PQl9EQVRBX1RZUEUgcmVxX29vYl90eXBlOwotfSB0U01QX0lOVF9EQVRBOwotCi0vKiBpbnRlcm5hbCBzdGF0dXMgbWFzayAqLwotI2RlZmluZSBTTVBfUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REICgxKQotI2RlZmluZSBTTVBfUEFJUl9GTEFHU19QRUVSX1NUQVJURURfREQgKDEgPDwgMSkKLSNkZWZpbmUgU01QX1BBSVJfRkxBR1NfQ01EX0NPTkZJUk0gKDEgPDwgU01QX09QQ09ERV9DT05GSVJNKSAvKiAxIDw8IDMgKi8KLSNkZWZpbmUgU01QX1BBSVJfRkxBR19FTkNfQUZURVJfUEFJUiAoMSA8PCA0KQotI2RlZmluZSBTTVBfUEFJUl9GTEFHX0hBVkVfUEVFUl9ESEtfQ0hLIFwKLSAgKDEgPDwgNSkgLyogdXNlZCBvbiBwZXJpcGhlcmFsIHRvIHJlc29sdmUgcmFjZSBjb25kaXRpb24gKi8KLSNkZWZpbmUgU01QX1BBSVJfRkxBR19IQVZFX1BFRVJfUFVCTF9LRVkgXAotICAoMSA8PCA2KSAvKiB1c2VkIG9uIHBlcmlwaGVyYWwgdG8gcmVzb2x2ZSByYWNlIGNvbmRpdGlvbiAqLwotI2RlZmluZSBTTVBfUEFJUl9GTEFHX0hBVkVfUEVFUl9DT01NIFwKLSAgKDEgPDwgNykgLyogdXNlZCB0byByZXNvbHZlIHJhY2UgY29uZGl0aW9uICovCi0jZGVmaW5lIFNNUF9QQUlSX0ZMQUdfSEFWRV9MT0NBTF9QVUJMX0tFWSBcCi0gICgxIDw8IDgpIC8qIHVzZWQgb24gcGVyaXBoZXJhbCB0byByZXNvbHZlIHJhY2UgY29uZGl0aW9uICovCi0KLS8qIGNoZWNrIGlmIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVtZW50IG5lZWQgTUlUTSBwcm90ZWN0aW9uICovCi0jZGVmaW5lIFNNUF9OT19NSVRNX1JFUVVJUkVEKHgpICgoKHgpJlNNUF9BVVRIX1lOX0JJVCkgPT0gMCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBSYXdBZGRyZXNzIGJkX2FkZHI7Ci0gIEJUX0hEUiogcF9jb3B5OwotfSB0U01QX1JFUV9RX0VOVFJZOwotCi0vKiBTTVAgY29udHJvbCBibG9jayAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB0U01QX0NBTExCQUNLKiBwX2NhbGxiYWNrOwotICBhbGFybV90KiBzbXBfcnNwX3RpbWVyX2VudDsKLSAgdWludDhfdCB0cmFjZV9sZXZlbDsKLSAgUmF3QWRkcmVzcyBwYWlyaW5nX2JkYTsKLSAgdFNNUF9TVEFURSBzdGF0ZTsKLSAgYm9vbCBkZXJpdmVfbGs7Ci0gIGJvb2wgaWRfYWRkcl9yY3ZkOwotICB0QkxFX0FERFJfVFlQRSBpZF9hZGRyX3R5cGU7Ci0gIFJhd0FkZHJlc3MgaWRfYWRkcjsKLSAgYm9vbCBzbXBfb3Zlcl9icjsKLSAgdFNNUF9CUl9TVEFURSBicl9zdGF0ZTsgLyogaWYgU01QIG92ZXIgQlIvRVJEIGhhcyBwcmlvcml0eSBvdmVyIFNNUCAqLwotICB1aW50OF90IGZhaWx1cmU7Ci0gIHRTTVBfU1RBVFVTIHN0YXR1czsKLSAgdWludDhfdCByb2xlOwotICB1aW50MTZfdCBmbGFnczsKLSAgdFNNUF9FVlQgY2JfZXZ0OwotICB0U01QX1NFQ19MRVZFTCBzZWNfbGV2ZWw7Ci0gIGJvb2wgY29ubmVjdF9pbml0aWFsaXplZDsKLSAgT2N0ZXQxNiBjb25maXJtOwotICBPY3RldDE2IHJjb25maXJtOwotICBPY3RldDE2IHJyYW5kOyAvKiBmb3IgU0MgdGhpcyBpcyBwZWVyIG5vbmNlICovCi0gIE9jdGV0MTYgcmFuZDsgIC8qIGZvciBTQyB0aGlzIGlzIGxvY2FsIG5vbmNlICovCi0gIEJUX09DVEVUMzIgcHJpdmF0ZV9rZXk7Ci0gIEJUX09DVEVUMzIgZGhrZXk7Ci0gIE9jdGV0MTYgY29tbWl0bWVudDsKLSAgT2N0ZXQxNiByZW1vdGVfY29tbWl0bWVudDsKLSAgT2N0ZXQxNiBsb2NhbF9yYW5kb207IC8qIGxvY2FsIHJhbmRvbWl6ZXIgLSBwYXNza2V5IG9yIE9PQiByYW5kb21pemVyICovCi0gIE9jdGV0MTYgcGVlcl9yYW5kb207ICAvKiBwZWVyIHJhbmRvbWl6ZXIgLSBwYXNza2V5IG9yIE9PQiByYW5kb21pemVyICovCi0gIE9jdGV0MTYgZGhrZXlfY2hlY2s7Ci0gIE9jdGV0MTYgcmVtb3RlX2Roa2V5X2NoZWNrOwotICB0U01QX1BVQkxJQ19LRVkgbG9jX3B1Ymxfa2V5OwotICB0U01QX1BVQkxJQ19LRVkgcGVlcl9wdWJsX2tleTsKLSAgdFNNUF9PT0JfREFUQV9UWVBFIHJlcV9vb2JfdHlwZTsKLSAgdFNNUF9TQ19PT0JfREFUQSBzY19vb2JfZGF0YTsKLSAgdFNNUF9JT19DQVAgcGVlcl9pb19jYXBzOwotICB0U01QX0lPX0NBUCBsb2NhbF9pb19jYXBhYmlsaXR5OwotICB0U01QX09PQl9GTEFHIHBlZXJfb29iX2ZsYWc7Ci0gIHRTTVBfT09CX0ZMQUcgbG9jX29vYl9mbGFnOwotICB0U01QX0FVVEhfUkVRIHBlZXJfYXV0aF9yZXE7Ci0gIHRTTVBfQVVUSF9SRVEgbG9jX2F1dGhfcmVxOwotICBib29sIHNlY3VyZV9jb25uZWN0aW9uc19vbmx5X21vZGVfcmVxdWlyZWQ7IC8qIHRydWUgaWYgbG9jYWxseSBTTSBpcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG9wZXJhdGUgKi8KLSAgLyogZWl0aGVyIGluIFNlY3VyZSBDb25uZWN0aW9ucyBtb2RlIG9yIG5vdCBhdCBhbGwgKi8KLSAgdFNNUF9BU1NPX01PREVMIHNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsOwotICBib29sIGxlX3NlY3VyZV9jb25uZWN0aW9uc19tb2RlX2lzX3VzZWQ7Ci0gIGJvb2wga2V5X2Rlcml2YXRpb25faDdfdXNlZDsKLSAgYm9vbCBsZV9zY19rcF9ub3RpZl9pc191c2VkOwotICB0U01QX1NDX0tFWV9UWVBFIGxvY2FsX2tleXByZXNzX25vdGlmaWNhdGlvbjsKLSAgdFNNUF9TQ19LRVlfVFlQRSBwZWVyX2tleXByZXNzX25vdGlmaWNhdGlvbjsKLSAgdWludDhfdAotICAgICAgcm91bmQ7IC8qIGF1dGhlbnRpY2F0aW9uIHN0YWdlIDEgcm91bmQgZm9yIHBhc3NrZXkgYXNzb2NpYXRpb24gbW9kZWwgKi8KLSAgdWludDMyX3QgbnVtYmVyX3RvX2Rpc3BsYXk7Ci0gIE9jdGV0MTYgbWFjX2tleTsKLSAgdWludDhfdCBwZWVyX2VuY19zaXplOwotICB1aW50OF90IGxvY19lbmNfc2l6ZTsKLSAgdWludDhfdCBwZWVyX2lfa2V5OwotICB1aW50OF90IHBlZXJfcl9rZXk7Ci0gIHVpbnQ4X3QgbG9jYWxfaV9rZXk7Ci0gIHVpbnQ4X3QgbG9jYWxfcl9rZXk7Ci0KLSAgT2N0ZXQxNiB0azsKLSAgT2N0ZXQxNiBsdGs7Ci0gIHVpbnQxNl90IGRpdjsKLSAgT2N0ZXQxNiBjc3JrOyAvKiBzdG9yYWdlIGZvciBsb2NhbCBDU1JLICovCi0gIHVpbnQxNl90IGVkaXY7Ci0gIEJUX09DVEVUOCBlbmNfcmFuZDsKLSAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlOwotICBSYXdBZGRyZXNzIGxvY2FsX2JkYTsKLSAgYm9vbCBpc19wYWlyX2NhbmNlbDsKLSAgYm9vbCBkaXNjYXJkX3NlY19yZXE7Ci0gIHVpbnQ4X3QgcmN2ZF9jbWRfY29kZTsKLSAgdWludDhfdCByY3ZkX2NtZF9sZW47Ci0gIHVpbnQxNl90IHRvdGFsX3R4X3VuYWNrZWQ7Ci0gIGJvb2wgd2FpdF9mb3JfYXV0aG9yaXphdGlvbl9jb21wbGV0ZTsKLSAgdFNNUF9TVEFUVVMgY2VydF9mYWlsdXJlOyAvKmZhaWx1cmUgY2FzZSBmb3IgY2VydGlmaWNhdGlvbiAqLwotICBhbGFybV90KiBkZWxheWVkX2F1dGhfdGltZXJfZW50OwotfSB0U01QX0NCOwotCi0vKiBTZXJ2ZXIgQWN0aW9uIGZ1bmN0aW9ucyBhcmUgb2YgdGhpcyB0eXBlICovCi10eXBlZGVmIHZvaWQgKCp0U01QX0FDVCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLQotZXh0ZXJuIHRTTVBfQ0Igc21wX2NiOwotCi0vKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgYXR0X21haW4uY2MgKi8KLWV4dGVybiB2b2lkIHNtcF9pbml0KHZvaWQpOwotCi0vKiBzbXAgbWFpbiAqLwotZXh0ZXJuIHZvaWQgc21wX3NtX2V2ZW50KHRTTVBfQ0IqIHBfY2IsIHRTTVBfRVZFTlQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLQotZXh0ZXJuIHRTTVBfU1RBVEUgc21wX2dldF9zdGF0ZSh2b2lkKTsKLWV4dGVybiB2b2lkIHNtcF9zZXRfc3RhdGUodFNNUF9TVEFURSBzdGF0ZSk7Ci0KLS8qIHNtcF9icl9tYWluICovCi1leHRlcm4gdm9pZCBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudCh0U01QX0NCKiBwX2NiLCB0U01QX0JSX0VWRU5UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB0U01QX0JSX1NUQVRFIHNtcF9nZXRfYnJfc3RhdGUodm9pZCk7Ci1leHRlcm4gdm9pZCBzbXBfc2V0X2JyX3N0YXRlKHRTTVBfQlJfU1RBVEUgc3RhdGUpOwotCi0vKiBzbXBfYWN0LmNjICovCi1leHRlcm4gdm9pZCBzbXBfc2VuZF9wYWlyX3JlcSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3NlbmRfY29uZmlybSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3NlbmRfcGFpcl9mYWlsKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc2VuZF9yYW5kKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc2VuZF9wYWlyX3B1YmxpY19rZXkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9zZW5kX2NvbW1pdG1lbnQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9zZW5kX2Roa2V5X2NoZWNrKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc2VuZF9rZXlwcmVzc19ub3RpZmljYXRpb24odFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2NfcGFpcl9mYWlsKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY19jb25maXJtKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY19yYW5kKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY2Vzc19wYWlyaW5nX3B1YmxpY19rZXkodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2NfZW5jX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jX2NlbnRyYWxfaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jX2lkX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jX2lkX2FkZHIodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jX3NlY19ncmFudCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2Nfc2VjX3JlcSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2Nfc2xfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc3RhcnRfZW5jKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfZW5jX2NtcGwodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jX2Rpc2NhcmQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wYWlyaW5nX2NtcGwodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9kZWNpZGVfYXNzb2NpYXRpb25fbW9kZWwodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9zZW5kX2FwcF9jYmFjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2NfY29tcGFyZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX2NoZWNrX2F1dGhfcmVxKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY2Vzc19pb19yZXNwb25zZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3NlbmRfaWRfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3NlbmRfZW5jX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9zZW5kX2NzcmtfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3NlbmRfbHRrX3JlcGx5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY19wYWlyX2NtZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3BhaXJfdGVybWluYXRlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfaWRsZV90ZXJtaW5hdGUodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9zZW5kX3BhaXJfcnNwKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfa2V5X2Rpc3RyaWJ1dGlvbih0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2Nfc3JrX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9nZW5lcmF0ZV9jc3JrKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfa2V5X3BpY2tfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfYm90aF9oYXZlX3B1YmxpY19rZXlzKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc3RhcnRfc2VjdXJlX2Nvbm5lY3Rpb25fcGhhc2UxKHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY2Vzc19sb2NhbF9ub25jZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2Nlc3NfcGFpcmluZ19jb21taXRtZW50KHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jZXNzX3BlZXJfbm9uY2UodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9wcm9jZXNzX2Roa2V5X2NoZWNrKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfbWF0Y2hfZGhrZXlfY2hlY2tzKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24odFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX21vdmVfdG9fc2VjdXJlX2Nvbm5lY3Rpb25zX3BoYXNlMih0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3BoYXNlXzJfZGhrZXlfY2hlY2tzX2FyZV9wcmVzZW50KHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc3RhcnRfcGFzc2tleV92ZXJpZmljYXRpb24odFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fb29iX2RhdGEodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9sb25nX3Rlcm1fa2V5KHZvaWQpOwotZXh0ZXJuIHZvaWQgc21wX3NldF9sb2NhbF9vb2Jfa2V5cyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3NldF9sb2NhbF9vb2JfcmFuZG9tX2NvbW1pdG1lbnQodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfc2V0X2Rlcml2ZV9saW5rX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX2Rlcml2ZV9saW5rX2tleV9mcm9tX2xvbmdfdGVybV9rZXkodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfYnJfcHJvY2Vzc19wYWlyaW5nX2NvbW1hbmQodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZSh0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfYnJfc2VuZF9wYWlyX3Jlc3BvbnNlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfYnJfY2hlY2tfYXV0aG9yaXphdGlvbl9yZXF1ZXN0KHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfYnJfc2VsZWN0X25leHRfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfYnJfcHJvY2Vzc19saW5rX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX2tleV9kaXN0cmlidXRpb25fYnlfdHJhbnNwb3J0KHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9icl9wYWlyaW5nX2NvbXBsZXRlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci0KLS8qIHNtcF9sMmMgKi8KLWV4dGVybiB2b2lkIHNtcF9sMmNhcF9pZl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgc21wX2RhdGFfaW5kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIEJUX0hEUiogcF9idWYpOwotCi0vKiBzbXBfdXRpbC5jYyAqLwotZXh0ZXJuIHZvaWQgc21wX2xvZ19tZXRyaWNzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfb3V0Z29pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9idWYsIHNpemVfdCBidWZfbGVuKTsKLWV4dGVybiBib29sIHNtcF9zZW5kX2NtZCh1aW50OF90IGNtZF9jb2RlLCB0U01QX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIHNtcF9jYl9jbGVhbnVwKHRTTVBfQ0IqIHBfY2IpOwotZXh0ZXJuIHZvaWQgc21wX3Jlc2V0X2NvbnRyb2xfdmFsdWUodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfcHJvY19wYWlyaW5nX2NtcGwodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfY29udmVydF9zdHJpbmdfdG9fdGsoT2N0ZXQxNiogdGssIHVpbnQzMl90IHBhc3NrZXkpOwotZXh0ZXJuIHZvaWQgc21wX21hc2tfZW5jX2tleSh1aW50OF90IGxvY19lbmNfc2l6ZSwgT2N0ZXQxNiogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9yc3BfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9kZWxheWVkX2F1dGhfY29tcGxldGVfdGltZW91dCh2b2lkKiBkYXRhKTsKLWV4dGVybiBib29sIHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX2xlbmd0aCh0U01QX0NCKiBwX2NiKTsKLWV4dGVybiBib29sIHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnModFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfcmVqZWN0X3VuZXhwZWN0ZWRfcGFpcmluZ19jb21tYW5kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpOwotZXh0ZXJuIHRTTVBfQVNTT19NT0RFTCBzbXBfc2VsZWN0X2Fzc29jaWF0aW9uX21vZGVsKHRTTVBfQ0IqIHBfY2IpOwotZXh0ZXJuIHVpbnQ4X3Qgc21wX2NhbGN1bGF0ZV9yYW5kb21faW5wdXQodWludDhfdCogcmFuZG9tLCB1aW50OF90IHJvdW5kKTsKLWV4dGVybiB2b2lkIHNtcF9jb2xsZWN0X2xvY2FsX2lvX2NhcGFiaWxpdGllcyh1aW50OF90KiBpb2NhcCwgdFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfY29sbGVjdF9wZWVyX2lvX2NhcGFiaWxpdGllcyh1aW50OF90KiBpb2NhcCwgdFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfY29sbGVjdF9sb2NhbF9ibGVfYWRkcmVzcyh1aW50OF90KiBsZV9hZGRyLCB0U01QX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIHNtcF9jb2xsZWN0X3BlZXJfYmxlX2FkZHJlc3ModWludDhfdCogbGVfYWRkciwgdFNNUF9DQiogcF9jYik7Ci1leHRlcm4gYm9vbCBzbXBfY2hlY2tfY29tbWl0bWVudCh0U01QX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIHNtcF9zYXZlX3NlY3VyZV9jb25uZWN0aW9uc19sb25nX3Rlcm1fa2V5KHRTTVBfQ0IqIHBfY2IpOwotZXh0ZXJuIHZvaWQgc21wX2NhbGN1bGF0ZV9mNV9tYWNrZXlfYW5kX2xvbmdfdGVybV9rZXkodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfcmVtb3ZlX2ZpeGVkX2NoYW5uZWwodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gYm9vbCBzbXBfcmVxdWVzdF9vb2JfZGF0YSh0U01QX0NCKiBwX2NiKTsKLQotLyogc21wX2tleXMuY2MgKi8KLWV4dGVybiB2b2lkIHNtcF9nZW5lcmF0ZV9zcmFuZF9tcmFuZF9jb25maXJtKHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX2dlbmVyYXRlX2NvbXBhcmUodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9nZW5lcmF0ZV9zdGsodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9nZW5lcmF0ZV9sdGsodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKTsKLWV4dGVybiB2b2lkIHNtcF9nZW5lcmF0ZV9wYXNza2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfZ2VuZXJhdGVfcmFuZF9jb250KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfY3JlYXRlX3ByaXZhdGVfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfdXNlX29vYl9wcml2YXRlX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX2NvbXB1dGVfZGhrZXkodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfY2FsY3VsYXRlX2xvY2FsX2NvbW1pdG1lbnQodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gT2N0ZXQxNiBzbXBfY2FsY3VsYXRlX3BlZXJfY29tbWl0bWVudCh0U01QX0NCKiBwX2NiKTsKLWV4dGVybiB2b2lkIHNtcF9jYWxjdWxhdGVfbnVtZXJpY19jb21wYXJpc29uX2Rpc3BsYXlfbnVtYmVyKAotICAgIHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfY2FsY3VsYXRlX2xvY2FsX2Roa2V5X2NoZWNrKHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk7Ci1leHRlcm4gdm9pZCBzbXBfY2FsY3VsYXRlX3BlZXJfZGhrZXlfY2hlY2sodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpOwotZXh0ZXJuIHZvaWQgc21wX3N0YXJ0X25vbmNlX2dlbmVyYXRpb24odFNNUF9DQiogcF9jYik7Ci1leHRlcm4gYm9vbCBzbXBfY2FsY3VsYXRlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleSh0U01QX0NCKiBwX2NiKTsKLWV4dGVybiBib29sIHNtcF9jYWxjdWxhdGVfbG9uZ190ZXJtX2tleV9mcm9tX2xpbmtfa2V5KHRTTVBfQ0IqIHBfY2IpOwotCi1leHRlcm4gdm9pZCBwcmludDEyOChjb25zdCBPY3RldDE2JiB4LCBjb25zdCB1aW50OF90KiBrZXlfbmFtZSk7Ci1leHRlcm4gdm9pZCBzbXBfeG9yXzEyOChPY3RldDE2KiBhLCBjb25zdCBPY3RldDE2JiBiKTsKLQotLyogU2F2ZSB0aGUgcF9jYi0+c2Nfb29iX2RhdGEubG9jX29vYl9kYXRhIGZvciBsYXRlciwgc2luY2UgdGhlIHBfY2IgZ2V0cwotICogY2xlYW5lZCB1cCAqLwotZXh0ZXJuIHZvaWQgc21wX3NhdmVfbG9jYWxfb29iX2RhdGEodFNNUF9DQiogcF9jYik7Ci1leHRlcm4gdm9pZCBzbXBfY2xlYXJfbG9jYWxfb29iX2RhdGEoKTsKLWV4dGVybiBib29sIHNtcF9oYXNfbG9jYWxfb29iX2RhdGEoKTsKLSNlbmRpZiAvKiBTTVBfSU5UX0ggKi8KZGlmZiAtLWdpdCBhL3N0YWNrL3NtcC9zbXBfa2V5cy5jYyBiL3N0YWNrL3NtcC9zbXBfa2V5cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkZDBhOS4uMDAwMDAwMAotLS0gYS9zdGFjay9zbXAvc21wX2tleXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHNlY3VyaXR5IG1hbmFnZXIgcHJvdG9jb2wgdXRpbGl0eSBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRfdXRpbHMuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInBfMjU2X2VjY19wcC5oIgotI2luY2x1ZGUgInNtcF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLWV4dGVybiB0QlRNX0NCIGJ0bV9jYjsgIC8vIFRPRE8gUmVtb3ZlCi0KLXVzaW5nIGJhc2U6OkJpbmQ7Ci11c2luZyBjcnlwdG9fdG9vbGJveDo6YWVzXzEyODsKLQotI2lmbmRlZiBTTVBfTUFYX0VOQ19SRVBFQVQKLSNkZWZpbmUgU01QX01BWF9FTkNfUkVQRUFUIDMKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBzbXBfcHJvY2Vzc19zdGsodFNNUF9DQiogcF9jYiwgT2N0ZXQxNiogcCk7Ci1zdGF0aWMgT2N0ZXQxNiBzbXBfY2FsY3VsYXRlX2xlZ2FjeV9zaG9ydF90ZXJtX2tleSh0U01QX0NCKiBwX2NiKTsKLXN0YXRpYyB2b2lkIHNtcF9wcm9jZXNzX3ByaXZhdGVfa2V5KHRTTVBfQ0IqIHBfY2IpOwotCi0jZGVmaW5lIFNNUF9QQVNTS0VZX01BU0sgMHhmZmYwMDAwMAotCi0vLyBJZiB0aGVyZSBpcyBkYXRhIHNhdmVkIGhlcmUsIHRoZW4gdXNlIGl0cyBpbmZvIGluc3RlYWQKLS8vIFRoaXMgbmVlZHMgdG8gYmUgY2xlYXJlZCBvbiBhIHN1Y2Nlc3NmdWx0IHBhaXJpbmcgdXNpbmcgdGhlIG9vYiBkYXRhCi1zdGF0aWMgdFNNUF9MT0NfT09CX0RBVEEgc2F2ZWRfbG9jYWxfb29iX2RhdGEgPSB7fTsKLQotdm9pZCBzbXBfc2F2ZV9sb2NhbF9vb2JfZGF0YSh0U01QX0NCKiBwX2NiKSB7Ci0gIHNhdmVkX2xvY2FsX29vYl9kYXRhID0gcF9jYi0+c2Nfb29iX2RhdGEubG9jX29vYl9kYXRhOwotfQotCi12b2lkIHNtcF9jbGVhcl9sb2NhbF9vb2JfZGF0YSgpIHsgc2F2ZWRfbG9jYWxfb29iX2RhdGEgPSB7fTsgfQotCi1zdGF0aWMgYm9vbCBpc19lbXB0eSh0U01QX0xPQ19PT0JfREFUQSogZGF0YSkgewotICB0U01QX0xPQ19PT0JfREFUQSBlbXB0eV9kYXRhID0ge307Ci0gIHJldHVybiBtZW1jbXAoZGF0YSwgJmVtcHR5X2RhdGEsIHNpemVvZih0U01QX0xPQ19PT0JfREFUQSkpID09IDA7Ci19Ci0KLWJvb2wgc21wX2hhc19sb2NhbF9vb2JfZGF0YSgpIHsgcmV0dXJuICFpc19lbXB0eSgmc2F2ZWRfbG9jYWxfb29iX2RhdGEpOyB9Ci0KLXZvaWQgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4odWludDhfdCogcCwgY29uc3QgY2hhcioga2V5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuKSB7fQotCi1pbmxpbmUgdm9pZCBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihjb25zdCBPY3RldDE2JiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxlbikgewotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihjb25zdF9jYXN0PHVpbnQ4X3QqPihwLmRhdGEoKSksIGtleV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOwotfQotCi12b2lkIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9iaWdfZW5kaWFuKHVpbnQ4X3QqIHAsIGNvbnN0IGNoYXIqIGtleV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxlbikge30KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgYSBwYXNza2V5LiAqLwotdm9pZCBzbXBfcHJvY19wYXNza2V5KHRTTVBfQ0IqIHBfY2IsIEJUX09DVEVUOCByYW5kKSB7Ci0gIHVpbnQ4X3QqIHR0ID0gcF9jYi0+dGsuZGF0YSgpOwotICB1aW50MzJfdCBwYXNza2V5OyAvKiAxOTY1NSB0ZXN0IG51bWJlcjsgKi8KLSAgdWludDhfdCogcHAgPSByYW5kOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIFNUUkVBTV9UT19VSU5UMzIocGFzc2tleSwgcHApOwotICBwYXNza2V5ICY9IH5TTVBfUEFTU0tFWV9NQVNLOwotCi0gIC8qIHRydW5jYXRlIGJ5IG1heGltdW0gdmFsdWUgKi8KLSAgd2hpbGUgKHBhc3NrZXkgPiBCVE1fTUFYX1BBU1NLRVlfVkFMKSBwYXNza2V5ID4+PSAxOwotCi0gIC8qIHNhdmUgdGhlIFRLICovCi0gIHBfY2ItPnRrID0gezB9OwotICBVSU5UMzJfVE9fU1RSRUFNKHR0LCBwYXNza2V5KTsKLQotICBpZiAocF9jYi0+cF9jYWxsYmFjaykgewotICAgIHRTTVBfRVZUX0RBVEEgc21wX2V2dF9kYXRhID0gewotICAgICAgICAucGFzc2tleSA9IHBhc3NrZXksCi0gICAgfTsKLSAgICAoKnBfY2ItPnBfY2FsbGJhY2spKFNNUF9QQVNTS0VZX05PVElGX0VWVCwgcF9jYi0+cGFpcmluZ19iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmc21wX2V2dF9kYXRhKTsKLSAgfQotCi0gIGlmIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9PSBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9ESVNQKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnBhc3NrZXkgPSBwYXNza2V5OwotICAgIHNtcF9zbV9ldmVudCgmc21wX2NiLCBTTVBfS0VZX1JFQURZX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gIH0gZWxzZSB7Ci0gICAgdFNNUF9LRVkga2V5OwotICAgIGtleS5rZXlfdHlwZSA9IFNNUF9LRVlfVFlQRV9USzsKLSAgICBrZXkucF9kYXRhID0gcF9jYi0+dGsuZGF0YSgpOwotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5rZXkgPSBrZXk7Ci0gICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9LRVlfUkVBRFlfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2dlbmVyYXRlX3Bhc3NrZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdlbmVyYXRlIHBhc3NrZXkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2dlbmVyYXRlX3Bhc3NrZXkodFNNUF9DQiogcF9jYiwgVU5VU0VEX0FUVFIgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIC8qIGdlbmVyYXRlIE1SYW5kIG9yIFNSYW5kICovCi0gIGJ0c25kX2hjaWNfYmxlX3JhbmQoQmluZCgmc21wX3Byb2NfcGFzc2tleSwgcF9jYikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2dlbmVyYXRlX3N0awotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgU1RLIGNhbGN1bGF0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgcnVubmluZyBBRVMgd2l0aCB0aGUgVEsgdmFsdWUgYXMga2V5IGFuZCBhIGNvbmNhdGVuYXRpb24gb2YKLSAqICAgICAgICAgICAgICAgICAgdGhlIHJhbmRvbSB2YWx1ZXMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2dlbmVyYXRlX3N0ayh0U01QX0NCKiBwX2NiLCBVTlVTRURfQVRUUiB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgT2N0ZXQxNiBvdXRwdXQ7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocF9jYi0+bGVfc2VjdXJlX2Nvbm5lY3Rpb25zX21vZGVfaXNfdXNlZCkgewotICAgIFNNUF9UUkFDRV9ERUJVRygiRk9SIExFIFNDIExUSyBJUyBVU0VEIElOU1RFQUQgT0YgU1RLIik7Ci0gICAgb3V0cHV0ID0gcF9jYi0+bHRrOwotICB9IGVsc2UgewotICAgIG91dHB1dCA9IHNtcF9jYWxjdWxhdGVfbGVnYWN5X3Nob3J0X3Rlcm1fa2V5KHBfY2IpOwotICB9Ci0KLSAgc21wX3Byb2Nlc3Nfc3RrKHBfY2IsICZvdXRwdXQpOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNhbGN1bGF0ZSBDU1JLCi0gKi8KLXZvaWQgc21wX2NvbXB1dGVfY3Nyayh1aW50MTZfdCBkaXYsIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCBidWZmZXJbNF07IC8qIGZvciAociB8fCBESVYpICByPTEqLwotICB1aW50MTZfdCByID0gMTsKLSAgdWludDhfdCogcCA9IGJ1ZmZlcjsKLQotICBwX2NiLT5kaXYgPSBkaXY7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlczogZGl2PSV4IiwgX19mdW5jX18sIHBfY2ItPmRpdik7Ci0gIGNvbnN0IE9jdGV0MTYmIGVyID0gQlRNX0dldERldmljZUVuY1Jvb3QoKTsKLSAgLyogQ1NSSyA9IGQxKEVSLCBESVYsIDEpICovCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgcF9jYi0+ZGl2KTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCByKTsKLQotICBwX2NiLT5jc3JrID0gYWVzXzEyOChlciwgYnVmZmVyLCA0KTsKLSAgc21wX3NlbmRfY3Nya19pbmZvKHBfY2IsIE5VTEwpOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNhbGN1bGF0ZSBDU1JLLCBzdGFydGluZyB3aXRoIERJViBnZW5lcmF0aW9uLgotICovCi12b2lkIHNtcF9nZW5lcmF0ZV9jc3JrKHRTTVBfQ0IqIHBfY2IsIFVOVVNFRF9BVFRSIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBib29sIGRpdl9zdGF0dXM7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCJzbXBfZ2VuZXJhdGVfY3NyayIpOwotCi0gIGRpdl9zdGF0dXMgPSBidG1fZ2V0X2xvY2FsX2RpdihwX2NiLT5wYWlyaW5nX2JkYSwgJnBfY2ItPmRpdik7Ci0gIGlmIChkaXZfc3RhdHVzKSB7Ci0gICAgc21wX2NvbXB1dGVfY3NyayhwX2NiLT5kaXYsIHBfY2IpOwotICB9IGVsc2UgewotICAgIFNNUF9UUkFDRV9ERUJVRygiR2VuZXJhdGUgRElWIGZvciBDU1JLIik7Ci0gICAgYnRzbmRfaGNpY19ibGVfcmFuZChCaW5kKAotICAgICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICAgIHVpbnQxNl90IGRpdjsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGRpdiwgcmFuZCk7Ci0gICAgICAgICAgc21wX2NvbXB1dGVfY3NyayhkaXYsIHBfY2IpOwotICAgICAgICB9LAotICAgICAgICBwX2NiKSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2NvbmNhdGVuYXRlX3BlZXIgLSBMU0IgZmlyc3QKLSAqICAgICAgICAgICAgICAgICAgYWRkIHBhaXJpbmcgY29tbWFuZCBzZW50IGZyb20gbG9jYWwgZGV2aWNlIGludG8gcDEuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfY29uY2F0ZW5hdGVfbG9jYWwodFNNUF9DQiogcF9jYiwgdWludDhfdCoqIHBfZGF0YSwgdWludDhfdCBvcF9jb2RlKSB7Ci0gIHVpbnQ4X3QqIHAgPSAqcF9kYXRhOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBvcF9jb2RlKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHkpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jYi0+bG9jX29vYl9mbGFnKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY19hdXRoX3JlcSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5sb2NfZW5jX3NpemUpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jYi0+bG9jYWxfaV9rZXkpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jYi0+bG9jYWxfcl9rZXkpOwotCi0gICpwX2RhdGEgPSBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY29uY2F0ZW5hdGVfcGVlciAtIExTQiBmaXJzdAotICogICAgICAgICAgICAgICAgICBhZGQgcGFpcmluZyBjb21tYW5kIHJlY2VpdmVkIGZyb20gcGVlciBkZXZpY2UgaW50byBwMS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9jb25jYXRlbmF0ZV9wZWVyKHRTTVBfQ0IqIHBfY2IsIHVpbnQ4X3QqKiBwX2RhdGEsIHVpbnQ4X3Qgb3BfY29kZSkgewotICB1aW50OF90KiBwID0gKnBfZGF0YTsKLQotICBTTVBfVFJBQ0VfREVCVUcoInNtcF9jb25jYXRlbmF0ZV9wZWVyICIpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgb3BfY29kZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5wZWVyX2lvX2NhcHMpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jYi0+cGVlcl9vb2JfZmxhZyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5wZWVyX2F1dGhfcmVxKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPnBlZXJfZW5jX3NpemUpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jYi0+cGVlcl9pX2tleSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5wZWVyX3Jfa2V5KTsKLQotICAqcF9kYXRhID0gcDsKLX0KLQotLyoqIEdlbmVyYXRlIENvbmZpcm0vQ29tcGFyZSBTdGVwMToKLSAqICAgICAgICAgICAgICAgICAgcDEgPSAoTVNCKSBwcmVzIHx8IHByZXEgfHwgcmF0JyB8fCBpYXQnIChMU0IpCi0gKiAgICAgICAgICAgICAgICAgIEZpbGwgaW4gdmFsdWVzIExTQiBmaXJzdCB0aHVzCi0gKiAgICAgICAgICAgICAgICAgIHAxID0gaWF0JyB8fCByYXQnIHx8IHByZXEgfHwgcHJlcwotICovCi1PY3RldDE2IHNtcF9nZW5fcDFfNF9jb25maXJtKHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIHJlbW90ZV9iZF9hZGRyX3R5cGUpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgT2N0ZXQxNiBwMTsKLSAgdWludDhfdCogcCA9IHAxLmRhdGEoKTsKLSAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgIC8qIGlhdCc6IGluaXRpYXRvcidzIChsb2NhbCkgYWRkcmVzcyB0eXBlICovCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmFkZHJfdHlwZSk7Ci0gICAgLyogcmF0JzogcmVzcG9uZGVyJ3MgKHJlbW90ZSkgYWRkcmVzcyB0eXBlICovCi0gICAgVUlOVDhfVE9fU1RSRUFNKHAsIHJlbW90ZV9iZF9hZGRyX3R5cGUpOwotICAgIC8qIHByZXEgOiBQYWlyaW5nIFJlcXVlc3QgKGxvY2FsKSBjb21tYW5kICovCi0gICAgc21wX2NvbmNhdGVuYXRlX2xvY2FsKHBfY2IsICZwLCBTTVBfT1BDT0RFX1BBSVJJTkdfUkVRKTsKLSAgICAvKiBwcmVzIDogUGFpcmluZyBSZXNwb25zZSAocmVtb3RlKSBjb21tYW5kICovCi0gICAgc21wX2NvbmNhdGVuYXRlX3BlZXIocF9jYiwgJnAsIFNNUF9PUENPREVfUEFJUklOR19SU1ApOwotICB9IGVsc2UgewotICAgIC8qIGlhdCc6IGluaXRpYXRvcidzIChyZW1vdGUpIGFkZHJlc3MgdHlwZSAqLwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCByZW1vdGVfYmRfYWRkcl90eXBlKTsKLSAgICAvKiByYXQnOiByZXNwb25kZXIncyAobG9jYWwpIGFkZHJlc3MgdHlwZSAqLwotICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5hZGRyX3R5cGUpOwotICAgIC8qIHByZXEgOiBQYWlyaW5nIFJlcXVlc3QgKHJlbW90ZSkgY29tbWFuZCAqLwotICAgIHNtcF9jb25jYXRlbmF0ZV9wZWVyKHBfY2IsICZwLCBTTVBfT1BDT0RFX1BBSVJJTkdfUkVRKTsKLSAgICAvKiBwcmVzIDogUGFpcmluZyBSZXNwb25zZSAobG9jYWwpIGNvbW1hbmQgKi8KLSAgICBzbXBfY29uY2F0ZW5hdGVfbG9jYWwocF9jYiwgJnAsIFNNUF9PUENPREVfUEFJUklOR19SU1ApOwotICB9Ci0gIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9saXR0bGVfZW5kaWFuKHAxLCAicDEgPSBpYXQnIHx8IHJhdCcgfHwgcHJlcSB8fCBwcmVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwotCi0gIHJldHVybiBwMTsKLX0KLQotLyoqIEdlbmVyYXRlIENvbmZpcm0vQ29tcGFyZSBTdGVwMjoKLSAqICAgICAgICAgICAgICAgICAgcDIgPSAoTVNCKSBwYWRkaW5nIHx8IGlhIHx8IHJhIChMU0IpCi0gKiAgICAgICAgICAgICAgICAgIEZpbGwgdmFsdWVzIExTQiBmaXJzdCBhbmQgdGh1czoKLSAqICAgICAgICAgICAgICAgICAgcDIgPSByYSB8fCBpYSB8fCBwYWRkaW5nCi0gKi8KLU9jdGV0MTYgc21wX2dlbl9wMl80X2NvbmZpcm0odFNNUF9DQiogcF9jYiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBPY3RldDE2IHAyezB9OwotICB1aW50OF90KiBwID0gcDIuZGF0YSgpOwotICAvKiAzMi1iaXQgUGFkZGluZyAqLwotICBtZW1zZXQocCwgMCwgT0NURVQxNl9MRU4pOwotICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKSB7Ci0gICAgLyogcmEgOiBSZXNwb25kZXIncyAocmVtb3RlKSBhZGRyZXNzICovCi0gICAgQkRBRERSX1RPX1NUUkVBTShwLCByZW1vdGVfYmRhKTsKLSAgICAvKiBpYSA6IEluaXRpYXRvcidzIChsb2NhbCkgYWRkcmVzcyAqLwotICAgIEJEQUREUl9UT19TVFJFQU0ocCwgcF9jYi0+bG9jYWxfYmRhKTsKLSAgfSBlbHNlIHsKLSAgICAvKiByYSA6IFJlc3BvbmRlcidzIChsb2NhbCkgYWRkcmVzcyAqLwotICAgIEJEQUREUl9UT19TVFJFQU0ocCwgcF9jYi0+bG9jYWxfYmRhKTsKLSAgICAvKiBpYSA6IEluaXRpYXRvcidzIChyZW1vdGUpIGFkZHJlc3MgKi8KLSAgICBCREFERFJfVE9fU1RSRUFNKHAsIHJlbW90ZV9iZGEpOwotICB9Ci0gIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9saXR0bGVfZW5kaWFuKHAyLCAicDIgPSByYSB8fCBpYSB8fCBwYWRkaW5nIiwgMTYpOwotICByZXR1cm4gcDI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY2FsY3VsYXRlX2NvbWZpcm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gKGMxKSBpcyBjYWxsZWQgdG8gY2FsY3VsYXRlIENvbmZpcm0gdmFsdWUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0U01QX1NUQVRVUyBzdGF0dXMgb2YgY29uZmlybWF0aW9uIGNhbGN1bGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTTVBfU1RBVFVTIHNtcF9jYWxjdWxhdGVfY29tZmlybSh0U01QX0NCKiBwX2NiLCBjb25zdCBPY3RldDE2JiByYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIG91dHB1dCkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHRCTEVfQUREUl9UWVBFIHJlbW90ZV9iZF9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gIC8qIGdldCByZW1vdGUgY29ubmVjdGlvbiBzcGVjaWZpYyBibHVldG9vdGggYWRkcmVzcyAqLwotICBpZiAoIUJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIocF9jYi0+cGFpcmluZ19iZGEsIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVtb3RlX2JkX2FkZHJfdHlwZSkpIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzOiBjYW5ub3Qgb2J0YWluIHJlbW90ZSBkZXZpY2UgYWRkcmVzcyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gU01QX1BBSVJfRkFJTF9VTktOT1dOOwotICB9Ci0gIC8qIGdldCBsb2NhbCBjb25uZWN0aW9uIHNwZWNpZmljIGJsdWV0b290aCBhZGRyZXNzICovCi0gIEJUTV9SZWFkQ29ubmVjdGlvbkFkZHIocF9jYi0+cGFpcmluZ19iZGEsIHBfY2ItPmxvY2FsX2JkYSwgJnBfY2ItPmFkZHJfdHlwZSk7Ci0gIC8qIGdlbmVyYXRlIHAxID0gcHJlcyB8fCBwcmVxIHx8IHJhdCcgfHwgaWF0JyAqLwotICBPY3RldDE2IHAxID0gc21wX2dlbl9wMV80X2NvbmZpcm0ocF9jYiwgcmVtb3RlX2JkX2FkZHJfdHlwZSk7Ci0gIC8qIHAxJyA9IHJhbmQgWE9SIHAxICovCi0gIHNtcF94b3JfMTI4KCZwMSwgcmFuZCk7Ci0gIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9saXR0bGVfZW5kaWFuKHAxLCAicDEnID0gcDEgWE9SIHIiLCAxNik7Ci0gIC8qIGNhbGN1bGF0ZSBlMSA9IGUoaywgcDEnKSwgd2hlcmUgayA9IFRLICovCi0gIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9saXR0bGVfZW5kaWFuKHBfY2ItPnRrLmRhdGEoKSwgIlRLIiwgMTYpOwotICBPY3RldDE2IGUxID0gYWVzXzEyOChwX2NiLT50aywgcDEpOwotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihlMS5kYXRhKCksICJlMSA9IGUoaywgcDEnKSIsIDE2KTsKLSAgLyogZ2VuZXJhdGUgcDIgPSBwYWRkaW5nIHx8IGlhIHx8IHJhICovCi0gIE9jdGV0MTYgcDIgPSBzbXBfZ2VuX3AyXzRfY29uZmlybShwX2NiLCByZW1vdGVfYmRhKTsKLSAgLyogY2FsY3VsYXRlIHAyJyA9IChwMiBYT1IgZTEpICovCi0gIHNtcF94b3JfMTI4KCZwMiwgZTEpOwotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihwMiwgInAyJyA9IHAyIFhPUiBlMSIsIDE2KTsKLSAgLyogY2FsY3VsYXRlOiBjMSA9IGUoaywgcDInKSAqLwotICAqb3V0cHV0ID0gYWVzXzEyOChwX2NiLT50aywgcDIpOwotICByZXR1cm4gU01QX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfZ2VuZXJhdGVfY29uZmlybQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiByYW5kb20gbnVtYmVyIChNUmFuZCBvciBTUmFuZCkKLSAqICAgICAgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb250cm9sbGVyIGFuZCB0aGUgc3RhY2sgbmVlZHMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIGMxIHZhbHVlIChNQ29uZmlybSBvciBTQ29uZmlybSkgZm9yIHRoZSBmaXJzdCB0aW1lCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNtcF9nZW5lcmF0ZV9jb25maXJtKHRTTVBfQ0IqIHBfY2IpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4ocF9jYi0+cmFuZC5kYXRhKCksICJsb2NhbF9yYW5kIiwgMTYpOwotICBPY3RldDE2IG91dHB1dDsKLSAgdFNNUF9TVEFUVVMgc3RhdHVzID0gc21wX2NhbGN1bGF0ZV9jb21maXJtKHBfY2IsIHBfY2ItPnJhbmQsICZvdXRwdXQpOwotICBpZiAoc3RhdHVzICE9IFNNUF9TVUNDRVNTKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotICB0U01QX0tFWSBrZXk7Ci0gIHBfY2ItPmNvbmZpcm0gPSBvdXRwdXQ7Ci0gIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9saXR0bGVfZW5kaWFuKHBfY2ItPmNvbmZpcm0sICJMb2NhbCBDb25maXJtIGdlbmVyYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKLSAga2V5LmtleV90eXBlID0gU01QX0tFWV9UWVBFX0NGTTsKLSAga2V5LnBfZGF0YSA9IG91dHB1dC5kYXRhKCk7Ci0gIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICBzbXBfaW50X2RhdGEua2V5ID0ga2V5OwotICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0tFWV9SRUFEWV9FVlQsICZzbXBfaW50X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2dlbmVyYXRlX3NyYW5kX21yYW5kX2NvbmZpcm0KLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IHRoZSBzZWNvbmQgcGFpcmluZyBwaGFzZSBieQotICogICAgICAgICAgICAgICAgICBzdGFydCBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXIuCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9nZW5lcmF0ZV9zcmFuZF9tcmFuZF9jb25maXJtKHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotICAvKiBnZW5lcmF0ZSBNUmFuZCBvciBTUmFuZCAqLwotICBidHNuZF9oY2ljX2JsZV9yYW5kKEJpbmQoCi0gICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICBtZW1jcHkocF9jYi0+cmFuZC5kYXRhKCksIHJhbmQsIDgpOwotCi0gICAgICAgIC8qIGdlbmVyYXRlIDY0IE1TQiBvZiBNUmFuZCBvciBTUmFuZCAqLwotICAgICAgICBidHNuZF9oY2ljX2JsZV9yYW5kKEJpbmQoCi0gICAgICAgICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQqKSZwX2NiLT5yYW5kWzhdLCByYW5kLCBCVF9PQ1RFVDhfTEVOKTsKLSAgICAgICAgICAgICAgc21wX2dlbmVyYXRlX2NvbmZpcm0ocF9jYik7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgcF9jYikpOwotICAgICAgfSwKLSAgICAgIHBfY2IpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9nZW5lcmF0ZV9jb21wYXJlCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJhbmRvbSBudW1iZXIgKE1SYW5kIG9yIFNSYW5kKQotICogICAgICAgICAgICAgICAgICBpcyByZWNlaXZlZCBmcm9tIHJlbW90ZSBkZXZpY2UgYW5kIHRoZSBjMSB2YWx1ZSAoTUNvbmZpcm0KLSAqICAgICAgICAgICAgICAgICAgb3IgU0NvbmZpcm0pIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCB0byBhdXRoZW50aWNhdGUgcmVtb3RlCi0gKiAgICAgICAgICAgICAgICAgIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfZ2VuZXJhdGVfY29tcGFyZSh0U01QX0NCKiBwX2NiLCBVTlVTRURfQVRUUiB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCJzbXBfZ2VuZXJhdGVfY29tcGFyZSAiKTsKLSAgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4ocF9jYi0+cnJhbmQsICJwZWVyIHJhbmQiLCAxNik7Ci0gIE9jdGV0MTYgb3V0cHV0OwotICB0U01QX1NUQVRVUyBzdGF0dXMgPSBzbXBfY2FsY3VsYXRlX2NvbWZpcm0ocF9jYiwgcF9jYi0+cnJhbmQsICZvdXRwdXQpOwotICBpZiAoc3RhdHVzICE9IFNNUF9TVUNDRVNTKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IHN0YXR1czsKLSAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICAgIHJldHVybjsKLSAgfQotICB0U01QX0tFWSBrZXk7Ci0gIHNtcF9kZWJ1Z19wcmludF9uYnl0ZV9saXR0bGVfZW5kaWFuKG91dHB1dC5kYXRhKCksICJSZW1vdGUgQ29uZmlybSBnZW5lcmF0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7Ci0gIGtleS5rZXlfdHlwZSA9IFNNUF9LRVlfVFlQRV9DTVA7Ci0gIGtleS5wX2RhdGEgPSBvdXRwdXQuZGF0YSgpOwotICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgc21wX2ludF9kYXRhLmtleSA9IGtleTsKLSAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9LRVlfUkVBRFlfRVZULCAmc21wX2ludF9kYXRhKTsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gU1RLIGlzIGdlbmVyYXRlZCBwcm9jZWVkIHRvIHNlbmQgdGhlIGVuY3J5cHQKLSAqIHRoZSBsaW5rIHVzaW5nIFNUSy4gKi8KLXN0YXRpYyB2b2lkIHNtcF9wcm9jZXNzX3N0ayh0U01QX0NCKiBwX2NiLCBPY3RldDE2KiBwKSB7Ci0gIHRTTVBfS0VZIGtleTsKLQotICBTTVBfVFJBQ0VfREVCVUcoInNtcF9wcm9jZXNzX3N0ayAiKTsKLSAgc21wX21hc2tfZW5jX2tleShwX2NiLT5sb2NfZW5jX3NpemUsIHApOwotCi0gIGtleS5rZXlfdHlwZSA9IFNNUF9LRVlfVFlQRV9TVEs7Ci0gIGtleS5wX2RhdGEgPSBwLT5kYXRhKCk7Ci0KLSAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gIHNtcF9pbnRfZGF0YS5rZXkgPSBrZXk7Ci0gIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfS0VZX1JFQURZX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci19Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgRURJViA9IFkgeG9yIERJViAqLwotc3RhdGljIHZvaWQgc21wX3Byb2Nlc3NfZWRpdih0U01QX0NCKiBwX2NiLCBPY3RldDE2JiBwKSB7Ci0gIHRTTVBfS0VZIGtleTsKLSAgdWludDhfdCogcHAgPSBwLmRhdGEoKTsKLSAgdWludDE2X3QgeTsKLQotICBTTVBfVFJBQ0VfREVCVUcoInNtcF9wcm9jZXNzX2VkaXYgIik7Ci0gIFNUUkVBTV9UT19VSU5UMTYoeSwgcHApOwotCi0gIC8qIEVESVYgPSBZIHhvciBESVYgKi8KLSAgcF9jYi0+ZWRpdiA9IHBfY2ItPmRpdiBeIHk7Ci0gIC8qIHNlbmQgTFRLIHJlYWR5ICovCi0gIFNNUF9UUkFDRV9FUlJPUigiTFRLIHJlYWR5Iik7Ci0gIGtleS5rZXlfdHlwZSA9IFNNUF9LRVlfVFlQRV9MVEs7Ci0gIGtleS5wX2RhdGEgPSBwLmRhdGEoKTsKLQotICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgc21wX2ludF9kYXRhLmtleSA9IGtleTsKLSAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9LRVlfUkVBRFlfRVZULCAmc21wX2ludF9kYXRhKTsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHByb2NlZWQgZ2VuZXJhdGUgWSA9IEUoREhLLCBSYW5kKQotICovCi1zdGF0aWMgdm9pZCBzbXBfZ2VuZXJhdGVfeSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICBTTVBfVFJBQ0VfREVCVUcoIiVzICIsIF9fZnVuY19fKTsKLQotICBjb25zdCBPY3RldDE2JiBkaGsgPSBCVE1fR2V0RGV2aWNlREhLKCk7Ci0KLSAgbWVtY3B5KHBfY2ItPmVuY19yYW5kLCByYW5kLCBCVF9PQ1RFVDhfTEVOKTsKLSAgT2N0ZXQxNiBvdXRwdXQgPSBhZXNfMTI4KGRoaywgcmFuZCwgQlRfT0NURVQ4X0xFTik7Ci0gIHNtcF9wcm9jZXNzX2VkaXYocF9jYiwgb3V0cHV0KTsKLX0KLQotLyoqCi0gKiBDYWxjdWxhdGUgTFRLID0gZDEoRVIsIERJViwgMCk9IGUoRVIsIERJVikKLSAqLwotc3RhdGljIHZvaWQgc21wX2dlbmVyYXRlX2x0a19jb250KHVpbnQxNl90IGRpdiwgdFNNUF9DQiogcF9jYikgewotICBwX2NiLT5kaXYgPSBkaXY7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgY29uc3QgT2N0ZXQxNiYgZXIgPSBCVE1fR2V0RGV2aWNlRW5jUm9vdCgpOwotCi0gIC8qIExUSyA9IGQxKEVSLCBESVYsIDApPSBlKEVSLCBESVYpKi8KLSAgT2N0ZXQxNiBsdGsgPSBhZXNfMTI4KGVyLCAodWludDhfdCopJnBfY2ItPmRpdiwgc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIC8qIG1hc2sgdGhlIExUSyAqLwotICBzbXBfbWFza19lbmNfa2V5KHBfY2ItPmxvY19lbmNfc2l6ZSwgJmx0ayk7Ci0gIHBfY2ItPmx0ayA9IGx0azsKLQotICAvKiBnZW5lcmF0ZSBFRElWIGFuZCByYW5kIG5vdyAqLwotICBidHNuZF9oY2ljX2JsZV9yYW5kKEJpbmQoJnNtcF9nZW5lcmF0ZV95LCBwX2NiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfZ2VuZXJhdGVfbHRrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZDoKLSAqICAgICAgICAgICAgICAgICAgLSBpbiBsZWdhY3kgcGFpcmluZyAtIHRvIGNhbGN1bGF0ZSBMVEssIHN0YXJ0aW5nIHdpdGggRElWCi0gKiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgLSBpbiBMRSBTZWN1cmUgQ29ubmVjdGlvbnMgcGFpcmluZyBvdmVyIExFIHRyYW5zcG9ydCAtIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBMVEsgYWxyZWFkeSBnZW5lcmF0ZWQgdG8gZW5jcnlwdCBMRSBsaW5rOwotICogICAgICAgICAgICAgICAgICAtIGluIExFIFNlY3VyZSBDb25uZWN0aW9ucyBwYWlyaW5nIG92ZXIgQlIvRURSIHRyYW5zcG9ydCAtCi0gKiAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQgQlIvRURSIExpbmsgS2V5IHByb2Nlc3NpbmcuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2dlbmVyYXRlX2x0ayh0U01QX0NCKiBwX2NiLCBVTlVTRURfQVRUUiB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocF9jYi0+c21wX292ZXJfYnIpIHsKLSAgICBzbXBfYnJfcHJvY2Vzc19saW5rX2tleShwX2NiLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAocF9jYi0+bGVfc2VjdXJlX2Nvbm5lY3Rpb25zX21vZGVfaXNfdXNlZCkgewotICAgIHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX2xvbmdfdGVybV9rZXkoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGRpdl9zdGF0dXMgPSBidG1fZ2V0X2xvY2FsX2RpdihwX2NiLT5wYWlyaW5nX2JkYSwgJnBfY2ItPmRpdik7Ci0KLSAgaWYgKGRpdl9zdGF0dXMpIHsKLSAgICBzbXBfZ2VuZXJhdGVfbHRrX2NvbnQocF9jYi0+ZGl2LCBwX2NiKTsKLSAgfSBlbHNlIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIiVzOiBHZW5lcmF0ZSBESVYgZm9yIExUSyIsIF9fZnVuY19fKTsKLQotICAgIC8qIGdlbmVyYXRlIE1SYW5kIG9yIFNSYW5kICovCi0gICAgYnRzbmRfaGNpY19ibGVfcmFuZChCaW5kKAotICAgICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICAgIHVpbnQxNl90IGRpdjsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGRpdiwgcmFuZCk7Ci0gICAgICAgICAgc21wX2dlbmVyYXRlX2x0a19jb250KGRpdiwgcF9jYik7Ci0gICAgICAgIH0sCi0gICAgICAgIHBfY2IpKTsKLSAgfQotfQotCi0vKiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBsZWdhY3kgU1RLICovCi1PY3RldDE2IHNtcF9jYWxjdWxhdGVfbGVnYWN5X3Nob3J0X3Rlcm1fa2V5KHRTTVBfQ0IqIHBfY2IpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBPY3RldDE2IHRleHR7MH07Ci0gIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICBtZW1jcHkodGV4dC5kYXRhKCksIHBfY2ItPnJhbmQuZGF0YSgpLCBCVF9PQ1RFVDhfTEVOKTsKLSAgICBtZW1jcHkodGV4dC5kYXRhKCkgKyBCVF9PQ1RFVDhfTEVOLCBwX2NiLT5ycmFuZC5kYXRhKCksIEJUX09DVEVUOF9MRU4pOwotICB9IGVsc2UgewotICAgIG1lbWNweSh0ZXh0LmRhdGEoKSwgcF9jYi0+cnJhbmQuZGF0YSgpLCBCVF9PQ1RFVDhfTEVOKTsKLSAgICBtZW1jcHkodGV4dC5kYXRhKCkgKyBCVF9PQ1RFVDhfTEVOLCBwX2NiLT5yYW5kLmRhdGEoKSwgQlRfT0NURVQ4X0xFTik7Ci0gIH0KLQotICAvKiBnZW5lcmF0ZSBTVEsgPSBFdGsocmFuZHxycmFuZCkqLwotICByZXR1cm4gYWVzXzEyOChwX2NiLT50aywgdGV4dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY3JlYXRlX3ByaXZhdGVfa2V5Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjcmVhdGUgcHJpdmF0ZSBrZXkgdXNlZCB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgcHVibGljIGtleSBhbmQgREhLZXkuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBzdGFydHMgcHJpdmF0ZSBrZXkgY3JlYXRpb24gcmVxdWVzdGluZwotICogICAgICAgICAgICAgICAgICBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gZ2VuZXJhdGUgWzAtN10gb2N0ZXRzIG9mIHByaXZhdGUga2V5LgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9jcmVhdGVfcHJpdmF0ZV9rZXkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgLy8gT25seSB1c2UgdGhlIHN0b3JlZCBPT0IgZGF0YSBpZiB3ZSBhcmUgaW4gYW4gb29iIGFzc29jaWF0aW9uIG1vZGVsCi0gIGlmIChwX2NiLT5zZWxlY3RlZF9hc3NvY2lhdGlvbl9tb2RlbCA9PSBTTVBfTU9ERUxfU0VDX0NPTk5fT09CKSB7Ci0gICAgTE9HX1dBUk4oIk9PQiBBc3NvY2lhdGlvbiBNb2RlbCIpOwotICAgIC8vIE1ha2Ugc3VyZSBvdXIgZGF0YSBpc24ndCBlbXB0eSwgb3RoZXJ3aXNlIHdlIGdlbmVyYXRlIG5ldyBhbmQgZXZlbnR1YWxseQotICAgIC8vIHBhaXJpbmcgd2lsbCBmYWlsIE5vdCBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdCBhdCB0aGlzIHBvaW50LCBqdXN0IGhhdmUgdG8KLSAgICAvLyBnZW5lcmF0ZSBuZXcgZGF0YSBUaGUgZGF0YSB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgdGhlIGFkdmVydGlzZXIgdGltZXMKLSAgICAvLyBvdXQsIHNvIGlmIHRoZSBhZHZlcnRpc2VyIHRpbWVzIG91dCB3ZSB3YW50IHRoZSBwYWlyaW5nIHRvIGZhaWwgYW55d2F5LgotICAgIGlmICghaXNfZW1wdHkoJnNhdmVkX2xvY2FsX29vYl9kYXRhKSkgewotICAgICAgTE9HX1dBUk4oIkZvdW5kIE9PQiBkYXRhLCBsb2FkaW5nIGtleXMiKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlRfT0NURVQzMl9MRU47IGkrKykgewotICAgICAgICBwX2NiLT5wcml2YXRlX2tleVtpXSA9IHNhdmVkX2xvY2FsX29vYl9kYXRhLnByaXZhdGVfa2V5X3VzZWRbaV07Ci0gICAgICAgIHBfY2ItPmxvY19wdWJsX2tleS54W2ldID0gc2F2ZWRfbG9jYWxfb29iX2RhdGEucHVibF9rZXlfdXNlZC54W2ldOwotICAgICAgICBwX2NiLT5sb2NfcHVibF9rZXkueVtpXSA9IHNhdmVkX2xvY2FsX29vYl9kYXRhLnB1Ymxfa2V5X3VzZWQueVtpXTsKLSAgICAgIH0KLSAgICAgIHBfY2ItPnNjX29vYl9kYXRhLmxvY19vb2JfZGF0YSA9IHNhdmVkX2xvY2FsX29vYl9kYXRhOwotICAgICAgcF9jYi0+bG9jYWxfcmFuZG9tID0gc2F2ZWRfbG9jYWxfb29iX2RhdGEucmFuZG9taXplcjsKLSAgICAgIHNtcF9wcm9jZXNzX3ByaXZhdGVfa2V5KHBfY2IpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0dfV0FSTigiT09CIEFzc29jaWF0aW9uIE1vZGVsIHdpdGggbm8gc2F2ZWQgZGF0YSBwcmVzZW50Iik7Ci0gIH0KLQotICBidHNuZF9oY2ljX2JsZV9yYW5kKEJpbmQoCi0gICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICBtZW1jcHkoKHZvaWQqKXBfY2ItPnByaXZhdGVfa2V5LCByYW5kLCBCVF9PQ1RFVDhfTEVOKTsKLSAgICAgICAgYnRzbmRfaGNpY19ibGVfcmFuZChCaW5kKAotICAgICAgICAgICAgW10odFNNUF9DQiogcF9jYiwgQlRfT0NURVQ4IHJhbmQpIHsKLSAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkKikmcF9jYi0+cHJpdmF0ZV9rZXlbOF0sIHJhbmQsIEJUX09DVEVUOF9MRU4pOwotICAgICAgICAgICAgICBidHNuZF9oY2ljX2JsZV9yYW5kKEJpbmQoCi0gICAgICAgICAgICAgICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQqKSZwX2NiLT5wcml2YXRlX2tleVsxNl0sIHJhbmQsIEJUX09DVEVUOF9MRU4pOwotICAgICAgICAgICAgICAgICAgICBidHNuZF9oY2ljX2JsZV9yYW5kKEJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBbXSh0U01QX0NCKiBwX2NiLCBCVF9PQ1RFVDggcmFuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQqKSZwX2NiLT5wcml2YXRlX2tleVsyNF0sIHJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9PQ1RFVDhfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc21wX3Byb2Nlc3NfcHJpdmF0ZV9rZXkocF9jYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgcF9jYikpOwotICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgIHBfY2IpKTsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBwX2NiKSk7Ci0gICAgICB9LAotICAgICAgcF9jYikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3VzZV9vb2JfcHJpdmF0ZV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCi0gKiAgICAgICAgICAgICAgICAgIC0gdG8gc2F2ZSB0aGUgc2VjcmV0IGtleSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcHVibGljIGtleQotICogICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gY2FsY3VsYXRpb25zIG9mIGNvbW1pdG1lbnQgc2VudCBPT0IgdG8gYSBwZWVyCi0gKiAgICAgICAgICAgICAgICAgIC0gdG8gdXNlIHRoaXMgc2VjcmV0IGtleSB0byByZWNhbGN1bGF0ZSB0aGUgcHVibGljIGtleSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICBzdGFydCB0aGUgcHJvY2VzcyBvZiBzZW5kaW5nIHRoaXMgcHVibGljIGtleSB0byB0aGUgcGVlcgotICogICAgICAgICAgICAgICAgICBpZiBzZWNyZXQvcHVibGljIGtleXMgaGF2ZSB0byBiZSByZXVzZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHRoZSBrZXlzIGFyZW4ndCBzdXBwb3NlZCB0byBiZSByZXVzZWQsIGNvbnRpbnVlIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgIHBvaW50IGZyb20gd2hpY2ggcmVxdWVzdCBmb3IgT09CIGRhdGEgd2FzIGlzc3VlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfdXNlX29vYl9wcml2YXRlX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgTE9HX0lORk8oInJlcV9vb2JfdHlwZTogJWQsIHJvbGU6ICVkIiwgcF9jYi0+cmVxX29vYl90eXBlLCBwX2NiLT5yb2xlKTsKLQotICBzd2l0Y2ggKHBfY2ItPnJlcV9vb2JfdHlwZSkgewotICAgIGNhc2UgU01QX09PQl9CT1RIOgotICAgIGNhc2UgU01QX09PQl9MT0NBTDoKLSAgICAgIExPR19JTkZPKCJyZXN0b3JlIHNlY3JldCBrZXkiKTsKLSAgICAgIC8vIE9ubHkgdXNlIHRoZSBzdG9yZWQgT09CIGRhdGEgaWYgd2UgYXJlIGluIGFuIG9vYiBhc3NvY2lhdGlvbiBtb2RlbAotICAgICAgaWYgKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsID09IFNNUF9NT0RFTF9TRUNfQ09OTl9PT0IpIHsKLSAgICAgICAgTE9HX0lORk8oIk9PQiBBc3NvY2lhdGlvbiBNb2RlbCIpOwotICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIGRhdGEgaXNuJ3QgZW1wdHksIG90aGVyd2lzZSB3ZSBnZW5lcmF0ZSBuZXcgYW5kCi0gICAgICAgIC8vIGV2ZW50dWFsbHkgcGFpcmluZyB3aWxsIGZhaWwgTm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IGl0IGF0IHRoaXMKLSAgICAgICAgLy8gcG9pbnQsIGp1c3QgaGF2ZSB0byBnZW5lcmF0ZSBuZXcgZGF0YSBUaGUgZGF0YSB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIKLSAgICAgICAgLy8gdGhlIGFkdmVydGlzZXIgdGltZXMgb3V0LCBzbyBpZiB0aGUgYWR2ZXJ0aXNlciB0aW1lcyBvdXQgd2Ugd2FudCB0aGUKLSAgICAgICAgLy8gcGFpcmluZyB0byBmYWlsIGFueXdheS4KLSAgICAgICAgaWYgKCFpc19lbXB0eSgmc2F2ZWRfbG9jYWxfb29iX2RhdGEpKSB7Ci0gICAgICAgICAgTE9HX0lORk8oIkZvdW5kIE9PQiBkYXRhLCBsb2FkaW5nIGtleXMiKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJUX09DVEVUMzJfTEVOOyBpKyspIHsKLSAgICAgICAgICAgIHBfY2ItPnByaXZhdGVfa2V5W2ldID0gc2F2ZWRfbG9jYWxfb29iX2RhdGEucHJpdmF0ZV9rZXlfdXNlZFtpXTsKLSAgICAgICAgICAgIHBfY2ItPmxvY19wdWJsX2tleS54W2ldID0gc2F2ZWRfbG9jYWxfb29iX2RhdGEucHVibF9rZXlfdXNlZC54W2ldOwotICAgICAgICAgICAgcF9jYi0+bG9jX3B1Ymxfa2V5LnlbaV0gPSBzYXZlZF9sb2NhbF9vb2JfZGF0YS5wdWJsX2tleV91c2VkLnlbaV07Ci0gICAgICAgICAgfQotICAgICAgICAgIHBfY2ItPnNjX29vYl9kYXRhLmxvY19vb2JfZGF0YSA9IHNhdmVkX2xvY2FsX29vYl9kYXRhOwotICAgICAgICAgIHBfY2ItPmxvY2FsX3JhbmRvbSA9IHNhdmVkX2xvY2FsX29vYl9kYXRhLnJhbmRvbWl6ZXI7Ci0gICAgICAgICAgc21wX3Byb2Nlc3NfcHJpdmF0ZV9rZXkocF9jYik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExPR19JTkZPKCJPT0IgQXNzb2NpYXRpb24gTW9kZWwgd2l0aCBubyBzYXZlZCBkYXRhIHByZXNlbnQiKTsKLSAgICAgIH0KLQotICAgICAgbWVtY3B5KHBfY2ItPnByaXZhdGVfa2V5LCBwX2NiLT5zY19vb2JfZGF0YS5sb2Nfb29iX2RhdGEucHJpdmF0ZV9rZXlfdXNlZCwKLSAgICAgICAgICAgICBCVF9PQ1RFVDMyX0xFTik7Ci0gICAgICBzbXBfcHJvY2Vzc19wcml2YXRlX2tleShwX2NiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfSU5GTygiY3JlYXRlIHNlY3JldCBrZXkgYW5ldyIpOwotICAgICAgc21wX3NldF9zdGF0ZShTTVBfU1RBVEVfUEFJUl9SRVFfUlNQKTsKLSAgICAgIHNtcF9kZWNpZGVfYXNzb2NpYXRpb25fbW9kZWwocF9jYiwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3Byb2Nlc3NfcHJpdmF0ZV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHByaXZhdGUga2V5LgotICogICAgICAgICAgICAgICAgICBJdCBjYWxjdWxhdGVzIHB1YmxpYyBrZXkgYW5kIG5vdGlmaWVzIFNNIHRoYXQgcHJpdmF0ZSBrZXkgLwotICogICAgICAgICAgICAgICAgICBwdWJsaWMga2V5IHBhaXIgaXMgY3JlYXRlZC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcHJvY2Vzc19wcml2YXRlX2tleSh0U01QX0NCKiBwX2NiKSB7Ci0gIFBvaW50IHB1YmxpY19rZXk7Ci0gIEJUX09DVEVUMzIgcHJpdmF0ZV9rZXk7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBtZW1jcHkocHJpdmF0ZV9rZXksIHBfY2ItPnByaXZhdGVfa2V5LCBCVF9PQ1RFVDMyX0xFTik7Ci0gIEVDQ19Qb2ludE11bHQoJnB1YmxpY19rZXksICYoY3VydmVfcDI1Ni5HKSwgKHVpbnQzMl90Kilwcml2YXRlX2tleSk7Ci0gIG1lbWNweShwX2NiLT5sb2NfcHVibF9rZXkueCwgcHVibGljX2tleS54LCBCVF9PQ1RFVDMyX0xFTik7Ci0gIG1lbWNweShwX2NiLT5sb2NfcHVibF9rZXkueSwgcHVibGljX2tleS55LCBCVF9PQ1RFVDMyX0xFTik7Ci0KLSAgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4ocF9jYi0+cHJpdmF0ZV9rZXksICJwcml2YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT0NURVQzMl9MRU4pOwotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihwX2NiLT5sb2NfcHVibF9rZXkueCwgImxvY2FsIHB1YmxpYyh4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX09DVEVUMzJfTEVOKTsKLSAgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4ocF9jYi0+bG9jX3B1Ymxfa2V5LnksICJsb2NhbCBwdWJsaWMoeSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9PQ1RFVDMyX0xFTik7Ci0gIHBfY2ItPmZsYWdzIHw9IFNNUF9QQUlSX0ZMQUdfSEFWRV9MT0NBTF9QVUJMX0tFWTsKLSAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9MT0NfUFVCTF9LRVlfQ1JURF9FVlQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2NvbXB1dGVfZGhrZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbjoKLSAqICAgICAgICAgICAgICAgICAgLSBjYWxjdWxhdGVzIGEgbmV3IHB1YmxpYyBrZXkgdXNpbmcgYXMgaW5wdXQgbG9jYWwgcHJpdmF0ZQotICogICAgICAgICAgICAgICAgICAgIGtleSBhbmQgcGVlciBwdWJsaWMga2V5OwotICogICAgICAgICAgICAgICAgICAtIHNhdmVzIHRoZSBuZXcgcHVibGljIGtleSB4LWNvb3JkaW5hdGUgYXMgREhLZXkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NvbXB1dGVfZGhrZXkodFNNUF9DQiogcF9jYikgewotICBQb2ludCBwZWVyX3B1Ymxfa2V5LCBuZXdfcHVibF9rZXk7Ci0gIEJUX09DVEVUMzIgcHJpdmF0ZV9rZXk7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBtZW1jcHkocHJpdmF0ZV9rZXksIHBfY2ItPnByaXZhdGVfa2V5LCBCVF9PQ1RFVDMyX0xFTik7Ci0gIG1lbWNweShwZWVyX3B1Ymxfa2V5LngsIHBfY2ItPnBlZXJfcHVibF9rZXkueCwgQlRfT0NURVQzMl9MRU4pOwotICBtZW1jcHkocGVlcl9wdWJsX2tleS55LCBwX2NiLT5wZWVyX3B1Ymxfa2V5LnksIEJUX09DVEVUMzJfTEVOKTsKLQotICBFQ0NfUG9pbnRNdWx0KCZuZXdfcHVibF9rZXksICZwZWVyX3B1Ymxfa2V5LCAodWludDMyX3QqKXByaXZhdGVfa2V5KTsKLQotICBtZW1jcHkocF9jYi0+ZGhrZXksIG5ld19wdWJsX2tleS54LCBCVF9PQ1RFVDMyX0xFTik7Ci0KLSAgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4ocF9jYi0+ZGhrZXksICJPbGQgREhLZXkiLCBCVF9PQ1RFVDMyX0xFTik7Ci0KLSAgc21wX2RlYnVnX3ByaW50X25ieXRlX2xpdHRsZV9lbmRpYW4ocF9jYi0+cHJpdmF0ZV9rZXksICJwcml2YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT0NURVQzMl9MRU4pOwotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihwX2NiLT5wZWVyX3B1Ymxfa2V5LngsICJyZW0gcHVibGljKHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT0NURVQzMl9MRU4pOwotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihwX2NiLT5wZWVyX3B1Ymxfa2V5LnksICJyZW0gcHVibGljKHkpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT0NURVQzMl9MRU4pOwotICBzbXBfZGVidWdfcHJpbnRfbmJ5dGVfbGl0dGxlX2VuZGlhbihwX2NiLT5kaGtleSwgIlJldmVydGVkIERIS2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT0NURVQzMl9MRU4pOwotfQotCi0vKiogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYW5kIHNhdmVzIGxvY2FsIGNvbW1taXRtZW50IGluIENCLiAqLwotdm9pZCBzbXBfY2FsY3VsYXRlX2xvY2FsX2NvbW1pdG1lbnQodFNNUF9DQiogcF9jYikgewotICB1aW50OF90IHJhbmRvbV9pbnB1dDsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHN3aXRjaCAocF9jYi0+c2VsZWN0ZWRfYXNzb2NpYXRpb25fbW9kZWwpIHsKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1M6Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fTlVNX0NPTVA6Ci0gICAgICBpZiAocF9jYi0+cm9sZSA9PSBIQ0lfUk9MRV9DRU5UUkFMKQotICAgICAgICBTTVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgICAgICJsb2NhbCBjb21taXRtZW50IGNhbGMgb24gY2VudHJhbCBpcyBub3QgZXhwZWN0ZWQgIgotICAgICAgICAgICAgImZvciBKdXN0IFdvcmtzL051bWVyaWMgQ29tcGFyaXNvbiBtb2RlbHMiKTsKLSAgICAgIHBfY2ItPmNvbW1pdG1lbnQgPSBjcnlwdG9fdG9vbGJveDo6ZjQoCi0gICAgICAgICAgcF9jYi0+bG9jX3B1Ymxfa2V5LngsIHBfY2ItPnBlZXJfcHVibF9rZXkueCwgcF9jYi0+cmFuZCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0VOVDoKLSAgICBjYXNlIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1A6Ci0gICAgICByYW5kb21faW5wdXQgPQotICAgICAgICAgIHNtcF9jYWxjdWxhdGVfcmFuZG9tX2lucHV0KHBfY2ItPmxvY2FsX3JhbmRvbS5kYXRhKCksIHBfY2ItPnJvdW5kKTsKLSAgICAgIHBfY2ItPmNvbW1pdG1lbnQgPQotICAgICAgICAgIGNyeXB0b190b29sYm94OjpmNChwX2NiLT5sb2NfcHVibF9rZXkueCwgcF9jYi0+cGVlcl9wdWJsX2tleS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5yYW5kLCByYW5kb21faW5wdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fT09COgotICAgICAgU01QX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgImxvY2FsIGNvbW1pdG1lbnQgY2FsYyBpcyBleHBlY3RlZCBmb3IgT09CIG1vZGVsIEJFRk9SRSBwYWlyaW5nIik7Ci0gICAgICBwX2NiLT5jb21taXRtZW50ID0gY3J5cHRvX3Rvb2xib3g6OmY0KAotICAgICAgICAgIHBfY2ItPmxvY19wdWJsX2tleS54LCBwX2NiLT5sb2NfcHVibF9rZXkueCwgcF9jYi0+bG9jYWxfcmFuZG9tLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTTVBfVFJBQ0VfRVJST1IoIkFzc29jaWF0aW9uIE1vZGVsID0gJWQgaXMgbm90IHVzZWQgaW4gTEUgU0MiLAotICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsKTsKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIFNNUF9UUkFDRV9FVkVOVCgibG9jYWwgY29tbWl0bWVudCBjYWxjdWxhdGlvbiBpcyBjb21wbGV0ZWQiKTsKLX0KLQotLyoqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHBlZXIgY29tbW1pdG1lbnQgKi8KLU9jdGV0MTYgc21wX2NhbGN1bGF0ZV9wZWVyX2NvbW1pdG1lbnQodFNNUF9DQiogcF9jYikgewotICB1aW50OF90IHJpOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIE9jdGV0MTYgb3V0cHV0OwotICBzd2l0Y2ggKHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsKSB7Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTOgotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX05VTV9DT01QOgotICAgICAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfUEVSSVBIRVJBTCkKLSAgICAgICAgU01QX1RSQUNFX1dBUk5JTkcoCi0gICAgICAgICAgICAicGVlciBjb21taXRtZW50IGNhbGMgb24gcGVyaXBoZXJhbCBpcyBub3QgZXhwZWN0ZWQgIgotICAgICAgICAgICAgImZvciBKdXN0IFdvcmtzL051bWVyaWMgQ29tcGFyaXNvbiBtb2RlbHMiKTsKLSAgICAgIG91dHB1dCA9IGNyeXB0b190b29sYm94OjpmNChwX2NiLT5wZWVyX3B1Ymxfa2V5LngsIHBfY2ItPmxvY19wdWJsX2tleS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnJyYW5kLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5UOgotICAgIGNhc2UgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRElTUDoKLSAgICAgIHJpID0gc21wX2NhbGN1bGF0ZV9yYW5kb21faW5wdXQocF9jYi0+cGVlcl9yYW5kb20uZGF0YSgpLCBwX2NiLT5yb3VuZCk7Ci0gICAgICBvdXRwdXQgPSBjcnlwdG9fdG9vbGJveDo6ZjQocF9jYi0+cGVlcl9wdWJsX2tleS54LCBwX2NiLT5sb2NfcHVibF9rZXkueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5ycmFuZCwgcmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTTVBfTU9ERUxfU0VDX0NPTk5fT09COgotICAgICAgb3V0cHV0ID0gY3J5cHRvX3Rvb2xib3g6OmY0KHBfY2ItPnBlZXJfcHVibF9rZXkueCwgcF9jYi0+cGVlcl9wdWJsX2tleS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnBlZXJfcmFuZG9tLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTTVBfVFJBQ0VfRVJST1IoIkFzc29jaWF0aW9uIE1vZGVsID0gJWQgaXMgbm90IHVzZWQgaW4gTEUgU0MiLAotICAgICAgICAgICAgICAgICAgICAgIHBfY2ItPnNlbGVjdGVkX2Fzc29jaWF0aW9uX21vZGVsKTsKLSAgICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICBTTVBfVFJBQ0VfRVZFTlQoInBlZXIgY29tbWl0bWVudCBjYWxjdWxhdGlvbiBpcyBjb21wbGV0ZWQiKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jYWxjdWxhdGVfbnVtZXJpY19jb21wYXJpc29uX2Rpc3BsYXlfbnVtYmVyCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbmQgc2F2ZXMgbnVtYmVyIHRvIGRpc3BsYXkgaW4KLSAqICAgICAgICAgICAgICAgICAgbnVtZXJpYyBjb21wYXJpc29uIGFzc29jaWF0aW9uIG1vZGUuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NhbGN1bGF0ZV9udW1lcmljX2NvbXBhcmlzb25fZGlzcGxheV9udW1iZXIodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgIHBfY2ItPm51bWJlcl90b19kaXNwbGF5ID0gY3J5cHRvX3Rvb2xib3g6OmcyKAotICAgICAgICBwX2NiLT5sb2NfcHVibF9rZXkueCwgcF9jYi0+cGVlcl9wdWJsX2tleS54LCBwX2NiLT5yYW5kLCBwX2NiLT5ycmFuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcF9jYi0+bnVtYmVyX3RvX2Rpc3BsYXkgPSBjcnlwdG9fdG9vbGJveDo6ZzIoCi0gICAgICAgIHBfY2ItPnBlZXJfcHVibF9rZXkueCwgcF9jYi0+bG9jX3B1Ymxfa2V5LngsIHBfY2ItPnJyYW5kLCBwX2NiLT5yYW5kKTsKLSAgfQotCi0gIGlmIChwX2NiLT5udW1iZXJfdG9fZGlzcGxheSA+PSAoQlRNX01BWF9QQVNTS0VZX1ZBTCArIDEpKSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9QQUlSX0ZBSUxfVU5LTk9XTjsKLSAgICBwX2NiLT5mYWlsdXJlID0gU01QX1BBSVJfRkFJTF9VTktOT1dOOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCJOdW1iZXIgdG8gZGlzcGxheSBpbiBudW1lcmljIGNvbXBhcmlzb24gPSAlZCIsCi0gICAgICAgICAgICAgICAgICBwX2NiLT5udW1iZXJfdG9fZGlzcGxheSk7Ci0gIHBfY2ItPmNiX2V2dCA9IFNNUF9OQ19SRVFfRVZUOwotICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgc21wX2ludF9kYXRhLnBhc3NrZXkgPSBwX2NiLT5udW1iZXJfdG9fZGlzcGxheTsKLSAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9TQ19EU1BMX05DX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jYWxjdWxhdGVfbG9jYWxfZGhrZXlfY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGFuZCBzYXZlcyBsb2NhbCBkZXZpY2UgREhLZXkgY2hlY2sKLSAqICAgICAgICAgICAgICAgICAgdmFsdWUgaW4gQ0IuCi0gKiAgICAgICAgICAgICAgICAgIEJlZm9yZSBkb2luZyB0aGlzIGl0IGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgIHNtcF9jYWxjdWxhdGVfZjVfbWFja2V5X2FuZF9sb25nX3Rlcm1fa2V5KC4uLikuCi0gKiAgICAgICAgICAgICAgICAgIHRvIGNhbGN1bGF0ZSBNYWNLZXkgYW5kIExUSy4KLSAqICAgICAgICAgICAgICAgICAgTWFjS2V5IGlzIHVzZWQgaW4gZGhrZXkgY2FsY3VsYXRpb24uCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NhbGN1bGF0ZV9sb2NhbF9kaGtleV9jaGVjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCBpb2NhcFszXSwgYVs3XSwgYls3XTsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHNtcF9jYWxjdWxhdGVfZjVfbWFja2V5X2FuZF9sb25nX3Rlcm1fa2V5KHBfY2IpOwotCi0gIHNtcF9jb2xsZWN0X2xvY2FsX2lvX2NhcGFiaWxpdGllcyhpb2NhcCwgcF9jYik7Ci0KLSAgc21wX2NvbGxlY3RfbG9jYWxfYmxlX2FkZHJlc3MoYSwgcF9jYik7Ci0gIHNtcF9jb2xsZWN0X3BlZXJfYmxlX2FkZHJlc3MoYiwgcF9jYik7Ci0gIHBfY2ItPmRoa2V5X2NoZWNrID0gY3J5cHRvX3Rvb2xib3g6OmY2KHBfY2ItPm1hY19rZXksIHBfY2ItPnJhbmQsIHBfY2ItPnJyYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5wZWVyX3JhbmRvbSwgaW9jYXAsIGEsIGIpOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgibG9jYWwgREhLZXkgY2hlY2sgY2FsY3VsYXRpb24gaXMgY29tcGxldGVkIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY2FsY3VsYXRlX3BlZXJfZGhrZXlfY2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHBlZXIgZGV2aWNlIERIS2V5IGNoZWNrIHZhbHVlLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9jYWxjdWxhdGVfcGVlcl9kaGtleV9jaGVjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgdWludDhfdCBpb2NhcFszXSwgYVs3XSwgYls3XTsKLSAgdFNNUF9LRVkga2V5OwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgc21wX2NvbGxlY3RfcGVlcl9pb19jYXBhYmlsaXRpZXMoaW9jYXAsIHBfY2IpOwotCi0gIHNtcF9jb2xsZWN0X2xvY2FsX2JsZV9hZGRyZXNzKGEsIHBfY2IpOwotICBzbXBfY29sbGVjdF9wZWVyX2JsZV9hZGRyZXNzKGIsIHBfY2IpOwotICBPY3RldDE2IHBhcmFtX2J1ZiA9IGNyeXB0b190b29sYm94OjpmNihwX2NiLT5tYWNfa2V5LCBwX2NiLT5ycmFuZCwgcF9jYi0+cmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYi0+bG9jYWxfcmFuZG9tLCBpb2NhcCwgYiwgYSk7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCJwZWVyIERIS2V5IGNoZWNrIGNhbGN1bGF0aW9uIGlzIGNvbXBsZXRlZCIpOwotICBrZXkua2V5X3R5cGUgPSBTTVBfS0VZX1RZUEVfUEVFUl9ESEtfQ0hDSzsKLSAga2V5LnBfZGF0YSA9IHBhcmFtX2J1Zi5kYXRhKCk7Ci0gIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICBzbXBfaW50X2RhdGEua2V5ID0ga2V5OwotICBzbXBfc21fZXZlbnQocF9jYiwgU01QX1NDX0tFWV9SRUFEWV9FVlQsICZzbXBfaW50X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2NhbGN1bGF0ZV9saW5rX2tleV9mcm9tX2xvbmdfdGVybV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGFuZCBzYXZlcyBCUi9FRFIgbGluayBrZXkgZGVyaXZlZAotICogICAgICAgICAgICAgICAgICBmcm9tIExFIFNDIExUSy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIGZhbHNlIGlmIG91dCBvZiByZXNvdXJjZXMsIHRydWUgaW4gb3RoZXIgY2FzZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgc21wX2NhbGN1bGF0ZV9saW5rX2tleV9mcm9tX2xvbmdfdGVybV9rZXkodFNNUF9DQiogcF9jYikgewotICB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWM7Ci0gIFJhd0FkZHJlc3MgYmRhX2Zvcl9sazsKLSAgdEJMRV9BRERSX1RZUEUgY29ubl9hZGRyX3R5cGU7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocF9jYi0+aWRfYWRkcl9yY3ZkICYmIHBfY2ItPmlkX2FkZHJfdHlwZSA9PSBCTEVfQUREUl9QVUJMSUMpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoCi0gICAgICAgICJVc2UgcmN2ZCBpZGVudGl0eSBhZGRyZXNzIGFzIEJEX0FERFIgb2YgTEsgcmN2ZCBpZGVudGl0eSBhZGRyZXNzIik7Ci0gICAgYmRhX2Zvcl9sayA9IHBfY2ItPmlkX2FkZHI7Ci0gIH0gZWxzZSBpZiAoKEJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIocF9jYi0+cGFpcmluZ19iZGEsIGJkYV9mb3JfbGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5fYWRkcl90eXBlKSkgJiYKLSAgICAgICAgICAgICBjb25uX2FkZHJfdHlwZSA9PSBCTEVfQUREUl9QVUJMSUMpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIlVzZSByY3ZkIGNvbm5lY3Rpb24gYWRkcmVzcyBhcyBCRF9BRERSIG9mIExLIik7Ci0gIH0gZWxzZSB7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIkRvbid0IGhhdmUgcGVlciBwdWJsaWMgYWRkcmVzcyB0byBhc3NvY2lhdGUgd2l0aCBMSyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHBfZGV2X3JlYyA9IGJ0bV9maW5kX2RldihwX2NiLT5wYWlyaW5nX2JkYSk7Ci0gIGlmIChwX2Rldl9yZWMgPT0gTlVMTCkgewotICAgIFNNUF9UUkFDRV9FUlJPUigiJXMgZmFpbGVkIHRvIGZpbmQgU2VjdXJpdHkgUmVjb3JkIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIE9jdGV0MTYgbGlua19rZXkgPQotICAgICAgY3J5cHRvX3Rvb2xib3g6Omx0a190b19saW5rX2tleShwX2NiLT5sdGssIHBfY2ItPmtleV9kZXJpdmF0aW9uX2g3X3VzZWQpOwotCi0gIHVpbnQ4X3QgbGlua19rZXlfdHlwZTsKLSAgaWYgKGJ0bV9jYi5zZWN1cml0eV9tb2RlID09IEJUTV9TRUNfTU9ERV9TQykgewotICAgIC8qIFNlY3VyZSBDb25uZWN0aW9ucyBPbmx5IE1vZGUgKi8KLSAgICBsaW5rX2tleV90eXBlID0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTY7Ci0gIH0gZWxzZSBpZiAoY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCktPnN1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucygpKSB7Ci0gICAgLyogYm90aCB0cmFuc3BvcnRzIGFyZSBTQyBjYXBhYmxlICovCi0gICAgaWYgKHBfY2ItPnNlY19sZXZlbCA9PSBTTVBfU0VDX0FVVEhFTlRJQ0FURUQpCi0gICAgICBsaW5rX2tleV90eXBlID0gQlRNX0xLRVlfVFlQRV9BVVRIX0NPTUJfUF8yNTY7Ci0gICAgZWxzZQotICAgICAgbGlua19rZXlfdHlwZSA9IEJUTV9MS0VZX1RZUEVfVU5BVVRIX0NPTUJfUF8yNTY7Ci0gIH0gZWxzZSBpZiAoYnRtX2NiLnNlY3VyaXR5X21vZGUgPT0gQlRNX1NFQ19NT0RFX1NQKSB7Ci0gICAgLyogQlIvRURSIHRyYW5zcG9ydCBpcyBTU1AgY2FwYWJsZSAqLwotICAgIGlmIChwX2NiLT5zZWNfbGV2ZWwgPT0gU01QX1NFQ19BVVRIRU5USUNBVEVEKQotICAgICAgbGlua19rZXlfdHlwZSA9IEJUTV9MS0VZX1RZUEVfQVVUSF9DT01COwotICAgIGVsc2UKLSAgICAgIGxpbmtfa2V5X3R5cGUgPSBCVE1fTEtFWV9UWVBFX1VOQVVUSF9DT01COwotICB9IGVsc2UgewotICAgIFNNUF9UUkFDRV9FUlJPUigiJXMgZmFpbGVkIHRvIHVwZGF0ZSBsaW5rX2tleS4gU2VjIE1vZGUgPSAlZCwgc200ID0gMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ0bV9jYi5zZWN1cml0eV9tb2RlLCBwX2Rldl9yZWMtPnNtNCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbGlua19rZXlfdHlwZSArPSBCVE1fTFRLX0RFUklWRURfTEtFWV9PRkZTRVQ7Ci0KLSAgT2N0ZXQxNiBub3RpZl9saW5rX2tleTsKLSAgc3RkOjpyZXZlcnNlX2NvcHkobGlua19rZXkuYmVnaW4oKSwgbGlua19rZXkuZW5kKCksIG5vdGlmX2xpbmtfa2V5LmJlZ2luKCkpOwotICBidG1fc2VjX2xpbmtfa2V5X25vdGlmaWNhdGlvbihiZGFfZm9yX2xrLCBub3RpZl9saW5rX2tleSwgbGlua19rZXlfdHlwZSk7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlcyBpcyBjb21wbGV0ZWQiLCBfX2Z1bmNfXyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbmQgc2F2ZXMgU0MgTFRLIGRlcml2ZWQgZnJvbSBCUi9FRFIgbGluayBrZXkuICovCi1ib29sIHNtcF9jYWxjdWxhdGVfbG9uZ190ZXJtX2tleV9mcm9tX2xpbmtfa2V5KHRTTVBfQ0IqIHBfY2IpIHsKLSAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcF9kZXZfcmVjID0gYnRtX2ZpbmRfZGV2KHBfY2ItPnBhaXJpbmdfYmRhKTsKLSAgaWYgKHBfZGV2X3JlYyA9PSBOVUxMKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKCIlcyBmYWlsZWQgdG8gZmluZCBTZWN1cml0eSBSZWNvcmQiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDhfdCBicl9saW5rX2tleV90eXBlOwotICBicl9saW5rX2tleV90eXBlID0gQlRNX1NlY0dldERldmljZUxpbmtLZXlUeXBlKHBfY2ItPnBhaXJpbmdfYmRhKTsKLSAgaWYgKGJyX2xpbmtfa2V5X3R5cGUgPT0gQlRNX0xLRVlfVFlQRV9JR05PUkUpIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzIGZhaWxlZCB0byByZXRyaWV2ZSBCUiBsaW5rIHR5cGUiLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKChicl9saW5rX2tleV90eXBlICE9IEJUTV9MS0VZX1RZUEVfQVVUSF9DT01CX1BfMjU2KSAmJgotICAgICAgKGJyX2xpbmtfa2V5X3R5cGUgIT0gQlRNX0xLRVlfVFlQRV9VTkFVVEhfQ09NQl9QXzI1NikpIHsKLSAgICBTTVBfVFJBQ0VfRVJST1IoIiVzIExFIFNDIExUSyBjYW4ndCBiZSBkZXJpdmVkIGZyb20gTEsgJWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgYnJfbGlua19rZXlfdHlwZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgT2N0ZXQxNiByZXZfbGlua19rZXk7Ci0gIHN0ZDo6cmV2ZXJzZV9jb3B5KHBfZGV2X3JlYy0+bGlua19rZXkuYmVnaW4oKSwgcF9kZXZfcmVjLT5saW5rX2tleS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgcmV2X2xpbmtfa2V5LmJlZ2luKCkpOwotICBwX2NiLT5sdGsgPSBjcnlwdG9fdG9vbGJveDo6bGlua19rZXlfdG9fbHRrKHJldl9saW5rX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiLT5rZXlfZGVyaXZhdGlvbl9oN191c2VkKTsKLQotICBwX2NiLT5zZWNfbGV2ZWwgPSAoYnJfbGlua19rZXlfdHlwZSA9PSBCVE1fTEtFWV9UWVBFX0FVVEhfQ09NQl9QXzI1NikKLSAgICAgICAgICAgICAgICAgICAgICAgID8gU01QX1NFQ19BVVRIRU5USUNBVEVECi0gICAgICAgICAgICAgICAgICAgICAgICA6IFNNUF9TRUNfVU5BVVRIRU5USUNBVEU7Ci0gIFNNUF9UUkFDRV9FVkVOVCgiJXMgaXMgY29tcGxldGVkIiwgX19mdW5jX18pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBub25jZS4KLSAqLwotdm9pZCBzbXBfc3RhcnRfbm9uY2VfZ2VuZXJhdGlvbih0U01QX0NCKiBwX2NiKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIGJ0c25kX2hjaWNfYmxlX3JhbmQoQmluZCgKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIEJUX09DVEVUOCByYW5kKSB7Ci0gICAgICAgIG1lbWNweShwX2NiLT5yYW5kLmRhdGEoKSwgcmFuZCwgQlRfT0NURVQ4X0xFTik7Ci0gICAgICAgIGJ0c25kX2hjaWNfYmxlX3JhbmQoQmluZCgKLSAgICAgICAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIEJUX09DVEVUOCByYW5kKSB7Ci0gICAgICAgICAgICAgIG1lbWNweShwX2NiLT5yYW5kLmRhdGEoKSArIDgsIHJhbmQsIEJUX09DVEVUOF9MRU4pOwotICAgICAgICAgICAgICBTTVBfVFJBQ0VfREVCVUcoIiVzIHJvdW5kICVkIiwgX19mdW5jX18sIHBfY2ItPnJvdW5kKTsKLSAgICAgICAgICAgICAgLyogbm90aWZpZXMgU00gdGhhdCBpdCBoYXMgbmV3IG5vbmNlLiAqLwotICAgICAgICAgICAgICBzbXBfc21fZXZlbnQocF9jYiwgU01QX0hBVkVfTE9DX05PTkNFX0VWVCwgTlVMTCk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgcF9jYikpOwotICAgICAgfSwKLSAgICAgIHBfY2IpKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3NtcC9zbXBfbDJjLmNjIGIvc3RhY2svc21wL3NtcF9sMmMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYWE0NzkuLjAwMDAwMDAKLS0tIGEvc3RhY2svc21wL3NtcF9sMmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMTk5OS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciB0aGUgU01QIEwyQ2FwIGludGVyZmFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYmx1ZXRvb3RoIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNzLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBVTlVTRURfQVRUUgotI2luY2x1ZGUgInNtcF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotc3RhdGljIHZvaWQgc21wX2Nvbm5lY3RfY2FsbGJhY2sodWludDE2X3QgY2hhbm5lbCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29ubmVjdGVkLCB1aW50MTZfdCByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1zdGF0aWMgdm9pZCBzbXBfZGF0YV9yZWNlaXZlZCh1aW50MTZfdCBjaGFubmVsLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1Zik7Ci0KLXN0YXRpYyB2b2lkIHNtcF9icl9jb25uZWN0X2NhbGxiYWNrKHVpbnQxNl90IGNoYW5uZWwsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCwgdWludDE2X3QgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpOwotc3RhdGljIHZvaWQgc21wX2JyX2RhdGFfcmVjZWl2ZWQodWludDE2X3QgY2hhbm5lbCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2wyY2FwX2lmX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyB0aGUgU01QIHRhc2sgc3RhcnR1cAotICogICAgICAgICAgICAgICAgICB0byByZWdpc3RlciBpbnRlcmZhY2UgZnVuY3Rpb25zIHdpdGggTDJDQVAuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2wyY2FwX2lmX2luaXQodm9pZCkgewotICB0TDJDQVBfRklYRURfQ0hOTF9SRUcgZml4ZWRfcmVnOwotICBTTVBfVFJBQ0VfRVZFTlQoIlNNREJHIGwyYyAlcyIsIF9fZnVuY19fKTsKLQotICBmaXhlZF9yZWcucEwyQ0FfRml4ZWRDb25uX0NiID0gc21wX2Nvbm5lY3RfY2FsbGJhY2s7Ci0gIGZpeGVkX3JlZy5wTDJDQV9GaXhlZERhdGFfQ2IgPSBzbXBfZGF0YV9yZWNlaXZlZDsKLQotICBmaXhlZF9yZWcucEwyQ0FfRml4ZWRDb25nX0NiID0KLSAgICAgIE5VTEw7IC8qIGRvIG5vdCBoYW5kbGUgY29uZ2VzdGlvbiBvbiB0aGlzIGNoYW5uZWwgKi8KLSAgZml4ZWRfcmVnLmRlZmF1bHRfaWRsZV90b3V0ID0KLSAgICAgIDYwOyAvKiBzZXQgNjAgc2Vjb25kcyB0aW1lb3V0LCAweGZmZmYgZGVmYXVsdCBpZGxlIHRpbWVvdXQgKi8KLQotICBMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsKEwyQ0FQX1NNUF9DSUQsICZmaXhlZF9yZWcpOwotCi0gIGZpeGVkX3JlZy5wTDJDQV9GaXhlZENvbm5fQ2IgPSBzbXBfYnJfY29ubmVjdF9jYWxsYmFjazsKLSAgZml4ZWRfcmVnLnBMMkNBX0ZpeGVkRGF0YV9DYiA9IHNtcF9icl9kYXRhX3JlY2VpdmVkOwotCi0gIEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwoTDJDQVBfU01QX0JSX0NJRCwgJmZpeGVkX3JlZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY29ubmVjdF9jYWxsYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTDJDQVAgdG8gaW5kaWNhdGUgdGhhdAotICogICAgICAgICAgICAgICAgICBTTVAgY2hhbm5lbCBpcwotICogICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIChjb25uID0gdHJ1ZSkvZGlzY29ubmVjdGVkIChjb25uID0gZmFsc2UpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzbXBfY29ubmVjdF9jYWxsYmFjayhVTlVTRURfQVRUUiB1aW50MTZfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICB0U01QX0NCKiBwX2NiID0gJnNtcF9jYjsKLSAgdFNNUF9JTlRfREFUQSBpbnRfZGF0YTsKLQotICBpZiAoYmRfYWRkci5Jc0VtcHR5KCkpIHsKLSAgICBMT0dfV0FSTigiUmVjZWl2ZWQgdW5leHBlY3RlZCBjYWxsYmFjayBmb3IgZW1wdHkgYWRkcmVzcyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICh0cmFuc3BvcnQgPT0gQlRfVFJBTlNQT1JUX0JSX0VEUikgewotICAgIExPR19XQVJOKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGNhbGxiYWNrIG9uIGNsYXNzaWMgY2hhbm5lbCBwZWVyOiVzIiwKLSAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkcikpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjb25uZWN0ZWQpIHsKLSAgICBMT0dfREVCVUcoIlNNUCBSZWNlaXZlZCBjb25uZWN0IGNhbGxiYWNrIGJkX2FkZHI6JXMgdHJhbnNwb3J0OiVzIiwKLSAgICAgICAgICAgICAgUFJJVkFURV9BRERSRVNTKGJkX2FkZHIpLCBidF90cmFuc3BvcnRfdGV4dCh0cmFuc3BvcnQpLmNfc3RyKCkpOwotICB9IGVsc2UgewotICAgIExPR19ERUJVRygiU01QIFJlY2VpdmVkIGRpc2Nvbm5lY3QgY2FsbGJhY2sgYmRfYWRkcjolcyB0cmFuc3BvcnQ6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksIGJ0X3RyYW5zcG9ydF90ZXh0KHRyYW5zcG9ydCkuY19zdHIoKSk7Ci0gIH0KLQotICBpZiAoYmRfYWRkciA9PSBwX2NiLT5wYWlyaW5nX2JkYSkgewotICAgIExPR19ERUJVRygiUmVjZWl2ZWQgY2FsbGJhY2sgZm9yIGRldmljZSBpbiBwYWlyaW5nIHByb2Nlc3M6JXMgc3RhdGU6JXMiLAotICAgICAgICAgICAgICBQUklWQVRFX0FERFJFU1MoYmRfYWRkciksCi0gICAgICAgICAgICAgIChjb25uZWN0ZWQpID8gImNvbm5lY3RlZCIgOiAiZGlzY29ubmVjdGVkIik7Ci0KLSAgICBpZiAoY29ubmVjdGVkKSB7Ci0gICAgICBpZiAoIXBfY2ItPmNvbm5lY3RfaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgcF9jYi0+Y29ubmVjdF9pbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIC8qIGluaXRpYXRpbmcgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCAqLwotICAgICAgICBwX2NiLT5yb2xlID0gTDJDQV9HZXRCbGVDb25uUm9sZShiZF9hZGRyKTsKLQotICAgICAgICAvKiBpbml0aWFsaXplIGxvY2FsIGkvciBrZXkgdG8gYmUgZGVmYXVsdCBrZXlzICovCi0gICAgICAgIHBfY2ItPmxvY2FsX3Jfa2V5ID0gcF9jYi0+bG9jYWxfaV9rZXkgPSBTTVBfU0VDX0RFRkFVTFRfS0VZOwotICAgICAgICBwX2NiLT5sb2NfYXV0aF9yZXEgPSBwX2NiLT5wZWVyX2F1dGhfcmVxID0gU01QX0RFRkFVTFRfQVVUSF9SRVE7Ci0gICAgICAgIHBfY2ItPmNiX2V2dCA9IFNNUF9JT19DQVBfUkVRX0VWVDsKLSAgICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9MMkNBUF9DT05OX0VWVCwgTlVMTCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIERpc2Nvbm5lY3RlZCB3aGlsZSBkb2luZyBzZWN1cml0eSAqLwotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9MMkNBUF9ESVNDT05OX0VWVCwgJmludF9kYXRhKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9kYXRhX3JlY2VpdmVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSBMMkNBUCBvbgotICogICAgICAgICAgICAgICAgICBTTVAgY2hhbm5lbC4KLSAqCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNtcF9kYXRhX3JlY2VpdmVkKHVpbnQxNl90IGNoYW5uZWwsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKSB7Ci0gIHRTTVBfQ0IqIHBfY2IgPSAmc21wX2NiOwotICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgcF9idWYtPm9mZnNldDsKLSAgdWludDhfdCBjbWQ7Ci0KLSAgaWYgKHBfYnVmLT5sZW4gPCAxKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTEyMTUzMTUiKTsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygiJXM6IHNtcCBwYWNrZXQgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAxIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9idWYtPmxlbik7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOChjbWQsIHApOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXM6IFNNREJHIGwyYywgY21kPTB4JXgiLCBfX2Z1bmNfXywgY21kKTsKLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKChTTVBfT1BDT0RFX01BWCA8IGNtZCkgfHwgKFNNUF9PUENPREVfTUlOID4gY21kKSkgewotICAgIFNNUF9UUkFDRV9XQVJOSU5HKCJJZ25vcmUgcmVjZWl2ZWQgY29tbWFuZCB3aXRoIFJFU0VSVkVEIGNvZGUgMHglMDJ4IiwgY21kKTsKLSAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogcmVqZWN0IHRoZSBwYWlyaW5nIHJlcXVlc3QgaWYgdGhlcmUgaXMgYW4gb24tZ29pbmcgU01QIHBhaXJpbmcgKi8KLSAgaWYgKFNNUF9PUENPREVfUEFJUklOR19SRVEgPT0gY21kIHx8IFNNUF9PUENPREVfU0VDX1JFUSA9PSBjbWQpIHsKLSAgICBpZiAoKHBfY2ItPnN0YXRlID09IFNNUF9TVEFURV9JRExFKSAmJgotICAgICAgICAocF9jYi0+YnJfc3RhdGUgPT0gU01QX0JSX1NUQVRFX0lETEUpICYmCi0gICAgICAgICEocF9jYi0+ZmxhZ3MgJiBTTVBfUEFJUl9GTEFHU19XRV9TVEFSVEVEX0REKSkgewotICAgICAgcF9jYi0+cm9sZSA9IEwyQ0FfR2V0QmxlQ29ublJvbGUoYmRfYWRkcik7Ci0gICAgICBwX2NiLT5wYWlyaW5nX2JkYSA9IGJkX2FkZHI7Ci0gICAgfSBlbHNlIGlmIChiZF9hZGRyICE9IHBfY2ItPnBhaXJpbmdfYmRhKSB7Ci0gICAgICBvc2lfZnJlZShwX2J1Zik7Ci0gICAgICBzbXBfcmVqZWN0X3VuZXhwZWN0ZWRfcGFpcmluZ19jb21tYW5kKGJkX2FkZHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBlbHNlLCBvdXQgb2Ygc3RhdGUgcGFpcmluZyByZXF1ZXN0L3NlY3VyaXR5IHJlcXVlc3QgcmVjZWl2ZWQsIHBhc3NlZCBpbnRvCi0gICAgICogU00gKi8KLSAgfQotCi0gIGlmIChiZF9hZGRyID09IHBfY2ItPnBhaXJpbmdfYmRhKSB7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2ItPnNtcF9yc3BfdGltZXJfZW50LCBTTVBfV0FJVF9GT1JfUlNQX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIHNtcF9yc3BfdGltZW91dCwgTlVMTCk7Ci0KLSAgICBzbXBfbG9nX21ldHJpY3MocF9jYi0+cGFpcmluZ19iZGEsIGZhbHNlIC8qIGluY29taW5nICovLAotICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+ZGF0YSArIHBfYnVmLT5vZmZzZXQsIHBfYnVmLT5sZW4pOwotCi0gICAgaWYgKGNtZCA9PSBTTVBfT1BDT0RFX0NPTkZJUk0pIHsKLSAgICAgIFNNUF9UUkFDRV9ERUJVRygKLSAgICAgICAgICAiaW4gJXMgY21kID0gMHglMDJ4LCBwZWVyX2F1dGhfcmVxID0gMHglMDJ4LCIKLSAgICAgICAgICAibG9jX2F1dGhfcmVxID0gMHglMDJ4IiwKLSAgICAgICAgICBfX2Z1bmNfXywgY21kLCBwX2NiLT5wZWVyX2F1dGhfcmVxLCBwX2NiLT5sb2NfYXV0aF9yZXEpOwotCi0gICAgICBpZiAoKHBfY2ItPnBlZXJfYXV0aF9yZXEgJiBTTVBfU0NfU1VQUE9SVF9CSVQpICYmCi0gICAgICAgICAgKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9TQ19TVVBQT1JUX0JJVCkpIHsKLSAgICAgICAgY21kID0gU01QX09QQ09ERV9QQUlSX0NPTU1JVE07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcF9jYi0+cmN2ZF9jbWRfY29kZSA9IGNtZDsKLSAgICBwX2NiLT5yY3ZkX2NtZF9sZW4gPSAodWludDhfdClwX2J1Zi0+bGVuOwotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5wX2RhdGEgPSBwOwotICAgIHNtcF9zbV9ldmVudChwX2NiLCBzdGF0aWNfY2FzdDx0U01QX0VWRU5UPihjbWQpLCAmc21wX2ludF9kYXRhKTsKLSAgfQotCi0gIG9zaV9mcmVlKHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9icl9jb25uZWN0X2NhbGxiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBMMkNBUCB0byBpbmRpY2F0ZSB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgIFNNUCBCUiBjaGFubmVsIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgKGNvbm4gPSB0cnVlKS9kaXNjb25uZWN0ZWQgKGNvbm4gPSBmYWxzZSkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNtcF9icl9jb25uZWN0X2NhbGxiYWNrKHVpbnQxNl90IGNoYW5uZWwsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCwgdWludDE2X3QgcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0gIHRTTVBfSU5UX0RBVEEgaW50X2RhdGE7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAodHJhbnNwb3J0ICE9IEJUX1RSQU5TUE9SVF9CUl9FRFIpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygiJXMgaXMgY2FsbGVkIG9uIHVuZXhwZWN0ZWQgdHJhbnNwb3J0ICVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgZm9yIHBhaXJpbmcgQkRBOiAiIDw8IGJkX2FkZHIKLSAgICAgICAgICA8PCAiLCBwYWlyaW5nX2JkYToiIDw8IHBfY2ItPnBhaXJpbmdfYmRhCi0gICAgICAgICAgPDwgIiBFdmVudDogIiA8PCAoKGNvbm5lY3RlZCkgPyAiY29ubmVjdGVkIiA6ICJkaXNjb25uZWN0ZWQiKTsKLQotICBpZiAoYmRfYWRkciAhPSBwX2NiLT5wYWlyaW5nX2JkYSkgcmV0dXJuOwotCi0gIGlmIChjb25uZWN0ZWQpIHsKLSAgICBpZiAoIXBfY2ItPmNvbm5lY3RfaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHBfY2ItPmNvbm5lY3RfaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgLyogaW5pdGlhbGl6ZSBsb2NhbCBpL3Iga2V5IHRvIGJlIGRlZmF1bHQga2V5cyAqLwotICAgICAgcF9jYi0+bG9jYWxfcl9rZXkgPSBwX2NiLT5sb2NhbF9pX2tleSA9IFNNUF9CUl9TRUNfREVGQVVMVF9LRVk7Ci0gICAgICBwX2NiLT5sb2NfYXV0aF9yZXEgPSBwX2NiLT5wZWVyX2F1dGhfcmVxID0gMDsKLSAgICAgIHBfY2ItPmNiX2V2dCA9IFNNUF9CUl9LRVlTX1JFUV9FVlQ7Ci0gICAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudChwX2NiLCBTTVBfQlJfTDJDQVBfQ09OTl9FVlQsIE5VTEwpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBEaXNjb25uZWN0ZWQgd2hpbGUgZG9pbmcgc2VjdXJpdHkgKi8KLSAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudChwX2NiLCBTTVBfQlJfTDJDQVBfRElTQ09OTl9FVlQsICZpbnRfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9icl9kYXRhX3JlY2VpdmVkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSBMMkNBUCBvbgotICogICAgICAgICAgICAgICAgICBTTVAgQlIgY2hhbm5lbC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc21wX2JyX2RhdGFfcmVjZWl2ZWQodWludDE2X3QgY2hhbm5lbCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpIHsKLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0gIHVpbnQ4X3QqIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICB1aW50OF90IGNtZDsKLSAgU01QX1RSQUNFX0VWRU5UKCJTTURCRyBsMmMgJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHBfYnVmLT5sZW4gPCAxKSB7Ci0gICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTEyMTUzMTUiKTsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygiJXM6IHNtcCBwYWNrZXQgbGVuZ3RoICVkIHRvbyBzaG9ydDogbXVzdCBiZSBhdCBsZWFzdCAxIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9idWYtPmxlbik7Ci0gICAgb3NpX2ZyZWUocF9idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNUUkVBTV9UT19VSU5UOChjbWQsIHApOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKFNNUF9PUENPREVfTUFYIDwgY21kKSB8fCAoU01QX09QQ09ERV9NSU4gPiBjbWQpKSB7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIklnbm9yZSByZWNlaXZlZCBjb21tYW5kIHdpdGggUkVTRVJWRUQgY29kZSAweCUwMngiLCBjbWQpOwotICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiByZWplY3QgdGhlIHBhaXJpbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBhbiBvbi1nb2luZyBTTVAgcGFpcmluZyAqLwotICBpZiAoU01QX09QQ09ERV9QQUlSSU5HX1JFUSA9PSBjbWQpIHsKLSAgICBpZiAoKHBfY2ItPnN0YXRlID09IFNNUF9TVEFURV9JRExFKSAmJgotICAgICAgICAocF9jYi0+YnJfc3RhdGUgPT0gU01QX0JSX1NUQVRFX0lETEUpKSB7Ci0gICAgICBwX2NiLT5yb2xlID0gSENJX1JPTEVfUEVSSVBIRVJBTDsKLSAgICAgIHBfY2ItPnNtcF9vdmVyX2JyID0gdHJ1ZTsKLSAgICAgIHBfY2ItPnBhaXJpbmdfYmRhID0gYmRfYWRkcjsKLSAgICB9IGVsc2UgaWYgKGJkX2FkZHIgIT0gcF9jYi0+cGFpcmluZ19iZGEpIHsKLSAgICAgIG9zaV9mcmVlKHBfYnVmKTsKLSAgICAgIHNtcF9yZWplY3RfdW5leHBlY3RlZF9wYWlyaW5nX2NvbW1hbmQoYmRfYWRkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIGVsc2UsIG91dCBvZiBzdGF0ZSBwYWlyaW5nIHJlcXVlc3QgcmVjZWl2ZWQsIHBhc3NlZCBpbnRvIFN0YXRlIE1hY2hpbmUgKi8KLSAgfQotCi0gIGlmIChiZF9hZGRyID09IHBfY2ItPnBhaXJpbmdfYmRhKSB7Ci0gICAgYWxhcm1fc2V0X29uX21sb29wKHBfY2ItPnNtcF9yc3BfdGltZXJfZW50LCBTTVBfV0FJVF9GT1JfUlNQX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIHNtcF9yc3BfdGltZW91dCwgTlVMTCk7Ci0KLSAgICBzbXBfbG9nX21ldHJpY3MocF9jYi0+cGFpcmluZ19iZGEsIGZhbHNlIC8qIGluY29taW5nICovLAotICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+ZGF0YSArIHBfYnVmLT5vZmZzZXQsIHBfYnVmLT5sZW4pOwotCi0gICAgcF9jYi0+cmN2ZF9jbWRfY29kZSA9IGNtZDsKLSAgICBwX2NiLT5yY3ZkX2NtZF9sZW4gPSAodWludDhfdClwX2J1Zi0+bGVuOwotICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgIHNtcF9pbnRfZGF0YS5wX2RhdGEgPSBwOwotICAgIHNtcF9icl9zdGF0ZV9tYWNoaW5lX2V2ZW50KHBfY2IsIHN0YXRpY19jYXN0PHRTTVBfRVZFTlQ+KGNtZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNtcF9pbnRfZGF0YSk7Ci0gIH0KLQotICBvc2lfZnJlZShwX2J1Zik7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9zbXAvc21wX21haW4uY2MgYi9zdGFjay9zbXAvc21wX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWQ5NGMuLjAwMDAwMDAKLS0tIGEvc3RhY2svc21wL3NtcF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aCIKLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAic21wX2ludC5oIgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0KLWNvbnN0IGNoYXIqIGNvbnN0IHNtcF9zdGF0ZV9uYW1lW10gPSB7Ci0gICAgIlNNUF9TVEFURV9JRExFIiwKLSAgICAiU01QX1NUQVRFX1dBSVRfQVBQX1JTUCIsCi0gICAgIlNNUF9TVEFURV9TRUNfUkVRX1BFTkRJTkciLAotICAgICJTTVBfU1RBVEVfUEFJUl9SRVFfUlNQIiwKLSAgICAiU01QX1NUQVRFX1dBSVRfQ09ORklSTSIsCi0gICAgIlNNUF9TVEFURV9DT05GSVJNIiwKLSAgICAiU01QX1NUQVRFX1JBTkQiLAotICAgICJTTVBfU1RBVEVfUFVCTElDX0tFWV9FWENIIiwKLSAgICAiU01QX1NUQVRFX1NFQ19DT05OX1BIUzFfU1RBUlQiLAotICAgICJTTVBfU1RBVEVfV0FJVF9DT01NSVRNRU5UIiwKLSAgICAiU01QX1NUQVRFX1dBSVRfTk9OQ0UiLAotICAgICJTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMl9TVEFSVCIsCi0gICAgIlNNUF9TVEFURV9XQUlUX0RIS19DSEVDSyIsCi0gICAgIlNNUF9TVEFURV9ESEtfQ0hFQ0siLAotICAgICJTTVBfU1RBVEVfRU5DUllQVElPTl9QRU5ESU5HIiwKLSAgICAiU01QX1NUQVRFX0JPTkRfUEVORElORyIsCi0gICAgIlNNUF9TVEFURV9DUkVBVEVfTE9DQUxfU0VDX0NPTk5fT09CX0RBVEEiLAotICAgICJTTVBfU1RBVEVfTUFYIn07Ci0KLWNvbnN0IGNoYXIqIGNvbnN0IHNtcF9ldmVudF9uYW1lW10gPSB7IlBBSVJJTkdfUkVRX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQUlSSU5HX1JTUF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09ORklSTV9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkFORF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFJUklOR19GQUlMRURfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOQ19JTkZPX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRU5UUkFMX0lEX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRF9JTkZPX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRF9BRERSX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSUdOX0lORk9fRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFQ1VSSVRZX1JFUV9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFJUl9QVUJMSUNfS0VZX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQUlSX0RIS0VZX0NIRUNLX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQUlSX0tFWVBSRVNTX05PVElGSUNBVElPTl9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFJUl9DT01NSVRNRU5UX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlfUkVBRFlfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOQ1JZUFRFRF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTDJDQVBfQ09OTl9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTDJDQVBfRElTQ09OTl9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVBJX0lPX1JTUF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVBJX1NFQ19HUkFOVF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEtfUkVRX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVVRIX0NNUExfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOQ19SRVFfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPTkRfUkVRX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJESVNDQVJEX1NFQ19SRVFfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBVQkxJQ19LRVlfRVhDSEFOR0VfUkVRX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMT0NBTF9QVUJMSUNfS0VZX0NSVERfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJPVEhfUFVCTElDX0tFWVNfUkNWRF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VDX0NPTk5fREhLRVlfQ09NUExFVEVfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhBVkVfTE9DQUxfTk9OQ0VfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFQ19DT05OX1BIQVNFMV9DTVBMVF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VDX0NPTk5fQ0FMQ19OQ19FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VDX0NPTk5fRElTUExBWV9OQ19FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VDX0NPTk5fT0tfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFQ19DT05OXzJfREhDS19DSEVDS1NfUFJFU0VOVF9FVlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VDX0NPTk5fS0VZX1JFQURZX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlQUkVTU19OT1RJRklDQVRJT05fRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFQ19DT05OX09PQl9EQVRBX0VWVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEVfTE9DQUxfU0VDX0NPTk5fT09CX0RBVEFfRVZUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVF9PRl9SQU5HRV9FVlQifTsKLQotY29uc3QgY2hhciogc21wX2dldF9ldmVudF9uYW1lKHRTTVBfRVZFTlQgZXZlbnQpOwotY29uc3QgY2hhciogc21wX2dldF9zdGF0ZV9uYW1lKHRTTVBfU1RBVEUgc3RhdGUpOwotCi0jZGVmaW5lIFNNUF9TTV9JR05PUkUgMAotI2RlZmluZSBTTVBfTlVNX0FDVElPTlMgMgotI2RlZmluZSBTTVBfU01FX05FWFRfU1RBVEUgMgotI2RlZmluZSBTTVBfU01fTlVNX0NPTFMgMwotCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0U01QX1NNX1RCTClbU01QX1NNX05VTV9DT0xTXTsKLQotZW51bSB7Ci0gIFNNUF9QUk9DX1NFQ19SRVEsCi0gIFNNUF9TRU5EX1BBSVJfUkVRLAotICBTTVBfU0VORF9QQUlSX1JTUCwKLSAgU01QX1NFTkRfQ09ORklSTSwKLSAgU01QX1NFTkRfUEFJUl9GQUlMLAotICBTTVBfU0VORF9SQU5ELAotICBTTVBfU0VORF9FTkNfSU5GTywKLSAgU01QX1NFTkRfSURfSU5GTywKLSAgU01QX1NFTkRfTFRLX1JFUExZLAotICBTTVBfUFJPQ19QQUlSX0NNRCwKLSAgU01QX1BST0NfUEFJUl9GQUlMLAotICBTTVBfUFJPQ19DT05GSVJNLAotICBTTVBfUFJPQ19SQU5ELAotICBTTVBfUFJPQ19FTkNfSU5GTywKLSAgU01QX1BST0NfQ0VOVFJBTF9JRCwKLSAgU01QX1BST0NfSURfSU5GTywKLSAgU01QX1BST0NfSURfQUREUiwKLSAgU01QX1BST0NfU1JLX0lORk8sCi0gIFNNUF9QUk9DX1NFQ19HUkFOVCwKLSAgU01QX1BST0NfU0xfS0VZLAotICBTTVBfUFJPQ19DT01QQVJFLAotICBTTVBfUFJPQ19JT19SU1AsCi0gIFNNUF9HRU5FUkFURV9DT01QQVJFLAotICBTTVBfR0VORVJBVEVfQ09ORklSTSwKLSAgU01QX0dFTkVSQVRFX1NUSywKLSAgU01QX0tFWV9ESVNUUklCVVRFLAotICBTTVBfU1RBUlRfRU5DLAotICBTTVBfUEFJUklOR19DTVBMLAotICBTTVBfREVDSURFX0FTU09fTU9ERUwsCi0gIFNNUF9TRU5EX0FQUF9DQkFDSywKLSAgU01QX0NIRUNLX0FVVEhfUkVRLAotICBTTVBfUEFJUl9URVJNSU5BVEUsCi0gIFNNUF9FTkNfQ01QTCwKLSAgU01QX1BST0NfRElTQ0FSRCwKLSAgU01QX0NSRUFURV9QUklWQVRFX0tFWSwKLSAgU01QX1VTRV9PT0JfUFJJVkFURV9LRVksCi0gIFNNUF9TRU5EX1BBSVJfUFVCTElDX0tFWSwKLSAgU01QX1BST0NFU1NfUEFJUl9QVUJMSUNfS0VZLAotICBTTVBfSEFWRV9CT1RIX1BVQkxJQ19LRVlTLAotICBTTVBfU1RBUlRfU0VDX0NPTk5fUEhBU0UxLAotICBTTVBfUFJPQ0VTU19MT0NBTF9OT05DRSwKLSAgU01QX1NFTkRfQ09NTUlUTUVOVCwKLSAgU01QX1BST0NFU1NfUEFJUklOR19DT01NSVRNRU5ULAotICBTTVBfUFJPQ0VTU19QRUVSX05PTkNFLAotICBTTVBfQ0FMQ1VMQVRFX0xPQ0FMX0RIS0VZX0NIRUNLLAotICBTTVBfU0VORF9ESEtFWV9DSEVDSywKLSAgU01QX1BST0NFU1NfREhLRVlfQ0hFQ0ssCi0gIFNNUF9DQUxDVUxBVEVfUEVFUl9ESEtFWV9DSEVDSywKLSAgU01QX01BVENIX0RIS0VZX0NIRUNLUywKLSAgU01QX0NBTENVTEFURV9OVU1FUklDX0NPTVBBUklTT05fRElTUExBWV9OVU1CRVIsCi0gIFNNUF9NT1ZFX1RPX1NFQ19DT05OX1BIQVNFMiwKLSAgU01QX1BIMl9ESEtFWV9DSEVDS1NfQVJFX1BSRVNFTlQsCi0gIFNNUF9XQUlUX0ZPUl9CT1RIX1BVQkxJQ19LRVlTLAotICBTTVBfU1RBUlRfUEFTU0tFWV9WRVJJRklDQVRJT04sCi0gIFNNUF9TRU5EX0tFWVBSRVNTX05PVElGSUNBVElPTiwKLSAgU01QX1BST0NFU1NfS0VZUFJFU1NfTk9USUZJQ0FUSU9OLAotICBTTVBfUFJPQ0VTU19TRUNVUkVfQ09OTkVDVElPTl9PT0JfREFUQSwKLSAgU01QX1NFVF9MT0NBTF9PT0JfS0VZUywKLSAgU01QX1NFVF9MT0NBTF9PT0JfUkFORF9DT01NSVRNRU5ULAotICBTTVBfSURMRV9URVJNSU5BVEUsCi0gIFNNUF9TTV9OT19BQ1RJT04KLX07Ci0KLXN0YXRpYyBjb25zdCB0U01QX0FDVCBzbXBfc21fYWN0aW9uW10gPSB7Ci0gICAgc21wX3Byb2Nfc2VjX3JlcSwKLSAgICBzbXBfc2VuZF9wYWlyX3JlcSwKLSAgICBzbXBfc2VuZF9wYWlyX3JzcCwKLSAgICBzbXBfc2VuZF9jb25maXJtLAotICAgIHNtcF9zZW5kX3BhaXJfZmFpbCwKLSAgICBzbXBfc2VuZF9yYW5kLAotICAgIHNtcF9zZW5kX2VuY19pbmZvLAotICAgIHNtcF9zZW5kX2lkX2luZm8sCi0gICAgc21wX3NlbmRfbHRrX3JlcGx5LAotICAgIHNtcF9wcm9jX3BhaXJfY21kLAotICAgIHNtcF9wcm9jX3BhaXJfZmFpbCwKLSAgICBzbXBfcHJvY19jb25maXJtLAotICAgIHNtcF9wcm9jX3JhbmQsCi0gICAgc21wX3Byb2NfZW5jX2luZm8sCi0gICAgc21wX3Byb2NfY2VudHJhbF9pZCwKLSAgICBzbXBfcHJvY19pZF9pbmZvLAotICAgIHNtcF9wcm9jX2lkX2FkZHIsCi0gICAgc21wX3Byb2Nfc3JrX2luZm8sCi0gICAgc21wX3Byb2Nfc2VjX2dyYW50LAotICAgIHNtcF9wcm9jX3NsX2tleSwKLSAgICBzbXBfcHJvY19jb21wYXJlLAotICAgIHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlLAotICAgIHNtcF9nZW5lcmF0ZV9jb21wYXJlLAotICAgIHNtcF9nZW5lcmF0ZV9zcmFuZF9tcmFuZF9jb25maXJtLAotICAgIHNtcF9nZW5lcmF0ZV9zdGssCi0gICAgc21wX2tleV9kaXN0cmlidXRpb24sCi0gICAgc21wX3N0YXJ0X2VuYywKLSAgICBzbXBfcGFpcmluZ19jbXBsLAotICAgIHNtcF9kZWNpZGVfYXNzb2NpYXRpb25fbW9kZWwsCi0gICAgc21wX3NlbmRfYXBwX2NiYWNrLAotICAgIHNtcF9jaGVja19hdXRoX3JlcSwKLSAgICBzbXBfcGFpcl90ZXJtaW5hdGUsCi0gICAgc21wX2VuY19jbXBsLAotICAgIHNtcF9wcm9jX2Rpc2NhcmQsCi0gICAgc21wX2NyZWF0ZV9wcml2YXRlX2tleSwKLSAgICBzbXBfdXNlX29vYl9wcml2YXRlX2tleSwKLSAgICBzbXBfc2VuZF9wYWlyX3B1YmxpY19rZXksCi0gICAgc21wX3Byb2Nlc3NfcGFpcmluZ19wdWJsaWNfa2V5LAotICAgIHNtcF9ib3RoX2hhdmVfcHVibGljX2tleXMsCi0gICAgc21wX3N0YXJ0X3NlY3VyZV9jb25uZWN0aW9uX3BoYXNlMSwKLSAgICBzbXBfcHJvY2Vzc19sb2NhbF9ub25jZSwKLSAgICBzbXBfc2VuZF9jb21taXRtZW50LAotICAgIHNtcF9wcm9jZXNzX3BhaXJpbmdfY29tbWl0bWVudCwKLSAgICBzbXBfcHJvY2Vzc19wZWVyX25vbmNlLAotICAgIHNtcF9jYWxjdWxhdGVfbG9jYWxfZGhrZXlfY2hlY2ssCi0gICAgc21wX3NlbmRfZGhrZXlfY2hlY2ssCi0gICAgc21wX3Byb2Nlc3NfZGhrZXlfY2hlY2ssCi0gICAgc21wX2NhbGN1bGF0ZV9wZWVyX2Roa2V5X2NoZWNrLAotICAgIHNtcF9tYXRjaF9kaGtleV9jaGVja3MsCi0gICAgc21wX2NhbGN1bGF0ZV9udW1lcmljX2NvbXBhcmlzb25fZGlzcGxheV9udW1iZXIsCi0gICAgc21wX21vdmVfdG9fc2VjdXJlX2Nvbm5lY3Rpb25zX3BoYXNlMiwKLSAgICBzbXBfcGhhc2VfMl9kaGtleV9jaGVja3NfYXJlX3ByZXNlbnQsCi0gICAgc21wX3dhaXRfZm9yX2JvdGhfcHVibGljX2tleXMsCi0gICAgc21wX3N0YXJ0X3Bhc3NrZXlfdmVyaWZpY2F0aW9uLAotICAgIHNtcF9zZW5kX2tleXByZXNzX25vdGlmaWNhdGlvbiwKLSAgICBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24sCi0gICAgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fb29iX2RhdGEsCi0gICAgc21wX3NldF9sb2NhbF9vb2Jfa2V5cywKLSAgICBzbXBfc2V0X2xvY2FsX29vYl9yYW5kb21fY29tbWl0bWVudCwKLSAgICBzbXBfaWRsZV90ZXJtaW5hdGV9OwotCi0vKioqKioqKioqKioqIFNNUCBDZW50cmFsIEZTTSBTdGF0ZS9FdmVudCBJbmRpcmVjdGlvbiBUYWJsZSAqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9jZW50cmFsX2VudHJ5X21hcFtdW1NNUF9TVEFURV9NQVhdID0gewotICAgIC8qIHN0YXRlIG5hbWU6ICovCi0gICAgLyogSWRsZSwgV2FpdEFwcCBSc3AsIFNlY1JlcSBQZW5kLCBQYWlyIFJlcVJzcCwgV2FpdCBDZm0sIENvbmZpcm0sIFJhbmQsCi0gICAgICAgUHVibEtleSBFeGNoLCBTQ1BoczEgU3RydCwgV2FpdCBDbXRtLCBXYWl0IE5vbmNlLCBTQ1BoczIgU3RydCwgV2FpdAotICAgICAgIERIS0NoaywgREhLQ2hrLCBFbmMgUGVuZCwgQm9uZCBQZW5kLCBDckxvY1NjIE9vYkRhdGEgKi8KLSAgICAvKiBQQUlSX1JFUSAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQQUlSX1JTUCAqLwotICAgIHswLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBDT05GSVJNICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFJBTkQgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogUEFJUl9GQUlMICovCi0gICAgezAsIDB4ODEsIDAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCi0gICAgIDB4ODEsIDAsIDB4ODEsIDB9LAotICAgIC8qIEVOQ19JTkZPICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDB9LAotICAgIC8qIENFTlRSQUxfSUQgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgMH0sCi0gICAgLyogSURfSU5GTyAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwfSwKLSAgICAvKiBJRF9BRERSICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDUsIDB9LAotICAgIC8qIFNJR05fSU5GTyAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwfSwKLSAgICAvKiBTRUNfUkVRICovCi0gICAgezIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFBBSVJfUFVCTElDX0tFWSAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQQUlSX0RIS0VZX0NIQ0sgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMH0sCi0gICAgLyogUEFJUl9LRVlQUl9OT1RJRiAqLwotICAgIHswLCA4LCAwLCAwLCAwLCAwLCAwLCAwLCA1LCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQQUlSX0NPTU1JVE0gKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogS0VZX1JFQURZICovCi0gICAgezAsIDMsIDAsIDMsIDEsIDAsIDIsIDAsIDQsIDAsIDAsIDAsIDAsIDAsIDEsIDYsIDB9LAotICAgIC8qIEVOQ19DTVBMICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDB9LAotICAgIC8qIEwyQ19DT05OICovCi0gICAgezEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIEwyQ19ESVNDICovCi0gICAgezMsIDB4ODMsIDAsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCi0gICAgIDB4ODMsIDB4ODMsIDB4ODMsIDB9LAotICAgIC8qIElPX1JTUCAqLwotICAgIHswLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBTRUNfR1JBTlQgKi8KLSAgICB7MCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogVEtfUkVRICovCi0gICAgezAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIEFVVEhfQ01QTCAqLwotICAgIHs0LCAweDgyLCAwLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAotICAgICAweDgyLCAweDgyLCAweDgyLCAwfSwKLSAgICAvKiBFTkNfUkVRICovCi0gICAgezAsIDQsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDB9LAotICAgIC8qIEJPTkRfUkVRICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDB9LAotICAgIC8qIERJU0NBUkRfU0VDX1JFUSAqLwotICAgIHswLCA1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwLCAwfSwKLSAgICAvKiBQVUJMX0tFWV9FWENIX1JFUSAqLwotICAgIHswLCAwLCAwLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBMT0NfUFVCTF9LRVlfQ1JURCAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxfSwKLSAgICAvKiBCT1RIX1BVQkxfS0VZU19SQ1ZEICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFNDX0RIS0VZX0NNUExUICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIEhBVkVfTE9DX05PTkNFICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDJ9LAotICAgIC8qIFNDX1BIQVNFMV9DTVBMVCAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBTQ19DQUxDX05DICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFNDX0RTUExfTkMgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogU0NfTkNfT0sgKi8KLSAgICB7MCwgNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogU0NfMl9ESENLX0NIS1NfUFJFUyAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBTQ19LRVlfUkVBRFkgKi8KLSAgICB7MCwgNywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMH0sCi0gICAgLyogS0VZUFJfTk9USUYgKi8KLSAgICB7MCwgOSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogU0NfT09CX0RBVEEgKi8KLSAgICB7MCwgMTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIENSX0xPQ19TQ19PT0JfREFUQSAqLwotICAgIHs1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9hbGxfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBQQUlSX0ZBSUwgKi8KLSAgICB7U01QX1BST0NfUEFJUl9GQUlMLCBTTVBfUEFJUklOR19DTVBMLCBTTVBfU1RBVEVfSURMRX0sCi0gICAgLyogQVVUSF9DTVBMICovCi0gICAge1NNUF9TRU5EX1BBSVJfRkFJTCwgU01QX1BBSVJJTkdfQ01QTCwgU01QX1NUQVRFX0lETEV9LAotICAgIC8qIEwyQ19ESVNDICovCi0gICAge1NNUF9QQUlSX1RFUk1JTkFURSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0lETEV9fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX2NlbnRyYWxfaWRsZV90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogTDJDX0NPTk4gKi8KLSAgICB7U01QX1NFTkRfQVBQX0NCQUNLLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfV0FJVF9BUFBfUlNQfSwKLSAgICAvKiBTRUNfUkVRICovCi0gICAge1NNUF9QUk9DX1NFQ19SRVEsIFNNUF9TRU5EX0FQUF9DQkFDSywgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi0gICAgLyogTDJDX0RJU0MgKi8KLSAgICB7U01QX0lETEVfVEVSTUlOQVRFLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfSURMRX0sCi0gICAgLyogQVVUSF9DTVBMICovCi0gICAge1NNUF9QQUlSSU5HX0NNUEwsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9JRExFfSwKLSAgICAvKiBDUl9MT0NfU0NfT09CX0RBVEEgKi8KLSAgICB7U01QX0NSRUFURV9QUklWQVRFX0tFWSwgU01QX1NNX05PX0FDVElPTiwKLSAgICAgU01QX1NUQVRFX0NSRUFURV9MT0NBTF9TRUNfQ09OTl9PT0JfREFUQX0KLQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QKLSAgICBzbXBfY2VudHJhbF93YWl0X2Zvcl9hcHBfcmVzcG9uc2VfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgICAgIC8qIFNFQ19HUkFOVCAqLwotICAgICAgICB7U01QX1BST0NfU0VDX0dSQU5ULCBTTVBfU0VORF9BUFBfQ0JBQ0ssIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiBJT19SU1AgKi8KLSAgICAgICAge1NNUF9TRU5EX1BBSVJfUkVRLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQfSwKLQotICAgICAgICAvKiBUSyByZWFkeSAqLwotICAgICAgICAvKiBLRVlfUkVBRFkgKi8KLSAgICAgICAge1NNUF9HRU5FUkFURV9DT05GSVJNLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfV0FJVF9DT05GSVJNfSwKLQotICAgICAgICAvKiBzdGFydCBlbmMgbW9kZSBzZXR1cCAqLwotICAgICAgICAvKiBFTkNfUkVRICovCi0gICAgICAgIHtTTVBfU1RBUlRfRU5DLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfRU5DUllQVElPTl9QRU5ESU5HfSwKLSAgICAgICAgLyogRElTQ0FSRF9TRUNfUkVRICovCi0gICAgICAgIHtTTVBfUFJPQ19ESVNDQVJELCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfSURMRX0KLSAgICAgICAgLyogdXNlciBjb25maXJtcyBOQyAnT0snLCBpLmUuIHBoYXNlIDEgaXMgY29tcGxldGVkICovCi0gICAgICAgIC8qIFNDX05DX09LICovLAotICAgICAgICB7U01QX01PVkVfVE9fU0VDX0NPTk5fUEhBU0UyLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICAgICAgU01QX1NUQVRFX1NFQ19DT05OX1BIUzJfU1RBUlR9LAotICAgICAgICAvKiB1c2VyLXByb3ZpZGVkIHBhc3NrZXkgaXMgcmN2ZCAqLwotICAgICAgICAvKiBTQ19LRVlfUkVBRFkgKi8KLSAgICAgICAge1NNUF9TVEFSVF9QQVNTS0VZX1ZFUklGSUNBVElPTiwgU01QX1NNX05PX0FDVElPTiwKLSAgICAgICAgIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMxX1NUQVJUfSwKLSAgICAgICAgLyogUEFJUl9LRVlQUl9OT1RJRiAqLwotICAgICAgICB7U01QX1BST0NFU1NfS0VZUFJFU1NfTk9USUZJQ0FUSU9OLCBTTVBfU0VORF9BUFBfQ0JBQ0ssCi0gICAgICAgICBTTVBfU1RBVEVfV0FJVF9BUFBfUlNQfSwKLSAgICAgICAgLyogS0VZUFJfTk9USUYgKi8KLSAgICAgICAge1NNUF9TRU5EX0tFWVBSRVNTX05PVElGSUNBVElPTiwgU01QX1NNX05PX0FDVElPTiwKLSAgICAgICAgIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiBTQ19PT0JfREFUQSAqLwotICAgICAgICB7U01QX1VTRV9PT0JfUFJJVkFURV9LRVksIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9QVUJMSUNfS0VZX0VYQ0h9fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QKLSAgICBzbXBfY2VudHJhbF9wYWlyX3JlcXVlc3RfcmVzcG9uc2VfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAgICAgLyogUEFJUl9SU1AgKi8KLSAgICAgICAge1NNUF9QUk9DX1BBSVJfQ01ELCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQfSwKLSAgICAgICAgLyogVEtfUkVRICovCi0gICAgICAgIHtTTVBfU0VORF9BUFBfQ0JBQ0ssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotCi0gICAgICAgIC8qIFRLIHJlYWR5ICovCi0gICAgICAgIC8qIEtFWV9SRUFEWSAqLwotICAgICAgICB7U01QX0dFTkVSQVRFX0NPTkZJUk0sIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0NPTkZJUk19Ci0gICAgICAgIC8qIFBVQkxfS0VZX0VYQ0hfUkVRICovLAotICAgICAgICB7U01QX0NSRUFURV9QUklWQVRFX0tFWSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1BVQkxJQ19LRVlfRVhDSH19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY2VudHJhbF93YWl0X2Zvcl9jb25maXJtX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogS0VZX1JFQURZKi8KLSAgICAvKiBDT05GSVJNIHJlYWR5ICovCi0gICAge1NNUF9TRU5EX0NPTkZJUk0sIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9DT05GSVJNfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9jZW50cmFsX2NvbmZpcm1fdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgQWN0aW9uICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgIC8qIENPTkZJUk0gKi8KLSAgICB7U01QX1BST0NfQ09ORklSTSwgU01QX1NFTkRfUkFORCwgU01QX1NUQVRFX1JBTkR9fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX2NlbnRyYWxfcmFuZF90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogICAgICAgICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiBOZXh0IFN0YXRlICovCi0gICAgLyogUkFORCAqLwotICAgIHtTTVBfUFJPQ19SQU5ELCBTTVBfR0VORVJBVEVfQ09NUEFSRSwgU01QX1NUQVRFX1JBTkR9LAotICAgIC8qIEtFWV9SRUFEWSAqLwotICAgIHtTTVBfUFJPQ19DT01QQVJFLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUkFORH0sIC8qIENvbXBhcmUgcmVhZHkgKi8KLSAgICAvKiBFTkNfUkVRICovCi0gICAge1NNUF9HRU5FUkFURV9TVEssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9FTkNSWVBUSU9OX1BFTkRJTkd9fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX2NlbnRyYWxfcHVibGljX2tleV9leGNoYW5nZV90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPQotICAgIHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAgICAgLyogTE9DX1BVQkxfS0VZX0NSVEQgKi8KLSAgICAgICAge1NNUF9TRU5EX1BBSVJfUFVCTElDX0tFWSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1BVQkxJQ19LRVlfRVhDSH0sCi0gICAgICAgIC8qIFBBSVJfUFVCTElDX0tFWSAqLwotICAgICAgICB7U01QX1BST0NFU1NfUEFJUl9QVUJMSUNfS0VZLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICAgICAgU01QX1NUQVRFX1BVQkxJQ19LRVlfRVhDSH0sCi0gICAgICAgIC8qIEJPVEhfUFVCTF9LRVlTX1JDVkQgKi8KLSAgICAgICAge1NNUF9IQVZFX0JPVEhfUFVCTElDX0tFWVMsIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY2VudHJhbF9zZWNfY29ubl9waHMxX3N0YXJ0X3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9Ci0gICAgewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgICAgIC8qIFNDX0RIS0VZX0NNUExUICovCi0gICAgICAgIHtTTVBfU1RBUlRfU0VDX0NPTk5fUEhBU0UxLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICAgICAgU01QX1NUQVRFX1NFQ19DT05OX1BIUzFfU1RBUlR9LAotICAgICAgICAvKiBIQVZFX0xPQ19OT05DRSAqLwotICAgICAgICB7U01QX1BST0NFU1NfTE9DQUxfTk9OQ0UsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0NPTU1JVE1FTlR9LAotICAgICAgICAvKiBUS19SRVEgKi8KLSAgICAgICAge1NNUF9TRU5EX0FQUF9DQkFDSywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi0gICAgICAgIC8qIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1AgbW9kZWwsIHBhc3NrZXkgaXMgc2VudCB1cCB0bwotICAgICAgICAgICBkaXNwbGF5LCovCi0gICAgICAgIC8qIEl0J3MgdGltZSB0byBzdGFydCBjb21taXRtZW50IGNhbGN1bGF0aW9uICovCi0gICAgICAgIC8qIEtFWV9SRUFEWSAqLwotICAgICAgICB7U01QX1NUQVJUX1BBU1NLRVlfVkVSSUZJQ0FUSU9OLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICAgICAgU01QX1NUQVRFX1NFQ19DT05OX1BIUzFfU1RBUlR9LAotICAgICAgICAvKiBQQUlSX0tFWVBSX05PVElGICovCi0gICAgICAgIHtTTVBfUFJPQ0VTU19LRVlQUkVTU19OT1RJRklDQVRJT04sIFNNUF9TRU5EX0FQUF9DQkFDSywKLSAgICAgICAgIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMxX1NUQVJUfSwKLSAgICAgICAgLyogUEFJUl9DT01NSVRNICovCi0gICAgICAgIHtTTVBfUFJPQ0VTU19QQUlSSU5HX0NPTU1JVE1FTlQsIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY2VudHJhbF93YWl0X2NvbW1pdG1lbnRfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogUEFJUl9DT01NSVRNICovCi0gICAge1NNUF9QUk9DRVNTX1BBSVJJTkdfQ09NTUlUTUVOVCwgU01QX1NFTkRfUkFORCwgU01QX1NUQVRFX1dBSVRfTk9OQ0V9LAotICAgIC8qIFBBSVJfS0VZUFJfTk9USUYgKi8KLSAgICB7U01QX1BST0NFU1NfS0VZUFJFU1NfTk9USUZJQ0FUSU9OLCBTTVBfU0VORF9BUFBfQ0JBQ0ssCi0gICAgIFNNUF9TVEFURV9XQUlUX0NPTU1JVE1FTlR9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX2NlbnRyYWxfd2FpdF9ub25jZV90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBwZWVyIG5vbmNlIGlzIHJlY2VpdmVkICovCi0gICAgLyogUkFORCAqLwotICAgIHtTTVBfUFJPQ19SQU5ELCBTTVBfUFJPQ0VTU19QRUVSX05PTkNFLCBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMl9TVEFSVH0sCi0gICAgLyogTkMgbW9kZWwsIHRpbWUgdG8gY2FsY3VsYXRlIG51bWJlciBmb3IgTkMgKi8KLSAgICAvKiBTQ19DQUxDX05DICovCi0gICAge1NNUF9DQUxDVUxBVEVfTlVNRVJJQ19DT01QQVJJU09OX0RJU1BMQVlfTlVNQkVSLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICBTTVBfU1RBVEVfV0FJVF9OT05DRX0sCi0gICAgLyogTkMgbW9kZWwsIHRpbWUgdG8gZGlzcGxheSBjYWxjdWxhdGVkIG51bWJlciBmb3IgTkMgdG8gdGhlIHVzZXIgKi8KLSAgICAvKiBTQ19EU1BMX05DICovCi0gICAge1NNUF9TRU5EX0FQUF9DQkFDSywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY2VudHJhbF9zZWNfY29ubl9waHMyX3N0YXJ0X3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9Ci0gICAgewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgICAgICAvKiBTQ19QSEFTRTFfQ01QTFQgKi8KLSAgICAgICAge1NNUF9DQUxDVUxBVEVfTE9DQUxfREhLRVlfQ0hFQ0ssIFNNUF9TRU5EX0RIS0VZX0NIRUNLLAotICAgICAgICAgU01QX1NUQVRFX1dBSVRfREhLX0NIRUNLfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9jZW50cmFsX3dhaXRfZGhrX2NoZWNrX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgIC8qIFBBSVJfREhLRVlfQ0hDSyAqLwotICAgIHtTTVBfUFJPQ0VTU19ESEtFWV9DSEVDSywgU01QX0NBTENVTEFURV9QRUVSX0RIS0VZX0NIRUNLLAotICAgICBTTVBfU1RBVEVfREhLX0NIRUNLfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9jZW50cmFsX2Roa19jaGVja190YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBsb2NhbGx5IGNhbGN1bGF0ZWQgcGVlciBkaGtleSBjaGVjayBpcyByZWFkeSAtPiBjb21wYXJlIGl0IHdpdGhzIERIS2V5Ci0gICAgICogQ2hlY2sKLSAgICAgKiBhY3R1YWxseSByZWNlaXZlZCBmcm9tIHBlZXIgKi8KLSAgICAvKiBTQ19LRVlfUkVBRFkgKi8KLSAgICB7U01QX01BVENIX0RIS0VZX0NIRUNLUywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0RIS19DSEVDS30sCi0gICAgLyogbG9jYWxseSBjYWxjdWxhdGVkIHBlZXIgZGhrZXkgY2hlY2sgaXMgcmVhZHkgLT4gY2FsY3VsYXRlIFNUSywgZ28gdG8KLSAgICAgKiBzZW5kaW5nCi0gICAgICovCi0gICAgLyogSENJIExFIFN0YXJ0IEVuY3J5cHRpb24gY29tbWFuZCAqLwotICAgIC8qIEVOQ19SRVEgKi8KLSAgICB7U01QX0dFTkVSQVRFX1NUSywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0VOQ1JZUFRJT05fUEVORElOR30sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY2VudHJhbF9lbmNfcGVuZGluZ190YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBTVEsgcmVhZHkgKi8KLSAgICAvKiBLRVlfUkVBRFkgKi8KLSAgICB7U01QX1NUQVJUX0VOQywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0VOQ1JZUFRJT05fUEVORElOR30sCi0gICAgLyogRU5DUllQVEVEICovCi0gICAge1NNUF9DSEVDS19BVVRIX1JFUSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0VOQ1JZUFRJT05fUEVORElOR30sCi0gICAgLyogQk9ORF9SRVEgKi8KLSAgICB7U01QX0tFWV9ESVNUUklCVVRFLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HfX07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY2VudHJhbF9ib25kX3BlbmRpbmdfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogRU5DX0lORk8gKi8KLSAgICB7U01QX1BST0NfRU5DX0lORk8sIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9CT05EX1BFTkRJTkd9LAotICAgIC8qIElEX0lORk8gKi8KLSAgICB7U01QX1BST0NfSURfSU5GTywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0JPTkRfUEVORElOR30sCi0gICAgLyogU0lHTl9JTkZPICovCi0gICAge1NNUF9QUk9DX1NSS19JTkZPLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HfSwKLSAgICAvKiBDRU5UUkFMX0lEICovCi0gICAge1NNUF9QUk9DX0NFTlRSQUxfSUQsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9CT05EX1BFTkRJTkd9LAotICAgIC8qIElEX0FERFIgKi8KLSAgICB7U01QX1BST0NfSURfQUREUiwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0JPTkRfUEVORElOR30sCi0gICAgLyogS0VZX1JFQURZICovCi0gICAgLyogTFRLIHJlYWR5ICovCi0gICAge1NNUF9TRU5EX0VOQ19JTkZPLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90Ci0gICAgc21wX2NlbnRyYWxfY3JlYXRlX2xvY2FsX3NlY19jb25uX29vYl9kYXRhW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgICAgICAvKiBMT0NfUFVCTF9LRVlfQ1JURCAqLwotICAgICAgICB7U01QX1NFVF9MT0NBTF9PT0JfS0VZUywgU01QX1NNX05PX0FDVElPTiwKLSAgICAgICAgIFNNUF9TVEFURV9DUkVBVEVfTE9DQUxfU0VDX0NPTk5fT09CX0RBVEF9LAotICAgICAgICAvKiBIQVZFX0xPQ19OT05DRSAqLwotICAgICAgICB7U01QX1NFVF9MT0NBTF9PT0JfUkFORF9DT01NSVRNRU5ULCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfSURMRX19OwotCi0vKioqKioqKioqKioqIFNNUCBQZXJpcGhlcmFsIEZTTSBTdGF0ZS9FdmVudCBJbmRpcmVjdGlvbiBUYWJsZSAqKioqKioqKioqKioqKi8KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9wZXJpcGhlcmFsX2VudHJ5X21hcFtdW1NNUF9TVEFURV9NQVhdID0gewotICAgIC8qIHN0YXRlIG5hbWU6ICovCi0gICAgLyogSWRsZSwgV2FpdEFwcCBSc3AsIFNlY1JlcSBQZW5kLCBQYWlyIFJlcVJzcCwgV2FpdCBDZm0sIENvbmZpcm0sIFJhbmQsCi0gICAgICAgUHVibEtleSBFeGNoLCBTQ1BoczEgU3RydCwgV2FpdCBDbXRtLCBXYWl0IE5vbmNlLCBTQ1BoczIgU3RydCwgV2FpdAotICAgICAgIERIS0NoaywgREhLQ2hrLCBFbmMgUGVuZCwgQm9uZCBQZW5kLCBDckxvY1NjIE9vYkRhdGEgKi8KLSAgICAvKiBQQUlSX1JFUSAqLwotICAgIHsyLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQQUlSX1JTUCAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBDT05GSVJNICovCi0gICAgezAsIDQsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFJBTkQgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMSwgMiwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogUEFJUl9GQUlMICovCi0gICAgezAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCi0gICAgIDB4ODEsIDB4ODEsIDAsIDB9LAotICAgIC8qIEVOQ19JTkZPICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDB9LAotICAgIC8qIENFTlRSQUxfSUQgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNSwgMH0sCi0gICAgLyogSURfSU5GTyAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCAwfSwKLSAgICAvKiBJRF9BRERSICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDYsIDB9LAotICAgIC8qIFNJR05fSU5GTyAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwfSwKLSAgICAvKiBTRUNfUkVRICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFBBSVJfUFVCTElDX0tFWSAqLwotICAgIHswLCAwLCAwLCA1LCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQQUlSX0RIS0VZX0NIQ0sgKi8KLSAgICB7MCwgNSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMSwgMiwgMCwgMCwgMH0sCi0gICAgLyogUEFJUl9LRVlQUl9OT1RJRiAqLwotICAgIHswLCA5LCAwLCAwLCAwLCAwLCAwLCAwLCA1LCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQQUlSX0NPTU1JVE0gKi8KLSAgICB7MCwgOCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogS0VZX1JFQURZICovCi0gICAgezAsIDMsIDAsIDMsIDIsIDIsIDEsIDAsIDQsIDAsIDAsIDAsIDAsIDAsIDIsIDEsIDB9LAotICAgIC8qIEVOQ19DTVBMICovCi0gICAgezAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDB9LAotICAgIC8qIEwyQ19DT05OICovCi0gICAgezEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIEwyQ19ESVNDICovCi0gICAgezAsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCi0gICAgIDB4ODMsIDB4ODMsIDB4ODMsIDB9LAotICAgIC8qIElPX1JTUCAqLwotICAgIHswLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBTRUNfR1JBTlQgKi8KLSAgICB7MCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogVEtfUkVRICovCi0gICAgezAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIEFVVEhfQ01QTCAqLwotICAgIHswLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAotICAgICAweDgyLCAweDgyLCAweDgyLCAwfSwKLSAgICAvKiBFTkNfUkVRICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDB9LAotICAgIC8qIEJPTkRfUkVRICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDAsIDB9LAotICAgIC8qIERJU0NBUkRfU0VDX1JFUSAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBQVUJMX0tFWV9FWENIX1JFUSAqLwotICAgIHswLCAwLCAwLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBMT0NfUFVCTF9LRVlfQ1JURCAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxfSwKLSAgICAvKiBCT1RIX1BVQkxfS0VZU19SQ1ZEICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFNDX0RIS0VZX0NNUExUICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIEhBVkVfTE9DX05PTkNFICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDJ9LAotICAgIC8qIFNDX1BIQVNFMV9DTVBMVCAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBTQ19DQUxDX05DICovCi0gICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFNDX0RTUExfTkMgKi8KLSAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogU0NfTkNfT0sgKi8KLSAgICB7MCwgNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0gICAgLyogU0NfMl9ESENLX0NIS1NfUFJFUyAqLwotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBTQ19LRVlfUkVBRFkgKi8KLSAgICB7MCwgNywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMH0sCi0gICAgLyogS0VZUFJfTk9USUYgKi8KLSAgICB7MCwgMTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgIC8qIFNDX09PQl9EQVRBICovCi0gICAgezAsIDExLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLSAgICAvKiBDUl9MT0NfU0NfT09CX0RBVEEgKi8KLSAgICB7MywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfcGVyaXBoZXJhbF9pZGxlX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBMMkNfQ09OTiAqLwotICAgIHtTTVBfU0VORF9BUFBfQ0JBQ0ssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgIC8qIFBBSVJfUkVRICovCi0gICAge1NNUF9QUk9DX1BBSVJfQ01ELCBTTVBfU0VORF9BUFBfQ0JBQ0ssIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgIC8qIENSX0xPQ19TQ19PT0JfREFUQSAqLwotICAgIHtTTVBfQ1JFQVRFX1BSSVZBVEVfS0VZLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICBTTVBfU1RBVEVfQ1JFQVRFX0xPQ0FMX1NFQ19DT05OX09PQl9EQVRBfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90Ci0gICAgc21wX3BlcmlwaGVyYWxfd2FpdF9mb3JfYXBwX3Jlc3BvbnNlX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgICAgIC8qIElPX1JTUCAqLwotICAgICAgICB7U01QX1BST0NfSU9fUlNQLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQfSwKLSAgICAgICAgLyogU0VDX0dSQU5UICovCi0gICAgICAgIHtTTVBfUFJPQ19TRUNfR1JBTlQsIFNNUF9TRU5EX0FQUF9DQkFDSywgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi0KLSAgICAgICAgLyogVEsgcmVhZHkgKi8KLSAgICAgICAgLyogS0VZX1JFQURZICovCi0gICAgICAgIHtTTVBfUFJPQ19TTF9LRVksIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiBDT05GSVJNICovCi0gICAgICAgIHtTTVBfUFJPQ19DT05GSVJNLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQ09ORklSTX0sCi0gICAgICAgIC8qIERIS2V5IENoZWNrIGZyb20gY2VudHJhbCBpcyByZWNlaXZlZCBiZWZvcmUgcGhhc2UgMSBpcyBjb21wbGV0ZWQgLQotICAgICAgICAgICByYWNlICovCi0gICAgICAgIC8qIFBBSVJfREhLRVlfQ0hDSyAqLwotICAgICAgICB7U01QX1BST0NFU1NfREhLRVlfQ0hFQ0ssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiB1c2VyIGNvbmZpcm1zIE5DICdPSycsIGkuZS4gcGhhc2UgMSBpcyBjb21wbGV0ZWQgKi8KLSAgICAgICAgLyogU0NfTkNfT0sgKi8KLSAgICAgICAge1NNUF9NT1ZFX1RPX1NFQ19DT05OX1BIQVNFMiwgU01QX1NNX05PX0FDVElPTiwKLSAgICAgICAgIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMyX1NUQVJUfSwKLSAgICAgICAgLyogdXNlci1wcm92aWRlZCBwYXNza2V5IGlzIHJjdmQgKi8KLSAgICAgICAgLyogU0NfS0VZX1JFQURZICovCi0gICAgICAgIHtTTVBfU1RBUlRfUEFTU0tFWV9WRVJJRklDQVRJT04sIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVH0sCi0gICAgICAgIC8qIFBBSVJfQ09NTUlUTSAqLwotICAgICAgICB7U01QX1BST0NFU1NfUEFJUklOR19DT01NSVRNRU5ULCBTTVBfU01fTk9fQUNUSU9OLAotICAgICAgICAgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi0gICAgICAgIC8qIFBBSVJfS0VZUFJfTk9USUYgKi8KLSAgICAgICAge1NNUF9QUk9DRVNTX0tFWVBSRVNTX05PVElGSUNBVElPTiwgU01QX1NFTkRfQVBQX0NCQUNLLAotICAgICAgICAgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi0gICAgICAgIC8qIEtFWVBSX05PVElGICovCi0gICAgICAgIHtTTVBfU0VORF9LRVlQUkVTU19OT1RJRklDQVRJT04sIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfV0FJVF9BUFBfUlNQfSwKLSAgICAgICAgLyogU0NfT09CX0RBVEEgKi8KLSAgICAgICAge1NNUF9TRU5EX1BBSVJfUlNQLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9wZXJpcGhlcmFsX3NlY19yZXF1ZXN0X3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgIC8qIFBBSVJfUkVRICovCi0gICAge1NNUF9QUk9DX1BBSVJfQ01ELCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQfSwKLSAgICAvKiBFTkNSWVBURUQqLwotICAgIHtTTVBfRU5DX0NNUEwsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9QQUlSX1JFUV9SU1B9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QKLSAgICBzbXBfcGVyaXBoZXJhbF9wYWlyX3JlcXVlc3RfcmVzcG9uc2VfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgICAgICAvKiBDT05GSVJNICovCi0gICAgICAgIHtTTVBfUFJPQ19DT05GSVJNLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQ09ORklSTX0sCi0gICAgICAgIC8qIFRLX1JFUSAqLwotICAgICAgICB7U01QX1NFTkRfQVBQX0NCQUNLLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfV0FJVF9BUFBfUlNQfSwKLQotICAgICAgICAvKiBUSy9Db25maXJtIHJlYWR5ICovCi0gICAgICAgIC8qIEtFWV9SRUFEWSAqLwotICAgICAgICB7U01QX1BST0NfU0xfS0VZLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfUEFJUl9SRVFfUlNQfSwKLSAgICAgICAgLyogUFVCTF9LRVlfRVhDSF9SRVEgKi8KLSAgICAgICAge1NNUF9DUkVBVEVfUFJJVkFURV9LRVksIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9QVUJMSUNfS0VZX0VYQ0h9LAotICAgICAgICAvKiBQQUlSX1BVQkxJQ19LRVkgKi8KLSAgICAgICAge1NNUF9QUk9DRVNTX1BBSVJfUFVCTElDX0tFWSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1BBSVJfUkVRX1JTUH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfcGVyaXBoZXJhbF93YWl0X2NvbmZpcm1fdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogQ09ORklSTSAqLwotICAgIHtTTVBfUFJPQ19DT05GSVJNLCBTTVBfU0VORF9DT05GSVJNLCBTTVBfU1RBVEVfQ09ORklSTX0sCi0gICAgLyogS0VZX1JFQURZKi8KLSAgICB7U01QX1BST0NfU0xfS0VZLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfV0FJVF9DT05GSVJNfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9wZXJpcGhlcmFsX2NvbmZpcm1fdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogUkFORCAqLwotICAgIHtTTVBfUFJPQ19SQU5ELCBTTVBfR0VORVJBVEVfQ09NUEFSRSwgU01QX1NUQVRFX1JBTkR9LAotCi0gICAgLyogVEsvQ29uZmlybSByZWFkeSAqLwotICAgIC8qIEtFWV9SRUFEWSovCi0gICAge1NNUF9QUk9DX1NMX0tFWSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0NPTkZJUk19fTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX3BlcmlwaGVyYWxfcmFuZF90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBLRVlfUkVBRFkgKi8KLSAgICB7U01QX1BST0NfQ09NUEFSRSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1JBTkR9LCAvKiBjb21wYXJlIG1hdGNoICovCi0gICAgLyogUkFORCAqLwotICAgIHtTTVBfU0VORF9SQU5ELCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfRU5DUllQVElPTl9QRU5ESU5HfX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9wZXJpcGhlcmFsX3B1YmxpY19rZXlfZXhjaF90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBMT0NfUFVCTF9LRVlfQ1JURCAqLwotICAgIHtTTVBfV0FJVF9GT1JfQk9USF9QVUJMSUNfS0VZUywgU01QX1NNX05PX0FDVElPTiwKLSAgICAgU01QX1NUQVRFX1BVQkxJQ19LRVlfRVhDSH0sCi0gICAgLyogUEFJUl9QVUJMSUNfS0VZICovCi0gICAge1NNUF9QUk9DRVNTX1BBSVJfUFVCTElDX0tFWSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1BVQkxJQ19LRVlfRVhDSH0sCi0gICAgLyogQk9USF9QVUJMX0tFWVNfUkNWRCAqLwotICAgIHtTTVBfSEFWRV9CT1RIX1BVQkxJQ19LRVlTLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdAotICAgIHNtcF9wZXJpcGhlcmFsX3NlY19jb25uX3BoczFfc3RhcnRfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgICAgICAvKiBTQ19ESEtFWV9DTVBMVCAqLwotICAgICAgICB7U01QX1NUQVJUX1NFQ19DT05OX1BIQVNFMSwgU01QX1NNX05PX0FDVElPTiwKLSAgICAgICAgIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMxX1NUQVJUfSwKLSAgICAgICAgLyogSEFWRV9MT0NfTk9OQ0UgKi8KLSAgICAgICAge1NNUF9QUk9DRVNTX0xPQ0FMX05PTkNFLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfV0FJVF9DT01NSVRNRU5UfSwKLSAgICAgICAgLyogVEtfUkVRICovCi0gICAgICAgIHtTTVBfU0VORF9BUFBfQ0JBQ0ssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9XQUlUX0FQUF9SU1B9LAotICAgICAgICAvKiBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9ESVNQIG1vZGVsLCBwYXNza2V5IGlzIHNlbnQgdXAgdG8gZGlzcGxheSwKLSAgICAgICAgICogaXQncwotICAgICAgICAgKiB0aW1lIHRvIHN0YXJ0ICovCi0gICAgICAgIC8qIGNvbW1pdG1lbnQgY2FsY3VsYXRpb24gKi8KLSAgICAgICAgLyogS0VZX1JFQURZICovCi0gICAgICAgIHtTTVBfU1RBUlRfUEFTU0tFWV9WRVJJRklDQVRJT04sIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVH0sCi0gICAgICAgIC8qIFBBSVJfS0VZUFJfTk9USUYgKi8KLSAgICAgICAge1NNUF9QUk9DRVNTX0tFWVBSRVNTX05PVElGSUNBVElPTiwgU01QX1NFTkRfQVBQX0NCQUNLLAotICAgICAgICAgU01QX1NUQVRFX1NFQ19DT05OX1BIUzFfU1RBUlR9LAotICAgICAgICAvKkNPTU1JVCovCi0gICAgICAgIHtTTVBfUFJPQ0VTU19QQUlSSU5HX0NPTU1JVE1FTlQsIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMV9TVEFSVH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfcGVyaXBoZXJhbF93YWl0X2NvbW1pdG1lbnRfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogUEFJUl9DT01NSVRNICovCi0gICAge1NNUF9QUk9DRVNTX1BBSVJJTkdfQ09NTUlUTUVOVCwgU01QX1NFTkRfQ09NTUlUTUVOVCwgU01QX1NUQVRFX1dBSVRfTk9OQ0V9LAotICAgIC8qIFBBSVJfS0VZUFJfTk9USUYgKi8KLSAgICB7U01QX1BST0NFU1NfS0VZUFJFU1NfTk9USUZJQ0FUSU9OLCBTTVBfU0VORF9BUFBfQ0JBQ0ssCi0gICAgIFNNUF9TVEFURV9XQUlUX0NPTU1JVE1FTlR9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX3BlcmlwaGVyYWxfd2FpdF9ub25jZV90YWJsZVtdW1NNUF9TTV9OVU1fQ09MU10gPSB7Ci0gICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAvKiBwZWVyIG5vbmNlIGlzIHJlY2VpdmVkICovCi0gICAgLyogUkFORCAqLwotICAgIHtTTVBfUFJPQ19SQU5ELCBTTVBfUFJPQ0VTU19QRUVSX05PTkNFLCBTTVBfU1RBVEVfU0VDX0NPTk5fUEhTMl9TVEFSVH0sCi0gICAgLyogTkMgbW9kZWwsIHRpbWUgdG8gY2FsY3VsYXRlIG51bWJlciBmb3IgTkMgKi8KLSAgICAvKiBTQ19DQUxDX05DICovCi0gICAge1NNUF9DQUxDVUxBVEVfTlVNRVJJQ19DT01QQVJJU09OX0RJU1BMQVlfTlVNQkVSLCBTTVBfU01fTk9fQUNUSU9OLAotICAgICBTTVBfU1RBVEVfV0FJVF9OT05DRX0sCi0gICAgLyogTkMgbW9kZWwsIHRpbWUgdG8gZGlzcGxheSBjYWxjdWxhdGVkIG51bWJlciBmb3IgTkMgdG8gdGhlIHVzZXIgKi8KLSAgICAvKiBTQ19EU1BMX05DICovCi0gICAge1NNUF9TRU5EX0FQUF9DQkFDSywgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX1dBSVRfQVBQX1JTUH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdAotICAgIHNtcF9wZXJpcGhlcmFsX3NlY19jb25uX3BoczJfc3RhcnRfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgICAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgICAgICAvKiBTQ19QSEFTRTFfQ01QTFQgKi8KLSAgICAgICAge1NNUF9DQUxDVUxBVEVfTE9DQUxfREhLRVlfQ0hFQ0ssIFNNUF9QSDJfREhLRVlfQ0hFQ0tTX0FSRV9QUkVTRU5ULAotICAgICAgICAgU01QX1NUQVRFX1dBSVRfREhLX0NIRUNLfSwKLSAgICAgICAgLyogREhLZXkgQ2hlY2sgZnJvbSBjZW50cmFsIGlzIHJlY2VpdmVkIGJlZm9yZSBwZXJpcGhlcmFsIERIS2V5Ci0gICAgICAgICAqIGNhbGN1bGF0aW9uIGlzIGNvbXBsZXRlZCAtIHJhY2UgKi8KLSAgICAgICAgLyogUEFJUl9ESEtFWV9DSENLICovCi0gICAgICAgIHtTTVBfUFJPQ0VTU19ESEtFWV9DSEVDSywgU01QX1NNX05PX0FDVElPTiwKLSAgICAgICAgIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMyX1NUQVJUfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNtcF9wZXJpcGhlcmFsX3dhaXRfZGhrX2NoZWNrX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotICAgIC8qIFBBSVJfREhLRVlfQ0hDSyAqLwotICAgIHtTTVBfUFJPQ0VTU19ESEtFWV9DSEVDSywgU01QX0NBTENVTEFURV9QRUVSX0RIS0VZX0NIRUNLLAotICAgICBTTVBfU1RBVEVfREhLX0NIRUNLfSwKLSAgICAvKiBESEtleSBDaGVjayBmcm9tIGNlbnRyYWwgd2FzIHJlY2VpdmVkIGJlZm9yZSBwZXJpcGhlcmFsIGNhbWUgdG8gdGhpcwotICAgICAgIHN0YXRlICovCi0gICAgLyogU0NfMl9ESENLX0NIS1NfUFJFUyAqLwotICAgIHtTTVBfQ0FMQ1VMQVRFX1BFRVJfREhLRVlfQ0hFQ0ssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9ESEtfQ0hFQ0t9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX3BlcmlwaGVyYWxfZGhrX2NoZWNrX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotCi0gICAgLyogbG9jYWxseSBjYWxjdWxhdGVkIHBlZXIgZGhrZXkgY2hlY2sgaXMgcmVhZHkgLT4gY29tcGFyZSBpdCB3aXRocyBESEtleQotICAgICAqIENoZWNrCi0gICAgICovCi0gICAgLyogYWN0dWFsbHkgcmVjZWl2ZWQgZnJvbSBwZWVyICovCi0gICAgLyogU0NfS0VZX1JFQURZICovCi0gICAge1NNUF9NQVRDSF9ESEtFWV9DSEVDS1MsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9ESEtfQ0hFQ0t9LAotCi0gICAgLyogZGhrZXkgY2hlY2tzIG1hdGNoIC0+IHNlbmQgbG9jYWwgZGhrZXkgY2hlY2sgdG8gY2VudHJhbCwgZ28gdG8gd2FpdCBmb3IKLSAgICAgKiBIQ0kgTEUKLSAgICAgKi8KLSAgICAvKiBMb25nIFRlcm0gS2V5IFJlcXVlc3QgRXZlbnQgKi8KLSAgICAvKiBQQUlSX0RIS0VZX0NIQ0sgKi8KLSAgICB7U01QX1NFTkRfREhLRVlfQ0hFQ0ssIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9FTkNSWVBUSU9OX1BFTkRJTkd9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX3BlcmlwaGVyYWxfZW5jX3BlbmRpbmdfdGFibGVbXVtTTVBfU01fTlVNX0NPTFNdID0gewotICAgIC8qIEV2ZW50ICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICBOZXh0IFN0YXRlICovCi0gICAgLyogRU5DX1JFUSAqLwotICAgIHtTTVBfR0VORVJBVEVfU1RLLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfRU5DUllQVElPTl9QRU5ESU5HfSwKLQotICAgIC8qIFNUSyByZWFkeSAqLwotICAgIC8qIEtFWV9SRUFEWSAqLwotICAgIHtTTVBfU0VORF9MVEtfUkVQTFksIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9FTkNSWVBUSU9OX1BFTkRJTkd9LAotICAgIC8qIEVOQ1JZUFRFRCAqLwotICAgIHtTTVBfQ0hFQ0tfQVVUSF9SRVEsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9FTkNSWVBUSU9OX1BFTkRJTkd9LAotICAgIC8qIEJPTkRfUkVRICovCi0gICAge1NNUF9LRVlfRElTVFJJQlVURSwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0JPTkRfUEVORElOR319Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc21wX3BlcmlwaGVyYWxfYm9uZF9wZW5kaW5nX3RhYmxlW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAvKiBFdmVudCAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgTmV4dCBTdGF0ZSAqLwotCi0gICAgLyogTFRLIHJlYWR5ICovCi0gICAgLyogS0VZX1JFQURZICovCi0gICAge1NNUF9TRU5EX0VOQ19JTkZPLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HfSwKLQotICAgIC8qIHJldiBTUksgKi8KLSAgICAvKiBTSUdOX0lORk8gKi8KLSAgICB7U01QX1BST0NfU1JLX0lORk8sIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9CT05EX1BFTkRJTkd9LAotICAgIC8qIEVOQ19JTkZPICovCi0gICAge1NNUF9QUk9DX0VOQ19JTkZPLCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HfSwKLSAgICAvKiBJRF9JTkZPICovCi0gICAge1NNUF9QUk9DX0lEX0lORk8sIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9CT05EX1BFTkRJTkd9LAotICAgIC8qIENFTlRSQUxfSUQqLwotICAgIHtTTVBfUFJPQ19DRU5UUkFMX0lELCBTTVBfU01fTk9fQUNUSU9OLCBTTVBfU1RBVEVfQk9ORF9QRU5ESU5HfSwKLSAgICAvKiBJRF9BRERSICovCi0gICAge1NNUF9QUk9DX0lEX0FERFIsIFNNUF9TTV9OT19BQ1RJT04sIFNNUF9TVEFURV9CT05EX1BFTkRJTkd9Ci0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90Ci0gICAgc21wX3BlcmlwaGVyYWxfY3JlYXRlX2xvY2FsX3NlY19jb25uX29vYl9kYXRhW11bU01QX1NNX05VTV9DT0xTXSA9IHsKLSAgICAgICAgLyogRXZlbnQgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgIE5leHQgU3RhdGUgKi8KLSAgICAgICAgLyogTE9DX1BVQkxfS0VZX0NSVEQgKi8KLSAgICAgICAge1NNUF9TRVRfTE9DQUxfT09CX0tFWVMsIFNNUF9TTV9OT19BQ1RJT04sCi0gICAgICAgICBTTVBfU1RBVEVfQ1JFQVRFX0xPQ0FMX1NFQ19DT05OX09PQl9EQVRBfSwKLSAgICAgICAgLyogSEFWRV9MT0NfTk9OQ0UgKi8KLSAgICAgICAge1NNUF9TRVRfTE9DQUxfT09CX1JBTkRfQ09NTUlUTUVOVCwgU01QX1NNX05PX0FDVElPTiwgU01QX1NUQVRFX0lETEV9fTsKLQotc3RhdGljIGNvbnN0IHRTTVBfU01fVEJMIHNtcF9zdGF0ZV90YWJsZVtdWzJdID0gewotICAgIC8qIFNNUF9TVEFURV9JRExFICovCi0gICAge3NtcF9jZW50cmFsX2lkbGVfdGFibGUsIHNtcF9wZXJpcGhlcmFsX2lkbGVfdGFibGV9LAotCi0gICAgLyogU01QX1NUQVRFX1dBSVRfQVBQX1JTUCAqLwotICAgIHtzbXBfY2VudHJhbF93YWl0X2Zvcl9hcHBfcmVzcG9uc2VfdGFibGUsCi0gICAgIHNtcF9wZXJpcGhlcmFsX3dhaXRfZm9yX2FwcF9yZXNwb25zZV90YWJsZX0sCi0KLSAgICAvKiBTTVBfU1RBVEVfU0VDX1JFUV9QRU5ESU5HICovCi0gICAge05VTEwsIHNtcF9wZXJpcGhlcmFsX3NlY19yZXF1ZXN0X3RhYmxlfSwKLQotICAgIC8qIFNNUF9TVEFURV9QQUlSX1JFUV9SU1AgKi8KLSAgICB7c21wX2NlbnRyYWxfcGFpcl9yZXF1ZXN0X3Jlc3BvbnNlX3RhYmxlLAotICAgICBzbXBfcGVyaXBoZXJhbF9wYWlyX3JlcXVlc3RfcmVzcG9uc2VfdGFibGV9LAotCi0gICAgLyogU01QX1NUQVRFX1dBSVRfQ09ORklSTSAqLwotICAgIHtzbXBfY2VudHJhbF93YWl0X2Zvcl9jb25maXJtX3RhYmxlLCBzbXBfcGVyaXBoZXJhbF93YWl0X2NvbmZpcm1fdGFibGV9LAotCi0gICAgLyogU01QX1NUQVRFX0NPTkZJUk0gKi8KLSAgICB7c21wX2NlbnRyYWxfY29uZmlybV90YWJsZSwgc21wX3BlcmlwaGVyYWxfY29uZmlybV90YWJsZX0sCi0KLSAgICAvKiBTTVBfU1RBVEVfUkFORCAqLwotICAgIHtzbXBfY2VudHJhbF9yYW5kX3RhYmxlLCBzbXBfcGVyaXBoZXJhbF9yYW5kX3RhYmxlfSwKLQotICAgIC8qIFNNUF9TVEFURV9QVUJMSUNfS0VZX0VYQ0ggKi8KLSAgICB7c21wX2NlbnRyYWxfcHVibGljX2tleV9leGNoYW5nZV90YWJsZSwKLSAgICAgc21wX3BlcmlwaGVyYWxfcHVibGljX2tleV9leGNoX3RhYmxlfSwKLQotICAgIC8qIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMxX1NUQVJUICovCi0gICAge3NtcF9jZW50cmFsX3NlY19jb25uX3BoczFfc3RhcnRfdGFibGUsCi0gICAgIHNtcF9wZXJpcGhlcmFsX3NlY19jb25uX3BoczFfc3RhcnRfdGFibGV9LAotCi0gICAgLyogU01QX1NUQVRFX1dBSVRfQ09NTUlUTUVOVCAqLwotICAgIHtzbXBfY2VudHJhbF93YWl0X2NvbW1pdG1lbnRfdGFibGUsIHNtcF9wZXJpcGhlcmFsX3dhaXRfY29tbWl0bWVudF90YWJsZX0sCi0KLSAgICAvKiBTTVBfU1RBVEVfV0FJVF9OT05DRSAqLwotICAgIHtzbXBfY2VudHJhbF93YWl0X25vbmNlX3RhYmxlLCBzbXBfcGVyaXBoZXJhbF93YWl0X25vbmNlX3RhYmxlfSwKLQotICAgIC8qIFNNUF9TVEFURV9TRUNfQ09OTl9QSFMyX1NUQVJUICovCi0gICAge3NtcF9jZW50cmFsX3NlY19jb25uX3BoczJfc3RhcnRfdGFibGUsCi0gICAgIHNtcF9wZXJpcGhlcmFsX3NlY19jb25uX3BoczJfc3RhcnRfdGFibGV9LAotCi0gICAgLyogU01QX1NUQVRFX1dBSVRfREhLX0NIRUNLICovCi0gICAge3NtcF9jZW50cmFsX3dhaXRfZGhrX2NoZWNrX3RhYmxlLCBzbXBfcGVyaXBoZXJhbF93YWl0X2Roa19jaGVja190YWJsZX0sCi0KLSAgICAvKiBTTVBfU1RBVEVfREhLX0NIRUNLICovCi0gICAge3NtcF9jZW50cmFsX2Roa19jaGVja190YWJsZSwgc21wX3BlcmlwaGVyYWxfZGhrX2NoZWNrX3RhYmxlfSwKLQotICAgIC8qIFNNUF9TVEFURV9FTkNSWVBUSU9OX1BFTkRJTkcgKi8KLSAgICB7c21wX2NlbnRyYWxfZW5jX3BlbmRpbmdfdGFibGUsIHNtcF9wZXJpcGhlcmFsX2VuY19wZW5kaW5nX3RhYmxlfSwKLQotICAgIC8qIFNNUF9TVEFURV9CT05EX1BFTkRJTkcgKi8KLSAgICB7c21wX2NlbnRyYWxfYm9uZF9wZW5kaW5nX3RhYmxlLCBzbXBfcGVyaXBoZXJhbF9ib25kX3BlbmRpbmdfdGFibGV9LAotCi0gICAgLyogU01QX1NUQVRFX0NSRUFURV9MT0NBTF9TRUNfQ09OTl9PT0JfREFUQSAqLwotICAgIHtzbXBfY2VudHJhbF9jcmVhdGVfbG9jYWxfc2VjX2Nvbm5fb29iX2RhdGEsCi0gICAgIHNtcF9wZXJpcGhlcmFsX2NyZWF0ZV9sb2NhbF9zZWNfY29ubl9vb2JfZGF0YX19OwotCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCp0U01QX0VOVFJZX1RCTClbU01QX1NUQVRFX01BWF07Ci1zdGF0aWMgY29uc3QgdFNNUF9FTlRSWV9UQkwgc21wX2VudHJ5X3RhYmxlW10gPSB7c21wX2NlbnRyYWxfZW50cnlfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtcF9wZXJpcGhlcmFsX2VudHJ5X21hcH07Ci0KLXRTTVBfQ0Igc21wX2NiOwotCi0jZGVmaW5lIFNNUF9BTExfVEJMX01BU0sgMHg4MAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9zZXRfc3RhdGUKLSAqIFJldHVybnMgICAgICBOb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc2V0X3N0YXRlKHRTTVBfU1RBVEUgc3RhdGUpIHsKLSAgaWYgKHN0YXRlIDwgU01QX1NUQVRFX01BWCkgewotICAgIFNNUF9UUkFDRV9ERUJVRygiU3RhdGUgY2hhbmdlOiAlcyglZCkgPT0+ICVzKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHNtcF9nZXRfc3RhdGVfbmFtZShzbXBfY2Iuc3RhdGUpLCBzbXBfY2Iuc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIHNtcF9nZXRfc3RhdGVfbmFtZShzdGF0ZSksIHN0YXRlKTsKLSAgICBzbXBfY2Iuc3RhdGUgPSBzdGF0ZTsKLSAgfSBlbHNlIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoInNtcF9zZXRfc3RhdGUgaW52YWxpZCBzdGF0ZSA9JWQiLCBzdGF0ZSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICBzbXBfZ2V0X3N0YXRlCi0gKiBSZXR1cm5zICAgICAgVGhlIHNtcCBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTTVBfU1RBVEUgc21wX2dldF9zdGF0ZSh2b2lkKSB7IHJldHVybiBzbXBfY2Iuc3RhdGU7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgc21wX3NtX2V2ZW50Ci0gKgotICogRGVzY3JpcHRpb24gIEhhbmRsZSBldmVudHMgdG8gdGhlIHN0YXRlIG1hY2hpbmUuIEl0IGxvb2tzIHVwIHRoZSBlbnRyeQotICogICAgICAgICAgICAgIGluIHRoZSBzbXBfZW50cnlfdGFibGUgYXJyYXkuCi0gKiAgICAgICAgICAgICAgSWYgaXQgaXMgYSB2YWxpZCBlbnRyeSwgaXQgZ2V0cyB0aGUgc3RhdGUgdGFibGUuIFNldCB0aGUgbmV4dAotICogICAgICAgICAgICAgIHN0YXRlLCBpZiBub3QgTlVMTCBzdGF0ZS4gRXhlY3V0ZSB0aGUgYWN0aW9uIGZ1bmN0aW9uIGFjY29yZGluZwotICogICAgICAgICAgICAgIHRvIHRoZSBzdGF0ZSB0YWJsZS4gSWYgdGhlIHN0YXRlIHJldHVybmVkIGJ5IGFjdGlvbiBmdW5jdGlvbiBpcwotICogICAgICAgICAgICAgIG5vdCBOVUxMIHN0YXRlLCBhZGp1c3QgdGhlIG5ldyBzdGF0ZSB0byB0aGUgcmV0dXJuZWQgc3RhdGUuIElmCi0gKiAgICAgICAgICAgICAgKGFwaV9ldnQgIT0gTUFYKSwgY2FsbCBjYWxsYmFjayBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfc21fZXZlbnQodFNNUF9DQiogcF9jYiwgdFNNUF9FVkVOVCBldmVudCwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIHVpbnQ4X3QgY3Vycl9zdGF0ZSA9IHBfY2ItPnN0YXRlOwotICB0U01QX1NNX1RCTCBzdGF0ZV90YWJsZTsKLSAgdWludDhfdCBhY3Rpb24sIGVudHJ5LCBpOwotCi0gIGlmIChwX2NiLT5yb2xlID49IDIpIHsKLSAgICBTTVBfVFJBQ0VfREVCVUcoIkludmFsaWQgcm9sZTogJWQiLCBwX2NiLT5yb2xlKTsKLSAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjc0MTIxMTI2Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdFNNUF9FTlRSWV9UQkwgZW50cnlfdGFibGUgPSBzbXBfZW50cnlfdGFibGVbcF9jYi0+cm9sZV07Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCJtYWluIHNtcF9zbV9ldmVudCIpOwotICBpZiAoY3Vycl9zdGF0ZSA+PSBTTVBfU1RBVEVfTUFYKSB7Ci0gICAgU01QX1RSQUNFX0RFQlVHKCJJbnZhbGlkIHN0YXRlOiAlZCIsIGN1cnJfc3RhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNNUF9UUkFDRV9ERUJVRygiU01QIFJvbGU6ICVzIFN0YXRlOiBbJXMgKCVkKV0sIEV2ZW50OiBbJXMgKCVkKV0iLAotICAgICAgICAgICAgICAgICAgKHBfY2ItPnJvbGUgPT0gMHgwMSkgPyAiUGVyaXBoZXJhbCIgOiAiQ2VudHJhbCIsCi0gICAgICAgICAgICAgICAgICBzbXBfZ2V0X3N0YXRlX25hbWUocF9jYi0+c3RhdGUpLCBwX2NiLT5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgIHNtcF9nZXRfZXZlbnRfbmFtZShldmVudCksIGV2ZW50KTsKLQotICAvKiBsb29rIHVwIHRoZSBzdGF0ZSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgLyogbG9va3VwIGVudHJ5IC93IGV2ZW50ICYgY3Vycl9zdGF0ZSAqLwotICAvKiBJZiBlbnRyeSBpcyBpZ25vcmUsIHJldHVybi4KLSAgICogT3RoZXJ3aXNlLCBnZXQgc3RhdGUgdGFibGUgKGFjY29yZGluZyB0byBjdXJyX3N0YXRlIG9yIGFsbF9zdGF0ZSkgKi8KLSAgaWYgKChldmVudCA8PSBTTVBfTUFYX0VWVCkgJiYKLSAgICAgICgoZW50cnkgPSBlbnRyeV90YWJsZVtldmVudCAtIDFdW2N1cnJfc3RhdGVdKSAhPSBTTVBfU01fSUdOT1JFKSkgewotICAgIGlmIChlbnRyeSAmIFNNUF9BTExfVEJMX01BU0spIHsKLSAgICAgIGVudHJ5ICY9IH5TTVBfQUxMX1RCTF9NQVNLOwotICAgICAgc3RhdGVfdGFibGUgPSBzbXBfYWxsX3RhYmxlOwotICAgIH0gZWxzZQotICAgICAgc3RhdGVfdGFibGUgPSBzbXBfc3RhdGVfdGFibGVbY3Vycl9zdGF0ZV1bcF9jYi0+cm9sZV07Ci0gIH0gZWxzZSB7Ci0gICAgU01QX1RSQUNFX0RFQlVHKCJJZ25vcmUgZXZlbnQgWyVzICglZCldIGluIHN0YXRlIFslcyAoJWQpXSIsCi0gICAgICAgICAgICAgICAgICAgIHNtcF9nZXRfZXZlbnRfbmFtZShldmVudCksIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICBzbXBfZ2V0X3N0YXRlX25hbWUoY3Vycl9zdGF0ZSksIGN1cnJfc3RhdGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIEdldCBwb3NzaWJsZSBuZXh0IHN0YXRlIGZyb20gc3RhdGUgdGFibGUuICovCi0KLSAgc21wX3NldF9zdGF0ZShzdGF0ZV90YWJsZVtlbnRyeSAtIDFdW1NNUF9TTUVfTkVYVF9TVEFURV0pOwotCi0gIC8qIElmIGFjdGlvbiBpcyBub3QgaWdub3JlLCBjbGVhciBwYXJhbSwgZXhlYyBhY3Rpb24gYW5kIGdldCBuZXh0IHN0YXRlLgotICAgKiBUaGUgYWN0aW9uIGZ1bmN0aW9uIG1heSBzZXQgdGhlIFBhcmFtIGZvciBjYmFjay4KLSAgICogRGVwZW5kaW5nIG9uIHBhcmFtLCBjYWxsIGNiYWNrIG9yIGZyZWUgYnVmZmVyLiAqLwotICAvKiBleGVjdXRlIGFjdGlvbiAqLwotICAvKiBleGVjdXRlIGFjdGlvbiBmdW5jdGlvbnMgKi8KLSAgZm9yIChpID0gMDsgaSA8IFNNUF9OVU1fQUNUSU9OUzsgaSsrKSB7Ci0gICAgYWN0aW9uID0gc3RhdGVfdGFibGVbZW50cnkgLSAxXVtpXTsKLSAgICBpZiAoYWN0aW9uICE9IFNNUF9TTV9OT19BQ1RJT04pIHsKLSAgICAgICgqc21wX3NtX2FjdGlvblthY3Rpb25dKShwX2NiLCBwX2RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgU01QX1RSQUNFX0RFQlVHKCJyZXN1bHQgc3RhdGUgPSAlcyIsIHNtcF9nZXRfc3RhdGVfbmFtZShwX2NiLT5zdGF0ZSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgIHNtcF9nZXRfc3RhdGVfbmFtZQotICogUmV0dXJucyAgICAgIFRoZSBzbXAgc3RhdGUgbmFtZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyKiBzbXBfZ2V0X3N0YXRlX25hbWUodFNNUF9TVEFURSBzdGF0ZSkgewotICBjb25zdCBjaGFyKiBwX3N0ciA9IHNtcF9zdGF0ZV9uYW1lW1NNUF9TVEFURV9NQVhdOwotCi0gIGlmIChzdGF0ZSA8IFNNUF9TVEFURV9NQVgpIHsKLSAgICBwX3N0ciA9IHNtcF9zdGF0ZV9uYW1lW3N0YXRlXTsKLSAgfQotICByZXR1cm4gcF9zdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgc21wX2dldF9ldmVudF9uYW1lCi0gKiBSZXR1cm5zICAgICAgVGhlIHNtcCBldmVudCBuYW1lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIqIHNtcF9nZXRfZXZlbnRfbmFtZSh0U01QX0VWRU5UIGV2ZW50KSB7Ci0gIGNvbnN0IGNoYXIqIHBfc3RyID0gc21wX2V2ZW50X25hbWVbU01QX01BWF9FVlRdOwotCi0gIGlmIChldmVudCA8PSBTTVBfTUFYX0VWVCkgewotICAgIHBfc3RyID0gc21wX2V2ZW50X25hbWVbZXZlbnQgLSAxXTsKLSAgfQotICByZXR1cm4gcF9zdHI7Ci19CmRpZmYgLS1naXQgYS9zdGFjay9zbXAvc21wX3V0aWxzLmNjIGIvc3RhY2svc21wL3NtcF91dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlOTQ2MS4uMDAwMDAwMAotLS0gYS9zdGFjay9zbXAvc21wX3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgdGhlIFNNUCBMMkNBUCB1dGlsaXR5IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0X3V0aWxzLmgiCi0jaW5jbHVkZSAiYnRtX2JsZV9hcGkuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInNtcF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zdGFja19tZXRyaWNzX2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNkZWZpbmUgU01QX1BBSVJJTkdfUkVRX1NJWkUgNwotI2RlZmluZSBTTVBfQ09ORklSTV9DTURfU0laRSAoT0NURVQxNl9MRU4gKyAxKQotI2RlZmluZSBTTVBfUkFORF9DTURfU0laRSAoT0NURVQxNl9MRU4gKyAxKQotI2RlZmluZSBTTVBfSU5JVF9DTURfU0laRSAoT0NURVQxNl9MRU4gKyAxKQotI2RlZmluZSBTTVBfRU5DX0lORk9fU0laRSAoT0NURVQxNl9MRU4gKyAxKQotI2RlZmluZSBTTVBfQ0VOVFJBTF9JRF9TSVpFIChCVF9PQ1RFVDhfTEVOICsgMiArIDEpCi0jZGVmaW5lIFNNUF9JRF9JTkZPX1NJWkUgKE9DVEVUMTZfTEVOICsgMSkKLSNkZWZpbmUgU01QX0lEX0FERFJfU0laRSAoQkRfQUREUl9MRU4gKyAxICsgMSkKLSNkZWZpbmUgU01QX1NJR05fSU5GT19TSVpFIChPQ1RFVDE2X0xFTiArIDEpCi0jZGVmaW5lIFNNUF9QQUlSX0ZBSUxfU0laRSAyCi0jZGVmaW5lIFNNUF9TRUNVUklUWV9SRVFVRVNUX1NJWkUgMgotI2RlZmluZSBTTVBfUEFJUl9QVUJMX0tFWV9TSVpFICgxIC8qIG9wY29kZSAqLyArICgyICogQlRfT0NURVQzMl9MRU4pKQotI2RlZmluZSBTTVBfUEFJUl9DT01NSVRNX1NJWkUgKDEgLyogb3Bjb2RlICovICsgT0NURVQxNl9MRU4gLypDb21taXRtZW50Ki8pCi0jZGVmaW5lIFNNUF9QQUlSX0RIS0VZX0NIRUNLX1NJWkUgXAotICAoMSAvKiBvcGNvZGUgKi8gKyBPQ1RFVDE2X0xFTiAvKkRIS2V5IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayovKQotI2RlZmluZSBTTVBfUEFJUl9LRVlQUl9OT1RJRl9TSVpFICgxIC8qIG9wY29kZSAqLyArIDEgLypOb3RpZiBUeXBlKi8pCi0KLS8qIFNNUCBjb21tYW5kIHNpemVzIHBlciBzcGVjICovCi1zdGF0aWMgY29uc3QgdWludDhfdCBzbXBfY21kX3NpemVfcGVyX3NwZWNbXSA9IHsKLSAgICAwLAotICAgIFNNUF9QQUlSSU5HX1JFUV9TSVpFLCAgICAgIC8qIDB4MDE6IHBhaXJpbmcgcmVxdWVzdCAqLwotICAgIFNNUF9QQUlSSU5HX1JFUV9TSVpFLCAgICAgIC8qIDB4MDI6IHBhaXJpbmcgcmVzcG9uc2UgKi8KLSAgICBTTVBfQ09ORklSTV9DTURfU0laRSwgICAgICAvKiAweDAzOiBwYWlyaW5nIGNvbmZpcm0gKi8KLSAgICBTTVBfUkFORF9DTURfU0laRSwgICAgICAgICAvKiAweDA0OiBwYWlyaW5nIHJhbmRvbSAqLwotICAgIFNNUF9QQUlSX0ZBSUxfU0laRSwgICAgICAgIC8qIDB4MDU6IHBhaXJpbmcgZmFpbGVkICovCi0gICAgU01QX0VOQ19JTkZPX1NJWkUsICAgICAgICAgLyogMHgwNjogZW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLwotICAgIFNNUF9DRU5UUkFMX0lEX1NJWkUsICAgICAgIC8qIDB4MDc6IGNlbnRyYWwgaWRlbnRpZmljYXRpb24gKi8KLSAgICBTTVBfSURfSU5GT19TSVpFLCAgICAgICAgICAvKiAweDA4OiBpZGVudGl0eSBpbmZvcm1hdGlvbiAqLwotICAgIFNNUF9JRF9BRERSX1NJWkUsICAgICAgICAgIC8qIDB4MDk6IGlkZW50aXR5IGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KLSAgICBTTVBfU0lHTl9JTkZPX1NJWkUsICAgICAgICAvKiAweDBBOiBzaWduaW5nIGluZm9ybWF0aW9uICovCi0gICAgU01QX1NFQ1VSSVRZX1JFUVVFU1RfU0laRSwgLyogMHgwQjogc2VjdXJpdHkgcmVxdWVzdCAqLwotICAgIFNNUF9QQUlSX1BVQkxfS0VZX1NJWkUsICAgIC8qIDB4MEM6IHBhaXJpbmcgcHVibGljIGtleSAqLwotICAgIFNNUF9QQUlSX0RIS0VZX0NIRUNLX1NJWkUsIC8qIDB4MEQ6IHBhaXJpbmcgZGhrZXkgY2hlY2sgKi8KLSAgICBTTVBfUEFJUl9LRVlQUl9OT1RJRl9TSVpFLCAvKiAweDBFOiBwYWlyaW5nIGtleXByZXNzIG5vdGlmaWNhdGlvbiAqLwotICAgIFNNUF9QQUlSX0NPTU1JVE1fU0laRSAgICAgIC8qIDB4MEY6IHBhaXJpbmcgY29tbWl0bWVudCAqLwotfTsKLQotc3RhdGljIGJvb2wgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQodFNNUF9DQiogcF9jYik7Ci1zdGF0aWMgYm9vbCBzbXBfcGFyYW1ldGVyX3VuY29uZGl0aW9uYWxseV9pbnZhbGlkKHRTTVBfQ0IqIHBfY2IpOwotCi0vKiB0eXBlIGZvciBTTVAgY29tbWFuZCBsZW5ndGggdmFsaWRhdGlvbiBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgYm9vbCAoKnRTTVBfQ01EX0xFTl9WQUxJRCkodFNNUF9DQiogcF9jYik7Ci0KLXN0YXRpYyBib29sIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgodFNNUF9DQiogcF9jYik7Ci0KLXN0YXRpYyBjb25zdCB0U01QX0NNRF9MRU5fVkFMSUQgc21wX2NtZF9sZW5faXNfdmFsaWRbXSA9IHsKLSAgICBzbXBfcGFyYW1ldGVyX3VuY29uZGl0aW9uYWxseV9pbnZhbGlkLAotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MDE6IHBhaXJpbmcgcmVxdWVzdCAqLwotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MDI6IHBhaXJpbmcgcmVzcG9uc2UgKi8KLSAgICBzbXBfY29tbWFuZF9oYXNfdmFsaWRfZml4ZWRfbGVuZ3RoLCAvKiAweDAzOiBwYWlyaW5nIGNvbmZpcm0gKi8KLSAgICBzbXBfY29tbWFuZF9oYXNfdmFsaWRfZml4ZWRfbGVuZ3RoLCAvKiAweDA0OiBwYWlyaW5nIHJhbmRvbSAqLwotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MDU6IHBhaXJpbmcgZmFpbGVkICovCi0gICAgc21wX2NvbW1hbmRfaGFzX3ZhbGlkX2ZpeGVkX2xlbmd0aCwgLyogMHgwNjogZW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLwotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MDc6IGNlbnRyYWwgaWRlbnRpZmljYXRpb24gKi8KLSAgICBzbXBfY29tbWFuZF9oYXNfdmFsaWRfZml4ZWRfbGVuZ3RoLCAvKiAweDA4OiBpZGVudGl0eSBpbmZvcm1hdGlvbiAqLwotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MDk6IGlkZW50aXR5IGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KLSAgICBzbXBfY29tbWFuZF9oYXNfdmFsaWRfZml4ZWRfbGVuZ3RoLCAvKiAweDBBOiBzaWduaW5nIGluZm9ybWF0aW9uICovCi0gICAgc21wX2NvbW1hbmRfaGFzX3ZhbGlkX2ZpeGVkX2xlbmd0aCwgLyogMHgwQjogc2VjdXJpdHkgcmVxdWVzdCAqLwotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MEM6IHBhaXJpbmcgcHVibGljIGtleSAqLwotICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgsIC8qIDB4MEQ6IHBhaXJpbmcgZGhrZXkgY2hlY2sgKi8KLSAgICBzbXBfY29tbWFuZF9oYXNfdmFsaWRfZml4ZWRfbGVuZ3RoLCAvKiAweDBFOiBwYWlyaW5nIGtleXByZXNzIG5vdGlmaWNhdGlvbiovCi0gICAgc21wX2NvbW1hbmRfaGFzX3ZhbGlkX2ZpeGVkX2xlbmd0aCAgLyogMHgwRjogcGFpcmluZyBjb21taXRtZW50ICovCi19OwotCi0vKiB0eXBlIGZvciBTTVAgY29tbWFuZCBwYXJhbWV0ZXIgcmFuZ2VzIHZhbGlkYXRpb24gZnVuY3Rpb25zICovCi10eXBlZGVmIGJvb2wgKCp0U01QX0NNRF9QQVJBTV9SQU5HRVNfVkFMSUQpKHRTTVBfQ0IqIHBfY2IpOwotCi1zdGF0aWMgYm9vbCBzbXBfcGFpcmluZ19yZXF1ZXN0X3Jlc3BvbnNlX3BhcmFtZXRlcnNfYXJlX3ZhbGlkKHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIGJvb2wgc21wX3BhaXJpbmdfa2V5cHJlc3Nfbm90aWZpY2F0aW9uX2lzX3ZhbGlkKHRTTVBfQ0IqIHBfY2IpOwotCi1zdGF0aWMgY29uc3QgdFNNUF9DTURfUEFSQU1fUkFOR0VTX1ZBTElEIHNtcF9jbWRfcGFyYW1fcmFuZ2VzX2FyZV92YWxpZFtdID0gewotICAgIHNtcF9wYXJhbWV0ZXJfdW5jb25kaXRpb25hbGx5X2ludmFsaWQsCi0gICAgc21wX3BhaXJpbmdfcmVxdWVzdF9yZXNwb25zZV9wYXJhbWV0ZXJzX2FyZV92YWxpZCwgLyogMHgwMTogcGFpcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgKi8KLSAgICBzbXBfcGFpcmluZ19yZXF1ZXN0X3Jlc3BvbnNlX3BhcmFtZXRlcnNfYXJlX3ZhbGlkLCAvKiAweDAyOiBwYWlyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgKi8KLSAgICBzbXBfcGFyYW1ldGVyX3VuY29uZGl0aW9uYWxseV92YWxpZCwgLyogMHgwMzogcGFpcmluZyBjb25maXJtICovCi0gICAgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQsIC8qIDB4MDQ6IHBhaXJpbmcgcmFuZG9tICovCi0gICAgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQsIC8qIDB4MDU6IHBhaXJpbmcgZmFpbGVkICovCi0gICAgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQsIC8qIDB4MDY6IGVuY3J5cHRpb24gaW5mb3JtYXRpb24gKi8KLSAgICBzbXBfcGFyYW1ldGVyX3VuY29uZGl0aW9uYWxseV92YWxpZCwgLyogMHgwNzogY2VudHJhbCBpZGVudGlmaWNhdGlvbiAqLwotICAgIHNtcF9wYXJhbWV0ZXJfdW5jb25kaXRpb25hbGx5X3ZhbGlkLCAvKiAweDA4OiBpZGVudGl0eSBpbmZvcm1hdGlvbiAqLwotICAgIHNtcF9wYXJhbWV0ZXJfdW5jb25kaXRpb25hbGx5X3ZhbGlkLCAvKiAweDA5OiBpZGVudGl0eSBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uICovCi0gICAgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQsIC8qIDB4MEE6IHNpZ25pbmcgaW5mb3JtYXRpb24gKi8KLSAgICBzbXBfcGFyYW1ldGVyX3VuY29uZGl0aW9uYWxseV92YWxpZCwgLyogMHgwQjogc2VjdXJpdHkgcmVxdWVzdCAqLwotICAgIHNtcF9wYXJhbWV0ZXJfdW5jb25kaXRpb25hbGx5X3ZhbGlkLCAvKiAweDBDOiBwYWlyaW5nIHB1YmxpYyBrZXkgKi8KLSAgICBzbXBfcGFyYW1ldGVyX3VuY29uZGl0aW9uYWxseV92YWxpZCwgLyogMHgwRDogcGFpcmluZyBkaGtleSBjaGVjayAqLwotICAgIHNtcF9wYWlyaW5nX2tleXByZXNzX25vdGlmaWNhdGlvbl9pc192YWxpZCwgLyogMHgwRTogcGFpcmluZyBrZXlwcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uICovCi0gICAgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQgICAgICAgICAvKiAweDBGOiBwYWlyaW5nIGNvbW1pdG1lbnQgKi8KLX07Ci0KLS8qIHR5cGUgZm9yIGFjdGlvbiBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgQlRfSERSKiAoKnRTTVBfQ01EX0FDVCkodWludDhfdCBjbWRfY29kZSwgdFNNUF9DQiogcF9jYik7Ci0KLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9wYWlyaW5nX2NtZCh1aW50OF90IGNtZF9jb2RlLCB0U01QX0NCKiBwX2NiKTsKLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9jb25maXJtX2NtZChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3JhbmRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3BhaXJpbmdfZmFpbChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0NCKiBwX2NiKTsKLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9pZGVudGl0eV9pbmZvX2NtZChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX2VuY3J5cHRfaW5mb19jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3NlY3VyaXR5X3JlcXVlc3QoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3NpZ25pbmdfaW5mb19jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX2NlbnRyYWxfaWRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9DQiogcF9jYik7Ci1zdGF0aWMgQlRfSERSKiBzbXBfYnVpbGRfaWRfYWRkcl9jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0NCKiBwX2NiKTsKLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9wYWlyX3B1YmxpY19rZXlfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0NCKiBwX2NiKTsKLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9wYWlyaW5nX2NvbW1pdG1lbnRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0NCKiBwX2NiKTsKLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9wYWlyX2Roa2V5X2NoZWNrX2NtZChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3BhaXJpbmdfa2V5cHJlc3Nfbm90aWZpY2F0aW9uX2NtZCgKLSAgICBVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLCB0U01QX0NCKiBwX2NiKTsKLQotc3RhdGljIGNvbnN0IHRTTVBfQ01EX0FDVCBzbXBfY21kX2J1aWxkX2FjdFtdID0gewotICAgIE5VTEwsCi0gICAgc21wX2J1aWxkX3BhaXJpbmdfY21kLCAgICAgICAgICAvKiAweDAxOiBwYWlyaW5nIHJlcXVlc3QgKi8KLSAgICBzbXBfYnVpbGRfcGFpcmluZ19jbWQsICAgICAgICAgIC8qIDB4MDI6IHBhaXJpbmcgcmVzcG9uc2UgKi8KLSAgICBzbXBfYnVpbGRfY29uZmlybV9jbWQsICAgICAgICAgIC8qIDB4MDM6IHBhaXJpbmcgY29uZmlybSAqLwotICAgIHNtcF9idWlsZF9yYW5kX2NtZCwgICAgICAgICAgICAgLyogMHgwNDogcGFpcmluZyByYW5kb20gKi8KLSAgICBzbXBfYnVpbGRfcGFpcmluZ19mYWlsLCAgICAgICAgIC8qIDB4MDU6IHBhaXJpbmcgZmFpbHVyZSAqLwotICAgIHNtcF9idWlsZF9lbmNyeXB0X2luZm9fY21kLCAgICAgLyogMHgwNjogZW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLwotICAgIHNtcF9idWlsZF9jZW50cmFsX2lkX2NtZCwgICAgICAgLyogMHgwNzogY2VudHJhbCBpZGVudGlmaWNhdGlvbiAqLwotICAgIHNtcF9idWlsZF9pZGVudGl0eV9pbmZvX2NtZCwgICAgLyogMHgwODogaWRlbnRpdHkgaW5mb3JtYXRpb24gKi8KLSAgICBzbXBfYnVpbGRfaWRfYWRkcl9jbWQsICAgICAgICAgIC8qIDB4MDk6IGlkZW50aXR5IGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KLSAgICBzbXBfYnVpbGRfc2lnbmluZ19pbmZvX2NtZCwgICAgIC8qIDB4MEE6IHNpZ25pbmcgaW5mb3JtYXRpb24gKi8KLSAgICBzbXBfYnVpbGRfc2VjdXJpdHlfcmVxdWVzdCwgICAgIC8qIDB4MEI6IHNlY3VyaXR5IHJlcXVlc3QgKi8KLSAgICBzbXBfYnVpbGRfcGFpcl9wdWJsaWNfa2V5X2NtZCwgIC8qIDB4MEM6IHBhaXJpbmcgcHVibGljIGtleSAqLwotICAgIHNtcF9idWlsZF9wYWlyX2Roa2V5X2NoZWNrX2NtZCwgLyogMHgwRDogcGFpcmluZyBESEtleSBjaGVjayAqLwotICAgIHNtcF9idWlsZF9wYWlyaW5nX2tleXByZXNzX25vdGlmaWNhdGlvbl9jbWQsIC8qIDB4MEU6IHBhaXJpbmcga2V5cHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gKi8KLSAgICBzbXBfYnVpbGRfcGFpcmluZ19jb21taXRtZW50X2NtZCAgICAgICAgICAgICAvKiAweDBGOiBwYWlyaW5nIGNvbW1pdG1lbnQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB0U01QX0FTU09fTU9ERUwKLSAgICBzbXBfYXNzb2NpYXRpb25fdGFibGVbMl1bU01QX0lPX0NBUF9NQVhdW1NNUF9JT19DQVBfTUFYXSA9IHsKLSAgICAgICAgLyogZGlzcGxheSBvbmx5ICovIC8qIERpc3BsYXkgWWVzL05vICovIC8qIGtleWJvYXJkIG9ubHkgKi8KLSAgICAgICAgLyogTm8gSW5wdXQvT3V0cHV0ICovICAgICAgICAgICAgICAgICAgIC8qIGtleWJvYXJkIGRpc3BsYXkgKi8KLQotICAgICAgICAvKiBpbml0aWF0b3IgKi8KLSAgICAgICAgLyogbW9kZWwgPSB0YmxbcGVlcl9pb19jYXBzXVtsb2NfaW9fY2Fwc10gKi8KLSAgICAgICAgLyogRGlzcGxheSBPbmx5ICovCi0gICAgICAgIHt7U01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwKLSAgICAgICAgICBTTVBfTU9ERUxfUEFTU0tFWSwgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwgU01QX01PREVMX1BBU1NLRVl9LAotCi0gICAgICAgICAvKiBEaXNwbGF5IFllcy9ObyAqLwotICAgICAgICAge1NNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksCi0gICAgICAgICAgU01QX01PREVMX1BBU1NLRVksIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksIFNNUF9NT0RFTF9QQVNTS0VZfSwKLQotICAgICAgICAgLyogS2V5Ym9hcmQgb25seSAqLwotICAgICAgICAge1NNUF9NT0RFTF9LRVlfTk9USUYsIFNNUF9NT0RFTF9LRVlfTk9USUYsIFNNUF9NT0RFTF9QQVNTS0VZLAotICAgICAgICAgIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksIFNNUF9NT0RFTF9LRVlfTk9USUZ9LAotCi0gICAgICAgICAvKiBObyBJbnB1dCBObyBPdXRwdXQgKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfRU5DUllQVElPTl9PTkxZLCBTTVBfTU9ERUxfRU5DUllQVElPTl9PTkxZLAotICAgICAgICAgIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksCi0gICAgICAgICAgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWX0sCi0KLSAgICAgICAgIC8qIGtleWJvYXJkIGRpc3BsYXkgKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfS0VZX05PVElGLCBTTVBfTU9ERUxfS0VZX05PVElGLCBTTVBfTU9ERUxfUEFTU0tFWSwKLSAgICAgICAgICBTTVBfTU9ERUxfRU5DUllQVElPTl9PTkxZLCBTTVBfTU9ERUxfS0VZX05PVElGfX0sCi0KLSAgICAgICAgLyogcmVzcG9uZGVyICovCi0gICAgICAgIC8qIG1vZGVsID0gdGJsW2xvY19pb19jYXBzXVtwZWVyX2lvX2NhcHNdICovCi0gICAgICAgIC8qIERpc3BsYXkgT25seSAqLwotICAgICAgICB7e1NNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksCi0gICAgICAgICAgU01QX01PREVMX0tFWV9OT1RJRiwgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwgU01QX01PREVMX0tFWV9OT1RJRn0sCi0KLSAgICAgICAgIC8qIERpc3BsYXkgWWVzL05vICovCi0gICAgICAgICB7U01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwKLSAgICAgICAgICBTTVBfTU9ERUxfS0VZX05PVElGLCBTTVBfTU9ERUxfRU5DUllQVElPTl9PTkxZLCBTTVBfTU9ERUxfS0VZX05PVElGfSwKLQotICAgICAgICAgLyoga2V5Ym9hcmQgb25seSAqLwotICAgICAgICAge1NNUF9NT0RFTF9QQVNTS0VZLCBTTVBfTU9ERUxfUEFTU0tFWSwgU01QX01PREVMX1BBU1NLRVksCi0gICAgICAgICAgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwgU01QX01PREVMX1BBU1NLRVl9LAotCi0gICAgICAgICAvKiBObyBJbnB1dCBObyBPdXRwdXQgKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfRU5DUllQVElPTl9PTkxZLCBTTVBfTU9ERUxfRU5DUllQVElPTl9PTkxZLAotICAgICAgICAgIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFksCi0gICAgICAgICAgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWX0sCi0KLSAgICAgICAgIC8qIGtleWJvYXJkIGRpc3BsYXkgKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfUEFTU0tFWSwgU01QX01PREVMX1BBU1NLRVksIFNNUF9NT0RFTF9LRVlfTk9USUYsCi0gICAgICAgICAgU01QX01PREVMX0VOQ1JZUFRJT05fT05MWSwgU01QX01PREVMX1BBU1NLRVl9fX07Ci0KLXN0YXRpYyBjb25zdCB0U01QX0FTU09fTU9ERUwKLSAgICBzbXBfYXNzb2NpYXRpb25fdGFibGVfc2NbMl1bU01QX0lPX0NBUF9NQVhdW1NNUF9JT19DQVBfTUFYXSA9IHsKLSAgICAgICAgLyogZGlzcGxheSBvbmx5ICovIC8qIERpc3BsYXkgWWVzL05vICovIC8qIGtleWJvYXJkIG9ubHkgKi8KLSAgICAgICAgLyogTm8gSW5wdXRPdXRwdXQgKi8gICAgICAgICAgICAgICAgICAgIC8qIGtleWJvYXJkIGRpc3BsYXkgKi8KLQotICAgICAgICAvKiBpbml0aWF0b3IgKi8KLSAgICAgICAgLyogbW9kZWwgPSB0YmxbcGVlcl9pb19jYXBzXVtsb2NfaW9fY2Fwc10gKi8KLQotICAgICAgICAvKiBEaXNwbGF5IE9ubHkgKi8KLSAgICAgICAge3tTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLCBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLAotICAgICAgICAgIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0VOVCwgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUywKLSAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9FTlR9LAotCi0gICAgICAgICAvKiBEaXNwbGF5IFllcy9ObyAqLwotICAgICAgICAge1NNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsIFNNUF9NT0RFTF9TRUNfQ09OTl9OVU1fQ09NUCwKLSAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9FTlQsIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX05VTV9DT01QfSwKLQotICAgICAgICAgLyoga2V5Ym9hcmQgb25seSAqLwotICAgICAgICAge1NNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1AsIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1AsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5ULCBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLAotICAgICAgICAgIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1B9LAotCi0gICAgICAgICAvKiBObyBJbnB1dCBObyBPdXRwdXQgKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLCBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLAotICAgICAgICAgIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLU30sCi0KLSAgICAgICAgIC8qIGtleWJvYXJkIGRpc3BsYXkgKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9ESVNQLCBTTVBfTU9ERUxfU0VDX0NPTk5fTlVNX0NPTVAsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5ULCBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLAotICAgICAgICAgIFNNUF9NT0RFTF9TRUNfQ09OTl9OVU1fQ09NUH19LAotCi0gICAgICAgIC8qIHJlc3BvbmRlciAqLwotICAgICAgICAvKiBtb2RlbCA9IHRibFtsb2NfaW9fY2Fwc11bcGVlcl9pb19jYXBzXSAqLwotCi0gICAgICAgIC8qIERpc3BsYXkgT25seSAqLwotICAgICAgICB7e1NNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRElTUCwgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUywKLSAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9ESVNQfSwKLQotICAgICAgICAgLyogRGlzcGxheSBZZXMvTm8gKi8KLSAgICAgICAgIHtTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLCBTTVBfTU9ERUxfU0VDX0NPTk5fTlVNX0NPTVAsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRElTUCwgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUywKLSAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fTlVNX0NPTVB9LAotCi0gICAgICAgICAvKiBrZXlib2FyZCBvbmx5ICovCi0gICAgICAgICB7U01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5ULCBTTVBfTU9ERUxfU0VDX0NPTk5fUEFTU0tFWV9FTlQsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX1BBU1NLRVlfRU5ULCBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTLAotICAgICAgICAgIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0VOVH0sCi0KLSAgICAgICAgIC8qIE5vIElucHV0IE5vIE91dHB1dCAqLwotICAgICAgICAge1NNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUywgU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUywKLSAgICAgICAgICBTTVBfTU9ERUxfU0VDX0NPTk5fSlVTVFdPUktTfSwKLQotICAgICAgICAgLyoga2V5Ym9hcmQgZGlzcGxheSAqLwotICAgICAgICAge1NNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0VOVCwgU01QX01PREVMX1NFQ19DT05OX05VTV9DT01QLAotICAgICAgICAgIFNNUF9NT0RFTF9TRUNfQ09OTl9QQVNTS0VZX0RJU1AsIFNNUF9NT0RFTF9TRUNfQ09OTl9KVVNUV09SS1MsCi0gICAgICAgICAgU01QX01PREVMX1NFQ19DT05OX05VTV9DT01QfX19OwotCi1zdGF0aWMgdFNNUF9BU1NPX01PREVMIHNtcF9zZWxlY3RfbGVnYWN5X2Fzc29jaWF0aW9uX21vZGVsKHRTTVBfQ0IqIHBfY2IpOwotc3RhdGljIHRTTVBfQVNTT19NT0RFTCBzbXBfc2VsZWN0X2Fzc29jaWF0aW9uX21vZGVsX3NlY3VyZV9jb25uZWN0aW9ucygKLSAgICB0U01QX0NCKiBwX2NiKTsKLQotLyoqCi0gKiBMb2cgbWV0cmljcyBkYXRhIGZvciBTTVAgY29tbWFuZAotICoKLSAqIEBwYXJhbSBiZF9hZGRyIGN1cnJlbnQgcGFpcmluZyBhZGRyZXNzCi0gKiBAcGFyYW0gaXNfb3V0Z29pbmcgd2hldGhlciB0aGlzIGNvbW1hbmQgaXMgb3V0Z29pbmcKLSAqIEBwYXJhbSBwX2J1ZiBidWZmZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBTTVAgY29tbWFuZAotICogQHBhcmFtIGJ1Zl9sZW4gbGVuZ3RoIGF2YWlsYWJsZSB0byByZWFkIGZvciBwX2J1ZgotICovCi12b2lkIHNtcF9sb2dfbWV0cmljcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGlzX291dGdvaW5nLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9idWYsIHNpemVfdCBidWZfbGVuKSB7Ci0gIGlmIChidWZfbGVuIDwgMSkgewotICAgIExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiOiBidWZmZXIgaXMgdG9vIHNtYWxsLCBzaXplIGlzICIgPDwgYnVmX2xlbjsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCBjbWQ7Ci0gIFNUUkVBTV9UT19VSU5UOChjbWQsIHBfYnVmKTsKLSAgYnVmX2xlbi0tOwotICB1aW50OF90IGZhaWx1cmVfcmVhc29uID0gMDsKLSAgaWYgKGNtZCA9PSBTTVBfT1BDT0RFX1BBSVJJTkdfRkFJTEVEICYmIGJ1Zl9sZW4gPj0gMSkgewotICAgIFNUUkVBTV9UT19VSU5UOChmYWlsdXJlX3JlYXNvbiwgcF9idWYpOwotICB9Ci0gIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24gPQotICAgICAgaXNfb3V0Z29pbmcgPyBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW06OkRJUkVDVElPTl9PVVRHT0lORwotICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW06OkRJUkVDVElPTl9JTkNPTUlORzsKLSAgbG9nX3NtcF9wYWlyaW5nX2V2ZW50KGJkX2FkZHIsIGNtZCwgZGlyZWN0aW9uLCBmYWlsdXJlX3JlYXNvbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfc2VuZF9tc2dfdG9fTDJDQVAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgbWVzc2FnZSB0byBMMkNBUC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBzbXBfc2VuZF9tc2dfdG9fTDJDQVAoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgQlRfSERSKiBwX3RvTDJDQVApIHsKLSAgdWludDE2X3QgbDJjYXBfcmV0OwotICB1aW50MTZfdCBmaXhlZF9jaWQgPSBMMkNBUF9TTVBfQ0lEOwotCi0gIGlmIChzbXBfY2Iuc21wX292ZXJfYnIpIHsKLSAgICBmaXhlZF9jaWQgPSBMMkNBUF9TTVBfQlJfQ0lEOwotICB9Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBzbXBfbG9nX21ldHJpY3MocmVtX2JkYSwgdHJ1ZSAvKiBvdXRnb2luZyAqLywKLSAgICAgICAgICAgICAgICAgIHBfdG9MMkNBUC0+ZGF0YSArIHBfdG9MMkNBUC0+b2Zmc2V0LCBwX3RvTDJDQVAtPmxlbik7Ci0KLSAgbDJjYXBfcmV0ID0gTDJDQV9TZW5kRml4ZWRDaG5sRGF0YShmaXhlZF9jaWQsIHJlbV9iZGEsIHBfdG9MMkNBUCk7Ci0gIGlmIChsMmNhcF9yZXQgPT0gTDJDQVBfRFdfRkFJTEVEKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKCJTTVAgZmFpbGVkIHRvIHBhc3MgbXNnIHRvIEwyQ0FQIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHRTTVBfQ0IqIHBfY2IgPSAmc21wX2NiOwotCi0gICAgaWYgKHBfY2ItPndhaXRfZm9yX2F1dGhvcml6YXRpb25fY29tcGxldGUpIHsKLSAgICAgIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICAgICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9TVUNDRVNTOwotICAgICAgaWYgKGZpeGVkX2NpZCA9PSBMMkNBUF9TTVBfQ0lEKSB7Ci0gICAgICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzbXBfYnJfc3RhdGVfbWFjaGluZV9ldmVudChwX2NiLCBTTVBfQlJfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfc2VuZF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIHNlbmQgYSBTTVAgY29tbWFuZCBvbiBMMkNBUCBjaGFubmVsLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHNtcF9zZW5kX2NtZCh1aW50OF90IGNtZF9jb2RlLCB0U01QX0NCKiBwX2NiKSB7Ci0gIEJUX0hEUiogcF9idWY7Ci0gIGJvb2wgc2VudCA9IGZhbHNlOwotCi0gIExPR19ERUJVRygiU2VuZGluZyBTTVAgY29tbWFuZDolc1sweCV4XSBwYWlyaW5nX2JkYT0lcyIsCi0gICAgICAgICAgICBzbXBfb3Bjb2RlX3RleHQoc3RhdGljX2Nhc3Q8dFNNUF9PUENPREU+KGNtZF9jb2RlKSkuY19zdHIoKSwKLSAgICAgICAgICAgIGNtZF9jb2RlLCBQUklWQVRFX0FERFJFU1MocF9jYi0+cGFpcmluZ19iZGEpKTsKLQotICBpZiAoY21kX2NvZGUgPD0gKFNNUF9PUENPREVfTUFYICsgMSAvKiBmb3IgU01QX09QQ09ERV9QQUlSX0NPTU1JVE0gKi8pICYmCi0gICAgICBzbXBfY21kX2J1aWxkX2FjdFtjbWRfY29kZV0gIT0gTlVMTCkgewotICAgIHBfYnVmID0gKCpzbXBfY21kX2J1aWxkX2FjdFtjbWRfY29kZV0pKGNtZF9jb2RlLCBwX2NiKTsKLQotICAgIGlmIChwX2J1ZiAhPSBOVUxMICYmIHNtcF9zZW5kX21zZ190b19MMkNBUChwX2NiLT5wYWlyaW5nX2JkYSwgcF9idWYpKSB7Ci0gICAgICBzZW50ID0gdHJ1ZTsKLSAgICAgIGFsYXJtX3NldF9vbl9tbG9vcChwX2NiLT5zbXBfcnNwX3RpbWVyX2VudCwgU01QX1dBSVRfRk9SX1JTUF9USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNtcF9yc3BfdGltZW91dCwgTlVMTCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFzZW50KSB7Ci0gICAgdFNNUF9JTlRfREFUQSBzbXBfaW50X2RhdGE7Ci0gICAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9QQUlSX0lOVEVSTkFMX0VSUjsKLSAgICBpZiAocF9jYi0+c21wX292ZXJfYnIpIHsKLSAgICAgIHNtcF9icl9zdGF0ZV9tYWNoaW5lX2V2ZW50KHBfY2IsIFNNUF9CUl9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfcnNwX3RpbWVvdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENhbGxlZCB3aGVuIFNNUCB3YWl0IGZvciBTTVAgY29tbWFuZCByZXNwb25zZSB0aW1lciBleHBpcmVzCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3JzcF90aW1lb3V0KFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsKLSAgdFNNUF9DQiogcF9jYiA9ICZzbXBfY2I7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlcyBzdGF0ZTolZCBicl9zdGF0ZTolZCIsIF9fZnVuY19fLCBwX2NiLT5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgIHBfY2ItPmJyX3N0YXRlKTsKLQotICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgc21wX2ludF9kYXRhLnN0YXR1cyA9IFNNUF9SU1BfVElNRU9VVDsKLSAgaWYgKHBfY2ItPnNtcF9vdmVyX2JyKSB7Ci0gICAgc21wX2JyX3N0YXRlX21hY2hpbmVfZXZlbnQocF9jYiwgU01QX0JSX0FVVEhfQ01QTF9FVlQsICZzbXBfaW50X2RhdGEpOwotICB9IGVsc2UgewotICAgIHNtcF9zbV9ldmVudChwX2NiLCBTTVBfQVVUSF9DTVBMX0VWVCwgJnNtcF9pbnRfZGF0YSk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9kZWxheWVkX2F1dGhfY29tcGxldGVfdGltZW91dAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2FsbGVkIHdoZW4gbm8gcGFpcmluZyBmYWlsZWQgY29tbWFuZCByZWNlaXZlZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgdGltZW91dCBwZXJpb2QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2RlbGF5ZWRfYXV0aF9jb21wbGV0ZV90aW1lb3V0KFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsKLSAgLyoKLSAgICogV2FpdGVkIGZvciBwb3RlbnRpYWwgcGFpciBmYWlsdXJlLiBTZW5kIFNNUF9BVVRIX0NNUExfRVZUIGlmCi0gICAqIHRoZSBzdGF0ZSBpcyBzdGlsbCBpbiBib25kIHBlbmRpbmcuCi0gICAqLwotICBpZiAoc21wX2dldF9zdGF0ZSgpID09IFNNUF9TVEFURV9CT05EX1BFTkRJTkcpIHsKLSAgICBTTVBfVFJBQ0VfRVZFTlQoIiVzIHNlbmRpbmcgZGVsYXllZCBhdXRoIGNvbXBsZXRlLiIsIF9fZnVuY19fKTsKLSAgICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgICBzbXBfaW50X2RhdGEuc3RhdHVzID0gU01QX1NVQ0NFU1M7Ci0gICAgc21wX3NtX2V2ZW50KCZzbXBfY2IsIFNNUF9BVVRIX0NNUExfRVZULCAmc21wX2ludF9kYXRhKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2J1aWxkX3BhaXJpbmdfcmVxX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgcGFpcmluZyByZXF1ZXN0IGNvbW1hbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUJUX0hEUiogc21wX2J1aWxkX3BhaXJpbmdfY21kKHVpbnQ4X3QgY21kX2NvZGUsIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBTTVBfUEFJUklOR19SRVFfU0laRSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBjbWRfY29kZSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5sb2NhbF9pb19jYXBhYmlsaXR5KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY19vb2JfZmxhZyk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5sb2NfYXV0aF9yZXEpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgcF9jYi0+bG9jX2VuY19zaXplKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY2FsX2lfa2V5KTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY2FsX3Jfa2V5KTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgLyogMUIgRVJSX1JTUCBvcCBjb2RlICsgMUIgY21kX29wX2NvZGUgKyAyQiBoYW5kbGUgKyAxQiBzdGF0dXMgKi8KLSAgcF9idWYtPmxlbiA9IFNNUF9QQUlSSU5HX1JFUV9TSVpFOwotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9idWlsZF9jb25maXJtX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgY29uZmlybSByZXF1ZXN0IGNvbW1hbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9jb25maXJtX2NtZChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBTTVBfQ09ORklSTV9DTURfU0laRSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0KLSAgVUlOVDhfVE9fU1RSRUFNKHAsIFNNUF9PUENPREVfQ09ORklSTSk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwLCBwX2NiLT5jb25maXJtLCBPQ1RFVDE2X0xFTik7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfQ09ORklSTV9DTURfU0laRTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfYnVpbGRfcmFuZF9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIFJhbmRvbSBjb21tYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBzbXBfYnVpbGRfcmFuZF9jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwgdFNNUF9DQiogcF9jYikgewotICB1aW50OF90KiBwOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSArIFNNUF9SQU5EX0NNRF9TSVpFICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfTUlOX09GRlNFVCk7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIFNNUF9PUENPREVfUkFORCk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwLCBwX2NiLT5yYW5kLCBPQ1RFVDE2X0xFTik7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfUkFORF9DTURfU0laRTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfYnVpbGRfZW5jcnlwdF9pbmZvX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgc2VjdXJpdHkgaW5mb3JtYXRpb24gY29tbWFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX2VuY3J5cHRfaW5mb19jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBTTVBfRU5DX0lORk9fU0laRSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBTTVBfT1BDT0RFX0VOQ1JZUFRfSU5GTyk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwLCBwX2NiLT5sdGssIE9DVEVUMTZfTEVOKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IFNNUF9FTkNfSU5GT19TSVpFOwotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9idWlsZF9jZW50cmFsX2lkX2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgc2VjdXJpdHkgaW5mb3JtYXRpb24gY29tbWFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX2NlbnRyYWxfaWRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9DQiogcF9jYikgewotICB1aW50OF90KiBwOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSArIFNNUF9DRU5UUkFMX0lEX1NJWkUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9DRU5UUkFMX0lEKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBwX2NiLT5lZGl2KTsKLSAgQVJSQVlfVE9fU1RSRUFNKHAsIHBfY2ItPmVuY19yYW5kLCBCVF9PQ1RFVDhfTEVOKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IFNNUF9DRU5UUkFMX0lEX1NJWkU7Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2J1aWxkX2lkZW50aXR5X2luZm9fY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBjb21tYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBzbXBfYnVpbGRfaWRlbnRpdHlfaW5mb19jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0U01QX0NCKiBwX2NiKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIEJUX0hEUiogcF9idWYgPQotICAgICAgKEJUX0hEUiopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSArIFNNUF9JRF9JTkZPX1NJWkUgKyBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotCi0gIGNvbnN0IE9jdGV0MTYmIGlyayA9IEJUTV9HZXREZXZpY2VJRFJvb3QoKTsKLQotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9JREVOVElUWV9JTkZPKTsKLSAgQVJSQVlfVE9fU1RSRUFNKHAsIGlyay5kYXRhKCksIE9DVEVUMTZfTEVOKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IFNNUF9JRF9JTkZPX1NJWkU7Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2J1aWxkX2lkX2FkZHJfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBpZGVudGl0eSBhZGRyZXNzIGluZm9ybWF0aW9uIGNvbW1hbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9pZF9hZGRyX2NtZChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9Ci0gICAgICAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpICsgU01QX0lEX0FERFJfU0laRSArIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBTTVBfT1BDT0RFX0lEX0FERFIpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgMCk7Ci0gIEJEQUREUl9UT19TVFJFQU0ocCwgKmNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpLT5nZXRfYWRkcmVzcygpKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IFNNUF9JRF9BRERSX1NJWkU7Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2J1aWxkX3NpZ25pbmdfaW5mb19jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIHNpZ25pbmcgaW5mb3JtYXRpb24gY29tbWFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3NpZ25pbmdfaW5mb19jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBTTVBfU0lHTl9JTkZPX1NJWkUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9TSUdOX0lORk8pOwotICBBUlJBWV9UT19TVFJFQU0ocCwgcF9jYi0+Y3NyaywgT0NURVQxNl9MRU4pOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX2J1Zi0+bGVuID0gU01QX1NJR05fSU5GT19TSVpFOwotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9idWlsZF9wYWlyaW5nX2ZhaWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIFBhaXJpbmcgRmFpbCBjb21tYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBzbXBfYnVpbGRfcGFpcmluZ19mYWlsKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBTTVBfUEFJUl9GQUlMX1NJWkUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9QQUlSSU5HX0ZBSUxFRCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBwX2NiLT5mYWlsdXJlKTsKLQotICBwX2J1Zi0+b2Zmc2V0ID0gTDJDQVBfTUlOX09GRlNFVDsKLSAgcF9idWYtPmxlbiA9IFNNUF9QQUlSX0ZBSUxfU0laRTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfYnVpbGRfc2VjdXJpdHlfcmVxdWVzdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgc2VjdXJpdHkgcmVxdWVzdCBjb21tYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBzbXBfYnVpbGRfc2VjdXJpdHlfcmVxdWVzdChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9DQiogcF9jYikgewotICB1aW50OF90KiBwOwotICBCVF9IRFIqIHBfYnVmID0gKEJUX0hEUiopb3NpX21hbGxvYyhzaXplb2YoQlRfSERSKSArIDIgKyBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9TRUNfUkVRKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY19hdXRoX3JlcSk7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfU0VDVVJJVFlfUkVRVUVTVF9TSVpFOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgib3Bjb2RlPSVkIGF1dGhfcmVxPTB4JXgiLCBTTVBfT1BDT0RFX1NFQ19SRVEsCi0gICAgICAgICAgICAgICAgICBwX2NiLT5sb2NfYXV0aF9yZXEpOwotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9idWlsZF9wYWlyX3B1YmxpY19rZXlfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBwYWlyaW5nIHB1YmxpYyBrZXkgY29tbWFuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJUX0hEUiogc21wX2J1aWxkX3BhaXJfcHVibGljX2tleV9jbWQoVU5VU0VEX0FUVFIgdWludDhfdCBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgdWludDhfdCBwdWJsX2tleVsyICogQlRfT0NURVQzMl9MRU5dOwotICB1aW50OF90KiBwX3B1Ymxfa2V5ID0gcHVibF9rZXk7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpICsgU01QX1BBSVJfUFVCTF9LRVlfU0laRSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwyQ0FQX01JTl9PRkZTRVQpOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgbWVtY3B5KHBfcHVibF9rZXksIHBfY2ItPmxvY19wdWJsX2tleS54LCBCVF9PQ1RFVDMyX0xFTik7Ci0gIG1lbWNweShwX3B1Ymxfa2V5ICsgQlRfT0NURVQzMl9MRU4sIHBfY2ItPmxvY19wdWJsX2tleS55LCBCVF9PQ1RFVDMyX0xFTik7Ci0KLSAgcCA9ICh1aW50OF90KikocF9idWYgKyAxKSArIEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBTTVBfT1BDT0RFX1BBSVJfUFVCTElDX0tFWSk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwLCBwX3B1Ymxfa2V5LCAyICogQlRfT0NURVQzMl9MRU4pOwotCi0gIHBfYnVmLT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwX2J1Zi0+bGVuID0gU01QX1BBSVJfUFVCTF9LRVlfU0laRTsKLQotICByZXR1cm4gcF9idWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfYnVpbGRfcGFpcmluZ19jb21taXRtZW50X2NtZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQnVpbGQgcGFpcmluZyBjb21taXRtZW50IGNvbW1hbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9wYWlyaW5nX2NvbW1pdG1lbnRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0NCKiBwX2NiKSB7Ci0gIHVpbnQ4X3QqIHA7Ci0gIEJUX0hEUiogcF9idWYgPSAoQlRfSERSKilvc2lfbWFsbG9jKHNpemVvZihCVF9IRFIpICsgU01QX1BBSVJfQ09NTUlUTV9TSVpFICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfTUlOX09GRlNFVCk7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCIlcyIsIF9fZnVuY19fKTsKLQotICBwID0gKHVpbnQ4X3QqKShwX2J1ZiArIDEpICsgTDJDQVBfTUlOX09GRlNFVDsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIFNNUF9PUENPREVfQ09ORklSTSk7Ci0gIEFSUkFZX1RPX1NUUkVBTShwLCBwX2NiLT5jb21taXRtZW50LCBPQ1RFVDE2X0xFTik7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfUEFJUl9DT01NSVRNX1NJWkU7Ci0KLSAgcmV0dXJuIHBfYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2J1aWxkX3BhaXJfZGhrZXlfY2hlY2tfY21kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBCdWlsZCBwYWlyaW5nIERIS2V5IGNoZWNrIGNvbW1hbmQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBCVF9IRFIqIHNtcF9idWlsZF9wYWlyX2Roa2V5X2NoZWNrX2NtZChVTlVTRURfQVRUUiB1aW50OF90IGNtZF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoCi0gICAgICBzaXplb2YoQlRfSERSKSArIFNNUF9QQUlSX0RIS0VZX0NIRUNLX1NJWkUgKyBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9QQUlSX0RIS0VZX0NIRUNLKTsKLSAgQVJSQVlfVE9fU1RSRUFNKHAsIHBfY2ItPmRoa2V5X2NoZWNrLCBPQ1RFVDE2X0xFTik7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfUEFJUl9ESEtFWV9DSEVDS19TSVpFOwotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9idWlsZF9wYWlyaW5nX2tleXByZXNzX25vdGlmaWNhdGlvbl9jbWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEJ1aWxkIGtleXByZXNzIG5vdGlmaWNhdGlvbiBjb21tYW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgQlRfSERSKiBzbXBfYnVpbGRfcGFpcmluZ19rZXlwcmVzc19ub3RpZmljYXRpb25fY21kKAotICAgIFVOVVNFRF9BVFRSIHVpbnQ4X3QgY21kX2NvZGUsIHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2MoCi0gICAgICBzaXplb2YoQlRfSERSKSArIFNNUF9QQUlSX0tFWVBSX05PVElGX1NJWkUgKyBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9QQUlSX0tFWVBSX05PVElGKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIHBfY2ItPmxvY2FsX2tleXByZXNzX25vdGlmaWNhdGlvbik7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfUEFJUl9LRVlQUl9OT1RJRl9TSVpFOwotCi0gIHJldHVybiBwX2J1ZjsKLX0KLQotLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvbnZlcnQgYSA2IHRvIDE2IGRpZ2l0cyBudW1lcmljIGNoYXJhY3RlciBzdHJpbmcKLSAqIGludG8gU01QIFRLLiAqLwotdm9pZCBzbXBfY29udmVydF9zdHJpbmdfdG9fdGsoT2N0ZXQxNiogdGssIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgdWludDhfdCogcCA9IHRrLT5kYXRhKCk7Ci0gIHRTTVBfS0VZIGtleTsKLSAgU01QX1RSQUNFX0VWRU5UKCJzbXBfY29udmVydF9zdHJpbmdfdG9fdGsiKTsKLSAgVUlOVDMyX1RPX1NUUkVBTShwLCBwYXNza2V5KTsKLQotICBrZXkua2V5X3R5cGUgPSBTTVBfS0VZX1RZUEVfVEs7Ci0gIGtleS5wX2RhdGEgPSB0ay0+ZGF0YSgpOwotCi0gIHRTTVBfSU5UX0RBVEEgc21wX2ludF9kYXRhOwotICBzbXBfaW50X2RhdGEua2V5ID0ga2V5OwotICBzbXBfc21fZXZlbnQoJnNtcF9jYiwgU01QX0tFWV9SRUFEWV9FVlQsICZzbXBfaW50X2RhdGEpOwotfQotCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbWFzayBvZmYgdGhlIGVuY3J5cHRpb24ga2V5IGJhc2VkIG9uIHRoZSBtYXhpbXVtCi0gKiBlbmNyeXB0aW9uIGtleSBzaXplLiAqLwotdm9pZCBzbXBfbWFza19lbmNfa2V5KHVpbnQ4X3QgbG9jX2VuY19zaXplLCBPY3RldDE2KiBwX2RhdGEpIHsKLSAgU01QX1RSQUNFX0VWRU5UKCJzbXBfbWFza19lbmNfa2V5Iik7Ci0gIGlmIChsb2NfZW5jX3NpemUgPCBPQ1RFVDE2X0xFTikgewotICAgIGZvciAoOyBsb2NfZW5jX3NpemUgPCBPQ1RFVDE2X0xFTjsgbG9jX2VuY19zaXplKyspCi0gICAgICAoKnBfZGF0YSlbbG9jX2VuY19zaXplXSA9IDA7Ci0gIH0KLSAgcmV0dXJuOwotfQotCi0vKiogdXRpbGl0eSBmdW5jdGlvbiB0byBkbyBhbiBiaXRlaXNlIGV4Y2x1c2l2ZS1PUiBvZiB0d28gYml0IHN0cmluZ3Mgb2YgdGhlCi0gKiBsZW5ndGggb2YgT0NURVQxNl9MRU4uIFJlc3VsdCBpcyBzdG9yZWQgaW4gZmlyc3QgYXJndW1lbnQuCi0gKi8KLXZvaWQgc21wX3hvcl8xMjgoT2N0ZXQxNiogYSwgY29uc3QgT2N0ZXQxNiYgYikgewotICBDSEVDSyhhKTsKLSAgdWludDhfdCBpLCAqYWEgPSBhLT5kYXRhKCk7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJiID0gYi5kYXRhKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE9DVEVUMTZfTEVOOyBpKyspIHsKLSAgICBhYVtpXSA9IGFhW2ldIF4gYmJbaV07Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jYl9jbGVhbnVwCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbGVhbiB1cCBTTVAgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9jYl9jbGVhbnVwKHRTTVBfQ0IqIHBfY2IpIHsKLSAgdFNNUF9DQUxMQkFDSyogcF9jYWxsYmFjayA9IHBfY2ItPnBfY2FsbGJhY2s7Ci0gIHVpbnQ4X3QgdHJhY2VfbGV2ZWwgPSBwX2NiLT50cmFjZV9sZXZlbDsKLSAgYWxhcm1fdCogc21wX3JzcF90aW1lcl9lbnQgPSBwX2NiLT5zbXBfcnNwX3RpbWVyX2VudDsKLSAgYWxhcm1fdCogZGVsYXllZF9hdXRoX3RpbWVyX2VudCA9IHBfY2ItPmRlbGF5ZWRfYXV0aF90aW1lcl9lbnQ7Ci0KLSAgU01QX1RSQUNFX0VWRU5UKCJzbXBfY2JfY2xlYW51cCIpOwotCi0gIGFsYXJtX2NhbmNlbChwX2NiLT5zbXBfcnNwX3RpbWVyX2VudCk7Ci0gIGFsYXJtX2NhbmNlbChwX2NiLT5kZWxheWVkX2F1dGhfdGltZXJfZW50KTsKLSAgbWVtc2V0KHBfY2IsIDAsIHNpemVvZih0U01QX0NCKSk7Ci0gIHBfY2ItPnBfY2FsbGJhY2sgPSBwX2NhbGxiYWNrOwotICBwX2NiLT50cmFjZV9sZXZlbCA9IHRyYWNlX2xldmVsOwotICBwX2NiLT5zbXBfcnNwX3RpbWVyX2VudCA9IHNtcF9yc3BfdGltZXJfZW50OwotICBwX2NiLT5kZWxheWVkX2F1dGhfdGltZXJfZW50ID0gZGVsYXllZF9hdXRoX3RpbWVyX2VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9yZW1vdmVfZml4ZWRfY2hhbm5lbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBmaXhlZCBjaGFubmVsCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3JlbW92ZV9maXhlZF9jaGFubmVsKHRTTVBfQ0IqIHBfY2IpIHsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLQotICBpZiAocF9jYi0+c21wX292ZXJfYnIpCi0gICAgTDJDQV9SZW1vdmVGaXhlZENobmwoTDJDQVBfU01QX0JSX0NJRCwgcF9jYi0+cGFpcmluZ19iZGEpOwotICBlbHNlCi0gICAgTDJDQV9SZW1vdmVGaXhlZENobmwoTDJDQVBfU01QX0NJRCwgcF9jYi0+cGFpcmluZ19iZGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3Jlc2V0X2NvbnRyb2xfdmFsdWUKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlc2V0IHRoZSBjb250cm9sIGJsb2NrIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHBhaXJpbmcgcHJvY2VkdXJlIGZpbmlzaGVkLgotICoKLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcmVzZXRfY29udHJvbF92YWx1ZSh0U01QX0NCKiBwX2NiKSB7Ci0gIFNNUF9UUkFDRV9FVkVOVCgiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgYWxhcm1fY2FuY2VsKHBfY2ItPnNtcF9yc3BfdGltZXJfZW50KTsKLSAgcF9jYi0+ZmxhZ3MgPSAwOwotICAvKiBzZXQgdGhlIGxpbmsgaWRsZSB0aW1lciB0byBkcm9wIHRoZSBsaW5rIHdoZW4gcGFpcmluZyBpcyBkb25lCi0gICAgIHVzdWFsbHkgc2VydmljZSBkaXNjb3Zlcnkgd2lsbCBmb2xsb3cgYXV0aGVudGljYXRpb24gY29tcGxldGUsIHRvIGF2b2lkCi0gICAgIHJhY2luZyBjb25kaXRpb24gZm9yIGEgbGluayBkb3duL3VwLCBzZXQgbGluayBpZGxlIHRpbWVyIHRvIGJlCi0gICAgIFNNUF9MSU5LX1RPVVRfTUlOIHRvIGd1YXJhbnRlZSBTTVAga2V5IGV4Y2hhbmdlICovCi0gIEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcihwX2NiLT5wYWlyaW5nX2JkYSwgU01QX0xJTktfVE9VVF9NSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9UUkFOU1BPUlRfTEUpOwotCi0gIC8qIFdlIGNhbiB0ZWxsIEwyQ0FQIHRvIHJlbW92ZSB0aGUgZml4ZWQgY2hhbm5lbCAoaWYgaXQgaGFzIG9uZSkgKi8KLSAgc21wX3JlbW92ZV9maXhlZF9jaGFubmVsKHBfY2IpOwotICBzbXBfY2JfY2xlYW51cChwX2NiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9wcm9jX3BhaXJpbmdfY21wbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBwYWlyaW5nIGNvbXBsZXRlCi0gKgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9wcm9jX3BhaXJpbmdfY21wbCh0U01QX0NCKiBwX2NiKSB7Ci0gIHRTTVBfRVZUX0RBVEEgZXZ0X2RhdGEgPSB7MH07Ci0gIHRTTVBfQ0FMTEJBQ0sqIHBfY2FsbGJhY2sgPSBwX2NiLT5wX2NhbGxiYWNrOwotCi0gIGV2dF9kYXRhLmNtcGx0LnJlYXNvbiA9IHBfY2ItPnN0YXR1czsKLSAgZXZ0X2RhdGEuY21wbHQuc21wX292ZXJfYnIgPSBwX2NiLT5zbXBfb3Zlcl9icjsKLQotICBMT0dfREVCVUcoCi0gICAgICAiUGFpcmluZyBwcm9jZXNzIGhhcyBjb21wbGV0ZWQgdG8gcmVtb3RlOiVzIHJlYXNvbjoweCUweCBzZWNfbGV2ZWw9MHglMHgiLAotICAgICAgUFJJVkFURV9BRERSRVNTKHBfY2ItPnBhaXJpbmdfYmRhKSwgZXZ0X2RhdGEuY21wbHQucmVhc29uLAotICAgICAgZXZ0X2RhdGEuY21wbHQuc2VjX2xldmVsKTsKLQotICBpZiAocF9jYi0+c3RhdHVzID09IFNNUF9TVUNDRVNTKSBldnRfZGF0YS5jbXBsdC5zZWNfbGV2ZWwgPSBwX2NiLT5zZWNfbGV2ZWw7Ci0KLSAgZXZ0X2RhdGEuY21wbHQuaXNfcGFpcl9jYW5jZWwgPSBmYWxzZTsKLQotICBpZiAocF9jYi0+aXNfcGFpcl9jYW5jZWwpIGV2dF9kYXRhLmNtcGx0LmlzX3BhaXJfY2FuY2VsID0gdHJ1ZTsKLQotICBSYXdBZGRyZXNzIHBhaXJpbmdfYmRhID0gcF9jYi0+cGFpcmluZ19iZGE7Ci0KLSAgc21wX3Jlc2V0X2NvbnRyb2xfdmFsdWUocF9jYik7Ci0KLSAgaWYgKHBfY2FsbGJhY2spICgqcF9jYWxsYmFjaykoU01QX0NPTVBMVF9FVlQsIHBhaXJpbmdfYmRhLCAmZXZ0X2RhdGEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2NvbW1hbmRfaGFzX2ludmFsaWRfbGVuZ3RoCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDaGVja3MgaWYgdGhlIHJlY2VpdmVkIFNNUCBjb21tYW5kIGhhcyBpbnZhbGlkIGxlbmd0aAotICogICAgICAgICAgICAgICAgICBJdCByZXR1cm5zIHRydWUgaWYgdGhlIGNvbW1hbmQgaGFzIGludmFsaWQgbGVuZ3RoLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29tbWFuZCBoYXMgaW52YWxpZCBsZW5ndGgsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9sZW5ndGgodFNNUF9DQiogcF9jYikgewotICB1aW50OF90IGNtZF9jb2RlID0gcF9jYi0+cmN2ZF9jbWRfY29kZTsKLQotICBpZiAoKGNtZF9jb2RlID4gKFNNUF9PUENPREVfTUFYICsgMSAvKiBmb3IgU01QX09QQ09ERV9QQUlSX0NPTU1JVE0gKi8pKSB8fAotICAgICAgKGNtZF9jb2RlIDwgU01QX09QQ09ERV9NSU4pKSB7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIiVzOiBSZWNlaXZlZCBjb21tYW5kIHdpdGggUkVTRVJWRUQgY29kZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbWRfY29kZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAoIXNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgocF9jYikpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jb21tYW5kX2hhc19pbnZhbGlkX3BhcmFtZXRlcnMKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrcyBpZiB0aGUgcmVjZWl2ZWQgU01QIGNvbW1hbmQgaGFzIGludmFsaWQgcGFyYW1ldGVycwotICogICAgICAgICAgICAgICAgICBpLmUuIGlmIHRoZSBjb21tYW5kIGxlbmd0aCBpcyB2YWxpZCBhbmQgdGhlIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgaW5zaWRlIHNwZWNpZmllZCByYW5nZS4KLSAqICAgICAgICAgICAgICAgICAgSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBjb21tYW5kIGhhcyBpbnZhbGlkIHBhcmFtZXRlcnMuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIGlmIHRoZSBjb21tYW5kIGhhcyBpbnZhbGlkIHBhcmFtZXRlcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBzbXBfY29tbWFuZF9oYXNfaW52YWxpZF9wYXJhbWV0ZXJzKHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCBjbWRfY29kZSA9IHBfY2ItPnJjdmRfY21kX2NvZGU7Ci0KLSAgaWYgKChjbWRfY29kZSA+IChTTVBfT1BDT0RFX01BWCArIDEgLyogZm9yIFNNUF9PUENPREVfUEFJUl9DT01NSVRNICovKSkgfHwKLSAgICAgIChjbWRfY29kZSA8IFNNUF9PUENPREVfTUlOKSkgewotICAgIFNNUF9UUkFDRV9XQVJOSU5HKCIlczogUmVjZWl2ZWQgY29tbWFuZCB3aXRoIFJFU0VSVkVEIGNvZGUgMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY21kX2NvZGUpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCEoKnNtcF9jbWRfbGVuX2lzX3ZhbGlkW2NtZF9jb2RlXSkocF9jYikpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygiJXM6IENvbW1hbmQgbGVuZ3RoIG5vdCB2YWxpZCBmb3IgY21kX2NvZGUgMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY21kX2NvZGUpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCEoKnNtcF9jbWRfcGFyYW1fcmFuZ2VzX2FyZV92YWxpZFtjbWRfY29kZV0pKHBfY2IpKSB7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIiVzOiBQYXJhbWV0ZXIgcmFuZ2VzIG5vdCB2YWxpZCBjb2RlIDB4JTAyeCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIGNtZF9jb2RlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jb21tYW5kX2hhc192YWxpZF9maXhlZF9sZW5ndGgKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrcyBpZiB0aGUgcmVjZWl2ZWQgY29tbWFuZCBzaXplIGlzIGVxdWFsIHRvIHRoZSBzaXplCi0gKiAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byBzcGVjcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1hbmQgc2l6ZSBpcyBhcyBleHBlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICoKLSAqIE5vdGUgICAgICAgICAgICAgVGhlIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBmaXhlZCBsZW5ndGguCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBzbXBfY29tbWFuZF9oYXNfdmFsaWRfZml4ZWRfbGVuZ3RoKHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCBjbWRfY29kZSA9IHBfY2ItPnJjdmRfY21kX2NvZGU7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyBmb3IgY21kIGNvZGUgMHglMDJ4IiwgX19mdW5jX18sIGNtZF9jb2RlKTsKLQotICBpZiAocF9jYi0+cmN2ZF9jbWRfbGVuICE9IHNtcF9jbWRfc2l6ZV9wZXJfc3BlY1tjbWRfY29kZV0pIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIlJjdmQgZnJvbSB0aGUgcGVlciBjbWQgMHglMDJ4IHdpdGggaW52YWxpZCBsZW5ndGggIgotICAgICAgICAiMHglMDJ4IChwZXIgc3BlYyB0aGUgbGVuZ3RoIGlzIDB4JTAyeCkuIiwKLSAgICAgICAgY21kX2NvZGUsIHBfY2ItPnJjdmRfY21kX2xlbiwgc21wX2NtZF9zaXplX3Blcl9zcGVjW2NtZF9jb2RlXSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfcGFpcmluZ19yZXF1ZXN0X3Jlc3BvbnNlX3BhcmFtZXRlcnNfYXJlX3ZhbGlkCi0gKgotICogRGVzY3JpcHRpb24gICAgICBWYWxpZGF0ZXMgcGFyYW1ldGVyIHJhbmdlcyBpbiB0aGUgcmVjZWl2ZWQgU01QIGNvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgcGFpcmluZyByZXF1ZXN0IG9yIHBhaXJpbmcgcmVzcG9uc2UuCi0gKiAgICAgICAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlOgotICogICAgICAgICAgICAgICAgICBJTyBjYXBhYmlsaXR5LAotICogICAgICAgICAgICAgICAgICBPT0IgZGF0YSBmbGFnLAotICogICAgICAgICAgICAgICAgICBCb25kaW5nX2ZsYWdzIGluIEF1dGhSZXEKLSAqICAgICAgICAgICAgICAgICAgTWF4aW11bSBlbmNyeXB0aW9uIGtleSBzaXplLgotICogICAgICAgICAgICAgICAgICBSZXR1cm5zIGZhbHNlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIG91dCBvZgotICogICAgICAgICAgICAgICAgICByYW5nZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBzbXBfcGFpcmluZ19yZXF1ZXN0X3Jlc3BvbnNlX3BhcmFtZXRlcnNfYXJlX3ZhbGlkKHRTTVBfQ0IqIHBfY2IpIHsKLSAgdWludDhfdCBpb19jYXBzID0gcF9jYi0+cGVlcl9pb19jYXBzOwotICB1aW50OF90IG9vYl9mbGFnID0gcF9jYi0+cGVlcl9vb2JfZmxhZzsKLSAgdWludDhfdCBib25kX2ZsYWcgPQotICAgICAgcF9jYi0+cGVlcl9hdXRoX3JlcSAmIDB4MDM7ICAvLyAweDAzIGlzIGdlbiBib25kIHdpdGggYXBwcm9wcmlhdGUgbWFzawotICB1aW50OF90IGVuY19zaXplID0gcF9jYi0+cGVlcl9lbmNfc2l6ZTsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIGZvciBjbWQgY29kZSAweCUwMngiLCBfX2Z1bmNfXywgcF9jYi0+cmN2ZF9jbWRfY29kZSk7Ci0KLSAgaWYgKGlvX2NhcHMgPj0gQlRNX0lPX0NBUF9NQVgpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIlJjdmQgZnJvbSB0aGUgcGVlciBjbWQgMHglMDJ4IHdpdGggSU8gQ2FwYWJpbGl0eSAiCi0gICAgICAgICJ2YWx1ZSAoMHglMDJ4KSBvdXQgb2YgcmFuZ2UpLiIsCi0gICAgICAgIHBfY2ItPnJjdmRfY21kX2NvZGUsIGlvX2NhcHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghKChvb2JfZmxhZyA9PSBTTVBfT09CX05PTkUpIHx8IChvb2JfZmxhZyA9PSBTTVBfT09CX1BSRVNFTlQpKSkgewotICAgIFNNUF9UUkFDRV9XQVJOSU5HKAotICAgICAgICAiUmN2ZCBmcm9tIHRoZSBwZWVyIGNtZCAweCUwMnggd2l0aCBPT0IgZGF0YSBmbGFnIHZhbHVlICIKLSAgICAgICAgIigweCUwMngpIG91dCBvZiByYW5nZSkuIiwKLSAgICAgICAgcF9jYi0+cmN2ZF9jbWRfY29kZSwgb29iX2ZsYWcpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghKChib25kX2ZsYWcgPT0gU01QX0FVVEhfTk9fQk9ORCkgfHwgKGJvbmRfZmxhZyA9PSBTTVBfQVVUSF9CT05EKSkpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIlJjdmQgZnJvbSB0aGUgcGVlciBjbWQgMHglMDJ4IHdpdGggQm9uZGluZ19GbGFncyB2YWx1ZSAoMHglMDJ4KSAiCi0gICAgICAgICJvdXQgb2YgcmFuZ2UpLiIsCi0gICAgICAgIHBfY2ItPnJjdmRfY21kX2NvZGUsIGJvbmRfZmxhZyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKChlbmNfc2l6ZSA8IFNNUF9FTkNSX0tFWV9TSVpFX01JTikgfHwKLSAgICAgIChlbmNfc2l6ZSA+IFNNUF9FTkNSX0tFWV9TSVpFX01BWCkpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIlJjdmQgZnJvbSB0aGUgcGVlciBjbWQgMHglMDJ4IHdpdGggTWF4aW11bSBFbmNyeXB0aW9uICIKLSAgICAgICAgIktleSB2YWx1ZSAoMHglMDJ4KSBvdXQgb2YgcmFuZ2UpLiIsCi0gICAgICAgIHBfY2ItPnJjdmRfY21kX2NvZGUsIGVuY19zaXplKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9wYWlyaW5nX2tleXByZXNzX25vdGlmaWNhdGlvbl9pc192YWxpZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVmFsaWRhdGVzIE5vdGlmaWNhdGlvbiBUeXBlIHBhcmFtZXRlciByYW5nZSBpbiB0aGUgcmVjZWl2ZWQKLSAqICAgICAgICAgICAgICAgICAgU01QIGNvbW1hbmQgcGFpcmluZyBrZXlwcmVzcyBub3RpZmljYXRpb24uCi0gKiAgICAgICAgICAgICAgICAgIFJldHVybnMgZmFsc2UgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHNtcF9wYWlyaW5nX2tleXByZXNzX25vdGlmaWNhdGlvbl9pc192YWxpZCh0U01QX0NCKiBwX2NiKSB7Ci0gIHRTTVBfU0NfS0VZX1RZUEUga2V5cHJlc3Nfbm90aWZpY2F0aW9uID0gcF9jYi0+cGVlcl9rZXlwcmVzc19ub3RpZmljYXRpb247Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyBmb3IgY21kIGNvZGUgMHglMDJ4IiwgX19mdW5jX18sIHBfY2ItPnJjdmRfY21kX2NvZGUpOwotCi0gIGlmIChrZXlwcmVzc19ub3RpZmljYXRpb24gPj0gU01QX1NDX0tFWV9PVVRfT0ZfUkFOR0UpIHsKLSAgICBTTVBfVFJBQ0VfV0FSTklORygKLSAgICAgICAgIlJjdmQgZnJvbSB0aGUgcGVlciBjbWQgMHglMDJ4IHdpdGggUGFpcmluZyBLZXlwcmVzcyAiCi0gICAgICAgICJOb3RpZmljYXRpb24gdmFsdWUgKDB4JTAyeCkgb3V0IG9mIHJhbmdlKS4iLAotICAgICAgICBwX2NiLT5yY3ZkX2NtZF9jb2RlLCBrZXlwcmVzc19ub3RpZmljYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFsd2F5cyByZXR1cm5zIHRydWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgc21wX3BhcmFtZXRlcl91bmNvbmRpdGlvbmFsbHlfdmFsaWQoVU5VU0VEX0FUVFIgdFNNUF9DQiogcF9jYikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9wYXJhbWV0ZXJfdW5jb25kaXRpb25hbGx5X2ludmFsaWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEFsd2F5cyByZXR1cm5zIGZhbHNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHNtcF9wYXJhbWV0ZXJfdW5jb25kaXRpb25hbGx5X2ludmFsaWQoVU5VU0VEX0FUVFIgdFNNUF9DQiogcF9jYikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfcmVqZWN0X3VuZXhwZWN0ZWRfcGFpcmluZ19jb21tYW5kCi0gKgotICogRGVzY3JpcHRpb24gICAgICBzZW5kIHBhaXJpbmcgZmFpbHVyZSB0byBhbiB1bmV4cGVjdGVkIHBhaXJpbmcgY29tbWFuZCBkdXJpbmcKLSAqICAgICAgICAgICAgICAgICAgYW4gYWN0aXZlIHBhaXJpbmcgcHJvY2Vzcy4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzbXBfcmVqZWN0X3VuZXhwZWN0ZWRfcGFpcmluZ19jb21tYW5kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgdWludDhfdCogcDsKLSAgQlRfSERSKiBwX2J1ZiA9IChCVF9IRFIqKW9zaV9tYWxsb2Moc2l6ZW9mKEJUX0hEUikgKyBTTVBfUEFJUl9GQUlMX1NJWkUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMkNBUF9NSU5fT0ZGU0VUKTsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIHAgPSAodWludDhfdCopKHBfYnVmICsgMSkgKyBMMkNBUF9NSU5fT0ZGU0VUOwotICBVSU5UOF9UT19TVFJFQU0ocCwgU01QX09QQ09ERV9QQUlSSU5HX0ZBSUxFRCk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBTTVBfUEFJUl9OT1RfU1VQUE9SVCk7Ci0KLSAgcF9idWYtPm9mZnNldCA9IEwyQ0FQX01JTl9PRkZTRVQ7Ci0gIHBfYnVmLT5sZW4gPSBTTVBfUEFJUl9GQUlMX1NJWkU7Ci0KLSAgc21wX3NlbmRfbXNnX3RvX0wyQ0FQKGJkX2FkZHIsIHBfYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3NlbGVjdF9hc3NvY2lhdGlvbl9tb2RlbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGFzc29jaWF0aW9uIG1vZGVsIHRvIHVzZSBmb3IgU1RLCi0gKiAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24uIFNlbGVjdGlvbiBpcyBiYXNlZCBvbiBib3RoIHNpZGVzJyBpbyBjYXBhYmlsaXR5LAotICogICAgICAgICAgICAgICAgICBvb2IgZGF0YSBmbGFnIGFuZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0LgotICoKLSAqIE5vdGUgICAgICAgICAgICAgSWYgU2VjdXJlIENvbm5lY3Rpb25zIE9ubHkgbW9kZSBpcyByZXF1aXJlZCBsb2NhbGx5IHRoZW4gd2UKLSAqICAgICAgICAgICAgICAgICAgY29tZSB0byB0aGlzIHBvaW50IG9ubHkgaWYgYm90aCBzaWRlcyBzdXBwb3J0IFNlY3VyZQotICogICAgICAgICAgICAgICAgICBDb25uZWN0aW9ucyBtb2RlLCBpLmUuCi0gKiAgICAgICAgICAgICAgICAgIGlmIHBfY2ItPnNlY3VyZV9jb25uZWN0aW9uc19vbmx5X21vZGVfcmVxdWlyZWQgPSB0cnVlCi0gKiAgICAgICAgICAgICAgICAgIHRoZW4gd2UgY29tZSB0byB0aGlzIHBvaW50IG9ubHkgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgIChwX2NiLT5wZWVyX2F1dGhfcmVxICYgU01QX1NDX1NVUFBPUlRfQklUKSA9PQotICogICAgICAgICAgICAgICAgICAgICAgKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9TQ19TVVBQT1JUX0JJVCkgPT0KLSAqICAgICAgICAgICAgICAgICAgICAgIFNNUF9TQ19TVVBQT1JUX0JJVAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U01QX0FTU09fTU9ERUwgc21wX3NlbGVjdF9hc3NvY2lhdGlvbl9tb2RlbCh0U01QX0NCKiBwX2NiKSB7Ci0gIHRTTVBfQVNTT19NT0RFTCBtb2RlbCA9IFNNUF9NT0RFTF9PVVRfT0ZfUkFOR0U7Ci0gIHBfY2ItPmxlX3NlY3VyZV9jb25uZWN0aW9uc19tb2RlX2lzX3VzZWQgPSBmYWxzZTsKLQotICBTTVBfVFJBQ0VfRVZFTlQoIiVzIiwgX19mdW5jX18pOwotICBTTVBfVFJBQ0VfREVCVUcoIiVzIHBfY2ItPnBlZXJfaW9fY2FwcyA9ICVkIHBfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHkgPSAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9jYi0+cGVlcl9pb19jYXBzLCBwX2NiLT5sb2NhbF9pb19jYXBhYmlsaXR5KTsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyBwX2NiLT5wZWVyX29vYl9mbGFnID0gJWQgcF9jYi0+bG9jX29vYl9mbGFnID0gJWQiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfY2ItPnBlZXJfb29iX2ZsYWcsIHBfY2ItPmxvY19vb2JfZmxhZyk7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMgcF9jYi0+cGVlcl9hdXRoX3JlcSA9IDB4JTAyeCBwX2NiLT5sb2NfYXV0aF9yZXEgPSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfY2ItPnBlZXJfYXV0aF9yZXEsIHBfY2ItPmxvY19hdXRoX3JlcSk7Ci0gIFNNUF9UUkFDRV9ERUJVRygKLSAgICAgICIlcyBwX2NiLT5zZWN1cmVfY29ubmVjdGlvbnNfb25seV9tb2RlX3JlcXVpcmVkID0gJXMiLCBfX2Z1bmNfXywKLSAgICAgIHBfY2ItPnNlY3VyZV9jb25uZWN0aW9uc19vbmx5X21vZGVfcmVxdWlyZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotICBpZiAoKHBfY2ItPnBlZXJfYXV0aF9yZXEgJiBTTVBfU0NfU1VQUE9SVF9CSVQpICYmCi0gICAgICAocF9jYi0+bG9jX2F1dGhfcmVxICYgU01QX1NDX1NVUFBPUlRfQklUKSkgewotICAgIHBfY2ItPmxlX3NlY3VyZV9jb25uZWN0aW9uc19tb2RlX2lzX3VzZWQgPSB0cnVlOwotICB9Ci0KLSAgaWYgKChwX2NiLT5wZWVyX2F1dGhfcmVxICYgU01QX0g3X1NVUFBPUlRfQklUKSAmJgotICAgICAgKHBfY2ItPmxvY19hdXRoX3JlcSAmIFNNUF9IN19TVVBQT1JUX0JJVCkpIHsKLSAgICBwX2NiLT5rZXlfZGVyaXZhdGlvbl9oN191c2VkID0gVFJVRTsKLSAgfQotCi0gIFNNUF9UUkFDRV9ERUJVRygidXNlX3NjX3Byb2Nlc3MgPSAlZCwgaDcgdXNlID0gJWQiLAotICAgICAgICAgICAgICAgICAgcF9jYi0+bGVfc2VjdXJlX2Nvbm5lY3Rpb25zX21vZGVfaXNfdXNlZCwKLSAgICAgICAgICAgICAgICAgIHBfY2ItPmtleV9kZXJpdmF0aW9uX2g3X3VzZWQpOwotCi0gIGlmIChwX2NiLT5sZV9zZWN1cmVfY29ubmVjdGlvbnNfbW9kZV9pc191c2VkKSB7Ci0gICAgbW9kZWwgPSBzbXBfc2VsZWN0X2Fzc29jaWF0aW9uX21vZGVsX3NlY3VyZV9jb25uZWN0aW9ucyhwX2NiKTsKLSAgfSBlbHNlIHsKLSAgICBtb2RlbCA9IHNtcF9zZWxlY3RfbGVnYWN5X2Fzc29jaWF0aW9uX21vZGVsKHBfY2IpOwotICB9Ci0gIHJldHVybiBtb2RlbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3NlbGVjdF9sZWdhY3lfYXNzb2NpYXRpb25fbW9kZWwKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNlbGVjdCBhc3NvY2lhdGlvbiBtb2RlIGlmIGF0Ci0gKiAgICAgICAgICAgICAgICAgIGxlYXN0IG9uZSBzaWRlIGRvZXNuJ3Qgc3VwcG9ydCBzZWN1cmUgY29ubmVjdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXRTTVBfQVNTT19NT0RFTCBzbXBfc2VsZWN0X2xlZ2FjeV9hc3NvY2lhdGlvbl9tb2RlbCh0U01QX0NCKiBwX2NiKSB7Ci0gIHRTTVBfQVNTT19NT0RFTCBtb2RlbCA9IFNNUF9NT0RFTF9PVVRfT0ZfUkFOR0U7Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCIlcyIsIF9fZnVuY19fKTsKLSAgLyogaWYgT09CIGRhdGEgaXMgcHJlc2VudCBvbiBib3RoIGRldmljZXMsIHRoZW4gdXNlIE9PQiBhc3NvY2lhdGlvbiBtb2RlbCAqLwotICBpZiAocF9jYi0+cGVlcl9vb2JfZmxhZyA9PSBTTVBfT09CX1BSRVNFTlQgJiYKLSAgICAgIHBfY2ItPmxvY19vb2JfZmxhZyA9PSBTTVBfT09CX1BSRVNFTlQpCi0gICAgcmV0dXJuIFNNUF9NT0RFTF9PT0I7Ci0KLSAgLyogZWxzZSBpZiBuZWl0aGVyIGRldmljZSByZXF1aXJlcyBNSVRNLCB0aGVuIHVzZSBKdXN0IFdvcmtzIGFzc29jaWF0aW9uIG1vZGVsCi0gICAqLwotICBpZiAoU01QX05PX01JVE1fUkVRVUlSRUQocF9jYi0+cGVlcl9hdXRoX3JlcSkgJiYKLSAgICAgIFNNUF9OT19NSVRNX1JFUVVJUkVEKHBfY2ItPmxvY19hdXRoX3JlcSkpCi0gICAgcmV0dXJuIFNNUF9NT0RFTF9FTkNSWVBUSU9OX09OTFk7Ci0KLSAgLyogb3RoZXJ3aXNlIHVzZSBJTyBjYXBhYmlsaXR5IHRvIHNlbGVjdCBhc3NvY2lhdGlvbiBtb2RlbCAqLwotICBpZiAocF9jYi0+cGVlcl9pb19jYXBzIDwgU01QX0lPX0NBUF9NQVggJiYKLSAgICAgIHBfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHkgPCBTTVBfSU9fQ0FQX01BWCkgewotICAgIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICAgIG1vZGVsID0gc21wX2Fzc29jaWF0aW9uX3RhYmxlW3BfY2ItPnJvbGVdW3BfY2ItPnBlZXJfaW9fY2Fwc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHldOwotICAgIH0gZWxzZSB7Ci0gICAgICBtb2RlbCA9IHNtcF9hc3NvY2lhdGlvbl90YWJsZVtwX2NiLT5yb2xlXVtwX2NiLT5sb2NhbF9pb19jYXBhYmlsaXR5XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcF9jYi0+cGVlcl9pb19jYXBzXTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbW9kZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9zZWxlY3RfYXNzb2NpYXRpb25fbW9kZWxfc2VjdXJlX2Nvbm5lY3Rpb25zCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZWxlY3QgYXNzb2NpYXRpb24gbW9kZSBpZiBib3RoCi0gKiAgICAgICAgICAgICAgICAgIHNpZGVzIHN1cHBvcnQgc2VjdXJlIGNvbm5lY3Rpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U01QX0FTU09fTU9ERUwgc21wX3NlbGVjdF9hc3NvY2lhdGlvbl9tb2RlbF9zZWN1cmVfY29ubmVjdGlvbnModFNNUF9DQiogcF9jYikgewotICB0U01QX0FTU09fTU9ERUwgbW9kZWwgPSBTTVBfTU9ERUxfT1VUX09GX1JBTkdFOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0gIC8qIGlmIE9PQiBkYXRhIGlzIHByZXNlbnQgb24gYXQgbGVhc3Qgb25lIGRldmljZSwgdGhlbiB1c2UgT09CIGFzc29jaWF0aW9uCi0gICAqIG1vZGVsICovCi0gIGlmIChwX2NiLT5wZWVyX29vYl9mbGFnID09IFNNUF9PT0JfUFJFU0VOVCB8fAotICAgICAgcF9jYi0+bG9jX29vYl9mbGFnID09IFNNUF9PT0JfUFJFU0VOVCkKLSAgICByZXR1cm4gU01QX01PREVMX1NFQ19DT05OX09PQjsKLQotICAvKiBlbHNlIGlmIG5laXRoZXIgZGV2aWNlIHJlcXVpcmVzIE1JVE0sIHRoZW4gdXNlIEp1c3QgV29ya3MgYXNzb2NpYXRpb24gbW9kZWwKLSAgICovCi0gIGlmIChTTVBfTk9fTUlUTV9SRVFVSVJFRChwX2NiLT5wZWVyX2F1dGhfcmVxKSAmJgotICAgICAgU01QX05PX01JVE1fUkVRVUlSRUQocF9jYi0+bG9jX2F1dGhfcmVxKSkKLSAgICByZXR1cm4gU01QX01PREVMX1NFQ19DT05OX0pVU1RXT1JLUzsKLQotICAvKiBvdGhlcndpc2UgdXNlIElPIGNhcGFiaWxpdHkgdG8gc2VsZWN0IGFzc29jaWF0aW9uIG1vZGVsICovCi0gIGlmIChwX2NiLT5wZWVyX2lvX2NhcHMgPCBTTVBfSU9fQ0FQX01BWCAmJgotICAgICAgcF9jYi0+bG9jYWxfaW9fY2FwYWJpbGl0eSA8IFNNUF9JT19DQVBfTUFYKSB7Ci0gICAgaWYgKHBfY2ItPnJvbGUgPT0gSENJX1JPTEVfQ0VOVFJBTCkgewotICAgICAgbW9kZWwgPSBzbXBfYXNzb2NpYXRpb25fdGFibGVfc2NbcF9jYi0+cm9sZV1bcF9jYi0+cGVlcl9pb19jYXBzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcF9jYi0+bG9jYWxfaW9fY2FwYWJpbGl0eV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1vZGVsID0gc21wX2Fzc29jaWF0aW9uX3RhYmxlX3NjW3BfY2ItPnJvbGVdW3BfY2ItPmxvY2FsX2lvX2NhcGFiaWxpdHldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwX2NiLT5wZWVyX2lvX2NhcHNdOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBtb2RlbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX2NhbGN1bGF0ZV9yYW5kb21faW5wdXQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByYW5kb20gaW5wdXQgdmFsdWUgdG8gYmUgdXNlZCBpbgotICogICAgICAgICAgICAgICAgICBjb21taXRtZW50IGNhbGN1bGF0aW9uIGZvciBTQyBwYXNza2V5IGVudHJ5IGFzc29jaWF0aW9uIG1vZGUKLSAqICAgICAgICAgICAgICAgICAgKGlmIGJpdFsicm91bmQiXSBpbiAicmFuZG9tIiBhcnJheSA9PSAxIHRoZW4gcmV0dXJucyAweDgxCi0gKiAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybnMgMHg4MCkuCi0gKgotICogUmV0dXJucyAgICAgICAgICByaSB2YWx1ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50OF90IHNtcF9jYWxjdWxhdGVfcmFuZG9tX2lucHV0KHVpbnQ4X3QqIHJhbmRvbSwgdWludDhfdCByb3VuZCkgewotICB1aW50OF90IGkgPSByb3VuZCAvIDg7Ci0gIHVpbnQ4X3QgaiA9IHJvdW5kICUgODsKLSAgdWludDhfdCByaTsKLQotICBTTVBfVFJBQ0VfREVCVUcoInJhbmRvbTogMHglMDJ4LCByb3VuZDogJWQsIGk6ICVkLCBqOiAlZCIsIHJhbmRvbVtpXSwgcm91bmQsCi0gICAgICAgICAgICAgICAgICBpLCBqKTsKLSAgcmkgPSAoKHJhbmRvbVtpXSA+PiBqKSAmIDEpIHwgMHg4MDsKLSAgU01QX1RSQUNFX0RFQlVHKCIlcyByaT0weCUwMngiLCBfX2Z1bmNfXywgcmkpOwotICByZXR1cm4gcmk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jb2xsZWN0X2xvY2FsX2lvX2NhcGFiaWxpdGllcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBwdXRzIGludG8gSU9jYXAgYXJyYXkgbG9jYWwgZGV2aWNlCi0gKiAgICAgICAgICAgICAgICAgIElPQ2FwYWJpbGl0eSwgT09CIGRhdGEsIEF1dGhSZXEuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NvbGxlY3RfbG9jYWxfaW9fY2FwYWJpbGl0aWVzKHVpbnQ4X3QqIGlvY2FwLCB0U01QX0NCKiBwX2NiKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaW9jYXBbMF0gPSBwX2NiLT5sb2NhbF9pb19jYXBhYmlsaXR5OwotICBpb2NhcFsxXSA9IHBfY2ItPmxvY19vb2JfZmxhZzsKLSAgaW9jYXBbMl0gPSBwX2NiLT5sb2NfYXV0aF9yZXE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jb2xsZWN0X3BlZXJfaW9fY2FwYWJpbGl0aWVzCi0gKgotICogRGVzY3JpcHRpb24gICAgICBUaGlzIGZ1bmN0aW9uIHB1dHMgaW50byBJT2NhcCBhcnJheSBwZWVyIGRldmljZQotICogICAgICAgICAgICAgICAgICBJT0NhcGFiaWxpdHksIE9PQiBkYXRhLCBBdXRoUmVxLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNtcF9jb2xsZWN0X3BlZXJfaW9fY2FwYWJpbGl0aWVzKHVpbnQ4X3QqIGlvY2FwLCB0U01QX0NCKiBwX2NiKSB7Ci0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaW9jYXBbMF0gPSBwX2NiLT5wZWVyX2lvX2NhcHM7Ci0gIGlvY2FwWzFdID0gcF9jYi0+cGVlcl9vb2JfZmxhZzsKLSAgaW9jYXBbMl0gPSBwX2NiLT5wZWVyX2F1dGhfcmVxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY29sbGVjdF9sb2NhbF9ibGVfYWRkcmVzcwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUHV0IHRoZSB0aGUgbG9jYWwgZGV2aWNlIExFIGFkZHJlc3MgaW50byB0aGUgbGVfYWRkciBhcnJheToKLSAqICAgICAgICAgICAgICAgICAgbGVfYWRkclswLTVdID0gbG9jYWwgQkQgQUREUiwKLSAqICAgICAgICAgICAgICAgICAgbGVfYWRkcls2XSA9IGxvY2FsIGxlIGFkZHJlc3MgdHlwZSAoUFVCTElDL1JBTkRPTSkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NvbGxlY3RfbG9jYWxfYmxlX2FkZHJlc3ModWludDhfdCogbGVfYWRkciwgdFNNUF9DQiogcF9jYikgewotICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB1aW50OF90KiBwID0gbGVfYWRkcjsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIEJUTV9SZWFkQ29ubmVjdGlvbkFkZHIocF9jYi0+cGFpcmluZ19iZGEsIGJkYSwgJmFkZHJfdHlwZSk7Ci0gIEJEQUREUl9UT19TVFJFQU0ocCwgYmRhKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIGFkZHJfdHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNtcF9jb2xsZWN0X3BlZXJfYmxlX2FkZHJlc3MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFB1dCB0aGUgcGVlciBkZXZpY2UgTEUgYWRkciBpbnRvIHRoZSBsZV9hZGRyIGFycmF5OgotICogICAgICAgICAgICAgICAgICBsZV9hZGRyWzAtNV0gPSBwZWVyIEJEIEFERFIsCi0gKiAgICAgICAgICAgICAgICAgIGxlX2FkZHJbNl0gPSBwZWVyIGxlIGFkZHJlc3MgdHlwZSAoUFVCTElDL1JBTkRPTSkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX2NvbGxlY3RfcGVlcl9ibGVfYWRkcmVzcyh1aW50OF90KiBsZV9hZGRyLCB0U01QX0NCKiBwX2NiKSB7Ci0gIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSA9IEJMRV9BRERSX1BVQkxJQzsKLSAgUmF3QWRkcmVzcyBiZGE7Ci0gIHVpbnQ4X3QqIHAgPSBsZV9hZGRyOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKCFCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKHBfY2ItPnBhaXJpbmdfYmRhLCBiZGEsICZhZGRyX3R5cGUpKSB7Ci0gICAgU01QX1RSQUNFX0VSUk9SKAotICAgICAgICAiY2FuIG5vdCBjb2xsZWN0IHBlZXIgbGUgYWRkciBpbmZvcm1hdGlvbiBmb3IgdW5rbm93biBkZXZpY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBCREFERFJfVE9fU1RSRUFNKHAsIGJkYSk7Ci0gIFVJTlQ4X1RPX1NUUkVBTShwLCBhZGRyX3R5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gICAgICAgICBzbXBfY2hlY2tfY29tbWl0bWVudAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBjb21wYXJlcyBwZWVyIGNvbW1pdG1lbnQgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAtIGV4cGVjdGVkIChpLmUuIGNhbGN1bGF0ZWQgbG9jYWxseSksCi0gKiAgICAgICAgICAgICAgICAgIC0gcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHRydWUgIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHNtcF9jaGVja19jb21taXRtZW50KHRTTVBfQ0IqIHBfY2IpIHsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIE9jdGV0MTYgZXhwZWN0ZWQgPSBzbXBfY2FsY3VsYXRlX3BlZXJfY29tbWl0bWVudChwX2NiKTsKLSAgcHJpbnQxMjgoZXhwZWN0ZWQsIChjb25zdCB1aW50OF90KikiY2FsY3VsYXRlZCBwZWVyIGNvbW1pdG1lbnQiKTsKLSAgcHJpbnQxMjgocF9jYi0+cmVtb3RlX2NvbW1pdG1lbnQsIChjb25zdCB1aW50OF90KikicmVjZWl2ZWQgcGVlciBjb21taXRtZW50Iik7Ci0KLSAgaWYgKG1lbWNtcChwX2NiLT5yZW1vdGVfY29tbWl0bWVudC5kYXRhKCksIGV4cGVjdGVkLmRhdGEoKSwgT0NURVQxNl9MRU4pKSB7Ci0gICAgU01QX1RSQUNFX1dBUk5JTkcoIiVzOiBDb21taXRtZW50IGNoZWNrIGZhaWxzIiwgX19mdW5jX18pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXM6IENvbW1pdG1lbnQgY2hlY2sgc3VjY2VlZHMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3NhdmVfc2VjdXJlX2Nvbm5lY3Rpb25zX2xvbmdfdGVybV9rZXkKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBzYXZlcyBTQyBMVEsgYXMgQkxFIGtleSBmb3IgZnV0dXJlIHVzZSBhcyBsb2NhbAotICogICAgICAgICAgICAgICAgICBhbmQvb3IgcGVlciBrZXkuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc21wX3NhdmVfc2VjdXJlX2Nvbm5lY3Rpb25zX2xvbmdfdGVybV9rZXkodFNNUF9DQiogcF9jYikgewotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMtU2F2ZSBMVEsgYXMgbG9jYWwgTFRLIGtleSIsIF9fZnVuY19fKTsKLSAgdEJUTV9MRV9LRVlfVkFMVUUgbGxlX2tleSA9IHsKLSAgICAgIC5sZW5jX2tleSA9Ci0gICAgICAgICAgewotICAgICAgICAgICAgICAubHRrID0gcF9jYi0+bHRrLAotICAgICAgICAgICAgICAuZGl2ID0gMCwKLSAgICAgICAgICAgICAgLmtleV9zaXplID0gcF9jYi0+bG9jX2VuY19zaXplLAotICAgICAgICAgICAgICAuc2VjX2xldmVsID0gcF9jYi0+c2VjX2xldmVsLAotICAgICAgICAgIH0sCi0gIH07Ci0gIGJ0bV9zZWNfc2F2ZV9sZV9rZXkocF9jYi0+cGFpcmluZ19iZGEsIEJUTV9MRV9LRVlfTEVOQywgJmxsZV9rZXksIHRydWUpOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMtU2F2ZSBMVEsgYXMgcGVlciBMVEsga2V5IiwgX19mdW5jX18pOwotICB0QlRNX0xFX0tFWV9WQUxVRSBwbGVfa2V5ID0gewotICAgICAgLnBlbmNfa2V5ID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5sdGsgPSBwX2NiLT5sdGssCi0gICAgICAgICAgICAgIC5zZWNfbGV2ZWwgPSBwX2NiLT5zZWNfbGV2ZWwsCi0gICAgICAgICAgICAgIC5rZXlfc2l6ZSA9IHBfY2ItPmxvY19lbmNfc2l6ZSwKLSAgICAgICAgICAgICAgLmVkaXYgPSAwLAotICAgICAgICAgIH0sCi0gIH07Ci0gIG1lbXNldChwbGVfa2V5LnBlbmNfa2V5LnJhbmQsIDAsIEJUX09DVEVUOF9MRU4pOwotICBidG1fc2VjX3NhdmVfbGVfa2V5KHBfY2ItPnBhaXJpbmdfYmRhLCBCVE1fTEVfS0VZX1BFTkMsICZwbGVfa2V5LCB0cnVlKTsKLX0KLQotLyoqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIE1hY0tleSBhbmQgTFRLIGFuZCBzYXZlcyB0aGVtIGluIENCLiBUbyBjYWxjdWxhdGUKLSAqIE1hY0tleSBhbmQgTFRLIGl0IGNhbGxzIHNtcF9jYWxjX2Y1KC4uLikuIE1hY0tleSBpcyB1c2VkIGluIGRoa2V5Ci0gKiBjYWxjdWxhdGlvbiwgTFRLIGlzIHVzZWQgdG8gZW5jcnlwdCB0aGUgbGluay4gKi8KLXZvaWQgc21wX2NhbGN1bGF0ZV9mNV9tYWNrZXlfYW5kX2xvbmdfdGVybV9rZXkodFNNUF9DQiogcF9jYikgewotICB1aW50OF90IGFbN107Ci0gIHVpbnQ4X3QgYls3XTsKLSAgT2N0ZXQxNiBuYTsKLSAgT2N0ZXQxNiBuYjsKLQotICBTTVBfVFJBQ0VfREVCVUcoIiVzIiwgX19mdW5jX18pOwotCi0gIGlmIChwX2NiLT5yb2xlID09IEhDSV9ST0xFX0NFTlRSQUwpIHsKLSAgICBzbXBfY29sbGVjdF9sb2NhbF9ibGVfYWRkcmVzcyhhLCBwX2NiKTsKLSAgICBzbXBfY29sbGVjdF9wZWVyX2JsZV9hZGRyZXNzKGIsIHBfY2IpOwotICAgIG5hID0gcF9jYi0+cmFuZDsKLSAgICBuYiA9IHBfY2ItPnJyYW5kOwotICB9IGVsc2UgewotICAgIHNtcF9jb2xsZWN0X2xvY2FsX2JsZV9hZGRyZXNzKGIsIHBfY2IpOwotICAgIHNtcF9jb2xsZWN0X3BlZXJfYmxlX2FkZHJlc3MoYSwgcF9jYik7Ci0gICAgbmEgPSBwX2NiLT5ycmFuZDsKLSAgICBuYiA9IHBfY2ItPnJhbmQ7Ci0gIH0KLQotICBjcnlwdG9fdG9vbGJveDo6ZjUocF9jYi0+ZGhrZXksIG5hLCBuYiwgYSwgYiwgJnBfY2ItPm1hY19rZXksICZwX2NiLT5sdGspOwotCi0gIFNNUF9UUkFDRV9FVkVOVCgiJXMgaXMgY29tcGxldGVkIiwgX19mdW5jX18pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc21wX3JlcXVlc3Rfb29iX2RhdGEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlcXVlc3RzIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgT09CIGRhdGEuCi0gKgotICogUmV0dXJucyAgICAgICAgICB0cnVlIC0gT09CIGRhdGEgaGFzIHRvIGJlIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uCi0gKiAgICAgICAgICAgICAgICAgIGZhbHNlIC0gb3RoZXJ3aXNlICh1bmV4cGVjdGVkKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHNtcF9yZXF1ZXN0X29vYl9kYXRhKHRTTVBfQ0IqIHBfY2IpIHsKLSAgdFNNUF9PT0JfREFUQV9UWVBFIHJlcV9vb2JfdHlwZSA9IFNNUF9PT0JfSU5WQUxJRF9UWVBFOwotCi0gIFNNUF9UUkFDRV9ERUJVRygiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaWYgKHBfY2ItPnBlZXJfb29iX2ZsYWcgPT0gU01QX09PQl9QUkVTRU5UICYmCi0gICAgICBwX2NiLT5sb2Nfb29iX2ZsYWcgPT0gU01QX09PQl9QUkVTRU5UKSB7Ci0gICAgLyogYm90aCBsb2NhbCBhbmQgcGVlciByY3ZkIGRhdGEgT09CICovCi0gICAgcmVxX29vYl90eXBlID0gU01QX09PQl9CT1RIOwotICB9IGVsc2UgaWYgKHBfY2ItPnBlZXJfb29iX2ZsYWcgPT0gU01QX09PQl9QUkVTRU5UKSB7Ci0gICAgLyogcGVlciByY3ZkIE9PQiBsb2NhbCBkYXRhLCBsb2NhbCBkaWRuJ3QgcmVjZWl2ZSBPT0IgcGVlciBkYXRhICovCi0gICAgcmVxX29vYl90eXBlID0gU01QX09PQl9MT0NBTDsKLSAgfSBlbHNlIGlmIChwX2NiLT5sb2Nfb29iX2ZsYWcgPT0gU01QX09PQl9QUkVTRU5UKSB7Ci0gICAgcmVxX29vYl90eXBlID0gU01QX09PQl9QRUVSOwotICB9Ci0KLSAgU01QX1RSQUNFX0RFQlVHKCJyZXFfb29iX3R5cGUgPSAlZCIsIHJlcV9vb2JfdHlwZSk7Ci0KLSAgaWYgKHJlcV9vb2JfdHlwZSA9PSBTTVBfT09CX0lOVkFMSURfVFlQRSkgcmV0dXJuIGZhbHNlOwotCi0gIHBfY2ItPnJlcV9vb2JfdHlwZSA9IHJlcV9vb2JfdHlwZTsKLSAgcF9jYi0+Y2JfZXZ0ID0gU01QX1NDX09PQl9SRVFfRVZUOwotICB0U01QX0lOVF9EQVRBIHNtcF9pbnRfZGF0YTsKLSAgc21wX2ludF9kYXRhLnJlcV9vb2JfdHlwZSA9IHJlcV9vb2JfdHlwZTsKLSAgc21wX3NtX2V2ZW50KHBfY2IsIFNNUF9US19SRVFfRVZULCAmc21wX2ludF9kYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBwcmludDEyOChjb25zdCBPY3RldDE2JiB4LCBjb25zdCB1aW50OF90KiBrZXlfbmFtZSkgewotICBpZiAoVkxPR19JU19PTigyKSAmJiBETE9HX0lTX09OKElORk8pKSB7Ci0gICAgdWludDhfdCogcCA9ICh1aW50OF90Kil4LmRhdGEoKTsKLQotICAgIERWTE9HKDIpIDw8IGtleV9uYW1lIDw8ICIgKE1TQiB+IExTQikgPSAiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICBEVkxPRygyKSA8PCArcFtPQ1RFVDE2X0xFTiAtIGkgKiA0IC0gMV0gPDwgK3BbT0NURVQxNl9MRU4gLSBpICogNCAtIDJdCi0gICAgICAgICAgICAgICA8PCArcFtPQ1RFVDE2X0xFTiAtIGkgKiA0IC0gM10gPDwgK3BbT0NURVQxNl9MRU4gLSBpICogNCAtIDRdOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc3J2Yy9zcnZjX2Rpcy5jYyBiL3N0YWNrL3NydmMvc3J2Y19kaXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjVkYjguLjAwMDAwMDAKLS0tIGEvc3RhY2svc3J2Yy9zcnZjX2Rpcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NydmMiCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImdhdHRfYXBpLmgiCi0jaW5jbHVkZSAiZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzcnZjX2Rpc19pbnQuaCIKLSNpbmNsdWRlICJzcnZjX2VuZ19pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLXVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKLSNkZWZpbmUgRElTX01BWF9OVU1fSU5DX1NWUiAwCi0jZGVmaW5lIERJU19NQVhfQ0hBUl9OVU0gOQotI2RlZmluZSBESVNfTUFYX0FUVFJfTlVNIChESVNfTUFYX0NIQVJfTlVNICogMiArIERJU19NQVhfTlVNX0lOQ19TVlIgKyAxKQotCi0jaWZuZGVmIERJU19BVFRSX0RCX1NJWkUKLSNkZWZpbmUgRElTX0FUVFJfREJfU0laRSBcCi0gIEdBVFRfREJfTUVNX1NJWkUoRElTX01BWF9OVU1fSU5DX1NWUiwgRElTX01BWF9DSEFSX05VTSwgMCkKLSNlbmRpZgotCi0jZGVmaW5lIHVpbnQ2NF90X1RPX1NUUkVBTShwLCB1NjQpICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHApKysgPSAodWludDhfdCkodTY0KTsgICAgICAgICBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1NjQpID4+IDgpOyAgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTY0KSA+PiAxNik7IFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHU2NCkgPj4gMjQpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1NjQpID4+IDMyKTsgXAotICAgICoocCkrKyA9ICh1aW50OF90KSgodTY0KSA+PiA0MCk7IFwKLSAgICAqKHApKysgPSAodWludDhfdCkoKHU2NCkgPj4gNDgpOyBcCi0gICAgKihwKSsrID0gKHVpbnQ4X3QpKCh1NjQpID4+IDU2KTsgXAotICB9Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBkaXNfYXR0cl91dWlkW0RJU19NQVhfQ0hBUl9OVU1dID0gewotICAgIEdBVFRfVVVJRF9TWVNURU1fSUQsCi0gICAgR0FUVF9VVUlEX01PREVMX05VTUJFUl9TVFIsCi0gICAgR0FUVF9VVUlEX1NFUklBTF9OVU1CRVJfU1RSLAotICAgIEdBVFRfVVVJRF9GV19WRVJTSU9OX1NUUiwKLSAgICBHQVRUX1VVSURfSFdfVkVSU0lPTl9TVFIsCi0gICAgR0FUVF9VVUlEX1NXX1ZFUlNJT05fU1RSLAotICAgIEdBVFRfVVVJRF9NQU5VX05BTUUsCi0gICAgR0FUVF9VVUlEX0lFRUVfREFUQSwKLSAgICBHQVRUX1VVSURfUE5QX0lEfTsKLQotdERJU19DQiBkaXNfY2I7Ci0KLXN0YXRpYyB0RElTX0FUVFJfTUFTSyBkaXNfdXVpZF90b19hdHRyKHVpbnQxNl90IHV1aWQpIHsKLSAgc3dpdGNoICh1dWlkKSB7Ci0gICAgY2FzZSBHQVRUX1VVSURfU1lTVEVNX0lEOgotICAgICAgcmV0dXJuIERJU19BVFRSX1NZU19JRF9CSVQ7Ci0gICAgY2FzZSBHQVRUX1VVSURfTU9ERUxfTlVNQkVSX1NUUjoKLSAgICAgIHJldHVybiBESVNfQVRUUl9NT0RFTF9OVU1fQklUOwotICAgIGNhc2UgR0FUVF9VVUlEX1NFUklBTF9OVU1CRVJfU1RSOgotICAgICAgcmV0dXJuIERJU19BVFRSX1NFUklBTF9OVU1fQklUOwotICAgIGNhc2UgR0FUVF9VVUlEX0ZXX1ZFUlNJT05fU1RSOgotICAgICAgcmV0dXJuIERJU19BVFRSX0ZXX05VTV9CSVQ7Ci0gICAgY2FzZSBHQVRUX1VVSURfSFdfVkVSU0lPTl9TVFI6Ci0gICAgICByZXR1cm4gRElTX0FUVFJfSFdfTlVNX0JJVDsKLSAgICBjYXNlIEdBVFRfVVVJRF9TV19WRVJTSU9OX1NUUjoKLSAgICAgIHJldHVybiBESVNfQVRUUl9TV19OVU1fQklUOwotICAgIGNhc2UgR0FUVF9VVUlEX01BTlVfTkFNRToKLSAgICAgIHJldHVybiBESVNfQVRUUl9NQU5VX05BTUVfQklUOwotICAgIGNhc2UgR0FUVF9VVUlEX0lFRUVfREFUQToKLSAgICAgIHJldHVybiBESVNfQVRUUl9JRUVFX0RBVEFfQklUOwotICAgIGNhc2UgR0FUVF9VVUlEX1BOUF9JRDoKLSAgICAgIHJldHVybiBESVNfQVRUUl9QTlBfSURfQklUOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgZGlzX3ZhbGlkX2hhbmRsZV9yYW5nZQotICoKLSAqICAgdmFsaWRhdGUgYSBoYW5kbGUgdG8gYmUgYSBESVMgYXR0cmlidXRlIGhhbmRsZSBvciBub3QuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBkaXNfdmFsaWRfaGFuZGxlX3JhbmdlKHVpbnQxNl90IGhhbmRsZSkgewotICBpZiAoaGFuZGxlID49IGRpc19jYi5zZXJ2aWNlX2hhbmRsZSAmJiBoYW5kbGUgPD0gZGlzX2NiLm1heF9oYW5kbGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBkaXNfd3JpdGVfYXR0cl92YWx1ZQotICoKLSAqICAgUHJvY2VzcyB3cml0ZSBESVMgYXR0cmlidXRlIHJlcXVlc3QuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDhfdCBkaXNfd3JpdGVfYXR0cl92YWx1ZShVTlVTRURfQVRUUiB0R0FUVF9XUklURV9SRVEqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTKiBwX3N0YXR1cykgewotICAqcF9zdGF0dXMgPSBHQVRUX1dSSVRFX05PVF9QRVJNSVQ7Ci0gIHJldHVybiBTUlZDX0FDVF9SU1A7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBESVMgQXR0cmlidXRlcyBEYXRhYmFzZSBTZXJ2ZXIgUmVxdWVzdCBjYWxsYmFjawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQ4X3QgZGlzX3JlYWRfYXR0cl92YWx1ZShVTlVTRURfQVRUUiB1aW50OF90IGNsY2JfaWR4LCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfVkFMVUUqIHBfdmFsdWUsIGJvb2wgaXNfbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMqIHBfc3RhdHVzKSB7Ci0gIHRESVNfREJfRU5UUlkqIHBfZGJfYXR0ciA9IGRpc19jYi5kaXNfYXR0cjsKLSAgdWludDhfdCAqcCA9IHBfdmFsdWUtPnZhbHVlLCBpLCAqcHA7Ci0gIHVpbnQxNl90IG9mZnNldCA9IHBfdmFsdWUtPm9mZnNldDsKLSAgdWludDhfdCBhY3QgPSBTUlZDX0FDVF9SU1A7Ci0gIHRHQVRUX1NUQVRVUyBzdCA9IEdBVFRfTk9UX0ZPVU5EOwotCi0gIGZvciAoaSA9IDA7IGkgPCBESVNfTUFYX0NIQVJfTlVNOyBpKyssIHBfZGJfYXR0cisrKSB7Ci0gICAgaWYgKGhhbmRsZSA9PSBwX2RiX2F0dHItPmhhbmRsZSkgewotICAgICAgaWYgKChwX2RiX2F0dHItPnV1aWQgPT0gR0FUVF9VVUlEX1BOUF9JRCB8fAotICAgICAgICAgICBwX2RiX2F0dHItPnV1aWQgPT0gR0FUVF9VVUlEX1NZU1RFTV9JRCkgJiYKLSAgICAgICAgICBpc19sb25nKSB7Ci0gICAgICAgIHN0ID0gR0FUVF9OT1RfTE9ORzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBzdCA9IEdBVFRfU1VDQ0VTUzsKLQotICAgICAgc3dpdGNoIChwX2RiX2F0dHItPnV1aWQpIHsKLSAgICAgICAgY2FzZSBHQVRUX1VVSURfTUFOVV9OQU1FOgotICAgICAgICBjYXNlIEdBVFRfVVVJRF9NT0RFTF9OVU1CRVJfU1RSOgotICAgICAgICBjYXNlIEdBVFRfVVVJRF9TRVJJQUxfTlVNQkVSX1NUUjoKLSAgICAgICAgY2FzZSBHQVRUX1VVSURfRldfVkVSU0lPTl9TVFI6Ci0gICAgICAgIGNhc2UgR0FUVF9VVUlEX0hXX1ZFUlNJT05fU1RSOgotICAgICAgICBjYXNlIEdBVFRfVVVJRF9TV19WRVJTSU9OX1NUUjoKLSAgICAgICAgY2FzZSBHQVRUX1VVSURfSUVFRV9EQVRBOgotICAgICAgICAgIHBwID0gZGlzX2NiLmRpc192YWx1ZQotICAgICAgICAgICAgICAgICAgIC5kYXRhX3N0cmluZ1twX2RiX2F0dHItPnV1aWQgLSBHQVRUX1VVSURfTU9ERUxfTlVNQkVSX1NUUl07Ci0gICAgICAgICAgaWYgKHBwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChzdHJsZW4oKGNoYXIqKXBwKSA+IEdBVFRfTUFYX0FUVFJfTEVOKQotICAgICAgICAgICAgICBwX3ZhbHVlLT5sZW4gPSBHQVRUX01BWF9BVFRSX0xFTjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcF92YWx1ZS0+bGVuID0gKHVpbnQxNl90KXN0cmxlbigoY2hhciopcHApOwotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcF92YWx1ZS0+bGVuID0gMDsKLQotICAgICAgICAgIGlmIChvZmZzZXQgPiBwX3ZhbHVlLT5sZW4pIHsKLSAgICAgICAgICAgIHN0ID0gR0FUVF9JTlZBTElEX09GRlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwX3ZhbHVlLT5sZW4gLT0gb2Zmc2V0OwotICAgICAgICAgICAgcHAgKz0gb2Zmc2V0OwotICAgICAgICAgICAgQVJSQVlfVE9fU1RSRUFNKHAsIHBwLCBwX3ZhbHVlLT5sZW4pOwotICAgICAgICAgICAgVkxPRygxKSA8PCAiR0FUVF9VVUlEX01BTlVfTkFNRSBsZW49MHgiIDw8IHN0ZDo6aGV4Ci0gICAgICAgICAgICAgICAgICAgIDw8ICtwX3ZhbHVlLT5sZW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX1NZU1RFTV9JRDoKLSAgICAgICAgICB1aW50NjRfdF9UT19TVFJFQU0ocCwgZGlzX2NiLmRpc192YWx1ZS5zeXN0ZW1faWQpOyAvKiBpbnRfbWluICovCi0gICAgICAgICAgcF92YWx1ZS0+bGVuID0gRElTX1NZU1RFTV9JRF9TSVpFOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0FUVF9VVUlEX1BOUF9JRDoKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgZGlzX2NiLmRpc192YWx1ZS5wbnBfaWQudmVuZG9yX2lkX3NyYyk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBkaXNfY2IuZGlzX3ZhbHVlLnBucF9pZC52ZW5kb3JfaWQpOwotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgZGlzX2NiLmRpc192YWx1ZS5wbnBfaWQucHJvZHVjdF9pZCk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBkaXNfY2IuZGlzX3ZhbHVlLnBucF9pZC5wcm9kdWN0X3ZlcnNpb24pOwotICAgICAgICAgIHBfdmFsdWUtPmxlbiA9IERJU19QTlBfSURfU0laRTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAqcF9zdGF0dXMgPSBzdDsKLSAgcmV0dXJuIGFjdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIGRpc19nYXR0X2NfcmVhZF9kaXNfdmFsdWVfY21wbAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xpZW50IHJlYWQgRElTIGRhdGFiYXNlIGNvbXBsZXRlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkaXNfZ2F0dF9jX3JlYWRfZGlzX3ZhbHVlX2NtcGwodWludDE2X3QgY29ubl9pZCkgewotICB0U1JWQ19DTENCKiBwX2NsY2IgPSBzcnZjX2VuZ19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLQotICBkaXNfY2IuZGlzX3JlYWRfdXVpZF9pZHggPSAweGZmOwotCi0gIHNydmNfZW5nX3JlbGVhc2VfY2hhbm5lbChjb25uX2lkKTsKLQotICBpZiAoZGlzX2NiLnBfcmVhZF9kaXNfY2JhY2sgJiYgcF9jbGNiKSB7Ci0gICAgTE9HX0lORk8oIiVzIGNvbm5faWQ6JWQgYXR0cl9tYXNrID0gMHglMDR4IiwgX19mdW5jX18sIGNvbm5faWQsCi0gICAgICAgICAgICAgcF9jbGNiLT5kaXNfdmFsdWUuYXR0cl9tYXNrKTsKLQotICAgICgqZGlzX2NiLnBfcmVhZF9kaXNfY2JhY2spKHBfY2xjYi0+YmRhLCAmcF9jbGNiLT5kaXNfdmFsdWUpOwotICAgIGRpc19jYi5wX3JlYWRfZGlzX2NiYWNrID0gTlVMTDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZGlzX2dhdHRfY19yZWFkX2Rpc19yZXEKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFJlYWQgcmVtb3RlIGRldmljZSBESVMgYXR0cmlidXRlIHJlcXVlc3QuCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZGlzX2dhdHRfY19yZWFkX2Rpc19yZXEodWludDE2X3QgY29ubl9pZCkgewotICB0R0FUVF9SRUFEX1BBUkFNIHBhcmFtOwotCi0gIG1lbXNldCgmcGFyYW0sIDAsIHNpemVvZih0R0FUVF9SRUFEX1BBUkFNKSk7Ci0KLSAgcGFyYW0uc2VydmljZS5zX2hhbmRsZSA9IDE7Ci0gIHBhcmFtLnNlcnZpY2UuZV9oYW5kbGUgPSAweEZGRkY7Ci0gIHBhcmFtLnNlcnZpY2UuYXV0aF9yZXEgPSAwOwotCi0gIHdoaWxlIChkaXNfY2IuZGlzX3JlYWRfdXVpZF9pZHggPCBESVNfTUFYX0NIQVJfTlVNKSB7Ci0gICAgaWYgKGRpc191dWlkX3RvX2F0dHIoZGlzX2F0dHJfdXVpZFtkaXNfY2IuZGlzX3JlYWRfdXVpZF9pZHhdKSAmCi0gICAgICAgIGRpc19jYi5yZXF1ZXN0X21hc2spIHsKLSAgICAgIHBhcmFtLnNlcnZpY2UudXVpZCA9Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoZGlzX2F0dHJfdXVpZFtkaXNfY2IuZGlzX3JlYWRfdXVpZF9pZHhdKTsKLQotICAgICAgaWYgKEdBVFRDX1JlYWQoY29ubl9pZCwgR0FUVF9SRUFEX0JZX1RZUEUsICZwYXJhbSkgPT0gR0FUVF9TVUNDRVNTKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgTE9HKEVSUk9SKSA8PCAiUmVhZCBESVNJbmZvOiAiIDw8IHBhcmFtLnNlcnZpY2UudXVpZAotICAgICAgICAgICAgICAgICA8PCAiIEdBVFRfUmVhZCBGYWlsZWQiOwotICAgIH0KLQotICAgIGRpc19jYi5kaXNfcmVhZF91dWlkX2lkeCsrOwotICB9Ci0KLSAgZGlzX2dhdHRfY19yZWFkX2Rpc192YWx1ZV9jbXBsKGNvbm5faWQpOwotCi0gIHJldHVybiAoZmFsc2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgZGlzX2NfY21wbF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgQ2xpZW50IG9wZXJhdGlvbiBjb21wbGV0ZSBjYWxsYmFjay4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBkaXNfY19jbXBsX2NiYWNrKHRTUlZDX0NMQ0IqIHBfY2xjYiwgdEdBVFRDX09QVFlQRSBvcCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhKSB7Ci0gIHVpbnQxNl90IHJlYWRfdHlwZSA9IGRpc19hdHRyX3V1aWRbZGlzX2NiLmRpc19yZWFkX3V1aWRfaWR4XTsKLSAgdWludDhfdCAqcHAgPSBOVUxMLCAqcF9zdHI7Ci0gIHVpbnQxNl90IGNvbm5faWQgPSBwX2NsY2ItPmNvbm5faWQ7Ci0KLSAgVkxPRygxKSA8PCBfX2Z1bmNfXwotICAgICAgICAgIDw8IFN0cmluZ1ByaW50Zigib3BfY29kZTogMHglMDJ4ICBzdGF0dXM6IDB4JTAyeCByZWFkX3R5cGU6IDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wLCBzdGF0dXMsIHJlYWRfdHlwZSk7Ci0KLSAgaWYgKG9wICE9IEdBVFRDX09QVFlQRV9SRUFEKSByZXR1cm47Ci0KLSAgaWYgKHBfZGF0YSAhPSBOVUxMICYmIHN0YXR1cyA9PSBHQVRUX1NVQ0NFU1MpIHsKLSAgICBwcCA9IHBfZGF0YS0+YXR0X3ZhbHVlLnZhbHVlOwotCi0gICAgc3dpdGNoIChyZWFkX3R5cGUpIHsKLSAgICAgIGNhc2UgR0FUVF9VVUlEX1NZU1RFTV9JRDoKLSAgICAgICAgVkxPRygxKSA8PCAiRElTX0FUVFJfU1lTX0lEX0JJVCI7Ci0gICAgICAgIGlmIChwX2RhdGEtPmF0dF92YWx1ZS5sZW4gPT0gRElTX1NZU1RFTV9JRF9TSVpFKSB7Ci0gICAgICAgICAgcF9jbGNiLT5kaXNfdmFsdWUuYXR0cl9tYXNrIHw9IERJU19BVFRSX1NZU19JRF9CSVQ7Ci0gICAgICAgICAgLyogc2F2ZSBzeXN0ZW0gSUQqLwotICAgICAgICAgIFNUUkVBTV9UT19VSU5UNjQocF9jbGNiLT5kaXNfdmFsdWUuc3lzdGVtX2lkLCBwcCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9VVUlEX1BOUF9JRDoKLSAgICAgICAgaWYgKHBfZGF0YS0+YXR0X3ZhbHVlLmxlbiA9PSBESVNfUE5QX0lEX1NJWkUpIHsKLSAgICAgICAgICBwX2NsY2ItPmRpc192YWx1ZS5hdHRyX21hc2sgfD0gRElTX0FUVFJfUE5QX0lEX0JJVDsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDgocF9jbGNiLT5kaXNfdmFsdWUucG5wX2lkLnZlbmRvcl9pZF9zcmMsIHBwKTsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHBfY2xjYi0+ZGlzX3ZhbHVlLnBucF9pZC52ZW5kb3JfaWQsIHBwKTsKLSAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KHBfY2xjYi0+ZGlzX3ZhbHVlLnBucF9pZC5wcm9kdWN0X2lkLCBwcCk7Ci0gICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihwX2NsY2ItPmRpc192YWx1ZS5wbnBfaWQucHJvZHVjdF92ZXJzaW9uLCBwcCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgR0FUVF9VVUlEX01PREVMX05VTUJFUl9TVFI6Ci0gICAgICBjYXNlIEdBVFRfVVVJRF9TRVJJQUxfTlVNQkVSX1NUUjoKLSAgICAgIGNhc2UgR0FUVF9VVUlEX0ZXX1ZFUlNJT05fU1RSOgotICAgICAgY2FzZSBHQVRUX1VVSURfSFdfVkVSU0lPTl9TVFI6Ci0gICAgICBjYXNlIEdBVFRfVVVJRF9TV19WRVJTSU9OX1NUUjoKLSAgICAgIGNhc2UgR0FUVF9VVUlEX01BTlVfTkFNRToKLSAgICAgIGNhc2UgR0FUVF9VVUlEX0lFRUVfREFUQToKLSAgICAgICAgcF9zdHIgPSBwX2NsY2ItPmRpc192YWx1ZQotICAgICAgICAgICAgICAgICAgICAuZGF0YV9zdHJpbmdbcmVhZF90eXBlIC0gR0FUVF9VVUlEX01PREVMX05VTUJFUl9TVFJdOwotICAgICAgICBvc2lfZnJlZShwX3N0cik7Ci0gICAgICAgIHBfc3RyID0gKHVpbnQ4X3QqKW9zaV9tYWxsb2MocF9kYXRhLT5hdHRfdmFsdWUubGVuICsgMSk7Ci0gICAgICAgIHBfY2xjYi0+ZGlzX3ZhbHVlLmF0dHJfbWFzayB8PSBkaXNfdXVpZF90b19hdHRyKHJlYWRfdHlwZSk7Ci0gICAgICAgIG1lbWNweShwX3N0ciwgcF9kYXRhLT5hdHRfdmFsdWUudmFsdWUsIHBfZGF0YS0+YXR0X3ZhbHVlLmxlbik7Ci0gICAgICAgIHBfc3RyW3BfZGF0YS0+YXR0X3ZhbHVlLmxlbl0gPSAwOwotICAgICAgICBwX2NsY2ItPmRpc192YWx1ZS5kYXRhX3N0cmluZ1tyZWFkX3R5cGUgLSBHQVRUX1VVSURfTU9ERUxfTlVNQkVSX1NUUl0gPQotICAgICAgICAgICAgcF9zdHI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLQotICAgICAgICBicmVhazsKLSAgICB9IC8qIGVuZCBzd2l0Y2ggKi8KLSAgfSAgIC8qIGVuZCBpZiAqLwotCi0gIGRpc19jYi5kaXNfcmVhZF91dWlkX2lkeCsrOwotCi0gIGRpc19nYXR0X2NfcmVhZF9kaXNfcmVxKGNvbm5faWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgRElTX1NySW5pdAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSB0aGUgRGV2aWNlIEluZm9ybWF0aW9uIFNlcnZpY2UgU2VydmVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10RElTX1NUQVRVUyBESVNfU3JJbml0KHRESVNfQVRUUl9NQVNLIGRpc19hdHRyX21hc2spIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1czsKLQotICBpZiAoZGlzX2NiLmVuYWJsZWQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJESVMgYWxyZWFkeSBpbml0YWxpemVkIjsKLSAgICByZXR1cm4gRElTX1NVQ0NFU1M7Ci0gIH0KLQotICBtZW1zZXQoJmRpc19jYiwgMCwgc2l6ZW9mKHRESVNfQ0IpKTsKLQotICBidGdhdHRfZGJfZWxlbWVudF90IHNlcnZpY2VbRElTX01BWF9BVFRSX05VTV0gPSB7fTsKLQotICBibHVldG9vdGg6OlV1aWQgc3ZjX3V1aWQgPQotICAgICAgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoVVVJRF9TRVJWQ0xBU1NfREVWSUNFX0lORk8pOwotICBzZXJ2aWNlWzBdLnR5cGUgPSBCVEdBVFRfREJfUFJJTUFSWV9TRVJWSUNFOwotICBzZXJ2aWNlWzBdLnV1aWQgPSBzdmNfdXVpZDsKLQotICBmb3IgKGludCBpID0gMDsgZGlzX2F0dHJfbWFzayAhPSAwICYmIGkgPCBESVNfTUFYX0NIQVJfTlVNOyBpKyspIHsKLSAgICBkaXNfY2IuZGlzX2F0dHJbaV0udXVpZCA9IGRpc19hdHRyX3V1aWRbaV07Ci0KLSAgICBibHVldG9vdGg6OlV1aWQgY2hhcl91dWlkID0KLSAgICAgICAgYmx1ZXRvb3RoOjpVdWlkOjpGcm9tMTZCaXQoZGlzX2NiLmRpc19hdHRyW2ldLnV1aWQpOwotICAgIC8qIGluZGV4IDAgaXMgc2VydmljZSwgc28gY2hhcmFjdGVyaXN0aWNzIHN0YXJ0IGZyb20gMSAqLwotICAgIHNlcnZpY2VbaSArIDFdLnR5cGUgPSBCVEdBVFRfREJfQ0hBUkFDVEVSSVNUSUM7Ci0gICAgc2VydmljZVtpICsgMV0udXVpZCA9IGNoYXJfdXVpZDsKLSAgICBzZXJ2aWNlW2kgKyAxXS5wcm9wZXJ0aWVzID0gR0FUVF9DSEFSX1BST1BfQklUX1JFQUQ7Ci0gICAgc2VydmljZVtpICsgMV0ucGVybWlzc2lvbnMgPSBHQVRUX1BFUk1fUkVBRDsKLQotICAgIGRpc19hdHRyX21hc2sgPj49IDE7Ci0gIH0KLQotICAvKiBBZGQgYSBHQVAgc2VydmljZSAqLwotICBzdGF0dXMgPSBHQVRUU19BZGRTZXJ2aWNlKHNydmNfZW5nX2NiLmdhdHRfaWYsIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNlcnZpY2UpIC8gc2l6ZW9mKGJ0Z2F0dF9kYl9lbGVtZW50X3QpKTsKLSAgaWYgKHN0YXR1cyAhPSBHQVRUX1NFUlZJQ0VfU1RBUlRFRCkgewotICAgIExPRyhFUlJPUikgPDwgIkNhbiBub3QgY3JlYXRlIHNlcnZpY2UsIERJU19Jbml0IGZhaWxlZCEiOwotICAgIHJldHVybiBHQVRUX0VSUk9SOwotICB9Ci0KLSAgZGlzX2NiLnNlcnZpY2VfaGFuZGxlID0gc2VydmljZVswXS5hdHRyaWJ1dGVfaGFuZGxlOwotICBkaXNfY2IubWF4X2hhbmRsZSA9IGRpc19jYi5zZXJ2aWNlX2hhbmRsZSArIERJU19NQVhfQVRUUl9OVU07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBESVNfTUFYX0NIQVJfTlVNOyBpKyspIHsKLSAgICBkaXNfY2IuZGlzX2F0dHJbaV0uaGFuZGxlID0gc2VydmljZVtpICsgMV0uYXR0cmlidXRlX2hhbmRsZTsKLQotICAgIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCIlczogIGhhbmRsZSBvZiBuZXcgYXR0cmlidXRlIDB4JTA0eCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGlzX2NiLmRpc19hdHRyW2ldLnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzX2NiLmRpc19hdHRyW2ldLmhhbmRsZSk7Ci0gIH0KLQotICBkaXNfY2IuZW5hYmxlZCA9IHRydWU7Ci0gIHJldHVybiAodERJU19TVEFUVVMpc3RhdHVzOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIERJU19TclVwZGF0ZQotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVXBkYXRlIHRoZSBESVMgc2VydmVyIGF0dHJpYnV0ZSB2YWx1ZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdERJU19TVEFUVVMgRElTX1NyVXBkYXRlKHRESVNfQVRUUl9CSVQgZGlzX2F0dHJfYml0LCB0RElTX0FUVFIqIHBfaW5mbykgewotICB1aW50OF90IGkgPSAxOwotICB0RElTX1NUQVRVUyBzdCA9IERJU19TVUNDRVNTOwotCi0gIGlmIChkaXNfYXR0cl9iaXQgJiBESVNfQVRUUl9TWVNfSURfQklUKSB7Ci0gICAgZGlzX2NiLmRpc192YWx1ZS5zeXN0ZW1faWQgPSBwX2luZm8tPnN5c3RlbV9pZDsKLSAgfSBlbHNlIGlmIChkaXNfYXR0cl9iaXQgJiBESVNfQVRUUl9QTlBfSURfQklUKSB7Ci0gICAgZGlzX2NiLmRpc192YWx1ZS5wbnBfaWQudmVuZG9yX2lkID0gcF9pbmZvLT5wbnBfaWQudmVuZG9yX2lkOwotICAgIGRpc19jYi5kaXNfdmFsdWUucG5wX2lkLnZlbmRvcl9pZF9zcmMgPSBwX2luZm8tPnBucF9pZC52ZW5kb3JfaWRfc3JjOwotICAgIGRpc19jYi5kaXNfdmFsdWUucG5wX2lkLnByb2R1Y3RfaWQgPSBwX2luZm8tPnBucF9pZC5wcm9kdWN0X2lkOwotICAgIGRpc19jYi5kaXNfdmFsdWUucG5wX2lkLnByb2R1Y3RfdmVyc2lvbiA9IHBfaW5mby0+cG5wX2lkLnByb2R1Y3RfdmVyc2lvbjsKLSAgfSBlbHNlIHsKLSAgICBzdCA9IERJU19JTExFR0FMX1BBUkFNOwotCi0gICAgd2hpbGUgKGRpc19hdHRyX2JpdCAmJiBpIDwgKERJU19NQVhfQ0hBUl9OVU0gLSAxKSkgewotICAgICAgaWYgKGRpc19hdHRyX2JpdCAmICh1aW50MTZfdCkoMSA8PCBpKSkgewotICAgICAgICBvc2lfZnJlZShkaXNfY2IuZGlzX3ZhbHVlLmRhdGFfc3RyaW5nW2kgLSAxXSk7Ci0gICAgICAgIGRpc19jYi5kaXNfdmFsdWUuZGF0YV9zdHJpbmdbaSAtIDFdID0KLSAgICAgICAgICAgICh1aW50OF90Kilvc2lfbWFsbG9jKHBfaW5mby0+ZGF0YV9zdHIubGVuICsgMSk7Ci0gICAgICAgIG1lbWNweShkaXNfY2IuZGlzX3ZhbHVlLmRhdGFfc3RyaW5nW2kgLSAxXSwgcF9pbmZvLT5kYXRhX3N0ci5wX2RhdGEsCi0gICAgICAgICAgICAgICBwX2luZm8tPmRhdGFfc3RyLmxlbik7Ci0gICAgICAgIGRpc19jYi5kaXNfdmFsdWUuZGF0YV9zdHJpbmdbaSAtIDFdW3BfaW5mby0+ZGF0YV9zdHIubGVuXSA9Ci0gICAgICAgICAgICAwOyAvKiBtYWtlIHN1cmUgbnVsbCB0ZXJtaW5hdGUgKi8KLSAgICAgICAgc3QgPSBESVNfU1VDQ0VTUzsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0OwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIERJU19SZWFkRElTSW5mbwotICoKLSAqIERlc2NyaXB0aW9uICAgICAgUmVhZCByZW1vdGUgZGV2aWNlIERJUyBpbmZvcm1hdGlvbi4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBESVNfUmVhZERJU0luZm8oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEsIHRESVNfUkVBRF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgIHRESVNfQVRUUl9NQVNLIG1hc2spIHsKLSAgdWludDE2X3QgY29ubl9pZDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBESVMgY2xpZW50IGlmIGl0IGhhc24ndCBiZWVuIGluaXRpYWxpemVkIGFscmVhZHkuICovCi0gIHNydmNfZW5nX2luaXQoKTsKLQotICAvKiBGb3Igbm93IHdlIG9ubHkgaGFuZGxlIG9uZSBhdCBhIHRpbWUgKi8KLSAgaWYgKGRpc19jYi5kaXNfcmVhZF91dWlkX2lkeCAhPSAweGZmKSByZXR1cm4gKGZhbHNlKTsKLQotICBpZiAocF9jYmFjayA9PSBOVUxMKSByZXR1cm4gKGZhbHNlKTsKLQotICBkaXNfY2IucF9yZWFkX2Rpc19jYmFjayA9IHBfY2JhY2s7Ci0gIC8qIE1hcmsgY3VycmVudGx5IGFjdGl2ZSBvcGVyYXRpb24gKi8KLSAgZGlzX2NiLmRpc19yZWFkX3V1aWRfaWR4ID0gMDsKLQotICBkaXNfY2IucmVxdWVzdF9tYXNrID0gbWFzazsKLQotICBWTE9HKDEpIDw8IF9fZnVuY19fIDw8ICIgQkRBOiAiIDw8IHBlZXJfYmRhCi0gICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgY2xfcmVhZF91dWlkOiAweCUwNHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNfYXR0cl91dWlkW2Rpc19jYi5kaXNfcmVhZF91dWlkX2lkeF0pOwotCi0gIEdBVFRfR2V0Q29ubklkSWZDb25uZWN0ZWQoc3J2Y19lbmdfY2IuZ2F0dF9pZiwgcGVlcl9iZGEsICZjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX1RSQU5TUE9SVF9MRSk7Ci0KLSAgLyogbmVlZCB0byBlbmhhbmNlIGl0IGFzIG11bHRpcGxlIHNlcnZpY2UgaXMgbmVlZGVkICovCi0gIHNydmNfZW5nX3JlcXVlc3RfY2hhbm5lbChwZWVyX2JkYSwgU1JWQ19JRF9ESVMpOwotCi0gIGlmIChjb25uX2lkID09IEdBVFRfSU5WQUxJRF9DT05OX0lEKSB7Ci0gICAgcmV0dXJuIEdBVFRfQ29ubmVjdChzcnZjX2VuZ19jYi5nYXR0X2lmLCBwZWVyX2JkYSwgdHJ1ZSwgQlRfVFJBTlNQT1JUX0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0KLSAgcmV0dXJuIGRpc19nYXR0X2NfcmVhZF9kaXNfcmVxKGNvbm5faWQpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svc3J2Yy9zcnZjX2Rpc19pbnQuaCBiL3N0YWNrL3NydmMvc3J2Y19kaXNfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmY2NDkuLjAwMDAwMDAKLS0tIGEvc3RhY2svc3J2Yy9zcnZjX2Rpc19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgU1JWQ19ESVNfSU5UX0gKLSNkZWZpbmUgU1JWQ19ESVNfSU5UX0gKLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImdhdHRfYXBpLmgiCi0jaW5jbHVkZSAic3J2Y19hcGkuaCIKLSNpbmNsdWRlICJzcnZjX2VuZ19pbnQuaCIKLQotI2RlZmluZSBESVNfTUFYX0NIQVJfTlVNIDkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MTZfdCB1dWlkOwotICB1aW50MTZfdCBoYW5kbGU7Ci19IHRESVNfREJfRU5UUlk7Ci0KLSNkZWZpbmUgRElTX1NZU1RFTV9JRF9TSVpFIDgKLSNkZWZpbmUgRElTX1BOUF9JRF9TSVpFIDcKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB0RElTX0RCX0VOVFJZIGRpc19hdHRyW0RJU19NQVhfQ0hBUl9OVU1dOwotICB0RElTX1ZBTFVFIGRpc192YWx1ZTsKLQotICB0RElTX1JFQURfQ0JBQ0sqIHBfcmVhZF9kaXNfY2JhY2s7Ci0KLSAgdWludDE2X3Qgc2VydmljZV9oYW5kbGU7Ci0gIHVpbnQxNl90IG1heF9oYW5kbGU7Ci0KLSAgYm9vbCBlbmFibGVkOwotCi0gIHVpbnQ4X3QgZGlzX3JlYWRfdXVpZF9pZHg7Ci0KLSAgdERJU19BVFRSX01BU0sgcmVxdWVzdF9tYXNrOwotfSB0RElTX0NCOwotCi0vKiBHbG9iYWwgR0FUVCBkYXRhICovCi1leHRlcm4gdERJU19DQiBkaXNfY2I7Ci0KLWV4dGVybiBib29sIGRpc192YWxpZF9oYW5kbGVfcmFuZ2UodWludDE2X3QgaGFuZGxlKTsKLWV4dGVybiB1aW50OF90IGRpc19yZWFkX2F0dHJfdmFsdWUodWludDhfdCBjbGNiX2lkeCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9WQUxVRSogcF92YWx1ZSwgYm9vbCBpc19sb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMqIHBfc3RhdHVzKTsKLWV4dGVybiB1aW50OF90IGRpc193cml0ZV9hdHRyX3ZhbHVlKHRHQVRUX1dSSVRFX1JFUSogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTKiBwX3N0YXR1cyk7Ci0KLWV4dGVybiB2b2lkIGRpc19jX2NtcGxfY2JhY2sodFNSVkNfQ0xDQiogcF9jbGNiLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay9zcnZjL3NydmNfZW5nLmNjIGIvc3RhY2svc3J2Yy9zcnZjX2VuZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkZGI0ZC4uMDAwMDAwMAotLS0gYS9zdGFjay9zcnZjL3NydmNfZW5nLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDE5OTktMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgImdhdHRfYXBpLmgiCi0jaW5jbHVkZSAiZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzcnZjX2Rpc19pbnQuaCIKLSNpbmNsdWRlICJzcnZjX2VuZ19pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotdXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwotc3RhdGljIHZvaWQgc3J2Y19lbmdfc19yZXF1ZXN0X2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSB0eXBlLCB0R0FUVFNfREFUQSogcF9kYXRhKTsKLXN0YXRpYyB2b2lkIHNydmNfZW5nX2Nvbm5lY3RfY2JhY2soVU5VU0VEX0FUVFIgdEdBVFRfSUYgZ2F0dF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCwgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk7Ci1zdGF0aWMgdm9pZCBzcnZjX2VuZ19jX2NtcGxfY2JhY2sodWludDE2X3QgY29ubl9pZCwgdEdBVFRDX09QVFlQRSBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NMX0NPTVBMRVRFKiBwX2RhdGEpOwotCi1zdGF0aWMgdEdBVFRfQ0JBQ0sgc3J2Y19nYXR0X2NiYWNrID0gewotICAgIC5wX2Nvbm5fY2IgPSBzcnZjX2VuZ19jb25uZWN0X2NiYWNrLAotICAgIC5wX2NtcGxfY2IgPSBzcnZjX2VuZ19jX2NtcGxfY2JhY2ssCi0gICAgLnBfZGlzY19yZXNfY2IgPSBudWxscHRyLAotICAgIC5wX2Rpc2NfY21wbF9jYiA9IG51bGxwdHIsCi0gICAgLnBfcmVxX2NiID0gc3J2Y19lbmdfc19yZXF1ZXN0X2NiYWNrLAotICAgIC5wX2VuY19jbXBsX2NiID0gbnVsbHB0ciwKLSAgICAucF9jb25nZXN0aW9uX2NiID0gbnVsbHB0ciwKLSAgICAucF9waHlfdXBkYXRlX2NiID0gbnVsbHB0ciwKLSAgICAucF9jb25uX3VwZGF0ZV9jYiA9IG51bGxwdHIsCi19OwotCi0vKiB0eXBlIGZvciBhY3Rpb24gZnVuY3Rpb25zICovCi10eXBlZGVmIHZvaWQgKCp0U1JWQ19FTkdfQ19DTVBMX0FDVElPTikodFNSVkNfQ0xDQiogcF9jbGNiLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUqIHBfZGF0YSk7Ci0KLXN0YXRpYyBjb25zdCB0U1JWQ19FTkdfQ19DTVBMX0FDVElPTiBzcnZjX2VuZ19jX2NtcGxfYWN0W1NSVkNfSURfTUFYXSA9IHsKLSAgICBkaXNfY19jbXBsX2NiYWNrLAotfTsKLQotdFNSVkNfRU5HX0NCIHNydmNfZW5nX2NiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc3J2Y19lbmdfZmluZF9jbGNiX2J5X2JkX2FkZHIKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBhbGwgTENCcyB3aXRoIG1hY3RoaW5nIGJkIGFkZHJlc3MuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmb3VuZCBsaW5rIGNvbmVuY3Rpb24gY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHRTUlZDX0NMQ0IqIHNydmNfZW5nX2ZpbmRfY2xjYl9ieV9iZF9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICB1aW50OF90IGlfY2xjYjsKLSAgdFNSVkNfQ0xDQiogcF9jbGNiID0gTlVMTDsKLQotICBmb3IgKGlfY2xjYiA9IDAsIHBfY2xjYiA9IHNydmNfZW5nX2NiLmNsY2I7IGlfY2xjYiA8IFNSVkNfTUFYX0FQUFM7Ci0gICAgICAgaV9jbGNiKyssIHBfY2xjYisrKSB7Ci0gICAgaWYgKHBfY2xjYi0+aW5fdXNlICYmIHBfY2xjYi0+Y29ubmVjdGVkICYmIHBfY2xjYi0+YmRhID09IGJkYSkgewotICAgICAgcmV0dXJuIHBfY2xjYjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzcnZjX2VuZ19maW5kX2NsY2JfYnlfY29ubl9pZAotICoKLSAqIERlc2NyaXB0aW9uICAgICAgVGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGFsbCBMQ0JzIHdpdGggbWFjdGhpbmcgY29ubmVjdGlvbiBJRC4KLSAqCi0gKiBSZXR1cm5zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZvdW5kIGxpbmsgY29uZW5jdGlvbiBjb250cm9sIGJsb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10U1JWQ19DTENCKiBzcnZjX2VuZ19maW5kX2NsY2JfYnlfY29ubl9pZCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIHVpbnQ4X3QgaV9jbGNiOwotICB0U1JWQ19DTENCKiBwX2NsY2IgPSBOVUxMOwotCi0gIGZvciAoaV9jbGNiID0gMCwgcF9jbGNiID0gc3J2Y19lbmdfY2IuY2xjYjsgaV9jbGNiIDwgU1JWQ19NQVhfQVBQUzsKLSAgICAgICBpX2NsY2IrKywgcF9jbGNiKyspIHsKLSAgICBpZiAocF9jbGNiLT5pbl91c2UgJiYgcF9jbGNiLT5jb25uZWN0ZWQgJiYgcF9jbGNiLT5jb25uX2lkID09IGNvbm5faWQpIHsKLSAgICAgIHJldHVybiBwX2NsY2I7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc3J2Y19lbmdfZmluZF9jbGNiX2J5X2Nvbm5faWQKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIFRoZSBmdW5jdGlvbiBzZWFyY2hlcyBhbGwgTENCcyB3aXRoIG1hY3RoaW5nIGNvbm5lY3Rpb24gSUQuCi0gKgotICogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmb3VuZCBsaW5rIGNvbmVuY3Rpb24gY29udHJvbCBibG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVpbnQ4X3Qgc3J2Y19lbmdfZmluZF9jbGNiX2lkeF9ieV9jb25uX2lkKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgdWludDhfdCBpX2NsY2I7Ci0gIHRTUlZDX0NMQ0IqIHBfY2xjYiA9IE5VTEw7Ci0KLSAgZm9yIChpX2NsY2IgPSAwLCBwX2NsY2IgPSBzcnZjX2VuZ19jYi5jbGNiOyBpX2NsY2IgPCBTUlZDX01BWF9BUFBTOwotICAgICAgIGlfY2xjYisrLCBwX2NsY2IrKykgewotICAgIGlmIChwX2NsY2ItPmluX3VzZSAmJiBwX2NsY2ItPmNvbm5lY3RlZCAmJiBwX2NsY2ItPmNvbm5faWQgPT0gY29ubl9pZCkgewotICAgICAgcmV0dXJuIGlfY2xjYjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gU1JWQ19NQVhfQVBQUzsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzcnZjX2VuZ19jbGNiX2FsbG9jCi0gKgotICogRGVzY3JpcHRpb24gICAgICBBbGxvY2F0ZSBhIEdBVFQgcHJvZmlsZSBjb25uZWN0aW9uIGxpbmsgY29udHJvbCBibG9jawotICoKLSAqIFJldHVybnMgICAgICAgICAgTlVMTCBpZiBub3QgZm91bmQuIE90aGVyd2lzZSBwb2ludGVyIHRvIHRoZSBjb25uZWN0aW9uIGxpbmsKLSAqICAgICAgICAgICAgICAgICAgYmxvY2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB0U1JWQ19DTENCKiBzcnZjX2VuZ19jbGNiX2FsbG9jKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgdWludDhfdCBpX2NsY2IgPSAwOwotICB0U1JWQ19DTENCKiBwX2NsY2IgPSBOVUxMOwotCi0gIGZvciAoaV9jbGNiID0gMCwgcF9jbGNiID0gc3J2Y19lbmdfY2IuY2xjYjsgaV9jbGNiIDwgU1JWQ19NQVhfQVBQUzsKLSAgICAgICBpX2NsY2IrKywgcF9jbGNiKyspIHsKLSAgICBpZiAoIXBfY2xjYi0+aW5fdXNlKSB7Ci0gICAgICBwX2NsY2ItPmluX3VzZSA9IHRydWU7Ci0gICAgICBwX2NsY2ItPmNvbm5faWQgPSBjb25uX2lkOwotICAgICAgcF9jbGNiLT5jb25uZWN0ZWQgPSB0cnVlOwotICAgICAgcF9jbGNiLT5iZGEgPSBiZGE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBfY2xjYjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzcnZjX2VuZ19jbGNiX2RlYWxsb2MKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIERlLWFsbG9jYXRlIGEgR0FUVCBwcm9maWxlIGNvbm5lY3Rpb24gbGluayBjb250cm9sIGJsb2NrCi0gKgotICogUmV0dXJucyAgICAgICAgICBUcnVlIHRoZSBkZWFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYm9vbCBzcnZjX2VuZ19jbGNiX2RlYWxsb2ModWludDE2X3QgY29ubl9pZCkgewotICB1aW50OF90IGlfY2xjYiA9IDA7Ci0gIHRTUlZDX0NMQ0IqIHBfY2xjYiA9IE5VTEw7Ci0KLSAgZm9yIChpX2NsY2IgPSAwLCBwX2NsY2IgPSBzcnZjX2VuZ19jYi5jbGNiOyBpX2NsY2IgPCBTUlZDX01BWF9BUFBTOwotICAgICAgIGlfY2xjYisrLCBwX2NsY2IrKykgewotICAgIGlmIChwX2NsY2ItPmluX3VzZSAmJiBwX2NsY2ItPmNvbm5lY3RlZCAmJiAocF9jbGNiLT5jb25uX2lkID09IGNvbm5faWQpKSB7Ci0gICAgICB1bnNpZ25lZCBqOwotICAgICAgZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUocF9jbGNiLT5kaXNfdmFsdWUuZGF0YV9zdHJpbmcpOyBqKyspCi0gICAgICAgIG9zaV9mcmVlKHBfY2xjYi0+ZGlzX3ZhbHVlLmRhdGFfc3RyaW5nW2pdKTsKLQotICAgICAgbWVtc2V0KHBfY2xjYiwgMCwgc2l6ZW9mKHRTUlZDX0NMQ0IpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBTZXJ2aWNlIEVuZ2luZSBTZXJ2ZXIgQXR0cmlidXRlcyBEYXRhYmFzZSBSZWFkL1JlYWQgQmxvYiBSZXF1ZXN0IHByb2Nlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWludDhfdCBzcnZjX2VuZ19wcm9jZXNzX3JlYWRfcmVxKHVpbnQ4X3QgY2xjYl9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1JFQURfUkVRKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SU1AqIHBfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMqIHBfc3RhdHVzKSB7Ci0gIHRHQVRUX1NUQVRVUyBzdGF0dXMgPSBHQVRUX05PVF9GT1VORDsKLSAgdWludDhfdCBhY3QgPSBTUlZDX0FDVF9SU1A7Ci0KLSAgaWYgKHBfZGF0YS0+aXNfbG9uZykgcF9yc3AtPmF0dHJfdmFsdWUub2Zmc2V0ID0gcF9kYXRhLT5vZmZzZXQ7Ci0KLSAgcF9yc3AtPmF0dHJfdmFsdWUuaGFuZGxlID0gcF9kYXRhLT5oYW5kbGU7Ci0KLSAgaWYgKGRpc192YWxpZF9oYW5kbGVfcmFuZ2UocF9kYXRhLT5oYW5kbGUpKQotICAgIGFjdCA9IGRpc19yZWFkX2F0dHJfdmFsdWUoY2xjYl9pZHgsIHBfZGF0YS0+aGFuZGxlLCAmcF9yc3AtPmF0dHJfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEtPmlzX2xvbmcsIHBfc3RhdHVzKTsKLSAgZWxzZQotICAgICpwX3N0YXR1cyA9IHN0YXR1czsKLSAgcmV0dXJuIGFjdDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgIFNlcnZpY2UgRW5naW5lIFNlcnZlciBBdHRyaWJ1dGVzIERhdGFiYXNlIHdyaXRlIFJlcXVlc3QgcHJvY2VzcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1aW50OF90IHNydmNfZW5nX3Byb2Nlc3Nfd3JpdGVfcmVxKHVpbnQ4X3QgY2xjYl9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9SRVEqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRHQVRUU19SU1AqIHBfcnNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTKiBwX3N0YXR1cykgewotICB1aW50OF90IGFjdCA9IFNSVkNfQUNUX1JTUDsKLQotICBpZiAoZGlzX3ZhbGlkX2hhbmRsZV9yYW5nZShwX2RhdGEtPmhhbmRsZSkpIHsKLSAgICBhY3QgPSBkaXNfd3JpdGVfYXR0cl92YWx1ZShwX2RhdGEsIHBfc3RhdHVzKTsKLSAgfSBlbHNlCi0gICAgKnBfc3RhdHVzID0gR0FUVF9OT1RfRk9VTkQ7Ci0KLSAgcmV0dXJuIGFjdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNydmNfZW5nX3NfcmVxdWVzdF9jYmFjawotICoKLSAqIERlc2NyaXB0aW9uICAgICAgR0FUVCBESVMgYXR0cmlidXRlIGFjY2VzcyByZXF1ZXN0IGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc3J2Y19lbmdfc19yZXF1ZXN0X2NiYWNrKHVpbnQxNl90IGNvbm5faWQsIHVpbnQzMl90IHRyYW5zX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19SRVFfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUU19EQVRBKiBwX2RhdGEpIHsKLSAgdEdBVFRfU1RBVFVTIHN0YXR1cyA9IEdBVFRfSU5WQUxJRF9QRFU7Ci0gIHRHQVRUU19SU1AgcnNwX21zZzsKLSAgdWludDhfdCBhY3QgPSBTUlZDX0FDVF9JR05PUkU7Ci0gIHVpbnQ4X3QgY2xjYl9pZHggPSBzcnZjX2VuZ19maW5kX2NsY2JfaWR4X2J5X2Nvbm5faWQoY29ubl9pZCk7Ci0KLSAgVkxPRygxKSA8PCBTdHJpbmdQcmludGYoInNydmNfZW5nX3NfcmVxdWVzdF9jYmFjayA6IHJlY3YgdHlwZSAoMHglMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwotCi0gIG1lbXNldCgmcnNwX21zZywgMCwgc2l6ZW9mKHRHQVRUU19SU1ApKTsKLQotICBzcnZjX2VuZ19jYi5jbGNiW2NsY2JfaWR4XS50cmFuc19pZCA9IHRyYW5zX2lkOwotCi0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0FUVFNfUkVRX1RZUEVfUkVBRF9DSEFSQUNURVJJU1RJQzoKLSAgICBjYXNlIEdBVFRTX1JFUV9UWVBFX1JFQURfREVTQ1JJUFRPUjoKLSAgICAgIGFjdCA9IHNydmNfZW5nX3Byb2Nlc3NfcmVhZF9yZXEoY2xjYl9pZHgsICZwX2RhdGEtPnJlYWRfcmVxLCAmcnNwX21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR0FUVFNfUkVRX1RZUEVfV1JJVEVfQ0hBUkFDVEVSSVNUSUM6Ci0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9XUklURV9ERVNDUklQVE9SOgotICAgICAgYWN0ID0gc3J2Y19lbmdfcHJvY2Vzc193cml0ZV9yZXEoY2xjYl9pZHgsICZwX2RhdGEtPndyaXRlX3JlcSwgJnJzcF9tc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICAgIGlmICghcF9kYXRhLT53cml0ZV9yZXEubmVlZF9yc3ApIGFjdCA9IFNSVkNfQUNUX0lHTk9SRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9XUklURV9FWEVDOgotICAgICAgVkxPRygxKSA8PCAiSWdub3JlIEdBVFRfUkVRX0VYRUNfV1JJVEUvV1JJVEVfQ01EIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHQVRUU19SRVFfVFlQRV9NVFU6Ci0gICAgICBWTE9HKDEpIDw8ICJHZXQgTVRVIGV4Y2hhbmdlIG5ldyBtdHUgc2l6ZTogIiA8PCBwX2RhdGEtPm10dTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIFZMT0coMSkgPDwgU3RyaW5nUHJpbnRmKCJVbmtub3duL3VuZXhwZWN0ZWQgTEUgR0FQIEFUVCByZXF1ZXN0OiAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHNydmNfZW5nX2NiLmNsY2JbY2xjYl9pZHhdLnRyYW5zX2lkID0gMDsKLQotICBpZiAoYWN0ID09IFNSVkNfQUNUX1JTUCkgR0FUVFNfU2VuZFJzcChjb25uX2lkLCB0cmFuc19pZCwgc3RhdHVzLCAmcnNwX21zZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzcnZjX2VuZ19jX2NtcGxfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIENsaWVudCBvcGVyYXRpb24gY29tcGxldGUgY2FsbGJhY2suCi0gKgotICogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNydmNfZW5nX2NfY21wbF9jYmFjayh1aW50MTZfdCBjb25uX2lkLCB0R0FUVENfT1BUWVBFIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUqIHBfZGF0YSkgewotICB0U1JWQ19DTENCKiBwX2NsY2IgPSBzcnZjX2VuZ19maW5kX2NsY2JfYnlfY29ubl9pZChjb25uX2lkKTsKLQotICBWTE9HKDEpIDw8IFN0cmluZ1ByaW50ZigKLSAgICAgICJzcnZjX2VuZ19jX2NtcGxfY2JhY2soKSAtIG9wX2NvZGU6IDB4JTAyeCAgc3RhdHVzOiAweCUwMnggIiwgb3AsIHN0YXR1cyk7Ci0KLSAgaWYgKHBfY2xjYiA9PSBOVUxMKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiIHJlY2VpdmVkIGZvciB1bmtub3duIGNvbm5lY3Rpb24iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwX2NsY2ItPmN1cl9zcnZjX2lkICE9IFNSVkNfSURfTk9ORSAmJiBwX2NsY2ItPmN1cl9zcnZjX2lkIDw9IFNSVkNfSURfTUFYKQotICAgIHNydmNfZW5nX2NfY21wbF9hY3RbcF9jbGNiLT5jdXJfc3J2Y19pZCAtIDFdKHBfY2xjYiwgb3AsIHN0YXR1cywgcF9kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbiAgICAgICAgIHNydmNfZW5nX2Nvbm5lY3RfY2JhY2sKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgIEdhdHQgcHJvZmlsZSBjb25uZWN0aW9uIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzcnZjX2VuZ19jb25uZWN0X2NiYWNrKFVOVVNFRF9BVFRSIHRHQVRUX0lGIGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25uZWN0ZWQsIHRHQVRUX0RJU0NPTk5fUkVBU09OIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgVkxPRygxKSA8PCBfX2Z1bmNfXyA8PCAiOiBmcm9tICIgPDwgYmRhCi0gICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIgY29ubmVjdGVkOiVkIGNvbm5faWQ9JWQiLCBjb25uZWN0ZWQsIGNvbm5faWQpOwotCi0gIGlmIChjb25uZWN0ZWQpIHsKLSAgICBpZiAoc3J2Y19lbmdfY2xjYl9hbGxvYyhjb25uX2lkLCBiZGEpID09IE5VTEwpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgInNydmNfZW5nX2Nvbm5lY3RfY2JhY2s6IG5vX3Jlc291cmNlIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3J2Y19lbmdfY2xjYl9kZWFsbG9jKGNvbm5faWQpOwotICB9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc3J2Y19lbmdfY19jbXBsX2NiYWNrCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbGllbnQgb3BlcmF0aW9uIGNvbXBsZXRlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIHNydmNfZW5nX3JlcXVlc3RfY2hhbm5lbChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB1aW50OF90IHNydmNfaWQpIHsKLSAgYm9vbCBzZXQgPSB0cnVlOwotICB0U1JWQ19DTENCKiBwX2NsY2IgPSBzcnZjX2VuZ19maW5kX2NsY2JfYnlfYmRfYWRkcihyZW1vdGVfYmRhKTsKLQotICBpZiAocF9jbGNiID09IE5VTEwpIHBfY2xjYiA9IHNydmNfZW5nX2NsY2JfYWxsb2MoMCwgcmVtb3RlX2JkYSk7Ci0KLSAgaWYgKHBfY2xjYiAmJiBwX2NsY2ItPmN1cl9zcnZjX2lkID09IFNSVkNfSURfTk9ORSkKLSAgICBwX2NsY2ItPmN1cl9zcnZjX2lkID0gc3J2Y19pZDsKLSAgZWxzZQotICAgIHNldCA9IGZhbHNlOwotCi0gIHJldHVybiBzZXQ7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICAgc3J2Y19lbmdfcmVsZWFzZV9jaGFubmVsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDbGllbnQgb3BlcmF0aW9uIGNvbXBsZXRlIGNhbGxiYWNrLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNydmNfZW5nX3JlbGVhc2VfY2hhbm5lbCh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIHRTUlZDX0NMQ0IqIHBfY2xjYiA9IHNydmNfZW5nX2ZpbmRfY2xjYl9ieV9jb25uX2lkKGNvbm5faWQpOwotCi0gIGlmIChwX2NsY2IgPT0gTlVMTCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogaW52YWxpZCBjb25uZWN0aW9uIGlkICIgPDwgY29ubl9pZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwX2NsY2ItPmN1cl9zcnZjX2lkID0gU1JWQ19JRF9OT05FOwotCi0gIC8qIGNoZWNrIHBlbmRpbmcgcmVxdWVzdCAqLwotICBHQVRUX0Rpc2Nvbm5lY3QocF9jbGNiLT5jb25uX2lkKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBzcnZjX2VuZ19pbml0Ci0gKgotICogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXphIHRoZSBHQVRUIFNlcnZpY2UgZW5naW5lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10R0FUVF9TVEFUVVMgc3J2Y19lbmdfaW5pdCh2b2lkKSB7Ci0KLSAgaWYgKHNydmNfZW5nX2NiLmVuYWJsZWQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJESVMgYWxyZWFkeSBpbml0YWxpemVkIjsKLSAgfSBlbHNlIHsKLSAgICBtZW1zZXQoJnNydmNfZW5nX2NiLCAwLCBzaXplb2YodFNSVkNfRU5HX0NCKSk7Ci0KLSAgICAvKiBDcmVhdGUgYSBHQVRUIHByb2ZpbGUgc2VydmljZSAqLwotICAgIGJsdWV0b290aDo6VXVpZCBhcHBfdXVpZCA9Ci0gICAgICAgIGJsdWV0b290aDo6VXVpZDo6RnJvbTE2Qml0KFVVSURfU0VSVkNMQVNTX0RFVklDRV9JTkZPKTsKLSAgICBzcnZjX2VuZ19jYi5nYXR0X2lmID0KLSAgICAgICAgR0FUVF9SZWdpc3RlcihhcHBfdXVpZCwgIkdhdHRTZXJ2aWNlRW5naW5lIiwgJnNydmNfZ2F0dF9jYmFjaywgZmFsc2UpOwotICAgIEdBVFRfU3RhcnRJZihzcnZjX2VuZ19jYi5nYXR0X2lmKTsKLQotICAgIFZMT0coMSkgPDwgIlNydmNfSW5pdDogIGdhdHRfaWY9IiA8PCArc3J2Y19lbmdfY2IuZ2F0dF9pZjsKLQotICAgIHNydmNfZW5nX2NiLmVuYWJsZWQgPSB0cnVlOwotICAgIGRpc19jYi5kaXNfcmVhZF91dWlkX2lkeCA9IDB4ZmY7Ci0gIH0KLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3NydmMvc3J2Y19lbmdfaW50LmggYi9zdGFjay9zcnZjL3NydmNfZW5nX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGNjNzllLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3NydmMvc3J2Y19lbmdfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAxOTk5LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFNSVkNfRU5HX0lOVF9ICi0jZGVmaW5lIFNSVkNfRU5HX0lOVF9ICi0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJnYXR0X2FwaS5oIgotI2luY2x1ZGUgInNydmNfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBTUlZDX01BWF9BUFBTIEdBVFRfQ0xfTUFYX0xDQgotCi0jZGVmaW5lIFNSVkNfSURfTk9ORSAwCi0jZGVmaW5lIFNSVkNfSURfRElTIDEKLSNkZWZpbmUgU1JWQ19JRF9NQVggU1JWQ19JRF9ESVMKLQotI2RlZmluZSBTUlZDX0FDVF9JR05PUkUgMAotI2RlZmluZSBTUlZDX0FDVF9SU1AgMQotI2RlZmluZSBTUlZDX0FDVF9QRU5ESU5HIDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBib29sIGluX3VzZTsKLSAgdWludDE2X3QgY29ubl9pZDsKLSAgYm9vbCBjb25uZWN0ZWQ7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICB1aW50MzJfdCB0cmFuc19pZDsKLSAgdWludDhfdCBjdXJfc3J2Y19pZDsKLQotICB0RElTX1ZBTFVFIGRpc192YWx1ZTsKLQotfSB0U1JWQ19DTENCOwotCi0vKiBzZXJ2aWNlIGVuZ2luZSBjb250cm9sIGJsb2NrICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRTUlZDX0NMQ0IgY2xjYltTUlZDX01BWF9BUFBTXTsgLyogY29ubmVjdGlvbiBsaW5rKi8KLSAgdEdBVFRfSUYgZ2F0dF9pZjsKLSAgYm9vbCBlbmFibGVkOwotCi19IHRTUlZDX0VOR19DQjsKLQotLyogR2xvYmFsIEdBVFQgZGF0YSAqLwotZXh0ZXJuIHRTUlZDX0VOR19DQiBzcnZjX2VuZ19jYjsKLQotZXh0ZXJuIHRTUlZDX0NMQ0IqIHNydmNfZW5nX2ZpbmRfY2xjYl9ieV9jb25uX2lkKHVpbnQxNl90IGNvbm5faWQpOwotCi1leHRlcm4gdm9pZCBzcnZjX2VuZ19yZWxlYXNlX2NoYW5uZWwodWludDE2X3QgY29ubl9pZCk7Ci1leHRlcm4gYm9vbCBzcnZjX2VuZ19yZXF1ZXN0X2NoYW5uZWwoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNydmNfaWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2EyZHAvYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyX3Rlc3QuY2MgYi9zdGFjay90ZXN0L2EyZHAvYTJkcF92ZW5kb3JfbGRhY19kZWNvZGVyX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDEzYmEuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9hMmRwL2EyZHBfdmVuZG9yX2xkYWNfZGVjb2Rlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvdGVzdC9BbGxvY2F0aW9uVGVzdEhhcm5lc3MuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbGRhY0JUX2Jjb19mb3JfZmx1b3JpZGUuaCIKLSN1bmRlZiBMT0dfVEFHCi0jaW5jbHVkZSAic3RhY2svYTJkcC9hMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXIuY2MiCi0KLWV4dGVybiB2b2lkIGFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQodm9pZCk7Ci1uYW1lc3BhY2UgewotCi11aW50OF90KiBEYXRhKEJUX0hEUiogcGFja2V0KSB7IHJldHVybiBwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPm9mZnNldDsgfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLyoqCi0gKiBUZXN0IGNsYXNzIHRvIHRlc3Qgc2VsZWN0ZWQgZnVuY3Rpb25hbGl0eSBpbiBzdGFjay9hMmRwCi0gKi8KLWNsYXNzIEEyZHBTdGFja1Rlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgQWxsb2NhdGlvblRlc3RIYXJuZXNzOjpTZXRVcCgpOwotICAgIC8vIERpc2FibGUgb3VyIGFsbG9jYXRpb24gdHJhY2tlciB0byBhbGxvdyBBU0FOIGZ1bGwgcmFuZ2UKLSAgICBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7IH0KLQotICBCVF9IRFIqIEFsbG9jYXRlTDJjYXBQYWNrZXQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSkgY29uc3QgewotICAgIGF1dG8gcGFja2V0ID0gQWxsb2NhdGVQYWNrZXQoZGF0YS5zaXplKCkpOwotICAgIHN0ZDo6Y29weShkYXRhLmNiZWdpbigpLCBkYXRhLmNlbmQoKSwgRGF0YShwYWNrZXQpKTsKLSAgICByZXR1cm4gcGFja2V0OwotICB9Ci0KLSBwcml2YXRlOgotICBCVF9IRFIqIEFsbG9jYXRlUGFja2V0KHNpemVfdCBwYWNrZXRfbGVuZ3RoKSBjb25zdCB7Ci0gICAgQlRfSERSKiBwYWNrZXQgPQotICAgICAgICBzdGF0aWNfY2FzdDxCVF9IRFIqPihvc2lfY2FsbG9jKHNpemVvZihCVF9IRFIpICsgcGFja2V0X2xlbmd0aCkpOwotICAgIHBhY2tldC0+bGVuID0gcGFja2V0X2xlbmd0aDsKLSAgICByZXR1cm4gcGFja2V0OwotICB9Ci19OwotCi1URVNUX0YoQTJkcFN0YWNrVGVzdCwgRGVjb2RlUGFja2V0X1plcm9MZW5ndGgpIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTsKLSAgQlRfSERSKiBwX2J1ZiA9IEFsbG9jYXRlTDJjYXBQYWNrZXQoZGF0YSk7Ci0gIENIRUNLKCFhMmRwX3ZlbmRvcl9sZGFjX2RlY29kZXJfZGVjb2RlX3BhY2tldChwX2J1ZikpOwotICBvc2lfZnJlZShwX2J1Zik7Ci19CmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2EyZHAvbWlzY19mYWtlLmNjIGIvc3RhY2svdGVzdC9hMmRwL21pc2NfZmFrZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwNjIxOC4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2EyZHAvbWlzY19mYWtlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNlcnZpY2UvY29tbW9uL2JsdWV0b290aC9hMmRwX2NvZGVjX2NvbmZpZy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYTJkcF92ZW5kb3JfbGRhYy5oIgotCi1ibHVldG9vdGg6OkEyZHBDb2RlY0NvbmZpZyogYnRhX2F2X2dldF9hMmRwX2N1cnJlbnRfY29kZWModm9pZCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotaW50IEEyRFBfVmVuZG9yR2V0VHJhY2tTYW1wbGVSYXRlTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsgcmV0dXJuIDA7IH0KLWludCBBMkRQX1ZlbmRvckdldFRyYWNrQml0c1BlclNhbXBsZUxkYWMoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIHJldHVybiAwOwotfQotaW50IEEyRFBfVmVuZG9yR2V0Q2hhbm5lbE1vZGVDb2RlTGRhYyhjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvYWRfcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3RhY2svdGVzdC9hZF9wYXJzZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2M3ZjIuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9hZF9wYXJzZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSAiYWR2ZXJ0aXNlX2RhdGFfcGFyc2VyLmgiCi0KLVRFU1QoQWR2ZXJ0aXNlRGF0YVBhcnNlclRlc3QsIElzVmFsaWRFbXB0eSkgewotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMDsKLSAgRVhQRUNUX1RSVUUoQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChkYXRhMCkpOwotCi0gIC8vIFNpbmdsZSBlbXB0eSBmaWVsZCBhbGxvd2VkICh0cmVhdGVkIGFzIHplcm8gcGFkZGluZykuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGExezB4MDB9OwotICBFWFBFQ1RfVFJVRShBZHZlcnRpc2VEYXRhUGFyc2VyOjpJc1ZhbGlkKGRhdGExKSk7Ci19Ci0KLVRFU1QoQWR2ZXJ0aXNlRGF0YVBhcnNlclRlc3QsIElzVmFsaWRCYWQpIHsKLSAgLy8gU2luZ2xlIGZpZWxkLCBmaWVsZCBlbXB0eS4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTB7MHgwMX07Ci0gIEVYUEVDVF9GQUxTRShBZHZlcnRpc2VEYXRhUGFyc2VyOjpJc1ZhbGlkKGRhdGEwKSk7Ci0KLSAgLy8gU2luZ2xlIGZpZWxkLCBmaXJzdCBmaWVsZCBsZW5ndGggdG9vIGxvbmcuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGExezB4MDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDB9OwotICBFWFBFQ1RfRkFMU0UoQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChkYXRhMSkpOwotCi0gIC8vIFR3byBmaWVsZHMsIHNlY29uZCBmaWVsZCBsZW5ndGggdG9vIGxvbmcuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEyezB4MDIsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDB9OwotICBFWFBFQ1RfRkFMU0UoQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChkYXRhMikpOwotCi0gIC8vIFR3byBmaWVsZHMsIHNlY29uZCBmaWVsZCBlbXB0eS4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTN7MHgwMiwgMHgwMiwgMHgwMCwgMHgwMX07Ci0gIEVYUEVDVF9GQUxTRShBZHZlcnRpc2VEYXRhUGFyc2VyOjpJc1ZhbGlkKGRhdGEzKSk7Ci0KLSAgLy8gTm9uLXplcm8gcGFkZGluZyBhdCBlbmQgb2YgcGFja2V0LgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhNHsweDAzLCAweDAyLCAweDAxLCAweDAyLCAweDAyLCAweDAzLCAweDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweEJBLCAweEJBLCAweDAwLCAweDAwfTsKLSAgRVhQRUNUX0ZBTFNFKEFkdmVydGlzZURhdGFQYXJzZXI6OklzVmFsaWQoZGF0YTEpKTsKLQotICAvLyBOb24temVybyBwYWRkaW5nIGF0IGVuZCBvZiBwYWNrZXQuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE1ezB4MDMsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsIDB4MDEsIDB4MDAsIDB4QkF9OwotICBFWFBFQ1RfRkFMU0UoQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChkYXRhMSkpOwotfQotCi1URVNUKEFkdmVydGlzZURhdGFQYXJzZXJUZXN0LCBJc1ZhbGlkR29vZCkgewotICAvLyBTaW5nbGUgZmllbGQuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEwezB4MDMsIDB4MDIsIDB4MDEsIDB4MDJ9OwotICBFWFBFQ1RfVFJVRShBZHZlcnRpc2VEYXRhUGFyc2VyOjpJc1ZhbGlkKGRhdGEwKSk7Ci0KLSAgLy8gVHdvIGZpZWxkcy4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTF7MHgwMywgMHgwMiwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMywgMHgwMX07Ci0gIEVYUEVDVF9UUlVFKEFkdmVydGlzZURhdGFQYXJzZXI6OklzVmFsaWQoZGF0YTEpKTsKLQotICAvLyBaZXJvIHBhZGRpbmcgYXQgZW5kIG9mIHBhY2tldC4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTJ7MHgwMywgMHgwMiwgMHgwMSwgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiwgMHgwMywgMHgwMSwgMHgwMH07Ci0gIEVYUEVDVF9UUlVFKEFkdmVydGlzZURhdGFQYXJzZXI6OklzVmFsaWQoZGF0YTIpKTsKLQotICAvLyB6ZXJvIHBhZGRpbmcgYXQgZW5kIG9mIHBhY2tldCwgc2FtcGxlIGRhdGEgZnJvbSByZWFsIGRldmljZQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhM3sKLSAgICAgIDB4MTAsIDB4MDk2LCAweDg1LCAweDQ0LCAweDMyLCAweDA0LCAweDc0LCAweDMyLCAweDAzLCAweDEzLCAweDkzLAotICAgICAgMHhhLCAgMHgzMiwgIDB4MzksIDB4M2EsIDB4NjUsIDB4MzIsIDB4MDUsIDB4MTIsIDB4NTAsIDB4MDAsIDB4NTAsCi0gICAgICAweDAwLCAweDAyLCAgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIEVYUEVDVF9UUlVFKEFkdmVydGlzZURhdGFQYXJzZXI6OklzVmFsaWQoZGF0YTMpKTsKLQotICAvLyBUZXN0IFF1aXJrIGZvciBUcmF4eGFzIChiYWQgbmFtZSBsZW5ndGgsIHNob3VsZCBiZSAweDExIGlzIDB4MTQpCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE0ezB4MTQsIDB4MDksIDB4NTQsIDB4NTIsIDB4NTgsIDB4MjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIsIDB4NEMsIDB4NDUsIDB4MDUsIDB4MTIsIDB4NjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4RTgsIDB4MDMsIDB4MDIsIDB4MEEsIDB4MDB9OwotICBFWFBFQ1RfVFJVRShBZHZlcnRpc2VEYXRhUGFyc2VyOjpJc1ZhbGlkKGRhdGE0KSk7Ci0KLSAgLy8gVGVzdCBRdWlyayBmb3IgVHJheHhhcyAoYmFkIG5hbWUgbGVuZ3RoLCBzaG91bGQgYmUgMHgxMSBpcyAweDE0KQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhNXsweDE0LCAweDA5LCAweDU0LCAweDUxLCAweDY5LCAweDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyLCAweDRDLCAweDQ1LCAweDA1LCAweDEyLCAweDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweEU4LCAweDAzLCAweDAyLCAweDBBLCAweDAwfTsKLSAgRVhQRUNUX1RSVUUoQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChkYXRhNSkpOwotCi0gIC8vIFRlc3QgUXVpcmsgZm9yIFRyYXh4YXMgKGJhZCBuYW1lIGxlbmd0aCwgc2hvdWxkIGJlIDB4MTEgaXMgMHgxNCkKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTZ7MHgxNCwgMHgwOSwgMHg1NCwgMHg1MSwgMHg2OSwgMHgyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MiwgMHg0QywgMHg0NSwgMHgwNSwgMHgxMiwgMHg2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHhFOCwgMHgwMywgMHgwMiwgMHgwQSwgMHgwMH07Ci0gIEVYUEVDVF9UUlVFKEFkdmVydGlzZURhdGFQYXJzZXI6OklzVmFsaWQoZGF0YTYpKTsKLQotICAvLyBUZXN0IFF1aXJrIGZvciBUcmF4eGFzIChiYWQgbGVuZ3RoLCBzaG91bGQgYmUgMHgxMSBpcyAweDE0KQotICAvLyBzY2FuIHJlc3BvbnNlIGdsdWVkIGFmdGVyIGFkdmVydGlzZSBkYXRhCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE3ewotICAgICAgMHgwMiwgMHgwMSwgMHgwNiwgMHgxMSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgIDB4MDAsIDB4NjQsIDB4QjEsIDB4NzMsIDB4NDEsIDB4RTcsIDB4RjMsIDB4QzQsIDB4QjQsIDB4ODAsCi0gICAgICAweDA4LCAweDE0LCAweDA5LCAweDU0LCAweDUxLCAweDY5LCAweDIwLCAweDQyLCAweDRDLCAweDQ1LAotICAgICAgMHgwNSwgMHgxMiwgMHg2MCwgMHgwMCwgMHhFOCwgMHgwMywgMHgwMiwgMHgwQSwgMHgwMH07Ci0gIEVYUEVDVF9UUlVFKEFkdmVydGlzZURhdGFQYXJzZXI6OklzVmFsaWQoZGF0YTcpKTsKLX0KLQotVEVTVChBZHZlcnRpc2VEYXRhUGFyc2VyVGVzdCwgR2V0RmllbGRCeVR5cGUpIHsKLSAgLy8gU2luZ2xlIGZpZWxkLgotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhMHsweDAzLCAweDAyLCAweDAxLCAweDAyfTsKLQotICB1aW50OF90IHBfbGVuZ3RoOwotICBjb25zdCB1aW50OF90KiBkYXRhID0KLSAgICAgIEFkdmVydGlzZURhdGFQYXJzZXI6OkdldEZpZWxkQnlUeXBlKGRhdGEwLCAweDAyLCAmcF9sZW5ndGgpOwotICBFWFBFQ1RfRVEoZGF0YTAuZGF0YSgpICsgMiwgZGF0YSk7Ci0gIEVYUEVDVF9FUSgyLCBwX2xlbmd0aCk7Ci0KLSAgLy8gVHdvIGZpZWxkcywgc2Vjb25kIGZpZWxkIGxlbmd0aCB0b28gbG9uZy4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YTF7MHgwMiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMH07Ci0KLSAgLy8gRmlyc3QgZmllbGQgaXMgb2suCi0gIGRhdGEgPSBBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZShkYXRhMSwgMHgwMiwgJnBfbGVuZ3RoKTsKLSAgRVhQRUNUX0VRKGRhdGExLmRhdGEoKSArIDIsIGRhdGEpOwotICBFWFBFQ1RfRVEoMHgwMSwgcF9sZW5ndGgpOwotCi0gIC8vIFNlY29uZCBmaWVsZCBoYXZlIGJhZCBsZW5ndGguCi0gIGRhdGEgPSBBZHZlcnRpc2VEYXRhUGFyc2VyOjpHZXRGaWVsZEJ5VHlwZShkYXRhMSwgMHgwMywgJnBfbGVuZ3RoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGRhdGEpOwotICBFWFBFQ1RfRVEoMCwgcF9sZW5ndGgpOwotfQotCi0vLyBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IFJlbW92ZVRyYWlsaW5nWmVyb3MgaXMgd29ya2luZyBjb3JyZWN0bHkuIEl0IGRvZXMKLS8vIHJ1biB0aGUgUmVtb3ZlVHJhaWxpbmdaZXJvcyBmb3IgYWQgZGF0YSwgdGhlbiBnbHVlIHNjYW4gcmVzcG9uc2UgYXQgZW5kIG9mCi0vLyBpdCwgYW5kIGNoZWNrcyB0aGF0IHRoZSByZXN1bHRpbmcgZGF0YSBpcyBnb29kLgotVEVTVChBZHZlcnRpc2VEYXRhUGFyc2VyVGVzdCwgUmVtb3ZlVHJhaWxpbmdaZXJvcykgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwb2RvX2FkX2RhdGF7Ci0gICAgICAweDAyLCAweDAxLCAweDAyLCAweDExLCAweDA2LCAweDY2LCAweDlhLCAweDBjLCAweDIwLCAweDAwLCAweDA4LAotICAgICAgMHgzNywgMHhhOCwgMHhlNSwgMHgxMSwgMHg4MSwgMHg4YiwgMHhkMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHgwMCwKLSAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwb2RvX3NjYW5fcmVzcHsKLSAgICAgIDB4MDMsIDB4MTksIDB4MDAsIDB4ODAsIDB4MDksIDB4MDksIDB4NTAsIDB4NmYsIDB4NjQsIDB4NmYsIDB4NTEsCi0gICAgICAweDM1LCAweDU2LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLSAgQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6UmVtb3ZlVHJhaWxpbmdaZXJvcyhwb2RvX2FkX2RhdGEpOwotICBBZHZlcnRpc2VEYXRhUGFyc2VyOjpSZW1vdmVUcmFpbGluZ1plcm9zKHBvZG9fc2Nhbl9yZXNwKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBnbHVlZChwb2RvX2FkX2RhdGEpOwotICBnbHVlZC5pbnNlcnQoZ2x1ZWQuZW5kKCksIHBvZG9fc2Nhbl9yZXNwLmJlZ2luKCksIHBvZG9fc2Nhbl9yZXNwLmVuZCgpKTsKLQotICBFWFBFQ1RfVFJVRShBZHZlcnRpc2VEYXRhUGFyc2VyOjpJc1ZhbGlkKGdsdWVkKSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgUmVtb3ZlVHJhaWxpbmdaZXJvcyBpcyByZW1vdmluZyBhbGwgYnl0ZXMgYWZ0ZXIKLS8vIGZpcnN0IHplcm8gbGVuZ3RoIGZpZWxkLiBJdCBkb2VzIHJ1biB0aGUgUmVtb3ZlVHJhaWxpbmdaZXJvcyBmb3IgZGF0YSB3aXRoCi0vLyBub24temVybyBieXRlcyBhZnRlciB6ZXJvIGxlbmd0aCBmaWVsZCwgdGhlbiBnbHVlIHNjYW4gcmVzcG9uc2UgYXQgZW5kIG9mIGl0LAotLy8gYW5kIGNoZWNrcyB0aGF0IHRoZSByZXN1bHRpbmcgZGF0YSBpcyBnb29kLiBOb3RlOiBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGFsbAotLy8gYnl0ZXMgYWZ0ZXIgemVybyBsZW5ndGggZmllbGQgdG8gYmUgemVybyBwYWRkaW5nLCBidXQgbWFueSBsZWdhY3kgZGV2aWNlcyBnb3QKLS8vIHRoaXMgd3JvbmcsIGNhdXNpbmcgdXMgdG8gaGF2ZSB0aGlzIHdvcmthcm91bmQuCi1URVNUKEFkdmVydGlzZURhdGFQYXJzZXJUZXN0LCBSZW1vdmVUcmFpbGluZ1plcm9zTWFsZm9ybWVkKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkX2RhdGF7MHgwMiwgMHgwMSwgMHgwMiwgMHgxMSwgMHgwNiwgMHg2NiwgMHg5YSwgMHgwYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLCAweDAwLCAweDA4LCAweDM3LCAweGE4LCAweGU1LCAweDExLCAweDgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGIsIDB4ZDAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcHsweDAzLCAweDE5LCAweDAwLCAweDgwLCAweDA5LCAweDA5LCAweDUwLCAweDZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NCwgMHg2ZiwgMHg1MSwgMHgzNSwgMHg1NiwgMHg0NywgMHgwMCwgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKLQotICBBZHZlcnRpc2VEYXRhUGFyc2VyOjpSZW1vdmVUcmFpbGluZ1plcm9zKGFkX2RhdGEpOwotICBBZHZlcnRpc2VEYXRhUGFyc2VyOjpSZW1vdmVUcmFpbGluZ1plcm9zKHNjYW5fcmVzcCk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZ2x1ZWQoYWRfZGF0YSk7Ci0gIGdsdWVkLmluc2VydChnbHVlZC5lbmQoKSwgc2Nhbl9yZXNwLmJlZ2luKCksIHNjYW5fcmVzcC5lbmQoKSk7Ci0KLSAgRVhQRUNUX1RSVUUoQWR2ZXJ0aXNlRGF0YVBhcnNlcjo6SXNWYWxpZChnbHVlZCkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvYmxlX2FkdmVydGlzZXJfdGVzdC5jYyBiL3N0YWNrL3Rlc3QvYmxlX2FkdmVydGlzZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2YmRiYi4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2JsZV9hZHZlcnRpc2VyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2JsZV9hZHZlcnRpc2VyLmgiCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxhcnJheT4KLQotI2luY2x1ZGUgInN0YWNrL2J0bS9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpBcmdzOwotdXNpbmcgOjp0ZXN0aW5nOjpDb250YWluczsKLXVzaW5nIDo6dGVzdGluZzo6RG9BbGw7Ci11c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7Ci11c2luZyA6OnRlc3Rpbmc6OkV4YWN0bHk7Ci11c2luZyA6OnRlc3Rpbmc6OkZpZWxkOwotdXNpbmcgOjp0ZXN0aW5nOjpJc0VtcHR5OwotdXNpbmcgOjp0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgOjp0ZXN0aW5nOjpTaXplSXM7Ci11c2luZyA6OnRlc3Rpbmc6Ol87Ci11c2luZyBiYXNlOjpCaW5kOwotdXNpbmcgc3RhdHVzX2NiID0gQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6c3RhdHVzX2NiOwotdXNpbmcgcGFyYW1ldGVyc19jYiA9IEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2U6OnBhcmFtZXRlcnNfY2I7Ci11c2luZyBTZXRFbmFibGVEYXRhID0gQmxlQWR2ZXJ0aXNlckhjaUludGVyZmFjZTo6U2V0RW5hYmxlRGF0YTsKLQotY29uc3QgaW50IG51bV9hZHZfaW5zdGFuY2VzID0gMTY7Ci0KLS8qIEJlbG93IGFyZSBtZXRob2RzIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiB3ZSBkb24ndCB3YW50IHRvIGNvbXBpbGUgdGhlCi0gKiB3aG9sZSBzdGFjay4gVGhleSB3aWxsIGJlIHJlbW92ZWQsIG9yIGNoYW5nZWQgaW50byBtb2NrcyBvbmUgYnkgb25lIGluIHRoZQotICogZnV0dXJlLCBhcyB0aGUgcmVmYWN0b3JpbmcgcHJvZ3Jlc3NlcyAqLwotYm9vbCBCVE1fQmxlTG9jYWxQcml2YWN5RW5hYmxlZCgpIHsgcmV0dXJuIHRydWU7IH0KLXZvaWQgYnRtX2FjbF91cGRhdGVfY29ubl9hZGRyKHVpbnQxNl90IGNvbm5faGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci19Ci12b2lkIGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJiBycGEpPiBjYikgewotICBjYi5SdW4oUmF3QWRkcmVzczo6a0VtcHR5KTsKLX0KLQotYWxhcm1fY2FsbGJhY2tfdCBsYXN0X2FsYXJtX2NiID0gbnVsbHB0cjsKLXZvaWQqIGxhc3RfYWxhcm1fZGF0YSA9IG51bGxwdHI7Ci12b2lkIGFsYXJtX3NldF9vbl9tbG9vcChhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9jYWxsYmFja190IGNiLCB2b2lkKiBkYXRhKSB7Ci0gIGxhc3RfYWxhcm1fY2IgPSBjYjsKLSAgbGFzdF9hbGFybV9kYXRhID0gZGF0YTsKLX0KLQotdm9pZCBhbGFybV9jYW5jZWwoYWxhcm1fdCogYWxhcm0pIHt9Ci1hbGFybV90KiBhbGFybV9uZXdfcGVyaW9kaWMoY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gbnVsbHB0cjsgfQotYWxhcm1fdCogYWxhcm1fbmV3KGNvbnN0IGNoYXIqIG5hbWUpIHsgcmV0dXJuIG51bGxwdHI7IH0KLXZvaWQgYWxhcm1fZnJlZShhbGFybV90KiBhbGFybSkge30KLQotdWludDY0X3QgYnRtX2dldF9uZXh0X3ByaXZhdGVfYWRkcnJlc3NfaW50ZXJ2YWxfbXMoKSB7IHJldHVybiAxNSAqIDYwICogMTAwMDsgfQotCi1uYW1lc3BhY2Ugewotdm9pZCBEb05vdGhpbmcodWludDhfdCkge30KLQotdm9pZCBEb05vdGhpbmcyKHVpbnQ4X3QsIHVpbnQ4X3QpIHt9Ci0KLXZvaWQgVHJpZ2dlclJhbmRvbUFkZHJlc3NVcGRhdGUoKSB7Ci0gIC8vIENhbGwgdG8gU3RhcnRBZHZlcnRpc2luZ1NldCBzZXQgdGhlIGxhc3RfYWxhcm1fY2IgdG8gcmFuZG9tIGFkZHJlc3MgdGltZW91dAotICAvLyBjYWxsYmFjay4gQ2FsbCBpdCBub3cgaW4gb3JkZXIgdG8gdHJpZ2dlciBhZGRyZXNzIHVwZGF0ZQotICBsYXN0X2FsYXJtX2NiKGxhc3RfYWxhcm1fZGF0YSk7Ci19Ci0KLWNvbnN0ZXhwciB1aW50OF90IElOVEVSTUVESUFURSA9Ci0gICAgMHgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgZnJhZ21lbnQgb2YgZnJhZ21lbnRlZCBkYXRhCi1jb25zdGV4cHIgdWludDhfdCBGSVJTVCA9IDB4MDE7ICAgICAvLyBGaXJzdCBmcmFnbWVudCBvZiBmcmFnbWVudGVkIGRhdGEKLWNvbnN0ZXhwciB1aW50OF90IExBU1QgPSAweDAyOyAgICAgIC8vIExhc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRlZCBkYXRhCi1jb25zdGV4cHIgdWludDhfdCBDT01QTEVURSA9IDB4MDM7ICAvLyBDb21wbGV0ZSBleHRlbmRlZCBhZHZlcnRpc2luZyBkYXRhCi0KLWNsYXNzIEFkdmVydGlzZXJIY2lNb2NrIDogcHVibGljIEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQWR2ZXJ0aXNlckhjaU1vY2soKSA9IGRlZmF1bHQ7Ci0gIH5BZHZlcnRpc2VySGNpTW9jaygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBNT0NLX01FVEhPRDEoUmVhZEluc3RhbmNlQ291bnQsCi0gICAgICAgICAgICAgICB2b2lkKGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBpbnN0X2NudCovKT4pKTsKLSAgTU9DS19NRVRIT0QxKFNldEFkdmVydGlzaW5nRXZlbnRPYnNlcnZlciwKLSAgICAgICAgICAgICAgIHZvaWQoQWR2ZXJ0aXNpbmdFdmVudE9ic2VydmVyKiBvYnNlcnZlcikpOwotICBNT0NLX01FVEhPRDYoU2V0QWR2ZXJ0aXNpbmdEYXRhLAotICAgICAgICAgICAgICAgdm9pZCh1aW50OF90LCB1aW50OF90LCB1aW50OF90LCB1aW50OF90LCB1aW50OF90Kiwgc3RhdHVzX2NiKSk7Ci0gIE1PQ0tfTUVUSE9ENihTZXRTY2FuUmVzcG9uc2VEYXRhLAotICAgICAgICAgICAgICAgdm9pZCh1aW50OF90LCB1aW50OF90LCB1aW50OF90LCB1aW50OF90LCB1aW50OF90Kiwgc3RhdHVzX2NiKSk7Ci0gIE1PQ0tfTUVUSE9EMyhTZXRSYW5kb21BZGRyZXNzLCB2b2lkKHVpbnQ4X3QsIGNvbnN0IFJhd0FkZHJlc3MmLCBzdGF0dXNfY2IpKTsKLSAgTU9DS19NRVRIT0QzKEVuYWJsZSwgdm9pZCh1aW50OF90LCBzdGQ6OnZlY3RvcjxTZXRFbmFibGVEYXRhPiwgc3RhdHVzX2NiKSk7Ci0gIE1PQ0tfTUVUSE9ENShTZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgIHZvaWQodWludDhfdCwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50MTZfdCwgc3RhdHVzX2NiKSk7Ci0gIE1PQ0tfTUVUSE9ENShTZXRQZXJpb2RpY0FkdmVydGlzaW5nRGF0YSwKLSAgICAgICAgICAgICAgIHZvaWQodWludDhfdCwgdWludDhfdCwgdWludDhfdCwgdWludDhfdCosIHN0YXR1c19jYikpOwotICBNT0NLX01FVEhPRDMoU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZSwgdm9pZCh1aW50OF90LCB1aW50OF90LCBzdGF0dXNfY2IpKTsKLSAgTU9DS19NRVRIT0QyKFJlbW92ZUFkdmVydGlzaW5nU2V0LCB2b2lkKHVpbnQ4X3QsIHN0YXR1c19jYikpOwotICBNT0NLX01FVEhPRDEoQ2xlYXJBZHZlcnRpc2luZ1NldHMsIHZvaWQoc3RhdHVzX2NiKSk7Ci0KLSAgTU9DS19NRVRIT0Q5KFNldFBhcmFtZXRlcnMxLAotICAgICAgICAgICAgICAgdm9pZCh1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50OF90LCB1aW50OF90LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiwgdWludDhfdCwgY29uc3QgUmF3QWRkcmVzcyYpKTsKLSAgTU9DS19NRVRIT0Q4KFNldFBhcmFtZXRlcnMyLCB2b2lkKHVpbnQ4X3QsIGludDhfdCwgdWludDhfdCwgdWludDhfdCwgdWludDhfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QsIHVpbnQ4X3QsIHBhcmFtZXRlcnNfY2IpKTsKLQotICB2b2lkIFNldFBhcmFtZXRlcnModWludDhfdCBoYW5kbGUsIHVpbnQxNl90IHByb3BlcnRpZXMsIHVpbnQzMl90IGFkdl9pbnRfbWluLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWR2X2ludF9tYXgsIHVpbnQ4X3QgY2hhbm5lbF9tYXAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IG93bl9hZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIG93bl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwZWVyX2FkZHJlc3NfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmaWx0ZXJfcG9saWN5LCBpbnQ4X3QgdHhfcG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByaW1hcnlfcGh5LCB1aW50OF90IHNlY29uZGFyeV9tYXhfc2tpcCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYW5fcmVxdWVzdF9ub3RpZnlfZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc19jYiBjbWRfY29tcGxldGUpIG92ZXJyaWRlIHsKLSAgICBTZXRQYXJhbWV0ZXJzMShoYW5kbGUsIHByb3BlcnRpZXMsIGFkdl9pbnRfbWluLCBhZHZfaW50X21heCwgY2hhbm5lbF9tYXAsCi0gICAgICAgICAgICAgICAgICAgb3duX2FkZHJlc3NfdHlwZSwgb3duX2FkZHJlc3MsIHBlZXJfYWRkcmVzc190eXBlLAotICAgICAgICAgICAgICAgICAgIHBlZXJfYWRkcmVzcyk7Ci0gICAgU2V0UGFyYW1ldGVyczIoZmlsdGVyX3BvbGljeSwgdHhfcG93ZXIsIHByaW1hcnlfcGh5LCBzZWNvbmRhcnlfbWF4X3NraXAsCi0gICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5X3BoeSwgYWR2ZXJ0aXNpbmdfc2lkLCBzY2FuX3JlcXVlc3Rfbm90aWZ5X2VuYWJsZSwKLSAgICAgICAgICAgICAgICAgICBjbWRfY29tcGxldGUpOwotICB9OwotCi0gIGJvb2wgUXVpcmtBZHZlcnRpc2VyWmVyb0hhbmRsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWR2ZXJ0aXNlckhjaU1vY2spOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBpbnQgcmVnX2luc3RfaWQgPSAtMTsKLSAgaW50IHJlZ19zdGF0dXMgPSAtMTsKLSAgaW50IHNldF9wYXJhbXNfc3RhdHVzID0gLTE7Ci0gIGludCBzZXRfZGF0YV9zdGF0dXMgPSAtMTsKLSAgaW50IGVuYWJsZV9zdGF0dXMgPSAtMTsKLSAgaW50IHN0YXJ0X2FkdmVydGlzaW5nX3N0YXR1cyA9IC0xOwotICBpbnQgc3RhcnRfYWR2ZXJ0aXNpbmdfc2V0X2FkdmVydGlzZXJfaWQgPSAtMTsKLSAgaW50IHN0YXJ0X2FkdmVydGlzaW5nX3NldF90eF9wb3dlciA9IC0xOwotICBpbnQgc3RhcnRfYWR2ZXJ0aXNpbmdfc2V0X3N0YXR1cyA9IC0xOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxBZHZlcnRpc2VySGNpTW9jaz4gaGNpX21vY2s7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBoY2lfbW9jay5yZXNldChuZXcgQWR2ZXJ0aXNlckhjaU1vY2soKSk7Ci0KLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPiBpbnN0X2NudF9DYjsKLSAgICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFJlYWRJbnN0YW5jZUNvdW50KF8pKQotICAgICAgICAuVGltZXMoRXhhY3RseSgxKSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmluc3RfY250X0NiKSk7Ci0KLSAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkluaXRpYWxpemUoaGNpX21vY2suZ2V0KCkpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotCi0gICAgLy8gd2UgYXJlIGEgdHJ1bHkgZ3JhY2lvdXMgZmFrZSBjb250cm9sbGVyLCBsZXQgdGhlIGNvbW1hbmQgc3VjY2VlZCEKLSAgICBpbnN0X2NudF9DYi5SdW4obnVtX2Fkdl9pbnN0YW5jZXMpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkNsZWFuVXAoKTsKLSAgICBoY2lfbW9jay5yZXNldCgpOwotICB9Ci0KLSBwdWJsaWM6Ci0gIHZvaWQgUmVnaXN0cmF0aW9uQ2IodWludDhfdCBpbnN0X2lkLCB1aW50OF90IHN0YXR1cykgewotICAgIHJlZ19pbnN0X2lkID0gaW5zdF9pZDsKLSAgICByZWdfc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgdm9pZCBTZXRQYXJhbWV0ZXJzQ2IodWludDhfdCBzdGF0dXMsIGludDhfdCB0eF9wb3dlcikgewotICAgIHNldF9wYXJhbXNfc3RhdHVzID0gc3RhdHVzOwotICB9Ci0gIHZvaWQgU2V0RGF0YUNiKHVpbnQ4X3Qgc3RhdHVzKSB7IHNldF9kYXRhX3N0YXR1cyA9IHN0YXR1czsgfQotICB2b2lkIEVuYWJsZUNiKHVpbnQ4X3Qgc3RhdHVzKSB7IGVuYWJsZV9zdGF0dXMgPSBzdGF0dXM7IH0KLSAgdm9pZCBTdGFydEFkdmVydGlzaW5nQ2IodWludDhfdCBzdGF0dXMpIHsgc3RhcnRfYWR2ZXJ0aXNpbmdfc3RhdHVzID0gc3RhdHVzOyB9Ci0gIHZvaWQgU3RhcnRBZHZlcnRpc2luZ1NldENiKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cykgewotICAgIHN0YXJ0X2FkdmVydGlzaW5nX3NldF9hZHZlcnRpc2VyX2lkID0gYWR2ZXJ0aXNlcl9pZDsKLSAgICBzdGFydF9hZHZlcnRpc2luZ19zZXRfdHhfcG93ZXIgPSB0eF9wb3dlcjsKLSAgICBzdGFydF9hZHZlcnRpc2luZ19zZXRfc3RhdHVzID0gc3RhdHVzOwotICB9Ci19OwotCi1URVNUX0YoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgdGVzdF9yZWdpc3RyYXRpb24pIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYWR2X2luc3RhbmNlczsgaSsrKSB7Ci0gICAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKEJpbmQoCi0gICAgICAgICZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpSZWdpc3RyYXRpb25DYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCByZWdfc3RhdHVzKTsKLSAgICBFWFBFQ1RfRVEoaSwgcmVnX2luc3RfaWQpOwotICB9Ci0KLSAgLy8gVGhpcyBjYWxsIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgLSBubyBtb3JlIGFkdmVydGlzZXJzIGxlZnQuCi0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlJlZ2lzdGVyQWR2ZXJ0aXNlcigKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlJlZ2lzdHJhdGlvbkNiLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIEVYUEVDVF9FUShBRFZFUlRJU0VfRkFJTEVEX1RPT19NQU5ZX0FEVkVSVElTRVJTLCByZWdfc3RhdHVzKTsKLSAgLy8gRG9uJ3QgYm90aGVyIGNoZWNraW5nIGluc3RfaWQsIGl0IGRvZXNuJ3QgbWF0dGVyCi0KLSAgc3RhdHVzX2NiIHJlbW92ZV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBSZW1vdmVBZHZlcnRpc2luZ1NldChfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnJlbW92ZV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5VbnJlZ2lzdGVyKDUpOwotICByZW1vdmVfY2IuUnVuKDApOwotCi0gIC8vIE9uZSBhZHZlcnRpc2VyIHdhcyBmcmVlZCwgc28gc2hvdWxkIGJlIGFibGUgdG8gcmVnaXN0ZXIgb25lIG5vdwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5SZWdpc3RlckFkdmVydGlzZXIoCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpSZWdpc3RyYXRpb25DYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgcmVnX3N0YXR1cyk7Ci0gIEVYUEVDVF9FUSg1LCByZWdfaW5zdF9pZCk7Ci19Ci0KLS8qIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBmb2xsb3dpbmcgZmxvdyBpcyB3b3JraW5nIGNvcnJlY3RseTogcmVnaXN0ZXIsCi0gKiBzZXQgcGFyYW1ldGVycywgc2V0IGRhdGEsIGVuYWJsZSwgLi4uIChhZHZlcnRpc2UpIC4uLiwgdW5yZWdpc3RlciovCi1URVNUX0YoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgdGVzdF9hbmRyb2lkX2Zsb3cpIHsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6UmVnaXN0cmF0aW9uQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHJlZ19zdGF0dXMpOwotICBpbnQgYWR2ZXJ0aXNlcl9pZCA9IHJlZ19pbnN0X2lkOwotCi0gIHBhcmFtZXRlcnNfY2Igc2V0X3BhcmFtc19jYjsKLSAgdEJUTV9CTEVfQURWX1BBUkFNUyBwYXJhbXM7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczEoYWR2ZXJ0aXNlcl9pZCwgXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczIoXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDc+KCZzZXRfcGFyYW1zX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlNldFBhcmFtZXRlcnMoCi0gICAgICBhZHZlcnRpc2VyX2lkLCAmcGFyYW1zLAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U2V0UGFyYW1ldGVyc0NiLAotICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotCi0gIC8vIHdlIGFyZSBhIHRydWx5IGdyYWNpb3VzIGZha2UgY29udHJvbGxlciwgbGV0IHRoZSBjb21tYW5kIHN1Y2NlZWQhCi0gIHNldF9wYXJhbXNfY2IuUnVuKDAsIDApOwotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgc2V0X3BhcmFtc19zdGF0dXMpOwotCi0gIHN0YXR1c19jYiBzZXRfZGF0YV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRBZHZlcnRpc2luZ0RhdGEoYWR2ZXJ0aXNlcl9pZCwgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TZXREYXRhKAotICAgICAgYWR2ZXJ0aXNlcl9pZCwgZmFsc2UsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCksCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXREYXRhQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgc2V0X2RhdGFfY2IuUnVuKDApOwotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgc2V0X2RhdGFfc3RhdHVzKTsKLQotICBzdGF0dXNfY2IgZW5hYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIEVuYWJsZSgweDAxIC8qIGVuYWJsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgIEFsbE9mKFNpemVJcygxKSwgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6OmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpKSwKLSAgICAgICAgICAgICAgICAgICAgIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZW5hYmxlX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPkVuYWJsZSgKLSAgICAgIGFkdmVydGlzZXJfaWQsIHRydWUsCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpFbmFibGVDYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksIDAsIDAsCi0gICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPigpKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgZW5hYmxlX2NiLlJ1bigwKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIGVuYWJsZV9zdGF0dXMpOwotCi0gIC8qIGZha2UgY29udHJvbGxlciBzaG91bGQgYmUgYWR2ZXJ0aXNpbmcgKi8KLQotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIEVuYWJsZSgweDAwIC8qIGRpc2FibGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICBBbGxPZihTaXplSXMoMSksIENvbnRhaW5zKEZpZWxkKCZTZXRFbmFibGVEYXRhOjpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQpKSksCi0gICAgICAgICAgICAgICAgICAgICBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJmVuYWJsZV9jYikpOwotICBzdGF0dXNfY2IgcmVtb3ZlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFJlbW92ZUFkdmVydGlzaW5nU2V0KF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmcmVtb3ZlX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlVucmVnaXN0ZXIoYWR2ZXJ0aXNlcl9pZCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotCi0gIGVuYWJsZV9jYi5SdW4oMCk7Ci0gIHJlbW92ZV9jYi5SdW4oMCk7Ci19Ci0KLS8qIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHdoZW4gYWR2ZXJ0aXNpbmcgZGF0YSBpcyBzZXQsIHR4IHBvd2VyIGFuZCBmbGFncyB3aWxsCi0gKiBiZSBwcm9wZXJseSBmaWxsZWQuICovCi1URVNUX0YoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgdGVzdF9hZHZfZGF0YV9maWxsaW5nKSB7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlJlZ2lzdGVyQWR2ZXJ0aXNlcigKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlJlZ2lzdHJhdGlvbkNiLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCByZWdfc3RhdHVzKTsKLSAgaW50IGFkdmVydGlzZXJfaWQgPSByZWdfaW5zdF9pZDsKLQotICBwYXJhbWV0ZXJzX2NiIHNldF9wYXJhbXNfY2I7Ci0gIHRCVE1fQkxFX0FEVl9QQVJBTVMgcGFyYW1zOwotICBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyA9Ci0gICAgICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OmFkdmVydGlzaW5nX3Byb3BfbGVnYWN5X2Nvbm5lY3RhYmxlOwotICBwYXJhbXMudHhfcG93ZXIgPSAtMTU7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczEoYWR2ZXJ0aXNlcl9pZCwgXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczIoXywgcGFyYW1zLnR4X3Bvd2VyLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Nz4oJnNldF9wYXJhbXNfY2IpKTsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+U2V0UGFyYW1ldGVycygKLSAgICAgIGFkdmVydGlzZXJfaWQsICZwYXJhbXMsCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXRQYXJhbWV0ZXJzQ2IsCi0gICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgLy8gbGV0IHRoZSBzZXQgcGFyYW1ldGVycyBjb21tYW5kIHN1Y2NlZWQhCi0gIHNldF9wYXJhbXNfY2IuUnVuKDAsIDApOwotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgc2V0X3BhcmFtc19zdGF0dXMpOwotCi0gIHN0YXR1c19jYiBzZXRfZGF0YV9jYjsKLSAgLyogdmVyaWZ5IHRoYXQgZmxhZ3Mgd2lsbCBiZSBhZGRlZCwgYW5kIHR4IHBvd2VyIGZpbGxlZCwgaWYgY2FsbCB0byBTZXREYXRhCi0gICAqIGNvbnRhaW5lZCBvbmx5IHR4IHBvd2VyLCBhbmQgdGhlIGFkdmVydGlzZW1lbnQgaXMgY29ubmVjdGFibGUgKi8KLSAgdWludDhfdCBleHBlY3RlZF9hZHZfZGF0YVtdID0gewotICAgICAgMHgwMiAvKiBsZW4gKi8sICAgICAgICAgMHgwMSAvKiBmbGFncyAqLywKLSAgICAgIDB4MDIgLyogZmxhZ3MgdmFsdWUgKi8sIDB4MDIgLyogbGVuICovLAotICAgICAgMHgwQSAvKiB0eF9wb3dlciAqLywgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFyYW1zLnR4X3Bvd2VyKX07Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKGFkdmVydGlzZXJfaWQsIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLldpdGgoQXJnczw0LCAzPihFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkX2Fkdl9kYXRhKSkpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TZXREYXRhKAotICAgICAgYWR2ZXJ0aXNlcl9pZCwgZmFsc2UsCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pih7MHgwMiAvKiBsZW4gKi8sIDB4MEEgLyogdHhfcG93ZXIgKi8sIDB4MDB9KSwKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlNldERhdGFDYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICBzZXRfZGF0YV9jYi5SdW4oMCk7Ci0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzZXRfZGF0YV9zdGF0dXMpOwotfQotCi0vKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB3aGVuIGFkdmVydGlzaW5nIGlzIG5vbi1jb25uZWN0YWJsZSwgZmxhZ3Mgd2lsbCBub3QKLSAqIGJlIGFkZGVkLiAqLwotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3RfYWR2X2RhdGFfbm90X2ZpbGxpbmcpIHsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6UmVnaXN0cmF0aW9uQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHJlZ19zdGF0dXMpOwotICBpbnQgYWR2ZXJ0aXNlcl9pZCA9IHJlZ19pbnN0X2lkOwotCi0gIHBhcmFtZXRlcnNfY2Igc2V0X3BhcmFtc19jYjsKLSAgdEJUTV9CTEVfQURWX1BBUkFNUyBwYXJhbXM7Ci0gIHBhcmFtcy5hZHZlcnRpc2luZ19ldmVudF9wcm9wZXJ0aWVzID0KLSAgICAgIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6YWR2ZXJ0aXNpbmdfcHJvcF9sZWdhY3lfbm9uX2Nvbm5lY3RhYmxlOwotICBwYXJhbXMudHhfcG93ZXIgPSAtMTU7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczEoYWR2ZXJ0aXNlcl9pZCwgXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywKLSAgICAgICAgICAgICAgU2V0UGFyYW1ldGVyczIoXywgKHVpbnQ4X3QpcGFyYW1zLnR4X3Bvd2VyLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Nz4oJnNldF9wYXJhbXNfY2IpKTsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+U2V0UGFyYW1ldGVycygKLSAgICAgIGFkdmVydGlzZXJfaWQsICZwYXJhbXMsCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXRQYXJhbWV0ZXJzQ2IsCi0gICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgLy8gbGV0IHRoZSBzZXQgcGFyYW1ldGVycyBjb21tYW5kIHN1Y2NlZWQhCi0gIHNldF9wYXJhbXNfY2IuUnVuKDAsIC0xNSk7Ci0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzZXRfcGFyYW1zX3N0YXR1cyk7Ci0KLSAgc3RhdHVzX2NiIHNldF9kYXRhX2NiOwotICAvKiB2ZXJpZnkgdGhhdCBmbGFncyB3aWxsIG5vdCBiZSBhZGRlZCAqLwotICB1aW50OF90IGV4cGVjdGVkX2Fkdl9kYXRhW10gPSB7Ci0gICAgICAweDAyIC8qIGxlbiAqLywgMHhGRiAvKiBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgKi8sIDB4MDEgLyogZGF0YSAqL307Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKGFkdmVydGlzZXJfaWQsIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLldpdGgoQXJnczw0LCAzPihFbGVtZW50c0FyZUFycmF5KGV4cGVjdGVkX2Fkdl9kYXRhKSkpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TZXREYXRhKAotICAgICAgYWR2ZXJ0aXNlcl9pZCwgZmFsc2UsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHsweDAyIC8qIGxlbiAqLywgMHhGRiwgMHgwMX0pLAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U2V0RGF0YUNiLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotCi0gIHNldF9kYXRhX2NiLlJ1bigwKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHNldF9kYXRhX3N0YXR1cyk7Ci19Ci0KLVRFU1RfRihCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0LCB0ZXN0X3JlZW5hYmxpbmcpIHsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6UmVnaXN0cmF0aW9uQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHJlZ19zdGF0dXMpOwotICBFWFBFQ1RfRVEoMCwgcmVnX2luc3RfaWQpOwotCi0gIHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCA9IHJlZ19pbnN0X2lkOwotICBzdGF0dXNfY2IgZW5hYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIEVuYWJsZSgweDAxIC8qIGVuYWJsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgIEFsbE9mKFNpemVJcygxKSwgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6OmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpKSwKLSAgICAgICAgICAgICAgICAgICAgIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZW5hYmxlX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPkVuYWJsZShhZHZlcnRpc2VyX2lkLCB0cnVlLCBCaW5kKERvTm90aGluZyksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBCaW5kKERvTm90aGluZykpOwotICBlbmFibGVfY2IuUnVuKDApOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIEVuYWJsZSgweDAxIC8qIGVuYWJsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgIEFsbE9mKFNpemVJcygxKSwgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6OmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpKSwKLSAgICAgICAgICAgICAgICAgICAgIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZW5hYmxlX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPk9uQWR2ZXJ0aXNpbmdTZXRUZXJtaW5hdGVkKGFkdmVydGlzZXJfaWQsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlZCwgMHgwMCk7Ci0gIGVuYWJsZV9jYi5SdW4oMCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotfQotCi0vKiBNYWtlIHN1cmUgdGhhdCBpbnN0YW5jZSBpcyBub3QgcmVlbmFibGVkIGlmIGl0J3MgYWxyZWFkeSBkaXNhYmxlZCAqLwotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3RfcmVlbmFibGluZ19kaXNhYmxlZF9pbnN0YW5jZSkgewotICB1aW50OF90IGFkdmVydGlzZXJfaWQgPSAxOyAgLy8gYW55IHVucmVnaXN0ZXJlZCB2YWx1ZQotCi0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgRW5hYmxlKF8sIF8sIF8pKS5UaW1lcyhFeGFjdGx5KDApKTsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+T25BZHZlcnRpc2luZ1NldFRlcm1pbmF0ZWQoYWR2ZXJ0aXNlcl9pZCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSwgMHgwMCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotfQotCi0vKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgb25seSBmbG93IHRoYXQgaXMgY3VycmVudGx5IHVzZWQgb24gQW5kcm9pZCwgaXMKLSAqIHdvcmtpbmcgY29ycmVjdGx5IGluIGhhcHB5IGNhc2Ugc2NlbmFyaW8uICovCi1URVNUX0YoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgdGVzdF9zdGFydF9hZHZlcnRpc2luZ19zZXQpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGE7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcDsKLSAgdEJUTV9CTEVfQURWX1BBUkFNUyBwYXJhbXM7Ci0gIHRCTEVfUEVSSU9ESUNfQURWX1BBUkFNUyBwZXJpb2RpY19wYXJhbXM7Ci0gIHBlcmlvZGljX3BhcmFtcy5lbmFibGUgPSBmYWxzZTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGVyaW9kaWNfZGF0YTsKLQotICBwYXJhbWV0ZXJzX2NiIHNldF9wYXJhbXNfY2I7Ci0gIHN0YXR1c19jYiBzZXRfYWRkcmVzc19jYjsKLSAgc3RhdHVzX2NiIHNldF9kYXRhX2NiOwotICBzdGF0dXNfY2Igc2V0X3NjYW5fcmVzcF9kYXRhX2NiOwotICBzdGF0dXNfY2IgZW5hYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFBhcmFtZXRlcnMxKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQYXJhbWV0ZXJzMihfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Nz4oJnNldF9wYXJhbXNfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRSYW5kb21BZGRyZXNzKF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmc2V0X2FkZHJlc3NfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRBZHZlcnRpc2luZ0RhdGEoXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFNjYW5SZXNwb25zZURhdGEoXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfc2Nhbl9yZXNwX2RhdGFfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBFbmFibGUoMHgwMSAvKiBlbmFibGUgKi8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZW5hYmxlX2NiKSk7Ci0KLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+U3RhcnRBZHZlcnRpc2luZ1NldCgKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlN0YXJ0QWR2ZXJ0aXNpbmdTZXRDYiwKLSAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAmcGFyYW1zLCBhZHZfZGF0YSwgc2Nhbl9yZXNwLCAmcGVyaW9kaWNfcGFyYW1zLCBwZXJpb2RpY19kYXRhLAotICAgICAgMCAvKiBkdXJhdGlvbiAqLywgMCAvKiBtYXhFeHRBZHZFdmVudHMgKi8sIEJpbmQoRG9Ob3RoaW5nMikpOwotCi0gIC8vIHdlIGFyZSBhIHRydWx5IGdyYWNpb3VzIGZha2UgY29udHJvbGxlciwgbGV0IHRoZSBjb21tYW5kcyBzdWNjZWVkIQotICBpbnQgc2VsZWN0ZWRfdHhfcG93ZXIgPSAtMTU7Ci0gIHNldF9wYXJhbXNfY2IuUnVuKDAsIHNlbGVjdGVkX3R4X3Bvd2VyKTsKLSAgc2V0X2FkZHJlc3NfY2IuUnVuKDApOwotICBzZXRfZGF0YV9jYi5SdW4oMCk7Ci0gIHNldF9zY2FuX3Jlc3BfZGF0YV9jYi5SdW4oMCk7Ci0gIGVuYWJsZV9jYi5SdW4oMCk7Ci0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzdGFydF9hZHZlcnRpc2luZ19zZXRfc3RhdHVzKTsKLSAgRVhQRUNUX0VRKHNlbGVjdGVkX3R4X3Bvd2VyLCBzdGFydF9hZHZlcnRpc2luZ19zZXRfdHhfcG93ZXIpOwotICBpbnQgYWR2ZXJ0aXNlcl9pZCA9IHN0YXJ0X2FkdmVydGlzaW5nX3NldF9hZHZlcnRpc2VyX2lkOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICAvLyAuLi4gYWR2ZXJ0aXNpbmcgLi4uCi0KLSAgLy8gRGlzYWJsZSBhZHZlcnRpc2VyCi0gIHN0YXR1c19jYiBkaXNhYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIEVuYWJsZSgweDAwIC8qIGRpc2FibGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICBBbGxPZihTaXplSXMoMSksIENvbnRhaW5zKEZpZWxkKCZTZXRFbmFibGVEYXRhOjpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQpKSksCi0gICAgICAgICAgICAgICAgICAgICBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJmRpc2FibGVfY2IpKTsKLSAgc3RhdHVzX2NiIHJlbW92ZV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBSZW1vdmVBZHZlcnRpc2luZ1NldChhZHZlcnRpc2VyX2lkLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnJlbW92ZV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5VbnJlZ2lzdGVyKGFkdmVydGlzZXJfaWQpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICBkaXNhYmxlX2NiLlJ1bigwKTsKLSAgcmVtb3ZlX2NiLlJ1bigwKTsKLX0KLQotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3Rfc3RhcnRfYWR2ZXJ0aXNpbmdfc2V0X3BhcmFtc19mYWlsZWQpIHsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6UmVnaXN0cmF0aW9uQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHJlZ19zdGF0dXMpOwotICBpbnQgYWR2ZXJ0aXNlcl9pZCA9IHJlZ19pbnN0X2lkOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3A7Ci0gIHRCVE1fQkxFX0FEVl9QQVJBTVMgcGFyYW1zOwotCi0gIHBhcmFtZXRlcnNfY2Igc2V0X3BhcmFtc19jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQYXJhbWV0ZXJzMShhZHZlcnRpc2VyX2lkLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQYXJhbWV0ZXJzMihfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Nz4oJnNldF9wYXJhbXNfY2IpKTsKLQotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldEFkdmVydGlzaW5nRGF0YShhZHZlcnRpc2VyX2lkLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcyhFeGFjdGx5KDApKTsKLQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TdGFydEFkdmVydGlzaW5nKAotICAgICAgYWR2ZXJ0aXNlcl9pZCwKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlN0YXJ0QWR2ZXJ0aXNpbmdDYiwKLSAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCi0gICAgICAmcGFyYW1zLCBhZHZfZGF0YSwgc2Nhbl9yZXNwLCAwLCBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPigpKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgLy8gc2V0IHBhcmFtcyBmYWlsZWQKLSAgc2V0X3BhcmFtc19jYi5SdW4oMHgwMSwgMCk7Ci0KLSAgLy8gRXhwZWN0IHRoZSB3aG9sZSBmbG93IHRvIGZhaWwgcmlnaHQgYXdheQotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfRkFJTFVSRSwgc3RhcnRfYWR2ZXJ0aXNpbmdfc3RhdHVzKTsKLX0KLQotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3RfZGF0YV9zZW5kZXIpIHsKLSAgLy8gcHJlcGFyZSB0ZXN0IGlucHV0IHZlY3RvcgotICBjb25zdCBpbnQgbWF4X2RhdGFfc2l6ZSA9IDE2NTA7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEobWF4X2RhdGFfc2l6ZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4X2RhdGFfc2l6ZTsgaSsrKSBkYXRhW2ldID0gaTsKLQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5SZWdpc3RlckFkdmVydGlzZXIoCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpSZWdpc3RyYXRpb25DYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgcmVnX3N0YXR1cyk7Ci0gIGludCBhZHZlcnRpc2VyX2lkID0gcmVnX2luc3RfaWQ7Ci0KLSAgc3RhdHVzX2NiIHNldF9kYXRhX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldEFkdmVydGlzaW5nRGF0YShhZHZlcnRpc2VyX2lkLCBGSVJTVCwgXywgMjUxLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8NT4oJnNldF9kYXRhX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywKLSAgICAgICAgICAgICAgU2V0QWR2ZXJ0aXNpbmdEYXRhKGFkdmVydGlzZXJfaWQsIElOVEVSTUVESUFURSwgXywgMjUxLCBfLCBfKSkKLSAgICAgIC5UaW1lcyg1KQotICAgICAgLldpbGxSZXBlYXRlZGx5KFNhdmVBcmc8NT4oJnNldF9kYXRhX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKGFkdmVydGlzZXJfaWQsIExBU1QsIF8sIDE0NCwgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TZXREYXRhKAotICAgICAgYWR2ZXJ0aXNlcl9pZCwgZmFsc2UsIGRhdGEsCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXREYXRhQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKLSAgICBzZXRfZGF0YV9jYi5SdW4oMHgwMCk7Ci0gIH0KLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0gIC8vIEV4cGVjdCB0aGUgd2hvbGUgZmxvdyB0byBzdWNjZWVkCi0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzZXRfZGF0YV9zdGF0dXMpOwotCi0gIC8vICoqKioqKioqKioqKioqKioqIFRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBkYXRhIHNpemUgKioqKioqKioqKioqKioqKioqKioqCi0gIGRhdGEucmVzaXplKDUwMyk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKGFkdmVydGlzZXJfaWQsIEZJUlNULCBfLCAyNTEsIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLAotICAgICAgICAgICAgICBTZXRBZHZlcnRpc2luZ0RhdGEoYWR2ZXJ0aXNlcl9pZCwgSU5URVJNRURJQVRFLCBfLCAyNTEsIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRBZHZlcnRpc2luZ0RhdGEoYWR2ZXJ0aXNlcl9pZCwgTEFTVCwgXywgMSwgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TZXREYXRhKAotICAgICAgYWR2ZXJ0aXNlcl9pZCwgZmFsc2UsIGRhdGEsCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTZXREYXRhQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBzZXRfZGF0YV9jYi5SdW4oMHgwMCk7Ci0gIH0KLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0gIC8vIEV4cGVjdCB0aGUgd2hvbGUgZmxvdyB0byBzdWNjZWVkCi0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzZXRfZGF0YV9zdGF0dXMpOwotCi0gIC8vICoqKioqKioqKioqKioqKioqIFRyeSBhZ2FpbiB3aXRoIGRpZmZlcmVudCBkYXRhIHNpemUgKioqKioqKioqKioqKioqKioqKioqCi0gIGRhdGEucmVzaXplKDUwMik7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKGFkdmVydGlzZXJfaWQsIEZJUlNULCBfLCAyNTEsIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRBZHZlcnRpc2luZ0RhdGEoYWR2ZXJ0aXNlcl9pZCwgTEFTVCwgXywgMjUxLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8NT4oJnNldF9kYXRhX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlNldERhdGEoCi0gICAgICBhZHZlcnRpc2VyX2lkLCBmYWxzZSwgZGF0YSwKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlNldERhdGFDYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgIHNldF9kYXRhX2NiLlJ1bigweDAwKTsKLSAgfQotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLSAgLy8gRXhwZWN0IHRoZSB3aG9sZSBmbG93IHRvIHN1Y2NlZWQKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHNldF9kYXRhX3N0YXR1cyk7Ci0KLSAgLy8gKioqKioqKioqKioqKioqKiogVHJ5IGFnYWluIHdpdGggZGlmZmVyZW50IGRhdGEgc2l6ZSAqKioqKioqKioqKioqKioqKioqKioKLSAgZGF0YS5yZXNpemUoNTAxKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRBZHZlcnRpc2luZ0RhdGEoYWR2ZXJ0aXNlcl9pZCwgRklSU1QsIF8sIDI1MSwgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldEFkdmVydGlzaW5nRGF0YShhZHZlcnRpc2VyX2lkLCBMQVNULCBfLCAyNTAsIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+U2V0RGF0YSgKLSAgICAgIGFkdmVydGlzZXJfaWQsIGZhbHNlLCBkYXRhLAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U2V0RGF0YUNiLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgc2V0X2RhdGFfY2IuUnVuKDB4MDApOwotICB9Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotICAvLyBFeHBlY3QgdGhlIHdob2xlIGZsb3cgdG8gc3VjY2VlZAotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgc2V0X2RhdGFfc3RhdHVzKTsKLQotICAvLyAqKioqKioqKioqKioqKioqKiBUcnkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgZGF0YSBzaXplICoqKioqKioqKioqKioqKioqKioqKgotICBkYXRhLnJlc2l6ZSgyNTEpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIFNldEFkdmVydGlzaW5nRGF0YShhZHZlcnRpc2VyX2lkLCBDT01QTEVURSwgXywgMjUxLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8NT4oJnNldF9kYXRhX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlNldERhdGEoCi0gICAgICBhZHZlcnRpc2VyX2lkLCBmYWxzZSwgZGF0YSwKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlNldERhdGFDYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBzZXRfZGF0YV9jYi5SdW4oMHgwMCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotICAvLyBFeHBlY3QgdGhlIHdob2xlIGZsb3cgdG8gc3VjY2VlZAotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgc2V0X2RhdGFfc3RhdHVzKTsKLQotICAvLyAqKioqKioqKioqKioqKioqKiBUcnkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgZGF0YSBzaXplICoqKioqKioqKioqKioqKioqKioqKgotICBkYXRhLnJlc2l6ZSgxMjApOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIFNldEFkdmVydGlzaW5nRGF0YShhZHZlcnRpc2VyX2lkLCBDT01QTEVURSwgXywgMTIwLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8NT4oJnNldF9kYXRhX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlNldERhdGEoCi0gICAgICBhZHZlcnRpc2VyX2lkLCBmYWxzZSwgZGF0YSwKLSAgICAgIEJpbmQoJkJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3Q6OlNldERhdGFDYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICBzZXRfZGF0YV9jYi5SdW4oMHgwMCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotICAvLyBFeHBlY3QgdGhlIHdob2xlIGZsb3cgdG8gc3VjY2VlZAotICBFWFBFQ1RfRVEoQlRNX0JMRV9NVUxUSV9BRFZfU1VDQ0VTUywgc2V0X2RhdGFfc3RhdHVzKTsKLQotICAvLyAqKioqKioqKioqKioqKioqKiBUcnkgYWdhaW4gd2l0aCBkaWZmZXJlbnQgZGF0YSBzaXplICoqKioqKioqKioqKioqKioqKioqKgotICBkYXRhLnJlc2l6ZSgwKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLAotICAgICAgICAgICAgICBTZXRBZHZlcnRpc2luZ0RhdGEoYWR2ZXJ0aXNlcl9pZCwgQ09NUExFVEUsIF8sIDAsIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+U2V0RGF0YSgKLSAgICAgIGFkdmVydGlzZXJfaWQsIGZhbHNlLCBkYXRhLAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U2V0RGF0YUNiLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Ci0gIHNldF9kYXRhX2NiLlJ1bigweDAwKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0gIC8vIEV4cGVjdCB0aGUgd2hvbGUgZmxvdyB0byBzdWNjZWVkCi0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzZXRfZGF0YV9zdGF0dXMpOwotfQotCi0vKiBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IGNvbmVjdGFibGUgYWR2ZXJ0aXNtZW50IHdpdGggdGltZW91dCB3aWxsIGdldCBpdCdzCi0gKiBhZGRyZXNzIHVwZGF0ZWQgb25jZSB0aGUgdGltZW91dCBwYXNzZXMgYW5kIG9uZSB0cmllcyB0byBlbmFibGUgaXQgYWdhaW4uKi8KLVRFU1RfRihCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0LAotICAgICAgIHRlc3RfY29ubmVjdGFibGVfYWRkcmVzc191cGRhdGVfZHVyaW5nX3RpbWVvdXQpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGE7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcDsKLSAgdEJUTV9CTEVfQURWX1BBUkFNUyBwYXJhbXM7Ci0gIHBhcmFtcy5hZHZlcnRpc2luZ19ldmVudF9wcm9wZXJ0aWVzID0gMHgxIC8qIGNvbm5lY3RhYmxlICovOwotICB0QkxFX1BFUklPRElDX0FEVl9QQVJBTVMgcGVyaW9kaWNfcGFyYW1zOwotICBwZXJpb2RpY19wYXJhbXMuZW5hYmxlID0gZmFsc2U7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlcmlvZGljX2RhdGE7Ci0KLSAgdWludDhfdCBtYXhFeHRBZHZFdmVudHMgPSA1MDsKLQotICBwYXJhbWV0ZXJzX2NiIHNldF9wYXJhbXNfY2I7Ci0gIHN0YXR1c19jYiBzZXRfYWRkcmVzc19jYjsKLSAgc3RhdHVzX2NiIHNldF9kYXRhX2NiOwotICBzdGF0dXNfY2Igc2V0X3NjYW5fcmVzcF9kYXRhX2NiOwotICBzdGF0dXNfY2IgZW5hYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFBhcmFtZXRlcnMxKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQYXJhbWV0ZXJzMihfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Nz4oJnNldF9wYXJhbXNfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRSYW5kb21BZGRyZXNzKF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmc2V0X2FkZHJlc3NfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRBZHZlcnRpc2luZ0RhdGEoXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfZGF0YV9jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFNjYW5SZXNwb25zZURhdGEoXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDU+KCZzZXRfc2Nhbl9yZXNwX2RhdGFfY2IpKTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqaGNpX21vY2ssCi0gICAgICBFbmFibGUoCi0gICAgICAgICAgMHgwMSAvKiBlbmFibGUgKi8sCi0gICAgICAgICAgQWxsT2YoU2l6ZUlzKDEpLAotICAgICAgICAgICAgICAgIENvbnRhaW5zKEZpZWxkKCZTZXRFbmFibGVEYXRhOjptYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4dEFkdkV2ZW50cykpKSwKLSAgICAgICAgICBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJmVuYWJsZV9jYikpOwotCi0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlN0YXJ0QWR2ZXJ0aXNpbmdTZXQoCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTdGFydEFkdmVydGlzaW5nU2V0Q2IsCi0gICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgJnBhcmFtcywgYWR2X2RhdGEsIHNjYW5fcmVzcCwgJnBlcmlvZGljX3BhcmFtcywgcGVyaW9kaWNfZGF0YSwKLSAgICAgIDAgLyogZHVyYXRpb24gKi8sIG1heEV4dEFkdkV2ZW50cywgQmluZChEb05vdGhpbmcyKSk7Ci0KLSAgLy8gd2UgYXJlIGEgdHJ1bHkgZ3JhY2lvdXMgZmFrZSBjb250cm9sbGVyLCBsZXQgdGhlIGNvbW1hbmRzIHN1Y2NlZWQhCi0gIGludCBzZWxlY3RlZF90eF9wb3dlciA9IC0xNTsKLSAgc2V0X3BhcmFtc19jYi5SdW4oMCwgc2VsZWN0ZWRfdHhfcG93ZXIpOwotICBzZXRfYWRkcmVzc19jYi5SdW4oMCk7Ci0gIHNldF9kYXRhX2NiLlJ1bigwKTsKLSAgc2V0X3NjYW5fcmVzcF9kYXRhX2NiLlJ1bigwKTsKLSAgZW5hYmxlX2NiLlJ1bigwKTsKLSAgRVhQRUNUX0VRKEJUTV9CTEVfTVVMVElfQURWX1NVQ0NFU1MsIHN0YXJ0X2FkdmVydGlzaW5nX3NldF9zdGF0dXMpOwotICBFWFBFQ1RfRVEoc2VsZWN0ZWRfdHhfcG93ZXIsIHN0YXJ0X2FkdmVydGlzaW5nX3NldF90eF9wb3dlcik7Ci0gIGludCBhZHZlcnRpc2VyX2lkID0gc3RhcnRfYWR2ZXJ0aXNpbmdfc2V0X2FkdmVydGlzZXJfaWQ7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotCi0gIC8vIC4uLiBhZHZlcnRpc2luZyAuLi4KLQotICAvLyBObyBIQ0kgY2FsbHMgc2hvdWxkIGJlIHRyaWdnZXJlZCwgYmVjdWFzZSB0aGVyZSBpcyBhIHRpbWVvdXQgb24gYQotICAvLyBjb25uZWN0YWJsZSBhZHZlcnRpc2VtZW50LgotICBUcmlnZ2VyUmFuZG9tQWRkcmVzc1VwZGF0ZSgpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICAvLyBTZXQgdGVybWluYXRlZCBiZWNhdXNlIHdlIGFkdmVydGlzZWQgbWF4RXh0QWR2RXZlbnRzIHRpbWVzIQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5PbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZCgKLSAgICAgIDB4NDMgLypzdGF0dXMgKi8sIGFkdmVydGlzZXJfaWQsIDB4MDAgLyogY29ubl9oYW5kbGUqLywgbWF4RXh0QWR2RXZlbnRzKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgLy8gVHJ5IHRvIEVuYWJsZSB0aGUgYWR2ZXJ0aXNlci4gSXQgc2hvdWxkIGZpcnN0IHVwZGF0ZSBpdCdzIHJhbmRvbSBhZGRyZXNzLgotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFJhbmRvbUFkZHJlc3MoXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZzZXRfYWRkcmVzc19jYikpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpoY2lfbW9jaywKLSAgICAgIEVuYWJsZSgKLSAgICAgICAgICAweDAxIC8qIGVuYWJsZSAqLywKLSAgICAgICAgICBBbGxPZihTaXplSXMoMSksCi0gICAgICAgICAgICAgICAgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6Om1heF9leHRlbmRlZF9hZHZlcnRpc2luZ19ldmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXh0QWR2RXZlbnRzKSkpLAotICAgICAgICAgIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZW5hYmxlX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPkVuYWJsZSgKLSAgICAgIGFkdmVydGlzZXJfaWQsIHRydWUsCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpFbmFibGVDYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksIDAsCi0gICAgICBtYXhFeHRBZHZFdmVudHMsIEJpbmQoRG9Ob3RoaW5nKSk7Ci0gIHNldF9hZGRyZXNzX2NiLlJ1bigwKTsKLSAgZW5hYmxlX2NiLlJ1bigwKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgLy8gRGlzYWJsZSBhZHZlcnRpc2VyCi0gIHN0YXR1c19jYiBkaXNhYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssCi0gICAgICAgICAgICAgIEVuYWJsZSgweDAwIC8qIGRpc2FibGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICBBbGxPZihTaXplSXMoMSksIENvbnRhaW5zKEZpZWxkKCZTZXRFbmFibGVEYXRhOjpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQpKSksCi0gICAgICAgICAgICAgICAgICAgICBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJmRpc2FibGVfY2IpKTsKLSAgc3RhdHVzX2NiIHJlbW92ZV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBSZW1vdmVBZHZlcnRpc2luZ1NldChhZHZlcnRpc2VyX2lkLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MT4oJnJlbW92ZV9jYikpOwotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5VbnJlZ2lzdGVyKGFkdmVydGlzZXJfaWQpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICBkaXNhYmxlX2NiLlJ1bigwKTsKLSAgcmVtb3ZlX2NiLlJ1bigwKTsKLX0KLQotLyogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBwZXJpb2RpYyBhZHZlcnRpc2luZyBpcyBzdG9wcGVkIGJlZm9yZQotICogdW5yZWdpc3RlcmluZyB0aGUgYWR2ZXJ0aXNlciwgaWYgaXQgd2FzIGVuYWJsZWQuICovCi1URVNUX0YoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgdGVzdF9wZXJpb2RpY19hZHZfZGlzYWJsZV9vbl91bnJlZ2lzdGVyKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3A7Ci0gIHRCVE1fQkxFX0FEVl9QQVJBTVMgcGFyYW1zOwotICBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyA9IDB4MSAvKiBjb25uZWN0YWJsZSAqLzsKLSAgdEJMRV9QRVJJT0RJQ19BRFZfUEFSQU1TIHBlcmlvZGljX3BhcmFtczsKLSAgcGVyaW9kaWNfcGFyYW1zLmVuYWJsZSA9IHRydWU7ICAvLyBlbmFibGUgcGVyaW9kaWMgYWR2ZXJ0aXNpbmcKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGVyaW9kaWNfZGF0YTsKLQotICBwYXJhbWV0ZXJzX2NiIHNldF9wYXJhbXNfY2I7Ci0gIHN0YXR1c19jYiBzZXRfYWRkcmVzc19jYjsKLSAgc3RhdHVzX2NiIHNldF9kYXRhX2NiOwotICBzdGF0dXNfY2Igc2V0X3NjYW5fcmVzcF9kYXRhX2NiOwotICBzdGF0dXNfY2IgZW5hYmxlX2NiOwotICBzdGF0dXNfY2Igc2V0X3BlcmlvZGljX3BhcmFtc19jYjsKLSAgc3RhdHVzX2NiIHNldF9wZXJpb2RpY19kYXRhX2NiOwotICBzdGF0dXNfY2Igc2V0X3BlcmlvZGljX2VuYWJsZV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQYXJhbWV0ZXJzMShfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczIoXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDc+KCZzZXRfcGFyYW1zX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UmFuZG9tQWRkcmVzcyhfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJnNldF9hZGRyZXNzX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRTY2FuUmVzcG9uc2VEYXRhKF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X3NjYW5fcmVzcF9kYXRhX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ1BhcmFtZXRlcnMoXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDQ+KCZzZXRfcGVyaW9kaWNfcGFyYW1zX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGEoXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDQ+KCZzZXRfcGVyaW9kaWNfZGF0YV9jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFBlcmlvZGljQWR2ZXJ0aXNpbmdFbmFibGUoMHgwMSAvKiBlbmFibGUgKi8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmc2V0X3BlcmlvZGljX2VuYWJsZV9jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIEVuYWJsZSgweDAxIC8qIGVuYWJsZSAqLywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZlbmFibGVfY2IpKTsKLQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TdGFydEFkdmVydGlzaW5nU2V0KAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U3RhcnRBZHZlcnRpc2luZ1NldENiLAotICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICZwYXJhbXMsIGFkdl9kYXRhLCBzY2FuX3Jlc3AsICZwZXJpb2RpY19wYXJhbXMsIHBlcmlvZGljX2RhdGEsCi0gICAgICAwIC8qIGR1cmF0aW9uICovLCAwIC8qIG1heEV4dEFkdkV2ZW50cyAqLywgQmluZChEb05vdGhpbmcyKSk7Ci0KLSAgLy8gd2UgYXJlIGEgdHJ1bHkgZ3JhY2lvdXMgZmFrZSBjb250cm9sbGVyLCBsZXQgdGhlIGNvbW1hbmRzIHN1Y2NlZWQhCi0gIGludCBzZWxlY3RlZF90eF9wb3dlciA9IC0xNTsKLSAgc2V0X3BhcmFtc19jYi5SdW4oMCwgc2VsZWN0ZWRfdHhfcG93ZXIpOwotICBzZXRfYWRkcmVzc19jYi5SdW4oMCk7Ci0gIHNldF9kYXRhX2NiLlJ1bigwKTsKLSAgc2V0X3NjYW5fcmVzcF9kYXRhX2NiLlJ1bigwKTsKLSAgc2V0X3BlcmlvZGljX3BhcmFtc19jYi5SdW4oMCk7Ci0gIHNldF9wZXJpb2RpY19kYXRhX2NiLlJ1bigwKTsKLSAgc2V0X3BlcmlvZGljX2VuYWJsZV9jYi5SdW4oMCk7Ci0gIGVuYWJsZV9jYi5SdW4oMCk7Ci0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzdGFydF9hZHZlcnRpc2luZ19zZXRfc3RhdHVzKTsKLSAgRVhQRUNUX0VRKHNlbGVjdGVkX3R4X3Bvd2VyLCBzdGFydF9hZHZlcnRpc2luZ19zZXRfdHhfcG93ZXIpOwotICBpbnQgYWR2ZXJ0aXNlcl9pZCA9IHN0YXJ0X2FkdmVydGlzaW5nX3NldF9hZHZlcnRpc2VyX2lkOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICAvLyAuLi4gYWR2ZXJ0aXNpbmcgLi4uCi0KLSAgLy8gVW5yZWdpc3RlciBhZHZlcnRpc2VyIC0gc2hvdWxkIGRpc2FibGUgcGVyaW9kaWMgYWR2ZXJ0aXNpbmcKLSAgc3RhdHVzX2NiIGRpc2FibGVfY2I7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywKLSAgICAgICAgICAgICAgRW5hYmxlKDB4MDAgLyogZGlzYWJsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgIEFsbE9mKFNpemVJcygxKSwgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6OmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcl9pZCkpKSwKLSAgICAgICAgICAgICAgICAgICAgIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZGlzYWJsZV9jYikpOwotICBzdGF0dXNfY2IgZGlzYWJsZV9wZXJpb2RpY19jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nRW5hYmxlKDB4MDAgLyogZGlzYWJsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQsIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwyPigmZGlzYWJsZV9wZXJpb2RpY19jYikpOwotICBzdGF0dXNfY2IgcmVtb3ZlX2NiOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFJlbW92ZUFkdmVydGlzaW5nU2V0KGFkdmVydGlzZXJfaWQsIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwxPigmcmVtb3ZlX2NiKSk7Ci0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlVucmVnaXN0ZXIoYWR2ZXJ0aXNlcl9pZCk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotCi0gIGRpc2FibGVfY2IuUnVuKDApOwotICBkaXNhYmxlX3BlcmlvZGljX2NiLlJ1bigwKTsKLSAgcmVtb3ZlX2NiLlJ1bigwKTsKLX0KLQotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3Rfc3VzcGVuZF9yZXN1bWUpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+UmVnaXN0ZXJBZHZlcnRpc2VyKEJpbmQoCi0gICAgICAgICZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpSZWdpc3RyYXRpb25DYiwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwotICAgIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCByZWdfc3RhdHVzKTsKLSAgICBFWFBFQ1RfRVEoaSwgcmVnX2luc3RfaWQpOwotICB9Ci0KLSAgc3RkOjphcnJheTxpbnQsIDM+IGVuYWJsZWQgPSB7ezEsIDMsIDl9fTsKLQotICBmb3IgKGludCBhZHZlcnRpc2VyX2lkIDogZW5hYmxlZCkgewotICAgIHN0YXR1c19jYiBlbmFibGVfY2I7Ci0gICAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLAotICAgICAgICAgICAgICAgIEVuYWJsZSgweDAxIC8qIGVuYWJsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgQWxsT2YoU2l6ZUlzKDEpLCBDb250YWlucyhGaWVsZCgmU2V0RW5hYmxlRGF0YTo6aGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJfaWQpKSksCi0gICAgICAgICAgICAgICAgICAgICAgIF8pKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJmVuYWJsZV9jYikpOwotICAgIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPkVuYWJsZSgKLSAgICAgICAgYWR2ZXJ0aXNlcl9pZCwgdHJ1ZSwKLSAgICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6RW5hYmxlQ2IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLCAwLAotICAgICAgICAwLCBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPigpKTsKLSAgICBlbmFibGVfY2IuUnVuKDApOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotICB9Ci0KLSAgLy8gd2UgaGF2ZSBzb21lIGFkdmVydGlzZXJzIHJlZ2lzdGVyZWQsIHRocmVlIGFkdmVydGlzaW5nLgotCi0gIC8vIENhbGwgdG8gU3VzcGVuZCgpIHNob3VsZCBkaXNhYmxlIGFsbCBydW5uaW5nIGFkdmVydGlzZXJzCi0gIHN0YXR1c19jYiBkaXNhYmxlX2NiOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpoY2lfbW9jaywKLSAgICAgIEVuYWJsZSgweDAwIC8qIGRpc2FibGUgKi8sCi0gICAgICAgICAgICAgQWxsT2YoU2l6ZUlzKDMpLCBDb250YWlucyhGaWVsZCgmU2V0RW5hYmxlRGF0YTo6aGFuZGxlLCAxKSksCi0gICAgICAgICAgICAgICAgICAgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6OmhhbmRsZSwgMykpLAotICAgICAgICAgICAgICAgICAgIENvbnRhaW5zKEZpZWxkKCZTZXRFbmFibGVEYXRhOjpoYW5kbGUsIDkpKSksCi0gICAgICAgICAgICAgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZkaXNhYmxlX2NiKSk7Ci0KLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+U3VzcGVuZCgpOwotCi0gIGRpc2FibGVfY2IuUnVuKDApOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICAvLyBDYWxsIHRvIFJlc3VtZSgpIHNob3VsZCByZS1lbmFibGUgYWR2ZXJ0aXNlcnMKLSAgc3RhdHVzX2NiIGVuYWJsZV9jYjsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqaGNpX21vY2ssCi0gICAgICBFbmFibGUoMHgwMSAvKiBlbmFibGUgKi8sCi0gICAgICAgICAgICAgQWxsT2YoU2l6ZUlzKDMpLCBDb250YWlucyhGaWVsZCgmU2V0RW5hYmxlRGF0YTo6aGFuZGxlLCAxKSksCi0gICAgICAgICAgICAgICAgICAgQ29udGFpbnMoRmllbGQoJlNldEVuYWJsZURhdGE6OmhhbmRsZSwgMykpLAotICAgICAgICAgICAgICAgICAgIENvbnRhaW5zKEZpZWxkKCZTZXRFbmFibGVEYXRhOjpoYW5kbGUsIDkpKSksCi0gICAgICAgICAgICAgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZlbmFibGVfY2IpKTsKLQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5SZXN1bWUoKTsKLQotICBlbmFibGVfY2IuUnVuKDApOwotCi0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoaGNpX21vY2suZ2V0KCkpOwotfQotCi0vKiBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IGNvbmVjdGFibGUgYWR2ZXJ0aXNtZW50IHdpdGggdGltZW91dCB3aWxsIGdldCBpdCdzCi0gKiBkdXJhdGlvbiBhbmQgbWF4RXh0QWR2RXZlbnRzIHVwZGF0ZWQsIHdoZW4gaXQncyB0ZXJtaW5hdGVkIGR1ZSB0byBpbmNvbWluZwotICogY29ubmVjdGlvbi4qLwotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3RfZHVyYXRpb25fdXBkYXRlX2R1cmluZ190aW1lb3V0KSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3A7Ci0gIHRCVE1fQkxFX0FEVl9QQVJBTVMgcGFyYW1zOwotICBwYXJhbXMuYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllcyA9IDB4MSAvKiBjb25uZWN0YWJsZSAqLzsKLSAgcGFyYW1zLmFkdl9pbnRfbWluID0gcGFyYW1zLmFkdl9pbnRfbWF4ID0gMHhBMCAvKiAxMDBtcyAqLzsKLSAgdEJMRV9QRVJJT0RJQ19BRFZfUEFSQU1TIHBlcmlvZGljX3BhcmFtczsKLSAgcGVyaW9kaWNfcGFyYW1zLmVuYWJsZSA9IGZhbHNlOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwZXJpb2RpY19kYXRhOwotCi0gIHVpbnQ4X3QgbWF4RXh0QWR2RXZlbnRzID0gNTA7Ci0gIHVpbnQxNl90IGR1cmF0aW9uID0gNTAwIC8qIDVzICovOwotCi0gIHBhcmFtZXRlcnNfY2Igc2V0X3BhcmFtc19jYjsKLSAgc3RhdHVzX2NiIHNldF9hZGRyZXNzX2NiOwotICBzdGF0dXNfY2Igc2V0X2RhdGFfY2I7Ci0gIHN0YXR1c19jYiBzZXRfc2Nhbl9yZXNwX2RhdGFfY2I7Ci0gIHN0YXR1c19jYiBlbmFibGVfY2I7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczEoXywgXywgXywgXywgXywgXywgXywgXywgXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFBhcmFtZXRlcnMyKF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw3Pigmc2V0X3BhcmFtc19jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldFJhbmRvbUFkZHJlc3MoXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZzZXRfYWRkcmVzc19jYikpOwotICBFWFBFQ1RfQ0FMTCgqaGNpX21vY2ssIFNldEFkdmVydGlzaW5nRGF0YShfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8NT4oJnNldF9kYXRhX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0U2NhblJlc3BvbnNlRGF0YShfLCBfLCBfLCBfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8NT4oJnNldF9zY2FuX3Jlc3BfZGF0YV9jYikpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpoY2lfbW9jaywKLSAgICAgIEVuYWJsZSgweDAxIC8qIGVuYWJsZSAqLywKLSAgICAgICAgICAgICBBbGxPZihTaXplSXMoMSksCi0gICAgICAgICAgICAgICAgICAgQ29udGFpbnMoQWxsT2YoCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkKCZTZXRFbmFibGVEYXRhOjptYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFeHRBZHZFdmVudHMpLAotICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCgmU2V0RW5hYmxlRGF0YTo6ZHVyYXRpb24sIGR1cmF0aW9uKSkpKSwKLSAgICAgICAgICAgICBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJmVuYWJsZV9jYikpOwotCi0gIEJsZUFkdmVydGlzaW5nTWFuYWdlcjo6R2V0KCktPlN0YXJ0QWR2ZXJ0aXNpbmdTZXQoCi0gICAgICBCaW5kKCZCbGVBZHZlcnRpc2luZ01hbmFnZXJUZXN0OjpTdGFydEFkdmVydGlzaW5nU2V0Q2IsCi0gICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAotICAgICAgJnBhcmFtcywgYWR2X2RhdGEsIHNjYW5fcmVzcCwgJnBlcmlvZGljX3BhcmFtcywgcGVyaW9kaWNfZGF0YSwgZHVyYXRpb24sCi0gICAgICBtYXhFeHRBZHZFdmVudHMsIEJpbmQoRG9Ob3RoaW5nMikpOwotCi0gIC8vIHdlIGFyZSBhIHRydWx5IGdyYWNpb3VzIGZha2UgY29udHJvbGxlciwgbGV0IHRoZSBjb21tYW5kcyBzdWNjZWVkIQotICBpbnQgc2VsZWN0ZWRfdHhfcG93ZXIgPSAtMTU7Ci0gIHNldF9wYXJhbXNfY2IuUnVuKDAsIHNlbGVjdGVkX3R4X3Bvd2VyKTsKLSAgc2V0X2FkZHJlc3NfY2IuUnVuKDApOwotICBzZXRfZGF0YV9jYi5SdW4oMCk7Ci0gIHNldF9zY2FuX3Jlc3BfZGF0YV9jYi5SdW4oMCk7Ci0gIGVuYWJsZV9jYi5SdW4oMCk7Ci0gIEVYUEVDVF9FUShCVE1fQkxFX01VTFRJX0FEVl9TVUNDRVNTLCBzdGFydF9hZHZlcnRpc2luZ19zZXRfc3RhdHVzKTsKLSAgRVhQRUNUX0VRKHNlbGVjdGVkX3R4X3Bvd2VyLCBzdGFydF9hZHZlcnRpc2luZ19zZXRfdHhfcG93ZXIpOwotICBpbnQgYWR2ZXJ0aXNlcl9pZCA9IHN0YXJ0X2FkdmVydGlzaW5nX3NldF9hZHZlcnRpc2VyX2lkOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLQotICAvLyAuLi4gYWR2ZXJ0aXNpbmcgLi4uCi0KLSAgc2xlZXAoMSk7Ci0KLSAgc3RkOjp2ZWN0b3I8U2V0RW5hYmxlRGF0YT4gc2V0RW5hYmxlRGF0YTsKLSAgLy8gU2V0IHRlcm1pbmF0ZWQgYmVjYXVzZSB3ZSByZWNlaXZlZCBjb25uZWN0IHJlcXVlc3QhIFNob3VsZCB0cmlnZ2VyCi0gIC8vIHJlLWVuYWJsaW5nIG9mIHRoZSBzZXQKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBFbmFibGUoMHgwMSAvKiBlbmFibGUgKi8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwxPigmc2V0RW5hYmxlRGF0YSksIFNhdmVBcmc8Mj4oJmVuYWJsZV9jYikpKTsKLQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5PbkFkdmVydGlzaW5nU2V0VGVybWluYXRlZCgKLSAgICAgIDB4MDAgLyogQWR2ZXJ0aXNpbmcgc3VjY2Vzc2Z1bGx5IGVuZGVkIHdpdGggYSBjb25uZWN0aW9uIGJlaW5nIGNyZWF0ZWQgKi8sCi0gICAgICBhZHZlcnRpc2VyX2lkLCAweDAxZmUgLyogY29ubl9oYW5kbGUqLywgMjAgLyogY29tcGxldGVkIEV4dEFkdkV2ZW50cyAqLyk7Ci0gIGVuYWJsZV9jYi5SdW4oMCk7Ci0KLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgdWludDE2X3QgbmV3X2R1cmF0aW9uID0gc2V0RW5hYmxlRGF0YVswXS5kdXJhdGlvbjsKLSAgdWludDhfdCBuZXdfZXh0QWR2RXZlbnRzID0gc2V0RW5hYmxlRGF0YVswXS5tYXhfZXh0ZW5kZWRfYWR2ZXJ0aXNpbmdfZXZlbnRzOwotCi0gIC8vIFNsZWVwIGlzIG5vdCBzdXBlci1hY2N1cmF0ZSwgc28gYXNzdW1lIHRoZSByZWNvbXB1dGVkIHRpbWVvdXRzIGFyZSBhcm91bmQKLSAgLy8gNHMgKy8tIDEwMG1zCi0gIEVYUEVDVF9ORUFSKChkdXJhdGlvbiAtIG5ld19kdXJhdGlvbiksIDEwMCAvKjRzICovLCAxMCk7Ci0gIEVYUEVDVF9ORUFSKChtYXhFeHRBZHZFdmVudHMgLSBuZXdfZXh0QWR2RXZlbnRzKSwgMTAsIDEpOwotCi0gIC8vIERpc2FibGUgYWR2ZXJ0aXNlcgotICBzdGF0dXNfY2IgZGlzYWJsZV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLAotICAgICAgICAgICAgICBFbmFibGUoMHgwMCAvKiBkaXNhYmxlICovLAotICAgICAgICAgICAgICAgICAgICAgQWxsT2YoU2l6ZUlzKDEpLCBDb250YWlucyhGaWVsZCgmU2V0RW5hYmxlRGF0YTo6aGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyX2lkKSkpLAotICAgICAgICAgICAgICAgICAgICAgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDI+KCZkaXNhYmxlX2NiKSk7Ci0gIHN0YXR1c19jYiByZW1vdmVfY2I7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgUmVtb3ZlQWR2ZXJ0aXNpbmdTZXQoYWR2ZXJ0aXNlcl9pZCwgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDE+KCZyZW1vdmVfY2IpKTsKLSAgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKS0+VW5yZWdpc3RlcihhZHZlcnRpc2VyX2lkKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhoY2lfbW9jay5nZXQoKSk7Ci0KLSAgZGlzYWJsZV9jYi5SdW4oMCk7Ci0gIHJlbW92ZV9jYi5SdW4oMCk7Ci19Ci0KLS8qIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHN0YWNrIGNsZWFudXAsIGFuZCBzaHV0ZG93biBoYXBwZW5pbmcgd2hpbGUgdGhlcmUgaXMKLSAqIG91dHN0YW5kaW5nIEhDSSBjb21tYW5kIGlzIG5vdCB0cmlnZ2VyaW5nIHRoZSBjYWxsYmFjayAqLwotVEVTVF9GKEJsZUFkdmVydGlzaW5nTWFuYWdlclRlc3QsIHRlc3RfY2xlYW51cF9kdXJpbmdfZXhlY3V0aW9uKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3A7Ci0gIHRCVE1fQkxFX0FEVl9QQVJBTVMgcGFyYW1zOwotICB0QkxFX1BFUklPRElDX0FEVl9QQVJBTVMgcGVyaW9kaWNfcGFyYW1zOwotICBwZXJpb2RpY19wYXJhbXMuZW5hYmxlID0gZmFsc2U7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlcmlvZGljX2RhdGE7Ci0KLSAgcGFyYW1ldGVyc19jYiBzZXRfcGFyYW1zX2NiOwotICBzdGF0dXNfY2Igc2V0X2FkZHJlc3NfY2I7Ci0gIHN0YXR1c19jYiBzZXRfZGF0YV9jYjsKLSAgRVhQRUNUX0NBTEwoKmhjaV9tb2NrLCBTZXRQYXJhbWV0ZXJzMShfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UGFyYW1ldGVyczIoXywgXywgXywgXywgXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShTYXZlQXJnPDc+KCZzZXRfcGFyYW1zX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0UmFuZG9tQWRkcmVzcyhfLCBfLCBfKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFNhdmVBcmc8Mj4oJnNldF9hZGRyZXNzX2NiKSk7Ci0gIEVYUEVDVF9DQUxMKCpoY2lfbW9jaywgU2V0QWR2ZXJ0aXNpbmdEYXRhKF8sIF8sIF8sIF8sIF8sIF8pKQotICAgICAgLlRpbWVzKDEpCi0gICAgICAuV2lsbE9uY2UoU2F2ZUFyZzw1Pigmc2V0X2RhdGFfY2IpKTsKLQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5TdGFydEFkdmVydGlzaW5nU2V0KAotICAgICAgQmluZCgmQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdDo6U3RhcnRBZHZlcnRpc2luZ1NldENiLAotICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgICZwYXJhbXMsIGFkdl9kYXRhLCBzY2FuX3Jlc3AsICZwZXJpb2RpY19wYXJhbXMsIHBlcmlvZGljX2RhdGEsCi0gICAgICAwIC8qIGR1cmF0aW9uICovLCAwIC8qIG1heEV4dEFkdkV2ZW50cyAqLywgQmluZChEb05vdGhpbmcyKSk7Ci0KLSAgLy8gd2UgYXJlIGEgdHJ1bHkgZ3JhY2lvdXMgZmFrZSBjb250cm9sbGVyLCBsZXQgdGhlIGNvbW1hbmRzIHN1Y2NlZWQhCi0gIGludCBzZWxlY3RlZF90eF9wb3dlciA9IC0xNTsKLSAgc2V0X3BhcmFtc19jYi5SdW4oMCwgc2VsZWN0ZWRfdHhfcG93ZXIpOwotICBzZXRfYWRkcmVzc19jYi5SdW4oMCk7Ci0KLSAgLy8gU29tZW9uZSBzaHV0IGRvd24gdGhlIHN0YWNrIGluIHRoZSBtaWRkbGUgb2YgZmxvdywgd2hlbiB0aGUgSENJIFNldAotICAvLyBBZHZlcnRpc2UgRGF0YSB3YXMgc2NoZWR1bGVkIQotICBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkdldCgpLT5DbGVhblVwKCk7Ci0KLSAgLy8gVGhlIEhDSSBjYWxsIHJldHVybnMgd2l0aCBzdGF0dXMsIGFuZCB0cmllcyB0byBleGVjdXRlIHRoZSBjYWxsYmFjay4gVGhpcwotICAvLyBzaG91bGQganVzdCBzaWxlbnRseSBkcm9wIHRoZSBjYWxsLiBJZiBpdCBnb3QgZXhlY3V0ZWQsIHdlIHdvdWxkIGdldCBjcmFzaCwKLSAgLy8gYmVjYXVzZSBCbGVBZHZlcnRpc2luZ01hbmFnZXIgb2JqZWN0IHdhcyBhbHJlYWR5IGRlbGV0ZWQuCi0gIHNldF9kYXRhX2NiLlJ1bigwKTsKLQotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGhjaV9tb2NrLmdldCgpKTsKLX0KLQotZXh0ZXJuIHZvaWQgdGVzdFJlY29tcHV0ZVRpbWVvdXQxKCk7Ci1leHRlcm4gdm9pZCB0ZXN0UmVjb21wdXRlVGltZW91dDIoKTsKLWV4dGVybiB2b2lkIHRlc3RSZWNvbXB1dGVUaW1lb3V0MygpOwotCi1URVNUX0YoQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyVGVzdCwgdGVzdF9yZWNvbXB1dGVfdGltZW91dCkgewotICB0ZXN0UmVjb21wdXRlVGltZW91dDEoKTsKLSAgdGVzdFJlY29tcHV0ZVRpbWVvdXQyKCk7Ci0gIHRlc3RSZWNvbXB1dGVUaW1lb3V0MygpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9idG0vcGVlcl9wYWNrZXRfdHlwZXNfdGVzdC5jYyBiL3N0YWNrL3Rlc3QvYnRtL3BlZXJfcGFja2V0X3R5cGVzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiODQ4NTMuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9idG0vcGVlcl9wYWNrZXRfdHlwZXNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJzdGFjay9hY2wvcGVlcl9wYWNrZXRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X3R5cGVzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIHRlc3Rpbmc6Ok5vdE51bGw7Ci11c2luZyB0ZXN0aW5nOjpQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuOwotdXNpbmcgdGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmdQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6U3RyRXE7Ci11c2luZyB0ZXN0aW5nOjpTdHJpY3RNb2NrOwotdXNpbmcgdGVzdGluZzo6VGVzdDsKLQotY2xhc3MgUGVlclBhY2tldFRlc3QgOiBwdWJsaWMgVGVzdCB7Ci0gcHVibGljOgotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotfTsKLQotVEVTVF9GKFBlZXJQYWNrZXRUZXN0LCBhbGxfb25lcykgewotICBjb25zdCBCRF9GRUFUVVJFUyBiZF9mZWF0dXJlcyA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLSAgUGVlclBhY2tldFR5cGVzIHBlZXJfcGFja2V0X3R5cGVzKGJkX2ZlYXR1cmVzKTsKLSAgQVNTRVJUX0VRKHBlZXJfcGFja2V0X3R5cGVzLmFjbC5zdXBwb3J0ZWQsIDB4Y2MxOCk7Ci0gIEFTU0VSVF9FUShwZWVyX3BhY2tldF90eXBlcy5hY2wudW5zdXBwb3J0ZWQsIDB4MCk7Ci19Ci0KLVRFU1RfRihQZWVyUGFja2V0VGVzdCwgM1NMT1RfREgzX0RNMykgewotICBjb25zdCBCRF9GRUFUVVJFUyBiZF9mZWF0dXJlcyA9IHsweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgUGVlclBhY2tldFR5cGVzIHBlZXJfcGFja2V0X3R5cGVzKGJkX2ZlYXR1cmVzKTsKLSAgQVNTRVJUX0VRKHBlZXJfcGFja2V0X3R5cGVzLmFjbC5zdXBwb3J0ZWQsIDB4MGMxOCk7Ci0gIEFTU0VSVF9FUShwZWVyX3BhY2tldF90eXBlcy5hY2wudW5zdXBwb3J0ZWQsIDB4MzMwNik7Ci19Ci0KLVRFU1RfRihQZWVyUGFja2V0VGVzdCwgNVNMT1RfREg1X0RNNSkgewotICBjb25zdCBCRF9GRUFUVVJFUyBiZF9mZWF0dXJlcyA9IHsweDAyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgUGVlclBhY2tldFR5cGVzIHBlZXJfcGFja2V0X3R5cGVzKGJkX2ZlYXR1cmVzKTsKLSAgQVNTRVJUX0VRKHBlZXJfcGFja2V0X3R5cGVzLmFjbC5zdXBwb3J0ZWQsIDB4YzAxOCk7Ci0gIEFTU0VSVF9FUShwZWVyX3BhY2tldF90eXBlcy5hY2wudW5zdXBwb3J0ZWQsIDB4MzMwNik7Ci19Ci0KLVRFU1RfRihQZWVyUGFja2V0VGVzdCwgMk1iX3N1cHBvcnQpIHsKLSAgY29uc3QgQkRfRkVBVFVSRVMgYmRfZmVhdHVyZXMgPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIFBlZXJQYWNrZXRUeXBlcyBwZWVyX3BhY2tldF90eXBlcyhiZF9mZWF0dXJlcyk7Ci0gIEFTU0VSVF9FUShwZWVyX3BhY2tldF90eXBlcy5hY2wuc3VwcG9ydGVkLCAweDAwMTgpOwotICBBU1NFUlRfRVEocGVlcl9wYWNrZXRfdHlwZXMuYWNsLnVuc3VwcG9ydGVkLCAweDMzMDQpOwotfQotCi1URVNUX0YoUGVlclBhY2tldFRlc3QsIDNNYl9zdXBwb3J0KSB7Ci0gIGNvbnN0IEJEX0ZFQVRVUkVTIGJkX2ZlYXR1cmVzID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICBQZWVyUGFja2V0VHlwZXMgcGVlcl9wYWNrZXRfdHlwZXMoYmRfZmVhdHVyZXMpOwotICBBU1NFUlRfRVEocGVlcl9wYWNrZXRfdHlwZXMuYWNsLnN1cHBvcnRlZCwgMHgwMDE4KTsKLSAgQVNTRVJUX0VRKHBlZXJfcGFja2V0X3R5cGVzLmFjbC51bnN1cHBvcnRlZCwgMHgzMzAyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2J0bS9zdGFja19idG1fdGVzdC5jYyBiL3N0YWNrL3Rlc3QvYnRtL3N0YWNrX2J0bV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE3NDFiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvYnRtL3N0YWNrX2J0bV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKgotICogIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2hoLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvaGNpX3BhY2tldF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiaW50ZXJuYWxfaW5jbHVkZS9zdGFja19jb25maWcuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2NvLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL2wyY2FwL2wyY19pbnQuaCIKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19oY2ljX2hjaWNtZHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgbW9jayA9IHRlc3Q6Om1vY2s6OmhjaWNfaGNpY21kczsKLQotZXh0ZXJuIHRCVE1fQ0IgYnRtX2NiOwotCi11aW50OF90IGFwcGxfdHJhY2VfbGV2ZWwgPSBCVF9UUkFDRV9MRVZFTF9WRVJCT1NFOwotYnRpZl9oaF9jYl90IGJ0aWZfaGhfY2I7Ci10TDJDX0NCIGwyY2I7Ci0KLWNvbnN0IGhjaV90KiBoY2lfbGF5ZXJfZ2V0X2ludGVyZmFjZSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLQotdm9pZCBMb2dNc2codWludDMyX3QgdHJhY2Vfc2V0X21hc2ssIGNvbnN0IGNoYXIqIGZtdF9zdHIsIC4uLikge30KLQotY29uc3Qgc3RkOjpzdHJpbmcga1NtcE9wdGlvbnMoIm1vY2sgc21wIG9wdGlvbnMiKTsKLQotYm9vbCBnZXRfdHJhY2VfY29uZmlnX2VuYWJsZWQodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLWJvb2wgZ2V0X3B0c19hdnJjcF90ZXN0KHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1ib29sIGdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQotYm9vbCBnZXRfcHRzX2Nvbm5fdXBkYXRlc19kaXNhYmxlZCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQotYm9vbCBnZXRfcHRzX2Nyb3Nza2V5X3NkcF9kaXNhYmxlKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1jb25zdCBzdGQ6OnN0cmluZyogZ2V0X3B0c19zbXBfb3B0aW9ucyh2b2lkKSB7IHJldHVybiAma1NtcE9wdGlvbnM7IH0KLWludCBnZXRfcHRzX3NtcF9mYWlsdXJlX2Nhc2Uodm9pZCkgeyByZXR1cm4gMTIzOyB9Ci1jb25maWdfdCogZ2V0X2FsbCh2b2lkKSB7IHJldHVybiBudWxscHRyOyB9Ci1jb25zdCBwYWNrZXRfZnJhZ21lbnRlcl90KiBwYWNrZXRfZnJhZ21lbnRlcl9nZXRfaW50ZXJmYWNlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotCi1zdGFja19jb25maWdfdCBtb2NrX3N0YWNrX2NvbmZpZ3sKLSAgICAuZ2V0X3RyYWNlX2NvbmZpZ19lbmFibGVkID0gZ2V0X3RyYWNlX2NvbmZpZ19lbmFibGVkLAotICAgIC5nZXRfcHRzX2F2cmNwX3Rlc3QgPSBnZXRfcHRzX2F2cmNwX3Rlc3QsCi0gICAgLmdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSA9IGdldF9wdHNfc2VjdXJlX29ubHlfbW9kZSwKLSAgICAuZ2V0X3B0c19jb25uX3VwZGF0ZXNfZGlzYWJsZWQgPSBnZXRfcHRzX2Nvbm5fdXBkYXRlc19kaXNhYmxlZCwKLSAgICAuZ2V0X3B0c19jcm9zc2tleV9zZHBfZGlzYWJsZSA9IGdldF9wdHNfY3Jvc3NrZXlfc2RwX2Rpc2FibGUsCi0gICAgLmdldF9wdHNfc21wX29wdGlvbnMgPSBnZXRfcHRzX3NtcF9vcHRpb25zLAotICAgIC5nZXRfcHRzX3NtcF9mYWlsdXJlX2Nhc2UgPSBnZXRfcHRzX3NtcF9mYWlsdXJlX2Nhc2UsCi0gICAgLmdldF9hbGwgPSBnZXRfYWxsLAotfTsKLWNvbnN0IHN0YWNrX2NvbmZpZ190KiBzdGFja19jb25maWdfZ2V0X2ludGVyZmFjZSh2b2lkKSB7Ci0gIHJldHVybiAmbW9ja19zdGFja19jb25maWc7Ci19Ci0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi1leHRlcm4gYm9vbCBNT0NLX2JsdWV0b290aF9zaGltX2lzX2dkX2FjbF9lbmFibGVkXzsKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6Tm90TnVsbDsKLXVzaW5nIHRlc3Rpbmc6OlBvaW50ZWU7Ci11c2luZyB0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyB0ZXN0aW5nOjpTYXZlQXJnOwotdXNpbmcgdGVzdGluZzo6U2F2ZUFyZ1BvaW50ZWU7Ci11c2luZyB0ZXN0aW5nOjpTdHJFcTsKLXVzaW5nIHRlc3Rpbmc6OlN0cmljdE1vY2s7Ci11c2luZyB0ZXN0aW5nOjpUZXN0OwotCi1zdGQ6OnN0cmluZyBIZXgxNihpbnQgbikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICBvc3MgPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldHcoNCkgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgbjsKLSAgcmV0dXJuIG9zcy5zdHIoKTsKLX0KLQotY2xhc3MgU3RhY2tCdG1UZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLmNsZWFyKCk7IH0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHt9Ci19OwotCi1URVNUX0YoU3RhY2tCdG1UZXN0LCBHbG9iYWxMaWZlY3ljbGUpIHsKLSAgZ2V0X2J0bV9jbGllbnRfaW50ZXJmYWNlKCkubGlmZWN5Y2xlLmJ0bV9pbml0KCk7Ci0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1fZnJlZSgpOwotfQotCi1URVNUX0YoU3RhY2tCdG1UZXN0LCBEeW5hbWljTGlmZWN5Y2xlKSB7Ci0gIGF1dG8qIGJ0bSA9IG5ldyB0QlRNX0NCKCk7Ci0gIGRlbGV0ZSBidG07Ci19Ci0KLVRFU1RfRihTdGFja0J0bVRlc3QsIEluZm9ybUNsaWVudE9uQ29ubmVjdGlvblN1Y2Nlc3MpIHsKLSAgTU9DS19ibHVldG9vdGhfc2hpbV9pc19nZF9hY2xfZW5hYmxlZF8gPSB0cnVlOwotCi0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1faW5pdCgpOwotCi0gIFJhd0FkZHJlc3MgYmRhKHsweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2fSk7Ci0KLSAgYnRtX2FjbF9jb25uZWN0ZWQoYmRhLCAyLCBIQ0lfU1VDQ0VTUywgZmFsc2UpOwotICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigxKSwKLSAgICAgICAgICAgIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLmNvdW50KCJCVEFfZG1fYWNsX3VwIikpOwotCi0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1fZnJlZSgpOwotfQotCi1URVNUX0YoU3RhY2tCdG1UZXN0LCBOb0luZm9ybUNsaWVudE9uQ29ubmVjdGlvbkZhaWwpIHsKLSAgTU9DS19ibHVldG9vdGhfc2hpbV9pc19nZF9hY2xfZW5hYmxlZF8gPSB0cnVlOwotCi0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1faW5pdCgpOwotCi0gIFJhd0FkZHJlc3MgYmRhKHsweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2fSk7Ci0KLSAgYnRtX2FjbF9jb25uZWN0ZWQoYmRhLCAyLCBIQ0lfRVJSX05PX0NPTk5FQ1RJT04sIGZhbHNlKTsKLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMCksCi0gICAgICAgICAgICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcC5jb3VudCgiQlRBX2RtX2FjbF91cCIpKTsKLQotICBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saWZlY3ljbGUuYnRtX2ZyZWUoKTsKLX0KLQotVEVTVF9GKFN0YWNrQnRtVGVzdCwgZGVmYXVsdF9wYWNrZXRfdHlwZSkgewotICBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKS5saWZlY3ljbGUuYnRtX2luaXQoKTsKLQotICBidG1fY2IuYWNsX2NiXy5TZXREZWZhdWx0UGFja2V0VHlwZU1hc2soMHg0MzIxKTsKLSAgQVNTRVJUX0VRKDB4NDMyMSwgYnRtX2NiLmFjbF9jYl8uRGVmYXVsdFBhY2tldFR5cGVzKCkpOwotCi0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1fZnJlZSgpOwotfQotCi1URVNUX0YoU3RhY2tCdG1UZXN0LCBjaGFuZ2VfcGFja2V0X3R5cGUpIHsKLSAgaW50IGNudCA9IDA7Ci0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1faW5pdCgpOwotCi0gIGJ0bV9jYi5hY2xfY2JfLlNldERlZmF1bHRQYWNrZXRUeXBlTWFzaygweGZmZmYpOwotICBBU1NFUlRfRVEoMHhmZmZmLCBidG1fY2IuYWNsX2NiXy5EZWZhdWx0UGFja2V0VHlwZXMoKSk7Ci0KLSAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24KLSAgUmF3QWRkcmVzcyBiZGEoezB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjZ9KTsKLSAgYnRtX2FjbF9jcmVhdGVkKGJkYSwgMHgxMjMsIEhDSV9ST0xFX0NFTlRSQUwsIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotCi0gIHVpbnQ2NF90IGZlYXR1cmVzID0gMHhmZmZmZmZmZmZmZmZmZmZmOwotICBhY2xfcHJvY2Vzc19zdXBwb3J0ZWRfZmVhdHVyZXMoMHgxMjMsIGZlYXR1cmVzKTsKLQotICBtb2NrOjpidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUgPSB7fTsKLSAgdWludDE2X3QgcGt0X3R5cGVzID0gMHg1NWFhOwotICBidG1fc2V0X3BhY2tldF90eXBlc19mcm9tX2FkZHJlc3MoYmRhLCBwa3RfdHlwZXMpOwotICBBU1NFUlRfRVEoKytjbnQsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUiXSk7Ci0gIEFTU0VSVF9FUSgweDEyMywgbW9jazo6YnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlLmhhbmRsZSk7Ci0gIEFTU0VSVF9FUShIZXgxNigweDQ0MDAgfCBIQ0lfUEtUX1RZUEVTX01BU0tfRE0xKSwKLSAgICAgICAgICAgIEhleDE2KG1vY2s6OmJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZS5wYWNrZXRfdHlwZXMpKTsKLQotICBtb2NrOjpidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUgPSB7fTsKLSAgYnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzKGJkYSwgMHhmZmZmKTsKLSAgQVNTRVJUX0VRKCsrY250LCBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlIl0pOwotICBBU1NFUlRfRVEoMHgxMjMsIG1vY2s6OmJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZS5oYW5kbGUpOwotICBBU1NFUlRfRVEoSGV4MTYoMHhjYzAwIHwgSENJX1BLVF9UWVBFU19NQVNLX0RNMSB8IEhDSV9QS1RfVFlQRVNfTUFTS19ESDEpLAotICAgICAgICAgICAgSGV4MTYobW9jazo6YnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlLnBhY2tldF90eXBlcykpOwotCi0gIG1vY2s6OmJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZSA9IHt9OwotICBidG1fc2V0X3BhY2tldF90eXBlc19mcm9tX2FkZHJlc3MoYmRhLCAweDApOwotICAvLyBOT1RFOiBUaGUgY2FsbCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIHdpdGggbm8gYml0cyBzZXQKLSAgQVNTRVJUX0VRKDB4MCwgbW9jazo6YnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlLmhhbmRsZSk7Ci0gIEFTU0VSVF9FUShIZXgxNigweDApLCBIZXgxNihtb2NrOjpidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUucGFja2V0X3R5cGVzKSk7Ci0gIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpLmxpZmVjeWNsZS5idG1fZnJlZSgpOwotfQotCi1URVNUKFNjb1Rlc3QsIG1ha2Vfc2NvX3BhY2tldCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhID0gezEwLCAyMCwgMzB9OwotICB1aW50MTZfdCBoYW5kbGUgPSAweGFiOwotICBCVF9IRFIqIHAgPSBidG1fc2NvX21ha2VfcGFja2V0KGRhdGEsIGhhbmRsZSk7Ci0gIEFTU0VSVF9FUShwLT5ldmVudCwgQlRfRVZUX1RPX0xNX0hDSV9TQ08pOwotICBBU1NFUlRfRVEocC0+bGVuLCAzICsgZGF0YS5zaXplKCkpOwotICBBU1NFUlRfRVEocC0+ZGF0YVswXSwgMHhhYik7Ci0gIEFTU0VSVF9FUShwLT5kYXRhWzFdLCAwKTsKLSAgQVNTRVJUX0VRKHAtPmRhdGFbMl0sIDMpOwotICBBU1NFUlRfRVEocC0+ZGF0YVszXSwgMTApOwotICBBU1NFUlRfRVEocC0+ZGF0YVs0XSwgMjApOwotICBBU1NFUlRfRVEocC0+ZGF0YVs1XSwgMzApOwotICBvc2lfZnJlZShwKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2J0bV9pc29fdGVzdC5jYyBiL3N0YWNrL3Rlc3QvYnRtX2lzb190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQ5OGE0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvYnRtX2lzb190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiYnRtX2lzb19hcGkuaCIKLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm1vY2tfY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1vY2tfaGNpY19sYXllci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpZGVmcy5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6SXNvTWFuYWdlcjsKLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyB0ZXN0aW5nOjpBdExlYXN0OwotdXNpbmcgdGVzdGluZzo6RXE7Ci11c2luZyB0ZXN0aW5nOjpNYXRjaGVyOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuOwotdXNpbmcgdGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIHRlc3Rpbmc6OlN0cmljdE1vY2s7Ci11c2luZyB0ZXN0aW5nOjpUZXN0OwotCi0vLyBJc28gTWFuYWdlciBjdXJyZW50bHkgd29ya3Mgb24gdG9wIG9mIHRoZSBsZWdhY3kgSENJIGxheWVyCi1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotbmFtZXNwYWNlIGJ0ZSB7Ci1jbGFzcyBCdGVJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIEhjaVNlbmQoQlRfSERSKiBwX21zZywgdWludDE2X3QgZXZlbnQpID0gMDsKLSAgdmlydHVhbCB+QnRlSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgTW9ja0J0ZUludGVyZmFjZSA6IHB1YmxpYyBCdGVJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBIY2lTZW5kLCAoQlRfSERSICogcF9tc2csIHVpbnQxNl90IGV2ZW50KSwgKG92ZXJyaWRlKSk7Ci19OwotCi1zdGF0aWMgTW9ja0J0ZUludGVyZmFjZSogYnRlX2ludGVyZmFjZSA9IG51bGxwdHI7Ci1zdGF0aWMgdm9pZCBTZXRNb2NrQnRlSW50ZXJmYWNlKE1vY2tCdGVJbnRlcmZhY2UqIGludGVyZmFjZSkgewotICBidGVfaW50ZXJmYWNlID0gaW50ZXJmYWNlOwotfQotfSAgLy8gbmFtZXNwYWNlIGJ0ZQotCi12b2lkIGJ0ZV9tYWluX2hjaV9zZW5kKEJUX0hEUiogcF9tc2csIHVpbnQxNl90IGV2ZW50KSB7Ci0gIGJ0ZTo6YnRlX2ludGVyZmFjZS0+SGNpU2VuZChwX21zZywgZXZlbnQpOwotICBvc2lfZnJlZShwX21zZyk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBNb2NrQ2lnQ2FsbGJhY2tzIDogcHVibGljIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Q2lnQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIE1vY2tDaWdDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIH5Nb2NrQ2lnQ2FsbGJhY2tzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25TZXR1cElzb0RhdGFQYXRoLAotICAgICAgICAgICAgICAodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IGNpZ19pZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uUmVtb3ZlSXNvRGF0YVBhdGgsCi0gICAgICAgICAgICAgICh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgY2lnX2lkKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25Jc29MaW5rUXVhbGl0eVJlYWQsCi0gICAgICAgICAgICAgICh1aW50OF90IGNvbm5faGFuZGxlLCB1aW50OF90IGNpZ19pZCwgdWludDMyX3QgdHhVbmFja2VkUGFja2V0cywKLSAgICAgICAgICAgICAgIHVpbnQzMl90IHR4Rmx1c2hlZFBhY2tldHMsIHVpbnQzMl90IHR4TGFzdFN1YmV2ZW50UGFja2V0cywKLSAgICAgICAgICAgICAgIHVpbnQzMl90IHJldHJhbnNtaXR0ZWRQYWNrZXRzLCB1aW50MzJfdCBjcmNFcnJvclBhY2tldHMsCi0gICAgICAgICAgICAgICB1aW50MzJfdCByeFVucmVjZWl2ZWRQYWNrZXRzLCB1aW50MzJfdCBkdXBsaWNhdGVQYWNrZXRzKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkNpc0V2ZW50LCAodWludDhfdCBldmVudCwgdm9pZCogZGF0YSksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uQ2lnRXZlbnQsICh1aW50OF90IGV2ZW50LCB2b2lkKiBkYXRhKSwgKG92ZXJyaWRlKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0NpZ0NhbGxiYWNrcyk7Ci19OwotCi1jbGFzcyBNb2NrQmlnQ2FsbGJhY2tzIDogcHVibGljIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6QmlnQ2FsbGJhY2tzIHsKLSBwdWJsaWM6Ci0gIE1vY2tCaWdDYWxsYmFja3MoKSA9IGRlZmF1bHQ7Ci0gIH5Nb2NrQmlnQ2FsbGJhY2tzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgT25TZXR1cElzb0RhdGFQYXRoLAotICAgICAgICAgICAgICAodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IGJpZ19pZCksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIE9uUmVtb3ZlSXNvRGF0YVBhdGgsCi0gICAgICAgICAgICAgICh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgYmlnX2lkKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBPbkJpZ0V2ZW50LCAodWludDhfdCBldmVudCwgdm9pZCogZGF0YSksIChvdmVycmlkZSkpOwotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tCaWdDYWxsYmFja3MpOwotfTsKLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBJc29NYW5hZ2VyVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgYnRlOjpTZXRNb2NrQnRlSW50ZXJmYWNlKCZidGVfaW50ZXJmYWNlXyk7Ci0gICAgaGNpYzo6U2V0TW9ja0hjaWNJbnRlcmZhY2UoJmhjaWNfaW50ZXJmYWNlXyk7Ci0gICAgY29udHJvbGxlcjo6U2V0TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UoJmNvbnRyb2xsZXJfaW50ZXJmYWNlXyk7Ci0KLSAgICBiaWdfY2FsbGJhY2tzXy5yZXNldChuZXcgTW9ja0JpZ0NhbGxiYWNrcygpKTsKLSAgICBjaWdfY2FsbGJhY2tzXy5yZXNldChuZXcgTW9ja0NpZ0NhbGxiYWNrcygpKTsKLQotICAgIEVYUEVDVF9DQUxMKGNvbnRyb2xsZXJfaW50ZXJmYWNlXywgR2V0SXNvQnVmZmVyQ291bnQoKSkKLSAgICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oNikpOwotICAgIEVYUEVDVF9DQUxMKGNvbnRyb2xsZXJfaW50ZXJmYWNlXywgR2V0SXNvRGF0YVNpemUoKSkKLSAgICAgICAgLlRpbWVzKEF0TGVhc3QoMSkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMTAyNCkpOwotCi0gICAgSW5pdElzb01hbmFnZXIoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgQ2xlYW51cElzb01hbmFnZXIoKTsKLQotICAgIGJpZ19jYWxsYmFja3NfLnJlc2V0KCk7Ci0gICAgY2lnX2NhbGxiYWNrc18ucmVzZXQoKTsKLQotICAgIGJ0ZTo6U2V0TW9ja0J0ZUludGVyZmFjZShudWxscHRyKTsKLSAgICBoY2ljOjpTZXRNb2NrSGNpY0ludGVyZmFjZShudWxscHRyKTsKLSAgICBjb250cm9sbGVyOjpTZXRNb2NrQ29udHJvbGxlckludGVyZmFjZShudWxscHRyKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBJbml0SXNvTWFuYWdlcigpIHsKLSAgICBtYW5hZ2VyX2luc3RhbmNlXyA9IElzb01hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gICAgbWFuYWdlcl9pbnN0YW5jZV8tPlN0YXJ0KCk7Ci0gICAgbWFuYWdlcl9pbnN0YW5jZV8tPlJlZ2lzdGVyQ2lnQ2FsbGJhY2tzKGNpZ19jYWxsYmFja3NfLmdldCgpKTsKLSAgICBtYW5hZ2VyX2luc3RhbmNlXy0+UmVnaXN0ZXJCaWdDYWxsYmFja3MoYmlnX2NhbGxiYWNrc18uZ2V0KCkpOwotCi0gICAgLy8gRGVmYXVsdCBtb2NrIFNldENpZ1BhcmFtcyBhY3Rpb24KLSAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfID0ga0RlZmF1bHRDaWdQYXJhbXNFdnQ7Ci0gICAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFNldENpZ1BhcmFtcykKLSAgICAgICAgLldpbGxCeURlZmF1bHQoW3RoaXNdKGF1dG8gY2lnX2lkLCBhdXRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgICB1aW50OF90IGhjaV9tb2NrX3JzcF9idWZmZXIKLSAgICAgICAgICAgICAgWzMgKyBzaXplb2YodWludDE2X3QpICogdGhpcy0+dm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0XwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbm5faGFuZGxlcy5zaXplKCldOwotICAgICAgICAgIHVpbnQ4X3QqIHAgPSBoY2lfbW9ja19yc3BfYnVmZmVyOwotCi0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHRoaXMtPnZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uc3RhdHVzKTsKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgY2lnX2lkKTsKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0oCi0gICAgICAgICAgICAgIHAsIHRoaXMtPnZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzLnNpemUoKSk7Ci0gICAgICAgICAgZm9yIChhdXRvIGhhbmRsZSA6Ci0gICAgICAgICAgICAgICB0aGlzLT52b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBoYW5kbGUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKAotICAgICAgICAgICAgICBoY2lfbW9ja19yc3BfYnVmZmVyLAotICAgICAgICAgICAgICAzICsgc2l6ZW9mKHVpbnQxNl90KSAqIHRoaXMtPnZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbm5faGFuZGxlcy5zaXplKCkpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9KTsKLQotICAgIC8vIERlZmF1bHQgbW9jayBDcmVhdGVDaXMgYWN0aW9uCi0gICAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIENyZWF0ZUNpcykKLSAgICAgICAgLldpbGxCeURlZmF1bHQoW10odWludDhfdCBudW1fY2lzLCBjb25zdCBFWFRfQ0lTX0NSRUFURV9DRkcqIGNpc19jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gICAgICAgICAgZm9yIChjb25zdCBFWFRfQ0lTX0NSRUFURV9DRkcqIGNpcyA9IGNpc19jZmc7IG51bV9jaXMgIT0gMDsKLSAgICAgICAgICAgICAgIG51bV9jaXMtLSwgY2lzKyspIHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZigyOCk7Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBIQ0lfU1VDQ0VTUyk7Ci0gICAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGNpcy0+Y2lzX2Nvbm5faGFuZGxlKTsKLSAgICAgICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgMHhFQSk7ICAgIC8vIENJRyBzeW5jIGRlbGF5Ci0gICAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIDB4RUIpOyAgICAvLyBDSVMgc3luYyBkZWxheQotICAgICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweEVDKTsgICAgLy8gdHJhbnNwb3J0IGxhdGVuY3kgbXRvcwotICAgICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweEVEKTsgICAgLy8gdHJhbnNwb3J0IGxhdGVuY3kgc3RvbQotICAgICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIDB4MDEpOyAgICAgLy8gcGh5IG10b3MKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAyKTsgICAgIC8vIHBoeSBzdG9tCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwMSk7ICAgICAvLyBuc2UKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAyKTsgICAgIC8vIGJuIG10b3MKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAzKTsgICAgIC8vIGJuIHN0b20KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDA0KTsgICAgIC8vIGZ0IG10b3MKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDA1KTsgICAgIC8vIGZ0IHN0b20KLSAgICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgMHgwMEZBKTsgIC8vIE1heCBQRFUgbXRvcwotICAgICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCAweDAwRkIpOyAgLy8gTWF4IFBEVSBzdG9tCi0gICAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIDB4MEM2MCk7ICAvLyBJU08gaW50ZXJ2YWwKLQotICAgICAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoSENJX0JMRV9DSVNfRVNUX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAvLyBEZWZhdWx0IG1vY2sgZGlzY29ubmVjdCBhY3Rpb24KLSAgICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgRGlzY29ubmVjdCkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoW10odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICAgICAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoaGFuZGxlLCByZWFzb24pOwotICAgICAgICB9KTsKLQotICAgIC8vIERlZmF1bHQgbW9jayBDcmVhdGVCaWcgSENJIGFjdGlvbgotICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfID0ga0RlZmF1bHRCaWdQYXJhbXNFdnQ7Ci0gICAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIENyZWF0ZUJpZykKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBbdGhpc10oYXV0byBiaWdfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMgYmlnX3BhcmFtcykgewotICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoYmlnX3BhcmFtcy5udW1fYmlzICogc2l6ZW9mKHVpbnQxNl90KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCk7Ci0gICAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSBidWYuZGF0YSgpOwotICAgICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgSENJX1NVQ0NFU1MpOwotICAgICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX2hhbmRsZSk7Ci0KLSAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoYmlnX3BhcmFtcy5udW1fYmlzIDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlcy5zaXplKCkpOwotCi0gICAgICAgICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX3N5bmNfZGVsYXkpOwotICAgICAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKAotICAgICAgICAgICAgICAgICAgcCwgdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8udHJhbnNwb3J0X2xhdGVuY3lfYmlnKTsKLSAgICAgICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIGJpZ19wYXJhbXMucGh5KTsKLSAgICAgICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLm5zZSk7Ci0gICAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5ibik7Ci0gICAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5wdG8pOwotICAgICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uaXJjKTsKLSAgICAgICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5tYXhfcGR1KTsKLSAgICAgICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5pc29faW50ZXJ2YWwpOwotCi0gICAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBiaWdfcGFyYW1zLm51bV9iaXMpOwotICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBiaWdfcGFyYW1zLm51bV9iaXM7ICsraSkgewotICAgICAgICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlc1tpXSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVIY2lFdmVudCgKLSAgICAgICAgICAgICAgICAgIEhDSV9CTEVfQ1JFQVRFX0JJR19DUExfRVZULCBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgLy8gRGVmYXVsdCBtb2NrIFRlcm1pbmF0ZUJpZyBIQ0kgYWN0aW9uCi0gICAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFRlcm1pbmF0ZUJpZykKLSAgICAgICAgLldpbGxCeURlZmF1bHQoW10oYXV0byBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZigyKTsKLSAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX2hhbmRsZSk7Ci0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHJlYXNvbik7Ci0KLSAgICAgICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVIY2lFdmVudChIQ0lfQkxFX1RFUk1fQklHX0NQTF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmRhdGEoKSwgYnVmLnNpemUoKSk7Ci0gICAgICAgIH0pOwotCi0gICAgLy8gRGVmYXVsdCBtb2NrIFNldHVwSXNvRGF0YVBhdGggSENJIGFjdGlvbgotICAgIE9OX0NBTEwoaGNpY19pbnRlcmZhY2VfLCBTZXR1cElzb0RhdGFQYXRoKQotICAgICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICAgIFtdKHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgLyogZGF0YV9wYXRoX2RpciAqLywKLSAgICAgICAgICAgICAgIHVpbnQ4X3QgLyogZGF0YV9wYXRoX2lkICovLCB1aW50OF90IC8qIGNvZGVjX2lkX2Zvcm1hdCAqLywKLSAgICAgICAgICAgICAgIHVpbnQxNl90IC8qIGNvZGVjX2lkX2NvbXBhbnkgKi8sIHVpbnQxNl90IC8qIGNvZGVjX2lkX3ZlbmRvciAqLywKLSAgICAgICAgICAgICAgIHVpbnQzMl90IC8qIGNvbnRyb2xsZXJfZGVsYXkgKi8sCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAvKiBjb2RlY19jb25mICovLAotICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKDMpOwotICAgICAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIEhDSV9TVUNDRVNTKTsKLSAgICAgICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBpc29faGFuZGxlKTsKLQotICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bihidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgLy8gRGVmYXVsdCBtb2NrIFJlbW92ZUlzb0RhdGFQYXRoIEhDSSBhY3Rpb24KLSAgICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgUmVtb3ZlSXNvRGF0YVBhdGgpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoMyk7Ci0gICAgICAgICAgdWludDhfdCogcCA9IGJ1Zi5kYXRhKCk7Ci0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIEhDSV9TVUNDRVNTKTsKLSAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIGlzb19oYW5kbGUpOwotCi0gICAgICAgICAgc3RkOjptb3ZlKGNiKS5SdW4oYnVmLmRhdGEoKSwgYnVmLnNpemUoKSk7Ci0gICAgICAgIH0pOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIENsZWFudXBJc29NYW5hZ2VyKCkgewotICAgIG1hbmFnZXJfaW5zdGFuY2VfLT5TdG9wKCk7Ci0gICAgbWFuYWdlcl9pbnN0YW5jZV8gPSBudWxscHRyOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMga0RlZmF1bHRCaWdQYXJhbXM7Ci0gIHN0YXRpYyBjb25zdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfcGFyYW1zIGtEZWZhdWx0Q2lnUGFyYW1zOwotICBzdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcwotICAgICAga0RlZmF1bHRDaWdQYXJhbXMyOwotICBzdGF0aWMgY29uc3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX2NtcGxfZXZ0Ci0gICAgICBrRGVmYXVsdENpZ1BhcmFtc0V2dDsKLSAgc3RhdGljIGNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9jbXBsX2V2dAotICAgICAga0RlZmF1bHRCaWdQYXJhbXNFdnQ7Ci0gIHN0YXRpYyBjb25zdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6Omlzb19kYXRhX3BhdGhfcGFyYW1zCi0gICAgICBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zOwotCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9jbXBsX2V2dAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0XzsKLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpiaWdfY3JlYXRlX2NtcGxfZXZ0Ci0gICAgICB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0XzsKLQotICBJc29NYW5hZ2VyKiBtYW5hZ2VyX2luc3RhbmNlXzsKLSAgYnRlOjpNb2NrQnRlSW50ZXJmYWNlIGJ0ZV9pbnRlcmZhY2VfOwotICBoY2ljOjpNb2NrSGNpY0ludGVyZmFjZSBoY2ljX2ludGVyZmFjZV87Ci0gIGNvbnRyb2xsZXI6Ok1vY2tDb250cm9sbGVySW50ZXJmYWNlIGNvbnRyb2xsZXJfaW50ZXJmYWNlXzsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja0JpZ0NhbGxiYWNrcz4gYmlnX2NhbGxiYWNrc187Ci0gIHN0ZDo6dW5pcXVlX3B0cjxNb2NrQ2lnQ2FsbGJhY2tzPiBjaWdfY2FsbGJhY2tzXzsKLX07Ci0KLWNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9jbXBsX2V2dAotICAgIElzb01hbmFnZXJUZXN0OjprRGVmYXVsdENpZ1BhcmFtc0V2dCA9IHsKLSAgICAgICAgLmNpZ19pZCA9IDEyOCwKLSAgICAgICAgLnN0YXR1cyA9IDB4MDAsCi0gICAgICAgIC5jb25uX2hhbmRsZXMgPSBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4oezB4MEVGRiwgMHgwMEZGfSksCi19OwotCi1jb25zdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfY21wbF9ldnQKLSAgICBJc29NYW5hZ2VyVGVzdDo6a0RlZmF1bHRCaWdQYXJhbXNFdnQgPSB7Ci0gICAgICAgIC5zdGF0dXMgPSAweDAwLAotICAgICAgICAuYmlnX2lkID0gMCwKLSAgICAgICAgLmJpZ19zeW5jX2RlbGF5ID0gMHgwMDgwZGUsCi0gICAgICAgIC50cmFuc3BvcnRfbGF0ZW5jeV9iaWcgPSAweDAwY2VmZSwKLSAgICAgICAgLnBoeSA9IDB4MDIsCi0gICAgICAgIC5uc2UgPSA0LAotICAgICAgICAuYm4gPSAxLAotICAgICAgICAucHRvID0gMCwKLSAgICAgICAgLmlyYyA9IDQsCi0gICAgICAgIC5tYXhfcGR1ID0gMTA4LAotICAgICAgICAuaXNvX2ludGVydmFsID0gNiwKLSAgICAgICAgLmNvbm5faGFuZGxlcyA9IHN0ZDo6dmVjdG9yPHVpbnQxNl90Pih7MHgwRUZFLCAweDBFMDB9KSwKLX07Ci0KLWNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMKLSAgICBJc29NYW5hZ2VyVGVzdDo6a0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtcyA9IHsKLSAgICAgICAgLmRhdGFfcGF0aF9kaXIgPSBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbk91dCwKLSAgICAgICAgLmRhdGFfcGF0aF9pZCA9IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoSGNpLAotICAgICAgICAuY29kZWNfaWRfZm9ybWF0ID0gMHgwNiwKLSAgICAgICAgLmNvZGVjX2lkX2NvbXBhbnkgPSAwLAotICAgICAgICAuY29kZWNfaWRfdmVuZG9yID0gMCwKLSAgICAgICAgLmNvbnRyb2xsZXJfZGVsYXkgPSAwLAotICAgICAgICAuY29kZWNfY29uZiA9IHsweDAyLCAweDAxLCAweDAyfSwKLX07Ci0KLWNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMKLSAgICBJc29NYW5hZ2VyVGVzdDo6a0RlZmF1bHRCaWdQYXJhbXMgPSB7Ci0gICAgICAgIC5hZHZfaGFuZGxlID0gMHgwMCwKLSAgICAgICAgLm51bV9iaXMgPSAyLAotICAgICAgICAuc2R1X2l0diA9IDB4MDAyNzEwLAotICAgICAgICAubWF4X3NkdV9zaXplID0gMTA4LAotICAgICAgICAubWF4X3RyYW5zcG9ydF9sYXRlbmN5ID0gMHgzYywKLSAgICAgICAgLnJ0biA9IDMsCi0gICAgICAgIC5waHkgPSAweDAyLAotICAgICAgICAucGFja2luZyA9IDB4MDAsCi0gICAgICAgIC5mcmFtaW5nID0gMHgwMCwKLSAgICAgICAgLmVuYyA9IDAsCi0gICAgICAgIC5lbmNfY29kZSA9IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KHswfSksCi19OwotCi1jb25zdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfcGFyYW1zCi0gICAgSXNvTWFuYWdlclRlc3Q6OmtEZWZhdWx0Q2lnUGFyYW1zID0gewotICAgICAgICAuc2R1X2l0dl9tdG9zID0gMHgwMDAwMjcxMCwKLSAgICAgICAgLnNkdV9pdHZfc3RvbSA9IDB4MDAwMDI3MTEsCi0gICAgICAgIC5zY2EgPSBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29TY2EwVG8yMFBwbSwKLSAgICAgICAgLnBhY2tpbmcgPSAweDAwLAotICAgICAgICAuZnJhbWluZyA9IDB4MDEsCi0gICAgICAgIC5tYXhfdHJhbnNfbGF0X3N0b20gPSAweDAwMEEsCi0gICAgICAgIC5tYXhfdHJhbnNfbGF0X210b3MgPSAweDAwMDksCi0gICAgICAgIC5jaXNfY2ZncyA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ0lTICMxCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc2l6ZV9tdG9zID0gMHgwMDI4LAotICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zaXplX3N0b20gPSAweDAwMjcsCi0gICAgICAgICAgICAgICAgICAgIC5waHlfbXRvcyA9IDB4MDQsCi0gICAgICAgICAgICAgICAgICAgIC5waHlfc3RvbSA9IDB4MDMsCi0gICAgICAgICAgICAgICAgICAgIC5ydG5fbXRvcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgIC5ydG5fc3RvbSA9IDB4MDEsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAvLyBDSVMgIzIKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAyLAotICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zaXplX210b3MgPSAweDAwMjksCi0gICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NpemVfc3RvbSA9IDB4MDAyQSwKLSAgICAgICAgICAgICAgICAgICAgLnBoeV9tdG9zID0gMHgwOSwKLSAgICAgICAgICAgICAgICAgICAgLnBoeV9zdG9tID0gMHgwOCwKLSAgICAgICAgICAgICAgICAgICAgLnJ0bl9tdG9zID0gMHgwNywKLSAgICAgICAgICAgICAgICAgICAgLnJ0bl9zdG9tID0gMHgwNiwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLX07Ci0KLWNvbnN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9wYXJhbXMKLSAgICBJc29NYW5hZ2VyVGVzdDo6a0RlZmF1bHRDaWdQYXJhbXMyID0gewotICAgICAgICAuc2R1X2l0dl9tdG9zID0gMHgwMDAwMjcwOSwKLSAgICAgICAgLnNkdV9pdHZfc3RvbSA9IDB4MDAwMDI3MDAsCi0gICAgICAgIC5zY2EgPSBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29TY2EwVG8yMFBwbSwKLSAgICAgICAgLnBhY2tpbmcgPSAweDAxLAotICAgICAgICAuZnJhbWluZyA9IDB4MDAsCi0gICAgICAgIC5tYXhfdHJhbnNfbGF0X3N0b20gPSAweDAwMEIsCi0gICAgICAgIC5tYXhfdHJhbnNfbGF0X210b3MgPSAweDAwMDYsCi0gICAgICAgIC5jaXNfY2ZncyA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ0lTICMxCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAuY2lzX2lkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgLm1heF9zZHVfc2l6ZV9tdG9zID0gMHgwMDIyLAotICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zaXplX3N0b20gPSAweDAwMjIsCi0gICAgICAgICAgICAgICAgICAgIC5waHlfbXRvcyA9IDB4MDEsCi0gICAgICAgICAgICAgICAgICAgIC5waHlfc3RvbSA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgIC5ydG5fbXRvcyA9IDB4MDIsCi0gICAgICAgICAgICAgICAgICAgIC5ydG5fc3RvbSA9IDB4MDEsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAvLyBDSVMgIzIKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC5jaXNfaWQgPSAyLAotICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zaXplX210b3MgPSAweDAwMkEsCi0gICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X3NpemVfc3RvbSA9IDB4MDAyQiwKLSAgICAgICAgICAgICAgICAgICAgLnBoeV9tdG9zID0gMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgLnBoeV9zdG9tID0gMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgLnJ0bl9tdG9zID0gMHgwNywKLSAgICAgICAgICAgICAgICAgICAgLnJ0bl9zdG9tID0gMHgwNywKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLX07Ci0KLWNsYXNzIElzb01hbmFnZXJEZWF0aFRlc3QgOiBwdWJsaWMgSXNvTWFuYWdlclRlc3Qge307Ci0KLWNsYXNzIElzb01hbmFnZXJEZWF0aFRlc3ROb0luaXQgOiBwdWJsaWMgSXNvTWFuYWdlclRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBJbml0SXNvTWFuYWdlcigpIG92ZXJyaWRlIHsgLyogRE8gTk9USElORyAqLwotICB9Ci0KLSAgdm9pZCBDbGVhbnVwSXNvTWFuYWdlcigpIG92ZXJyaWRlIHsgLyogRE8gTk9USElORyAqLwotICB9Ci19OwotCi1jbGFzcyBJc29NYW5hZ2VyRGVhdGhUZXN0Tm9DbGVhbnVwIDogcHVibGljIElzb01hbmFnZXJUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgQ2xlYW51cElzb01hbmFnZXIoKSBvdmVycmlkZSB7IC8qIERPIE5PVEhJTkcgKi8KLSAgfQotfTsKLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVYVF9DSVNfQ0ZHJiB4LCBjb25zdCBFWFRfQ0lTX0NGRyYgeSkgewotICByZXR1cm4gKCh4LmNpc19pZCA9PSB5LmNpc19pZCkgJiYKLSAgICAgICAgICAoeC5tYXhfc2R1X3NpemVfbXRvcyA9PSB5Lm1heF9zZHVfc2l6ZV9tdG9zKSAmJgotICAgICAgICAgICh4Lm1heF9zZHVfc2l6ZV9zdG9tID09IHkubWF4X3NkdV9zaXplX3N0b20pICYmCi0gICAgICAgICAgKHgucGh5X210b3MgPT0geS5waHlfbXRvcykgJiYgKHgucGh5X3N0b20gPT0geS5waHlfc3RvbSkgJiYKLSAgICAgICAgICAoeC5ydG5fbXRvcyA9PSB5LnJ0bl9tdG9zKSAmJiAoeC5ydG5fc3RvbSA9PSB5LnJ0bl9zdG9tKSk7Ci19Ci0KLWJvb2wgb3BlcmF0b3I9PSgKLSAgICBjb25zdCBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyYgeCwKLSAgICBjb25zdCBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyYgeSkgewotICByZXR1cm4gKCh4LnNkdV9pdHZfbXRvcyA9PSB5LnNkdV9pdHZfbXRvcykgJiYKLSAgICAgICAgICAoeC5zZHVfaXR2X3N0b20gPT0geS5zZHVfaXR2X3N0b20pICYmICh4LnNjYSA9PSB5LnNjYSkgJiYKLSAgICAgICAgICAoeC5wYWNraW5nID09IHkucGFja2luZykgJiYgKHguZnJhbWluZyA9PSB5LmZyYW1pbmcpICYmCi0gICAgICAgICAgKHgubWF4X3RyYW5zX2xhdF9zdG9tID09IHkubWF4X3RyYW5zX2xhdF9zdG9tKSAmJgotICAgICAgICAgICh4Lm1heF90cmFuc19sYXRfbXRvcyA9PSB5Lm1heF90cmFuc19sYXRfbXRvcykgJiYKLSAgICAgICAgICBzdGQ6OmlzX3Blcm11dGF0aW9uKHguY2lzX2NmZ3MuYmVnaW4oKSwgeC5jaXNfY2Zncy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkuY2lzX2NmZ3MuYmVnaW4oKSkpOwotfQotCi1ib29sIG9wZXJhdG9yPT0oCi0gICAgY29uc3Qgc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMmIHgsCi0gICAgY29uc3Qgc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMmIHkpIHsKLSAgcmV0dXJuICgoeC5hZHZfaGFuZGxlID09IHkuYWR2X2hhbmRsZSkgJiYgKHgubnVtX2JpcyA9PSB5Lm51bV9iaXMpICYmCi0gICAgICAgICAgKHguc2R1X2l0diA9PSB5LnNkdV9pdHYpICYmICh4Lm1heF9zZHVfc2l6ZSA9PSB5Lm1heF9zZHVfc2l6ZSkgJiYKLSAgICAgICAgICAoeC5tYXhfdHJhbnNwb3J0X2xhdGVuY3kgPT0geS5tYXhfdHJhbnNwb3J0X2xhdGVuY3kpICYmCi0gICAgICAgICAgKHgucnRuID09IHkucnRuKSAmJiAoeC5waHkgPT0geS5waHkpICYmICh4LnBhY2tpbmcgPT0geS5wYWNraW5nKSAmJgotICAgICAgICAgICh4LmZyYW1pbmcgPT0geS5mcmFtaW5nKSAmJiAoeC5lbmMgPT0geS5lbmMpICYmCi0gICAgICAgICAgKHguZW5jX2NvZGUgPT0geS5lbmNfY29kZSkpOwotfQotCi1uYW1lc3BhY2UgaXNvX21hdGNoZXJzIHsKLU1BVENIRVJfUChFcSwgdmFsdWUsICIiKSB7IHJldHVybiAoYXJnID09IHZhbHVlKTsgfQotTUFUQ0hFUl9QMihFcVBvaW50ZWRBcnJheSwgdmFsdWUsIGxlbiwgIiIpIHsKLSAgcmV0dXJuICghc3RkOjptZW1jbXAoYXJnLCB2YWx1ZSwgbGVuKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaXNvX21hdGNoZXJzCi0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgU2luZ2xldG9uQWNjZXNzKSB7Ci0gIGF1dG8qIGlzb19tZ3IgPSBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICBBU1NFUlRfRVEobWFuYWdlcl9pbnN0YW5jZV8sIGlzb19tZ3IpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFJlZ2lzdGVyQ2FsbGJhY2tzKSB7Ci0gIGF1dG8qIGlzb19tZ3IgPSBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwotICBBU1NFUlRfRVEobWFuYWdlcl9pbnN0YW5jZV8sIGlzb19tZ3IpOwotCi0gIGlzb19tZ3ItPlJlZ2lzdGVyQmlnQ2FsbGJhY2tzKGJpZ19jYWxsYmFja3NfLmdldCgpKTsKLSAgaXNvX21nci0+UmVnaXN0ZXJDaWdDYWxsYmFja3MoY2lnX2NhbGxiYWNrc18uZ2V0KCkpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdE5vSW5pdCwgUmVnaXN0ZXJOdWxsQmlnQ2FsbGJhY2tzKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlN0YXJ0KCk7Ci0KLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVnaXN0ZXJCaWdDYWxsYmFja3MobnVsbHB0ciksCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJJbnZhbGlkIEJJRyBjYWxsYmFja3MiKTsKLQotICAvLyBNYW51YWwgY2xlYW51cCBhcyBJc29NYW5hZ2VyRGVhdGhUZXN0IGhhcyBubyAnZ2VuZXJpYycgY2xlYW51cAotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TdG9wKCk7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0Tm9Jbml0LCBSZWdpc3Rlck51bGxDaWdDYWxsYmFja3MpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U3RhcnQoKTsKLQotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZWdpc3RlckNpZ0NhbGxiYWNrcyhudWxscHRyKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIkludmFsaWQgQ0lHIGNhbGxiYWNrcyIpOwotCi0gIC8vIE1hbnVhbCBjbGVhbnVwIGFzIElzb01hbmFnZXJEZWF0aFRlc3QgaGFzIG5vICdnZW5lcmljJyBjbGVhbnVwCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlN0b3AoKTsKLX0KLQotLy8gVmVyaWZ5IGhjaSBsYXllciBiZWluZyBjYWxsZWQgYnkgdGhlIElzbyBNYW5hZ2VyCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIENyZWF0ZUNpZ0hjaUNhbGwpIHsKLSAgZm9yICh1aW50OF90IGkgPSAyMjA7IGkgIT0gNjA7ICsraSkgewotICAgIEVYUEVDVF9DQUxMKGhjaWNfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgICBTZXRDaWdQYXJhbXMoaSwgaXNvX21hdGNoZXJzOjpFcShrRGVmYXVsdENpZ1BhcmFtcyksIF8pKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoaSwga0RlZmF1bHRDaWdQYXJhbXMpOwotICB9Ci19Ci0KLS8vIENoZWNrIGhhbmRsaW5nIGNyZWF0ZSBjaWcgcmVxdWVzdCB0d2ljZSB3aXRoIHRoZSBzYW1lIENJRyBpZAotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIENyZWF0ZVNhbWVDaWdUd2ljZSkgewotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfY21wbF9ldnQgZXZ0OwotICBldnQuc3RhdHVzID0gMHgwMTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqY2lnX2NhbGxiYWNrc18sCi0gICAgICBPbkNpZ0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lnT25DcmVhdGVDbXBsLCBfKSkKLSAgICAgIC5XaWxsT25jZShbJmV2dF0odWludDhfdCB0eXBlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgIGV2dCA9ICpzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfY21wbF9ldnQqPigKLSAgICAgICAgICAgIGRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0pOwotCi0gIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkID0gMTI3OwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotICBBU1NFUlRfRVEoZXZ0LnN0YXR1cywgSENJX1NVQ0NFU1MpOwotCi0gIC8vIFNlY29uZCBjYWxsIHdpdGggdGhlIHNhbWUgQ0lHIElEIHNob3VsZCBmYWlsCi0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyksCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJhbHJlYWR5IGV4aXN0cyIpOwotfQotCi0vLyBDaGVjayBmb3IgaGFuZGxpbmcgaW52YWxpZCBsZW5ndGggcmVzcG9uc2UgZnJvbSB0aGUgZmF1bHR5IGNvbnRyb2xsZXIKLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBDcmVhdGVDaWdDYWxsYmFja0ludmFsaWRSc3BQYWNrZXQpIHsKLSAgdWludDhfdCBoY2lfbW9ja19yc3BfYnVmZmVyW10gPSB7MHgwMCwgMHgwMH07Ci0gIE9OX0NBTEwoaGNpY19pbnRlcmZhY2VfLCBTZXRDaWdQYXJhbXMpCi0gICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICBbJmhjaV9tb2NrX3JzcF9idWZmZXJdKAotICAgICAgICAgICAgICBhdXRvLCBhdXRvLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICAgICAgICAgICAgc3RkOjptb3ZlKGNiKS5SdW4oaGNpX21vY2tfcnNwX2J1ZmZlciwgc2l6ZW9mKGhjaV9tb2NrX3JzcF9idWZmZXIpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0pOwotCi0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygxMjgsIGtEZWZhdWx0Q2lnUGFyYW1zKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIkludmFsaWQgcGFja2V0IGxlbmd0aCIpOwotfQotCi0vLyBDaGVjayBmb3IgaGFuZGxpbmcgaW52YWxpZCBsZW5ndGggcmVzcG9uc2UgZnJvbSB0aGUgZmF1bHR5IGNvbnRyb2xsZXIKLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBDcmVhdGVDaWdDYWxsYmFja0ludmFsaWRSc3BQYWNrZXQyKSB7Ci0gIHVpbnQ4X3QgaGNpX21vY2tfcnNwX2J1ZmZlcltdID0gezB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDB9OwotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgU2V0Q2lnUGFyYW1zKQotICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgWyZoY2lfbW9ja19yc3BfYnVmZmVyXSgKLSAgICAgICAgICAgICAgYXV0bywgYXV0bywgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKGhjaV9tb2NrX3JzcF9idWZmZXIsIHNpemVvZihoY2lfbW9ja19yc3BfYnVmZmVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICB9KTsKLQotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoMTI4LCBrRGVmYXVsdENpZ1BhcmFtcyksCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJJbnZhbGlkIENJUyBjb3VudCIpOwotfQotCi0vLyBDaGVjayBpZiBJc29NYW5hZ2VyIHByb3Blcmx5IGhhbmRsZXMgZXJyb3IgcmVzcG9uc2VzIGZyb20gSENJIGxheWVyCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIENyZWF0ZUNpZ0NhbGxiYWNrSW52YWxpZFN0YXR1cykgewotICB1aW50OF90IHJzcF9jaWdfaWQgPSAxMjg7Ci0gIHVpbnQ4X3QgcnNwX3N0YXR1cyA9IDB4MDE7Ci0gIHVpbnQ4X3QgcnNwX2Npc19jbnQgPSAzOwotICB1aW50OF90IGhjaV9tb2NrX3JzcF9idWZmZXJbXSA9IHtyc3Bfc3RhdHVzLCByc3BfY2lnX2lkLCByc3BfY2lzX2NudH07Ci0KLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFNldENpZ1BhcmFtcykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIFsmaGNpX21vY2tfcnNwX2J1ZmZlcl0oCi0gICAgICAgICAgICAgIGF1dG8sIGF1dG8sIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gICAgICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bihoY2lfbW9ja19yc3BfYnVmZmVyLCBzaXplb2YoaGNpX21vY2tfcnNwX2J1ZmZlcikpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgfSk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX2NtcGxfZXZ0IGV2dDsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqY2lnX2NhbGxiYWNrc18sCi0gICAgICBPbkNpZ0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lnT25DcmVhdGVDbXBsLCBfKSkKLSAgICAgIC5XaWxsT25jZShbJmV2dF0odWludDhfdCB0eXBlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgIGV2dCA9ICpzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfY21wbF9ldnQqPigKLSAgICAgICAgICAgIGRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0pOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZyhyc3BfY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0gIEFTU0VSVF9FUShldnQuY2lnX2lkLCByc3BfY2lnX2lkKTsKLSAgQVNTRVJUX0VRKGV2dC5zdGF0dXMsIHJzcF9zdGF0dXMpOwotICBBU1NFUlRfVFJVRShldnQuY29ubl9oYW5kbGVzLmVtcHR5KCkpOwotfQotCi0vLyBDaGVjayB2YWxpZCBjYWxsYmFjayByZXNwb25zZQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBDcmVhdGVDaWdDYWxsYmFja1ZhbGlkKSB7Ci0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9jbXBsX2V2dCBldnQ7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgKmNpZ19jYWxsYmFja3NfLAotICAgICAgT25DaWdFdmVudChibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpZ09uQ3JlYXRlQ21wbCwgXykpCi0gICAgICAuV2lsbE9uY2UoWyZldnRdKHVpbnQ4X3QgdHlwZSwgdm9pZCogZGF0YSkgewotICAgICAgICBldnQgPSAqc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICBkYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9KTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotICBBU1NFUlRfRVEoZXZ0LmNpZ19pZCwgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpOwotICBBU1NFUlRfRVEoZXZ0LnN0YXR1cywgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5zdGF0dXMpOwotICBBU1NFUlRfRVEoZXZ0LmNvbm5faGFuZGxlcy5zaXplKCksIDJ1KTsKLSAgQVNTRVJUX1RSVUUoCi0gICAgICBzdGQ6OmlzX3Blcm11dGF0aW9uKGV2dC5jb25uX2hhbmRsZXMuYmVnaW4oKSwgZXZ0LmNvbm5faGFuZGxlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+KHsweDBFRkYsIDB4MDBGRn0pLmJlZ2luKCkpKTsKLX0KLQotLy8gQ2hlY2sgaWYgQ0lHIHJlY29uZmlndXJlIHRyaWdnZXJzIEhDSSBsYXllciBjYWxsCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFJlY29uZmlndXJlQ2lnSGNpQ2FsbCkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIEVYUEVDVF9DQUxMKGhjaWNfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgU2V0Q2lnUGFyYW1zKHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvX21hdGNoZXJzOjpFcShrRGVmYXVsdENpZ1BhcmFtcyksIF8pKQotICAgICAgLlRpbWVzKDEpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZWNvbmZpZ3VyZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci19Ci0KLS8vIFZlcmlmeSBoYW5kbGlkbmcgaW52YWxpZCBjYWxsIC0gcmVjb25maWd1cmluZyBpbnZhbGlkIENJRwotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIFJlY29uZmlndXJlQ2lnV2l0aE5vU3VjaENpZykgewotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZWNvbmZpZ3VyZUNpZygxMjgsIGtEZWZhdWx0Q2lnUGFyYW1zKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIk5vIHN1Y2ggY2lnIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBSZWNvbmZpZ3VyZUNpZ0ludmFsaWRSc3BQYWNrZXQpIHsKLSAgdWludDhfdCBoY2lfbW9ja19yc3BfYnVmZmVyW10gPSB7MHgwMCwgMHgwMH07Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgU2V0Q2lnUGFyYW1zKQotICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgWyZoY2lfbW9ja19yc3BfYnVmZmVyXSgKLSAgICAgICAgICAgICAgYXV0bywgYXV0bywgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKGhjaV9tb2NrX3JzcF9idWZmZXIsIHNpemVvZihoY2lfbW9ja19yc3BfYnVmZmVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICB9KTsKLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVjb25maWd1cmVDaWcoCi0gICAgICAgICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBSZWNvbmZpZ3VyZUNpZ0ludmFsaWRSc3BQYWNrZXQyKSB7Ci0gIHVpbnQ4X3QgaGNpX21vY2tfcnNwX2J1ZmZlcltdID0gezB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDB9OwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFNldENpZ1BhcmFtcykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIFsmaGNpX21vY2tfcnNwX2J1ZmZlcl0oCi0gICAgICAgICAgICAgIGF1dG8sIGF1dG8sIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gICAgICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bihoY2lfbW9ja19yc3BfYnVmZmVyLCBzaXplb2YoaGNpX21vY2tfcnNwX2J1ZmZlcikpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgfSk7Ci0gIEFTU0VSVF9FWElUKAotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVjb25maWd1cmVDaWcoCi0gICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zMiksCi0gICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiSW52YWxpZCBDSVMgY291bnQiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBSZWNvbmZpZ3VyZUNpZ0ludmFsaWRTdGF0dXMpIHsKLSAgdWludDhfdCByc3BfY2lnX2lkID0gMTI4OwotICB1aW50OF90IHJzcF9zdGF0dXMgPSAweDAxOwotICB1aW50OF90IHJzcF9jaXNfY250ID0gMzsKLSAgdWludDhfdCBoY2lfbW9ja19yc3BfYnVmZmVyW10gPSB7cnNwX3N0YXR1cywgcnNwX2NpZ19pZCwgcnNwX2Npc19jbnR9OwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZyhyc3BfY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgLy8gU2V0LXVwIHRoZSBpbnZhbGlkIHJlc3BvbnNlCi0gIE9OX0NBTEwoaGNpY19pbnRlcmZhY2VfLCBTZXRDaWdQYXJhbXMpCi0gICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICBbJmhjaV9tb2NrX3JzcF9idWZmZXJdKAotICAgICAgICAgICAgICBhdXRvLCBhdXRvLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICAgICAgICAgICAgc3RkOjptb3ZlKGNiKS5SdW4oaGNpX21vY2tfcnNwX2J1ZmZlciwgc2l6ZW9mKGhjaV9tb2NrX3JzcF9idWZmZXIpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0pOwotCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX2NyZWF0ZV9jbXBsX2V2dCBldnQ7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgKmNpZ19jYWxsYmFja3NfLAotICAgICAgT25DaWdFdmVudChibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpZ09uUmVjb25maWd1cmVDbXBsLCBfKSkKLSAgICAgIC5XaWxsT25jZShbJmV2dF0odWludDhfdCB0eXBlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgIGV2dCA9ICpzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfY21wbF9ldnQqPigKLSAgICAgICAgICAgIGRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0pOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZWNvbmZpZ3VyZUNpZyhyc3BfY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtczIpOwotCi0gIEFTU0VSVF9FUShldnQuY2lnX2lkLCByc3BfY2lnX2lkKTsKLSAgQVNTRVJUX0VRKGV2dC5zdGF0dXMsIHJzcF9zdGF0dXMpOwotICBBU1NFUlRfVFJVRShldnQuY29ubl9oYW5kbGVzLmVtcHR5KCkpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFJlY29uZmlndXJlQ2lnVmFsaWQpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfY21wbF9ldnQgZXZ0OwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpjaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQ2lnRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaWdPblJlY29uZmlndXJlQ21wbCwgXykpCi0gICAgICAuV2lsbE9uY2UoWyZldnRdKHVpbnQ4X3QgdHlwZSwgdm9pZCogZGF0YSkgewotICAgICAgICBldnQgPSAqc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICBkYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9KTsKLQotICAvLyBWZXJpZnkgdmFsaWQgcmVjb25maWd1cmF0aW9uIHJlcXVlc3QKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVjb25maWd1cmVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMyKTsKLSAgQVNTRVJUX0VRKGV2dC5jaWdfaWQsIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkKTsKLSAgQVNTRVJUX0VRKGV2dC5zdGF0dXMsIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uc3RhdHVzKTsKLSAgQVNTRVJUX1RSVUUoc3RkOjppc19wZXJtdXRhdGlvbigKLSAgICAgIGV2dC5jb25uX2hhbmRsZXMuYmVnaW4oKSwgZXZ0LmNvbm5faGFuZGxlcy5lbmQoKSwKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzLmJlZ2luKCkpKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBSZW1vdmVDaWdIY2lDYWxsKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgRVhQRUNUX0NBTEwoaGNpY19pbnRlcmZhY2VfLAotICAgICAgICAgICAgICBSZW1vdmVDaWcodm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIF8pKQotICAgICAgLlRpbWVzKDEpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCk7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBSZW1vdmVDaWdXaXRoTm9TdWNoQ2lnKSB7Ci0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlJlbW92ZUNpZygKLSAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIk5vIHN1Y2ggY2lnIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBSZW1vdmVTYW1lQ2lnVHdpY2UpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgUmVtb3ZlQ2lnKQotICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgW3RoaXNdKGF1dG8sIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gICAgICAgICAgICB1aW50OF90IGhjaV9tb2NrX3JzcF9idWZmZXJbMl07Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gaGNpX21vY2tfcnNwX2J1ZmZlcjsKLQotICAgICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIEhDSV9TVUNDRVNTKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCB0aGlzLT52b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCk7Ci0KLSAgICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKGhjaV9tb2NrX3JzcF9idWZmZXIsIHNpemVvZihoY2lfbW9ja19yc3BfYnVmZmVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICB9KTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCk7Ci0KLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlQ2lnKAotICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiTm8gc3VjaCBjaWciKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIFJlbW92ZUNpZ0ludmFsaWRSc3BQYWNrZXQpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgUmVtb3ZlQ2lnKQotICAgICAgLldpbGxCeURlZmF1bHQoW10oYXV0bywgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgdWludDhfdCBoY2lfbW9ja19yc3BfYnVmZmVyW10gPSB7MHgwMH07ICAvLyBzdGF0dXMgYnl0ZSBvbmx5Ci0KLSAgICAgICAgc3RkOjptb3ZlKGNiKS5SdW4oaGNpX21vY2tfcnNwX2J1ZmZlciwgc2l6ZW9mKGhjaV9tb2NrX3JzcF9idWZmZXIpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9KTsKLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlQ2lnKAotICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgUmVtb3ZlQ2lnSW52YWxpZFN0YXR1cykgewotICB1aW50OF90IHJzcF9zdGF0dXMgPSAweDAyOwotICB1aW50OF90IGhjaV9tb2NrX3JzcF9idWZmZXJbXSA9IHtyc3Bfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZH07Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgUmVtb3ZlQ2lnKQotICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgWyZoY2lfbW9ja19yc3BfYnVmZmVyXSgKLSAgICAgICAgICAgICAgYXV0bywgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKGhjaV9tb2NrX3JzcF9idWZmZXIsIHNpemVvZihoY2lfbW9ja19yc3BfYnVmZmVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICB9KTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19yZW1vdmVfY21wbF9ldnQgZXZ0OwotICBPTl9DQUxMKCpjaWdfY2FsbGJhY2tzXywKLSAgICAgICAgICBPbkNpZ0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lnT25SZW1vdmVDbXBsLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFsmZXZ0XSh1aW50OF90IHR5cGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgZXZ0ID0gKnN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX3JlbW92ZV9jbXBsX2V2dCo+KAotICAgICAgICAgICAgZGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfSk7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpOwotICBBU1NFUlRfRVEoZXZ0LmNpZ19pZCwgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpOwotICBBU1NFUlRfRVEoZXZ0LnN0YXR1cywgcnNwX3N0YXR1cyk7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgUmVtb3ZlQ2lnVmFsaWQpIHsKLSAgdWludDhfdCBoY2lfbW9ja19yc3BfYnVmZmVyW10gPSB7SENJX1NVQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkfTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIE9OX0NBTEwoaGNpY19pbnRlcmZhY2VfLCBSZW1vdmVDaWcpCi0gICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICBbJmhjaV9tb2NrX3JzcF9idWZmZXJdKAotICAgICAgICAgICAgICBhdXRvLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICAgICAgICAgICAgc3RkOjptb3ZlKGNiKS5SdW4oaGNpX21vY2tfcnNwX2J1ZmZlciwgc2l6ZW9mKGhjaV9tb2NrX3JzcF9idWZmZXIpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0pOwotCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lnX3JlbW92ZV9jbXBsX2V2dCBldnQ7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgKmNpZ19jYWxsYmFja3NfLAotICAgICAgT25DaWdFdmVudChibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpZ09uUmVtb3ZlQ21wbCwgXykpCi0gICAgICAuV2lsbE9uY2UoWyZldnRdKHVpbnQ4X3QgdHlwZSwgdm9pZCogZGF0YSkgewotICAgICAgICBldnQgPSAqc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfcmVtb3ZlX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICBkYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9KTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCk7Ci0gIEFTU0VSVF9FUShldnQuY2lnX2lkLCB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCk7Ci0gIEFTU0VSVF9FUShldnQuc3RhdHVzLCBIQ0lfU1VDQ0VTUyk7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgRXN0YWJsaXNoQ2lzSGNpQ2FsbCkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgcGFyYW1zLmNvbm5fcGFpcnMucHVzaF9iYWNrKHtoYW5kbGUsIDF9KTsKLSAgfQotCi0gIEVYUEVDVF9DQUxMKGhjaWNfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgQ3JlYXRlQ2lzKDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc29fbWF0Y2hlcnM6OkVxUG9pbnRlZEFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jb25uX3BhaXJzLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY29ubl9wYWlycy5zaXplKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zLmNvbm5fcGFpcnMuZGF0YSgpWzBdKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBfKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBFc3RhYmxpc2hDaXNXaXRoTm9TdWNoQ2lzKSB7Ci0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgcGFyYW1zLmNvbm5fcGFpcnMucHVzaF9iYWNrKHtoYW5kbGUsIDF9KTsKLSAgfQotCi0gIEFTU0VSVF9FWElUKAotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKAotICAgICAgICAgIHBhcmFtcyksCi0gICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiTm8gc3VjaCBjaXMiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIENvbm5lY3RTYW1lQ2lzVHdpY2UpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgQVNTRVJUX0VYSVQoCi0gICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Jc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMoCi0gICAgICAgICAgcGFyYW1zKSwKLSAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJBbHJlYWR5IGNvbm5lY3RlZCIpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdCwgRXN0YWJsaXNoQ2lzSW52YWxpZFJlc3BvbnNlUGFja2V0KSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIENyZWF0ZUNpcykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFt0aGlzXSh1aW50OF90IG51bV9jaXMsIGNvbnN0IEVYVF9DSVNfQ1JFQVRFX0NGRyogY2lzX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKDI3KTsKLSAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgSENJX1NVQ0NFU1MpOwotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLSAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIDB4RUEpOyAgICAvLyBDSUcgc3luYyBkZWxheQotICAgICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgMHhFQik7ICAgIC8vIENJUyBzeW5jIGRlbGF5Ci0gICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweEVDKTsgICAgLy8gdHJhbnNwb3J0IGxhdGVuY3kgbXRvcwotICAgICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgMHhFRCk7ICAgIC8vIHRyYW5zcG9ydCBsYXRlbmN5IHN0b20KLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwMSk7ICAgICAvLyBwaHkgbXRvcwotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAyKTsgICAgIC8vIHBoeSBzdG9tCi0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIDB4MDEpOyAgICAgLy8gbnNlCi0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIDB4MDIpOyAgICAgLy8gYm4gbXRvcwotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAzKTsgICAgIC8vIGJuIHN0b20KLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwNCk7ICAgICAvLyBmdCBtdG9zCi0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIDB4MDUpOyAgICAgLy8gZnQgc3RvbQotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgMHgwMEZBKTsgIC8vIE1heCBQRFUgbXRvcwotICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgMHgwMEZCKTsgIC8vIE1heCBQRFUgc3RvbQotCi0gICAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoSENJX0JMRV9DSVNfRVNUX0VWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX3BhcmFtcyBwYXJhbXM7Ci0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBwYXJhbXMuY29ubl9wYWlycy5wdXNoX2JhY2soe2hhbmRsZSwgMX0pOwotICB9Ci0KLSAgQVNTRVJUX0VYSVQoCi0gICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Jc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMoCi0gICAgICAgICAgcGFyYW1zKSwKLSAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJJbnZhbGlkIHBhY2tldCBsZW5ndGgiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBFc3RhYmxpc2hDaXNJbnZhbGlkQ29tbWFuZFN0YXR1cykgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotICB1aW50MTZfdCBpbnZhbGlkX3N0YXR1cyA9IDB4MDAwMTsKLQotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgQ3JlYXRlQ2lzKQotICAgICAgLldpbGxCeURlZmF1bHQoW2ludmFsaWRfc3RhdHVzXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9jaXMsIGNvbnN0IEVYVF9DSVNfQ1JFQVRFX0NGRyogY2lzX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bigodWludDhfdCopJmludmFsaWRfc3RhdHVzLCBzaXplb2YoaW52YWxpZF9zdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9KTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpjaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQ2lzRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNFc3RhYmxpc2hDbXBsLCBfKSkKLSAgICAgIC5UaW1lcyhrRGVmYXVsdENpZ1BhcmFtcy5jaXNfY2Zncy5zaXplKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoW3RoaXMsIGludmFsaWRfc3RhdHVzXSh1aW50OF90IHR5cGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0KiBldnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICAgICAgZGF0YSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKGV2dC0+c3RhdHVzLCBpbnZhbGlkX3N0YXR1cyk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKAotICAgICAgICAgICAgc3RkOjpmaW5kKHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgZXZ0LT5jaXNfY29ubl9oZGwpICE9Ci0gICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcy5lbmQoKSk7Ci0gICAgICB9KTsKLQotICAvLyBFc3RhYmxpc2ggYWxsIENJU2VzCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgcGFyYW1zLmNvbm5fcGFpcnMucHVzaF9iYWNrKHtoYW5kbGUsIDF9KTsKLSAgfQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMocGFyYW1zKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBFc3RhYmxpc2hDaXNJbnZhbGlkU3RhdHVzKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0gIHVpbnQ4X3QgaW52YWxpZF9zdGF0dXMgPSAweDAxOwotCi0gIE9OX0NBTEwoaGNpY19pbnRlcmZhY2VfLCBDcmVhdGVDaXMpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChbdGhpcywgaW52YWxpZF9zdGF0dXNdKAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2NpcywgY29uc3QgRVhUX0NJU19DUkVBVEVfQ0ZHKiBjaXNfY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoMjgpOwotICAgICAgICAgIHVpbnQ4X3QqIHAgPSBidWYuZGF0YSgpOwotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBpbnZhbGlkX3N0YXR1cyk7Ci0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBoYW5kbGUpOwotICAgICAgICAgIFVJTlQyNF9UT19TVFJFQU0ocCwgMHhFQSk7ICAgIC8vIENJRyBzeW5jIGRlbGF5Ci0gICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweEVCKTsgICAgLy8gQ0lTIHN5bmMgZGVsYXkKLSAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIDB4RUMpOyAgICAvLyB0cmFuc3BvcnQgbGF0ZW5jeSBtdG9zCi0gICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweEVEKTsgICAgLy8gdHJhbnNwb3J0IGxhdGVuY3kgc3RvbQotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAxKTsgICAgIC8vIHBoeSBtdG9zCi0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIDB4MDIpOyAgICAgLy8gcGh5IHN0b20KLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwMSk7ICAgICAvLyBuc2UKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwMik7ICAgICAvLyBibiBtdG9zCi0gICAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIDB4MDMpOyAgICAgLy8gYm4gc3RvbQotICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDA0KTsgICAgIC8vIGZ0IG10b3MKLSAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMHgwNSk7ICAgICAvLyBmdCBzdG9tCi0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCAweDAwRkEpOyAgLy8gTWF4IFBEVSBtdG9zCi0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCAweDAwRkIpOyAgLy8gTWF4IFBEVSBzdG9tCi0gICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCAweDBDNjApOyAgLy8gSVNPIGludGVydmFsCi0KLSAgICAgICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVIY2lFdmVudChIQ0lfQkxFX0NJU19FU1RfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpjaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQ2lzRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNFc3RhYmxpc2hDbXBsLCBfKSkKLSAgICAgIC5UaW1lcyhrRGVmYXVsdENpZ1BhcmFtcy5jaXNfY2Zncy5zaXplKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoW3RoaXMsIGludmFsaWRfc3RhdHVzXSh1aW50OF90IHR5cGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0KiBldnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICAgICAgZGF0YSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKGV2dC0+c3RhdHVzLCBpbnZhbGlkX3N0YXR1cyk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKAotICAgICAgICAgICAgc3RkOjpmaW5kKHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgZXZ0LT5jaXNfY29ubl9oZGwpICE9Ci0gICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcy5lbmQoKSk7Ci0gICAgICB9KTsKLQotICAvLyBFc3RhYmxpc2ggYWxsIENJU2VzIGJlZm9yZSBzZXR0aW5nIHVwIHRoZWlyIGRhdGEgcGF0aHMKLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX3BhcmFtcyBwYXJhbXM7Ci0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBwYXJhbXMuY29ubl9wYWlycy5wdXNoX2JhY2soe2hhbmRsZSwgMX0pOwotICB9Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcyhwYXJhbXMpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIEVzdGFibGlzaENpc1ZhbGlkKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqY2lnX2NhbGxiYWNrc18sCi0gICAgICBPbkNpc0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lzRXN0YWJsaXNoQ21wbCwgXykpCi0gICAgICAuVGltZXMoa0RlZmF1bHRDaWdQYXJhbXMuY2lzX2NmZ3Muc2l6ZSgpKQotICAgICAgLldpbGxSZXBlYXRlZGx5KFt0aGlzXSh1aW50OF90IHR5cGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0KiBldnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICAgICAgZGF0YSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKGV2dC0+c3RhdHVzLCBIQ0lfU1VDQ0VTUyk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKAotICAgICAgICAgICAgc3RkOjpmaW5kKHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgZXZ0LT5jaXNfY29ubl9oZGwpICE9Ci0gICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcy5lbmQoKSk7Ci0gICAgICB9KTsKLQotICAvLyBFc3RhYmxpc2ggYWxsIENJU2VzIGJlZm9yZSBzZXR0aW5nIHVwIHRoZWlyIGRhdGEgcGF0aHMKLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX3BhcmFtcyBwYXJhbXM7Ci0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBwYXJhbXMuY29ubl9wYWlycy5wdXNoX2JhY2soe2hhbmRsZSwgMX0pOwotICB9Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcyhwYXJhbXMpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFJlY29ubmVjdENpc1ZhbGlkKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgLy8gRXN0YWJsaXNoIGFsbCBDSVNlcyBiZWZvcmUgc2V0dGluZyB1cCB0aGVpciBkYXRhIHBhdGhzCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgcGFyYW1zLmNvbm5fcGFpcnMucHVzaF9iYWNrKHtoYW5kbGUsIDF9KTsKLSAgfQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMocGFyYW1zKTsKLQotICAvLyB0cmlnZ2VyIEhDSSBkaXNjb25uZWN0aW9uIGV2ZW50Ci0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVEaXNjb25uZWN0KGhhbmRsZSwgMHgxNik7Ci0gIH0KLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpjaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQ2lzRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNFc3RhYmxpc2hDbXBsLCBfKSkKLSAgICAgIC5UaW1lcyhrRGVmYXVsdENpZ1BhcmFtcy5jaXNfY2Zncy5zaXplKCkpCi0gICAgICAuV2lsbFJlcGVhdGVkbHkoW3RoaXNdKHVpbnQ4X3QgdHlwZSwgdm9pZCogZGF0YSkgewotICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfY21wbF9ldnQqIGV2dCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfY21wbF9ldnQqPigKLSAgICAgICAgICAgICAgICBkYXRhKTsKLQotICAgICAgICBBU1NFUlRfRVEoZXZ0LT5zdGF0dXMsIEhDSV9TVUNDRVNTKTsKLSAgICAgICAgQVNTRVJUX1RSVUUoCi0gICAgICAgICAgICBzdGQ6OmZpbmQodm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBldnQtPmNpc19jb25uX2hkbCkgIT0KLSAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzLmVuZCgpKTsKLSAgICAgIH0pOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMocGFyYW1zKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBEaXNjb25uZWN0Q2lzSGNpQ2FsbCkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIC8vIEVzdGFibGlzaCBhbGwgQ0lTZXMgYmVmb3JlIHNldHRpbmcgdXAgdGhlaXIgZGF0YSBwYXRocwotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIEVYUEVDVF9DQUxMKGhjaWNfaW50ZXJmYWNlXywgRGlzY29ubmVjdChoYW5kbGUsIDB4MTYpKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Jc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5EaXNjb25uZWN0Q2lzKGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYpOwotICB9Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBEaXNjb25uZWN0Q2lzV2l0aE5vU3VjaENpcykgewotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgQVNTRVJUX0VYSVQoCi0gICAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPklzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkRpc2Nvbm5lY3RDaXMoCi0gICAgICAgICAgICBoYW5kbGUsIDB4MTYpLAotICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiTm8gc3VjaCBjaXMiKTsKLSAgfQotfQotCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdCwgRGlzY29ubmVjdFNhbWVDaXNUd2ljZSkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIC8vIEVzdGFibGlzaCBhbGwgQ0lTZXMgYmVmb3JlIHNldHRpbmcgdXAgdGhlaXIgZGF0YSBwYXRocwotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPklzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkRpc2Nvbm5lY3RDaXMoaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNik7Ci0gIH0KLQotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgQVNTRVJUX0VYSVQoCi0gICAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPklzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkRpc2Nvbm5lY3RDaXMoCi0gICAgICAgICAgICBoYW5kbGUsIDB4MTYpLAotICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiTm90IGNvbm5lY3RlZCIpOwotICB9Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgRGlzY29ubmVjdENpc1ZhbGlkKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgLy8gRXN0YWJsaXNoIGFsbCBDSVNlcyBiZWZvcmUgc2V0dGluZyB1cCB0aGVpciBkYXRhIHBhdGhzCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgcGFyYW1zLmNvbm5fcGFpcnMucHVzaF9iYWNrKHtoYW5kbGUsIDF9KTsKLSAgfQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMocGFyYW1zKTsKLQotICB1aW50OF90IGRpc2Nvbm5lY3RfcmVhc29uID0gMHgxNjsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIEVYUEVDVF9DQUxMKCpjaWdfY2FsbGJhY2tzXywgT25DaXNFdmVudCkKLSAgICAgICAgLldpbGxPbmNlKFt0aGlzLCBoYW5kbGUsIGRpc2Nvbm5lY3RfcmVhc29uXSh1aW50OF90IGV2ZW50X2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICAgICAgICAgIEFTU0VSVF9FUShldmVudF9jb2RlLAotICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpc0Rpc2Nvbm5lY3RlZCk7Ci0gICAgICAgICAgYXV0byogZXZlbnQgPQotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19kaXNjb25uZWN0ZWRfZXZ0Kj4oCi0gICAgICAgICAgICAgICAgICBkYXRhKTsKLSAgICAgICAgICBBU1NFUlRfRVEoZXZlbnQtPnJlYXNvbiwgZGlzY29ubmVjdF9yZWFzb24pOwotICAgICAgICAgIEFTU0VSVF9FUShldmVudC0+Y2lnX2lkLCB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCk7Ci0gICAgICAgICAgQVNTRVJUX0VRKGV2ZW50LT5jaXNfY29ubl9oZGwsIGhhbmRsZSk7Ci0gICAgICAgIH0pCi0gICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RGlzY29ubmVjdENpcygKLSAgICAgICAgaGFuZGxlLCBkaXNjb25uZWN0X3JlYXNvbik7Ci0gIH0KLX0KLQotLy8gQ2hlY2sgaWYgd2UgcHJvcGVybHkgaWdub3JlIG5vdCBJU08gcmVsYXRlZCBkaXNjb25uZWN0IGV2ZW50cwotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIERpc2Nvbm5lY3RDaXNJbnZhbGlkUmVzcG9uc2UpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgLy8gTWFrZSB0aGUgSENJIGxheWVyIHNlbmQgaW52YWxpZCBoYW5kbGVzIGluIGRpc2Nvbm5lY3QgZXZlbnQKLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIERpc2Nvbm5lY3QpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChbXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gICAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoaGFuZGxlICsgMSwgcmVhc29uKTsKLSAgICAgIH0pOwotCi0gIC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgY2FsbHMgYXMgdGhlc2UgYXJlIG5vdCBJU08gaGFuZGxlcwotICBPTl9DQUxMKCpjaWdfY2FsbGJhY2tzXywKLSAgICAgICAgICBPbkNpc0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lzRGlzY29ubmVjdGVkLCBfKSkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKHVpbnQ4X3QgZXZlbnRfY29kZSwgdm9pZCogZGF0YSkgeyBGQUlMKCk7IH0pOwotCi0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Jc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5EaXNjb25uZWN0Q2lzKGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYpOwotICB9Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgQ3JlYXRlQmlnSGNpQ2FsbCkgewotICBmb3IgKHVpbnQ4X3QgaSA9IDIyMDsgaSAhPSA2MDsgKytpKSB7Ci0gICAgRVhQRUNUX0NBTEwoaGNpY19pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIENyZWF0ZUJpZyhpLCBpc29fbWF0Y2hlcnM6OkVxKGtEZWZhdWx0QmlnUGFyYW1zKSkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyhpLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIH0KLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBDcmVhdGVCaWdWYWxpZCkgewotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfY21wbF9ldnQgZXZ0OwotICBldnQuc3RhdHVzID0gMHgwMTsKLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqYmlnX2NhbGxiYWNrc18sCi0gICAgICBPbkJpZ0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50QmlnT25DcmVhdGVDbXBsLCBfKSkKLSAgICAgIC5XaWxsT25jZShbJmV2dF0odWludDhfdCB0eXBlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgIGV2dCA9ICpzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfY21wbF9ldnQqPigKLSAgICAgICAgICAgIGRhdGEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0pOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZygweDAxLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIEFTU0VSVF9FUShldnQuc3RhdHVzLCBIQ0lfU1VDQ0VTUyk7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBDcmVhdGVCaWdJbnZhbGlkUmVzcG9uc2VQYWNrZXQpIHsKLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIENyZWF0ZUJpZykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIFtdKGF1dG8gYmlnX2hhbmRsZSwKLSAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfcGFyYW1zIGJpZ19wYXJhbXMpIHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZigxOCk7Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAwKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBiaWdfaGFuZGxlKTsKLQotICAgICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweDAwODBkZSk7ICAgICAgIC8vIGJpZ19zeW5jX2RlbGF5Ci0gICAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIDB4MDBjZWZlKTsgICAgICAgLy8gdHJhbnNwb3J0X2xhdGVuY3lfYmlnCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX3BhcmFtcy5waHkpOyAgLy8gcGh5Ci0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgNCk7ICAgICAgICAgICAgICAgLy8gbnNlCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7ICAgICAgICAgICAgICAgLy8gYm4KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAwKTsgICAgICAgICAgICAgICAvLyBwdG8KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCA0KTsgICAgICAgICAgICAgICAvLyBpcmMKLSAgICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgMTA4KTsgICAgICAgICAgICAvLyBtYXhfcGR1Ci0gICAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIDYpOyAgICAgICAgICAgICAgLy8gaXNvX2ludGVydmFsCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMCk7ICAgICAgICAgICAgICAgLy8gbnVtIEJJU2VzCi0KLSAgICAgICAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZUhjaUV2ZW50KAotICAgICAgICAgICAgICAgIEhDSV9CTEVfQ1JFQVRFX0JJR19DUExfRVZULCBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgICAgICB9KTsKLQotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcoMHgwMSwga0RlZmF1bHRCaWdQYXJhbXMpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiSW52YWxpZCBiaXMgY291bnQiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIENyZWF0ZUJpZ0ludmFsaWRSZXNwb25zZVBhY2tldDIpIHsKLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIENyZWF0ZUJpZykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIFtdKGF1dG8gYmlnX2hhbmRsZSwKLSAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfcGFyYW1zIGJpZ19wYXJhbXMpIHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZigxOCk7Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAwKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBiaWdfaGFuZGxlKTsKLQotICAgICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweDAwODBkZSk7ICAgICAgIC8vIGJpZ19zeW5jX2RlbGF5Ci0gICAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIDB4MDBjZWZlKTsgICAgICAgLy8gdHJhbnNwb3J0X2xhdGVuY3lfYmlnCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX3BhcmFtcy5waHkpOyAgLy8gcGh5Ci0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgNCk7ICAgICAgICAgICAgICAgLy8gbnNlCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7ICAgICAgICAgICAgICAgLy8gYm4KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAwKTsgICAgICAgICAgICAgICAvLyBwdG8KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCA0KTsgICAgICAgICAgICAgICAvLyBpcmMKLSAgICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgMTA4KTsgICAgICAgICAgICAvLyBtYXhfcGR1Ci0gICAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIDYpOyAgICAgICAgICAgICAgLy8gaXNvX2ludGVydmFsCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX3BhcmFtcy5udW1fYmlzKTsKLQotICAgICAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoCi0gICAgICAgICAgICAgICAgSENJX0JMRV9DUkVBVEVfQklHX0NQTF9FVlQsIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpOwotICAgICAgICAgIH0pOwotCi0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZygweDAxLCBrRGVmYXVsdEJpZ1BhcmFtcyksCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJJbnZhbGlkIHBhY2tldCBsZW5ndGgiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBDcmVhdGVCaWdJbnZhbGlkU3RhdHVzKSB7Ci0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9jbXBsX2V2dCBldnQ7Ci0gIGV2dC5zdGF0dXMgPSAweDAwOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpiaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQmlnRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRCaWdPbkNyZWF0ZUNtcGwsIF8pKQotICAgICAgLldpbGxPbmNlKFsmZXZ0XSh1aW50OF90IHR5cGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgZXZ0ID0gKnN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9jbXBsX2V2dCo+KAotICAgICAgICAgICAgZGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfSk7Ci0KLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIENyZWF0ZUJpZykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KAotICAgICAgICAgIFtdKGF1dG8gYmlnX2hhbmRsZSwKLSAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfcGFyYW1zIGJpZ19wYXJhbXMpIHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZihiaWdfcGFyYW1zLm51bV9iaXMgKiBzaXplb2YodWludDE2X3QpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCk7Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAweDAxKTsKLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBiaWdfaGFuZGxlKTsKLQotICAgICAgICAgICAgVUlOVDI0X1RPX1NUUkVBTShwLCAweDAwODBkZSk7ICAgICAgIC8vIGJpZ19zeW5jX2RlbGF5Ci0gICAgICAgICAgICBVSU5UMjRfVE9fU1RSRUFNKHAsIDB4MDBjZWZlKTsgICAgICAgLy8gdHJhbnNwb3J0X2xhdGVuY3lfYmlnCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX3BhcmFtcy5waHkpOyAgLy8gcGh5Ci0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgNCk7ICAgICAgICAgICAgICAgLy8gbnNlCi0gICAgICAgICAgICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7ICAgICAgICAgICAgICAgLy8gYm4KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCAwKTsgICAgICAgICAgICAgICAvLyBwdG8KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCA0KTsgICAgICAgICAgICAgICAvLyBpcmMKLSAgICAgICAgICAgIFVJTlQxNl9UT19TVFJFQU0ocCwgMTA4KTsgICAgICAgICAgICAvLyBtYXhfcGR1Ci0gICAgICAgICAgICBVSU5UMTZfVE9fU1RSRUFNKHAsIDYpOyAgICAgICAgICAgICAgLy8gaXNvX2ludGVydmFsCi0KLSAgICAgICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBiaWdfcGFyYW1zLm51bV9iaXMpOwotICAgICAgICAgICAgc3RhdGljIHVpbnQ4X3QgY29ubl9oZGwgPSAweDAxOwotICAgICAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgYmlnX3BhcmFtcy5udW1fYmlzOyArK2kpIHsKLSAgICAgICAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBjb25uX2hkbCsrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoCi0gICAgICAgICAgICAgICAgSENJX0JMRV9DUkVBVEVfQklHX0NQTF9FVlQsIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpOwotICAgICAgICAgIH0pOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZygweDAxLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIEFTU0VSVF9FUShldnQuc3RhdHVzLCAweDAxKTsKLSAgQVNTRVJUX0VRKGV2dC5iaWdfaWQsIDB4MDEpOwotICBBU1NFUlRfRVEoZXZ0LmNvbm5faGFuZGxlcy5zaXplKCksIGtEZWZhdWx0QmlnUGFyYW1zLm51bV9iaXMpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdCwgQ3JlYXRlU2FtZUJpZ1R3aWNlKSB7Ci0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9jbXBsX2V2dCBldnQ7Ci0gIGV2dC5zdGF0dXMgPSAweDAxOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpiaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQmlnRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRCaWdPbkNyZWF0ZUNtcGwsIF8pKQotICAgICAgLldpbGxPbmNlKFsmZXZ0XSh1aW50OF90IHR5cGUsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgZXZ0ID0gKnN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9jbXBsX2V2dCo+KAotICAgICAgICAgICAgZGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfSk7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQmlnKDB4MDEsIGtEZWZhdWx0QmlnUGFyYW1zKTsKLSAgQVNTRVJUX0VRKGV2dC5zdGF0dXMsIEhDSV9TVUNDRVNTKTsKLSAgQVNTRVJUX0VRKGV2dC5iaWdfaWQsIDB4MDEpOwotICBBU1NFUlRfRVEoZXZ0LmNvbm5faGFuZGxlcy5zaXplKCksIGtEZWZhdWx0QmlnUGFyYW1zLm51bV9iaXMpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFRlcm1pbmF0ZUJpZ0hjaUNhbGwpIHsKLSAgY29uc3QgdWludDhfdCBiaWdfaWQgPSAweDIyOwotICBjb25zdCB1aW50OF90IHJlYXNvbiA9IDB4MTY7ICAvLyBUZXJtaW5hdGVkIGJ5IGxvY2FsIGhvc3QKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcoYmlnX2lkLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIEVYUEVDVF9DQUxMKGhjaWNfaW50ZXJmYWNlXywgVGVybWluYXRlQmlnKGJpZ19pZCwgcmVhc29uKSkuVGltZXMoMSk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlRlcm1pbmF0ZUJpZyhiaWdfaWQsIHJlYXNvbik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBUZXJtaW5hdGVTYW1lQmlnVHdpY2UpIHsKLSAgY29uc3QgdWludDhfdCBiaWdfaWQgPSAweDIyOwotICBjb25zdCB1aW50OF90IHJlYXNvbiA9IDB4MTY7ICAvLyBUZXJtaW5hdGVkIGJ5IGxvY2FsIGhvc3QKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcoYmlnX2lkLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgKmJpZ19jYWxsYmFja3NfLAotICAgICAgT25CaWdFdmVudChibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudEJpZ09uVGVybWluYXRlQ21wbCwgXykpOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlRlcm1pbmF0ZUJpZyhiaWdfaWQsIHJlYXNvbik7Ci0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlRlcm1pbmF0ZUJpZyhiaWdfaWQsIHJlYXNvbiksCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJObyBzdWNoIGJpZyIpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdCwgVGVybWluYXRlQmlnTm9TdWNoQmlnKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgYmlnX2lkID0gMHgwMTsKLSAgY29uc3QgdWludDhfdCByZWFzb24gPSAweDE2OyAgLy8gVGVybWluYXRlZCBieSBsb2NhbCBob3N0Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqYmlnX2NhbGxiYWNrc18sCi0gICAgICBPbkJpZ0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50QmlnT25DcmVhdGVDbXBsLCBfKSk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyhiaWdfaWQsIGtEZWZhdWx0QmlnUGFyYW1zKTsKLQotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5UZXJtaW5hdGVCaWcoYmlnX2lkICsgMSwgcmVhc29uKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIk5vIHN1Y2ggYmlnIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBUZXJtaW5hdGVCaWdJbnZhbGlkUmVzcG9uc2VQYWNrZXQpIHsKLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFRlcm1pbmF0ZUJpZykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKGF1dG8gYmlnX2hhbmRsZSwgdWludDhfdCByZWFzb24pIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKDEpOwotICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHJlYXNvbik7Ci0KLSAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoSENJX0JMRV9URVJNX0JJR19DUExfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgIH0pOwotCi0gIGNvbnN0IHVpbnQ4X3QgYmlnX2lkID0gMHgyMjsKLSAgY29uc3QgdWludDhfdCByZWFzb24gPSAweDE2OyAgLy8gVGVybWluYXRlZCBieSBsb2NhbCBob3N0Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQmlnKGJpZ19pZCwga0RlZmF1bHRCaWdQYXJhbXMpOwotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5UZXJtaW5hdGVCaWcoYmlnX2lkLCByZWFzb24pLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiSW52YWxpZCBwYWNrZXQgbGVuZ3RoIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBUZXJtaW5hdGVCaWdJbnZhbGlkUmVzcG9uc2VQYWNrZXQyKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgYmlnX2lkID0gMHgyMjsKLSAgY29uc3QgdWludDhfdCByZWFzb24gPSAweDE2OyAgLy8gVGVybWluYXRlZCBieSBsb2NhbCBob3N0Ci0KLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFRlcm1pbmF0ZUJpZykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKGF1dG8gYmlnX2hhbmRsZSwgdWludDhfdCByZWFzb24pIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKDMpOwotICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHJlYXNvbik7Ci0KLSAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoSENJX0JMRV9URVJNX0JJR19DUExfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgIH0pOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyhiaWdfaWQsIGtEZWZhdWx0QmlnUGFyYW1zKTsKLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+VGVybWluYXRlQmlnKGJpZ19pZCwgcmVhc29uKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIkludmFsaWQgcGFja2V0IGxlbmd0aCIpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFRlcm1pbmF0ZUJpZ0ludmFsaWRSZXNwb25zZUJpZ0lkKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgYmlnX2lkID0gMHgyMjsKLSAgY29uc3QgdWludDhfdCByZWFzb24gPSAweDE2OyAgLy8gVGVybWluYXRlZCBieSBsb2NhbCBob3N0Ci0KLSAgT05fQ0FMTChoY2ljX2ludGVyZmFjZV8sIFRlcm1pbmF0ZUJpZykKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKGF1dG8gYmlnX2hhbmRsZSwgdWludDhfdCByZWFzb24pIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKDIpOwotICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHJlYXNvbik7Ci0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBiaWdfaGFuZGxlICsgMSk7Ci0KLSAgICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSGNpRXZlbnQoSENJX0JMRV9URVJNX0JJR19DUExfRVZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgIH0pOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyhiaWdfaWQsIGtEZWZhdWx0QmlnUGFyYW1zKTsKLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+VGVybWluYXRlQmlnKGJpZ19pZCwgcmVhc29uKSwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgIk5vIHN1Y2ggYmlnIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgVGVybWluYXRlQmlnVmFsaWQpIHsKLSAgY29uc3QgdWludDhfdCBiaWdfaWQgPSAweDIyOwotICBjb25zdCB1aW50OF90IHJlYXNvbiA9IDB4MTY7ICAvLyBUZXJtaW5hdGVkIGJ5IGxvY2FsIGhvc3QKLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpiaWdfdGVybWluYXRlX2NtcGxfZXZ0IGV2dDsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcoYmlnX2lkLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICAqYmlnX2NhbGxiYWNrc18sCi0gICAgICBPbkJpZ0V2ZW50KGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50QmlnT25UZXJtaW5hdGVDbXBsLCBfKSkKLSAgICAgIC5XaWxsT25jZShbJmV2dF0odWludDhfdCB0eXBlLCB2b2lkKiBkYXRhKSB7Ci0gICAgICAgIGV2dCA9Ci0gICAgICAgICAgICAqc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpiaWdfdGVybWluYXRlX2NtcGxfZXZ0Kj4oCi0gICAgICAgICAgICAgICAgZGF0YSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfSk7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+VGVybWluYXRlQmlnKGJpZ19pZCwgcmVhc29uKTsKLSAgQVNTRVJUX0VRKGV2dC5iaWdfaWQsIGJpZ19pZCk7Ci0gIEFTU0VSVF9FUShldnQucmVhc29uLCByZWFzb24pOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFNldHVwSXNvRGF0YVBhdGhWYWxpZCkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcodm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRCaWdQYXJhbXMpOwotCi0gIC8vIEVzdGFibGlzaCBhbGwgQ0lTZXMgYmVmb3JlIHNldHRpbmcgdXAgdGhlaXIgZGF0YSBwYXRocwotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjppc29fZGF0YV9wYXRoX3BhcmFtcyBwYXRoX3BhcmFtcyA9Ci0gICAgICBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zOwotCi0gIC8vIFNldHVwIGRhdGEgcGF0aHMgZm9yIGFsbCBDSVNlcwotICBwYXRoX3BhcmFtcy5kYXRhX3BhdGhfZGlyID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uSW47Ci0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBFWFBFQ1RfQ0FMTCgqY2lnX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25TZXR1cElzb0RhdGFQYXRoKEhDSV9TVUNDRVNTLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkKSkKLSAgICAgICAgLlRpbWVzKDEpCi0gICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0KLSAgICBwYXRoX3BhcmFtcy5kYXRhX3BhdGhfZGlyID0KLSAgICAgICAgKGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uSW4gKyBoYW5kbGUpICUgMjsKLQotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaGFuZGxlLCBwYXRoX3BhcmFtcyk7Ci0gIH0KLQotICAvLyBTZXR1cCBkYXRhIHBhdGhzIGZvciBhbGwgQklTZXMKLSAgcGF0aF9wYXJhbXMuZGF0YV9wYXRoX2RpciA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbk91dDsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBzdGQ6OmNlcnIgPDwgInNldHRpbmcgdXAgQklTIGRhdGEgcGF0aCBvbiBjb25uX2hkbDogIiA8PCBpbnR7aGFuZGxlfTsKLSAgICBFWFBFQ1RfQ0FMTCgqYmlnX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25TZXR1cElzb0RhdGFQYXRoKEhDSV9TVUNDRVNTLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmJpZ19pZCkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotCi0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aChoYW5kbGUsIHBhdGhfcGFyYW1zKTsKLSAgfQotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFNldHVwSXNvRGF0YVBhdGhUd2ljZSkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIC8vIEVzdGFibGlzaCBDSVNlcwotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgLy8gU2V0dXAgZGF0YSBwYXRocyBmb3IgYWxsIENJU2VzIHR3aWNlCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMgcGF0aF9wYXJhbXMgPQotICAgICAga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaGFuZGxlLCBwYXRoX3BhcmFtcyk7Ci0gICAgLy8gU2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlY29uZmlndXJlCi0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aChoYW5kbGUsIHBhdGhfcGFyYW1zKTsKLSAgfQotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyh2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5iaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIC8vIFNldHVwIGRhdGEgcGF0aHMgZm9yIGFsbCBCSVNlcyB0d2ljZQotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlcykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaGFuZGxlLCBwYXRoX3BhcmFtcyk7Ci0gICAgLy8gU2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlY29uZmlndXJlCi0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aChoYW5kbGUsIHBhdGhfcGFyYW1zKTsKLSAgfQotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFNldHVwSXNvRGF0YVBhdGhJbnZhbGlkU3RhdHVzKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyh2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5iaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0KLSAgLy8gRXN0YWJsaXNoIGFsbCBDSVNlcyBiZWZvcmUgc2V0dGluZyB1cCB0aGVpciBkYXRhIHBhdGhzCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgcGFyYW1zLmNvbm5fcGFpcnMucHVzaF9iYWNrKHtoYW5kbGUsIDF9KTsKLSAgfQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMocGFyYW1zKTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6Omlzb19kYXRhX3BhdGhfcGFyYW1zIHBhdGhfcGFyYW1zID0KLSAgICAgIGtEZWZhdWx0SXNvRGF0YVBhdGhQYXJhbXM7Ci0KLSAgdWludDhfdCBzZXR1cF9kYXRhcGF0aF9yc3Bfc3RhdHVzID0gSENJX1NVQ0NFU1M7Ci0gIE9OX0NBTEwoaGNpY19pbnRlcmZhY2VfLCBTZXR1cElzb0RhdGFQYXRoKQotICAgICAgLldpbGxCeURlZmF1bHQoWyZzZXR1cF9kYXRhcGF0aF9yc3Bfc3RhdHVzXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpc29faGFuZGxlLCB1aW50OF90LCB1aW50OF90LCB1aW50OF90LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90LCB1aW50MTZfdCwgdWludDMyX3QsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZigzKTsKLSAgICAgICAgdWludDhfdCogcCA9IGJ1Zi5kYXRhKCk7Ci0gICAgICAgIFVJTlQ4X1RPX1NUUkVBTShwLCBzZXR1cF9kYXRhcGF0aF9yc3Bfc3RhdHVzKTsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBpc29faGFuZGxlKTsKLQotICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bihidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgIH0pOwotCi0gIC8vIFRyeSB0byBzZXR1cCBkYXRhIHBhdGhzIGZvciBhbGwgQ0lTZXMKLSAgcGF0aF9wYXJhbXMuZGF0YV9wYXRoX2RpciA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbkluOwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgLy8gTW9jayB0aGUgcmVzcG9uc2Ugd2l0aCBzdGF0dXMgIT0gSENJX1NVQ0NFU1MKLSAgICBFWFBFQ1RfQ0FMTCgqY2lnX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25TZXR1cElzb0RhdGFQYXRoKDB4MTEsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgICBzZXR1cF9kYXRhcGF0aF9yc3Bfc3RhdHVzID0gMHgxMTsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZXR1cElzb0RhdGFQYXRoKGhhbmRsZSwgcGF0aF9wYXJhbXMpOwotCi0gICAgLy8gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJldHJ5IG9uIHRoZSBzYW1lIGhhbmRsZSBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBmYWlsdXJlCi0gICAgRVhQRUNUX0NBTEwoKmNpZ19jYWxsYmFja3NfLAotICAgICAgICAgICAgICAgIE9uU2V0dXBJc29EYXRhUGF0aChIQ0lfU1VDQ0VTUywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICAgIHNldHVwX2RhdGFwYXRoX3JzcF9zdGF0dXMgPSBIQ0lfU1VDQ0VTUzsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZXR1cElzb0RhdGFQYXRoKGhhbmRsZSwgcGF0aF9wYXJhbXMpOwotICB9Ci0KLSAgLy8gVHJ5IHRvIHNldHVwIGRhdGEgcGF0aHMgZm9yIGFsbCBCSVNlcwotICBwYXRoX3BhcmFtcy5kYXRhX3BhdGhfZGlyID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uT3V0OwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlcykgewotICAgIEVYUEVDVF9DQUxMKAotICAgICAgICAqYmlnX2NhbGxiYWNrc18sCi0gICAgICAgIE9uU2V0dXBJc29EYXRhUGF0aCgweDExLCBoYW5kbGUsIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmJpZ19pZCkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICAgIHNldHVwX2RhdGFwYXRoX3JzcF9zdGF0dXMgPSAweDExOwotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaGFuZGxlLCBwYXRoX3BhcmFtcyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqYmlnX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25TZXR1cElzb0RhdGFQYXRoKEhDSV9TVUNDRVNTLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmJpZ19pZCkpCi0gICAgICAgIC5UaW1lcygxKQotICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICAgIHNldHVwX2RhdGFwYXRoX3JzcF9zdGF0dXMgPSBIQ0lfU1VDQ0VTUzsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZXR1cElzb0RhdGFQYXRoKGhhbmRsZSwgcGF0aF9wYXJhbXMpOwotICB9Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgUmVtb3ZlSXNvRGF0YVBhdGhWYWxpZCkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcodm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRCaWdQYXJhbXMpOwotCi0gIC8vIEVzdGFibGlzaCBhbGwgQ0lTZXMgYmVmb3JlIHNldHRpbmcgdXAgdGhlaXIgZGF0YSBwYXRocwotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjppc29fZGF0YV9wYXRoX3BhcmFtcyBwYXRoX3BhcmFtcyA9Ci0gICAgICBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zOwotCi0gIC8vIFNldHVwIGFuZCByZW1vdmUgZGF0YSBwYXRocyBmb3IgYWxsIENJU2VzCi0gIHBhdGhfcGFyYW1zLmRhdGFfcGF0aF9kaXIgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRGF0YVBhdGhEaXJlY3Rpb25JbjsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaGFuZGxlLCBwYXRoX3BhcmFtcyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqY2lnX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25SZW1vdmVJc29EYXRhUGF0aChIQ0lfU1VDQ0VTUywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpKQotICAgICAgICAuVGltZXMoMSkKLSAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVJc29EYXRhUGF0aChoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9wYXJhbXMuZGF0YV9wYXRoX2Rpcik7Ci0gIH0KLQotICAvLyBTZXR1cCBhbmQgcmVtb3ZlIGRhdGEgcGF0aHMgZm9yIGFsbCBCSVNlcwotICBwYXRoX3BhcmFtcy5kYXRhX3BhdGhfZGlyID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uT3V0OwotICBmb3IgKGF1dG8mIGhhbmRsZSA6IHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHN0ZDo6Y2VyciA8PCAic2V0dGluZyB1cCBCSVMgZGF0YSBwYXRoIG9uIGNvbm5faGRsOiAiIDw8IGludHtoYW5kbGV9OwotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaGFuZGxlLCBwYXRoX3BhcmFtcyk7Ci0KLSAgICBFWFBFQ1RfQ0FMTCgqYmlnX2NhbGxiYWNrc18sCi0gICAgICAgICAgICAgICAgT25SZW1vdmVJc29EYXRhUGF0aChIQ0lfU1VDQ0VTUywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX2lkKSkKLSAgICAgICAgLlRpbWVzKDEpCi0gICAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlSXNvRGF0YVBhdGgoaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfcGFyYW1zLmRhdGFfcGF0aF9kaXIpOwotICB9Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0LCBSZW1vdmVJc29EYXRhUGF0aE5vU3VjaFBhdGgpIHsKLSAgLy8gQ2hlY2sgb24gQ0lTCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0gIHVpbnQxNl90IGlzb19oYW5kbGUgPSB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgQVNTRVJUX0VYSVQoCi0gICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVJc29EYXRhUGF0aCgKLSAgICAgICAgICBpc29faGFuZGxlLCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29EYXRhUGF0aERpcmVjdGlvbk91dCksCi0gICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAicGF0aCBub3Qgc2V0Iik7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHsuY29ubl9wYWlycyA9IHt7aXNvX2hhbmRsZSwgMX19fSk7Ci0gIEFTU0VSVF9FWElUKAotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgICAgICAgaXNvX2hhbmRsZSwgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRGF0YVBhdGhEaXJlY3Rpb25PdXQpLAotICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgInBhdGggbm90IHNldCIpOwotCi0gIC8vIENoZWNrIG9uIEJJUwotICBpc29faGFuZGxlID0gdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uY29ubl9oYW5kbGVzWzBdOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcodm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRCaWdQYXJhbXMpOwotICBBU1NFUlRfRVhJVCgKLSAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlJlbW92ZUlzb0RhdGFQYXRoKAotICAgICAgICAgIGlzb19oYW5kbGUsIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uT3V0KSwKLSAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJwYXRoIG5vdCBzZXQiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIFJlbW92ZUlzb0RhdGFQYXRoVHdpY2UpIHsKLSAgLy8gQ2hlY2sgb24gQ0lTCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0gIHVpbnQxNl90IGlzb19oYW5kbGUgPSB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHsuY29ubl9wYWlycyA9IHt7aXNvX2hhbmRsZSwgMX19fSk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoaXNvX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgICBpc29faGFuZGxlLCBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zLmRhdGFfcGF0aF9kaXIpOwotICBBU1NFUlRfRVhJVCgKLSAgICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlJlbW92ZUlzb0RhdGFQYXRoKAotICAgICAgICAgIGlzb19oYW5kbGUsIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0RhdGFQYXRoRGlyZWN0aW9uT3V0KSwKLSAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJwYXRoIG5vdCBzZXQiKTsKLQotICAvLyBDaGVjayBvbiBCSVMKLSAgaXNvX2hhbmRsZSA9IHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQmlnKHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmJpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0QmlnUGFyYW1zKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aChpc29faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0SXNvRGF0YVBhdGhQYXJhbXMpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5SZW1vdmVJc29EYXRhUGF0aCgKLSAgICAgIGlzb19oYW5kbGUsIGtEZWZhdWx0SXNvRGF0YVBhdGhQYXJhbXMuZGF0YV9wYXRoX2Rpcik7Ci0gIEFTU0VSVF9FWElUKAotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgICAgICAgaXNvX2hhbmRsZSwgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRGF0YVBhdGhEaXJlY3Rpb25PdXQpLAotICAgICAgOjp0ZXN0aW5nOjpLaWxsZWRCeVNpZ25hbChTSUdBQlJUKSwgInBhdGggbm90IHNldCIpOwotfQotCi0vLyBDaGVjayBpZiBIQ0kgc3RhdHVzIG90aGVyIHRoYW4gSENJX1NVQ0NFU1MgaXMgYmVpbmcgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFJlbW92ZUlzb0RhdGFQYXRoSW52YWxpZFN0YXR1cykgewotICAvLyBNb2NrIGludmFsaWQgc3RhdHVzIHJlc3BvbnNlCi0gIHVpbnQ4X3QgcmVtb3ZlX2RhdGFwYXRoX3JzcF9zdGF0dXMgPSAweDEyOwotICBPTl9DQUxMKGhjaWNfaW50ZXJmYWNlXywgUmVtb3ZlSXNvRGF0YVBhdGgpCi0gICAgICAuV2lsbEJ5RGVmYXVsdChbJnJlbW92ZV9kYXRhcGF0aF9yc3Bfc3RhdHVzXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpc29faGFuZGxlLCB1aW50OF90IGRhdGFfcGF0aF9kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKDMpOwotICAgICAgICB1aW50OF90KiBwID0gYnVmLmRhdGEoKTsKLSAgICAgICAgVUlOVDhfVE9fU1RSRUFNKHAsIHJlbW92ZV9kYXRhcGF0aF9yc3Bfc3RhdHVzKTsKLSAgICAgICAgVUlOVDE2X1RPX1NUUkVBTShwLCBpc29faGFuZGxlKTsKLQotICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bihidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKLSAgICAgIH0pOwotCi0gIC8vIENoZWNrIG9uIENJUwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotICB1aW50MTZfdCBpc29faGFuZGxlID0gdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXNbMF07Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcyh7LmNvbm5fcGFpcnMgPSB7e2lzb19oYW5kbGUsIDF9fX0pOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZXR1cElzb0RhdGFQYXRoKGlzb19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtcyk7Ci0KLSAgRVhQRUNUX0NBTEwoKmNpZ19jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPblJlbW92ZUlzb0RhdGFQYXRoKHJlbW92ZV9kYXRhcGF0aF9yc3Bfc3RhdHVzLCBpc29faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkKSkKLSAgICAgIC5UaW1lcygxKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+UmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgICBpc29faGFuZGxlLCBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zLmRhdGFfcGF0aF9kaXIpOwotCi0gIC8vIENoZWNrIG9uIEJJUwotICBpc29faGFuZGxlID0gdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uY29ubl9oYW5kbGVzWzBdOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcodm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRCaWdQYXJhbXMpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZXR1cElzb0RhdGFQYXRoKGlzb19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtcyk7Ci0KLSAgRVhQRUNUX0NBTEwoKmJpZ19jYWxsYmFja3NfLAotICAgICAgICAgICAgICBPblJlbW92ZUlzb0RhdGFQYXRoKHJlbW92ZV9kYXRhcGF0aF9yc3Bfc3RhdHVzLCBpc29faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmJpZ19pZCkpCi0gICAgICAuVGltZXMoMSk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlJlbW92ZUlzb0RhdGFQYXRoKAotICAgICAgaXNvX2hhbmRsZSwga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtcy5kYXRhX3BhdGhfZGlyKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJUZXN0LCBTZW5kSXNvRGF0YUNpZ1ZhbGlkKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZXN0YWJsaXNoX3BhcmFtcyBwYXJhbXM7Ci0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBwYXJhbXMuY29ubl9wYWlycy5wdXNoX2JhY2soe2hhbmRsZSwgMX0pOwotICB9Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcyhwYXJhbXMpOwotCi0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6Omlzb19kYXRhX3BhdGhfcGFyYW1zIHBhdGhfcGFyYW1zID0KLSAgICAgICAga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtczsKLSAgICBwYXRoX3BhcmFtcy5kYXRhX3BhdGhfZGlyID0KLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRGF0YVBhdGhEaXJlY3Rpb25PdXQ7Ci0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aChoYW5kbGUsIHBhdGhfcGFyYW1zKTsKLQotICAgIGZvciAodWludDhfdCBudW1fcGt0cyA9IDI7IG51bV9wa3RzICE9IDA7IG51bV9wa3RzLS0pIHsKLSAgICAgIGNvbnN0ZXhwciB1aW50OF90IGRhdGFfbGVuID0gMTA4OwotCi0gICAgICBFWFBFQ1RfQ0FMTChidGVfaW50ZXJmYWNlXywgSGNpU2VuZCkKLSAgICAgICAgICAuV2lsbE9uY2UoW2hhbmRsZSwgZGF0YV9sZW5dKEJUX0hEUiogcF9tc2csIHVpbnQxNl90IGV2ZW50KSB7Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gcF9tc2ctPmRhdGE7Ci0gICAgICAgICAgICB1aW50MTZfdCBtc2dfaGFuZGxlOwotICAgICAgICAgICAgdWludDE2X3QgaXNvX2xvYWRfbGVuOwotCi0gICAgICAgICAgICBBU1NFUlRfVFJVRSgoZXZlbnQgJiBNU0dfU1RBQ0tfVE9fSENfSENJX0lTTykgIT0gMCk7Ci0gICAgICAgICAgICBBU1NFUlRfTkUocF9tc2csIG51bGxwdHIpOwotICAgICAgICAgICAgQVNTRVJUX0VRKHBfbXNnLT5sZW4sIGRhdGFfbGVuICsgKChwX21zZy0+bGF5ZXJfc3BlY2lmaWMgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9JU09fSERSX0NPTlRBSU5TX1RTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDEyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogOCkpOwotCi0gICAgICAgICAgICAvLyBWZXJpZnkgcGFja2V0IGludGVybmFscwotICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihtc2dfaGFuZGxlLCBwKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShtc2dfaGFuZGxlLCBoYW5kbGUpOwotCi0gICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KGlzb19sb2FkX2xlbiwgcCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoCi0gICAgICAgICAgICAgICAgaXNvX2xvYWRfbGVuLAotICAgICAgICAgICAgICAgIGRhdGFfbGVuICsKLSAgICAgICAgICAgICAgICAgICAgKChwX21zZy0+bGF5ZXJfc3BlY2lmaWMgJiBCVF9JU09fSERSX0NPTlRBSU5TX1RTKSA/IDggOiA0KSk7Ci0KLSAgICAgICAgICAgIGlmIChwX21zZy0+bGF5ZXJfc3BlY2lmaWMgJiBCVF9JU09fSERSX0NPTlRBSU5TX1RTKSB7Ci0gICAgICAgICAgICAgIFNUUkVBTV9TS0lQX1VJTlQxNihwKTsgIC8vIHNraXAgdHMgTFNCIGhhbGZ3b3JkCi0gICAgICAgICAgICAgIFNUUkVBTV9TS0lQX1VJTlQxNihwKTsgIC8vIHNraXAgdHMgTVNCIGhhbGZ3b3JkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTVFJFQU1fU0tJUF9VSU5UMTYocCk7ICAvLyBza2lwIHNlcV9uYgotCi0gICAgICAgICAgICB1aW50MTZfdCBtc2dfZGF0YV9sZW47Ci0gICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KG1zZ19kYXRhX2xlbiwgcCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEobXNnX2RhdGFfbGVuLCBkYXRhX2xlbik7Ci0gICAgICAgICAgfSkKLSAgICAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotCi0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX3ZlYyhkYXRhX2xlbiwgMCk7Ci0gICAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZW5kSXNvRGF0YShoYW5kbGUsIGRhdGFfdmVjLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdmVjLnNpemUoKSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgU2VuZElzb0RhdGFCaWdWYWxpZCkgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcodm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uYmlnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRCaWdQYXJhbXMpOwotCi0gIGZvciAoYXV0byYgaGFuZGxlIDogdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uY29ubl9oYW5kbGVzKSB7Ci0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aChoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdElzb0RhdGFQYXRoUGFyYW1zKTsKLSAgICBmb3IgKHVpbnQ4X3QgbnVtX3BrdHMgPSAyOyBudW1fcGt0cyAhPSAwOyBudW1fcGt0cy0tKSB7Ci0gICAgICBjb25zdGV4cHIgdWludDhfdCBkYXRhX2xlbiA9IDEwODsKLQotICAgICAgRVhQRUNUX0NBTEwoYnRlX2ludGVyZmFjZV8sIEhjaVNlbmQpCi0gICAgICAgICAgLldpbGxPbmNlKFtoYW5kbGUsIGRhdGFfbGVuXShCVF9IRFIqIHBfbXNnLCB1aW50MTZfdCBldmVudCkgewotICAgICAgICAgICAgdWludDhfdCogcCA9IHBfbXNnLT5kYXRhOwotICAgICAgICAgICAgdWludDE2X3QgbXNnX2hhbmRsZTsKLSAgICAgICAgICAgIHVpbnQxNl90IGlzb19sb2FkX2xlbjsKLQotICAgICAgICAgICAgQVNTRVJUX1RSVUUoKGV2ZW50ICYgTVNHX1NUQUNLX1RPX0hDX0hDSV9JU08pICE9IDApOwotICAgICAgICAgICAgQVNTRVJUX05FKHBfbXNnLCBudWxscHRyKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShwX21zZy0+bGVuLCBkYXRhX2xlbiArICgocF9tc2ctPmxheWVyX3NwZWNpZmljICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSVNPX0hEUl9DT05UQUlOU19UUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDgpKTsKLQotICAgICAgICAgICAgLy8gVmVyaWZ5IHBhY2tldCBpbnRlcm5hbHMKLSAgICAgICAgICAgIFNUUkVBTV9UT19VSU5UMTYobXNnX2hhbmRsZSwgcCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEobXNnX2hhbmRsZSwgaGFuZGxlKTsKLQotICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihpc29fbG9hZF9sZW4sIHApOwotICAgICAgICAgICAgQVNTRVJUX0VRKAotICAgICAgICAgICAgICAgIGlzb19sb2FkX2xlbiwKLSAgICAgICAgICAgICAgICBkYXRhX2xlbiArCi0gICAgICAgICAgICAgICAgICAgICgocF9tc2ctPmxheWVyX3NwZWNpZmljICYgQlRfSVNPX0hEUl9DT05UQUlOU19UUykgPyA4IDogNCkpOwotCi0gICAgICAgICAgICB1aW50MTZfdCBtc2dfZGF0YV9sZW47Ci0gICAgICAgICAgICB1aW50MTZfdCBtc2dfZHVtbXk7Ci0gICAgICAgICAgICBpZiAocF9tc2ctPmxheWVyX3NwZWNpZmljICYgQlRfSVNPX0hEUl9DT05UQUlOU19UUykgewotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KG1zZ19kdW1teSwgcCk7ICAvLyBza2lwIHRzIExTQiBoYWxmd29yZAotICAgICAgICAgICAgICBTVFJFQU1fVE9fVUlOVDE2KG1zZ19kdW1teSwgcCk7ICAvLyBza2lwIHRzIE1TQiBoYWxmd29yZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihtc2dfZHVtbXksIHApOyAgLy8gc2tpcCBzZXFfbmIKLQotICAgICAgICAgICAgU1RSRUFNX1RPX1VJTlQxNihtc2dfZGF0YV9sZW4sIHApOwotICAgICAgICAgICAgQVNTRVJUX0VRKG1zZ19kYXRhX2xlbiwgZGF0YV9sZW4pOwotICAgICAgICAgIH0pCi0gICAgICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV92ZWMoZGF0YV9sZW4sIDApOwotICAgICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2VuZElzb0RhdGEoaGFuZGxlLCBkYXRhX3ZlYy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3ZlYy5zaXplKCkpOwotICAgIH0KLSAgfQotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFNlbmRJc29EYXRhTm9DcmVkaXRzKSB7Ci0gIHVpbnQ4X3QgbnVtX2J1ZmZlcnMgPSBjb250cm9sbGVyX2ludGVyZmFjZV8uR2V0SXNvQnVmZmVyQ291bnQoKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV92ZWMoMTA4LCAwKTsKLQotICAvLyBDaGVjayBvbiBDSUcKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aCgKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzBdLAotICAgICAga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtcyk7Ci0KLSAgLyogVHJ5IHNlbmRpbmcgdHdpY2UgYXMgbXVjaCBkYXRhIGFzIHdlIGNhbiBpZ25vcmluZyB0aGUgY3JlZGl0IGxpbWl0cyBhbmQKLSAgICogZXhwZWN0IHRoZSByZWR1bmRhbnQgcGFja2V0cyB0byBiZSBpZ25vcmVkIGFuZCBub3QgcHJvcGFnYXRlZCBkb3duIHRvIHRoZQotICAgKiBIQ0kuCi0gICAqLwotICBFWFBFQ1RfQ0FMTChidGVfaW50ZXJmYWNlXywgSGNpU2VuZCkuVGltZXMobnVtX2J1ZmZlcnMpLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKDIgKiBudW1fYnVmZmVycyk7IGkrKykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKAotICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXSwgZGF0YV92ZWMuZGF0YSgpLAotICAgICAgICBkYXRhX3ZlYy5zaXplKCkpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGFsbCBjcmVkaXRzIGZvciB0aGlzIG9uZSBoYW5kbGUKLSAgdWludDhfdCBtb2NrX3JzcFs1XTsKLSAgdWludDhfdCogcCA9IG1vY2tfcnNwOwotICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXNbMF0pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIG51bV9idWZmZXJzKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlTnVtQ29tcGxEYXRhUGt0cyhtb2NrX3JzcCwgc2l6ZW9mKG1vY2tfcnNwKSk7Ci0KLSAgLy8gQ2hlY2sgb24gQklHCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyh2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5iaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoCi0gICAgICB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5jb25uX2hhbmRsZXNbMF0sIGtEZWZhdWx0SXNvRGF0YVBhdGhQYXJhbXMpOwotCi0gIC8qIFRyeSBzZW5kaW5nIHR3aWNlIGFzIG11Y2ggZGF0YSBhcyB3ZSBjYW4gaWdub3JpbmcgdGhlIGNyZWRpdCBsaW1pdHMgYW5kCi0gICAqIGV4cGVjdCB0aGUgcmVkdW5kYW50IHBhY2tldHMgdG8gYmUgaWdub3JlZCBhbmQgbm90IHByb3BhZ2F0ZWQgZG93biB0byB0aGUKLSAgICogSENJLgotICAgKi8KLSAgRVhQRUNUX0NBTEwoYnRlX2ludGVyZmFjZV8sIEhjaVNlbmQpLlRpbWVzKG51bV9idWZmZXJzKTsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKDIgKiBudW1fYnVmZmVycyk7IGkrKykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKAotICAgICAgICB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5jb25uX2hhbmRsZXNbMF0sIGRhdGFfdmVjLmRhdGEoKSwKLSAgICAgICAgZGF0YV92ZWMuc2l6ZSgpKTsKLSAgfQotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIFNlbmRJc29EYXRhQ3JlZGl0c1JldHVybmVkKSB7Ci0gIHVpbnQ4X3QgbnVtX2J1ZmZlcnMgPSBjb250cm9sbGVyX2ludGVyZmFjZV8uR2V0SXNvQnVmZmVyQ291bnQoKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV92ZWMoMTA4LCAwKTsKLQotICAvLyBDaGVjayBvbiBDSUcKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIHBhcmFtczsKLSAgZm9yIChhdXRvJiBoYW5kbGUgOiB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlcykgewotICAgIHBhcmFtcy5jb25uX3BhaXJzLnB1c2hfYmFjayh7aGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2V0dXBJc29EYXRhUGF0aCgKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzBdLAotICAgICAga0RlZmF1bHRJc29EYXRhUGF0aFBhcmFtcyk7Ci0KLSAgLyogVHJ5IHNlbmRpbmcgdHdpY2UgYXMgbXVjaCBkYXRhIGFzIHdlIGNhbiwgaWdub3JpbmcgdGhlIGNyZWRpdHMgbGltaXQgYW5kCi0gICAqIGV4cGVjdCB0aGUgcmVkdW5kYW50IHBhY2tldHMgdG8gYmUgaWdub3JlZCBhbmQgbm90IHByb3BhZ2F0ZWQgZG93biB0byB0aGUKLSAgICogSENJLgotICAgKi8KLSAgRVhQRUNUX0NBTEwoYnRlX2ludGVyZmFjZV8sIEhjaVNlbmQpLlRpbWVzKG51bV9idWZmZXJzKS5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8ICgyICogbnVtX2J1ZmZlcnMpOyBpKyspIHsKLSAgICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZW5kSXNvRGF0YSgKLSAgICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXNbMF0sIGRhdGFfdmVjLmRhdGEoKSwKLSAgICAgICAgZGF0YV92ZWMuc2l6ZSgpKTsKLSAgfQotCi0gIC8vIFJldHVybiBhbGwgY3JlZGl0cyBmb3IgdGhpcyBvbmUgaGFuZGxlCi0gIHVpbnQ4X3QgbW9ja19yc3BbNV07Ci0gIHVpbnQ4X3QqIHAgPSBtb2NrX3JzcDsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIDEpOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzBdKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBudW1fYnVmZmVycyk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZU51bUNvbXBsRGF0YVBrdHMobW9ja19yc3AsIHNpemVvZihtb2NrX3JzcCkpOwotCi0gIC8vIEV4cGVjdCBzb21lIG1vcmUgZXZlbnRzIGdvIGRvd24gdGhlIEhDSQotICBFWFBFQ1RfQ0FMTChidGVfaW50ZXJmYWNlXywgSGNpU2VuZCkuVGltZXMobnVtX2J1ZmZlcnMpLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKDIgKiBudW1fYnVmZmVycyk7IGkrKykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKAotICAgICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXSwgZGF0YV92ZWMuZGF0YSgpLAotICAgICAgICBkYXRhX3ZlYy5zaXplKCkpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGFsbCBjcmVkaXRzIGZvciB0aGlzIG9uZSBoYW5kbGUKLSAgcCA9IG1vY2tfcnNwOwotICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXNbMF0pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIG51bV9idWZmZXJzKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlTnVtQ29tcGxEYXRhUGt0cyhtb2NrX3JzcCwgc2l6ZW9mKG1vY2tfcnNwKSk7Ci0KLSAgLy8gQ2hlY2sgb24gQklHCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUJpZyh2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5iaWdfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNldHVwSXNvRGF0YVBhdGgoCi0gICAgICB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5jb25uX2hhbmRsZXNbMF0sIGtEZWZhdWx0SXNvRGF0YVBhdGhQYXJhbXMpOwotCi0gIC8qIFRyeSBzZW5kaW5nIHR3aWNlIGFzIG11Y2ggZGF0YSBhcyB3ZSBjYW4sIGlnbm9yaW5nIHRoZSBjcmVkaXRzIGxpbWl0IGFuZAotICAgKiBleHBlY3QgdGhlIHJlZHVuZGFudCBwYWNrZXRzIHRvIGJlIGlnbm9yZWQgYW5kIG5vdCBwcm9wYWdhdGVkIGRvd24gdG8gdGhlCi0gICAqIEhDSS4KLSAgICovCi0gIEVYUEVDVF9DQUxMKGJ0ZV9pbnRlcmZhY2VfLCBIY2lTZW5kKS5UaW1lcyhudW1fYnVmZmVycykuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAoMiAqIG51bV9idWZmZXJzKTsgaSsrKSB7Ci0gICAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2VuZElzb0RhdGEoCi0gICAgICAgIHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmNvbm5faGFuZGxlc1swXSwgZGF0YV92ZWMuZGF0YSgpLAotICAgICAgICBkYXRhX3ZlYy5zaXplKCkpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGFsbCBjcmVkaXRzIGZvciB0aGlzIG9uZSBoYW5kbGUKLSAgcCA9IG1vY2tfcnNwOwotICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uY29ubl9oYW5kbGVzWzBdKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBudW1fYnVmZmVycyk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZU51bUNvbXBsRGF0YVBrdHMobW9ja19yc3AsIHNpemVvZihtb2NrX3JzcCkpOwotCi0gIC8vIEV4cGVjdCBzb21lIG1vcmUgZXZlbnRzIGdvIGRvd24gdGhlIEhDSQotICBFWFBFQ1RfQ0FMTChidGVfaW50ZXJmYWNlXywgSGNpU2VuZCkuVGltZXMobnVtX2J1ZmZlcnMpLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKDIgKiBudW1fYnVmZmVycyk7IGkrKykgewotICAgIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKAotICAgICAgICB2b2xhdGlsZV90ZXN0X2JpZ19wYXJhbXNfZXZ0Xy5jb25uX2hhbmRsZXNbMF0sIGRhdGFfdmVjLmRhdGEoKSwKLSAgICAgICAgZGF0YV92ZWMuc2l6ZSgpKTsKLSAgfQotfQotCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdCwgU2VuZElzb0RhdGFXaXRoTm9EYXRhUGF0aCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX3ZlYygxMDgsIDApOwotCi0gIC8vIENoZWNrIG9uIENJRwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Y2lzX2VzdGFibGlzaF9wYXJhbXMgcGFyYW1zOwotICBmb3IgKGF1dG8mIGNvbm5faGFuZGxlIDogdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXMpIHsKLSAgICBwYXJhbXMuY29ubl9wYWlycy5wdXNoX2JhY2soe2Nvbm5faGFuZGxlLCAxfSk7Ci0gIH0KLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHBhcmFtcyk7Ci0KLSAgRVhQRUNUX0NBTEwoYnRlX2ludGVyZmFjZV8sIEhjaVNlbmQpLlRpbWVzKDApOwotICBBU1NFUlRfRVhJVChJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5TZW5kSXNvRGF0YSgKLSAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzBdLAotICAgICAgICAgICAgICAgICAgZGF0YV92ZWMuZGF0YSgpLCBkYXRhX3ZlYy5zaXplKCkpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiRGF0YSBwYXRoIG5vdCBzZXQiKTsKLQotICAvLyBDaGVjayBvbiBCSUcKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQmlnKHZvbGF0aWxlX3Rlc3RfYmlnX3BhcmFtc19ldnRfLmJpZ19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0QmlnUGFyYW1zKTsKLQotICBFWFBFQ1RfQ0FMTChidGVfaW50ZXJmYWNlXywgSGNpU2VuZCkuVGltZXMoMCk7Ci0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKAotICAgICAgICAgICAgICAgICAgdm9sYXRpbGVfdGVzdF9iaWdfcGFyYW1zX2V2dF8uY29ubl9oYW5kbGVzWzBdLAotICAgICAgICAgICAgICAgICAgZGF0YV92ZWMuZGF0YSgpLCBkYXRhX3ZlYy5zaXplKCkpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiRGF0YSBwYXRoIG5vdCBzZXQiKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIFNlbmRJc29EYXRhV2l0aE5vQ2lnQmlnSGFuZGxlKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfdmVjKDEwOCwgMCk7Ci0gIEFTU0VSVF9FWElUKElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlNlbmRJc29EYXRhKDEzNCwgZGF0YV92ZWMuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3ZlYy5zaXplKCkpLAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OktpbGxlZEJ5U2lnbmFsKFNJR0FCUlQpLCAiTm8gc3VjaCBpc28iKTsKLX0KLQotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3QsIFNlbmRJc29EYXRhV2l0aE5vQ2lnQ29ubmVjdGVkKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfdmVjKDEwOCwgMCk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgYXV0byBoYW5kbGUgPSB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgQVNTRVJUX0VYSVQoSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U2VuZElzb0RhdGEoaGFuZGxlLCBkYXRhX3ZlYy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdmVjLnNpemUoKSksCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6S2lsbGVkQnlTaWduYWwoU0lHQUJSVCksICJDSVMgbm90IGVzdGFibGlzaGVkIik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgSGFuZGxlRGlzY29ubmVjdE5vU3VjaEhhbmRsZSkgewotICAvLyBEb24ndCBleHBlY3QgYW55IGNhbGxiYWNrcyB3aGVuIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG5vdCBmb3IgSVNPLgotICBFWFBFQ1RfQ0FMTCgqY2lnX2NhbGxiYWNrc18sIE9uQ2lnRXZlbnQpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqY2lnX2NhbGxiYWNrc18sIE9uQ2lzRXZlbnQpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqYmlnX2NhbGxiYWNrc18sIE9uQmlnRXZlbnQpLlRpbWVzKDApOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoMTIzLCAxNik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgSGFuZGxlRGlzY29ubmVjdFZhbGlkQ2lnKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgYXV0byBoYW5kbGUgPSB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHt7e2hhbmRsZSwgMX19fSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmJpZ19jYWxsYmFja3NfLCBPbkJpZ0V2ZW50KS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKmNpZ19jYWxsYmFja3NfLCBPbkNpZ0V2ZW50KS5UaW1lcygwKTsKLSAgRVhQRUNUX0NBTEwoKmNpZ19jYWxsYmFja3NfLCBPbkNpc0V2ZW50KS5UaW1lcygwKTsKLQotICAvLyBFeHBlY3QgZGlzY29ubmVjdCBldmVudCBleGFjdGx5IG9uY2UKLSAgRVhQRUNUX0NBTEwoKmNpZ19jYWxsYmFja3NfLCBPbkNpc0V2ZW50KQotICAgICAgLldpbGxPbmNlKFt0aGlzLCBoYW5kbGVdKHVpbnQ4X3QgZXZlbnRfY29kZSwgdm9pZCogZGF0YSkgewotICAgICAgICBBU1NFUlRfRVEoZXZlbnRfY29kZSwKLSAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6a0lzb0V2ZW50Q2lzRGlzY29ubmVjdGVkKTsKLSAgICAgICAgYXV0byogZXZlbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaXNfZGlzY29ubmVjdGVkX2V2dCo+KAotICAgICAgICAgICAgICAgIGRhdGEpOwotICAgICAgICBBU1NFUlRfRVEoZXZlbnQtPnJlYXNvbiwgMTYpOwotICAgICAgICBBU1NFUlRfRVEoZXZlbnQtPmNpZ19pZCwgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQpOwotICAgICAgICBBU1NFUlRfRVEoZXZlbnQtPmNpc19jb25uX2hkbCwgaGFuZGxlKTsKLSAgICAgIH0pOwotCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoaGFuZGxlLCAxNik7Ci19Ci0KLVRFU1RfRihJc29NYW5hZ2VyVGVzdCwgSGFuZGxlRGlzY29ubmVjdERpc2Nvbm5lY3RlZENpZykgewotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIGF1dG8gaGFuZGxlID0gdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXNbMF07Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcyh7e3toYW5kbGUsIDF9fX0pOwotCi0gIEVYUEVDVF9DQUxMKCpiaWdfY2FsbGJhY2tzXywgT25CaWdFdmVudCkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCpjaWdfY2FsbGJhY2tzXywgT25DaWdFdmVudCkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCpjaWdfY2FsbGJhY2tzXywgT25DaXNFdmVudCkuVGltZXMoMCk7Ci0KLSAgLy8gRXhwZWN0IGRpc2Nvbm5lY3QgZXZlbnQgZXhhY3RseSBvbmNlCi0gIEVYUEVDVF9DQUxMKAotICAgICAgKmNpZ19jYWxsYmFja3NfLAotICAgICAgT25DaXNFdmVudChibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpc0Rpc2Nvbm5lY3RlZCwgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5SZXRpcmVzT25TYXR1cmF0aW9uKCk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoaGFuZGxlLCAxNik7Ci0KLSAgLy8gVGhpcyBvbmUgd2FzIG9uY2UgY29ubmVjdGVkIC0gZXhwZWN0IG5vIGV2ZW50cwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVEaXNjb25uZWN0KGhhbmRsZSwgMTYpOwotCi0gIC8vIFRoaXMgb25lIHdhcyBuZXZlciBjb25uZWN0ZWQgLSBleHBlY3Qgbm8gZXZlbnRzCi0gIGhhbmRsZSA9IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzFdOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVEaXNjb25uZWN0KGhhbmRsZSwgMTYpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIEhhbmRsZUlzb0RhdGEpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBhdXRvIGhhbmRsZSA9IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzBdOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMoe3t7aGFuZGxlLCAxfX19KTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpjaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQ2lzRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNEYXRhQXZhaWxhYmxlLCBfKSkKLSAgICAgIC5UaW1lcygxKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkdW1teV9tc2coMTgpOwotICB1aW50OF90KiBwID0gZHVtbXlfbXNnLmRhdGEoKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBCVF9FVlRfVE9fQlRVX0hDSV9JU08pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDEwKTsgIC8vIC5sZW4KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCAwKTsgICAvLyAub2Zmc2V0Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMCk7ICAgLy8gLmxheWVyX3NwZWNpZmljCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSXNvRGF0YShkdW1teV9tc2cuZGF0YSgpKTsKLX0KLQotLyogVGhpcyB0ZXN0IGNhc2Ugc2ltdWxhdGVzIEhDSSB0aHJlYWQgc2NoZWR1bGluZyBldmVudHMgb24gdGhlIG1haW4gdGhyZWFkLAotICogd2l0aG91dCBrbm93aW5nIHRoZSB3ZSBhcmUgYWxyZWFkeSBzaHV0dGluZyBkb3duIHRoZSBzdGFjayBhbmQgSXNvIE1hbmFnZXIKLSAqIGlzIGFscmVhZHkgc3RvcHBlZC4KLSAqLwotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3ROb0NsZWFudXAsIEhhbmRsZUxhdGVBcml2aW5nRXZlbnRIYW5kbGVJc29EYXRhKSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgYXV0byBoYW5kbGUgPSB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHt7e2hhbmRsZSwgMX19fSk7Ci0KLSAgLy8gU3RvcCBpc28gbWFuYWdlciBiZWZvcmUgdHJ5aW5nIHRvIGNhbGwgdGhlIEhDSSBjYWxsYmFja3MKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U3RvcCgpOwotCi0gIEVYUEVDVF9DQUxMKAotICAgICAgKmNpZ19jYWxsYmFja3NfLAotICAgICAgT25DaXNFdmVudChibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmtJc29FdmVudENpc0RhdGFBdmFpbGFibGUsIF8pKQotICAgICAgLlRpbWVzKDApOwotCi0gIC8vIEV4cGVjdCBubyBhc3NlcnQgb24gdGhpcyBjYWxsIC0gc2hvdWxkIGJlIGdyYWNlZnVsbHkgaWdub3JlZAotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkdW1teV9tc2coMTgpOwotICB1aW50OF90KiBwID0gZHVtbXlfbXNnLmRhdGEoKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBCVF9FVlRfVE9fQlRVX0hDSV9JU08pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDEwKTsgIC8vIC5sZW4KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCAwKTsgICAvLyAub2Zmc2V0Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMCk7ICAgLy8gLmxheWVyX3NwZWNpZmljCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+SGFuZGxlSXNvRGF0YShkdW1teV9tc2cuZGF0YSgpKTsKLX0KLQotLyogVGhpcyB0ZXN0IGNhc2Ugc2ltdWxhdGVzIEhDSSB0aHJlYWQgc2NoZWR1bGluZyBldmVudHMgb24gdGhlIG1haW4gdGhyZWFkLAotICogd2l0aG91dCBrbm93aW5nIHRoZSB3ZSBhcmUgYWxyZWFkeSBzaHV0dGluZyBkb3duIHRoZSBzdGFjayBhbmQgSXNvIE1hbmFnZXIKLSAqIGlzIGFscmVhZHkgc3RvcHBlZC4KLSAqLwotVEVTVF9GKElzb01hbmFnZXJEZWF0aFRlc3ROb0NsZWFudXAsIEhhbmRsZUxhdGVBcml2aW5nRXZlbnRIYW5kbGVEaXNjb25uZWN0KSB7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkNyZWF0ZUNpZygKLSAgICAgIHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY2lnX2lkLCBrRGVmYXVsdENpZ1BhcmFtcyk7Ci0KLSAgYXV0byBoYW5kbGUgPSB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNvbm5faGFuZGxlc1swXTsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+RXN0YWJsaXNoQ2lzKHt7e2hhbmRsZSwgMX19fSk7Ci0KLSAgLy8gU3RvcCBpc28gbWFuYWdlciBiZWZvcmUgdHJ5aW5nIHRvIGNhbGwgdGhlIEhDSSBjYWxsYmFja3MKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U3RvcCgpOwotCi0gIC8vIEV4cGVjdCBubyBldmVudCB3aGVuIGNhbGxiYWNrIGlzIGJlaW5nIGNhbGxlZCBvbiBhIHN0b3BwZWQgaXNvIG1hbmFnZXIKLSAgRVhQRUNUX0NBTEwoKmNpZ19jYWxsYmFja3NfLCBPbkNpc0V2ZW50KS5UaW1lcygwKTsKLSAgLy8gRXhwZWN0IG5vIGFzc2VydCBvbiB0aGlzIGNhbGwgLSBzaG91bGQgYmUgZ3JhY2VmdWxseSBpZ25vcmVkCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZURpc2Nvbm5lY3QoaGFuZGxlLCAxNik7Ci19Ci0KLS8qIFRoaXMgdGVzdCBjYXNlIHNpbXVsYXRlcyBIQ0kgdGhyZWFkIHNjaGVkdWxpbmcgZXZlbnRzIG9uIHRoZSBtYWluIHRocmVhZCwKLSAqIHdpdGhvdXQga25vd2luZyB0aGUgd2UgYXJlIGFscmVhZHkgc2h1dHRpbmcgZG93biB0aGUgc3RhY2sgYW5kIElzbyBNYW5hZ2VyCi0gKiBpcyBhbHJlYWR5IHN0b3BwZWQuCi0gKi8KLVRFU1RfRihJc29NYW5hZ2VyRGVhdGhUZXN0Tm9DbGVhbnVwLAotICAgICAgIEhhbmRsZUxhdGVBcml2aW5nRXZlbnRIYW5kbGVOdW1Db21wbERhdGFQa3RzKSB7Ci0gIHVpbnQ4X3QgbnVtX2J1ZmZlcnMgPSBjb250cm9sbGVyX2ludGVyZmFjZV8uR2V0SXNvQnVmZmVyQ291bnQoKTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVDaWcoCi0gICAgICB2b2xhdGlsZV90ZXN0X2NpZ19jcmVhdGVfY21wbF9ldnRfLmNpZ19pZCwga0RlZmF1bHRDaWdQYXJhbXMpOwotCi0gIGF1dG8gaGFuZGxlID0gdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jb25uX2hhbmRsZXNbMF07Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkVzdGFibGlzaENpcyh7e3toYW5kbGUsIDF9fX0pOwotCi0gIC8vIFN0b3AgaXNvIG1hbmFnZXIgYmVmb3JlIHRyeWluZyB0byBjYWxsIHRoZSBIQ0kgY2FsbGJhY2tzCi0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPlN0b3AoKTsKLQotICAvLyBFeHBlY3Qgbm8gYXNzZXJ0IG9uIHRoaXMgY2FsbCAtIHNob3VsZCBiZSBncmFjZWZ1bGx5IGlnbm9yZWQKLSAgdWludDhfdCBtb2NrX3JzcFs1XTsKLSAgdWludDhfdCogcCA9IG1vY2tfcnNwOwotICBVSU5UOF9UT19TVFJFQU0ocCwgMSk7Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBudW1fYnVmZmVycyk7Ci0gIElzb01hbmFnZXI6OkdldEluc3RhbmNlKCktPkhhbmRsZU51bUNvbXBsRGF0YVBrdHMobW9ja19yc3AsIHNpemVvZihtb2NrX3JzcCkpOwotfQotCi0vKiBUaGlzIHRlc3QgY2FzZSBzaW11bGF0ZXMgSENJIHRocmVhZCBzY2hlZHVsaW5nIGV2ZW50cyBvbiB0aGUgbWFpbiB0aHJlYWQsCi0gKiB3aXRob3V0IGtub3dpbmcgdGhlIHdlIGFyZSBhbHJlYWR5IHNodXR0aW5nIGRvd24gdGhlIHN0YWNrIGFuZCBJc28gTWFuYWdlcgotICogaXMgYWxyZWFkeSBzdG9wcGVkLgotICovCi1URVNUX0YoSXNvTWFuYWdlckRlYXRoVGVzdE5vQ2xlYW51cCwgSGFuZGxlTGF0ZUFyaXZpbmdFdmVudEhhbmRsZUhjaUV2ZW50KSB7Ci0gIGNvbnN0IHVpbnQ4X3QgYmlnX2lkID0gMHgyMjsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5DcmVhdGVCaWcoYmlnX2lkLCBrRGVmYXVsdEJpZ1BhcmFtcyk7Ci0KLSAgLy8gU3RvcCBpc28gbWFuYWdlciBiZWZvcmUgdHJ5aW5nIHRvIGNhbGwgdGhlIEhDSSBjYWxsYmFja3MKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+U3RvcCgpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpiaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQmlnRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRCaWdPblRlcm1pbmF0ZUNtcGwsIF8pKQotICAgICAgLlRpbWVzKDApOwotCi0gIC8vIEV4cGVjdCBubyBhc3NlcnQgb24gdGhpcyBjYWxsIC0gc2hvdWxkIGJlIGdyYWNlZnVsbHkgaWdub3JlZAotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoMik7Ci0gIHVpbnQ4X3QqIHAgPSBidWYuZGF0YSgpOwotICBVSU5UOF9UT19TVFJFQU0ocCwgYmlnX2lkKTsKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIDE2KTsgIC8vIFRlcm1pbmF0ZWQgYnkgbG9jYWwgaG9zdAotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVIY2lFdmVudChIQ0lfQkxFX1RFUk1fQklHX0NQTF9FVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpOwotfQotCi1URVNUX0YoSXNvTWFuYWdlclRlc3QsIEhhbmRsZUlzb0RhdGFTYW1lU2VxTmIpIHsKLSAgSXNvTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS0+Q3JlYXRlQ2lnKAotICAgICAgdm9sYXRpbGVfdGVzdF9jaWdfY3JlYXRlX2NtcGxfZXZ0Xy5jaWdfaWQsIGtEZWZhdWx0Q2lnUGFyYW1zKTsKLQotICBhdXRvIGhhbmRsZSA9IHZvbGF0aWxlX3Rlc3RfY2lnX2NyZWF0ZV9jbXBsX2V2dF8uY29ubl9oYW5kbGVzWzBdOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5Fc3RhYmxpc2hDaXMoe3t7aGFuZGxlLCAxfX19KTsKLQotICBFWFBFQ1RfQ0FMTCgKLSAgICAgICpjaWdfY2FsbGJhY2tzXywKLSAgICAgIE9uQ2lzRXZlbnQoYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjprSXNvRXZlbnRDaXNEYXRhQXZhaWxhYmxlLCBfKSkKLSAgICAgIC5UaW1lcygyKTsKLQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkdW1teV9tc2coMTgpOwotICB1aW50OF90KiBwID0gZHVtbXlfbXNnLmRhdGEoKTsKLSAgVUlOVDE2X1RPX1NUUkVBTShwLCBCVF9FVlRfVE9fQlRVX0hDSV9JU08pOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDEwKTsgIC8vIC5sZW4KLSAgVUlOVDE2X1RPX1NUUkVBTShwLCAwKTsgICAvLyAub2Zmc2V0Ci0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMCk7ICAgLy8gLmxheWVyX3NwZWNpZmljCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgaGFuZGxlKTsKLQotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVJc29EYXRhKGR1bW15X21zZy5kYXRhKCkpOwotICBJc29NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLT5IYW5kbGVJc29EYXRhKGR1bW15X21zZy5kYXRhKCkpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19idGlmX3N0b3JhZ2UuY2MgYi9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0aWZfc3RvcmFnZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1ZDg5YS4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0aWZfc3RvcmFnZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJtb2NrX2J0aWZfc3RvcmFnZS5oIgotCi1zdGF0aWMgYmx1ZXRvb3RoOjptYW5hZ2VyOjpNb2NrQnRpZlN0b3JhZ2VJbnRlcmZhY2UqIGJ0aWZfc3RvcmFnZV9pbnRlcmZhY2UgPQotICAgIG51bGxwdHI7Ci0KLXZvaWQgYmx1ZXRvb3RoOjptYW5hZ2VyOjpTZXRNb2NrQnRpZlN0b3JhZ2VJbnRlcmZhY2UoCi0gICAgTW9ja0J0aWZTdG9yYWdlSW50ZXJmYWNlKiBtb2NrX2J0aWZfc3RvcmFnZV9pbnRlcmZhY2UpIHsKLSAgYnRpZl9zdG9yYWdlX2ludGVyZmFjZSA9IG1vY2tfYnRpZl9zdG9yYWdlX2ludGVyZmFjZTsKLX0KLQotdm9pZCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfZWF0dCh2b2lkKSB7Ci0gIGJ0aWZfc3RvcmFnZV9pbnRlcmZhY2UtPkxvYWRCb25kZWRFYXR0KCk7Ci19Ci0KLXVpbnQ4X3QgYnRpZl9zdG9yYWdlX2dldF9sb2NhbF9pb19jYXBzKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19idGlmX3N0b3JhZ2UuaCBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfYnRpZl9zdG9yYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTJkZTIuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19idGlmX3N0b3JhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG1hbmFnZXIgewotCi1jbGFzcyBCdGlmU3RvcmFnZUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgTG9hZEJvbmRlZEVhdHQodm9pZCkgPSAwOwotICB2aXJ0dWFsIH5CdGlmU3RvcmFnZUludGVyZmFjZSgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSA6IHB1YmxpYyBCdGlmU3RvcmFnZUludGVyZmFjZSB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDAoTG9hZEJvbmRlZEVhdHQsIHZvaWQodm9pZCkpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrQmlmU3RvcmFnZUludGVyZmFjZX0gZm9yIHRlc3RpbmcKLSAqCi0gKiBAcGFyYW0gbW9ja19idGlmX3N0b3JhZ2VfaW50ZXJmYWNlIHBvaW50ZXIgdG8gbW9jayBidG0gc2VjdXJpdHkKLSAqIGludGVybmFsIGludGVyZmFjZSwgY291bGQgYmUgbnVsbAotICovCi12b2lkIFNldE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSgKLSAgICBNb2NrQnRpZlN0b3JhZ2VJbnRlcmZhY2UqIG1vY2tfYnRpZl9zdG9yYWdlX2ludGVyZmFjZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtYW5hZ2VyCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19idG1fYXBpX2xheWVyLmNjIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19idG1fYXBpX2xheWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVjNzZmLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfYnRtX2FwaV9sYXllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuZGsuCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vY2tfYnRtX2FwaV9sYXllci5oIgotCi1zdGF0aWMgYmx1ZXRvb3RoOjptYW5hZ2VyOjpNb2NrQnRtQXBpSW50ZXJmYWNlKiBidG1fYXBpX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0KLXZvaWQgYmx1ZXRvb3RoOjptYW5hZ2VyOjpTZXRNb2NrQnRtQXBpSW50ZXJmYWNlKAotICAgIE1vY2tCdG1BcGlJbnRlcmZhY2UqIG1vY2tfYnRtX2FwaV9pbnRlcmZhY2UpIHsKLSAgYnRtX2FwaV9pbnRlcmZhY2UgPSBtb2NrX2J0bV9hcGlfaW50ZXJmYWNlOwotfQotCi1ib29sIEJUTV9TZXRTZWN1cml0eUxldmVsKGJvb2wgaXNfb3JpZ2luYXRvciwgY29uc3QgY2hhciogcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlcnZpY2VfaWQsIHVpbnQxNl90IHNlY19sZXZlbCwgdWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBteF9wcm90b19pZCwgdWludDMyX3QgbXhfY2hhbl9pZCkgewotICByZXR1cm4gYnRtX2FwaV9pbnRlcmZhY2UtPlNldFNlY3VyaXR5TGV2ZWwoaXNfb3JpZ2luYXRvciwgcF9uYW1lLCBzZXJ2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjX2xldmVsLCBwc20sIG14X3Byb3RvX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXhfY2hhbl9pZCk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0bV9hcGlfbGF5ZXIuaCBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfYnRtX2FwaV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTJiYWJiLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfYnRtX2FwaV9sYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5kay4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIG1hbmFnZXIgewotCi1jbGFzcyBCdG1BcGlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIFNldFNlY3VyaXR5TGV2ZWwoYm9vbCBpc19vcmlnaW5hdG9yLCBjb25zdCBjaGFyKiBwX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZV9pZCwgdWludDE2X3Qgc2VjX2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwc20sIHVpbnQzMl90IG14X3Byb3RvX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBteF9jaGFuX2lkKSA9IDA7Ci0gIHZpcnR1YWwgdWludDhfdCBhY2xfbGlua19yb2xlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgPSAwOwotICB2aXJ0dWFsIH5CdG1BcGlJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBNb2NrQnRtQXBpSW50ZXJmYWNlIDogcHVibGljIEJ0bUFwaUludGVyZmFjZSB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDcoU2V0U2VjdXJpdHlMZXZlbCwKLSAgICAgICAgICAgICAgIGJvb2woYm9vbCBpc19vcmlnaW5hdG9yLCBjb25zdCBjaGFyKiBwX25hbWUsIHVpbnQ4X3Qgc2VydmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsLCB1aW50MTZfdCBwc20sIHVpbnQzMl90IG14X3Byb3RvX2lkLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBteF9jaGFuX2lkKSk7Ci0gIE1PQ0tfTUVUSE9EMihhY2xfbGlua19yb2xlLCB1aW50OF90KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrQnRtQXBpSW50ZXJmYWNlfSBmb3IgdGVzdGluZwotICoKLSAqIEBwYXJhbSBtb2NrX2J0bV9hcGlfaW50ZXJmYWNlIHBvaW50ZXIgdG8gbW9jayBidG0gaW50ZXJmYWNlLCBjb3VsZCBiZSBudWxsCi0gKi8KLXZvaWQgU2V0TW9ja0J0bUFwaUludGVyZmFjZShNb2NrQnRtQXBpSW50ZXJmYWNlKiBtb2NrX2J0bV9pbnRlcmZhY2UpOwotCi19ICAvLyBuYW1lc3BhY2UgbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19idG1fbGF5ZXIuY2MgYi9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0bV9sYXllci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmYjA0ZS4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0bV9sYXllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJtb2NrX2J0bV9sYXllci5oIgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvcmZjZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0YXRpYyBibHVldG9vdGg6Om1hbmFnZXI6Ok1vY2tCdG1TZWN1cml0eUludGVybmFsSW50ZXJmYWNlKgotICAgIGJ0bV9zZWN1cml0eV9pbnRlcm5hbF9pbnRlcmZhY2UgPSBudWxscHRyOwotCi12b2lkIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja1NlY3VyaXR5SW50ZXJuYWxJbnRlcmZhY2UoCi0gICAgTW9ja0J0bVNlY3VyaXR5SW50ZXJuYWxJbnRlcmZhY2UqIG1vY2tfYnRtX3NlY3VyaXR5X2ludGVybmFsX2ludGVyZmFjZSkgewotICBidG1fc2VjdXJpdHlfaW50ZXJuYWxfaW50ZXJmYWNlID0gbW9ja19idG1fc2VjdXJpdHlfaW50ZXJuYWxfaW50ZXJmYWNlOwotfQotCi12b2lkIGJ0bV9zZWNfYWJvcnRfYWNjZXNzX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIGJ0bV9zZWN1cml0eV9pbnRlcm5hbF9pbnRlcmZhY2UtPkFib3J0QWNjZXNzUmVxdWVzdChiZF9hZGRyKTsKLX0KLQotdEJUTV9TVEFUVVMgYnRtX3NlY19teF9hY2Nlc3NfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX29yaWdpbmF0b3IsIHVpbnQxNl90IHJlcXVpcmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSkgewotICByZXR1cm4gYnRtX3NlY3VyaXR5X2ludGVybmFsX2ludGVyZmFjZS0+TXVsdGlwbGV4aW5nUHJvdG9jb2xBY2Nlc3NSZXF1ZXN0KAotICAgICAgYmRfYWRkciwgQlRfUFNNX1JGQ09NTSwgaXNfb3JpZ2luYXRvciwgQlRNX1NFQ19QUk9UT19SRkNPTU0sIDAsCi0gICAgICBwX2NhbGxiYWNrLCBwX3JlZl9kYXRhKTsKLX0KLQotYm9vbCBCVE1fU2V0U2VjdXJpdHlMZXZlbChib29sIGlzX29yaWdpbmF0b3IsIGNvbnN0IGNoYXIqIHBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZXJ2aWNlX2lkLCB1aW50MTZfdCBzZWNfbGV2ZWwsIHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbXhfcHJvdG9faWQsIHVpbnQzMl90IG14X2NoYW5faWQpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQxNl90IEJUTV9HZXRNYXhQYWNrZXRTaXplKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgcmV0dXJuIFJGQ09NTV9ERUZBVUxUX01UVTsKLX0KLQotc3RydWN0IGJ0bV9jbGllbnRfaW50ZXJmYWNlX3MgYnRtX2NsaWVudF9pbnRlcmZhY2UgPSB7Ci0gICAgLnBlZXIgPQotICAgICAgICB7Ci0gICAgICAgICAgICAuQlRNX0dldE1heFBhY2tldFNpemUgPSBCVE1fR2V0TWF4UGFja2V0U2l6ZSwKLSAgICAgICAgfSwKLX07Ci0KLXN0cnVjdCBidG1fY2xpZW50X2ludGVyZmFjZV9zJiBnZXRfYnRtX2NsaWVudF9pbnRlcmZhY2UoKSB7Ci0gIHJldHVybiBidG1fY2xpZW50X2ludGVyZmFjZTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfYnRtX2xheWVyLmggYi9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0bV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk4NzViLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfYnRtX2xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbWFuYWdlciB7Ci0KLWNsYXNzIEJ0bVNlY3VyaXR5SW50ZXJuYWxJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIEFib3J0QWNjZXNzUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSA9IDA7Ci0gIHZpcnR1YWwgdEJUTV9TVEFUVVMgTXVsdGlwbGV4aW5nUHJvdG9jb2xBY2Nlc3NSZXF1ZXN0KAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgcHNtLCBib29sIGlzX29yaWdpbmF0b3IsCi0gICAgICB1aW50MzJfdCBteF9wcm90b19pZCwgdWludDMyX3QgbXhfY2hhbl9pZCwgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICB2b2lkKiBwX3JlZl9kYXRhKSA9IDA7Ci0gIHZpcnR1YWwgfkJ0bVNlY3VyaXR5SW50ZXJuYWxJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBNb2NrQnRtU2VjdXJpdHlJbnRlcm5hbEludGVyZmFjZSA6IHB1YmxpYyBCdG1TZWN1cml0eUludGVybmFsSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMShBYm9ydEFjY2Vzc1JlcXVlc3QsIHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikpOwotICBNT0NLX01FVEhPRDcoTXVsdGlwbGV4aW5nUHJvdG9jb2xBY2Nlc3NSZXF1ZXN0LAotICAgICAgICAgICAgICAgdEJUTV9TVEFUVVMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yLCB1aW50MzJfdCBteF9wcm90b19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG14X2NoYW5faWQsIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSkpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrQnRtU2VjdXJpdHlJbnRlcm5hbEludGVyZmFjZX0gZm9yIHRlc3RpbmcKLSAqCi0gKiBAcGFyYW0gbW9ja19idG1fc2VjdXJpdHlfaW50ZXJuYWxfaW50ZXJmYWNlIHBvaW50ZXIgdG8gbW9jayBidG0gc2VjdXJpdHkKLSAqIGludGVybmFsIGludGVyZmFjZSwgY291bGQgYmUgbnVsbAotICovCi12b2lkIFNldE1vY2tTZWN1cml0eUludGVybmFsSW50ZXJmYWNlKAotICAgIE1vY2tCdG1TZWN1cml0eUludGVybmFsSW50ZXJmYWNlKiBtb2NrX2J0bV9zZWN1cml0eV9pbnRlcm5hbF9pbnRlcmZhY2UpOwotCi19ICAvLyBuYW1lc3BhY2UgbWFuYWdlcgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19idHVfbGF5ZXIuY2MgYi9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0dV9sYXllci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5ZWY1My4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2J0dV9sYXllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuIG51bGxwdHI7IH0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5jYyBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4MzQyNS4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibW9ja19jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0KLXN0YXRpYyBjb250cm9sbGVyOjpNb2NrQ29udHJvbGxlckludGVyZmFjZSogY29udHJvbGxlcl9pbnRlcmZhY2UgPSBudWxscHRyOwotCi12b2lkIGNvbnRyb2xsZXI6OlNldE1vY2tDb250cm9sbGVySW50ZXJmYWNlKAotICAgIE1vY2tDb250cm9sbGVySW50ZXJmYWNlKiBpbnRlcmZhY2UpIHsKLSAgY29udHJvbGxlcl9pbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci19Ci0KLXVpbnQxNl90IGdldF9pc29fZGF0YV9zaXplKHZvaWQpIHsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlLT5HZXRJc29EYXRhU2l6ZSgpOwotfQotCi11aW50OF90IGdldF9pc29fYnVmZmVyX2NvdW50KHZvaWQpIHsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlLT5HZXRJc29CdWZmZXJDb3VudCgpOwotfQotdWludDE2X3QgZ2V0X2FjbF9kYXRhX3NpemVfYmxlKHZvaWQpIHsKLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW50ZXJmYWNlLT5HZXRBY2xEYXRhU2l6ZUJsZSgpOwotfQotCi1jb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXJfZ2V0X2ludGVyZmFjZSgpIHsKLSAgc3RhdGljIGNvbnRyb2xsZXJfdCogY29udHJvbGxlcl9pbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyX3QoKTsKLQotICBjb250cm9sbGVyX2luc3RhbmNlLT5nZXRfaXNvX2RhdGFfc2l6ZSA9ICZnZXRfaXNvX2RhdGFfc2l6ZTsKLSAgY29udHJvbGxlcl9pbnN0YW5jZS0+Z2V0X2lzb19idWZmZXJfY291bnQgPSAmZ2V0X2lzb19idWZmZXJfY291bnQ7Ci0gIGNvbnRyb2xsZXJfaW5zdGFuY2UtPmdldF9hY2xfZGF0YV9zaXplX2JsZSA9ICZnZXRfYWNsX2RhdGFfc2l6ZV9ibGU7Ci0KLSAgcmV0dXJuIGNvbnRyb2xsZXJfaW5zdGFuY2U7Ci19CmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2NvbnRyb2xsZXIuaCBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGVlNWZjLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfY29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLQotbmFtZXNwYWNlIGNvbnRyb2xsZXIgewotY2xhc3MgQ29udHJvbGxlckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHVpbnQ4X3QgR2V0SXNvQnVmZmVyQ291bnQodm9pZCkgPSAwOwotICB2aXJ0dWFsIHVpbnQxNl90IEdldElzb0RhdGFTaXplKHZvaWQpID0gMDsKLSAgdmlydHVhbCB1aW50MTZfdCBHZXRBY2xEYXRhU2l6ZUJsZSh2b2lkKSA9IDA7Ci0KLSAgdmlydHVhbCB+Q29udHJvbGxlckludGVyZmFjZSgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIE1vY2tDb250cm9sbGVySW50ZXJmYWNlIDogcHVibGljIENvbnRyb2xsZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QoKHVpbnQ4X3QpLCBHZXRJc29CdWZmZXJDb3VudCwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodWludDE2X3QpLCBHZXRJc29EYXRhU2l6ZSwgKCksIChvdmVycmlkZSkpOwotICBNT0NLX01FVEhPRCgodWludDE2X3QpLCBHZXRBY2xEYXRhU2l6ZUJsZSwgKCksIChvdmVycmlkZSkpOwotfTsKLQotdm9pZCBTZXRNb2NrQ29udHJvbGxlckludGVyZmFjZSgKLSAgICBNb2NrQ29udHJvbGxlckludGVyZmFjZSogbW9ja19jb250cm9sbGVyX2ludGVyZmFjZSk7Ci19ICAvLyBuYW1lc3BhY2UgY29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19lYXR0LmNjIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19lYXR0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA1MzFhLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfZWF0dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4gUmVwcmVzZW50ZWQgYnkgRUhJTUEgLQotICogd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibW9ja19lYXR0LmgiCi0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1Nb2NrRWF0dEV4dGVuc2lvbiogbW9ja19waW1wbF87Ci1Nb2NrRWF0dEV4dGVuc2lvbiogTW9ja0VhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCkgewotICBibHVldG9vdGg6OmVhdHQ6OkVhdHRFeHRlbnNpb246OkdldEluc3RhbmNlKCk7Ci0gIHJldHVybiBtb2NrX3BpbXBsXzsKLX0KLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgZWF0dCB7Ci0KLXN0cnVjdCBFYXR0RXh0ZW5zaW9uOjppbXBsIDogcHVibGljIE1vY2tFYXR0RXh0ZW5zaW9uIHsKLSAgaW1wbCgpID0gZGVmYXVsdDsKLSAgfmltcGwoKSA9IGRlZmF1bHQ7Ci0gIGJvb2wgSXNSdW5uaW5nKCkgeyByZXR1cm4gbW9ja19waW1wbF8gPyB0cnVlIDogZmFsc2U7IH0KLX07Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6QWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikge30KLQotRWF0dEV4dGVuc2lvbjo6RWF0dEV4dGVuc2lvbigpIDogcGltcGxfKHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oKSkge30KLQotYm9vbCBFYXR0RXh0ZW5zaW9uOjpJc0VhdHRTdXBwb3J0ZWRCeVBlZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICByZXR1cm4gcGltcGxfLT5Jc0VhdHRTdXBwb3J0ZWRCeVBlZXIoYmRfYWRkcik7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6Q29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHBpbXBsXy0+Q29ubmVjdChiZF9hZGRyKTsKLX0KLQotdm9pZCBFYXR0RXh0ZW5zaW9uOjpEaXNjb25uZWN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcGltcGxfLT5EaXNjb25uZWN0KGJkX2FkZHIpOwotfQotCi12b2lkIEVhdHRFeHRlbnNpb246OlJlY29uZmlndXJlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1KSB7Ci0gIHBpbXBsXy0+UmVjb25maWd1cmUoYmRfYWRkciwgY2lkLCBtdHUpOwotfQotdm9pZCBFYXR0RXh0ZW5zaW9uOjpSZWNvbmZpZ3VyZUFsbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtdHUpIHsKLSAgcGltcGxfLT5SZWNvbmZpZ3VyZUFsbChiZF9hZGRyLCBtdHUpOwotfQotCi1FYXR0Q2hhbm5lbCogRWF0dEV4dGVuc2lvbjo6RmluZEVhdHRDaGFubmVsQnlDaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaWQpIHsKLSAgcmV0dXJuIHBpbXBsXy0+RmluZEVhdHRDaGFubmVsQnlDaWQoYmRfYWRkciwgY2lkKTsKLX0KLQotRWF0dENoYW5uZWwqIEVhdHRFeHRlbnNpb246OkZpbmRFYXR0Q2hhbm5lbEJ5VHJhbnNJZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc19pZCkgewotICByZXR1cm4gcGltcGxfLT5GaW5kRWF0dENoYW5uZWxCeVRyYW5zSWQoYmRfYWRkciwgdHJhbnNfaWQpOwotfQotCi1ib29sIEVhdHRFeHRlbnNpb246OklzSW5kaWNhdGlvblBlbmRpbmcoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbmRpY2F0aW9uX2hhbmRsZSkgewotICByZXR1cm4gcGltcGxfLT5Jc0luZGljYXRpb25QZW5kaW5nKGJkX2FkZHIsIGluZGljYXRpb25faGFuZGxlKTsKLX0KLQotRWF0dENoYW5uZWwqIEVhdHRFeHRlbnNpb246OkdldENoYW5uZWxBdmFpbGFibGVGb3JJbmRpY2F0aW9uKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcmV0dXJuIHBpbXBsXy0+R2V0Q2hhbm5lbEF2YWlsYWJsZUZvckluZGljYXRpb24oYmRfYWRkcik7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6RnJlZUdhdHRSZXNvdXJjZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBwaW1wbF8tPkZyZWVHYXR0UmVzb3VyY2VzKGJkX2FkZHIpOwotfQotCi1ib29sIEVhdHRFeHRlbnNpb246OklzT3V0c3RhbmRpbmdNc2dJblNlbmRRdWV1ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBwaW1wbF8tPklzT3V0c3RhbmRpbmdNc2dJblNlbmRRdWV1ZShiZF9hZGRyKTsKLX0KLQotRWF0dENoYW5uZWwqIEVhdHRFeHRlbnNpb246OkdldENoYW5uZWxXaXRoUXVldWVkRGF0YSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBwaW1wbF8tPkdldENoYW5uZWxXaXRoUXVldWVkRGF0YShiZF9hZGRyKTsKLX0KLQotRWF0dENoYW5uZWwqIEVhdHRFeHRlbnNpb246OkdldENoYW5uZWxBdmFpbGFibGVGb3JDbGllbnRSZXF1ZXN0KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcmV0dXJuIHBpbXBsXy0+R2V0Q2hhbm5lbEF2YWlsYWJsZUZvckNsaWVudFJlcXVlc3QoYmRfYWRkcik7Ci19Ci0KLS8qIFN0YXJ0IHN0b3AgR0FUVCBpbmRpY2F0aW9uIHRpbWVyIHBlciBDSUQgKi8KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RhcnRJbmRpY2F0aW9uQ29uZmlybWF0aW9uVGltZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2lkKSB7Ci0gIHBpbXBsXy0+U3RhcnRJbmRpY2F0aW9uQ29uZmlybWF0aW9uVGltZXIoYmRfYWRkciwgY2lkKTsKLX0KLQotdm9pZCBFYXR0RXh0ZW5zaW9uOjpTdG9wSW5kaWNhdGlvbkNvbmZpcm1hdGlvblRpbWVyKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2lkKSB7Ci0gIHBpbXBsXy0+U3RvcEluZGljYXRpb25Db25maXJtYXRpb25UaW1lcihiZF9hZGRyLCBjaWQpOwotfQotCi0vKiBTdGFydCBzdG9wIGFwcGxpY2F0aW9uIGluZGljYXRpb24gdGltZW91dCAqLwotdm9pZCBFYXR0RXh0ZW5zaW9uOjpTdGFydEFwcEluZGljYXRpb25UaW1lcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaWQpIHsKLSAgcGltcGxfLT5TdGFydEFwcEluZGljYXRpb25UaW1lcihiZF9hZGRyLCBjaWQpOwotfQotCi12b2lkIEVhdHRFeHRlbnNpb246OlN0b3BBcHBJbmRpY2F0aW9uVGltZXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaWQpIHsKLSAgcGltcGxfLT5TdG9wQXBwSW5kaWNhdGlvblRpbWVyKGJkX2FkZHIsIGNpZCk7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RhcnQoKSB7Ci0gIC8vIEl0IGlzIG5lZWRlZCBoZXJlIGFzIElzb01hbmFnZXIgd2hpY2ggaXMgYSBzaW5nbGV0b24gY3JlYXRlcyBpdCwgYnV0IGluCi0gIC8vIHRoaXMgbW9jayB3ZSB3YW50IHRvIGRlc3Ryb3kgYW5kIHJlY3JlYXRlIHRoZSBtb2NrIG9uIGVhY2ggdGVzdCBjYXNlLgotICBpZiAoIXBpbXBsXykgewotICAgIHBpbXBsXyA9IHN0ZDo6bWFrZV91bmlxdWU8aW1wbD4oKTsKLSAgfQotCi0gIG1vY2tfcGltcGxfID0gcGltcGxfLmdldCgpOwotICBwaW1wbF8tPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgRWF0dEV4dGVuc2lvbjo6U3RvcCgpIHsKLSAgLy8gSXQgaXMgbmVlZGVkIGhlcmUgYXMgSXNvTWFuYWdlciB3aGljaCBpcyBhIHNpbmdsZXRvbiBjcmVhdGVzIGl0LCBidXQgaW4KLSAgLy8gdGhpcyBtb2NrIHdlIHdhbnQgdG8gZGVzdHJveSBhbmQgcmVjcmVhdGUgdGhlIG1vY2sgb24gZWFjaCB0ZXN0IGNhc2UuCi0gIGlmIChwaW1wbF8pIHsKLSAgICBwaW1wbF8tPlN0b3AoKTsKLSAgICBwaW1wbF8ucmVzZXQoKTsKLSAgfQotCi0gIG1vY2tfcGltcGxfID0gbnVsbHB0cjsKLX0KLQotRWF0dEV4dGVuc2lvbjo6fkVhdHRFeHRlbnNpb24oKSA9IGRlZmF1bHQ7Ci19ICAvLyBuYW1lc3BhY2UgZWF0dAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19lYXR0LmggYi9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2VhdHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1ZDlkNS4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2VhdHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBISU1TQSBJSSBLL1MgLSB3d3cuaGltc2EuY29tLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlICJzdGFjay9lYXR0L2VhdHQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OmVhdHQ6OkVhdHRDaGFubmVsOwotdXNpbmcgYmx1ZXRvb3RoOjplYXR0OjpFYXR0RXh0ZW5zaW9uOwotCi1jbGFzcyBNb2NrRWF0dEV4dGVuc2lvbiA6IHB1YmxpYyBFYXR0RXh0ZW5zaW9uIHsKLSBwdWJsaWM6Ci0gIE1vY2tFYXR0RXh0ZW5zaW9uKCkgPSBkZWZhdWx0OwotICB+TW9ja0VhdHRFeHRlbnNpb24oKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIE1vY2tFYXR0RXh0ZW5zaW9uKiBHZXRJbnN0YW5jZSgpOwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ29ubmVjdCwgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBEaXNjb25uZWN0LCAoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFJlY29uZmlndXJlLAotICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY2lkLCB1aW50MTZfdCBtdHUpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBSZWNvbmZpZ3VyZUFsbCwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG10dSkpOwotCi0gIE1PQ0tfTUVUSE9EKChib29sKSwgSXNFYXR0U3VwcG9ydGVkQnlQZWVyLCAoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikpOwotICBNT0NLX01FVEhPRCgoRWF0dENoYW5uZWwqKSwgRmluZEVhdHRDaGFubmVsQnlDaWQsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjaWQpKTsKLSAgTU9DS19NRVRIT0QoKEVhdHRDaGFubmVsKiksIEZpbmRFYXR0Q2hhbm5lbEJ5VHJhbnNJZCwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90IHRyYW5zX2lkKSk7Ci0gIE1PQ0tfTUVUSE9EKChib29sKSwgSXNJbmRpY2F0aW9uUGVuZGluZywKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGluZGljYXRpb25faGFuZGxlKSk7Ci0gIE1PQ0tfTUVUSE9EKChFYXR0Q2hhbm5lbCopLCBHZXRDaGFubmVsQXZhaWxhYmxlRm9ySW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBGcmVlR2F0dFJlc291cmNlcywgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpKTsKLSAgTU9DS19NRVRIT0QoKGJvb2wpLCBJc091dHN0YW5kaW5nTXNnSW5TZW5kUXVldWUsIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSk7Ci0gIE1PQ0tfTUVUSE9EKChFYXR0Q2hhbm5lbCopLCBHZXRDaGFubmVsV2l0aFF1ZXVlZERhdGEsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSk7Ci0gIE1PQ0tfTUVUSE9EKChFYXR0Q2hhbm5lbCopLCBHZXRDaGFubmVsQXZhaWxhYmxlRm9yQ2xpZW50UmVxdWVzdCwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdGFydEluZGljYXRpb25Db25maXJtYXRpb25UaW1lciwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCkpOwotICBNT0NLX01FVEhPRCgodm9pZCksIFN0b3BJbmRpY2F0aW9uQ29uZmlybWF0aW9uVGltZXIsCi0gICAgICAgICAgICAgIChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBjaWQpKTsKLQotICBNT0NLX01FVEhPRCgodm9pZCksIFN0YXJ0QXBwSW5kaWNhdGlvblRpbWVyLAotICAgICAgICAgICAgICAoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY2lkKSk7Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU3RvcEFwcEluZGljYXRpb25UaW1lciwKLSAgICAgICAgICAgICAgKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNpZCkpOwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU3RhcnQsICgpKTsKLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTdG9wLCAoKSk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja0VhdHRFeHRlbnNpb24pOwotfTsKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfZ2F0dF9sYXllci5jYyBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfZ2F0dF9sYXllci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmNzYyOC4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2dhdHRfbGF5ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibW9ja19nYXR0X2xheWVyLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgYmx1ZXRvb3RoOjpnYXR0OjpNb2NrR2F0dEludGVyZmFjZSogZ2F0dF9pbnRlcmZhY2UgPSBudWxscHRyOwotCi12b2lkIGJsdWV0b290aDo6Z2F0dDo6U2V0TW9ja0dhdHRJbnRlcmZhY2UoCi0gICAgTW9ja0dhdHRJbnRlcmZhY2UqIG1vY2tfZ2F0dF9pbnRlcmZhY2UpIHsKLSAgZ2F0dF9pbnRlcmZhY2UgPSBtb2NrX2dhdHRfaW50ZXJmYWNlOwotfQotCi1ib29sIGdhdHRfcHJvZmlsZV9nZXRfZWF0dF9zdXBwb3J0KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRhKSB7Ci0gIHJldHVybiBnYXR0X2ludGVyZmFjZS0+R2V0RWF0dFN1cHBvcnQocGVlcl9iZGEpOwotfQotCi12b2lkIGdhdHRfY2xfaW5pdF9zcl9zdGF0dXModEdBVFRfVENCJiB0Y2IpIHsKLSAgcmV0dXJuIGdhdHRfaW50ZXJmYWNlLT5DbGllbnRJbml0U2VydmVyU3RhdHVzKHRjYik7Ci19Ci0KLWJvb2wgZ2F0dF9jbF9yZWFkX3NyX3N1cHBfZmVhdF9yZXEoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYsIHVpbnQ4X3QpPiBjYikgewotICByZXR1cm4gZ2F0dF9pbnRlcmZhY2UtPkNsaWVudFJlYWRTdXBwb3J0ZWRGZWF0dXJlcyhwZWVyX2JkYSwgc3RkOjptb3ZlKGNiKSk7Ci19CmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2dhdHRfbGF5ZXIuaCBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfZ2F0dF9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmZmZmExLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfZ2F0dF9sYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLQotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBnYXR0IHsKLQotY2xhc3MgR2F0dEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgQ2xpZW50SW5pdFNlcnZlclN0YXR1cyh0R0FUVF9UQ0ImIHRjYikgPSAwOwotICB2aXJ0dWFsIGJvb2wgQ2xpZW50UmVhZFN1cHBvcnRlZEZlYXR1cmVzKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEsCi0gICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJiwgdWludDhfdCk+IGNiKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBHZXRFYXR0U3VwcG9ydChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSkgPSAwOwotICB2aXJ0dWFsIH5HYXR0SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgTW9ja0dhdHRJbnRlcmZhY2UgOiBwdWJsaWMgR2F0dEludGVyZmFjZSB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDEoQ2xpZW50SW5pdFNlcnZlclN0YXR1cywgdm9pZCh0R0FUVF9UQ0ImIHRjYikpOwotICBNT0NLX01FVEhPRDIoQ2xpZW50UmVhZFN1cHBvcnRlZEZlYXR1cmVzLAotICAgICAgICAgICAgICAgYm9vbChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYsIHVpbnQ4X3QpPiBjYikpOwotICBNT0NLX01FVEhPRDEoR2V0RWF0dFN1cHBvcnQsIGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEpKTsKLX07Ci0KLS8qKgotICogU2V0IHRoZSB7QGxpbmsgTW9ja0dhdHRJbnRlcmZhY2V9IGZvciB0ZXN0aW5nCi0gKgotICogQHBhcmFtIG1vY2tfZ2F0dF9pbnRlcmZhY2UgcG9pbnRlciB0byBtb2NrIGdhdHQgaW50ZXJmYWNlLCBjb3VsZCBiZSBudWxsCi0gKi8KLXZvaWQgU2V0TW9ja0dhdHRJbnRlcmZhY2UoTW9ja0dhdHRJbnRlcmZhY2UqIG1vY2tfZ2F0dF9pbnRlcmZhY2UpOwotCi19ICAvLyBuYW1lc3BhY2UgZ2F0dAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19oY2ljX2xheWVyLmNjIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19oY2ljX2xheWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY0ZDEzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfaGNpY19sYXllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmNvbS4KLSAqIFJlcHJlc2VudGVkIGJ5IEVISU1BIC0gd3d3LmVoaW1hLmNvbQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibW9ja19oY2ljX2xheWVyLmgiCi0KLXN0YXRpYyBoY2ljOjpNb2NrSGNpY0ludGVyZmFjZSogaGNpY19pbnRlcmZhY2UgPSBudWxscHRyOwotCi12b2lkIGhjaWM6OlNldE1vY2tIY2ljSW50ZXJmYWNlKE1vY2tIY2ljSW50ZXJmYWNlKiBpbnRlcmZhY2UpIHsKLSAgaGNpY19pbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19zZXRfY2lnX3BhcmFtcygKLSAgICB1aW50OF90IGNpZ19pZCwgdWludDMyX3Qgc2R1X2l0dl9tdG9zLCB1aW50MzJfdCBzZHVfaXR2X3N0b20sIHVpbnQ4X3Qgc2NhLAotICAgIHVpbnQ4X3QgcGFja2luZywgdWludDhfdCBmcmFtaW5nLCB1aW50MTZfdCBtYXhfdHJhbnNfbGF0X3N0b20sCi0gICAgdWludDE2X3QgbWF4X3RyYW5zX2xhdF9tdG9zLCB1aW50OF90IGNpc19jbnQsIGNvbnN0IEVYVF9DSVNfQ0ZHKiBjaXNfY2ZnLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIHN0cnVjdCBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfcGFyYW1zIGNpZ19wYXJhbXMgPSB7Ci0gICAgICAuc2R1X2l0dl9tdG9zID0gc2R1X2l0dl9tdG9zLAotICAgICAgLnNkdV9pdHZfc3RvbSA9IHNkdV9pdHZfc3RvbSwKLSAgICAgIC5zY2EgPSBzY2EsCi0gICAgICAucGFja2luZyA9IHBhY2tpbmcsCi0gICAgICAuZnJhbWluZyA9IGZyYW1pbmcsCi0gICAgICAubWF4X3RyYW5zX2xhdF9zdG9tID0gbWF4X3RyYW5zX2xhdF9zdG9tLAotICAgICAgLm1heF90cmFuc19sYXRfbXRvcyA9IG1heF90cmFuc19sYXRfbXRvcywKLSAgICAgIC5jaXNfY2ZncyA9IHN0ZDo6dmVjdG9yKGNpc19jZmcsIGNpc19jZmcgKyBjaXNfY250KSwKLSAgfTsKLSAgaGNpY19pbnRlcmZhY2UtPlNldENpZ1BhcmFtcyhjaWdfaWQsIHN0ZDo6bW92ZShjaWdfcGFyYW1zKSwgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXZvaWQgYnRzbmRfaGNpY19yZW1vdmVfY2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgaGNpY19pbnRlcmZhY2UtPlJlbW92ZUNpZyhjaWdfaWQsIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2Npcyh1aW50OF90IG51bV9jaXMsIGNvbnN0IEVYVF9DSVNfQ1JFQVRFX0NGRyogY2lzX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIGhjaWNfaW50ZXJmYWNlLT5DcmVhdGVDaXMobnVtX2NpcywgY2lzX2NmZywgc3RkOjptb3ZlKGNiKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c25kX2hjaWNfZGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIGhjaWNfaW50ZXJmYWNlLT5EaXNjb25uZWN0KGhhbmRsZSwgcmVhc29uKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3NldHVwX2lzb19kYXRhX3BhdGgoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyLCB1aW50OF90IGRhdGFfcGF0aF9pZCwKLSAgICB1aW50OF90IGNvZGVjX2lkX2Zvcm1hdCwgdWludDE2X3QgY29kZWNfaWRfY29tcGFueSwKLSAgICB1aW50MTZfdCBjb2RlY19pZF92ZW5kb3IsIHVpbnQzMl90IGNvbnRyb2xsZXJfZGVsYXksCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfY29uZiwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBoY2ljX2ludGVyZmFjZS0+U2V0dXBJc29EYXRhUGF0aChpc29faGFuZGxlLCBkYXRhX3BhdGhfZGlyLCBkYXRhX3BhdGhfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2lkX2Zvcm1hdCwgY29kZWNfaWRfY29tcGFueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfaWRfdmVuZG9yLCBjb250cm9sbGVyX2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY29kZWNfY29uZiksIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfcmVtb3ZlX2lzb19kYXRhX3BhdGgoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIGhjaWNfaW50ZXJmYWNlLT5SZW1vdmVJc29EYXRhUGF0aChpc29faGFuZGxlLCBkYXRhX3BhdGhfZGlyLCBzdGQ6Om1vdmUoY2IpKTsKLX0KLQotdm9pZCBidHNuZF9oY2ljX3JlYWRfaXNvX2xpbmtfcXVhbGl0eSgKLSAgICB1aW50MTZfdCBpc29faGFuZGxlLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBoY2ljX2ludGVyZmFjZS0+UmVhZElzb0xpbmtRdWFsaXR5KGlzb19oYW5kbGUsIHN0ZDo6bW92ZShjYikpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2JpZyh1aW50OF90IGJpZ19oYW5kbGUsIHVpbnQ4X3QgYWR2X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2JpcywgdWludDMyX3Qgc2R1X2l0diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9zZHVfc2l6ZSwgdWludDE2X3QgdHJhbnNwb3J0X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ0biwgdWludDhfdCBwaHksIHVpbnQ4X3QgcGFja2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZnJhbWluZywgdWludDhfdCBlbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBiY3N0X2NvZGUpIHsKLSAgc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMgYmlnX3BhcmFtcyA9IHsKLSAgICAgIC5hZHZfaGFuZGxlID0gYWR2X2hhbmRsZSwKLSAgICAgIC5udW1fYmlzID0gbnVtX2JpcywKLSAgICAgIC5zZHVfaXR2ID0gc2R1X2l0diwKLSAgICAgIC5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemUsCi0gICAgICAubWF4X3RyYW5zcG9ydF9sYXRlbmN5ID0gdHJhbnNwb3J0X2xhdGVuY3ksCi0gICAgICAucnRuID0gcnRuLAotICAgICAgLnBoeSA9IHBoeSwKLSAgICAgIC5wYWNraW5nID0gcGFja2luZywKLSAgICAgIC5mcmFtaW5nID0gZnJhbWluZywKLSAgICAgIC5lbmMgPSBlbmMsCi0gICAgICAuZW5jX2NvZGUgPSBzdGQ6Om1vdmUoYmNzdF9jb2RlKSwKLSAgfTsKLSAgaGNpY19pbnRlcmZhY2UtPkNyZWF0ZUJpZyhiaWdfaGFuZGxlLCBzdGQ6Om1vdmUoYmlnX3BhcmFtcykpOwotfQotCi12b2lkIGJ0c25kX2hjaWNfdGVybV9iaWcodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBoY2ljX2ludGVyZmFjZS0+VGVybWluYXRlQmlnKGJpZ19oYW5kbGUsIHJlYXNvbik7Ci19Ci0KLWJsdWV0b290aDo6bGVnYWN5OjpoY2k6OkludGVyZmFjZSBpbnRlcmZhY2VfID0gewotICAgIC5EaXNjb25uZWN0ID0gYnRzbmRfaGNpY19kaXNjb25uZWN0LAotfTsKLQotY29uc3QgYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6SW50ZXJmYWNlJgotYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6R2V0SW50ZXJmYWNlKCkgewotICByZXR1cm4gaW50ZXJmYWNlXzsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfaGNpY19sYXllci5oIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19oY2ljX2xheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGRhZDguLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19oY2ljX2xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0KLSNpbmNsdWRlIDxhcnJheT4KLQotI2luY2x1ZGUgImJ0bV9pc29fYXBpX3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBoY2ljIHsKLWNsYXNzIEhjaWNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgLy8gaXNvX21hbmFnZXI6OmNpZ19jcmVhdGVfcGFyYW1zIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIDEwIHBhcmFtcyBmdW5jdGlvbgotICAvLyBsaW1pdGF0aW9uIHRoYXQgZ21vY2sgc2V0cwotICB2aXJ0dWFsIHZvaWQgU2V0Q2lnUGFyYW1zKAotICAgICAgdWludDhfdCBjaWdfaWQsCi0gICAgICBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zLAotICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQ2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIENyZWF0ZUNpcyh1aW50OF90IG51bV9jaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVhUX0NJU19DUkVBVEVfQ0ZHKiBjaXNfY3JlYXRlX2NmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBEaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByZWFzb24pID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgU2V0dXBJc29EYXRhUGF0aCgKLSAgICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpciwgdWludDhfdCBkYXRhX3BhdGhfaWQsCi0gICAgICB1aW50OF90IGNvZGVjX2lkX2Zvcm1hdCwgdWludDE2X3QgY29kZWNfaWRfY29tcGFueSwKLSAgICAgIHVpbnQxNl90IGNvZGVjX2lkX3ZlbmRvciwgdWludDMyX3QgY29udHJvbGxlcl9kZWxheSwKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvZGVjX2NvbmYsCi0gICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBSZW1vdmVJc29EYXRhUGF0aCgKLSAgICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpciwKLSAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFJlYWRJc29MaW5rUXVhbGl0eSgKLSAgICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSA9IDA7Ci0KLSAgLy8gaXNvX21hbmFnZXI6OmJpZ19jcmVhdGVfcGFyYW1zIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIDEwIHBhcmFtcyBmdW5jdGlvbgotICAvLyBsaW1pdGF0aW9uIHRoYXQgZ21vY2sgc2V0cwotICB2aXJ0dWFsIHZvaWQgQ3JlYXRlQmlnKAotICAgICAgdWludDhfdCBiaWdfaGFuZGxlLAotICAgICAgc3RydWN0IGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6YmlnX2NyZWF0ZV9wYXJhbXMgYmlnX3BhcmFtcykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBUZXJtaW5hdGVCaWcodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgPSAwOwotCi0gIHZpcnR1YWwgfkhjaWNJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBNb2NrSGNpY0ludGVyZmFjZSA6IHB1YmxpYyBIY2ljSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgU2V0Q2lnUGFyYW1zLAotICAgICAgICAgICAgICAodWludDhfdCBjaWdfaWQsCi0gICAgICAgICAgICAgICBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zLAotICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQotICBNT0NLX01FVEhPRCgodm9pZCksIFJlbW92ZUNpZywKLSAgICAgICAgICAgICAgKHVpbnQ4X3QgY2lnX2lkLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYiksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgQ3JlYXRlQ2lzLAotICAgICAgICAgICAgICAodWludDhfdCBudW1fY2lzLCBjb25zdCBFWFRfQ0lTX0NSRUFURV9DRkcqIGNpc19jcmVhdGVfY2ZnLAotICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQotICBNT0NLX01FVEhPRCgodm9pZCksIERpc2Nvbm5lY3QsICh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBTZXR1cElzb0RhdGFQYXRoLAotICAgICAgICAgICAgICAodWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyLCB1aW50OF90IGRhdGFfcGF0aF9pZCwKLSAgICAgICAgICAgICAgIHVpbnQ4X3QgY29kZWNfaWRfZm9ybWF0LCB1aW50MTZfdCBjb2RlY19pZF9jb21wYW55LAotICAgICAgICAgICAgICAgdWludDE2X3QgY29kZWNfaWRfdmVuZG9yLCB1aW50MzJfdCBjb250cm9sbGVyX2RlbGF5LAotICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfY29uZiwKLSAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBSZW1vdmVJc29EYXRhUGF0aCwKLSAgICAgICAgICAgICAgKHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpciwKLSAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSwKLSAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0KLSAgTU9DS19NRVRIT0QoKHZvaWQpLCBSZWFkSXNvTGlua1F1YWxpdHksCi0gICAgICAgICAgICAgICh1aW50MTZfdCBpc29faGFuZGxlLAotICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpLAotICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQotICBNT0NLX01FVEhPRCgKLSAgICAgICh2b2lkKSwgQ3JlYXRlQmlnLAotICAgICAgKHVpbnQ4X3QgYmlnX2hhbmRsZSwKLSAgICAgICBzdHJ1Y3QgYmx1ZXRvb3RoOjpoY2k6Omlzb19tYW5hZ2VyOjpiaWdfY3JlYXRlX3BhcmFtcyBiaWdfcGFyYW1zKSwKLSAgICAgIChvdmVycmlkZSkpOwotCi0gIE1PQ0tfTUVUSE9EKCh2b2lkKSwgVGVybWluYXRlQmlnLCAodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbiksCi0gICAgICAgICAgICAgIChvdmVycmlkZSkpOwotfTsKLQotdm9pZCBTZXRNb2NrSGNpY0ludGVyZmFjZShNb2NrSGNpY0ludGVyZmFjZSogbW9ja19oY2ljX2ludGVyZmFjZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2ljCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2wyY2FwX2xheWVyLmNjIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19sMmNhcF9sYXllci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5Mjc1OS4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2wyY2FwX2xheWVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJtb2NrX2wyY2FwX2xheWVyLmgiCi0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0YXRpYyBibHVldG9vdGg6OmwyY2FwOjpNb2NrTDJjYXBJbnRlcmZhY2UqIGwyY2FwX2ludGVyZmFjZSA9IG51bGxwdHI7Ci0KLXZvaWQgYmx1ZXRvb3RoOjpsMmNhcDo6U2V0TW9ja0ludGVyZmFjZSgKLSAgICBNb2NrTDJjYXBJbnRlcmZhY2UqIG1vY2tfbDJjYXBfaW50ZXJmYWNlKSB7Ci0gIGwyY2FwX2ludGVyZmFjZSA9IG1vY2tfbDJjYXBfaW50ZXJmYWNlOwotfQotCi11aW50MTZfdCBMMkNBX1JlZ2lzdGVyKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV9zbm9vcCwgdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKSB7Ci0gIFZMT0coMSkgPDwgX19mdW5jX18gPDwgIjogcHNtPSIgPDwgcHNtIDw8ICIsIGVuYWJsZV9zbm9vcD0iIDw8IGVuYWJsZV9zbm9vcDsKLSAgcmV0dXJuIGwyY2FwX2ludGVyZmFjZS0+UmVnaXN0ZXIocHNtLCBwX2NiX2luZm8sIGVuYWJsZV9zbm9vcCwgcF9lcnRtX2luZm8pOwotfQotCi11aW50MTZfdCBMMkNBX0Nvbm5lY3RSZXEodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIHJldHVybiBsMmNhcF9pbnRlcmZhY2UtPkNvbm5lY3RSZXF1ZXN0KHBzbSwgYmRfYWRkcik7Ci19Ci0KLWJvb2wgTDJDQV9Db25uZWN0UnNwKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgaWQsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsIHVpbnQxNl90IHN0YXR1cykgewotICByZXR1cm4gbDJjYXBfaW50ZXJmYWNlLT5Db25uZWN0UmVzcG9uc2UoYmRfYWRkciwgaWQsIGxjaWQsIHJlc3VsdCwgc3RhdHVzKTsKLX0KLQotYm9vbCBMMkNBX0Rpc2Nvbm5lY3RSZXEodWludDE2X3QgY2lkKSB7Ci0gIHJldHVybiBsMmNhcF9pbnRlcmZhY2UtPkRpc2Nvbm5lY3RSZXF1ZXN0KGNpZCk7Ci19Ci0KLWJvb2wgTDJDQV9EaXNjb25uZWN0UnNwKHVpbnQxNl90IGNpZCkgewotICByZXR1cm4gbDJjYXBfaW50ZXJmYWNlLT5EaXNjb25uZWN0UmVzcG9uc2UoY2lkKTsKLX0KLQotYm9vbCBMMkNBX0NvbmZpZ1JlcSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgcmV0dXJuIGwyY2FwX2ludGVyZmFjZS0+Q29uZmlnUmVxdWVzdChjaWQsIHBfY2ZnKTsKLX0KLQotYm9vbCBMMkNBX0NvbmZpZ1JzcCh1aW50MTZfdCBjaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgcmV0dXJuIGwyY2FwX2ludGVyZmFjZS0+Q29uZmlnUmVzcG9uc2UoY2lkLCBwX2NmZyk7Ci19Ci0KLXVpbnQ4X3QgTDJDQV9EYXRhV3JpdGUodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSkgewotICByZXR1cm4gbDJjYXBfaW50ZXJmYWNlLT5EYXRhV3JpdGUoY2lkLCBwX2RhdGEpOwotfQotCi11aW50MTZfdCBMMkNBX1JlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBjYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCwgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZykgewotICByZXR1cm4gbDJjYXBfaW50ZXJmYWNlLT5SZWdpc3RlckxFQ29jKHBzbSwgY2JfaW5mbywgc2VjX2xldmVsKTsKLX0KLQotdm9pZCBMMkNBX0RlcmVnaXN0ZXJMRUNvYyh1aW50MTZfdCBwc20pIHsKLSAgcmV0dXJuIGwyY2FwX2ludGVyZmFjZS0+RGVyZWdpc3RlckxFQ29jKHBzbSk7Ci19Ci0KLXRIQ0lfUk9MRSBMMkNBX0dldEJsZUNvbm5Sb2xlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcmV0dXJuIHRvX2hjaV9yb2xlKGwyY2FwX2ludGVyZmFjZS0+R2V0QmxlQ29ublJvbGUoYmRfYWRkcikpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50MTZfdD4gTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSZXEodWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIHJldHVybiBsMmNhcF9pbnRlcmZhY2UtPkNvbm5lY3RDcmVkaXRCYXNlZFJlcShwc20sIGJkX2FkZHIsIHBfY2ZnKTsKLX0KLQotYm9vbCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+ICZsY2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgcmV0dXJuIGwyY2FwX2ludGVyZmFjZS0+Q29ubmVjdENyZWRpdEJhc2VkUnNwKGJkX2FkZHIsIGlkLCBsY2lkcywgcmVzdWx0LCBwX2NmZyk7Ci19Ci0KLWJvb2wgTDJDQV9SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+ICZsY2lkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZykgewotICByZXR1cm4gbDJjYXBfaW50ZXJmYWNlLT5SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoYmRfYWRkciwgbGNpZHMsIHBlZXJfY2ZnKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfbDJjYXBfbGF5ZXIuaCBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfbDJjYXBfbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiNjYyYi4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NvbW1vbi9tb2NrX2wyY2FwX2xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgbDJjYXAgewotCi1jbGFzcyBMMmNhcEludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHVpbnQxNl90IFJlZ2lzdGVyKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlX3Nub29wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvKSA9IDA7Ci0gIHZpcnR1YWwgdWludDE2X3QgQ29ubmVjdFJlcXVlc3QodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBDb25uZWN0UmVzcG9uc2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsY2lkLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhdHVzKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBEaXNjb25uZWN0UmVxdWVzdCh1aW50MTZfdCBjaWQpID0gMDsKLSAgdmlydHVhbCBib29sIERpc2Nvbm5lY3RSZXNwb25zZSh1aW50MTZfdCBjaWQpID0gMDsKLSAgdmlydHVhbCBib29sIENvbmZpZ1JlcXVlc3QodWludDE2X3QgY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBDb25maWdSZXNwb25zZSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpID0gMDsKLSAgdmlydHVhbCB1aW50OF90IERhdGFXcml0ZSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSA9IDA7Ci0gIHZpcnR1YWwgdWludDE2X3QgUmVnaXN0ZXJMRUNvYyh1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8gJmNiX2luZm8sIHVpbnQxNl90IHNlY19sZXZlbCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGVyZWdpc3RlckxFQ29jKHVpbnQxNl90IHBzbSkgPSAwOwotICB2aXJ0dWFsIGJvb2wgQ29ubmVjdENyZWRpdEJhc2VkUnNwKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gJmxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgPSAwOwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiAgQ29ubmVjdENyZWRpdEJhc2VkUmVxKHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgPSAwOwotICB2aXJ0dWFsIGJvb2wgUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiAmbGNpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpID0gMDsKLSAgdmlydHVhbCB+TDJjYXBJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBNb2NrTDJjYXBJbnRlcmZhY2UgOiBwdWJsaWMgTDJjYXBJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0Q0KFJlZ2lzdGVyLAotICAgICAgICAgICAgICAgdWludDE2X3QodWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV9zbm9vcCwgdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8pKTsKLSAgTU9DS19NRVRIT0QyKENvbm5lY3RSZXF1ZXN0LAotICAgICAgICAgICAgICAgdWludDE2X3QodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSk7Ci0gIE1PQ0tfTUVUSE9ENShDb25uZWN0UmVzcG9uc2UsCi0gICAgICAgICAgICAgICBib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgaWQsIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCwgdWludDE2X3Qgc3RhdHVzKSk7Ci0gIE1PQ0tfTUVUSE9EMShEaXNjb25uZWN0UmVxdWVzdCwgYm9vbCh1aW50MTZfdCBjaWQpKTsKLSAgTU9DS19NRVRIT0QxKERpc2Nvbm5lY3RSZXNwb25zZSwgYm9vbCh1aW50MTZfdCBjaWQpKTsKLSAgTU9DS19NRVRIT0QyKENvbmZpZ1JlcXVlc3QsIGJvb2wodWludDE2X3QgY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSk7Ci0gIE1PQ0tfTUVUSE9EMihDb25maWdSZXNwb25zZSwgYm9vbCh1aW50MTZfdCBjaWQsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpKTsKLSAgTU9DS19NRVRIT0QyKERhdGFXcml0ZSwgdWludDhfdCh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSk7Ci0gIE1PQ0tfTUVUSE9EMyhSZWdpc3RlckxFQ29jLAotICAgICAgICAgICAgICAgdWludDE2X3QodWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPICZjYl9pbmZvLCB1aW50MTZfdCBzZWNfbGV2ZWwpKTsKLSAgTU9DS19NRVRIT0QxKERlcmVnaXN0ZXJMRUNvYywgdm9pZCh1aW50MTZfdCBwc20pKTsKLSAgTU9DS19NRVRIT0QxKEdldEJsZUNvbm5Sb2xlLCB1aW50OF90KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpKTsKLSAgTU9DS19NRVRIT0Q1KENvbm5lY3RDcmVkaXRCYXNlZFJzcCwKLSAgICAgICAgICAgICAgIGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gJmxjaWRzLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpKTsKLSAgTU9DS19NRVRIT0QzKENvbm5lY3RDcmVkaXRCYXNlZFJlcSwKLSAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiAodWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSk7Ci0gIE1PQ0tfTUVUSE9EMyhSZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEsCi0gICAgICAgICAgICAgICBib29sKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+ICZsY2lkcywgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZykpOwotfTsKLQotLyoqCi0gKiBTZXQgdGhlIHtAbGluayBNb2NrTDJjYXBJbnRlcmZhY2V9IGZvciB0ZXN0aW5nCi0gKgotICogQHBhcmFtIG1vY2tfbDJjYXBfaW50ZXJmYWNlIHBvaW50ZXIgdG8gbW9jayBsMmNhcCBpbnRlcmZhY2UsIGNvdWxkIGJlIG51bGwKLSAqLwotdm9pZCBTZXRNb2NrSW50ZXJmYWNlKE1vY2tMMmNhcEludGVyZmFjZSogbW9ja19sMmNhcF9pbnRlcmZhY2UpOwotCi19ICAvLyBuYW1lc3BhY2UgbDJjYXAKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfbWFpbl9zaGltLmNjIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19tYWluX3NoaW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2Q0ZmUuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19tYWluX3NoaW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTQKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jZGVmaW5lIExPR19UQUcgImJ0X3NoaW0iCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotZXh0ZXJuIGJvb2wgTU9DS19ibHVldG9vdGhfc2hpbV9pc19nZF9hY2xfZW5hYmxlZF87Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19hbnlfZ2RfZW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hY2xfZW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBNT0NLX2JsdWV0b290aF9zaGltX2lzX2dkX2FjbF9lbmFibGVkXzsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9hZHZlcnRpc2luZ19lbmFibGVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX3NjYW5uaW5nX2VuYWJsZWQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbDJjYXBfZW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zZWN1cml0eV9lbmFibGVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX3NoaW1fZW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9zdGFja19zdGFydGVkX3VwKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX2xpbmtfcG9saWN5X2VuYWJsZWQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1mdXR1cmVfdCogR2VuZXJhbFNodXREb3duKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1mdXR1cmVfdCogSWRsZU1vZHVsZVN0YXJ0VXAoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWZ1dHVyZV90KiBTaGltTW9kdWxlU3RhcnRVcCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19zdGFja19hdmR0X21zZy5jYyBiL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfc3RhY2tfYXZkdF9tc2cuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTM5OTUuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19zdGFja19hdmR0X21zZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YWNrL2F2ZHQvYXZkdF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8qCi0gKiBUT0RPOiBUaGlzIHdheSBvZiBtb2NraW5nIGlzIHByaW1pdGl2ZS4KLSAqIE5lZWQgdG8gY29uc2lkZXIgbW9yZSBzb3BoaXN0aWNhdGVkIGV4aXN0aW5nIG1ldGhvZHMuCi0gKi8KLQotc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IF9yc3Bfc2lnX2lkc3t9OwotCi12b2lkIGF2ZHRfbXNnX3NlbmRfcnNwKEF2ZHRwQ2NiKiBwX2NjYiwgdWludDhfdCBzaWdfaWQsIHRBVkRUX01TRyogcF9wYXJhbXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIF9yc3Bfc2lnX2lkcy5wdXNoX2JhY2soc2lnX2lkKTsKLX0KLQotc2l6ZV90IG1vY2tfYXZkdF9tc2dfc2VuZF9yc3BfZ2V0X2NvdW50KHZvaWQpIHsKLSAgcmV0dXJuIF9yc3Bfc2lnX2lkcy5zaXplKCk7Ci19Ci0KLXZvaWQgbW9ja19hdmR0X21zZ19zZW5kX3JzcF9jbGVhcl9oaXN0b3J5KHZvaWQpIHsKLSAgX3JzcF9zaWdfaWRzLmNsZWFyKCk7Ci19Ci0KLXVpbnQ4X3QgbW9ja19hdmR0X21zZ19zZW5kX3JzcF9nZXRfc2lnX2lkX2F0KHNpemVfdCBudGgpIHsKLSAgcmV0dXJuIF9yc3Bfc2lnX2lkc1tudGhdOwotfQotCi12b2lkIGF2ZHRfbXNnX2luZChBdmR0cENjYiogcF9jY2IsIEJUX0hEUiogcF9idWYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLXZvaWQgYXZkdF9tc2dfc2VuZF9yZWooQXZkdHBDY2IqIHBfY2NiLCB1aW50OF90IHNpZ19pZCwgdEFWRFRfTVNHKiBwX3BhcmFtcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IF9jbWRfc2lnX2lkc3t9OwotCi12b2lkIGF2ZHRfbXNnX3NlbmRfY21kKEF2ZHRwQ2NiKiBwX2NjYiwgdm9pZCogcF9zY2IsIHVpbnQ4X3Qgc2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9NU0cqIHBfcGFyYW1zKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBfY21kX3NpZ19pZHMucHVzaF9iYWNrKHNpZ19pZCk7Ci19Ci0KLXNpemVfdCBtb2NrX2F2ZHRfbXNnX3NlbmRfY21kX2dldF9jb3VudCh2b2lkKSB7Ci0gIHJldHVybiBfY21kX3NpZ19pZHMuc2l6ZSgpOwotfQotCi12b2lkIG1vY2tfYXZkdF9tc2dfc2VuZF9jbWRfY2xlYXJfaGlzdG9yeSh2b2lkKSB7Ci0gIF9jbWRfc2lnX2lkcy5jbGVhcigpOwotfQotCi11aW50OF90IG1vY2tfYXZkdF9tc2dfc2VuZF9jbWRfZ2V0X3NpZ19pZF9hdChzaXplX3QgbnRoKSB7Ci0gIHJldHVybiBfY21kX3NpZ19pZHNbbnRoXTsKLX0KLQotYm9vbCBhdmR0X21zZ19zZW5kKEF2ZHRwQ2NiKiBwX2NjYiwgQlRfSERSKiBwX21zZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QgYXZkdF9tc2dfcmVqXzJfZXZ0W0FWRFRfQ0NCX05VTV9BQ1RJT05TXSA9IHt9OwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9jb21tb24vbW9ja19zdGFja19hdmR0X21zZy5oIGIvc3RhY2svdGVzdC9jb21tb24vbW9ja19zdGFja19hdmR0X21zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzhlZTc5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL21vY2tfc3RhY2tfYXZkdF9tc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0vKioKLSAqIEdldCBob3cgbWFueSByZXNwb25zZXMgc2VudAotICoKLSAqIEByZXR1cm4gdGhlIGNvdW50IG9mIHJlc3BvbnNlcy4KLSAqLwotc2l6ZV90IG1vY2tfYXZkdF9tc2dfc2VuZF9yc3BfZ2V0X2NvdW50KHZvaWQpOwotCi0vKioKLSAqIENsZWFyIGFsbCB0aGUgaGlzdG9yeSBvZiB0aGUgc2VudCByZXNwb25zZXMuCi0gKi8KLXZvaWQgbW9ja19hdmR0X21zZ19zZW5kX3JzcF9jbGVhcl9oaXN0b3J5KHZvaWQpOwotCi0vKioKLSAqIEdldCB0aGUgbnRoICh6ZXJvIGJhc2VkKSByZXNwb25zZSdzIHNpZyBpZAotICoKLSAqIEBwYXJhbSBudGggcmVzcG9uc2UgcmVjb3JkZWQgc2luY2UgbGFzdCB0aW1lIGNsZWFyIGhpc3RvcnkKLSAqIEByZXR1cm4gdGhlIHNpZyBpZCBvZiB0aGUgcmVzcG9uc2UKLSAqCi0gKiBAbm90ZSB1bmRlZmluZWQgYmVoYXZpb3IgaWYgbnRoID49IHRvdGFsIGNvdW50Ci0gKi8KLXVpbnQ4X3QgbW9ja19hdmR0X21zZ19zZW5kX3JzcF9nZXRfc2lnX2lkX2F0KHNpemVfdCBudGgpOwotCi0vKioKLSAqIEdldCBob3cgbWFueSBjb21tYW5kcyBzZW50Ci0gKgotICogQHJldHVybiB0aGUgY291bnQgb2YgY29tbWFuZHMuCi0gKi8KLXNpemVfdCBtb2NrX2F2ZHRfbXNnX3NlbmRfY21kX2dldF9jb3VudCh2b2lkKTsKLQotLyoqCi0gKiBDbGVhciBhbGwgdGhlIGhpc3Rvcnkgb2YgdGhlIHNlbnQgY29tbWFuZHMuCi0gKi8KLXZvaWQgbW9ja19hdmR0X21zZ19zZW5kX2NtZF9jbGVhcl9oaXN0b3J5KHZvaWQpOwotCi0vKioKLSAqIEdldCB0aGUgbnRoICh6ZXJvIGJhc2VkKSBjb21tYW5kcydzIHNpZyBpZAotICoKLSAqIEBwYXJhbSBudGggY29tbWFuZCByZWNvcmRlZCBzaW5jZSBsYXN0IHRpbWUgY2xlYXIgaGlzdG9yeQotICogQHJldHVybiB0aGUgc2lnIGlkIG9mIHRoZSBjb21tYW5kCi0gKgotICogQG5vdGUgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIG50aCA+PSB0b3RhbCBjb3VudAotICovCi11aW50OF90IG1vY2tfYXZkdF9tc2dfc2VuZF9jbWRfZ2V0X3NpZ19pZF9hdChzaXplX3QgbnRoKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2NvbW1vbi9zdGFja190ZXN0X3BhY2tldF91dGlscy5jYyBiL3N0YWNrL3Rlc3QvY29tbW9uL3N0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg5YTYxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL3N0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmgiCi0KLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfbGF5ZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvbDJjZGVmcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlTDJjYXBEYXRhUGFja2V0KHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpIHsKLSAgLy8gRGF0YSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdDsKLSAgYXV0byBkYXRhX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZGF0YS5zaXplKCkpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGFfc2l6ZSkpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGFfc2l6ZSA+PiA4KSk7Ci0gIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4obGNpZCkpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxjaWQgPj4gOCkpOwotICByZXN1bHQuaW5zZXJ0KHJlc3VsdC5lbmQoKSwgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlQWNsUGFja2V0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYiwgdWludDhfdCBiYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSkgewotICAvLyBEYXRhIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhhbmRsZSAmIDB4MEYpKTsKLSAgdWludDhfdCBzZWNvbmRfYnl0ZSA9IDA7Ci0gIHNlY29uZF9ieXRlIHw9IChiYyA8PCA2KSAmIDBiMTEwMDAwMDA7Ci0gIHNlY29uZF9ieXRlIHw9IChwYiA8PCA0KSAmIDBiMDAxMTAwMDA7Ci0gIHNlY29uZF9ieXRlIHw9IChoYW5kbGUgPj4gOCkgJiAwYjAwMDAxMTExOwotICByZXN1bHQucHVzaF9iYWNrKHNlY29uZF9ieXRlKTsKLSAgYXV0byBkYXRhX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZGF0YS5zaXplKCkpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGFfc2l6ZSkpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGFfc2l6ZSA+PiA4KSk7Ci0gIHJlc3VsdC5pbnNlcnQocmVzdWx0LmVuZCgpLCBkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1CVF9IRFIqIEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoY29uc3QgdWludDhfdCogYWNsX3BhY2tldF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX2xlbmd0aCkgewotICBzaXplX3QgcGFja2V0X3NpemUgPSBidWZmZXJfbGVuZ3RoICsgQlRfSERSX1NJWkU7Ci0gIGF1dG8gcGFja2V0ID0gcmVpbnRlcnByZXRfY2FzdDxCVF9IRFIqPihvc2lfbWFsbG9jKHBhY2tldF9zaXplKSk7Ci0gIC8vIEFkZCBBQ0wgcGFja2V0IG92ZXJoZWFkICsgTDJDQVAgcGFja2V0IG92ZXJoZWFkCi0gIHBhY2tldC0+b2Zmc2V0ID0gNCArIEwyQ0FQX1BLVF9PVkVSSEVBRDsKLSAgcGFja2V0LT5sZW4gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYnVmZmVyX2xlbmd0aCAtIDQgLSBMMkNBUF9QS1RfT1ZFUkhFQUQpOwotICBwYWNrZXQtPmxheWVyX3NwZWNpZmljID0gMDsKLSAgcGFja2V0LT5ldmVudCA9IE1TR19IQ19UT19TVEFDS19IQ0lfQUNMOwotICBtZW1jcHkocGFja2V0LT5kYXRhLCBhY2xfcGFja2V0X2J5dGVzLCBidWZmZXJfbGVuZ3RoKTsKLSAgcmV0dXJuIHBhY2tldDsKLX0KLQotQlRfSERSKiBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBidWZmZXIpIHsKLSAgcmV0dXJuIEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci19Ci0KLUJUX0hEUiogQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldChjb25zdCB1aW50OF90KiBhY2xfcGFja2V0X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfbGVuZ3RoKSB7Ci0gIHNpemVfdCBhY2xfbDJjYXBfaGVhZGVyX3NpemUgPSA0ICsgTDJDQVBfUEtUX09WRVJIRUFEOwotICBDSEVDS19HRShMMkNBUF9NSU5fT0ZGU0VULCBzdGF0aWNfY2FzdDxpbnQ+KGFjbF9sMmNhcF9oZWFkZXJfc2l6ZSkpOwotICBzaXplX3QgcGFja2V0X3NpemUgPQotICAgICAgQlRfSERSX1NJWkUgKyBMMkNBUF9NSU5fT0ZGU0VUICsgYnVmZmVyX2xlbmd0aCAtIGFjbF9sMmNhcF9oZWFkZXJfc2l6ZTsKLSAgYXV0byBwYWNrZXQgPSByZWludGVycHJldF9jYXN0PEJUX0hEUio+KG9zaV9tYWxsb2MocGFja2V0X3NpemUpKTsKLSAgcGFja2V0LT5vZmZzZXQgPSBMMkNBUF9NSU5fT0ZGU0VUOwotICBwYWNrZXQtPmxlbiA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihidWZmZXJfbGVuZ3RoIC0gYWNsX2wyY2FwX2hlYWRlcl9zaXplKTsKLSAgcGFja2V0LT5sYXllcl9zcGVjaWZpYyA9IDA7Ci0gIHBhY2tldC0+ZXZlbnQgPSAwOwotICBtZW1jcHkocGFja2V0LT5kYXRhICsgcGFja2V0LT5vZmZzZXQgLSBhY2xfbDJjYXBfaGVhZGVyX3NpemUsCi0gICAgICAgICBhY2xfcGFja2V0X2J5dGVzLCBidWZmZXJfbGVuZ3RoKTsKLSAgcmV0dXJuIHBhY2tldDsKLX0KLQotQlRfSERSKiBBbGxvY2F0ZVdyYXBwZWRPdXRnb2luZ0wyY2FwQWNsUGFja2V0KAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBidWZmZXIpIHsKLSAgcmV0dXJuIEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY29tbW9uL3N0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmggYi9zdGFjay90ZXN0L2NvbW1vbi9zdGFja190ZXN0X3BhY2tldF91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I4OGEyLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvY29tbW9uL3N0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLS8qKgotICogQ3JlYXRlIEwyQ0FQIGRhdGEgcGFja2V0Ci0gKgotICogQHBhcmFtIGxjaWQKLSAqIEBwYXJhbSBkYXRhCi0gKiBAcmV0dXJuIHZlY3RvciBvZiBieXRlcwotICovCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVMMmNhcERhdGFQYWNrZXQodWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSk7Ci0KLS8qKgotICogQ3JlYXRlIEFDTCBkYXRhIHBhY2tldAotICoKLSAqIEBwYXJhbSBoYW5kbGUgQUNMIGNvbm5lY3Rpb24gaGFubGUKLSAqIEBwYXJhbSBwYiBwYiBieXRlCi0gKiBAcGFyYW0gYmMgYmMgYnl0ZQotICogQHBhcmFtIGRhdGEgZnJhbWUgZGF0YQotICogQHJldHVybiB2ZWN0b3Igb2YgYnl0ZXMKLSAqLwotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlQWNsUGFja2V0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYiwgdWludDhfdCBiYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSk7Ci0KLS8qKgotICogR2l2ZW4gYW4gYXJyYXkgb2YgQUNMIHBhY2tldCBieXRlcyBmcm9tIEJUU05PT1AgbG9nLCBhbGxvY2F0ZSBhbiBPU0kKLSAqIGFsbG9jYXRlZCBCVF9IRFIgcG9pbnRlciB0byBhIHBhY2tldCB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgYnkgTDJDQVAKLSAqIGFwcGxpY2F0aW9uIGxheWVyCi0gKgotICogTm90ZTogQlRfSERSIG9mZnNldCBpcyBjb25maWd1cmVkIGZvciBpbmNvbWluZyBwYWNrZXRzCi0gKgotICogQHBhcmFtIGFjbF9wYWNrZXRfYnl0ZXMgcG9pbnRlciB0byBhcnJheSBvZiBBQ0wgcGFja2V0IGJ5dGVzCi0gKiBAcGFyYW0gYnVmZmVyX2xlbmd0aCBsZW5ndGggb2YgdGhlIHBhY2tldCBidWZmZXIKLSAqIEByZXR1cm4gQlRfSERSIHBvaW50ZXIgdG8gYW4gT1NJIGhlYXAgYWxsb2NhdGVkIHBhY2tldAotICovCi1CVF9IRFIqIEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoY29uc3QgdWludDhfdCogYWNsX3BhY2tldF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX2xlbmd0aCk7Ci1CVF9IRFIqIEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGJ1ZmZlcik7Ci0KLS8qKgotICogR2l2ZW4gYW4gYXJyYXkgb2YgQUNMIHBhY2tldCBieXRlcyBmcm9tIEJUU05PT1AgbG9nLCBhbGxvY2F0ZSBhbiBPU0kKLSAqIGFsbG9jYXRlZCBCVF9IRFIgcG9pbnRlciB0byBhIHBhY2tldCB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgYnkgTDJDQVAKLSAqIGFwcGxpY2F0aW9uIGxheWVyCi0gKgotICogTm90ZTogQlRfSERSIG9mZnNldCBpcyBjb25maWd1cmVkIGZvciBvdXRnb2luZyBwYWNrZXRzCi0gKgotICogQHBhcmFtIGFjbF9wYWNrZXRfYnl0ZXMgcG9pbnRlciB0byBhcnJheSBvZiBBQ0wgcGFja2V0IGJ5dGVzCi0gKiBAcGFyYW0gYnVmZmVyX2xlbmd0aCBsZW5ndGggb2YgdGhlIHBhY2tldCBidWZmZXIKLSAqIEByZXR1cm4gQlRfSERSIHBvaW50ZXIgdG8gYW4gT1NJIGhlYXAgYWxsb2NhdGVkIHBhY2tldAotICovCi1CVF9IRFIqIEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoY29uc3QgdWludDhfdCogYWNsX3BhY2tldF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX2xlbmd0aCk7Ci1CVF9IRFIqIEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGJ1ZmZlcik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvY3J5cHRvX3Rvb2xib3hfdGVzdC5jYyBiL3N0YWNrL3Rlc3QvY3J5cHRvX3Rvb2xib3hfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxMmE3Ni4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2NyeXB0b190b29sYm94X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN0YWNrL2NyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YWNrL2NyeXB0b190b29sYm94L2Flcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0KLXVzaW5nIDo6dGVzdGluZzo6RWxlbWVudHNBcmVBcnJheTsKLQotbmFtZXNwYWNlIGNyeXB0b190b29sYm94IHsKLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMQotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY190ZXN0X2RfMV90ZXN0KSB7Ci0gIHVpbnQ4X3Qga1tdID0gezB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCi0gICAgICAgICAgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2N9OwotCi0gIHVpbnQ4X3QgbVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0gIHVpbnQ4X3QgYWVzX2NtYWNfa19tW10gPSB7MHg3ZCwgMHhmNywgMHg2YiwgMHgwYywgMHgxYSwgMHhiOCwgMHg5OSwgMHhiMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlLCAweDQyLCAweGYwLCAweDQ3LCAweGI5LCAweDFiLCAweDU0LCAweDZmfTsKLQotICB1aW50OF90IG91dHB1dFsxNl07Ci0gIGFlc19jb250ZXh0IGN0eDsKLSAgYWVzX3NldF9rZXkoaywgc2l6ZW9mKGspLCAmY3R4KTsKLSAgYWVzX2VuY3J5cHQobSwgb3V0cHV0LCAmY3R4KTsgLyogb3V0cHV0cyBpbiBieXRlIDQ4IHRvIGJ5dGUgNjMgKi8KLQotICBFWFBFQ1RfVEhBVChvdXRwdXQsIEVsZW1lbnRzQXJlQXJyYXkoYWVzX2NtYWNfa19tLCBPQ1RFVDE2X0xFTikpOwotCi0gIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gIC8vIExPRyhJTkZPKSA8PCAiayAiIDw8IGJhc2U6OkhleEVuY29kZShrLCBPQ1RFVDE2X0xFTik7Ci0gIC8vIExPRyhJTkZPKSA8PCAibSAiIDw8IGJhc2U6OkhleEVuY29kZShtLCBzaXplb2YobSkpOwotICAvLyBMT0coSU5GTykgPDwgIm91dHB1dCAiIDw8IGJhc2U6OkhleEVuY29kZShvdXRwdXQsIE9DVEVUMTZfTEVOKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMS4xCi1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8xXzFfdGVzdCkgewotICBPY3RldDE2IGt7MHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKLSAgICAgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2N9OwotCi0gIE9jdGV0MTYgYWVzX2NtYWNfa19tezB4YmIsIDB4MWQsIDB4NjksIDB4MjksIDB4ZTksIDB4NTksIDB4MzcsIDB4MjgsCi0gICAgICAgICAgICAgICAgICAgICAgIDB4N2YsIDB4YTMsIDB4N2QsIDB4MTIsIDB4OWIsIDB4NzUsIDB4NjcsIDB4NDZ9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGspLCBzdGQ6OmVuZChrKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGFlc19jbWFjX2tfbSksIHN0ZDo6ZW5kKGFlc19jbWFjX2tfbSkpOwotCi0gIE9jdGV0MTYgb3V0cHV0ID0gYWVzX2NtYWMoaywgbnVsbHB0ciAvKiBlbXB0eSBtZXNzYWdlICovLCAwKTsKLQotICBFWFBFQ1RfRVEob3V0cHV0LCBhZXNfY21hY19rX20pOwotCi0gIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gIC8vIExPRyhJTkZPKSA8PCAiayAiIDw8IGJhc2U6OkhleEVuY29kZShrLmRhdGEoKSwgay5zaXplKCkpOwotICAvLyBMT0coSU5GTykgPDwgImFlc19jbWFjKGssbnVsbHB0cikgIgotICAvLyAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKG91dHB1dC5kYXRhKCksIG91dHB1dC5zaXplKCkpOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC4xLjIKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzFfMl90ZXN0KSB7Ci0gIE9jdGV0MTYga3sweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAotICAgICAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzY307Ci0KLSAgT2N0ZXQxNiBtID0gezB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCi0gICAgICAgICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhfTsKLQotICBPY3RldDE2IGFlc19jbWFjX2tfbXsweDA3LCAweDBhLCAweDE2LCAweGI0LCAweDZiLCAweDRkLCAweDQxLCAweDQ0LAotICAgICAgICAgICAgICAgICAgICAgICAweGY3LCAweDliLCAweGRkLCAweDlkLCAweGQwLCAweDRhLCAweDI4LCAweDdjfTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihrKSwgc3RkOjplbmQoaykpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihtKSwgc3RkOjplbmQobSkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihhZXNfY21hY19rX20pLCBzdGQ6OmVuZChhZXNfY21hY19rX20pKTsKLQotICBPY3RldDE2IG91dHB1dCA9IGFlc19jbWFjKGssIG0pOwotCi0gIEVYUEVDVF9FUShvdXRwdXQsIGFlc19jbWFjX2tfbSk7Ci0KLSAgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSAgLy8gTE9HKElORk8pIDw8ICJrICIgPDwgYmFzZTo6SGV4RW5jb2RlKGsuZGF0YSgpLCBrLnNpemUoKSk7Ci0gIC8vIExPRyhJTkZPKSA8PCAibSAiIDw8IGJhc2U6OkhleEVuY29kZShtLCBzaXplb2YobSkpOwotICAvLyBMT0coSU5GTykgPDwgImFlc19jbWFjKGssbSkgIgotICAvLyAgICAgICAgICAgPDwgYmFzZTo6SGV4RW5jb2RlKG91dHB1dC5kYXRhKCksIG91dHB1dC5zaXplKCkpOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC4xLjMKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzFfM190ZXN0KSB7Ci0gIE9jdGV0MTYga3sweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAotICAgICAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzY307Ci0KLSAgdWludDhfdCBtW10gPSB7MHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwgMHhlOSwgMHgzZCwKLSAgICAgICAgICAgICAgICAgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywKLSAgICAgICAgICAgICAgICAgMHgxZSwgMHgwMywgMHhhYywgMHg5YywgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwKLSAgICAgICAgICAgICAgICAgMHg4ZSwgMHg1MSwgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMX07Ci0KLSAgT2N0ZXQxNiBhZXNfY21hY19rX217MHhkZiwgMHhhNiwgMHg2NywgMHg0NywgMHhkZSwgMHg5YSwgMHhlNiwgMHgzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgMHgzMCwgMHhjYSwgMHgzMiwgMHg2MSwgMHgxNCwgMHg5NywgMHhjOCwgMHgyN307Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oayksIHN0ZDo6ZW5kKGspKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4obSksIHN0ZDo6ZW5kKG0pKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oYWVzX2NtYWNfa19tKSwgc3RkOjplbmQoYWVzX2NtYWNfa19tKSk7Ci0KLSAgT2N0ZXQxNiBvdXRwdXQgPSBhZXNfY21hYyhrLCBtLCBzaXplb2YobSkpOwotICBFWFBFQ1RfRVEob3V0cHV0LCBhZXNfY21hY19rX20pOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC4xLjQKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzFfNF90ZXN0KSB7Ci0gIE9jdGV0MTYga3sweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAotICAgICAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzY307Ci0KLSAgdWludDhfdCBtW10gPSB7MHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwgMHhlOSwgMHgzZCwKLSAgICAgICAgICAgICAgICAgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywKLSAgICAgICAgICAgICAgICAgMHgxZSwgMHgwMywgMHhhYywgMHg5YywgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwKLSAgICAgICAgICAgICAgICAgMHg4ZSwgMHg1MSwgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKLSAgICAgICAgICAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwgMHhmNiwgMHg5ZiwKLSAgICAgICAgICAgICAgICAgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwKLSAgICAgICAgICAgICAgICAgMHhlNiwgMHg2YywgMHgzNywgMHgxMH07Ci0KLSAgT2N0ZXQxNiBhZXNfY21hY19rX217MHg1MSwgMHhmMCwgMHhiZSwgMHhiZiwgMHg3ZSwgMHgzYiwgMHg5ZCwgMHg5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgMHhmYywgMHg0OSwgMHg3NCwgMHgxNywgMHg3OSwgMHgzNiwgMHgzYywgMHhmZX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oayksIHN0ZDo6ZW5kKGspKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4obSksIHN0ZDo6ZW5kKG0pKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oYWVzX2NtYWNfa19tKSwgc3RkOjplbmQoYWVzX2NtYWNfa19tKSk7Ci0KLSAgT2N0ZXQxNiBvdXRwdXQgPSBhZXNfY21hYyhrLCBtLCBzaXplb2YobSkpOwotCi0gIEVYUEVDVF9FUShvdXRwdXQsIGFlc19jbWFjX2tfbSk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjIKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzJfdGVzdCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1ezB4MjAsIDB4YjAsIDB4MDMsIDB4ZDIsIDB4ZjIsIDB4OTcsIDB4YmUsIDB4MmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZSwgMHgyYywgMHg4MywgMHhhNywgMHhlOSwgMHhmOSwgMHhhNSwgMHhiOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweGVmLCAweGY0LCAweDkxLCAweDExLCAweGFjLCAweGY0LCAweGZkLCAweGRiLAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2MsIDB4MDMsIDB4MDEsIDB4NDgsIDB4MGUsIDB4MzUsIDB4OWQsIDB4ZTZ9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ezB4NTUsIDB4MTgsIDB4OGIsIDB4M2QsIDB4MzIsIDB4ZjYsIDB4YmIsIDB4OWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHg5MCwgMHgwYSwgMHhmYywgMHhmYiwgMHhlZSwgMHhkNCwgMHhlNywgMHgyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDU5LCAweGNiLCAweDlhLCAweGMyLCAweGYxLCAweDlkLCAweDdjLCAweGZiLAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmIsIDB4NGYsIDB4ZGQsIDB4NDksIDB4ZjQsIDB4N2YsIDB4YzUsIDB4ZmR9OwotICBPY3RldDE2IHh7MHhkNSwgMHhjYiwgMHg4NCwgMHg1NCwgMHhkMSwgMHg3NywgMHg3MywgMHgzZSwKLSAgICAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4YjIsIDB4ZWMsIDB4NzEsIDB4MmIsIDB4YWUsIDB4YWJ9OwotICB1aW50OF90IHogPSAweDAwOwotCi0gIE9jdGV0MTYgYWVzX2NtYWNfa19tezB4ZjIsIDB4YzksIDB4MTYsIDB4ZjEsIDB4MDcsIDB4YTksIDB4YmQsIDB4MWMsCi0gICAgICAgICAgICAgICAgICAgICAgIDB4ZjEsIDB4ZWQsIDB4YTEsIDB4YmUsIDB4YTksIDB4NzQsIDB4ODcsIDB4MmR9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKHUpLCBzdGQ6OmVuZCh1KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKHYpLCBzdGQ6OmVuZCh2KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKHgpLCBzdGQ6OmVuZCh4KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGFlc19jbWFjX2tfbSksIHN0ZDo6ZW5kKGFlc19jbWFjX2tfbSkpOwotCi0gIE9jdGV0MTYgb3V0cHV0ID0gZjQodS5kYXRhKCksIHYuZGF0YSgpLCB4LCB6KTsKLQotICBFWFBFQ1RfRVEob3V0cHV0LCBhZXNfY21hY19rX20pOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC4zCi1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8zX3Rlc3QpIHsKLSAgc3RkOjphcnJheTx1aW50OF90LCAzMj4gZGhrZXlfd3sKLSAgICAgIDB4ZWMsIDB4MDIsIDB4MzQsIDB4YTMsIDB4NTcsIDB4YzgsIDB4YWQsIDB4MDUsIDB4MzQsIDB4MTAsIDB4MTAsCi0gICAgICAweGE2LCAweDBhLCAweDM5LCAweDdkLCAweDliLCAweDk5LCAweDc5LCAweDZiLCAweDEzLCAweGI0LCAweGY4LAotICAgICAgMHg2NiwgMHhmMSwgMHg4NiwgMHg4ZCwgMHgzNCwgMHhmMywgMHg3MywgMHhiZiwgMHhhNiwgMHg5OH07Ci0gIE9jdGV0MTYgbjF7MHhkNSwgMHhjYiwgMHg4NCwgMHg1NCwgMHhkMSwgMHg3NywgMHg3MywgMHgzZSwKLSAgICAgICAgICAgICAweGZmLCAweGZmLCAweGIyLCAweGVjLCAweDcxLCAweDJiLCAweGFlLCAweGFifTsKLSAgT2N0ZXQxNiBuMnsweGE2LCAweGU4LCAweGU3LCAweGNjLCAweDI1LCAweGE3LCAweDVmLCAweDZlLAotICAgICAgICAgICAgIDB4MjEsIDB4NjUsIDB4ODMsIDB4ZjcsIDB4ZmYsIDB4M2QsIDB4YzQsIDB4Y2Z9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDc+IGExezB4MDAsIDB4NTYsIDB4MTIsIDB4MzcsIDB4MzcsIDB4YmYsIDB4Y2V9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDc+IGEyezB4MDAsIDB4YTcsIDB4MTMsIDB4NzAsIDB4MmQsIDB4Y2YsIDB4YzF9OwotCi0gIE9jdGV0MTYgZXhwZWN0ZWRfbHRrezB4NjksIDB4ODYsIDB4NzksIDB4MTEsIDB4NjksIDB4ZDcsIDB4Y2QsIDB4MjMsCi0gICAgICAgICAgICAgICAgICAgICAgIDB4OTgsIDB4MDUsIDB4MjIsIDB4YjUsIDB4OTQsIDB4NzUsIDB4MGEsIDB4Mzh9OwotICBPY3RldDE2IGV4cGVjdGVkX21hY19rZXl7MHgyOSwgMHg2NSwgMHhmMSwgMHg3NiwgMHhhMSwgMHgwOCwgMHg0YSwgMHgwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmQsIDB4M2YsIDB4NmEsIDB4MjAsIDB4Y2UsIDB4NjMsIDB4NmUsIDB4MjB9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGRoa2V5X3cpLCBzdGQ6OmVuZChkaGtleV93KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKG4xKSwgc3RkOjplbmQobjEpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4objIpLCBzdGQ6OmVuZChuMikpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihhMSksIHN0ZDo6ZW5kKGExKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGEyKSwgc3RkOjplbmQoYTIpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfbHRrKSwgc3RkOjplbmQoZXhwZWN0ZWRfbHRrKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX21hY19rZXkpLCBzdGQ6OmVuZChleHBlY3RlZF9tYWNfa2V5KSk7Ci0KLSAgT2N0ZXQxNiBtYWNfa2V5LCBsdGs7Ci0gIGY1KGRoa2V5X3cuZGF0YSgpLCBuMSwgbjIsIGExLmRhdGEoKSwgYTIuZGF0YSgpLCAmbWFjX2tleSwgJmx0ayk7Ci0KLSAgRVhQRUNUX0VRKG1hY19rZXksIGV4cGVjdGVkX21hY19rZXkpOwotICBFWFBFQ1RfRVEobHRrLCBleHBlY3RlZF9sdGspOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC40Ci1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF80X3Rlc3QpIHsKLSAgT2N0ZXQxNiBuMXsweGQ1LCAweGNiLCAweDg0LCAweDU0LCAweGQxLCAweDc3LCAweDczLCAweDNlLAotICAgICAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4YjIsIDB4ZWMsIDB4NzEsIDB4MmIsIDB4YWUsIDB4YWJ9OwotICBPY3RldDE2IG4yezB4YTYsIDB4ZTgsIDB4ZTcsIDB4Y2MsIDB4MjUsIDB4YTcsIDB4NWYsIDB4NmUsCi0gICAgICAgICAgICAgMHgyMSwgMHg2NSwgMHg4MywgMHhmNywgMHhmZiwgMHgzZCwgMHhjNCwgMHhjZn07Ci0gIE9jdGV0MTYgcnsweDEyLCAweGEzLCAweDM0LCAweDNiLCAweGI0LCAweDUzLCAweGJiLCAweDU0LAotICAgICAgICAgICAgMHgwOCwgMHhkYSwgMHg0MiwgMHhkMiwgMHgwYywgMHgyZCwgMHgwZiwgMHhjOH07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IElPY2FwezB4MDEsIDB4MDEsIDB4MDJ9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhMXsweDAwLCAweDU2LCAweDEyLCAweDM3LCAweDM3LCAweGJmLCAweGNlfTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYTJ7MHgwMCwgMHhhNywgMHgxMywgMHg3MCwgMHgyZCwgMHhjZiwgMHhjMX07Ci0KLSAgT2N0ZXQxNiBNYWNLZXl7MHgyOSwgMHg2NSwgMHhmMSwgMHg3NiwgMHhhMSwgMHgwOCwgMHg0YSwgMHgwMiwKLSAgICAgICAgICAgICAgICAgMHhmZCwgMHgzZiwgMHg2YSwgMHgyMCwgMHhjZSwgMHg2MywgMHg2ZSwgMHgyMH07Ci0KLSAgT2N0ZXQxNiBleHBlY3RlZF9hZXNfY21hY3sweGUzLCAweGM0LCAweDczLCAweDk4LCAweDljLCAweGQwLCAweGU4LCAweGM1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZDIsIDB4NmMsIDB4MGIsIDB4MDksIDB4ZGEsIDB4OTUsIDB4OGYsIDB4NjF9OwotCi0gIC8vIGFsZ29yaXRobSBleHBlY3QgYWxsIGlucHV0IHRvIGJlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbyByZXZlcnNlCi0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKG4xKSwgc3RkOjplbmQobjEpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4objIpLCBzdGQ6OmVuZChuMikpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihyKSwgc3RkOjplbmQocikpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihJT2NhcCksIHN0ZDo6ZW5kKElPY2FwKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGExKSwgc3RkOjplbmQoYTEpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oYTIpLCBzdGQ6OmVuZChhMikpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihNYWNLZXkpLCBzdGQ6OmVuZChNYWNLZXkpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfYWVzX2NtYWMpLCBzdGQ6OmVuZChleHBlY3RlZF9hZXNfY21hYykpOwotCi0gIE9jdGV0MTYgYWVzX2NtYWMgPSBmNihNYWNLZXksIG4xLCBuMiwgciwgSU9jYXAuZGF0YSgpLCBhMS5kYXRhKCksIGEyLmRhdGEoKSk7Ci0KLSAgRVhQRUNUX0VRKGFlc19jbWFjLCBleHBlY3RlZF9hZXNfY21hYyk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjUKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzVfdGVzdCkgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiB1ezB4MjAsIDB4YjAsIDB4MDMsIDB4ZDIsIDB4ZjIsIDB4OTcsIDB4YmUsIDB4MmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZSwgMHgyYywgMHg4MywgMHhhNywgMHhlOSwgMHhmOSwgMHhhNSwgMHhiOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGVmLCAweGY0LCAweDkxLCAweDExLCAweGFjLCAweGY0LCAweGZkLCAweGRiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2MsIDB4MDMsIDB4MDEsIDB4NDgsIDB4MGUsIDB4MzUsIDB4OWQsIDB4ZTZ9OwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDMyPiB2ezB4NTUsIDB4MTgsIDB4OGIsIDB4M2QsIDB4MzIsIDB4ZjYsIDB4YmIsIDB4OWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MCwgMHgwYSwgMHhmYywgMHhmYiwgMHhlZSwgMHhkNCwgMHhlNywgMHgyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU5LCAweGNiLCAweDlhLCAweGMyLCAweGYxLCAweDlkLCAweDdjLCAweGZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmIsIDB4NGYsIDB4ZGQsIDB4NDksIDB4ZjQsIDB4N2YsIDB4YzUsIDB4ZmR9OwotCi0gIE9jdGV0MTYgeHsweGQ1LCAweGNiLCAweDg0LCAweDU0LCAweGQxLCAweDc3LCAweDczLCAweDNlLAotICAgICAgICAgICAgMHhmZiwgMHhmZiwgMHhiMiwgMHhlYywgMHg3MSwgMHgyYiwgMHhhZSwgMHhhYn07Ci0gIE9jdGV0MTYgeXsweGE2LCAweGU4LCAweGU3LCAweGNjLCAweDI1LCAweGE3LCAweDVmLCAweDZlLAotICAgICAgICAgICAgMHgyMSwgMHg2NSwgMHg4MywgMHhmNywgMHhmZiwgMHgzZCwgMHhjNCwgMHhjZn07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4odSksIHN0ZDo6ZW5kKHUpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4odiksIHN0ZDo6ZW5kKHYpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oeCksIHN0ZDo6ZW5kKHgpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oeSksIHN0ZDo6ZW5kKHkpKTsKLQotICB1aW50MzJfdCB2YWwgPSBnMih1LmRhdGEoKSwgdi5kYXRhKCksIHgsIHkpOwotCi0gIC8qIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHJlYWR5IG1vZCAxMDAwMDAwLCBzbyBkbyBtb2Qgb24gdGhlIHRlc3QgcmVzdWx0Ci0gICAqIHZhbHVlIHRvbyAqLwotICBFWFBFQ1RfRVEodmFsLCAweDJmOWVkNWJhVSAlIDEwMDAwMDApOwotfQotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC42Ci1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF82X3Rlc3QpIHsKLSAgT2N0ZXQxNiBrZXl7MHhlYywgMHgwMiwgMHgzNCwgMHhhMywgMHg1NywgMHhjOCwgMHhhZCwgMHgwNSwKLSAgICAgICAgICAgICAgMHgzNCwgMHgxMCwgMHgxMCwgMHhhNiwgMHgwYSwgMHgzOSwgMHg3ZCwgMHg5Yn07Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgND4ga2V5SUR7MHg2YywgMHg2NSwgMHg2MiwgMHg3Mn07Ci0gIE9jdGV0MTYgZXhwZWN0ZWRfYWVzX2NtYWN7MHgyZCwgMHg5YSwgMHhlMSwgMHgwMiwgMHhlNywgMHg2ZCwgMHhjOSwgMHgxYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGU4LCAweGQzLCAweGE5LCAweGUyLCAweDgwLCAweGIxLCAweDYzLCAweDk5fTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihrZXkpLCBzdGQ6OmVuZChrZXkpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oa2V5SUQpLCBzdGQ6OmVuZChrZXlJRCkpOwotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihleHBlY3RlZF9hZXNfY21hYyksIHN0ZDo6ZW5kKGV4cGVjdGVkX2Flc19jbWFjKSk7Ci0KLSAgT2N0ZXQxNiBhZXNfY21hYyA9IGg2KGtleSwga2V5SUQpOwotICBFWFBFQ1RfRVEoYWVzX2NtYWMsIGV4cGVjdGVkX2Flc19jbWFjKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuNwotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY19leGFtcGxlX2RfN190ZXN0KSB7Ci0gIE9jdGV0MTYgSVJLezB4ZWMsIDB4MDIsIDB4MzQsIDB4YTMsIDB4NTcsIDB4YzgsIDB4YWQsIDB4MDUsCi0gICAgICAgICAgICAgIDB4MzQsIDB4MTAsIDB4MTAsIDB4YTYsIDB4MGEsIDB4MzksIDB4N2QsIDB4OWJ9OwotICBPY3RldDE2IHByYW5kezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg4MSwgMHg5NH07Ci0gIE9jdGV0MTYgZXhwZWN0ZWRfYWVzXzEyOHsweDE1LCAweDlkLCAweDVmLCAweGI3LCAweDJlLCAweGJlLCAweDIzLCAweDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCwgMHg4YywgMHgxYiwgMHhkYywgMHhjNCwgMHgwZCwgMHhmYiwgMHhhYX07Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMz4gZXhwZWN0ZWRfYWh7MHgwZCwgMHhmYiwgMHhhYX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oSVJLKSwgc3RkOjplbmQoSVJLKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKHByYW5kKSwgc3RkOjplbmQocHJhbmQpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfYWVzXzEyOCksIHN0ZDo6ZW5kKGV4cGVjdGVkX2Flc18xMjgpKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfYWgpLCBzdGQ6OmVuZChleHBlY3RlZF9haCkpOwotCi0gIE9jdGV0MTYgcmVzdWx0ID0gYWVzXzEyOChJUkssIHByYW5kLmRhdGEoKSwgMyk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9hZXNfMTI4LCByZXN1bHQpOwotCi0gIC8vIGxpdHRsZS9iaWcgZW5kaWFuIDI0IGJpdHMKLSAgRVhQRUNUX0VRKHJlc3VsdFswXSwgZXhwZWN0ZWRfYWhbMF0pOwotICBFWFBFQ1RfRVEocmVzdWx0WzFdLCBleHBlY3RlZF9haFsxXSk7Ci0gIEVYUEVDVF9FUShyZXN1bHRbMl0sIGV4cGVjdGVkX2FoWzJdKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuOAotVEVTVChDcnlwdG9Ub29sYm94VGVzdCwgYnRfc3BlY19leGFtcGxlX2RfOF90ZXN0KSB7Ci0gIE9jdGV0MTYgS2V5ezB4ZWMsIDB4MDIsIDB4MzQsIDB4YTMsIDB4NTcsIDB4YzgsIDB4YWQsIDB4MDUsCi0gICAgICAgICAgICAgIDB4MzQsIDB4MTAsIDB4MTAsIDB4YTYsIDB4MGEsIDB4MzksIDB4N2QsIDB4OWJ9OwotICBPY3RldDE2IFNBTFR7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4NkQsIDB4NzAsIDB4MzF9OwotICBPY3RldDE2IGV4cGVjdGVkX2Flc19jbWFjezB4ZmIsIDB4MTcsIDB4MzUsIDB4OTcsIDB4YzYsIDB4YTMsIDB4YzAsIDB4ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhkMiwgMHg5OSwgMHg4YywgMHgyYSwgMHg3NSwgMHhhNSwgMHg3MCwgMHgxMX07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oS2V5KSwgc3RkOjplbmQoS2V5KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKFNBTFQpLCBzdGQ6OmVuZChTQUxUKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2Flc19jbWFjKSwgc3RkOjplbmQoZXhwZWN0ZWRfYWVzX2NtYWMpKTsKLQotICBPY3RldDE2IGFlc19jbWFjID0gaDcoU0FMVCwgS2V5KTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2Flc19jbWFjLCBhZXNfY21hYyk7Ci19Ci0KLWV4dGVybiBPY3RldDE2IHNtcF9jYWxjdWxhdGVfbHRrX3RvX2xpbmtfa2V5KGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcpOwotCi0vLyBCVCBTcGVjIDUuMCB8IFZvbCAzLCBQYXJ0IEggRC45Ci1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF85X3Rlc3QpIHsKLSAgT2N0ZXQxNiBMVEt7MHgzNiwgMHg4ZCwgMHhmOSwgMHhiYywgMHhlMywgMHgyNiwgMHg0YiwgMHg1OCwKLSAgICAgICAgICAgICAgMHhiZCwgMHgwNiwgMHg2YywgMHgzMywgMHgzMywgMHg0ZiwgMHhiZiwgMHg2NH07Ci0gIE9jdGV0MTYgZXhwZWN0ZWRfbGlua19rZXl7MHgyOCwgMHg3YSwgMHhkMywgMHg3OSwgMHhkYywgMHhhNCwgMHgwMiwgMHg1MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhLCAweDM5LCAweGYxLCAweGY0LCAweDMwLCAweDQ3LCAweGI4LCAweDM1fTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihMVEspLCBzdGQ6OmVuZChMVEspKTsKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oZXhwZWN0ZWRfbGlua19rZXkpLCBzdGQ6OmVuZChleHBlY3RlZF9saW5rX2tleSkpOwotCi0gIE9jdGV0MTYgbGlua19rZXkgPSBsdGtfdG9fbGlua19rZXkoTFRLLCB0cnVlKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2xpbmtfa2V5LCBsaW5rX2tleSk7Ci19Ci0KLS8vIEJUIFNwZWMgNS4wIHwgVm9sIDMsIFBhcnQgSCBELjEwCi1URVNUKENyeXB0b1Rvb2xib3hUZXN0LCBidF9zcGVjX2V4YW1wbGVfZF8xMF90ZXN0KSB7Ci0gIE9jdGV0MTYgTFRLezB4MzYsIDB4OGQsIDB4ZjksIDB4YmMsIDB4ZTMsIDB4MjYsIDB4NGIsIDB4NTgsCi0gICAgICAgICAgICAgIDB4YmQsIDB4MDYsIDB4NmMsIDB4MzMsIDB4MzMsIDB4NGYsIDB4YmYsIDB4NjR9OwotICBPY3RldDE2IGV4cGVjdGVkX2xpbmtfa2V5ezB4YmMsIDB4MWMsIDB4YTQsIDB4ZWYsIDB4NjMsIDB4M2YsIDB4YzEsIDB4YmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZCwgMHg4MiwgMHgzMCwgMHhhZiwgMHhlZSwgMHgzOCwgMHg4ZiwgMHhiMH07Ci0KLSAgLy8gYWxnb3JpdGhtIGV4cGVjdCBhbGwgaW5wdXQgdG8gYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvIHJldmVyc2UKLSAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4oTFRLKSwgc3RkOjplbmQoTFRLKSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2xpbmtfa2V5KSwgc3RkOjplbmQoZXhwZWN0ZWRfbGlua19rZXkpKTsKLQotICBPY3RldDE2IGxpbmtfa2V5ID0gbHRrX3RvX2xpbmtfa2V5KExUSywgZmFsc2UpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWRfbGlua19rZXksIGxpbmtfa2V5KTsKLX0KLQotLy8gLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMTEKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzExX3Rlc3QpIHsKLSAgT2N0ZXQxNiBsaW5rX2tleXsweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAxLCAweDAwLCAweDA5LCAweDA4LAotICAgICAgICAgICAgICAgICAgIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDB9OwotICBPY3RldDE2IGV4cGVjdGVkX2x0a3sweGU4LCAweDVlLCAweDA5LCAweGViLCAweDVlLCAweGNjLCAweGIzLCAweGUyLAotICAgICAgICAgICAgICAgICAgICAgICAweDY5LCAweDQxLCAweDhhLCAweDEzLCAweDMyLCAweDExLCAweGJjLCAweDc5fTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihsaW5rX2tleSksIHN0ZDo6ZW5kKGxpbmtfa2V5KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2x0ayksIHN0ZDo6ZW5kKGV4cGVjdGVkX2x0aykpOwotCi0gIE9jdGV0MTYgbHRrID0gbGlua19rZXlfdG9fbHRrKGxpbmtfa2V5LCB0cnVlKTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX2x0aywgbHRrKTsKLX0KLQotLy8gQlQgU3BlYyA1LjAgfCBWb2wgMywgUGFydCBIIEQuMTIKLVRFU1QoQ3J5cHRvVG9vbGJveFRlc3QsIGJ0X3NwZWNfZXhhbXBsZV9kXzEyX3Rlc3QpIHsKLSAgT2N0ZXQxNiBsaW5rX2tleXsweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAxLCAweDAwLCAweDA5LCAweDA4LAotICAgICAgICAgICAgICAgICAgIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDB9OwotICBPY3RldDE2IGV4cGVjdGVkX2x0a3sweGE4LCAweDEzLCAweGZiLCAweDcyLCAweGYxLCAweGEzLCAweGRmLCAweGExLAotICAgICAgICAgICAgICAgICAgICAgICAweDhhLCAweDJjLCAweDlhLCAweDQzLCAweGYxLCAweDBkLCAweDBhLCAweDMwfTsKLQotICAvLyBhbGdvcml0aG0gZXhwZWN0IGFsbCBpbnB1dCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgc28gcmV2ZXJzZQotICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihsaW5rX2tleSksIHN0ZDo6ZW5kKGxpbmtfa2V5KSk7Ci0gIHN0ZDo6cmV2ZXJzZShzdGQ6OmJlZ2luKGV4cGVjdGVkX2x0ayksIHN0ZDo6ZW5kKGV4cGVjdGVkX2x0aykpOwotCi0gIE9jdGV0MTYgbHRrID0gbGlua19rZXlfdG9fbHRrKGxpbmtfa2V5LCBmYWxzZSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF9sdGssIGx0ayk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcnlwdG9fdG9vbGJveApkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9lYXR0L2VhdHRfdGVzdC5jYyBiL3N0YWNrL3Rlc3QvZWF0dC9lYXR0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZGNhMzYuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9lYXR0L2VhdHRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgSElNU0EgSUkgSy9TIC0gd3d3LmhpbXNhLmRrLgotICogUmVwcmVzZW50ZWQgYnkgRUhJTUEgLSB3d3cuZWhpbWEuY29tCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm1vY2tfYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAibW9ja19idG1fYXBpX2xheWVyLmgiCi0jaW5jbHVkZSAibW9ja19jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibW9ja19lYXR0LmgiCi0jaW5jbHVkZSAibW9ja19nYXR0X2xheWVyLmgiCi0jaW5jbHVkZSAibW9ja19sMmNhcF9sYXllci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6TW9ja0Z1bmN0aW9uOwotdXNpbmcgdGVzdGluZzo6TmljZU1vY2s7Ci11c2luZyB0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuOwotdXNpbmcgdGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmdQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6U3RyaWN0TW9jazsKLQotdXNpbmcgYmx1ZXRvb3RoOjplYXR0OjpFYXR0Q2hhbm5lbDsKLXVzaW5nIGJsdWV0b290aDo6ZWF0dDo6RWF0dENoYW5uZWxTdGF0ZTsKLQotI2RlZmluZSBCTEVfR0FUVF9TVlJfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLIDB4MDEKLQotLyogTmVlZGVkIGZvciB0ZXN0aW5nIGNvbnRleHQgKi8KLXN0YXRpYyB0R0FUVF9UQ0IgdGVzdF90Y2I7Ci12b2lkIGJ0aWZfc3RvcmFnZV9hZGRfZWF0dF9zdXBwb3J0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgeyByZXR1cm47IH0KLXZvaWQgZ2F0dF9kYXRhX3Byb2Nlc3ModEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2J1ZikgeyByZXR1cm47IH0KLXRHQVRUX1RDQiogZ2F0dF9maW5kX3RjYl9ieV9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXzsKLSAgcmV0dXJuICZ0ZXN0X3RjYjsKLX0KLQotbmFtZXNwYWNlIHsKLWNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzKHsweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExfSk7Ci0KLWNsYXNzIEVhdHRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBDb25uZWN0RGV2aWNlRWF0dFN1cHBvcnRlZChpbnQgbnVtX29mX2FjY2VwdGVkX2Nvbm5lY3Rpb25zKSB7Ci0gICAgT05fQ0FMTChnYXR0X2ludGVyZmFjZV8sIENsaWVudFJlYWRTdXBwb3J0ZWRGZWF0dXJlcykKLSAgICAgICAgLldpbGxCeURlZmF1bHQoCi0gICAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYsIHVpbnQ4X3QpPiBjYikgewotICAgICAgICAgICAgICBzdGQ6Om1vdmUoY2IpLlJ1bihhZGRyLCBCTEVfR0FUVF9TVlJfU1VQX0ZFQVRfRUFUVF9CSVRNQVNLKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9KTsKLSAgICBPTl9DQUxMKGdhdHRfaW50ZXJmYWNlXywgR2V0RWF0dFN1cHBvcnQpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsgcmV0dXJuIHRydWU7IH0pOwotCi0gICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHRlc3RfbG9jYWxfY2lkc3s2MSwgNjIsIDYzLCA2NCwgNjV9OwotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgICAgQ29ubmVjdENyZWRpdEJhc2VkUmVxKEJUX1BTTV9FQVRULCB0ZXN0X2FkZHJlc3MsIF8pKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRlc3RfbG9jYWxfY2lkcykpOwotCi0gICAgZWF0dF9pbnN0YW5jZV8tPkNvbm5lY3QodGVzdF9hZGRyZXNzKTsKLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKHVpbnQxNl90IGNpZCA6IHRlc3RfbG9jYWxfY2lkcykgewotICAgICAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgICAgIGVhdHRfaW5zdGFuY2VfLT5GaW5kRWF0dENoYW5uZWxCeUNpZCh0ZXN0X2FkZHJlc3MsIGNpZCk7Ci0gICAgICBBU1NFUlRfVFJVRShjaGFubmVsICE9IG51bGxwdHIpOwotICAgICAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+c3RhdGVfID09IEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9QRU5ESU5HKTsKLQotICAgICAgaWYgKGkgPCBudW1fb2ZfYWNjZXB0ZWRfY29ubmVjdGlvbnMpIHsKLSAgICAgICAgbDJjYXBfYXBwX2luZm9fLnBMMkNBX0NyZWRpdEJhc2VkQ29ubmVjdENmbV9DYigKLSAgICAgICAgICAgIHRlc3RfYWRkcmVzcywgY2lkLCBFQVRUX01JTl9NVFVfTVBTLCBMMkNBUF9DT05OX09LKTsKLSAgICAgICAgY29ubmVjdGVkX2NpZHNfLnB1c2hfYmFjayhjaWQpOwotCi0gICAgICAgIEFTU0VSVF9UUlVFKGNoYW5uZWwtPnN0YXRlXyA9PSBFYXR0Q2hhbm5lbFN0YXRlOjpFQVRUX0NIQU5ORUxfT1BFTkVEKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGwyY2FwX2FwcF9pbmZvXy5wTDJDQV9FcnJvcl9DYihjaWQsIEwyQ0FQX0NPTk5fTk9fUkVTT1VSQ0VTKTsKLQotICAgICAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgICAgICBlYXR0X2luc3RhbmNlXy0+RmluZEVhdHRDaGFubmVsQnlDaWQodGVzdF9hZGRyZXNzLCBjaWQpOwotICAgICAgICBBU1NFUlRfVFJVRShjaGFubmVsID09IG51bGxwdHIpOwotICAgICAgfQotICAgICAgaSsrOwotICAgIH0KLQotICAgIEFTU0VSVF9UUlVFKHRlc3RfdGNiLmVhdHQgPT0gbnVtX29mX2FjY2VwdGVkX2Nvbm5lY3Rpb25zKTsKLSAgfQotCi0gIHZvaWQgRGlzY29ubmVjdEVhdHRCeVBlZXIodm9pZCkgewotICAgIGZvciAodWludDE2X3QgY2lkIDogY29ubmVjdGVkX2NpZHNfKQotICAgICAgbDJjYXBfYXBwX2luZm9fLnBMMkNBX0Rpc2Nvbm5lY3RJbmRfQ2IoY2lkLCB0cnVlKTsKLSAgICBBU1NFUlRfVFJVRSh0ZXN0X3RjYi5lYXR0ID09IDApOwotICB9Ci0KLSAgdm9pZCBEaXNjb25uZWN0RWF0dERldmljZShzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY2lkcykgewotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIERpc2Nvbm5lY3RSZXF1ZXN0KF8pKS5UaW1lcyhjaWRzLnNpemUoKSk7Ci0gICAgZWF0dF9pbnN0YW5jZV8tPkRpc2Nvbm5lY3QodGVzdF9hZGRyZXNzKTsKLQotICAgIEFTU0VSVF9UUlVFKHRlc3RfdGNiLmVhdHQgPT0gMCk7Ci0gIH0KLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGJsdWV0b290aDo6bDJjYXA6OlNldE1vY2tJbnRlcmZhY2UoJmwyY2FwX2ludGVyZmFjZV8pOwotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja0J0bUFwaUludGVyZmFjZSgmYnRtX2FwaV9pbnRlcmZhY2VfKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZSgmYnRpZl9zdG9yYWdlX2ludGVyZmFjZV8pOwotICAgIGJsdWV0b290aDo6Z2F0dDo6U2V0TW9ja0dhdHRJbnRlcmZhY2UoJmdhdHRfaW50ZXJmYWNlXyk7Ci0gICAgY29udHJvbGxlcjo6U2V0TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UoJmNvbnRyb2xsZXJfaW50ZXJmYWNlKTsKLQotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIFJlZ2lzdGVyTEVDb2MoQlRfUFNNX0VBVFQsIF8sIF8pKQotICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwxPigmbDJjYXBfYXBwX2luZm9fKSwgUmV0dXJuKEJUX1BTTV9FQVRUKSkpOwotCi0gICAgT05fQ0FMTChidGlmX3N0b3JhZ2VfaW50ZXJmYWNlXywgTG9hZEJvbmRlZEVhdHQpLldpbGxCeURlZmF1bHQoW10oKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfSk7Ci0KLSAgICBoY2lfcm9sZV8gPSBIQ0lfUk9MRV9DRU5UUkFMOwotCi0gICAgT05fQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBHZXRCbGVDb25uUm9sZShfKSkKLSAgICAgICAgLldpbGxCeURlZmF1bHQoRG9BbGwoUmV0dXJuKGhjaV9yb2xlXykpKTsKLQotICAgIE9OX0NBTEwoY29udHJvbGxlcl9pbnRlcmZhY2UsIEdldEFjbERhdGFTaXplQmxlKCkpCi0gICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybigxMjgpKTsKLQotICAgIGVhdHRfaW5zdGFuY2VfID0gRWF0dEV4dGVuc2lvbjo6R2V0SW5zdGFuY2UoKTsKLSAgICBlYXR0X2luc3RhbmNlXy0+U3RhcnQoKTsKLQotICAgIFRlc3Q6OlNldFVwKCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIERlcmVnaXN0ZXJMRUNvYyhCVF9QU01fRUFUVCkpLlRpbWVzKDEpOwotCi0gICAgZWF0dF9pbnN0YW5jZV8tPlN0b3AoKTsKLSAgICBlYXR0X2luc3RhbmNlXyA9IG51bGxwdHI7Ci0gICAgaGNpX3JvbGVfID0gMDsKLSAgICBjb25uZWN0ZWRfY2lkc18uY2xlYXIoKTsKLQotICAgIGJsdWV0b290aDo6Z2F0dDo6U2V0TW9ja0dhdHRJbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgYmx1ZXRvb3RoOjpsMmNhcDo6U2V0TW9ja0ludGVyZmFjZShudWxscHRyKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdGlmU3RvcmFnZUludGVyZmFjZShudWxscHRyKTsKLSAgICBibHVldG9vdGg6Om1hbmFnZXI6OlNldE1vY2tCdG1BcGlJbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgY29udHJvbGxlcjo6U2V0TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UobnVsbHB0cik7Ci0KLSAgICBUZXN0OjpUZWFyRG93bigpOwotICB9Ci0KLSAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpNb2NrQnRpZlN0b3JhZ2VJbnRlcmZhY2UgYnRpZl9zdG9yYWdlX2ludGVyZmFjZV87Ci0gIGJsdWV0b290aDo6bWFuYWdlcjo6TW9ja0J0bUFwaUludGVyZmFjZSBidG1fYXBpX2ludGVyZmFjZV87Ci0gIGJsdWV0b290aDo6bDJjYXA6Ok1vY2tMMmNhcEludGVyZmFjZSBsMmNhcF9pbnRlcmZhY2VfOwotICBibHVldG9vdGg6OmdhdHQ6Ok1vY2tHYXR0SW50ZXJmYWNlIGdhdHRfaW50ZXJmYWNlXzsKLSAgY29udHJvbGxlcjo6TW9ja0NvbnRyb2xsZXJJbnRlcmZhY2UgY29udHJvbGxlcl9pbnRlcmZhY2U7Ci0KLSAgdEwyQ0FQX0FQUExfSU5GTyBsMmNhcF9hcHBfaW5mb187Ci0gIEVhdHRFeHRlbnNpb24qIGVhdHRfaW5zdGFuY2VfOwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gY29ubmVjdGVkX2NpZHNfOwotICB1aW50OF90IGhjaV9yb2xlXyA9IEhDSV9ST0xFX0NFTlRSQUw7Ci19OwotCi1URVNUX0YoRWF0dFRlc3QsIENvbm5lY3RTdWNjZWVkKSB7Ci0gIENvbm5lY3REZXZpY2VFYXR0U3VwcG9ydGVkKDEpOwotICBEaXNjb25uZWN0RWF0dERldmljZShjb25uZWN0ZWRfY2lkc18pOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIEluY29taW5nRWF0dENvbm5lY3Rpb25CeVVua25vd25EZXZpY2UpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGluY29taW5nX2NpZHN7NzEsIDcyLCA3MywgNzQsIDc1fTsKLQotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICBDb25uZWN0Q3JlZGl0QmFzZWRSc3AodGVzdF9hZGRyZXNzLCAxLCBpbmNvbWluZ19jaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTDJDQVBfQ09OTl9OT19SRVNPVVJDRVMsIF8pKQotICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0KLSAgbDJjYXBfYXBwX2luZm9fLnBMMkNBX0NyZWRpdEJhc2VkQ29ubmVjdEluZF9DYigKLSAgICAgIHRlc3RfYWRkcmVzcywgaW5jb21pbmdfY2lkcywgQlRfUFNNX0VBVFQsIEVBVFRfTUlOX01UVV9NUFMsIDEpOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIEluY29taW5nRWF0dENvbm5lY3Rpb25CeUtub3duRGV2aWNlKSB7Ci0gIGhjaV9yb2xlXyA9IEhDSV9ST0xFX1BFUklQSEVSQUw7Ci0gIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2VfLCBDbGllbnRSZWFkU3VwcG9ydGVkRmVhdHVyZXMpCi0gICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmLCB1aW50OF90KT4gY2IpIHsKLSAgICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKGFkZHIsIEJMRV9HQVRUX1NWUl9TVVBfRkVBVF9FQVRUX0JJVE1BU0spOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfSk7Ci0gIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2VfLCBHZXRFYXR0U3VwcG9ydCkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsgcmV0dXJuIHRydWU7IH0pOwotCi0gIGVhdHRfaW5zdGFuY2VfLT5Db25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBpbmNvbWluZ19jaWRzezcxLCA3MiwgNzMsIDc0LCA3NX07Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICBsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgQ29ubmVjdENyZWRpdEJhc2VkUnNwKHRlc3RfYWRkcmVzcywgMSwgaW5jb21pbmdfY2lkcywgTDJDQVBfQ09OTl9PSywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBsMmNhcF9hcHBfaW5mb18ucEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0SW5kX0NiKAotICAgICAgdGVzdF9hZGRyZXNzLCBpbmNvbWluZ19jaWRzLCBCVF9QU01fRUFUVCwgRUFUVF9NSU5fTVRVX01QUywgMSk7Ci0KLSAgRGlzY29ubmVjdEVhdHREZXZpY2UoaW5jb21pbmdfY2lkcyk7Ci0KLSAgaGNpX3JvbGVfID0gSENJX1JPTEVfQ0VOVFJBTDsKLX0KLQotVEVTVF9GKEVhdHRUZXN0LCBSZWNvbm5lY3RJbml0aWF0ZWRCeVJlbW90ZVN1Y2NlZWQpIHsKLSAgQ29ubmVjdERldmljZUVhdHRTdXBwb3J0ZWQoMSk7Ci0gIERpc2Nvbm5lY3RFYXR0RGV2aWNlKGNvbm5lY3RlZF9jaWRzXyk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBpbmNvbWluZ19jaWRzezcxLCA3MiwgNzMsIDc0LCA3NX07Ci0KLSAgRVhQRUNUX0NBTEwoCi0gICAgICBsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgQ29ubmVjdENyZWRpdEJhc2VkUnNwKHRlc3RfYWRkcmVzcywgMSwgaW5jb21pbmdfY2lkcywgTDJDQVBfQ09OTl9PSywgXykpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLQotICBsMmNhcF9hcHBfaW5mb18ucEwyQ0FfQ3JlZGl0QmFzZWRDb25uZWN0SW5kX0NiKAotICAgICAgdGVzdF9hZGRyZXNzLCBpbmNvbWluZ19jaWRzLCBCVF9QU01fRUFUVCwgRUFUVF9NSU5fTVRVX01QUywgMSk7Ci0KLSAgRGlzY29ubmVjdEVhdHREZXZpY2UoaW5jb21pbmdfY2lkcyk7Ci19Ci0KLVRFU1RfRihFYXR0VGVzdCwgQ29ubmVjdFN1Y2NlZWRNdWx0aXBsZUNoYW5uZWxzKSB7Ci0gIENvbm5lY3REZXZpY2VFYXR0U3VwcG9ydGVkKDUpOwotICBEaXNjb25uZWN0RWF0dERldmljZShjb25uZWN0ZWRfY2lkc18pOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIENvbm5lY3RGYWlsZWRFYXR0Tm90U3VwcG9ydGVkKSB7Ci0gIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2VfLCBDbGllbnRSZWFkU3VwcG9ydGVkRmVhdHVyZXMpCi0gICAgICAuV2lsbEJ5RGVmYXVsdCgKLSAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmLCB1aW50OF90KT4gY2IpIHsKLSAgICAgICAgICAgIHN0ZDo6bW92ZShjYikuUnVuKGFkZHIsIDApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfSk7Ci0gIE9OX0NBTEwoZ2F0dF9pbnRlcmZhY2VfLCBHZXRFYXR0U3VwcG9ydCkKLSAgICAgIC5XaWxsQnlEZWZhdWx0KFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsgcmV0dXJuIGZhbHNlOyB9KTsKLQotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICBDb25uZWN0Q3JlZGl0QmFzZWRSZXEoQlRfUFNNX0VBVFQsIHRlc3RfYWRkcmVzcywgXykpCi0gICAgICAuVGltZXMoMCk7Ci0gIGVhdHRfaW5zdGFuY2VfLT5Db25uZWN0KHRlc3RfYWRkcmVzcyk7Ci0gIEFTU0VSVF9UUlVFKGVhdHRfaW5zdGFuY2VfLT5Jc0VhdHRTdXBwb3J0ZWRCeVBlZXIodGVzdF9hZGRyZXNzKSA9PSBmYWxzZSk7Ci19Ci0KLVRFU1RfRihFYXR0VGVzdCwgQ29ubmVjdEZhaWxlZFNsYXZlT25UaGVMaW5rKSB7Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgIENvbm5lY3RDcmVkaXRCYXNlZFJlcShCVF9QU01fRUFUVCwgdGVzdF9hZGRyZXNzLCBfKSkKLSAgICAgIC5UaW1lcygwKTsKLQotICBoY2lfcm9sZV8gPSBIQ0lfUk9MRV9QRVJJUEhFUkFMOwotICBlYXR0X2luc3RhbmNlXy0+Q29ubmVjdCh0ZXN0X2FkZHJlc3MpOwotCi0gIC8qIEJhY2sgdG8gZGVmYXVsdCBidG0gcm9sZSAqLwotICBoY2lfcm9sZV8gPSBIQ0lfUk9MRV9DRU5UUkFMOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIERpc29ubmVjdEJ5UGVlclN1Y2NlZWQpIHsKLSAgQ29ubmVjdERldmljZUVhdHRTdXBwb3J0ZWQoMik7Ci0KLSAgdWludDE2X3QgY2lkID0gY29ubmVjdGVkX2NpZHNfWzBdOwotICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICBlYXR0X2luc3RhbmNlXy0+RmluZEVhdHRDaGFubmVsQnlDaWQodGVzdF9hZGRyZXNzLCBjaWQpOwotICBBU1NFUlRfVFJVRShjaGFubmVsLT5zdGF0ZV8gPT0gRWF0dENoYW5uZWxTdGF0ZTo6RUFUVF9DSEFOTkVMX09QRU5FRCk7Ci0KLSAgRGlzY29ubmVjdEVhdHRCeVBlZXIoKTsKLQotICBjaGFubmVsID0gZWF0dF9pbnN0YW5jZV8tPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRlc3RfYWRkcmVzcywgY2lkKTsKLSAgQVNTRVJUX1RSVUUoY2hhbm5lbCA9PSBudWxscHRyKTsKLX0KLQotVEVTVF9GKEVhdHRUZXN0LCBSZWNvbmZpZ0FsbFN1Y2NlZWQpIHsKLSAgQ29ubmVjdERldmljZUVhdHRTdXBwb3J0ZWQoMyk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNpZHM7Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIFJlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDE+KCZjaWRzKSwgUmV0dXJuKHRydWUpKSk7Ci0KLSAgdWludDE2X3QgbmV3X210dSA9IDMwMDsKLSAgZWF0dF9pbnN0YW5jZV8tPlJlY29uZmlndXJlQWxsKHRlc3RfYWRkcmVzcywgbmV3X210dSk7Ci0KLSAgQVNTRVJUX1RSVUUoY2lkcy5zaXplKCkgPT0gY29ubmVjdGVkX2NpZHNfLnNpemUoKSk7Ci0KLSAgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyA9IHsucmVzdWx0ID0gTDJDQVBfQ0ZHX09LLCAubXR1ID0gbmV3X210dX07Ci0KLSAgZm9yICh1aW50MTZfdCBjaWQgOiBjaWRzKSB7Ci0gICAgbDJjYXBfYXBwX2luZm9fLnBMMkNBX0NyZWRpdEJhc2VkUmVjb25maWdDb21wbGV0ZWRfQ2IodGVzdF9hZGRyZXNzLCBjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgJmNmZyk7Ci0KLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIGVhdHRfaW5zdGFuY2VfLT5GaW5kRWF0dENoYW5uZWxCeUNpZCh0ZXN0X2FkZHJlc3MsIGNpZCk7Ci0gICAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+c3RhdGVfID09IEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICAgIEFTU0VSVF9UUlVFKGNoYW5uZWwtPnJ4X210dV8gPT0gbmV3X210dSk7Ci0gIH0KLQotICBEaXNjb25uZWN0RWF0dERldmljZShjb25uZWN0ZWRfY2lkc18pOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIFJlY29uZmlnQWxsRmFpbGVkKSB7Ci0gIENvbm5lY3REZXZpY2VFYXR0U3VwcG9ydGVkKDQpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaWRzOwotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBSZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwxPigmY2lkcyksIFJldHVybih0cnVlKSkpOwotCi0gIHVpbnQxNl90IG5ld19tdHUgPSAzMDA7Ci0gIGVhdHRfaW5zdGFuY2VfLT5SZWNvbmZpZ3VyZUFsbCh0ZXN0X2FkZHJlc3MsIG5ld19tdHUpOwotCi0gIEFTU0VSVF9UUlVFKGNpZHMuc2l6ZSgpID09IGNvbm5lY3RlZF9jaWRzXy5zaXplKCkpOwotCi0gIHRMMkNBUF9MRV9DRkdfSU5GTyBjZmcgPSB7LnJlc3VsdCA9IEwyQ0FQX0NGR19GQUlMRURfTk9fUkVBU09OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdHUgPSBuZXdfbXR1fTsKLQotICBmb3IgKHVpbnQxNl90IGNpZCA6IGNpZHMpIHsKLSAgICBsMmNhcF9hcHBfaW5mb18ucEwyQ0FfQ3JlZGl0QmFzZWRSZWNvbmZpZ0NvbXBsZXRlZF9DYih0ZXN0X2FkZHJlc3MsIGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAmY2ZnKTsKLQotICAgIEVhdHRDaGFubmVsKiBjaGFubmVsID0KLSAgICAgICAgZWF0dF9pbnN0YW5jZV8tPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRlc3RfYWRkcmVzcywgY2lkKTsKLSAgICBBU1NFUlRfVFJVRShjaGFubmVsLT5zdGF0ZV8gPT0gRWF0dENoYW5uZWxTdGF0ZTo6RUFUVF9DSEFOTkVMX09QRU5FRCk7Ci0gICAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+cnhfbXR1XyAhPSBuZXdfbXR1KTsKLSAgfQotCi0gIERpc2Nvbm5lY3RFYXR0RGV2aWNlKGNvbm5lY3RlZF9jaWRzXyk7Ci19Ci0KLVRFU1RfRihFYXR0VGVzdCwgUmVjb25maWdTaW5nbGVTdWNjZWVkKSB7Ci0gIENvbm5lY3REZXZpY2VFYXR0U3VwcG9ydGVkKDIpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaWRzOwotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBSZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoXywgXywgXykpCi0gICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzwxPigmY2lkcyksIFJldHVybih0cnVlKSkpOwotCi0gIHVpbnQxNl90IG5ld19tdHUgPSAzMDA7Ci0gIGVhdHRfaW5zdGFuY2VfLT5SZWNvbmZpZ3VyZSh0ZXN0X2FkZHJlc3MsIGNvbm5lY3RlZF9jaWRzX1sxXSwgbmV3X210dSk7Ci0KLSAgQVNTRVJUX1RSVUUoY2lkcy5zaXplKCkgPT0gMSk7Ci0KLSAgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyA9IHsucmVzdWx0ID0gTDJDQVBfQ0ZHX09LLCAubXR1ID0gbmV3X210dX07Ci0KLSAgYXV0byBpdCA9IHN0ZDo6ZmluZChjb25uZWN0ZWRfY2lkc18uYmVnaW4oKSwgY29ubmVjdGVkX2NpZHNfLmVuZCgpLCBjaWRzWzBdKTsKLSAgQVNTRVJUX1RSVUUoaXQgIT0gY29ubmVjdGVkX2NpZHNfLmVuZCgpKTsKLQotICBsMmNhcF9hcHBfaW5mb18ucEwyQ0FfQ3JlZGl0QmFzZWRSZWNvbmZpZ0NvbXBsZXRlZF9DYih0ZXN0X2FkZHJlc3MsIGNpZHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICZjZmcpOwotICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICBlYXR0X2luc3RhbmNlXy0+RmluZEVhdHRDaGFubmVsQnlDaWQodGVzdF9hZGRyZXNzLCBjaWRzWzBdKTsKLSAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+c3RhdGVfID09IEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICBBU1NFUlRfVFJVRShjaGFubmVsLT5yeF9tdHVfID09IG5ld19tdHUpOwotCi0gIERpc2Nvbm5lY3RFYXR0RGV2aWNlKGNvbm5lY3RlZF9jaWRzXyk7Ci19Ci0KLVRFU1RfRihFYXR0VGVzdCwgUmVjb25maWdTaW5nbGVGYWlsZWQpIHsKLSAgQ29ubmVjdERldmljZUVhdHRTdXBwb3J0ZWQoMik7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNpZHM7Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIFJlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcShfLCBfLCBfKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDE+KCZjaWRzKSwgUmV0dXJuKHRydWUpKSk7Ci0KLSAgdWludDE2X3QgbmV3X210dSA9IDMwMDsKLSAgZWF0dF9pbnN0YW5jZV8tPlJlY29uZmlndXJlQWxsKHRlc3RfYWRkcmVzcywgbmV3X210dSk7Ci0KLSAgQVNTRVJUX1RSVUUoY2lkcy5zaXplKCkgPT0gY29ubmVjdGVkX2NpZHNfLnNpemUoKSk7Ci0KLSAgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyA9IHsucmVzdWx0ID0gTDJDQVBfQ0ZHX0ZBSUxFRF9OT19SRUFTT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm10dSA9IG5ld19tdHV9OwotCi0gIGF1dG8gaXQgPSBzdGQ6OmZpbmQoY29ubmVjdGVkX2NpZHNfLmJlZ2luKCksIGNvbm5lY3RlZF9jaWRzXy5lbmQoKSwgY2lkc1swXSk7Ci0gIEFTU0VSVF9UUlVFKGl0ICE9IGNvbm5lY3RlZF9jaWRzXy5lbmQoKSk7Ci0KLSAgbDJjYXBfYXBwX2luZm9fLnBMMkNBX0NyZWRpdEJhc2VkUmVjb25maWdDb21wbGV0ZWRfQ2IodGVzdF9hZGRyZXNzLCBjaWRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAmY2ZnKTsKLSAgRWF0dENoYW5uZWwqIGNoYW5uZWwgPQotICAgICAgZWF0dF9pbnN0YW5jZV8tPkZpbmRFYXR0Q2hhbm5lbEJ5Q2lkKHRlc3RfYWRkcmVzcywgY2lkc1swXSk7Ci0gIEFTU0VSVF9UUlVFKGNoYW5uZWwtPnN0YXRlXyA9PSBFYXR0Q2hhbm5lbFN0YXRlOjpFQVRUX0NIQU5ORUxfT1BFTkVEKTsKLSAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+cnhfbXR1XyAhPSBuZXdfbXR1KTsKLQotICBEaXNjb25uZWN0RWF0dERldmljZShjb25uZWN0ZWRfY2lkc18pOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIFJlY29uZmlnUGVlclN1Y2NlZWQpIHsKLSAgQ29ubmVjdERldmljZUVhdHRTdXBwb3J0ZWQoMyk7Ci0KLSAgdWludDE2X3QgbmV3X210dSA9IDMwMDsKLSAgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyA9IHsucmVzdWx0ID0gTDJDQVBfQ0ZHX09LLCAubXR1ID0gbmV3X210dX07Ci0KLSAgZm9yICh1aW50MTZfdCBjaWQgOiBjb25uZWN0ZWRfY2lkc18pIHsKLSAgICBsMmNhcF9hcHBfaW5mb18ucEwyQ0FfQ3JlZGl0QmFzZWRSZWNvbmZpZ0NvbXBsZXRlZF9DYih0ZXN0X2FkZHJlc3MsIGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJmNmZyk7Ci0KLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIGVhdHRfaW5zdGFuY2VfLT5GaW5kRWF0dENoYW5uZWxCeUNpZCh0ZXN0X2FkZHJlc3MsIGNpZCk7Ci0gICAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+c3RhdGVfID09IEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICAgIEFTU0VSVF9UUlVFKGNoYW5uZWwtPnR4X210dV8gPT0gbmV3X210dSk7Ci0gIH0KLQotICBEaXNjb25uZWN0RWF0dERldmljZShjb25uZWN0ZWRfY2lkc18pOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIFJlY29uZmlnUGVlckZhaWxlZCkgewotICBDb25uZWN0RGV2aWNlRWF0dFN1cHBvcnRlZCgyKTsKLQotICB1aW50MTZfdCBuZXdfbXR1ID0gMzAwOwotICB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnID0gey5yZXN1bHQgPSBMMkNBUF9DRkdfRkFJTEVEX05PX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubXR1ID0gbmV3X210dX07Ci0KLSAgZm9yICh1aW50MTZfdCBjaWQgOiBjb25uZWN0ZWRfY2lkc18pIHsKLSAgICBsMmNhcF9hcHBfaW5mb18ucEwyQ0FfQ3JlZGl0QmFzZWRSZWNvbmZpZ0NvbXBsZXRlZF9DYih0ZXN0X2FkZHJlc3MsIGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJmNmZyk7Ci0KLSAgICBFYXR0Q2hhbm5lbCogY2hhbm5lbCA9Ci0gICAgICAgIGVhdHRfaW5zdGFuY2VfLT5GaW5kRWF0dENoYW5uZWxCeUNpZCh0ZXN0X2FkZHJlc3MsIGNpZCk7Ci0gICAgQVNTRVJUX1RSVUUoY2hhbm5lbC0+c3RhdGVfID09IEVhdHRDaGFubmVsU3RhdGU6OkVBVFRfQ0hBTk5FTF9PUEVORUQpOwotICAgIEFTU0VSVF9UUlVFKGNoYW5uZWwtPnR4X210dV8gIT0gbmV3X210dSk7Ci0gIH0KLQotICBEaXNjb25uZWN0RWF0dERldmljZShjb25uZWN0ZWRfY2lkc18pOwotfQotCi1URVNUX0YoRWF0dFRlc3QsIERvdWJsZURpc2Nvbm5lY3QpIHsKLSAgQ29ubmVjdERldmljZUVhdHRTdXBwb3J0ZWQoMSk7Ci0gIERpc2Nvbm5lY3RFYXR0RGV2aWNlKGNvbm5lY3RlZF9jaWRzXyk7Ci0KLSAgLyogRm9yY2Ugc2Vjb25kIGRpc2Nvbm5lY3QgKi8KLSAgZWF0dF9pbnN0YW5jZV8tPkRpc2Nvbm5lY3QodGVzdF9hZGRyZXNzKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9zdGFjay90ZXN0L2Z1enplcnMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyZTE1NS4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2Z1enplcnMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliYnQtc3RhY2tfZnV6el9kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idC8iLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUvIiwKLSAgICAgICAgInN5c3RlbS9idC90eXBlcy8iLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUvIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay90ZXN0IiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1zdGFjayIsCi0gICAgICAgICJsaWJidGUiLAotICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCi0gICAgICAgICJsaWJidC1hdWRpby1oYWwtaW50ZXJmYWNlIiwKLSAgICAgICAgImxpYmJ0Y29yZSIsCi0gICAgICAgICJsaWJidC1idGEiLAotICAgICAgICAibGliYnQtc3RhY2siLAotICAgICAgICAibGliYnQtY29tbW9uIiwKLSAgICAgICAgImxpYmJ0LXNiYy1kZWNvZGVyIiwKLSAgICAgICAgImxpYmJ0LXNiYy1lbmNvZGVyIiwKLSAgICAgICAgImxpYmJ0LXV0aWxzIiwKLSAgICAgICAgImxpYmJ0aWYiLAotICAgICAgICAibGliYnQtaGNpIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmc3MjJjb2RlYyIsCi0gICAgICAgICJsaWJsYzNjb2RlYyIsCi0gICAgICAgICJsaWJvc2kiLAotICAgICAgICAibGlidWRydi11aXBjIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJsdWV0b290aC1kdW1wc3lzIiwKLSAgICAgICAgImxpYmJsdWV0b290aF9nZCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmEyZHBAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjEiLAotICAgICAgICAiYW5kcm9pZC5zeXN0ZW0uc3VzcGVuZC5jb250cm9sLVYxLW5kayIsCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyX25kayIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL0FuZHJvaWQuYnAgYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlhODAyLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiYTJkcF9mdXp6IiwKLSAgICBkZWZhdWx0czogWyJsaWJidC1zdGFja19mdXp6X2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el9hMmRwLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvYTJkcEZ1enpGdW5jdGlvbnMuaCBiL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2EyZHBGdXp6RnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOWVlOWEuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvYTJkcEZ1enpGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQlRfU1RBQ0tfRlVaWl9BMkRQX0ZVTkNUSU9OU19IXwotI2RlZmluZSBCVF9TVEFDS19GVVpaX0EyRFBfRlVOQ1RJT05TX0hfCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImEyZHBfYXBpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLSNpbmNsdWRlICJzdGFjay9hMmRwL2EyZHBfaW50LmgiCi0KLSNpbmNsdWRlICJmdXp6ZXJzL2EyZHAvYTJkcEZ1enpIZWxwZXJzLmgiCi0jaW5jbHVkZSAiZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL3NkcC9zZHBGdXp6RnVuY3Rpb25zLmgiCi0KLSNkZWZpbmUgTUFYX1NUUl9MRU4gNDA5NgotCi0vKiBUaGlzIGlzIGEgdmVjdG9yIG9mIGxhbWJkYSBmdW5jdGlvbnMgdGhlIGZ1enplciB3aWxsIHB1bGwgZnJvbS4KLSAqICBUaGlzIGlzIGRvbmUgc28gbmV3IGZ1bmN0aW9ucyBjYW4gYmUgYWRkZWQgdG8gdGhlIGZ1enplciBlYXNpbHkKLSAqICB3aXRob3V0IHJlcXVpcmluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBtYWluIGZ1enplciBmaWxlLiBUaGlzIGFsc28KLSAqICBhbGxvd3MgbXVsdGlwbGUgZnV6emVycyB0byBpbmNsdWRlIHRoaXMgZmlsZSwgaWYgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWQuCi0gKi8KLXN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdXp6ZWREYXRhUHJvdmlkZXIqKT4+IGEyZHBfb3BlcmF0aW9ucyA9IHsKLSAgICAvLyBJbml0Ci0gICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKikgLT4gdm9pZCB7Ci0gICAgICAvLyBSZS1pbml0IHplcm9zIG91dCBtZW1vcnkgY29udGFpbmluZyBzb21lIHBvaW50ZXJzLgotICAgICAgLy8gRnJlZSB0aGUgZGIgZmlyc3QgdG8gcHJldmVudCBtZW1sZWFrcwotICAgICAgaWYgKGEyZHBfY2IuZmluZC5wX2RiKSB7Ci0gICAgICAgIG9zaV9mcmVlKGEyZHBfY2IuZmluZC5wX2RiKTsKLSAgICAgIH0KLQotICAgICAgLy8gQXR0ZW1wdCByZS1pbml0aWFsaXphdGlvbnMgbWlkLXJ1bi4KLSAgICAgIEEyRFBfSW5pdCgpOwotICAgIH0sCi0KLSAgICAvLyBBMkRQX0FkZFJlY29yZAotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHBfc2VydmljZV9uYW1lID0KLSAgICAgICAgICBmZHAtPkNvbnN1bWVCeXRlc1dpdGhUZXJtaW5hdG9yPGNoYXI+KE1BWF9TVFJfTEVOKTsKLSAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHBfcHJvdmlkZXJfbmFtZSA9Ci0gICAgICAgICAgZmRwLT5Db25zdW1lQnl0ZXNXaXRoVGVybWluYXRvcjxjaGFyPihNQVhfU1RSX0xFTik7Ci0gICAgICBBMkRQX0FkZFJlY29yZChmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwgcF9zZXJ2aWNlX25hbWUuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgcF9wcm92aWRlcl9uYW1lLmRhdGEoKSwgZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCksCi0gICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBhIHZhbCByZXR1cm5lZCBieSBTRFBfQ3JlYXRlUmVjb3JkCi0gICAgICAgICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX3JlY29yZF9oYW5kbGVzLCB0cnVlKSk7Ci0gICAgfSwKLQotICAgIC8vIEEyRFBfRmluZFNlcnZpY2UKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICB0QTJEUF9TRFBfREJfUEFSQU1TIHBfZGIgPSBnZW5lcmF0ZURCUGFyYW1zKGZkcCk7Ci0gICAgICBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIgPSBnZW5lcmF0ZVJhd0FkZHJlc3MoZmRwKTsKLSAgICAgIEEyRFBfRmluZFNlcnZpY2UoZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCksIGJkX2FkZHIsICZwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICBhMmRwX2ZpbmRfY2FsbGJhY2spOwotICAgIH0sCi0KLSAgICAvLyBBMkRQX0dldEF2ZHRwVmVyc2lvbgotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciopIC0+IHZvaWQgeyBBMkRQX0dldEF2ZHRwVmVyc2lvbigpOyB9LAotCi0gICAgLy8gQTJEUF9TZXRUcmFjZUxldmVsCi0gICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgLy8gRXhwZWN0ZWQgdmFsIGlzIFswLTVdLCAweGZmIGJ1dCBvdGhlciB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBzbyBmdXp6IGFsbAotICAgICAgQTJEUF9TZXRUcmFjZUxldmVsKGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCkpOwotICAgIH0sCi0KLSAgICAvLyBBMkRQX0JpdHNTZXQKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBBMkRQX0JpdHNTZXQoZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkpOwotICAgIH0sCi0KLSAgICAvLyBTRFAgQ2FsbHMKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oZmRwLCBzZHBfb3BlcmF0aW9ucyk7Ci0gICAgfX07Ci0KLSNlbmRpZiAgLy8gQlRfU1RBQ0tfRlVaWl9BMkRQX0ZVTkNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvYTJkcEZ1enpIZWxwZXJzLmggYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9hMmRwRnV6ekhlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyNDI5Mi4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9hMmRwRnV6ekhlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQlRfU1RBQ0tfRlVaWl9BMkRQX0hFTFBFUlNfSF8KLSNkZWZpbmUgQlRfU1RBQ0tfRlVaWl9BMkRQX0hFTFBFUlNfSF8KLQotLy8gTk9URTogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgZGlyZWN0bHkuCi0vLyAgICAgICBJdCBpcyBpbmNsdWRlZCBieSB0aGUgY29ycmVzcG9uZGluZyAiLi4uRnVuY3Rpb25zLmgiIGZpbGUuCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL3NkcC9zZHBGdXp6SGVscGVycy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2EyZHAvYTJkcF9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jZGVmaW5lIE1BWF9EQl9TSVpFIDQwOTYKLQotdEEyRFBfU0RQX0RCX1BBUkFNUyBnZW5lcmF0ZURCUGFyYW1zKEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBhdHRyX2xpc3QgPSBnZW5lcmF0ZUFyYml0cmFyeUF0dHJMaXN0KGZkcCk7Ci0KLSAgdEEyRFBfU0RQX0RCX1BBUkFNUyBkYl9wYXJhbXM7Ci0gIGRiX3BhcmFtcy5kYl9sZW4gPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIE1BWF9EQl9TSVpFKTsKLSAgZGJfcGFyYW1zLm51bV9hdHRyID0gYXR0cl9saXN0LnNpemUoKTsKLSAgZGJfcGFyYW1zLnBfYXR0cnMgPSBhdHRyX2xpc3QuZW1wdHkoKSA/IG51bGxwdHIgOiBhdHRyX2xpc3QuZGF0YSgpOwotCi0gIHJldHVybiBkYl9wYXJhbXM7Ci19Ci0KLS8vIERlZmluZSBvdXIgZW1wdHkgY2FsbGJhY2sgZnVuY3Rpb24KLXZvaWQgYTJkcF9maW5kX2NhbGxiYWNrKGJvb2wgZm91bmQsIHRBMkRQX1NlcnZpY2UqIHBfc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICAvLyBGcmVlIHRoZSBSYXdBZGRyZXNzIHdlIGNyZWF0ZWQgaW4gdGhlIGdlbmVyYXRlIGZ1bmN0aW9uCi0gIGRlbGV0ZSAmcGVlcl9hZGRyZXNzOwotfQotCi0vLyBGdW5jdGlvbiB0byBjbGVhbiB1cCBhbmQgY2xlYXIgb3VyIGFsbG9jYXRlZCBvYmplY3RzCi12b2lkIGNsZWFudXBBMmRwRnV6eigpIHsKLSAgLy8gRGVsZXRlIG91ciBhMmRwX2NiIGRhdGFiYXNlIGlmIGl0IGV4aXN0cwotICBpZiAoYTJkcF9jYi5maW5kLnBfZGIpIHsKLSAgICBvc2lfZnJlZShhMmRwX2NiLmZpbmQucF9kYik7Ci0gIH0KLSAgLy8gVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGEyZHBfY2IgZ2xvYmFsIHRvIGRlZmF1bHRzCi0gIEEyRFBfSW5pdCgpOwotCi0gIC8vIFNEUCBuZWVkcyB0byBwZXJmb3JtIGNsZWFudXAgYXMgd2VsbC4KLSAgY2xlYW51cFNkcEZ1enooKTsKLX0KLQotI2VuZGlmICAvLyBCVF9TVEFDS19GVVpaX0EyRFBfSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvQW5kcm9pZC5icCBiL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmMyMTIuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliYnQtc3RhY2tfZnV6el9jb2RlY19kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsibGliYnQtc3RhY2tfZnV6el9kZWZhdWx0cyJdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0L2J0YS9pbmNsdWRlLyIsIC8vIEZvciB0QlRfQTJEUF9PRkZMT0FECi0gICAgICAgICJzeXN0ZW0vYnQvYnRhL3N5cy8iLCAvLyBGb3IgdEJUX0EyRFBfT0ZGTE9BRAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiYTJkcF9jb2RlY19mdXp6IiwKLSAgICBkZWZhdWx0czogWyJsaWJidC1zdGFja19mdXp6X2NvZGVjX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWwotICAgICAgICAiZnV6el9hMmRwX2NvZGVjLmNjIiwKLSAgICBdLAotfQotCi1jY19mdXp6IHsKLSAgICBuYW1lOiAiYTJkcF9jb2RlY19pbmZvX2Z1enoiLAotICAgIGRlZmF1bHRzOiBbImxpYmJ0LXN0YWNrX2Z1enpfY29kZWNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6X2EyZHBfY29kZWNfaW5mby5jYyIsCi0gICAgXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImEyZHBfY29kZWNfY2ZnX2Z1enoiLAotICAgIGRlZmF1bHRzOiBbImxpYmJ0LXN0YWNrX2Z1enpfY29kZWNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmdXp6X2EyZHBfY29kZWNfY29uZmlnLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjQ29uZmlnRnV6ekZ1bmN0aW9ucy5oIGIvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjQ29uZmlnRnV6ekZ1bmN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzE1YTgzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0NvbmZpZ0Z1enpGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ0NPTkZJR19GVU5DVElPTlNfSF8KLSNkZWZpbmUgQlRfU1RBQ0tfRlVaWl9BMkRQX0NPREVDQ09ORklHX0ZVTkNUSU9OU19IXwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgImZ1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNIZWxwZXJGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSW5mb0Z1enpGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL2NvbW1vbi9jb21tb25GdXp6SGVscGVycy5oIgotCi0jaW5jbHVkZSAiZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0NvbmZpZ0Z1enpIZWxwZXJzLmgiCi0KLS8qIFRoaXMgaXMgYSB2ZWN0b3Igb2YgbGFtYmRhIGZ1bmN0aW9ucyB0aGUgZnV6emVyIHdpbGwgcHVsbCBmcm9tLgotICogIFRoaXMgaXMgZG9uZSBzbyBuZXcgZnVuY3Rpb25zIGNhbiBiZSBhZGRlZCB0byB0aGUgZnV6emVyIGVhc2lseQotICogIHdpdGhvdXQgcmVxdWlyaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1haW4gZnV6emVyIGZpbGUuIFRoaXMgYWxzbwotICogIGFsbG93cyBtdWx0aXBsZSBmdXp6ZXJzIHRvIGluY2x1ZGUgdGhpcyBmaWxlLCBpZiBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZC4KLSAqLwotc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciopPj4KLSAgICBhMmRwX2NvZGVjX2NvbmZpZ19vcGVyYXRpb25zID0gewotICAgICAgICAvLyBjcmVhdGVDb2RlYwotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgLy8gR2VuZXJhdGUgb3VyIGFyZ3VtZW50cwotICAgICAgICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4ID0gZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjSW5kZXgoZmRwKTsKLSAgICAgICAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSA9Ci0gICAgICAgICAgICAgIGdldEFyYml0cmFyeUJ0YXZDb2RlY1ByaW9yaXR5KGZkcCk7Ci0gICAgICAgICAgLy8gQ3JlYXRlIG91ciBuZXcgY29kZWMKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIEEyZHBDb2RlY0NvbmZpZzo6Y3JlYXRlQ29kZWMoY29kZWNfaW5kZXgsIGNvZGVjX3ByaW9yaXR5KSk7Ci0gICAgICAgICAgLy8gUHVzaCBpdCB0byBvdXIgdmVjdG9yCi0gICAgICAgICAgaWYgKGNvZGVjX2NvbmZpZykgewotICAgICAgICAgICAgYTJkcF9jb2RlY19jb25maWdfdmVjdC5wdXNoX2JhY2soY29kZWNfY29uZmlnKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJkcENvZGVjQ29uZmlnIERlc3RydWN0b3IKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIGlmIChhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gR2V0IHJhbmRvbSB2ZWN0b3IgaW5kZXgKLSAgICAgICAgICBzaXplX3QgaW5kZXggPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKLSAgICAgICAgICAgICAgMCwgYTJkcF9jb2RlY19jb25maWdfdmVjdC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAvLyBSZW1vdmUgZnJvbSB2ZWN0b3IKLSAgICAgICAgICBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LmVyYXNlKGEyZHBfY29kZWNfY29uZmlnX3ZlY3QuYmVnaW4oKSArIGluZGV4KTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBjb2RlY0luZGV4Ci0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LCBmYWxzZSkpOwotICAgICAgICAgIGlmIChjb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNvZGVjX2NvbmZpZy0+Y29kZWNJbmRleCgpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIG5hbWUKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNDb25maWc+IGNvZGVjX2NvbmZpZygKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIGEyZHBfY29kZWNfY29uZmlnX3ZlY3QsIGZhbHNlKSk7Ci0gICAgICAgICAgaWYgKGNvZGVjX2NvbmZpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY29kZWNfY29uZmlnLT5uYW1lKCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gY29kZWNQcmlvcml0eQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY0NvbmZpZz4gY29kZWNfY29uZmlnKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19jb25maWdfdmVjdCwgZmFsc2UpKTsKLSAgICAgICAgICBpZiAoY29kZWNfY29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjb2RlY19jb25maWctPmNvZGVjUHJpb3JpdHkoKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBnZXRDb2RlY1NwZWNpZmljQ29uZmlnCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LCBmYWxzZSkpOwotICAgICAgICAgIGlmIChjb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHRCVF9BMkRQX09GRkxPQUQgYTJkcF9vZmZsb2FkID0gZ2VuZXJhdGVBcmJpdHJhcnl0QTJkcE9mZmxvYWQoZmRwKTsKLSAgICAgICAgICBjb2RlY19jb25maWctPmdldENvZGVjU3BlY2lmaWNDb25maWcoJmEyZHBfb2ZmbG9hZCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gZ2V0VHJhY2tCaXRSYXRlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LCBmYWxzZSkpOwotICAgICAgICAgIGlmIChjb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNvZGVjX2NvbmZpZy0+Z2V0VHJhY2tCaXRSYXRlKCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gY29weU91dE90YUNvZGVjQ29uZmlnCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LCBmYWxzZSkpOwotICAgICAgICAgIGlmIChjb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHVpbnQ4X3QqIGNvZGVjX2luZm8gPQotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIHRydWUpOwotICAgICAgICAgIGNvZGVjX2NvbmZpZy0+Y29weU91dE90YUNvZGVjQ29uZmlnKGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIGdldENvZGVjQ29uZmlnCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LCBmYWxzZSkpOwotICAgICAgICAgIGlmIChjb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNvZGVjX2NvbmZpZy0+Z2V0Q29kZWNDb25maWcoKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBnZXRDb2RlY0NhcGFiaWxpdHkKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNDb25maWc+IGNvZGVjX2NvbmZpZygKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIGEyZHBfY29kZWNfY29uZmlnX3ZlY3QsIGZhbHNlKSk7Ci0gICAgICAgICAgaWYgKGNvZGVjX2NvbmZpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY29kZWNfY29uZmlnLT5nZXRDb2RlY0NhcGFiaWxpdHkoKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBnZXRDb2RlY0xvY2FsQ2FwYWJpbGl0eQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY0NvbmZpZz4gY29kZWNfY29uZmlnKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19jb25maWdfdmVjdCwgZmFsc2UpKTsKLSAgICAgICAgICBpZiAoY29kZWNfY29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjb2RlY19jb25maWctPmdldENvZGVjTG9jYWxDYXBhYmlsaXR5KCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gZ2V0Q29kZWNTZWxlY3RhYmxlQ2FwYWJpbGl0eQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY0NvbmZpZz4gY29kZWNfY29uZmlnKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19jb25maWdfdmVjdCwgZmFsc2UpKTsKLSAgICAgICAgICBpZiAoY29kZWNfY29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjb2RlY19jb25maWctPmdldENvZGVjU2VsZWN0YWJsZUNhcGFiaWxpdHkoKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBnZXRDb2RlY1VzZXJDb25maWcKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNDb25maWc+IGNvZGVjX2NvbmZpZygKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIGEyZHBfY29kZWNfY29uZmlnX3ZlY3QsIGZhbHNlKSk7Ci0gICAgICAgICAgaWYgKGNvZGVjX2NvbmZpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY29kZWNfY29uZmlnLT5nZXRDb2RlY1VzZXJDb25maWcoKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBnZXRDb2RlY0F1ZGlvQ29uZmlnCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPiBjb2RlY19jb25maWcoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2NvbmZpZ192ZWN0LCBmYWxzZSkpOwotICAgICAgICAgIGlmIChjb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNvZGVjX2NvbmZpZy0+Z2V0Q29kZWNBdWRpb0NvbmZpZygpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIGdldEF1ZGlvQml0c1BlclNhbXBsZQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY0NvbmZpZz4gY29kZWNfY29uZmlnKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19jb25maWdfdmVjdCwgZmFsc2UpKTsKLSAgICAgICAgICBpZiAoY29kZWNfY29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjb2RlY19jb25maWctPmdldEF1ZGlvQml0c1BlclNhbXBsZSgpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIGdldEF1ZGlvQml0c1BlclNhbXBsZQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY0NvbmZpZz4gY29kZWNfY29uZmlnKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19jb25maWdfdmVjdCwgZmFsc2UpKTsKLSAgICAgICAgICBpZiAoY29kZWNfY29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgYnRhdl9jb2RlY19jb25maWcgPQotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlCdGF2Q29kZWNDb25maWcoZmRwKTsKLSAgICAgICAgICBjb2RlY19jb25maWctPmlzQ29kZWNDb25maWdFbXB0eShidGF2X2NvZGVjX2NvbmZpZyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gRGVwZW5kZW5jeSBjYWxsaW5nOiBDb2RlY0luZm8KLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIGNhbGxBcmJpdHJhcnlDb2RlY0luZm9GdW5jdGlvbihmZHAsIGEyZHBfY29kZWNfaW5mb19vcGVyYXRpb25zKTsKLSAgICAgICAgfX07Ci0KLSNlbmRpZiAgLy8gQlRfU1RBQ0tfRlVaWl9BMkRQX0NPREVDQ09ORklHX0ZVTkNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjQ29uZmlnRnV6ekhlbHBlcnMuaCBiL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0NvbmZpZ0Z1enpIZWxwZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YzNmYjcuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjQ29uZmlnRnV6ekhlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQlRfU1RBQ0tfRlVaWl9BMkRQX0NPREVDQ09ORklHX0hFTFBFUlNfSF8KLSNkZWZpbmUgQlRfU1RBQ0tfRlVaWl9BMkRQX0NPREVDQ09ORklHX0hFTFBFUlNfSF8KLQotLy8gTk9URTogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgZGlyZWN0bHkuCi0vLyAgICAgICBJdCBpcyBpbmNsdWRlZCBieSB0aGUgY29ycmVzcG9uZGluZyAiLi4uRnVuY3Rpb25zLmgiIGZpbGUuCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0jaW5jbHVkZSAiZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0luZm9GdXp6SGVscGVycy5oIgotCi0vLyBLZWVwIGEgdmVjdG9yIG9mIG91ciBpbml0aWFsaXplZCBjb2RlY19jb25maWcgb2JqZWN0cwotLy8gSXQgd2lsbCBiZSB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgdGhpcyBhcnJheSBhdCB0aGUgZW5kIG9mIGEgZnV6eiBsb29wCi1zdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjQ29uZmlnPj4gYTJkcF9jb2RlY19jb25maWdfdmVjdDsKLQotLy8gRnVuY3Rpb24gdG8gY2xlYW4gdXAgYW5kIGNsZWFyIG91ciBhbGxvY2F0ZWQgb2JqZWN0cwotdm9pZCBjbGVhbnVwQTJkcENvZGVjQ29uZmlnRnV6eigpIHsKLSAgYTJkcF9jb2RlY19jb25maWdfdmVjdC5jbGVhcigpOwotCi0gIC8vIENsZWFudXAgZGVwZW5kZW5jaWVzCi0gIGNsZWFudXBBMmRwQ29kZWNJbmZvRnV6eigpOwotfQotCi0jZW5kaWYgIC8vIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ0NPTkZJR19IRUxQRVJTX0hfCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNGdXp6RnVuY3Rpb25zLmggYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNGdXp6RnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWNkMzMuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjRnV6ekZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQlRfU1RBQ0tfRlVaWl9BMkRQX0NPREVDX0ZVTkNUSU9OU19IXwotI2RlZmluZSBCVF9TVEFDS19GVVpaX0EyRFBfQ09ERUNfRlVOQ1RJT05TX0hfCi0KLSNpbmNsdWRlIDxmY250bC5oPiAgLy8gRm9yIGZkCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBGb3IgZmQKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSGVscGVyRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0luZm9GdXp6RnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaCIKLQotI2luY2x1ZGUgImZ1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNGdXp6SGVscGVycy5oIgotCi0jZGVmaW5lIE1BWF9OVU1fUFJPUEVSVElFUyAxMjgKLSNkZWZpbmUgQTJEUF9NQVhfSU5JVF9SVU5TIDE2Ci0KLS8qIFRoaXMgaXMgYSB2ZWN0b3Igb2YgbGFtYmRhIGZ1bmN0aW9ucyB0aGUgZnV6emVyIHdpbGwgcHVsbCBmcm9tLgotICogIFRoaXMgaXMgZG9uZSBzbyBuZXcgZnVuY3Rpb25zIGNhbiBiZSBhZGRlZCB0byB0aGUgZnV6emVyIGVhc2lseQotICogIHdpdGhvdXQgcmVxdWlyaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1haW4gZnV6emVyIGZpbGUuIFRoaXMgYWxzbwotICogIGFsbG93cyBtdWx0aXBsZSBmdXp6ZXJzIHRvIGluY2x1ZGUgdGhpcyBmaWxlLCBpZiBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZC4KLSAqLwotc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciopPj4gYTJkcF9jb2RlY19vcGVyYXRpb25zID0gewotICAgIC8vIEEyZHBDb2RlY3MgQ29uc3RydWN0b3IKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAvLyBCdWlsZCBvdXQgYSB2ZWN0b3Igb2YgY29kZWMgb2JqZWN0cwotICAgICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY19wcmlvcml0aWVzOwotICAgICAgc2l6ZV90IG51bV9wcmlvcml0aWVzID0KLSAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfTlVNX1BST1BFUlRJRVMpOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fcHJpb3JpdGllczsgaSsrKSB7Ci0gICAgICAgIGNvZGVjX3ByaW9yaXRpZXMucHVzaF9iYWNrKGdldEFyYml0cmFyeUJ0YXZDb2RlY0NvbmZpZyhmZHApKTsKLSAgICAgIH0KLSAgICAgIC8vIENvbnN0cnVjdCBhIGNvbnN0IHJlZiBzbyB3ZSBjYW4gcGFzcyB0byBjb25zdHJ1Y3RvcgotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllc19jb25zdCA9Ci0gICAgICAgICAgY29kZWNfcHJpb3JpdGllczsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MoCi0gICAgICAgICAgbmV3IEEyZHBDb2RlY3MoY29kZWNfcHJpb3JpdGllc19jb25zdCkpOwotICAgICAgaWYgKGNvZGVjcykgewotICAgICAgICBhMmRwX2NvZGVjc192ZWN0LnB1c2hfYmFjayhjb2RlY3MpOwotICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBBMmRwQ29kZWNzIERlc3RydWN0b3IKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBpZiAoYTJkcF9jb2RlY3NfdmVjdC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8vIEdldCByYW5kb20gdmVjdG9yIGluZGV4Ci0gICAgICBzaXplX3QgaW5kZXggPQotICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGEyZHBfY29kZWNzX3ZlY3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAvLyBSZW1vdmUgZnJvbSB2ZWN0b3IKLSAgICAgIGEyZHBfY29kZWNzX3ZlY3QuZXJhc2UoYTJkcF9jb2RlY3NfdmVjdC5iZWdpbigpICsgaW5kZXgpOwotICAgIH0sCi0KLSAgICAvLyBpbml0Ci0gICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgLy8gTGltaXQgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHBlciBpdGVyYXRpb24KLSAgICAgIC8vIChUaGlzIGlzIHRvIHByZXZlbnQgc2xvdy11bml0cykKLSAgICAgIGlmIChhMmRwX2luaXRfcnVucyA8PSBBMkRQX01BWF9JTklUX1JVTlMpIHsKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY3M+IGNvZGVjcyA9Ci0gICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgICBpZiAoY29kZWNzKSB7Ci0gICAgICAgICAgYTJkcF9pbml0X3J1bnMrKzsKLSAgICAgICAgICBjb2RlY3MtPmluaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBmaW5kU291cmNlQ29kZWNDb25maWcKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjcz4gY29kZWNzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgdWludDhfdCogcF9jb2RlY19pbmZvID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIGZhbHNlKTsKLQotICAgICAgaWYgKGNvZGVjcyAmJiBwX2NvZGVjX2luZm8pIHsKLSAgICAgICAgY29kZWNzLT5maW5kU291cmNlQ29kZWNDb25maWcocF9jb2RlY19pbmZvKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gZmluZFNpbmtDb2RlY0NvbmZpZwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICB1aW50OF90KiBwX2NvZGVjX2luZm8gPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2luZm9fdmVjdCwgZmFsc2UpOwotCi0gICAgICBpZiAoY29kZWNzICYmIHBfY29kZWNfaW5mbykgewotICAgICAgICBjb2RlY3MtPmZpbmRTaW5rQ29kZWNDb25maWcocF9jb2RlY19pbmZvKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gaXNTdXBwb3J0ZWRDb2RlYwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzKSB7Ci0gICAgICAgIGNvZGVjcy0+aXNTdXBwb3J0ZWRDb2RlYyhnZXRBcmJpdHJhcnlCdGF2Q29kZWNJbmRleChmZHApKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gZ2V0Q3VycmVudENvZGVjQ29uZmlnCi0gICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgc3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY3M+IGNvZGVjcyA9Ci0gICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIGEyZHBfY29kZWNzX3ZlY3QsIGZhbHNlKTsKLSAgICAgIGlmIChjb2RlY3MpIHsKLSAgICAgICAgY29kZWNzLT5nZXRDdXJyZW50Q29kZWNDb25maWcoKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gb3JkZXJlZFNvdXJjZUNvZGVjcwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzKSB7Ci0gICAgICAgIGNvZGVjcy0+b3JkZXJlZFNvdXJjZUNvZGVjcygpOwotICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBvcmRlcmVkU2lua0NvZGVjcwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzKSB7Ci0gICAgICAgIGNvZGVjcy0+b3JkZXJlZFNpbmtDb2RlY3MoKTsKLSAgICAgIH0KLSAgICB9LAotCi0gICAgLy8gc2V0Q29kZWNDb25maWcKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjcz4gY29kZWNzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKGNvZGVjcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY29uc3QgdWludDhfdCogcGVlcl9jb2RlY19pbmZvID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIGZhbHNlKTsKLSAgICAgIGlmIChwZWVyX2NvZGVjX2luZm8gPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8vIENvZGVjX2NvbmZpZyBpcyBhY3R1YWxseSBzb21lIGJ1ZmZlcgotICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIHZvaWQgKCopKHZvaWQqKT4gcF9yZXN1bHRfY29kZWNfY29uZmlnKAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNhbGxvYyg1MDAsIHNpemVvZih1aW50OF90KSkpLCBmcmVlKTsKLSAgICAgIGlmIChwX3Jlc3VsdF9jb2RlY19jb25maWcpIHsKLSAgICAgICAgY29kZWNzLT5zZXRDb2RlY0NvbmZpZyhwZWVyX2NvZGVjX2luZm8sIGZkcC0+Q29uc3VtZUJvb2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Jlc3VsdF9jb2RlY19jb25maWcuZ2V0KCksIGZkcC0+Q29uc3VtZUJvb2woKSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIC8vIHNldFNpbmtDb2RlY0NvbmZpZwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBjb25zdCB1aW50OF90KiBwZWVyX2NvZGVjX2luZm8gPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2luZm9fdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKHBlZXJfY29kZWNfaW5mbyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gQ29kZWNfY29uZmlnIGlzIGFjdHVhbGx5IHNvbWUgYnVmZmVyCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgdm9pZCAoKikodm9pZCopPiBwX3Jlc3VsdF9jb2RlY19jb25maWcoCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY2FsbG9jKDUwMCwgc2l6ZW9mKHVpbnQ4X3QpKSksIGZyZWUpOwotICAgICAgaWYgKHBfcmVzdWx0X2NvZGVjX2NvbmZpZykgewotICAgICAgICBjb2RlY3MtPnNldFNpbmtDb2RlY0NvbmZpZyhwZWVyX2NvZGVjX2luZm8sIGZkcC0+Q29uc3VtZUJvb2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHRfY29kZWNfY29uZmlnLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVCb29sKCkpOwotICAgICAgfQotICAgIH0sCi0KLSAgICAvLyBzZXRDb2RlY1VzZXJDb25maWcKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjcz4gY29kZWNzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKGNvZGVjcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvZGVjX3VzZXJfY29uZmlnID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlCdGF2Q29kZWNDb25maWcoZmRwKTsKLSAgICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwX3BlZXJfcGFyYW1zID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlBMmRwRW5jb2RlckluaXRQZWVyUGFyYW1zKGZkcCk7Ci0gICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2luZm9fdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKHBfcGVlcl9zaW5rX2NhcGFiaWxpdGllcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gQ3JhZnQgb3VyIHJlc3VsdCB2YXJpYWJsZXMgKEFuZCBwb3NzaWJseSBwYXNzIG51bGxwdHJzKQotICAgICAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IHJlc3VsdF9jb2RlY19jb25maWc7Ci0gICAgICBib29sIHJlc3RhcnRfaW5wdXQsIHJlc3RhcnRfb3V0cHV0LCBjb25maWdfdXBkYXRlZDsKLSAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZyA9Ci0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnJlc3VsdF9jb2RlY19jb25maWcpOwotICAgICAgY29kZWNzLT5zZXRDb2RlY1VzZXJDb25maWcoY29kZWNfdXNlcl9jb25maWcsICZwX3BlZXJfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wZWVyX3NpbmtfY2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHRfY29kZWNfY29uZmlnLCAmcmVzdGFydF9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN0YXJ0X291dHB1dCwgJmNvbmZpZ191cGRhdGVkKTsKLSAgICB9LAotCi0gICAgLy8gc2V0Q29kZWNBdWRpb0NvbmZpZwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfYXVkaW9fY29uZmlnID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlCdGF2Q29kZWNDb25maWcoZmRwKTsKLSAgICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwX3BlZXJfcGFyYW1zID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlBMmRwRW5jb2RlckluaXRQZWVyUGFyYW1zKGZkcCk7Ci0gICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2luZm9fdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKHBfcGVlcl9zaW5rX2NhcGFiaWxpdGllcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCByZXN1bHRfY29kZWNfY29uZmlnOwotICAgICAgdWludDhfdCogcF9yZXN1bHRfY29kZWNfY29uZmlnID0KLSAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmcmVzdWx0X2NvZGVjX2NvbmZpZyk7Ci0gICAgICBib29sIHBfcmVzdGFydF9vdXRwdXQsIHBfY29uZmlnX3VwZGF0ZWQ7Ci0gICAgICBjb2RlY3MtPnNldENvZGVjQXVkaW9Db25maWcoCi0gICAgICAgICAgY29kZWNfYXVkaW9fY29uZmlnLCAmcF9wZWVyX3BhcmFtcywgcF9wZWVyX3NpbmtfY2FwYWJpbGl0aWVzLAotICAgICAgICAgIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywgJnBfcmVzdGFydF9vdXRwdXQsICZwX2NvbmZpZ191cGRhdGVkKTsKLSAgICB9LAotCi0gICAgLy8gc2V0Q29kZWNPdGFDb25maWcKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjcz4gY29kZWNzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKGNvZGVjcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY29uc3QgdWludDhfdCogcF9vdGFfY29kZWNfY29uZmlnID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIGZhbHNlKTsKLSAgICAgIGlmIChwX290YV9jb2RlY19jb25maWcgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwX3BlZXJfcGFyYW1zID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlBMmRwRW5jb2RlckluaXRQZWVyUGFyYW1zKGZkcCk7Ci0gICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgcmVzdWx0X2NvZGVjX2NvbmZpZzsKLSAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZyA9Ci0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnJlc3VsdF9jb2RlY19jb25maWcpOwotICAgICAgYm9vbCBwX3Jlc3RhcnRfaW5wdXQsIHBfcmVzdGFydF9vdXRwdXQsIHBfY29uZmlnX3VwZGF0ZWQ7Ci0gICAgICBjb2RlY3MtPnNldENvZGVjT3RhQ29uZmlnKHBfb3RhX2NvZGVjX2NvbmZpZywgJnBfcGVlcl9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywgJnBfcmVzdGFydF9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfcmVzdGFydF9vdXRwdXQsICZwX2NvbmZpZ191cGRhdGVkKTsKLSAgICB9LAotCi0gICAgLy8gc2V0UGVlclNpbmtDb2RlY0NhcGFiaWxpdGllcwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIGZhbHNlKTsKLSAgICAgIGlmIChwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgY29kZWNzLT5zZXRQZWVyU2lua0NvZGVjQ2FwYWJpbGl0aWVzKHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpOwotICAgIH0sCi0KLSAgICAvLyBzZXRQZWVyU291cmNlQ29kZWNDYXBhYmlsaXRpZXMKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjcz4gY29kZWNzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKGNvZGVjcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcyA9Ci0gICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIGEyZHBfY29kZWNfaW5mb192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAocF9wZWVyX2NvZGVjX2NhcGFiaWxpdGllcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGNvZGVjcy0+c2V0UGVlclNvdXJjZUNvZGVjQ2FwYWJpbGl0aWVzKHBfcGVlcl9jb2RlY19jYXBhYmlsaXRpZXMpOwotICAgIH0sCi0KLSAgICAvLyBnZXRDb2RlY0NvbmZpZ0FuZENhcGFiaWxpdGllcwotICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBMmRwQ29kZWNzPiBjb2RlY3MgPQotICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjc192ZWN0LCBmYWxzZSk7Ci0gICAgICBpZiAoY29kZWNzID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBSZXR1cm4gb2JqZWN0cwotICAgICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzOwotICAgICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiBjb2RlY3Nfc2VsZWN0YWJsZV9jYXBhYmlsaXRpZXM7Ci0gICAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnOwotICAgICAgY29kZWNzLT5nZXRDb2RlY0NvbmZpZ0FuZENhcGFiaWxpdGllcygmY29kZWNfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcyk7Ci0gICAgfSwKLQotICAgIC8vIGRlYnVnX2NvZGVjX2R1bXAKLSAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8QTJkcENvZGVjcz4gY29kZWNzID0KLSAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY3NfdmVjdCwgZmFsc2UpOwotICAgICAgaWYgKGNvZGVjcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gRHVtcCB0aGlzIHRvIC9kZXYvbnVsbAotICAgICAgaW50IGZkID0gb3BlbigiL2Rldi9udWxsIiwgT19XUk9OTFkpOwotICAgICAgY29kZWNzLT5kZWJ1Z19jb2RlY19kdW1wKGZkKTsKLSAgICAgIGNsb3NlKGZkKTsKLSAgICB9LAotCi0gICAgLy8gU2luY2Ugd2UncmUgZGVwZW5kZW50IG9uIGhhdmluZyB2YWxpZCBjb2RlY19pbmZvIG9iamVjdHMsCi0gICAgLy8gaGF2ZSBhIGNoYW5nZSB0byBjYWxsIGZ1enogZnVuY3Rpb25zIGZvciB0aGF0Ci0gICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgY2FsbEFyYml0cmFyeUNvZGVjSW5mb0Z1bmN0aW9uKGZkcCwgYTJkcF9jb2RlY19pbmZvX29wZXJhdGlvbnMpOwotICAgIH19OwotCi0jZW5kaWYgIC8vIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ19GVU5DVElPTlNfSF8KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0Z1enpIZWxwZXJzLmggYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNGdXp6SGVscGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMyYmUwLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0Z1enpIZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ19IRUxQRVJTX0hfCi0jZGVmaW5lIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ19IRUxQRVJTX0hfCi0KLS8vIE5PVEU6IFRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGRpcmVjdGx5LgotLy8gICAgICAgSXQgaXMgaW5jbHVkZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgIi4uLkZ1bmN0aW9ucy5oIiBmaWxlLgotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgImZ1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNJbmZvRnV6ekhlbHBlcnMuaCIKLQotLy8gS2VlcCBhIHZlY3RvciBvZiBhbnkgYWxsb2NhdGVkIEEyZHBDb2RlY3Mgb2JqZWN0cy4KLS8vIEl0IHdpbGwgYmUgdXAgdG8gdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgYXJyYXkgYXQgdGhlIGVuZCBvZiBhIGZ1enogbG9vcAotc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEEyZHBDb2RlY3M+PiBhMmRwX2NvZGVjc192ZWN0OwotCi11aW50MTZfdCBhMmRwX2luaXRfcnVucyA9IDA7Ci0KLS8vIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIGFuZCBjbGVhciBvdXIgYWxsb2NhdGVkIG9iamVjdHMKLXZvaWQgY2xlYW51cEEyZHBDb2RlY0Z1enooKSB7Ci0gIC8vIENsZWFuIHVwIG91ciB2ZWN0b3IKLSAgYTJkcF9jb2RlY3NfdmVjdC5jbGVhcigpOwotCi0gIC8vIFJlc2V0IHRoZSBudW1iZXIgb2YgdGltZXMgd2UndmUgY2FsbGVkIGluaXQKLSAgYTJkcF9pbml0X3J1bnMgPSAwOwotCi0gIC8vIENsZWFuIHVwIGRlcGVuZGVuY2llcwotICBjbGVhbnVwQTJkcENvZGVjSW5mb0Z1enooKTsKLX0KLQotI2VuZGlmICAvLyBCVF9TVEFDS19GVVpaX0EyRFBfQ09ERUNfSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSGVscGVyRnVuY3Rpb25zLmggYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNIZWxwZXJGdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4ODdlMC4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNIZWxwZXJGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEEyRFBfQ09ERUNfSEVMUEVSRlVOQ1RJT05TX0hfCi0jZGVmaW5lIEEyRFBfQ09ERUNfSEVMUEVSRlVOQ1RJT05TX0hfCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi1zdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3Q+IENPREVDX0lOREVYX0VOVU1fVkFMUyA9Ci0gICAge0JUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUlOLAotICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQywKLSAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUMsCi0gICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWCwKLSAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hELAotICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUMsCi0gICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUFYLAotICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19NSU4sCi0gICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX1NCQywKLSAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfQUFDLAotICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19MREFDLAotICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19NQVgsCi0gICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NSU4sCi0gICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVh9OwotCi1zdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3Q+Ci0gICAgQ09ERUNfUFJJT1JJVFlfRU5VTV9WQUxTID0ge0JUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19QUklPUklUWV9ISUdIRVNUfTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90PgotICAgIENPREVDX1NBTVBMRVJBVEVfRU5VTV9WQUxTID0gewotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfTk9ORSwgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDQxMDAsCi0gICAgICAgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV80ODAwMCwgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMCwKLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwLCAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE3NjQwMCwKLSAgICAgICAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE5MjAwMCwgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzE2MDAwLAotICAgICAgICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMjQwMDB9OwotCi1zdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90PgotICAgIENPREVDX0JQU19FTlVNX1ZBTFMgPSB7QlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzMyfTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdD4KLSAgICBDT0RFQ19DSEFOTkVMTU9ERV9FTlVNX1ZBTFMgPSB7QlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfQ0hBTk5FTF9NT0RFX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPfTsKLQotLy8gQ29uc3RydWN0IGEgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3Qgb2JqZWN0Ci1idGF2X2EyZHBfY29kZWNfaW5kZXhfdCBnZXRBcmJpdHJhcnlCdGF2Q29kZWNJbmRleChGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICByZXR1cm4gQ09ERUNfSU5ERVhfRU5VTV9WQUxTLmF0KAotICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgQ09ERUNfSU5ERVhfRU5VTV9WQUxTLnNpemUoKSAtIDEpKTsKLX0KLQotLy8gQ29uc3RydWN0IGEgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3Qgb2JqZWN0Ci1idGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBnZXRBcmJpdHJhcnlCdGF2Q29kZWNQcmlvcml0eSgKLSAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICByZXR1cm4gQ09ERUNfUFJJT1JJVFlfRU5VTV9WQUxTLmF0KGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAotICAgICAgMCwgQ09ERUNfUFJJT1JJVFlfRU5VTV9WQUxTLnNpemUoKSAtIDEpKTsKLX0KLS8vIENvbnN0cnVjdCBhIGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IG9iamVjdAotYnRhdl9hMmRwX2NvZGVjX3NhbXBsZV9yYXRlX3QgZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjU2FtcGxlUmF0ZSgKLSAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICByZXR1cm4gQ09ERUNfU0FNUExFUkFURV9FTlVNX1ZBTFMuYXQoZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCi0gICAgICAwLCBDT0RFQ19TQU1QTEVSQVRFX0VOVU1fVkFMUy5zaXplKCkgLSAxKSk7Ci19Ci0vLyBDb25zdHJ1Y3QgYSBidGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3Qgb2JqZWN0Ci1idGF2X2EyZHBfY29kZWNfYml0c19wZXJfc2FtcGxlX3QgZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjQml0c1BlclNhbXBsZSgKLSAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICByZXR1cm4gQ09ERUNfQlBTX0VOVU1fVkFMUy5hdCgKLSAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIENPREVDX0JQU19FTlVNX1ZBTFMuc2l6ZSgpIC0gMSkpOwotfQotLy8gQ29uc3RydWN0IGEgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IG9iamVjdAotYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGdldEFyYml0cmFyeUJ0YXZDb2RlY0NoYW5uZWxNb2RlKAotICAgIEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHJldHVybiBDT0RFQ19DSEFOTkVMTU9ERV9FTlVNX1ZBTFMuYXQoZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCi0gICAgICAwLCBDT0RFQ19DSEFOTkVMTU9ERV9FTlVNX1ZBTFMuc2l6ZSgpIC0gMSkpOwotfQotLy8gQ29uc3RydWN0IGEgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IG9iamVjdAotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGdldEFyYml0cmFyeUJ0YXZDb2RlY0NvbmZpZyhGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnOwotCi0gIGNvbmZpZy5jb2RlY190eXBlID0gZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjSW5kZXgoZmRwKTsKLSAgY29uZmlnLmNvZGVjX3ByaW9yaXR5ID0gZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjUHJpb3JpdHkoZmRwKTsKLSAgY29uZmlnLnNhbXBsZV9yYXRlID0gZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjU2FtcGxlUmF0ZShmZHApOwotICBjb25maWcuYml0c19wZXJfc2FtcGxlID0gZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjQml0c1BlclNhbXBsZShmZHApOwotICBjb25maWcuY2hhbm5lbF9tb2RlID0gZ2V0QXJiaXRyYXJ5QnRhdkNvZGVjQ2hhbm5lbE1vZGUoZmRwKTsKLSAgY29uZmlnLmNvZGVjX3NwZWNpZmljXzEgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOwotICBjb25maWcuY29kZWNfc3BlY2lmaWNfMiA9IGZkcC0+Q29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7Ci0gIGNvbmZpZy5jb2RlY19zcGVjaWZpY18zID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKLSAgY29uZmlnLmNvZGVjX3NwZWNpZmljXzQgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOwotCi0gIHJldHVybiBjb25maWc7Ci19Ci0KLXRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBnZXRBcmJpdHJhcnlBMmRwRW5jb2RlckluaXRQZWVyUGFyYW1zKAotICAgIEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyBwYXJhbXM7Ci0KLSAgcGFyYW1zLmlzX3BlZXJfZWRyID0gZmRwLT5Db25zdW1lQm9vbCgpOwotICBwYXJhbXMucGVlcl9zdXBwb3J0c18zbWJwcyA9IGZkcC0+Q29uc3VtZUJvb2woKTsKLSAgcGFyYW1zLnBlZXJfbXR1ID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7Ci0KLSAgcmV0dXJuIHBhcmFtczsKLX0KLQotI2RlZmluZSBNQVhfQlRIRFJfU0laRSAxMDI0Ci1zdGQ6OnNoYXJlZF9wdHI8QlRfSERSPiBnZXRBcmJpdHJhcnlCdEhkcihGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICAvLyBCdWlsZCBhIGRhdGEgYnVmZmVyCi0gIHNpemVfdCBidWZfc2l6ZSA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9CVEhEUl9TSVpFKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXMgPSBmZHAtPkNvbnN1bWVCeXRlczx1aW50OF90PihidWZfc2l6ZSk7Ci0KLSAgaWYgKGJ5dGVzLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHVpbnQxNl90IGhkcl9zaXplID0gYnl0ZXMuc2l6ZSgpICsgc2l6ZW9mKEJUX0hEUik7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxCVF9IRFI+IGJ0X2hkcigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QlRfSERSKj4oY2FsbG9jKGhkcl9zaXplLCBzaXplb2YodWludDhfdCkpKSwgZnJlZSk7Ci0KLSAgYnRfaGRyLT5ldmVudCA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOwotICBidF9oZHItPmxlbiA9IGJ5dGVzLnNpemUoKTsKLSAgYnRfaGRyLT5vZmZzZXQgPQotICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQxNl90PigwLCBoZHJfc2l6ZSAtIHNpemVvZihCVF9IRFIpKTsKLSAgYnRfaGRyLT5sYXllcl9zcGVjaWZpYyA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOwotICBzdGQ6OmNvcHkoYnl0ZXMuYmVnaW4oKSwgYnl0ZXMuZW5kKCksIGJ0X2hkci0+ZGF0YSk7Ci0KLSAgcmV0dXJuIGJ0X2hkcjsKLX0KLQotI2luY2x1ZGUgImJ0YS9hdi9idGFfYXZfaW50LmgiCi10QlRfQTJEUF9PRkZMT0FEIGdlbmVyYXRlQXJiaXRyYXJ5dEEyZHBPZmZsb2FkKEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHRCVF9BMkRQX09GRkxPQUQgcmV0dmFsOwotCi0gIHJldHZhbC5jb2RlY190eXBlID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7Ci0gIHJldHZhbC5tYXhfbGF0ZW5jeSA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY21zX3RfZW5hYmxlID0gZmRwLT5Db25zdW1lQnl0ZXM8dWludDhfdD4oMik7Ci0gIG1lbWNweSgmcmV0dmFsLnNjbXNfdF9lbmFibGVbMF0sIHNjbXNfdF9lbmFibGUuZGF0YSgpLCBzY21zX3RfZW5hYmxlLnNpemUoKSk7Ci0gIHJldHZhbC5zYW1wbGVfcmF0ZSA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOwotICByZXR2YWwuYml0c19wZXJfc2FtcGxlID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKLSAgcmV0dmFsLmNoX21vZGUgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpOwotICByZXR2YWwuZW5jb2RlZF9hdWRpb19iaXRyYXRlID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7Ci0gIHJldHZhbC5hY2xfaGRsID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7Ci0gIHJldHZhbC5sMmNfcmNpZCA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOwotICByZXR2YWwubXR1ID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29kZWNfaW5mb19ieXRlcyA9IGZkcC0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KDMyKTsKLSAgbWVtY3B5KCZyZXR2YWwuY29kZWNfaW5mb1swXSwgY29kZWNfaW5mb19ieXRlcy5kYXRhKCksCi0gICAgICAgICBjb2RlY19pbmZvX2J5dGVzLnNpemUoKSk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotI2VuZGlmICAvLyBBMkRQX0NPREVDX0hFTFBFUkZVTkNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSW5mb0Z1enpGdW5jdGlvbnMuaCBiL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0luZm9GdXp6RnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzVkNzEuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSW5mb0Z1enpGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ0lORk9fRlVOQ1RJT05TX0hfCi0jZGVmaW5lIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ0lORk9fRlVOQ1RJT05TX0hfCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJhMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgImZ1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNIZWxwZXJGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSW5mb0Z1enpIZWxwZXJzLmgiCi0jaW5jbHVkZSAiZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0jZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAyMDQ4Ci0KLS8qIFRoaXMgaXMgYSB2ZWN0b3Igb2YgbGFtYmRhIGZ1bmN0aW9ucyB0aGUgZnV6emVyIHdpbGwgcHVsbCBmcm9tLgotICogIFRoaXMgaXMgZG9uZSBzbyBuZXcgZnVuY3Rpb25zIGNhbiBiZSBhZGRlZCB0byB0aGUgZnV6emVyIGVhc2lseQotICogIHdpdGhvdXQgcmVxdWlyaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1haW4gZnV6emVyIGZpbGUuIFRoaXMgYWxzbwotICogIGFsbG93cyBtdWx0aXBsZSBmdXp6ZXJzIHRvIGluY2x1ZGUgdGhpcyBmaWxlLCBpZiBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZC4KLSAqLwotc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciosIHVpbnQ4X3QqKT4+Ci0gICAgYTJkcF9jb2RlY19pbmZvX29wZXJhdGlvbnMgPSB7Ci0gICAgICAgIC8vIEEyRFBfSW5pdERlZmF1bHRDb2RlYwotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCopIC0+IHZvaWQgewotICAgICAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBhIG5ldyBjb2RlYyAmIGFkZCBpdCB0byBvdXIgdHJhY2tpbmcgdmVjdG9yCi0gICAgICAgICAgdWludDhfdCogY29kZWNfaW5mbyA9IG5ldyB1aW50OF90W0FWRFRfQ09ERUNfU0laRV07Ci0gICAgICAgICAgYTJkcF9jb2RlY19pbmZvX3ZlY3QucHVzaF9iYWNrKGNvZGVjX2luZm8pOwotCi0gICAgICAgICAgQTJEUF9Jbml0RGVmYXVsdENvZGVjKGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIERlbGV0ZSBhIGNvZGVjX2luZm8gb2JqZWN0Ci0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KikgLT4gdm9pZCB7Ci0gICAgICAgICAgaWYgKGEyZHBfY29kZWNfaW5mb192ZWN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gR2V0IHJhbmRvbSB2ZWN0b3IgaW5kZXgKLSAgICAgICAgICBzaXplX3QgaW5kZXggPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKLSAgICAgICAgICAgICAgMCwgYTJkcF9jb2RlY19pbmZvX3ZlY3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgLy8gZGVsZXRlIGNvZGVjCi0gICAgICAgICAgZGVsZXRlIGEyZHBfY29kZWNfaW5mb192ZWN0LmF0KGluZGV4KTsKLSAgICAgICAgICAvLyBSZW1vdmUgZnJvbSB2ZWN0b3IKLSAgICAgICAgICBhMmRwX2NvZGVjX2luZm9fdmVjdC5lcmFzZShhMmRwX2NvZGVjX2luZm9fdmVjdC5iZWdpbigpICsgaW5kZXgpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfR2V0Q29kZWNUeXBlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0dldENvZGVjVHlwZShjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0lzU291cmNlQ29kZWNWYWxpZAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Jc1NpbmtDb2RlY1ZhbGlkCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0lzU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfSXNQZWVyU291cmNlQ29kZWNTdXBwb3J0ZWQKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsIHVpbnQ4X3QqIGNvZGVjX2luZm8pIC0+IHZvaWQgewotICAgICAgICAgIEEyRFBfSXNQZWVyU291cmNlQ29kZWNTdXBwb3J0ZWQoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Vc2VzUnRwSGVhZGVyCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX1VzZXNSdHBIZWFkZXIoZmRwLT5Db25zdW1lQm9vbCgpLCBjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0dldE1lZGlhVHlwZQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9HZXRNZWRpYVR5cGUoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Db2RlY05hbWUKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsIHVpbnQ4X3QqIGNvZGVjX2luZm8pIC0+IHZvaWQgewotICAgICAgICAgIEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfQ29kZWNUeXBlRXF1YWxzCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICB1aW50OF90KiBjb2RlY19pbmZvXzIgPQotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIGZhbHNlKTsKLSAgICAgICAgICBpZiAoY29kZWNfaW5mb18yKSB7Ci0gICAgICAgICAgICBBMkRQX0NvZGVjVHlwZUVxdWFscyhjb2RlY19pbmZvLCBjb2RlY19pbmZvXzIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0NvZGVjRXF1YWxzCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICB1aW50OF90KiBjb2RlY19pbmZvXzIgPQotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgYTJkcF9jb2RlY19pbmZvX3ZlY3QsIGZhbHNlKTsKLSAgICAgICAgICBpZiAoY29kZWNfaW5mb18yKSB7Ci0gICAgICAgICAgICBBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm8sIGNvZGVjX2luZm9fMik7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0dldFRyYWNrU2FtcGxlUmF0ZShjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0dldFRyYWNrQml0c1BlclNhbXBsZQotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9HZXRUcmFja0JpdHNQZXJTYW1wbGUoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0dldFNpbmtUcmFja0NoYW5uZWxUeXBlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0dldFNpbmtUcmFja0NoYW5uZWxUeXBlKGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfR2V0UGFja2V0VGltZXN0YW1wCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXBfcmV0dmFsOwotICAgICAgICAgIHNpemVfdCBwYWNrZXRfc2l6ZSA9Ci0gICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9QQUNLRVRfU0laRSk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXMgPSBmZHAtPkNvbnN1bWVCeXRlczx1aW50OF90PihwYWNrZXRfc2l6ZSk7Ci0gICAgICAgICAgLy8gVGltZXN0YW1wIHdpbGwgZmFpbCBpZiBwX2RhdGEgaXMgPCA0IGJ5dGVzLCBkdWUgdG8gYSBjYXN0ICYgZGVyZWYKLSAgICAgICAgICAvLyB0byBhIHVpbnQzMl90KgotICAgICAgICAgIGlmIChieXRlcy5zaXplKCkgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSA9IGJ5dGVzLmRhdGEoKTsKLQotICAgICAgICAgIEEyRFBfR2V0UGFja2V0VGltZXN0YW1wKGNvZGVjX2luZm8sIHBfZGF0YSwgJnRpbWVzdGFtcF9yZXR2YWwpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfQnVpbGRDb2RlY0hlYWRlcgotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJUX0hEUj4gcF9idWYgPSBnZXRBcmJpdHJhcnlCdEhkcihmZHApOwotICAgICAgICAgIGlmIChwX2J1ZikgewotICAgICAgICAgICAgdWludDE2X3QgZnJhbWVzX3Blcl9wYWNrZXQgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgICAgICAgICAgIEEyRFBfQnVpbGRDb2RlY0hlYWRlcihjb2RlY19pbmZvLCBwX2J1Zi5nZXQoKSwgZnJhbWVzX3Blcl9wYWNrZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0dldEVuY29kZXJJbnRlcmZhY2UKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsIHVpbnQ4X3QqIGNvZGVjX2luZm8pIC0+IHZvaWQgewotICAgICAgICAgIEEyRFBfR2V0RW5jb2RlckludGVyZmFjZShjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0dldERlY29kZXJJbnRlcmZhY2UKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsIHVpbnQ4X3QqIGNvZGVjX2luZm8pIC0+IHZvaWQgewotICAgICAgICAgIEEyRFBfR2V0RGVjb2RlckludGVyZmFjZShjb2RlY19pbmZvKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBBMkRQX0FkanVzdENvZGVjCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0FkanVzdENvZGVjKGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfU291cmNlQ29kZWNJbmRleAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgdWludDhfdCogY29kZWNfaW5mbykgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9Tb3VyY2VDb2RlY0luZGV4KGNvZGVjX2luZm8pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfU2lua0NvZGVjSW5kZXgKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsIHVpbnQ4X3QqIGNvZGVjX2luZm8pIC0+IHZvaWQgewotICAgICAgICAgIEEyRFBfU2lua0NvZGVjSW5kZXgoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Db2RlY0luZGV4U3RyCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KikgLT4gdm9pZCB7Ci0gICAgICAgICAgQTJEUF9Db2RlY0luZGV4U3RyKGdldEFyYml0cmFyeUJ0YXZDb2RlY0luZGV4KGZkcCkpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIEEyRFBfSW5pdENvZGVjQ29uZmlnCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KikgLT4gdm9pZCB7Ci0gICAgICAgICAgQXZkdHBTZXBDb25maWcgY2ZnX3JldHZhbDsKLSAgICAgICAgICBBMkRQX0luaXRDb2RlY0NvbmZpZyhnZXRBcmJpdHJhcnlCdGF2Q29kZWNJbmRleChmZHApLCAmY2ZnX3JldHZhbCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9HZXRFZWNvZGVyRWZmZWN0aXZlRnJhbWVTaXplCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50OF90KiBjb2RlY19pbmZvKSAtPiB2b2lkIHsKLSAgICAgICAgICBBMkRQX0dldEVlY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoY29kZWNfaW5mbyk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gQTJEUF9Db2RlY0luZm9TdHJpbmcKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsIHVpbnQ4X3QqIGNvZGVjX2luZm8pIC0+IHZvaWQgewotICAgICAgICAgIEEyRFBfQ29kZWNJbmZvU3RyaW5nKGNvZGVjX2luZm8pOwotICAgICAgICB9fTsKLQotI2VuZGlmICAvLyBCVF9TVEFDS19GVVpaX0EyRFBfQ09ERUNJTkZPX0ZVTkNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvYTJkcENvZGVjSW5mb0Z1enpIZWxwZXJzLmggYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNJbmZvRnV6ekhlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0Y2FiZC4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNJbmZvRnV6ekhlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQlRfU1RBQ0tfRlVaWl9BMkRQX0NPREVDSU5GT19IRUxQRVJTX0hfCi0jZGVmaW5lIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ0lORk9fSEVMUEVSU19IXwotCi0vLyBOT1RFOiBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBkaXJlY3RseS4KLS8vICAgICAgIEl0IGlzIGluY2x1ZGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nICIuLi5GdW5jdGlvbnMuaCIgZmlsZS4KLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImEyZHBfY29kZWNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svdGVzdC9mdXp6ZXJzL2NvbW1vbi9jb21tb25GdXp6SGVscGVycy5oIgotCi0vLyBLZWVwIGEgdmVjdG9yIG9mIGFueSBhbGxvY2F0ZWQgY29kZWNfaW5mbyBvYmplY3RzLgotLy8gSXQgd2lsbCBiZSB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgdGhpcyBhcnJheSBhdCB0aGUgZW5kIG9mIGEgZnV6eiBsb29wCi1zdGQ6OnZlY3Rvcjx1aW50OF90Kj4gYTJkcF9jb2RlY19pbmZvX3ZlY3Q7Ci0KLS8vIENhbGxzIGEgZnVuY3Rpb24gZnJvbSB0aGUgb3BzX3ZlY3Rvcgotdm9pZCBjYWxsQXJiaXRyYXJ5Q29kZWNJbmZvRnVuY3Rpb24oCi0gICAgRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciosIHVpbnQ4X3QqKT4+Ci0gICAgICAgIG9wc192ZWN0b3IpIHsKLSAgLy8gQ2hvb3NlIHdoaWNoIGZ1bmN0aW9uIHdlJ2xsIGJlIGNhbGxpbmcKLSAgdWludDhfdCBmdW5jdGlvbl9pZCA9Ci0gICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgb3BzX3ZlY3Rvci5zaXplKCkgLSAxKTsKLQotICAvLyBHZXQgYSBpbmZvIG9iamVjdAotICB1aW50OF90KiBjb2RlY19pbmZvID0KLSAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBhMmRwX2NvZGVjX2luZm9fdmVjdCwgZmFsc2UpOwotCi0gIC8vIE1vc3QgZnVuY3Rpb25zIHJlcXVpcmUgYSB2YWxpZCBjb2RlY19pbmZvCi0gIGlmIChjb2RlY19pbmZvIHx8IGZ1bmN0aW9uX2lkID09IDAgfHwgZnVuY3Rpb25faWQgPT0gMjUgfHwKLSAgICAgIGZ1bmN0aW9uX2lkID09IDI2KSB7Ci0gICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gd2UndmUgY2hvc2VuCi0gICAgb3BzX3ZlY3RvcltmdW5jdGlvbl9pZF0oZmRwLCBjb2RlY19pbmZvKTsKLSAgfQotfQotCi0vLyBGdW5jdGlvbiB0byBjbGVhbiB1cCBhbmQgY2xlYXIgb3VyIGFsbG9jYXRlZCBvYmplY3RzCi12b2lkIGNsZWFudXBBMmRwQ29kZWNJbmZvRnV6eigpIHsKLSAgZm9yIChhdXRvIGl0IDogYTJkcF9jb2RlY19pbmZvX3ZlY3QpIHsKLSAgICBpZiAoaXQgIT0gbnVsbHB0cikgewotICAgICAgZGVsZXRlIGl0OwotICAgIH0KLSAgfQotICBhMmRwX2NvZGVjX2luZm9fdmVjdC5jbGVhcigpOwotfQotCi0jZW5kaWYgIC8vIEJUX1NUQUNLX0ZVWlpfQTJEUF9DT0RFQ0lORk9fSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvZnV6el9hMmRwX2NvZGVjLmNjIGIvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvZnV6el9hMmRwX2NvZGVjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQyMDEzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2Z1enpfYTJkcF9jb2RlYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSAiZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0Z1enpGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL2NvbW1vbi9jb21tb25GdXp6SGVscGVycy5oIgotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIERhdGEsIHNpemVfdCBTaXplKSB7Ci0gIC8vIEluaXQgb3VyIHdyYXBwZXIKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlcihEYXRhLCBTaXplKTsKLQotICAvLyBDYWxsIHNvbWUgZnVuY3Rpb25zCi0gIHdoaWxlIChkYXRhUHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkgPiAwKSB7Ci0gICAgY2FsbEFyYml0cmFyeUZ1bmN0aW9uKCZkYXRhUHJvdmlkZXIsIGEyZHBfY29kZWNfb3BlcmF0aW9ucyk7Ci0gIH0KLQotICAvLyBDbGVhbnVwIG91ciBzdGF0ZQotICBjbGVhbnVwQTJkcENvZGVjRnV6eigpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvZnV6el9hMmRwX2NvZGVjX2NvbmZpZy5jYyBiL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2Z1enpfYTJkcF9jb2RlY19jb25maWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Y2FjMjYuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvZnV6el9hMmRwX2NvZGVjX2NvbmZpZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSAiZnV6emVycy9hMmRwL2NvZGVjL2EyZHBDb2RlY0NvbmZpZ0Z1enpGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL2NvbW1vbi9jb21tb25GdXp6SGVscGVycy5oIgotCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIERhdGEsIHNpemVfdCBTaXplKSB7Ci0gIC8vIEluaXQgb3VyIHdyYXBwZXIKLSAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlcihEYXRhLCBTaXplKTsKLQotICAvLyBDYWxsIHNvbWUgZnVuY3Rpb25zCi0gIHdoaWxlIChkYXRhUHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkgPiAwKSB7Ci0gICAgY2FsbEFyYml0cmFyeUZ1bmN0aW9uKCZkYXRhUHJvdmlkZXIsIGEyZHBfY29kZWNfY29uZmlnX29wZXJhdGlvbnMpOwotICB9Ci0KLSAgLy8gQ2xlYW51cCBvdXIgc3RhdGUKLSAgY2xlYW51cEEyZHBDb2RlY0NvbmZpZ0Z1enooKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZnV6emVycy9hMmRwL2NvZGVjL2Z1enpfYTJkcF9jb2RlY19pbmZvLmNjIGIvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvZnV6el9hMmRwX2NvZGVjX2luZm8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZWFjYzguLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvY29kZWMvZnV6el9hMmRwX2NvZGVjX2luZm8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotI2luY2x1ZGUgImZ1enplcnMvYTJkcC9jb2RlYy9hMmRwQ29kZWNJbmZvRnV6ekZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgImZ1enplcnMvY29tbW9uL2NvbW1vbkZ1enpIZWxwZXJzLmgiCi0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIENhbGwgc29tZSBmdW5jdGlvbnMKLSAgd2hpbGUgKGRhdGFQcm92aWRlci5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKLSAgICBjYWxsQXJiaXRyYXJ5Q29kZWNJbmZvRnVuY3Rpb24oJmRhdGFQcm92aWRlciwgYTJkcF9jb2RlY19pbmZvX29wZXJhdGlvbnMpOwotICB9Ci0KLSAgLy8gQ2xlYW51cCBvdXIgc3RhdGUKLSAgY2xlYW51cEEyZHBDb2RlY0luZm9GdXp6KCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9mdXp6X2EyZHAuY2MgYi9zdGFjay90ZXN0L2Z1enplcnMvYTJkcC9mdXp6X2EyZHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZWY3ZDMuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL2EyZHAvZnV6el9hMmRwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJhMmRwX2FwaS5oIgotI2luY2x1ZGUgImZ1enplcnMvYTJkcC9hMmRwRnV6ekZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgImZ1enplcnMvY29tbW9uL2NvbW1vbkZ1enpIZWxwZXJzLmgiCi0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogRGF0YSwgc2l6ZV90IFNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKERhdGEsIFNpemUpOwotCi0gIC8vIENhbGwgU0RQIHNldHVwIGFzIHdlJ2xsIGJlIHVzaW5nIHRoYXQgb2JqZWN0IGFzIHdlbGwKLSAgc2V0dXBTZHBGdXp6KCk7Ci0KLSAgLy8gQ2FsbCBzb21lIGZ1bmN0aW9ucwotICB3aGlsZSAoZGF0YVByb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCkgewotICAgIGNhbGxBcmJpdHJhcnlGdW5jdGlvbigmZGF0YVByb3ZpZGVyLCBhMmRwX29wZXJhdGlvbnMpOwotICB9Ci0KLSAgLy8gQ2xlYW51cAotICBjbGVhbnVwQTJkcEZ1enooKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaCBiL3N0YWNrL3Rlc3QvZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4Mjg0My4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2Z1enplcnMvY29tbW9uL2NvbW1vbkZ1enpIZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJUX1NUQUNLX0ZVWlpfQ09NTU9OX0hFTFBFUlNfSF8KLSNkZWZpbmUgQlRfU1RBQ0tfRlVaWl9DT01NT05fSEVMUEVSU19IXwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSA8Y3N0cmluZz4gIC8vIEZvciBtZW1jcHkKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIENhbGxzIGEgZnVuY3Rpb24gZnJvbSB0aGUgb3BzX3ZlY3Rvcgotdm9pZCBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oCi0gICAgRnV6emVkRGF0YVByb3ZpZGVyKiBmZHAsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciopPj4gb3BzX3ZlY3RvcikgewotICAvLyBDaG9vc2Ugd2hpY2ggZnVuY3Rpb24gd2UnbGwgYmUgY2FsbGluZwotICB1aW50OF90IGZ1bmN0aW9uX2lkID0KLSAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCBvcHNfdmVjdG9yLnNpemUoKSAtIDEpOwotCi0gIC8vIENhbGwgdGhlIGZ1bmN0aW9uIHdlJ3ZlIGNob3NlbgotICBvcHNfdmVjdG9yW2Z1bmN0aW9uX2lkXShmZHApOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLVQgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgc3RkOjp2ZWN0b3I8VD4gdmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X251bGwpIHsKLSAgLy8gSWYgd2UncmUgYWxsb3dpbmcgbnVsbCwgZ2l2ZSBpdCBhIDUwOjUwIHNob3QgYXQgcmV0dXJuaW5nIGEgemVybyBlbGVtZW50Ci0gIC8vIChPciBpZiB0aGUgdmVjdG9yJ3MgZW1wdHkpCi0gIGlmICh2ZWN0LmVtcHR5KCkgfHwgKGFsbG93X251bGwgJiYgZmRwLT5Db25zdW1lQm9vbCgpKSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUPigwKTsKLSAgfQotCi0gIC8vIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVsZW1lbnQgZnJvbSBvdXIgdmVjdG9yCi0gIHJldHVybiB2ZWN0LmF0KGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHZlY3Quc2l6ZSgpIC0gMSkpOwotfQotCi1SYXdBZGRyZXNzIGdlbmVyYXRlUmF3QWRkcmVzcyhGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICBSYXdBZGRyZXNzIHJldHZhbDsKLQotICAvLyBaZXJvIGFkZHJlc3MKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICByZXR2YWwuYWRkcmVzc1tpXSA9IDA7Ci0gIH0KLQotICAvLyBSZWFkIGFzIG11Y2ggYXMgd2UgY2FuIGZyb20gdGhlIGJ1ZmZlciBhbmQgY29weSBpdCBpbgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcyA9IGZkcC0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KHJldHZhbC5rTGVuZ3RoKTsKLSAgbWVtY3B5KHJldHZhbC5hZGRyZXNzLCBieXRlcy5kYXRhKCksIGJ5dGVzLnNpemUoKSk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotYmx1ZXRvb3RoOjpVdWlkIGdlbmVyYXRlQXJiaXRyYXJ5VXVpZChGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlc192ZWN0ID0KLSAgICAgIGZkcC0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KGJsdWV0b290aDo6VXVpZDo6a051bUJ5dGVzMTI4KTsKLSAgLy8gV2UgbmVlZCBpdCB0byBiZSB0aGUgY29ycmVjdCBzaXplIHJlZ2FyZGxlc3Mgb2YgaWYgZmRwIHJhbiBvdXQgb2YgYnl0ZXMKLSAgd2hpbGUgKGJ5dGVzX3ZlY3Quc2l6ZSgpIDwgYmx1ZXRvb3RoOjpVdWlkOjprTnVtQnl0ZXMxMjgpIHsKLSAgICBieXRlc192ZWN0LnB1c2hfYmFjaygnXDAnKTsKLSAgfQotCi0gIHJldHVybiBibHVldG9vdGg6OlV1aWQ6OkZyb20xMjhCaXRCRShieXRlc192ZWN0LmRhdGEoKSk7Ci19Ci0KLSNlbmRpZiAgLy8gQlRfU1RBQ0tfRlVaWl9DT01NT05fSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL3NkcC9BbmRyb2lkLmJwIGIvc3RhY2svdGVzdC9mdXp6ZXJzL3NkcC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWI1YzM5Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZnV6emVycy9zZHAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJzZHBfZnV6eiIsCi0gICAgZGVmYXVsdHM6IFsibGliYnQtc3RhY2tfZnV6el9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZ1enpfc2RwLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9mdXp6ZXJzL3NkcC9mdXp6X3NkcC5jYyBiL3N0YWNrL3Rlc3QvZnV6emVycy9zZHAvZnV6el9zZHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZTc3M2QuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL3NkcC9mdXp6X3NkcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSAiZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL3NkcC9zZHBGdXp6RnVuY3Rpb25zLmgiCi0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgLy8gSW5pdCBvdXIgd3JhcHBlcgotICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOwotCi0gIHNldHVwU2RwRnV6eigpOwotCi0gIC8vIENhbGwgc29tZSBmdW5jdGlvbnMKLSAgd2hpbGUgKGRhdGFQcm92aWRlci5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKLSAgICBjYWxsQXJiaXRyYXJ5RnVuY3Rpb24oJmRhdGFQcm92aWRlciwgc2RwX29wZXJhdGlvbnMpOwotICB9Ci0KLSAgLy8gQ2xlYW51cCBvdXIgc3RhdGUKLSAgY2xlYW51cFNkcEZ1enooKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZnV6emVycy9zZHAvc2RwRnV6ekZ1bmN0aW9ucy5oIGIvc3RhY2svdGVzdC9mdXp6ZXJzL3NkcC9zZHBGdXp6RnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDIzZjUuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9mdXp6ZXJzL3NkcC9zZHBGdXp6RnVuY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBGVVpaRVJfU0RQX0ZVTkNUSU9OU19IXwotI2RlZmluZSBGVVpaRVJfU0RQX0ZVTkNUSU9OU19IXwotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZnV6emVycy9jb21tb24vY29tbW9uRnV6ekhlbHBlcnMuaCIKLSNpbmNsdWRlICJmdXp6ZXJzL3NkcC9zZHBGdXp6SGVscGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBTRFBfTUFYX0RCX0xFTiAxMDI0ICogMTAyNCAgLy8gMSBNQgotI2RlZmluZSBNQVhfTlVNX0RCUyA2NAotCi0vKiBUaGlzIGlzIGEgdmVjdG9yIG9mIGxhbWJkYSBmdW5jdGlvbnMgdGhlIGZ1enplciB3aWxsIHB1bGwgZnJvbS4KLSAqICBUaGlzIGlzIGRvbmUgc28gbmV3IGZ1bmN0aW9ucyBjYW4gYmUgYWRkZWQgdG8gdGhlIGZ1enplciBlYXNpbHkKLSAqICB3aXRob3V0IHJlcXVpcmluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBtYWluIGZ1enplciBmaWxlLiBUaGlzIGFsc28KLSAqICBhbGxvd3MgbXVsdGlwbGUgZnV6emVycyB0byBpbmNsdWRlIHRoaXMgZmlsZSwgaWYgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnV6emVkRGF0YVByb3ZpZGVyKik+PgotICAgIHNkcF9vcGVyYXRpb25zID0gewotICAgICAgICAvLyBTRFBfSW5pdERpc2NvdmVyeURiCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBpZiAoc2RwX2RiX3ZlY3Quc2l6ZSgpID49IE1BWF9OVU1fREJTKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gYnVpbGQgb3V0IHV1aWRfbGlzdAotICAgICAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6VXVpZD4gdXVpZF9saXN0OwotICAgICAgICAgIHVpbnQ4X3QgbnVtX3V1aWRzID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKLSAgICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBudW1fdXVpZHM7IGkrKykgewotICAgICAgICAgICAgdXVpZF9saXN0LnB1c2hfYmFjayhnZW5lcmF0ZUFyYml0cmFyeVV1aWQoZmRwKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gYnVpbGQgb3V0IGF0dHJfbGlzdAotICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBhdHRyX2xpc3QgPSBnZW5lcmF0ZUFyYml0cmFyeUF0dHJMaXN0KGZkcCk7Ci0KLSAgICAgICAgICB1aW50MzJfdCBkYl9zaXplID0KLSAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBTRFBfTUFYX0RCX0xFTik7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRTRFBfRElTQ09WRVJZX0RCPiBwX2RiKAotICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHRTRFBfRElTQ09WRVJZX0RCKj4obWFsbG9jKGRiX3NpemUpKSwgZnJlZSk7Ci0gICAgICAgICAgaWYgKHBfZGIpIHsKLSAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IFNEUF9Jbml0RGlzY292ZXJ5RGIoCi0gICAgICAgICAgICAgICAgcF9kYi5nZXQoKSwgZGJfc2l6ZSwgdXVpZF9saXN0LnNpemUoKSwgdXVpZF9saXN0LmRhdGEoKSwKLSAgICAgICAgICAgICAgICBhdHRyX2xpc3Quc2l6ZSgpLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihhdHRyX2xpc3QuZGF0YSgpKSk7Ci0gICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICBzZHBfZGJfdmVjdC5wdXNoX2JhY2socF9kYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9DYW5jZWxTZXJ2aWNlU2VhcmNoCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBTRFBfQ2FuY2VsU2VydmljZVNlYXJjaCgKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9kYl92ZWN0LCB0cnVlKS5nZXQoKSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0Ci0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIgPSBnZW5lcmF0ZVJhd0FkZHJlc3MoZmRwKTsKLSAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogZGIgPQotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX2RiX3ZlY3QsIGZhbHNlKS5nZXQoKTsKLSAgICAgICAgICBpZiAoZGIpIHsKLSAgICAgICAgICAgIFNEUF9TZXJ2aWNlU2VhcmNoUmVxdWVzdChiZF9hZGRyLCBkYiwgJnNkcF9kaXNjX2NtcGxfY2IpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciA9IGdlbmVyYXRlUmF3QWRkcmVzcyhmZHApOwotICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBkYiA9Ci0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBzZHBfZGJfdmVjdCwgZmFsc2UpLmdldCgpOwotICAgICAgICAgIGlmIChkYikgewotICAgICAgICAgICAgU0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0KGJkX2FkZHIsIGRiLCAmc2RwX2Rpc2NfY21wbF9jYik7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciA9IGdlbmVyYXRlUmF3QWRkcmVzcyhmZHApOwotICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHVzZXJfZGF0YSA9IGZkcC0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KAotICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCAxMDI0KSk7Ci0gICAgICAgICAgdFNEUF9ESVNDT1ZFUllfREIqIGRiID0KLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9kYl92ZWN0LCBmYWxzZSkuZ2V0KCk7Ci0KLSAgICAgICAgICBpZiAoZGIpIHsKLSAgICAgICAgICAgIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIoYmRfYWRkciwgZGIsICZzZHBfZGlzY19jbXBsX2NiMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhLmRhdGEoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfcmVjID0KLSAgICAgICAgICAgICAgZ2VuZXJhdGVBcmJpdHJhcnlTZHBEaXNjUmVjb3JkKGZkcCwgZmFsc2UpLmdldCgpOwotICAgICAgICAgIFNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfRmluZFNlcnZpY2VJbkRiCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBTRFBfRmluZFNlcnZpY2VJbkRiKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX2RiX3ZlY3QsIHRydWUpLmdldCgpLAotICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwKLSAgICAgICAgICAgICAgZ2VuZXJhdGVBcmJpdHJhcnlTZHBEaXNjUmVjb3JkKGZkcCwgdHJ1ZSkuZ2V0KCkpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9GaW5kU2VydmljZVVVSURJbkRiCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQgdXVpZCA9IGdlbmVyYXRlQXJiaXRyYXJ5VXVpZChmZHApOwotICAgICAgICAgIFNEUF9GaW5kU2VydmljZVVVSURJbkRiKAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX2RiX3ZlY3QsIHRydWUpLmdldCgpLCB1dWlkLAotICAgICAgICAgICAgICBnZW5lcmF0ZUFyYml0cmFyeVNkcERpc2NSZWNvcmQoZmRwLCB0cnVlKS5nZXQoKSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpVdWlkIHV1aWQgPSBnZW5lcmF0ZUFyYml0cmFyeVV1aWQoZmRwKTsKLSAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYyA9Ci0gICAgICAgICAgICAgIGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY1JlY29yZChmZHAsIGZhbHNlKS5nZXQoKTsKLSAgICAgICAgICBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWNfMTI4Yml0KHBfcmVjLCAmdXVpZCk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX0ZpbmRTZXJ2aWNlSW5EYl8xMjhiaXQKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIFNEUF9GaW5kU2VydmljZUluRGJfMTI4Yml0KAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX2RiX3ZlY3QsIHRydWUpLmdldCgpLAotICAgICAgICAgICAgICBnZW5lcmF0ZUFyYml0cmFyeVNkcERpc2NSZWNvcmQoZmRwLCB0cnVlKS5nZXQoKSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHRTRFBfUFJPVE9DT0xfRUxFTSBlbGVtID0gZ2VuZXJhdGVBcmJpdHJhcnlTZHBQcm90b2NvbEVsZW1lbnRzKGZkcCk7Ci0gICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9yZWMgPQotICAgICAgICAgICAgICBnZW5lcmF0ZUFyYml0cmFyeVNkcERpc2NSZWNvcmQoZmRwLCBmYWxzZSkuZ2V0KCk7Ci0gICAgICAgICAgU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9yZWMsIGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHVpbnQxNl90IHBfdmVyc2lvbjsKLSAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYyA9Ci0gICAgICAgICAgICAgIGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY1JlY29yZChmZHAsIGZhbHNlKS5nZXQoKTsKLQotICAgICAgICAgIFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhwX3JlYywgZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3ZlcnNpb24pOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9DcmVhdGVSZWNvcmQKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHVpbnQzMl90IGhhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKLSAgICAgICAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgICAgICBzZHBfcmVjb3JkX2hhbmRsZXMucHVzaF9iYWNrKGhhbmRsZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9EZWxldGVSZWNvcmQKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIFNEUF9EZWxldGVSZWNvcmQoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBzZHBfcmVjb3JkX2hhbmRsZXMsIHRydWUpKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfQWRkQXR0cmlidXRlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWwgPSBmZHAtPkNvbnN1bWVCeXRlczx1aW50OF90PigKLSAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMSwgMTAyNCkpOwotICAgICAgICAgIGlmICh2YWwuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU0RQX0FkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX3JlY29yZF9oYW5kbGVzLCB0cnVlKSwKLSAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwKLSAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpLCB2YWwuc2l6ZSgpLCB2YWwuZGF0YSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX0FkZFNlcXVlbmNlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBTRFBfU2VxdWVuY2VfSGVscGVyIHNlcSA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRWxlbVNlcXVlbmNlKGZkcCk7Ci0KLSAgICAgICAgICBTRFBfQWRkU2VxdWVuY2UoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBzZHBfcmVjb3JkX2hhbmRsZXMsIHRydWUpLAotICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwgc2VxLm51bV9lbGVtLCBzZXEudHlwZS5nZXQoKSwKLSAgICAgICAgICAgICAgc2VxLmxlbi5nZXQoKSwgc2VxLnBfdmFsLmdldCgpKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfQWRkVXVpZFNlcXVlbmNlCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICB1aW50MTZfdCBudW1fdXVpZHMgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDE2X3Q+KDEsIDY0KTsKLSAgICAgICAgICB1aW50MTZfdCogdXVpZHMgPSBuZXcgdWludDE2X3RbbnVtX3V1aWRzXTsKLSAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgbnVtX3V1aWRzOyBpKyspIHsKLSAgICAgICAgICAgIHV1aWRzW2ldID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU0RQX0FkZFV1aWRTZXF1ZW5jZSgKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9yZWNvcmRfaGFuZGxlcywgdHJ1ZSksCi0gICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpLCBudW1fdXVpZHMsIHV1aWRzKTsKLSAgICAgICAgICBkZWxldGVbXSB1dWlkczsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfQWRkUHJvdG9jb2xMaXN0Ci0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dFNEUF9QUk9UT19MSVNUX0VMRU0+IHBfcHJvdG9fbGlzdCA9Ci0gICAgICAgICAgICAgIGdlbmVyYXRlQXJiaXRyYXJ5U2RwUHJvdG9jb2xFbGVtZW50TGlzdChmZHApOwotICAgICAgICAgIGlmIChwX3Byb3RvX2xpc3QpIHsKLSAgICAgICAgICAgIFNEUF9BZGRQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9yZWNvcmRfaGFuZGxlcywgdHJ1ZSksCi0gICAgICAgICAgICAgICAgcF9wcm90b19saXN0LmdldCgpLT5udW1fZWxlbXMsIHBfcHJvdG9fbGlzdC5nZXQoKS0+bGlzdF9lbGVtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX0FkZEFkZGl0aW9uUHJvdG9MaXN0cwotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgdWludDE2X3QgYXJyX3NpemU7Ci0gICAgICAgICAgdFNEUF9QUk9UT19MSVNUX0VMRU0qKiBwX3Byb3RvX2xpc3QgPQotICAgICAgICAgICAgICBnZW5lcmF0ZUFyYml0cmFyeVNkcFByb3RvY29sRWxlbWVudExpc3RBcnJheShmZHAsICZhcnJfc2l6ZSk7Ci0gICAgICAgICAgaWYgKHBfcHJvdG9fbGlzdCkgewotICAgICAgICAgICAgaWYgKHBfcHJvdG9fbGlzdFswXSkgewotICAgICAgICAgICAgICBTRFBfQWRkQWRkaXRpb25Qcm90b0xpc3RzKAotICAgICAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9yZWNvcmRfaGFuZGxlcywgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICBhcnJfc2l6ZSwgcF9wcm90b19saXN0WzBdKTsKLSAgICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IGFycl9zaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgcF9wcm90b19saXN0W2ldOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHBfcHJvdG9fbGlzdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIFNEUF9BZGRQcm9maWxlRGVzY3JpcHRvckxpc3QoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBzZHBfcmVjb3JkX2hhbmRsZXMsIHRydWUpLAotICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwKLSAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCkpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9BZGRMYW5ndWFnZUJhc2VBdHRySURMaXN0Ci0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBTRFBfQWRkTGFuZ3VhZ2VCYXNlQXR0cklETGlzdCgKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9yZWNvcmRfaGFuZGxlcywgdHJ1ZSksCi0gICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpLAotICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSwKLSAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCkpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHVpbnQxNl90IG51bV9zZXJ2aWNlcyA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMCwgNjQpOwotICAgICAgICAgIHVpbnQxNl90KiBzZXJ2aWNlX3V1aWRzID0gbmV3IHVpbnQxNl90W251bV9zZXJ2aWNlc107Ci0gICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IG51bV9zZXJ2aWNlczsgaSsrKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlX3V1aWRzW2ldID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdCgKLSAgICAgICAgICAgICAgZ2V0QXJiaXRyYXJ5VmVjdG9yRWxlbWVudChmZHAsIHNkcF9yZWNvcmRfaGFuZGxlcywgdHJ1ZSksCi0gICAgICAgICAgICAgIG51bV9zZXJ2aWNlcywgc2VydmljZV91dWlkcyk7Ci0KLSAgICAgICAgICBkZWxldGVbXSBzZXJ2aWNlX3V1aWRzOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9EZWxldGVBdHRyaWJ1dGUKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIFNEUF9EZWxldGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBzZHBfcmVjb3JkX2hhbmRsZXMsIHRydWUpLAotICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX1NldExvY2FsRGlSZWNvcmQKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIHVpbnQzMl90IGhhbmRsZTsgIC8vIE91dHB1dCB2YXIKLSAgICAgICAgICB0U0RQX0RJX1JFQ09SRCBkZXZpY2VfaW5mbyA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlSZWNvcmQoZmRwKTsKLSAgICAgICAgICBTRFBfU2V0TG9jYWxEaVJlY29yZCgmZGV2aWNlX2luZm8sICZoYW5kbGUpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9EaURpc2NvdmVyCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzIHJlbW90ZV9kZXZpY2UgPSBnZW5lcmF0ZVJhd0FkZHJlc3MoZmRwKTsKLQotICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBkaXNjb3ZlcnlEQiBpbml0IGNhbGwKLSAgICAgICAgICB1aW50MzJfdCBkYl9zaXplID0KLSAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBTRFBfTUFYX0RCX0xFTik7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRTRFBfRElTQ09WRVJZX0RCPiBwX2RiKAotICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHRTRFBfRElTQ09WRVJZX0RCKj4obWFsbG9jKGRiX3NpemUpKSwgZnJlZSk7Ci0gICAgICAgICAgaWYgKHBfZGIpIHsKLSAgICAgICAgICAgIFNEUF9EaURpc2NvdmVyKHJlbW90ZV9kZXZpY2UsIHBfZGIuZ2V0KCksIGRiX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc2RwX2Rpc2NfY21wbF9jYik7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9HZXROdW1EaVJlY29yZHMKLSAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIC0+IHZvaWQgewotICAgICAgICAgIFNEUF9HZXROdW1EaVJlY29yZHMoCi0gICAgICAgICAgICAgIGdldEFyYml0cmFyeVZlY3RvckVsZW1lbnQoZmRwLCBzZHBfZGJfdmVjdCwgdHJ1ZSkuZ2V0KCkpOwotICAgICAgICB9LAotCi0gICAgICAgIC8vIFNEUF9HZXREaVJlY29yZAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgdFNEUF9ESV9HRVRfUkVDT1JEIGRldmljZV9pbmZvOyAgLy8gT3V0cHV0IHZhcgotICAgICAgICAgIFNEUF9HZXREaVJlY29yZCgKLSAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKSwgJmRldmljZV9pbmZvLAotICAgICAgICAgICAgICBnZXRBcmJpdHJhcnlWZWN0b3JFbGVtZW50KGZkcCwgc2RwX2RiX3ZlY3QsIHRydWUpLmdldCgpKTsKLSAgICAgICAgfSwKLQotICAgICAgICAvLyBTRFBfU2V0VHJhY2VMZXZlbAotICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgLT4gdm9pZCB7Ci0gICAgICAgICAgU0RQX1NldFRyYWNlTGV2ZWwoZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKSk7Ci0gICAgICAgIH0sCi0KLSAgICAgICAgLy8gU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjCi0gICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZmRwKSAtPiB2b2lkIHsKLSAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3JlYyA9Ci0gICAgICAgICAgICAgIGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY1JlY29yZChmZHAsIGZhbHNlKS5nZXQoKTsKLSAgICAgICAgICBibHVldG9vdGg6OlV1aWQgdXVpZDsgIC8vIE91dHB1dCB2YXIKLSAgICAgICAgICBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWMocF9yZWMsICZ1dWlkKTsKLSAgICAgICAgfX07Ci0KLSNlbmRpZiAgLy8gRlVaWkVSX1NEUF9GVU5DVElPTlNfSF8KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZnV6emVycy9zZHAvc2RwRnV6ekhlbHBlcnMuaCBiL3N0YWNrL3Rlc3QvZnV6emVycy9zZHAvc2RwRnV6ekhlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0Nzg2Yy4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2Z1enplcnMvc2RwL3NkcEZ1enpIZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBGVVpaRVJfU0RQX0hFTFBFUlNfSF8KLSNkZWZpbmUgRlVaWkVSX1NEUF9IRUxQRVJTX0hfCi0KLS8vIE5PVEU6IFRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGRpcmVjdGx5LgotLy8gICAgICAgSXQgaXMgaW5jbHVkZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgIi4uLkZ1bmN0aW9ucy5oIiBmaWxlLgotCi0jaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZ1enplcnMvY29tbW9uL2NvbW1vbkZ1enpIZWxwZXJzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJzdGFjay9zZHAvc2RwaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBTRFBfTUFYX05VTV9FTEVNUyAxMjgKLSNkZWZpbmUgU0RQX01BWF9FTEVNX0xFTiAxMDI0Ci0jZGVmaW5lIFNEUF9NQVhfQVRUUlMgMTAyNAotCi1zdHJ1Y3QgU0RQX1NlcXVlbmNlX0hlbHBlciB7Ci0gIHVpbnQ4X3QgbnVtX2VsZW07Ci0gIHN0ZDo6c2hhcmVkX3B0cjx1aW50OF90PiB0eXBlOwotICBzdGQ6OnNoYXJlZF9wdHI8dWludDhfdD4gbGVuOwotICBzdGQ6OnNoYXJlZF9wdHI8dWludDhfdCo+IHBfdmFsOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8dWludDhfdD4+IHBfdmFsX2J1ZmZlcnM7Ci19OwotCi0vLyBLZWVwIGEgdmVjdG9yIG9mIG91ciBpbml0aWFsaXplZCBkYiBvYmplY3RzCi0vLyBJdCB3aWxsIGJlIHVwIHRvIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGlzIGFycmF5IGF0IHRoZSBlbmQgb2YgYSBmdXp6IGxvb3AKLXN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjx0U0RQX0RJU0NPVkVSWV9EQj4+IHNkcF9kYl92ZWN0Owotc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNkcF9yZWNvcmRfaGFuZGxlczsKLXN0ZDo6dmVjdG9yPFNEUF9TZXF1ZW5jZV9IZWxwZXI+IHNkcF9zZXF1ZW5jZV92ZWN0Owotc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPHRTRFBfRElTQ19SRUM+PiBzZHBfZGlzY19yZWNfdmVjdDsKLXN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjx0U0RQX0RJU0NfQVRUUj4+IHNkcF9kaXNjX2F0dHJfdmVjdDsKLXN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjx0U0RQX1BST1RPX0xJU1RfRUxFTT4+IHNkcF9wcm90b2xpc3RfZWxlbV92ZWN0OwotCi1zdGQ6OnNoYXJlZF9wdHI8dFNEUF9ESVNDX0FUVFI+IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY0F0dHIoCi0gICAgRnV6emVkRGF0YVByb3ZpZGVyKiwgYm9vbCk7Ci0KLXN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7Ci12b2lkIHNldHVwU2RwRnV6eigpIHsKLSAgaWYgKCFpbml0aWFsaXplZCkgewotICAgIHNkcF9pbml0KCk7Ci0gICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICB9Ci19Ci0KLS8vIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIGFuZCBjbGVhciBhbnkgYWxsb2NhdGVkIG9iamVjdHMKLXZvaWQgY2xlYW51cFNkcEZ1enooKSB7Ci0gIC8vIERlbGV0ZSBzZHBfc2VxdWVuY2VfdmVjdCwgc2RwX2Rpc2NfcmVjX3ZlY3QsIHNkcF9kaXNjX2F0dHJfdmVjdAotICBzZHBfc2VxdWVuY2VfdmVjdC5jbGVhcigpOwotCi0gIHNkcF9kaXNjX3JlY192ZWN0LmNsZWFyKCk7Ci0KLSAgLy8gRGVsZXRlIGF0dHJpYnV0ZXMgJiBwcm90b2xpc3QgZWxlbWVudHMKLSAgc2RwX2Rpc2NfYXR0cl92ZWN0LmNsZWFyKCk7Ci0gIHNkcF9wcm90b2xpc3RfZWxlbV92ZWN0LmNsZWFyKCk7Ci0KLSAgLy8gRGVsZXRlIGFsbCByZWNvcmRzCi0gIFNEUF9EZWxldGVSZWNvcmQoMCk7Ci0gIHNkcF9yZWNvcmRfaGFuZGxlcy5jbGVhcigpOwotCi0gIC8vIERlbGV0ZSBEYXRhYmFzZXMKLSAgc2RwX2RiX3ZlY3QuY2xlYXIoKTsKLQotICAvLyBTZXQgU0RQIFRyYWNlIGxldmVsIGJhY2sgdG8gZGVmYXVsdAotICBTRFBfU2V0VHJhY2VMZXZlbCgwKTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGdlbmVyYXRlQXJiaXRyYXJ5QXR0ckxpc3QoRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIHsKLSAgLy8gYnVpbGQgb3V0IGF0dHJfbGlzdAotICB1aW50MTZfdCBudW1fYXR0cnMgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDE2X3Q+KDAsIFNEUF9NQVhfQVRUUlMpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBhdHRyX2xpc3Q7Ci0gIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBudW1fYXR0cnM7IGkrKykgewotICAgIGF0dHJfbGlzdC5wdXNoX2JhY2soZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCkpOwotICB9Ci0KLSAgcmV0dXJuIGF0dHJfbGlzdDsKLX0KLQotdFNEUF9ESVNDX0FUVkFMIGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY0F0dHJWYWwoRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIHsKLSAgdFNEUF9ESVNDX0FUVkFMIG5ld19hdHRydmFsOwotCi0gIG5ld19hdHRydmFsLnYudTggPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpOwotICBuZXdfYXR0cnZhbC52LnUxNiA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOwotICBuZXdfYXR0cnZhbC52LnUzMiA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgIG5ld19hdHRydmFsLnYuYXJyYXlbaV0gPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpOwotICB9Ci0gIG5ld19hdHRydmFsLnYucF9zdWJfYXR0ciA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY0F0dHIoZmRwLCB0cnVlKS5nZXQoKTsKLQotICByZXR1cm4gbmV3X2F0dHJ2YWw7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjx0U0RQX0RJU0NfQVRUUj4gZ2VuZXJhdGVBcmJpdHJhcnlTZHBEaXNjQXR0cigKLSAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCwgYm9vbCBhbGxvd19udWxsKSB7Ci0gIC8vIEdpdmUgaXQgYSBjaGFuY2UgdG8gcmV0dXJuIGEgbnVsbHB0cgotICBpZiAoYWxsb3dfbnVsbCAmJiAhZmRwLT5Db25zdW1lQm9vbCgpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8dFNEUF9ESVNDX0FUVFI+IG5ld19hdHRyKG5ldyB0U0RQX0RJU0NfQVRUUik7Ci0gIHNkcF9kaXNjX2F0dHJfdmVjdC5wdXNoX2JhY2sobmV3X2F0dHIpOwotCi0gIG5ld19hdHRyLT5wX25leHRfYXR0ciA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY0F0dHIoZmRwLCB0cnVlKS5nZXQoKTsKLSAgbmV3X2F0dHItPmF0dHJfaWQgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgbmV3X2F0dHItPmF0dHJfbGVuX3R5cGUgPQotICAgICAgZmRwLT5Db25zdW1lQm9vbCgpID8gMTYgOiBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgbmV3X2F0dHItPmF0dHJfdmFsdWUgPSBnZW5lcmF0ZUFyYml0cmFyeVNkcERpc2NBdHRyVmFsKGZkcCk7Ci0KLSAgcmV0dXJuIG5ld19hdHRyOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8dFNEUF9ESVNDX1JFQz4gZ2VuZXJhdGVBcmJpdHJhcnlTZHBEaXNjUmVjb3JkKAotICAgIEZ1enplZERhdGFQcm92aWRlciogZmRwLCBib29sIGFsbG93X251bGwpIHsKLSAgLy8gR2l2ZSBpdCBhIGNoYW5jZSB0byByZXR1cm4gYSBudWxscHRyCi0gIGlmIChhbGxvd19udWxsICYmICFmZHAtPkNvbnN1bWVCb29sKCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHN0ZDo6c2hhcmVkX3B0cjx0U0RQX0RJU0NfUkVDPiBuZXdfcmVjKG5ldyB0U0RQX0RJU0NfUkVDKTsKLSAgc2RwX2Rpc2NfcmVjX3ZlY3QucHVzaF9iYWNrKG5ld19yZWMpOwotCi0gIG5ld19yZWMtPnBfZmlyc3RfYXR0ciA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY0F0dHIoZmRwLCB0cnVlKS5nZXQoKTsKLSAgbmV3X3JlYy0+cF9uZXh0X3JlYyA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlzY1JlY29yZChmZHAsIHRydWUpLmdldCgpOwotICBuZXdfcmVjLT50aW1lX3JlYWQgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKLSAgbmV3X3JlYy0+cmVtb3RlX2JkX2FkZHIgPSBnZW5lcmF0ZVJhd0FkZHJlc3MoZmRwKTsKLQotICByZXR1cm4gbmV3X3JlYzsKLX0KLQotdFNEUF9QUk9UT0NPTF9FTEVNIGdlbmVyYXRlQXJiaXRyYXJ5U2RwUHJvdG9jb2xFbGVtZW50cygKLSAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIGZkcCkgewotICB0U0RQX1BST1RPQ09MX0VMRU0gcF9lbGVtOwotCi0gIC8vIFNldCBvdXIgcHJvdG9jb2wgZWxlbWVudCB2YWx1ZXMKLSAgcF9lbGVtLnByb3RvY29sX3V1aWQgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgcF9lbGVtLm51bV9wYXJhbXMgPQotICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQxNl90PigwLCBTRFBfTUFYX1BST1RPQ09MX1BBUkFNUyk7Ci0gIHVpbnQxNl90IG51bV9sb29wcyA9IHN0ZDo6bWluKAotICAgICAgcF9lbGVtLm51bV9wYXJhbXMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihTRFBfTUFYX1BST1RPQ09MX1BBUkFNUykpOwotICAvLyBSZWdhcmRsZXNzIG9mIG51bWJlciBzZXQgYWJvdmUsIGZpbGwgb3V0IHRoZSBlbnRpcmUgYWxsb2NhdGVkIGFycmF5Ci0gIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBudW1fbG9vcHM7IGkrKykgewotICAgIHBfZWxlbS5wYXJhbXNbaV0gPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgfQotCi0gIHJldHVybiBwX2VsZW07Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjx0U0RQX1BST1RPX0xJU1RfRUxFTT4gZ2VuZXJhdGVBcmJpdHJhcnlTZHBQcm90b2NvbEVsZW1lbnRMaXN0KAotICAgIEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHN0ZDo6c2hhcmVkX3B0cjx0U0RQX1BST1RPX0xJU1RfRUxFTT4gcF9lbGVtX2xpc3QobmV3IHRTRFBfUFJPVE9fTElTVF9FTEVNKTsKLSAgc2RwX3Byb3RvbGlzdF9lbGVtX3ZlY3QucHVzaF9iYWNrKHBfZWxlbV9saXN0KTsKLQotICAvLyBQb3B1bGF0ZSBvdXIgZWxlbWVudCBsaXN0Ci0gIHBfZWxlbV9saXN0LT5udW1fZWxlbXMgPQotICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQxNl90PigwLCBTRFBfTUFYX0xJU1RfRUxFTVMpOwotICB1aW50MTZfdCBudW1fbG9vcHMgPSBzdGQ6Om1pbigKLSAgICAgIHBfZWxlbV9saXN0LT5udW1fZWxlbXMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihTRFBfTUFYX0xJU1RfRUxFTVMpKTsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IG51bV9sb29wczsgaSsrKSB7Ci0gICAgcF9lbGVtX2xpc3QtPmxpc3RfZWxlbVtpXSA9IGdlbmVyYXRlQXJiaXRyYXJ5U2RwUHJvdG9jb2xFbGVtZW50cyhmZHApOwotICB9Ci0KLSAgcmV0dXJuIHBfZWxlbV9saXN0OwotfQotCi10U0RQX1BST1RPX0xJU1RfRUxFTSoqIGdlbmVyYXRlQXJiaXRyYXJ5U2RwUHJvdG9jb2xFbGVtZW50TGlzdEFycmF5KAotICAgIEZ1enplZERhdGFQcm92aWRlciogZmRwLCB1aW50MTZfdCogYXJyYXlfc2l6ZSkgewotICAqYXJyYXlfc2l6ZSA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMCwgU0RQX01BWF9BVFRSX0xFTik7Ci0gIGlmICgqYXJyYXlfc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgdFNEUF9QUk9UT19MSVNUX0VMRU0qKiBwX2xpc3RfYXJyYXkgPSBzdGF0aWNfY2FzdDx0U0RQX1BST1RPX0xJU1RfRUxFTSoqPigKLSAgICAgIGNhbGxvYygqYXJyYXlfc2l6ZSwgc2l6ZW9mKHRTRFBfUFJPVE9fTElTVF9FTEVNKikpKTsKLSAgaWYgKHBfbGlzdF9hcnJheSA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICB0U0RQX1BST1RPX0xJU1RfRUxFTSogcCA9IHBfbGlzdF9hcnJheVswXTsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8ICphcnJheV9zaXplOyBpKyssIHArKykgewotICAgIHAgPSBnZW5lcmF0ZUFyYml0cmFyeVNkcFByb3RvY29sRWxlbWVudExpc3QoZmRwKS5nZXQoKTsKLSAgfQotCi0gIHJldHVybiBwX2xpc3RfYXJyYXk7Ci19Ci0KLXRTRFBfRElfUkVDT1JEIGdlbmVyYXRlQXJiaXRyYXJ5U2RwRGlSZWNvcmQoRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIHsKLSAgdFNEUF9ESV9SRUNPUkQgcmVjb3JkOwotCi0gIHJlY29yZC52ZW5kb3IgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgcmVjb3JkLnZlbmRvcl9pZF9zb3VyY2UgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgcmVjb3JkLnByb2R1Y3QgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgcmVjb3JkLnZlcnNpb24gPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgcmVjb3JkLnByaW1hcnlfcmVjb3JkID0gZmRwLT5Db25zdW1lQm9vbCgpOwotICBzaXplX3QgbnVtX2V4ZWN1dGFibGVfdXJscyA9Ci0gICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBTRFBfTUFYX0FUVFJfTEVOKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZXhlY3V0YWJsZV91cmxzOyBpKyspIHsKLSAgICByZWNvcmQuY2xpZW50X2V4ZWN1dGFibGVfdXJsW2ldID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8Y2hhcj4oKTsKLSAgfQotICBzaXplX3QgbnVtX2Rlc2NyaXB0aW9ucyA9Ci0gICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBTRFBfTUFYX0FUVFJfTEVOKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZGVzY3JpcHRpb25zOyBpKyspIHsKLSAgICByZWNvcmQuc2VydmljZV9kZXNjcmlwdGlvbltpXSA9IGZkcC0+Q29uc3VtZUludGVncmFsPGNoYXI+KCk7Ci0gIH0KLSAgc2l6ZV90IG51bV9kb2N1bWVudGF0aW9uX3VybHMgPQotICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgU0RQX01BWF9BVFRSX0xFTik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2RvY3VtZW50YXRpb25fdXJsczsgaSsrKSB7Ci0gICAgcmVjb3JkLmRvY3VtZW50YXRpb25fdXJsW2ldID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8Y2hhcj4oKTsKLSAgfQotCi0gIHJldHVybiByZWNvcmQ7Ci19Ci0KLXRTRFBfRElfR0VUX1JFQ09SRCBnZW5lcmF0ZUFyYml0cmFyeVNkcERpR2V0UmVjb3JkKEZ1enplZERhdGFQcm92aWRlciogZmRwKSB7Ci0gIHRTRFBfRElfR0VUX1JFQ09SRCBnZXRfcmVjb3JkOwotICBnZXRfcmVjb3JkLnNwZWNfaWQgPSBmZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKLSAgZ2V0X3JlY29yZC5yZWMgPSBnZW5lcmF0ZUFyYml0cmFyeVNkcERpUmVjb3JkKGZkcCk7Ci0KLSAgcmV0dXJuIGdldF9yZWNvcmQ7Ci19Ci0KLVNEUF9TZXF1ZW5jZV9IZWxwZXIgZ2VuZXJhdGVBcmJpdHJhcnlTZHBFbGVtU2VxdWVuY2UoRnV6emVkRGF0YVByb3ZpZGVyKiBmZHApIHsKLSAgU0RQX1NlcXVlbmNlX0hlbHBlciByZXQ7Ci0KLSAgLy8gR2V0IHRoZSBudW1iZXIgb2Ygb3VyIGVsZW1lbnRzCi0gIHJldC5udW1fZWxlbSA9IGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MTZfdD4oMSwgU0RQX01BWF9OVU1fRUxFTVMpOwotICByZXQudHlwZS5yZXNldChuZXcgdWludDhfdFtyZXQubnVtX2VsZW1dKTsKLSAgcmV0Lmxlbi5yZXNldChuZXcgdWludDhfdFtyZXQubnVtX2VsZW1dKTsKLSAgcmV0LnBfdmFsLnJlc2V0KG5ldyB1aW50OF90KltyZXQubnVtX2VsZW1dKTsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IHJldC5udW1fZWxlbTsgaSsrKSB7Ci0gICAgKHJldC50eXBlLmdldCgpKVtpXSA9IGZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7Ci0gICAgaWYgKChyZXQubGVuLmdldCgpKVtpXSA9PSAwKSB7Ci0gICAgICAocmV0LnBfdmFsLmdldCgpKVtpXSA9IG51bGxwdHI7Ci0gICAgICAocmV0Lmxlbi5nZXQoKSlbaV0gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICB1aW50OF90IGJ1Zl9zaXplID0gZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKLSAgICAgIC8vIExpbmsgdGhlIHNpemUgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSdyZSBjcmVhdGluZwotICAgICAgKHJldC5sZW4uZ2V0KCkpW2ldID0gYnVmX3NpemU7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8dWludDhfdD4gcF92YWxfc3AoCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY2FsbG9jKGJ1Zl9zaXplLCBzaXplb2YodWludDhfdCkpKSwgZnJlZSk7Ci0gICAgICByZXQucF92YWxfYnVmZmVycy5wdXNoX2JhY2socF92YWxfc3ApOwotICAgICAgKHJldC5wX3ZhbC5nZXQoKSlbaV0gPSBwX3ZhbF9zcC5nZXQoKTsKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzID0gZmRwLT5Db25zdW1lQnl0ZXM8dWludDhfdD4oYnVmX3NpemUpOwotICAgICAgbWVtY3B5KChyZXQucF92YWwuZ2V0KCkpW2ldLCBieXRlcy5kYXRhKCksIGJ5dGVzLnNpemUoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gUHVzaCB0aGlzIHN0cnVjdCB0byBvdXIgYXJyYXkgc28gd2UgY2FuIGRlbGV0ZSBsYXRlcgotICBzZHBfc2VxdWVuY2VfdmVjdC5wdXNoX2JhY2socmV0KTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vLyBEZWZpbmUgb3VyIGNhbGxiYWNrIGZ1bmN0aW9ucyB3ZSdsbCBiZSB1c2luZyB3aXRoaW4gb3VyIGZ1bmN0aW9ucwotdm9pZCBzZHBfZGlzY19jbXBsX2NiKHRTRFBfU1RBVFVTIHJlc3VsdCkge30KLXZvaWQgc2RwX2Rpc2NfY21wbF9jYjIodFNEUF9TVEFUVVMgcmVzdWx0LCBjb25zdCB2b2lkKiB1c2VyX2RhdGEpIHt9Ci0KLSNlbmRpZiAgLy8gRlVaWkVSX1NEUF9IRUxQRVJTX0hfCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2dhdHQvZ2F0dF9zcl90ZXN0LmNjIGIvc3RhY2svdGVzdC9nYXR0L2dhdHRfc3JfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZjRmZC4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L2dhdHQvZ2F0dF9zcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAib3NpL3Rlc3QvQWxsb2NhdGlvblRlc3RIYXJuZXNzLmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9nYXR0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svdGVzdC9jb21tb24vbW9ja19lYXR0LmgiCi0jdW5kZWYgTE9HX1RBRwotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9zci5jYyIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNkZWZpbmUgTUFYX1VJTlQxNiAoKHVpbnQxNl90KTB4ZmZmZikKLQotYm9vbCBNT0NLX2JsdWV0b290aF9zaGltX2lzX2dkX2FjbF9lbmFibGVkXyA9IHRydWU7Ci1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotdEdBVFRfQ0IgZ2F0dF9jYjsKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IFRlc3RNdXRhYmxlcyB7Ci0gIHN0cnVjdCB7Ci0gICAgdWludDhfdCBvcF9jb2RlXzsKLSAgfSBhdHRwX2J1aWxkX3NyX21zZzsKLSAgc3RydWN0IHsKLSAgICB1aW50MTZfdCBjb25uX2lkX3swfTsKLSAgICB1aW50MzJfdCB0cmFuc19pZF97MH07Ci0gICAgdEdBVFRTX1JFUV9UWVBFIHR5cGVfezB4ZmZ9OwotICAgIHRHQVRUU19EQVRBIGRhdGFfOwotICB9IGFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2s7Ci0gIHN0cnVjdCB7Ci0gICAgaW50IGFjY2Vzc19jb3VudF97MH07Ci0gICAgdEdBVFRfU1RBVFVTIHJldHVybl9zdGF0dXNfe0dBVFRfU1VDQ0VTU307Ci0gIH0gZ2F0dHNfd3JpdGVfYXR0cl9wZXJtX2NoZWNrOwotfTsKLQotVGVzdE11dGFibGVzIHRlc3Rfc3RhdGVfOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb25uZWN0aW9uX21hbmFnZXIgewotYm9vbCBiYWNrZ3JvdW5kX2Nvbm5lY3RfcmVtb3ZlKHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgZGlyZWN0X2Nvbm5lY3RfcmVtb3ZlKHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBjb25uZWN0aW9uX21hbmFnZXIKLQotQlRfSERSKiBhdHRwX2J1aWxkX3NyX21zZyh0R0FUVF9UQ0ImIHRjYiwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TUl9NU0cqIHBfbXNnKSB7Ci0gIHRlc3Rfc3RhdGVfLmF0dHBfYnVpbGRfc3JfbXNnLm9wX2NvZGVfID0gb3BfY29kZTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10R0FUVF9TVEFUVVMgYXR0cF9zZW5kX2NsX2NvbmZpcm1hdGlvbl9tc2codEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkgewotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9jbF9tc2codEdBVFRfVENCJiB0Y2IsIHRHQVRUX0NMQ0IqIHBfY2xjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3BfY29kZSwgdEdBVFRfQ0xfTVNHKiBwX21zZykgewotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9zcl9tc2codEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX21zZykgewotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotCi12b2lkIGdhdHRfYWN0X2Rpc2NvdmVyeSh0R0FUVF9DTENCKiBwX2NsY2IpIHt9Ci1ib29sIGdhdHRfZGlzY29ubmVjdCh0R0FUVF9UQ0IqIHBfdGNiKSB7IHJldHVybiBmYWxzZTsgfQotdEdBVFRfQ0hfU1RBVEUgZ2F0dF9nZXRfY2hfc3RhdGUodEdBVFRfVENCKiBwX3RjYikgeyByZXR1cm4gR0FUVF9DSF9DTE9TRTsgfQotdEdBVFRfU1RBVFVTIGdhdHRzX2RiX3JlYWRfYXR0cl92YWx1ZV9ieV90eXBlKAotICAgIHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHRHQVRUX1NWQ19EQiogcF9kYiwgdWludDhfdCBvcF9jb2RlLAotICAgIEJUX0hEUiogcF9yc3AsIHVpbnQxNl90IHNfaGFuZGxlLCB1aW50MTZfdCBlX2hhbmRsZSwgY29uc3QgVXVpZCYgdHlwZSwKLSAgICB1aW50MTZfdCogcF9sZW4sIHRHQVRUX1NFQ19GTEFHIHNlY19mbGFnLCB1aW50OF90IGtleV9zaXplLAotICAgIHVpbnQzMl90IHRyYW5zX2lkLCB1aW50MTZfdCogcF9jdXJfaGFuZGxlKSB7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci12b2lkIGdhdHRfc2V0X2NoX3N0YXRlKHRHQVRUX1RDQiogcF90Y2IsIHRHQVRUX0NIX1NUQVRFIGNoX3N0YXRlKSB7fQotVXVpZCogZ2F0dHNfZ2V0X3NlcnZpY2VfdXVpZCh0R0FUVF9TVkNfREIqIHBfZGIpIHsgcmV0dXJuIG51bGxwdHI7IH0KLXRHQVRUX1NUQVRVUyBHQVRUU19IYW5kbGVWYWx1ZUluZGljYXRpb24odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgYXR0cl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZhbF9sZW4sIHVpbnQ4X3QqIHBfdmFsKSB7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci10R0FUVF9TVEFUVVMgZ2F0dHNfcmVhZF9hdHRyX3Blcm1fY2hlY2sodEdBVFRfU1ZDX0RCKiBwX2RiLCBib29sIGlzX2xvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NFQ19GTEFHIHNlY19mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3NpemUpIHsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBnYXR0c19yZWFkX2F0dHJfdmFsdWVfYnlfaGFuZGxlKAotICAgIHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIHRHQVRUX1NWQ19EQiogcF9kYiwgdWludDhfdCBvcF9jb2RlLAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3Qgb2Zmc2V0LCB1aW50OF90KiBwX3ZhbHVlLCB1aW50MTZfdCogcF9sZW4sCi0gICAgdWludDE2X3QgbXR1LCB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZywgdWludDhfdCBrZXlfc2l6ZSwKLSAgICB1aW50MzJfdCB0cmFuc19pZCkgewotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIGdhdHRzX3dyaXRlX2F0dHJfcGVybV9jaGVjayh0R0FUVF9TVkNfREIqIHBfZGIsIHVpbnQ4X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TRUNfRkxBRyBzZWNfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfc2l6ZSkgewotICB0ZXN0X3N0YXRlXy5nYXR0c193cml0ZV9hdHRyX3Blcm1fY2hlY2suYWNjZXNzX2NvdW50XysrOwotICByZXR1cm4gdGVzdF9zdGF0ZV8uZ2F0dHNfd3JpdGVfYXR0cl9wZXJtX2NoZWNrLnJldHVybl9zdGF0dXNfOwotfQotdm9pZCBnYXR0X3VwZGF0ZV9hcHBfdXNlX2xpbmtfZmxhZyh0R0FUVF9JRiBnYXR0X2lmLCB0R0FUVF9UQ0IqIHBfdGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FkZCwgYm9vbCBjaGVja19hY2xfbGluaykge30KLWJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogZ2V0X21haW5fdGhyZWFkKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotdm9pZCBsMmNibGVfc2V0X2ZpeGVkX2NoYW5uZWxfdHhfZGF0YV9sZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZpeF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0eF9tdHUpIHt9Ci12b2lkIEwyQ0FfU2V0TGVGaXhlZENoYW5uZWxUeERhdGFMZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmaXhfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR4X210dSkge30KLWJvb2wgU0RQX0FkZEF0dHJpYnV0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IGF0dHJfaWQsIHVpbnQ4X3QgYXR0cl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dHJfbGVuLCB1aW50OF90KiBwX3ZhbCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFNEUF9BZGRQcm90b2NvbExpc3QodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1BST1RPQ09MX0VMRU0qIHBfZWxlbV9saXN0KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9zZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9zZXJ2aWNlX3V1aWRzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFV1aWRTZXF1ZW5jZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IGF0dHJfaWQsIHVpbnQxNl90IG51bV91dWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF91dWlkcykgewotICByZXR1cm4gZmFsc2U7Ci19Ci11aW50MzJfdCBTRFBfQ3JlYXRlUmVjb3JkKHZvaWQpIHsgcmV0dXJuIDA7IH0KLQotdm9pZCBBcHBsaWNhdGlvblJlcXVlc3RDYWxsYmFjayh1aW50MTZfdCBjb25uX2lkLCB1aW50MzJfdCB0cmFuc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1JFUV9UWVBFIHR5cGUsIHRHQVRUU19EQVRBKiBwX2RhdGEpIHsKLSAgdGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5jb25uX2lkXyA9IGNvbm5faWQ7Ci0gIHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2sudHJhbnNfaWRfID0gdHJhbnNfaWQ7Ci0gIHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2sudHlwZV8gPSB0eXBlOwotICB0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLmRhdGFfID0gKnBfZGF0YTsKLX0KLQotYm9vbCBnYXR0X3NyX2lzX2NsX2NoYW5nZV9hd2FyZSh0R0FUVF9UQ0ImIHRjYikgeyByZXR1cm4gZmFsc2U7IH0KLXZvaWQgZ2F0dF9zcl9pbml0X2NsX3N0YXR1cyh0R0FUVF9UQ0ImIHBfdGNiKSB7fQotdm9pZCBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXModEdBVFRfVENCJiBwX3RjYiwgYm9vbCBjaGdfYXdhcmUpIHsKLSAgcF90Y2IuaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSA9IGNoZ19hd2FyZTsKLX0KLQotLyoqCi0gKiBUZXN0IGNsYXNzIHRvIHRlc3Qgc2VsZWN0ZWQgZnVuY3Rpb25hbGl0eSBpbiBzdGFjay9nYXR0L2dhdHRfc3IuY2MKLSAqLwotZXh0ZXJuIHZvaWQgYWxsb2NhdGlvbl90cmFja2VyX3VuaW5pdCh2b2lkKTsKLW5hbWVzcGFjZSB7Ci11aW50MTZfdCBrSGFuZGxlID0gMTsKLWJ0X2dhdHRfZGJfYXR0cmlidXRlX3R5cGVfdCBrR2F0dENoYXJhY3RlcmlzdGljVHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQzsKLX0gIC8vIG5hbWVzcGFjZQotY2xhc3MgR2F0dFNyVGVzdCA6IHB1YmxpYyBBbGxvY2F0aW9uVGVzdEhhcm5lc3MgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlNldFVwKCk7Ci0gICAgLy8gRGlzYWJsZSBvdXIgYWxsb2NhdGlvbiB0cmFja2VyIHRvIGFsbG93IEFTQU4gZnVsbCByYW5nZQotICAgIGFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQoKTsKLSAgICBtZW1zZXQoJnRjYl8sIDAsIHNpemVvZih0Y2JfKSk7Ci0gICAgbWVtc2V0KCZlbF8sIDAsIHNpemVvZihlbF8pKTsKLQotICAgIHRjYl8udHJhbnNfaWQgPSAweDEyMzQ1Njc3OwotICAgIHRjYl8uYXR0X2xjaWQgPSBMMkNBUF9BVFRfQ0lEOwotICAgIGVsXy5nYXR0X2lmID0gMTsKLSAgICBnYXR0X2NiLmNsX3JjYltlbF8uZ2F0dF9pZiAtIDFdLmluX3VzZSA9IHRydWU7Ci0gICAgZ2F0dF9jYi5jbF9yY2JbZWxfLmdhdHRfaWYgLSAxXS5hcHBfY2IucF9yZXFfY2IgPQotICAgICAgICBBcHBsaWNhdGlvblJlcXVlc3RDYWxsYmFjazsKLQotICAgIHRlc3Rfc3RhdGVfID0gVGVzdE11dGFibGVzKCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBBbGxvY2F0aW9uVGVzdEhhcm5lc3M6OlRlYXJEb3duKCk7IH0KLQotICB0R0FUVF9UQ0IgdGNiXzsKLSAgdEdBVFRfU1JWX0xJU1RfRUxFTSBlbF87Ci19OwotCi0vKiBTZXJ2ZXIgUm9idXN0IENhY2hpbmcgVGVzdCAqLwotY2xhc3MgR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QgOiBwdWJsaWMgQWxsb2NhdGlvblRlc3RIYXJuZXNzIHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgQWxsb2NhdGlvblRlc3RIYXJuZXNzOjpTZXRVcCgpOwotICAgIG1lbXNldCgmdGNiXywgMCwgc2l6ZW9mKHRjYl8pKTsKLQotICAgIGRlZmF1bHRfbGVuZ3RoXyA9IDI7Ci0gICAgbWVtc2V0KGRlZmF1bHRfZGF0YV8sIDAsIHNpemVvZihkZWZhdWx0X2RhdGFfKSk7Ci0KLSAgICBnYXR0X2NiLmhhbmRsZV9vZl9kYXRhYmFzZV9oYXNoID0gMHgwMDEwOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgQWxsb2NhdGlvblRlc3RIYXJuZXNzOjpUZWFyRG93bigpOyB9Ci0KLSAgdEdBVFRfVENCIHRjYl87Ci0gIHVpbnQxNl90IGRlZmF1bHRfbGVuZ3RoXzsKLSAgdWludDhfdCBkZWZhdWx0X2RhdGFfWzJdOwotfTsKLQotVEVTVF9GKEdhdHRTclRlc3QsIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX3JlcXVlc3RfcHJlcGFyZV93cml0ZV9ub19kYXRhKSB7Ci0gIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxKHRjYl8sIEwyQ0FQX0FUVF9DSUQsIGVsXywga0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRVFfUFJFUEFSRV9XUklURSwgMCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotfQotCi1URVNUX0YoR2F0dFNyVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcV9yZXF1ZXN0X3ByZXBhcmVfd3JpdGVfbWF4X2xlbl9ub19kYXRhKSB7Ci0gIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxKHRjYl8sIEwyQ0FQX0FUVF9DSUQsIGVsXywga0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRVFfUFJFUEFSRV9XUklURSwgTUFYX1VJTlQxNiwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotfQotCi1URVNUX0YoR2F0dFNyVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcV9yZXF1ZXN0X3ByZXBhcmVfd3JpdGVfemVyb19sZW5fbWF4X2RhdGEpIHsKLSAgdWludDhfdCBtYXhfbWVtW01BWF9VSU5UMTZdOwotICBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcSh0Y2JfLCBMMkNBUF9BVFRfQ0lELCBlbF8sIGtIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfUkVRX1BSRVBBUkVfV1JJVEUsIDAsIG1heF9tZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLX0KLQotVEVTVF9GKEdhdHRTclRlc3QsIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX3JlcXVlc3RfcHJlcGFyZV93cml0ZV90eXBpY2FsKSB7Ci0gIHVpbnQ4X3QgcF9kYXRhWzJdID0gezB4MzQsIDB4MTJ9OwotICB1aW50MTZfdCBsZW5ndGggPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZW9mKHBfZGF0YSkgLyBzaXplb2YocF9kYXRhWzBdKSk7Ci0gIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxKHRjYl8sIEwyQ0FQX0FUVF9DSUQsIGVsXywga0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRVFfUFJFUEFSRV9XUklURSwgbGVuZ3RoLCBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLQotICBDSEVDSyh0ZXN0X3N0YXRlXy5nYXR0c193cml0ZV9hdHRyX3Blcm1fY2hlY2suYWNjZXNzX2NvdW50XyA9PSAxKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5jb25uX2lkXyA9PSBlbF8uZ2F0dF9pZik7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2sudHJhbnNfaWRfID09IDB4MTIzNDU2NzgpOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLnR5cGVfID09Ci0gICAgICAgIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0NIQVJBQ1RFUklTVElDKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5kYXRhXy53cml0ZV9yZXEub2Zmc2V0ID09Ci0gICAgICAgIDB4MTIzNCk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2suZGF0YV8ud3JpdGVfcmVxLmlzX3ByZXAgPT0KLSAgICAgICAgdHJ1ZSk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2suZGF0YV8ud3JpdGVfcmVxLmxlbiA9PSAwKTsKLX0KLQotVEVTVF9GKEdhdHRTclRlc3QsIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX3NpZ25lZF9jb21tYW5kX3dyaXRlX25vX2RhdGEpIHsKLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1NJR05fQ01EX1dSSVRFLCAwLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBrR2F0dENoYXJhY3RlcmlzdGljVHlwZSk7Ci19Ci0KLVRFU1RfRihHYXR0U3JUZXN0LAotICAgICAgIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX3NpZ25lZF9jb21tYW5kX3dyaXRlX21heF9sZW5fbm9fZGF0YSkgewotICBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcSh0Y2JfLCBMMkNBUF9BVFRfQ0lELCBlbF8sIGtIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfU0lHTl9DTURfV1JJVEUsIE1BWF9VSU5UMTYsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLX0KLQotVEVTVF9GKEdhdHRTclRlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXFfc2lnbmVkX2NvbW1hbmRfd3JpdGVfemVyb19sZW5fbWF4X2RhdGEpIHsKLSAgdWludDhfdCBtYXhfbWVtW01BWF9VSU5UMTZdOwotICBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcSh0Y2JfLCBMMkNBUF9BVFRfQ0lELCBlbF8sIGtIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfU0lHTl9DTURfV1JJVEUsIDAsIG1heF9tZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLX0KLQotVEVTVF9GKEdhdHRTclRlc3QsIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX3NpZ25lZF9jb21tYW5kX3dyaXRlX3R5cGljYWwpIHsKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0RhdGFMZW5ndGggPSA0OwotICB1aW50OF90IHBfZGF0YVtHQVRUX0FVVEhfU0lHTl9MRU4gKyBrRGF0YUxlbmd0aF0gPSB7Ci0gICAgICAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LAotICAgICAgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiwgMHgwMX07Ci0gIHVpbnQxNl90IGxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihzaXplb2YocF9kYXRhKSAvIHNpemVvZihwX2RhdGFbMF0pKTsKLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1NJR05fQ01EX1dSSVRFLCBsZW5ndGgsIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotCi0gIENIRUNLKHRlc3Rfc3RhdGVfLmdhdHRzX3dyaXRlX2F0dHJfcGVybV9jaGVjay5hY2Nlc3NfY291bnRfID09IDEpOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLmNvbm5faWRfID09IGVsXy5nYXR0X2lmKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay50cmFuc19pZF8gPT0gMHgxMjM0NTY3OCk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2sudHlwZV8gPT0KLSAgICAgICAgR0FUVFNfUkVRX1RZUEVfV1JJVEVfQ0hBUkFDVEVSSVNUSUMpOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLmRhdGFfLndyaXRlX3JlcS5vZmZzZXQgPT0gMHgwKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5kYXRhXy53cml0ZV9yZXEuaXNfcHJlcCA9PQotICAgICAgICBmYWxzZSk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2suZGF0YV8ud3JpdGVfcmVxLmxlbiA9PQotICAgICAgICBrRGF0YUxlbmd0aCk7Ci19Ci0KLVRFU1RfRihHYXR0U3JUZXN0LCBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcV9jb21tYW5kX3dyaXRlX25vX2RhdGEpIHsKLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLCBHQVRUX0NNRF9XUklURSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotfQotCi1URVNUX0YoR2F0dFNyVGVzdCwgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXFfY29tbWFuZF93cml0ZV9tYXhfbGVuX25vX2RhdGEpIHsKLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLCBHQVRUX0NNRF9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1VJTlQxNiwgbnVsbHB0ciwga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotfQotCi1URVNUX0YoR2F0dFNyVGVzdCwgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXFfY29tbWFuZF93cml0ZV96ZXJvX2xlbl9tYXhfZGF0YSkgewotICB1aW50OF90IG1heF9tZW1bTUFYX1VJTlQxNl07Ci0gIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxKHRjYl8sIEwyQ0FQX0FUVF9DSUQsIGVsXywga0hhbmRsZSwgR0FUVF9DTURfV1JJVEUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9tZW0sIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLX0KLQotVEVTVF9GKEdhdHRTclRlc3QsIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX2NvbW1hbmRfd3JpdGVfdHlwaWNhbCkgewotICB1aW50OF90IHBfZGF0YVsxNl0gPSB7MHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4OTksIDB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmYsIDB4MDF9OwotICB1aW50MTZfdCBsZW5ndGggPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZW9mKHBfZGF0YSkgLyBzaXplb2YocF9kYXRhWzBdKSk7Ci0gIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxKHRjYl8sIEwyQ0FQX0FUVF9DSUQsIGVsXywga0hhbmRsZSwgR0FUVF9DTURfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgcF9kYXRhLCBrR2F0dENoYXJhY3RlcmlzdGljVHlwZSk7Ci0KLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uZ2F0dHNfd3JpdGVfYXR0cl9wZXJtX2NoZWNrLmFjY2Vzc19jb3VudF8gPT0gMSk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2suY29ubl9pZF8gPT0gZWxfLmdhdHRfaWYpOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLnRyYW5zX2lkXyA9PSAweDEyMzQ1Njc4KTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay50eXBlXyA9PQotICAgICAgICBHQVRUU19SRVFfVFlQRV9XUklURV9DSEFSQUNURVJJU1RJQyk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2suZGF0YV8ud3JpdGVfcmVxLm9mZnNldCA9PSAweDApOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLmRhdGFfLndyaXRlX3JlcS5pc19wcmVwID09Ci0gICAgICAgIGZhbHNlKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5kYXRhXy53cml0ZV9yZXEubGVuID09IGxlbmd0aCk7Ci19Ci0KLVRFU1RfRihHYXR0U3JUZXN0LCBnYXR0c19wcm9jZXNzX3dyaXRlX3JlcV9yZXF1ZXN0X3dyaXRlX25vX2RhdGEpIHsKLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLCBHQVRUX1JFUV9XUklURSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotfQotCi1URVNUX0YoR2F0dFNyVGVzdCwgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXFfcmVxdWVzdF93cml0ZV9tYXhfbGVuX25vX2RhdGEpIHsKLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLCBHQVRUX1JFUV9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1VJTlQxNiwgbnVsbHB0ciwga0dhdHRDaGFyYWN0ZXJpc3RpY1R5cGUpOwotfQotCi1URVNUX0YoR2F0dFNyVGVzdCwgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXFfcmVxdWVzdF93cml0ZV96ZXJvX2xlbl9tYXhfZGF0YSkgewotICB1aW50OF90IG1heF9tZW1bTUFYX1VJTlQxNl07Ci0gIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxKHRjYl8sIEwyQ0FQX0FUVF9DSUQsIGVsXywga0hhbmRsZSwgR0FUVF9SRVFfV1JJVEUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9tZW0sIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLX0KLQotVEVTVF9GKEdhdHRTclRlc3QsIGdhdHRzX3Byb2Nlc3Nfd3JpdGVfcmVxX3JlcXVlc3Rfd3JpdGVfdHlwaWNhbCkgewotICB1aW50OF90IHBfZGF0YVsxNl0gPSB7MHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4OTksIDB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmYsIDB4MDF9OwotICB1aW50MTZfdCBsZW5ndGggPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZW9mKHBfZGF0YSkgLyBzaXplb2YocF9kYXRhWzBdKSk7Ci0KLSAgZ2F0dHNfcHJvY2Vzc193cml0ZV9yZXEodGNiXywgTDJDQVBfQVRUX0NJRCwgZWxfLCBrSGFuZGxlLCBHQVRUX1JFUV9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwX2RhdGEsIGtHYXR0Q2hhcmFjdGVyaXN0aWNUeXBlKTsKLQotICBDSEVDSyh0ZXN0X3N0YXRlXy5nYXR0c193cml0ZV9hdHRyX3Blcm1fY2hlY2suYWNjZXNzX2NvdW50XyA9PSAxKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5jb25uX2lkXyA9PSBlbF8uZ2F0dF9pZik7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2sudHJhbnNfaWRfID09IDB4MTIzNDU2NzgpOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLnR5cGVfID09Ci0gICAgICAgIEdBVFRTX1JFUV9UWVBFX1dSSVRFX0NIQVJBQ1RFUklTVElDKTsKLSAgQ0hFQ0sodGVzdF9zdGF0ZV8uYXBwbGljYXRpb25fcmVxdWVzdF9jYWxsYmFjay5kYXRhXy53cml0ZV9yZXEub2Zmc2V0ID09IDB4MCk7Ci0gIENIRUNLKHRlc3Rfc3RhdGVfLmFwcGxpY2F0aW9uX3JlcXVlc3RfY2FsbGJhY2suZGF0YV8ud3JpdGVfcmVxLmlzX3ByZXAgPT0KLSAgICAgICAgZmFsc2UpOwotICBDSEVDSyh0ZXN0X3N0YXRlXy5hcHBsaWNhdGlvbl9yZXF1ZXN0X2NhbGxiYWNrLmRhdGFfLndyaXRlX3JlcS5sZW4gPT0gbGVuZ3RoKTsKLX0KLQotVEVTVF9GKEdhdHRTclJvYnVzdENhY2hpbmdUZXN0LAotICAgICAgIGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmNfZm9yX2dhdHRfcmVxX3JlYWRfYnlfZ3JwX3R5cGUpIHsKLSAgdGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gZmFsc2U7Ci0KLSAgYm9vbCBzaG91bGRfaWdub3JlID0gZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYygKLSAgICAgIHRjYl8sIEwyQ0FQX0FUVF9DSUQsIEdBVFRfUkVRX1JFQURfQllfR1JQX1RZUEUsIGRlZmF1bHRfbGVuZ3RoXywKLSAgICAgIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfZmluZF90eXBlX3ZhbHVlKSB7Ci0gIHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSA9IGZhbHNlOwotCi0gIGJvb2wgc2hvdWxkX2lnbm9yZSA9IGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmMoCi0gICAgICB0Y2JfLCBMMkNBUF9BVFRfQ0lELCBHQVRUX1JFUV9GSU5EX1RZUEVfVkFMVUUsIGRlZmF1bHRfbGVuZ3RoXywKLSAgICAgIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfZmluZF9pbmZvKSB7Ci0gIHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSA9IGZhbHNlOwotCi0gIGJvb2wgc2hvdWxkX2lnbm9yZSA9IGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmMoCi0gICAgICB0Y2JfLCBMMkNBUF9BVFRfQ0lELCBHQVRUX1JFUV9GSU5EX0lORk8sIGRlZmF1bHRfbGVuZ3RoXywgZGVmYXVsdF9kYXRhXyk7Ci0KLSAgQVNTRVJUX1RSVUUoc2hvdWxkX2lnbm9yZSk7Ci0gIEFTU0VSVF9UUlVFKHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSk7Ci19Ci0KLVRFU1RfRihHYXR0U3JSb2J1c3RDYWNoaW5nVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jX2Zvcl9nYXR0X3JlcV9yZWFkX2J5X3R5cGVfcGFyc2VfZmFpbGVkKSB7Ci0gIC8vIElOVkFMSURfUERVCi0gIHVpbnQxNl90IGxlbiA9IDQ7Ci0gIHVpbnQ4X3QgcF9kYXRhWzRdID0gezB4MDAsIDB4MDIsIDB4MTQsIDB4MDJ9OwotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPSBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKAotICAgICAgdGNiXywgTDJDQVBfQVRUX0NJRCwgR0FUVF9SRVFfUkVBRF9CWV9UWVBFLCBsZW4sIHBfZGF0YSk7Ci0KLSAgQVNTRVJUX1RSVUUoc2hvdWxkX2lnbm9yZSk7Ci0gIEFTU0VSVF9UUlVFKHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSk7Ci19Ci0KLVRFU1RfRihHYXR0U3JSb2J1c3RDYWNoaW5nVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jX2Zvcl9nYXR0X3JlcV9yZWFkX2J5X3R5cGVfZGJfaGFzaF91dWlkKSB7Ci0gIC8vIEFUVF9SRUFEX0JZX1RZUEVfUkVRKDB4MDAwMSwgMHgwMDEwLCAweDJCMkEpCi0gIHVpbnQxNl90IGxlbiA9IDY7Ci0gIHVpbnQ4X3QgcF9kYXRhWzZdID0gezB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MkEsIDB4MkJ9OwotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPSBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKAotICAgICAgdGNiXywgTDJDQVBfQVRUX0NJRCwgR0FUVF9SRVFfUkVBRF9CWV9UWVBFLCBsZW4sIHBfZGF0YSk7Ci0KLSAgQVNTRVJUX0ZBTFNFKHNob3VsZF9pZ25vcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfcmVhZF9ieV90eXBlX3dyb25nX3JhbmdlKSB7Ci0gIC8vIEFUVF9SRUFEX0JZX1RZUEVfUkVRKDB4MDIwMCwgMHgwMjE0LCAweDI4MDMpCi0gIHVpbnQxNl90IGxlbiA9IDY7Ci0gIHVpbnQ4X3QgcF9kYXRhWzZdID0gezB4MDAsIDB4MDIsIDB4MTQsIDB4MDIsIDB4MkEsIDB4Mjh9OwotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPSBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKAotICAgICAgdGNiXywgTDJDQVBfQVRUX0NJRCwgR0FUVF9SRVFfUkVBRF9CWV9UWVBFLCBsZW4sIHBfZGF0YSk7Ci0KLSAgQVNTRVJUX1RSVUUoc2hvdWxkX2lnbm9yZSk7Ci0gIEFTU0VSVF9UUlVFKHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSk7Ci19Ci0KLVRFU1RfRihHYXR0U3JSb2J1c3RDYWNoaW5nVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jX2Zvcl9nYXR0X3JlcV9yZWFkX2J5X3R5cGVfb3RoZXJfdXVpZCkgewotICAvLyBBVFRfUkVBRF9CWV9UWVBFX1JFUSgweDAyMDAsIDB4MDIxNCwgMHgyODAzKQotICB1aW50MTZfdCBsZW4gPSA2OwotICB1aW50OF90IHBfZGF0YVs2XSA9IHsweDAwLCAweDAyLCAweDE0LCAweDAyLCAweDAzLCAweDI4fTsKLSAgdGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gZmFsc2U7Ci0KLSAgYm9vbCBzaG91bGRfaWdub3JlID0gZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYygKLSAgICAgIHRjYl8sIEwyQ0FQX0FUVF9DSUQsIEdBVFRfUkVRX1JFQURfQllfVFlQRSwgbGVuLCBwX2RhdGEpOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfcmVhZF9wYXJzZV9mYWlsZWQpIHsKLSAgLy8gSU5WQUxJRF9QRFUKLSAgdWludDhfdCBwX2RhdGFbMV0gPSB7MHgwMn07Ci0gIHVpbnQxNl90IGxlbiA9IDE7Ci0gIHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSA9IGZhbHNlOwotCi0gIGJvb2wgc2hvdWxkX2lnbm9yZSA9IGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmModGNiXywgTDJDQVBfQVRUX0NJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFUV9SRUFELCBsZW4sIHBfZGF0YSk7Ci0KLSAgQVNTRVJUX1RSVUUoc2hvdWxkX2lnbm9yZSk7Ci0gIEFTU0VSVF9UUlVFKHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSk7Ci19Ci0KLVRFU1RfRihHYXR0U3JSb2J1c3RDYWNoaW5nVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jX2Zvcl9nYXR0X3JlcV9yZWFkX2RiX2hhc2hfaGFuZGxlKSB7Ci0gIC8vIEFUVF9SRUFEX1JFUSgweDAwMTApCi0gIHVpbnQ4X3QgcF9kYXRhWzJdID0gezB4MTAsIDB4MDB9OwotICB1aW50MTZfdCBsZW4gPSAyOwotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPSBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKHRjYl8sIEwyQ0FQX0FUVF9DSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRVFfUkVBRCwgbGVuLCBwX2RhdGEpOwotCi0gIEFTU0VSVF9GQUxTRShzaG91bGRfaWdub3JlKTsKLX0KLQotVEVTVF9GKEdhdHRTclJvYnVzdENhY2hpbmdUZXN0LAotICAgICAgIGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmNfZm9yX2dhdHRfcmVxX3JlYWRfb3RoZXJfaGFuZGxlKSB7Ci0gIC8vIEFUVF9SRUFEX1JFUSgweDAwMDIpCi0gIHVpbnQ4X3QgcF9kYXRhWzJdID0gezB4MDIsIDB4MDB9OwotICB1aW50MTZfdCBsZW4gPSAyOwotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPSBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKHRjYl8sIEwyQ0FQX0FUVF9DSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9SRVFfUkVBRCwgbGVuLCBwX2RhdGEpOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfcmVhZF9ibG9iKSB7Ci0gIHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSA9IGZhbHNlOwotCi0gIGJvb2wgc2hvdWxkX2lnbm9yZSA9IGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmMoCi0gICAgICB0Y2JfLCBMMkNBUF9BVFRfQ0lELCBHQVRUX1JFUV9SRUFEX0JMT0IsIGRlZmF1bHRfbGVuZ3RoXywgZGVmYXVsdF9kYXRhXyk7Ci0KLSAgQVNTRVJUX1RSVUUoc2hvdWxkX2lnbm9yZSk7Ci0gIEFTU0VSVF9UUlVFKHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSk7Ci19Ci0KLVRFU1RfRihHYXR0U3JSb2J1c3RDYWNoaW5nVGVzdCwKLSAgICAgICBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jX2Zvcl9nYXR0X3JlcV9yZWFkX211bHRpKSB7Ci0gIHRjYl8uaXNfcm9idXN0X2NhY2hlX2NoYW5nZV9hd2FyZSA9IGZhbHNlOwotCi0gIGJvb2wgc2hvdWxkX2lnbm9yZSA9IGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmMoCi0gICAgICB0Y2JfLCBMMkNBUF9BVFRfQ0lELCBHQVRUX1JFUV9SRUFEX01VTFRJLCBkZWZhdWx0X2xlbmd0aF8sIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfd3JpdGUpIHsKLSAgdGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gZmFsc2U7Ci0KLSAgYm9vbCBzaG91bGRfaWdub3JlID0gZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYygKLSAgICAgIHRjYl8sIEwyQ0FQX0FUVF9DSUQsIEdBVFRfUkVRX1dSSVRFLCBkZWZhdWx0X2xlbmd0aF8sIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9jbWRfd3JpdGUpIHsKLSAgdGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gZmFsc2U7Ci0KLSAgYm9vbCBzaG91bGRfaWdub3JlID0gZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYygKLSAgICAgIHRjYl8sIEwyQ0FQX0FUVF9DSUQsIEdBVFRfQ01EX1dSSVRFLCBkZWZhdWx0X2xlbmd0aF8sIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfRkFMU0UodGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlKTsKLX0KLQotVEVTVF9GKEdhdHRTclJvYnVzdENhY2hpbmdUZXN0LAotICAgICAgIGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmNfZm9yX2dhdHRfc2lnbl9jbWRfd3JpdGUpIHsKLSAgdGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gZmFsc2U7Ci0KLSAgYm9vbCBzaG91bGRfaWdub3JlID0gZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYygKLSAgICAgIHRjYl8sIEwyQ0FQX0FUVF9DSUQsIEdBVFRfU0lHTl9DTURfV1JJVEUsIGRlZmF1bHRfbGVuZ3RoXywgZGVmYXVsdF9kYXRhXyk7Ci0KLSAgQVNTRVJUX1RSVUUoc2hvdWxkX2lnbm9yZSk7Ci0gIEFTU0VSVF9GQUxTRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9yZXFfcHJlcGFyZV93cml0ZSkgewotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPQotICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYyh0Y2JfLCBMMkNBUF9BVFRfQ0lELCBHQVRUX1JFUV9QUkVQQVJFX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2xlbmd0aF8sIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9UUlVFKHNob3VsZF9pZ25vcmUpOwotICBBU1NFUlRfVFJVRSh0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsIGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmNfZm9yX2dhdHRfcmVxX210dSkgewotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPSBnYXR0c19wcm9jZXNzX2RiX291dF9vZl9zeW5jKAotICAgICAgdGNiXywgTDJDQVBfQVRUX0NJRCwgR0FUVF9SRVFfTVRVLCBkZWZhdWx0X2xlbmd0aF8sIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9GQUxTRShzaG91bGRfaWdub3JlKTsKLX0KLQotVEVTVF9GKEdhdHRTclJvYnVzdENhY2hpbmdUZXN0LAotICAgICAgIGdhdHRzX3Byb2Nlc3NfZGJfb3V0X29mX3N5bmNfZm9yX2dhdHRfcmVxX2V4ZWNfd3JpdGUpIHsKLSAgdGNiXy5pc19yb2J1c3RfY2FjaGVfY2hhbmdlX2F3YXJlID0gZmFsc2U7Ci0KLSAgYm9vbCBzaG91bGRfaWdub3JlID0gZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYygKLSAgICAgIHRjYl8sIEwyQ0FQX0FUVF9DSUQsIEdBVFRfUkVRX0VYRUNfV1JJVEUsIGRlZmF1bHRfbGVuZ3RoXywgZGVmYXVsdF9kYXRhXyk7Ci0KLSAgQVNTRVJUX0ZBTFNFKHNob3VsZF9pZ25vcmUpOwotfQotCi1URVNUX0YoR2F0dFNyUm9idXN0Q2FjaGluZ1Rlc3QsCi0gICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luY19mb3JfZ2F0dF9oYW5kbGVfdmFsdWVfY29uZikgewotICB0Y2JfLmlzX3JvYnVzdF9jYWNoZV9jaGFuZ2VfYXdhcmUgPSBmYWxzZTsKLQotICBib29sIHNob3VsZF9pZ25vcmUgPQotICAgICAgZ2F0dHNfcHJvY2Vzc19kYl9vdXRfb2Zfc3luYyh0Y2JfLCBMMkNBUF9BVFRfQ0lELCBHQVRUX0hBTkRMRV9WQUxVRV9DT05GLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2xlbmd0aF8sIGRlZmF1bHRfZGF0YV8pOwotCi0gIEFTU0VSVF9GQUxTRShzaG91bGRfaWdub3JlKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZ2F0dC9tb2NrX2dhdHRfdXRpbHNfcmVmLmNjIGIvc3RhY2svdGVzdC9nYXR0L21vY2tfZ2F0dF91dGlsc19yZWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTZkZDQuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9nYXR0L21vY2tfZ2F0dF91dGlsc19yZWYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJzdGFjay9nYXR0L2dhdHRfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi0vKiogc3RhY2svYnR1L2J0dV90YXNrLmNjLCBpbmRpcmVjdCByZWZlcmVuY2UsIGdhdHRfdXRpbHMuY2MgLT4gbGlib3NpICovCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLQotLyoqIHN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmNjICovCi1uYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyIHsKLWJvb2wgYmFja2dyb3VuZF9jb25uZWN0X3JlbW92ZSh1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGRpcmVjdF9jb25uZWN0X3JlbW92ZSh1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICByZXR1cm4gZmFsc2U7Ci19Ci19ICAvLyBuYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyCi0KLS8qKiBzdGFjay9nYXR0L2F0dF9wcm90b2NvbC5jYyAqLwotQlRfSERSKiBhdHRwX2J1aWxkX3NyX21zZyh0R0FUVF9UQ0ImIHRjYiwgdWludDhfdCBvcF9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TUl9NU0cqIHBfbXNnKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEdBVFRfU1RBVFVTIGF0dHBfc2VuZF9jbF9jb25maXJtYXRpb25fbXNnKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQpIHsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBhdHRwX3NlbmRfY2xfbXNnKHRHQVRUX1RDQiYgdGNiLCB0R0FUVF9DTENCKiBwX2NsY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG9wX2NvZGUsIHRHQVRUX0NMX01TRyogcF9tc2cpIHsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBhdHRwX3NlbmRfc3JfbXNnKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9tc2cpIHsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLQotLyoqIHN0YWNrL2dhdHQvZ2F0dF9hdHRyLmNjICovCi12b2lkIGdhdHRfc3JfaW5pdF9jbF9zdGF0dXModEdBVFRfVENCJiB0Y2IpIHt9Ci0KLS8qKiBzdGFjay9nYXR0L2dhdHRfY2wuY2MgKi8KLXZvaWQgZ2F0dF9hY3RfZGlzY292ZXJ5KHRHQVRUX0NMQ0IqIHBfY2xjYikge30KLQotLyoqIHN0YWNrL2dhdHQvZ2F0dF9tYWluLmNjICovCi12b2lkIGdhdHRfdXBkYXRlX2FwcF91c2VfbGlua19mbGFnKHRHQVRUX0lGIGdhdHRfaWYsIHRHQVRUX1RDQiogcF90Y2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYWRkLCBib29sIGNoZWNrX2FjbF9saW5rKSB7fQotdm9pZCBnYXR0c19wcm9jX3Nydl9jaGdfaW5kX2Fjayh0R0FUVF9UQ0IpIHt9Ci1ib29sIGdhdHRfZGlzY29ubmVjdCh0R0FUVF9UQ0IqIHBfdGNiKSB7IHJldHVybiBmYWxzZTsgfQotdEdBVFRfQ0hfU1RBVEUgZ2F0dF9nZXRfY2hfc3RhdGUodEdBVFRfVENCKiBwX3RjYikgeyByZXR1cm4gR0FUVF9DSF9DTE9TRTsgfQotdm9pZCBnYXR0X3NldF9jaF9zdGF0ZSh0R0FUVF9UQ0IqIHBfdGNiLCB0R0FUVF9DSF9TVEFURSBjaF9zdGF0ZSkge30KLQotLyoqIHN0YWNrL2dhdHQvZ2F0dF9zci5jYyAqLwotdWludDMyX3QgZ2F0dF9zcl9lbnF1ZXVlX2NtZCh0R0FUVF9UQ0ImIHRjYiwgdWludDE2X3QgY2lkLCB1aW50OF90IG9wX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgeyByZXR1cm4gMHgwMDAwOyB9Ci12b2lkIGdhdHRfZGVxdWV1ZV9zcl9jbWQodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCkge30KLQotCi0vKiogc3RhY2svbDJjYXAvbDJjX2JsZS5jYyAqLwotdm9pZCBsMmNibGVfc2V0X2ZpeGVkX2NoYW5uZWxfdHhfZGF0YV9sZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZpeF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0eF9tdHUpIHt9Ci12b2lkIEwyQ0FfU2V0TGVGaXhlZENoYW5uZWxUeERhdGFMZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmaXhfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR4X210dSkge30KLS8qKiBzdGFjay9zZHAvc2RwX2RiLmNjICovCi1ib29sIFNEUF9BZGRBdHRyaWJ1dGUodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX2lkLCB1aW50OF90IGF0dHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRyX2xlbiwgdWludDhfdCogcF92YWwpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBTRFBfQWRkUHJvdG9jb2xMaXN0KHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2VsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW1fbGlzdCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFNEUF9BZGRTZXJ2aWNlQ2xhc3NJZExpc3QodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fc2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfc2VydmljZV91dWlkcykgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFNEUF9BZGRVdWlkU2VxdWVuY2UodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX2lkLCB1aW50MTZfdCBudW1fdXVpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfdXVpZHMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotdWludDMyX3QgU0RQX0NyZWF0ZVJlY29yZCh2b2lkKSB7IHJldHVybiAwOyB9Ci0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvZ2F0dC9zdGFja19nYXR0X3Rlc3QuY2MgYi9zdGFjay90ZXN0L2dhdHQvc3RhY2tfZ2F0dF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk3NzcxLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZ2F0dC9zdGFja19nYXR0X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJjb21tb24vc3RyaW5ncy5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotdm9pZCBMb2dNc2codWludDMyX3QgdHJhY2Vfc2V0X21hc2ssIGNvbnN0IGNoYXIqIGZtdF9zdHIsIC4uLikge30KLQotYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkKiBnZXRfbWFpbl90aHJlYWQoKSB7IHJldHVybiBudWxscHRyOyB9Ci0KLWNsYXNzIFN0YWNrR2F0dFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OwotCi1uYW1lc3BhY2UgewotCi0vLyBBY3R1YWwgc2l6ZSBvZiBzdHJ1Y3R1cmUgd2l0aG91dCBjb21waWxlciBwYWRkaW5nCi1zaXplX3QgYWN0dWFsX3NpemVvZl90R0FUVF9SRUcoKSB7Ci0gIHJldHVybiBzaXplb2YoYmx1ZXRvb3RoOjpVdWlkKSArIHNpemVvZih0R0FUVF9DQkFDSykgKyBzaXplb2YodEdBVFRfSUYpICsKLSAgICAgICAgIHNpemVvZihib29sKSArIHNpemVvZih1aW50OF90KSArIHNpemVvZihib29sKTsKLX0KLQotdm9pZCB0R0FUVF9ESVNDX1JFU19DQih1aW50MTZfdCBjb25uX2lkLCB0R0FUVF9ESVNDX1RZUEUgZGlzY190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9ESVNDX1JFUyogcF9kYXRhKSB7fQotdm9pZCB0R0FUVF9ESVNDX0NNUExfQ0IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfRElTQ19UWVBFIGRpc2NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1NUQVRVUyBzdGF0dXMpIHt9Ci12b2lkIHRHQVRUX0NNUExfQ0JBQ0sodWludDE2X3QgY29ubl9pZCwgdEdBVFRDX09QVFlQRSBvcCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9DTF9DT01QTEVURSogcF9kYXRhKSB7fQotdm9pZCB0R0FUVF9DT05OX0NCQUNLKHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbm5lY3RlZCwgdEdBVFRfRElTQ09OTl9SRUFTT04gcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7fQotdm9pZCB0R0FUVF9SRVFfQ0JBQ0sodWludDE2X3QgY29ubl9pZCwgdWludDMyX3QgdHJhbnNfaWQsIHRHQVRUU19SRVFfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX0RBVEEqIHBfZGF0YSkge30KLXZvaWQgdEdBVFRfQ09OR0VTVElPTl9DQkFDSyh1aW50MTZfdCBjb25uX2lkLCBib29sIGNvbmdlc3RlZCkge30KLXZvaWQgdEdBVFRfRU5DX0NNUExfQ0IodEdBVFRfSUYgZ2F0dF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7fQotdm9pZCB0R0FUVF9QSFlfVVBEQVRFX0NCKHRHQVRUX0lGIGdhdHRfaWYsIHVpbnQxNl90IGNvbm5faWQsIHVpbnQ4X3QgdHhfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5LCB0R0FUVF9TVEFUVVMgc3RhdHVzKSB7fQotdm9pZCB0R0FUVF9DT05OX1VQREFURV9DQih0R0FUVF9JRiBnYXR0X2lmLCB1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBpbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTIHN0YXR1cykge30KLQotdEdBVFRfQ0JBQ0sgZ2F0dF9jYWxsYmFja3MgPSB7Ci0gICAgLnBfY29ubl9jYiA9IHRHQVRUX0NPTk5fQ0JBQ0ssCi0gICAgLnBfY21wbF9jYiA9IHRHQVRUX0NNUExfQ0JBQ0ssCi0gICAgLnBfZGlzY19yZXNfY2IgPSB0R0FUVF9ESVNDX1JFU19DQiwKLSAgICAucF9kaXNjX2NtcGxfY2IgPSB0R0FUVF9ESVNDX0NNUExfQ0IsCi0gICAgLnBfcmVxX2NiID0gdEdBVFRfUkVRX0NCQUNLLAotICAgIC5wX2VuY19jbXBsX2NiID0gdEdBVFRfRU5DX0NNUExfQ0IsCi0gICAgLnBfY29uZ2VzdGlvbl9jYiA9IHRHQVRUX0NPTkdFU1RJT05fQ0JBQ0ssCi0gICAgLnBfcGh5X3VwZGF0ZV9jYiA9IHRHQVRUX1BIWV9VUERBVEVfQ0IsCi0gICAgLnBfY29ubl91cGRhdGVfY2IgPSB0R0FUVF9DT05OX1VQREFURV9DQiwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUX0YoU3RhY2tHYXR0VGVzdCwgbGlmZWN5Y2xlX3RHQVRUX1JFRykgewotICB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHRHQVRUX1JFRz4gcmVnMCA9IHN0ZDo6bWFrZV91bmlxdWU8dEdBVFRfUkVHPigpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx0R0FUVF9SRUc+IHJlZzEgPSBzdGQ6Om1ha2VfdW5pcXVlPHRHQVRUX1JFRz4oKTsKLSAgICBtZW1zZXQocmVnMC5nZXQoKSwgMHhmZiwgc2l6ZW9mKHRHQVRUX1JFRykpOwotICAgIG1lbXNldChyZWcxLmdldCgpLCAweGZmLCBzaXplb2YodEdBVFRfUkVHKSk7Ci0gICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWcwLmdldCgpLCByZWcxLmdldCgpLCBzaXplb2YodEdBVFRfUkVHKSkpOwotCi0gICAgbWVtc2V0KHJlZzAuZ2V0KCksIDB4MCwgc2l6ZW9mKHRHQVRUX1JFRykpOwotICAgIG1lbXNldChyZWcxLmdldCgpLCAweDAsIHNpemVvZih0R0FUVF9SRUcpKTsKLSAgICBBU1NFUlRfRVEoMCwgbWVtY21wKHJlZzAuZ2V0KCksIHJlZzEuZ2V0KCksIHNpemVvZih0R0FUVF9SRUcpKSk7Ci0gIH0KLQotICB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHRHQVRUX1JFRz4gcmVnMCA9IHN0ZDo6bWFrZV91bmlxdWU8dEdBVFRfUkVHPigpOwotICAgIG1lbXNldChyZWcwLmdldCgpLCAweGZmLCBzaXplb2YodEdBVFRfUkVHKSk7Ci0KLSAgICB0R0FUVF9SRUcgcmVnMTsKLSAgICBtZW1zZXQoJnJlZzEsIDB4ZmYsIHNpemVvZih0R0FUVF9SRUcpKTsKLQotICAgIC8vIENsZWFyIHRoZSBzdHJ1Y3R1cmVzCi0gICAgbWVtc2V0KHJlZzAuZ2V0KCksIDAsIHNpemVvZih0R0FUVF9SRUcpKTsKLSAgICAvLyBSZXN0b3JlIHRoZSBjb21wbGV4IHN0cnVjdHVyZSBhZnRlciBtZW1zZXQKLSAgICBtZW1zZXQoJnJlZzEubmFtZSwgMCwgc2l6ZW9mKHN0ZDo6c3RyaW5nKSk7Ci0gICAgcmVnMSA9IHt9OwotICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAocmVnMC5nZXQoKSwgJnJlZzEsIGFjdHVhbF9zaXplb2ZfdEdBVFRfUkVHKCkpKTsKLSAgfQotCi0gIHsKLSAgICB0R0FUVF9SRUcqIHJlZzAgPSBuZXcgdEdBVFRfUkVHKCk7Ci0gICAgdEdBVFRfUkVHKiByZWcxID0gbmV3IHRHQVRUX1JFRygpOwotICAgIG1lbXNldChyZWcwLCAwLCBzaXplb2YodEdBVFRfUkVHKSk7Ci0gICAgKnJlZzEgPSB7fTsKLSAgICByZWcwLT5pbl91c2UgPSB0cnVlOwotICAgIEFTU0VSVF9ORSgwLCBtZW1jbXAocmVnMCwgcmVnMSwgc2l6ZW9mKHRHQVRUX1JFRykpKTsKLSAgICBkZWxldGUgcmVnMTsKLSAgICBkZWxldGUgcmVnMDsKLSAgfQotfQotCi1URVNUX0YoU3RhY2tHYXR0VGVzdCwgZ2F0dF9pbml0X2ZyZWUpIHsKLSAgZ2F0dF9pbml0KCk7Ci0gIGdhdHRfZnJlZSgpOwotfQotCi1URVNUX0YoU3RhY2tHYXR0VGVzdCwgR0FUVF9SZWdpc3Rlcl9EZXJlZ2lzdGVyKSB7Ci0gIGdhdHRfaW5pdCgpOwotCi0gIC8vIEdhdHQgZGIgcHJvZmlsZSBhbHdheXMgdGFrZXMgdGhlIGZpcnN0IHNsb3QKLSAgdEdBVFRfSUYgYXBwc1tHQVRUX01BWF9BUFBTIC0gMV07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBHQVRUX01BWF9BUFBTIC0gMTsgaSsrKSB7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZSA9IGJsdWV0b290aDo6Y29tbW9uOjpTdHJpbmdGb3JtYXQoIm5hbWUlMDJkIiwgaSk7Ci0gICAgYXBwc1tpXSA9IEdBVFRfUmVnaXN0ZXIoYmx1ZXRvb3RoOjpVdWlkOjpHZXRSYW5kb20oKSwgbmFtZSwgJmdhdHRfY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgR0FUVF9NQVhfQVBQUyAtIDE7IGkrKykgewotICAgIEdBVFRfRGVyZWdpc3RlcihhcHBzW2ldKTsKLSAgfQotCi0gIGdhdHRfZnJlZSgpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9nYXR0X2Nvbm5lY3Rpb25fbWFuYWdlcl90ZXN0LmNjIGIvc3RhY2svdGVzdC9nYXR0X2Nvbm5lY3Rpb25fbWFuYWdlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQyODY0Li4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvZ2F0dF9jb25uZWN0aW9uX21hbmFnZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0jaW5jbHVkZSAic3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS90ZXN0L2FsYXJtX21vY2suaCIKLQotdXNpbmcgdGVzdGluZzo6XzsKLXVzaW5nIHRlc3Rpbmc6OkRvQWxsOwotdXNpbmcgdGVzdGluZzo6TW9jazsKLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmc7Ci0KLXVzaW5nIGNvbm5lY3Rpb25fbWFuYWdlcjo6dEFQUF9JRDsKLQotbmFtZXNwYWNlIHsKLS8vIGNvbnZlbmllbmNlIG1vY2ssIGZvciB2ZXJpZnlpbmcgYWNjZXB0bGlzdCBvcGVyYXRpb25zIG9uIGxvd2VyIGxheWVyIGFyZQotLy8gYWN0dWFsbHkgc2NoZWR1bGVkCi1jbGFzcyBBY2NlcHRsaXN0TW9jayB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDEoQWNjZXB0bGlzdEFkZCwgYm9vbChjb25zdCBSYXdBZGRyZXNzJikpOwotICBNT0NLX01FVEhPRDEoQWNjZXB0bGlzdFJlbW92ZSwgdm9pZChjb25zdCBSYXdBZGRyZXNzJikpOwotICBNT0NLX01FVEhPRDAoQWNjZXB0bGlzdENsZWFyLCB2b2lkKCkpOwotICBNT0NLX01FVEhPRDAoU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdCwgYm9vbCgpKTsKLSAgTU9DS19NRVRIT0QwKFNldExlQ29ubmVjdGlvbk1vZGVUb1Nsb3csIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMihPbkNvbm5lY3Rpb25UaW1lZE91dCwgdm9pZCh1aW50OF90LCBjb25zdCBSYXdBZGRyZXNzJikpOwotfTsKLQotc3RkOjp1bmlxdWVfcHRyPEFjY2VwdGxpc3RNb2NrPiBsb2NhbEFjY2VwdGxpc3RNb2NrOwotfSAgLy8gbmFtZXNwYWNlCi0KLVJhd0FkZHJlc3MgYWRkcmVzczF7ezB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDF9fTsKLVJhd0FkZHJlc3MgYWRkcmVzczJ7ezB4MjIsIDB4MjIsIDB4MDIsIDB4MjIsIDB4MzMsIDB4MjJ9fTsKLQotY29uc3RleHByIHRBUFBfSUQgQ0xJRU5UMSA9IDE7Ci1jb25zdGV4cHIgdEFQUF9JRCBDTElFTlQyID0gMjsKLWNvbnN0ZXhwciB0QVBQX0lEIENMSUVOVDMgPSAzOwotY29uc3RleHByIHRBUFBfSUQgQ0xJRU5UMTAgPSAxMDsKLQotLy8gSW1wbGVtZW50YXRpb24gb2YgYnRtX2JsZV9iZ2Nvbm4uaCBBUEkgZm9yIHRlc3QuCi1ib29sIEJUTV9BY2NlcHRsaXN0QWRkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgcmV0dXJuIGxvY2FsQWNjZXB0bGlzdE1vY2stPkFjY2VwdGxpc3RBZGQoYWRkcmVzcyk7Ci19Ci0KLXZvaWQgQlRNX0FjY2VwdGxpc3RSZW1vdmUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICByZXR1cm4gbG9jYWxBY2NlcHRsaXN0TW9jay0+QWNjZXB0bGlzdFJlbW92ZShhZGRyZXNzKTsKLX0KLQotdm9pZCBCVE1fQWNjZXB0bGlzdENsZWFyKCkgeyByZXR1cm4gbG9jYWxBY2NlcHRsaXN0TW9jay0+QWNjZXB0bGlzdENsZWFyKCk7IH0KLQotYm9vbCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdCgpIHsKLSAgcmV0dXJuIGxvY2FsQWNjZXB0bGlzdE1vY2stPlNldExlQ29ubmVjdGlvbk1vZGVUb0Zhc3QoKTsKLX0KLQotdm9pZCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpIHsKLSAgbG9jYWxBY2NlcHRsaXN0TW9jay0+U2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpOwotfQotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLWJvb2wgaXNfZ2RfbDJjYXBfZW5hYmxlZCgpIHsgcmV0dXJuIGZhbHNlOyB9Ci19ICAvLyBuYW1lc3BhY2Ugc2hpbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotCi1ib29sIEwyQ0FfQ29ubmVjdEZpeGVkQ2hubCh1aW50MTZfdCBmaXhlZF9jaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1uYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyIHsKLWNsYXNzIEJsZUNvbm5lY3Rpb25NYW5hZ2VyIDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGxvY2FsQWNjZXB0bGlzdE1vY2sgPSBzdGQ6Om1ha2VfdW5pcXVlPEFjY2VwdGxpc3RNb2NrPigpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBjb25uZWN0aW9uX21hbmFnZXI6OnJlc2V0KHRydWUpOwotICAgIEFsYXJtTW9jazo6UmVzZXQoKTsKLSAgICBsb2NhbEFjY2VwdGxpc3RNb2NrLnJlc2V0KCk7Ci0gIH0KLX07Ci0KLXZvaWQgb25fY29ubmVjdGlvbl90aW1lZF9vdXQodWludDhfdCBhcHBfaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgbG9jYWxBY2NlcHRsaXN0TW9jay0+T25Db25uZWN0aW9uVGltZWRPdXQoYXBwX2lkLCBhZGRyZXNzKTsKLX0KLQotLyoqIFZlcmlmeSB0aGF0IGFwcCBjYW4gYWRkIGEgZGV2aWNlIHRvIGFjY2VwdGxpc3QsIGl0IGlzIHJldHVybmVkIGFzIGludGVyZXN0ZWQKLSAqIGFwcCwgYW5kIHRoZW4gY2FuIHJlbW92ZSB0aGUgZGV2aWNlIGxhdGVyLiAqLwotVEVTVF9GKEJsZUNvbm5lY3Rpb25NYW5hZ2VyLCB0ZXN0X2JhY2tncm91bmRfY29ubmVjdGlvbl9hZGRfcmVtb3ZlKSB7Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0QWRkKGFkZHJlc3MxKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdFJlbW92ZShfKSkuVGltZXMoMCk7Ci0KLSAgRVhQRUNUX1RSVUUoYmFja2dyb3VuZF9jb25uZWN0X2FkZChDTElFTlQxLCBhZGRyZXNzMSkpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGxvY2FsQWNjZXB0bGlzdE1vY2suZ2V0KCkpOwotCi0gIHN0ZDo6c2V0PHRBUFBfSUQ+IGFwcHMgPSBnZXRfYXBwc19jb25uZWN0aW5nX3RvKGFkZHJlc3MxKTsKLSAgRVhQRUNUX0VRKGFwcHMuc2l6ZSgpLCAxVUwpOwotICBFWFBFQ1RfRVEoYXBwcy5jb3VudChDTElFTlQxKSwgMVVMKTsKLQotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0UmVtb3ZlKGFkZHJlc3MxKSkuVGltZXMoMSk7Ci0KLSAgRVhQRUNUX1RSVUUoYmFja2dyb3VuZF9jb25uZWN0X3JlbW92ZShDTElFTlQxLCBhZGRyZXNzMSkpOwotCi0gIEVYUEVDVF9FUShnZXRfYXBwc19jb25uZWN0aW5nX3RvKGFkZHJlc3MxKS5zaXplKCksIDBVTCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobG9jYWxBY2NlcHRsaXN0TW9jay5nZXQoKSk7Ci19Ci0KLS8qKiBWZXJpZnkgdGhhdCBtdWx0aXBsZSBjbGllbnRzIGFkZGluZyBzYW1lIGRldmljZSBtdWx0aXBsZSB0aW1lcywgcmVzdWx0IGluCi0gKiBkZXZpY2UgYmVpbmcgYWRkZWQgdG8gd2h0aWUgbGlzdCBvbmx5IG9uY2UsIGFsc28sIHRoYXQgZGV2aWNlIGlzIHJlbW92ZWQgb25seQotICogYWZ0ZXIgbGFzdCBjbGllbnQgcmVtb3ZlcyBpdC4gKi8KLVRFU1RfRihCbGVDb25uZWN0aW9uTWFuYWdlciwgdGVzdF9iYWNrZ3JvdW5kX2Nvbm5lY3Rpb25fbXVsdGlwbGVfY2xpZW50cykgewotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChhZGRyZXNzMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIEFjY2VwdGxpc3RSZW1vdmUoXykpLlRpbWVzKDApOwotICBFWFBFQ1RfVFJVRShiYWNrZ3JvdW5kX2Nvbm5lY3RfYWRkKENMSUVOVDEsIGFkZHJlc3MxKSk7Ci0gIEVYUEVDVF9UUlVFKGJhY2tncm91bmRfY29ubmVjdF9hZGQoQ0xJRU5UMSwgYWRkcmVzczEpKTsKLSAgRVhQRUNUX1RSVUUoYmFja2dyb3VuZF9jb25uZWN0X2FkZChDTElFTlQyLCBhZGRyZXNzMSkpOwotICBFWFBFQ1RfVFJVRShiYWNrZ3JvdW5kX2Nvbm5lY3RfYWRkKENMSUVOVDMsIGFkZHJlc3MxKSk7Ci0KLSAgRVhQRUNUX0VRKGdldF9hcHBzX2Nvbm5lY3RpbmdfdG8oYWRkcmVzczEpLnNpemUoKSwgM1VMKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhsb2NhbEFjY2VwdGxpc3RNb2NrLmdldCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChfKSkuVGltZXMoMCk7Ci0KLSAgLy8gcmVtb3ZpbmcgZnJvbSBub25leGlzdGluZyBjbGllbnQsIHNob3VsZCBmYWlsCi0gIEVYUEVDVF9GQUxTRShiYWNrZ3JvdW5kX2Nvbm5lY3RfcmVtb3ZlKENMSUVOVDEwLCBhZGRyZXNzMSkpOwotCi0gIEVYUEVDVF9UUlVFKGJhY2tncm91bmRfY29ubmVjdF9yZW1vdmUoQ0xJRU5UMSwgYWRkcmVzczEpKTsKLSAgLy8gYWxyZWFkeSByZW1vdmVkLCAgcmVtb3ZpbmcgZnJvbSBzYW1lIGNsaWVudCB0d2ljZSBzaG91bGQgcmV0dXJuIGZhbHNlOwotICBFWFBFQ1RfRkFMU0UoYmFja2dyb3VuZF9jb25uZWN0X3JlbW92ZShDTElFTlQxLCBhZGRyZXNzMSkpOwotICBFWFBFQ1RfVFJVRShiYWNrZ3JvdW5kX2Nvbm5lY3RfcmVtb3ZlKENMSUVOVDIsIGFkZHJlc3MxKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIEFjY2VwdGxpc3RSZW1vdmUoYWRkcmVzczEpKS5UaW1lcygxKTsKLSAgRVhQRUNUX1RSVUUoYmFja2dyb3VuZF9jb25uZWN0X3JlbW92ZShDTElFTlQzLCBhZGRyZXNzMSkpOwotCi0gIEVYUEVDVF9FUShnZXRfYXBwc19jb25uZWN0aW5nX3RvKGFkZHJlc3MxKS5zaXplKCksIDBVTCk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobG9jYWxBY2NlcHRsaXN0TW9jay5nZXQoKSk7Ci19Ci0KLS8qKiBWZXJpZnkgYWRkaW5nL3JlbW92aW5nIGRldmljZSB0byBkaXJlY3QgY29ubmVjdGlvbi4gKi8KLVRFU1RfRihCbGVDb25uZWN0aW9uTWFuYWdlciwgdGVzdF9kaXJlY3RfY29ubmVjdGlvbl9jbGllbnQpIHsKLSAgLy8gRGlyZWN0IGNvbm5lY3QgYXR0ZW1wdDogdXNlIGZhc3RlciBzY2FuIHBhcmFtZXRlcnMsIGFkZCB0byBhY2NlcHRsaXN0LAotICAvLyBzdGFydCAzMCB0aW1lb3V0Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBTZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0KCkpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChhZGRyZXNzMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIEFjY2VwdGxpc3RSZW1vdmUoXykpLlRpbWVzKDApOwotICBFWFBFQ1RfQ0FMTCgqQWxhcm1Nb2NrOjpHZXQoKSwgQWxhcm1OZXcoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqQWxhcm1Nb2NrOjpHZXQoKSwgQWxhcm1TZXRPbk1sb29wKF8sIF8sIF8sIF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX1RSVUUoZGlyZWN0X2Nvbm5lY3RfYWRkKENMSUVOVDEsIGFkZHJlc3MxKSk7Ci0KLSAgLy8gQXBwIGFscmVhZHkgZG9pbmcgYSBkaXJlY3QgY29ubmVjdGlvbiwgYXR0ZW1wdCB0byByZS1hZGQgcmVzdWx0IGluIGZhaWx1cmUKLSAgRVhQRUNUX0ZBTFNFKGRpcmVjdF9jb25uZWN0X2FkZChDTElFTlQxLCBhZGRyZXNzMSkpOwotCi0gIC8vIENsaWVudCB0aGF0IGRvbid0IGRvIGRpcmVjdCBjb25uZWN0aW9uIHNob3VsZCBmYWlsIGF0dGVtcHQgdG8gc3RvcCBpdAotICBFWFBFQ1RfRkFMU0UoZGlyZWN0X2Nvbm5lY3RfcmVtb3ZlKENMSUVOVDIsIGFkZHJlc3MxKSk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobG9jYWxBY2NlcHRsaXN0TW9jay5nZXQoKSk7Ci0KLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIFNldExlQ29ubmVjdGlvbk1vZGVUb1Nsb3coKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0UmVtb3ZlKF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKkFsYXJtTW9jazo6R2V0KCksIEFsYXJtRnJlZShfKSkuVGltZXMoMSk7Ci0KLSAgLy8gUmVtb3ZhbCBzaG91bGQgbG93ZXIgdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycywgYW5kIGZyZWUgdGhlIGFsYXJtLgotICAvLyBFdmVuIHRob3VnaCB3ZSBjYWxsIEFjY2VwdGxpc3RSZW1vdmUsIGl0IHdvbid0IGJlIGV4ZWN1dGVkIG92ZXIgSENJIHVudGlsCi0gIC8vIGFjY2VwdGxpc3QgaXMgaW4gdXNlLCBpLmUuIG5leHQgY29ubmVjdGlvbiBhdHRlbXB0Ci0gIEVYUEVDVF9UUlVFKGRpcmVjdF9jb25uZWN0X3JlbW92ZShDTElFTlQxLCBhZGRyZXNzMSkpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGxvY2FsQWNjZXB0bGlzdE1vY2suZ2V0KCkpOwotfQotCi0vKiogVmVyaWZ5IGRpcmVjdCBjb25uZWN0aW9uIHRpbWVvdXQgZG9lcyByZW1vdmUgZGV2aWNlIGZyb20gYWNjZXB0bGlzdCwgYW5kCi0gKiBsb3dlciB0aGUgY29ubmVjdGlvbiBzY2FuIHBhcmFtZXRlcnMgKi8KLVRFU1RfRihCbGVDb25uZWN0aW9uTWFuYWdlciwgdGVzdF9kaXJlY3RfY29ubmVjdF90aW1lb3V0KSB7Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBTZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0KCkpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChhZGRyZXNzMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoKkFsYXJtTW9jazo6R2V0KCksIEFsYXJtTmV3KF8pKS5UaW1lcygxKTsKLSAgYWxhcm1fY2FsbGJhY2tfdCBhbGFybV9jYWxsYmFjayA9IG51bGxwdHI7Ci0gIHZvaWQqIGFsYXJtX2RhdGEgPSBudWxscHRyOwotCi0gIEVYUEVDVF9DQUxMKCpBbGFybU1vY2s6OkdldCgpLCBBbGFybVNldE9uTWxvb3AoXywgXywgXywgXykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDI+KCZhbGFybV9jYWxsYmFjayksIFNhdmVBcmc8Mz4oJmFsYXJtX2RhdGEpKSk7Ci0KLSAgLy8gU3RhcnQgZGlyZWN0IGNvbm5lY3QgYXR0ZW1wdC4uLgotICBFWFBFQ1RfVFJVRShkaXJlY3RfY29ubmVjdF9hZGQoQ0xJRU5UMSwgYWRkcmVzczEpKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhsb2NhbEFjY2VwdGxpc3RNb2NrLmdldCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIEFjY2VwdGxpc3RSZW1vdmUoXykpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgT25Db25uZWN0aW9uVGltZWRPdXQoQ0xJRU5UMSwgYWRkcmVzczEpKQotICAgICAgLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqQWxhcm1Nb2NrOjpHZXQoKSwgQWxhcm1GcmVlKF8pKS5UaW1lcygxKTsKLQotICAvLyBzaW11bGF0ZSB0aW1lb3V0IHNlY29uZHMgcGFzc2VkLCBhbGFybSBleGVjdXRpbmcKLSAgYWxhcm1fY2FsbGJhY2soYWxhcm1fZGF0YSk7Ci0KLSAgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMobG9jYWxBY2NlcHRsaXN0TW9jay5nZXQoKSk7Ci19Ci0KLS8qKiBWZXJpZnkgdGhhdCB3ZSBwcm9wZXJseSBoYW5kbGUgc3VjY2Vzc2Z1bGwgZGlyZWN0IGNvbm5lY3Rpb24gKi8KLVRFU1RfRihCbGVDb25uZWN0aW9uTWFuYWdlciwgdGVzdF9kaXJlY3RfY29ubmVjdGlvbl9zdWNjZXNzKSB7Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBTZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0KCkpLlRpbWVzKDEpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChhZGRyZXNzMSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX0NBTEwoKkFsYXJtTW9jazo6R2V0KCksIEFsYXJtTmV3KF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKkFsYXJtTW9jazo6R2V0KCksIEFsYXJtU2V0T25NbG9vcChfLCBfLCBfLCBfKSkuVGltZXMoMSk7Ci0KLSAgLy8gU3RhcnQgZGlyZWN0IGNvbm5lY3QgYXR0ZW1wdC4uLgotICBFWFBFQ1RfVFJVRShkaXJlY3RfY29ubmVjdF9hZGQoQ0xJRU5UMSwgYWRkcmVzczEpKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhsb2NhbEFjY2VwdGxpc3RNb2NrLmdldCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIEFjY2VwdGxpc3RSZW1vdmUoYWRkcmVzczEpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKkFsYXJtTW9jazo6R2V0KCksIEFsYXJtRnJlZShfKSkuVGltZXMoMSk7Ci0gIC8vIHNpbXVsYXRlIGV2ZW50IGZyb20gbG93ZXIgbGF5ZXJzIC0gY29ubmVjdGlvbnMgd2FzIGVzdGFibGlzaGVkCi0gIC8vIHN1Y2Nlc3NmdWxseS4KLSAgb25fY29ubmVjdGlvbl9jb21wbGV0ZShhZGRyZXNzMSk7Ci19Ci0KLS8qKiBWZXJpZnkgdGhhdCB3ZSBwcm9wZXJseSBoYW5kbGUgYXBwbGljYXRpb24gdW5yZWdpc3RyYXRpb24gKi8KLVRFU1RfRihCbGVDb25uZWN0aW9uTWFuYWdlciwgdGVzdF9hcHBfdW5yZWdpc3RlcikgewotICAvKiBUZXN0IHNjZW5hcmlvOgotICAgKiAtIENsaWVudCAxIGNvbm5lY3RpbmcgdG8gYWRkcmVzczEgYW5kIGFkZHJlc3MyLgotICAgKiAtIENsaWVudCAyIGNvbm5lY3RpbmcgdG8gYWRkcmVzczIKLSAgICogLSB1bnJlZ2lzdHJhdGlvbiBvZiBDbGllbnQxIHNob3VsZCB0cmlnZ2VyIGFkZHJlc3MxIHJlbW92YWwgZnJvbSBhY2NlcHRsaXN0Ci0gICAqIC0gdW5yZWdpc3RyYXRpb24gb2YgQ2xpZW50MiBzaG91bGQgdHJpZ2dlciBhZGRyZXNzMiByZW1vdmFsCi0gICAqLwotCi0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0QWRkKGFkZHJlc3MxKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdEFkZChhZGRyZXNzMikpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgRVhQRUNUX1RSVUUoZGlyZWN0X2Nvbm5lY3RfYWRkKENMSUVOVDEsIGFkZHJlc3MxKSk7Ci0gIEVYUEVDVF9UUlVFKGJhY2tncm91bmRfY29ubmVjdF9hZGQoQ0xJRU5UMSwgYWRkcmVzczIpKTsKLSAgRVhQRUNUX1RSVUUoZGlyZWN0X2Nvbm5lY3RfYWRkKENMSUVOVDIsIGFkZHJlc3MyKSk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGxvY2FsQWNjZXB0bGlzdE1vY2suZ2V0KCkpOwotCi0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0UmVtb3ZlKGFkZHJlc3MxKSkuVGltZXMoMSk7Ci0gIG9uX2FwcF9kZXJlZ2lzdGVyZWQoQ0xJRU5UMSk7Ci0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGxvY2FsQWNjZXB0bGlzdE1vY2suZ2V0KCkpOwotCi0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0UmVtb3ZlKGFkZHJlc3MyKSkuVGltZXMoMSk7Ci0gIG9uX2FwcF9kZXJlZ2lzdGVyZWQoQ0xJRU5UMik7Ci19Ci0KLS8qKiBWZXJpZnkgYWRkaW5nIGRldmljZSB0byBib3RoIGRpcmVjdCBjb25uZWN0aW9uIGFuZCBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24uICovCi1URVNUX0YoQmxlQ29ubmVjdGlvbk1hbmFnZXIsIHRlc3RfZGlyZWN0X2FuZF9iYWNrZ3JvdW5kX2Nvbm5lY3QpIHsKLSAgRVhQRUNUX0NBTEwoKmxvY2FsQWNjZXB0bGlzdE1vY2ssIFNldExlQ29ubmVjdGlvbk1vZGVUb0Zhc3QoKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0QWRkKGFkZHJlc3MxKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgQWNjZXB0bGlzdFJlbW92ZShfKSkuVGltZXMoMCk7Ci0gIEVYUEVDVF9DQUxMKCpBbGFybU1vY2s6OkdldCgpLCBBbGFybU5ldyhfKSkuVGltZXMoMSk7Ci0gIEVYUEVDVF9DQUxMKCpBbGFybU1vY2s6OkdldCgpLCBBbGFybVNldE9uTWxvb3AoXywgXywgXywgXykpLlRpbWVzKDEpOwotICAvLyBhZGQgZGV2aWNlIGFzIGJvdGggZGlyZWN0IGFuZCBiYWNrZ3JvdW5kIGNvbm5lY3Rpb24KLSAgRVhQRUNUX1RSVUUoZGlyZWN0X2Nvbm5lY3RfYWRkKENMSUVOVDEsIGFkZHJlc3MxKSk7Ci0gIEVYUEVDVF9UUlVFKGJhY2tncm91bmRfY29ubmVjdF9hZGQoQ0xJRU5UMSwgYWRkcmVzczEpKTsKLQotICBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyhsb2NhbEFjY2VwdGxpc3RNb2NrLmdldCgpKTsKLQotICBFWFBFQ1RfQ0FMTCgqbG9jYWxBY2NlcHRsaXN0TW9jaywgU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpKS5UaW1lcygxKTsKLSAgRVhQRUNUX0NBTEwoKkFsYXJtTW9jazo6R2V0KCksIEFsYXJtRnJlZShfKSkuVGltZXMoMSk7Ci0gIC8vIG5vdCByZW1vdmluZyBmcm9tIGFjY2VwdGxpc3QgeWV0LCBhcyB0aGUgYmFja2dyb3VuZCBjb25uZWN0aW9uIGlzIHN0aWxsCi0gIC8vIHBlbmRpbmcuCi0gIEVYUEVDVF9UUlVFKGRpcmVjdF9jb25uZWN0X3JlbW92ZShDTElFTlQxLCBhZGRyZXNzMSkpOwotCi0gIC8vIHJlbW92ZSBmcm9tIGFjY2VwdGxpc3QsIGJlY2F1c2Ugbm8gbW9yZSBpbnRlcmVzdCBpbiBkZXZpY2UuCi0gIEVYUEVDVF9DQUxMKCpsb2NhbEFjY2VwdGxpc3RNb2NrLCBBY2NlcHRsaXN0UmVtb3ZlKF8pKS5UaW1lcygxKTsKLSAgRVhQRUNUX1RSVUUoYmFja2dyb3VuZF9jb25uZWN0X3JlbW92ZShDTElFTlQxLCBhZGRyZXNzMSkpOwotCi0gIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKGxvY2FsQWNjZXB0bGlzdE1vY2suZ2V0KCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29ubmVjdGlvbl9tYW5hZ2VyCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L2hjaS9zdGFja19oY2lfdGVzdC5jYyBiL3N0YWNrL3Rlc3QvaGNpL3N0YWNrX2hjaV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWY5OGEzLi4wMDAwMDAwCi0tLSBhL3N0YWNrL3Rlc3QvaGNpL3N0YWNrX2hjaV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaWRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2RlZnMuaCIKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19oY2ljX2hjaWNtZHMuaCIKLQotc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLW5hbWVzcGFjZSBtb2NrID0gdGVzdDo6bW9jazo6aGNpY19oY2ljbWRzOwotCi1uYW1lc3BhY2UgewotCi11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgdGVzdGluZzo6UG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyB0ZXN0aW5nOjpTYXZlQXJnUG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlN0ckVxOwotdXNpbmcgdGVzdGluZzo6U3RyaWN0TW9jazsKLXVzaW5nIHRlc3Rpbmc6OlRlc3Q7Ci0KLWNsYXNzIFN0YWNrSGNpVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcC5jbGVhcigpOyB9Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotfTsKLQotVEVTVF9GKFN0YWNrSGNpVGVzdCwgaGNpX3ByZWFtYmxlKSB7Ci0gIHsKLSAgICBIY2lEYXRhUHJlYW1ibGUgcHJlYW1ibGU7Ci0KLSAgICBBU1NFUlRfRVEoc2l6ZW9mKHByZWFtYmxlKSwgSENJX0RBVEFfUFJFQU1CTEVfU0laRSk7Ci0KLSAgICBwcmVhbWJsZS5iaXRzLmhhbmRsZSA9IDB4ZmZmOwotICAgIHByZWFtYmxlLmJpdHMuYm91bmRhcnkgPSAweDM7Ci0gICAgcHJlYW1ibGUuYml0cy5icm9hZGNhc3QgPSAweDE7Ci0gICAgcHJlYW1ibGUuYml0cy51bnVzZWQxNSA9IDB4MDsKLSAgICBwcmVhbWJsZS5iaXRzLmxlbmd0aCA9IDB4ZmZmZjsKLQotICAgIEFTU0VSVF9FUSgweDdmZmYsIHByZWFtYmxlLnJhdy53b3JkMCk7Ci0gICAgQVNTRVJUX0VRKDB4ZmZmZiwgcHJlYW1ibGUucmF3LndvcmQxKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgZXhwW10gPSB7MHhmZiwgMHg3ZiwgMHhmZiwgMHhmZn07Ci0gICAgdWludDhfdCBhY3Rbc2l6ZW9mKHByZWFtYmxlKV07Ci0gICAgcHJlYW1ibGUuU2VyaWFsaXplKGFjdCk7Ci0gICAgQVNTRVJUX0VRKDAsIHN0ZDo6bWVtY21wKGV4cCwgYWN0LCBzaXplb2YocHJlYW1ibGUpKSk7Ci0gIH0KLQotICB7Ci0gICAgSGNpRGF0YVByZWFtYmxlIHByZWFtYmxlOwotICAgIHByZWFtYmxlLnJhdy53b3JkMCA9Ci0gICAgICAgIDB4MTIzIHwgKEwyQ0FQX1BLVF9TVEFSVF9OT05fRkxVU0hBQkxFIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKTsKLSAgICBwcmVhbWJsZS5yYXcud29yZDEgPSAweDQ1Njc7Ci0KLSAgICBBU1NFUlRfRVEoc2l6ZW9mKHByZWFtYmxlKSwgSENJX0RBVEFfUFJFQU1CTEVfU0laRSk7Ci0KLSAgICBBU1NFUlRfRVEoMHgwMTIzLCBwcmVhbWJsZS5yYXcud29yZDApOwotICAgIEFTU0VSVF9FUSgweDQ1NjcsIHByZWFtYmxlLnJhdy53b3JkMSk7Ci0KLSAgICBjb25zdCB1aW50OF90IGV4cFtdID0gezB4MjMsIDB4MDEsIDB4NjcsIDB4NDV9OwotICAgIHVpbnQ4X3QgYWN0W3NpemVvZihwcmVhbWJsZSldOwotICAgIHByZWFtYmxlLlNlcmlhbGl6ZShhY3QpOwotICAgIEFTU0VSVF9FUSgwLCBzdGQ6Om1lbWNtcChleHAsIGFjdCwgc2l6ZW9mKHByZWFtYmxlKSkpOwotICB9Ci0gIHsKLSAgICBIY2lEYXRhUHJlYW1ibGUgcHJlYW1ibGU7Ci0gICAgcHJlYW1ibGUucmF3LndvcmQwID0gMHgxMjMgfCAoTDJDQVBfUEtUX1NUQVJUIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKTsKLSAgICBwcmVhbWJsZS5yYXcud29yZDEgPSAweDQ1Njc7Ci0KLSAgICBBU1NFUlRfRVEoc2l6ZW9mKHByZWFtYmxlKSwgSENJX0RBVEFfUFJFQU1CTEVfU0laRSk7Ci0KLSAgICBBU1NFUlRfRVEoMHgyMTIzLCBwcmVhbWJsZS5yYXcud29yZDApOwotICAgIEFTU0VSVF9FUSgweDQ1NjcsIHByZWFtYmxlLnJhdy53b3JkMSk7Ci0KLSAgICBjb25zdCB1aW50OF90IGV4cFtdID0gezB4MjMsIDB4MjEsIDB4NjcsIDB4NDV9OwotICAgIHVpbnQ4X3QgYWN0W3NpemVvZihwcmVhbWJsZSldOwotICAgIHByZWFtYmxlLlNlcmlhbGl6ZShhY3QpOwotICAgIEFTU0VSVF9FUSgwLCBzdGQ6Om1lbWNtcChleHAsIGFjdCwgc2l6ZW9mKHByZWFtYmxlKSkpOwotICB9Ci0KLSAgewotICAgIEhjaURhdGFQcmVhbWJsZSBwcmVhbWJsZTsKLSAgICBwcmVhbWJsZS5yYXcud29yZDAgPSAweDAgfCAoTDJDQVBfUEtUX1NUQVJUIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKTsKLSAgICBwcmVhbWJsZS5yYXcud29yZDEgPSAweDA7Ci0KLSAgICBBU1NFUlRfRVEoc2l6ZW9mKHByZWFtYmxlKSwgSENJX0RBVEFfUFJFQU1CTEVfU0laRSk7Ci0KLSAgICBBU1NFUlRfRVEoMHgyMDAwLCBwcmVhbWJsZS5yYXcud29yZDApOwotICAgIEFTU0VSVF9FUSgweDAwMDAsIHByZWFtYmxlLnJhdy53b3JkMSk7Ci0KLSAgICBjb25zdCB1aW50OF90IGV4cFtdID0gezB4MDAsIDB4MjAsIDB4MDAsIDB4MDB9OwotICAgIHVpbnQ4X3QgYWN0W3NpemVvZihwcmVhbWJsZSldOwotICAgIHByZWFtYmxlLlNlcmlhbGl6ZShhY3QpOwotICAgIEFTU0VSVF9FUSgwLCBzdGQ6Om1lbWNtcChleHAsIGFjdCwgc2l6ZW9mKHByZWFtYmxlKSkpOwotICB9Ci0KLSAgewotICAgIEhjaURhdGFQcmVhbWJsZSBwcmVhbWJsZTsKLSAgICBwcmVhbWJsZS5yYXcud29yZDAgPSAweDAgfCAoTDJDQVBfUEtUX1NUQVJUIDw8IEwyQ0FQX1BLVF9UWVBFX1NISUZUKTsKLSAgICBwcmVhbWJsZS5yYXcud29yZDEgPSAweDA7Ci0KLSAgICBBU1NFUlRfVFJVRShwcmVhbWJsZS5Jc0ZsdXNoYWJsZSgpKTsKLQotICAgIHByZWFtYmxlLnJhdy53b3JkMCA9Ci0gICAgICAgIDB4MCB8IChMMkNBUF9QS1RfU1RBUlQgPDwgTDJDQVBfUEtUX1NUQVJUX05PTl9GTFVTSEFCTEUpOwotICAgIEFTU0VSVF9UUlVFKCFwcmVhbWJsZS5Jc0ZsdXNoYWJsZSgpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvaGlkL3N0YWNrX2hpZF90ZXN0LmNjIGIvc3RhY2svdGVzdC9oaWQvc3RhY2tfaGlkX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTU1ZDMuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9oaWQvc3RhY2tfaGlkX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzdGFjay9oaWQvaGlkaF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLWJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogZ2V0X21haW5fdGhyZWFkKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotdEhDSV9SRUFTT04gYnRtX2dldF9hY2xfZGlzY19yZWFzb25fY29kZSh2b2lkKSB7IHJldHVybiBIQ0lfU1VDQ0VTUzsgfQotCi1ib29sIEJUTV9Jc0FjbENvbm5lY3Rpb25VcChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci1uYW1lc3BhY2UgewotCi11c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6RG9BbGw7Ci11c2luZyB0ZXN0aW5nOjpOb3ROdWxsOwotdXNpbmcgdGVzdGluZzo6UG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmc7Ci11c2luZyB0ZXN0aW5nOjpTYXZlQXJnUG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlN0ckVxOwotdXNpbmcgdGVzdGluZzo6U3RyaWN0TW9jazsKLXVzaW5nIHRlc3Rpbmc6OlRlc3Q7Ci0KLWNsYXNzIFN0YWNrSGlkVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwdWJsaWM6Ci0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcC5jbGVhcigpOyB9Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotfTsKLQotVEVTVF9GKFN0YWNrSGlkVGVzdCwgZGlzY29ubmVjdF9iYWRfY2lkKSB7Ci0gIHRMMkNBUF9BUFBMX0lORk8gbDJjYXBfY2FsbGJhY2tzOwotCi0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9SZWdpc3RlcjIuYm9keSA9Ci0gICAgICBbJmwyY2FwX2NhbGxiYWNrc10odWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwpIHsKLSAgICAgICAgbDJjYXBfY2FsbGJhY2tzID0gcF9jYl9pbmZvOwotICAgICAgICByZXR1cm4gcHNtOwotICAgICAgfTsKLQotICB0SElEX1NUQVRVUyBzdGF0dXMgPSBoaWRoX2Nvbm5fcmVnKCk7Ci0gIEFTU0VSVF9FUShISURfU1VDQ0VTUywgc3RhdHVzKTsKLQotICBsMmNhcF9jYWxsYmFja3MucEwyQ0FfRXJyb3JfQ2IoMTIzLCA0NTYpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvcmZjb21tL3N0YWNrX3JmY29tbV90ZXN0LmNjIGIvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDE2NzQuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIm1vY2tfYnRtX2xheWVyLmgiCi0jaW5jbHVkZSAibW9ja19sMmNhcF9sYXllci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9wb3J0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL3JmY29tbS9yZmNfaW50LmgiCi0jaW5jbHVkZSAic3RhY2tfcmZjb21tX3Rlc3RfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFja190ZXN0X3BhY2tldF91dGlscy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0ZDo6c3RyaW5nIER1bXBCeXRlQnVmZmVyVG9TdHJpbmcodWludDhfdCogcF9kYXRhLCBzaXplX3QgbGVuKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cjsKLSAgc3RyLnNldGYoc3RkOjppb3NfYmFzZTo6aGV4LCBzdGQ6Omlvczo6YmFzZWZpZWxkKTsKLSAgc3RyLnNldGYoc3RkOjppb3NfYmFzZTo6dXBwZXJjYXNlKTsKLSAgc3RyLmZpbGwoJzAnKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgIHN0ciA8PCBzdGQ6OnNldHcoMikgPDwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHBfZGF0YVtpXSk7Ci0gICAgc3RyIDw8ICIgIjsKLSAgfQotICByZXR1cm4gc3RyLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBEdW1wQnRIZHJUb1N0cmluZyhCVF9IRFIqIHBfaGRyKSB7Ci0gIHVpbnQ4X3QqIHBfaGRyX2RhdGEgPSBwX2hkci0+ZGF0YSArIHBfaGRyLT5vZmZzZXQ7Ci0gIHJldHVybiBEdW1wQnl0ZUJ1ZmZlclRvU3RyaW5nKHBfaGRyX2RhdGEsIHBfaGRyLT5sZW4pOwotfQotCi12b2lkIFByaW50VG8oQlRfSERSKiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICpvcyA8PCBEdW1wQnRIZHJUb1N0cmluZyh2YWx1ZSk7Ci19Ci0KLXZvaWQgUHJpbnRUbyh0TDJDQVBfQ0ZHX0lORk8qIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8IER1bXBCeXRlQnVmZmVyVG9TdHJpbmcoKHVpbnQ4X3QqKXZhbHVlLCBzaXplb2YodEwyQ0FQX0NGR19JTkZPKSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHRlc3Rpbmc6Ol87Ci11c2luZyB0ZXN0aW5nOjpEb0FsbDsKLXVzaW5nIHRlc3Rpbmc6OlJldHVybjsKLXVzaW5nIHRlc3Rpbmc6OlRlc3Q7Ci11c2luZyB0ZXN0aW5nOjpTdHJpY3RNb2NrOwotdXNpbmcgdGVzdGluZzo6U2F2ZUFyZzsKLXVzaW5nIHRlc3Rpbmc6OlNhdmVBcmdQb2ludGVlOwotdXNpbmcgdGVzdGluZzo6UG9pbnRlZTsKLXVzaW5nIHRlc3Rpbmc6OlN0ckVxOwotdXNpbmcgdGVzdGluZzo6Tm90TnVsbDsKLQotdXNpbmcgYmx1ZXRvb3RoOjpDcmVhdGVMMmNhcERhdGFQYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OkNyZWF0ZUFjbFBhY2tldDsKLXVzaW5nIGJsdWV0b290aDo6QWxsb2NhdGVXcmFwcGVkSW5jb21pbmdMMmNhcEFjbFBhY2tldDsKLXVzaW5nIGJsdWV0b290aDo6QWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldDsKLQotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkdldERsY2k7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6R2V0QWRkcmVzc0ZpZWxkOwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkdldENvbnRyb2xGaWVsZDsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVNY2NQbkZyYW1lOwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkNyZWF0ZU1jY01zY0ZyYW1lOwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkNyZWF0ZU11bHRpcGxleGVyQ29udHJvbEZyYW1lOwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkNyZWF0ZVJmY29tbVBhY2tldDsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVRdWlja0RhdGFQYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6Q3JlYXRlUXVpY2tQblBhY2tldDsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVRdWlja1NhYm1QYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6Q3JlYXRlUXVpY2tVYVBhY2tldDsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVRdWlja01zY1BhY2tldDsKLQotTUFUQ0hFUl9QKFBvaW50ZXJNZW1vcnlFcXVhbCwgcHRyLAotICAgICAgICAgIER1bXBCeXRlQnVmZmVyVG9TdHJpbmcoKHVpbnQ4X3QqKXB0ciwgc2l6ZW9mKCpwdHIpKSkgewotICByZXR1cm4gbWVtY21wKGFyZywgcHRyLCBzaXplb2YoKnB0cikpID09IDA7Ci19Ci0KLU1BVENIRVJfUChCdEhkckVxdWFsLCBleHBlY3RlZCwgRHVtcEJ0SGRyVG9TdHJpbmcoZXhwZWN0ZWQpKSB7Ci0gIGF1dG8gYXJnX2hkciA9IHN0YXRpY19jYXN0PEJUX0hEUio+KGFyZyk7Ci0gIHVpbnQ4X3QqIGFyZ19kYXRhID0gYXJnX2hkci0+ZGF0YSArIGFyZ19oZHItPm9mZnNldDsKLSAgYXV0byBleHBlY3RlZF9oZHIgPSBzdGF0aWNfY2FzdDxCVF9IRFIqPihleHBlY3RlZCk7Ci0gIHVpbnQ4X3QqIGV4cGVjdGVkX2RhdGEgPSBleHBlY3RlZF9oZHItPmRhdGEgKyBleHBlY3RlZF9oZHItPm9mZnNldDsKLSAgcmV0dXJuIG1lbWNtcChhcmdfZGF0YSwgZXhwZWN0ZWRfZGF0YSwgZXhwZWN0ZWRfaGRyLT5sZW4pID09IDA7Ci19Ci0KLWJsdWV0b290aDo6cmZjb21tOjpNb2NrUmZjb21tQ2FsbGJhY2sqIHJmY29tbV9jYWxsYmFjayA9IG51bGxwdHI7Ci0KLXZvaWQgcG9ydF9tZ210X2NiYWNrXzAodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgcmZjb21tX2NhbGxiYWNrLT5Qb3J0TWFuYWdlbWVudENhbGxiYWNrKGNvZGUsIHBvcnRfaGFuZGxlLCAwKTsKLX0KLQotdm9pZCBwb3J0X21nbXRfY2JhY2tfMSh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICByZmNvbW1fY2FsbGJhY2stPlBvcnRNYW5hZ2VtZW50Q2FsbGJhY2soY29kZSwgcG9ydF9oYW5kbGUsIDEpOwotfQotCi12b2lkIHBvcnRfZXZlbnRfY2JhY2tfMCh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSkgewotICByZmNvbW1fY2FsbGJhY2stPlBvcnRFdmVudENhbGxiYWNrKGNvZGUsIHBvcnRfaGFuZGxlLCAwKTsKLX0KLQotdm9pZCBwb3J0X2V2ZW50X2NiYWNrXzEodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgcmZjb21tX2NhbGxiYWNrLT5Qb3J0RXZlbnRDYWxsYmFjayhjb2RlLCBwb3J0X2hhbmRsZSwgMSk7Ci19Ci0KLVJhd0FkZHJlc3MgR2V0VGVzdEFkZHJlc3MoaW50IGluZGV4KSB7Ci0gIENIRUNLX0xUKGluZGV4LCBVSU5UOF9NQVgpOwotICBSYXdBZGRyZXNzIHJlc3VsdCA9IHsKLSAgICAgIHsweEFBLCAweDAwLCAweDExLCAweDIyLCAweDMzLCBzdGF0aWNfY2FzdDx1aW50OF90PihpbmRleCl9fTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY2xhc3MgU3RhY2tSZmNvbW1UZXN0IDogcHVibGljIFRlc3QgewotIHB1YmxpYzoKLSAgdm9pZCBTdGFydFNlcnZlclBvcnQodWludDE2X3QgdXVpZCwgdWludDhfdCBzY24sIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgdFBPUlRfQ0FMTEJBQ0sqIG1hbmFnZW1lbnRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0NBTExCQUNLKiBldmVudF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHNlcnZlcl9oYW5kbGUpIHsKLSAgICBWTE9HKDEpIDw8ICJTdGVwIDEiOwotICAgIEFTU0VSVF9FUShSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbih1dWlkLCBzY24sIHRydWUsIG10dSwgUmF3QWRkcmVzczo6a0FueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hhbmRsZSwgbWFuYWdlbWVudF9jYWxsYmFjayksCi0gICAgICAgICAgICAgIFBPUlRfU1VDQ0VTUyk7Ci0gICAgQVNTRVJUX0VRKFBPUlRfU2V0RXZlbnRNYXNrKCpzZXJ2ZXJfaGFuZGxlLCBQT1JUX0VWX1JYQ0hBUiksIFBPUlRfU1VDQ0VTUyk7Ci0gICAgQVNTRVJUX0VRKFBPUlRfU2V0RXZlbnRDYWxsYmFjaygqc2VydmVyX2hhbmRsZSwgZXZlbnRfY2FsbGJhY2spLAotICAgICAgICAgICAgICBQT1JUX1NVQ0NFU1MpOwotICB9Ci0KLSAgdm9pZCBDb25uZWN0U2VydmVyTDJjYXAoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyLCB1aW50MTZfdCBhY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsY2lkKSB7Ci0gICAgVkxPRygxKSA8PCAiU3RlcCAxIjsKLSAgICAvLyBSZW1vdGUgZGV2aWNlIGNvbm5lY3QgdG8gdGhpcyBjaGFubmVsLCB3ZSBzaGFsbCBhY2NlcHQKLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjbWRfaWQgPSAweDA3OwotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgICAgQ29ubmVjdFJlc3BvbnNlKHBlZXJfYWRkciwgY21kX2lkLCBsY2lkLCBMMkNBUF9DT05OX09LLCAwKSk7Ci0gICAgdEwyQ0FQX0NGR19JTkZPIGNmZ19yZXEgPSB7Lm10dV9wcmVzZW50ID0gdHJ1ZSwgLm10dSA9IEwyQ0FQX01UVV9TSVpFfTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIENvbmZpZ1JlcXVlc3QobGNpZCwgUG9pbnRlck1lbW9yeUVxdWFsKCZjZmdfcmVxKSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdEluZF9DYihwZWVyX2FkZHIsIGxjaWQsIEJUX1BTTV9SRkNPTU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9pZCk7Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDIiOwotICAgIC8vIE1UVSBjb25maWd1cmF0aW9uIGlzIGRvbmUKLSAgICBjZmdfcmVxLm10dV9wcmVzZW50ID0gZmFsc2U7Ci0gICAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9Db25maWdDZm1fQ2IobGNpZCwgTDJDQVBfQ0ZHX09LLCB7fSk7Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDMiOwotICAgIC8vIFJlbW90ZSBkZXZpY2UgYWxzbyBhc2sgdG8gY29uZmlndXJlIE1UVSBzaXplCi0gICAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgICBDb25maWdSZXNwb25zZShsY2lkLCBQb2ludGVyTWVtb3J5RXF1YWwoJmNmZ19yZXEpKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7Ci0gICAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9Db25maWdJbmRfQ2IobGNpZCwgJmNmZ19yZXEpOwotCi0gICAgVkxPRygxKSA8PCAiU3RlcCA0IjsKLSAgICAvLyBSZW1vdGUgZGV2aWNlIGNvbm5lY3QgdG8gc2VydmVyIGNoYW5uZWwgMAotICAgIEJUX0hEUiogc2FibV9jaGFubmVsXzAgPSBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgICAgICBDcmVhdGVRdWlja1NhYm1QYWNrZXQoUkZDT01NX01YX0RMQ0ksIGxjaWQsIGFjbF9oYW5kbGUpKTsKLSAgICBCVF9IRFIqIHVhX2NoYW5uZWxfMCA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrVWFQYWNrZXQoUkZDT01NX01YX0RMQ0ksIGxjaWQsIGFjbF9oYW5kbGUpKTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBEYXRhV3JpdGUobGNpZCwgQnRIZHJFcXVhbCh1YV9jaGFubmVsXzApKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihMMkNBUF9EV19TVUNDRVNTKSk7Ci0gICAgLy8gUGFja2V0IHNob3VsZCBiZSBmcmVlZCBieSBSRkNPTU0KLSAgICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobGNpZCwgc2FibV9jaGFubmVsXzApOwotICAgIG9zaV9mcmVlKHVhX2NoYW5uZWxfMCk7Ci0gIH0KLQotICB2b2lkIENvbm5lY3RTZXJ2ZXJQb3J0KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwgdWludDE2X3QgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY24sIHVpbnQxNl90IG10dSwgdWludDE2X3QgYWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsY2lkLCBpbnQgcG9ydF9jYWxsYmFja19pbmRleCkgewotICAgIFZMT0coMSkgPDwgIlN0ZXAgMSI7Ci0gICAgLy8gTmVnb3RpYXRlIHBhcmFtZXRlcnMgb24gc2NuCi0gICAgQlRfSERSKiB1aWhfcG5fY21kX2Zyb21fcGVlciA9IEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrUG5QYWNrZXQodHJ1ZSwgR2V0RGxjaShmYWxzZSwgc2NuKSwgdHJ1ZSwgbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGQ09NTV9QTl9DT05WX0xBWUVSX0NCRkNfSSA+PiA0LCAwLCBSRkNPTU1fS19NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNpZCwgYWNsX2hhbmRsZSkpOwotICAgIEJUX0hEUiogdWloX3BuX3JzcF90b19wZWVyID0gQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldCgKLSAgICAgICAgQ3JlYXRlUXVpY2tQblBhY2tldChmYWxzZSwgR2V0RGxjaShmYWxzZSwgc2NuKSwgZmFsc2UsIG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRkNPTU1fUE5fQ09OVl9MQVlFUl9DQkZDX1IgPj4gNCwgMCwgUkZDT01NX0tfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaWQsIGFjbF9oYW5kbGUpKTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIERhdGFXcml0ZShsY2lkLCBCdEhkckVxdWFsKHVpaF9wbl9yc3BfdG9fcGVlcikpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEwyQ0FQX0RXX1NVQ0NFU1MpKTsKLSAgICAvLyB1aWhfcG5fY21kX2Zyb21fcGVlciBzaG91bGQgYmUgZnJlZWQgYnkgdGhpcyBtZXRob2QKLSAgICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobGNpZCwgdWloX3BuX2NtZF9mcm9tX3BlZXIpOwotICAgIG9zaV9mcmVlKHVpaF9wbl9yc3BfdG9fcGVlcik7Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDIiOwotICAgIC8vIFJlbW90ZSBkZXZpY2UgY29ubmVjdCB0byBzY24KLSAgICB0QlRNX1NFQ19DQUxMQkFDSyogc2VjdXJpdHlfY2FsbGJhY2sgPSBudWxscHRyOwotICAgIHZvaWQqIHBfcG9ydCA9IG51bGxwdHI7Ci0gICAgQlRfSERSKiBzYWJtX2NoYW5uZWxfZGxjaSA9IEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrU2FibVBhY2tldChHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlKSk7Ci0gICAgRVhQRUNUX0NBTEwoYnRtX3NlY3VyaXR5X2ludGVybmFsX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgICAgTXVsdGlwbGV4aW5nUHJvdG9jb2xBY2Nlc3NSZXF1ZXN0KHBlZXJfYWRkciwgQlRfUFNNX1JGQ09NTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEJUTV9TRUNfUFJPVE9fUkZDT01NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY24sIE5vdE51bGwoKSwgTm90TnVsbCgpKSkKLSAgICAgICAgLldpbGxPbmNlKERvQWxsKFNhdmVBcmc8NT4oJnNlY3VyaXR5X2NhbGxiYWNrKSwgU2F2ZUFyZzw2PigmcF9wb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybihCVE1fU1VDQ0VTUykpKTsKLSAgICAvLyBzYWJtX2NoYW5uZWxfZGxjaSBzaG91bGQgYmUgZnJlZWQgYnkgdGhpcyBtZXRob2QKLSAgICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobGNpZCwgc2FibV9jaGFubmVsX2RsY2kpOwotCi0gICAgVkxPRygxKSA8PCAiU3RlcCAzIjsKLSAgICAvLyBDb25maXJtIHNlY3VyaXR5IGNoZWNrIHNob3VsZCB0cmlnZ2VyIHBvcnQgYXMgY29ubmVjdGVkCi0gICAgRVhQRUNUX0NBTEwoCi0gICAgICAgIHJmY29tbV9jYWxsYmFja18sCi0gICAgICAgIFBvcnRNYW5hZ2VtZW50Q2FsbGJhY2soUE9SVF9TVUNDRVNTLCBwb3J0X2hhbmRsZSwgcG9ydF9jYWxsYmFja19pbmRleCkpOwotICAgIEJUX0hEUiogdWFfY2hhbm5lbF9kbGNpID0gQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldCgKLSAgICAgICAgQ3JlYXRlUXVpY2tVYVBhY2tldChHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlKSk7Ci0gICAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywgRGF0YVdyaXRlKGxjaWQsIEJ0SGRyRXF1YWwodWFfY2hhbm5lbF9kbGNpKSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oTDJDQVBfRFdfU1VDQ0VTUykpOwotICAgIEFTU0VSVF9UUlVFKHNlY3VyaXR5X2NhbGxiYWNrKTsKLSAgICBzZWN1cml0eV9jYWxsYmFjaygmcGVlcl9hZGRyLCBCVF9UUkFOU1BPUlRfQlJfRURSLCBwX3BvcnQsIEJUTV9TVUNDRVNTKTsKLSAgICBvc2lfZnJlZSh1YV9jaGFubmVsX2RsY2kpOwotCi0gICAgVkxPRygxKSA8PCAiU3RlcCA0IjsKLSAgICAvLyBSZW1vdGUgYWxzbyBuZWVkIHRvIGNvbmZpZ3VyZSBpdHMgbW9kZW0gc2lnbmFsIGJlZm9yZSB3ZSBjYW4gc2VuZCBkYXRhCi0gICAgQlRfSERSKiB1aWhfbXNjX2NtZF9mcm9tX3BlZXIgPSBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgICAgICBDcmVhdGVRdWlja01zY1BhY2tldCh0cnVlLCBHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgICBCVF9IRFIqIHVpaF9tc2NfcmVzcG9uc2VfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrTXNjUGFja2V0KGZhbHNlLCBHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKSk7Ci0gICAgLy8gV2UgYWxzbyBoYXZlIHRvIGRvIG1vZGVtIGNvbmZpZ3VyYXRpb24gb3Vyc2VsZgotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgICAgRGF0YVdyaXRlKGxjaWQsIEJ0SGRyRXF1YWwodWloX21zY19yZXNwb25zZV90b19wZWVyKSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oTDJDQVBfRFdfU1VDQ0VTUykpOwotICAgIEJUX0hEUiogdWloX21zY19jbWRfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrTXNjUGFja2V0KGZhbHNlLCBHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIERhdGFXcml0ZShsY2lkLCBCdEhkckVxdWFsKHVpaF9tc2NfY21kX3RvX3BlZXIpKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihMMkNBUF9EV19TVUNDRVNTKSk7Ci0gICAgLy8gdWloX21zY19jbWRfZnJvbV9wZWVyIHNob3VsZCBiZSBmcmVlZCBieSB0aGlzIG1ldGhvZAotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfRGF0YUluZF9DYihsY2lkLCB1aWhfbXNjX2NtZF9mcm9tX3BlZXIpOwotICAgIG9zaV9mcmVlKHVpaF9tc2NfcmVzcG9uc2VfdG9fcGVlcik7Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDUiOwotICAgIC8vIG1vZGVtIGNvbmZpZ3VyYXRpb24gaXMgZG9uZQotICAgIEJUX0hEUiogdWloX21zY19yZXNwb25zZV9mcm9tX3BlZXIgPSBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgICAgICBDcmVhdGVRdWlja01zY1BhY2tldCh0cnVlLCBHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKSk7Ci0gICAgLy8gdWloX21zY19yZXNwb25zZV9mcm9tX3BlZXIgc2hvdWxkIGJlIGZyZWVkIGJ5IHRoaXMgbWV0aG9kCi0gICAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9EYXRhSW5kX0NiKGxjaWQsIHVpaF9tc2NfcmVzcG9uc2VfZnJvbV9wZWVyKTsKLSAgfQotCi0gIHZvaWQgU3RhcnRDbGllbnRQb3J0KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRfYWRkciwgdWludDE2X3QgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY24sIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgdFBPUlRfQ0FMTEJBQ0sqIG1hbmFnZW1lbnRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0NBTExCQUNLKiBldmVudF9jYWxsYmFjaywgdWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYWNsX2hhbmRsZSwgdWludDE2X3QqIGNsaWVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZmlyc3RfY29ubmVjdGlvbikgewotICAgIFZMT0coMSkgPDwgIlN0ZXAgMSI7Ci0gICAgQlRfSERSKiB1aWhfcG5fY2hhbm5lbF8zID0KLSAgICAgICAgQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldChDcmVhdGVRdWlja1BuUGFja2V0KAotICAgICAgICAgICAgdHJ1ZSwgR2V0RGxjaShmYWxzZSwgc2NuKSwgdHJ1ZSwgbXR1LCBSRkNPTU1fUE5fQ09OVl9MQVlFUl9UWVBFXzEsCi0gICAgICAgICAgICBSRkNPTU1fUE5fUFJJT1JJVFlfMCwgUkZDT01NX0ssIGxjaWQsIGFjbF9oYW5kbGUpKTsKLSAgICBpZiAoaXNfZmlyc3RfY29ubmVjdGlvbikgewotICAgICAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywgQ29ubmVjdFJlcXVlc3QoQlRfUFNNX1JGQ09NTSwgcGVlcl9iZF9hZGRyKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKGxjaWQpKTsKLSAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgICAgIERhdGFXcml0ZShsY2lkLCBCdEhkckVxdWFsKHVpaF9wbl9jaGFubmVsXzMpKSkKLSAgICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEwyQ0FQX0RXX1NVQ0NFU1MpKTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKHV1aWQsIHNjbiwgZmFsc2UsIG10dSwgcGVlcl9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaGFuZGxlLCBtYW5hZ2VtZW50X2NhbGxiYWNrKSwKLSAgICAgICAgICAgICAgUE9SVF9TVUNDRVNTKTsKLSAgICBBU1NFUlRfRVEoUE9SVF9TZXRFdmVudE1hc2soKmNsaWVudF9oYW5kbGUsIFBPUlRfRVZfUlhDSEFSKSwgUE9SVF9TVUNDRVNTKTsKLSAgICBBU1NFUlRfRVEoUE9SVF9TZXRFdmVudENhbGxiYWNrKCpjbGllbnRfaGFuZGxlLCBldmVudF9jYWxsYmFjayksCi0gICAgICAgICAgICAgIFBPUlRfU1VDQ0VTUyk7Ci0gICAgb3NpX2ZyZWUodWloX3BuX2NoYW5uZWxfMyk7Ci0gIH0KLQotICB2b2lkIFRlc3RDb25uZWN0Q2xpZW50UG9ydEwyY2FwKHVpbnQxNl90IGFjbF9oYW5kbGUsIHVpbnQxNl90IGxjaWQpIHsKLSAgICBWTE9HKDEpIDw8ICJTdGVwIDEiOwotICAgIC8vIFNlbmQgY29uZmlndXJhdGlvbiByZXF1ZXN0IHdoZW4gTDJDQVAgY29ubmVjdCBpcyBzdWNjc3NlZnVsCi0gICAgdEwyQ0FQX0NGR19JTkZPIGNmZ19yZXEgPSB7Lm10dV9wcmVzZW50ID0gdHJ1ZSwgLm10dSA9IEwyQ0FQX01UVV9TSVpFfTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIENvbmZpZ1JlcXVlc3QobGNpZCwgUG9pbnRlck1lbW9yeUVxdWFsKCZjZmdfcmVxKSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdENmbV9DYihsY2lkLCBMMkNBUF9DT05OX09LKTsKLQotICAgIFZMT0coMSkgPDwgIlN0ZXAgMiI7Ci0gICAgLy8gUmVtb3RlIGRldmljZSBjb25maXJtcyBvdXIgY29uZmlndXJhdGlvbiByZXF1ZXN0Ci0gICAgY2ZnX3JlcS5tdHVfcHJlc2VudCA9IGZhbHNlOwotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfQ29uZmlnQ2ZtX0NiKGxjaWQsIEwyQ0FQX0NGR19PSywge30pOwotCi0gICAgVkxPRygxKSA8PCAiU3RlcCAzIjsKLSAgICAvLyBSZW1vdGUgZGV2aWNlIGFsc28gYXNrcyB0byBjb25maWd1cmUgTVRVCi0gICAgLy8gT25jZSBjb25maWd1cmF0aW9uIGlzIGRvbmUsIHdlIGNvbm5lY3QgdG8gbXVsdGlwbGV4ZXIgY29udHJvbCBjaGFubmVsIDAKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIENvbmZpZ1Jlc3BvbnNlKGxjaWQsIFBvaW50ZXJNZW1vcnlFcXVhbCgmY2ZnX3JlcSkpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKLSAgICAvLyBtdWx0aXBsZXhlciBjb250cm9sIGNoYW5uZWwncyBETENJIGlzIGFsd2F5cyAwCi0gICAgQlRfSERSKiBzYWJtX2NoYW5uZWxfMCA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrU2FibVBhY2tldChSRkNPTU1fTVhfRExDSSwgbGNpZCwgYWNsX2hhbmRsZSkpOwotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIERhdGFXcml0ZShsY2lkLCBCdEhkckVxdWFsKHNhYm1fY2hhbm5lbF8wKSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oTDJDQVBfRFdfU1VDQ0VTUykpOwotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfQ29uZmlnSW5kX0NiKGxjaWQsICZjZmdfcmVxKTsKLSAgICBvc2lfZnJlZShzYWJtX2NoYW5uZWxfMCk7Ci0gIH0KLQotICB2b2lkIENvbm5lY3RDbGllbnRQb3J0KGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwgdWludDE2X3QgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY24sIHVpbnQxNl90IG10dSwgdWludDE2X3QgYWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsY2lkLCBpbnQgcG9ydF9jYWxsYmFja19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ZpcnN0X2Nvbm5lY3Rpb24pIHsKLSAgICBWTE9HKDEpIDw8ICJTdGVwIDEiOwotICAgIGlmIChpc19maXJzdF9jb25uZWN0aW9uKSB7Ci0gICAgICBWTE9HKDEpIDw8ICJTdGVwIDEuNSI7Ci0gICAgICAvLyBPbmNlIHJlbW90ZSBhY2NlcHQgbXVsdGlwbGV4ZXIgY29udHJvbCBjaGFubmVsIDAKLSAgICAgIC8vIFdlIGNoYW5nZSB0byBkZXNpcmVkIGNoYW5uZWwgb24gbm9uLWluaXRpYXRpbmcgZGV2aWNlIChyZW1vdGUgZGV2aWNlKQotICAgICAgQlRfSERSKiB1YV9jaGFubmVsXzAgPSBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgICAgICAgIENyZWF0ZVF1aWNrVWFQYWNrZXQoUkZDT01NX01YX0RMQ0ksIGxjaWQsIGFjbF9oYW5kbGUpKTsKLSAgICAgIEJUX0hEUiogdWloX3BuX2NoYW5uZWxfMyA9Ci0gICAgICAgICAgQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldChDcmVhdGVRdWlja1BuUGFja2V0KAotICAgICAgICAgICAgICB0cnVlLCBHZXREbGNpKGZhbHNlLCBzY24pLCB0cnVlLCBtdHUsCi0gICAgICAgICAgICAgIFJGQ09NTV9QTl9DT05WX0xBWUVSX0NCRkNfSSA+PiA0LCBSRkNPTU1fUE5fUFJJT1JJVFlfMCwKLSAgICAgICAgICAgICAgUkZDT01NX0tfTUFYLCBsY2lkLCBhY2xfaGFuZGxlKSk7Ci0gICAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgICAgRGF0YVdyaXRlKGxjaWQsIEJ0SGRyRXF1YWwodWloX3BuX2NoYW5uZWxfMykpKQotICAgICAgICAgIC5XaWxsT25jZShSZXR1cm4oTDJDQVBfRFdfU1VDQ0VTUykpOwotICAgICAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9EYXRhSW5kX0NiKGxjaWQsIHVhX2NoYW5uZWxfMCk7Ci0gICAgICBvc2lfZnJlZSh1aWhfcG5fY2hhbm5lbF8zKTsKLSAgICB9Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDIiOwotICAgIC8vIE9uY2UgcmVtb3RlIGFjY2VwdCBzZXJ2aWNlIGNoYW5uZWwgY2hhbmdlLCB3ZSBzdGFydCBzZWN1cml0eSBwcm9jZWR1cmUKLSAgICBCVF9IRFIqIHVpaF9wbl9jaGFubmVsXzNfYWNjZXB0ID0KLSAgICAgICAgQWxsb2NhdGVXcmFwcGVkSW5jb21pbmdMMmNhcEFjbFBhY2tldChDcmVhdGVRdWlja1BuUGFja2V0KAotICAgICAgICAgICAgZmFsc2UsIEdldERsY2koZmFsc2UsIHNjbiksIGZhbHNlLCBtdHUsCi0gICAgICAgICAgICBSRkNPTU1fUE5fQ09OVl9MQVlFUl9DQkZDX0kgPj4gNCwgUkZDT01NX1BOX1BSSU9SSVRZXzAsCi0gICAgICAgICAgICBSRkNPTU1fS19NQVgsIGxjaWQsIGFjbF9oYW5kbGUpKTsKLSAgICB0QlRNX1NFQ19DQUxMQkFDSyogc2VjdXJpdHlfY2FsbGJhY2sgPSBudWxscHRyOwotICAgIHZvaWQqIHBfcG9ydCA9IG51bGxwdHI7Ci0gICAgRVhQRUNUX0NBTEwoYnRtX3NlY3VyaXR5X2ludGVybmFsX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgICAgTXVsdGlwbGV4aW5nUHJvdG9jb2xBY2Nlc3NSZXF1ZXN0KHBlZXJfYWRkciwgQlRfUFNNX1JGQ09NTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgQlRNX1NFQ19QUk9UT19SRkNPTU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjbiwgTm90TnVsbCgpLCBOb3ROdWxsKCkpKQotICAgICAgICAuV2lsbE9uY2UoRG9BbGwoU2F2ZUFyZzw1Pigmc2VjdXJpdHlfY2FsbGJhY2spLCBTYXZlQXJnPDY+KCZwX3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKEJUTV9TVUNDRVNTKSkpOwotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfRGF0YUluZF9DYihsY2lkLCB1aWhfcG5fY2hhbm5lbF8zX2FjY2VwdCk7Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDMiOwotICAgIC8vIE9uY2Ugc2VjdXJpdHkgcHJvY2VkdXJlIGlzIGRvbmUsIHdlIG9mZmljaWFsbHkgY29ubmVjdCB0byB0YXJnZXQgc2NuCi0gICAgQlRfSERSKiBzYWJtX2NoYW5uZWxfMyA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrU2FibVBhY2tldChHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlKSk7Ci0gICAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywgRGF0YVdyaXRlKGxjaWQsIEJ0SGRyRXF1YWwoc2FibV9jaGFubmVsXzMpKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihMMkNBUF9EV19TVUNDRVNTKSk7Ci0gICAgQVNTRVJUX1RSVUUoc2VjdXJpdHlfY2FsbGJhY2spOwotICAgIHNlY3VyaXR5X2NhbGxiYWNrKCZwZWVyX2FkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIsIHBfcG9ydCwgQlRNX1NVQ0NFU1MpOwotICAgIG9zaV9mcmVlKHNhYm1fY2hhbm5lbF8zKTsKLQotICAgIFZMT0coMSkgPDwgIlN0ZXAgNCI7Ci0gICAgLy8gV2hlbiB0YXJnZXQgc2NuIGlzIGFjY2VwdGVkIGJ5IHJlbW90ZSwgd2UgbmVlZCB0byBjb25maWd1cmUgbW9kZW0gc2lnbmFsCi0gICAgLy8gc3RhdGUgYmVvZnJlIHVzaW5nIHRoZSBwb3J0Ci0gICAgRVhQRUNUX0NBTEwoCi0gICAgICAgIHJmY29tbV9jYWxsYmFja18sCi0gICAgICAgIFBvcnRNYW5hZ2VtZW50Q2FsbGJhY2soUE9SVF9TVUNDRVNTLCBwb3J0X2hhbmRsZSwgcG9ydF9jYWxsYmFja19pbmRleCkpOwotICAgIEJUX0hEUiogdWloX21zY19jbWQgPSBBbGxvY2F0ZVdyYXBwZWRPdXRnb2luZ0wyY2FwQWNsUGFja2V0KAotICAgICAgICBDcmVhdGVRdWlja01zY1BhY2tldCh0cnVlLCBHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBEYXRhV3JpdGUobGNpZCwgQnRIZHJFcXVhbCh1aWhfbXNjX2NtZCkpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEwyQ0FQX0RXX1NVQ0NFU1MpKTsKLSAgICBCVF9IRFIqIHVhX2NoYW5uZWxfMyA9IEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrVWFQYWNrZXQoR2V0RGxjaShmYWxzZSwgc2NuKSwgbGNpZCwgYWNsX2hhbmRsZSkpOwotICAgIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfRGF0YUluZF9DYihsY2lkLCB1YV9jaGFubmVsXzMpOwotICAgIG9zaV9mcmVlKHVpaF9tc2NfY21kKTsKLQotICAgIFZMT0coMSkgPDwgIlN0ZXAgNSI7Ci0gICAgLy8gbW9kZW0gY29uZmlndXJhdGlvbiBpcyBkb25lCi0gICAgQlRfSERSKiB1aWhfbXNjX3Jlc3BvbnNlID0gQWxsb2NhdGVXcmFwcGVkSW5jb21pbmdMMmNhcEFjbFBhY2tldCgKLSAgICAgICAgQ3JlYXRlUXVpY2tNc2NQYWNrZXQoZmFsc2UsIEdldERsY2koZmFsc2UsIHNjbiksIGxjaWQsIGFjbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobGNpZCwgdWloX21zY19yZXNwb25zZSk7Ci0KLSAgICBWTE9HKDEpIDw8ICJTdGVwIDYiOwotICAgIC8vIFJlbW90ZSBhbHNvIG5lZWQgdG8gY29uZmlndXJlIGl0cyBtb2RlbSBzaWduYWwgYmVmb3JlIHdlIGNhbiBzZW5kIGRhdGEKLSAgICBCVF9IRFIqIHVpaF9tc2NfY21kX2Zyb21fcGVlciA9IEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrTXNjUGFja2V0KGZhbHNlLCBHZXREbGNpKGZhbHNlLCBzY24pLCBsY2lkLCBhY2xfaGFuZGxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgICBCVF9IRFIqIHVpaF9tc2NfcmVzcG9uc2VfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICAgIENyZWF0ZVF1aWNrTXNjUGFja2V0KHRydWUsIEdldERsY2koZmFsc2UsIHNjbiksIGxjaWQsIGFjbF9oYW5kbGUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICAgIERhdGFXcml0ZShsY2lkLCBCdEhkckVxdWFsKHVpaF9tc2NfcmVzcG9uc2VfdG9fcGVlcikpKQotICAgICAgICAuV2lsbE9uY2UoUmV0dXJuKEwyQ0FQX0RXX1NVQ0NFU1MpKTsKLSAgICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobGNpZCwgdWloX21zY19jbWRfZnJvbV9wZWVyKTsKLSAgICBvc2lfZnJlZSh1aWhfbXNjX3Jlc3BvbnNlX3RvX3BlZXIpOwotICB9Ci0KLSAgdm9pZCBTZW5kQW5kVmVyaWZ5T3V0Z29pbmdUcmFuc21pc3Npb24odWludDE2X3QgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5pdGlhdG9yLCB1aW50OF90IHNjbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjcmVkaXRzLCB1aW50MTZfdCBhY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsY2lkKSB7Ci0gICAgVkxPRygxKSA8PCAiU3RlcCAxIjsKLSAgICBCVF9IRFIqIGRhdGFfcGFja2V0ID0gQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldCgKLSAgICAgICAgQ3JlYXRlUXVpY2tEYXRhUGFja2V0KEdldERsY2koaXNfaW5pdGlhdG9yLCBzY24pLCBjciwgbGNpZCwgYWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRpdHMsIG1lc3NhZ2UpKTsKLSAgICB1aW50MTZfdCB0cmFuc21pdHRlZF9sZW5ndGggPSAwOwotICAgIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIERhdGFXcml0ZShsY2lkLCBCdEhkckVxdWFsKGRhdGFfcGFja2V0KSkpCi0gICAgICAgIC5XaWxsT25jZShSZXR1cm4oTDJDQVBfRFdfU1VDQ0VTUykpOwotICAgIEFTU0VSVF9FUShQT1JUX1dyaXRlRGF0YShwb3J0X2hhbmRsZSwgbWVzc2FnZS5kYXRhKCksIG1lc3NhZ2Uuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNtaXR0ZWRfbGVuZ3RoKSwKLSAgICAgICAgICAgICAgUE9SVF9TVUNDRVNTKTsKLSAgICBBU1NFUlRfRVEodHJhbnNtaXR0ZWRfbGVuZ3RoLCBtZXNzYWdlLnNpemUoKSk7Ci0gIH0KLQotICB2b2lkIFJlY2VpdmVBbmRWZXJpZnlJbmNvbWluZ1RyYW5zbWlzc2lvbih1aW50MTZfdCBwb3J0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbml0aWF0b3IsIHVpbnQ4X3Qgc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNyLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyZWRpdHMsIHVpbnQxNl90IGFjbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0X2NhbGxiYWNrX2luZGV4KSB7Ci0gICAgVkxPRygxKSA8PCAiU3RlcCAxIjsKLSAgICBCVF9IRFIqIGRhdGFfcGFja2V0ID0gQWxsb2NhdGVXcmFwcGVkSW5jb21pbmdMMmNhcEFjbFBhY2tldCgKLSAgICAgICAgQ3JlYXRlUXVpY2tEYXRhUGFja2V0KEdldERsY2koaXNfaW5pdGlhdG9yLCBzY24pLCBjciwgbGNpZCwgYWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRpdHMsIG1lc3NhZ2UpKTsKLSAgICBFWFBFQ1RfQ0FMTChyZmNvbW1fY2FsbGJhY2tfLAotICAgICAgICAgICAgICAgIFBvcnRFdmVudENhbGxiYWNrKF8sIHBvcnRfaGFuZGxlLCBwb3J0X2NhbGxiYWNrX2luZGV4KSk7Ci0gICAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9EYXRhSW5kX0NiKGxjaWQsIGRhdGFfcGFja2V0KTsKLQotICAgIFZMT0coMSkgPDwgIlN0ZXAgMiI7Ci0gICAgY2hhciBidWZmZXJbTDJDQVBfTVRVX1NJWkVdID0ge307Ci0gICAgdWludDE2X3QgbGVuZ3RoID0gMDsKLSAgICBpbnQgc3RhdHVzID0gUE9SVF9SZWFkRGF0YShwb3J0X2hhbmRsZSwgYnVmZmVyLCBMMkNBUF9NVFVfU0laRSwgJmxlbmd0aCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgUE9SVF9TVUNDRVNTKTsKLSAgICBBU1NFUlRfVEhBVChidWZmZXIsIFN0ckVxKG1lc3NhZ2UpKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIFRlc3Q6OlNldFVwKCk7Ci0gICAgYmx1ZXRvb3RoOjptYW5hZ2VyOjpTZXRNb2NrU2VjdXJpdHlJbnRlcm5hbEludGVyZmFjZSgKLSAgICAgICAgJmJ0bV9zZWN1cml0eV9pbnRlcm5hbF9pbnRlcmZhY2VfKTsKLSAgICBibHVldG9vdGg6OmwyY2FwOjpTZXRNb2NrSW50ZXJmYWNlKCZsMmNhcF9pbnRlcmZhY2VfKTsKLSAgICByZmNvbW1fY2FsbGJhY2sgPSAmcmZjb21tX2NhbGxiYWNrXzsKLSAgICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBSZWdpc3RlcihCVF9QU01fUkZDT01NLCBfLCBfLCBfKSkKLSAgICAgICAgLldpbGxPbmNlKFJldHVybihCVF9QU01fUkZDT01NKSk7Ci0gICAgUkZDT01NX0luaXQoKTsKLSAgICByZmNfY2IudHJhY2VfbGV2ZWwgPSBCVF9UUkFDRV9MRVZFTF9ERUJVRzsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgcmZjb21tX2NhbGxiYWNrID0gbnVsbHB0cjsKLSAgICBibHVldG9vdGg6OmwyY2FwOjpTZXRNb2NrSW50ZXJmYWNlKG51bGxwdHIpOwotICAgIGJsdWV0b290aDo6bWFuYWdlcjo6U2V0TW9ja1NlY3VyaXR5SW50ZXJuYWxJbnRlcmZhY2UobnVsbHB0cik7Ci0gICAgdGVzdGluZzo6VGVzdDo6VGVhckRvd24oKTsKLSAgfQotICBTdHJpY3RNb2NrPGJsdWV0b290aDo6bWFuYWdlcjo6TW9ja0J0bVNlY3VyaXR5SW50ZXJuYWxJbnRlcmZhY2U+Ci0gICAgICBidG1fc2VjdXJpdHlfaW50ZXJuYWxfaW50ZXJmYWNlXzsKLSAgU3RyaWN0TW9jazxibHVldG9vdGg6OmwyY2FwOjpNb2NrTDJjYXBJbnRlcmZhY2U+IGwyY2FwX2ludGVyZmFjZV87Ci0gIFN0cmljdE1vY2s8Ymx1ZXRvb3RoOjpyZmNvbW06Ok1vY2tSZmNvbW1DYWxsYmFjaz4gcmZjb21tX2NhbGxiYWNrXzsKLSAgdEwyQ0FQX0FQUExfSU5GTyBsMmNhcF9hcHBsX2luZm9fOwotfTsKLQotVEVTVF9GKFN0YWNrUmZjb21tVGVzdCwgU2luZ2xlU2VydmVyQ29ubmVjdGlvbkhlbGxvV29ybGQpIHsKLSAgLy8gUHJlcGFyZSBhIHNlcnZlciBjaGFubmVsIGF0IGtUZXN0Q2hhbm5lbE51bWJlcjAKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjbF9oYW5kbGUgPSAweDAwMDk7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBsY2lkID0gMHgwMDU0OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF91dWlkID0gMHgxMTEyOwotICBzdGF0aWMgY29uc3QgdWludDhfdCB0ZXN0X3NjbiA9IDg7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X210dSA9IDE2MDA7Ci0gIHN0YXRpYyBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICB1aW50MTZfdCBzZXJ2ZXJfaGFuZGxlID0gMDsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3RhcnRTZXJ2ZXJQb3J0KHRlc3RfdXVpZCwgdGVzdF9zY24sIHRlc3RfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9tZ210X2NiYWNrXzAsIHBvcnRfZXZlbnRfY2JhY2tfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfaGFuZGxlKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENvbm5lY3RTZXJ2ZXJMMmNhcCh0ZXN0X2FkZHJlc3MsIGFjbF9oYW5kbGUsIGxjaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ29ubmVjdFNlcnZlclBvcnQoCi0gICAgICB0ZXN0X2FkZHJlc3MsIHNlcnZlcl9oYW5kbGUsIHRlc3Rfc2NuLCB0ZXN0X210dSwgYWNsX2hhbmRsZSwgbGNpZCwgMCkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSZWNlaXZlQW5kVmVyaWZ5SW5jb21pbmdUcmFuc21pc3Npb24oCi0gICAgICBzZXJ2ZXJfaGFuZGxlLCBmYWxzZSwgdGVzdF9zY24sIHRydWUsICJIZWxsbyBXb3JsZCFcciIsIDUwLCBhY2xfaGFuZGxlLAotICAgICAgbGNpZCwgMCkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKLSAgICAgIFNlbmRBbmRWZXJpZnlPdXRnb2luZ1RyYW5zbWlzc2lvbihzZXJ2ZXJfaGFuZGxlLCBmYWxzZSwgdGVzdF9zY24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcciFkbHJvVyBvbGxlSCIsIDQsIGFjbF9oYW5kbGUsIGxjaWQpKTsKLX0KLQotVEVTVF9GKFN0YWNrUmZjb21tVGVzdCwgTXVsdGlTZXJ2ZXJQb3J0U2FtZURldmljZUhlbGxvV29ybGQpIHsKLSAgLy8gUHJlcGFyZSBhIHNlcnZlciBjaGFubmVsIGF0IGtUZXN0Q2hhbm5lbE51bWJlcjAKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjbF9oYW5kbGUgPSAweDAwMDk7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBsY2lkID0gMHgwMDU0OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF9tdHUgPSAxNjAwOwotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3MgPSBHZXRUZXN0QWRkcmVzcygwKTsKLQotICAvLyBTZXJ2aWNlIDAKLSAgdWludDE2X3Qgc2VydmVyX2hhbmRsZV8wID0gMDsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9zY25fMCA9IDg7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X3V1aWRfMCA9IDB4MTExMjsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3RhcnRTZXJ2ZXJQb3J0KHRlc3RfdXVpZF8wLCB0ZXN0X3Njbl8wLCB0ZXN0X210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfbWdtdF9jYmFja18wLCBwb3J0X2V2ZW50X2NiYWNrXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyX2hhbmRsZV8wKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENvbm5lY3RTZXJ2ZXJMMmNhcCh0ZXN0X2FkZHJlc3MsIGFjbF9oYW5kbGUsIGxjaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ29ubmVjdFNlcnZlclBvcnQodGVzdF9hZGRyZXNzLCBzZXJ2ZXJfaGFuZGxlXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2NuXzAsIHRlc3RfbXR1LCBhY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2lkLCAwKSk7Ci0KLSAgLy8gU2VydmljZSAxCi0gIHVpbnQxNl90IHNlcnZlcl9oYW5kbGVfMSA9IDA7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IHRlc3Rfc2NuXzEgPSAxMDsKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfdXVpZF8xID0gMHgxMTFGOwotICBBU1NFUlRfTkUodGVzdF9zY25fMSwgdGVzdF9zY25fMCk7Ci0gIEFTU0VSVF9ORSh0ZXN0X3V1aWRfMSwgdGVzdF91dWlkXzApOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTdGFydFNlcnZlclBvcnQodGVzdF91dWlkXzEsIHRlc3Rfc2NuXzEsIHRlc3RfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9tZ210X2NiYWNrXzEsIHBvcnRfZXZlbnRfY2JhY2tfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfaGFuZGxlXzEpKTsKLSAgLy8gTm8gTDJDQVAgc2V0dXAgZm9yIDJuZCBkZXZpY2UKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ29ubmVjdFNlcnZlclBvcnQodGVzdF9hZGRyZXNzLCBzZXJ2ZXJfaGFuZGxlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2NuXzEsIHRlc3RfbXR1LCBhY2xfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2lkLCAxKSk7Ci0KLSAgLy8gVXNlIHNlcnZpY2UgMAotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSZWNlaXZlQW5kVmVyaWZ5SW5jb21pbmdUcmFuc21pc3Npb24oCi0gICAgICBzZXJ2ZXJfaGFuZGxlXzAsIGZhbHNlLCB0ZXN0X3Njbl8wLCB0cnVlLCAiSGVsbG8gV29ybGQwIVxyIiwgNTAsCi0gICAgICBhY2xfaGFuZGxlLCBsY2lkLCAwKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNlbmRBbmRWZXJpZnlPdXRnb2luZ1RyYW5zbWlzc2lvbigKLSAgICAgIHNlcnZlcl9oYW5kbGVfMCwgZmFsc2UsIHRlc3Rfc2NuXzAsIGZhbHNlLCAiXHIhMGRscm9XIG9sbGVIIiwgNCwKLSAgICAgIGFjbF9oYW5kbGUsIGxjaWQpKTsKLSAgLy8gVXNlIHNlcnZpY2UgMQotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShSZWNlaXZlQW5kVmVyaWZ5SW5jb21pbmdUcmFuc21pc3Npb24oCi0gICAgICBzZXJ2ZXJfaGFuZGxlXzEsIGZhbHNlLCB0ZXN0X3Njbl8xLCB0cnVlLCAiSGVsbG8gV29ybGQxIVxyIiwgNTAsCi0gICAgICBhY2xfaGFuZGxlLCBsY2lkLCAxKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNlbmRBbmRWZXJpZnlPdXRnb2luZ1RyYW5zbWlzc2lvbigKLSAgICAgIHNlcnZlcl9oYW5kbGVfMSwgZmFsc2UsIHRlc3Rfc2NuXzEsIGZhbHNlLCAiXHIhMWRscm9XIG9sbGVIIiwgNCwKLSAgICAgIGFjbF9oYW5kbGUsIGxjaWQpKTsKLX0KLQotVEVTVF9GKFN0YWNrUmZjb21tVGVzdCwgU2FtZVNlcnZlclBvcnRNdWx0aURldmljZUhlbGxvV29ybGQpIHsKLSAgLy8gUHJlcGFyZSBhIHNlcnZlciBjaGFubmVsIGF0IGtUZXN0Q2hhbm5lbE51bWJlcjAKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfbXR1ID0gMTYwMDsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9zY24gPSAzOwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF91dWlkID0gMHgxMTEyOwotCi0gIC8vIFNlcnZpY2UgMAotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgYWNsX2hhbmRsZV8wID0gMHgwMDA5OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgbGNpZF8wID0gMHgwMDU0OwotICB1aW50MTZfdCBzZXJ2ZXJfaGFuZGxlXzAgPSAwOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTdGFydFNlcnZlclBvcnQodGVzdF91dWlkLCB0ZXN0X3NjbiwgdGVzdF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X21nbXRfY2JhY2tfMCwgcG9ydF9ldmVudF9jYmFja18wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9oYW5kbGVfMCkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKLSAgICAgIENvbm5lY3RTZXJ2ZXJMMmNhcCh0ZXN0X2FkZHJlc3NfMCwgYWNsX2hhbmRsZV8wLCBsY2lkXzApKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ29ubmVjdFNlcnZlclBvcnQodGVzdF9hZGRyZXNzXzAsIHNlcnZlcl9oYW5kbGVfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zY24sIHRlc3RfbXR1LCBhY2xfaGFuZGxlXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaWRfMCwgMCkpOwotCi0gIC8vIFNlcnZpY2UgMQotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMSA9IEdldFRlc3RBZGRyZXNzKDEpOwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgYWNsX2hhbmRsZV8xID0gMHgwMDEyOwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgbGNpZF8xID0gMHgwMDQ1OwotICB1aW50MTZfdCBzZXJ2ZXJfaGFuZGxlXzEgPSAwOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTdGFydFNlcnZlclBvcnQodGVzdF91dWlkLCB0ZXN0X3NjbiwgdGVzdF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X21nbXRfY2JhY2tfMSwgcG9ydF9ldmVudF9jYmFja18xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9oYW5kbGVfMSkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKLSAgICAgIENvbm5lY3RTZXJ2ZXJMMmNhcCh0ZXN0X2FkZHJlc3NfMSwgYWNsX2hhbmRsZV8xLCBsY2lkXzEpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ29ubmVjdFNlcnZlclBvcnQodGVzdF9hZGRyZXNzXzEsIHNlcnZlcl9oYW5kbGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zY24sIHRlc3RfbXR1LCBhY2xfaGFuZGxlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaWRfMSwgMSkpOwotCi0gIC8vIFVzZSBzZXJ2aWNlIDAKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUmVjZWl2ZUFuZFZlcmlmeUluY29taW5nVHJhbnNtaXNzaW9uKAotICAgICAgc2VydmVyX2hhbmRsZV8wLCBmYWxzZSwgdGVzdF9zY24sIHRydWUsICJIZWxsbyBXb3JsZDAhXHIiLCA1MCwKLSAgICAgIGFjbF9oYW5kbGVfMCwgbGNpZF8wLCAwKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNlbmRBbmRWZXJpZnlPdXRnb2luZ1RyYW5zbWlzc2lvbigKLSAgICAgIHNlcnZlcl9oYW5kbGVfMCwgZmFsc2UsIHRlc3Rfc2NuLCBmYWxzZSwgIlxyITBkbHJvVyBvbGxlSCIsIDQsCi0gICAgICBhY2xfaGFuZGxlXzAsIGxjaWRfMCkpOwotICAvLyBVc2Ugc2VydmljZSAxCi0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlY2VpdmVBbmRWZXJpZnlJbmNvbWluZ1RyYW5zbWlzc2lvbigKLSAgICAgIHNlcnZlcl9oYW5kbGVfMSwgZmFsc2UsIHRlc3Rfc2NuLCB0cnVlLCAiSGVsbG8gV29ybGQxIVxyIiwgNTAsCi0gICAgICBhY2xfaGFuZGxlXzEsIGxjaWRfMSwgMSkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZW5kQW5kVmVyaWZ5T3V0Z29pbmdUcmFuc21pc3Npb24oCi0gICAgICBzZXJ2ZXJfaGFuZGxlXzEsIGZhbHNlLCB0ZXN0X3NjbiwgZmFsc2UsICJcciExZGxyb1cgb2xsZUgiLCA0LAotICAgICAgYWNsX2hhbmRsZV8xLCBsY2lkXzEpKTsKLX0KLQotVEVTVF9GKFN0YWNrUmZjb21tVGVzdCwgU2luZ2xlQ2xpZW50Q29ubmVjdGlvbkhlbGxvV29ybGQpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGFjbF9oYW5kbGUgPSAweDAwMDk7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBsY2lkID0gMHgwMDU0OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF91dWlkID0gMHgxMTEyOwotICBzdGF0aWMgY29uc3QgdWludDhfdCB0ZXN0X3NjbiA9IDg7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X210dSA9IDE2MDA7Ci0gIHN0YXRpYyBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICB1aW50MTZfdCBjbGllbnRfaGFuZGxlID0gMDsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3RhcnRDbGllbnRQb3J0KAotICAgICAgdGVzdF9hZGRyZXNzLCB0ZXN0X3V1aWQsIHRlc3Rfc2NuLCB0ZXN0X210dSwgcG9ydF9tZ210X2NiYWNrXzAsCi0gICAgICBwb3J0X2V2ZW50X2NiYWNrXzAsIGxjaWQsIGFjbF9oYW5kbGUsICZjbGllbnRfaGFuZGxlLCB0cnVlKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RDb25uZWN0Q2xpZW50UG9ydEwyY2FwKGFjbF9oYW5kbGUsIGxjaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ29ubmVjdENsaWVudFBvcnQodGVzdF9hZGRyZXNzLCBjbGllbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3NjbiwgdGVzdF9tdHUsIGFjbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaWQsIDAsIHRydWUpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2VuZEFuZFZlcmlmeU91dGdvaW5nVHJhbnNtaXNzaW9uKAotICAgICAgY2xpZW50X2hhbmRsZSwgZmFsc2UsIHRlc3Rfc2NuLCB0cnVlLCAiXHIhZGxyb1cgb2xsZUgiLCAtMSwgYWNsX2hhbmRsZSwKLSAgICAgIGxjaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUmVjZWl2ZUFuZFZlcmlmeUluY29taW5nVHJhbnNtaXNzaW9uKAotICAgICAgY2xpZW50X2hhbmRsZSwgZmFsc2UsIHRlc3Rfc2NuLCBmYWxzZSwgIkhlbGxvIFdvcmxkIVxyIiwgLTEsIGFjbF9oYW5kbGUsCi0gICAgICBsY2lkLCAwKSk7Ci19Ci0KLVRFU1RfRihTdGFja1JmY29tbVRlc3QsIE11bHRpQ2xpZW50UG9ydFNhbWVEZXZpY2VIZWxsb1dvcmxkKSB7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBhY2xfaGFuZGxlID0gMHgwMDA5OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgbGNpZCA9IDB4MDA1NDsKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfbXR1ID0gMTYwMDsKLSAgc3RhdGljIGNvbnN0IFJhd0FkZHJlc3MgdGVzdF9hZGRyZXNzID0gR2V0VGVzdEFkZHJlc3MoMCk7Ci0KLSAgLy8gQ29ubmVjdGlvbiAwCi0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X3V1aWRfMCA9IDB4MTExMjsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9zY25fMCA9IDg7Ci0gIHVpbnQxNl90IGNsaWVudF9oYW5kbGVfMCA9IDA7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFN0YXJ0Q2xpZW50UG9ydCgKLSAgICAgIHRlc3RfYWRkcmVzcywgdGVzdF91dWlkXzAsIHRlc3Rfc2NuXzAsIHRlc3RfbXR1LCBwb3J0X21nbXRfY2JhY2tfMCwKLSAgICAgIHBvcnRfZXZlbnRfY2JhY2tfMCwgbGNpZCwgYWNsX2hhbmRsZSwgJmNsaWVudF9oYW5kbGVfMCwgdHJ1ZSkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0Q29ubmVjdENsaWVudFBvcnRMMmNhcChhY2xfaGFuZGxlLCBsY2lkKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENvbm5lY3RDbGllbnRQb3J0KHRlc3RfYWRkcmVzcywgY2xpZW50X2hhbmRsZV8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3Njbl8wLCB0ZXN0X210dSwgYWNsX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNpZCwgMCwgdHJ1ZSkpOwotCi0gIC8vIENvbm5lY3Rpb24gMQotICBzdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF91dWlkXzEgPSAweDExMUY7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IHRlc3Rfc2NuXzEgPSAxMDsKLSAgdWludDE2X3QgY2xpZW50X2hhbmRsZV8xID0gMDsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU3RhcnRDbGllbnRQb3J0KAotICAgICAgdGVzdF9hZGRyZXNzLCB0ZXN0X3V1aWRfMSwgdGVzdF9zY25fMSwgdGVzdF9tdHUsIHBvcnRfbWdtdF9jYmFja18xLAotICAgICAgcG9ydF9ldmVudF9jYmFja18xLCBsY2lkLCBhY2xfaGFuZGxlLCAmY2xpZW50X2hhbmRsZV8xLCBmYWxzZSkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDb25uZWN0Q2xpZW50UG9ydCh0ZXN0X2FkZHJlc3MsIGNsaWVudF9oYW5kbGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zY25fMSwgdGVzdF9tdHUsIGFjbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaWQsIDEsIGZhbHNlKSk7Ci0KLSAgLy8gVXNlIGNvbm5lY3Rpb24gMAotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZW5kQW5kVmVyaWZ5T3V0Z29pbmdUcmFuc21pc3Npb24oCi0gICAgICBjbGllbnRfaGFuZGxlXzAsIGZhbHNlLCB0ZXN0X3Njbl8wLCB0cnVlLCAiXHIhZGxyb1cgb2xsZUgiLCAtMSwKLSAgICAgIGFjbF9oYW5kbGUsIGxjaWQpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUmVjZWl2ZUFuZFZlcmlmeUluY29taW5nVHJhbnNtaXNzaW9uKAotICAgICAgY2xpZW50X2hhbmRsZV8wLCBmYWxzZSwgdGVzdF9zY25fMCwgZmFsc2UsICJIZWxsbyBXb3JsZCFcciIsIC0xLAotICAgICAgYWNsX2hhbmRsZSwgbGNpZCwgMCkpOwotCi0gIC8vIFVzZSBjb25uZWN0aW9uIDEKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2VuZEFuZFZlcmlmeU91dGdvaW5nVHJhbnNtaXNzaW9uKAotICAgICAgY2xpZW50X2hhbmRsZV8xLCBmYWxzZSwgdGVzdF9zY25fMSwgdHJ1ZSwgIlxyIWRscm9XIG9sbGVIIiwgLTEsCi0gICAgICBhY2xfaGFuZGxlLCBsY2lkKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlY2VpdmVBbmRWZXJpZnlJbmNvbWluZ1RyYW5zbWlzc2lvbigKLSAgICAgIGNsaWVudF9oYW5kbGVfMSwgZmFsc2UsIHRlc3Rfc2NuXzEsIGZhbHNlLCAiSGVsbG8gV29ybGQhXHIiLCAtMSwKLSAgICAgIGFjbF9oYW5kbGUsIGxjaWQsIDEpKTsKLX0KLQotVEVTVF9GKFN0YWNrUmZjb21tVGVzdCwgU2FtZUNsaWVudFBvcnRNdWx0aURldmljZUhlbGxvV29ybGQpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfdXVpZCA9IDB4MTExMjsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9zY24gPSA4OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgdGVzdF9tdHUgPSAxNjAwOwotCi0gIC8vIENvbm5lY3Rpb24gMAotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyB0ZXN0X2FkZHJlc3NfMCA9IEdldFRlc3RBZGRyZXNzKDApOwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgYWNsX2hhbmRsZV8wID0gMHgwMDA5OwotICBzdGF0aWMgY29uc3QgdWludDE2X3QgbGNpZF8wID0gMHgwMDU0OwotICB1aW50MTZfdCBjbGllbnRfaGFuZGxlXzAgPSAwOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTdGFydENsaWVudFBvcnQoCi0gICAgICB0ZXN0X2FkZHJlc3NfMCwgdGVzdF91dWlkLCB0ZXN0X3NjbiwgdGVzdF9tdHUsIHBvcnRfbWdtdF9jYmFja18wLAotICAgICAgcG9ydF9ldmVudF9jYmFja18wLCBsY2lkXzAsIGFjbF9oYW5kbGVfMCwgJmNsaWVudF9oYW5kbGVfMCwgdHJ1ZSkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0Q29ubmVjdENsaWVudFBvcnRMMmNhcChhY2xfaGFuZGxlXzAsIGxjaWRfMCkpOwotICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDb25uZWN0Q2xpZW50UG9ydCh0ZXN0X2FkZHJlc3NfMCwgY2xpZW50X2hhbmRsZV8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3NjbiwgdGVzdF9tdHUsIGFjbF9oYW5kbGVfMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNpZF8wLCAwLCB0cnVlKSk7Ci0KLSAgLy8gQ29ubmVjdGlvbiAxCi0gIHN0YXRpYyBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzc18xID0gR2V0VGVzdEFkZHJlc3MoMSk7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBhY2xfaGFuZGxlXzEgPSAweDAwMTI7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBsY2lkXzEgPSAweDAwNDU7Ci0gIHVpbnQxNl90IGNsaWVudF9oYW5kbGVfMSA9IDA7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFN0YXJ0Q2xpZW50UG9ydCgKLSAgICAgIHRlc3RfYWRkcmVzc18xLCB0ZXN0X3V1aWQsIHRlc3Rfc2NuLCB0ZXN0X210dSwgcG9ydF9tZ210X2NiYWNrXzEsCi0gICAgICBwb3J0X2V2ZW50X2NiYWNrXzEsIGxjaWRfMSwgYWNsX2hhbmRsZV8xLCAmY2xpZW50X2hhbmRsZV8xLCB0cnVlKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RDb25uZWN0Q2xpZW50UG9ydEwyY2FwKGFjbF9oYW5kbGVfMSwgbGNpZF8xKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENvbm5lY3RDbGllbnRQb3J0KHRlc3RfYWRkcmVzc18xLCBjbGllbnRfaGFuZGxlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2NuLCB0ZXN0X210dSwgYWNsX2hhbmRsZV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsY2lkXzEsIDEsIHRydWUpKTsKLQotICAvLyBVc2UgY29ubmVjdGlvbiAwCi0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNlbmRBbmRWZXJpZnlPdXRnb2luZ1RyYW5zbWlzc2lvbigKLSAgICAgIGNsaWVudF9oYW5kbGVfMCwgZmFsc2UsIHRlc3Rfc2NuLCB0cnVlLCAiXHIhZGxyb1cgb2xsZUgiLCAtMSwKLSAgICAgIGFjbF9oYW5kbGVfMCwgbGNpZF8wKSk7Ci0gIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlY2VpdmVBbmRWZXJpZnlJbmNvbWluZ1RyYW5zbWlzc2lvbigKLSAgICAgIGNsaWVudF9oYW5kbGVfMCwgZmFsc2UsIHRlc3Rfc2NuLCBmYWxzZSwgIkhlbGxvIFdvcmxkIVxyIiwgLTEsCi0gICAgICBhY2xfaGFuZGxlXzAsIGxjaWRfMCwgMCkpOwotCi0gIC8vIFVzZSBjb25uZWN0aW9uIDEKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2VuZEFuZFZlcmlmeU91dGdvaW5nVHJhbnNtaXNzaW9uKAotICAgICAgY2xpZW50X2hhbmRsZV8xLCBmYWxzZSwgdGVzdF9zY24sIHRydWUsICJcciFkbHJvVyBvbGxlSCIsIC0xLAotICAgICAgYWNsX2hhbmRsZV8xLCBsY2lkXzEpKTsKLSAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUmVjZWl2ZUFuZFZlcmlmeUluY29taW5nVHJhbnNtaXNzaW9uKAotICAgICAgY2xpZW50X2hhbmRsZV8xLCBmYWxzZSwgdGVzdF9zY24sIGZhbHNlLCAiSGVsbG8gV29ybGQhXHIiLCAtMSwKLSAgICAgIGFjbF9oYW5kbGVfMSwgbGNpZF8xLCAxKSk7Ci19Ci0KLVRFU1RfRihTdGFja1JmY29tbVRlc3QsIFRlc3RDb25uZWN0aW9uQ29sbGlzaW9uKSB7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBhY2xfaGFuZGxlID0gMHgwMDA4OwotICBzdGF0aWMgY29uc3QgdWludDE2X3Qgb2xkX2xjaWQgPSAweDAwNGE7Ci0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCBuZXdfbGNpZCA9IDB4MDA1YzsKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHRlc3RfdXVpZCA9IDB4MTExMjsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9zZXJ2ZXJfc2NuID0gMzsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9wZWVyX3NjbiA9IDEwOwotICAvLyBNdXN0IGJlIHNtYWxsZXIgdGhhbiBMMkNBUF9NVFVfU0laRSBieSBhdCBsZWFzdCA0IGJ5dGVzCi0gIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0ZXN0X210dSA9IDEwMDA7Ci0gIHN0YXRpYyBjb25zdCBSYXdBZGRyZXNzIHRlc3RfYWRkcmVzcyA9IEdldFRlc3RBZGRyZXNzKDApOwotICB1aW50MTZfdCBzZXJ2ZXJfaGFuZGxlID0gMDsKLSAgVkxPRygxKSA8PCAiU3RlcCAxIjsKLSAgLy8gUHJlcGFyZSBhIHNlcnZlciBwb3J0Ci0gIGludCBzdGF0dXMgPSBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbih0ZXN0X3V1aWQsIHRlc3Rfc2VydmVyX3NjbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbXR1LCBSYXdBZGRyZXNzOjprQW55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9oYW5kbGUsIHBvcnRfbWdtdF9jYmFja18wKTsKLSAgQVNTRVJUX0VRKHN0YXR1cywgUE9SVF9TVUNDRVNTKTsKLSAgc3RhdHVzID0gUE9SVF9TZXRFdmVudE1hc2soc2VydmVyX2hhbmRsZSwgUE9SVF9FVl9SWENIQVIpOwotICBBU1NFUlRfRVEoc3RhdHVzLCBQT1JUX1NVQ0NFU1MpOwotICBzdGF0dXMgPSBQT1JUX1NldEV2ZW50Q2FsbGJhY2soc2VydmVyX2hhbmRsZSwgcG9ydF9ldmVudF9jYmFja18wKTsKLSAgQVNTRVJUX0VRKHN0YXR1cywgUE9SVF9TVUNDRVNTKTsKLQotICBWTE9HKDEpIDw8ICJTdGVwIDIiOwotICAvLyBUcnkgdG8gY29ubmVjdCB0byBhIGNsaWVudCBwb3J0Ci0gIHVpbnQxNl90IGNsaWVudF9oYW5kbGVfMSA9IDA7Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIENvbm5lY3RSZXF1ZXN0KEJUX1BTTV9SRkNPTU0sIHRlc3RfYWRkcmVzcykpCi0gICAgICAuVGltZXMoMSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4ob2xkX2xjaWQpKTsKLSAgc3RhdHVzID0gUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb24odGVzdF91dWlkLCB0ZXN0X3BlZXJfc2NuLCBmYWxzZSwgdGVzdF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYWRkcmVzcywgJmNsaWVudF9oYW5kbGVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9tZ210X2NiYWNrXzEpOwotICBBU1NFUlRfRVEoc3RhdHVzLCBQT1JUX1NVQ0NFU1MpOwotICBzdGF0dXMgPSBQT1JUX1NldEV2ZW50TWFzayhjbGllbnRfaGFuZGxlXzEsIFBPUlRfRVZfUlhDSEFSKTsKLSAgQVNTRVJUX0VRKHN0YXR1cywgUE9SVF9TVUNDRVNTKTsKLSAgc3RhdHVzID0gUE9SVF9TZXRFdmVudENhbGxiYWNrKGNsaWVudF9oYW5kbGVfMSwgcG9ydF9ldmVudF9jYmFja18xKTsKLSAgQVNTRVJUX0VRKHN0YXR1cywgUE9SVF9TVUNDRVNTKTsKLQotICBWTE9HKDEpIDw8ICJTdGVwIDMiOwotICAvLyBXaGlsZSBvdXIgY29ubmVjdGlvbiBpcyBwZW5kaW5nLCByZW1vdGUgZGV2aWNlIHRyaWVzIHRvIGNvbm5lY3QgdG8KLSAgLy8gbmV3X2xjaWQsIHdpdGggTDJDQVAgY29tbWFuZCBpZDogcGVuZGluZ19jbWRfaWQKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGVuZGluZ19jbWRfaWQgPSAweDA1OwotICAvLyBSRkNPTU0gc3RhcnRzIHRpbWVyIGZvciBjb2xsaXNpb246Ci0gIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfQ29ubmVjdEluZF9DYih0ZXN0X2FkZHJlc3MsIG5ld19sY2lkLCBCVF9QU01fUkZDT01NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19jbWRfaWQpOwotCi0gIFZMT0coMSkgPDwgIlN0ZXAgNCI7Ci0gIC8vIFJlbW90ZSByZWplY3Qgb3VyIGNvbm5lY3Rpb24gcmVxdWVzdCBzYXlpbmcgUFNNIG5vdCBhbGxvd2VkCi0gIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgUkZDT01NIHRvIGFjY2VwdCByZW1vdGUgTDJDQVAgY29ubmVjdGlvbiBhdCBuZXdfbGNpZAotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBDb25uZWN0UmVzcG9uc2UodGVzdF9hZGRyZXNzLCBwZW5kaW5nX2NtZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19sY2lkLCBMMkNBUF9DT05OX09LLCAwKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICAvLyBGb2xsb3dlZCBieSBjb25maWd1cmUgcmVxdWVzdCBmb3IgTVRVIHNpemUKLSAgdEwyQ0FQX0NGR19JTkZPIG91cl9jZmdfcmVxID0gey5tdHVfcHJlc2VudCA9IHRydWUsIC5tdHUgPSBMMkNBUF9NVFVfU0laRX07Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgIENvbmZpZ1JlcXVlc3QobmV3X2xjaWQsIFBvaW50ZXJNZW1vcnlFcXVhbCgmb3VyX2NmZ19yZXEpKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0Nvbm5lY3RDZm1fQ2Iob2xkX2xjaWQsIEwyQ0FQX0NPTk5fTk9fUFNNKTsKLQotICBWTE9HKDEpIDw8ICJTdGVwIDUiOwotICAvLyBSZW1vdGUgZGV2aWNlIGFsc28gYXNrIHRvIGNvbmZpZ3VyZSBNVFUgc2l6ZSBhcyB3ZWxsCi0gIHRMMkNBUF9DRkdfSU5GTyBwZWVyX2NmZ19yZXEgPSB7Lm10dV9wcmVzZW50ID0gdHJ1ZSwgLm10dSA9IHRlc3RfbXR1fTsKLSAgLy8gV2UgcmVzcG9uZGVkIGJ5IHNheWluZyBPSwotICB0TDJDQVBfQ0ZHX0lORk8gb3VyX2NmZ19yc3AgPSB7LnJlc3VsdCA9IEwyQ0FQX0NGR19PSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdHUgPSBwZWVyX2NmZ19yZXEubXR1fTsKLSAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgQ29uZmlnUmVzcG9uc2UobmV3X2xjaWQsIFBvaW50ZXJNZW1vcnlFcXVhbCgmb3VyX2NmZ19yc3ApKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4odHJ1ZSkpOwotICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0NvbmZpZ0luZF9DYihuZXdfbGNpZCwgJnBlZXJfY2ZnX3JlcSk7Ci0KLSAgVkxPRygxKSA8PCAiU3RlcCA2IjsKLSAgLy8gUmVtb3RlIGRldmljZSBhY2NlcHRlZCBvdXIgTVRVIHNpemUKLSAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9Db25maWdDZm1fQ2IobmV3X2xjaWQsIEwyQ0FQX0NGR19PSywge30pOwotCi0gIC8vIEwyQ0FQIGNvbGxpc2lvbiBhbmQgY29ubmVjdGlvbiBzZXR1cCBkb25lCi0KLSAgVkxPRygxKSA8PCAiU3RlcCA3IjsKLSAgLy8gUmVtb3RlIGRldmljZSBjb25uZWN0IG11bHRpcGxleGVyIGNoYW5uZWwKLSAgQlRfSERSKiBzYWJtX2NoYW5uZWxfMCA9IEFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICBDcmVhdGVRdWlja1NhYm1QYWNrZXQoUkZDT01NX01YX0RMQ0ksIG5ld19sY2lkLCBhY2xfaGFuZGxlKSk7Ci0gIC8vIFdlIGFjY2VwdAotICBCVF9IRFIqIHVhX2NoYW5uZWxfMCA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICBDcmVhdGVRdWlja1VhUGFja2V0KFJGQ09NTV9NWF9ETENJLCBuZXdfbGNpZCwgYWNsX2hhbmRsZSkpOwotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLCBEYXRhV3JpdGUobmV3X2xjaWQsIEJ0SGRyRXF1YWwodWFfY2hhbm5lbF8wKSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKEwyQ0FQX0RXX1NVQ0NFU1MpKTsKLSAgLy8gQW5kIGltbWVkaWF0ZWx5IHRyeSB0byBjb25maWd1cmUgdGVzdF9wZWVyX3NjbgotICBCVF9IRFIqIHVpaF9wbl9jbWRfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICBDcmVhdGVRdWlja1BuUGFja2V0KGZhbHNlLCBHZXREbGNpKHRydWUsIHRlc3RfcGVlcl9zY24pLCB0cnVlLCB0ZXN0X210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUkZDT01NX1BOX0NPTlZfTEFZRVJfQ0JGQ19JID4+IDQsIDAsIFJGQ09NTV9LX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xjaWQsIGFjbF9oYW5kbGUpKTsKLSAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgRGF0YVdyaXRlKG5ld19sY2lkLCBCdEhkckVxdWFsKHVpaF9wbl9jbWRfdG9fcGVlcikpKQotICAgICAgLldpbGxPbmNlKFJldHVybihMMkNBUF9EV19TVUNDRVNTKSk7Ci0gIC8vIFBhY2tldCBzaG91bGQgYmUgZnJlZWQgYnkgdGhpcyBtZXRob2QKLSAgbDJjYXBfYXBwbF9pbmZvXy5wTDJDQV9EYXRhSW5kX0NiKG5ld19sY2lkLCBzYWJtX2NoYW5uZWxfMCk7Ci0gIG9zaV9mcmVlKHVhX2NoYW5uZWxfMCk7Ci0gIG9zaV9mcmVlKHVpaF9wbl9jbWRfdG9fcGVlcik7Ci0KLSAgVkxPRygxKSA8PCAiU3RlcCA4IjsKLSAgLy8gUGVlciB0cmllcyB0byBjb25maWd1cmUgdGVzdF9zZXJ2ZXJfc2NuCi0gIEJUX0hEUiogdWloX3BuX2NtZF9mcm9tX3BlZXIgPSBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgICAgQ3JlYXRlUXVpY2tQblBhY2tldCh0cnVlLCBHZXREbGNpKGZhbHNlLCB0ZXN0X3NlcnZlcl9zY24pLCB0cnVlLCB0ZXN0X210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUkZDT01NX1BOX0NPTlZfTEFZRVJfQ0JGQ19JID4+IDQsIDAsIFJGQ09NTV9LX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xjaWQsIGFjbF9oYW5kbGUpKTsKLSAgLy8gV2UsIGFzIGFjY2VwdG9yLCBtdXN0IGFjY2VwdAotICBCVF9IRFIqIHVpaF9wbl9yc3BfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICBDcmVhdGVRdWlja1BuUGFja2V0KGZhbHNlLCBHZXREbGNpKGZhbHNlLCB0ZXN0X3NlcnZlcl9zY24pLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9tdHUsIFJGQ09NTV9QTl9DT05WX0xBWUVSX0NCRkNfUiA+PiA0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSRkNPTU1fS19NQVgsIG5ld19sY2lkLCBhY2xfaGFuZGxlKSk7Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sCi0gICAgICAgICAgICAgIERhdGFXcml0ZShuZXdfbGNpZCwgQnRIZHJFcXVhbCh1aWhfcG5fcnNwX3RvX3BlZXIpKSkKLSAgICAgIC5UaW1lcygxKQotICAgICAgLldpbGxPbmNlKFJldHVybihMMkNBUF9EV19TVUNDRVNTKSk7Ci0gIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfRGF0YUluZF9DYihuZXdfbGNpZCwgdWloX3BuX2NtZF9mcm9tX3BlZXIpOwotICBvc2lfZnJlZSh1aWhfcG5fcnNwX3RvX3BlZXIpOwotCi0gIFZMT0coMSkgPDwgIlN0ZXAgOSI7Ci0gIC8vIFJlbW90ZSBuZXZlciByZXBsaWVzIG91ciBjb25maWd1cmF0aW9uIHJlcXVlc3QgZm9yIHRlc3RfcGVlcl9zY24KLSAgLy8gQnV0IGluc3RlYWQgY29ubmVjdCB0byB0ZXN0X3NlcnZlcl9zY24gZGlyZWN0bHkKLSAgQlRfSERSKiBzYWJtX3NlcnZlcl9zY24gPQotICAgICAgQWxsb2NhdGVXcmFwcGVkSW5jb21pbmdMMmNhcEFjbFBhY2tldChDcmVhdGVRdWlja1NhYm1QYWNrZXQoCi0gICAgICAgICAgR2V0RGxjaShmYWxzZSwgdGVzdF9zZXJ2ZXJfc2NuKSwgbmV3X2xjaWQsIGFjbF9oYW5kbGUpKTsKLSAgLy8gV2UgbXVzdCBkbyBzZWN1cml0eSBjaGVjayBmaXJzdAotICB0QlRNX1NFQ19DQUxMQkFDSyogc2VjdXJpdHlfY2FsbGJhY2sgPSBudWxscHRyOwotICB2b2lkKiBwX3BvcnQgPSBudWxscHRyOwotICBFWFBFQ1RfQ0FMTChidG1fc2VjdXJpdHlfaW50ZXJuYWxfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgTXVsdGlwbGV4aW5nUHJvdG9jb2xBY2Nlc3NSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgdGVzdF9hZGRyZXNzLCBCVF9QU01fUkZDT01NLCBmYWxzZSwgQlRNX1NFQ19QUk9UT19SRkNPTU0sCi0gICAgICAgICAgICAgICAgICB0ZXN0X3NlcnZlcl9zY24sIE5vdE51bGwoKSwgTm90TnVsbCgpKSkKLSAgICAgIC5XaWxsT25jZShEb0FsbChTYXZlQXJnPDU+KCZzZWN1cml0eV9jYWxsYmFjayksIFNhdmVBcmc8Nj4oJnBfcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgUmV0dXJuKEJUTV9TVUNDRVNTKSkpOwotICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobmV3X2xjaWQsIHNhYm1fc2VydmVyX3Njbik7Ci0KLSAgVkxPRygxKSA8PCAiU3RlcCAxMCI7Ci0gIC8vIEFmdGVyIHNlY3VyaXR5IGNoZWNrLCB3ZSBhY2NlcHQgdGhlIGNvbm5lY3Rpb24KLSAgQVNTRVJUX1RSVUUoc2VjdXJpdHlfY2FsbGJhY2spOwotICBCVF9IRFIqIHVhX3NlcnZlcl9zY24gPQotICAgICAgQWxsb2NhdGVXcmFwcGVkT3V0Z29pbmdMMmNhcEFjbFBhY2tldChDcmVhdGVRdWlja1VhUGFja2V0KAotICAgICAgICAgIEdldERsY2koZmFsc2UsIHRlc3Rfc2VydmVyX3NjbiksIG5ld19sY2lkLCBhY2xfaGFuZGxlKSk7Ci0gIEVYUEVDVF9DQUxMKGwyY2FwX2ludGVyZmFjZV8sIERhdGFXcml0ZShuZXdfbGNpZCwgQnRIZHJFcXVhbCh1YV9zZXJ2ZXJfc2NuKSkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKEwyQ0FQX0RXX1NVQ0NFU1MpKTsKLSAgLy8gQ2FsbGJhY2sgc2hvdWxkIGNvbWUgZnJvbSBzZXJ2ZXIgcG9ydCBpbnN0ZWFkLCBjbGllbnQgcG9ydCB3aWxsIHRpbWVvdXQKLSAgLy8gaW4gMjAgc2Vjb25kcwotICBFWFBFQ1RfQ0FMTChyZmNvbW1fY2FsbGJhY2tfLAotICAgICAgICAgICAgICBQb3J0TWFuYWdlbWVudENhbGxiYWNrKFBPUlRfU1VDQ0VTUywgc2VydmVyX2hhbmRsZSwgMCkpOwotICBzZWN1cml0eV9jYWxsYmFjaygmdGVzdF9hZGRyZXNzLCBCVF9UUkFOU1BPUlRfQlJfRURSLCBwX3BvcnQsIEJUTV9TVUNDRVNTKTsKLSAgb3NpX2ZyZWUodWFfc2VydmVyX3Njbik7Ci0KLSAgVkxPRygxKSA8PCAiU3RlcCAxMSI7Ci0gIC8vIE1QWF9DVFJMIE1vZGVtIFN0YXR1cyBDb21tYW5kIChNU0MpCi0gIEJUX0hEUiogdWloX21zY19jbWRfZnJvbV9wZWVyID0gQWxsb2NhdGVXcmFwcGVkSW5jb21pbmdMMmNhcEFjbFBhY2tldCgKLSAgICAgIENyZWF0ZVF1aWNrTXNjUGFja2V0KHRydWUsIEdldERsY2koZmFsc2UsIHRlc3Rfc2VydmVyX3NjbiksIG5ld19sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNsX2hhbmRsZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKSk7Ci0gIEJUX0hEUiogdWloX21zY19yc3BfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICBDcmVhdGVRdWlja01zY1BhY2tldChmYWxzZSwgR2V0RGxjaShmYWxzZSwgdGVzdF9zZXJ2ZXJfc2NuKSwgbmV3X2xjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhY2xfaGFuZGxlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKSk7Ci0gIC8vIE1QWF9DVFJMIE1vZGVtIFN0YXR1cyBSZXNwb25zZSAoTVNDKQotICBFWFBFQ1RfQ0FMTChsMmNhcF9pbnRlcmZhY2VfLAotICAgICAgICAgICAgICBEYXRhV3JpdGUobmV3X2xjaWQsIEJ0SGRyRXF1YWwodWloX21zY19yc3BfdG9fcGVlcikpKQotICAgICAgLldpbGxPbmNlKFJldHVybihMMkNBUF9EV19TVUNDRVNTKSk7Ci0gIEJUX0hEUiogdWloX21zY19jbWRfdG9fcGVlciA9IEFsbG9jYXRlV3JhcHBlZE91dGdvaW5nTDJjYXBBY2xQYWNrZXQoCi0gICAgICBDcmVhdGVRdWlja01zY1BhY2tldChmYWxzZSwgR2V0RGxjaShmYWxzZSwgdGVzdF9zZXJ2ZXJfc2NuKSwgbmV3X2xjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhY2xfaGFuZGxlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLSAgRVhQRUNUX0NBTEwobDJjYXBfaW50ZXJmYWNlXywKLSAgICAgICAgICAgICAgRGF0YVdyaXRlKG5ld19sY2lkLCBCdEhkckVxdWFsKHVpaF9tc2NfY21kX3RvX3BlZXIpKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oTDJDQVBfRFdfU1VDQ0VTUykpOwotICBsMmNhcF9hcHBsX2luZm9fLnBMMkNBX0RhdGFJbmRfQ2IobmV3X2xjaWQsIHVpaF9tc2NfY21kX2Zyb21fcGVlcik7Ci0gIG9zaV9mcmVlKHVpaF9tc2NfcnNwX3RvX3BlZXIpOwotICBvc2lfZnJlZSh1aWhfbXNjX2NtZF90b19wZWVyKTsKLQotICBWTE9HKDEpIDw8ICJTdGVwIDEyIjsKLSAgQlRfSERSKiB1aWhfbXNjX3JzcF9mcm9tX3BlZXIgPSBBbGxvY2F0ZVdyYXBwZWRJbmNvbWluZ0wyY2FwQWNsUGFja2V0KAotICAgICAgQ3JlYXRlUXVpY2tNc2NQYWNrZXQodHJ1ZSwgR2V0RGxjaShmYWxzZSwgdGVzdF9zZXJ2ZXJfc2NuKSwgbmV3X2xjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhY2xfaGFuZGxlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKSk7Ci0gIGwyY2FwX2FwcGxfaW5mb18ucEwyQ0FfRGF0YUluZF9DYihuZXdfbGNpZCwgdWloX21zY19yc3BfZnJvbV9wZWVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L3JmY29tbS9zdGFja19yZmNvbW1fdGVzdF9tYWluLmNjIGIvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMTU3ZC4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L3JmY29tbS9zdGFja19yZmNvbW1fdGVzdF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJhc2UvY29tbWFuZF9saW5lLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19waWVjZS5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8vIE92ZXJyaWRlIExvZ01zZyBtZXRob2Qgc28gdGhhdCB3ZSBjYW4gb3V0cHV0IGxvZyB2aWEgVkxPRygxKQotZXh0ZXJuICJDIiB2b2lkIExvZ01zZyh1aW50MzJfdCB0cmFjZV9zZXRfbWFzaywgY29uc3QgY2hhciogZm10X3N0ciwgLi4uKSB7Ci0gIGNoYXIgYnVmZmVyWzI1Nl07Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10X3N0cik7Ci0gIHZzbnByaW50ZihidWZmZXIsIDI1NiwgZm10X3N0ciwgYXJncyk7Ci0gIFZMT0coMSkgPDwgYnVmZmVyOwotICB2YV9lbmQoYXJncyk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLQotICBpZiAoYmFzZTo6Q29tbWFuZExpbmU6OkluaXRpYWxpemVkRm9yQ3VycmVudFByb2Nlc3MoKSkgewotICAgIExPRyhGQVRBTCkgPDwgImJhc2U6OkNvbW1hbmRMaW5lOjpJbml0IHNob3VsZCBub3QgYmUgY2FsbGVkIHR3aWNlIjsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGNvbnN0IGNoYXIqIGxvZ19sZXZlbF9hcmcgPSBudWxscHRyOwotICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSkgewotICAgIGlmIChiYXNlOjpTdGFydHNXaXRoKGJhc2U6OlN0cmluZ1BpZWNlKGFyZ3ZbaV0pLCBiYXNlOjpTdHJpbmdQaWVjZSgiLS12PSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNvbXBhcmVDYXNlOjpJTlNFTlNJVElWRV9BU0NJSSkpIHsKLSAgICAgIGxvZ19sZXZlbF9hcmcgPSBhcmd2W2ldOwotICAgIH0KLSAgfQotICBpZiAobG9nX2xldmVsX2FyZyA9PSBudWxscHRyKSB7Ci0gICAgbG9nX2xldmVsX2FyZyA9ICItLXY9MCI7Ci0gIH0KLSAgY29uc3QgY2hhciogbG9nZ2luZ19hcmd2W10gPSB7ImJ0X3N0YWNrIiwgbG9nX2xldmVsX2FyZ307Ci0gIC8vIEluaXQgY29tbWFuZCBsaW5lIG9iamVjdCB3aXRoIGxvZ2dpbmcgc3dpdGNoZXMKLSAgaWYgKCFiYXNlOjpDb21tYW5kTGluZTo6SW5pdCgyLCBsb2dnaW5nX2FyZ3YpKSB7Ci0gICAgTE9HKEZBVEFMKSA8PCAiYmFzZTo6Q29tbWFuZExpbmU6OkluaXQgZmFpbGVkLCBhcmcwPSIgPDwgbG9nZ2luZ19hcmd2WzBdCi0gICAgICAgICAgICAgICA8PCAiLCBhcmcxPSIgPDwgbG9nZ2luZ19hcmd2WzFdOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgbG9nZ2luZzo6TG9nZ2luZ1NldHRpbmdzIGxvZ19zZXR0aW5nczsKLSAgaWYgKCFsb2dnaW5nOjpJbml0TG9nZ2luZyhsb2dfc2V0dGluZ3MpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCB1cCBsb2dnaW5nIjsKLSAgfQotCi0gIC8vIEFuZHJvaWQgYWxyZWFkeSBsb2dzIHRocmVhZF9pZCwgcHJvY19pZCwgdGltZXN0YW1wLCBzbyBkaXNhYmxlIHRob3NlLgotICBsb2dnaW5nOjpTZXRMb2dJdGVtcyhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3QvcmZjb21tL3N0YWNrX3JmY29tbV90ZXN0X3V0aWxzLmNjIGIvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGYzNTAuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJpdHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhY2svcmZjb21tL3JmY19pbnQuaCIKLSNpbmNsdWRlICJzdGFja19yZmNvbW1fdGVzdF91dGlscy5oIgotI2luY2x1ZGUgInN0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHJmY29tbSB7Ci0KLXVpbnQ4X3QgR2V0RGxjaShib29sIG9uX29yaWdpbmF0b3Jfc2lkZSwgdWludDhfdCBzY24pIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChzY24gPDwgMSkgKyAob25fb3JpZ2luYXRvcl9zaWRlID8gMSA6IDApKTsKLX0KLQotdWludDhfdCBHZXRBZGRyZXNzRmllbGQoYm9vbCBlYSwgYm9vbCBjciwgdWludDhfdCBkbGNpKSB7Ci0gIHN0ZDo6Yml0c2V0PDg+IGFkZHJlc3M7Ci0gIGFkZHJlc3Muc2V0KDAsIGVhKTsKLSAgLy8gRm9yIFVJSCBmcmFtZSwgY3IgZm9yIGluaXRpYXRpbmcgZGV2aWNlIGlzIDEsIG90aGVyd2lzZSAwCi0gIC8vIE90aGVyd2lzZToKLSAgLy8gIENvbW1hbmQ6IEluaXRpYXRvciAtPiBSZXNwb25kZXI6IDEKLSAgLy8gIENvbW1hbmQ6IFJlc3BvbmRlciAtPiBJbml0aWF0b3IgMAotICAvLyAgUmVzcG9uc2U6IEluaXRpYXRvciAtPiBSZXNwb25kZXIgMAotICAvLyAgUmVzcG9uc2U6IFJlc3BvbmRlciAtPiBJbml0aWF0b3IgMQotICAvLyBJbml0aWF0b3IgaXMgZGVmaW5lZCBieSB0aGUgb25lIHdobyBzZW5kIFNBQk09MSBjb21tYW5kCi0gIGFkZHJlc3Muc2V0KDEsIGNyKTsKLSAgYWRkcmVzcyB8PSBkbGNpIDw8IDI7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihhZGRyZXNzLnRvX3Vsb25nKCkpOwotfQotCi11aW50OF90IEdldENvbnRyb2xGaWVsZChib29sIHBmLCB1aW50OF90IGZyYW1lX3R5cGUpIHsKLSAgc3RkOjpiaXRzZXQ8OD4gY29udHJvbDsKLSAgY29udHJvbCB8PSBmcmFtZV90eXBlOwotICBjb250cm9sLnNldCg0LCBwZik7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Pihjb250cm9sLnRvX3Vsb25nKCkpOwotfQotCi11aW50OF90IEdldEZyYW1lVHlwZUZyb21Db250cm9sRmllbGQodWludDhfdCBjb250cm9sX2ZpZWxkKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Pihjb250cm9sX2ZpZWxkICYgfigwYjEwMDAwKSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENyZWF0ZU1jY1BuRnJhbWUodWludDhfdCBkbGNpLCB1aW50OF90IGlfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjbF9iaXRzLCB1aW50OF90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRpbWVyX3ZhbHVlLCB1aW50MTZfdCByZmNvbW1fbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9udW1fcmV0cmFuc21pc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXJyX3JlY292ZXJ5X3dpbmRvd19rKSB7Ci0gIC8vIERhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlcgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7Ci0gIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oZGxjaSAmIDBiMDAxMTExMTEpKTsKLSAgcmVzdWx0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoY2xfYml0cyA8PCA0KSB8IChpX2JpdHMgJiAweDBGKSkpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHByaW9yaXR5ICYgMGIwMDExMTExMSkpOwotICByZXN1bHQucHVzaF9iYWNrKHRpbWVyX3ZhbHVlKTsKLSAgcmVzdWx0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihyZmNvbW1fbXR1KSk7Ci0gIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4ocmZjb21tX210dSA+PiA4KSk7Ci0gIHJlc3VsdC5wdXNoX2JhY2sobWF4X251bV9yZXRyYW5zbWlzc2lvbik7Ci0gIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oZXJyX3JlY292ZXJ5X3dpbmRvd19rICYgMGIxMTEpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlTWNjTXNjRnJhbWUodWludDhfdCBkbGNpLCBib29sIGZjLCBib29sIHJ0YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcnRyLCBib29sIGljLCBib29sIGR2KSB7Ci0gIC8vIERhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlcgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7Ci0gIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGRsY2kgPDwgMikgfCAwYjExKSk7Ci0gIHN0ZDo6Yml0c2V0PDg+IHYyNF9zaWduYWxzOwotICAvLyBFQSA9IDEsIHNpbmdsZSBieXRlCi0gIHYyNF9zaWduYWxzLnNldCgwLCB0cnVlKTsKLSAgdjI0X3NpZ25hbHMuc2V0KDEsIGZjKTsKLSAgdjI0X3NpZ25hbHMuc2V0KDIsIHJ0Yyk7Ci0gIHYyNF9zaWduYWxzLnNldCgzLCBydHIpOwotICB2MjRfc2lnbmFscy5zZXQoNiwgaWMpOwotICB2MjRfc2lnbmFscy5zZXQoNywgZHYpOwotICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYyNF9zaWduYWxzLnRvX3Vsb25nKCkpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlTXVsdGlwbGV4ZXJDb250cm9sRnJhbWUoCi0gICAgdWludDhfdCBjb21tYW5kX3R5cGUsIGJvb2wgY3IsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gIC8vIERhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlcgotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7Ci0gIHN0ZDo6Yml0c2V0PDg+IGhlYWRlcjsKLSAgaGVhZGVyLnNldCgwLCB0cnVlKTsgIC8vIEVBIGlzIGFsd2F5cyAxCi0gIGhlYWRlci5zZXQoMSwgY3IpOwotICBoZWFkZXIgfD0gY29tbWFuZF90eXBlIDw8IDI7Ci0gIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oaGVhZGVyLnRvX3Vsb25nKCkpKTsKLSAgLy8gNyBiaXQgbGVuZ3RoICsgRUEoMSkKLSAgcmVzdWx0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoZGF0YS5zaXplKCkgPDwgMSkgKyAxKSk7Ci0gIHJlc3VsdC5pbnNlcnQocmVzdWx0LmVuZCgpLCBkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVSZmNvbW1QYWNrZXQodWludDhfdCBhZGRyZXNzLCB1aW50OF90IGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyZWRpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpIHsKLSAgLy8gRGF0YSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdDsKLSAgcmVzdWx0LnB1c2hfYmFjayhhZGRyZXNzKTsKLSAgcmVzdWx0LnB1c2hfYmFjayhjb250cm9sKTsKLSAgc2l6ZV90IGxlbmd0aCA9IGRhdGEuc2l6ZSgpOwotICBpZiAoKGxlbmd0aCAmIDBiMTAwMDAwMCkgIT0gMCkgewotICAgIC8vIDE1IGJpdHMgb2YgbGVuZ3RoIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIgKyBFQSgwKQotICAgIC8vIExvd2VyIDcgYml0cyArIEVBKDApCi0gICAgcmVzdWx0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihsZW5ndGgpIDw8IDEpOwotICAgIC8vIFVwcGVyIDggYml0cwotICAgIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4obGVuZ3RoID4+IDgpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyA3IGJpdHMgb2YgbGVuZ3RoICsgRUEoMSkKLSAgICByZXN1bHQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChsZW5ndGggPDwgMSkgKyAxKSk7Ci0gIH0KLSAgaWYgKGNyZWRpdHMgPiAwKSB7Ci0gICAgcmVzdWx0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihjcmVkaXRzKSk7Ci0gIH0KLSAgcmVzdWx0Lmluc2VydChyZXN1bHQuZW5kKCksIGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7Ci0gIGlmIChHZXRGcmFtZVR5cGVGcm9tQ29udHJvbEZpZWxkKGNvbnRyb2wpID09IFJGQ09NTV9VSUgpIHsKLSAgICByZXN1bHQucHVzaF9iYWNrKHJmY19jYWxjX2ZjcygyLCByZXN1bHQuZGF0YSgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0LnB1c2hfYmFjaygKLSAgICAgICAgcmZjX2NhbGNfZmNzKHN0YXRpY19jYXN0PHVpbnQxNl90PihyZXN1bHQuc2l6ZSgpKSwgcmVzdWx0LmRhdGEoKSkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENyZWF0ZVF1aWNrVWFQYWNrZXQodWludDhfdCBkbGNpLCB1aW50MTZfdCBsMmNhcF9sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhY2xfaGFuZGxlKSB7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCB0cnVlLCBkbGNpKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKHRydWUsIFJGQ09NTV9VQSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJmY29tbV9wYWNrZXQgPQotICAgICAgQ3JlYXRlUmZjb21tUGFja2V0KGFkZHJlc3NfZmllbGQsIGNvbnRyb2xfZmllbGQsIC0xLCB7fSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGwyY2FwX3BhY2tldCA9Ci0gICAgICBDcmVhdGVMMmNhcERhdGFQYWNrZXQobDJjYXBfbGNpZCwgcmZjb21tX3BhY2tldCk7Ci0gIHJldHVybiBDcmVhdGVBY2xQYWNrZXQoYWNsX2hhbmRsZSwgMGIxMCwgMGIwMCwgbDJjYXBfcGFja2V0KTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tTYWJtUGFja2V0KHVpbnQ4X3QgZGxjaSwgdWludDE2X3QgbDJjYXBfbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhY2xfaGFuZGxlKSB7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCB0cnVlLCBkbGNpKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKHRydWUsIFJGQ09NTV9TQUJNRSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJmY29tbV9wYWNrZXQgPQotICAgICAgQ3JlYXRlUmZjb21tUGFja2V0KGFkZHJlc3NfZmllbGQsIGNvbnRyb2xfZmllbGQsIC0xLCB7fSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGwyY2FwX3BhY2tldCA9Ci0gICAgICBDcmVhdGVMMmNhcERhdGFQYWNrZXQobDJjYXBfbGNpZCwgcmZjb21tX3BhY2tldCk7Ci0gIHJldHVybiBDcmVhdGVBY2xQYWNrZXQoYWNsX2hhbmRsZSwgMGIxMCwgMGIwMCwgbDJjYXBfcGFja2V0KTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tQblBhY2tldChib29sIHJmY19jciwgdWludDhfdCB0YXJnZXRfZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBteF9jciwgdWludDE2X3QgcmZjX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjbCwgdWludDhfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrLCB1aW50MTZfdCBsMmNhcF9sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhY2xfaGFuZGxlKSB7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCByZmNfY3IsIFJGQ09NTV9NWF9ETENJKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKGZhbHNlLCBSRkNPTU1fVUlIKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWNjX3BuX2RhdGEgPSBDcmVhdGVNY2NQbkZyYW1lKAotICAgICAgdGFyZ2V0X2RsY2ksIDB4MCwgY2wsIHByaW9yaXR5LCBSRkNPTU1fVDFfRFNFQywgcmZjX210dSwgUkZDT01NX04yLCBrKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWNjX3BheWxvYWQgPQotICAgICAgQ3JlYXRlTXVsdGlwbGV4ZXJDb250cm9sRnJhbWUoMHgyMCwgbXhfY3IsIG1jY19wbl9kYXRhKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmZjb21tX3BhY2tldCA9Ci0gICAgICBDcmVhdGVSZmNvbW1QYWNrZXQoYWRkcmVzc19maWVsZCwgY29udHJvbF9maWVsZCwgLTEsIG1jY19wYXlsb2FkKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbDJjYXBfcGFja2V0ID0KLSAgICAgIENyZWF0ZUwyY2FwRGF0YVBhY2tldChsMmNhcF9sY2lkLCByZmNvbW1fcGFja2V0KTsKLSAgcmV0dXJuIENyZWF0ZUFjbFBhY2tldChhY2xfaGFuZGxlLCAwYjEwLCAwYjAwLCBsMmNhcF9wYWNrZXQpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVRdWlja01zY1BhY2tldChib29sIHJmY19jciwgdWludDhfdCBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbDJjYXBfbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUsIGJvb2wgbXhfY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZjLCBib29sIHJ0YywgYm9vbCBydHIsIGJvb2wgaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGR2KSB7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCByZmNfY3IsIFJGQ09NTV9NWF9ETENJKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKGZhbHNlLCBSRkNPTU1fVUlIKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWNjX21zY19kYXRhID0KLSAgICAgIENyZWF0ZU1jY01zY0ZyYW1lKGRsY2ksIGZjLCBydGMsIHJ0ciwgaWMsIGR2KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWNjX3BheWxvYWQgPQotICAgICAgQ3JlYXRlTXVsdGlwbGV4ZXJDb250cm9sRnJhbWUoMHgzOCwgbXhfY3IsIG1jY19tc2NfZGF0YSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJmY29tbV9wYWNrZXQgPQotICAgICAgQ3JlYXRlUmZjb21tUGFja2V0KGFkZHJlc3NfZmllbGQsIGNvbnRyb2xfZmllbGQsIC0xLCBtY2NfcGF5bG9hZCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGwyY2FwX3BhY2tldCA9Ci0gICAgICBDcmVhdGVMMmNhcERhdGFQYWNrZXQobDJjYXBfbGNpZCwgcmZjb21tX3BhY2tldCk7Ci0gIHJldHVybiBDcmVhdGVBY2xQYWNrZXQoYWNsX2hhbmRsZSwgMGIxMCwgMGIwMCwgbDJjYXBfcGFja2V0KTsKLX0KLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tEYXRhUGFja2V0KHVpbnQ4X3QgZGxjaSwgYm9vbCBjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsMmNhcF9sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUsIGludCBjcmVkaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCBjciwgZGxjaSk7Ci0gIHVpbnQ4X3QgY29udHJvbF9maWVsZCA9Ci0gICAgICBHZXRDb250cm9sRmllbGQoY3JlZGl0cyA+IDAgPyB0cnVlIDogZmFsc2UsIFJGQ09NTV9VSUgpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZmNvbW1fcGFja2V0ID0KLSAgICAgIENyZWF0ZVJmY29tbVBhY2tldChhZGRyZXNzX2ZpZWxkLCBjb250cm9sX2ZpZWxkLCBjcmVkaXRzLCBkYXRhKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbDJjYXBfcGFja2V0ID0KLSAgICAgIENyZWF0ZUwyY2FwRGF0YVBhY2tldChsMmNhcF9sY2lkLCByZmNvbW1fcGFja2V0KTsKLSAgcmV0dXJuIENyZWF0ZUFjbFBhY2tldChhY2xfaGFuZGxlLCAwYjEwLCAwYjAwLCBsMmNhcF9wYWNrZXQpOwotfQotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVRdWlja0RhdGFQYWNrZXQodWludDhfdCBkbGNpLCBib29sIGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGwyY2FwX2xjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYWNsX2hhbmRsZSwgaW50IGNyZWRpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKHN0ci5iZWdpbigpLCBzdHIuZW5kKCkpOwotICByZXR1cm4gQ3JlYXRlUXVpY2tEYXRhUGFja2V0KGRsY2ksIGNyLCBsMmNhcF9sY2lkLCBhY2xfaGFuZGxlLCBjcmVkaXRzLCBkYXRhKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHJmY29tbQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfdXRpbHMuaCBiL3N0YWNrL3Rlc3QvcmZjb21tL3N0YWNrX3JmY29tbV90ZXN0X3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOGVjNDguLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSByZmNvbW0gewotCi1jbGFzcyBSZmNvbW1DYWxsYmFjayB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgUG9ydE1hbmFnZW1lbnRDYWxsYmFjayh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2FsbGJhY2tfaW5kZXgpID0gMDsKLSAgdmlydHVhbCB2b2lkIFBvcnRFdmVudENhbGxiYWNrKHVpbnQzMl90IGNvZGUsIHVpbnQxNl90IHBvcnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY2FsbGJhY2tfaW5kZXgpID0gMDsKLSAgdmlydHVhbCB+UmZjb21tQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Ci19OwotCi1jbGFzcyBNb2NrUmZjb21tQ2FsbGJhY2sgOiBwdWJsaWMgUmZjb21tQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QzKFBvcnRNYW5hZ2VtZW50Q2FsbGJhY2ssIHZvaWQodWludDMyX3QgY29kZSwgdWludDE2X3QgcG9ydF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNhbGxiYWNrX2luZGV4KSk7Ci0gIE1PQ0tfTUVUSE9EMyhQb3J0RXZlbnRDYWxsYmFjaywgdm9pZCh1aW50MzJfdCBjb2RlLCB1aW50MTZfdCBwb3J0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNhbGxiYWNrX2luZGV4KSk7Ci19OwotCi0vKioKLSAqIENyZWF0ZSBETENJIHVzaW5nIGRpcmVjdGlvbiBvZiBzZXJ2aWNlIGNoYW5uZWwgbnVtYmVyCi0gKgotICogQHBhcmFtIG9uX29yaWdpbmF0b3Jfc2lkZSBpcyB0aGlzIGEgY2hhbm5lbCBvbiBpbml0aWF0b3Igc2lkZQotICogQHBhcmFtIHNjbiBzZXJ2aWNlIGNoYW5uZWwgbnVtYmVyCi0gKiBAcmV0dXJuIERMQ0kKLSAqLwotdWludDhfdCBHZXREbGNpKGJvb2wgb25fb3JpZ2luYXRvcl9zaWRlLCB1aW50OF90IHNjbik7Ci0KLS8qKgotICogQ3JlYXRlIGFkZHJlc3MgZmllbGQgaW4gUkZDT01NIHBhY2tldAotICoKLSAqIEBwYXJhbSBlYSBlbmQgb2YgZmllbGQgYnl0ZSwgdHJ1ZSBpZiBmaWVsZCBvbmx5IGhhcyAxIGJ5dGUsIGZhbHNlIG90aGVyd2lzZQotICogQHBhcmFtIGNyIGNvbW1hbmQgYW5kIHJlc3BvbnNlIGJpdCwgdHJ1ZSBpZiBwYWNrZXQgaXMgZnJvbSBpbml0aWF0b3IsCi0gKiAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLCBub3QgYWN0dWFsICJjb21tYW5kIiBhbmQgInJlc3BvbnNlIgotICogQHBhcmFtIGRsY2kgRExDSSBvZiB0aGlzIHBjYWtldCwgUkZDT01NX01YX0RMQ0kgZm9yIG11bHRpcGxleGVyIGNvbnRyb2wKLSAqIEByZXR1cm4gYWRkcmVzcyBmaWVsZAotICovCi11aW50OF90IEdldEFkZHJlc3NGaWVsZChib29sIGVhLCBib29sIGNyLCB1aW50OF90IGRsY2kpOwotCi0vKioKLSAqIENyZWF0ZSBjb250cm9sIGZpZWxkIGluIFJGQ09NTSBwYWNrZXQKLSAqCi0gKiBAcGFyYW0gcGYgUG9sbC9GaW5pc2ggYml0LCBub3JtYWxseSAxIGZvciBtdWx0aXBsZXhlciBjb250cm9sIGNoYW5uZWwKLSAqIEBwYXJhbSBmcmFtZV90eXBlIGZyYW1lIHR5cGUKLSAqIEByZXR1cm4gY29udHJvbCBmaWVsZAotICovCi11aW50OF90IEdldENvbnRyb2xGaWVsZChib29sIHBmLCB1aW50OF90IGZyYW1lX3R5cGUpOwotCi0vKioKLSAqIENyZWF0ZSBNdWx0aXBsZXhlciBjb250cm9sIGNoYW5uZWwgcGFyYW1ldGVyIG5lZ290aWF0aW9uIGZyYW1lCi0gKgotICogQHBhcmFtIGRsY2kgRExDSSB0byBiZSBjb25maWd1cmVkCi0gKiBAcGFyYW0gaV9iaXRzIGkgYml0cwotICogQHBhcmFtIGNsX2JpdHMgY2wgYml0cwotICogQHBhcmFtIHByaW9yaXR5IHByaW9yaXR5Ci0gKiBAcGFyYW0gdGltZXJfdmFsdWUgdGltZXIgdmFsdWUKLSAqIEBwYXJhbSByZmNvbW1fbXR1IHJmY29tbSBtdHUKLSAqIEBwYXJhbSBtYXhfbnVtX3JldHJhbnNtaXNzaW9uIG1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uCi0gKiBAcGFyYW0gZXJyX3JlY292ZXJ5X3dpbmRvd19rIGVycm9yIHJlY292ZXJ5IHdpbmRvdyBrCi0gKiBAcmV0dXJuIHZlY3RvciBvZiBieXRlcyBvZiB0aGlzIGZyYW1lCi0gKi8KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENyZWF0ZU1jY1BuRnJhbWUodWludDhfdCBkbGNpLCB1aW50OF90IGlfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjbF9iaXRzLCB1aW50OF90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRpbWVyX3ZhbHVlLCB1aW50MTZfdCByZmNvbW1fbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9udW1fcmV0cmFuc21pc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXJyX3JlY292ZXJ5X3dpbmRvd19rKTsKLS8qKgotICogQ3JlYXRlIE11bHRpcGxleGVyIENvbnRyb2wgTW9kZW0gU3RhdHVzIENvbmZpZ3VyYXRpb24gRnJhbWUKLSAqCi0gKiBAcGFyYW0gZGxjaSBETENJIHRvIGJlIGNvbmZpZ3VyZWQKLSAqIEBwYXJhbSBmYyBmbG93IGNvbnRyb2wKLSAqIEBwYXJhbSBydGMgcmVhZHkgdG8gY29tbXVuaWNhdGUKLSAqIEBwYXJhbSBydHIgcmVhZHkgdG8gcmVjZWl2ZQotICogQHBhcmFtIGljIGluY29taW5nIGNhbGwgaW5kaWNhdG9yCi0gKiBAcGFyYW0gZHYgaXMgZGF0YSB2YWxpZAotICogQHJldHVybiB2ZWN0b3Igb2YgYnl0ZXMKLSAqLwotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlTWNjTXNjRnJhbWUodWludDhfdCBkbGNpLCBib29sIGZjLCBib29sIHJ0YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcnRyLCBib29sIGljLCBib29sIGR2KTsKLQotLyoqCi0gKiBDcmVhdGUgTXVsdGlwbGV4ZXIgQ29udHJvbCBGcmFtZQotICoKLSAqIEBwYXJhbSBjb21tYW5kX3R5cGUgdHlwZSBvZiBjb21tYW5kCi0gKiBAcGFyYW0gY3IgY29tbWFuZCBvciByZXNwb25zZSBmbGFnLCB0cnVlIHdoZW4gdGhpcyBpcyBhIGNvbW1hbmQsIGZhbHNlIHdoZW4KLSAqICAgICAgICAgICB0aGlzIGlzIGEgcmVzcG9uc2UsIHJlZ2FyZGxlc3Mgb2YgY29ubmVjdGlvbiBkaXJlY3Rpb24KLSAqIEBwYXJhbSBkYXRhIGZyYW1lIGRhdGEKLSAqIEByZXR1cm4gdmVjdG9yIG9mIGJ5dGVzCi0gKi8KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENyZWF0ZU11bHRpcGxleGVyQ29udHJvbEZyYW1lKAotICAgIHVpbnQ4X3QgY29tbWFuZF90eXBlLCBib29sIGNyLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSk7Ci0KLS8qKgotICogQ3JlYXRlIGEgZ2VuZXJhbCBSRkNPTU0gcGFja2V0Ci0gKgotICogQHBhcmFtIGFkZHJlc3MgYWRkcmVzcyBieXRlCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIGJ5dGUKLSAqIEBwYXJhbSBjcmVkaXRzIG51bWJlciBvZiBjcmVkaXRzLCA8PSAwIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBpZ25vcmVkCi0gKiBAcGFyYW0gZGF0YSBmcmFtZSBkYXRhCi0gKiBAcmV0dXJuIHZlY3RvciBvZiBieXRlcwotICovCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVSZmNvbW1QYWNrZXQodWludDhfdCBhZGRyZXNzLCB1aW50OF90IGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyZWRpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpOwotLyoKLSAqIFZhcmlvdXMgc2hvcnRjdXQgZm9yIGdldHRpbmcgZnJlcXVlbnRseSB1c2VkIHBhY2tldHMKLSAqLwotCi0vKioKLSAqIENyZWF0ZSBTQUJNIHBhY2tldCB0aGF0IGlzIHVzZWQgdG8gY29ubmVjdCB0byBhIHNlcnZpY2UgY2hhbm5lbCBudW1iZXIgaW4gYQotICogbXVsdGlwbGV4ZXIKLSAqCi0gKiBAcGFyYW0gZGxjaSBETENJIHRvIGJlIGNvbm5lY3RlZAotICogQHBhcmFtIGwyY2FwX2xjaWQgTDJDQVAgY2hhbm5lbCBJRAotICogQHBhcmFtIGFjbF9oYW5kbGUgQUNMIGhhbmRsZQotICogQHJldHVybiB2ZWN0b3Igb2YgYnl0ZXMgb2YgdW53cmFwcGVkIEFDTCBwYWNrZXQKLSAqLwotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tTYWJtUGFja2V0KHVpbnQ4X3QgZGxjaSwgdWludDE2X3QgbDJjYXBfbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhY2xfaGFuZGxlKTsKLQotLyoqCi0gKiBDcmVhdGUgVUEgcGFja2V0IHRoYXQgaXMgdXNlZCB0byBhY2tub3dsZWRnZSBzZXJ2aWNlIGNoYW5uZWwgY29ubmVjdGlvbgotICoKLSAqIEBwYXJhbSBkbGNpIERMQ0kgdG8gYmUgY29ubmVjdGVkCi0gKiBAcGFyYW0gbDJjYXBfbGNpZCBMMkNBUCBjaGFubmVsIElECi0gKiBAcGFyYW0gYWNsX2hhbmRsZSBBQ0wgaGFuZGxlCi0gKiBAcmV0dXJuIHZlY3RvciBvZiBieXRlcyBvZiB1bndyYXBwZWQgQUNMIHBhY2tldAotICovCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVRdWlja1VhUGFja2V0KHVpbnQ4X3QgZGxjaSwgdWludDE2X3QgbDJjYXBfbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYWNsX2hhbmRsZSk7Ci0KLS8qKgotICogQ3JlYXRlIHBhcmFtZXRlciBuZWdvdGlhdGlvbiBwYWNrZXQgdXNlZCB0byBzZXR1cCBwYXJhbWV0ZXJzIGZvciBhIERMQ0kKLSAqCi0gKiBAcGFyYW0gcmZjX2NyIFJGQ09NTSBjb21tYW5kL3Jlc3BvbnNlIGJpdCwgdHJ1ZSBvZiBpbml0aWF0b3IKLSAqIEBwYXJhbSB0YXJnZXRfZGxjaSBETENJIHRvIGJlIGNvbmZpZ3VyZWQKLSAqIEBwYXJhbSBteF9jciBtdWx0aXBsZXhlciBjb21tYW5kIG9yIHJlcG9uc2UsIHJlZ2FyZGxlc3Mgb2YgaW5pdGlhdG9yCi0gKiBAcGFyYW0gcmZjX210dSBSRkNPTU0gbXR1IHRvIGJlIHVzZWQgZm9yIERMQ0kKLSAqIEBwYXJhbSBjbCBDTCBiaXQKLSAqIEBwYXJhbSBwcmlvcml0eSBwcmlyb3JpdHkKLSAqIEBwYXJhbSBrIGVycm9yIHJlY292ZXJ5IHdpbmRvdyBrCi0gKiBAcGFyYW0gbDJjYXBfbGNpZCBMMkNBUCBjaGFubmVsIElECi0gKiBAcGFyYW0gYWNsX2hhbmRsZSBBQ0wgaGFuZGxlCi0gKiBAcmV0dXJuIHZlY3RvciBvZiBieXRlcyBvZiB1bndyYXBwZWQgQUNMIHBhY2tldAotICovCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBDcmVhdGVRdWlja1BuUGFja2V0KGJvb2wgcmZjX2NyLCB1aW50OF90IHRhcmdldF9kbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG14X2NyLCB1aW50MTZfdCByZmNfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNsLCB1aW50OF90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGssIHVpbnQxNl90IGwyY2FwX2xjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUpOwotCi0vKioKLSAqIENyZWF0ZSBtb2RlbSBzaWduYWwgY29udHJvbCBwYWNrZXQKLSAqCi0gKiBAcGFyYW0gcmZjX2NyIFJGQ09NTSBjb21tYW5kL3Jlc3BvbnNlIGJpdCwgdHJ1ZSBvZiBpbml0aWF0b3IKLSAqIEBwYXJhbSBkbGNpIERMQ0kgdG8gYmUgY29uZmlndXJlZAotICogQHBhcmFtIGwyY2FwX2xjaWQgTDJDQVAgY2hhbm5lbCBJRAotICogQHBhcmFtIGFjbF9oYW5kbGUgQUNMIGhhbmRsZQotICogQHBhcmFtIG14X2NyIG11bHRpcGxleGVyIGNvbW1hbmQgb3IgcmVwb25zZSwgcmVnYXJkbGVzcyBvZiBpbml0aWF0b3IKLSAqIEBwYXJhbSBmYyBmbG93IGNvbnRyb2wKLSAqIEBwYXJhbSBydGMgcmVhZHkgdG8gY29tbXVuaWNhdGUKLSAqIEBwYXJhbSBydHIgcmVhZHkgdG8gcmVjZWl2ZQotICogQHBhcmFtIGljIGluY29taW5nIGNhbGwgaW5kaWNhdG9yCi0gKiBAcGFyYW0gZHYgZGF0YSB2YWxpZAotICogQHJldHVybiB2ZWN0b3Igb2YgYnl0ZXMgb2YgdW53cmFwcGVkIEFDTCBwYWNrZXQKLSAqLwotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tNc2NQYWNrZXQoYm9vbCByZmNfY3IsIHVpbnQ4X3QgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGwyY2FwX2xjaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhY2xfaGFuZGxlLCBib29sIG14X2NyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmYywgYm9vbCBydGMsIGJvb2wgcnRyLCBib29sIGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkdik7Ci0KLS8qKgotICogQ3JlYXRlIGEgcXVpY2sgUkZDT01NIGRhdGEgcGFja2V0Ci0gKgotICogQHBhcmFtIGRsY2kgRExDSSBvZiB0aGlzIHBhY2tldAotICogQHBhcmFtIGNyIGNvbW1hbmQgb3IgY29udHJvbCwgdHJ1ZSBmb3IgaW5pdGlhdG9yCi0gKiBAcGFyYW0gbDJjYXBfbGNpZCBMMkNBUCBjaGFubmVsIElECi0gKiBAcGFyYW0gYWNsX2hhbmRsZSBBQ0wgaGFuZGxlCi0gKiBAcGFyYW0gY3JlZGl0cyBudW1iZXIgb2YgY3JlZGl0cwotICogQHBhcmFtIGRhdGEgZGF0YSBieXRlcwotICogQHJldHVybiB2ZWN0b3Igb2YgYnl0ZXMgb2YgdW53cmFwcGVkIEFDTCBwYWNrZXQKLSAqLwotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tEYXRhUGFja2V0KHVpbnQ4X3QgZGxjaSwgYm9vbCBjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsMmNhcF9sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUsIGludCBjcmVkaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBxdWljayBSRkNPTU0gZGF0YSBwYWNrZXQKLSAqCi0gKiBAcGFyYW0gZGxjaSBETENJIG9mIHRoaXMgcGFja2V0Ci0gKiBAcGFyYW0gY3IgY29tbWFuZCBvciBjb250cm9sLCB0cnVlIGZvciBpbml0aWF0b3IKLSAqIEBwYXJhbSBsMmNhcF9sY2lkIEwyQ0FQIGNoYW5uZWwgSUQKLSAqIEBwYXJhbSBhY2xfaGFuZGxlIEFDTCBoYW5kbGUKLSAqIEBwYXJhbSBjcmVkaXRzIG51bWJlciBvZiBjcmVkaXRzCi0gKiBAcGFyYW0gc3RyIG1lc3NhZ2UgaW4gc3RyaW5nIGZvcm1hdAotICogQHJldHVybiB2ZWN0b3Igb2YgYnl0ZXMgb2YgdW53cmFwcGVkIEFDTCBwYWNrZXQKLSAqLwotc3RkOjp2ZWN0b3I8dWludDhfdD4gQ3JlYXRlUXVpY2tEYXRhUGFja2V0KHVpbnQ4X3QgZGxjaSwgYm9vbCBjciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsMmNhcF9sY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGFjbF9oYW5kbGUsIGludCBjcmVkaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi19ICAvLyBuYW1lc3BhY2UgcmZjb21tCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L3JmY29tbS9zdGFja19yZmNvbW1fdGVzdF91dGlsc190ZXN0LmNjIGIvc3RhY2svdGVzdC9yZmNvbW0vc3RhY2tfcmZjb21tX3Rlc3RfdXRpbHNfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3YzdiYi4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L3JmY29tbS9zdGFja19yZmNvbW1fdGVzdF91dGlsc190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3JmY2RlZnMuaCIKLSNpbmNsdWRlICJzdGFja19yZmNvbW1fdGVzdF91dGlscy5oIgotI2luY2x1ZGUgInN0YWNrX3Rlc3RfcGFja2V0X3V0aWxzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHRlc3Rpbmc6OkVsZW1lbnRzQXJlQXJyYXk7Ci0KLXVzaW5nIGJsdWV0b290aDo6Q3JlYXRlTDJjYXBEYXRhUGFja2V0OwotdXNpbmcgYmx1ZXRvb3RoOjpDcmVhdGVBY2xQYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OkFsbG9jYXRlV3JhcHBlZEluY29taW5nTDJjYXBBY2xQYWNrZXQ7Ci0KLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpHZXREbGNpOwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkdldEFkZHJlc3NGaWVsZDsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpHZXRDb250cm9sRmllbGQ7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6Q3JlYXRlTWNjUG5GcmFtZTsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVNY2NNc2NGcmFtZTsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVNdWx0aXBsZXhlckNvbnRyb2xGcmFtZTsKLXVzaW5nIGJsdWV0b290aDo6cmZjb21tOjpDcmVhdGVSZmNvbW1QYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6Q3JlYXRlUXVpY2tEYXRhUGFja2V0OwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkNyZWF0ZVF1aWNrUG5QYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6Q3JlYXRlUXVpY2tTYWJtUGFja2V0OwotdXNpbmcgYmx1ZXRvb3RoOjpyZmNvbW06OkNyZWF0ZVF1aWNrVWFQYWNrZXQ7Ci11c2luZyBibHVldG9vdGg6OnJmY29tbTo6Q3JlYXRlUXVpY2tNc2NQYWNrZXQ7Ci0KLWNvbnN0IHVpbnQ4X3Qga0luY29taW5nU2FibUNoYW5uZWwwW10gPSB7MHgwOCwgMHgyMCwgMHgwOCwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YywgMHgwMCwgMHgwMywgMHgzZiwgMHgwMSwgMHgxY307Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RHZW5lcmF0ZVNhYm1DaGFubmVsMFBhY2tldCkgewotICB1aW50OF90IGRsY2kgPSBHZXREbGNpKGZhbHNlLCAwKTsKLSAgRVhQRUNUX0VRKGRsY2ksIDApOwotICB1aW50OF90IGFkZHJlc3NfZmllbGQgPSBHZXRBZGRyZXNzRmllbGQodHJ1ZSwgdHJ1ZSwgZGxjaSk7Ci0gIEVYUEVDVF9FUShhZGRyZXNzX2ZpZWxkLCAweDAzKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKHRydWUsIFJGQ09NTV9TQUJNRSk7Ci0gIEVYUEVDVF9FUShjb250cm9sX2ZpZWxkLCAweDNGKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmZjb21tX3BhY2tldCA9Ci0gICAgICBDcmVhdGVSZmNvbW1QYWNrZXQoYWRkcmVzc19maWVsZCwgY29udHJvbF9maWVsZCwgLTEsIHt9KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbDJjYXBfcGFja2V0ID0KLSAgICAgIENyZWF0ZUwyY2FwRGF0YVBhY2tldCgweDAwNWMsIHJmY29tbV9wYWNrZXQpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhY2xfcGFja2V0ID0KLSAgICAgIENyZWF0ZUFjbFBhY2tldCgweDAwMDgsIDBiMTAsIDBiMDAsIGwyY2FwX3BhY2tldCk7Ci0gIEVYUEVDVF9USEFUKGFjbF9wYWNrZXQsIEVsZW1lbnRzQXJlQXJyYXkoa0luY29taW5nU2FibUNoYW5uZWwwKSk7Ci19Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RRdWlja0dlbmVyYXRlU2FibUNoYW5uZWwwUGFja2V0KSB7Ci0gIEVYUEVDVF9USEFUKENyZWF0ZVF1aWNrU2FibVBhY2tldChSRkNPTU1fTVhfRExDSSwgMHgwMDVjLCAweDAwMDgpLAotICAgICAgICAgICAgICBFbGVtZW50c0FyZUFycmF5KGtJbmNvbWluZ1NhYm1DaGFubmVsMCkpOwotfQotCi1jb25zdCB1aW50OF90IGtPdXRnb2luZ1VhQ2hhbm5lbDBbXSA9IHsweDA4LCAweDIwLCAweDA4LCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgxNywgMHgwMywgMHg3MywgMHgwMSwgMHhkN307Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RHZW5lcmF0ZVVhUGFja2V0KSB7Ci0gIHVpbnQ4X3QgZGxjaSA9IEdldERsY2koZmFsc2UsIDApOwotICBFWFBFQ1RfRVEoZGxjaSwgMCk7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCB0cnVlLCBkbGNpKTsKLSAgRVhQRUNUX0VRKGFkZHJlc3NfZmllbGQsIDB4MDMpOwotICB1aW50OF90IGNvbnRyb2xfZmllbGQgPSBHZXRDb250cm9sRmllbGQodHJ1ZSwgUkZDT01NX1VBKTsKLSAgRVhQRUNUX0VRKGNvbnRyb2xfZmllbGQsIDB4NzMpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZmNvbW1fcGFja2V0ID0KLSAgICAgIENyZWF0ZVJmY29tbVBhY2tldChhZGRyZXNzX2ZpZWxkLCBjb250cm9sX2ZpZWxkLCAtMSwge30pOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsMmNhcF9wYWNrZXQgPQotICAgICAgQ3JlYXRlTDJjYXBEYXRhUGFja2V0KDB4MTcwMCwgcmZjb21tX3BhY2tldCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFjbF9wYWNrZXQgPQotICAgICAgQ3JlYXRlQWNsUGFja2V0KDB4MDAwOCwgMGIxMCwgMGIwMCwgbDJjYXBfcGFja2V0KTsKLSAgRVhQRUNUX1RIQVQoYWNsX3BhY2tldCwgRWxlbWVudHNBcmVBcnJheShrT3V0Z29pbmdVYUNoYW5uZWwwKSk7Ci19Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RRdWlja0dlbmVyYXRlVWFQYWNrZXQpIHsKLSAgRVhQRUNUX1RIQVQoQ3JlYXRlUXVpY2tVYVBhY2tldChSRkNPTU1fTVhfRExDSSwgMHgxNzAwLCAweDAwMDgpLAotICAgICAgICAgICAgICBFbGVtZW50c0FyZUFycmF5KGtPdXRnb2luZ1VhQ2hhbm5lbDApKTsKLX0KLQotY29uc3QgdWludDhfdCBrSW5jb21pbmdVaWhQblNldENoYW5uZWxUbzNbXSA9IHsKLSAgICAweDA4LCAweDIwLCAweDEyLCAweDAwLCAweDBlLCAweDAwLCAweDVjLCAweDAwLCAweDAzLCAweGVmLCAweDE1LAotICAgIDB4ODMsIDB4MTEsIDB4MDYsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NzB9OwotCi1URVNUKFJmY29tbVRlc3RQYWNrZXRHZW5lcmF0b3JUZXN0LCBUZXN0R2VuZXJhdGVVaWhQblNldENoYW5uZWwzUGFja2V0KSB7Ci0gIHVpbnQ4X3QgZGxjaSA9IEdldERsY2koZmFsc2UsIDApOwotICBFWFBFQ1RfRVEoZGxjaSwgMCk7Ci0gIHVpbnQ4X3QgYWRkcmVzc19maWVsZCA9IEdldEFkZHJlc3NGaWVsZCh0cnVlLCB0cnVlLCBkbGNpKTsKLSAgRVhQRUNUX0VRKGFkZHJlc3NfZmllbGQsIDB4MDMpOwotICB1aW50OF90IGNvbnRyb2xfZmllbGQgPSBHZXRDb250cm9sRmllbGQoZmFsc2UsIFJGQ09NTV9VSUgpOwotICBFWFBFQ1RfRVEoY29udHJvbF9maWVsZCwgMHhFRik7Ci0gIHVpbnQ4X3QgbmV3X2RsY2kgPSBHZXREbGNpKGZhbHNlLCAzKTsKLSAgRVhQRUNUX0VRKG5ld19kbGNpLCA2KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWNjX3BuX2RhdGEgPQotICAgICAgQ3JlYXRlTWNjUG5GcmFtZShuZXdfZGxjaSwgMHgwLCAweEYsIDAsIDAsIDg4NCwgMCwgMSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1jY19wYXlsb2FkID0KLSAgICAgIENyZWF0ZU11bHRpcGxleGVyQ29udHJvbEZyYW1lKDB4MjAsIHRydWUsIG1jY19wbl9kYXRhKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmZjb21tX3BhY2tldCA9Ci0gICAgICBDcmVhdGVSZmNvbW1QYWNrZXQoYWRkcmVzc19maWVsZCwgY29udHJvbF9maWVsZCwgLTEsIG1jY19wYXlsb2FkKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbDJjYXBfcGFja2V0ID0KLSAgICAgIENyZWF0ZUwyY2FwRGF0YVBhY2tldCgweDAwNWMsIHJmY29tbV9wYWNrZXQpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhY2xfcGFja2V0ID0KLSAgICAgIENyZWF0ZUFjbFBhY2tldCgweDAwMDgsIDBiMTAsIDBiMDAsIGwyY2FwX3BhY2tldCk7Ci0gIEVYUEVDVF9USEFUKGFjbF9wYWNrZXQsIEVsZW1lbnRzQXJlQXJyYXkoa0luY29taW5nVWloUG5TZXRDaGFubmVsVG8zKSk7Ci19Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RRdWlja0dlbmVyYXRlVWloUG5TZXRDaGFubmVsM1BhY2tldCkgewotICBFWFBFQ1RfVEhBVChDcmVhdGVRdWlja1BuUGFja2V0KHRydWUsIEdldERsY2koZmFsc2UsIDMpLCB0cnVlLCA4ODQsIDB4RiwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNWMsIDB4MDAwOCksCi0gICAgICAgICAgICAgIEVsZW1lbnRzQXJlQXJyYXkoa0luY29taW5nVWloUG5TZXRDaGFubmVsVG8zKSk7Ci19Ci0KLWNvbnN0IHVpbnQ4X3Qga0luY29taW5nU2FibUNoYW5uZWwzW10gPSB7MHgwOCwgMHgyMCwgMHgwOCwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YywgMHgwMCwgMHgxYiwgMHgzZiwgMHgwMSwgMHhkM307Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RHZW5lcmF0ZVNhYm1DaGFubmVsM1BhY2tldCkgewotICB1aW50OF90IGRsY2kgPSBHZXREbGNpKGZhbHNlLCAzKTsKLSAgRVhQRUNUX0VRKGRsY2ksIDYpOwotICB1aW50OF90IGFkZHJlc3NfZmllbGQgPSBHZXRBZGRyZXNzRmllbGQodHJ1ZSwgdHJ1ZSwgZGxjaSk7Ci0gIEVYUEVDVF9FUShhZGRyZXNzX2ZpZWxkLCAweDFiKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKHRydWUsIFJGQ09NTV9TQUJNRSk7Ci0gIEVYUEVDVF9FUShjb250cm9sX2ZpZWxkLCAweDNGKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmZjb21tX3BhY2tldCA9Ci0gICAgICBDcmVhdGVSZmNvbW1QYWNrZXQoYWRkcmVzc19maWVsZCwgY29udHJvbF9maWVsZCwgLTEsIHt9KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbDJjYXBfcGFja2V0ID0KLSAgICAgIENyZWF0ZUwyY2FwRGF0YVBhY2tldCgweDAwNWMsIHJmY29tbV9wYWNrZXQpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhY2xfcGFja2V0ID0KLSAgICAgIENyZWF0ZUFjbFBhY2tldCgweDAwMDgsIDBiMTAsIDBiMDAsIGwyY2FwX3BhY2tldCk7Ci0gIEVYUEVDVF9USEFUKGFjbF9wYWNrZXQsIEVsZW1lbnRzQXJlQXJyYXkoa0luY29taW5nU2FibUNoYW5uZWwzKSk7Ci19Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RHZW5lcmF0ZVF1aWNrU2FibUNoYW5uZWwzUGFja2V0KSB7Ci0gIEVYUEVDVF9USEFUKENyZWF0ZVF1aWNrU2FibVBhY2tldChHZXREbGNpKGZhbHNlLCAzKSwgMHgwMDVjLCAweDAwMDgpLAotICAgICAgICAgICAgICBFbGVtZW50c0FyZUFycmF5KGtJbmNvbWluZ1NhYm1DaGFubmVsMykpOwotfQotCi1jb25zdCB1aW50OF90IGtJbmNvbWluZ1VpaE1zY0NtZEZyYW1lW10gPSB7MHgwOCwgMHgyMCwgMHgwYywgMHgwMCwgMHgwOCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjLCAweDAwLCAweDAzLCAweGVmLCAweDA5LCAweGUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUsIDB4MWIsIDB4OGQsIDB4NzB9OwotCi1URVNUKFJmY29tbVRlc3RQYWNrZXRHZW5lcmF0b3JUZXN0LCBUZXN0R2VuZXJhdGVVaWhNc2NDbWRQYWNrZXQpIHsKLSAgdWludDhfdCBkbGNpID0gR2V0RGxjaShmYWxzZSwgMCk7Ci0gIEVYUEVDVF9FUShkbGNpLCAwKTsKLSAgdWludDhfdCBhZGRyZXNzX2ZpZWxkID0gR2V0QWRkcmVzc0ZpZWxkKHRydWUsIHRydWUsIGRsY2kpOwotICBFWFBFQ1RfRVEoYWRkcmVzc19maWVsZCwgMHgwMyk7Ci0gIHVpbnQ4X3QgY29udHJvbF9maWVsZCA9IEdldENvbnRyb2xGaWVsZChmYWxzZSwgUkZDT01NX1VJSCk7Ci0gIEVYUEVDVF9FUShjb250cm9sX2ZpZWxkLCAweEVGKTsKLSAgdWludDhfdCBuZXdfZGxjaSA9IEdldERsY2koZmFsc2UsIDMpOwotICBFWFBFQ1RfRVEobmV3X2RsY2ksIDYpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtY2NfbXNjX2RhdGEgPQotICAgICAgQ3JlYXRlTWNjTXNjRnJhbWUobmV3X2RsY2ksIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1jY19wYXlsb2FkID0KLSAgICAgIENyZWF0ZU11bHRpcGxleGVyQ29udHJvbEZyYW1lKDB4MzgsIHRydWUsIG1jY19tc2NfZGF0YSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJmY29tbV9wYWNrZXQgPQotICAgICAgQ3JlYXRlUmZjb21tUGFja2V0KGFkZHJlc3NfZmllbGQsIGNvbnRyb2xfZmllbGQsIC0xLCBtY2NfcGF5bG9hZCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGwyY2FwX3BhY2tldCA9Ci0gICAgICBDcmVhdGVMMmNhcERhdGFQYWNrZXQoMHgwMDVjLCByZmNvbW1fcGFja2V0KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWNsX3BhY2tldCA9Ci0gICAgICBDcmVhdGVBY2xQYWNrZXQoMHgwMDA4LCAwYjEwLCAwYjAwLCBsMmNhcF9wYWNrZXQpOwotICBFWFBFQ1RfVEhBVChhY2xfcGFja2V0LCBFbGVtZW50c0FyZUFycmF5KGtJbmNvbWluZ1VpaE1zY0NtZEZyYW1lKSk7Ci19Ci0KLVRFU1QoUmZjb21tVGVzdFBhY2tldEdlbmVyYXRvclRlc3QsIFRlc3RRdWlja0dlbmVyYXRlVWloTXNjQ21kUGFja2V0KSB7Ci0gIEVYUEVDVF9USEFUKENyZWF0ZVF1aWNrTXNjUGFja2V0KHRydWUsIEdldERsY2koZmFsc2UsIDMpLCAweDAwNWMsIDB4MDAwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgICAgRWxlbWVudHNBcmVBcnJheShrSW5jb21pbmdVaWhNc2NDbWRGcmFtZSkpOwotfQotCi1jb25zdCB1aW50OF90IGtJbmNvbWluZ1VpaE1zY1Jlc3BvbnNlRnJhbWVbXSA9IHsKLSAgICAweDA4LCAweDIwLCAweDBjLCAweDAwLCAweDA4LCAweDAwLCAweDVjLCAweDAwLAotICAgIDB4MDMsIDB4ZWYsIDB4MDksIDB4ZTEsIDB4MDUsIDB4MWIsIDB4OGQsIDB4NzB9OwotCi1URVNUKFJmY29tbVRlc3RQYWNrZXRHZW5lcmF0b3JUZXN0LCBUZXN0R2VuZXJhdGVVaWhNc2NSZXNwb25zZVBhY2tldCkgewotICB1aW50OF90IGRsY2kgPSBHZXREbGNpKGZhbHNlLCAwKTsKLSAgRVhQRUNUX0VRKGRsY2ksIDApOwotICB1aW50OF90IGFkZHJlc3NfZmllbGQgPSBHZXRBZGRyZXNzRmllbGQodHJ1ZSwgdHJ1ZSwgZGxjaSk7Ci0gIEVYUEVDVF9FUShhZGRyZXNzX2ZpZWxkLCAweDAzKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKGZhbHNlLCBSRkNPTU1fVUlIKTsKLSAgRVhQRUNUX0VRKGNvbnRyb2xfZmllbGQsIDB4RUYpOwotICB1aW50OF90IG5ld19kbGNpID0gR2V0RGxjaShmYWxzZSwgMyk7Ci0gIEVYUEVDVF9FUShuZXdfZGxjaSwgNik7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1jY19tc2NfZGF0YSA9Ci0gICAgICBDcmVhdGVNY2NNc2NGcmFtZShuZXdfZGxjaSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWNjX3BheWxvYWQgPQotICAgICAgQ3JlYXRlTXVsdGlwbGV4ZXJDb250cm9sRnJhbWUoMHgzOCwgZmFsc2UsIG1jY19tc2NfZGF0YSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJmY29tbV9wYWNrZXQgPQotICAgICAgQ3JlYXRlUmZjb21tUGFja2V0KGFkZHJlc3NfZmllbGQsIGNvbnRyb2xfZmllbGQsIC0xLCBtY2NfcGF5bG9hZCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGwyY2FwX3BhY2tldCA9Ci0gICAgICBDcmVhdGVMMmNhcERhdGFQYWNrZXQoMHgwMDVjLCByZmNvbW1fcGFja2V0KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWNsX3BhY2tldCA9Ci0gICAgICBDcmVhdGVBY2xQYWNrZXQoMHgwMDA4LCAwYjEwLCAwYjAwLCBsMmNhcF9wYWNrZXQpOwotICBFWFBFQ1RfVEhBVChhY2xfcGFja2V0LCBFbGVtZW50c0FyZUFycmF5KGtJbmNvbWluZ1VpaE1zY1Jlc3BvbnNlRnJhbWUpKTsKLX0KLQotVEVTVChSZmNvbW1UZXN0UGFja2V0R2VuZXJhdG9yVGVzdCwgVGVzdFF1aWNrR2VuZXJhdGVVaWhNc2NSZXNwb25zZVBhY2tldCkgewotICBFWFBFQ1RfVEhBVChDcmVhdGVRdWlja01zY1BhY2tldCh0cnVlLCBHZXREbGNpKGZhbHNlLCAzKSwgMHgwMDVjLCAweDAwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgICBFbGVtZW50c0FyZUFycmF5KGtJbmNvbWluZ1VpaE1zY1Jlc3BvbnNlRnJhbWUpKTsKLX0KLQotY29uc3QgdWludDhfdCBrSW5jb21pbmdCcnNmRnJhbWVbXSA9IHsweDA4LCAweDIwLCAweDE1LCAweDAwLCAweDExLCAweDAwLCAweDVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDFiLCAweGZmLCAweDE5LCAweDA2LCAweDQxLCAweDU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJiLCAweDQyLCAweDUyLCAweDUzLCAweDQ2LCAweDNkLCAweDM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1LCAweDM5LCAweDBkLCAweDkzfTsKLQotVEVTVChSZmNvbW1UZXN0UGFja2V0R2VuZXJhdG9yVGVzdCwgVGVzdEdlbmVyYXRlRGF0YVBhY2tldCkgewotICB1aW50OF90IGRsY2kgPSBHZXREbGNpKGZhbHNlLCAzKTsKLSAgRVhQRUNUX0VRKGRsY2ksIDYpOwotICB1aW50OF90IGFkZHJlc3NfZmllbGQgPSBHZXRBZGRyZXNzRmllbGQodHJ1ZSwgdHJ1ZSwgZGxjaSk7Ci0gIEVYUEVDVF9FUShhZGRyZXNzX2ZpZWxkLCAweDFCKTsKLSAgdWludDhfdCBjb250cm9sX2ZpZWxkID0gR2V0Q29udHJvbEZpZWxkKHRydWUsIFJGQ09NTV9VSUgpOwotICBFWFBFQ1RfRVEoY29udHJvbF9maWVsZCwgMHhGRik7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGRhdGFfc3RyID0gIkFUK0JSU0Y9OTU5XHIiOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKGRhdGFfc3RyLmJlZ2luKCksIGRhdGFfc3RyLmVuZCgpKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmZjb21tX3BhY2tldCA9Ci0gICAgICBDcmVhdGVSZmNvbW1QYWNrZXQoYWRkcmVzc19maWVsZCwgY29udHJvbF9maWVsZCwgNiwgZGF0YSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGwyY2FwX3BhY2tldCA9Ci0gICAgICBDcmVhdGVMMmNhcERhdGFQYWNrZXQoMHgwMDVjLCByZmNvbW1fcGFja2V0KTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWNsX3BhY2tldCA9Ci0gICAgICBDcmVhdGVBY2xQYWNrZXQoMHgwMDA4LCAwYjEwLCAwYjAwLCBsMmNhcF9wYWNrZXQpOwotICBFWFBFQ1RfVEhBVChhY2xfcGFja2V0LCBFbGVtZW50c0FyZUFycmF5KGtJbmNvbWluZ0Jyc2ZGcmFtZSkpOwotfQotCi1URVNUKFJmY29tbVRlc3RQYWNrZXRHZW5lcmF0b3JUZXN0LCBUZXN0UXVpY2tHZW5lcmF0ZURhdGFQYWNrZXQpIHsKLSAgRVhQRUNUX1RIQVQoQ3JlYXRlUXVpY2tEYXRhUGFja2V0KEdldERsY2koZmFsc2UsIDMpLCB0cnVlLCAweDAwNWMsIDB4MDAwOCwgNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVCtCUlNGPTk1OVxyIiksCi0gICAgICAgICAgICAgIEVsZW1lbnRzQXJlQXJyYXkoa0luY29taW5nQnJzZkZyYW1lKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9zdGFja19hMmRwX3Rlc3QuY2MgYi9zdGFjay90ZXN0L3N0YWNrX2EyZHBfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1MjZlNy4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L3N0YWNrX2EyZHBfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2EyZHBfYWFjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2EyZHBfc2JjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX3ZlbmRvci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLW5hbWVzcGFjZSB7Ci1jb25zdCB1aW50OF90IGNvZGVjX2luZm9fc2JjW0FWRFRfQ09ERUNfU0laRV0gPSB7Ci0gICAgNiwgICAgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIChBMkRQX1NCQ19JTkZPX0xFTikKLSAgICAwLCAgICAgICAgICAgICAgICAgICAvLyBNZWRpYSBUeXBlOiBBVkRUX01FRElBX1RZUEVfQVVESU8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAvLyBNZWRpYSBDb2RlYyBUeXBlOiBBMkRQX01FRElBX0NUX1NCQwotICAgIDB4MjAgfCAweDAxLCAgICAgICAgIC8vIFNhbXBsZSBGcmVxdWVuY3k6IEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbm5lbCBNb2RlOiBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVAotICAgIDB4MTAgfCAweDA0IHwgMHgwMSwgIC8vIEJsb2NrIExlbmd0aDogQTJEUF9TQkNfSUVfQkxPQ0tTXzE2IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJiYW5kczogQTJEUF9TQkNfSUVfU1VCQkFORF84IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0aW9uIE1ldGhvZDogQTJEUF9TQkNfSUVfQUxMT0NfTURfTAotICAgIDIsICAgICAgICAgICAgICAgICAgIC8vIE1pbmltdW1CaXRwb29sIFZhbHVlOiBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTAotICAgIDUzLCAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gQml0cG9vbCBWYWx1ZTogQTJEUF9TQkNfTUFYX0JJVFBPT0wKLSAgICA3LCAgICAgICAgICAgICAgICAgICAvLyBGYWtlCi0gICAgOCwgICAgICAgICAgICAgICAgICAgLy8gRmFrZQotICAgIDkgICAgICAgICAgICAgICAgICAgIC8vIEZha2UKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgY29kZWNfaW5mb19zYmNfY2FwYWJpbGl0eVtBVkRUX0NPREVDX1NJWkVdID0gewotICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIChBMkRQX1NCQ19JTkZPX0xFTikKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhIFR5cGU6IEFWRFRfTUVESUFfVFlQRV9BVURJTwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWEgQ29kZWMgVHlwZTogQTJEUF9NRURJQV9DVF9TQkMKLSAgICAweDIwIHwgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXBsZSBGcmVxdWVuY3k6IEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCB8Ci0gICAgICAgIDB4MDggfCAweDAxLCAgICAgICAgICAgICAvLyBDaGFubmVsIE1vZGU6IEEyRFBfU0JDX0lFX0NIX01EX01PTk8gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfQ0hfTURfSk9JTlQKLSAgICAweDgwIHwgMHg0MCB8IDB4MjAgfCAweDEwIHwgIC8vIEJsb2NrIExlbmd0aDogQTJEUF9TQkNfSUVfQkxPQ0tTXzQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfQkxPQ0tTXzggfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfQkxPQ0tTXzEyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEyRFBfU0JDX0lFX0JMT0NLU18xNiB8Ci0gICAgICAgIDB4MDQgfCAgICAgICAgICAgICAgICAgICAvLyBTdWJiYW5kczogQTJEUF9TQkNfSUVfU1VCQkFORF84IHwKLSAgICAgICAgMHgwMSwgICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRpb24gTWV0aG9kOiBBMkRQX1NCQ19JRV9BTExPQ19NRF9MCi0gICAgMiwgICAvLyBNaW5pbXVtQml0cG9vbCBWYWx1ZTogQTJEUF9TQkNfSUVfTUlOX0JJVFBPT0wKLSAgICA1MywgIC8vIE1heGltdW0gQml0cG9vbCBWYWx1ZTogQTJEUF9TQkNfTUFYX0JJVFBPT0wKLSAgICA3LCAgIC8vIEZha2UKLSAgICA4LCAgIC8vIEZha2UKLSAgICA5ICAgIC8vIEZha2UKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgY29kZWNfaW5mb19zYmNfc2lua19jYXBhYmlsaXR5W0FWRFRfQ09ERUNfU0laRV0gPSB7Ci0gICAgNiwgICAgICAgICAgICAgLy8gTGVuZ3RoIChBMkRQX1NCQ19JTkZPX0xFTikKLSAgICAwLCAgICAgICAgICAgICAvLyBNZWRpYSBUeXBlOiBBVkRUX01FRElBX1RZUEVfQVVESU8KLSAgICAwLCAgICAgICAgICAgICAvLyBNZWRpYSBDb2RlYyBUeXBlOiBBMkRQX01FRElBX0NUX1NCQwotICAgIDB4MjAgfCAweDEwIHwgIC8vIFNhbXBsZSBGcmVxdWVuY3k6IEEyRFBfU0JDX0lFX1NBTVBfRlJFUV80NCB8Ci0gICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfU0FNUF9GUkVRXzQ4IHwKLSAgICAgICAgMHgwOCB8IDB4MDQgfCAweDAyIHwgMHgwMSwgIC8vIENoYW5uZWwgTW9kZTogQTJEUF9TQkNfSUVfQ0hfTURfTU9OTyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX1NCQ19JRV9DSF9NRF9EVUFMIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEyRFBfU0JDX0lFX0NIX01EX1NURVJFTyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX1NCQ19JRV9DSF9NRF9KT0lOVAotICAgIDB4ODAgfCAweDQwIHwgMHgyMCB8IDB4MTAgfCAgICAgLy8gQmxvY2sgTGVuZ3RoOiBBMkRQX1NCQ19JRV9CTE9DS1NfNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX1NCQ19JRV9CTE9DS1NfOCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX1NCQ19JRV9CTE9DS1NfMTIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfQkxPQ0tTXzE2IHwKLSAgICAgICAgMHgwOCB8IDB4MDQgfCAgICAgICAgICAgICAgIC8vIFN1YmJhbmRzOiBBMkRQX1NCQ19JRV9TVUJCQU5EXzQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfU1VCQkFORF84IHwKLSAgICAgICAgMHgwMiB8IDB4MDEsICAvLyBBbGxvY2F0aW9uIE1ldGhvZDogQTJEUF9TQkNfSUVfQUxMT0NfTURfUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9TQkNfSUVfQUxMT0NfTURfTAotICAgIDIsICAgICAgICAgICAgICAgIC8vIE1pbmltdW1CaXRwb29sIFZhbHVlOiBBMkRQX1NCQ19JRV9NSU5fQklUUE9PTAotICAgIDUzLCAgICAgICAgICAgICAgIC8vIE1heGltdW0gQml0cG9vbCBWYWx1ZTogQTJEUF9TQkNfTUFYX0JJVFBPT0wKLSAgICA3LCAgICAgICAgICAgICAgICAvLyBGYWtlCi0gICAgOCwgICAgICAgICAgICAgICAgLy8gRmFrZQotICAgIDkgICAgICAgICAgICAgICAgIC8vIEZha2UKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgY29kZWNfaW5mb19hYWNbQVZEVF9DT0RFQ19TSVpFXSA9IHsKLSAgICA4LCAgICAgICAgICAgLy8gTGVuZ3RoIChBMkRQX0FBQ19JTkZPX0xFTikKLSAgICAwLCAgICAgICAgICAgLy8gTWVkaWEgVHlwZTogQVZEVF9NRURJQV9UWVBFX0FVRElPCi0gICAgMiwgICAgICAgICAgIC8vIE1lZGlhIENvZGVjIFR5cGU6IEEyRFBfTUVESUFfQ1RfQUFDCi0gICAgMHg4MCwgICAgICAgIC8vIE9iamVjdCBUeXBlOiBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQwotICAgIDB4MDEsICAgICAgICAvLyBTYW1wbGluZyBGcmVxdWVuY3k6IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDQxMDAKLSAgICAweDA0LCAgICAgICAgLy8gQ2hhbm5lbHM6IEEyRFBfQUFDX0NIQU5ORUxfTU9ERV9TVEVSRU8KLSAgICAweDAwIHwgMHg0LCAgLy8gVmFyaWFibGUgQml0IFJhdGU6Ci0gICAgICAgICAgICAgICAgIC8vIEEyRFBfQUFDX1ZBUklBQkxFX0JJVF9SQVRFX0RJU0FCTEVECi0gICAgICAgICAgICAgICAgIC8vIEJpdCBSYXRlOiAzMjAwMDAgPSAweDRlMjAwCi0gICAgMHhlMiwgICAgICAgIC8vIEJpdCBSYXRlOiAzMjAwMDAgPSAweDRlMjAwCi0gICAgMHgwMCwgICAgICAgIC8vIEJpdCBSYXRlOiAzMjAwMDAgPSAweDRlMjAwCi0gICAgNywgICAgICAgICAgIC8vIFVudXNlZAotICAgIDgsICAgICAgICAgICAvLyBVbnVzZWQKLSAgICA5ICAgICAgICAgICAgLy8gVW51c2VkCi19OwotCi1jb25zdCB1aW50OF90IGNvZGVjX2luZm9fYWFjX3ZicltBVkRUX0NPREVDX1NJWkVdID0gewotICAgIDgsICAgICAgICAgICAvLyBMZW5ndGggKEEyRFBfQUFDX0lORk9fTEVOKQotICAgIDAsICAgICAgICAgICAvLyBNZWRpYSBUeXBlOiBBVkRUX01FRElBX1RZUEVfQVVESU8KLSAgICAyLCAgICAgICAgICAgLy8gTWVkaWEgQ29kZWMgVHlwZTogQTJEUF9NRURJQV9DVF9BQUMKLSAgICAweDgwLCAgICAgICAgLy8gT2JqZWN0IFR5cGU6IEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUcyX0xDCi0gICAgMHgwMSwgICAgICAgIC8vIFNhbXBsaW5nIEZyZXF1ZW5jeTogQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMAotICAgIDB4MDQsICAgICAgICAvLyBDaGFubmVsczogQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTwotICAgIDB4ODAgfCAweDQsICAvLyBWYXJpYWJsZSBCaXQgUmF0ZToKLSAgICAgICAgICAgICAgICAgLy8gQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRU5BQkxFRAotICAgICAgICAgICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4ZTIsICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4MDAsICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDcsICAgICAgICAgICAvLyBVbnVzZWQKLSAgICA4LCAgICAgICAgICAgLy8gVW51c2VkCi0gICAgOSAgICAgICAgICAgIC8vIFVudXNlZAotfTsKLQotY29uc3QgdWludDhfdCBjb2RlY19pbmZvX2FhY19jYXBhYmlsaXR5W0FWRFRfQ09ERUNfU0laRV0gPSB7Ci0gICAgOCwgICAgIC8vIExlbmd0aCAoQTJEUF9BQUNfSU5GT19MRU4pCi0gICAgMCwgICAgIC8vIE1lZGlhIFR5cGU6IEFWRFRfTUVESUFfVFlQRV9BVURJTwotICAgIDIsICAgICAvLyBNZWRpYSBDb2RlYyBUeXBlOiBBMkRQX01FRElBX0NUX0FBQwotICAgIDB4ODAsICAvLyBPYmplY3QgVHlwZTogQTJEUF9BQUNfT0JKRUNUX1RZUEVfTVBFRzJfTEMKLSAgICAweDAxLCAgLy8gU2FtcGxpbmcgRnJlcXVlbmN5OiBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzQ0MTAwCi0gICAgLy8gVE9ETzogQUFDIDQ4LjBrSHogc2FtcGxpbmcgcmF0ZSBzaG91bGQgYmUgYWRkZWQgYmFjayAtIHNlZSBiLzYyMzAxMzc2Ci0gICAgMHgwNCwgICAgICAgIC8vIENoYW5uZWxzOiBBMkRQX0FBQ19DSEFOTkVMX01PREVfU1RFUkVPCi0gICAgMHgwMCB8IDB4NCwgIC8vIFZhcmlhYmxlIEJpdCBSYXRlOgotICAgICAgICAgICAgICAgICAvLyBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9ESVNBQkxFRAotICAgICAgICAgICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4ZTIsICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4MDAsICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDcsICAgICAgICAgICAvLyBVbnVzZWQKLSAgICA4LCAgICAgICAgICAgLy8gVW51c2VkCi0gICAgOSAgICAgICAgICAgIC8vIFVudXNlZAotfTsKLQotY29uc3QgdWludDhfdCBjb2RlY19pbmZvX2FhY192YnJfY2FwYWJpbGl0eVtBVkRUX0NPREVDX1NJWkVdID0gewotICAgIDgsICAgICAvLyBMZW5ndGggKEEyRFBfQUFDX0lORk9fTEVOKQotICAgIDAsICAgICAvLyBNZWRpYSBUeXBlOiBBVkRUX01FRElBX1RZUEVfQVVESU8KLSAgICAyLCAgICAgLy8gTWVkaWEgQ29kZWMgVHlwZTogQTJEUF9NRURJQV9DVF9BQUMKLSAgICAweDgwLCAgLy8gT2JqZWN0IFR5cGU6IEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUcyX0xDCi0gICAgMHgwMSwgIC8vIFNhbXBsaW5nIEZyZXF1ZW5jeTogQTJEUF9BQUNfU0FNUExJTkdfRlJFUV80NDEwMAotICAgIC8vIFRPRE86IEFBQyA0OC4wa0h6IHNhbXBsaW5nIHJhdGUgc2hvdWxkIGJlIGFkZGVkIGJhY2sgLSBzZWUgYi82MjMwMTM3NgotICAgIDB4MDQsICAgICAgICAvLyBDaGFubmVsczogQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTwotICAgIDB4ODAgfCAweDQsICAvLyBWYXJpYWJsZSBCaXQgUmF0ZToKLSAgICAgICAgICAgICAgICAgLy8gQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfRU5BQkxFRAotICAgICAgICAgICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4ZTIsICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4MDAsICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDcsICAgICAgICAgICAvLyBVbnVzZWQKLSAgICA4LCAgICAgICAgICAgLy8gVW51c2VkCi0gICAgOSAgICAgICAgICAgIC8vIFVudXNlZAotfTsKLQotY29uc3QgdWludDhfdCBjb2RlY19pbmZvX2FhY19zaW5rX2NhcGFiaWxpdHlbQVZEVF9DT0RFQ19TSVpFXSA9IHsKLSAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIChBMkRQX0FBQ19JTkZPX0xFTikKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWEgVHlwZTogQVZEVF9NRURJQV9UWVBFX0FVRElPCi0gICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhIENvZGVjIFR5cGU6IEEyRFBfTUVESUFfQ1RfQUFDCi0gICAgMHg4MCB8IDB4NDAgfCAweDIwIHwgMHgxMCwgIC8vIE9iamVjdCBUeXBlOiBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHMl9MQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEyRFBfQUFDX09CSkVDVF9UWVBFX01QRUc0X0xUUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX0FBQ19PQkpFQ1RfVFlQRV9NUEVHNF9TQ0FMQUJMRQotICAgIDB4MDEsICAvLyBTYW1wbGluZyBGcmVxdWVuY3k6IEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDQxMDAKLSAgICAweDgwIHwgMHgyMCB8IDB4MTAgfCAweDA4IHwgMHgwNCwgIC8vIFNhbXBsaW5nIEZyZXF1ZW5jeToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEyRFBfQUFDX1NBTVBMSU5HX0ZSRVFfNDgwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9BQUNfU0FNUExJTkdfRlJFUV84ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX0FBQ19TQU1QTElOR19GUkVRXzk2MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYW5uZWxzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX01PTk8gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTJEUF9BQUNfQ0hBTk5FTF9NT0RFX1NURVJFTwotICAgIDB4ODAgfCAweDQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFibGUgQml0IFJhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMkRQX0FBQ19WQVJJQUJMRV9CSVRfUkFURV9FTkFCTEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQgUmF0ZTogMzIwMDAwID0gMHg0ZTIwMAotICAgIDB4ZTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0IFJhdGU6IDMyMDAwMCA9IDB4NGUyMDAKLSAgICAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpdCBSYXRlOiAzMjAwMDAgPSAweDRlMjAwCi0gICAgNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWtlCi0gICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWtlCi0gICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWtlCi19OwotCi1jb25zdCB1aW50OF90IGNvZGVjX2luZm9fbm9uX2EyZHBbQVZEVF9DT0RFQ19TSVpFXSA9IHsKLSAgICA4LCAgICAgICAgICAgICAgLy8gTGVuZ3RoCi0gICAgMCwgICAgICAgICAgICAgIC8vIE1lZGlhIFR5cGU6IEFWRFRfTUVESUFfVFlQRV9BVURJTwotICAgIDB4RkYsICAgICAgICAgICAvLyBNZWRpYSBDb2RlYyBUeXBlOiBBMkRQX01FRElBX0NUX05PTl9BMkRQCi0gICAgMywgICAgNCwgMCwgMCwgIC8vIFZlbmRvciBJRDogTFNCIGZpcnN0LCB1cHBlciB0d28gb2N0ZXRzIHNob3VsZCBiZSAwCi0gICAgNywgICAgOCwgICAgICAgIC8vIENvZGVjIElEOiBMU0IgZmlyc3QKLSAgICA5ICAgICAgICAgICAgICAgLy8gRmFrZQotfTsKLQotY29uc3QgdWludDhfdCBjb2RlY19pbmZvX25vbl9hMmRwX2Zha2VbQVZEVF9DT0RFQ19TSVpFXSA9IHsKLSAgICA4LCAgICAgICAgICAgICAgLy8gTGVuZ3RoCi0gICAgMCwgICAgICAgICAgICAgIC8vIE1lZGlhIFR5cGU6IEFWRFRfTUVESUFfVFlQRV9BVURJTwotICAgIDB4RkYsICAgICAgICAgICAvLyBNZWRpYSBDb2RlYyBUeXBlOiBBMkRQX01FRElBX0NUX05PTl9BMkRQCi0gICAgMywgICAgNCwgMCwgMCwgIC8vIFZlbmRvciBJRDogTFNCIGZpcnN0LCB1cHBlciB0d28gb2N0ZXRzIHNob3VsZCBiZSAwCi0gICAgNywgICAgOCwgICAgICAgIC8vIENvZGVjIElEOiBMU0IgZmlyc3QKLSAgICAxMCAgICAgICAgICAgICAgLy8gVW51c2VkCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciogQVBUWF9FTkNPREVSX0xJQl9OQU1FID0gImxpYmFwdFhfZW5jb2Rlci5zbyI7Ci1zdGF0aWMgY29uc3QgY2hhciogQVBUWF9IRF9FTkNPREVSX0xJQl9OQU1FID0gImxpYmFwdFhIRF9lbmNvZGVyLnNvIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBMREFDX0VOQ09ERVJfTElCX05BTUUgPSAibGlibGRhY0JUX2VuYy5zbyI7Ci1zdGF0aWMgY29uc3QgY2hhciogTERBQ19ERUNPREVSX0xJQl9OQU1FID0gImxpYmxkYWNCVF9kZWMuc28iOwotCi1zdGF0aWMgYm9vbCBoYXNfc2hhcmVkX2xpYnJhcnkoY29uc3QgY2hhciogbmFtZSkgewotICB2b2lkKiBsaWJfaGFuZGxlID0gZGxvcGVuKG5hbWUsIFJUTERfTk9XKTsKLSAgaWYgKGxpYl9oYW5kbGUgIT0gbnVsbHB0cikgewotICAgIGRsY2xvc2UobGliX2hhbmRsZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotY2xhc3MgU3RhY2tBMmRwVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgU3RhY2tBMmRwVGVzdCgpIHsKLSAgICAvLyBDcmVhdGUgdGhlIHNldCB3aXRoIGFsbCBzdXBwb3J0ZWQgY29kZWNzCi0gICAgZm9yIChpbnQgaSA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NSU47IGkgPCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOwotICAgICAgICAgaSsrKSB7Ci0gICAgICBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3Q+KGkpOwotCi0gICAgICBib29sIHN1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgc3dpdGNoIChjb2RlY19pbmRleCkgewotICAgICAgICBjYXNlIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDOgotICAgICAgICAgIHN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUM6Ci0gICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFg6Ci0gICAgICAgICAgLy8gQ29kZWMgYXB0WCBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgZGV2aWNlIGhhcyB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICAgIC8vIHNoYXJlZCBsaWJyYXJ5IGluc3RhbGxlZC4KLSAgICAgICAgICBzdXBwb3J0ZWQgPSBoYXNfc2hhcmVkX2xpYnJhcnkoQVBUWF9FTkNPREVSX0xJQl9OQU1FKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FQVFhfSEQ6Ci0gICAgICAgICAgLy8gQ29kZWMgYXB0WC1IRCBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgZGV2aWNlIGhhcyB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICAgIC8vIHNoYXJlZCBsaWJyYXJ5IGluc3RhbGxlZC4KLSAgICAgICAgICBzdXBwb3J0ZWQgPSBoYXNfc2hhcmVkX2xpYnJhcnkoQVBUWF9IRF9FTkNPREVSX0xJQl9OQU1FKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUM6Ci0gICAgICAgICAgLy8gQ29kZWMgTERBQyBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgZGV2aWNlIGhhcyB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICAgIC8vIHNoYXJlZCBsaWJyYXJ5IGluc3RhbGxlZC4KLSAgICAgICAgICBzdXBwb3J0ZWQgPSBoYXNfc2hhcmVkX2xpYnJhcnkoTERBQ19FTkNPREVSX0xJQl9OQU1FKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkM6Ci0gICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUM6Ci0gICAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19MREFDOgotICAgICAgICAgIC8vIENvZGVjIExEQUMgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIGRldmljZSBoYXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAvLyBzaGFyZWQgbGlicmFyeSBpbnN0YWxsZWQuCi0gICAgICAgICAgc3VwcG9ydGVkID0gaGFzX3NoYXJlZF9saWJyYXJ5KExEQUNfREVDT0RFUl9MSUJfTkFNRSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDoKLSAgICAgICAgICAvLyBOZWVkZWQgdG8gYXZvaWQgdXNpbmcgImRlZmF1bHQ6IiBjYXNlIHNvIHdlIGNhbiBjYXB0dXJlIHdoZW4KLSAgICAgICAgICAvLyBhIG5ldyBjb2RlYyBpcyBhZGRlZCwgYW5kIGl0IGNhbiBiZSBpbmNsdWRlZCBoZXJlLgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAoc3VwcG9ydGVkKSB7Ci0gICAgICAgIHN1cHBvcnRlZF9jb2RlY3NfLmluc2VydChjb2RlY19pbmRleCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBoYXNfY29kZWNfc3VwcG9ydChidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCkgewotICAgIHJldHVybiBzdXBwb3J0ZWRfY29kZWNzXy5maW5kKGNvZGVjX2luZGV4KSAhPSBzdXBwb3J0ZWRfY29kZWNzXy5lbmQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzZXQ8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3Q+IHN1cHBvcnRlZF9jb2RlY3NfOwotfTsKLQotY2xhc3MgQTJkcENvZGVjQ29uZmlnVGVzdCA6IHB1YmxpYyBTdGFja0EyZHBUZXN0IHt9OwotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2JpdHNfc2V0KSB7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQml0c1NldCgweDApID09IEEyRFBfU0VUX1pFUk9fQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4MSkgPT0gQTJEUF9TRVRfT05FX0JJVCk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQml0c1NldCgweDIpID09IEEyRFBfU0VUX09ORV9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHgzKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHg3ZikgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4ODApID09IEEyRFBfU0VUX09ORV9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHg4MSkgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4YzApID09IEEyRFBfU0VUX01VTFRMX0JJVCk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQml0c1NldCgweGZmKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHg4MDAwKSA9PSBBMkRQX1NFVF9PTkVfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4ODAwMSkgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4YzAwMCkgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4ZmZmZikgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4ODAwMDApID09IEEyRFBfU0VUX09ORV9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHg4MDAwMSkgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4YzAwMDApID09IEEyRFBfU0VUX01VTFRMX0JJVCk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQml0c1NldCgweGZmZmZmKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHg4MDAwMDAwMCkgPT0gQTJEUF9TRVRfT05FX0JJVCk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQml0c1NldCgweDgwMDAwMDAxKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHhjMDAwMDAwMCkgPT0gQTJEUF9TRVRfTVVMVExfQklUKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9CaXRzU2V0KDB4ZmZmZmZmZmYpID09IEEyRFBfU0VUX01VTFRMX0JJVCk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQml0c1NldCgweDgwMDAwMDAwMDAwMDAwMDApID09IEEyRFBfU0VUX09ORV9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHg4MDAwMDAwMDAwMDAwMDAxKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHhjMDAwMDAwMDAwMDAwMDAwKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotICBFWFBFQ1RfVFJVRShBMkRQX0JpdHNTZXQoMHhmZmZmZmZmZmZmZmZmZmZmKSA9PSBBMkRQX1NFVF9NVUxUTF9CSVQpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2lzX2NvZGVjX3ZhbGlkX3NiYykgewotICBFWFBFQ1RfVFJVRShBMkRQX0lzU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiYykpOwotICBFWFBFQ1RfVFJVRShBMkRQX0lzU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19jYXBhYmlsaXR5KSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfSXNQZWVyU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiYykpOwotICBFWFBFQ1RfVFJVRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19zYmNfY2FwYWJpbGl0eSkpOwotCi0gIEVYUEVDVF9UUlVFKEEyRFBfSXNTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19zaW5rX2NhcGFiaWxpdHkpKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19zaW5rX2NhcGFiaWxpdHkpKTsKLQotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19ub25fYTJkcCkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1NpbmtDb2RlY1ZhbGlkKGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNQZWVyU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX25vbl9hMmRwKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzUGVlclNpbmtDb2RlY1ZhbGlkKGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLQotICAvLyBUZXN0IHdpdGggaW52YWxpZCBTQkMgY29kZWNzCi0gIHVpbnQ4X3QgY29kZWNfaW5mb19zYmNfaW52YWxpZFtBVkRUX0NPREVDX1NJWkVdOwotICBtZW1zZXQoY29kZWNfaW5mb19zYmNfaW52YWxpZCwgMCwgc2l6ZW9mKGNvZGVjX2luZm9fc2JjX2ludmFsaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fc2JjX2ludmFsaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19pbnZhbGlkKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19zYmNfaW52YWxpZCkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19pbnZhbGlkKSk7Ci0KLSAgbWVtY3B5KGNvZGVjX2luZm9fc2JjX2ludmFsaWQsIGNvZGVjX2luZm9fc2JjLCBzaXplb2YoY29kZWNfaW5mb19zYmMpKTsKLSAgY29kZWNfaW5mb19zYmNfaW52YWxpZFswXSA9IDA7ICAvLyBDb3JydXB0IHRoZSBMZW5ndGggZmllbGQKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fc2JjX2ludmFsaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19pbnZhbGlkKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19zYmNfaW52YWxpZCkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19pbnZhbGlkKSk7Ci0KLSAgbWVtY3B5KGNvZGVjX2luZm9fc2JjX2ludmFsaWQsIGNvZGVjX2luZm9fc2JjLCBzaXplb2YoY29kZWNfaW5mb19zYmMpKTsKLSAgY29kZWNfaW5mb19zYmNfaW52YWxpZFsxXSA9IDB4ZmY7ICAvLyBDb3JydXB0IHRoZSBNZWRpYSBUeXBlIGZpZWxkCi0gIEVYUEVDVF9GQUxTRShBMkRQX0lzU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX3NiY19pbnZhbGlkKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mb19zYmNfaW52YWxpZCkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fc2JjX2ludmFsaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mb19zYmNfaW52YWxpZCkpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2lzX2NvZGVjX3ZhbGlkX2FhYykgewotICBBU1NFUlRfVFJVRShBMkRQX0lzU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX2FhY192YnIpKTsKLSAgQVNTRVJUX1RSVUUoQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfdmJyX2NhcGFiaWxpdHkpKTsKLSAgQVNTRVJUX1RSVUUoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fYWFjX3ZicikpOwotICBBU1NFUlRfVFJVRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfdmJyX2NhcGFiaWxpdHkpKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19hYWMpKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1NvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfY2FwYWJpbGl0eSkpOwotICBFWFBFQ1RfVFJVRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19hYWMpKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fYWFjX2NhcGFiaWxpdHkpKTsKLQotICBFWFBFQ1RfVFJVRShBMkRQX0lzU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfc2lua19jYXBhYmlsaXR5KSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfc2lua19jYXBhYmlsaXR5KSk7Ci0KLSAgLy8gVGVzdCB3aXRoIGludmFsaWQgQUFDIGNvZGVjcwotICB1aW50OF90IGNvZGVjX2luZm9fYWFjX2ludmFsaWRbQVZEVF9DT0RFQ19TSVpFXTsKLSAgbWVtY3B5KGNvZGVjX2luZm9fYWFjX2ludmFsaWQsIGNvZGVjX2luZm9fYWFjLCBzaXplb2YoY29kZWNfaW5mb19hYWMpKTsKLSAgY29kZWNfaW5mb19hYWNfaW52YWxpZFswXSA9IDA7ICAvLyBDb3JydXB0IHRoZSBMZW5ndGggZmllbGQKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fYWFjX2ludmFsaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX2FhY19pbnZhbGlkKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfaW52YWxpZCkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb2RlY19pbmZvX2FhY19pbnZhbGlkKSk7Ci0KLSAgbWVtY3B5KGNvZGVjX2luZm9fYWFjX2ludmFsaWQsIGNvZGVjX2luZm9fYWFjLCBzaXplb2YoY29kZWNfaW5mb19hYWMpKTsKLSAgY29kZWNfaW5mb19hYWNfaW52YWxpZFsxXSA9IDB4ZmY7ICAvLyBDb3JydXB0IHRoZSBNZWRpYSBUeXBlIGZpZWxkCi0gIEVYUEVDVF9GQUxTRShBMkRQX0lzU291cmNlQ29kZWNWYWxpZChjb2RlY19pbmZvX2FhY19pbnZhbGlkKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfaW52YWxpZCkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKGNvZGVjX2luZm9fYWFjX2ludmFsaWQpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNQZWVyU2lua0NvZGVjVmFsaWQoY29kZWNfaW5mb19hYWNfaW52YWxpZCkpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2dldF9jb2RlY190eXBlKSB7Ci0gIHRBMkRQX0NPREVDX1RZUEUgY29kZWNfdHlwZSA9IEEyRFBfR2V0Q29kZWNUeXBlKGNvZGVjX2luZm9fc2JjKTsKLSAgRVhQRUNUX0VRKGNvZGVjX3R5cGUsIEEyRFBfTUVESUFfQ1RfU0JDKTsKLQotICBjb2RlY190eXBlID0gQTJEUF9HZXRDb2RlY1R5cGUoY29kZWNfaW5mb19hYWMpOwotICBFWFBFQ1RfRVEoY29kZWNfdHlwZSwgQTJEUF9NRURJQV9DVF9BQUMpOwotCi0gIGNvZGVjX3R5cGUgPSBBMkRQX0dldENvZGVjVHlwZShjb2RlY19pbmZvX25vbl9hMmRwKTsKLSAgRVhQRUNUX0VRKGNvZGVjX3R5cGUsIEEyRFBfTUVESUFfQ1RfTk9OX0EyRFApOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2lzX3NpbmtfY29kZWNfc3VwcG9ydGVkKSB7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfSXNTaW5rQ29kZWNTdXBwb3J0ZWQoY29kZWNfaW5mb19zYmMpKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfSXNTaW5rQ29kZWNTdXBwb3J0ZWQoY29kZWNfaW5mb19zYmNfY2FwYWJpbGl0eSkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Jc1NpbmtDb2RlY1N1cHBvcnRlZChjb2RlY19pbmZvX3NiY19zaW5rX2NhcGFiaWxpdHkpKTsKLQotICBFWFBFQ1RfVFJVRShBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fYWFjKSk7Ci0gIC8vIE5PVEU6IFRoZSB0ZXN0IGJlbG93IHNob3VsZCBiZSBFWFBFQ1RfRkFMU0UuCi0gIC8vIEhvd2V2ZXIsIGNvZGVjX2luZm9fYWFjX2NhcGFiaWxpdHkgaXMgcHJhY3RpY2FsbHkgc2FtZSBhcyBjb2RlY19pbmZvX2FhYywKLSAgLy8gdGhlcmVmb3JlIHdlIGNhbm5vdCBkaWZmZXJlbnRpYXRlIGl0IGFzIGEgY2FwYWJpbGl0eS4KLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1NpbmtDb2RlY1N1cHBvcnRlZChjb2RlY19pbmZvX2FhY19jYXBhYmlsaXR5KSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSkpOwotCi0gIEVYUEVDVF9GQUxTRShBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9pc19wZWVyX3NvdXJjZV9jb2RlY19zdXBwb3J0ZWQpIHsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZChjb2RlY19pbmZvX3NiYykpOwotICBFWFBFQ1RfVFJVRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHkpKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZChjb2RlY19pbmZvX3NiY19zaW5rX2NhcGFiaWxpdHkpKTsKLQotICBFWFBFQ1RfVFJVRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fYWFjKSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfSXNQZWVyU291cmNlQ29kZWNTdXBwb3J0ZWQoY29kZWNfaW5mb19hYWNfY2FwYWJpbGl0eSkpOwotICBFWFBFQ1RfVFJVRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSkpOwotCi0gIEVYUEVDVF9GQUxTRShBMkRQX0lzUGVlclNvdXJjZUNvZGVjU3VwcG9ydGVkKGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfaW5pdF9kZWZhdWx0X2NvZGVjKSB7Ci0gIHVpbnQ4X3QgY29kZWNfaW5mb19yZXN1bHRbQVZEVF9DT0RFQ19TSVpFXTsKLQotICBtZW1zZXQoY29kZWNfaW5mb19yZXN1bHQsIDAsIHNpemVvZihjb2RlY19pbmZvX3Jlc3VsdCkpOwotICBBMkRQX0luaXREZWZhdWx0Q29kZWMoY29kZWNfaW5mb19yZXN1bHQpOwotCi0gIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBjb2RlYyB3aXRoIHRoZSBsb2NhbCB0ZXN0IGNvZGVjIGluZm8KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX3NiY1swXSArIDE7IGkrKykgewotICAgIEVYUEVDVF9FUShjb2RlY19pbmZvX3Jlc3VsdFtpXSwgY29kZWNfaW5mb19zYmNbaV0pOwotICB9Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfdXNlc19ydHBfaGVhZGVyKSB7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfVXNlc1J0cEhlYWRlcih0cnVlLCBjb2RlY19pbmZvX3NiYykpOwotICBFWFBFQ1RfVFJVRShBMkRQX1VzZXNSdHBIZWFkZXIoZmFsc2UsIGNvZGVjX2luZm9fc2JjKSk7Ci0KLSAgRVhQRUNUX1RSVUUoQTJEUF9Vc2VzUnRwSGVhZGVyKHRydWUsIGNvZGVjX2luZm9fYWFjKSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfVXNlc1J0cEhlYWRlcihmYWxzZSwgY29kZWNfaW5mb19hYWMpKTsKLQotICBFWFBFQ1RfVFJVRShBMkRQX1VzZXNSdHBIZWFkZXIodHJ1ZSwgY29kZWNfaW5mb19ub25fYTJkcCkpOwotICBFWFBFQ1RfVFJVRShBMkRQX1VzZXNSdHBIZWFkZXIoZmFsc2UsIGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfbWVkaWFfdHlwZSkgewotICB1aW50OF90IGNvZGVjX2luZm9fdGVzdFtBVkRUX0NPREVDX1NJWkVdOwotCi0gIEVYUEVDVF9FUShBMkRQX0dldE1lZGlhVHlwZShjb2RlY19pbmZvX3NiYyksIEFWRFRfTUVESUFfVFlQRV9BVURJTyk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1lZGlhVHlwZShjb2RlY19pbmZvX2FhYyksIEFWRFRfTUVESUFfVFlQRV9BVURJTyk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1lZGlhVHlwZShjb2RlY19pbmZvX25vbl9hMmRwKSwgQVZEVF9NRURJQV9UWVBFX0FVRElPKTsKLQotICAvLyBQcmVwYXJlIGZha2UgY29kZWMgaW5mbyBmb3IgdmlkZW8gYW5kIGZvciBtdWx0aW1lZGlhCi0gIG1lbXNldChjb2RlY19pbmZvX3Rlc3QsIDAsIHNpemVvZihjb2RlY19pbmZvX3Rlc3QpKTsKLSAgY29kZWNfaW5mb190ZXN0WzBdID0gc2l6ZW9mKGNvZGVjX2luZm9fdGVzdCk7Ci0gIGNvZGVjX2luZm9fdGVzdFsxXSA9IDB4MDEgPDwgNDsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TWVkaWFUeXBlKGNvZGVjX2luZm9fdGVzdCksIEFWRFRfTUVESUFfVFlQRV9WSURFTyk7Ci0gIGNvZGVjX2luZm9fdGVzdFsxXSA9IDB4MDIgPDwgNDsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TWVkaWFUeXBlKGNvZGVjX2luZm9fdGVzdCksIEFWRFRfTUVESUFfVFlQRV9NVUxUSSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfY29kZWNfbmFtZSkgewotICB1aW50OF90IGNvZGVjX2luZm9fdGVzdFtBVkRUX0NPREVDX1NJWkVdOwotCi0gIC8vIEV4cGxpY2l0IHRlc3RzIGZvciBrbm93biBjb2RlY3MKLSAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm9fc2JjKSwgIlNCQyIpOwotICBFWFBFQ1RfU1RSRVEoQTJEUF9Db2RlY05hbWUoY29kZWNfaW5mb19zYmNfY2FwYWJpbGl0eSksICJTQkMiKTsKLSAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm9fc2JjX3NpbmtfY2FwYWJpbGl0eSksICJTQkMiKTsKLSAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm9fYWFjKSwgIkFBQyIpOwotICBFWFBFQ1RfU1RSRVEoQTJEUF9Db2RlY05hbWUoY29kZWNfaW5mb19hYWNfY2FwYWJpbGl0eSksICJBQUMiKTsKLSAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSksICJBQUMiKTsKLSAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm9fbm9uX2EyZHApLCAiVU5LTk9XTiBWRU5ET1IgQ09ERUMiKTsKLQotICAvLyBUZXN0IGFsbCB1bmtub3duIGNvZGVjcwotICBtZW1jcHkoY29kZWNfaW5mb190ZXN0LCBjb2RlY19pbmZvX3NiYywgc2l6ZW9mKGNvZGVjX2luZm9fc2JjKSk7Ci0gIGZvciAodWludDhfdCBjb2RlY190eXBlID0gQTJEUF9NRURJQV9DVF9BQUMgKyAxOwotICAgICAgIGNvZGVjX3R5cGUgPCBBMkRQX01FRElBX0NUX05PTl9BMkRQOyBjb2RlY190eXBlKyspIHsKLSAgICBjb2RlY19pbmZvX3Rlc3RbMl0gPSBjb2RlY190eXBlOyAgLy8gVW5rbm93biBjb2RlYyB0eXBlCi0gICAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNOYW1lKGNvZGVjX2luZm9fdGVzdCksICJVTktOT1dOIENPREVDIik7Ci0gIH0KLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF92ZW5kb3IpIHsKLSAgRVhQRUNUX0VRKEEyRFBfVmVuZG9yQ29kZWNHZXRWZW5kb3JJZChjb2RlY19pbmZvX25vbl9hMmRwKSwKLSAgICAgICAgICAgICh1aW50MzJfdCkweDAwMDAwNDAzKTsKLSAgRVhQRUNUX0VRKEEyRFBfVmVuZG9yQ29kZWNHZXRDb2RlY0lkKGNvZGVjX2luZm9fbm9uX2EyZHApLCAodWludDE2X3QpMHgwODA3KTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9WZW5kb3JVc2VzUnRwSGVhZGVyKHRydWUsIGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9WZW5kb3JVc2VzUnRwSGVhZGVyKGZhbHNlLCBjb2RlY19pbmZvX25vbl9hMmRwKSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfY29kZWNfdHlwZV9lcXVhbHMpIHsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Db2RlY1R5cGVFcXVhbHMoY29kZWNfaW5mb19zYmMsIGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHkpKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBBMkRQX0NvZGVjVHlwZUVxdWFscyhjb2RlY19pbmZvX3NiYywgY29kZWNfaW5mb19zYmNfc2lua19jYXBhYmlsaXR5KSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQ29kZWNUeXBlRXF1YWxzKGNvZGVjX2luZm9fYWFjLCBjb2RlY19pbmZvX2FhY19jYXBhYmlsaXR5KSk7Ci0gIEVYUEVDVF9UUlVFKAotICAgICAgQTJEUF9Db2RlY1R5cGVFcXVhbHMoY29kZWNfaW5mb19hYWMsIGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSkpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIEEyRFBfQ29kZWNUeXBlRXF1YWxzKGNvZGVjX2luZm9fbm9uX2EyZHAsIGNvZGVjX2luZm9fbm9uX2EyZHBfZmFrZSkpOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Db2RlY1R5cGVFcXVhbHMoY29kZWNfaW5mb19zYmMsIGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfQ29kZWNUeXBlRXF1YWxzKGNvZGVjX2luZm9fYWFjLCBjb2RlY19pbmZvX25vbl9hMmRwKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0NvZGVjVHlwZUVxdWFscyhjb2RlY19pbmZvX3NiYywgY29kZWNfaW5mb19hYWMpKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9jb2RlY19lcXVhbHMpIHsKLSAgdWludDhfdCBjb2RlY19pbmZvX3NiY190ZXN0W0FWRFRfQ09ERUNfU0laRV07Ci0gIHVpbnQ4X3QgY29kZWNfaW5mb19hYWNfdGVzdFtBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IGNvZGVjX2luZm9fbm9uX2EyZHBfdGVzdFtBVkRUX0NPREVDX1NJWkVdOwotCi0gIC8vIFRlc3QgdHdvIGlkZW50aWNhbCBTQkMgY29kZWNzCi0gIG1lbXNldChjb2RlY19pbmZvX3NiY190ZXN0LCAweEFCLCBzaXplb2YoY29kZWNfaW5mb19zYmNfdGVzdCkpOwotICBtZW1jcHkoY29kZWNfaW5mb19zYmNfdGVzdCwgY29kZWNfaW5mb19zYmMsIHNpemVvZihjb2RlY19pbmZvX3NiYykpOwotICBFWFBFQ1RfVFJVRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fc2JjLCBjb2RlY19pbmZvX3NiY190ZXN0KSk7Ci0KLSAgLy8gVGVzdCB0d28gaWRlbnRpY2FsIEFBQyBjb2RlY3MKLSAgbWVtc2V0KGNvZGVjX2luZm9fYWFjX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX2FhY190ZXN0KSk7Ci0gIG1lbWNweShjb2RlY19pbmZvX2FhY190ZXN0LCBjb2RlY19pbmZvX2FhYywgc2l6ZW9mKGNvZGVjX2luZm9fYWFjKSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQ29kZWNFcXVhbHMoY29kZWNfaW5mb19hYWMsIGNvZGVjX2luZm9fYWFjX3Rlc3QpKTsKLQotICAvLyBUZXN0IHR3byBpZGVudGljYWwgbm9uLUEyRFAgY29kZWNzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkCi0gIG1lbXNldChjb2RlY19pbmZvX25vbl9hMmRwX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX25vbl9hMmRwX3Rlc3QpKTsKLSAgbWVtY3B5KGNvZGVjX2luZm9fbm9uX2EyZHBfdGVzdCwgY29kZWNfaW5mb19ub25fYTJkcCwKLSAgICAgICAgIHNpemVvZihjb2RlY19pbmZvX25vbl9hMmRwKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fbm9uX2EyZHAsIGNvZGVjX2luZm9fbm9uX2EyZHBfdGVzdCkpOwotCi0gIC8vIFRlc3QgdHdvIGNvZGVjcyB0aGF0IGhhdmUgZGlmZmVyZW50IHR5cGVzCi0gIEVYUEVDVF9GQUxTRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fc2JjLCBjb2RlY19pbmZvX25vbl9hMmRwKSk7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fc2JjLCBjb2RlY19pbmZvX2FhYykpOwotCi0gIC8vIFRlc3QgdHdvIFNCQyBjb2RlY3MgdGhhdCBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50Ci0gIG1lbXNldChjb2RlY19pbmZvX3NiY190ZXN0LCAweEFCLCBzaXplb2YoY29kZWNfaW5mb19zYmNfdGVzdCkpOwotICBtZW1jcHkoY29kZWNfaW5mb19zYmNfdGVzdCwgY29kZWNfaW5mb19zYmMsIHNpemVvZihjb2RlY19pbmZvX3NiYykpOwotICBjb2RlY19pbmZvX3NiY190ZXN0WzVdID0gY29kZWNfaW5mb19zYmNbNV0gKyAxOwotICBFWFBFQ1RfRkFMU0UoQTJEUF9Db2RlY0VxdWFscyhjb2RlY19pbmZvX3NiYywgY29kZWNfaW5mb19zYmNfdGVzdCkpOwotICBjb2RlY19pbmZvX3NiY190ZXN0WzVdID0gY29kZWNfaW5mb19zYmNbNV07Ci0gIGNvZGVjX2luZm9fc2JjX3Rlc3RbNl0gPSBjb2RlY19pbmZvX3NiY1s2XSArIDE7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fc2JjLCBjb2RlY19pbmZvX3NiY190ZXN0KSk7Ci0KLSAgLy8gVGVzdCB0d28gQUFDIGNvZGVjcyB0aGF0IGFyZSBzbGlnaHRseSBkaWZmZXJlbnQKLSAgbWVtc2V0KGNvZGVjX2luZm9fYWFjX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX2FhY190ZXN0KSk7Ci0gIG1lbWNweShjb2RlY19pbmZvX2FhY190ZXN0LCBjb2RlY19pbmZvX2FhYywgc2l6ZW9mKGNvZGVjX2luZm9fYWFjKSk7Ci0gIGNvZGVjX2luZm9fYWFjX3Rlc3RbN10gPSBjb2RlY19pbmZvX2FhY1s3XSArIDE7Ci0gIEVYUEVDVF9GQUxTRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fYWFjLCBjb2RlY19pbmZvX2FhY190ZXN0KSk7Ci0gIGNvZGVjX2luZm9fYWFjX3Rlc3RbN10gPSBjb2RlY19pbmZvX2FhY1s3XTsKLSAgY29kZWNfaW5mb19hYWNfdGVzdFs4XSA9IGNvZGVjX2luZm9fYWFjWzhdICsgMTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfQ29kZWNFcXVhbHMoY29kZWNfaW5mb19hYWMsIGNvZGVjX2luZm9fYWFjX3Rlc3QpKTsKLQotICAvLyBUZXN0IHR3byBTQkMgY29kZWNzIHRoYXQgYXJlIGlkZW50aWNhbCwgYnV0IHdpdGggZGlmZmVyZW50IGZha2UKLSAgLy8gdHJhaWxlciBkYXRhLgotICBtZW1zZXQoY29kZWNfaW5mb19zYmNfdGVzdCwgMHhBQiwgc2l6ZW9mKGNvZGVjX2luZm9fc2JjX3Rlc3QpKTsKLSAgbWVtY3B5KGNvZGVjX2luZm9fc2JjX3Rlc3QsIGNvZGVjX2luZm9fc2JjLCBzaXplb2YoY29kZWNfaW5mb19zYmMpKTsKLSAgY29kZWNfaW5mb19zYmNfdGVzdFs3XSA9IGNvZGVjX2luZm9fc2JjWzddICsgMTsKLSAgRVhQRUNUX1RSVUUoQTJEUF9Db2RlY0VxdWFscyhjb2RlY19pbmZvX3NiYywgY29kZWNfaW5mb19zYmNfdGVzdCkpOwotCi0gIC8vIFRlc3QgdHdvIEFBQyBjb2RlY3MgdGhhdCBhcmUgaWRlbnRpY2FsLCBidXQgd2l0aCBkaWZmZXJlbnQgZmFrZQotICAvLyB0cmFpbGVyIGRhdGEuCi0gIG1lbXNldChjb2RlY19pbmZvX2FhY190ZXN0LCAweEFCLCBzaXplb2YoY29kZWNfaW5mb19hYWNfdGVzdCkpOwotICBtZW1jcHkoY29kZWNfaW5mb19hYWNfdGVzdCwgY29kZWNfaW5mb19hYWMsIHNpemVvZihjb2RlY19pbmZvX2FhYykpOwotICBjb2RlY19pbmZvX2FhY190ZXN0WzldID0gY29kZWNfaW5mb19hYWNbOV0gKyAxOwotICBFWFBFQ1RfVFJVRShBMkRQX0NvZGVjRXF1YWxzKGNvZGVjX2luZm9fYWFjLCBjb2RlY19pbmZvX2FhY190ZXN0KSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfZ2V0X3RyYWNrX3NhbXBsZV9yYXRlKSB7Ci0gIEVYUEVDVF9FUShBMkRQX0dldFRyYWNrU2FtcGxlUmF0ZShjb2RlY19pbmZvX3NiYyksIDQ0MTAwKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlKGNvZGVjX2luZm9fYWFjKSwgNDQxMDApOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRUcmFja1NhbXBsZVJhdGUoY29kZWNfaW5mb19ub25fYTJkcCksIC0xKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfdHJhY2tfY2hhbm5lbF9jb3VudCkgewotICBFWFBFQ1RfRVEoQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChjb2RlY19pbmZvX3NiYyksIDIpOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChjb2RlY19pbmZvX2FhYyksIDIpOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChjb2RlY19pbmZvX25vbl9hMmRwKSwgLTEpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2dldF9udW1iZXJfb2Zfc3ViYmFuZHNfc2JjKSB7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE51bWJlck9mU3ViYmFuZHNTYmMoY29kZWNfaW5mb19zYmMpLCA4KTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TnVtYmVyT2ZTdWJiYW5kc1NiYyhjb2RlY19pbmZvX2FhYyksIC0xKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TnVtYmVyT2ZTdWJiYW5kc1NiYyhjb2RlY19pbmZvX25vbl9hMmRwKSwgLTEpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2dldF9udW1iZXJfb2ZfYmxvY2tzX3NiYykgewotICBFWFBFQ1RfRVEoQTJEUF9HZXROdW1iZXJPZkJsb2Nrc1NiYyhjb2RlY19pbmZvX3NiYyksIDE2KTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TnVtYmVyT2ZCbG9ja3NTYmMoY29kZWNfaW5mb19hYWMpLCAtMSk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE51bWJlck9mQmxvY2tzU2JjKGNvZGVjX2luZm9fbm9uX2EyZHApLCAtMSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfZ2V0X2FsbG9jYXRpb25fbWV0aG9kX2NvZGVfc2JjKSB7Ci0gIEVYUEVDVF9FUShBMkRQX0dldEFsbG9jYXRpb25NZXRob2RDb2RlU2JjKGNvZGVjX2luZm9fc2JjKSwgMCk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldEFsbG9jYXRpb25NZXRob2RDb2RlU2JjKGNvZGVjX2luZm9fYWFjKSwgLTEpOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRBbGxvY2F0aW9uTWV0aG9kQ29kZVNiYyhjb2RlY19pbmZvX25vbl9hMmRwKSwgLTEpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2dldF9jaGFubmVsX21vZGVfY29kZV9zYmMpIHsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0Q2hhbm5lbE1vZGVDb2RlU2JjKGNvZGVjX2luZm9fc2JjKSwgMyk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldENoYW5uZWxNb2RlQ29kZVNiYyhjb2RlY19pbmZvX2FhYyksIC0xKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0Q2hhbm5lbE1vZGVDb2RlU2JjKGNvZGVjX2luZm9fbm9uX2EyZHApLCAtMSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfZ2V0X3NhbXBsaW5nX2ZyZXF1ZW5jeV9jb2RlX3NiYykgewotICBFWFBFQ1RfRVEoQTJEUF9HZXRTYW1wbGluZ0ZyZXF1ZW5jeUNvZGVTYmMoY29kZWNfaW5mb19zYmMpLCAyKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0U2FtcGxpbmdGcmVxdWVuY3lDb2RlU2JjKGNvZGVjX2luZm9fYWFjKSwgLTEpOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRTYW1wbGluZ0ZyZXF1ZW5jeUNvZGVTYmMoY29kZWNfaW5mb19ub25fYTJkcCksIC0xKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfbWluX2JpdHBvb2xfc2JjKSB7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1pbkJpdHBvb2xTYmMoY29kZWNfaW5mb19zYmMpLCAyKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TWluQml0cG9vbFNiYyhjb2RlY19pbmZvX3NiY19jYXBhYmlsaXR5KSwgMik7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1pbkJpdHBvb2xTYmMoY29kZWNfaW5mb19zYmNfc2lua19jYXBhYmlsaXR5KSwgMik7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1pbkJpdHBvb2xTYmMoY29kZWNfaW5mb19hYWMpLCAtMSk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1pbkJpdHBvb2xTYmMoY29kZWNfaW5mb19ub25fYTJkcCksIC0xKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfbWF4X2JpdHBvb2xfc2JjKSB7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1heEJpdHBvb2xTYmMoY29kZWNfaW5mb19zYmMpLCA1Myk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1heEJpdHBvb2xTYmMoY29kZWNfaW5mb19zYmNfY2FwYWJpbGl0eSksIDUzKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0TWF4Qml0cG9vbFNiYyhjb2RlY19pbmZvX3NiY19zaW5rX2NhcGFiaWxpdHkpLCA1Myk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1heEJpdHBvb2xTYmMoY29kZWNfaW5mb19hYWMpLCAtMSk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE1heEJpdHBvb2xTYmMoY29kZWNfaW5mb19ub25fYTJkcCksIC0xKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfc2lua190cmFja19jaGFubmVsX3R5cGUpIHsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGUoY29kZWNfaW5mb19zYmMpLCAzKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGUoY29kZWNfaW5mb19hYWMpLCAzKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0U2lua1RyYWNrQ2hhbm5lbFR5cGUoY29kZWNfaW5mb19ub25fYTJkcCksIC0xKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfb2JqZWN0X3R5cGVfY29kZV9hYWMpIHsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0T2JqZWN0VHlwZUNvZGVBYWMoY29kZWNfaW5mb19zYmMpLCAtMSk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE9iamVjdFR5cGVDb2RlQWFjKGNvZGVjX2luZm9fYWFjKSwgMHg4MCk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldE9iamVjdFR5cGVDb2RlQWFjKGNvZGVjX2luZm9fbm9uX2EyZHApLCAtMSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfZ2V0X2NoYW5uZWxfbW9kZV9jb2RlX2FhYykgewotICBFWFBFQ1RfRVEoQTJEUF9HZXRDaGFubmVsTW9kZUNvZGVBYWMoY29kZWNfaW5mb19zYmMpLCAtMSk7Ci0gIEVYUEVDVF9FUShBMkRQX0dldENoYW5uZWxNb2RlQ29kZUFhYyhjb2RlY19pbmZvX2FhYyksIDB4MDQpOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRDaGFubmVsTW9kZUNvZGVBYWMoY29kZWNfaW5mb19ub25fYTJkcCksIC0xKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9nZXRfdmFyaWFibGVfYml0X3JhdGVfc3VwcG9ydF9hYWMpIHsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0VmFyaWFibGVCaXRSYXRlU3VwcG9ydEFhYyhjb2RlY19pbmZvX3NiYyksIC0xKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0VmFyaWFibGVCaXRSYXRlU3VwcG9ydEFhYyhjb2RlY19pbmZvX2FhYyksIDApOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRWYXJpYWJsZUJpdFJhdGVTdXBwb3J0QWFjKGNvZGVjX2luZm9fbm9uX2EyZHApLCAtMSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfZ2V0X2JpdF9yYXRlX2FhYykgewotICBFWFBFQ1RfRVEoQTJEUF9HZXRCaXRSYXRlQWFjKGNvZGVjX2luZm9fc2JjKSwgLTEpOwotICBFWFBFQ1RfRVEoQTJEUF9HZXRCaXRSYXRlQWFjKGNvZGVjX2luZm9fYWFjKSwgMzIwMDAwKTsKLSAgRVhQRUNUX0VRKEEyRFBfR2V0Qml0UmF0ZUFhYyhjb2RlY19pbmZvX25vbl9hMmRwKSwgLTEpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2dldF9wYWNrZXRfdGltZXN0YW1wKSB7Ci0gIHVpbnQ4X3QgYTJkcF9kYXRhWzEwMDBdOwotICB1aW50MzJfdCB0aW1lc3RhbXA7Ci0gIHVpbnQzMl90KiBwX3RzID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGEyZHBfZGF0YSk7Ci0KLSAgbWVtc2V0KGEyZHBfZGF0YSwgMHhBQiwgc2l6ZW9mKGEyZHBfZGF0YSkpOwotICAqcF90cyA9IDB4MTIzNDU2Nzg7Ci0gIHRpbWVzdGFtcCA9IDB4RkZGRkZGRkY7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfR2V0UGFja2V0VGltZXN0YW1wKGNvZGVjX2luZm9fc2JjLCBhMmRwX2RhdGEsICZ0aW1lc3RhbXApKTsKLSAgRVhQRUNUX0VRKHRpbWVzdGFtcCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDB4MTIzNDU2NzgpKTsKLQotICBtZW1zZXQoYTJkcF9kYXRhLCAweEFCLCBzaXplb2YoYTJkcF9kYXRhKSk7Ci0gICpwX3RzID0gMHgxMjM0NTY3ODsKLSAgdGltZXN0YW1wID0gMHhGRkZGRkZGRjsKLSAgRVhQRUNUX1RSVUUoQTJEUF9HZXRQYWNrZXRUaW1lc3RhbXAoY29kZWNfaW5mb19hYWMsIGEyZHBfZGF0YSwgJnRpbWVzdGFtcCkpOwotICBFWFBFQ1RfRVEodGltZXN0YW1wLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oMHgxMjM0NTY3OCkpOwotCi0gIG1lbXNldChhMmRwX2RhdGEsIDB4QUIsIHNpemVvZihhMmRwX2RhdGEpKTsKLSAgKnBfdHMgPSAweDEyMzQ1Njc4OwotICB0aW1lc3RhbXAgPSAweEZGRkZGRkZGOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBBMkRQX0dldFBhY2tldFRpbWVzdGFtcChjb2RlY19pbmZvX25vbl9hMmRwLCBhMmRwX2RhdGEsICZ0aW1lc3RhbXApKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9idWlsZF9jb2RlY19oZWFkZXIpIHsKLSAgdWludDhfdCBhMmRwX2RhdGFbMTAwMF07Ci0gIEJUX0hEUiogcF9idWYgPSByZWludGVycHJldF9jYXN0PEJUX0hEUio+KGEyZHBfZGF0YSk7Ci0gIGNvbnN0IHVpbnQxNl90IEJUX0hEUl9MRU4gPSA1MDA7Ci0gIGNvbnN0IHVpbnQxNl90IEJUX0hEUl9PRkZTRVQgPSA1MDsKLSAgY29uc3QgdWludDhfdCBGUkFNRVNfUEVSX1BBQ0tFVCA9IDB4Q0Q7Ci0KLSAgbWVtc2V0KGEyZHBfZGF0YSwgMHhBQiwgc2l6ZW9mKGEyZHBfZGF0YSkpOwotICBwX2J1Zi0+bGVuID0gQlRfSERSX0xFTjsKLSAgcF9idWYtPm9mZnNldCA9IEJUX0hEUl9PRkZTRVQ7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQnVpbGRDb2RlY0hlYWRlcihjb2RlY19pbmZvX3NiYywgcF9idWYsIEZSQU1FU19QRVJfUEFDS0VUKSk7Ci0gIEVYUEVDVF9FUShwX2J1Zi0+b2Zmc2V0ICsgMSwKLSAgICAgICAgICAgIEJUX0hEUl9PRkZTRVQpOyAgICAgICAgICAgICAgIC8vIE1vZGlmaWVkIGJ5IEEyRFBfU0JDX01QTF9IRFJfTEVOCi0gIEVYUEVDVF9FUShwX2J1Zi0+bGVuIC0gMSwgQlRfSERSX0xFTik7ICAvLyBNb2RpZmllZCBieSBBMkRQX1NCQ19NUExfSERSX0xFTgotICBjb25zdCB1aW50OF90KiBwID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBfYnVmICsgMSkgKyBwX2J1Zi0+b2Zmc2V0OwotICBFWFBFQ1RfRVEoCi0gICAgICAqcCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oMHgwRCkpOyAgLy8gMHhDRCBtYXNrZWQgd2l0aCBBMkRQX1NCQ19IRFJfTlVNX01TSwotCi0gIG1lbXNldChhMmRwX2RhdGEsIDB4QUIsIHNpemVvZihhMmRwX2RhdGEpKTsKLSAgcF9idWYtPmxlbiA9IEJUX0hEUl9MRU47Ci0gIHBfYnVmLT5vZmZzZXQgPSBCVF9IRFJfT0ZGU0VUOwotICBFWFBFQ1RfVFJVRShBMkRQX0J1aWxkQ29kZWNIZWFkZXIoY29kZWNfaW5mb19hYWMsIHBfYnVmLCBGUkFNRVNfUEVSX1BBQ0tFVCkpOwotCi0gIG1lbXNldChhMmRwX2RhdGEsIDB4QUIsIHNpemVvZihhMmRwX2RhdGEpKTsKLSAgcF9idWYtPmxlbiA9IEJUX0hEUl9MRU47Ci0gIHBfYnVmLT5vZmZzZXQgPSBCVF9IRFJfT0ZGU0VUOwotICBFWFBFQ1RfRkFMU0UoCi0gICAgICBBMkRQX0J1aWxkQ29kZWNIZWFkZXIoY29kZWNfaW5mb19ub25fYTJkcCwgcF9idWYsIEZSQU1FU19QRVJfUEFDS0VUKSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfYWRqdXN0X2NvZGVjKSB7Ci0gIHVpbnQ4X3QgY29kZWNfaW5mb19zYmNfdGVzdFtBVkRUX0NPREVDX1NJWkVdOwotICB1aW50OF90IGNvZGVjX2luZm9fYWFjX3Rlc3RbQVZEVF9DT0RFQ19TSVpFXTsKLSAgdWludDhfdCBjb2RlY19pbmZvX25vbl9hMmRwX3Rlc3RbQVZEVF9DT0RFQ19TSVpFXTsKLQotICAvLyBUZXN0IHVwZGF0aW5nIGEgdmFsaWQgU0JDIGNvZGVjIHRoYXQgZG9lc24ndCBuZWVkIGFkanVzdG1lbnQKLSAgbWVtc2V0KGNvZGVjX2luZm9fc2JjX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX3NiY190ZXN0KSk7Ci0gIG1lbWNweShjb2RlY19pbmZvX3NiY190ZXN0LCBjb2RlY19pbmZvX3NiYywgc2l6ZW9mKGNvZGVjX2luZm9fc2JjKSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQWRqdXN0Q29kZWMoY29kZWNfaW5mb19zYmNfdGVzdCkpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIG1lbWNtcChjb2RlY19pbmZvX3NiY190ZXN0LCBjb2RlY19pbmZvX3NiYywgc2l6ZW9mKGNvZGVjX2luZm9fc2JjKSkgPT0gMCk7Ci0KLSAgLy8gVGVzdCB1cGRhdGluZyBhIHZhbGlkIFNCQyBjb2RlYyB0aGF0IG5lZWRzIGFkanVzdG1lbnQKLSAgbWVtc2V0KGNvZGVjX2luZm9fc2JjX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX3NiY190ZXN0KSk7Ci0gIG1lbWNweShjb2RlY19pbmZvX3NiY190ZXN0LCBjb2RlY19pbmZvX3NiYywgc2l6ZW9mKGNvZGVjX2luZm9fc2JjKSk7Ci0gIGNvZGVjX2luZm9fc2JjX3Rlc3RbNl0gPSA1NDsgIC8vIEEyRFBfU0JDX01BWF9CSVRQT09MICsgMQotICBFWFBFQ1RfVFJVRShBMkRQX0FkanVzdENvZGVjKGNvZGVjX2luZm9fc2JjX3Rlc3QpKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBtZW1jbXAoY29kZWNfaW5mb19zYmNfdGVzdCwgY29kZWNfaW5mb19zYmMsIHNpemVvZihjb2RlY19pbmZvX3NiYykpID09IDApOwotCi0gIC8vIFRlc3QgdXBkYXRpbmcgYW4gaW52YWxpZCBTQkMgY29kZWMKLSAgbWVtc2V0KGNvZGVjX2luZm9fc2JjX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX3NiY190ZXN0KSk7Ci0gIG1lbWNweShjb2RlY19pbmZvX3NiY190ZXN0LCBjb2RlY19pbmZvX3NiYywgc2l6ZW9mKGNvZGVjX2luZm9fc2JjKSk7Ci0gIGNvZGVjX2luZm9fc2JjX3Rlc3RbNl0gPSAyNTU7ICAvLyBJbnZhbGlkIE1BWF9CSVRQT09MCi0gIEVYUEVDVF9GQUxTRShBMkRQX0FkanVzdENvZGVjKGNvZGVjX2luZm9fc2JjX3Rlc3QpKTsKLQotICAvLyBUZXN0IHVwZGF0aW5nIGEgdmFsaWQgQUFDIGNvZGVjIHRoYXQgZG9lc24ndCBuZWVkIGFkanVzdG1lbnQKLSAgbWVtc2V0KGNvZGVjX2luZm9fYWFjX3Rlc3QsIDB4QUIsIHNpemVvZihjb2RlY19pbmZvX2FhY190ZXN0KSk7Ci0gIG1lbWNweShjb2RlY19pbmZvX2FhY190ZXN0LCBjb2RlY19pbmZvX2FhYywgc2l6ZW9mKGNvZGVjX2luZm9fYWFjKSk7Ci0gIEVYUEVDVF9UUlVFKEEyRFBfQWRqdXN0Q29kZWMoY29kZWNfaW5mb19hYWNfdGVzdCkpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIG1lbWNtcChjb2RlY19pbmZvX2FhY190ZXN0LCBjb2RlY19pbmZvX2FhYywgc2l6ZW9mKGNvZGVjX2luZm9fYWFjKSkgPT0gMCk7Ci0KLSAgLy8gVGVzdCB1cGRhdGluZyBhIG5vbi1BMkRQIGNvZGVjIHRoYXQgaXMgbm90IHJlY29nbml6ZWQKLSAgbWVtc2V0KGNvZGVjX2luZm9fbm9uX2EyZHBfdGVzdCwgMHhBQiwgc2l6ZW9mKGNvZGVjX2luZm9fbm9uX2EyZHBfdGVzdCkpOwotICBtZW1jcHkoY29kZWNfaW5mb19ub25fYTJkcF90ZXN0LCBjb2RlY19pbmZvX25vbl9hMmRwLAotICAgICAgICAgc2l6ZW9mKGNvZGVjX2luZm9fbm9uX2EyZHApKTsKLSAgRVhQRUNUX0ZBTFNFKEEyRFBfQWRqdXN0Q29kZWMoY29kZWNfaW5mb19ub25fYTJkcF90ZXN0KSk7Ci19Ci0KLVRFU1RfRihTdGFja0EyZHBUZXN0LCB0ZXN0X2EyZHBfc291cmNlX2NvZGVjX2luZGV4KSB7Ci0gIC8vIEV4cGxpY2l0IHRlc3RzIGZvciBrbm93biBTb3VyY2UgY29kZWNzCi0gIEVYUEVDVF9FUShBMkRQX1NvdXJjZUNvZGVjSW5kZXgoY29kZWNfaW5mb19zYmMpLAotICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkMpOwotICBFWFBFQ1RfRVEoQTJEUF9Tb3VyY2VDb2RlY0luZGV4KGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHkpLAotICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkMpOwotICBFWFBFQ1RfRVEoQTJEUF9Tb3VyY2VDb2RlY0luZGV4KGNvZGVjX2luZm9fc2JjX3NpbmtfY2FwYWJpbGl0eSksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX1NCQyk7Ci0gIEVYUEVDVF9FUShBMkRQX1NvdXJjZUNvZGVjSW5kZXgoY29kZWNfaW5mb19hYWMpLAotICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUMpOwotICBFWFBFQ1RfRVEoQTJEUF9Tb3VyY2VDb2RlY0luZGV4KGNvZGVjX2luZm9fYWFjX2NhcGFiaWxpdHkpLAotICAgICAgICAgICAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUMpOwotICBFWFBFQ1RfRVEoQTJEUF9Tb3VyY2VDb2RlY0luZGV4KGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0FBQyk7Ci0gIEVYUEVDVF9FUShBMkRQX1NvdXJjZUNvZGVjSW5kZXgoY29kZWNfaW5mb19ub25fYTJkcCksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKTsKLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9zaW5rX2NvZGVjX2luZGV4KSB7Ci0gIC8vIEV4cGxpY2l0IHRlc3RzIGZvciBrbm93biBTaW5rIGNvZGVjcwotICBFWFBFQ1RfRVEoQTJEUF9TaW5rQ29kZWNJbmRleChjb2RlY19pbmZvX3NiYyksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkMpOwotICBFWFBFQ1RfRVEoQTJEUF9TaW5rQ29kZWNJbmRleChjb2RlY19pbmZvX3NiY19jYXBhYmlsaXR5KSwKLSAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX1NCQyk7Ci0gIEVYUEVDVF9FUShBMkRQX1NpbmtDb2RlY0luZGV4KGNvZGVjX2luZm9fc2JjX3NpbmtfY2FwYWJpbGl0eSksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkMpOwotICBFWFBFQ1RfRVEoQTJEUF9TaW5rQ29kZWNJbmRleChjb2RlY19pbmZvX2FhYyksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUMpOwotICBFWFBFQ1RfRVEoQTJEUF9TaW5rQ29kZWNJbmRleChjb2RlY19pbmZvX2FhY19jYXBhYmlsaXR5KSwKLSAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX0FBQyk7Ci0gIEVYUEVDVF9FUShBMkRQX1NpbmtDb2RlY0luZGV4KGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSksCi0gICAgICAgICAgICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19BQUMpOwotICBFWFBFQ1RfRVEoQTJEUF9TaW5rQ29kZWNJbmRleChjb2RlY19pbmZvX25vbl9hMmRwKSwKLSAgICAgICAgICAgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVgpOwotfQotCi1URVNUX0YoU3RhY2tBMmRwVGVzdCwgdGVzdF9hMmRwX2NvZGVjX2luZGV4X3N0cikgewotICAvLyBFeHBsaWNpdCB0ZXN0cyBmb3Iga25vd24gY29kZWNzCi0gIEVYUEVDVF9TVFJFUShBMkRQX0NvZGVjSW5kZXhTdHIoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9TQkMpLCAiU0JDIik7Ci0gIEVYUEVDVF9TVFJFUShBMkRQX0NvZGVjSW5kZXhTdHIoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfU0JDKSwgIlNCQyBTSU5LIik7Ci0gIEVYUEVDVF9TVFJFUShBMkRQX0NvZGVjSW5kZXhTdHIoQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUMpLCAiQUFDIik7Ci0KLSAgLy8gVGVzdCB0aGF0IHRoZSB1bmtub3duIGNvZGVjIHN0cmluZyBoYXMgbm90IGNoYW5nZWQKLSAgRVhQRUNUX1NUUkVRKEEyRFBfQ29kZWNJbmRleFN0cihCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKSwKLSAgICAgICAgICAgICAgICJVTktOT1dOIENPREVDIElOREVYIik7Ci0KLSAgLy8gVGVzdCB0aGF0IGVhY2ggY29kZWMgaGFzIGEga25vd24gc3RyaW5nCi0gIGZvciAoaW50IGkgPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUlOOyBpIDwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsgaSsrKSB7Ci0gICAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXggPQotICAgICAgICBzdGF0aWNfY2FzdDxidGF2X2EyZHBfY29kZWNfaW5kZXhfdD4oaSk7Ci0gICAgRVhQRUNUX1NUUk5FKEEyRFBfQ29kZWNJbmRleFN0cihjb2RlY19pbmRleCksICJVTktOT1dOIENPREVDIElOREVYIik7Ci0gIH0KLX0KLQotVEVTVF9GKFN0YWNrQTJkcFRlc3QsIHRlc3RfYTJkcF9pbml0X2NvZGVjX2NvbmZpZykgewotICBBdmR0cFNlcENvbmZpZyBhdmR0X2NmZzsKLQotICAvLwotICAvLyBUZXN0IGZvciBTQkMgU291cmNlCi0gIC8vCi0gIG1lbXNldCgmYXZkdF9jZmcsIDAsIHNpemVvZihhdmR0X2NmZykpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIEEyRFBfSW5pdENvZGVjQ29uZmlnKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDLCAmYXZkdF9jZmcpKTsKLSAgLy8gQ29tcGFyZSB0aGUgcmVzdWx0IGNvZGVjIHdpdGggdGhlIGxvY2FsIHRlc3QgY29kZWMgaW5mbwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHlbMF0gKyAxOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoYXZkdF9jZmcuY29kZWNfaW5mb1tpXSwgY29kZWNfaW5mb19zYmNfY2FwYWJpbGl0eVtpXSk7Ci0gIH0KLS8vIFRlc3QgZm9yIGNvbnRlbnQgcHJvdGVjdGlvbgotI2lmIChCVEFfQVZfQ09fQ1BfU0NNU19UID09IFRSVUUpCi0gIEVYUEVDVF9FUShhdmR0X2NmZy5wcm90ZWN0X2luZm9bMF0sIEFWRFRfQ1BfTE9TQyk7Ci0gIEVYUEVDVF9FUShhdmR0X2NmZy5wcm90ZWN0X2luZm9bMV0sIChBVkRUX0NQX1NDTVNfVF9JRCAmIDB4RkYpKTsKLSAgRVhQRUNUX0VRKGF2ZHRfY2ZnLnByb3RlY3RfaW5mb1syXSwgKChBVkRUX0NQX1NDTVNfVF9JRCA+PiA4KSAmIDB4RkYpKTsKLSAgRVhQRUNUX0VRKGF2ZHRfY2ZnLm51bV9wcm90ZWN0LCAxKTsKLSNlbmRpZgotCi0gIC8vCi0gIC8vIFRlc3QgZm9yIFNCQyBTaW5rCi0gIC8vCi0gIG1lbXNldCgmYXZkdF9jZmcsIDAsIHNpemVvZihhdmR0X2NmZykpOwotICBFWFBFQ1RfVFJVRShBMkRQX0luaXRDb2RlY0NvbmZpZyhCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkMsICZhdmR0X2NmZykpOwotICAvLyBDb21wYXJlIHRoZSByZXN1bHQgY29kZWMgd2l0aCB0aGUgbG9jYWwgdGVzdCBjb2RlYyBpbmZvCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29kZWNfaW5mb19zYmNfc2lua19jYXBhYmlsaXR5WzBdICsgMTsgaSsrKSB7Ci0gICAgRVhQRUNUX0VRKGF2ZHRfY2ZnLmNvZGVjX2luZm9baV0sIGNvZGVjX2luZm9fc2JjX3NpbmtfY2FwYWJpbGl0eVtpXSk7Ci0gIH0KLQotICAvLwotICAvLyBUZXN0IGZvciBBQUMgU291cmNlCi0gIC8vCi0gIG1lbXNldCgmYXZkdF9jZmcsIDAsIHNpemVvZihhdmR0X2NmZykpOwotICBBU1NFUlRfVFJVRSgKLSAgICAgIEEyRFBfSW5pdENvZGVjQ29uZmlnKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDLCAmYXZkdF9jZmcpKTsKLSAgLy8gQ2hlY2sgdGhlIHZiciBtb2RlIHN0YXR1cy4KLSAgYm9vbCBhYWNfdmJyX21vZGVfZW5hYmxlZCA9Ci0gICAgICBhdmR0X2NmZy5jb2RlY19pbmZvWzZdICYgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfTUFTSzsKLSAgLy8gQ29tcGFyZSB0aGUgcmVzdWx0IGNvZGVjIHdpdGggdGhlIGxvY2FsIHRlc3QgY29kZWMgaW5mbwotICBpZiAoYWFjX3Zicl9tb2RlX2VuYWJsZWQpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjX2luZm9fYWFjX3Zicl9jYXBhYmlsaXR5WzBdICsgMTsgaSsrKSB7Ci0gICAgICBBU1NFUlRfRVEoYXZkdF9jZmcuY29kZWNfaW5mb1tpXSwgY29kZWNfaW5mb19hYWNfdmJyX2NhcGFiaWxpdHlbaV0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjX2luZm9fYWFjX2NhcGFiaWxpdHlbMF0gKyAxOyBpKyspIHsKLSAgICAgIEFTU0VSVF9FUShhdmR0X2NmZy5jb2RlY19pbmZvW2ldLCBjb2RlY19pbmZvX2FhY19jYXBhYmlsaXR5W2ldKTsKLSAgICB9Ci0gIH0KLQotLy8gVGVzdCBmb3IgY29udGVudCBwcm90ZWN0aW9uCi0jaWYgKEJUQV9BVl9DT19DUF9TQ01TX1QgPT0gVFJVRSkKLSAgRVhQRUNUX0VRKGF2ZHRfY2ZnLnByb3RlY3RfaW5mb1swXSwgQVZEVF9DUF9MT1NDKTsKLSAgRVhQRUNUX0VRKGF2ZHRfY2ZnLnByb3RlY3RfaW5mb1sxXSwgKEFWRFRfQ1BfU0NNU19UX0lEICYgMHhGRikpOwotICBFWFBFQ1RfRVEoYXZkdF9jZmcucHJvdGVjdF9pbmZvWzJdLCAoKEFWRFRfQ1BfU0NNU19UX0lEID4+IDgpICYgMHhGRikpOwotICBFWFBFQ1RfRVEoYXZkdF9jZmcubnVtX3Byb3RlY3QsIDEpOwotI2VuZGlmCi19Ci0KLVRFU1RfRihBMmRwQ29kZWNDb25maWdUZXN0LCBjcmVhdGVDb2RlYykgewotICBmb3IgKGludCBpID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX01JTjsgaSA8IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVg7IGkrKykgewotICAgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8YnRhdl9hMmRwX2NvZGVjX2luZGV4X3Q+KGkpOwotCi0gICAgLy8gSWdub3JlIGNvZGVjcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UKLSAgICBpZiAoIWhhc19jb2RlY19zdXBwb3J0KGNvZGVjX2luZGV4KSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgQTJkcENvZGVjQ29uZmlnKiBjb2RlY19jb25maWcgPSBBMmRwQ29kZWNDb25maWc6OmNyZWF0ZUNvZGVjKGNvZGVjX2luZGV4KTsKLSAgICBFWFBFQ1RfTkUoY29kZWNfY29uZmlnLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEoY29kZWNfY29uZmlnLT5jb2RlY0luZGV4KCksIGNvZGVjX2luZGV4KTsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWNfY29uZmlnLT5uYW1lKCkuZW1wdHkoKSk7Ci0gICAgRVhQRUNUX05FKGNvZGVjX2NvbmZpZy0+Y29kZWNQcmlvcml0eSgpLCBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfRElTQUJMRUQpOwotICAgIEVYUEVDVF9ORShjb2RlY19jb25maWctPmNvZGVjUHJpb3JpdHkoKSwgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0RFRkFVTFQpOwotICAgIGRlbGV0ZSBjb2RlY19jb25maWc7Ci0gIH0KLX0KLQotVEVTVF9GKEEyZHBDb2RlY0NvbmZpZ1Rlc3QsIHNldENvZGVjQ29uZmlnKSB7Ci0gIHVpbnQ4X3QgY29kZWNfaW5mb19yZXN1bHRbQVZEVF9DT0RFQ19TSVpFXTsKLSAgYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgcGVlcl9jb2RlY19pbmRleDsKLSAgQTJkcENvZGVjcyogYTJkcF9jb2RlY3MgPQotICAgICAgbmV3IEEyZHBDb2RlY3Moc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PigpKTsKLSAgQTJkcENvZGVjQ29uZmlnKiBjb2RlY19jb25maWc7Ci0KLSAgRVhQRUNUX1RSVUUoYTJkcF9jb2RlY3MtPmluaXQoKSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBjb2RlYyBjYXBhYmlsaXR5IC0gU0JDCi0gIG1lbXNldChjb2RlY19pbmZvX3Jlc3VsdCwgMCwgc2l6ZW9mKGNvZGVjX2luZm9fcmVzdWx0KSk7Ci0gIHBlZXJfY29kZWNfaW5kZXggPSBBMkRQX1NvdXJjZUNvZGVjSW5kZXgoY29kZWNfaW5mb19zYmNfc2lua19jYXBhYmlsaXR5KTsKLSAgRVhQRUNUX05FKHBlZXJfY29kZWNfaW5kZXgsIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVgpOwotICBjb2RlY19jb25maWcgPQotICAgICAgYTJkcF9jb2RlY3MtPmZpbmRTb3VyY2VDb2RlY0NvbmZpZyhjb2RlY19pbmZvX3NiY19zaW5rX2NhcGFiaWxpdHkpOwotICBFWFBFQ1RfTkUoY29kZWNfY29uZmlnLCBudWxscHRyKTsKLSAgRVhQRUNUX1RSVUUoYTJkcF9jb2RlY3MtPnNldENvZGVjQ29uZmlnKAotICAgICAgY29kZWNfaW5mb19zYmNfc2lua19jYXBhYmlsaXR5LCB0cnVlIC8qIGlzX2NhcGFiaWxpdHkgKi8sCi0gICAgICBjb2RlY19pbmZvX3Jlc3VsdCwgdHJ1ZSAvKiBzZWxlY3RfY3VycmVudF9jb2RlYyAqLykpOwotICBFWFBFQ1RfRVEoYTJkcF9jb2RlY3MtPmdldEN1cnJlbnRDb2RlY0NvbmZpZygpLCBjb2RlY19jb25maWcpOwotICAvLyBDb21wYXJlIHRoZSByZXN1bHQgY29kZWMgd2l0aCB0aGUgbG9jYWwgdGVzdCBjb2RlYyBpbmZvCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29kZWNfaW5mb19zYmNbMF0gKyAxOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoY29kZWNfaW5mb19yZXN1bHRbaV0sIGNvZGVjX2luZm9fc2JjW2ldKTsKLSAgfQotICBFWFBFQ1RfRVEoY29kZWNfY29uZmlnLT5nZXRBdWRpb0JpdHNQZXJTYW1wbGUoKSwgMTYpOwotCi0gIC8vIENyZWF0ZSB0aGUgY29kZWMgY29uZmlnIC0gU0JDCi0gIG1lbXNldChjb2RlY19pbmZvX3Jlc3VsdCwgMCwgc2l6ZW9mKGNvZGVjX2luZm9fcmVzdWx0KSk7Ci0gIHBlZXJfY29kZWNfaW5kZXggPSBBMkRQX1NvdXJjZUNvZGVjSW5kZXgoY29kZWNfaW5mb19zYmMpOwotICBFWFBFQ1RfTkUocGVlcl9jb2RlY19pbmRleCwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCk7Ci0gIGNvZGVjX2NvbmZpZyA9IGEyZHBfY29kZWNzLT5maW5kU291cmNlQ29kZWNDb25maWcoY29kZWNfaW5mb19zYmMpOwotICBFWFBFQ1RfTkUoY29kZWNfY29uZmlnLCBudWxscHRyKTsKLSAgRVhQRUNUX1RSVUUoYTJkcF9jb2RlY3MtPnNldENvZGVjQ29uZmlnKAotICAgICAgY29kZWNfaW5mb19zYmMsIGZhbHNlIC8qIGlzX2NhcGFiaWxpdHkgKi8sIGNvZGVjX2luZm9fcmVzdWx0LAotICAgICAgdHJ1ZSAvKiBzZWxlY3RfY3VycmVudF9jb2RlYyAqLykpOwotICBFWFBFQ1RfRVEoYTJkcF9jb2RlY3MtPmdldEN1cnJlbnRDb2RlY0NvbmZpZygpLCBjb2RlY19jb25maWcpOwotICAvLyBDb21wYXJlIHRoZSByZXN1bHQgY29kZWMgd2l0aCB0aGUgbG9jYWwgdGVzdCBjb2RlYyBpbmZvCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29kZWNfaW5mb19zYmNbMF0gKyAxOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoY29kZWNfaW5mb19yZXN1bHRbaV0sIGNvZGVjX2luZm9fc2JjW2ldKTsKLSAgfQotICBFWFBFQ1RfRkFMU0UoY29kZWNfY29uZmlnLT51c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBjb2RlYyBjb25maWcgLSBBQUMKLSAgbWVtc2V0KGNvZGVjX2luZm9fcmVzdWx0LCAwLCBzaXplb2YoY29kZWNfaW5mb19yZXN1bHQpKTsKLSAgcGVlcl9jb2RlY19pbmRleCA9IEEyRFBfU291cmNlQ29kZWNJbmRleChjb2RlY19pbmZvX2FhYyk7Ci0gIEVYUEVDVF9ORShwZWVyX2NvZGVjX2luZGV4LCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKTsKLSAgY29kZWNfY29uZmlnID0gYTJkcF9jb2RlY3MtPmZpbmRTb3VyY2VDb2RlY0NvbmZpZyhjb2RlY19pbmZvX2FhYyk7Ci0gIEVYUEVDVF9ORShjb2RlY19jb25maWcsIG51bGxwdHIpOwotICBFWFBFQ1RfVFJVRShhMmRwX2NvZGVjcy0+c2V0Q29kZWNDb25maWcoCi0gICAgICBjb2RlY19pbmZvX2FhYywgZmFsc2UgLyogaXNfY2FwYWJpbGl0eSAqLywgY29kZWNfaW5mb19yZXN1bHQsCi0gICAgICB0cnVlIC8qIHNlbGVjdF9jdXJyZW50X2NvZGVjICovKSk7Ci0gIEVYUEVDVF9FUShhMmRwX2NvZGVjcy0+Z2V0Q3VycmVudENvZGVjQ29uZmlnKCksIGNvZGVjX2NvbmZpZyk7Ci0gIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBjb2RlYyB3aXRoIHRoZSBsb2NhbCB0ZXN0IGNvZGVjIGluZm8KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX2FhY1swXSArIDE7IGkrKykgewotICAgIEVYUEVDVF9FUShjb2RlY19pbmZvX3Jlc3VsdFtpXSwgY29kZWNfaW5mb19hYWNbaV0pOwotICB9Ci0gIEVYUEVDVF9UUlVFKGNvZGVjX2NvbmZpZy0+dXNlUnRwSGVhZGVyTWFya2VyQml0KCkpOwotCi0gIC8vIENyZWF0ZSB0aGUgY29kZWMgY2FwYWJpbGl0eSAtIFNCQyBTaW5rCi0gIG1lbXNldChjb2RlY19pbmZvX3Jlc3VsdCwgMCwgc2l6ZW9mKGNvZGVjX2luZm9fcmVzdWx0KSk7Ci0gIHBlZXJfY29kZWNfaW5kZXggPSBBMkRQX1NpbmtDb2RlY0luZGV4KGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHkpOwotICBFWFBFQ1RfTkUocGVlcl9jb2RlY19pbmRleCwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCk7Ci0gIGNvZGVjX2NvbmZpZyA9IGEyZHBfY29kZWNzLT5maW5kU2lua0NvZGVjQ29uZmlnKGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHkpOwotICBFWFBFQ1RfTkUoY29kZWNfY29uZmlnLCBudWxscHRyKTsKLSAgRVhQRUNUX1RSVUUoYTJkcF9jb2RlY3MtPnNldFNpbmtDb2RlY0NvbmZpZygKLSAgICAgIGNvZGVjX2luZm9fc2JjX2NhcGFiaWxpdHksIHRydWUgLyogaXNfY2FwYWJpbGl0eSAqLywgY29kZWNfaW5mb19yZXN1bHQsCi0gICAgICB0cnVlIC8qIHNlbGVjdF9jdXJyZW50X2NvZGVjICovKSk7Ci0gIEVYUEVDVF9FUShhMmRwX2NvZGVjcy0+Z2V0Q3VycmVudENvZGVjQ29uZmlnKCksIGNvZGVjX2NvbmZpZyk7Ci0gIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBjb2RlYyB3aXRoIHRoZSBsb2NhbCB0ZXN0IGNvZGVjIGluZm8KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX3NiY1swXSArIDE7IGkrKykgewotICAgIEVYUEVDVF9FUShjb2RlY19pbmZvX3Jlc3VsdFtpXSwgY29kZWNfaW5mb19zYmNbaV0pOwotICB9Ci0gIEVYUEVDVF9FUShjb2RlY19jb25maWctPmdldEF1ZGlvQml0c1BlclNhbXBsZSgpLCAxNik7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBjb2RlYyBjYXBhYmlsaXR5IC0gQUFDIFNpbmsKLSAgbWVtc2V0KGNvZGVjX2luZm9fcmVzdWx0LCAwLCBzaXplb2YoY29kZWNfaW5mb19yZXN1bHQpKTsKLSAgcGVlcl9jb2RlY19pbmRleCA9IEEyRFBfU2lua0NvZGVjSW5kZXgoY29kZWNfaW5mb19hYWNfY2FwYWJpbGl0eSk7Ci0gIEVYUEVDVF9ORShwZWVyX2NvZGVjX2luZGV4LCBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYKTsKLSAgY29kZWNfY29uZmlnID0gYTJkcF9jb2RlY3MtPmZpbmRTaW5rQ29kZWNDb25maWcoY29kZWNfaW5mb19hYWNfY2FwYWJpbGl0eSk7Ci0gIEVYUEVDVF9ORShjb2RlY19jb25maWcsIG51bGxwdHIpOwotICBFWFBFQ1RfVFJVRShhMmRwX2NvZGVjcy0+c2V0U2lua0NvZGVjQ29uZmlnKAotICAgICAgY29kZWNfaW5mb19hYWNfY2FwYWJpbGl0eSwgdHJ1ZSAvKiBpc19jYXBhYmlsaXR5ICovLCBjb2RlY19pbmZvX3Jlc3VsdCwKLSAgICAgIHRydWUgLyogc2VsZWN0X2N1cnJlbnRfY29kZWMgKi8pKTsKLSAgRVhQRUNUX0VRKGEyZHBfY29kZWNzLT5nZXRDdXJyZW50Q29kZWNDb25maWcoKSwgY29kZWNfY29uZmlnKTsKLSAgLy8gQ29tcGFyZSB0aGUgcmVzdWx0IGNvZGVjIHdpdGggdGhlIGxvY2FsIHRlc3QgY29kZWMgaW5mbwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjX2luZm9fYWFjWzBdICsgMTsgaSsrKSB7Ci0gICAgRVhQRUNUX0VRKGNvZGVjX2luZm9fcmVzdWx0W2ldLCBjb2RlY19pbmZvX2FhY1tpXSk7Ci0gIH0KLSAgRVhQRUNUX0VRKGNvZGVjX2NvbmZpZy0+Z2V0QXVkaW9CaXRzUGVyU2FtcGxlKCksIDE2KTsKLQotICAvLyBDcmVhdGUgdGhlIGNvZGVjIGNvbmZpZyAtIFNCQyBTaW5rCi0gIG1lbXNldChjb2RlY19pbmZvX3Jlc3VsdCwgMCwgc2l6ZW9mKGNvZGVjX2luZm9fcmVzdWx0KSk7Ci0gIHBlZXJfY29kZWNfaW5kZXggPSBBMkRQX1NpbmtDb2RlY0luZGV4KGNvZGVjX2luZm9fc2JjKTsKLSAgRVhQRUNUX05FKHBlZXJfY29kZWNfaW5kZXgsIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NQVgpOwotICBjb2RlY19jb25maWcgPSBhMmRwX2NvZGVjcy0+ZmluZFNpbmtDb2RlY0NvbmZpZyhjb2RlY19pbmZvX3NiYyk7Ci0gIEVYUEVDVF9ORShjb2RlY19jb25maWcsIG51bGxwdHIpOwotICBFWFBFQ1RfVFJVRShhMmRwX2NvZGVjcy0+c2V0U2lua0NvZGVjQ29uZmlnKAotICAgICAgY29kZWNfaW5mb19zYmMsIGZhbHNlIC8qIGlzX2NhcGFiaWxpdHkgKi8sIGNvZGVjX2luZm9fcmVzdWx0LAotICAgICAgdHJ1ZSAvKiBzZWxlY3RfY3VycmVudF9jb2RlYyAqLykpOwotICBFWFBFQ1RfRVEoYTJkcF9jb2RlY3MtPmdldEN1cnJlbnRDb2RlY0NvbmZpZygpLCBjb2RlY19jb25maWcpOwotICAvLyBDb21wYXJlIHRoZSByZXN1bHQgY29kZWMgd2l0aCB0aGUgbG9jYWwgdGVzdCBjb2RlYyBpbmZvCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29kZWNfaW5mb19zYmNbMF0gKyAxOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoY29kZWNfaW5mb19yZXN1bHRbaV0sIGNvZGVjX2luZm9fc2JjW2ldKTsKLSAgfQotICBFWFBFQ1RfRVEoY29kZWNfY29uZmlnLT5nZXRBdWRpb0JpdHNQZXJTYW1wbGUoKSwgMTYpOwotCi0gIC8vIENyZWF0ZSB0aGUgY29kZWMgY29uZmlnIC0gQUFDIFNpbmsKLSAgbWVtc2V0KGNvZGVjX2luZm9fcmVzdWx0LCAwLCBzaXplb2YoY29kZWNfaW5mb19yZXN1bHQpKTsKLSAgcGVlcl9jb2RlY19pbmRleCA9IEEyRFBfU2lua0NvZGVjSW5kZXgoY29kZWNfaW5mb19hYWMpOwotICBFWFBFQ1RfTkUocGVlcl9jb2RlY19pbmRleCwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCk7Ci0gIGNvZGVjX2NvbmZpZyA9IGEyZHBfY29kZWNzLT5maW5kU2lua0NvZGVjQ29uZmlnKGNvZGVjX2luZm9fYWFjKTsKLSAgRVhQRUNUX05FKGNvZGVjX2NvbmZpZywgbnVsbHB0cik7Ci0gIEVYUEVDVF9UUlVFKGEyZHBfY29kZWNzLT5zZXRTaW5rQ29kZWNDb25maWcoCi0gICAgICBjb2RlY19pbmZvX2FhYywgZmFsc2UgLyogaXNfY2FwYWJpbGl0eSAqLywgY29kZWNfaW5mb19yZXN1bHQsCi0gICAgICB0cnVlIC8qIHNlbGVjdF9jdXJyZW50X2NvZGVjICovKSk7Ci0gIEVYUEVDVF9FUShhMmRwX2NvZGVjcy0+Z2V0Q3VycmVudENvZGVjQ29uZmlnKCksIGNvZGVjX2NvbmZpZyk7Ci0gIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBjb2RlYyB3aXRoIHRoZSBsb2NhbCB0ZXN0IGNvZGVjIGluZm8KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX2FhY1swXSArIDE7IGkrKykgewotICAgIEVYUEVDVF9FUShjb2RlY19pbmZvX3Jlc3VsdFtpXSwgY29kZWNfaW5mb19hYWNbaV0pOwotICB9Ci0gIEVYUEVDVF9FUShjb2RlY19jb25maWctPmdldEF1ZGlvQml0c1BlclNhbXBsZSgpLCAxNik7Ci0KLSAgLy8gVGVzdCBpbnZhbGlkIGNvZGVjIGluZm8KLSAgdWludDhfdCBjb2RlY19pbmZvX3NiY190ZXN0MVtBVkRUX0NPREVDX1NJWkVdOwotICBtZW1zZXQoY29kZWNfaW5mb19yZXN1bHQsIDAsIHNpemVvZihjb2RlY19pbmZvX3Jlc3VsdCkpOwotICBtZW1zZXQoY29kZWNfaW5mb19zYmNfdGVzdDEsIDAsIHNpemVvZihjb2RlY19pbmZvX3NiY190ZXN0MSkpOwotICBFWFBFQ1RfRkFMU0UoYTJkcF9jb2RlY3MtPnNldENvZGVjQ29uZmlnKAotICAgICAgY29kZWNfaW5mb19zYmNfdGVzdDEsIHRydWUgLyogaXNfY2FwYWJpbGl0eSAqLywgY29kZWNfaW5mb19yZXN1bHQsCi0gICAgICB0cnVlIC8qIHNlbGVjdF9jdXJyZW50X2NvZGVjICovKSk7Ci0KLSAgQXZkdHBTZXBDb25maWcgYXZkdF9jZmc7Ci0gIG1lbXNldCgmYXZkdF9jZmcsIDAsIHNpemVvZihhdmR0X2NmZykpOwotICBBU1NFUlRfVFJVRSgKLSAgICAgIEEyRFBfSW5pdENvZGVjQ29uZmlnKEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQUFDLCAmYXZkdF9jZmcpKTsKLSAgYm9vbCBhYWNfdmJyX21vZGVfZW5hYmxlZCA9Ci0gICAgICBhdmR0X2NmZy5jb2RlY19pbmZvWzZdICYgQTJEUF9BQUNfVkFSSUFCTEVfQklUX1JBVEVfTUFTSzsKLQotICAvLyBDcmVhdGUgdGhlIGNvZGVjIGNhcGFiaWxpdHkgLSBBQUMKLSAgbWVtc2V0KGNvZGVjX2luZm9fcmVzdWx0LCAwLCBzaXplb2YoY29kZWNfaW5mb19yZXN1bHQpKTsKLSAgcGVlcl9jb2RlY19pbmRleCA9IEEyRFBfU291cmNlQ29kZWNJbmRleChjb2RlY19pbmZvX2FhY19zaW5rX2NhcGFiaWxpdHkpOwotICBBU1NFUlRfTkUocGVlcl9jb2RlY19pbmRleCwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCk7Ci0gIGNvZGVjX2NvbmZpZyA9Ci0gICAgICBhMmRwX2NvZGVjcy0+ZmluZFNvdXJjZUNvZGVjQ29uZmlnKGNvZGVjX2luZm9fYWFjX3NpbmtfY2FwYWJpbGl0eSk7Ci0gIEFTU0VSVF9ORShjb2RlY19jb25maWcsIG51bGxwdHIpOwotICBBU1NFUlRfVFJVRShhMmRwX2NvZGVjcy0+c2V0Q29kZWNDb25maWcoCi0gICAgICBjb2RlY19pbmZvX2FhY19zaW5rX2NhcGFiaWxpdHksIHRydWUgLyogaXNfY2FwYWJpbGl0eSAqLywKLSAgICAgIGNvZGVjX2luZm9fcmVzdWx0LCB0cnVlIC8qIHNlbGVjdF9jdXJyZW50X2NvZGVjICovKSk7Ci0gIEFTU0VSVF9FUShhMmRwX2NvZGVjcy0+Z2V0Q3VycmVudENvZGVjQ29uZmlnKCksIGNvZGVjX2NvbmZpZyk7Ci0gIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBjb2RlYyB3aXRoIHRoZSBsb2NhbCB0ZXN0IGNvZGVjIGluZm8KLSAgaWYgKGFhY192YnJfbW9kZV9lbmFibGVkKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX2FhY192YnJbMF0gKyAxOyBpKyspIHsKLSAgICAgIEFTU0VSVF9FUShjb2RlY19pbmZvX3Jlc3VsdFtpXSwgY29kZWNfaW5mb19hYWNfdmJyW2ldKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX2FhY1swXSArIDE7IGkrKykgewotICAgICAgQVNTRVJUX0VRKGNvZGVjX2luZm9fcmVzdWx0W2ldLCBjb2RlY19pbmZvX2FhY1tpXSk7Ci0gICAgfQotICB9Ci0gIEFTU0VSVF9FUShjb2RlY19jb25maWctPmdldEF1ZGlvQml0c1BlclNhbXBsZSgpLCAxNik7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBjb2RlYyBjb25maWcgLSBBQUMgd2l0aCB2YnIKLSAgbWVtc2V0KGNvZGVjX2luZm9fcmVzdWx0LCAwLCBzaXplb2YoY29kZWNfaW5mb19yZXN1bHQpKTsKLSAgcGVlcl9jb2RlY19pbmRleCA9IEEyRFBfU291cmNlQ29kZWNJbmRleChjb2RlY19pbmZvX2FhY192YnIpOwotICBBU1NFUlRfTkUocGVlcl9jb2RlY19pbmRleCwgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCk7Ci0gIGNvZGVjX2NvbmZpZyA9IGEyZHBfY29kZWNzLT5maW5kU291cmNlQ29kZWNDb25maWcoY29kZWNfaW5mb19hYWNfdmJyKTsKLSAgQVNTRVJUX05FKGNvZGVjX2NvbmZpZywgbnVsbHB0cik7Ci0gIEFTU0VSVF9UUlVFKGEyZHBfY29kZWNzLT5zZXRDb2RlY0NvbmZpZygKLSAgICAgIGNvZGVjX2luZm9fYWFjX3ZiciwgZmFsc2UgLyogaXNfY2FwYWJpbGl0eSAqLywgY29kZWNfaW5mb19yZXN1bHQsCi0gICAgICB0cnVlIC8qIHNlbGVjdF9jdXJyZW50X2NvZGVjICovKSk7Ci0gIEFTU0VSVF9FUShhMmRwX2NvZGVjcy0+Z2V0Q3VycmVudENvZGVjQ29uZmlnKCksIGNvZGVjX2NvbmZpZyk7Ci0gIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBjb2RlYyB3aXRoIHRoZSBsb2NhbCB0ZXN0IGNvZGVjIGluZm8KLSAgaWYgKGFhY192YnJfbW9kZV9lbmFibGVkKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY19pbmZvX2FhY1swXSArIDE7IGkrKykgewotICAgICAgQVNTRVJUX0VRKGNvZGVjX2luZm9fcmVzdWx0W2ldLCBjb2RlY19pbmZvX2FhY192YnJbaV0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjX2luZm9fYWFjWzBdICsgMTsgaSsrKSB7Ci0gICAgICBBU1NFUlRfRVEoY29kZWNfaW5mb19yZXN1bHRbaV0sIGNvZGVjX2luZm9fYWFjW2ldKTsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUX1RSVUUoY29kZWNfY29uZmlnLT51c2VSdHBIZWFkZXJNYXJrZXJCaXQoKSk7Ci0KLSAgZGVsZXRlIGEyZHBfY29kZWNzOwotfQotCi1URVNUX0YoQTJkcENvZGVjQ29uZmlnVGVzdCwgaW5pdCkgewotICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGRlZmF1bHRfcHJpb3JpdGllczsKLSAgQTJkcENvZGVjcyBjb2RlY3MoZGVmYXVsdF9wcmlvcml0aWVzKTsKLQotICBFWFBFQ1RfVFJVRShjb2RlY3MuaW5pdCgpKTsKLQotICBjb25zdCBzdGQ6Omxpc3Q8QTJkcENvZGVjQ29uZmlnKj4gb3JkZXJlZFNvdXJjZUNvZGVjcyA9Ci0gICAgICBjb2RlY3Mub3JkZXJlZFNvdXJjZUNvZGVjcygpOwotICBFWFBFQ1RfRkFMU0Uob3JkZXJlZFNvdXJjZUNvZGVjcy5lbXB0eSgpKTsKLQotICBjb25zdCBzdGQ6Omxpc3Q8QTJkcENvZGVjQ29uZmlnKj4gb3JkZXJlZFNpbmtDb2RlY3MgPQotICAgICAgY29kZWNzLm9yZGVyZWRTaW5rQ29kZWNzKCk7Ci0gIEVYUEVDVF9GQUxTRShvcmRlcmVkU2lua0NvZGVjcy5lbXB0eSgpKTsKLX0KZGlmZiAtLWdpdCBhL3N0YWNrL3Rlc3Qvc3RhY2tfYXZkdHBfdGVzdC5jYyBiL3N0YWNrL3Rlc3Qvc3RhY2tfYXZkdHBfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NTBhMi4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L3N0YWNrX2F2ZHRwX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic3RhY2svYXZkdC9hdmR0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay90ZXN0L2NvbW1vbi9tb2NrX3N0YWNrX2F2ZHRfbXNnLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIEdsb2JhbCB0cmFjZSBsZXZlbCByZWZlcnJlZCBpbiB0aGUgY29kZSB1bmRlciB0ZXN0Ci11aW50OF90IGFwcGxfdHJhY2VfbGV2ZWwgPSBCVF9UUkFDRV9MRVZFTF9WRVJCT1NFOwotCi12b2lkIExvZ01zZyh1aW50MzJfdCB0cmFjZV9zZXRfbWFzaywgY29uc3QgY2hhciogZm10X3N0ciwgLi4uKSB7IH0KLQotLy8gQWxsIG1vY2sgcmVxdWlyZXMgdGhpcyBzeW1ib2wgdG8gY291bnQgY2FsbGluZyB0aW1lcwotc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLWNsYXNzIFN0YWNrQXZkdHBUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBTdGFja0F2ZHRwVGVzdCgpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIH5TdGFja0F2ZHRwVGVzdCgpID0gZGVmYXVsdDsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBBdmR0cFJjYiBfcmVnOwotICBzdGF0aWMgdWludDhfdCBfZXhwZWN0ZWRfc3RyZWFtX2V2ZW50OwotCi0gIHVpbnQ4X3Qgc2NiX2hhbmRsZV87Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyB2b2lkIF9hdmR0Y2FsbGJhY2soVU5VU0VEX0FUVFIgdWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMKiBwX2RhdGEsIHVpbnQ4X3Qgc2NiX2luZGV4KSB7Ci0gICAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBfc3RyZWFtY2FsbGJhY2sodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICB1aW50OF90IGV2ZW50LCB0QVZEVF9DVFJMKiBwX2RhdGEsCi0gICB1aW50OF90IHNjYl9pbmRleCkgewotICAgIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICAgIEFTU0VSVF9FUShldmVudCwgX2V4cGVjdGVkX3N0cmVhbV9ldmVudCk7Ci0gIH07Ci0KLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBfcmVnLmN0cmxfbXR1ID0gNjcyOwotICAgIF9yZWcucmV0X3RvdXQgPSA0OwotICAgIF9yZWcuc2lnX3RvdXQgPSA0OwotICAgIF9yZWcuaWRsZV90b3V0ID0gMTA7Ci0gICAgX3JlZy5zY2JfaW5kZXggPSAwOwotICAgIEFWRFRfUmVnaXN0ZXIoJl9yZWcsIF9hdmR0Y2FsbGJhY2spOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsKLSAgICBBVkRUX0RlcmVnaXN0ZXIoKTsKLSAgfQotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgdWludDhfdCBwZWVyX2lkID0gMTsKLSAgICBzY2JfaGFuZGxlXyA9IDA7Ci0gICAgX2V4cGVjdGVkX3N0cmVhbV9ldmVudCA9IDA7Ci0gICAgQXZkdHBTdHJlYW1Db25maWcgYXZkdHBfc3RyZWFtX2NvbmZpZzsKLSAgICBhdmR0cF9zdHJlYW1fY29uZmlnLmNmZy5wc2NfbWFzayA9IEFWRFRfUFNDX0RFTEFZX1JQVDsKLSAgICBhdmR0cF9zdHJlYW1fY29uZmlnLnRzZXAgPSBBVkRUX1RTRVBfU05LOwotICAgIGF2ZHRwX3N0cmVhbV9jb25maWcucF9hdmR0X2N0cmxfY2JhY2sgPSBfc3RyZWFtY2FsbGJhY2s7Ci0gICAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbIl9zdHJlYW1jYWxsYmFjayJdID0gMDsKLQotICAgIEFTU0VSVF9FUShBVkRUX0NyZWF0ZVN0cmVhbShwZWVyX2lkLCAmc2NiX2hhbmRsZV8sIGF2ZHRwX3N0cmVhbV9jb25maWcpLCBBVkRUX1NVQ0NFU1MpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBBU1NFUlRfRVEoQVZEVF9SZW1vdmVTdHJlYW0oc2NiX2hhbmRsZV8pLCBBVkRUX1NVQ0NFU1MpOwotICB9Ci0KLSAgdm9pZCBTdHJlYW1DYWxsQmFja0V4cGVjdCh1aW50OF90IGV2ZW50KSB7Ci0gICAgX2V4cGVjdGVkX3N0cmVhbV9ldmVudCA9IGV2ZW50OwotICB9Ci19OwotCi1BdmR0cFJjYiBTdGFja0F2ZHRwVGVzdDo6X3JlZ3t9OwotdWludDhfdCBTdGFja0F2ZHRwVGVzdDo6X2V4cGVjdGVkX3N0cmVhbV9ldmVudCA9IDA7Ci0KLVRFU1RfRihTdGFja0F2ZHRwVGVzdCwgdGVzdF9kZWxheV9yZXBvcnRfYXNfYWNjZXB0KSB7Ci0gIC8vIEdldCBTQ0IgcmVhZHkgdG8gc2VuZCByZXNwb25zZQotICBhdXRvIHBzY2IgPSBhdmR0X3NjYl9ieV9oZGwoc2NiX2hhbmRsZV8pOwotICBwc2NiLT5pbl91c2UgPSB0cnVlOwotCi0gIC8vIFNlbmQgU2V0Q29uZmlnIHJlc3BvbnNlCi0gIHVpbnQ4X3QgbGFiZWwgPSAwOwotICB1aW50OF90IGVycl9jb2RlID0gMDsKLSAgdWludDhfdCBjYXRlZ29yeSA9IDA7Ci0KLSAgbW9ja19hdmR0X21zZ19zZW5kX2NtZF9jbGVhcl9oaXN0b3J5KCk7Ci0gIG1vY2tfYXZkdF9tc2dfc2VuZF9yc3BfY2xlYXJfaGlzdG9yeSgpOwotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYXZkdF9tc2dfc2VuZF9yc3AiXSA9IDA7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJhdmR0X21zZ19zZW5kX2NtZCJdID0gMDsKLSAgQVNTRVJUX0VRKEFWRFRfQ29uZmlnUnNwKHNjYl9oYW5kbGVfLCBsYWJlbCwgZXJyX2NvZGUsIGNhdGVnb3J5KSwgQVZEVF9TVUNDRVNTKTsKLQotICAvLyBDb25maWcgcmVzcG9uc2Ugc2VudAotICBBU1NFUlRfRVEobW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImF2ZHRfbXNnX3NlbmRfcnNwIl0sIDEpOwotICBBU1NFUlRfRVEobW9ja19hdmR0X21zZ19zZW5kX3JzcF9nZXRfc2lnX2lkX2F0KDApLCBBVkRUX1NJR19TRVRDT05GSUcpOwotCi0gIC8vIERlbGF5IHJlcG9ydCBjb21tYW5kIHNlbnQKLSAgQVNTRVJUX0VRKG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJhdmR0X21zZ19zZW5kX2NtZCJdLCAxKTsKLSAgQVNTRVJUX0VRKG1vY2tfYXZkdF9tc2dfc2VuZF9jbWRfZ2V0X3NpZ19pZF9hdCgwKSwgQVZEVF9TSUdfREVMQVlfUlBUKTsKLQotICAvLyBEZWxheSByZXBvcnQgY29uZmlybWVkCi0gIHRBVkRUX1NDQl9FVlQgZGF0YTsKLSAgQVNTRVJUX0VRKG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJfc3RyZWFtY2FsbGJhY2siXSwgMCk7Ci0gIFN0cmVhbUNhbGxCYWNrRXhwZWN0KEFWRFRfREVMQVlfUkVQT1JUX0NGTV9FVlQpOwotICBhdmR0X3NjYl9oZGxfZGVsYXlfcnB0X3JzcChwc2NiLCAmZGF0YSk7Ci0gIEFTU0VSVF9FUShtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiX3N0cmVhbWNhbGxiYWNrIl0sIDEpOwotfQotCi1URVNUX0YoU3RhY2tBdmR0cFRlc3QsIHRlc3Rfbm9fZGVsYXlfcmVwb3J0X2lmX25vdF9zaW5rKSB7Ci0gIC8vIEdldCBTQ0IgcmVhZHkgdG8gc2VuZCByZXNwb25zZQotICBhdXRvIHBzY2IgPSBhdmR0X3NjYl9ieV9oZGwoc2NiX2hhbmRsZV8pOwotICBwc2NiLT5pbl91c2UgPSB0cnVlOwotCi0gIC8vIENoYW5nZSB0aGUgc2NiIHRvIFNSQwotICBwc2NiLT5zdHJlYW1fY29uZmlnLnRzZXAgPSBBVkRUX1RTRVBfU1JDOwotCi0gIC8vIFNlbmQgU2V0Q29uZmlnIHJlc3BvbnNlCi0gIHVpbnQ4X3QgbGFiZWwgPSAwOwotICB1aW50OF90IGVycl9jb2RlID0gMDsKLSAgdWludDhfdCBjYXRlZ29yeSA9IDA7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwWyJhdmR0X21zZ19zZW5kX3JzcCJdID0gMDsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImF2ZHRfbXNnX3NlbmRfY21kIl0gPSAwOwotICBBU1NFUlRfRVEoQVZEVF9Db25maWdSc3Aoc2NiX2hhbmRsZV8sIGxhYmVsLCBlcnJfY29kZSwgY2F0ZWdvcnkpLCBBVkRUX1NVQ0NFU1MpOwotICBBU1NFUlRfRVEobW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImF2ZHRfbXNnX3NlbmRfcnNwIl0sIDEpOyAvLyBDb25maWcgcmVzcG9uc2Ugc2VudAotICBBU1NFUlRfRVEobW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImF2ZHRfbXNnX3NlbmRfY21kIl0sIDApOyAvLyBEZWxheSByZXBvcnQgY29tbWFuZCBub3Qgc2VudAotfQotCi1URVNUX0YoU3RhY2tBdmR0cFRlc3QsIHRlc3Rfbm9fZGVsYXlfcmVwb3J0X2lmX25vdF9lbmFibGVkKSB7Ci0gIC8vIEdldCBTQ0IgcmVhZHkgdG8gc2VuZCByZXNwb25zZQotICBhdXRvIHBzY2IgPSBhdmR0X3NjYl9ieV9oZGwoc2NiX2hhbmRsZV8pOwotICBwc2NiLT5pbl91c2UgPSB0cnVlOwotCi0gIC8vIERpc2FibGUgdGhlIHNjYidzIGRlbGF5IHJlcG9ydCBtYXNrCi0gIHBzY2ItPnN0cmVhbV9jb25maWcuY2ZnLnBzY19tYXNrICY9IH5BVkRUX1BTQ19ERUxBWV9SUFQ7Ci0KLSAgLy8gU2VuZCBTZXRDb25maWcgcmVzcG9uc2UKLSAgdWludDhfdCBsYWJlbCA9IDA7Ci0gIHVpbnQ4X3QgZXJyX2NvZGUgPSAwOwotICB1aW50OF90IGNhdGVnb3J5ID0gMDsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbImF2ZHRfbXNnX3NlbmRfcnNwIl0gPSAwOwotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYXZkdF9tc2dfc2VuZF9jbWQiXSA9IDA7Ci0gIEFTU0VSVF9FUShBVkRUX0NvbmZpZ1JzcChzY2JfaGFuZGxlXywgbGFiZWwsIGVycl9jb2RlLCBjYXRlZ29yeSksIEFWRFRfU1VDQ0VTUyk7Ci0gIEFTU0VSVF9FUShtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYXZkdF9tc2dfc2VuZF9yc3AiXSwgMSk7IC8vIENvbmZpZyByZXNwb25zZSBzZW50Ci0gIEFTU0VSVF9FUShtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYXZkdF9tc2dfc2VuZF9jbWQiXSwgMCk7IC8vIERlbGF5IHJlcG9ydCBjb21tYW5kIG5vdCBzZW50Ci19Ci0KLVRFU1RfRihTdGFja0F2ZHRwVGVzdCwgdGVzdF9kZWxheV9yZXBvcnRfYXNfaW5pdCkgewotICBhdXRvIHBzY2IgPSBhdmR0X3NjYl9ieV9oZGwoc2NiX2hhbmRsZV8pOwotCi0gIHRBVkRUX1NDQl9FVlQgZGF0YTsKLQotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYXZkdF9tc2dfc2VuZF9jbWQiXSA9IDA7Ci0KLSAgLy8gRGVsYXkgcmVwb3J0IC0+IE9wZW4gY29tbWFuZAotICBtb2NrX2F2ZHRfbXNnX3NlbmRfY21kX2NsZWFyX2hpc3RvcnkoKTsKLSAgYXZkdF9zY2JfZXZlbnQocHNjYiwgQVZEVF9TQ0JfTVNHX1NFVENPTkZJR19SU1BfRVZULCAmZGF0YSk7Ci0gIEFTU0VSVF9FUShtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFsiYXZkdF9tc2dfc2VuZF9jbWQiXSwgMik7Ci0gIEFTU0VSVF9FUShtb2NrX2F2ZHRfbXNnX3NlbmRfY21kX2dldF9zaWdfaWRfYXQoMCksIEFWRFRfU0lHX0RFTEFZX1JQVCk7Ci0gIEFTU0VSVF9FUShtb2NrX2F2ZHRfbXNnX3NlbmRfY21kX2dldF9zaWdfaWRfYXQoMSksIEFWRFRfU0lHX09QRU4pOwotfQotCmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L3N0YWNrX2F2cmNwX3Rlc3QuY2MgYi9zdGFjay90ZXN0L3N0YWNrX2F2cmNwX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZWM0NWYuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9zdGFja19hdnJjcF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4gIC8vIGh0b25zCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdnJjX2FwaS5oIgotCi1jbGFzcyBTdGFja0F2cmNwVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgU3RhY2tBdnJjcFRlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgdmlydHVhbCB+U3RhY2tBdnJjcFRlc3QoKSA9IGRlZmF1bHQ7Ci19OwotCi1URVNUX0YoU3RhY2tBdnJjcFRlc3QsIHRlc3RfYXZyY3BfcGFyc2VfYnJvd3NlX2NtZCkgewotICB1aW50OF90IHNjcmF0Y2hfYnVmWzUxMl17fTsKLSAgdEFWUkNfTVNHIG1zZ3t9OwotICB0QVZSQ19DT01NQU5EIHJlc3VsdHt9OwotICB1aW50OF90IGJyb3dzZV9jbWRfYnVmWzUxMl17fTsKLQotICBtc2cuaGRyLm9wY29kZSA9IEFWUkNfT1BfQlJPV1NFOwotICBtc2cuYnJvd3NlLnBfYnJvd3NlX2RhdGEgPSBicm93c2VfY21kX2J1ZjsKLSAgbXNnLmJyb3dzZS5icm93c2VfbGVuID0gMjsKLSAgRVhQRUNUX0VRKEFWUkNfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCwgc2NyYXRjaF9idWYsIHNpemVvZihzY3JhdGNoX2J1ZikpLAotICAgICAgICAgICAgQVZSQ19TVFNfQkFEX0NNRCk7Ci0KLSAgbWVtc2V0KGJyb3dzZV9jbWRfYnVmLCAwLCBzaXplb2YoYnJvd3NlX2NtZF9idWYpKTsKLSAgYnJvd3NlX2NtZF9idWZbMF0gPSBBVlJDX1BEVV9TRVRfQlJPV1NFRF9QTEFZRVI7Ci0gIG1zZy5icm93c2UuYnJvd3NlX2xlbiA9IDM7Ci0gIEVYUEVDVF9FUShBVlJDX1BhcnNDb21tYW5kKCZtc2csICZyZXN1bHQsIHNjcmF0Y2hfYnVmLCBzaXplb2Yoc2NyYXRjaF9idWYpKSwKLSAgICAgICAgICAgIEFWUkNfU1RTX0JBRF9DTUQpOwotCi0gIG1zZy5icm93c2UuYnJvd3NlX2xlbiA9IDU7Ci0gIEVYUEVDVF9FUShBVlJDX1BhcnNDb21tYW5kKCZtc2csICZyZXN1bHQsIHNjcmF0Y2hfYnVmLCBzaXplb2Yoc2NyYXRjaF9idWYpKSwKLSAgICAgICAgICAgIEFWUkNfU1RTX05PX0VSUk9SKTsKLQotICBtZW1zZXQoYnJvd3NlX2NtZF9idWYsIDAsIHNpemVvZihicm93c2VfY21kX2J1ZikpOwotICBicm93c2VfY21kX2J1ZlswXSA9IEFWUkNfUERVX0dFVF9GT0xERVJfSVRFTVM7Ci0gIG1zZy5icm93c2UuYnJvd3NlX2xlbiA9IDM7Ci0gIEVYUEVDVF9FUShBVlJDX1BhcnNDb21tYW5kKCZtc2csICZyZXN1bHQsIHNjcmF0Y2hfYnVmLCBzaXplb2Yoc2NyYXRjaF9idWYpKSwKLSAgICAgICAgICAgIEFWUkNfU1RTX0JBRF9DTUQpOwotCi0gIG1zZy5icm93c2UuYnJvd3NlX2xlbiA9IDEzOwotICB1aW50OF90KiBwID0gJmJyb3dzZV9jbWRfYnVmWzNdOwotICBVSU5UOF9UT19TVFJFQU0ocCwgQVZSQ19TQ09QRV9OT1dfUExBWUlORyk7ICAvLyBzY29wZQotICBVSU5UMzJfVE9fU1RSRUFNKHAsIDB4MDAwMDAwMDEpOyAgICAgICAgICAgICAvLyBzdGFydF9pdGVtCi0gIFVJTlQzMl9UT19TVFJFQU0ocCwgMHgwMDAwMDAwMik7ICAgICAgICAgICAgIC8vIGVuZF9pdGVtCi0gIGJyb3dzZV9jbWRfYnVmWzEyXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJfY291bnQKLSAgRVhQRUNUX0VRKEFWUkNfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCwgc2NyYXRjaF9idWYsIHNpemVvZihzY3JhdGNoX2J1ZikpLAotICAgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IpOwotCi0gIG1lbXNldChicm93c2VfY21kX2J1ZiwgMCwgc2l6ZW9mKGJyb3dzZV9jbWRfYnVmKSk7Ci0gIGJyb3dzZV9jbWRfYnVmWzBdID0gQVZSQ19QRFVfQ0hBTkdFX1BBVEg7Ci0gIG1zZy5icm93c2UuYnJvd3NlX2xlbiA9IDM7Ci0gIEVYUEVDVF9FUShBVlJDX1BhcnNDb21tYW5kKCZtc2csICZyZXN1bHQsIHNjcmF0Y2hfYnVmLCBzaXplb2Yoc2NyYXRjaF9idWYpKSwKLSAgICAgICAgICAgIEFWUkNfU1RTX0JBRF9DTUQpOwotCi0gIG1zZy5icm93c2UuYnJvd3NlX2xlbiA9IDE0OwotICBwID0gJmJyb3dzZV9jbWRfYnVmWzNdOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDB4MTIzNCk7ICAgICAgLy8gdWlkX2NvdW50ZXIKLSAgVUlOVDhfVE9fU1RSRUFNKHAsIEFWUkNfRElSX1VQKTsgIC8vIGRpcmVjdGlvbgotICBVSU5UOF9UT19TVFJFQU0ocCwgMCk7ICAgICAgICAgICAgLy8gYXR0cl9jb3VudAotICBFWFBFQ1RfRVEoQVZSQ19QYXJzQ29tbWFuZCgmbXNnLCAmcmVzdWx0LCBzY3JhdGNoX2J1Ziwgc2l6ZW9mKHNjcmF0Y2hfYnVmKSksCi0gICAgICAgICAgICBBVlJDX1NUU19OT19FUlJPUik7Ci0KLSAgbWVtc2V0KGJyb3dzZV9jbWRfYnVmLCAwLCBzaXplb2YoYnJvd3NlX2NtZF9idWYpKTsKLSAgYnJvd3NlX2NtZF9idWZbMF0gPSBBVlJDX1BEVV9HRVRfSVRFTV9BVFRSSUJVVEVTOwotICBtc2cuYnJvd3NlLmJyb3dzZV9sZW4gPSAzOwotICBFWFBFQ1RfRVEoQVZSQ19QYXJzQ29tbWFuZCgmbXNnLCAmcmVzdWx0LCBzY3JhdGNoX2J1Ziwgc2l6ZW9mKHNjcmF0Y2hfYnVmKSksCi0gICAgICAgICAgICBBVlJDX1NUU19CQURfQ01EKTsKLQotICBtc2cuYnJvd3NlLmJyb3dzZV9sZW4gPSAxNTsKLSAgRVhQRUNUX0VRKEFWUkNfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCwgc2NyYXRjaF9idWYsIHNpemVvZihzY3JhdGNoX2J1ZikpLAotICAgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IpOwotCi0gIG1lbXNldChicm93c2VfY21kX2J1ZiwgMCwgc2l6ZW9mKGJyb3dzZV9jbWRfYnVmKSk7Ci0gIGJyb3dzZV9jbWRfYnVmWzBdID0gQVZSQ19QRFVfR0VUX1RPVEFMX05VTV9PRl9JVEVNUzsKLSAgbXNnLmJyb3dzZS5icm93c2VfbGVuID0gMzsKLSAgRVhQRUNUX0VRKEFWUkNfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCwgc2NyYXRjaF9idWYsIHNpemVvZihzY3JhdGNoX2J1ZikpLAotICAgICAgICAgICAgQVZSQ19TVFNfQkFEX0NNRCk7Ci0KLSAgbXNnLmJyb3dzZS5icm93c2VfbGVuID0gNDsKLSAgRVhQRUNUX0VRKEFWUkNfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCwgc2NyYXRjaF9idWYsIHNpemVvZihzY3JhdGNoX2J1ZikpLAotICAgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IpOwotCi0gIG1lbXNldChicm93c2VfY21kX2J1ZiwgMCwgc2l6ZW9mKGJyb3dzZV9jbWRfYnVmKSk7Ci0gIGJyb3dzZV9jbWRfYnVmWzBdID0gQVZSQ19QRFVfU0VBUkNIOwotICBtc2cuYnJvd3NlLmJyb3dzZV9sZW4gPSAzOwotICBFWFBFQ1RfRVEoQVZSQ19QYXJzQ29tbWFuZCgmbXNnLCAmcmVzdWx0LCBzY3JhdGNoX2J1Ziwgc2l6ZW9mKHNjcmF0Y2hfYnVmKSksCi0gICAgICAgICAgICBBVlJDX1NUU19CQURfQ01EKTsKLQotICBwID0gJmJyb3dzZV9jbWRfYnVmWzNdOwotICBVSU5UMTZfVE9fU1RSRUFNKHAsIDB4MDAwMCk7ICAvLyBjaGFyc2V0X2lkCi0gIFVJTlQxNl9UT19TVFJFQU0ocCwgMHgwMDAwKTsgIC8vIHN0cl9sZW4KLSAgbXNnLmJyb3dzZS5icm93c2VfbGVuID0gNzsKLSAgRVhQRUNUX0VRKEFWUkNfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCwgc2NyYXRjaF9idWYsIHNpemVvZihzY3JhdGNoX2J1ZikpLAotICAgICAgICAgICAgQVZSQ19TVFNfTk9fRVJST1IpOwotfQotCi1URVNUX0YoU3RhY2tBdnJjcFRlc3QsIHRlc3RfYXZyY3BfcGR1X3JlZ2lzdGVyX25vdGlmaWNhdGlvbikgewotICBBU1NFUlRfRVEoaHRvbnMoMHg1MDApLCA1KTsKLQotICBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgcGR1OwotICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7Ci0gICAgdWludDE2X3QgbGVuOwotICAgIHN0cnVjdCB7Ci0gICAgICB1aW50OF90IGV2ZW50X2lkOwotICAgICAgdWludDMyX3QgcGFyYW07Ci0gICAgfSBwYXlsb2FkOwotICB9IGRhdGEgPSB7Ci0gICAgICBBVlJDX1BEVV9SRUdJU1RFUl9OT1RJRklDQVRJT04sCi0gICAgICAwLCAgLy8gcmVzZXJ2ZWQKLSAgICAgIGh0b25zKHNpemVvZihkYXRhLnBheWxvYWQpKSwKLSAgICAgIC5wYXlsb2FkID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5ldmVudF9pZCA9IDAsCi0gICAgICAgICAgICAgIC5wYXJhbSA9IDB4MTIzNCwKLSAgICAgICAgICB9LAotICB9OwotCi0gIHRBVlJDX01TRyBtc2cgPSB7Ci0gICAgICAudmVuZG9yID0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC5oZHIgPQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIC5jdHlwZSA9IEFWUkNfQ01EX05PVElGLAotICAgICAgICAgICAgICAgICAgICAgIC5vcGNvZGUgPSBBVlJDX09QX1ZFTkRPUiwKLSAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgIC5wX3ZlbmRvcl9kYXRhID0gKHVpbnQ4X3QqKSZkYXRhLAotICAgICAgICAgICAgICAudmVuZG9yX2xlbiA9IHNpemVvZihkYXRhKSwKLSAgICAgICAgICB9LAotICB9OwotICB0QVZSQ19DT01NQU5EIHJlc3VsdHt9OwotCi0gIC8vIFJ1biB0aHJvdWdoIGFsbCBwb3NzaWJsZSBldmVudCBpZHMKLSAgdWludDhfdCBpZCA9IDA7Ci0gIGRvIHsKLSAgICBkYXRhLnBheWxvYWQuZXZlbnRfaWQgPSBpZDsKLSAgICBBU1NFUlRfRVEoKGlkID09IDAgfHwgaWQgPiBBVlJDX05VTV9OT1RJRl9FVkVOVFMpID8gQVZSQ19TVFNfQkFEX1BBUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWUkNfU1RTX05PX0VSUk9SLAotICAgICAgICAgICAgICBBVlJDX0N0cmxfUGFyc0NvbW1hbmQoJm1zZywgJnJlc3VsdCkpOwotICB9IHdoaWxlICgrK2lkICE9IDApOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9zdGFja19idHVfdGVzdC5jYyBiL3N0YWNrL3Rlc3Qvc3RhY2tfYnR1X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDExZDAuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9zdGFja19idHVfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnR1LmgiCi0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi12b2lkIExvZ01zZyh1aW50MzJfdCB0cmFjZV9zZXRfbWFzaywgY29uc3QgY2hhciogZm10X3N0ciwgLi4uKSB7fQotCi1jbGFzcyBTdGFja0J0dVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OwotCi1URVNUX0YoU3RhY2tCdHVUZXN0LCBwb3N0X29uX21haW4pIHt9CmRpZmYgLS1naXQgYS9zdGFjay90ZXN0L3N0YWNrX2dhdHRfc3JfaGFzaF90ZXN0LmNjIGIvc3RhY2svdGVzdC9zdGFja19nYXR0X3NyX2hhc2hfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNmQ3Zi4uMDAwMDAwMAotLS0gYS9zdGFjay90ZXN0L3N0YWNrX2dhdHRfc3JfaGFzaF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJjcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay90ZXN0L2NvbW1vbi9tb2NrX2VhdHQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLXRHQVRUX0NCIGdhdHRfY2I7Ci0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotYm9vbCBNT0NLX2JsdWV0b290aF9zaGltX2lzX2dkX2FjbF9lbmFibGVkXyA9IGZhbHNlOwotCi1zdGF0aWMgdm9pZCBhZGRfaXRlbV90b19saXN0KHN0ZDo6bGlzdDx0R0FUVF9TUlZfTElTVF9FTEVNPiYgc3J2X2xpc3RfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVkNfREIqIGRiLCBib29sIGlzX3ByaW1hcnkpIHsKLSAgc3J2X2xpc3RfaW5mby5lbXBsYWNlX2JhY2soKTsKLSAgdEdBVFRfU1JWX0xJU1RfRUxFTSYgZWxlbSA9IHNydl9saXN0X2luZm8uYmFjaygpOwotICBlbGVtLnBfZGIgPSBkYjsKLSAgZWxlbS5pc19wcmltYXJ5ID0gaXNfcHJpbWFyeTsKLX0KLQotLy8gQlQgU3BlYyA1LjIsIFZvbCAzLCBQYXJ0IEcsIEFwcGVuZGl4IEIKLVRFU1QoR2F0dERhdGFiYXNlVGVzdCwgbWF0Y2hFeGFtcGxlSW5CdFNwZWNWNTIpIHsKLSAgdEdBVFRfU1ZDX0RCIGxvY2FsX2RiWzRdOwotICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSBsb2NhbF9kYltpXSA9IHRHQVRUX1NWQ19EQigpOwotICBzdGQ6Omxpc3Q8dEdBVFRfU1JWX0xJU1RfRUxFTT4gc3J2X2xpc3RfaW5mbzsKLQotICAvLyAweDE4MDAKLSAgYWRkX2l0ZW1fdG9fbGlzdChzcnZfbGlzdF9pbmZvLCAmbG9jYWxfZGJbMF0sIHRydWUpOwotICBnYXR0c19pbml0X3NlcnZpY2VfZGIobG9jYWxfZGJbMF0sIFV1aWQ6OkZyb20xNkJpdCgweDE4MDApLCB0cnVlLCAweDAwMDEsIDUpOwotICBnYXR0c19hZGRfY2hhcmFjdGVyaXN0aWMobG9jYWxfZGJbMF0sCi0gICAgR0FUVF9QRVJNX1JFQUQgfCBHQVRUX1BFUk1fV1JJVEUsCi0gICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQgfCBHQVRUX0NIQVJfUFJPUF9CSVRfV1JJVEUsCi0gICAgVXVpZDo6RnJvbTE2Qml0KDB4MkEwMCkpOwotICBnYXR0c19hZGRfY2hhcmFjdGVyaXN0aWMobG9jYWxfZGJbMF0sIEdBVFRfUEVSTV9SRUFELCBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICBVdWlkOjpGcm9tMTZCaXQoMHgyQTAxKSk7Ci0gIC8vIDB4MTgwMQotICBhZGRfaXRlbV90b19saXN0KHNydl9saXN0X2luZm8sICZsb2NhbF9kYlsxXSwgdHJ1ZSk7Ci0gIGdhdHRzX2luaXRfc2VydmljZV9kYihsb2NhbF9kYlsxXSwgVXVpZDo6RnJvbTE2Qml0KDB4MTgwMSksIHRydWUsIDB4MDAwNiwgOCk7Ci0gIGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYyhsb2NhbF9kYlsxXSwgMCwgR0FUVF9DSEFSX1BST1BfQklUX0lORElDQVRFLAotICAgIFV1aWQ6OkZyb20xNkJpdCgweDJBMDUpKTsKLSAgZ2F0dHNfYWRkX2NoYXJfZGVzY3IobG9jYWxfZGJbMV0sIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFELCBVdWlkOjpGcm9tMTZCaXQoMHgyOTAyKSk7Ci0gIGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYyhsb2NhbF9kYlsxXSwKLSAgICBHQVRUX1BFUk1fUkVBRCB8IEdBVFRfUEVSTV9XUklURSwKLSAgICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCB8IEdBVFRfQ0hBUl9QUk9QX0JJVF9XUklURSwKLSAgICBVdWlkOjpGcm9tMTZCaXQoMHgyQjI5KSk7Ci0gIGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYyhsb2NhbF9kYlsxXSwgR0FUVF9QRVJNX1JFQUQsIEdBVFRfQ0hBUl9QUk9QX0JJVF9SRUFELAotICAgIFV1aWQ6OkZyb20xNkJpdCgweDJCMkEpKTsKLSAgLy8gMHgxODA4Ci0gIGFkZF9pdGVtX3RvX2xpc3Qoc3J2X2xpc3RfaW5mbywgJmxvY2FsX2RiWzJdLCB0cnVlKTsKLSAgZ2F0dHNfaW5pdF9zZXJ2aWNlX2RiKGxvY2FsX2RiWzJdLCBVdWlkOjpGcm9tMTZCaXQoMHgxODA4KSwgdHJ1ZSwgMHgwMDBFLCA2KTsKLSAgZ2F0dHNfYWRkX2luY2x1ZGVkX3NlcnZpY2UobG9jYWxfZGJbMl0sIDB4MDAxNCwgMHgwMDE2LCBVdWlkOjpGcm9tMTZCaXQoMHgxODBGKSk7Ci0gIGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYyhsb2NhbF9kYlsyXSwgR0FUVF9QRVJNX1JFQUQsCi0gICAgR0FUVF9DSEFSX1BST1BfQklUX1JFQUQgfCBHQVRUX0NIQVJfUFJPUF9CSVRfSU5ESUNBVEUgfCBHQVRUX0NIQVJfUFJPUF9CSVRfRVhUX1BST1AsCi0gICAgVXVpZDo6RnJvbTE2Qml0KDB4MkExOCkpOwotICBnYXR0c19hZGRfY2hhcl9kZXNjcihsb2NhbF9kYlsyXSwgMHgwMDAwLCBVdWlkOjpGcm9tMTZCaXQoMHgyOTAyKSk7Ci0gIGdhdHRzX2FkZF9jaGFyX2V4dF9wcm9wX2Rlc2NyKGxvY2FsX2RiWzJdLCAweDAwMDApOwotICAvLyAweDE4MEYKLSAgYWRkX2l0ZW1fdG9fbGlzdChzcnZfbGlzdF9pbmZvLCAmbG9jYWxfZGJbM10sIGZhbHNlKTsKLSAgZ2F0dHNfaW5pdF9zZXJ2aWNlX2RiKGxvY2FsX2RiWzNdLCBVdWlkOjpGcm9tMTZCaXQoMHgxODBGKSwgZmFsc2UsIDB4MDAxNCwgMyk7Ci0gIGdhdHRzX2FkZF9jaGFyYWN0ZXJpc3RpYyhsb2NhbF9kYlszXSwgR0FUVF9QRVJNX1JFQUQsICBHQVRUX0NIQVJfUFJPUF9CSVRfUkVBRCwKLSAgICBVdWlkOjpGcm9tMTZCaXQoMHgyQTE5KSk7Ci0KLSAgT2N0ZXQxNiBleHBlY3RlZF9oYXNoezB4RjEsIDB4Q0EsIDB4MkQsIDB4NDgsIDB4RUMsIDB4RjUsIDB4OEIsIDB4QUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDhBLCAweDg4LCAweDMwLCAweEJCLCAweEI5LCAweEZCLCAweEE5LCAweDkwfTsKLSAgc3RkOjpyZXZlcnNlKGV4cGVjdGVkX2hhc2guYmVnaW4oKSwgZXhwZWN0ZWRfaGFzaC5lbmQoKSk7Ci0KLSAgT2N0ZXQxNiByZXN1bHRfaGFzaCA9IGdhdHRzX2NhbGN1bGF0ZV9kYXRhYmFzZV9oYXNoKCZzcnZfbGlzdF9pbmZvKTsKLQotICBBU1NFUlRfRVEocmVzdWx0X2hhc2gsIGV4cGVjdGVkX2hhc2gpOwotfQpkaWZmIC0tZ2l0IGEvc3RhY2svdGVzdC9zdGFja19zbXBfdGVzdC5jYyBiL3N0YWNrL3Rlc3Qvc3RhY2tfc21wX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDkxNGUuLjAwMDAwMDAKLS0tIGEvc3RhY2svdGVzdC9zdGFja19zbXBfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RyYWNlLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvcGFja2V0X2ZyYWdtZW50ZXIuaCIKLSNpbmNsdWRlICJpbnRlcm5hbF9pbmNsdWRlL3N0YWNrX2NvbmZpZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NtcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9zbXAvcF8yNTZfZWNjX3BwLmgiCi0jaW5jbHVkZSAic3RhY2svc21wL3NtcF9pbnQuaCIKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19zdGFja19hY2wuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXRCVE1fQ0IgYnRtX2NiOwotc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nIGtTbXBPcHRpb25zKCJtb2NrIHNtcCBvcHRpb25zIik7Ci1ib29sIGdldF90cmFjZV9jb25maWdfZW5hYmxlZCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQotYm9vbCBnZXRfcHRzX2F2cmNwX3Rlc3Qodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLWJvb2wgZ2V0X3B0c19zZWN1cmVfb25seV9tb2RlKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1ib29sIGdldF9wdHNfY29ubl91cGRhdGVzX2Rpc2FibGVkKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1ib29sIGdldF9wdHNfY3Jvc3NrZXlfc2RwX2Rpc2FibGUodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLWNvbnN0IHN0ZDo6c3RyaW5nKiBnZXRfcHRzX3NtcF9vcHRpb25zKHZvaWQpIHsgcmV0dXJuICZrU21wT3B0aW9uczsgfQotaW50IGdldF9wdHNfc21wX2ZhaWx1cmVfY2FzZSh2b2lkKSB7IHJldHVybiAxMjM7IH0KLWNvbmZpZ190KiBnZXRfYWxsKHZvaWQpIHsgcmV0dXJuIG51bGxwdHI7IH0KLWNvbnN0IHBhY2tldF9mcmFnbWVudGVyX3QqIHBhY2tldF9mcmFnbWVudGVyX2dldF9pbnRlcmZhY2UoKSB7IHJldHVybiBudWxscHRyOyB9Ci0KLXN0YWNrX2NvbmZpZ190IG1vY2tfc3RhY2tfY29uZmlnewotICAgIC5nZXRfdHJhY2VfY29uZmlnX2VuYWJsZWQgPSBnZXRfdHJhY2VfY29uZmlnX2VuYWJsZWQsCi0gICAgLmdldF9wdHNfYXZyY3BfdGVzdCA9IGdldF9wdHNfYXZyY3BfdGVzdCwKLSAgICAuZ2V0X3B0c19zZWN1cmVfb25seV9tb2RlID0gZ2V0X3B0c19zZWN1cmVfb25seV9tb2RlLAotICAgIC5nZXRfcHRzX2Nvbm5fdXBkYXRlc19kaXNhYmxlZCA9IGdldF9wdHNfY29ubl91cGRhdGVzX2Rpc2FibGVkLAotICAgIC5nZXRfcHRzX2Nyb3Nza2V5X3NkcF9kaXNhYmxlID0gZ2V0X3B0c19jcm9zc2tleV9zZHBfZGlzYWJsZSwKLSAgICAuZ2V0X3B0c19zbXBfb3B0aW9ucyA9IGdldF9wdHNfc21wX29wdGlvbnMsCi0gICAgLmdldF9wdHNfc21wX2ZhaWx1cmVfY2FzZSA9IGdldF9wdHNfc21wX2ZhaWx1cmVfY2FzZSwKLSAgICAuZ2V0X2FsbCA9IGdldF9hbGwsCi19OwotY29uc3Qgc3RhY2tfY29uZmlnX3QqIHN0YWNrX2NvbmZpZ19nZXRfaW50ZXJmYWNlKHZvaWQpIHsKLSAgcmV0dXJuICZtb2NrX3N0YWNrX2NvbmZpZzsKLX0KLQotLyoKLSAqIFRoaXMgdGVzdCB2ZXJpZmllcyB2YXJpb3VzIGtleSBkaXN0cmlidXRpb24gbWV0aG9kcyBpbiBTTVAgd29ya3MgdXNpbmcgdGhlCi0gKiBmb2xsb3dpbmcgcGFyYW1ldGVyIHNldDoKLSAqCi0gKiBXaGVuIHRlc3RpbmcgdGFyZ2V0IGFzIENlbnRyYWwgKEluaXRpYXRvciBpcyBsb2NhbCwgUmVzcG9uZGVyIGlzIHJlbW90ZSkKLSAqCi0gKiBJbml0aWF0b3IncyBQYWlyaW5nIFJlcXVlc3Q6IDB4MDcwNzEwMDAwMDAxKDAxKQotICogUmVzcG9uZGVyJ3MgUGFpcmluZyBSZXNwb25zZTogMHgwNTAwMDgwMDAwMDMoMDIpCi0gKiBJbml0aWF0b3IncyBCbHVldG9vdGggQWRkcmVzczogMHhBMUEyQTNBNEE1QTYKLSAqIEluaXRpYXRvcidzIEJsdWV0b290aCBBZGRyZXNzIFR5cGU6IDB4MDEKLSAqIFJlc3BvbmRlcidzIEJsdWV0b290aCBBZGRyZXNzOiAweEIxQjJCM0I0QjVCNgotICogUmVzcG9uZGVyJ3MgQmx1ZXRvb3RoIEFkZHJlc3MgVHlwZTogMHgwMAotICogSW5pdGlhdG9yJ3MgUmFuZG9tIE51bWJlcjogMHg1NzgzRDUyMTU2QUQ2RjBFNjM4ODI3NEVDNjcwMkVFMAotICogVEsgRW5jcnlwdGlvbiBLZXk6IDB4MAotICoKLSAqIENvcnJlY3QgdmFsdWVzOgotICoKLSAqIHAxOiAweDA1MDAwODAwMDAwMzAyMDcwNzEwMDAwMDAxMDEwMDAxCi0gKiBwMSBYT1IgcjogMHg1MjgzZGQyMTU2YWU2ZDA5NjQ5ODI3NGVjNzcxMmVlMQotICogcDEgcHJpbWU6IDB4MDJjN2FhMmE5ODU3YWM4NjZmZjkxMjMyZGYwZTNjOTUKLSAqIHAyOiAweDAwMDAwMDAwYTFhMmEzYTRhNWE2YjFiMmIzYjRiNWI2Ci0gKiBNQ29uZmlybSAoYzEpOiAweDFlMWUzZmVmODc4OTg4ZWFkMmE3NGRjNWJlZjEzYjg2Ci0gKgotICogTk9URTogQWxsIHRoZXNlIHZhbHVlcyBhcmUgcHJlc2VudGVkIGluIG1hdGhlbWF0aWNhbCByZWFzb25hYmxlIGNhbm9uaWNhbAotICogZm9ybSB0aGF0IGhhcyBNU0Igb24gdGhlIGxlZnQgYW5kIExTQiBvbiB0aGUgcmlnaHQuIEluIEJsdWV0b290aCBwYWNrZXRzLAotICogdGhleSBhcmUgbW9zdGx5IHJldmVyc2VkIHRvIGJlIExpdHRsZSBFbmRpYW4gd2hpY2ggaGF2ZSBMU0Igb24gdGhlIGxlZnQgYW5kCi0gKiBNU0Igb24gdGhlIHJpZ2h0LgotICovCi0KLS8vIFJlcXVpcmUgYnRlX2xvZ21zZy5jYyB0byBydW4sIGhlcmUgaXMganVzdCB0byBmYWtlIGl0IGFzIHdlIGRvbid0IGNhcmUgYWJvdXQKLS8vIHRyYWNlIGluIHVuaXQgdGVzdAotdm9pZCBMb2dNc2codWludDMyX3QgdHJhY2Vfc2V0X21hc2ssIGNvbnN0IGNoYXIqIGZtdF9zdHIsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdF9zdHIpOwotICB2cHJpbnRmKGZtdF9zdHIsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci19Ci0KLWV4dGVybiBPY3RldDE2IHNtcF9nZW5fcDFfNF9jb25maXJtKHRTTVBfQ0IqIHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSByZW1vdGVfYmRfYWRkcl90eXBlKTsKLQotZXh0ZXJuIE9jdGV0MTYgc21wX2dlbl9wMl80X2NvbmZpcm0odFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpOwotCi1leHRlcm4gdFNNUF9TVEFUVVMgc21wX2NhbGN1bGF0ZV9jb21maXJtKHRTTVBfQ0IqIHBfY2IsIGNvbnN0IE9jdGV0MTYmIHJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIG91dHB1dCk7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdm9pZCBkdW1wX3VpbnQxMjgoY29uc3QgT2N0ZXQxNiYgYSwgY2hhciogYnVmZmVyKSB7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgT0NURVQxNl9MRU47ICsraSkgewotICAgIHNucHJpbnRmKGJ1ZmZlciwgMywgIiUwMngiLCBhW2ldKTsKLSAgICBidWZmZXIgKz0gMjsKLSAgfQotICAqYnVmZmVyID0gJ1wwJzsKLX0KLQotdm9pZCBkdW1wX3VpbnQxMjhfcmV2ZXJzZShjb25zdCBPY3RldDE2JiBhLCBjaGFyKiBidWZmZXIpIHsKLSAgZm9yIChpbnQgaSA9IChpbnQpKE9DVEVUMTZfTEVOIC0gMSk7IGkgPj0gMDsgLS1pKSB7Ci0gICAgc25wcmludGYoYnVmZmVyLCAzLCAiJTAyeCIsIGFbaV0pOwotICAgIGJ1ZmZlciArPSAyOwotICB9Ci0gICpidWZmZXIgPSAnXDAnOwotfQotCi12b2lkIHByaW50X3VpbnQxMjgoY29uc3QgT2N0ZXQxNiYgYSkgewotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IE9DVEVUMTZfTEVOOyArK2kpIHsKLSAgICBwcmludGYoIiUwMngiLCBhW2ldKTsKLSAgfQotICBwcmludGYoIlxuIik7Ci19Ci0KLU9jdGV0MTYgcGFyc2VfdWludDEyOChjb25zdCBjaGFyKiBpbnB1dCkgewotICBPY3RldDE2IG91dHB1dHswfTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgY291bnQgPSAwOyBjb3VudCA8IE9DVEVUMTZfTEVOOyBjb3VudCsrKSB7Ci0gICAgc3NjYW5mKGlucHV0LCAiJTJoaHgiLCAmb3V0cHV0W2NvdW50XSk7Ci0gICAgaW5wdXQgKz0gMjsKLSAgfQotICByZXR1cm4gb3V0cHV0OwotfQotCi1jbGFzcyBTbXBDYWxjdWxhdGVDb25maXJtVGVzdCA6IHB1YmxpYyBUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHRTTVBfQ0IgcF9jYl87Ci0gIC8vIFNldCByYW5kb20gdG8gMHg1NzgzRDUyMTU2QUQ2RjBFNjM4ODI3NEVDNjcwMkVFMAotICBPY3RldDE2IHJhbmRfezB4NTcsIDB4ODMsIDB4RDUsIDB4MjEsIDB4NTYsIDB4QUQsIDB4NkYsIDB4MEUsCi0gICAgICAgICAgICAgICAgMHg2MywgMHg4OCwgMHgyNywgMHg0RSwgMHhDNiwgMHg3MCwgMHgyRSwgMHhFMH07Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBwX2NiXy50ayA9IHswfTsKLSAgICAvLyBTZXQgcGFpcmluZyByZXF1ZXN0IHBhY2tldCB0byAweDA3MDcxMDAwMDAwMSgwMSkKLSAgICBwX2NiXy5sb2NhbF9pb19jYXBhYmlsaXR5ID0gMHgwMTsKLSAgICBwX2NiXy5sb2Nfb29iX2ZsYWcgPSAweDAwOwotICAgIHBfY2JfLmxvY19hdXRoX3JlcSA9IDB4MDA7Ci0gICAgcF9jYl8ubG9jX2VuY19zaXplID0gMHgxMDsKLSAgICBwX2NiXy5sb2NhbF9pX2tleSA9IDB4MDc7Ci0gICAgcF9jYl8ubG9jYWxfcl9rZXkgPSAweDA3OwotICAgIC8vIFNldCBwYWlyaW5nIHJlc3BvbnNlIHBhY2tldCB0byAweDA1MDAwODAwMDAwMygwMikKLSAgICBwX2NiXy5wZWVyX2lvX2NhcHMgPSAweDAzOwotICAgIHBfY2JfLnBlZXJfb29iX2ZsYWcgPSAweDAwOwotICAgIHBfY2JfLnBlZXJfYXV0aF9yZXEgPSAweDAwOwotICAgIHBfY2JfLnBlZXJfZW5jX3NpemUgPSAweDA4OwotICAgIHBfY2JfLnBlZXJfaV9rZXkgPSAweDAwOwotICAgIHBfY2JfLnBlZXJfcl9rZXkgPSAweDA1OwotICAgIC8vIFNldCByb2xlIHRvIGNlbnRyYWwKLSAgICBwX2NiXy5yb2xlID0gSENJX1JPTEVfQ0VOVFJBTDsKLSAgICBzdGQ6OnJldmVyc2UocmFuZF8uYmVnaW4oKSwgcmFuZF8uZW5kKCkpOwotICB9Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7fQotCi0gcHVibGljOgotfTsKLQotLy8gVGVzdCBzbXBfZ2VuX3AyXzRfY29uZmlybSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbgotVEVTVF9GKFNtcENhbGN1bGF0ZUNvbmZpcm1UZXN0LCB0ZXN0X3NtcF9nZW5fcDJfNF9jb25maXJtX2FzX2NlbnRyYWwpIHsKLSAgLy8gU2V0IGxvY2FsX2JkYSB0byAweEExQTJBM0E0QTVBNgotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkQ29ubmVjdGlvbkFkZHIuYm9keSA9Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCBSYXdBZGRyZXNzJiBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgICAgICAgbG9jYWxfY29ubl9hZGRyID0gUmF3QWRkcmVzcyh7MHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNn0pOwotICAgICAgICAqcF9hZGRyX3R5cGUgPSBCTEVfQUREUl9SQU5ET007Ci0gICAgICB9OwotCi0gIC8vIFNldCByZW1vdGUgYmRhIHRvIDB4QjFCMkIzQjRCNUI2Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkci5ib2R5ID0KLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgICAgICAgY29ubl9hZGRyID0gUmF3QWRkcmVzcyh7MHhCMSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNn0pOwotICAgICAgICAqcF9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfTsKLQotICBSYXdBZGRyZXNzIHJlbW90ZV9iZGE7Ci0gIHRCTEVfQUREUl9UWVBFIHJlbW90ZV9iZF9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gIEJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIocF9jYl8ucGFpcmluZ19iZGEsIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlbW90ZV9iZF9hZGRyX3R5cGUpOwotICBCVE1fUmVhZENvbm5lY3Rpb25BZGRyKHBfY2JfLnBhaXJpbmdfYmRhLCBwX2NiXy5sb2NhbF9iZGEsICZwX2NiXy5hZGRyX3R5cGUpOwotICBPY3RldDE2IHAyID0gc21wX2dlbl9wMl80X2NvbmZpcm0oJnBfY2JfLCByZW1vdGVfYmRhKTsKLSAgLy8gQ29ycmVjdCBwMiBpcyAweDAwMDAwMDAwYTFhMmEzYTRhNWE2YjFiMmIzYjRiNWI2Ci0gIGNvbnN0IGNoYXIgZXhwZWN0ZWRfcDJfc3RyW10gPSAiMDAwMDAwMDBhMWEyYTNhNGE1YTZiMWIyYjNiNGI1YjYiOwotICBjaGFyIHAyX3N0clsyICogT0NURVQxNl9MRU4gKyAxXTsKLSAgZHVtcF91aW50MTI4X3JldmVyc2UocDIsIHAyX3N0cik7Ci0gIEFTU0VSVF9USEFUKHAyX3N0ciwgU3RyRXEoZXhwZWN0ZWRfcDJfc3RyKSk7Ci0KLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fUmVhZENvbm5lY3Rpb25BZGRyID0ge307Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkciA9IHt9OwotfQotCi0vLyBUZXN0IHNtcF9nZW5fcDFfNF9jb25maXJtIGFuZCBhZXNfMTI4IGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uCi1URVNUX0YoU21wQ2FsY3VsYXRlQ29uZmlybVRlc3QsIHRlc3RfYWVzXzEyOF9hc19jZW50cmFsKSB7Ci0gIC8vIFNldCBsb2NhbF9iZGEgdG8gMHhBMUEyQTNBNEE1QTYKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fUmVhZENvbm5lY3Rpb25BZGRyLmJvZHkgPQotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgUmF3QWRkcmVzcyYgbG9jYWxfY29ubl9hZGRyLAotICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gICAgICAgIGxvY2FsX2Nvbm5fYWRkciA9IFJhd0FkZHJlc3MoezB4QTEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTZ9KTsKLSAgICAgICAgKnBfYWRkcl90eXBlID0gQkxFX0FERFJfUkFORE9NOwotICAgICAgfTsKLQotICAvLyBTZXQgcmVtb3RlIGJkYSB0byAweEIxQjJCM0I0QjVCNgotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIuYm9keSA9Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gICAgICAgIGNvbm5fYWRkciA9IFJhd0FkZHJlc3MoezB4QjEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjZ9KTsKLSAgICAgICAgKnBfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH07Ci0KLSAgUmF3QWRkcmVzcyByZW1vdGVfYmRhOwotICB0QkxFX0FERFJfVFlQRSByZW1vdGVfYmRfYWRkcl90eXBlID0gQkxFX0FERFJfUFVCTElDOwotICBCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKHBfY2JfLnBhaXJpbmdfYmRhLCByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZW1vdGVfYmRfYWRkcl90eXBlKTsKLSAgQlRNX1JlYWRDb25uZWN0aW9uQWRkcihwX2NiXy5wYWlyaW5nX2JkYSwgcF9jYl8ubG9jYWxfYmRhLCAmcF9jYl8uYWRkcl90eXBlKTsKLSAgT2N0ZXQxNiBwMSA9IHNtcF9nZW5fcDFfNF9jb25maXJtKCZwX2NiXywgcmVtb3RlX2JkX2FkZHJfdHlwZSk7Ci0gIC8vIENvcnJlY3QgcDEgaXMgMHgwNTAwMDgwMDAwMDMwMjA3MDcxMDAwMDAwMTAxMDAwMQotICBjb25zdCBjaGFyIGV4cGVjdGVkX3AxX3N0cltdID0gIjA1MDAwODAwMDAwMzAyMDcwNzEwMDAwMDAxMDEwMDAxIjsKLSAgY2hhciBwMV9zdHJbMiAqIE9DVEVUMTZfTEVOICsgMV07Ci0gIGR1bXBfdWludDEyOF9yZXZlcnNlKHAxLCBwMV9zdHIpOwotICBBU1NFUlRfVEhBVChwMV9zdHIsIFN0ckVxKGV4cGVjdGVkX3AxX3N0cikpOwotICBzbXBfeG9yXzEyOCgmcDEsIHJhbmRfKTsKLSAgLy8gQ29ycmVjdCBwMSB4b3IgciBpcyAweDUyODNkZDIxNTZhZTZkMDk2NDk4Mjc0ZWM3NzEyZWUxCi0gIGNvbnN0IGNoYXIgZXhwZWN0ZWRfcDFfeG9yX3Jfc3RyW10gPSAiNTI4M2RkMjE1NmFlNmQwOTY0OTgyNzRlYzc3MTJlZTEiOwotICBjaGFyIHAxX3hvcl9yX3N0clsyICogT0NURVQxNl9MRU4gKyAxXTsKLSAgZHVtcF91aW50MTI4X3JldmVyc2UocDEsIHAxX3hvcl9yX3N0cik7Ci0gIEFTU0VSVF9USEFUKHAxX3hvcl9yX3N0ciwgU3RyRXEoZXhwZWN0ZWRfcDFfeG9yX3Jfc3RyKSk7Ci0gIE9jdGV0MTYgb3V0cHV0ID0gY3J5cHRvX3Rvb2xib3g6OmFlc18xMjgocF9jYl8udGssIHAxLmRhdGEoKSwgT0NURVQxNl9MRU4pOwotICBjb25zdCBjaGFyIGV4cGVjdGVkX3AxX3ByaW1lX3N0cltdID0gIjAyYzdhYTJhOTg1N2FjODY2ZmY5MTIzMmRmMGUzYzk1IjsKLSAgY2hhciBwMV9wcmltZV9zdHJbMiAqIE9DVEVUMTZfTEVOICsgMV07Ci0gIGR1bXBfdWludDEyOF9yZXZlcnNlKG91dHB1dCwgcDFfcHJpbWVfc3RyKTsKLSAgQVNTRVJUX1RIQVQocDFfcHJpbWVfc3RyLCBTdHJFcShleHBlY3RlZF9wMV9wcmltZV9zdHIpKTsKLQotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkQ29ubmVjdGlvbkFkZHIgPSB7fTsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyID0ge307Ci19Ci0KLS8vIFRlc3Qgc21wX2NhbGN1bGF0ZV9jb21maXJtIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uCi1URVNUX0YoU21wQ2FsY3VsYXRlQ29uZmlybVRlc3QsIHRlc3Rfc21wX2NhbGN1bGF0ZV9jb21maXJtX2FzX2NlbnRyYWwpIHsKLSAgLy8gU2V0IGxvY2FsX2JkYSB0byAweEExQTJBM0E0QTVBNgotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkQ29ubmVjdGlvbkFkZHIuYm9keSA9Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCBSYXdBZGRyZXNzJiBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgICAgICAgbG9jYWxfY29ubl9hZGRyID0gUmF3QWRkcmVzcyh7MHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNn0pOwotICAgICAgICAqcF9hZGRyX3R5cGUgPSBCTEVfQUREUl9SQU5ET007Ci0gICAgICB9OwotCi0gIC8vIFNldCByZW1vdGUgYmRhIHRvIDB4QjFCMkIzQjRCNUI2Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkci5ib2R5ID0KLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgICAgICAgY29ubl9hZGRyID0gUmF3QWRkcmVzcyh7MHhCMSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNn0pOwotICAgICAgICAqcF9hZGRyX3R5cGUgPSBCTEVfQUREUl9QVUJMSUM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfTsKLQotICBPY3RldDE2IG91dHB1dDsKLSAgdFNNUF9TVEFUVVMgc3RhdHVzID0gc21wX2NhbGN1bGF0ZV9jb21maXJtKCZwX2NiXywgcmFuZF8sICZvdXRwdXQpOwotICBFWFBFQ1RfRVEoc3RhdHVzLCBTTVBfU1VDQ0VTUyk7Ci0gIC8vIENvcnJlY3QgTUNvbmZpcm0gaXMgMHgxZTFlM2ZlZjg3ODk4OGVhZDJhNzRkYzViZWYxM2I4NgotICBjb25zdCBjaGFyIGV4cGVjdGVkX2NvbmZpcm1fc3RyW10gPSAiMWUxZTNmZWY4Nzg5ODhlYWQyYTc0ZGM1YmVmMTNiODYiOwotICBjaGFyIGNvbmZpcm1fc3RyWzIgKiBPQ1RFVDE2X0xFTiArIDFdOwotICBkdW1wX3VpbnQxMjhfcmV2ZXJzZShvdXRwdXQsIGNvbmZpcm1fc3RyKTsKLSAgQVNTRVJUX1RIQVQoY29uZmlybV9zdHIsIFN0ckVxKGV4cGVjdGVkX2NvbmZpcm1fc3RyKSk7Ci0KLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fUmVhZENvbm5lY3Rpb25BZGRyID0ge307Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkciA9IHt9OwotfQotCi0vLyBUZXN0IEVDQyBwb2ludCB2YWxpZGF0aW9uCi1URVNUKFNtcEVjY1ZhbGlkYXRpb25UZXN0LCB0ZXN0X3ZhbGlkX3BvaW50cykgewotICBQb2ludCBwOwotCi0gIC8vIFRlc3QgZGF0YSBmcm9tIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24KLSAgLy8gVmVyc2lvbiA1LjAgfCBWb2wgMiwgUGFydCBHIHwgNy4xLjIKLQotICAvLyBTYW1wbGUgMQotICBwLnhbN10gPSAweDIwYjAwM2QyOwotICBwLnhbNl0gPSAweGYyOTdiZTJjOwotICBwLnhbNV0gPSAweDVlMmM4M2E3OwotICBwLnhbNF0gPSAweGU5ZjlhNWI5OwotICBwLnhbM10gPSAweGVmZjQ5MTExOwotICBwLnhbMl0gPSAweGFjZjRmZGRiOwotICBwLnhbMV0gPSAweGNjMDMwMTQ4OwotICBwLnhbMF0gPSAweDBlMzU5ZGU2OwotCi0gIHAueVs3XSA9IDB4ZGM4MDljNDk7Ci0gIHAueVs2XSA9IDB4NjUyYWViNmQ7Ci0gIHAueVs1XSA9IDB4NjMzMjlhYmY7Ci0gIHAueVs0XSA9IDB4NWE1MjE1NWM7Ci0gIHAueVszXSA9IDB4NzY2MzQ1YzI7Ci0gIHAueVsyXSA9IDB4OGZlZDMwMjQ7Ci0gIHAueVsxXSA9IDB4NzQxYzhlZDA7Ci0gIHAueVswXSA9IDB4MTU4OWQyOGI7Ci0KLSAgRVhQRUNUX1RSVUUoRUNDX1ZhbGlkYXRlUG9pbnQocCkpOwotCi0gIC8vIFNhbXBsZSAyCi0gIHAueFs3XSA9IDB4MmMzMWE0N2I7Ci0gIHAueFs2XSA9IDB4NTc3OTgwOWU7Ci0gIHAueFs1XSA9IDB4ZjQ0Y2I1ZWE7Ci0gIHAueFs0XSA9IDB4YWY1YzNlNDM7Ci0gIHAueFszXSA9IDB4ZDVmOGZhYWQ7Ci0gIHAueFsyXSA9IDB4NGE4Nzk0Y2I7Ci0gIHAueFsxXSA9IDB4OTg3ZTliMDM7Ci0gIHAueFswXSA9IDB4NzQ1Yzc4ZGQ7Ci0KLSAgcC55WzddID0gMHg5MTk1MTIxODsKLSAgcC55WzZdID0gMHgzODk4ZGZiZTsKLSAgcC55WzVdID0gMHhjZDUyZTI0MDsKLSAgcC55WzRdID0gMHg4ZTQzODcxZjsKLSAgcC55WzNdID0gMHhkMDIxMTA5MTsKLSAgcC55WzJdID0gMHgxN2JkM2VkNDsKLSAgcC55WzFdID0gMHhlYWY4NDM3NzsKLSAgcC55WzBdID0gMHg0MzcxNWQ0ZjsKLQotICBFWFBFQ1RfVFJVRShFQ0NfVmFsaWRhdGVQb2ludChwKSk7Ci19Ci0KLVRFU1QoU21wRWNjVmFsaWRhdGlvblRlc3QsIHRlc3RfaW52YWxpZF9wb2ludHMpIHsKLSAgUG9pbnQgcDsKLSAgbXVsdGlwcmVjaXNpb25faW5pdChwLngpOwotICBtdWx0aXByZWNpc2lvbl9pbml0KHAueSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKEVDQ19WYWxpZGF0ZVBvaW50KHApKTsKLQotICAvLyBTYW1wbGUgMQotICBwLnhbN10gPSAweDIwYjAwM2QyOwotICBwLnhbNl0gPSAweGYyOTdiZTJjOwotICBwLnhbNV0gPSAweDVlMmM4M2E3OwotICBwLnhbNF0gPSAweGU5ZjlhNWI5OwotICBwLnhbM10gPSAweGVmZjQ5MTExOwotICBwLnhbMl0gPSAweGFjZjRmZGRiOwotICBwLnhbMV0gPSAweGNjMDMwMTQ4OwotICBwLnhbMF0gPSAweDBlMzU5ZGU2OwotCi0gIEVYUEVDVF9GQUxTRShFQ0NfVmFsaWRhdGVQb2ludChwKSk7Ci0KLSAgcC55WzddID0gMHhkYzgwOWM0OTsKLSAgcC55WzZdID0gMHg2NTJhZWI2ZDsKLSAgcC55WzVdID0gMHg2MzMyOWFiZjsKLSAgcC55WzRdID0gMHg1YTUyMTU1YzsKLSAgcC55WzNdID0gMHg3NjYzNDVjMjsKLSAgcC55WzJdID0gMHg4ZmVkMzAyNDsKLSAgcC55WzFdID0gMHg3NDFjOGVkMDsKLSAgcC55WzBdID0gMHgxNTg5ZDI4YjsKLQotICBwLnlbMF0tLTsKLQotICBFWFBFQ1RfRkFMU0UoRUNDX1ZhbGlkYXRlUG9pbnQocCkpOwotfQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3Rlc3QvQW5kcm9pZC5icCBiL3Rlc3QvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5NWJlMC4uMDAwMDAwMAotLS0gYS90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotc3ViZGlycyA9IFsKLSAgICAicm9vdGNhbmFsIiwKLSAgICAic3VpdGUiLAotXQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0J0YUFnIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9hZ18qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0J0YUFyIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9hci5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFBdiIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGFfYXZfKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFDc2lzIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9jc2lzKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFEbSIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGFfZG1fKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFHYXR0IiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9nYXR0Ki5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFHcm91cHMiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfYnRhX2dyb3VwcyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrQnRhSGQiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfYnRhX2hkKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFIZWFyaW5nQWlkIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9oZWFyaW5nX2FpZC5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFIZiIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGFfaGYqLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0J0YUhoIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9oaCouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrQnRhSnYiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfYnRhX2p2XyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrQnRhTGVBdWRpbyIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGFfbGVhdWRpbyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gIG5hbWU6ICJUZXN0TW9ja0J0YUxlQXVkaW9IYWxWZXJpZmllciIsCi0gIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfbGVfYXVkaW9faGFsX3ZlcmlmaWVyLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFQYW4iLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfYnRhX3Bhbl8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0J0YVNkcCIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGFfc2RwXyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrQnRhU3lzIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2J0YV9zeXNfKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tCdGFWYyIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGFfdmMqLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0J0YSIsCi0gICAgc3JjczogWwotICAgICAgIjpUZXN0TW9ja0J0YUFnIiwKLSAgICAgICI6VGVzdE1vY2tCdGFBciIsCi0gICAgICAiOlRlc3RNb2NrQnRhQXYiLAotICAgICAgIjpUZXN0TW9ja0J0YUNzaXMiLAotICAgICAgIjpUZXN0TW9ja0J0YURtIiwKLSAgICAgICI6VGVzdE1vY2tCdGFHYXR0IiwKLSAgICAgICI6VGVzdE1vY2tCdGFHcm91cHMiLAotICAgICAgIjpUZXN0TW9ja0J0YUhkIiwKLSAgICAgICI6VGVzdE1vY2tCdGFIZWFyaW5nQWlkIiwKLSAgICAgICI6VGVzdE1vY2tCdGFIZiIsCi0gICAgICAiOlRlc3RNb2NrQnRhSGgiLAotICAgICAgIjpUZXN0TW9ja0J0YUp2IiwKLSAgICAgICI6VGVzdE1vY2tCdGFMZUF1ZGlvIiwKLSAgICAgICI6VGVzdE1vY2tCdGFMZUF1ZGlvSGFsVmVyaWZpZXIiLAotICAgICAgIjpUZXN0TW9ja0J0YVBhbiIsCi0gICAgICAiOlRlc3RNb2NrQnRhU2RwIiwKLSAgICAgICI6VGVzdE1vY2tCdGFTeXMiLAotICAgICAgIjpUZXN0TW9ja0J0YVZjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja01haW5TaGltIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX21haW5fc2hpbSouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrQ29tbW9uIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2NvbW1vbl8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja1N0YWNrQTJkcCIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19zdGFja19hMmRwXyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrU3RhY2tMMmNhcCIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19zdGFja19sMmNhcF8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja1N0YWNrIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrXyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrSGNpIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2hjaV8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0ZyYW1ld29ya3MiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfZnJhbWV3b3Jrc18qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0J0Y29yZSIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19idGNvcmVfKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tTeXN0ZW1MaWJmbXEiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfc3lzdGVtX2xpYmZtcV8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja1VkcnYiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfdWRydl8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0FuZHJvaWRIYXJkd2FyZSIsCi0gICAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19hbmRyb2lkX2hhcmR3YXJlXyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIlRlc3RNb2NrRGV2aWNlIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2RldmljZV8qLmNjIiwKLSAgICBdLAotfQotCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJUZXN0TW9ja0xlZ2FjeUhjaUNvbW1hbmRzIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2hjaWNfKi5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tNYWluU2hpbUVudHJ5IiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX21haW5fc2hpbV9lbnRyeS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAiVGVzdE1vY2tNYWluU2hpbUZsYWdzIiwKLSAgICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX21haW5fc2hpbS5jYyIsCi0gICAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RNb2NrQnRpZiIsCi0gIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfYnRpZiouY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tTdGFja1NkcCIsCi0gIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfc3RhY2tfc2RwKi5jYyIsCi0gIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gIG5hbWU6ICJUZXN0TW9ja1N0YWNrQnRtIiwKLSAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19zdGFja19idG0qLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RTdHViTGVnYWN5VHJhY2UiLAotICBzcmNzOiBbCi0gICAgICAic3R1Yi9sZWdhY3lfdHJhY2UuY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdFN0dWJPc2kiLAotICBzcmNzOiBbCi0gICAgICAic3R1Yi9vc2kuY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tPc2kiLAotICAgIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfb3NpXyouY2MiLAotICAgIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gIG5hbWU6ICJUZXN0TW9ja1N0YWNrQWNsIiwKLSAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19zdGFja19hY2wqLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RNb2NrU3RhY2tTbXAiLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrX3NtcCouY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tTdGFja01ldHJpY3MiLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrX21ldHJpY3MqLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RNb2NrU3RhY2tHYXAiLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrX2dhcCouY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tTdGFja0dhdHQiLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrX2dhdHQqLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RNb2NrU3RhY2tCdHUiLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrX2J0dSouY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tNYWluQnRlIiwKLSAgc3JjczogWwotICAgICAgIm1vY2svbW9ja19tYWluX2J0ZSouY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tTdGFja0NyeXB0b3Rvb2xib3giLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX3N0YWNrX2NyeXB0b190b29sYm94Ki5jYyIsCi0gIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gIG5hbWU6ICJUZXN0TW9ja0J0dSIsCi0gIHNyY3M6IFsKLSAgICAgICJtb2NrL21vY2tfYnR1XypjYyIsCi0gIF0sCi19Ci0KLWZpbGVncm91cCB7Ci0gIG5hbWU6ICJUZXN0TW9ja1V0aWxzIiwKLSAgc3JjczogWwotICAgICAgIm1vY2svbW9ja191dGlsc18qY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdENvbW1vbk1vY2tGdW5jdGlvbnMiLAotICBzcmNzOiBbCi0gICAgICAiY29tbW9uL21vY2tfZnVuY3Rpb25zLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RDb21tb25NYWluSGFuZGxlciIsCi0gIHNyY3M6IFsKLSAgICAgICJjb21tb24vbWFpbl9oYW5kbGVyLmNjIiwKLSAgXSwKLX0KLQotZmlsZWdyb3VwIHsKLSAgbmFtZTogIlRlc3RDb21tb25Jbml0RmxhZ3MiLAotICBzcmNzOiBbCi0gICAgICAiY29tbW9uL2luaXRfZmxhZ3MuY2MiLAotICBdLAotfQotCi1maWxlZ3JvdXAgewotICBuYW1lOiAiVGVzdE1vY2tCbHVldG9vdGhJbnRlcmZhY2UiLAotICBzcmNzOiBbCi0gICAgICAibW9jay9tb2NrX2JsdWV0b290aF9pbnRlcmZhY2UuY2MiLAotICBdLAotfQpkaWZmIC0tZ2l0IGEvdGVzdC9SRUFETUUubWQgYi90ZXN0L1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3MmYzMC4uMDAwMDAwMAotLS0gYS90ZXN0L1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMgRmx1b3JpZGUgQmx1ZXRvb3RoIFRlc3RzCi0KLVRoaXMgZG9jdW1lbnQgcmVmZXJzIHRvIHRoZSB0ZXN0cyBpbiB0aGUgc3lzdGVtL2J0L3Rlc3QgZGlyZWN0b3J5LgotCi1UaGUgdGVzdHMgYXJlIGRlc2lnbmVkIHRvIGJlIHJ1biB3aGVuIHRoZSBBbmRyb2lkIHJ1bnRpbWUgaXMgbm90IHJ1bm5pbmcuICBGcm9tIGEgdGVybWluYWwsIHJ1bjoKLQotIyMgQmVmb3JlIHlvdSBydW4gdGVzdHMKLWBgYHNoCi1hZGIgc2hlbGwgc3RvcAotYGBgCi0KLSMjIEFmdGVyIHlvdSdyZSBkb25lCi1gYGBzaAotYWRiIHNoZWxsIHN0YXJ0Ci1gYGAKLQotIyMgUnVubmluZyB0ZXN0cwotVGhlbiBzZWUgd2hhdCBvcHRpb25zIHRoZSB0ZXN0IHNjcmlwdCBwcm92aWRlczoKLQotYGBgc2gKLS4vcnVuX3VuaXRfdGVzdHMuc2ggLS1oZWxwCi1gYGAKLQotQnV0IGZvciB0aGUgaW1wYXRpZW50LCBydW4gc3BlY2lmaWMgZ3JvdXBzIG9mIHRlc3RzIGxpa2UgdGhpczoKLQotYGBgc2gKLS4vcnVuX3VuaXRfdGVzdHMuc2ggbmV0X3Rlc3RfYmx1ZXRvb3RoCi1gYGAKLQotYSBzaW5nbGUgdGVzdDoKLQotYGBgc2gKLS4vcnVuX3VuaXRfdGVzdHMuc2ggbmV0X3Rlc3RfYmx1ZXRvb3RoLkJsdWV0b290aFRlc3QuQWRhcHRlclJlcGVhdGVkRW5hYmxlRGlzYWJsZQotYGBgCi0KLSMjIFNhbXBsZSBPdXRwdXQKLQotc3lzdGVtL2J0L3Rlc3QkIC4vcnVuX3VuaXRfdGVzdHMuc2ggbmV0X3Rlc3RfYmx1ZXRvb3RoICAKLS0tLSBuZXRfdGVzdF9ibHVldG9vdGggLS0tICAKLXB1c2hpbmcuLi4gIAotL3RiZC9hb3NwLW1hc3Rlci9vdXQvdGFyZ2V0L3Byb2R1Y3QvYnVsbGhlYWQvZGF0YS9uYXRpdmV0ZXN0L24uLi5zdF9ibHVldG9vdGg6IDEgZmlsZSBwdXNoZWQuIDkuMiBNQi9zICgyMTE4MzIgYnl0ZXMgaW4gMC4wMjJzKSAgCi1ydW5uaW5nLi4uICAKLSAgCi1SdW5uaW5nIG1haW4oKSBmcm9tIGd0ZXN0X21haW4uY2MgIAotWz09PT09PT09PT1dIFJ1bm5pbmcgMTEgdGVzdHMgZnJvbSAyIHRlc3QgY2FzZXMuICAKLVstLS0tLS0tLS0tXSBHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuICAKLVstLS0tLS0tLS0tXSA2IHRlc3RzIGZyb20gQmx1ZXRvb3RoVGVzdCAgCi1bIFJVTiAgICAgIF0gQmx1ZXRvb3RoVGVzdC5BZGFwdGVyRW5hYmxlRGlzYWJsZSAgCi1bICAgICAgIE9LIF0gQmx1ZXRvb3RoVGVzdC5BZGFwdGVyRW5hYmxlRGlzYWJsZSAoMjUzOCBtcykgIAotWyBSVU4gICAgICBdIEJsdWV0b290aFRlc3QuQWRhcHRlclJlcGVhdGVkRW5hYmxlRGlzYWJsZSAgCi1bICAgICAgIE9LIF0gQmx1ZXRvb3RoVGVzdC5BZGFwdGVyUmVwZWF0ZWRFbmFibGVEaXNhYmxlICgxMTM4NCBtcykgIAotWyBSVU4gICAgICBdIEJsdWV0b290aFRlc3QuQWRhcHRlclNldEdldE5hbWUgIAotWyAgICAgICBPSyBdIEJsdWV0b290aFRlc3QuQWRhcHRlclNldEdldE5hbWUgKDIzNzggbXMpICAKLVsgUlVOICAgICAgXSBCbHVldG9vdGhUZXN0LkFkYXB0ZXJTdGFydERpc2NvdmVyeSAgCi1bICAgICAgIE9LIF0gQmx1ZXRvb3RoVGVzdC5BZGFwdGVyU3RhcnREaXNjb3ZlcnkgKDIzOTcgbXMpICAKLVsgUlVOICAgICAgXSBCbHVldG9vdGhUZXN0LkFkYXB0ZXJDYW5jZWxEaXNjb3ZlcnkgIAotWyAgICAgICBPSyBdIEJsdWV0b290aFRlc3QuQWRhcHRlckNhbmNlbERpc2NvdmVyeSAoMjQwMSBtcykgIAotWyBSVU4gICAgICBdIEJsdWV0b290aFRlc3QuQWRhcHRlckRpc2FibGVEdXJpbmdCb25kaW5nICAKLVsgICAgICAgT0sgXSBCbHVldG9vdGhUZXN0LkFkYXB0ZXJEaXNhYmxlRHVyaW5nQm9uZGluZyAoMTE2ODkgbXMpICAKLVstLS0tLS0tLS0tXSA2IHRlc3RzIGZyb20gQmx1ZXRvb3RoVGVzdCAoMzI3ODkgbXMgdG90YWwpICAKLQotWy0tLS0tLS0tLS1dIDUgdGVzdHMgZnJvbSBHYXR0VGVzdCAgCi1bIFJVTiAgICAgIF0gR2F0dFRlc3QuR2F0dENsaWVudFJlZ2lzdGVyICAKLVsgICAgICAgT0sgXSBHYXR0VGVzdC5HYXR0Q2xpZW50UmVnaXN0ZXIgKDIzNzAgbXMpICAKLVsgUlVOICAgICAgXSBHYXR0VGVzdC5HYXR0Q2xpZW50U2NhblJlbW90ZURldmljZSAgCi1bICAgICAgIE9LIF0gR2F0dFRlc3QuR2F0dENsaWVudFNjYW5SZW1vdGVEZXZpY2UgKDIyNzMgbXMpICAKLVsgUlVOICAgICAgXSBHYXR0VGVzdC5HYXR0Q2xpZW50QWR2ZXJ0aXNlICAKLVsgICAgICAgT0sgXSBHYXR0VGVzdC5HYXR0Q2xpZW50QWR2ZXJ0aXNlICgyMjM2IG1zKSAgCi1bIFJVTiAgICAgIF0gR2F0dFRlc3QuR2F0dFNlcnZlclJlZ2lzdGVyICAKLVsgICAgICAgT0sgXSBHYXR0VGVzdC5HYXR0U2VydmVyUmVnaXN0ZXIgKDIzOTEgbXMpICAKLVsgUlVOICAgICAgXSBHYXR0VGVzdC5HYXR0U2VydmVyQnVpbGQgIAotWyAgICAgICBPSyBdIEdhdHRUZXN0LkdhdHRTZXJ2ZXJCdWlsZCAoMjQzNSBtcykgIAotWy0tLS0tLS0tLS1dIDUgdGVzdHMgZnJvbSBHYXR0VGVzdCAoMTE3MDYgbXMgdG90YWwpICAKLSAgCi1bLS0tLS0tLS0tLV0gR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duICAKLVs9PT09PT09PT09XSAxMSB0ZXN0cyBmcm9tIDIgdGVzdCBjYXNlcyByYW4uICg0NDQ5NSBtcyB0b3RhbCkgIAotWyAgUEFTU0VEICBdIDExIHRlc3RzLiAgCi0KLSMjIFRyb3VibGVzaG9vdGluZzogWW91ciBwaG9uZSBpcyBicmlja2VkIQotUHJvYmFibHkgbm90LiAgU2VlIFtBZnRlciB5b3UncmUgZG9uZV0oI0FmdGVyLXlvdSdyZS1kb25lKQotCmRpZmYgLS1naXQgYS90ZXN0L2NvbW1vbi9pbml0X2ZsYWdzLmNjIGIvdGVzdC9jb21tb24vaW5pdF9mbGFncy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4NTg1Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2NvbW1vbi9pbml0X2ZsYWdzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2luaXRfZmxhZ3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotYm9vbCBJbml0RmxhZ3M6OmxvZ2dpbmdfZGVidWdfZW5hYmxlZF9mb3JfYWxsID0gZmFsc2U7Ci1zdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGJvb2w+Ci0gICAgSW5pdEZsYWdzOjpsb2dnaW5nX2RlYnVnX2V4cGxpY2l0X3RhZ19zZXR0aW5ncyA9IHt9Owotdm9pZCBJbml0RmxhZ3M6OkxvYWQoY29uc3QgY2hhcioqIGZsYWdzKSB7fQotdm9pZCBJbml0RmxhZ3M6OlNldEFsbChib29sIHZhbHVlKSB7Ci0gIEluaXRGbGFnczo6bG9nZ2luZ19kZWJ1Z19lbmFibGVkX2Zvcl9hbGwgPSB2YWx1ZTsKLX0KLXZvaWQgSW5pdEZsYWdzOjpTZXRBbGxGb3JUZXN0aW5nKCkgewotICBJbml0RmxhZ3M6OmxvZ2dpbmdfZGVidWdfZW5hYmxlZF9mb3JfYWxsID0gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9jb21tb24vbWFpbl9oYW5kbGVyLmNjIGIvdGVzdC9jb21tb24vbWFpbl9oYW5kbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNjMzQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY29tbW9uL21haW5faGFuZGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrX2ZvcndhcmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS90aW1lL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotdXNpbmcgYmx1ZXRvb3RoOjpjb21tb246Ok1lc3NhZ2VMb29wVGhyZWFkOwotdXNpbmcgQnRNYWluQ2xvc3VyZSA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPjsKLQotbmFtZXNwYWNlIHsKLQotTWVzc2FnZUxvb3BUaHJlYWQgbWFpbl90aHJlYWQoImJ0X3Rlc3RfbWFpbl90aHJlYWQiLCB0cnVlKTsKLXZvaWQgZG9fcG9zdF9vbl9idF9tYWluKEJ0TWFpbkNsb3N1cmUgY2xvc3VyZSkgeyBjbG9zdXJlKCk7IH0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJ0X3N0YXR1c190IGRvX2luX21haW5fdGhyZWFkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrKSB7Ci0gIEFTU0VSVF9MT0cobWFpbl90aHJlYWQuRG9JblRocmVhZChmcm9tX2hlcmUsIHN0ZDo6bW92ZSh0YXNrKSksCi0gICAgICAgICAgICAgIlVuYWJsZSB0byBydW4gb24gbWFpbiB0aHJlYWQiKTsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1idF9zdGF0dXNfdCBkb19pbl9tYWluX3RocmVhZF9kZWxheWVkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZGVsYXkpIHsKLSAgQVNTRVJUX0xPRyghbWFpbl90aHJlYWQuRG9JblRocmVhZERlbGF5ZWQoZnJvbV9oZXJlLCBzdGQ6Om1vdmUodGFzayksIGRlbGF5KSwKLSAgICAgICAgICAgICAiVW5hYmxlIHRvIHJ1biBvbiBtYWluIHRocmVhZCBkZWxheWVkIik7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotdm9pZCBwb3N0X29uX2J0X21haW4oQnRNYWluQ2xvc3VyZSBjbG9zdXJlKSB7Ci0gIEFTU0VSVChkb19pbl9tYWluX3RocmVhZCgKLSAgICAgICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoZG9fcG9zdF9vbl9idF9tYWluLCBzdGQ6Om1vdmUoY2xvc3VyZSkpKSA9PQotICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi12b2lkIG1haW5fdGhyZWFkX3N0YXJ0X3VwKCkgewotICBtYWluX3RocmVhZC5TdGFydFVwKCk7Ci0gIEFTU0VSVF9MT0cobWFpbl90aHJlYWQuSXNSdW5uaW5nKCksCi0gICAgICAgICAgICAgIlVuYWJsZSB0byBzdGFydCBtZXNzYWdlIGxvb3Agb24gbWFpbiB0aHJlYWQiKTsKLX0KLQotdm9pZCBtYWluX3RocmVhZF9zaHV0X2Rvd24oKSB7IG1haW5fdGhyZWFkLlNodXREb3duKCk7IH0KLQotLy8gb3NpX2FsYXJtCi1ibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQqIGdldF9tYWluX3RocmVhZCgpIHsgcmV0dXJuICZtYWluX3RocmVhZDsgfQotCi1pbnQgc3luY190aW1lb3V0X2luX21zID0gMzAwMDsKLQotdm9pZCBzeW5jX21haW5faGFuZGxlcigpIHsKLSAgc3RkOjpwcm9taXNlIHByb21pc2UgPSBzdGQ6OnByb21pc2U8dm9pZD4oKTsKLSAgc3RkOjpmdXR1cmUgZnV0dXJlID0gcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0gIHBvc3Rfb25fYnRfbWFpbihbJnByb21pc2VdKCkgeyBwcm9taXNlLnNldF92YWx1ZSgpOyB9KTsKLSAgZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc3luY190aW1lb3V0X2luX21zKSk7Ci19OwotCi1ib29sIGlzX29uX21haW5fdGhyZWFkKCkgewotICAvLyBQdGhyZWFkcyBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2YgYSB0aHJlYWQgSUQsIHNvIHdlIGhhdmUgdG8gcmVhY2ggZG93bgotICAvLyBpbnRvIHRoZSBrZXJuZWwuCi0jaWYgZGVmaW5lZChPU19NQUNPU1gpCi0gIHJldHVybiBtYWluX3RocmVhZC5HZXRUaHJlYWRJZCgpID09IHB0aHJlYWRfbWFjaF90aHJlYWRfbnAocHRocmVhZF9zZWxmKCkpOwotI2VsaWYgZGVmaW5lZChPU19MSU5VWCkKLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPiAvKiBGb3IgU1lTX3h4eCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotICByZXR1cm4gbWFpbl90aHJlYWQuR2V0VGhyZWFkSWQoKSA9PSBzeXNjYWxsKF9fTlJfZ2V0dGlkKTsKLSNlbGlmIGRlZmluZWQoT1NfQU5EUk9JRCkKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSAgcmV0dXJuIG1haW5fdGhyZWFkLkdldFRocmVhZElkKCkgPT0gZ2V0dGlkKCk7Ci0jZWxzZQotICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICJVbmFibGUgdG8gZGV0ZXJtaW5lIGlmIG9uIG1haW4gdGhyZWFkIjsKLSAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY29tbW9uL21haW5faGFuZGxlci5oIGIvdGVzdC9jb21tb24vbWFpbl9oYW5kbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjJjNGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9jb21tb24vbWFpbl9oYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL3RpbWUvdGltZS5oPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotCi11c2luZyBibHVldG9vdGg6OmNvbW1vbjo6TWVzc2FnZUxvb3BUaHJlYWQ7Ci11c2luZyBCdE1haW5DbG9zdXJlID0gc3RkOjpmdW5jdGlvbjx2b2lkKCk+OwotCi1idF9zdGF0dXNfdCBkb19pbl9tYWluX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNsb3N1cmUgdGFzayk7Ci1idF9zdGF0dXNfdCBkb19pbl9tYWluX3RocmVhZF9kZWxheWVkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZGVsYXkpOwotdm9pZCBwb3N0X29uX2J0X21haW4oQnRNYWluQ2xvc3VyZSBjbG9zdXJlKTsKLXZvaWQgbWFpbl90aHJlYWRfc3RhcnRfdXAoKTsKLXZvaWQgbWFpbl90aHJlYWRfc2h1dF9kb3duKCk7Ci1leHRlcm4gaW50IHN5bmNfdGltZW91dF9pbl9tczsKLXZvaWQgc3luY19tYWluX2hhbmRsZXIoKTsKLWJsdWV0b290aDo6Y29tbW9uOjpNZXNzYWdlTG9vcFRocmVhZCogZ2V0X21haW5fdGhyZWFkKCk7Ci1ib29sIGlzX29uX21haW5fdGhyZWFkKCk7CmRpZmYgLS1naXQgYS90ZXN0L2NvbW1vbi9tb2NrX2Z1bmN0aW9ucy5jYyBiL3Rlc3QvY29tbW9uL21vY2tfZnVuY3Rpb25zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMwZDFlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY29tbW9uL21vY2tfZnVuY3Rpb25zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInRlc3QvY29tbW9uL21vY2tfZnVuY3Rpb25zLmgiCi0KLXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi12b2lkIGR1bXBfbW9ja19mdW5jdGlvbl9jb3VudF9tYXAoKSB7Ci0gIExPR19JTkZPKCJNb2NrIGZ1bmN0aW9uIGNvdW50IG1hcCBzaXplOiV6dSIsIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwLnNpemUoKSk7Ci0KLSAgZm9yIChhdXRvIGl0IDogbW9ja19mdW5jdGlvbl9jb3VudF9tYXApIHsKLSAgICBMT0dfSU5GTygiZnVuY3Rpb246JXM6IGNhbGxfY291bnQ6JWQiLCBpdC5maXJzdC5jX3N0cigpLCBpdC5zZWNvbmQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NvbW1vbi9tb2NrX2Z1bmN0aW9ucy5oIGIvdGVzdC9jb21tb24vbW9ja19mdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4OWI4Ni4uMDAwMDAwMAotLS0gYS90ZXN0L2NvbW1vbi9tb2NrX2Z1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLXZvaWQgZHVtcF9tb2NrX2Z1bmN0aW9uX2NvdW50X21hcCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9nZW5fY292ZXJhZ2UucHkgYi90ZXN0L2dlbl9jb3ZlcmFnZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg3YTkwYS4uMDAwMDAwMAotLS0gYS90ZXN0L2dlbl9jb3ZlcmFnZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQganNvbgotaW1wb3J0IG9zCi1pbXBvcnQgc2h1dGlsCi1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cwotaW1wb3J0IHdlYmJyb3dzZXIKLQotZnJvbSBydW5faG9zdF91bml0X3Rlc3RzIGltcG9ydCAqCi0iIiIKLVRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSBjb3ZlcmFnZSByZXN1bHRzIGhvc3Qgc3VwcG9ydGVkIGxpYnJhcmllcy4KLVRoZSBzY3JpcHQgYnkgZGVmYXVsdCB3aWxsIGdlbmVyYXRlIGFuIGh0bWwgcmVwb3J0IHRoYXQgc3VtbWFyaXplcyB0aGUgY292ZXJhZ2UKLXJlc3VsdHMgb2YgdGhlIHNwZWNpZmllZCB0ZXN0cy4gVGhlIHJlc3VsdHMgY2FuIGFsc28gYmUgYnJvd3NlZCB0byBwcm92aWRlIGEKLXJlcG9ydCBvZiB3aGljaCBsaW5lcyBoYXZlIGJlZW4gdHJhdmVsZWQgdXBvbiBleGVjdXRpb24gb2YgdGhlIGJpbmFyeS4KLQotTk9URTogQ29kZSB0aGF0IGlzIGNvbXBpbGVkIG91dCBvciBoaWRkZW4gYnkgYSAjREVGSU5FIHdpbGwgYmUgbGlzdGVkIGFzCi1oYXZpbmcgYmVlbiBleGVjdXRlZCAwIHRpbWVzLCB0aHVzIHJlZHVjaW5nIG92ZXJhbGwgY292ZXJhZ2UuCi0KLVRoZSBzdGVwcyBpbiBvcmRlciB0byBhZGQgY292ZXJhZ2Ugc3VwcG9ydCB0byBhIG5ldyBsaWJyYXJ5IGFuZCBpdHMKLWNvcnJpc3BvbmRpbmcgaG9zdCB0ZXN0IGFyZSBhcyBmb2xsb3dzLgotCi0xLiBBZGQgImNsYW5nX2ZpbGVfY292ZXJhZ2UiIChkZWZpbmVkIGluIC8vYnVpbGQvQW5kcm9pZC5icCkgYXMgYSBkZWZhdWx0IHRvIHRoZQotICAgc291cmNlIGxpYnJhcnkocykgeW91IHdhbnQgc3RhdGlzdGljcyBmb3IuCi0gICBOT1RFOiBGb3Jnb2luZyB0aGlzIGRlZmF1bHQgd2lsbCBjYXVzZSBubyBjb3ZlcmFnZSBkYXRhIHRvIGJlIGdlbmVyYXRlZCBmb3IKLSAgICAgICAgIHRoZSBzb3VyY2UgZmlsZXMgaW4gdGhlIGxpYnJhcnkuCi0KLTIuIEFkZCAiY2xhbmdfY292ZXJhZ2VfYmluIiBhcyBhIGRlZmF1bHQgdG8gdGhlIGhvc3Qgc3VwcG9ydGVkIHRlc3QgYmluYXJ5IHRoYXQKLSAgIGV4Y2VyY2lzZXMgdGhlIGxpYnJhcmllcyB0aGF0IHlvdSBjb3ZlcmVkIGluIHN0ZXAgMS4KLSAgIE5PVEU6IEZvcmdldHRpbmcgdG8gYWRkIHRoaXMgd2lsbCBjYXVzZSB0aGVyZSB0byBiZSAqTk8qIGNvdmVyYWdlIGRhdGEKLSAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHRoZSBiaW5hcnkgaXMgcnVuLgotCi0zLiBBZGQgdGhlIGhvc3QgdGVzdCBiaW5hcnkgbmFtZSBhbmQgdGhlIGZpbGVzL2RpcmVjdG9yaWVzIHlvdSB3YW50IGNvdmVyYWdlCi0gICBzdGF0aXN0aWNzIGZvciB0byB0aGUgQ09WRVJBR0VfVEVTVFMgdmFyaWFibGUgZGVmaW5lZCBiZWxvdy4gWW91IG1heSBhZGQKLSAgIGluZGl2aWR1YWwgZmlsZW5hbWVzIG9yIGEgZGlyZWN0b3J5IHRvIGJlIHRlc3RlZC4KLSAgIE5PVEU6IEF2b2lkIHVzaW5nIGEgLyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY292ZXJlZF9maWxlcyBlbnRyeSBhcyB0aGlzCi0gICAgICAgICBicmVha3MgaG93IHRoZSBjb3ZlcmFnZSBnZW5lcmF0b3IgcmVzb2x2ZXMgZmlsZW5hbWVzLgotCi1UT0RPOiBTdXBwb3J0IGdlbmVyYXRpbmcgWE1MIGRhdGEgYW5kIHByaW50aW5nIHJlc3VsdHMgdG8gc3RhbmRhcmQgb3V0LgotIiIiCi0KLUNPVkVSQUdFX1RFU1RTID0gWwotICAgIHsKLSAgICAgICAgInRlc3RfbmFtZSI6ICJuZXRfdGVzdF9hdnJjcCIsCi0gICAgICAgICJjb3ZlcmVkX2ZpbGVzIjogWwotICAgICAgICAgICAgInN5c3RlbS9idC9wcm9maWxlL2F2cmNwIiwKLSAgICAgICAgXSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgInRlc3RfbmFtZSI6ICJibHVldG9vdGhfdGVzdF9zZHAiLAotICAgICAgICAiY292ZXJlZF9maWxlcyI6IFsKLSAgICAgICAgICAgICJzeXN0ZW0vYnQvcHJvZmlsZS9zZHAiLAotICAgICAgICBdLAotICAgIH0sCi0gICAgewotICAgICAgICAidGVzdF9uYW1lIjogInRlc3QtdmVuZG9yX3Rlc3RfaG9zdCIsCi0gICAgICAgICJjb3ZlcmVkX2ZpbGVzIjogWwotICAgICAgICAgICAgInN5c3RlbS9idC92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvaW5jbHVkZSIsCi0gICAgICAgICAgICAic3lzdGVtL2J0L3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zcmMiLAotICAgICAgICBdLAotICAgIH0sCi0gICAgewotICAgICAgICAidGVzdF9uYW1lIjogInJvb3RjYW5hbC1wYWNrZXRzX3Rlc3RfaG9zdCIsCi0gICAgICAgICJjb3ZlcmVkX2ZpbGVzIjogWwotICAgICAgICAgICAgInN5c3RlbS9idC92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvcGFja2V0cyIsCi0gICAgICAgIF0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICJ0ZXN0X25hbWUiOiAiYmx1ZXRvb3RoX3Rlc3RfY29tbW9uIiwKLSAgICAgICAgImNvdmVyZWRfZmlsZXMiOiBbCi0gICAgICAgICAgICAic3lzdGVtL2J0L2NvbW1vbiIsCi0gICAgICAgIF0sCi0gICAgfSwKLV0KLQotV09SS0lOR19ESVIgPSAnL3RtcC9jb3ZlcmFnZScKLVNPT05HX1VJX0JBU0ggPSAnYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCcKLUxMVk1fRElSID0gJ3ByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yMzUzOTgzYi9iaW4nCi1MTFZNX01FUkdFID0gTExWTV9ESVIgKyAnL2xsdm0tcHJvZmRhdGEnCi1MTFZNX0NPViA9IExMVk1fRElSICsgJy9sbHZtLWNvdicKLQotCi1kZWYgd3JpdGVfcm9vdF9odG1sX2hlYWQoZik6Ci0gICAgIyBXcml0ZSB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHJvb3QgaHRtbCBmaWxlLiBUaGlzIHdhcyBwdWxsZWQgZnJvbSB0aGUKLSAgICAjIHBhZ2Ugc291cmNlIG9mIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGh0bWwgZmlsZXMuCi0gICAgZi53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGhlYWQ+IiBcCi0gICAgICAiPG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEnPjxtZXQiIFwKLSAgICAgICJhIGNoYXJzZXQ9J1VURi04Jz48bGluayByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJyBocmVmPSdzdHlsZS5jcyIgXAotICAgICAgInMnPjwvaGVhZD48Ym9keT48aDI+Q292ZXJhZ2UgUmVwb3J0PC9oMj48aDQ+Q3JlYXRlZDogIiArCi0gICAgICBzdHIoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoJyVZLSVtLSVkICVIOiVNJykpICsKLSAgICAgICI8L2g0PjxwPkNsaWNrIDxhIGhyZWY9J2h0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL1NvdXJjZUJhc2VkQ29kZUNvdmVyYSIgXAotICAgICAgImdlLmh0bWwjaW50ZXJwcmV0aW5nLXJlcG9ydHMnPmhlcmU8L2E+IGZvciBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcnByZXRpIiBcCi0gICAgICAibmcgdGhpcyByZXBvcnQuPC9wPjxkaXYgY2xhc3M9J2NlbnRlcmVkJz48dGFibGU+PHRyPjx0ZCBjbGFzcz0nY29sdW1uLWUiIFwKLSAgICAgICJudHJ5LWJvbGQnPkZpbGVuYW1lPC90ZD48dGQgY2xhc3M9J2NvbHVtbi1lbnRyeS1ib2xkJz5GdW5jdGlvbiBDb3ZlcmFnZSIgXAotICAgICAgIjwvdGQ+PHRkIGNsYXNzPSdjb2x1bW4tZW50cnktYm9sZCc+SW5zdGFudGlhdGlvbiBDb3ZlcmFnZTwvdGQ+PHRkIGNsYXNzIiBcCi0gICAgICAiPSdjb2x1bW4tZW50cnktYm9sZCc+TGluZSBDb3ZlcmFnZTwvdGQ+PHRkIGNsYXNzPSdjb2x1bW4tZW50cnktYm9sZCc+UmUiIFwKLSAgICAgICJnaW9uIENvdmVyYWdlPC90ZD48L3RyPiIKLSAgICApCi0KLQotZGVmIHdyaXRlX3Jvb3RfaHRtbF9jb2x1bW4oZiwgY292ZXJlZCwgY291bnQpOgotICAgIHBlcmNlbnQgPSBjb3ZlcmVkICogMTAwLjAgLyBjb3VudAotICAgIHZhbHVlID0gIiUuMmYlJSAoJWQvJWQpICIgJSAocGVyY2VudCwgY292ZXJlZCwgY291bnQpCi0gICAgY29sb3IgPSAnY29sdW1uLWVudHJ5LXllbGxvdycKLSAgICBpZiBwZXJjZW50ID09IDEwMDoKLSAgICAgICAgY29sb3IgPSAnY29sdW1uLWVudHJ5LWdyZWVuJwotICAgIGlmIHBlcmNlbnQgPCA4MC4wOgotICAgICAgICBjb2xvciA9ICdjb2x1bW4tZW50cnktcmVkJwotICAgIGYud3JpdGUoIjx0ZCBjbGFzcz1cJyIgKyBjb2xvciArICJcJz48cHJlPiIgKyB2YWx1ZSArICI8L3ByZT48L3RkPiIpCi0KLQotZGVmIHdyaXRlX3Jvb3RfaHRtbF9yb3dzKGYsIHRlc3RzKToKLSAgICB0b3RhbHMgPSB7Ci0gICAgICAgICJmdW5jdGlvbnMiOiB7Ci0gICAgICAgICAgICAiY292ZXJlZCI6IDAsCi0gICAgICAgICAgICAiY291bnQiOiAwCi0gICAgICAgIH0sCi0gICAgICAgICJpbnN0YW50aWF0aW9ucyI6IHsKLSAgICAgICAgICAgICJjb3ZlcmVkIjogMCwKLSAgICAgICAgICAgICJjb3VudCI6IDAKLSAgICAgICAgfSwKLSAgICAgICAgImxpbmVzIjogewotICAgICAgICAgICAgImNvdmVyZWQiOiAwLAotICAgICAgICAgICAgImNvdW50IjogMAotICAgICAgICB9LAotICAgICAgICAicmVnaW9ucyI6IHsKLSAgICAgICAgICAgICJjb3ZlcmVkIjogMCwKLSAgICAgICAgICAgICJjb3VudCI6IDAKLSAgICAgICAgfQotICAgIH0KLQotICAgICMgV3JpdGUgdGhlIHRlc3RzIHdpdGggdGhlaXIgY292ZXJhZ2Ugc3VtbWFyaWVzLgotICAgIGZvciB0ZXN0IGluIHRlc3RzOgotICAgICAgICB0ZXN0X25hbWUgPSB0ZXN0Wyd0ZXN0X25hbWUnXQotICAgICAgICBjb3ZlcmVkX2ZpbGVzID0gdGVzdFsnY292ZXJlZF9maWxlcyddCi0gICAgICAgIGpzb25fcmVzdWx0cyA9IGdlbmVyYXRlX2NvdmVyYWdlX2pzb24odGVzdCkKLSAgICAgICAgdGVzdF90b3RhbHMgPSBqc29uX3Jlc3VsdHNbJ2RhdGEnXVswXVsndG90YWxzJ10KLQotICAgICAgICBmLndyaXRlKCI8dHIgY2xhc3M9J2xpZ2h0LXJvdyc+PHRkPjxwcmU+PGEgaHJlZj1cJyIgKyBvcy5wYXRoLmpvaW4odGVzdF9uYW1lLCAiaW5kZXguaHRtbCIpICsgIlwnPiIgKwotICAgICAgICAgICAgICAgIHRlc3RfbmFtZSArICI8L2E+PC9wcmU+PC90ZD4iKQotICAgICAgICBmb3IgZmllbGRfbmFtZSBpbiBbJ2Z1bmN0aW9ucycsICdpbnN0YW50aWF0aW9ucycsICdsaW5lcycsICdyZWdpb25zJ106Ci0gICAgICAgICAgICBmaWVsZCA9IHRlc3RfdG90YWxzW2ZpZWxkX25hbWVdCi0gICAgICAgICAgICB0b3RhbHNbZmllbGRfbmFtZV1bJ2NvdmVyZWQnXSArPSBmaWVsZFsnY292ZXJlZCddCi0gICAgICAgICAgICB0b3RhbHNbZmllbGRfbmFtZV1bJ2NvdW50J10gKz0gZmllbGRbJ2NvdW50J10KLSAgICAgICAgICAgIHdyaXRlX3Jvb3RfaHRtbF9jb2x1bW4oZiwgZmllbGRbJ2NvdmVyZWQnXSwgZmllbGRbJ2NvdW50J10pCi0gICAgICAgIGYud3JpdGUoIjwvdHI+IikKLQotICAgICNXcml0ZSB0aGUgdG90YWxzIHJvdy4KLSAgICBmLndyaXRlKCI8dHIgY2xhc3M9J2xpZ2h0LXJvdy1ib2xkJz48dGQ+PHByZT5Ub3RhbHM8L2E+PC9wcmU+PC90ZD4iKQotICAgIGZvciBmaWVsZF9uYW1lIGluIFsnZnVuY3Rpb25zJywgJ2luc3RhbnRpYXRpb25zJywgJ2xpbmVzJywgJ3JlZ2lvbnMnXToKLSAgICAgICAgZmllbGQgPSB0b3RhbHNbZmllbGRfbmFtZV0KLSAgICAgICAgd3JpdGVfcm9vdF9odG1sX2NvbHVtbihmLCBmaWVsZFsnY292ZXJlZCddLCBmaWVsZFsnY291bnQnXSkKLSAgICBmLndyaXRlKCI8L3RyPiIpCi0KLQotZGVmIHdyaXRlX3Jvb3RfaHRtbF90YWlsKGYpOgotICAgICMgUHVsbGVkIGZyb20gdGhlIGdlbmVyYXRlZCBodG1sIGNvdmVyYWdlIHJlcG9ydC4KLSAgICBmLndyaXRlKCI8L3RhYmxlPjwvZGl2PjxoNT5HZW5lcmF0ZWQgYnkgbGx2bS1jb3YgLS0gbGx2bSB2ZXJzaW9uIDcuMC4yc3ZuPCIgXAotICAgICAgIi9oNT48L2JvZHk+PC9odG1sPiIpCi0KLQotZGVmIGdlbmVyYXRlX3Jvb3RfaHRtbCh0ZXN0cyk6Ci0gICAgIyBDb3B5IHRoZSBjc3MgZmlsZSBmcm9tIG9uZSBvZiB0aGUgY292ZXJhZ2UgcmVwb3J0cy4KLSAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmpvaW4oV09SS0lOR19ESVIsIHRlc3RzWzBdWyd0ZXN0X25hbWUnXSksICJzdHlsZS5jc3MiKQotICAgIGRlc3RfZmlsZSA9IG9zLnBhdGguam9pbihXT1JLSU5HX0RJUiwgInN0eWxlLmNzcyIpCi0gICAgc2h1dGlsLmNvcHkyKHNvdXJjZV9maWxlLCBkZXN0X2ZpbGUpCi0KLSAgICAjIFdyaXRlIHRoZSByb290IGluZGV4Lmh0bWwgZmlsZSB0aGF0IHN1bWFyaXplcyBhbGwgdGhlIHRlc3RzLgotICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihXT1JLSU5HX0RJUiwgImluZGV4Lmh0bWwiKSwgInciKQotICAgIHdyaXRlX3Jvb3RfaHRtbF9oZWFkKGYpCi0gICAgd3JpdGVfcm9vdF9odG1sX3Jvd3MoZiwgdGVzdHMpCi0gICAgd3JpdGVfcm9vdF9odG1sX3RhaWwoZikKLQotCi1kZWYgZ2V0X3Byb2ZyYXdfZm9yX3Rlc3QodGVzdF9uYW1lKToKLSAgICB0ZXN0X3Jvb3QgPSBnZXRfbmF0aXZlX3Rlc3Rfcm9vdF9vcl9kaWUoKQotICAgIHRlc3RfY21kID0gb3MucGF0aC5qb2luKG9zLnBhdGguam9pbih0ZXN0X3Jvb3QsIHRlc3RfbmFtZSksIHRlc3RfbmFtZSkKLSAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUodGVzdF9jbWQpOgotICAgICAgICBsb2dnaW5nLmVycm9yKCdUaGUgdGVzdCAnICsgdGVzdF9uYW1lICsgJyBkb2VzIG5vdCBleGlzdCwgcGxlYXNlIGNvbXBpbGUgZmlyc3QnKQotICAgICAgICBzeXMuZXhpdCgxKQotCi0gICAgcHJvZnJhd19maWxlX25hbWUgPSB0ZXN0X25hbWUgKyAiLnByb2ZyYXciCi0gICAgcHJvZnJhd19wYXRoID0gb3MucGF0aC5qb2luKFdPUktJTkdfRElSLCBvcy5wYXRoLmpvaW4odGVzdF9uYW1lLCBwcm9mcmF3X2ZpbGVfbmFtZSkpCi0gICAgbGx2bV9lbnZfdmFyID0gIkxMVk1fUFJPRklMRV9GSUxFPVwiIiArIHByb2ZyYXdfcGF0aCArICJcIiIKLQotICAgIHRlc3RfY21kID0gbGx2bV9lbnZfdmFyICsgIiAiICsgdGVzdF9jbWQKLSAgICBsb2dnaW5nLmluZm8oJ0dlbmVyYXRpbmcgcHJvZnJhdyBkYXRhIGZvciAnICsgdGVzdF9uYW1lKQotICAgIGxvZ2dpbmcuZGVidWcoJ2NtZDogJyArIHRlc3RfY21kKQotICAgIGlmIHN1YnByb2Nlc3MuY2FsbCh0ZXN0X2NtZCwgc2hlbGw9VHJ1ZSkgIT0gMDoKLSAgICAgICAgbG9nZ2luZy5lcnJvcignVGVzdCAnICsgdGVzdF9uYW1lICsgJyBmYWlsZWQuIFBsZWFzZSBmaXggdGhlIHRlc3QgYmVmb3JlIGdlbmVyYXRpbmcgY292ZXJhZ2UuJykKLSAgICAgICAgc3lzLmV4aXQoMSkKLQotICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShwcm9mcmF3X3BhdGgpOgotICAgICAgICBsb2dnaW5nLmVycm9yKAotICAgICAgICAgICAgJ0dlbmVyYXRpbmcgdGhlIHByb2ZyYXcgZmlsZSBmYWlsZWQuIERpZCB5b3UgcmVtZW1iZXIgdG8gYWRkIHRoZSBwcm9wZXIgY29tcGlsZXIgZmxhZ3MgdG8geW91ciBidWlsZD8nKQotICAgICAgICBzeXMuZXhpdCgxKQotCi0gICAgcmV0dXJuIHByb2ZyYXdfZmlsZV9uYW1lCi0KLQotZGVmIG1lcmdlX3Byb2ZyYXdfZGF0YSh0ZXN0X25hbWUpOgotICAgIGNtZCA9IFtdCi0gICAgY21kLmFwcGVuZChvcy5wYXRoLmpvaW4oZ2V0X2FuZHJvaWRfcm9vdF9vcl9kaWUoKSwgTExWTV9NRVJHRSArICIgbWVyZ2UgIikpCi0KLSAgICB0ZXN0X3dvcmtpbmdfZGlyID0gb3MucGF0aC5qb2luKFdPUktJTkdfRElSLCB0ZXN0X25hbWUpCi0gICAgY21kLmFwcGVuZChvcy5wYXRoLmpvaW4odGVzdF93b3JraW5nX2RpciwgdGVzdF9uYW1lICsgIi5wcm9mcmF3IikpCi0gICAgcHJvZmRhdGFfZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X3dvcmtpbmdfZGlyLCB0ZXN0X25hbWUgKyAiLnByb2ZkYXRhIikKLQotICAgIGNtZC5hcHBlbmQoJy1vICcgKyBwcm9mZGF0YV9maWxlKQotICAgIGxvZ2dpbmcuaW5mbygnQ29tYmluaW5nIHByb2ZyYXcgZmlsZXMgaW50byBwcm9mZGF0YSBmb3IgJyArIHRlc3RfbmFtZSkKLSAgICBsb2dnaW5nLmRlYnVnKCdjbWQ6ICcgKyAiICIuam9pbihjbWQpKQotICAgIGlmIHN1YnByb2Nlc3MuY2FsbCgiICIuam9pbihjbWQpLCBzaGVsbD1UcnVlKSAhPSAwOgotICAgICAgICBsb2dnaW5nLmVycm9yKCdGYWlsZWQgdG8gbWVyZ2UgcHJvZnJhdyBmaWxlcyBmb3IgJyArIHRlc3RfbmFtZSkKLSAgICAgICAgc3lzLmV4aXQoMSkKLQotCi1kZWYgZ2VuZXJhdGVfY292ZXJhZ2VfaHRtbCh0ZXN0KToKLSAgICBDT1ZFUkFHRV9ST09UID0gJy9wcm9jL3NlbGYvY3dkJwotCi0gICAgdGVzdF9uYW1lID0gdGVzdFsndGVzdF9uYW1lJ10KLSAgICBmaWxlX2xpc3QgPSB0ZXN0Wydjb3ZlcmVkX2ZpbGVzJ10KLQotICAgIHRlc3Rfd29ya2luZ19kaXIgPSBvcy5wYXRoLmpvaW4oV09SS0lOR19ESVIsIHRlc3RfbmFtZSkKLSAgICB0ZXN0X3Byb2ZkYXRhX2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdF93b3JraW5nX2RpciwgdGVzdF9uYW1lICsgIi5wcm9mZGF0YSIpCi0KLSAgICBjbWQgPSBbCi0gICAgICAgIG9zLnBhdGguam9pbihnZXRfYW5kcm9pZF9yb290X29yX2RpZSgpLCBMTFZNX0NPViksICJzaG93IiwgIi1mb3JtYXQ9aHRtbCIsICItc3VtbWFyeS1vbmx5IiwKLSAgICAgICAgIi1zaG93LWxpbmUtY291bnRzLW9yLXJlZ2lvbnMiLCAiLXNob3ctaW5zdGFudGlhdGlvbi1zdW1tYXJ5IiwgIi1pbnN0ci1wcm9maWxlPSIgKyB0ZXN0X3Byb2ZkYXRhX2ZpbGUsCi0gICAgICAgICItcGF0aC1lcXVpdmFsZW5jZT1cIiIgKyBDT1ZFUkFHRV9ST09UICsgIlwiLFwiIiArIGdldF9hbmRyb2lkX3Jvb3Rfb3JfZGllKCkgKyAiXCIiLAotICAgICAgICAiLW91dHB1dC1kaXI9IiArIHRlc3Rfd29ya2luZ19kaXIKLSAgICBdCi0KLSAgICAjIFdlIGhhdmUgdG8gaGF2ZSBvbmUgb2JqZWN0IGZpbGUgbm90IGFzIGFuIGFyZ3VtZW50IG90aGVyd2lzZSB3ZSBjYW4ndCBzcGVjaWZ5IHNvdXJjZSBmaWxlcy4KLSAgICB0ZXN0X2NtZCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmpvaW4oZ2V0X25hdGl2ZV90ZXN0X3Jvb3Rfb3JfZGllKCksIHRlc3RfbmFtZSksIHRlc3RfbmFtZSkKLSAgICBjbWQuYXBwZW5kKHRlc3RfY21kKQotCi0gICAgIyBGaWx0ZXIgb3V0IHRoZSBzcGVjaWZpYyBmaWxlcyB3ZSB3YW50IGNvdmVyYWdlIGZvcgotICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlX2xpc3Q6Ci0gICAgICAgIGNtZC5hcHBlbmQob3MucGF0aC5qb2luKGdldF9hbmRyb2lkX3Jvb3Rfb3JfZGllKCksIGZpbGVuYW1lKSkKLQotICAgIGxvZ2dpbmcuaW5mbygnR2VuZXJhdGluZyBjb3ZlcmFnZSByZXBvcnQgZm9yICcgKyB0ZXN0Wyd0ZXN0X25hbWUnXSkKLSAgICBsb2dnaW5nLmRlYnVnKCdjbWQ6ICcgKyAiICIuam9pbihjbWQpKQotICAgIGlmIHN1YnByb2Nlc3MuY2FsbCgiICIuam9pbihjbWQpLCBzaGVsbD1UcnVlKSAhPSAwOgotICAgICAgICBsb2dnaW5nLmVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgY292ZXJhZ2UgZm9yICcgKyB0ZXN0Wyd0ZXN0X25hbWUnXSkKLSAgICAgICAgc3lzLmV4aXQoMSkKLQotCi1kZWYgZ2VuZXJhdGVfY292ZXJhZ2VfanNvbih0ZXN0KToKLSAgICBDT1ZFUkFHRV9ST09UID0gJy9wcm9jL3NlbGYvY3dkJwotICAgIHRlc3RfbmFtZSA9IHRlc3RbJ3Rlc3RfbmFtZSddCi0gICAgZmlsZV9saXN0ID0gdGVzdFsnY292ZXJlZF9maWxlcyddCi0KLSAgICB0ZXN0X3dvcmtpbmdfZGlyID0gb3MucGF0aC5qb2luKFdPUktJTkdfRElSLCB0ZXN0X25hbWUpCi0gICAgdGVzdF9wcm9mZGF0YV9maWxlID0gb3MucGF0aC5qb2luKHRlc3Rfd29ya2luZ19kaXIsIHRlc3RfbmFtZSArICIucHJvZmRhdGEiKQotCi0gICAgY21kID0gWwotICAgICAgICBvcy5wYXRoLmpvaW4oZ2V0X2FuZHJvaWRfcm9vdF9vcl9kaWUoKSwgTExWTV9DT1YpLAotICAgICAgICAiZXhwb3J0IiwKLSAgICAgICAgIi1zdW1tYXJ5LW9ubHkiLAotICAgICAgICAiLXNob3ctcmVnaW9uLXN1bW1hcnkiLAotICAgICAgICAiLWluc3RyLXByb2ZpbGU9IiArIHRlc3RfcHJvZmRhdGFfZmlsZSwKLSAgICAgICAgIi1wYXRoLWVxdWl2YWxlbmNlPVwiIiArIENPVkVSQUdFX1JPT1QgKyAiXCIsXCIiICsgZ2V0X2FuZHJvaWRfcm9vdF9vcl9kaWUoKSArICJcIiIsCi0gICAgXQotCi0gICAgdGVzdF9jbWQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5qb2luKGdldF9uYXRpdmVfdGVzdF9yb290X29yX2RpZSgpLCB0ZXN0X25hbWUpLCB0ZXN0X25hbWUpCi0gICAgY21kLmFwcGVuZCh0ZXN0X2NtZCkKLQotICAgICMgRmlsdGVyIG91dCB0aGUgc3BlY2lmaWMgZmlsZXMgd2Ugd2FudCBjb3ZlcmFnZSBmb3IKLSAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZV9saXN0OgotICAgICAgICBjbWQuYXBwZW5kKG9zLnBhdGguam9pbihnZXRfYW5kcm9pZF9yb290X29yX2RpZSgpLCBmaWxlbmFtZSkpCi0KLSAgICBsb2dnaW5nLmluZm8oJ0dlbmVyYXRpbmcgY292ZXJhZ2UganNvbiBmb3IgJyArIHRlc3RbJ3Rlc3RfbmFtZSddKQotICAgIGxvZ2dpbmcuZGVidWcoJ2NtZDogJyArICIgIi5qb2luKGNtZCkpCi0KLSAgICBqc29uX3N0ciA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KCIgIi5qb2luKGNtZCksIHNoZWxsPVRydWUpCi0gICAgcmV0dXJuIGpzb24ubG9hZHMoanNvbl9zdHIpCi0KLQotZGVmIHdyaXRlX2pzb25fc3VtbWFyeSh0ZXN0KToKLSAgICB0ZXN0X25hbWUgPSB0ZXN0Wyd0ZXN0X25hbWUnXQotICAgIHRlc3Rfd29ya2luZ19kaXIgPSBvcy5wYXRoLmpvaW4oV09SS0lOR19ESVIsIHRlc3RfbmFtZSkKLSAgICB0ZXN0X2pzb25fc3VtbWFyeV9maWxlID0gb3MucGF0aC5qb2luKHRlc3Rfd29ya2luZ19kaXIsIHRlc3RfbmFtZSArICcuanNvbicpCi0gICAgbG9nZ2luZy5kZWJ1ZygnV3JpdGluZyBqc29uIHN1bW1hcnkgZmlsZTogJyArIHRlc3RfanNvbl9zdW1tYXJ5X2ZpbGUpCi0gICAganNvbl9maWxlID0gb3Blbih0ZXN0X2pzb25fc3VtbWFyeV9maWxlLCAndycpCi0gICAganNvbi5kdW1wKGdlbmVyYXRlX2NvdmVyYWdlX2pzb24odGVzdCksIGpzb25fZmlsZSkKLSAgICBqc29uX2ZpbGUuY2xvc2UoKQotCi0KLWRlZiBsaXN0X3Rlc3RzKCk6Ci0gICAgZm9yIHRlc3QgaW4gQ09WRVJBR0VfVEVTVFM6Ci0gICAgICAgIHByaW50ICJUZXN0IE5hbWU6ICIgKyB0ZXN0Wyd0ZXN0X25hbWUnXQotICAgICAgICBwcmludCAiQ292ZXJlZCBGaWxlczogIgotICAgICAgICBmb3IgY292ZXJlZF9maWxlIGluIHRlc3RbJ2NvdmVyZWRfZmlsZXMnXToKLSAgICAgICAgICAgIHByaW50ICIgICIgKyBjb3ZlcmVkX2ZpbGUKLSAgICAgICAgcHJpbnQKLQotCi1kZWYgbWFpbigpOgotICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSdHZW5lcmF0ZSBjb2RlIGNvdmVyYWdlIGZvciBlbmFibGVkIHRlc3RzLicpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICAgJy1sJywKLSAgICAgICAgJy0tbGlzdC10ZXN0cycsCi0gICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgIGRlc3Q9J2xpc3RfdGVzdHMnLAotICAgICAgICBoZWxwPSdMaXN0IGFsbCB0aGUgYXZhaWxhYmxlIHRlc3RzIHRvIGJlIHJ1biBhcyB3ZWxsIGFzIGNvdmVyZWQgZmlsZXMuJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgJy1hJywgJy0tYWxsJywKLSAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICBoZWxwPSdSdW5zIGFsbCBhdmFpbGFibGUgdGVzdHMgYW5kIHByaW50cyB0aGVpciBvdXRwdXRzLiBJZiBubyB0ZXN0cyAnIFwKLSAgICAgICAgICAgJ2FyZSBzcGVjaWZpZWQgdmlhIHRoZSAtdCBvcHRpb24gYWxsIHRlc3RzIHdpbGwgYmUgcnVuLicpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICctdCcsICctLXRlc3QnLAotICAgICAgZGVzdD0ndGVzdHMnLAotICAgICAgYWN0aW9uPSdhcHBlbmQnLAotICAgICAgdHlwZT1zdHIsCi0gICAgICBtZXRhdmFyPSdURVNUTkFNRScsCi0gICAgICBkZWZhdWx0PVtdLAotICAgICAgaGVscD0nU3BlY2lmaWVzIGEgdGVzdCB0byBiZSBydW4uIE11bHRpcGxlIHRlc3RzIGNhbiBiZSBzcGVjaWZpZWQgYnkgJyBcCi0gICAgICAgICAgICd1c2luZyB0aGlzIG9wdGlvbiBtdWx0aXBsZSB0aW1lcy4gJyBcCi0gICAgICAgICAgICdFeGFtcGxlOiBcImdlbl9jb3ZlcmFnZS5weSAtdCB0ZXN0MSAtdCB0ZXN0MlwiJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgJy1vJywgJy0tb3V0cHV0JywKLSAgICAgIHR5cGU9c3RyLAotICAgICAgbWV0YXZhcj0nRElSRUNUT1JZJywKLSAgICAgIGRlZmF1bHQ9Jy90bXAvY292ZXJhZ2UnLAotICAgICAgaGVscD0nU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgYWxsIGZpbGVzLiBUaGUgZGlyZWN0b3J5IHdpbGwgYmUgJyBcCi0gICAgICAgICAgICdjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LiBEZWZhdWx0IGlzIFwiL3RtcC9jb3ZlcmFnZVwiJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAnLXMnLAotICAgICAgICAnLS1za2lwLWh0bWwnLAotICAgICAgICBkZXN0PSdza2lwX2h0bWwnLAotICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICBoZWxwPSdTa2lwIG9wZW5pbmcgdXAgdGhlIHJlc3VsdHMgb2YgdGhlIGNvdmVyYWdlIHJlcG9ydCBpbiBhIGJyb3dzZXIuJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAnLWonLAotICAgICAgICAnLS1qc29uLWZpbGUnLAotICAgICAgICBkZXN0PSdqc29uX2ZpbGUnLAotICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICBoZWxwPSdXcml0ZSBvdXQgc3VtbWFyeSByZXN1bHRzIHRvIGpzb24gZmlsZSBpbiB0ZXN0IGRpcmVjdG9yeS4nKQotCi0gICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhzdHJlYW09c3lzLnN0ZGVyciwgbGV2ZWw9bG9nZ2luZy5ERUJVRywgZm9ybWF0PSclKGxldmVsbmFtZSlzICUobWVzc2FnZSlzJykKLSAgICBsb2dnaW5nLmFkZExldmVsTmFtZShsb2dnaW5nLkRFQlVHLCAiW1wwMzNbMTszNG0lc1wwMzNbMG1dIiAlIGxvZ2dpbmcuZ2V0TGV2ZWxOYW1lKGxvZ2dpbmcuREVCVUcpKQotICAgIGxvZ2dpbmcuYWRkTGV2ZWxOYW1lKGxvZ2dpbmcuSU5GTywgIltcMDMzWzE7MzRtJXNcMDMzWzBtXSIgJSBsb2dnaW5nLmdldExldmVsTmFtZShsb2dnaW5nLklORk8pKQotICAgIGxvZ2dpbmcuYWRkTGV2ZWxOYW1lKGxvZ2dpbmcuV0FSTklORywgIltcMDMzWzE7MzFtJXNcMDMzWzBtXSIgJSBsb2dnaW5nLmdldExldmVsTmFtZShsb2dnaW5nLldBUk5JTkcpKQotICAgIGxvZ2dpbmcuYWRkTGV2ZWxOYW1lKGxvZ2dpbmcuRVJST1IsICJbXDAzM1sxOzMxbSVzXDAzM1swbV0iICUgbG9nZ2luZy5nZXRMZXZlbE5hbWUobG9nZ2luZy5FUlJPUikpCi0KLSAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotICAgIGxvZ2dpbmcuZGVidWcoIkFyZ3M6ICIgKyBzdHIoYXJncykpCi0KLSAgICAjIFNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkKLSAgICBnbG9iYWwgV09SS0lOR19ESVIKLSAgICBXT1JLSU5HX0RJUiA9IG9zLnBhdGguYWJzcGF0aChhcmdzLm91dHB1dCkKLSAgICBsb2dnaW5nLmRlYnVnKCJXb3JraW5nIERpcjogIiArIFdPUktJTkdfRElSKQotCi0gICAgIyBQcmludCBvdXQgdGhlIGxpc3Qgb2YgdGVzdHMgdGhlbiBleGl0Ci0gICAgaWYgYXJncy5saXN0X3Rlc3RzOgotICAgICAgICBsaXN0X3Rlc3RzKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgICMgQ2hlY2sgdG8gc2VlIGlmIGEgdGVzdCB3YXMgc3BlY2lmaWVkIGFuZCBpZiBzbyBvbmx5IGdlbmVyYXRlIGNvdmVyYWdlIGZvcgotICAgICMgdGhhdCB0ZXN0LgotICAgIGlmIGxlbihhcmdzLnRlc3RzKSA9PSAwOgotICAgICAgICBhcmdzLmFsbCA9IFRydWUKLQotICAgIHRlc3RzX3RvX3J1biA9IFtdCi0gICAgZm9yIHRlc3QgaW4gQ09WRVJBR0VfVEVTVFM6Ci0gICAgICAgIGlmIGFyZ3MuYWxsIG9yIHRlc3RbJ3Rlc3RfbmFtZSddIGluIGFyZ3MudGVzdHM6Ci0gICAgICAgICAgICB0ZXN0c190b19ydW4uYXBwZW5kKHRlc3QpCi0gICAgICAgIGlmIHRlc3RbJ3Rlc3RfbmFtZSddIGluIGFyZ3MudGVzdHM6Ci0gICAgICAgICAgICBhcmdzLnRlc3RzLnJlbW92ZSh0ZXN0Wyd0ZXN0X25hbWUnXSkKLQotICAgICMgRXJyb3IgaWYgYSB0ZXN0IHdhcyBzcGVjaWZpZWQgYnV0IGRvZXNuJ3QgZXhpc3QuCi0gICAgaWYgbGVuKGFyZ3MudGVzdHMpICE9IDA6Ci0gICAgICAgIGZvciB0ZXN0X25hbWUgaW4gYXJncy50ZXN0czoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoJ1wiJyArIHRlc3RfbmFtZSArICdcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0ZXN0cy4nKQotICAgICAgICBzeXMuZXhpdCgxKQotCi0gICAgIyBHZW5lcmF0ZSB0aGUgaW5mbyBmb3IgdGhlIHRlc3RzCi0gICAgZm9yIHRlc3QgaW4gdGVzdHNfdG9fcnVuOgotICAgICAgICBsb2dnaW5nLmluZm8oJ0dldHRpbmcgY292ZXJhZ2UgZm9yICcgKyB0ZXN0Wyd0ZXN0X25hbWUnXSkKLSAgICAgICAgZ2V0X3Byb2ZyYXdfZm9yX3Rlc3QodGVzdFsndGVzdF9uYW1lJ10pCi0gICAgICAgIG1lcmdlX3Byb2ZyYXdfZGF0YSh0ZXN0Wyd0ZXN0X25hbWUnXSkKLSAgICAgICAgaWYgYXJncy5qc29uX2ZpbGU6Ci0gICAgICAgICAgICB3cml0ZV9qc29uX3N1bW1hcnkodGVzdCkKLSAgICAgICAgZ2VuZXJhdGVfY292ZXJhZ2VfaHRtbCh0ZXN0KQotCi0gICAgIyBHZW5lcmF0ZSB0aGUgcm9vdCBpbmRleC5odG1sIHBhZ2UgdGhhdCBzdW1hcml6ZXMgYWxsIG9mIHRoZSBjb3ZlcmFnZSByZXBvcnRzLgotICAgIGdlbmVyYXRlX3Jvb3RfaHRtbCh0ZXN0c190b19ydW4pCi0KLSAgICAjIE9wZW4gdGhlIHJlc3VsdHMgaW4gYSBicm93c2VyLgotICAgIGlmIG5vdCBhcmdzLnNraXBfaHRtbDoKLSAgICAgICAgd2ViYnJvd3Nlci5vcGVuKCdmaWxlOi8vJyArIG9zLnBhdGguam9pbihXT1JLSU5HX0RJUiwgJ2luZGV4Lmh0bWwnKSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9BbmRyb2lkLmJwIGIvdGVzdC9oZWFkbGVzcy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWIzMDUyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJidF9oZWFkbGVzcyIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjb25uZWN0L2Nvbm5lY3QuY2MiLAotICAgICAgICAiZ2V0X29wdGlvbnMuY2MiLAotICAgICAgICAiaGVhZGxlc3MuY2MiLAotICAgICAgICAibWFpbi5jYyIsCi0gICAgICAgICJwYWlyaW5nL3BhaXJpbmcuY2MiLAotICAgICAgICAiZHVtcHN5cy9kdW1wc3lzLmNjIiwKLSAgICAgICAgInNkcC9zZHAuY2MiLAotICAgICAgICAic2RwL3NkcF9kYi5jYyIsCi0gICAgICAgICJub3Avbm9wLmNjIiwKLSAgICAgICAgInJlYWQvcmVhZC5jYyIsCi0gICAgICAgICJyZWFkL25hbWUuY2MiLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICBdLAotICAgIHdob2xlX3N0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidGNvcmUiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAotICAgICAgICAibGliYmx1ZXRvb3RoX2dkIiwKLSAgICAgICAgImxpYmJ0LWJ0YSIsCi0gICAgICAgICJsaWJidC1jb21tb24iLAotICAgICAgICAibGliYmx1ZXRvb3RoLWR1bXBzeXMiLAotICAgICAgICAibGliYnQtaGNpIiwKLSAgICAgICAgImxpYmJ0LXByb3Rvcy1saXRlIiwKLSAgICAgICAgImxpYmJ0LXNiYy1kZWNvZGVyIiwKLSAgICAgICAgImxpYmJ0LXNiYy1lbmNvZGVyIiwKLSAgICAgICAgImxpYmJ0LXN0YWNrIiwKLSAgICAgICAgImxpYmJ0LXV0aWxzIiwKLSAgICAgICAgImxpYmJ0ZGV2aWNlIiwKLSAgICAgICAgImxpYmJ0ZSIsCi0gICAgICAgICJsaWJidGlmIiwKLSAgICAgICAgImxpYmZsYXRidWZmZXJzLWNwcCIsCi0gICAgICAgICJsaWJnNzIyY29kZWMiLAotICAgICAgICAibGlibGMzY29kZWMiLAotICAgICAgICAibGlib3NpIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYnVkcnYtdWlwYyIsCi0gICAgICAgICJsaWJ6IiwKLSAgICAgICAgImxpYmJsdWV0b290aF9ydXN0X2ludGVyb3AiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmEyZHBAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5hdWRpb0AyLjEiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMSIsCi0gICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLmNvbnRyb2wtVjEtbmRrIiwKLSAgICAgICAgImFuZHJvaWQuc3lzdGVtLnN1c3BlbmQtVjEtbmRrIiwKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmJpbmRlcl9uZGsiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmN1dGlscyIsICAvLyBwcm9wZXJ0eV9nZXRfYm9vbAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmpzb25jcHAiLAotICAgICAgICAibGlibG9nIiwgIC8vIF9fYW5kcm9pZF9sb2dfcHJpbnQKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgICAgICJsaWJ0aW55eG1sMiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKLSAgICBsZGZsYWdzOiBbIi1yZHluYW1pYyJdLAotICAgIHNhbml0aXplOiB7Ci0gICAgICBjZmk6IGZhbHNlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS90ZXN0L2hlYWRsZXNzL1JFQURNRS5tZCBiL3Rlc3QvaGVhZGxlc3MvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I3ZjkyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMKLSMjIGJsdWV0b290aCBoZWFkbGVzcwotIyMKLSMjIEEgZGV2aWNlLXNpZGUgZXhlY3V0YWJsZSB0aGF0IGNvbnNpc3RzIG9mIGEgYmluYXJ5IGV4ZWN1dGFibGUKLSMjIGRyaXZpbmcgdGhlIEFuZHJvaWQgbGliYmx1ZXRvb3RoIGxpYnJhcmllcy4KLSMjCi0KLVJlcXVpcmVtZW50czoKLSAgICAxLiBBbmRyb2lkIGluc3RhbGxhdGlvbiwKLSAgICAyLiBSb290IGFjY2VzcyB0byBhZGIgY29ubmVjdGVkIEFuZHJvaWQgZGV2aWNlLgotCi1CdWlsZDogU291cmNlLCBsdW5jaCBhbmQgYnVpbGQgYXMgdHlwaWNhbCBBbmRyb2lkIHRhcmdldCBmb3Igc2VsZWN0ZWQgZGV2aWNlIGFuZCBhcmNoaXRlY3R1cmUuCi0gICAgY2QgJEFORFJPSURfQlVJTERfVE9QCi0gICAgLiBidWlsZC9lbnZzZXR1cC5zaCAmJiBsdW5jaCA8dGFyZ2V0PgotICAgIG1ha2UgYnRfaGVhZGxlc3MKLQotSW5zdGFsbDogUHVzaCB0aGUgYmluYXJ5IHRvIGFuIGV4ZWN1dGFibGUgYXJlYSBvbiB0YXJnZXQgZGV2aWNlLgotICAgIGFkYiBwdXNoIG91dC90YXJnZXQvcHJvZHVjdC88ZGV2aWNlLi5hcmNoPi9idF9oZWFkbGVzcy9idF9oZWFkbGVzcyAvZGF0YS9kYXRhLy4KLQotUHJlcGFyZTogRW5zdXJlIHRoZSBzeXN0ZW0gaXMgcXVlaXNjZWQgdG8gcHJldmVudCByZXNvdXJjZSBjb25mbGljdHMgZnJvbSB0aGUgYmx1ZXRvb3RoIHByb2Nlc3MuCi0gICAgYWRiIHNoZWxsIHN0b3AKLQotUnVuOiBTY3JpcHQgb3IgZGlyZWN0bHkgZXhlY3V0ZSB0aGUgdGFyZ2V0IGZpbGUuCi0gICAgYWRiIHNoZWxsIC9kYXRhL2RhdGEvYnRfaGVhZGxlc3MgLS1mbGFncz1JTklUX2xvZ2dpbmdfZGVidWdfZW5hYmxlZF9mb3JfYWxsPXRydWUsSU5JVF9nZF9hY2w9dHJ1ZSBub3AKZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3MvY29ubmVjdC9jb25uZWN0LmNjIGIvdGVzdC9oZWFkbGVzcy9jb25uZWN0L2Nvbm5lY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjdlNWUuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9jb25uZWN0L2Nvbm5lY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9oZWFkbGVzc19tb2RlIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIgIC8vIExPRygpIHN0ZG91dCBhbmQgYW5kcm9pZCBsb2cKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIiAgLy8gYW5kcm9pZCBsb2cgb25seQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2FwX2FjbF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2Nvbm5lY3QvY29ubmVjdC5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1jb25zdCBzdGFja19tYW5hZ2VyX3QqIHN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpOwotZXh0ZXJuIGJ0X2ludGVyZmFjZV90IGJsdWV0b290aEludGVyZmFjZTsKLQotdm9pZCBwb3dlcl9tb2RlX2NhbGxiYWNrKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLCB0QlRNX1BNX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmFsdWUsIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpIHsKLSAgZnByaW50ZihzdGRvdXQsICJHb3QgY2FsbGJhY2tcbiIpOwotfTsKLQotc3RkOjpwcm9taXNlPGFjbF9zdGF0ZV9jaGFuZ2VkX3BhcmFtc190PiBhY2xfc3RhdGVfY2hhbmdlZF9wcm9taXNlOwotCi12b2lkIGNhbGxiYWNrX2ludGVyZmFjZShpbnRlcmZhY2VfZGF0YV90IGRhdGEpIHsKLSAgaWYgKGRhdGEubmFtZSA9PSAiYWNsX3N0YXRlX2NoYW5nZWQiKSB7Ci0gICAgTE9HKElORk8pIDw8ICJSZWNlaXZlZCBhY2wgc3RhdGUgY2hhbmdlZCI7Ci0gICAgYWNsX3N0YXRlX2NoYW5nZWRfcGFyYW1zX3QgcHsKLSAgICAgICAgLnN0YXR1cyA9IEJUX1NUQVRVU19TVUNDRVNTLAotICAgICAgICAucmVtb3RlX2JkX2FkZHIgPSBudWxscHRyLAotICAgICAgICAuc3RhdGUgPSBCVF9BQ0xfU1RBVEVfQ09OTkVDVEVELAotICAgIH07Ci0gICAgYWNsX3N0YXRlX2NoYW5nZWRfcHJvbWlzZS5zZXRfdmFsdWUocCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExPRyhFUlJPUikgPDwgIlJlY2VpdmVkIHVuZXhwZWN0ZWQgaW50ZXJmYWNlIGNhbGxiYWNrIjsKLX0KLQotbmFtZXNwYWNlIHsKLQotaW50IGRvX2Nvbm5lY3QodW5zaWduZWQgaW50IG51bV9sb29wcywgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gb3B0aW9ucykgewotICBpbnQgZGlzY29ubmVjdF93YWl0X3RpbWV7MH07Ci0KLSAgaWYgKG9wdGlvbnMuc2l6ZSgpICE9IDApIHsKLSAgICBzdGQ6OnN0cmluZyBvcHQgPSBvcHRpb25zLmZyb250KCk7Ci0gICAgb3B0aW9ucy5wb3BfZnJvbnQoKTsKLSAgICBhdXRvIHYgPSBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQ6OlNwbGl0KG9wdCk7Ci0gICAgaWYgKHYuc2l6ZSgpID09IDIpIHsKLSAgICAgIGlmICh2WzBdID09ICJ3YWl0IikgZGlzY29ubmVjdF93YWl0X3RpbWUgPSBzdGQ6OnN0b2kodlsxXSk7Ci0gICAgfQotICB9Ci0gIEFTU0VSVF9MT0coZGlzY29ubmVjdF93YWl0X3RpbWUgPj0gMCwgIlRpbWUgY2Fubm90IGdvIGJhY2t3YXJkcyIpOwotCi0gIGhlYWRsZXNzX2FkZF9jYWxsYmFjaygiYWNsX3N0YXRlX2NoYW5nZWQiLCBjYWxsYmFja19pbnRlcmZhY2UpOwotCi0gIGFjbF9zdGF0ZV9jaGFuZ2VkX3Byb21pc2UgPSBzdGQ6OnByb21pc2U8YWNsX3N0YXRlX2NoYW5nZWRfcGFyYW1zX3Q+KCk7Ci0gIGF1dG8gZnV0dXJlID0gYWNsX3N0YXRlX2NoYW5nZWRfcHJvbWlzZS5nZXRfZnV0dXJlKCk7Ci0KLSAgZnByaW50ZihzdGRvdXQsICJDcmVhdGluZyBjb25uZWN0aW9uIHRvOiVzXG4iLCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgY2xhc3NpYyBjb25uZWN0aW9uIHRvICIgPDwgYmRfYWRkci5Ub1N0cmluZygpOwotICBhY2xfY3JlYXRlX2NsYXNzaWNfY29ubmVjdGlvbihiZF9hZGRyLCBmYWxzZSwgZmFsc2UpOwotCi0gIGFjbF9zdGF0ZV9jaGFuZ2VkX3BhcmFtc190IHJlc3VsdCA9IGZ1dHVyZS5nZXQoKTsKLSAgZnByaW50ZihzdGRvdXQsICJDb25uZWN0ZWQgY3JlYXRlZCB0bzolcyByZXN1bHQ6JXNbJXVdXG4iLAotICAgICAgICAgIGJkX2FkZHIuVG9TdHJpbmcoKS5jX3N0cigpLCBidF9zdGF0dXNfdGV4dChyZXN1bHQuc3RhdHVzKS5jX3N0cigpLAotICAgICAgICAgIHJlc3VsdC5zdGF0dXMpOwotICBhY2xfc3RhdGVfY2hhbmdlZF9wcm9taXNlID0gc3RkOjpwcm9taXNlPGFjbF9zdGF0ZV9jaGFuZ2VkX3BhcmFtc190PigpOwotICBmdXR1cmUgPSBhY2xfc3RhdGVfY2hhbmdlZF9wcm9taXNlLmdldF9mdXR1cmUoKTsKLQotICB1aW50NjRfdCBjb25uZWN0ID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpOwotCi0gIGZwcmludGYoc3Rkb3V0LCAiSnVzdCBjcnVzaGluZyBzdGFja1xuIik7Ci0gIExPRyhJTkZPKSA8PCAiSnVzdCBjcnVzaGluZyBzdGFjayI7Ci0gIHN0YWNrX21hbmFnZXJfZ2V0X2ludGVyZmFjZSgpLT5jbGVhbl91cF9zdGFjaygpOwotCi0gIGlmIChkaXNjb25uZWN0X3dhaXRfdGltZSA9PSAwKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJXYWl0aW5nIHRvIGRpc2Nvbm5lY3QgZnJvbSBzdXBlcnZpc2lvbiB0aW1lb3V0XG4iKTsKLSAgICByZXN1bHQgPSBmdXR1cmUuZ2V0KCk7Ci0gICAgdWludDY0X3QgZGlzY29ubmVjdCA9Ci0gICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAotICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKQotICAgICAgICAgICAgLmNvdW50KCk7Ci0KLSAgICBmcHJpbnRmKHN0ZG91dCwgIkRpc2Nvbm5lY3RlZCBhZnRlcjolIiBQUklkNjQgIm1zIGZyb206JXMgcmVzdWx0OiVzWyV1XVxuIiwKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QgLSBjb25uZWN0LCBiZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgIGJ0X3N0YXR1c190ZXh0KHJlc3VsdC5zdGF0dXMpLmNfc3RyKCksIHJlc3VsdC5zdGF0dXMpOwotCi0gICAgaGVhZGxlc3NfcmVtb3ZlX2NhbGxiYWNrKCJhY2xfc3RhdGVfY2hhbmdlZCIsIGNhbGxiYWNrX2ludGVyZmFjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJXYWl0aW5nICVkIHNlY29uZHMgdG8ganVzdCBzaHV0ZG93blxuIiwKLSAgICAgICAgICAgIGRpc2Nvbm5lY3Rfd2FpdF90aW1lKTsKLSAgICBzbGVlcChkaXNjb25uZWN0X3dhaXRfdGltZSk7Ci0gICAgYmx1ZXRvb3RoSW50ZXJmYWNlLmR1bXAoMSwgbnVsbHB0cik7Ci0gICAgYmx1ZXRvb3RoSW50ZXJmYWNlLmNsZWFudXAoKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWludCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpDb25uZWN0OjpSdW4oKSB7Ci0gIHJldHVybiBSdW5PbkhlYWRsZXNzU3RhY2s8aW50PihbdGhpc10oKSB7Ci0gICAgcmV0dXJuIGRvX2Nvbm5lY3Qob3B0aW9uc18ubG9vcF8sIG9wdGlvbnNfLmRldmljZV8uZnJvbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zXy5ub25fb3B0aW9uc18pOwotICB9KTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3MvY29ubmVjdC9jb25uZWN0LmggYi90ZXN0L2hlYWRsZXNzL2Nvbm5lY3QvY29ubmVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2VlYWRkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvY29ubmVjdC9jb25uZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIGhlYWRsZXNzIHsKLQotY2xhc3MgQ29ubmVjdCA6IHB1YmxpYyBIZWFkbGVzc1Rlc3Q8aW50PiB7Ci0gcHVibGljOgotICBDb25uZWN0KGNvbnN0IGJsdWV0b290aDo6dGVzdDo6aGVhZGxlc3M6OkdldE9wdCYgb3B0aW9ucykKLSAgICAgIDogSGVhZGxlc3NUZXN0PGludD4ob3B0aW9ucykge30KLSAgaW50IFJ1bigpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhlYWRsZXNzCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9kdW1wc3lzL2R1bXBzeXMuY2MgYi90ZXN0L2hlYWRsZXNzL2R1bXBzeXMvZHVtcHN5cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlZWIzMi4uMDAwMDAwMAotLS0gYS90ZXN0L2hlYWRsZXNzL2R1bXBzeXMvZHVtcHN5cy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfaGVhZGxlc3Nfc2RwIgotCi0jaW5jbHVkZSA8ZnV0dXJlPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiICAgICAvLyBMT0coKSBzdGRvdXQgYW5kIGFuZHJvaWQgbG9nCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiICAvLyBhbmRyb2lkIGxvZyBvbmx5Ci0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZHVtcHN5cy9kdW1wc3lzLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gYnRfaW50ZXJmYWNlX3QgYmx1ZXRvb3RoSW50ZXJmYWNlOwotCi1pbnQgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6RHVtcHN5czo6UnVuKCkgewotICByZXR1cm4gUnVuT25IZWFkbGVzc1N0YWNrPGludD4oW3RoaXNdKCkgewotICAgIGZwcmludGYoc3Rkb3V0LCAiRHVtcHN5cyBsb29wOiVsdSBcbiIsIGxvb3BfKTsKLSAgICBibHVldG9vdGhJbnRlcmZhY2UuZHVtcCgxLCBudWxscHRyKTsKLSAgICByZXR1cm4gMDsKLSAgfSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2hlYWRsZXNzL2R1bXBzeXMvZHVtcHN5cy5oIGIvdGVzdC9oZWFkbGVzcy9kdW1wc3lzL2R1bXBzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5M2FlYi4uMDAwMDAwMAotLS0gYS90ZXN0L2hlYWRsZXNzL2R1bXBzeXMvZHVtcHN5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9oZWFkbGVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBoZWFkbGVzcyB7Ci0KLWNsYXNzIER1bXBzeXMgOiBwdWJsaWMgSGVhZGxlc3NUZXN0PGludD4gewotIHB1YmxpYzoKLSAgRHVtcHN5cyhjb25zdCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQmIG9wdGlvbnMpCi0gICAgICA6IEhlYWRsZXNzVGVzdDxpbnQ+KG9wdGlvbnMpIHt9Ci0gIGludCBSdW4oKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkbGVzcwotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuY2MgYi90ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y2ODk4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImdkL29zL2xvZy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHsKLWVudW0gT3B0aW9uVHlwZSB7Ci0gIGtPcHRpb25EZXZpY2UgPSAwLAotICBrT3B0aW9uTG9vcCA9IDEsCi0gIGtPcHRpb25VdWlkID0gMiwKLSAga09wdGlvbk1zbGVlcCA9IDMsCi0gIGtPcHRpb25TdGRFcnIgPSA0LAotICBrT3B0aW9uRmxhZ3MgPSA1LAotICBrT3B0aW9uQ2xlYXIgPSA2LAotfTsKLQotY29uc3RleHByIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Ci0gICAgeyJkZXZpY2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMH0sICAvLyBrT3B0aW9uRGV2aWNlCi0gICAgeyJsb29wIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDB9LCAgICAvLyBrT3B0aW9uTG9vcC8KLSAgICB7InV1aWQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMH0sICAgIC8vIGtPcHRpb25VdWlkCi0gICAgeyJtc2xlZXAiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMH0sICAvLyBrT3B0aW9uTXNsZWVwCi0gICAgeyJzdGRlcnIiLCBub19hcmd1bWVudCwgMCwgMH0sICAgICAgICAvLyBrT3B0aW9uU3RkRXJyCi0gICAgeyJmbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwgICAvLyBrT3B0aW9uRmxhZ3MKLSAgICB7ImNsZWFyIiwgbm9fYXJndW1lbnQsIDAsIDB9LCAgICAgICAgIC8vIGtPcHRpb25EZXZpY2UKLSAgICB7MCwgMCwgMCwgMH19OwotCi1jb25zdCBjaGFyKiBrU2hvcnRBcmdzID0gImNkOmw6dToiOwotCi19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQ6OlVzYWdlKCkgY29uc3QgewotICBmcHJpbnRmKHN0ZG91dCwgIiVzOiBVc2FnZTpcbiIsIG5hbWVfKTsKLSAgZnByaW50ZihzdGRvdXQsICIlcyAgLWMgIENsZWFyIGxvZ2NhdCBsb2dzXG4iLCBuYW1lXyk7Ci0gIGZwcmludGYoc3Rkb3V0LAotICAgICAgICAgICIlcyAgLS1kZXZpY2U9PGRldmljZSw+ICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZW1vdGUgZGV2aWNlc1xuIiwKLSAgICAgICAgICBuYW1lXyk7Ci0gIGZwcmludGYoc3Rkb3V0LAotICAgICAgICAgICIlcyAgLS1mbGFncz08ZmxhZ3MsPiAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZ2QgaW5pdCBmbGFnc1xuIiwKLSAgICAgICAgICBuYW1lXyk7Ci0gIGZwcmludGYoc3Rkb3V0LCAiJXMgIC0tdXVpZD08dXVpZCw+ICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXVpZHNcbiIsCi0gICAgICAgICAgbmFtZV8pOwotICBmcHJpbnRmKHN0ZG91dCwgIiVzICAtLWxvb3A9PGxvb3A+ICAgICAgIE51bWJlciBvZiBsb29wc1xuIiwgbmFtZV8pOwotICBmcHJpbnRmKHN0ZG91dCwgIiVzICAtLW1zbGVlcD08bXNlY3M+ICAgIFNsZWVwIG1zZWMgYmV0d2VlbiBsb29wc1xuIiwgbmFtZV8pOwotICBmcHJpbnRmKHN0ZG91dCwgIiVzICAtLXN0ZGVyciAgICAgICAgICAgIER1bXAgc3RkZXJyIHRvIHN0ZG91dFxuIiwgbmFtZV8pOwotICBmZmx1c2gobnVsbHB0cik7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0OjpQYXJzZVZhbHVlKAotICAgIGNoYXIqIG9wdGFyZywgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgc3RyaW5nX2xpc3QpIHsKLSAgQ0hFQ0sob3B0YXJnICE9IG51bGxwdHIpOwotICBjaGFyKiBwID0gb3B0YXJnOwotICBjaGFyKiBwcCA9IG9wdGFyZzsKLSAgd2hpbGUgKCpwICE9ICdcMCcpIHsKLSAgICBpZiAoKnAgPT0gJywnKSB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBzdHJpbmdfbGlzdC5wdXNoX2JhY2soc3RkOjpzdHJpbmcocHApKTsKLSAgICAgIHBwID0gcCArIDE7Ci0gICAgfQotICAgIHArKzsKLSAgfQotICBpZiAocHAgIT0gcCkgc3RyaW5nX2xpc3QucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKHBwKSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQ6OlNwbGl0KAotICAgIHN0ZDo6c3RyaW5nIHMpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3Mocyk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2YWx1ZXM7Ci0gIHN0ZDo6c3RyaW5nIGl0ZW07Ci0gIHdoaWxlIChzdGQ6OmdldGxpbmUoc3MsIGl0ZW0sICc9JykpIHsKLSAgICB2YWx1ZXMucHVzaF9iYWNrKGl0ZW0pOwotICB9Ci0gIHJldHVybiB2YWx1ZXM7Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0OjpQcm9jZXNzT3B0aW9uKGludCBvcHRpb25faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvcHRhcmcpIHsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBzdHJpbmdfbGlzdDsKLSAgT3B0aW9uVHlwZSBvcHRpb25fdHlwZSA9IHN0YXRpY19jYXN0PE9wdGlvblR5cGU+KG9wdGlvbl9pbmRleCk7Ci0KLSAgc3dpdGNoIChvcHRpb25fdHlwZSkgewotICAgIGNhc2Uga09wdGlvbkRldmljZToKLSAgICAgIGlmICghb3B0YXJnKSByZXR1cm47Ci0gICAgICBQYXJzZVZhbHVlKG9wdGFyZywgc3RyaW5nX2xpc3QpOwotICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHN0cmluZ19saXN0KSB7Ci0gICAgICAgIGlmIChSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcyhlbnRyeSkpIHsKLSAgICAgICAgICBSYXdBZGRyZXNzIGFkZHJlc3M7Ci0gICAgICAgICAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyhlbnRyeSwgYWRkcmVzcyk7Ci0gICAgICAgICAgZGV2aWNlXy5wdXNoX2JhY2soYWRkcmVzcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga09wdGlvbkxvb3A6Ci0gICAgICBsb29wXyA9IHN0ZDo6c3RvdWwob3B0YXJnLCBudWxscHRyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga09wdGlvblV1aWQ6Ci0gICAgICBpZiAoIW9wdGFyZykgcmV0dXJuOwotICAgICAgUGFyc2VWYWx1ZShvcHRhcmcsIHN0cmluZ19saXN0KTsKLSAgICAgIGZvciAoYXV0byYgZW50cnkgOiBzdHJpbmdfbGlzdCkgewotICAgICAgICB1dWlkXy5wdXNoX2JhY2soCi0gICAgICAgICAgICBibHVldG9vdGg6OlV1aWQ6OkZyb20xNkJpdChzdGQ6OnN0b3VsKGVudHJ5LmNfc3RyKCksIG51bGxwdHIsIDApKSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtPcHRpb25Nc2xlZXA6Ci0gICAgICBpZiAoIW9wdGFyZykgcmV0dXJuOwotICAgICAgbXNlY18gPSBzdGQ6OnN0b3VsKG9wdGFyZywgbnVsbHB0ciwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtPcHRpb25TdGRFcnI6Ci0gICAgICBjbG9zZV9zdGRlcnJfID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtPcHRpb25GbGFnczoKLSAgICAgIGlmICghb3B0YXJnKSByZXR1cm47Ci0gICAgICBQYXJzZVZhbHVlKG9wdGFyZywgc3RyaW5nX2xpc3QpOwotICAgICAgZm9yIChhdXRvJiBmbGFnIDogc3RyaW5nX2xpc3QpIHsKLSAgICAgICAgaW5pdF9mbGFnc18ucHVzaF9iYWNrKGZsYWcpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrT3B0aW9uQ2xlYXI6Ci0gICAgICBjbGVhcl9sb2djYXRfID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmZmx1c2gobnVsbHB0cik7Ci0gICAgICB2YWxpZF8gPSBmYWxzZTsKLSAgICAgIHJldHVybjsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0OjpQYXJzZVN0YWNrSW5pdEZsYWdzKCkgewotICBpZiAoaW5pdF9mbGFnc18uc2l6ZSgpID09IDApIHJldHVybjsKLQotICBBU1NFUlQoc3RhY2tfaW5pdF9mbGFnc18gPT0gbnVsbHB0cik7Ci0KLSAgdW5zaWduZWQgaWR4ID0gMDsKLSAgc3RhY2tfaW5pdF9mbGFnc18gPSAoY29uc3QgY2hhcioqKWNhbGxvYyhzaXplb2YoY2hhciopLCBpbml0X2ZsYWdzXy5zaXplKCkpOwotICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnIDogaW5pdF9mbGFnc18pCi0gICAgc3RhY2tfaW5pdF9mbGFnc19baWR4KytdID0gZmxhZy5jX3N0cigpOwotICBzdGFja19pbml0X2ZsYWdzX1tpZHhdID0gbnVsbHB0cjsKLX0KLQotY29uc3QgY2hhcioqIGJsdWV0b290aDo6dGVzdDo6aGVhZGxlc3M6OkdldE9wdDo6U3RhY2tJbml0RmxhZ3MoKSBjb25zdCB7Ci0gIHJldHVybiBzdGFja19pbml0X2ZsYWdzXzsKLX0KLQotYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0OjpHZXRPcHQoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotICAgIDogbmFtZV8oYXJndlswXSkgewotICB3aGlsZSAoMSkgewotICAgIGludCBvcHRpb25faW5kZXggPSAwOwotICAgIGludCBjID0KLSAgICAgICAgZ2V0b3B0X2xvbmdfb25seShhcmdjLCBhcmd2LCBrU2hvcnRBcmdzLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOwotICAgIGlmIChjID09IC0xKSBicmVhazsKLQotICAgIHN3aXRjaCAoYykgewotICAgICAgY2FzZSAwOgotICAgICAgICBQcm9jZXNzT3B0aW9uKHN0YXRpY19jYXN0PE9wdGlvblR5cGU+KG9wdGlvbl9pbmRleCksIG9wdGFyZyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIFVzYWdlKCk7Ci0gICAgICAgIHZhbGlkXyA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBwcmludGYoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOwotICAgIH0KLSAgfQotCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKSB7Ci0gICAgbm9uX29wdGlvbnNfLnB1c2hfYmFjayhhcmd2W29wdGluZCsrXSk7Ci0gIH0KLQotICBQYXJzZVN0YWNrSW5pdEZsYWdzKCk7Ci0KLSAgZmZsdXNoKG51bGxwdHIpOwotfQotCi1ibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQ6On5HZXRPcHQoKSB7IGZyZWUoc3RhY2tfaW5pdF9mbGFnc18pOyB9CmRpZmYgLS1naXQgYS90ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmggYi90ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWFjODIuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgaGVhZGxlc3MgewotCi1jbGFzcyBHZXRPcHQgewotIHB1YmxpYzoKLSAgR2V0T3B0KGludCBhcmdjLCBjaGFyKiogYXJ2KTsKLSAgdmlydHVhbCB+R2V0T3B0KCk7Ci0KLSAgdmlydHVhbCB2b2lkIFVzYWdlKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gdmFsaWRfOyB9OwotCi0gIHN0ZDo6c3RyaW5nIEdldE5leHRTdWJUZXN0KCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHRlc3QgPSBub25fb3B0aW9uc18uZnJvbnQoKTsKLSAgICBub25fb3B0aW9uc18ucG9wX2Zyb250KCk7Ci0gICAgcmV0dXJuIHRlc3Q7Ci0gIH0KLQotICBjb25zdCBjaGFyKiogU3RhY2tJbml0RmxhZ3MoKSBjb25zdDsKLQotICBzdGQ6Omxpc3Q8UmF3QWRkcmVzcz4gZGV2aWNlXzsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBpbml0X2ZsYWdzXzsKLSAgc3RkOjpsaXN0PGJsdWV0b290aDo6VXVpZD4gdXVpZF87Ci0gIHVuc2lnbmVkIGxvbmcgbG9vcF97MX07Ci0gIHVuc2lnbmVkIGxvbmcgbXNlY197MH07Ci0KLSAgYm9vbCBjbG9zZV9zdGRlcnJfe3RydWV9OwotICBib29sIGNsZWFyX2xvZ2NhdF97ZmFsc2V9OwotCi0gIG11dGFibGUgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBub25fb3B0aW9uc187Ci0KLSAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTcGxpdChzdGQ6OnN0cmluZyk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFBhcnNlVmFsdWUoY2hhciogb3B0YXJnLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBteV9saXN0KTsKLSAgdm9pZCBQcm9jZXNzT3B0aW9uKGludCBvcHRpb25faW5kZXgsIGNoYXIqIG9wdGFyZyk7Ci0gIHZvaWQgUGFyc2VTdGFja0luaXRGbGFncygpOwotICBjb25zdCBjaGFyKiBuYW1lX3tudWxscHRyfTsKLSAgY29uc3QgY2hhcioqIHN0YWNrX2luaXRfZmxhZ3Nfe251bGxwdHJ9OwotICBib29sIHZhbGlkX3t0cnVlfTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkbGVzcwotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3MvaGVhZGxlc3MuY2MgYi90ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg2ZjRhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvaGVhZGxlc3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9oZWFkbGVzcyIKLQotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLQotI2luY2x1ZGUgPGRsZmNuLmg+ICAvLyAgZGxvcGVuCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiICAvLyBMT0coKSBzdGRvdXQgYW5kIGFuZHJvaWQgbG9nCi0jaW5jbHVkZSAiaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIgIC8vIGFuZHJvaWQgbG9nIG9ubHkKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1leHRlcm4gYnRfaW50ZXJmYWNlX3QgYmx1ZXRvb3RoSW50ZXJmYWNlOwotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczsKLQotc3RkOjptYXA8Y29uc3Qgc3RkOjpzdHJpbmcsIHN0ZDo6bGlzdDxjYWxsYmFja19mdW5jdGlvbl90Pj4KLSAgICBpbnRlcmZhY2VfYXBpX2NhbGxiYWNrX21hcF87Ci0KLXZvaWQgaGVhZGxlc3NfYWRkX2NhbGxiYWNrKGNvbnN0IHN0ZDo6c3RyaW5nIGludGVyZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfZnVuY3Rpb25fdCBmdW5jdGlvbikgewotICBpZiAoaW50ZXJmYWNlX2FwaV9jYWxsYmFja19tYXBfLmZpbmQoaW50ZXJmYWNlX25hbWUpID09Ci0gICAgICBpbnRlcmZhY2VfYXBpX2NhbGxiYWNrX21hcF8uZW5kKCkpIHsKLSAgICBpbnRlcmZhY2VfYXBpX2NhbGxiYWNrX21hcF8uZW1wbGFjZShpbnRlcmZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8Y2FsbGJhY2tfZnVuY3Rpb25fdD4oKSk7Ci0gIH0KLSAgaW50ZXJmYWNlX2FwaV9jYWxsYmFja19tYXBfW2ludGVyZmFjZV9uYW1lXS5wdXNoX2JhY2soZnVuY3Rpb24pOwotfQotCi12b2lkIGhlYWRsZXNzX3JlbW92ZV9jYWxsYmFjayhjb25zdCBzdGQ6OnN0cmluZyBpbnRlcmZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Z1bmN0aW9uX3QgZnVuY3Rpb24pIHsKLSAgaWYgKGludGVyZmFjZV9hcGlfY2FsbGJhY2tfbWFwXy5maW5kKGludGVyZmFjZV9uYW1lKSA9PQotICAgICAgaW50ZXJmYWNlX2FwaV9jYWxsYmFja19tYXBfLmVuZCgpKSB7Ci0gICAgQVNTRVJUX0xPRyhmYWxzZSwgIk5vIGNhbGxiYWNrcyByZWdpc3RlcmVkIGZvciBpbnRlcmZhY2U6JXMiLAotICAgICAgICAgICAgICAgaW50ZXJmYWNlX25hbWUuY19zdHIoKSk7Ci0gIH0KLSAgaW50ZXJmYWNlX2FwaV9jYWxsYmFja19tYXBfW2ludGVyZmFjZV9uYW1lXS5yZW1vdmUoZnVuY3Rpb24pOwotfQotCi1uYW1lc3BhY2Ugewotc3RkOjptdXRleCBhZGFwdGVyX3N0YXRlX211dGV4XzsKLXN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGFkYXB0ZXJfc3RhdGVfY3ZfOwotYnRfc3RhdGVfdCBidF9zdGF0ZV97QlRfU1RBVEVfT0ZGfTsKLQotdm9pZCBhZGFwdGVyX3N0YXRlX2NoYW5nZWQoYnRfc3RhdGVfdCBzdGF0ZSkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxjayhhZGFwdGVyX3N0YXRlX211dGV4Xyk7Ci0gIGJ0X3N0YXRlXyA9IHN0YXRlOwotICBhZGFwdGVyX3N0YXRlX2N2Xy5ub3RpZnlfYWxsKCk7Ci19Ci12b2lkIGFkYXB0ZXJfcHJvcGVydGllcyhidF9zdGF0dXNfdCBzdGF0dXMsIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGRldmljZV9mb3VuZChpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkKGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IHN0YXRlKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLX0KLQotLyoqIEJsdWV0b290aCBMZWdhY3kgUGluS2V5IFJlcXVlc3QgY2FsbGJhY2sgKi8KLXZvaWQgcGluX3JlcXVlc3QoUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIGJ0X2JkbmFtZV90KiBiZF9uYW1lLCB1aW50MzJfdCBjb2QsCi0gICAgICAgICAgICAgICAgIGJvb2wgbWluXzE2X2RpZ2l0KSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBzc3BfcmVxdWVzdChSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwgYnRfYmRuYW1lX3QqIGJkX25hbWUsIHVpbnQzMl90IGNvZCwKLSAgICAgICAgICAgICAgICAgYnRfc3NwX3ZhcmlhbnRfdCBwYWlyaW5nX3ZhcmlhbnQsIHVpbnQzMl90IHBhc3Nfa2V5KSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLX0KLQotLyoqIEJsdWV0b290aCBCb25kIHN0YXRlIGNoYW5nZWQgY2FsbGJhY2sgKi8KLS8qIEludm9rZWQgaW4gcmVzcG9uc2UgdG8gY3JlYXRlX2JvbmQsIGNhbmNlbF9ib25kIG9yIHJlbW92ZV9ib25kICovCi12b2lkIGJvbmRfc3RhdGVfY2hhbmdlZChidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlLCBpbnQgZmFpbF9yZWFzb24pIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotfQotCi0vKiogQmx1ZXRvb3RoIEFDTCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQgY2FsbGJhY2sgKi8KLXZvaWQgYWNsX3N0YXRlX2NoYW5nZWQoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRfYWNsX3N0YXRlX3Qgc3RhdGUsIGludCB0cmFuc3BvcnRfbGlua190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBidF9oY2lfZXJyb3JfY29kZV90IGhjaV9yZWFzb24pIHsKLSAgYXV0byBjYWxsYmFja19saXN0ID0gaW50ZXJmYWNlX2FwaV9jYWxsYmFja19tYXBfLmF0KF9fZnVuY19fKTsKLSAgZm9yIChhdXRvIGNhbGxiYWNrIDogY2FsbGJhY2tfbGlzdCkgewotICAgIGludGVyZmFjZV9kYXRhX3QgcGFyYW1zewotICAgICAgICAubmFtZSA9IF9fZnVuY19fLAotICAgICAgICAucGFyYW1zLmFjbF9zdGF0ZV9jaGFuZ2VkLnN0YXR1cyA9IHN0YXR1cywKLSAgICAgICAgLnBhcmFtcy5hY2xfc3RhdGVfY2hhbmdlZC5yZW1vdGVfYmRfYWRkciA9IHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAucGFyYW1zLmFjbF9zdGF0ZV9jaGFuZ2VkLnN0YXRlID0gc3RhdGUsCi0gICAgICAgIC5wYXJhbXMuYWNsX3N0YXRlX2NoYW5nZWQuaGNpX3JlYXNvbiA9IGhjaV9yZWFzb24sCi0gICAgfTsKLSAgICAoY2FsbGJhY2spKHBhcmFtcyk7Ci0gIH0KLSAgTE9HX0lORk8oIiVzIHN0YXR1czolcyBkZXZpY2U6JXMgc3RhdGU6JXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgYnRfc3RhdHVzX3RleHQoc3RhdHVzKS5jX3N0cigpLCByZW1vdGVfYmRfYWRkci0+VG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAoc3RhdGUpID8gImRpc2Nvbm5lY3RlZCIgOiAiY29ubmVjdGVkIik7Ci19Ci0KLS8qKiBCbHVldG9vdGggTGluayBRdWFsaXR5IFJlcG9ydCBjYWxsYmFjayAqLwotdm9pZCBsaW5rX3F1YWxpdHlfcmVwb3J0KHVpbnQ2NF90IHRpbWVzdGFtcCwgaW50IHJlcG9ydF9pZCwgaW50IHJzc2ksIGludCBzbnIsCi0gICAgaW50IHJldHJhbnNtaXNzaW9uX2NvdW50LCBpbnQgcGFja2V0c19ub3RfcmVjZWl2ZV9jb3VudCwKLSAgICBpbnQgbmVnYXRpdmVfYWNrbm93bGVkZ2VtZW50X2NvdW50KSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCB0aHJlYWRfZXZlbnQoYnRfY2JfdGhyZWFkX2V2dCBldnQpIHsgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOyB9Ci0KLXZvaWQgZHV0X21vZGVfcmVjdih1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotfQotCi12b2lkIGxlX3Rlc3RfbW9kZShidF9zdGF0dXNfdCBzdGF0dXMsIHVpbnQxNl90IG51bV9wYWNrZXRzKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBlbmVyZ3lfaW5mbyhidF9hY3Rpdml0eV9lbmVyZ3lfaW5mbyogZW5lcmd5X2luZm8sCi0gICAgICAgICAgICAgICAgIGJ0X3VpZF90cmFmZmljX3QqIHVpZF9kYXRhKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLX0KLQotYnRfY2FsbGJhY2tzX3QgYnRfY2FsbGJhY2tzewotICAgIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0X2NhbGxiYWNrc190KSAqLwotICAgIC5zaXplID0gc2l6ZW9mKGJ0X2NhbGxiYWNrc190KSwKLSAgICAuYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiID0gYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkLAotICAgIC5hZGFwdGVyX3Byb3BlcnRpZXNfY2IgPSBhZGFwdGVyX3Byb3BlcnRpZXMsCi0gICAgLnJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYiA9IHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcywKLSAgICAuZGV2aWNlX2ZvdW5kX2NiID0gZGV2aWNlX2ZvdW5kLAotICAgIC5kaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYiA9IGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkLAotICAgIC5waW5fcmVxdWVzdF9jYiA9IHBpbl9yZXF1ZXN0LAotICAgIC5zc3BfcmVxdWVzdF9jYiA9IHNzcF9yZXF1ZXN0LAotICAgIC5ib25kX3N0YXRlX2NoYW5nZWRfY2IgPSBib25kX3N0YXRlX2NoYW5nZWQsCi0gICAgLmFjbF9zdGF0ZV9jaGFuZ2VkX2NiID0gYWNsX3N0YXRlX2NoYW5nZWQsCi0gICAgLnRocmVhZF9ldnRfY2IgPSB0aHJlYWRfZXZlbnQsCi0gICAgLmR1dF9tb2RlX3JlY3ZfY2IgPSBkdXRfbW9kZV9yZWN2LAotICAgIC5sZV90ZXN0X21vZGVfY2IgPSBsZV90ZXN0X21vZGUsCi0gICAgLmVuZXJneV9pbmZvX2NiID0gZW5lcmd5X2luZm8sCi0gICAgLmxpbmtfcXVhbGl0eV9yZXBvcnRfY2IgPSBsaW5rX3F1YWxpdHlfcmVwb3J0LAotfTsKLS8vIEhBTCBIQVJEV0FSRSBDQUxMQkFDS1MKLQotLy8gT1MgQ0FMTE9VVFMKLWJvb2wgc2V0X3dha2VfYWxhcm1fY28odWludDY0X3QgZGVsYXlfbWlsbGlzLCBib29sIHNob3VsZF93YWtlLCBhbGFybV9jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiB0cnVlOwotfQotaW50IGFjcXVpcmVfd2FrZV9sb2NrX2NvKGNvbnN0IGNoYXIqIGxvY2tfbmFtZSkgewotICBMT0dfSU5GTygiJXMiLCBfX2Z1bmNfXyk7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgcmVsZWFzZV93YWtlX2xvY2tfY28oY29uc3QgY2hhciogbG9ja19uYW1lKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJ0X29zX2NhbGxvdXRzX3QgYnRfb3NfY2FsbG91dHN7Ci0gICAgLnNpemUgPSBzaXplb2YoYnRfb3NfY2FsbG91dHNfdCksCi0gICAgLnNldF93YWtlX2FsYXJtID0gc2V0X3dha2VfYWxhcm1fY28sCi0gICAgLmFjcXVpcmVfd2FrZV9sb2NrID0gYWNxdWlyZV93YWtlX2xvY2tfY28sCi0gICAgLnJlbGVhc2Vfd2FrZV9sb2NrID0gcmVsZWFzZV93YWtlX2xvY2tfY28sCi19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgSGVhZGxlc3NTdGFjazo6U2V0VXAoKSB7Ci0gIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEVudHJ5IjsKLQotICBjb25zdCBib29sIHN0YXJ0X3Jlc3RyaWN0ZWQgPSBmYWxzZTsKLSAgY29uc3QgYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSA9IGZhbHNlOwotICBjb25zdCBpbnQgY29uZmlnX2NvbXBhcmVfcmVzdWx0ID0gMDsKLSAgY29uc3QgYm9vbCBpc19hdHYgPSBmYWxzZTsKLSAgaW50IHN0YXR1cyA9IGJsdWV0b290aEludGVyZmFjZS5pbml0KAotICAgICAgJmJ0X2NhbGxiYWNrcywgc3RhcnRfcmVzdHJpY3RlZCwgaXNfY29tbW9uX2NyaXRlcmlhX21vZGUsCi0gICAgICBjb25maWdfY29tcGFyZV9yZXN1bHQsIFN0YWNrSW5pdEZsYWdzKCksIGlzX2F0dik7Ci0KLSAgKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUykKLSAgICAgID8gTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgSW5pdGlhbGl6ZWQgYmx1ZXRvb3RoIGNhbGxiYWNrcyIKLSAgICAgIDogTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQmx1ZXRvb3RoIHN0YWNrIjsKLQotICBzdGF0dXMgPSBibHVldG9vdGhJbnRlcmZhY2Uuc2V0X29zX2NhbGxvdXRzKCZidF9vc19jYWxsb3V0cyk7Ci0gIChzdGF0dXMgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICA/IExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiIEluaXRpYWxpemVkIG9zIGNhbGxvdXRzIgotICAgICAgOiBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHVwIEJsdWV0b290aCBPUyBjYWxsb3V0cyI7Ci0KLSAgYmx1ZXRvb3RoSW50ZXJmYWNlLmVuYWJsZSgpOwotICBMT0dfSU5GTygiJXMgSGVhZGxlc3NTdGFjayBzdGFjayBoYXMgZW5hYmxlZCIsIF9fZnVuY19fKTsKLQotICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxjayhhZGFwdGVyX3N0YXRlX211dGV4Xyk7Ci0gIHdoaWxlIChidF9zdGF0ZV8gIT0gQlRfU1RBVEVfT04pIGFkYXB0ZXJfc3RhdGVfY3ZfLndhaXQobGNrKTsKLSAgTE9HX0lORk8oIiVzIEhlYWRsZXNzU3RhY2sgc3RhY2sgaXMgb3BlcmF0aW9uYWwiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgSGVhZGxlc3NTdGFjazo6VGVhckRvd24oKSB7Ci0gIExPR19JTkZPKCJTdGFjayBoYXMgZGlzYWJsZWQiKTsKLSAgaW50IHN0YXR1cyA9IGJsdWV0b290aEludGVyZmFjZS5kaXNhYmxlKCk7Ci0KLSAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICIgSW50ZXJmYWNlIGhhcyBiZWVuIGRpc2FibGVkIHN0YXR1czoiIDw8IHN0YXR1czsKLQotICBibHVldG9vdGhJbnRlcmZhY2UuY2xlYW51cCgpOwotICBMT0coSU5GTykgPDwgX19mdW5jX18gPDwgIiBDbGVhbmVkIHVwIGhhbCBibHVldG9vdGggbGlicmFyeSI7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsY2soYWRhcHRlcl9zdGF0ZV9tdXRleF8pOwotICB3aGlsZSAoYnRfc3RhdGVfICE9IEJUX1NUQVRFX09GRikgYWRhcHRlcl9zdGF0ZV9jdl8ud2FpdChsY2spOwotICBMT0dfSU5GTygiJXMgSGVhZGxlc3NTdGFjayBzdGFjayBoYXMgZXhpdGVkIiwgX19mdW5jX18pOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9oZWFkbGVzcy5oIGIvdGVzdC9oZWFkbGVzcy9oZWFkbGVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMxYjcwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIiAgLy8gTE9HKCkgc3Rkb3V0IGFuZCBhbmRyb2lkIGxvZwotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotCi1leHRlcm4gYnRfaW50ZXJmYWNlX3QgYmx1ZXRvb3RoSW50ZXJmYWNlOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBoZWFkbGVzcyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdXNpbmcgRXhlY3V0aW9uVW5pdCA9IHN0ZDo6ZnVuY3Rpb248VCgpPjsKLQotY29uc3RleHByIGNoYXIga0hlYWRsZXNzSW5pdGlhbFNlbnRpbmVsW10gPQotICAgICIgSU5JVElBTCBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyAiCi0gICAgIkhFQURMRVNTIjsKLWNvbnN0ZXhwciBjaGFyIGtIZWFkbGVzc1N0YXJ0U2VudGluZWxbXSA9Ci0gICAgIiBTVEFSVCBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyBIRUFETEVTUyAiCi0gICAgIkhFQURMRVNTIjsKLWNvbnN0ZXhwciBjaGFyIGtIZWFkbGVzc1N0b3BTZW50aW5lbFtdID0KLSAgICAiIFNUT1AgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgIgotICAgICJIRUFETEVTUyI7Ci1jb25zdGV4cHIgY2hhciBrSGVhZGxlc3NGaW5hbFNlbnRpbmVsW10gPQotICAgICIgRklOQUwgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgSEVBRExFU1MgIgotICAgICJIRUFETEVTUyI7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBIZWFkbGVzc1N0YWNrIHsKLSBwcm90ZWN0ZWQ6Ci0gIEhlYWRsZXNzU3RhY2soY29uc3QgY2hhcioqIHN0YWNrX2luaXRfZmxhZ3MpCi0gICAgICA6IHN0YWNrX2luaXRfZmxhZ3NfKHN0YWNrX2luaXRfZmxhZ3MpIHt9Ci0gIHZpcnR1YWwgfkhlYWRsZXNzU3RhY2soKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpOwotICB2b2lkIFRlYXJEb3duKCk7Ci0gIGNvbnN0IGNoYXIqKiBTdGFja0luaXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIHN0YWNrX2luaXRfZmxhZ3NfOyB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBjaGFyKiogc3RhY2tfaW5pdF9mbGFnc187Ci19OwotCi1jbGFzcyBIZWFkbGVzc1J1biA6IHB1YmxpYyBIZWFkbGVzc1N0YWNrIHsKLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IGJsdWV0b290aDo6dGVzdDo6aGVhZGxlc3M6OkdldE9wdCYgb3B0aW9uc187Ci0gIHVuc2lnbmVkIGxvbmcgbG9vcF97MH07Ci0KLSAgSGVhZGxlc3NSdW4oY29uc3QgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0JiBvcHRpb25zKQotICAgICAgOiBIZWFkbGVzc1N0YWNrKG9wdGlvbnMuU3RhY2tJbml0RmxhZ3MoKSksIG9wdGlvbnNfKG9wdGlvbnMpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIFQgUnVuT25IZWFkbGVzc1N0YWNrKEV4ZWN1dGlvblVuaXQ8VD4gZnVuYykgewotICAgIExPRyhJTkZPKSA8PCBrSGVhZGxlc3NJbml0aWFsU2VudGluZWw7Ci0gICAgU2V0VXAoKTsKLSAgICBMT0coSU5GTykgPDwga0hlYWRsZXNzU3RhcnRTZW50aW5lbDsKLQotICAgIFQgcmM7Ci0gICAgZm9yIChsb29wXyA9IDA7IGxvb3BfIDwgb3B0aW9uc18ubG9vcF87IGxvb3BfKyspIHsKLSAgICAgIHJjID0gZnVuYygpOwotICAgICAgaWYgKG9wdGlvbnNfLm1zZWNfICE9IDApIHsKLSAgICAgICAgdXNsZWVwKG9wdGlvbnNfLm1zZWNfICogMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAocmMpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChyYykgewotICAgICAgTE9HKEVSUk9SKSA8PCAiRkFJTDoiIDw8IHJjIDw8ICIgbG9vcC9sb29wczoiIDw8IGxvb3BfIDw8ICIvIgotICAgICAgICAgICAgICAgICA8PCBvcHRpb25zXy5sb29wXzsKLSAgICB9IGVsc2UgewotICAgICAgTE9HKElORk8pIDw8ICJQQVNTOiIgPDwgcmMgPDwgIiBsb29wL2xvb3BzOiIgPDwgbG9vcF8gPDwgIi8iCi0gICAgICAgICAgICAgICAgPDwgb3B0aW9uc18ubG9vcF87Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IGtIZWFkbGVzc1N0b3BTZW50aW5lbDsKLSAgICBUZWFyRG93bigpOwotICAgIExPRyhJTkZPKSA8PCBrSGVhZGxlc3NGaW5hbFNlbnRpbmVsOwotICAgIHJldHVybiByYzsKLSAgfQotICB2aXJ0dWFsIH5IZWFkbGVzc1J1bigpID0gZGVmYXVsdDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSGVhZGxlc3NUZXN0IDogcHVibGljIEhlYWRsZXNzUnVuIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgVCBSdW4oKSB7Ci0gICAgaWYgKG9wdGlvbnNfLm5vbl9vcHRpb25zXy5zaXplKCkgPT0gMCkgewotICAgICAgZnByaW50ZihzdGRvdXQsICJNdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgc3VidGVzdCBuYW1lXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBzdWJ0ZXN0ID0gb3B0aW9uc18uR2V0TmV4dFN1YlRlc3QoKTsKLSAgICBpZiAodGVzdF9ub2Rlc18uZmluZChzdWJ0ZXN0KSA9PSB0ZXN0X25vZGVzXy5lbmQoKSkgewotICAgICAgZnByaW50ZihzdGRvdXQsICJVbmtub3duIHN1YnRlc3QgbW9kdWxlOiVzXG4iLCBzdWJ0ZXN0LmNfc3RyKCkpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gdGVzdF9ub2Rlc18uYXQoc3VidGVzdCktPlJ1bigpOwotICB9Ci0KLSAgdmlydHVhbCB+SGVhZGxlc3NUZXN0KCkgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICBIZWFkbGVzc1Rlc3QoY29uc3QgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0JiBvcHRpb25zKQotICAgICAgOiBIZWFkbGVzc1J1bihvcHRpb25zKSB7fQotCi0gIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPEhlYWRsZXNzVGVzdDxUPj4+IHRlc3Rfbm9kZXNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhlYWRsZXNzCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9pbnRlcmZhY2UuaCBiL3Rlc3QvaGVhZGxlc3MvaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGU1NjIuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLQotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgYWNsX3N0YXRlX2NoYW5nZWRfcGFyYW1zX3QgPSBzdHJ1Y3QgewotICBidF9zdGF0dXNfdCBzdGF0dXM7Ci0gIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyOwotICBidF9hY2xfc3RhdGVfdCBzdGF0ZTsKLSAgYnRfaGNpX2Vycm9yX2NvZGVfdCBoY2lfcmVhc29uOwotfTsKLQotdXNpbmcgY2FsbGJhY2tfcGFyYW1zX3QgPSB1bmlvbiB7Ci0gIGFjbF9zdGF0ZV9jaGFuZ2VkX3BhcmFtc190IGFjbF9zdGF0ZV9jaGFuZ2VkOwotfTsKLQotdXNpbmcgaW50ZXJmYWNlX2RhdGFfdCA9IHN0cnVjdCB7Ci0gIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gIGNhbGxiYWNrX3BhcmFtc190IHBhcmFtczsKLX07Ci0KLXVzaW5nIGNhbGxiYWNrX2Z1bmN0aW9uX3QgPSB2b2lkICgqKShpbnRlcmZhY2VfZGF0YV90KTsKLXVzaW5nIGludGVyZmFjZV9jYWxsYmFja190ID0gc3RydWN0IHsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgY2FsbGJhY2tfZnVuY3Rpb25fdCBmdW5jdGlvbjsKLX07Ci0KLXZvaWQgaGVhZGxlc3NfYWRkX2NhbGxiYWNrKGNvbnN0IHN0ZDo6c3RyaW5nIGludGVyZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfZnVuY3Rpb25fdCBmdW5jdGlvbik7Ci12b2lkIGhlYWRsZXNzX3JlbW92ZV9jYWxsYmFjayhjb25zdCBzdGQ6OnN0cmluZyBpbnRlcmZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Z1bmN0aW9uX3QgZnVuY3Rpb24pOwpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9tYWluLmNjIGIvdGVzdC9oZWFkbGVzcy9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRkMGI2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2hlYWRsZXNzIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIgICAgIC8vIExPRygpIHN0ZG91dCBhbmQgYW5kcm9pZCBsb2cKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIgIC8vIGFuZHJvaWQgbG9nIG9ubHkKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2Nvbm5lY3QvY29ubmVjdC5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZHVtcHN5cy9kdW1wc3lzLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL25vcC9ub3AuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL3BhaXJpbmcvcGFpcmluZy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvcmVhZC9yZWFkLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9zZHAvc2RwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOwotCi1uYW1lc3BhY2UgewotCi12b2lkIGNsZWFyX2xvZ2NhdCgpIHsKLSAgaW50IHBpZDsKLSAgaWYgKChwaWQgPSBmb3JrKCkpKSB7Ci0gICAgLy8gcGFyZW50IHByb2Nlc3MKLSAgICBpbnQgc3RhdHVzOwotICAgIHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsgIC8vIHdhaXQgZm9yIHRoZSBjaGlsZCB0byBleGl0Ci0gICAgQVNTRVJUX0xPRyhXSUZFWElURUQoc3RhdHVzKSwgIlVuYWJsZSB0byBjbGVhciBsb2djYXQiKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBjaGlsZCBwcm9jZXNzCi0gICAgY29uc3QgY2hhciBleGVjW10gPSAiL3N5c3RlbS9iaW4vbG9nY2F0IjsKLSAgICBjb25zdCBjaGFyIGFyZzBbXSA9ICItYyI7Ci0KLSAgICBleGVjbChleGVjLCBleGVjLCBhcmcwLCBOVUxMKTsKLQotICAgIEFTU0VSVF9MT0coZmFsc2UsICJTaG91bGQgbm90IHJldHVybiBmcm9tIGV4ZWMgcHJvY2VzcyIpOwotICB9Ci19Ci0KLWNsYXNzIE1haW4gOiBwdWJsaWMgSGVhZGxlc3NUZXN0PGludD4gewotIHB1YmxpYzoKLSAgTWFpbihjb25zdCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQmIG9wdGlvbnMpCi0gICAgICA6IEhlYWRsZXNzVGVzdDxpbnQ+KG9wdGlvbnMpIHsKLSAgICB0ZXN0X25vZGVzXy5lbXBsYWNlKAotICAgICAgICAiZHVtcHN5cyIsCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6RHVtcHN5cz4ob3B0aW9ucykpOwotICAgIHRlc3Rfbm9kZXNfLmVtcGxhY2UoCi0gICAgICAgICJjb25uZWN0IiwKLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpDb25uZWN0PihvcHRpb25zKSk7Ci0gICAgdGVzdF9ub2Rlc18uZW1wbGFjZSgKLSAgICAgICAgIm5vcCIsIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6Tm9wPihvcHRpb25zKSk7Ci0gICAgdGVzdF9ub2Rlc18uZW1wbGFjZSgKLSAgICAgICAgInBhaXJpbmciLAotICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6dGVzdDo6aGVhZGxlc3M6OlBhaXJpbmc+KG9wdGlvbnMpKTsKLSAgICB0ZXN0X25vZGVzXy5lbXBsYWNlKAotICAgICAgICAicmVhZCIsIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6UmVhZD4ob3B0aW9ucykpOwotICAgIHRlc3Rfbm9kZXNfLmVtcGxhY2UoCi0gICAgICAgICJzZHAiLCBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6dGVzdDo6aGVhZGxlc3M6OlNkcD4ob3B0aW9ucykpOwotICB9Ci0KLSAgaW50IFJ1bigpIG92ZXJyaWRlIHsKLSAgICBpZiAob3B0aW9uc18uY2xvc2Vfc3RkZXJyXykgewotICAgICAgZmNsb3NlKHN0ZGVycik7Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbnNfLmNsZWFyX2xvZ2NhdF8pIHsKLSAgICAgIGNsZWFyX2xvZ2NhdCgpOwotICAgIH0KLQotICAgIHJldHVybiBIZWFkbGVzc1Rlc3Q8aW50Pjo6UnVuKCk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgZmZsdXNoKG51bGxwdHIpOwotICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTEJGLCAwKTsKLQotICBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQgb3B0aW9ucyhhcmdjLCBhcmd2KTsKLSAgaWYgKCFvcHRpb25zLklzVmFsaWQoKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIE1haW4gbWFpbihvcHRpb25zKTsKLSAgcmV0dXJuIG1haW4uUnVuKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2hlYWRsZXNzL25vcC9ub3AuY2MgYi90ZXN0L2hlYWRsZXNzL25vcC9ub3AuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWM0MmMuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9ub3Avbm9wLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9oZWFkbGVzc19zZHAiCi0KLSNpbmNsdWRlIDxmdXR1cmU+Ci0KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIgICAgIC8vIExPRygpIHN0ZG91dCBhbmQgYW5kcm9pZCBsb2cKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIgIC8vIGFuZHJvaWQgbG9nIG9ubHkKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9oZWFkbGVzcy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3Mvbm9wL25vcC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLWludCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpOb3A6OlJ1bigpIHsKLSAgcmV0dXJuIFJ1bk9uSGVhZGxlc3NTdGFjazxpbnQ+KFt0aGlzXSgpIHsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIk5vcCBsb29wOiVsdVxuIiwgbG9vcF8pOwotICAgIHJldHVybiAwOwotICB9KTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3Mvbm9wL25vcC5oIGIvdGVzdC9oZWFkbGVzcy9ub3Avbm9wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NWVmYTMuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9ub3Avbm9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmgiCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIGhlYWRsZXNzIHsKLQotY2xhc3MgTm9wIDogcHVibGljIEhlYWRsZXNzVGVzdDxpbnQ+IHsKLSBwdWJsaWM6Ci0gIE5vcChjb25zdCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQmIG9wdGlvbnMpCi0gICAgICA6IEhlYWRsZXNzVGVzdDxpbnQ+KG9wdGlvbnMpIHt9Ci0gIGludCBSdW4oKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkbGVzcwotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3MvcGFpcmluZy9wYWlyaW5nLmNjIGIvdGVzdC9oZWFkbGVzcy9wYWlyaW5nL3BhaXJpbmcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWM0OTAuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9wYWlyaW5nL3BhaXJpbmcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2hlYWRsZXNzX3NkcCIKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIiAgLy8gTE9HKCkgc3Rkb3V0IGFuZCBhbmRyb2lkIGxvZwotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIiAgLy8gYW5kcm9pZCBsb2cgb25seQotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9wYWlyaW5nL3BhaXJpbmcuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1pbnQgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6UGFpcmluZzo6UnVuKCkgewotICBpZiAob3B0aW9uc18ubG9vcF8gPCAxKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJUaGlzIHRlc3QgcmVxdWlyZXMgYXQgbGVhc3QgYSBzaW5nbGUgbG9vcCIpOwotICAgIG9wdGlvbnNfLlVzYWdlKCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChvcHRpb25zXy5kZXZpY2VfLnNpemUoKSAhPSAxKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJUaGlzIHRlc3QgcmVxdWlyZXMgYSBzaW5nbGUgZGV2aWNlIHNwZWNpZmllZCIpOwotICAgIG9wdGlvbnNfLlVzYWdlKCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgUmF3QWRkcmVzcyByYXdfYWRkcmVzcyA9IG9wdGlvbnNfLmRldmljZV8uZnJvbnQoKTsKLQotICByZXR1cm4gUnVuT25IZWFkbGVzc1N0YWNrPGludD4oW3Jhd19hZGRyZXNzXSgpIHsKLSAgICBidGlmX2RtX2NyZWF0ZV9ib25kKHJhd19hZGRyZXNzLCBCVF9UUkFOU1BPUlRfQlJfRURSKTsKLSAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci0gIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9wYWlyaW5nL3BhaXJpbmcuaCBiL3Rlc3QvaGVhZGxlc3MvcGFpcmluZy9wYWlyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjVkNDguLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9wYWlyaW5nL3BhaXJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2dldF9vcHRpb25zLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9oZWFkbGVzcy5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBoZWFkbGVzcyB7Ci0KLWNsYXNzIFBhaXJpbmcgOiBwdWJsaWMgSGVhZGxlc3NUZXN0PGludD4gewotIHB1YmxpYzoKLSAgUGFpcmluZyhjb25zdCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQmIG9wdGlvbnMpCi0gICAgICA6IEhlYWRsZXNzVGVzdDxpbnQ+KG9wdGlvbnMpIHt9Ci0gIGludCBSdW4oKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkbGVzcwotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3MvcmVhZC9uYW1lLmNjIGIvdGVzdC9oZWFkbGVzcy9yZWFkL25hbWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOGVhOWYuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9yZWFkL25hbWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImJ0X2hlYWRsZXNzX3NkcCIKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIiAgICAgLy8gTE9HKCkgc3Rkb3V0IGFuZCBhbmRyb2lkIGxvZwotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIiAgLy8gYW5kcm9pZCBsb2cgb25seQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9yZWFkL25hbWUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGQ6OnByb21pc2U8dEJUTV9SRU1PVEVfREVWX05BTUU+IHByb21pc2VfOwotCi12b2lkIFJlbW90ZU5hbWVDYWxsYmFjayh2b2lkKiBkYXRhKSB7Ci0gIHByb21pc2VfLnNldF92YWx1ZSgqc3RhdGljX2Nhc3Q8dEJUTV9SRU1PVEVfREVWX05BTUUqPihkYXRhKSk7Ci19Ci0KLWludCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpOYW1lOjpSdW4oKSB7Ci0gIGlmIChvcHRpb25zXy5sb29wXyA8IDEpIHsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlRoaXMgdGVzdCByZXF1aXJlcyBhdCBsZWFzdCBhIHNpbmdsZSBsb29wIik7Ci0gICAgb3B0aW9uc18uVXNhZ2UoKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKG9wdGlvbnNfLmRldmljZV8uc2l6ZSgpICE9IDEpIHsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlRoaXMgdGVzdCByZXF1aXJlcyBhIHNpbmdsZSBkZXZpY2Ugc3BlY2lmaWVkIik7Ci0gICAgb3B0aW9uc18uVXNhZ2UoKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcyA9IG9wdGlvbnNfLmRldmljZV8uZnJvbnQoKTsKLQotICByZXR1cm4gUnVuT25IZWFkbGVzc1N0YWNrPGludD4oWyZyYXdfYWRkcmVzc10oKSB7Ci0gICAgcHJvbWlzZV8gPSBzdGQ6OnByb21pc2U8dEJUTV9SRU1PVEVfREVWX05BTUU+KCk7Ci0KLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2VfLmdldF9mdXR1cmUoKTsKLQotICAgIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZSgKLSAgICAgICAgcmF3X2FkZHJlc3MsICZSZW1vdGVOYW1lQ2FsbGJhY2ssIEJUX1RSQU5TUE9SVF9CUl9FRFIpOwotICAgIGlmIChzdGF0dXMgIT0gQlRNX0NNRF9TVEFSVEVEKSB7Ci0gICAgICBmcHJpbnRmKHN0ZG91dCwgIkZhaWx1cmUgdG8gc3RhcnQgcmVhZCByZW1vdGUgZGV2aWNlXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICB0QlRNX1JFTU9URV9ERVZfTkFNRSBuYW1lX3BhY2tldCA9IGZ1dHVyZS5nZXQoKTsKLSAgICBzd2l0Y2ggKG5hbWVfcGFja2V0LnN0YXR1cykgewotICAgICAgY2FzZSBCVE1fU1VDQ0VTUzogewotICAgICAgICBjaGFyIGJ1ZltCRF9OQU1FX0xFTl07Ci0gICAgICAgIG1lbWNweShidWYsIG5hbWVfcGFja2V0LnJlbW90ZV9iZF9uYW1lLCBCRF9OQU1FX0xFTik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUoYnVmKTsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJOYW1lIHJlc3VsdCBtYWM6JXMgbmFtZTolc1xuIiwKLSAgICAgICAgICAgICAgICByYXdfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBCVE1fQkFEX1ZBTFVFX1JFVDoKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICJOYW1lIFRpbWVvdXQgb3Igb3RoZXIgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlVuZXhwZWN0ZWQgcmVtb3RlIG5hbWUgcmVxdWVzdCBmYWlsdXJlIHN0YXR1czolaGQiLAotICAgICAgICAgICAgICAgIG5hbWVfcGFja2V0LnN0YXR1cyk7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9yZWFkL25hbWUuaCBiL3Rlc3QvaGVhZGxlc3MvcmVhZC9uYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2NlZTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9yZWFkL25hbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgaGVhZGxlc3MgewotCi1jbGFzcyBOYW1lIDogcHVibGljIEhlYWRsZXNzVGVzdDxpbnQ+IHsKLSBwdWJsaWM6Ci0gIE5hbWUoY29uc3QgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0JiBvcHRpb25zKQotICAgICAgOiBIZWFkbGVzc1Rlc3Q8aW50PihvcHRpb25zKSB7fQotICBpbnQgUnVuKCkgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGVhZGxlc3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS90ZXN0L2hlYWRsZXNzL3JlYWQvcmVhZC5jYyBiL3Rlc3QvaGVhZGxlc3MvcmVhZC9yZWFkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWEzYjhkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3MvcmVhZC9yZWFkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9oZWFkbGVzcyIKLQotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvcmVhZC9yZWFkLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiICAgICAvLyBMT0coKSBzdGRvdXQgYW5kIGFuZHJvaWQgbG9nCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiICAvLyBhbmRyb2lkIGxvZyBvbmx5Ci0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL3JlYWQvbmFtZS5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczsKLQotUmVhZDo6UmVhZChjb25zdCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpHZXRPcHQmIG9wdGlvbnMpCi0gICAgOiBIZWFkbGVzc1Rlc3Q8aW50PihvcHRpb25zKSB7Ci0gIHRlc3Rfbm9kZXNfLmVtcGxhY2UoCi0gICAgICAibmFtZSIsIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6TmFtZT4ob3B0aW9ucykpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9yZWFkL3JlYWQuaCBiL3Rlc3QvaGVhZGxlc3MvcmVhZC9yZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YWIwZjIuLjAwMDAwMDAKLS0tIGEvdGVzdC9oZWFkbGVzcy9yZWFkL3JlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgaGVhZGxlc3MgewotCi1jbGFzcyBSZWFkIDogcHVibGljIEhlYWRsZXNzVGVzdDxpbnQ+IHsKLSBwdWJsaWM6Ci0gIFJlYWQoY29uc3QgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczo6R2V0T3B0JiBvcHRpb25zKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBoZWFkbGVzcwotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvaGVhZGxlc3Mvc2RwL3NkcC5jYyBiL3Rlc3QvaGVhZGxlc3Mvc2RwL3NkcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyZjMyZi4uMDAwMDAwMAotLS0gYS90ZXN0L2hlYWRsZXNzL3NkcC9zZHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJidF9oZWFkbGVzc19zZHAiCi0KLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL3NkcC9zZHAuaCIKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIiAgICAgLy8gTE9HKCkgc3Rkb3V0IGFuZCBhbmRyb2lkIGxvZwotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIiAgLy8gYW5kcm9pZCBsb2cgb25seQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvZ2V0X29wdGlvbnMuaCIKLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL2hlYWRsZXNzLmgiCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9zZHAvc2RwX2RiLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjp0ZXN0OjpoZWFkbGVzczsKLQotc3RhdGljIHZvaWQgYnRhX2p2X3N0YXJ0X2Rpc2NvdmVyeV9jYWxsYmFjayh0U0RQX1NUQVRVUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHVzZXJfZGF0YSkgewotICBhdXRvIHByb21pc2UgPQotICAgICAgc3RhdGljX2Nhc3Q8c3RkOjpwcm9taXNlPHVpbnQxNl90Pio+KGNvbnN0X2Nhc3Q8dm9pZCo+KHVzZXJfZGF0YSkpOwotICBwcm9taXNlLT5zZXRfdmFsdWUocmVzdWx0KTsKLX0KLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IHNkcF9lcnJvcl9jb2RlX3MgewotICBjb25zdCBjaGFyKiBuYW1lOwotICB1aW50MTZfdCBlcnJvcl9jb2RlOwotfSBzZHBfZXJyb3JfY29kZVtdID0gewotICAgIHsiS3NkcFN1Y2Nlc3MiLCAwfSwKLSAgICB7IktzZHBJbnZhbGlkVmVyc2lvbiIsIDB4MDAwMX0sCi0gICAgeyJLc2RwSW52YWxpZFNlcnZSZWNIZGwiLCAweDAwMDJ9LAotICAgIHsiS3NkcEludmFsaWRSZXFTeW50YXgiLCAweDAwMDN9LAotICAgIHsiS3NkcEludmFsaWRQZHVTaXplIiwgMHgwMDA0fSwKLSAgICB7IktzZHBJbnZhbGlkQ29udFN0YXRlIiwgMHgwMDA1fSwKLSAgICB7IktzZHBOb1Jlc291cmNlcyIsIDB4MDAwNn0sCi0gICAgeyJLc2RwRGlSZWdGYWlsZWQiLCAweDAwMDd9LAotICAgIHsiS3NkcERpRGlzY0ZhaWxlZCIsIDB4MDAwOH0sCi0gICAgeyJLc2RwTm9EaVJlY29yZEZvdW5kIiwgMHgwMDA5fSwKLSAgICB7IktzZHBFcnJBdHRyTm90UHJlc2VudCIsIDB4MDAwYX0sCi0gICAgeyJLc2RwSWxsZWdhbFBhcmFtZXRlciIsIDB4MDAwYn0sCi0gICAgeyJLc2RwTm9SZWNzTWF0Y2giLCAweEZGRjB9LAotICAgIHsiS3NkcENvbm5GYWlsZWQiLCAweEZGRjF9LAotICAgIHsiS3NkcENmZ0ZhaWxlZCIsIDB4RkZGMn0sCi0gICAgeyJLc2RwR2VuZXJpY0Vycm9yIiwgMHhGRkYzfSwKLSAgICB7IktzZHBEYkZ1bGwiLCAweEZGRjR9LAotICAgIHsiS3NkcEludmFsaWRQZHUiLCAweEZGRjV9LAotICAgIHsiS3NkcFNlY3VyaXR5RXJyIiwgMHhGRkY2fSwKLSAgICB7IktzZHBDb25uUmVqZWN0ZWQiLCAweEZGRjd9LAotICAgIHsiS3NkcENhbmNlbCIsIDB4RkZGOH0sCi19OwotCi1jb25zdCBjaGFyKiBrVW5rbm93blRleHQgPSAiVW5rbm93biI7Ci0KLWNvbnN0IGNoYXIqIFNkcEVycm9yQ29kZVRvU3RyaW5nKHVpbnQxNl90IGNvZGUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2RwX2Vycm9yX2NvZGUpIC8gc2l6ZW9mKHNkcF9lcnJvcl9jb2RlX3MpOwotICAgICAgICsraSkgewotICAgIGlmIChzZHBfZXJyb3JfY29kZVtpXS5lcnJvcl9jb2RlID09IGNvZGUpIHsKLSAgICAgIHJldHVybiBzZHBfZXJyb3JfY29kZVtpXS5uYW1lOwotICAgIH0KLSAgfQotICByZXR1cm4ga1Vua25vd25UZXh0OwotfQotCi1jb25zdGV4cHIgc2l6ZV90IGtNYXhEaXNjb3ZlcnlSZWNvcmRzID0gNjQ7Ci0KLWludCBzZHBfcXVlcnlfdXVpZCh1bnNpZ25lZCBpbnQgbnVtX2xvb3BzLCBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQpIHsKLSAgU2RwRGIgc2RwX2Rpc2NvdmVyeV9kYihrTWF4RGlzY292ZXJ5UmVjb3Jkcyk7Ci0KLSAgaWYgKCFTRFBfSW5pdERpc2NvdmVyeURiKHNkcF9kaXNjb3ZlcnlfZGIuUmF3UG9pbnRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwX2Rpc2NvdmVyeV9kYi5MZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAvLyBudW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLCAwLCBudWxscHRyKSkgewotICAgIGZwcmludGYoc3Rkb3V0LCAiJXMgVW5hYmxlIHRvIGluaXRpYWxpemUgc2RwIGRpc2NvdmVyeVxuIiwgX19mdW5jX18pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHN0ZDo6cHJvbWlzZTx1aW50MTZfdD4gcHJvbWlzZTsKLSAgYXV0byBmdXR1cmUgPSBwcm9taXNlLmdldF9mdXR1cmUoKTsKLQotICBzZHBfZGlzY292ZXJ5X2RiLlByaW50KHN0ZG91dCk7Ci0KLSAgaWYgKCFTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QyKAotICAgICAgICAgIHJhd19hZGRyZXNzLCBzZHBfZGlzY292ZXJ5X2RiLlJhd1BvaW50ZXIoKSwKLSAgICAgICAgICBidGFfanZfc3RhcnRfZGlzY292ZXJ5X2NhbGxiYWNrLCAodm9pZCopJnByb21pc2UpKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICIlcyBGYWlsZWQgdG8gc3RhcnQgc2VhcmNoIGF0dHJpYnV0ZSByZXF1ZXN0XG4iLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIC0yOwotICB9Ci0KLSAgdWludDE2X3QgcmVzdWx0ID0gZnV0dXJlLmdldCgpOwotICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIkZhaWxlZCBzZWFyY2ggZGlzY292ZXJ5IHJlc3VsdDolc1xuIiwKLSAgICAgICAgICAgIFNkcEVycm9yQ29kZVRvU3RyaW5nKHJlc3VsdCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICB0U0RQX0RJU0NfUkVDKiByZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKHNkcF9kaXNjb3ZlcnlfZGIuUmF3UG9pbnRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQuQXMxNkJpdCgpLCBudWxscHRyKTsKLSAgaWYgKHJlYyA9PSBudWxscHRyKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJkaXNjb3ZlcnkgcmVjb3JkIGlzIG51bGwgZnJvbTolcyB1dWlkOiVzXG4iLAotICAgICAgICAgICAgcmF3X2FkZHJlc3MuVG9TdHJpbmcoKS5jX3N0cigpLCB1dWlkLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJyZXN1bHQ6JWQgYXR0cl9pZDoleCBmcm9tOiVzIHV1aWQ6JXNcbiIsIHJlc3VsdCwKLSAgICAgICAgICAgIHJlYy0+cF9maXJzdF9hdHRyLT5hdHRyX2lkLCByZWMtPnJlbW90ZV9iZF9hZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgIHV1aWQuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWludCBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOjpTZHA6OlJ1bigpIHsKLSAgaWYgKG9wdGlvbnNfLmxvb3BfIDwgMSkgewotICAgIHByaW50ZigiVGhpcyB0ZXN0IHJlcXVpcmVzIGF0IGxlYXN0IGEgc2luZ2xlIGxvb3BcbiIpOwotICAgIG9wdGlvbnNfLlVzYWdlKCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChvcHRpb25zXy5kZXZpY2VfLnNpemUoKSAhPSAxKSB7Ci0gICAgcHJpbnRmKCJUaGlzIHRlc3QgcmVxdWlyZXMgYSBzaW5nbGUgZGV2aWNlIHNwZWNpZmllZFxuIik7Ci0gICAgb3B0aW9uc18uVXNhZ2UoKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKG9wdGlvbnNfLnV1aWRfLnNpemUoKSAhPSAxKSB7Ci0gICAgcHJpbnRmKCJUaGlzIHRlc3QgcmVxdWlyZXMgYSBzaW5nbGUgdXVpZCBzcGVjaWZpZWRcbiIpOwotICAgIG9wdGlvbnNfLlVzYWdlKCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIFJ1bk9uSGVhZGxlc3NTdGFjazxpbnQ+KFt0aGlzXSgpIHsKLSAgICByZXR1cm4gc2RwX3F1ZXJ5X3V1aWQob3B0aW9uc18ubG9vcF8sIG9wdGlvbnNfLmRldmljZV8uZnJvbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc18udXVpZF8uZnJvbnQoKSk7Ci0gIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9zZHAvc2RwLmggYi90ZXN0L2hlYWRsZXNzL3NkcC9zZHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MmExZC4uMDAwMDAwMAotLS0gYS90ZXN0L2hlYWRsZXNzL3NkcC9zZHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAidGVzdC9oZWFkbGVzcy9nZXRfb3B0aW9ucy5oIgotI2luY2x1ZGUgInRlc3QvaGVhZGxlc3MvaGVhZGxlc3MuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgaGVhZGxlc3MgewotCi1jbGFzcyBTZHAgOiBwdWJsaWMgSGVhZGxlc3NUZXN0PGludD4gewotIHB1YmxpYzoKLSAgU2RwKGNvbnN0IGJsdWV0b290aDo6dGVzdDo6aGVhZGxlc3M6OkdldE9wdCYgb3B0aW9ucykKLSAgICAgIDogSGVhZGxlc3NUZXN0PGludD4ob3B0aW9ucykge30KLSAgaW50IFJ1bigpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhlYWRsZXNzCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9oZWFkbGVzcy9zZHAvc2RwX2RiLmNjIGIvdGVzdC9oZWFkbGVzcy9zZHAvc2RwX2RiLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjM4NjFiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3Mvc2RwL3NkcF9kYi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfaGVhZGxlc3MiCi0KLSNpbmNsdWRlICJ0ZXN0L2hlYWRsZXNzL3NkcC9zZHBfZGIuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIgICAgIC8vIExPRygpIHN0ZG91dCBhbmQgYW5kcm9pZCBsb2cKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIgIC8vIGFuZHJvaWQgbG9nIG9ubHkKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg6OnRlc3Q6OmhlYWRsZXNzOwotCi1TZHBEYjo6U2RwRGIodW5zaWduZWQgaW50IG1heF9yZWNvcmRzKSA6IG1heF9yZWNvcmRzXyhtYXhfcmVjb3JkcykgewotICBkYl8gPSAodFNEUF9ESVNDT1ZFUllfREIqKW1hbGxvYyhtYXhfcmVjb3Jkc18gKiBzaXplb2YodFNEUF9ESVNDX1JFQykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodFNEUF9ESVNDT1ZFUllfREIpKTsKLX0KLQotU2RwRGI6On5TZHBEYigpIHsgZnJlZShkYl8pOyB9Ci0KLXRTRFBfRElTQ09WRVJZX0RCKiBTZHBEYjo6UmF3UG9pbnRlcigpIHsgcmV0dXJuIGRiXzsgfQotCi11aW50MzJfdCBTZHBEYjo6TGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gbWF4X3JlY29yZHNfICogc2l6ZW9mKHRTRFBfRElTQ19SRUMpICsgc2l6ZW9mKHRTRFBfRElTQ09WRVJZX0RCKTsKLX0KLQotdm9pZCBTZHBEYjo6UHJpbnQoRklMRSogZmlsZXApIGNvbnN0IHsKLSAgZnByaW50ZihmaWxlcCwgIm1lbW9yeSBzaXplOjB4JXggZnJlZToweCV4XG4iLCBkYl8tPm1lbV9zaXplLCBkYl8tPm1lbV9mcmVlKTsKLSAgZnByaW50ZihmaWxlcCwgIm51bWJlciBvZiBmaWx0ZXJzOiVoZFxuIiwgZGJfLT5udW1fdXVpZF9maWx0ZXJzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYl8tPm51bV91dWlkX2ZpbHRlcnM7IGkrKykgewotICAgIGZwcmludGYoZmlsZXAsICIgIHV1aWQ6JXNcbiIsIGRiXy0+dXVpZF9maWx0ZXJzW2ldLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLSAgZnByaW50ZihmaWxlcCwgInJhdyBkYXRhIHNpemU6MHgleCB1c2VkOjB4JXhcbiIsIGRiXy0+cmF3X3NpemUsCi0gICAgICAgICAgZGJfLT5yYXdfdXNlZCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2hlYWRsZXNzL3NkcC9zZHBfZGIuaCBiL3Rlc3QvaGVhZGxlc3Mvc2RwL3NkcF9kYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2RlMGNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaGVhZGxlc3Mvc2RwL3NkcF9kYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdGRpbz4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBoZWFkbGVzcyB7Ci0KLWNsYXNzIFNkcERiIHsKLSBwdWJsaWM6Ci0gIFNkcERiKHVuc2lnbmVkIGludCBtYXhfcmVjb3Jkcyk7Ci0gIH5TZHBEYigpOwotCi0gIHRTRFBfRElTQ09WRVJZX0RCKiBSYXdQb2ludGVyKCk7Ci0KLSAgdWludDMyX3QgTGVuZ3RoKCkgY29uc3Q7Ci0KLSAgdm9pZCBQcmludChGSUxFKiBmaWxlcCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB1bnNpZ25lZCBpbnQgbWF4X3JlY29yZHNfOwotICB0U0RQX0RJU0NPVkVSWV9EQiogZGJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhlYWRsZXNzCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYTJkcF9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19hMmRwX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkNWYwYS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19hMmRwX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo5Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYTJkcF9hcGkuaCIKLSNpbmNsdWRlICJhMmRwX2ludC5oIgotI2luY2x1ZGUgImF2ZHRfYXBpLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic2RwZGVmcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi10QTJEUF9TVEFUVVMgQTJEUF9BZGRSZWNvcmQodWludDE2X3Qgc2VydmljZV91dWlkLCBjaGFyKiBwX3NlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX3Byb3ZpZGVyX25hbWUsIHVpbnQxNl90IGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNkcF9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci10QTJEUF9TVEFUVVMgQTJEUF9GaW5kU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9TRFBfREJfUEFSQU1TKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEEyRFBfRklORF9DQkFDSyogcF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLX0KLXVpbnQxNl90IEEyRFBfR2V0QXZkdHBWZXJzaW9uKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEEyRFBfQml0c1NldCh1aW50NjRfdCBudW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCBBMkRQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBBMkRQX0luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBhMmRwX3NldF9hdmR0X3NkcF92ZXIodWludDE2X3QgYXZkdF9zZHBfdmVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYTJkcF9jb2RlY19jb25maWcuY2MgYi90ZXN0L21vY2svbW9ja19hMmRwX2NvZGVjX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2ZjgyZi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19hMmRwX2NvZGVjX2NvbmZpZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NjcKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgImEyZHBfYWFjLmgiCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJhMmRwX3NiYy5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLUEyZHBDb2RlY0NvbmZpZyogQTJkcENvZGVjQ29uZmlnOjpjcmVhdGVDb2RlYygKLSAgICBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1BMmRwQ29kZWNDb25maWcqIEEyZHBDb2RlY3M6OmZpbmRTaW5rQ29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLUEyZHBDb2RlY0NvbmZpZyogQTJkcENvZGVjczo6ZmluZFNvdXJjZUNvZGVjQ29uZmlnKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1BMmRwQ29kZWNDb25maWc6OkEyZHBDb2RlY0NvbmZpZyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNfcHJpb3JpdHkpCi0gICAgOiBjb2RlY19pbmRleF8oY29kZWNfaW5kZXgpLAotICAgICAgbmFtZV8obmFtZSksCi0gICAgICBkZWZhdWx0X2NvZGVjX3ByaW9yaXR5Xyhjb2RlY19wcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLUEyZHBDb2RlY0NvbmZpZzo6fkEyZHBDb2RlY0NvbmZpZygpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLUEyZHBDb2RlY3M6OkEyZHBDb2RlY3MoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllcykKLSAgICA6IGN1cnJlbnRfY29kZWNfY29uZmlnXyhudWxscHRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotQTJkcENvZGVjczo6fkEyZHBDb2RlY3MoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci1ib29sIEEyRFBfQWRqdXN0Q29kZWModWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfQnVpbGRDb2RlY0hlYWRlcihjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmcmFtZXNfcGVyX3BhY2tldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0NvZGVjRXF1YWxzKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfQ29kZWNUeXBlRXF1YWxzKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0dldFBhY2tldFRpbWVzdGFtcChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWludCBBMkRQX0dldEVlY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0lzU2lua0NvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX1VzZXNSdHBIZWFkZXIoYm9vbCBjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMmRwQ29kZWNDb25maWc6OmNvZGVjQ29uZmlnSXNWYWxpZCgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2NvbmZpZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMmRwQ29kZWNDb25maWc6OmNvcHlPdXRPdGFDb2RlY0NvbmZpZyh1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpnZXRDb2RlY1NwZWNpZmljQ29uZmlnKHRCVF9BMkRQX09GRkxPQUQqIHBfYTJkcF9vZmZsb2FkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY0NvbmZpZzo6aXNDb2RlY0NvbmZpZ0VtcHR5KAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfY29uZmlnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY0NvbmZpZzo6aXNWYWxpZCgpIGNvbnN0IHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpzZXRDb2RlY1VzZXJDb25maWcoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OmdldENvZGVjQ29uZmlnQW5kQ2FwYWJpbGl0aWVzKAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcsCi0gICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiogcF9jb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4qIHBfY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OmluaXQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OmlzU3VwcG9ydGVkQ29kZWMoYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjczo6c2V0Q29kZWNBdWRpb0NvbmZpZygKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX3NpbmtfY2FwYWJpbGl0aWVzLCB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCwgYm9vbCogcF9jb25maWdfdXBkYXRlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMmRwQ29kZWNzOjpzZXRDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VsZWN0X2N1cnJlbnRfY29kZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjczo6c2V0Q29kZWNPdGFDb25maWcoCi0gICAgY29uc3QgdWludDhfdCogcF9vdGFfY29kZWNfY29uZmlnLAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OnNldENvZGVjVXNlckNvbmZpZygKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX3VzZXJfY29uZmlnLAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMsIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywKLSAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQsIGJvb2wqIHBfY29uZmlnX3VwZGF0ZWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjczo6c2V0UGVlclNpbmtDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OnNldFBlZXJTb3VyY2VDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OnNldFNpbmtDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VsZWN0X2N1cnJlbnRfY29kZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjQXVkaW9Db25maWcoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnOwotICByZXR1cm4gY29uZmlnOwotfQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNDYXBhYmlsaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjQ29uZmlnKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjTG9jYWxDYXBhYmlsaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjU2VsZWN0YWJsZUNhcGFiaWxpdHkoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnOwotICByZXR1cm4gY29uZmlnOwotfQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNVc2VyQ29uZmlnKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU2lua0NvZGVjSW5kZXgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsKLX0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU291cmNlQ29kZWNJbmRleChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOwotfQotY29uc3QgY2hhciogQTJEUF9Db2RlY0luZGV4U3RyKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNOYW1lKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXREZWNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXRFbmNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1pbnQgQTJEUF9HZXRTaW5rVHJhY2tDaGFubmVsVHlwZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IEEyRFBfR2V0VHJhY2tCaXRzUGVyU2FtcGxlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgQTJkcENvZGVjQ29uZmlnOjpnZXRUcmFja0JpdFJhdGUoKSBjb25zdCB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXN0ZDo6c3RyaW5nIEEyRFBfQ29kZWNJbmZvU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGQ6OnN0cmluZyBBMmRwQ29kZWNDb25maWc6OmNvZGVjQml0c1BlclNhbXBsZTJTdHIoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGQ6OnN0cmluZyBBMmRwQ29kZWNDb25maWc6OmNvZGVjQ2hhbm5lbE1vZGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCBjb2RlY19jaGFubmVsX21vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjpzdHJpbmcgQTJkcENvZGVjQ29uZmlnOjpjb2RlY0NvbmZpZzJTdHIoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjpzdHJpbmcgQTJkcENvZGVjQ29uZmlnOjpjb2RlY1NhbXBsZVJhdGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGNvZGVjX3NhbXBsZV9yYXRlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRBMkRQX0NPREVDX1RZUEUgQTJEUF9HZXRDb2RlY1R5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgQTJEUF9HZXRNZWRpYVR5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgQTJkcENvZGVjQ29uZmlnOjpnZXRBdWRpb0JpdHNQZXJTYW1wbGUoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgQTJEUF9Jbml0RGVmYXVsdENvZGVjKHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQTJkcENvZGVjQ29uZmlnOjpkZWJ1Z19jb2RlY19kdW1wKGludCBmZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQTJkcENvZGVjQ29uZmlnOjpzZXRDb2RlY1ByaW9yaXR5KAotICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBBMmRwQ29kZWNDb25maWc6OnNldERlZmF1bHRDb2RlY1ByaW9yaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQTJkcENvZGVjczo6ZGVidWdfY29kZWNfZHVtcChpbnQgZmQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYyBiL3Rlc3QvbW9jay9tb2NrX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODc5Nzk2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImdkL21vZHVsZS5oIgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYWN0aXZpdHlfYXR0cmlidXRpb24uaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotCi1BY3Rpdml0eUF0dHJpYnV0aW9uSW50ZXJmYWNlKgotYmx1ZXRvb3RoOjphY3Rpdml0eV9hdHRyaWJ1dGlvbjo6Z2V0X2FjdGl2aXR5X2F0dHJpYnV0aW9uX2luc3RhbmNlKCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZSoKLWJsdWV0b290aDo6c2hpbTo6Z2V0X2FjdGl2aXR5X2F0dHJpYnV0aW9uX2luc3RhbmNlKCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3QgYmx1ZXRvb3RoOjpNb2R1bGVGYWN0b3J5Ci0gICAgYmx1ZXRvb3RoOjphY3Rpdml0eV9hdHRyaWJ1dGlvbjo6QWN0aXZpdHlBdHRyaWJ1dGlvbjo6RmFjdG9yeSA9Ci0gICAgICAgIGJsdWV0b290aDo6TW9kdWxlRmFjdG9yeShbXSgpIHsgcmV0dXJuIG51bGxwdHI7IH0pOwpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYW5kcm9pZF9oYXJkd2FyZV9hdWRpby5jYyBiL3Rlc3QvbW9jay9tb2NrX2FuZHJvaWRfaGFyZHdhcmVfYXVkaW8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTEwZGUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYW5kcm9pZF9oYXJkd2FyZV9hdWRpby5jYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ibHVldG9vdGgvYTJkcC8xLjAvSUJsdWV0b290aEF1ZGlvSG9zdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSBhMmRwIHsKLW5hbWVzcGFjZSBWMV8wIHsKLWNsYXNzIEJsdWV0b290aEF1ZGlvSG9zdCA6IHB1YmxpYyBJQmx1ZXRvb3RoQXVkaW9Ib3N0IHsKLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNldEhBTEluc3RydW1lbnRhdGlvbigpIHsgcmV0dXJuIFZvaWQoKTsgfQotICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua1RvRGVhdGgoCi0gICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ+IGNvbnN0JiwgdWludDY0X3QpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBpbmcoKSB7IHJldHVybiBWb2lkKCk7IH0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGdldERlYnVnSW5mbygKLSAgICAgIHN0ZDo6X18xOjpmdW5jdGlvbjx2b2lkKGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OkRlYnVnSW5mbyBjb25zdCYpPikgewotICAgIHJldHVybiBWb2lkKCk7Ci0gIH0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG5vdGlmeVN5c3Byb3BzQ2hhbmdlZCgpIHsgcmV0dXJuIFZvaWQoKTsgfQotICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gdW5saW5rVG9EZWF0aCgKLSAgICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudD4gY29uc3QmKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgVjFfMAotfSAgLy8gbmFtZXNwYWNlIGEyZHAKLQotbmFtZXNwYWNlIGF1ZGlvIHsKLQotbmFtZXNwYWNlIFYyXzAgewotCi1jbGFzcyBBdWRpb0NvbmZpZ3VyYXRpb24gewotICBBdWRpb0NvbmZpZ3VyYXRpb24oKSB7fQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIFYyXzAKLQotfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19ibHVldG9vdGhfaW50ZXJmYWNlLmNjIGIvdGVzdC9tb2NrL21vY2tfYmx1ZXRvb3RoX2ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwOWIwNS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19ibHVldG9vdGhfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL3N0YWNrX21hbmFnZXIuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9pbnRlcm9wLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi12b2lkIHNldF9oYWxfY2JhY2tzKGJ0X2NhbGxiYWNrc190KiBjYWxsYmFja3MpIHt9Ci0KLXN0YXRpYyBpbnQgaW5pdChidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzLCBib29sIHN0YXJ0X3Jlc3RyaWN0ZWQsCi0gICAgICAgICAgICAgICAgYm9vbCBpc19jb21tb25fY3JpdGVyaWFfbW9kZSwgaW50IGNvbmZpZ19jb21wYXJlX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogaW5pdF9mbGFncywgYm9vbCBpc19hdHYpIHsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGVuYWJsZSgpIHsgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOyB9Ci0KLXN0YXRpYyBpbnQgZGlzYWJsZSh2b2lkKSB7IHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsgfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwKHZvaWQpIHt9Ci0KLWJvb2wgaXNfcmVzdHJpY3RlZF9tb2RlKCkgeyByZXR1cm4gZmFsc2U7IH0KLWJvb2wgaXNfY29tbW9uX2NyaXRlcmlhX21vZGUoKSB7IHJldHVybiBmYWxzZTsgfQotCi1pbnQgZ2V0X2NvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQoKSB7IHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsgfQotCi1ib29sIGlzX2F0dl9kZXZpY2UoKSB7IHJldHVybiBmYWxzZTsgfQotCi1zdGF0aWMgaW50IGdldF9hZGFwdGVyX3Byb3BlcnRpZXModm9pZCkgeyByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7IH0KLQotc3RhdGljIGludCBnZXRfYWRhcHRlcl9wcm9wZXJ0eShidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2FkYXB0ZXJfcHJvcGVydHkoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1pbnQgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhSYXdBZGRyZXNzKiByZW1vdGVfYWRkcikgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90eXBlX3QgdHlwZSkgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBnZXRfcmVtb3RlX3NlcnZpY2VzKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLCBpbnQgdHJhbnNwb3J0KSB7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBzdGFydF9kaXNjb3Zlcnkodm9pZCkgeyByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7IH0KLQotc3RhdGljIGludCBjYW5jZWxfZGlzY292ZXJ5KHZvaWQpIHsgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOyB9Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2JvbmQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IHRyYW5zcG9ydCkgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2JvbmRfb3V0X29mX2JhbmQoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgaW50IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCogcDE5Ml9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF9vb2JfZGF0YV90KiBwMjU2X2RhdGEpIHsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGdlbmVyYXRlX2xvY2FsX29vYl9kYXRhKHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBjYW5jZWxfYm9uZChjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyKSB7IHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsgfQotCi1zdGF0aWMgaW50IHJlbW92ZV9ib25kKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOyB9Ci0KLXN0YXRpYyBpbnQgZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgcGluX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQ4X3QgYWNjZXB0LCB1aW50OF90IHBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICBidF9waW5fY29kZV90KiBwaW5fY29kZSkgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgc3NwX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIGJ0X3NzcF92YXJpYW50X3QgdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWNjZXB0LCB1aW50MzJfdCBwYXNza2V5KSB7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCByZWFkX2VuZXJneV9pbmZvKCkgeyByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7IH0KLQotc3RhdGljIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IGNoYXIqKiBhcmd1bWVudHMpIHt9Ci0KLXN0YXRpYyB2b2lkIGR1bXBNZXRyaWNzKHN0ZDo6c3RyaW5nKiBvdXRwdXQpIHt9Ci0KLXN0YXRpYyBjb25zdCB2b2lkKiBnZXRfcHJvZmlsZV9pbnRlcmZhY2UoY29uc3QgY2hhciogcHJvZmlsZV9pZCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotaW50IGR1dF9tb2RlX2NvbmZpZ3VyZSh1aW50OF90IGVuYWJsZSkgeyByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7IH0KLQotaW50IGR1dF9tb2RlX3NlbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotaW50IGxlX3Rlc3RfbW9kZSh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pIHsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHNldF9vc19jYWxsb3V0cyhidF9vc19jYWxsb3V0c190KiBjYWxsb3V0cykgewotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX2NsZWFyKHZvaWQpIHsgcmV0dXJuIDA7IH0KLQotc3RhdGljIGJsdWV0b290aDo6YXZyY3A6OlNlcnZpY2VJbnRlcmZhY2UqIGdldF9hdnJjcF9zZXJ2aWNlKHZvaWQpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBvYmZ1c2NhdGVfYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygiVGVzdCIpOwotfQotCi1zdGF0aWMgaW50IGdldF9tZXRyaWNfaWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgeyByZXR1cm4gMDsgfQotCi1zdGF0aWMgaW50IHNldF9keW5hbWljX2F1ZGlvX2J1ZmZlcl9zaXplKGludCBjb2RlYywgaW50IHNpemUpIHsgcmV0dXJuIDA7IH0KLQotRVhQT1JUX1NZTUJPTCBidF9pbnRlcmZhY2VfdCBibHVldG9vdGhJbnRlcmZhY2UgPSB7Ci0gICAgc2l6ZW9mKGJsdWV0b290aEludGVyZmFjZSksCi0gICAgaW5pdCwKLSAgICBlbmFibGUsCi0gICAgZGlzYWJsZSwKLSAgICBjbGVhbnVwLAotICAgIGdldF9hZGFwdGVyX3Byb3BlcnRpZXMsCi0gICAgZ2V0X2FkYXB0ZXJfcHJvcGVydHksCi0gICAgc2V0X2FkYXB0ZXJfcHJvcGVydHksCi0gICAgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcywKLSAgICBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSwKLSAgICBzZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSwKLSAgICBudWxscHRyLAotICAgIGdldF9yZW1vdGVfc2VydmljZXMsCi0gICAgc3RhcnRfZGlzY292ZXJ5LAotICAgIGNhbmNlbF9kaXNjb3ZlcnksCi0gICAgY3JlYXRlX2JvbmQsCi0gICAgY3JlYXRlX2JvbmRfb3V0X29mX2JhbmQsCi0gICAgcmVtb3ZlX2JvbmQsCi0gICAgY2FuY2VsX2JvbmQsCi0gICAgZ2V0X2Nvbm5lY3Rpb25fc3RhdGUsCi0gICAgcGluX3JlcGx5LAotICAgIHNzcF9yZXBseSwKLSAgICBnZXRfcHJvZmlsZV9pbnRlcmZhY2UsCi0gICAgZHV0X21vZGVfY29uZmlndXJlLAotICAgIGR1dF9tb2RlX3NlbmQsCi0gICAgbGVfdGVzdF9tb2RlLAotICAgIHNldF9vc19jYWxsb3V0cywKLSAgICByZWFkX2VuZXJneV9pbmZvLAotICAgIGR1bXAsCi0gICAgZHVtcE1ldHJpY3MsCi0gICAgY29uZmlnX2NsZWFyLAotICAgIGludGVyb3BfZGF0YWJhc2VfY2xlYXIsCi0gICAgaW50ZXJvcF9kYXRhYmFzZV9hZGQsCi0gICAgZ2V0X2F2cmNwX3NlcnZpY2UsCi0gICAgb2JmdXNjYXRlX2FkZHJlc3MsCi0gICAgZ2V0X21ldHJpY19pZCwKLSAgICBzZXRfZHluYW1pY19hdWRpb19idWZmZXJfc2l6ZSwKLSAgICBnZW5lcmF0ZV9sb2NhbF9vb2JfZGF0YX07Ci0KLS8vIGNhbGxiYWNrIHJlcG9ydGluZyBoZWxwZXJzCi0KLWJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5X2RlZXBfY29weV9hcnJheShpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBpbnZva2VfYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NiKGJ0X3N0YXRlX3Qgc3RhdGUpIHt9Ci0KLXZvaWQgaW52b2tlX2FkYXB0ZXJfcHJvcGVydGllc19jYihidF9zdGF0dXNfdCBzdGF0dXMsIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSB7fQotCi12b2lkIGludm9rZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHt9Ci0KLXZvaWQgaW52b2tlX2RldmljZV9mb3VuZF9jYihpbnQgbnVtX3Byb3BlcnRpZXMsIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIHt9Ci0KLXZvaWQgaW52b2tlX2Rpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NiKGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IHN0YXRlKSB7fQotCi12b2lkIGludm9rZV9waW5fcmVxdWVzdF9jYihSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2JkbmFtZV90IGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJvb2wgbWluXzE2X2RpZ2l0KSB7fQotCi12b2lkIGludm9rZV9zc3BfcmVxdWVzdF9jYihSYXdBZGRyZXNzIGJkX2FkZHIsIGJ0X2JkbmFtZV90IGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2QsIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19rZXkpIHt9Ci0KLXZvaWQgaW52b2tlX29vYl9kYXRhX3JlcXVlc3RfY2IodEJUX1RSQU5TUE9SVCB0LCBib29sIHZhbGlkLCBPY3RldDE2IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYgciwgUmF3QWRkcmVzcyByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZGRyZXNzX3R5cGUpIHt9Ci0KLXZvaWQgaW52b2tlX2JvbmRfc3RhdGVfY2hhbmdlZF9jYihidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9ib25kX3N0YXRlX3Qgc3RhdGUsIGludCBmYWlsX3JlYXNvbikge30KLQotdm9pZCBpbnZva2VfYWNsX3N0YXRlX2NoYW5nZWRfY2IoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9hY2xfc3RhdGVfdCBzdGF0ZSwgaW50IHRyYW5zcG9ydF9saW5rX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9oY2lfZXJyb3JfY29kZV90IGhjaV9yZWFzb24pIHt9Ci0KLXZvaWQgaW52b2tlX3RocmVhZF9ldnRfY2IoYnRfY2JfdGhyZWFkX2V2dCBldmVudCkge30KLQotdm9pZCBpbnZva2VfbGVfdGVzdF9tb2RlX2NiKGJ0X3N0YXR1c190IHN0YXR1cywgdWludDE2X3QgY291bnQpIHt9Ci0KLS8vIHRha2VzIG93bmVyc2hpcCBvZiB8dWlkX2RhdGF8Ci12b2lkIGludm9rZV9lbmVyZ3lfaW5mb19jYihidF9hY3Rpdml0eV9lbmVyZ3lfaW5mbyBlbmVyZ3lfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3VpZF90cmFmZmljX3QqIHVpZF9kYXRhKSB7fQotCi12b2lkIGludm9rZV9saW5rX3F1YWxpdHlfcmVwb3J0X2NiKHVpbnQ2NF90IHRpbWVzdGFtcCwgaW50IHJlcG9ydF9pZCwgaW50IHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbnIsIGludCByZXRyYW5zbWlzc2lvbl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhY2tldHNfbm90X3JlY2VpdmVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZWdhdGl2ZV9hY2tub3dsZWRnZW1lbnRfY291bnQpIHt9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfYWdfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2FnX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxZWEzMC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfYWdfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE0Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidGEvYWcvYnRhX2FnX2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hZ19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdEJUQV9TVEFUVVMgQlRBX0FnRW5hYmxlKHRCVEFfQUdfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVEFfU1VDQ0VTUzsKLX0KLXZvaWQgQlRBX0FnQXVkaW9DbG9zZSh1aW50MTZfdCBoYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0FnQXVkaW9PcGVuKHVpbnQxNl90IGhhbmRsZSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVEFfQWdDbG9zZSh1aW50MTZfdCBoYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0FnRGVyZWdpc3Rlcih1aW50MTZfdCBoYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0FnRGlzYWJsZSgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0FnT3Blbih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9BZ1JlZ2lzdGVyKHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzLCB0QlRBX0FHX0ZFQVQgZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc2VydmljZV9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9BZ1Jlc3VsdCh1aW50MTZfdCBoYW5kbGUsIHRCVEFfQUdfUkVTIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVEFfQUdfUkVTX0RBVEEmIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9BZ1NldEFjdGl2ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhY3RpdmVfZGV2aWNlX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9BZ1NldENvZGVjKHVpbnQxNl90IGhhbmRsZSwgdEJUQV9BR19QRUVSX0NPREVDIGNvZGVjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfQWdTZXRTY29BbGxvd2VkKGJvb2wgdmFsdWUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9hci5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9hci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmNzRjMS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfYXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRhL2FyL2J0YV9hcl9pbnQuaCIKLSNpbmNsdWRlICJidGEvc3lzL2J0YV9zeXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2Y3RfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdnJjX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIGJ0YV9hcl9hdmR0X2Nvbm4odEJUQV9TWVNfSUQgc3lzX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NiX2luZGV4KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfYXJfZGVyZWdfYXZjdCgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRhX2FyX2RlcmVnX2F2ZHQoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0YV9hcl9kZXJlZ19hdnJjKHVpbnQxNl90IHNlcnZpY2VfdXVpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX2FyX2luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGFfYXJfcmVnX2F2Y3QoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0YV9hcl9yZWdfYXZkdChBdmR0cFJjYiogcF9yZWcsIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9hcl9yZWdfYXZyYyh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb3ZpZGVyX25hbWUsIHVpbnQxNl90IGNhdGVnb3JpZXMsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJyb3dzZV9zdXBwb3J0ZWQsIHVpbnQxNl90IHByb2ZpbGVfdmVyc2lvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9hdl9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19idGFfYXZfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRlOTNkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9hdl9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjIzCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YS9hdi9idGFfYXZfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBCVEFfQXZFbmFibGUodEJUQV9BVl9GRUFUIGZlYXR1cmVzLCB0QlRBX0FWX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfQXZDbG9zZSh0QlRBX0FWX0hOREwgaGFuZGxlKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9BdkNsb3NlUmModWludDhfdCByY19oYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0F2RGVyZWdpc3Rlcih0QlRBX0FWX0hOREwgaG5kbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2RGlzYWJsZSh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9BdkRpc2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2TWV0YUNtZCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9DTUQgY21kX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2TWV0YVJzcCh1aW50OF90IHJjX2hhbmRsZSwgdWludDhfdCBsYWJlbCwgdEJUQV9BVl9DT0RFIHJzcF9jb2RlLAotICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9wa3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9Bdk9mZmxvYWRTdGFydCh0QlRBX0FWX0hOREwgaG5kbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2T2ZmbG9hZFN0YXJ0UnNwKHRCVEFfQVZfSE5ETCBobmRsLCB0QlRBX0FWX1NUQVRVUyBzdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9Bdk9wZW4oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9BVl9ITkRMIGhhbmRsZSwgYm9vbCB1c2VfcmMsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgdXVpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2T3BlblJjKHRCVEFfQVZfSE5ETCBoYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0F2UHJvdGVjdFJlcSh0QlRBX0FWX0hOREwgaG5kbCwgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBsZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9BdlByb3RlY3RSc3AodEJUQV9BVl9ITkRMIGhuZGwsIHVpbnQ4X3QgZXJyb3JfY29kZSwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2UmVjb25maWcodEJUQV9BVl9ITkRMIGhuZGwsIGJvb2wgc3VzcGVuZCwgdWludDhfdCBzZXBfaW5mb19pZHgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfY29kZWNfaW5mbywgdWludDhfdCBudW1fcHJvdGVjdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcF9wcm90ZWN0X2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9BdlJlZ2lzdGVyKHRCVEFfQVZfQ0hOTCBjaG5sLCBjb25zdCBjaGFyKiBwX3NlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQsIHRCVEFfQVZfU0lOS19EQVRBX0NCQUNLKiBwX3NpbmtfZGF0YV9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV91dWlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfQXZSZW1vdGVDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfUkMgcmNfaWQsCi0gICAgICAgICAgICAgICAgICAgICB0QlRBX0FWX1NUQVRFIGtleV9zdGF0ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0F2UmVtb3RlVmVuZG9yVW5pcXVlQ21kKHVpbnQ4X3QgcmNfaGFuZGxlLCB1aW50OF90IGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BVl9TVEFURSBrZXlfc3RhdGUsIHVpbnQ4X3QqIHBfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfQXZTdGFydCh0QlRBX0FWX0hOREwgaGFuZGxlKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9BdlN0b3AodEJUQV9BVl9ITkRMIGhhbmRsZSwgYm9vbCBzdXNwZW5kKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfQXZWZW5kb3JDbWQodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSBjbWRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfQXZWZW5kb3JSc3AodWludDhfdCByY19oYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHRCVEFfQVZfQ09ERSByc3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuLCB1aW50MzJfdCBjb21wYW55X2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX2F2X2NpLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2F2X2NpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgwMjI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9hdl9jaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImJ0YS9hdi9idGFfYXZfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIGJ0YV9hdl9jaV9zZXRjb25maWcodEJUQV9BVl9ITkRMIGJ0YV9hdl9oYW5kbGUsIHVpbnQ4X3QgZXJyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjYXRlZ29yeSwgdWludDhfdCBudW1fc2VpZCwgdWludDhfdCogcF9zZWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjZmdfbmVlZGVkLCB1aW50OF90IGF2ZHRfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfYXZfY2lfc3JjX2RhdGFfcmVhZHkodEJUQV9BVl9DSE5MIGNobmwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfYXZfbWFpbi5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9hdl9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjFjOGIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9hdl9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyMQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXJfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvdXRsLmgiCi0jaW5jbHVkZSAiYnRpZi9hdnJjcC9hdnJjcF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXZfY28uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2hjaV9yb2xlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWJvb2wgYnRhX2F2X2Noa19zdGFydCh0QlRBX0FWX1NDQiogcF9zY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRhX2F2X2hkbF9ldmVudChCVF9IRFIqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJ0YV9hdl9saW5rX3JvbGVfb2sodEJUQV9BVl9TQ0IqIHBfc2NiLCB1aW50OF90IGJpdHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRhX2F2X3N3aXRjaF9pZl9uZWVkZWQodEJUQV9BVl9TQ0IqIHBfc2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1jb25zdCBjaGFyKiBidGFfYXZfZXZ0X2NvZGUodWludDE2X3QgZXZ0X2NvZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotaW50IEJUQV9Bdk9idGFpblBlZXJDaGFubmVsSW5kZXgoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfQVZfU0NCKiBidGFfYXZfYWRkcl90b19zY2IoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10QlRBX0FWX1NDQiogYnRhX2F2X2huZGxfdG9fc2NiKHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIGJ0YV9hdl9hcGlfZGVyZWdpc3Rlcih0QlRBX0FWX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX2F2X2Nvbm5fY2JhY2soVU5VU0VEX0FUVFIgdWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXZlbnQsIHRBVkRUX0NUUkwqIHBfZGF0YSwgdWludDhfdCBzY2JfaW5kZXgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9hdl9kdXBfYXVkaW9fYnVmKHRCVEFfQVZfU0NCKiBwX3NjYiwgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX2F2X2ZyZWVfc2NiKHRCVEFfQVZfU0NCKiBwX3NjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX2F2X3Jlc3RvcmVfc3dpdGNoKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRhX2F2X3NtX2V4ZWN1dGUodEJUQV9BVl9DQiogcF9jYiwgdWludDE2X3QgZXZlbnQsIHRCVEFfQVZfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfZGVidWdfYXZfZHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgdEJUQV9BVl9TQ0I6Ok9uQ29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgdEJUQV9BVl9TQ0I6Ok9uRGlzY29ubmVjdGVkKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCB0QlRBX0FWX1NDQjo6U2V0QXZkdHBWZXJzaW9uKHVpbnQxNl90IGF2ZHRwX3ZlcnNpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfY3Npcy5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9jc2lzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg2MDNhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9jc2lzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2NzaXMuaD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9jc2lzX2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudDsKLXVzaW5nIGJsdWV0b290aDo6Y3Npczo6Q3Npc0NsaWVudENhbGxiYWNrczsKLQotdm9pZCBDc2lzQ2xpZW50OjpBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b2Nvbm5lY3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci1ib29sIENzaXNDbGllbnQ6OkdldEZvclN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci12b2lkIENzaXNDbGllbnQ6OkNsZWFuVXAoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci1ibHVldG9vdGg6OmNzaXM6OkNzaXNDbGllbnQqIENzaXNDbGllbnQ6OkdldCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWJvb2wgQ3Npc0NsaWVudDo6SXNDc2lzQ2xpZW50UnVubmluZygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgQ3Npc0NsaWVudDo6SW5pdGlhbGl6ZShDc2lzQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSBpbml0Q2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIENzaXNDbGllbnQ6OkRlYnVnRHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9kbV9hY3QuY2MgYi90ZXN0L21vY2svbW9ja19idGFfZG1fYWN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzdlOTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9kbV9hY3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYyCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19idGFfZG1fYWN0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRhX2RtX2FjdCB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IEJUQV9EbVNldFZpc2liaWxpdHkgQlRBX0RtU2V0VmlzaWJpbGl0eTsKLXN0cnVjdCBCVEFfZG1fYWNsX2Rvd24gQlRBX2RtX2FjbF9kb3duOwotc3RydWN0IEJUQV9kbV9hY2xfdXAgQlRBX2RtX2FjbF91cDsKLXN0cnVjdCBCVEFfZG1fbm90aWZ5X3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZQotICAgIEJUQV9kbV9ub3RpZnlfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlOwotc3RydWN0IEJUQV9kbV9vbl9od19vZmYgQlRBX2RtX29uX2h3X29mZjsKLXN0cnVjdCBCVEFfZG1fb25faHdfb24gQlRBX2RtX29uX2h3X29uOwotc3RydWN0IEJUQV9kbV9yZXBvcnRfcm9sZV9jaGFuZ2UgQlRBX2RtX3JlcG9ydF9yb2xlX2NoYW5nZTsKLXN0cnVjdCBidGFfZG1fYWNsX3VwIGJ0YV9kbV9hY2xfdXA7Ci1zdHJ1Y3QgYnRhX2RtX2FkZF9ibGVfZGV2aWNlIGJ0YV9kbV9hZGRfYmxlX2RldmljZTsKLXN0cnVjdCBidGFfZG1fYWRkX2JsZWtleSBidGFfZG1fYWRkX2JsZWtleTsKLXN0cnVjdCBidGFfZG1fYWRkX2RldmljZSBidGFfZG1fYWRkX2RldmljZTsKLXN0cnVjdCBidGFfZG1fYmxlX2NvbmZpZ19sb2NhbF9wcml2YWN5IGJ0YV9kbV9ibGVfY29uZmlnX2xvY2FsX3ByaXZhY3k7Ci1zdHJ1Y3QgYnRhX2RtX2JsZV9jb25maXJtX3JlcGx5IGJ0YV9kbV9ibGVfY29uZmlybV9yZXBseTsKLXN0cnVjdCBidGFfZG1fYmxlX2NzaXNfb2JzZXJ2ZSBidGFfZG1fYmxlX2NzaXNfb2JzZXJ2ZTsKLXN0cnVjdCBidGFfZG1fYmxlX2dldF9lbmVyZ3lfaW5mbyBidGFfZG1fYmxlX2dldF9lbmVyZ3lfaW5mbzsKLXN0cnVjdCBidGFfZG1fYmxlX29ic2VydmUgYnRhX2RtX2JsZV9vYnNlcnZlOwotc3RydWN0IGJ0YV9kbV9ibGVfcGFzc2tleV9yZXBseSBidGFfZG1fYmxlX3Bhc3NrZXlfcmVwbHk7Ci1zdHJ1Y3QgYnRhX2RtX2JsZV9zY2FuIGJ0YV9kbV9ibGVfc2NhbjsKLXN0cnVjdCBidGFfZG1fYmxlX3NldF9jb25uX3BhcmFtcyBidGFfZG1fYmxlX3NldF9jb25uX3BhcmFtczsKLXN0cnVjdCBidGFfZG1fYmxlX3NldF9kYXRhX2xlbmd0aCBidGFfZG1fYmxlX3NldF9kYXRhX2xlbmd0aDsKLXN0cnVjdCBidGFfZG1fYmxlX3VwZGF0ZV9jb25uX3BhcmFtcyBidGFfZG1fYmxlX3VwZGF0ZV9jb25uX3BhcmFtczsKLXN0cnVjdCBidGFfZG1fYm9uZCBidGFfZG1fYm9uZDsKLXN0cnVjdCBidGFfZG1fYm9uZF9jYW5jZWwgYnRhX2RtX2JvbmRfY2FuY2VsOwotc3RydWN0IGJ0YV9kbV9jaGVja19pZl9vbmx5X2hkX2Nvbm5lY3RlZCBidGFfZG1fY2hlY2tfaWZfb25seV9oZF9jb25uZWN0ZWQ7Ci1zdHJ1Y3QgYnRhX2RtX2NpX3JtdF9vb2JfYWN0IGJ0YV9kbV9jaV9ybXRfb29iX2FjdDsKLXN0cnVjdCBidGFfZG1fY2xvc2VfYWNsIGJ0YV9kbV9jbG9zZV9hY2w7Ci1zdHJ1Y3QgYnRhX2RtX2Nsb3NlX2dhdHRfY29ubiBidGFfZG1fY2xvc2VfZ2F0dF9jb25uOwotc3RydWN0IGJ0YV9kbV9jb25maXJtIGJ0YV9kbV9jb25maXJtOwotc3RydWN0IGJ0YV9kbV9kZWluaXRfY2IgYnRhX2RtX2RlaW5pdF9jYjsKLXN0cnVjdCBidGFfZG1fZGlzYWJsZSBidGFfZG1fZGlzYWJsZTsKLXN0cnVjdCBidGFfZG1fZGlzY19yZXN1bHQgYnRhX2RtX2Rpc2NfcmVzdWx0Owotc3RydWN0IGJ0YV9kbV9kaXNjX3JtdF9uYW1lIGJ0YV9kbV9kaXNjX3JtdF9uYW1lOwotc3RydWN0IGJ0YV9kbV9kaXNjb3ZlciBidGFfZG1fZGlzY292ZXI7Ci1zdHJ1Y3QgYnRhX2RtX2Vpcl91cGRhdGVfY3VzdF91dWlkIGJ0YV9kbV9laXJfdXBkYXRlX2N1c3RfdXVpZDsKLXN0cnVjdCBidGFfZG1fZWlyX3VwZGF0ZV91dWlkIGJ0YV9kbV9laXJfdXBkYXRlX3V1aWQ7Ci1zdHJ1Y3QgYnRhX2RtX2VuYWJsZSBidGFfZG1fZW5hYmxlOwotc3RydWN0IGJ0YV9kbV9lbmNyeXB0X2NiYWNrIGJ0YV9kbV9lbmNyeXB0X2NiYWNrOwotc3RydWN0IGJ0YV9kbV9leGVjdXRlX3F1ZXVlZF9yZXF1ZXN0IGJ0YV9kbV9leGVjdXRlX3F1ZXVlZF9yZXF1ZXN0Owotc3RydWN0IGJ0YV9kbV9mcmVlX3NkcF9kYiBidGFfZG1fZnJlZV9zZHBfZGI7Ci1zdHJ1Y3QgYnRhX2RtX2luaXRfY2IgYnRhX2RtX2luaXRfY2I7Ci1zdHJ1Y3QgYnRhX2RtX2lucV9jbXBsIGJ0YV9kbV9pbnFfY21wbDsKLXN0cnVjdCBidGFfZG1faXNfc2VhcmNoX3JlcXVlc3RfcXVldWVkIGJ0YV9kbV9pc19zZWFyY2hfcmVxdWVzdF9xdWV1ZWQ7Ci1zdHJ1Y3QgYnRhX2RtX3Bpbl9yZXBseSBidGFfZG1fcGluX3JlcGx5Owotc3RydWN0IGJ0YV9kbV9wcm9jX29wZW5fZXZ0IGJ0YV9kbV9wcm9jX29wZW5fZXZ0Owotc3RydWN0IGJ0YV9kbV9wcm9jZXNzX3JlbW92ZV9kZXZpY2UgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZTsKLXN0cnVjdCBidGFfZG1fcXVldWVfZGlzYyBidGFfZG1fcXVldWVfZGlzYzsKLXN0cnVjdCBidGFfZG1fcXVldWVfc2VhcmNoIGJ0YV9kbV9xdWV1ZV9zZWFyY2g7Ci1zdHJ1Y3QgYnRhX2RtX3JlbW92ZV9kZXZpY2UgYnRhX2RtX3JlbW92ZV9kZXZpY2U7Ci1zdHJ1Y3QgYnRhX2RtX3JtX2NiYWNrIGJ0YV9kbV9ybV9jYmFjazsKLXN0cnVjdCBidGFfZG1fcm10X25hbWUgYnRhX2RtX3JtdF9uYW1lOwotc3RydWN0IGJ0YV9kbV9zZHBfcmVzdWx0IGJ0YV9kbV9zZHBfcmVzdWx0Owotc3RydWN0IGJ0YV9kbV9zZWFyY2hfY2FuY2VsIGJ0YV9kbV9zZWFyY2hfY2FuY2VsOwotc3RydWN0IGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSBidGFfZG1fc2VhcmNoX2NhbmNlbF9ub3RpZnk7Ci1zdHJ1Y3QgYnRhX2RtX3NlYXJjaF9jbGVhcl9xdWV1ZSBidGFfZG1fc2VhcmNoX2NsZWFyX3F1ZXVlOwotc3RydWN0IGJ0YV9kbV9zZWFyY2hfY21wbCBidGFfZG1fc2VhcmNoX2NtcGw7Ci1zdHJ1Y3QgYnRhX2RtX3NlYXJjaF9yZXN1bHQgYnRhX2RtX3NlYXJjaF9yZXN1bHQ7Ci1zdHJ1Y3QgYnRhX2RtX3NlYXJjaF9zdGFydCBidGFfZG1fc2VhcmNoX3N0YXJ0Owotc3RydWN0IGJ0YV9kbV9zZXRfZGV2X25hbWUgYnRhX2RtX3NldF9kZXZfbmFtZTsKLXN0cnVjdCBidGFfZG1fc2V0X2VuY3J5cHRpb24gYnRhX2RtX3NldF9lbmNyeXB0aW9uOwotc3RydWN0IGJ0bV9kbV9zdGFydF9nYXR0X2Rpc2NvdmVyeSBidG1fZG1fc3RhcnRfZ2F0dF9kaXNjb3Zlcnk7Ci1zdHJ1Y3QgaGFuZGxlX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZSBoYW5kbGVfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlOwotCi19ICAvLyBuYW1lc3BhY2UgYnRhX2RtX2FjdAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotYm9vbCBCVEFfRG1TZXRWaXNpYmlsaXR5KGJ0X3NjYW5fbW9kZV90IG1vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpCVEFfRG1TZXRWaXNpYmlsaXR5KG1vZGUpOwotfQotdm9pZCBCVEFfZG1fYWNsX2Rvd24oY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6QlRBX2RtX2FjbF9kb3duKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci19Ci12b2lkIEJUQV9kbV9hY2xfdXAoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6QlRBX2RtX2FjbF91cChiZF9hZGRyLCB0cmFuc3BvcnQpOwotfQotdm9pZCBCVEFfZG1fbm90aWZ5X3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OkJUQV9kbV9ub3RpZnlfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKGJkX2FkZHIpOwotfQotdm9pZCBCVEFfZG1fb25faHdfb2ZmKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6QlRBX2RtX29uX2h3X29mZigpOwotfQotdm9pZCBCVEFfZG1fb25faHdfb24oKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpCVEFfZG1fb25faHdfb24oKTsKLX0KLXZvaWQgQlRBX2RtX3JlcG9ydF9yb2xlX2NoYW5nZShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRIQ0lfUk9MRSBuZXdfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpCVEFfZG1fcmVwb3J0X3JvbGVfY2hhbmdlKGJkX2FkZHIsIG5ld19yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9zdGF0dXMpOwotfQotdm9pZCBidGFfZG1fYWNsX3VwKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fYWNsX3VwKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci19Ci12b2lkIGJ0YV9kbV9hZGRfYmxlX2RldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9hZGRfYmxlX2RldmljZShiZF9hZGRyLCBhZGRyX3R5cGUsIGRldl90eXBlKTsKLX0KLXZvaWQgYnRhX2RtX2FkZF9ibGVrZXkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9MRV9LRVlfVkFMVUUgYmxla2V5LAotICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFIGtleV90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fYWRkX2JsZWtleShiZF9hZGRyLCBibGVrZXksIGtleV90eXBlKTsKLX0KLXZvaWQgYnRhX2RtX2FkZF9kZXZpY2Uoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX0FERF9ERVZJQ0U+IG1zZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2FkZF9kZXZpY2Uoc3RkOjptb3ZlKG1zZykpOwotfQotdm9pZCBidGFfZG1fYmxlX2NvbmZpZ19sb2NhbF9wcml2YWN5KGJvb2wgcHJpdmFjeV9lbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9ibGVfY29uZmlnX2xvY2FsX3ByaXZhY3kocHJpdmFjeV9lbmFibGUpOwotfQotdm9pZCBidGFfZG1fYmxlX2NvbmZpcm1fcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9ibGVfY29uZmlybV9yZXBseShiZF9hZGRyLCBhY2NlcHQpOwotfQotdm9pZCBidGFfZG1fYmxlX2NzaXNfb2JzZXJ2ZShib29sIG9ic2VydmUsIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fYmxlX2NzaXNfb2JzZXJ2ZShvYnNlcnZlLCBwX2NiYWNrKTsKLX0KLXZvaWQgYnRhX2RtX2JsZV9nZXRfZW5lcmd5X2luZm8oCi0gICAgdEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfZW5lcmd5X2luZm9fY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9ibGVfZ2V0X2VuZXJneV9pbmZvKHBfZW5lcmd5X2luZm9fY2JhY2spOwotfQotdm9pZCBidGFfZG1fYmxlX29ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fYmxlX29ic2VydmUoc3RhcnQsIGR1cmF0aW9uLCBwX2NiYWNrKTsKLX0KLXZvaWQgYnRhX2RtX2JsZV9wYXNza2V5X3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc2tleSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2JsZV9wYXNza2V5X3JlcGx5KGJkX2FkZHIsIGFjY2VwdCwgcGFzc2tleSk7Ci19Ci12b2lkIGJ0YV9kbV9ibGVfc2Nhbihib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uX3NlYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2JsZV9zY2FuKHN0YXJ0LCBkdXJhdGlvbl9zZWMpOwotfQotdm9pZCBidGFfZG1fYmxlX3NldF9jb25uX3BhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2ludF9taW4sIHVpbnQxNl90IGNvbm5faW50X21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fYmxlX3NldF9jb25uX3BhcmFtcygKLSAgICAgIGJkX2FkZHIsIGNvbm5faW50X21pbiwgY29ubl9pbnRfbWF4LCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICBzdXBlcnZpc2lvbl90b3V0KTsKLX0KLXZvaWQgYnRhX2RtX2JsZV9zZXRfZGF0YV9sZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2JsZV9zZXRfZGF0YV9sZW5ndGgoYmRfYWRkcik7Ci19Ci12b2lkIGJ0YV9kbV9ibGVfdXBkYXRlX2Nvbm5fcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG1pbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9pbnQsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9ibGVfdXBkYXRlX2Nvbm5fcGFyYW1zKAotICAgICAgYmRfYWRkciwgbWluX2ludCwgbWF4X2ludCwgbGF0ZW5jeSwgdGltZW91dCwgbWluX2NlX2xlbiwgbWF4X2NlX2xlbik7Ci19Ci12b2lkIGJ0YV9kbV9ib25kKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2JvbmQoYmRfYWRkciwgYWRkcl90eXBlLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlKTsKLX0KLXZvaWQgYnRhX2RtX2JvbmRfY2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9ib25kX2NhbmNlbChiZF9hZGRyKTsKLX0KLWJvb2wgYnRhX2RtX2NoZWNrX2lmX29ubHlfaGRfY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9jaGVja19pZl9vbmx5X2hkX2Nvbm5lY3RlZChwZWVyX2FkZHIpOwotfQotdm9pZCBidGFfZG1fY2lfcm10X29vYl9hY3Qoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQ0lfUk1UX09PQj4gbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fY2lfcm10X29vYl9hY3Qoc3RkOjptb3ZlKG1zZykpOwotfQotdm9pZCBidGFfZG1fY2xvc2VfYWNsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwKLSAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2Nsb3NlX2FjbChiZF9hZGRyLCByZW1vdmVfZGV2LCB0cmFuc3BvcnQpOwotfQotdm9pZCBidGFfZG1fY2xvc2VfZ2F0dF9jb25uKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9jbG9zZV9nYXR0X2Nvbm4ocF9kYXRhKTsKLX0KLXZvaWQgYnRhX2RtX2NvbmZpcm0oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9jb25maXJtKGJkX2FkZHIsIGFjY2VwdCk7Ci19Ci12b2lkIGJ0YV9kbV9kZWluaXRfY2Iodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2RlaW5pdF9jYigpOwotfQotdm9pZCBidGFfZG1fZGlzYWJsZSgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9kaXNhYmxlKCk7Ci19Ci12b2lkIGJ0YV9kbV9kaXNjX3Jlc3VsdCh0QlRBX0RNX01TRyogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fZGlzY19yZXN1bHQocF9kYXRhKTsKLX0KLXZvaWQgYnRhX2RtX2Rpc2Nfcm10X25hbWUodEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2Rpc2Nfcm10X25hbWUocF9kYXRhKTsKLX0KLXZvaWQgYnRhX2RtX2Rpc2NvdmVyKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9kaXNjb3ZlcihwX2RhdGEpOwotfQotdm9pZCBidGFfZG1fZWlyX3VwZGF0ZV9jdXN0X3V1aWQoY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3VyciwgYm9vbCBhZGRpbmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9laXJfdXBkYXRlX2N1c3RfdXVpZChjdXJyLCBhZGRpbmcpOwotfQotdm9pZCBidGFfZG1fZWlyX3VwZGF0ZV91dWlkKHVpbnQxNl90IHV1aWQxNiwgYm9vbCBhZGRpbmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9laXJfdXBkYXRlX3V1aWQodXVpZDE2LCBhZGRpbmcpOwotfQotdm9pZCBidGFfZG1fZW5hYmxlKHRCVEFfRE1fU0VDX0NCQUNLKiBwX3NlY19jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2VuYWJsZShwX3NlY19jYmFjayk7Ci19Ci12b2lkIGJ0YV9kbV9lbmNyeXB0X2NiYWNrKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLCB0QlRNX1NUQVRVUyByZXN1bHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9lbmNyeXB0X2NiYWNrKGJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLX0KLXZvaWQgYnRhX2RtX2V4ZWN1dGVfcXVldWVkX3JlcXVlc3QoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdCgpOwotfQotdm9pZCBidGFfZG1fZnJlZV9zZHBfZGIoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fZnJlZV9zZHBfZGIoKTsKLX0KLXZvaWQgYnRhX2RtX2luaXRfY2Iodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX2luaXRfY2IoKTsKLX0KLXZvaWQgYnRhX2RtX2lucV9jbXBsKHVpbnQ4X3QgbnVtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1faW5xX2NtcGwobnVtKTsKLX0KLWJvb2wgYnRhX2RtX2lzX3NlYXJjaF9yZXF1ZXN0X3F1ZXVlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1faXNfc2VhcmNoX3JlcXVlc3RfcXVldWVkKCk7Ci19Ci12b2lkIGJ0YV9kbV9waW5fcmVwbHkoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX1BJTl9SRVBMWT4gbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fcGluX3JlcGx5KHN0ZDo6bW92ZShtc2cpKTsKLX0KLXZvaWQgYnRhX2RtX3Byb2Nfb3Blbl9ldnQodEJUQV9HQVRUQ19PUEVOKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9wcm9jX29wZW5fZXZ0KHBfZGF0YSk7Ci19Ci12b2lkIGJ0YV9kbV9wcm9jZXNzX3JlbW92ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZShiZF9hZGRyKTsKLX0KLXZvaWQgYnRhX2RtX3F1ZXVlX2Rpc2ModEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX3F1ZXVlX2Rpc2MocF9kYXRhKTsKLX0KLXZvaWQgYnRhX2RtX3F1ZXVlX3NlYXJjaCh0QlRBX0RNX01TRyogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fcXVldWVfc2VhcmNoKHBfZGF0YSk7Ci19Ci12b2lkIGJ0YV9kbV9yZW1vdmVfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9yZW1vdmVfZGV2aWNlKGJkX2FkZHIpOwotfQotdm9pZCBidGFfZG1fcm1fY2JhY2sodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX3JtX2NiYWNrKHN0YXR1cywgaWQsIGFwcF9pZCwgcGVlcl9hZGRyKTsKLX0KLXZvaWQgYnRhX2RtX3JtdF9uYW1lKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9ybXRfbmFtZShwX2RhdGEpOwotfQotdm9pZCBidGFfZG1fc2RwX3Jlc3VsdCh0QlRBX0RNX01TRyogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fc2RwX3Jlc3VsdChwX2RhdGEpOwotfQotdm9pZCBidGFfZG1fc2VhcmNoX2NhbmNlbCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9zZWFyY2hfY2FuY2VsKCk7Ci19Ci12b2lkIGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSgpOwotfQotdm9pZCBidGFfZG1fc2VhcmNoX2NsZWFyX3F1ZXVlKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX3NlYXJjaF9jbGVhcl9xdWV1ZSgpOwotfQotdm9pZCBidGFfZG1fc2VhcmNoX2NtcGwoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fc2VhcmNoX2NtcGwoKTsKLX0KLXZvaWQgYnRhX2RtX3NlYXJjaF9yZXN1bHQodEJUQV9ETV9NU0cqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX3NlYXJjaF9yZXN1bHQocF9kYXRhKTsKLX0KLXZvaWQgYnRhX2RtX3NlYXJjaF9zdGFydCh0QlRBX0RNX01TRyogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYWN0OjpidGFfZG1fc2VhcmNoX3N0YXJ0KHBfZGF0YSk7Ci19Ci12b2lkIGJ0YV9kbV9zZXRfZGV2X25hbWUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmJ0YV9kbV9zZXRfZGV2X25hbWUobmFtZSk7Ci19Ci12b2lkIGJ0YV9kbV9zZXRfZW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fRU5DUllQVF9DQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRhX2RtX3NldF9lbmNyeXB0aW9uKGJkX2FkZHIsIHRyYW5zcG9ydCwgcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY19hY3QpOwotfQotdm9pZCBidG1fZG1fc3RhcnRfZ2F0dF9kaXNjb3ZlcnkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FjdDo6YnRtX2RtX3N0YXJ0X2dhdHRfZGlzY292ZXJ5KGJkX2FkZHIpOwotfQotdm9pZCBoYW5kbGVfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hY3Q6OmhhbmRsZV9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUoYmRfYWRkcik7Ci19Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfZG1fYWN0LmggYi90ZXN0L21vY2svbW9ja19idGFfZG1fYWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTlhYTEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRhX2RtX2FjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo2MgotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgZnJvbSAob3IgYWRkIHRvICkgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotI2luY2x1ZGUgImJ0YS9kbS9idGFfZG1faW50LmgiCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9kbV9jaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2RtLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9zdGFja19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiZ2FwX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9uZWlnaGJvcl9pbnF1aXJ5LmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9jb25uZWN0aW9uX21hbmFnZXIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9jbGllbnRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIGJ0YV9kbV9hY3QgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogQlRBX0RtU2V0VmlzaWJpbGl0eQotLy8gUGFyYW1zOiBidF9zY2FuX21vZGVfdCBtb2RlCi0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBCVEFfRG1TZXRWaXNpYmlsaXR5IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woYnRfc2Nhbl9tb2RlX3QgbW9kZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oYnRfc2Nhbl9tb2RlX3QgbW9kZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGJ0X3NjYW5fbW9kZV90IG1vZGUpIHsgcmV0dXJuIGJvZHkobW9kZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1TZXRWaXNpYmlsaXR5IEJUQV9EbVNldFZpc2liaWxpdHk7Ci0KLS8vIE5hbWU6IEJUQV9kbV9hY2xfZG93bgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfZG1fYWNsX2Rvd24gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgYm9keShiZF9hZGRyLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX2RtX2FjbF9kb3duIEJUQV9kbV9hY2xfZG93bjsKLQotLy8gTmFtZTogQlRBX2RtX2FjbF91cAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfZG1fYWNsX3VwIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIGJvZHkoYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9kbV9hY2xfdXAgQlRBX2RtX2FjbF91cDsKLQotLy8gTmFtZTogQlRBX2RtX25vdGlmeV9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfZG1fbm90aWZ5X3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIpIHsgYm9keShiZF9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9kbV9ub3RpZnlfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlCi0gICAgQlRBX2RtX25vdGlmeV9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGU7Ci0KLS8vIE5hbWU6IEJUQV9kbV9vbl9od19vZmYKLS8vIFBhcmFtczoKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9kbV9vbl9od19vZmYgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfZG1fb25faHdfb2ZmIEJUQV9kbV9vbl9od19vZmY7Ci0KLS8vIE5hbWU6IEJUQV9kbV9vbl9od19vbgotLy8gUGFyYW1zOgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX2RtX29uX2h3X29uIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGJvZHl7W10oKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX2RtX29uX2h3X29uIEJUQV9kbV9vbl9od19vbjsKLQotLy8gTmFtZTogQlRBX2RtX3JlcG9ydF9yb2xlX2NoYW5nZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRIQ0lfUk9MRSBuZXdfcm9sZSwgdEhDSV9TVEFUVVMgaGNpX3N0YXR1cwotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX2RtX3JlcG9ydF9yb2xlX2NoYW5nZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRIQ0lfUk9MRSBuZXdfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIHRIQ0lfUk9MRSBuZXdfcm9sZSwKLSAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgaGNpX3N0YXR1cykge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyLCB0SENJX1JPTEUgbmV3X3JvbGUsCi0gICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKSB7Ci0gICAgYm9keShiZF9hZGRyLCBuZXdfcm9sZSwgaGNpX3N0YXR1cyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfZG1fcmVwb3J0X3JvbGVfY2hhbmdlIEJUQV9kbV9yZXBvcnRfcm9sZV9jaGFuZ2U7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9hY2xfdXAKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9hY2xfdXAgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgYm9keShiZF9hZGRyLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2FjbF91cCBidGFfZG1fYWNsX3VwOwotCi0vLyBOYW1lOiBidGFfZG1fYWRkX2JsZV9kZXZpY2UKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLCB0QlRfREVWSUNFX1RZUEUKLS8vIGRldl90eXBlIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9hZGRfYmxlX2RldmljZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgIHRCVF9ERVZJQ0VfVFlQRSBkZXZfdHlwZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlKSB7Ci0gICAgYm9keShiZF9hZGRyLCBhZGRyX3R5cGUsIGRldl90eXBlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9hZGRfYmxlX2RldmljZSBidGFfZG1fYWRkX2JsZV9kZXZpY2U7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9hZGRfYmxla2V5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFIGJsZWtleSwgdEJUTV9MRV9LRVlfVFlQRQotLy8ga2V5X3R5cGUgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2FkZF9ibGVrZXkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9MRV9LRVlfVkFMVUUgYmxla2V5LAotICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFIGJsZWtleSwKLSAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9MRV9LRVlfVkFMVUUgYmxla2V5LAotICAgICAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVFlQRSBrZXlfdHlwZSkgewotICAgIGJvZHkoYmRfYWRkciwgYmxla2V5LCBrZXlfdHlwZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fYWRkX2JsZWtleSBidGFfZG1fYWRkX2JsZWtleTsKLQotLy8gTmFtZTogYnRhX2RtX2FkZF9kZXZpY2UKLS8vIFBhcmFtczogc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX0FERF9ERVZJQ0U+IG1zZwotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2FkZF9kZXZpY2UgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX0FERF9ERVZJQ0U+IG1zZyk+IGJvZHl7Ci0gICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9BUElfQUREX0RFVklDRT4gbXNnKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9BUElfQUREX0RFVklDRT4gbXNnKSB7Ci0gICAgYm9keShzdGQ6Om1vdmUobXNnKSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fYWRkX2RldmljZSBidGFfZG1fYWRkX2RldmljZTsKLQotLy8gTmFtZTogYnRhX2RtX2JsZV9jb25maWdfbG9jYWxfcHJpdmFjeQotLy8gUGFyYW1zOiBib29sIHByaXZhY3lfZW5hYmxlCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fYmxlX2NvbmZpZ19sb2NhbF9wcml2YWN5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgcHJpdmFjeV9lbmFibGUpPiBib2R5e1tdKGJvb2wgcHJpdmFjeV9lbmFibGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGJvb2wgcHJpdmFjeV9lbmFibGUpIHsgYm9keShwcml2YWN5X2VuYWJsZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fYmxlX2NvbmZpZ19sb2NhbF9wcml2YWN5IGJ0YV9kbV9ibGVfY29uZmlnX2xvY2FsX3ByaXZhY3k7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9ibGVfY29uZmlybV9yZXBseQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2JsZV9jb25maXJtX3JlcGx5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0KT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCkgewotICAgIGJvZHkoYmRfYWRkciwgYWNjZXB0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9ibGVfY29uZmlybV9yZXBseSBidGFfZG1fYmxlX2NvbmZpcm1fcmVwbHk7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9ibGVfY3Npc19vYnNlcnZlCi0vLyBQYXJhbXM6IGJvb2wgb2JzZXJ2ZSwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2sKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9ibGVfY3Npc19vYnNlcnZlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2JzZXJ2ZSwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2spPiBib2R5ewotICAgICAgW10oYm9vbCBvYnNlcnZlLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jYmFjaykge319OwotICB2b2lkIG9wZXJhdG9yKCkoYm9vbCBvYnNlcnZlLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jYmFjaykgewotICAgIGJvZHkob2JzZXJ2ZSwgcF9jYmFjayk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fYmxlX2NzaXNfb2JzZXJ2ZSBidGFfZG1fYmxlX2NzaXNfb2JzZXJ2ZTsKLQotLy8gTmFtZTogYnRhX2RtX2JsZV9nZXRfZW5lcmd5X2luZm8KLS8vIFBhcmFtczogdEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfZW5lcmd5X2luZm9fY2JhY2sKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9ibGVfZ2V0X2VuZXJneV9pbmZvIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBwX2VuZXJneV9pbmZvX2NiYWNrKT4gYm9keXsKLSAgICAgIFtdKHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBwX2VuZXJneV9pbmZvX2NiYWNrKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRBX0JMRV9FTkVSR1lfSU5GT19DQkFDSyogcF9lbmVyZ3lfaW5mb19jYmFjaykgewotICAgIGJvZHkocF9lbmVyZ3lfaW5mb19jYmFjayk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fYmxlX2dldF9lbmVyZ3lfaW5mbyBidGFfZG1fYmxlX2dldF9lbmVyZ3lfaW5mbzsKLQotLy8gTmFtZTogYnRhX2RtX2JsZV9vYnNlcnZlCi0vLyBQYXJhbXM6IGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24sIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fYmxlX29ic2VydmUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrKT4KLSAgICAgIGJvZHl7W10oYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2spIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24sIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrKSB7Ci0gICAgYm9keShzdGFydCwgZHVyYXRpb24sIHBfY2JhY2spOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2JsZV9vYnNlcnZlIGJ0YV9kbV9ibGVfb2JzZXJ2ZTsKLQotLy8gTmFtZTogYnRhX2RtX2JsZV9wYXNza2V5X3JlcGx5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0LCB1aW50MzJfdCBwYXNza2V5Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fYmxlX3Bhc3NrZXlfcmVwbHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQzMl90IHBhc3NrZXkpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDMyX3QgcGFzc2tleSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgICBib2R5KGJkX2FkZHIsIGFjY2VwdCwgcGFzc2tleSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fYmxlX3Bhc3NrZXlfcmVwbHkgYnRhX2RtX2JsZV9wYXNza2V5X3JlcGx5OwotCi0vLyBOYW1lOiBidGFfZG1fYmxlX3NjYW4KLS8vIFBhcmFtczogYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbl9zZWMKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9ibGVfc2NhbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uX3NlYyk+IGJvZHl7Ci0gICAgICBbXShib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uX3NlYykge319OwotICB2b2lkIG9wZXJhdG9yKCkoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbl9zZWMpIHsKLSAgICBib2R5KHN0YXJ0LCBkdXJhdGlvbl9zZWMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2JsZV9zY2FuIGJ0YV9kbV9ibGVfc2NhbjsKLQotLy8gTmFtZTogYnRhX2RtX2JsZV9zZXRfY29ubl9wYXJhbXMKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgY29ubl9pbnRfbWluLCB1aW50MTZfdAotLy8gY29ubl9pbnRfbWF4LCB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQgUmV0dXJuOgotLy8gdm9pZAotc3RydWN0IGJ0YV9kbV9ibGVfc2V0X2Nvbm5fcGFyYW1zIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNvbm5faW50X21pbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50X21heCwgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNvbm5faW50X21pbiwKLSAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pbnRfbWF4LCB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IGNvbm5faW50X21pbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50X21heCwgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCkgewotICAgIGJvZHkoYmRfYWRkciwgY29ubl9pbnRfbWluLCBjb25uX2ludF9tYXgsIHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICAgICAgIHN1cGVydmlzaW9uX3RvdXQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2JsZV9zZXRfY29ubl9wYXJhbXMgYnRhX2RtX2JsZV9zZXRfY29ubl9wYXJhbXM7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9ibGVfc2V0X2RhdGFfbGVuZ3RoCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9ibGVfc2V0X2RhdGFfbGVuZ3RoIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyBib2R5KGJkX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2JsZV9zZXRfZGF0YV9sZW5ndGggYnRhX2RtX2JsZV9zZXRfZGF0YV9sZW5ndGg7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9ibGVfdXBkYXRlX2Nvbm5fcGFyYW1zCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0vLyB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fYmxlX3VwZGF0ZV9jb25uX3BhcmFtcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2ludCwgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4pPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5faW50LCB1aW50MTZfdCBtYXhfaW50LAotICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5faW50LCB1aW50MTZfdCBtYXhfaW50LAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgICBib2R5KGJkX2FkZHIsIG1pbl9pbnQsIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2JsZV91cGRhdGVfY29ubl9wYXJhbXMgYnRhX2RtX2JsZV91cGRhdGVfY29ubl9wYXJhbXM7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9ib25kCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwgdEJUX1RSQU5TUE9SVAotLy8gdHJhbnNwb3J0LCB0QlRfREVWSUNFX1RZUEUgZGV2aWNlX3R5cGUgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2JvbmQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICAgIGJvZHkoYmRfYWRkciwgYWRkcl90eXBlLCB0cmFuc3BvcnQsIGRldmljZV90eXBlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9ib25kIGJ0YV9kbV9ib25kOwotCi0vLyBOYW1lOiBidGFfZG1fYm9uZF9jYW5jZWwKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2JvbmRfY2FuY2VsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyBib2R5KGJkX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2JvbmRfY2FuY2VsIGJ0YV9kbV9ib25kX2NhbmNlbDsKLQotLy8gTmFtZTogYnRhX2RtX2NoZWNrX2lmX29ubHlfaGRfY29ubmVjdGVkCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcgotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgYnRhX2RtX2NoZWNrX2lmX29ubHlfaGRfY29ubmVjdGVkIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsgcmV0dXJuIGJvZHkocGVlcl9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9jaGVja19pZl9vbmx5X2hkX2Nvbm5lY3RlZAotICAgIGJ0YV9kbV9jaGVja19pZl9vbmx5X2hkX2Nvbm5lY3RlZDsKLQotLy8gTmFtZTogYnRhX2RtX2NpX3JtdF9vb2JfYWN0Ci0vLyBQYXJhbXM6IHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0NJX1JNVF9PT0I+IG1zZwotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2NpX3JtdF9vb2JfYWN0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0NJX1JNVF9PT0I+IG1zZyk+IGJvZHl7Ci0gICAgICBbXShzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9DSV9STVRfT09CPiBtc2cpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0NJX1JNVF9PT0I+IG1zZykgewotICAgIGJvZHkoc3RkOjptb3ZlKG1zZykpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2NpX3JtdF9vb2JfYWN0IGJ0YV9kbV9jaV9ybXRfb29iX2FjdDsKLQotLy8gTmFtZTogYnRhX2RtX2Nsb3NlX2FjbAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIHJlbW92ZV9kZXYsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fY2xvc2VfYWNsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwKLSAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCByZW1vdmVfZGV2LAotICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCByZW1vdmVfZGV2LAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICBib2R5KGJkX2FkZHIsIHJlbW92ZV9kZXYsIHRyYW5zcG9ydCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fY2xvc2VfYWNsIGJ0YV9kbV9jbG9zZV9hY2w7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9jbG9zZV9nYXR0X2Nvbm4KLS8vIFBhcmFtczogIHRCVEFfRE1fTVNHKiBwX2RhdGEKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9jbG9zZV9nYXR0X2Nvbm4gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9ETV9NU0cqIHBfZGF0YSk+IGJvZHl7W10odEJUQV9ETV9NU0cqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9ETV9NU0cqIHBfZGF0YSkgeyBib2R5KHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fY2xvc2VfZ2F0dF9jb25uIGJ0YV9kbV9jbG9zZV9nYXR0X2Nvbm47Ci0KLS8vIE5hbWU6IGJ0YV9kbV9jb25maXJtCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fY29uZmlybSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHsKLSAgICBib2R5KGJkX2FkZHIsIGFjY2VwdCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fY29uZmlybSBidGFfZG1fY29uZmlybTsKLQotLy8gTmFtZTogYnRhX2RtX2RlaW5pdF9jYgotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fZGVpbml0X2NiIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2RlaW5pdF9jYiBidGFfZG1fZGVpbml0X2NiOwotCi0vLyBOYW1lOiBidGFfZG1fZGlzYWJsZQotLy8gUGFyYW1zOgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2Rpc2FibGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fZGlzYWJsZSBidGFfZG1fZGlzYWJsZTsKLQotLy8gTmFtZTogYnRhX2RtX2Rpc2NfcmVzdWx0Ci0vLyBQYXJhbXM6IHRCVEFfRE1fTVNHKiBwX2RhdGEKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9kaXNjX3Jlc3VsdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QlRBX0RNX01TRyogcF9kYXRhKT4gYm9keXtbXSh0QlRBX0RNX01TRyogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRBX0RNX01TRyogcF9kYXRhKSB7IGJvZHkocF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9kaXNjX3Jlc3VsdCBidGFfZG1fZGlzY19yZXN1bHQ7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9kaXNjX3JtdF9uYW1lCi0vLyBQYXJhbXM6IHRCVEFfRE1fTVNHKiBwX2RhdGEKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9kaXNjX3JtdF9uYW1lIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfRE1fTVNHKiBwX2RhdGEpPiBib2R5e1tdKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsgYm9keShwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2Rpc2Nfcm10X25hbWUgYnRhX2RtX2Rpc2Nfcm10X25hbWU7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9kaXNjb3ZlcgotLy8gUGFyYW1zOiB0QlRBX0RNX01TRyogcF9kYXRhCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fZGlzY292ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9ETV9NU0cqIHBfZGF0YSk+IGJvZHl7W10odEJUQV9ETV9NU0cqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9ETV9NU0cqIHBfZGF0YSkgeyBib2R5KHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fZGlzY292ZXIgYnRhX2RtX2Rpc2NvdmVyOwotCi0vLyBOYW1lOiBidGFfZG1fZWlyX3VwZGF0ZV9jdXN0X3V1aWQKLS8vIFBhcmFtczogY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3VyciwgYm9vbCBhZGRpbmcKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9laXJfdXBkYXRlX2N1c3RfdXVpZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCB0QlRBX0NVU1RPTV9VVUlEJiBjdXJyLCBib29sIGFkZGluZyk+IGJvZHl7Ci0gICAgICBbXShjb25zdCB0QlRBX0NVU1RPTV9VVUlEJiBjdXJyLCBib29sIGFkZGluZykge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3VyciwgYm9vbCBhZGRpbmcpIHsKLSAgICBib2R5KGN1cnIsIGFkZGluZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fZWlyX3VwZGF0ZV9jdXN0X3V1aWQgYnRhX2RtX2Vpcl91cGRhdGVfY3VzdF91dWlkOwotCi0vLyBOYW1lOiBidGFfZG1fZWlyX3VwZGF0ZV91dWlkCi0vLyBQYXJhbXM6IHVpbnQxNl90IHV1aWQxNiwgYm9vbCBhZGRpbmcKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9laXJfdXBkYXRlX3V1aWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgdXVpZDE2LCBib29sIGFkZGluZyk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCB1dWlkMTYsIGJvb2wgYWRkaW5nKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50MTZfdCB1dWlkMTYsIGJvb2wgYWRkaW5nKSB7IGJvZHkodXVpZDE2LCBhZGRpbmcpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX2Vpcl91cGRhdGVfdXVpZCBidGFfZG1fZWlyX3VwZGF0ZV91dWlkOwotCi0vLyBOYW1lOiBidGFfZG1fZW5hYmxlCi0vLyBQYXJhbXM6IHRCVEFfRE1fU0VDX0NCQUNLKiBwX3NlY19jYmFjawotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2VuYWJsZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QlRBX0RNX1NFQ19DQkFDSyogcF9zZWNfY2JhY2spPiBib2R5ewotICAgICAgW10odEJUQV9ETV9TRUNfQ0JBQ0sqIHBfc2VjX2NiYWNrKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRBX0RNX1NFQ19DQkFDSyogcF9zZWNfY2JhY2spIHsgYm9keShwX3NlY19jYmFjayk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fZW5hYmxlIGJ0YV9kbV9lbmFibGU7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9lbmNyeXB0X2NiYWNrCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB2b2lkKiBwX3JlZl9kYXRhLAotLy8gdEJUTV9TVEFUVVMgcmVzdWx0IFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9lbmNyeXB0X2NiYWNrIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgcmVzdWx0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEsIHRCVE1fU1RBVFVTIHJlc3VsdCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLCB0QlRNX1NUQVRVUyByZXN1bHQpIHsKLSAgICBib2R5KGJkX2FkZHIsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgcmVzdWx0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9lbmNyeXB0X2NiYWNrIGJ0YV9kbV9lbmNyeXB0X2NiYWNrOwotCi0vLyBOYW1lOiBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdAotLy8gUGFyYW1zOgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX2V4ZWN1dGVfcXVldWVkX3JlcXVlc3QgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdCBidGFfZG1fZXhlY3V0ZV9xdWV1ZWRfcmVxdWVzdDsKLQotLy8gTmFtZTogYnRhX2RtX2ZyZWVfc2RwX2RiCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fZnJlZV9zZHBfZGIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fZnJlZV9zZHBfZGIgYnRhX2RtX2ZyZWVfc2RwX2RiOwotCi0vLyBOYW1lOiBidGFfZG1faW5pdF9jYgotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1faW5pdF9jYiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9pbml0X2NiIGJ0YV9kbV9pbml0X2NiOwotCi0vLyBOYW1lOiBidGFfZG1faW5xX2NtcGwKLS8vIFBhcmFtczogdWludDhfdCBudW0KLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9pbnFfY21wbCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90IG51bSk+IGJvZHl7W10odWludDhfdCBudW0pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QgbnVtKSB7IGJvZHkobnVtKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9pbnFfY21wbCBidGFfZG1faW5xX2NtcGw7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9pc19zZWFyY2hfcmVxdWVzdF9xdWV1ZWQKLS8vIFBhcmFtczoKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGJ0YV9kbV9pc19zZWFyY2hfcmVxdWVzdF9xdWV1ZWQgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBib2R5e1t0aGlzXSgpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9pc19zZWFyY2hfcmVxdWVzdF9xdWV1ZWQgYnRhX2RtX2lzX3NlYXJjaF9yZXF1ZXN0X3F1ZXVlZDsKLQotLy8gTmFtZTogYnRhX2RtX3Bpbl9yZXBseQotLy8gUGFyYW1zOiBzdGQ6OnVuaXF1ZV9wdHI8dEJUQV9ETV9BUElfUElOX1JFUExZPiBtc2cKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9waW5fcmVwbHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX1BJTl9SRVBMWT4gbXNnKT4gYm9keXsKLSAgICAgIFtdKHN0ZDo6dW5pcXVlX3B0cjx0QlRBX0RNX0FQSV9QSU5fUkVQTFk+IG1zZykge319OwotICB2b2lkIG9wZXJhdG9yKCkoc3RkOjp1bmlxdWVfcHRyPHRCVEFfRE1fQVBJX1BJTl9SRVBMWT4gbXNnKSB7Ci0gICAgYm9keShzdGQ6Om1vdmUobXNnKSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fcGluX3JlcGx5IGJ0YV9kbV9waW5fcmVwbHk7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9wcm9jX29wZW5fZXZ0Ci0vLyBQYXJhbXM6IHRCVEFfR0FUVENfT1BFTiogcF9kYXRhCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fcHJvY19vcGVuX2V2dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QlRBX0dBVFRDX09QRU4qIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0QlRBX0dBVFRDX09QRU4qIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9HQVRUQ19PUEVOKiBwX2RhdGEpIHsgYm9keShwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3Byb2Nfb3Blbl9ldnQgYnRhX2RtX3Byb2Nfb3Blbl9ldnQ7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9wcm9jZXNzX3JlbW92ZV9kZXZpY2UKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgYm9keShiZF9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9wcm9jZXNzX3JlbW92ZV9kZXZpY2UgYnRhX2RtX3Byb2Nlc3NfcmVtb3ZlX2RldmljZTsKLQotLy8gTmFtZTogYnRhX2RtX3F1ZXVlX2Rpc2MKLS8vIFBhcmFtczogdEJUQV9ETV9NU0cqIHBfZGF0YQotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX3F1ZXVlX2Rpc2MgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9ETV9NU0cqIHBfZGF0YSk+IGJvZHl7W10odEJUQV9ETV9NU0cqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9ETV9NU0cqIHBfZGF0YSkgeyBib2R5KHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fcXVldWVfZGlzYyBidGFfZG1fcXVldWVfZGlzYzsKLQotLy8gTmFtZTogYnRhX2RtX3F1ZXVlX3NlYXJjaAotLy8gUGFyYW1zOiB0QlRBX0RNX01TRyogcF9kYXRhCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fcXVldWVfc2VhcmNoIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfRE1fTVNHKiBwX2RhdGEpPiBib2R5e1tdKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsgYm9keShwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3F1ZXVlX3NlYXJjaCBidGFfZG1fcXVldWVfc2VhcmNoOwotCi0vLyBOYW1lOiBidGFfZG1fcmVtb3ZlX2RldmljZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fcmVtb3ZlX2RldmljZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgYm9keShiZF9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9yZW1vdmVfZGV2aWNlIGJ0YV9kbV9yZW1vdmVfZGV2aWNlOwotCi0vLyBOYW1lOiBidGFfZG1fcm1fY2JhY2sKLS8vIFBhcmFtczogdEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgY29uc3QKLS8vIFJhd0FkZHJlc3MmIHBlZXJfYWRkciBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fcm1fY2JhY2sgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik+Ci0gICAgICBib2R5e1tdKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgdWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICAgIGJvZHkoc3RhdHVzLCBpZCwgYXBwX2lkLCBwZWVyX2FkZHIpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3JtX2NiYWNrIGJ0YV9kbV9ybV9jYmFjazsKLQotLy8gTmFtZTogYnRhX2RtX3JtdF9uYW1lCi0vLyBQYXJhbXM6IHRCVEFfRE1fTVNHKiBwX2RhdGEKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9ybXRfbmFtZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QlRBX0RNX01TRyogcF9kYXRhKT4gYm9keXtbXSh0QlRBX0RNX01TRyogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRBX0RNX01TRyogcF9kYXRhKSB7IGJvZHkocF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9ybXRfbmFtZSBidGFfZG1fcm10X25hbWU7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9zZHBfcmVzdWx0Ci0vLyBQYXJhbXM6IHRCVEFfRE1fTVNHKiBwX2RhdGEKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9zZHBfcmVzdWx0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfRE1fTVNHKiBwX2RhdGEpPiBib2R5e1tdKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsgYm9keShwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3NkcF9yZXN1bHQgYnRhX2RtX3NkcF9yZXN1bHQ7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9zZWFyY2hfY2FuY2VsCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fc2VhcmNoX2NhbmNlbCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBib2R5e1tdKCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9zZWFyY2hfY2FuY2VsIGJ0YV9kbV9zZWFyY2hfY2FuY2VsOwotCi0vLyBOYW1lOiBidGFfZG1fc2VhcmNoX2NhbmNlbF9jbXBsCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fc2VhcmNoX2NhbmNlbF9jbXBsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGJvZHl7W10oKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3NlYXJjaF9jYW5jZWxfY21wbCBidGFfZG1fc2VhcmNoX2NhbmNlbF9jbXBsOwotCi0vLyBOYW1lOiBidGFfZG1fc2VhcmNoX2NhbmNlbF9ub3RpZnkKLS8vIFBhcmFtczoKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBib2R5e1tdKCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9kbV9zZWFyY2hfY2FuY2VsX25vdGlmeSBidGFfZG1fc2VhcmNoX2NhbmNlbF9ub3RpZnk7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9zZWFyY2hfY2xlYXJfcXVldWUKLS8vIFBhcmFtczoKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9kbV9zZWFyY2hfY2xlYXJfcXVldWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fc2VhcmNoX2NsZWFyX3F1ZXVlIGJ0YV9kbV9zZWFyY2hfY2xlYXJfcXVldWU7Ci0KLS8vIE5hbWU6IGJ0YV9kbV9zZWFyY2hfY21wbAotLy8gUGFyYW1zOgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX3NlYXJjaF9jbXBsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGJvZHl7W10oKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3NlYXJjaF9jbXBsIGJ0YV9kbV9zZWFyY2hfY21wbDsKLQotLy8gTmFtZTogYnRhX2RtX3NlYXJjaF9yZXN1bHQKLS8vIFBhcmFtczogdEJUQV9ETV9NU0cqIHBfZGF0YQotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2RtX3NlYXJjaF9yZXN1bHQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9ETV9NU0cqIHBfZGF0YSk+IGJvZHl7W10odEJUQV9ETV9NU0cqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9ETV9NU0cqIHBfZGF0YSkgeyBib2R5KHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fc2VhcmNoX3Jlc3VsdCBidGFfZG1fc2VhcmNoX3Jlc3VsdDsKLQotLy8gTmFtZTogYnRhX2RtX3NlYXJjaF9zdGFydAotLy8gUGFyYW1zOiB0QlRBX0RNX01TRyogcF9kYXRhCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fc2VhcmNoX3N0YXJ0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfRE1fTVNHKiBwX2RhdGEpPiBib2R5e1tdKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVEFfRE1fTVNHKiBwX2RhdGEpIHsgYm9keShwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3NlYXJjaF9zdGFydCBidGFfZG1fc2VhcmNoX3N0YXJ0OwotCi0vLyBOYW1lOiBidGFfZG1fc2V0X2Rldl9uYW1lCi0vLyBQYXJhbXM6IGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBuYW1lCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fc2V0X2Rldl9uYW1lIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBuYW1lKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBuYW1lKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbmFtZSkgeyBib2R5KG5hbWUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2RtX3NldF9kZXZfbmFtZSBidGFfZG1fc2V0X2Rldl9uYW1lOwotCi0vLyBOYW1lOiBidGFfZG1fc2V0X2VuY3J5cHRpb24KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0vLyB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqIHBfY2FsbGJhY2ssIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfZG1fc2V0X2VuY3J5cHRpb24gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2NhbGxiYWNrLCB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2NhbGxiYWNrLCB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHsKLSAgICBib2R5KGJkX2FkZHIsIHRyYW5zcG9ydCwgcF9jYWxsYmFjaywgc2VjX2FjdCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfZG1fc2V0X2VuY3J5cHRpb24gYnRhX2RtX3NldF9lbmNyeXB0aW9uOwotCi0vLyBOYW1lOiBidG1fZG1fc3RhcnRfZ2F0dF9kaXNjb3ZlcnkKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRtX2RtX3N0YXJ0X2dhdHRfZGlzY292ZXJ5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyBib2R5KGJkX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2RtX3N0YXJ0X2dhdHRfZGlzY292ZXJ5IGJ0bV9kbV9zdGFydF9nYXR0X2Rpc2NvdmVyeTsKLQotLy8gTmFtZTogaGFuZGxlX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBoYW5kbGVfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyBib2R5KGJkX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgaGFuZGxlX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZSBoYW5kbGVfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlOwotCi19ICAvLyBuYW1lc3BhY2UgYnRhX2RtX2FjdAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfZG1fYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2RtX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxNzIwOC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfZG1fYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozNAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX2J0YV9kbV9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBidGFfZG1fYXBpIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgQlRBX0RtQWRkQmxlRGV2aWNlIEJUQV9EbUFkZEJsZURldmljZTsKLXN0cnVjdCBCVEFfRG1BZGRCbGVLZXkgQlRBX0RtQWRkQmxlS2V5Owotc3RydWN0IEJUQV9EbUFkZERldmljZSBCVEFfRG1BZGREZXZpY2U7Ci1zdHJ1Y3QgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5IEJUQV9EbUJsZUNvbmZpZ0xvY2FsUHJpdmFjeTsKLXN0cnVjdCBCVEFfRG1CbGVDb25maXJtUmVwbHkgQlRBX0RtQmxlQ29uZmlybVJlcGx5Owotc3RydWN0IEJUQV9EbUJsZUNzaXNPYnNlcnZlIEJUQV9EbUJsZUNzaXNPYnNlcnZlOwotc3RydWN0IEJUQV9EbUJsZUdldEVuZXJneUluZm8gQlRBX0RtQmxlR2V0RW5lcmd5SW5mbzsKLXN0cnVjdCBCVEFfRG1CbGVPYnNlcnZlIEJUQV9EbUJsZU9ic2VydmU7Ci1zdHJ1Y3QgQlRBX0RtQmxlUGFzc2tleVJlcGx5IEJUQV9EbUJsZVBhc3NrZXlSZXBseTsKLXN0cnVjdCBCVEFfRG1CbGVSZXF1ZXN0TWF4VHhEYXRhTGVuZ3RoIEJUQV9EbUJsZVJlcXVlc3RNYXhUeERhdGFMZW5ndGg7Ci1zdHJ1Y3QgQlRBX0RtQmxlU2NhbiBCVEFfRG1CbGVTY2FuOwotc3RydWN0IEJUQV9EbUJsZVNlY3VyaXR5R3JhbnQgQlRBX0RtQmxlU2VjdXJpdHlHcmFudDsKLXN0cnVjdCBCVEFfRG1CbGVVcGRhdGVDb25uZWN0aW9uUGFyYW1zIEJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXM7Ci1zdHJ1Y3QgQlRBX0RtQm9uZCBCVEFfRG1Cb25kOwotc3RydWN0IEJUQV9EbUJvbmRDYW5jZWwgQlRBX0RtQm9uZENhbmNlbDsKLXN0cnVjdCBCVEFfRG1DbG9zZUFDTCBCVEFfRG1DbG9zZUFDTDsKLXN0cnVjdCBCVEFfRG1Db25maXJtIEJUQV9EbUNvbmZpcm07Ci1zdHJ1Y3QgQlRBX0RtRGlzY292ZXIgQlRBX0RtRGlzY292ZXI7Ci1zdHJ1Y3QgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlIEJUQV9EbUdldENvbm5lY3Rpb25TdGF0ZTsKLXN0cnVjdCBCVEFfRG1Mb2NhbE9vYiBCVEFfRG1Mb2NhbE9vYjsKLXN0cnVjdCBCVEFfRG1QaW5SZXBseSBCVEFfRG1QaW5SZXBseTsKLXN0cnVjdCBCVEFfRG1SZW1vdmVEZXZpY2UgQlRBX0RtUmVtb3ZlRGV2aWNlOwotc3RydWN0IEJUQV9EbVNlYXJjaCBCVEFfRG1TZWFyY2g7Ci1zdHJ1Y3QgQlRBX0RtU2VhcmNoQ2FuY2VsIEJUQV9EbVNlYXJjaENhbmNlbDsKLXN0cnVjdCBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtcyBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtczsKLXN0cnVjdCBCVEFfRG1TZXREZXZpY2VOYW1lIEJUQV9EbVNldERldmljZU5hbWU7Ci1zdHJ1Y3QgQlRBX0RtU2V0RW5jcnlwdGlvbiBCVEFfRG1TZXRFbmNyeXB0aW9uOwotc3RydWN0IEJUQV9EbVNldExvY2FsRGlSZWNvcmQgQlRBX0RtU2V0TG9jYWxEaVJlY29yZDsKLXN0cnVjdCBCVEFfRW5hYmxlVGVzdE1vZGUgQlRBX0VuYWJsZVRlc3RNb2RlOwotc3RydWN0IEJUQV9HZXRFaXJTZXJ2aWNlIEJUQV9HZXRFaXJTZXJ2aWNlOwotc3RydWN0IEJUQV9WZW5kb3JJbml0IEJUQV9WZW5kb3JJbml0Owotc3RydWN0IEJUQV9kbV9pbml0IEJUQV9kbV9pbml0OwotCi19ICAvLyBuYW1lc3BhY2UgYnRhX2RtX2FwaQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdm9pZCBCVEFfRG1BZGRCbGVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1BZGRCbGVEZXZpY2UoYmRfYWRkciwgYWRkcl90eXBlLCBkZXZfdHlwZSk7Ci19Ci12b2lkIEJUQV9EbUFkZEJsZUtleShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRBX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFIGtleV90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1BZGRCbGVLZXkoYmRfYWRkciwgcF9sZV9rZXksIGtleV90eXBlKTsKLX0KLXZvaWQgQlRBX0RtQWRkRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMaW5rS2V5JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbmd0aCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQWRkRGV2aWNlKGJkX2FkZHIsIGRldl9jbGFzcywgbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwgcGluX2xlbmd0aCk7Ci19Ci12b2lkIEJUQV9EbUJsZUNvbmZpZ0xvY2FsUHJpdmFjeShib29sIHByaXZhY3lfZW5hYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1CbGVDb25maWdMb2NhbFByaXZhY3kocHJpdmFjeV9lbmFibGUpOwotfQotdm9pZCBCVEFfRG1CbGVDb25maXJtUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbUJsZUNvbmZpcm1SZXBseShiZF9hZGRyLCBhY2NlcHQpOwotfQotdm9pZCBCVEFfRG1CbGVDc2lzT2JzZXJ2ZShib29sIG9ic2VydmUsIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX3Jlc3VsdHNfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbUJsZUNzaXNPYnNlcnZlKG9ic2VydmUsIHBfcmVzdWx0c19jYik7Ci19Ci12b2lkIEJUQV9EbUJsZUdldEVuZXJneUluZm8odEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfY21wbF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQmxlR2V0RW5lcmd5SW5mbyhwX2NtcGxfY2JhY2spOwotfQotdm9pZCBCVEFfRG1CbGVPYnNlcnZlKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQmxlT2JzZXJ2ZShzdGFydCwgZHVyYXRpb24sIHBfcmVzdWx0c19jYik7Ci19Ci12b2lkIEJUQV9EbUJsZVBhc3NrZXlSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbUJsZVBhc3NrZXlSZXBseShiZF9hZGRyLCBhY2NlcHQsIHBhc3NrZXkpOwotfQotdm9pZCBCVEFfRG1CbGVSZXF1ZXN0TWF4VHhEYXRhTGVuZ3RoKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9kZXZpY2UpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbUJsZVJlcXVlc3RNYXhUeERhdGFMZW5ndGgocmVtb3RlX2RldmljZSk7Ci19Ci12b2lkIEJUQV9EbUJsZVNjYW4oYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQmxlU2NhbihzdGFydCwgZHVyYXRpb24pOwotfQotdm9pZCBCVEFfRG1CbGVTZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9CTEVfU0VDX0dSQU5UIHJlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQmxlU2VjdXJpdHlHcmFudChiZF9hZGRyLCByZXMpOwotfQotdm9pZCBCVEFfRG1CbGVVcGRhdGVDb25uZWN0aW9uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2ludCwgdWludDE2X3QgbWF4X2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXMoCi0gICAgICBiZF9hZGRyLCBtaW5faW50LCBtYXhfaW50LCBsYXRlbmN5LCB0aW1lb3V0LCBtaW5fY2VfbGVuLCBtYXhfY2VfbGVuKTsKLX0KLXZvaWQgQlRBX0RtQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQm9uZChiZF9hZGRyLCBhZGRyX3R5cGUsIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfdHlwZSk7Ci19Ci12b2lkIEJUQV9EbUJvbmRDYW5jZWwoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQm9uZENhbmNlbChiZF9hZGRyKTsKLX0KLXZvaWQgQlRBX0RtQ2xvc2VBQ0woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCByZW1vdmVfZGV2LAotICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQ2xvc2VBQ0woYmRfYWRkciwgcmVtb3ZlX2RldiwgdHJhbnNwb3J0KTsKLX0KLXZvaWQgQlRBX0RtQ29uZmlybShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtQ29uZmlybShiZF9hZGRyLCBhY2NlcHQpOwotfQotdm9pZCBCVEFfRG1EaXNjb3Zlcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgaXNfYm9uZGluZ19vcl9zZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtRGlzY292ZXIoYmRfYWRkciwgcF9jYmFjaywgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib25kaW5nX29yX3NkKTsKLX0KLWJvb2wgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1HZXRDb25uZWN0aW9uU3RhdGUoYmRfYWRkcik7Ci19Ci12b2lkIEJUQV9EbUxvY2FsT29iKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbUxvY2FsT29iKCk7Ci19Ci12b2lkIEJUQV9EbVBpblJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0LCB1aW50OF90IHBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcGluKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1QaW5SZXBseShiZF9hZGRyLCBhY2NlcHQsIHBpbl9sZW4sIHBfcGluKTsKLX0KLXRCVEFfU1RBVFVTIEJUQV9EbVJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtUmVtb3ZlRGV2aWNlKGJkX2FkZHIpOwotfQotdm9pZCBCVEFfRG1TZWFyY2godEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssIGJvb2wgaXNfYm9uZGluZ19vcl9zZHApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9EbVNlYXJjaChwX2NiYWNrLCBpc19ib25kaW5nX29yX3NkcCk7Ci19Ci12b2lkIEJUQV9EbVNlYXJjaENhbmNlbCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1TZWFyY2hDYW5jZWwoKTsKLX0KLXZvaWQgQlRBX0RtU2V0QmxlUHJlZkNvbm5QYXJhbXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2Nvbm5faW50LCB1aW50MTZfdCBtYXhfY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtU2V0QmxlUHJlZkNvbm5QYXJhbXMoCi0gICAgICBiZF9hZGRyLCBtaW5fY29ubl9pbnQsIG1heF9jb25uX2ludCwgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgc3VwZXJ2aXNpb25fdG91dCk7Ci19Ci12b2lkIEJUQV9EbVNldERldmljZU5hbWUoY2hhciogcF9uYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1TZXREZXZpY2VOYW1lKHBfbmFtZSk7Ci19Ci12b2lkIEJUQV9EbVNldEVuY3J5cHRpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX0RtU2V0RW5jcnlwdGlvbihiZF9hZGRyLCB0cmFuc3BvcnQsIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjX2FjdCk7Ci19Ci10QlRBX1NUQVRVUyBCVEFfRG1TZXRMb2NhbERpUmVjb3JkKHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfRG1TZXRMb2NhbERpUmVjb3JkKHBfZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGFuZGxlKTsKLX0KLXZvaWQgQlRBX0VuYWJsZVRlc3RNb2RlKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9FbmFibGVUZXN0TW9kZSgpOwotfQotdm9pZCBCVEFfR2V0RWlyU2VydmljZShjb25zdCB1aW50OF90KiBwX2Vpciwgc2l6ZV90IGVpcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIHRCVEFfU0VSVklDRV9NQVNLKiBwX3NlcnZpY2VzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfZG1fYXBpOjpCVEFfR2V0RWlyU2VydmljZShwX2VpciwgZWlyX2xlbiwgcF9zZXJ2aWNlcyk7Ci19Ci12b2lkIEJUQV9WZW5kb3JJbml0KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9kbV9hcGk6OkJUQV9WZW5kb3JJbml0KCk7Ci19Ci12b2lkIEJUQV9kbV9pbml0KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2RtX2FwaTo6QlRBX2RtX2luaXQoKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9kbV9hcGkuaCBiL3Rlc3QvbW9jay9tb2NrX2J0YV9kbV9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0MTNkNS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfZG1fYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjM0Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2RtL2J0YV9kbV9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRhX2RtX2FwaSB7Ci0KLS8vIE5hbWU6IEJUQV9EbUFkZEJsZURldmljZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsIHRCVF9ERVZJQ0VfVFlQRQotLy8gZGV2X3R5cGUgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX0RtQWRkQmxlRGV2aWNlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHRCVF9ERVZJQ0VfVFlQRSBkZXZfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUpIHsKLSAgICBib2R5KGJkX2FkZHIsIGFkZHJfdHlwZSwgZGV2X3R5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQWRkQmxlRGV2aWNlIEJUQV9EbUFkZEJsZURldmljZTsKLQotLy8gTmFtZTogQlRBX0RtQWRkQmxlS2V5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFKiBwX2xlX2tleSwKLS8vIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX0RtQWRkQmxlS2V5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFKiBwX2xlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRBX0xFX0tFWV9WQUxVRSogcF9sZV9rZXksCi0gICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfTEVfS0VZX1ZBTFVFKiBwX2xlX2tleSwKLSAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpIHsKLSAgICBib2R5KGJkX2FkZHIsIHBfbGVfa2V5LCBrZXlfdHlwZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1BZGRCbGVLZXkgQlRBX0RtQWRkQmxlS2V5OwotCi0vLyBOYW1lOiBCVEFfRG1BZGREZXZpY2UKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgREVWX0NMQVNTIGRldl9jbGFzcywgY29uc3QgTGlua0tleSYKLS8vIGxpbmtfa2V5LCB1aW50OF90IGtleV90eXBlLCB1aW50OF90IHBpbl9sZW5ndGggUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX0RtQWRkRGV2aWNlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMaW5rS2V5JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbmd0aCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgIGNvbnN0IExpbmtLZXkmIGxpbmtfa2V5LCB1aW50OF90IGtleV90eXBlLAotICAgICAgICAgICAgICB1aW50OF90IHBpbl9sZW5ndGgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIERFVl9DTEFTUyBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICBjb25zdCBMaW5rS2V5JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbmd0aCkgewotICAgIGJvZHkoYmRfYWRkciwgZGV2X2NsYXNzLCBsaW5rX2tleSwga2V5X3R5cGUsIHBpbl9sZW5ndGgpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQWRkRGV2aWNlIEJUQV9EbUFkZERldmljZTsKLQotLy8gTmFtZTogQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5Ci0vLyBQYXJhbXM6IGJvb2wgcHJpdmFjeV9lbmFibGUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbUJsZUNvbmZpZ0xvY2FsUHJpdmFjeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHByaXZhY3lfZW5hYmxlKT4gYm9keXtbXShib29sIHByaXZhY3lfZW5hYmxlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShib29sIHByaXZhY3lfZW5hYmxlKSB7IGJvZHkocHJpdmFjeV9lbmFibGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQmxlQ29uZmlnTG9jYWxQcml2YWN5IEJUQV9EbUJsZUNvbmZpZ0xvY2FsUHJpdmFjeTsKLQotLy8gTmFtZTogQlRBX0RtQmxlQ29uZmlybVJlcGx5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1CbGVDb25maXJtUmVwbHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0KSB7Ci0gICAgYm9keShiZF9hZGRyLCBhY2NlcHQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQmxlQ29uZmlybVJlcGx5IEJUQV9EbUJsZUNvbmZpcm1SZXBseTsKLQotLy8gTmFtZTogQlRBX0RtQmxlQ3Npc09ic2VydmUKLS8vIFBhcmFtczogYm9vbCBvYnNlcnZlLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9yZXN1bHRzX2NiCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1CbGVDc2lzT2JzZXJ2ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9ic2VydmUsIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX3Jlc3VsdHNfY2IpPiBib2R5ewotICAgICAgW10oYm9vbCBvYnNlcnZlLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9yZXN1bHRzX2NiKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShib29sIG9ic2VydmUsIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX3Jlc3VsdHNfY2IpIHsKLSAgICBib2R5KG9ic2VydmUsIHBfcmVzdWx0c19jYik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1CbGVDc2lzT2JzZXJ2ZSBCVEFfRG1CbGVDc2lzT2JzZXJ2ZTsKLQotLy8gTmFtZTogQlRBX0RtQmxlR2V0RW5lcmd5SW5mbwotLy8gUGFyYW1zOiB0QlRBX0JMRV9FTkVSR1lfSU5GT19DQkFDSyogcF9jbXBsX2NiYWNrCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1CbGVHZXRFbmVyZ3lJbmZvIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfQkxFX0VORVJHWV9JTkZPX0NCQUNLKiBwX2NtcGxfY2JhY2spPiBib2R5ewotICAgICAgW10odEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfY21wbF9jYmFjaykge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9CTEVfRU5FUkdZX0lORk9fQ0JBQ0sqIHBfY21wbF9jYmFjaykgewotICAgIGJvZHkocF9jbXBsX2NiYWNrKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbUJsZUdldEVuZXJneUluZm8gQlRBX0RtQmxlR2V0RW5lcmd5SW5mbzsKLQotLy8gTmFtZTogQlRBX0RtQmxlT2JzZXJ2ZQotLy8gUGFyYW1zOiBib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9yZXN1bHRzX2NiCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1CbGVPYnNlcnZlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9yZXN1bHRzX2NiKT4KLSAgICAgIGJvZHl7W10oYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfcmVzdWx0c19jYikge319OwotICB2b2lkIG9wZXJhdG9yKCkoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX3Jlc3VsdHNfY2IpIHsKLSAgICBib2R5KHN0YXJ0LCBkdXJhdGlvbiwgcF9yZXN1bHRzX2NiKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbUJsZU9ic2VydmUgQlRBX0RtQmxlT2JzZXJ2ZTsKLQotLy8gTmFtZTogQlRBX0RtQmxlUGFzc2tleVJlcGx5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0LCB1aW50MzJfdCBwYXNza2V5Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1CbGVQYXNza2V5UmVwbHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQzMl90IHBhc3NrZXkpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDMyX3QgcGFzc2tleSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgICBib2R5KGJkX2FkZHIsIGFjY2VwdCwgcGFzc2tleSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1CbGVQYXNza2V5UmVwbHkgQlRBX0RtQmxlUGFzc2tleVJlcGx5OwotCi0vLyBOYW1lOiBCVEFfRG1CbGVSZXF1ZXN0TWF4VHhEYXRhTGVuZ3RoCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9kZXZpY2UKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbUJsZVJlcXVlc3RNYXhUeERhdGFMZW5ndGggewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2RldmljZSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfZGV2aWNlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfZGV2aWNlKSB7IGJvZHkocmVtb3RlX2RldmljZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1CbGVSZXF1ZXN0TWF4VHhEYXRhTGVuZ3RoIEJUQV9EbUJsZVJlcXVlc3RNYXhUeERhdGFMZW5ndGg7Ci0KLS8vIE5hbWU6IEJUQV9EbUJsZVNjYW4KLS8vIFBhcmFtczogYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX0RtQmxlU2NhbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN0YXJ0LCB1aW50OF90IGR1cmF0aW9uKT4gYm9keXsKLSAgICAgIFtdKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGJvb2wgc3RhcnQsIHVpbnQ4X3QgZHVyYXRpb24pIHsgYm9keShzdGFydCwgZHVyYXRpb24pOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQmxlU2NhbiBCVEFfRG1CbGVTY2FuOwotCi0vLyBOYW1lOiBCVEFfRG1CbGVTZWN1cml0eUdyYW50Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfRE1fQkxFX1NFQ19HUkFOVCByZXMKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbUJsZVNlY3VyaXR5R3JhbnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9ETV9CTEVfU0VDX0dSQU5UIHJlcyk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfRE1fQkxFX1NFQ19HUkFOVCByZXMpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfRE1fQkxFX1NFQ19HUkFOVCByZXMpIHsKLSAgICBib2R5KGJkX2FkZHIsIHJlcyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1CbGVTZWN1cml0eUdyYW50IEJUQV9EbUJsZVNlY3VyaXR5R3JhbnQ7Ci0KLS8vIE5hbWU6IEJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXMKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2ludCwgdWludDE2X3QgbWF4X2ludCwKLS8vIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4KLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXMgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2ludCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9pbnQsIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2ludCwgdWludDE2X3QgbWF4X2ludCwKLSAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2NlX2xlbikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2ludCwgdWludDE2X3QgbWF4X2ludCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gICAgYm9keShiZF9hZGRyLCBtaW5faW50LCBtYXhfaW50LCBsYXRlbmN5LCB0aW1lb3V0LCBtaW5fY2VfbGVuLCBtYXhfY2VfbGVuKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbUJsZVVwZGF0ZUNvbm5lY3Rpb25QYXJhbXMgQlRBX0RtQmxlVXBkYXRlQ29ubmVjdGlvblBhcmFtczsKLQotLy8gTmFtZTogQlRBX0RtQm9uZAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsIHRCVF9UUkFOU1BPUlQKLS8vIHRyYW5zcG9ydCwgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbUJvbmQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVF9ERVZJQ0VfVFlQRSBkZXZpY2VfdHlwZSkgewotICAgIGJvZHkoYmRfYWRkciwgYWRkcl90eXBlLCB0cmFuc3BvcnQsIGRldmljZV90eXBlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbUJvbmQgQlRBX0RtQm9uZDsKLQotLy8gTmFtZTogQlRBX0RtQm9uZENhbmNlbAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1Cb25kQ2FuY2VsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyBib2R5KGJkX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQm9uZENhbmNlbCBCVEFfRG1Cb25kQ2FuY2VsOwotCi0vLyBOYW1lOiBCVEFfRG1DbG9zZUFDTAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIHJlbW92ZV9kZXYsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1DbG9zZUFDTCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIHJlbW92ZV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwKLSAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgcmVtb3ZlX2RldiwKLSAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgYm9keShiZF9hZGRyLCByZW1vdmVfZGV2LCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQ2xvc2VBQ0wgQlRBX0RtQ2xvc2VBQ0w7Ci0KLS8vIE5hbWU6IEJUQV9EbUNvbmZpcm0KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbUNvbmZpcm0gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0KSB7Ci0gICAgYm9keShiZF9hZGRyLCBhY2NlcHQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtQ29uZmlybSBCVEFfRG1Db25maXJtOwotCi0vLyBOYW1lOiBCVEFfRG1EaXNjb3ZlcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jYmFjaywKLS8vIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIGlzX2JvbmRpbmdfb3Jfc2QgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX0RtRGlzY292ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBpc19ib25kaW5nX29yX3NkKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIGlzX2JvbmRpbmdfb3Jfc2QpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIGJvb2wgaXNfYm9uZGluZ19vcl9zZCkgewotICAgIGJvZHkoYmRfYWRkciwgcF9jYmFjaywgdHJhbnNwb3J0LCBpc19ib25kaW5nX29yX3NkKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbURpc2NvdmVyIEJUQV9EbURpc2NvdmVyOwotCi0vLyBOYW1lOiBCVEFfRG1HZXRDb25uZWN0aW9uU3RhdGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgcmV0dXJuIGJvZHkoYmRfYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1HZXRDb25uZWN0aW9uU3RhdGUgQlRBX0RtR2V0Q29ubmVjdGlvblN0YXRlOwotCi0vLyBOYW1lOiBCVEFfRG1Mb2NhbE9vYgotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1Mb2NhbE9vYiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbUxvY2FsT29iIEJUQV9EbUxvY2FsT29iOwotCi0vLyBOYW1lOiBCVEFfRG1QaW5SZXBseQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGFjY2VwdCwgdWludDhfdCBwaW5fbGVuLCB1aW50OF90KgotLy8gcF9waW4gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX0RtUGluUmVwbHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcGluKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBhY2NlcHQsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgdWludDhfdCogcF9waW4pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgYWNjZXB0LCB1aW50OF90IHBpbl9sZW4sCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3BpbikgewotICAgIGJvZHkoYmRfYWRkciwgYWNjZXB0LCBwaW5fbGVuLCBwX3Bpbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1QaW5SZXBseSBCVEFfRG1QaW5SZXBseTsKLQotLy8gTmFtZTogQlRBX0RtUmVtb3ZlRGV2aWNlCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIKLS8vIFJldHVybjogdEJUQV9TVEFUVVMKLXN0cnVjdCBCVEFfRG1SZW1vdmVEZXZpY2UgewotICB0QlRBX1NUQVRVUyByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUQV9TVEFUVVMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdEJUQV9TVEFUVVMgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7IHJldHVybiBib2R5KGJkX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtUmVtb3ZlRGV2aWNlIEJUQV9EbVJlbW92ZURldmljZTsKLQotLy8gTmFtZTogQlRBX0RtU2VhcmNoCi0vLyBQYXJhbXM6IHRCVEFfRE1fU0VBUkNIX0NCQUNLKiBwX2NiYWNrLCBib29sIGlzX2JvbmRpbmdfb3Jfc2RwCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1TZWFyY2ggewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssIGJvb2wgaXNfYm9uZGluZ19vcl9zZHApPgotICAgICAgYm9keXtbXSh0QlRBX0RNX1NFQVJDSF9DQkFDSyogcF9jYmFjaywgYm9vbCBpc19ib25kaW5nX29yX3NkcCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEJUQV9ETV9TRUFSQ0hfQ0JBQ0sqIHBfY2JhY2ssIGJvb2wgaXNfYm9uZGluZ19vcl9zZHApIHsKLSAgICBib2R5KHBfY2JhY2ssIGlzX2JvbmRpbmdfb3Jfc2RwKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbVNlYXJjaCBCVEFfRG1TZWFyY2g7Ci0KLS8vIE5hbWU6IEJUQV9EbVNlYXJjaENhbmNlbAotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1TZWFyY2hDYW5jZWwgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1TZWFyY2hDYW5jZWwgQlRBX0RtU2VhcmNoQ2FuY2VsOwotCi0vLyBOYW1lOiBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtcwotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBtaW5fY29ubl9pbnQsIHVpbnQxNl90Ci0vLyBtYXhfY29ubl9pbnQsIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeSwgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCBSZXR1cm46Ci0vLyB2b2lkCi1zdHJ1Y3QgQlRBX0RtU2V0QmxlUHJlZkNvbm5QYXJhbXMgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2Nvbm5faW50LCB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2Nvbm5faW50LAotICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY29ubl9pbnQsIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdG91dCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgbWluX2Nvbm5faW50LAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2Nvbm5faW50LCB1aW50MTZfdCBwZXJpcGhlcmFsX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0KSB7Ci0gICAgYm9keShiZF9hZGRyLCBtaW5fY29ubl9pbnQsIG1heF9jb25uX2ludCwgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgc3VwZXJ2aXNpb25fdG91dCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtcyBCVEFfRG1TZXRCbGVQcmVmQ29ublBhcmFtczsKLQotLy8gTmFtZTogQlRBX0RtU2V0RGV2aWNlTmFtZQotLy8gUGFyYW1zOiBjaGFyKiBwX25hbWUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9EbVNldERldmljZU5hbWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY2hhciogcF9uYW1lKT4gYm9keXtbXShjaGFyKiBwX25hbWUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNoYXIqIHBfbmFtZSkgeyBib2R5KHBfbmFtZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfRG1TZXREZXZpY2VOYW1lIEJUQV9EbVNldERldmljZU5hbWU7Ci0KLS8vIE5hbWU6IEJUQV9EbVNldEVuY3J5cHRpb24KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0vLyB0QlRBX0RNX0VOQ1JZUFRfQ0JBQ0sqIHBfY2FsbGJhY2ssIHRCVE1fQkxFX1NFQ19BQ1Qgc2VjX2FjdCBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfRG1TZXRFbmNyeXB0aW9uIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgdEJUQV9ETV9FTkNSWVBUX0NCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgIHRCVEFfRE1fRU5DUllQVF9DQkFDSyogcF9jYWxsYmFjaywgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIHRCVEFfRE1fRU5DUllQVF9DQkFDSyogcF9jYWxsYmFjaywgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSB7Ci0gICAgYm9keShiZF9hZGRyLCB0cmFuc3BvcnQsIHBfY2FsbGJhY2ssIHNlY19hY3QpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRBX0RtU2V0RW5jcnlwdGlvbiBCVEFfRG1TZXRFbmNyeXB0aW9uOwotCi0vLyBOYW1lOiBCVEFfRG1TZXRMb2NhbERpUmVjb3JkCi0vLyBQYXJhbXM6IHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLCB1aW50MzJfdCogcF9oYW5kbGUKLS8vIFJldHVybjogdEJUQV9TVEFUVVMKLXN0cnVjdCBCVEFfRG1TZXRMb2NhbERpUmVjb3JkIHsKLSAgdEJUQV9TVEFUVVMgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHRCVEFfU1RBVFVTKHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLCB1aW50MzJfdCogcF9oYW5kbGUpPgotICAgICAgYm9keXtbdGhpc10odFNEUF9ESV9SRUNPUkQqIHBfZGV2aWNlX2luZm8sIHVpbnQzMl90KiBwX2hhbmRsZSkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIHRCVEFfU1RBVFVTIG9wZXJhdG9yKCkodFNEUF9ESV9SRUNPUkQqIHBfZGV2aWNlX2luZm8sIHVpbnQzMl90KiBwX2hhbmRsZSkgewotICAgIHJldHVybiBib2R5KHBfZGV2aWNlX2luZm8sIHBfaGFuZGxlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9EbVNldExvY2FsRGlSZWNvcmQgQlRBX0RtU2V0TG9jYWxEaVJlY29yZDsKLQotLy8gTmFtZTogQlRBX0VuYWJsZVRlc3RNb2RlCi0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9FbmFibGVUZXN0TW9kZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9FbmFibGVUZXN0TW9kZSBCVEFfRW5hYmxlVGVzdE1vZGU7Ci0KLS8vIE5hbWU6IEJUQV9HZXRFaXJTZXJ2aWNlCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHBfZWlyLCBzaXplX3QgZWlyX2xlbiwgdEJUQV9TRVJWSUNFX01BU0sqIHBfc2VydmljZXMKLS8vIFJldHVybjogdm9pZAotc3RydWN0IEJUQV9HZXRFaXJTZXJ2aWNlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHVpbnQ4X3QqIHBfZWlyLCBzaXplX3QgZWlyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgIHRCVEFfU0VSVklDRV9NQVNLKiBwX3NlcnZpY2VzKT4KLSAgICAgIGJvZHl7W10oY29uc3QgdWludDhfdCogcF9laXIsIHNpemVfdCBlaXJfbGVuLAotICAgICAgICAgICAgICB0QlRBX1NFUlZJQ0VfTUFTSyogcF9zZXJ2aWNlcykge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgdWludDhfdCogcF9laXIsIHNpemVfdCBlaXJfbGVuLAotICAgICAgICAgICAgICAgICAgdEJUQV9TRVJWSUNFX01BU0sqIHBfc2VydmljZXMpIHsKLSAgICBib2R5KHBfZWlyLCBlaXJfbGVuLCBwX3NlcnZpY2VzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9HZXRFaXJTZXJ2aWNlIEJUQV9HZXRFaXJTZXJ2aWNlOwotCi0vLyBOYW1lOiBCVEFfVmVuZG9ySW5pdAotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBCVEFfVmVuZG9ySW5pdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUQV9WZW5kb3JJbml0IEJUQV9WZW5kb3JJbml0OwotCi0vLyBOYW1lOiBCVEFfZG1faW5pdAotLy8gUGFyYW1zOgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX2RtX2luaXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfZG1faW5pdCBCVEFfZG1faW5pdDsKLQotfSAgLy8gbmFtZXNwYWNlIGJ0YV9kbV9hcGkKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX2dhdHRjX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9nYXR0Y19hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWIyZGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRhX2dhdHRjX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MzAKLSAqLwotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0KLSNpbmNsdWRlIDxpb3M+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2dhdHQvYnRhX2dhdHRjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvYnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXZvaWQgQlRBX0dBVFRDX0Rpc2FibGUodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIEJUQV9HQVRUQ19HZXRDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotY29uc3QgZ2F0dDo6Q2hhcmFjdGVyaXN0aWMqIEJUQV9HQVRUQ19HZXRPd25pbmdDaGFyYWN0ZXJpc3RpYyh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotY29uc3QgZ2F0dDo6RGVzY3JpcHRvciogQlRBX0dBVFRDX0dldERlc2NyaXB0b3IodWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCBnYXR0OjpTZXJ2aWNlKiBCVEFfR0FUVENfR2V0T3duaW5nU2VydmljZSh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWNvbnN0IHN0ZDo6bGlzdDxnYXR0OjpTZXJ2aWNlPiogQlRBX0dBVFRDX0dldFNlcnZpY2VzKHVpbnQxNl90IGNvbm5faWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEdBVFRfU1RBVFVTIEJUQV9HQVRUQ19EZXJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyh0R0FUVF9JRiBjbGllbnRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIEJUQV9HQVRUQ19SZWdpc3RlckZvck5vdGlmaWNhdGlvbnModEdBVFRfSUYgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdm9pZCBCVEFfR0FUVENfQXBwRGVyZWdpc3Rlcih0R0FUVF9JRiBjbGllbnRfaWYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUQ19BcHBSZWdpc3Rlcih0QlRBX0dBVFRDX0NCQUNLKiBwX2NsaWVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ0YUFwcFJlZ2lzdGVyQ2FsbGJhY2sgY2IsIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfQ2FuY2VsT3Blbih0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfQ2xvc2UodWludDE2X3QgY29ubl9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVEFfR0FUVENfQ29uZmlndXJlTVRVKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IG10dSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRDX0NvbmZpZ3VyZU1UVSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBtdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9DT05GSUdVUkVfTVRVX09QX0NCIGNhbGxiYWNrLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfRGlzY292ZXJTZXJ2aWNlQnlVdWlkKHVpbnQxNl90IGNvbm5faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBzcnZjX3V1aWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUQ19FeGVjdXRlV3JpdGUodWludDE2X3QgY29ubl9pZCwgYm9vbCBpc19leGVjdXRlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfR2V0R2F0dERiKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfaGFuZGxlLCBidGdhdHRfZGJfZWxlbWVudF90KiogZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb3VudCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRDX09wZW4odEdBVFRfSUYgY2xpZW50X2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCwgYm9vbCBvcHBvcnR1bmlzdGljKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfT3Blbih0R0FUVF9JRiBjbGllbnRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZGlyZWN0LCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBvcHBvcnR1bmlzdGljLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluaXRpYXRpbmdfcGh5cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRDX1ByZXBhcmVXcml0ZSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSwgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYWxsYmFjaywgdm9pZCogY2JfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRDX1JlYWRDaGFyRGVzY3IodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSwgR0FUVF9SRUFEX09QX0NCIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfUmVhZENoYXJhY3RlcmlzdGljKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFQURfT1BfQ0IgY2FsbGJhY2ssIHZvaWQqIGNiX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUQ19SZWFkTXVsdGlwbGUodWludDE2X3QgY29ubl9pZCwgdEJUQV9HQVRUQ19NVUxUSSogcF9yZWFkX211bHRpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0FVVEhfUkVRIGF1dGhfcmVxKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfUmVhZFVzaW5nQ2hhclV1aWQodWludDE2X3QgY29ubl9pZCwgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc19oYW5kbGUsIHVpbnQxNl90IGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1JFQURfT1BfQ0IgY2FsbGJhY2ssIHZvaWQqIGNiX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUQ19SZWZyZXNoKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUQ19TZW5kSW5kQ29uZmlybSh1aW50MTZfdCBjb25uX2lkLCB1aW50MTZfdCBjaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUQ19TZXJ2aWNlU2VhcmNoUmVxdWVzdCh1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBwX3NydmNfdXVpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRDX1dyaXRlQ2hhckRlc2NyKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQVVUSF9SRVEgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQVRUX1dSSVRFX09QX0NCIGNhbGxiYWNrLCB2b2lkKiBjYl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVENfV3JpdGVDaGFyVmFsdWUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfV1JJVEVfVFlQRSB3cml0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2FsbGJhY2ssIHZvaWQqIGNiX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfZ2F0dHNfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2dhdHRzX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzODBlNC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfZ2F0dHNfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEzCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGEvZ2F0dC9idGFfZ2F0dHNfaW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBCVEFfR0FUVFNfRGlzYWJsZSh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9HQVRUU19BcHBEZXJlZ2lzdGVyKHRHQVRUX0lGIHNlcnZlcl9pZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRTX0FwcFJlZ2lzdGVyKGNvbnN0IGJsdWV0b290aDo6VXVpZCYgYXBwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0dBVFRTX0NCQUNLKiBwX2NiYWNrLCBib29sIGVhdHRfc3VwcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRTX0NhbmNlbE9wZW4odEdBVFRfSUYgc2VydmVyX2lmLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0dBVFRTX0Nsb3NlKHVpbnQxNl90IGNvbm5faWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0dBVFRTX0FkZFNlcnZpY2UodEdBVFRfSUYgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfR0FUVFNfQWRkU2VydmljZUNiIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVFNfRGVsZXRlU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVFNfSGFuZGxlVmFsdWVJbmRpY2F0aW9uKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGF0dHJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkX2NvbmZpcm0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUU19PcGVuKHRHQVRUX0lGIHNlcnZlcl9pZiwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfR0FUVFNfU2VuZFJzcCh1aW50MTZfdCBjb25uX2lkLCB1aW50MzJfdCB0cmFuc19pZCwgdEdBVFRfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRTX1JTUCogcF9tc2cpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9HQVRUU19TdG9wU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfZ2F0dHNfYWRkX3NlcnZpY2VfaW1wbCh0R0FUVF9JRiBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9HQVRUU19BZGRTZXJ2aWNlQ2IgY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfZ3JvdXBzLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2dyb3Vwcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2YjQzMC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfZ3JvdXBzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIEhJTVNBIElJIEsvUyAtIHd3dy5oaW1zYS5jb20uCi0gKiBSZXByZXNlbnRlZCBieSBFSElNQSAtIHd3dy5laGltYS5jb20KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ3JvdXBzLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdXNpbmcgYmx1ZXRvb3RoOjpncm91cHM6OkRldmljZUdyb3VwczsKLQotdm9pZCBEZXZpY2VHcm91cHM6OkFkZEZyb21TdG9yYWdlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi1ib29sIERldmljZUdyb3Vwczo6R2V0Rm9yU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX2hkX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9oZF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTAyMDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRhX2hkX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGEvaGQvYnRhX2hkX2ludC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2NvbXBhdC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIEJUQV9IZEVuYWJsZSh0QlRBX0hEX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGRBZGREZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hkQ29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGREaXNhYmxlKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0hkRGlzY29ubmVjdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9IZFJlZ2lzdGVyQXBwKHRCVEFfSERfQVBQX0lORk8qIHBfYXBwX2luZm8sIHRCVEFfSERfUU9TX0lORk8qIHBfaW5fcW9zLAotICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hEX1FPU19JTkZPKiBwX291dF9xb3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9IZFJlbW92ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGRSZXBvcnRFcnJvcih1aW50OF90IGVycm9yKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9IZFNlbmRSZXBvcnQodEJUQV9IRF9SRVBPUlQqIHBfcmVwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGRVbnJlZ2lzdGVyQXBwKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0hkVmlydHVhbENhYmxlVW5wbHVnKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9oZWFyaW5nX2FpZC5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9oZWFyaW5nX2FpZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiY2QwOS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfaGVhcmluZ19haWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZWFyaW5nX2FpZF9hcGkuaCIKLSNpbmNsdWRlICJlbWJkcnYvZzcyMi9nNzIyX2VuY19kZWMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1pbnQgSGVhcmluZ0FpZDo6R2V0RGV2aWNlQ291bnQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgSGVhcmluZ0FpZDo6QWRkRnJvbVN0b3JhZ2UoY29uc3QgSGVhcmluZ0RldmljZSYgZGV2X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGlzX2FjY2VwdGxpc3RlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgSGVhcmluZ0FpZDo6RGVidWdEdW1wKGludCBmZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotSGVhcmluZ0FpZCogSGVhcmluZ0FpZDo6R2V0KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1ib29sIEhlYXJpbmdBaWQ6OklzSGVhcmluZ0FpZFJ1bm5pbmcoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci12b2lkIEhlYXJpbmdBaWQ6OkNsZWFuVXAoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEhlYXJpbmdBaWQ6OkluaXRpYWxpemUoCi0gICAgYmx1ZXRvb3RoOjpoZWFyaW5nX2FpZDo6SGVhcmluZ0FpZENhbGxiYWNrcyogY2FsbGJhY2tzLAotICAgIGJhc2U6OkNsb3N1cmUgaW5pdENiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX2hmX2NsaWVudF9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19idGFfaGZfY2xpZW50X2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNjkxMy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfaGZfY2xpZW50X2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo4Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSAiYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZl9jbGllbnRfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29tcGF0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXRCVEFfU1RBVFVTIEJUQV9IZkNsaWVudEVuYWJsZSh0QlRBX0hGX0NMSUVOVF9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0hGX0NMSUVOVF9GRUFUIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBfc2VydmljZV9uYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRBX1NVQ0NFU1M7Ci19Ci12b2lkIEJUQV9IZkNsaWVudEF1ZGlvQ2xvc2UodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGZDbGllbnRBdWRpb09wZW4odWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGZDbGllbnRDbG9zZSh1aW50MTZfdCBoYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0hmQ2xpZW50RGlzYWJsZSh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9IZkNsaWVudER1bXBTdGF0aXN0aWNzKGludCBmZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVEFfSGZDbGllbnRPcGVuKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90KiBwX2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hmQ2xpZW50U2VuZEFUKHVpbnQxNl90IGhhbmRsZSwgdEJUQV9IRl9DTElFTlRfQVRfQ01EX1RZUEUgYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwxLCB1aW50MzJfdCB2YWwyLCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfaGhfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2hoX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4ZTU2NC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfaGhfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE2Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGEvaGgvYnRhX2hoX2ludC5oIgotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXZvaWQgQlRBX0hoRW5hYmxlKHRCVEFfSEhfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9IaEFkZERldihjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRCVEFfSEhfQVRUUl9NQVNLIGF0dHJfbWFzaywKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3ViX2NsYXNzLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgIHRCVEFfSEhfREVWX0RTQ1BfSU5GTyBkc2NwX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUQV9IaENsb3NlKHVpbnQ4X3QgZGV2X2hhbmRsZSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVEFfSGhEaXNhYmxlKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX0hoR2V0RHNjcEluZm8odWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGhHZXRJZGxlKHVpbnQ4X3QgZGV2X2hhbmRsZSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVEFfSGhHZXRQcm90b01vZGUodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGhHZXRSZXBvcnQodWludDhfdCBkZXZfaGFuZGxlLCB0QlRBX0hIX1JQVF9UWVBFIHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnB0X2lkLCB1aW50MTZfdCBidWZfc2l6ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hoT3Blbihjb25zdCBSYXdBZGRyZXNzJiBkZXZfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGhSZW1vdmVEZXYodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSGhTZW5kQ3RybCh1aW50OF90IGRldl9oYW5kbGUsIHRCVEFfSEhfVFJBTlNfQ1RSTF9UWVBFIGNfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hoU2VuZERhdGEodWludDhfdCBkZXZfaGFuZGxlLCBVTlVTRURfQVRUUiBjb25zdCBSYXdBZGRyZXNzJiBkZXZfYmRhLAotICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hoU2V0SWRsZSh1aW50OF90IGRldl9oYW5kbGUsIHVpbnQxNl90IGlkbGVfcmF0ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hoU2V0UHJvdG9Nb2RlKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdEJUQV9ISF9QUk9UT19NT0RFIHBfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0hoU2V0UmVwb3J0KHVpbnQ4X3QgZGV2X2hhbmRsZSwgdEJUQV9ISF9SUFRfVFlQRSByX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9oaF91dGlscy5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9oaF91dGlscy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4MGRkMy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfaGhfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEwCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19idGFfaGhfdXRpbHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBidGFfaGhfdXRpbHMgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBidGFfaGhfYWRkX2RldmljZV90b19saXN0IGJ0YV9oaF9hZGRfZGV2aWNlX3RvX2xpc3Q7Ci1zdHJ1Y3QgYnRhX2hoX2NsZWFuX3VwX2tkZXYgYnRhX2hoX2NsZWFuX3VwX2tkZXY7Ci1zdHJ1Y3QgYnRhX2hoX2NsZWFudXBfZGlzYWJsZSBidGFfaGhfY2xlYW51cF9kaXNhYmxlOwotc3RydWN0IGJ0YV9oaF9kZXZfaGFuZGxlX3RvX2NiX2lkeCBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHg7Ci1zdHJ1Y3QgYnRhX2hoX2ZpbmRfY2IgYnRhX2hoX2ZpbmRfY2I7Ci1zdHJ1Y3QgYnRhX2hoX2dldF9jYiBidGFfaGhfZ2V0X2NiOwotc3RydWN0IGJ0YV9oaF9yZWFkX3Nzcl9wYXJhbSBidGFfaGhfcmVhZF9zc3JfcGFyYW07Ci1zdHJ1Y3QgYnRhX2hoX3RvZF9zcHQgYnRhX2hoX3RvZF9zcHQ7Ci1zdHJ1Y3QgYnRhX2hoX3RyYWNlX2Rldl9kYiBidGFfaGhfdHJhY2VfZGV2X2RiOwotc3RydWN0IGJ0YV9oaF91cGRhdGVfZGlfaW5mbyBidGFfaGhfdXBkYXRlX2RpX2luZm87Ci0KLX0gIC8vIG5hbWVzcGFjZSBidGFfaGhfdXRpbHMKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXZvaWQgYnRhX2hoX2FkZF9kZXZpY2VfdG9fbGlzdCh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDhfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRISURfREVWX0RTQ1BfSU5GTyogcF9kc2NwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdWJfY2xhc3MsIHVpbnQxNl90IHNzcl9tYXhfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzc3JfbWluX3RvdXQsIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfaGhfdXRpbHM6OmJ0YV9oaF9hZGRfZGV2aWNlX3RvX2xpc3QoCi0gICAgICBwX2NiLCBoYW5kbGUsIGF0dHJfbWFzaywgcF9kc2NwX2luZm8sIHN1Yl9jbGFzcywgc3NyX21heF9sYXRlbmN5LAotICAgICAgc3NyX21pbl90b3V0LCBhcHBfaWQpOwotfQotdm9pZCBidGFfaGhfY2xlYW5fdXBfa2Rldih0QlRBX0hIX0RFVl9DQiogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX2hoX3V0aWxzOjpidGFfaGhfY2xlYW5fdXBfa2RldihwX2NiKTsKLX0KLXZvaWQgYnRhX2hoX2NsZWFudXBfZGlzYWJsZSh0QlRBX0hIX1NUQVRVUyBzdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9oaF91dGlsczo6YnRhX2hoX2NsZWFudXBfZGlzYWJsZShzdGF0dXMpOwotfQotdWludDhfdCBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRhX2hoX3V0aWxzOjpidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgoZGV2X2hhbmRsZSk7Ci19Ci11aW50OF90IGJ0YV9oaF9maW5kX2NiKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0YV9oaF91dGlsczo6YnRhX2hoX2ZpbmRfY2IoYmRhKTsKLX0KLXRCVEFfSEhfREVWX0NCKiBidGFfaGhfZ2V0X2NiKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0YV9oaF91dGlsczo6YnRhX2hoX2dldF9jYihiZGEpOwotfQotdEJUQV9ISF9TVEFUVVMgYnRhX2hoX3JlYWRfc3NyX3BhcmFtKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfbWF4X3Nzcl9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfbWluX3Nzcl90b3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRhX2hoX3V0aWxzOjpidGFfaGhfcmVhZF9zc3JfcGFyYW0oYmRfYWRkciwgcF9tYXhfc3NyX2xhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWluX3Nzcl90b3V0KTsKLX0KLWJvb2wgYnRhX2hoX3RvZF9zcHQodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3Qgc3ViX2NsYXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRhX2hoX3V0aWxzOjpidGFfaGhfdG9kX3NwdChwX2NiLCBzdWJfY2xhc3MpOwotfQotdm9pZCBidGFfaGhfdHJhY2VfZGV2X2RiKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9oaF91dGlsczo6YnRhX2hoX3RyYWNlX2Rldl9kYigpOwotfQotdm9pZCBidGFfaGhfdXBkYXRlX2RpX2luZm8odEJUQV9ISF9ERVZfQ0IqIHBfY2IsIHVpbnQxNl90IHZlbmRvcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb2R1Y3RfaWQsIHVpbnQxNl90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZsYWcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0YV9oaF91dGlsczo6YnRhX2hoX3VwZGF0ZV9kaV9pbmZvKHBfY2IsIHZlbmRvcl9pZCwgcHJvZHVjdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiwgZmxhZyk7Ci19Ci0vLyBNb2NrZWQgZnVuY3Rpb25zIGNvbXBsZXRlCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX2hoX3V0aWxzLmggYi90ZXN0L21vY2svbW9ja19idGFfaGhfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYmMwYy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfaGhfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTAKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YS9oaC9idGFfaGhfaW50LmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRhX2hoX3V0aWxzIHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IGJ0YV9oaF9hZGRfZGV2aWNlX3RvX2xpc3QKLS8vIFBhcmFtczogdEJUQV9ISF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX21hc2ssIGNvbnN0Ci0vLyB0SElEX0RFVl9EU0NQX0lORk8qIHBfZHNjcF9pbmZvLCB1aW50OF90IHN1Yl9jbGFzcywgdWludDE2X3Qgc3NyX21heF9sYXRlbmN5LAotLy8gdWludDE2X3Qgc3NyX21pbl90b3V0LCB1aW50OF90IGFwcF9pZCBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfaGhfYWRkX2RldmljZV90b19saXN0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50OF90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEhJRF9ERVZfRFNDUF9JTkZPKiBwX2RzY3BfaW5mbywgdWludDhfdCBzdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzc3JfbWF4X2xhdGVuY3ksIHVpbnQxNl90IHNzcl9taW5fdG91dCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKT4KLSAgICAgIGJvZHl7W10odEJUQV9ISF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX21hc2ssCi0gICAgICAgICAgICAgIGNvbnN0IHRISURfREVWX0RTQ1BfSU5GTyogcF9kc2NwX2luZm8sIHVpbnQ4X3Qgc3ViX2NsYXNzLAotICAgICAgICAgICAgICB1aW50MTZfdCBzc3JfbWF4X2xhdGVuY3ksIHVpbnQxNl90IHNzcl9taW5fdG91dCwKLSAgICAgICAgICAgICAgdWludDhfdCBhcHBfaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50OF90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgY29uc3QgdEhJRF9ERVZfRFNDUF9JTkZPKiBwX2RzY3BfaW5mbywgdWludDhfdCBzdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBzc3JfbWF4X2xhdGVuY3ksIHVpbnQxNl90IHNzcl9taW5fdG91dCwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gICAgYm9keShwX2NiLCBoYW5kbGUsIGF0dHJfbWFzaywgcF9kc2NwX2luZm8sIHN1Yl9jbGFzcywgc3NyX21heF9sYXRlbmN5LAotICAgICAgICAgc3NyX21pbl90b3V0LCBhcHBfaWQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2hoX2FkZF9kZXZpY2VfdG9fbGlzdCBidGFfaGhfYWRkX2RldmljZV90b19saXN0OwotCi0vLyBOYW1lOiBidGFfaGhfY2xlYW5fdXBfa2RldgotLy8gUGFyYW1zOiB0QlRBX0hIX0RFVl9DQiogcF9jYgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2hoX2NsZWFuX3VwX2tkZXYgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEJUQV9ISF9ERVZfQ0IqIHBfY2IpPiBib2R5e1tdKHRCVEFfSEhfREVWX0NCKiBwX2NiKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRBX0hIX0RFVl9DQiogcF9jYikgeyBib2R5KHBfY2IpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2hoX2NsZWFuX3VwX2tkZXYgYnRhX2hoX2NsZWFuX3VwX2tkZXY7Ci0KLS8vIE5hbWU6IGJ0YV9oaF9jbGVhbnVwX2Rpc2FibGUKLS8vIFBhcmFtczogdEJUQV9ISF9TVEFUVVMgc3RhdHVzCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfaGhfY2xlYW51cF9kaXNhYmxlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfSEhfU1RBVFVTIHN0YXR1cyk+IGJvZHl7W10odEJUQV9ISF9TVEFUVVMgc3RhdHVzKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRBX0hIX1NUQVRVUyBzdGF0dXMpIHsgYm9keShzdGF0dXMpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2hoX2NsZWFudXBfZGlzYWJsZSBidGFfaGhfY2xlYW51cF9kaXNhYmxlOwotCi0vLyBOYW1lOiBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHgKLS8vIFBhcmFtczogdWludDhfdCBkZXZfaGFuZGxlCi0vLyBSZXR1cm46IHVpbnQ4X3QKLXN0cnVjdCBidGFfaGhfZGV2X2hhbmRsZV90b19jYl9pZHggewotICB1aW50OF90IHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjx1aW50OF90KHVpbnQ4X3QgZGV2X2hhbmRsZSk+IGJvZHl7Ci0gICAgICBbdGhpc10odWludDhfdCBkZXZfaGFuZGxlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICB1aW50OF90IG9wZXJhdG9yKCkodWludDhfdCBkZXZfaGFuZGxlKSB7IHJldHVybiBib2R5KGRldl9oYW5kbGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2hoX2Rldl9oYW5kbGVfdG9fY2JfaWR4IGJ0YV9oaF9kZXZfaGFuZGxlX3RvX2NiX2lkeDsKLQotLy8gTmFtZTogYnRhX2hoX2ZpbmRfY2IKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhCi0vLyBSZXR1cm46IHVpbnQ4X3QKLXN0cnVjdCBidGFfaGhfZmluZF9jYiB7Ci0gIHVpbnQ4X3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QoY29uc3QgUmF3QWRkcmVzcyYgYmRhKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHVpbnQ4X3Qgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsgcmV0dXJuIGJvZHkoYmRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9oaF9maW5kX2NiIGJ0YV9oaF9maW5kX2NiOwotCi0vLyBOYW1lOiBidGFfaGhfZ2V0X2NiCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkYQotLy8gUmV0dXJuOiB0QlRBX0hIX0RFVl9DQioKLXN0cnVjdCBidGFfaGhfZ2V0X2NiIHsKLSAgdEJUQV9ISF9ERVZfQ0IqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjx0QlRBX0hIX0RFVl9DQiooY29uc3QgUmF3QWRkcmVzcyYgYmRhKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHRCVEFfSEhfREVWX0NCKiBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgeyByZXR1cm4gYm9keShiZGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2hoX2dldF9jYiBidGFfaGhfZ2V0X2NiOwotCi0vLyBOYW1lOiBidGFfaGhfcmVhZF9zc3JfcGFyYW0KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QqIHBfbWF4X3Nzcl9sYXQsIHVpbnQxNl90KgotLy8gcF9taW5fc3NyX3RvdXQgUmV0dXJuOiB0QlRBX0hIX1NUQVRVUwotc3RydWN0IGJ0YV9oaF9yZWFkX3Nzcl9wYXJhbSB7Ci0gIHRCVEFfSEhfU1RBVFVTIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjx0QlRBX0hIX1NUQVRVUyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX21heF9zc3JfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX21pbl9zc3JfdG91dCk+Ci0gICAgICBib2R5e1t0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCogcF9tYXhfc3NyX2xhdCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX21pbl9zc3JfdG91dCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdEJUQV9ISF9TVEFUVVMgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCogcF9tYXhfc3NyX2xhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9taW5fc3NyX3RvdXQpIHsKLSAgICByZXR1cm4gYm9keShiZF9hZGRyLCBwX21heF9zc3JfbGF0LCBwX21pbl9zc3JfdG91dCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfaGhfcmVhZF9zc3JfcGFyYW0gYnRhX2hoX3JlYWRfc3NyX3BhcmFtOwotCi0vLyBOYW1lOiBidGFfaGhfdG9kX3NwdAotLy8gUGFyYW1zOiB0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDhfdCBzdWJfY2xhc3MKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGJ0YV9oaF90b2Rfc3B0IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodEJUQV9ISF9ERVZfQ0IqIHBfY2IsIHVpbnQ4X3Qgc3ViX2NsYXNzKT4gYm9keXsKLSAgICAgIFt0aGlzXSh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDhfdCBzdWJfY2xhc3MpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDhfdCBzdWJfY2xhc3MpIHsKLSAgICByZXR1cm4gYm9keShwX2NiLCBzdWJfY2xhc3MpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX2hoX3RvZF9zcHQgYnRhX2hoX3RvZF9zcHQ7Ci0KLS8vIE5hbWU6IGJ0YV9oaF90cmFjZV9kZXZfZGIKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2hoX3RyYWNlX2Rldl9kYiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9oaF90cmFjZV9kZXZfZGIgYnRhX2hoX3RyYWNlX2Rldl9kYjsKLQotLy8gTmFtZTogYnRhX2hoX3VwZGF0ZV9kaV9pbmZvCi0vLyBQYXJhbXM6IHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IHByb2R1Y3RfaWQsCi0vLyB1aW50MTZfdCB2ZXJzaW9uLCB1aW50OF90IGZsYWcgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX2hoX3VwZGF0ZV9kaV9pbmZvIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50MTZfdCB2ZW5kb3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9kdWN0X2lkLCB1aW50MTZfdCB2ZXJzaW9uLCB1aW50OF90IGZsYWcpPgotICAgICAgYm9keXtbXSh0QlRBX0hIX0RFVl9DQiogcF9jYiwgdWludDE2X3QgdmVuZG9yX2lkLCB1aW50MTZfdCBwcm9kdWN0X2lkLAotICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uLCB1aW50OF90IGZsYWcpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVEFfSEhfREVWX0NCKiBwX2NiLCB1aW50MTZfdCB2ZW5kb3JfaWQsIHVpbnQxNl90IHByb2R1Y3RfaWQsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uLCB1aW50OF90IGZsYWcpIHsKLSAgICBib2R5KHBfY2IsIHZlbmRvcl9pZCwgcHJvZHVjdF9pZCwgdmVyc2lvbiwgZmxhZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfaGhfdXBkYXRlX2RpX2luZm8gYnRhX2hoX3VwZGF0ZV9kaV9pbmZvOwotCi19ICAvLyBuYW1lc3BhY2UgYnRhX2hoX3V0aWxzCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9qdl9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19idGFfanZfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmExOTYwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9qdl9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjIyCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2p2L2J0YV9qdl9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2FwX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkNyZWF0ZVJlY29yZEJ5VXNlcih1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QlRBX0pWX1NUQVRVUyBCVEFfSnZEZWxldGVSZWNvcmQodWludDMyX3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkVuYWJsZSh0QlRBX0pWX0RNX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkZyZWVDaGFubmVsKHVpbnQxNl90IGNoYW5uZWwsIGludCBjb25uX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBDbG9zZSh1aW50MzJfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBSZWFkKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdkwyY2FwUmVhZHkodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCogcF9kYXRhX3NpemUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBTdG9wU2VydmVyKHVpbnQxNl90IGxvY2FsX3BzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsMmNhcF9zb2NrZXRfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9KVl9TVEFUVVMgQlRBX0p2TDJjYXBXcml0ZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHJlcV9pZCwgQlRfSERSKiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tQ2xvc2UodWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1Db25uZWN0KHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZW1vdGVfc2NuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUkZDT01NX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QlRBX0pWX1NUQVRVUyBCVEFfSnZSZmNvbW1TdGFydFNlcnZlcih0QlRBX1NFQyBzZWNfbWFzaywgdEJUQV9KVl9ST0xFIHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxvY2FsX3NjbiwgdWludDhfdCBtYXhfc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfUkZDT01NX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmZjb21tX3Nsb3RfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9KVl9TVEFUVVMgQlRBX0p2UmZjb21tU3RvcFNlcnZlcih1aW50MzJfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJmY29tbV9zbG90X2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlJmY29tbVdyaXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgcmVxX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlNldFBtUHJvZmlsZSh1aW50MzJfdCBoYW5kbGUsIHRCVEFfSlZfUE1fSUQgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSlZfQ09OTl9TVEFURSBpbml0X3N0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVEFfSlZfU1RBVFVTIEJUQV9KdlN0YXJ0RGlzY292ZXJ5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF91dWlkX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZmNvbW1fc2xvdF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBCVEFfSnZSZmNvbW1HZXRQb3J0SGRsKHVpbnQzMl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEJUQV9KdkRpc2FibGUodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVEFfSnZHZXRDaGFubmVsSWQoaW50IGNvbm5fdHlwZSwgdWludDMyX3QgaWQsIGludDMyX3QgY2hhbm5lbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRBX0p2TDJjYXBDb25uZWN0KGludCBjb25uX3R5cGUsIHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0TDJDQVBfRVJUTV9JTkZPPiBlcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZW1vdGVfcHNtLCB1aW50MTZfdCByeF9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0NGR19JTkZPPiBjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbDJjYXBfc29ja2V0X2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfSnZMMmNhcFN0YXJ0U2VydmVyKGludCBjb25uX3R5cGUsIHRCVEFfU0VDIHNlY19tYXNrLCB0QlRBX0pWX1JPTEUgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dEwyQ0FQX0VSVE1fSU5GTz4gZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxvY2FsX3BzbSwgdWludDE2X3QgcnhfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx0TDJDQVBfQ0ZHX0lORk8+IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRBX0pWX0wyQ0FQX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGwyY2FwX3NvY2tldF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9sZWF1ZGlvLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX2xlYXVkaW8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NDI2OTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRhX2xlYXVkaW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9iaW5kX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9sZV9hdWRpby5oPgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2xlX2F1ZGlvX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vKiBFbXB0eSBjbGFzcyB0byBzYXRpc2Z5IGNvbXBpbGVyICovCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBhdWRpbyB7Ci1jbGFzcyBIYWxWZXJzaW9uTWFuYWdlciB7Ci0gIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SGFsVmVyc2lvbk1hbmFnZXI+IGluc3RhbmNlX3B0cjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYXVkaW8KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotdm9pZCBMZUF1ZGlvQ2xpZW50OjpBZGRGcm9tU3RvcmFnZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9fY29ubmVjdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTGVBdWRpb0NsaWVudDo6Q2xlYW51cCgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLQotTGVBdWRpb0NsaWVudCogTGVBdWRpb0NsaWVudDo6R2V0KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotYm9vbCBMZUF1ZGlvQ2xpZW50OjpJc0xlQXVkaW9DbGllbnRSdW5uaW5nKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgTGVBdWRpb0NsaWVudDo6SW5pdGlhbGl6ZSgKLSAgICBibHVldG9vdGg6OmxlX2F1ZGlvOjpMZUF1ZGlvQ2xpZW50Q2FsbGJhY2tzKiBjYWxsYmFja3NfLAotICAgIGJhc2U6OkNsb3N1cmUgaW5pdENiLCBiYXNlOjpDYWxsYmFjazxib29sKCk+IGhhbF8yXzFfdmVyaWZpZXIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIExlQXVkaW9DbGllbnQ6OkRlYnVnRHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfcGFuX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9wYW5fYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNkZTM3ZDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRhX3Bhbl9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTAKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLSNpbmNsdWRlICJidGEvcGFuL2J0YV9wYW5faW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdm9pZCBCVEFfUGFuQ2xvc2UodWludDE2X3QgaGFuZGxlKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUQV9QYW5EaXNhYmxlKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRBX1BhbkVuYWJsZSh0QlRBX1BBTl9DQkFDSyBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfUGFuT3Blbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRBX1BBTl9ST0xFIGxvY2FsX3JvbGUsCi0gICAgICAgICAgICAgICAgIHRCVEFfUEFOX1JPTEUgcGVlcl9yb2xlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVEFfUGFuU2V0Um9sZSh0QlRBX1BBTl9ST0xFIHJvbGUsIHRCVEFfUEFOX1JPTEVfSU5GTyogcF91c2VyX2luZm8sCi0gICAgICAgICAgICAgICAgICAgIHRCVEFfUEFOX1JPTEVfSU5GTyogcF9uYXBfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9wYW5fY2kuY2MgYi90ZXN0L21vY2svbW9ja19idGFfcGFuX2NpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzEzODRmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV9wYW5fY2kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidGEvcGFuL2J0YV9wYW5faW50LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotQlRfSERSKiBidGFfcGFuX2NpX3JlYWRidWYodWludDE2X3QgaGFuZGxlLCBSYXdBZGRyZXNzJiBzcmMsIFJhd0FkZHJlc3MmIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3Byb3RvY29sLCBib29sKiBwX2V4dCwgYm9vbCogcF9mb3J3YXJkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQgYnRhX3Bhbl9jaV9yeF9yZWFkeSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGUodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgc3JjLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgYm9vbCBleHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9wYW5fY2lfcnhfd3JpdGVidWYodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgc3JjLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCBib29sIGV4dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3Bhbl9jaV90eF9mbG93KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBlbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9wYW5fY2lfdHhfcmVhZHkodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX3NkcF9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19idGFfc2RwX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmNzE2ZS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfc2RwX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9zZHBfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3NkcC9idGFfc2RwX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXRCVEFfU0RQX1NUQVRVUyBCVEFfU2RwQ3JlYXRlUmVjb3JkQnlVc2VyKHZvaWQqIHVzZXJfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUQV9TRFBfU1VDQ0VTUzsKLX0KLXRCVEFfU0RQX1NUQVRVUyBCVEFfU2RwRW5hYmxlKHRCVEFfU0RQX0RNX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRBX1NEUF9TVUNDRVNTOwotfQotdEJUQV9TRFBfU1RBVFVTIEJUQV9TZHBSZW1vdmVSZWNvcmRCeVVzZXIodm9pZCogdXNlcl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRBX1NEUF9TVUNDRVNTOwotfQotdEJUQV9TRFBfU1RBVFVTIEJUQV9TZHBTZWFyY2goY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUQV9TRFBfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9zeXNfY29ubi5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9zeXNfY29ubi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzMzRhOC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfc3lzX2Nvbm4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE5Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzX2ludC5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBidGFfc3lzX2FwcF9jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfc3lzX2FwcF9vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfYnVzeSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfc3lzX2NoZ19zc3JfY29uZmlnKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCB1aW50MTZfdCBtYXhfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fdG91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19jb2xsaXNpb25fcmVnaXN0ZXIodWludDhfdCBidGFfaWQsIHRCVEFfU1lTX0NPTk5fQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfY29ubl9jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19jb25uX29wZW4odWludDhfdCBpZCwgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19pZGxlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfbm90aWZ5X2NvbGxpc2lvbihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfbm90aWZ5X3JvbGVfY2hnKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkciwgdEhDSV9ST0xFIG5ld19yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBoY2lfc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfc3lzX3BtX3JlZ2lzdGVyKHRCVEFfU1lTX0NPTk5fQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfcm1fcmVnaXN0ZXIodEJUQV9TWVNfQ09OTl9DQkFDSyogcF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19yb2xlX2NoZ19yZWdpc3Rlcih0QlRBX1NZU19DT05OX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfc3lzX3Njb19jbG9zZSh1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfc3lzX3Njb19vcGVuKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLCBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfc2NvX3JlZ2lzdGVyKHRCVEFfU1lTX0NPTk5fQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfc2NvX3VudXNlKHVpbnQ4X3QgaWQsIHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfc2NvX3VzZShVTlVTRURfQVRUUiB1aW50OF90IGlkLCB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19zc3JfY2ZnX3JlZ2lzdGVyKHRCVEFfU1lTX1NTUl9DRkdfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfZWlyX3JlZ2lzdGVyKHRCVEFfU1lTX0VJUl9DQkFDSyogcF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19jdXN0X2Vpcl9yZWdpc3Rlcih0QlRBX1NZU19DVVNUX0VJUl9DQkFDSyogcF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX3N5c19hZGRfdXVpZCh1aW50MTZfdCB1dWlkMTYpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRhX3N5c19yZW1vdmVfdXVpZCh1aW50MTZfdCB1dWlkMTYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0YV9zeXNfYWRkX2N1c3RfdXVpZChjb25zdCB0QlRBX0NVU1RPTV9VVUlEJiBjdXJyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfc3lzX3JlbW92ZV9jdXN0X3V1aWQoY29uc3QgdEJUQV9DVVNUT01fVVVJRCYgY3VycikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0YV9zeXNfbWFpbi5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0YV9zeXNfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3NGZhYS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfc3lzX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEwCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19idGFfc3lzX21haW4uaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRhX3N5c19tYWluIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgQlRBX3N5c19zaWduYWxfaHdfZXJyb3IgQlRBX3N5c19zaWduYWxfaHdfZXJyb3I7Ci1zdHJ1Y3QgYnRhX3NldF9mb3J3YXJkX2h3X2ZhaWx1cmVzIGJ0YV9zZXRfZm9yd2FyZF9od19mYWlsdXJlczsKLXN0cnVjdCBidGFfc3lzX2RlcmVnaXN0ZXIgYnRhX3N5c19kZXJlZ2lzdGVyOwotc3RydWN0IGJ0YV9zeXNfZGlzYWJsZSBidGFfc3lzX2Rpc2FibGU7Ci1zdHJ1Y3QgYnRhX3N5c19pbml0IGJ0YV9zeXNfaW5pdDsKLXN0cnVjdCBidGFfc3lzX2lzX3JlZ2lzdGVyIGJ0YV9zeXNfaXNfcmVnaXN0ZXI7Ci1zdHJ1Y3QgYnRhX3N5c19yZWdpc3RlciBidGFfc3lzX3JlZ2lzdGVyOwotc3RydWN0IGJ0YV9zeXNfc2VuZG1zZyBidGFfc3lzX3NlbmRtc2c7Ci1zdHJ1Y3QgYnRhX3N5c19zZW5kbXNnX2RlbGF5ZWQgYnRhX3N5c19zZW5kbXNnX2RlbGF5ZWQ7Ci1zdHJ1Y3QgYnRhX3N5c19zdGFydF90aW1lciBidGFfc3lzX3N0YXJ0X3RpbWVyOwotCi19ICAvLyBuYW1lc3BhY2UgYnRhX3N5c19tYWluCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkIEJUQV9zeXNfc2lnbmFsX2h3X2Vycm9yKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX3N5c19tYWluOjpCVEFfc3lzX3NpZ25hbF9od19lcnJvcigpOwotfQotdm9pZCBidGFfc2V0X2ZvcndhcmRfaHdfZmFpbHVyZXMoYm9vbCB2YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX3N5c19tYWluOjpidGFfc2V0X2ZvcndhcmRfaHdfZmFpbHVyZXModmFsdWUpOwotfQotdm9pZCBidGFfc3lzX2RlcmVnaXN0ZXIodWludDhfdCBpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX3N5c19tYWluOjpidGFfc3lzX2RlcmVnaXN0ZXIoaWQpOwotfQotdm9pZCBidGFfc3lzX2Rpc2FibGUoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfc3lzX21haW46OmJ0YV9zeXNfZGlzYWJsZSgpOwotfQotdm9pZCBidGFfc3lzX2luaXQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX3N5c19tYWluOjpidGFfc3lzX2luaXQoKTsKLX0KLWJvb2wgYnRhX3N5c19pc19yZWdpc3Rlcih1aW50OF90IGlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRhX3N5c19tYWluOjpidGFfc3lzX2lzX3JlZ2lzdGVyKGlkKTsKLX0KLXZvaWQgYnRhX3N5c19yZWdpc3Rlcih1aW50OF90IGlkLCBjb25zdCB0QlRBX1NZU19SRUcqIHBfcmVnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfc3lzX21haW46OmJ0YV9zeXNfcmVnaXN0ZXIoaWQsIHBfcmVnKTsKLX0KLXZvaWQgYnRhX3N5c19zZW5kbXNnKHZvaWQqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfc3lzX21haW46OmJ0YV9zeXNfc2VuZG1zZyhwX21zZyk7Ci19Ci12b2lkIGJ0YV9zeXNfc2VuZG1zZ19kZWxheWVkKHZvaWQqIHBfbXNnLCBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGRlbGF5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGFfc3lzX21haW46OmJ0YV9zeXNfc2VuZG1zZ19kZWxheWVkKHBfbXNnLCBkZWxheSk7Ci19Ci12b2lkIGJ0YV9zeXNfc3RhcnRfdGltZXIoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXllcl9zcGVjaWZpYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRhX3N5c19tYWluOjpidGFfc3lzX3N0YXJ0X3RpbWVyKGFsYXJtLCBpbnRlcnZhbF9tcywgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9zcGVjaWZpYyk7Ci19Ci0vLyBNb2NrZWQgZnVuY3Rpb25zIGNvbXBsZXRlCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX3N5c19tYWluLmggYi90ZXN0L21vY2svbW9ja19idGFfc3lzX21haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhOTg1MS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfc3lzX21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTAKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzX2ludC5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIGJ0YV9zeXNfbWFpbiB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBCVEFfc3lzX3NpZ25hbF9od19lcnJvcgotLy8gUGFyYW1zOgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgQlRBX3N5c19zaWduYWxfaHdfZXJyb3IgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVEFfc3lzX3NpZ25hbF9od19lcnJvciBCVEFfc3lzX3NpZ25hbF9od19lcnJvcjsKLQotLy8gTmFtZTogYnRhX3NldF9mb3J3YXJkX2h3X2ZhaWx1cmVzCi0vLyBQYXJhbXM6IGJvb2wgdmFsdWUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9zZXRfZm9yd2FyZF9od19mYWlsdXJlcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHZhbHVlKT4gYm9keXtbXShib29sIHZhbHVlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShib29sIHZhbHVlKSB7IGJvZHkodmFsdWUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX3NldF9mb3J3YXJkX2h3X2ZhaWx1cmVzIGJ0YV9zZXRfZm9yd2FyZF9od19mYWlsdXJlczsKLQotLy8gTmFtZTogYnRhX3N5c19kZXJlZ2lzdGVyCi0vLyBQYXJhbXM6IHVpbnQ4X3QgaWQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9zeXNfZGVyZWdpc3RlciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90IGlkKT4gYm9keXtbXSh1aW50OF90IGlkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90IGlkKSB7IGJvZHkoaWQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX3N5c19kZXJlZ2lzdGVyIGJ0YV9zeXNfZGVyZWdpc3RlcjsKLQotLy8gTmFtZTogYnRhX3N5c19kaXNhYmxlCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfc3lzX2Rpc2FibGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfc3lzX2Rpc2FibGUgYnRhX3N5c19kaXNhYmxlOwotCi0vLyBOYW1lOiBidGFfc3lzX2luaXQKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX3N5c19pbml0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX3N5c19pbml0IGJ0YV9zeXNfaW5pdDsKLQotLy8gTmFtZTogYnRhX3N5c19pc19yZWdpc3RlcgotLy8gUGFyYW1zOiB1aW50OF90IGlkCi0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBidGFfc3lzX2lzX3JlZ2lzdGVyIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodWludDhfdCBpZCk+IGJvZHl7Ci0gICAgICBbdGhpc10odWludDhfdCBpZCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQ4X3QgaWQpIHsgcmV0dXJuIGJvZHkoaWQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX3N5c19pc19yZWdpc3RlciBidGFfc3lzX2lzX3JlZ2lzdGVyOwotCi0vLyBOYW1lOiBidGFfc3lzX3JlZ2lzdGVyCi0vLyBQYXJhbXM6IHVpbnQ4X3QgaWQsIGNvbnN0IHRCVEFfU1lTX1JFRyogcF9yZWcKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGJ0YV9zeXNfcmVnaXN0ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCBpZCwgY29uc3QgdEJUQV9TWVNfUkVHKiBwX3JlZyk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90IGlkLCBjb25zdCB0QlRBX1NZU19SRUcqIHBfcmVnKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90IGlkLCBjb25zdCB0QlRBX1NZU19SRUcqIHBfcmVnKSB7IGJvZHkoaWQsIHBfcmVnKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9zeXNfcmVnaXN0ZXIgYnRhX3N5c19yZWdpc3RlcjsKLQotLy8gTmFtZTogYnRhX3N5c19zZW5kbXNnCi0vLyBQYXJhbXM6IHZvaWQqIHBfbXNnCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfc3lzX3NlbmRtc2cgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCogcF9tc2cpPiBib2R5e1tdKHZvaWQqIHBfbXNnKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwX21zZykgeyBib2R5KHBfbXNnKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9zeXNfc2VuZG1zZyBidGFfc3lzX3NlbmRtc2c7Ci0KLS8vIE5hbWU6IGJ0YV9zeXNfc2VuZG1zZ19kZWxheWVkCi0vLyBQYXJhbXM6IHZvaWQqIHBfbXNnLCBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGRlbGF5Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBidGFfc3lzX3NlbmRtc2dfZGVsYXllZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKiBwX21zZywgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkZWxheSk+IGJvZHl7Ci0gICAgICBbXSh2b2lkKiBwX21zZywgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkZWxheSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCogcF9tc2csIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZGVsYXkpIHsKLSAgICBib2R5KHBfbXNnLCBkZWxheSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfc3lzX3NlbmRtc2dfZGVsYXllZCBidGFfc3lzX3NlbmRtc2dfZGVsYXllZDsKLQotLy8gTmFtZTogYnRhX3N5c19zdGFydF90aW1lcgotLy8gUGFyYW1zOiBhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIHVpbnQxNl90IGV2ZW50LCB1aW50MTZfdAotLy8gbGF5ZXJfc3BlY2lmaWMgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYnRhX3N5c19zdGFydF90aW1lciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF5ZXJfc3BlY2lmaWMpPgotICAgICAgYm9keXtbXShhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIHVpbnQxNl90IGV2ZW50LAotICAgICAgICAgICAgICB1aW50MTZfdCBsYXllcl9zcGVjaWZpYykge319OwotICB2b2lkIG9wZXJhdG9yKCkoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxheWVyX3NwZWNpZmljKSB7Ci0gICAgYm9keShhbGFybSwgaW50ZXJ2YWxfbXMsIGV2ZW50LCBsYXllcl9zcGVjaWZpYyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfc3lzX3N0YXJ0X3RpbWVyIGJ0YV9zeXNfc3RhcnRfdGltZXI7Ci0KLX0gIC8vIG5hbWVzcGFjZSBidGFfc3lzX21haW4KLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX3N5c191dGwuY2MgYi90ZXN0L21vY2svbW9ja19idGFfc3lzX3V0bC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ZGFjMi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfc3lzX3V0bC5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo3Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvdXRsLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIHV0bF9pc2RpYWxjaGFyKGNvbnN0IGNoYXIgZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCB1dGxfaXNkaWFsc3RyKGNvbnN0IGNoYXIqIHBfcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCB1dGxfaXNpbnRzdHIoY29uc3QgY2hhciogcF9zKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIHV0bF9zZXRfZGV2aWNlX2NsYXNzKHRCVEFfVVRMX0NPRCogcF9jb2QsIHVpbnQ4X3QgY21kKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1pbnQgdXRsX3N0cnVjbXAoY29uc3QgY2hhciogcF9zLCBjb25zdCBjaGFyKiBwX3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50MTZfdCB1dGxfc3RyMmludChjb25zdCBjaGFyKiBwX3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCB1dGxfaXRvYSh1aW50MTZfdCBpLCBjaGFyKiBwX3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRhX3ZjLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX3ZjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDllNjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0YV92Yy5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo3Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfdmMuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJiaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfZ2F0dF9xdWV1ZS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV92Y19hcGkuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXZvaWQgVm9sdW1lQ29udHJvbDo6QWRkRnJvbVN0b3JhZ2UoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvX2Nvbm5lY3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIFZvbHVtZUNvbnRyb2w6OkNsZWFuVXAoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIFZvbHVtZUNvbnRyb2w6OkRlYnVnRHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLVZvbHVtZUNvbnRyb2wqIFZvbHVtZUNvbnRyb2w6OkdldCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWJvb2wgVm9sdW1lQ29udHJvbDo6SXNWb2x1bWVDb250cm9sUnVubmluZygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgVm9sdW1lQ29udHJvbDo6SW5pdGlhbGl6ZSgKLSAgICBibHVldG9vdGg6OnZjOjpWb2x1bWVDb250cm9sQ2FsbGJhY2tzKiBjYWxsYmFja3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGFfdmNfZGV2aWNlLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRhX3ZjX2RldmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0NTdjYy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGFfdmNfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEyCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYnRhL3ZjL2RldmljZXMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOjp2Yzo6aW50ZXJuYWw7Ci0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIFZvbHVtZUNvbnRyb2xEZXZpY2U6OkVuYWJsZUVuY3J5cHRpb24odEJUTV9TRUNfQ0FMTEJBQ0sqIGNhbGxiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFZvbHVtZUNvbnRyb2xEZXZpY2U6OkVucXVldWVJbml0aWFsUmVxdWVzdHMoCi0gICAgdEdBVFRfSUYgZ2F0dF9pZiwgR0FUVF9SRUFEX09QX0NCIGNocmNfcmVhZF9jYiwKLSAgICBHQVRUX1dSSVRFX09QX0NCIGNjY2Rfd3JpdGVfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgVm9sdW1lQ29udHJvbERldmljZTo6SXNFbmNyeXB0aW9uRW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgVm9sdW1lQ29udHJvbERldmljZTo6VXBkYXRlSGFuZGxlcyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFZvbHVtZUNvbnRyb2xEZXZpY2U6OlZlcmlmeVJlYWR5KHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBWb2x1bWVDb250cm9sRGV2aWNlOjpzZXRfdm9sdW1lX2NvbnRyb2xfc2VydmljZV9oYW5kbGVzKAotICAgIGNvbnN0IGdhdHQ6OlNlcnZpY2UmIHNlcnZpY2UpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgVm9sdW1lQ29udHJvbERldmljZTo6c3Vic2NyaWJlX2Zvcl9ub3RpZmljYXRpb25zKHRHQVRUX0lGIGdhdHRfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjY2NfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FUVF9XUklURV9PUF9DQiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdWludDE2X3QgVm9sdW1lQ29udHJvbERldmljZTo6ZmluZF9jY2NfaGFuZGxlKHVpbnQxNl90IGNocmNfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgVm9sdW1lQ29udHJvbERldmljZTo6Q29udHJvbFBvaW50T3BlcmF0aW9uKHVpbnQ4X3Qgb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBWb2x1bWVDb250cm9sRGV2aWNlOjpEaXNjb25uZWN0KHRHQVRUX0lGIGdhdHRfaWYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIFZvbHVtZUNvbnRyb2xEZXZpY2U6OkVucXVldWVSZW1haW5pbmdSZXF1ZXN0cygKLSAgICB0R0FUVF9JRiBnYXR0X2lmLCBHQVRUX1JFQURfT1BfQ0IgY2hyY19yZWFkX2NiLAotICAgIEdBVFRfV1JJVEVfT1BfQ0IgY2NjZF93cml0ZV9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgVm9sdW1lQ29udHJvbERldmljZTo6UmVzZXRIYW5kbGVzKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGNvcmVfbW9kdWxlLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRjb3JlX21vZHVsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1M2I3YS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGNvcmVfbW9kdWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjcKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX2J0Y29yZV9tb2R1bGUuaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRjb3JlX21vZHVsZSB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGdldF9tb2R1bGUgZ2V0X21vZHVsZTsKLXN0cnVjdCBtb2R1bGVfY2xlYW5fdXAgbW9kdWxlX2NsZWFuX3VwOwotc3RydWN0IG1vZHVsZV9pbml0IG1vZHVsZV9pbml0Owotc3RydWN0IG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0IG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0Owotc3RydWN0IG1vZHVsZV9tYW5hZ2VtZW50X3N0b3AgbW9kdWxlX21hbmFnZW1lbnRfc3RvcDsKLXN0cnVjdCBtb2R1bGVfc2h1dF9kb3duIG1vZHVsZV9zaHV0X2Rvd247Ci1zdHJ1Y3QgbW9kdWxlX3N0YXJ0X3VwIG1vZHVsZV9zdGFydF91cDsKLQotfSAgLy8gbmFtZXNwYWNlIGJ0Y29yZV9tb2R1bGUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLWNvbnN0IG1vZHVsZV90KiBnZXRfbW9kdWxlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGNvcmVfbW9kdWxlOjpnZXRfbW9kdWxlKG5hbWUpOwotfQotdm9pZCBtb2R1bGVfY2xlYW5fdXAoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRjb3JlX21vZHVsZTo6bW9kdWxlX2NsZWFuX3VwKG1vZHVsZSk7Ci19Ci1ib29sIG1vZHVsZV9pbml0KGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGNvcmVfbW9kdWxlOjptb2R1bGVfaW5pdChtb2R1bGUpOwotfQotdm9pZCBtb2R1bGVfbWFuYWdlbWVudF9zdGFydCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGNvcmVfbW9kdWxlOjptb2R1bGVfbWFuYWdlbWVudF9zdGFydCgpOwotfQotdm9pZCBtb2R1bGVfbWFuYWdlbWVudF9zdG9wKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OmJ0Y29yZV9tb2R1bGU6Om1vZHVsZV9tYW5hZ2VtZW50X3N0b3AoKTsKLX0KLXZvaWQgbW9kdWxlX3NodXRfZG93bihjb25zdCBtb2R1bGVfdCogbW9kdWxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGNvcmVfbW9kdWxlOjptb2R1bGVfc2h1dF9kb3duKG1vZHVsZSk7Ci19Ci1ib29sIG1vZHVsZV9zdGFydF91cChjb25zdCBtb2R1bGVfdCogbW9kdWxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRjb3JlX21vZHVsZTo6bW9kdWxlX3N0YXJ0X3VwKG1vZHVsZSk7Ci19Ci0vLyBNb2NrZWQgZnVuY3Rpb25zIGNvbXBsZXRlCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRjb3JlX21vZHVsZS5oIGIvdGVzdC9tb2NrL21vY2tfYnRjb3JlX21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWJiYjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0Y29yZV9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NwotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgZnJvbSAob3IgYWRkIHRvICkgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBidGNvcmVfbW9kdWxlIHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IGdldF9tb2R1bGUKLS8vIFBhcmFtczogY29uc3QgY2hhciogbmFtZQotLy8gUmV0dXJuOiBjb25zdCBtb2R1bGVfdCoKLXN0cnVjdCBnZXRfbW9kdWxlIHsKLSAgY29uc3QgbW9kdWxlX3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxjb25zdCBtb2R1bGVfdCooY29uc3QgY2hhciogbmFtZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgY29uc3QgbW9kdWxlX3QqIG9wZXJhdG9yKCkoY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gYm9keShuYW1lKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGdldF9tb2R1bGUgZ2V0X21vZHVsZTsKLQotLy8gTmFtZTogbW9kdWxlX2NsZWFuX3VwCi0vLyBQYXJhbXM6IGNvbnN0IG1vZHVsZV90KiBtb2R1bGUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IG1vZHVsZV9jbGVhbl91cCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBtb2R1bGVfdCogbW9kdWxlKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpIHsgYm9keShtb2R1bGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlX2NsZWFuX3VwIG1vZHVsZV9jbGVhbl91cDsKLQotLy8gTmFtZTogbW9kdWxlX2luaXQKLS8vIFBhcmFtczogY29uc3QgbW9kdWxlX3QqIG1vZHVsZQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgbW9kdWxlX2luaXQgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBtb2R1bGVfdCogbW9kdWxlKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBtb2R1bGVfdCogbW9kdWxlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkgeyByZXR1cm4gYm9keShtb2R1bGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlX2luaXQgbW9kdWxlX2luaXQ7Ci0KLS8vIE5hbWU6IG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IG1vZHVsZV9tYW5hZ2VtZW50X3N0YXJ0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlX21hbmFnZW1lbnRfc3RhcnQgbW9kdWxlX21hbmFnZW1lbnRfc3RhcnQ7Ci0KLS8vIE5hbWU6IG1vZHVsZV9tYW5hZ2VtZW50X3N0b3AKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgbW9kdWxlX21hbmFnZW1lbnRfc3RvcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IG1vZHVsZV9tYW5hZ2VtZW50X3N0b3AgbW9kdWxlX21hbmFnZW1lbnRfc3RvcDsKLQotLy8gTmFtZTogbW9kdWxlX3NodXRfZG93bgotLy8gUGFyYW1zOiBjb25zdCBtb2R1bGVfdCogbW9kdWxlCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBtb2R1bGVfc2h1dF9kb3duIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IG1vZHVsZV90KiBtb2R1bGUpPiBib2R5ewotICAgICAgW10oY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkgeyBib2R5KG1vZHVsZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBtb2R1bGVfc2h1dF9kb3duIG1vZHVsZV9zaHV0X2Rvd247Ci0KLS8vIE5hbWU6IG1vZHVsZV9zdGFydF91cAotLy8gUGFyYW1zOiBjb25zdCBtb2R1bGVfdCogbW9kdWxlCi0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBtb2R1bGVfc3RhcnRfdXAgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBtb2R1bGVfdCogbW9kdWxlKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBtb2R1bGVfdCogbW9kdWxlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgbW9kdWxlX3QqIG1vZHVsZSkgeyByZXR1cm4gYm9keShtb2R1bGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlX3N0YXJ0X3VwIG1vZHVsZV9zdGFydF91cDsKLQotfSAgLy8gbmFtZXNwYWNlIGJ0Y29yZV9tb2R1bGUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfYmx1ZXRvb3RoLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRpZl9ibHVldG9vdGguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTFmYWYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRpZl9ibHVldG9vdGguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE3Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIuMQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19idGlmX2JsdWV0b290aC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRpZl9ibHVldG9vdGggewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBpc19hdHZfZGV2aWNlIGlzX2F0dl9kZXZpY2U7Ci1zdHJ1Y3QgaXNfY29tbW9uX2NyaXRlcmlhX21vZGUgaXNfY29tbW9uX2NyaXRlcmlhX21vZGU7Ci1zdHJ1Y3QgaXNfcmVzdHJpY3RlZF9tb2RlIGlzX3Jlc3RyaWN0ZWRfbW9kZTsKLXN0cnVjdCBkdXRfbW9kZV9jb25maWd1cmUgZHV0X21vZGVfY29uZmlndXJlOwotc3RydWN0IGR1dF9tb2RlX3NlbmQgZHV0X21vZGVfc2VuZDsKLXN0cnVjdCBnZXRfY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdAotICAgIGdldF9jb21tb25fY3JpdGVyaWFfY29uZmlnX2NvbXBhcmVfcmVzdWx0Owotc3RydWN0IGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllczsKLXN0cnVjdCBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eTsKLXN0cnVjdCBnZXRfcmVtb3RlX3NlcnZpY2VzIGdldF9yZW1vdGVfc2VydmljZXM7Ci1zdHJ1Y3QgbGVfdGVzdF9tb2RlIGxlX3Rlc3RfbW9kZTsKLXN0cnVjdCBzZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSBzZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eTsKLXN0cnVjdCBzZXRfaGFsX2NiYWNrcyBzZXRfaGFsX2NiYWNrczsKLQotfSAgLy8gbmFtZXNwYWNlIGJ0aWZfYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci1ib29sIGlzX2F0dl9kZXZpY2UoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OmlzX2F0dl9kZXZpY2UoKTsKLX0KLWJvb2wgaXNfY29tbW9uX2NyaXRlcmlhX21vZGUoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OmlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlKCk7Ci19Ci1ib29sIGlzX3Jlc3RyaWN0ZWRfbW9kZSgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2JsdWV0b290aDo6aXNfcmVzdHJpY3RlZF9tb2RlKCk7Ci19Ci1pbnQgZHV0X21vZGVfY29uZmlndXJlKHVpbnQ4X3QgZW5hYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OmR1dF9tb2RlX2NvbmZpZ3VyZShlbmFibGUpOwotfQotaW50IGR1dF9tb2RlX3NlbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OmR1dF9tb2RlX3NlbmQob3Bjb2RlLCBidWYsIGxlbik7Ci19Ci1pbnQgZ2V0X2NvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OgotICAgICAgZ2V0X2NvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQoKTsKLX0KLWludCBnZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OmdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMocmVtb3RlX2FkZHIpOwotfQotaW50IGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9ibHVldG9vdGg6OmdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwotfQotaW50IGdldF9yZW1vdGVfc2VydmljZXMoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2JsdWV0b290aDo6Z2V0X3JlbW90ZV9zZXJ2aWNlcyhyZW1vdGVfYWRkcik7Ci19Ci1pbnQgbGVfdGVzdF9tb2RlKHVpbnQxNl90IG9wY29kZSwgdWludDhfdCogYnVmLCB1aW50OF90IGxlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfYmx1ZXRvb3RoOjpsZV90ZXN0X21vZGUob3Bjb2RlLCBidWYsIGxlbik7Ci19Ci1pbnQgc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2JsdWV0b290aDo6c2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkocmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotfQotdm9pZCBzZXRfaGFsX2NiYWNrcyhidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGlmX2JsdWV0b290aDo6c2V0X2hhbF9jYmFja3MoY2FsbGJhY2tzKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfYmx1ZXRvb3RoLmggYi90ZXN0L21vY2svbW9ja19idGlmX2JsdWV0b290aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTJjZjdhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfYmx1ZXRvb3RoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE3Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIuMQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGhfaGVhZHNldF9pbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9hdi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2dhdHQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9oZC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X2hlYXJpbmdfYWlkLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGZfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfaGguaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9idF9sZV9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3Bhbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3JjLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc2RwLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfc29jay5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3ZjLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZWFyaW5nX2FpZF9hcGkuaCIKLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvYXZyY3AvYXZyY3Bfc2VydmljZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2EyZHAuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2FwaS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2F2LmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYnFyLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfZGVidWcuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9kZWJ1Z19jb25uLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfaGYuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9rZXlzdG9yZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX21ldHJpY3NfbG9nZ2luZy5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvc3RhY2tfbWFuYWdlci5oIgotI2luY2x1ZGUgImNvbW1vbi9hZGRyZXNzX29iZnVzY2F0b3IuaCIKLSNpbmNsdWRlICJjb21tb24vbWV0cmljX2lkX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNzLmgiCi0jaW5jbHVkZSAiY29tbW9uL29zX3V0aWxzLmgiCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxhcm0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS93YWtlbG9jay5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hdmR0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBidGlmX2JsdWV0b290aCB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBpc19hdHZfZGV2aWNlCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgaXNfYXR2X2RldmljZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBib2R5e1tdKCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBpc19hdHZfZGV2aWNlIGlzX2F0dl9kZXZpY2U7Ci0vLyBOYW1lOiBpc19jb21tb25fY3JpdGVyaWFfbW9kZQotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKCk+IGJvZHl7W10oKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlIGlzX2NvbW1vbl9jcml0ZXJpYV9tb2RlOwotLy8gTmFtZTogaXNfcmVzdHJpY3RlZF9tb2RlCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgaXNfcmVzdHJpY3RlZF9tb2RlIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKCk+IGJvZHl7W10oKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGlzX3Jlc3RyaWN0ZWRfbW9kZSBpc19yZXN0cmljdGVkX21vZGU7Ci0vLyBOYW1lOiBkdXRfbW9kZV9jb25maWd1cmUKLS8vIFBhcmFtczogdWludDhfdCBlbmFibGUKLS8vIFJldHVybnM6IGludAotc3RydWN0IGR1dF9tb2RlX2NvbmZpZ3VyZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248aW50KHVpbnQ4X3QgZW5hYmxlKT4gYm9keXtbXSh1aW50OF90IGVuYWJsZSkgeyByZXR1cm4gMDsgfX07Ci0gIGludCBvcGVyYXRvcigpKHVpbnQ4X3QgZW5hYmxlKSB7IHJldHVybiBib2R5KGVuYWJsZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBkdXRfbW9kZV9jb25maWd1cmUgZHV0X21vZGVfY29uZmlndXJlOwotLy8gTmFtZTogZHV0X21vZGVfc2VuZAotLy8gUGFyYW1zOiB1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4KLS8vIFJldHVybnM6IGludAotc3RydWN0IGR1dF9tb2RlX3NlbmQgewotICBzdGQ6OmZ1bmN0aW9uPGludCh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pPiBib2R5ewotICAgICAgW10odWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7IHJldHVybiAwOyB9fTsKLSAgaW50IG9wZXJhdG9yKCkodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gICAgcmV0dXJuIGJvZHkob3Bjb2RlLCBidWYsIGxlbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBkdXRfbW9kZV9zZW5kIGR1dF9tb2RlX3NlbmQ7Ci0vLyBOYW1lOiBnZXRfY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdAotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogaW50Ci1zdHJ1Y3QgZ2V0X2NvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQgewotICBzdGQ6OmZ1bmN0aW9uPGludCgpPiBib2R5e1tdKCkgeyByZXR1cm4gMDsgfX07Ci0gIGludCBvcGVyYXRvcigpKCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZ2V0X2NvbW1vbl9jcml0ZXJpYV9jb25maWdfY29tcGFyZV9yZXN1bHQKLSAgICBnZXRfY29tbW9uX2NyaXRlcmlhX2NvbmZpZ19jb21wYXJlX3Jlc3VsdDsKLS8vIE5hbWU6IGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMKLS8vIFBhcmFtczogUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIKLS8vIFJldHVybnM6IGludAotc3RydWN0IGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMgewotICBzdGQ6OmZ1bmN0aW9uPGludChSYXdBZGRyZXNzKiByZW1vdGVfYWRkcik+IGJvZHl7Ci0gICAgICBbXShSYXdBZGRyZXNzKiByZW1vdGVfYWRkcikgeyByZXR1cm4gMDsgfX07Ci0gIGludCBvcGVyYXRvcigpKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyKSB7IHJldHVybiBib2R5KHJlbW90ZV9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydGllczsKLS8vIE5hbWU6IGdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5Ci0vLyBQYXJhbXM6IFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLCBidF9wcm9wZXJ0eV90eXBlX3QgdHlwZQotLy8gUmV0dXJuczogaW50Ci1zdHJ1Y3QgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkgewotICBzdGQ6OmZ1bmN0aW9uPGludChSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwgYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpPiBib2R5ewotICAgICAgW10oUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsIGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7IHJldHVybiAwOyB9fTsKLSAgaW50IG9wZXJhdG9yKCkoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsIGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtb3RlX2FkZHIsIHR5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkgZ2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHk7Ci0vLyBOYW1lOiBnZXRfcmVtb3RlX3NlcnZpY2VzCi0vLyBQYXJhbXM6IFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyCi0vLyBSZXR1cm5zOiBpbnQKLXN0cnVjdCBnZXRfcmVtb3RlX3NlcnZpY2VzIHsKLSAgc3RkOjpmdW5jdGlvbjxpbnQoUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIpPiBib2R5ewotICAgICAgW10oUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIpIHsgcmV0dXJuIDA7IH19OwotICBpbnQgb3BlcmF0b3IoKShSYXdBZGRyZXNzKiByZW1vdGVfYWRkcikgeyByZXR1cm4gYm9keShyZW1vdGVfYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBnZXRfcmVtb3RlX3NlcnZpY2VzIGdldF9yZW1vdGVfc2VydmljZXM7Ci0vLyBOYW1lOiBsZV90ZXN0X21vZGUKLS8vIFBhcmFtczogdWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuCi0vLyBSZXR1cm5zOiBpbnQKLXN0cnVjdCBsZV90ZXN0X21vZGUgewotICBzdGQ6OmZ1bmN0aW9uPGludCh1aW50MTZfdCBvcGNvZGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDhfdCBsZW4pPiBib2R5ewotICAgICAgW10odWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7IHJldHVybiAwOyB9fTsKLSAgaW50IG9wZXJhdG9yKCkodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gICAgcmV0dXJuIGJvZHkob3Bjb2RlLCBidWYsIGxlbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsZV90ZXN0X21vZGUgbGVfdGVzdF9tb2RlOwotLy8gTmFtZTogc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkKLS8vIFBhcmFtczogUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsIGNvbnN0IGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5Ci0vLyBSZXR1cm5zOiBpbnQKLXN0cnVjdCBzZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eSB7Ci0gIHN0ZDo6ZnVuY3Rpb248aW50KFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLCBjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSk+Ci0gICAgICBib2R5e1tdKFJhd0FkZHJlc3MqIHJlbW90ZV9hZGRyLCBjb25zdCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH19OwotICBpbnQgb3BlcmF0b3IoKShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwgY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgICByZXR1cm4gYm9keShyZW1vdGVfYWRkciwgcHJvcGVydHkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHkgc2V0X3JlbW90ZV9kZXZpY2VfcHJvcGVydHk7Ci0vLyBOYW1lOiBzZXRfaGFsX2NiYWNrcwotLy8gUGFyYW1zOiBidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc2V0X2hhbF9jYmFja3MgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYnRfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk+IGJvZHl7Ci0gICAgICBbXShidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShidF9jYWxsYmFja3NfdCogY2FsbGJhY2tzKSB7IGJvZHkoY2FsbGJhY2tzKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNldF9oYWxfY2JhY2tzIHNldF9oYWxfY2JhY2tzOwotCi19ICAvLyBuYW1lc3BhY2UgYnRpZl9ibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRpZl9icXIuY2MgYi90ZXN0L21vY2svbW9ja19idGlmX2Jxci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4YjExNi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGlmX2Jxci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo1MQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYnFyIHsKLQotdm9pZCBEdW1wTG1wTGxNZXNzYWdlKHVpbnQ4X3QgbGVuZ3RoLCB1aW50OF90KiBwX2V2ZW50KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi12b2lkIER1bXBCdFNjaGVkdWxpbmcodWludDhfdCBsZW5ndGgsIHVpbnQ4X3QqIHBfZXZlbnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBicXIKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfYnRhX3Bhbl9jb19yeC5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0aWZfYnRhX3Bhbl9jb19yeC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1NjUzNC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGlmX2J0YV9wYW5fY29fcnguY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjcKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMi4xCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX2J0aWZfYnRhX3Bhbl9jb19yeC5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIGJ0aWZfYnRhX3Bhbl9jb19yeCB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGJ0YV9wYW5fY29faW5pdCBidGFfcGFuX2NvX2luaXQ7Ci1zdHJ1Y3QgYnRhX3Bhbl9jb19jbG9zZSBidGFfcGFuX2NvX2Nsb3NlOwotc3RydWN0IGJ0YV9wYW5fY29fbWZpbHRfaW5kIGJ0YV9wYW5fY29fbWZpbHRfaW5kOwotc3RydWN0IGJ0YV9wYW5fY29fcGZpbHRfaW5kIGJ0YV9wYW5fY29fcGZpbHRfaW5kOwotc3RydWN0IGJ0YV9wYW5fY29fcnhfZmxvdyBidGFfcGFuX2NvX3J4X2Zsb3c7Ci1zdHJ1Y3QgYnRhX3Bhbl9jb19yeF9wYXRoIGJ0YV9wYW5fY29fcnhfcGF0aDsKLXN0cnVjdCBidGFfcGFuX2NvX3R4X3BhdGggYnRhX3Bhbl9jb190eF9wYXRoOwotCi19ICAvLyBuYW1lc3BhY2UgYnRpZl9idGFfcGFuX2NvX3J4Ci19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci11aW50OF90IGJ0YV9wYW5fY29faW5pdCh1aW50OF90KiBxX2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9idGFfcGFuX2NvX3J4OjpidGFfcGFuX2NvX2luaXQocV9sZXZlbCk7Ci19Ci12b2lkIGJ0YV9wYW5fY29fY2xvc2UodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRpZl9idGFfcGFuX2NvX3J4OjpidGFfcGFuX2NvX2Nsb3NlKGhhbmRsZSwgYXBwX2lkKTsKLX0KLXZvaWQgYnRhX3Bhbl9jb19tZmlsdF9pbmQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9maWx0ZXJzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGlmX2J0YV9wYW5fY29fcng6OmJ0YV9wYW5fY29fbWZpbHRfaW5kKGhhbmRsZSwgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIGxlbiwgcF9maWx0ZXJzKTsKLX0KLXZvaWQgYnRhX3Bhbl9jb19wZmlsdF9pbmQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9maWx0ZXJzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGlmX2J0YV9wYW5fY29fcng6OmJ0YV9wYW5fY29fcGZpbHRfaW5kKGhhbmRsZSwgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIGxlbiwgcF9maWx0ZXJzKTsKLX0KLXZvaWQgYnRhX3Bhbl9jb19yeF9mbG93KFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGVuYWJsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRpZl9idGFfcGFuX2NvX3J4OjpidGFfcGFuX2NvX3J4X2Zsb3coaGFuZGxlLCBhcHBfaWQsIGVuYWJsZSk7Ci19Ci12b2lkIGJ0YV9wYW5fY29fcnhfcGF0aChVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRpZl9idGFfcGFuX2NvX3J4OjpidGFfcGFuX2NvX3J4X3BhdGgoaGFuZGxlLCBhcHBfaWQpOwotfQotdm9pZCBidGFfcGFuX2NvX3R4X3BhdGgodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRpZl9idGFfcGFuX2NvX3J4OjpidGFfcGFuX2NvX3R4X3BhdGgoaGFuZGxlLCBhcHBfaWQpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRpZl9idGFfcGFuX2NvX3J4LmggYi90ZXN0L21vY2svbW9ja19idGlmX2J0YV9wYW5fY29fcnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNTViNy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGlmX2J0YV9wYW5fY29fcnguaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NwotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yLjEKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfcGFuLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfcGFuX2FwaS5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBidGlmX2J0YV9wYW5fY29fcnggewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogYnRhX3Bhbl9jb19pbml0Ci0vLyBQYXJhbXM6IHVpbnQ4X3QqIHFfbGV2ZWwKLS8vIFJldHVybnM6IHVpbnQ4X3QKLXN0cnVjdCBidGFfcGFuX2NvX2luaXQgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDhfdCogcV9sZXZlbCk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90KiBxX2xldmVsKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQ4X3QqIHFfbGV2ZWwpIHsgcmV0dXJuIGJvZHkocV9sZXZlbCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfcGFuX2NvX2luaXQgYnRhX3Bhbl9jb19pbml0OwotLy8gTmFtZTogYnRhX3Bhbl9jb19jbG9zZQotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgYXBwX2lkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRhX3Bhbl9jb19jbG9zZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgYXBwX2lkKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsgYm9keShoYW5kbGUsIGFwcF9pZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfcGFuX2NvX2Nsb3NlIGJ0YV9wYW5fY29fY2xvc2U7Ci0vLyBOYW1lOiBidGFfcGFuX2NvX21maWx0X2luZAotLy8gUGFyYW1zOiBVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsIFVOVVNFRF9BVFRSIGJvb2wgaW5kaWNhdGlvbiwgVU5VU0VEX0FUVFIKLS8vIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwgVU5VU0VEX0FUVFIgdWludDhfdCoKLS8vIHBfZmlsdGVycyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRhX3Bhbl9jb19tZmlsdF9pbmQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLCBVTlVTRURfQVRUUiBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QlRBX1BBTl9TVEFUVVMgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuLCBVTlVTRURfQVRUUiB1aW50OF90KiBwX2ZpbHRlcnMpPgotICAgICAgYm9keXtbXShVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsIFVOVVNFRF9BVFRSIGJvb2wgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUQV9QQU5fU1RBVFVTIHJlc3VsdCwgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90KiBwX2ZpbHRlcnMpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUQV9QQU5fU1RBVFVTIHJlc3VsdCwgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9maWx0ZXJzKSB7Ci0gICAgYm9keShoYW5kbGUsIGluZGljYXRpb24sIHJlc3VsdCwgbGVuLCBwX2ZpbHRlcnMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX3Bhbl9jb19tZmlsdF9pbmQgYnRhX3Bhbl9jb19tZmlsdF9pbmQ7Ci0vLyBOYW1lOiBidGFfcGFuX2NvX3BmaWx0X2luZAotLy8gUGFyYW1zOiBVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsIFVOVVNFRF9BVFRSIGJvb2wgaW5kaWNhdGlvbiwgVU5VU0VEX0FUVFIKLS8vIHRCVEFfUEFOX1NUQVRVUyByZXN1bHQsIFVOVVNFRF9BVFRSIHVpbnQxNl90IGxlbiwgVU5VU0VEX0FUVFIgdWludDhfdCoKLS8vIHBfZmlsdGVycyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRhX3Bhbl9jb19wZmlsdF9pbmQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLCBVTlVTRURfQVRUUiBib29sIGluZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QlRBX1BBTl9TVEFUVVMgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuLCBVTlVTRURfQVRUUiB1aW50OF90KiBwX2ZpbHRlcnMpPgotICAgICAgYm9keXtbXShVTlVTRURfQVRUUiB1aW50MTZfdCBoYW5kbGUsIFVOVVNFRF9BVFRSIGJvb2wgaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUQV9QQU5fU1RBVFVTIHJlc3VsdCwgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90KiBwX2ZpbHRlcnMpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgYm9vbCBpbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdEJUQV9QQU5fU1RBVFVTIHJlc3VsdCwgVU5VU0VEX0FUVFIgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCogcF9maWx0ZXJzKSB7Ci0gICAgYm9keShoYW5kbGUsIGluZGljYXRpb24sIHJlc3VsdCwgbGVuLCBwX2ZpbHRlcnMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRhX3Bhbl9jb19wZmlsdF9pbmQgYnRhX3Bhbl9jb19wZmlsdF9pbmQ7Ci0vLyBOYW1lOiBidGFfcGFuX2NvX3J4X2Zsb3cKLS8vIFBhcmFtczogVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLCBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCwgVU5VU0VEX0FUVFIKLS8vIGJvb2wgZW5hYmxlIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidGFfcGFuX2NvX3J4X2Zsb3cgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLCBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIGJvb2wgZW5hYmxlKT4KLSAgICAgIGJvZHl7W10oVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLCBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCwKLSAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgYm9vbCBlbmFibGUpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiBib29sIGVuYWJsZSkgewotICAgIGJvZHkoaGFuZGxlLCBhcHBfaWQsIGVuYWJsZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfcGFuX2NvX3J4X2Zsb3cgYnRhX3Bhbl9jb19yeF9mbG93OwotLy8gTmFtZTogYnRhX3Bhbl9jb19yeF9wYXRoCi0vLyBQYXJhbXM6IFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidGFfcGFuX2NvX3J4X3BhdGggewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVU5VU0VEX0FUVFIgdWludDE2X3QgaGFuZGxlLCBVTlVTRURfQVRUUiB1aW50OF90IGFwcF9pZCk+Ci0gICAgICBib2R5e1tdKFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKFVOVVNFRF9BVFRSIHVpbnQxNl90IGhhbmRsZSwgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQpIHsKLSAgICBib2R5KGhhbmRsZSwgYXBwX2lkKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0YV9wYW5fY29fcnhfcGF0aCBidGFfcGFuX2NvX3J4X3BhdGg7Ci0vLyBOYW1lOiBidGFfcGFuX2NvX3R4X3BhdGgKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGFwcF9pZAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0YV9wYW5fY29fdHhfcGF0aCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgYXBwX2lkKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBhcHBfaWQpIHsgYm9keShoYW5kbGUsIGFwcF9pZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGFfcGFuX2NvX3R4X3BhdGggYnRhX3Bhbl9jb190eF9wYXRoOwotCi19ICAvLyBuYW1lc3BhY2UgYnRpZl9idGFfcGFuX2NvX3J4Ci19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfY29fYnRhX2RtX2NvLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRpZl9jb19idGFfZG1fY28uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDQyOTYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRpZl9jb19idGFfZG1fY28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJidGEvaW5jbHVkZS9idGFfYXBpLmgiCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWxfaW5jbHVkZS9idGVfYXBwbC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgLy8gVU5VU0VEX0FUVFIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLQotdEJURV9BUFBMX0NGRyBidGVfYXBwbF9jZmcgPSB7Ci0gICAgQlRBX0xFX0FVVEhfUkVRX1NDX01JVE1fQk9ORCwgIC8vIEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVtZW50cwotICAgIEJUTV9JT19DQVBfVU5LTk9XTiwgQlRNX0JMRV9JTklUSUFUT1JfS0VZX1NJWkUsIEJUTV9CTEVfUkVTUE9OREVSX0tFWV9TSVpFLAotICAgIEJUTV9CTEVfTUFYX0tFWV9TSVpFfTsKLQotYm9vbCBidGFfZG1fY29fZ2V0X2NvbXByZXNzX21lbW9yeShVTlVTRURfQVRUUiB0QlRBX1NZU19JRCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCoqIG1lbW9yeV9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MzJfdCogbWVtb3J5X3NpemUpIHsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGlmX2NvX2J0YV9oaF9jby5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0aWZfY29fYnRhX2hoX2NvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIxYzJlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfY29fYnRhX2hoX2NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEyCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2hoX2FwaS5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oaF9jby5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2hoLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWludCBidGFfaGhfY29fd3JpdGUoaW50IGZkLCB1aW50OF90KiBycHQsIHVpbnQxNl90IGxlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QlRBX0hIX1JQVF9DQUNIRV9FTlRSWSogYnRhX2hoX2xlX2NvX2NhY2hlX2xvYWQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX251bV9ycHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCBidGFfaGhfY29fY2xvc2UodWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IGFwcF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX2hoX2NvX2RhdGEodWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90KiBwX3JwdCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX1BST1RPX01PREUgbW9kZSwgdWludDhfdCBzdWJfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY3RyeV9jb2RlLCBVTlVTRURfQVRUUiBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfaGhfY29fZGVzdHJveShpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRhX2hoX2NvX2dldF9ycHRfcnNwKHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCBzdGF0dXMsIHVpbnQ4X3QqIHBfcnB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfaGhfY29fb3Blbih1aW50OF90IGRldl9oYW5kbGUsIHVpbnQ4X3Qgc3ViX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICB0QlRBX0hIX0FUVFJfTUFTSyBhdHRyX21hc2ssIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfaGhfY29fc2VuZF9oaWRfaW5mbyhidGlmX2hoX2RldmljZV90KiBwX2RldiwgY29uc3QgY2hhciogZGV2X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZlbmRvcl9pZCwgdWludDE2X3QgcHJvZHVjdF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdmVyc2lvbiwgdWludDhfdCBjdHJ5X2NvZGUsIGludCBkc2NwX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kc2NwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfaGhfY29fc2V0X3JwdF9yc3AodWludDhfdCBkZXZfaGFuZGxlLCB1aW50OF90IHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRhX2hoX2xlX2NvX3Jlc2V0X3JwdF9jYWNoZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGFfaGhfbGVfY29fcnB0X2luZm8oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfSEhfUlBUX0NBQ0hFX0VOVFJZKiBwX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDhfdCBhcHBfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIHVoaWRfc2V0X25vbl9ibG9ja2luZyhpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfY29uZmlnLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRpZl9jb25maWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDg2YWQuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRpZl9jb25maWcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE4Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX2J0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBidGlmX2NvbmZpZyB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGJ0aWZfZ2V0X2RldmljZV90eXBlIGJ0aWZfZ2V0X2RldmljZV90eXBlOwotc3RydWN0IGJ0aWZfZ2V0X2FkZHJlc3NfdHlwZSBidGlmX2dldF9hZGRyZXNzX3R5cGU7Ci1zdHJ1Y3QgYnRpZl9jb25maWdfZXhpc3QgYnRpZl9jb25maWdfZXhpc3Q7Ci1zdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X2ludCBidGlmX2NvbmZpZ19nZXRfaW50Owotc3RydWN0IGJ0aWZfY29uZmlnX3NldF9pbnQgYnRpZl9jb25maWdfc2V0X2ludDsKLXN0cnVjdCBidGlmX2NvbmZpZ19nZXRfdWludDY0IGJ0aWZfY29uZmlnX2dldF91aW50NjQ7Ci1zdHJ1Y3QgYnRpZl9jb25maWdfc2V0X3VpbnQ2NCBidGlmX2NvbmZpZ19zZXRfdWludDY0Owotc3RydWN0IGJ0aWZfY29uZmlnX2dldF9zdHIgYnRpZl9jb25maWdfZ2V0X3N0cjsKLXN0cnVjdCBidGlmX2NvbmZpZ19zZXRfc3RyIGJ0aWZfY29uZmlnX3NldF9zdHI7Ci1zdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X2JpbiBidGlmX2NvbmZpZ19nZXRfYmluOwotc3RydWN0IGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoIGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoOwotc3RydWN0IGJ0aWZfY29uZmlnX3NldF9iaW4gYnRpZl9jb25maWdfc2V0X2JpbjsKLXN0cnVjdCBidGlmX2NvbmZpZ19nZXRfcGFpcmVkX2RldmljZXMgYnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzOwotc3RydWN0IGJ0aWZfY29uZmlnX3JlbW92ZSBidGlmX2NvbmZpZ19yZW1vdmU7Ci1zdHJ1Y3QgYnRpZl9jb25maWdfc2F2ZSBidGlmX2NvbmZpZ19zYXZlOwotc3RydWN0IGJ0aWZfY29uZmlnX2ZsdXNoIGJ0aWZfY29uZmlnX2ZsdXNoOwotc3RydWN0IGJ0aWZfY29uZmlnX2NsZWFyIGJ0aWZfY29uZmlnX2NsZWFyOwotc3RydWN0IGJ0aWZfZGVidWdfY29uZmlnX2R1bXAgYnRpZl9kZWJ1Z19jb25maWdfZHVtcDsKLQotfSAgLy8gbmFtZXNwYWNlIGJ0aWZfY29uZmlnCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci1ib29sIGJ0aWZfZ2V0X2RldmljZV90eXBlKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgaW50KiBwX2RldmljZV90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9jb25maWc6OmJ0aWZfZ2V0X2RldmljZV90eXBlKGJkYSwgcF9kZXZpY2VfdHlwZSk7Ci19Ci1ib29sIGJ0aWZfZ2V0X2FkZHJlc3NfdHlwZShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2dldF9hZGRyZXNzX3R5cGUoYmRhLCBwX2FkZHJfdHlwZSk7Ci19Ci1ib29sIGJ0aWZfY29uZmlnX2V4aXN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9jb25maWc6OmJ0aWZfY29uZmlnX2V4aXN0KHNlY3Rpb24sIGtleSk7Ci19Ci1ib29sIGJ0aWZfY29uZmlnX2dldF9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB2YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2NvbmZpZ19nZXRfaW50KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotfQotYm9vbCBidGlmX2NvbmZpZ19zZXRfaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2NvbmZpZ19zZXRfaW50KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotfQotYm9vbCBidGlmX2NvbmZpZ19nZXRfdWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB2YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2NvbmZpZ19nZXRfdWludDY0KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotfQotYm9vbCBidGlmX2NvbmZpZ19zZXRfdWludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9jb25maWc6OmJ0aWZfY29uZmlnX3NldF91aW50NjQoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci19Ci1ib29sIGJ0aWZfY29uZmlnX2dldF9zdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogdmFsdWUsIGludCogc2l6ZV9ieXRlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2NvbmZpZ19nZXRfc3RyKHNlY3Rpb24sIGtleSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2J5dGVzKTsKLX0KLWJvb2wgYnRpZl9jb25maWdfc2V0X3N0cihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2NvbmZpZzo6YnRpZl9jb25maWdfc2V0X3N0cihzZWN0aW9uLCBrZXksIHZhbHVlKTsKLX0KLWJvb2wgYnRpZl9jb25maWdfZ2V0X2Jpbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgc2l6ZV90KiBsZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2NvbmZpZzo6YnRpZl9jb25maWdfZ2V0X2JpbihzZWN0aW9uLCBrZXksIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLX0KLXNpemVfdCBidGlmX2NvbmZpZ19nZXRfYmluX2xlbmd0aChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6YnRpZl9jb25maWc6OmJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoKHNlY3Rpb24sIGtleSk7Ci19Ci1ib29sIGJ0aWZfY29uZmlnX3NldF9iaW4oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2NvbmZpZzo6YnRpZl9jb25maWdfc2V0X2JpbihzZWN0aW9uLCBrZXksIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLX0KLXN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpidGlmX2NvbmZpZzo6YnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzKCk7Ci19Ci1ib29sIGJ0aWZfY29uZmlnX3JlbW92ZShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2NvbmZpZ19yZW1vdmUoc2VjdGlvbiwga2V5KTsKLX0KLXZvaWQgYnRpZl9jb25maWdfc2F2ZSh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGlmX2NvbmZpZzo6YnRpZl9jb25maWdfc2F2ZSgpOwotfQotdm9pZCBidGlmX2NvbmZpZ19mbHVzaCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpidGlmX2NvbmZpZzo6YnRpZl9jb25maWdfZmx1c2goKTsKLX0KLWJvb2wgYnRpZl9jb25maWdfY2xlYXIodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmJ0aWZfY29uZmlnOjpidGlmX2NvbmZpZ19jbGVhcigpOwotfQotdm9pZCBidGlmX2RlYnVnX2NvbmZpZ19kdW1wKGludCBmZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6YnRpZl9jb25maWc6OmJ0aWZfZGVidWdfY29uZmlnX2R1bXAoZmQpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRpZl9jb25maWcuaCBiL3Rlc3QvbW9jay9tb2NrX2J0aWZfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjE1YWYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRpZl9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTgKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIHRoZSBpbmNsdXNpb24gc2V0LgotCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgYnRpZl9jb25maWcgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogYnRpZl9nZXRfZGV2aWNlX3R5cGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQqIHBfZGV2aWNlX3R5cGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidGlmX2dldF9kZXZpY2VfdHlwZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCogcF9kZXZpY2VfdHlwZSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCogcF9kZXZpY2VfdHlwZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCBpbnQqIHBfZGV2aWNlX3R5cGUpIHsKLSAgICByZXR1cm4gYm9keShiZGEsIHBfZGV2aWNlX3R5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9nZXRfZGV2aWNlX3R5cGUgYnRpZl9nZXRfZGV2aWNlX3R5cGU7Ci0vLyBOYW1lOiBidGlmX2dldF9hZGRyZXNzX3R5cGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidGlmX2dldF9hZGRyZXNzX3R5cGUgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRhLCBwX2FkZHJfdHlwZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGlmX2dldF9hZGRyZXNzX3R5cGUgYnRpZl9nZXRfYWRkcmVzc190eXBlOwotLy8gTmFtZTogYnRpZl9jb25maWdfZXhpc3QKLS8vIFBhcmFtczogY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidGlmX2NvbmZpZ19leGlzdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgICByZXR1cm4gYm9keShzZWN0aW9uLCBrZXkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfZXhpc3QgYnRpZl9jb25maWdfZXhpc3Q7Ci0vLyBOYW1lOiBidGlmX2NvbmZpZ19nZXRfaW50Ci0vLyBQYXJhbXM6IGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQqIHZhbHVlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X2ludCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgIGludCogdmFsdWUpPgotICAgICAgYm9keXtbXShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50KiB2YWx1ZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgaW50KiB2YWx1ZSkgewotICAgIHJldHVybiBib2R5KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X2ludCBidGlmX2NvbmZpZ19nZXRfaW50OwotLy8gTmFtZTogYnRpZl9jb25maWdfc2V0X2ludAotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYnRpZl9jb25maWdfc2V0X2ludCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgewotICAgIHJldHVybiBib2R5KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfc2V0X2ludCBidGlmX2NvbmZpZ19zZXRfaW50OwotLy8gTmFtZTogYnRpZl9jb25maWdfZ2V0X3VpbnQ2NAotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QqIHZhbHVlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X3VpbnQ2NCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB2YWx1ZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICB1aW50NjRfdCogdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGJvZHkoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGlmX2NvbmZpZ19nZXRfdWludDY0IGJ0aWZfY29uZmlnX2dldF91aW50NjQ7Ci0vLyBOYW1lOiBidGlmX2NvbmZpZ19zZXRfdWludDY0Ci0vLyBQYXJhbXM6IGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCB1aW50NjRfdCB2YWx1ZQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0aWZfY29uZmlnX3NldF91aW50NjQgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSkgewotICAgIHJldHVybiBib2R5KHNlY3Rpb24sIGtleSwgdmFsdWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfc2V0X3VpbnQ2NCBidGlmX2NvbmZpZ19zZXRfdWludDY0OwotLy8gTmFtZTogYnRpZl9jb25maWdfZ2V0X3N0cgotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY2hhciogdmFsdWUsIGludCoKLS8vIHNpemVfYnl0ZXMgUmV0dXJuczogYm9vbAotc3RydWN0IGJ0aWZfY29uZmlnX2dldF9zdHIgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICBjaGFyKiB2YWx1ZSwgaW50KiBzaXplX2J5dGVzKT4KLSAgICAgIGJvZHl7W10oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICBpbnQqIHNpemVfYnl0ZXMpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgY2hhciogdmFsdWUsIGludCogc2l6ZV9ieXRlcykgewotICAgIHJldHVybiBib2R5KHNlY3Rpb24sIGtleSwgdmFsdWUsIHNpemVfYnl0ZXMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X3N0ciBidGlmX2NvbmZpZ19nZXRfc3RyOwotLy8gTmFtZTogYnRpZl9jb25maWdfc2V0X3N0cgotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3QKLS8vIHN0ZDo6c3RyaW5nJiB2YWx1ZSBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYnRpZl9jb25maWdfc2V0X3N0ciB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGJvZHkoc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGlmX2NvbmZpZ19zZXRfc3RyIGJ0aWZfY29uZmlnX3NldF9zdHI7Ci0vLyBOYW1lOiBidGlmX2NvbmZpZ19nZXRfYmluCi0vLyBQYXJhbXM6IGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCB1aW50OF90KiB2YWx1ZSwKLS8vIHNpemVfdCogbGVuZ3RoIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidGlmX2NvbmZpZ19nZXRfYmluIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsIHNpemVfdCogbGVuZ3RoKT4KLSAgICAgIGJvZHl7W10oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgIHVpbnQ4X3QqIHZhbHVlLCBzaXplX3QqIGxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiB2YWx1ZSwgc2l6ZV90KiBsZW5ndGgpIHsKLSAgICByZXR1cm4gYm9keShzZWN0aW9uLCBrZXksIHZhbHVlLCBsZW5ndGgpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X2JpbiBidGlmX2NvbmZpZ19nZXRfYmluOwotLy8gTmFtZTogYnRpZl9jb25maWdfZ2V0X2Jpbl9sZW5ndGgKLS8vIFBhcmFtczogY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkKLS8vIFJldHVybnM6IHNpemVfdAotc3RydWN0IGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoIHsKLSAgc3RkOjpmdW5jdGlvbjxzaXplX3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpPgotICAgICAgYm9keXsKLSAgICAgICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeyByZXR1cm4gMDsgfX07Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gICAgcmV0dXJuIGJvZHkoc2VjdGlvbiwga2V5KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoIGJ0aWZfY29uZmlnX2dldF9iaW5fbGVuZ3RoOwotLy8gTmFtZTogYnRpZl9jb25maWdfc2V0X2JpbgotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3QgdWludDhfdCoKLS8vIHZhbHVlLCBzaXplX3QgbGVuZ3RoIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidGlmX2NvbmZpZ19zZXRfYmluIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpPgotICAgICAgYm9keXtbXShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmFsdWUsIHNpemVfdCBsZW5ndGgpIHsKLSAgICByZXR1cm4gYm9keShzZWN0aW9uLCBrZXksIHZhbHVlLCBsZW5ndGgpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfc2V0X2JpbiBidGlmX2NvbmZpZ19zZXRfYmluOwotLy8gTmFtZTogYnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm5zOiBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPgotc3RydWN0IGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlcyB7Ci0gIHN0ZDo6dmVjdG9yPFJhd0FkZHJlc3M+IHJhd19hZGRyZXNzZXM7Ci0gIHN0ZDo6ZnVuY3Rpb248c3RkOjp2ZWN0b3I8UmF3QWRkcmVzcz4oKT4gYm9keXsKLSAgICAgIFt0aGlzXSgpIHsgcmV0dXJuIHJhd19hZGRyZXNzZXM7IH19OwotICBzdGQ6OnZlY3RvcjxSYXdBZGRyZXNzPiBvcGVyYXRvcigpKCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfZ2V0X3BhaXJlZF9kZXZpY2VzIGJ0aWZfY29uZmlnX2dldF9wYWlyZWRfZGV2aWNlczsKLS8vIE5hbWU6IGJ0aWZfY29uZmlnX3JlbW92ZQotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0aWZfY29uZmlnX3JlbW92ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgICByZXR1cm4gYm9keShzZWN0aW9uLCBrZXkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9jb25maWdfcmVtb3ZlIGJ0aWZfY29uZmlnX3JlbW92ZTsKLS8vIE5hbWU6IGJ0aWZfY29uZmlnX3NhdmUKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0aWZfY29uZmlnX3NhdmUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGlmX2NvbmZpZ19zYXZlIGJ0aWZfY29uZmlnX3NhdmU7Ci0vLyBOYW1lOiBidGlmX2NvbmZpZ19mbHVzaAotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRpZl9jb25maWdfZmx1c2ggewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGlmX2NvbmZpZ19mbHVzaCBidGlmX2NvbmZpZ19mbHVzaDsKLS8vIE5hbWU6IGJ0aWZfY29uZmlnX2NsZWFyCi0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidGlmX2NvbmZpZ19jbGVhciB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidGlmX2NvbmZpZ19jbGVhciBidGlmX2NvbmZpZ19jbGVhcjsKLS8vIE5hbWU6IGJ0aWZfZGVidWdfY29uZmlnX2R1bXAKLS8vIFBhcmFtczogaW50IGZkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRpZl9kZWJ1Z19jb25maWdfZHVtcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQgZmQpPiBib2R5e1tdKGludCBmZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoaW50IGZkKSB7IGJvZHkoZmQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRpZl9kZWJ1Z19jb25maWdfZHVtcCBidGlmX2RlYnVnX2NvbmZpZ19kdW1wOwotCi19ICAvLyBuYW1lc3BhY2UgYnRpZl9jb25maWcKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRpZl9jb3JlLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRpZl9jb3JlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTUxZTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfY29yZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MjcKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9hdF9leGl0Lmg+Ci0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXYuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb25maWcuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9kbS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3Bhbi5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX3Byb2ZpbGVfcXVldWUuaCIKLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zb2NrLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfc3RvcmFnZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9zdGFja19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIGJ0aWZfaXNfZHV0X21vZGUoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGlzX29uX2puaV90aHJlYWQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1idF9wcm9wZXJ0eV90KiBwcm9wZXJ0eV9kZWVwX2NvcHkoY29uc3QgYnRfcHJvcGVydHlfdCogcHJvcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1idF9zdGF0dXNfdCBidGlmX2NsZWFudXBfYmx1ZXRvb3RoKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9pbml0X2JsdWV0b290aCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJ0X3N0YXR1c190IGJ0aWZfc2V0X2R5bmFtaWNfYXVkaW9fYnVmZmVyX3NpemUoaW50IGNvZGVjLCBpbnQgc2l6ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl90cmFuc2Zlcl9jb250ZXh0KHRCVElGX0NCQUNLKiBwX2NiYWNrLCB1aW50MTZfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX3BhcmFtcywgaW50IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRJRl9DT1BZX0NCQUNLKiBwX2NvcHlfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJ0X3N0YXR1c190IGRvX2luX2puaV90aHJlYWQoYmFzZTo6T25jZUNsb3N1cmUgdGFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgZG9faW5fam5pX3RocmVhZChjb25zdCBiYXNlOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idGJhc2U6OkFic3RyYWN0TWVzc2FnZUxvb3AqIGdldF9qbmlfbWVzc2FnZV9sb29wKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1pbnQgYnRpZl9pc19lbmFibGVkKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUQV9TRVJWSUNFX01BU0sgYnRpZl9nZXRfZW5hYmxlZF9zZXJ2aWNlc19tYXNrKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBEeW5hbWljQXVkaW9idWZmZXJTaXplQ29tcGxldGVDYWxsYmFjayh0QlRNX1ZTQ19DTVBMKiBwX3ZzY19jbXBsX3BhcmFtcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9hZGFwdGVyX3Byb3BlcnRpZXNfZXZ0KGJ0X3N0YXR1c190IHN0YXR1cywgdWludDMyX3QgbnVtX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcF9wcm9wcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kaXNhYmxlX3NlcnZpY2UodEJUQV9TRVJWSUNFX0lEIHNlcnZpY2VfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZHV0X21vZGVfY29uZmlndXJlKHVpbnQ4X3QgZW5hYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2R1dF9tb2RlX3NlbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBidWYsIHVpbnQ4X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2VuYWJsZV9ibHVldG9vdGhfZXZ0KCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2VuYWJsZV9zZXJ2aWNlKHRCVEFfU0VSVklDRV9JRCBzZXJ2aWNlX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2dldF9hZGFwdGVyX3Byb3BlcnRpZXModm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2dldF9hZGFwdGVyX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMoUmF3QWRkcmVzcyByZW1vdGVfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9nZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzIHJlbW90ZV9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2luaXRfb2soKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0aWZfcmVtb3RlX3Byb3BlcnRpZXNfZXZ0KGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyogcmVtb3RlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bV9wcm9wcywgYnRfcHJvcGVydHlfdCogcF9wcm9wcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9zZXRfYWRhcHRlcl9wcm9wZXJ0eShidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9zZXRfcmVtb3RlX2RldmljZV9wcm9wZXJ0eShSYXdBZGRyZXNzKiByZW1vdGVfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfZGVidWdfY29ubi5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0aWZfZGVidWdfY29ubi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2Mjc2MC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19idGlmX2RlYnVnX2Nvbm4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9kZWJ1Z19jb25uLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXR0X2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIGJ0aWZfZGVidWdfY29ubl9kdW1wKGludCBmZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RlYnVnX2Nvbm5fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRpZl9kZWJ1Z19jb25uX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0R0FUVF9ESVNDT05OX1JFQVNPTiBkaXNjb25uZWN0X3JlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfZG0uY2MgYi90ZXN0L21vY2svbW9ja19idGlmX2RtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWFjMTE3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfZG0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjUxCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWxfaW5jbHVkZS9idGVfYXBwbC5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXN0cnVjdCB1aWRfc2V0X3Q7Ci0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIGJ0aWZfZG1fcGFpcmluZ19pc19idXN5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBjaGVja19jb2QoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYWRkciwgdWludDMyX3QgY29kKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNoZWNrX2NvZF9oaWQoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBjaGVja19jb2RfaGlkKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXVpbnQxNl90IGJ0aWZfZG1fZ2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEJUSUZfZG1fZGlzYWJsZSgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRJRl9kbV9lbmFibGUoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUSUZfZG1fb25faHdfZXJyb3IoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEJUSUZfZG1fcmVwb3J0X2lucXVpcnlfc3RhdHVzX2NoYW5nZSh1aW50OF90IHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRlX2RtX2V2dCh0QlRBX0RNX1NFQ19FVlQgZXZlbnQsIHRCVEFfRE1fU0VDKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfYmxlX3JlY2VpdmVyX3Rlc3QodWludDhfdCByeF9mcmVxKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2JsZV90ZXN0X2VuZCgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRpZl9ibGVfdHJhbnNtaXR0ZXJfdGVzdCh1aW50OF90IHR4X2ZyZXEsIHVpbnQ4X3QgdGVzdF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhY2tldF9wYXlsb2FkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2RlYnVnX2JvbmRfZXZlbnRfZHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRpZl9kbV9ibGVfc2VjX3JlcV9ldnQodEJUQV9ETV9CTEVfU0VDX1JFUSogcF9ibGVfcmVxLCBib29sIGlzX2NvbnNlbnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZG1fY2FuY2VsX2JvbmQoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2RtX2NhbmNlbF9kaXNjb3Zlcnkodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RtX2NsZWFudXAodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RtX2NyZWF0ZV9ib25kKGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgaW50IHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kbV9jcmVhdGVfYm9uZF9vdXRfb2ZfYmFuZChjb25zdCBSYXdBZGRyZXNzIGJkX2FkZHIsIGludCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCBwMTkyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfb29iX2RhdGFfdCBwMjU2X2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZG1fZW5hYmxlX3NlcnZpY2UodEJUQV9TRVJWSUNFX0lEIHNlcnZpY2VfaWQsIGJvb2wgZW5hYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2RtX2dldF9ibGVfbG9jYWxfa2V5cyh0QlRBX0RNX0JMRV9MT0NBTF9LRVlfTUFTSyogcF9rZXlfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0ZXQxNiogcF9lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9CTEVfTE9DQUxfSURfS0VZUyogcF9pZF9rZXlzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2RtX2dldF9yZW1vdGVfc2VydmljZXMoUmF3QWRkcmVzcyByZW1vdGVfYWRkciwgY29uc3QgaW50IHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kbV9oaF9vcGVuX2ZhaWxlZChSYXdBZGRyZXNzKiBiZGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZG1faW5pdCh1aWRfc2V0X3QqIHNldCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RtX2xvYWRfYmxlX2xvY2FsX2tleXModm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RtX29uX2Rpc2FibGUoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0aWZfZG1fcGluX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgdWludDhfdCBhY2NlcHQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbiwgYnRfcGluX2NvZGVfdCBwaW5fY29kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kbV9wcm9jX2lvX3JlcSh0QlRNX0FVVEhfUkVRKiBwX2F1dGhfcmVxLCBib29sIGlzX29yaWcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZG1fcHJvY19pb19yc3AoVU5VU0VEX0FUVFIgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0lPX0NBUCBpb19jYXAsIFVOVVNFRF9BVFRSIHRCVE1fT09CX0RBVEEgb29iX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9BVVRIX1JFUSBhdXRoX3JlcSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kbV9yZWFkX2VuZXJneV9pbmZvKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RtX3JlbW92ZV9ibGVfYm9uZGluZ19rZXlzKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZG1fcmVtb3ZlX2JvbmQoY29uc3QgUmF3QWRkcmVzcyBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX2RtX3NldF9vb2JfZm9yX2lvX3JlcSh0QlRNX09PQl9EQVRBKiBwX2hhc19vb2JfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kbV9zZXRfb29iX2Zvcl9sZV9pb19yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9PT0JfREFUQSogcF9oYXNfb29iX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfQVVUSF9SRVEqIHBfYXV0aF9yZXEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfZG1fc3NwX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MgYmRfYWRkciwgYnRfc3NwX3ZhcmlhbnRfdCB2YXJpYW50LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFjY2VwdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9kbV9zdGFydF9kaXNjb3Zlcnkodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX2RtX3VwZGF0ZV9ibGVfcmVtb3RlX3Byb3BlcnRpZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9ERVZJQ0VfVFlQRSBkZXZfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotYm9vbCBidGlmX2RtX2dldF9zbXBfY29uZmlnKHRCVEVfQVBQTF9DRkcqIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBidGlmX2RtX3Byb2Nfcm10X29vYihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBPY3RldDE2KiBwX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9jdGV0MTYqIHBfcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIGJ0aWZfZG1fcHJvY19sb2Nfb29iKHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIGlzX3ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLCBjb25zdCBPY3RldDE2JiByKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfYnRpZl9zdGFja19tYW5hZ2VyLmNjIGIvdGVzdC9tb2NrL21vY2tfYnRpZl9zdGFja19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzA3MDc3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0aWZfc3RhY2tfbWFuYWdlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqLwotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZnV0dXJlLmgiCi0KLXN0YXRpYyBmdXR1cmVfdCogaGFja19mdXR1cmU7Ci0KLWZ1dHVyZV90KiBzdGFja19tYW5hZ2VyX2dldF9oYWNrX2Z1dHVyZSgpIHsgcmV0dXJuIGhhY2tfZnV0dXJlOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idGlmX3N0b3JhZ2UuY2MgYi90ZXN0L21vY2svbW9ja19idGlmX3N0b3JhZ2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmM5MDMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfYnRpZl9zdG9yYWdlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0NAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9oZWFyaW5nX2FpZF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLU9jdGV0MTYgYnRpZl9zdG9yYWdlX2dldF9nYXR0X2NsX2RiX2hhc2goY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgT2N0ZXQxNiBvY3RldDsKLSAgcmV0dXJuIG9jdGV0OwotfQotYm9vbCBidGlmX2hhc19ibGVfa2V5cyhjb25zdCBzdGQ6OnN0cmluZyYgYmRzdHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRpZl9zdG9yYWdlX2dldF9oZWFyaW5nX2FpZF9wcm9wKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3QqIGNhcGFiaWxpdGllcywgdWludDY0X3QqIGhpX3N5bmNfaWQsCi0gICAgdWludDE2X3QqIHJlbmRlcl9kZWxheSwgdWludDE2X3QqIHByZXBhcmF0aW9uX2RlbGF5LCB1aW50MTZfdCogY29kZWNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJ0aWZfc3RvcmFnZV9nZXRfc3RvcmVkX3JlbW90ZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRpZl9zdG9yYWdlX2lzX3Jlc3RyaWN0ZWRfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2JsZV9ib25kaW5nX2tleShSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9hZGRfYmxlX2xvY2FsX2tleShjb25zdCBPY3RldDE2JiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2FkZF9ib25kZWRfZGV2aWNlKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtLZXkgbGlua19rZXksIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX2hpZF9kZXZpY2VfaW5mbygKLSAgICBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwgdWludDE2X3QgYXR0cl9tYXNrLCB1aW50OF90IHN1Yl9jbGFzcywKLSAgICB1aW50OF90IGFwcF9pZCwgdWludDE2X3QgdmVuZG9yX2lkLCB1aW50MTZfdCBwcm9kdWN0X2lkLCB1aW50MTZfdCB2ZXJzaW9uLAotICAgIHVpbnQ4X3QgY3RyeV9jb2RlLCB1aW50MTZfdCBzc3JfbWF4X2xhdGVuY3ksIHVpbnQxNl90IHNzcl9taW5fdG91dCwKLSAgICB1aW50MTZfdCBkbF9sZW4sIHVpbnQ4X3QqIGRzY19saXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfYWRkX3JlbW90ZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9hZGFwdGVyX3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfZ2V0X2JsZV9ib25kaW5nX2tleShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXlfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X2xlbmd0aCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9ibGVfbG9jYWxfa2V5KHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2N0ZXQxNioga2V5X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfZ2V0X3JlbW90ZV9hZGRyX3R5cGUoY29uc3QgUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIGFkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2dldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2RldmljZXModm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX2xvYWRfYm9uZGVkX2hpZF9pbmZvKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9sb2FkX2hpZGQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9ibGVfYm9uZGluZ19rZXlzKAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2JsZV9sb2NhbF9rZXlzKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9yZW1vdmVfYm9uZGVkX2RldmljZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRfaW5mbyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3JlbW92ZV9oaWRkKFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Ci19Ci1idF9zdGF0dXNfdCBidGlmX3N0b3JhZ2Vfc2V0X2FkYXB0ZXJfcHJvcGVydHkoYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKLX0KLWJ0X3N0YXR1c190IGJ0aWZfc3RvcmFnZV9zZXRfaGlkZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfYWRkcl90eXBlKGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotYnRfc3RhdHVzX3QgYnRpZl9zdG9yYWdlX3NldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOwotfQotdm9pZCBidGlmX3N0b3JhZ2VfYWRkX2hlYXJpbmdfYWlkKGNvbnN0IEhlYXJpbmdEZXZpY2UmIGRldl9pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotaW50IGJ0aWZfc3RvcmFnZV9nZXRfbnVtX2JvbmRlZF9kZXZpY2VzKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc2l6ZV90IGJ0aWZfc3BsaXRfdXVpZHNfc3RyaW5nKGNvbnN0IGNoYXIqIHN0ciwgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF91dWlkcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IGJ0aWZfc3RvcmFnZV9nZXRfZ2F0dF9jbF9zdXBwX2ZlYXQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IGJ0aWZfc3RvcmFnZV9nZXRfbG9jYWxfaW9fY2FwcygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCBidGlmX3N0b3JhZ2VfZ2V0X2xvY2FsX2lvX2NhcHNfYmxlKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9oZWFyaW5nX2FpZHMoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2dhdHRfY2xfZGJfaGFzaChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2dhdHRfY2xfc3VwcF9mZWF0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfc3RvcmFnZV9yZW1vdmVfaGVhcmluZ19haWQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRpZl9zdG9yYWdlX3NldF9nYXR0X2NsX2RiX2hhc2goY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgT2N0ZXQxNiBoYXNoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X2dhdHRfY2xfc3VwcF9mZWF0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmZWF0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X2hlYXJpbmdfYWlkX2FjY2VwdGxpc3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkX3RvX2FjY2VwdGxpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfc3RvcmFnZV9zZXRfZ2F0dF9zcl9zdXBwX2ZlYXQoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCBmZWF0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdWludDhfdCBidGlmX3N0b3JhZ2VfZ2V0X3NyX3N1cHBfZmVhdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgYnRpZl9zdG9yYWdlX2FkZF9ncm91cHMoUmF3QWRkcmVzcyBjb25zdCYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfc3RvcmFnZV9yZW1vdmVfZ3JvdXBzKFJhd0FkZHJlc3MgY29uc3QmKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX3N0b3JhZ2VfbG9hZF9ib25kZWRfZ3JvdXBzKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidGlmX3N0b3JhZ2Vfc2V0X2NzaXNfYXV0b2Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b2Nvbm5lY3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfc3RvcmFnZV91cGRhdGVfY3Npc19pbmZvKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0aWZfc3RvcmFnZV9sb2FkX2JvbmRlZF9jc2lzX2RldmljZXMoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidGlmX3N0b3JhZ2VfcmVtb3ZlX2NzaXNfZGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19idHVfdGFzay5jYyBiL3Rlc3QvbW9jay9tb2NrX2J0dV90YXNrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU1ZWRmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2J0dV90YXNrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjcKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9ydW5fbG9vcC5oPgotI2luY2x1ZGUgPGJhc2UvdGhyZWFkaW5nL3RocmVhZC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRhL3N5cy9idGFfc3lzLmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvbW9kdWxlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29tbW9uLmgiCi0jaW5jbHVkZSAiYnRtX2lzb19hcGkuaCIKLSNpbmNsdWRlICJjb21tb24vbWVzc2FnZV9sb29wX3RocmVhZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIGJ0dV9oY2lfbXNnX3Byb2Nlc3MoQlRfSERSKiBwX21zZykgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX2FkZHJlc3Nfb2JmdXNjYXRvci5jYyBiL3Rlc3QvbW9jay9tb2NrX2NvbW1vbl9hZGRyZXNzX29iZnVzY2F0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMmNlOTYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX2FkZHJlc3Nfb2JmdXNjYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiY29tbW9uL2FkZHJlc3Nfb2JmdXNjYXRvci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi1ib29sIEFkZHJlc3NPYmZ1c2NhdG9yOjpJc0luaXRpYWxpemVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBZGRyZXNzT2JmdXNjYXRvcjo6SXNTYWx0VmFsaWQoY29uc3QgT2N0ZXQzMiYgc2FsdF8yNTZiaXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXN0ZDo6c3RyaW5nIEFkZHJlc3NPYmZ1c2NhdG9yOjpPYmZ1c2NhdGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEFkZHJlc3NPYmZ1c2NhdG9yOjpJbml0aWFsaXplKGNvbnN0IE9jdGV0MzImIHNhbHRfMjU2Yml0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBzYWx0XzI1NmJpdF8gPSBzYWx0XzI1NmJpdDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX21lc3NhZ2VfbG9vcF90aHJlYWQuY2MgYi90ZXN0L21vY2svbW9ja19jb21tb25fbWVzc2FnZV9sb29wX3RocmVhZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhZDM3YS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19jb21tb25fbWVzc2FnZV9sb29wX3RocmVhZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLQotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSAiZ2QvY29tbW9uL2luaXRfZmxhZ3MuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci0KLW5hbWVzcGFjZSBjb21tb24gewotCi1zdGF0aWMgY29uc3RleHByIGludCBrUmVhbFRpbWVGaWZvU2NoZWR1bGluZ1ByaW9yaXR5ID0gMTsKLQotTWVzc2FnZUxvb3BUaHJlYWQ6Ok1lc3NhZ2VMb29wVGhyZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlYWRfbmFtZSkKLSAgICA6IE1lc3NhZ2VMb29wVGhyZWFkKHRocmVhZF9uYW1lLCBmYWxzZSkge30KLQotTWVzc2FnZUxvb3BUaHJlYWQ6Ok1lc3NhZ2VMb29wVGhyZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiB0aHJlYWRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21haW4pCi0gICAgOiB0aHJlYWRfbmFtZV8odGhyZWFkX25hbWUpLAotICAgICAgbWVzc2FnZV9sb29wXyhudWxscHRyKSwKLSAgICAgIHJ1bl9sb29wXyhudWxscHRyKSwKLSAgICAgIHRocmVhZF8obnVsbHB0ciksCi0gICAgICB0aHJlYWRfaWRfKC0xKSwKLSAgICAgIGxpbnV4X3RpZF8oLTEpLAotICAgICAgd2Vha19wdHJfZmFjdG9yeV8odGhpcyksCi0gICAgICBzaHV0dGluZ19kb3duXyhmYWxzZSksCi0gICAgICBpc19tYWluXyhpc19tYWluKSwKLSAgICAgIHJ1c3RfdGhyZWFkXyhudWxscHRyKSB7fQotCi1NZXNzYWdlTG9vcFRocmVhZDo6fk1lc3NhZ2VMb29wVGhyZWFkKCkgeyBTaHV0RG93bigpOyB9Ci0KLXZvaWQgTWVzc2FnZUxvb3BUaHJlYWQ6OlN0YXJ0VXAoKSB7Ci0gIGlmIChpc19tYWluXyAmJiBpbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgIHJ1c3RfdGhyZWFkXyA9IG5ldyA6OnJ1c3Q6OkJveDxzaGltOjpydXN0OjpNZXNzYWdlTG9vcFRocmVhZD4oCi0gICAgICAgIHNoaW06OnJ1c3Q6Om1haW5fbWVzc2FnZV9sb29wX3RocmVhZF9jcmVhdGUoKSk7Ci0gICAgYXV0byBydXN0X2lkID0KLSAgICAgICAgYmx1ZXRvb3RoOjpzaGltOjpydXN0OjptYWluX21lc3NhZ2VfbG9vcF90aHJlYWRfc3RhcnQoKipydXN0X3RocmVhZF8pOwotICAgIHRocmVhZF9pZF8gPSBydXN0X2lkOwotICAgIGxpbnV4X3RpZF8gPSBydXN0X2lkOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBzdGFydF91cF9wcm9taXNlOwotICBzdGQ6OmZ1dHVyZTx2b2lkPiBzdGFydF91cF9mdXR1cmUgPSBzdGFydF91cF9wcm9taXNlLmdldF9mdXR1cmUoKTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gICAgaWYgKHRocmVhZF8gIT0gbnVsbHB0cikgewotICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICI6IHRocmVhZCAiIDw8ICp0aGlzIDw8ICIgaXMgYWxyZWFkeSBzdGFydGVkIjsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB0aHJlYWRfID0gbmV3IHN0ZDo6dGhyZWFkKCZNZXNzYWdlTG9vcFRocmVhZDo6UnVuVGhyZWFkLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHN0YXJ0X3VwX3Byb21pc2UpKTsKLSAgfQotICBzdGFydF91cF9mdXR1cmUud2FpdCgpOwotfQotCi1ib29sIE1lc3NhZ2VMb29wVGhyZWFkOjpEb0luVGhyZWFkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Ok9uY2VDbG9zdXJlIHRhc2spIHsKLSAgcmV0dXJuIERvSW5UaHJlYWREZWxheWVkKGZyb21faGVyZSwgc3RkOjptb3ZlKHRhc2spLCBiYXNlOjpUaW1lRGVsdGEoKSk7Ci19Ci0KLWJvb2wgTWVzc2FnZUxvb3BUaHJlYWQ6OkRvSW5UaHJlYWREZWxheWVkKGNvbnN0IGJhc2U6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2xvc3VyZSB0YXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkZWxheSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICBpZiAoaXNfbWFpbl8gJiYgaW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICBpZiAocnVzdF90aHJlYWRfID09IG51bGxwdHIpIHsKLSAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogcnVzdCB0aHJlYWQgaXMgbnVsbCBmb3IgdGhyZWFkICIgPDwgKnRoaXMKLSAgICAgICAgICAgICAgICAgPDwgIiwgZnJvbSAiIDw8IGZyb21faGVyZS5Ub1N0cmluZygpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNoaW06OnJ1c3Q6Om1haW5fbWVzc2FnZV9sb29wX3RocmVhZF9kb19kZWxheWVkKAotICAgICAgICAqKnJ1c3RfdGhyZWFkXywKLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxzaGltOjpydXN0OjpPbmNlQ2xvc3VyZT4oc3RkOjptb3ZlKHRhc2spKSwKLSAgICAgICAgZGVsYXkuSW5NaWxsaXNlY29uZHMoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAobWVzc2FnZV9sb29wXyA9PSBudWxscHRyKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBtZXNzYWdlIGxvb3AgaXMgbnVsbCBmb3IgdGhyZWFkICIgPDwgKnRoaXMKLSAgICAgICAgICAgICAgIDw8ICIsIGZyb20gIiA8PCBmcm9tX2hlcmUuVG9TdHJpbmcoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0RGVsYXllZFRhc2soZnJvbV9oZXJlLCBzdGQ6Om1vdmUodGFzayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5KSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18KLSAgICAgICAgICAgICAgIDw8ICI6IGZhaWxlZCB0byBwb3N0IHRhc2sgdG8gbWVzc2FnZSBsb29wIGZvciB0aHJlYWQgIiA8PCAqdGhpcwotICAgICAgICAgICAgICAgPDwgIiwgZnJvbSAiIDw8IGZyb21faGVyZS5Ub1N0cmluZygpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBNZXNzYWdlTG9vcFRocmVhZDo6U2h1dERvd24oKSB7Ci0gIHsKLSAgICBpZiAoaXNfbWFpbl8gJiYgaW5pdF9mbGFnczo6Z2RfcnVzdF9pc19lbmFibGVkKCkpIHsKLSAgICAgIGRlbGV0ZSBydXN0X3RocmVhZF87Ci0gICAgICBydXN0X3RocmVhZF8gPSBudWxscHRyOwotICAgICAgdGhyZWFkX2lkXyA9IC0xOwotICAgICAgbGludXhfdGlkXyA9IC0xOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gICAgaWYgKHRocmVhZF8gPT0gbnVsbHB0cikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHRocmVhZCAiIDw8ICp0aGlzIDw8ICIgaXMgYWxyZWFkeSBzdG9wcGVkIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1lc3NhZ2VfbG9vcF8gPT0gbnVsbHB0cikgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG1lc3NhZ2VfbG9vcF8gaXMgbnVsbC4gQWxyZWFkeSBzdG9wcGluZyI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChzaHV0dGluZ19kb3duXykgewotICAgICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IHdhaXRpbmcgZm9yIHRocmVhZCB0byBqb2luIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2h1dHRpbmdfZG93bl8gPSB0cnVlOwotICAgIENIRUNLX05FKHRocmVhZF9pZF8sIGJhc2U6OlBsYXRmb3JtVGhyZWFkOjpDdXJyZW50SWQoKSkKLSAgICAgICAgPDwgX19mdW5jX18gPDwgIiBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiB0aGUgdGhyZWFkIGl0c2VsZi4gIgotICAgICAgICA8PCAiT3RoZXJ3aXNlLCBkZWFkbG9jayBtYXkgaGFwcGVuLiI7Ci0gICAgaWYgKCFtZXNzYWdlX2xvb3BfLT50YXNrX3J1bm5lcigpLT5Qb3N0VGFzaygKLSAgICAgICAgICAgIEZST01fSEVSRSwgcnVuX2xvb3BfLT5RdWl0V2hlbklkbGVDbG9zdXJlKCkpKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8IF9fZnVuY19fCi0gICAgICAgICAgICAgICAgIDw8ICI6IGZhaWxlZCB0byBwb3N0IHRhc2sgdG8gbWVzc2FnZSBsb29wIGZvciB0aHJlYWQgIgotICAgICAgICAgICAgICAgICA8PCAqdGhpczsKLSAgICB9Ci0gIH0KLSAgdGhyZWFkXy0+am9pbigpOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgICBkZWxldGUgdGhyZWFkXzsKLSAgICB0aHJlYWRfID0gbnVsbHB0cjsKLSAgICBzaHV0dGluZ19kb3duXyA9IGZhbHNlOwotICB9Ci19Ci0KLWJhc2U6OlBsYXRmb3JtVGhyZWFkSWQgTWVzc2FnZUxvb3BUaHJlYWQ6OkdldFRocmVhZElkKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICByZXR1cm4gdGhyZWFkX2lkXzsKLX0KLQotc3RkOjpzdHJpbmcgTWVzc2FnZUxvb3BUaHJlYWQ6OkdldE5hbWUoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfbmFtZV87IH0KLQotc3RkOjpzdHJpbmcgTWVzc2FnZUxvb3BUaHJlYWQ6OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCIlcyglZCkiLCB0aHJlYWRfbmFtZV8uY19zdHIoKSwgdGhyZWFkX2lkXyk7Ci19Ci0KLWJvb2wgTWVzc2FnZUxvb3BUaHJlYWQ6OklzUnVubmluZygpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgcmV0dXJuIHRocmVhZF9pZF8gIT0gLTE7Ci19Ci0KLS8vIE5vbiBBUEkgbWV0aG9kLCBzaG91bGQgbm90IGJlIHByb3RlY3RlZCBieSBBUEkgbXV0ZXgKLXZvaWQgTWVzc2FnZUxvb3BUaHJlYWQ6OlJ1blRocmVhZChNZXNzYWdlTG9vcFRocmVhZCogdGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBzdGFydF91cF9wcm9taXNlKSB7Ci0gIHRocmVhZC0+UnVuKHN0ZDo6bW92ZShzdGFydF91cF9wcm9taXNlKSk7Ci19Ci0KLWJ0YmFzZTo6QWJzdHJhY3RNZXNzYWdlTG9vcCogTWVzc2FnZUxvb3BUaHJlYWQ6Om1lc3NhZ2VfbG9vcCgpIGNvbnN0IHsKLSAgQVNTRVJUX0xPRyghaXNfbWFpbl8sCi0gICAgICAgICAgICAgInlvdSBhcmUgbm90IGFsbG93ZWQgdG8gZ2V0IHRoZSBtYWluIHRocmVhZCdzIG1lc3NhZ2UgbG9vcCIpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gIHJldHVybiBtZXNzYWdlX2xvb3BfOwotfQotCi1ib29sIE1lc3NhZ2VMb29wVGhyZWFkOjpFbmFibGVSZWFsVGltZVNjaGVkdWxpbmcoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0KLSAgaWYgKCFJc1J1bm5pbmcoKSkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdGhyZWFkICIgPDwgKnRoaXMgPDwgIiBpcyBub3QgcnVubmluZyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RydWN0IHNjaGVkX3BhcmFtIHJ0X3BhcmFtcyA9IHsuc2NoZWRfcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVhbFRpbWVGaWZvU2NoZWR1bGluZ1ByaW9yaXR5fTsKLSAgaW50IHJjID0gc2NoZWRfc2V0c2NoZWR1bGVyKGxpbnV4X3RpZF8sIFNDSEVEX0ZJRk8sICZydF9wYXJhbXMpOwotICBpZiAocmMgIT0gMCkgewotICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogdW5hYmxlIHRvIHNldCBTQ0hFRF9GSUZPIHByaW9yaXR5ICIKLSAgICAgICAgICAgICAgIDw8IGtSZWFsVGltZUZpZm9TY2hlZHVsaW5nUHJpb3JpdHkgPDwgIiBmb3IgbGludXhfdGlkICIKLSAgICAgICAgICAgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGxpbnV4X3RpZF8pIDw8ICIsIHRocmVhZCAiIDw8ICp0aGlzCi0gICAgICAgICAgICAgICA8PCAiLCBlcnJvcjogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1iYXNlOjpXZWFrUHRyPE1lc3NhZ2VMb29wVGhyZWFkPiBNZXNzYWdlTG9vcFRocmVhZDo6R2V0V2Vha1B0cigpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBhcGlfbG9jayhhcGlfbXV0ZXhfKTsKLSAgcmV0dXJuIHdlYWtfcHRyX2ZhY3RvcnlfLkdldFdlYWtQdHIoKTsKLX0KLQotdm9pZCBNZXNzYWdlTG9vcFRocmVhZDo6UnVuKHN0ZDo6cHJvbWlzZTx2b2lkPiBzdGFydF91cF9wcm9taXNlKSB7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGFwaV9sb2NrKGFwaV9tdXRleF8pOwotICAgIGlmIChpc19tYWluXyAmJiBpbml0X2ZsYWdzOjpnZF9ydXN0X2lzX2VuYWJsZWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCBfX2Z1bmNfXyA8PCAiOiBtZXNzYWdlIGxvb3Agc3RhcnRpbmcgZm9yIHRocmVhZCAiCi0gICAgICAgICAgICAgIDw8IHRocmVhZF9uYW1lXzsKLSAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6U2V0TmFtZSh0aHJlYWRfbmFtZV8pOwotICAgIG1lc3NhZ2VfbG9vcF8gPSBuZXcgYnRiYXNlOjpBYnN0cmFjdE1lc3NhZ2VMb29wKCk7Ci0gICAgcnVuX2xvb3BfID0gbmV3IGJhc2U6OlJ1bkxvb3AoKTsKLSAgICB0aHJlYWRfaWRfID0gYmFzZTo6UGxhdGZvcm1UaHJlYWQ6OkN1cnJlbnRJZCgpOwotICAgIGxpbnV4X3RpZF8gPSBzdGF0aWNfY2FzdDxwaWRfdD4oc3lzY2FsbChTWVNfZ2V0dGlkKSk7Ci0gICAgc3RhcnRfdXBfcHJvbWlzZS5zZXRfdmFsdWUoKTsKLSAgfQotCi0gIC8vIEJsb2NraW5nIHVudGlsIFNodXREb3duKCkgaXMgY2FsbGVkCi0gIHJ1bl9sb29wXy0+UnVuKCk7Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gYXBpX2xvY2soYXBpX211dGV4Xyk7Ci0gICAgdGhyZWFkX2lkXyA9IC0xOwotICAgIGxpbnV4X3RpZF8gPSAtMTsKLSAgICBkZWxldGUgbWVzc2FnZV9sb29wXzsKLSAgICBtZXNzYWdlX2xvb3BfID0gbnVsbHB0cjsKLSAgICBkZWxldGUgcnVuX2xvb3BfOwotICAgIHJ1bl9sb29wXyA9IG51bGxwdHI7Ci0gICAgTE9HKElORk8pIDw8IF9fZnVuY19fIDw8ICI6IG1lc3NhZ2UgbG9vcCBmaW5pc2hlZCBmb3IgdGhyZWFkICIKLSAgICAgICAgICAgICAgPDwgdGhyZWFkX25hbWVfOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb24KLQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX21ldHJpY19pZF9hbGxvY2F0b3IuY2MgYi90ZXN0L21vY2svbW9ja19jb21tb25fbWV0cmljX2lkX2FsbG9jYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4OWE4My4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19jb21tb25fbWV0cmljX2lkX2FsbG9jYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTEKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNfaWRfYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBwYWlyZWRfZGV2aWNlX2NhY2hlX2NhcGFjaXR5ezEwfTsKLWNvbnN0IHN0ZDo6c3RyaW5nIHBhaXJlZF9kZXZpY2VfY2FjaGVfbG9nX3RhZygiTW9jayIpOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLWNvbnN0IGludCBNZXRyaWNJZEFsbG9jYXRvcjo6a01pbklkID0gMDsKLQotTWV0cmljSWRBbGxvY2F0b3I6Ok1ldHJpY0lkQWxsb2NhdG9yKCkKLSAgICA6IHBhaXJlZF9kZXZpY2VfY2FjaGVfKHBhaXJlZF9kZXZpY2VfY2FjaGVfY2FwYWNpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyZWRfZGV2aWNlX2NhY2hlX2xvZ190YWcpLAotICAgICAgdGVtcG9yYXJ5X2RldmljZV9jYWNoZV8ocGFpcmVkX2RldmljZV9jYWNoZV9jYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJlZF9kZXZpY2VfY2FjaGVfbG9nX3RhZykgewotICBuZXh0X2lkXyA9IDA7Ci0gIGluaXRpYWxpemVkXyA9IHRydWU7Ci19Ci0KLWNsYXNzIE1vY2tNZXRyaWNJZEFsbG9jYXRvciA6IHB1YmxpYyBNZXRyaWNJZEFsbG9jYXRvciB7Ci0gcHVibGljOgotICBNb2NrTWV0cmljSWRBbGxvY2F0b3IoKSB7fQotfTsKLQotTW9ja01ldHJpY0lkQWxsb2NhdG9yIG1ldHJpY19pZF9hbGxvY2F0b3I7Ci0KLU1ldHJpY0lkQWxsb2NhdG9yJiBNZXRyaWNJZEFsbG9jYXRvcjo6R2V0SW5zdGFuY2UoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbWV0cmljX2lkX2FsbG9jYXRvcjsKLX0KLU1ldHJpY0lkQWxsb2NhdG9yOjp+TWV0cmljSWRBbGxvY2F0b3IoKSB7fQotYm9vbCBNZXRyaWNJZEFsbG9jYXRvcjo6Q2xvc2UoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIE1ldHJpY0lkQWxsb2NhdG9yOjpJbml0KAotICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxSYXdBZGRyZXNzLCBpbnQ+JiBwYWlyZWRfZGV2aWNlX21hcCwKLSAgICBDYWxsYmFjayBzYXZlX2lkX2NhbGxiYWNrLCBDYWxsYmFjayBmb3JnZXRfZGV2aWNlX2NhbGxiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIE1ldHJpY0lkQWxsb2NhdG9yOjpJc0VtcHR5KCkgY29uc3QgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBNZXRyaWNJZEFsbG9jYXRvcjo6SXNWYWxpZElkKGNvbnN0IGludCBpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBNZXRyaWNJZEFsbG9jYXRvcjo6U2F2ZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBtYWNfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotaW50IE1ldHJpY0lkQWxsb2NhdG9yOjpBbGxvY2F0ZUlkKGNvbnN0IFJhd0FkZHJlc3MmIG1hY19hZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgTWV0cmljSWRBbGxvY2F0b3I6OkZvcmdldERldmljZShjb25zdCBSYXdBZGRyZXNzJiBtYWNfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTWV0cmljSWRBbGxvY2F0b3I6OkZvcmdldERldmljZVBvc3Rwcm9jZXNzKGNvbnN0IFJhd0FkZHJlc3MmIG1hY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19jb21tb25fbWV0cmljcy5jYyBiL3Rlc3QvbW9jay9tb2NrX2NvbW1vbl9tZXRyaWNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThhN2ZiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2NvbW1vbl9tZXRyaWNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozNgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJjb21tb24vbWV0cmljcy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZiAwCi0jaW5jbHVkZSA8YmFzZS9iYXNlNjQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL2hhcmR3YXJlL2J0X2F2Lmg+Ci0jaW5jbHVkZSA8c3RhdHNsb2cuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgImFkZHJlc3Nfb2JmdXNjYXRvci5oIgotI2luY2x1ZGUgImJsdWV0b290aC9tZXRyaWNzL2JsdWV0b290aC5wYi5oIgotI2luY2x1ZGUgImxlYWt5X2JvbmRlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm1ldHJpY19pZF9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJ0aW1lX3V0aWwuaCIKLSNlbmRpZgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgY29tbW9uIHsKLQotdm9pZCBBMmRwU2Vzc2lvbk1ldHJpY3M6OlVwZGF0ZShjb25zdCBBMmRwU2Vzc2lvbk1ldHJpY3MmIG1ldHJpY3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLXN0cnVjdCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjppbXBsIHsKLSAgaW50IG1vY2t7MTIzfTsKLX07Ci0KLUJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkJsdWV0b290aE1ldHJpY3NMb2dnZXIoKSB7fQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpCdWlsZCgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6Q3V0b2ZmU2Vzc2lvbigpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0EyZHBTZXNzaW9uKAotICAgIGNvbnN0IEEyZHBTZXNzaW9uTWV0cmljcyYgYTJkcF9zZXNzaW9uX21ldHJpY3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0JsdWV0b290aFNlc3Npb25EZXZpY2VJbmZvKAotICAgIHVpbnQzMl90IGRldmljZV9jbGFzcywgZGV2aWNlX3R5cGVfdCBkZXZpY2VfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nQmx1ZXRvb3RoU2Vzc2lvbkVuZCgKLSAgICBkaXNjb25uZWN0X3JlYXNvbl90IGRpc2Nvbm5lY3RfcmVhc29uLCB1aW50NjRfdCB0aW1lc3RhbXBfbXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ0JsdWV0b290aFNlc3Npb25TdGFydCgKLSAgICBjb25uZWN0aW9uX3RlY2hfdCBjb25uZWN0aW9uX3RlY2hfdHlwZSwgdWludDY0X3QgdGltZXN0YW1wX21zKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpMb2dIZWFkc2V0UHJvZmlsZVJmY0Nvbm5lY3Rpb24oCi0gICAgdEJUQV9TRVJWSUNFX0lEIHNlcnZpY2VfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ1BhaXJFdmVudCh1aW50MzJfdCBkaXNjb25uZWN0X3JlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OkxvZ1NjYW5FdmVudChib29sIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXRhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl90ZWNoX3QgdHlwZSwgdWludDMyX3QgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcF9tcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6TG9nV2FrZUV2ZW50KHdha2VfZXZlbnRfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBfbXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJsdWV0b290aE1ldHJpY3NMb2dnZXI6OlJlc2V0KCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpSZXNldExvZygpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6UmVzZXRTZXNzaW9uKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6V3JpdGVCYXNlNjQoaW50IGZkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCbHVldG9vdGhNZXRyaWNzTG9nZ2VyOjpXcml0ZUJhc2U2NFN0cmluZyhzdGQ6OnN0cmluZyogc2VyaWFsaXplZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQmx1ZXRvb3RoTWV0cmljc0xvZ2dlcjo6V3JpdGVTdHJpbmcoc3RkOjpzdHJpbmcqIHNlcmlhbGl6ZWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIExvZ0EyZHBBdWRpb092ZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTG9nQTJkcEF1ZGlvVW5kZXJydW5FdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX21pc3NpbmdfcGNtX2J5dGVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dBMmRwUGxheWJhY2tFdmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jb2RpbmdfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTG9nQmx1ZXRvb3RoSGFsQ3Jhc2hSZWFzb24oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDMyX3QgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVuZG9yX2Vycm9yX2NvZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIExvZ0NsYXNzaWNQYWlyaW5nRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dIY2lUaW1lb3V0RXZlbnQodWludDMyX3QgaGNpX2NtZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTG9nTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsaW5rX3R5cGUsIHVpbnQzMl90IGhjaV9jbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTG9nTWFudWZhY3R1cmVySW5mbyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmFpbGVkX2NvbnRhY3RfY291bnRlcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTG9nUmVhZFJzc2lSZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgTG9nUmVhZFR4UG93ZXJMZXZlbFJlc3VsdChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dSZW1vdGVWZXJzaW9uSW5mbyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1hbnVmYWN0dXJlcl9uYW1lLCB1aW50MTZfdCBzdWJ2ZXJzaW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dTZHBBdHRyaWJ1dGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJpYnV0ZV9pZCwgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXR0cmlidXRlX3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dTbXBQYWlyaW5nRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDhfdCBzbXBfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc21wX2ZhaWxfcmVhc29uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBMb2dTb2NrZXRDb25uZWN0aW9uU3RhdGUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgaW50IHBvcnQsIGludCB0eXBlLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Q29ubmVjdGlvbnN0YXRlRW51bSBjb25uZWN0aW9uX3N0YXRlLAotICAgIGludDY0X3QgdHhfYnl0ZXMsIGludDY0X3QgcnhfYnl0ZXMsIGludCB1aWQsIGludCBzZXJ2ZXJfcG9ydCwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19jb21tb25fb3NfdXRpbHMuY2MgYi90ZXN0L21vY2svbW9ja19jb21tb25fb3NfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2N2EzMGMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX29zX3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX2NvbW1vbl9vc191dGlscy5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBjb21tb25fb3NfdXRpbHMgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBpc19ibHVldG9vdGhfdWlkIGlzX2JsdWV0b290aF91aWQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21tb25fb3NfdXRpbHMKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcywgaWYgYW55Ci1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgY29tbW9uX29zX3V0aWxzIHsKLQotYm9vbCBpc19ibHVldG9vdGhfdWlkOjpyZXR1cm5fdmFsdWUgPSBmYWxzZTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbl9vc191dGlscwotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotYm9vbCBpc19ibHVldG9vdGhfdWlkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OmNvbW1vbl9vc191dGlsczo6aXNfYmx1ZXRvb3RoX3VpZCgpOwotfQotLy8gTW9ja2VkIGZ1bmN0aW9ucyBjb21wbGV0ZQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2NvbW1vbl9vc191dGlscy5oIGIvdGVzdC9tb2NrL21vY2tfY29tbW9uX29zX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2U5MzUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX29zX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgY29tbW9uX29zX3V0aWxzIHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IGlzX2JsdWV0b290aF91aWQKLS8vIFBhcmFtczoKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGlzX2JsdWV0b290aF91aWQgewotICBzdGF0aWMgYm9vbCByZXR1cm5fdmFsdWU7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBib2R5e1tdKCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgaXNfYmx1ZXRvb3RoX3VpZCBpc19ibHVldG9vdGhfdWlkOwotCi19ICAvLyBuYW1lc3BhY2UgY29tbW9uX29zX3V0aWxzCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19jb21tb25fcmVwZWF0aW5nX3RpbWVyLmNjIGIvdGVzdC9tb2NrL21vY2tfY29tbW9uX3JlcGVhdGluZ190aW1lci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZTMxNi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19jb21tb25fcmVwZWF0aW5nX3RpbWVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjgKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAiY29tbW9uL21lc3NhZ2VfbG9vcF90aHJlYWQuaCIKLSNpbmNsdWRlICJjb21tb24vcmVwZWF0aW5nX3RpbWVyLmgiCi0jaW5jbHVkZSAiY29tbW9uL3RpbWVfdXRpbC5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdXNpbmcgbmFtZXNwYWNlIGJsdWV0b290aDo6Y29tbW9uOwotCi1SZXBlYXRpbmdUaW1lcjo6flJlcGVhdGluZ1RpbWVyKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotYm9vbCBSZXBlYXRpbmdUaW1lcjo6SXNTY2hlZHVsZWQoKSBjb25zdCB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFJlcGVhdGluZ1RpbWVyOjpTY2hlZHVsZVBlcmlvZGljKAotICAgIGNvbnN0IGJhc2U6OldlYWtQdHI8TWVzc2FnZUxvb3BUaHJlYWQ+JiB0aHJlYWQsCi0gICAgY29uc3QgYmFzZTo6TG9jYXRpb24mIGZyb21faGVyZSwgYmFzZTo6Q2xvc3VyZSB0YXNrLAotICAgIGJhc2U6OlRpbWVEZWx0YSBwZXJpb2QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgUmVwZWF0aW5nVGltZXI6OkNhbmNlbCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIGV4cGVjdGVkX3RpbWVfbmV4dF90YXNrX3VzXyA9IDA7Ci19Ci12b2lkIFJlcGVhdGluZ1RpbWVyOjpDYW5jZWxBbmRXYWl0KCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBSZXBlYXRpbmdUaW1lcjo6Q2FuY2VsQ2xvc3VyZShzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgUmVwZWF0aW5nVGltZXI6OkNhbmNlbEhlbHBlcihzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgUmVwZWF0aW5nVGltZXI6OlJ1blRhc2soKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19jb21tb25fc3RvcF93YXRjaF9sZWdhY3kuY2MgYi90ZXN0L21vY2svbW9ja19jb21tb25fc3RvcF93YXRjaF9sZWdhY3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGM1MzcuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX3N0b3Bfd2F0Y2hfbGVnYWN5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSAiY29tbW9uL3N0b3Bfd2F0Y2hfbGVnYWN5LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBjb21tb24gewotCi1TdG9wV2F0Y2hMZWdhY3k6OlN0b3BXYXRjaExlZ2FjeShzdGQ6OnN0cmluZyB0ZXh0KQotICAgIDogdGV4dF8oc3RkOjptb3ZlKHRleHQpKSwKLSAgICAgIHRpbWVzdGFtcF8oc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkpLAotICAgICAgc3RhcnRfdGltZXN0YW1wXyhzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLVN0b3BXYXRjaExlZ2FjeTo6flN0b3BXYXRjaExlZ2FjeSgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgU3RvcFdhdGNoTGVnYWN5OjpEdW1wU3RvcFdhdGNoTG9nKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgU3RvcFdhdGNoTGVnYWN5OjpSZWNvcmRMb2coU3RvcFdhdGNoTG9nIGxvZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX3RpbWVfdXRpbC5jYyBiL3Rlc3QvbW9jay9tb2NrX2NvbW1vbl90aW1lX3V0aWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTM2OGUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfY29tbW9uX3RpbWVfdXRpbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGNvbW1vbiB7Ci0KLXVpbnQ2NF90IHRpbWVfZ2V0X29zX2Jvb3R0aW1lX21zKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50NjRfdCB0aW1lX2dldF9vc19ib290dGltZV91cygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDY0X3QgdGltZV9nZXR0aW1lb2ZkYXlfdXMoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbW1vbgotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfZGV2aWNlX2NvbnRyb2xsZXIuY2MgYi90ZXN0L21vY2svbW9ja19kZXZpY2VfY29udHJvbGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2MTcyMy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19kZXZpY2VfY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MQotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19kZXZpY2VfY29udHJvbGxlci5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBkZXZpY2VfY29udHJvbGxlciB7Ci0KLVJhd0FkZHJlc3MgYWRkcmVzczsKLWJ0X3ZlcnNpb25fdCBidF92ZXJzaW9uID0gewotICAgIC5oY2lfdmVyc2lvbiA9IDAsCi0gICAgLmhjaV9yZXZpc2lvbiA9IDAsCi0gICAgLmxtcF92ZXJzaW9uID0gMCwKLSAgICAubWFudWZhY3R1cmVyID0gMCwKLSAgICAubG1wX3N1YnZlcnNpb24gPSAwLAotfTsKLQotdWludDhfdCBzdXBwb3J0ZWRfY29tbWFuZHNbSENJX1NVUFBPUlRFRF9DT01NQU5EU19BUlJBWV9TSVpFXXswfTsKLWJ0X2RldmljZV9mZWF0dXJlc190IGZlYXR1cmVzX2NsYXNzaWNbTUFYX0ZFQVRVUkVTX0NMQVNTSUNfUEFHRV9DT1VOVF0gPSB7ewotICAgIC5hc19hcnJheXswfSwKLX19OwotdWludDhfdCBsYXN0X2ZlYXR1cmVzX2NsYXNzaWNfcGFnZV9pbmRleHswfTsKLQotdWludDE2X3QgYWNsX2RhdGFfc2l6ZV9jbGFzc2ljezB9OwotdWludDE2X3QgYWNsX2RhdGFfc2l6ZV9ibGV7MH07Ci11aW50MTZfdCBpc29fZGF0YV9zaXplezB9OwotCi11aW50MTZfdCBhY2xfYnVmZmVyX2NvdW50X2NsYXNzaWN7MH07Ci11aW50OF90IGFjbF9idWZmZXJfY291bnRfYmxlezB9OwotdWludDhfdCBpc29fYnVmZmVyX2NvdW50ezB9OwotCi11aW50OF90IGJsZV9hY2NlcHRsaXN0X3NpemV7MH07Ci11aW50OF90IGJsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZXswfTsKLXVpbnQ4X3QgYmxlX3N1cHBvcnRlZF9zdGF0ZXNbQkxFX1NVUFBPUlRFRF9TVEFURVNfU0laRV17MH07Ci1idF9kZXZpY2VfZmVhdHVyZXNfdCBmZWF0dXJlc19ibGV7MH07Ci11aW50MTZfdCBibGVfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV9sZW5ndGh7MH07Ci11aW50MTZfdCBibGVfc3VwcG9ydGVkX21heF90eF9vY3RldHN7MH07Ci11aW50MTZfdCBibGVfc3VwcG9ydGVkX21heF90eF90aW1lezB9OwotdWludDE2X3QgYmxlX3N1cHBvcnRlZF9tYXhfcnhfb2N0ZXRzezB9OwotdWludDE2X3QgYmxlX3N1cHBvcnRlZF9tYXhfcnhfdGltZXswfTsKLQotdWludDE2X3QgYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGh7MH07Ci11aW50OF90IGJsZV9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHN7MH07Ci11aW50OF90IGJsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZXswfTsKLXVpbnQ4X3QgbG9jYWxfc3VwcG9ydGVkX2NvZGVjc1tNQVhfTE9DQUxfU1VQUE9SVEVEX0NPREVDU19TSVpFXXswfTsKLXVpbnQ4X3QgbnVtYmVyX29mX2xvY2FsX3N1cHBvcnRlZF9jb2RlY3N7MH07Ci0KLWJvb2wgcmVhZGFibGV7ZmFsc2V9OwotYm9vbCBibGVfc3VwcG9ydGVke2ZhbHNlfTsKLWJvb2wgaXNvX3N1cHBvcnRlZHtmYWxzZX07Ci1ib29sIHNpbXBsZV9wYWlyaW5nX3N1cHBvcnRlZHtmYWxzZX07Ci1ib29sIHNlY3VyZV9jb25uZWN0aW9uc19zdXBwb3J0ZWR7ZmFsc2V9OwotCi1ib29sIGdldF9pc19yZWFkeSh2b2lkKSB7IHJldHVybiByZWFkYWJsZTsgfQotCi1jb25zdCBSYXdBZGRyZXNzKiBnZXRfYWRkcmVzcyh2b2lkKSB7IHJldHVybiAmYWRkcmVzczsgfQotCi1jb25zdCBidF92ZXJzaW9uX3QqIGdldF9idF92ZXJzaW9uKHZvaWQpIHsgcmV0dXJuICZidF92ZXJzaW9uOyB9Ci0KLXVpbnQ4X3QqIGdldF9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzKHVpbnQ4X3QqIG51bWJlcl9vZl9jb2RlY3MpIHsKLSAgaWYgKG51bWJlcl9vZl9sb2NhbF9zdXBwb3J0ZWRfY29kZWNzKSB7Ci0gICAgKm51bWJlcl9vZl9jb2RlY3MgPSBudW1iZXJfb2ZfbG9jYWxfc3VwcG9ydGVkX2NvZGVjczsKLSAgICByZXR1cm4gbG9jYWxfc3VwcG9ydGVkX2NvZGVjczsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgdWludDhfdCogZ2V0X2JsZV9zdXBwb3J0ZWRfc3RhdGVzKHZvaWQpIHsgcmV0dXJuIGJsZV9zdXBwb3J0ZWRfc3RhdGVzOyB9Ci0KLWJvb2wgc3VwcG9ydHNfc2ltcGxlX3BhaXJpbmcodm9pZCkgeyByZXR1cm4gc2ltcGxlX3BhaXJpbmdfc3VwcG9ydGVkOyB9Ci0KLWJvb2wgc3VwcG9ydHNfc2VjdXJlX2Nvbm5lY3Rpb25zKHZvaWQpIHsgcmV0dXJuIHNlY3VyZV9jb25uZWN0aW9uc19zdXBwb3J0ZWQ7IH0KLQotYm9vbCBzdXBwb3J0c19zaW11bHRhbmVvdXNfbGVfYnJlZHIodm9pZCkgewotICByZXR1cm4gSENJX1NJTVVMX0xFX0JSRURSX1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19yZWFkaW5nX3JlbW90ZV9leHRlbmRlZF9mZWF0dXJlcyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfUkVBRF9SRU1PVEVfRVhUX0ZFQVRVUkVTX1NVUFBPUlRFRChzdXBwb3J0ZWRfY29tbWFuZHMpOwotfQotCi1ib29sIHN1cHBvcnRzX2ludGVybGFjZWRfaW5xdWlyeV9zY2FuKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9MTVBfSU5URVJMQUNFRF9JTlFfU0NBTl9TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfcnNzaV93aXRoX2lucXVpcnlfcmVzdWx0cyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfTE1QX0lOUV9SU1NJX1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19leHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9FWFRfSU5RX1JTUF9TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfY2VudHJhbF9wZXJpcGhlcmFsX3JvbGVfc3dpdGNoKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9TV0lUQ0hfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2VuaGFuY2VkX3NldHVwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24odm9pZCkgewotICByZXR1cm4gSENJX0VOSF9TRVRVUF9TWU5DSF9DT05OX1NVUFBPUlRFRChzdXBwb3J0ZWRfY29tbWFuZHMpOwotfQotCi1ib29sIHN1cHBvcnRzX2VuaGFuY2VkX2FjY2VwdF9zeW5jaHJvbm91c19jb25uZWN0aW9uKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9FTkhfQUNDRVBUX1NZTkNIX0NPTk5fU1VQUE9SVEVEKHN1cHBvcnRlZF9jb21tYW5kcyk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfM19zbG90X3BhY2tldHModm9pZCkgewotICByZXR1cm4gSENJXzNfU0xPVF9QQUNLRVRTX1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c181X3Nsb3RfcGFja2V0cyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfNV9TTE9UX1BBQ0tFVFNfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2NsYXNzaWNfMm1fcGh5KHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9FRFJfQUNMXzJNUFNfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2NsYXNzaWNfM21fcGh5KHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9FRFJfQUNMXzNNUFNfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzXzNfc2xvdF9lZHJfcGFja2V0cyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfM19TTE9UX0VEUl9BQ0xfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzXzVfc2xvdF9lZHJfcGFja2V0cyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfNV9TTE9UX0VEUl9BQ0xfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX3Njbyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfU0NPX0xJTktfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2h2Ml9wYWNrZXRzKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9IVjJfUEFDS0VUU19TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfaHYzX3BhY2tldHModm9pZCkgewotICByZXR1cm4gSENJX0hWM19QQUNLRVRTX1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19ldjNfcGFja2V0cyh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfRVNDT19FVjNfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2V2NF9wYWNrZXRzKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9FU0NPX0VWNF9TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfZXY1X3BhY2tldHModm9pZCkgewotICByZXR1cm4gSENJX0VTQ09fRVY1X1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19lc2NvXzJtX3BoeSh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfRURSX0VTQ09fMk1QU19TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfZXNjb18zbV9waHkodm9pZCkgewotICByZXR1cm4gSENJX0VEUl9FU0NPXzNNUFNfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzXzNfc2xvdF9lc2NvX2Vkcl9wYWNrZXRzKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV8zX1NMT1RfRURSX0VTQ09fU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX3JvbGVfc3dpdGNoKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9TV0lUQ0hfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2hvbGRfbW9kZSh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfSE9MRF9NT0RFX1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19zbmlmZl9tb2RlKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9TTklGRl9NT0RFX1NVUFBPUlRFRChmZWF0dXJlc19jbGFzc2ljWzBdLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19wYXJrX21vZGUodm9pZCkgewotICByZXR1cm4gSENJX1BBUktfTU9ERV9TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfbm9uX2ZsdXNoYWJsZV9wYih2b2lkKSB7Ci0gIHJldHVybiBIQ0lfTk9OX0ZMVVNIQUJMRV9QQl9TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9TTklGRl9TVUJfUkFURV9TVVBQT1JURUQoZmVhdHVyZXNfY2xhc3NpY1swXS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfZW5jcnlwdGlvbl9wYXVzZSh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfQVRPTUlDX0VOQ1JZUFRfU1VQUE9SVEVEKGZlYXR1cmVzX2NsYXNzaWNbMF0uYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZSh2b2lkKSB7IHJldHVybiBibGVfc3VwcG9ydGVkOyB9Ci0KLWJvb2wgc3VwcG9ydHNfYmxlX3ByaXZhY3kodm9pZCkgewotICByZXR1cm4gSENJX0xFX0VOSEFOQ0VEX1BSSVZBQ1lfU1VQUE9SVEVEKGZlYXR1cmVzX2JsZS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfYmxlX3NldF9wcml2YWN5X21vZGUoKSB7Ci0gIHJldHVybiBIQ0lfTEVfRU5IQU5DRURfUFJJVkFDWV9TVVBQT1JURUQoZmVhdHVyZXNfYmxlLmFzX2FycmF5KSAmJgotICAgICAgICAgSENJX0xFX1NFVF9QUklWQUNZX01PREVfU1VQUE9SVEVEKHN1cHBvcnRlZF9jb21tYW5kcyk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfYmxlX3BhY2tldF9leHRlbnNpb24odm9pZCkgewotICByZXR1cm4gSENJX0xFX0RBVEFfTEVOX0VYVF9TVVBQT1JURUQoZmVhdHVyZXNfYmxlLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3Qodm9pZCkgewotICByZXR1cm4gSENJX0xFX0NPTk5fUEFSQU1fUkVRX1NVUFBPUlRFRChmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV8ybV9waHkodm9pZCkgewotICByZXR1cm4gSENJX0xFXzJNX1BIWV9TVVBQT1JURUQoZmVhdHVyZXNfYmxlLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19ibGVfY29kZWRfcGh5KHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9MRV9DT0RFRF9QSFlfU1VQUE9SVEVEKGZlYXR1cmVzX2JsZS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfYmxlX2V4dGVuZGVkX2FkdmVydGlzaW5nKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9MRV9FWFRFTkRFRF9BRFZFUlRJU0lOR19TVVBQT1JURUQoZmVhdHVyZXNfYmxlLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmcodm9pZCkgewotICByZXR1cm4gSENJX0xFX1BFUklPRElDX0FEVkVSVElTSU5HX1NVUFBPUlRFRChmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9wZXJpcGhlcmFsX2luaXRpYXRlZF9mZWF0dXJlX2V4Y2hhbmdlKHZvaWQpIHsKLSAgcmV0dXJuIEhDSV9MRV9QRVJJUEhFUkFMX0lOSVRfRkVBVF9FWENfU1VQUE9SVEVEKGZlYXR1cmVzX2JsZS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfYmxlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyX3JlcXVlc3Qodm9pZCkgewotICByZXR1cm4gSENJX0xFX0NPTk5fUEFSQU1fUkVRX1NVUFBPUlRFRChmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3NlbmRlcih2b2lkKSB7Ci0gIHJldHVybiBIQ0lfTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9TRU5ERVIoCi0gICAgICBmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3JlY2lwaWVudCh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfTEVfUEVSSU9ESUNfQURWRVJUSVNJTkdfU1lOQ19UUkFOU0ZFUl9SRUNJUElFTlQoCi0gICAgICBmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtX2NlbnRyYWwodm9pZCkgewotICByZXR1cm4gSENJX0xFX0NJU19DRU5UUkFMKGZlYXR1cmVzX2JsZS5hc19hcnJheSk7Ci19Ci0KLWJvb2wgc3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fcGVyaXBoZXJhbCh2b2lkKSB7Ci0gIHJldHVybiBIQ0lfTEVfQ0lTX1BFUklQSEVSQUwoZmVhdHVyZXNfYmxlLmFzX2FycmF5KTsKLX0KLQotYm9vbCBzdXBwb3J0c19ibGVfaXNvY2hyb25vdXNfYnJvYWRjYXN0ZXIodm9pZCkgewotICByZXR1cm4gSENJX0xFX0lTT19CUk9BRENBU1RFUihmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi1ib29sIHN1cHBvcnRzX2JsZV9zeW5jaHJvbml6ZWRfcmVjZWl2ZXIodm9pZCkgewotICByZXR1cm4gSENJX0xFX1NZTkNIUk9OSVpFRF9SRUNFSVZFUihmZWF0dXJlc19ibGUuYXNfYXJyYXkpOwotfQotCi11aW50MTZfdCBnZXRfYWNsX2RhdGFfc2l6ZV9jbGFzc2ljKHZvaWQpIHsgcmV0dXJuIGFjbF9kYXRhX3NpemVfY2xhc3NpYzsgfQotCi11aW50MTZfdCBnZXRfYWNsX2RhdGFfc2l6ZV9ibGUodm9pZCkgeyByZXR1cm4gYWNsX2RhdGFfc2l6ZV9ibGU7IH0KLQotdWludDE2X3QgZ2V0X2lzb19kYXRhX3NpemUodm9pZCkgeyByZXR1cm4gaXNvX2RhdGFfc2l6ZTsgfQotCi11aW50MTZfdCBnZXRfYWNsX3BhY2tldF9zaXplX2NsYXNzaWModm9pZCkgewotICByZXR1cm4gYWNsX2RhdGFfc2l6ZV9jbGFzc2ljICsgSENJX0RBVEFfUFJFQU1CTEVfU0laRTsKLX0KLQotdWludDE2X3QgZ2V0X2FjbF9wYWNrZXRfc2l6ZV9ibGUodm9pZCkgewotICByZXR1cm4gYWNsX2RhdGFfc2l6ZV9ibGUgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFOwotfQotCi11aW50MTZfdCBnZXRfaXNvX3BhY2tldF9zaXplKHZvaWQpIHsKLSAgcmV0dXJuIGlzb19kYXRhX3NpemUgKyBIQ0lfREFUQV9QUkVBTUJMRV9TSVpFOwotfQotCi11aW50MTZfdCBnZXRfYmxlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoKHZvaWQpIHsKLSAgcmV0dXJuIGJsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2xlbmd0aDsKLX0KLQotdWludDE2X3QgZ2V0X2JsZV9tYXhpbXVtX3R4X2RhdGFfbGVuZ3RoKHZvaWQpIHsKLSAgcmV0dXJuIGJsZV9zdXBwb3J0ZWRfbWF4X3R4X29jdGV0czsKLX0KLQotdWludDE2X3QgZ2V0X2JsZV9tYXhpbXVtX3R4X3RpbWUodm9pZCkgeyByZXR1cm4gYmxlX3N1cHBvcnRlZF9tYXhfdHhfdGltZTsgfQotCi11aW50MTZfdCBnZXRfYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGgodm9pZCkgewotICByZXR1cm4gYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGg7Ci19Ci0KLXVpbnQ4X3QgZ2V0X2JsZV9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHModm9pZCkgewotICByZXR1cm4gYmxlX251bWJlcl9vZl9zdXBwb3J0ZWRfYWR2ZXJ0aXNpbmdfc2V0czsKLX0KLQotdWludDhfdCBnZXRfYmxlX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdF9zaXplKHZvaWQpIHsKLSAgcmV0dXJuIGJsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZTsKLX0KLQotdWludDE2X3QgZ2V0X2FjbF9idWZmZXJfY291bnRfY2xhc3NpYyh2b2lkKSB7IHJldHVybiBhY2xfYnVmZmVyX2NvdW50X2NsYXNzaWM7IH0KLQotdWludDhfdCBnZXRfYWNsX2J1ZmZlcl9jb3VudF9ibGUodm9pZCkgeyByZXR1cm4gYWNsX2J1ZmZlcl9jb3VudF9ibGU7IH0KLQotdWludDhfdCBnZXRfaXNvX2J1ZmZlcl9jb3VudCh2b2lkKSB7IHJldHVybiBpc29fYnVmZmVyX2NvdW50OyB9Ci0KLXVpbnQ4X3QgZ2V0X2JsZV9hY2NlcHRsaXN0X3NpemUodm9pZCkgeyByZXR1cm4gYmxlX2FjY2VwdGxpc3Rfc2l6ZTsgfQotCi11aW50OF90IGdldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUodm9pZCkgewotICByZXR1cm4gYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplOwotfQotCi12b2lkIHNldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUoaW50IHJlc29sdmluZ19saXN0X21heF9zaXplKSB7Ci0gIGJsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZSA9IHJlc29sdmluZ19saXN0X21heF9zaXplOwotfQotCi11aW50OF90IGdldF9sZV9hbGxfaW5pdGlhdGluZ19waHlzKCkgewotICB1aW50OF90IHBoeSA9IFBIWV9MRV8xTTsKLSAgcmV0dXJuIHBoeTsKLX0KLQotY29uc3QgY29udHJvbGxlcl90IGludGVyZmFjZSA9IHsKLSAgICBnZXRfaXNfcmVhZHksCi0KLSAgICBnZXRfYWRkcmVzcywKLSAgICBnZXRfYnRfdmVyc2lvbiwKLQotICAgIGdldF9ibGVfc3VwcG9ydGVkX3N0YXRlcywKLQotICAgIHN1cHBvcnRzX3NpbXBsZV9wYWlyaW5nLAotICAgIHN1cHBvcnRzX3NlY3VyZV9jb25uZWN0aW9ucywKLSAgICBzdXBwb3J0c19zaW11bHRhbmVvdXNfbGVfYnJlZHIsCi0gICAgc3VwcG9ydHNfcmVhZGluZ19yZW1vdGVfZXh0ZW5kZWRfZmVhdHVyZXMsCi0gICAgc3VwcG9ydHNfaW50ZXJsYWNlZF9pbnF1aXJ5X3NjYW4sCi0gICAgc3VwcG9ydHNfcnNzaV93aXRoX2lucXVpcnlfcmVzdWx0cywKLSAgICBzdXBwb3J0c19leHRlbmRlZF9pbnF1aXJ5X3Jlc3BvbnNlLAotICAgIHN1cHBvcnRzX2NlbnRyYWxfcGVyaXBoZXJhbF9yb2xlX3N3aXRjaCwKLSAgICBzdXBwb3J0c19lbmhhbmNlZF9zZXR1cF9zeW5jaHJvbm91c19jb25uZWN0aW9uLAotICAgIHN1cHBvcnRzX2VuaGFuY2VkX2FjY2VwdF9zeW5jaHJvbm91c19jb25uZWN0aW9uLAotICAgIHN1cHBvcnRzXzNfc2xvdF9wYWNrZXRzLAotICAgIHN1cHBvcnRzXzVfc2xvdF9wYWNrZXRzLAotICAgIHN1cHBvcnRzX2NsYXNzaWNfMm1fcGh5LAotICAgIHN1cHBvcnRzX2NsYXNzaWNfM21fcGh5LAotICAgIHN1cHBvcnRzXzNfc2xvdF9lZHJfcGFja2V0cywKLSAgICBzdXBwb3J0c181X3Nsb3RfZWRyX3BhY2tldHMsCi0gICAgc3VwcG9ydHNfc2NvLAotICAgIHN1cHBvcnRzX2h2Ml9wYWNrZXRzLAotICAgIHN1cHBvcnRzX2h2M19wYWNrZXRzLAotICAgIHN1cHBvcnRzX2V2M19wYWNrZXRzLAotICAgIHN1cHBvcnRzX2V2NF9wYWNrZXRzLAotICAgIHN1cHBvcnRzX2V2NV9wYWNrZXRzLAotICAgIHN1cHBvcnRzX2VzY29fMm1fcGh5LAotICAgIHN1cHBvcnRzX2VzY29fM21fcGh5LAotICAgIHN1cHBvcnRzXzNfc2xvdF9lc2NvX2Vkcl9wYWNrZXRzLAotICAgIHN1cHBvcnRzX3JvbGVfc3dpdGNoLAotICAgIHN1cHBvcnRzX2hvbGRfbW9kZSwKLSAgICBzdXBwb3J0c19zbmlmZl9tb2RlLAotICAgIHN1cHBvcnRzX3BhcmtfbW9kZSwKLSAgICBzdXBwb3J0c19ub25fZmx1c2hhYmxlX3BiLAotICAgIHN1cHBvcnRzX3NuaWZmX3N1YnJhdGluZywKLSAgICBzdXBwb3J0c19lbmNyeXB0aW9uX3BhdXNlLAotCi0gICAgc3VwcG9ydHNfYmxlLAotICAgIHN1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uLAotICAgIHN1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdCwKLSAgICBzdXBwb3J0c19ibGVfcHJpdmFjeSwKLSAgICBzdXBwb3J0c19ibGVfc2V0X3ByaXZhY3lfbW9kZSwKLSAgICBzdXBwb3J0c19ibGVfMm1fcGh5LAotICAgIHN1cHBvcnRzX2JsZV9jb2RlZF9waHksCi0gICAgc3VwcG9ydHNfYmxlX2V4dGVuZGVkX2FkdmVydGlzaW5nLAotICAgIHN1cHBvcnRzX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZywKLSAgICBzdXBwb3J0c19ibGVfcGVyaXBoZXJhbF9pbml0aWF0ZWRfZmVhdHVyZV9leGNoYW5nZSwKLSAgICBzdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJfcmVxdWVzdCwKLSAgICBzdXBwb3J0c19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9zZW5kZXIsCi0gICAgc3VwcG9ydHNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3N5bmNfdHJhbnNmZXJfcmVjaXBpZW50LAotICAgIHN1cHBvcnRzX2JsZV9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtX2NlbnRyYWwsCi0gICAgc3VwcG9ydHNfYmxlX2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW1fcGVyaXBoZXJhbCwKLSAgICBzdXBwb3J0c19ibGVfaXNvY2hyb25vdXNfYnJvYWRjYXN0ZXIsCi0gICAgc3VwcG9ydHNfYmxlX3N5bmNocm9uaXplZF9yZWNlaXZlciwKLQotICAgIGdldF9hY2xfZGF0YV9zaXplX2NsYXNzaWMsCi0gICAgZ2V0X2FjbF9kYXRhX3NpemVfYmxlLAotICAgIGdldF9pc29fZGF0YV9zaXplLAotCi0gICAgZ2V0X2FjbF9wYWNrZXRfc2l6ZV9jbGFzc2ljLAotICAgIGdldF9hY2xfcGFja2V0X3NpemVfYmxlLAotICAgIGdldF9pc29fcGFja2V0X3NpemUsCi0KLSAgICBnZXRfYmxlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfbGVuZ3RoLAotICAgIGdldF9ibGVfbWF4aW11bV90eF9kYXRhX2xlbmd0aCwKLSAgICBnZXRfYmxlX21heGltdW1fdHhfdGltZSwKLSAgICBnZXRfYmxlX21heGltdW1fYWR2ZXJ0aXNpbmdfZGF0YV9sZW5ndGgsCi0gICAgZ2V0X2JsZV9udW1iZXJfb2Zfc3VwcG9ydGVkX2FkdmVydGlzaW5nX3NldHMsCi0gICAgZ2V0X2JsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZSwKLQotICAgIGdldF9hY2xfYnVmZmVyX2NvdW50X2NsYXNzaWMsCi0gICAgZ2V0X2FjbF9idWZmZXJfY291bnRfYmxlLAotICAgIGdldF9pc29fYnVmZmVyX2NvdW50LAotCi0gICAgZ2V0X2JsZV9hY2NlcHRsaXN0X3NpemUsCi0KLSAgICBnZXRfYmxlX3Jlc29sdmluZ19saXN0X21heF9zaXplLAotICAgIHNldF9ibGVfcmVzb2x2aW5nX2xpc3RfbWF4X3NpemUsCi0gICAgZ2V0X2xvY2FsX3N1cHBvcnRlZF9jb2RlY3MsCi0gICAgZ2V0X2xlX2FsbF9pbml0aWF0aW5nX3BoeXN9OwotCi19ICAvLyBuYW1lc3BhY2UgZGV2aWNlX2NvbnRyb2xsZXIKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLWNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcl9nZXRfaW50ZXJmYWNlKCkgewotICByZXR1cm4gJnRlc3Q6Om1vY2s6OmRldmljZV9jb250cm9sbGVyOjppbnRlcmZhY2U7Ci19Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19kZXZpY2VfY29udHJvbGxlci5oIGIvdGVzdC9tb2NrL21vY2tfZGV2aWNlX2NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1NjdmNS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19kZXZpY2VfY29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL2RldmljZV9mZWF0dXJlcy5oIgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL2V2ZW50X21hc2suaCIKLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaS5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBkZXZpY2VfY29udHJvbGxlciB7Ci0KLWNvbnN0ZXhwciBzaXplX3QgSENJX1NVUFBPUlRFRF9DT01NQU5EU19BUlJBWV9TSVpFID0gNjQ7Ci1jb25zdGV4cHIgc2l6ZV90IE1BWF9GRUFUVVJFU19DTEFTU0lDX1BBR0VfQ09VTlQgPSAzOwotY29uc3RleHByIHNpemVfdCBCTEVfU1VQUE9SVEVEX1NUQVRFU19TSVpFID0gODsKLWNvbnN0ZXhwciBzaXplX3QgTUFYX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfU0laRSA9IDg7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi1leHRlcm4gdWludDhfdCBzdXBwb3J0ZWRfY29tbWFuZHNbSENJX1NVUFBPUlRFRF9DT01NQU5EU19BUlJBWV9TSVpFXTsKLWV4dGVybiBidF9kZXZpY2VfZmVhdHVyZXNfdCBmZWF0dXJlc19jbGFzc2ljW01BWF9GRUFUVVJFU19DTEFTU0lDX1BBR0VfQ09VTlRdOwotZXh0ZXJuIHVpbnQ4X3QgbGFzdF9mZWF0dXJlc19jbGFzc2ljX3BhZ2VfaW5kZXg7Ci0KLWV4dGVybiB1aW50MTZfdCBhY2xfZGF0YV9zaXplX2NsYXNzaWM7Ci1leHRlcm4gdWludDE2X3QgYWNsX2RhdGFfc2l6ZV9ibGU7Ci1leHRlcm4gdWludDE2X3QgaXNvX2RhdGFfc2l6ZTsKLQotZXh0ZXJuIHVpbnQxNl90IGFjbF9idWZmZXJfY291bnRfY2xhc3NpYzsKLWV4dGVybiB1aW50OF90IGFjbF9idWZmZXJfY291bnRfYmxlOwotZXh0ZXJuIHVpbnQ4X3QgaXNvX2J1ZmZlcl9jb3VudDsKLQotZXh0ZXJuIHVpbnQ4X3QgYmxlX2FjY2VwdGxpc3Rfc2l6ZTsKLWV4dGVybiB1aW50OF90IGJsZV9yZXNvbHZpbmdfbGlzdF9tYXhfc2l6ZTsKLWV4dGVybiB1aW50OF90IGJsZV9zdXBwb3J0ZWRfc3RhdGVzW0JMRV9TVVBQT1JURURfU1RBVEVTX1NJWkVdOwotZXh0ZXJuIGJ0X2RldmljZV9mZWF0dXJlc190IGZlYXR1cmVzX2JsZTsKLWV4dGVybiB1aW50MTZfdCBibGVfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV9sZW5ndGg7Ci1leHRlcm4gdWludDE2X3QgYmxlX3N1cHBvcnRlZF9tYXhfdHhfb2N0ZXRzOwotZXh0ZXJuIHVpbnQxNl90IGJsZV9zdXBwb3J0ZWRfbWF4X3R4X3RpbWU7Ci1leHRlcm4gdWludDE2X3QgYmxlX3N1cHBvcnRlZF9tYXhfcnhfb2N0ZXRzOwotZXh0ZXJuIHVpbnQxNl90IGJsZV9zdXBwb3J0ZWRfbWF4X3J4X3RpbWU7Ci0KLWV4dGVybiB1aW50MTZfdCBibGVfbWF4aXVtX2FkdmVydGlzaW5nX2RhdGFfbGVuZ3RoOwotZXh0ZXJuIHVpbnQ4X3QgYmxlX251bWJlcl9vZl9zdXBwb3J0ZWRfYWR2ZXJ0aXNpbmdfc2V0czsKLWV4dGVybiB1aW50OF90IGJsZV9wZXJpb2RpY19hZHZlcnRpc2VyX2xpc3Rfc2l6ZTsKLWV4dGVybiB1aW50OF90IGxvY2FsX3N1cHBvcnRlZF9jb2RlY3NbTUFYX0xPQ0FMX1NVUFBPUlRFRF9DT0RFQ1NfU0laRV07Ci1leHRlcm4gdWludDhfdCBudW1iZXJfb2ZfbG9jYWxfc3VwcG9ydGVkX2NvZGVjczsKLQotZXh0ZXJuIGJvb2wgcmVhZGFibGU7Ci1leHRlcm4gYm9vbCBibGVfc3VwcG9ydGVkOwotZXh0ZXJuIGJvb2wgaXNvX3N1cHBvcnRlZDsKLWV4dGVybiBib29sIHNpbXBsZV9wYWlyaW5nX3N1cHBvcnRlZDsKLWV4dGVybiBib29sIHNlY3VyZV9jb25uZWN0aW9uc19zdXBwb3J0ZWQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZpY2VfY29udHJvbGxlcgotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19kZXZpY2VfZXNjb19wYXJhbWV0ZXJzLmNjIGIvdGVzdC9tb2NrL21vY2tfZGV2aWNlX2VzY29fcGFyYW1ldGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0MTBmZS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19kZXZpY2VfZXNjb19wYXJhbWV0ZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX2RldmljZV9lc2NvX3BhcmFtZXRlcnMuaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgZGV2aWNlX2VzY29fcGFyYW1ldGVycyB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMgZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYzsKLQotfSAgLy8gbmFtZXNwYWNlIGRldmljZV9lc2NvX3BhcmFtZXRlcnMKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLWVuaF9lc2NvX3BhcmFtc190IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMoZXNjb19jb2RlY190IGNvZGVjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6ZGV2aWNlX2VzY29fcGFyYW1ldGVyczo6ZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyhjb2RlYyk7Ci19Ci0vLyBNb2NrZWQgZnVuY3Rpb25zIGNvbXBsZXRlCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfZGV2aWNlX2VzY29fcGFyYW1ldGVycy5oIGIvdGVzdC9tb2NrL21vY2tfZGV2aWNlX2VzY29fcGFyYW1ldGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjExNmQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2RldmljZV9lc2NvX3BhcmFtZXRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2VzY29fcGFyYW1ldGVycy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgZGV2aWNlX2VzY29fcGFyYW1ldGVycyB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjCi0vLyBQYXJhbXM6IGVzY29fY29kZWNfdCBjb2RlYwotLy8gUmV0dXJuOiBlbmhfZXNjb19wYXJhbXNfdAotc3RydWN0IGVzY29fcGFyYW1ldGVyc19mb3JfY29kZWMgewotICBlbmhfZXNjb19wYXJhbXNfdCByZXR1cm5fdmFsdWV7fTsKLSAgc3RkOjpmdW5jdGlvbjxlbmhfZXNjb19wYXJhbXNfdChlc2NvX2NvZGVjX3QgY29kZWMpPiBib2R5ewotICAgICAgW3RoaXNdKGVzY29fY29kZWNfdCBjb2RlYykgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgZW5oX2VzY29fcGFyYW1zX3Qgb3BlcmF0b3IoKShlc2NvX2NvZGVjX3QgY29kZWMpIHsgcmV0dXJuIGJvZHkoY29kZWMpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZXNjb19wYXJhbWV0ZXJzX2Zvcl9jb2RlYyBlc2NvX3BhcmFtZXRlcnNfZm9yX2NvZGVjOwotCi19ICAvLyBuYW1lc3BhY2UgZGV2aWNlX2VzY29fcGFyYW1ldGVycwotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19kZXZpY2VfaW50ZXJvcC5jYyBiL3Rlc3QvbW9jay9tb2NrX2RldmljZV9pbnRlcm9wLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZiNTNhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2RldmljZV9pbnRlcm9wLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2ludGVyb3AuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotYm9vbCBpbnRlcm9wX21hdGNoX2FkZHIoY29uc3QgaW50ZXJvcF9mZWF0dXJlX3QgZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgaW50ZXJvcF9tYXRjaF9uYW1lKGNvbnN0IGludGVyb3BfZmVhdHVyZV90IGZlYXR1cmUsIGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgaW50ZXJvcF9kYXRhYmFzZV9hZGQodWludDE2X3QgZmVhdHVyZSwgY29uc3QgUmF3QWRkcmVzcyogYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgaW50ZXJvcF9kYXRhYmFzZV9jbGVhcigpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2ZyYW1ld29ya3NfbGliYXVkaW8uY2MgYi90ZXN0L21vY2svbW9ja19mcmFtZXdvcmtzX2xpYmF1ZGlvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY1NWQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2ZyYW1ld29ya3NfbGliYXVkaW8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYwCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI3VuZGVmIF9fSU5UUk9EVUNFRF9JTgotI2RlZmluZSBfX0lOVFJPRFVDRURfSU4oeCkKLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koCi0gICAgQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYWF1ZGlvX2NvbnRlbnRfdHlwZV90IEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9fZGlyZWN0aW9uX3QgQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9faW5wdXRfcHJlc2V0X3QgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZSgKLSAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9fcG9saWN5X3QgQUF1ZGlvX2dldE1NYXBQb2xpY3koKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtKiogc3RyZWFtUHRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fY2xvc2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja2lkX3QgY2xvY2tpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGZyYW1lUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiB0aW1lTmFub3NlY29uZHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9yZWFkKEFBdWRpb1N0cmVhbSogc3RyZWFtLCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9yZWxlYXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlZEZyYW1lcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZSgKLSAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSwgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGlucHV0U3RhdGUsCi0gICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90KiBuZXh0U3RhdGUsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd3JpdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcihBQXVkaW9TdHJlYW1CdWlsZGVyKiogYnVpbGRlcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvX3NldE1NYXBQb2xpY3koYWF1ZGlvX3BvbGljeV90IHBvbGljeSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1hYXVkaW9fc2hhcmluZ19tb2RlX3QgQUF1ZGlvU3RyZWFtX2dldFNoYXJpbmdNb2RlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYWF1ZGlvX3VzYWdlX3QgQUF1ZGlvU3RyZWFtX2dldFVzYWdlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWJvb2wgQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQUF1ZGlvU3RyZWFtX2lzUHJpdmFjeVNlbnNpdGl2ZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotY29uc3QgY2hhciogQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYWF1ZGlvX3Jlc3VsdF90IHJldHVybkNvZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotY29uc3QgY2hhciogQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckRhdGFDYWxsYmFjayhBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludDY0X3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50NjRfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihBQXVkaW9TdHJlYW0qIHN0cmVhbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koCi0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuOwotfQotdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuOwotfQotdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENvbnRlbnRUeXBlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm47Ci19Ci12b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJEYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm47Ci19Ci12b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGV2aWNlSWQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm47Ci19Ci12b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZXJyb3JDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJEYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm47Ci19Ci12b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuOwotfQotdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQcml2YWN5U2Vuc2l0aXZlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByaXZhY3lTZW5zaXRpdmUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KLXZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuOwotfQotdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2hjaV9idHNub29wLmNjIGIvdGVzdC9tb2NrL21vY2tfaGNpX2J0c25vb3AuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzY1NjEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfaGNpX2J0c25vb3AuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvYnRzbm9vcC5oIgotCi1zdGF0aWMgdm9pZCBjYXB0dXJlKGNvbnN0IEJUX0hEUiosIGJvb2wpIHsgLyogZG8gbm90aGluZyAqLwotfQotCi1zdGF0aWMgdm9pZCBhbGxvd2xpc3RfbDJjX2NoYW5uZWwodWludDE2X3QsIHVpbnQxNl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KSB7IC8qIGRvIG5vdGhpbmcgKi8KLX0KLQotc3RhdGljIHZvaWQgYWxsb3dsaXN0X3JmY19kbGNpKHVpbnQxNl90LCB1aW50OF90KSB7IC8qIGRvIG5vdGhpbmcgKi8KLX0KLQotc3RhdGljIHZvaWQgYWRkX3JmY19sMmNfY2hhbm5lbCh1aW50MTZfdCwgdWludDE2X3QsIHVpbnQxNl90KSB7IC8qIGRvIG5vdGhpbmcgKi8KLX0KLQotc3RhdGljIHZvaWQgY2xlYXJfbDJjYXBfYWxsb3dsaXN0KHVpbnQxNl90LCB1aW50MTZfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCkgeyAvKiBkbyBub3RoaW5nICovCi19Ci0KLXN0YXRpYyBjb25zdCBidHNub29wX3QgZmFrZV9zbm9vcCA9IHtjYXB0dXJlLCBhbGxvd2xpc3RfbDJjX2NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dsaXN0X3JmY19kbGNpLCBhZGRfcmZjX2wyY19jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2wyY2FwX2FsbG93bGlzdH07Ci0KLWNvbnN0IGJ0c25vb3BfdCogYnRzbm9vcF9nZXRfaW50ZXJmYWNlKCkgeyByZXR1cm4gJmZha2Vfc25vb3A7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2hjaV9idHNub29wX21lbS5jYyBiL3Rlc3QvbW9jay9tb2NrX2hjaV9idHNub29wX21lbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5YTYxMi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19oY2lfYnRzbm9vcF9tZW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImhjaS9pbmNsdWRlL2J0c25vb3BfbWVtLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIGFjdGl2aXR5X2F0dHJpYnV0aW9uX3NldF9jYWxsYmFjayhhY3Rpdml0eV9hdHRyaWJ1dGlvbl9jYiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbm9vcF9tZW1fY2FwdHVyZShjb25zdCBCVF9IRFIqIHBhY2tldCwgdWludDY0X3QgdGltZXN0YW1wX3VzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNub29wX21lbV9zZXRfY2FsbGJhY2soYnRzbm9vcF9kYXRhX2NiIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfaGNpX2xheWVyLmNjIGIvdGVzdC9tb2NrL21vY2tfaGNpX2xheWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2hjaV9sYXllci5jYworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19oY2lfbGF5ZXIuaCBiL3Rlc3QvbW9jay9tb2NrX2hjaV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2hjaV9sYXllci5oCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2hjaV9wYWNrZXRfZmFjdG9yeS5jYyBiL3Rlc3QvbW9jay9tb2NrX2hjaV9wYWNrZXRfZmFjdG9yeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19oY2lfcGFja2V0X2ZhY3RvcnkuY2MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfaGNpY19oY2libGVjbWRzLmNjIGIvdGVzdC9tb2NrL21vY2tfaGNpY19oY2libGVjbWRzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTcwZjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2hjaWNfaGNpYmxlY21kcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0dS5oIgotI2luY2x1ZGUgImhjaW1zZ3MuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLXZvaWQgYnRzbmRfaGNpX2JsZV9hZGRfZGV2aWNlX3RvX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdCgKLSAgICB1aW50OF90IGFkdl9hZGRyX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkdl9hZGRyLCB1aW50OF90IGFkdl9zaWQsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaV9ibGVfY2xlYXJfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0KAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2lfYmxlX3JlYWRfcGVyaW9kaWNfYWR2ZXJ0aXNlcl9saXN0X3NpemUoCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaV9ibGVfcmVtb3ZlX2RldmljZV9mcm9tX3BlcmlvZGljX2FkdmVydGlzZXJfbGlzdCgKLSAgICB1aW50OF90IGFkdl9hZGRyX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkdl9hZGRyLCB1aW50OF90IGFkdl9zaWQsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYWNjZXB0X2Npc19yZXEodWludDE2X3QgY29ubl9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmlnX2NyZWF0ZV9zeW5jKHVpbnQ4X3QgYmlnX2hhbmRsZSwgdWludDE2X3Qgc3luY19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBiY3N0X2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbXNlLCB1aW50MTZfdCBiaWdfc3luY190aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBiaXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmlnX3Rlcm1fc3luYyh1aW50OF90IGJpZ19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfYWRkX2FjY2VwdGxpc3QoCi0gICAgdWludDhfdCBhZGRyX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfYWRkX2RldmljZV9yZXNvbHZpbmdfbGlzdCh1aW50OF90IGFkZHJfdHlwZV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIGlya19wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIGlya19sb2NhbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfY2xlYXJfYWNjZXB0bGlzdCgKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3Qodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX2NyZWF0ZV9sbF9jb25uKAotICAgIHVpbnQxNl90IHNjYW5faW50LCB1aW50MTZfdCBzY2FuX3dpbiwgdWludDhfdCBpbml0X2ZpbHRlcl9wb2xpY3ksCi0gICAgdWludDhfdCBhZGRyX3R5cGVfcGVlciwgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsIHVpbnQ4X3QgYWRkcl90eXBlX293biwKLSAgICB1aW50MTZfdCBjb25uX2ludF9taW4sIHVpbnQxNl90IGNvbm5faW50X21heCwgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgIHVpbnQxNl90IGNvbm5fdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwgdWludDE2X3QgbWF4X2NlX2xlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfZW5jcnlwdCh1aW50OF90KiBrZXksIHVpbnQ4X3Qga2V5X2xlbiwgdWludDhfdCogcGxhaW5fdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHB0X2xlbiwgdm9pZCogcF9jbWRfY3BsdF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfZW5oX3J4X3Rlc3QodWludDhfdCByeF9jaGFuLCB1aW50OF90IHBoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb2RfaW5kZXgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX2VuaF90eF90ZXN0KHVpbnQ4X3QgdHhfY2hhbiwgdWludDhfdCBkYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXlsb2FkLCB1aW50OF90IHBoeSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfZXh0X2NyZWF0ZV9jb25uKHVpbnQ4X3QgaW5pdF9maWx0ZXJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbml0aWF0aW5nX3BoeXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRfQ09OTl9QSFlfQ0ZHKiBwaHlfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9sdGtfcmVxX25lZ19yZXBseSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX2x0a19yZXFfcmVwbHkodWludDE2X3QgaGFuZGxlLCBjb25zdCBPY3RldDE2JiBsdGspIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX2NyZWF0ZV9zeW5jKAotICAgIHVpbnQ4X3Qgb3B0aW9ucywgdWludDhfdCBhZHZfc2lkLCB1aW50OF90IGFkdl9hZGRyX3R5cGUsCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWR2X2FkZHIsIHVpbnQxNl90IHNraXBfbnVtLCB1aW50MTZfdCBzeW5jX3RpbWVvdXQsCi0gICAgdWludDhfdCBzeW5jX2N0ZV90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19jcmVhdGVfc3luY19jYW5jZWwoCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3BlcmlvZGljX2FkdmVydGlzaW5nX3NldF9pbmZvX3RyYW5zZmVyKAotICAgIHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50MTZfdCBzZXJ2aWNlX2RhdGEsIHVpbnQ4X3QgYWR2X2hhbmRsZSwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2ZlcigKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDE2X3Qgc2VydmljZV9kYXRhLCB1aW50MTZfdCBzeW5jX2hhbmRsZSwKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfdGVybWluYXRlX3N5bmMoCi0gICAgdWludDE2X3Qgc3luY19oYW5kbGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9yYW5kKGJhc2U6OkNhbGxiYWNrPHZvaWQoQlRfT0NURVQ4KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfYWR2X2NobmxfdHhfcG93ZXIodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9jaG5sX21hcCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfaG9zdF9zdXBwb3J0ZWQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfcmVhZF9yZW1vdGVfZmVhdCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3JlYWRfcmVzb2x2YWJsZV9hZGRyX2xvY2FsKHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9yZWFkX3Jlc29sdmFibGVfYWRkcl9wZWVyKHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3JlY2VpdmVyX3Rlc3QodWludDhfdCByeF9mcmVxKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9yZW1vdmVfZnJvbV9hY2NlcHRsaXN0KAotICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9ybV9kZXZpY2VfcmVzb2x2aW5nX2xpc3QodWludDhfdCBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfYWRkcl9yZXNvbHV0aW9uX2VuYWJsZSh1aW50OF90IGFkZHJfcmVzb2x1dGlvbl9lbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZGF0YSh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9hZHZfZW5hYmxlKHVpbnQ4X3QgYWR2X2VuYWJsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2RhdGFfbGVuZ3RoKHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50MTZfdCB0eF9vY3RldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0eF90aW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfZGVmYXVsdF9wZXJpb2RpY19hZHZlcnRpc2luZ19zeW5jX3RyYW5zZmVyX3BhcmFtcygKLSAgICB1aW50MTZfdCBjb25uX2hhbmRsZSwgdWludDhfdCBtb2RlLCB1aW50MTZfdCBza2lwLCB1aW50MTZfdCBzeW5jX3RpbWVvdXQsCi0gICAgdWludDhfdCBjdGVfdHlwZSwgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9leHRlbmRlZF9zY2FuX2VuYWJsZSh1aW50OF90IGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmlsdGVyX2R1cGxpY2F0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBlcmlvZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2V4dGVuZGVkX3NjYW5fcGFyYW1zKHVpbnQ4X3Qgb3duX2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Nhbm5pbmdfZmlsdGVyX3BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Nhbm5pbmdfcGh5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uaW5nX3BoeV9jZmcqIHBoeV9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9ob3N0X2NobmxfY2xhc3MoCi0gICAgdWludDhfdCBjaG5sX21hcFtIQ0lDX0JMRV9DSE5MX01BUF9TSVpFXSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfc2V0X2xvY2FsX3VzZWRfZmVhdCh1aW50OF90IGZlYXRfc2V0WzhdKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfcmVjZWl2ZV9lbmFibGUoCi0gICAgdWludDE2X3Qgc3luY19oYW5kbGUsIGJvb2wgZW5hYmxlLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfcGVyaW9kaWNfYWR2ZXJ0aXNpbmdfc3luY190cmFuc2Zlcl9wYXJhbXMoCi0gICAgdWludDE2X3QgY29ubl9oYW5kbGUsIHVpbnQ4X3QgbW9kZSwgdWludDE2X3Qgc2tpcCwgdWludDE2X3Qgc3luY190aW1lb3V0LAotICAgIHVpbnQ4X3QgY3RlX3R5cGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfcHJpdmFjeV9tb2RlKHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwcml2YWN5X3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kX3ByaXZfYWRkcl90aW1lb3V0KHVpbnQxNl90IHJwYV90aW1vdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9yYW5kb21fYWRkcihjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2JsZV9zZXRfc2Nhbl9lbmFibGUodWludDhfdCBzY2FuX2VuYWJsZSwgdWludDhfdCBkdXBsaWNhdGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX3BhcmFtcyh1aW50OF90IHNjYW5fdHlwZSwgdWludDE2X3Qgc2Nhbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzY2FuX3dpbiwgdWludDhfdCBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX2ZpbHRlcl9wb2xpY3kpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3NldF9zY2FuX3JzcF9kYXRhKHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIHBfc2Nhbl9yc3ApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3N0YXJ0X2VuYyh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJhbmRbSENJQ19CTEVfUkFORF9ESV9TSVpFXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVkaXYsIGNvbnN0IE9jdGV0MTYmIGx0aykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfdGVzdF9lbmQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidHNuZF9oY2ljX2JsZV90cmFuc21pdHRlcl90ZXN0KHVpbnQ4X3QgdHhfZnJlcSwgdWludDhfdCB0ZXN0X2RhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGF5bG9hZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ibGVfdXBkX2xsX2Nvbm5fcGFyYW1zKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY29ubl9pbnRfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9pbnRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYmxlX3dyaXRlX2Fkdl9wYXJhbXModWludDE2X3QgYWR2X2ludF9taW4sIHVpbnQxNl90IGFkdl9pbnRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWR2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlX293biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGVfZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGRpcmVjdF9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkdl9maWx0ZXJfcG9saWN5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2NyZWF0ZV9iaWcodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IGFkdl9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9iaXMsIHVpbnQzMl90IHNkdV9pdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfc2R1X3NpemUsIHVpbnQxNl90IHRyYW5zcG9ydF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBydG4sIHVpbnQ4X3QgcGh5LCB1aW50OF90IHBhY2tpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGZyYW1pbmcsIHVpbnQ4X3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gYmNzdF9jb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2NyZWF0ZV9jaXModWludDhfdCBudW1fY2lzLCBjb25zdCBFWFRfQ0lTX0NSRUFURV9DRkcqIGNpc19jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX2lzb190eF9zeW5jKAotICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3Jlal9jaXNfcmVxKHVpbnQxNl90IGNvbm5faGFuZGxlLCB1aW50OF90IHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZW1vdmVfY2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcmVtb3ZlX2lzb19kYXRhX3BhdGgoCi0gICAgdWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKHVpbnQ4X3QqLCB1aW50MTZfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3JlYWRfaXNvX2xpbmtfcXVhbGl0eSgKLSAgICB1aW50MTZfdCBpc29faGFuZGxlLCBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZXFfcGVlcl9zY2EodWludDE2X3QgY29ubl9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfc2V0X2NpZ19wYXJhbXMoCi0gICAgdWludDhfdCBjaWdfaWQsIHVpbnQzMl90IHNkdV9pdHZfbXRvcywgdWludDMyX3Qgc2R1X2l0dl9zdG9tLCB1aW50OF90IHNjYSwKLSAgICB1aW50OF90IHBhY2tpbmcsIHVpbnQ4X3QgZnJhbWluZywgdWludDE2X3QgbWF4X3RyYW5zX2xhdF9zdG9tLAotICAgIHVpbnQxNl90IG1heF90cmFuc19sYXRfbXRvcywgdWludDhfdCBjaXNfY250LCBjb25zdCBFWFRfQ0lTX0NGRyogY2lzX2NmZywKLSAgICBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCh1aW50OF90KiwgdWludDE2X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19zZXR1cF9pc29fZGF0YV9wYXRoKAotICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIHVpbnQ4X3QgZGF0YV9wYXRoX2RpciwgdWludDhfdCBkYXRhX3BhdGhfaWQsCi0gICAgdWludDhfdCBjb2RlY19pZF9mb3JtYXQsIHVpbnQxNl90IGNvZGVjX2lkX2NvbXBhbnksCi0gICAgdWludDE2X3QgY29kZWNfaWRfdmVuZG9yLCB1aW50MzJfdCBjb250cm9sbGVyX2RlbGF5LAotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvZGVjX2NvbmYsCi0gICAgYmFzZTo6T25jZUNhbGxiYWNrPHZvaWQodWludDhfdCosIHVpbnQxNl90KT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfdGVybV9iaWcodWludDhfdCBiaWdfaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2hjaWNfaGNpY21kcy5jYyBiL3Rlc3QvbW9jay9tb2NrX2hjaWNfaGNpY21kcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiYjczMy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19oY2ljX2hjaWNtZHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjc3Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0dS5oIgotI2luY2x1ZGUgImhjaW1zZ3MuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBoY2ljX2hjaWNtZHMgewotCi1zdHJ1Y3QgYnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlIHsKLSAgdWludDE2X3QgaGFuZGxlezB9OwotICB1aW50MTZfdCBwYWNrZXRfdHlwZXN7MH07Ci19IGJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaWNfaGNpY21kcwotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLW5hbWVzcGFjZSBtb2NrID0gdGVzdDo6bW9jazo6aGNpY19oY2ljbWRzOwotCi0vLyBHbG9iYWwgYnkgZGVmaW5pdGlvbgotdm9pZCBidHNuZF9oY2ljX2FjY2VwdF9jb25uKGNvbnN0IFJhd0FkZHJlc3MmIGRlc3QsIHVpbnQ4X3Qgcm9sZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19hY2NlcHRfZXNjb19jb25uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFuc21pdF9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWNlaXZlX2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9sYXRlbmN5LCB1aW50MTZfdCBjb250ZW50X2ZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmV0cmFuc19lZmZvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwYWNrZXRfdHlwZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfYWRkX1NDT19jb25uKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgcGFja2V0X3R5cGVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2F1dGhfcmVxdWVzdCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHBhY2tldF90eXBlcykgewotICBtb2NrOjpidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUuaGFuZGxlID0gaGFuZGxlOwotICBtb2NrOjpidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUucGFja2V0X3R5cGVzID0gcGFja2V0X3R5cGVzOwotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19jaGFuZ2VfbmFtZShCRF9OQU1FIG5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2Nvbm4oY29uc3QgUmF3QWRkcmVzcyYgZGVzdCwgdWludDE2X3QgcGFja2V0X3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLCB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwgdWludDhfdCBhbGxvd19zd2l0Y2gpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfY3JlYXRlX2Nvbm5fY2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGRlc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfZGVsZXRlX3N0b3JlZF9rZXkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlbGV0ZV9hbGxfZmxhZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXN0YXRpYyB2b2lkIGJ0c25kX2hjaWNfZGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2VuYWJsZV90ZXN0X21vZGUodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidHNuZF9oY2ljX2VuaGFuY2VkX2FjY2VwdF9zeW5jaHJvbm91c19jb25uZWN0aW9uKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGVuaF9lc2NvX3BhcmFtc190KiBwX3BhcmFtcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19lbmhhbmNlZF9mbHVzaCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFja2V0X3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfZW5oYW5jZWRfc2V0X3VwX3N5bmNocm9ub3VzX2Nvbm5lY3Rpb24oCi0gICAgdWludDE2X3QgY29ubl9oYW5kbGUsIGVuaF9lc2NvX3BhcmFtc190KiBwX3BhcmFtcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19leGl0X3BhcmtfbW9kZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfZXhpdF9wZXJfaW5xKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRzbmRfaGNpY19leGl0X3NuaWZmX21vZGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2dldF9saW5rX3F1YWxpdHkodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2hvbGRfbW9kZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9ob2xkX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2hvbGRfcGVyaW9kKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2hvc3RfbnVtX3htaXR0ZWRfcGt0cyh1aW50OF90IG51bV9oYW5kbGVzLCB1aW50MTZfdCogaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbnVtX3BrdHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfaW5xX2NhbmNlbCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0c25kX2hjaWNfaW5xdWlyeShjb25zdCBMQVAgaW5xX2xhcCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzcG9uc2VfY250KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX2lvX2NhcF9yZXFfbmVnX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcnJfY29kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19pb19jYXBfcmVxX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb29iX3ByZXNlbnQsIHVpbnQ4X3QgYXV0aF9yZXEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfbGlua19rZXlfbmVnX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfbGlua19rZXlfcmVxX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpbmtLZXkmIGxpbmtfa2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3BhcmtfbW9kZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGJlYWNvbl9tYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJlYWNvbl9taW5faW50ZXJ2YWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcGVyX2lucV9tb2RlKHVpbnQxNl90IG1heF9wZXJpb2QsIHVpbnQxNl90IG1pbl9wZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExBUCBpbnFfbGFwLCB1aW50OF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlc3BvbnNlX2NudCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19waW5fY29kZV9uZWdfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19waW5fY29kZV9yZXFfcmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fY29kZV9sZW4sIFBJTl9DT0RFIHBpbl9jb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3Fvc19zZXR1cCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZmxhZ3MsIHVpbnQ4X3Qgc2VydmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9yYXRlLCB1aW50MzJfdCBwZWFrLCB1aW50MzJfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheV92YXIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcmVhZF9lbmNyeXB0aW9uX2tleV9zaXplKHVpbnQxNl90IGhhbmRsZSwgUmVhZEVuY0tleVNpemVDYiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXIodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3JlYWRfaW5xX3R4X3Bvd2VyKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX2xtcF9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3JlYWRfbG9jYWxfb29iX2RhdGEodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZWFkX25hbWUodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidHNuZF9oY2ljX3JlYWRfcm10X2Nsa19vZmZzZXQodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3JlYWRfcnNzaSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcmVhZF90eF9wb3dlcih1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZWplY3RfY29ubihjb25zdCBSYXdBZGRyZXNzJiBkZXN0LCB1aW50OF90IHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19yZWplY3RfZXNjb19jb25uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3JlbV9vb2JfbmVnX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcmVtX29vYl9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCBPY3RldDE2JiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ybXRfZXh0X2ZlYXR1cmVzKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYWdlX251bSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ybXRfZmVhdHVyZXNfcmVxKHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ybXRfbmFtZV9yZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYWdlX3NjYW5fcmVwX21vZGUsIHVpbnQ4X3QgcGFnZV9zY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19ybXRfbmFtZV9yZXFfY2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfcm10X3Zlcl9yZXEodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3NlbmRfa2V5cHJlc3Nfbm90aWYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBub3RpZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY19zZXRfY29ubl9lbmNyeXB0KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBlbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfc2V0X2V2ZW50X2ZpbHRlcih1aW50OF90IGZpbHRfdHlwZSwgdWludDhfdCBmaWx0X2NvbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGZpbHRfY29uZCwgdWludDhfdCBmaWx0X2NvbmRfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3NldHVwX2VzY29fY29ubih1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IHRyYW5zbWl0X2JhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVjZWl2ZV9iYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9sYXRlbmN5LCB1aW50MTZfdCB2b2ljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXRyYW5zX2VmZm9ydCwgdWludDE2X3QgcGFja2V0X3R5cGVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3NuaWZmX21vZGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfc25pZmZfcGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX3NuaWZmX3BlcmlvZCwgdWludDE2X3Qgc25pZmZfYXR0ZW1wdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNuaWZmX3RpbWVvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfc25pZmZfc3ViX3JhdGUodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9yZW1vdGVfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9sb2NhbF9sYXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfc3dpdGNoX3JvbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByb2xlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3VzZXJfY29uZl9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGlzX3llcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY191c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfdXNlcl9wYXNza2V5X3JlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90IHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3ZlbmRvcl9zcGVjX2NtZCh2b2lkKiBidWZmZXIsIHVpbnQxNl90IG9wY29kZSwgdWludDhfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdm9pZCogcF9jbWRfY3BsdF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9hdXRoX2VuYWJsZSh1aW50OF90IGZsYWcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfYXV0b19mbHVzaF90b3V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdG91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9jdXJfaWFjX2xhcCh1aW50OF90IG51bV9jdXJfaWFjLCBMQVAqIGNvbnN0IGlhY19sYXApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfZGVmX3BvbGljeV9zZXQodWludDE2X3Qgc2V0dGluZ3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfZGV2X2NsYXNzKERFVl9DTEFTUyBkZXZfY2xhc3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfZXh0X2lucXVpcnlfcmVzcG9uc2Uodm9pZCogYnVmZmVyLCB1aW50OF90IGZlY19yZXEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfaW5xc2Nhbl9jZmcodWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IHdpbmRvdykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9pbnFzY2FuX3R5cGUodWludDhfdCB0eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX2lucXVpcnlfbW9kZSh1aW50OF90IG1vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfbGlua19zdXBlcl90b3V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9wYWdlX3RvdXQodWludDE2X3QgdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9wYWdlc2Nhbl9jZmcodWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IHdpbmRvdykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9wYWdlc2Nhbl90eXBlKHVpbnQ4X3QgdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV9waW5fdHlwZSh1aW50OF90IHR5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0c25kX2hjaWNfd3JpdGVfcG9saWN5X3NldCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHNldHRpbmdzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidHNuZF9oY2ljX3dyaXRlX3NjYW5fZW5hYmxlKHVpbnQ4X3QgZmxhZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRzbmRfaGNpY193cml0ZV92b2ljZV9zZXR0aW5ncyh1aW50MTZfdCBmbGFncykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6SW50ZXJmYWNlIGludGVyZmFjZV8gPSB7Ci0gICAgLkRpc2Nvbm5lY3QgPSBidHNuZF9oY2ljX2Rpc2Nvbm5lY3QsCi0gICAgLlN0YXJ0Um9sZVN3aXRjaCA9IGJ0c25kX2hjaWNfc3dpdGNoX3JvbGUsCi0gICAgLkNoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlID0gYnRzbmRfaGNpY19jaGFuZ2VfY29ubl90eXBlLAotfTsKLQotY29uc3QgYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6SW50ZXJmYWNlJgotYmx1ZXRvb3RoOjpsZWdhY3k6OmhjaTo6R2V0SW50ZXJmYWNlKCkgewotICByZXR1cm4gaW50ZXJmYWNlXzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX2hjaWNfaGNpY21kcy5oIGIvdGVzdC9tb2NrL21vY2tfaGNpY19oY2ljbWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDE4OWIuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfaGNpY19oY2ljbWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MQotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIGhjaWNfaGNpY21kcyB7Ci0KLXN0cnVjdCBidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGUgewotICB1aW50MTZfdCBoYW5kbGU7Ci0gIHVpbnQxNl90IHBhY2tldF90eXBlczsKLX07Ci1leHRlcm4gc3RydWN0IGJ0c25kX2hjaWNfY2hhbmdlX2Nvbm5fdHlwZSBidHNuZF9oY2ljX2NoYW5nZV9jb25uX3R5cGU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoY2ljX2hjaWNtZHMKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbGVfYXVkaW9faGFsX3ZlcmlmaWVyLmNjIGIvdGVzdC9tb2NrL21vY2tfbGVfYXVkaW9faGFsX3ZlcmlmaWVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU5MTA2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX2xlX2F1ZGlvX2hhbF92ZXJpZmllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2xlX2F1ZGlvX2FwaS5oIgotCi1ib29sIExlQXVkaW9IYWxWZXJpZmllcjo6U3VwcG9ydHNMZUF1ZGlvKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19tYWluX2J0ZS5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fYnRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU3ZTBhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fYnRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjMKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX21haW5fYnRlLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgbWFpbl9idGUgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBidGVfbWFpbl9pbml0IGJ0ZV9tYWluX2luaXQ7Ci1zdHJ1Y3QgYnRlX21haW5faGNpX3NlbmQgYnRlX21haW5faGNpX3NlbmQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtYWluX2J0ZQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdm9pZCBidGVfbWFpbl9pbml0KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fYnRlOjpidGVfbWFpbl9pbml0KCk7Ci19Ci12b2lkIGJ0ZV9tYWluX2hjaV9zZW5kKEJUX0hEUiogcF9tc2csIHVpbnQxNl90IGV2ZW50KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX2J0ZTo6YnRlX21haW5faGNpX3NlbmQocF9tc2csIGV2ZW50KTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fYnRlLmggYi90ZXN0L21vY2svbW9ja19tYWluX2J0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlmMGI1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fYnRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MwotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvbW9kdWxlLmgiCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfY29uZmlnLmgiCi0jaW5jbHVkZSAiaGNpL2luY2x1ZGUvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2hjaV9sYXllci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFja19jb25maWcuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgbWFpbl9idGUgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogYnRlX21haW5faW5pdAotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRlX21haW5faW5pdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0ZV9tYWluX2luaXQgYnRlX21haW5faW5pdDsKLS8vIE5hbWU6IGJ0ZV9tYWluX2hjaV9zZW5kCi0vLyBQYXJhbXM6IEJUX0hEUiogcF9tc2csIHVpbnQxNl90IGV2ZW50Ci0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRlX21haW5faGNpX3NlbmQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQlRfSERSKiBwX21zZywgdWludDE2X3QgZXZlbnQpPiBib2R5ewotICAgICAgW10oQlRfSERSKiBwX21zZywgdWludDE2X3QgZXZlbnQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKEJUX0hEUiogcF9tc2csIHVpbnQxNl90IGV2ZW50KSB7IGJvZHkocF9tc2csIGV2ZW50KTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0ZV9tYWluX2hjaV9zZW5kIGJ0ZV9tYWluX2hjaV9zZW5kOwotCi19ICAvLyBuYW1lc3BhY2UgbWFpbl9idGUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltLmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTkzZTFjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxNAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfc2hpbSIKLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9lbnRyeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIE1PQ0tfYmx1ZXRvb3RoX3NoaW1faXNfZ2RfYWNsX2VuYWJsZWRfe2ZhbHNlfTsKLQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2FueV9nZF9lbmFibGVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FjbF9lbmFibGVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIE1PQ0tfYmx1ZXRvb3RoX3NoaW1faXNfZ2RfYWNsX2VuYWJsZWRfOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX2FkdmVydGlzaW5nX2VuYWJsZWQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2Nhbm5pbmdfZW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjppc19nZF9sMmNhcF9lbmFibGVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX3NlY3VyaXR5X2VuYWJsZWQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2Rfc2hpbV9lbmFibGVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OmlzX2dkX3N0YWNrX3N0YXJ0ZWRfdXAoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6aXNfZ2RfbGlua19wb2xpY3lfZW5hYmxlZCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWZ1dHVyZV90KiBHZW5lcmFsU2h1dERvd24oKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWZ1dHVyZV90KiBJZGxlTW9kdWxlU3RhcnRVcCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotZnV0dXJlX3QqIFNoaW1Nb2R1bGVTdGFydFVwKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fQnRpZkNvbmZpZ0ludGVyZmFjZS5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9CdGlmQ29uZmlnSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTk4ZDE3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9CdGlmQ29uZmlnSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9jb25maWcuaCIKLQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6Okhhc1NlY3Rpb24oCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6Okhhc1Byb3BlcnR5KAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHkpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6OkdldEludChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB2YWx1ZSkgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0SW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6OkdldFVpbnQ2NChjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIHZhbHVlKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpTZXRVaW50NjQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRTdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemVfYnl0ZXMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpHZXRTdHIoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6U2V0U3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6OkdldEJpbihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogbGVuZ3RoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXNpemVfdCBibHVldG9vdGg6OnNoaW06OkJ0aWZDb25maWdJbnRlcmZhY2U6OkdldEJpbkxlbmd0aCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICByZXR1cm4gMDsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpTZXRCaW4oY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpSZW1vdmVQcm9wZXJ0eSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICByZXR1cm4gZmFsc2U7Ci19Ci1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4KLWJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6R2V0UGVyc2lzdGVudERldmljZXMoKSB7Ci0gIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjoKLSAgICBDb252ZXJ0RW5jcnlwdE9yRGVjcnlwdEtleUlmTmVlZGVkKCl7fTsKLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpTYXZlKCl7fTsKLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCdGlmQ29uZmlnSW50ZXJmYWNlOjpGbHVzaCgpe307Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QnRpZkNvbmZpZ0ludGVyZmFjZTo6Q2xlYXIoKXt9OwpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2FjbC5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9hY2wuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlN2M5ZTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2FjbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo3Ci0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibGVfYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9TaHV0ZG93bigpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9hY2xfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2FjbF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGE3NGYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2FjbF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJtYWluL3NoaW0vYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9vY3RldHMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibGVfYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9DcmVhdGVDbGFzc2ljQ29ubmVjdGlvbigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfQ2FuY2VsQ2xhc3NpY0Nvbm5lY3Rpb24oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6QUNMX0FjY2VwdExlQ29ubmVjdGlvbkZyb20oCi0gICAgY29uc3QgdEJMRV9CRF9BRERSJiBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgaXNfZGlyZWN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfSWdub3JlTGVDb25uZWN0aW9uRnJvbSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGxlZ2FjeV9hZGRyZXNzX3dpdGhfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfQ29uZmlndXJlTGVQcml2YWN5KGJvb2wgaXNfbGVfcHJpdmFjeV9lbmFibGVkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9Xcml0ZURhdGEodWludDE2X3QgaGFuZGxlLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9EaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBpc19jbGFzc2ljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpBQ0xfSWdub3JlQWxsTGVDb25uZWN0aW9ucygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QUNMX1JlYWRDb25uZWN0aW9uQWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYWRkcl90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi12b2lkIGJsdWV0b290aDo6c2hpbTo6QUNMX0FkZFRvQWRkcmVzc1Jlc29sdXRpb24oCi0gICAgY29uc3QgdEJMRV9CRF9BRERSJiBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUsIGNvbnN0IE9jdGV0MTYmIHBlZXJfaXJrLAotICAgIGNvbnN0IE9jdGV0MTYmIGxvY2FsX2lyaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OkFDTF9SZW1vdmVGcm9tQWRkcmVzc1Jlc29sdXRpb24oCi0gICAgY29uc3QgdEJMRV9CRF9BRERSJiBsZWdhY3lfYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QUNMX0NsZWFyQWRkcmVzc1Jlc29sdXRpb24oKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2FjdGl2aXR5X2F0dHJpYnV0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3NDZiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY3Rpdml0eV9hdHRyaWJ1dGlvbi5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9lbnRyeS5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotQWN0aXZpdHlBdHRyaWJ1dGlvbkludGVyZmFjZSoKLWJsdWV0b290aDo6c2hpbTo6Z2V0X2FjdGl2aXR5X2F0dHJpYnV0aW9uX2luc3RhbmNlKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6aW5pdF9hY3Rpdml0eV9hdHRyaWJ1dGlvbigpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fYnRtX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9idG1fYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Y5NjcyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9idG1fYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo4NQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2UvYmluZC5oPgotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLQotI2luY2x1ZGUgIm1haW4vc2hpbS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X29jdGV0cy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL2J0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1PY3RldDE2IG9jdGV0MTY7Ci0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlRGF0YVNpZ25hdHVyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfdGV4dCwgdWludDE2X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMRV9TSUdOQVRVUkUgc2lnbmF0dXJlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZUxvY2FsUHJpdmFjeUVuYWJsZWQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVTZWN1cml0eVByb2NlZHVyZUlzUnVubmluZygKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVZlcmlmeVNpZ25hdHVyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9vcmlnLCB1aW50MTZfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jb21wKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldExlU2VjdXJpdHlTdGF0ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9sZV9kZXZfc2VjX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9sZV9rZXlfc2l6ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9IYXNFaXJTZXJ2aWNlKGNvbnN0IHVpbnQzMl90KiBwX2Vpcl91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHV1aWQxNikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkQ29ubmVjdGVkVHJhbnNwb3J0QWRkcmVzcygKLSAgICBSYXdBZGRyZXNzKiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfQ0xBU1MgZGV2X2NsYXNzLCBCRF9OQU1FIGJkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBmZWF0dXJlcywgTGlua0tleSogbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV90eXBlLCB1aW50OF90IHBpbl9sZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjQWRkUm10TmFtZU5vdGlmeUNhbGxiYWNrKAotICAgIHRCVE1fUk1UX05BTUVfQ0FMTEJBQ0sqIHBfY2FsbGJhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjRGVsZXRlRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrKAotICAgIHRCVE1fUk1UX05BTUVfQ0FMTEJBQ0sqIHBfY2FsbGJhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU2VjUmVnaXN0ZXIoY29uc3QgdEJUTV9BUFBMX0lORk8qIGJ0YV9jYWxsYmFja3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpCVE1fVXNlTGVMaW5rKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1jaGFyKiBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNSZWFkRGV2TmFtZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWNvbnN0IE9jdGV0MTYmIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZUVuY1Jvb3QoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gb2N0ZXQxNjsKLX0KLWNvbnN0IE9jdGV0MTYmIGJsdWV0b290aDo6c2hpbTo6QlRNX0dldERldmljZURISygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBvY3RldDE2OwotfQotY29uc3QgT2N0ZXQxNiYgYmx1ZXRvb3RoOjpzaGltOjpCVE1fR2V0RGV2aWNlSURSb290KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG9jdGV0MTY7Ci19Ci10QlRNX0VJUl9TRUFSQ0hfUkVTVUxUIGJsdWV0b290aDo6c2hpbTo6QlRNX0hhc0lucXVpcnlFaXJTZXJ2aWNlKAotICAgIHRCVE1fSU5RX1JFU1VMVFMqIHBfcmVzdWx0cywgdWludDE2X3QgdXVpZDE2KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVE1fSU5RX0lORk8qIGJsdWV0b290aDo6c2hpbTo6QlRNX0lucURiRmlyc3Qodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10QlRNX0lOUV9JTkZPKiBibHVldG9vdGg6OnNoaW06OkJUTV9JbnFEYk5leHQodEJUTV9JTlFfSU5GTyogcF9jdXIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEJUTV9JTlFfSU5GTyogYmx1ZXRvb3RoOjpzaGltOjpCVE1fSW5xRGJSZWFkKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZU9ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbl9zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NtcGxfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlT3Bwb3J0dW5pc3RpY09ic2VydmUoCi0gICAgYm9vbCBlbmFibGUsIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQ2xlYXJJbnFEYihjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVhZFJlbW90ZURldmljZU5hbWUoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHRCVE1fQ01QTF9DQiogY2FsbGJhY2ssCi0gICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0JvbmQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNCb25kQ2FuY2VsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX1NldENvbm5lY3RhYmlsaXR5KHVpbnQxNl90IHBhZ2VfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXREZXZpY2VDbGFzcyhERVZfQ0xBU1MgZGV2X2NsYXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXREaXNjb3ZlcmFiaWxpdHkodWludDE2X3QgZGlzY292ZXJhYmxlX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXRFbmNyeXB0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1NFQ19DQUxMQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0VDX0FDVCBzZWNfYWN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXRJbnF1aXJ5TW9kZSh1aW50OF90IGlucXVpcnlfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fU3RhcnRJbnF1aXJ5KHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY21wbF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYmx1ZXRvb3RoOjpzaGltOjpCVE1fV3JpdGVFSVIoQlRfSERSKiBwX2J1ZmYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6YnRtX3NlY19teF9hY2Nlc3NfcmVxdWVzdCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGlzX29yaWdpbmF0b3IsCi0gICAgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZW1lbnQsIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgIHZvaWQqIHBfcmVmX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXVpbnQxNl90IGJsdWV0b290aDo6c2hpbTo6QlRNX0dldEhDSUNvbm5IYW5kbGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpCVE1fSXNJbnF1aXJ5QWN0aXZlKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVHZXRTdXBwb3J0ZWRLZXlTaXplKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQWRkRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDE2X3QgdXVpZDE2KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVBZHZGaWx0ZXJQYXJhbVNldHVwKAotICAgIHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8YnRnYXR0X2ZpbHRfcGFyYW1fc2V0dXBfdD4gcF9maWx0X3BhcmFtcywKLSAgICB0QlRNX0JMRV9QRl9QQVJBTV9DQiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUoCi0gICAgdWludDhfdCBlbmFibGUsIHRCVE1fQkxFX1BGX1NUQVRVU19DQkFDSyBwX3N0YXRfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZUxvYWRMb2NhbEtleXModWludDhfdCBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9MT0NBTF9LRVlTKiBwX2tleSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlT29iRGF0YVJlcGx5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcywgdWludDhfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVJlYWRQaHkoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwgdWludDhfdCBzdGF0dXMpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlUmVjZWl2ZXJUZXN0KHVpbnQ4X3QgcnhfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90KiBwX2MsIHVpbnQ4X3QqIHBfcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlU2V0Q29ublNjYW5QYXJhbXModWludDMyX3Qgc2Nhbl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Nhbl93aW5kb3cpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVNldFBoeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHR4X3BoeXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ4X3BoeXMsIHVpbnQxNl90IHBoeV9vcHRpb25zKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVTZXRQcmVmQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fY29ubl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGVyaXBoZXJhbF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90b3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9CbGVUZXN0RW5kKHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQmxlVHJhbnNtaXR0ZXJUZXN0KHVpbnQ4X3QgdHhfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdGVzdF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFja2V0X3BheWxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY21kX2NtcGxfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0JsZVVwZGF0ZUFkdkZpbHRlclBvbGljeSh0QlRNX0JMRV9BRlAgYWR2X3BvbGljeSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fQ2FuY2VsSW5xdWlyeSh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9Db25maXJtUmVxUmVwbHkodEJUTV9TVEFUVVMgcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fRW5hYmxlSW50ZXJsYWNlZElucXVpcnlTY2FuKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fRW5hYmxlSW50ZXJsYWNlZFBhZ2VTY2FuKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fTEVfUEZfYWRkcl9maWx0ZXIodEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0JEX0FERFIgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9MRV9QRl9jbGVhcih0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fTEVfUEZfbG9jYWxfbmFtZSh0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fTEVfUEZfbWFudV9kYXRhKAotICAgIHRCVE1fQkxFX1NDQU5fQ09ORF9PUCBhY3Rpb24sIHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICB1aW50MTZfdCBjb21wYW55X2lkLCB1aW50MTZfdCBjb21wYW55X2lkX21hc2ssIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9tYXNrLCB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0xFX1BGX3NldCh0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBcGNmQ29tbWFuZD4gY29tbWFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DRkdfQ0JBQ0sgY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX0xFX1BGX3NydmNfZGF0YSh0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9MRV9QRl9zcnZjX2RhdGFfcGF0dGVybigKLSAgICB0QlRNX0JMRV9TQ0FOX0NPTkRfT1AgYWN0aW9uLCB0QlRNX0JMRV9QRl9GSUxUX0lOREVYIGZpbHRfaW5kZXgsCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9tYXNrLAotICAgIHRCVE1fQkxFX1BGX0NGR19DQkFDSyBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fTEVfUEZfdXVpZF9maWx0ZXIodEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9DT05EX1RZUEUgZmlsdGVyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfTE9HSUNfVFlQRSBjb25kX2xvZ2ljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWRfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9QSU5Db2RlUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1RBVFVTIHJlcywgdWludDhfdCBwaW5fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9waW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX1JlYWRDb25uZWN0aW9uQWRkcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgbG9jYWxfY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9SZWFkRGV2SW5mbyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfREVWSUNFX1RZUEUqIHBfZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVtb3RlT29iRGF0YVJlcGx5KHRCVE1fU1RBVFVTIHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpCVE1fUmVtb3ZlRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1dWlkMTYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0FkZEJsZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX0RFVklDRV9UWVBFIGRldl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9TZWNBZGRCbGVLZXkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1ZBTFVFKiBwX2xlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6QlRNX1NlY0NsZWFyU2VjdXJpdHlGbGFncyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkJUTV9TZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6U2VuZFJlbW90ZU5hbWVSZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYXBpX3Byb2Nlc3NfZXh0ZW5kZWRfaW5xdWlyeV9yZXN1bHQoUmF3QWRkcmVzcyByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX3JlcF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWX0NMQVNTIGRldmljZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwgaW50OF90IHJzc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBlaXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlaXJfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYXBpX3Byb2Nlc3NfaW5xdWlyeV9yZXN1bHQoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVl9DTEFTUyBkZXZpY2VfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjbG9ja19vZmZzZXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9hcGlfcHJvY2Vzc19pbnF1aXJ5X3Jlc3VsdF93aXRoX3Jzc2koUmF3QWRkcmVzcyByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhZ2Vfc2Nhbl9yZXBfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfQ0xBU1MgZGV2aWNlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNsb2NrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnNzaSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9jb250cm9sbGVyLmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2NvbnRyb2xsZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2Q1YTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2NvbnRyb2xsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWNvbnN0IGNvbnRyb2xsZXJfdCogYmx1ZXRvb3RoOjpzaGltOjpjb250cm9sbGVyX2dldF9pbnRlcmZhY2UoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBibHVldG9vdGg6OnNoaW06OmNvbnRyb2xsZXJfY2xlYXJfZXZlbnRfbWFzaygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fZHVtcHN5cy5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9kdW1wc3lzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMxZDg1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9kdW1wc3lzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBibHVldG9vdGg6OnNoaW06OlJlZ2lzdGVyRHVtcHN5c0Z1bmN0aW9uKGNvbnN0IHZvaWQqIHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXBzeXNGdW5jdGlvbiBmdW5jKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpVbnJlZ2lzdGVyRHVtcHN5c0Z1bmN0aW9uKGNvbnN0IHZvaWQqIHRva2VuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2VudHJ5LmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2VudHJ5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ5MDJkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9lbnRyeS5jYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNpbmNsdWRlICJnZC9idGFhL2FjdGl2aXR5X2F0dHJpYnV0aW9uLmgiCi0jaW5jbHVkZSAiZ2QvbW9kdWxlLmgiCi0KLSNpbmNsdWRlICJnZC9oY2kvYWNsX21hbmFnZXJfbW9jay5oIgotI2luY2x1ZGUgImdkL2hjaS9jb250cm9sbGVyX21vY2suaCIKLSNpbmNsdWRlICJnZC9oY2kvaGNpX2xheWVyLmgiCi0jaW5jbHVkZSAiZ2QvaGNpL2xlX2FkdmVydGlzaW5nX21hbmFnZXIuaCIKLSNpbmNsdWRlICJnZC9oY2kvbGVfc2Nhbm5pbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL2Nvbm5lY3RhYmlsaXR5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvZGlzY292ZXJhYmlsaXR5LmgiCi0jaW5jbHVkZSAiZ2QvbmVpZ2hib3IvaW5xdWlyeS5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL2lucXVpcnlfbW9jay5oIgotI2luY2x1ZGUgImdkL25laWdoYm9yL25hbWUuaCIKLSNpbmNsdWRlICJnZC9uZWlnaGJvci9wYWdlLmgiCi0jaW5jbHVkZSAiZ2Qvb3MvaGFuZGxlci5oIgotI2luY2x1ZGUgImdkL3NlY3VyaXR5L3NlY3VyaXR5X21vZHVsZS5oIgotI2luY2x1ZGUgImdkL3N0b3JhZ2Uvc3RvcmFnZV9tb2R1bGUuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZW50cnkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc3RhY2suaCIKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotTW9ja0FjbE1hbmFnZXIqIG1vY2tfYWNsX21hbmFnZXJfe251bGxwdHJ9OwotTW9ja0NvbnRyb2xsZXIqIG1vY2tfY29udHJvbGxlcl97bnVsbHB0cn07Ci1vczo6SGFuZGxlciogbW9ja19nZF9zaGltX2hhbmRsZXJfe251bGxwdHJ9OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGhjaQotCi1jbGFzcyBEdW1wc3lzOwotCi1uYW1lc3BhY2Ugc2hpbSB7Ci0KLUR1bXBzeXMqIEdldER1bXBzeXMoKSB7IHJldHVybiBudWxscHRyOyB9Ci1hY3Rpdml0eV9hdHRyaWJ1dGlvbjo6QWN0aXZpdHlBdHRyaWJ1dGlvbiogR2V0QWN0aXZpdHlBdHRyaWJ1dGlvbigpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1oY2k6OkFjbE1hbmFnZXIqIEdldEFjbE1hbmFnZXIoKSB7IHJldHVybiBoY2k6OnRlc3Rpbmc6Om1vY2tfYWNsX21hbmFnZXJfOyB9Ci1oY2k6OkNvbnRyb2xsZXIqIEdldENvbnRyb2xsZXIoKSB7IHJldHVybiBoY2k6OnRlc3Rpbmc6Om1vY2tfY29udHJvbGxlcl87IH0KLWhjaTo6SGNpTGF5ZXIqIEdldEhjaUxheWVyKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotaGNpOjpMZUFkdmVydGlzaW5nTWFuYWdlciogR2V0QWR2ZXJ0aXNpbmcoKSB7IHJldHVybiBudWxscHRyOyB9Ci1oY2k6OkxlU2Nhbm5pbmdNYW5hZ2VyKiBHZXRTY2FubmluZygpIHsgcmV0dXJuIG51bGxwdHI7IH0KLWhjaTo6VmVuZG9yU3BlY2lmaWNFdmVudE1hbmFnZXIqIEdldFZlbmRvclNwZWNpZmljRXZlbnRNYW5hZ2VyKCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLWwyY2FwOjpjbGFzc2ljOjpMMmNhcENsYXNzaWNNb2R1bGUqIEdldEwyY2FwQ2xhc3NpY01vZHVsZSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLWwyY2FwOjpsZTo6TDJjYXBMZU1vZHVsZSogR2V0TDJjYXBMZU1vZHVsZSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLW5laWdoYm9yOjpDb25uZWN0YWJpbGl0eU1vZHVsZSogR2V0Q29ubmVjdGFiaWxpdHkoKSB7IHJldHVybiBudWxscHRyOyB9Ci1uZWlnaGJvcjo6RGlzY292ZXJhYmlsaXR5TW9kdWxlKiBHZXREaXNjb3ZlcmFiaWxpdHkoKSB7IHJldHVybiBudWxscHRyOyB9Ci1uZWlnaGJvcjo6SW5xdWlyeU1vZHVsZSogR2V0SW5xdWlyeSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLW5laWdoYm9yOjpOYW1lTW9kdWxlKiBHZXROYW1lKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotbmVpZ2hib3I6OlBhZ2VNb2R1bGUqIEdldFBhZ2UoKSB7IHJldHVybiBudWxscHRyOyB9Ci1vczo6SGFuZGxlciogR2V0R2RTaGltSGFuZGxlcigpIHsgcmV0dXJuIGhjaTo6dGVzdGluZzo6bW9ja19nZF9zaGltX2hhbmRsZXJfOyB9Ci1zZWN1cml0eTo6U2VjdXJpdHlNb2R1bGUqIEdldFNlY3VyaXR5TW9kdWxlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQotc3RvcmFnZTo6U3RvcmFnZU1vZHVsZSogR2V0U3RvcmFnZSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9lbnRyeS5oIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2VudHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmFhNzAuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2VudHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1leHRlcm4gTW9ja0FjbE1hbmFnZXIqIG1vY2tfYWNsX21hbmFnZXJfOwotZXh0ZXJuIE1vY2tDb250cm9sbGVyKiBtb2NrX2NvbnRyb2xsZXJfOwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2hjaV9sYXllci5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9oY2lfbGF5ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzU5Y2MuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2hjaV9sYXllci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19tYWluX3NoaW1faGNpX2xheWVyLmgiCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotY29uc3QgaGNpX3QqIGJsdWV0b290aDo6c2hpbTo6aGNpX2xheWVyX2dldF9pbnRlcmZhY2UoKSB7IHJldHVybiBudWxscHRyOyB9Ci0KLS8vIGJvb2wgaGNpX2lzX3Jvb3RfaW5mbGFtbWF0aW9uX2V2ZW50X3JlY2VpdmVkKCkgeyByZXR1cm4gZmFsc2U7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9oY2lfbGF5ZXIuaCBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9oY2lfbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjOTkwYS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1faGNpX2xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjMKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgIm1haW4vc2hpbS9oY2lfbGF5ZXIuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9sMmNhcF9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbDJjYXBfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVkMDA0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9sMmNhcF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQ1Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2wyY2FwX2FwaS5oIgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgbWFpbl9zaGltX2wyY2FwX2FwaSB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IEwyQ0FfUmVhZFJlbW90ZVZlcnNpb24gTDJDQV9SZWFkUmVtb3RlVmVyc2lvbjsKLXN0cnVjdCBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlcyBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlczsKLXN0cnVjdCBMMkNBX1VzZUxlZ2FjeVNlY3VyaXR5TW9kdWxlIEwyQ0FfVXNlTGVnYWN5U2VjdXJpdHlNb2R1bGU7Ci1zdHJ1Y3QgTDJDQV9SZWdpc3RlciBMMkNBX1JlZ2lzdGVyOwotc3RydWN0IEwyQ0FfRGVyZWdpc3RlciBMMkNBX0RlcmVnaXN0ZXI7Ci1zdHJ1Y3QgTDJDQV9Db25uZWN0UmVxIEwyQ0FfQ29ubmVjdFJlcTsKLXN0cnVjdCBMMkNBX0Rpc2Nvbm5lY3RSZXEgTDJDQV9EaXNjb25uZWN0UmVxOwotc3RydWN0IEwyQ0FfRGF0YVdyaXRlIEwyQ0FfRGF0YVdyaXRlOwotc3RydWN0IEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxIEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxOwotc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxOwotc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwOwotc3RydWN0IEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkciBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHI7Ci1zdHJ1Y3QgTDJDQV9TZXRBY2xQcmlvcml0eSBMMkNBX1NldEFjbFByaW9yaXR5Owotc3RydWN0IEwyQ0FfU2V0QWNsUHJpb3JpdHkyIEwyQ0FfU2V0QWNsUHJpb3JpdHkyOwotc3RydWN0IEwyQ0FfR2V0UGVlckZlYXR1cmVzIEwyQ0FfR2V0UGVlckZlYXR1cmVzOwotc3RydWN0IEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbDsKLXN0cnVjdCBMMkNBX0Nvbm5lY3RGaXhlZENobmwgTDJDQV9Db25uZWN0Rml4ZWRDaG5sOwotc3RydWN0IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEgTDJDQV9TZW5kRml4ZWRDaG5sRGF0YTsKLXN0cnVjdCBMMkNBX1JlbW92ZUZpeGVkQ2hubCBMMkNBX1JlbW92ZUZpeGVkQ2hubDsKLXN0cnVjdCBMMkNBX0dldExlSGFuZGxlIEwyQ0FfR2V0TGVIYW5kbGU7Ci1zdHJ1Y3QgTDJDQV9MZUNvbm5lY3Rpb25VcGRhdGUgTDJDQV9MZUNvbm5lY3Rpb25VcGRhdGU7Ci1zdHJ1Y3QgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zIEwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtczsKLXN0cnVjdCBMMkNBX0dldFJlbW90ZUNpZCBMMkNBX0dldFJlbW90ZUNpZDsKLXN0cnVjdCBMMkNBX1NldFR4UHJpb3JpdHkgTDJDQV9TZXRUeFByaW9yaXR5Owotc3RydWN0IEwyQ0FfU2V0TGVHYXR0VGltZW91dCBMMkNBX1NldExlR2F0dFRpbWVvdXQ7Ci1zdHJ1Y3QgTDJDQV9TZXRDaG5sRmx1c2hhYmlsaXR5IEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eTsKLXN0cnVjdCBMMkNBX0ZsdXNoQ2hhbm5lbCBMMkNBX0ZsdXNoQ2hhbm5lbDsKLXN0cnVjdCBMMkNBX0lzTGlua0VzdGFibGlzaGVkIEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQ7Ci1zdHJ1Y3QgTDJDQV9Jc0xlTGluayBMMkNBX0lzTGVMaW5rOwotc3RydWN0IEwyQ0FfUmVhZENvbm5lY3Rpb25BZGRyIEwyQ0FfUmVhZENvbm5lY3Rpb25BZGRyOwotc3RydWN0IEwyQ0FfUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyIEwyQ0FfUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyOwotc3RydWN0IEwyQ0FfR2V0QmxlQ29ublJvbGUgTDJDQV9HZXRCbGVDb25uUm9sZTsKLXN0cnVjdCBMMkNBX0Nvbm5lY3RGb3JTZWN1cml0eSBMMkNBX0Nvbm5lY3RGb3JTZWN1cml0eTsKLXN0cnVjdCBMMkNBX1NldEJvbmRpbmdTdGF0ZSBMMkNBX1NldEJvbmRpbmdTdGF0ZTsKLXN0cnVjdCBMMkNBX0Rpc2Nvbm5lY3RMaW5rIEwyQ0FfRGlzY29ubmVjdExpbms7Ci1zdHJ1Y3QgTDJDQV9HZXROdW1MaW5rcyBMMkNBX0dldE51bUxpbmtzOwotc3RydWN0IEwyQ0FfQWxsb2NhdGVMZVBTTSBMMkNBX0FsbG9jYXRlTGVQU007Ci1zdHJ1Y3QgTDJDQV9GcmVlTGVQU00gTDJDQV9GcmVlTGVQU007Ci1zdHJ1Y3QgTDJDQV9SZWdpc3RlckxFQ29jIEwyQ0FfUmVnaXN0ZXJMRUNvYzsKLXN0cnVjdCBMMkNBX0RlcmVnaXN0ZXJMRUNvYyBMMkNBX0RlcmVnaXN0ZXJMRUNvYzsKLXN0cnVjdCBMMkNBX0Nvbm5lY3RMRUNvY1JlcSBMMkNBX0Nvbm5lY3RMRUNvY1JlcTsKLXN0cnVjdCBMMkNBX0dldFBlZXJMRUNvY0NvbmZpZyBMMkNBX0dldFBlZXJMRUNvY0NvbmZpZzsKLXN0cnVjdCBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcSBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcTsKLXN0cnVjdCBMMkNBX0xFQ29jRGF0YVdyaXRlIEwyQ0FfTEVDb2NEYXRhV3JpdGU7Ci1zdHJ1Y3QgTDJDQV9Td2l0Y2hSb2xlVG9DZW50cmFsIEwyQ0FfU3dpdGNoUm9sZVRvQ2VudHJhbDsKLQotfSAgLy8gbmFtZXNwYWNlIG1haW5fc2hpbV9sMmNhcF9hcGkKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1JlYWRSZW1vdGVWZXJzaW9uKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9SZWFkUmVtb3RlVmVyc2lvbigKLSAgICAgIGFkZHIsIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXIsIGxtcF9zdWJfdmVyc2lvbik7Ci19Ci11aW50OF90KiBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVhZFJlbW90ZUZlYXR1cmVzKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX1JlYWRSZW1vdGVGZWF0dXJlcyhhZGRyKTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1VzZUxlZ2FjeVNlY3VyaXR5TW9kdWxlKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9Vc2VMZWdhY3lTZWN1cml0eU1vZHVsZSgpOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1JlZ2lzdGVyKAotICAgIHVpbnQxNl90IGNsaWVudF9wc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIGNhbGxiYWNrcywgYm9vbCBlbmFibGVfc25vb3AsCi0gICAgdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8sIHVpbnQxNl90IG15X210dSwKLSAgICB1aW50MTZfdCByZXF1aXJlZF9yZW1vdGVfbXR1LCB1aW50MTZfdCBzZWNfbGV2ZWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX1JlZ2lzdGVyKAotICAgICAgY2xpZW50X3BzbSwgY2FsbGJhY2tzLCBlbmFibGVfc25vb3AsIHBfZXJ0bV9pbmZvLCBteV9tdHUsCi0gICAgICByZXF1aXJlZF9yZW1vdGVfbXR1LCBzZWNfbGV2ZWwpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGVyZWdpc3Rlcih1aW50MTZfdCBwc20pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfRGVyZWdpc3Rlcihwc20pOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Nvbm5lY3RSZXEodWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0Nvbm5lY3RSZXEocHNtLCByYXdfYWRkcmVzcyk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9EaXNjb25uZWN0UmVxKHVpbnQxNl90IGNpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfRGlzY29ubmVjdFJlcShjaWQpOwotfQotdWludDhfdCBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGF0YVdyaXRlKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0RhdGFXcml0ZShjaWQsIHBfZGF0YSk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBsY2lkcywKLSAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoCi0gICAgICBiZF9hZGRyLCBsY2lkcywgcF9jZmcpOwotfQotc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGJsdWV0b290aDo6c2hpbTo6TDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSZXEoCi0gICAgdWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcSgKLSAgICAgIHBzbSwgcF9iZF9hZGRyLCBwX2NmZyk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBpZCwKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLCB1aW50MTZfdCByZXN1bHQsCi0gICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwKAotICAgICAgYmRfYWRkciwgaWQsIGFjY2VwdGVkX2xjaWRzLCByZXN1bHQsIHBfY2ZnKTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoCi0gICAgICBiZF9hZGRyLCB0aW1lb3V0LCB0cmFuc3BvcnQpOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkwyQ0FfU2V0QWNsUHJpb3JpdHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfU2V0QWNsUHJpb3JpdHkyKGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRQZWVyRmVhdHVyZXMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NobmxfbWFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfR2V0UGVlckZlYXR1cmVzKAotICAgICAgYmRfYWRkciwgcF9leHRfZmVhdCwgcF9jaG5sX21hc2spOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwodWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0ZJWEVEX0NITkxfUkVHKiBwX2ZyZWcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsKGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mcmVnKTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Nvbm5lY3RGaXhlZENobmwodWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9Db25uZWN0Rml4ZWRDaG5sKGNpZCwgcmVtX2JkYSk7Ci19Ci11aW50MTZfdCBibHVldG9vdGg6OnNoaW06OkwyQ0FfU2VuZEZpeGVkQ2hubERhdGEodWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfU2VuZEZpeGVkQ2hubERhdGEoY2lkLCByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zik7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZW1vdmVGaXhlZENobmwodWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX1JlbW92ZUZpeGVkQ2hubChjaWQsIHJlbV9iZGEpOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0dldExlSGFuZGxlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0dldExlSGFuZGxlKHJlbV9iZGEpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkwyQ0FfTGVDb25uZWN0aW9uVXBkYXRlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0gICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0xlQ29ubmVjdGlvblVwZGF0ZSgKLSAgICAgIHJlbV9iZGEsIG1pbl9pbnQsIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcygKLSAgICAgIHJlbV9iZGEsIGVuYWJsZSk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9HZXRSZW1vdGVDaWQodWludDE2X3QgbGNpZCwgdWludDE2X3QqIHJjaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0dldFJlbW90ZUNpZChsY2lkLCByY2lkKTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1NldFR4UHJpb3JpdHkodWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfQ0hOTF9QUklPUklUWSBwcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfU2V0VHhQcmlvcml0eShjaWQsIHByaW9yaXR5KTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1NldExlR2F0dFRpbWVvdXQoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaWRsZV90b3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9TZXRMZUdhdHRUaW1lb3V0KHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRsZV90b3V0KTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1NldENobmxGbHVzaGFiaWxpdHkodWludDE2X3QgY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ZsdXNoYWJsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSgKLSAgICAgIGNpZCwgaXNfZmx1c2hhYmxlKTsKLX0KLXVpbnQxNl90IGJsdWV0b290aDo6c2hpbTo6TDJDQV9GbHVzaENoYW5uZWwodWludDE2X3QgbGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbnVtX3RvX2ZsdXNoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9GbHVzaENoYW5uZWwobGNpZCwgbnVtX3RvX2ZsdXNoKTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0lzTGlua0VzdGFibGlzaGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQoYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKLX0KLWJvb2wgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0lzTGVMaW5rKHVpbnQxNl90IGFjbF9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0lzTGVMaW5rKGFjbF9oYW5kbGUpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkwyQ0FfUmVhZENvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9SZWFkQ29ubmVjdGlvbkFkZHIoCi0gICAgICBwc2V1ZG9fYWRkciwgY29ubl9hZGRyLCBwX2FkZHJfdHlwZSk7Ci19Ci1ib29sIGJsdWV0b290aDo6c2hpbTo6TDJDQV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICB1aW50OF90KiBwX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKAotICAgICAgcHNldWRvX2FkZHIsIGNvbm5fYWRkciwgcF9hZGRyX3R5cGUpOwotfQotaGNpX3JvbGVfdCBibHVldG9vdGg6OnNoaW06OkwyQ0FfR2V0QmxlQ29ublJvbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfR2V0QmxlQ29ublJvbGUoYmRfYWRkcik7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Db25uZWN0Rm9yU2VjdXJpdHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9Db25uZWN0Rm9yU2VjdXJpdHkoYmRfYWRkcik7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TDJDQV9TZXRCb25kaW5nU3RhdGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2JvbmRpbmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfU2V0Qm9uZGluZ1N0YXRlKGJkX2FkZHIsIGlzX2JvbmRpbmcpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGlzY29ubmVjdExpbmsoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0Rpc2Nvbm5lY3RMaW5rKHJlbW90ZSk7Ci19Ci11aW50MTZfdCBibHVldG9vdGg6OnNoaW06OkwyQ0FfR2V0TnVtTGlua3MoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9HZXROdW1MaW5rcygpOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0FsbG9jYXRlTGVQU00oKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9BbGxvY2F0ZUxlUFNNKCk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TDJDQV9GcmVlTGVQU00odWludDE2X3QgcHNtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0ZyZWVMZVBTTShwc20pOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX1JlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfUmVnaXN0ZXJMRUNvYyhwc20sIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfbGV2ZWwsIGNmZyk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TDJDQV9EZXJlZ2lzdGVyTEVDb2ModWludDE2X3QgcHNtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbDJjYXBfYXBpOjpMMkNBX0RlcmVnaXN0ZXJMRUNvYyhwc20pOwotfQotdWludDE2X3QgYmx1ZXRvb3RoOjpzaGltOjpMMkNBX0Nvbm5lY3RMRUNvY1JlcSh1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfQ29ubmVjdExFQ29jUmVxKHBzbSwgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jZmcpOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnKHVpbnQxNl90IGNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBlZXJfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9HZXRQZWVyTEVDb2NDb25maWcoY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9jZmcpOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OkwyQ0FfRGlzY29ubmVjdExFQ29jUmVxKHVpbnQxNl90IGNpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfRGlzY29ubmVjdExFQ29jUmVxKGNpZCk7Ci19Ci11aW50OF90IGJsdWV0b290aDo6c2hpbTo6TDJDQV9MRUNvY0RhdGFXcml0ZSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2wyY2FwX2FwaTo6TDJDQV9MRUNvY0RhdGFXcml0ZShjaWQsIHBfZGF0YSk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TDJDQV9Td2l0Y2hSb2xlVG9DZW50cmFsKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9sMmNhcF9hcGk6OkwyQ0FfU3dpdGNoUm9sZVRvQ2VudHJhbChhZGRyKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9sMmNhcF9hcGkuaCBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9sMmNhcF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4ZDM3Yy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbDJjYXBfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQ1Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9kbV9hY2wuaCIKLSNpbmNsdWRlICJnZC9vcy9sb2cuaCIKLSNpbmNsdWRlICJnZC9vcy9xdWV1ZS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2VudHJ5LmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbDJjX2FwaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9ibGVfYWNsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9nYXR0X2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2NvX2hjaV9saW5rX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG1haW5fc2hpbV9sMmNhcF9hcGkgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogTDJDQV9SZWFkUmVtb3RlVmVyc2lvbgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBsbXBfdmVyc2lvbiwgdWludDE2X3QqIG1hbnVmYWN0dXJlciwKLS8vIHVpbnQxNl90KiBsbXBfc3ViX3ZlcnNpb24gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfUmVhZFJlbW90ZVZlcnNpb24gewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCogbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogbWFudWZhY3R1cmVyLCB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCogbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgIHVpbnQxNl90KiBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgIHVpbnQxNl90KiBsbXBfc3ViX3ZlcnNpb24pIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHVpbnQ4X3QqIGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QqIG1hbnVmYWN0dXJlciwgdWludDE2X3QqIGxtcF9zdWJfdmVyc2lvbikgewotICAgIHJldHVybiBib2R5KGFkZHIsIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXIsIGxtcF9zdWJfdmVyc2lvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlYWRSZW1vdGVWZXJzaW9uIEwyQ0FfUmVhZFJlbW90ZVZlcnNpb247Ci0vLyBOYW1lOiBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlcwotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBhZGRyCi0vLyBSZXR1cm5zOiB1aW50OF90Kgotc3RydWN0IEwyQ0FfUmVhZFJlbW90ZUZlYXR1cmVzIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50OF90Kihjb25zdCBSYXdBZGRyZXNzJiBhZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsgcmV0dXJuIG51bGxwdHI7IH19OwotICB1aW50OF90KiBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsgcmV0dXJuIGJvZHkoYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlcyBMMkNBX1JlYWRSZW1vdGVGZWF0dXJlczsKLS8vIE5hbWU6IEwyQ0FfVXNlTGVnYWN5U2VjdXJpdHlNb2R1bGUKLS8vIFBhcmFtczoKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMMkNBX1VzZUxlZ2FjeVNlY3VyaXR5TW9kdWxlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGJvZHl7W10oKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9Vc2VMZWdhY3lTZWN1cml0eU1vZHVsZSBMMkNBX1VzZUxlZ2FjeVNlY3VyaXR5TW9kdWxlOwotLy8gTmFtZTogTDJDQV9SZWdpc3RlcgotLy8gUGFyYW1zOiB1aW50MTZfdCBjbGllbnRfcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBjYWxsYmFja3MsIGJvb2wKLS8vIGVuYWJsZV9zbm9vcCwgdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8sIHVpbnQxNl90IG15X210dSwgdWludDE2X3QKLS8vIHJlcXVpcmVkX3JlbW90ZV9tdHUsIHVpbnQxNl90IHNlY19sZXZlbCBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfUmVnaXN0ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IGNsaWVudF9wc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV9zbm9vcCwgdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXlfbXR1LCB1aW50MTZfdCByZXF1aXJlZF9yZW1vdGVfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCk+Ci0gICAgICBib2R5e1tdKHVpbnQxNl90IGNsaWVudF9wc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLCB1aW50MTZfdCBteV9tdHUsCi0gICAgICAgICAgICAgIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsIHVpbnQxNl90IHNlY19sZXZlbCkgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDE2X3QgY2xpZW50X3BzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlX3Nub29wLCB0TDJDQVBfRVJUTV9JTkZPKiBwX2VydG1faW5mbywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKSB7Ci0gICAgcmV0dXJuIGJvZHkoY2xpZW50X3BzbSwgY2FsbGJhY2tzLCBlbmFibGVfc25vb3AsIHBfZXJ0bV9pbmZvLCBteV9tdHUsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWRfcmVtb3RlX210dSwgc2VjX2xldmVsKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfUmVnaXN0ZXIgTDJDQV9SZWdpc3RlcjsKLS8vIE5hbWU6IEwyQ0FfRGVyZWdpc3RlcgotLy8gUGFyYW1zOiB1aW50MTZfdCBwc20KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMMkNBX0RlcmVnaXN0ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgcHNtKT4gYm9keXtbXSh1aW50MTZfdCBwc20pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSkgeyBib2R5KHBzbSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0RlcmVnaXN0ZXIgTDJDQV9EZXJlZ2lzdGVyOwotLy8gTmFtZTogTDJDQV9Db25uZWN0UmVxCi0vLyBQYXJhbXM6IHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgTDJDQV9Db25uZWN0UmVxIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50MTZfdCh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MpIHsKLSAgICByZXR1cm4gYm9keShwc20sIHJhd19hZGRyZXNzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQ29ubmVjdFJlcSBMMkNBX0Nvbm5lY3RSZXE7Ci0vLyBOYW1lOiBMMkNBX0Rpc2Nvbm5lY3RSZXEKLS8vIFBhcmFtczogdWludDE2X3QgY2lkCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9EaXNjb25uZWN0UmVxIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGNpZCk+IGJvZHl7W10odWludDE2X3QgY2lkKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBjaWQpIHsgcmV0dXJuIGJvZHkoY2lkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfRGlzY29ubmVjdFJlcSBMMkNBX0Rpc2Nvbm5lY3RSZXE7Ci0vLyBOYW1lOiBMMkNBX0RhdGFXcml0ZQotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhCi0vLyBSZXR1cm5zOiB1aW50OF90Ci1zdHJ1Y3QgTDJDQV9EYXRhV3JpdGUgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIHBfZGF0YSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0RhdGFXcml0ZSBMMkNBX0RhdGFXcml0ZTsKLS8vIE5hbWU6IEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgbGNpZHMsCi0vLyB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZyk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgbGNpZHMsCi0gICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgbGNpZHMsCi0gICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRfYWRkciwgbGNpZHMsIHBfY2ZnKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxIEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxOwotLy8gTmFtZTogTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSZXEKLS8vIFBhcmFtczogdWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcKLS8vIFJldHVybnM6IHN0ZDo6dmVjdG9yPHVpbnQxNl90Pgotc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxIHsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNpZHM7Ci0gIHN0ZDo6ZnVuY3Rpb248c3RkOjp2ZWN0b3I8dWludDE2X3Q+KHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKT4KLSAgICAgIGJvZHl7W3RoaXNdKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgeyByZXR1cm4gY2lkczsgfX07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gICAgcmV0dXJuIGJvZHkocHNtLCBwX2JkX2FkZHIsIHBfY2ZnKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxOwotLy8gTmFtZTogTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JgotLy8gYWNjZXB0ZWRfbGNpZHMsIHVpbnQxNl90IHJlc3VsdCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgYWNjZXB0ZWRfbGNpZHMsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRfYWRkciwgaWQsIGFjY2VwdGVkX2xjaWRzLCByZXN1bHQsIHBfY2ZnKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwOwotLy8gTmFtZTogTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHRpbWVvdXQsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHRpbWVvdXQsCi0gICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICByZXR1cm4gYm9keShiZF9hZGRyLCB0aW1lb3V0LCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyIEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcjsKLS8vIE5hbWU6IEwyQ0FfU2V0QWNsUHJpb3JpdHkKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCBib29sIGhpZ2hfcHJpb3JpdHkKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX1NldEFjbFByaW9yaXR5IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBoaWdoX3ByaW9yaXR5KT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhhbmRsZSwgYm9vbCBoaWdoX3ByaW9yaXR5KSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBoYW5kbGUsIGJvb2wgaGlnaF9wcmlvcml0eSkgewotICAgIHJldHVybiBib2R5KGhhbmRsZSwgaGlnaF9wcmlvcml0eSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1NldEFjbFByaW9yaXR5IEwyQ0FfU2V0QWNsUHJpb3JpdHk7Ci0vLyBOYW1lOiBMMkNBX1NldEFjbFByaW9yaXR5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfU2V0QWNsUHJpb3JpdHkyIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0TDJDQVBfUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0TDJDQVBfUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgICByZXR1cm4gYm9keShiZF9hZGRyLCBwcmlvcml0eSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1NldEFjbFByaW9yaXR5MiBMMkNBX1NldEFjbFByaW9yaXR5MjsKLS8vIE5hbWU6IEwyQ0FfR2V0UGVlckZlYXR1cmVzCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LCB1aW50OF90KiBwX2NobmxfbWFzawotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfR2V0UGVlckZlYXR1cmVzIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCogcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LAotICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spIHsKLSAgICByZXR1cm4gYm9keShiZF9hZGRyLCBwX2V4dF9mZWF0LCBwX2NobmxfbWFzayk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0dldFBlZXJGZWF0dXJlcyBMMkNBX0dldFBlZXJGZWF0dXJlczsKLS8vIE5hbWU6IEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwKLS8vIFBhcmFtczogdWludDE2X3QgY2lkLCB0TDJDQVBfRklYRURfQ0hOTF9SRUcqIHBfZnJlZwotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodWludDE2X3QgY2lkLCB0TDJDQVBfRklYRURfQ0hOTF9SRUcqIHBfZnJlZyk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIHRMMkNBUF9GSVhFRF9DSE5MX1JFRyogcF9mcmVnKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBjaWQsIHRMMkNBUF9GSVhFRF9DSE5MX1JFRyogcF9mcmVnKSB7Ci0gICAgcmV0dXJuIGJvZHkoY2lkLCBwX2ZyZWcpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbCBMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsOwotLy8gTmFtZTogTDJDQV9Db25uZWN0Rml4ZWRDaG5sCi0vLyBQYXJhbXM6IHVpbnQxNl90IGNpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfQ29ubmVjdEZpeGVkQ2hubCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBjaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpPiBib2R5ewotICAgICAgW10odWludDE2X3QgY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBjaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIHJlbV9iZGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9Db25uZWN0Rml4ZWRDaG5sIEwyQ0FfQ29ubmVjdEZpeGVkQ2hubDsKLS8vIE5hbWU6IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEKLS8vIFBhcmFtczogdWludDE2X3QgY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBCVF9IRFIqIHBfYnVmCi0vLyBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IGNpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBCVF9IRFIqIHBfYnVmKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDE2X3QgY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBCVF9IRFIqIHBfYnVmKSB7Ci0gICAgcmV0dXJuIGJvZHkoY2lkLCByZW1fYmRhLCBwX2J1Zik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1NlbmRGaXhlZENobmxEYXRhIEwyQ0FfU2VuZEZpeGVkQ2hubERhdGE7Ci0vLyBOYW1lOiBMMkNBX1JlbW92ZUZpeGVkQ2hubAotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX1JlbW92ZUZpeGVkQ2hubCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBjaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpPiBib2R5ewotICAgICAgW10odWludDE2X3QgY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBjaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIHJlbV9iZGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9SZW1vdmVGaXhlZENobmwgTDJDQV9SZW1vdmVGaXhlZENobmw7Ci0vLyBOYW1lOiBMMkNBX0dldExlSGFuZGxlCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgTDJDQV9HZXRMZUhhbmRsZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDE2X3QoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7IHJldHVybiBib2R5KHJlbV9iZGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9HZXRMZUhhbmRsZSBMMkNBX0dldExlSGFuZGxlOwotLy8gTmFtZTogTDJDQV9MZUNvbm5lY3Rpb25VcGRhdGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDE2X3QgbWluX2ludCwgdWludDE2X3QgbWF4X2ludCwKLS8vIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMMkNBX0xlQ29ubmVjdGlvblVwZGF0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBtaW5faW50LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2ludCwgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4pPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBtaW5faW50LCB1aW50MTZfdCBtYXhfaW50LAotICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfY2VfbGVuKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBtaW5faW50LCB1aW50MTZfdCBtYXhfaW50LAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgICBib2R5KHJlbV9iZGEsIG1pbl9pbnQsIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9MZUNvbm5lY3Rpb25VcGRhdGUgTDJDQV9MZUNvbm5lY3Rpb25VcGRhdGU7Ci0vLyBOYW1lOiBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgYm9vbCBlbmFibGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgYm9vbCBlbmFibGUpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgYm9vbCBlbmFibGUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIGJvb2wgZW5hYmxlKSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtX2JkYSwgZW5hYmxlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXM7Ci0vLyBOYW1lOiBMMkNBX0dldFJlbW90ZUNpZAotLy8gUGFyYW1zOiB1aW50MTZfdCBsY2lkLCB1aW50MTZfdCogcmNpZAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfR2V0UmVtb3RlQ2lkIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90KiByY2lkKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90KiByY2lkKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCogcmNpZCkgeyByZXR1cm4gYm9keShsY2lkLCByY2lkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfR2V0UmVtb3RlQ2lkIEwyQ0FfR2V0UmVtb3RlQ2lkOwotLy8gTmFtZTogTDJDQV9TZXRUeFByaW9yaXR5Ci0vLyBQYXJhbXM6IHVpbnQxNl90IGNpZCwgdEwyQ0FQX0NITkxfUFJJT1JJVFkgcHJpb3JpdHkKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX1NldFR4UHJpb3JpdHkgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodWludDE2X3QgY2lkLCB0TDJDQVBfQ0hOTF9QUklPUklUWSBwcmlvcml0eSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5KSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5KSB7Ci0gICAgcmV0dXJuIGJvZHkoY2lkLCBwcmlvcml0eSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1NldFR4UHJpb3JpdHkgTDJDQV9TZXRUeFByaW9yaXR5OwotLy8gTmFtZTogTDJDQV9TZXRMZUdhdHRUaW1lb3V0Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IGlkbGVfdG91dAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfU2V0TGVHYXR0VGltZW91dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBpZGxlX3RvdXQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDE2X3QgaWRsZV90b3V0KSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBpZGxlX3RvdXQpIHsKLSAgICByZXR1cm4gYm9keShyZW1fYmRhLCBpZGxlX3RvdXQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9TZXRMZUdhdHRUaW1lb3V0IEwyQ0FfU2V0TGVHYXR0VGltZW91dDsKLS8vIE5hbWU6IEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eQotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQsIGJvb2wgaXNfZmx1c2hhYmxlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9TZXRDaG5sRmx1c2hhYmlsaXR5IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGNpZCwgYm9vbCBpc19mbHVzaGFibGUpPiBib2R5ewotICAgICAgW10odWludDE2X3QgY2lkLCBib29sIGlzX2ZsdXNoYWJsZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgY2lkLCBib29sIGlzX2ZsdXNoYWJsZSkgewotICAgIHJldHVybiBib2R5KGNpZCwgaXNfZmx1c2hhYmxlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSBMMkNBX1NldENobmxGbHVzaGFiaWxpdHk7Ci0vLyBOYW1lOiBMMkNBX0ZsdXNoQ2hhbm5lbAotLy8gUGFyYW1zOiB1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBudW1fdG9fZmx1c2gKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgTDJDQV9GbHVzaENoYW5uZWwgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IG51bV90b19mbHVzaCk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBudW1fdG9fZmx1c2gpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IG51bV90b19mbHVzaCkgewotICAgIHJldHVybiBib2R5KGxjaWQsIG51bV90b19mbHVzaCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0ZsdXNoQ2hhbm5lbCBMMkNBX0ZsdXNoQ2hhbm5lbDsKLS8vIE5hbWU6IEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0lzTGlua0VzdGFibGlzaGVkIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0lzTGlua0VzdGFibGlzaGVkIEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQ7Ci0vLyBOYW1lOiBMMkNBX0lzTGVMaW5rCi0vLyBQYXJhbXM6IHVpbnQxNl90IGFjbF9oYW5kbGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0lzTGVMaW5rIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGFjbF9oYW5kbGUpPiBib2R5ewotICAgICAgW10odWludDE2X3QgYWNsX2hhbmRsZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgYWNsX2hhbmRsZSkgeyByZXR1cm4gYm9keShhY2xfaGFuZGxlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfSXNMZUxpbmsgTDJDQV9Jc0xlTGluazsKLS8vIE5hbWU6IEwyQ0FfUmVhZENvbm5lY3Rpb25BZGRyCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsIHVpbnQ4X3QqCi0vLyBwX2FkZHJfdHlwZSBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTDJDQV9SZWFkQ29ubmVjdGlvbkFkZHIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYWRkcl90eXBlKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgdWludDhfdCogcF9hZGRyX3R5cGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2FkZHJfdHlwZSkgewotICAgIGJvZHkocHNldWRvX2FkZHIsIGNvbm5fYWRkciwgcF9hZGRyX3R5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9SZWFkQ29ubmVjdGlvbkFkZHIgTDJDQV9SZWFkQ29ubmVjdGlvbkFkZHI7Ci0vLyBOYW1lOiBMMkNBX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLCB1aW50OF90KgotLy8gcF9hZGRyX3R5cGUgUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2FkZHJfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBSYXdBZGRyZXNzJiBjb25uX2FkZHIsCi0gICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYWRkcl90eXBlKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9hZGRyX3R5cGUpIHsKLSAgICByZXR1cm4gYm9keShwc2V1ZG9fYWRkciwgY29ubl9hZGRyLCBwX2FkZHJfdHlwZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkciBMMkNBX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcjsKLS8vIE5hbWU6IEwyQ0FfR2V0QmxlQ29ublJvbGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuczogaGNpX3JvbGVfdAotc3RydWN0IEwyQ0FfR2V0QmxlQ29ublJvbGUgewotICBzdGQ6OmZ1bmN0aW9uPGhjaV9yb2xlX3QoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7IHJldHVybiBIQ0lfUk9MRV9DRU5UUkFMOyB9fTsKLSAgaGNpX3JvbGVfdCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgcmV0dXJuIGJvZHkoYmRfYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0dldEJsZUNvbm5Sb2xlIEwyQ0FfR2V0QmxlQ29ublJvbGU7Ci0vLyBOYW1lOiBMMkNBX0Nvbm5lY3RGb3JTZWN1cml0eQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTDJDQV9Db25uZWN0Rm9yU2VjdXJpdHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7IGJvZHkoYmRfYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0Nvbm5lY3RGb3JTZWN1cml0eSBMMkNBX0Nvbm5lY3RGb3JTZWN1cml0eTsKLS8vIE5hbWU6IEwyQ0FfU2V0Qm9uZGluZ1N0YXRlCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfYm9uZGluZwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEwyQ0FfU2V0Qm9uZGluZ1N0YXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfYm9uZGluZyk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGlzX2JvbmRpbmcpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIGJvb2wgaXNfYm9uZGluZykgewotICAgIGJvZHkoYmRfYWRkciwgaXNfYm9uZGluZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1NldEJvbmRpbmdTdGF0ZSBMMkNBX1NldEJvbmRpbmdTdGF0ZTsKLS8vIE5hbWU6IEwyQ0FfRGlzY29ubmVjdExpbmsKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTDJDQV9EaXNjb25uZWN0TGluayB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGUpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGUpIHsgYm9keShyZW1vdGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9EaXNjb25uZWN0TGluayBMMkNBX0Rpc2Nvbm5lY3RMaW5rOwotLy8gTmFtZTogTDJDQV9HZXROdW1MaW5rcwotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogdWludDE2X3QKLXN0cnVjdCBMMkNBX0dldE51bUxpbmtzIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50MTZfdCgpPiBib2R5e1tdKCkgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkoKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0dldE51bUxpbmtzIEwyQ0FfR2V0TnVtTGlua3M7Ci0vLyBOYW1lOiBMMkNBX0FsbG9jYXRlTGVQU00KLS8vIFBhcmFtczoKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgTDJDQV9BbGxvY2F0ZUxlUFNNIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50MTZfdCgpPiBib2R5e1tdKCkgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkoKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0FsbG9jYXRlTGVQU00gTDJDQV9BbGxvY2F0ZUxlUFNNOwotLy8gTmFtZTogTDJDQV9GcmVlTGVQU00KLS8vIFBhcmFtczogdWludDE2X3QgcHNtCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTDJDQV9GcmVlTGVQU00gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgcHNtKT4gYm9keXtbXSh1aW50MTZfdCBwc20pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSkgeyBib2R5KHBzbSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0ZyZWVMZVBTTSBMMkNBX0ZyZWVMZVBTTTsKLS8vIE5hbWU6IEwyQ0FfUmVnaXN0ZXJMRUNvYwotLy8gUGFyYW1zOiB1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIGNhbGxiYWNrcywgdWludDE2X3Qgc2VjX2xldmVsLAotLy8gdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfUmVnaXN0ZXJMRUNvYyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDE2X3QodWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsLCB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnKT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCwgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZykgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsLCB0TDJDQVBfTEVfQ0ZHX0lORk8gY2ZnKSB7Ci0gICAgcmV0dXJuIGJvZHkocHNtLCBjYWxsYmFja3MsIHNlY19sZXZlbCwgY2ZnKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfUmVnaXN0ZXJMRUNvYyBMMkNBX1JlZ2lzdGVyTEVDb2M7Ci0vLyBOYW1lOiBMMkNBX0RlcmVnaXN0ZXJMRUNvYwotLy8gUGFyYW1zOiB1aW50MTZfdCBwc20KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMMkNBX0RlcmVnaXN0ZXJMRUNvYyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBwc20pPiBib2R5e1tdKHVpbnQxNl90IHBzbSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgcHNtKSB7IGJvZHkocHNtKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfRGVyZWdpc3RlckxFQ29jIEwyQ0FfRGVyZWdpc3RlckxFQ29jOwotLy8gTmFtZTogTDJDQV9Db25uZWN0TEVDb2NSZXEKLS8vIFBhcmFtczogdWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgTDJDQV9Db25uZWN0TEVDb2NSZXEgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICAgIHJldHVybiBib2R5KHBzbSwgcF9iZF9hZGRyLCBwX2NmZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0Nvbm5lY3RMRUNvY1JlcSBMMkNBX0Nvbm5lY3RMRUNvY1JlcTsKLS8vIE5hbWU6IEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnCi0vLyBQYXJhbXM6IHVpbnQxNl90IGNpZCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZwotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGNpZCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZyk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZykgewotICAgIHJldHVybiBib2R5KGNpZCwgcGVlcl9jZmcpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9HZXRQZWVyTEVDb2NDb25maWcgTDJDQV9HZXRQZWVyTEVDb2NDb25maWc7Ci0vLyBOYW1lOiBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcQotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBjaWQpPiBib2R5e1tdKHVpbnQxNl90IGNpZCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgY2lkKSB7IHJldHVybiBib2R5KGNpZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcSBMMkNBX0Rpc2Nvbm5lY3RMRUNvY1JlcTsKLS8vIE5hbWU6IEwyQ0FfTEVDb2NEYXRhV3JpdGUKLS8vIFBhcmFtczogdWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YQotLy8gUmV0dXJuczogdWludDhfdAotc3RydWN0IEwyQ0FfTEVDb2NEYXRhV3JpdGUgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIHBfZGF0YSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0xFQ29jRGF0YVdyaXRlIEwyQ0FfTEVDb2NEYXRhV3JpdGU7Ci0vLyBOYW1lOiBMMkNBX1N3aXRjaFJvbGVUb0NlbnRyYWwKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYWRkcgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEwyQ0FfU3dpdGNoUm9sZVRvQ2VudHJhbCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsgYm9keShhZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU3dpdGNoUm9sZVRvQ2VudHJhbCBMMkNBX1N3aXRjaFJvbGVUb0NlbnRyYWw7Ci0KLX0gIC8vIG5hbWVzcGFjZSBtYWluX3NoaW1fbDJjYXBfYXBpCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9sZV9hZHZlcnRpc2luZ19tYW5hZ2VyLmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjJjZWUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2xlX2FkdmVydGlzaW5nX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9jb21tb24uaCIKLSNpbmNsdWRlICJnZC9jb21tb24vaW5pdF9mbGFncy5oIgotI2luY2x1ZGUgImluY2x1ZGUvaGFyZHdhcmUvYmxlX2FkdmVydGlzZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbGVfYWR2ZXJ0aXNpbmdfbWFuYWdlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYmxlX2FkdmVydGlzZXIuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLUJsZUFkdmVydGlzZXJJbnRlcmZhY2UqIGJsdWV0b290aDo6c2hpbTo6Z2V0X2JsZV9hZHZlcnRpc2VyX2luc3RhbmNlKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6aW5pdF9hZHZlcnRpc2luZ19tYW5hZ2VyKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9sZV9zY2FubmluZ19tYW5hZ2VyLmNjIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2xlX3NjYW5uaW5nX21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDllYTMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2xlX3NjYW5uaW5nX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2hhcmR3YXJlL2JsZV9zY2FubmVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2xlX3NjYW5uaW5nX21hbmFnZXIuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLUJsZVNjYW5uZXJJbnRlcmZhY2UqIGJsdWV0b290aDo6c2hpbTo6Z2V0X2JsZV9zY2FubmVyX2luc3RhbmNlKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6aW5pdF9zY2FubmluZ19tYW5hZ2VyKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9saW5rX3BvbGljeS5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9saW5rX3BvbGljeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiNGJiYi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbGlua19wb2xpY3kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEwCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2xpbmtfcG9saWN5LmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgbWFpbl9zaGltX2xpbmtfcG9saWN5IHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3Qgc2V0X2FjdGl2ZV9tb2RlIHNldF9hY3RpdmVfbW9kZTsKLXN0cnVjdCBzZXRfaG9sZF9tb2RlIHNldF9ob2xkX21vZGU7Ci1zdHJ1Y3Qgc2V0X3NuaWZmX21vZGUgc2V0X3NuaWZmX21vZGU7Ci1zdHJ1Y3QgY29udHJvbGxlcl9zdXBwb3J0c19saW5rX3BvbGljeV9tb2RlCi0gICAgY29udHJvbGxlcl9zdXBwb3J0c19saW5rX3BvbGljeV9tb2RlOwotc3RydWN0IFJlZ2lzdGVyTGlua1BvbGljeUNsaWVudCBSZWdpc3RlckxpbmtQb2xpY3lDbGllbnQ7Ci1zdHJ1Y3QgVW5yZWdpc3RlckxpbmtQb2xpY3lDbGllbnQgVW5yZWdpc3RlckxpbmtQb2xpY3lDbGllbnQ7Ci1zdHJ1Y3QgQlRNX1NldFBvd2VyTW9kZSBCVE1fU2V0UG93ZXJNb2RlOwotc3RydWN0IGJ0bV9wbV9vbl9tb2RlX2NoYW5nZSBidG1fcG1fb25fbW9kZV9jaGFuZ2U7Ci1zdHJ1Y3QgQlRNX1NldFNzclBhcmFtcyBCVE1fU2V0U3NyUGFyYW1zOwotc3RydWN0IGJ0bV9wbV9vbl9zbmlmZl9zdWJyYXRpbmcgYnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZzsKLQotfSAgLy8gbmFtZXNwYWNlIG1haW5fc2hpbV9saW5rX3BvbGljeQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdEJUTV9TVEFUVVMgc2V0X2FjdGl2ZV9tb2RlKHRBQ0xfQ09OTiYgcF9hY2wpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbGlua19wb2xpY3k6OnNldF9hY3RpdmVfbW9kZShwX2FjbCk7Ci19Ci10QlRNX1NUQVRVUyBzZXRfaG9sZF9tb2RlKHRBQ0xfQ09OTiYgcF9hY2wsIHVpbnQxNl90IG1heCwgdWludDE2X3QgbWluKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2xpbmtfcG9saWN5OjpzZXRfaG9sZF9tb2RlKHBfYWNsLCBtYXgsIG1pbik7Ci19Ci10QlRNX1NUQVRVUyBzZXRfc25pZmZfbW9kZSh0QUNMX0NPTk4mIHBfYWNsLCB1aW50MTZfdCBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5faW50ZXJ2YWwsIHVpbnQxNl90IGF0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2xpbmtfcG9saWN5OjpzZXRfc25pZmZfbW9kZSgKLSAgICAgIHBfYWNsLCBtYXhfaW50ZXJ2YWwsIG1pbl9pbnRlcnZhbCwgYXR0ZW1wdCwgdGltZW91dCk7Ci19Ci1ib29sIGNvbnRyb2xsZXJfc3VwcG9ydHNfbGlua19wb2xpY3lfbW9kZShjb25zdCB0QlRNX1BNX01PREUmIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVyb3BfY2hlY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbGlua19wb2xpY3k6OgotICAgICAgY29udHJvbGxlcl9zdXBwb3J0c19saW5rX3BvbGljeV9tb2RlKG1vZGUsIGludGVyb3BfY2hlY2spOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OlJlZ2lzdGVyTGlua1BvbGljeUNsaWVudCh0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9saW5rX3BvbGljeTo6UmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50KHBfY2IpOwotfQotYm9vbCBibHVldG9vdGg6OnNoaW06OlVucmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50KHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2xpbmtfcG9saWN5OjpVbnJlZ2lzdGVyTGlua1BvbGljeUNsaWVudChwX2NiKTsKLX0KLXRCVE1fU1RBVFVTIGJsdWV0b290aDo6c2hpbTo6QlRNX1NldFBvd2VyTW9kZSh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEJUTV9QTV9QV1JfTUQmIG5ld19tb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6bWFpbl9zaGltX2xpbmtfcG9saWN5OjpCVE1fU2V0UG93ZXJNb2RlKGhhbmRsZSwgbmV3X21vZGUpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OmJ0bV9wbV9vbl9tb2RlX2NoYW5nZSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGhjaV9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX2xpbmtfcG9saWN5OjpidG1fcG1fb25fbW9kZV9jaGFuZ2Uoc3RhdHVzLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaV9tb2RlLCBpbnRlcnZhbCk7Ci19Ci10QlRNX1NUQVRVUyBibHVldG9vdGg6OnNoaW06OkJUTV9TZXRTc3JQYXJhbXModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2xvY190bykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9saW5rX3BvbGljeTo6QlRNX1NldFNzclBhcmFtcygKLSAgICAgIGhhbmRsZSwgbWF4X2xhdCwgbWluX3JtdF90bywgbWluX2xvY190byk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6YnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZygKLSAgICB0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LAotICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX2xpbmtfcG9saWN5OjpidG1fcG1fb25fc25pZmZfc3VicmF0aW5nKAotICAgICAgc3RhdHVzLCBoYW5kbGUsIG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICBtaW5pbXVtX3JlbW90ZV90aW1lb3V0LCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX2xpbmtfcG9saWN5LmggYi90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbGlua19wb2xpY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxZmZmNy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbGlua19wb2xpY3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTAKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgImdkL21vZHVsZS5oIgotI2luY2x1ZGUgImhjaS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9saW5rX3BvbGljeS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zdGFjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgbWFpbl9zaGltX2xpbmtfcG9saWN5IHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IHNldF9hY3RpdmVfbW9kZQotLy8gUGFyYW1zOiB0QUNMX0NPTk4mIHBfYWNsCi0vLyBSZXR1cm5zOiB0QlRNX1NUQVRVUwotc3RydWN0IHNldF9hY3RpdmVfbW9kZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVModEFDTF9DT05OJiBwX2FjbCk+IGJvZHl7Ci0gICAgICBbXSh0QUNMX0NPTk4mIHBfYWNsKSB7IHJldHVybiAwOyB9fTsKLSAgdEJUTV9TVEFUVVMgb3BlcmF0b3IoKSh0QUNMX0NPTk4mIHBfYWNsKSB7IHJldHVybiBib2R5KHBfYWNsKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNldF9hY3RpdmVfbW9kZSBzZXRfYWN0aXZlX21vZGU7Ci0vLyBOYW1lOiBzZXRfaG9sZF9tb2RlCi0vLyBQYXJhbXM6IHRBQ0xfQ09OTiYgcF9hY2wsIHVpbnQxNl90IG1heCwgdWludDE2X3QgbWluCi0vLyBSZXR1cm5zOiB0QlRNX1NUQVRVUwotc3RydWN0IHNldF9ob2xkX21vZGUgewotICBzdGQ6OmZ1bmN0aW9uPHRCVE1fU1RBVFVTKHRBQ0xfQ09OTiYgcF9hY2wsIHVpbnQxNl90IG1heCwgdWludDE2X3QgbWluKT4gYm9keXsKLSAgICAgIFtdKHRBQ0xfQ09OTiYgcF9hY2wsIHVpbnQxNl90IG1heCwgdWludDE2X3QgbWluKSB7IHJldHVybiAwOyB9fTsKLSAgdEJUTV9TVEFUVVMgb3BlcmF0b3IoKSh0QUNMX0NPTk4mIHBfYWNsLCB1aW50MTZfdCBtYXgsIHVpbnQxNl90IG1pbikgewotICAgIHJldHVybiBib2R5KHBfYWNsLCBtYXgsIG1pbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzZXRfaG9sZF9tb2RlIHNldF9ob2xkX21vZGU7Ci0vLyBOYW1lOiBzZXRfc25pZmZfbW9kZQotLy8gUGFyYW1zOiB0QUNMX0NPTk4mIHBfYWNsLCB1aW50MTZfdCBtYXhfaW50ZXJ2YWwsIHVpbnQxNl90IG1pbl9pbnRlcnZhbCwKLS8vIHVpbnQxNl90IGF0dGVtcHQsIHVpbnQxNl90IHRpbWVvdXQgUmV0dXJuczogdEJUTV9TVEFUVVMKLXN0cnVjdCBzZXRfc25pZmZfbW9kZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVModEFDTF9DT05OJiBwX2FjbCwgdWludDE2X3QgbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9pbnRlcnZhbCwgdWludDE2X3QgYXR0ZW1wdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0aW1lb3V0KT4KLSAgICAgIGJvZHl7W10odEFDTF9DT05OJiBwX2FjbCwgdWludDE2X3QgbWF4X2ludGVydmFsLCB1aW50MTZfdCBtaW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGF0dGVtcHQsIHVpbnQxNl90IHRpbWVvdXQpIHsgcmV0dXJuIDA7IH19OwotICB0QlRNX1NUQVRVUyBvcGVyYXRvcigpKHRBQ0xfQ09OTiYgcF9hY2wsIHVpbnQxNl90IG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5faW50ZXJ2YWwsIHVpbnQxNl90IGF0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCkgewotICAgIHJldHVybiBib2R5KHBfYWNsLCBtYXhfaW50ZXJ2YWwsIG1pbl9pbnRlcnZhbCwgYXR0ZW1wdCwgdGltZW91dCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzZXRfc25pZmZfbW9kZSBzZXRfc25pZmZfbW9kZTsKLS8vIE5hbWU6IGNvbnRyb2xsZXJfc3VwcG9ydHNfbGlua19wb2xpY3lfbW9kZQotLy8gUGFyYW1zOiBjb25zdCB0QlRNX1BNX01PREUmIG1vZGUsIGJvb2wgaW50ZXJvcF9jaGVjawotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGNvbnRyb2xsZXJfc3VwcG9ydHNfbGlua19wb2xpY3lfbW9kZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCB0QlRNX1BNX01PREUmIG1vZGUsIGJvb2wgaW50ZXJvcF9jaGVjayk+IGJvZHl7Ci0gICAgICBbXShjb25zdCB0QlRNX1BNX01PREUmIG1vZGUsIGJvb2wgaW50ZXJvcF9jaGVjaykgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgdEJUTV9QTV9NT0RFJiBtb2RlLCBib29sIGludGVyb3BfY2hlY2spIHsKLSAgICByZXR1cm4gYm9keShtb2RlLCBpbnRlcm9wX2NoZWNrKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbnRyb2xsZXJfc3VwcG9ydHNfbGlua19wb2xpY3lfbW9kZQotICAgIGNvbnRyb2xsZXJfc3VwcG9ydHNfbGlua19wb2xpY3lfbW9kZTsKLS8vIE5hbWU6IGJsdWV0b290aDo6c2hpbTo6UmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50Ci0vLyBQYXJhbXM6IHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgUmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiKT4gYm9keXsKLSAgICAgIFtdKHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYikgeyByZXR1cm4gYm9keShwX2NiKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IFJlZ2lzdGVyTGlua1BvbGljeUNsaWVudCBSZWdpc3RlckxpbmtQb2xpY3lDbGllbnQ7Ci0vLyBOYW1lOiBibHVldG9vdGg6OnNoaW06OlVucmVnaXN0ZXJMaW5rUG9saWN5Q2xpZW50Ci0vLyBQYXJhbXM6IHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgVW5yZWdpc3RlckxpbmtQb2xpY3lDbGllbnQgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodEJUTV9QTV9TVEFUVVNfQ0JBQ0sqIHBfY2IpPiBib2R5ewotICAgICAgW10odEJUTV9QTV9TVEFUVVNfQ0JBQ0sqIHBfY2IpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHRCVE1fUE1fU1RBVFVTX0NCQUNLKiBwX2NiKSB7IHJldHVybiBib2R5KHBfY2IpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgVW5yZWdpc3RlckxpbmtQb2xpY3lDbGllbnQgVW5yZWdpc3RlckxpbmtQb2xpY3lDbGllbnQ7Ci0vLyBOYW1lOiBibHVldG9vdGg6OnNoaW06OkJUTV9TZXRQb3dlck1vZGUKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCBjb25zdCB0QlRNX1BNX1BXUl9NRCYgbmV3X21vZGUKLS8vIFJldHVybnM6IHRCVE1fU1RBVFVTCi1zdHJ1Y3QgQlRNX1NldFBvd2VyTW9kZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVModWludDE2X3QgaGFuZGxlLCBjb25zdCB0QlRNX1BNX1BXUl9NRCYgbmV3X21vZGUpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IHRCVE1fUE1fUFdSX01EJiBuZXdfbW9kZSkgeyByZXR1cm4gMDsgfX07Ci0gIHRCVE1fU1RBVFVTIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlLCBjb25zdCB0QlRNX1BNX1BXUl9NRCYgbmV3X21vZGUpIHsKLSAgICByZXR1cm4gYm9keShoYW5kbGUsIG5ld19tb2RlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9TZXRQb3dlck1vZGUgQlRNX1NldFBvd2VyTW9kZTsKLS8vIE5hbWU6IGJsdWV0b290aDo6c2hpbTo6YnRtX3BtX29uX21vZGVfY2hhbmdlCi0vLyBQYXJhbXM6IHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB0SENJX01PREUgaGNpX21vZGUsIHVpbnQxNl90Ci0vLyBpbnRlcnZhbCBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3BtX29uX21vZGVfY2hhbmdlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB0SENJX01PREUgaGNpX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCk+Ci0gICAgICBib2R5e1tdKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB0SENJX01PREUgaGNpX21vZGUsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9NT0RFIGhjaV9tb2RlLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwpIHsKLSAgICBib2R5KHN0YXR1cywgaGFuZGxlLCBoY2lfbW9kZSwgaW50ZXJ2YWwpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3BtX29uX21vZGVfY2hhbmdlIGJ0bV9wbV9vbl9tb2RlX2NoYW5nZTsKLS8vIE5hbWU6IGJsdWV0b290aDo6c2hpbTo6QlRNX1NldFNzclBhcmFtcwotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9sYXQsIHVpbnQxNl90IG1pbl9ybXRfdG8sIHVpbnQxNl90Ci0vLyBtaW5fbG9jX3RvIFJldHVybnM6IHRCVE1fU1RBVFVTCi1zdHJ1Y3QgQlRNX1NldFNzclBhcmFtcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBtYXhfbGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sIHVpbnQxNl90IG1pbl9sb2NfdG8pPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heF9sYXQsIHVpbnQxNl90IG1pbl9ybXRfdG8sCi0gICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9sb2NfdG8pIHsgcmV0dXJuIDA7IH19OwotICB0QlRNX1NUQVRVUyBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbWF4X2xhdCwgdWludDE2X3QgbWluX3JtdF90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5fbG9jX3RvKSB7Ci0gICAgcmV0dXJuIGJvZHkoaGFuZGxlLCBtYXhfbGF0LCBtaW5fcm10X3RvLCBtaW5fbG9jX3RvKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9TZXRTc3JQYXJhbXMgQlRNX1NldFNzclBhcmFtczsKLS8vIE5hbWU6IGJsdWV0b290aDo6c2hpbTo6YnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZwotLy8gUGFyYW1zOiAgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90Ci0vLyBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksIFVOVVNFRF9BVFRSIHVpbnQxNl90IG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotLy8gdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0IFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcG1fb25fc25pZmZfc3VicmF0aW5nIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKAotICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgICAgdWludDE2X3QgbWluaW11bV9yZW1vdGVfdGltZW91dCwgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KT4KLSAgICAgIGJvZHl7W10odEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgIHVpbnQxNl90IG1heGltdW1fdHJhbnNtaXRfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX2xhdGVuY3ksCi0gICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fbG9jYWxfdGltZW91dCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBtYXhpbXVtX3JlY2VpdmVfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2xvY2FsX3RpbWVvdXQpIHsKLSAgICBib2R5KHN0YXR1cywgaGFuZGxlLCBtYXhpbXVtX3RyYW5zbWl0X2xhdGVuY3ksIG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgICAgICAgbWluaW11bV9yZW1vdGVfdGltZW91dCwgbWluaW11bV9sb2NhbF90aW1lb3V0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9wbV9vbl9zbmlmZl9zdWJyYXRpbmcgYnRtX3BtX29uX3NuaWZmX3N1YnJhdGluZzsKLQotfSAgLy8gbmFtZXNwYWNlIG1haW5fc2hpbV9saW5rX3BvbGljeQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbWV0cmljX2lkX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9tZXRyaWNfaWRfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzVlM2Y0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9tZXRyaWNfaWRfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjcKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSAiZ2QvY29tbW9uL21ldHJpY19pZF9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL21ldHJpY19pZF9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBzaGltIHsKLQotYm9vbCBJbml0TWV0cmljSWRBbGxvY2F0b3IoCi0gICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPFJhd0FkZHJlc3MsIGludD4mIHBhaXJlZF9kZXZpY2VfbWFwLAotICAgIENhbGxiYWNrTGVnYWN5IHNhdmVfaWRfY2FsbGJhY2ssIENhbGxiYWNrTGVnYWN5IGZvcmdldF9kZXZpY2VfY2FsbGJhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQ2xvc2VNZXRyaWNJZEFsbG9jYXRvcigpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgSXNFbXB0eU1ldHJpY0lkQWxsb2NhdG9yKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBJc1ZhbGlkSWRGcm9tTWV0cmljSWRBbGxvY2F0b3IoY29uc3QgaW50IGlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFNhdmVEZXZpY2VPbk1ldHJpY0lkQWxsb2NhdG9yKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1pbnQgQWxsb2NhdGVJZEZyb21NZXRyaWNJZEFsbG9jYXRvcihjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEZvcmdldERldmljZUZyb21NZXRyaWNJZEFsbG9jYXRvcihjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHNoaW0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9tZXRyaWNzX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9tZXRyaWNzX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2MzgzOS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19tYWluX3NoaW1fbWV0cmljc19hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEyCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSAiZ2QvaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vaGVscGVycy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX21haW5fc2hpbV9tZXRyaWNzX2FwaS5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG1haW5fc2hpbV9tZXRyaWNzX2FwaSB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IExvZ01ldHJpY0xpbmtMYXllckNvbm5lY3Rpb25FdmVudCBMb2dNZXRyaWNMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQ7Ci1zdHJ1Y3QgTG9nTWV0cmljQTJkcEF1ZGlvVW5kZXJydW5FdmVudCBMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50Owotc3RydWN0IExvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudCBMb2dNZXRyaWNBMmRwQXVkaW9PdmVycnVuRXZlbnQ7Ci1zdHJ1Y3QgTG9nTWV0cmljQTJkcFBsYXliYWNrRXZlbnQgTG9nTWV0cmljQTJkcFBsYXliYWNrRXZlbnQ7Ci1zdHJ1Y3QgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQ7Ci1zdHJ1Y3QgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0Ci0gICAgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0Owotc3RydWN0IExvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQgTG9nTWV0cmljUmVhZFR4UG93ZXJMZXZlbFJlc3VsdDsKLXN0cnVjdCBMb2dNZXRyaWNTbXBQYWlyaW5nRXZlbnQgTG9nTWV0cmljU21wUGFpcmluZ0V2ZW50Owotc3RydWN0IExvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQgTG9nTWV0cmljQ2xhc3NpY1BhaXJpbmdFdmVudDsKLXN0cnVjdCBMb2dNZXRyaWNTZHBBdHRyaWJ1dGUgTG9nTWV0cmljU2RwQXR0cmlidXRlOwotc3RydWN0IExvZ01ldHJpY1NvY2tldENvbm5lY3Rpb25TdGF0ZSBMb2dNZXRyaWNTb2NrZXRDb25uZWN0aW9uU3RhdGU7Ci1zdHJ1Y3QgTG9nTWV0cmljTWFudWZhY3R1cmVySW5mbyBMb2dNZXRyaWNNYW51ZmFjdHVyZXJJbmZvOwotCi19ICAvLyBuYW1lc3BhY2UgbWFpbl9zaGltX21ldHJpY3NfYXBpCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50KAotICAgIGNvbnN0IFJhd0FkZHJlc3MqIHJhd19hZGRyZXNzLCB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LCB1aW50MTZfdCBoY2lfYmxlX2V2ZW50LAotICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbWV0cmljc19hcGk6OkxvZ01ldHJpY0xpbmtMYXllckNvbm5lY3Rpb25FdmVudCgKLSAgICAgIHJhd19hZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSwgZGlyZWN0aW9uLCBsaW5rX3R5cGUsIGhjaV9jbWQsIGhjaV9ldmVudCwKLSAgICAgIGhjaV9ibGVfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlKTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50NjRfdCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsCi0gICAgaW50IG51bV9taXNzaW5nX3BjbV9ieXRlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX21ldHJpY3NfYXBpOjpMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50KAotICAgICAgcmF3X2FkZHJlc3MsIGVuY29kaW5nX2ludGVydmFsX21pbGxpcywgbnVtX21pc3NpbmdfcGNtX2J5dGVzKTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNBMmRwQXVkaW9PdmVycnVuRXZlbnQoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICBpbnQgbnVtX2Ryb3BwZWRfYnVmZmVycywgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfZnJhbWVzLAotICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbWV0cmljc19hcGk6OkxvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudCgKLSAgICAgIHJhd19hZGRyZXNzLCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsIG51bV9kcm9wcGVkX2J1ZmZlcnMsCi0gICAgICBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywgbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TG9nTWV0cmljQTJkcFBsYXliYWNrRXZlbnQoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jb2RpbmdfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX21ldHJpY3NfYXBpOjpMb2dNZXRyaWNBMmRwUGxheWJhY2tFdmVudCgKLSAgICAgIHJhd19hZGRyZXNzLCBwbGF5YmFja19zdGF0ZSwgYXVkaW9fY29kaW5nX21vZGUpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY1JlYWRSc3NpUmVzdWx0KGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByc3NpKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbWV0cmljc19hcGk6OkxvZ01ldHJpY1JlYWRSc3NpUmVzdWx0KAotICAgICAgcmF3X2FkZHJlc3MsIGhhbmRsZSwgY21kX3N0YXR1cywgcnNzaSk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGNtZF9zdGF0dXMsCi0gICAgaW50MzJfdCBmYWlsZWRfY29udGFjdF9jb3VudGVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbWV0cmljc19hcGk6OkxvZ01ldHJpY1JlYWRGYWlsZWRDb250YWN0Q291bnRlclJlc3VsdCgKLSAgICAgIHJhd19hZGRyZXNzLCBoYW5kbGUsIGNtZF9zdGF0dXMsIGZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywKLSAgICBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbWV0cmljc19hcGk6OkxvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQoCi0gICAgICByYXdfYWRkcmVzcywgaGFuZGxlLCBjbWRfc3RhdHVzLCB0cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TG9nTWV0cmljU21wUGFpcmluZ0V2ZW50KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9tZXRyaWNzX2FwaTo6TG9nTWV0cmljU21wUGFpcmluZ0V2ZW50KAotICAgICAgcmF3X2FkZHJlc3MsIHNtcF9jbWQsIGRpcmVjdGlvbiwgc21wX2ZhaWxfcmVhc29uKTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNDbGFzc2ljUGFpcmluZ0V2ZW50KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGhjaV9jbWQsCi0gICAgdWludDE2X3QgaGNpX2V2ZW50LCB1aW50MTZfdCBjbWRfc3RhdHVzLCB1aW50MTZfdCByZWFzb25fY29kZSwKLSAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjptYWluX3NoaW1fbWV0cmljc19hcGk6OkxvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQoCi0gICAgICByYXdfYWRkcmVzcywgaGFuZGxlLCBoY2lfY21kLCBoY2lfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlLAotICAgICAgZXZlbnRfdmFsdWUpOwotfQotdm9pZCBibHVldG9vdGg6OnNoaW06OkxvZ01ldHJpY1NkcEF0dHJpYnV0ZShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cmlidXRlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6bWFpbl9zaGltX21ldHJpY3NfYXBpOjpMb2dNZXRyaWNTZHBBdHRyaWJ1dGUoCi0gICAgICByYXdfYWRkcmVzcywgcHJvdG9jb2xfdXVpZCwgYXR0cmlidXRlX2lkLCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICAgIGF0dHJpYnV0ZV92YWx1ZSk7Ci19Ci12b2lkIGJsdWV0b290aDo6c2hpbTo6TG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCBpbnQgcG9ydCwgaW50IHR5cGUsCi0gICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgaW50NjRfdCB0eF9ieXRlcywgaW50NjRfdCByeF9ieXRlcywgaW50IHVpZCwgaW50IHNlcnZlcl9wb3J0LAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6U29ja2V0Um9sZUVudW0gc29ja2V0X3JvbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9tZXRyaWNzX2FwaTo6TG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlKAotICAgICAgcmF3X2FkZHJlc3MsIHBvcnQsIHR5cGUsIGNvbm5lY3Rpb25fc3RhdGUsIHR4X2J5dGVzLCByeF9ieXRlcywgdWlkLAotICAgICAgc2VydmVyX3BvcnQsIHNvY2tldF9yb2xlKTsKLX0KLXZvaWQgYmx1ZXRvb3RoOjpzaGltOjpMb2dNZXRyaWNNYW51ZmFjdHVyZXJJbmZvKAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om1haW5fc2hpbV9tZXRyaWNzX2FwaTo6TG9nTWV0cmljTWFudWZhY3R1cmVySW5mbygKLSAgICAgIHJhd19hZGRyZXNzLCBzb3VyY2VfdHlwZSwgc291cmNlX25hbWUsIG1hbnVmYWN0dXJlciwgbW9kZWwsCi0gICAgICBoYXJkd2FyZV92ZXJzaW9uLCBzb2Z0d2FyZV92ZXJzaW9uKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX21haW5fc2hpbV9tZXRyaWNzX2FwaS5oIGIvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX21ldHJpY3NfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjRlN2YuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfbWFpbl9zaGltX21ldHJpY3NfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEyCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSAiZ2QvaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJnZC9vcy9tZXRyaWNzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2hlbHBlcnMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbWV0cmljc19hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBtYWluX3NoaW1fbWV0cmljc19hcGkgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogTG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MqIHJhd19hZGRyZXNzLCB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLS8vIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sIHVpbnQxNl90IGxpbmtfdHlwZSwgdWludDMyX3QKLS8vIGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgaGNpX2JsZV9ldmVudCwgdWludDE2X3QgY21kX3N0YXR1cywKLS8vIHVpbnQxNl90IHJlYXNvbl9jb2RlIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMb2dNZXRyaWNMaW5rTGF5ZXJDb25uZWN0aW9uRXZlbnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyogcmF3X2FkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxpbmtfdHlwZSwgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGNpX2JsZV9ldmVudCwgdWludDE2X3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyogcmF3X2FkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICAgICAgICAgICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MqIHJhd19hZGRyZXNzLCB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBsaW5rX3R5cGUsIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCByZWFzb25fY29kZSkgewotICAgIGJvZHkocmF3X2FkZHJlc3MsIGNvbm5lY3Rpb25faGFuZGxlLCBkaXJlY3Rpb24sIGxpbmtfdHlwZSwgaGNpX2NtZCwKLSAgICAgICAgIGhjaV9ldmVudCwgaGNpX2JsZV9ldmVudCwgY21kX3N0YXR1cywgcmVhc29uX2NvZGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50Ci0gICAgTG9nTWV0cmljTGlua0xheWVyQ29ubmVjdGlvbkV2ZW50OwotLy8gTmFtZTogTG9nTWV0cmljQTJkcEF1ZGlvVW5kZXJydW5FdmVudAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBpbnQKLS8vIG51bV9taXNzaW5nX3BjbV9ieXRlcyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljQTJkcEF1ZGlvVW5kZXJydW5FdmVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgIGludCBudW1fbWlzc2luZ19wY21fYnl0ZXMpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLAotICAgICAgICAgICAgICBpbnQgbnVtX21pc3NpbmdfcGNtX2J5dGVzKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgICAgIGludCBudW1fbWlzc2luZ19wY21fYnl0ZXMpIHsKLSAgICBib2R5KHJhd19hZGRyZXNzLCBlbmNvZGluZ19pbnRlcnZhbF9taWxsaXMsIG51bV9taXNzaW5nX3BjbV9ieXRlcyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMb2dNZXRyaWNBMmRwQXVkaW9VbmRlcnJ1bkV2ZW50IExvZ01ldHJpY0EyZHBBdWRpb1VuZGVycnVuRXZlbnQ7Ci0vLyBOYW1lOiBMb2dNZXRyaWNBMmRwQXVkaW9PdmVycnVuRXZlbnQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywgaW50Ci0vLyBudW1fZHJvcHBlZF9idWZmZXJzLCBpbnQgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsIGludAotLy8gbnVtX2Ryb3BwZWRfZW5jb2RlZF9ieXRlcyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljQTJkcEF1ZGlvT3ZlcnJ1bkV2ZW50IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBpbnQgbnVtX2Ryb3BwZWRfYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQ2NF90IGVuY29kaW5nX2ludGVydmFsX21pbGxpcywKLSAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2J1ZmZlcnMsIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywKLSAgICAgICAgICAgICAgaW50IG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgdWludDY0X3QgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBpbnQgbnVtX2Ryb3BwZWRfYnVmZmVycywKLSAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgIGludCBudW1fZHJvcHBlZF9lbmNvZGVkX2J5dGVzKSB7Ci0gICAgYm9keShyYXdfYWRkcmVzcywgZW5jb2RpbmdfaW50ZXJ2YWxfbWlsbGlzLCBudW1fZHJvcHBlZF9idWZmZXJzLAotICAgICAgICAgbnVtX2Ryb3BwZWRfZW5jb2RlZF9mcmFtZXMsIG51bV9kcm9wcGVkX2VuY29kZWRfYnl0ZXMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljQTJkcEF1ZGlvT3ZlcnJ1bkV2ZW50IExvZ01ldHJpY0EyZHBBdWRpb092ZXJydW5FdmVudDsKLS8vIE5hbWU6IExvZ01ldHJpY0EyZHBQbGF5YmFja0V2ZW50Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsIGludAotLy8gYXVkaW9fY29kaW5nX21vZGUgUmV0dXJuczogdm9pZAotc3RydWN0IExvZ01ldHJpY0EyZHBQbGF5YmFja0V2ZW50IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fY29kaW5nX21vZGUpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgaW50IHBsYXliYWNrX3N0YXRlLAotICAgICAgICAgICAgICBpbnQgYXVkaW9fY29kaW5nX21vZGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCBpbnQgcGxheWJhY2tfc3RhdGUsCi0gICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fY29kaW5nX21vZGUpIHsKLSAgICBib2R5KHJhd19hZGRyZXNzLCBwbGF5YmFja19zdGF0ZSwgYXVkaW9fY29kaW5nX21vZGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljQTJkcFBsYXliYWNrRXZlbnQgTG9nTWV0cmljQTJkcFBsYXliYWNrRXZlbnQ7Ci0vLyBOYW1lOiBMb2dNZXRyaWNSZWFkUnNzaVJlc3VsdAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLAotLy8gaW50OF90IHJzc2kgUmV0dXJuczogdm9pZAotc3RydWN0IExvZ01ldHJpY1JlYWRSc3NpUmVzdWx0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQ4X3QgcnNzaSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGNtZF9zdGF0dXMsIGludDhfdCByc3NpKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywgaW50OF90IHJzc2kpIHsKLSAgICBib2R5KHJhd19hZGRyZXNzLCBoYW5kbGUsIGNtZF9zdGF0dXMsIHJzc2kpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQgTG9nTWV0cmljUmVhZFJzc2lSZXN1bHQ7Ci0vLyBOYW1lOiBMb2dNZXRyaWNSZWFkRmFpbGVkQ29udGFjdENvdW50ZXJSZXN1bHQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgY21kX3N0YXR1cywKLS8vIGludDMyX3QgZmFpbGVkX2NvbnRhY3RfY291bnRlciBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IGZhaWxlZF9jb250YWN0X2NvdW50ZXIpIHsKLSAgICBib2R5KHJhd19hZGRyZXNzLCBoYW5kbGUsIGNtZF9zdGF0dXMsIGZhaWxlZF9jb250YWN0X2NvdW50ZXIpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0Ci0gICAgTG9nTWV0cmljUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyUmVzdWx0OwotLy8gTmFtZTogTG9nTWV0cmljUmVhZFR4UG93ZXJMZXZlbFJlc3VsdAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBjbWRfc3RhdHVzLAotLy8gaW50MzJfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljUmVhZFR4UG93ZXJMZXZlbFJlc3VsdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kX3N0YXR1cywgaW50MzJfdCB0cmFuc21pdF9wb3dlcl9sZXZlbCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGNtZF9zdGF0dXMsIGludDMyX3QgdHJhbnNtaXRfcG93ZXJfbGV2ZWwpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRfc3RhdHVzLCBpbnQzMl90IHRyYW5zbWl0X3Bvd2VyX2xldmVsKSB7Ci0gICAgYm9keShyYXdfYWRkcmVzcywgaGFuZGxlLCBjbWRfc3RhdHVzLCB0cmFuc21pdF9wb3dlcl9sZXZlbCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMb2dNZXRyaWNSZWFkVHhQb3dlckxldmVsUmVzdWx0IExvZ01ldHJpY1JlYWRUeFBvd2VyTGV2ZWxSZXN1bHQ7Ci0vLyBOYW1lOiBMb2dNZXRyaWNTbXBQYWlyaW5nRXZlbnQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwKLS8vIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sIHVpbnQ4X3Qgc21wX2ZhaWxfcmVhc29uIFJldHVybnM6Ci0vLyB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljU21wUGFpcmluZ0V2ZW50IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDhfdCBzbXBfY21kLAotICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICB1aW50OF90IHNtcF9mYWlsX3JlYXNvbikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICB1aW50OF90IHNtcF9mYWlsX3JlYXNvbikgewotICAgIGJvZHkocmF3X2FkZHJlc3MsIHNtcF9jbWQsIGRpcmVjdGlvbiwgc21wX2ZhaWxfcmVhc29uKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IExvZ01ldHJpY1NtcFBhaXJpbmdFdmVudCBMb2dNZXRyaWNTbXBQYWlyaW5nRXZlbnQ7Ci0vLyBOYW1lOiBMb2dNZXRyaWNDbGFzc2ljUGFpcmluZ0V2ZW50Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGhjaV9jbWQsCi0vLyB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlLCBpbnQ2NF90Ci0vLyBldmVudF92YWx1ZSBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljQ2xhc3NpY1BhaXJpbmdFdmVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LCB1aW50MTZfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVhc29uX2NvZGUsIGludDY0X3QgZXZlbnRfdmFsdWUpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBoY2lfY21kLAotICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlLAotICAgICAgICAgICAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LCB1aW50MTZfdCBjbWRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVhc29uX2NvZGUsIGludDY0X3QgZXZlbnRfdmFsdWUpIHsKLSAgICBib2R5KHJhd19hZGRyZXNzLCBoYW5kbGUsIGhjaV9jbWQsIGhjaV9ldmVudCwgY21kX3N0YXR1cywgcmVhc29uX2NvZGUsCi0gICAgICAgICBldmVudF92YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMb2dNZXRyaWNDbGFzc2ljUGFpcmluZ0V2ZW50IExvZ01ldHJpY0NsYXNzaWNQYWlyaW5nRXZlbnQ7Ci0vLyBOYW1lOiBMb2dNZXRyaWNTZHBBdHRyaWJ1dGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsIHVpbnQxNl90Ci0vLyBhdHRyaWJ1dGVfaWQsIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwgY29uc3QgY2hhciogYXR0cmlidXRlX3ZhbHVlIFJldHVybnM6Ci0vLyB2b2lkCi1zdHJ1Y3QgTG9nTWV0cmljU2RwQXR0cmlidXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLCB1aW50MTZfdCBwcm90b2NvbF91dWlkLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cmlidXRlX2lkLCBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdHRyaWJ1dGVfdmFsdWUpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgdWludDE2X3QgcHJvdG9jb2xfdXVpZCwKLSAgICAgICAgICAgICAgdWludDE2X3QgYXR0cmlidXRlX2lkLCBzaXplX3QgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkgewotICAgIGJvZHkocmF3X2FkZHJlc3MsIHByb3RvY29sX3V1aWQsIGF0dHJpYnV0ZV9pZCwgYXR0cmlidXRlX3NpemUsCi0gICAgICAgICBhdHRyaWJ1dGVfdmFsdWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljU2RwQXR0cmlidXRlIExvZ01ldHJpY1NkcEF0dHJpYnV0ZTsKLS8vIE5hbWU6IExvZ01ldHJpY1NvY2tldENvbm5lY3Rpb25TdGF0ZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgaW50IHBvcnQsIGludCB0eXBlLAotLy8gYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsIGludDY0X3QKLS8vIHR4X2J5dGVzLCBpbnQ2NF90IHJ4X2J5dGVzLCBpbnQgdWlkLCBpbnQgc2VydmVyX3BvcnQsCi0vLyBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMb2dNZXRyaWNTb2NrZXRDb25uZWN0aW9uU3RhdGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgaW50IHBvcnQsIGludCB0eXBlLAotICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgICBpbnQ2NF90IHR4X2J5dGVzLCBpbnQ2NF90IHJ4X2J5dGVzLCBpbnQgdWlkLCBpbnQgc2VydmVyX3BvcnQsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIGludCBwb3J0LCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgICAgICAgICAgIGludDY0X3QgdHhfYnl0ZXMsIGludDY0X3QgcnhfYnl0ZXMsIGludCB1aWQsIGludCBzZXJ2ZXJfcG9ydCwKLSAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRSb2xlRW51bSBzb2NrZXRfcm9sZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoCi0gICAgICBjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywgaW50IHBvcnQsIGludCB0eXBlLAotICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpTb2NrZXRDb25uZWN0aW9uc3RhdGVFbnVtIGNvbm5lY3Rpb25fc3RhdGUsCi0gICAgICBpbnQ2NF90IHR4X2J5dGVzLCBpbnQ2NF90IHJ4X2J5dGVzLCBpbnQgdWlkLCBpbnQgc2VydmVyX3BvcnQsCi0gICAgICBhbmRyb2lkOjpibHVldG9vdGg6OlNvY2tldFJvbGVFbnVtIHNvY2tldF9yb2xlKSB7Ci0gICAgYm9keShyYXdfYWRkcmVzcywgcG9ydCwgdHlwZSwgY29ubmVjdGlvbl9zdGF0ZSwgdHhfYnl0ZXMsIHJ4X2J5dGVzLCB1aWQsCi0gICAgICAgICBzZXJ2ZXJfcG9ydCwgc29ja2V0X3JvbGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTG9nTWV0cmljU29ja2V0Q29ubmVjdGlvblN0YXRlIExvZ01ldHJpY1NvY2tldENvbm5lY3Rpb25TdGF0ZTsKLS8vIE5hbWU6IExvZ01ldHJpY01hbnVmYWN0dXJlckluZm8KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0KLS8vIHNvdXJjZV90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0vLyBjb25zdCBzdGQ6OnN0cmluZyYgbW9kZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLCBjb25zdAotLy8gc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24gUmV0dXJuczogdm9pZAotc3RydWN0IExvZ01ldHJpY01hbnVmYWN0dXJlckluZm8gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcmF3X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1hbnVmYWN0dXJlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbik+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJhd19hZGRyZXNzLAotICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbW9kZWwsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaGFyZHdhcmVfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7Ci0gICAgYm9keShyYXdfYWRkcmVzcywgc291cmNlX3R5cGUsIHNvdXJjZV9uYW1lLCBtYW51ZmFjdHVyZXIsIG1vZGVsLAotICAgICAgICAgaGFyZHdhcmVfdmVyc2lvbiwgc29mdHdhcmVfdmVyc2lvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMb2dNZXRyaWNNYW51ZmFjdHVyZXJJbmZvIExvZ01ldHJpY01hbnVmYWN0dXJlckluZm87Ci0KLX0gIC8vIG5hbWVzcGFjZSBtYWluX3NoaW1fbWV0cmljc19hcGkKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX2FsYXJtLmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX2FsYXJtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTcxNTU4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9hbGFybS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTAKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX29zaV9hbGFybS5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfYWxhcm0gewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBhbGFybV9jYW5jZWwgYWxhcm1fY2FuY2VsOwotc3RydWN0IGFsYXJtX2NsZWFudXAgYWxhcm1fY2xlYW51cDsKLXN0cnVjdCBhbGFybV9kZWJ1Z19kdW1wIGFsYXJtX2RlYnVnX2R1bXA7Ci1zdHJ1Y3QgYWxhcm1fZnJlZSBhbGFybV9mcmVlOwotc3RydWN0IGFsYXJtX2dldF9yZW1haW5pbmdfbXMgYWxhcm1fZ2V0X3JlbWFpbmluZ19tczsKLXN0cnVjdCBhbGFybV9pc19zY2hlZHVsZWQgYWxhcm1faXNfc2NoZWR1bGVkOwotc3RydWN0IGFsYXJtX25ldyBhbGFybV9uZXc7Ci1zdHJ1Y3QgYWxhcm1fbmV3X3BlcmlvZGljIGFsYXJtX25ld19wZXJpb2RpYzsKLXN0cnVjdCBhbGFybV9zZXQgYWxhcm1fc2V0Owotc3RydWN0IGFsYXJtX3NldF9vbl9tbG9vcCBhbGFybV9zZXRfb25fbWxvb3A7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfYWxhcm0KLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXZvaWQgYWxhcm1fY2FuY2VsKGFsYXJtX3QqIGFsYXJtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX2NhbmNlbChhbGFybSk7Ci19Ci12b2lkIGFsYXJtX2NsZWFudXAodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9jbGVhbnVwKCk7Ci19Ci12b2lkIGFsYXJtX2RlYnVnX2R1bXAoaW50IGZkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX2RlYnVnX2R1bXAoZmQpOwotfQotdm9pZCBhbGFybV9mcmVlKGFsYXJtX3QqIGFsYXJtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX2ZyZWUoYWxhcm0pOwotfQotdWludDY0X3QgYWxhcm1fZ2V0X3JlbWFpbmluZ19tcyhjb25zdCBhbGFybV90KiBhbGFybSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9hbGFybTo6YWxhcm1fZ2V0X3JlbWFpbmluZ19tcyhhbGFybSk7Ci19Ci1ib29sIGFsYXJtX2lzX3NjaGVkdWxlZChjb25zdCBhbGFybV90KiBhbGFybSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9hbGFybTo6YWxhcm1faXNfc2NoZWR1bGVkKGFsYXJtKTsKLX0KLWFsYXJtX3QqIGFsYXJtX25ldyhjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9uZXcobmFtZSk7Ci19Ci1hbGFybV90KiBhbGFybV9uZXdfcGVyaW9kaWMoY29uc3QgY2hhciogbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9hbGFybTo6YWxhcm1fbmV3X3BlcmlvZGljKG5hbWUpOwotfQotdm9pZCBhbGFybV9zZXQoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLCBhbGFybV9jYWxsYmFja190IGNiLAotICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2FsYXJtOjphbGFybV9zZXQoYWxhcm0sIGludGVydmFsX21zLCBjYiwgZGF0YSk7Ci19Ci12b2lkIGFsYXJtX3NldF9vbl9tbG9vcChhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9jYWxsYmFja190IGNiLCB2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfYWxhcm06OmFsYXJtX3NldF9vbl9tbG9vcChhbGFybSwgaW50ZXJ2YWxfbXMsIGNiLCBkYXRhKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfYWxhcm0uaCBiL3Rlc3QvbW9jay9tb2NrX29zaV9hbGFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMxNWFlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9hbGFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgZnJvbSAob3IgYWRkIHRvICkgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8YmFzZS9jYW5jZWxhYmxlX2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJpbnRlcm5hbF9pbmNsdWRlL2J0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9saXN0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc2VtYXBob3JlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvdGhyZWFkLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvd2FrZWxvY2suaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV9hbGFybSB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBhbGFybV9jYW5jZWwKLS8vIFBhcmFtczogYWxhcm1fdCogYWxhcm0KLS8vIFJldHVybjogdm9pZAotc3RydWN0IGFsYXJtX2NhbmNlbCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChhbGFybV90KiBhbGFybSk+IGJvZHl7W10oYWxhcm1fdCogYWxhcm0pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGFsYXJtX3QqIGFsYXJtKSB7IGJvZHkoYWxhcm0pOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fY2FuY2VsIGFsYXJtX2NhbmNlbDsKLQotLy8gTmFtZTogYWxhcm1fY2xlYW51cAotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBhbGFybV9jbGVhbnVwIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fY2xlYW51cCBhbGFybV9jbGVhbnVwOwotCi0vLyBOYW1lOiBhbGFybV9kZWJ1Z19kdW1wCi0vLyBQYXJhbXM6IGludCBmZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYWxhcm1fZGVidWdfZHVtcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQgZmQpPiBib2R5e1tdKGludCBmZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoaW50IGZkKSB7IGJvZHkoZmQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fZGVidWdfZHVtcCBhbGFybV9kZWJ1Z19kdW1wOwotCi0vLyBOYW1lOiBhbGFybV9mcmVlCi0vLyBQYXJhbXM6IGFsYXJtX3QqIGFsYXJtCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBhbGFybV9mcmVlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGFsYXJtX3QqIGFsYXJtKT4gYm9keXtbXShhbGFybV90KiBhbGFybSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoYWxhcm1fdCogYWxhcm0pIHsgYm9keShhbGFybSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhbGFybV9mcmVlIGFsYXJtX2ZyZWU7Ci0KLS8vIE5hbWU6IGFsYXJtX2dldF9yZW1haW5pbmdfbXMKLS8vIFBhcmFtczogY29uc3QgYWxhcm1fdCogYWxhcm0KLS8vIFJldHVybjogdWludDY0X3QKLXN0cnVjdCBhbGFybV9nZXRfcmVtYWluaW5nX21zIHsKLSAgdWludDY0X3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ2NF90KGNvbnN0IGFsYXJtX3QqIGFsYXJtKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBhbGFybV90KiBhbGFybSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdWludDY0X3Qgb3BlcmF0b3IoKShjb25zdCBhbGFybV90KiBhbGFybSkgeyByZXR1cm4gYm9keShhbGFybSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhbGFybV9nZXRfcmVtYWluaW5nX21zIGFsYXJtX2dldF9yZW1haW5pbmdfbXM7Ci0KLS8vIE5hbWU6IGFsYXJtX2lzX3NjaGVkdWxlZAotLy8gUGFyYW1zOiBjb25zdCBhbGFybV90KiBhbGFybQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgYWxhcm1faXNfc2NoZWR1bGVkIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgYWxhcm1fdCogYWxhcm0pPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGFsYXJtX3QqIGFsYXJtKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgYWxhcm1fdCogYWxhcm0pIHsgcmV0dXJuIGJvZHkoYWxhcm0pOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1faXNfc2NoZWR1bGVkIGFsYXJtX2lzX3NjaGVkdWxlZDsKLQotLy8gTmFtZTogYWxhcm1fbmV3Ci0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIG5hbWUKLS8vIFJldHVybjogYWxhcm1fdCoKLXN0cnVjdCBhbGFybV9uZXcgewotICBhbGFybV90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248YWxhcm1fdCooY29uc3QgY2hhciogbmFtZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYWxhcm1fdCogb3BlcmF0b3IoKShjb25zdCBjaGFyKiBuYW1lKSB7IHJldHVybiBib2R5KG5hbWUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fbmV3IGFsYXJtX25ldzsKLQotLy8gTmFtZTogYWxhcm1fbmV3X3BlcmlvZGljCi0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIG5hbWUKLS8vIFJldHVybjogYWxhcm1fdCoKLXN0cnVjdCBhbGFybV9uZXdfcGVyaW9kaWMgewotICBhbGFybV90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248YWxhcm1fdCooY29uc3QgY2hhciogbmFtZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYWxhcm1fdCogb3BlcmF0b3IoKShjb25zdCBjaGFyKiBuYW1lKSB7IHJldHVybiBib2R5KG5hbWUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fbmV3X3BlcmlvZGljIGFsYXJtX25ld19wZXJpb2RpYzsKLQotLy8gTmFtZTogYWxhcm1fc2V0Ci0vLyBQYXJhbXM6IGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YQotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYWxhcm1fc2V0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpPgotICAgICAgYm9keXtbXShhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIGFsYXJtX2NhbGxiYWNrX3QgY2IsCi0gICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwKLSAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgICBib2R5KGFsYXJtLCBpbnRlcnZhbF9tcywgY2IsIGRhdGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fc2V0IGFsYXJtX3NldDsKLQotLy8gTmFtZTogYWxhcm1fc2V0X29uX21sb29wCi0vLyBQYXJhbXM6IGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YQotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYWxhcm1fc2V0X29uX21sb29wIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpPgotICAgICAgYm9keXtbXShhbGFybV90KiBhbGFybSwgdWludDY0X3QgaW50ZXJ2YWxfbXMsIGFsYXJtX2NhbGxiYWNrX3QgY2IsCi0gICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGFsYXJtX3QqIGFsYXJtLCB1aW50NjRfdCBpbnRlcnZhbF9tcywgYWxhcm1fY2FsbGJhY2tfdCBjYiwKLSAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKLSAgICBib2R5KGFsYXJtLCBpbnRlcnZhbF9tcywgY2IsIGRhdGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxhcm1fc2V0X29uX21sb29wIGFsYXJtX3NldF9vbl9tbG9vcDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9hbGFybQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX2FsbG9jYXRpb25fdHJhY2tlci5jYyBiL3Rlc3QvbW9jay9tb2NrX29zaV9hbGxvY2F0aW9uX3RyYWNrZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzM0M2YuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX2FsbG9jYXRpb25fdHJhY2tlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo4Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19vc2lfYWxsb2NhdGlvbl90cmFja2VyLmgiCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV9hbGxvY2F0aW9uX3RyYWNrZXIgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfZXhwZWN0X25vX2FsbG9jYXRpb25zCi0gICAgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9uczsKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdCBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdDsKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfYWxsb2M7Ci1zdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfZnJlZTsKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzZXQgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2V0Owotc3RydWN0IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeQotICAgIGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeTsKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0IGFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQ7Ci1zdHJ1Y3Qgb3NpX2FsbG9jYXRvcl9kZWJ1Z19kdW1wIG9zaV9hbGxvY2F0b3JfZGVidWdfZHVtcDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9hbGxvY2F0aW9uX3RyYWNrZXIKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXNpemVfdCBhbGxvY2F0aW9uX3RyYWNrZXJfZXhwZWN0X25vX2FsbG9jYXRpb25zKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfYWxsb2NhdGlvbl90cmFja2VyOjoKLSAgICAgIGFsbG9jYXRpb25fdHJhY2tlcl9leHBlY3Rfbm9fYWxsb2NhdGlvbnMoKTsKLX0KLXZvaWQgYWxsb2NhdGlvbl90cmFja2VyX2luaXQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2FsbG9jYXRpb25fdHJhY2tlcjo6YWxsb2NhdGlvbl90cmFja2VyX2luaXQoKTsKLX0KLXZvaWQqIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfYWxsb2ModWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlcXVlc3RlZF9zaXplKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2FsbG9jYXRpb25fdHJhY2tlcjo6YWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9hbGxvYygKLSAgICAgIGFsbG9jYXRvcl9pZCwgcHRyLCByZXF1ZXN0ZWRfc2l6ZSk7Ci19Ci12b2lkKiBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2ZyZWUodWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0cikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9hbGxvY2F0aW9uX3RyYWNrZXI6OmFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfZnJlZSgKLSAgICAgIGFsbG9jYXRvcl9pZCwgcHRyKTsKLX0KLXZvaWQgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2V0KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9hbGxvY2F0aW9uX3RyYWNrZXI6OmFsbG9jYXRpb25fdHJhY2tlcl9yZXNldCgpOwotfQotc2l6ZV90IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeShzaXplX3Qgc2l6ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9hbGxvY2F0aW9uX3RyYWNrZXI6OgotICAgICAgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2l6ZV9mb3JfY2FuYXJ5KHNpemUpOwotfQotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9hbGxvY2F0aW9uX3RyYWNrZXI6OmFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQoKTsKLX0KLXZvaWQgb3NpX2FsbG9jYXRvcl9kZWJ1Z19kdW1wKGludCBmZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2FsbG9jYXRpb25fdHJhY2tlcjo6b3NpX2FsbG9jYXRvcl9kZWJ1Z19kdW1wKGZkKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfYWxsb2NhdGlvbl90cmFja2VyLmggYi90ZXN0L21vY2svbW9ja19vc2lfYWxsb2NhdGlvbl90cmFja2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2VhYjAuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX2FsbG9jYXRpb25fdHJhY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo4Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLSNpbmNsdWRlICJjaGVjay5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRpb25fdHJhY2tlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX2FsbG9jYXRpb25fdHJhY2tlciB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBhbGxvY2F0aW9uX3RyYWNrZXJfZXhwZWN0X25vX2FsbG9jYXRpb25zCi0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogc2l6ZV90Ci1zdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9ucyB7Ci0gIHNpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c2l6ZV90KHZvaWQpPiBib2R5e1t0aGlzXSh2b2lkKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBzaXplX3Qgb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfZXhwZWN0X25vX2FsbG9jYXRpb25zCi0gICAgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9uczsKLQotLy8gTmFtZTogYWxsb2NhdGlvbl90cmFja2VyX2luaXQKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX2luaXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdCBhbGxvY2F0aW9uX3RyYWNrZXJfaW5pdDsKLQotLy8gTmFtZTogYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9hbGxvYwotLy8gUGFyYW1zOiB1aW50OF90IGFsbG9jYXRvcl9pZCwgdm9pZCogcHRyLCBzaXplX3QgcmVxdWVzdGVkX3NpemUKLS8vIFJldHVybjogdm9pZCoKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfbm90aWZ5X2FsbG9jIHsKLSAgdm9pZCogcmV0dXJuX3ZhbHVle307Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCoodWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0ciwgc2l6ZV90IHJlcXVlc3RlZF9zaXplKT4KLSAgICAgIGJvZHl7W3RoaXNdKHVpbnQ4X3QgYWxsb2NhdG9yX2lkLCB2b2lkKiBwdHIsIHNpemVfdCByZXF1ZXN0ZWRfc2l6ZSkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIHZvaWQqIG9wZXJhdG9yKCkodWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0ciwgc2l6ZV90IHJlcXVlc3RlZF9zaXplKSB7Ci0gICAgcmV0dXJuIGJvZHkoYWxsb2NhdG9yX2lkLCBwdHIsIHJlcXVlc3RlZF9zaXplKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfYWxsb2MgYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9hbGxvYzsKLQotLy8gTmFtZTogYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlCi0vLyBQYXJhbXM6ICB1aW50OF90IGFsbG9jYXRvcl9pZCwgdm9pZCogcHRyCi0vLyBSZXR1cm46IHZvaWQqCi1zdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlIHsKLSAgdm9pZCogcmV0dXJuX3ZhbHVle307Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCoodWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0cik+IGJvZHl7Ci0gICAgICBbdGhpc10odWludDhfdCBhbGxvY2F0b3JfaWQsIHZvaWQqIHB0cikgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKSh1aW50OF90IGFsbG9jYXRvcl9pZCwgdm9pZCogcHRyKSB7Ci0gICAgcmV0dXJuIGJvZHkoYWxsb2NhdG9yX2lkLCBwdHIpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlIGFsbG9jYXRpb25fdHJhY2tlcl9ub3RpZnlfZnJlZTsKLQotLy8gTmFtZTogYWxsb2NhdGlvbl90cmFja2VyX3Jlc2V0Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNldCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNldCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzZXQ7Ci0KLS8vIE5hbWU6IGFsbG9jYXRpb25fdHJhY2tlcl9yZXNpemVfZm9yX2NhbmFyeQotLy8gUGFyYW1zOiBzaXplX3Qgc2l6ZQotLy8gUmV0dXJuOiBzaXplX3QKLXN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzaXplX2Zvcl9jYW5hcnkgewotICBzaXplX3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNpemVfdChzaXplX3Qgc2l6ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oc2l6ZV90IHNpemUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNpemVfdCBvcGVyYXRvcigpKHNpemVfdCBzaXplKSB7IHJldHVybiBib2R5KHNpemUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2l6ZV9mb3JfY2FuYXJ5Ci0gICAgYWxsb2NhdGlvbl90cmFja2VyX3Jlc2l6ZV9mb3JfY2FuYXJ5OwotCi0vLyBOYW1lOiBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0IGFsbG9jYXRpb25fdHJhY2tlcl91bmluaXQ7Ci0KLS8vIE5hbWU6IG9zaV9hbGxvY2F0b3JfZGVidWdfZHVtcAotLy8gUGFyYW1zOiBpbnQgZmQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IG9zaV9hbGxvY2F0b3JfZGVidWdfZHVtcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQgZmQpPiBib2R5e1tdKGludCBmZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoaW50IGZkKSB7IGJvZHkoZmQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgb3NpX2FsbG9jYXRvcl9kZWJ1Z19kdW1wIG9zaV9hbGxvY2F0b3JfZGVidWdfZHVtcDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9hbGxvY2F0aW9uX3RyYWNrZXIKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9hbGxvY2F0b3IuY2MgYi90ZXN0L21vY2svbW9ja19vc2lfYWxsb2NhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM5MDg1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9hbGxvY2F0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NgotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfb3NpX2FsbG9jYXRvci5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfYWxsb2NhdG9yIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3Qgb3NpX2NhbGxvYyBvc2lfY2FsbG9jOwotc3RydWN0IG9zaV9mcmVlIG9zaV9mcmVlOwotc3RydWN0IG9zaV9mcmVlX2FuZF9yZXNldCBvc2lfZnJlZV9hbmRfcmVzZXQ7Ci1zdHJ1Y3Qgb3NpX21hbGxvYyBvc2lfbWFsbG9jOwotc3RydWN0IG9zaV9zdHJkdXAgb3NpX3N0cmR1cDsKLXN0cnVjdCBvc2lfc3RybmR1cCBvc2lfc3RybmR1cDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9hbGxvY2F0b3IKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXZvaWQqIG9zaV9jYWxsb2Moc2l6ZV90IHNpemUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfYWxsb2NhdG9yOjpvc2lfY2FsbG9jKHNpemUpOwotfQotdm9pZCBvc2lfZnJlZSh2b2lkKiBwdHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9hbGxvY2F0b3I6Om9zaV9mcmVlKHB0cik7Ci19Ci12b2lkIG9zaV9mcmVlX2FuZF9yZXNldCh2b2lkKiogcF9wdHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9hbGxvY2F0b3I6Om9zaV9mcmVlX2FuZF9yZXNldChwX3B0cik7Ci19Ci12b2lkKiBvc2lfbWFsbG9jKHNpemVfdCBzaXplKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2FsbG9jYXRvcjo6b3NpX21hbGxvYyhzaXplKTsKLX0KLWNoYXIqIG9zaV9zdHJkdXAoY29uc3QgY2hhciogc3RyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2FsbG9jYXRvcjo6b3NpX3N0cmR1cChzdHIpOwotfQotY2hhciogb3NpX3N0cm5kdXAoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2FsbG9jYXRvcjo6b3NpX3N0cm5kdXAoc3RyLCBsZW4pOwotfQotLy8gTW9ja2VkIGZ1bmN0aW9ucyBjb21wbGV0ZQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9hbGxvY2F0b3IuaCBiL3Rlc3QvbW9jay9tb2NrX29zaV9hbGxvY2F0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4NDVmNS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfYWxsb2NhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0aW9uX3RyYWNrZXIuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV9hbGxvY2F0b3IgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogb3NpX2NhbGxvYwotLy8gUGFyYW1zOiBzaXplX3Qgc2l6ZQotLy8gUmV0dXJuOiB2b2lkKgotc3RydWN0IG9zaV9jYWxsb2MgewotICB2b2lkKiByZXR1cm5fdmFsdWV7fTsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKihzaXplX3Qgc2l6ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oc2l6ZV90IHNpemUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHZvaWQqIG9wZXJhdG9yKCkoc2l6ZV90IHNpemUpIHsgcmV0dXJuIGJvZHkoc2l6ZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBvc2lfY2FsbG9jIG9zaV9jYWxsb2M7Ci0KLS8vIE5hbWU6IG9zaV9mcmVlCi0vLyBQYXJhbXM6IHZvaWQqIHB0cgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgb3NpX2ZyZWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCogcHRyKT4gYm9keXtbXSh2b2lkKiBwdHIpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHB0cikgeyBib2R5KHB0cik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBvc2lfZnJlZSBvc2lfZnJlZTsKLQotLy8gTmFtZTogb3NpX2ZyZWVfYW5kX3Jlc2V0Ci0vLyBQYXJhbXM6IHZvaWQqKiBwX3B0cgotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgb3NpX2ZyZWVfYW5kX3Jlc2V0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQqKiBwX3B0cik+IGJvZHl7W10odm9pZCoqIHBfcHRyKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiogcF9wdHIpIHsgYm9keShwX3B0cik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBvc2lfZnJlZV9hbmRfcmVzZXQgb3NpX2ZyZWVfYW5kX3Jlc2V0OwotCi0vLyBOYW1lOiBvc2lfbWFsbG9jCi0vLyBQYXJhbXM6IHNpemVfdCBzaXplCi0vLyBSZXR1cm46IHZvaWQqCi1zdHJ1Y3Qgb3NpX21hbGxvYyB7Ci0gIHZvaWQqIHJldHVybl92YWx1ZXt9OwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQqKHNpemVfdCBzaXplKT4gYm9keXsKLSAgICAgIFt0aGlzXShzaXplX3Qgc2l6ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKShzaXplX3Qgc2l6ZSkgeyByZXR1cm4gYm9keShzaXplKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IG9zaV9tYWxsb2Mgb3NpX21hbGxvYzsKLQotLy8gTmFtZTogb3NpX3N0cmR1cAotLy8gUGFyYW1zOiBjb25zdCBjaGFyKiBzdHIKLS8vIFJldHVybjogY2hhcioKLXN0cnVjdCBvc2lfc3RyZHVwIHsKLSAgY2hhciogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPGNoYXIqKGNvbnN0IGNoYXIqIHN0cik+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhciogc3RyKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBjaGFyKiBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHN0cikgeyByZXR1cm4gYm9keShzdHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgb3NpX3N0cmR1cCBvc2lfc3RyZHVwOwotCi0vLyBOYW1lOiBvc2lfc3RybmR1cAotLy8gUGFyYW1zOiBjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4KLS8vIFJldHVybjogY2hhcioKLXN0cnVjdCBvc2lfc3RybmR1cCB7Ci0gIGNoYXIqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxjaGFyKihjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4pPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IGxlbikgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgY2hhciogb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4pIHsgcmV0dXJuIGJvZHkoc3RyLCBsZW4pOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgb3NpX3N0cm5kdXAgb3NpX3N0cm5kdXA7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfYWxsb2NhdG9yCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfY29uZmlnLmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1N2RmNi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfY29uZmlnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyNAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfb3NpX2NvbmZpZy5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfY29uZmlnIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgY2hlY2tzdW1fcmVhZCBjaGVja3N1bV9yZWFkOwotc3RydWN0IGNoZWNrc3VtX3NhdmUgY2hlY2tzdW1fc2F2ZTsKLXN0cnVjdCBjb25maWdfZ2V0X2Jvb2wgY29uZmlnX2dldF9ib29sOwotc3RydWN0IGNvbmZpZ19nZXRfaW50IGNvbmZpZ19nZXRfaW50Owotc3RydWN0IGNvbmZpZ19nZXRfc3RyaW5nIGNvbmZpZ19nZXRfc3RyaW5nOwotc3RydWN0IGNvbmZpZ19nZXRfdWludDY0IGNvbmZpZ19nZXRfdWludDY0Owotc3RydWN0IGNvbmZpZ19oYXNfa2V5IGNvbmZpZ19oYXNfa2V5Owotc3RydWN0IGNvbmZpZ19oYXNfc2VjdGlvbiBjb25maWdfaGFzX3NlY3Rpb247Ci1zdHJ1Y3QgY29uZmlnX25ldyBjb25maWdfbmV3Owotc3RydWN0IGNvbmZpZ19uZXdfY2xvbmUgY29uZmlnX25ld19jbG9uZTsKLXN0cnVjdCBjb25maWdfbmV3X2VtcHR5IGNvbmZpZ19uZXdfZW1wdHk7Ci1zdHJ1Y3QgY29uZmlnX3JlbW92ZV9rZXkgY29uZmlnX3JlbW92ZV9rZXk7Ci1zdHJ1Y3QgY29uZmlnX3JlbW92ZV9zZWN0aW9uIGNvbmZpZ19yZW1vdmVfc2VjdGlvbjsKLXN0cnVjdCBjb25maWdfc2F2ZSBjb25maWdfc2F2ZTsKLXN0cnVjdCBjb25maWdfc2V0X2Jvb2wgY29uZmlnX3NldF9ib29sOwotc3RydWN0IGNvbmZpZ19zZXRfaW50IGNvbmZpZ19zZXRfaW50Owotc3RydWN0IGNvbmZpZ19zZXRfc3RyaW5nIGNvbmZpZ19zZXRfc3RyaW5nOwotc3RydWN0IGNvbmZpZ19zZXRfdWludDY0IGNvbmZpZ19zZXRfdWludDY0Owotc3RydWN0IGNvbmZpZ190X0ZpbmQgY29uZmlnX3RfRmluZDsKLXN0cnVjdCBjb25maWdfdF9IYXMgY29uZmlnX3RfSGFzOwotc3RydWN0IHNlY3Rpb25fdF9GaW5kIHNlY3Rpb25fdF9GaW5kOwotc3RydWN0IHNlY3Rpb25fdF9IYXMgc2VjdGlvbl90X0hhczsKLXN0cnVjdCBzZWN0aW9uX3RfU2V0IHNlY3Rpb25fdF9TZXQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfY29uZmlnCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci1zdGQ6OnN0cmluZyBjaGVja3N1bV9yZWFkKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y2hlY2tzdW1fcmVhZChmaWxlbmFtZSk7Ci19Ci1ib29sIGNoZWNrc3VtX3NhdmUoY29uc3Qgc3RkOjpzdHJpbmcmIGNoZWNrc3VtLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjaGVja3N1bV9zYXZlKGNoZWNrc3VtLCBmaWxlbmFtZSk7Ci19Ci1ib29sIGNvbmZpZ19nZXRfYm9vbChjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgZGVmX3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y29uZmlnX2dldF9ib29sKGNvbmZpZywgc2VjdGlvbiwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZl92YWx1ZSk7Ci19Ci1pbnQgY29uZmlnX2dldF9pbnQoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IGRlZl92YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9jb25maWc6OmNvbmZpZ19nZXRfaW50KGNvbmZpZywgc2VjdGlvbiwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmX3ZhbHVlKTsKLX0KLWNvbnN0IHN0ZDo6c3RyaW5nKiBjb25maWdfZ2V0X3N0cmluZyhjb25zdCBjb25maWdfdCYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcqIGRlZl92YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9jb25maWc6OmNvbmZpZ19nZXRfc3RyaW5nKGNvbmZpZywgc2VjdGlvbiwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmX3ZhbHVlKTsKLX0KLXVpbnQ2NF90IGNvbmZpZ19nZXRfdWludDY0KGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgZGVmX3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y29uZmlnX2dldF91aW50NjQoY29uZmlnLCBzZWN0aW9uLCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZfdmFsdWUpOwotfQotYm9vbCBjb25maWdfaGFzX2tleShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9jb25maWc6OmNvbmZpZ19oYXNfa2V5KGNvbmZpZywgc2VjdGlvbiwga2V5KTsKLX0KLWJvb2wgY29uZmlnX2hhc19zZWN0aW9uKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y29uZmlnX2hhc19zZWN0aW9uKGNvbmZpZywgc2VjdGlvbik7Ci19Ci1zdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZ19uZXcoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfbmV3KGZpbGVuYW1lKTsKLX0KLXN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4gY29uZmlnX25ld19jbG9uZShjb25zdCBjb25maWdfdCYgc3JjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y29uZmlnX25ld19jbG9uZShzcmMpOwotfQotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3X2VtcHR5KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfbmV3X2VtcHR5KCk7Ci19Ci1ib29sIGNvbmZpZ19yZW1vdmVfa2V5KGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y29uZmlnX3JlbW92ZV9rZXkoY29uZmlnLCBzZWN0aW9uLCBrZXkpOwotfQotYm9vbCBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnLCBzZWN0aW9uKTsKLX0KLWJvb2wgY29uZmlnX3NhdmUoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6Y29uZmlnX3NhdmUoY29uZmlnLCBmaWxlbmFtZSk7Ci19Ci12b2lkIGNvbmZpZ19zZXRfYm9vbChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9jb25maWc6OmNvbmZpZ19zZXRfYm9vbChjb25maWcsIHNlY3Rpb24sIGtleSwgdmFsdWUpOwotfQotdm9pZCBjb25maWdfc2V0X2ludChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfc2V0X2ludChjb25maWcsIHNlY3Rpb24sIGtleSwgdmFsdWUpOwotfQotdm9pZCBjb25maWdfc2V0X3N0cmluZyhjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfc2V0X3N0cmluZyhjb25maWcsIHNlY3Rpb24sIGtleSwgdmFsdWUpOwotfQotdm9pZCBjb25maWdfc2V0X3VpbnQ2NChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9jb25maWc6OmNvbmZpZ19zZXRfdWludDY0KGNvbmZpZywgc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci19Ci1zdGQ6Omxpc3Q8c2VjdGlvbl90Pjo6aXRlcmF0b3IgY29uZmlnX3Q6OkZpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfdF9GaW5kKHNlY3Rpb24pOwotfQotYm9vbCBjb25maWdfdDo6SGFzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpjb25maWdfdF9IYXMoa2V5KTsKLX0KLXN0ZDo6bGlzdDxlbnRyeV90Pjo6aXRlcmF0b3Igc2VjdGlvbl90OjpGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpzZWN0aW9uX3RfRmluZChrZXkpOwotfQotYm9vbCBzZWN0aW9uX3Q6Okhhcyhjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2NvbmZpZzo6c2VjdGlvbl90X0hhcyhrZXkpOwotfQotdm9pZCBzZWN0aW9uX3Q6OlNldChzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfY29uZmlnOjpzZWN0aW9uX3RfU2V0KGtleSwgdmFsdWUpOwotfQotLy8gTW9ja2VkIGZ1bmN0aW9ucyBjb21wbGV0ZQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9jb25maWcuaCBiL3Rlc3QvbW9jay9tb2NrX29zaV9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyNGIwNy4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjI0Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb25maWcuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV9jb25maWcgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogY2hlY2tzdW1fcmVhZAotLy8gUGFyYW1zOiBjb25zdCBjaGFyKiBmaWxlbmFtZQotLy8gUmV0dXJuOiBzdGQ6OnN0cmluZwotc3RydWN0IGNoZWNrc3VtX3JlYWQgewotICBzdGQ6OnN0cmluZyByZXR1cm5fdmFsdWV7c3RkOjpzdHJpbmcoKX07Ci0gIHN0ZDo6ZnVuY3Rpb248c3RkOjpzdHJpbmcoY29uc3QgY2hhciogZmlsZW5hbWUpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBzdGQ6OnN0cmluZyBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7IHJldHVybiBib2R5KGZpbGVuYW1lKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNoZWNrc3VtX3JlYWQgY2hlY2tzdW1fcmVhZDsKLQotLy8gTmFtZTogY2hlY2tzdW1fc2F2ZQotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYgY2hlY2tzdW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgY2hlY2tzdW1fc2F2ZSB7Ci0gIGJvb2wgcmV0dXJuX3ZhbHVle2ZhbHNlfTsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGVja3N1bSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKT4KLSAgICAgIGJvZHl7W3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGVja3N1bSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGVja3N1bSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgcmV0dXJuIGJvZHkoY2hlY2tzdW0sIGZpbGVuYW1lKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNoZWNrc3VtX3NhdmUgY2hlY2tzdW1fc2F2ZTsKLQotLy8gTmFtZTogY29uZmlnX2dldF9ib29sCi0vLyBQYXJhbXM6IGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdAotLy8gc3RkOjpzdHJpbmcmIGtleSwgYm9vbCBkZWZfdmFsdWUgUmV0dXJuOiBib29sCi1zdHJ1Y3QgY29uZmlnX2dldF9ib29sIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBib29sIGRlZl92YWx1ZSk+Ci0gICAgICBib2R5e1t0aGlzXShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICBib29sIGRlZl92YWx1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgYm9vbCBkZWZfdmFsdWUpIHsKLSAgICByZXR1cm4gYm9keShjb25maWcsIHNlY3Rpb24sIGtleSwgZGVmX3ZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19nZXRfYm9vbCBjb25maWdfZ2V0X2Jvb2w7Ci0KLS8vIE5hbWU6IGNvbmZpZ19nZXRfaW50Ci0vLyBQYXJhbXM6IGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdAotLy8gc3RkOjpzdHJpbmcmIGtleSwgaW50IGRlZl92YWx1ZSBSZXR1cm46IGludAotc3RydWN0IGNvbmZpZ19nZXRfaW50IHsKLSAgaW50IHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxpbnQoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCBkZWZfdmFsdWUpPgotICAgICAgYm9keXtbdGhpc10oY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgaW50IGRlZl92YWx1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgaW50IG9wZXJhdG9yKCkoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCBkZWZfdmFsdWUpIHsKLSAgICByZXR1cm4gYm9keShjb25maWcsIHNlY3Rpb24sIGtleSwgZGVmX3ZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19nZXRfaW50IGNvbmZpZ19nZXRfaW50OwotCi0vLyBOYW1lOiBjb25maWdfZ2V0X3N0cmluZwotLy8gUGFyYW1zOiBjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3QKLS8vIHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nKiBkZWZfdmFsdWUgUmV0dXJuOiBjb25zdCBzdGQ6OnN0cmluZyoKLXN0cnVjdCBjb25maWdfZ2V0X3N0cmluZyB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nKiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248Y29uc3Qgc3RkOjpzdHJpbmcqKAotICAgICAgY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyogZGVmX3ZhbHVlKT4KLSAgICAgIGJvZHl7W3RoaXNdKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBkZWZfdmFsdWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nKiBvcGVyYXRvcigpKGNvbnN0IGNvbmZpZ190JiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyogZGVmX3ZhbHVlKSB7Ci0gICAgcmV0dXJuIGJvZHkoY29uZmlnLCBzZWN0aW9uLCBrZXksIGRlZl92YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfZ2V0X3N0cmluZyBjb25maWdfZ2V0X3N0cmluZzsKLQotLy8gTmFtZTogY29uZmlnX2dldF91aW50NjQKLS8vIFBhcmFtczogY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0Ci0vLyBzdGQ6OnN0cmluZyYga2V5LCB1aW50NjRfdCBkZWZfdmFsdWUgUmV0dXJuOiB1aW50NjRfdAotc3RydWN0IGNvbmZpZ19nZXRfdWludDY0IHsKLSAgdWludDY0X3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ2NF90KGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHVpbnQ2NF90IGRlZl92YWx1ZSk+Ci0gICAgICBib2R5e1t0aGlzXShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICB1aW50NjRfdCBkZWZfdmFsdWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHVpbnQ2NF90IG9wZXJhdG9yKCkoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgZGVmX3ZhbHVlKSB7Ci0gICAgcmV0dXJuIGJvZHkoY29uZmlnLCBzZWN0aW9uLCBrZXksIGRlZl92YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfZ2V0X3VpbnQ2NCBjb25maWdfZ2V0X3VpbnQ2NDsKLQotLy8gTmFtZTogY29uZmlnX2hhc19rZXkKLS8vIFBhcmFtczogY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0Ci0vLyBzdGQ6OnN0cmluZyYga2V5IFJldHVybjogYm9vbAotc3RydWN0IGNvbmZpZ19oYXNfa2V5IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KT4KLSAgICAgIGJvZHl7W3RoaXNdKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICAgIHJldHVybiBib2R5KGNvbmZpZywgc2VjdGlvbiwga2V5KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19oYXNfa2V5IGNvbmZpZ19oYXNfa2V5OwotCi0vLyBOYW1lOiBjb25maWdfaGFzX3NlY3Rpb24KLS8vIFBhcmFtczogY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24KLS8vIFJldHVybjogYm9vbAotc3RydWN0IGNvbmZpZ19oYXNfc2VjdGlvbiB7Ci0gIGJvb2wgcmV0dXJuX3ZhbHVle2ZhbHNlfTsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICAgIHJldHVybiBib2R5KGNvbmZpZywgc2VjdGlvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfaGFzX3NlY3Rpb24gY29uZmlnX2hhc19zZWN0aW9uOwotCi0vLyBOYW1lOiBjb25maWdfbmV3Ci0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIGZpbGVuYW1lCi0vLyBSZXR1cm46IHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4KLXN0cnVjdCBjb25maWdfbmV3IHsKLSAgc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+KGNvbnN0IGNoYXIqIGZpbGVuYW1lKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPGNvbmZpZ190PigpOyB9fTsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gICAgcmV0dXJuIGJvZHkoZmlsZW5hbWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgY29uZmlnX25ldyBjb25maWdfbmV3OwotCi0vLyBOYW1lOiBjb25maWdfbmV3X2Nsb25lCi0vLyBQYXJhbXM6IGNvbnN0IGNvbmZpZ190JiBzcmMKLS8vIFJldHVybjogc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190Pgotc3RydWN0IGNvbmZpZ19uZXdfY2xvbmUgewotICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4oY29uc3QgY29uZmlnX3QmIHNyYyk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBjb25maWdfdCYgc3JjKSB7IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPGNvbmZpZ190PigpOyB9fTsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBvcGVyYXRvcigpKGNvbnN0IGNvbmZpZ190JiBzcmMpIHsKLSAgICByZXR1cm4gYm9keShzcmMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgY29uZmlnX25ld19jbG9uZSBjb25maWdfbmV3X2Nsb25lOwotCi0vLyBOYW1lOiBjb25maWdfbmV3X2VtcHR5Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190Pgotc3RydWN0IGNvbmZpZ19uZXdfZW1wdHkgewotICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dW5pcXVlX3B0cjxjb25maWdfdD4odm9pZCk+IGJvZHl7Ci0gICAgICBbXSh2b2lkKSB7IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPGNvbmZpZ190PigpOyB9fTsKLSAgc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBvcGVyYXRvcigpKHZvaWQpIHsgcmV0dXJuIGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19uZXdfZW1wdHkgY29uZmlnX25ld19lbXB0eTsKLQotLy8gTmFtZTogY29uZmlnX3JlbW92ZV9rZXkKLS8vIFBhcmFtczogY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGNvbmZpZ19yZW1vdmVfa2V5IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KT4KLSAgICAgIGJvZHl7W3RoaXNdKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICAgIHJldHVybiBib2R5KGNvbmZpZywgc2VjdGlvbiwga2V5KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19yZW1vdmVfa2V5IGNvbmZpZ19yZW1vdmVfa2V5OwotCi0vLyBOYW1lOiBjb25maWdfcmVtb3ZlX3NlY3Rpb24KLS8vIFBhcmFtczogY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24KLS8vIFJldHVybjogYm9vbAotc3RydWN0IGNvbmZpZ19yZW1vdmVfc2VjdGlvbiB7Ci0gIGJvb2wgcmV0dXJuX3ZhbHVle2ZhbHNlfTsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICAgIHJldHVybiBib2R5KGNvbmZpZywgc2VjdGlvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfcmVtb3ZlX3NlY3Rpb24gY29uZmlnX3JlbW92ZV9zZWN0aW9uOwotCi0vLyBOYW1lOiBjb25maWdfc2F2ZQotLy8gUGFyYW1zOiBjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGNvbmZpZ19zYXZlIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICAgIH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgcmV0dXJuIGJvZHkoY29uZmlnLCBmaWxlbmFtZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfc2F2ZSBjb25maWdfc2F2ZTsKLQotLy8gTmFtZTogY29uZmlnX3NldF9ib29sCi0vLyBQYXJhbXM6IGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotLy8gYm9vbCB2YWx1ZSBSZXR1cm46IHZvaWQKLXN0cnVjdCBjb25maWdfc2V0X2Jvb2wgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBib29sIHZhbHVlKT4KLSAgICAgIGJvZHl7W10oY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgdmFsdWUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgYm9vbCB2YWx1ZSkgewotICAgIGJvZHkoY29uZmlnLCBzZWN0aW9uLCBrZXksIHZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19zZXRfYm9vbCBjb25maWdfc2V0X2Jvb2w7Ci0KLS8vIE5hbWU6IGNvbmZpZ19zZXRfaW50Ci0vLyBQYXJhbXM6IGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotLy8gaW50IHZhbHVlIFJldHVybjogdm9pZAotc3RydWN0IGNvbmZpZ19zZXRfaW50IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKT4KLSAgICAgIGJvZHl7W10oY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCB2YWx1ZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsKLSAgICBib2R5KGNvbmZpZywgc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfc2V0X2ludCBjb25maWdfc2V0X2ludDsKLQotLy8gTmFtZTogY29uZmlnX3NldF9zdHJpbmcKLS8vIFBhcmFtczogY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0vLyBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgY29uZmlnX3NldF9zdHJpbmcgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpPgotICAgICAgYm9keXtbXShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAgIGJvZHkoY29uZmlnLCBzZWN0aW9uLCBrZXksIHZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGNvbmZpZ19zZXRfc3RyaW5nIGNvbmZpZ19zZXRfc3RyaW5nOwotCi0vLyBOYW1lOiBjb25maWdfc2V0X3VpbnQ2NAotLy8gUGFyYW1zOiBjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLS8vIHVpbnQ2NF90IHZhbHVlIFJldHVybjogdm9pZAotc3RydWN0IGNvbmZpZ19zZXRfdWludDY0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgdmFsdWUpPgotICAgICAgYm9keXtbXShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgdmFsdWUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbmZpZ190KiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgdmFsdWUpIHsKLSAgICBib2R5KGNvbmZpZywgc2VjdGlvbiwga2V5LCB2YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfc2V0X3VpbnQ2NCBjb25maWdfc2V0X3VpbnQ2NDsKLQotLy8gTmFtZTogY29uZmlnX3Q6OkZpbmQKLS8vIFBhcmFtczogY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24KLS8vIFJldHVybjogc3RkOjpsaXN0PHNlY3Rpb25fdD46Oml0ZXJhdG9yCi1zdHJ1Y3QgY29uZmlnX3RfRmluZCB7Ci0gIHN0ZDo6bGlzdDxzZWN0aW9uX3Q+IHNlY3Rpb25fOwotICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6bGlzdDxzZWN0aW9uX3Q+OjppdGVyYXRvcihjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbik+Ci0gICAgICBib2R5e1t0aGlzXShjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgeyByZXR1cm4gc2VjdGlvbl8uYmVnaW4oKTsgfX07Ci0gIHN0ZDo6bGlzdDxzZWN0aW9uX3Q+OjppdGVyYXRvciBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSB7Ci0gICAgcmV0dXJuIGJvZHkoc2VjdGlvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb25maWdfdF9GaW5kIGNvbmZpZ190X0ZpbmQ7Ci0KLS8vIE5hbWU6IGNvbmZpZ190X0hhcwotLy8gUGFyYW1zOiBjb25zdCBzdGQ6OnN0cmluZyYga2V5Ci0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBjb25maWdfdF9IYXMgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYga2V5KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgeyByZXR1cm4gYm9keShrZXkpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgY29uZmlnX3RfSGFzIGNvbmZpZ190X0hhczsKLQotLy8gTmFtZTogc2VjdGlvbl90X0ZpbmQKLS8vIFBhcmFtczogY29uc3Qgc3RkOjpzdHJpbmcmIGtleQotLy8gUmV0dXJuOiBzdGQ6Omxpc3Q8ZW50cnlfdD46Oml0ZXJhdG9yCi1zdHJ1Y3Qgc2VjdGlvbl90X0ZpbmQgewotICBzdGQ6Omxpc3Q8ZW50cnlfdD4gbGlzdF87Ci0gIHN0ZDo6ZnVuY3Rpb248c3RkOjpsaXN0PGVudHJ5X3Q+OjppdGVyYXRvcihjb25zdCBzdGQ6OnN0cmluZyYga2V5KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7IHJldHVybiBsaXN0Xy5iZWdpbigpOyB9fTsKLSAgc3RkOjpsaXN0PGVudHJ5X3Q+OjppdGVyYXRvciBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgICByZXR1cm4gYm9keShrZXkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc2VjdGlvbl90X0ZpbmQgc2VjdGlvbl90X0ZpbmQ7Ci0KLS8vIE5hbWU6IHNlY3Rpb25fdF9IYXMKLS8vIFBhcmFtczogY29uc3Qgc3RkOjpzdHJpbmcmIGtleQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3Qgc2VjdGlvbl90X0hhcyB7Ci0gIGJvb2wgcmV0dXJuX3ZhbHVle2ZhbHNlfTsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7IHJldHVybiBib2R5KGtleSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzZWN0aW9uX3RfSGFzIHNlY3Rpb25fdF9IYXM7Ci0KLS8vIE5hbWU6IHNlY3Rpb25fdF9TZXQKLS8vIFBhcmFtczogc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZQotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgc2VjdGlvbl90X1NldCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlKT4gYm9keXsKLSAgICAgIFtdKHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpIHsgYm9keShrZXksIHZhbHVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNlY3Rpb25fdF9TZXQgc2VjdGlvbl90X1NldDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9jb25maWcKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX2ZpeGVkX3F1ZXVlLmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX2ZpeGVkX3F1ZXVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU3MDQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9maXhlZF9xdWV1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTgKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX29zaV9maXhlZF9xdWV1ZS5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfZml4ZWRfcXVldWUgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBmaXhlZF9xdWV1ZV9jYXBhY2l0eSBmaXhlZF9xdWV1ZV9jYXBhY2l0eTsKLXN0cnVjdCBmaXhlZF9xdWV1ZV9kZXF1ZXVlIGZpeGVkX3F1ZXVlX2RlcXVldWU7Ci1zdHJ1Y3QgZml4ZWRfcXVldWVfZW5xdWV1ZSBmaXhlZF9xdWV1ZV9lbnF1ZXVlOwotc3RydWN0IGZpeGVkX3F1ZXVlX2ZsdXNoIGZpeGVkX3F1ZXVlX2ZsdXNoOwotc3RydWN0IGZpeGVkX3F1ZXVlX2ZyZWUgZml4ZWRfcXVldWVfZnJlZTsKLXN0cnVjdCBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZCBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZDsKLXN0cnVjdCBmaXhlZF9xdWV1ZV9nZXRfZW5xdWV1ZV9mZCBmaXhlZF9xdWV1ZV9nZXRfZW5xdWV1ZV9mZDsKLXN0cnVjdCBmaXhlZF9xdWV1ZV9nZXRfbGlzdCBmaXhlZF9xdWV1ZV9nZXRfbGlzdDsKLXN0cnVjdCBmaXhlZF9xdWV1ZV9pc19lbXB0eSBmaXhlZF9xdWV1ZV9pc19lbXB0eTsKLXN0cnVjdCBmaXhlZF9xdWV1ZV9sZW5ndGggZml4ZWRfcXVldWVfbGVuZ3RoOwotc3RydWN0IGZpeGVkX3F1ZXVlX25ldyBmaXhlZF9xdWV1ZV9uZXc7Ci1zdHJ1Y3QgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZSBmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlOwotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlIGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlOwotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlIGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlOwotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0Owotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2xhc3QgZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdDsKLXN0cnVjdCBmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUgZml4ZWRfcXVldWVfdHJ5X3JlbW92ZV9mcm9tX3F1ZXVlOwotc3RydWN0IGZpeGVkX3F1ZXVlX3VucmVnaXN0ZXJfZGVxdWV1ZSBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfZml4ZWRfcXVldWUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXNpemVfdCBmaXhlZF9xdWV1ZV9jYXBhY2l0eShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfY2FwYWNpdHkocXVldWUpOwotfQotdm9pZCogZml4ZWRfcXVldWVfZGVxdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfZGVxdWV1ZShxdWV1ZSk7Ci19Ci12b2lkIGZpeGVkX3F1ZXVlX2VucXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfZW5xdWV1ZShxdWV1ZSwgZGF0YSk7Ci19Ci12b2lkIGZpeGVkX3F1ZXVlX2ZsdXNoKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBmaXhlZF9xdWV1ZV9mcmVlX2NiIGZyZWVfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfZmx1c2gocXVldWUsIGZyZWVfY2IpOwotfQotdm9pZCBmaXhlZF9xdWV1ZV9mcmVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBmaXhlZF9xdWV1ZV9mcmVlX2NiIGZyZWVfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfZnJlZShxdWV1ZSwgZnJlZV9jYik7Ci19Ci1pbnQgZml4ZWRfcXVldWVfZ2V0X2RlcXVldWVfZmQoY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfZml4ZWRfcXVldWU6OmZpeGVkX3F1ZXVlX2dldF9kZXF1ZXVlX2ZkKHF1ZXVlKTsKLX0KLWludCBmaXhlZF9xdWV1ZV9nZXRfZW5xdWV1ZV9mZChjb25zdCBmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfZ2V0X2VucXVldWVfZmQocXVldWUpOwotfQotbGlzdF90KiBmaXhlZF9xdWV1ZV9nZXRfbGlzdChmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfZ2V0X2xpc3QocXVldWUpOwotfQotYm9vbCBmaXhlZF9xdWV1ZV9pc19lbXB0eShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfaXNfZW1wdHkocXVldWUpOwotfQotc2l6ZV90IGZpeGVkX3F1ZXVlX2xlbmd0aChmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfbGVuZ3RoKHF1ZXVlKTsKLX0KLWZpeGVkX3F1ZXVlX3QqIGZpeGVkX3F1ZXVlX25ldyhzaXplX3QgY2FwYWNpdHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfZml4ZWRfcXVldWU6OmZpeGVkX3F1ZXVlX25ldyhjYXBhY2l0eSk7Ci19Ci12b2lkIGZpeGVkX3F1ZXVlX3JlZ2lzdGVyX2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHJlYWN0b3JfdCogcmVhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9xdWV1ZV9jYiByZWFkeV9jYiwgdm9pZCogY29udGV4dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2ZpeGVkX3F1ZXVlOjpmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlKHF1ZXVlLCByZWFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfY2IsIGNvbnRleHQpOwotfQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfZml4ZWRfcXVldWU6OmZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlKHF1ZXVlKTsKLX0KLWJvb2wgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfZml4ZWRfcXVldWU6OmZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlKHF1ZXVlLCBkYXRhKTsKLX0KLXZvaWQqIGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0KGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2ZpeGVkX3F1ZXVlOjpmaXhlZF9xdWV1ZV90cnlfcGVla19maXJzdChxdWV1ZSk7Ci19Ci12b2lkKiBmaXhlZF9xdWV1ZV90cnlfcGVla19sYXN0KGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2ZpeGVkX3F1ZXVlOjpmaXhlZF9xdWV1ZV90cnlfcGVla19sYXN0KHF1ZXVlKTsKLX0KLXZvaWQqIGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9maXhlZF9xdWV1ZTo6Zml4ZWRfcXVldWVfdHJ5X3JlbW92ZV9mcm9tX3F1ZXVlKHF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci19Ci12b2lkIGZpeGVkX3F1ZXVlX3VucmVnaXN0ZXJfZGVxdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2ZpeGVkX3F1ZXVlOjpmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUocXVldWUpOwotfQotLy8gTW9ja2VkIGZ1bmN0aW9ucyBjb21wbGV0ZQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9maXhlZF9xdWV1ZS5oIGIvdGVzdC9tb2NrL21vY2tfb3NpX2ZpeGVkX3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzRlZjguLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX2ZpeGVkX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE4Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xpc3QuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9yZWFjdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc2VtYXBob3JlLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfZml4ZWRfcXVldWUgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogZml4ZWRfcXVldWVfY2FwYWNpdHkKLS8vIFBhcmFtczogZml4ZWRfcXVldWVfdCogcXVldWUKLS8vIFJldHVybjogc2l6ZV90Ci1zdHJ1Y3QgZml4ZWRfcXVldWVfY2FwYWNpdHkgewotICBzaXplX3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNpemVfdChmaXhlZF9xdWV1ZV90KiBxdWV1ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oZml4ZWRfcXVldWVfdCogcXVldWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNpemVfdCBvcGVyYXRvcigpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiBib2R5KHF1ZXVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX2NhcGFjaXR5IGZpeGVkX3F1ZXVlX2NhcGFjaXR5OwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV9kZXF1ZXVlCi0vLyBQYXJhbXM6IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlCi0vLyBSZXR1cm46IHZvaWQqCi1zdHJ1Y3QgZml4ZWRfcXVldWVfZGVxdWV1ZSB7Ci0gIHZvaWQqIHJldHVybl92YWx1ZXt9OwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQqKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKT4gYm9keXsKLSAgICAgIFt0aGlzXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gYm9keShxdWV1ZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmaXhlZF9xdWV1ZV9kZXF1ZXVlIGZpeGVkX3F1ZXVlX2RlcXVldWU7Ci0KLS8vIE5hbWU6IGZpeGVkX3F1ZXVlX2VucXVldWUKLS8vIFBhcmFtczogZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGZpeGVkX3F1ZXVlX2VucXVldWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpPiBib2R5ewotICAgICAgW10oZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCB2b2lkKiBkYXRhKSB7IGJvZHkocXVldWUsIGRhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZml4ZWRfcXVldWVfZW5xdWV1ZSBmaXhlZF9xdWV1ZV9lbnF1ZXVlOwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV9mbHVzaAotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgZml4ZWRfcXVldWVfZnJlZV9jYiBmcmVlX2NiCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBmaXhlZF9xdWV1ZV9mbHVzaCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgZml4ZWRfcXVldWVfZnJlZV9jYiBmcmVlX2NiKT4gYm9keXsKLSAgICAgIFtdKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBmaXhlZF9xdWV1ZV9mcmVlX2NiIGZyZWVfY2IpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBmaXhlZF9xdWV1ZV9mcmVlX2NiIGZyZWVfY2IpIHsKLSAgICBib2R5KHF1ZXVlLCBmcmVlX2NiKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX2ZsdXNoIGZpeGVkX3F1ZXVlX2ZsdXNoOwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV9mcmVlCi0vLyBQYXJhbXM6IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCBmaXhlZF9xdWV1ZV9mcmVlX2NiIGZyZWVfY2IKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGZpeGVkX3F1ZXVlX2ZyZWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoZml4ZWRfcXVldWVfdCogcXVldWUsIGZpeGVkX3F1ZXVlX2ZyZWVfY2IgZnJlZV9jYik+IGJvZHl7Ci0gICAgICBbXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgZml4ZWRfcXVldWVfZnJlZV9jYiBmcmVlX2NiKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgZml4ZWRfcXVldWVfZnJlZV9jYiBmcmVlX2NiKSB7Ci0gICAgYm9keShxdWV1ZSwgZnJlZV9jYik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmaXhlZF9xdWV1ZV9mcmVlIGZpeGVkX3F1ZXVlX2ZyZWU7Ci0KLS8vIE5hbWU6IGZpeGVkX3F1ZXVlX2dldF9kZXF1ZXVlX2ZkCi0vLyBQYXJhbXM6IGNvbnN0IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlCi0vLyBSZXR1cm46IGludAotc3RydWN0IGZpeGVkX3F1ZXVlX2dldF9kZXF1ZXVlX2ZkIHsKLSAgaW50IHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxpbnQoY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBpbnQgb3BlcmF0b3IoKShjb25zdCBmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gYm9keShxdWV1ZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZCBmaXhlZF9xdWV1ZV9nZXRfZGVxdWV1ZV9mZDsKLQotLy8gTmFtZTogZml4ZWRfcXVldWVfZ2V0X2VucXVldWVfZmQKLS8vIFBhcmFtczogY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUKLS8vIFJldHVybjogaW50Ci1zdHJ1Y3QgZml4ZWRfcXVldWVfZ2V0X2VucXVldWVfZmQgewotICBpbnQgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPGludChjb25zdCBmaXhlZF9xdWV1ZV90KiBxdWV1ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgZml4ZWRfcXVldWVfdCogcXVldWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGludCBvcGVyYXRvcigpKGNvbnN0IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiBib2R5KHF1ZXVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX2dldF9lbnF1ZXVlX2ZkIGZpeGVkX3F1ZXVlX2dldF9lbnF1ZXVlX2ZkOwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV9nZXRfbGlzdAotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZQotLy8gUmV0dXJuOiBsaXN0X3QqCi1zdHJ1Y3QgZml4ZWRfcXVldWVfZ2V0X2xpc3QgewotICBsaXN0X3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxsaXN0X3QqKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKT4gYm9keXsKLSAgICAgIFt0aGlzXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgbGlzdF90KiBvcGVyYXRvcigpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiBib2R5KHF1ZXVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX2dldF9saXN0IGZpeGVkX3F1ZXVlX2dldF9saXN0OwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV9pc19lbXB0eQotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgZml4ZWRfcXVldWVfaXNfZW1wdHkgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChmaXhlZF9xdWV1ZV90KiBxdWV1ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oZml4ZWRfcXVldWVfdCogcXVldWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gYm9keShxdWV1ZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmaXhlZF9xdWV1ZV9pc19lbXB0eSBmaXhlZF9xdWV1ZV9pc19lbXB0eTsKLQotLy8gTmFtZTogZml4ZWRfcXVldWVfbGVuZ3RoCi0vLyBQYXJhbXM6IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlCi0vLyBSZXR1cm46IHNpemVfdAotc3RydWN0IGZpeGVkX3F1ZXVlX2xlbmd0aCB7Ci0gIHNpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c2l6ZV90KGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKT4gYm9keXsKLSAgICAgIFt0aGlzXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgc2l6ZV90IG9wZXJhdG9yKCkoZml4ZWRfcXVldWVfdCogcXVldWUpIHsgcmV0dXJuIGJvZHkocXVldWUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZml4ZWRfcXVldWVfbGVuZ3RoIGZpeGVkX3F1ZXVlX2xlbmd0aDsKLQotLy8gTmFtZTogZml4ZWRfcXVldWVfbmV3Ci0vLyBQYXJhbXM6IHNpemVfdCBjYXBhY2l0eQotLy8gUmV0dXJuOiBmaXhlZF9xdWV1ZV90Kgotc3RydWN0IGZpeGVkX3F1ZXVlX25ldyB7Ci0gIGZpeGVkX3F1ZXVlX3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxmaXhlZF9xdWV1ZV90KihzaXplX3QgY2FwYWNpdHkpPiBib2R5ewotICAgICAgW3RoaXNdKHNpemVfdCBjYXBhY2l0eSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgZml4ZWRfcXVldWVfdCogb3BlcmF0b3IoKShzaXplX3QgY2FwYWNpdHkpIHsgcmV0dXJuIGJvZHkoY2FwYWNpdHkpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZml4ZWRfcXVldWVfbmV3IGZpeGVkX3F1ZXVlX25ldzsKLQotLy8gTmFtZTogZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZQotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgcmVhY3Rvcl90KiByZWFjdG9yLCBmaXhlZF9xdWV1ZV9jYiByZWFkeV9jYiwKLS8vIHZvaWQqIGNvbnRleHQgUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgcmVhY3Rvcl90KiByZWFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgZml4ZWRfcXVldWVfY2IgcmVhZHlfY2IsIHZvaWQqIGNvbnRleHQpPgotICAgICAgYm9keXtbXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgcmVhY3Rvcl90KiByZWFjdG9yLCBmaXhlZF9xdWV1ZV9jYiByZWFkeV9jYiwKLSAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoZml4ZWRfcXVldWVfdCogcXVldWUsIHJlYWN0b3JfdCogcmVhY3RvciwKLSAgICAgICAgICAgICAgICAgIGZpeGVkX3F1ZXVlX2NiIHJlYWR5X2NiLCB2b2lkKiBjb250ZXh0KSB7Ci0gICAgYm9keShxdWV1ZSwgcmVhY3RvciwgcmVhZHlfY2IsIGNvbnRleHQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZml4ZWRfcXVldWVfcmVnaXN0ZXJfZGVxdWV1ZSBmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlOwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV90cnlfZGVxdWV1ZQotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZQotLy8gUmV0dXJuOiB2b2lkKgotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlIHsKLSAgdm9pZCogcmV0dXJuX3ZhbHVle307Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCooZml4ZWRfcXVldWVfdCogcXVldWUpPiBib2R5ewotICAgICAgW3RoaXNdKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICB2b2lkKiBvcGVyYXRvcigpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiBib2R5KHF1ZXVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlIGZpeGVkX3F1ZXVlX3RyeV9kZXF1ZXVlOwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV90cnlfZW5xdWV1ZQotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSk+IGJvZHl7Ci0gICAgICBbdGhpc10oZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgewotICAgIHJldHVybiBib2R5KHF1ZXVlLCBkYXRhKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlIGZpeGVkX3F1ZXVlX3RyeV9lbnF1ZXVlOwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV90cnlfcGVla19maXJzdAotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZQotLy8gUmV0dXJuOiB2b2lkKgotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0IHsKLSAgdm9pZCogcmV0dXJuX3ZhbHVle307Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCooZml4ZWRfcXVldWVfdCogcXVldWUpPiBib2R5ewotICAgICAgW3RoaXNdKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICB2b2lkKiBvcGVyYXRvcigpKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7IHJldHVybiBib2R5KHF1ZXVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2ZpcnN0OwotCi0vLyBOYW1lOiBmaXhlZF9xdWV1ZV90cnlfcGVla19sYXN0Ci0vLyBQYXJhbXM6IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlCi0vLyBSZXR1cm46IHZvaWQqCi1zdHJ1Y3QgZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdCB7Ci0gIHZvaWQqIHJldHVybl92YWx1ZXt9OwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQqKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKT4gYm9keXsKLSAgICAgIFt0aGlzXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyByZXR1cm4gYm9keShxdWV1ZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmaXhlZF9xdWV1ZV90cnlfcGVla19sYXN0IGZpeGVkX3F1ZXVlX3RyeV9wZWVrX2xhc3Q7Ci0KLS8vIE5hbWU6IGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZQotLy8gUGFyYW1zOiBmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YQotLy8gUmV0dXJuOiB2b2lkKgotc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZSB7Ci0gIHZvaWQqIHJldHVybl92YWx1ZXt9OwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQqKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCB2b2lkKiBkYXRhKT4gYm9keXsKLSAgICAgIFt0aGlzXShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgewotICAgIHJldHVybiBib2R5KHF1ZXVlLCBkYXRhKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZQotICAgIGZpeGVkX3F1ZXVlX3RyeV9yZW1vdmVfZnJvbV9xdWV1ZTsKLQotLy8gTmFtZTogZml4ZWRfcXVldWVfdW5yZWdpc3Rlcl9kZXF1ZXVlCi0vLyBQYXJhbXM6IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoZml4ZWRfcXVldWVfdCogcXVldWUpPiBib2R5e1tdKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgeyBib2R5KHF1ZXVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZpeGVkX3F1ZXVlX3VucmVnaXN0ZXJfZGVxdWV1ZSBmaXhlZF9xdWV1ZV91bnJlZ2lzdGVyX2RlcXVldWU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfZml4ZWRfcXVldWUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9mdXR1cmUuY2MgYi90ZXN0L21vY2svbW9ja19vc2lfZnV0dXJlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDZmNTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9mdXR1cmUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfb3NpX2Z1dHVyZS5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfZnV0dXJlIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgZnV0dXJlX2F3YWl0IGZ1dHVyZV9hd2FpdDsKLXN0cnVjdCBmdXR1cmVfbmV3IGZ1dHVyZV9uZXc7Ci1zdHJ1Y3QgZnV0dXJlX25ld19uYW1lZCBmdXR1cmVfbmV3X25hbWVkOwotc3RydWN0IGZ1dHVyZV9uZXdfaW1tZWRpYXRlIGZ1dHVyZV9uZXdfaW1tZWRpYXRlOwotc3RydWN0IGZ1dHVyZV9yZWFkeSBmdXR1cmVfcmVhZHk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfZnV0dXJlCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkKiBmdXR1cmVfYXdhaXQoZnV0dXJlX3QqIGZ1dHVyZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9mdXR1cmU6OmZ1dHVyZV9hd2FpdChmdXR1cmUpOwotfQotZnV0dXJlX3QqIGZ1dHVyZV9uZXcodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9mdXR1cmU6OmZ1dHVyZV9uZXcoKTsKLX0KLWZ1dHVyZV90KiBmdXR1cmVfbmV3X25hbWVkKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfZnV0dXJlOjpmdXR1cmVfbmV3X25hbWVkKG5hbWUpOwotfQotZnV0dXJlX3QqIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKHZvaWQqIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2Z1dHVyZTo6ZnV0dXJlX25ld19pbW1lZGlhdGUodmFsdWUpOwotfQotdm9pZCBmdXR1cmVfcmVhZHkoZnV0dXJlX3QqIGZ1dHVyZSwgdm9pZCogdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9mdXR1cmU6OmZ1dHVyZV9yZWFkeShmdXR1cmUsIHZhbHVlKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfZnV0dXJlLmggYi90ZXN0L21vY2svbW9ja19vc2lfZnV0dXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTViODUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX2Z1dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZnV0dXJlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc2VtYXBob3JlLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfZnV0dXJlIHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IGZ1dHVyZV9hd2FpdAotLy8gUGFyYW1zOiBmdXR1cmVfdCogZnV0dXJlCi0vLyBSZXR1cm46IHZvaWQqCi1zdHJ1Y3QgZnV0dXJlX2F3YWl0IHsKLSAgdm9pZCogcmV0dXJuX3ZhbHVle307Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCooZnV0dXJlX3QqIGZ1dHVyZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oZnV0dXJlX3QqIGZ1dHVyZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKShmdXR1cmVfdCogZnV0dXJlKSB7IHJldHVybiBib2R5KGZ1dHVyZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmdXR1cmVfYXdhaXQgZnV0dXJlX2F3YWl0OwotCi0vLyBOYW1lOiBmdXR1cmVfbmV3Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogZnV0dXJlX3QqCi1zdHJ1Y3QgZnV0dXJlX25ldyB7Ci0gIGZ1dHVyZV90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248ZnV0dXJlX3QqKHZvaWQpPiBib2R5e1t0aGlzXSh2b2lkKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBmdXR1cmVfdCogb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmdXR1cmVfbmV3IGZ1dHVyZV9uZXc7Ci0KLS8vIE5hbWU6IGZ1dHVyZV9uZXdfbmFtZWQKLS8vIFBhcmFtczogY29uc3QgY2hhciogbmFtZQotLy8gUmV0dXJuOiBmdXR1cmVfdCoKLXN0cnVjdCBmdXR1cmVfbmV3X25hbWVkIHsKLSAgZnV0dXJlX3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxmdXR1cmVfdCooY29uc3QgY2hhciogbmFtZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgZnV0dXJlX3QqIG9wZXJhdG9yKCkoY29uc3QgY2hhciogbmFtZSkgeyByZXR1cm4gYm9keShuYW1lKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZ1dHVyZV9uZXdfbmFtZWQgZnV0dXJlX25ld19uYW1lZDsKLQotLy8gTmFtZTogZnV0dXJlX25ld19pbW1lZGlhdGUKLS8vIFBhcmFtczogdm9pZCogdmFsdWUKLS8vIFJldHVybjogZnV0dXJlX3QqCi1zdHJ1Y3QgZnV0dXJlX25ld19pbW1lZGlhdGUgewotICBmdXR1cmVfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPGZ1dHVyZV90Kih2b2lkKiB2YWx1ZSk+IGJvZHl7W3RoaXNdKHZvaWQqIHZhbHVlKSB7Ci0gICAgQ0hFQ0soMCk7Ci0gICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgfX07Ci0gIGZ1dHVyZV90KiBvcGVyYXRvcigpKHZvaWQqIHZhbHVlKSB7IHJldHVybiBib2R5KHZhbHVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZ1dHVyZV9uZXdfaW1tZWRpYXRlIGZ1dHVyZV9uZXdfaW1tZWRpYXRlOwotCi0vLyBOYW1lOiBmdXR1cmVfcmVhZHkKLS8vIFBhcmFtczogZnV0dXJlX3QqIGZ1dHVyZSwgdm9pZCogdmFsdWUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGZ1dHVyZV9yZWFkeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChmdXR1cmVfdCogZnV0dXJlLCB2b2lkKiB2YWx1ZSk+IGJvZHl7Ci0gICAgICBbXShmdXR1cmVfdCogZnV0dXJlLCB2b2lkKiB2YWx1ZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoZnV0dXJlX3QqIGZ1dHVyZSwgdm9pZCogdmFsdWUpIHsgYm9keShmdXR1cmUsIHZhbHVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGZ1dHVyZV9yZWFkeSBmdXR1cmVfcmVhZHk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfZnV0dXJlCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9saXN0LmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX2xpc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGNkNzcuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX2xpc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE5Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19vc2lfbGlzdC5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfbGlzdCB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGxpc3RfYXBwZW5kIGxpc3RfYXBwZW5kOwotc3RydWN0IGxpc3RfYmFjayBsaXN0X2JhY2s7Ci1zdHJ1Y3QgbGlzdF9iYWNrX25vZGUgbGlzdF9iYWNrX25vZGU7Ci1zdHJ1Y3QgbGlzdF9iZWdpbiBsaXN0X2JlZ2luOwotc3RydWN0IGxpc3RfY2xlYXIgbGlzdF9jbGVhcjsKLXN0cnVjdCBsaXN0X2NvbnRhaW5zIGxpc3RfY29udGFpbnM7Ci1zdHJ1Y3QgbGlzdF9lbmQgbGlzdF9lbmQ7Ci1zdHJ1Y3QgbGlzdF9mb3JlYWNoIGxpc3RfZm9yZWFjaDsKLXN0cnVjdCBsaXN0X2ZyZWUgbGlzdF9mcmVlOwotc3RydWN0IGxpc3RfZnJvbnQgbGlzdF9mcm9udDsKLXN0cnVjdCBsaXN0X2luc2VydF9hZnRlciBsaXN0X2luc2VydF9hZnRlcjsKLXN0cnVjdCBsaXN0X2lzX2VtcHR5IGxpc3RfaXNfZW1wdHk7Ci1zdHJ1Y3QgbGlzdF9sZW5ndGggbGlzdF9sZW5ndGg7Ci1zdHJ1Y3QgbGlzdF9uZXcgbGlzdF9uZXc7Ci1zdHJ1Y3QgbGlzdF9uZXdfaW50ZXJuYWwgbGlzdF9uZXdfaW50ZXJuYWw7Ci1zdHJ1Y3QgbGlzdF9uZXh0IGxpc3RfbmV4dDsKLXN0cnVjdCBsaXN0X25vZGUgbGlzdF9ub2RlOwotc3RydWN0IGxpc3RfcHJlcGVuZCBsaXN0X3ByZXBlbmQ7Ci1zdHJ1Y3QgbGlzdF9yZW1vdmUgbGlzdF9yZW1vdmU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfbGlzdAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotYm9vbCBsaXN0X2FwcGVuZChsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfbGlzdDo6bGlzdF9hcHBlbmQobGlzdCwgZGF0YSk7Ci19Ci12b2lkKiBsaXN0X2JhY2soY29uc3QgbGlzdF90KiBsaXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2xpc3Q6Omxpc3RfYmFjayhsaXN0KTsKLX0KLWxpc3Rfbm9kZV90KiBsaXN0X2JhY2tfbm9kZShjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfbGlzdDo6bGlzdF9iYWNrX25vZGUobGlzdCk7Ci19Ci1saXN0X25vZGVfdCogbGlzdF9iZWdpbihjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfbGlzdDo6bGlzdF9iZWdpbihsaXN0KTsKLX0KLXZvaWQgbGlzdF9jbGVhcihsaXN0X3QqIGxpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X2NsZWFyKGxpc3QpOwotfQotYm9vbCBsaXN0X2NvbnRhaW5zKGNvbnN0IGxpc3RfdCogbGlzdCwgY29uc3Qgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X2NvbnRhaW5zKGxpc3QsIGRhdGEpOwotfQotbGlzdF9ub2RlX3QqIGxpc3RfZW5kKGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X2VuZChsaXN0KTsKLX0KLWxpc3Rfbm9kZV90KiBsaXN0X2ZvcmVhY2goY29uc3QgbGlzdF90KiBsaXN0LCBsaXN0X2l0ZXJfY2IgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfbGlzdDo6bGlzdF9mb3JlYWNoKGxpc3QsIGNhbGxiYWNrLCBjb250ZXh0KTsKLX0KLXZvaWQgbGlzdF9mcmVlKGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX2xpc3Q6Omxpc3RfZnJlZShsaXN0KTsKLX0KLXZvaWQqIGxpc3RfZnJvbnQoY29uc3QgbGlzdF90KiBsaXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2xpc3Q6Omxpc3RfZnJvbnQobGlzdCk7Ci19Ci1ib29sIGxpc3RfaW5zZXJ0X2FmdGVyKGxpc3RfdCogbGlzdCwgbGlzdF9ub2RlX3QqIHByZXZfbm9kZSwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X2luc2VydF9hZnRlcihsaXN0LCBwcmV2X25vZGUsIGRhdGEpOwotfQotYm9vbCBsaXN0X2lzX2VtcHR5KGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X2lzX2VtcHR5KGxpc3QpOwotfQotc2l6ZV90IGxpc3RfbGVuZ3RoKGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X2xlbmd0aChsaXN0KTsKLX0KLWxpc3RfdCogbGlzdF9uZXcobGlzdF9mcmVlX2NiIGNhbGxiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2xpc3Q6Omxpc3RfbmV3KGNhbGxiYWNrKTsKLX0KLWxpc3RfdCogbGlzdF9uZXdfaW50ZXJuYWwobGlzdF9mcmVlX2NiIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdCogemVyb2VkX2FsbG9jYXRvcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X25ld19pbnRlcm5hbChjYWxsYmFjaywgemVyb2VkX2FsbG9jYXRvcik7Ci19Ci1saXN0X25vZGVfdCogbGlzdF9uZXh0KGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX2xpc3Q6Omxpc3RfbmV4dChub2RlKTsKLX0KLXZvaWQqIGxpc3Rfbm9kZShjb25zdCBsaXN0X25vZGVfdCogbm9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9saXN0OjpsaXN0X25vZGUobm9kZSk7Ci19Ci1ib29sIGxpc3RfcHJlcGVuZChsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfbGlzdDo6bGlzdF9wcmVwZW5kKGxpc3QsIGRhdGEpOwotfQotYm9vbCBsaXN0X3JlbW92ZShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfbGlzdDo6bGlzdF9yZW1vdmUobGlzdCwgZGF0YSk7Ci19Ci0vLyBNb2NrZWQgZnVuY3Rpb25zIGNvbXBsZXRlCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX2xpc3QuaCBiL3Rlc3QvbW9jay9tb2NrX29zaV9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjFlZTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTkKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9saXN0LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfbGlzdCB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBsaXN0X2FwcGVuZAotLy8gUGFyYW1zOiBsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGxpc3RfYXBwZW5kIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKT4gYm9keXsKLSAgICAgIFt0aGlzXShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIGJvZHkobGlzdCwgZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2FwcGVuZCBsaXN0X2FwcGVuZDsKLQotLy8gTmFtZTogbGlzdF9iYWNrCi0vLyBQYXJhbXM6IGNvbnN0IGxpc3RfdCogbGlzdAotLy8gUmV0dXJuOiB2b2lkKgotc3RydWN0IGxpc3RfYmFjayB7Ci0gIHZvaWQqIHJldHVybl92YWx1ZXt9OwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQqKGNvbnN0IGxpc3RfdCogbGlzdCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgbGlzdF90KiBsaXN0KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICB2b2lkKiBvcGVyYXRvcigpKGNvbnN0IGxpc3RfdCogbGlzdCkgeyByZXR1cm4gYm9keShsaXN0KTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxpc3RfYmFjayBsaXN0X2JhY2s7Ci0KLS8vIE5hbWU6IGxpc3RfYmFja19ub2RlCi0vLyBQYXJhbXM6IGNvbnN0IGxpc3RfdCogbGlzdAotLy8gUmV0dXJuOiBsaXN0X25vZGVfdCoKLXN0cnVjdCBsaXN0X2JhY2tfbm9kZSB7Ci0gIGxpc3Rfbm9kZV90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248bGlzdF9ub2RlX3QqKGNvbnN0IGxpc3RfdCogbGlzdCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgbGlzdF90KiBsaXN0KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBsaXN0X25vZGVfdCogb3BlcmF0b3IoKShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIGJvZHkobGlzdCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2JhY2tfbm9kZSBsaXN0X2JhY2tfbm9kZTsKLQotLy8gTmFtZTogbGlzdF9iZWdpbgotLy8gUGFyYW1zOiBjb25zdCBsaXN0X3QqIGxpc3QKLS8vIFJldHVybjogbGlzdF9ub2RlX3QqCi1zdHJ1Y3QgbGlzdF9iZWdpbiB7Ci0gIGxpc3Rfbm9kZV90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248bGlzdF9ub2RlX3QqKGNvbnN0IGxpc3RfdCogbGlzdCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgbGlzdF90KiBsaXN0KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBsaXN0X25vZGVfdCogb3BlcmF0b3IoKShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIGJvZHkobGlzdCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2JlZ2luIGxpc3RfYmVnaW47Ci0KLS8vIE5hbWU6IGxpc3RfY2xlYXIKLS8vIFBhcmFtczogbGlzdF90KiBsaXN0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBsaXN0X2NsZWFyIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGxpc3RfdCogbGlzdCk+IGJvZHl7W10obGlzdF90KiBsaXN0KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShsaXN0X3QqIGxpc3QpIHsgYm9keShsaXN0KTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxpc3RfY2xlYXIgbGlzdF9jbGVhcjsKLQotLy8gTmFtZTogbGlzdF9jb250YWlucwotLy8gUGFyYW1zOiBjb25zdCBsaXN0X3QqIGxpc3QsIGNvbnN0IHZvaWQqIGRhdGEKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGxpc3RfY29udGFpbnMgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBsaXN0X3QqIGxpc3QsIGNvbnN0IHZvaWQqIGRhdGEpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGxpc3RfdCogbGlzdCwgY29uc3Qgdm9pZCogZGF0YSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGxpc3RfdCogbGlzdCwgY29uc3Qgdm9pZCogZGF0YSkgewotICAgIHJldHVybiBib2R5KGxpc3QsIGRhdGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9jb250YWlucyBsaXN0X2NvbnRhaW5zOwotCi0vLyBOYW1lOiBsaXN0X2VuZAotLy8gUGFyYW1zOiAgY29uc3QgbGlzdF90KiBsaXN0Ci0vLyBSZXR1cm46IGxpc3Rfbm9kZV90Kgotc3RydWN0IGxpc3RfZW5kIHsKLSAgbGlzdF9ub2RlX3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxsaXN0X25vZGVfdCooY29uc3QgbGlzdF90KiBsaXN0KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGxpc3Rfbm9kZV90KiBvcGVyYXRvcigpKGNvbnN0IGxpc3RfdCogbGlzdCkgeyByZXR1cm4gYm9keShsaXN0KTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxpc3RfZW5kIGxpc3RfZW5kOwotCi0vLyBOYW1lOiBsaXN0X2ZvcmVhY2gKLS8vIFBhcmFtczogY29uc3QgbGlzdF90KiBsaXN0LCBsaXN0X2l0ZXJfY2IgY2FsbGJhY2ssIHZvaWQqIGNvbnRleHQKLS8vIFJldHVybjogbGlzdF9ub2RlX3QqCi1zdHJ1Y3QgbGlzdF9mb3JlYWNoIHsKLSAgbGlzdF9ub2RlX3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxsaXN0X25vZGVfdCooY29uc3QgbGlzdF90KiBsaXN0LCBsaXN0X2l0ZXJfY2IgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpPgotICAgICAgYm9keXtbdGhpc10oY29uc3QgbGlzdF90KiBsaXN0LCBsaXN0X2l0ZXJfY2IgY2FsbGJhY2ssIHZvaWQqIGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICAgIH19OwotICBsaXN0X25vZGVfdCogb3BlcmF0b3IoKShjb25zdCBsaXN0X3QqIGxpc3QsIGxpc3RfaXRlcl9jYiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkgewotICAgIHJldHVybiBib2R5KGxpc3QsIGNhbGxiYWNrLCBjb250ZXh0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxpc3RfZm9yZWFjaCBsaXN0X2ZvcmVhY2g7Ci0KLS8vIE5hbWU6IGxpc3RfZnJlZQotLy8gUGFyYW1zOiBsaXN0X3QqIGxpc3QKLS8vIFJldHVybjogdm9pZAotc3RydWN0IGxpc3RfZnJlZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChsaXN0X3QqIGxpc3QpPiBib2R5e1tdKGxpc3RfdCogbGlzdCkge319OwotICB2b2lkIG9wZXJhdG9yKCkobGlzdF90KiBsaXN0KSB7IGJvZHkobGlzdCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2ZyZWUgbGlzdF9mcmVlOwotCi0vLyBOYW1lOiBsaXN0X2Zyb250Ci0vLyBQYXJhbXM6IGNvbnN0IGxpc3RfdCogbGlzdAotLy8gUmV0dXJuOiB2b2lkKgotc3RydWN0IGxpc3RfZnJvbnQgewotICB2b2lkKiByZXR1cm5fdmFsdWV7fTsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKihjb25zdCBsaXN0X3QqIGxpc3QpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGxpc3RfdCogbGlzdCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgdm9pZCogb3BlcmF0b3IoKShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIGJvZHkobGlzdCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2Zyb250IGxpc3RfZnJvbnQ7Ci0KLS8vIE5hbWU6IGxpc3RfaW5zZXJ0X2FmdGVyCi0vLyBQYXJhbXM6IGxpc3RfdCogbGlzdCwgbGlzdF9ub2RlX3QqIHByZXZfbm9kZSwgdm9pZCogZGF0YQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgbGlzdF9pbnNlcnRfYWZ0ZXIgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChsaXN0X3QqIGxpc3QsIGxpc3Rfbm9kZV90KiBwcmV2X25vZGUsIHZvaWQqIGRhdGEpPiBib2R5ewotICAgICAgW3RoaXNdKGxpc3RfdCogbGlzdCwgbGlzdF9ub2RlX3QqIHByZXZfbm9kZSwgdm9pZCogZGF0YSkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShsaXN0X3QqIGxpc3QsIGxpc3Rfbm9kZV90KiBwcmV2X25vZGUsIHZvaWQqIGRhdGEpIHsKLSAgICByZXR1cm4gYm9keShsaXN0LCBwcmV2X25vZGUsIGRhdGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9pbnNlcnRfYWZ0ZXIgbGlzdF9pbnNlcnRfYWZ0ZXI7Ci0KLS8vIE5hbWU6IGxpc3RfaXNfZW1wdHkKLS8vIFBhcmFtczogY29uc3QgbGlzdF90KiBsaXN0Ci0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBsaXN0X2lzX2VtcHR5IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgbGlzdF90KiBsaXN0KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIGJvZHkobGlzdCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2lzX2VtcHR5IGxpc3RfaXNfZW1wdHk7Ci0KLS8vIE5hbWU6IGxpc3RfbGVuZ3RoCi0vLyBQYXJhbXM6IGNvbnN0IGxpc3RfdCogbGlzdAotLy8gUmV0dXJuOiBzaXplX3QKLXN0cnVjdCBsaXN0X2xlbmd0aCB7Ci0gIHNpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNvbnN0IGxpc3RfdCogbGlzdCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgbGlzdF90KiBsaXN0KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBsaXN0X3QqIGxpc3QpIHsgcmV0dXJuIGJvZHkobGlzdCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X2xlbmd0aCBsaXN0X2xlbmd0aDsKLQotLy8gTmFtZTogbGlzdF9uZXcKLS8vIFBhcmFtczogbGlzdF9mcmVlX2NiIGNhbGxiYWNrCi0vLyBSZXR1cm46IGxpc3RfdCoKLXN0cnVjdCBsaXN0X25ldyB7Ci0gIGxpc3RfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPGxpc3RfdCoobGlzdF9mcmVlX2NiIGNhbGxiYWNrKT4gYm9keXsKLSAgICAgIFt0aGlzXShsaXN0X2ZyZWVfY2IgY2FsbGJhY2spIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGxpc3RfdCogb3BlcmF0b3IoKShsaXN0X2ZyZWVfY2IgY2FsbGJhY2spIHsgcmV0dXJuIGJvZHkoY2FsbGJhY2spOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9uZXcgbGlzdF9uZXc7Ci0KLS8vIE5hbWU6IGxpc3RfbmV3X2ludGVybmFsCi0vLyBQYXJhbXM6IGxpc3RfZnJlZV9jYiBjYWxsYmFjaywgY29uc3QgYWxsb2NhdG9yX3QqIHplcm9lZF9hbGxvY2F0b3IKLS8vIFJldHVybjogbGlzdF90Kgotc3RydWN0IGxpc3RfbmV3X2ludGVybmFsIHsKLSAgbGlzdF90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248bGlzdF90KihsaXN0X2ZyZWVfY2IgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdCogemVyb2VkX2FsbG9jYXRvcik+Ci0gICAgICBib2R5e1t0aGlzXShsaXN0X2ZyZWVfY2IgY2FsbGJhY2ssIGNvbnN0IGFsbG9jYXRvcl90KiB6ZXJvZWRfYWxsb2NhdG9yKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgICB9fTsKLSAgbGlzdF90KiBvcGVyYXRvcigpKGxpc3RfZnJlZV9jYiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90KiB6ZXJvZWRfYWxsb2NhdG9yKSB7Ci0gICAgcmV0dXJuIGJvZHkoY2FsbGJhY2ssIHplcm9lZF9hbGxvY2F0b3IpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9uZXdfaW50ZXJuYWwgbGlzdF9uZXdfaW50ZXJuYWw7Ci0KLS8vIE5hbWU6IGxpc3RfbmV4dAotLy8gUGFyYW1zOiBjb25zdCBsaXN0X25vZGVfdCogbm9kZQotLy8gUmV0dXJuOiBsaXN0X25vZGVfdCoKLXN0cnVjdCBsaXN0X25leHQgewotICBsaXN0X25vZGVfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPGxpc3Rfbm9kZV90Kihjb25zdCBsaXN0X25vZGVfdCogbm9kZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGxpc3Rfbm9kZV90KiBvcGVyYXRvcigpKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlKSB7IHJldHVybiBib2R5KG5vZGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9uZXh0IGxpc3RfbmV4dDsKLQotLy8gTmFtZTogbGlzdF9ub2RlCi0vLyBQYXJhbXM6IGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlCi0vLyBSZXR1cm46IHZvaWQqCi1zdHJ1Y3QgbGlzdF9ub2RlIHsKLSAgdm9pZCogcmV0dXJuX3ZhbHVle307Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCooY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICB2b2lkKiBvcGVyYXRvcigpKGNvbnN0IGxpc3Rfbm9kZV90KiBub2RlKSB7IHJldHVybiBib2R5KG5vZGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9ub2RlIGxpc3Rfbm9kZTsKLQotLy8gTmFtZTogbGlzdF9wcmVwZW5kCi0vLyBQYXJhbXM6IGxpc3RfdCogbGlzdCwgdm9pZCogZGF0YQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgbGlzdF9wcmVwZW5kIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKT4gYm9keXsKLSAgICAgIFt0aGlzXShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIGJvZHkobGlzdCwgZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X3ByZXBlbmQgbGlzdF9wcmVwZW5kOwotCi0vLyBOYW1lOiBsaXN0X3JlbW92ZQotLy8gUGFyYW1zOiBsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEKLS8vIFJldHVybjogYm9vbAotc3RydWN0IGxpc3RfcmVtb3ZlIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKT4gYm9keXsKLSAgICAgIFt0aGlzXShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShsaXN0X3QqIGxpc3QsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIGJvZHkobGlzdCwgZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsaXN0X3JlbW92ZSBsaXN0X3JlbW92ZTsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9saXN0Ci19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfcHJvcGVydGllcy5jYyBiL3Rlc3QvbW9jay9tb2NrX29zaV9wcm9wZXJ0aWVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNmNGI4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9wcm9wZXJ0aWVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX29zaV9wcm9wZXJ0aWVzLmgiCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV9wcm9wZXJ0aWVzIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3Qgb3NpX3Byb3BlcnR5X2dldCBvc2lfcHJvcGVydHlfZ2V0Owotc3RydWN0IG9zaV9wcm9wZXJ0eV9nZXRfYm9vbCBvc2lfcHJvcGVydHlfZ2V0X2Jvb2w7Ci1zdHJ1Y3Qgb3NpX3Byb3BlcnR5X2dldF9pbnQzMiBvc2lfcHJvcGVydHlfZ2V0X2ludDMyOwotc3RydWN0IG9zaV9wcm9wZXJ0eV9zZXQgb3NpX3Byb3BlcnR5X3NldDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9wcm9wZXJ0aWVzCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci1pbnQgb3NpX3Byb3BlcnR5X2dldChjb25zdCBjaGFyKiBrZXksIGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3Byb3BlcnRpZXM6Om9zaV9wcm9wZXJ0eV9nZXQoa2V5LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUpOwotfQotYm9vbCBvc2lfcHJvcGVydHlfZ2V0X2Jvb2woY29uc3QgY2hhcioga2V5LCBib29sIGRlZmF1bHRfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfcHJvcGVydGllczo6b3NpX3Byb3BlcnR5X2dldF9ib29sKGtleSwgZGVmYXVsdF92YWx1ZSk7Ci19Ci1pbnQzMl90IG9zaV9wcm9wZXJ0eV9nZXRfaW50MzIoY29uc3QgY2hhcioga2V5LCBpbnQzMl90IGRlZmF1bHRfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfcHJvcGVydGllczo6b3NpX3Byb3BlcnR5X2dldF9pbnQzMihrZXksIGRlZmF1bHRfdmFsdWUpOwotfQotaW50IG9zaV9wcm9wZXJ0eV9zZXQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9wcm9wZXJ0aWVzOjpvc2lfcHJvcGVydHlfc2V0KGtleSwgdmFsdWUpOwotfQotLy8gTW9ja2VkIGZ1bmN0aW9ucyBjb21wbGV0ZQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9wcm9wZXJ0aWVzLmggYi90ZXN0L21vY2svbW9ja19vc2lfcHJvcGVydGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2YwMWUxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9wcm9wZXJ0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfcHJvcGVydGllcyB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBvc2lfcHJvcGVydHlfZ2V0Ci0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIGtleSwgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUKLS8vIFJldHVybjogaW50Ci1zdHJ1Y3Qgb3NpX3Byb3BlcnR5X2dldCB7Ci0gIGludCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248aW50KGNvbnN0IGNoYXIqIGtleSwgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpPgotICAgICAgYm9keXtbdGhpc10oY29uc3QgY2hhcioga2V5LCBjaGFyKiB2YWx1ZSwgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIGludCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGtleSwgY2hhciogdmFsdWUsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIHsKLSAgICByZXR1cm4gYm9keShrZXksIHZhbHVlLCBkZWZhdWx0X3ZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IG9zaV9wcm9wZXJ0eV9nZXQgb3NpX3Byb3BlcnR5X2dldDsKLQotLy8gTmFtZTogb3NpX3Byb3BlcnR5X2dldF9ib29sCi0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIGtleSwgYm9vbCBkZWZhdWx0X3ZhbHVlCi0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBvc2lfcHJvcGVydHlfZ2V0X2Jvb2wgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBjaGFyKiBrZXksIGJvb2wgZGVmYXVsdF92YWx1ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhcioga2V5LCBib29sIGRlZmF1bHRfdmFsdWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBrZXksIGJvb2wgZGVmYXVsdF92YWx1ZSkgewotICAgIHJldHVybiBib2R5KGtleSwgZGVmYXVsdF92YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBvc2lfcHJvcGVydHlfZ2V0X2Jvb2wgb3NpX3Byb3BlcnR5X2dldF9ib29sOwotCi0vLyBOYW1lOiBvc2lfcHJvcGVydHlfZ2V0X2ludDMyCi0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCBkZWZhdWx0X3ZhbHVlCi0vLyBSZXR1cm46IGludDMyX3QKLXN0cnVjdCBvc2lfcHJvcGVydHlfZ2V0X2ludDMyIHsKLSAgaW50MzJfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248aW50MzJfdChjb25zdCBjaGFyKiBrZXksIGludDMyX3QgZGVmYXVsdF92YWx1ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhcioga2V5LCBpbnQzMl90IGRlZmF1bHRfdmFsdWUpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGludDMyX3Qgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBrZXksIGludDMyX3QgZGVmYXVsdF92YWx1ZSkgewotICAgIHJldHVybiBib2R5KGtleSwgZGVmYXVsdF92YWx1ZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBvc2lfcHJvcGVydHlfZ2V0X2ludDMyIG9zaV9wcm9wZXJ0eV9nZXRfaW50MzI7Ci0KLS8vIE5hbWU6IG9zaV9wcm9wZXJ0eV9zZXQKLS8vIFBhcmFtczogY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZQotLy8gUmV0dXJuOiBpbnQKLXN0cnVjdCBvc2lfcHJvcGVydHlfc2V0IHsKLSAgaW50IHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxpbnQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgaW50IG9wZXJhdG9yKCkoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotICAgIHJldHVybiBib2R5KGtleSwgdmFsdWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgb3NpX3Byb3BlcnR5X3NldCBvc2lfcHJvcGVydHlfc2V0OwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3Byb3BlcnRpZXMKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9yaW5nYnVmZmVyLmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX3JpbmdidWZmZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTQ5N2MuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX3JpbmdidWZmZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfb3NpX3JpbmdidWZmZXIuaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX3JpbmdidWZmZXIgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCByaW5nYnVmZmVyX2F2YWlsYWJsZSByaW5nYnVmZmVyX2F2YWlsYWJsZTsKLXN0cnVjdCByaW5nYnVmZmVyX2RlbGV0ZSByaW5nYnVmZmVyX2RlbGV0ZTsKLXN0cnVjdCByaW5nYnVmZmVyX2ZyZWUgcmluZ2J1ZmZlcl9mcmVlOwotc3RydWN0IHJpbmdidWZmZXJfaW5pdCByaW5nYnVmZmVyX2luaXQ7Ci1zdHJ1Y3QgcmluZ2J1ZmZlcl9pbnNlcnQgcmluZ2J1ZmZlcl9pbnNlcnQ7Ci1zdHJ1Y3QgcmluZ2J1ZmZlcl9wZWVrIHJpbmdidWZmZXJfcGVlazsKLXN0cnVjdCByaW5nYnVmZmVyX3BvcCByaW5nYnVmZmVyX3BvcDsKLXN0cnVjdCByaW5nYnVmZmVyX3NpemUgcmluZ2J1ZmZlcl9zaXplOwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3JpbmdidWZmZXIKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXNpemVfdCByaW5nYnVmZmVyX2F2YWlsYWJsZShjb25zdCByaW5nYnVmZmVyX3QqIHJiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3JpbmdidWZmZXI6OnJpbmdidWZmZXJfYXZhaWxhYmxlKHJiKTsKLX0KLXNpemVfdCByaW5nYnVmZmVyX2RlbGV0ZShyaW5nYnVmZmVyX3QqIHJiLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3JpbmdidWZmZXI6OnJpbmdidWZmZXJfZGVsZXRlKHJiLCBsZW5ndGgpOwotfQotdm9pZCByaW5nYnVmZmVyX2ZyZWUocmluZ2J1ZmZlcl90KiByYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3JpbmdidWZmZXI6OnJpbmdidWZmZXJfZnJlZShyYik7Ci19Ci1yaW5nYnVmZmVyX3QqIHJpbmdidWZmZXJfaW5pdChjb25zdCBzaXplX3Qgc2l6ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9yaW5nYnVmZmVyOjpyaW5nYnVmZmVyX2luaXQoc2l6ZSk7Ci19Ci1zaXplX3QgcmluZ2J1ZmZlcl9pbnNlcnQocmluZ2J1ZmZlcl90KiByYiwgY29uc3QgdWludDhfdCogcCwgc2l6ZV90IGxlbmd0aCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9yaW5nYnVmZmVyOjpyaW5nYnVmZmVyX2luc2VydChyYiwgcCwgbGVuZ3RoKTsKLX0KLXNpemVfdCByaW5nYnVmZmVyX3BlZWsoY29uc3QgcmluZ2J1ZmZlcl90KiByYiwgb2ZmX3Qgb2Zmc2V0LCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3JpbmdidWZmZXI6OnJpbmdidWZmZXJfcGVlayhyYiwgb2Zmc2V0LCBwLCBsZW5ndGgpOwotfQotc2l6ZV90IHJpbmdidWZmZXJfcG9wKHJpbmdidWZmZXJfdCogcmIsIHVpbnQ4X3QqIHAsIHNpemVfdCBsZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfcmluZ2J1ZmZlcjo6cmluZ2J1ZmZlcl9wb3AocmIsIHAsIGxlbmd0aCk7Ci19Ci1zaXplX3QgcmluZ2J1ZmZlcl9zaXplKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfcmluZ2J1ZmZlcjo6cmluZ2J1ZmZlcl9zaXplKHJiKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfcmluZ2J1ZmZlci5oIGIvdGVzdC9tb2NrL21vY2tfb3NpX3JpbmdidWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwYTUzOC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfcmluZ2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo4Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcmluZ2J1ZmZlci5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX3JpbmdidWZmZXIgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogcmluZ2J1ZmZlcl9hdmFpbGFibGUKLS8vIFBhcmFtczogY29uc3QgcmluZ2J1ZmZlcl90KiByYgotLy8gUmV0dXJuOiBzaXplX3QKLXN0cnVjdCByaW5nYnVmZmVyX2F2YWlsYWJsZSB7Ci0gIHNpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNvbnN0IHJpbmdidWZmZXJfdCogcmIpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpIHsgcmV0dXJuIGJvZHkocmIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgcmluZ2J1ZmZlcl9hdmFpbGFibGUgcmluZ2J1ZmZlcl9hdmFpbGFibGU7Ci0KLS8vIE5hbWU6IHJpbmdidWZmZXJfZGVsZXRlCi0vLyBQYXJhbXM6IHJpbmdidWZmZXJfdCogcmIsIHNpemVfdCBsZW5ndGgKLS8vIFJldHVybjogc2l6ZV90Ci1zdHJ1Y3QgcmluZ2J1ZmZlcl9kZWxldGUgewotICBzaXplX3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNpemVfdChyaW5nYnVmZmVyX3QqIHJiLCBzaXplX3QgbGVuZ3RoKT4gYm9keXsKLSAgICAgIFt0aGlzXShyaW5nYnVmZmVyX3QqIHJiLCBzaXplX3QgbGVuZ3RoKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBzaXplX3Qgb3BlcmF0b3IoKShyaW5nYnVmZmVyX3QqIHJiLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGJvZHkocmIsIGxlbmd0aCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCByaW5nYnVmZmVyX2RlbGV0ZSByaW5nYnVmZmVyX2RlbGV0ZTsKLQotLy8gTmFtZTogcmluZ2J1ZmZlcl9mcmVlCi0vLyBQYXJhbXM6IHJpbmdidWZmZXJfdCogcmIKLS8vIFJldHVybjogdm9pZAotc3RydWN0IHJpbmdidWZmZXJfZnJlZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChyaW5nYnVmZmVyX3QqIHJiKT4gYm9keXtbXShyaW5nYnVmZmVyX3QqIHJiKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShyaW5nYnVmZmVyX3QqIHJiKSB7IGJvZHkocmIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgcmluZ2J1ZmZlcl9mcmVlIHJpbmdidWZmZXJfZnJlZTsKLQotLy8gTmFtZTogcmluZ2J1ZmZlcl9pbml0Ci0vLyBQYXJhbXM6IGNvbnN0IHNpemVfdCBzaXplCi0vLyBSZXR1cm46IHJpbmdidWZmZXJfdCoKLXN0cnVjdCByaW5nYnVmZmVyX2luaXQgewotICByaW5nYnVmZmVyX3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxyaW5nYnVmZmVyX3QqKGNvbnN0IHNpemVfdCBzaXplKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgcmluZ2J1ZmZlcl90KiBvcGVyYXRvcigpKGNvbnN0IHNpemVfdCBzaXplKSB7IHJldHVybiBib2R5KHNpemUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgcmluZ2J1ZmZlcl9pbml0IHJpbmdidWZmZXJfaW5pdDsKLQotLy8gTmFtZTogcmluZ2J1ZmZlcl9pbnNlcnQKLS8vIFBhcmFtczogcmluZ2J1ZmZlcl90KiByYiwgY29uc3QgdWludDhfdCogcCwgc2l6ZV90IGxlbmd0aAotLy8gUmV0dXJuOiBzaXplX3QKLXN0cnVjdCByaW5nYnVmZmVyX2luc2VydCB7Ci0gIHNpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c2l6ZV90KHJpbmdidWZmZXJfdCogcmIsIGNvbnN0IHVpbnQ4X3QqIHAsIHNpemVfdCBsZW5ndGgpPiBib2R5ewotICAgICAgW3RoaXNdKHJpbmdidWZmZXJfdCogcmIsIGNvbnN0IHVpbnQ4X3QqIHAsIHNpemVfdCBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICAgIH19OwotICBzaXplX3Qgb3BlcmF0b3IoKShyaW5nYnVmZmVyX3QqIHJiLCBjb25zdCB1aW50OF90KiBwLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGJvZHkocmIsIHAsIGxlbmd0aCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCByaW5nYnVmZmVyX2luc2VydCByaW5nYnVmZmVyX2luc2VydDsKLQotLy8gTmFtZTogcmluZ2J1ZmZlcl9wZWVrCi0vLyBQYXJhbXM6IGNvbnN0IHJpbmdidWZmZXJfdCogcmIsIG9mZl90IG9mZnNldCwgdWludDhfdCogcCwgc2l6ZV90IGxlbmd0aAotLy8gUmV0dXJuOiBzaXplX3QKLXN0cnVjdCByaW5nYnVmZmVyX3BlZWsgewotICBzaXplX3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNpemVfdChjb25zdCByaW5nYnVmZmVyX3QqIHJiLCBvZmZfdCBvZmZzZXQsIHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpPgotICAgICAgYm9keXtbdGhpc10oY29uc3QgcmluZ2J1ZmZlcl90KiByYiwgb2ZmX3Qgb2Zmc2V0LCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgcmluZ2J1ZmZlcl90KiByYiwgb2ZmX3Qgb2Zmc2V0LCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGJvZHkocmIsIG9mZnNldCwgcCwgbGVuZ3RoKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IHJpbmdidWZmZXJfcGVlayByaW5nYnVmZmVyX3BlZWs7Ci0KLS8vIE5hbWU6IHJpbmdidWZmZXJfcG9wCi0vLyBQYXJhbXM6IHJpbmdidWZmZXJfdCogcmIsIHVpbnQ4X3QqIHAsIHNpemVfdCBsZW5ndGgKLS8vIFJldHVybjogc2l6ZV90Ci1zdHJ1Y3QgcmluZ2J1ZmZlcl9wb3AgewotICBzaXplX3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNpemVfdChyaW5nYnVmZmVyX3QqIHJiLCB1aW50OF90KiBwLCBzaXplX3QgbGVuZ3RoKT4gYm9keXsKLSAgICAgIFt0aGlzXShyaW5nYnVmZmVyX3QqIHJiLCB1aW50OF90KiBwLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgICB9fTsKLSAgc2l6ZV90IG9wZXJhdG9yKCkocmluZ2J1ZmZlcl90KiByYiwgdWludDhfdCogcCwgc2l6ZV90IGxlbmd0aCkgewotICAgIHJldHVybiBib2R5KHJiLCBwLCBsZW5ndGgpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgcmluZ2J1ZmZlcl9wb3AgcmluZ2J1ZmZlcl9wb3A7Ci0KLS8vIE5hbWU6IHJpbmdidWZmZXJfc2l6ZQotLy8gUGFyYW1zOiBjb25zdCByaW5nYnVmZmVyX3QqIHJiCi0vLyBSZXR1cm46IHNpemVfdAotc3RydWN0IHJpbmdidWZmZXJfc2l6ZSB7Ci0gIHNpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c2l6ZV90KGNvbnN0IHJpbmdidWZmZXJfdCogcmIpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHJpbmdidWZmZXJfdCogcmIpIHsgcmV0dXJuIGJvZHkocmIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgcmluZ2J1ZmZlcl9zaXplIHJpbmdidWZmZXJfc2l6ZTsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9yaW5nYnVmZmVyCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfc2VtYXBob3JlLmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX3NlbWFwaG9yZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2OWMwZS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfc2VtYXBob3JlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX29zaV9zZW1hcGhvcmUuaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX3NlbWFwaG9yZSB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IHNlbWFwaG9yZV9mcmVlIHNlbWFwaG9yZV9mcmVlOwotc3RydWN0IHNlbWFwaG9yZV9nZXRfZmQgc2VtYXBob3JlX2dldF9mZDsKLXN0cnVjdCBzZW1hcGhvcmVfbmV3IHNlbWFwaG9yZV9uZXc7Ci1zdHJ1Y3Qgc2VtYXBob3JlX3Bvc3Qgc2VtYXBob3JlX3Bvc3Q7Ci1zdHJ1Y3Qgc2VtYXBob3JlX3RyeV93YWl0IHNlbWFwaG9yZV90cnlfd2FpdDsKLXN0cnVjdCBzZW1hcGhvcmVfd2FpdCBzZW1hcGhvcmVfd2FpdDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9zZW1hcGhvcmUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXZvaWQgc2VtYXBob3JlX2ZyZWUoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3NlbWFwaG9yZTo6c2VtYXBob3JlX2ZyZWUoc2VtYXBob3JlKTsKLX0KLWludCBzZW1hcGhvcmVfZ2V0X2ZkKGNvbnN0IHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfc2VtYXBob3JlOjpzZW1hcGhvcmVfZ2V0X2ZkKHNlbWFwaG9yZSk7Ci19Ci1zZW1hcGhvcmVfdCogc2VtYXBob3JlX25ldyh1bnNpZ25lZCBpbnQgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfc2VtYXBob3JlOjpzZW1hcGhvcmVfbmV3KHZhbHVlKTsKLX0KLXZvaWQgc2VtYXBob3JlX3Bvc3Qoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3NlbWFwaG9yZTo6c2VtYXBob3JlX3Bvc3Qoc2VtYXBob3JlKTsKLX0KLWJvb2wgc2VtYXBob3JlX3RyeV93YWl0KHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfc2VtYXBob3JlOjpzZW1hcGhvcmVfdHJ5X3dhaXQoc2VtYXBob3JlKTsKLX0KLXZvaWQgc2VtYXBob3JlX3dhaXQoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3NlbWFwaG9yZTo6c2VtYXBob3JlX3dhaXQoc2VtYXBob3JlKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfc2VtYXBob3JlLmggYi90ZXN0L21vY2svbW9ja19vc2lfc2VtYXBob3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhODYyZWEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX3NlbWFwaG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo2Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSBmcm9tIChvciBhZGQgdG8gKSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc2VtYXBob3JlLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfc2VtYXBob3JlIHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IHNlbWFwaG9yZV9mcmVlCi0vLyBQYXJhbXM6IHNlbWFwaG9yZV90KiBzZW1hcGhvcmUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IHNlbWFwaG9yZV9mcmVlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpPiBib2R5ewotICAgICAgW10oc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgeyBib2R5KHNlbWFwaG9yZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmVfZnJlZSBzZW1hcGhvcmVfZnJlZTsKLQotLy8gTmFtZTogc2VtYXBob3JlX2dldF9mZAotLy8gUGFyYW1zOiBjb25zdCBzZW1hcGhvcmVfdCogc2VtYXBob3JlCi0vLyBSZXR1cm46IGludAotc3RydWN0IHNlbWFwaG9yZV9nZXRfZmQgewotICBpbnQgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPGludChjb25zdCBzZW1hcGhvcmVfdCogc2VtYXBob3JlKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBpbnQgb3BlcmF0b3IoKShjb25zdCBzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7IHJldHVybiBib2R5KHNlbWFwaG9yZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmVfZ2V0X2ZkIHNlbWFwaG9yZV9nZXRfZmQ7Ci0KLS8vIE5hbWU6IHNlbWFwaG9yZV9uZXcKLS8vIFBhcmFtczogdW5zaWduZWQgaW50IHZhbHVlCi0vLyBSZXR1cm46IHNlbWFwaG9yZV90Kgotc3RydWN0IHNlbWFwaG9yZV9uZXcgewotICBzZW1hcGhvcmVfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNlbWFwaG9yZV90Kih1bnNpZ25lZCBpbnQgdmFsdWUpPiBib2R5ewotICAgICAgW3RoaXNdKHVuc2lnbmVkIGludCB2YWx1ZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgc2VtYXBob3JlX3QqIG9wZXJhdG9yKCkodW5zaWduZWQgaW50IHZhbHVlKSB7IHJldHVybiBib2R5KHZhbHVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNlbWFwaG9yZV9uZXcgc2VtYXBob3JlX25ldzsKLQotLy8gTmFtZTogc2VtYXBob3JlX3Bvc3QKLS8vIFBhcmFtczogc2VtYXBob3JlX3QqIHNlbWFwaG9yZQotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgc2VtYXBob3JlX3Bvc3QgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSk+IGJvZHl7Ci0gICAgICBbXShzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7IGJvZHkoc2VtYXBob3JlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNlbWFwaG9yZV9wb3N0IHNlbWFwaG9yZV9wb3N0OwotCi0vLyBOYW1lOiBzZW1hcGhvcmVfdHJ5X3dhaXQKLS8vIFBhcmFtczogc2VtYXBob3JlX3QqIHNlbWFwaG9yZQotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3Qgc2VtYXBob3JlX3RyeV93YWl0IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woc2VtYXBob3JlX3QqIHNlbWFwaG9yZSk+IGJvZHl7Ci0gICAgICBbdGhpc10oc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpIHsgcmV0dXJuIGJvZHkoc2VtYXBob3JlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNlbWFwaG9yZV90cnlfd2FpdCBzZW1hcGhvcmVfdHJ5X3dhaXQ7Ci0KLS8vIE5hbWU6IHNlbWFwaG9yZV93YWl0Ci0vLyBQYXJhbXM6IHNlbWFwaG9yZV90KiBzZW1hcGhvcmUKLS8vIFJldHVybjogdm9pZAotc3RydWN0IHNlbWFwaG9yZV93YWl0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHNlbWFwaG9yZV90KiBzZW1hcGhvcmUpPiBib2R5ewotICAgICAgW10oc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgeyBib2R5KHNlbWFwaG9yZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmVfd2FpdCBzZW1hcGhvcmVfd2FpdDsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV9zZW1hcGhvcmUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV9zb2NrZXQuY2MgYi90ZXN0L21vY2svbW9ja19vc2lfc29ja2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFhM2EzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV9zb2NrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjExCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19vc2lfc29ja2V0LmgiCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV9zb2NrZXQgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBzb2NrZXRfYWNjZXB0IHNvY2tldF9hY2NlcHQ7Ci1zdHJ1Y3Qgc29ja2V0X2J5dGVzX2F2YWlsYWJsZSBzb2NrZXRfYnl0ZXNfYXZhaWxhYmxlOwotc3RydWN0IHNvY2tldF9mcmVlIHNvY2tldF9mcmVlOwotc3RydWN0IHNvY2tldF9saXN0ZW4gc29ja2V0X2xpc3RlbjsKLXN0cnVjdCBzb2NrZXRfbmV3IHNvY2tldF9uZXc7Ci1zdHJ1Y3Qgc29ja2V0X25ld19mcm9tX2ZkIHNvY2tldF9uZXdfZnJvbV9mZDsKLXN0cnVjdCBzb2NrZXRfcmVhZCBzb2NrZXRfcmVhZDsKLXN0cnVjdCBzb2NrZXRfcmVnaXN0ZXIgc29ja2V0X3JlZ2lzdGVyOwotc3RydWN0IHNvY2tldF91bnJlZ2lzdGVyIHNvY2tldF91bnJlZ2lzdGVyOwotc3RydWN0IHNvY2tldF93cml0ZSBzb2NrZXRfd3JpdGU7Ci1zdHJ1Y3Qgc29ja2V0X3dyaXRlX2FuZF90cmFuc2Zlcl9mZCBzb2NrZXRfd3JpdGVfYW5kX3RyYW5zZmVyX2ZkOwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3NvY2tldAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotc29ja2V0X3QqIHNvY2tldF9hY2NlcHQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9zb2NrZXQ6OnNvY2tldF9hY2NlcHQoc29ja2V0KTsKLX0KLXNzaXplX3Qgc29ja2V0X2J5dGVzX2F2YWlsYWJsZShjb25zdCBzb2NrZXRfdCogc29ja2V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X2J5dGVzX2F2YWlsYWJsZShzb2NrZXQpOwotfQotdm9pZCBzb2NrZXRfZnJlZShzb2NrZXRfdCogc29ja2V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfc29ja2V0Ojpzb2NrZXRfZnJlZShzb2NrZXQpOwotfQotYm9vbCBzb2NrZXRfbGlzdGVuKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIHBvcnRfdCBwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X2xpc3Rlbihzb2NrZXQsIHBvcnQpOwotfQotc29ja2V0X3QqIHNvY2tldF9uZXcodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV9zb2NrZXQ6OnNvY2tldF9uZXcoKTsKLX0KLXNvY2tldF90KiBzb2NrZXRfbmV3X2Zyb21fZmQoaW50IGZkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X25ld19mcm9tX2ZkKGZkKTsKLX0KLXNzaXplX3Qgc29ja2V0X3JlYWQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgdm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfc29ja2V0Ojpzb2NrZXRfcmVhZChzb2NrZXQsIGJ1ZiwgY291bnQpOwotfQotdm9pZCBzb2NrZXRfcmVnaXN0ZXIoc29ja2V0X3QqIHNvY2tldCwgcmVhY3Rvcl90KiByZWFjdG9yLCB2b2lkKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2NiIHJlYWRfY2IsIHNvY2tldF9jYiB3cml0ZV9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X3JlZ2lzdGVyKHNvY2tldCwgcmVhY3RvciwgY29udGV4dCwgcmVhZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2NiKTsKLX0KLXZvaWQgc29ja2V0X3VucmVnaXN0ZXIoc29ja2V0X3QqIHNvY2tldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X3VucmVnaXN0ZXIoc29ja2V0KTsKLX0KLXNzaXplX3Qgc29ja2V0X3dyaXRlKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X3dyaXRlKHNvY2tldCwgYnVmLCBjb3VudCk7Ci19Ci1zc2l6ZV90IHNvY2tldF93cml0ZV9hbmRfdHJhbnNmZXJfZmQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgaW50IGZkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3NvY2tldDo6c29ja2V0X3dyaXRlX2FuZF90cmFuc2Zlcl9mZChzb2NrZXQsIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGZkKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfc29ja2V0LmggYi90ZXN0L21vY2svbW9ja19vc2lfc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTZiMDMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX3NvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMQotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4zLjAKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgZnJvbSAob3IgYWRkIHRvICkgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcmVhY3Rvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NvY2tldC5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX3NvY2tldCB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBzb2NrZXRfYWNjZXB0Ci0vLyBQYXJhbXM6IGNvbnN0IHNvY2tldF90KiBzb2NrZXQKLS8vIFJldHVybjogc29ja2V0X3QqCi1zdHJ1Y3Qgc29ja2V0X2FjY2VwdCB7Ci0gIHNvY2tldF90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c29ja2V0X3QqKGNvbnN0IHNvY2tldF90KiBzb2NrZXQpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IHNvY2tldF90KiBzb2NrZXQpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNvY2tldF90KiBvcGVyYXRvcigpKGNvbnN0IHNvY2tldF90KiBzb2NrZXQpIHsgcmV0dXJuIGJvZHkoc29ja2V0KTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNvY2tldF9hY2NlcHQgc29ja2V0X2FjY2VwdDsKLQotLy8gTmFtZTogc29ja2V0X2J5dGVzX2F2YWlsYWJsZQotLy8gUGFyYW1zOiBjb25zdCBzb2NrZXRfdCogc29ja2V0Ci0vLyBSZXR1cm46IHNzaXplX3QKLXN0cnVjdCBzb2NrZXRfYnl0ZXNfYXZhaWxhYmxlIHsKLSAgc3NpemVfdCByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c3NpemVfdChjb25zdCBzb2NrZXRfdCogc29ja2V0KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBzb2NrZXRfdCogc29ja2V0KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBzc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc29ja2V0X3QqIHNvY2tldCkgeyByZXR1cm4gYm9keShzb2NrZXQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc29ja2V0X2J5dGVzX2F2YWlsYWJsZSBzb2NrZXRfYnl0ZXNfYXZhaWxhYmxlOwotCi0vLyBOYW1lOiBzb2NrZXRfZnJlZQotLy8gUGFyYW1zOiBzb2NrZXRfdCogc29ja2V0Ci0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCBzb2NrZXRfZnJlZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzb2NrZXRfdCogc29ja2V0KT4gYm9keXtbXShzb2NrZXRfdCogc29ja2V0KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShzb2NrZXRfdCogc29ja2V0KSB7IGJvZHkoc29ja2V0KTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNvY2tldF9mcmVlIHNvY2tldF9mcmVlOwotCi0vLyBOYW1lOiBzb2NrZXRfbGlzdGVuCi0vLyBQYXJhbXM6IGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIHBvcnRfdCBwb3J0Ci0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCBzb2NrZXRfbGlzdGVuIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgcG9ydF90IHBvcnQpPiBib2R5ewotICAgICAgW3RoaXNdKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIHBvcnRfdCBwb3J0KSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgcG9ydF90IHBvcnQpIHsKLSAgICByZXR1cm4gYm9keShzb2NrZXQsIHBvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc29ja2V0X2xpc3RlbiBzb2NrZXRfbGlzdGVuOwotCi0vLyBOYW1lOiBzb2NrZXRfbmV3Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybjogc29ja2V0X3QqCi1zdHJ1Y3Qgc29ja2V0X25ldyB7Ci0gIHNvY2tldF90KiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248c29ja2V0X3QqKHZvaWQpPiBib2R5e1t0aGlzXSh2b2lkKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICBzb2NrZXRfdCogb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzb2NrZXRfbmV3IHNvY2tldF9uZXc7Ci0KLS8vIE5hbWU6IHNvY2tldF9uZXdfZnJvbV9mZAotLy8gUGFyYW1zOiBpbnQgZmQKLS8vIFJldHVybjogc29ja2V0X3QqCi1zdHJ1Y3Qgc29ja2V0X25ld19mcm9tX2ZkIHsKLSAgc29ja2V0X3QqIHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxzb2NrZXRfdCooaW50IGZkKT4gYm9keXsKLSAgICAgIFt0aGlzXShpbnQgZmQpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNvY2tldF90KiBvcGVyYXRvcigpKGludCBmZCkgeyByZXR1cm4gYm9keShmZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzb2NrZXRfbmV3X2Zyb21fZmQgc29ja2V0X25ld19mcm9tX2ZkOwotCi0vLyBOYW1lOiBzb2NrZXRfcmVhZAotLy8gUGFyYW1zOiBjb25zdCBzb2NrZXRfdCogc29ja2V0LCB2b2lkKiBidWYsIHNpemVfdCBjb3VudAotLy8gUmV0dXJuOiBzc2l6ZV90Ci1zdHJ1Y3Qgc29ja2V0X3JlYWQgewotICBzc2l6ZV90IHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90KGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBzb2NrZXRfdCogc29ja2V0LCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgICAgfX07Ci0gIHNzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzb2NrZXRfdCogc29ja2V0LCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgewotICAgIHJldHVybiBib2R5KHNvY2tldCwgYnVmLCBjb3VudCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzb2NrZXRfcmVhZCBzb2NrZXRfcmVhZDsKLQotLy8gTmFtZTogc29ja2V0X3JlZ2lzdGVyCi0vLyBQYXJhbXM6IHNvY2tldF90KiBzb2NrZXQsIHJlYWN0b3JfdCogcmVhY3Rvciwgdm9pZCogY29udGV4dCwgc29ja2V0X2NiCi0vLyByZWFkX2NiLCBzb2NrZXRfY2Igd3JpdGVfY2IgUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgc29ja2V0X3JlZ2lzdGVyIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHNvY2tldF90KiBzb2NrZXQsIHJlYWN0b3JfdCogcmVhY3Rvciwgdm9pZCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9jYiByZWFkX2NiLCBzb2NrZXRfY2Igd3JpdGVfY2IpPgotICAgICAgYm9keXtbXShzb2NrZXRfdCogc29ja2V0LCByZWFjdG9yX3QqIHJlYWN0b3IsIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgIHNvY2tldF9jYiByZWFkX2NiLCBzb2NrZXRfY2Igd3JpdGVfY2IpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHNvY2tldF90KiBzb2NrZXQsIHJlYWN0b3JfdCogcmVhY3Rvciwgdm9pZCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgIHNvY2tldF9jYiByZWFkX2NiLCBzb2NrZXRfY2Igd3JpdGVfY2IpIHsKLSAgICBib2R5KHNvY2tldCwgcmVhY3RvciwgY29udGV4dCwgcmVhZF9jYiwgd3JpdGVfY2IpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc29ja2V0X3JlZ2lzdGVyIHNvY2tldF9yZWdpc3RlcjsKLQotLy8gTmFtZTogc29ja2V0X3VucmVnaXN0ZXIKLS8vIFBhcmFtczogc29ja2V0X3QqIHNvY2tldAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgc29ja2V0X3VucmVnaXN0ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc29ja2V0X3QqIHNvY2tldCk+IGJvZHl7W10oc29ja2V0X3QqIHNvY2tldCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoc29ja2V0X3QqIHNvY2tldCkgeyBib2R5KHNvY2tldCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzb2NrZXRfdW5yZWdpc3RlciBzb2NrZXRfdW5yZWdpc3RlcjsKLQotLy8gTmFtZTogc29ja2V0X3dyaXRlCi0vLyBQYXJhbXM6IGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50Ci0vLyBSZXR1cm46IHNzaXplX3QKLXN0cnVjdCBzb2NrZXRfd3JpdGUgewotICBzc2l6ZV90IHJldHVybl92YWx1ZXswfTsKLSAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90KGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KT4KLSAgICAgIGJvZHl7W3RoaXNdKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgICB9fTsKLSAgc3NpemVfdCBvcGVyYXRvcigpKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KSB7Ci0gICAgcmV0dXJuIGJvZHkoc29ja2V0LCBidWYsIGNvdW50KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNvY2tldF93cml0ZSBzb2NrZXRfd3JpdGU7Ci0KLS8vIE5hbWU6IHNvY2tldF93cml0ZV9hbmRfdHJhbnNmZXJfZmQKLS8vIFBhcmFtczogY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQsIGludCBmZAotLy8gUmV0dXJuOiBzc2l6ZV90Ci1zdHJ1Y3Qgc29ja2V0X3dyaXRlX2FuZF90cmFuc2Zlcl9mZCB7Ci0gIHNzaXplX3QgcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQpPgotICAgICAgYm9keXtbdGhpc10oY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICBpbnQgZmQpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIHNzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzb2NrZXRfdCogc29ja2V0LCBjb25zdCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBmZCkgewotICAgIHJldHVybiBib2R5KHNvY2tldCwgYnVmLCBjb3VudCwgZmQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc29ja2V0X3dyaXRlX2FuZF90cmFuc2Zlcl9mZCBzb2NrZXRfd3JpdGVfYW5kX3RyYW5zZmVyX2ZkOwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3NvY2tldAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX3RocmVhZC5jYyBiL3Rlc3QvbW9jay9tb2NrX29zaV90aHJlYWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGFkZTEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX3RocmVhZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX29zaV90aHJlYWQuaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX3RocmVhZCB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IHRocmVhZF9mcmVlIHRocmVhZF9mcmVlOwotc3RydWN0IHRocmVhZF9nZXRfcmVhY3RvciB0aHJlYWRfZ2V0X3JlYWN0b3I7Ci1zdHJ1Y3QgdGhyZWFkX2lzX3NlbGYgdGhyZWFkX2lzX3NlbGY7Ci1zdHJ1Y3QgdGhyZWFkX2pvaW4gdGhyZWFkX2pvaW47Ci1zdHJ1Y3QgdGhyZWFkX25hbWUgdGhyZWFkX25hbWU7Ci1zdHJ1Y3QgdGhyZWFkX25ldyB0aHJlYWRfbmV3Owotc3RydWN0IHRocmVhZF9uZXdfc2l6ZWQgdGhyZWFkX25ld19zaXplZDsKLXN0cnVjdCB0aHJlYWRfcG9zdCB0aHJlYWRfcG9zdDsKLXN0cnVjdCB0aHJlYWRfc2V0X3ByaW9yaXR5IHRocmVhZF9zZXRfcHJpb3JpdHk7Ci1zdHJ1Y3QgdGhyZWFkX3NldF9ydF9wcmlvcml0eSB0aHJlYWRfc2V0X3J0X3ByaW9yaXR5Owotc3RydWN0IHRocmVhZF9zdG9wIHRocmVhZF9zdG9wOwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3RocmVhZAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdm9pZCB0aHJlYWRfZnJlZSh0aHJlYWRfdCogdGhyZWFkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfdGhyZWFkOjp0aHJlYWRfZnJlZSh0aHJlYWQpOwotfQotcmVhY3Rvcl90KiB0aHJlYWRfZ2V0X3JlYWN0b3IoY29uc3QgdGhyZWFkX3QqIHRocmVhZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV90aHJlYWQ6OnRocmVhZF9nZXRfcmVhY3Rvcih0aHJlYWQpOwotfQotYm9vbCB0aHJlYWRfaXNfc2VsZihjb25zdCB0aHJlYWRfdCogdGhyZWFkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3RocmVhZDo6dGhyZWFkX2lzX3NlbGYodGhyZWFkKTsKLX0KLXZvaWQgdGhyZWFkX2pvaW4odGhyZWFkX3QqIHRocmVhZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6b3NpX3RocmVhZDo6dGhyZWFkX2pvaW4odGhyZWFkKTsKLX0KLWNvbnN0IGNoYXIqIHRocmVhZF9uYW1lKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfdGhyZWFkOjp0aHJlYWRfbmFtZSh0aHJlYWQpOwotfQotdGhyZWFkX3QqIHRocmVhZF9uZXcoY29uc3QgY2hhciogbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV90aHJlYWQ6OnRocmVhZF9uZXcobmFtZSk7Ci19Ci10aHJlYWRfdCogdGhyZWFkX25ld19zaXplZChjb25zdCBjaGFyKiBuYW1lLCBzaXplX3Qgd29ya19xdWV1ZV9jYXBhY2l0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV90aHJlYWQ6OnRocmVhZF9uZXdfc2l6ZWQobmFtZSwgd29ya19xdWV1ZV9jYXBhY2l0eSk7Ci19Ci1ib29sIHRocmVhZF9wb3N0KHRocmVhZF90KiB0aHJlYWQsIHRocmVhZF9mbiBmdW5jLCB2b2lkKiBjb250ZXh0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3RocmVhZDo6dGhyZWFkX3Bvc3QodGhyZWFkLCBmdW5jLCBjb250ZXh0KTsKLX0KLWJvb2wgdGhyZWFkX3NldF9wcmlvcml0eSh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfdGhyZWFkOjp0aHJlYWRfc2V0X3ByaW9yaXR5KHRocmVhZCwgcHJpb3JpdHkpOwotfQotYm9vbCB0aHJlYWRfc2V0X3J0X3ByaW9yaXR5KHRocmVhZF90KiB0aHJlYWQsIGludCBwcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV90aHJlYWQ6OnRocmVhZF9zZXRfcnRfcHJpb3JpdHkodGhyZWFkLCBwcmlvcml0eSk7Ci19Ci12b2lkIHRocmVhZF9zdG9wKHRocmVhZF90KiB0aHJlYWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV90aHJlYWQ6OnRocmVhZF9zdG9wKHRocmVhZCk7Ci19Ci0vLyBNb2NrZWQgZnVuY3Rpb25zIGNvbXBsZXRlCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX3RocmVhZC5oIGIvdGVzdC9tb2NrL21vY2tfb3NpX3RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNhYjA4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSAiY2hlY2suaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3JlYWN0b3IuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9zZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS90aHJlYWQuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIG9zaV90aHJlYWQgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogdGhyZWFkX2ZyZWUKLS8vIFBhcmFtczogdGhyZWFkX3QqIHRocmVhZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgdGhyZWFkX2ZyZWUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodGhyZWFkX3QqIHRocmVhZCk+IGJvZHl7W10odGhyZWFkX3QqIHRocmVhZCkge319OwotICB2b2lkIG9wZXJhdG9yKCkodGhyZWFkX3QqIHRocmVhZCkgeyBib2R5KHRocmVhZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCB0aHJlYWRfZnJlZSB0aHJlYWRfZnJlZTsKLQotLy8gTmFtZTogdGhyZWFkX2dldF9yZWFjdG9yCi0vLyBQYXJhbXM6IGNvbnN0IHRocmVhZF90KiB0aHJlYWQKLS8vIFJldHVybjogcmVhY3Rvcl90Kgotc3RydWN0IHRocmVhZF9nZXRfcmVhY3RvciB7Ci0gIHJlYWN0b3JfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHJlYWN0b3JfdCooY29uc3QgdGhyZWFkX3QqIHRocmVhZCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgdGhyZWFkX3QqIHRocmVhZCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgcmVhY3Rvcl90KiBvcGVyYXRvcigpKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpIHsgcmV0dXJuIGJvZHkodGhyZWFkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHRocmVhZF9nZXRfcmVhY3RvciB0aHJlYWRfZ2V0X3JlYWN0b3I7Ci0KLS8vIE5hbWU6IHRocmVhZF9pc19zZWxmCi0vLyBQYXJhbXM6IGNvbnN0IHRocmVhZF90KiB0aHJlYWQKLS8vIFJldHVybjogYm9vbAotc3RydWN0IHRocmVhZF9pc19zZWxmIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgdGhyZWFkX3QqIHRocmVhZCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgdGhyZWFkX3QqIHRocmVhZCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpIHsgcmV0dXJuIGJvZHkodGhyZWFkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHRocmVhZF9pc19zZWxmIHRocmVhZF9pc19zZWxmOwotCi0vLyBOYW1lOiB0aHJlYWRfam9pbgotLy8gUGFyYW1zOiB0aHJlYWRfdCogdGhyZWFkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCB0aHJlYWRfam9pbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0aHJlYWRfdCogdGhyZWFkKT4gYm9keXtbXSh0aHJlYWRfdCogdGhyZWFkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0aHJlYWRfdCogdGhyZWFkKSB7IGJvZHkodGhyZWFkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHRocmVhZF9qb2luIHRocmVhZF9qb2luOwotCi0vLyBOYW1lOiB0aHJlYWRfbmFtZQotLy8gUGFyYW1zOiBjb25zdCB0aHJlYWRfdCogdGhyZWFkCi0vLyBSZXR1cm46IGNvbnN0IGNoYXIqCi1zdHJ1Y3QgdGhyZWFkX25hbWUgewotICBjb25zdCBjaGFyKiByZXR1cm5fdmFsdWV7MH07Ci0gIHN0ZDo6ZnVuY3Rpb248Y29uc3QgY2hhciooY29uc3QgdGhyZWFkX3QqIHRocmVhZCk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgdGhyZWFkX3QqIHRocmVhZCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgY29uc3QgY2hhciogb3BlcmF0b3IoKShjb25zdCB0aHJlYWRfdCogdGhyZWFkKSB7IHJldHVybiBib2R5KHRocmVhZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCB0aHJlYWRfbmFtZSB0aHJlYWRfbmFtZTsKLQotLy8gTmFtZTogdGhyZWFkX25ldwotLy8gUGFyYW1zOiBjb25zdCBjaGFyKiBuYW1lCi0vLyBSZXR1cm46IHRocmVhZF90Kgotc3RydWN0IHRocmVhZF9uZXcgewotICB0aHJlYWRfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHRocmVhZF90Kihjb25zdCBjaGFyKiBuYW1lKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBjaGFyKiBuYW1lKSB7IHJldHVybiByZXR1cm5fdmFsdWU7IH19OwotICB0aHJlYWRfdCogb3BlcmF0b3IoKShjb25zdCBjaGFyKiBuYW1lKSB7IHJldHVybiBib2R5KG5hbWUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgdGhyZWFkX25ldyB0aHJlYWRfbmV3OwotCi0vLyBOYW1lOiB0aHJlYWRfbmV3X3NpemVkCi0vLyBQYXJhbXM6IGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB3b3JrX3F1ZXVlX2NhcGFjaXR5Ci0vLyBSZXR1cm46IHRocmVhZF90Kgotc3RydWN0IHRocmVhZF9uZXdfc2l6ZWQgewotICB0aHJlYWRfdCogcmV0dXJuX3ZhbHVlezB9OwotICBzdGQ6OmZ1bmN0aW9uPHRocmVhZF90Kihjb25zdCBjaGFyKiBuYW1lLCBzaXplX3Qgd29ya19xdWV1ZV9jYXBhY2l0eSk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHdvcmtfcXVldWVfY2FwYWNpdHkpIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICAgIH19OwotICB0aHJlYWRfdCogb3BlcmF0b3IoKShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3Qgd29ya19xdWV1ZV9jYXBhY2l0eSkgewotICAgIHJldHVybiBib2R5KG5hbWUsIHdvcmtfcXVldWVfY2FwYWNpdHkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgdGhyZWFkX25ld19zaXplZCB0aHJlYWRfbmV3X3NpemVkOwotCi0vLyBOYW1lOiB0aHJlYWRfcG9zdAotLy8gUGFyYW1zOiB0aHJlYWRfdCogdGhyZWFkLCB0aHJlYWRfZm4gZnVuYywgdm9pZCogY29udGV4dAotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgdGhyZWFkX3Bvc3QgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh0aHJlYWRfdCogdGhyZWFkLCB0aHJlYWRfZm4gZnVuYywgdm9pZCogY29udGV4dCk+IGJvZHl7Ci0gICAgICBbdGhpc10odGhyZWFkX3QqIHRocmVhZCwgdGhyZWFkX2ZuIGZ1bmMsIHZvaWQqIGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICAgIH19OwotICBib29sIG9wZXJhdG9yKCkodGhyZWFkX3QqIHRocmVhZCwgdGhyZWFkX2ZuIGZ1bmMsIHZvaWQqIGNvbnRleHQpIHsKLSAgICByZXR1cm4gYm9keSh0aHJlYWQsIGZ1bmMsIGNvbnRleHQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgdGhyZWFkX3Bvc3QgdGhyZWFkX3Bvc3Q7Ci0KLS8vIE5hbWU6IHRocmVhZF9zZXRfcHJpb3JpdHkKLS8vIFBhcmFtczogdGhyZWFkX3QqIHRocmVhZCwgaW50IHByaW9yaXR5Ci0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCB0aHJlYWRfc2V0X3ByaW9yaXR5IHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodGhyZWFkX3QqIHRocmVhZCwgaW50IHByaW9yaXR5KT4gYm9keXsKLSAgICAgIFt0aGlzXSh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpIHsKLSAgICByZXR1cm4gYm9keSh0aHJlYWQsIHByaW9yaXR5KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IHRocmVhZF9zZXRfcHJpb3JpdHkgdGhyZWFkX3NldF9wcmlvcml0eTsKLQotLy8gTmFtZTogdGhyZWFkX3NldF9ydF9wcmlvcml0eQotLy8gUGFyYW1zOiB0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkKLS8vIFJldHVybjogYm9vbAotc3RydWN0IHRocmVhZF9zZXRfcnRfcHJpb3JpdHkgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpPiBib2R5ewotICAgICAgW3RoaXNdKHRocmVhZF90KiB0aHJlYWQsIGludCBwcmlvcml0eSkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHRocmVhZF90KiB0aHJlYWQsIGludCBwcmlvcml0eSkgewotICAgIHJldHVybiBib2R5KHRocmVhZCwgcHJpb3JpdHkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgdGhyZWFkX3NldF9ydF9wcmlvcml0eSB0aHJlYWRfc2V0X3J0X3ByaW9yaXR5OwotCi0vLyBOYW1lOiB0aHJlYWRfc3RvcAotLy8gUGFyYW1zOiB0aHJlYWRfdCogdGhyZWFkCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCB0aHJlYWRfc3RvcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0aHJlYWRfdCogdGhyZWFkKT4gYm9keXtbXSh0aHJlYWRfdCogdGhyZWFkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0aHJlYWRfdCogdGhyZWFkKSB7IGJvZHkodGhyZWFkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHRocmVhZF9zdG9wIHRocmVhZF9zdG9wOwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3RocmVhZAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX3RocmVhZF9zY2hlZHVsZXIuY2MgYi90ZXN0L21vY2svbW9ja19vc2lfdGhyZWFkX3NjaGVkdWxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmYmI1Yi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfdGhyZWFkX3NjaGVkdWxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19vc2lfdGhyZWFkX3NjaGVkdWxlci5oIgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfdGhyZWFkX3NjaGVkdWxlciB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IHRocmVhZF9zY2hlZHVsZXJfZW5hYmxlX3JlYWxfdGltZSB0aHJlYWRfc2NoZWR1bGVyX2VuYWJsZV9yZWFsX3RpbWU7Ci1zdHJ1Y3QgdGhyZWFkX3NjaGVkdWxlcl9nZXRfcHJpb3JpdHlfcmFuZ2UgdGhyZWFkX3NjaGVkdWxlcl9nZXRfcHJpb3JpdHlfcmFuZ2U7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfdGhyZWFkX3NjaGVkdWxlcgotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotYm9vbCB0aHJlYWRfc2NoZWR1bGVyX2VuYWJsZV9yZWFsX3RpbWUocGlkX3QgbGludXhfdGlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6b3NpX3RocmVhZF9zY2hlZHVsZXI6OnRocmVhZF9zY2hlZHVsZXJfZW5hYmxlX3JlYWxfdGltZSgKLSAgICAgIGxpbnV4X3RpZCk7Ci19Ci1ib29sIHRocmVhZF9zY2hlZHVsZXJfZ2V0X3ByaW9yaXR5X3JhbmdlKGludCYgbWluLCBpbnQmIG1heCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV90aHJlYWRfc2NoZWR1bGVyOjp0aHJlYWRfc2NoZWR1bGVyX2dldF9wcmlvcml0eV9yYW5nZSgKLSAgICAgIG1pbiwgbWF4KTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19vc2lfdGhyZWFkX3NjaGVkdWxlci5oIGIvdGVzdC9tb2NrL21vY2tfb3NpX3RocmVhZF9zY2hlZHVsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0OGQyZC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19vc2lfdGhyZWFkX3NjaGVkdWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjIKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgZnJvbSAob3IgYWRkIHRvICkgdGhlIGluY2x1c2lvbiBzZXQuCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfdGhyZWFkX3NjaGVkdWxlciB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBvc2lfZW5hYmxlX3JlYWxfdGltZV9zY2hlZHVsaW5nCi0vLyBQYXJhbXM6IHBpZF90IGxpbnV4X3RpZAotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgdGhyZWFkX3NjaGVkdWxlcl9lbmFibGVfcmVhbF90aW1lIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wocGlkX3QgbGludXhfdGlkKT4gYm9keXsKLSAgICAgIFt0aGlzXShwaWRfdCBsaW51eF90aWQpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShwaWRfdCBsaW51eF90aWQpIHsgcmV0dXJuIGJvZHkobGludXhfdGlkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHRocmVhZF9zY2hlZHVsZXJfZW5hYmxlX3JlYWxfdGltZQotICAgIHRocmVhZF9zY2hlZHVsZXJfZW5hYmxlX3JlYWxfdGltZTsKLQotLy8gTmFtZTogb3NpX2ZpZm9fc2NoZWR1aW5nX3ByaW9yaXR5X3JhbmdlCi0vLyBQYXJhbXM6IGludCYgbWluLCBpbnQmIG1heAotLy8gUmV0dXJuOiBib29sCi1zdHJ1Y3QgdGhyZWFkX3NjaGVkdWxlcl9nZXRfcHJpb3JpdHlfcmFuZ2UgewotICBib29sIHJldHVybl92YWx1ZXtmYWxzZX07Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChpbnQmIG1pbiwgaW50JiBtYXgpPiBib2R5ewotICAgICAgW3RoaXNdKGludCYgbWluLCBpbnQmIG1heCkgeyByZXR1cm4gcmV0dXJuX3ZhbHVlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGludCYgbWluLCBpbnQmIG1heCkgeyByZXR1cm4gYm9keShtaW4sIG1heCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCB0aHJlYWRfc2NoZWR1bGVyX2dldF9wcmlvcml0eV9yYW5nZQotICAgIHRocmVhZF9zY2hlZHVsZXJfZ2V0X3ByaW9yaXR5X3JhbmdlOwotCi19ICAvLyBuYW1lc3BhY2Ugb3NpX3RocmVhZF9zY2hlZHVsZXIKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfb3NpX3dha2Vsb2NrLmNjIGIvdGVzdC9tb2NrL21vY2tfb3NpX3dha2Vsb2NrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM1OWRlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX29zaV93YWtlbG9jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo2Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjMuMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19vc2lfd2FrZWxvY2suaCIKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugb3NpX3dha2Vsb2NrIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3Qgd2FrZWxvY2tfYWNxdWlyZSB3YWtlbG9ja19hY3F1aXJlOwotc3RydWN0IHdha2Vsb2NrX2NsZWFudXAgd2FrZWxvY2tfY2xlYW51cDsKLXN0cnVjdCB3YWtlbG9ja19kZWJ1Z19kdW1wIHdha2Vsb2NrX2RlYnVnX2R1bXA7Ci1zdHJ1Y3Qgd2FrZWxvY2tfcmVsZWFzZSB3YWtlbG9ja19yZWxlYXNlOwotc3RydWN0IHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cyB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHM7Ci1zdHJ1Y3Qgd2FrZWxvY2tfc2V0X3BhdGhzIHdha2Vsb2NrX3NldF9wYXRoczsKLQotfSAgLy8gbmFtZXNwYWNlIG9zaV93YWtlbG9jawotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotYm9vbCB3YWtlbG9ja19hY3F1aXJlKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpvc2lfd2FrZWxvY2s6Ondha2Vsb2NrX2FjcXVpcmUoKTsKLX0KLXZvaWQgd2FrZWxvY2tfY2xlYW51cCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpvc2lfd2FrZWxvY2s6Ondha2Vsb2NrX2NsZWFudXAoKTsKLX0KLXZvaWQgd2FrZWxvY2tfZGVidWdfZHVtcChpbnQgZmQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV93YWtlbG9jazo6d2FrZWxvY2tfZGVidWdfZHVtcChmZCk7Ci19Ci1ib29sIHdha2Vsb2NrX3JlbGVhc2Uodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6Om9zaV93YWtlbG9jazo6d2FrZWxvY2tfcmVsZWFzZSgpOwotfQotdm9pZCB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHMoYnRfb3NfY2FsbG91dHNfdCogY2FsbG91dHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV93YWtlbG9jazo6d2FrZWxvY2tfc2V0X29zX2NhbGxvdXRzKGNhbGxvdXRzKTsKLX0KLXZvaWQgd2FrZWxvY2tfc2V0X3BhdGhzKGNvbnN0IGNoYXIqIGxvY2tfcGF0aCwgY29uc3QgY2hhciogdW5sb2NrX3BhdGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6Om9zaV93YWtlbG9jazo6d2FrZWxvY2tfc2V0X3BhdGhzKGxvY2tfcGF0aCwgdW5sb2NrX3BhdGgpOwotfQotLy8gTW9ja2VkIGZ1bmN0aW9ucyBjb21wbGV0ZQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX29zaV93YWtlbG9jay5oIGIvdGVzdC9tb2NrL21vY2tfb3NpX3dha2Vsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDAzMDkuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfb3NpX3dha2Vsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImNoZWNrLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBvc2lfd2FrZWxvY2sgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogd2FrZWxvY2tfYWNxdWlyZQotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCB3YWtlbG9ja19hY3F1aXJlIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodm9pZCk+IGJvZHl7W3RoaXNdKHZvaWQpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCB3YWtlbG9ja19hY3F1aXJlIHdha2Vsb2NrX2FjcXVpcmU7Ci0KLS8vIE5hbWU6IHdha2Vsb2NrX2NsZWFudXAKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgd2FrZWxvY2tfY2xlYW51cCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHdha2Vsb2NrX2NsZWFudXAgd2FrZWxvY2tfY2xlYW51cDsKLQotLy8gTmFtZTogd2FrZWxvY2tfZGVidWdfZHVtcAotLy8gUGFyYW1zOiBpbnQgZmQKLS8vIFJldHVybjogdm9pZAotc3RydWN0IHdha2Vsb2NrX2RlYnVnX2R1bXAgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50IGZkKT4gYm9keXtbXShpbnQgZmQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGludCBmZCkgeyBib2R5KGZkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHdha2Vsb2NrX2RlYnVnX2R1bXAgd2FrZWxvY2tfZGVidWdfZHVtcDsKLQotLy8gTmFtZTogd2FrZWxvY2tfcmVsZWFzZQotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm46IGJvb2wKLXN0cnVjdCB3YWtlbG9ja19yZWxlYXNlIHsKLSAgYm9vbCByZXR1cm5fdmFsdWV7ZmFsc2V9OwotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodm9pZCk+IGJvZHl7W3RoaXNdKHZvaWQpIHsgcmV0dXJuIHJldHVybl92YWx1ZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCB3YWtlbG9ja19yZWxlYXNlIHdha2Vsb2NrX3JlbGVhc2U7Ci0KLS8vIE5hbWU6IHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cwotLy8gUGFyYW1zOiBidF9vc19jYWxsb3V0c190KiBjYWxsb3V0cwotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3Qgd2FrZWxvY2tfc2V0X29zX2NhbGxvdXRzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGJ0X29zX2NhbGxvdXRzX3QqIGNhbGxvdXRzKT4gYm9keXsKLSAgICAgIFtdKGJ0X29zX2NhbGxvdXRzX3QqIGNhbGxvdXRzKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShidF9vc19jYWxsb3V0c190KiBjYWxsb3V0cykgeyBib2R5KGNhbGxvdXRzKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cyB3YWtlbG9ja19zZXRfb3NfY2FsbG91dHM7Ci0KLS8vIE5hbWU6IHdha2Vsb2NrX3NldF9wYXRocwotLy8gUGFyYW1zOiBjb25zdCBjaGFyKiBsb2NrX3BhdGgsIGNvbnN0IGNoYXIqIHVubG9ja19wYXRoCi0vLyBSZXR1cm46IHZvaWQKLXN0cnVjdCB3YWtlbG9ja19zZXRfcGF0aHMgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgY2hhciogbG9ja19wYXRoLCBjb25zdCBjaGFyKiB1bmxvY2tfcGF0aCk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBjaGFyKiBsb2NrX3BhdGgsIGNvbnN0IGNoYXIqIHVubG9ja19wYXRoKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBsb2NrX3BhdGgsIGNvbnN0IGNoYXIqIHVubG9ja19wYXRoKSB7Ci0gICAgYm9keShsb2NrX3BhdGgsIHVubG9ja19wYXRoKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IHdha2Vsb2NrX3NldF9wYXRocyB3YWtlbG9ja19zZXRfcGF0aHM7Ci0KLX0gIC8vIG5hbWVzcGFjZSBvc2lfd2FrZWxvY2sKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2EyZHBfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYTJkcF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzIyMDYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYTJkcF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImEyZHBfYXBpLmgiCi0jaW5jbHVkZSAiYXZkdF9hcGkuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJzZHBkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svYTJkcC9hMmRwX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi10QTJEUF9TVEFUVVMgQTJEUF9BZGRSZWNvcmQodWludDE2X3Qgc2VydmljZV91dWlkLCBjaGFyKiBwX3NlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX3Byb3ZpZGVyX25hbWUsIHVpbnQxNl90IGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNkcF9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBBMkRQX1NVQ0NFU1M7Ci19Ci10QTJEUF9TVEFUVVMgQTJEUF9GaW5kU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QTJEUF9TRFBfREJfUEFSQU1TKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEEyRFBfRklORF9DQkFDSyogcF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEEyRFBfU1VDQ0VTUzsKLX0KLXVpbnQxNl90IEEyRFBfR2V0QXZkdHBWZXJzaW9uKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEEyRFBfQml0c1NldCh1aW50NjRfdCBudW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCBBMkRQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBBMkRQX0luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBhMmRwX3NldF9hdmR0X3NkcF92ZXIodWludDE2X3QgYXZkdF9zZHBfdmVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYTJkcF9jb2RlY19jb25maWcuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hMmRwX2NvZGVjX2NvbmZpZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2ZjgyZi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19hMmRwX2NvZGVjX2NvbmZpZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NjcKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgImEyZHBfYWFjLmgiCi0jaW5jbHVkZSAiYTJkcF9jb2RlY19hcGkuaCIKLSNpbmNsdWRlICJhMmRwX3NiYy5oIgotI2luY2x1ZGUgImEyZHBfdmVuZG9yLmgiCi0jaW5jbHVkZSAiYnRhL2F2L2J0YV9hdl9pbnQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLUEyZHBDb2RlY0NvbmZpZyogQTJkcENvZGVjQ29uZmlnOjpjcmVhdGVDb2RlYygKLSAgICBidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdCBjb2RlY19wcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1BMmRwQ29kZWNDb25maWcqIEEyZHBDb2RlY3M6OmZpbmRTaW5rQ29kZWNDb25maWcoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLUEyZHBDb2RlY0NvbmZpZyogQTJkcENvZGVjczo6ZmluZFNvdXJjZUNvZGVjQ29uZmlnKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1BMmRwQ29kZWNDb25maWc6OkEyZHBDb2RlY0NvbmZpZyhidGF2X2EyZHBfY29kZWNfaW5kZXhfdCBjb2RlY19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhdl9hMmRwX2NvZGVjX3ByaW9yaXR5X3QgY29kZWNfcHJpb3JpdHkpCi0gICAgOiBjb2RlY19pbmRleF8oY29kZWNfaW5kZXgpLAotICAgICAgbmFtZV8obmFtZSksCi0gICAgICBkZWZhdWx0X2NvZGVjX3ByaW9yaXR5Xyhjb2RlY19wcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLUEyZHBDb2RlY0NvbmZpZzo6fkEyZHBDb2RlY0NvbmZpZygpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLUEyZHBDb2RlY3M6OkEyZHBDb2RlY3MoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiYgY29kZWNfcHJpb3JpdGllcykKLSAgICA6IGN1cnJlbnRfY29kZWNfY29uZmlnXyhudWxscHRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotQTJkcENvZGVjczo6fkEyZHBDb2RlY3MoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci1ib29sIEEyRFBfQWRqdXN0Q29kZWModWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfQnVpbGRDb2RlY0hlYWRlcihjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIEJUX0hEUiogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmcmFtZXNfcGVyX3BhY2tldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0NvZGVjRXF1YWxzKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19iKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfQ29kZWNUeXBlRXF1YWxzKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mb19hLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm9fYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0dldFBhY2tldFRpbWVzdGFtcChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8sIGNvbnN0IHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfdGltZXN0YW1wKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfSW5pdENvZGVjQ29uZmlnKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdmR0cFNlcENvbmZpZyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWludCBBMkRQX0dldEVlY29kZXJFZmZlY3RpdmVGcmFtZVNpemUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTaW5rQ29kZWNWYWxpZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1N1cHBvcnRlZChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJEUF9Jc1BlZXJTb3VyY2VDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0lzU2lua0NvZGVjU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX0lzU2lua0NvZGVjVmFsaWQoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyRFBfSXNTb3VyY2VDb2RlY1ZhbGlkKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMkRQX1VzZXNSdHBIZWFkZXIoYm9vbCBjb250ZW50X3Byb3RlY3Rpb25fZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMmRwQ29kZWNDb25maWc6OmNvZGVjQ29uZmlnSXNWYWxpZCgKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2NvbmZpZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMmRwQ29kZWNDb25maWc6OmNvcHlPdXRPdGFDb2RlY0NvbmZpZyh1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpnZXRDb2RlY1NwZWNpZmljQ29uZmlnKHRCVF9BMkRQX09GRkxPQUQqIHBfYTJkcF9vZmZsb2FkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY0NvbmZpZzo6aXNDb2RlY0NvbmZpZ0VtcHR5KAotICAgIGNvbnN0IGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCYgY29kZWNfY29uZmlnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY0NvbmZpZzo6aXNWYWxpZCgpIGNvbnN0IHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjQ29uZmlnOjpzZXRDb2RlY1VzZXJDb25maWcoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY191c2VyX2NvbmZpZywKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX2NvZGVjX2luZm8sIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OmdldENvZGVjQ29uZmlnQW5kQ2FwYWJpbGl0aWVzKAotICAgIGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCogcF9jb2RlY19jb25maWcsCi0gICAgc3RkOjp2ZWN0b3I8YnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190PiogcF9jb2RlY3NfbG9jYWxfY2FwYWJpbGl0aWVzLAotICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4qIHBfY29kZWNzX3NlbGVjdGFibGVfY2FwYWJpbGl0aWVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OmluaXQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OmlzU3VwcG9ydGVkQ29kZWMoYnRhdl9hMmRwX2NvZGVjX2luZGV4X3QgY29kZWNfaW5kZXgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjczo6c2V0Q29kZWNBdWRpb0NvbmZpZygKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX2F1ZGlvX2NvbmZpZywKLSAgICBjb25zdCB0QTJEUF9FTkNPREVSX0lOSVRfUEVFUl9QQVJBTVMqIHBfcGVlcl9wYXJhbXMsCi0gICAgY29uc3QgdWludDhfdCogcF9wZWVyX3NpbmtfY2FwYWJpbGl0aWVzLCB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgYm9vbCogcF9yZXN0YXJ0X291dHB1dCwgYm9vbCogcF9jb25maWdfdXBkYXRlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBBMmRwQ29kZWNzOjpzZXRDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VsZWN0X2N1cnJlbnRfY29kZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjczo6c2V0Q29kZWNPdGFDb25maWcoCi0gICAgY29uc3QgdWludDhfdCogcF9vdGFfY29kZWNfY29uZmlnLAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICB1aW50OF90KiBwX3Jlc3VsdF9jb2RlY19jb25maWcsIGJvb2wqIHBfcmVzdGFydF9pbnB1dCwKLSAgICBib29sKiBwX3Jlc3RhcnRfb3V0cHV0LCBib29sKiBwX2NvbmZpZ191cGRhdGVkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OnNldENvZGVjVXNlckNvbmZpZygKLSAgICBjb25zdCBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QmIGNvZGVjX3VzZXJfY29uZmlnLAotICAgIGNvbnN0IHRBMkRQX0VOQ09ERVJfSU5JVF9QRUVSX1BBUkFNUyogcF9wZWVyX3BhcmFtcywKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfc2lua19jYXBhYmlsaXRpZXMsIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywKLSAgICBib29sKiBwX3Jlc3RhcnRfaW5wdXQsIGJvb2wqIHBfcmVzdGFydF9vdXRwdXQsIGJvb2wqIHBfY29uZmlnX3VwZGF0ZWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQTJkcENvZGVjczo6c2V0UGVlclNpbmtDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OnNldFBlZXJTb3VyY2VDb2RlY0NhcGFiaWxpdGllcygKLSAgICBjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfY2FwYWJpbGl0aWVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEEyZHBDb2RlY3M6OnNldFNpbmtDb2RlY0NvbmZpZyhjb25zdCB1aW50OF90KiBwX3BlZXJfY29kZWNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2FwYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfcmVzdWx0X2NvZGVjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VsZWN0X2N1cnJlbnRfY29kZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjQXVkaW9Db25maWcoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnOwotICByZXR1cm4gY29uZmlnOwotfQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNDYXBhYmlsaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjQ29uZmlnKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjTG9jYWxDYXBhYmlsaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19jb25maWdfdCBBMmRwQ29kZWNDb25maWc6OmdldENvZGVjU2VsZWN0YWJsZUNhcGFiaWxpdHkoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29uZmlnOwotICByZXR1cm4gY29uZmlnOwotfQotYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IEEyZHBDb2RlY0NvbmZpZzo6Z2V0Q29kZWNVc2VyQ29uZmlnKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190IGNvbmZpZzsKLSAgcmV0dXJuIGNvbmZpZzsKLX0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU2lua0NvZGVjSW5kZXgoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWDsKLX0KLWJ0YXZfYTJkcF9jb2RlY19pbmRleF90IEEyRFBfU291cmNlQ29kZWNJbmRleChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfTUFYOwotfQotY29uc3QgY2hhciogQTJEUF9Db2RlY0luZGV4U3RyKGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX2luZGV4KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWNvbnN0IGNoYXIqIEEyRFBfQ29kZWNOYW1lKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCB0QTJEUF9ERUNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXREZWNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCB0QTJEUF9FTkNPREVSX0lOVEVSRkFDRSogQTJEUF9HZXRFbmNvZGVySW50ZXJmYWNlKAotICAgIGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1pbnQgQTJEUF9HZXRTaW5rVHJhY2tDaGFubmVsVHlwZShjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IEEyRFBfR2V0VHJhY2tCaXRzUGVyU2FtcGxlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgQTJEUF9HZXRUcmFja0NoYW5uZWxDb3VudChjb25zdCB1aW50OF90KiBwX2NvZGVjX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IEEyRFBfR2V0VHJhY2tTYW1wbGVSYXRlKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgQTJkcENvZGVjQ29uZmlnOjpnZXRUcmFja0JpdFJhdGUoKSBjb25zdCB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXN0ZDo6c3RyaW5nIEEyRFBfQ29kZWNJbmZvU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGQ6OnN0cmluZyBBMmRwQ29kZWNDb25maWc6OmNvZGVjQml0c1BlclNhbXBsZTJTdHIoCi0gICAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGNvZGVjX2JpdHNfcGVyX3NhbXBsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGQ6OnN0cmluZyBBMmRwQ29kZWNDb25maWc6OmNvZGVjQ2hhbm5lbE1vZGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19jaGFubmVsX21vZGVfdCBjb2RlY19jaGFubmVsX21vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjpzdHJpbmcgQTJkcENvZGVjQ29uZmlnOjpjb2RlY0NvbmZpZzJTdHIoCi0gICAgY29uc3QgYnRhdl9hMmRwX2NvZGVjX2NvbmZpZ190JiBjb2RlY19jb25maWcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjpzdHJpbmcgQTJkcENvZGVjQ29uZmlnOjpjb2RlY1NhbXBsZVJhdGUyU3RyKAotICAgIGJ0YXZfYTJkcF9jb2RlY19zYW1wbGVfcmF0ZV90IGNvZGVjX3NhbXBsZV9yYXRlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRBMkRQX0NPREVDX1RZUEUgQTJEUF9HZXRDb2RlY1R5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgQTJEUF9HZXRNZWRpYVR5cGUoY29uc3QgdWludDhfdCogcF9jb2RlY19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgQTJkcENvZGVjQ29uZmlnOjpnZXRBdWRpb0JpdHNQZXJTYW1wbGUoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgQTJEUF9Jbml0RGVmYXVsdENvZGVjKHVpbnQ4X3QqIHBfY29kZWNfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQTJkcENvZGVjQ29uZmlnOjpkZWJ1Z19jb2RlY19kdW1wKGludCBmZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQTJkcENvZGVjQ29uZmlnOjpzZXRDb2RlY1ByaW9yaXR5KAotICAgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBBMmRwQ29kZWNDb25maWc6OnNldERlZmF1bHRDb2RlY1ByaW9yaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQTJkcENvZGVjczo6ZGVidWdfY29kZWNfZHVtcChpbnQgZmQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19hY2wuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hY2wuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDE0ODIuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMjUKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMi4xCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19hY2wgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBBQ0xfU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhCi0gICAgQUNMX1N1cHBvcnRUcmFuc3BhcmVudFN5bmNocm9ub3VzRGF0YTsKLXN0cnVjdCBCVE1fQkxFX0lTX1JFU09MVkVfQkRBIEJUTV9CTEVfSVNfUkVTT0xWRV9CREE7Ci1zdHJ1Y3QgQlRNX0lzQWNsQ29ubmVjdGlvblVwIEJUTV9Jc0FjbENvbm5lY3Rpb25VcDsKLXN0cnVjdCBCVE1fSXNBY2xDb25uZWN0aW9uVXBBbmRIYW5kbGVWYWxpZCBCVE1fSXNBY2xDb25uZWN0aW9uVXBBbmRIYW5kbGVWYWxpZDsKLXN0cnVjdCBCVE1fSXNBY2xDb25uZWN0aW9uVXBGcm9tSGFuZGxlIEJUTV9Jc0FjbENvbm5lY3Rpb25VcEZyb21IYW5kbGU7Ci1zdHJ1Y3QgQlRNX0lzQmxlQ29ubmVjdGlvbiBCVE1fSXNCbGVDb25uZWN0aW9uOwotc3RydWN0IEJUTV9Jc1BoeTJtU3VwcG9ydGVkIEJUTV9Jc1BoeTJtU3VwcG9ydGVkOwotc3RydWN0IEJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIgQlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcjsKLXN0cnVjdCBCVE1fUmVhZFJlbW90ZVZlcnNpb24gQlRNX1JlYWRSZW1vdGVWZXJzaW9uOwotc3RydWN0IEJUTV9pc19zbmlmZl9hbGxvd2VkX2ZvciBCVE1faXNfc25pZmZfYWxsb3dlZF9mb3I7Ci1zdHJ1Y3QgYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uIGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbjsKLXN0cnVjdCBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb25fd2l0aF9pZCBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb25fd2l0aF9pZDsKLXN0cnVjdCBhY2xfaXNfcm9sZV9zd2l0Y2hfYWxsb3dlZCBhY2xfaXNfcm9sZV9zd2l0Y2hfYWxsb3dlZDsKLXN0cnVjdCBhY2xfaXNfc3dpdGNoX3JvbGVfaWRsZSBhY2xfaXNfc3dpdGNoX3JvbGVfaWRsZTsKLXN0cnVjdCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfMm1fcGh5IGFjbF9wZWVyX3N1cHBvcnRzX2JsZV8ybV9waHk7Ci1zdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2NvZGVkX3BoeSBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29kZWRfcGh5Owotc3RydWN0IGFjbF9zZW5kX2RhdGFfcGFja2V0X2JyX2VkciBhY2xfc2VuZF9kYXRhX3BhY2tldF9icl9lZHI7Ci1zdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyc19yZXF1ZXN0Ci0gICAgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2Nvbm5lY3Rpb25fcGFyYW1ldGVyc19yZXF1ZXN0Owotc3RydWN0IGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uCi0gICAgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX3BhY2tldF9leHRlbnNpb247Ci1zdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nIGFjbF9wZWVyX3N1cHBvcnRzX3NuaWZmX3N1YnJhdGluZzsKLXN0cnVjdCBhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzcyBhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzczsKLXN0cnVjdCBhY2xfc2V0X3BlZXJfbGVfZmVhdHVyZXNfZnJvbV9oYW5kbGUKLSAgICBhY2xfc2V0X3BlZXJfbGVfZmVhdHVyZXNfZnJvbV9oYW5kbGU7Ci1zdHJ1Y3Qgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18ybV9waHkgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18ybV9waHk7Ci1zdHJ1Y3Qgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHkgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHk7Ci1zdHJ1Y3QgYWNsX2NyZWF0ZV9jbGFzc2ljX2Nvbm5lY3Rpb24gYWNsX2NyZWF0ZV9jbGFzc2ljX2Nvbm5lY3Rpb247Ci1zdHJ1Y3QgSXNFcHJBdmFpbGFibGUgSXNFcHJBdmFpbGFibGU7Ci1zdHJ1Y3QgYWNsX2dldF9jb25uZWN0aW9uX2Zyb21fYWRkcmVzcyBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9hZGRyZXNzOwotc3RydWN0IGFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2hhbmRsZSBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGU7Ci1zdHJ1Y3QgQlRNX0dldExpbmtTdXBlclRvdXQgQlRNX0dldExpbmtTdXBlclRvdXQ7Ci1zdHJ1Y3QgQlRNX0dldFJvbGUgQlRNX0dldFJvbGU7Ci1zdHJ1Y3QgQlRNX1JlYWRGYWlsZWRDb250YWN0Q291bnRlciBCVE1fUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyOwotc3RydWN0IEJUTV9SZWFkUlNTSSBCVE1fUmVhZFJTU0k7Ci1zdHJ1Y3QgQlRNX1JlYWRUeFBvd2VyIEJUTV9SZWFkVHhQb3dlcjsKLXN0cnVjdCBCVE1fU2V0TGlua1N1cGVyVG91dCBCVE1fU2V0TGlua1N1cGVyVG91dDsKLXN0cnVjdCBCVE1fU3dpdGNoUm9sZVRvQ2VudHJhbCBCVE1fU3dpdGNoUm9sZVRvQ2VudHJhbDsKLXN0cnVjdCBidG1fcmVtb3ZlX2FjbCBidG1fcmVtb3ZlX2FjbDsKLXN0cnVjdCBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlIGJ0bV9nZXRfYWNsX2Rpc2NfcmVhc29uX2NvZGU7Ci1zdHJ1Y3QgQlRNX0dldEhDSUNvbm5IYW5kbGUgQlRNX0dldEhDSUNvbm5IYW5kbGU7Ci1zdHJ1Y3QgQlRNX0dldE1heFBhY2tldFNpemUgQlRNX0dldE1heFBhY2tldFNpemU7Ci1zdHJ1Y3QgQlRNX0dldE51bUFjbExpbmtzIEJUTV9HZXROdW1BY2xMaW5rczsKLXN0cnVjdCBhY2xfZ2V0X3N1cHBvcnRlZF9wYWNrZXRfdHlwZXMgYWNsX2dldF9zdXBwb3J0ZWRfcGFja2V0X3R5cGVzOwotc3RydWN0IEJUTV9HZXRQZWVyU0NBIEJUTV9HZXRQZWVyU0NBOwotc3RydWN0IEJUTV9TZXRUcmFjZUxldmVsIEJUTV9TZXRUcmFjZUxldmVsOwotc3RydWN0IGFjbF9saW5rX3JvbGVfZnJvbV9oYW5kbGUgYWNsX2xpbmtfcm9sZV9mcm9tX2hhbmRsZTsKLXN0cnVjdCBidG1faGFuZGxlX3RvX2FjbF9pbmRleCBidG1faGFuZGxlX3RvX2FjbF9pbmRleDsKLXN0cnVjdCBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzIEJUTV9SZWFkUmVtb3RlRmVhdHVyZXM7Ci1zdHJ1Y3QgQUNMX1JlZ2lzdGVyQ2xpZW50IEFDTF9SZWdpc3RlckNsaWVudDsKLXN0cnVjdCBBQ0xfVW5yZWdpc3RlckNsaWVudCBBQ0xfVW5yZWdpc3RlckNsaWVudDsKLXN0cnVjdCBCVE1fUmVhZENvbm5lY3Rpb25BZGRyIEJUTV9SZWFkQ29ubmVjdGlvbkFkZHI7Ci1zdHJ1Y3QgQlRNX1JlcXVlc3RQZWVyU0NBIEJUTV9SZXF1ZXN0UGVlclNDQTsKLXN0cnVjdCBCVE1fYWNsX2FmdGVyX2NvbnRyb2xsZXJfc3RhcnRlZCBCVE1fYWNsX2FmdGVyX2NvbnRyb2xsZXJfc3RhcnRlZDsKLXN0cnVjdCBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yIEJUTV9ibG9ja19yb2xlX3N3aXRjaF9mb3I7Ci1zdHJ1Y3QgQlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yIEJUTV9ibG9ja19zbmlmZl9tb2RlX2ZvcjsKLXN0cnVjdCBCVE1fZGVmYXVsdF9ibG9ja19yb2xlX3N3aXRjaCBCVE1fZGVmYXVsdF9ibG9ja19yb2xlX3N3aXRjaDsKLXN0cnVjdCBCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoIEJUTV9kZWZhdWx0X3VuYmxvY2tfcm9sZV9zd2l0Y2g7Ci1zdHJ1Y3QgQlRNX3VuYmxvY2tfcm9sZV9zd2l0Y2hfZm9yIEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2ZvcjsKLXN0cnVjdCBCVE1fdW5ibG9ja19zbmlmZl9tb2RlX2ZvciBCVE1fdW5ibG9ja19zbmlmZl9tb2RlX2ZvcjsKLXN0cnVjdCBIQUNLX2FjbF9jaGVja19zbTQgSEFDS19hY2xfY2hlY2tfc200Owotc3RydWN0IGFjbF9hY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0IGFjbF9hY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0Owotc3RydWN0IGFjbF9kaXNjb25uZWN0X2FmdGVyX3JvbGVfc3dpdGNoIGFjbF9kaXNjb25uZWN0X2FmdGVyX3JvbGVfc3dpdGNoOwotc3RydWN0IGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlOwotc3RydWN0IGFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQgYWNsX2xpbmtfc2VnbWVudHNfeG1pdHRlZDsKLXN0cnVjdCBhY2xfcGFja2V0c19jb21wbGV0ZWQgYWNsX3BhY2tldHNfY29tcGxldGVkOwotc3RydWN0IGFjbF9wcm9jZXNzX2V4dGVuZGVkX2ZlYXR1cmVzIGFjbF9wcm9jZXNzX2V4dGVuZGVkX2ZlYXR1cmVzOwotc3RydWN0IGFjbF9wcm9jZXNzX251bV9jb21wbGV0ZWRfcGt0cyBhY2xfcHJvY2Vzc19udW1fY29tcGxldGVkX3BrdHM7Ci1zdHJ1Y3QgYWNsX3Byb2Nlc3Nfc3VwcG9ydGVkX2ZlYXR1cmVzIGFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlczsKLXN0cnVjdCBhY2xfcmN2X2FjbF9kYXRhIGFjbF9yY3ZfYWNsX2RhdGE7Ci1zdHJ1Y3QgYWNsX3JlamVjdF9jb25uZWN0aW9uX3JlcXVlc3QgYWNsX3JlamVjdF9jb25uZWN0aW9uX3JlcXVlc3Q7Ci1zdHJ1Y3QgYWNsX3NlbmRfZGF0YV9wYWNrZXRfYmxlIGFjbF9zZW5kX2RhdGFfcGFja2V0X2JsZTsKLXN0cnVjdCBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uIGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb247Ci1zdHJ1Y3QgYWNsX3dyaXRlX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0IGFjbF93cml0ZV9hdXRvbWF0aWNfZmx1c2hfdGltZW91dDsKLXN0cnVjdCBidG1fYWNsX2Nvbm5lY3RlZCBidG1fYWNsX2Nvbm5lY3RlZDsKLXN0cnVjdCBidG1fYWNsX2Nvbm5lY3Rpb25fcmVxdWVzdCBidG1fYWNsX2Nvbm5lY3Rpb25fcmVxdWVzdDsKLXN0cnVjdCBidG1fYWNsX2NyZWF0ZWQgYnRtX2FjbF9jcmVhdGVkOwotc3RydWN0IGJ0bV9hY2xfZGV2aWNlX2Rvd24gYnRtX2FjbF9kZXZpY2VfZG93bjsKLXN0cnVjdCBidG1fYWNsX2Rpc2Nvbm5lY3RlZCBidG1fYWNsX2Rpc2Nvbm5lY3RlZDsKLXN0cnVjdCBidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQgYnRtX2FjbF9pc29fZGlzY29ubmVjdGVkOwotc3RydWN0IGJ0bV9hY2xfZW5jcnlwdF9jaGFuZ2UgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZTsKLXN0cnVjdCBidG1fYWNsX25vdGlmX2Nvbm5fY29sbGlzaW9uIGJ0bV9hY2xfbm90aWZfY29ubl9jb2xsaXNpb247Ci1zdHJ1Y3QgYnRtX2FjbF9wYWdpbmcgYnRtX2FjbF9wYWdpbmc7Ci1zdHJ1Y3QgYnRtX2FjbF9wcm9jZXNzX3NjYV9jbXBsX3BrdCBidG1fYWNsX3Byb2Nlc3Nfc2NhX2NtcGxfcGt0Owotc3RydWN0IGJ0bV9hY2xfcmVtb3ZlZCBidG1fYWNsX3JlbW92ZWQ7Ci1zdHJ1Y3QgYnRtX2FjbF9yZXNldF9wYWdpbmcgYnRtX2FjbF9yZXNldF9wYWdpbmc7Ci1zdHJ1Y3QgYnRtX2FjbF9yZXN1Ym1pdF9wYWdlIGJ0bV9hY2xfcmVzdWJtaXRfcGFnZTsKLXN0cnVjdCBidG1fYWNsX3JvbGVfY2hhbmdlZCBidG1fYWNsX3JvbGVfY2hhbmdlZDsKLXN0cnVjdCBidG1fYWNsX3NldF9wYWdpbmcgYnRtX2FjbF9zZXRfcGFnaW5nOwotc3RydWN0IGJ0bV9hY2xfdXBkYXRlX2Nvbm5fYWRkciBidG1fYWNsX3VwZGF0ZV9jb25uX2FkZHI7Ci1zdHJ1Y3QgYnRtX2FjbF91cGRhdGVfaW5xdWlyeV9zdGF0dXMgYnRtX2FjbF91cGRhdGVfaW5xdWlyeV9zdGF0dXM7Ci1zdHJ1Y3QgYnRtX2JsZV9yZWZyZXNoX2xvY2FsX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyCi0gICAgYnRtX2JsZV9yZWZyZXNoX2xvY2FsX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyOwotc3RydWN0IGJ0bV9jb250X3Jzd2l0Y2hfZnJvbV9oYW5kbGUgYnRtX2NvbnRfcnN3aXRjaF9mcm9tX2hhbmRsZTsKLXN0cnVjdCBidG1fZXN0YWJsaXNoX2NvbnRpbnVlX2Zyb21fYWRkcmVzcyBidG1fZXN0YWJsaXNoX2NvbnRpbnVlX2Zyb21fYWRkcmVzczsKLXN0cnVjdCBidG1fcHJvY2Vzc19yZW1vdGVfZXh0X2ZlYXR1cmVzIGJ0bV9wcm9jZXNzX3JlbW90ZV9leHRfZmVhdHVyZXM7Ci1zdHJ1Y3QgYnRtX3Byb2Nlc3NfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUgYnRtX3Byb2Nlc3NfcmVtb3RlX3ZlcnNpb25fY29tcGxldGU7Ci1zdHJ1Y3QgYnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUKLSAgICBidG1fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZTsKLXN0cnVjdCBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlCi0gICAgYnRtX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jb21wbGV0ZTsKLXN0cnVjdCBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQKLSAgICBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQ7Ci1zdHJ1Y3QgYnRtX3JlYWRfbGlua19xdWFsaXR5X2NvbXBsZXRlIGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZTsKLXN0cnVjdCBidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dCBidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dDsKLXN0cnVjdCBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXM7Ci1zdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZQotICAgIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGU7Ci1zdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZV9yYXcKLSAgICBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2NvbXBsZXRlX3JhdzsKLXN0cnVjdCBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZCBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZDsKLXN0cnVjdCBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlOwotc3RydWN0IGJ0bV9yZWFkX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZV9yYXcKLSAgICBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGVfcmF3Owotc3RydWN0IGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlIGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlOwotc3RydWN0IGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlX3JhdwotICAgIGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlX3JhdzsKLXN0cnVjdCBidG1fcmVhZF9yc3NpX2NvbXBsZXRlIGJ0bV9yZWFkX3Jzc2lfY29tcGxldGU7Ci1zdHJ1Y3QgYnRtX3JlYWRfcnNzaV90aW1lb3V0IGJ0bV9yZWFkX3Jzc2lfdGltZW91dDsKLXN0cnVjdCBidG1fcmVhZF90eF9wb3dlcl9jb21wbGV0ZSBidG1fcmVhZF90eF9wb3dlcl9jb21wbGV0ZTsKLXN0cnVjdCBidG1fcmVhZF90eF9wb3dlcl90aW1lb3V0IGJ0bV9yZWFkX3R4X3Bvd2VyX3RpbWVvdXQ7Ci1zdHJ1Y3QgYnRtX3JlamVjdGxpc3Rfcm9sZV9jaGFuZ2VfZGV2aWNlIGJ0bV9yZWplY3RsaXN0X3JvbGVfY2hhbmdlX2RldmljZTsKLXN0cnVjdCBidG1fc2V0X2xpbmtfcG9saWN5IGJ0bV9zZXRfbGlua19wb2xpY3k7Ci1zdHJ1Y3QgYnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzIGJ0bV9zZXRfcGFja2V0X3R5cGVzX2Zyb21fYWRkcmVzczsKLXN0cnVjdCBoY2lfYnRtX3NldF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQKLSAgICBoY2lfYnRtX3NldF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQ7Ci1zdHJ1Y3Qgb25fYWNsX2JyX2Vkcl9jb25uZWN0ZWQgb25fYWNsX2JyX2Vkcl9jb25uZWN0ZWQ7Ci1zdHJ1Y3Qgb25fYWNsX2JyX2Vkcl9mYWlsZWQgb25fYWNsX2JyX2Vkcl9mYWlsZWQ7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGFja19hY2wKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLWJvb2wgQUNMX1N1cHBvcnRUcmFuc3BhcmVudFN5bmNocm9ub3VzRGF0YShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpBQ0xfU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhKGJkX2FkZHIpOwotfQotYm9vbCBCVE1fQkxFX0lTX1JFU09MVkVfQkRBKGNvbnN0IFJhd0FkZHJlc3MmIHgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9CTEVfSVNfUkVTT0xWRV9CREEoeCk7Ci19Ci1ib29sIEJUTV9Jc0FjbENvbm5lY3Rpb25VcChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9Jc0FjbENvbm5lY3Rpb25VcChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotfQotYm9vbCBCVE1fSXNBY2xDb25uZWN0aW9uVXBBbmRIYW5kbGVWYWxpZChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX0lzQWNsQ29ubmVjdGlvblVwQW5kSGFuZGxlVmFsaWQocmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKLX0KLWJvb2wgQlRNX0lzQWNsQ29ubmVjdGlvblVwRnJvbUhhbmRsZSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fSXNBY2xDb25uZWN0aW9uVXBGcm9tSGFuZGxlKGhjaV9oYW5kbGUpOwotfQotYm9vbCBCVE1fSXNCbGVDb25uZWN0aW9uKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9Jc0JsZUNvbm5lY3Rpb24oaGNpX2hhbmRsZSk7Ci19Ci1ib29sIEJUTV9Jc1BoeTJtU3VwcG9ydGVkKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fSXNQaHkybVN1cHBvcnRlZChyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotfQotYm9vbCBCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkUmVtb3RlQ29ubmVjdGlvbkFkZHIoCi0gICAgICBwc2V1ZG9fYWRkciwgY29ubl9hZGRyLCBwX2FkZHJfdHlwZSk7Ci19Ci1ib29sIEJUTV9SZWFkUmVtb3RlVmVyc2lvbihjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYW51ZmFjdHVyZXIsIHVpbnQxNl90KiBsbXBfc3ViX3ZlcnNpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkUmVtb3RlVmVyc2lvbigKLSAgICAgIGFkZHIsIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXIsIGxtcF9zdWJfdmVyc2lvbik7Ci19Ci1ib29sIEJUTV9pc19zbmlmZl9hbGxvd2VkX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9pc19zbmlmZl9hbGxvd2VkX2ZvcihwZWVyX2FkZHIpOwotfQotYm9vbCBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uKGJkX2FkZHIpOwotfQotYm9vbCBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb25fd2l0aF9pZCh1aW50OF90IGlkLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb25fd2l0aF9pZChpZCwgYmRfYWRkcik7Ci19Ci1ib29sIGFjbF9pc19yb2xlX3N3aXRjaF9hbGxvd2VkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX2lzX3JvbGVfc3dpdGNoX2FsbG93ZWQoKTsKLX0KLWJvb2wgYWNsX2lzX3N3aXRjaF9yb2xlX2lkbGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9pc19zd2l0Y2hfcm9sZV9pZGxlKGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci19Ci1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV8ybV9waHkodWludDE2X3QgaGNpX2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX3BlZXJfc3VwcG9ydHNfYmxlXzJtX3BoeShoY2lfaGFuZGxlKTsKLX0KLWJvb2wgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2NvZGVkX3BoeSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfcGVlcl9zdXBwb3J0c19ibGVfY29kZWRfcGh5KGhjaV9oYW5kbGUpOwotfQotYm9vbCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6Ci0gICAgICBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QocmVtb3RlX2JkYSk7Ci19Ci1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9wZWVyX3N1cHBvcnRzX2JsZV9wYWNrZXRfZXh0ZW5zaW9uKAotICAgICAgaGNpX2hhbmRsZSk7Ci19Ci1ib29sIGFjbF9wZWVyX3N1cHBvcnRzX3NuaWZmX3N1YnJhdGluZyhjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfcGVlcl9zdXBwb3J0c19zbmlmZl9zdWJyYXRpbmcocmVtb3RlX2JkYSk7Ci19Ci1ib29sIGFjbF9yZWZyZXNoX3JlbW90ZV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGlkZW50aXR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGlkZW50aXR5X2FkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QkxFX0FERFJfVFlQRSBycmFfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgcnBhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzcygKLSAgICAgIGlkZW50aXR5X2FkZHJlc3MsIGlkZW50aXR5X2FkZHJlc3NfdHlwZSwgYmRhLCBycmFfdHlwZSwgcnBhKTsKLX0KLWJvb2wgYWNsX3NldF9wZWVyX2xlX2ZlYXR1cmVzX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfc2V0X3BlZXJfbGVfZmVhdHVyZXNfZnJvbV9oYW5kbGUoaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHApOwotfQotYm9vbCBzY29fcGVlcl9zdXBwb3J0c19lc2NvXzJtX3BoeShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpzY29fcGVlcl9zdXBwb3J0c19lc2NvXzJtX3BoeShyZW1vdGVfYmRhKTsKLX0KLWJvb2wgc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6c2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHkocmVtb3RlX2JkYSk7Ci19Ci12b2lkIGFjbF9zZW5kX2RhdGFfcGFja2V0X2JyX2Vkcihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBCVF9IRFIqIHBfYnVmKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9zZW5kX2RhdGFfcGFja2V0X2JyX2VkcihiZF9hZGRyLCBwX2J1Zik7Ci19Ci12b2lkIGFjbF9jcmVhdGVfY2xhc3NpY19jb25uZWN0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhlcmVfYXJlX2hpZ2hfcHJpb3JpdHlfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYm9uZGluZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX2NyZWF0ZV9jbGFzc2ljX2Nvbm5lY3Rpb24oCi0gICAgICBiZF9hZGRyLCB0aGVyZV9hcmVfaGlnaF9wcmlvcml0eV9jaGFubmVscywgaXNfYm9uZGluZyk7Ci19Ci1ib29sIElzRXByQXZhaWxhYmxlKGNvbnN0IHRBQ0xfQ09OTiYgcF9hY2wpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OklzRXByQXZhaWxhYmxlKHBfYWNsKTsKLX0KLXRBQ0xfQ09OTiogYWNsX2dldF9jb25uZWN0aW9uX2Zyb21fYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9hZGRyZXNzKGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKLX0KLXRBQ0xfQ09OTiogYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci19Ci10QlRNX1NUQVRVUyBCVE1fR2V0TGlua1N1cGVyVG91dChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX0dldExpbmtTdXBlclRvdXQocmVtb3RlX2JkYSwgcF90aW1lb3V0KTsKLX0KLXRCVE1fU1RBVFVTIEJUTV9HZXRSb2xlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyLCB0SENJX1JPTEUqIHBfcm9sZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX0dldFJvbGUocmVtb3RlX2JkX2FkZHIsIHBfcm9sZSk7Ci19Ci10QlRNX1NUQVRVUyBCVE1fUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX1JlYWRGYWlsZWRDb250YWN0Q291bnRlcihyZW1vdGVfYmRhLCBwX2NiKTsKLX0KLXRCVE1fU1RBVFVTIEJUTV9SZWFkUlNTSShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkUlNTSShyZW1vdGVfYmRhLCBwX2NiKTsKLX0KLXRCVE1fU1RBVFVTIEJUTV9SZWFkVHhQb3dlcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9SZWFkVHhQb3dlcihyZW1vdGVfYmRhLCB0cmFuc3BvcnQsIHBfY2IpOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldExpbmtTdXBlclRvdXQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9TZXRMaW5rU3VwZXJUb3V0KHJlbW90ZV9iZGEsIHRpbWVvdXQpOwotfQotdEJUTV9TVEFUVVMgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9Td2l0Y2hSb2xlVG9DZW50cmFsKHJlbW90ZV9iZF9hZGRyKTsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9yZW1vdmVfYWNsKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVtb3ZlX2FjbChiZF9hZGRyLCB0cmFuc3BvcnQpOwotfQotdEhDSV9SRUFTT04gYnRtX2dldF9hY2xfZGlzY19yZWFzb25fY29kZSh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlKCk7Ci19Ci11aW50MTZfdCBCVE1fR2V0SENJQ29ubkhhbmRsZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9HZXRIQ0lDb25uSGFuZGxlKHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci19Ci11aW50MTZfdCBCVE1fR2V0TWF4UGFja2V0U2l6ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fR2V0TWF4UGFja2V0U2l6ZShhZGRyKTsKLX0KLXVpbnQxNl90IEJUTV9HZXROdW1BY2xMaW5rcyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fR2V0TnVtQWNsTGlua3MoKTsKLX0KLXVpbnQxNl90IGFjbF9nZXRfc3VwcG9ydGVkX3BhY2tldF90eXBlcygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9nZXRfc3VwcG9ydGVkX3BhY2tldF90eXBlcygpOwotfQotdWludDhfdCBCVE1fR2V0UGVlclNDQShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX0dldFBlZXJTQ0EocmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLX0KLXVpbnQ4X3QgQlRNX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9TZXRUcmFjZUxldmVsKG5ld19sZXZlbCk7Ci19Ci11aW50OF90IGFjbF9saW5rX3JvbGVfZnJvbV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfbGlua19yb2xlX2Zyb21faGFuZGxlKGhhbmRsZSk7Ci19Ci11aW50OF90IGJ0bV9oYW5kbGVfdG9fYWNsX2luZGV4KHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9oYW5kbGVfdG9fYWNsX2luZGV4KGhjaV9oYW5kbGUpOwotfQotdWludDhfdCogQlRNX1JlYWRSZW1vdGVGZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fUmVhZFJlbW90ZUZlYXR1cmVzKGFkZHIpOwotfQotdm9pZCBBQ0xfUmVnaXN0ZXJDbGllbnQoc3RydWN0IGFjbF9jbGllbnRfY2FsbGJhY2tfcyogY2FsbGJhY2tzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkFDTF9SZWdpc3RlckNsaWVudChjYWxsYmFja3MpOwotfQotdm9pZCBBQ0xfVW5yZWdpc3RlckNsaWVudChzdHJ1Y3QgYWNsX2NsaWVudF9jYWxsYmFja19zKiBjYWxsYmFja3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QUNMX1VucmVnaXN0ZXJDbGllbnQoY2FsbGJhY2tzKTsKLX0KLXZvaWQgQlRNX1JlYWRDb25uZWN0aW9uQWRkcihjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MmIGxvY2FsX2Nvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX1JlYWRDb25uZWN0aW9uQWRkcihyZW1vdGVfYmRhLCBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FkZHJfdHlwZSk7Ci19Ci12b2lkIEJUTV9SZXF1ZXN0UGVlclNDQShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fUmVxdWVzdFBlZXJTQ0EocmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLX0KLXZvaWQgQlRNX2FjbF9hZnRlcl9jb250cm9sbGVyX3N0YXJ0ZWQoY29uc3QgY29udHJvbGxlcl90KiBjb250cm9sbGVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkJUTV9hY2xfYWZ0ZXJfY29udHJvbGxlcl9zdGFydGVkKGNvbnRyb2xsZXIpOwotfQotdm9pZCBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKHBlZXJfYWRkcik7Ci19Ci12b2lkIEJUTV9ibG9ja19zbmlmZl9tb2RlX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX2Jsb2NrX3NuaWZmX21vZGVfZm9yKHBlZXJfYWRkcik7Ci19Ci12b2lkIEJUTV9kZWZhdWx0X2Jsb2NrX3JvbGVfc3dpdGNoKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fZGVmYXVsdF9ibG9ja19yb2xlX3N3aXRjaCgpOwotfQotdm9pZCBCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoKCk7Ci19Ci12b2lkIEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2Zvcihjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6QlRNX3VuYmxvY2tfcm9sZV9zd2l0Y2hfZm9yKHBlZXJfYWRkcik7Ci19Ci12b2lkIEJUTV91bmJsb2NrX3NuaWZmX21vZGVfZm9yKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpCVE1fdW5ibG9ja19zbmlmZl9tb2RlX2ZvcihwZWVyX2FkZHIpOwotfQotdm9pZCBIQUNLX2FjbF9jaGVja19zbTQodEJUTV9TRUNfREVWX1JFQyYgcmVjb3JkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OkhBQ0tfYWNsX2NoZWNrX3NtNChyZWNvcmQpOwotfQotdm9pZCBhY2xfYWNjZXB0X2Nvbm5lY3Rpb25fcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJvbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX2FjY2VwdF9jb25uZWN0aW9uX3JlcXVlc3QoYmRfYWRkciwgcm9sZSk7Ci19Ci12b2lkIGFjbF9kaXNjb25uZWN0X2FmdGVyX3JvbGVfc3dpdGNoKHVpbnQxNl90IGNvbm5faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyByZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YWNsX2Rpc2Nvbm5lY3RfYWZ0ZXJfcm9sZV9zd2l0Y2goY29ubl9oYW5kbGUsIHJlYXNvbik7Ci19Ci12b2lkIGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlKGhhbmRsZSwgcmVhc29uKTsKLX0KLXZvaWQgYWNsX2xpbmtfc2VnbWVudHNfeG1pdHRlZChCVF9IRFIqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQocF9tc2cpOwotfQotdm9pZCBhY2xfcGFja2V0c19jb21wbGV0ZWQodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9wYWNrZXRzX2NvbXBsZXRlZChoYW5kbGUsIGNyZWRpdHMpOwotfQotdm9pZCBhY2xfcHJvY2Vzc19leHRlbmRlZF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgY3VycmVudF9wYWdlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfcGFnZV9udW1iZXIsIHVpbnQ2NF90IGZlYXR1cmVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9wcm9jZXNzX2V4dGVuZGVkX2ZlYXR1cmVzKAotICAgICAgaGFuZGxlLCBjdXJyZW50X3BhZ2VfbnVtYmVyLCBtYXhfcGFnZV9udW1iZXIsIGZlYXR1cmVzKTsKLX0KLXZvaWQgYWNsX3Byb2Nlc3NfbnVtX2NvbXBsZXRlZF9wa3RzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfcHJvY2Vzc19udW1fY29tcGxldGVkX3BrdHMocCwgZXZ0X2xlbik7Ci19Ci12b2lkIGFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ2NF90IGZlYXR1cmVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlcyhoYW5kbGUsIGZlYXR1cmVzKTsKLX0KLXZvaWQgYWNsX3Jjdl9hY2xfZGF0YShCVF9IRFIqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmFjbF9yY3ZfYWNsX2RhdGEocF9tc2cpOwotfQotdm9pZCBhY2xfcmVqZWN0X2Nvbm5lY3Rpb25fcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfcmVqZWN0X2Nvbm5lY3Rpb25fcmVxdWVzdChiZF9hZGRyLCByZWFzb24pOwotfQotdm9pZCBhY2xfc2VuZF9kYXRhX3BhY2tldF9ibGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfc2VuZF9kYXRhX3BhY2tldF9ibGUoYmRfYWRkciwgcF9idWYpOwotfQotdm9pZCBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKHRIQ0lfU1RBVFVTIGFjbF9kaXNjX3JlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uKGFjbF9kaXNjX3JlYXNvbik7Ci19Ci12b2lkIGFjbF93cml0ZV9hdXRvbWF0aWNfZmx1c2hfdGltZW91dChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmx1c2hfdGltZW91dF9pbl90aWNrcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjphY2xfd3JpdGVfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXQoCi0gICAgICBiZF9hZGRyLCBmbHVzaF90aW1lb3V0X2luX3RpY2tzKTsKLX0KLXZvaWQgYnRtX2FjbF9jb25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDhfdCBlbmNfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX2Nvbm5lY3RlZChiZGEsIGhhbmRsZSwgc3RhdHVzLCBlbmNfbW9kZSk7Ci19Ci12b2lkIGJ0bV9hY2xfY29ubmVjdGlvbl9yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDhfdCogZGMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF9jb25uZWN0aW9uX3JlcXVlc3QoYmRhLCBkYyk7Ci19Ci12b2lkIGJ0bV9hY2xfY3JlYXRlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhjaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbGlua19yb2xlLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX2NyZWF0ZWQoYmRhLCBoY2lfaGFuZGxlLCBsaW5rX3JvbGUsIHRyYW5zcG9ydCk7Ci19Ci12b2lkIGJ0bV9hY2xfZGV2aWNlX2Rvd24odm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX2RldmljZV9kb3duKCk7Ci19Ci12b2lkIGJ0bV9hY2xfZGlzY29ubmVjdGVkKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF9kaXNjb25uZWN0ZWQoc3RhdHVzLCBoYW5kbGUsIHJlYXNvbik7Ci19Ci12b2lkIGJ0bV9hY2xfaXNvX2Rpc2Nvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUkVBU09OIHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQoaGFuZGxlLCByZWFzb24pOwotfQotdm9pZCBidG1fYWNsX2VuY3J5cHRfY2hhbmdlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNyX2VuYWJsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX2VuY3J5cHRfY2hhbmdlKGhhbmRsZSwgc3RhdHVzLCBlbmNyX2VuYWJsZSk7Ci19Ci12b2lkIGJ0bV9hY2xfbm90aWZfY29ubl9jb2xsaXNpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9hY2xfbm90aWZfY29ubl9jb2xsaXNpb24oYmRhKTsKLX0KLXZvaWQgYnRtX2FjbF9wYWdpbmcoQlRfSERSKiBwLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF9wYWdpbmcocCwgYmRhKTsKLX0KLXZvaWQgYnRtX2FjbF9wcm9jZXNzX3NjYV9jbXBsX3BrdCh1aW50OF90IGxlbiwgdWludDhfdCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX3Byb2Nlc3Nfc2NhX2NtcGxfcGt0KGxlbiwgZGF0YSk7Ci19Ci12b2lkIGJ0bV9hY2xfcmVtb3ZlZCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF9yZW1vdmVkKGhhbmRsZSk7Ci19Ci12b2lkIGJ0bV9hY2xfcmVzZXRfcGFnaW5nKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF9yZXNldF9wYWdpbmcoKTsKLX0KLXZvaWQgYnRtX2FjbF9yZXN1Ym1pdF9wYWdlKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF9yZXN1Ym1pdF9wYWdlKCk7Ci19Ci12b2lkIGJ0bV9hY2xfcm9sZV9jaGFuZ2VkKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSBuZXdfcm9sZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fYWNsX3JvbGVfY2hhbmdlZChoY2lfc3RhdHVzLCBiZF9hZGRyLCBuZXdfcm9sZSk7Ci19Ci12b2lkIGJ0bV9hY2xfc2V0X3BhZ2luZyhib29sIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9hY2xfc2V0X3BhZ2luZyh2YWx1ZSk7Ci19Ci12b2lkIGJ0bV9hY2xfdXBkYXRlX2Nvbm5fYWRkcih1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2FjbF91cGRhdGVfY29ubl9hZGRyKGhhbmRsZSwgYWRkcmVzcyk7Ci19Ci12b2lkIGJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzKHVpbnQ4X3Qgc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzKHN0YXR1cyk7Ci19Ci12b2lkIGJ0bV9ibGVfcmVmcmVzaF9sb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9ibGVfcmVmcmVzaF9sb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICAgIHBzZXVkb19hZGRyLCBsb2NhbF9ycGEpOwotfQotdm9pZCBidG1fY29udF9yc3dpdGNoX2Zyb21faGFuZGxlKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX2NvbnRfcnN3aXRjaF9mcm9tX2hhbmRsZShoY2lfaGFuZGxlKTsKLX0KLXZvaWQgYnRtX2VzdGFibGlzaF9jb250aW51ZV9mcm9tX2FkZHJlc3MoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fZXN0YWJsaXNoX2NvbnRpbnVlX2Zyb21fYWRkcmVzcyhiZGEsIHRyYW5zcG9ydCk7Ci19Ci12b2lkIGJ0bV9wcm9jZXNzX3JlbW90ZV9leHRfZmVhdHVyZXModEFDTF9DT05OKiBwX2FjbF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9wYWdlX251bWJlcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcHJvY2Vzc19yZW1vdGVfZXh0X2ZlYXR1cmVzKHBfYWNsX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3BhZ2VfbnVtYmVyKTsKLX0KLXZvaWQgYnRtX3Byb2Nlc3NfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsbXBfc3VidmVyc2lvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcHJvY2Vzc19yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZSgKLSAgICAgIHN0YXR1cywgaGFuZGxlLCBsbXBfdmVyc2lvbiwgbWFudWZhY3R1cmVyLCBsbXBfc3VidmVyc2lvbik7Ci19Ci12b2lkIGJ0bV9yZWFkX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0X2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUocCk7Ci19Ci12b2lkIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX2NvbXBsZXRlKHApOwotfQotdm9pZCBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQoZGF0YSk7Ci19Ci12b2lkIGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSh1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZShwKTsKLX0KLXZvaWQgYnRtX3JlYWRfbGlua19xdWFsaXR5X3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dChkYXRhKTsKLX0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW1iZXIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyhoYW5kbGUsIHBhZ2VfbnVtYmVyKTsKLX0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXhfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBmZWF0dXJlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2NvbXBsZXRlKAotICAgICAgaGFuZGxlLCBwYWdlX251bSwgbWF4X3BhZ2UsIGZlYXR1cmVzKTsKLX0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZV9yYXcodWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGVfcmF3KHAsIGV2dF9sZW4pOwotfQotdm9pZCBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZCh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfZmFpbGVkKHN0YXR1cywgaGFuZGxlKTsKLX0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCogZmVhdHVyZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlKGhhbmRsZSwgZmVhdHVyZXMpOwotfQotdm9pZCBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGVfcmF3KHVpbnQ4X3QqIHApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlX3JhdyhwKTsKLX0KLXZvaWQgYnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbG1wX3N1YnZlcnNpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUoCi0gICAgICBzdGF0dXMsIGhhbmRsZSwgbG1wX3ZlcnNpb24sIG1hbnVmYWN0dXJlciwgbG1wX3N1YnZlcnNpb24pOwotfQotdm9pZCBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZV9yYXcodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZV9yYXcocCk7Ci19Ci12b2lkIGJ0bV9yZWFkX3Jzc2lfY29tcGxldGUodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9yc3NpX2NvbXBsZXRlKHApOwotfQotdm9pZCBidG1fcmVhZF9yc3NpX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF9yc3NpX3RpbWVvdXQoZGF0YSk7Ci19Ci12b2lkIGJ0bV9yZWFkX3R4X3Bvd2VyX2NvbXBsZXRlKHVpbnQ4X3QqIHAsIGJvb2wgaXNfYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9yZWFkX3R4X3Bvd2VyX2NvbXBsZXRlKHAsIGlzX2JsZSk7Ci19Ci12b2lkIGJ0bV9yZWFkX3R4X3Bvd2VyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVhZF90eF9wb3dlcl90aW1lb3V0KGRhdGEpOwotfQotdm9pZCBidG1fcmVqZWN0bGlzdF9yb2xlX2NoYW5nZV9kZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGNpX3N0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpidG1fcmVqZWN0bGlzdF9yb2xlX2NoYW5nZV9kZXZpY2UoYmRfYWRkciwgaGNpX3N0YXR1cyk7Ci19Ci12b2lkIGJ0bV9zZXRfbGlua19wb2xpY3kodEFDTF9DT05OKiBjb25uLCB0TElOS19QT0xJQ1kgcG9saWN5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2w6OmJ0bV9zZXRfbGlua19wb2xpY3koY29ubiwgcG9saWN5KTsKLX0KLXZvaWQgYnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwa3RfdHlwZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6YnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzKGJkX2FkZHIsIHBrdF90eXBlcyk7Ci19Ci12b2lkIGhjaV9idG1fc2V0X2xpbmtfc3VwZXJ2aXNpb25fdGltZW91dCh0QUNMX0NPTk4mIGxpbmssIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbDo6aGNpX2J0bV9zZXRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0KGxpbmssIHRpbWVvdXQpOwotfQotdm9pZCBvbl9hY2xfYnJfZWRyX2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpvbl9hY2xfYnJfZWRyX2Nvbm5lY3RlZChiZGEsIGhhbmRsZSwgZW5jX21vZGUpOwotfQotdm9pZCBvbl9hY2xfYnJfZWRyX2ZhaWxlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsOjpvbl9hY2xfYnJfZWRyX2ZhaWxlZChiZGEsIHN0YXR1cyk7Ci19Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19hY2wuaCBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2FjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFmZTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2FjbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTI1Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIuMQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgInN0YWNrL2FjbC9hY2wuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX2FjbCB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBBQ0xfU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBBQ0xfU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyByZXR1cm4gYm9keShiZF9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEFDTF9TdXBwb3J0VHJhbnNwYXJlbnRTeW5jaHJvbm91c0RhdGEKLSAgICBBQ0xfU3VwcG9ydFRyYW5zcGFyZW50U3luY2hyb25vdXNEYXRhOwotLy8gTmFtZTogQlRNX0JMRV9JU19SRVNPTFZFX0JEQQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiB4Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgQlRNX0JMRV9JU19SRVNPTFZFX0JEQSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiB4KT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHgpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHgpIHsgcmV0dXJuIGJvZHkoeCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fQkxFX0lTX1JFU09MVkVfQkRBIEJUTV9CTEVfSVNfUkVTT0xWRV9CREE7Ci0vLyBOYW1lOiBCVE1fSXNBY2xDb25uZWN0aW9uVXAKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBCVE1fSXNBY2xDb25uZWN0aW9uVXAgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9Jc0FjbENvbm5lY3Rpb25VcCBCVE1fSXNBY2xDb25uZWN0aW9uVXA7Ci0vLyBOYW1lOiBCVE1fSXNBY2xDb25uZWN0aW9uVXBBbmRIYW5kbGVWYWxpZAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEJUTV9Jc0FjbENvbm5lY3Rpb25VcEFuZEhhbmRsZVZhbGlkIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIHJldHVybiBib2R5KHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fSXNBY2xDb25uZWN0aW9uVXBBbmRIYW5kbGVWYWxpZAotICAgIEJUTV9Jc0FjbENvbm5lY3Rpb25VcEFuZEhhbmRsZVZhbGlkOwotLy8gTmFtZTogQlRNX0lzQWNsQ29ubmVjdGlvblVwRnJvbUhhbmRsZQotLy8gUGFyYW1zOiB1aW50MTZfdCBoY2lfaGFuZGxlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgQlRNX0lzQWNsQ29ubmVjdGlvblVwRnJvbUhhbmRsZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBoY2lfaGFuZGxlKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsgcmV0dXJuIGJvZHkoaGNpX2hhbmRsZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fSXNBY2xDb25uZWN0aW9uVXBGcm9tSGFuZGxlIEJUTV9Jc0FjbENvbm5lY3Rpb25VcEZyb21IYW5kbGU7Ci0vLyBOYW1lOiBCVE1fSXNCbGVDb25uZWN0aW9uCi0vLyBQYXJhbXM6IHVpbnQxNl90IGhjaV9oYW5kbGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBCVE1fSXNCbGVDb25uZWN0aW9uIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGhjaV9oYW5kbGUpPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGNpX2hhbmRsZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgaGNpX2hhbmRsZSkgeyByZXR1cm4gYm9keShoY2lfaGFuZGxlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9Jc0JsZUNvbm5lY3Rpb24gQlRNX0lzQmxlQ29ubmVjdGlvbjsKLS8vIE5hbWU6IEJUTV9Jc1BoeTJtU3VwcG9ydGVkCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgQlRNX0lzUGh5Mm1TdXBwb3J0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtb3RlX2JkYSwgdHJhbnNwb3J0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9Jc1BoeTJtU3VwcG9ydGVkIEJUTV9Jc1BoeTJtU3VwcG9ydGVkOwotLy8gTmFtZTogQlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotLy8gdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgQlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkciB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgUmF3QWRkcmVzcyYgY29ubl9hZGRyLAotICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7Ci0gICAgcmV0dXJuIGJvZHkocHNldWRvX2FkZHIsIGNvbm5fYWRkciwgcF9hZGRyX3R5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX1JlYWRSZW1vdGVDb25uZWN0aW9uQWRkciBCVE1fUmVhZFJlbW90ZUNvbm5lY3Rpb25BZGRyOwotLy8gTmFtZTogQlRNX1JlYWRSZW1vdGVWZXJzaW9uCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsIHVpbnQ4X3QqIGxtcF92ZXJzaW9uLCB1aW50MTZfdCoKLS8vIG1hbnVmYWN0dXJlciwgdWludDE2X3QqIGxtcF9zdWJfdmVyc2lvbgotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEJUTV9SZWFkUmVtb3RlVmVyc2lvbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBtYW51ZmFjdHVyZXIsIHVpbnQxNl90KiBsbXBfc3ViX3ZlcnNpb24pPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyLCB1aW50OF90KiBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgdWludDE2X3QqIG1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgdWludDE2X3QqIGxtcF9zdWJfdmVyc2lvbikgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDhfdCogbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCogbWFudWZhY3R1cmVyLCB1aW50MTZfdCogbG1wX3N1Yl92ZXJzaW9uKSB7Ci0gICAgcmV0dXJuIGJvZHkoYWRkciwgbG1wX3ZlcnNpb24sIG1hbnVmYWN0dXJlciwgbG1wX3N1Yl92ZXJzaW9uKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9SZWFkUmVtb3RlVmVyc2lvbiBCVE1fUmVhZFJlbW90ZVZlcnNpb247Ci0vLyBOYW1lOiBCVE1faXNfc25pZmZfYWxsb3dlZF9mb3IKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgQlRNX2lzX3NuaWZmX2FsbG93ZWRfZm9yIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcik+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgeyByZXR1cm4gYm9keShwZWVyX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX2lzX3NuaWZmX2FsbG93ZWRfZm9yIEJUTV9pc19zbmlmZl9hbGxvd2VkX2ZvcjsKLS8vIE5hbWU6IGFjbF9zZW5kX2RhdGFfcGFja2V0X2JyX2VkcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBCVF9IRFIqIHBfYnVmCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYWNsX3NlbmRfZGF0YV9wYWNrZXRfYnJfZWRyIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIEJUX0hEUiogcF9idWYpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgQlRfSERSKiBwX2J1Zikge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgQlRfSERSKiBwX2J1ZikgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHBfYnVmKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9zZW5kX2RhdGFfcGFja2V0X2JyX2VkciBhY2xfc2VuZF9kYXRhX3BhY2tldF9icl9lZHI7Ci0vLyBOYW1lOiBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb24KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgcmV0dXJuIGJvZHkoYmRfYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfY3JlYXRlX2xlX2Nvbm5lY3Rpb24gYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uOwotLy8gTmFtZTogYWNsX2NyZWF0ZV9sZV9jb25uZWN0aW9uX3dpdGhfaWQKLS8vIFBhcmFtczogdWludDhfdCBpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbl93aXRoX2lkIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQ4X3QgaWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpPiBib2R5ewotICAgICAgW10odWludDhfdCBpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDhfdCBpZCwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICAgIHJldHVybiBib2R5KGlkLCBiZF9hZGRyKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbl93aXRoX2lkIGFjbF9jcmVhdGVfbGVfY29ubmVjdGlvbl93aXRoX2lkOwotLy8gTmFtZTogYWNsX2lzX3JvbGVfc3dpdGNoX2FsbG93ZWQKLS8vIFBhcmFtczoKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBhY2xfaXNfcm9sZV9zd2l0Y2hfYWxsb3dlZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBib2R5e1tdKCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfaXNfcm9sZV9zd2l0Y2hfYWxsb3dlZCBhY2xfaXNfcm9sZV9zd2l0Y2hfYWxsb3dlZDsKLS8vIE5hbWU6IGFjbF9pc19zd2l0Y2hfcm9sZV9pZGxlCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYWNsX2lzX3N3aXRjaF9yb2xlX2lkbGUgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRfYWRkciwgdHJhbnNwb3J0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9pc19zd2l0Y2hfcm9sZV9pZGxlIGFjbF9pc19zd2l0Y2hfcm9sZV9pZGxlOwotLy8gTmFtZTogYWNsX3BlZXJfc3VwcG9ydHNfYmxlXzJtX3BoeQotLy8gUGFyYW1zOiB1aW50MTZfdCBoY2lfaGFuZGxlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfYmxlXzJtX3BoeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBoY2lfaGFuZGxlKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGhjaV9oYW5kbGUpIHsgcmV0dXJuIGJvZHkoaGNpX2hhbmRsZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfMm1fcGh5IGFjbF9wZWVyX3N1cHBvcnRzX2JsZV8ybV9waHk7Ci0vLyBOYW1lOiBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29kZWRfcGh5Ci0vLyBQYXJhbXM6IHVpbnQxNl90IGhjaV9oYW5kbGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29kZWRfcGh5IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGhjaV9oYW5kbGUpPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGNpX2hhbmRsZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgaGNpX2hhbmRsZSkgeyByZXR1cm4gYm9keShoY2lfaGFuZGxlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9jb2RlZF9waHkgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX2NvZGVkX3BoeTsKLS8vIE5hbWU6IGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdAotLy8gUGFyYW1zOiAgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGFjbF9wZWVyX3N1cHBvcnRzX2JsZV9jb25uZWN0aW9uX3BhcmFtZXRlcnNfcmVxdWVzdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsgcmV0dXJuIGJvZHkocmVtb3RlX2JkYSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3QKLSAgICBhY2xfcGVlcl9zdXBwb3J0c19ibGVfY29ubmVjdGlvbl9wYXJhbWV0ZXJzX3JlcXVlc3Q7Ci0vLyBOYW1lOiBhY2xfcGVlcl9zdXBwb3J0c19ibGVfcGFja2V0X2V4dGVuc2lvbgotLy8gUGFyYW1zOiB1aW50MTZfdCBoY2lfaGFuZGxlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX3BhY2tldF9leHRlbnNpb24gewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodWludDE2X3QgaGNpX2hhbmRsZSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7IHJldHVybiBib2R5KGhjaV9oYW5kbGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfYmxlX3BhY2tldF9leHRlbnNpb24KLSAgICBhY2xfcGVlcl9zdXBwb3J0c19ibGVfcGFja2V0X2V4dGVuc2lvbjsKLS8vIE5hbWU6IGFjbF9wZWVyX3N1cHBvcnRzX3NuaWZmX3N1YnJhdGluZwotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYWNsX3BlZXJfc3VwcG9ydHNfc25pZmZfc3VicmF0aW5nIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgeyByZXR1cm4gYm9keShyZW1vdGVfYmRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9wZWVyX3N1cHBvcnRzX3NuaWZmX3N1YnJhdGluZwotICAgIGFjbF9wZWVyX3N1cHBvcnRzX3NuaWZmX3N1YnJhdGluZzsKLS8vIE5hbWU6IGFjbF9yZWZyZXNoX3JlbW90ZV9hZGRyZXNzCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGlkZW50aXR5X2FkZHJlc3MsIHRCTEVfQUREUl9UWVBFCi0vLyBpZGVudGl0eV9hZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJMRV9BRERSX1RZUEUgcnJhX3R5cGUsCi0vLyBjb25zdCBSYXdBZGRyZXNzJiBycGEgUmV0dXJuczogYm9vbAotc3RydWN0IGFjbF9yZWZyZXNoX3JlbW90ZV9hZGRyZXNzIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgaWRlbnRpdHlfYWRkcmVzcywgdEJMRV9BRERSX1RZUEUgaWRlbnRpdHlfYWRkcmVzc190eXBlLAotICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QkxFX0FERFJfVFlQRSBycmFfdHlwZSwgY29uc3QgUmF3QWRkcmVzcyYgcnBhKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgaWRlbnRpdHlfYWRkcmVzcywKLSAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgaWRlbnRpdHlfYWRkcmVzc190eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIHJyYV90eXBlLAotICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBycGEpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGlkZW50aXR5X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSBpZGVudGl0eV9hZGRyZXNzX3R5cGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIHJyYV90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBycGEpIHsKLSAgICByZXR1cm4gYm9keShpZGVudGl0eV9hZGRyZXNzLCBpZGVudGl0eV9hZGRyZXNzX3R5cGUsIGJkYSwgcnJhX3R5cGUsIHJwYSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzcyBhY2xfcmVmcmVzaF9yZW1vdGVfYWRkcmVzczsKLS8vIE5hbWU6IGFjbF9zZXRfcGVlcl9sZV9mZWF0dXJlc19mcm9tX2hhbmRsZQotLy8gUGFyYW1zOiB1aW50MTZfdCBoY2lfaGFuZGxlLCBjb25zdCB1aW50OF90KiBwCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYWNsX3NldF9wZWVyX2xlX2ZlYXR1cmVzX2Zyb21faGFuZGxlIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGhjaV9oYW5kbGUsIGNvbnN0IHVpbnQ4X3QqIHApPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGNpX2hhbmRsZSwgY29uc3QgdWludDhfdCogcCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgaGNpX2hhbmRsZSwgY29uc3QgdWludDhfdCogcCkgewotICAgIHJldHVybiBib2R5KGhjaV9oYW5kbGUsIHApOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWNsX3NldF9wZWVyX2xlX2ZlYXR1cmVzX2Zyb21faGFuZGxlCi0gICAgYWNsX3NldF9wZWVyX2xlX2ZlYXR1cmVzX2Zyb21faGFuZGxlOwotLy8gTmFtZTogc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18ybV9waHkKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IHNjb19wZWVyX3N1cHBvcnRzX2VzY29fMm1fcGh5IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgeyByZXR1cm4gYm9keShyZW1vdGVfYmRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNjb19wZWVyX3N1cHBvcnRzX2VzY29fMm1fcGh5IHNjb19wZWVyX3N1cHBvcnRzX2VzY29fMm1fcGh5OwotLy8gTmFtZTogc2NvX3BlZXJfc3VwcG9ydHNfZXNjb18zbV9waHkKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IHNjb19wZWVyX3N1cHBvcnRzX2VzY29fM21fcGh5IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgeyByZXR1cm4gYm9keShyZW1vdGVfYmRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNjb19wZWVyX3N1cHBvcnRzX2VzY29fM21fcGh5IHNjb19wZWVyX3N1cHBvcnRzX2VzY29fM21fcGh5OwotLy8gTmFtZTogYWNsX2NyZWF0ZV9jbGFzc2ljX2Nvbm5lY3Rpb24KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCB0aGVyZV9hcmVfaGlnaF9wcmlvcml0eV9jaGFubmVscywKLS8vIGJvb2wgaXNfYm9uZGluZyBSZXR1cm5zOiBjb25zdGV4cHIgdWludDE2X3Qga0RlZmF1bHRQYWNrZXRUeXBlcyA9Ci0vLyBIQ0lfUEtUX1RZUEVTX01BU0tfRE0xIHwgSENJX1BLVF9UWVBFU19NQVNLX0RIMSB8IEhDSV9QS1RfVFlQRVNfTUFTS19ETTMgfAotLy8gSENJX1BLVF9UWVBFU19NQVNLX0RIMyB8IEhDSV9QS1RfVFlQRVNfTUFTS19ETTUgfCBIQ0lfUEtUX1RZUEVTX01BU0tfREg1OwotLy8gdm9pZAotc3RydWN0IGFjbF9jcmVhdGVfY2xhc3NpY19jb25uZWN0aW9uIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBib29sIHRoZXJlX2FyZV9oaWdoX3ByaW9yaXR5X2NoYW5uZWxzLCBib29sIGlzX2JvbmRpbmcpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIHRoZXJlX2FyZV9oaWdoX3ByaW9yaXR5X2NoYW5uZWxzLAotICAgICAgICAgICAgICBib29sIGlzX2JvbmRpbmcpIHsgcmV0dXJuIDA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgIGJvb2wgdGhlcmVfYXJlX2hpZ2hfcHJpb3JpdHlfY2hhbm5lbHMsIGJvb2wgaXNfYm9uZGluZykgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHRoZXJlX2FyZV9oaWdoX3ByaW9yaXR5X2NoYW5uZWxzLCBpc19ib25kaW5nKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9jcmVhdGVfY2xhc3NpY19jb25uZWN0aW9uIGFjbF9jcmVhdGVfY2xhc3NpY19jb25uZWN0aW9uOwotLy8gTmFtZTogSXNFcHJBdmFpbGFibGUKLS8vIFBhcmFtczogY29uc3QgdEFDTF9DT05OJiBwX2FjbAotLy8gUmV0dXJuczogaW5saW5lIGJvb2wKLXN0cnVjdCBJc0VwckF2YWlsYWJsZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCB0QUNMX0NPTk4mIHBfYWNsKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IHRBQ0xfQ09OTiYgcF9hY2wpIHsgcmV0dXJuIDA7IH19OwotICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHRBQ0xfQ09OTiYgcF9hY2wpIHsgcmV0dXJuIGJvZHkocF9hY2wpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgSXNFcHJBdmFpbGFibGUgSXNFcHJBdmFpbGFibGU7Ci0vLyBOYW1lOiBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9hZGRyZXNzCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiB0QUNMX0NPTk4qCi1zdHJ1Y3QgYWNsX2dldF9jb25uZWN0aW9uX2Zyb21fYWRkcmVzcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEFDTF9DT05OKihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfX07Ci0gIHRBQ0xfQ09OTiogb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9hZGRyZXNzIGFjbF9nZXRfY29ubmVjdGlvbl9mcm9tX2FkZHJlc3M7Ci0vLyBOYW1lOiBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlCi0vLyBSZXR1cm5zOiB0QUNMX0NPTk4qCi1zdHJ1Y3QgYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlIHsKLSAgc3RkOjpmdW5jdGlvbjx0QUNMX0NPTk4qKHVpbnQxNl90IGhhbmRsZSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBoYW5kbGUpIHsgcmV0dXJuIG51bGxwdHI7IH19OwotICB0QUNMX0NPTk4qIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlKSB7IHJldHVybiBib2R5KGhhbmRsZSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfZ2V0X2Nvbm5lY3Rpb25fZnJvbV9oYW5kbGUgYWNsX2dldF9jb25uZWN0aW9uX2Zyb21faGFuZGxlOwotLy8gTmFtZTogQlRNX0dldExpbmtTdXBlclRvdXQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdWludDE2X3QqIHBfdGltZW91dAotLy8gUmV0dXJuczogdEJUTV9TVEFUVVMKLXN0cnVjdCBCVE1fR2V0TGlua1N1cGVyVG91dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVMoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdWludDE2X3QqIHBfdGltZW91dCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQxNl90KiBwX3RpbWVvdXQpIHsgcmV0dXJuIDA7IH19OwotICB0QlRNX1NUQVRVUyBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQxNl90KiBwX3RpbWVvdXQpIHsKLSAgICByZXR1cm4gYm9keShyZW1vdGVfYmRhLCBwX3RpbWVvdXQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX0dldExpbmtTdXBlclRvdXQgQlRNX0dldExpbmtTdXBlclRvdXQ7Ci0vLyBOYW1lOiBCVE1fR2V0Um9sZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkciwgdEhDSV9ST0xFKiBwX3JvbGUKLS8vIFJldHVybnM6IHRCVE1fU1RBVFVTCi1zdHJ1Y3QgQlRNX0dldFJvbGUgewotICBzdGQ6OmZ1bmN0aW9uPHRCVE1fU1RBVFVTKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSogcF9yb2xlKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsIHRIQ0lfUk9MRSogcF9yb2xlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfX07Ci0gIHRCVE1fU1RBVFVTIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIsIHRIQ0lfUk9MRSogcF9yb2xlKSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtb3RlX2JkX2FkZHIsIHBfcm9sZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fR2V0Um9sZSBCVE1fR2V0Um9sZTsKLS8vIE5hbWU6IEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9DTVBMX0NCKiBwX2NiCi0vLyBSZXR1cm5zOiB0QlRNX1NUQVRVUwotc3RydWN0IEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHRCVE1fU1RBVFVTKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVE1fQ01QTF9DQiogcF9jYik+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVE1fQ01QTF9DQiogcF9jYikgeyByZXR1cm4gMDsgfX07Ci0gIHRCVE1fU1RBVFVTIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9DTVBMX0NCKiBwX2NiKSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtb3RlX2JkYSwgcF9jYik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyIEJUTV9SZWFkRmFpbGVkQ29udGFjdENvdW50ZXI7Ci0vLyBOYW1lOiBCVE1fUmVhZFJTU0kKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9DTVBMX0NCKiBwX2NiCi0vLyBSZXR1cm5zOiB0QlRNX1NUQVRVUwotc3RydWN0IEJUTV9SZWFkUlNTSSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVMoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9DTVBMX0NCKiBwX2NiKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9DTVBMX0NCKiBwX2NiKSB7IHJldHVybiAwOyB9fTsKLSAgdEJUTV9TVEFUVVMgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgICByZXR1cm4gYm9keShyZW1vdGVfYmRhLCBwX2NiKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9SZWFkUlNTSSBCVE1fUmVhZFJTU0k7Ci0vLyBOYW1lOiBCVE1fUmVhZFR4UG93ZXIKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0vLyB0QlRNX0NNUExfQ0IqIHBfY2IgUmV0dXJuczogdEJUTV9TVEFUVVMKLXN0cnVjdCBCVE1fUmVhZFR4UG93ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHRCVE1fU1RBVFVTKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHRCVE1fQ01QTF9DQiogcF9jYik+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICB0QlRNX0NNUExfQ0IqIHBfY2IpIHsgcmV0dXJuIEJUX1RSQU5TUE9SVF9CUl9FRFI7IH19OwotICB0QlRNX1NUQVRVUyBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYikgewotICAgIHJldHVybiBib2R5KHJlbW90ZV9iZGEsIHRyYW5zcG9ydCwgcF9jYik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fUmVhZFR4UG93ZXIgQlRNX1JlYWRUeFBvd2VyOwotLy8gTmFtZTogQlRNX1NldExpbmtTdXBlclRvdXQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdWludDE2X3QgdGltZW91dAotLy8gUmV0dXJuczogdEJUTV9TVEFUVVMKLXN0cnVjdCBCVE1fU2V0TGlua1N1cGVyVG91dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVMoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdWludDE2X3QgdGltZW91dCk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQxNl90IHRpbWVvdXQpIHsgcmV0dXJuIDA7IH19OwotICB0QlRNX1NUQVRVUyBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgICByZXR1cm4gYm9keShyZW1vdGVfYmRhLCB0aW1lb3V0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9TZXRMaW5rU3VwZXJUb3V0IEJUTV9TZXRMaW5rU3VwZXJUb3V0OwotLy8gTmFtZTogQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkX2FkZHIKLS8vIFJldHVybnM6IHRCVE1fU1RBVFVTCi1zdHJ1Y3QgQlRNX1N3aXRjaFJvbGVUb0NlbnRyYWwgewotICBzdGQ6OmZ1bmN0aW9uPHRCVE1fU1RBVFVTKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZF9hZGRyKSB7IHJldHVybiAwOyB9fTsKLSAgdEJUTV9TVEFUVVMgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRfYWRkcikgewotICAgIHJldHVybiBib2R5KHJlbW90ZV9iZF9hZGRyKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9Td2l0Y2hSb2xlVG9DZW50cmFsIEJUTV9Td2l0Y2hSb2xlVG9DZW50cmFsOwotLy8gTmFtZTogYnRtX3JlbW92ZV9hY2wKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQKLS8vIFJldHVybnM6IHRCVE1fU1RBVFVTCi1zdHJ1Y3QgYnRtX3JlbW92ZV9hY2wgewotICBzdGQ6OmZ1bmN0aW9uPHRCVE1fU1RBVFVTKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICAgICAgcmV0dXJuIEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0gICAgICB9fTsKLSAgdEJUTV9TVEFUVVMgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHRyYW5zcG9ydCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fcmVtb3ZlX2FjbCBidG1fcmVtb3ZlX2FjbDsKLS8vIE5hbWU6IGJ0bV9nZXRfYWNsX2Rpc2NfcmVhc29uX2NvZGUKLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuczogdEhDSV9SRUFTT04KLXN0cnVjdCBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlIHsKLSAgc3RkOjpmdW5jdGlvbjx0SENJX1JFQVNPTih2b2lkKT4gYm9keXtbXSh2b2lkKSB7IHJldHVybiBIQ0lfU1VDQ0VTUzsgfX07Ci0gIHRIQ0lfUkVBU09OIG9wZXJhdG9yKCkodm9pZCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2dldF9hY2xfZGlzY19yZWFzb25fY29kZSBidG1fZ2V0X2FjbF9kaXNjX3JlYXNvbl9jb2RlOwotLy8gTmFtZTogQlRNX0dldEhDSUNvbm5IYW5kbGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgQlRNX0dldEhDSUNvbm5IYW5kbGUgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICAgICAgcmV0dXJuIEJUX1RSQU5TUE9SVF9CUl9FRFI7Ci0gICAgICB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIHJldHVybiBib2R5KHJlbW90ZV9iZGEsIHRyYW5zcG9ydCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fR2V0SENJQ29ubkhhbmRsZSBCVE1fR2V0SENJQ29ubkhhbmRsZTsKLS8vIE5hbWU6IEJUTV9HZXRNYXhQYWNrZXRTaXplCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgQlRNX0dldE1heFBhY2tldFNpemUgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYWRkcikgeyByZXR1cm4gYm9keShhZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9HZXRNYXhQYWNrZXRTaXplIEJUTV9HZXRNYXhQYWNrZXRTaXplOwotLy8gTmFtZTogQlRNX0dldE51bUFjbExpbmtzCi0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgQlRNX0dldE51bUFjbExpbmtzIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50MTZfdCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fR2V0TnVtQWNsTGlua3MgQlRNX0dldE51bUFjbExpbmtzOwotLy8gTmFtZTogYWNsX2dldF9zdXBwb3J0ZWRfcGFja2V0X3R5cGVzCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IGFjbF9nZXRfc3VwcG9ydGVkX3BhY2tldF90eXBlcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDE2X3QoKT4gYm9keXtbXSgpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWNsX2dldF9zdXBwb3J0ZWRfcGFja2V0X3R5cGVzIGFjbF9nZXRfc3VwcG9ydGVkX3BhY2tldF90eXBlczsKLS8vIE5hbWU6IEJUTV9HZXRQZWVyU0NBCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiB1aW50OF90Ci1zdHJ1Y3QgQlRNX0dldFBlZXJTQ0EgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgICAgICByZXR1cm4gQlRfVFJBTlNQT1JUX0JSX0VEUjsKLSAgICAgIH19OwotICB1aW50OF90IG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICByZXR1cm4gYm9keShyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX0dldFBlZXJTQ0EgQlRNX0dldFBlZXJTQ0E7Ci0vLyBOYW1lOiBCVE1fU2V0VHJhY2VMZXZlbAotLy8gUGFyYW1zOiB1aW50OF90IG5ld19sZXZlbAotLy8gUmV0dXJuczogdWludDhfdAotc3RydWN0IEJUTV9TZXRUcmFjZUxldmVsIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50OF90KHVpbnQ4X3QgbmV3X2xldmVsKT4gYm9keXsKLSAgICAgIFtdKHVpbnQ4X3QgbmV3X2xldmVsKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQ4X3QgbmV3X2xldmVsKSB7IHJldHVybiBib2R5KG5ld19sZXZlbCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fU2V0VHJhY2VMZXZlbCBCVE1fU2V0VHJhY2VMZXZlbDsKLS8vIE5hbWU6IGFjbF9saW5rX3JvbGVfZnJvbV9oYW5kbGUKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlCi0vLyBSZXR1cm5zOiB1aW50OF90Ci1zdHJ1Y3QgYWNsX2xpbmtfcm9sZV9mcm9tX2hhbmRsZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDhfdCh1aW50MTZfdCBoYW5kbGUpPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGFuZGxlKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSkgeyByZXR1cm4gYm9keShoYW5kbGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWNsX2xpbmtfcm9sZV9mcm9tX2hhbmRsZSBhY2xfbGlua19yb2xlX2Zyb21faGFuZGxlOwotLy8gTmFtZTogYnRtX2hhbmRsZV90b19hY2xfaW5kZXgKLS8vIFBhcmFtczogdWludDE2X3QgaGNpX2hhbmRsZQotLy8gUmV0dXJuczogdWludDhfdAotc3RydWN0IGJ0bV9oYW5kbGVfdG9fYWNsX2luZGV4IHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50OF90KHVpbnQxNl90IGhjaV9oYW5kbGUpPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGNpX2hhbmRsZSkgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQ4X3Qgb3BlcmF0b3IoKSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7IHJldHVybiBib2R5KGhjaV9oYW5kbGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2hhbmRsZV90b19hY2xfaW5kZXggYnRtX2hhbmRsZV90b19hY2xfaW5kZXg7Ci0vLyBOYW1lOiBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIKLS8vIFJldHVybnM6IHVpbnQ4X3QqCi1zdHJ1Y3QgQlRNX1JlYWRSZW1vdGVGZWF0dXJlcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDhfdCooY29uc3QgUmF3QWRkcmVzcyYgYWRkcik+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7IHJldHVybiBudWxscHRyOyB9fTsKLSAgdWludDhfdCogb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7IHJldHVybiBib2R5KGFkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX1JlYWRSZW1vdGVGZWF0dXJlcyBCVE1fUmVhZFJlbW90ZUZlYXR1cmVzOwotLy8gTmFtZTogQUNMX1JlZ2lzdGVyQ2xpZW50Ci0vLyBQYXJhbXM6IHN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MqIGNhbGxiYWNrcwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEFDTF9SZWdpc3RlckNsaWVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzdHJ1Y3QgYWNsX2NsaWVudF9jYWxsYmFja19zKiBjYWxsYmFja3MpPiBib2R5ewotICAgICAgW10oc3RydWN0IGFjbF9jbGllbnRfY2FsbGJhY2tfcyogY2FsbGJhY2tzKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShzdHJ1Y3QgYWNsX2NsaWVudF9jYWxsYmFja19zKiBjYWxsYmFja3MpIHsgYm9keShjYWxsYmFja3MpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQUNMX1JlZ2lzdGVyQ2xpZW50IEFDTF9SZWdpc3RlckNsaWVudDsKLS8vIE5hbWU6IEFDTF9VbnJlZ2lzdGVyQ2xpZW50Ci0vLyBQYXJhbXM6IHN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MqIGNhbGxiYWNrcwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEFDTF9VbnJlZ2lzdGVyQ2xpZW50IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MqIGNhbGxiYWNrcyk+IGJvZHl7Ci0gICAgICBbXShzdHJ1Y3QgYWNsX2NsaWVudF9jYWxsYmFja19zKiBjYWxsYmFja3MpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHN0cnVjdCBhY2xfY2xpZW50X2NhbGxiYWNrX3MqIGNhbGxiYWNrcykgeyBib2R5KGNhbGxiYWNrcyk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBBQ0xfVW5yZWdpc3RlckNsaWVudCBBQ0xfVW5yZWdpc3RlckNsaWVudDsKLS8vIE5hbWU6IEJUTV9SZWFkQ29ubmVjdGlvbkFkZHIKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgUmF3QWRkcmVzcyYgbG9jYWxfY29ubl9hZGRyLAotLy8gdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlIFJldHVybnM6IHZvaWQKLXN0cnVjdCBCVE1fUmVhZENvbm5lY3Rpb25BZGRyIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIFJhd0FkZHJlc3MmIGxvY2FsX2Nvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIFJhd0FkZHJlc3MmIGxvY2FsX2Nvbm5fYWRkciwKLSAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUqIHBfYWRkcl90eXBlKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCBSYXdBZGRyZXNzJiBsb2NhbF9jb25uX2FkZHIsCi0gICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9hZGRyX3R5cGUpIHsKLSAgICBib2R5KHJlbW90ZV9iZGEsIGxvY2FsX2Nvbm5fYWRkciwgcF9hZGRyX3R5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX1JlYWRDb25uZWN0aW9uQWRkciBCVE1fUmVhZENvbm5lY3Rpb25BZGRyOwotLy8gTmFtZTogQlRNX1JlcXVlc3RQZWVyU0NBCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgQlRNX1JlcXVlc3RQZWVyU0NBIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgYm9keShyZW1vdGVfYmRhLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX1JlcXVlc3RQZWVyU0NBIEJUTV9SZXF1ZXN0UGVlclNDQTsKLS8vIE5hbWU6IEJUTV9hY2xfYWZ0ZXJfY29udHJvbGxlcl9zdGFydGVkCi0vLyBQYXJhbXM6IGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEJUTV9hY2xfYWZ0ZXJfY29udHJvbGxlcl9zdGFydGVkIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcik+IGJvZHl7Ci0gICAgICBbXShjb25zdCBjb250cm9sbGVyX3QqIGNvbnRyb2xsZXIpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGNvbnRyb2xsZXJfdCogY29udHJvbGxlcikgeyBib2R5KGNvbnRyb2xsZXIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX2FjbF9hZnRlcl9jb250cm9sbGVyX3N0YXJ0ZWQgQlRNX2FjbF9hZnRlcl9jb250cm9sbGVyX3N0YXJ0ZWQ7Ci0vLyBOYW1lOiBCVE1fYmxvY2tfcm9sZV9zd2l0Y2hfZm9yCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEJUTV9ibG9ja19yb2xlX3N3aXRjaF9mb3IgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7IGJvZHkocGVlcl9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9ibG9ja19yb2xlX3N3aXRjaF9mb3IgQlRNX2Jsb2NrX3JvbGVfc3dpdGNoX2ZvcjsKLS8vIE5hbWU6IEJUTV9ibG9ja19zbmlmZl9tb2RlX2ZvcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBCVE1fYmxvY2tfc25pZmZfbW9kZV9mb3IgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7IGJvZHkocGVlcl9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9ibG9ja19zbmlmZl9tb2RlX2ZvciBCVE1fYmxvY2tfc25pZmZfbW9kZV9mb3I7Ci0vLyBOYW1lOiBCVE1fZGVmYXVsdF9ibG9ja19yb2xlX3N3aXRjaAotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEJUTV9kZWZhdWx0X2Jsb2NrX3JvbGVfc3dpdGNoIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGJvZHl7W10oKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX2RlZmF1bHRfYmxvY2tfcm9sZV9zd2l0Y2ggQlRNX2RlZmF1bHRfYmxvY2tfcm9sZV9zd2l0Y2g7Ci0vLyBOYW1lOiBCVE1fZGVmYXVsdF91bmJsb2NrX3JvbGVfc3dpdGNoCi0vLyBQYXJhbXM6Ci0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgQlRNX2RlZmF1bHRfdW5ibG9ja19yb2xlX3N3aXRjaCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBib2R5e1tdKCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9kZWZhdWx0X3VuYmxvY2tfcm9sZV9zd2l0Y2ggQlRNX2RlZmF1bHRfdW5ibG9ja19yb2xlX3N3aXRjaDsKLS8vIE5hbWU6IEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2ZvcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9mb3IgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7IGJvZHkocGVlcl9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV91bmJsb2NrX3JvbGVfc3dpdGNoX2ZvciBCVE1fdW5ibG9ja19yb2xlX3N3aXRjaF9mb3I7Ci0vLyBOYW1lOiBCVE1fdW5ibG9ja19zbmlmZl9tb2RlX2ZvcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBCVE1fdW5ibG9ja19zbmlmZl9tb2RlX2ZvciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9hZGRyKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsgYm9keShwZWVyX2FkZHIpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX3VuYmxvY2tfc25pZmZfbW9kZV9mb3IgQlRNX3VuYmxvY2tfc25pZmZfbW9kZV9mb3I7Ci0vLyBOYW1lOiBIQUNLX2FjbF9jaGVja19zbTQKLS8vIFBhcmFtczogdEJUTV9TRUNfREVWX1JFQyYgcmVjb3JkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgSEFDS19hY2xfY2hlY2tfc200IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRCVE1fU0VDX0RFVl9SRUMmIHJlY29yZCk+IGJvZHl7Ci0gICAgICBbXSh0QlRNX1NFQ19ERVZfUkVDJiByZWNvcmQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRCVE1fU0VDX0RFVl9SRUMmIHJlY29yZCkgeyBib2R5KHJlY29yZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBIQUNLX2FjbF9jaGVja19zbTQgSEFDS19hY2xfY2hlY2tfc200OwotLy8gTmFtZTogYWNsX2FjY2VwdF9jb25uZWN0aW9uX3JlcXVlc3QKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByb2xlCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYWNsX2FjY2VwdF9jb25uZWN0aW9uX3JlcXVlc3QgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByb2xlKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3Qgcm9sZSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByb2xlKSB7Ci0gICAgYm9keShiZF9hZGRyLCByb2xlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9hY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0IGFjbF9hY2NlcHRfY29ubmVjdGlvbl9yZXF1ZXN0OwotLy8gTmFtZTogYWNsX2Rpc2Nvbm5lY3RfYWZ0ZXJfcm9sZV9zd2l0Y2gKLS8vIFBhcmFtczogdWludDE2X3QgY29ubl9oYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9kaXNjb25uZWN0X2FmdGVyX3JvbGVfc3dpdGNoIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQxNl90IGNvbm5faGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pPiBib2R5ewotICAgICAgW10odWludDE2X3QgY29ubl9oYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbikgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgY29ubl9oYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbikgewotICAgIGJvZHkoY29ubl9oYW5kbGUsIHJlYXNvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfZGlzY29ubmVjdF9hZnRlcl9yb2xlX3N3aXRjaCBhY2xfZGlzY29ubmVjdF9hZnRlcl9yb2xlX3N3aXRjaDsKLS8vIE5hbWU6IGFjbF9kaXNjb25uZWN0X2Zyb21faGFuZGxlCi0vLyBQYXJhbXM6IHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYWNsX2Rpc2Nvbm5lY3RfZnJvbV9oYW5kbGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGFuZGxlLCB0SENJX1NUQVRVUyByZWFzb24pIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgcmVhc29uKSB7Ci0gICAgYm9keShoYW5kbGUsIHJlYXNvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfZGlzY29ubmVjdF9mcm9tX2hhbmRsZSBhY2xfZGlzY29ubmVjdF9mcm9tX2hhbmRsZTsKLS8vIE5hbWU6IGFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQKLS8vIFBhcmFtczogQlRfSERSKiBwX21zZwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQlRfSERSKiBwX21zZyk+IGJvZHl7W10oQlRfSERSKiBwX21zZykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoQlRfSERSKiBwX21zZykgeyBib2R5KHBfbXNnKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9saW5rX3NlZ21lbnRzX3htaXR0ZWQgYWNsX2xpbmtfc2VnbWVudHNfeG1pdHRlZDsKLS8vIE5hbWU6IGFjbF9wYWNrZXRzX2NvbXBsZXRlZAotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGNyZWRpdHMKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBhY2xfcGFja2V0c19jb21wbGV0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY3JlZGl0cykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKSB7IGJvZHkoaGFuZGxlLCBjcmVkaXRzKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9wYWNrZXRzX2NvbXBsZXRlZCBhY2xfcGFja2V0c19jb21wbGV0ZWQ7Ci0vLyBOYW1lOiBhY2xfcHJvY2Vzc19leHRlbmRlZF9mZWF0dXJlcwotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgY3VycmVudF9wYWdlX251bWJlciwgdWludDhfdAotLy8gbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYWNsX3Byb2Nlc3NfZXh0ZW5kZWRfZmVhdHVyZXMgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGFuZGxlLCB1aW50OF90IGN1cnJlbnRfcGFnZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9wYWdlX251bWJlciwgdWludDY0X3QgZmVhdHVyZXMpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgY3VycmVudF9wYWdlX251bWJlciwKLSAgICAgICAgICAgICAgdWludDhfdCBtYXhfcGFnZV9udW1iZXIsIHVpbnQ2NF90IGZlYXR1cmVzKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgY3VycmVudF9wYWdlX251bWJlciwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyLCB1aW50NjRfdCBmZWF0dXJlcykgewotICAgIGJvZHkoaGFuZGxlLCBjdXJyZW50X3BhZ2VfbnVtYmVyLCBtYXhfcGFnZV9udW1iZXIsIGZlYXR1cmVzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9wcm9jZXNzX2V4dGVuZGVkX2ZlYXR1cmVzIGFjbF9wcm9jZXNzX2V4dGVuZGVkX2ZlYXR1cmVzOwotLy8gTmFtZTogYWNsX3Byb2Nlc3NfbnVtX2NvbXBsZXRlZF9wa3RzCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9wcm9jZXNzX251bV9jb21wbGV0ZWRfcGt0cyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pPiBib2R5ewotICAgICAgW10odWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pIHsgYm9keShwLCBldnRfbGVuKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9wcm9jZXNzX251bV9jb21wbGV0ZWRfcGt0cyBhY2xfcHJvY2Vzc19udW1fY29tcGxldGVkX3BrdHM7Ci0vLyBOYW1lOiBhY2xfcHJvY2Vzc19zdXBwb3J0ZWRfZmVhdHVyZXMKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCB1aW50NjRfdCBmZWF0dXJlcwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ2NF90IGZlYXR1cmVzKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGhhbmRsZSwgdWludDY0X3QgZmVhdHVyZXMpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDY0X3QgZmVhdHVyZXMpIHsKLSAgICBib2R5KGhhbmRsZSwgZmVhdHVyZXMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWNsX3Byb2Nlc3Nfc3VwcG9ydGVkX2ZlYXR1cmVzIGFjbF9wcm9jZXNzX3N1cHBvcnRlZF9mZWF0dXJlczsKLS8vIE5hbWU6IGFjbF9yY3ZfYWNsX2RhdGEKLS8vIFBhcmFtczogQlRfSERSKiBwX21zZwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9yY3ZfYWNsX2RhdGEgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQlRfSERSKiBwX21zZyk+IGJvZHl7W10oQlRfSERSKiBwX21zZykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoQlRfSERSKiBwX21zZykgeyBib2R5KHBfbXNnKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9yY3ZfYWNsX2RhdGEgYWNsX3Jjdl9hY2xfZGF0YTsKLS8vIE5hbWU6IGFjbF9yZWplY3RfY29ubmVjdGlvbl9yZXF1ZXN0Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVhc29uCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYWNsX3JlamVjdF9jb25uZWN0aW9uX3JlcXVlc3QgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZWFzb24pPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZWFzb24pIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgcmVhc29uKSB7Ci0gICAgYm9keShiZF9hZGRyLCByZWFzb24pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYWNsX3JlamVjdF9jb25uZWN0aW9uX3JlcXVlc3QgYWNsX3JlamVjdF9jb25uZWN0aW9uX3JlcXVlc3Q7Ci0vLyBOYW1lOiBhY2xfc2VuZF9kYXRhX3BhY2tldF9ibGUKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgQlRfSERSKiBwX2J1ZgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9zZW5kX2RhdGFfcGFja2V0X2JsZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBCVF9IRFIqIHBfYnVmKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIEJUX0hEUiogcF9idWYpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIEJUX0hEUiogcF9idWYpIHsKLSAgICBib2R5KGJkX2FkZHIsIHBfYnVmKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9zZW5kX2RhdGFfcGFja2V0X2JsZSBhY2xfc2VuZF9kYXRhX3BhY2tldF9ibGU7Ci0vLyBOYW1lOiBhY2xfc2V0X2Rpc2Nvbm5lY3RfcmVhc29uCi0vLyBQYXJhbXM6IHRIQ0lfU1RBVFVTIGFjbF9kaXNjX3JlYXNvbgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb24gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEhDSV9TVEFUVVMgYWNsX2Rpc2NfcmVhc29uKT4gYm9keXsKLSAgICAgIFtdKHRIQ0lfU1RBVFVTIGFjbF9kaXNjX3JlYXNvbikgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodEhDSV9TVEFUVVMgYWNsX2Rpc2NfcmVhc29uKSB7IGJvZHkoYWNsX2Rpc2NfcmVhc29uKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGFjbF9zZXRfZGlzY29ubmVjdF9yZWFzb24gYWNsX3NldF9kaXNjb25uZWN0X3JlYXNvbjsKLS8vIE5hbWU6IGFjbF93cml0ZV9hdXRvbWF0aWNfZmx1c2hfdGltZW91dAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBmbHVzaF90aW1lb3V0X2luX3RpY2tzCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYWNsX3dyaXRlX2F1dG9tYXRpY19mbHVzaF90aW1lb3V0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmbHVzaF90aW1lb3V0X2luX3RpY2tzKT4KLSAgICAgIGJvZHl7Ci0gICAgICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgZmx1c2hfdGltZW91dF9pbl90aWNrcykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgZmx1c2hfdGltZW91dF9pbl90aWNrcykgewotICAgIGJvZHkoYmRfYWRkciwgZmx1c2hfdGltZW91dF9pbl90aWNrcyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBhY2xfd3JpdGVfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXQKLSAgICBhY2xfd3JpdGVfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXQ7Ci0vLyBOYW1lOiBidG1fYWNsX2Nvbm5lY3RlZAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50OF90Ci0vLyBlbmNfbW9kZSBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9jb25uZWN0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jX21vZGUpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICB1aW50OF90IGVuY19tb2RlKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgdWludDhfdCBlbmNfbW9kZSkgewotICAgIGJvZHkoYmRhLCBoYW5kbGUsIHN0YXR1cywgZW5jX21vZGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9jb25uZWN0ZWQgYnRtX2FjbF9jb25uZWN0ZWQ7Ci0vLyBOYW1lOiBidG1fYWNsX2Nvbm5lY3Rpb25fcmVxdWVzdAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGRjCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9jb25uZWN0aW9uX3JlcXVlc3QgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90KiBkYyk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGRjKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGRjKSB7IGJvZHkoYmRhLCBkYyk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYWNsX2Nvbm5lY3Rpb25fcmVxdWVzdCBidG1fYWNsX2Nvbm5lY3Rpb25fcmVxdWVzdDsKLS8vIE5hbWU6IGJ0bV9hY2xfY3JlYXRlZAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhjaV9oYW5kbGUsIHRIQ0lfUk9MRSBsaW5rX3JvbGUsCi0vLyB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9jcmVhdGVkIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIHRIQ0lfUk9MRSBsaW5rX3JvbGUsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoY2lfaGFuZGxlLCB0SENJX1JPTEUgbGlua19yb2xlLAotICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoY2lfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgdEhDSV9ST0xFIGxpbmtfcm9sZSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICBib2R5KGJkYSwgaGNpX2hhbmRsZSwgbGlua19yb2xlLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9jcmVhdGVkIGJ0bV9hY2xfY3JlYXRlZDsKLS8vIE5hbWU6IGJ0bV9hY2xfZGV2aWNlX2Rvd24KLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9hY2xfZGV2aWNlX2Rvd24gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYWNsX2RldmljZV9kb3duIGJ0bV9hY2xfZGV2aWNlX2Rvd247Ci0vLyBOYW1lOiBidG1fYWNsX2Rpc2Nvbm5lY3RlZAotLy8gUGFyYW1zOiB0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9kaXNjb25uZWN0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUkVBU09OIHJlYXNvbik+Ci0gICAgICBib2R5e1tdKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgICBib2R5KHN0YXR1cywgaGFuZGxlLCByZWFzb24pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9kaXNjb25uZWN0ZWQgYnRtX2FjbF9kaXNjb25uZWN0ZWQ7Ci0vLyBOYW1lOiBidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uKSB7Ci0gICAgYm9keShoYW5kbGUsIHJlYXNvbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYWNsX2lzb19kaXNjb25uZWN0ZWQgYnRtX2FjbF9pc29fZGlzY29ubmVjdGVkOwotLy8gTmFtZTogYnRtX2FjbF9lbmNyeXB0X2NoYW5nZQotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IGVuY3JfZW5hYmxlCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IGVuY3JfZW5hYmxlKT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDhfdCBlbmNyX2VuYWJsZSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDhfdCBlbmNyX2VuYWJsZSkgewotICAgIGJvZHkoaGFuZGxlLCBzdGF0dXMsIGVuY3JfZW5hYmxlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9hY2xfZW5jcnlwdF9jaGFuZ2UgYnRtX2FjbF9lbmNyeXB0X2NoYW5nZTsKLS8vIE5hbWU6IGJ0bV9hY2xfbm90aWZfY29ubl9jb2xsaXNpb24KLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9ub3RpZl9jb25uX2NvbGxpc2lvbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZGEpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsgYm9keShiZGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9ub3RpZl9jb25uX2NvbGxpc2lvbiBidG1fYWNsX25vdGlmX2Nvbm5fY29sbGlzaW9uOwotLy8gTmFtZTogYnRtX2FjbF9wYWdpbmcKLS8vIFBhcmFtczogQlRfSERSKiBwLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYWNsX3BhZ2luZyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChCVF9IRFIqIHAsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk+IGJvZHl7Ci0gICAgICBbXShCVF9IRFIqIHAsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoQlRfSERSKiBwLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsgYm9keShwLCBiZGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9wYWdpbmcgYnRtX2FjbF9wYWdpbmc7Ci0vLyBOYW1lOiBidG1fYWNsX3Byb2Nlc3Nfc2NhX2NtcGxfcGt0Ci0vLyBQYXJhbXM6IHVpbnQ4X3QgbGVuLCB1aW50OF90KiBkYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9wcm9jZXNzX3NjYV9jbXBsX3BrdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90IGxlbiwgdWludDhfdCogZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90IGxlbiwgdWludDhfdCogZGF0YSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCBsZW4sIHVpbnQ4X3QqIGRhdGEpIHsgYm9keShsZW4sIGRhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9wcm9jZXNzX3NjYV9jbXBsX3BrdCBidG1fYWNsX3Byb2Nlc3Nfc2NhX2NtcGxfcGt0OwotLy8gTmFtZTogYnRtX2FjbF9yZW1vdmVkCi0vLyBQYXJhbXM6IHVpbnQxNl90IGhhbmRsZQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9hY2xfcmVtb3ZlZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUpPiBib2R5e1tdKHVpbnQxNl90IGhhbmRsZSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlKSB7IGJvZHkoaGFuZGxlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9hY2xfcmVtb3ZlZCBidG1fYWNsX3JlbW92ZWQ7Ci0vLyBOYW1lOiBidG1fYWNsX3Jlc2V0X3BhZ2luZwotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9yZXNldF9wYWdpbmcgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGJvZHl7W10odm9pZCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodm9pZCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYWNsX3Jlc2V0X3BhZ2luZyBidG1fYWNsX3Jlc2V0X3BhZ2luZzsKLS8vIE5hbWU6IGJ0bV9hY2xfcmVzdWJtaXRfcGFnZQotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF9yZXN1Ym1pdF9wYWdlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF9yZXN1Ym1pdF9wYWdlIGJ0bV9hY2xfcmVzdWJtaXRfcGFnZTsKLS8vIE5hbWU6IGJ0bV9hY2xfcm9sZV9jaGFuZ2VkCi0vLyBQYXJhbXM6IHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRIQ0lfUk9MRQotLy8gbmV3X3JvbGUgUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9hY2xfcm9sZV9jaGFuZ2VkIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbmV3X3JvbGUpPgotICAgICAgYm9keXtbXSh0SENJX1NUQVRVUyBoY2lfc3RhdHVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICB0SENJX1JPTEUgbmV3X3JvbGUpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICB0SENJX1JPTEUgbmV3X3JvbGUpIHsKLSAgICBib2R5KGhjaV9zdGF0dXMsIGJkX2FkZHIsIG5ld19yb2xlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9hY2xfcm9sZV9jaGFuZ2VkIGJ0bV9hY2xfcm9sZV9jaGFuZ2VkOwotLy8gTmFtZTogYnRtX2FjbF9zZXRfcGFnaW5nCi0vLyBQYXJhbXM6IGJvb2wgdmFsdWUKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYWNsX3NldF9wYWdpbmcgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCB2YWx1ZSk+IGJvZHl7W10oYm9vbCB2YWx1ZSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoYm9vbCB2YWx1ZSkgeyBib2R5KHZhbHVlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9hY2xfc2V0X3BhZ2luZyBidG1fYWNsX3NldF9wYWdpbmc7Ci0vLyBOYW1lOiBidG1fYWNsX3VwZGF0ZV9jb25uX2FkZHIKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2FjbF91cGRhdGVfY29ubl9hZGRyIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICAgIGJvZHkoaGFuZGxlLCBhZGRyZXNzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9hY2xfdXBkYXRlX2Nvbm5fYWRkciBidG1fYWNsX3VwZGF0ZV9jb25uX2FkZHI7Ci0vLyBOYW1lOiBidG1fYWNsX3VwZGF0ZV9pbnF1aXJ5X3N0YXR1cwotLy8gUGFyYW1zOiB1aW50OF90IHN0YXR1cwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9hY2xfdXBkYXRlX2lucXVpcnlfc3RhdHVzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3Qgc3RhdHVzKT4gYm9keXtbXSh1aW50OF90IHN0YXR1cykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCBzdGF0dXMpIHsgYm9keShzdGF0dXMpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2FjbF91cGRhdGVfaW5xdWlyeV9zdGF0dXMgYnRtX2FjbF91cGRhdGVfaW5xdWlyeV9zdGF0dXM7Ci0vLyBOYW1lOiBidG1fYmxlX3JlZnJlc2hfbG9jYWxfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIKLS8vIFBhcmFtczogIGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19hZGRyLCBjb25zdCBSYXdBZGRyZXNzJiBsb2NhbF9ycGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX3JlZnJlc2hfbG9jYWxfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBsb2NhbF9ycGEpPgotICAgICAgYm9keXsKLSAgICAgICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYWRkciwgY29uc3QgUmF3QWRkcmVzcyYgbG9jYWxfcnBhKSB7Ci0gICAgYm9keShwc2V1ZG9fYWRkciwgbG9jYWxfcnBhKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcmVmcmVzaF9sb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcgotICAgIGJ0bV9ibGVfcmVmcmVzaF9sb2NhbF9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcjsKLS8vIE5hbWU6IGJ0bV9jb250X3Jzd2l0Y2hfZnJvbV9oYW5kbGUKLS8vIFBhcmFtczogdWludDE2X3QgaGNpX2hhbmRsZQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9jb250X3Jzd2l0Y2hfZnJvbV9oYW5kbGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGNpX2hhbmRsZSk+IGJvZHl7W10odWludDE2X3QgaGNpX2hhbmRsZSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgaGNpX2hhbmRsZSkgeyBib2R5KGhjaV9oYW5kbGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2NvbnRfcnN3aXRjaF9mcm9tX2hhbmRsZSBidG1fY29udF9yc3dpdGNoX2Zyb21faGFuZGxlOwotLy8gTmFtZTogYnRtX2VzdGFibGlzaF9jb250aW51ZV9mcm9tX2FkZHJlc3MKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9lc3RhYmxpc2hfY29udGludWVfZnJvbV9hZGRyZXNzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICAgIGJvZHkoYmRhLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2VzdGFibGlzaF9jb250aW51ZV9mcm9tX2FkZHJlc3MKLSAgICBidG1fZXN0YWJsaXNoX2NvbnRpbnVlX2Zyb21fYWRkcmVzczsKLS8vIE5hbWU6IGJ0bV9wcm9jZXNzX3JlbW90ZV9leHRfZmVhdHVyZXMKLS8vIFBhcmFtczogdEFDTF9DT05OKiBwX2FjbF9jYiwgdWludDhfdCBtYXhfcGFnZV9udW1iZXIKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcHJvY2Vzc19yZW1vdGVfZXh0X2ZlYXR1cmVzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRBQ0xfQ09OTiogcF9hY2xfY2IsIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyKT4gYm9keXsKLSAgICAgIFtdKHRBQ0xfQ09OTiogcF9hY2xfY2IsIHVpbnQ4X3QgbWF4X3BhZ2VfbnVtYmVyKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QUNMX0NPTk4qIHBfYWNsX2NiLCB1aW50OF90IG1heF9wYWdlX251bWJlcikgewotICAgIGJvZHkocF9hY2xfY2IsIG1heF9wYWdlX251bWJlcik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fcHJvY2Vzc19yZW1vdGVfZXh0X2ZlYXR1cmVzIGJ0bV9wcm9jZXNzX3JlbW90ZV9leHRfZmVhdHVyZXM7Ci0vLyBOYW1lOiBidG1fcHJvY2Vzc19yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZQotLy8gUGFyYW1zOiB1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGxtcF92ZXJzaW9uLCB1aW50MTZfdAotLy8gbWFudWZhY3R1cmVyLCB1aW50MTZfdCBsbXBfc3VidmVyc2lvbiBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3Byb2Nlc3NfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1hbnVmYWN0dXJlciwgdWludDE2X3QgbG1wX3N1YnZlcnNpb24pPgotICAgICAgYm9keXtbXSh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXIsIHVpbnQxNl90IGxtcF9zdWJ2ZXJzaW9uKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGxtcF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyLCB1aW50MTZfdCBsbXBfc3VidmVyc2lvbikgewotICAgIGJvZHkoc3RhdHVzLCBoYW5kbGUsIGxtcF92ZXJzaW9uLCBtYW51ZmFjdHVyZXIsIGxtcF9zdWJ2ZXJzaW9uKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9wcm9jZXNzX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlCi0gICAgYnRtX3Byb2Nlc3NfcmVtb3RlX3ZlcnNpb25fY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZQotLy8gUGFyYW1zOiB1aW50OF90KiBwCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCogcCk+IGJvZHl7W10odWludDhfdCogcCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCogcCkgeyBib2R5KHApOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfYXV0b21hdGljX2ZsdXNoX3RpbWVvdXRfY29tcGxldGUKLSAgICBidG1fcmVhZF9hdXRvbWF0aWNfZmx1c2hfdGltZW91dF9jb21wbGV0ZTsKLS8vIE5hbWU6IGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUKLS8vIFBhcmFtczogdWludDhfdCogcAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCogcCk+IGJvZHl7W10odWludDhfdCogcCkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCogcCkgeyBib2R5KHApOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfZmFpbGVkX2NvbnRhY3RfY291bnRlcl9jb21wbGV0ZQotICAgIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fcmVhZF9mYWlsZWRfY29udGFjdF9jb3VudGVyX3RpbWVvdXQKLS8vIFBhcmFtczogVU5VU0VEX0FUVFIgdm9pZCogZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZW91dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKT4gYm9keXsKLSAgICAgIFtdKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsgYm9keShkYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZW91dAotICAgIGJ0bV9yZWFkX2ZhaWxlZF9jb250YWN0X2NvdW50ZXJfdGltZW91dDsKLS8vIE5hbWU6IGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZQotLy8gUGFyYW1zOiB1aW50OF90KiBwCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfbGlua19xdWFsaXR5X2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QqIHApPiBib2R5e1tdKHVpbnQ4X3QqIHApIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHApIHsgYm9keShwKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX2xpbmtfcXVhbGl0eV9jb21wbGV0ZSBidG1fcmVhZF9saW5rX3F1YWxpdHlfY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dAotLy8gUGFyYW1zOiBVTlVTRURfQVRUUiB2b2lkKiBkYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfbGlua19xdWFsaXR5X3RpbWVvdXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSk+IGJvZHl7Ci0gICAgICBbXShVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7IGJvZHkoZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dCBidG1fcmVhZF9saW5rX3F1YWxpdHlfdGltZW91dDsKLS8vIE5hbWU6IGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXMKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCB1aW50OF90IHBhZ2VfbnVtYmVyCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW1iZXIpPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHBhZ2VfbnVtYmVyKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW1iZXIpIHsKLSAgICBib2R5KGhhbmRsZSwgcGFnZV9udW1iZXIpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlcyBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzOwotLy8gTmFtZTogYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZQotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW0sIHVpbnQ4X3QgbWF4X3BhZ2UsIHVpbnQ4X3QqCi0vLyBmZWF0dXJlcyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcGFnZV9udW0sIHVpbnQ4X3QgbWF4X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBmZWF0dXJlcyk+Ci0gICAgICBib2R5e1tdKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYWdlX251bSwgdWludDhfdCBtYXhfcGFnZSwKLSAgICAgICAgICAgICAgdWludDhfdCogZmVhdHVyZXMpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBwYWdlX251bSwgdWludDhfdCBtYXhfcGFnZSwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGZlYXR1cmVzKSB7Ci0gICAgYm9keShoYW5kbGUsIHBhZ2VfbnVtLCBtYXhfcGFnZSwgZmVhdHVyZXMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZQotICAgIGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2NvbXBsZXRlX3JhdwotLy8gUGFyYW1zOiB1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2NvbXBsZXRlX3JhdyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pPiBib2R5ewotICAgICAgW10odWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pIHsgYm9keShwLCBldnRfbGVuKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX3JlbW90ZV9leHRfZmVhdHVyZXNfY29tcGxldGVfcmF3Ci0gICAgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19jb21wbGV0ZV9yYXc7Ci0vLyBOYW1lOiBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZAotLy8gUGFyYW1zOiB1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19mYWlsZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90IHN0YXR1cywgdWludDE2X3QgaGFuZGxlKSB7IGJvZHkoc3RhdHVzLCBoYW5kbGUpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2V4dF9mZWF0dXJlc19mYWlsZWQKLSAgICBidG1fcmVhZF9yZW1vdGVfZXh0X2ZlYXR1cmVzX2ZhaWxlZDsKLS8vIE5hbWU6IGJ0bV9yZWFkX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZQotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QqIGZlYXR1cmVzCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX2ZlYXR1cmVzX2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCogZmVhdHVyZXMpPiBib2R5ewotICAgICAgW10odWludDE2X3QgaGFuZGxlLCB1aW50OF90KiBmZWF0dXJlcykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlLCB1aW50OF90KiBmZWF0dXJlcykgewotICAgIGJvZHkoaGFuZGxlLCBmZWF0dXJlcyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUKLSAgICBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGVfcmF3Ci0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGVfcmF3IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QqIHApPiBib2R5e1tdKHVpbnQ4X3QqIHApIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHApIHsgYm9keShwKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX3JlbW90ZV9mZWF0dXJlc19jb21wbGV0ZV9yYXcKLSAgICBidG1fcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGVfcmF3OwotLy8gTmFtZTogYnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUKLS8vIFBhcmFtczogdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sIHVpbnQxNl90Ci0vLyBtYW51ZmFjdHVyZXIsIHVpbnQxNl90IGxtcF9zdWJ2ZXJzaW9uIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1hbnVmYWN0dXJlciwgdWludDE2X3QgbG1wX3N1YnZlcnNpb24pPgotICAgICAgYm9keXtbXSh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBsbXBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgdWludDE2X3QgbWFudWZhY3R1cmVyLCB1aW50MTZfdCBsbXBfc3VidmVyc2lvbikgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgbG1wX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXIsIHVpbnQxNl90IGxtcF9zdWJ2ZXJzaW9uKSB7Ci0gICAgYm9keShzdGF0dXMsIGhhbmRsZSwgbG1wX3ZlcnNpb24sIG1hbnVmYWN0dXJlciwgbG1wX3N1YnZlcnNpb24pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGUgYnRtX3JlYWRfcmVtb3RlX3ZlcnNpb25fY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZV9yYXcKLS8vIFBhcmFtczogdWludDhfdCogcAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9yZWFkX3JlbW90ZV92ZXJzaW9uX2NvbXBsZXRlX3JhdyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwKT4gYm9keXtbXSh1aW50OF90KiBwKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90KiBwKSB7IGJvZHkocCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZV9yYXcKLSAgICBidG1fcmVhZF9yZW1vdGVfdmVyc2lvbl9jb21wbGV0ZV9yYXc7Ci0vLyBOYW1lOiBidG1fcmVhZF9yc3NpX2NvbXBsZXRlCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcmVhZF9yc3NpX2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QqIHApPiBib2R5e1tdKHVpbnQ4X3QqIHApIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHApIHsgYm9keShwKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX3Jzc2lfY29tcGxldGUgYnRtX3JlYWRfcnNzaV9jb21wbGV0ZTsKLS8vIE5hbWU6IGJ0bV9yZWFkX3Jzc2lfdGltZW91dAotLy8gUGFyYW1zOiBVTlVTRURfQVRUUiB2b2lkKiBkYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfcnNzaV90aW1lb3V0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpPiBib2R5ewotICAgICAgW10oVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgeyBib2R5KGRhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3JlYWRfcnNzaV90aW1lb3V0IGJ0bV9yZWFkX3Jzc2lfdGltZW91dDsKLS8vIE5hbWU6IGJ0bV9yZWFkX3R4X3Bvd2VyX2NvbXBsZXRlCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAsIGJvb2wgaXNfYmxlCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfdHhfcG93ZXJfY29tcGxldGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCogcCwgYm9vbCBpc19ibGUpPiBib2R5ewotICAgICAgW10odWludDhfdCogcCwgYm9vbCBpc19ibGUpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHAsIGJvb2wgaXNfYmxlKSB7IGJvZHkocCwgaXNfYmxlKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX3R4X3Bvd2VyX2NvbXBsZXRlIGJ0bV9yZWFkX3R4X3Bvd2VyX2NvbXBsZXRlOwotLy8gTmFtZTogYnRtX3JlYWRfdHhfcG93ZXJfdGltZW91dAotLy8gUGFyYW1zOiBVTlVTRURfQVRUUiB2b2lkKiBkYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3JlYWRfdHhfcG93ZXJfdGltZW91dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKT4gYm9keXsKLSAgICAgIFtdKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKFVOVVNFRF9BVFRSIHZvaWQqIGRhdGEpIHsgYm9keShkYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWFkX3R4X3Bvd2VyX3RpbWVvdXQgYnRtX3JlYWRfdHhfcG93ZXJfdGltZW91dDsKLS8vIE5hbWU6IGJ0bV9yZWplY3RsaXN0X3JvbGVfY2hhbmdlX2RldmljZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGhjaV9zdGF0dXMKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fcmVqZWN0bGlzdF9yb2xlX2NoYW5nZV9kZXZpY2UgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBoY2lfc3RhdHVzKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgaGNpX3N0YXR1cykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCBoY2lfc3RhdHVzKSB7Ci0gICAgYm9keShiZF9hZGRyLCBoY2lfc3RhdHVzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9yZWplY3RsaXN0X3JvbGVfY2hhbmdlX2RldmljZQotICAgIGJ0bV9yZWplY3RsaXN0X3JvbGVfY2hhbmdlX2RldmljZTsKLS8vIE5hbWU6IGJ0bV9zZXRfbGlua19wb2xpY3kKLS8vIFBhcmFtczogdEFDTF9DT05OKiBjb25uLCB0TElOS19QT0xJQ1kgcG9saWN5Ci0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3NldF9saW5rX3BvbGljeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QUNMX0NPTk4qIGNvbm4sIHRMSU5LX1BPTElDWSBwb2xpY3kpPiBib2R5ewotICAgICAgW10odEFDTF9DT05OKiBjb25uLCB0TElOS19QT0xJQ1kgcG9saWN5KSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QUNMX0NPTk4qIGNvbm4sIHRMSU5LX1BPTElDWSBwb2xpY3kpIHsgYm9keShjb25uLCBwb2xpY3kpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX3NldF9saW5rX3BvbGljeSBidG1fc2V0X2xpbmtfcG9saWN5OwotLy8gTmFtZTogYnRtX3NldF9wYWNrZXRfdHlwZXNfZnJvbV9hZGRyZXNzCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHBrdF90eXBlcwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9zZXRfcGFja2V0X3R5cGVzX2Zyb21fYWRkcmVzcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwa3RfdHlwZXMpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgcGt0X3R5cGVzKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwa3RfdHlwZXMpIHsKLSAgICBib2R5KGJkX2FkZHIsIHBrdF90eXBlcyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fc2V0X3BhY2tldF90eXBlc19mcm9tX2FkZHJlc3MKLSAgICBidG1fc2V0X3BhY2tldF90eXBlc19mcm9tX2FkZHJlc3M7Ci0vLyBOYW1lOiBoY2lfYnRtX3NldF9saW5rX3N1cGVydmlzaW9uX3RpbWVvdXQKLS8vIFBhcmFtczogdEFDTF9DT05OJiBsaW5rLCB1aW50MTZfdCB0aW1lb3V0Ci0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgaGNpX2J0bV9zZXRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRBQ0xfQ09OTiYgbGluaywgdWludDE2X3QgdGltZW91dCk+IGJvZHl7Ci0gICAgICBbXSh0QUNMX0NPTk4mIGxpbmssIHVpbnQxNl90IHRpbWVvdXQpIHsgOyB9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRBQ0xfQ09OTiYgbGluaywgdWludDE2X3QgdGltZW91dCkgeyBib2R5KGxpbmssIHRpbWVvdXQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgaGNpX2J0bV9zZXRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0Ci0gICAgaGNpX2J0bV9zZXRfbGlua19zdXBlcnZpc2lvbl90aW1lb3V0OwotLy8gTmFtZTogb25fYWNsX2JyX2Vkcl9jb25uZWN0ZWQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZW5jX21vZGUKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBvbl9hY2xfYnJfZWRyX2Nvbm5lY3RlZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBlbmNfbW9kZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGVuY19tb2RlKSB7IDsgfX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBlbmNfbW9kZSkgewotICAgIGJvZHkoYmRhLCBoYW5kbGUsIGVuY19tb2RlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IG9uX2FjbF9icl9lZHJfY29ubmVjdGVkIG9uX2FjbF9icl9lZHJfY29ubmVjdGVkOwotLy8gTmFtZTogb25fYWNsX2JyX2Vkcl9mYWlsZWQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0SENJX1NUQVRVUyBzdGF0dXMKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBvbl9hY2xfYnJfZWRyX2ZhaWxlZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRIQ0lfU1RBVFVTIHN0YXR1cyk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHRIQ0lfU1RBVFVTIHN0YXR1cykgeyA7IH19OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0SENJX1NUQVRVUyBzdGF0dXMpIHsKLSAgICBib2R5KGJkYSwgc3RhdHVzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IG9uX2FjbF9icl9lZHJfZmFpbGVkIG9uX2FjbF9icl9lZHJfZmFpbGVkOwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfYWNsCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2FjbF9ibGUuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hY2xfYmxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI3Nzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2FjbF9ibGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibGVfYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9oY2lfcm9sZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIGFjbF9ibGVfY29ubmVjdGlvbl9jb21wbGV0ZShjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCB0SENJX1JPTEUgcm9sZSwgYm9vbCBtYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYWNsX2JsZV9jb25uZWN0aW9uX2ZhaWwoY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGFuZGxlLCBib29sIGVuaGFuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBzdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGFjbF9ibGVfZW5oYW5jZWRfY29ubmVjdGlvbl9jb21wbGV0ZSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLAotICAgIGJvb2wgbWF0Y2gsIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwKLSAgICB1aW50MTZfdCBjb25uX3RpbWVvdXQsIGNvbnN0IFJhd0FkZHJlc3MmIGxvY2FsX3JwYSwKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX3JwYSwgdWludDhfdCBwZWVyX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYWNsX2JsZV9lbmhhbmNlZF9jb25uZWN0aW9uX2NvbXBsZXRlX2Zyb21fc2hpbSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHRIQ0lfUk9MRSByb2xlLAotICAgIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGxvY2FsX3JwYSwgY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9ycGEsCi0gICAgdWludDhfdCBwZWVyX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotdm9pZCBnYXR0X25vdGlmeV9jb25uX3VwZGF0ZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGUsIHVpbnQxNl90IGludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SENJX1NUQVRVUyBzdGF0dXMpOwotdm9pZCBhY2xfYmxlX3VwZGF0ZV9ldmVudF9yZWNlaXZlZCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTkyMGQuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsX2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo2Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIHRoZSBpbmNsdXNpb24gc2V0LgotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19zdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX2FjbF9idG1fYmxlX2Nvbm5lY3Rpb25fZXN0YWJsaXNobWVudCB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGJ0bV9zZW5kX2hjaV9jcmVhdGVfY29ubmVjdGlvbiBidG1fc2VuZF9oY2lfY3JlYXRlX2Nvbm5lY3Rpb247Ci1zdHJ1Y3QgYnRtX2JsZV9jcmVhdGVfbGxfY29ubl9jb21wbGV0ZSBidG1fYmxlX2NyZWF0ZV9sbF9jb25uX2NvbXBsZXRlOwotc3RydWN0IG1heWJlX3Jlc29sdmVfYWRkcmVzcyBtYXliZV9yZXNvbHZlX2FkZHJlc3M7Ci1zdHJ1Y3QgYnRtX2JsZV9jb25uX2NvbXBsZXRlIGJ0bV9ibGVfY29ubl9jb21wbGV0ZTsKLXN0cnVjdCBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbCBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbDsKLXN0cnVjdCBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZSBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2FjbF9idG1fYmxlX2Nvbm5lY3Rpb25fZXN0YWJsaXNobWVudAotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdm9pZCBidG1fc2VuZF9oY2lfY3JlYXRlX2Nvbm5lY3Rpb24oCi0gICAgdWludDE2X3Qgc2Nhbl9pbnQsIHVpbnQxNl90IHNjYW5fd2luLCB1aW50OF90IGluaXRfZmlsdGVyX3BvbGljeSwKLSAgICB1aW50OF90IGFkZHJfdHlwZV9wZWVyLCBjb25zdCBSYXdBZGRyZXNzJiBiZGFfcGVlciwgdWludDhfdCBhZGRyX3R5cGVfb3duLAotICAgIHVpbnQxNl90IGNvbm5faW50X21pbiwgdWludDE2X3QgY29ubl9pbnRfbWF4LCB1aW50MTZfdCBjb25uX2xhdGVuY3ksCi0gICAgdWludDE2X3QgY29ubl90aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuLAotICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQ6OgotICAgICAgYnRtX3NlbmRfaGNpX2NyZWF0ZV9jb25uZWN0aW9uKAotICAgICAgICAgIHNjYW5faW50LCBzY2FuX3dpbiwgaW5pdF9maWx0ZXJfcG9saWN5LCBhZGRyX3R5cGVfcGVlciwgYmRhX3BlZXIsCi0gICAgICAgICAgYWRkcl90eXBlX293biwgY29ubl9pbnRfbWluLCBjb25uX2ludF9tYXgsIGNvbm5fbGF0ZW5jeSwgY29ubl90aW1lb3V0LAotICAgICAgICAgIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4sIGluaXRpYXRpbmdfcGh5cyk7Ci19Ci12b2lkIGJ0bV9ibGVfY3JlYXRlX2xsX2Nvbm5fY29tcGxldGUodEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQ6OgotICAgICAgYnRtX2JsZV9jcmVhdGVfbGxfY29ubl9jb21wbGV0ZShzdGF0dXMpOwotfQotYm9vbCBtYXliZV9yZXNvbHZlX2FkZHJlc3MoUmF3QWRkcmVzcyogYmRhLCB0QkxFX0FERFJfVFlQRSogYmRhX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQ6OgotICAgICAgbWF5YmVfcmVzb2x2ZV9hZGRyZXNzKGJkYSwgYmRhX3R5cGUpOwotfQotdm9pZCBidG1fYmxlX2Nvbm5fY29tcGxldGUodWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbiwgYm9vbCBlbmhhbmNlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsX2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50OjpidG1fYmxlX2Nvbm5fY29tcGxldGUoCi0gICAgICBwLCBldnRfbGVuLCBlbmhhbmNlZCk7Ci19Ci12b2lkIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYWNsX2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50OjoKLSAgICAgIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsKCk7Ci19Ci12b2lkIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2FjbF9idG1fYmxlX2Nvbm5lY3Rpb25fZXN0YWJsaXNobWVudDo6Ci0gICAgICBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZShwKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2FjbF9idG1fYmxlX2Nvbm5lY3Rpb25fZXN0YWJsaXNobWVudC5oIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsX2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDZkMDMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsX2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2hjaV9lcnJvcl9jb2RlLmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfYWNsX2J0bV9ibGVfY29ubmVjdGlvbl9lc3RhYmxpc2htZW50IHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IGJ0bV9zZW5kX2hjaV9jcmVhdGVfY29ubmVjdGlvbgotLy8gUGFyYW1zOiB1aW50MTZfdCBzY2FuX2ludCwgdWludDE2X3Qgc2Nhbl93aW4sIHVpbnQ4X3QgaW5pdF9maWx0ZXJfcG9saWN5LAotLy8gdWludDhfdCBhZGRyX3R5cGVfcGVlciwgY29uc3QgUmF3QWRkcmVzcyYgYmRhX3BlZXIsIHVpbnQ4X3QgYWRkcl90eXBlX293biwKLS8vIHVpbnQxNl90IGNvbm5faW50X21pbiwgdWludDE2X3QgY29ubl9pbnRfbWF4LCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90Ci0vLyBjb25uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4sIHVpbnQ4X3QKLS8vIGluaXRpYXRpbmdfcGh5cyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX3NlbmRfaGNpX2NyZWF0ZV9jb25uZWN0aW9uIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKAotICAgICAgdWludDE2X3Qgc2Nhbl9pbnQsIHVpbnQxNl90IHNjYW5fd2luLCB1aW50OF90IGluaXRfZmlsdGVyX3BvbGljeSwKLSAgICAgIHVpbnQ4X3QgYWRkcl90eXBlX3BlZXIsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLCB1aW50OF90IGFkZHJfdHlwZV9vd24sCi0gICAgICB1aW50MTZfdCBjb25uX2ludF9taW4sIHVpbnQxNl90IGNvbm5faW50X21heCwgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgdWludDE2X3QgY29ubl90aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuLAotICAgICAgdWludDhfdCBpbml0aWF0aW5nX3BoeXMpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBzY2FuX2ludCwgdWludDE2X3Qgc2Nhbl93aW4sIHVpbnQ4X3QgaW5pdF9maWx0ZXJfcG9saWN5LAotICAgICAgICAgICAgICB1aW50OF90IGFkZHJfdHlwZV9wZWVyLCBjb25zdCBSYXdBZGRyZXNzJiBiZGFfcGVlciwKLSAgICAgICAgICAgICAgdWludDhfdCBhZGRyX3R5cGVfb3duLCB1aW50MTZfdCBjb25uX2ludF9taW4sCi0gICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5faW50X21heCwgdWludDE2X3QgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX3RpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sIHVpbnQxNl90IG1heF9jZV9sZW4sCi0gICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50MTZfdCBzY2FuX2ludCwgdWludDE2X3Qgc2Nhbl93aW4sCi0gICAgICAgICAgICAgICAgICB1aW50OF90IGluaXRfZmlsdGVyX3BvbGljeSwgdWludDhfdCBhZGRyX3R5cGVfcGVlciwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYV9wZWVyLCB1aW50OF90IGFkZHJfdHlwZV9vd24sCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2ludF9taW4sIHVpbnQxNl90IGNvbm5faW50X21heCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2NlX2xlbiwgdWludDE2X3QgbWF4X2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7Ci0gICAgYm9keShzY2FuX2ludCwgc2Nhbl93aW4sIGluaXRfZmlsdGVyX3BvbGljeSwgYWRkcl90eXBlX3BlZXIsIGJkYV9wZWVyLAotICAgICAgICAgYWRkcl90eXBlX293biwgY29ubl9pbnRfbWluLCBjb25uX2ludF9tYXgsIGNvbm5fbGF0ZW5jeSwgY29ubl90aW1lb3V0LAotICAgICAgICAgbWluX2NlX2xlbiwgbWF4X2NlX2xlbiwgaW5pdGlhdGluZ19waHlzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9zZW5kX2hjaV9jcmVhdGVfY29ubmVjdGlvbiBidG1fc2VuZF9oY2lfY3JlYXRlX2Nvbm5lY3Rpb247Ci0vLyBOYW1lOiBidG1fYmxlX2NyZWF0ZV9sbF9jb25uX2NvbXBsZXRlCi0vLyBQYXJhbXM6IHRIQ0lfU1RBVFVTIHN0YXR1cwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfY3JlYXRlX2xsX2Nvbm5fY29tcGxldGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEhDSV9TVEFUVVMgc3RhdHVzKT4gYm9keXtbXSh0SENJX1NUQVRVUyBzdGF0dXMpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRIQ0lfU1RBVFVTIHN0YXR1cykgeyBib2R5KHN0YXR1cyk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX2NyZWF0ZV9sbF9jb25uX2NvbXBsZXRlIGJ0bV9ibGVfY3JlYXRlX2xsX2Nvbm5fY29tcGxldGU7Ci0vLyBOYW1lOiBtYXliZV9yZXNvbHZlX2FkZHJlc3MKLS8vIFBhcmFtczogUmF3QWRkcmVzcyogYmRhLCB0QkxFX0FERFJfVFlQRSogYmRhX3R5cGUKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBtYXliZV9yZXNvbHZlX2FkZHJlc3MgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woUmF3QWRkcmVzcyogYmRhLCB0QkxFX0FERFJfVFlQRSogYmRhX3R5cGUpPiBib2R5ewotICAgICAgW10oUmF3QWRkcmVzcyogYmRhLCB0QkxFX0FERFJfVFlQRSogYmRhX3R5cGUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKFJhd0FkZHJlc3MqIGJkYSwgdEJMRV9BRERSX1RZUEUqIGJkYV90eXBlKSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRhLCBiZGFfdHlwZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBtYXliZV9yZXNvbHZlX2FkZHJlc3MgbWF5YmVfcmVzb2x2ZV9hZGRyZXNzOwotLy8gTmFtZTogYnRtX2JsZV9jb25uX2NvbXBsZXRlCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4sIGJvb2wgZW5oYW5jZWQKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX2Nvbm5fY29tcGxldGUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbiwgYm9vbCBlbmhhbmNlZCk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuLCBib29sIGVuaGFuY2VkKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuLCBib29sIGVuaGFuY2VkKSB7Ci0gICAgYm9keShwLCBldnRfbGVuLCBlbmhhbmNlZCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX2Nvbm5fY29tcGxldGUgYnRtX2JsZV9jb25uX2NvbXBsZXRlOwotLy8gTmFtZTogYnRtX2JsZV9jcmVhdGVfY29ubl9jYW5jZWwKLS8vIFBhcmFtczoKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX2NyZWF0ZV9jb25uX2NhbmNlbCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBib2R5e1tdKCkge319OwotICB2b2lkIG9wZXJhdG9yKCkoKSB7IGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsIGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsOwotLy8gTmFtZTogYnRtX2JsZV9jcmVhdGVfY29ubl9jYW5jZWxfY29tcGxldGUKLS8vIFBhcmFtczogdWludDhfdCogcAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QqIHApPiBib2R5e1tdKHVpbnQ4X3QqIHApIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHApIHsgYm9keShwKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfY3JlYXRlX2Nvbm5fY2FuY2VsX2NvbXBsZXRlCi0gICAgYnRtX2JsZV9jcmVhdGVfY29ubl9jYW5jZWxfY29tcGxldGU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGFja19hY2xfYnRtX2JsZV9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsX2J0bV9wbS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2FjbF9idG1fcG0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2IwYmYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYWNsX2J0bV9wbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTcKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2R1bXBzeXMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbGlua19wb2xpY3kuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWJvb2wgQlRNX1JlYWRQb3dlck1vZGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgdEJUTV9QTV9NT0RFKiBwX21vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQlRNX1NldExpbmtQb2xpY3lBY3RpdmVNb2RlKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXRCVE1fQ09OVFJMX1NUQVRFIEJUTV9QTV9SZWFkQ29udHJvbGxlclN0YXRlKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fQ09OVFJMX1VOS05PV047Ci19Ci10QlRNX1NUQVRVUyBCVE1fUG1SZWdpc3Rlcih1aW50OF90IG1hc2ssIHVpbnQ4X3QqIHBfcG1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1BNX1NUQVRVU19DQkFDSyogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldFBvd2VyTW9kZSh1aW50OF90IHBtX2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0QlRNX1BNX1BXUl9NRCogcF9tb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBCVE1fU2V0U3NyUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHVpbnQxNl90IG1heF9sYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbl9ybXRfdG8sIHVpbnQxNl90IG1pbl9sb2NfdG8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXZvaWQgQlRNX1BNX09uQ29ubmVjdGVkKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX1BNX09uRGlzY29ubmVjdGVkKHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3BtX29uX21vZGVfY2hhbmdlKHRIQ0lfU1RBVFVTIHN0YXR1cywgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGN1cnJlbnRfbW9kZSwgdWludDE2X3QgaW50ZXJ2YWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9wbV9vbl9zbmlmZl9zdWJyYXRpbmcodEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4aW11bV90cmFuc21pdF9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heGltdW1fcmVjZWl2ZV9sYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbmltdW1fcmVtb3RlX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluaW11bV9sb2NhbF90aW1lb3V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fcG1fcHJvY19jbWRfc3RhdHVzKHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3BtX3Byb2NfbW9kZV9jaGFuZ2UodEhDSV9TVEFUVVMgaGNpX3N0YXR1cywgdWludDE2X3QgaGNpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9NT0RFIGhjaV9tb2RlLCB1aW50MTZfdCBpbnRlcnZhbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3BtX3Byb2Nfc3NyX2V2dCh1aW50OF90KiBwLCBVTlVTRURfQVRUUiB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fcG1fcmVzZXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBwcm9jZXNzX3Nzcl9ldmVudCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdWludDE2X3QgbWF4X3R4X2xhdCwgdWludDE2X3QgbWF4X3J4X2xhdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2F2Y3RfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZjdF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzkxOGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZjdF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImF2Y3RfYXBpLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJsMmNfYXBpLmgiCi0jaW5jbHVkZSAibDJjZGVmcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2F2Y3QvYXZjdF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXVpbnQxNl90IEFWQ1RfQ3JlYXRlQnJvd3NlKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IHJvbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZDVF9DcmVhdGVDb25uKHVpbnQ4X3QqIHBfaGFuZGxlLCB0QVZDVF9DQyogcF9jYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZDVF9HZXRCcm93c2VNdHUodWludDhfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZDVF9HZXRQZWVyTXR1KHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWQ1RfTXNnUmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGNyLCBCVF9IRFIqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWQ1RfUmVtb3ZlQnJvd3NlKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWQ1RfUmVtb3ZlQ29ubih1aW50OF90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEFWQ1RfRGVyZWdpc3Rlcih2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEFWQ1RfUmVnaXN0ZXIoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19hdmR0X2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2F2ZHRfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmEyYmYxMC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19hdmR0X2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MjYKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdmR0X2FwaS5oIgotI2luY2x1ZGUgImF2ZHRjX2FwaS5oIgotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0YS9pbmNsdWRlL2J0YV9hcGkuaCIKLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYXZkdC9hdmR0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hMmRwX2NvZGVjX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXVpbnQxNl90IEFWRFRfQ2xvc2VSZXEodWludDhfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZEVF9Db25maWdSc3AodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgbGFiZWwsIHVpbnQ4X3QgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2F0ZWdvcnkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZEVF9Db25uZWN0UmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgY2hhbm5lbF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWRFRfQ3JlYXRlU3RyZWFtKHVpbnQ4X3QgcGVlcl9pZCwgdWludDhfdCogcF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmR0cFN0cmVhbUNvbmZpZyYgYXZkdHBfc3RyZWFtX2NvbmZpZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVkRUX0RlbGF5UmVwb3J0KHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IHNlaWQsIHVpbnQxNl90IGRlbGF5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWRFRfRGlzY29ubmVjdFJlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZEVF9EaXNjb3ZlclJlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGNoYW5uZWxfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRBVkRUX1NFUF9JTkZPKiBwX3NlcF9pbmZvLCB1aW50OF90IG1heF9zZXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QVZEVF9DVFJMX0NCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWRFRfR2V0Q2FwUmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQ4X3QgY2hhbm5lbF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VpZCwgQXZkdHBTZXBDb25maWcqIHBfY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgdEFWRFRfQ1RSTF9DQkFDSyogcF9jYmFjaywgYm9vbCBnZXRfYWxsX2NhcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVkRUX0dldEwyQ2FwQ2hhbm5lbCh1aW50OF90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVkRUX09wZW5SZXEodWludDhfdCBoYW5kbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2luZGV4LCB1aW50OF90IHNlaWQsCi0gICAgICAgICAgICAgICAgICAgICAgQXZkdHBTZXBDb25maWcqIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWRFRfUmVjb25maWdSZXEodWludDhfdCBoYW5kbGUsIEF2ZHRwU2VwQ29uZmlnKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVkRUX1JlbW92ZVN0cmVhbSh1aW50OF90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVkRUX1NlY3VyaXR5UmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVkRUX1NlY3VyaXR5UnNwKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSwgdWludDE2X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWRFRfU3RhcnRSZXEodWludDhfdCogcF9oYW5kbGVzLCB1aW50OF90IG51bV9oYW5kbGVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWRFRfU3VzcGVuZFJlcSh1aW50OF90KiBwX2hhbmRsZXMsIHVpbnQ4X3QgbnVtX2hhbmRsZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZEVF9Xcml0ZVJlcU9wdCh1aW50OF90IGhhbmRsZSwgQlRfSERSKiBwX3BrdCwgdWludDMyX3QgdGltZV9zdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtX3B0LCB0QVZEVF9EQVRBX09QVF9NQVNLIG9wdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEFWRFRfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEFWRFRfQWJvcnRSZXEodWludDhfdCBoYW5kbGUpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQVZEVF9EZXJlZ2lzdGVyKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQVZEVF9SZWdpc3RlcihBdmR0cFJjYiogcF9yZWcsIHRBVkRUX0NUUkxfQ0JBQ0sqIHBfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGF2ZHRfY2NiX2lkbGVfY2NiX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYXZkdF9jY2JfcmV0X2NjYl90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGF2ZHRfY2NiX3JzcF9jY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBhdmR0X3NjYl90cmFuc3BvcnRfY2hhbm5lbF90aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIHN0YWNrX2RlYnVnX2F2ZHRwX2FwaV9kdW1wKGludCBmZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19hcGkuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4NmY0YS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxNAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2ZpeGVkX3F1ZXVlLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgInN0YWNrL2F2cmMvYXZyY19pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2cmNfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdWludDE2X3QgQVZSQ19DbG9zZSh1aW50OF90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVlJDX0Nsb3NlQnJvd3NlKHVpbnQ4X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWUkNfR2V0UHJvZmlsZVZlcnNpb24oKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWUkNfTXNnUmVxKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IGN0eXBlLAotICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX3BrdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVlJDX09wZW4odWludDhfdCogcF9oYW5kbGUsIHRBVlJDX0NPTk5fQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBBVlJDX09wZW5Ccm93c2UodWludDhfdCBoYW5kbGUsIHVpbnQ4X3QgY29ubl9yb2xlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWUkNfUGFzc0NtZCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgdEFWUkNfTVNHX1BBU1MqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEFWUkNfUGFzc1JzcCh1aW50OF90IGhhbmRsZSwgdWludDhfdCBsYWJlbCwgdEFWUkNfTVNHX1BBU1MqIHBfbXNnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgYXZyY19mbHVzaF9jbWRfcSh1aW50OF90IGhhbmRsZSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBhdnJjX3Byb2Nlc3NfdGltZW91dCh2b2lkKiBkYXRhKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGF2cmNfc2VuZF9uZXh0X3ZlbmRvcl9jbWQodWludDhfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGF2cmNfc3RhcnRfY21kX3RpbWVyKHVpbnQ4X3QgaGFuZGxlLCB1aW50OF90IGxhYmVsLCB1aW50OF90IG1zZ19tYXNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19ibGRfY3QuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX2JsZF9jdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3ZmI4ZS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX2JsZF9jdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZyY19hcGkuaCIKLSNpbmNsdWRlICJhdnJjX2RlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9hdnJjL2F2cmNfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXRBVlJDX1NUUyBBVlJDX0JsZENvbW1hbmQodEFWUkNfQ09NTUFORCogcF9jbWQsIEJUX0hEUioqIHBwX3BrdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX2JsZF90Zy5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2F2cmNfYmxkX3RnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWEzM2RkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2F2cmNfYmxkX3RnLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjMKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdnJjX2FwaS5oIgotI2luY2x1ZGUgImF2cmNfZGVmcy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2F2cmMvYXZyY19pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdEFWUkNfU1RTIEFWUkNfQmxkUmVzcG9uc2UodWludDhfdCBoYW5kbGUsIHRBVlJDX1JFU1BPTlNFKiBwX3JzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUioqIHBwX3BrdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QVZSQ19TVFMgYXZyY19ibGRfZ3JvdXBfbmF2aWdhdGlvbl9yc3AodWludDE2X3QgbmF2aV9pZCwgQlRfSERSKiBwX3BrdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX3BhcnMuY3QuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19hdnJjX3BhcnMuY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWZkMmQuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19wYXJzLmN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjQKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiYXZyY19hcGkuaCIKLSNpbmNsdWRlICJhdnJjX2RlZnMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9hdnJjL2F2cmNfaW50LmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi10QVZSQ19TVFMgQVZSQ19DdHJsX1BhcnNSZXNwb25zZSh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19SRVNQT05TRSogcF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2J1ZiwgdWludDE2X3QqIGJ1Zl9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEFWUkNfU1RTIEFWUkNfUGFyc1Jlc3BvbnNlKHRBVlJDX01TRyogcF9tc2csIHRBVlJDX1JFU1BPTlNFKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50OF90KiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBidWZfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRBVlJDX1NUUyBhdnJjX3BhcnNlX25vdGlmaWNhdGlvbl9yc3AodWludDhfdCogcF9zdHJlYW0sIHVpbnQxNl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFWUkNfUkVHX05PVElGX1JTUCogcF9yc3ApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19wYXJzX3RnLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19wYXJzX3RnLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzI4OTI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2F2cmNfcGFyc190Zy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImF2cmNfYXBpLmgiCi0jaW5jbHVkZSAiYXZyY19kZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYXZyYy9hdnJjX2ludC5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdEFWUkNfU1RTIEFWUkNfQ3RybF9QYXJzQ29tbWFuZCh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19DT01NQU5EKiBwX3Jlc3VsdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QVZSQ19TVFMgQVZSQ19QYXJzQ29tbWFuZCh0QVZSQ19NU0cqIHBfbXNnLCB0QVZSQ19DT01NQU5EKiBwX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYnVmLCB1aW50MTZfdCBidWZfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2F2cmNfc2RwLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19zZHAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDI1MGIuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYXZyY19zZHAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInN0YWNrL2F2cmMvYXZyY19pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2F2cmNfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXVpbnQxNl90IEFWUkNfQWRkUmVjb3JkKHVpbnQxNl90IHNlcnZpY2VfdXVpZCwgY29uc3QgY2hhciogcF9zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwX3Byb3ZpZGVyX25hbWUsIHVpbnQxNl90IGNhdGVnb3JpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZHBfaGFuZGxlLCBib29sIGJyb3dzZV9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9maWxlX3ZlcnNpb24sIHVpbnQxNl90IGNvdmVyX2FydF9wc20pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZSQ19GaW5kU2VydmljZSh1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRBVlJDX1NEUF9EQl9QQVJBTVMqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRBVlJDX0ZJTkRfQ0JBQ0smIGZpbmRfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgQVZSQ19SZW1vdmVSZWNvcmQodWludDMyX3Qgc2RwX2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEFWUkNfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEFWUkNfSW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19ibmVwX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2JuZXBfYXBpLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2VkMWU1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2JuZXBfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjExCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRhL2luY2x1ZGUvYnRhX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2JuZXAvYm5lcF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYm5lcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg7Ci0KLXRCTkVQX1JFU1VMVCBCTkVQX0Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgcF9yZW1fYmRhLCBjb25zdCBVdWlkJiBzcmNfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXVpZCYgZHN0X3V1aWQsIHVpbnQxNl90KiBwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbXhfY2hhbl9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10Qk5FUF9SRVNVTFQgQk5FUF9Db25uZWN0UmVzcCh1aW50MTZfdCBoYW5kbGUsIHRCTkVQX1JFU1VMVCByZXNwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCTkVQX1JFU1VMVCBCTkVQX0Rpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCTkVQX1JFU1VMVCBCTkVQX1JlZ2lzdGVyKHRCTkVQX1JFR0lTVEVSKiBwX3JlZ19pbmZvKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCTkVQX1JFU1VMVCBCTkVQX1NldE11bHRpY2FzdEZpbHRlcnModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9zdGFydF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9lbmRfYXJyYXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJORVBfUkVTVUxUIEJORVBfU2V0UHJvdG9jb2xGaWx0ZXJzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX2ZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfc3RhcnRfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfZW5kX2FycmF5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCTkVQX1JFU1VMVCBCTkVQX1dyaXRlKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcF9kZXN0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2RhdGEsIHVpbnQxNl90IGxlbiwgdWludDE2X3QgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBwX3NyY19hZGRyLCBib29sIGZ3X2V4dF9wcmVzZW50KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCTkVQX1JFU1VMVCBCTkVQX1dyaXRlQnVmKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgcF9kZXN0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MqIHBfc3JjX2FkZHIsIGJvb2wgZndfZXh0X3ByZXNlbnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDhfdCBCTkVQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBCTkVQX0RlcmVnaXN0ZXIodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCTkVQX0luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQ1YzY1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqLwotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYmxlX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2NsaWVudF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi10QlRNX1NUQVRVUyBCVE1fQmxlR2V0RW5lcmd5SW5mbyh0QlRNX0JMRV9FTkVSR1lfSU5GT19DQkFDSyogcF9lbmVyX2NiYWNrKSB7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXZvaWQgQlRNX0JsZUJhY2tncm91bmRPYnNlcnZlKGJvb2wgZW5hYmxlLCB0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IpIHt9Ci12b2lkIEJUTV9CbGVSZWFkQ29udHJvbGxlckZlYXR1cmVzKHRCVE1fQkxFX0NUUkxfRkVBVFVSRVNfQ0JBQ0sqIHBfdnNjX2NiYWNrKSB7fQotdWludDhfdCBCVE1fR2V0QWNjZXB0bGlzdFNpemUoKSB7IHJldHVybiAwOyB9Ci0KLXN0cnVjdCBidG1fY2xpZW50X2ludGVyZmFjZV9zIGJ0bV9jbGllbnRfaW50ZXJmYWNlID0gewotICAgIC5laXIgPQotICAgICAgICB7Ci0gICAgICAgICAgICAuQlRNX0dldEVpclN1cHBvcnRlZFNlcnZpY2VzID0gQlRNX0dldEVpclN1cHBvcnRlZFNlcnZpY2VzLAotICAgICAgICB9LAotfTsKLQotc3RydWN0IGJ0bV9jbGllbnRfaW50ZXJmYWNlX3MmIGdldF9idG1fY2xpZW50X2ludGVyZmFjZSgpIHsKLSAgcmV0dXJuIGJ0bV9jbGllbnRfaW50ZXJmYWNlOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODI5OGYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NTAKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbDJjX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9zZWN1cml0eV9kZXZpY2VfcmVjb3JkLmgiCi0jaW5jbHVkZSAic3RhY2svY3J5cHRvX3Rvb2xib3gvY3J5cHRvX3Rvb2xib3guaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2RlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NtcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotYm9vbCBCVE1fQmxlRGF0YVNpZ25hdHVyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90KiBwX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbiwgQkxFX1NJR05BVFVSRSBzaWduYXR1cmUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQlRNX0JsZVZlcmlmeVNpZ25hdHVyZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90KiBwX29yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50MzJfdCBjb3VudGVyLCB1aW50OF90KiBwX2NvbXApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQlRNX1JlYWRDb25uZWN0ZWRUcmFuc3BvcnRBZGRyZXNzKFJhd0FkZHJlc3MqIHJlbW90ZV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBCVE1fVXNlTGVMaW5rKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRtX2JsZV9nZXRfYWNsX3JlbW90ZV9hZGRyKHVpbnQxNl90IGhjaV9oYW5kbGUsIFJhd0FkZHJlc3MmIGNvbm5fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBidG1fYmxlX2dldF9lbmNfa2V5X3R5cGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCogcF9rZXlfdHlwZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRtX2dldF9sb2NhbF9kaXYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QqIHBfZGl2KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1zdGF0aWMgT2N0ZXQxNiBvY3RldDE2OwotCi1jb25zdCBPY3RldDE2JiBCVE1fR2V0RGV2aWNlREhLKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG9jdGV0MTY7Ci19Ci1jb25zdCBPY3RldDE2JiBCVE1fR2V0RGV2aWNlRW5jUm9vdCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBvY3RldDE2OwotfQotY29uc3QgT2N0ZXQxNiYgQlRNX0dldERldmljZUlEUm9vdCgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBvY3RldDE2OwotfQotdEJUTV9TRUNfQUNUSU9OIGJ0bV9ibGVfZGV0ZXJtaW5lX3NlY3VyaXR5X2FjdChib29sIGlzX29yaWdpbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldEJsZURhdGFMZW5ndGgoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR4X3BkdV9sZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfZW5jcnlwdGlvbihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGlua19yb2xlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfc3RhcnRfZW5jcnlwdChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGJvb2wgdXNlX3N0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPY3RldDE2KiBwX3N0aykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QlRNX1NUQVRVUyBidG1fcHJvY19zbXBfY2JhY2sodFNNUF9FVlQgZXZlbnQsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9FVlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRMMkNBUF9MRV9SRVNVTFRfQ09ERSBidG1fYmxlX3N0YXJ0X3NlY19jaGVjayhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBzbSwgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBMMkNBUF9MRV9SRVNVTFRfQ09OTl9PSzsKLX0KLXVpbnQ4X3QgYnRtX2JsZV9icl9rZXlzX3JlcSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9JT19SRVEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IGJ0bV9ibGVfaW9fY2FwYWJpbGl0aWVzX3JlcSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0lPX1JFUSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgYnRtX2JsZV9yZWFkX3NlY19rZXlfc2l6ZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgQlRNX0JsZUNvbmZpcm1SZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZUxvYWRMb2NhbEtleXModWludDhfdCBrZXlfdHlwZSwgdEJUTV9CTEVfTE9DQUxfS0VZUyogcF9rZXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9CbGVPb2JEYXRhUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMsIHVpbnQ4X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZVBhc3NrZXlSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNza2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fQmxlUmVhZFBoeSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fQmxlUmVjZWl2ZXJUZXN0KHVpbnQ4X3QgcnhfZnJlcSwgdEJUTV9DTVBMX0NCKiBwX2NtZF9jbXBsX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fQmxlU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2MsIHVpbnQ4X3QqIHBfcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZVNldFBoeShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHR4X3BoeXMsIHVpbnQ4X3QgcnhfcGh5cywKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfb3B0aW9ucykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZVNldFByZWZDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IG1pbl9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jb25uX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBlcmlwaGVyYWxfbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1cGVydmlzaW9uX3RvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9CbGVUZXN0RW5kKHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZVRyYW5zbWl0dGVyVGVzdCh1aW50OF90IHR4X2ZyZXEsIHVpbnQ4X3QgdGVzdF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBhY2tldF9wYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbWRfY21wbF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX1JlYWREZXZJbmZvKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEsIHRCVF9ERVZJQ0VfVFlQRSogcF9kZXZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX1NlY0FkZEJsZURldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfREVWSUNFX1RZUEUgZGV2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fU2VjQWRkQmxlS2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVE1fTEVfS0VZX1ZBTFVFKiBwX2xlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICB0QlRNX0xFX0tFWV9UWVBFIGtleV90eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fU2VjdXJpdHlHcmFudChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9jb25uZWN0ZWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZW5jX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm9sZSwgdEJMRV9BRERSX1RZUEUgYWRkcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZHJfbWF0Y2hlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9jb25uZWN0ZWRfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZW5jX21vZGUsCi0gICAgdWludDhfdCByb2xlLCBib29sIGFkZHJfbWF0Y2hlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9pbmNyZW1lbnRfc2lnbl9jdHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBpc19sb2NhbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9saW5rX2VuY3J5cHRlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IGVuY3JfZW5hYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX2xpbmtfc2VjX2NoZWNrKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9BVVRIX1JFUSBhdXRoX3JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfUkVRX0FDVCogcF9zZWNfcmVxX2FjdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9sdGtfcmVxdWVzdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmFuZFs4XSwgdWludDE2X3QgZWRpdikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9sdGtfcmVxdWVzdF9yZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGJvb2wgdXNlX3N0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBzdGspIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfcmFuZF9lbmNfY29tcGxldGUodWludDhfdCogcCwgdWludDE2X3Qgb3BfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX1JBTkRfRU5DX0NCKiBwX2VuY19jcGx0X2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX3NldF9yYW5kb21fYWRkcmVzcyhjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX3Rlc3RfY29tbWFuZF9jb21wbGV0ZSh1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX3VwZGF0ZV9zZWNfa2V5X3NpemUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jX2tleV9zaXplKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VjX3NhdmVfbGVfa2V5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVE1fTEVfS0VZX1RZUEUga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9MRV9LRVlfVkFMVUUqIHBfa2V5cywgYm9vbCBwYXNzX3RvX2FwcGxpY2F0aW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBkb05vdGhpbmcodWludDhfdCogZGF0YSwgdWludDE2X3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCByZWFkX3BoeV9jYigKLSAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSwgdWludDhfdCBzdGF0dXMpPiBjYiwKLSAgICB1aW50OF90KiBkYXRhLCB1aW50MTZfdCBsZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2FkZHIuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2FkZHIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1N2ViZTguLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9hZGRyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYWRkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfYnRtX2JsZV9hZGRyIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgYnRtX2dlbl9yZXNvbHZlX3BhZGRyX2xvdyBidG1fZ2VuX3Jlc29sdmVfcGFkZHJfbG93Owotc3RydWN0IGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIgYnRtX2dlbl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcjsKLXN0cnVjdCBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tcwotICAgIGJ0bV9nZXRfbmV4dF9wcml2YXRlX2FkZHJyZXNzX2ludGVydmFsX21zOwotc3RydWN0IGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkciBidG1fYmxlX2luaXRfcHNldWRvX2FkZHI7Ci1zdHJ1Y3QgYnRtX2JsZV9hZGRyX3Jlc29sdmFibGUgYnRtX2JsZV9hZGRyX3Jlc29sdmFibGU7Ci1zdHJ1Y3QgYnRtX2JsZV9yZXNvbHZlX3JhbmRvbV9hZGRyIGJ0bV9ibGVfcmVzb2x2ZV9yYW5kb21fYWRkcjsKLXN0cnVjdCBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvIGJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG87Ci1zdHJ1Y3QgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkb19mcm9tX2FkZHJlc3Nfd2l0aF90eXBlCi0gICAgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkb19mcm9tX2FkZHJlc3Nfd2l0aF90eXBlOwotc3RydWN0IGJ0bV9yYW5kb21fcHNldWRvX3RvX2lkZW50aXR5X2FkZHIgYnRtX3JhbmRvbV9wc2V1ZG9fdG9faWRlbnRpdHlfYWRkcjsKLXN0cnVjdCBidG1fYmxlX3JlZnJlc2hfcGVlcl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcgotICAgIGJ0bV9ibGVfcmVmcmVzaF9wZWVyX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyOwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfYnRtX2JsZV9hZGRyCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkIGJ0bV9nZW5fcmVzb2x2ZV9wYWRkcl9sb3coY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjpidG1fZ2VuX3Jlc29sdmVfcGFkZHJfbG93KGFkZHJlc3MpOwotfQotdm9pZCBidG1fZ2VuX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyKAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjpidG1fZ2VuX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyKGNiKTsKLX0KLXVpbnQ2NF90IGJ0bV9nZXRfbmV4dF9wcml2YXRlX2FkZHJyZXNzX2ludGVydmFsX21zKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYWRkcjo6Ci0gICAgICBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tcygpOwotfQotYm9vbCBidG1fYmxlX2luaXRfcHNldWRvX2FkZHIodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgbmV3X3BzZXVkb19hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjpidG1fYmxlX2luaXRfcHNldWRvX2FkZHIoCi0gICAgICBwX2Rldl9yZWMsIG5ld19wc2V1ZG9fYWRkcik7Ci19Ci1ib29sIGJ0bV9ibGVfYWRkcl9yZXNvbHZhYmxlKGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjpidG1fYmxlX2FkZHJfcmVzb2x2YWJsZShycGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGV2X3JlYyk7Ci19Ci10QlRNX1NFQ19ERVZfUkVDKiBidG1fYmxlX3Jlc29sdmVfcmFuZG9tX2FkZHIoY29uc3QgUmF3QWRkcmVzcyYgcmFuZG9tX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYWRkcjo6YnRtX2JsZV9yZXNvbHZlX3JhbmRvbV9hZGRyKAotICAgICAgcmFuZG9tX2JkYSk7Ci19Ci1ib29sIGJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG8oUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2FkZHJfdHlwZSwgYm9vbCByZWZyZXNoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjpidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvKAotICAgICAgYmRfYWRkciwgcF9hZGRyX3R5cGUsIHJlZnJlc2gpOwotfQotYm9vbCBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvX2Zyb21fYWRkcmVzc193aXRoX3R5cGUoCi0gICAgdEJMRV9CRF9BRERSKiBhZGRyZXNzX3dpdGhfdHlwZSwgYm9vbCByZWZyZXNoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjoKLSAgICAgIGJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG9fZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICAgICAgICBhZGRyZXNzX3dpdGhfdHlwZSwgcmVmcmVzaCk7Ci19Ci1ib29sIGJ0bV9yYW5kb21fcHNldWRvX3RvX2lkZW50aXR5X2FkZHIoUmF3QWRkcmVzcyogcmFuZG9tX3BzZXVkbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2lkZW50aXR5X2FkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYWRkcjo6YnRtX3JhbmRvbV9wc2V1ZG9fdG9faWRlbnRpdHlfYWRkcigKLSAgICAgIHJhbmRvbV9wc2V1ZG8sIHBfaWRlbnRpdHlfYWRkcl90eXBlKTsKLX0KLXZvaWQgYnRtX2JsZV9yZWZyZXNoX3BlZXJfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIoCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgcHNldWRvX2JkYSwgY29uc3QgUmF3QWRkcmVzcyYgcnBhLAotICAgIHRCVE1fU0VDX0JMRTo6dEFERFJFU1NfVFlQRSBycmFfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9hZGRyOjpidG1fYmxlX3JlZnJlc2hfcGVlcl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcigKLSAgICAgIHBzZXVkb19iZGEsIHJwYSwgcnJhX3R5cGUpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9hZGRyLmggYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2FkZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyMDk1My4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2FkZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTAKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+ICAvLyBSZXBlYXRpbmdDYWxsYmFjawotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIHRoZSBpbmNsdXNpb24gc2V0LgotLy8KLSNpbmNsdWRlICJzdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oIgotI2luY2x1ZGUgInR5cGVzL2JsZV9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfYWRkciB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBidG1fZ2VuX3Jlc29sdmVfcGFkZHJfbG93Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fZ2VuX3Jlc29sdmVfcGFkZHJfbG93IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpPiBib2R5ewotICAgICAgW10oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgeyBib2R5KGFkZHJlc3MpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2dlbl9yZXNvbHZlX3BhZGRyX2xvdyBidG1fZ2VuX3Jlc29sdmVfcGFkZHJfbG93OwotLy8gTmFtZTogYnRtX2dlbl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcgotLy8gUGFyYW1zOiAgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJik+IGNiCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2dlbl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmKT4gY2IpPiBib2R5ewotICAgICAgW10oYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBSYXdBZGRyZXNzJik+IGNiKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmKT4gY2IpIHsgYm9keShjYik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fZ2VuX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyIGJ0bV9nZW5fcmVzb2x2YWJsZV9wcml2YXRlX2FkZHI7Ci0vLyBOYW1lOiBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tcwotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogdWludDY0X3QKLXN0cnVjdCBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDY0X3QoKT4gYm9keXtbXSgpIHsgcmV0dXJuIDA7IH19OwotICB1aW50NjRfdCBvcGVyYXRvcigpKCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2dldF9uZXh0X3ByaXZhdGVfYWRkcnJlc3NfaW50ZXJ2YWxfbXMKLSAgICBidG1fZ2V0X25leHRfcHJpdmF0ZV9hZGRycmVzc19pbnRlcnZhbF9tczsKLS8vIE5hbWU6IGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkcgotLy8gUGFyYW1zOiB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsIGNvbnN0IFJhd0FkZHJlc3MmIG5ld19wc2V1ZG9fYWRkcgotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkciB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBuZXdfcHNldWRvX2FkZHIpPgotICAgICAgYm9keXtbXSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMsIGNvbnN0IFJhd0FkZHJlc3MmIG5ld19wc2V1ZG9fYWRkcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIG5ld19wc2V1ZG9fYWRkcikgewotICAgIHJldHVybiBib2R5KHBfZGV2X3JlYywgbmV3X3BzZXVkb19hZGRyKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfaW5pdF9wc2V1ZG9fYWRkciBidG1fYmxlX2luaXRfcHNldWRvX2FkZHI7Ci0vLyBOYW1lOiBidG1fYmxlX2FkZHJfcmVzb2x2YWJsZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBycGEsIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYwotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0bV9ibGVfYWRkcl9yZXNvbHZhYmxlIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBycGEsIHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICAgIHJldHVybiBib2R5KHJwYSwgcF9kZXZfcmVjKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfYWRkcl9yZXNvbHZhYmxlIGJ0bV9ibGVfYWRkcl9yZXNvbHZhYmxlOwotLy8gTmFtZTogYnRtX2JsZV9yZXNvbHZlX3JhbmRvbV9hZGRyCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJhbmRvbV9iZGEKLS8vIFJldHVybnM6IHRCVE1fU0VDX0RFVl9SRUMqCi1zdHJ1Y3QgYnRtX2JsZV9yZXNvbHZlX3JhbmRvbV9hZGRyIHsKLSAgc3RkOjpmdW5jdGlvbjx0QlRNX1NFQ19ERVZfUkVDKihjb25zdCBSYXdBZGRyZXNzJiByYW5kb21fYmRhKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHJhbmRvbV9iZGEpIHsgcmV0dXJuIG51bGxwdHI7IH19OwotICB0QlRNX1NFQ19ERVZfUkVDKiBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJhbmRvbV9iZGEpIHsKLSAgICByZXR1cm4gYm9keShyYW5kb21fYmRhKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcmVzb2x2ZV9yYW5kb21fYWRkciBidG1fYmxlX3Jlc29sdmVfcmFuZG9tX2FkZHI7Ci0vLyBOYW1lOiBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvCi0vLyBQYXJhbXM6IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQ4X3QqIHBfYWRkcl90eXBlLCBib29sIHJlZnJlc2gKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQ4X3QqIHBfYWRkcl90eXBlLCBib29sIHJlZnJlc2gpPgotICAgICAgYm9keXtbXShSYXdBZGRyZXNzKiBiZF9hZGRyLCB1aW50OF90KiBwX2FkZHJfdHlwZSwgYm9vbCByZWZyZXNoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH19OwotICBib29sIG9wZXJhdG9yKCkoUmF3QWRkcmVzcyogYmRfYWRkciwgdWludDhfdCogcF9hZGRyX3R5cGUsIGJvb2wgcmVmcmVzaCkgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHBfYWRkcl90eXBlLCByZWZyZXNoKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9pZGVudGl0eV9hZGRyX3RvX3JhbmRvbV9wc2V1ZG8KLSAgICBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvOwotLy8gTmFtZTogYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkb19mcm9tX2FkZHJlc3Nfd2l0aF90eXBlCi0vLyBQYXJhbXM6ICB0QkxFX0JEX0FERFIqIGFkZHJlc3Nfd2l0aF90eXBlLCBib29sIHJlZnJlc2gKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidG1faWRlbnRpdHlfYWRkcl90b19yYW5kb21fcHNldWRvX2Zyb21fYWRkcmVzc193aXRoX3R5cGUgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodEJMRV9CRF9BRERSKiBhZGRyZXNzX3dpdGhfdHlwZSwgYm9vbCByZWZyZXNoKT4gYm9keXsKLSAgICAgIFtdKHRCTEVfQkRfQUREUiogYWRkcmVzc193aXRoX3R5cGUsIGJvb2wgcmVmcmVzaCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodEJMRV9CRF9BRERSKiBhZGRyZXNzX3dpdGhfdHlwZSwgYm9vbCByZWZyZXNoKSB7Ci0gICAgcmV0dXJuIGJvZHkoYWRkcmVzc193aXRoX3R5cGUsIHJlZnJlc2gpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkb19mcm9tX2FkZHJlc3Nfd2l0aF90eXBlCi0gICAgYnRtX2lkZW50aXR5X2FkZHJfdG9fcmFuZG9tX3BzZXVkb19mcm9tX2FkZHJlc3Nfd2l0aF90eXBlOwotLy8gTmFtZTogYnRtX3JhbmRvbV9wc2V1ZG9fdG9faWRlbnRpdHlfYWRkcgotLy8gUGFyYW1zOiBSYXdBZGRyZXNzKiByYW5kb21fcHNldWRvLCB1aW50OF90KiBwX2lkZW50aXR5X2FkZHJfdHlwZQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0bV9yYW5kb21fcHNldWRvX3RvX2lkZW50aXR5X2FkZHIgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woUmF3QWRkcmVzcyogcmFuZG9tX3BzZXVkbywKLSAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFKiBwX2lkZW50aXR5X2FkZHJfdHlwZSk+Ci0gICAgICBib2R5e1tdKFJhd0FkZHJlc3MqIHJhbmRvbV9wc2V1ZG8sIHRCTEVfQUREUl9UWVBFKiBwX2lkZW50aXR5X2FkZHJfdHlwZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKFJhd0FkZHJlc3MqIHJhbmRvbV9wc2V1ZG8sCi0gICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSogcF9pZGVudGl0eV9hZGRyX3R5cGUpIHsKLSAgICByZXR1cm4gYm9keShyYW5kb21fcHNldWRvLCBwX2lkZW50aXR5X2FkZHJfdHlwZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fcmFuZG9tX3BzZXVkb190b19pZGVudGl0eV9hZGRyCi0gICAgYnRtX3JhbmRvbV9wc2V1ZG9fdG9faWRlbnRpdHlfYWRkcjsKLS8vIE5hbWU6IGJ0bV9ibGVfcmVmcmVzaF9wZWVyX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyCi0vLyBQYXJhbXM6ICBjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYmRhLCBjb25zdCBSYXdBZGRyZXNzJiBycGEsCi0vLyB0QlRNX1NFQ19CTEU6OnRBRERSRVNTX1RZUEUgcnJhX3R5cGUgUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfcmVmcmVzaF9wZWVyX3Jlc29sdmFibGVfcHJpdmF0ZV9hZGRyIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19iZGEsIGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwKLSAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0JMRTo6dEFERFJFU1NfVFlQRSBycmFfdHlwZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHBzZXVkb19iZGEsIGNvbnN0IFJhd0FkZHJlc3MmIHJwYSwKLSAgICAgICAgICAgICAgdEJUTV9TRUNfQkxFOjp0QUREUkVTU19UWVBFIHJyYV90eXBlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwc2V1ZG9fYmRhLCBjb25zdCBSYXdBZGRyZXNzJiBycGEsCi0gICAgICAgICAgICAgICAgICB0QlRNX1NFQ19CTEU6OnRBRERSRVNTX1RZUEUgcnJhX3R5cGUpIHsKLSAgICBib2R5KHBzZXVkb19iZGEsIHJwYSwgcnJhX3R5cGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9yZWZyZXNoX3BlZXJfcmVzb2x2YWJsZV9wcml2YXRlX2FkZHIKLSAgICBidG1fYmxlX3JlZnJlc2hfcGVlcl9yZXNvbHZhYmxlX3ByaXZhdGVfYWRkcjsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfYWRkcgotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2Fkdl9maWx0ZXIuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2Fkdl9maWx0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNGY2Y2UuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9hZHZfZmlsdGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJiaW5kX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJidG1fYmxlX2FwaS5oIgotI2luY2x1ZGUgImJ0dS5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInV0aWxzL2luY2x1ZGUvYnRfdXRpbHMuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXZvaWQgQlRNX0JsZUFkdkZpbHRlclBhcmFtU2V0dXAoCi0gICAgdEJUTV9CTEVfU0NBTl9DT05EX09QIGFjdGlvbiwgdEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxidGdhdHRfZmlsdF9wYXJhbV9zZXR1cF90PiBwX2ZpbHRfcGFyYW1zLAotICAgIHRCVE1fQkxFX1BGX1BBUkFNX0NCIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fQmxlRW5hYmxlRGlzYWJsZUZpbHRlckZlYXR1cmUodWludDhfdCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9QRl9TVEFUVVNfQ0JBQ0sgcF9zdGF0X2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fTEVfUEZfY2xlYXIodEJUTV9CTEVfUEZfRklMVF9JTkRFWCBmaWx0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fTEVfUEZfc2V0KHRCVE1fQkxFX1BGX0ZJTFRfSU5ERVggZmlsdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBcGNmQ29tbWFuZD4gY29tbWFuZHMsCi0gICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUEZfQ0ZHX0NCQUNLIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX2Fkdl9maWx0ZXJfaW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2FkdmVydGlzZXJfaGNpX2ludGVyZmFjZS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc0MTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjUKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19idG1fYmxlX2FkdmVydGlzZXJfaGNpX2ludGVyZmFjZSB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGJ0bV9sZV9vbl9hZHZlcnRpc2luZ19zZXRfdGVybWluYXRlZAotICAgIGJ0bV9sZV9vbl9hZHZlcnRpc2luZ19zZXRfdGVybWluYXRlZDsKLXN0cnVjdCBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5Ci0gICAgYnRtX2JsZV9hZHZlcnRpc2VyX25vdGlmeV90ZXJtaW5hdGVkX2xlZ2FjeTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkIGJ0bV9sZV9vbl9hZHZlcnRpc2luZ19zZXRfdGVybWluYXRlZCh1aW50OF90KiBwLCB1aW50MTZfdCBsZW5ndGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlOjoKLSAgICAgIGJ0bV9sZV9vbl9hZHZlcnRpc2luZ19zZXRfdGVybWluYXRlZChwLCBsZW5ndGgpOwotfQotdm9pZCBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5KHVpbnQ4X3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX2FkdmVydGlzZXJfaGNpX2ludGVyZmFjZTo6Ci0gICAgICBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5KHN0YXR1cywgY29ubmVjdGlvbl9oYW5kbGUpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaCBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZmVmNzEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo1Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSAic3RhY2svYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfYnRtX2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogYnRtX2xlX29uX2FkdmVydGlzaW5nX3NldF90ZXJtaW5hdGVkCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAsIHVpbnQxNl90IGxlbmd0aAotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9sZV9vbl9hZHZlcnRpc2luZ19zZXRfdGVybWluYXRlZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwLCB1aW50MTZfdCBsZW5ndGgpPiBib2R5ewotICAgICAgW10odWludDhfdCogcCwgdWludDE2X3QgbGVuZ3RoKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90KiBwLCB1aW50MTZfdCBsZW5ndGgpIHsgYm9keShwLCBsZW5ndGgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2xlX29uX2FkdmVydGlzaW5nX3NldF90ZXJtaW5hdGVkCi0gICAgYnRtX2xlX29uX2FkdmVydGlzaW5nX3NldF90ZXJtaW5hdGVkOwotLy8gTmFtZTogYnRtX2JsZV9hZHZlcnRpc2VyX25vdGlmeV90ZXJtaW5hdGVkX2xlZ2FjeQotLy8gUGFyYW1zOiB1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90IHN0YXR1cywgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSkgewotICAgIGJvZHkoc3RhdHVzLCBjb25uZWN0aW9uX2hhbmRsZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX2FkdmVydGlzZXJfbm90aWZ5X3Rlcm1pbmF0ZWRfbGVnYWN5Ci0gICAgYnRtX2JsZV9hZHZlcnRpc2VyX25vdGlmeV90ZXJtaW5hdGVkX2xlZ2FjeTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfYWR2ZXJ0aXNlcl9oY2lfaW50ZXJmYWNlCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYmF0Y2hzY2FuLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9iYXRjaHNjYW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODhlMWQuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9iYXRjaHNjYW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImJ0bV9ibGVfYXBpLmgiCi0jaW5jbHVkZSAiYnR1LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBCVE1fQmxlRGlzYWJsZUJhdGNoU2NhbihiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QpPiBjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZUVuYWJsZUJhdGNoU2Nhbih0QlRNX0JMRV9CQVRDSF9TQ0FOX01PREUgc2Nhbl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIGFkZHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9ESVNDQVJEX1JVTEUgZGlzY2FyZF9ydWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fQmxlUmVhZFNjYW5SZXBvcnRzKHRCVE1fQkxFX0JBVENIX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfU0NBTl9SRVBfQ0JBQ0sgY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9CbGVTZXRTdG9yYWdlQ29uZmlnKHVpbnQ4X3QgYmF0Y2hfc2Nhbl9mdWxsX21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYXRjaF9zY2FuX3RydW5jX21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCk+IGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TQ0FOX1RIUkVTSE9MRF9DQkFDSyogcF90aHJlc19jYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0JsZVRyYWNrQWR2ZXJ0aXNlcih0QlRNX0JMRV9UUkFDS19BRFZfQ0JBQ0sqIHBfdHJhY2tfY2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9CTEVfUkVGX1ZBTFVFIHJlZl92YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9iYXRjaHNjYW5faW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2JnY29ubi5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYmdjb25uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOThiNjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYmdjb25uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMQotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYmdjb25uLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci1zdHJ1Y3QgQmFja2dyb3VuZENvbm5lY3Rpb24ge307Ci1zdHJ1Y3QgQmdDb25uSGFzaCB7fTsKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfYmdjb25uIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgY29udmVydF90b19hZGRyZXNzX3dpdGhfdHlwZSBjb252ZXJ0X3RvX2FkZHJlc3Nfd2l0aF90eXBlOwotc3RydWN0IGJ0bV91cGRhdGVfc2Nhbm5lcl9maWx0ZXJfcG9saWN5IGJ0bV91cGRhdGVfc2Nhbm5lcl9maWx0ZXJfcG9saWN5Owotc3RydWN0IGJ0bV9ibGVfYmdjb25uX2NhbmNlbF9pZl9kaXNjb25uZWN0ZWQKLSAgICBidG1fYmxlX2JnY29ubl9jYW5jZWxfaWZfZGlzY29ubmVjdGVkOwotc3RydWN0IGJ0bV9ibGVfc3VzcGVuZF9iZ19jb25uIGJ0bV9ibGVfc3VzcGVuZF9iZ19jb25uOwotc3RydWN0IGJ0bV9ibGVfcmVzdW1lX2JnX2Nvbm4gYnRtX2JsZV9yZXN1bWVfYmdfY29ubjsKLXN0cnVjdCBCVE1fQmFja2dyb3VuZENvbm5lY3RBZGRyZXNzS25vd24gQlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duOwotc3RydWN0IEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0IEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0Owotc3RydWN0IEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9TbG93IEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9TbG93Owotc3RydWN0IEJUTV9BY2NlcHRsaXN0QWRkIEJUTV9BY2NlcHRsaXN0QWRkOwotc3RydWN0IEJUTV9BY2NlcHRsaXN0UmVtb3ZlIEJUTV9BY2NlcHRsaXN0UmVtb3ZlOwotc3RydWN0IEJUTV9BY2NlcHRsaXN0Q2xlYXIgQlRNX0FjY2VwdGxpc3RDbGVhcjsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfYmdjb25uCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci1jb25zdCB0QkxFX0JEX0FERFIgY29udmVydF90b19hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX2JnY29ubjo6Y29udmVydF90b19hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICAgIGJkX2FkZHIsIHBfZGV2X3JlYyk7Ci19Ci12b2lkIGJ0bV91cGRhdGVfc2Nhbm5lcl9maWx0ZXJfcG9saWN5KHRCVE1fQkxFX1NGUCBzY2FuX3BvbGljeSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9iZ2Nvbm46OmJ0bV91cGRhdGVfc2Nhbm5lcl9maWx0ZXJfcG9saWN5KAotICAgICAgc2Nhbl9wb2xpY3kpOwotfQotdm9pZCBidG1fYmxlX2JnY29ubl9jYW5jZWxfaWZfZGlzY29ubmVjdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYmdjb25uOjpidG1fYmxlX2JnY29ubl9jYW5jZWxfaWZfZGlzY29ubmVjdGVkKAotICAgICAgYmRfYWRkcik7Ci19Ci1ib29sIGJ0bV9ibGVfc3VzcGVuZF9iZ19jb25uKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX2JnY29ubjo6YnRtX2JsZV9zdXNwZW5kX2JnX2Nvbm4oKTsKLX0KLWJvb2wgYnRtX2JsZV9yZXN1bWVfYmdfY29ubih2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9iZ2Nvbm46OmJ0bV9ibGVfcmVzdW1lX2JnX2Nvbm4oKTsKLX0KLWJvb2wgQlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX2JnY29ubjo6QlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duKAotICAgICAgYWRkcmVzcyk7Ci19Ci1ib29sIEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9GYXN0KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYmdjb25uOjpCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdCgpOwotfQotdm9pZCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfYmdjb25uOjpCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdygpOwotfQotYm9vbCBCVE1fQWNjZXB0bGlzdEFkZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9iZ2Nvbm46OkJUTV9BY2NlcHRsaXN0QWRkKGFkZHJlc3MpOwotfQotdm9pZCBCVE1fQWNjZXB0bGlzdFJlbW92ZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX2JnY29ubjo6QlRNX0FjY2VwdGxpc3RSZW1vdmUoYWRkcmVzcyk7Ci19Ci12b2lkIEJUTV9BY2NlcHRsaXN0Q2xlYXIoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX2JnY29ubjo6QlRNX0FjY2VwdGxpc3RDbGVhcigpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9iZ2Nvbm4uaCBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfYmdjb25uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTMwOGQuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9iZ2Nvbm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL3NlY3VyaXR5X2RldmljZV9yZWNvcmQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19idG1fYmxlX2JnY29ubiB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBjb252ZXJ0X3RvX2FkZHJlc3Nfd2l0aF90eXBlCi0vLyBQYXJhbXM6ICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBjb25zdCB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMKLS8vIFJldHVybnM6IGNvbnN0IHRCTEVfQkRfQUREUgotc3RydWN0IGNvbnZlcnRfdG9fYWRkcmVzc193aXRoX3R5cGUgewotICB0QkxFX0JEX0FERFIgYmxlX2JkX2FkZHI7Ci0gIHN0ZDo6ZnVuY3Rpb248Y29uc3QgdEJMRV9CRF9BRERSKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk+Ci0gICAgICBib2R5e1t0aGlzXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgY29uc3QgdEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7IHJldHVybiBibGVfYmRfYWRkcjsgfX07Ci0gIGNvbnN0IHRCTEVfQkRfQUREUiBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHBfZGV2X3JlYyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBjb252ZXJ0X3RvX2FkZHJlc3Nfd2l0aF90eXBlIGNvbnZlcnRfdG9fYWRkcmVzc193aXRoX3R5cGU7Ci0vLyBOYW1lOiBidG1fdXBkYXRlX3NjYW5uZXJfZmlsdGVyX3BvbGljeQotLy8gUGFyYW1zOiB0QlRNX0JMRV9TRlAgc2Nhbl9wb2xpY3kKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fdXBkYXRlX3NjYW5uZXJfZmlsdGVyX3BvbGljeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QlRNX0JMRV9TRlAgc2Nhbl9wb2xpY3kpPiBib2R5ewotICAgICAgW10odEJUTV9CTEVfU0ZQIHNjYW5fcG9saWN5KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRNX0JMRV9TRlAgc2Nhbl9wb2xpY3kpIHsgYm9keShzY2FuX3BvbGljeSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fdXBkYXRlX3NjYW5uZXJfZmlsdGVyX3BvbGljeSBidG1fdXBkYXRlX3NjYW5uZXJfZmlsdGVyX3BvbGljeTsKLS8vIE5hbWU6IGJ0bV9ibGVfYmdjb25uX2NhbmNlbF9pZl9kaXNjb25uZWN0ZWQKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfYmdjb25uX2NhbmNlbF9pZl9kaXNjb25uZWN0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcik+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7IGJvZHkoYmRfYWRkcik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX2JnY29ubl9jYW5jZWxfaWZfZGlzY29ubmVjdGVkCi0gICAgYnRtX2JsZV9iZ2Nvbm5fY2FuY2VsX2lmX2Rpc2Nvbm5lY3RlZDsKLS8vIE5hbWU6IGJ0bV9ibGVfc3VzcGVuZF9iZ19jb25uCi0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidG1fYmxlX3N1c3BlbmRfYmdfY29ubiB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh2b2lkKT4gYm9keXtbXSh2b2lkKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh2b2lkKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX3N1c3BlbmRfYmdfY29ubiBidG1fYmxlX3N1c3BlbmRfYmdfY29ubjsKLS8vIE5hbWU6IGJ0bV9ibGVfcmVzdW1lX2JnX2Nvbm4KLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0bV9ibGVfcmVzdW1lX2JnX2Nvbm4gewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodm9pZCk+IGJvZHl7W10odm9pZCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodm9pZCkgeyByZXR1cm4gYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9yZXN1bWVfYmdfY29ubiBidG1fYmxlX3Jlc3VtZV9iZ19jb25uOwotLy8gTmFtZTogQlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBCVE1fQmFja2dyb3VuZENvbm5lY3RBZGRyZXNzS25vd24gewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcyk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7IHJldHVybiBib2R5KGFkZHJlc3MpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgQlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duCi0gICAgQlRNX0JhY2tncm91bmRDb25uZWN0QWRkcmVzc0tub3duOwotLy8gTmFtZTogQlRNX1NldExlQ29ubmVjdGlvbk1vZGVUb0Zhc3QKLS8vIFBhcmFtczoKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBib2R5e1tdKCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoKSB7IHJldHVybiBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvRmFzdDsKLS8vIE5hbWU6IEJUTV9TZXRMZUNvbm5lY3Rpb25Nb2RlVG9TbG93Ci0vLyBQYXJhbXM6Ci0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgQlRNX1NldExlQ29ubmVjdGlvbk1vZGVUb1Nsb3cgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdyBCVE1fU2V0TGVDb25uZWN0aW9uTW9kZVRvU2xvdzsKLS8vIE5hbWU6IEJUTV9BY2NlcHRsaXN0QWRkCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBCVE1fQWNjZXB0bGlzdEFkZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsgcmV0dXJuIGJvZHkoYWRkcmVzcyk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fQWNjZXB0bGlzdEFkZCBCVE1fQWNjZXB0bGlzdEFkZDsKLS8vIE5hbWU6IEJUTV9BY2NlcHRsaXN0UmVtb3ZlCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBCVE1fQWNjZXB0bGlzdFJlbW92ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MpIHsgYm9keShhZGRyZXNzKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEJUTV9BY2NlcHRsaXN0UmVtb3ZlIEJUTV9BY2NlcHRsaXN0UmVtb3ZlOwotLy8gTmFtZTogQlRNX0FjY2VwdGxpc3RDbGVhcgotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEJUTV9BY2NlcHRsaXN0Q2xlYXIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYm9keXtbXSgpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKCkgeyBib2R5KCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBCVE1fQWNjZXB0bGlzdENsZWFyIEJUTV9BY2NlcHRsaXN0Q2xlYXI7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGFja19idG1fYmxlX2JnY29ubgotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX2dhcC5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfZ2FwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTM4NmE3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfZ2FwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0NwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYnRtX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvbG9nLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9ibGVfaW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FkdmVydGlzZV9kYXRhX3BhcnNlci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2FwaV90eXBlcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvZ2FwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGNpX2Vycm9yX2NvZGUuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2lucV9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotYm9vbCBCVE1fQmxlQ29uZmlnUHJpdmFjeShib29sIHByaXZhY3lfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBCVE1fQmxlTG9jYWxQcml2YWN5RW5hYmxlZCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJ0bV9ibGVfY2FuY2VsX3JlbW90ZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRtX2JsZV9jbGVhcl90b3BvbG9neV9tYXNrKHRCVE1fQkxFX1NUQVRFX01BU0sgcmVxdWVzdF9zdGF0ZV9tYXNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJ0bV9ibGVfc2V0X3RvcG9sb2d5X21hc2sodEJUTV9CTEVfU1RBVEVfTUFTSyByZXF1ZXN0X3N0YXRlX21hc2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRtX2JsZV90b3BvbG9neV9jaGVjayh0QlRNX0JMRV9TVEFURV9NQVNLIHJlcXVlc3Rfc3RhdGVfbWFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdEJUTV9TVEFUVVMgQlRNX0JsZU9ic2VydmUoYm9vbCBzdGFydCwgdWludDhfdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci12b2lkIEJUTV9CbGVPcHBvcnR1bmlzdGljT2JzZXJ2ZShib29sIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fSU5RX1JFU1VMVFNfQ0IqIHBfcmVzdWx0c19jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfcmVhZF9yZW1vdGVfbmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfY29ubmVjdGFiaWxpdHkodWludDE2X3QgY29tYmluZWRfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYnRtX2JsZV9zZXRfZGlzY292ZXJhYmlsaXR5KHVpbnQxNl90IGNvbWJpbmVkX21vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfc3RhcnRfYWR2KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9ibGVfc3RhcnRfaW5xdWlyeSh1aW50OF90IGR1cmF0aW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBidG1fYmxlX3N0b3BfYWR2KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXVpbnQxNl90IEJUTV9CbGVSZWFkQ29ubmVjdGFiaWxpdHkoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEJUTV9CbGVSZWFkRGlzY292ZXJhYmlsaXR5KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEJUTV9CbGVNYXhNdWx0aUFkdkluc3RhbmNlQ291bnQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEJUTV9CbGVHZXREeW5hbWljQXVkaW9CdWZmZXIoCi0gICAgdEJUTV9CVF9EWU5BTUlDX0FVRElPX0JVRkZFUl9DQiBwX2R5bmFtaWNfYXVkaW9fYnVmZmVyX2NiW10pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9CbGVHZXRWZW5kb3JDYXBhYmlsaXRpZXModEJUTV9CTEVfVlNDX0NCKiBwX2Ntbl92c2NfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9CbGVTZXRTY2FuUGFyYW1zKHVpbnQzMl90IHNjYW5faW50ZXJ2YWwsIHVpbnQzMl90IHNjYW5fd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICB0QkxFX1NDQU5fTU9ERSBzY2FuX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCk+IGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX2RlY3JlbWVudF9saW5rX3RvcG9sb2d5X21hc2sodWludDhfdCBsaW5rX3JvbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfZGlyX2Fkdl90b3V0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX2JsZV9mcmVlKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidG1fYmxlX2luY3JlbWVudF9saW5rX3RvcG9sb2d5X21hc2sodWludDhfdCBsaW5rX3JvbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfaW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19hZHZfYWRkcihSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGFkZHJfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9wcm9jZXNzX2Fkdl9wa3QodWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9wcm9jZXNzX2Fkdl9wa3RfY29udCh1aW50MTZfdCBldnRfdHlwZSwgdWludDhfdCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90IHByaW1hcnlfcGh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwgaW50OF90IHR4X3Bvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByc3NpLCB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19hZHZfcGt0X2NvbnRfZm9yX2lucXVpcnkoCi0gICAgdWludDE2X3QgZXZ0X3R5cGUsIHVpbnQ4X3QgYWRkcl90eXBlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgdWludDhfdCBwcmltYXJ5X3BoeSwgdWludDhfdCBzZWNvbmRhcnlfcGh5LCB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwKLSAgICBpbnQ4X3QgdHhfcG93ZXIsIGludDhfdCByc3NpLCB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50LAotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzaW5nX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19leHRfYWR2X3BrdCh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGh5X3VwZGF0ZV9wa3QodWludDhfdCBsZW4sIHVpbnQ4X3QqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfcmVhZF9yZW1vdGVfZmVhdHVyZXNfY29tcGxldGUodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9yZWFkX3JlbW90ZV9uYW1lX2NtcGwoYm9vbCBzdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoLCBjaGFyKiBwX25hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfc2V0X2Fkdl9mbGFnKHVpbnQxNl90IGNvbm5lY3RfbW9kZSwgdWludDE2X3QgZGlzY19tb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fYmxlX3N0YXJ0X3NjYW4oKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9ibGVfc3RvcF9pbnF1aXJ5KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX2JsZV9zdG9wX3NjYW4odm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidG1fYmxlX3VwZGF0ZV9kbXRfZmxhZ19iaXRzKHVpbnQ4X3QqIGFkdl9mbGFnX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90IGNvbm5lY3RfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBkaXNjX21vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9ibGVfdXBkYXRlX2lucV9yZXN1bHQodElOUV9EQl9FTlQqIHBfaSwgdWludDhfdCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50MTZfdCBldnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHByaW1hcnlfcGh5LCB1aW50OF90IHNlY29uZGFyeV9waHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsIGludDhfdCB0eF9wb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgcnNzaSwgdWludDE2X3QgcGVyaW9kaWNfYWR2X2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb25zdCYgZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV91cGRhdGVfbW9kZV9vcGVyYXRpb24odWludDhfdCBsaW5rX3JvbGUsIGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV93cml0ZV9hZHZfZW5hYmxlX2NvbXBsZXRlKHVpbnQ4X3QqIHApIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9jbGVhcl9hbGxfcGVuZGluZ19sZV9lbnRyeSh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VuZF9oY2lfc2V0X3NjYW5fcGFyYW1zKHVpbnQ4X3Qgc2Nhbl90eXBlLCB1aW50MTZfdCBzY2FuX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzY2FuX3dpbiwgdWludDhfdCBhZGRyX3R5cGVfb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Nhbl9maWx0ZXJfcG9saWN5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9tdWx0aV9hZHYuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX211bHRpX2Fkdi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmMjVlZC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX211bHRpX2Fkdi5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2xvY2F0aW9uLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9tZW1vcnkvd2Vha19wdHIuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGJhc2UvdGltZS90aW1lLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImJpbmRfaGVscGVycy5oIgotI2luY2x1ZGUgImJsZV9hZHZlcnRpc2VyLmgiCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsYXJtLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2JsZV9hZHZlcnRpc2VyX2hjaV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2ludF90eXBlcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdm9pZCBCbGVBZHZlcnRpc2luZ01hbmFnZXI6OkNsZWFuVXAoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9ibGVfYWR2X2luaXQoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci1iYXNlOjpXZWFrUHRyPEJsZUFkdmVydGlzaW5nTWFuYWdlcj4gQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpHZXQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWJvb2wgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpJc0luaXRpYWxpemVkKCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdm9pZCB0ZXN0X3RpbWVvdXRfY2IodWludDhfdCBzdGF0dXMpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQmxlQWR2ZXJ0aXNpbmdNYW5hZ2VyOjpJbml0aWFsaXplKEJsZUFkdmVydGlzZXJIY2lJbnRlcmZhY2UqIGludGVyZmFjZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2JsZV9tdWx0aV9hZHZfY2xlYW51cCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIHRlc3RSZWNvbXB1dGVUaW1lb3V0MSgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgdGVzdFJlY29tcHV0ZVRpbWVvdXQyKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCB0ZXN0UmVjb21wdXRlVGltZW91dDMoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3ByaXZhY3kuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3ByaXZhY3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJhMGUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9wcml2YWN5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMwotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfcHJpdmFjeS5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfcHJpdmFjeSB7Ci0KLS8vIEZ1bmN0aW9uIHN0YXRlIGNhcHR1cmUgYW5kIHJldHVybiB2YWx1ZXMsIGlmIG5lZWRlZAotc3RydWN0IGJ0bV9ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3RfY29tcGxldGUKLSAgICBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0X2NvbXBsZXRlOwotc3RydWN0IGJ0bV9ibGVfYWRkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlCi0gICAgYnRtX2JsZV9hZGRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGU7Ci1zdHJ1Y3QgYnRtX2JsZV9yZW1vdmVfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUKLSAgICBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZTsKLXN0cnVjdCBidG1fYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUKLSAgICBidG1fYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGU7Ci1zdHJ1Y3QgYnRtX2JsZV9yZW1vdmVfcmVzb2x2aW5nX2xpc3RfZW50cnkgYnRtX2JsZV9yZW1vdmVfcmVzb2x2aW5nX2xpc3RfZW50cnk7Ci1zdHJ1Y3QgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdCBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0Owotc3RydWN0IGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeSBidG1fYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3RfZW50cnk7Ci1zdHJ1Y3QgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0IGJ0bV9ibGVfZGlzYWJsZV9yZXNvbHZpbmdfbGlzdDsKLXN0cnVjdCBidG1fYmxlX3Jlc29sdmluZ19saXN0X2xvYWRfZGV2IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfbG9hZF9kZXY7Ci1zdHJ1Y3QgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9yZW1vdmVfZGV2IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfcmVtb3ZlX2RldjsKLXN0cnVjdCBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdCBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdDsKLXN0cnVjdCBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm0KLSAgICBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm07Ci1zdHJ1Y3QgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9pbml0IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdDsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfcHJpdmFjeQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdm9pZCBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0X2NvbXBsZXRlKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfcHJpdmFjeTo6YnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdF9jb21wbGV0ZSgKLSAgICAgIHAsIGV2dF9sZW4pOwotfQotdm9pZCBidG1fYmxlX2FkZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZSh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX3ByaXZhY3k6OmJ0bV9ibGVfYWRkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKAotICAgICAgcCwgZXZ0X2xlbik7Ci19Ci12b2lkIGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfcHJpdmFjeTo6Ci0gICAgICBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZShwLCBldnRfbGVuKTsKLX0KLXZvaWQgYnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfcHJpdmFjeTo6YnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlKAotICAgICAgcCwgZXZ0X2xlbik7Ci19Ci10QlRNX1NUQVRVUyBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX3ByaXZhY3k6OmJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5KAotICAgICAgcF9kZXZfcmVjKTsKLX0KLXZvaWQgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX3ByaXZhY3k6OmJ0bV9ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3QoKTsKLX0KLWJvb2wgYnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5KHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfcHJpdmFjeTo6YnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5KAotICAgICAgcF9kZXZfcmVjKTsKLX0KLWJvb2wgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0KHVpbnQ4X3QgcmxfbWFzaywgYm9vbCB0b19yZXN1bWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19idG1fYmxlX3ByaXZhY3k6OmJ0bV9ibGVfZGlzYWJsZV9yZXNvbHZpbmdfbGlzdCgKLSAgICAgIHJsX21hc2ssIHRvX3Jlc3VtZSk7Ci19Ci1ib29sIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfbG9hZF9kZXYodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9wcml2YWN5OjpidG1fYmxlX3Jlc29sdmluZ19saXN0X2xvYWRfZGV2KAotICAgICAgcF9kZXZfcmVjKTsKLX0KLXZvaWQgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9yZW1vdmVfZGV2KHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9wcml2YWN5OjpidG1fYmxlX3Jlc29sdmluZ19saXN0X3JlbW92ZV9kZXYoCi0gICAgICBwX2Rldl9yZWMpOwotfQotdm9pZCBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdCh1aW50OF90IHJsX21hc2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfcHJpdmFjeTo6YnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QocmxfbWFzayk7Ci19Ci12b2lkIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0X2Zvcl9wbGF0Zm9ybSh1aW50OF90IHJsX21hc2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfcHJpdmFjeTo6YnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3RfZm9yX3BsYXRmb3JtKAotICAgICAgcmxfbWFzayk7Ci19Ci12b2lkIGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdCh1aW50OF90IG1heF9pcmtfbGlzdF9zeikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9wcml2YWN5OjpidG1fYmxlX3Jlc29sdmluZ19saXN0X2luaXQoCi0gICAgICBtYXhfaXJrX2xpc3Rfc3opOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9wcml2YWN5LmggYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3ByaXZhY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkYmIzZC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3ByaXZhY3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTMKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlICJzdGFjay9idG0vc2VjdXJpdHlfZGV2aWNlX3JlY29yZC5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19idG1fYmxlX3ByaXZhY3kgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdF9jb21wbGV0ZQotLy8gUGFyYW1zOiB1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdF9jb21wbGV0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKT4gYm9keXsKLSAgICAgIFtdKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsgYm9keShwLCBldnRfbGVuKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfY2xlYXJfcmVzb2x2aW5nX2xpc3RfY29tcGxldGUKLSAgICBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0X2NvbXBsZXRlOwotLy8gTmFtZTogYnRtX2JsZV9hZGRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUKLS8vIFBhcmFtczogdWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfYWRkX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pPiBib2R5ewotICAgICAgW10odWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbikge319OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbikgeyBib2R5KHAsIGV2dF9sZW4pOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9hZGRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUKLSAgICBidG1fYmxlX2FkZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZTsKLS8vIE5hbWU6IGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlCi0vLyBQYXJhbXM6IHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKT4gYm9keXsKLSAgICAgIFtdKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsgYm9keShwLCBldnRfbGVuKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5X2NvbXBsZXRlCi0gICAgYnRtX2JsZV9yZW1vdmVfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGU7Ci0vLyBOYW1lOiBidG1fYmxlX3JlYWRfcmVzb2x2aW5nX2xpc3RfZW50cnlfY29tcGxldGUKLS8vIFBhcmFtczogdWludDhfdCogcCwgdWludDE2X3QgZXZ0X2xlbgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90KiBwLCB1aW50MTZfdCBldnRfbGVuKT4gYm9keXsKLSAgICAgIFtdKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QqIHAsIHVpbnQxNl90IGV2dF9sZW4pIHsgYm9keShwLCBldnRfbGVuKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZQotICAgIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeV9jb21wbGV0ZTsKLS8vIE5hbWU6IGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5Ci0vLyBQYXJhbXM6IHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYwotLy8gUmV0dXJuczogdEJUTV9TVEFUVVMKLXN0cnVjdCBidG1fYmxlX3JlbW92ZV9yZXNvbHZpbmdfbGlzdF9lbnRyeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dEJUTV9TVEFUVVModEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKT4gYm9keXsKLSAgICAgIFtdKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgeyByZXR1cm4gMDsgfX07Ci0gIHRCVE1fU1RBVFVTIG9wZXJhdG9yKCkodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9kZXZfcmVjKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcmVtb3ZlX3Jlc29sdmluZ19saXN0X2VudHJ5Ci0gICAgYnRtX2JsZV9yZW1vdmVfcmVzb2x2aW5nX2xpc3RfZW50cnk7Ci0vLyBOYW1lOiBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9jbGVhcl9yZXNvbHZpbmdfbGlzdCBidG1fYmxlX2NsZWFyX3Jlc29sdmluZ19saXN0OwotLy8gTmFtZTogYnRtX2JsZV9yZWFkX3Jlc29sdmluZ19saXN0X2VudHJ5Ci0vLyBQYXJhbXM6IHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYwotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpPiBib2R5ewotICAgICAgW10odEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsgcmV0dXJuIGJvZHkocF9kZXZfcmVjKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeQotICAgIGJ0bV9ibGVfcmVhZF9yZXNvbHZpbmdfbGlzdF9lbnRyeTsKLS8vIE5hbWU6IGJ0bV9ibGVfZGlzYWJsZV9yZXNvbHZpbmdfbGlzdAotLy8gUGFyYW1zOiB1aW50OF90IHJsX21hc2ssIGJvb2wgdG9fcmVzdW1lCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQ4X3QgcmxfbWFzaywgYm9vbCB0b19yZXN1bWUpPiBib2R5ewotICAgICAgW10odWludDhfdCBybF9tYXNrLCBib29sIHRvX3Jlc3VtZSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDhfdCBybF9tYXNrLCBib29sIHRvX3Jlc3VtZSkgewotICAgIHJldHVybiBib2R5KHJsX21hc2ssIHRvX3Jlc3VtZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX2Rpc2FibGVfcmVzb2x2aW5nX2xpc3QgYnRtX2JsZV9kaXNhYmxlX3Jlc29sdmluZ19saXN0OwotLy8gTmFtZTogYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9sb2FkX2RldgotLy8gUGFyYW1zOiB0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBidG1fYmxlX3Jlc29sdmluZ19saXN0X2xvYWRfZGV2IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYyk+IGJvZHl7Ci0gICAgICBbXSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgeyByZXR1cm4gYm9keShwX2Rldl9yZWMpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9sb2FkX2RldiBidG1fYmxlX3Jlc29sdmluZ19saXN0X2xvYWRfZGV2OwotLy8gTmFtZTogYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9yZW1vdmVfZGV2Ci0vLyBQYXJhbXM6IHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfcmVtb3ZlX2RldiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpPiBib2R5ewotICAgICAgW10odEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsgYm9keShwX2Rldl9yZWMpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9yZW1vdmVfZGV2Ci0gICAgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9yZW1vdmVfZGV2OwotLy8gTmFtZTogYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QKLS8vIFBhcmFtczogdWludDhfdCBybF9tYXNrCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCBybF9tYXNrKT4gYm9keXtbXSh1aW50OF90IHJsX21hc2spIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QgcmxfbWFzaykgeyBib2R5KHJsX21hc2spOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3QgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3Q7Ci0vLyBOYW1lOiBidG1fYmxlX2VuYWJsZV9yZXNvbHZpbmdfbGlzdF9mb3JfcGxhdGZvcm0KLS8vIFBhcmFtczogdWludDhfdCBybF9tYXNrCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgYnRtX2JsZV9lbmFibGVfcmVzb2x2aW5nX2xpc3RfZm9yX3BsYXRmb3JtIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QgcmxfbWFzayk+IGJvZHl7W10odWludDhfdCBybF9tYXNrKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90IHJsX21hc2spIHsgYm9keShybF9tYXNrKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0X2Zvcl9wbGF0Zm9ybQotICAgIGJ0bV9ibGVfZW5hYmxlX3Jlc29sdmluZ19saXN0X2Zvcl9wbGF0Zm9ybTsKLS8vIE5hbWU6IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdAotLy8gUGFyYW1zOiB1aW50OF90IG1heF9pcmtfbGlzdF9zegotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90IG1heF9pcmtfbGlzdF9zeik+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90IG1heF9pcmtfbGlzdF9zeikge319OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCBtYXhfaXJrX2xpc3Rfc3opIHsgYm9keShtYXhfaXJrX2xpc3Rfc3opOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9yZXNvbHZpbmdfbGlzdF9pbml0IGJ0bV9ibGVfcmVzb2x2aW5nX2xpc3RfaW5pdDsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfcHJpdmFjeQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTY5ZjFmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfYnRtX2JsZV9zY2FubmVyX2hjaV9pbnRlcmZhY2UgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfZXN0X2V2dAotICAgIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0Owotc3RydWN0IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0Owotc3RydWN0IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19sb3N0X2V2dAotICAgIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19sb3N0X2V2dDsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2J0bV9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0KHVpbnQ4X3QgZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlOjoKLSAgICAgIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0KGRhdGFfbGVuLCBkYXRhKTsKLX0KLXZvaWQgYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9wa3QodWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfYnRtX2JsZV9zY2FubmVyX2hjaV9pbnRlcmZhY2U6OgotICAgICAgYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9wa3QoZGF0YV9sZW4sIGRhdGEpOwotfQotdm9pZCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfbG9zdF9ldnQodWludDhfdCBkYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2J0bV9ibGVfc2Nhbm5lcl9oY2lfaW50ZXJmYWNlOjoKLSAgICAgIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19sb3N0X2V2dChkYXRhX2xlbiwgZGF0YSk7Ci19Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5oIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2JsZV9zY2FubmVyX2hjaV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4YTQ5OC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlICJzdGFjay9idG0vYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZS5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19idG1fYmxlX3NjYW5uZXJfaGNpX2ludGVyZmFjZSB7Ci0KLS8vIE5hbWU6IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0Ci0vLyBQYXJhbXM6IHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfZXN0X2V2dCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBkYXRhKT4gYm9keXsKLSAgICAgIFtdKHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEpIHsgYm9keShkYXRhX2xlbiwgZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfZXN0X2V2dAotICAgIGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfc3luY19lc3RfZXZ0OwotLy8gTmFtZTogYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9wa3QKLS8vIFBhcmFtczogdWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEpPiBib2R5ewotICAgICAgW10odWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSkgeyBib2R5KGRhdGFfbGVuLCBkYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0IGJ0bV9ibGVfcHJvY2Vzc19wZXJpb2RpY19hZHZfcGt0OwotLy8gTmFtZTogYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9zeW5jX2xvc3RfZXZ0Ci0vLyBQYXJhbXM6IHVpbnQ4X3QgZGF0YV9sZW4sIHVpbnQ4X3QqIGRhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBidG1fYmxlX3Byb2Nlc3NfcGVyaW9kaWNfYWR2X3N5bmNfbG9zdF9ldnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCBkYXRhX2xlbiwgdWludDhfdCogZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBkYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50OF90IGRhdGFfbGVuLCB1aW50OF90KiBkYXRhKSB7IGJvZHkoZGF0YV9sZW4sIGRhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9zeW5jX2xvc3RfZXZ0Ci0gICAgYnRtX2JsZV9wcm9jZXNzX3BlcmlvZGljX2Fkdl9zeW5jX2xvc3RfZXZ0OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfYnRtX2JsZV9zY2FubmVyX2hjaV9pbnRlcmZhY2UKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2Rldi5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9kZXYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGU4M2EuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2Rldi5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTYKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9idG1fYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYWNsX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfb2N0ZXRzLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWJvb2wgQlRNX1NlY0FkZERldmljZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBERVZfQ0xBU1MgZGV2X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgIEJEX05BTUUgYmRfbmFtZSwgdWludDhfdCogZmVhdHVyZXMsIExpbmtLZXkqIHBfbGlua19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrZXlfdHlwZSwgdWludDhfdCBwaW5fbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEJUTV9TZWNEZWxldGVEZXZpY2UoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBidG1fZGV2X3N1cHBvcnRfcm9sZV9zd2l0Y2goY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBidG1fc2V0X2JvbmRfdHlwZV9kZXYoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0RFVl9SRUM6OnRCVE1fQk9ORF9UWVBFIGJvbmRfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBpc19hZGRyZXNzX2VxdWFsKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgaXNfaGFuZGxlX2VxdWFsKHZvaWQqIGRhdGEsIHZvaWQqIGNvbnRleHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWNoYXIqIEJUTV9TZWNSZWFkRGV2TmFtZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX2Rldl9ieV9oYW5kbGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9maW5kX29yX2FsbG9jX2Rldihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fU0VDX0RFVl9SRUMqIGJ0bV9zZWNfYWxsb2NfZGV2KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEJUTV9TRUNfREVWX1JFQyogYnRtX3NlY19hbGxvY2F0ZV9kZXZfcmVjKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEJUTV9TRUNfREVWX1JFQzo6dEJUTV9CT05EX1RZUEUgYnRtX2dldF9ib25kX3R5cGVfZGV2KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0QlRNX1NFQ19ERVZfUkVDOjpCT05EX1RZUEVfVU5LTk9XTjsKLX0KLXZvaWQgQlRNX1NlY0NsZWFyU2VjdXJpdHlGbGFncyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fY29uc29saWRhdGVfZGV2KHRCVE1fU0VDX0RFVl9SRUMqIHBfdGFyZ2V0X3JlYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgd2lwZV9zZWNyZXRzX2FuZF9yZW1vdmUodEJUTV9TRUNfREVWX1JFQyogcF9kZXZfcmVjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2RldmN0bC5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9kZXZjdGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDczMmEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2RldmN0bC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MjEKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGEvZG0vYnRhX2RtX2ludC5oIgotI2luY2x1ZGUgImJ0YS9zeXMvYnRhX3N5cy5oIgotI2luY2x1ZGUgImJ0Y29yZS9pbmNsdWRlL21vZHVsZS5oIgotI2luY2x1ZGUgImJ0aWYvaW5jbHVkZS9idGlmX2Jxci5oIgotI2luY2x1ZGUgImNvbW1vbi9tZXNzYWdlX2xvb3BfdGhyZWFkLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImhjaS9pbmNsdWRlL2hjaV9sYXllci5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9idG1fYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9jb250cm9sbGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIEJUTV9Jc0RldmljZVVwKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXRCVE1fU1RBVFVTIEJUTV9CVF9RdWFsaXR5X1JlcG9ydF9WU0VfUmVnaXN0ZXIoCi0gICAgYm9vbCBpc19yZWdpc3RlciwgdEJUTV9CVF9RVUFMSVRZX1JFUE9SVF9SRUNFSVZFUiogcF9icXJfcmVwb3J0X3JlY2VpdmVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBCVE1fRGVsZXRlU3RvcmVkTGlua0tleShjb25zdCBSYXdBZGRyZXNzKiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9DTVBMX0NCKiBwX2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBCVE1fRW5hYmxlVGVzdE1vZGUodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1JlYWRMb2NhbERldmljZU5hbWUoY2hhcioqIHBfbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1JlYWRMb2NhbERldmljZU5hbWVGcm9tQ29udHJvbGxlcigKLSAgICB0QlRNX0NNUExfQ0IqIHBfcmxuX2NtcGxfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIEJUTV9SZWdpc3RlckZvclZTRXZlbnRzKHRCVE1fVlNfRVZUX0NCKiBwX2NiLCBib29sIGlzX3JlZ2lzdGVyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBCVE1fU2V0RGV2aWNlQ2xhc3MoREVWX0NMQVNTIGRldl9jbGFzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldExvY2FsRGV2aWNlTmFtZShjb25zdCBjaGFyKiBwX25hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXVpbnQ4X3QqIEJUTV9SZWFkRGV2aWNlQ2xhc3Modm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIEJUTV9WZW5kb3JTcGVjaWZpY0NvbW1hbmQodWludDE2X3Qgb3Bjb2RlLCB1aW50OF90IHBhcmFtX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3BhcmFtX2J1ZiwgdEJUTV9WU0NfQ01QTF9DQiogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX1dyaXRlUGFnZVRpbWVvdXQodWludDE2X3QgdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX1dyaXRlVm9pY2VTZXR0aW5ncyh1aW50MTZfdCBzZXR0aW5ncykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX2RiX3Jlc2V0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRNX3Jlc2V0X2NvbXBsZXRlKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidG1fZGVsZXRlX3N0b3JlZF9saW5rX2tleV9jb21wbGV0ZSh1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fZGV2X2ZyZWUoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9kZXZfaW5pdCgpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX3JlYWRfbG9jYWxfbmFtZV9jb21wbGV0ZSh1aW50OF90KiBwLCBVTlVTRURfQVRUUiB1aW50MTZfdCBldnRfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fdmVuZG9yX3NwZWNpZmljX2V2dCh1aW50OF90KiBwLCB1aW50OF90IGV2dF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV92c2NfY29tcGxldGUodWludDhfdCogcCwgdWludDE2X3Qgb3Bjb2RlLCB1aW50MTZfdCBldnRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHRCVE1fVlNDX0NNUExfQ0IqIHBfdnNjX2NwbHRfY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1faW5xLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX2lucS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZDA5Mi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1faW5xLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo0NAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYWR2ZXJ0aXNlX2RhdGFfcGFyc2VyLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImNvbW1vbi90aW1lX3V0aWwuaCIKLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2J0bV9hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9pbnRfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2FjbF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRtX2JsZV9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2lucV9oY2lfbGlua19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIFNlbmRSZW1vdGVOYW1lUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiByYXdfYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLWJvb2wgQlRNX0hhc0VpclNlcnZpY2UoY29uc3QgdWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBidG1faW5xX2ZpbmRfYmRhZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci10QlRNX0VJUl9TRUFSQ0hfUkVTVUxUIEJUTV9IYXNJbnF1aXJ5RWlyU2VydmljZSh0QlRNX0lOUV9SRVNVTFRTKiBwX3Jlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB1dWlkMTYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdEJUTV9JTlFfSU5GTyogQlRNX0lucURiRmlyc3Qodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10QlRNX0lOUV9JTkZPKiBCVE1fSW5xRGJOZXh0KHRCVE1fSU5RX0lORk8qIHBfY3VyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fSU5RX0lORk8qIEJUTV9JbnFEYlJlYWQoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEJUTV9TVEFUVVMgQlRNX0NhbmNlbFJlbW90ZURldmljZU5hbWUodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX0NsZWFySW5xRGIoY29uc3QgUmF3QWRkcmVzcyogcF9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIEJUTV9SZWFkUmVtb3RlRGV2aWNlTmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldENvbm5lY3RhYmlsaXR5KHVpbnQxNl90IHBhZ2VfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldERpc2NvdmVyYWJpbGl0eSh1aW50MTZfdCBpbnFfbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldElucXVpcnlNb2RlKHVpbnQ4X3QgbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1N0YXJ0SW5xdWlyeSh0QlRNX0lOUV9SRVNVTFRTX0NCKiBwX3Jlc3VsdHNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fQ01QTF9DQiogcF9jbXBsX2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBCVE1fV3JpdGVFSVIoQlRfSERSKiBwX2J1ZmYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9pbml0aWF0ZV9yZW1fbmFtZShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLCB1aW50OF90IG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lb3V0X21zLCB0QlRNX0NNUExfQ0IqIHBfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRJTlFfREJfRU5UKiBidG1faW5xX2RiX2ZpbmQoY29uc3QgUmF3QWRkcmVzcyYgcF9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdElOUV9EQl9FTlQqIGJ0bV9pbnFfZGJfbmV3KGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXVpbnQxNl90IEJUTV9Jc0lucXVpcnlBY3RpdmUodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEJUTV9HZXRFaXJTdXBwb3J0ZWRTZXJ2aWNlcyh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDhfdCoqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1heF9udW1fdXVpZDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9udW1fdXVpZDE2KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgQlRNX0dldEVpclV1aWRMaXN0KGNvbnN0IHVpbnQ4X3QqIHBfZWlyLCBzaXplX3QgZWlyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXVpZF9zaXplLCB1aW50OF90KiBwX251bV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF91dWlkX2xpc3QsIHVpbnQ4X3QgbWF4X251bV91dWlkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgQlRNX0FkZEVpclNlcnZpY2UodWludDMyX3QqIHBfZWlyX3V1aWQsIHVpbnQxNl90IHV1aWQxNikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0NhbmNlbElucXVpcnkodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVE1fRW5hYmxlSW50ZXJsYWNlZElucXVpcnlTY2FuKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVE1fRW5hYmxlSW50ZXJsYWNlZFBhZ2VTY2FuKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBCVE1fUmVtb3ZlRWlyU2VydmljZSh1aW50MzJfdCogcF9laXJfdXVpZCwgdWludDE2X3QgdXVpZDE2KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fY2xyX2lucV9kYihjb25zdCBSYXdBZGRyZXNzKiBwX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2Nscl9pbnFfcmVzdWx0X2ZsdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9pbnFfY2xlYXJfc3NwKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX2lucV9kYl9mcmVlKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX2lucV9kYl9pbml0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX2lucV9kYl9yZXNldCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9pbnFfcmVtb3RlX25hbWVfdGltZXJfdGltZW91dChVTlVTRURfQVRUUiB2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1faW5xX3JtdF9uYW1lX2ZhaWxlZF9jYW5jZWxsZWQodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2lucV9zdG9wX29uX3NzcCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9wcm9jZXNzX2NhbmNlbF9jb21wbGV0ZSh1aW50OF90IHN0YXR1cywgdWludDhfdCBtb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fcHJvY2Vzc19pbnFfY29tcGxldGUodWludDhfdCBzdGF0dXMsIHVpbnQ4X3QgbW9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3Byb2Nlc3NfaW5xX3Jlc3VsdHModWludDhfdCogcCwgdWludDhfdCBoY2lfZXZ0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnFfcmVzX21vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9wcm9jZXNzX3JlbW90ZV9uYW1lKGNvbnN0IFJhd0FkZHJlc3MqIGJkYSwgQkRfTkFNRSBiZG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGV2dF9sZW4sIHVpbnQ4X3QgaGNpX3N0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NldF9laXJfdXVpZCh1aW50OF90KiBwX2VpciwgdEJUTV9JTlFfUkVTVUxUUyogcF9yZXN1bHRzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc29ydF9pbnFfcmVzdWx0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9pc28uY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1faXNvLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDAxOGFiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9pc28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1faXNvX2FwaS5oIgotCi11c2luZyBibHVldG9vdGg6OmhjaTo6aXNvX21hbmFnZXI6OkJpZ0NhbGxiYWNrczsKLXVzaW5nIGJsdWV0b290aDo6aGNpOjppc29fbWFuYWdlcjo6Q2lnQ2FsbGJhY2tzOwotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1zdHJ1Y3QgSXNvTWFuYWdlcjo6aW1wbCB7fTsKLQotSXNvTWFuYWdlcjo6SXNvTWFuYWdlcigpIHt9Ci1Jc29NYW5hZ2VyOjp+SXNvTWFuYWdlcigpIHt9Ci12b2lkIElzb01hbmFnZXI6OlJlZ2lzdGVyQ2lnQ2FsbGJhY2tzKENpZ0NhbGxiYWNrcyogY2FsbGJhY2tzKSBjb25zdCB7fQotdm9pZCBJc29NYW5hZ2VyOjpSZWdpc3RlckJpZ0NhbGxiYWNrcyhCaWdDYWxsYmFja3MqIGNhbGxiYWNrcykgY29uc3Qge30KLXZvaWQgSXNvTWFuYWdlcjo6Q3JlYXRlQ2lnKHVpbnQ4X3QgY2lnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpSZWNvbmZpZ3VyZUNpZygKLSAgICB1aW50OF90IGNpZ19pZCwgc3RydWN0IGlzb19tYW5hZ2VyOjpjaWdfY3JlYXRlX3BhcmFtcyBjaWdfcGFyYW1zKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpSZW1vdmVDaWcodWludDhfdCBjaWdfaWQpIHt9Ci12b2lkIElzb01hbmFnZXI6OkVzdGFibGlzaENpcygKLSAgICBzdHJ1Y3QgaXNvX21hbmFnZXI6OmNpc19lc3RhYmxpc2hfcGFyYW1zIGNvbm5fcGFyYW1zKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpEaXNjb25uZWN0Q2lzKHVpbnQxNl90IGNpc19oYW5kbGUsIHVpbnQ4X3QgcmVhc29uKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpTZXR1cElzb0RhdGFQYXRoKAotICAgIHVpbnQxNl90IGlzb19oYW5kbGUsIHN0cnVjdCBpc29fbWFuYWdlcjo6aXNvX2RhdGFfcGF0aF9wYXJhbXMgcGF0aF9wYXJhbXMpIHsKLX0KLXZvaWQgSXNvTWFuYWdlcjo6UmVtb3ZlSXNvRGF0YVBhdGgodWludDE2X3QgaXNvX2hhbmRsZSwgdWludDhfdCBkYXRhX3BhdGhfZGlyKSB7Ci19Ci12b2lkIElzb01hbmFnZXI6OlJlYWRJc29MaW5rUXVhbGl0eSh1aW50MTZfdCBpc29faGFuZGxlKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpTZW5kSXNvRGF0YSh1aW50MTZfdCBpc29faGFuZGxlLCBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2xlbikge30KLXZvaWQgSXNvTWFuYWdlcjo6Q3JlYXRlQmlnKHVpbnQ4X3QgYmlnX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlzb19tYW5hZ2VyOjpiaWdfY3JlYXRlX3BhcmFtcyBiaWdfcGFyYW1zKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpUZXJtaW5hdGVCaWcodWludDhfdCBiaWdfaWQsIHVpbnQ4X3QgcmVhc29uKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVJc29EYXRhKHZvaWQqIHBfbXNnKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVEaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByZWFzb24pIHt9Ci12b2lkIElzb01hbmFnZXI6OkhhbmRsZU51bUNvbXBsRGF0YVBrdHModWludDhfdCogcCwgdWludDhfdCBldnRfbGVuKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVHZE51bUNvbXBsRGF0YVBrdHModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBjcmVkaXRzKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpIYW5kbGVIY2lFdmVudCh1aW50OF90IHN1Yl9jb2RlLCB1aW50OF90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCkge30KLXZvaWQgSXNvTWFuYWdlcjo6U3RhcnQoKSB7fQotdm9pZCBJc29NYW5hZ2VyOjpTdG9wKCkge30KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aApkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX21haW4uY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmYWI2My4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo3Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJidF90YXJnZXQuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vZHVtcHN5cy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fY2xpZW50X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInN0YWNrX2NvbmZpZy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi12b2lkIEJUTV9Mb2dIaXN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0YWcsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9Mb2dIaXN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiB0YWcsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2csIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRyYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0xvZ0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywgY29uc3QgdEJMRV9CRF9BRERSJiBibGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX0xvZ0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHRhZywgY29uc3QgdEJMRV9CRF9BRERSJiBibGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZywgY29uc3Qgc3RkOjpzdHJpbmcmIGV4dHJhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fZnJlZSh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9pbml0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9zY24uY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19idG1fc2NuLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjc2MDA5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0bV9zY24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MwotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1faW50X3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9yZmNkZWZzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIEJUTV9GcmVlU0NOKHVpbnQ4X3Qgc2NuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEJUTV9UcnlBbGxvY2F0ZVNDTih1aW50OF90IHNjbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdWludDhfdCBCVE1fQWxsb2NhdGVTQ04odm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fc2NvLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX3Njby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMTg5ZS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fc2NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyMwotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2VzY29fcGFyYW1ldGVycy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fYXBpX3R5cGVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9oY2lfZXJyb3JfY29kZS5oIgotI2luY2x1ZGUgInR5cGVzL2NsYXNzX29mX2RldmljZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIEJUTV9Jc1Njb0FjdGl2ZUJ5QmRhZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgYnRtX2lzX3Njb19hY3RpdmUodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJ0bV9zY29fcmVtb3ZlZCh1aW50MTZfdCBoY2lfaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWNvbnN0IFJhd0FkZHJlc3MqIEJUTV9SZWFkU2NvQmRBZGRyKHVpbnQxNl90IHNjb19pbngpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEJUTV9TVEFUVVMgQlRNX0NyZWF0ZVNjbyhjb25zdCBSYXdBZGRyZXNzKiByZW1vdGVfYmRhLCBib29sIGlzX29yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBrdF90eXBlcywgdWludDE2X3QqIHBfc2NvX2lueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TQ09fQ0IqIHBfY29ubl9jYiwgdEJUTV9TQ09fQ0IqIHBfZGlzY19jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1JlZ0ZvckVTY29FdnRzKHVpbnQxNl90IHNjb19pbngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9FU0NPX0NCQUNLKiBwX2VzY29fY2JhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIEJUTV9SZW1vdmVTY28odWludDE2X3Qgc2NvX2lueCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldEVTY29Nb2RlKGVuaF9lc2NvX3BhcmFtc190KiBwX3Bhcm1zKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci11aW50OF90IEJUTV9HZXROdW1TY29MaW5rcyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgQlRNX0VTY29Db25uUnNwKHVpbnQxNl90IHNjb19pbngsIHVpbnQ4X3QgaGNpX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIGVuaF9lc2NvX3BhcmFtc190KiBwX3Bhcm1zKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBCVE1fUmVtb3ZlU2NvKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3JvdXRlX3Njb19kYXRhKEJUX0hEUiogcF9tc2cpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX3Njb19hY2xfcmVtb3ZlZChjb25zdCBSYXdBZGRyZXNzKiBiZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9zY29fY2hrX3BlbmRfcm9sZWNoYW5nZSh1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2NvX2Noa19wZW5kX3VucGFyayh0SENJX1NUQVRVUyBoY2lfc3RhdHVzLCB1aW50MTZfdCBoY2lfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2NvX2Nvbm5fcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgY29uc3QgREVWX0NMQVNTJiBkZXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsaW5rX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9zY29fY29ubmVjdGVkKHRIQ0lfU1RBVFVTIGhjaV9zdGF0dXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGNpX2hhbmRsZSwgdEJUTV9FU0NPX0RBVEEqIHBfZXNjb19kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2NvX2Rpc2NfY2hrX3BlbmRfZm9yX21vZGVjaGFuZ2UodWludDE2X3QgaGNpX2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3Njb19vbl9lc2NvX2Nvbm5lY3RfcmVxdWVzdCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGNvbnN0IGJsdWV0b290aDo6dHlwZXM6OkNsYXNzT2ZEZXZpY2UmIGNvZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3Njb19vbl9zY29fY29ubmVjdF9yZXF1ZXN0KAotICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgY29uc3QgYmx1ZXRvb3RoOjp0eXBlczo6Q2xhc3NPZkRldmljZSYgY29kKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2NvX29uX2Rpc2Nvbm5lY3RlZCh1aW50MTZfdCBoY2lfaGFuZGxlLCB0SENJX1JFQVNPTiByZWFzb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fc2VjLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnRtX3NlYy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2MGY0Ny4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19idG1fc2VjLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo2NgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidGlmL2luY2x1ZGUvYnRpZl9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJjb21tb24vdGltZV91dGlsLmgiCi0jaW5jbHVkZSAiZGV2aWNlL2luY2x1ZGUvY29udHJvbGxlci5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vYnRtX2FwaS5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9kdW1wc3lzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9hY2xfaGNpX2xpbmtfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzdGFjay9zbXAvc21wX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIEJUTV9Cb3RoRW5kc1N1cHBvcnRTZWN1cmVDb25uZWN0aW9ucyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEJUTV9HZXRTZWN1cml0eUZsYWdzQnlUcmFuc3BvcnQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX3NlY19mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBCVE1fSXNBdXRoZW50aWNhdGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEJUTV9Jc0VuY3J5cHRlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBCVE1fSXNMaW5rS2V5QXV0aGVkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEJUTV9Jc0xpbmtLZXlLbm93bihjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBCVE1fUGVlclN1cHBvcnRzU2VjdXJlQ29ubmVjdGlvbnMoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdEJUX0RFVklDRV9UWVBFIEJUTV9HZXRQZWVyRGV2aWNlVHlwZUZyb21GZWF0dXJlcyhjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRfREVWSUNFX1RZUEVfQlJFRFI7Ci19Ci1ib29sIEJUTV9TZWNBZGRSbXROYW1lTm90aWZ5Q2FsbGJhY2sodEJUTV9STVRfTkFNRV9DQUxMQkFDSyogcF9jYWxsYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBCVE1fU2VjRGVsZXRlUm10TmFtZU5vdGlmeUNhbGxiYWNrKHRCVE1fUk1UX05BTUVfQ0FMTEJBQ0sqIHBfY2FsbGJhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQlRNX1NlY0lzU2VjdXJpdHlQZW5kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQlRNX1NlY1JlZ2lzdGVyKGNvbnN0IHRCVE1fQVBQTF9JTkZPKiBwX2NiX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQlRNX1NldFNlY3VyaXR5TGV2ZWwoYm9vbCBpc19vcmlnaW5hdG9yLCBjb25zdCBjaGFyKiBwX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZV9pZCwgdWludDE2X3Qgc2VjX2xldmVsLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG14X3Byb3RvX2lkLCB1aW50MzJfdCBteF9jaGFuX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGJ0bV9zZWNfaXNfYV9ib25kZWRfZGV2KGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBpc19zZWNfc3RhdGVfZXF1YWwodm9pZCogZGF0YSwgdm9pZCogY29udGV4dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBpc19zdGF0ZV9nZXR0aW5nX25hbWUodm9pZCogZGF0YSwgdm9pZCogY29udGV4dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotY29uc3QgdWludDhfdCogYnRtX2dldF9kZXZfY2xhc3MoY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fTElOS19LRVlfVFlQRSBCVE1fU2VjR2V0RGV2aWNlTGlua0tleVR5cGUoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci10QlRNX1NFQ19ERVZfUkVDKiBidG1fc2VjX2ZpbmRfZGV2X2J5X3NlY19zdGF0ZSh1aW50OF90IHN0YXRlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRCVE1fU0VDX1NFUlZfUkVDKiBidG1fc2VjX2ZpbmRfZmlyc3Rfc2Vydihib29sIGlzX29yaWdpbmF0b3IsIHVpbnQxNl90IHBzbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10QlRNX1NUQVRVUyBCVE1fU2VjQm9uZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QkxFX0FERFJfVFlQRSBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdEJUX0RFVklDRV9UWVBFIGRldmljZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaW5fbGVuLCB1aW50OF90KiBwX3BpbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NlY0JvbmRDYW5jZWwoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgQlRNX1NldEVuY3J5cHRpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUTV9TRUNfQ0FMTEJBQ0sqIHBfY2FsbGJhY2ssIHZvaWQqIHBfcmVmX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRNX0JMRV9TRUNfQUNUIHNlY19hY3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfYm9uZF9ieV90cmFuc3BvcnQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHVpbnQ4X3QgcGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9waW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfZGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEJUTV9TVUNDRVNTOwotfQotdEJUTV9TVEFUVVMgYnRtX3NlY19leGVjdXRlX3Byb2NlZHVyZSh0QlRNX1NFQ19ERVZfUkVDKiBwX2Rldl9yZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwc20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfcmVmX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBCVE1fU1VDQ0VTUzsKLX0KLXRCVE1fU1RBVFVTIGJ0bV9zZWNfbDJjYXBfYWNjZXNzX3JlcV9ieV9yZXF1aXJlbWVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBzZWN1cml0eV9yZXF1aXJlZCwgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLCB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10QlRNX1NUQVRVUyBidG1fc2VjX214X2FjY2Vzc19yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfb3JpZ2luYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjdXJpdHlfcmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU0VDX0NBTExCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci11aW50MTZfdCBCVE1fR2V0Q2xvY2tPZmZzZXQoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEJUTV9TZWNDbHJTZXJ2aWNlKHVpbnQ4X3Qgc2VydmljZV9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IEJUTV9TZWNDbHJTZXJ2aWNlQnlQc20odWludDE2X3QgcHNtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgQlRNX0NvbmZpcm1SZXFSZXBseSh0QlRNX1NUQVRVUyByZXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9QSU5Db2RlUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUTV9TVEFUVVMgcmVzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGluX2xlbiwgdWludDhfdCogcF9waW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9QYXNza2V5UmVxUmVwbHkodEJUTV9TVEFUVVMgcmVzLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3NrZXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEJUTV9SZWFkTG9jYWxPb2JEYXRhKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgQlRNX1JlbW90ZU9vYkRhdGFSZXBseSh0QlRNX1NUQVRVUyByZXMsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgYywgY29uc3QgT2N0ZXQxNiYgcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgQlRNX1NldFBpblR5cGUodWludDhfdCBwaW5fdHlwZSwgUElOX0NPREUgcGluX2NvZGUsIHVpbnQ4X3QgcGluX2NvZGVfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBOb3RpZnlCb25kaW5nQ2FuY2VsZWQodEJUTV9TVEFUVVMgYnRtX3N0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX2NyZWF0ZV9jb25uX2NhbmNlbF9jb21wbGV0ZSh1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1faW9fY2FwYWJpbGl0aWVzX3JlcShjb25zdCBSYXdBZGRyZXNzJiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1faW9fY2FwYWJpbGl0aWVzX3JzcCh1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fcHJvY19zcF9yZXFfZXZ0KHRCVE1fU1BfRVZUIGV2ZW50LCB1aW50OF90KiBwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fcmVhZF9sb2NhbF9vb2JfY29tcGxldGUodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3JlbV9vb2JfcmVxKHVpbnQ4X3QqIHApIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYnRtX3NlY19hYm9ydF9hY2Nlc3NfcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9zZWNfYXV0aF9jb21wbGV0ZSh1aW50MTZfdCBoYW5kbGUsIHRIQ0lfU1RBVFVTIHN0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NlY19jaGVja19wZW5kaW5nX3JlcXModm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBidG1fc2VjX2NsZWFyX2JsZV9rZXlzKHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NlY19jb25uX3JlcShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QqIGRjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VjX2Nvbm5lY3RlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzLCB1aW50OF90IGVuY19tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICB0SENJX1JPTEUgYXNzaWduZWRfcm9sZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NlY19kZXZfcmVjX2NiYWNrX2V2ZW50KHRCVE1fU0VDX0RFVl9SRUMqIHBfZGV2X3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVE1fU1RBVFVTIGJ0bV9zdGF0dXMsIGJvb2wgaXNfbGVfdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VjX2Rldl9yZXNldCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGJ0bV9zZWNfZGlzY29ubmVjdGVkKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VjX2VuY3J5cHRfY2hhbmdlKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9TVEFUVVMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZW5jcl9lbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9zZWNfbGlua19rZXlfbm90aWZpY2F0aW9uKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiBsaW5rX2tleSwgdWludDhfdCBrZXlfdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NlY19saW5rX2tleV9yZXF1ZXN0KHVpbnQ4X3QqIHBfZXZlbnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0bV9zZWNfcGluX2NvZGVfcmVxdWVzdCh1aW50OF90KiBwX2V2ZW50KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VjX3JtdF9ob3N0X3N1cHBvcnRfZmVhdF9ldnQodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NlY19ybXRfbmFtZV9yZXF1ZXN0X2NvbXBsZXRlKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfYmRfbmFtZSwgdEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2VjX3NldF9wZWVyX3NlY19jYXBzKHVpbnQxNl90IGhjaV9oYW5kbGUsIGJvb2wgc3NwX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjX3N1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhjaV9yb2xlX3N3aXRjaF9zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBicl9lZHJfc3VwcG9ydGVkLCBib29sIGxlX3N1cHBvcnRlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnRtX3NlY191cGRhdGVfY2xvY2tfb2Zmc2V0KHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgY2xvY2tfb2Zmc2V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBidG1fc2ltcGxlX3BhaXJfY29tcGxldGUodWludDhfdCogcCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2J0dV9oY2lmLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnR1X2hjaWYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTllNjAuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfYnR1X2hjaWYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6OQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2RlZmluZSBMT0dfVEFHICJidF9idHVfaGNpZiIKLSNpbmNsdWRlIDxiYXNlL2JpbmQuaD4KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YmFzZS9sb2NhdGlvbi5oPgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXVzaW5nIGhjaV9jbWRfY2IgPSBiYXNlOjpPbmNlQ2FsbGJhY2s8dm9pZCgKLSAgICB1aW50OF90KiAvKiByZXR1cm5fcGFyYW1ldGVycyAqLywgdWludDE2X3QgLyogcmV0dXJuX3BhcmFtZXRlcnNfbGVuZ3RoKi8pPjsKLQotc3RydWN0IGNtZF93aXRoX2NiX2RhdGEgewotICBoY2lfY21kX2NiIGNiOwotICBiYXNlOjpMb2NhdGlvbiBwb3N0ZWRfZnJvbTsKLX07Ci0KLXZvaWQgYnR1X2hjaWZfbG9nX2V2ZW50X21ldHJpY3ModWludDhfdCBldnRfY29kZSwgdWludDhfdCogcF9ldmVudCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnR1X2hjaWZfcHJvY2Vzc19ldmVudChVTlVTRURfQVRUUiB1aW50OF90IGNvbnRyb2xsZXJfaWQsIEJUX0hEUiogcF9tc2cpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGJ0dV9oY2lmX3NlbmRfY21kKFVOVVNFRF9BVFRSIHVpbnQ4X3QgY29udHJvbGxlcl9pZCwgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgYnR1X2hjaWZfc2VuZF9jbWRfd2l0aF9jYihjb25zdCBiYXNlOjpMb2NhdGlvbiYgcG9zdGVkX2Zyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb3Bjb2RlLCB1aW50OF90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwYXJhbXNfbGVuLCBoY2lfY21kX2NiIGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBjbWRfd2l0aF9jYl9kYXRhX2NsZWFudXAoY21kX3dpdGhfY2JfZGF0YSogY2Jfd3JhcHBlcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgY21kX3dpdGhfY2JfZGF0YV9pbml0KGNtZF93aXRoX2NiX2RhdGEqIGNiX3dyYXBwZXIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19jcnlwdG9fdG9vbGJveC5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2NyeXB0b190b29sYm94LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGI0ZTY5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2NyeXB0b190b29sYm94LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjgKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19zdGFja19jcnlwdG9fdG9vbGJveC5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX2NyeXB0b190b29sYm94IHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgaDYgaDY7Ci1zdHJ1Y3QgaDcgaDc7Ci1zdHJ1Y3QgZjQgZjQ7Ci1zdHJ1Y3QgZjUgZjU7Ci1zdHJ1Y3QgZjYgZjY7Ci1zdHJ1Y3QgZzIgZzI7Ci1zdHJ1Y3QgbHRrX3RvX2xpbmtfa2V5IGx0a190b19saW5rX2tleTsKLXN0cnVjdCBsaW5rX2tleV90b19sdGsgbGlua19rZXlfdG9fbHRrOwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfY3J5cHRvX3Rvb2xib3gKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLU9jdGV0MTYgaDYoY29uc3QgT2N0ZXQxNiYgdywgc3RkOjphcnJheTx1aW50OF90LCA0PiBrZXlpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2NyeXB0b190b29sYm94OjpoNih3LCBrZXlpZCk7Ci19Ci1PY3RldDE2IGg3KGNvbnN0IE9jdGV0MTYmIHNhbHQsIGNvbnN0IE9jdGV0MTYmIHcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19jcnlwdG9fdG9vbGJveDo6aDcoc2FsdCwgdyk7Ci19Ci1PY3RldDE2IGY0KGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsIHVpbnQ4X3QgeikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2NyeXB0b190b29sYm94OjpmNCh1LCB2LCB4LCB6KTsKLX0KLXZvaWQgZjUoY29uc3QgdWludDhfdCogdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLCB1aW50OF90KiBhMSwKLSAgICAgICAgdWludDhfdCogYTIsIE9jdGV0MTYqIG1hY19rZXksIE9jdGV0MTYqIGx0aykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfY3J5cHRvX3Rvb2xib3g6OmY1KHcsIG4xLCBuMiwgYTEsIGEyLCBtYWNfa2V5LCBsdGspOwotfQotT2N0ZXQxNiBmNihjb25zdCBPY3RldDE2JiB3LCBjb25zdCBPY3RldDE2JiBuMSwgY29uc3QgT2N0ZXQxNiYgbjIsCi0gICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHIsIHVpbnQ4X3QqIGlvY2FwLCB1aW50OF90KiBhMSwgdWludDhfdCogYTIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19jcnlwdG9fdG9vbGJveDo6ZjYodywgbjEsIG4yLCByLCBpb2NhcCwgYTEsIGEyKTsKLX0KLXVpbnQzMl90IGcyKGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsCi0gICAgICAgICAgICBjb25zdCBPY3RldDE2JiB5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfY3J5cHRvX3Rvb2xib3g6OmcyKHUsIHYsIHgsIHkpOwotfQotT2N0ZXQxNiBsdGtfdG9fbGlua19rZXkoY29uc3QgT2N0ZXQxNiYgbHRrLCBib29sIHVzZV9oNykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2NyeXB0b190b29sYm94OjpsdGtfdG9fbGlua19rZXkobHRrLCB1c2VfaDcpOwotfQotT2N0ZXQxNiBsaW5rX2tleV90b19sdGsoY29uc3QgT2N0ZXQxNiYgbGlua19rZXksIGJvb2wgdXNlX2g3KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfY3J5cHRvX3Rvb2xib3g6Omxpbmtfa2V5X3RvX2x0ayhsaW5rX2tleSwgdXNlX2g3KTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2NyeXB0b190b29sYm94LmggYi90ZXN0L21vY2svbW9ja19zdGFja19jcnlwdG9fdG9vbGJveC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJlODAwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2NyeXB0b190b29sYm94LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjgKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9hZXMuaCIKLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19jcnlwdG9fdG9vbGJveCB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBoNgotLy8gUGFyYW1zOiBjb25zdCBPY3RldDE2JiB3LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleWlkCi0vLyBSZXR1cm5zOiBPY3RldDE2Ci1zdHJ1Y3QgaDYgewotICBPY3RldDE2IG9jdGV0MTY7Ci0gIHN0ZDo6ZnVuY3Rpb248T2N0ZXQxNihjb25zdCBPY3RldDE2JiB3LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleWlkKT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBPY3RldDE2JiB3LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleWlkKSB7Ci0gICAgICAgIHJldHVybiBvY3RldDE2OwotICAgICAgfX07Ci0gIE9jdGV0MTYgb3BlcmF0b3IoKShjb25zdCBPY3RldDE2JiB3LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDQ+IGtleWlkKSB7Ci0gICAgcmV0dXJuIGJvZHkodywga2V5aWQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgaDYgaDY7Ci0vLyBOYW1lOiBoNwotLy8gUGFyYW1zOiBjb25zdCBPY3RldDE2JiBzYWx0LCBjb25zdCBPY3RldDE2JiB3Ci0vLyBSZXR1cm5zOiBPY3RldDE2Ci1zdHJ1Y3QgaDcgewotICBPY3RldDE2IG9jdGV0MTY7Ci0gIHN0ZDo6ZnVuY3Rpb248T2N0ZXQxNihjb25zdCBPY3RldDE2JiBzYWx0LCBjb25zdCBPY3RldDE2JiB3KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBPY3RldDE2JiBzYWx0LCBjb25zdCBPY3RldDE2JiB3KSB7IHJldHVybiBvY3RldDE2OyB9fTsKLSAgT2N0ZXQxNiBvcGVyYXRvcigpKGNvbnN0IE9jdGV0MTYmIHNhbHQsIGNvbnN0IE9jdGV0MTYmIHcpIHsKLSAgICByZXR1cm4gYm9keShzYWx0LCB3KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGg3IGg3OwotLy8gTmFtZTogZjQKLS8vIFBhcmFtczogY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgY29uc3QgT2N0ZXQxNiYgeCwgdWludDhfdCB6Ci0vLyBSZXR1cm5zOiBPY3RldDE2Ci1zdHJ1Y3QgZjQgewotICBPY3RldDE2IG9jdGV0MTY7Ci0gIHN0ZDo6ZnVuY3Rpb248T2N0ZXQxNihjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB6KT4KLSAgICAgIGJvZHl7W3RoaXNdKGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsIGNvbnN0IE9jdGV0MTYmIHgsCi0gICAgICAgICAgICAgICAgICB1aW50OF90IHopIHsgcmV0dXJuIG9jdGV0MTY7IH19OwotICBPY3RldDE2IG9wZXJhdG9yKCkoY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgY29uc3QgT2N0ZXQxNiYgeCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgeikgewotICAgIHJldHVybiBib2R5KHUsIHYsIHgsIHopOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZjQgZjQ7Ci0vLyBOYW1lOiBmNQotLy8gUGFyYW1zOiBjb25zdCB1aW50OF90KiB3LCBjb25zdCBPY3RldDE2JiBuMSwgY29uc3QgT2N0ZXQxNiYgbjIsIHVpbnQ4X3QqIGExLAotLy8gdWludDhfdCogYTIsIE9jdGV0MTYqIG1hY19rZXksIE9jdGV0MTYqIGx0ayBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgZjUgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgdWludDhfdCogdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYTEsIHVpbnQ4X3QqIGEyLCBPY3RldDE2KiBtYWNfa2V5LCBPY3RldDE2KiBsdGspPgotICAgICAgYm9keXtbXShjb25zdCB1aW50OF90KiB3LCBjb25zdCBPY3RldDE2JiBuMSwgY29uc3QgT2N0ZXQxNiYgbjIsCi0gICAgICAgICAgICAgIHVpbnQ4X3QqIGExLCB1aW50OF90KiBhMiwgT2N0ZXQxNiogbWFjX2tleSwgT2N0ZXQxNiogbHRrKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCB1aW50OF90KiB3LCBjb25zdCBPY3RldDE2JiBuMSwgY29uc3QgT2N0ZXQxNiYgbjIsCi0gICAgICAgICAgICAgICAgICB1aW50OF90KiBhMSwgdWludDhfdCogYTIsIE9jdGV0MTYqIG1hY19rZXksIE9jdGV0MTYqIGx0aykgewotICAgIGJvZHkodywgbjEsIG4yLCBhMSwgYTIsIG1hY19rZXksIGx0ayk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBmNSBmNTsKLS8vIE5hbWU6IGY2Ci0vLyBQYXJhbXM6IGNvbnN0IE9jdGV0MTYmIHcsIGNvbnN0IE9jdGV0MTYmIG4xLCBjb25zdCBPY3RldDE2JiBuMiwgY29uc3QKLS8vIE9jdGV0MTYmIHIsIHVpbnQ4X3QqIGlvY2FwLCB1aW50OF90KiBhMSwgdWludDhfdCogYTIgUmV0dXJuczogT2N0ZXQxNgotc3RydWN0IGY2IHsKLSAgT2N0ZXQxNiBvY3RldDE2OwotICBzdGQ6OmZ1bmN0aW9uPE9jdGV0MTYoY29uc3QgT2N0ZXQxNiYgdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgciwgdWludDhfdCogaW9jYXAsIHVpbnQ4X3QqIGExLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYTIpPgotICAgICAgYm9keXtbdGhpc10oY29uc3QgT2N0ZXQxNiYgdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgciwgdWludDhfdCogaW9jYXAsIHVpbnQ4X3QqIGExLAotICAgICAgICAgICAgICAgICAgdWludDhfdCogYTIpIHsgcmV0dXJuIG9jdGV0MTY7IH19OwotICBPY3RldDE2IG9wZXJhdG9yKCkoY29uc3QgT2N0ZXQxNiYgdywgY29uc3QgT2N0ZXQxNiYgbjEsIGNvbnN0IE9jdGV0MTYmIG4yLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2N0ZXQxNiYgciwgdWludDhfdCogaW9jYXAsIHVpbnQ4X3QqIGExLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYTIpIHsKLSAgICByZXR1cm4gYm9keSh3LCBuMSwgbjIsIHIsIGlvY2FwLCBhMSwgYTIpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgZjYgZjY7Ci0vLyBOYW1lOiBnMgotLy8gUGFyYW1zOiBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LCBjb25zdCBPY3RldDE2JgotLy8geSBSZXR1cm5zOiB1aW50MzJfdAotc3RydWN0IGcyIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50MzJfdChjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHkpPgotICAgICAgYm9keXtbXShjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LAotICAgICAgICAgICAgICBjb25zdCBPY3RldDE2JiB5KSB7IHJldHVybiAwOyB9fTsKLSAgdWludDMyX3Qgb3BlcmF0b3IoKShjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBjb25zdCBPY3RldDE2JiB4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9jdGV0MTYmIHkpIHsKLSAgICByZXR1cm4gYm9keSh1LCB2LCB4LCB5KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGcyIGcyOwotLy8gTmFtZTogbHRrX3RvX2xpbmtfa2V5Ci0vLyBQYXJhbXM6IGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcKLS8vIFJldHVybnM6IE9jdGV0MTYKLXN0cnVjdCBsdGtfdG9fbGlua19rZXkgewotICBPY3RldDE2IG9jdGV0MTY7Ci0gIHN0ZDo6ZnVuY3Rpb248T2N0ZXQxNihjb25zdCBPY3RldDE2JiBsdGssIGJvb2wgdXNlX2g3KT4gYm9keXsKLSAgICAgIFt0aGlzXShjb25zdCBPY3RldDE2JiBsdGssIGJvb2wgdXNlX2g3KSB7IHJldHVybiBvY3RldDE2OyB9fTsKLSAgT2N0ZXQxNiBvcGVyYXRvcigpKGNvbnN0IE9jdGV0MTYmIGx0aywgYm9vbCB1c2VfaDcpIHsKLSAgICByZXR1cm4gYm9keShsdGssIHVzZV9oNyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsdGtfdG9fbGlua19rZXkgbHRrX3RvX2xpbmtfa2V5OwotLy8gTmFtZTogbGlua19rZXlfdG9fbHRrCi0vLyBQYXJhbXM6IGNvbnN0IE9jdGV0MTYmIGxpbmtfa2V5LCBib29sIHVzZV9oNwotLy8gUmV0dXJuczogT2N0ZXQxNgotc3RydWN0IGxpbmtfa2V5X3RvX2x0ayB7Ci0gIE9jdGV0MTYgb2N0ZXQxNjsKLSAgc3RkOjpmdW5jdGlvbjxPY3RldDE2KGNvbnN0IE9jdGV0MTYmIGxpbmtfa2V5LCBib29sIHVzZV9oNyk+IGJvZHl7Ci0gICAgICBbdGhpc10oY29uc3QgT2N0ZXQxNiYgbGlua19rZXksIGJvb2wgdXNlX2g3KSB7IHJldHVybiBvY3RldDE2OyB9fTsKLSAgT2N0ZXQxNiBvcGVyYXRvcigpKGNvbnN0IE9jdGV0MTYmIGxpbmtfa2V5LCBib29sIHVzZV9oNykgewotICAgIHJldHVybiBib2R5KGxpbmtfa2V5LCB1c2VfaDcpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbGlua19rZXlfdG9fbHRrIGxpbmtfa2V5X3RvX2x0azsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2NyeXB0b190b29sYm94Ci19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2NyeXB0b190b29sYm94X2Flc19jbWFjLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfY3J5cHRvX3Rvb2xib3hfYWVzX2NtYWMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzODgzMzMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfY3J5cHRvX3Rvb2xib3hfYWVzX2NtYWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9hZXMuaCIKLSNpbmNsdWRlICJzdGFjay9jcnlwdG9fdG9vbGJveC9jcnlwdG9fdG9vbGJveC5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIGNyeXB0b190b29sYm94IHsKLU9jdGV0MTYgYWVzX2NtYWMoY29uc3QgT2N0ZXQxNiYga2V5LCBjb25zdCB1aW50OF90KiBpbnB1dCwgdWludDE2X3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICBPY3RldDE2IG9jdGV0MTY7Ci0gIHJldHVybiBvY3RldDE2OwotfQotfSAgLy8gbmFtZXNwYWNlIGNyeXB0b190b29sYm94CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19nYXBfYmxlLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2FwX2JsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5YzI5My4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19nYXBfYmxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjYKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotYm9vbCBHQVBfQmxlQ2FuY2VsUmVhZFBlZXJEZXZOYW1lKGNvbnN0IFJhd0FkZHJlc3MmIHBlZXJfYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEdBUF9CbGVSZWFkUGVlckRldk5hbWUoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBUF9CTEVfQ01QTF9DQkFDSyogcF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBHQVBfQmxlUmVhZFBlZXJQcmVmQ29ublBhcmFtcyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdm9pZCBHQVBfQmxlQXR0ckRCVXBkYXRlKHVpbnQxNl90IGF0dHJfdXVpZCwgdEdBUF9CTEVfQVRUUl9WQUxVRSogcF92YWx1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZ2FwX2F0dHJfZGJfaW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19nYXBfY29ubi5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhcF9jb25uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzhhZjBkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhcF9jb25uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEzCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImRldmljZS9pbmNsdWRlL2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJnYXBfYXBpLmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgImwyY2RlZnMuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9maXhlZF9xdWV1ZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL211dGV4LmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1jb25zdCBSYXdBZGRyZXNzKiBHQVBfQ29ubkdldFJlbW90ZUFkZHIodWludDE2X3QgZ2FwX2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1pbnQgR0FQX0dldFJ4UXVldWVDbnQodWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCogcF9yeF9xdWV1ZV9jb3VudCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBHQVBfQ29ubkNsb3NlKHVpbnQxNl90IGdhcF9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgR0FQX0Nvbm5HZXRMMkNBUENpZCh1aW50MTZfdCBnYXBfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEdBUF9Db25uR2V0UmVtTXR1U2l6ZSh1aW50MTZfdCBnYXBfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEdBUF9Db25uT3Blbihjb25zdCBjaGFyKiBwX3NlcnZfbmFtZSwgdWludDhfdCBzZXJ2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc2VydmVyLCBjb25zdCBSYXdBZGRyZXNzKiBwX3JlbV9iZGEsIHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZV9tcHMsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcsCi0gICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0VSVE1fSU5GTyogZXJ0bV9pbmZvLCB1aW50MTZfdCBzZWN1cml0eSwKLSAgICAgICAgICAgICAgICAgICAgICB0R0FQX0NPTk5fQ0FMTEJBQ0sqIHBfY2IsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQxNl90IEdBUF9Db25uUmVhZERhdGEodWludDE2X3QgZ2FwX2hhbmRsZSwgdWludDhfdCogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfbGVuLCB1aW50MTZfdCogcF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDE2X3QgR0FQX0Nvbm5Xcml0ZURhdGEodWludDE2X3QgZ2FwX2hhbmRsZSwgQlRfSERSKiBtc2cpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBHQVBfSW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGdhcF90eF9jb21wbGV0ZV9pbmQodWludDE2X3QgbDJjYXBfY2lkLCB1aW50MTZfdCBzZHVfc2VudCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHQuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19nYXR0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzM5YWIwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjI3Ci0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2dhdHRfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBuYW1lc3BhY2UgYmx1ZXRvb3RoOwotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci10R0FUVF9IRExfTElTVF9FTEVNIGVsZW07ICAvLyBnYXR0X2FkZF9hbl9pdGVtX3RvX2xpc3QKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWJvb2wgR0FUVFNfRGVsZXRlU2VydmljZSh0R0FUVF9JRiBnYXR0X2lmLCBVdWlkKiBwX3N2Y191dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN2Y19pbnN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEdBVFRTX05WUmVnaXN0ZXIodEdBVFRfQVBQTF9JTkZPKiBwX2NiX2luZm8pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgR0FUVF9DYW5jZWxDb25uZWN0KHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2RpcmVjdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBHQVRUX0Nvbm5lY3QodEdBVFRfSUYgZ2F0dF9pZiwgY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgYm9vbCBpc19kaXJlY3QsCi0gICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgYm9vbCBvcHBvcnR1bmlzdGljKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIEdBVFRfQ29ubmVjdCh0R0FUVF9JRiBnYXR0X2lmLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCBib29sIGlzX2RpcmVjdCwKLSAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBib29sIG9wcG9ydHVuaXN0aWMsCi0gICAgICAgICAgICAgICAgICB1aW50OF90IGluaXRpYXRpbmdfcGh5cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBHQVRUX0dldENvbm5JZElmQ29ubmVjdGVkKHRHQVRUX0lGIGdhdHRfaWYsIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfY29ubl9pZCwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgR0FUVF9HZXRDb25uZWN0aW9uSW5mb3IodWludDE2X3QgY29ubl9pZCwgdEdBVFRfSUYqIHBfZ2F0dF9pZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCogcF90cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgaXNfYWN0aXZlX3NlcnZpY2UoY29uc3QgVXVpZCYgYXBwX3V1aWQxMjgsIFV1aWQqIHBfc3ZjX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN0YXJ0X2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdEdBVFRfSERMX0xJU1RfRUxFTSYgZ2F0dF9hZGRfYW5faXRlbV90b19saXN0KHVpbnQxNl90IHNfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZWxlbTsKLX0KLXRHQVRUX0lGIEdBVFRfUmVnaXN0ZXIoY29uc3QgVXVpZCYgYXBwX3V1aWQxMjgsIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX0NCQUNLKiBwX2NiX2luZm8sIGJvb2wgZWF0dF9zdXBwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXRHQVRUX1NUQVRVUyBHQVRUQ19Db25maWd1cmVNVFUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgbXR1KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIEdBVFRDX0Rpc2NvdmVyKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIEdBVFRDX0Rpc2NvdmVyKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX0RJU0NfVFlQRSBkaXNjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhcnRfaGFuZGxlLCB1aW50MTZfdCBlbmRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFV1aWQmIHV1aWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci10R0FUVF9TVEFUVVMgR0FUVENfRXhlY3V0ZVdyaXRlKHVpbnQxNl90IGNvbm5faWQsIGJvb2wgaXNfZXhlY3V0ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBHQVRUQ19SZWFkKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1JFQURfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfUkVBRF9QQVJBTSogcF9yZWFkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIEdBVFRDX1NlbmRIYW5kbGVWYWx1ZUNvbmZpcm0odWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgY2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIEdBVFRDX1dyaXRlKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUX1dSSVRFX1RZUEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9WQUxVRSogcF93cml0ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBHQVRUU19BZGRTZXJ2aWNlKHRHQVRUX0lGIGdhdHRfaWYsIGJ0Z2F0dF9kYl9lbGVtZW50X3QqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci10R0FUVF9TVEFUVVMgR0FUVFNfSGFuZGxlVmFsdWVJbmRpY2F0aW9uKHVpbnQxNl90IGNvbm5faWQsIHVpbnQxNl90IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWxfbGVuLCB1aW50OF90KiBwX3ZhbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBHQVRUU19IYW5kbGVWYWx1ZU5vdGlmaWNhdGlvbih1aW50MTZfdCBjb25uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZhbF9sZW4sIHVpbnQ4X3QqIHBfdmFsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIEdBVFRTX1NlbmRSc3AodWludDE2X3QgY29ubl9pZCwgdWludDMyX3QgdHJhbnNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMgc3RhdHVzLCB0R0FUVFNfUlNQKiBwX21zZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyBHQVRUX0Rpc2Nvbm5lY3QodWludDE2X3QgY29ubl9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXZvaWQgR0FUVFNfU3RvcFNlcnZpY2UodWludDE2X3Qgc2VydmljZV9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIEdBVFRfRGVyZWdpc3Rlcih0R0FUVF9JRiBnYXR0X2lmKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIEdBVFRfU2V0SWRsZVRpbWVvdXQoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgaWRsZV90b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBHQVRUX1N0YXJ0SWYodEdBVFRfSUYgZ2F0dF9pZikgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2F0dF9hdHRyLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2F0dF9hdHRyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFlZGUyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHRfYXR0ci5jYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxNAotICovCi0KLSNpbmNsdWRlIDxiYXNlL2NhbGxiYWNrLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgInN0YWNrL2dhdHQvZ2F0dF9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdWludDE2X3QgZ2F0dF9wcm9maWxlX2ZpbmRfY29ubl9pZF9ieV9iZF9hZGRyKGNvbnN0IFJhd0FkZHJlc3MmIHJlbW90ZV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotYm9vbCBnYXR0X3Byb2ZpbGVfZ2V0X2VhdHRfc3VwcG9ydCgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfYmRhLAotICAgIGJhc2U6Ok9uY2VDYWxsYmFjazx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmLCBib29sKT4gY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgZ2F0dF9zcl9pc19jbF9jaGFuZ2VfYXdhcmUodEdBVFRfVENCJiB0Y2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXRHQVRUX1BST0ZJTEVfQ0xDQiogZ2F0dF9wcm9maWxlX2NsY2JfYWxsb2ModWludDE2X3QgY29ubl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5wb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRHQVRUX1NUQVRVUyBwcm9jX3JlYWRfcmVxKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUU19SRVFfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1JFQURfUkVRKiBwX2RhdGEsIHRHQVRUU19SU1AqIHBfcnNwKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdEdBVFRfU1RBVFVTIHByb2Nfd3JpdGVfcmVxKHVpbnQxNl90IGNvbm5faWQsIHRHQVRUU19SRVFfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9XUklURV9SRVEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfU1VDQ0VTUzsKLX0KLXRHQVRUX1NUQVRVUyByZWFkX2F0dHJfdmFsdWUodWludDE2X3QgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9WQUxVRSogcF92YWx1ZSwgYm9vbCBpc19sb25nKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gR0FUVF9TVUNDRVNTOwotfQotdm9pZCBHQVRUX0NvbmZpZ1NlcnZpY2VDaGFuZ2VDQ0MoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2JkYSwgYm9vbCBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZ2F0dF9wcm9maWxlX2NsY2JfZGVhbGxvYyh0R0FUVF9QUk9GSUxFX0NMQ0IqIHBfY2xjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZ2F0dF9wcm9maWxlX2RiX2luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBnYXR0X3NyX2luaXRfY2xfc3RhdHVzKHRHQVRUX1RDQiYgdGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X3NyX3VwZGF0ZV9jbF9zdGF0dXModEdBVFRfVENCJiB0Y2IsIGJvb2wgY2hnX2F3YXJlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2F0dF9hdXRoLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2F0dF9hdXRoLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzM1YTBmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHRfYXV0aC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9nYXR0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWJvb2wgZ2F0dF9zZWN1cml0eV9jaGVja19zdGFydCh0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXRHQVRUX1NFQ19BQ1RJT04gZ2F0dF9kZXRlcm1pbmVfc2VjX2FjdCh0R0FUVF9DTENCKiBwX2NsY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBHQVRUX1NFQ19OT05FOwotfQotdEdBVFRfU0VDX0FDVElPTiBnYXR0X2dldF9zZWNfYWN0KHRHQVRUX1RDQiogcF90Y2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBHQVRUX1NFQ19OT05FOwotfQotdEdBVFRfU1RBVFVTIGdhdHRfZ2V0X2xpbmtfZW5jcnlwdF9zdGF0dXModEdBVFRfVENCJiB0Y2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBHQVRUX1NVQ0NFU1M7Ci19Ci12b2lkIGdhdHRfZW5jX2NtcGxfY2JhY2soY29uc3QgUmF3QWRkcmVzcyogYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEX0FUVFIgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgcmVzdWx0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X25vdGlmeV9lbmNfY21wbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X3NlY19jaGVja19jb21wbGV0ZShib29sIHNlY19jaGVja19vaywgdEdBVFRfQ0xDQiogcF9jbGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY19hY3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfc2V0X3NlY19hY3QodEdBVFRfVENCKiBwX3RjYiwgdEdBVFRfU0VDX0FDVElPTiBzZWNfYWN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X3ZlcmlmeV9zaWduYXR1cmUodEdBVFRfVENCJiB0Y2IsIHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHRfY29ubmVjdGlvbl9tYW5hZ2VyLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2F0dF9jb25uZWN0aW9uX21hbmFnZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTA1NTAuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfZ2F0dF9jb25uZWN0aW9uX21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTYKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8YmFzZS9iaW5kLmg+Ci0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGJhc2UvbG9jYXRpb24uaD4KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fYmxlX2JnY29ubi5oIgotI2luY2x1ZGUgInN0YWNrL2dhdHQvY29ubmVjdGlvbl9tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNfYXBpLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGNvbm5lY3Rpb25fbWFuYWdlcjsKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLWJvb2wgY29ubmVjdGlvbl9tYW5hZ2VyOjpiYWNrZ3JvdW5kX2Nvbm5lY3RfYWRkKHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBjb25uZWN0aW9uX21hbmFnZXI6OmJhY2tncm91bmRfY29ubmVjdF9yZW1vdmUodWludDhfdCBhcHBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbm5lY3Rpb25fbWFuYWdlcjo6ZGlyZWN0X2Nvbm5lY3RfYWRkKHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbm5lY3Rpb25fbWFuYWdlcjo6ZGlyZWN0X2Nvbm5lY3RfcmVtb3ZlKHVpbnQ4X3QgYXBwX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbm5lY3Rpb25fbWFuYWdlcjo6cmVtb3ZlX3VuY29uZGl0aW9uYWwoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBjb25uZWN0aW9uX21hbmFnZXI6OnJlbW92ZV91bmNvbmRpdGlvbmFsX2Zyb21fc2hpbSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1zdGQ6OnNldDx0QVBQX0lEPiBjb25uZWN0aW9uX21hbmFnZXI6OmdldF9hcHBzX2Nvbm5lY3RpbmdfdG8oCi0gICAgY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHN0ZDo6c2V0PHRBUFBfSUQ+KCk7Ci19Ci12b2lkIGNvbm5lY3Rpb25fbWFuYWdlcjo6ZHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgY29ubmVjdGlvbl9tYW5hZ2VyOjpvbl9hcHBfZGVyZWdpc3RlcmVkKHVpbnQ4X3QgYXBwX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBjb25uZWN0aW9uX21hbmFnZXI6Om9uX2Nvbm5lY3Rpb25fY29tcGxldGUoY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotdm9pZCBjb25uZWN0aW9uX21hbmFnZXI6Om9uX2Nvbm5lY3Rpb25fdGltZWRfb3V0X2Zyb21fc2hpbSgKLSAgICBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi12b2lkIGNvbm5lY3Rpb25fbWFuYWdlcjo6cmVzZXQoYm9vbCBhZnRlcl9yZXNldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHRfbWFpbi5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2dhdHRfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5YmI2Mi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19nYXR0X21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjIzCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2JsZV9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX2Rldi5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svZ2F0dC9nYXR0X2ludC5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9sMmNhcF9hY2xfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXZvaWQgZ2F0dF9pbml0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLWJvb2wgZ2F0dF9hY3RfY29ubmVjdCh0R0FUVF9SRUcqIHBfcmVnLCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCBpbnQ4X3QgaW5pdGlhdGluZ19waHlzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGdhdHRfY29ubmVjdChjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB0R0FUVF9UQ0IqIHBfdGNiLAotICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHVpbnQ4X3QgaW5pdGlhdGluZ19waHlzLAotICAgICAgICAgICAgICAgICAgdEdBVFRfSUYgZ2F0dF9pZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBnYXR0X2Rpc2Nvbm5lY3QodEdBVFRfVENCKiBwX3RjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBnYXR0X3VwZGF0ZV9hcHBfaG9sZF9saW5rX3N0YXR1cyh0R0FUVF9JRiBnYXR0X2lmLCB0R0FUVF9UQ0IqIHBfdGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FkZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdEdBVFRfQ0hfU1RBVEUgZ2F0dF9nZXRfY2hfc3RhdGUodEdBVFRfVENCKiBwX3RjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEdBVFRfQ0hfQ0xPU0U7Ci19Ci12b2lkIGdhdHRfYWRkX2FfYm9uZGVkX2Rldl9mb3Jfc3J2X2NoZyhjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfY2hrX3Nydl9jaGcodEdBVFRTX1NSVl9DSEcqIHBfc3J2X2NoZ19jbHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfZGF0YV9wcm9jZXNzKHRHQVRUX1RDQiYgdGNiLCB1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9idWYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfZmluZF9pbl9kZXZpY2VfcmVjb3JkKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCTEVfQkRfQUREUiogYWRkcmVzc193aXRoX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfZnJlZSh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGdhdHRfaW5pdF9zcnZfY2hnKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgZ2F0dF9sMmNpZl9jb25maWdfY2ZtX2NiYWNrKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IGluaXRpYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfbDJjaWZfY29uZmlnX2luZF9jYmFjayh1aW50MTZfdCBsY2lkLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X2wyY2lmX2Rpc2Nvbm5lY3RfaW5kX2NiYWNrKHVpbnQxNl90IGxjaWQsIGJvb2wgYWNrX25lZWRlZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZ2F0dF9ub3RpZnlfY29ubl91cGRhdGUoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlLCB1aW50MTZfdCBpbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhDSV9TVEFUVVMgc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X25vdGlmeV9waHlfdXBkYXRlZCh0R0FUVF9TVEFUVVMgc3RhdHVzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhfcGh5LCB1aW50OF90IHJ4X3BoeSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZ2F0dF9wcm9jX3Nydl9jaGcodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBnYXR0X3NlbmRfc3J2X2NoZ19pbmQoY29uc3QgUmF3QWRkcmVzcyYgcGVlcl9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGdhdHRfc2V0X2NoX3N0YXRlKHRHQVRUX1RDQiogcF90Y2IsIHRHQVRUX0NIX1NUQVRFIGNoX3N0YXRlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBnYXR0X3VwZGF0ZV9hcHBfdXNlX2xpbmtfZmxhZyh0R0FUVF9JRiBnYXR0X2lmLCB0R0FUVF9UQ0IqIHBfdGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FkZCwgYm9vbCBjaGVja19hY2xfbGluaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2hpZGRfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfaGlkZF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjI1NDYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfaGlkZF9hcGkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE2Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJidG1fYXBpLmgiCi0jaW5jbHVkZSAiaGlkZF9hcGkuaCIKLSNpbmNsdWRlICJoaWRkZWZzLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9zZWMuaCIKLSNpbmNsdWRlICJzdGFjay9oaWQvaGlkZF9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdEhJRF9TVEFUVVMgSElEX0RldkFkZFJlY29yZCh1aW50MzJfdCBoYW5kbGUsIGNoYXIqIHBfbmFtZSwgY2hhciogcF9kZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcF9wcm92aWRlciwgdWludDE2X3Qgc3ViY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRlc2NfbGVuLCB1aW50OF90KiBwX2Rlc2NfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0RldkNvbm5lY3Qodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0RldkRlcmVnaXN0ZXIodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0RldkRpc2Nvbm5lY3Qodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0RldkdldERldmljZShSYXdBZGRyZXNzKiBhZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfRGV2UGx1Z0RldmljZShjb25zdCBSYXdBZGRyZXNzJiBhZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfRGV2UmVnaXN0ZXIodEhJRF9ERVZfSE9TVF9DQUxMQkFDSyogaG9zdF9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0RldlJlcG9ydEVycm9yKHVpbnQ4X3QgZXJyb3IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLXRISURfU1RBVFVTIEhJRF9EZXZTZW5kUmVwb3J0KHVpbnQ4X3QgY2hhbm5lbCwgdWludDhfdCB0eXBlLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuLCB1aW50OF90KiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLXRISURfU1RBVFVTIEhJRF9EZXZTZXRJbmNvbWluZ1BvbGljeShib29sIGFsbG93KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfRGV2U2V0SW5jb21pbmdRb3ModWludDhfdCBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfRGV2U2V0T3V0Z29pbmdRb3ModWludDhfdCBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGgsIHVpbnQzMl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfRGV2VW5wbHVnRGV2aWNlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLXRISURfU1RBVFVTIEhJRF9EZXZWaXJ0dWFsQ2FibGVVbnBsdWcodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdWludDhfdCBISURfRGV2U2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEhJRF9EZXZJbml0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2hpZGguY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19oaWRoLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDdhMTI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2hpZGguY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTEKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGlkZGVmcy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvaGlkaF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NkcF9hcGkuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdEhJRF9TVEFUVVMgSElEX0hvc3RBZGREZXYoY29uc3QgUmF3QWRkcmVzcyYgYWRkciwgdWludDE2X3QgYXR0cl9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfSG9zdENsb3NlRGV2KHVpbnQ4X3QgZGV2X2hhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0hvc3REZXJlZ2lzdGVyKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLXRISURfU1RBVFVTIEhJRF9Ib3N0R2V0U0RQUmVjb3JkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdWludDMyX3QgZGJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEhJRF9IT1NUX1NEUF9DQUxMQkFDSyogc2RwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfSG9zdE9wZW5EZXYodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfSG9zdFJlZ2lzdGVyKHRISURfSE9TVF9ERVZfQ0FMTEJBQ0sqIGRldl9jYmFjaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIEhJRF9TVUNDRVNTOwotfQotdEhJRF9TVEFUVVMgSElEX0hvc3RSZW1vdmVEZXYodWludDhfdCBkZXZfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci10SElEX1NUQVRVUyBISURfSG9zdFdyaXRlRGV2KHVpbnQ4X3QgZGV2X2hhbmRsZSwgdWludDhfdCB0X3R5cGUsIHVpbnQ4X3QgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGEsIHVpbnQ4X3QgcmVwb3J0X2lkLCBCVF9IRFIqIHBidWYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBISURfU1VDQ0VTUzsKLX0KLXVpbnQ4X3QgSElEX0hvc3RTZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gSElEX1NVQ0NFU1M7Ci19Ci12b2lkIEhJRF9Ib3N0SW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGhpZGhfZ2V0X3N0cl9hdHRyKHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBhdHRyX2lkLCB1aW50MTZfdCBtYXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBzdHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDRlZWYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozMwotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2wyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfYXBpLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfbDJjYXBfYXBpIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgbDJjX2dldF90cmFuc3BvcnRfZnJvbV9maXhlZF9jaWQgbDJjX2dldF90cmFuc3BvcnRfZnJvbV9maXhlZF9jaWQ7Ci1zdHJ1Y3QgTDJDQV9SZWdpc3RlcjIgTDJDQV9SZWdpc3RlcjI7Ci1zdHJ1Y3QgTDJDQV9SZWdpc3RlciBMMkNBX1JlZ2lzdGVyOwotc3RydWN0IEwyQ0FfRGVyZWdpc3RlciBMMkNBX0RlcmVnaXN0ZXI7Ci1zdHJ1Y3QgTDJDQV9BbGxvY2F0ZUxlUFNNIEwyQ0FfQWxsb2NhdGVMZVBTTTsKLXN0cnVjdCBMMkNBX0ZyZWVMZVBTTSBMMkNBX0ZyZWVMZVBTTTsKLXN0cnVjdCBMMkNBX0Nvbm5lY3RSZXEyIEwyQ0FfQ29ubmVjdFJlcTI7Ci1zdHJ1Y3QgTDJDQV9Db25uZWN0UmVxIEwyQ0FfQ29ubmVjdFJlcTsKLXN0cnVjdCBMMkNBX1JlZ2lzdGVyTEVDb2MgTDJDQV9SZWdpc3RlckxFQ29jOwotc3RydWN0IEwyQ0FfRGVyZWdpc3RlckxFQ29jIEwyQ0FfRGVyZWdpc3RlckxFQ29jOwotc3RydWN0IEwyQ0FfQ29ubmVjdExFQ29jUmVxIEwyQ0FfQ29ubmVjdExFQ29jUmVxOwotc3RydWN0IEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnIEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnOwotc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwOwotc3RydWN0IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxIEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxOwotc3RydWN0IEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxIEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxOwotc3RydWN0IEwyQ0FfRGlzY29ubmVjdFJlcSBMMkNBX0Rpc2Nvbm5lY3RSZXE7Ci1zdHJ1Y3QgTDJDQV9EaXNjb25uZWN0TEVDb2NSZXEgTDJDQV9EaXNjb25uZWN0TEVDb2NSZXE7Ci1zdHJ1Y3QgTDJDQV9HZXRSZW1vdGVDaWQgTDJDQV9HZXRSZW1vdGVDaWQ7Ci1zdHJ1Y3QgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyIEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcjsKLXN0cnVjdCBMMkNBX1NldFRyYWNlTGV2ZWwgTDJDQV9TZXRUcmFjZUxldmVsOwotc3RydWN0IEwyQ0FfU2V0QWNsUHJpb3JpdHkgTDJDQV9TZXRBY2xQcmlvcml0eTsKLXN0cnVjdCBMMkNBX1NldFR4UHJpb3JpdHkgTDJDQV9TZXRUeFByaW9yaXR5Owotc3RydWN0IEwyQ0FfR2V0UGVlckZlYXR1cmVzIEwyQ0FfR2V0UGVlckZlYXR1cmVzOwotc3RydWN0IEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbDsKLXN0cnVjdCBMMkNBX0Nvbm5lY3RGaXhlZENobmwgTDJDQV9Db25uZWN0Rml4ZWRDaG5sOwotc3RydWN0IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEgTDJDQV9TZW5kRml4ZWRDaG5sRGF0YTsKLXN0cnVjdCBMMkNBX1JlbW92ZUZpeGVkQ2hubCBMMkNBX1JlbW92ZUZpeGVkQ2hubDsKLXN0cnVjdCBMMkNBX1NldExlR2F0dFRpbWVvdXQgTDJDQV9TZXRMZUdhdHRUaW1lb3V0Owotc3RydWN0IEwyQ0FfRGF0YVdyaXRlIEwyQ0FfRGF0YVdyaXRlOwotc3RydWN0IEwyQ0FfTEVDb2NEYXRhV3JpdGUgTDJDQV9MRUNvY0RhdGFXcml0ZTsKLXN0cnVjdCBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkgTDJDQV9TZXRDaG5sRmx1c2hhYmlsaXR5Owotc3RydWN0IEwyQ0FfRmx1c2hDaGFubmVsIEwyQ0FfRmx1c2hDaGFubmVsOwotc3RydWN0IEwyQ0FfSXNMaW5rRXN0YWJsaXNoZWQgTDJDQV9Jc0xpbmtFc3RhYmxpc2hlZDsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2wyY2FwX2FwaQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotdEJUX1RSQU5TUE9SVCBsMmNfZ2V0X3RyYW5zcG9ydF9mcm9tX2ZpeGVkX2NpZCh1aW50MTZfdCBmaXhlZF9jaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OmwyY19nZXRfdHJhbnNwb3J0X2Zyb21fZml4ZWRfY2lkKAotICAgICAgZml4ZWRfY2lkKTsKLX0KLXVpbnQxNl90IEwyQ0FfUmVnaXN0ZXIyKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXlfbXR1LCB1aW50MTZfdCByZXF1aXJlZF9yZW1vdGVfbXR1LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX1JlZ2lzdGVyMigKLSAgICAgIHBzbSwgcF9jYl9pbmZvLCBlbmFibGVfc25vb3AsIHBfZXJ0bV9pbmZvLCBteV9tdHUsIHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICBzZWNfbGV2ZWwpOwotfQotdWludDE2X3QgTDJDQV9SZWdpc3Rlcih1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIHBfY2JfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9SZWdpc3RlcigKLSAgICAgIHBzbSwgcF9jYl9pbmZvLCBlbmFibGVfc25vb3AsIHBfZXJ0bV9pbmZvLCBteV9tdHUsIHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICBzZWNfbGV2ZWwpOwotfQotdm9pZCBMMkNBX0RlcmVnaXN0ZXIodWludDE2X3QgcHNtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfRGVyZWdpc3Rlcihwc20pOwotfQotdWludDE2X3QgTDJDQV9BbGxvY2F0ZUxlUFNNKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfQWxsb2NhdGVMZVBTTSgpOwotfQotdm9pZCBMMkNBX0ZyZWVMZVBTTSh1aW50MTZfdCBwc20pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9GcmVlTGVQU00ocHNtKTsKLX0KLXVpbnQxNl90IEwyQ0FfQ29ubmVjdFJlcTIodWludDE2X3QgcHNtLCBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9Db25uZWN0UmVxMihwc20sIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfbGV2ZWwpOwotfQotdWludDE2X3QgTDJDQV9Db25uZWN0UmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX0Nvbm5lY3RSZXEocHNtLCBwX2JkX2FkZHIpOwotfQotdWludDE2X3QgTDJDQV9SZWdpc3RlckxFQ29jKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCwgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9SZWdpc3RlckxFQ29jKHBzbSwgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjX2xldmVsLCBjZmcpOwotfQotdm9pZCBMMkNBX0RlcmVnaXN0ZXJMRUNvYyh1aW50MTZfdCBwc20pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9EZXJlZ2lzdGVyTEVDb2MocHNtKTsKLX0KLXVpbnQxNl90IEwyQ0FfQ29ubmVjdExFQ29jUmVxKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZywgdWludDE2X3Qgc2VjX2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX0Nvbm5lY3RMRUNvY1JlcShwc20sIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jZmcsIHNlY19sZXZlbCk7Ci19Ci1ib29sIEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnKHVpbnQxNl90IGxjaWQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnKGxjaWQsIHBlZXJfY2ZnKTsKLX0KLWJvb2wgTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUnNwKAotICAgICAgcF9iZF9hZGRyLCBpZCwgYWNjZXB0ZWRfbGNpZHMsIHJlc3VsdCwgcF9jZmcpOwotfQotc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxKHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSZXEocHNtLCBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2ZnKTsKLX0KLWJvb2wgTDJDQV9SZWNvbmZpZ0NyZWRpdEJhc2VkQ29ubnNSZXEoY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGxjaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcSgKLSAgICAgIGJkYSwgbGNpZHMsIHBfY2ZnKTsKLX0KLWJvb2wgTDJDQV9EaXNjb25uZWN0UmVxKHVpbnQxNl90IGNpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9EaXNjb25uZWN0UmVxKGNpZCk7Ci19Ci1ib29sIEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxKHVpbnQxNl90IGNpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9EaXNjb25uZWN0TEVDb2NSZXEoY2lkKTsKLX0KLWJvb2wgTDJDQV9HZXRSZW1vdGVDaWQodWludDE2X3QgbGNpZCwgdWludDE2X3QqIHJjaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfR2V0UmVtb3RlQ2lkKGxjaWQsIHJjaWQpOwotfQotYm9vbCBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHIoCi0gICAgICBiZF9hZGRyLCB0aW1lb3V0LCB0cmFuc3BvcnQpOwotfQotdWludDhfdCBMMkNBX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfU2V0VHJhY2VMZXZlbChuZXdfbGV2ZWwpOwotfQotYm9vbCBMMkNBX1NldEFjbFByaW9yaXR5KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9TZXRBY2xQcmlvcml0eShiZF9hZGRyLCBwcmlvcml0eSk7Ci19Ci1ib29sIEwyQ0FfU2V0VHhQcmlvcml0eSh1aW50MTZfdCBjaWQsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX1NldFR4UHJpb3JpdHkoY2lkLCBwcmlvcml0eSk7Ci19Ci1ib29sIEwyQ0FfR2V0UGVlckZlYXR1cmVzKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2NobmxfbWFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9HZXRQZWVyRmVhdHVyZXMoYmRfYWRkciwgcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jaG5sX21hc2spOwotfQotYm9vbCBMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsKHVpbnQxNl90IGZpeGVkX2NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfRklYRURfQ0hOTF9SRUcqIHBfZnJlZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbChmaXhlZF9jaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mcmVnKTsKLX0KLWJvb2wgTDJDQV9Db25uZWN0Rml4ZWRDaG5sKHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9Db25uZWN0Rml4ZWRDaG5sKGZpeGVkX2NpZCwgcmVtX2JkYSk7Ci19Ci11aW50MTZfdCBMMkNBX1NlbmRGaXhlZENobmxEYXRhKHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9TZW5kRml4ZWRDaG5sRGF0YShmaXhlZF9jaWQsIHJlbV9iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYpOwotfQotYm9vbCBMMkNBX1JlbW92ZUZpeGVkQ2hubCh1aW50MTZfdCBmaXhlZF9jaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfUmVtb3ZlRml4ZWRDaG5sKGZpeGVkX2NpZCwgcmVtX2JkYSk7Ci19Ci1ib29sIEwyQ0FfU2V0TGVHYXR0VGltZW91dChjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBpZGxlX3RvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9hcGk6OkwyQ0FfU2V0TGVHYXR0VGltZW91dChyZW1fYmRhLCBpZGxlX3RvdXQpOwotfQotdWludDhfdCBMMkNBX0RhdGFXcml0ZSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX0RhdGFXcml0ZShjaWQsIHBfZGF0YSk7Ci19Ci11aW50OF90IEwyQ0FfTEVDb2NEYXRhV3JpdGUodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9MRUNvY0RhdGFXcml0ZShjaWQsIHBfZGF0YSk7Ci19Ci1ib29sIEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSh1aW50MTZfdCBjaWQsIGJvb2wgaXNfZmx1c2hhYmxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX1NldENobmxGbHVzaGFiaWxpdHkoY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZmx1c2hhYmxlKTsKLX0KLXVpbnQxNl90IEwyQ0FfRmx1c2hDaGFubmVsKHVpbnQxNl90IGxjaWQsIHVpbnQxNl90IG51bV90b19mbHVzaCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2FwaTo6TDJDQV9GbHVzaENoYW5uZWwobGNpZCwgbnVtX3RvX2ZsdXNoKTsKLX0KLWJvb2wgTDJDQV9Jc0xpbmtFc3RhYmxpc2hlZChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYXBpOjpMMkNBX0lzTGlua0VzdGFibGlzaGVkKGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2wyY2FwX2FwaS5oIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjgyZmM3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2wyY2FwX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDozMwotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJkZXZpY2UvaW5jbHVkZS9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL2wyY19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfbDJjYXBfYXBpIHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IGwyY19nZXRfdHJhbnNwb3J0X2Zyb21fZml4ZWRfY2lkCi0vLyBQYXJhbXM6IHVpbnQxNl90IGZpeGVkX2NpZAotLy8gUmV0dXJuczogdEJUX1RSQU5TUE9SVAotc3RydWN0IGwyY19nZXRfdHJhbnNwb3J0X2Zyb21fZml4ZWRfY2lkIHsKLSAgc3RkOjpmdW5jdGlvbjx0QlRfVFJBTlNQT1JUKHVpbnQxNl90IGZpeGVkX2NpZCk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBmaXhlZF9jaWQpIHsgcmV0dXJuIDA7IH19OwotICB0QlRfVFJBTlNQT1JUIG9wZXJhdG9yKCkodWludDE2X3QgZml4ZWRfY2lkKSB7IHJldHVybiBib2R5KGZpeGVkX2NpZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNfZ2V0X3RyYW5zcG9ydF9mcm9tX2ZpeGVkX2NpZCBsMmNfZ2V0X3RyYW5zcG9ydF9mcm9tX2ZpeGVkX2NpZDsKLS8vIE5hbWU6IEwyQ0FfUmVnaXN0ZXIyCi0vLyBQYXJhbXM6IHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLCBib29sIGVuYWJsZV9zbm9vcCwKLS8vIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLCB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0vLyB1aW50MTZfdCBzZWNfbGV2ZWwgUmV0dXJuczogdWludDE2X3QKLXN0cnVjdCBMMkNBX1JlZ2lzdGVyMiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDE2X3QodWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBwc20sIGNvbnN0IHRMMkNBUF9BUFBMX0lORk8mIHBfY2JfaW5mbywKLSAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLCB1aW50MTZfdCBteV9tdHUsCi0gICAgICAgICAgICAgIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsIHVpbnQxNl90IHNlY19sZXZlbCkgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc25vb3AsIHRMMkNBUF9FUlRNX0lORk8qIHBfZXJ0bV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwpIHsKLSAgICByZXR1cm4gYm9keShwc20sIHBfY2JfaW5mbywgZW5hYmxlX3Nub29wLCBwX2VydG1faW5mbywgbXlfbXR1LAotICAgICAgICAgICAgICAgIHJlcXVpcmVkX3JlbW90ZV9tdHUsIHNlY19sZXZlbCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlZ2lzdGVyMiBMMkNBX1JlZ2lzdGVyMjsKLS8vIE5hbWU6IEwyQ0FfUmVnaXN0ZXIKLS8vIFBhcmFtczogdWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sIGJvb2wgZW5hYmxlX3Nub29wLAotLy8gdEwyQ0FQX0VSVE1fSU5GTyogcF9lcnRtX2luZm8sIHVpbnQxNl90IG15X210dSwgdWludDE2X3QgcmVxdWlyZWRfcmVtb3RlX210dSwKLS8vIHVpbnQxNl90IHNlY19sZXZlbCBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfUmVnaXN0ZXIgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlX3Nub29wLCB0TDJDQVBfRVJUTV9JTkZPKiBwX2VydG1faW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sCi0gICAgICAgICAgICAgIGJvb2wgZW5hYmxlX3Nub29wLCB0TDJDQVBfRVJUTV9JTkZPKiBwX2VydG1faW5mbywgdWludDE2X3QgbXlfbXR1LAotICAgICAgICAgICAgICB1aW50MTZfdCByZXF1aXJlZF9yZW1vdGVfbXR1LCB1aW50MTZfdCBzZWNfbGV2ZWwpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlX3Nub29wLCB0TDJDQVBfRVJUTV9JTkZPKiBwX2VydG1faW5mbywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBteV9tdHUsIHVpbnQxNl90IHJlcXVpcmVkX3JlbW90ZV9tdHUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VjX2xldmVsKSB7Ci0gICAgcmV0dXJuIGJvZHkocHNtLCBwX2NiX2luZm8sIGVuYWJsZV9zbm9vcCwgcF9lcnRtX2luZm8sIG15X210dSwKLSAgICAgICAgICAgICAgICByZXF1aXJlZF9yZW1vdGVfbXR1LCBzZWNfbGV2ZWwpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9SZWdpc3RlciBMMkNBX1JlZ2lzdGVyOwotLy8gTmFtZTogTDJDQV9EZXJlZ2lzdGVyCi0vLyBQYXJhbXM6IHVpbnQxNl90IHBzbQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IEwyQ0FfRGVyZWdpc3RlciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBwc20pPiBib2R5e1tdKHVpbnQxNl90IHBzbSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgcHNtKSB7IGJvZHkocHNtKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfRGVyZWdpc3RlciBMMkNBX0RlcmVnaXN0ZXI7Ci0vLyBOYW1lOiBMMkNBX0FsbG9jYXRlTGVQU00KLS8vIFBhcmFtczogdm9pZAotLy8gUmV0dXJuczogdWludDE2X3QKLXN0cnVjdCBMMkNBX0FsbG9jYXRlTGVQU00gewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHZvaWQpPiBib2R5e1tdKHZvaWQpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKHZvaWQpIHsgcmV0dXJuIGJvZHkoKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQWxsb2NhdGVMZVBTTSBMMkNBX0FsbG9jYXRlTGVQU007Ci0vLyBOYW1lOiBMMkNBX0ZyZWVMZVBTTQotLy8gUGFyYW1zOiB1aW50MTZfdCBwc20KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBMMkNBX0ZyZWVMZVBTTSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBwc20pPiBib2R5e1tdKHVpbnQxNl90IHBzbSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodWludDE2X3QgcHNtKSB7IGJvZHkocHNtKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfRnJlZUxlUFNNIEwyQ0FfRnJlZUxlUFNNOwotLy8gTmFtZTogTDJDQV9Db25uZWN0UmVxMgotLy8gUGFyYW1zOiB1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgdWludDE2X3Qgc2VjX2xldmVsCi0vLyBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfQ29ubmVjdFJlcTIgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCk+Ci0gICAgICBib2R5e1tdKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB1aW50MTZfdCBzZWNfbGV2ZWwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKSh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwpIHsKLSAgICByZXR1cm4gYm9keShwc20sIHBfYmRfYWRkciwgc2VjX2xldmVsKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQ29ubmVjdFJlcTIgTDJDQV9Db25uZWN0UmVxMjsKLS8vIE5hbWU6IEwyQ0FfQ29ubmVjdFJlcQotLy8gUGFyYW1zOiB1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkcgotLy8gUmV0dXJuczogdWludDE2X3QKLXN0cnVjdCBMMkNBX0Nvbm5lY3RSZXEgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKSh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkcikgewotICAgIHJldHVybiBib2R5KHBzbSwgcF9iZF9hZGRyKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQ29ubmVjdFJlcSBMMkNBX0Nvbm5lY3RSZXE7Ci0vLyBOYW1lOiBMMkNBX1JlZ2lzdGVyTEVDb2MKLS8vIFBhcmFtczogdWludDE2X3QgcHNtLCBjb25zdCB0TDJDQVBfQVBQTF9JTkZPJiBwX2NiX2luZm8sIHVpbnQxNl90IHNlY19sZXZlbCwKLS8vIHRMMkNBUF9MRV9DRkdfSU5GTyBjZmcgUmV0dXJuczogdWludDE2X3QKLXN0cnVjdCBMMkNBX1JlZ2lzdGVyTEVDb2MgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCwgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZyk+Ci0gICAgICBib2R5e1tdKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICB1aW50MTZfdCBzZWNfbGV2ZWwsIHRMMkNBUF9MRV9DRkdfSU5GTyBjZmcpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSwgY29uc3QgdEwyQ0FQX0FQUExfSU5GTyYgcF9jYl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19sZXZlbCwgdEwyQ0FQX0xFX0NGR19JTkZPIGNmZykgewotICAgIHJldHVybiBib2R5KHBzbSwgcF9jYl9pbmZvLCBzZWNfbGV2ZWwsIGNmZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlZ2lzdGVyTEVDb2MgTDJDQV9SZWdpc3RlckxFQ29jOwotLy8gTmFtZTogTDJDQV9EZXJlZ2lzdGVyTEVDb2MKLS8vIFBhcmFtczogdWludDE2X3QgcHNtCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTDJDQV9EZXJlZ2lzdGVyTEVDb2MgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgcHNtKT4gYm9keXtbXSh1aW50MTZfdCBwc20pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSkgeyBib2R5KHBzbSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0RlcmVnaXN0ZXJMRUNvYyBMMkNBX0RlcmVnaXN0ZXJMRUNvYzsKLS8vIE5hbWU6IEwyQ0FfQ29ubmVjdExFQ29jUmVxCi0vLyBQYXJhbXM6IHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnLAotLy8gdWludDE2X3Qgc2VjX2xldmVsIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgTDJDQV9Db25uZWN0TEVDb2NSZXEgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcsIHVpbnQxNl90IHNlY19sZXZlbCk+Ci0gICAgICBib2R5e1tdKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnLCB1aW50MTZfdCBzZWNfbGV2ZWwpIHsgcmV0dXJuIDA7IH19OwotICB1aW50MTZfdCBvcGVyYXRvcigpKHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcsIHVpbnQxNl90IHNlY19sZXZlbCkgewotICAgIHJldHVybiBib2R5KHBzbSwgcF9iZF9hZGRyLCBwX2NmZywgc2VjX2xldmVsKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfQ29ubmVjdExFQ29jUmVxIEwyQ0FfQ29ubmVjdExFQ29jUmVxOwotLy8gTmFtZTogTDJDQV9HZXRQZWVyTEVDb2NDb25maWcKLS8vIFBhcmFtczogdWludDE2X3QgbGNpZCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZwotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGxjaWQsIHRMMkNBUF9MRV9DRkdfSU5GTyogcGVlcl9jZmcpPiBib2R5ewotICAgICAgW10odWludDE2X3QgbGNpZCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZykgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgbGNpZCwgdEwyQ0FQX0xFX0NGR19JTkZPKiBwZWVyX2NmZykgewotICAgIHJldHVybiBib2R5KGxjaWQsIHBlZXJfY2ZnKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnIEwyQ0FfR2V0UGVlckxFQ29jQ29uZmlnOwotLy8gTmFtZTogTDJDQV9Db25uZWN0Q3JlZGl0QmFzZWRSc3AKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mCi0vLyBhY2NlcHRlZF9sY2lkcywgdWludDE2X3QgcmVzdWx0LCB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHVpbnQ4X3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB1aW50OF90IGlkLAotICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4mIGFjY2VwdGVkX2xjaWRzLCB1aW50MTZfdCByZXN1bHQsCi0gICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgdWludDhfdCBpZCwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgYWNjZXB0ZWRfbGNpZHMsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgICByZXR1cm4gYm9keShwX2JkX2FkZHIsIGlkLCBhY2NlcHRlZF9sY2lkcywgcmVzdWx0LCBwX2NmZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJzcDsKLS8vIE5hbWU6IEwyQ0FfQ29ubmVjdENyZWRpdEJhc2VkUmVxCi0vLyBQYXJhbXM6IHVpbnQxNl90IHBzbSwgY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnCi0vLyBSZXR1cm5zOiBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4KLXN0cnVjdCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaWRzOwotICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPHVpbnQxNl90Pih1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZyk+Ci0gICAgICBib2R5e1t0aGlzXSh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsgcmV0dXJuIGNpZHM7IH19OwotICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gb3BlcmF0b3IoKSh1aW50MTZfdCBwc20sIGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX0xFX0NGR19JTkZPKiBwX2NmZykgewotICAgIHJldHVybiBib2R5KHBzbSwgcF9iZF9hZGRyLCBwX2NmZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcSBMMkNBX0Nvbm5lY3RDcmVkaXRCYXNlZFJlcTsKLS8vIE5hbWU6IEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBsY2lkcywKLS8vIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcgUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfUmVjb25maWdDcmVkaXRCYXNlZENvbm5zUmVxIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBsY2lkcywKLSAgICAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgbGNpZHMsCi0gICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBsY2lkcywKLSAgICAgICAgICAgICAgICAgIHRMMkNBUF9MRV9DRkdfSU5GTyogcF9jZmcpIHsKLSAgICByZXR1cm4gYm9keShiZGEsIGxjaWRzLCBwX2NmZyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcSBMMkNBX1JlY29uZmlnQ3JlZGl0QmFzZWRDb25uc1JlcTsKLS8vIE5hbWU6IEwyQ0FfRGlzY29ubmVjdFJlcQotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0Rpc2Nvbm5lY3RSZXEgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodWludDE2X3QgY2lkKT4gYm9keXtbXSh1aW50MTZfdCBjaWQpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCkgeyByZXR1cm4gYm9keShjaWQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9EaXNjb25uZWN0UmVxIEwyQ0FfRGlzY29ubmVjdFJlcTsKLS8vIE5hbWU6IEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxCi0vLyBQYXJhbXM6IHVpbnQxNl90IGNpZAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGNpZCk+IGJvZHl7W10odWludDE2X3QgY2lkKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBjaWQpIHsgcmV0dXJuIGJvZHkoY2lkKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxIEwyQ0FfRGlzY29ubmVjdExFQ29jUmVxOwotLy8gTmFtZTogTDJDQV9HZXRSZW1vdGVDaWQKLS8vIFBhcmFtczogdWludDE2X3QgbGNpZCwgdWludDE2X3QqIHJjaWQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX0dldFJlbW90ZUNpZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCogcmNpZCk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCogcmNpZCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgbGNpZCwgdWludDE2X3QqIHJjaWQpIHsgcmV0dXJuIGJvZHkobGNpZCwgcmNpZCk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0dldFJlbW90ZUNpZCBMMkNBX0dldFJlbW90ZUNpZDsKLS8vIE5hbWU6IEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCB0aW1lb3V0LCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkciB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDE2X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRfYWRkciwgdGltZW91dCwgdHJhbnNwb3J0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU2V0SWRsZVRpbWVvdXRCeUJkQWRkciBMMkNBX1NldElkbGVUaW1lb3V0QnlCZEFkZHI7Ci0vLyBOYW1lOiBMMkNBX1NldFRyYWNlTGV2ZWwKLS8vIFBhcmFtczogdWludDhfdCBuZXdfbGV2ZWwKLS8vIFJldHVybnM6IHVpbnQ4X3QKLXN0cnVjdCBMMkNBX1NldFRyYWNlTGV2ZWwgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDhfdCBuZXdfbGV2ZWwpPiBib2R5ewotICAgICAgW10odWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIDA7IH19OwotICB1aW50OF90IG9wZXJhdG9yKCkodWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIGJvZHkobmV3X2xldmVsKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU2V0VHJhY2VMZXZlbCBMMkNBX1NldFRyYWNlTGV2ZWw7Ci0vLyBOYW1lOiBMMkNBX1NldEFjbFByaW9yaXR5Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfU2V0QWNsUHJpb3JpdHkgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEwyQ0FQX1BSSU9SSVRZIHByaW9yaXR5KT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRMMkNBUF9QUklPUklUWSBwcmlvcml0eSkgewotICAgIHJldHVybiBib2R5KGJkX2FkZHIsIHByaW9yaXR5KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU2V0QWNsUHJpb3JpdHkgTDJDQV9TZXRBY2xQcmlvcml0eTsKLS8vIE5hbWU6IEwyQ0FfU2V0VHhQcmlvcml0eQotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQsIHRMMkNBUF9DSE5MX1BSSU9SSVRZIHByaW9yaXR5Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9TZXRUeFByaW9yaXR5IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGNpZCwgdEwyQ0FQX0NITkxfUFJJT1JJVFkgcHJpb3JpdHkpPiBib2R5ewotICAgICAgW10odWludDE2X3QgY2lkLCB0TDJDQVBfQ0hOTF9QUklPUklUWSBwcmlvcml0eSkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgY2lkLCB0TDJDQVBfQ0hOTF9QUklPUklUWSBwcmlvcml0eSkgewotICAgIHJldHVybiBib2R5KGNpZCwgcHJpb3JpdHkpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9TZXRUeFByaW9yaXR5IEwyQ0FfU2V0VHhQcmlvcml0eTsKLS8vIE5hbWU6IEwyQ0FfR2V0UGVlckZlYXR1cmVzCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LCB1aW50OF90KiBwX2NobmxfbWFzawotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfR2V0UGVlckZlYXR1cmVzIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MzJfdCogcF9leHRfZmVhdCwKLSAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQzMl90KiBwX2V4dF9mZWF0LAotICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9jaG5sX21hc2spIHsKLSAgICByZXR1cm4gYm9keShiZF9hZGRyLCBwX2V4dF9mZWF0LCBwX2NobmxfbWFzayk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0dldFBlZXJGZWF0dXJlcyBMMkNBX0dldFBlZXJGZWF0dXJlczsKLS8vIE5hbWU6IEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwKLS8vIFBhcmFtczogdWludDE2X3QgZml4ZWRfY2lkLCB0TDJDQVBfRklYRURfQ0hOTF9SRUcqIHBfZnJlZwotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfUmVnaXN0ZXJGaXhlZENoYW5uZWwgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2wodWludDE2X3QgZml4ZWRfY2lkLCB0TDJDQVBfRklYRURfQ0hOTF9SRUcqIHBfZnJlZyk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBmaXhlZF9jaWQsIHRMMkNBUF9GSVhFRF9DSE5MX1JFRyogcF9mcmVnKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBmaXhlZF9jaWQsIHRMMkNBUF9GSVhFRF9DSE5MX1JFRyogcF9mcmVnKSB7Ci0gICAgcmV0dXJuIGJvZHkoZml4ZWRfY2lkLCBwX2ZyZWcpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9SZWdpc3RlckZpeGVkQ2hhbm5lbCBMMkNBX1JlZ2lzdGVyRml4ZWRDaGFubmVsOwotLy8gTmFtZTogTDJDQV9Db25uZWN0Rml4ZWRDaG5sCi0vLyBQYXJhbXM6IHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfQ29ubmVjdEZpeGVkQ2hubCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBmaXhlZF9jaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpPiBib2R5ewotICAgICAgW10odWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKSh1aW50MTZfdCBmaXhlZF9jaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsKLSAgICByZXR1cm4gYm9keShmaXhlZF9jaWQsIHJlbV9iZGEpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9Db25uZWN0Rml4ZWRDaG5sIEwyQ0FfQ29ubmVjdEZpeGVkQ2hubDsKLS8vIE5hbWU6IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEKLS8vIFBhcmFtczogdWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBCVF9IRFIqIHBfYnVmCi0vLyBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmKT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBCVF9IRFIqIHBfYnVmKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDE2X3QgZml4ZWRfY2lkLCBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgIEJUX0hEUiogcF9idWYpIHsKLSAgICByZXR1cm4gYm9keShmaXhlZF9jaWQsIHJlbV9iZGEsIHBfYnVmKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU2VuZEZpeGVkQ2hubERhdGEgTDJDQV9TZW5kRml4ZWRDaG5sRGF0YTsKLS8vIE5hbWU6IEwyQ0FfUmVtb3ZlRml4ZWRDaG5sCi0vLyBQYXJhbXM6IHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfUmVtb3ZlRml4ZWRDaG5sIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBmaXhlZF9jaWQsIGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGZpeGVkX2NpZCwgY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSkgewotICAgIHJldHVybiBib2R5KGZpeGVkX2NpZCwgcmVtX2JkYSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1JlbW92ZUZpeGVkQ2hubCBMMkNBX1JlbW92ZUZpeGVkQ2hubDsKLS8vIE5hbWU6IEwyQ0FfU2V0TGVHYXR0VGltZW91dAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCB1aW50MTZfdCBpZGxlX3RvdXQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBMMkNBX1NldExlR2F0dFRpbWVvdXQgewotICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDE2X3QgaWRsZV90b3V0KT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IGlkbGVfdG91dCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDE2X3QgaWRsZV90b3V0KSB7Ci0gICAgcmV0dXJuIGJvZHkocmVtX2JkYSwgaWRsZV90b3V0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfU2V0TGVHYXR0VGltZW91dCBMMkNBX1NldExlR2F0dFRpbWVvdXQ7Ci0vLyBOYW1lOiBMMkNBX0RhdGFXcml0ZQotLy8gUGFyYW1zOiB1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhCi0vLyBSZXR1cm5zOiB1aW50OF90Ci1zdHJ1Y3QgTDJDQV9EYXRhV3JpdGUgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIHBfZGF0YSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0RhdGFXcml0ZSBMMkNBX0RhdGFXcml0ZTsKLS8vIE5hbWU6IEwyQ0FfTEVDb2NEYXRhV3JpdGUKLS8vIFBhcmFtczogdWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YQotLy8gUmV0dXJuczogdWludDhfdAotc3RydWN0IEwyQ0FfTEVDb2NEYXRhV3JpdGUgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDE2X3QgY2lkLCBCVF9IRFIqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDhfdCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCwgQlRfSERSKiBwX2RhdGEpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIHBfZGF0YSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0xFQ29jRGF0YVdyaXRlIEwyQ0FfTEVDb2NEYXRhV3JpdGU7Ci0vLyBOYW1lOiBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkKLS8vIFBhcmFtczogdWludDE2X3QgY2lkLCBib29sIGlzX2ZsdXNoYWJsZQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IEwyQ0FfU2V0Q2hubEZsdXNoYWJpbGl0eSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aW50MTZfdCBjaWQsIGJvb2wgaXNfZmx1c2hhYmxlKT4gYm9keXsKLSAgICAgIFtdKHVpbnQxNl90IGNpZCwgYm9vbCBpc19mbHVzaGFibGUpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGNpZCwgYm9vbCBpc19mbHVzaGFibGUpIHsKLSAgICByZXR1cm4gYm9keShjaWQsIGlzX2ZsdXNoYWJsZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1NldENobmxGbHVzaGFiaWxpdHkgTDJDQV9TZXRDaG5sRmx1c2hhYmlsaXR5OwotLy8gTmFtZTogTDJDQV9GbHVzaENoYW5uZWwKLS8vIFBhcmFtczogdWludDE2X3QgbGNpZCwgdWludDE2X3QgbnVtX3RvX2ZsdXNoCi0vLyBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IEwyQ0FfRmx1c2hDaGFubmVsIHsKLSAgc3RkOjpmdW5jdGlvbjx1aW50MTZfdCh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBudW1fdG9fZmx1c2gpPiBib2R5ewotICAgICAgW10odWludDE2X3QgbGNpZCwgdWludDE2X3QgbnVtX3RvX2ZsdXNoKSB7IHJldHVybiAwOyB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKSh1aW50MTZfdCBsY2lkLCB1aW50MTZfdCBudW1fdG9fZmx1c2gpIHsKLSAgICByZXR1cm4gYm9keShsY2lkLCBudW1fdG9fZmx1c2gpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9GbHVzaENoYW5uZWwgTDJDQV9GbHVzaENoYW5uZWw7Ci0vLyBOYW1lOiBMMkNBX0lzTGlua0VzdGFibGlzaGVkCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9Jc0xpbmtFc3RhYmxpc2hlZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgICByZXR1cm4gYm9keShiZF9hZGRyLCB0cmFuc3BvcnQpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgTDJDQV9Jc0xpbmtFc3RhYmxpc2hlZCBMMkNBX0lzTGlua0VzdGFibGlzaGVkOwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfbDJjYXBfYXBpCi19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2wyY2FwX2JsZS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2wyY2FwX2JsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhODJiOS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9ibGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjIyCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfYmxlLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19sMmNhcF9ibGUgewotCi0vLyBGdW5jdGlvbiBzdGF0ZSBjYXB0dXJlIGFuZCByZXR1cm4gdmFsdWVzLCBpZiBuZWVkZWQKLXN0cnVjdCBMMkNBX1VwZGF0ZUJsZUNvbm5QYXJhbXMgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zOwotc3RydWN0IEwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXM7Ci1zdHJ1Y3QgTDJDQV9HZXRCbGVDb25uUm9sZSBMMkNBX0dldEJsZUNvbm5Sb2xlOwotc3RydWN0IGwyY2JsZV9ub3RpZnlfbGVfY29ubmVjdGlvbiBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb247Ci1zdHJ1Y3QgbDJjYmxlX2Nvbm5fY29tcCBsMmNibGVfY29ubl9jb21wOwotc3RydWN0IGwyY2JsZV9jb25uX2NvbXBfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZQotICAgIGwyY2JsZV9jb25uX2NvbXBfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZTsKLXN0cnVjdCBsMmNibGVfcHJvY2Vzc19jb25uX3VwZGF0ZV9ldnQgbDJjYmxlX3Byb2Nlc3NfY29ubl91cGRhdGVfZXZ0Owotc3RydWN0IGwyY2JsZV9wcm9jZXNzX3NpZ19jbWQgbDJjYmxlX3Byb2Nlc3Nfc2lnX2NtZDsKLXN0cnVjdCBsMmNibGVfY3JlYXRlX2Nvbm4gbDJjYmxlX2NyZWF0ZV9jb25uOwotc3RydWN0IGwyY19saW5rX3Byb2Nlc3NzX2JsZV9udW1fYnVmcyBsMmNfbGlua19wcm9jZXNzc19ibGVfbnVtX2J1ZnM7Ci1zdHJ1Y3QgbDJjX2JsZV9saW5rX2FkanVzdF9hbGxvY2F0aW9uIGwyY19ibGVfbGlua19hZGp1c3RfYWxsb2NhdGlvbjsKLXN0cnVjdCBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dCBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dDsKLXN0cnVjdCBsMmNibGVfdXBkYXRlX2RhdGFfbGVuZ3RoIGwyY2JsZV91cGRhdGVfZGF0YV9sZW5ndGg7Ci1zdHJ1Y3QgbDJjYmxlX3Byb2Nlc3NfZGF0YV9sZW5ndGhfY2hhbmdlX2V2ZW50Ci0gICAgbDJjYmxlX3Byb2Nlc3NfZGF0YV9sZW5ndGhfY2hhbmdlX2V2ZW50Owotc3RydWN0IGwyY2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXEgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcTsKLXN0cnVjdCBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzIGwyY2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXM7Ci1zdHJ1Y3QgbDJjYmxlX3NlbmRfZmxvd19jb250cm9sX2NyZWRpdCBsMmNibGVfc2VuZF9mbG93X2NvbnRyb2xfY3JlZGl0Owotc3RydWN0IGwyY2JsZV9zZW5kX3BlZXJfZGlzY19yZXEgbDJjYmxlX3NlbmRfcGVlcl9kaXNjX3JlcTsKLXN0cnVjdCBsMmNibGVfc2VjX2NvbXAgbDJjYmxlX3NlY19jb21wOwotc3RydWN0IGwyYmxlX3NlY19hY2Nlc3NfcmVxIGwyYmxlX3NlY19hY2Nlc3NfcmVxOwotc3RydWN0IEwyQ0FfQWRqdXN0Q29ubmVjdGlvbkludGVydmFscyBMMkNBX0FkanVzdENvbm5lY3Rpb25JbnRlcnZhbHM7Ci1zdHJ1Y3QgbDJjYmxlX3VzZV9wcmVmZXJyZWRfY29ubl9wYXJhbXMgbDJjYmxlX3VzZV9wcmVmZXJyZWRfY29ubl9wYXJhbXM7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGFja19sMmNhcF9ibGUKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLWJvb2wgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfaW50LCB1aW50MTZfdCBsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbWluX2NlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OkwyQ0FfVXBkYXRlQmxlQ29ublBhcmFtcygKLSAgICAgIHJlbV9iZGEsIG1pbl9pbnQsIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sIG1heF9jZV9sZW4pOwotfQotYm9vbCBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgYm9vbCBlbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OkwyQ0FfRW5hYmxlVXBkYXRlQmxlQ29ublBhcmFtcyhyZW1fYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLX0KLWhjaV9yb2xlX3QgTDJDQV9HZXRCbGVDb25uUm9sZShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpMMkNBX0dldEJsZUNvbm5Sb2xlKGJkX2FkZHIpOwotfQotdm9pZCBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb24oY29uc3QgUmF3QWRkcmVzcyYgYmRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OmwyY2JsZV9ub3RpZnlfbGVfY29ubmVjdGlvbihiZGEpOwotfQotYm9vbCBsMmNibGVfY29ubl9jb21wKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByb2xlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICAgdEJMRV9BRERSX1RZUEUgdHlwZSwgdWludDE2X3QgY29ubl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IGNvbm5fdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX2Nvbm5fY29tcCgKLSAgICAgIGhhbmRsZSwgcm9sZSwgYmRhLCB0eXBlLCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksIGNvbm5fdGltZW91dCk7Ci19Ci1ib29sIGwyY2JsZV9jb25uX2NvbXBfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSgKLSAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgcm9sZSwgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwKLSAgICB1aW50MTZfdCBjb25uX2ludGVydmFsLCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IGNvbm5fdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX2Nvbm5fY29tcF9mcm9tX2FkZHJlc3Nfd2l0aF90eXBlKAotICAgICAgaGFuZGxlLCByb2xlLCBhZGRyZXNzX3dpdGhfdHlwZSwgY29ubl9pbnRlcnZhbCwgY29ubl9sYXRlbmN5LAotICAgICAgY29ubl90aW1lb3V0KTsKLX0KLXZvaWQgbDJjYmxlX3Byb2Nlc3NfY29ubl91cGRhdGVfZXZ0KHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX3Byb2Nlc3NfY29ubl91cGRhdGVfZXZ0KAotICAgICAgaGFuZGxlLCBzdGF0dXMsIGludGVydmFsLCBsYXRlbmN5LCB0aW1lb3V0KTsKLX0KLXZvaWQgbDJjYmxlX3Byb2Nlc3Nfc2lnX2NtZCh0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QqIHAsIHVpbnQxNl90IHBrdF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX3Byb2Nlc3Nfc2lnX2NtZChwX2xjYiwgcCwgcGt0X2xlbik7Ci19Ci1ib29sIGwyY2JsZV9jcmVhdGVfY29ubih0TDJDX0xDQiogcF9sY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OmwyY2JsZV9jcmVhdGVfY29ubihwX2xjYik7Ci19Ci12b2lkIGwyY19saW5rX3Byb2Nlc3NzX2JsZV9udW1fYnVmcyh1aW50MTZfdCBudW1fbG1fYmxlX2J1ZnMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjX2xpbmtfcHJvY2Vzc3NfYmxlX251bV9idWZzKG51bV9sbV9ibGVfYnVmcyk7Ci19Ci12b2lkIGwyY19ibGVfbGlua19hZGp1c3RfYWxsb2NhdGlvbih2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OmwyY19ibGVfbGlua19hZGp1c3RfYWxsb2NhdGlvbigpOwotfQotdm9pZCBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dCh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGludF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludF9tYXgsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX3Byb2Nlc3NfcmNfcGFyYW1fcmVxdWVzdF9ldnQoCi0gICAgICBoYW5kbGUsIGludF9taW4sIGludF9tYXgsIGxhdGVuY3ksIHRpbWVvdXQpOwotfQotdm9pZCBsMmNibGVfdXBkYXRlX2RhdGFfbGVuZ3RoKHRMMkNfTENCKiBwX2xjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpsMmNibGVfdXBkYXRlX2RhdGFfbGVuZ3RoKHBfbGNiKTsKLX0KLXZvaWQgbDJjYmxlX3Byb2Nlc3NfZGF0YV9sZW5ndGhfY2hhbmdlX2V2ZW50KHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR4X2RhdGFfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcnhfZGF0YV9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX3Byb2Nlc3NfZGF0YV9sZW5ndGhfY2hhbmdlX2V2ZW50KAotICAgICAgaGFuZGxlLCB0eF9kYXRhX2xlbiwgcnhfZGF0YV9sZW4pOwotfQotdm9pZCBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHBfY2NiKTsKLX0KLXZvaWQgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3Jlcyh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IHJlc3VsdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzKHBfY2NiLCByZXN1bHQpOwotfQotdm9pZCBsMmNibGVfc2VuZF9mbG93X2NvbnRyb2xfY3JlZGl0KHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgY3JlZGl0X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OmwyY2JsZV9zZW5kX2Zsb3dfY29udHJvbF9jcmVkaXQocF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkaXRfdmFsdWUpOwotfQotdm9pZCBsMmNibGVfc2VuZF9wZWVyX2Rpc2NfcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpsMmNibGVfc2VuZF9wZWVyX2Rpc2NfcmVxKHBfY2NiKTsKLX0KLXZvaWQgbDJjYmxlX3NlY19jb21wKGNvbnN0IFJhd0FkZHJlc3MqIGJkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhLCB0QlRNX1NUQVRVUyBzdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX2wyY2FwX2JsZTo6bDJjYmxlX3NlY19jb21wKGJkYSwgdHJhbnNwb3J0LCBwX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotfQotdEwyQ0FQX0xFX1JFU1VMVF9DT0RFIGwyYmxlX3NlY19hY2Nlc3NfcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHNtLCBib29sIGlzX29yaWdpbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEwyQ0FQX1NFQ19DQkFDSyogcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpsMmJsZV9zZWNfYWNjZXNzX3JlcSgKLSAgICAgIGJkX2FkZHIsIHBzbSwgaXNfb3JpZ2luYXRvciwgcF9jYWxsYmFjaywgcF9yZWZfZGF0YSk7Ci19Ci12b2lkIEwyQ0FfQWRqdXN0Q29ubmVjdGlvbkludGVydmFscyh1aW50MTZfdCogbWluX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIG1heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZsb29yX2ludGVydmFsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19sMmNhcF9ibGU6OkwyQ0FfQWRqdXN0Q29ubmVjdGlvbkludGVydmFscygKLSAgICAgIG1pbl9pbnRlcnZhbCwgbWF4X2ludGVydmFsLCBmbG9vcl9pbnRlcnZhbCk7Ci19Ci12b2lkIGwyY2JsZV91c2VfcHJlZmVycmVkX2Nvbm5fcGFyYW1zKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbDJjYXBfYmxlOjpsMmNibGVfdXNlX3ByZWZlcnJlZF9jb25uX3BhcmFtcyhiZGEpOwotfQotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfYmxlLmggYi90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9ibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3Y2Y1Zi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9ibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MjIKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmgiCi0jaW5jbHVkZSAidHlwZXMvaGNpX3JvbGUuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19sMmNhcF9ibGUgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0vLyB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLCB1aW50MTZfdCBtYXhfY2VfbGVuCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhfaW50LCB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWluX2NlX2xlbiwgdWludDE2X3QgbWF4X2NlX2xlbik+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQsIHVpbnQxNl90IG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgIHVpbnQxNl90IG1heF9jZV9sZW4pIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIHVpbnQxNl90IG1pbl9pbnQsIHVpbnQxNl90IG1heF9pbnQsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBtaW5fY2VfbGVuLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2NlX2xlbikgewotICAgIHJldHVybiBib2R5KHJlbV9iZGEsIG1pbl9pbnQsIG1heF9pbnQsIGxhdGVuY3ksIHRpbWVvdXQsIG1pbl9jZV9sZW4sCi0gICAgICAgICAgICAgICAgbWF4X2NlX2xlbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX1VwZGF0ZUJsZUNvbm5QYXJhbXMgTDJDQV9VcGRhdGVCbGVDb25uUGFyYW1zOwotLy8gTmFtZTogTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIGJvb2wgZW5hYmxlCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIGJvb2wgZW5hYmxlKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIHJlbV9iZGEsIGJvb2wgZW5hYmxlKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1fYmRhLCBib29sIGVuYWJsZSkgewotICAgIHJldHVybiBib2R5KHJlbV9iZGEsIGVuYWJsZSk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0VuYWJsZVVwZGF0ZUJsZUNvbm5QYXJhbXMgTDJDQV9FbmFibGVVcGRhdGVCbGVDb25uUGFyYW1zOwotLy8gTmFtZTogTDJDQV9HZXRCbGVDb25uUm9sZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyCi0vLyBSZXR1cm5zOiBoY2lfcm9sZV90Ci1zdHJ1Y3QgTDJDQV9HZXRCbGVDb25uUm9sZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248aGNpX3JvbGVfdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsgcmV0dXJuIEhDSV9ST0xFX0NFTlRSQUw7IH19OwotICBoY2lfcm9sZV90IG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgeyByZXR1cm4gYm9keShiZF9hZGRyKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IEwyQ0FfR2V0QmxlQ29ublJvbGUgTDJDQV9HZXRCbGVDb25uUm9sZTsKLS8vIE5hbWU6IGwyY2JsZV9ub3RpZnlfbGVfY29ubmVjdGlvbgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb24gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhKT4gYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgeyBib2R5KGJkYSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfbm90aWZ5X2xlX2Nvbm5lY3Rpb24gbDJjYmxlX25vdGlmeV9sZV9jb25uZWN0aW9uOwotLy8gTmFtZTogbDJjYmxlX2Nvbm5fY29tcAotLy8gUGFyYW1zOiB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgcm9sZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB0QkxFX0FERFJfVFlQRQotLy8gdHlwZSwgdWludDE2X3QgY29ubl9pbnRlcnZhbCwgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBsMmNibGVfY29ubl9jb21wIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByb2xlLCBjb25zdCBSYXdBZGRyZXNzJiBiZGEsCi0gICAgICAgICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSB0eXBlLCB1aW50MTZfdCBjb25uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgcm9sZSwgY29uc3QgUmF3QWRkcmVzcyYgYmRhLAotICAgICAgICAgICAgICB0QkxFX0FERFJfVFlQRSB0eXBlLCB1aW50MTZfdCBjb25uX2ludGVydmFsLAotICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IGNvbm5fdGltZW91dCkgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJvbGUsIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICAgICAgICAgICAgICAgIHRCTEVfQUREUl9UWVBFIHR5cGUsIHVpbnQxNl90IGNvbm5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90IGNvbm5fdGltZW91dCkgewotICAgIHJldHVybiBib2R5KGhhbmRsZSwgcm9sZSwgYmRhLCB0eXBlLCBjb25uX2ludGVydmFsLCBjb25uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgY29ubl90aW1lb3V0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGwyY2JsZV9jb25uX2NvbXAgbDJjYmxlX2Nvbm5fY29tcDsKLS8vIE5hbWU6IGwyY2JsZV9jb25uX2NvbXBfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZQotLy8gUGFyYW1zOiAgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJvbGUsIGNvbnN0IHRCTEVfQkRfQUREUiYKLS8vIGFkZHJlc3Nfd2l0aF90eXBlLCB1aW50MTZfdCBjb25uX2ludGVydmFsLCB1aW50MTZfdCBjb25uX2xhdGVuY3ksIHVpbnQxNl90Ci0vLyBjb25uX3RpbWVvdXQgUmV0dXJuczogYm9vbAotc3RydWN0IGwyY2JsZV9jb25uX2NvbXBfZnJvbV9hZGRyZXNzX3dpdGhfdHlwZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCgKLSAgICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByb2xlLCBjb25zdCB0QkxFX0JEX0FERFImIGFkZHJlc3Nfd2l0aF90eXBlLAotICAgICAgdWludDE2X3QgY29ubl9pbnRlcnZhbCwgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3Qgcm9sZSwKLSAgICAgICAgICAgICAgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwgdWludDE2X3QgY29ubl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgdWludDE2X3QgY29ubl9sYXRlbmN5LCB1aW50MTZfdCBjb25uX3RpbWVvdXQpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCByb2xlLAotICAgICAgICAgICAgICAgICAgY29uc3QgdEJMRV9CRF9BRERSJiBhZGRyZXNzX3dpdGhfdHlwZSwgdWludDE2X3QgY29ubl9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5fbGF0ZW5jeSwgdWludDE2X3QgY29ubl90aW1lb3V0KSB7Ci0gICAgcmV0dXJuIGJvZHkoaGFuZGxlLCByb2xlLCBhZGRyZXNzX3dpdGhfdHlwZSwgY29ubl9pbnRlcnZhbCwgY29ubl9sYXRlbmN5LAotICAgICAgICAgICAgICAgIGNvbm5fdGltZW91dCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfY29ubl9jb21wX2Zyb21fYWRkcmVzc193aXRoX3R5cGUKLSAgICBsMmNibGVfY29ubl9jb21wX2Zyb21fYWRkcmVzc193aXRoX3R5cGU7Ci0vLyBOYW1lOiBsMmNibGVfcHJvY2Vzc19jb25uX3VwZGF0ZV9ldnQKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDE2X3QgaW50ZXJ2YWwsIHVpbnQxNl90IGxhdGVuY3ksCi0vLyB1aW50MTZfdCB0aW1lb3V0IFJldHVybnM6IHZvaWQKLXN0cnVjdCBsMmNibGVfcHJvY2Vzc19jb25uX3VwZGF0ZV9ldnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDE2X3QgaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0KT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgaGFuZGxlLCB1aW50OF90IHN0YXR1cywgdWludDE2X3QgaW50ZXJ2YWwsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzdGF0dXMsIHVpbnQxNl90IGludGVydmFsLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCkgewotICAgIGJvZHkoaGFuZGxlLCBzdGF0dXMsIGludGVydmFsLCBsYXRlbmN5LCB0aW1lb3V0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGwyY2JsZV9wcm9jZXNzX2Nvbm5fdXBkYXRlX2V2dCBsMmNibGVfcHJvY2Vzc19jb25uX3VwZGF0ZV9ldnQ7Ci0vLyBOYW1lOiBsMmNibGVfcHJvY2Vzc19zaWdfY21kCi0vLyBQYXJhbXM6IHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCogcCwgdWludDE2X3QgcGt0X2xlbgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGwyY2JsZV9wcm9jZXNzX3NpZ19jbWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90KiBwLCB1aW50MTZfdCBwa3RfbGVuKT4gYm9keXsKLSAgICAgIFtdKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCogcCwgdWludDE2X3QgcGt0X2xlbikge319OwotICB2b2lkIG9wZXJhdG9yKCkodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90KiBwLCB1aW50MTZfdCBwa3RfbGVuKSB7Ci0gICAgYm9keShwX2xjYiwgcCwgcGt0X2xlbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfcHJvY2Vzc19zaWdfY21kIGwyY2JsZV9wcm9jZXNzX3NpZ19jbWQ7Ci0vLyBOYW1lOiBsMmNibGVfY3JlYXRlX2Nvbm4KLS8vIFBhcmFtczogdEwyQ19MQ0IqIHBfbGNiCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgbDJjYmxlX2NyZWF0ZV9jb25uIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKHRMMkNfTENCKiBwX2xjYik+IGJvZHl7Ci0gICAgICBbXSh0TDJDX0xDQiogcF9sY2IpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHRMMkNfTENCKiBwX2xjYikgeyByZXR1cm4gYm9keShwX2xjYik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfY3JlYXRlX2Nvbm4gbDJjYmxlX2NyZWF0ZV9jb25uOwotLy8gTmFtZTogbDJjX2xpbmtfcHJvY2Vzc3NfYmxlX251bV9idWZzCi0vLyBQYXJhbXM6IHVpbnQxNl90IG51bV9sbV9ibGVfYnVmcwotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGwyY19saW5rX3Byb2Nlc3NzX2JsZV9udW1fYnVmcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50MTZfdCBudW1fbG1fYmxlX2J1ZnMpPiBib2R5ewotICAgICAgW10odWludDE2X3QgbnVtX2xtX2JsZV9idWZzKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50MTZfdCBudW1fbG1fYmxlX2J1ZnMpIHsgYm9keShudW1fbG1fYmxlX2J1ZnMpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbDJjX2xpbmtfcHJvY2Vzc3NfYmxlX251bV9idWZzIGwyY19saW5rX3Byb2Nlc3NzX2JsZV9udW1fYnVmczsKLS8vIE5hbWU6IGwyY19ibGVfbGlua19hZGp1c3RfYWxsb2NhdGlvbgotLy8gUGFyYW1zOiB2b2lkCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgbDJjX2JsZV9saW5rX2FkanVzdF9hbGxvY2F0aW9uIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbDJjX2JsZV9saW5rX2FkanVzdF9hbGxvY2F0aW9uIGwyY19ibGVfbGlua19hZGp1c3RfYWxsb2NhdGlvbjsKLS8vIE5hbWU6IGwyY2JsZV9wcm9jZXNzX3JjX3BhcmFtX3JlcXVlc3RfZXZ0Ci0vLyBQYXJhbXM6IHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaW50X21pbiwgdWludDE2X3QgaW50X21heCwgdWludDE2X3QKLS8vIGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQgUmV0dXJuczogdm9pZAotc3RydWN0IGwyY2JsZV9wcm9jZXNzX3JjX3BhcmFtX3JlcXVlc3RfZXZ0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaW50X21pbiwgdWludDE2X3QgaW50X21heCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQpPgotICAgICAgYm9keXtbXSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGludF9taW4sIHVpbnQxNl90IGludF9tYXgsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaW50X21pbiwgdWludDE2X3QgaW50X21heCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxhdGVuY3ksIHVpbnQxNl90IHRpbWVvdXQpIHsKLSAgICBib2R5KGhhbmRsZSwgaW50X21pbiwgaW50X21heCwgbGF0ZW5jeSwgdGltZW91dCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfcHJvY2Vzc19yY19wYXJhbV9yZXF1ZXN0X2V2dAotICAgIGwyY2JsZV9wcm9jZXNzX3JjX3BhcmFtX3JlcXVlc3RfZXZ0OwotLy8gTmFtZTogbDJjYmxlX3VwZGF0ZV9kYXRhX2xlbmd0aAotLy8gUGFyYW1zOiB0TDJDX0xDQiogcF9sY2IKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBsMmNibGVfdXBkYXRlX2RhdGFfbGVuZ3RoIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRMMkNfTENCKiBwX2xjYik+IGJvZHl7W10odEwyQ19MQ0IqIHBfbGNiKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0TDJDX0xDQiogcF9sY2IpIHsgYm9keShwX2xjYik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfdXBkYXRlX2RhdGFfbGVuZ3RoIGwyY2JsZV91cGRhdGVfZGF0YV9sZW5ndGg7Ci0vLyBOYW1lOiBsMmNibGVfcHJvY2Vzc19kYXRhX2xlbmd0aF9jaGFuZ2VfZXZlbnQKLS8vIFBhcmFtczogdWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCB0eF9kYXRhX2xlbiwgdWludDE2X3QgcnhfZGF0YV9sZW4KLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBsMmNibGVfcHJvY2Vzc19kYXRhX2xlbmd0aF9jaGFuZ2VfZXZlbnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCB0eF9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJ4X2RhdGFfbGVuKT4KLSAgICAgIGJvZHl7W10odWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCB0eF9kYXRhX2xlbiwgdWludDE2X3QgcnhfZGF0YV9sZW4pIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgdHhfZGF0YV9sZW4sIHVpbnQxNl90IHJ4X2RhdGFfbGVuKSB7Ci0gICAgYm9keShoYW5kbGUsIHR4X2RhdGFfbGVuLCByeF9kYXRhX2xlbik7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfcHJvY2Vzc19kYXRhX2xlbmd0aF9jaGFuZ2VfZXZlbnQKLSAgICBsMmNibGVfcHJvY2Vzc19kYXRhX2xlbmd0aF9jaGFuZ2VfZXZlbnQ7Ci0vLyBOYW1lOiBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxCi0vLyBQYXJhbXM6IHRMMkNfQ0NCKiBwX2NjYgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGwyY2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXEgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEwyQ19DQ0IqIHBfY2NiKT4gYm9keXtbXSh0TDJDX0NDQiogcF9jY2IpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRMMkNfQ0NCKiBwX2NjYikgeyBib2R5KHBfY2NiKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IGwyY2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXEgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcTsKLS8vIE5hbWU6IGwyY2JsZV9jcmVkaXRfYmFzZWRfY29ubl9yZXMKLS8vIFBhcmFtczogdEwyQ19DQ0IqIHBfY2NiLCB1aW50MTZfdCByZXN1bHQKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgcmVzdWx0KT4gYm9keXsKLSAgICAgIFtdKHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgcmVzdWx0KSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IHJlc3VsdCkgeyBib2R5KHBfY2NiLCByZXN1bHQpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbDJjYmxlX2NyZWRpdF9iYXNlZF9jb25uX3JlcyBsMmNibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVzOwotLy8gTmFtZTogbDJjYmxlX3NlbmRfZmxvd19jb250cm9sX2NyZWRpdAotLy8gUGFyYW1zOiB0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IGNyZWRpdF92YWx1ZQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IGwyY2JsZV9zZW5kX2Zsb3dfY29udHJvbF9jcmVkaXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodEwyQ19DQ0IqIHBfY2NiLCB1aW50MTZfdCBjcmVkaXRfdmFsdWUpPiBib2R5ewotICAgICAgW10odEwyQ19DQ0IqIHBfY2NiLCB1aW50MTZfdCBjcmVkaXRfdmFsdWUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRMMkNfQ0NCKiBwX2NjYiwgdWludDE2X3QgY3JlZGl0X3ZhbHVlKSB7Ci0gICAgYm9keShwX2NjYiwgY3JlZGl0X3ZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGwyY2JsZV9zZW5kX2Zsb3dfY29udHJvbF9jcmVkaXQgbDJjYmxlX3NlbmRfZmxvd19jb250cm9sX2NyZWRpdDsKLS8vIE5hbWU6IGwyY2JsZV9zZW5kX3BlZXJfZGlzY19yZXEKLS8vIFBhcmFtczogdEwyQ19DQ0IqIHBfY2NiCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgbDJjYmxlX3NlbmRfcGVlcl9kaXNjX3JlcSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0TDJDX0NDQiogcF9jY2IpPiBib2R5e1tdKHRMMkNfQ0NCKiBwX2NjYikge319OwotICB2b2lkIG9wZXJhdG9yKCkodEwyQ19DQ0IqIHBfY2NiKSB7IGJvZHkocF9jY2IpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbDJjYmxlX3NlbmRfcGVlcl9kaXNjX3JlcSBsMmNibGVfc2VuZF9wZWVyX2Rpc2NfcmVxOwotLy8gTmFtZTogbDJjYmxlX3NlY19jb21wCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MqIGJkYSwgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQsIHZvaWQqIHBfcmVmX2RhdGEsCi0vLyB0QlRNX1NUQVRVUyBzdGF0dXMgUmV0dXJuczogdm9pZAotc3RydWN0IGwyY2JsZV9zZWNfY29tcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzKiBiZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgc3RhdHVzKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyogYmRhLCB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgdEJUTV9TVEFUVVMgc3RhdHVzKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzKiBiZGEsIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgdm9pZCogcF9yZWZfZGF0YSwgdEJUTV9TVEFUVVMgc3RhdHVzKSB7Ci0gICAgYm9keShiZGEsIHRyYW5zcG9ydCwgcF9yZWZfZGF0YSwgc3RhdHVzKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGwyY2JsZV9zZWNfY29tcCBsMmNibGVfc2VjX2NvbXA7Ci0vLyBOYW1lOiBsMmJsZV9zZWNfYWNjZXNzX3JlcQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBwc20sIGJvb2wgaXNfb3JpZ2luYXRvciwKLS8vIHRMMkNBUF9TRUNfQ0JBQ0sqIHBfY2FsbGJhY2ssIHZvaWQqIHBfcmVmX2RhdGEgUmV0dXJuczogdEwyQ0FQX0xFX1JFU1VMVF9DT0RFCi1zdHJ1Y3QgbDJibGVfc2VjX2FjY2Vzc19yZXEgewotICBzdGQ6OmZ1bmN0aW9uPHRMMkNBUF9MRV9SRVNVTFRfQ09ERSgKLSAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHBzbSwgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgdEwyQ0FQX1NFQ19DQkFDSyogcF9jYWxsYmFjaywgdm9pZCogcF9yZWZfZGF0YSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHBzbSwgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICB0TDJDQVBfU0VDX0NCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKSB7IHJldHVybiBMMkNBUF9MRV9SRVNVTFRfQ09OTl9PSzsgfX07Ci0gIHRMMkNBUF9MRV9SRVNVTFRfQ09ERSBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHVpbnQxNl90IHBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19vcmlnaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfU0VDX0NCQUNLKiBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3JlZl9kYXRhKSB7Ci0gICAgcmV0dXJuIGJvZHkoYmRfYWRkciwgcHNtLCBpc19vcmlnaW5hdG9yLCBwX2NhbGxiYWNrLCBwX3JlZl9kYXRhKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGwyYmxlX3NlY19hY2Nlc3NfcmVxIGwyYmxlX3NlY19hY2Nlc3NfcmVxOwotLy8gTmFtZTogTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzCi0vLyBQYXJhbXM6IHVpbnQxNl90KiBtaW5faW50ZXJ2YWwsIHVpbnQxNl90KiBtYXhfaW50ZXJ2YWwsIHVpbnQxNl90Ci0vLyBmbG9vcl9pbnRlcnZhbCBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQxNl90KiBtaW5faW50ZXJ2YWwsIHVpbnQxNl90KiBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmbG9vcl9pbnRlcnZhbCk+Ci0gICAgICBib2R5e1tdKHVpbnQxNl90KiBtaW5faW50ZXJ2YWwsIHVpbnQxNl90KiBtYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGZsb29yX2ludGVydmFsKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh1aW50MTZfdCogbWluX2ludGVydmFsLCB1aW50MTZfdCogbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmxvb3JfaW50ZXJ2YWwpIHsKLSAgICBib2R5KG1pbl9pbnRlcnZhbCwgbWF4X2ludGVydmFsLCBmbG9vcl9pbnRlcnZhbCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBMMkNBX0FkanVzdENvbm5lY3Rpb25JbnRlcnZhbHMgTDJDQV9BZGp1c3RDb25uZWN0aW9uSW50ZXJ2YWxzOwotLy8gTmFtZTogbDJjYmxlX3VzZV9wcmVmZXJyZWRfY29ubl9wYXJhbXMKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgYmRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgbDJjYmxlX3VzZV9wcmVmZXJyZWRfY29ubl9wYXJhbXMgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhKT4gYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgeyBib2R5KGJkYSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBsMmNibGVfdXNlX3ByZWZlcnJlZF9jb25uX3BhcmFtcyBsMmNibGVfdXNlX3ByZWZlcnJlZF9jb25uX3BhcmFtczsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX2wyY2FwX2JsZQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9saW5rLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfbGluay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhNmVhYS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19sMmNhcF9saW5rLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0jZGVmaW5lIFVOVVNFRF9BVFRSCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9idF9oZHIuaCIKLSNpbmNsdWRlICJzdGFjay9sMmNhcC9sMmNfaW50LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLUJUX0hEUiogbDJjdV9nZXRfbmV4dF9idWZmZXJfdG9fc2VuZCh0TDJDX0xDQiogcF9sY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotYm9vbCBsMmNfbGlua19oY2lfZGlzY19jb21wKHVpbnQxNl90IGhhbmRsZSwgdEhDSV9SRUFTT04gcmVhc29uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci10QlRNX1NUQVRVUyBsMmN1X0Nvbm5lY3RBY2xGb3JTZWN1cml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gQlRNX1NVQ0NFU1M7Ci19Ci10TDJDX0NDQiogbDJjdV9nZXRfbmV4dF9jaGFubmVsX2luX3JyKHRMMkNfTENCKiBwX2xjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIGwyY19PbkhjaU1vZGVDaGFuZ2VTZW5kUGVuZGluZ1BhY2tldHMoUmF3QWRkcmVzcyByZW1vdGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19pbmZvX3Jlc3BfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmNfbGlua19hZGp1c3RfYWxsb2NhdGlvbih2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGwyY19saW5rX2FkanVzdF9jaG5sX2FsbG9jYXRpb24odm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjX2xpbmtfY2hlY2tfc2VuZF9wa3RzKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgbG9jYWxfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfSERSKiBwX2J1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjX2xpbmtfaGNpX2Nvbm5fY29tcCh0SENJX1NUQVRVUyBzdGF0dXMsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjX2xpbmtfaGNpX2Nvbm5fcmVxKGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19saW5rX2luaXQoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGwyY19saW5rX3Byb2Nlc3NfbnVtX2NvbXBsZXRlZF9wa3RzKHVpbnQ4X3QqIHAsIHVpbnQ4X3QgZXZ0X2xlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjX2xpbmtfcm9sZV9jaGFuZ2VkKGNvbnN0IFJhd0FkZHJlc3MqIGJkX2FkZHIsIHVpbnQ4X3QgbmV3X3JvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhjaV9zdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19saW5rX3NlY19jb21wKGNvbnN0IFJhd0FkZHJlc3MqIHBfYmRhLAotICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfQVRUUiB0QlRfVFJBTlNQT1JUIHRyYW5zcG9ydCwgdm9pZCogcF9yZWZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19saW5rX3NlY19jb21wMihjb25zdCBSYXdBZGRyZXNzJiBwX2JkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0LCB2b2lkKiBwX3JlZl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19saW5rX3NlZ21lbnRzX3htaXR0ZWQoQlRfSERSKiBwX21zZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjX2xpbmtfdGltZW91dCh0TDJDX0xDQiogcF9sY2IpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjX3BhY2tldHNfY29tcGxldGVkKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgbnVtX3NlbnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19waW5fY29kZV9yZXF1ZXN0KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY2JsZV91cGRhdGVfc2VjX2FjdChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50MTZfdCBzZWNfYWN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfbWFpbi5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2wyY2FwX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzA3Y2IuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo5Ci0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAibDJjX2FwaS5oIgotI2luY2x1ZGUgImwyY2RlZnMuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svbDJjYXAvbDJjX2ludC5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdWludDhfdCBsMmNfZGF0YV93cml0ZSh1aW50MTZfdCBjaWQsIEJUX0hEUiogcF9kYXRhLCB1aW50MTZfdCBmbGFncykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIGwyY19jY2JfdGltZXJfdGltZW91dCh2b2lkKiBkYXRhKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGwyY19mY3JiX2Fja190aW1lcl90aW1lb3V0KHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19mcmVlKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjX2luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBsMmNfbGNiX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBsMmNfcHJvY2Vzc19oZWxkX3BhY2tldHMoYm9vbCB0aW1lZF9vdXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY19yY3ZfYWNsX2RhdGEoQlRfSERSKiBwX21zZykgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBsMmNfcmVjZWl2ZV9ob2xkX3RpbWVyX3RpbWVvdXQoVU5VU0VEX0FUVFIgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX2wyY2FwX3V0aWxzLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMmU1NGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbDJjYXBfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjcyCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0X2hkci5oIgotI2luY2x1ZGUgInN0YWNrL2wyY2FwL2wyY19pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotQlRfSERSKiBsMmN1X2J1aWxkX2hlYWRlcih0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGxlbiwgdWludDhfdCBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2lnbmFsX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWJvb2wgbDJjX2lzX2NtZF9yZWplY3RlZCh1aW50OF90IGNtZF9jb2RlLCB1aW50OF90IHNpZ25hbF9pZCwgdEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGwyY3VfY3JlYXRlX2Nvbm5fbGUodEwyQ19MQ0IqIHBfbGNiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGwyY3VfY3JlYXRlX2Nvbm5fbGUodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90IGluaXRpYXRpbmdfcGh5cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBsMmN1X2luaXRpYWxpemVfZml4ZWRfY2NiKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgZml4ZWRfY2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGwyY3VfaXNfY2NiX2FjdGl2ZSh0TDJDX0NDQiogcF9jY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgbDJjdV9sY2JfZGlzY29ubmVjdGluZyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGwyY3Vfc2V0X2FjbF9wcmlvcml0eShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0TDJDQVBfUFJJT1JJVFkgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2V0X2FmdGVyX3JzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGwyY3Vfc3RhcnRfcG9zdF9ib25kX3RpbWVyKHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdEwyQ19DQ0IqIGwyY3VfYWxsb2NhdGVfY2NiKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgY2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRMMkNfQ0NCKiBsMmN1X2ZpbmRfY2NiX2J5X2NpZCh0TDJDX0xDQiogcF9sY2IsIHVpbnQxNl90IGxvY2FsX2NpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10TDJDX0NDQiogbDJjdV9maW5kX2NjYl9ieV9yZW1vdGVfY2lkKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVtb3RlX2NpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10TDJDX0xDQiogbDJjdV9hbGxvY2F0ZV9sY2IoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCBib29sIGlzX2JvbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUX1RSQU5TUE9SVCB0cmFuc3BvcnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEwyQ19MQ0IqIGwyY3VfZmluZF9sY2JfYnlfYmRfYWRkcihjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVF9UUkFOU1BPUlQgdHJhbnNwb3J0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRMMkNfTENCKiBsMmN1X2ZpbmRfbGNiX2J5X2hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEwyQ19MQ0IqIGwyY3VfZmluZF9sY2JfYnlfc3RhdGUodEwyQ19MSU5LX1NUQVRFIHN0YXRlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRMMkNfUkNCKiBsMmN1X2FsbG9jYXRlX2JsZV9yY2IodWludDE2X3QgcHNtKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRMMkNfUkNCKiBsMmN1X2FsbG9jYXRlX3JjYih1aW50MTZfdCBwc20pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEwyQ19SQ0IqIGwyY3VfZmluZF9ibGVfcmNiX2J5X3BzbSh1aW50MTZfdCBwc20pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdEwyQ19SQ0IqIGwyY3VfZmluZF9yY2JfYnlfcHNtKHVpbnQxNl90IHBzbSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci11aW50OF90IGwyY3VfZ2V0X251bV9oaV9wcmlvcml0eSh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgbDJjdV9wcm9jZXNzX3BlZXJfY2ZnX3JlcSh0TDJDX0NDQiogcF9jY2IsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBsMmN1X2Fkal9pZCh0TDJDX0xDQiogcF9sY2IpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjdV9hZGp1c3Rfb3V0X21wcyh0TDJDX0NDQiogcF9jY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfY2hhbmdlX3ByaV9jY2IodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0hOTF9QUklPUklUWSBwcmlvcml0eSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9jaGVja19jaGFubmVsX2Nvbmdlc3Rpb24odEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X2NyZWF0ZV9jb25uX2FmdGVyX3N3aXRjaCh0TDJDX0xDQiogcF9sY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfY3JlYXRlX2Nvbm5fYnJfZWRyKHRMMkNfTENCKiBwX2xjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9kZXF1ZXVlX2NjYih0TDJDX0NDQiogcF9jY2IpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjdV9kZXZpY2VfcmVzZXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBsMmN1X2Rpc2Nvbm5lY3RfY2hubCh0TDJDX0NDQiogcF9jY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfZW5xdWV1ZV9jY2IodEwyQ19DQ0IqIHBfY2NiKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIGwyY3Vfbm9fZHluYW1pY19jY2JzKHRMMkNfTENCKiBwX2xjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9wcm9jZXNzX2ZpeGVkX2NobmxfcmVzcCh0TDJDX0xDQiogcF9sY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfcHJvY2Vzc19maXhlZF9kaXNjX2NiYWNrKHRMMkNfTENCKiBwX2xjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9wcm9jZXNzX291cl9jZmdfcmVxKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9wcm9jZXNzX291cl9jZmdfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9wcm9jZXNzX3BlZXJfY2ZnX3JzcCh0TDJDX0NDQiogcF9jY2IsIHRMMkNBUF9DRkdfSU5GTyogcF9jZmcpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfcmVqZWN0X2JsZV9jb2NfY29ubmVjdGlvbih0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QgcmVtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3JlamVjdF9ibGVfY29ubmVjdGlvbih0TDJDX0NDQiogcF9jY2IsIHVpbnQ4X3QgcmVtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfcmVqZWN0X2Nvbm5lY3Rpb24odEwyQ19MQ0IqIHBfbGNiLCB1aW50MTZfdCByZW1vdGVfY2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVtX2lkLCB1aW50MTZfdCByZXN1bHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfcmVqZWN0X2NyZWRpdF9iYXNlZF9jb25uX3JlcSh0TDJDX0xDQiogcF9sY2IsIHVpbnQ4X3QgcmVtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fb2ZfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZXN1bHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3VfcmVsZWFzZV9ibGVfcmNiKHRMMkNfUkNCKiBwX3JjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9yZWxlYXNlX2NjYih0TDJDX0NDQiogcF9jY2IpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjdV9yZWxlYXNlX2xjYih0TDJDX0xDQiogcF9sY2IpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjdV9yZWxlYXNlX3JjYih0TDJDX1JDQiogcF9yY2IpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgbDJjdV9yZXN1Ym1pdF9wZW5kaW5nX3NlY19yZXEoY29uc3QgUmF3QWRkcmVzcyogcF9iZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2VuZF9ibGVfcmVjb25maWdfcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3VsdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX2NyZWRpdF9iYXNlZF9yZWNvbmZpZ19yZXEodEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TDJDQVBfTEVfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9ibGVfY3JlZGl0X2Jhc2VkX2Nvbm5fcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX3BlZXJfYmxlX2NyZWRpdF9iYXNlZF9jb25uX3Jlcyh0TDJDX0NDQiogcF9jY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9ibGVfY3JlZGl0X2Jhc2VkX2Rpc2Nvbm5fcmVxKHRMMkNfQ0NCKiBwX2NjYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX3BlZXJfYmxlX2Zsb3dfY29udHJvbF9jcmVkaXQodEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjcmVkaXRfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2VuZF9wZWVyX2JsZV9wYXJfcmVxKHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgbWluX2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X2ludCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX3BlZXJfYmxlX3Bhcl9yc3AodEwyQ19MQ0IqIHBfbGNiLCB1aW50MTZfdCByZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVtX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9jbWRfcmVqZWN0KHRMMkNfTENCKiBwX2xjYiwgdWludDE2X3QgcmVhc29uLCB1aW50OF90IHJlbV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwMSwgdWludDE2X3QgcDIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2VuZF9wZWVyX2NvbmZpZ19yZWoodEwyQ19DQ0IqIHBfY2NiLCB1aW50OF90KiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZGF0YV9sZW4sIHVpbnQxNl90IHJlal9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2VuZF9wZWVyX2NvbmZpZ19yZXEodEwyQ19DQ0IqIHBfY2NiLCB0TDJDQVBfQ0ZHX0lORk8qIHBfY2ZnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25maWdfcnNwKHRMMkNfQ0NCKiBwX2NjYiwgdEwyQ0FQX0NGR19JTkZPKiBwX2NmZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX3BlZXJfY29ubmVjdF9yZXEodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9jb25uZWN0X3JzcCh0TDJDX0NDQiogcF9jY2IsIHVpbnQxNl90IHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9jcmVkaXRfYmFzZWRfY29ubl9yZXEodEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9jcmVkaXRfYmFzZWRfY29ubl9yZXModEwyQ19DQ0IqIHBfY2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+JiBhY2NlcHRlZF9jaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcmVzdWx0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NlbmRfcGVlcl9kaXNjX3JlcSh0TDJDX0NDQiogcF9jY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2VuZF9wZWVyX2Rpc2NfcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1vdGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxvY2FsX2NpZCwgdWludDE2X3QgcmVtb3RlX2NpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX3BlZXJfZWNob19yc3AodEwyQ19MQ0IqIHBfbGNiLCB1aW50OF90IHNpZ25hbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcF9kYXRhLCB1aW50MTZfdCBkYXRhX2xlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZW5kX3BlZXJfaW5mb19yZXEodEwyQ19MQ0IqIHBfbGNiLCB1aW50MTZfdCBpbmZvX3R5cGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2VuZF9wZWVyX2luZm9fcnNwKHRMMkNfTENCKiBwX2xjYiwgdWludDhfdCByZW1vdGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGluZm9fdHlwZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgbDJjdV9zZXRfYWNsX2hjaV9oZWFkZXIoQlRfSERSKiBwX2J1ZiwgdEwyQ19DQ0IqIHBfY2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3NldF9sY2JfaGFuZGxlKHN0cnVjdCB0X2wyY19saW5rY2ImIHBfbGNiLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGwyY3Vfc2V0X25vbl9mbHVzaGFibGVfcGJmKGJvb2wgaXNfc3VwcG9ydGVkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBsMmN1X3VwZGF0ZV9sY2JfNF9ib25kaW5nKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgYm9vbCBpc19ib25kaW5nKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbWV0cmljc19sb2dnaW5nLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfbWV0cmljc19sb2dnaW5nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg1YzM1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX21ldHJpY3NfbG9nZ2luZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NQotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSA8ZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL2JsdWV0b290aC9lbnVtcy5wYi5oPgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvaGNpL2VudW1zLnBiLmg+Ci0jaW5jbHVkZSAiY29tbW9uL21ldHJpY3MuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vbWV0cmljc19hcGkuaCIKLSNpbmNsdWRlICJtYWluL3NoaW0vc2hpbS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc3RhY2tfbWV0cmljc19sb2dnaW5nLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfbWV0cmljc19sb2dnaW5nLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotLy8gTW9ja2VkIGludGVybmFsIHN0cnVjdHVyZXMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2Ugc3RhY2tfbWV0cmljc19sb2dnaW5nIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudCBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50Owotc3RydWN0IGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudDsKLXN0cnVjdCBsb2dfc21wX3BhaXJpbmdfZXZlbnQgbG9nX3NtcF9wYWlyaW5nX2V2ZW50Owotc3RydWN0IGxvZ19zZHBfYXR0cmlidXRlIGxvZ19zZHBfYXR0cmlidXRlOwotc3RydWN0IGxvZ19tYW51ZmFjdHVyZXJfaW5mbyBsb2dfbWFudWZhY3R1cmVyX2luZm87Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGFja19tZXRyaWNzX2xvZ2dpbmcKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXZvaWQgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXZlbnRfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX21ldHJpY3NfbG9nZ2luZzo6bG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudCgKLSAgICAgIGFkZHJlc3MsIGhhbmRsZSwgaGNpX2NtZCwgaGNpX2V2ZW50LCBjbWRfc3RhdHVzLCByZWFzb25fY29kZSwKLSAgICAgIGV2ZW50X3ZhbHVlKTsKLX0KLXZvaWQgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCgKLSAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzLCB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LCB1aW50MTZfdCBoY2lfYmxlX2V2ZW50LAotICAgIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19tZXRyaWNzX2xvZ2dpbmc6OmxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQoCi0gICAgICBhZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSwgZGlyZWN0aW9uLCBsaW5rX3R5cGUsIGhjaV9jbWQsIGhjaV9ldmVudCwKLSAgICAgIGhjaV9ibGVfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlKTsKLX0KLXZvaWQgbG9nX3NtcF9wYWlyaW5nX2V2ZW50KGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQ4X3Qgc21wX2NtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNtcF9mYWlsX3JlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbWV0cmljc19sb2dnaW5nOjpsb2dfc21wX3BhaXJpbmdfZXZlbnQoCi0gICAgICBhZGRyZXNzLCBzbXBfY21kLCBkaXJlY3Rpb24sIHNtcF9mYWlsX3JlYXNvbik7Ci19Ci12b2lkIGxvZ19zZHBfYXR0cmlidXRlKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJpYnV0ZV9pZCwgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdHRyaWJ1dGVfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX21ldHJpY3NfbG9nZ2luZzo6bG9nX3NkcF9hdHRyaWJ1dGUoCi0gICAgICBhZGRyZXNzLCBwcm90b2NvbF91dWlkLCBhdHRyaWJ1dGVfaWQsIGF0dHJpYnV0ZV9zaXplLCBhdHRyaWJ1dGVfdmFsdWUpOwotfQotdm9pZCBsb2dfbWFudWZhY3R1cmVyX2luZm8oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0gc291cmNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc29mdHdhcmVfdmVyc2lvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfbWV0cmljc19sb2dnaW5nOjpsb2dfbWFudWZhY3R1cmVyX2luZm8oCi0gICAgICBhZGRyZXNzLCBzb3VyY2VfdHlwZSwgc291cmNlX25hbWUsIG1hbnVmYWN0dXJlciwgbW9kZWwsIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgICBzb2Z0d2FyZV92ZXJzaW9uKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX21ldHJpY3NfbG9nZ2luZy5oIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfbWV0cmljc19sb2dnaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjM4NTkuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfbWV0cmljc19sb2dnaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjUKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMgotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIHRoZSBpbmNsdXNpb24gc2V0LgotI2luY2x1ZGUgPGZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9ibHVldG9vdGgvZW51bXMucGIuaD4KLSNpbmNsdWRlIDxmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvYmx1ZXRvb3RoL2hjaS9lbnVtcy5wYi5oPgotI2luY2x1ZGUgImNvbW1vbi9tZXRyaWNzLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL21ldHJpY3NfYXBpLmgiCi0jaW5jbHVkZSAibWFpbi9zaGltL3NoaW0uaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3N0YWNrX21ldHJpY3NfbG9nZ2luZy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX21ldHJpY3NfbG9nZ2luZyB7Ci0KLS8vIFNoYXJlZCBzdGF0ZSBiZXR3ZWVuIG1vY2tlZCBmdW5jdGlvbnMgYW5kIHRlc3RzCi0vLyBOYW1lOiBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwgdWludDMyX3QgaGNpX2NtZCwKLS8vIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUsIGludDY0X3QKLS8vIGV2ZW50X3ZhbHVlIFJldHVybnM6IHZvaWQKLXN0cnVjdCBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlLCBpbnQ2NF90IGV2ZW50X3ZhbHVlKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlLCB1aW50MzJfdCBoY2lfY21kLAotICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlLAotICAgICAgICAgICAgICBpbnQ2NF90IGV2ZW50X3ZhbHVlKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQzMl90IGhjaV9jbWQsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsIHVpbnQxNl90IHJlYXNvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgaW50NjRfdCBldmVudF92YWx1ZSkgewotICAgIGJvZHkoYWRkcmVzcywgaGFuZGxlLCBoY2lfY21kLCBoY2lfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlLAotICAgICAgICAgZXZlbnRfdmFsdWUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbG9nX2NsYXNzaWNfcGFpcmluZ19ldmVudCBsb2dfY2xhc3NpY19wYWlyaW5nX2V2ZW50OwotLy8gTmFtZTogbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudAotLy8gUGFyYW1zOiAgY29uc3QgUmF3QWRkcmVzcyogYWRkcmVzcywgdWludDMyX3QgY29ubmVjdGlvbl9oYW5kbGUsCi0vLyBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50MTZfdCBsaW5rX3R5cGUsIHVpbnQzMl90Ci0vLyBoY2lfY21kLCB1aW50MTZfdCBoY2lfZXZlbnQsIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0vLyB1aW50MTZfdCByZWFzb25fY29kZSBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3QgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzKiBhZGRyZXNzLCB1aW50MzJfdCBjb25uZWN0aW9uX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsaW5rX3R5cGUsIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhjaV9ibGVfZXZlbnQsIHVpbnQxNl90IGNtZF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZWFzb25fY29kZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50MTZfdCBsaW5rX3R5cGUsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGhjaV9jbWQsIHVpbnQxNl90IGhjaV9ldmVudCwgdWludDE2X3QgaGNpX2JsZV9ldmVudCwKLSAgICAgICAgICAgICAgdWludDE2X3QgY21kX3N0YXR1cywgdWludDE2X3QgcmVhc29uX2NvZGUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MqIGFkZHJlc3MsIHVpbnQzMl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEaXJlY3Rpb25FbnVtIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxpbmtfdHlwZSwgdWludDMyX3QgaGNpX2NtZCwgdWludDE2X3QgaGNpX2V2ZW50LAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgaGNpX2JsZV9ldmVudCwgdWludDE2X3QgY21kX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlYXNvbl9jb2RlKSB7Ci0gICAgYm9keShhZGRyZXNzLCBjb25uZWN0aW9uX2hhbmRsZSwgZGlyZWN0aW9uLCBsaW5rX3R5cGUsIGhjaV9jbWQsIGhjaV9ldmVudCwKLSAgICAgICAgIGhjaV9ibGVfZXZlbnQsIGNtZF9zdGF0dXMsIHJlYXNvbl9jb2RlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxvZ19saW5rX2xheWVyX2Nvbm5lY3Rpb25fZXZlbnQgbG9nX2xpbmtfbGF5ZXJfY29ubmVjdGlvbl9ldmVudDsKLS8vIE5hbWU6IGxvZ19zbXBfcGFpcmluZ19ldmVudAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0vLyBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLCB1aW50OF90IHNtcF9mYWlsX3JlYXNvbiBSZXR1cm5zOgotLy8gdm9pZAotc3RydWN0IGxvZ19zbXBfcGFpcmluZ19ldmVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6RGlyZWN0aW9uRW51bSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgIHVpbnQ4X3Qgc21wX2ZhaWxfcmVhc29uKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50OF90IHNtcF9jbWQsCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRpcmVjdGlvbkVudW0gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgdWludDhfdCBzbXBfZmFpbF9yZWFzb24pIHsKLSAgICBib2R5KGFkZHJlc3MsIHNtcF9jbWQsIGRpcmVjdGlvbiwgc21wX2ZhaWxfcmVhc29uKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxvZ19zbXBfcGFpcmluZ19ldmVudCBsb2dfc21wX3BhaXJpbmdfZXZlbnQ7Ci0vLyBOYW1lOiBsb2dfc2RwX2F0dHJpYnV0ZQotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBwcm90b2NvbF91dWlkLCB1aW50MTZfdAotLy8gYXR0cmlidXRlX2lkLCBzaXplX3QgYXR0cmlidXRlX3NpemUsIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSBSZXR1cm5zOgotLy8gdm9pZAotc3RydWN0IGxvZ19zZHBfYXR0cmlidXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgIHVpbnQxNl90IGF0dHJpYnV0ZV9pZCwgc2l6ZV90IGF0dHJpYnV0ZV9zaXplLAotICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdHRyaWJ1dGVfdmFsdWUpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIHVpbnQxNl90IHByb3RvY29sX3V1aWQsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCBhdHRyaWJ1dGVfaWQsIHNpemVfdCBhdHRyaWJ1dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0ZV92YWx1ZSkgewotICAgIGJvZHkoYWRkcmVzcywgcHJvdG9jb2xfdXVpZCwgYXR0cmlidXRlX2lkLCBhdHRyaWJ1dGVfc2l6ZSwgYXR0cmlidXRlX3ZhbHVlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IGxvZ19zZHBfYXR0cmlidXRlIGxvZ19zZHBfYXR0cmlidXRlOwotLy8gTmFtZTogbG9nX21hbnVmYWN0dXJlcl9pbmZvCi0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGFkZHJlc3MsIGFuZHJvaWQ6OmJsdWV0b290aDo6RGV2aWNlSW5mb1NyY0VudW0KLS8vIHNvdXJjZV90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0vLyBjb25zdCBzdGQ6OnN0cmluZyYgbW9kZWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLCBjb25zdAotLy8gc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24gUmV0dXJuczogdm9pZAotc3RydWN0IGxvZ19tYW51ZmFjdHVyZXJfaW5mbyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEZXZpY2VJbmZvU3JjRW51bSBzb3VyY2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24pPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICBhbmRyb2lkOjpibHVldG9vdGg6OkRldmljZUluZm9TcmNFbnVtIHNvdXJjZV90eXBlLAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGhhcmR3YXJlX3ZlcnNpb24sCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2Z0d2FyZV92ZXJzaW9uKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Ymx1ZXRvb3RoOjpEZXZpY2VJbmZvU3JjRW51bSBzb3VyY2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtYW51ZmFjdHVyZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2RlbCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoYXJkd2FyZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNvZnR3YXJlX3ZlcnNpb24pIHsKLSAgICBib2R5KGFkZHJlc3MsIHNvdXJjZV90eXBlLCBzb3VyY2VfbmFtZSwgbWFudWZhY3R1cmVyLCBtb2RlbCwKLSAgICAgICAgIGhhcmR3YXJlX3ZlcnNpb24sIHNvZnR3YXJlX3ZlcnNpb24pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgbG9nX21hbnVmYWN0dXJlcl9pbmZvIGxvZ19tYW51ZmFjdHVyZXJfaW5mbzsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX21ldHJpY3NfbG9nZ2luZwotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfcGFuX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3Bhbl9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2UxMTYuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfcGFuX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJuZXBfYXBpLmgiCi0jaW5jbHVkZSAiYnRtX2FwaS5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJwYW5fYXBpLmgiCi0jaW5jbHVkZSAic2RwX2FwaS5oIgotI2luY2x1ZGUgInNkcGRlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9idG0vYnRtX3NlYy5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0jaW5jbHVkZSAic3RhY2svcGFuL3Bhbl9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotdFBBTl9SRVNVTFQgUEFOX1NldE11bHRpY2FzdEZpbHRlcnModWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCBudW1fbWNhc3RfZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfc3RhcnRfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwX2VuZF9hcnJheSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIFBBTl9TVUNDRVNTOwotfQotdFBBTl9SRVNVTFQgUEFOX0Nvbm5lY3QoY29uc3QgUmF3QWRkcmVzcyYgcmVtX2JkYSwgdWludDhfdCBzcmNfcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZHN0X3JvbGUsIHVpbnQxNl90KiBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBQQU5fU1VDQ0VTUzsKLX0KLXRQQU5fUkVTVUxUIFBBTl9EaXNjb25uZWN0KHVpbnQxNl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIFBBTl9TVUNDRVNTOwotfQotdFBBTl9SRVNVTFQgUEFOX1NldFByb3RvY29sRmlsdGVycyh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9maWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9zdGFydF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBfZW5kX2FycmF5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci19Ci10UEFOX1JFU1VMVCBQQU5fU2V0Um9sZSh1aW50OF90IHJvbGUsIGNvbnN0IGNoYXIqIHBfdXNlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcF9uYXBfbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIFBBTl9TVUNDRVNTOwotfQotdFBBTl9SRVNVTFQgUEFOX1dyaXRlKHVpbnQxNl90IGhhbmRsZSwgY29uc3QgUmF3QWRkcmVzcyYgZHN0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhd0FkZHJlc3MmIHNyYywgdWludDE2X3QgcHJvdG9jb2wsIHVpbnQ4X3QqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4sIGJvb2wgZXh0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gUEFOX1NVQ0NFU1M7Ci19Ci10UEFOX1JFU1VMVCBQQU5fV3JpdGVCdWYodWludDE2X3QgaGFuZGxlLCBjb25zdCBSYXdBZGRyZXNzJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmF3QWRkcmVzcyYgc3JjLCB1aW50MTZfdCBwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVF9IRFIqIHBfYnVmLCBib29sIGV4dCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIFBBTl9TVUNDRVNTOwotfQotdWludDhfdCBQQU5fU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIFBBTl9EZXJlZ2lzdGVyKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgUEFOX0luaXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBQQU5fUmVnaXN0ZXIodFBBTl9SRUdJU1RFUiogcF9yZWdpc3RlcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgUEFOX0R1bXBzeXMoaW50IGZkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19yZmNvbW1fcG9ydF9hcGkuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19yZmNvbW1fcG9ydF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDcwYzQuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfcmZjb21tX3BvcnRfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoyMAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9tdXRleC5oIgotI2luY2x1ZGUgInBvcnRfYXBpLmgiCi0jaW5jbHVkZSAicmZjZGVmcy5oIgotI2luY2x1ZGUgInNkcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2J0bV9hcGlfdHlwZXMuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcG9ydF9pbnQuaCIKLSNpbmNsdWRlICJzdGFjay9yZmNvbW0vcmZjX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIFBPUlRfSXNPcGVuaW5nKFJhd0FkZHJlc3MqIGJkX2FkZHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWNvbnN0IGNoYXIqIFBPUlRfR2V0UmVzdWx0U3RyaW5nKGNvbnN0IHVpbnQ4X3QgcmVzdWx0X2NvZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotaW50IFBPUlRfQ2hlY2tDb25uZWN0aW9uKHVpbnQxNl90IGhhbmRsZSwgUmF3QWRkcmVzcyogYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9sY2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBQT1JUX0NsZWFyS2VlcEhhbmRsZUZsYWcodWludDE2X3QgcG9ydF9oYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IFBPUlRfRmxvd0NvbnRyb2xfTWF4Q3JlZGl0KHVpbnQxNl90IGhhbmRsZSwgYm9vbCBlbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IFBPUlRfR2V0U3RhdGUodWludDE2X3QgaGFuZGxlLCB0UE9SVF9TVEFURSogcF9zZXR0aW5ncykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgUE9SVF9SZWFkRGF0YSh1aW50MTZfdCBoYW5kbGUsIGNoYXIqIHBfZGF0YSwgdWludDE2X3QgbWF4X2xlbiwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2xlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgUE9SVF9TZXREYXRhQ09DYWxsYmFjayh1aW50MTZfdCBwb3J0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQT1JUX0RBVEFfQ09fQ0FMTEJBQ0sqIHBfcG9ydF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgUE9SVF9TZXRFdmVudENhbGxiYWNrKHVpbnQxNl90IHBvcnRfaGFuZGxlLCB0UE9SVF9DQUxMQkFDSyogcF9wb3J0X2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBQT1JUX1NldEV2ZW50TWFzayh1aW50MTZfdCBwb3J0X2hhbmRsZSwgdWludDMyX3QgbWFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgUE9SVF9TZXRTdGF0ZSh1aW50MTZfdCBoYW5kbGUsIHRQT1JUX1NUQVRFKiBwX3NldHRpbmdzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBQT1JUX1dyaXRlRGF0YSh1aW50MTZfdCBoYW5kbGUsIGNvbnN0IGNoYXIqIHBfZGF0YSwgdWludDE2X3QgbWF4X2xlbiwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF9sZW4pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IFBPUlRfV3JpdGVEYXRhQ08odWludDE2X3QgaGFuZGxlLCBpbnQqIHBfbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbih1aW50MTZfdCB1dWlkLCB1aW50OF90IHNjbiwgYm9vbCBpc19zZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXR1LCBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2hhbmRsZSwgdFBPUlRfQ0FMTEJBQ0sqIHBfbWdtdF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgUkZDT01NX0NyZWF0ZUNvbm5lY3Rpb25XaXRoU2VjdXJpdHkodWludDE2X3QgdXVpZCwgdWludDhfdCBzY24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19zZXJ2ZXIsIHVpbnQxNl90IG10dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UE9SVF9DQUxMQkFDSyogcF9tZ210X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlY19tYXNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBSRkNPTU1fUmVtb3ZlQ29ubmVjdGlvbih1aW50MTZfdCBoYW5kbGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IFJGQ09NTV9SZW1vdmVTZXJ2ZXIodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXVpbnQ4X3QgUE9SVF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgUkZDT01NX0NsZWFyU2VjdXJpdHlSZWNvcmQodWludDMyX3Qgc2NuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBSRkNPTU1fSW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19zZHBfYXBpLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfc2RwX2FwaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NzM1NS4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19zZHBfYXBpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxOAotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yLjEKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gTW9jayBpbmNsdWRlIGZpbGUgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHRlc3RzIGFuZCBtb2NrCi0jaW5jbHVkZSAidGVzdC9tb2NrL21vY2tfc3RhY2tfc2RwX2FwaS5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19zZHBfYXBpIHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2ggU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2g7Ci1zdHJ1Y3QgU0RQX0ZpbmRQcm9maWxlVmVyc2lvbkluUmVjIFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYzsKLXN0cnVjdCBTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyBTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYzsKLXN0cnVjdCBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWMgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjOwotc3RydWN0IFNEUF9GaW5kU2VydmljZVVVSURJblJlY18xMjhiaXQgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdDsKLXN0cnVjdCBTRFBfSW5pdERpc2NvdmVyeURiIFNEUF9Jbml0RGlzY292ZXJ5RGI7Ci1zdHJ1Y3QgU0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0IFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDsKLXN0cnVjdCBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QyIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDI7Ci1zdHJ1Y3QgU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0IFNEUF9TZXJ2aWNlU2VhcmNoUmVxdWVzdDsKLXN0cnVjdCBTRFBfRmluZEF0dHJpYnV0ZUluUmVjIFNEUF9GaW5kQXR0cmlidXRlSW5SZWM7Ci1zdHJ1Y3QgU0RQX0ZpbmRTZXJ2aWNlSW5EYiBTRFBfRmluZFNlcnZpY2VJbkRiOwotc3RydWN0IFNEUF9GaW5kU2VydmljZUluRGJfMTI4Yml0IFNEUF9GaW5kU2VydmljZUluRGJfMTI4Yml0Owotc3RydWN0IFNEUF9GaW5kU2VydmljZVVVSURJbkRiIFNEUF9GaW5kU2VydmljZVVVSURJbkRiOwotc3RydWN0IFNEUF9EaURpc2NvdmVyIFNEUF9EaURpc2NvdmVyOwotc3RydWN0IFNEUF9HZXREaVJlY29yZCBTRFBfR2V0RGlSZWNvcmQ7Ci1zdHJ1Y3QgU0RQX1NldExvY2FsRGlSZWNvcmQgU0RQX1NldExvY2FsRGlSZWNvcmQ7Ci1zdHJ1Y3QgU0RQX0dldE51bURpUmVjb3JkcyBTRFBfR2V0TnVtRGlSZWNvcmRzOwotc3RydWN0IFNEUF9TZXRUcmFjZUxldmVsIFNEUF9TZXRUcmFjZUxldmVsOwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfc2RwX2FwaQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIE1vY2tlZCBmdW5jdGlvbnMsIGlmIGFueQotYm9vbCBTRFBfQ2FuY2VsU2VydmljZVNlYXJjaChjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9DYW5jZWxTZXJ2aWNlU2VhcmNoKHBfZGIpOwotfQotYm9vbCBTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm9maWxlX3V1aWQsIHVpbnQxNl90KiBwX3ZlcnNpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19zZHBfYXBpOjpTRFBfRmluZFByb2ZpbGVWZXJzaW9uSW5SZWMoCi0gICAgICBwX3JlYywgcHJvZmlsZV91dWlkLCBwX3ZlcnNpb24pOwotfQotYm9vbCBTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYyhjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF5ZXJfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19zZHBfYXBpOjpTRFBfRmluZFByb3RvY29sTGlzdEVsZW1JblJlYygKLSAgICAgIHBfcmVjLCBsYXllcl91dWlkLCBwX2VsZW0pOwotfQotYm9vbCBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWMoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OlV1aWQqIHBfdXVpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9GaW5kU2VydmljZVVVSURJblJlYyhwX3JlYywgcF91dWlkKTsKLX0KLWJvb2wgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdChjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OlV1aWQqIHBfdXVpZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9GaW5kU2VydmljZVVVSURJblJlY18xMjhiaXQocF9yZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdXVpZCk7Ci19Ci1ib29sIFNEUF9Jbml0RGlzY292ZXJ5RGIodFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsIHVpbnQzMl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fdXVpZCwgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWRfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1fYXR0ciwgY29uc3QgdWludDE2X3QqIHBfYXR0cl9saXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfc2RwX2FwaTo6U0RQX0luaXREaXNjb3ZlcnlEYigKLSAgICAgIHBfZGIsIGxlbiwgbnVtX3V1aWQsIHBfdXVpZF9saXN0LCBudW1fYXR0ciwgcF9hdHRyX2xpc3QpOwotfQotYm9vbCBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdCgKLSAgICAgIHBfYmRfYWRkciwgcF9kYiwgcF9jYik7Ci19Ci1ib29sIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCMiogcF9jYjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogdXNlcl9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfc2RwX2FwaTo6U0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0MigKLSAgICAgIHBfYmRfYWRkciwgcF9kYiwgcF9jYjIsIHVzZXJfZGF0YSk7Ci19Ci1ib29sIFNEUF9TZXJ2aWNlU2VhcmNoUmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfc2RwX2FwaTo6U0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0KHBfYmRfYWRkciwgcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NiKTsKLX0KLXRTRFBfRElTQ19BVFRSKiBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYXR0cl9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9GaW5kQXR0cmlidXRlSW5SZWMocF9yZWMsIGF0dHJfaWQpOwotfQotdFNEUF9ESVNDX1JFQyogU0RQX0ZpbmRTZXJ2aWNlSW5EYihjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3N0YXJ0X3JlYykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9GaW5kU2VydmljZUluRGIocF9kYiwgc2VydmljZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3JlYyk7Ci19Ci10U0RQX0RJU0NfUkVDKiBTRFBfRmluZFNlcnZpY2VJbkRiXzEyOGJpdChjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfc2RwX2FwaTo6U0RQX0ZpbmRTZXJ2aWNlSW5EYl8xMjhiaXQocF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfcmVjKTsKLX0KLXRTRFBfRElTQ19SRUMqIFNEUF9GaW5kU2VydmljZVVVSURJbkRiKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9zdGFydF9yZWMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19zZHBfYXBpOjpTRFBfRmluZFNlcnZpY2VVVUlESW5EYihwX2RiLCB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF9yZWMpOwotfQotdFNEUF9TVEFUVVMgU0RQX0RpRGlzY292ZXIoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MzJfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9EaURpc2NvdmVyKHJlbW90ZV9kZXZpY2UsIHBfZGIsIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY2IpOwotfQotdWludDE2X3QgU0RQX0dldERpUmVjb3JkKHVpbnQ4X3QgZ2V0X3JlY29yZF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJX0dFVF9SRUNPUkQqIHBfZGV2aWNlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19zZHBfYXBpOjpTRFBfR2V0RGlSZWNvcmQoZ2V0X3JlY29yZF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RldmljZV9pbmZvLCBwX2RiKTsKLX0KLXVpbnQxNl90IFNEUF9TZXRMb2NhbERpUmVjb3JkKGNvbnN0IHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBfaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfc2RwX2FwaTo6U0RQX1NldExvY2FsRGlSZWNvcmQocF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGFuZGxlKTsKLX0KLXVpbnQ4X3QgU0RQX0dldE51bURpUmVjb3Jkcyhjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIHRlc3Q6Om1vY2s6OnN0YWNrX3NkcF9hcGk6OlNEUF9HZXROdW1EaVJlY29yZHMocF9kYik7Ci19Ci11aW50OF90IFNEUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gdGVzdDo6bW9jazo6c3RhY2tfc2RwX2FwaTo6U0RQX1NldFRyYWNlTGV2ZWwobmV3X2xldmVsKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3NkcF9hcGkuaCBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3NkcF9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzMzI4OC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19zZHBfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjE4Ci0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIuMQotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0vLyBPcmlnaW5hbCBpbmNsdWRlZCBmaWxlcywgaWYgYW55Ci0vLyBOT1RFOiBTaW5jZSB0aGlzIGlzIGEgbW9jayBmaWxlIHdpdGggbW9jayBkZWZpbml0aW9ucyBzb21lIG51bWJlciBvZgotLy8gICAgICAgaW5jbHVkZSBmaWxlcyBtYXkgbm90IGJlIHJlcXVpcmVkLiAgVGhlIGluY2x1ZGUtd2hhdC15b3UtdXNlCi0vLyAgICAgICBzdGlsbCBhcHBsaWVzLCBidXQgY3JhZnRpbmcgcHJvcGVyIGluY2x1c2lvbiBpcyBvdXQgb2Ygc2NvcGUKLS8vICAgICAgIGZvciB0aGlzIGVmZm9ydC4gIFRoaXMgY29tcGlsYXRpb24gdW5pdCBtYXkgY29tcGlsZSBhcy1pcywgb3IKLS8vICAgICAgIG1heSBuZWVkIGF0dGVudGlvbiB0byBwcnVuZSB0aGUgaW5jbHVzaW9uIHNldC4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc2RwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL3NkcC9zZHBpbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLS8vIE1vY2tlZCBjb21waWxlIGNvbmRpdGlvbmFscywgaWYgYW55Ci0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHN0YWNrX3NkcF9hcGkgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogU0RQX0NhbmNlbFNlcnZpY2VTZWFyY2gKLS8vIFBhcmFtczogdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBTRFBfQ2FuY2VsU2VydmljZVNlYXJjaCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYik+IGJvZHl7Ci0gICAgICBbXShjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIpIHsgcmV0dXJuIGJvZHkocF9kYik7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBTRFBfQ2FuY2VsU2VydmljZVNlYXJjaCBTRFBfQ2FuY2VsU2VydmljZVNlYXJjaDsKLS8vIE5hbWU6IFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYwotLy8gUGFyYW1zOiB0U0RQX0RJU0NfUkVDKiBwX3JlYywgdWludDE2X3QgcHJvZmlsZV91dWlkLCB1aW50MTZfdCogcF92ZXJzaW9uCi0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgU0RQX0ZpbmRQcm9maWxlVmVyc2lvbkluUmVjIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBwcm9maWxlX3V1aWQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF92ZXJzaW9uKT4KLSAgICAgIGJvZHl7W10oY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsIHVpbnQxNl90IHByb2ZpbGVfdXVpZCwKLSAgICAgICAgICAgICAgdWludDE2X3QqIHBfdmVyc2lvbikgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsIHVpbnQxNl90IHByb2ZpbGVfdXVpZCwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3ZlcnNpb24pIHsKLSAgICByZXR1cm4gYm9keShwX3JlYywgcHJvZmlsZV91dWlkLCBwX3ZlcnNpb24pOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgU0RQX0ZpbmRQcm9maWxlVmVyc2lvbkluUmVjIFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYzsKLS8vIE5hbWU6IFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjCi0vLyBQYXJhbXM6IHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBsYXllcl91dWlkLCB0U0RQX1BST1RPQ09MX0VMRU0qIHBfZWxlbQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjIHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBsYXllcl91dWlkLAotICAgICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW0pPgotICAgICAgYm9keXtbXShjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywgdWludDE2X3QgbGF5ZXJfdXVpZCwKLSAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW0pIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBsYXllcl91dWlkLAotICAgICAgICAgICAgICAgICAgdFNEUF9QUk9UT0NPTF9FTEVNKiBwX2VsZW0pIHsKLSAgICByZXR1cm4gYm9keShwX3JlYywgbGF5ZXJfdXVpZCwgcF9lbGVtKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjIFNEUF9GaW5kUHJvdG9jb2xMaXN0RWxlbUluUmVjOwotLy8gTmFtZTogU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjCi0vLyBQYXJhbXM6IHRTRFBfRElTQ19SRUMqIHBfcmVjLCBibHVldG9vdGg6OlV1aWQqIHBfdXVpZAotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IFNEUF9GaW5kU2VydmljZVVVSURJblJlYyB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWQpPiBib2R5ewotICAgICAgW10oY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsIGJsdWV0b290aDo6VXVpZCogcF91dWlkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsIGJsdWV0b290aDo6VXVpZCogcF91dWlkKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9yZWMsIHBfdXVpZCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWMgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjOwotLy8gTmFtZTogU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdAotLy8gUGFyYW1zOiB0U0RQX0RJU0NfUkVDKiBwX3JlYywgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWQKLS8vIFJldHVybnM6IGJvb2wKLXN0cnVjdCBTRFBfRmluZFNlcnZpY2VVVUlESW5SZWNfMTI4Yml0IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLCBibHVldG9vdGg6OlV1aWQqIHBfdXVpZCk+IGJvZHl7Ci0gICAgICBbXShjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWQpIHsKLSAgICByZXR1cm4gYm9keShwX3JlYywgcF91dWlkKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9GaW5kU2VydmljZVVVSURJblJlY18xMjhiaXQgU0RQX0ZpbmRTZXJ2aWNlVVVJREluUmVjXzEyOGJpdDsKLS8vIE5hbWU6IFNEUF9Jbml0RGlzY292ZXJ5RGIKLS8vIFBhcmFtczogdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsIHVpbnQzMl90IGxlbiwgdWludDE2X3QgbnVtX3V1aWQsIGNvbnN0Ci0vLyBibHVldG9vdGg6OlV1aWQqIHBfdXVpZF9saXN0LCB1aW50MTZfdCBudW1fYXR0ciwgdWludDE2X3QqIHBfYXR0cl9saXN0Ci0vLyBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgU0RQX0luaXREaXNjb3ZlcnlEYiB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbCh0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdWludDMyX3QgbGVuLCB1aW50MTZfdCBudW1fdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF91dWlkX2xpc3QsIHVpbnQxNl90IG51bV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIHBfYXR0cl9saXN0KT4KLSAgICAgIGJvZHl7W10odFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsIHVpbnQzMl90IGxlbiwgdWludDE2X3QgbnVtX3V1aWQsCi0gICAgICAgICAgICAgIGNvbnN0IGJsdWV0b290aDo6VXVpZCogcF91dWlkX2xpc3QsIHVpbnQxNl90IG51bV9hdHRyLAotICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogcF9hdHRyX2xpc3QpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MzJfdCBsZW4sIHVpbnQxNl90IG51bV91dWlkLAotICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkKiBwX3V1aWRfbGlzdCwgdWludDE2X3QgbnVtX2F0dHIsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogcF9hdHRyX2xpc3QpIHsKLSAgICByZXR1cm4gYm9keShwX2RiLCBsZW4sIG51bV91dWlkLCBwX3V1aWRfbGlzdCwgbnVtX2F0dHIsIHBfYXR0cl9saXN0KTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9Jbml0RGlzY292ZXJ5RGIgU0RQX0luaXREaXNjb3ZlcnlEYjsKLS8vIE5hbWU6IFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotLy8gdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IgUmV0dXJuczogYm9vbAotc3RydWN0IFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdCB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IpPgotICAgICAgYm9keXtbXShjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYikgeyByZXR1cm4gZmFsc2U7IH19OwotICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9iZF9hZGRyLCBwX2RiLCBwX2NiKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdAotICAgIFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDsKLS8vIE5hbWU6IFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIKLS8vIFBhcmFtczogY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLS8vIHRTRFBfRElTQ19DTVBMX0NCMiogcF9jYjIsIHZvaWQqIHVzZXJfZGF0YSBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgU0RQX1NlcnZpY2VTZWFyY2hBdHRyaWJ1dGVSZXF1ZXN0MiB7Ci0gIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IyKiBwX2NiMiwgY29uc3Qgdm9pZCogdXNlcl9kYXRhKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcF9iZF9hZGRyLCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IyKiBwX2NiMiwKLSAgICAgICAgICAgICAgY29uc3Qgdm9pZCogdXNlcl9kYXRhKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IyKiBwX2NiMiwgY29uc3Qgdm9pZCogdXNlcl9kYXRhKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9iZF9hZGRyLCBwX2RiLCBwX2NiMiwgdXNlcl9kYXRhKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9TZXJ2aWNlU2VhcmNoQXR0cmlidXRlUmVxdWVzdDIKLSAgICBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QyOwotLy8gTmFtZTogU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0vLyB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYiBSZXR1cm5zOiBib29sCi1zdHJ1Y3QgU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfQ01QTF9DQiogcF9jYik+Ci0gICAgICBib2R5e1tdKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkciwgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKSB7IHJldHVybiBmYWxzZTsgfX07Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiBwX2JkX2FkZHIsIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IpIHsKLSAgICByZXR1cm4gYm9keShwX2JkX2FkZHIsIHBfZGIsIHBfY2IpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgU0RQX1NlcnZpY2VTZWFyY2hSZXF1ZXN0IFNEUF9TZXJ2aWNlU2VhcmNoUmVxdWVzdDsKLS8vIE5hbWU6IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMKLS8vIFBhcmFtczogdFNEUF9ESVNDX1JFQyogcF9yZWMsIHVpbnQxNl90IGF0dHJfaWQKLS8vIFJldHVybnM6IHRTRFBfRElTQ19BVFRSKgotc3RydWN0IFNEUF9GaW5kQXR0cmlidXRlSW5SZWMgewotICBzdGQ6OmZ1bmN0aW9uPHRTRFBfRElTQ19BVFRSKihjb25zdCB0U0RQX0RJU0NfUkVDKiBwX3JlYywgdWludDE2X3QgYXR0cl9pZCk+Ci0gICAgICBib2R5ewotICAgICAgICAgIFtdKGNvbnN0IHRTRFBfRElTQ19SRUMqIHBfcmVjLCB1aW50MTZfdCBhdHRyX2lkKSB7IHJldHVybiBudWxscHRyOyB9fTsKLSAgdFNEUF9ESVNDX0FUVFIqIG9wZXJhdG9yKCkoY29uc3QgdFNEUF9ESVNDX1JFQyogcF9yZWMsIHVpbnQxNl90IGF0dHJfaWQpIHsKLSAgICByZXR1cm4gYm9keShwX3JlYywgYXR0cl9pZCk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBTRFBfRmluZEF0dHJpYnV0ZUluUmVjIFNEUF9GaW5kQXR0cmlidXRlSW5SZWM7Ci0vLyBOYW1lOiBTRFBfRmluZFNlcnZpY2VJbkRiCi0vLyBQYXJhbXM6IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIHRTRFBfRElTQ19SRUMqCi0vLyBwX3N0YXJ0X3JlYyBSZXR1cm5zOiB0U0RQX0RJU0NfUkVDKgotc3RydWN0IFNEUF9GaW5kU2VydmljZUluRGIgewotICBzdGQ6OmZ1bmN0aW9uPHRTRFBfRElTQ19SRUMqKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlcnZpY2VfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3N0YXJ0X3JlYyk+Ci0gICAgICBib2R5e1tdKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MTZfdCBzZXJ2aWNlX3V1aWQsCi0gICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKSB7IHJldHVybiBudWxscHRyOyB9fTsKLSAgdFNEUF9ESVNDX1JFQyogb3BlcmF0b3IoKShjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX3V1aWQsIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9kYiwgc2VydmljZV91dWlkLCBwX3N0YXJ0X3JlYyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBTRFBfRmluZFNlcnZpY2VJbkRiIFNEUF9GaW5kU2VydmljZUluRGI7Ci0vLyBOYW1lOiBTRFBfRmluZFNlcnZpY2VJbkRiXzEyOGJpdAotLy8gUGFyYW1zOiB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdFNEUF9ESVNDX1JFQyogcF9zdGFydF9yZWMKLS8vIFJldHVybnM6IHRTRFBfRElTQ19SRUMqCi1zdHJ1Y3QgU0RQX0ZpbmRTZXJ2aWNlSW5EYl8xMjhiaXQgewotICBzdGQ6OmZ1bmN0aW9uPHRTRFBfRElTQ19SRUMqKGNvbnN0IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKT4KLSAgICAgIGJvZHl7W10oY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfX07Ci0gIHRTRFBfRElTQ19SRUMqIG9wZXJhdG9yKCkoY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9zdGFydF9yZWMpIHsKLSAgICByZXR1cm4gYm9keShwX2RiLCBwX3N0YXJ0X3JlYyk7Ci0gIH07Ci19OwotZXh0ZXJuIHN0cnVjdCBTRFBfRmluZFNlcnZpY2VJbkRiXzEyOGJpdCBTRFBfRmluZFNlcnZpY2VJbkRiXzEyOGJpdDsKLS8vIE5hbWU6IFNEUF9GaW5kU2VydmljZVVVSURJbkRiCi0vLyBQYXJhbXM6IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsIHRTRFBfRElTQ19SRUMqCi0vLyBwX3N0YXJ0X3JlYyBSZXR1cm5zOiB0U0RQX0RJU0NfUkVDKgotc3RydWN0IFNEUF9GaW5kU2VydmljZVVVSURJbkRiIHsKLSAgc3RkOjpmdW5jdGlvbjx0U0RQX0RJU0NfUkVDKihjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibHVldG9vdGg6OlV1aWQmIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX1JFQyogcF9zdGFydF9yZWMpPgotICAgICAgYm9keXtbXShjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICB0U0RQX0RJU0NfUkVDKiBwX3N0YXJ0X3JlYykgeyByZXR1cm4gbnVsbHB0cjsgfX07Ci0gIHRTRFBfRElTQ19SRUMqIG9wZXJhdG9yKCkoY29uc3QgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19SRUMqIHBfc3RhcnRfcmVjKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9kYiwgdXVpZCwgcF9zdGFydF9yZWMpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgU0RQX0ZpbmRTZXJ2aWNlVVVJREluRGIgU0RQX0ZpbmRTZXJ2aWNlVVVJREluRGI7Ci0vLyBOYW1lOiBTRFBfRGlEaXNjb3ZlcgotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfZGV2aWNlLCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdWludDMyX3QKLS8vIGxlbiwgdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IgUmV0dXJuczogdFNEUF9TVEFUVVMKLXN0cnVjdCBTRFBfRGlEaXNjb3ZlciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dFNEUF9TVEFUVVMoY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiwgdWludDMyX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ19DTVBMX0NCKiBwX2NiKT4KLSAgICAgIGJvZHl7W10oY29uc3QgUmF3QWRkcmVzcyYgcmVtb3RlX2RldmljZSwgdFNEUF9ESVNDT1ZFUllfREIqIHBfZGIsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGxlbiwgdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IpIHsgcmV0dXJuIFNEUF9TVUNDRVNTOyB9fTsKLSAgdFNEUF9TVEFUVVMgb3BlcmF0b3IoKShjb25zdCBSYXdBZGRyZXNzJiByZW1vdGVfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiLCB1aW50MzJfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9ESVNDX0NNUExfQ0IqIHBfY2IpIHsKLSAgICByZXR1cm4gYm9keShyZW1vdGVfZGV2aWNlLCBwX2RiLCBsZW4sIHBfY2IpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgU0RQX0RpRGlzY292ZXIgU0RQX0RpRGlzY292ZXI7Ci0vLyBOYW1lOiBTRFBfR2V0RGlSZWNvcmQKLS8vIFBhcmFtczogdWludDhfdCBnZXRfcmVjb3JkX2luZGV4LCB0U0RQX0RJX0dFVF9SRUNPUkQqIHBfZGV2aWNlX2luZm8sCi0vLyB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYiBSZXR1cm5zOiB1aW50MTZfdAotc3RydWN0IFNEUF9HZXREaVJlY29yZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDE2X3QodWludDhfdCBnZXRfcmVjb3JkX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElfR0VUX1JFQ09SRCogcF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYik+Ci0gICAgICBib2R5e1tdKHVpbnQ4X3QgZ2V0X3JlY29yZF9pbmRleCwgdFNEUF9ESV9HRVRfUkVDT1JEKiBwX2RldmljZV9pbmZvLAotICAgICAgICAgICAgICBjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQxNl90IG9wZXJhdG9yKCkodWludDhfdCBnZXRfcmVjb3JkX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIHRTRFBfRElfR0VUX1JFQ09SRCogcF9kZXZpY2VfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgewotICAgIHJldHVybiBib2R5KGdldF9yZWNvcmRfaW5kZXgsIHBfZGV2aWNlX2luZm8sIHBfZGIpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgU0RQX0dldERpUmVjb3JkIFNEUF9HZXREaVJlY29yZDsKLS8vIE5hbWU6IFNEUF9TZXRMb2NhbERpUmVjb3JkCi0vLyBQYXJhbXM6IHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLCB1aW50MzJfdCogcF9oYW5kbGUKLS8vIFJldHVybnM6IHVpbnQxNl90Ci1zdHJ1Y3QgU0RQX1NldExvY2FsRGlSZWNvcmQgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQxNl90KGNvbnN0IHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwX2hhbmRsZSk+Ci0gICAgICBib2R5e1tdKGNvbnN0IHRTRFBfRElfUkVDT1JEKiBwX2RldmljZV9pbmZvLCB1aW50MzJfdCogcF9oYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9fTsKLSAgdWludDE2X3Qgb3BlcmF0b3IoKShjb25zdCB0U0RQX0RJX1JFQ09SRCogcF9kZXZpY2VfaW5mbywgdWludDMyX3QqIHBfaGFuZGxlKSB7Ci0gICAgcmV0dXJuIGJvZHkocF9kZXZpY2VfaW5mbywgcF9oYW5kbGUpOwotICB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgU0RQX1NldExvY2FsRGlSZWNvcmQgU0RQX1NldExvY2FsRGlSZWNvcmQ7Ci0vLyBOYW1lOiBTRFBfR2V0TnVtRGlSZWNvcmRzCi0vLyBQYXJhbXM6IHRTRFBfRElTQ09WRVJZX0RCKiBwX2RiCi0vLyBSZXR1cm5zOiB1aW50OF90Ci1zdHJ1Y3QgU0RQX0dldE51bURpUmVjb3JkcyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dWludDhfdChjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYik+IGJvZHl7Ci0gICAgICBbXShjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgeyByZXR1cm4gMDsgfX07Ci0gIHVpbnQ4X3Qgb3BlcmF0b3IoKShjb25zdCB0U0RQX0RJU0NPVkVSWV9EQiogcF9kYikgeyByZXR1cm4gYm9keShwX2RiKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9HZXROdW1EaVJlY29yZHMgU0RQX0dldE51bURpUmVjb3JkczsKLS8vIE5hbWU6IFNEUF9TZXRUcmFjZUxldmVsCi0vLyBQYXJhbXM6IHVpbnQ4X3QgbmV3X2xldmVsCi0vLyBSZXR1cm5zOiB1aW50OF90Ci1zdHJ1Y3QgU0RQX1NldFRyYWNlTGV2ZWwgewotICBzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QodWludDhfdCBuZXdfbGV2ZWwpPiBib2R5ewotICAgICAgW10odWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIDA7IH19OwotICB1aW50OF90IG9wZXJhdG9yKCkodWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIGJvZHkobmV3X2xldmVsKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IFNEUF9TZXRUcmFjZUxldmVsIFNEUF9TZXRUcmFjZUxldmVsOwotCi19ICAvLyBuYW1lc3BhY2Ugc3RhY2tfc2RwX2FwaQotfSAgLy8gbmFtZXNwYWNlIG1vY2sKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0Ci0KLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19zZHBfZGIuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19zZHBfZGIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTg2YjkuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfc2RwX2RiLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxNAotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYnRfdGFyZ2V0LmgiCi0jaW5jbHVkZSAic3RhY2svaW5jbHVkZS9zZHBfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIFNEUF9BZGRBZGRpdGlvblByb3RvTGlzdHModWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBudW1fZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0RQX1BST1RPX0xJU1RfRUxFTSogcF9wcm90b19saXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFNEUF9BZGRBdHRyaWJ1dGUodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBhdHRyX2lkLCB1aW50OF90IGF0dHJfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRyX2xlbiwgdWludDhfdCogcF92YWwpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZExhbmd1YWdlQmFzZUF0dHJJRExpc3QodWludDMyX3QgaGFuZGxlLCB1aW50MTZfdCBsYW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjaGFyX2VuYywgdWludDE2X3QgYmFzZV9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBTRFBfQWRkUHJvZmlsZURlc2NyaXB0b3JMaXN0KHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgcHJvZmlsZV91dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHZlcnNpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFByb3RvY29sTGlzdCh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IG51bV9lbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRTRFBfUFJPVE9DT0xfRUxFTSogcF9lbGVtX2xpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFNlcXVlbmNlKHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9pZCwgdWludDE2X3QgbnVtX2VsZW0sCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR5cGVbXSwgdWludDhfdCBsZW5bXSwgdWludDhfdCogcF92YWxbXSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBTRFBfQWRkU2VydmljZUNsYXNzSWRMaXN0KHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgbnVtX3NlcnZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwX3NlcnZpY2VfdXVpZHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgU0RQX0FkZFV1aWRTZXF1ZW5jZSh1aW50MzJfdCBoYW5kbGUsIHVpbnQxNl90IGF0dHJfaWQsIHVpbnQxNl90IG51bV91dWlkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogcF91dWlkcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBTRFBfRGVsZXRlQXR0cmlidXRlKHVpbnQzMl90IGhhbmRsZSwgdWludDE2X3QgYXR0cl9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBTRFBfRGVsZXRlUmVjb3JkKHVpbnQzMl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdFNEUF9BVFRSSUJVVEUqIHNkcF9kYl9maW5kX2F0dHJfaW5fcmVjKHRTRFBfUkVDT1JEKiBwX3JlYywgdWludDE2X3Qgc3RhcnRfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlbmRfYXR0cikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10U0RQX1JFQ09SRCogc2RwX2RiX2ZpbmRfcmVjb3JkKHVpbnQzMl90IGhhbmRsZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCB0U0RQX1JFQ09SRCogc2RwX2RiX3NlcnZpY2Vfc2VhcmNoKGNvbnN0IHRTRFBfUkVDT1JEKiBwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNEUF9VVUlEX1NFUSogcF9zZXEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdWludDMyX3QgU0RQX0NyZWF0ZVJlY29yZCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3NkcF9tYWluLmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfc2RwX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTRmOTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfc2RwX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6NQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgImwyY19hcGkuaCIKLSNpbmNsdWRlICJsMmNkZWZzLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0jaW5jbHVkZSAic2RwX2FwaS5oIgotI2luY2x1ZGUgInN0YWNrL2J0bS9idG1fc2VjLmgiCi0jaW5jbHVkZSAic3RhY2svc2RwL3NkcGludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi10Q09OTl9DQiogc2RwX2Nvbm5fb3JpZ2luYXRlKGNvbnN0IFJhd0FkZHJlc3MmIHBfYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkIHNkcF9jb25uX3RpbWVyX3RpbWVvdXQodm9pZCogZGF0YSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBzZHBfZGlzY29ubmVjdCh0Q09OTl9DQiogcF9jY2IsIHVpbnQxNl90IHJlYXNvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgc2RwX2ZyZWUodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBzZHBfaW5pdCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja19zdGFja19zbXBfYWN0LmNjIGIvdGVzdC9tb2NrL21vY2tfc3RhY2tfc21wX2FjdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhMDBhZC4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19zbXBfYWN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDo3MQotICoKLSAqICBtb2NrY2lmeS5wbCB2ZXIgMC4yCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIHRoZSBpbmNsdXNpb24gc2V0LgotCi0vLyBNb2NrIGluY2x1ZGUgZmlsZSB0byBzaGFyZSBkYXRhIGJldHdlZW4gdGVzdHMgYW5kIG1vY2sKLSNpbmNsdWRlICJ0ZXN0L21vY2svbW9ja19zdGFja19zbXBfYWN0LmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotLy8gTW9ja2VkIGNvbXBpbGUgY29uZGl0aW9uYWxzLCBpZiBhbnkKLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi0vLyBNb2NrZWQgaW50ZXJuYWwgc3RydWN0dXJlcywgaWYgYW55Ci0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19zbXBfYWN0IHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3Qgc21wX3NlbmRfYXBwX2NiYWNrIHNtcF9zZW5kX2FwcF9jYmFjazsKLXN0cnVjdCBzbXBfc2VuZF9wYWlyX2ZhaWwgc21wX3NlbmRfcGFpcl9mYWlsOwotc3RydWN0IHNtcF9zZW5kX3BhaXJfcmVxIHNtcF9zZW5kX3BhaXJfcmVxOwotc3RydWN0IHNtcF9zZW5kX3BhaXJfcnNwIHNtcF9zZW5kX3BhaXJfcnNwOwotc3RydWN0IHNtcF9zZW5kX2NvbmZpcm0gc21wX3NlbmRfY29uZmlybTsKLXN0cnVjdCBzbXBfc2VuZF9pbml0IHNtcF9zZW5kX2luaXQ7Ci1zdHJ1Y3Qgc21wX3NlbmRfcmFuZCBzbXBfc2VuZF9yYW5kOwotc3RydWN0IHNtcF9zZW5kX3BhaXJfcHVibGljX2tleSBzbXBfc2VuZF9wYWlyX3B1YmxpY19rZXk7Ci1zdHJ1Y3Qgc21wX3NlbmRfY29tbWl0bWVudCBzbXBfc2VuZF9jb21taXRtZW50Owotc3RydWN0IHNtcF9zZW5kX2Roa2V5X2NoZWNrIHNtcF9zZW5kX2Roa2V5X2NoZWNrOwotc3RydWN0IHNtcF9zZW5kX2tleXByZXNzX25vdGlmaWNhdGlvbiBzbXBfc2VuZF9rZXlwcmVzc19ub3RpZmljYXRpb247Ci1zdHJ1Y3Qgc21wX3NlbmRfZW5jX2luZm8gc21wX3NlbmRfZW5jX2luZm87Ci1zdHJ1Y3Qgc21wX3NlbmRfaWRfaW5mbyBzbXBfc2VuZF9pZF9pbmZvOwotc3RydWN0IHNtcF9zZW5kX2NzcmtfaW5mbyBzbXBfc2VuZF9jc3JrX2luZm87Ci1zdHJ1Y3Qgc21wX3NlbmRfbHRrX3JlcGx5IHNtcF9zZW5kX2x0a19yZXBseTsKLXN0cnVjdCBzbXBfcHJvY19zZWNfcmVxIHNtcF9wcm9jX3NlY19yZXE7Ci1zdHJ1Y3Qgc21wX3Byb2Nfc2VjX2dyYW50IHNtcF9wcm9jX3NlY19ncmFudDsKLXN0cnVjdCBzbXBfcHJvY19wYWlyX2ZhaWwgc21wX3Byb2NfcGFpcl9mYWlsOwotc3RydWN0IHNtcF9wcm9jX3BhaXJfY21kIHNtcF9wcm9jX3BhaXJfY21kOwotc3RydWN0IHNtcF9wcm9jX2NvbmZpcm0gc21wX3Byb2NfY29uZmlybTsKLXN0cnVjdCBzbXBfcHJvY19pbml0IHNtcF9wcm9jX2luaXQ7Ci1zdHJ1Y3Qgc21wX3Byb2NfcmFuZCBzbXBfcHJvY19yYW5kOwotc3RydWN0IHNtcF9wcm9jZXNzX3BhaXJpbmdfcHVibGljX2tleSBzbXBfcHJvY2Vzc19wYWlyaW5nX3B1YmxpY19rZXk7Ci1zdHJ1Y3Qgc21wX3Byb2Nlc3NfcGFpcmluZ19jb21taXRtZW50IHNtcF9wcm9jZXNzX3BhaXJpbmdfY29tbWl0bWVudDsKLXN0cnVjdCBzbXBfcHJvY2Vzc19kaGtleV9jaGVjayBzbXBfcHJvY2Vzc19kaGtleV9jaGVjazsKLXN0cnVjdCBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24gc21wX3Byb2Nlc3Nfa2V5cHJlc3Nfbm90aWZpY2F0aW9uOwotc3RydWN0IHNtcF9icl9wcm9jZXNzX3BhaXJpbmdfY29tbWFuZCBzbXBfYnJfcHJvY2Vzc19wYWlyaW5nX2NvbW1hbmQ7Ci1zdHJ1Y3Qgc21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQgc21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQ7Ci1zdHJ1Y3Qgc21wX2JyX2NoZWNrX2F1dGhvcml6YXRpb25fcmVxdWVzdCBzbXBfYnJfY2hlY2tfYXV0aG9yaXphdGlvbl9yZXF1ZXN0Owotc3RydWN0IHNtcF9icl9zZWxlY3RfbmV4dF9rZXkgc21wX2JyX3NlbGVjdF9uZXh0X2tleTsKLXN0cnVjdCBzbXBfcHJvY19lbmNfaW5mbyBzbXBfcHJvY19lbmNfaW5mbzsKLXN0cnVjdCBzbXBfcHJvY19jZW50cmFsX2lkIHNtcF9wcm9jX2NlbnRyYWxfaWQ7Ci1zdHJ1Y3Qgc21wX3Byb2NfaWRfaW5mbyBzbXBfcHJvY19pZF9pbmZvOwotc3RydWN0IHNtcF9wcm9jX2lkX2FkZHIgc21wX3Byb2NfaWRfYWRkcjsKLXN0cnVjdCBzbXBfcHJvY19zcmtfaW5mbyBzbXBfcHJvY19zcmtfaW5mbzsKLXN0cnVjdCBzbXBfcHJvY19jb21wYXJlIHNtcF9wcm9jX2NvbXBhcmU7Ci1zdHJ1Y3Qgc21wX3Byb2Nfc2xfa2V5IHNtcF9wcm9jX3NsX2tleTsKLXN0cnVjdCBzbXBfc3RhcnRfZW5jIHNtcF9zdGFydF9lbmM7Ci1zdHJ1Y3Qgc21wX3Byb2NfZGlzY2FyZCBzbXBfcHJvY19kaXNjYXJkOwotc3RydWN0IHNtcF9lbmNfY21wbCBzbXBfZW5jX2NtcGw7Ci1zdHJ1Y3Qgc21wX2NoZWNrX2F1dGhfcmVxIHNtcF9jaGVja19hdXRoX3JlcTsKLXN0cnVjdCBzbXBfa2V5X3BpY2tfa2V5IHNtcF9rZXlfcGlja19rZXk7Ci1zdHJ1Y3Qgc21wX2tleV9kaXN0cmlidXRpb24gc21wX2tleV9kaXN0cmlidXRpb247Ci1zdHJ1Y3Qgc21wX2RlY2lkZV9hc3NvY2lhdGlvbl9tb2RlbCBzbXBfZGVjaWRlX2Fzc29jaWF0aW9uX21vZGVsOwotc3RydWN0IHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlIHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlOwotc3RydWN0IHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZQotICAgIHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZTsKLXN0cnVjdCBzbXBfYnJfc2VuZF9wYWlyX3Jlc3BvbnNlIHNtcF9icl9zZW5kX3BhaXJfcmVzcG9uc2U7Ci1zdHJ1Y3Qgc21wX3BhaXJpbmdfY21wbCBzbXBfcGFpcmluZ19jbXBsOwotc3RydWN0IHNtcF9wYWlyX3Rlcm1pbmF0ZSBzbXBfcGFpcl90ZXJtaW5hdGU7Ci1zdHJ1Y3Qgc21wX2lkbGVfdGVybWluYXRlIHNtcF9pZGxlX3Rlcm1pbmF0ZTsKLXN0cnVjdCBzbXBfYm90aF9oYXZlX3B1YmxpY19rZXlzIHNtcF9ib3RoX2hhdmVfcHVibGljX2tleXM7Ci1zdHJ1Y3Qgc21wX3N0YXJ0X3NlY3VyZV9jb25uZWN0aW9uX3BoYXNlMSBzbXBfc3RhcnRfc2VjdXJlX2Nvbm5lY3Rpb25fcGhhc2UxOwotc3RydWN0IHNtcF9wcm9jZXNzX2xvY2FsX25vbmNlIHNtcF9wcm9jZXNzX2xvY2FsX25vbmNlOwotc3RydWN0IHNtcF9wcm9jZXNzX3BlZXJfbm9uY2Ugc21wX3Byb2Nlc3NfcGVlcl9ub25jZTsKLXN0cnVjdCBzbXBfbWF0Y2hfZGhrZXlfY2hlY2tzIHNtcF9tYXRjaF9kaGtleV9jaGVja3M7Ci1zdHJ1Y3Qgc21wX21vdmVfdG9fc2VjdXJlX2Nvbm5lY3Rpb25zX3BoYXNlMgotICAgIHNtcF9tb3ZlX3RvX3NlY3VyZV9jb25uZWN0aW9uc19waGFzZTI7Ci1zdHJ1Y3Qgc21wX3BoYXNlXzJfZGhrZXlfY2hlY2tzX2FyZV9wcmVzZW50Ci0gICAgc21wX3BoYXNlXzJfZGhrZXlfY2hlY2tzX2FyZV9wcmVzZW50Owotc3RydWN0IHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzIHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzOwotc3RydWN0IHNtcF9zdGFydF9wYXNza2V5X3ZlcmlmaWNhdGlvbiBzbXBfc3RhcnRfcGFzc2tleV92ZXJpZmljYXRpb247Ci1zdHJ1Y3Qgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fb29iX2RhdGEKLSAgICBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9vb2JfZGF0YTsKLXN0cnVjdCBzbXBfc2V0X2xvY2FsX29vYl9rZXlzIHNtcF9zZXRfbG9jYWxfb29iX2tleXM7Ci1zdHJ1Y3Qgc21wX3NldF9sb2NhbF9vb2JfcmFuZG9tX2NvbW1pdG1lbnQgc21wX3NldF9sb2NhbF9vb2JfcmFuZG9tX2NvbW1pdG1lbnQ7Ci1zdHJ1Y3Qgc21wX2xpbmtfZW5jcnlwdGVkIHNtcF9saW5rX2VuY3J5cHRlZDsKLXN0cnVjdCBzbXBfY2FuY2VsX3N0YXJ0X2VuY3J5cHRpb25fYXR0ZW1wdCBzbXBfY2FuY2VsX3N0YXJ0X2VuY3J5cHRpb25fYXR0ZW1wdDsKLXN0cnVjdCBzbXBfcHJvY19sdGtfcmVxdWVzdCBzbXBfcHJvY19sdGtfcmVxdWVzdDsKLXN0cnVjdCBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9sb25nX3Rlcm1fa2V5Ci0gICAgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fbG9uZ190ZXJtX2tleTsKLXN0cnVjdCBzbXBfc2V0X2Rlcml2ZV9saW5rX2tleSBzbXBfc2V0X2Rlcml2ZV9saW5rX2tleTsKLXN0cnVjdCBzbXBfZGVyaXZlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleQotICAgIHNtcF9kZXJpdmVfbGlua19rZXlfZnJvbV9sb25nX3Rlcm1fa2V5Owotc3RydWN0IHNtcF9icl9wcm9jZXNzX2xpbmtfa2V5IHNtcF9icl9wcm9jZXNzX2xpbmtfa2V5Owotc3RydWN0IHNtcF9rZXlfZGlzdHJpYnV0aW9uX2J5X3RyYW5zcG9ydCBzbXBfa2V5X2Rpc3RyaWJ1dGlvbl9ieV90cmFuc3BvcnQ7Ci1zdHJ1Y3Qgc21wX2JyX3BhaXJpbmdfY29tcGxldGUgc21wX2JyX3BhaXJpbmdfY29tcGxldGU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGFja19zbXBfYWN0Ci19ICAvLyBuYW1lc3BhY2UgbW9jawotfSAgLy8gbmFtZXNwYWNlIHRlc3QKLQotLy8gTW9ja2VkIGZ1bmN0aW9ucywgaWYgYW55Ci12b2lkIHNtcF9zZW5kX2FwcF9jYmFjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX2FwcF9jYmFjayhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2VuZF9wYWlyX2ZhaWwodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9wYWlyX2ZhaWwocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3NlbmRfcGFpcl9yZXEodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9wYWlyX3JlcShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2VuZF9wYWlyX3JzcCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX3BhaXJfcnNwKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX2NvbmZpcm0odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9jb25maXJtKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX2luaXQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9pbml0KHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX3JhbmQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9yYW5kKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX3BhaXJfcHVibGljX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX3BhaXJfcHVibGljX2tleShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2VuZF9jb21taXRtZW50KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3NlbmRfY29tbWl0bWVudChwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2VuZF9kaGtleV9jaGVjayh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX2Roa2V5X2NoZWNrKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX2tleXByZXNzX25vdGlmaWNhdGlvbih0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX2tleXByZXNzX25vdGlmaWNhdGlvbihwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2VuZF9lbmNfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX2VuY19pbmZvKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX2lkX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9pZF9pbmZvKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zZW5kX2NzcmtfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZW5kX2NzcmtfaW5mbyhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2VuZF9sdGtfcmVwbHkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2VuZF9sdGtfcmVwbHkocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2Nfc2VjX3JlcSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jX3NlY19yZXEocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2Nfc2VjX2dyYW50KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3Byb2Nfc2VjX2dyYW50KHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jX3BhaXJfZmFpbCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jX3BhaXJfZmFpbChwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY19wYWlyX2NtZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jX3BhaXJfY21kKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jX2NvbmZpcm0odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY19jb25maXJtKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jX2luaXQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY19pbml0KHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jX3JhbmQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY19yYW5kKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jZXNzX3BhaXJpbmdfcHVibGljX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jZXNzX3BhaXJpbmdfcHVibGljX2tleShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY2Vzc19wYWlyaW5nX2NvbW1pdG1lbnQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY2Vzc19wYWlyaW5nX2NvbW1pdG1lbnQocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2Nlc3NfZGhrZXlfY2hlY2sodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY2Vzc19kaGtleV9jaGVjayhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24ocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2JyX3Byb2Nlc3NfcGFpcmluZ19jb21tYW5kKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2JyX3Byb2Nlc3NfcGFpcmluZ19jb21tYW5kKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9icl9wcm9jZXNzX3NlY3VyaXR5X2dyYW50KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2JyX2NoZWNrX2F1dGhvcml6YXRpb25fcmVxdWVzdCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9icl9jaGVja19hdXRob3JpemF0aW9uX3JlcXVlc3QocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2JyX3NlbGVjdF9uZXh0X2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9icl9zZWxlY3RfbmV4dF9rZXkocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2NfZW5jX2luZm8odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY19lbmNfaW5mbyhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY19jZW50cmFsX2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3Byb2NfY2VudHJhbF9pZChwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY19pZF9pbmZvKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3Byb2NfaWRfaW5mbyhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY19pZF9hZGRyKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3Byb2NfaWRfYWRkcihwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY19zcmtfaW5mbyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jX3Nya19pbmZvKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jX2NvbXBhcmUodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY19jb21wYXJlKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jX3NsX2tleSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jX3NsX2tleShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc3RhcnRfZW5jKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3N0YXJ0X2VuYyhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcHJvY19kaXNjYXJkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3Byb2NfZGlzY2FyZChwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfZW5jX2NtcGwodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfZW5jX2NtcGwocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2NoZWNrX2F1dGhfcmVxKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2NoZWNrX2F1dGhfcmVxKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9rZXlfcGlja19rZXkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfa2V5X3BpY2tfa2V5KHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9rZXlfZGlzdHJpYnV0aW9uKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2tleV9kaXN0cmlidXRpb24ocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2RlY2lkZV9hc3NvY2lhdGlvbl9tb2RlbCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9kZWNpZGVfYXNzb2NpYXRpb25fbW9kZWwocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2Nlc3NfaW9fcmVzcG9uc2UodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY2Vzc19pb19yZXNwb25zZShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfYnJfcHJvY2Vzc19wZXJpcGhlcmFsX2tleXNfcmVzcG9uc2UodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2JyX3Byb2Nlc3NfcGVyaXBoZXJhbF9rZXlzX3Jlc3BvbnNlKHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEpOwotfQotdm9pZCBzbXBfYnJfc2VuZF9wYWlyX3Jlc3BvbnNlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2JyX3NlbmRfcGFpcl9yZXNwb25zZShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcGFpcmluZ19jbXBsKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3BhaXJpbmdfY21wbChwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfcGFpcl90ZXJtaW5hdGUodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcGFpcl90ZXJtaW5hdGUocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2lkbGVfdGVybWluYXRlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2lkbGVfdGVybWluYXRlKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9ib3RoX2hhdmVfcHVibGljX2tleXModFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfYm90aF9oYXZlX3B1YmxpY19rZXlzKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9zdGFydF9zZWN1cmVfY29ubmVjdGlvbl9waGFzZTEodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc3RhcnRfc2VjdXJlX2Nvbm5lY3Rpb25fcGhhc2UxKHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9wcm9jZXNzX2xvY2FsX25vbmNlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3Byb2Nlc3NfbG9jYWxfbm9uY2UocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2Nlc3NfcGVlcl9ub25jZSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jZXNzX3BlZXJfbm9uY2UocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX21hdGNoX2Roa2V5X2NoZWNrcyh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9tYXRjaF9kaGtleV9jaGVja3MocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX21vdmVfdG9fc2VjdXJlX2Nvbm5lY3Rpb25zX3BoYXNlMih0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX21vdmVfdG9fc2VjdXJlX2Nvbm5lY3Rpb25zX3BoYXNlMihwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9waGFzZV8yX2Roa2V5X2NoZWNrc19hcmVfcHJlc2VudCh0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcGhhc2VfMl9kaGtleV9jaGVja3NfYXJlX3ByZXNlbnQocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3dhaXRfZm9yX2JvdGhfcHVibGljX2tleXModFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfd2FpdF9mb3JfYm90aF9wdWJsaWNfa2V5cyhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc3RhcnRfcGFzc2tleV92ZXJpZmljYXRpb24odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc3RhcnRfcGFzc2tleV92ZXJpZmljYXRpb24ocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fb29iX2RhdGEodFNNUF9DQiogcF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9vb2JfZGF0YShwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2V0X2xvY2FsX29vYl9rZXlzKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX3NldF9sb2NhbF9vb2Jfa2V5cyhwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfc2V0X2xvY2FsX29vYl9yYW5kb21fY29tbWl0bWVudCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9zZXRfbG9jYWxfb29iX3JhbmRvbV9jb21taXRtZW50KHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9saW5rX2VuY3J5cHRlZChjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QgZW5jcl9lbmFibGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9saW5rX2VuY3J5cHRlZChiZGEsIGVuY3JfZW5hYmxlKTsKLX0KLXZvaWQgc21wX2NhbmNlbF9zdGFydF9lbmNyeXB0aW9uX2F0dGVtcHQoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfY2FuY2VsX3N0YXJ0X2VuY3J5cHRpb25fYXR0ZW1wdCgpOwotfQotYm9vbCBzbXBfcHJvY19sdGtfcmVxdWVzdChjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfcHJvY19sdGtfcmVxdWVzdChiZGEpOwotfQotdm9pZCBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9sb25nX3Rlcm1fa2V5KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX2xvbmdfdGVybV9rZXkoKTsKLX0KLXZvaWQgc21wX3NldF9kZXJpdmVfbGlua19rZXkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICB0ZXN0Ojptb2NrOjpzdGFja19zbXBfYWN0OjpzbXBfc2V0X2Rlcml2ZV9saW5rX2tleShwX2NiLCBwX2RhdGEpOwotfQotdm9pZCBzbXBfZGVyaXZlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleSh0U01QX0NCKiBwX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHRlc3Q6Om1vY2s6OnN0YWNrX3NtcF9hY3Q6OnNtcF9kZXJpdmVfbGlua19rZXlfZnJvbV9sb25nX3Rlcm1fa2V5KHBfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9icl9wcm9jZXNzX2xpbmtfa2V5KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2JyX3Byb2Nlc3NfbGlua19rZXkocF9jYiwgcF9kYXRhKTsKLX0KLXZvaWQgc21wX2tleV9kaXN0cmlidXRpb25fYnlfdHJhbnNwb3J0KHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2tleV9kaXN0cmlidXRpb25fYnlfdHJhbnNwb3J0KHBfY2IsIHBfZGF0YSk7Ci19Ci12b2lkIHNtcF9icl9wYWlyaW5nX2NvbXBsZXRlKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6c3RhY2tfc21wX2FjdDo6c21wX2JyX3BhaXJpbmdfY29tcGxldGUocF9jYiwgcF9kYXRhKTsKLX0KLQotLy8gRU5EIG1vY2tjaWZ5IGdlbmVyYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3NtcF9hY3QuaCBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3NtcF9hY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NTkwMi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19zbXBfYWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjcxCi0gKgotICogIG1vY2tjaWZ5LnBsIHZlciAwLjIKLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotLy8gT3JpZ2luYWwgaW5jbHVkZWQgZmlsZXMsIGlmIGFueQotLy8gTk9URTogU2luY2UgdGhpcyBpcyBhIG1vY2sgZmlsZSB3aXRoIG1vY2sgZGVmaW5pdGlvbnMgc29tZSBudW1iZXIgb2YKLS8vICAgICAgIGluY2x1ZGUgZmlsZXMgbWF5IG5vdCBiZSByZXF1aXJlZC4gIFRoZSBpbmNsdWRlLXdoYXQteW91LXVzZQotLy8gICAgICAgc3RpbGwgYXBwbGllcywgYnV0IGNyYWZ0aW5nIHByb3BlciBpbmNsdXNpb24gaXMgb3V0IG9mIHNjb3BlCi0vLyAgICAgICBmb3IgdGhpcyBlZmZvcnQuICBUaGlzIGNvbXBpbGF0aW9uIHVuaXQgbWF5IGNvbXBpbGUgYXMtaXMsIG9yCi0vLyAgICAgICBtYXkgbmVlZCBhdHRlbnRpb24gdG8gcHJ1bmUgdGhlIGluY2x1c2lvbiBzZXQuCi0jaW5jbHVkZSAiYnRpZi9pbmNsdWRlL2J0aWZfYXBpLmgiCi0jaW5jbHVkZSAic3RhY2svc21wL3NtcF9pbnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0IHsKLW5hbWVzcGFjZSBtb2NrIHsKLW5hbWVzcGFjZSBzdGFja19zbXBfYWN0IHsKLQotLy8gU2hhcmVkIHN0YXRlIGJldHdlZW4gbW9ja2VkIGZ1bmN0aW9ucyBhbmQgdGVzdHMKLS8vIE5hbWU6IHNtcF9zZW5kX2FwcF9jYmFjawotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc2VuZF9hcHBfY2JhY2sgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9zZW5kX2FwcF9jYmFjayBzbXBfc2VuZF9hcHBfY2JhY2s7Ci0vLyBOYW1lOiBzbXBfc2VuZF9wYWlyX2ZhaWwKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfcGFpcl9mYWlsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfc2VuZF9wYWlyX2ZhaWwgc21wX3NlbmRfcGFpcl9mYWlsOwotLy8gTmFtZTogc21wX3NlbmRfcGFpcl9yZXEKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfcGFpcl9yZXEgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9zZW5kX3BhaXJfcmVxIHNtcF9zZW5kX3BhaXJfcmVxOwotLy8gTmFtZTogc21wX3NlbmRfcGFpcl9yc3AKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfcGFpcl9yc3AgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9zZW5kX3BhaXJfcnNwIHNtcF9zZW5kX3BhaXJfcnNwOwotLy8gTmFtZTogc21wX3NlbmRfY29uZmlybQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc2VuZF9jb25maXJtIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfc2VuZF9jb25maXJtIHNtcF9zZW5kX2NvbmZpcm07Ci0vLyBOYW1lOiBzbXBfc2VuZF9pbml0Ci0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9zZW5kX2luaXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9zZW5kX2luaXQgc21wX3NlbmRfaW5pdDsKLS8vIE5hbWU6IHNtcF9zZW5kX3JhbmQKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfcmFuZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NlbmRfcmFuZCBzbXBfc2VuZF9yYW5kOwotLy8gTmFtZTogc21wX3NlbmRfcGFpcl9wdWJsaWNfa2V5Ci0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9zZW5kX3BhaXJfcHVibGljX2tleSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NlbmRfcGFpcl9wdWJsaWNfa2V5IHNtcF9zZW5kX3BhaXJfcHVibGljX2tleTsKLS8vIE5hbWU6IHNtcF9zZW5kX2NvbW1pdG1lbnQKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfY29tbWl0bWVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NlbmRfY29tbWl0bWVudCBzbXBfc2VuZF9jb21taXRtZW50OwotLy8gTmFtZTogc21wX3NlbmRfZGhrZXlfY2hlY2sKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfZGhrZXlfY2hlY2sgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9zZW5kX2Roa2V5X2NoZWNrIHNtcF9zZW5kX2Roa2V5X2NoZWNrOwotLy8gTmFtZTogc21wX3NlbmRfa2V5cHJlc3Nfbm90aWZpY2F0aW9uCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9zZW5kX2tleXByZXNzX25vdGlmaWNhdGlvbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NlbmRfa2V5cHJlc3Nfbm90aWZpY2F0aW9uIHNtcF9zZW5kX2tleXByZXNzX25vdGlmaWNhdGlvbjsKLS8vIE5hbWU6IHNtcF9zZW5kX2VuY19pbmZvCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9zZW5kX2VuY19pbmZvIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfc2VuZF9lbmNfaW5mbyBzbXBfc2VuZF9lbmNfaW5mbzsKLS8vIE5hbWU6IHNtcF9zZW5kX2lkX2luZm8KLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3NlbmRfaWRfaW5mbyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NlbmRfaWRfaW5mbyBzbXBfc2VuZF9pZF9pbmZvOwotLy8gTmFtZTogc21wX3NlbmRfY3Nya19pbmZvCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9zZW5kX2NzcmtfaW5mbyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NlbmRfY3Nya19pbmZvIHNtcF9zZW5kX2NzcmtfaW5mbzsKLS8vIE5hbWU6IHNtcF9zZW5kX2x0a19yZXBseQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc2VuZF9sdGtfcmVwbHkgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9zZW5kX2x0a19yZXBseSBzbXBfc2VuZF9sdGtfcmVwbHk7Ci0vLyBOYW1lOiBzbXBfcHJvY19zZWNfcmVxCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jX3NlY19yZXEgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX3NlY19yZXEgc21wX3Byb2Nfc2VjX3JlcTsKLS8vIE5hbWU6IHNtcF9wcm9jX3NlY19ncmFudAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY19zZWNfZ3JhbnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX3NlY19ncmFudCBzbXBfcHJvY19zZWNfZ3JhbnQ7Ci0vLyBOYW1lOiBzbXBfcHJvY19wYWlyX2ZhaWwKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2NfcGFpcl9mYWlsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY19wYWlyX2ZhaWwgc21wX3Byb2NfcGFpcl9mYWlsOwotLy8gTmFtZTogc21wX3Byb2NfcGFpcl9jbWQKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2NfcGFpcl9jbWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX3BhaXJfY21kIHNtcF9wcm9jX3BhaXJfY21kOwotLy8gTmFtZTogc21wX3Byb2NfY29uZmlybQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY19jb25maXJtIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY19jb25maXJtIHNtcF9wcm9jX2NvbmZpcm07Ci0vLyBOYW1lOiBzbXBfcHJvY19pbml0Ci0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jX2luaXQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX2luaXQgc21wX3Byb2NfaW5pdDsKLS8vIE5hbWU6IHNtcF9wcm9jX3JhbmQKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2NfcmFuZCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2NfcmFuZCBzbXBfcHJvY19yYW5kOwotLy8gTmFtZTogc21wX3Byb2Nlc3NfcGFpcmluZ19wdWJsaWNfa2V5Ci0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jZXNzX3BhaXJpbmdfcHVibGljX2tleSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2Nlc3NfcGFpcmluZ19wdWJsaWNfa2V5IHNtcF9wcm9jZXNzX3BhaXJpbmdfcHVibGljX2tleTsKLS8vIE5hbWU6IHNtcF9wcm9jZXNzX3BhaXJpbmdfY29tbWl0bWVudAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY2Vzc19wYWlyaW5nX2NvbW1pdG1lbnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jZXNzX3BhaXJpbmdfY29tbWl0bWVudCBzbXBfcHJvY2Vzc19wYWlyaW5nX2NvbW1pdG1lbnQ7Ci0vLyBOYW1lOiBzbXBfcHJvY2Vzc19kaGtleV9jaGVjawotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY2Vzc19kaGtleV9jaGVjayB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2Nlc3NfZGhrZXlfY2hlY2sgc21wX3Byb2Nlc3NfZGhrZXlfY2hlY2s7Ci0vLyBOYW1lOiBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24KLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2Nlc3Nfa2V5cHJlc3Nfbm90aWZpY2F0aW9uIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb24KLSAgICBzbXBfcHJvY2Vzc19rZXlwcmVzc19ub3RpZmljYXRpb247Ci0vLyBOYW1lOiBzbXBfYnJfcHJvY2Vzc19wYWlyaW5nX2NvbW1hbmQKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX2JyX3Byb2Nlc3NfcGFpcmluZ19jb21tYW5kIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfYnJfcHJvY2Vzc19wYWlyaW5nX2NvbW1hbmQgc21wX2JyX3Byb2Nlc3NfcGFpcmluZ19jb21tYW5kOwotLy8gTmFtZTogc21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX2JyX3Byb2Nlc3Nfc2VjdXJpdHlfZ3JhbnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9icl9wcm9jZXNzX3NlY3VyaXR5X2dyYW50IHNtcF9icl9wcm9jZXNzX3NlY3VyaXR5X2dyYW50OwotLy8gTmFtZTogc21wX2JyX2NoZWNrX2F1dGhvcml6YXRpb25fcmVxdWVzdAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfYnJfY2hlY2tfYXV0aG9yaXphdGlvbl9yZXF1ZXN0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfYnJfY2hlY2tfYXV0aG9yaXphdGlvbl9yZXF1ZXN0Ci0gICAgc21wX2JyX2NoZWNrX2F1dGhvcml6YXRpb25fcmVxdWVzdDsKLS8vIE5hbWU6IHNtcF9icl9zZWxlY3RfbmV4dF9rZXkKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX2JyX3NlbGVjdF9uZXh0X2tleSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2JyX3NlbGVjdF9uZXh0X2tleSBzbXBfYnJfc2VsZWN0X25leHRfa2V5OwotLy8gTmFtZTogc21wX3Byb2NfZW5jX2luZm8KLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2NfZW5jX2luZm8gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX2VuY19pbmZvIHNtcF9wcm9jX2VuY19pbmZvOwotLy8gTmFtZTogc21wX3Byb2NfY2VudHJhbF9pZAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY19jZW50cmFsX2lkIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY19jZW50cmFsX2lkIHNtcF9wcm9jX2NlbnRyYWxfaWQ7Ci0vLyBOYW1lOiBzbXBfcHJvY19pZF9pbmZvCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jX2lkX2luZm8gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX2lkX2luZm8gc21wX3Byb2NfaWRfaW5mbzsKLS8vIE5hbWU6IHNtcF9wcm9jX2lkX2FkZHIKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2NfaWRfYWRkciB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2NfaWRfYWRkciBzbXBfcHJvY19pZF9hZGRyOwotLy8gTmFtZTogc21wX3Byb2Nfc3JrX2luZm8KLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2Nfc3JrX2luZm8gewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX3Nya19pbmZvIHNtcF9wcm9jX3Nya19pbmZvOwotLy8gTmFtZTogc21wX3Byb2NfY29tcGFyZQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY19jb21wYXJlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY19jb21wYXJlIHNtcF9wcm9jX2NvbXBhcmU7Ci0vLyBOYW1lOiBzbXBfcHJvY19zbF9rZXkKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2Nfc2xfa2V5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY19zbF9rZXkgc21wX3Byb2Nfc2xfa2V5OwotLy8gTmFtZTogc21wX3N0YXJ0X2VuYwotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc3RhcnRfZW5jIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfc3RhcnRfZW5jIHNtcF9zdGFydF9lbmM7Ci0vLyBOYW1lOiBzbXBfcHJvY19kaXNjYXJkCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jX2Rpc2NhcmQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9wcm9jX2Rpc2NhcmQgc21wX3Byb2NfZGlzY2FyZDsKLS8vIE5hbWU6IHNtcF9lbmNfY21wbAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfZW5jX2NtcGwgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9lbmNfY21wbCBzbXBfZW5jX2NtcGw7Ci0vLyBOYW1lOiBzbXBfY2hlY2tfYXV0aF9yZXEKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX2NoZWNrX2F1dGhfcmVxIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfY2hlY2tfYXV0aF9yZXEgc21wX2NoZWNrX2F1dGhfcmVxOwotLy8gTmFtZTogc21wX2tleV9waWNrX2tleQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfa2V5X3BpY2tfa2V5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfa2V5X3BpY2tfa2V5IHNtcF9rZXlfcGlja19rZXk7Ci0vLyBOYW1lOiBzbXBfa2V5X2Rpc3RyaWJ1dGlvbgotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfa2V5X2Rpc3RyaWJ1dGlvbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2tleV9kaXN0cmlidXRpb24gc21wX2tleV9kaXN0cmlidXRpb247Ci0vLyBOYW1lOiBzbXBfZGVjaWRlX2Fzc29jaWF0aW9uX21vZGVsCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9kZWNpZGVfYXNzb2NpYXRpb25fbW9kZWwgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9kZWNpZGVfYXNzb2NpYXRpb25fbW9kZWwgc21wX2RlY2lkZV9hc3NvY2lhdGlvbl9tb2RlbDsKLS8vIE5hbWU6IHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jZXNzX2lvX3Jlc3BvbnNlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY2Vzc19pb19yZXNwb25zZSBzbXBfcHJvY2Vzc19pb19yZXNwb25zZTsKLS8vIE5hbWU6IHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfYnJfcHJvY2Vzc19wZXJpcGhlcmFsX2tleXNfcmVzcG9uc2UgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZQotICAgIHNtcF9icl9wcm9jZXNzX3BlcmlwaGVyYWxfa2V5c19yZXNwb25zZTsKLS8vIE5hbWU6IHNtcF9icl9zZW5kX3BhaXJfcmVzcG9uc2UKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX2JyX3NlbmRfcGFpcl9yZXNwb25zZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2JyX3NlbmRfcGFpcl9yZXNwb25zZSBzbXBfYnJfc2VuZF9wYWlyX3Jlc3BvbnNlOwotLy8gTmFtZTogc21wX3BhaXJpbmdfY21wbAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcGFpcmluZ19jbXBsIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcGFpcmluZ19jbXBsIHNtcF9wYWlyaW5nX2NtcGw7Ci0vLyBOYW1lOiBzbXBfcGFpcl90ZXJtaW5hdGUKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3BhaXJfdGVybWluYXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcGFpcl90ZXJtaW5hdGUgc21wX3BhaXJfdGVybWluYXRlOwotLy8gTmFtZTogc21wX2lkbGVfdGVybWluYXRlCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9pZGxlX3Rlcm1pbmF0ZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2lkbGVfdGVybWluYXRlIHNtcF9pZGxlX3Rlcm1pbmF0ZTsKLS8vIE5hbWU6IHNtcF9ib3RoX2hhdmVfcHVibGljX2tleXMKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX2JvdGhfaGF2ZV9wdWJsaWNfa2V5cyB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2JvdGhfaGF2ZV9wdWJsaWNfa2V5cyBzbXBfYm90aF9oYXZlX3B1YmxpY19rZXlzOwotLy8gTmFtZTogc21wX3N0YXJ0X3NlY3VyZV9jb25uZWN0aW9uX3BoYXNlMQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc3RhcnRfc2VjdXJlX2Nvbm5lY3Rpb25fcGhhc2UxIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfc3RhcnRfc2VjdXJlX2Nvbm5lY3Rpb25fcGhhc2UxCi0gICAgc21wX3N0YXJ0X3NlY3VyZV9jb25uZWN0aW9uX3BoYXNlMTsKLS8vIE5hbWU6IHNtcF9wcm9jZXNzX2xvY2FsX25vbmNlCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jZXNzX2xvY2FsX25vbmNlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY2Vzc19sb2NhbF9ub25jZSBzbXBfcHJvY2Vzc19sb2NhbF9ub25jZTsKLS8vIE5hbWU6IHNtcF9wcm9jZXNzX3BlZXJfbm9uY2UKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3Byb2Nlc3NfcGVlcl9ub25jZSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2Nlc3NfcGVlcl9ub25jZSBzbXBfcHJvY2Vzc19wZWVyX25vbmNlOwotLy8gTmFtZTogc21wX21hdGNoX2Roa2V5X2NoZWNrcwotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfbWF0Y2hfZGhrZXlfY2hlY2tzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfbWF0Y2hfZGhrZXlfY2hlY2tzIHNtcF9tYXRjaF9kaGtleV9jaGVja3M7Ci0vLyBOYW1lOiBzbXBfbW92ZV90b19zZWN1cmVfY29ubmVjdGlvbnNfcGhhc2UyCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9tb3ZlX3RvX3NlY3VyZV9jb25uZWN0aW9uc19waGFzZTIgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9tb3ZlX3RvX3NlY3VyZV9jb25uZWN0aW9uc19waGFzZTIKLSAgICBzbXBfbW92ZV90b19zZWN1cmVfY29ubmVjdGlvbnNfcGhhc2UyOwotLy8gTmFtZTogc21wX3BoYXNlXzJfZGhrZXlfY2hlY2tzX2FyZV9wcmVzZW50Ci0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9waGFzZV8yX2Roa2V5X2NoZWNrc19hcmVfcHJlc2VudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3BoYXNlXzJfZGhrZXlfY2hlY2tzX2FyZV9wcmVzZW50Ci0gICAgc21wX3BoYXNlXzJfZGhrZXlfY2hlY2tzX2FyZV9wcmVzZW50OwotLy8gTmFtZTogc21wX3dhaXRfZm9yX2JvdGhfcHVibGljX2tleXMKLS8vIFBhcmFtczogdFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhCi0vLyBSZXR1cm5zOiB2b2lkCi1zdHJ1Y3Qgc21wX3dhaXRfZm9yX2JvdGhfcHVibGljX2tleXMgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzIHNtcF93YWl0X2Zvcl9ib3RoX3B1YmxpY19rZXlzOwotLy8gTmFtZTogc21wX3N0YXJ0X3Bhc3NrZXlfdmVyaWZpY2F0aW9uCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9zdGFydF9wYXNza2V5X3ZlcmlmaWNhdGlvbiB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3N0YXJ0X3Bhc3NrZXlfdmVyaWZpY2F0aW9uIHNtcF9zdGFydF9wYXNza2V5X3ZlcmlmaWNhdGlvbjsKLS8vIE5hbWU6IHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX29vYl9kYXRhCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX29vYl9kYXRhIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9vb2JfZGF0YQotICAgIHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX29vYl9kYXRhOwotLy8gTmFtZTogc21wX3NldF9sb2NhbF9vb2Jfa2V5cwotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc2V0X2xvY2FsX29vYl9rZXlzIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfc2V0X2xvY2FsX29vYl9rZXlzIHNtcF9zZXRfbG9jYWxfb29iX2tleXM7Ci0vLyBOYW1lOiBzbXBfc2V0X2xvY2FsX29vYl9yYW5kb21fY29tbWl0bWVudAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc2V0X2xvY2FsX29vYl9yYW5kb21fY29tbWl0bWVudCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NldF9sb2NhbF9vb2JfcmFuZG9tX2NvbW1pdG1lbnQKLSAgICBzbXBfc2V0X2xvY2FsX29vYl9yYW5kb21fY29tbWl0bWVudDsKLS8vIE5hbWU6IHNtcF9saW5rX2VuY3J5cHRlZAotLy8gUGFyYW1zOiBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIHVpbnQ4X3QgZW5jcl9lbmFibGUKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfbGlua19lbmNyeXB0ZWQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90IGVuY3JfZW5hYmxlKT4gYm9keXsKLSAgICAgIFtdKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwgdWludDhfdCBlbmNyX2VuYWJsZSkge319OwotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgYmRhLCB1aW50OF90IGVuY3JfZW5hYmxlKSB7Ci0gICAgYm9keShiZGEsIGVuY3JfZW5hYmxlKTsKLSAgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9saW5rX2VuY3J5cHRlZCBzbXBfbGlua19lbmNyeXB0ZWQ7Ci0vLyBOYW1lOiBzbXBfY2FuY2VsX3N0YXJ0X2VuY3J5cHRpb25fYXR0ZW1wdAotLy8gUGFyYW1zOgotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9jYW5jZWxfc3RhcnRfZW5jcnlwdGlvbl9hdHRlbXB0IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGJvZHl7W10oKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2NhbmNlbF9zdGFydF9lbmNyeXB0aW9uX2F0dGVtcHQKLSAgICBzbXBfY2FuY2VsX3N0YXJ0X2VuY3J5cHRpb25fYXR0ZW1wdDsKLS8vIE5hbWU6IHNtcF9wcm9jX2x0a19yZXF1ZXN0Ci0vLyBQYXJhbXM6IGNvbnN0IFJhd0FkZHJlc3MmIGJkYQotLy8gUmV0dXJuczogYm9vbAotc3RydWN0IHNtcF9wcm9jX2x0a19yZXF1ZXN0IHsKLSAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSk+IGJvZHl7Ci0gICAgICBbXShjb25zdCBSYXdBZGRyZXNzJiBiZGEpIHsgcmV0dXJuIGZhbHNlOyB9fTsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJhd0FkZHJlc3MmIGJkYSkgeyByZXR1cm4gYm9keShiZGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2NfbHRrX3JlcXVlc3Qgc21wX3Byb2NfbHRrX3JlcXVlc3Q7Ci0vLyBOYW1lOiBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9sb25nX3Rlcm1fa2V5Ci0vLyBQYXJhbXM6IHZvaWQKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfcHJvY2Vzc19zZWN1cmVfY29ubmVjdGlvbl9sb25nX3Rlcm1fa2V5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBib2R5e1tdKHZvaWQpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHZvaWQpIHsgYm9keSgpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3Byb2Nlc3Nfc2VjdXJlX2Nvbm5lY3Rpb25fbG9uZ190ZXJtX2tleQotICAgIHNtcF9wcm9jZXNzX3NlY3VyZV9jb25uZWN0aW9uX2xvbmdfdGVybV9rZXk7Ci0vLyBOYW1lOiBzbXBfc2V0X2Rlcml2ZV9saW5rX2tleQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfc2V0X2Rlcml2ZV9saW5rX2tleSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX3NldF9kZXJpdmVfbGlua19rZXkgc21wX3NldF9kZXJpdmVfbGlua19rZXk7Ci0vLyBOYW1lOiBzbXBfZGVyaXZlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleQotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfZGVyaXZlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleSB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpPiBib2R5ewotICAgICAgW10odFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7fX07Ci0gIHZvaWQgb3BlcmF0b3IoKSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHsgYm9keShwX2NiLCBwX2RhdGEpOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3Qgc21wX2Rlcml2ZV9saW5rX2tleV9mcm9tX2xvbmdfdGVybV9rZXkKLSAgICBzbXBfZGVyaXZlX2xpbmtfa2V5X2Zyb21fbG9uZ190ZXJtX2tleTsKLS8vIE5hbWU6IHNtcF9icl9wcm9jZXNzX2xpbmtfa2V5Ci0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9icl9wcm9jZXNzX2xpbmtfa2V5IHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfYnJfcHJvY2Vzc19saW5rX2tleSBzbXBfYnJfcHJvY2Vzc19saW5rX2tleTsKLS8vIE5hbWU6IHNtcF9rZXlfZGlzdHJpYnV0aW9uX2J5X3RyYW5zcG9ydAotLy8gUGFyYW1zOiB0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEKLS8vIFJldHVybnM6IHZvaWQKLXN0cnVjdCBzbXBfa2V5X2Rpc3RyaWJ1dGlvbl9ieV90cmFuc3BvcnQgewotICBzdGQ6OmZ1bmN0aW9uPHZvaWQodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKT4gYm9keXsKLSAgICAgIFtdKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkge319OwotICB2b2lkIG9wZXJhdG9yKCkodFNNUF9DQiogcF9jYiwgdFNNUF9JTlRfREFUQSogcF9kYXRhKSB7IGJvZHkocF9jYiwgcF9kYXRhKTsgfTsKLX07Ci1leHRlcm4gc3RydWN0IHNtcF9rZXlfZGlzdHJpYnV0aW9uX2J5X3RyYW5zcG9ydAotICAgIHNtcF9rZXlfZGlzdHJpYnV0aW9uX2J5X3RyYW5zcG9ydDsKLS8vIE5hbWU6IHNtcF9icl9wYWlyaW5nX2NvbXBsZXRlCi0vLyBQYXJhbXM6IHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YQotLy8gUmV0dXJuczogdm9pZAotc3RydWN0IHNtcF9icl9wYWlyaW5nX2NvbXBsZXRlIHsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSk+IGJvZHl7Ci0gICAgICBbXSh0U01QX0NCKiBwX2NiLCB0U01QX0lOVF9EQVRBKiBwX2RhdGEpIHt9fTsKLSAgdm9pZCBvcGVyYXRvcigpKHRTTVBfQ0IqIHBfY2IsIHRTTVBfSU5UX0RBVEEqIHBfZGF0YSkgeyBib2R5KHBfY2IsIHBfZGF0YSk7IH07Ci19OwotZXh0ZXJuIHN0cnVjdCBzbXBfYnJfcGFpcmluZ19jb21wbGV0ZSBzbXBfYnJfcGFpcmluZ19jb21wbGV0ZTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0YWNrX3NtcF9hY3QKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfc21wX2FwaS5jYyBiL3Rlc3QvbW9jay9tb2NrX3N0YWNrX3NtcF9hcGkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjhkMTguLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfc21wX2FwaS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMQotICovCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImJ0X3RhcmdldC5oIgotI2luY2x1ZGUgIm1haW4vc2hpbS9zaGltLmgiCi0jaW5jbHVkZSAic3RhY2svYnRtL2J0bV9kZXYuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL2wyY2RlZnMuaCIKLSNpbmNsdWRlICJzdGFjay9pbmNsdWRlL3NtcF9hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9zbXAvc21wX2ludC5oIgotI2luY2x1ZGUgInN0YWNrX2NvbmZpZy5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi0jaWZuZGVmIFVOVVNFRF9BVFRSCi0jZGVmaW5lIFVOVVNFRF9BVFRSCi0jZW5kaWYKLQotYm9vbCBTTVBfUGFpckNhbmNlbChjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFNNUF9SZWdpc3Rlcih0U01QX0NBTExCQUNLKiBwX2NiYWNrKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci10U01QX1NUQVRVUyBTTVBfQlJfUGFpcldpdGgoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIFNNUF9TVUNDRVNTOwotfQotdFNNUF9TVEFUVVMgU01QX1BhaXIoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkcikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIFNNUF9TVUNDRVNTOwotfQotdWludDhfdCBTTVBfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIFNNUF9Db25maXJtUmVwbHkoY29uc3QgUmF3QWRkcmVzcyYgYmRfYWRkciwgdWludDhfdCByZXMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIFNNUF9Jbml0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgU01QX09vYkRhdGFSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB0U01QX1NUQVRVUyByZXMsIHVpbnQ4X3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgU01QX1Bhc3NrZXlSZXBseShjb25zdCBSYXdBZGRyZXNzJiBiZF9hZGRyLCB1aW50OF90IHJlcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNza2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBTTVBfU2VjdXJlQ29ubmVjdGlvbk9vYkRhdGFSZXBseSh1aW50OF90KiBwX2RhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIFNNUF9TZWN1cml0eUdyYW50KGNvbnN0IFJhd0FkZHJlc3MmIGJkX2FkZHIsIHRTTVBfU1RBVFVTIHJlcykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotdm9pZCBTTVBfQ3JMb2NTY09vYkRhdGEoKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci0KLXZvaWQgU01QX0NsZWFyTG9jU2NPb2JEYXRhKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfc3RhY2tfc3J2Y19kaXMuY2MgYi90ZXN0L21vY2svbW9ja19zdGFja19zcnZjX2Rpcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NTgwMi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja19zdGFja19zcnZjX2Rpcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMAotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvc3J2Y19hcGkuaCIKLSNpbmNsdWRlICJzdGFjay9zcnZjL3NydmNfZW5nX2ludC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIERJU19SZWFkRElTSW5mbyhjb25zdCBSYXdBZGRyZXNzJiBwZWVyX2JkYSwgdERJU19SRUFEX0NCQUNLKiBwX2NiYWNrLAotICAgICAgICAgICAgICAgICAgICAgdERJU19BVFRSX01BU0sgbWFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBkaXNfZ2F0dF9jX3JlYWRfZGlzX3JlcSh1aW50MTZfdCBjb25uX2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGRpc192YWxpZF9oYW5kbGVfcmFuZ2UodWludDE2X3QgaGFuZGxlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci10RElTX1NUQVRVUyBESVNfU3JJbml0KHRESVNfQVRUUl9NQVNLIGRpc19hdHRyX21hc2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdERJU19TVEFUVVMgRElTX1NyVXBkYXRlKHRESVNfQVRUUl9CSVQgZGlzX2F0dHJfYml0LCB0RElTX0FUVFIqIHBfaW5mbykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IGRpc19yZWFkX2F0dHJfdmFsdWUoVU5VU0VEX0FUVFIgdWludDhfdCBjbGNiX2lkeCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHQVRUX1ZBTFVFKiBwX3ZhbHVlLCBib29sIGlzX2xvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEdBVFRfU1RBVFVTKiBwX3N0YXR1cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci11aW50OF90IGRpc193cml0ZV9hdHRyX3ZhbHVlKFVOVVNFRF9BVFRSIHRHQVRUX1dSSVRFX1JFUSogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0R0FUVF9TVEFUVVMqIHBfc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgZGlzX2NfY21wbF9jYmFjayh0U1JWQ19DTENCKiBwX2NsY2IsIHRHQVRUQ19PUFRZUEUgb3AsIHRHQVRUX1NUQVRVUyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgdEdBVFRfQ0xfQ09NUExFVEUqIHBfZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvbW9jay9tb2NrX3N5c3RlbV9saWJmbXFfZXZlbnRmbGFnLmNjIGIvdGVzdC9tb2NrL21vY2tfc3lzdGVtX2xpYmZtcV9ldmVudGZsYWcuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWQ3NTkuLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfc3lzdGVtX2xpYmZtcV9ldmVudGZsYWcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogR2VuZXJhdGVkIG1vY2sgZmlsZSBmcm9tIG9yaWdpbmFsIHNvdXJjZSBmaWxlCi0gKiAgIEZ1bmN0aW9ucyBnZW5lcmF0ZWQ6MTEKLSAqLwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotZXh0ZXJuIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwOwotCi0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBkZXRhaWxzIHsKLQotdm9pZCBsb2dFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KLXZvaWQgY2hlY2soYm9vbCBleHAsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXRhaWxzCi19ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNpZiAwCi0jaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KLSNpbmNsdWRlIDxuZXc+Ci0jZW5kaWYKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLUV2ZW50RmxhZzo6RXZlbnRGbGFnKHN0ZDo6YXRvbWljPHVpbnQzMl90PiogZndBZGRyLCBzdGF0dXNfdCogc3RhdHVzKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotRXZlbnRGbGFnOjp+RXZlbnRGbGFnKCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotc3RhdHVzX3QgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcoc3RkOjphdG9taWM8dWludDMyX3Q+KiBmd0FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWcqKiBmbGFnKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXN0YXR1c190IEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKEV2ZW50RmxhZyoqIGV2RmxhZykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGF0dXNfdCBFdmVudEZsYWc6OnVubWFwRXZlbnRGbGFnV29yZChzdGQ6OmF0b21pYzx1aW50MzJfdD4qIGVmV29yZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGVmV29yZE5lZWRzVW5tYXBwaW5nKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXN0YXR1c190IEV2ZW50RmxhZzo6d2FpdCh1aW50MzJfdCBiaXRtYXNrLCB1aW50MzJfdCogZWZTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vU2Vjb25kcywgYm9vbCByZXRyeSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGF0dXNfdCBFdmVudEZsYWc6OndhaXRIZWxwZXIodWludDMyX3QgYml0bWFzaywgdWludDMyX3QqIGVmU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub1NlY29uZHMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RhdHVzX3QgRXZlbnRGbGFnOjp3YWtlKHVpbnQzMl90IGJpdG1hc2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBFdmVudEZsYWc6OmFkZE5hbm9zZWNvbmRzVG9DdXJyZW50VGltZShpbnQ2NF90IG5hbm9TZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMqIHdhaXRUaW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9tb2NrL21vY2tfdWRydl91bGludXhfdWlwYy5jYyBiL3Rlc3QvbW9jay9tb2NrX3VkcnZfdWxpbnV4X3VpcGMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWZhNTguLjAwMDAwMDAKLS0tIGEvdGVzdC9tb2NrL21vY2tfdWRydl91bGludXhfdWlwYy5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqICAgRnVuY3Rpb25zIGdlbmVyYXRlZDoxMgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLWV4dGVybiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcDsKLQotI2luY2x1ZGUgInVkcnYvaW5jbHVkZS91aXBjLmgiCi0KLSNpZm5kZWYgVU5VU0VEX0FUVFIKLSNkZWZpbmUgVU5VU0VEX0FUVFIKLSNlbmRpZgotCi1ib29sIFVJUENfT3Blbih0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQsIHRVSVBDX1JDVl9DQkFDSyogcF9jYmFjaywKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNvY2tldF9wYXRoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIFVJUENfU2VuZCh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQsCi0gICAgICAgICAgICAgICBVTlVTRURfQVRUUiB1aW50MTZfdCBtc2dfZXZ0LCBjb25zdCB1aW50OF90KiBwX2J1ZiwKLSAgICAgICAgICAgICAgIHVpbnQxNl90IG1zZ2xlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotaW50IHVpcGNfc3RhcnRfbWFpbl9zZXJ2ZXJfdGhyZWFkKHRVSVBDX1NUQVRFJiB1aXBjKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXN0ZDo6dW5pcXVlX3B0cjx0VUlQQ19TVEFURT4gVUlQQ19Jbml0KCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1jb25zdCBjaGFyKiBkdW1wX3VpcGNfZXZlbnQodFVJUENfRVZFTlQgZXZlbnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdWludDMyX3QgVUlQQ19SZWFkKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCwgdWludDhfdCogcF9idWYsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWJvb2wgVUlQQ19Jb2N0bCh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQsIHVpbnQzMl90IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgVUlQQ19DbG9zZSh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIHVpcGNfY2xvc2VfbG9ja2VkKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgdWlwY19tYWluX2NsZWFudXAodFVJUENfU1RBVEUmIHVpcGMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIHVpcGNfc3RvcF9tYWluX3NlcnZlcl90aHJlYWQodFVJUENfU1RBVEUmIHVpcGMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja191dGlsc19idC5jYyBiL3Rlc3QvbW9jay9tb2NrX3V0aWxzX2J0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNiZDM1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvbW9jay9tb2NrX3V0aWxzX2J0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE1vY2sgaW5jbHVkZSBmaWxlIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiB0ZXN0cyBhbmQgbW9jawotI2luY2x1ZGUgInRlc3QvbW9jay9tb2NrX3V0aWxzX2J0LmgiCi0KLS8vIE1vY2tlZCBpbnRlcm5hbCBzdHJ1Y3R1cmVzLCBpZiBhbnkKLQotbmFtZXNwYWNlIHRlc3QgewotbmFtZXNwYWNlIG1vY2sgewotbmFtZXNwYWNlIHV0aWxzX2J0IHsKLQotLy8gRnVuY3Rpb24gc3RhdGUgY2FwdHVyZSBhbmQgcmV0dXJuIHZhbHVlcywgaWYgbmVlZGVkCi1zdHJ1Y3QgcmFpc2VfcHJpb3JpdHlfYTJkcCByYWlzZV9wcmlvcml0eV9hMmRwOwotCi19ICAvLyBuYW1lc3BhY2UgdXRpbHNfYnQKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBNb2NrZWQgZnVuY3Rpb25zLCBpZiBhbnkKLXZvaWQgcmFpc2VfcHJpb3JpdHlfYTJkcCh0SElHSF9QUklPUklUWV9UQVNLIGhpZ2hfdGFzaykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgdGVzdDo6bW9jazo6dXRpbHNfYnQ6OnJhaXNlX3ByaW9yaXR5X2EyZHAoaGlnaF90YXNrKTsKLX0KLS8vIE1vY2tlZCBmdW5jdGlvbnMgY29tcGxldGUKLS8vIEVORCBtb2NrY2lmeSBnZW5lcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0L21vY2svbW9ja191dGlsc19idC5oIGIvdGVzdC9tb2NrL21vY2tfdXRpbHNfYnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhN2MzMi4uMDAwMDAwMAotLS0gYS90ZXN0L21vY2svbW9ja191dGlsc19idC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIEdlbmVyYXRlZCBtb2NrIGZpbGUgZnJvbSBvcmlnaW5hbCBzb3VyY2UgZmlsZQotICogICBGdW5jdGlvbnMgZ2VuZXJhdGVkOjEKLSAqCi0gKiAgbW9ja2NpZnkucGwgdmVyIDAuMy4wCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLS8vIE9yaWdpbmFsIGluY2x1ZGVkIGZpbGVzLCBpZiBhbnkKLS8vIE5PVEU6IFNpbmNlIHRoaXMgaXMgYSBtb2NrIGZpbGUgd2l0aCBtb2NrIGRlZmluaXRpb25zIHNvbWUgbnVtYmVyIG9mCi0vLyAgICAgICBpbmNsdWRlIGZpbGVzIG1heSBub3QgYmUgcmVxdWlyZWQuICBUaGUgaW5jbHVkZS13aGF0LXlvdS11c2UKLS8vICAgICAgIHN0aWxsIGFwcGxpZXMsIGJ1dCBjcmFmdGluZyBwcm9wZXIgaW5jbHVzaW9uIGlzIG91dCBvZiBzY29wZQotLy8gICAgICAgZm9yIHRoaXMgZWZmb3J0LiAgVGhpcyBjb21waWxhdGlvbiB1bml0IG1heSBjb21waWxlIGFzLWlzLCBvcgotLy8gICAgICAgbWF5IG5lZWQgYXR0ZW50aW9uIHRvIHBydW5lIGZyb20gKG9yIGFkZCB0byApIHRoZSBpbmNsdXNpb24gc2V0LgotCi0jaW5jbHVkZSAidXRpbHMvaW5jbHVkZS9idF91dGlscy5oIgotCi0vLyBNb2NrZWQgY29tcGlsZSBjb25kaXRpb25hbHMsIGlmIGFueQotCi1uYW1lc3BhY2UgdGVzdCB7Ci1uYW1lc3BhY2UgbW9jayB7Ci1uYW1lc3BhY2UgdXRpbHNfYnQgewotCi0vLyBTaGFyZWQgc3RhdGUgYmV0d2VlbiBtb2NrZWQgZnVuY3Rpb25zIGFuZCB0ZXN0cwotLy8gTmFtZTogcmFpc2VfcHJpb3JpdHlfYTJkcAotLy8gUGFyYW1zOiB0SElHSF9QUklPUklUWV9UQVNLIGhpZ2hfdGFzawotLy8gUmV0dXJuOiB2b2lkCi1zdHJ1Y3QgcmFpc2VfcHJpb3JpdHlfYTJkcCB7Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZCh0SElHSF9QUklPUklUWV9UQVNLIGhpZ2hfdGFzayk+IGJvZHl7Ci0gICAgICBbXSh0SElHSF9QUklPUklUWV9UQVNLIGhpZ2hfdGFzaykge319OwotICB2b2lkIG9wZXJhdG9yKCkodEhJR0hfUFJJT1JJVFlfVEFTSyBoaWdoX3Rhc2spIHsgYm9keShoaWdoX3Rhc2spOyB9OwotfTsKLWV4dGVybiBzdHJ1Y3QgcmFpc2VfcHJpb3JpdHlfYTJkcCByYWlzZV9wcmlvcml0eV9hMmRwOwotCi19ICAvLyBuYW1lc3BhY2UgdXRpbHNfYnQKLX0gIC8vIG5hbWVzcGFjZSBtb2NrCi19ICAvLyBuYW1lc3BhY2UgdGVzdAotCi0vLyBFTkQgbW9ja2NpZnkgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9yb290Y2FuYWwvQW5kcm9pZC5icCBiL3Rlc3Qvcm9vdGNhbmFsL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTFjYWIuLjAwMDAwMDAKLS0tIGEvdGVzdC9yb290Y2FuYWwvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLXNlcnZpY2Uuc2ltIiwKLSAgICBkZWZhdWx0czogWyJnZF9kZWZhdWx0cyJdLAotICAgIHByb3ByaWV0YXJ5OiB0cnVlLAotICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGhfaGNpLmNjIiwKLSAgICAgICAgInNlcnZpY2UuY2MiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWyJsaWJibHVldG9vdGhfaGVhZGVycyJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliY2hyb21lIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJqc29uY3BwIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdleHRyYSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1ESEFTX05PX0JEUk9JRF9CVUlMRENGRyIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAiUm9vdENhbmFsR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICAgICAgIkJsdWV0b290aEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgICAgICJsaWJidF9pbml0X2ZsYWdzX2JyaWRnZV9oZWFkZXIiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLWFzeW5jIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoLWhjaSIsCi0gICAgICAgICJsaWJidC1yb290Y2FuYWwiLAotICAgICAgICAibGliYnQtcm9vdGNhbmFsLXR5cGVzIiwKLSAgICAgICAgImxpYnNjcmlwdGVkYmVhY29ucGF5bG9hZC1wcm90b3MtbGl0ZSIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2hjaS9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9pbnRlcm5hbF9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICBdLAotICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLXNlcnZpY2Uuc2ltLnJjIl0sCi0gICAgcmVxdWlyZWQ6IFsiYnRfY29udHJvbGxlcl9wcm9wZXJ0aWVzIl0sCi19Ci0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLWltcGwtc2ltIiwKLSAgICBkZWZhdWx0czogWyJnZF9kZWZhdWx0cyJdLAotICAgIHByb3ByaWV0YXJ5OiB0cnVlLAotICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGhfaGNpLmNjIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoX2hlYWRlcnMiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmNocm9tZSIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlianNvbmNwcCIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLURIQVNfTk9fQkRST0lEX0JVSUxEQ0ZHIiwKLSAgICBdLAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJSb290Q2FuYWxHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgICAgICAiQmx1ZXRvb3RoR2VuZXJhdGVkUGFja2V0c19oIiwKLSAgICAgICAgImxpYmJ0X2luaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGgtYXN5bmMiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGgtaGNpIiwKLSAgICAgICAgImxpYmJ0LXJvb3RjYW5hbCIsCi0gICAgICAgICJsaWJidC1yb290Y2FuYWwtdHlwZXMiLAotICAgICAgICAibGlic2NyaXB0ZWRiZWFjb25wYXlsb2FkLXByb3Rvcy1saXRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvaGNpL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS90ZXN0L3Jvb3RjYW5hbC9hbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEtc2VydmljZS5zaW0ucmMgYi90ZXN0L3Jvb3RjYW5hbC9hbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEtc2VydmljZS5zaW0ucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjY4NDEuLjAwMDAwMDAKLS0tIGEvdGVzdC9yb290Y2FuYWwvYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLXNlcnZpY2Uuc2ltLnJjCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zZXJ2aWNlIHZlbmRvci5ibHVldG9vdGgtMS0xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMS1zZXJ2aWNlLnNpbQotICAgIGNsYXNzIGhhbAotICAgIHVzZXIgYmx1ZXRvb3RoCi0gICAgZ3JvdXAgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS90ZXN0L3Jvb3RjYW5hbC9ibHVldG9vdGhfaGNpLmNjIGIvdGVzdC9yb290Y2FuYWwvYmx1ZXRvb3RoX2hjaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzE2Yy4uMDAwMDAwMAotLS0gYS90ZXN0L3Jvb3RjYW5hbC9ibHVldG9vdGhfaGNpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLnNpbSIKLQotI2luY2x1ZGUgImJsdWV0b290aF9oY2kuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJoY2lfaW50ZXJuYWxzLmgiCi0jaW5jbHVkZSAibG9nL2xvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgVjFfMSB7Ci1uYW1lc3BhY2Ugc2ltIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgdGVzdF92ZW5kb3JfbGliOjpBc3luY1Rhc2tJZDsKLXVzaW5nIHRlc3RfdmVuZG9yX2xpYjo6RHVhbE1vZGVDb250cm9sbGVyOwotdXNpbmcgdGVzdF92ZW5kb3JfbGliOjpUYXNrQ2FsbGJhY2s7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgQnRUZXN0Q29uc29sZUVuYWJsZWQoKSB7Ci0gIC8vIEFzc3VtZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbCgidmVuZG9yLmJ0LnJvb3RjYW5hbF90ZXN0X2NvbnNvbGUiLCB0cnVlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIEJsdWV0b290aERlYXRoUmVjaXBpZW50IDogcHVibGljIGhpZGxfZGVhdGhfcmVjaXBpZW50IHsKLSBwdWJsaWM6Ci0gIEJsdWV0b290aERlYXRoUmVjaXBpZW50KGNvbnN0IHNwPElCbHVldG9vdGhIY2k+IGhjaSkgOiBtSGNpKGhjaSkge30KLQotICB2b2lkIHNlcnZpY2VEaWVkKAotICAgICAgdWludDY0X3QgLyogY29va2llICovLAotICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLykgb3ZlcnJpZGUgewotICAgIExPR19FUlJPUigiQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQ6OnNlcnZpY2VEaWVkIC0gQmx1ZXRvb3RoIHNlcnZpY2UgZGllZCIpOwotICAgIGhhc19kaWVkXyA9IHRydWU7Ci0gICAgbUhjaS0+Y2xvc2UoKTsKLSAgfQotICBzcDxJQmx1ZXRvb3RoSGNpPiBtSGNpOwotICBib29sIGdldEhhc0RpZWQoKSBjb25zdCB7IHJldHVybiBoYXNfZGllZF87IH0KLSAgdm9pZCBzZXRIYXNEaWVkKGJvb2wgaGFzX2RpZWQpIHsgaGFzX2RpZWRfID0gaGFzX2RpZWQ7IH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgaGFzX2RpZWRfOwotfTsKLQotQmx1ZXRvb3RoSGNpOjpCbHVldG9vdGhIY2koKQotICAgIDogZGVhdGhfcmVjaXBpZW50XyhuZXcgQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQodGhpcykpIHt9Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OmluaXRpYWxpemUoCi0gICAgY29uc3Qgc3A8VjFfMDo6SUJsdWV0b290aEhjaUNhbGxiYWNrcz4mIGNiKSB7Ci0gIHJldHVybiBpbml0aWFsaXplX2ltcGwoY2IsIG51bGxwdHIpOwotfQotCi1SZXR1cm48dm9pZD4gQmx1ZXRvb3RoSGNpOjppbml0aWFsaXplXzFfMSgKLSAgICBjb25zdCBzcDxWMV8xOjpJQmx1ZXRvb3RoSGNpQ2FsbGJhY2tzPiYgY2IpIHsKLSAgcmV0dXJuIGluaXRpYWxpemVfaW1wbChjYiwgY2IpOwotfQotCi1SZXR1cm48dm9pZD4gQmx1ZXRvb3RoSGNpOjppbml0aWFsaXplX2ltcGwoCi0gICAgY29uc3Qgc3A8VjFfMDo6SUJsdWV0b290aEhjaUNhbGxiYWNrcz4mIGNiLAotICAgIGNvbnN0IHNwPFYxXzE6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYl8xXzEpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICBpZiAoY2IgPT0gbnVsbHB0cikgewotICAgIExPR19FUlJPUigiY2IgPT0gbnVsbHB0ciEgLT4gVW5hYmxlIHRvIGNhbGwgaW5pdGlhbGl6YXRpb25Db21wbGV0ZShFUlIpIik7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLSAgfQotCi0gIGRlYXRoX3JlY2lwaWVudF8tPnNldEhhc0RpZWQoZmFsc2UpOwotICBhdXRvIGxpbmtfcmV0ID0gY2ItPmxpbmtUb0RlYXRoKGRlYXRoX3JlY2lwaWVudF8sIDApOwotICBBU1NFUlRfTE9HKGxpbmtfcmV0LmlzT2soKSwgIkVycm9yIGNhbGxpbmcgbGlua1RvRGVhdGguIik7Ci0KLSAgdGVzdF9jaGFubmVsX3RyYW5zcG9ydF8uUmVnaXN0ZXJDb21tYW5kSGFuZGxlcigKLSAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gICAgICAgIGFzeW5jX21hbmFnZXJfLkV4ZWNBc3luYygKLSAgICAgICAgICAgIHVzZXJfaWRfLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgW3RoaXMsIG5hbWUsIGFyZ3NdKCkgeyB0ZXN0X2NoYW5uZWxfLkhhbmRsZUNvbW1hbmQobmFtZSwgYXJncyk7IH0pOwotICAgICAgfSk7Ci0KLSAgY29udHJvbGxlcl8gPSBzdGQ6Om1ha2Vfc2hhcmVkPER1YWxNb2RlQ29udHJvbGxlcj4oKTsKLQotICBjaGFyIG1hY19wcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gIiI7Ci0gIHByb3BlcnR5X2dldCgidmVuZG9yLmJ0LnJvb3RjYW5hbF9tYWNfYWRkcmVzcyIsIG1hY19wcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICIzQzo1QTpCNDowMTowMjowMyIpOwotICBjb250cm9sbGVyXy0+SW5pdGlhbGl6ZSh7ImRtYyIsIHN0ZDo6c3RyaW5nKG1hY19wcm9wZXJ0eSl9KTsKLQotICBjb250cm9sbGVyXy0+UmVnaXN0ZXJFdmVudENoYW5uZWwoCi0gICAgICBbdGhpcywgY2JdKHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0KSB7Ci0gICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhjaV9ldmVudChwYWNrZXQtPmJlZ2luKCksIHBhY2tldC0+ZW5kKCkpOwotICAgICAgICBhdXRvIHJldCA9IGNiLT5oY2lFdmVudFJlY2VpdmVkKGhjaV9ldmVudCk7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgIExPR19FUlJPUigiRXJyb3Igc2VuZGluZyBldmVudCBjYWxsYmFjayIpOwotICAgICAgICAgIGlmICghZGVhdGhfcmVjaXBpZW50Xy0+Z2V0SGFzRGllZCgpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIkNsb3NpbmciKTsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLQotICBjb250cm9sbGVyXy0+UmVnaXN0ZXJBY2xDaGFubmVsKAotICAgICAgW3RoaXMsIGNiXShzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBhY2xfcGFja2V0KHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0gICAgICAgIGF1dG8gcmV0ID0gY2ItPmFjbERhdGFSZWNlaXZlZChhY2xfcGFja2V0KTsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgTE9HX0VSUk9SKCJFcnJvciBzZW5kaW5nIGFjbCBjYWxsYmFjayIpOwotICAgICAgICAgIGlmICghZGVhdGhfcmVjaXBpZW50Xy0+Z2V0SGFzRGllZCgpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIkNsb3NpbmciKTsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLQotICBjb250cm9sbGVyXy0+UmVnaXN0ZXJTY29DaGFubmVsKAotICAgICAgW3RoaXMsIGNiXShzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBzY29fcGFja2V0KHBhY2tldC0+YmVnaW4oKSwgcGFja2V0LT5lbmQoKSk7Ci0gICAgICAgIGF1dG8gcmV0ID0gY2ItPnNjb0RhdGFSZWNlaXZlZChzY29fcGFja2V0KTsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgTE9HX0VSUk9SKCJFcnJvciBzZW5kaW5nIHNjbyBjYWxsYmFjayIpOwotICAgICAgICAgIGlmICghZGVhdGhfcmVjaXBpZW50Xy0+Z2V0SGFzRGllZCgpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIkNsb3NpbmciKTsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLQotICBpZiAoY2JfMV8xICE9IG51bGxwdHIpIHsKLSAgICBjb250cm9sbGVyXy0+UmVnaXN0ZXJJc29DaGFubmVsKAotICAgICAgICBbdGhpcywgY2JfMV8xXShzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICAgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGlzb19wYWNrZXQocGFja2V0LT5iZWdpbigpLCBwYWNrZXQtPmVuZCgpKTsKLSAgICAgICAgICBhdXRvIHJldCA9IGNiXzFfMS0+aXNvRGF0YVJlY2VpdmVkKGlzb19wYWNrZXQpOwotICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJFcnJvciBzZW5kaW5nIGlzbyBjYWxsYmFjayIpOwotICAgICAgICAgICAgaWYgKCFkZWF0aF9yZWNpcGllbnRfLT5nZXRIYXNEaWVkKCkpIHsKLSAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDbG9zaW5nIik7Ci0gICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgfQotCi0gIGNvbnRyb2xsZXJfLT5SZWdpc3RlclRhc2tTY2hlZHVsZXIoCi0gICAgICBbdGhpc10oc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBkZWxheSwgY29uc3QgVGFza0NhbGxiYWNrJiB0YXNrKSB7Ci0gICAgICAgIHJldHVybiBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcl9pZF8sIGRlbGF5LCB0YXNrKTsKLSAgICAgIH0pOwotCi0gIGNvbnRyb2xsZXJfLT5SZWdpc3RlclBlcmlvZGljVGFza1NjaGVkdWxlcigKLSAgICAgIFt0aGlzXShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHBlcmlvZCwKLSAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smIHRhc2spIHsKLSAgICAgICAgcmV0dXJuIGFzeW5jX21hbmFnZXJfLkV4ZWNBc3luY1BlcmlvZGljYWxseSh1c2VyX2lkXywgZGVsYXksIHBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrKTsKLSAgICAgIH0pOwotCi0gIGNvbnRyb2xsZXJfLT5SZWdpc3RlclRhc2tDYW5jZWwoCi0gICAgICBbdGhpc10oQXN5bmNUYXNrSWQgdGFzaykgeyBhc3luY19tYW5hZ2VyXy5DYW5jZWxBc3luY1Rhc2sodGFzayk7IH0pOwotCi0gIC8vIEFkZCB0aGUgY29udHJvbGxlciBhcyBhIGRldmljZSBpbiB0aGUgbW9kZWwuCi0gIHNpemVfdCBjb250cm9sbGVyX2luZGV4ID0gdGVzdF9tb2RlbF8uQWRkKGNvbnRyb2xsZXJfKTsKLSAgc2l6ZV90IGxvd19lbmVyZ3lfcGh5X2luZGV4ID0KLSAgICAgIHRlc3RfbW9kZWxfLkFkZFBoeSh0ZXN0X3ZlbmRvcl9saWI6OlBoeTo6VHlwZTo6TE9XX0VORVJHWSk7Ci0gIHNpemVfdCBjbGFzc2ljX3BoeV9pbmRleCA9Ci0gICAgICB0ZXN0X21vZGVsXy5BZGRQaHkodGVzdF92ZW5kb3JfbGliOjpQaHk6OlR5cGU6OkJSX0VEUik7Ci0gIHRlc3RfbW9kZWxfLkFkZERldmljZVRvUGh5KGNvbnRyb2xsZXJfaW5kZXgsIGxvd19lbmVyZ3lfcGh5X2luZGV4KTsKLSAgdGVzdF9tb2RlbF8uQWRkRGV2aWNlVG9QaHkoY29udHJvbGxlcl9pbmRleCwgY2xhc3NpY19waHlfaW5kZXgpOwotICB0ZXN0X21vZGVsXy5TZXRUaW1lclBlcmlvZChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSk7Ci0gIHRlc3RfbW9kZWxfLlN0YXJ0VGltZXIoKTsKLQotICAvLyBTZW5kIHJlc3BvbnNlcyB0byBsb2djYXQgaWYgdGhlIHRlc3QgY2hhbm5lbCBpcyBub3QgY29uZmlndXJlZC4KLSAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZShbXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICBMT0dfSU5GTygiTm8gdGVzdCBjaGFubmVsIHlldDogJXMiLCByZXNwb25zZS5jX3N0cigpKTsKLSAgfSk7Ci0KLSAgaWYgKEJ0VGVzdENvbnNvbGVFbmFibGVkKCkpIHsKLSAgICB0ZXN0X3NvY2tldF9zZXJ2ZXJfID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxuZXQ6OlBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXI+KDYxMTEsICZhc3luY19tYW5hZ2VyXyk7Ci0gICAgaGNpX3NvY2tldF9zZXJ2ZXJfID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxuZXQ6OlBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXI+KDYyMTEsICZhc3luY19tYW5hZ2VyXyk7Ci0gICAgbGlua19zb2NrZXRfc2VydmVyXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8bmV0OjpQb3NpeEFzeW5jU29ja2V0U2VydmVyPig2MzExLCAmYXN5bmNfbWFuYWdlcl8pOwotICAgIGNvbm5lY3Rvcl8gPQotICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPG5ldDo6UG9zaXhBc3luY1NvY2tldENvbm5lY3Rvcj4oJmFzeW5jX21hbmFnZXJfKTsKLSAgICBTZXRVcFRlc3RDaGFubmVsKCk7Ci0gICAgU2V0VXBIY2lTZXJ2ZXIoW3RoaXNdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIqIHNydikgewotICAgICAgdGVzdF9tb2RlbF8uSW5jb21pbmdIY2lDb25uZWN0aW9uKHNvY2tldCk7Ci0gICAgICBzcnYtPlN0YXJ0TGlzdGVuaW5nKCk7Ci0gICAgfSk7Ci0gICAgU2V0VXBMaW5rTGF5ZXJTZXJ2ZXIoW3RoaXNdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIqIHNydikgewotICAgICAgdGVzdF9tb2RlbF8uSW5jb21pbmdMaW5rTGF5ZXJDb25uZWN0aW9uKHNvY2tldCk7Ci0gICAgICBzcnYtPlN0YXJ0TGlzdGVuaW5nKCk7Ci0gICAgfSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlIGluIHRoZSBmdXR1cmUuCi0gICAgTE9HX0lORk8oIkFkZGluZyBCZWFjb25zIHNvIHRoZSBzY2FuIGxpc3QgaXMgbm90IGVtcHR5LiIpOwotICAgIHRlc3RfY2hhbm5lbF8uQWRkKHsiYmVhY29uIiwgImJlOmFjOjEwOjAwOjAwOjAxIiwgIjEwMDAifSk7Ci0gICAgdGVzdF9tb2RlbF8uQWRkRGV2aWNlVG9QaHkoY29udHJvbGxlcl9pbmRleCArIDEsIGxvd19lbmVyZ3lfcGh5X2luZGV4KTsKLSAgICB0ZXN0X2NoYW5uZWxfLkFkZCh7ImJlYWNvbiIsICJiZTphYzoxMDowMDowMDowMiIsICIxMDAwIn0pOwotICAgIHRlc3RfbW9kZWxfLkFkZERldmljZVRvUGh5KGNvbnRyb2xsZXJfaW5kZXggKyAyLCBsb3dfZW5lcmd5X3BoeV9pbmRleCk7Ci0gICAgdGVzdF9jaGFubmVsXy5BZGQoCi0gICAgICAgIHsic2NyaXB0ZWRfYmVhY29uIiwgIjViOmVhOmMxOjAwOjAwOjAzIiwKLSAgICAgICAgICIvZGF0YS92ZW5kb3IvYmx1ZXRvb3RoL2JsdWV0b290aF9zaW1fYmxlX3BsYXliYWNrX2ZpbGUiLAotICAgICAgICAgIi9kYXRhL3ZlbmRvci9ibHVldG9vdGgvYmx1ZXRvb3RoX3NpbV9ibGVfcGxheWJhY2tfZXZlbnRzIn0pOwotICAgIHRlc3RfbW9kZWxfLkFkZERldmljZVRvUGh5KGNvbnRyb2xsZXJfaW5kZXggKyAzLCBsb3dfZW5lcmd5X3BoeV9pbmRleCk7Ci0gICAgdGVzdF9jaGFubmVsXy5MaXN0KHt9KTsKLSAgfQotCi0gIHVubGlua19jYl8gPSBbdGhpcywgY2JdKHNwPEJsdWV0b290aERlYXRoUmVjaXBpZW50PiYgZGVhdGhfcmVjaXBpZW50KSB7Ci0gICAgaWYgKGRlYXRoX3JlY2lwaWVudC0+Z2V0SGFzRGllZCgpKQotICAgICAgTE9HX0lORk8oIlNraXBwaW5nIHVubGluayBjYWxsLCBzZXJ2aWNlIGRpZWQuIik7Ci0gICAgZWxzZSB7Ci0gICAgICBhdXRvIHJldCA9IGNiLT51bmxpbmtUb0RlYXRoKGRlYXRoX3JlY2lwaWVudCk7Ci0gICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQVNTRVJUX0xPRyhkZWF0aF9yZWNpcGllbnRfLT5nZXRIYXNEaWVkKCksCi0gICAgICAgICAgICAgICAgICAgIkVycm9yIGNhbGxpbmcgdW5saW5rLCBidXQgbm8gZGVhdGggbm90aWZpY2F0aW9uLiIpOwotICAgICAgfQotICAgIH0KLSAgfTsKLQotICBhdXRvIGluaXRfcmV0ID0gY2ItPmluaXRpYWxpemF0aW9uQ29tcGxldGUoVjFfMDo6U3RhdHVzOjpTVUNDRVNTKTsKLSAgaWYgKCFpbml0X3JldC5pc09rKCkpIHsKLSAgICBBU1NFUlRfTE9HKGRlYXRoX3JlY2lwaWVudF8tPmdldEhhc0RpZWQoKSwKLSAgICAgICAgICAgICAgICJFcnJvciBzZW5kaW5nIGluaXQgY2FsbGJhY2ssIGJ1dCBubyBkZWF0aCBub3RpZmljYXRpb24uIik7Ci0gIH0KLSAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IEJsdWV0b290aEhjaTo6Y2xvc2UoKSB7Ci0gIExPR19JTkZPKCIlcyIsIF9fZnVuY19fKTsKLSAgdGVzdF9tb2RlbF8uUmVzZXQoKTsKLSAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IEJsdWV0b290aEhjaTo6c2VuZEhjaUNvbW1hbmQoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgewotICBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcl9pZF8sIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcywgcGFja2V0XSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfY29weSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBzdGQ6OnZlY3Rvcjx1aW50OF90PihwYWNrZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcl8tPkhhbmRsZUNvbW1hbmQocGFja2V0X2NvcHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OnNlbmRBY2xEYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBwYWNrZXQpIHsKLSAgYXN5bmNfbWFuYWdlcl8uRXhlY0FzeW5jKHVzZXJfaWRfLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsIHBhY2tldF0oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgc3RkOjp2ZWN0b3I8dWludDhfdD4ocGFja2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfLT5IYW5kbGVBY2wocGFja2V0X2NvcHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OnNlbmRTY29EYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBwYWNrZXQpIHsKLSAgYXN5bmNfbWFuYWdlcl8uRXhlY0FzeW5jKHVzZXJfaWRfLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsIHBhY2tldF0oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgc3RkOjp2ZWN0b3I8dWludDhfdD4ocGFja2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfLT5IYW5kbGVTY28ocGFja2V0X2NvcHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OnNlbmRJc29EYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBwYWNrZXQpIHsKLSAgYXN5bmNfbWFuYWdlcl8uRXhlY0FzeW5jKHVzZXJfaWRfLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsIHBhY2tldF0oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgc3RkOjp2ZWN0b3I8dWludDhfdD4ocGFja2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJfLT5IYW5kbGVJc28ocGFja2V0X2NvcHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIHJldHVybiBWb2lkKCk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoSGNpOjpTZXRVcEhjaVNlcnZlcihDb25uZWN0Q2FsbGJhY2sgY29ubmVjdGlvbl9jYWxsYmFjaykgewotICB0ZXN0X2NoYW5uZWxfLlJlZ2lzdGVyU2VuZFJlc3BvbnNlKFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSkgewotICAgIExPR19JTkZPKCJObyBIQ0kgUmVzcG9uc2UgY2hhbm5lbDogJXMiLCByZXNwb25zZS5jX3N0cigpKTsKLSAgfSk7Ci0KLSAgaWYgKCFyZW1vdGVfaGNpX3RyYW5zcG9ydF8uU2V0VXAoaGNpX3NvY2tldF9zZXJ2ZXJfLCBjb25uZWN0aW9uX2NhbGxiYWNrKSkgewotICAgIExPR19FUlJPUigiUmVtb3RlIEhDSSBjaGFubmVsIFNldFVwIGZhaWxlZC4iKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBCbHVldG9vdGhIY2k6OlNldFVwTGlua0xheWVyU2VydmVyKENvbm5lY3RDYWxsYmFjayBjb25uZWN0aW9uX2NhbGxiYWNrKSB7Ci0gIHJlbW90ZV9saW5rX2xheWVyX3RyYW5zcG9ydF8uU2V0VXAobGlua19zb2NrZXRfc2VydmVyXywgY29ubmVjdGlvbl9jYWxsYmFjayk7Ci0KLSAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZShbXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICBMT0dfSU5GTygiTm8gTGlua0xheWVyIFJlc3BvbnNlIGNoYW5uZWw6ICVzIiwgcmVzcG9uc2UuY19zdHIoKSk7Ci0gIH0pOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gQmx1ZXRvb3RoSGNpOjpDb25uZWN0VG9SZW1vdGVTZXJ2ZXIoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZlciwgaW50IHBvcnQpIHsKLSAgcmV0dXJuIGNvbm5lY3Rvcl8tPkNvbm5lY3RUb1JlbW90ZVNlcnZlcihzZXJ2ZXIsIHBvcnQpOwotfQotCi12b2lkIEJsdWV0b290aEhjaTo6U2V0VXBUZXN0Q2hhbm5lbCgpIHsKLSAgYm9vbCB0cmFuc3BvcnRfY29uZmlndXJlZCA9IHRlc3RfY2hhbm5lbF90cmFuc3BvcnRfLlNldFVwKAotICAgICAgdGVzdF9zb2NrZXRfc2VydmVyXywgW3RoaXNdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBjb25uX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIqKSB7Ci0gICAgICAgIExPR19JTkZPKCJUZXN0IGNoYW5uZWwgY29ubmVjdGlvbiBhY2NlcHRlZC4iKTsKLSAgICAgICAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZSgKLSAgICAgICAgICAgIFt0aGlzLCBjb25uX2ZkXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICAgICAgICAgICAgdGVzdF9jaGFubmVsX3RyYW5zcG9ydF8uU2VuZFJlc3BvbnNlKGNvbm5fZmQsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgIGNvbm5fZmQtPldhdGNoRm9yTm9uQmxvY2tpbmdSZWFkKFt0aGlzXShBc3luY0RhdGFDaGFubmVsKiBjb25uX2ZkKSB7Ci0gICAgICAgICAgdGVzdF9jaGFubmVsX3RyYW5zcG9ydF8uT25Db21tYW5kUmVhZHkoY29ubl9mZCwgW10oKSB7fSk7Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9KTsKLSAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZShbXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICBMT0dfSU5GTygiTm8gdGVzdCBjaGFubmVsOiAlcyIsIHJlc3BvbnNlLmNfc3RyKCkpOwotICB9KTsKLQotICBpZiAoIXRyYW5zcG9ydF9jb25maWd1cmVkKSB7Ci0gICAgTE9HX0VSUk9SKCJUZXN0IGNoYW5uZWwgU2V0VXAgZmFpbGVkLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19JTkZPKCJUZXN0IGNoYW5uZWwgU2V0VXAoKSBzdWNjZXNzZnVsIik7Ci19Ci0KLS8qIEZhbGxiYWNrIHRvIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZXJlIGlzIG5vIHNlcnZpY2UuICovCi1JQmx1ZXRvb3RoSGNpKiBISURMX0ZFVENIX0lCbHVldG9vdGhIY2koY29uc3QgY2hhciogLyogbmFtZSAqLykgewotICByZXR1cm4gbmV3IEJsdWV0b290aEhjaSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc2ltCi19ICAvLyBuYW1lc3BhY2UgVjFfMQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdC9yb290Y2FuYWwvYmx1ZXRvb3RoX2hjaS5oIGIvdGVzdC9yb290Y2FuYWwvYmx1ZXRvb3RoX2hjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjJhZWY4Li4wMDAwMDAwCi0tLSBhL3Rlc3Qvcm9vdGNhbmFsL2JsdWV0b290aF9oY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoLzEuMS9JQmx1ZXRvb3RoSGNpLmg+Ci0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLQotI2luY2x1ZGUgImhjaV9wYWNrZXRpemVyLmgiCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9kdWFsX21vZGVfY29udHJvbGxlci5oIgotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaCIKLSNpbmNsdWRlICJtb2RlbC9zZXR1cC90ZXN0X2NoYW5uZWxfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvdGVzdF9jb21tYW5kX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJtb2RlbC9zZXR1cC90ZXN0X21vZGVsLmgiCi0jaW5jbHVkZSAibmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9jb25uZWN0b3IuaCIKLSNpbmNsdWRlICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X3NlcnZlci5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgVjFfMSB7Ci1uYW1lc3BhY2Ugc2ltIHsKLQotY2xhc3MgQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQ7Ci0KLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbDsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbENvbm5lY3RvcjsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbFNlcnZlcjsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6Q29ubmVjdENhbGxiYWNrOwotCi1jbGFzcyBCbHVldG9vdGhIY2kgOiBwdWJsaWMgSUJsdWV0b290aEhjaSB7Ci0gcHVibGljOgotICBCbHVldG9vdGhIY2koKTsKLQotICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gaW5pdGlhbGl6ZSgKLSAgICAgIGNvbnN0IHNwPFYxXzA6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYikgb3ZlcnJpZGU7Ci0gIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBpbml0aWFsaXplXzFfMSgKLSAgICAgIGNvbnN0IHNwPFYxXzE6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYikgb3ZlcnJpZGU7Ci0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNlbmRIY2lDb21tYW5kKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNlbmRBY2xEYXRhKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNlbmRTY29EYXRhKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNlbmRJc29EYXRhKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGNsb3NlKCkgb3ZlcnJpZGU7Ci0KLSAgc3RhdGljIHZvaWQgT25QYWNrZXRSZWFkeSgpOwotCi0gIHN0YXRpYyBCbHVldG9vdGhIY2kqIGdldCgpOwotCi0gcHJpdmF0ZToKLSAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGluaXRpYWxpemVfaW1wbCgKLSAgICAgIGNvbnN0IHNwPFYxXzA6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYiwKLSAgICAgIGNvbnN0IHNwPFYxXzE6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYl8xXzEpOwotCi0gIHNwPEJsdWV0b290aERlYXRoUmVjaXBpZW50PiBkZWF0aF9yZWNpcGllbnRfOwotCi0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzcDxCbHVldG9vdGhEZWF0aFJlY2lwaWVudD4mKT4gdW5saW5rX2NiXzsKLQotICB2b2lkIEhhbmRsZUluY29taW5nUGFja2V0KCk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXI+IHRlc3Rfc29ja2V0X3NlcnZlcl87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsU2VydmVyPiBoY2lfc29ja2V0X3NlcnZlcl87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsU2VydmVyPiBsaW5rX3NvY2tldF9zZXJ2ZXJfOwotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbENvbm5lY3Rvcj4gY29ubmVjdG9yXzsKLSAgdGVzdF92ZW5kb3JfbGliOjpBc3luY01hbmFnZXIgYXN5bmNfbWFuYWdlcl87Ci0KLSAgdm9pZCBTZXRVcFRlc3RDaGFubmVsKCk7Ci0gIHZvaWQgU2V0VXBIY2lTZXJ2ZXIoQ29ubmVjdENhbGxiYWNrIG9uX2Nvbm5lY3QpOwotICB2b2lkIFNldFVwTGlua0xheWVyU2VydmVyKENvbm5lY3RDYWxsYmFjayBvbl9jb25uZWN0KTsKLSAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IENvbm5lY3RUb1JlbW90ZVNlcnZlcigKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2ZXIsIGludCBwb3J0KTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8dGVzdF92ZW5kb3JfbGliOjpEdWFsTW9kZUNvbnRyb2xsZXI+IGNvbnRyb2xsZXJfOwotCi0gIHRlc3RfdmVuZG9yX2xpYjo6VGVzdENoYW5uZWxUcmFuc3BvcnQgdGVzdF9jaGFubmVsX3RyYW5zcG9ydF87Ci0gIHRlc3RfdmVuZG9yX2xpYjo6VGVzdENoYW5uZWxUcmFuc3BvcnQgcmVtb3RlX2hjaV90cmFuc3BvcnRfOwotICB0ZXN0X3ZlbmRvcl9saWI6OlRlc3RDaGFubmVsVHJhbnNwb3J0IHJlbW90ZV9saW5rX2xheWVyX3RyYW5zcG9ydF87Ci0KLSAgdGVzdF92ZW5kb3JfbGliOjpBc3luY1VzZXJJZCB1c2VyX2lkXyA9IGFzeW5jX21hbmFnZXJfLkdldE5leHRVc2VySWQoKTsKLSAgdGVzdF92ZW5kb3JfbGliOjpUZXN0TW9kZWwgdGVzdF9tb2RlbF97Ci0gICAgICBbdGhpc10oKSB7IHJldHVybiBhc3luY19tYW5hZ2VyXy5HZXROZXh0VXNlcklkKCk7IH0sCi0gICAgICBbdGhpc10odGVzdF92ZW5kb3JfbGliOjpBc3luY1VzZXJJZCB1c2VyX2lkLAotICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZGVsYXksCi0gICAgICAgICAgICAgY29uc3QgdGVzdF92ZW5kb3JfbGliOjpUYXNrQ2FsbGJhY2smIHRhc2spIHsKLSAgICAgICAgcmV0dXJuIGFzeW5jX21hbmFnZXJfLkV4ZWNBc3luYyh1c2VyX2lkLCBkZWxheSwgdGFzayk7Ci0gICAgICB9LAotCi0gICAgICBbdGhpc10odGVzdF92ZW5kb3JfbGliOjpBc3luY1VzZXJJZCB1c2VyX2lkLAotICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZGVsYXksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgcGVyaW9kLAotICAgICAgICAgICAgIGNvbnN0IHRlc3RfdmVuZG9yX2xpYjo6VGFza0NhbGxiYWNrJiB0YXNrKSB7Ci0gICAgICAgIHJldHVybiBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmNQZXJpb2RpY2FsbHkodXNlcl9pZCwgZGVsYXksIHBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrKTsKLSAgICAgIH0sCi0KLSAgICAgIFt0aGlzXSh0ZXN0X3ZlbmRvcl9saWI6OkFzeW5jVXNlcklkIHVzZXIpIHsKLSAgICAgICAgYXN5bmNfbWFuYWdlcl8uQ2FuY2VsQXN5bmNUYXNrc0Zyb21Vc2VyKHVzZXIpOwotICAgICAgfSwKLQotICAgICAgW3RoaXNdKHRlc3RfdmVuZG9yX2xpYjo6QXN5bmNUYXNrSWQgdGFzaykgewotICAgICAgICBhc3luY19tYW5hZ2VyXy5DYW5jZWxBc3luY1Rhc2sodGFzayk7Ci0gICAgICB9LAotCi0gICAgICBbdGhpc10oY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZlciwgaW50IHBvcnQpIHsKLSAgICAgICAgcmV0dXJuIENvbm5lY3RUb1JlbW90ZVNlcnZlcihzZXJ2ZXIsIHBvcnQpOwotICAgICAgfX07Ci0gIHRlc3RfdmVuZG9yX2xpYjo6VGVzdENvbW1hbmRIYW5kbGVyIHRlc3RfY2hhbm5lbF97dGVzdF9tb2RlbF99OwotfTsKLQotZXh0ZXJuICJDIiBJQmx1ZXRvb3RoSGNpKiBISURMX0ZFVENIX0lCbHVldG9vdGhIY2koY29uc3QgY2hhciogbmFtZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBzaW0KLX0gIC8vIG5hbWVzcGFjZSBWMV8xCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90ZXN0L3Jvb3RjYW5hbC9zZXJ2aWNlLmNjIGIvdGVzdC9yb290Y2FuYWwvc2VydmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1NmRjZi4uMDAwMDAwMAotLS0gYS90ZXN0L3Jvb3RjYW5hbC9zZXJ2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEtc2VydmljZS5zaW0iCi0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoLzEuMS9JQmx1ZXRvb3RoSGNpLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KLQotI2luY2x1ZGUgImJsdWV0b290aF9oY2kuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpzcDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6VjFfMTo6SUJsdWV0b290aEhjaTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6VjFfMTo6c2ltOjpCbHVldG9vdGhIY2k7Ci0KLWludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgewotICBzcDxJQmx1ZXRvb3RoSGNpPiBibHVldG9vdGggPSBuZXcgQmx1ZXRvb3RoSGNpOwotICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIHRydWUpOwotICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBibHVldG9vdGgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7Ci0gIGlmIChzdGF0dXMgPT0gYW5kcm9pZDo6T0spCi0gICAgam9pblJwY1RocmVhZHBvb2woKTsKLSAgZWxzZQotICAgIExPR19FUlJPUigiQ291bGQgbm90IHJlZ2lzdGVyIGFzIGEgc2VydmljZSEiKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvcnVuX2JlbmNobWFya3Muc2ggYi90ZXN0L3J1bl9iZW5jaG1hcmtzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjRiMDEyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcnVuX2JlbmNobWFya3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotIyEvYmluL3NoCi0jIEEgdXRpbGl0eSBzY3JpcHQgdGhhdCBydW5zIGJlbmNobWFyayBvbiBBbmRyb2lkIGRldmljZQotIwotIyBOb3RlOiBPbmx5IG9uZSBBbmRyb2lkIGRldmljZSBjYW4gYmUgY29ubmVjdGVkIHdoZW4gcnVubmluZyB0aGlzIHNjcmlwdAotIwotIyBFeGFtcGxlIHVzYWdlOgotIyAgICQgY2Qgc3lzdGVtL2J0Ci0jICAgJCAuL3Rlc3QvcnVuX2JlbmNobWFya3Muc2ggYmx1ZXRvb3RoX2JlbmNobWFya19leGFtcGxlCi0KLWtub3duX2JlbmNobWFya3M9KAotICBibHVldG9vdGhfYmVuY2htYXJrX3RocmVhZF9wZXJmb3JtYW5jZQotICBibHVldG9vdGhfYmVuY2htYXJrX3RpbWVyX3BlcmZvcm1hbmNlCi0pCi0KLXVzYWdlKCkgewotICBiaW5hcnk9IiQoYmFzZW5hbWUgIiQwIikiCi0gIGVjaG8gIlVzYWdlOiAke2JpbmFyeX0gLS1oZWxwIgotICBlY2hvICIgICAgICAgJHtiaW5hcnl9IFstaSA8aXRlcmF0aW9ucz5dIFstcyA8c3BlY2lmaWMgZGV2aWNlPl0gWy0tYWxsXSBbPGJlbmNobWFyayBuYW1lPlsuPGZpbHRlcj5dIC4uLl0gWy0tPGFyZz4gLi4uXSIKLSAgZWNobwotICBlY2hvICJVbmtub3duIGxvbmcgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGJlbmNobWFyay4iCi0gIGVjaG8KLSAgZWNobyAiS25vd24gYmVuY2htYXJrIG5hbWVzOiIKLQotICBmb3IgbmFtZSBpbiAiJHtrbm93bl9iZW5jaG1hcmtzW0BdfSIKLSAgZG8KLSAgICBlY2hvICIgICAgJHtuYW1lfSIKLSAgZG9uZQotfQotCi1pdGVyYXRpb25zPTEKLWRldmljZT0KLWJlbmNobWFya3M9KCkKLWJlbmNobWFya19hcmdzPSgpCi13aGlsZSBbICQjIC1ndCAwIF0KLWRvCi0gIGNhc2UgIiQxIiBpbgotICAgIC1ofC0taGVscCkKLSAgICAgIHVzYWdlCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0gICAgLWkpCi0gICAgICBzaGlmdAotICAgICAgaWYgWyAkIyAtZXEgMCBdOyB0aGVuCi0gICAgICAgIGVjaG8gImVycm9yOiBudW1iZXIgb2YgaXRlcmF0aW9ucyBleHBlY3RlZCIgMT4mMgotICAgICAgICB1c2FnZQotICAgICAgICBleGl0IDIKLSAgICAgIGZpCi0gICAgICBpdGVyYXRpb25zPSQoKCAkMSApKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgLXMpCi0gICAgICBzaGlmdAotICAgICAgaWYgWyAkIyAtZXEgMCBdOyB0aGVuCi0gICAgICAgIGVjaG8gImVycm9yOiBubyBkZXZpY2Ugc3BlY2lmaWVkIiAxPiYyCi0gICAgICAgIHVzYWdlCi0gICAgICAgIGV4aXQgMgotICAgICAgZmkKLSAgICAgIGRldmljZT0iJDEiCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAtLWFsbCkKLSAgICAgIGJlbmNobWFya3MrPSggIiR7a25vd25fYmVuY2htYXJrc1tAXX0iICkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgIC0tKikKLSAgICAgIGJlbmNobWFya19hcmdzKz0oICIkMSIgKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGJlbmNobWFya3MrPSggIiQxIiApCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiBbICIkeyNiZW5jaG1hcmtzW0BdfSIgLWVxIDAgXTsgdGhlbgotICBiZW5jaG1hcmtzKz0oICIke2tub3duX2JlbmNobWFya3NbQF19IiApCi1maQotCi1hZGI9KCAiYWRiIiApCi1pZiBbIC1uICIke2RldmljZX0iIF07IHRoZW4KLSAgYWRiKz0oICItcyIgIiR7ZGV2aWNlfSIgKQotZmkKLQotc291cmNlICR7QU5EUk9JRF9CVUlMRF9UT1B9L2J1aWxkL2VudnNldHVwLnNoCi10YXJnZXRfYXJjaD0kKGdldHRhcmdldGFyY2gpCi0KLWZhaWxlZF9iZW5jaG1hcmtzPSgpCi1mb3Igc3BlYyBpbiAiJHtiZW5jaG1hcmtzW0BdfSIKLWRvCi0gIG5hbWU9IiR7c3BlYyUlLip9IgotICBpZiBbWyAkdGFyZ2V0X2FyY2ggPT0gKiI2NCIqIF1dOyB0aGVuCi0gICAgYmluYXJ5PSIvZGF0YS9iZW5jaG1hcmt0ZXN0NjQvJHtuYW1lfS8ke25hbWV9IgotICBlbHNlCi0gICAgYmluYXJ5PSIvZGF0YS9iZW5jaG1hcmt0ZXN0LyR7bmFtZX0vJHtuYW1lfSIKLSAgZmkKLQotICBwdXNoX2NvbW1hbmQ9KCAiJHthZGJbQF19IiBwdXNoIHsiJHtBTkRST0lEX1BST0RVQ1RfT1VUfSIsfSIke2JpbmFyeX0iICkKLSAgYmVuY2htYXJrX2NvbW1hbmQ9KCAiJHthZGJbQF19IiBzaGVsbCAiJHtiaW5hcnl9IiApCi0gIGlmIFsgIiR7bmFtZX0iICE9ICIke3NwZWN9IiBdOyB0aGVuCi0gICAgZmlsdGVyPSIke3NwZWMjKi59IgotICAgIGJlbmNobWFya19jb21tYW5kKz0oICItLWJlbmNobWFya19maWx0ZXI9JHtmaWx0ZXJ9IiApCi0gIGZpCi0gIGJlbmNobWFya19jb21tYW5kKz0oICIke2JlbmNobWFya19hcmdzW0BdfSIgKQotCi0gIGVjaG8gIi0tLSAke25hbWV9IC0tLSIKLSAgZWNobyAicHVzaGluZy4uLiIKLSAgIiR7cHVzaF9jb21tYW5kW0BdfSIKLSAgZWNobyAicnVubmluZy4uLiIKLSAgZmFpbGVkX2NvdW50PTAKLSAgZm9yIGkgaW4gJChzZXEgMSAke2l0ZXJhdGlvbnN9KQotICBkbwotICAgICIke2JlbmNobWFya19jb21tYW5kW0BdfSIgfHwgZmFpbGVkX2NvdW50PSQoKCAkZmFpbGVkX2NvdW50ICsgMSApKQotICBkb25lCi0KLSAgaWYgWyAkZmFpbGVkX2NvdW50ICE9IDAgXTsgdGhlbgotICAgIGZhaWxlZF9iZW5jaG1hcmtzKz0oICIke25hbWV9ICR7ZmFpbGVkX2NvdW50fS8ke2l0ZXJhdGlvbnN9IiApCi0gIGZpCi1kb25lCi0KLWlmIFsgIiR7I2ZhaWxlZF9iZW5jaG1hcmtzW0BdfSIgLW5lIDAgXTsgdGhlbgotICBmb3IgZmFpbGVkX2JlbmNobWFyayBpbiAiJHtmYWlsZWRfYmVuY2htYXJrc1tAXX0iCi0gIGRvCi0gICAgZWNobyAiISEhIEZBSUxFRCBURVNUOiAke2ZhaWxlZF9iZW5jaG1hcmt9ICEhISIKLSAgZG9uZQotICBleGl0IDEKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC9ydW5faG9zdF91bml0X3Rlc3RzLnB5IGIvdGVzdC9ydW5faG9zdF91bml0X3Rlc3RzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTE3ZTIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcnVuX2hvc3RfdW5pdF90ZXN0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLWltcG9ydCBzeXMKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgb3MKLWltcG9ydCBhcmdwYXJzZQotCi0jIFJlZ2lzdGVyZWQgaG9zdCBiYXNlZCB1bml0IHRlc3RzCi0jIE11c3QgaGF2ZSAnaG9zdF9zdXBwb3J0ZWQ6IHRydWUnCi1IT1NUX1RFU1RTID0gWwotICAgICdibHVldG9vdGhfdGVzdF9jb21tb24nLAotICAgICdibHVldG9vdGh0YmRfdGVzdCcsCi0gICAgJ25ldF90ZXN0X2F2cmNwJywKLSAgICAnbmV0X3Rlc3RfYnRjb3JlJywKLSAgICAnbmV0X3Rlc3RfdHlwZXMnLAotICAgICduZXRfdGVzdF9idG1faXNvJywKLSAgICAnbmV0X3Rlc3RfYnRwYWNrZXRzJywKLV0KLQotU09PTkdfVUlfQkFTSCA9ICdidWlsZC9zb29uZy9zb29uZ191aS5iYXNoJwotCi0KLWRlZiBzdHIyYm9vbChhcmd1bWVudCwgZGVmYXVsdD1GYWxzZSk6Ci0gICAgIiIiIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBib29sZWVuIHZhbHVlLiAiIiIKLSAgICBhcmd1bWVudCA9IHN0cihhcmd1bWVudCkKLSAgICBpZiBhcmd1bWVudC5sb3dlcigpIGluIFsnMCcsICdmJywgJ2ZhbHNlJywgJ29mZicsICdubycsICduJ106Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGVsaWYgYXJndW1lbnQubG93ZXIoKSBpbiBbJzEnLCAndCcsICd0cnVlJywgJ29uJywgJ3llcycsICd5J106Ci0gICAgICAgIHJldHVybiBUcnVlCi0gICAgcmV0dXJuIGRlZmF1bHQKLQotCi1kZWYgY2hlY2tfZGlyX2V4aXN0cyhkaXIsIGRpcm5hbWUpOgotICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcik6Ci0gICAgICAgIHByaW50ICJDb3VsZG4ndCBmaW5kICVzICglcykhIiAlIChkaXJuYW1lLCBkaXIpCi0gICAgICAgIHN5cy5leGl0KDApCi0KLQotZGVmIGdldF9vdXRwdXRfZnJvbV9jb21tYW5kKGNtZCk6Ci0gICAgdHJ5OgotICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kKS5zdHJpcCgpCi0gICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6Ci0gICAgICAgIHByaW50ICdGYWlsZWQgdG8gY2FsbCB7Y21kfSwgcmV0dXJuIGNvZGUge2NvZGV9Jy5mb3JtYXQoY21kPWNtZCwgY29kZT1lLnJldHVybmNvZGUpCi0gICAgICAgIHByaW50IGUKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotCi1kZWYgZ2V0X2FuZHJvaWRfcm9vdF9vcl9kaWUoKToKLSAgICB2YWx1ZSA9IG9zLmVudmlyb24uZ2V0KCdBTkRST0lEX0JVSUxEX1RPUCcpCi0gICAgaWYgbm90IHZhbHVlOgotICAgICAgICAjIFRyeSB0byBmaW5kIGJ1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggdXB3YXJkcyB1bnRpbCByb290IGRpcmVjdG9yeQotICAgICAgICBjdXJyZW50X3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MuZ2V0Y3dkKCkpCi0gICAgICAgIHdoaWxlIGN1cnJlbnRfcGF0aCBhbmQgb3MucGF0aC5pc2RpcihjdXJyZW50X3BhdGgpOgotICAgICAgICAgICAgc29vbmdfdWlfYmFzaF9wYXRoID0gb3MucGF0aC5qb2luKGN1cnJlbnRfcGF0aCwgU09PTkdfVUlfQkFTSCkKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNvb25nX3VpX2Jhc2hfcGF0aCk6Ci0gICAgICAgICAgICAgICAgIyBVc2UgdmFsdWUgcmV0dXJuZWQgZnJvbSBTb29uZyBVSSBpbnN0ZWFkIGluIGNhc2UgZGVmaW5pdGlvbiB0byBUT1AKLSAgICAgICAgICAgICAgICAjIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0X291dHB1dF9mcm9tX2NvbW1hbmQoKHNvb25nX3VpX2Jhc2hfcGF0aCwgJy0tZHVtcHZhci1tb2RlJywgJy0tYWJzJywgJ1RPUCcpKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBwYXJlbnRfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oY3VycmVudF9wYXRoLCBvcy5wYXJkaXIpKQotICAgICAgICAgICAgaWYgcGFyZW50X3BhdGggPT0gY3VycmVudF9wYXRoOgotICAgICAgICAgICAgICAgIGN1cnJlbnRfcGF0aCA9IE5vbmUKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgY3VycmVudF9wYXRoID0gcGFyZW50X3BhdGgKLSAgICAgICAgaWYgbm90IHZhbHVlOgotICAgICAgICAgICAgcHJpbnQgJ0Nhbm5vdCBkZXRlcm1pbmUgQU5EUk9JRF9CVUlMRF9UT1AnCi0gICAgICAgICAgICBzeXMuZXhpdCgxKQotICAgIGNoZWNrX2Rpcl9leGlzdHModmFsdWUsICckQU5EUk9JRF9CVUlMRF9UT1AnKQotICAgIHJldHVybiB2YWx1ZQotCi0KLWRlZiBnZXRfYW5kcm9pZF9ob3N0X291dF9vcl9kaWUoKToKLSAgICB2YWx1ZSA9IG9zLmVudmlyb24uZ2V0KCdBTkRST0lEX0hPU1RfT1VUJykKLSAgICBpZiBub3QgdmFsdWU6Ci0gICAgICAgIEFORFJPSURfQlVJTERfVE9QID0gZ2V0X2FuZHJvaWRfcm9vdF9vcl9kaWUoKQotICAgICAgICB2YWx1ZSA9IGdldF9vdXRwdXRfZnJvbV9jb21tYW5kKChvcy5wYXRoLmpvaW4oQU5EUk9JRF9CVUlMRF9UT1AsIFNPT05HX1VJX0JBU0gpLCAnLS1kdW1wdmFyLW1vZGUnLCAnLS1hYnMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSE9TVF9PVVQnKSkKLSAgICAgICAgaWYgbm90IHZhbHVlOgotICAgICAgICAgICAgcHJpbnQgJ0Nhbm5vdCBkZXRlcm1pbmUgQU5EUk9JRF9IT1NUX09VVCcKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCi0gICAgY2hlY2tfZGlyX2V4aXN0cyh2YWx1ZSwgJyRBTkRST0lEX0hPU1RfT1VUJykKLSAgICByZXR1cm4gdmFsdWUKLQotCi1kZWYgZ2V0X2FuZHJvaWRfZGlzdF9kaXJfb3JfZGllKCk6Ci0gICAgIyBDaGVjayBpZiAkRElTVF9ESVIgaXMgcHJlZGVmaW5lZCBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgIHZhbHVlID0gb3MuZW52aXJvbi5nZXQoJ0RJU1RfRElSJykKLSAgICBpZiBub3QgdmFsdWU6Ci0gICAgICAgICMgSWYgbm90IHVzZSB0aGUgZGVmYXVsdCBwYXRoCi0gICAgICAgIEFORFJPSURfQlVJTERfVE9QID0gZ2V0X2FuZHJvaWRfcm9vdF9vcl9kaWUoKQotICAgICAgICB2YWx1ZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmpvaW4oQU5EUk9JRF9CVUlMRF9UT1AsICdvdXQnKSwgJ2Rpc3QnKQotICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHZhbHVlKToKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHModmFsdWUpOgotICAgICAgICAgICAgcHJpbnQgJyVzIGlzIG5vdCBhIGRpcmVjdG9yeSEnICUgKHZhbHVlKQotICAgICAgICAgICAgc3lzLmV4aXQoMSkKLSAgICAgICAgb3MubWFrZWRpcnModmFsdWUpCi0gICAgcmV0dXJuIHZhbHVlCi0KLQotZGVmIGdldF9uYXRpdmVfdGVzdF9yb290X29yX2RpZSgpOgotICAgIGFuZHJvaWRfaG9zdF9vdXQgPSBnZXRfYW5kcm9pZF9ob3N0X291dF9vcl9kaWUoKQotICAgIHRlc3Rfcm9vdCA9IG9zLnBhdGguam9pbihhbmRyb2lkX2hvc3Rfb3V0LCAnbmF0aXZldGVzdDY0JykKLSAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcih0ZXN0X3Jvb3QpOgotICAgICAgICB0ZXN0X3Jvb3QgPSBvcy5wYXRoLmpvaW4oYW5kcm9pZF9ob3N0X291dCwgJ25hdGl2ZXRlc3QnKQotICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcih0ZXN0X3Jvb3QpOgotICAgICAgICAgICAgcHJpbnQgJ05laXRoZXIgbmF0aXZldGVzdDY0IG5vciBuYXRpdmV0ZXN0IGRpcmVjdG9yeSBleGlzdCwnIFwKLSAgICAgICAgICAgICAgICAgICcgcGxlYXNlIGNvbXBpbGUgZmlyc3QnCi0gICAgICAgICAgICBzeXMuZXhpdCgxKQotICAgIHJldHVybiB0ZXN0X3Jvb3QKLQotCi1kZWYgZ2V0X3Rlc3RfY21kX29yX2RpZSh0ZXN0X3Jvb3QsIHRlc3RfbmFtZSwgZW5hYmxlX3htbCwgdGVzdF9maWx0ZXIpOgotICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmpvaW4odGVzdF9yb290LCB0ZXN0X25hbWUpLCB0ZXN0X25hbWUpCi0gICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHRlc3RfcGF0aCk6Ci0gICAgICAgIHByaW50ICdDYW5ub3QgZmluZDogJyArIHRlc3RfcGF0aAotICAgICAgICBzeXMuZXhpdCgxKQotICAgIGNtZCA9IFt0ZXN0X3BhdGhdCi0gICAgaWYgZW5hYmxlX3htbDoKLSAgICAgICAgZGlzdF9kaXIgPSBnZXRfYW5kcm9pZF9kaXN0X2Rpcl9vcl9kaWUoKQotICAgICAgICBsb2dfb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdF9kaXIsICdndGVzdC97MH1fdGVzdF9kZXRhaWxzLnhtbCcuZm9ybWF0KHRlc3RfbmFtZSkpCi0gICAgICAgIGNtZC5hcHBlbmQoJy0tZ3Rlc3Rfb3V0cHV0PXhtbDp7MH0nLmZvcm1hdChsb2dfb3V0cHV0X3BhdGgpKQotICAgIGlmIHRlc3RfZmlsdGVyOgotICAgICAgICBjbWQuYXBwZW5kKCctLWd0ZXN0X2ZpbHRlcj0lcycgJSB0ZXN0X2ZpbHRlcikKLSAgICByZXR1cm4gY21kCi0KLQotIyBwYXRoIGlzIHJlbGF0aXZlIHRvIEFuZHJvaWQgYnVpbGQgdG9wCi1kZWYgYnVpbGRfdGFyZ2V0KHRhcmdldCwgbnVtX3Rhc2tzKToKLSAgICBBTkRST0lEX0JVSUxEX1RPUCA9IGdldF9hbmRyb2lkX3Jvb3Rfb3JfZGllKCkKLSAgICBidWlsZF9jbWQgPSBbU09PTkdfVUlfQkFTSCwgJy0tbWFrZS1tb2RlJ10KLSAgICBpZiBudW1fdGFza3MgPiAxOgotICAgICAgICBidWlsZF9jbWQuYXBwZW5kKCctaicgKyBzdHIobnVtX3Rhc2tzKSkKLSAgICBidWlsZF9jbWQuYXBwZW5kKHRhcmdldCkKLSAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihidWlsZF9jbWQsIGN3ZD1BTkRST0lEX0JVSUxEX1RPUCwgZW52PW9zLmVudmlyb24uY29weSgpKQotICAgIHJldHVybl9jb2RlID0gcC53YWl0KCkKLSAgICBpZiByZXR1cm5fY29kZSAhPSAwOgotICAgICAgICBwcmludCAnQlVJTEQgRkFJTEVELCByZXR1cm4gY29kZTogezB9Jy5mb3JtYXQoc3RyKHJldHVybl9jb2RlKSkKLSAgICAgICAgc3lzLmV4aXQoMSkKLSAgICByZXR1cm4KLQotCi1kZWYgbWFpbigpOgotICAgICIiIiBydW5faG9zdF91bml0X3Rlc3RzLnB5IC0gUnVuIHJlZ2lzdGVyZWQgaG9zdCBiYXNlZCB1bml0IHRlc3RzCi0gICIiIgotICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSdSdW4gaG9zdCBiYXNlZCB1bml0IHRlc3RzLicpCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICAgJy0tZW5hYmxlX3htbCcsCi0gICAgICAgIHR5cGU9c3RyMmJvb2wsCi0gICAgICAgIGRlc3Q9J2VuYWJsZV94bWwnLAotICAgICAgICBuYXJncz0nPycsCi0gICAgICAgIGNvbnN0PVRydWUsCi0gICAgICAgIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgIGhlbHA9J1doZXRoZXIgdG8gb3V0cHV0IHN0cnVjdHVyZWQgWE1MIGxvZyBvdXRwdXQgaW4gb3V0L2Rpc3QvZ3Rlc3QgZGlyZWN0b3J5JykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAnLWonLAotICAgICAgICB0eXBlPWludCwKLSAgICAgICAgbmFyZ3M9Jz8nLAotICAgICAgICBkZXN0PSdudW1fdGFza3MnLAotICAgICAgICBjb25zdD0tMSwKLSAgICAgICAgZGVmYXVsdD0tMSwKLSAgICAgICAgaGVscD0nTnVtYmVyIG9mIHRhc2tzIHRvIHJ1biBhdCB0aGUgc2FtZSB0aW1lJykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAncmVzdCcsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwgaGVscD0nLS0gYXJncywgb3RoZXIgZ3Rlc3QgYXJndW1lbnRzIGZvciBlYWNoIGluZGl2aWR1YWwgdGVzdCcpCi0gICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLQotICAgIGJ1aWxkX3RhcmdldCgnTU9EVUxFUy1JTi1zeXN0ZW0tYnQnLCBhcmdzLm51bV90YXNrcykKLSAgICBURVNUX1JPT1QgPSBnZXRfbmF0aXZlX3Rlc3Rfcm9vdF9vcl9kaWUoKQotICAgIHRlc3RfcmVzdWx0cyA9IFtdCi0gICAgZm9yIHRlc3QgaW4gSE9TVF9URVNUUzoKLSAgICAgICAgdGVzdF9jbWQgPSBnZXRfdGVzdF9jbWRfb3JfZGllKFRFU1RfUk9PVCwgdGVzdCwgYXJncy5lbmFibGVfeG1sLCBhcmdzLnJlc3QpCi0gICAgICAgIGlmIHN1YnByb2Nlc3MuY2FsbCh0ZXN0X2NtZCkgIT0gMDoKLSAgICAgICAgICAgIHRlc3RfcmVzdWx0cy5hcHBlbmQoRmFsc2UpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0ZXN0X3Jlc3VsdHMuYXBwZW5kKFRydWUpCi0gICAgaWYgbm90IGFsbCh0ZXN0X3Jlc3VsdHMpOgotICAgICAgICBmYWlsdXJlcyA9IFtpIGZvciBpLCB4IGluIGVudW1lcmF0ZSh0ZXN0X3Jlc3VsdHMpIGlmIG5vdCB4XQotICAgICAgICBmb3IgaW5kZXggaW4gZmFpbHVyZXM6Ci0gICAgICAgICAgICBwcmludCAnVEVTVCBGQUlMTEVEOiAnICsgSE9TVF9URVNUU1tpbmRleF0KLSAgICAgICAgc3lzLmV4aXQoMCkKLSAgICBwcmludCAnVEVTVCBQQVNTRUQgJyArIHN0cihsZW4odGVzdF9yZXN1bHRzKSkgKyAnIHRlc3RzIHdlcmUgcnVuJwotCi0gICAgZGlzdF9kaXIgPSBnZXRfYW5kcm9pZF9kaXN0X2Rpcl9vcl9kaWUoKQotICAgIGxvZ19vdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0X2RpciwgJ2d0ZXN0L2NvdmVyYWdlJykKLSAgICBjbWRfcGF0aCA9IG9zLnBhdGguam9pbihnZXRfYW5kcm9pZF9yb290X29yX2RpZSgpLCAnc3lzdGVtL2J0L3Rlc3QnKQotICAgIHByaW50IGNtZF9wYXRoCi0gICAgY21kID0gWwotICAgICAgICBvcy5wYXRoLmpvaW4oY21kX3BhdGgsICdnZW5fY292ZXJhZ2UucHknKSwKLSAgICAgICAgJy0tc2tpcC1odG1sJywKLSAgICAgICAgJy0tanNvbi1maWxlJywKLSAgICAgICAgJy1vJywKLSAgICAgICAgbG9nX291dHB1dF9wYXRoLAotICAgIF0KLSAgICBzdWJwcm9jZXNzLmNhbGwoY21kKQotCi0gICAgc3lzLmV4aXQoMCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdGVzdC9ydW5fdW5pdF90ZXN0cy5zaCBiL3Rlc3QvcnVuX3VuaXRfdGVzdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMTdkZDEuLjAwMDAwMDAKLS0tIGEvdGVzdC9ydW5fdW5pdF90ZXN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0jIS9iaW4vc2gKLQota25vd25fdGVzdHM9KAotICBhdWRpb19ibHVldG9vdGhfaHdfdGVzdAotICBibHVldG9vdGgtdGVzdC1hdWRpby1oYWwtaW50ZXJmYWNlCi0gIGJsdWV0b290aF90ZXN0X2NvbW1vbgotICBibHVldG9vdGh0YmRfdGVzdAotICBuZXRfdGVzdF9hdWRpb19hMmRwX2h3Ci0gIG5ldF90ZXN0X2F2cmNwCi0gIG5ldF90ZXN0X2JsdWV0b290aAotICBuZXRfdGVzdF9idGNvcmUKLSAgbmV0X3Rlc3RfYnRhCi0gIG5ldF90ZXN0X2J0aWYKLSAgbmV0X3Rlc3RfYnRpZl9wcm9maWxlX3F1ZXVlCi0gIG5ldF90ZXN0X2J0aWZfY29uZmlnX2NhY2hlCi0gIG5ldF90ZXN0X2RldmljZQotICBuZXRfdGVzdF9lYXR0Ci0gIG5ldF90ZXN0X2hjaQotICBuZXRfdGVzdF9zdGFjawotICBuZXRfdGVzdF9zdGFja19tdWx0aV9hZHYKLSAgbmV0X3Rlc3Rfc3RhY2tfYWRfcGFyc2VyCi0gIG5ldF90ZXN0X3N0YWNrX3NtcAotICBuZXRfdGVzdF90eXBlcwotICBuZXRfdGVzdF9vc2kKLSAgbmV0X3Rlc3RfcGVyZm9ybWFuY2UKLSAgbmV0X3Rlc3Rfc3RhY2tfcmZjb21tCi0gIG5ldF90ZXN0X2dhdHRfY29ubl9tdWx0aXBsZXhpbmcKLSkKLQota25vd25fcmVtb3RlX3Rlc3RzPSgKLSAgbmV0X3Rlc3RfcmZjb21tX3N1aXRlCi0pCi0KLQotdXNhZ2UoKSB7Ci0gIGJpbmFyeT0iJChiYXNlbmFtZSAiJDAiKSIKLSAgZWNobyAiVXNhZ2U6ICR7YmluYXJ5fSAtLWhlbHAiCi0gIGVjaG8gIiAgICAgICAke2JpbmFyeX0gWy1pIDxpdGVyYXRpb25zPl0gWy1zIDxzcGVjaWZpYyBkZXZpY2U+XSBbLS1hbGxdIFs8dGVzdCBuYW1lPlsuPGZpbHRlcj5dIC4uLl0gWy0tPGFyZz4gLi4uXSIKLSAgZWNobwotICBlY2hvICJVbmtub3duIGxvbmcgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHRlc3QuIgotICBlY2hvCi0gIGVjaG8gIktub3duIHRlc3QgbmFtZXM6IgotCi0gIGZvciBuYW1lIGluICIke2tub3duX3Rlc3RzW0BdfSIKLSAgZG8KLSAgICBlY2hvICIgICAgJHtuYW1lfSIKLSAgZG9uZQotCi0gIGVjaG8KLSAgZWNobyAiS25vd24gdGVzdHMgdGhhdCBuZWVkIGEgcmVtb3RlIGRldmljZToiCi0gIGZvciBuYW1lIGluICIke2tub3duX3JlbW90ZV90ZXN0c1tAXX0iCi0gIGRvCi0gICAgZWNobyAiICAgICR7bmFtZX0iCi0gIGRvbmUKLX0KLQotaXRlcmF0aW9ucz0xCi1kZXZpY2U9Ci10ZXN0cz0oKQotdGVzdF9hcmdzPSgpCi13aGlsZSBbICQjIC1ndCAwIF0KLWRvCi0gIGNhc2UgIiQxIiBpbgotICAgIC1ofC0taGVscCkKLSAgICAgIHVzYWdlCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0gICAgLWkpCi0gICAgICBzaGlmdAotICAgICAgaWYgWyAkIyAtZXEgMCBdOyB0aGVuCi0gICAgICAgIGVjaG8gImVycm9yOiBudW1iZXIgb2YgaXRlcmF0aW9ucyBleHBlY3RlZCIgMT4mMgotICAgICAgICB1c2FnZQotICAgICAgICBleGl0IDIKLSAgICAgIGZpCi0gICAgICBpdGVyYXRpb25zPSQoKCAkMSApKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgLXMpCi0gICAgICBzaGlmdAotICAgICAgaWYgWyAkIyAtZXEgMCBdOyB0aGVuCi0gICAgICAgIGVjaG8gImVycm9yOiBubyBkZXZpY2Ugc3BlY2lmaWVkIiAxPiYyCi0gICAgICAgIHVzYWdlCi0gICAgICAgIGV4aXQgMgotICAgICAgZmkKLSAgICAgIGRldmljZT0iJDEiCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAtLWFsbCkKLSAgICAgIHRlc3RzKz0oICIke2tub3duX3Rlc3RzW0BdfSIgKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgLS0qKQotICAgICAgdGVzdF9hcmdzKz0oICIkMSIgKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIHRlc3RzKz0oICIkMSIgKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgWyAiJHsjdGVzdHNbQF19IiAtZXEgMCBdOyB0aGVuCi0gIHRlc3RzKz0oICIke2tub3duX3Rlc3RzW0BdfSIgKQotZmkKLQotYWRiPSggImFkYiIgKQotaWYgWyAtbiAiJHtkZXZpY2V9IiBdOyB0aGVuCi0gIGFkYis9KCAiLXMiICIke2RldmljZX0iICkKLWZpCi0KLXNvdXJjZSAke0FORFJPSURfQlVJTERfVE9QfS9idWlsZC9lbnZzZXR1cC5zaAotdGFyZ2V0X2FyY2g9JChnZXR0YXJnZXRhcmNoKQotCi1mYWlsZWRfdGVzdHM9KCkKLWZvciBzcGVjIGluICIke3Rlc3RzW0BdfSIKLWRvCi0gIG5hbWU9IiR7c3BlYyUlLip9IgotICBpZiBbWyAkdGFyZ2V0X2FyY2ggPT0gKiI2NCIqIF1dOyB0aGVuCi0gICAgYmluYXJ5PSIvZGF0YS9uYXRpdmV0ZXN0NjQvJHtuYW1lfS8ke25hbWV9IgotICBlbHNlCi0gICAgYmluYXJ5PSIvZGF0YS9uYXRpdmV0ZXN0LyR7bmFtZX0vJHtuYW1lfSIKLSAgZmkKLQotICBwdXNoX2NvbW1hbmQ9KCAiJHthZGJbQF19IiBwdXNoIHsiJHtBTkRST0lEX1BST0RVQ1RfT1VUfSIsfSIke2JpbmFyeX0iICkKLSAgdGVzdF9jb21tYW5kPSggIiR7YWRiW0BdfSIgc2hlbGwgIiR7YmluYXJ5fSIgKQotICBpZiBbICIke25hbWV9IiAhPSAiJHtzcGVjfSIgXTsgdGhlbgotICAgIGZpbHRlcj0iJHtzcGVjIyoufSIKLSAgICB0ZXN0X2NvbW1hbmQrPSggIi0tZ3Rlc3RfZmlsdGVyPSR7ZmlsdGVyfSIgKQotICBmaQotICB0ZXN0X2NvbW1hbmQrPSggIiR7dGVzdF9hcmdzW0BdfSIgKQotCi0gIGVjaG8gIi0tLSAke25hbWV9IC0tLSIKLSAgZWNobyAicHVzaGluZy4uLiIKLSAgIiR7cHVzaF9jb21tYW5kW0BdfSIKLSAgZWNobyAicnVubmluZy4uLiIKLSAgZmFpbGVkX2NvdW50PTAKLSAgZm9yIGkgaW4gJChzZXEgMSAke2l0ZXJhdGlvbnN9KQotICBkbwotICAgICIke3Rlc3RfY29tbWFuZFtAXX0iIHx8IGZhaWxlZF9jb3VudD0kKCggJGZhaWxlZF9jb3VudCArIDEgKSkKLSAgZG9uZQotCi0gIGlmIFsgJGZhaWxlZF9jb3VudCAhPSAwIF07IHRoZW4KLSAgICBmYWlsZWRfdGVzdHMrPSggIiR7bmFtZX0gJHtmYWlsZWRfY291bnR9LyR7aXRlcmF0aW9uc30iICkKLSAgZmkKLWRvbmUKLQotaWYgWyAiJHsjZmFpbGVkX3Rlc3RzW0BdfSIgLW5lIDAgXTsgdGhlbgotICBmb3IgZmFpbGVkX3Rlc3QgaW4gIiR7ZmFpbGVkX3Rlc3RzW0BdfSIKLSAgZG8KLSAgICBlY2hvICIhISEgRkFJTEVEIFRFU1Q6ICR7ZmFpbGVkX3Rlc3R9ICEhISIKLSAgZG9uZQotICBleGl0IDEKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC9zdHViL2xlZ2FjeV90cmFjZS5jYyBiL3Rlc3Qvc3R1Yi9sZWdhY3lfdHJhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGUzZGMuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdHViL2xlZ2FjeV90cmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0vLyB0TEVHQUNZX1RSQUNFX0xFVkVMCi11aW50OF90IGJ0dV90cmFjZV9sZXZlbCA9IDY7Ci11aW50OF90IGFwcGxfdHJhY2VfbGV2ZWwgPSA2OwotdWludDhfdCBidGlmX3RyYWNlX2xldmVsID0gNjsKLQotdWludDhfdCBBMkRQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIDA7IH0KLXVpbnQ4X3QgQVZEVF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7IHJldHVybiAwOyB9Ci11aW50OF90IEFWUkNfU2V0VHJhY2VMZXZlbCh1aW50OF90IG5ld19sZXZlbCkgeyByZXR1cm4gMDsgfQotdWludDhfdCBCTkVQX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIDA7IH0KLXVpbnQ4X3QgQlRNX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIDA7IH0KLXVpbnQ4X3QgUEFOX1NldFRyYWNlTGV2ZWwodWludDhfdCBuZXdfbGV2ZWwpIHsgcmV0dXJuIDA7IH0KLXVpbnQ4X3QgUE9SVF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7IHJldHVybiAwOyB9Ci11aW50OF90IFNNUF9TZXRUcmFjZUxldmVsKHVpbnQ4X3QgbmV3X2xldmVsKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS90ZXN0L3N0dWIvb3NpLmNjIGIvdGVzdC9zdHViL29zaS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4NDJlZi4uMDAwMDAwMAotLS0gYS90ZXN0L3N0dWIvb3NpLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBHZW5lcmF0ZWQgbW9jayBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlIGZpbGUKLSAqLwotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbW9ja19mdW5jdGlvbl9jb3VudF9tYXA7Ci0KLSNpbmNsdWRlICJvc2kvc3JjL2NvbXBhdC5jYyIgIC8vIEZvciBzdHJsY3B5Ci0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9hbGFybS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2FycmF5LmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvYnVmZmVyLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvY29uZmlnLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvZml4ZWRfcXVldWUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9mdXR1cmUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9oYXNoX21hcF91dGlscy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xpc3QuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9yZWFjdG9yLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvcmluZ2J1ZmZlci5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NvY2tldC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3RocmVhZC5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3dha2Vsb2NrLmgiCi0jaW5jbHVkZSAidGVzdC9jb21tb24vZmFrZV9vc2kuaCIKLQotI2lmbmRlZiBVTlVTRURfQVRUUgotI2RlZmluZSBVTlVTRURfQVRUUgotI2VuZGlmCi0KLXN0ZDo6bGlzdDxlbnRyeV90Pjo6aXRlcmF0b3Igc2VjdGlvbl90OjpGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBzdGQ6OmZpbmRfaWYoCi0gICAgICBlbnRyaWVzLmJlZ2luKCksIGVudHJpZXMuZW5kKCksCi0gICAgICBbJmtleV0oY29uc3QgZW50cnlfdCYgZW50cnkpIHsgcmV0dXJuIGVudHJ5LmtleSA9PSBrZXk7IH0pOwotfQotc3RkOjpsaXN0PHNlY3Rpb25fdD46Oml0ZXJhdG9yIGNvbmZpZ190OjpGaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gc3RkOjpmaW5kX2lmKAotICAgICAgc2VjdGlvbnMuYmVnaW4oKSwgc2VjdGlvbnMuZW5kKCksCi0gICAgICBbJnNlY3Rpb25dKGNvbnN0IHNlY3Rpb25fdCYgc2VjKSB7IHJldHVybiBzZWMubmFtZSA9PSBzZWN0aW9uOyB9KTsKLX0KLQotYm9vbCBjaGVja3N1bV9zYXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGVja3N1bSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbmZpZ19nZXRfYm9vbChjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgZGVmX3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbmZpZ19oYXNfa2V5KGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbmZpZ19oYXNfc2VjdGlvbihjb25zdCBjb25maWdfdCYgY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBjb25maWdfcmVtb3ZlX2tleShjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBjb25maWdfcmVtb3ZlX3NlY3Rpb24oY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24pIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgY29uZmlnX3NhdmUoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGNvbmZpZ190OjpIYXMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBzZWN0aW9uX3Q6Okhhcyhjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1jb25zdCBzdGQ6OnN0cmluZyogY29uZmlnX2dldF9zdHJpbmcoY29uc3QgY29uZmlnX3QmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBkZWZfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotaW50IGNvbmZpZ19nZXRfaW50KGNvbnN0IGNvbmZpZ190JiBjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCBkZWZfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjpzdHJpbmcgY2hlY2tzdW1fcmVhZChjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zdGQ6OnVuaXF1ZV9wdHI8Y29uZmlnX3Q+IGNvbmZpZ19uZXcoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3X2Nsb25lKGNvbnN0IGNvbmZpZ190JiBzcmMpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3RkOjp1bmlxdWVfcHRyPGNvbmZpZ190PiBjb25maWdfbmV3X2VtcHR5KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdWludDY0X3QgY29uZmlnX2dldF91aW50NjQoY29uc3QgY29uZmlnX3QmIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCB1aW50NjRfdCBkZWZfdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBjb25maWdfc2V0X2Jvb2woY29uZmlnX3QqIGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBib29sIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBjb25maWdfc2V0X2ludChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBjb25maWdfc2V0X3N0cmluZyhjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBjb25maWdfc2V0X3VpbnQ2NChjb25maWdfdCogY29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdWludDY0X3QgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIHNlY3Rpb25fdDo6U2V0KHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLWJvb2wgYXJyYXlfYXBwZW5kX3B0cihhcnJheV90KiBhcnJheSwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBhcnJheV9hcHBlbmRfdmFsdWUoYXJyYXlfdCogYXJyYXksIHVpbnQzMl90IHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1zaXplX3QgYXJyYXlfbGVuZ3RoKGNvbnN0IGFycmF5X3QqIGFycmF5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgYXJyYXlfZnJlZShhcnJheV90KiBhcnJheSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCogYXJyYXlfYXQoY29uc3QgYXJyYXlfdCogYXJyYXksIHNpemVfdCBpbmRleCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkKiBhcnJheV9wdHIoY29uc3QgYXJyYXlfdCogYXJyYXkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1zaXplX3QgYWxsb2NhdGlvbl90cmFja2VyX2V4cGVjdF9ub19hbGxvY2F0aW9ucyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNpemVfdCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzaXplX2Zvcl9jYW5hcnkoc2l6ZV90IHNpemUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfcmVzZXQodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBhbGxvY2F0aW9uX3RyYWNrZXJfdW5pbml0KHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgb3NpX2FsbG9jYXRvcl9kZWJ1Z19kdW1wKGludCBmZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCogYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9hbGxvYyh1aW50OF90IGFsbG9jYXRvcl9pZCwgdm9pZCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVxdWVzdGVkX3NpemUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCogYWxsb2NhdGlvbl90cmFja2VyX25vdGlmeV9mcmVlKFVOVVNFRF9BVFRSIHVpbnQ4X3QgYWxsb2NhdG9yX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHB0cikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWJvb2wgcmVhY3Rvcl9jaGFuZ2VfcmVnaXN0cmF0aW9uKHJlYWN0b3Jfb2JqZWN0X3QqIG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWFkX3JlYWR5KSh2b2lkKiBjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp3cml0ZV9yZWFkeSkodm9pZCogY29udGV4dCkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXJlYWN0b3Jfb2JqZWN0X3QqIHJlYWN0b3JfcmVnaXN0ZXIocmVhY3Rvcl90KiByZWFjdG9yLCBpbnQgZmQsIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWFkX3JlYWR5KSh2b2lkKiBjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKndyaXRlX3JlYWR5KSh2b2lkKiBjb250ZXh0KSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1yZWFjdG9yX3N0YXR1c190IHJlYWN0b3JfcnVuX29uY2UocmVhY3Rvcl90KiByZWFjdG9yKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gUkVBQ1RPUl9TVEFUVVNfRE9ORTsKLX0KLXJlYWN0b3Jfc3RhdHVzX3QgcmVhY3Rvcl9zdGFydChyZWFjdG9yX3QqIHJlYWN0b3IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBSRUFDVE9SX1NUQVRVU19ET05FOwotfQotcmVhY3Rvcl90KiByZWFjdG9yX25ldyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQgcmVhY3Rvcl9mcmVlKHJlYWN0b3JfdCogcmVhY3RvcikgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCByZWFjdG9yX3N0b3AocmVhY3Rvcl90KiByZWFjdG9yKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIHJlYWN0b3JfdW5yZWdpc3RlcihyZWFjdG9yX29iamVjdF90KiBvYmopIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLWZ1dHVyZV90KiBmdXR1cmVfbmV3KHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotZnV0dXJlX3QqIGZ1dHVyZV9uZXdfaW1tZWRpYXRlKHZvaWQqIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQgZnV0dXJlX3JlYWR5KGZ1dHVyZV90KiBmdXR1cmUsIHZvaWQqIHZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBtdXRleF9nbG9iYWxfbG9jayh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIG11dGV4X2dsb2JhbF91bmxvY2sodm9pZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCogZnV0dXJlX2F3YWl0KGZ1dHVyZV90KiBmdXR1cmUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1ib29sIHRocmVhZF9pc19zZWxmKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgdGhyZWFkX3Bvc3QodGhyZWFkX3QqIHRocmVhZCwgdGhyZWFkX2ZuIGZ1bmMsIHZvaWQqIGNvbnRleHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgdGhyZWFkX3NldF9wcmlvcml0eSh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgdGhyZWFkX3NldF9ydF9wcmlvcml0eSh0aHJlYWRfdCogdGhyZWFkLCBpbnQgcHJpb3JpdHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWNvbnN0IGNoYXIqIHRocmVhZF9uYW1lKGNvbnN0IHRocmVhZF90KiB0aHJlYWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotcmVhY3Rvcl90KiB0aHJlYWRfZ2V0X3JlYWN0b3IoY29uc3QgdGhyZWFkX3QqIHRocmVhZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci10aHJlYWRfdCogdGhyZWFkX25ldyhjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXRocmVhZF90KiB0aHJlYWRfbmV3X3NpemVkKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB3b3JrX3F1ZXVlX2NhcGFjaXR5KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQgdGhyZWFkX2ZyZWUodGhyZWFkX3QqIHRocmVhZCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCB0aHJlYWRfam9pbih0aHJlYWRfdCogdGhyZWFkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIHRocmVhZF9zdG9wKHRocmVhZF90KiB0aHJlYWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLQotY2hhciogb3NpX3N0cmR1cChjb25zdCBjaGFyKiBzdHIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotY2hhciogb3NpX3N0cm5kdXAoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQgb3NpX2ZyZWUodm9pZCogcHRyKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIG9zaV9mcmVlX2FuZF9yZXNldCh2b2lkKiogcF9wdHIpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQqIG9zaV9jYWxsb2Moc2l6ZV90IHNpemUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCogb3NpX21hbGxvYyhzaXplX3Qgc2l6ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWJvb2wgZml4ZWRfcXVldWVfaXNfZW1wdHkoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgZml4ZWRfcXVldWVfdHJ5X2VucXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLWZpeGVkX3F1ZXVlX3QqIGZpeGVkX3F1ZXVlX25ldyhzaXplX3QgY2FwYWNpdHkpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotaW50IGZpeGVkX3F1ZXVlX2dldF9kZXF1ZXVlX2ZkKGNvbnN0IGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBmaXhlZF9xdWV1ZV9nZXRfZW5xdWV1ZV9mZChjb25zdCBmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1saXN0X3QqIGZpeGVkX3F1ZXVlX2dldF9saXN0KGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXNpemVfdCBmaXhlZF9xdWV1ZV9jYXBhY2l0eShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zaXplX3QgZml4ZWRfcXVldWVfbGVuZ3RoKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXZvaWQgZml4ZWRfcXVldWVfZW5xdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZml4ZWRfcXVldWVfZmx1c2goZml4ZWRfcXVldWVfdCogcXVldWUsIGZpeGVkX3F1ZXVlX2ZyZWVfY2IgZnJlZV9jYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgZml4ZWRfcXVldWVfZnJlZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSwgZml4ZWRfcXVldWVfZnJlZV9jYiBmcmVlX2NiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBmaXhlZF9xdWV1ZV9yZWdpc3Rlcl9kZXF1ZXVlKGZpeGVkX3F1ZXVlX3QqIHF1ZXVlLCByZWFjdG9yX3QqIHJlYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfcXVldWVfY2IgcmVhZHlfY2IsIHZvaWQqIGNvbnRleHQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIGZpeGVkX3F1ZXVlX3VucmVnaXN0ZXJfZGVxdWV1ZShmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQqIGZpeGVkX3F1ZXVlX2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X2RlcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X3BlZWtfZmlyc3QoZml4ZWRfcXVldWVfdCogcXVldWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCogZml4ZWRfcXVldWVfdHJ5X3BlZWtfbGFzdChmaXhlZF9xdWV1ZV90KiBxdWV1ZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci12b2lkKiBmaXhlZF9xdWV1ZV90cnlfcmVtb3ZlX2Zyb21fcXVldWUoZml4ZWRfcXVldWVfdCogcXVldWUsIHZvaWQqIGRhdGEpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1hbGFybV90KiBhbGFybV9uZXcoY29uc3QgY2hhciogbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1hbGFybV90KiBhbGFybV9uZXdfcGVyaW9kaWMoY29uc3QgY2hhciogbmFtZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1ib29sIGFsYXJtX2lzX3NjaGVkdWxlZChjb25zdCBhbGFybV90KiBhbGFybSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotdWludDY0X3QgYWxhcm1fZ2V0X3JlbWFpbmluZ19tcyhjb25zdCBhbGFybV90KiBhbGFybSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIGFsYXJtX2NhbmNlbChhbGFybV90KiBhbGFybSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBhbGFybV9jbGVhbnVwKHZvaWQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYWxhcm1fZGVidWdfZHVtcChpbnQgZmQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgYWxhcm1fZnJlZShhbGFybV90KiBhbGFybSkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBhbGFybV9zZXQoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLCBhbGFybV9jYWxsYmFja190IGNiLAotICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLQotc3RydWN0IGZha2Vfb3NpX2FsYXJtX3NldF9vbl9tbG9vcCBmYWtlX29zaV9hbGFybV9zZXRfb25fbWxvb3BfOwotdm9pZCBhbGFybV9zZXRfb25fbWxvb3AoYWxhcm1fdCogYWxhcm0sIHVpbnQ2NF90IGludGVydmFsX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1fY2FsbGJhY2tfdCBjYiwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgZmFrZV9vc2lfYWxhcm1fc2V0X29uX21sb29wXy5pbnRlcnZhbF9tcyA9IGludGVydmFsX21zOwotICBmYWtlX29zaV9hbGFybV9zZXRfb25fbWxvb3BfLmNiID0gY2I7Ci0gIGZha2Vfb3NpX2FsYXJtX3NldF9vbl9tbG9vcF8uZGF0YSA9IGRhdGE7Ci19Ci0KLWludCBvc2lfcmFuZCh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLQotYnVmZmVyX3QqIGJ1ZmZlcl9uZXdfcmVmKGNvbnN0IGJ1ZmZlcl90KiBidWYpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotYnVmZmVyX3QqIGJ1ZmZlcl9uZXdfc2xpY2UoY29uc3QgYnVmZmVyX3QqIGJ1Ziwgc2l6ZV90IHNsaWNlX3NpemUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotc2l6ZV90IGJ1ZmZlcl9sZW5ndGgoY29uc3QgYnVmZmVyX3QqIGJ1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIGJ1ZmZlcl9mcmVlKGJ1ZmZlcl90KiBidWZmZXIpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQqIGJ1ZmZlcl9wdHIoY29uc3QgYnVmZmVyX3QqIGJ1ZikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWJvb2wgc29ja2V0X2xpc3Rlbihjb25zdCBzb2NrZXRfdCogc29ja2V0LCBwb3J0X3QgcG9ydCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotc29ja2V0X3QqIHNvY2tldF9hY2NlcHQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1zb2NrZXRfdCogc29ja2V0X25ldyh2b2lkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXNvY2tldF90KiBzb2NrZXRfbmV3X2Zyb21fZmQoaW50IGZkKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXNzaXplX3Qgc29ja2V0X2J5dGVzX2F2YWlsYWJsZShjb25zdCBzb2NrZXRfdCogc29ja2V0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNzaXplX3Qgc29ja2V0X3JlYWQoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgdm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3NpemVfdCBzb2NrZXRfd3JpdGUoY29uc3Qgc29ja2V0X3QqIHNvY2tldCwgY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotc3NpemVfdCBzb2NrZXRfd3JpdGVfYW5kX3RyYW5zZmVyX2ZkKGNvbnN0IHNvY2tldF90KiBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGludCBmZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIHNvY2tldF9mcmVlKHNvY2tldF90KiBzb2NrZXQpIHsgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7IH0KLXZvaWQgc29ja2V0X3JlZ2lzdGVyKHNvY2tldF90KiBzb2NrZXQsIHJlYWN0b3JfdCogcmVhY3Rvciwgdm9pZCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9jYiByZWFkX2NiLCBzb2NrZXRfY2Igd3JpdGVfY2IpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci12b2lkIHNvY2tldF91bnJlZ2lzdGVyKHNvY2tldF90KiBzb2NrZXQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19Ci0KLWJvb2wgbGlzdF9hcHBlbmQobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGxpc3RfY29udGFpbnMoY29uc3QgbGlzdF90KiBsaXN0LCBjb25zdCB2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGxpc3RfaW5zZXJ0X2FmdGVyKGxpc3RfdCogbGlzdCwgbGlzdF9ub2RlX3QqIHByZXZfbm9kZSwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBsaXN0X2lzX2VtcHR5KGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBsaXN0X3ByZXBlbmQobGlzdF90KiBsaXN0LCB2b2lkKiBkYXRhKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIGxpc3RfcmVtb3ZlKGxpc3RfdCogbGlzdCwgdm9pZCogZGF0YSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotbGlzdF9ub2RlX3QqIGxpc3RfYmFja19ub2RlKGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1saXN0X25vZGVfdCogbGlzdF9iZWdpbihjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotbGlzdF9ub2RlX3QqIGxpc3RfZW5kKFVOVVNFRF9BVFRSIGNvbnN0IGxpc3RfdCogbGlzdCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1saXN0X25vZGVfdCogbGlzdF9mb3JlYWNoKGNvbnN0IGxpc3RfdCogbGlzdCwgbGlzdF9pdGVyX2NiIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLWxpc3Rfbm9kZV90KiBsaXN0X25leHQoY29uc3QgbGlzdF9ub2RlX3QqIG5vZGUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotbGlzdF90KiBsaXN0X25ldyhsaXN0X2ZyZWVfY2IgY2FsbGJhY2spIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotbGlzdF90KiBsaXN0X25ld19pbnRlcm5hbChsaXN0X2ZyZWVfY2IgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90KiB6ZXJvZWRfYWxsb2NhdG9yKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXNpemVfdCBsaXN0X2xlbmd0aChjb25zdCBsaXN0X3QqIGxpc3QpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotdm9pZCBsaXN0X2NsZWFyKGxpc3RfdCogbGlzdCkgeyBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsgfQotdm9pZCBsaXN0X2ZyZWUobGlzdF90KiBsaXN0KSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkKiBsaXN0X2JhY2soY29uc3QgbGlzdF90KiBsaXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQqIGxpc3RfZnJvbnQoY29uc3QgbGlzdF90KiBsaXN0KSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLXZvaWQqIGxpc3Rfbm9kZShjb25zdCBsaXN0X25vZGVfdCogbm9kZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWludCBvc2lfc29ja2V0X2xvY2FsX2NsaWVudChjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZXNwYWNlSWQsIGludCB0eXBlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBvc2lfc29ja2V0X2xvY2FsX2NsaWVudF9jb25uZWN0KGludCBmZCwgY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVzcGFjZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUgVU5VU0VEX0FUVFIpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50IG9zaV9zb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQoaW50IHMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lc3BhY2VJZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1pbnQgb3NpX3NvY2tldF9tYWtlX3NvY2thZGRyX3VuKGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lc3BhY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3VuKiBwX2FkZHIsIHNvY2tsZW5fdCogYWxlbikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXNpemVfdCByaW5nYnVmZmVyX2F2YWlsYWJsZShjb25zdCByaW5nYnVmZmVyX3QqIHJiKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNpemVfdCByaW5nYnVmZmVyX2RlbGV0ZShyaW5nYnVmZmVyX3QqIHJiLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNpemVfdCByaW5nYnVmZmVyX2luc2VydChyaW5nYnVmZmVyX3QqIHJiLCBjb25zdCB1aW50OF90KiBwLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNpemVfdCByaW5nYnVmZmVyX3BlZWsoY29uc3QgcmluZ2J1ZmZlcl90KiByYiwgb2ZmX3Qgb2Zmc2V0LCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNpemVfdCByaW5nYnVmZmVyX3BvcChyaW5nYnVmZmVyX3QqIHJiLCB1aW50OF90KiBwLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLXNpemVfdCByaW5nYnVmZmVyX3NpemUoY29uc3QgcmluZ2J1ZmZlcl90KiByYikgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIHJpbmdidWZmZXJfZnJlZShyaW5nYnVmZmVyX3QqIHJiKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci0KLWJvb2wgb3NpX3Byb3BlcnR5X2dldF9ib29sKGNvbnN0IGNoYXIqIGtleSwgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gZmFsc2U7Ci19Ci1pbnQgb3NpX3Byb3BlcnR5X2dldChjb25zdCBjaGFyKiBrZXksIGNoYXIqIHZhbHVlLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLWludCBvc2lfcHJvcGVydHlfc2V0KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBvc2lfcHJvcGVydHlfZ2V0X2ludDMyKGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCBkZWZhdWx0X3ZhbHVlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotICByZXR1cm4gMDsKLX0KLQotYm9vbCBzZW1hcGhvcmVfdHJ5X3dhaXQoc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotaW50IHNlbWFwaG9yZV9nZXRfZmQoY29uc3Qgc2VtYXBob3JlX3QqIHNlbWFwaG9yZSkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIDA7Ci19Ci1zZW1hcGhvcmVfdCogc2VtYXBob3JlX25ldyh1bnNpZ25lZCBpbnQgdmFsdWUpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBudWxscHRyOwotfQotdm9pZCBzZW1hcGhvcmVfZnJlZShzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBzZW1hcGhvcmVfcG9zdChzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotdm9pZCBzZW1hcGhvcmVfd2FpdChzZW1hcGhvcmVfdCogc2VtYXBob3JlKSB7Ci0gIG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOwotfQotCi1ib29sIHdha2Vsb2NrX2FjcXVpcmUodm9pZCkgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCB3YWtlbG9ja19yZWxlYXNlKHZvaWQpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgd2FrZWxvY2tfY2xlYW51cCh2b2lkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIHdha2Vsb2NrX2RlYnVnX2R1bXAoaW50IGZkKSB7IG1vY2tfZnVuY3Rpb25fY291bnRfbWFwW19fZnVuY19fXSsrOyB9Ci12b2lkIHdha2Vsb2NrX3NldF9vc19jYWxsb3V0cyhidF9vc19jYWxsb3V0c190KiBjYWxsb3V0cykgewotICBtb2NrX2Z1bmN0aW9uX2NvdW50X21hcFtfX2Z1bmNfX10rKzsKLX0KLXZvaWQgd2FrZWxvY2tfc2V0X3BhdGhzKGNvbnN0IGNoYXIqIGxvY2tfcGF0aCwgY29uc3QgY2hhciogdW5sb2NrX3BhdGgpIHsKLSAgbW9ja19mdW5jdGlvbl9jb3VudF9tYXBbX19mdW5jX19dKys7Ci19CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL0FuZHJvaWQuYnAgYi90ZXN0L3N1aXRlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDI4MTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdWl0ZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gQmx1ZXRvb3RoIHRlc3Qgc3VpdGUgZm9yIHRhcmdldAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIm5ldF90ZXN0X2JsdWV0b290aCIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiOlRlc3RDb21tb25Nb2NrRnVuY3Rpb25zIiwKLSAgICAgICAgIjpUZXN0TW9ja0JsdWV0b290aEludGVyZmFjZSIsCi0gICAgICAgICI6VGVzdE1vY2tEZXZpY2UiLAotICAgICAgICAiYWRhcHRlci9hZGFwdGVyX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgImFkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X3Rlc3QuY2MiLAotICAgICAgICAiZ2F0dC9nYXR0X3VuaXR0ZXN0LmNjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmhhcmR3YXJlX2hlYWRlcnMiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0Y29yZSIsCi0gICAgICAgICJsaWJvc2kiLAotICAgIF0sCi0gICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aHRiZF9oYWwiLAotICAgIF0sCi19Ci0KLS8vIEJsdWV0b290aCB0ZXN0IHN1aXRlIGZvciB0YXJnZXQKLWNjX3Rlc3QgewotICAgIG5hbWU6ICJuZXRfdGVzdF9yZmNvbW1fc3VpdGUiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICAgICAgInN5c3RlbS9idC9pbmNsdWRlIiwKLSAgICAgICAgInN5c3RlbS9idC9zdGFjay9pbmNsdWRlIiwKLSAgICBdLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjpUZXN0TW9ja0JsdWV0b290aEludGVyZmFjZSIsCi0gICAgICAgICI6VGVzdE1vY2tEZXZpY2UiLAotICAgICAgICAiOlRlc3RDb21tb25Nb2NrRnVuY3Rpb25zIiwKLSAgICAgICAgImFkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuY2MiLAotICAgICAgICAicmZjb21tL3JmY29tbV90ZXN0LmNjIiwKLSAgICAgICAgInJmY29tbS9yZmNvbW1fdW5pdHRlc3QuY2MiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliaGFyZHdhcmVfaGVhZGVycyJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGliYnRjb3JlIiwKLSAgICAgICAgImxpYm9zaSIsCi0gICAgXSwKLSAgICB3aG9sZV9zdGF0aWNfbGliczogWwotICAgICAgICAibGliYmx1ZXRvb3RodGJkX2hhbCIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3VpdGUvQlVJTEQuZ24gYi90ZXN0L3N1aXRlL0JVSUxELmduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGI2NWQwLi4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3VpdGUvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaWYgKGRlZmluZWQodXNlLmFuZHJvaWQpICYmIHVzZS5hbmRyb2lkKSB7Ci0gIGV4ZWN1dGFibGUoIm5ldF90ZXN0X2JsdWV0b290aCIpIHsKLSAgICBzb3VyY2VzID0gWwotICAgICAgImFkYXB0ZXIvYWRhcHRlcl91bml0dGVzdC5jYyIsCi0gICAgICAiYWRhcHRlci9ibHVldG9vdGhfdGVzdC5jYyIsCi0gICAgXQotCi0gICAgaW5jbHVkZV9kaXJzID0gWwotICAgICAgIi8vYnQiLAotICAgICAgIi8vYnQvdGVzdC9zdWl0ZSIsCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICIvL2J0L2J0Y29yZSIsCi0gICAgICAiLy9idC9tYWluOmJsdWV0b290aCIsCi0gICAgICAiLy9idC9zZXJ2aWNlOnNlcnZpY2UiLAotICAgICAgIi8vYnQvc2VydmljZTpzZXJ2aWNlX3VuaXR0ZXN0cyIsCi0gICAgICAiLy9idC90eXBlczp0eXBlc191bml0dGVzdHMiLAotICAgICAgIi8vYnQvb3NpIiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICIvL2J0OnRhcmdldF9kZWZhdWx0cyIsCi0gICAgICAiLy9idDpleHRlcm5hbF9ndGVzdF9tYWluIiwKLSAgICBdCi0KLSAgICBsaWJzID0gWwotICAgICAgInB0aHJlYWQiLAotICAgICAgInJ0IiwKLSAgICAgICJkbCIsCi0gICAgXQotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL2FkYXB0ZXIvYWRhcHRlcl91bml0dGVzdC5jYyBiL3Rlc3Qvc3VpdGUvYWRhcHRlci9hZGFwdGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJlYjQwLi4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3VpdGUvYWRhcHRlci9hZGFwdGVyX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImFkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuaCIKLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9wcm9wZXJ0eS5oIgotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCIKLSNpbmNsdWRlICJ0eXBlcy9idF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgewotCi0vLyBFYWNoIGl0ZXJhdGlvbiBvZiB0aGUgdGVzdCB0YWtlcyBhYm91dCAyIHNlY29uZHMgdG8gcnVuLCBzbyBjaG9vc2UgYSB2YWx1ZQotLy8gdGhhdCBtYXRjaGVzIHlvdXIgdGltZSBjb25zdHJhaW50cy4gRm9yIGV4YW1wbGUsIDUgaXRlcmF0aW9ucyB3b3VsZCB0YWtlCi0vLyBhYm91dCAxMCBzZWNvbmRzIHRvIHJ1bgotY29uc3QgaW50IGtUZXN0UmVwZWF0Q291bnQgPSA1OwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGJ0dGVzdCB7Ci0KLVRFU1RfRihCbHVldG9vdGhUZXN0LCBBZGFwdGVyRW5hYmxlRGlzYWJsZSkgewotICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT0ZGKQotICAgICAgPDwgIlRlc3Qgc2hvdWxkIGJlIHJ1biB3aXRoIEFkYXB0ZXIgZGlzYWJsZWQiOwotCi0gIEVYUEVDVF9FUShidF9pbnRlcmZhY2UoKS0+ZW5hYmxlKCksIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgc2VtYXBob3JlX3dhaXQoYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT04pIDw8ICJBZGFwdGVyIGRpZCBub3QgdHVybiBvbi4iOwotCi0gIEVYUEVDVF9FUShidF9pbnRlcmZhY2UoKS0+ZGlzYWJsZSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX0VRKEdldFN0YXRlKCksIEJUX1NUQVRFX09GRikgPDwgIkFkYXB0ZXIgZGlkIG5vdCB0dXJuIG9mZi4iOwotfQotCi1URVNUX0YoQmx1ZXRvb3RoVGVzdCwgQWRhcHRlclJlcGVhdGVkRW5hYmxlRGlzYWJsZSkgewotICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT0ZGKQotICAgICAgPDwgIlRlc3Qgc2hvdWxkIGJlIHJ1biB3aXRoIEFkYXB0ZXIgZGlzYWJsZWQiOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga1Rlc3RSZXBlYXRDb3VudDsgKytpKSB7Ci0gICAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5lbmFibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT04pIDw8ICJBZGFwdGVyIGRpZCBub3QgdHVybiBvbi4iOwotCi0gICAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5kaXNhYmxlKCksIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gICAgRVhQRUNUX0VRKEdldFN0YXRlKCksIEJUX1NUQVRFX09GRikgPDwgIkFkYXB0ZXIgZGlkIG5vdCB0dXJuIG9mZi4iOwotICB9Ci19Ci0KLVRFU1RfRihCbHVldG9vdGhUZXN0LCBBZGFwdGVyU2V0R2V0TmFtZSkgewotICBidF9wcm9wZXJ0eV90KiBuZXdfbmFtZSA9IHByb3BlcnR5X25ld19uYW1lKCJCbHVldG9vdGhUZXN0TmFtZTEiKTsKLQotICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmVuYWJsZSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX0VRKEdldFN0YXRlKCksIEJUX1NUQVRFX09OKQotICAgICAgPDwgIlRlc3Qgc2hvdWxkIGJlIHJ1biB3aXRoIEFkYXB0ZXIgZW5hYmxlZCI7Ci0KLSAgLy8gRW5hYmxpbmcgdGhlIGludGVyZmFjZSB3aWxsIGNhbGwgdGhlIHByb3BlcnRpZXMgY2FsbGJhY2sgdHdpY2UgYmVmb3JlCi0gIC8vIGV2ZXIgcmVhY2hpbmcgdGhpcyBwb2ludC4KLSAgQ2xlYXJTZW1hcGhvcmUoYWRhcHRlcl9wcm9wZXJ0aWVzX2NhbGxiYWNrX3NlbV8pOwotCi0gIEVYUEVDVF9FUShidF9pbnRlcmZhY2UoKS0+Z2V0X2FkYXB0ZXJfcHJvcGVydHkoQlRfUFJPUEVSVFlfQkROQU1FKSwKLSAgICAgICAgICAgIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgc2VtYXBob3JlX3dhaXQoYWRhcHRlcl9wcm9wZXJ0aWVzX2NhbGxiYWNrX3NlbV8pOwotICBFWFBFQ1RfR1QoR2V0UHJvcGVydGllc0NoYW5nZWRDb3VudCgpLCAwKQotICAgICAgPDwgIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhZGFwdGVyIHByb3BlcnR5IHRvIGNoYW5nZSI7Ci0gIGJ0X3Byb3BlcnR5X3QqIG5hbWVfcHJvcGVydHkgPSBHZXRQcm9wZXJ0eShCVF9QUk9QRVJUWV9CRE5BTUUpOwotICBFWFBFQ1RfTkUobmFtZV9wcm9wZXJ0eSwgbnVsbHB0cik7Ci0gIGlmIChwcm9wZXJ0eV9lcXVhbHMobmFtZV9wcm9wZXJ0eSwgbmV3X25hbWUpKSB7Ci0gICAgcHJvcGVydHlfZnJlZShuZXdfbmFtZSk7Ci0gICAgbmV3X25hbWUgPSBwcm9wZXJ0eV9uZXdfbmFtZSgiQmx1ZXRvb3RoVGVzdE5hbWUyIik7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgb2xkX25hbWUoKGNvbnN0IGNoYXIqKXByb3BlcnR5X2FzX25hbWUobmFtZV9wcm9wZXJ0eSktPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcHJvcGVydHktPmxlbik7Ci0KLSAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5zZXRfYWRhcHRlcl9wcm9wZXJ0eShuZXdfbmFtZSksIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgc2VtYXBob3JlX3dhaXQoYWRhcHRlcl9wcm9wZXJ0aWVzX2NhbGxiYWNrX3NlbV8pOwotICBFWFBFQ1RfR1QoR2V0UHJvcGVydGllc0NoYW5nZWRDb3VudCgpLCAwKQotICAgICAgPDwgIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhZGFwdGVyIHByb3BlcnR5IHRvIGNoYW5nZSI7Ci0gIEVYUEVDVF9UUlVFKEdldFByb3BlcnR5KEJUX1BST1BFUlRZX0JETkFNRSkpCi0gICAgICA8PCAiVGhlIEJsdWV0b290aCBuYW1lIHByb3BlcnR5IGRpZCBub3QgY2hhbmdlLiI7Ci0gIEVYUEVDVF9UUlVFKHByb3BlcnR5X2VxdWFscyhHZXRQcm9wZXJ0eShCVF9QUk9QRVJUWV9CRE5BTUUpLCBuZXdfbmFtZSkpCi0gICAgICA8PCAiQmx1ZXRvb3RoIG5hbWUgIgotICAgICAgPDwgcHJvcGVydHlfYXNfbmFtZShHZXRQcm9wZXJ0eShCVF9QUk9QRVJUWV9CRE5BTUUpKS0+bmFtZQotICAgICAgPDwgIiBkb2VzIG5vdCBtYXRjaCB0ZXN0IHZhbHVlICIgPDwgcHJvcGVydHlfYXNfbmFtZShuZXdfbmFtZSktPm5hbWU7Ci0KLSAgYnRfcHJvcGVydHlfdCogb2xkX25hbWVfcHJvcGVydHkgPSBwcm9wZXJ0eV9uZXdfbmFtZShvbGRfbmFtZS5jX3N0cigpKTsKLSAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5zZXRfYWRhcHRlcl9wcm9wZXJ0eShvbGRfbmFtZV9wcm9wZXJ0eSksCi0gICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfcHJvcGVydGllc19jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX1RSVUUoCi0gICAgICBwcm9wZXJ0eV9lcXVhbHMoR2V0UHJvcGVydHkoQlRfUFJPUEVSVFlfQkROQU1FKSwgb2xkX25hbWVfcHJvcGVydHkpKQotICAgICAgPDwgIkJsdWV0b290aCBuYW1lICIKLSAgICAgIDw8IHByb3BlcnR5X2FzX25hbWUoR2V0UHJvcGVydHkoQlRfUFJPUEVSVFlfQkROQU1FKSktPm5hbWUKLSAgICAgIDw8ICIgZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgbmFtZSIgPDwgb2xkX25hbWU7Ci0KLSAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5kaXNhYmxlKCksIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgc2VtYXBob3JlX3dhaXQoYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT0ZGKSA8PCAiQWRhcHRlciBkaWQgbm90IHR1cm4gb2ZmLiI7Ci0gIHByb3BlcnR5X2ZyZWUobmV3X25hbWUpOwotICBwcm9wZXJ0eV9mcmVlKG9sZF9uYW1lX3Byb3BlcnR5KTsKLX0KLQotVEVTVF9GKEJsdWV0b290aFRlc3QsIEFkYXB0ZXJTdGFydERpc2NvdmVyeSkgewotICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmVuYWJsZSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX0VRKEdldFN0YXRlKCksIEJUX1NUQVRFX09OKQotICAgICAgPDwgIlRlc3Qgc2hvdWxkIGJlIHJ1biB3aXRoIEFkYXB0ZXIgZW5hYmxlZCI7Ci0KLSAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5zdGFydF9kaXNjb3ZlcnkoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBzZW1hcGhvcmVfd2FpdChkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX0VRKEdldERpc2NvdmVyeVN0YXRlKCksIEJUX0RJU0NPVkVSWV9TVEFSVEVEKQotICAgICAgPDwgIlVuYWJsZSB0byBzdGFydCBkaXNjb3ZlcnkuIjsKLQotICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmRpc2FibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9FUShHZXRTdGF0ZSgpLCBCVF9TVEFURV9PRkYpIDw8ICJBZGFwdGVyIGRpZCBub3QgdHVybiBvZmYuIjsKLX0KLQotVEVTVF9GKEJsdWV0b290aFRlc3QsIEFkYXB0ZXJDYW5jZWxEaXNjb3ZlcnkpIHsKLSAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5lbmFibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9FUShHZXRTdGF0ZSgpLCBCVF9TVEFURV9PTikKLSAgICAgIDw8ICJUZXN0IHNob3VsZCBiZSBydW4gd2l0aCBBZGFwdGVyIGVuYWJsZWQiOwotCi0gIEVYUEVDVF9FUShidF9pbnRlcmZhY2UoKS0+c3RhcnRfZGlzY292ZXJ5KCksIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgc2VtYXBob3JlX3dhaXQoZGlzY292ZXJ5X3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9FUShidF9pbnRlcmZhY2UoKS0+Y2FuY2VsX2Rpc2NvdmVyeSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotCi0gIEVYUEVDVF9FUShHZXREaXNjb3ZlcnlTdGF0ZSgpLCBCVF9ESVNDT1ZFUllfU1RPUFBFRCkKLSAgICAgIDw8ICJVbmFibGUgdG8gc3RvcCBkaXNjb3ZlcnkuIjsKLQotICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmRpc2FibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9FUShHZXRTdGF0ZSgpLCBCVF9TVEFURV9PRkYpIDw8ICJBZGFwdGVyIGRpZCBub3QgdHVybiBvZmYuIjsKLX0KLQotVEVTVF9GKEJsdWV0b290aFRlc3QsIEFkYXB0ZXJEaXNhYmxlRHVyaW5nQm9uZGluZykgewotICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT0ZGKQotICAgICAgPDwgIlRlc3Qgc2hvdWxkIGJlIHJ1biB3aXRoIEFkYXB0ZXIgZGlzYWJsZWQiOwotCi0gIFJhd0FkZHJlc3MgYmRhZGRyID0ge3sweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyfX07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGVzdFJlcGVhdENvdW50OyArK2kpIHsKLSAgICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmVuYWJsZSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gICAgc2VtYXBob3JlX3dhaXQoYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotICAgIEVYUEVDVF9FUShHZXRTdGF0ZSgpLCBCVF9TVEFURV9PTikgPDwgIkFkYXB0ZXIgZGlkIG5vdCB0dXJuIG9uLiI7Ci0KLSAgICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmNyZWF0ZV9ib25kKCZiZGFkZHIsIEJUX1RSQU5TUE9SVF9CUl9FRFIpLAotICAgICAgICAgICAgICBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0KLSAgICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmNhbmNlbF9ib25kKCZiZGFkZHIpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0KLSAgICBFWFBFQ1RfRVEoYnRfaW50ZXJmYWNlKCktPmRpc2FibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT0ZGKSA8PCAiQWRhcHRlciBkaWQgbm90IHR1cm4gb2ZmLiI7Ci0gIH0KLX0KLQotVEVTVF9GKEJsdWV0b290aFRlc3QsIEFkYXB0ZXJDbGVhbnVwRHVyaW5nRGlzY292ZXJ5KSB7Ci0gIEVYUEVDVF9FUShHZXRTdGF0ZSgpLCBCVF9TVEFURV9PRkYpCi0gICAgICA8PCAiVGVzdCBzaG91bGQgYmUgcnVuIHdpdGggQWRhcHRlciBkaXNhYmxlZCI7Ci0KLSAgYnRfY2FsbGJhY2tzX3QqIGJ0X2NhbGxiYWNrcyA9Ci0gICAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKS0+R2V0SEFMQ2FsbGJhY2tzKCk7Ci0gIEFTU0VSVF9UUlVFKGJ0X2NhbGxiYWNrcyAhPSBudWxscHRyKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGtUZXN0UmVwZWF0Q291bnQ7ICsraSkgewotICAgIGJ0X2ludGVyZmFjZSgpLT5pbml0KGJ0X2NhbGxiYWNrcywgZmFsc2UsIGZhbHNlLCAwLCBudWxscHRyLCBmYWxzZSk7Ci0gICAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5lbmFibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICAgIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgICBFWFBFQ1RfRVEoR2V0U3RhdGUoKSwgQlRfU1RBVEVfT04pIDw8ICJBZGFwdGVyIGRpZCBub3QgdHVybiBvbi4iOwotCi0gICAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5zdGFydF9kaXNjb3ZlcnkoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotCi0gICAgRVhQRUNUX0VRKGJ0X2ludGVyZmFjZSgpLT5kaXNhYmxlKCksIEJUX1NUQVRVU19TVUNDRVNTKTsKLSAgICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gICAgRVhQRUNUX0VRKEdldFN0YXRlKCksIEJUX1NUQVRFX09GRikgPDwgIkFkYXB0ZXIgZGlkIG5vdCB0dXJuIG9mZi4iOwotICAgIGJ0X2ludGVyZmFjZSgpLT5jbGVhbnVwKCk7Ci0gIH0KLX0KLQotfSAgLy8gYnR0ZXN0CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL2FkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuY2MgYi90ZXN0L3N1aXRlL2FkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTY2MGUuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdWl0ZS9hZGFwdGVyL2JsdWV0b290aF90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImFkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9wcm9wZXJ0eS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIE11dGV4IGxvY2sgdXNlZCBieSBjYWxsYmFja3MgdG8gcHJvdGVjdCB8Y2FsbGJhY2tfc2VtYXBob3Jlc198IGZyb20KLS8vIHJhY2V5IGJlaGF2aW91ciBjYXVzZWQgd2hlbiBXYWl0IGFuZCBOb3RpZnkgYXJlIGNhbGxlZCBhdCB0aGUgc2FtZSB0aW1lCi1zdGQ6Om11dGV4IGNhbGxiYWNrX2xvY2s7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYnR0ZXN0IHsKLQotdm9pZCBCbHVldG9vdGhUZXN0OjpTZXRVcCgpIHsKLSAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotICBidF9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgc3RhdGVfID0gQlRfU1RBVEVfT0ZGOwotICBwcm9wZXJ0aWVzX2NoYW5nZWRfY291bnRfID0gMDsKLSAgbGFzdF9jaGFuZ2VkX3Byb3BlcnRpZXNfID0gbnVsbHB0cjsKLSAgcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NoYW5nZWRfY291bnRfID0gMDsKLSAgcmVtb3RlX2RldmljZV9sYXN0X2NoYW5nZWRfcHJvcGVydGllc18gPSBudWxscHRyOwotICBkaXNjb3Zlcnlfc3RhdGVfID0gQlRfRElTQ09WRVJZX1NUT1BQRUQ7Ci0gIGFjbF9zdGF0ZV8gPSBCVF9BQ0xfU1RBVEVfRElTQ09OTkVDVEVEOwotICBib25kX3N0YXRlXyA9IEJUX0JPTkRfU1RBVEVfTk9ORTsKLQotICBhZGFwdGVyX3Byb3BlcnRpZXNfY2FsbGJhY2tfc2VtXyA9IHNlbWFwaG9yZV9uZXcoMCk7Ci0gIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYWxsYmFja19zZW1fID0gc2VtYXBob3JlX25ldygwKTsKLSAgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8gPSBzZW1hcGhvcmVfbmV3KDApOwotICBkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fID0gc2VtYXBob3JlX25ldygwKTsKLQotICByZW1vdmUoIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5jb25mLmVuY3J5cHRlZC1jaGVja3N1bSIpOwotICByZW1vdmUoIi9kYXRhL21pc2MvYmx1ZWRyb2lkL2J0X2NvbmZpZy5iYWsuZW5jcnlwdGVkLWNoZWNrc3VtIik7Ci0KLSAgYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEludGVyZmFjZTo6SW5pdGlhbGl6ZSgpOwotICBBU1NFUlRfVFJVRShibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpJc0luaXRpYWxpemVkKCkpOwotICBhdXRvIGJ0X2hhbF9pbnRlcmZhY2UgPSBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKTsKLSAgYnRfaGFsX2ludGVyZmFjZS0+QWRkT2JzZXJ2ZXIodGhpcyk7Ci0gIGJ0X2ludGVyZmFjZV8gPSBidF9oYWxfaW50ZXJmYWNlLT5HZXRIQUxJbnRlcmZhY2UoKTsKLSAgQVNTRVJUX05FKG51bGxwdHIsIGJ0X2ludGVyZmFjZV8pIDw8ICJidF9pbnRlcmZhY2UgaXMgbnVsbC4iOwotfQotCi12b2lkIEJsdWV0b290aFRlc3Q6OlRlYXJEb3duKCkgewotICBzZW1hcGhvcmVfZnJlZShhZGFwdGVyX3Byb3BlcnRpZXNfY2FsbGJhY2tfc2VtXyk7Ci0gIHNlbWFwaG9yZV9mcmVlKHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jYWxsYmFja19zZW1fKTsKLSAgc2VtYXBob3JlX2ZyZWUoYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotICBzZW1hcGhvcmVfZnJlZShkaXNjb3Zlcnlfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLQotICBhdXRvIGJ0X2hhbF9pbnRlcmZhY2UgPSBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoSW50ZXJmYWNlOjpHZXQoKTsKLSAgYnRfaGFsX2ludGVyZmFjZS0+UmVtb3ZlT2JzZXJ2ZXIodGhpcyk7Ci0gIGJ0X2hhbF9pbnRlcmZhY2UtPkNsZWFuVXAoKTsKLSAgQVNTRVJUX0ZBTFNFKGJ0X2hhbF9pbnRlcmZhY2UtPklzSW5pdGlhbGl6ZWQoKSk7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoVGVzdDo6Q2xlYXJTZW1hcGhvcmUoc2VtYXBob3JlX3QqIHNlbSkgewotICB3aGlsZSAoc2VtYXBob3JlX3RyeV93YWl0KHNlbSkpCi0gICAgOwotfQotCi1jb25zdCBidF9pbnRlcmZhY2VfdCogQmx1ZXRvb3RoVGVzdDo6YnRfaW50ZXJmYWNlKCkgeyByZXR1cm4gYnRfaW50ZXJmYWNlXzsgfQotCi1idF9zdGF0ZV90IEJsdWV0b290aFRlc3Q6OkdldFN0YXRlKCkgeyByZXR1cm4gc3RhdGVfOyB9Ci0KLWludCBCbHVldG9vdGhUZXN0OjpHZXRQcm9wZXJ0aWVzQ2hhbmdlZENvdW50KCkgewotICByZXR1cm4gcHJvcGVydGllc19jaGFuZ2VkX2NvdW50XzsKLX0KLQotYnRfcHJvcGVydHlfdCogQmx1ZXRvb3RoVGVzdDo6R2V0UHJvcGVydHkoYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzX2NoYW5nZWRfY291bnRfOyArK2kpIHsKLSAgICBpZiAobGFzdF9jaGFuZ2VkX3Byb3BlcnRpZXNfW2ldLnR5cGUgPT0gdHlwZSkgewotICAgICAgcmV0dXJuICZsYXN0X2NoYW5nZWRfcHJvcGVydGllc19baV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1idF9wcm9wZXJ0eV90KiBCbHVldG9vdGhUZXN0OjpHZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eShjb25zdCBSYXdBZGRyZXNzKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpIHsKLSAgaWYgKGN1cnJfcmVtb3RlX2RldmljZV8gIT0gKmFkZHIpIHJldHVybiBudWxscHRyOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NoYW5nZWRfY291bnRfOyBpKyspIHsKLSAgICBpZiAocmVtb3RlX2RldmljZV9sYXN0X2NoYW5nZWRfcHJvcGVydGllc19baV0udHlwZSA9PSB0eXBlKSB7Ci0gICAgICByZXR1cm4gJnJlbW90ZV9kZXZpY2VfbGFzdF9jaGFuZ2VkX3Byb3BlcnRpZXNfW2ldOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotYnRfZGlzY292ZXJ5X3N0YXRlX3QgQmx1ZXRvb3RoVGVzdDo6R2V0RGlzY292ZXJ5U3RhdGUoKSB7Ci0gIHJldHVybiBkaXNjb3Zlcnlfc3RhdGVfOwotfQotCi1idF9hY2xfc3RhdGVfdCBCbHVldG9vdGhUZXN0OjpHZXRBY2xTdGF0ZSgpIHsgcmV0dXJuIGFjbF9zdGF0ZV87IH0KLQotLy8gUmV0dXJucyB0aGUgZGV2aWNlIGJvbmQgc3RhdGUuCi1idF9ib25kX3N0YXRlX3QgQmx1ZXRvb3RoVGVzdDo6R2V0Qm9uZFN0YXRlKCkgeyByZXR1cm4gYm9uZF9zdGF0ZV87IH0KLQotLy8gY2FsbGJhY2sKLXZvaWQgQmx1ZXRvb3RoVGVzdDo6QWRhcHRlclN0YXRlQ2hhbmdlZENhbGxiYWNrKGJ0X3N0YXRlX3QgbmV3X3N0YXRlKSB7Ci0gIHN0YXRlXyA9IG5ld19zdGF0ZTsKLSAgc2VtYXBob3JlX3Bvc3QoYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotfQotCi0vLyBjYWxsYmFjawotdm9pZCBCbHVldG9vdGhUZXN0OjpBZGFwdGVyUHJvcGVydGllc0NhbGxiYWNrKGJ0X3N0YXR1c190IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogbmV3X3Byb3BlcnRpZXMpIHsKLSAgcHJvcGVydHlfZnJlZV9hcnJheShsYXN0X2NoYW5nZWRfcHJvcGVydGllc18sIHByb3BlcnRpZXNfY2hhbmdlZF9jb3VudF8pOwotICBsYXN0X2NoYW5nZWRfcHJvcGVydGllc18gPQotICAgICAgcHJvcGVydHlfY29weV9hcnJheShuZXdfcHJvcGVydGllcywgbnVtX3Byb3BlcnRpZXMpOwotICBwcm9wZXJ0aWVzX2NoYW5nZWRfY291bnRfID0gbnVtX3Byb3BlcnRpZXM7Ci0gIHNlbWFwaG9yZV9wb3N0KGFkYXB0ZXJfcHJvcGVydGllc19jYWxsYmFja19zZW1fKTsKLX0KLQotLy8gY2FsbGJhY2sKLXZvaWQgQmx1ZXRvb3RoVGVzdDo6UmVtb3RlRGV2aWNlUHJvcGVydGllc0NhbGxiYWNrKGJ0X3N0YXR1c190IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0FkZHJlc3MqIHJlbW90ZV9iZF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICBjdXJyX3JlbW90ZV9kZXZpY2VfID0gKnJlbW90ZV9iZF9hZGRyOwotICBwcm9wZXJ0eV9mcmVlX2FycmF5KHJlbW90ZV9kZXZpY2VfbGFzdF9jaGFuZ2VkX3Byb3BlcnRpZXNfLAotICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllc19jaGFuZ2VkX2NvdW50Xyk7Ci0gIHJlbW90ZV9kZXZpY2VfbGFzdF9jaGFuZ2VkX3Byb3BlcnRpZXNfID0KLSAgICAgIHByb3BlcnR5X2NvcHlfYXJyYXkocHJvcGVydGllcywgbnVtX3Byb3BlcnRpZXMpOwotICByZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2hhbmdlZF9jb3VudF8gPSBudW1fcHJvcGVydGllczsKLSAgc2VtYXBob3JlX3Bvc3QocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NhbGxiYWNrX3NlbV8pOwotfQotCi0vLyBjYWxsYmFjawotdm9pZCBCbHVldG9vdGhUZXN0OjpEaXNjb3ZlcnlTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9kaXNjb3Zlcnlfc3RhdGVfdCBzdGF0ZSkgewotICBkaXNjb3Zlcnlfc3RhdGVfID0gc3RhdGU7Ci0gIHNlbWFwaG9yZV9wb3N0KGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV8pOwotfQotCi19ICAvLyBidHRlc3QKZGlmZiAtLWdpdCBhL3Rlc3Qvc3VpdGUvYWRhcHRlci9ibHVldG9vdGhfdGVzdC5oIGIvdGVzdC9zdWl0ZS9hZGFwdGVyL2JsdWV0b290aF90ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjUyYzguLjAwMDAwMDAKLS0tIGEvdGVzdC9zdWl0ZS9hZGFwdGVyL2JsdWV0b290aF90ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYnRfZ2F0dC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3Bhbi5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2J0X3NvY2suaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvc2VtYXBob3JlLmgiCi0jaW5jbHVkZSAic2VydmljZS9oYWwvYmx1ZXRvb3RoX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBidHRlc3QgewotCi0vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIEJsdWV0b290aCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgcHJvdmlkZXMKLS8vIGhlbHBlcnMgYW5kIGNhbGxiYWNrcyBmb3IgR1VuaXQgdG8gdXNlIGZvciB0ZXN0aW5nLgotY2xhc3MgQmx1ZXRvb3RoVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhJbnRlcmZhY2U6Ok9ic2VydmVyIHsKLSBwcm90ZWN0ZWQ6Ci0gIEJsdWV0b290aFRlc3QoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkJsdWV0b290aFRlc3QoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gR2V0dGVyIGZvciB0aGUgYnRfaW50ZXJmYWNlCi0gIGNvbnN0IGJ0X2ludGVyZmFjZV90KiBidF9pbnRlcmZhY2UoKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBCbHVldG9vdGggSW50ZXJmYWNlCi0gIGJ0X3N0YXRlX3QgR2V0U3RhdGUoKTsKLQotICAvLyBHZXQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIG9uIHRoZQotICAvLyBBZGFwdGVyIFByb3BlcnRpZXMgY2FsbGJhY2sKLSAgaW50IEdldFByb3BlcnRpZXNDaGFuZ2VkQ291bnQoKTsKLQotICAvLyBHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgcHJvcGVydHkKLSAgYnRfcHJvcGVydHlfdCogR2V0UHJvcGVydHkoYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpOwotCi0gIC8vIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyByZW1vdGUgZGV2aWNlIHByb3BlcnR5Ci0gIGJ0X3Byb3BlcnR5X3QqIEdldFJlbW90ZURldmljZVByb3BlcnR5KGNvbnN0IFJhd0FkZHJlc3MqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKTsKLQotICAvLyBHZXQgdGhlIGN1cnJlbnQgZGlzY292ZXJ5IHN0YXRlCi0gIGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IEdldERpc2NvdmVyeVN0YXRlKCk7Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IEFjbCBTdGF0ZQotICBidF9hY2xfc3RhdGVfdCBHZXRBY2xTdGF0ZSgpOwotCi0gIC8vIEdldCB0aGUgY3VycmVudCBCb25kIFN0YXRlCi0gIGJ0X2JvbmRfc3RhdGVfdCBHZXRCb25kU3RhdGUoKTsKLQotICAvLyBSZXNldCBhIHNlbWFwaG9yZXMgY291bnQgdG8gMAotICB2b2lkIENsZWFyU2VtYXBob3JlKHNlbWFwaG9yZV90KiBzZW0pOwotCi0gIC8vIFNldFVwIGluaXRpYWxpemVzIHRoZSBCbHVldG9vdGggaW50ZXJmYWNlIGFuZCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcwotICAvLyBiZWZvcmUgcnVubmluZyBldmVyeSB0ZXN0Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKLQotICAvLyBUZWFyRG93biBjbGVhbnMgdXAgdGhlIHN0YWNrIGFuZCBpbnRlcmZhY2UgYXQgdGhlIGVuZCBvZiBldmVyeSB0ZXN0Ci0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKLQotICAvLyBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBjaGFuZ2VzCi0gIHZvaWQgQWRhcHRlclByb3BlcnRpZXNDYWxsYmFjayhidF9zdGF0dXNfdCBzdGF0dXMsIGludCBudW1fcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnRpZXMpIG92ZXJyaWRlOwotCi0gIC8vIEEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgcmVtb3RlIGRldmljZSdzIHByb3BlcnR5IGNoYW5nZXMKLSAgdm9pZCBSZW1vdGVEZXZpY2VQcm9wZXJ0aWVzQ2FsbGJhY2soYnRfc3RhdHVzX3Qgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzKSBvdmVycmlkZTsKLQotICAvLyBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGFkYXB0ZXIgc3RhdGUgY2hhbmdlcwotICB2b2lkIEFkYXB0ZXJTdGF0ZUNoYW5nZWRDYWxsYmFjayhidF9zdGF0ZV90IHN0YXRlKSBvdmVycmlkZTsKLQotICAvLyBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIERpc2NvdmVyeSBzdGF0ZSBjaGFuZ2VzCi0gIHZvaWQgRGlzY292ZXJ5U3RhdGVDaGFuZ2VkQ2FsbGJhY2soYnRfZGlzY292ZXJ5X3N0YXRlX3Qgc3RhdGUpIG92ZXJyaWRlOwotCi0gIC8vIFNlbWFwaG9yZXMgdXNlZCB0byB3YWl0IGZvciBzcGVjaWZpYyBjYWxsYmFjayBleGVjdXRpb24uIEVhY2ggY2FsbGJhY2sKLSAgLy8gaGFzIGl0cyBvd24gc2VtYXBob3JlIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgc2VtYXBob3JlX3QqIGFkYXB0ZXJfcHJvcGVydGllc19jYWxsYmFja19zZW1fOwotICBzZW1hcGhvcmVfdCogcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NhbGxiYWNrX3NlbV87Ci0gIHNlbWFwaG9yZV90KiBhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXzsKLSAgc2VtYXBob3JlX3QqIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkX2NhbGxiYWNrX3NlbV87Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgYmx1ZXRvb3RoIGludGVyZmFjZSB0aGF0IGFsbCB0aGUgdGVzdHMgdXNlIHRvIGludGVyYWN0IHdpdGggdGhlIEhBTAotICBjb25zdCBidF9pbnRlcmZhY2VfdCogYnRfaW50ZXJmYWNlXzsKLQotICBidF9zdGF0ZV90IHN0YXRlXzsKLSAgaW50IHByb3BlcnRpZXNfY2hhbmdlZF9jb3VudF87Ci0gIGJ0X3Byb3BlcnR5X3QqIGxhc3RfY2hhbmdlZF9wcm9wZXJ0aWVzXzsKLSAgUmF3QWRkcmVzcyBjdXJyX3JlbW90ZV9kZXZpY2VfOwotICBpbnQgcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NoYW5nZWRfY291bnRfOwotICBidF9wcm9wZXJ0eV90KiByZW1vdGVfZGV2aWNlX2xhc3RfY2hhbmdlZF9wcm9wZXJ0aWVzXzsKLSAgYnRfZGlzY292ZXJ5X3N0YXRlX3QgZGlzY292ZXJ5X3N0YXRlXzsKLSAgYnRfYWNsX3N0YXRlX3QgYWNsX3N0YXRlXzsKLSAgYnRfYm9uZF9zdGF0ZV90IGJvbmRfc3RhdGVfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihCbHVldG9vdGhUZXN0KTsKLX07Ci0KLX0gIC8vIGJ0dGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9zdWl0ZS9nYXR0L2dhdHRfdGVzdC5jYyBiL3Rlc3Qvc3VpdGUvZ2F0dC9nYXR0X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMGU1ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdWl0ZS9nYXR0L2dhdHRfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJnYXR0L2dhdHRfdGVzdC5oIgotCi0jaW5jbHVkZSAiYWRhcHRlci9ibHVldG9vdGhfdGVzdC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJ0dGVzdCB7Ci0KLXZvaWQgR2F0dFRlc3Q6OlNldFVwKCkgewotICBnYXR0X2NsaWVudF9pbnRlcmZhY2VfID0gbnVsbHB0cjsKLSAgZ2F0dF9zZXJ2ZXJfaW50ZXJmYWNlXyA9IG51bGxwdHI7Ci0KLSAgY2xpZW50X2ludGVyZmFjZV9pZF8gPSAwOwotICBzZXJ2ZXJfaW50ZXJmYWNlX2lkXyA9IDA7Ci0gIHNlcnZpY2VfaGFuZGxlXyA9IDA7Ci0gIGNoYXJhY3RlcmlzdGljX2hhbmRsZV8gPSAwOwotICBkZXNjcmlwdG9yX2hhbmRsZV8gPSAwOwotICBzdGF0dXNfID0gMDsKLQotICBCbHVldG9vdGhUZXN0OjpTZXRVcCgpOwotICBBU1NFUlRfRVEoYnRfaW50ZXJmYWNlKCktPmVuYWJsZSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX1RSVUUoR2V0U3RhdGUoKSA9PSBCVF9TVEFURV9PTik7Ci0KLSAgcmVnaXN0ZXJfY2xpZW50X2NhbGxiYWNrX3NlbV8gPSBzZW1hcGhvcmVfbmV3KDApOwotICBzY2FuX3Jlc3VsdF9jYWxsYmFja19zZW1fID0gc2VtYXBob3JlX25ldygwKTsKLQotICByZWdpc3Rlcl9zZXJ2ZXJfY2FsbGJhY2tfc2VtXyA9IHNlbWFwaG9yZV9uZXcoMCk7Ci0gIHNlcnZpY2VfYWRkZWRfY2FsbGJhY2tfc2VtXyA9IHNlbWFwaG9yZV9uZXcoMCk7Ci0gIHNlcnZpY2Vfc3RvcHBlZF9jYWxsYmFja19zZW1fID0gc2VtYXBob3JlX25ldygwKTsKLSAgc2VydmljZV9kZWxldGVkX2NhbGxiYWNrX3NlbV8gPSBzZW1hcGhvcmVfbmV3KDApOwotCi0gIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJbml0aWFsaXplKCk7Ci0gIEFTU0VSVF9UUlVFKGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlOjpJc0luaXRpYWxpemVkKCkpOwotICBhdXRvIGdhdHRfaW50ZXJmYWNlID0gYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OkdldCgpOwotICBnYXR0X2ludGVyZmFjZS0+QWRkQ2xpZW50T2JzZXJ2ZXIodGhpcyk7Ci0gIGdhdHRfaW50ZXJmYWNlLT5BZGRTZXJ2ZXJPYnNlcnZlcih0aGlzKTsKLQotICBnYXR0X2NsaWVudF9pbnRlcmZhY2VfID0gZ2F0dF9pbnRlcmZhY2UtPkdldENsaWVudEhBTEludGVyZmFjZSgpOwotICBnYXR0X3NlcnZlcl9pbnRlcmZhY2VfID0gZ2F0dF9pbnRlcmZhY2UtPkdldFNlcnZlckhBTEludGVyZmFjZSgpOwotCi0gIEFTU0VSVF9ORShudWxscHRyLCBnYXR0X2NsaWVudF9pbnRlcmZhY2VfKTsKLSAgQVNTRVJUX05FKG51bGxwdHIsIGdhdHRfc2VydmVyX2ludGVyZmFjZV8pOwotfQotCi12b2lkIEdhdHRUZXN0OjpUZWFyRG93bigpIHsKLSAgZ2F0dF9jbGllbnRfaW50ZXJmYWNlXyA9IG51bGxwdHI7Ci0gIGdhdHRfc2VydmVyX2ludGVyZmFjZV8gPSBudWxscHRyOwotCi0gIHNlbWFwaG9yZV9mcmVlKHJlZ2lzdGVyX2NsaWVudF9jYWxsYmFja19zZW1fKTsKLSAgc2VtYXBob3JlX2ZyZWUoc2Nhbl9yZXN1bHRfY2FsbGJhY2tfc2VtXyk7Ci0KLSAgc2VtYXBob3JlX2ZyZWUocmVnaXN0ZXJfc2VydmVyX2NhbGxiYWNrX3NlbV8pOwotICBzZW1hcGhvcmVfZnJlZShzZXJ2aWNlX2FkZGVkX2NhbGxiYWNrX3NlbV8pOwotICBzZW1hcGhvcmVfZnJlZShzZXJ2aWNlX3N0b3BwZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIHNlbWFwaG9yZV9mcmVlKHNlcnZpY2VfZGVsZXRlZF9jYWxsYmFja19zZW1fKTsKLQotICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xlYW5VcCgpOwotCi0gIEFTU0VSVF9FUShidF9pbnRlcmZhY2UoKS0+ZGlzYWJsZSgpLCBCVF9TVEFUVVNfU1VDQ0VTUyk7Ci0gIHNlbWFwaG9yZV93YWl0KGFkYXB0ZXJfc3RhdGVfY2hhbmdlZF9jYWxsYmFja19zZW1fKTsKLSAgQmx1ZXRvb3RoVGVzdDo6VGVhckRvd24oKTsKLX0KLQotY29uc3QgQmxlU2Nhbm5lckludGVyZmFjZSogR2F0dFRlc3Q6OmdhdHRfc2Nhbm5lcl9pbnRlcmZhY2UoKSB7Ci0gIHJldHVybiBnYXR0X3NjYW5uZXJfaW50ZXJmYWNlXzsKLX0KLQotY29uc3QgYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCogR2F0dFRlc3Q6OmdhdHRfY2xpZW50X2ludGVyZmFjZSgpIHsKLSAgcmV0dXJuIGdhdHRfY2xpZW50X2ludGVyZmFjZV87Ci19Ci0KLWNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QqIEdhdHRUZXN0OjpnYXR0X3NlcnZlcl9pbnRlcmZhY2UoKSB7Ci0gIHJldHVybiBnYXR0X3NlcnZlcl9pbnRlcmZhY2VfOwotfQotCi12b2lkIEdhdHRUZXN0OjpSZWdpc3RlckNsaWVudENhbGxiYWNrKAotICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiB1bnVzZWQgKi8sIGludCBzdGF0dXMsCi0gICAgaW50IGNsaWVudElmLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIGFwcF91dWlkKSB7Ci0gIHN0YXR1c18gPSBzdGF0dXM7Ci0gIGNsaWVudF9pbnRlcmZhY2VfaWRfID0gY2xpZW50SWY7Ci0gIHNlbWFwaG9yZV9wb3N0KHJlZ2lzdGVyX2NsaWVudF9jYWxsYmFja19zZW1fKTsKLX0KLQotdm9pZCBHYXR0VGVzdDo6U2NhblJlc3VsdENhbGxiYWNrKAotICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiB1bnVzZWQgKi8sIGNvbnN0IFJhd0FkZHJlc3MmIGJkYSwKLSAgICBpbnQgcnNzaSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWR2X2RhdGEpIHsKLSAgc2VtYXBob3JlX3Bvc3Qoc2Nhbl9yZXN1bHRfY2FsbGJhY2tfc2VtXyk7Ci19Ci0KLS8vIEdBVFQgc2VydmVyIGNhbGxiYWNrcwotdm9pZCBHYXR0VGVzdDo6UmVnaXN0ZXJTZXJ2ZXJDYWxsYmFjaygKLSAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogdW51c2VkICovLCBpbnQgc3RhdHVzLAotICAgIGludCBzZXJ2ZXJfaWYsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgdXVpZCkgewotICBzdGF0dXNfID0gc3RhdHVzOwotICBzZXJ2ZXJfaW50ZXJmYWNlX2lkXyA9IHNlcnZlcl9pZjsKLSAgc2VtYXBob3JlX3Bvc3QocmVnaXN0ZXJfc2VydmVyX2NhbGxiYWNrX3NlbV8pOwotfQotCi12b2lkIEdhdHRUZXN0OjpTZXJ2aWNlQWRkZWRDYWxsYmFjaygKLSAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogdW51c2VkICovLCBpbnQgc3RhdHVzLAotICAgIGludCBzZXJ2ZXJfaWYsIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2UpIHsKLSAgc3RhdHVzXyA9IHN0YXR1czsKLSAgc2VydmVyX2ludGVyZmFjZV9pZF8gPSBzZXJ2ZXJfaWY7Ci0gIHNlcnZpY2VfaGFuZGxlXyA9IHNlcnZpY2VbMF0uYXR0cmlidXRlX2hhbmRsZTsKLSAgc2VtYXBob3JlX3Bvc3Qoc2VydmljZV9hZGRlZF9jYWxsYmFja19zZW1fKTsKLX0KLQotdm9pZCBHYXR0VGVzdDo6U2VydmljZVN0b3BwZWRDYWxsYmFjaygKLSAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogdW51c2VkICovLCBpbnQgc3RhdHVzLAotICAgIGludCBzZXJ2ZXJfaWYsIGludCBzcnZjX2hhbmRsZSkgewotICBzdGF0dXNfID0gc3RhdHVzOwotICBzZXJ2ZXJfaW50ZXJmYWNlX2lkXyA9IHNlcnZlcl9pZjsKLSAgc2VydmljZV9oYW5kbGVfID0gc3J2Y19oYW5kbGU7Ci0gIHNlbWFwaG9yZV9wb3N0KHNlcnZpY2Vfc3RvcHBlZF9jYWxsYmFja19zZW1fKTsKLX0KLQotdm9pZCBHYXR0VGVzdDo6U2VydmljZURlbGV0ZWRDYWxsYmFjaygKLSAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogdW51c2VkICovLCBpbnQgc3RhdHVzLAotICAgIGludCBzZXJ2ZXJfaWYsIGludCBzcnZjX2hhbmRsZSkgewotICBzdGF0dXNfID0gc3RhdHVzOwotICBzZXJ2ZXJfaW50ZXJmYWNlX2lkXyA9IHNlcnZlcl9pZjsKLSAgc2VydmljZV9oYW5kbGVfID0gc3J2Y19oYW5kbGU7Ci0gIHNlbWFwaG9yZV9wb3N0KHNlcnZpY2VfZGVsZXRlZF9jYWxsYmFja19zZW1fKTsKLX0KLQotfSAgLy8gYnR0ZXN0CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL2dhdHQvZ2F0dF90ZXN0LmggYi90ZXN0L3N1aXRlL2dhdHQvZ2F0dF90ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2VhNzMuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdWl0ZS9nYXR0L2dhdHRfdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImFkYXB0ZXIvYmx1ZXRvb3RoX3Rlc3QuaCIKLSNpbmNsdWRlICJzZXJ2aWNlL2hhbC9ibHVldG9vdGhfZ2F0dF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy9ibHVldG9vdGgvdXVpZC5oIgotI2luY2x1ZGUgInR5cGVzL3Jhd19hZGRyZXNzLmgiCi0KLW5hbWVzcGFjZSBidHRlc3QgewotCi0vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIEJsdWV0b290aCBHQVRUIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCBwcm92aWRlcwotLy8gaGVscGVycyBhbmQgY2FsbGJhY2tzIGZvciBHVW5pdCB0byB1c2UgZm9yIHRlc3RpbmcgZ2F0dC4KLWNsYXNzIEdhdHRUZXN0IDogcHVibGljIEJsdWV0b290aFRlc3QsCi0gICAgICAgICAgICAgICAgIHB1YmxpYyBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgIHB1YmxpYyBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6U2Nhbm5lck9ic2VydmVyLAotICAgICAgICAgICAgICAgICBwdWJsaWMgYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNlcnZlck9ic2VydmVyIHsKLSBwcm90ZWN0ZWQ6Ci0gIEdhdHRUZXN0KCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5HYXR0VGVzdCgpID0gZGVmYXVsdDsKLQotICAvLyBHZXRzIHRoZSBnYXR0X3NjYW5uZXJfaW50ZXJmYWNlCi0gIGNvbnN0IEJsZVNjYW5uZXJJbnRlcmZhY2UqIGdhdHRfc2Nhbm5lcl9pbnRlcmZhY2UoKTsKLQotICAvLyBHZXRzIHRoZSBnYXR0X2NsaWVudF9pbnRlcmZhY2UKLSAgY29uc3QgYnRnYXR0X2NsaWVudF9pbnRlcmZhY2VfdCogZ2F0dF9jbGllbnRfaW50ZXJmYWNlKCk7Ci0KLSAgLy8gR2V0cyB0aGUgZ2F0dF9zZXJ2ZXJfaW50ZXJmYWNlCi0gIGNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfaW50ZXJmYWNlX3QqIGdhdHRfc2VydmVyX2ludGVyZmFjZSgpOwotCi0gIC8vIEdldHRlcnMgZm9yIHZhcmlhYmxlcyB0aGF0IHRyYWNrIEdBVFQtcmVsYXRlZCBzdGF0ZQotICBpbnQgY2xpZW50X2ludGVyZmFjZV9pZCgpIGNvbnN0IHsgcmV0dXJuIGNsaWVudF9pbnRlcmZhY2VfaWRfOyB9Ci0gIGludCBzZXJ2ZXJfaW50ZXJmYWNlX2lkKCkgY29uc3QgeyByZXR1cm4gc2VydmVyX2ludGVyZmFjZV9pZF87IH0KLSAgaW50IHNlcnZpY2VfaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gc2VydmljZV9oYW5kbGVfOyB9Ci0gIGludCBjaGFyYWN0ZXJpc3RpY19oYW5kbGUoKSBjb25zdCB7IHJldHVybiBjaGFyYWN0ZXJpc3RpY19oYW5kbGVfOyB9Ci0gIGludCBkZXNjcmlwdG9yX2hhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGRlc2NyaXB0b3JfaGFuZGxlXzsgfQotICBpbnQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQotCi0gIC8vIFNldFVwIGluaXRpYWxpemVzIHRoZSBCbHVldG9vdGggaW50ZXJmYWNlcyBhbmQgdGhlIEdBVFQgSW50ZXJmYWNlIGFzIHdlbGwKLSAgLy8gYXMgcmVnaXN0ZXJzIHRoZSBjYWxsYmFja3MgYW5kIGluaXRpYWxpemVzIHRoZSBzZW1hcGhvcmVzIGJlZm9yZSBldmVyeSB0ZXN0Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotCi0gIC8vIFRlYXJEb3duIGNsZWFucyB1cCB0aGUgQmx1ZXRvb3RoIGFuZCBHQVRUIGludGVyZmFjZXMgYW5kIGRlc3Ryb3lzIHRoZQotICAvLyBjYWxsYmFjayBzZW1hcGhvcmVzIGF0IHRoZSBlbmQgb2YgZXZlcnkgdGVzdAotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLQotICAvLyBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZTo6Q2xpZW50T2JzZXJ2ZXIgb3ZlcnJpZGVzCi0gIHZvaWQgUmVnaXN0ZXJDbGllbnRDYWxsYmFjaygKLSAgICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiB1bnVzZWQgKi8sIGludCBzdGF0dXMsCi0gICAgICBpbnQgY2xpZW50SWYsIGNvbnN0IGJsdWV0b290aDo6VXVpZCYgYXBwX3V1aWQpIG92ZXJyaWRlOwotICB2b2lkIFNjYW5SZXN1bHRDYWxsYmFjayhibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogdW51c2VkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdBZGRyZXNzJiBiZGEsIGludCByc3NpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZfZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgLy8gYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2U6OlNlcnZlck9ic2VydmVyIG92ZXJyaWRlcwotICB2b2lkIFJlZ2lzdGVyU2VydmVyQ2FsbGJhY2soCi0gICAgICBibHVldG9vdGg6OmhhbDo6Qmx1ZXRvb3RoR2F0dEludGVyZmFjZSogLyogdW51c2VkICovLCBpbnQgc3RhdHVzLAotICAgICAgaW50IHNlcnZlcl9pZiwgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiB1dWlkKSBvdmVycmlkZTsKLSAgdm9pZCBTZXJ2aWNlQWRkZWRDYWxsYmFjaygKLSAgICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiB1bnVzZWQgKi8sIGludCBzdGF0dXMsCi0gICAgICBpbnQgc2VydmVyX2lmLCBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlKSBvdmVycmlkZTsKLSAgdm9pZCBTZXJ2aWNlU3RvcHBlZENhbGxiYWNrKAotICAgICAgYmx1ZXRvb3RoOjpoYWw6OkJsdWV0b290aEdhdHRJbnRlcmZhY2UqIC8qIHVudXNlZCAqLywgaW50IHN0YXR1cywKLSAgICAgIGludCBzZXJ2ZXJfaWYsIGludCBzcnZjX2hhbmRsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2VydmljZURlbGV0ZWRDYWxsYmFjaygKLSAgICAgIGJsdWV0b290aDo6aGFsOjpCbHVldG9vdGhHYXR0SW50ZXJmYWNlKiAvKiB1bnVzZWQgKi8sIGludCBzdGF0dXMsCi0gICAgICBpbnQgc2VydmVyX2lmLCBpbnQgc3J2Y19oYW5kbGUpIG92ZXJyaWRlOwotCi0gIC8vIFNlbWFwaG9yZXMgdXNlZCB0byB3YWl0IGZvciBzcGVjaWZpYyBjYWxsYmFjayBleGVjdXRpb24uIEVhY2ggY2FsbGJhY2sKLSAgLy8gaGFzIGl0cyBvd24gc2VtYXBob3JlIGFzc29jaWF0ZWQgd2l0aCBpdAotICBzZW1hcGhvcmVfdCogcmVnaXN0ZXJfY2xpZW50X2NhbGxiYWNrX3NlbV87Ci0gIHNlbWFwaG9yZV90KiBzY2FuX3Jlc3VsdF9jYWxsYmFja19zZW1fOwotICBzZW1hcGhvcmVfdCogbGlzdGVuX2NhbGxiYWNrX3NlbV87Ci0KLSAgc2VtYXBob3JlX3QqIHJlZ2lzdGVyX3NlcnZlcl9jYWxsYmFja19zZW1fOwotICBzZW1hcGhvcmVfdCogc2VydmljZV9hZGRlZF9jYWxsYmFja19zZW1fOwotICBzZW1hcGhvcmVfdCogY2hhcmFjdGVyaXN0aWNfYWRkZWRfY2FsbGJhY2tfc2VtXzsKLSAgc2VtYXBob3JlX3QqIGRlc2NyaXB0b3JfYWRkZWRfY2FsbGJhY2tfc2VtXzsKLSAgc2VtYXBob3JlX3QqIHNlcnZpY2Vfc3RhcnRlZF9jYWxsYmFja19zZW1fOwotICBzZW1hcGhvcmVfdCogc2VydmljZV9zdG9wcGVkX2NhbGxiYWNrX3NlbV87Ci0gIHNlbWFwaG9yZV90KiBzZXJ2aWNlX2RlbGV0ZWRfY2FsbGJhY2tfc2VtXzsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBidGdhdHRfc2Nhbm5lcl9pbnRlcmZhY2VfdCB0aGF0IGFsbCB0aGUgdGVzdHMgdXNlIHRvIGludGVyYWN0IHdpdGggdGhlCi0gIC8vIEhBTAotICBjb25zdCBCbGVTY2FubmVySW50ZXJmYWNlKiBnYXR0X3NjYW5uZXJfaW50ZXJmYWNlXzsKLQotICAvLyBUaGUgZ2F0dF9jbGllbnRfaW50ZXJmYWNlIHRoYXQgYWxsIHRoZSB0ZXN0cyB1c2UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgSEFMCi0gIGNvbnN0IGJ0Z2F0dF9jbGllbnRfaW50ZXJmYWNlX3QqIGdhdHRfY2xpZW50X2ludGVyZmFjZV87Ci0KLSAgLy8gVGhlIGdhdHRfc2VydmVyX2ludGVyZmFjZSB0aGF0IGFsbCB0aGUgdGVzdHMgdXNlIHRvIGludGVyYWN0IHdpdGggdGhlIEhBTAotICBjb25zdCBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90KiBnYXR0X3NlcnZlcl9pbnRlcmZhY2VfOwotCi0gIC8vIE5vIG11dGV4IG5lZWRlZCBmb3IgdGhlc2UgYXMgdGhlIHNlbWFwaG9yZXMgc2hvdWxkIGVuc3VyZQotICAvLyBzeW5jaHJvbm91cyBhY2Nlc3MKLQotICAvLyBBbiBJRCB0aGF0IGlzIHVzZWQgYXMgYSBoYW5kbGUgZm9yIGVhY2ggZ2F0dCBjbGllbnQuCi0gIGludCBjbGllbnRfaW50ZXJmYWNlX2lkXzsKLQotICAvLyBBbiBJRCB0aGF0IGlzIHVzZWQgYXMgYSBoYW5kbGUgZm9yIGVhY2ggZ2F0dCBzZXJ2ZXIuCi0gIGludCBzZXJ2ZXJfaW50ZXJmYWNlX2lkXzsKLQotICAvLyBBIGhhbmRsZSB0byB0aGUgbGFzdCB1c2VkIHNlcnZpY2UuCi0gIGludCBzZXJ2aWNlX2hhbmRsZV87Ci0KLSAgLy8gQSBoYW5kbGUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyaXN0aWMgYWRkZWQuCi0gIGludCBjaGFyYWN0ZXJpc3RpY19oYW5kbGVfOwotCi0gIC8vIEEgaGFuZGxlIHRvIHRoZSBsYXN0IGRlc2NyaXB0b3IgYWRkZWQuCi0gIGludCBkZXNjcmlwdG9yX2hhbmRsZV87Ci0KLSAgLy8gVGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBjYWxsYmFjay4gSXMgQlRfU1RBVFVTX1NVQ0NFU1MgaWYgbm8gaXNzdWVzLgotICBpbnQgc3RhdHVzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR2F0dFRlc3QpOwotfTsKLQotfSAgLy8gYnR0ZXN0CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL2dhdHQvZ2F0dF91bml0dGVzdC5jYyBiL3Rlc3Qvc3VpdGUvZ2F0dC9nYXR0X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMzY2Q1Li4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3VpdGUvZ2F0dC9nYXR0X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTUgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgImdhdHQvZ2F0dF90ZXN0LmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLQotbmFtZXNwYWNlIGJ0dGVzdCB7Ci0KLVRFU1RfRihHYXR0VGVzdCwgR2F0dENsaWVudFJlZ2lzdGVyKSB7Ci0gIC8vIFJlZ2lzdGVycyBnYXR0IGNsaWVudC4KLSAgYmx1ZXRvb3RoOjpVdWlkIGdhdHRfY2xpZW50X3V1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkdldFJhbmRvbSgpOwotICBnYXR0X2NsaWVudF9pbnRlcmZhY2UoKS0+cmVnaXN0ZXJfY2xpZW50KGdhdHRfY2xpZW50X3V1aWQsIGZhbHNlKTsKLSAgc2VtYXBob3JlX3dhaXQocmVnaXN0ZXJfY2xpZW50X2NhbGxiYWNrX3NlbV8pOwotICBFWFBFQ1RfVFJVRShzdGF0dXMoKSA9PSBCVF9TVEFUVVNfU1VDQ0VTUykKLSAgICAgIDw8ICJFcnJvciByZWdpc3RlcmluZyBHQVRUIGNsaWVudCBhcHAgY2FsbGJhY2suIjsKLQotICAvLyBVbnJlZ2lzdGVycyBnYXR0IGNsaWVudC4gTm8gY2FsbGJhY2sgaXMgZXhwZWN0ZWQuCi0gIGdhdHRfY2xpZW50X2ludGVyZmFjZSgpLT51bnJlZ2lzdGVyX2NsaWVudChjbGllbnRfaW50ZXJmYWNlX2lkKCkpOwotfQotCi1URVNUX0YoR2F0dFRlc3QsIEdhdHRTZXJ2ZXJSZWdpc3RlcikgewotICAvLyBSZWdpc3RlcnMgZ2F0dCBzZXJ2ZXIuCi0gIGJsdWV0b290aDo6VXVpZCBnYXR0X3NlcnZlcl91dWlkID0gYmx1ZXRvb3RoOjpVdWlkOjpHZXRSYW5kb20oKTsKLSAgZ2F0dF9zZXJ2ZXJfaW50ZXJmYWNlKCktPnJlZ2lzdGVyX3NlcnZlcihnYXR0X3NlcnZlcl91dWlkLCBmYWxzZSk7Ci0gIHNlbWFwaG9yZV93YWl0KHJlZ2lzdGVyX3NlcnZlcl9jYWxsYmFja19zZW1fKTsKLSAgRVhQRUNUX1RSVUUoc3RhdHVzKCkgPT0gQlRfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICA8PCAiRXJyb3IgcmVnaXN0ZXJpbmcgR0FUVCBzZXJ2ZXIgYXBwIGNhbGxiYWNrLiI7Ci0KLSAgLy8gVW5yZWdpc3RlcnMgZ2F0dCBzZXJ2ZXIuIE5vIGNhbGxiYWNrIGlzIGV4cGVjdGVkLgotICBnYXR0X3NlcnZlcl9pbnRlcmZhY2UoKS0+dW5yZWdpc3Rlcl9zZXJ2ZXIoc2VydmVyX2ludGVyZmFjZV9pZCgpKTsKLX0KLQotVEVTVF9GKEdhdHRUZXN0LCBHYXR0U2VydmVyQnVpbGQpIHsKLSAgLy8gUmVnaXN0ZXJzIGdhdHQgc2VydmVyLgotICBibHVldG9vdGg6OlV1aWQgZ2F0dF9zZXJ2ZXJfdXVpZCA9IGJsdWV0b290aDo6VXVpZDo6R2V0UmFuZG9tKCk7Ci0gIGdhdHRfc2VydmVyX2ludGVyZmFjZSgpLT5yZWdpc3Rlcl9zZXJ2ZXIoZ2F0dF9zZXJ2ZXJfdXVpZCwgZmFsc2UpOwotICBzZW1hcGhvcmVfd2FpdChyZWdpc3Rlcl9zZXJ2ZXJfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9UUlVFKHN0YXR1cygpID09IEJUX1NUQVRVU19TVUNDRVNTKQotICAgICAgPDwgIkVycm9yIHJlZ2lzdGVyaW5nIEdBVFQgc2VydmVyIGFwcCBjYWxsYmFjay4iOwotCi0gIC8vIFNlcnZpY2UgVVVJRC4KLSAgYmx1ZXRvb3RoOjpVdWlkIHNydmNfdXVpZCA9IGJsdWV0b290aDo6VXVpZDo6R2V0UmFuZG9tKCk7Ci0KLSAgLy8gQ2hhcmFjdGVyaXN0aWNzIFVVSUQuCi0gIGJsdWV0b290aDo6VXVpZCBjaGFyX3V1aWQgPSBibHVldG9vdGg6OlV1aWQ6OkdldFJhbmRvbSgpOwotCi0gIC8vIERlc2NyaXB0b3IgVVVJRC4KLSAgYmx1ZXRvb3RoOjpVdWlkIGRlc2NfdXVpZCA9IGJsdWV0b290aDo6VXVpZDo6R2V0UmFuZG9tKCk7Ci0KLSAgLy8gQWRkcyBzZXJ2aWNlLgotICBpbnQgc2VydmVyX2lmID0gc2VydmVyX2ludGVyZmFjZV9pZCgpOwotCi0gIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2UgPSB7Ci0gICAgICB7Ci0gICAgICAgICAgLnV1aWQgPSBzcnZjX3V1aWQsCi0gICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfUFJJTUFSWV9TRVJWSUNFLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgICAudXVpZCA9IGNoYXJfdXVpZCwKLSAgICAgICAgICAudHlwZSA9IEJUR0FUVF9EQl9DSEFSQUNURVJJU1RJQywKLSAgICAgICAgICAucHJvcGVydGllcyA9IDB4MTAsICAvKiBub3RpZmljYXRpb24gKi8KLSAgICAgICAgICAucGVybWlzc2lvbnMgPSAweDAxLCAvKiByZWFkIG9ubHkgKi8KLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgICAgLnV1aWQgPSBkZXNjX3V1aWQsCi0gICAgICAgICAgLnR5cGUgPSBCVEdBVFRfREJfREVTQ1JJUFRPUiwKLSAgICAgICAgICAucGVybWlzc2lvbnMgPSAweDAxLAotICAgICAgfX07Ci0KLSAgZ2F0dF9zZXJ2ZXJfaW50ZXJmYWNlKCktPmFkZF9zZXJ2aWNlKHNlcnZlcl9pZiwgc2VydmljZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNpemUoKSk7Ci0gIHNlbWFwaG9yZV93YWl0KHNlcnZpY2VfYWRkZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9UUlVFKHN0YXR1cygpID09IEJUX1NUQVRVU19TVUNDRVNTKSA8PCAiRXJyb3IgYWRkaW5nIHNlcnZpY2UuIjsKLSAgRVhQRUNUX1RSVUUoc2VydmVyX2ludGVyZmFjZV9pZCgpID09IHNlcnZlcl9pZikgPDwgIldyb25nIHNlcnZlcl9pZiBhZGRlZC4iOwotICBpbnQgc2VydmljZV9oYW5kbGVfYWRkZWQgPSBzZXJ2aWNlX2hhbmRsZSgpOwotCi0gIC8vIFN0b3BzIHNlcnZlci4KLSAgZ2F0dF9zZXJ2ZXJfaW50ZXJmYWNlKCktPnN0b3Bfc2VydmljZShzZXJ2ZXJfaWYsIHNlcnZpY2VfaGFuZGxlKCkpOwotICBzZW1hcGhvcmVfd2FpdChzZXJ2aWNlX3N0b3BwZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9UUlVFKHN0YXR1cygpID09IEJUX1NUQVRVU19TVUNDRVNTKSA8PCAiRXJyb3Igc3RvcHBpbmcgc2VydmVyLiI7Ci0gIEVYUEVDVF9UUlVFKHNlcnZpY2VfaGFuZGxlKCkgPT0gc2VydmljZV9oYW5kbGVfYWRkZWQpCi0gICAgICA8PCAiV3Jvbmcgc2VydmljZSBoYW5kbGUgc3RvcHBlZC4iOwotICBFWFBFQ1RfVFJVRShzZXJ2ZXJfaW50ZXJmYWNlX2lkKCkgPT0gc2VydmVyX2lmKSA8PCAiV3Jvbmcgc2VydmVyX2lmIHN0b3BwZWQuIjsKLQotICAvLyBEZWxldGVzIHNlcnZpY2UuCi0gIGdhdHRfc2VydmVyX2ludGVyZmFjZSgpLT5kZWxldGVfc2VydmljZShzZXJ2ZXJfaWYsIHNlcnZpY2VfaGFuZGxlKCkpOwotICBzZW1hcGhvcmVfd2FpdChzZXJ2aWNlX2RlbGV0ZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEVYUEVDVF9UUlVFKHN0YXR1cygpID09IEJUX1NUQVRVU19TVUNDRVNTKSA8PCAiRXJyb3IgZGVsZXRpbmcgc2VydmljZS4iOwotICBFWFBFQ1RfVFJVRShzZXJ2aWNlX2hhbmRsZSgpID09IHNlcnZpY2VfaGFuZGxlX2FkZGVkKQotICAgICAgPDwgIldyb25nIHNlcnZpY2UgaGFuZGxlIGRlbGV0ZWQuIjsKLSAgRVhQRUNUX1RSVUUoc2VydmVyX2ludGVyZmFjZV9pZCgpID09IHNlcnZlcl9pZikgPDwgIldyb25nIHNlcnZlcl9pZiBkZWxldGVkLiI7Ci0KLSAgLy8gVW5yZWdpc3RlcnMgZ2F0dCBzZXJ2ZXIuIE5vIGNhbGxiYWNrIGlzIGV4cGVjdGVkLgotICBnYXR0X3NlcnZlcl9pbnRlcmZhY2UoKS0+dW5yZWdpc3Rlcl9zZXJ2ZXIoc2VydmVyX2lmKTsKLX0KLQotfSAgLy8gYnR0ZXN0CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL3JmY29tbS9yZmNvbW1fdGVzdC5jYyBiL3Rlc3Qvc3VpdGUvcmZjb21tL3JmY29tbV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4NTAxLi4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3VpdGUvcmZjb21tL3JmY29tbV90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicmZjb21tL3JmY29tbV90ZXN0LmgiCi0KLSNpbmNsdWRlICJhZGFwdGVyL2JsdWV0b290aF90ZXN0LmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi11c2luZyBibHVldG9vdGg6OlV1aWQ7Ci0KLW5hbWVzcGFjZSBidHRlc3QgewotCi1jb25zdCBVdWlkIFJGQ29tbVRlc3Q6OkhGUF9VVUlEID0gVXVpZDo6RnJvbTE2Qml0KDB4MTExRSk7Ci0KLXZvaWQgUkZDb21tVGVzdDo6U2V0VXAoKSB7Ci0gIEJsdWV0b290aFRlc3Q6OlNldFVwKCk7Ci0KLSAgQVNTRVJUX0VRKGJ0X2ludGVyZmFjZSgpLT5lbmFibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0gIEFTU0VSVF9UUlVFKEdldFN0YXRlKCkgPT0gQlRfU1RBVEVfT04pOwotICBzb2NrZXRfaW50ZXJmYWNlXyA9Ci0gICAgICAoY29uc3QgYnRzb2NrX2ludGVyZmFjZV90KilidF9pbnRlcmZhY2UoKS0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKAotICAgICAgICAgIEJUX1BST0ZJTEVfU09DS0VUU19JRCk7Ci0gIEFTU0VSVF9ORShzb2NrZXRfaW50ZXJmYWNlXywgbnVsbHB0cik7Ci0KLSAgLy8gRmluZCBhIGJvbmRlZCBkZXZpY2UgdGhhdCBzdXBwb3J0cyBIRlAKLSAgYnRfcmVtb3RlX2JkYWRkcl8gPSBSYXdBZGRyZXNzOjprRW1wdHk7Ci0KLSAgYnRfcHJvcGVydHlfdCogYm9uZGVkX2RldmljZXNfcHJvcCA9Ci0gICAgICBHZXRQcm9wZXJ0eShCVF9QUk9QRVJUWV9BREFQVEVSX0JPTkRFRF9ERVZJQ0VTKTsKLSAgUmF3QWRkcmVzcyogZGV2aWNlcyA9IChSYXdBZGRyZXNzKilib25kZWRfZGV2aWNlc19wcm9wLT52YWw7Ci0gIGludCBudW1fYm9uZGVkX2RldmljZXMgPSBib25kZWRfZGV2aWNlc19wcm9wLT5sZW4gLyBzaXplb2YoUmF3QWRkcmVzcyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYm9uZGVkX2RldmljZXMgJiYgYnRfcmVtb3RlX2JkYWRkcl8uSXNFbXB0eSgpOyBpKyspIHsKLSAgICBDbGVhclNlbWFwaG9yZShyZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXNfY2FsbGJhY2tfc2VtXyk7Ci0gICAgYnRfaW50ZXJmYWNlKCktPmdldF9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5KCZkZXZpY2VzW2ldLCBCVF9QUk9QRVJUWV9VVUlEUyk7Ci0gICAgc2VtYXBob3JlX3dhaXQocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzX2NhbGxiYWNrX3NlbV8pOwotCi0gICAgYnRfcHJvcGVydHlfdCogdXVpZF9wcm9wID0KLSAgICAgICAgR2V0UmVtb3RlRGV2aWNlUHJvcGVydHkoJmRldmljZXNbaV0sIEJUX1BST1BFUlRZX1VVSURTKTsKLSAgICBpZiAodXVpZF9wcm9wID09IG51bGxwdHIpIGNvbnRpbnVlOwotICAgIFV1aWQqIHV1aWRzID0gcmVpbnRlcnByZXRfY2FzdDxVdWlkKj4odXVpZF9wcm9wLT52YWwpOwotICAgIGludCBudW1fdXVpZHMgPSB1dWlkX3Byb3AtPmxlbiAvIHNpemVvZihVdWlkKTsKLQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtX3V1aWRzOyBqKyspIHsKLSAgICAgIGlmICghbWVtY21wKHV1aWRzICsgaiwgJkhGUF9VVUlELCBzaXplb2YoVXVpZCkpKSB7Ci0gICAgICAgIGJ0X3JlbW90ZV9iZGFkZHJfID0gKihkZXZpY2VzICsgaSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEFTU0VSVF9GQUxTRShidF9yZW1vdGVfYmRhZGRyXy5Jc0VtcHR5KCkpCi0gICAgICA8PCAiQ291bGQgbm90IGZpbmQgcGFpcmVkIGRldmljZSB0aGF0IHN1cHBvcnRzIEhGUCI7Ci19Ci0KLXZvaWQgUkZDb21tVGVzdDo6VGVhckRvd24oKSB7Ci0gIHNvY2tldF9pbnRlcmZhY2VfID0gTlVMTDsKLQotICBBU1NFUlRfRVEoYnRfaW50ZXJmYWNlKCktPmRpc2FibGUoKSwgQlRfU1RBVFVTX1NVQ0NFU1MpOwotICBzZW1hcGhvcmVfd2FpdChhZGFwdGVyX3N0YXRlX2NoYW5nZWRfY2FsbGJhY2tfc2VtXyk7Ci0KLSAgQmx1ZXRvb3RoVGVzdDo6VGVhckRvd24oKTsKLX0KLQotfSAgLy8gYnR0ZXN0CmRpZmYgLS1naXQgYS90ZXN0L3N1aXRlL3JmY29tbS9yZmNvbW1fdGVzdC5oIGIvdGVzdC9zdWl0ZS9yZmNvbW0vcmZjb21tX3Rlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5NjQ4MC4uMDAwMDAwMAotLS0gYS90ZXN0L3N1aXRlL3JmY29tbS9yZmNvbW1fdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWRhcHRlci9ibHVldG9vdGhfdGVzdC5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIGJ0dGVzdCB7Ci0KLWNsYXNzIFJGQ29tbVRlc3QgOiBwdWJsaWMgQmx1ZXRvb3RoVGVzdCB7Ci0gcHJvdGVjdGVkOgotICBSRkNvbW1UZXN0KCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5SRkNvbW1UZXN0KCkgPSBkZWZhdWx0OwotCi0gIC8vIEdldHRlciBmb3IgdGhlIFJGQ09NTSBzb2NrZXQKLSAgY29uc3QgYnRzb2NrX2ludGVyZmFjZV90KiBzb2NrZXRfaW50ZXJmYWNlKCkgY29uc3QgewotICAgIHJldHVybiBzb2NrZXRfaW50ZXJmYWNlXzsKLSAgfQotCi0gIC8vIFNldFVwIGluaXRpYWxpemVzIHRoZSBCbHVldG9vdGggaW50ZXJmYWNlcyBhbmQgdGhlIFJGQ09NTSBpbnRlcmZhY2UKLSAgdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0KLSAgLy8gVGVhckRvd24gY2xlYW5zIHVwIHRoZSBCbHVldG9vdGggYW5kIFJGQ09NTSBpbnRlcmZhY2VzCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOwotCi0gIFJhd0FkZHJlc3MgYnRfcmVtb3RlX2JkYWRkcl87Ci0KLSAgc3RhdGljIGNvbnN0IGJsdWV0b290aDo6VXVpZCBIRlBfVVVJRDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IGJ0c29ja19pbnRlcmZhY2VfdCogc29ja2V0X2ludGVyZmFjZV87Ci19OwotCi19ICAvLyBidHRlc3QKZGlmZiAtLWdpdCBhL3Rlc3Qvc3VpdGUvcmZjb21tL3JmY29tbV91bml0dGVzdC5jYyBiL3Rlc3Qvc3VpdGUvcmZjb21tL3JmY29tbV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3ZjFhYS4uMDAwMDAwMAotLS0gYS90ZXN0L3N1aXRlL3JmY29tbS9yZmNvbW1fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNiBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWRhcHRlci9ibHVldG9vdGhfdGVzdC5oIgotI2luY2x1ZGUgInJmY29tbS9yZmNvbW1fdGVzdC5oIgotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2Ugewotc3RhdGljIGNvbnN0IGNoYXIgSEFORFNIQUtFX0NPTU1BTkRbXSA9ICJBVCtCUlNGPTI5XHIiOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBidHRlc3QgewotCi1URVNUX0YoUkZDb21tVGVzdCwgUmZjb21tQ29ubmVjdFBhaXJlZERldmljZSkgewotICBpbnQgZmQgPSAtMTsKLSAgaW50IGVycm9yID0gMDsKLSAgc2l6ZV90IGxlbiA9IDA7Ci0KLSAgZXJyb3IgPSBzb2NrZXRfaW50ZXJmYWNlKCktPmNvbm5lY3QoJmJ0X3JlbW90ZV9iZGFkZHJfLCBCVFNPQ0tfUkZDT01NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSEZQX1VVSUQsIDAsICZmZCwgMCwgZ2V0dWlkKCkpOwotICBFWFBFQ1RfVFJVRShlcnJvciA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPDwgIkVycm9yIGNyZWF0aW5nIFJGQ09NTSBzb2NrZXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVycm9yOwotICBFWFBFQ1RfVFJVRShmZCAhPSAtMSkgPDwgIkVycm9yIGNyZWF0aW5nIFJGQ09NTSBzb2NrZXQ6IGludmFsaWQgZmQiOwotCi0gIGludCBjaGFubmVsOwotICBzb2NrX2Nvbm5lY3Rfc2lnbmFsX3Qgc2lnbmFsOwotICBsZW4gPSByZWFkKGZkLCAmY2hhbm5lbCwgc2l6ZW9mKGNoYW5uZWwpKTsKLSAgRVhQRUNUX1RSVUUobGVuID09IHNpemVvZihjaGFubmVsKSkKLSAgICAgIDw8ICJDaGFubmVsIG5vdCByZWFkIGZyb20gUkZDT01NIHNvY2tldC4gQnl0ZXMgcmVhZDogIiA8PCBsZW47Ci0gIGxlbiA9IHJlYWQoZmQsICZzaWduYWwsIHNpemVvZihzaWduYWwpKTsKLSAgRVhQRUNUX1RSVUUobGVuID09IHNpemVvZihzaWduYWwpKQotICAgICAgPDwgIkNvbm5lY3Rpb24gc2lnbmFsIG5vdCByZWFkIGZyb20gUkZDT01NIHNvY2tldC4gQnl0ZXMgcmVhZDogIiA8PCBsZW47Ci0KLSAgRVhQRUNUX1RSVUUoc2lnbmFsLmJkX2FkZHIgPT0gYnRfcmVtb3RlX2JkYWRkcl8pCi0gICAgICA8PCAiQ29ubmVjdGVkIHRvIGEgZGlmZmVyZW50IGJkYWRkciB0aGFuIGV4cGVjdGVkLiI7Ci0gIEVYUEVDVF9UUlVFKGNoYW5uZWwgPT0gc2lnbmFsLmNoYW5uZWwpCi0gICAgICA8PCAiSW5jb25zaXN0ZW50IGNoYW5uZWxzIHJldHVybmVkOiAiIDw8IGNoYW5uZWwgPDwgIiBhbmQgIgotICAgICAgPDwgc2lnbmFsLmNoYW5uZWw7Ci0KLSAgbGVuID0gd3JpdGUoZmQsIEhBTkRTSEFLRV9DT01NQU5ELCBzaXplb2YoSEFORFNIQUtFX0NPTU1BTkQpKTsKLSAgRVhQRUNUX1RSVUUobGVuID09IHNpemVvZihIQU5EU0hBS0VfQ09NTUFORCkpCi0gICAgICA8PCAiVW5hYmxlIHRvIHNlbmQgSEZQIGhhbmRzaGFrZS4gQnl0ZXMgd3JpdHRlbjogIiA8PCBsZW47Ci0KLSAgY2hhciByZXNwb25zZVsxMDI0XTsKLSAgbGVuID0gcmVhZChmZCwgcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOwotICBFWFBFQ1RfVFJVRShsZW4gPiAwKSA8PCAiUmVhZCAiIDw8IGxlbiA8PCAiIGJ5dGVzIjsKLQotICBjbG9zZShmZCk7Ci19Ci0KLVRFU1RfRihSRkNvbW1UZXN0LCBSZmNvbW1SZXBlYXRlZENvbm5lY3RQYWlyZWREZXZpY2UpIHsKLSAgc3RhdGljIGNvbnN0IGludCBtYXhfaXRlcmF0aW9ucyA9IDEyODsKLSAgaW50IGNoYW5uZWxfZmFpbCA9IDAsIHNpZ25hbF9mYWlsID0gMCwgaGFuZHNoYWtlX2ZhaWwgPSAwLCByZWFkX2ZhaWwgPSAwOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4X2l0ZXJhdGlvbnM7ICsraSkgewotICAgIGludCBmZCA9IC0xOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgc2l6ZV90IGxlbiA9IDA7Ci0KLSAgICBlcnJvciA9IHNvY2tldF9pbnRlcmZhY2UoKS0+Y29ubmVjdCgmYnRfcmVtb3RlX2JkYWRkcl8sIEJUU09DS19SRkNPTU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhGUF9VVUlELCAwLCAmZmQsIDAsIGdldHVpZCgpKTsKLSAgICBBU1NFUlRfVFJVRShlcnJvciA9PSBCVF9TVEFUVVNfU1VDQ0VTUykgPDwgIkVycm9yIGNyZWF0aW5nIFJGQ09NTSBzb2NrZXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZXJyb3I7Ci0gICAgQVNTRVJUX1RSVUUoZmQgIT0gLTEpIDw8ICJFcnJvciBjcmVhdGluZyBSRkNPTU0gc29ja2V0OiBpbnZhbGlkIGZkIjsKLQotICAgIGludCBjaGFubmVsOwotICAgIHNvY2tfY29ubmVjdF9zaWduYWxfdCBzaWduYWw7Ci0gICAgbGVuID0gcmVhZChmZCwgJmNoYW5uZWwsIHNpemVvZihjaGFubmVsKSk7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YoY2hhbm5lbCkpIHsKLSAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkNoYW5uZWwgbm90IHJlYWQgZnJvbSBSRkNPTU0gc29ja2V0LiBCeXRlcyByZWFkOiAiCi0gICAgICAgICAgICAgICAgICAgIDw8IGxlbiA8PCAiLCBTaXplb2YgY2hhbm5lbDogIiA8PCBzaXplb2YoY2hhbm5lbCk7Ci0gICAgICBjaGFubmVsX2ZhaWwrKzsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkKGZkLCAmc2lnbmFsLCBzaXplb2Yoc2lnbmFsKSk7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2Yoc2lnbmFsKSkgewotICAgICAgQUREX0ZBSUxVUkUoKQotICAgICAgICAgIDw8ICJDb25uZWN0aW9uIHNpZ25hbCBub3QgcmVhZCBmcm9tIFJGQ09NTSBzb2NrZXQuIEJ5dGVzIHJlYWQ6ICIKLSAgICAgICAgICA8PCBsZW47Ci0gICAgICBzaWduYWxfZmFpbCsrOwotICAgIH0KLQotICAgIEVYUEVDVF9UUlVFKHNpZ25hbC5iZF9hZGRyID09IGJ0X3JlbW90ZV9iZGFkZHJfKQotICAgICAgICA8PCAiQ29ubmVjdGVkIHRvIGEgZGlmZmVyZW50IGJkYWRkciB0aGFuIGV4cGVjdGVkLiI7Ci0gICAgRVhQRUNUX1RSVUUoY2hhbm5lbCA9PSBzaWduYWwuY2hhbm5lbCkKLSAgICAgICAgPDwgIkluY29uc2lzdGVudCBjaGFubmVscyByZXR1cm5lZDogIiA8PCBjaGFubmVsIDw8ICIgYW5kICIKLSAgICAgICAgPDwgc2lnbmFsLmNoYW5uZWw7Ci0gICAgbGVuID0gd3JpdGUoZmQsIEhBTkRTSEFLRV9DT01NQU5ELCBzaXplb2YoSEFORFNIQUtFX0NPTU1BTkQpKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihIQU5EU0hBS0VfQ09NTUFORCkpIHsKLSAgICAgIEFERF9GQUlMVVJFKCkgPDwgIlVuYWJsZSB0byBzZW5kIEhGUCBoYW5kc2hha2UuIEJ5dGVzIHdyaXR0ZW46ICIgPDwgbGVuOwotICAgICAgaGFuZHNoYWtlX2ZhaWwrKzsKLSAgICB9Ci0KLSAgICBjaGFyIHJlc3BvbnNlWzEwMjRdOwotICAgIGxlbiA9IHJlYWQoZmQsIHJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKLSAgICBpZiAobGVuIDw9IDApIHsKLSAgICAgIEFERF9GQUlMVVJFKCkgPDwgIlJlYWQgIiA8PCBsZW4gPDwgIiBieXRlcyI7Ci0gICAgICByZWFkX2ZhaWwrKzsKLSAgICB9Ci0KLSAgICBjbG9zZShmZCk7Ci0gIH0KLQotICBpZiAoY2hhbm5lbF9mYWlsID4gMCB8fCBzaWduYWxfZmFpbCA+IDAgfHwgaGFuZHNoYWtlX2ZhaWwgPiAwIHx8Ci0gICAgICByZWFkX2ZhaWwgPiAwKSB7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAiTnVtYmVyIG9mIGNoYW5uZWwgcmVhZCBmYWlsczogIiA8PCBjaGFubmVsX2ZhaWwgPDwgIlxuIgotICAgICAgICAgICAgICAgICAgPDwgIk51bWJlciBvZiBzaWduYWwgcmVhZCBmYWlsczogIiA8PCBzaWduYWxfZmFpbCA8PCAiXG4iCi0gICAgICAgICAgICAgICAgICA8PCAiTnVtYmVyIG9mIGhhbmRzaGFrZSBzZW5kIGZhaWxzOiAiIDw8IGhhbmRzaGFrZV9mYWlsCi0gICAgICAgICAgICAgICAgICA8PCAiXG4iCi0gICAgICAgICAgICAgICAgICA8PCAiTnVtYmVyIG9mIHJlYWQgcmVzcG9uc2UgZmFpbHM6ICIgPDwgcmVhZF9mYWlsOwotICB9Ci19Ci0KLX0gIC8vIGJ0dGVzdApkaWZmIC0tZ2l0IGEvdG9vbHMvQW5kcm9pZC5tay5kaXNhYmxlZCBiL3Rvb2xzL0FuZHJvaWQubWsuZGlzYWJsZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvQW5kcm9pZC5tay5kaXNhYmxlZAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYmR0b29sL0FuZHJvaWQubWsuZGlzYWJsZWQgYi90b29scy9iZHRvb2wvQW5kcm9pZC5tay5kaXNhYmxlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiOGRjZS4uMDAwMDAwMAotLS0gYS90b29scy9iZHRvb2wvQW5kcm9pZC5tay5kaXNhYmxlZAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJsdWV0b290aCB0b29scyBmb3IgdGFyZ2V0Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRSA6PSBuZXRfYmR0b29sCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gIGFkYXB0ZXIuYyBcCi0gIGJkdG9vbC5jIFwKLSAgLi4vLi4vdGVzdC9zdWl0ZS9zdXBwb3J0L2NhbGxiYWNrcy5jIFwKLSAgLi4vLi4vdGVzdC9zdWl0ZS9zdXBwb3J0L2dhdHQuYyBcCi0gIC4uLy4uL3Rlc3Qvc3VpdGUvc3VwcG9ydC9oYWwuYyBcCi0gIC4uLy4uL3Rlc3Qvc3VpdGUvc3VwcG9ydC9wYW4uYwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgbGliYnRjb3JlIFwKLSAgbGlib3NpCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAkKExPQ0FMX1BBVEgpLy4uLy4uL3Rlc3Qvc3VpdGUgXAotICAkKExPQ0FMX1BBVEgpLy4uLy4uCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICBsaWJoYXJkd2FyZSBsaWJsb2cKLQotTE9DQUxfQ0ZMQUdTICs9ICQoYmx1ZXRvb3RoX0NGTEFHUykKLUxPQ0FMX0NPTkxZRkxBR1MgKz0gJChibHVldG9vdGhfQ09OTFlGTEFHUykKLUxPQ0FMX0NQUEZMQUdTICs9ICQoYmx1ZXRvb3RoX0NQUEZMQUdTKQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2JkdG9vbC9hZGFwdGVyLmMgYi90b29scy9iZHRvb2wvYWRhcHRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJiZmViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2JkdG9vbC9hZGFwdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3VwcG9ydC9hZGFwdGVyLmgiCi0KLSNpbmNsdWRlICJiYXNlLmgiCi0jaW5jbHVkZSAiYnRjb3JlL2luY2x1ZGUvcHJvcGVydHkuaCIKLSNpbmNsdWRlICJzdXBwb3J0L2NhbGxiYWNrcy5oIgotI2luY2x1ZGUgInR5cGVzL2JsdWV0b290aC91dWlkLmgiCi0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotc3RhdGljIGJ0X3N0YXRlX3Qgc3RhdGU7Ci1zdGF0aWMgaW50IHByb3BlcnR5X2NvdW50ID0gMDsKLXN0YXRpYyBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0aWVzID0gTlVMTDsKLXN0YXRpYyBidF9kaXNjb3Zlcnlfc3RhdGVfdCBkaXNjb3Zlcnlfc3RhdGU7Ci1zdGF0aWMgYnRfYWNsX3N0YXRlX3QgYWNsX3N0YXRlOwotc3RhdGljIGJ0X2JvbmRfc3RhdGVfdCBib25kX3N0YXRlOwotCi1zdGF0aWMgdm9pZCBwYXJzZV9wcm9wZXJ0aWVzKGludCBudW1fcHJvcGVydGllcywgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpOwotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFkYXB0ZXIgc3RhdGUuCi1idF9zdGF0ZV90IGFkYXB0ZXJfZ2V0X3N0YXRlKCkgeyByZXR1cm4gc3RhdGU7IH0KLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkYXB0ZXIgcHJvcGVydGllcy4KLWludCBhZGFwdGVyX2dldF9wcm9wZXJ0eV9jb3VudCgpIHsgcmV0dXJuIHByb3BlcnR5X2NvdW50OyB9Ci0KLS8vIFJldHVybnMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLWJ0X3Byb3BlcnR5X3QqIGFkYXB0ZXJfZ2V0X3Byb3BlcnR5KGJ0X3Byb3BlcnR5X3R5cGVfdCB0eXBlKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlfY291bnQ7ICsraSkgewotICAgIGlmIChwcm9wZXJ0aWVzW2ldLnR5cGUgPT0gdHlwZSkgewotICAgICAgcmV0dXJuICZwcm9wZXJ0aWVzW2ldOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vLyBSZXR1cm5zIHRoZSBkZXZpY2UgZGlzY292ZXJ5IHN0YXRlLgotYnRfZGlzY292ZXJ5X3N0YXRlX3QgYWRhcHRlcl9nZXRfZGlzY292ZXJ5X3N0YXRlKCkgeyByZXR1cm4gZGlzY292ZXJ5X3N0YXRlOyB9Ci0KLS8vIFJldHVybnMgdGhlIGRldmljZSBhY2wgc3RhdGUuCi1idF9hY2xfc3RhdGVfdCBhZGFwdGVyX2dldF9hY2xfc3RhdGUoKSB7IHJldHVybiBhY2xfc3RhdGU7IH0KLQotLy8gUmV0dXJucyB0aGUgZGV2aWNlIGJvbmQgc3RhdGUuCi1idF9ib25kX3N0YXRlX3QgYWRhcHRlcl9nZXRfYm9uZF9zdGF0ZSgpIHsgcmV0dXJuIGJvbmRfc3RhdGU7IH0KLQotLy8gY2FsbGJhY2sKLXZvaWQgYWNsX3N0YXRlX2NoYW5nZWQoYnRfc3RhdHVzX3Qgc3RhdHVzLCBSYXdBZGRyZXNzKiByZW1vdGVfYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgYnRfYWNsX3N0YXRlX3Qgc3RhdGUpIHsKLSAgYWNsX3N0YXRlID0gc3RhdGU7Ci0gIENBTExCQUNLX1JFVCgpOwotfQotCi0vLyBjYWxsYmFjawotdm9pZCBhZGFwdGVyX3Byb3BlcnRpZXMoYnRfc3RhdHVzX3Qgc3RhdHVzLCBpbnQgbnVtX3Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBidF9wcm9wZXJ0eV90KiBuZXdfcHJvcGVydGllcykgewotICBwcm9wZXJ0eV9mcmVlX2FycmF5KHByb3BlcnRpZXMsIHByb3BlcnR5X2NvdW50KTsKLSAgcHJvcGVydGllcyA9IHByb3BlcnR5X2NvcHlfYXJyYXkobmV3X3Byb3BlcnRpZXMsIG51bV9wcm9wZXJ0aWVzKTsKLSAgcHJvcGVydHlfY291bnQgPSBudW1fcHJvcGVydGllczsKLQotICBDQUxMQkFDS19SRVQoKTsKLX0KLQotLy8gY2FsbGJhY2sKLXZvaWQgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkKGJ0X3N0YXRlX3QgbmV3X3N0YXRlKSB7Ci0gIHN0YXRlID0gbmV3X3N0YXRlOwotICBDQUxMQkFDS19SRVQoKTsKLX0KLQotLy8gY2FsbGJhY2sKLXZvaWQgYm9uZF9zdGF0ZV9jaGFuZ2VkKGJ0X3N0YXR1c190IHN0YXR1cywgUmF3QWRkcmVzcyogYmRhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgYnRfYm9uZF9zdGF0ZV90IHN0YXRlKSB7Ci0gIGNoYXIgYnVmWzE4XTsKLSAgYm9uZF9zdGF0ZSA9IHN0YXRlOwotCi0gIGNvbnN0IGNoYXIqIHN0YXRlX25hbWUgPSAiQm9uZCBzdGF0ZSB1bmtub3duIjsKLSAgc3dpdGNoIChib25kX3N0YXRlKSB7Ci0gICAgY2FzZSBCVF9CT05EX1NUQVRFX05PTkU6Ci0gICAgICBzdGF0ZV9uYW1lID0gIkJvbmQgc3RhdGUgbm9uZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQlRfQk9ORF9TVEFURV9CT05ESU5HOgotICAgICAgc3RhdGVfbmFtZSA9ICJCb25kIHN0YXRlIGJvbmRpbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUX0JPTkRfU1RBVEVfQk9OREVEOgotICAgICAgc3RhdGVfbmFtZSA9ICJCb25kIHN0YXRlIGJvbmRlZCI7Ci0gICAgICBicmVhazsKLQotICAgICAgLy8gZGVmYXVsdCBub25lCi0gIH0KLSAgZnByaW50ZihzdGRvdXQsICJCb25kIHN0YXRlIGNoYW5nZWQgY2FsbGJhY2sgYWRkcjolcyBzdGF0ZTolc1xuIiwKLSAgICAgICAgICBiZGFkZHJfdG9fc3RyaW5nKGJkYWRkciwgYnVmLCBzaXplb2YoYnVmKSksIHN0YXRlX25hbWUpOwotCi0gIENBTExCQUNLX1JFVCgpOwotfQotCi0vLyBjYWxsYmFjawotdm9pZCBkZXZpY2VfZm91bmQoaW50IG51bV9wcm9wZXJ0aWVzLCBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSkgewotICBmcHJpbnRmKHN0ZG91dCwgIkRldmljZSBmb3VuZCBudW1fcHJvcGVydGllczolZFxuIiwgbnVtX3Byb3BlcnRpZXMpOwotICBwYXJzZV9wcm9wZXJ0aWVzKG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7Ci0KLSAgQ0FMTEJBQ0tfUkVUKCk7Ci19Ci0KLS8vIGNhbGxiYWNrCi12b2lkIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkKGJ0X2Rpc2NvdmVyeV9zdGF0ZV90IHN0YXRlKSB7Ci0gIGNvbnN0IGNoYXIqIHN0YXRlX25hbWUgPSAiVW5rbm93biI7Ci0gIGRpc2NvdmVyeV9zdGF0ZSA9IHN0YXRlOwotCi0gIHN3aXRjaCAoZGlzY292ZXJ5X3N0YXRlKSB7Ci0gICAgY2FzZSBCVF9ESVNDT1ZFUllfU1RPUFBFRDoKLSAgICAgIHN0YXRlX25hbWUgPSAiRGlzY292ZXJ5IHN0b3BwZWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJUX0RJU0NPVkVSWV9TVEFSVEVEOgotICAgICAgc3RhdGVfbmFtZSA9ICJEaXNjb3Zlcnkgc3RhcnRlZCI7Ci0gICAgICBicmVhazsKLQotICAgICAgLy8gZGVmYXVsdCBvbWl0dGVkCi0gIH0KLSAgZnByaW50ZihzdGRvdXQsICJEaXNjb3ZlciBzdGF0ZSAlc1xuIiwgc3RhdGVfbmFtZSk7Ci0KLSAgQ0FMTEJBQ0tfUkVUKCk7Ci19Ci0KLS8vIGNhbGxiYWNrCi12b2lkIHJlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhidF9zdGF0dXNfdCBzdGF0dXMsIFJhd0FkZHJlc3MqIGJkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcHJvcGVydGllcywgYnRfcHJvcGVydHlfdCogcHJvcGVydGllcykgewotICBjaGFyIGJ1ZlsxOF07Ci0gIGZwcmludGYoc3Rkb3V0LCAiRGV2aWNlIGZvdW5kIGJkYWRkcjolcyBudW1fcHJvcGVydGllczolZFxuIiwKLSAgICAgICAgICBiZGFkZHJfdG9fc3RyaW5nKGJkYWRkciwgYnVmLCBzaXplb2YoYnVmKSksIG51bV9wcm9wZXJ0aWVzKTsKLQotICBwYXJzZV9wcm9wZXJ0aWVzKG51bV9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTsKLQotICBDQUxMQkFDS19SRVQoKTsKLX0KLQotLy8gY2FsbGJhY2sKLXZvaWQgc3NwX3JlcXVlc3QoUmF3QWRkcmVzcyogcmVtb3RlX2JkX2FkZHIsIGJ0X2JkbmFtZV90KiBiZF9uYW1lLCB1aW50MzJfdCBjb2QsCi0gICAgICAgICAgICAgICAgIGJ0X3NzcF92YXJpYW50X3QgcGFpcmluZ192YXJpYW50LCB1aW50MzJfdCBwYXNzX2tleSkgewotICBjaGFyKiBwYWlyaW5nX3ZhcmlhbnRfbmFtZSA9ICJVbmtub3duIjsKLQotICBzd2l0Y2ggKHBhaXJpbmdfdmFyaWFudCkgewotICAgIGNhc2UgQlRfU1NQX1ZBUklBTlRfUEFTU0tFWV9DT05GSVJNQVRJT046Ci0gICAgICBwYWlyaW5nX3ZhcmlhbnRfbmFtZSA9ICJQYXNza2V5IGNvbmZpcm1hdGlvbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1NTUF9WQVJJQU5UX1BBU1NLRVlfRU5UUlk6Ci0gICAgICBwYWlyaW5nX3ZhcmlhbnRfbmFtZSA9ICJQYXNza2V5IGVudHJ5IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVF9TU1BfVkFSSUFOVF9DT05TRU5UOgotICAgICAgcGFpcmluZ192YXJpYW50X25hbWUgPSAiUGFzc2tleSBjb25zZW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCVF9TU1BfVkFSSUFOVF9QQVNTS0VZX05PVElGSUNBVElPTjoKLSAgICAgIHBhaXJpbmdfdmFyaWFudF9uYW1lID0gIlBhc3NrZXkgbm90aWZpY2F0aW9uIjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgZnByaW50ZihzdGRvdXQsCi0gICAgICAgICAgIkdvdCBzc3AgcmVxdWVzdCBkZXZpY2VfY2xhc3M6JXUgcGFzc2tleToleCBwYWlyaW5nX3ZhcmlhbnQ6JXNcbiIsCi0gICAgICAgICAgY29kLCBwYXNzX2tleSwgcGFpcmluZ192YXJpYW50X25hbWUpOwotICBjaGFyIGJ1ZlsxOF07Ci0gIGZwcmludGYoc3Rkb3V0LCAiRGV2aWNlIGZvdW5kOiVzICVzXG4iLAotICAgICAgICAgIGJkYWRkcl90b19zdHJpbmcocmVtb3RlX2JkX2FkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCBiZF9uYW1lLT5uYW1lKTsKLQotICBmcHJpbnRmKHN0ZG91dCwgImF1dG8tYWNjZXB0aW5nIGJvbmRcbiIpOwotICBib29sIGFjY2VwdCA9IHRydWU7Ci0gIGludCByYyA9IGJ0X2ludGVyZmFjZS0+c3NwX3JlcGx5KHJlbW90ZV9iZF9hZGRyLCBwYWlyaW5nX3ZhcmlhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KWFjY2VwdCwgcGFzc19rZXkpOwotICBDQUxMQkFDS19SRVQoKTsKLX0KLQotLy8gY2FsbGJhY2sKLXZvaWQgdGhyZWFkX2V2dChidF9jYl90aHJlYWRfZXZ0IGV2dCkgeyBDQUxMQkFDS19SRVQoKTsgfQotCi1zdGF0aWMgdm9pZCBwYXJzZV9wcm9wZXJ0aWVzKGludCBudW1fcHJvcGVydGllcywgYnRfcHJvcGVydHlfdCogcHJvcGVydHkpIHsKLSAgd2hpbGUgKG51bV9wcm9wZXJ0aWVzLS0gPiAwKSB7Ci0gICAgc3dpdGNoIChwcm9wZXJ0eS0+dHlwZSkgewotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9CRE5BTUU6IHsKLSAgICAgICAgY29uc3QgYnRfYmRuYW1lX3QqIG5hbWUgPSBwcm9wZXJ0eV9hc19uYW1lKHByb3BlcnR5KTsKLSAgICAgICAgaWYgKG5hbWUpIGZwcmludGYoc3Rkb3V0LCAiIG5hbWU6JXNcbiIsIG5hbWUtPm5hbWUpOwotICAgICAgfSBicmVhazsKLQotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9CREFERFI6IHsKLSAgICAgICAgY2hhciBidWZbMThdOwotICAgICAgICBjb25zdCBSYXdBZGRyZXNzKiBhZGRyID0gcHJvcGVydHlfYXNfYWRkcihwcm9wZXJ0eSk7Ci0gICAgICAgIGlmIChhZGRyKQotICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiIGFkZHI6JXNcbiIsCi0gICAgICAgICAgICAgICAgICBiZGFkZHJfdG9fc3RyaW5nKGFkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRfUFJPUEVSVFlfVVVJRFM6IHsKLSAgICAgICAgc2l6ZV90IG51bV91dWlkOwotICAgICAgICBjb25zdCBVdWlkKiB1dWlkID0gcHJvcGVydHlfYXNfdXVpZHMocHJvcGVydHksICZudW1fdXVpZCk7Ci0gICAgICAgIGlmICh1dWlkKSB7Ci0gICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fdXVpZDsgaSsrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiB1dWlkOiV6ZDogIiwgaSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZih1dWlkKTsgaisrKSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJTAyeCIsIHV1aWQtPnV1W2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRfUFJPUEVSVFlfVFlQRV9PRl9ERVZJQ0U6IHsKLSAgICAgICAgYnRfZGV2aWNlX3R5cGVfdCBkZXZpY2VfdHlwZSA9IHByb3BlcnR5X2FzX2RldmljZV90eXBlKHByb3BlcnR5KTsKLSAgICAgICAgaWYgKGRldmljZV90eXBlKSB7Ci0gICAgICAgICAgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV90eXBlOwotICAgICAgICAgIH0gZGV2aWNlX3R5cGVfbG9va3VwW10gPSB7Ci0gICAgICAgICAgICAgIHsiVW5rbm93biJ9LAotICAgICAgICAgICAgICB7IkNsYXNzaWMgT25seSJ9LAotICAgICAgICAgICAgICB7IkJMRSBPbmx5In0sCi0gICAgICAgICAgICAgIHsiQm90aCBDbGFzc2ljIGFuZCBCTEUifSwKLSAgICAgICAgICB9OwotICAgICAgICAgIGludCBpZHggPSAoaW50KWRldmljZV90eXBlOwotICAgICAgICAgIGlmIChpZHggPiBCVF9ERVZJQ0VfREVWVFlQRV9EVUFMKSBpZHggPSAwOwotICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiIGRldmljZV90eXBlOiVzXG4iLAotICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGVfbG9va3VwW2lkeF0uZGV2aWNlX3R5cGUpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotCi0gICAgICBjYXNlIEJUX1BST1BFUlRZX0NMQVNTX09GX0RFVklDRTogewotICAgICAgICBjb25zdCBidF9kZXZpY2VfY2xhc3NfdCogZGMgPSBwcm9wZXJ0eV9hc19kZXZpY2VfY2xhc3MocHJvcGVydHkpOwotICAgICAgICBpbnQgZGNfaW50ID0gZGV2aWNlX2NsYXNzX3RvX2ludChkYyk7Ci0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiIGRldmljZV9jbGFzczoweCV4XG4iLCBkY19pbnQpOwotICAgICAgfSBicmVhazsKLQotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9SRU1PVEVfUlNTSTogewotICAgICAgICBpbnQ4X3QgcnNzaSA9IHByb3BlcnR5X2FzX3Jzc2kocHJvcGVydHkpOwotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiByc3NpOiVkXG4iLCByc3NpKTsKLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRfUFJPUEVSVFlfUkVNT1RFX0ZSSUVORExZX05BTUU6IHsKLSAgICAgICAgY29uc3QgYnRfYmRuYW1lX3QqIG5hbWUgPSBwcm9wZXJ0eV9hc19uYW1lKHByb3BlcnR5KTsKLSAgICAgICAgaWYgKG5hbWUpIGZwcmludGYoc3Rkb3V0LCAiIHJlbW90ZV9uYW1lOiVzXG4iLCBuYW1lLT5uYW1lKTsKLSAgICAgIH0gYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlRfUFJPUEVSVFlfU0VSVklDRV9SRUNPUkQ6Ci0gICAgICBjYXNlIEJUX1BST1BFUlRZX0FEQVBURVJfU0NBTl9NT0RFOgotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX0JPTkRFRF9ERVZJQ0VTOgotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9BREFQVEVSX0RJU0NPVkVSWV9USU1FT1VUOgotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9SRU1PVEVfVkVSU0lPTl9JTkZPOgotICAgICAgY2FzZSBCVF9QUk9QRVJUWV9MT0NBTF9MRV9GRUFUVVJFUzoKLSAgICAgIGNhc2UgQlRfUFJPUEVSVFlfUkVNT1RFX0RFVklDRV9USU1FU1RBTVA6Ci0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5oYW5kbGVkIHByb3BlcnR5IHR5cGU6JWQgbGVuOiVkXG4iLCBwcm9wZXJ0eS0+dHlwZSwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+bGVuKTsKLSAgICAgICAgdWludDhfdCogcCA9ICh1aW50OF90Kilwcm9wZXJ0eS0+dmFsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5LT5sZW47ICsraSwgcCsrKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJTAyeCIsICpwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHktPmxlbiAhPSAwKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHByb3BlcnR5Kys7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2JkdG9vbC9iZHRvb2wuYyBiL3Rvb2xzL2JkdG9vbC9iZHRvb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NzBhNy4uMDAwMDAwMAotLS0gYS90b29scy9iZHRvb2wvYmR0b29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNCBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9wcm9wZXJ0eS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgInRlc3Qvc3VpdGUvc3VwcG9ydC9jYWxsYmFja3MuaCIKLSNpbmNsdWRlICJ0ZXN0L3N1aXRlL3N1cHBvcnQvaGFsLmgiCi0jaW5jbHVkZSAidHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCIKLSNpbmNsdWRlICJ0eXBlcy9yYXdfYWRkcmVzcy5oIgotCi1zdGF0aWMgY29uc3QgVXVpZCBIRlBfVVVJRCA9Ci0gICAgVXVpZDo6RnJvbTEyOEJpdEJFKHt7MHgwMCwgMHgwMCwgMHgxMSwgMHgxRSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDgwLCAweDVGLCAweDlCLCAweDM0LCAweEZCfX0pOwotc3RhdGljIGNvbnN0IFV1aWQgSEZQX0FHX1VVSUQgPQotICAgIFV1aWQ6OkZyb20xMjhCaXRCRSh7ezB4MDAsIDB4MDAsIDB4MTEsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHg1RiwgMHg5QiwgMHgzNCwgMHhGQn19KTsKLQotY29uc3QgYnRfaW50ZXJmYWNlX3QqIGJ0X2ludGVyZmFjZTsKLQotUmF3QWRkcmVzcyBidF9yZW1vdGVfYmRhZGRyOwotCi1zdGF0aWMgaW50IGZfdmVyYm9zZTsKLXN0YXRpYyBib29sIGRpc2NvdmVyID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBkaXNjb3ZlcmFibGUgPSBmYWxzZTsKLXN0YXRpYyBib29sIGJvbmQgPSBmYWxzZTsKLXN0YXRpYyBib29sIHVwID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBnZXRfbmFtZSA9IGZhbHNlOwotc3RhdGljIGJvb2wgc2V0X25hbWUgPSBmYWxzZTsKLXN0YXRpYyBib29sIHNjb19saXN0ZW4gPSBmYWxzZTsKLXN0YXRpYyBib29sIHNjb19jb25uZWN0ID0gZmFsc2U7Ci0KLXN0YXRpYyBpbnQgdGltZW91dF9pbl9zZWMgPSAzMDsKLXN0YXRpYyBjaGFyKiBiZF9uYW1lOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKLSAgICB7ImJkYWRkciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwgICB7ImRpc2NvdmVyIiwgbm9fYXJndW1lbnQsIDAsIDB9LAotICAgIHsiZGlzY292ZXJhYmxlIiwgbm9fYXJndW1lbnQsIDAsIDB9LCAgIHsidGltZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwKLSAgICB7ImJvbmQiLCBub19hcmd1bWVudCwgMCwgMH0sICAgICAgICAgICB7InVwIiwgbm9fYXJndW1lbnQsIDAsIDB9LAotICAgIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAwfSwgICAgICAgIHsiZ2V0X25hbWUiLCBub19hcmd1bWVudCwgMCwgMH0sCi0gICAgeyJzZXRfbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwgeyJzY29fbGlzdGVuIiwgbm9fYXJndW1lbnQsIDAsIDB9LAotICAgIHsic2NvX2Nvbm5lY3QiLCBub19hcmd1bWVudCwgMCwgMH0sICAgIHswLCAwLCAwLCAwfX07Ci0KLXN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpOwotc3RhdGljIGJvb2wgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwotc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZ25vKTsKLQotYnRfcHJvcGVydHlfdCogYWRhcHRlcl9nZXRfcHJvcGVydHkoYnRfcHJvcGVydHlfdHlwZV90IHR5cGUpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaWYgKCFwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpKSB7Ci0gICAgdXNhZ2UoYXJndlswXSk7Ci0gIH0KLQotICBpZiAoYm9uZCAmJiBkaXNjb3ZlcmFibGUpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbiBvbmx5IHNlbGVjdCBlaXRoZXIgYm9uZCBvciBkaXNjb3ZlcmFibGUsIG5vdCBib3RoXG4iKTsKLSAgICB1c2FnZShhcmd2WzBdKTsKLSAgfQotCi0gIGlmIChzY29fbGlzdGVuICYmIHNjb19jb25uZWN0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiQ2FuIG9ubHkgc2VsZWN0IGVpdGhlciBzY29fbGlzdGVuIG9yIHNjb19jb25uZWN0LCBub3QgYm90aFxuIik7Ci0gICAgdXNhZ2UoYXJndlswXSk7Ci0gIH0KLQotICBpZiAoIWJvbmQgJiYgIWRpc2NvdmVyICYmICFkaXNjb3ZlcmFibGUgJiYgIXVwICYmICFnZXRfbmFtZSAmJiAhc2V0X25hbWUgJiYKLSAgICAgICFzY29fbGlzdGVuICYmICFzY29fY29ubmVjdCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IG9uZSBjb21tYW5kXG4iKTsKLSAgICB1c2FnZShhcmd2WzBdKTsKLSAgfQotCi0gIGlmIChzaWduYWwoU0lHSU5ULCBzaWdfaGFuZGxlcikgPT0gU0lHX0VSUikgewotICAgIGZwcmludGYoc3RkZXJyLCAiV2lsbCBiZSB1bmFibGUgdG8gY2F0Y2ggc2lnbmFsc1xuIik7Ci0gIH0KLQotICBmcHJpbnRmKHN0ZG91dCwgIkJyaW5naW5nIHVwIGJsdWV0b290aCBhZGFwdGVyXG4iKTsKLSAgaWYgKCFoYWxfb3BlbihjYWxsYmFja3NfZ2V0X2FkYXB0ZXJfc3RydWN0KCkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiBCbHVldG9vdGggSEFMLlxuIik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoZGlzY292ZXIpIHsKLSAgICBDQUxMX0FORF9XQUlUKGJ0X2ludGVyZmFjZS0+ZW5hYmxlKCksIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZCk7Ci0gICAgZnByaW50ZihzdGRvdXQsICJCVCBhZGFwdGVyIGlzIHVwXG4iKTsKLQotICAgIGZwcmludGYoc3Rkb3V0LCAiU3RhcnRpbmcgdG8gc3RhcnQgZGlzY292ZXJ5XG4iKTsKLSAgICBDQUxMX0FORF9XQUlUKGJ0X2ludGVyZmFjZS0+c3RhcnRfZGlzY292ZXJ5KCksIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkKTsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlN0YXJ0ZWQgZGlzY292ZXJ5IGZvciAlZCBzZWNvbmRzXG4iLCB0aW1lb3V0X2luX3NlYyk7Ci0KLSAgICBzbGVlcCh0aW1lb3V0X2luX3NlYyk7Ci0KLSAgICBmcHJpbnRmKHN0ZG91dCwgIlN0YXJ0aW5nIHRvIGNhbmNlbCBkaXNjb3ZlcnlcbiIpOwotICAgIENBTExfQU5EX1dBSVQoYnRfaW50ZXJmYWNlLT5jYW5jZWxfZGlzY292ZXJ5KCksIGRpc2NvdmVyeV9zdGF0ZV9jaGFuZ2VkKTsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIkNhbmNlbGxlZCBkaXNjb3ZlcnkgYWZ0ZXIgJWQgc2Vjb25kc1xuIiwgdGltZW91dF9pbl9zZWMpOwotICB9Ci0KLSAgaWYgKGRpc2NvdmVyYWJsZSkgewotICAgIENBTExfQU5EX1dBSVQoYnRfaW50ZXJmYWNlLT5lbmFibGUoKSwgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkKTsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIkJUIGFkYXB0ZXIgaXMgdXBcbiIpOwotCi0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPQotICAgICAgICBwcm9wZXJ0eV9uZXdfc2Nhbl9tb2RlKEJUX1NDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUpOwotCi0gICAgaW50IHJjID0gYnRfaW50ZXJmYWNlLT5zZXRfYWRhcHRlcl9wcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgZnByaW50ZihzdGRvdXQsICJTZXQgcmM6JWQgZGV2aWNlIGFzIGRpc2NvdmVyYWJsZSBmb3IgJWQgc2Vjb25kc1xuIiwgcmMsCi0gICAgICAgICAgICB0aW1lb3V0X2luX3NlYyk7Ci0KLSAgICBzbGVlcCh0aW1lb3V0X2luX3NlYyk7Ci0KLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLSAgfQotCi0gIGlmIChib25kKSB7Ci0gICAgaWYgKGJkYWRkcl9pc19lbXB0eSgmYnRfcmVtb3RlX2JkYWRkcikpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgcmVtb3RlIGRldmljZSBhZGRyZXNzIFsgIgotICAgICAgICAgICAgICAiLS1iZGFkZHI9eHg6eXk6eno6YWE6YmI6Y2MgXVxuIik7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIENBTExfQU5EX1dBSVQoYnRfaW50ZXJmYWNlLT5lbmFibGUoKSwgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkKTsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIkJUIGFkYXB0ZXIgaXMgdXBcbiIpOwotCi0gICAgaW50IHJjID0gYnRfaW50ZXJmYWNlLT5jcmVhdGVfYm9uZCgKLSAgICAgICAgJmJ0X3JlbW90ZV9iZGFkZHIsIDAgLyogVU5LTk9XTjsgQ3VycmVudGx5IG5vdCBkb2N1bWVudGVkIDooICovKTsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlN0YXJ0ZWQgYm9uZGluZzolZCBmb3IgJWQgc2Vjb25kc1xuIiwgcmMsIHRpbWVvdXRfaW5fc2VjKTsKLQotICAgIHNsZWVwKHRpbWVvdXRfaW5fc2VjKTsKLSAgfQotCi0gIGlmICh1cCkgewotICAgIENBTExfQU5EX1dBSVQoYnRfaW50ZXJmYWNlLT5lbmFibGUoKSwgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkKTsKLSAgICBmcHJpbnRmKHN0ZG91dCwgIkJUIGFkYXB0ZXIgaXMgdXBcbiIpOwotCi0gICAgZnByaW50ZihzdGRvdXQsICJXYWl0aW5nIGZvciAlZCBzZWNvbmRzXG4iLCB0aW1lb3V0X2luX3NlYyk7Ci0gICAgc2xlZXAodGltZW91dF9pbl9zZWMpOwotICB9Ci0KLSAgaWYgKGdldF9uYW1lKSB7Ci0gICAgQ0FMTF9BTkRfV0FJVChidF9pbnRlcmZhY2UtPmVuYWJsZSgpLCBhZGFwdGVyX3N0YXRlX2NoYW5nZWQpOwotICAgIGZwcmludGYoc3Rkb3V0LCAiQlQgYWRhcHRlciBpcyB1cFxuIik7Ci0gICAgaW50IGVycm9yOwotICAgIENBTExfQU5EX1dBSVQoCi0gICAgICAgIGVycm9yID0gYnRfaW50ZXJmYWNlLT5nZXRfYWRhcHRlcl9wcm9wZXJ0eShCVF9QUk9QRVJUWV9CRE5BTUUpLAotICAgICAgICBhZGFwdGVyX3Byb3BlcnRpZXMpOwotICAgIGlmIChlcnJvciAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZ2V0IGFkYXB0ZXIgcHJvcGVydHlcbiIpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgYnRfcHJvcGVydHlfdCogcHJvcGVydHkgPSBhZGFwdGVyX2dldF9wcm9wZXJ0eShCVF9QUk9QRVJUWV9CRE5BTUUpOwotICAgIGNvbnN0IGJ0X2JkbmFtZV90KiBuYW1lID0gcHJvcGVydHlfYXNfbmFtZShwcm9wZXJ0eSk7Ci0gICAgaWYgKG5hbWUpCi0gICAgICBwcmludGYoIlF1ZXJpZWQgYmx1ZXRvb3RoIGRldmljZSBuYW1lOiVzXG4iLCBuYW1lLT5uYW1lKTsKLSAgICBlbHNlCi0gICAgICBwcmludGYoIk5vIG5hbWVcbiIpOwotICB9Ci0KLSAgaWYgKHNldF9uYW1lKSB7Ci0gICAgQ0FMTF9BTkRfV0FJVChidF9pbnRlcmZhY2UtPmVuYWJsZSgpLCBhZGFwdGVyX3N0YXRlX2NoYW5nZWQpOwotICAgIGZwcmludGYoc3Rkb3V0LCAiQlQgYWRhcHRlciBpcyB1cFxuIik7Ci0KLSAgICBidF9wcm9wZXJ0eV90KiBwcm9wZXJ0eSA9IHByb3BlcnR5X25ld19uYW1lKGJkX25hbWUpOwotICAgIHByaW50ZigiU2V0dGluZyBibHVldG9vdGggZGV2aWNlIG5hbWUgdG86JXNcbiIsIGJkX25hbWUpOwotICAgIGludCBlcnJvcjsKLSAgICBDQUxMX0FORF9XQUlUKGVycm9yID0gYnRfaW50ZXJmYWNlLT5zZXRfYWRhcHRlcl9wcm9wZXJ0eShwcm9wZXJ0eSksCi0gICAgICAgICAgICAgICAgICBhZGFwdGVyX3Byb3BlcnRpZXMpOwotICAgIGlmIChlcnJvciAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc2V0IGFkYXB0ZXIgcHJvcGVydHlcbiIpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgQ0FMTF9BTkRfV0FJVCgKLSAgICAgICAgZXJyb3IgPSBidF9pbnRlcmZhY2UtPmdldF9hZGFwdGVyX3Byb3BlcnR5KEJUX1BST1BFUlRZX0JETkFNRSksCi0gICAgICAgIGFkYXB0ZXJfcHJvcGVydGllcyk7Ci0gICAgaWYgKGVycm9yICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBnZXQgYWRhcHRlciBwcm9wZXJ0eVxuIik7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLSAgICBzbGVlcCh0aW1lb3V0X2luX3NlYyk7Ci0gIH0KLQotICBjb25zdCBpbnQgYXBwX3VpZCA9IDA7Ci0KLSAgaWYgKHNjb19saXN0ZW4pIHsKLSAgICBDQUxMX0FORF9XQUlUKGJ0X2ludGVyZmFjZS0+ZW5hYmxlKCksIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZCk7Ci0gICAgZnByaW50ZihzdGRvdXQsICJCVCBhZGFwdGVyIGlzIHVwXG4iKTsKLQotICAgIGJ0X3Byb3BlcnR5X3QqIHByb3BlcnR5ID0KLSAgICAgICAgcHJvcGVydHlfbmV3X3NjYW5fbW9kZShCVF9TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFKTsKLSAgICBDQUxMX0FORF9XQUlUKGJ0X2ludGVyZmFjZS0+c2V0X2FkYXB0ZXJfcHJvcGVydHkocHJvcGVydHkpLAotICAgICAgICAgICAgICAgICAgYWRhcHRlcl9wcm9wZXJ0aWVzKTsKLSAgICBwcm9wZXJ0eV9mcmVlKHByb3BlcnR5KTsKLQotICAgIGNvbnN0IGJ0c29ja19pbnRlcmZhY2VfdCogc29jayA9Ci0gICAgICAgIGJ0X2ludGVyZmFjZS0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKEJUX1BST0ZJTEVfU09DS0VUU19JRCk7Ci0KLSAgICBpbnQgcmZjb21tX2ZkID0gSU5WQUxJRF9GRDsKLSAgICBpbnQgZXJyb3IgPQotICAgICAgICBzb2NrLT5saXN0ZW4oQlRTT0NLX1JGQ09NTSwgIm1lb3ciLCAoY29uc3QgdWludDhfdCopJkhGUF9BR19VVUlELCAwLAotICAgICAgICAgICAgICAgICAgICAgJnJmY29tbV9mZCwgMCwgYXBwX3VpZCk7Ci0gICAgaWYgKGVycm9yICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsaXN0ZW4gZm9yIGluY29taW5nIFJGQ09NTSBzb2NrZXQ6ICVkXG4iLAotICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGludCBzb2NrX2ZkID0gSU5WQUxJRF9GRDsKLSAgICBlcnJvciA9IHNvY2stPmxpc3RlbihCVFNPQ0tfU0NPLCBOVUxMLCBOVUxMLCA1LCAmc29ja19mZCwgMCwgYXBwX3VpZCk7Ci0gICAgaWYgKGVycm9yICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsaXN0ZW4gZm9yIGluY29taW5nIFNDTyBzb2NrZXRzOiAlZFxuIiwgZXJyb3IpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZnByaW50ZihzdGRvdXQsICJXYWl0aW5nIGZvciBpbmNvbWluZyBTQ08gY29ubmVjdGlvbnMuLi5cbiIpOwotICAgIHNsZWVwKHRpbWVvdXRfaW5fc2VjKTsKLSAgfQotCi0gIGlmIChzY29fY29ubmVjdCkgewotICAgIGlmIChiZGFkZHJfaXNfZW1wdHkoJmJ0X3JlbW90ZV9iZGFkZHIpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhIHJlbW90ZSBkZXZpY2UgYWRkcmVzcyBbICIKLSAgICAgICAgICAgICAgIi0tYmRhZGRyPXh4Onl5Onp6OmFhOmJiOmNjIF1cbiIpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBDQUxMX0FORF9XQUlUKGJ0X2ludGVyZmFjZS0+ZW5hYmxlKCksIGFkYXB0ZXJfc3RhdGVfY2hhbmdlZCk7Ci0gICAgZnByaW50ZihzdGRvdXQsICJCVCBhZGFwdGVyIGlzIHVwXG4iKTsKLQotICAgIGNvbnN0IGJ0c29ja19pbnRlcmZhY2VfdCogc29jayA9Ci0gICAgICAgIGJ0X2ludGVyZmFjZS0+Z2V0X3Byb2ZpbGVfaW50ZXJmYWNlKEJUX1BST0ZJTEVfU09DS0VUU19JRCk7Ci0KLSAgICBpbnQgcmZjb21tX2ZkID0gSU5WQUxJRF9GRDsKLSAgICBpbnQgZXJyb3IgPQotICAgICAgICBzb2NrLT5jb25uZWN0KCZidF9yZW1vdGVfYmRhZGRyLCBCVFNPQ0tfUkZDT01NLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmSEZQX0FHX1VVSUQsIDAsICZyZmNvbW1fZmQsIDAsIGFwcF91aWQpOwotICAgIGlmIChlcnJvciAhPSBCVF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY29ubmVjdCB0byBSRkNPTU0gc29ja2V0OiAlZC5cbiIsIGVycm9yKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgV0FJVChhY2xfc3RhdGVfY2hhbmdlZCk7Ci0KLSAgICBmcHJpbnRmKHN0ZG91dCwgIkVzdGFibGlzaGluZyBTQ08gY29ubmVjdGlvbi4uLlxuIik7Ci0KLSAgICBpbnQgc29ja19mZCA9IElOVkFMSURfRkQ7Ci0gICAgZXJyb3IgPSBzb2NrLT5jb25uZWN0KCZidF9yZW1vdGVfYmRhZGRyLCBCVFNPQ0tfU0NPLCBOVUxMLCA1LCAmc29ja19mZCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwX3VpZCk7Ci0gICAgaWYgKGVycm9yICE9IEJUX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjb25uZWN0IHRvIFNDTyBzb2NrZXQ6ICVkLlxuIiwgZXJyb3IpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgc2xlZXAodGltZW91dF9pbl9zZWMpOwotICB9Ci0KLSAgQ0FMTF9BTkRfV0FJVChidF9pbnRlcmZhY2UtPmRpc2FibGUoKSwgYWRhcHRlcl9zdGF0ZV9jaGFuZ2VkKTsKLSAgZnByaW50ZihzdGRvdXQsICJCVCBhZGFwdGVyIGlzIGRvd25cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnbm8pIHsKLSAgaWYgKHNpZ25vID09IFNJR0lOVCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUmVjZWl2ZWQgU0lHSU5UXG4iKTsKLSAgICBDQUxMX0FORF9XQUlUKGJ0X2ludGVyZmFjZS0+ZGlzYWJsZSgpLCBhZGFwdGVyX3N0YXRlX2NoYW5nZWQpOwotICAgIGZwcmludGYoc3RkZXJyLCAiQlQgYWRhcHRlciBpcyBkb3duXG4iKTsKLSAgICBleGl0KDEpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIlVzYWdlOiAlcyAiCi0gICAgICAgICAgIlstLWJvbmR8LS1kaXNjb3ZlcnwtLWRpc2NvdmVyYWJsZXwtLXVwfC0tc2NvX2xpc3RlbnwtLXNjb19jb25uZWN0XSAiCi0gICAgICAgICAgIlstLWJkYWRkcj08YmRhZGRyPl0gWy0tdGltZT08dGltZV9pbl9zZWM+XSAtLXZlcmJvc2VcbiIsCi0gICAgICAgICAgbmFtZSk7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICBib25kOiBEaXNjb3ZlciBhY3RpdmVseSBhZHZlcnRpc2luZyBkZXZpY2VzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgIGRpc2NvdmVyOiBEaXNjb3ZlciBhY3RpdmVseSBhZHZlcnRpc2luZyBkZXZpY2VzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIiAgICAgZGlzY292ZXJhYmxlOiBTZXQgaW50byBhIGNvbm5lY3RhYmxlIGFuZCBkaXNjb3ZlcmFibGUgbW9kZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICB1cDogT25seSBicmluZyB1cCBzdGFja1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICBzY29fbGlzdGVuOiBMaXN0ZW4gZm9yIGluY29taW5nIFNDTyBjb25uZWN0aW9uc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgICAgIHNjb19jb25uZWN0OiBFc3RhYmxpc2ggYSBTQ08gY29ubmVjdGlvbiB3aXRoIGFub3RoZXIgZGV2aWNlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgIHRpbWU6IFRpbWUgdG8gaG9sZCBpbiB0aGUgc3BlY2lmaWVkIG1vZGVcbiIpOwotICBleGl0KDEpOwotfQotCi1zdGF0aWMgYm9vbCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICB3aGlsZSAoMSkgewotICAgIGludCBvcHRpb25faW5kZXggPSAwOwotICAgIGludCBjID0gZ2V0b3B0X2xvbmdfb25seShhcmdjLCBhcmd2LCAiIiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKLSAgICBpZiAoYyAhPSAwKSBicmVhazsKLQotICAgIHN3aXRjaCAoYykgewotICAgICAgY2FzZSAwOgotICAgICAgICBpZiAob3B0aW9uX2luZGV4ID09IDApIHsKLSAgICAgICAgICBpZiAoIXN0cmluZ190b19iZGFkZHIob3B0YXJnLCAmYnRfcmVtb3RlX2JkYWRkcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbl9pbmRleCA9PSAxKSB7Ci0gICAgICAgICAgZGlzY292ZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcHRpb25faW5kZXggPT0gMikgewotICAgICAgICAgIGRpc2NvdmVyYWJsZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbl9pbmRleCA9PSAzKSB7Ci0gICAgICAgICAgdGltZW91dF9pbl9zZWMgPSBhdG9pKG9wdGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbl9pbmRleCA9PSA0KSB7Ci0gICAgICAgICAgYm9uZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbl9pbmRleCA9PSA1KSB7Ci0gICAgICAgICAgdXAgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcHRpb25faW5kZXggPT0gNikgewotICAgICAgICAgIGZfdmVyYm9zZSsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcHRpb25faW5kZXggPT0gNykgewotICAgICAgICAgIGdldF9uYW1lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3B0aW9uX2luZGV4ID09IDgpIHsKLSAgICAgICAgICBiZF9uYW1lID0gKGNoYXIqKW9wdGFyZzsKLSAgICAgICAgICBzZXRfbmFtZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbl9pbmRleCA9PSA5KSB7Ci0gICAgICAgICAgc2NvX2xpc3RlbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbl9pbmRleCA9PSAxMCkgewotICAgICAgICAgIHNjb19jb25uZWN0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICI/PyBnZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKLSAgICB9Ci0gIH0KLQotICBpZiAob3B0aW5kIDwgYXJnYykgewotICAgIGZwcmludGYoc3RkZXJyLCAibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKLSAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykgZnByaW50ZihzdGRlcnIsICIlcyAiLCBhcmd2W29wdGluZCsrXSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2hjaS9BbmRyb2lkLm1rLmRpc2FibGVkIGIvdG9vbHMvaGNpL0FuZHJvaWQubWsuZGlzYWJsZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDRmNDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaGNpL0FuZHJvaWQubWsuZGlzYWJsZWQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotIyBCbHVldG9vdGggSENJIHRvb2xzIGZvciB0YXJnZXQKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFIDo9IG5ldF9oY2kKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW4uYwotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJvc2kKLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi8uLi8KLQotTE9DQUxfQ0ZMQUdTICs9ICQoYmx1ZXRvb3RoX0NGTEFHUykKLUxPQ0FMX0NPTkxZRkxBR1MgKz0gJChibHVldG9vdGhfQ09OTFlGTEFHUykKLUxPQ0FMX0NQUEZMQUdTICs9ICQoYmx1ZXRvb3RoX0NQUEZMQUdTKQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2hjaS9tYWluLmMgYi90b29scy9oY2kvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNhZjZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2hjaS9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotI2luY2x1ZGUgPGhhcmR3YXJlL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi10eXBlZGVmIGludCAoKmhhbmRsZXJfdCkoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgSENJX1BBQ0tFVF9DT01NQU5EID0gMSwKLSAgSENJX1BBQ0tFVF9BQ0xfREFUQSA9IDIsCi0gIEhDSV9QQUNLRVRfU0NPX0RBVEEgPSAzLAotICBIQ0lfUEFDS0VUX0VWRU5UID0gNCwKLSAgSENJX1BBQ0tFVF9JU08gPSA1LAotfSBoY2lfcGFja2V0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgY29uc3QgY2hhciogaGVscDsKLSAgaGFuZGxlcl90IGhhbmRsZXI7Ci19IGNvbW1hbmRfdDsKLQotc3RhdGljIGludCBoZWxwKGludCBhcmdjLCBjaGFyKiogYXJndik7Ci1zdGF0aWMgaW50IHNldF9kaXNjb3ZlcmFibGUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKLXN0YXRpYyBpbnQgc2V0X25hbWUoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKLXN0YXRpYyBpbnQgc2V0X3BjbV9sb29wYmFjayhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwotc3RhdGljIGludCBzZXRfc2NvX3JvdXRlKGludCBhcmdjLCBjaGFyKiogYXJndik7Ci0KLXN0YXRpYyBib29sIHdyaXRlX2hjaV9jb21tYW5kKGhjaV9wYWNrZXRfdCB0eXBlLCBjb25zdCB2b2lkKiBwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLXN0YXRpYyBjb25zdCBjb21tYW5kX3QqIGZpbmRfY29tbWFuZChjb25zdCBjaGFyKiBuYW1lKTsKLXN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpOwotCi1zdGF0aWMgY29uc3QgY29tbWFuZF90IGNvbW1hbmRzW10gPSB7Ci0gICAgeyJoZWxwIiwgIjxjb21tYW5kPiAtIHNob3dzIGhlbHAgdGV4dCBmb3IgPGNvbW1hbmQ+LiIsIGhlbHB9LAotICAgIHsic2V0RGlzY292ZXJhYmxlIiwKLSAgICAgIih0cnVlfGZhbHNlKSAtIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgc2hvdWxkIGJlIGRpc2NvdmVyYWJsZS4iLAotICAgICBzZXRfZGlzY292ZXJhYmxlfSwKLSAgICB7InNldE5hbWUiLCAiPG5hbWU+IC0gc2V0cyB0aGUgZGV2aWNlJ3MgQmx1ZXRvb3RoIG5hbWUgdG8gPG5hbWU+LiIsCi0gICAgIHNldF9uYW1lfSwKLSAgICB7InNldFBjbUxvb3BiYWNrIiwKLSAgICAgIih0cnVlfGZhbHNlKSAtIGVuYWJsZXMgb3IgZGlzYWJsZXMgUENNIGxvb3BiYWNrIG9uIHRoZSBjb250cm9sbGVyLiIsCi0gICAgIHNldF9wY21fbG9vcGJhY2t9LAotICAgIHsic2V0U2NvUm91dGUiLAotICAgICAiKHBjbXxpMnN8dWFydCkgLSBzZXRzIHRoZSBTQ08gcGFja2V0IHJvdXRlIHRvIG9uZSBvZiB0aGUgc3BlY2lmaWVkICIKLSAgICAgImJ1c2VzLiIsCi0gICAgIHNldF9zY29fcm91dGV9LAotfTsKLQotc3RhdGljIGludCBoZWxwKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpZiAoIWFyZ2MpIHsKLSAgICBwcmludGYoIk5vIGhlbHAgY29tbWFuZCBzcGVjaWZpZWQuXG4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGNvbnN0IGNvbW1hbmRfdCogY29tbWFuZCA9IGZpbmRfY29tbWFuZChhcmd2WzBdKTsKLSAgaWYgKCFjb21tYW5kKSB7Ci0gICAgcHJpbnRmKCJObyBjb21tYW5kIG5hbWVkICclcycuXG4iLCBhcmd2WzBdKTsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHByaW50ZigiJXMgJXNcbiIsIGFyZ3ZbMF0sIGNvbW1hbmQtPmhlbHApOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXRfZGlzY292ZXJhYmxlKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpZiAoYXJnYyAhPSAxKSB7Ci0gICAgcHJpbnRmKCJEaXNjb3ZlcmFibGUgbW9kZSBub3Qgc3BlY2lmaWVkLlxuIik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoc3RyY21wKGFyZ3ZbMF0sICJ0cnVlIikgJiYgc3RyY21wKGFyZ3ZbMF0sICJmYWxzZSIpKSB7Ci0gICAgcHJpbnRmKCJJbnZhbGlkIGRpc2NvdmVyYWJsZSBtb2RlICclcycuXG4iLCBhcmd2WzBdKTsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHVpbnQ4X3QgcGFja2V0W10gPSB7MHgxQSwgMHgwQywgMHgwMSwgMHgwMH07Ci0gIGlmIChhcmd2WzBdWzBdID09ICd0JykgcGFja2V0W0FSUkFZX1NJWkUocGFja2V0KSAtIDFdID0gMHgwMzsKLQotICByZXR1cm4gIXdyaXRlX2hjaV9jb21tYW5kKEhDSV9QQUNLRVRfQ09NTUFORCwgcGFja2V0LCBBUlJBWV9TSVpFKHBhY2tldCkpOwotfQotCi1zdGF0aWMgaW50IHNldF9uYW1lKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpZiAoYXJnYyAhPSAxKSB7Ci0gICAgcHJpbnRmKCJEZXZpY2UgbmFtZSBub3Qgc3BlY2lmaWVkLlxuIik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBzaXplX3QgbGVuID0gc3RybGVuKGFyZ3ZbMF0pOwotICBpZiAobGVuID4gMjQ3KSB7Ci0gICAgcHJpbnRmKCJEZXZpY2UgbmFtZSBjYW5ub3QgZXhjZWVkIDI0NyBieXRlcy5cbiIpOwotICAgIHJldHVybiAyOwotICB9Ci0KLSAgdWludDhfdCBwYWNrZXRbMjUxXSA9IHsweDEzLCAweDBDLCAyNDh9OwotICBtZW1jcHkoJnBhY2tldFszXSwgYXJndlswXSwgbGVuICsgMSk7Ci0KLSAgaWYgKCF3cml0ZV9oY2lfY29tbWFuZChIQ0lfUEFDS0VUX0NPTU1BTkQsIHBhY2tldCwgc2l6ZW9mKHBhY2tldCkpKSByZXR1cm4gMTsKLQotICBtZW1zZXQoJnBhY2tldFswXSwgMCwgc2l6ZW9mKHBhY2tldCkpOwotICBwYWNrZXRbMF0gPSAweDUyOwotICBwYWNrZXRbMV0gPSAweDBDOwotICBwYWNrZXRbMl0gPSAweEYxOyAgLy8gSENJIGNvbW1hbmQgcGFja2V0IGxlbmd0aC4KLSAgcGFja2V0WzNdID0gMHgwMTsgIC8vIEZFQyByZXF1aXJlZC4KLSAgcGFja2V0WzRdID0gbGVuICsgMTsKLSAgcGFja2V0WzVdID0gMHgwOTsgIC8vIERldmljZSBuYW1lIGZpZWxkIHRhZy4KLSAgbWVtY3B5KCZwYWNrZXRbNl0sIGFyZ3ZbMF0sIGxlbik7Ci0gIHJldHVybiAhd3JpdGVfaGNpX2NvbW1hbmQoSENJX1BBQ0tFVF9DT01NQU5ELCBwYWNrZXQsIDB4RjQpOwotfQotCi1zdGF0aWMgaW50IHNldF9wY21fbG9vcGJhY2soaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGlmIChhcmdjICE9IDEpIHsKLSAgICBwcmludGYoIlBDTSBsb29wYmFjayBtb2RlIG5vdCBzcGVjaWZpZWQuXG4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmIChzdHJjbXAoYXJndlswXSwgInRydWUiKSAmJiBzdHJjbXAoYXJndlswXSwgImZhbHNlIikpIHsKLSAgICBwcmludGYoIkludmFsaWQgUENNIG1vZGUgJyVzJy5cbiIsIGFyZ3ZbMF0pOwotICAgIHJldHVybiAyOwotICB9Ci0KLSAgdWludDhfdCBwYWNrZXRbXSA9IHsweDI0LCAweEZDLCAweDAxLCAweDAwfTsKLSAgaWYgKGFyZ3ZbMF1bMF0gPT0gJ3QnKSBwYWNrZXRbQVJSQVlfU0laRShwYWNrZXQpIC0gMV0gPSAweDAxOwotCi0gIHJldHVybiAhd3JpdGVfaGNpX2NvbW1hbmQoSENJX1BBQ0tFVF9DT01NQU5ELCBwYWNrZXQsIEFSUkFZX1NJWkUocGFja2V0KSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3Njb19yb3V0ZShpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaWYgKGFyZ2MgIT0gMSkgewotICAgIHByaW50ZigiU0NPIHJvdXRlIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZC5cbiIpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgdWludDhfdCByb3V0ZSA9IDB4RkY7Ci0gIGlmICghc3RyY21wKGFyZ3ZbMF0sICJwY20iKSkKLSAgICByb3V0ZSA9IDA7Ci0gIGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImkycyIpKQotICAgIHJvdXRlID0gMzsKLSAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidWFydCIpKQotICAgIHJvdXRlID0gMTsKLQotICBpZiAocm91dGUgPT0gMHhGRikgewotICAgIHByaW50ZigiSW52YWxpZCBTQ08gcm91dGUgc3BlY2lmaWVkOiAlc1xuIiwgYXJndlswXSk7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICB1aW50OF90IHBhY2tldFtdID0gezB4MUMsIDB4RkMsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDB9OwotICBwYWNrZXRbM10gPSByb3V0ZTsKLQotICByZXR1cm4gIXdyaXRlX2hjaV9jb21tYW5kKEhDSV9QQUNLRVRfQ09NTUFORCwgcGFja2V0LCBBUlJBWV9TSVpFKHBhY2tldCkpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgY29uc3QgY29tbWFuZF90KiBjb21tYW5kID0gZmluZF9jb21tYW5kKGFyZ3ZbMV0pOwotICBpZiAoIWNvbW1hbmQpIHsKLSAgICBwcmludGYoIlVucmVjb2duaXplZCBjb21tYW5kICclcycuXG4iLCBhcmd2WzFdKTsKLSAgICByZXR1cm4gLTI7Ci0gIH0KLQotICBpZiAoIWNvbW1hbmQtPmhhbmRsZXIpIHsKLSAgICBwcmludGYoIlVuaGFuZGxlZCBjb21tYW5kICclcycuXG4iLCBhcmd2WzFdKTsKLSAgICByZXR1cm4gLTM7Ci0gIH0KLQotICByZXR1cm4gY29tbWFuZC0+aGFuZGxlcihhcmdjIC0gMiwgJmFyZ3ZbMl0pOwotfQotCi1zdGF0aWMgYm9vbCB3cml0ZV9oY2lfY29tbWFuZChoY2lfcGFja2V0X3QgdHlwZSwgY29uc3Qgdm9pZCogcGFja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBpbnQgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOwotICBpZiAoc29jayA9PSBJTlZBTElEX0ZEKSBnb3RvIGVycm9yOwotCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKDB4N0YwMDAwMDEpOwotICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMoODg3Myk7Ci0gIGludCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IGNvbm5lY3Qoc29jaywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkpOwotICBpZiAocmV0ID09IC0xKSBnb3RvIGVycm9yOwotCi0gIGlmIChzZW5kKHNvY2ssICZ0eXBlLCAxLCAwKSAhPSAxKSBnb3RvIGVycm9yOwotCi0gIGlmIChzZW5kKHNvY2ssICZsZW5ndGgsIDIsIDApICE9IDIpIGdvdG8gZXJyb3I7Ci0KLSAgaWYgKHNlbmQoc29jaywgcGFja2V0LCBsZW5ndGgsIDApICE9IChzc2l6ZV90KWxlbmd0aCkgZ290byBlcnJvcjsKLQotICBjbG9zZShzb2NrKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWVycm9yOjsKLSAgY2xvc2Uoc29jayk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfdCogZmluZF9jb21tYW5kKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1hbmRzKTsgKytpKQotICAgIGlmICghc3RyY21wKGNvbW1hbmRzW2ldLm5hbWUsIG5hbWUpKSByZXR1cm4gJmNvbW1hbmRzW2ldOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkgewotICBwcmludGYoIlVzYWdlOiAlcyA8Y29tbWFuZD4gW29wdGlvbnNdXG4iLCBuYW1lKTsKLSAgcHJpbnRmKCJDb21tYW5kczpcbiIpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbWFuZHMpOyArK2kpCi0gICAgcHJpbnRmKCIgICVzXG4iLCBjb21tYW5kc1tpXS5uYW1lKTsKLSAgcHJpbnRmKCJGb3IgZGV0YWlsZWQgaGVscCBvbiBhIGNvbW1hbmQsIHJ1biAnJXMgaGVscCA8Y29tbWFuZD4nLlxuIiwgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2J0c25vb3BfbGl2ZS5weSBiL3Rvb2xzL3NjcmlwdHMvYnRzbm9vcF9saXZlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDRkYzE5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvYnRzbm9vcF9saXZlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgQ29weXJpZ2h0IChDKSAyMDE5IE1vdG9yb2xhIE1vYmlsaXR5IExMQwotIwotIyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0Ci0jICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSMKLSMgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQotIyAgICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jCi0jICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZAotIyAgICAgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIwotIyAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvcgotIyAgICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotIyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCi0jICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0jICBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECi0jICBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSMgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi0jICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSMgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aCBWaXJ0dWFsIFNuaWZmaW5nIGZvciBBbmRyb2lkCi0jCi0jICBUaGlzIHNjcmlwdCBzdXBwb3J0cyBCbHVldG9vdGggVmlydHVhbCBTbmlmZmluZyB2aWEgTGl2ZSBJbXBvcnQgRmVhdHVyZSBvZiBGcm9udGxpbmUgQmx1ZXRvb3RoIFNuaWZmZXIoRlRTKQotIwotIyAgSXQgZXh0cmFjdHMgdGhlIEhDSSBwYWNrZXRzIGZyb20gU25vb3AgbG9ncyBhbmQgcmVkaXJlY3QgaXQgdG8gRlRTIGZvciBsaXZlIEhDSSBzbmlmZmluZy4KLSMKLSMgIEl0IHVzZXMgbGl2ZWltcG9ydC5pbmkgYW5kIExpdmVJbXBvcnRBUEkuZGxsIGZyb20gRlRTIHBhdGggdG8gY29tbXVuaWNhdGUgd2l0aCBGVFMgc25pZmZlciBzb2Z0d2FyZS4KLSMKLSMgIEl0IHdvcmtzIG9uIGJvdGggV2luZG93cyBhbmQgVWJ1bnR1LiBGb3IgVWJ1bnR1LCBib3RoIEZUUyBhbmQgUHl0aG9uIHNob3VsZCBiZSBpbnN0YWxsZWQgb24gV2luZS4KLSMKLSMgIEZUU19JTklfUEFUSCAmIEZUU19ETExfUEFUSCBzaG91bGQgYmUgc2V0IHRvIGFic29sdXRlIHBhdGggb2YgbGl2ZWltcG9ydC5pbmkgYW5kIExpdmVJbXBvcnRBUEkuZGxsIG9mIEZUUwotIwotIyAgRXhhbXBsZSBiZWxvdyAtIFRoaXMgbWF5IGNoYW5nZSBwZXIgbWFjaGluZSBwZXIgRlRTIHZlcnNpb24gaW4gV2luZG93cyB2cyBVYnVudHUgKFdpbmUpLCBzZXQgYWNjb3JkaW5nbHkuCi0jICBGb3IgV2luZG93cwotIyAgICBGVFNfSU5JX1BBVEggPSAnQzpcXFByb2dyYW0gRmlsZXMgKHg4NilcXEZyb250bGluZSBUZXN0IFN5c3RlbSBJSVxcRnJvbnRsaW5lIDEzLjJcXCcKLSMgICAgRlRTX0RMTF9QQVRIID0gJ0M6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxGcm9udGxpbmUgVGVzdCBTeXN0ZW0gSUlcXEZyb250bGluZSAxMy4yXFxFeGVjdXRhYmxlc1xcQ29yZVxcJwotIwotIyAgRm9yIFVidW50dSAtIEZUUyBwYXRoIHJlY29nbml6ZWQgYnkgV2luZSAobm90IFVidW50dSBwYXRoKQotIyAgICBGVFNfSU5JX1BBVEggPSAnQzpcXFByb2dyYW0gRmlsZXNcXEZyb250bGluZSBUZXN0IFN5c3RlbSBJSVxcRnJvbnRsaW5lIDEzLjJcXCcKLSMgICAgRlRTX0RMTF9QQVRIID0gJ0M6XFxQcm9ncmFtIEZpbGVzXFxGcm9udGxpbmUgVGVzdCBTeXN0ZW0gSUlcXEZyb250bGluZSAxMy4yXFxFeGVjdXRhYmxlc1xcQ29yZVxcJwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWltcG9ydCBvcwotaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cwotaW1wb3J0IHRpbWUKLWlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKLSAgICBpbXBvcnQgY29uZmlncGFyc2VyCi1lbHNlOgotICAgIGltcG9ydCBDb25maWdQYXJzZXIgYXMgY29uZmlncGFyc2VyCi0KLWZyb20gY2FsZW5kYXIgaW1wb3J0IHRpbWVnbQotZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmLCBjX2Jvb2wsIGNfbG9uZ2xvbmcsIENETEwKLWZyb20gX2N0eXBlcyBpbXBvcnQgRnJlZUxpYnJhcnkKLWZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCi0KLSMgVXBkYXRlIGJlbG93IHRvIHJpZ2h0IHBhdGggY29ycmVzcG9uZGluZyB0byB5b3VyIG1hY2hpbmUsIEZUUyB2ZXJzaW9uIGFuZCBPUyB1c2VkLgotRlRTX0lOSV9QQVRIID0gJ0M6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxGcm9udGxpbmUgVGVzdCBTeXN0ZW0gSUlcXEZyb250bGluZSAxNS4xMlxcJwotRlRTX0RMTF9QQVRIID0gJ0M6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxGcm9udGxpbmUgVGVzdCBTeXN0ZW0gSUlcXEZyb250bGluZSAxNS4xMlxcRXhlY3V0YWJsZXNcXENvcmVcXCcKLQotaW5pTmFtZSA9ICdsaXZlaW1wb3J0LmluaScKLWlmIChwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSA9PSAnMzJiaXQnKToKLSAgICBkbGxOYW1lID0gJ0xpdmVJbXBvcnRBUEkuZGxsJwotZWxzZToKLSAgICBkbGxOYW1lID0gJ0xpdmVJbXBvcnRBUElfeDY0LmRsbCcKLQotbGF1bmNoRnRzQ21kID0gJ1wiJyArIEZUU19ETExfUEFUSCArICdmdHMuZXhlXCInICsgJyBcIi9Db21Qcm9iZSBQcm90b2NvbCBBbmFseXNpcyBTeXN0ZW09R2VuZXJpY1wiJyArICcgXCIvb2Vta2V5PVZpcnR1YWxcIicKLQotIyBVbml4IEVwb2NoIGRlbHRhIHNpbmNlIDAxLzAxLzE5NzAKLUZJTEVUSU1FX0VQT0NIX0RFTFRBID0gMTE2NDQ0NzM2MDAwMDAwMDAwCi1IVU5EUkVEU19PRl9OQU5PU0VDT05EUyA9IDEwMDAwMDAwCi0KLUhPU1QgPSAnbG9jYWxob3N0JwotUE9SVCA9IDg4NzIKLVNOT09QX0lEID0gMTYKLVNOT09QX0hEUiA9IDI0Ci0KLQotZGVmIGdldF9maWxlX3RpbWUoKToKLSAgICAiIiIKLSAgICBPYnRhaW4gY3VycmVudCB0aW1lIGluIGZpbGUgdGltZSBmb3JtYXQgZm9yIGRpc3BsYXkKLSAgICAiIiIKLSAgICBkYXRlX3RpbWUgPSBkYXRldGltZS5ub3coKQotICAgIGZpbGVfdGltZSA9IEZJTEVUSU1FX0VQT0NIX0RFTFRBICsgKHRpbWVnbShkYXRlX3RpbWUudGltZXR1cGxlKCkpICogSFVORFJFRFNfT0ZfTkFOT1NFQ09ORFMpCi0gICAgZmlsZV90aW1lID0gZmlsZV90aW1lICsgKGRhdGVfdGltZS5taWNyb3NlY29uZCAqIDEwKQotICAgIHJldHVybiBmaWxlX3RpbWUKLQotCi1kZWYgZ2V0X2Nvbm5lY3Rpb25fc3RyaW5nKCk6Ci0gICAgIiIiCi0gICAgUmVhZCBDb25uZWN0aW9uU3RyaW5nIGZyb20gbGl2ZWltcG9ydC5pbmkKLSAgICAiIiIKLSAgICBjb25maWcgPSBjb25maWdwYXJzZXIuQ29uZmlnUGFyc2VyKCkKLSAgICBjb25maWcucmVhZChGVFNfSU5JX1BBVEggKyBpbmlOYW1lKQotICAgIHRyeToKLSAgICAgICAgY29ubl9zdHIgPSBjb25maWcuZ2V0KCdHZW5lcmFsJywgJ0Nvbm5lY3Rpb25TdHJpbmcnKQotICAgIGV4Y2VwdCAoY29uZmlncGFyc2VyLk5vU2VjdGlvbkVycm9yLCBjb25maWdwYXJzZXIuTm9PcHRpb25FcnJvcik6Ci0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICByZXR1cm4gY29ubl9zdHIKLQotCi1kZWYgZ2V0X2NvbmZpZ3VyYXRpb25fc3RyaW5nKCk6Ci0gICAgIiIiCi0gICAgUmVhZCBDb25maWd1cmF0aW9uIHN0cmluZyBmcm9tIGxpdmVpbXBvcnQuaW5pCi0gICAgIiIiCi0gICAgY29uZmlnX3N0ciA9ICcnCi0gICAgY29uZmlnID0gY29uZmlncGFyc2VyLkNvbmZpZ1BhcnNlcigpCi0gICAgY29uZmlnLnJlYWQoRlRTX0lOSV9QQVRIICsgaW5pTmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIGNvbmZpZ19pdGVtcyA9IGNvbmZpZy5pdGVtcygnQ29uZmlndXJhdGlvbicpCi0gICAgZXhjZXB0IChjb25maWdwYXJzZXIuTm9TZWN0aW9uRXJyb3IsIGNvbmZpZ3BhcnNlci5Ob09wdGlvbkVycm9yKToKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGlmIGNvbmZpZ19pdGVtcyBpcyBub3QgTm9uZToKLSAgICAgICAgZm9yIGl0ZW0gaW4gY29uZmlnX2l0ZW1zOgotICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGl0ZW0KLSAgICAgICAgICAgIGNvbmZpZ19zdHIgKz0gKCIlcz0lc1xuIiAlIChrZXksIHZhbHVlKSkKLSAgICAgICAgcmV0dXJuIGNvbmZpZ19zdHIKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gTm9uZQotCi0KLWRlZiBjaGVja19saXZlX2ltcG9ydF9jb25uZWN0aW9uKGxpdmVfaW1wb3J0KToKLSAgICAiIiIKLSAgICBMYXVuY2ggRlRTIGFwcCBpbiBWaXJ0dWFsIFNuaWZmaW5nIE1vZGUKLSAgICBDaGVjayBpZiBGVFMgQXBwIGlzIHJlYWR5IHRvIHN0YXJ0IHJlY2VpdmluZyB0aGUgZGF0YS4KLSAgICBJZiBub3QsIHdhaXQgdW50aWwgMSBtaW4gYW5kIGV4aXQgaWYgRlRTIGRpZG4ndCBzdGFydC4KLSAgICAiIiIKLSAgICBpc19jb25uZWN0aW9uX3J1bm5pbmcgPSBjX2Jvb2woKQotICAgIGNvdW50ID0gMAotCi0gICAgc3RhdHVzID0gbGl2ZV9pbXBvcnQuSXNBcHBSZWFkeShieXJlZihpc19jb25uZWN0aW9uX3J1bm5pbmcpKQotICAgIGlmIChpc19jb25uZWN0aW9uX3J1bm5pbmcudmFsdWUgPT0gVHJ1ZSk6Ci0gICAgICAgIHByaW50KCJGVFMgaXMgYWxyZWFkeSBsYXVuY2hlZCwgU3RhcnQgY2FwdHVyZSBpZiBub3QgYWxyZWFkeSBzdGFydGVkIikKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIHByaW50KCJMYXVuY2hpbmcgRlRTIFZpcnR1YWwgU25pZmZpbmciKQotICAgIHRyeToKLSAgICAgICAgZnRzUHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oKGxhdW5jaEZ0c0NtZCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gICAgZXhjZXB0OgotICAgICAgICBwcmludCgiRXJyb3IgaW4gTGF1bmNoaW5nIEZUUy4uIGV4aXRpbmciKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIHdoaWxlIChpc19jb25uZWN0aW9uX3J1bm5pbmcudmFsdWUgPT0gRmFsc2UgYW5kIGNvdW50IDwgMTIpOgotICAgICAgICBzdGF0dXMgPSBsaXZlX2ltcG9ydC5Jc0FwcFJlYWR5KGJ5cmVmKGlzX2Nvbm5lY3Rpb25fcnVubmluZykpCi0gICAgICAgIGlmIChzdGF0dXMgPCAwKToKLSAgICAgICAgICAgIHByaW50KCJMaXZlIEltcG9ydCBJbnRlcm5hbCBFcnJvciAlZCIgJSAoc3RhdHVzKSkKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiAoaXNfY29ubmVjdGlvbl9ydW5uaW5nLnZhbHVlID09IEZhbHNlKToKLSAgICAgICAgICAgIHByaW50KCJXYWl0aW5nIGZvciA1IHNlYy4uIE9wZW4gRlRTIFZpcnR1YWwgU25pZmZpbmciKQotICAgICAgICAgICAgdGltZS5zbGVlcCg1KQotICAgICAgICAgICAgY291bnQgKz0gMQotICAgIGlmIChpc19jb25uZWN0aW9uX3J1bm5pbmcudmFsdWUgPT0gVHJ1ZSk6Ci0gICAgICAgIHByaW50KCJGVFMgaXMgcmVhZHkgdG8gcmVjZWl2ZSB0aGUgZGF0YSwgU3RhcnQgY2FwdHVyZSBub3ciKQotICAgICAgICByZXR1cm4gVHJ1ZQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50KCJGVFMgVmlydHVhbCBTbmlmZmluZyBkaWRuJ3Qgc3RhcnQgdW50aWwgMSBtaW4uLiBleGl0aW5nIikKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIGluaXRfbGl2ZV9pbXBvcnQoY29ubl9zdHIsIGNvbmZpZ19zdHIpOgotICAgICIiIgotICAgIExvYWQgRExMIGFuZCBJbml0aWFsaXplIHRoZSBMaXZlSW1wb3J0IG1vZHVsZSBmb3IgRlRTLgotICAgICIiIgotICAgIHN1Y2Nlc3MgPSBjX2Jvb2woKQotICAgIHRyeToKLSAgICAgICAgbGl2ZV9pbXBvcnQgPSBDRExMKEZUU19ETExfUEFUSCArIGRsbE5hbWUpCi0gICAgZXhjZXB0OgotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgaWYgbGl2ZV9pbXBvcnQgaXMgTm9uZToKLSAgICAgICAgcHJpbnQoIkVycm9yOiBQYXRoIHRvIExpdmVJbXBvcnRBUEkuZGxsIGlzIGluY29ycmVjdC4uIGV4aXRpbmciKQotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgcHJpbnQoZGxsTmFtZSArICIgbG9hZGVkIHN1Y2Nlc3NmdWxseSIpCi0gICAgcmVzdWx0ID0gbGl2ZV9pbXBvcnQuSW5pdGlhbGl6ZUxpdmVJbXBvcnQoCi0gICAgICAgIGNvbm5fc3RyLmVuY29kZSgnYXNjaWknLCAnaWdub3JlJyksIGNvbmZpZ19zdHIuZW5jb2RlKCdhc2NpaScsICdpZ25vcmUnKSwgYnlyZWYoc3VjY2VzcykpCi0gICAgaWYgKHJlc3VsdCA8IDApOgotICAgICAgICBwcmludCgiTGl2ZSBJbXBvcnQgSW5pdCBmYWlsZWQiKQotICAgICAgICByZXR1cm4gTm9uZQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50KCJMaXZlIEltcG9ydCBJbml0IHN1Y2Nlc3MiKQotICAgICAgICByZXR1cm4gbGl2ZV9pbXBvcnQKLQotCi1kZWYgcmVsZWFzZV9saXZlX2ltcG9ydChsaXZlX2ltcG9ydCk6Ci0gICAgIiIiCi0gICAgQ2xlYW51cCBhbmQgZXhpdCBsaXZlIGltcG9ydCBtb2R1bGUuCi0gICAgIiIiCi0gICAgaWYgbGl2ZV9pbXBvcnQgaXMgbm90IE5vbmU6Ci0gICAgICAgIGxpdmVfaW1wb3J0LlJlbGVhc2VMaXZlSW1wb3J0KCkKLSAgICAgICAgRnJlZUxpYnJhcnkobGl2ZV9pbXBvcnQuX2hhbmRsZSkKLQotCi1kZWYgbWFpbigpOgotCi0gICAgcHJpbnQoIkJsdWV0b290aCBWaXJ0dWFsIFNuaWZmaW5nIGZvciBGbHVvcmlkZSIpCi0gICAgY29ubmVjdGlvbl9zdHIgPSBnZXRfY29ubmVjdGlvbl9zdHJpbmcoKQotICAgIGlmIGNvbm5lY3Rpb25fc3RyIGlzIE5vbmU6Ci0gICAgICAgIHByaW50KCJFcnJvcjogcGF0aCB0byBsaXZlaW1wb3J0LmluaSBpcyBpbmNvcnJlY3QuLiBleGl0aW5nIikKLSAgICAgICAgZXhpdCgwKQotCi0gICAgY29uZmlndXJhdGlvbl9zdHIgPSBnZXRfY29uZmlndXJhdGlvbl9zdHJpbmcoKQotICAgIGlmIGNvbmZpZ3VyYXRpb25fc3RyIGlzIE5vbmU6Ci0gICAgICAgIHByaW50KCJFcnJvcjogcGF0aCB0byBsaXZlaW1wb3J0LmluaSBpcyBpbmNvcnJlY3QuLiBleGl0aW5nIikKLSAgICAgICAgZXhpdCgwKQotCi0gICAgbGl2ZV9pbXBvcnQgPSBpbml0X2xpdmVfaW1wb3J0KGNvbm5lY3Rpb25fc3RyLCBjb25maWd1cmF0aW9uX3N0cikKLSAgICBpZiBsaXZlX2ltcG9ydCBpcyBOb25lOgotICAgICAgICBwcmludCgiRXJyb3I6IFBhdGggdG8gTGl2ZUltcG9ydEFQSS5kbGwgaXMgaW5jb3JyZWN0Li4gZXhpdGluZyIpCi0gICAgICAgIGV4aXQoMCkKLQotICAgIGlmIChjaGVja19saXZlX2ltcG9ydF9jb25uZWN0aW9uKGxpdmVfaW1wb3J0KSA9PSBGYWxzZSk6Ci0gICAgICAgIHJlbGVhc2VfbGl2ZV9pbXBvcnQobGl2ZV9pbXBvcnQpCi0gICAgICAgIGV4aXQoMCkKLQotICAgICMgV2FpdCB1bnRpbCB0aGUgZm9yd2FyZCBzb2NrZXQgaXMgcmVhZHkKLSAgICBwcmludCgiV2FpdGluZyB1bnRpbCBhZGIgaXMgcmVhZHkiKQotICAgIG9zLnN5c3RlbSgnYWRiIHdhaXQtZm9yLWRldmljZSBmb3J3YXJkIHRjcDo4ODcyIHRjcDo4ODcyJykKLQotICAgIGJ0c25vb3Bfc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICBidHNub29wX3NvY2suY29ubmVjdCgoSE9TVCwgUE9SVCkpCi0gICAgc25vb3BfaWQgPSBidHNub29wX3NvY2sucmVjdihTTk9PUF9JRCkKLSAgICBpZiBub3Qgc25vb3BfaWQuc3RhcnRzd2l0aChiImJ0c25vb3AiKToKLSAgICAgICAgcHJpbnQoIkVycm9yOiBTbm9vcCBJRCB3YXNuJ3QgcmVjZWl2ZWQuLiBleGl0aW5nIikKLSAgICAgICAgcmVsZWFzZV9saXZlX2ltcG9ydChsaXZlX2ltcG9ydCkKLSAgICAgICAgZXhpdCgwKQotCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc25vb3BfaGRyID0gYnRzbm9vcF9zb2NrLnJlY3YoU05PT1BfSERSKQotICAgICAgICAgICAgaWYgc25vb3BfaGRyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb2xlbiwgaWxlbiwgZmxhZ3MgPSBzdHJ1Y3QudW5wYWNrKCI+TExMIiwgc25vb3BfaGRyWzA6MTJdKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCJFcnJvcjogSW52YWxpZCBkYXRhIiwgcmVwcihzbm9vcF9oZHIpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICAgICAgICAgZmlsZV90aW1lID0gZ2V0X2ZpbGVfdGltZSgpCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gY19sb25nbG9uZyhmaWxlX3RpbWUpCi0KLSAgICAgICAgICAgICAgICBzbm9vcF9kYXRhID0gYicnCi0gICAgICAgICAgICAgICAgd2hpbGUgKGxlbihzbm9vcF9kYXRhKSA8IG9sZW4pOgotICAgICAgICAgICAgICAgICAgICBkYXRhX2ZyYWcgPSBidHNub29wX3NvY2sucmVjdihvbGVuIC0gbGVuKHNub29wX2RhdGEpKQotICAgICAgICAgICAgICAgICAgICBpZiBkYXRhX2ZyYWcgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbm9vcF9kYXRhICs9IGRhdGFfZnJhZwotCi0gICAgICAgICAgICAgICAgcHJpbnQoIkJ5dGVzIHJlY2VpdmVkICVkIE9sZW4gJWQgaWxlbiAlZCBmbGFncyAlZCIgJSAobGVuKHNub29wX2RhdGEpLCBvbGVuLCBpbGVuLCBmbGFncykpCi0gICAgICAgICAgICAgICAgcGFja2V0X3R5cGUgPSBzdHJ1Y3QudW5wYWNrKCI+QiIsIHNub29wX2RhdGFbMDoxXSlbMF0KLSAgICAgICAgICAgICAgICBpZiBwYWNrZXRfdHlwZSA9PSAxOgotICAgICAgICAgICAgICAgICAgICBkcmYgPSAxCi0gICAgICAgICAgICAgICAgICAgIGlzZW5kID0gMAotICAgICAgICAgICAgICAgIGVsaWYgcGFja2V0X3R5cGUgPT0gMjoKLSAgICAgICAgICAgICAgICAgICAgZHJmID0gMgotICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDAxKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzZW5kID0gMQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgaXNlbmQgPSAwCi0gICAgICAgICAgICAgICAgZWxpZiBwYWNrZXRfdHlwZSA9PSAzOgotICAgICAgICAgICAgICAgICAgICBkcmYgPSA0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIDB4MDEpOgotICAgICAgICAgICAgICAgICAgICAgICAgaXNlbmQgPSAxCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc2VuZCA9IDAKLSAgICAgICAgICAgICAgICBlbGlmIHBhY2tldF90eXBlID09IDQ6Ci0gICAgICAgICAgICAgICAgICAgIGRyZiA9IDgKLSAgICAgICAgICAgICAgICAgICAgaXNlbmQgPSAxCi0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXZlX2ltcG9ydC5TZW5kRnJhbWUob2xlbiAtIDEsIG9sZW4gLSAxLCBzbm9vcF9kYXRhWzE6b2xlbl0sIGRyZiwgaXNlbmQsIHRpbWVzdGFtcCkKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCJTZW5kIGZyYW1lIGZhaWxlZCIpCi0gICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgIHByaW50KCJDbGVhbnVwIGFuZCBleGl0IikKLSAgICAgICAgICAgIHJlbGVhc2VfbGl2ZV9pbXBvcnQobGl2ZV9pbXBvcnQpCi0gICAgICAgICAgICBidHNub29wX3NvY2suY2xvc2UoKQotICAgICAgICAgICAgZXhpdCgwKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2J0c25vb3oucHkgYi90b29scy9zY3JpcHRzL2J0c25vb3oucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMjgyNGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy9idHNub296LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIiIiCi1UaGlzIHNjcmlwdCBleHRyYWN0cyBidHNub296IGNvbnRlbnQgZnJvbSBidWdyZXBvcnRzIGFuZCBnZW5lcmF0ZXMKLWEgdmFsaWQgYnRzbm9vcCBsb2cgZmlsZSB3aGljaCBjYW4gYmUgdmlld2VkIHVzaW5nIHN0YW5kYXJkIHRvb2xzCi1saWtlIFdpcmVzaGFyay4KLQotYnRzbm9veiBpcyBhIGN1c3RvbSBmb3JtYXQgZGVzaWduZWQgdG8gYmUgaW5jbHVkZWQgaW4gYnVncmVwb3J0cy4KLUl0IGNhbiBiZSBkZXNjcmliZWQgYXM6Ci0KLWJhc2U2NCB7Ci0gIGZpbGVfaGVhZGVyCi0gIGRlZmxhdGUgewotICAgIHJlcGVhdGVkIHsKLSAgICAgIHJlY29yZF9oZWFkZXIKLSAgICAgIHJlY29yZF9kYXRhCi0gICAgfQotICB9Ci19Ci0KLXdoZXJlIHRoZSBmaWxlX2hlYWRlciBhbmQgcmVjb3JkX2hlYWRlciBhcmUgbW9kaWZpZWQgdmVyc2lvbnMgb2YKLXRoZSBidHNub29wIGhlYWRlcnMuCi0iIiIKLQotaW1wb3J0IGJhc2U2NAotaW1wb3J0IGZpbGVpbnB1dAotaW1wb3J0IHN0cnVjdAotaW1wb3J0IHN5cwotaW1wb3J0IHpsaWIKLQotIyBFbnVtZXJhdGlvbiBvZiB0aGUgdmFsdWVzIHRoZSAndHlwZScgZmllbGQgY2FuIHRha2UgaW4gYSBidHNub296Ci0jIGhlYWRlci4gVGhlc2UgdmFsdWVzIGNvbWUgZnJvbSB0aGUgQmx1ZXRvb3RoIHN0YWNrJ3MgaW50ZXJuYWwKLSMgcmVwcmVzZW50YXRpb24gb2YgcGFja2V0IHR5cGVzLgotVFlQRV9JTl9FVlQgPSAweDEwCi1UWVBFX0lOX0FDTCA9IDB4MTEKLVRZUEVfSU5fU0NPID0gMHgxMgotVFlQRV9JTl9JU08gPSAweDE3Ci1UWVBFX09VVF9DTUQgPSAweDIwCi1UWVBFX09VVF9BQ0wgPSAweDIxCi1UWVBFX09VVF9TQ08gPSAweDIyCi1UWVBFX09VVF9JU08gPSAweDJkCi0KLQotZGVmIHR5cGVfdG9fZGlyZWN0aW9uKHR5cGUpOgotICAgICIiIgotICBSZXR1cm5zIHRoZSBpbmJvdW5kL291dGJvdW5kIGRpcmVjdGlvbiBvZiBhIHBhY2tldCBnaXZlbiBpdHMgdHlwZS4KLSAgMCA9IHNlbnQgcGFja2V0Ci0gIDEgPSByZWNlaXZlZCBwYWNrZXQKLSAgIiIiCi0gICAgaWYgdHlwZSBpbiBbVFlQRV9JTl9FVlQsIFRZUEVfSU5fQUNMLCBUWVBFX0lOX1NDTywgVFlQRV9JTl9JU09dOgotICAgICAgICByZXR1cm4gMQotICAgIHJldHVybiAwCi0KLQotZGVmIHR5cGVfdG9faGNpKHR5cGUpOgotICAgICIiIgotICBSZXR1cm5zIHRoZSBIQ0kgdHlwZSBvZiBhIHBhY2tldCBnaXZlbiBpdHMgYnRzbm9veiB0eXBlLgotICAiIiIKLSAgICBpZiB0eXBlID09IFRZUEVfT1VUX0NNRDoKLSAgICAgICAgcmV0dXJuICdceDAxJwotICAgIGlmIHR5cGUgPT0gVFlQRV9JTl9BQ0wgb3IgdHlwZSA9PSBUWVBFX09VVF9BQ0w6Ci0gICAgICAgIHJldHVybiAnXHgwMicKLSAgICBpZiB0eXBlID09IFRZUEVfSU5fU0NPIG9yIHR5cGUgPT0gVFlQRV9PVVRfU0NPOgotICAgICAgICByZXR1cm4gJ1x4MDMnCi0gICAgaWYgdHlwZSA9PSBUWVBFX0lOX0VWVDoKLSAgICAgICAgcmV0dXJuICdceDA0JwotICAgIGlmIHR5cGUgPT0gVFlQRV9JTl9JU08gb3IgdHlwZSA9PSBUWVBFX09VVF9JU086Ci0gICAgICAgIHJldHVybiAnXHgwNScKLSAgICByYWlzZSBSdW50aW1lRXJyb3IoInR5cGVfdG9faGNpOiB1bmtub3duIHR5cGUgKDB4ezowMnh9KSIuZm9ybWF0KHR5cGUpKQotCi0KLWRlZiBkZWNvZGVfc25vb3ooc25vb3opOgotICAgICIiIgotICBEZWNvZGVzIGFsbCBrbm93biB2ZXJzaW9ucyBvZiBhIGJ0c25vb3ogZmlsZSBpbnRvIGEgYnRzbm9vcCBmaWxlLgotICAiIiIKLSAgICB2ZXJzaW9uLCBsYXN0X3RpbWVzdGFtcF9tcyA9IHN0cnVjdC51bnBhY2tfZnJvbSgnPWJRJywgc25vb3opCi0KLSAgICBpZiB2ZXJzaW9uICE9IDEgYW5kIHZlcnNpb24gIT0gMjoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVW5zdXBwb3J0ZWQgYnRzbm9veiB2ZXJzaW9uOiAlc1xuJyAlIHZlcnNpb24pCi0gICAgICAgIGV4aXQoMSkKLQotICAgICMgT2RkbHksIHRoZSBmaWxlIGhlYWRlciAoOSBieXRlcykgaXMgbm90IGNvbXByZXNzZWQsIGJ1dCB0aGUgcmVzdCBpcy4KLSAgICBkZWNvbXByZXNzZWQgPSB6bGliLmRlY29tcHJlc3Moc25vb3pbOTpdKQotCi0gICAgc3lzLnN0ZG91dC53cml0ZSgnYnRzbm9vcFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAzXHhlYScpCi0KLSAgICBpZiB2ZXJzaW9uID09IDE6Ci0gICAgICAgIGRlY29kZV9zbm9vel92MShkZWNvbXByZXNzZWQsIGxhc3RfdGltZXN0YW1wX21zKQotICAgIGVsaWYgdmVyc2lvbiA9PSAyOgotICAgICAgICBkZWNvZGVfc25vb3pfdjIoZGVjb21wcmVzc2VkLCBsYXN0X3RpbWVzdGFtcF9tcykKLQotCi1kZWYgZGVjb2RlX3Nub296X3YxKGRlY29tcHJlc3NlZCwgbGFzdF90aW1lc3RhbXBfbXMpOgotICAgICIiIgotICBEZWNvZGVzIGJ0c25vb3ogdjEgZmlsZXMgaW50byBhIGJ0c25vb3AgZmlsZS4KLSAgIiIiCi0gICAgIyBBbiB1bmZvcnR1bmF0ZSBjb25zZXF1ZW5jZSBvZiB0aGUgZmlsZSBmb3JtYXQgZGVzaWduOiB3ZSBoYXZlIHRvIGRvIGEKLSAgICAjIHBhc3Mgb2YgdGhlIGVudGlyZSBmaWxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBwYWNrZXQuCi0gICAgZmlyc3RfdGltZXN0YW1wX21zID0gbGFzdF90aW1lc3RhbXBfbXMgKyAweDAwZGNkZGIzMGYyZjgwMDAKLSAgICBvZmZzZXQgPSAwCi0gICAgd2hpbGUgb2Zmc2V0IDwgbGVuKGRlY29tcHJlc3NlZCk6Ci0gICAgICAgIGxlbmd0aCwgZGVsdGFfdGltZV9tcywgdHlwZSA9IHN0cnVjdC51bnBhY2tfZnJvbSgnPUhJYicsIGRlY29tcHJlc3NlZCwgb2Zmc2V0KQotICAgICAgICBvZmZzZXQgKz0gNyArIGxlbmd0aCAtIDEKLSAgICAgICAgZmlyc3RfdGltZXN0YW1wX21zIC09IGRlbHRhX3RpbWVfbXMKLQotICAgICMgU2Vjb25kIHBhc3MgZG9lcyB0aGUgYWN0dWFsIHdyaXRpbmcgb3V0IHRvIHN0ZG91dC4KLSAgICBvZmZzZXQgPSAwCi0gICAgd2hpbGUgb2Zmc2V0IDwgbGVuKGRlY29tcHJlc3NlZCk6Ci0gICAgICAgIGxlbmd0aCwgZGVsdGFfdGltZV9tcywgdHlwZSA9IHN0cnVjdC51bnBhY2tfZnJvbSgnPUhJYicsIGRlY29tcHJlc3NlZCwgb2Zmc2V0KQotICAgICAgICBmaXJzdF90aW1lc3RhbXBfbXMgKz0gZGVsdGFfdGltZV9tcwotICAgICAgICBvZmZzZXQgKz0gNwotICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN0cnVjdC5wYWNrKCc+SUknLCBsZW5ndGgsIGxlbmd0aCkpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3RydWN0LnBhY2soJz5JSScsIHR5cGVfdG9fZGlyZWN0aW9uKHR5cGUpLCAwKSkKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzdHJ1Y3QucGFjaygnPklJJywgKGZpcnN0X3RpbWVzdGFtcF9tcyA+PiAzMiksIChmaXJzdF90aW1lc3RhbXBfbXMgJiAweEZGRkZGRkZGKSkpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUodHlwZV90b19oY2kodHlwZSkpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZGVjb21wcmVzc2VkW29mZnNldDpvZmZzZXQgKyBsZW5ndGggLSAxXSkKLSAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aCAtIDEKLQotCi1kZWYgZGVjb2RlX3Nub296X3YyKGRlY29tcHJlc3NlZCwgbGFzdF90aW1lc3RhbXBfbXMpOgotICAgICIiIgotICBEZWNvZGVzIGJ0c25vb3ogdjIgZmlsZXMgaW50byBhIGJ0c25vb3AgZmlsZS4KLSAgIiIiCi0gICAgIyBBbiB1bmZvcnR1bmF0ZSBjb25zZXF1ZW5jZSBvZiB0aGUgZmlsZSBmb3JtYXQgZGVzaWduOiB3ZSBoYXZlIHRvIGRvIGEKLSAgICAjIHBhc3Mgb2YgdGhlIGVudGlyZSBmaWxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBwYWNrZXQuCi0gICAgZmlyc3RfdGltZXN0YW1wX21zID0gbGFzdF90aW1lc3RhbXBfbXMgKyAweDAwZGNkZGIzMGYyZjgwMDAKLSAgICBvZmZzZXQgPSAwCi0gICAgd2hpbGUgb2Zmc2V0IDwgbGVuKGRlY29tcHJlc3NlZCk6Ci0gICAgICAgIGxlbmd0aCwgcGFja2V0X2xlbmd0aCwgZGVsdGFfdGltZV9tcywgc25vb3pfdHlwZSA9IHN0cnVjdC51bnBhY2tfZnJvbSgnPUhISWInLCBkZWNvbXByZXNzZWQsIG9mZnNldCkKLSAgICAgICAgb2Zmc2V0ICs9IDkgKyBsZW5ndGggLSAxCi0gICAgICAgIGZpcnN0X3RpbWVzdGFtcF9tcyAtPSBkZWx0YV90aW1lX21zCi0KLSAgICAjIFNlY29uZCBwYXNzIGRvZXMgdGhlIGFjdHVhbCB3cml0aW5nIG91dCB0byBzdGRvdXQuCi0gICAgb2Zmc2V0ID0gMAotICAgIHdoaWxlIG9mZnNldCA8IGxlbihkZWNvbXByZXNzZWQpOgotICAgICAgICBsZW5ndGgsIHBhY2tldF9sZW5ndGgsIGRlbHRhX3RpbWVfbXMsIHNub296X3R5cGUgPSBzdHJ1Y3QudW5wYWNrX2Zyb20oJz1ISEliJywgZGVjb21wcmVzc2VkLCBvZmZzZXQpCi0gICAgICAgIGZpcnN0X3RpbWVzdGFtcF9tcyArPSBkZWx0YV90aW1lX21zCi0gICAgICAgIG9mZnNldCArPSA5Ci0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3RydWN0LnBhY2soJz5JSScsIHBhY2tldF9sZW5ndGgsIGxlbmd0aCkpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3RydWN0LnBhY2soJz5JSScsIHR5cGVfdG9fZGlyZWN0aW9uKHNub296X3R5cGUpLCAwKSkKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzdHJ1Y3QucGFjaygnPklJJywgKGZpcnN0X3RpbWVzdGFtcF9tcyA+PiAzMiksIChmaXJzdF90aW1lc3RhbXBfbXMgJiAweEZGRkZGRkZGKSkpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUodHlwZV90b19oY2koc25vb3pfdHlwZSkpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZGVjb21wcmVzc2VkW29mZnNldDpvZmZzZXQgKyBsZW5ndGggLSAxXSkKLSAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aCAtIDEKLQotCi1kZWYgbWFpbigpOgotICAgIGlmIGxlbihzeXMuYXJndikgPiAyOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVc2FnZTogJXMgW2J1Z3JlcG9ydF1cbicgJSBzeXMuYXJndlswXSkKLSAgICAgICAgZXhpdCgxKQotCi0gICAgaXRlcmF0b3IgPSBmaWxlaW5wdXQuaW5wdXQoKQotICAgIGZvdW5kID0gRmFsc2UKLSAgICBiYXNlNjRfc3RyaW5nID0gIiIKLSAgICBmb3IgbGluZSBpbiBpdGVyYXRvcjoKLSAgICAgICAgaWYgZm91bmQ6Ci0gICAgICAgICAgICBpZiBsaW5lLmZpbmQoJy0tLSBFTkQ6QlRTTk9PUF9MT0dfU1VNTUFSWScpICE9IC0xOgotICAgICAgICAgICAgICAgIGRlY29kZV9zbm9veihiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKGJhc2U2NF9zdHJpbmcpKQotICAgICAgICAgICAgICAgIHN5cy5leGl0KDApCi0gICAgICAgICAgICBiYXNlNjRfc3RyaW5nICs9IGxpbmUuc3RyaXAoKQotCi0gICAgICAgIGlmIGxpbmUuZmluZCgnLS0tIEJFR0lOOkJUU05PT1BfTE9HX1NVTU1BUlknKSAhPSAtMToKLSAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQotCi0gICAgaWYgbm90IGZvdW5kOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdObyBidHNub296IHNlY3Rpb24gZm91bmQgaW4gYnVncmVwb3J0LlxuJykKLSAgICAgICAgc3lzLmV4aXQoMSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9jaGFuZ2VfdHlwZXMuc2ggYi90b29scy9zY3JpcHRzL2NoYW5nZV90eXBlcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ0MzYzYy4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2NoYW5nZV90eXBlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMgVGhpcyBzY3JpcHQgd2lsbCByZWN1cnNpdmVseSBzZWFyY2ggYWxsIHxGSUxFU3wgZnJvbSB0aGUgY3VycmVudAotIyBkaXJlY3RvcnkgYW5kIHJlcGxhY2UgYWxsIHxUWVBFU3wgYWNjb3JkaW5nIHRvIHRoZSBsaXN0IGJlbG93LgotCi0jIE5PVEUgMToKLSMgSWYgdGhpcyBzY3JpcHQgaXMgcnVuIGZyb20gLi4uL3N5c3RlbS9idCAoYXMgaXQncyBpbnRlbmRlZCB0byBiZSksCi0jIHBsZWFzZSBlZGl0IHN0YWNrL2luY2x1ZGUvYnRfdHlwZXMuaCBuZXh0IGFuZCByZW1vdmUgdGhlIHR5cGVkZWYncwotIyBuZWFyIHRoZSB0b3AgYW5kIHJlc3RvcmUgdGhlIGRlZmluaXRpb25zIG9mIFRSVUUgYW5kIEZBTFNFLiBUaGVzZQotIyBhcmUgc3RpbGwgdXNlZCBpbiB0aGUgdm5kXyogZmlsZXMgYW5kIGRldmljZSBzcGVjaWZpYyByZXBvc2l0b3JpZXMuCi0KLSMgTk9URSAyOgotIyBUaGUgbGlzdCBvZiBmaWxlcyB0byBiZSBtb2RpZmllZCBhbHNvIGluY2x1ZGVzICIqLnBhdGNoIiwgd2hpY2ggbWVhbnMKLSMgdGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gaGVscCBjaGVycnktcGlja2luZyBjaGFuZ2VzIGZyb20gb2xkZXIKLSMgYnJhbmNoZXMuIEZvbGxvdyB0aGlzIHdvcmtmbG93IG91dGxpbmU6Ci0jICAxLiBnaXQgZm9ybWF0LXBhdGNoIFstMV0gPHlvdXIgc2hhMT4KLSMgIDIuIFJ1biBjaGFuZ2VfdHlwZSBzY3JpcHQgb24gcGF0Y2hbZXNdCi0jICAzLiBnaXQgYXBwbHkgLyBnaXQgYW0KLQotCi0jIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyB0aGUgZmlsZSBuYW1lCi1GSUxFUz0iXC5oJHxcLmMkfFwuY3BwJHxcLmNjJHxcLnBhdGNoJCIKLQotIyBTZWFyY2gvcmVwbGFjZSB0ZXJtcywgc2VwYXJhdGVkIGJ5ICI6IgotVFlQRVM9KAotICAiVUlOVDggICA6dWludDhfdCAiCi0gICJVSU5UMTYgICA6dWludDE2X3QgIgotICAiVUlOVDMyICAgOnVpbnQzMl90ICIKLSAgIlVJTlQ2NCAgIDp1aW50NjRfdCAiCi0gICJJTlQ4ICAgOmludDhfdCAiCi0gICJJTlQxNiAgIDppbnQxNl90ICIKLSAgIklOVDMyICAgOmludDMyX3QgIgotICAiSU5UNjQgICA6aW50NjRfdCAiCi0gICJVSU5UODp1aW50OF90IgotICAiVUlOVDE2OnVpbnQxNl90IgotICAiVUlOVDMyOnVpbnQzMl90IgotICAiVUlOVDY0OnVpbnQ2NF90IgotICAiSU5UODppbnQ4X3QiCi0gICJJTlQxNjppbnQxNl90IgotICAiSU5UMzI6aW50MzJfdCIKLSAgIklOVDY0OmludDY0X3QiCi0gICJCT09MRUFOOmJvb2wgICAiCi0gICJUUlVFOnRydWUiCi0gICJGQUxTRTpmYWxzZSIKLSAgIl9fRlVOQ1RJT05fXzpfX2Z1bmNfXyIKLSkKLQotZnVuY3Rpb24gcHJvY2Vzc19maWxlCi17Ci0gIGVjaG8gLW4gIlByb2Nlc3NpbmcgZmlsZSAkMSAiCi0KLSAgZm9yIHR0IGluICIke1RZUEVTW0BdfSIgOwotICBkbwotICAgIGJlZm9yZT0ke3R0JSU6Kn0KLSAgICBhZnRlcj0ke3R0Iyo6fQotCi0gICAgZWNobyAtbiAiLiIKLSAgICBzZWQgLWkgLWUgInMvXGIke2JlZm9yZX0vJHthZnRlcn0vZzsgcy8ke2FmdGVyfV8vJHtiZWZvcmV9Xy9nOyIgIiQxIgotICBkb25lCi0gIGVjaG8KLX0KLQotZnVuY3Rpb24gcHJvY2Vzc19maWxlcwotewotICB1bnRpbCBbIC16ICIkMSIgXQotICBkbwotICAgIHByb2Nlc3NfZmlsZSAiJDEiCi0gICAgc2hpZnQKLSAgZG9uZQotfQotCi0KLSMgTGV0J3MgZG8gdGhpcyAuLi4KLXByb2Nlc3NfZmlsZXMgYGZpbmQgLi8gfCBncmVwIC1FICIke0ZJTEVTfSJgCi0KLSMgQWxsIGRvbmUgLi4uCi1lY2hvCi1lY2hvICJBbGwgZG9uZS4iCi0KLSMgVHJ5IHRvIGJlIGhlbHBmdWwgLi4uCi1QV0Q9YHB3ZGAKLWlmIFtbICIke1BXRH0iID09ICovc3lzdGVtL2J0IF1dCi10aGVuCi0gIGVjaG8gIlBsZWFzZSBlZGl0ICR7UFdEfS9zdGFjay9pbmNsdWRlL2J0X3R5cGVzLmggbmV4dC4iCi1maQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9kdW1wX2hlYXJpbmdhaWRfYXVkaW8ucHkgYi90b29scy9zY3JpcHRzL2R1bXBfaGVhcmluZ2FpZF9hdWRpby5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDMwNGE0OC4uMDAwMDAwMAotLS0gYS90b29scy9zY3JpcHRzL2R1bXBfaGVhcmluZ2FpZF9hdWRpby5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSMgdGhlIExpY2Vuc2UuCi0jCi0jCi0jCi0jCi0jIFRoaXMgc2NyaXB0IGV4dHJhY3RzIEhlYXJpbmcgQWlkIGF1ZGlvIGRhdGEgZnJvbSBidHNub29wLgotIyBHZW5lcmF0ZXMgYSB2YWxpZCBhdWRpbyBmaWxlIHdoaWNoIGNhbiBiZSBwbGF5ZWQgdXNpbmcgcGxheWVyIGxpa2Ugc21wbGF5ZXIuCi0jCi0jIEF1ZGlvIEZpbGUgTmFtZSBGb3JtYXQ6Ci0jIFtQRUVSX0FERFJFU1NdLVtTVEFSVF9USU1FU1RBTVBdLVtBVURJT19UWVBFXS1bU0FNUExFX1JBVEVdLltDT0RFQ10KLSMKLSMgRGVidWcgSW5mb21hdGlvbiBGaWxlIE5hbWUgRm9ybWF0OgotIyBkZWJ1Z192ZXJfW0RFQlVHX1ZFUlNJT05dLVtQRUVSX0FERFJFU1NdLVtTVEFSVF9USU1FU1RBTVBdLVtBVURJT19UWVBFXS1bU0FNUExFX1JBVEVdLnR4dAotIwotIyBQbGF5ZXI6Ci0jIHNtcGxheWVyCi0jCi0jIE5PVEU6Ci0jIFBsZWFzZSBtYWtlIHN1cmUgeW91IEhDSSBTbm9vcCBkYXRhIGZpbGUgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBmcmFtZXM6Ci0jIEhlYXJpbmdBaWQgIkxFIEVuaGFuY2VkIENvbm5lY3Rpb24gQ29tcGxldGUiLCBHQVRUIHdyaXRlIGZvciBBdWRpbyBDb250cm9sCi0jIFBvaW50IHdpdGggIlN0YXJ0IGNtZCIsIGFuZCB0aGUgZGF0YSBmcmFtZXMuCi0KLWltcG9ydCBhcmdwYXJzZQotaW1wb3J0IG9zCi1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3lzCi1pbXBvcnQgdGltZQotCi1JU19TRU5UID0gIklTX1NFTlQiCi1QRUVSX0FERFJFU1MgPSAiUEVFUl9BRERSRVNTIgotQ09OTkVDVElPTl9IQU5ETEUgPSAiQ09OTkVDVElPTl9IQU5ETEUiCi1BVURJT19DT05UUk9MX0FUVFJfSEFORExFID0gIkFVRElPX0NPTlRST0xfQVRUUl9IQU5ETEUiCi1TVEFSVCA9ICJTVEFSVCIKLVRJTUVTVEFNUF9TVFJfRk9STUFUID0gIlRJTUVTVEFNUF9TVFJfRk9STUFUIgotVElNRVNUQU1QX1RJTUVfRk9STUFUID0gIlRJTUVTVEFNUF9USU1FX0ZPUk1BVCIKLUNPREVDID0gIkNPREVDIgotU0FNUExFX1JBVEUgPSAiU0FNUExFX1JBVEUiCi1BVURJT19UWVBFID0gIkFVRElPX1RZUEUiCi1ERUJVR19WRVJTSU9OID0gIkRFQlVHX1ZFUlNJT04iCi1ERUJVR19EQVRBID0gIkRFQlVHX0RBVEEiCi1BVURJT19EQVRBX0IgPSAiQVVESU9fREFUQV9CIgotCi0jIERlYnVnIHBhY2tldCBoZWFkZXIgc3RydWN0Ci1oZWFkZXJfbGlzdF9zdHIgPSBbIkV2ZW50IFByb2Nlc3NlZCIsICJOdW1iZXIgUGFja2V0IE5hY2tlZCBCeSBQZXJpcGhlcmFsIiwgIk51bWJlciBQYWNrZXQgTmFja2VkIEJ5IENlbnRyYWwiXQotIyBEZWJ1ZyBmcmFtZSBpbmZvcm1hdGlvbiBzdHJ1Y3RzCi1kYXRhX2xpc3Rfc3RyID0gWwotICAgICJFdmVudCBOdW1iZXIiLCAiT3ZlcnJ1biIsICJVbmRlcnJ1biIsICJTa2lwcyIsICJSZW5kZXJlZCBBdWRpbyBGcmFtZSIsICJGaXJzdCBQRFUgT3B0aW9uIiwgIlNlY29uZCBQRFUgT3B0aW9uIiwKLSAgICAiVGhpcmQgUERVIE9wdGlvbiIKLV0KLQotQVVESU9fQ09OVFJPTF9QT0lOVF9VVUlEID0gImYwZDRkZTdlNGE4ODQ3NmM5ZDlmMTkzN2IwOTk2Y2MwIgotU0VDX0NPTlZFUlQgPSAxMDAwMDAwCi1mb2xkZXIgPSBOb25lCi1mdWxsX2RlYnVnID0gRmFsc2UKLXNpbXBsZV9kZWJ1ZyA9IEZhbHNlCi0KLWZvcmNlX2F1ZGlvX2NvbnRyb2xfYXR0cl9oYW5kbGUgPSBOb25lCi1kZWZhdWx0X2F1ZGlvX2NvbnRyb2xfYXR0cl9oYW5kbGUgPSAweDAwNzkKLQotYXVkaW9fZGF0YSA9IHt9Ci0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQYXJzZSBBQ0wgRGF0YSBGdW5jdGlvbgotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQYXJzZSBIZWFyaW5nIEFpZCBQYWNrZXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLWRlZiBwYXJzZV9hY2xfaGFfZGVidWdfYnVmZmVyKGRhdGEsIHJlc3VsdCk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBIQSBkZWJ1ZyBidWZmZXIiIiIKLSAgICBpZiBsZW4oZGF0YSkgPCA1OgotICAgICAgICByZXR1cm4KLQotICAgIHZlcnNpb24sIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgIHVwZGF0ZV9hdWRpb19kYXRhKENPTk5FQ1RJT05fSEFORExFLCByZXN1bHRbQ09OTkVDVElPTl9IQU5ETEVdLCBERUJVR19WRVJTSU9OLCBzdHIodmVyc2lvbikpCi0KLSAgICBkZWJ1Z19zdHIgPSByZXN1bHRbVElNRVNUQU1QX1RJTUVfRk9STUFUXQotICAgIGZvciBwIGluIHJhbmdlKDMpOgotICAgICAgICBieXRlX2RhdGEsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgICAgICBkZWJ1Z19zdHIgPSBkZWJ1Z19zdHIgKyAiLCAiICsgaGVhZGVyX2xpc3Rfc3RyW3BdICsgIj0iICsgc3RyKGJ5dGVfZGF0YSkucmp1c3QoMykKLQotICAgIGlmIGZ1bGxfZGVidWc6Ci0gICAgICAgIGRlYnVnX3N0ciA9IGRlYnVnX3N0ciArICJcbiIgKyAifCIuam9pbihkYXRhX2xpc3Rfc3RyKSArICJcbiIKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGlmIGxlbihkYXRhKSA8IDc6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGJhc2UgPSAwCi0gICAgICAgICAgICBkYXRhX2xpc3RfY29udGVudCA9IFtdCi0gICAgICAgICAgICBmb3IgY291bnRlciBpbiByYW5nZSg2KToKLSAgICAgICAgICAgICAgICBwID0gYmFzZSArIGNvdW50ZXIKLSAgICAgICAgICAgICAgICBieXRlX2RhdGEsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgICAgICAgICAgICAgIGlmIHAgPT0gMToKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9saXN0X2NvbnRlbnQuYXBwZW5kKHN0cihieXRlX2RhdGEgJiAweDAzKS5yanVzdChsZW4oZGF0YV9saXN0X3N0cltwXSkpKQotICAgICAgICAgICAgICAgICAgICBkYXRhX2xpc3RfY29udGVudC5hcHBlbmQoc3RyKChieXRlX2RhdGEgPj4gMikgJiAweDAzKS5yanVzdChsZW4oZGF0YV9saXN0X3N0cltwICsgMV0pKSkKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9saXN0X2NvbnRlbnQuYXBwZW5kKHN0cigoYnl0ZV9kYXRhID4+IDQpICYgMHgwZikucmp1c3QobGVuKGRhdGFfbGlzdF9zdHJbcCArIDJdKSkpCi0gICAgICAgICAgICAgICAgICAgIGJhc2UgPSAyCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9saXN0X2NvbnRlbnQuYXBwZW5kKHN0cihieXRlX2RhdGEpLnJqdXN0KGxlbihkYXRhX2xpc3Rfc3RyW3BdKSkpCi0gICAgICAgICAgICBkZWJ1Z19zdHIgPSBkZWJ1Z19zdHIgKyAifCIuam9pbihkYXRhX2xpc3RfY29udGVudCkgKyAiXG4iCi0KLSAgICB1cGRhdGVfYXVkaW9fZGF0YShDT05ORUNUSU9OX0hBTkRMRSwgcmVzdWx0W0NPTk5FQ1RJT05fSEFORExFXSwgREVCVUdfREFUQSwgZGVidWdfc3RyKQotCi0KLWRlZiBwYXJzZV9hY2xfaGFfYXVkaW9fZGF0YShkYXRhLCByZXN1bHQpOgotICAgICIiIlRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgSEEgYXVkaW8gZGF0YS4iIiIKLSAgICBpZiBsZW4oZGF0YSkgPCAyOgotICAgICAgICByZXR1cm4KLSAgICAjIFJlbW92ZSBhdWRpbyBwYWNrZXQgbnVtYmVyCi0gICAgYXVkaW9fZGF0YV9iID0gZGF0YVsxOl0KLSAgICB1cGRhdGVfYXVkaW9fZGF0YShDT05ORUNUSU9OX0hBTkRMRSwgcmVzdWx0W0NPTk5FQ1RJT05fSEFORExFXSwgQVVESU9fREFUQV9CLCBhdWRpb19kYXRhX2IpCi0KLQotZGVmIHBhcnNlX2FjbF9oYV9hdWRpb190eXBlKGRhdGEsIHJlc3VsdCk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBwYXJzZXMgSEEgYXVkaW8gY29udHJvbCBjbWQgYXVkaW8gdHlwZS4iIiIKLSAgICBhdWRpb190eXBlLCBkYXRhID0gdW5wYWNrX2RhdGEoZGF0YSwgMSkKLSAgICBpZiBhdWRpb190eXBlIGlzIE5vbmU6Ci0gICAgICAgIHJldHVybgotICAgIGVsaWYgYXVkaW9fdHlwZSA9PSAweDAxOgotICAgICAgICBhdWRpb190eXBlID0gIlJpbmd0b25lIgotICAgIGVsaWYgYXVkaW9fdHlwZSA9PSAweDAyOgotICAgICAgICBhdWRpb190eXBlID0gIlBob25lY2FsbCIKLSAgICBlbGlmIGF1ZGlvX3R5cGUgPT0gMHgwMzoKLSAgICAgICAgYXVkaW9fdHlwZSA9ICJNZWRpYSIKLSAgICBlbHNlOgotICAgICAgICBhdWRpb190eXBlID0gIlVua25vd24iCi0gICAgdXBkYXRlX2F1ZGlvX2RhdGEoQ09OTkVDVElPTl9IQU5ETEUsIHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0sIEFVRElPX1RZUEUsIGF1ZGlvX3R5cGUpCi0KLQotZGVmIHBhcnNlX2FjbF9oYV9jb2RlYyhkYXRhLCByZXN1bHQpOgotICAgICIiIlRoaXMgZnVuY3Rpb24gcGFyc2VzIEhBIGF1ZGlvIGNvbnRyb2wgY21kIGNvZGVjIGFuZCBzYW1wbGUgcmF0ZS4iIiIKLSAgICBjb2RlYywgZGF0YSA9IHVucGFja19kYXRhKGRhdGEsIDEpCi0gICAgaWYgY29kZWMgPT0gMHgwMToKLSAgICAgICAgY29kZWMgPSAiRzcyMiIKLSAgICAgICAgc2FtcGxlX3JhdGUgPSAiMTZLSFoiCi0gICAgZWxpZiBjb2RlYyA9PSAweDAyOgotICAgICAgICBjb2RlYyA9ICJHNzIyIgotICAgICAgICBzYW1wbGVfcmF0ZSA9ICIyNEtIWiIKLSAgICBlbHNlOgotICAgICAgICBjb2RlYyA9ICJVbmtub3duIgotICAgICAgICBzYW1wbGVfcmF0ZSA9ICJVbmtub3duIgotICAgIHVwZGF0ZV9hdWRpb19kYXRhKENPTk5FQ1RJT05fSEFORExFLCByZXN1bHRbQ09OTkVDVElPTl9IQU5ETEVdLCBDT0RFQywgY29kZWMpCi0gICAgdXBkYXRlX2F1ZGlvX2RhdGEoQ09OTkVDVElPTl9IQU5ETEUsIHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0sIFNBTVBMRV9SQVRFLCBzYW1wbGVfcmF0ZSkKLSAgICBwYXJzZV9hY2xfaGFfYXVkaW9fdHlwZShkYXRhLCByZXN1bHQpCi0KLQotZGVmIHBhcnNlX2FjbF9oYV9hdWRpb19jb250cm9sX2NtZChkYXRhLCByZXN1bHQpOgotICAgICIiIlRoaXMgZnVuY3Rpb24gcGFyc2VzIEhBIGF1ZGlvIGNvbnRyb2wgY21kIGlzIHN0YXJ0L3N0b3AuIiIiCi0gICAgY29udHJvbF9jbWQsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgIGlmIGNvbnRyb2xfY21kID09IDB4MDE6Ci0gICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKENPTk5FQ1RJT05fSEFORExFLCByZXN1bHRbQ09OTkVDVElPTl9IQU5ETEVdLCBTVEFSVCwgVHJ1ZSkKLSAgICAgICAgdXBkYXRlX2F1ZGlvX2RhdGEoQ09OTkVDVElPTl9IQU5ETEUsIHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0sIFRJTUVTVEFNUF9TVFJfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbVElNRVNUQU1QX1NUUl9GT1JNQVRdKQotICAgICAgICBwYXJzZV9hY2xfaGFfY29kZWMoZGF0YSwgcmVzdWx0KQotICAgIGVsaWYgY29udHJvbF9jbWQgPT0gMHgwMjoKLSAgICAgICAgdXBkYXRlX2F1ZGlvX2RhdGEoQ09OTkVDVElPTl9IQU5ETEUsIHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0sIFNUQVJULCBGYWxzZSkKLQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUGFyc2UgQUNMIFBhY2tldAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotZGVmIHBhcnNlX2FjbF9hdHRfbG9uZ191dWlkKGRhdGEsIHJlc3VsdCk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBwYXJzZXMgQVRUIGxvbmcgVVVJRCB0byBnZXQgYXR0cl9oYW5kbGUuIiIiCi0gICAgIyBsZW4gKDEgYnl0ZSkgKyBzdGFydF9hdHRyX2hhbmRsZSAoMiBieXRlcykgKyBwcm9wZXJ0aWVzICgxIGJ5dGUpICsKLSAgICAjIGF0dHJfaGFuZGxlICgyIGJ5dGVzKSArIGxvbmdfdXVpZCAoMTYgYnl0ZXMpID0gMjIgYnl0ZXMKLSAgICBpZiBsZW4oZGF0YSkgPCAyMjoKLSAgICAgICAgcmV0dXJuCi0gICAgIyBza2lwIHVucGFjayBsZW4sIHN0YXJ0X2F0dHJfaGFuZGxlLCBwcm9wZXJ0aWVzLgotICAgIGRhdGEgPSBkYXRhWzQ6XQotICAgIGF0dHJfaGFuZGxlLCBkYXRhID0gdW5wYWNrX2RhdGEoZGF0YSwgMikKLSAgICBsb25nX3V1aWRfbGlzdCA9IFtdCi0gICAgZm9yIHAgaW4gcmFuZ2UoMCwgMTYpOgotICAgICAgICBsb25nX3V1aWRfbGlzdC5hcHBlbmQoInswOjAyeH0iLmZvcm1hdChzdHJ1Y3QudW5wYWNrKCI+QiIsIGRhdGFbcF0pWzBdKSkKLSAgICBsb25nX3V1aWRfbGlzdC5yZXZlcnNlKCkKLSAgICBsb25nX3V1aWQgPSAiIi5qb2luKGxvbmdfdXVpZF9saXN0KQotICAgICMgQ2hlY2sgbG9uZ191dWlkIGlzIEFVRElPX0NPTlRST0xfUE9JTlQgdXVpZCB0byBnZXQgdGhlIGF0dHJfaGFuZGxlLgotICAgIGlmIGxvbmdfdXVpZCA9PSBBVURJT19DT05UUk9MX1BPSU5UX1VVSUQ6Ci0gICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKENPTk5FQ1RJT05fSEFORExFLCByZXN1bHRbQ09OTkVDVElPTl9IQU5ETEVdLCBBVURJT19DT05UUk9MX0FUVFJfSEFORExFLCBhdHRyX2hhbmRsZSkKLQotCi1kZWYgcGFyc2VfYWNsX29wY29kZShkYXRhLCByZXN1bHQpOgotICAgICIiIlRoaXMgZnVuY3Rpb24gcGFyc2VzIGFjbCBkYXRhIG9wY29kZS4iIiIKLSAgICAjIG9wY29kZSAoMSBieXRlKSA9IDEgYnl0ZXMKLSAgICBpZiBsZW4oZGF0YSkgPCAxOgotICAgICAgICByZXR1cm4KLSAgICBvcGNvZGUsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgICMgQ2hlY2sgb3Bjb2RlIGlzIDB4MTIgKHdyaXRlIHJlcXVlc3QpIGFuZCBhdHRyX2hhbmRsZSBpcwotICAgICMgYXVkaW9fY29udHJvbF9hdHRyX2hhbmRsZSBmb3IgY2hlY2sgaXQgaXMgSEEgYXVkaW8gY29udHJvbCBjbWQuCi0gICAgaWYgcmVzdWx0W0lTX1NFTlRdIGFuZCBvcGNvZGUgPT0gMHgxMjoKLSAgICAgICAgaWYgbGVuKGRhdGEpIDwgMjoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBhdHRyX2hhbmRsZSwgZGF0YSA9IHVucGFja19kYXRhKGRhdGEsIDIpCi0gICAgICAgIGlmIGF0dHJfaGFuZGxlID09IFwKLSAgICAgICAgICAgIGdldF9hdWRpb19jb250cm9sX2F0dHJfaGFuZGxlKHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0pOgotICAgICAgICAgICAgcGFyc2VfYWNsX2hhX2F1ZGlvX2NvbnRyb2xfY21kKGRhdGEsIHJlc3VsdCkKLSAgICAjIENoZWNrIG9wY29kZSBpcyAweDA5IChyZWFkIHJlc3BvbnNlKSB0byBwYXJzZSBBVFQgbG9uZyBVVUlELgotICAgIGVsaWYgbm90IHJlc3VsdFtJU19TRU5UXSBhbmQgb3Bjb2RlID09IDB4MDk6Ci0gICAgICAgIHBhcnNlX2FjbF9hdHRfbG9uZ191dWlkKGRhdGEsIHJlc3VsdCkKLQotCi1kZWYgcGFyc2VfYWNsX2hhbmRsZShkYXRhLCByZXN1bHQpOgotICAgICIiIlRoaXMgZnVuY3Rpb24gcGFyc2VzIGFjbCBkYXRhIGhhbmRsZS4iIiIKLSAgICAjIGNvbm5lY3Rpb25faGFuZGxlICgyIGJ5dGVzKSArIHRvdGFsX2xlbiAoMiBieXRlcykgKyBwZHUgKDIgYnl0ZXMpCi0gICAgIyArIGNoYW5uZWxfaWQgKDIgYnl0ZXMpID0gOCBieXRlcwotICAgIGlmIGxlbihkYXRhKSA8IDg6Ci0gICAgICAgIHJldHVybgotICAgIGNvbm5lY3Rpb25faGFuZGxlLCBkYXRhID0gdW5wYWNrX2RhdGEoZGF0YSwgMikKLSAgICBjb25uZWN0aW9uX2hhbmRsZSA9IGNvbm5lY3Rpb25faGFuZGxlICYgMHgwRkZGCi0gICAgIyBza2lwIHVucGFjayB0b3RhbF9sZW4KLSAgICBkYXRhID0gZGF0YVsyOl0KLSAgICBwZHUsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAyKQotICAgIGNoYW5uZWxfaWQsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAyKQotCi0gICAgIyBDaGVjayBBVFQgcGFja2V0IG9yICJDb2MgRGF0YSBQYWNrZXQiIHRvIGdldCBBVFQgaW5mb3JtYXRpb24gYW5kIGF1ZGlvCi0gICAgIyBkYXRhLgotICAgIGlmIGNvbm5lY3Rpb25faGFuZGxlIDw9IDB4MEVGRjoKLSAgICAgICAgaWYgY2hhbm5lbF9pZCA8PSAweDAwM0Y6Ci0gICAgICAgICAgICByZXN1bHRbQ09OTkVDVElPTl9IQU5ETEVdID0gY29ubmVjdGlvbl9oYW5kbGUKLSAgICAgICAgICAgIHBhcnNlX2FjbF9vcGNvZGUoZGF0YSwgcmVzdWx0KQotICAgICAgICBlbGlmIGNoYW5uZWxfaWQgPj0gMHgwMDQwIGFuZCBjaGFubmVsX2lkIDw9IDB4MDA3RjoKLSAgICAgICAgICAgIHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0gPSBjb25uZWN0aW9uX2hhbmRsZQotICAgICAgICAgICAgc2R1LCBkYXRhID0gdW5wYWNrX2RhdGEoZGF0YSwgMikKLSAgICAgICAgICAgIGlmIHBkdSAtIDIgPT0gc2R1OgotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFtJU19TRU5UXToKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VfYWNsX2hhX2F1ZGlvX2RhdGEoZGF0YSwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHNpbXBsZV9kZWJ1ZzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2FjbF9oYV9kZWJ1Z19idWZmZXIoZGF0YSwgcmVzdWx0KQotCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQYXJzZSBIQ0kgRVZUIEZ1bmN0aW9uCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi1kZWYgcGFyc2VfaGNpX2V2dF9wZWVyX2FkZHJlc3MoZGF0YSwgcmVzdWx0KToKLSAgICAiIiJUaGlzIGZ1bmN0aW9uIHBhcnNlcyBwZWVyIGFkZHJlc3MgZnJvbSBoY2kgZXZlbnQuIiIiCi0gICAgcGVlcl9hZGRyZXNzX2xpc3QgPSBbXQotICAgIGFkZHJlc3NfZW1wdHlfbGlzdCA9IFsiMDAiLCAiMDAiLCAiMDAiLCAiMDAiLCAiMDAiLCAiMDAiXQotICAgIGZvciBuIGluIHJhbmdlKDAsIDMpOgotICAgICAgICBpZiBsZW4oZGF0YSkgPCA2OgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGZvciBwIGluIHJhbmdlKDAsIDYpOgotICAgICAgICAgICAgcGVlcl9hZGRyZXNzX2xpc3QuYXBwZW5kKCJ7MDowMnh9Ii5mb3JtYXQoc3RydWN0LnVucGFjaygiPkIiLCBkYXRhW3BdKVswXSkpCi0gICAgICAgICMgQ2hlY2sgdGhlIGFkZHJlc3MgaXMgZW1wdHkgb3Igbm90LgotICAgICAgICBpZiBwZWVyX2FkZHJlc3NfbGlzdCA9PSBhZGRyZXNzX2VtcHR5X2xpc3Q6Ci0gICAgICAgICAgICBkZWwgcGVlcl9hZGRyZXNzX2xpc3RbOl0KLSAgICAgICAgICAgIGRhdGEgPSBkYXRhWzY6XQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYnJlYWsKLSAgICBwZWVyX2FkZHJlc3NfbGlzdC5yZXZlcnNlKCkKLSAgICBwZWVyX2FkZHJlc3MgPSAiXyIuam9pbihwZWVyX2FkZHJlc3NfbGlzdCkKLSAgICB1cGRhdGVfYXVkaW9fZGF0YSgiIiwgIiIsIFBFRVJfQUREUkVTUywgcGVlcl9hZGRyZXNzKQotICAgIHVwZGF0ZV9hdWRpb19kYXRhKFBFRVJfQUREUkVTUywgcGVlcl9hZGRyZXNzLCBDT05ORUNUSU9OX0hBTkRMRSwgcmVzdWx0W0NPTk5FQ1RJT05fSEFORExFXSkKLQotCi1kZWYgcGFyc2VfaGNpX2V2dF9jb2RlKGRhdGEsIHJlc3VsdCk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBwYXJzZXMgaGNpIGV2ZW50IGNvbnRlbnQuIiIiCi0gICAgIyBoY2lfZXZ0ICgxIGJ5dGUpICsgcGFyYW1fdG90YWxfbGVuICgxIGJ5dGUpICsgc3ViX2V2ZW50ICgxIGJ5dGUpCi0gICAgIyArIHN0YXR1cyAoMSBieXRlKSArIGNvbm5lY3Rpb25faGFuZGxlICgyIGJ5dGVzKSArIHJvbGUgKDEgYnl0ZSkKLSAgICAjICsgYWRkcmVzc190eXBlICgxIGJ5dGUpID0gOCBieXRlcwotICAgIGlmIGxlbihkYXRhKSA8IDg6Ci0gICAgICAgIHJldHVybgotICAgIGhjaV9ldnQsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgICMgc2tpcCB1bnBhY2sgcGFyYW1fdG90YWxfbGVuLgotICAgIGRhdGEgPSBkYXRhWzE6XQotICAgIHN1Yl9ldmVudCwgZGF0YSA9IHVucGFja19kYXRhKGRhdGEsIDEpCi0gICAgc3RhdHVzLCBkYXRhID0gdW5wYWNrX2RhdGEoZGF0YSwgMSkKLSAgICBjb25uZWN0aW9uX2hhbmRsZSwgZGF0YSA9IHVucGFja19kYXRhKGRhdGEsIDIpCi0gICAgY29ubmVjdGlvbl9oYW5kbGUgPSBjb25uZWN0aW9uX2hhbmRsZSAmIDB4MEZGRgotICAgICMgc2tpcCB1bnBhY2sgcm9sZSwgYWRkcmVzc190eXBlLgotICAgIGRhdGEgPSBkYXRhWzI6XQotICAgICMgV2Ugd2lsbCBkaXJlY3RseSBjaGVjayBpdCBpcyBMRSBFbmhhbmNlZCBDb25uZWN0aW9uIENvbXBsZXRlIG9yIG5vdAotICAgICMgZm9yIGdldCBDb25uZWN0aW9uIEhhbmRsZSBhbmQgQWRkcmVzcy4KLSAgICBpZiBub3QgcmVzdWx0W0lTX1NFTlRdIGFuZCBoY2lfZXZ0ID09IDB4M0UgYW5kIHN1Yl9ldmVudCA9PSAweDBBIFwKLSAgICAgICAgYW5kIHN0YXR1cyA9PSAweDAwIGFuZCBjb25uZWN0aW9uX2hhbmRsZSA8PSAweDBFRkY6Ci0gICAgICAgIHJlc3VsdFtDT05ORUNUSU9OX0hBTkRMRV0gPSBjb25uZWN0aW9uX2hhbmRsZQotICAgICAgICBwYXJzZV9oY2lfZXZ0X3BlZXJfYWRkcmVzcyhkYXRhLCByZXN1bHQpCi0KLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIENvbW1vbiBQYXJzZSBGdW5jdGlvbgotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotZGVmIHBhcnNlX3BhY2tldF9kYXRhKGRhdGEsIHJlc3VsdCk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBwYXJzZXMgcGFja2V0IHR5cGUuIiIiCi0gICAgcGFja2V0X3R5cGUsIGRhdGEgPSB1bnBhY2tfZGF0YShkYXRhLCAxKQotICAgIGlmIHBhY2tldF90eXBlID09IDB4MDI6Ci0gICAgICAgICMgVHJ5IHRvIGNoZWNrIEhlYXJpbmdBaWQgYXVkaW8gY29udHJvbCBwYWNrZXQgYW5kIGRhdGEgcGFja2V0LgotICAgICAgICBwYXJzZV9hY2xfaGFuZGxlKGRhdGEsIHJlc3VsdCkKLSAgICBlbGlmIHBhY2tldF90eXBlID09IDB4MDQ6Ci0gICAgICAgICMgVHJ5IHRvIGNoZWNrIEhlYXJpbmdBaWQgY29ubmVjdGlvbiBzdWNjZXNzZnVsIHBhY2tldC4KLSAgICAgICAgcGFyc2VfaGNpX2V2dF9jb2RlKGRhdGEsIHJlc3VsdCkKLQotCi1kZWYgcGFyc2VfcGFja2V0KGJ0c25vb3BfZmlsZSk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBwYXJzZXMgcGFja2V0IGxlbiwgdGltZXN0YW1wLiIiIgotICAgIHBhY2tldF9yZXN1bHQgPSB7fQotCi0gICAgIyBvcmlfbGVuICg0IGJ5dGVzKSArIGluY2x1ZGVfbGVuICg0IGJ5dGVzKSArIHBhY2tldF9mbGFnICg0IGJ5dGVzKQotICAgICMgKyBkcm9wICg0IGJ5dGVzKSArIHRpbWVzdGFtcCAoOCBieXRlcykgPSAyNCBieXRlcwotICAgIHBhY2tldF9oZWFkZXIgPSBidHNub29wX2ZpbGUucmVhZCgyNCkKLSAgICBpZiBsZW4ocGFja2V0X2hlYWRlcikgIT0gMjQ6Ci0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgb3JpX2xlbiwgaW5jbHVkZV9sZW4sIHBhY2tldF9mbGFnLCBkcm9wLCB0aW1lc3RhbXAgPSBcCi0gICAgICAgIHN0cnVjdC51bnBhY2soIj5JSUlJcSIsIHBhY2tldF9oZWFkZXIpCi0KLSAgICBpZiBvcmlfbGVuID09IGluY2x1ZGVfbGVuOgotICAgICAgICBwYWNrZXRfZGF0YSA9IGJ0c25vb3BfZmlsZS5yZWFkKG9yaV9sZW4pCi0gICAgICAgIGlmIGxlbihwYWNrZXRfZGF0YSkgIT0gb3JpX2xlbjoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBwYWNrZXRfZmxhZyAhPSAyIGFuZCBkcm9wID09IDA6Ci0gICAgICAgICAgICBwYWNrZXRfcmVzdWx0W0lTX1NFTlRdID0gKHBhY2tldF9mbGFnID09IDApCi0gICAgICAgICAgICBwYWNrZXRfcmVzdWx0W1RJTUVTVEFNUF9TVFJfRk9STUFUXSwgcGFja2V0X3Jlc3VsdFtUSU1FU1RBTVBfVElNRV9GT1JNQVRdID0gY29udmVydF90aW1lX3N0cih0aW1lc3RhbXApCi0gICAgICAgICAgICBwYXJzZV9wYWNrZXRfZGF0YShwYWNrZXRfZGF0YSwgcGFja2V0X3Jlc3VsdCkKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIHJldHVybiBUcnVlCi0KLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFVwZGF0ZSBhbmQgRHVtcERhdGEgRnVuY3Rpb24KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLWRlZiBkdW1wX2F1ZGlvX2RhdGEoZGF0YSk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBkdW1wcyBhdWRpbyBkYXRhIGludG8gZmlsZS4iIiIKLSAgICBmaWxlX3R5cGUgPSAiLiIgKyBkYXRhW0NPREVDXQotICAgIGZpbGVfbmFtZV9saXN0ID0gW10KLSAgICBmaWxlX25hbWVfbGlzdC5hcHBlbmQoZGF0YVtQRUVSX0FERFJFU1NdKQotICAgIGZpbGVfbmFtZV9saXN0LmFwcGVuZChkYXRhW1RJTUVTVEFNUF9TVFJfRk9STUFUXSkKLSAgICBmaWxlX25hbWVfbGlzdC5hcHBlbmQoZGF0YVtBVURJT19UWVBFXSkKLSAgICBmaWxlX25hbWVfbGlzdC5hcHBlbmQoZGF0YVtTQU1QTEVfUkFURV0pCi0gICAgaWYgZm9sZGVyIGlzIG5vdCBOb25lOgotICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm9sZGVyKToKLSAgICAgICAgICAgIG9zLm1ha2VkaXJzKGZvbGRlcikKLSAgICAgICAgYXVkaW9fZmlsZV9uYW1lID0gb3MucGF0aC5qb2luKGZvbGRlciwgIi0iLmpvaW4oZmlsZV9uYW1lX2xpc3QpICsgZmlsZV90eXBlKQotICAgICAgICBpZiBkYXRhLmhhc19rZXkoREVCVUdfVkVSU0lPTik6Ci0gICAgICAgICAgICBmaWxlX3ByZWZpeCA9ICJkZWJ1Z192ZXJfIiArIGRhdGFbREVCVUdfVkVSU0lPTl0gKyAiLSIKLSAgICAgICAgICAgIGRlYnVnX2ZpbGVfbmFtZSA9IG9zLnBhdGguam9pbihmb2xkZXIsIGZpbGVfcHJlZml4ICsgIi0iLmpvaW4oZmlsZV9uYW1lX2xpc3QpICsgIi50eHQiKQotICAgIGVsc2U6Ci0gICAgICAgIGF1ZGlvX2ZpbGVfbmFtZSA9ICItIi5qb2luKGZpbGVfbmFtZV9saXN0KSArIGZpbGVfdHlwZQotICAgICAgICBpZiBkYXRhLmhhc19rZXkoREVCVUdfVkVSU0lPTik6Ci0gICAgICAgICAgICBmaWxlX3ByZWZpeCA9ICJkZWJ1Z192ZXJfIiArIGRhdGFbREVCVUdfVkVSU0lPTl0gKyAiLSIKLSAgICAgICAgICAgIGRlYnVnX2ZpbGVfbmFtZSA9IGZpbGVfcHJlZml4ICsgIi0iLmpvaW4oZmlsZV9uYW1lX2xpc3QpICsgIi50eHQiCi0KLSAgICBzeXMuc3Rkb3V0LndyaXRlKCJTdGFydCB0byBkdW1wIEF1ZGlvIEZpbGUgOiAlc1xuIiAlIGF1ZGlvX2ZpbGVfbmFtZSkKLSAgICBpZiBkYXRhLmhhc19rZXkoQVVESU9fREFUQV9CKToKLSAgICAgICAgd2l0aCBvcGVuKGF1ZGlvX2ZpbGVfbmFtZSwgIndiKyIpIGFzIGF1ZGlvX2ZpbGU6Ci0gICAgICAgICAgICBhdWRpb19maWxlLndyaXRlKGRhdGFbQVVESU9fREFUQV9CXSkKLSAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkZpbmlzaGVkIHRvIGR1bXAgQXVkaW8gRmlsZTogJXNcblxuIiAlIGF1ZGlvX2ZpbGVfbmFtZSkKLSAgICBlbHNlOgotICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJGYWlsIHRvIGR1bXAgQXVkaW8gRmlsZTogJXNcbiIgJSBhdWRpb19maWxlX25hbWUpCi0gICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlRoZXJlIGlzbid0IGFueSBIZWFyaW5nIEFpZCBhdWRpbyBkYXRhLlxuXG4iKQotCi0gICAgaWYgc2ltcGxlX2RlYnVnOgotICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJTdGFydCB0byBkdW1wIGF1ZGlvICVzIERlYnVnIEZpbGVcbiIgJSBhdWRpb19maWxlX25hbWUpCi0gICAgICAgIGlmIGRhdGEuaGFzX2tleShERUJVR19EQVRBKToKLSAgICAgICAgICAgIHdpdGggb3BlbihkZWJ1Z19maWxlX25hbWUsICJ3YisiKSBhcyBkZWJ1Z19maWxlOgotICAgICAgICAgICAgICAgIGRlYnVnX2ZpbGUud3JpdGUoZGF0YVtERUJVR19EQVRBXSkKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJGaW5pc2hlZCB0byBkdW1wIERlYnVnIEZpbGU6ICVzXG5cbiIgJSBkZWJ1Z19maWxlX25hbWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJGYWlsIHRvIGR1bXAgYXVkaW8gJXMgRGVidWcgRmlsZVxuIiAlIGF1ZGlvX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlRoZXJlIGlzbid0IGFueSBIZWFyaW5nIEFpZCBkZWJ1ZyBkYXRhLlxuXG4iKQotCi0KLWRlZiB1cGRhdGVfYXVkaW9fZGF0YShyZWxhdGVfa2V5LCByZWxhdGVfdmFsdWUsIGtleSwgdmFsdWUpOgotICAgICIiIgotICBUaGlzIGZ1bmN0aW9uIHJlY29yZHMgdGhlIGR1bXAgYXVkaW8gZmlsZSByZWxhdGVkIGluZm9ybWF0aW9uLgotICBhdWRpb19kYXRhID0gewotICAgIFBFRVJfQUREUkVTUzp7Ci0gICAgICBQRUVSX0FERFJFU1M6IFBFRVJfQUREUkVTUywKLSAgICAgIENPTk5FQ1RJT05fSEFORExFOiBDT05ORUNUSU9OX0hBTkRMRSwKLSAgICAgIEFVRElPX0NPTlRST0xfQVRUUl9IQU5ETEU6IEFVRElPX0NPTlRST0xfQVRUUl9IQU5ETEUsCi0gICAgICBTVEFSVDogVHJ1ZSBvciBGYWxzZSwKLSAgICAgIFRJTUVTVEFNUF9TVFJfRk9STUFUOiBTVEFSVF9USU1FU1RBTVBfU1RSX0ZPUk1BVCwKLSAgICAgIENPREVDOiBDT0RFQywKLSAgICAgIFNBTVBMRV9SQVRFOiBTQU1QTEVfUkFURSwKLSAgICAgIEFVRElPX1RZUEU6IEFVRElPX1RZUEUsCi0gICAgICBERUJVR19WRVJTSU9OOiBERUJVR19WRVJTSU9OLAotICAgICAgREVCVUdfREFUQTogREVCVUdfREFUQSwKLSAgICAgIEFVRElPX0RBVEFfQjogQVVESU9fREFUQV9CCi0gICAgfSwKLSAgICBQRUVSX0FERFJFU1NfMjp7Ci0gICAgICBQRUVSX0FERFJFU1M6IFBFRVJfQUREUkVTUywKLSAgICAgIENPTk5FQ1RJT05fSEFORExFOiBDT05ORUNUSU9OX0hBTkRMRSwKLSAgICAgIEFVRElPX0NPTlRST0xfQVRUUl9IQU5ETEU6IEFVRElPX0NPTlRST0xfQVRUUl9IQU5ETEUsCi0gICAgICBTVEFSVDogVHJ1ZSBvciBGYWxzZSwKLSAgICAgIFRJTUVTVEFNUF9TVFJfRk9STUFUOiBTVEFSVF9USU1FU1RBTVBfU1RSX0ZPUk1BVCwKLSAgICAgIENPREVDOiBDT0RFQywKLSAgICAgIFNBTVBMRV9SQVRFOiBTQU1QTEVfUkFURSwKLSAgICAgIEFVRElPX1RZUEU6IEFVRElPX1RZUEUsCi0gICAgICBERUJVR19WRVJTSU9OOiBERUJVR19WRVJTSU9OLAotICAgICAgREVCVUdfREFUQTogREVCVUdfREFUQSwKLSAgICAgIEFVRElPX0RBVEFfQjogQVVESU9fREFUQV9CCi0gICAgfQotICB9Ci0gICIiIgotICAgIGlmIGtleSA9PSBQRUVSX0FERFJFU1M6Ci0gICAgICAgIGlmIGF1ZGlvX2RhdGEuaGFzX2tleSh2YWx1ZSk6Ci0gICAgICAgICAgICAjIER1bXAgYXVkaW8gZGF0YSBhbmQgY2xlYXIgcHJldmlvdXMgZGF0YS4KLSAgICAgICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKGtleSwgdmFsdWUsIFNUQVJULCBGYWxzZSkKLSAgICAgICAgICAgICMgRXh0cmEgY2xlYXIgQ09OTkVDVElPTl9IQU5ETEUgZHVlIHRvIG5ldyBjb25uZWN0aW9uIGNyZWF0ZS4KLSAgICAgICAgICAgIGlmIGF1ZGlvX2RhdGFbdmFsdWVdLmhhc19rZXkoQ09OTkVDVElPTl9IQU5ETEUpOgotICAgICAgICAgICAgICAgIGF1ZGlvX2RhdGFbdmFsdWVdLnBvcChDT05ORUNUSU9OX0hBTkRMRSwgIiIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBkZXZpY2VfYXVkaW9fZGF0YSA9IHtrZXk6IHZhbHVlfQotICAgICAgICAgICAgdGVtcF9hdWRpb19kYXRhID0ge3ZhbHVlOiBkZXZpY2VfYXVkaW9fZGF0YX0KLSAgICAgICAgICAgIGF1ZGlvX2RhdGEudXBkYXRlKHRlbXBfYXVkaW9fZGF0YSkKLSAgICBlbHNlOgotICAgICAgICBmb3IgaSBpbiBhdWRpb19kYXRhOgotICAgICAgICAgICAgaWYgYXVkaW9fZGF0YVtpXS5oYXNfa2V5KHJlbGF0ZV9rZXkpIFwKLSAgICAgICAgICAgICAgICBhbmQgYXVkaW9fZGF0YVtpXVtyZWxhdGVfa2V5XSA9PSByZWxhdGVfdmFsdWU6Ci0gICAgICAgICAgICAgICAgaWYga2V5ID09IFNUQVJUOgotICAgICAgICAgICAgICAgICAgICBpZiBhdWRpb19kYXRhW2ldLmhhc19rZXkoa2V5KSBhbmQgYXVkaW9fZGF0YVtpXVtrZXldOgotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9hdWRpb19kYXRhKGF1ZGlvX2RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgICMgQ2xlYXIgZGF0YSBleGNlcHQgUEVFUl9BRERSRVNTLCBDT05ORUNUSU9OX0hBTkRMRSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIyBBVURJT19DT05UUk9MX0FUVFJfSEFORExFLgotICAgICAgICAgICAgICAgICAgICBhdWRpb19kYXRhW2ldLnBvcChrZXksICIiKQotICAgICAgICAgICAgICAgICAgICBhdWRpb19kYXRhW2ldLnBvcChUSU1FU1RBTVBfU1RSX0ZPUk1BVCwgIiIpCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RhdGFbaV0ucG9wKENPREVDLCAiIikKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGF0YVtpXS5wb3AoU0FNUExFX1JBVEUsICIiKQotICAgICAgICAgICAgICAgICAgICBhdWRpb19kYXRhW2ldLnBvcChBVURJT19UWVBFLCAiIikKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGF0YVtpXS5wb3AoREVCVUdfVkVSU0lPTiwgIiIpCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RhdGFbaV0ucG9wKERFQlVHX0RBVEEsICIiKQotICAgICAgICAgICAgICAgICAgICBhdWRpb19kYXRhW2ldLnBvcChBVURJT19EQVRBX0IsICIiKQotICAgICAgICAgICAgICAgIGVsaWYga2V5ID09IEFVRElPX0RBVEFfQiBvciBrZXkgPT0gREVCVUdfREFUQToKLSAgICAgICAgICAgICAgICAgICAgaWYgYXVkaW9fZGF0YVtpXS5oYXNfa2V5KFNUQVJUKSBhbmQgYXVkaW9fZGF0YVtpXVtTVEFSVF06Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBhdWRpb19kYXRhW2ldLmhhc19rZXkoa2V5KToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlfZGF0YSA9IGF1ZGlvX2RhdGFbaV0ucG9wKGtleSwgIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvcmlfZGF0YSArIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIEF1ZGlvIGRvZXNuJ3Qgc3RhcnQsIGRvbid0IHJlY29yZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGRldmljZV9hdWRpb19kYXRhID0ge2tleTogdmFsdWV9Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGF0YVtpXS51cGRhdGUoZGV2aWNlX2F1ZGlvX2RhdGEpCi0KLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvb2wgRnVuY3Rpb24KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLWRlZiBnZXRfYXVkaW9fY29udHJvbF9hdHRyX2hhbmRsZShjb25uZWN0aW9uX2hhbmRsZSk6Ci0gICAgIiIiVGhpcyBmdW5jdGlvbiBnZXRzIGF1ZGlvX2NvbnRyb2xfYXR0cl9oYW5kbGUuIiIiCi0gICAgIyBJZiBmb3JjZV9hdWRpb19jb250cm9sX2F0dHJfaGFuZGxlIGlzIHNldCwgd2lsbCB1c2UgaXQgZmlyc3QuCi0gICAgaWYgZm9yY2VfYXVkaW9fY29udHJvbF9hdHRyX2hhbmRsZSBpcyBub3QgTm9uZToKLSAgICAgICAgcmV0dXJuIGZvcmNlX2F1ZGlvX2NvbnRyb2xfYXR0cl9oYW5kbGUKLQotICAgICMgVHJ5IHRvIGNoZWNrIHRoZSBhdWRpb19jb250cm9sX2F0dHJfaGFuZGxlIGlzIHJlY29yZCBpbnRvIGF1ZGlvX2RhdGEuCi0gICAgZm9yIGkgaW4gYXVkaW9fZGF0YToKLSAgICAgICAgaWYgYXVkaW9fZGF0YVtpXS5oYXNfa2V5KENPTk5FQ1RJT05fSEFORExFKSBcCi0gICAgICAgICAgICBhbmQgYXVkaW9fZGF0YVtpXVtDT05ORUNUSU9OX0hBTkRMRV0gPT0gY29ubmVjdGlvbl9oYW5kbGU6Ci0gICAgICAgICAgICBpZiBhdWRpb19kYXRhW2ldLmhhc19rZXkoQVVESU9fQ09OVFJPTF9BVFRSX0hBTkRMRSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2RhdGFbaV1bQVVESU9fQ09OVFJPTF9BVFRSX0hBTkRMRV0KLQotICAgICMgUmV0dXJuIGRlZmF1bHQgYXR0cl9oYW5kbGUgaWYgYXVkaW9fZGF0YSBkb2Vzbid0IHJlY29yZCBpdC4KLSAgICByZXR1cm4gZGVmYXVsdF9hdWRpb19jb250cm9sX2F0dHJfaGFuZGxlCi0KLQotZGVmIHVucGFja19kYXRhKGRhdGEsIGJ5dGUpOgotICAgICIiIlRoaXMgZnVuY3Rpb24gdW5wYWNrcyBkYXRhLiIiIgotICAgIGlmIGJ5dGUgPT0gMToKLSAgICAgICAgdmFsdWUgPSBzdHJ1Y3QudW5wYWNrKCI+QiIsIGRhdGFbMF0pWzBdCi0gICAgZWxpZiBieXRlID09IDI6Ci0gICAgICAgIHZhbHVlID0gc3RydWN0LnVucGFjaygiPkgiLCBkYXRhWzFdICsgZGF0YVswXSlbMF0KLSAgICBlbHNlOgotICAgICAgICB2YWx1ZSA9ICIiCi0gICAgZGF0YSA9IGRhdGFbYnl0ZTpdCi0gICAgcmV0dXJuIHZhbHVlLCBkYXRhCi0KLQotZGVmIGNvbnZlcnRfdGltZV9zdHIodGltZXN0YW1wKToKLSAgICAiIiJUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRpbWUgdG8gc3RyaW5nIGZvcm1hdC4iIiIKLSAgICByZWFsbHlfdGltZXN0YW1wID0gZmxvYXQodGltZXN0YW1wKSAvIFNFQ19DT05WRVJUCi0gICAgbG9jYWxfdGltZXN0YW1wID0gdGltZS5sb2NhbHRpbWUocmVhbGx5X3RpbWVzdGFtcCkKLSAgICBkdCA9IHJlYWxseV90aW1lc3RhbXAgLSBsb25nKHJlYWxseV90aW1lc3RhbXApCi0gICAgbXNfc3RyID0gInswOjA2fSIuZm9ybWF0KGludChyb3VuZChkdCAqIDEwMDAwMDApKSkKLQotICAgIHN0cl9mb3JtYXQgPSB0aW1lLnN0cmZ0aW1lKCIlbV8lZF9fJUhfJU1fJVMiLCBsb2NhbF90aW1lc3RhbXApCi0gICAgZnVsbF9zdHJfZm9ybWF0ID0gc3RyX2Zvcm1hdCArICJfIiArIG1zX3N0cgotCi0gICAgdGltZV9mb3JtYXQgPSB0aW1lLnN0cmZ0aW1lKCIlbS0lZCAlSDolTTolUyIsIGxvY2FsX3RpbWVzdGFtcCkKLSAgICBmdWxsX3RpbWVfZm9ybWF0ID0gdGltZV9mb3JtYXQgKyAiLiIgKyBtc19zdHIKLSAgICByZXR1cm4gZnVsbF9zdHJfZm9ybWF0LCBmdWxsX3RpbWVfZm9ybWF0Ci0KLQotZGVmIHNldF9jb25maWcoKToKLSAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGZvciBzZXQgY29uZmlnIGJ5IGZsYWcgYW5kIGNoZWNrIHRoZSBhcmd2IGlzIGNvcnJlY3QuIiIiCi0gICAgYXJndl9wYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iRXh0cmFjdHMgSGVhcmluZyBBaWQgYXVkaW8gZGF0YSBmcm9tIEJUU05PT1AuIikKLSAgICBhcmd2X3BhcnNlci5hZGRfYXJndW1lbnQoIkJUU05PT1AiLCBoZWxwPSJCTFVFVE9PVEggQlRTTk9PUCBmaWxlLiIpCi0gICAgYXJndl9wYXJzZXIuYWRkX2FyZ3VtZW50KCItZiIsICItLWZvbGRlciIsIGhlbHA9InNlbGVjdCBvdXRwdXQgZm9sZGVyLiIsIGRlc3Q9ImZvbGRlciIpCi0gICAgYXJndl9wYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAiLWMxIiwKLSAgICAgICAgIi0tY29ubmVjdGlvbi1oYW5kbGUxIiwKLSAgICAgICAgaGVscD0ic2V0IGEgZmFrZSBjb25uZWN0aW9uIGhhbmRsZSAxIHRvIGNhcHR1cmUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gZHVtcC4iLAotICAgICAgICBkZXN0PSJjb25uZWN0aW9uX2hhbmRsZTEiLAotICAgICAgICB0eXBlPWludCkKLSAgICBhcmd2X3BhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICItYzIiLAotICAgICAgICAiLS1jb25uZWN0aW9uLWhhbmRsZTIiLAotICAgICAgICBoZWxwPSJzZXQgYSBmYWtlIGNvbm5lY3Rpb24gaGFuZGxlIDIgdG8gY2FwdHVyZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBkdW1wLiIsCi0gICAgICAgIGRlc3Q9ImNvbm5lY3Rpb25faGFuZGxlMiIsCi0gICAgICAgIHR5cGU9aW50KQotICAgIGFyZ3ZfcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICAgIi1ucyIsCi0gICAgICAgICItLW5vLXN0YXJ0IiwKLSAgICAgICAgaGVscD0iTm8gYXVkaW8gJ1N0YXJ0JyBjbWQgaXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGJlZm9yZSBleHRyYWN0aW5nIGF1ZGlvIGRhdGEuIiwKLSAgICAgICAgZGVzdD0ibm9fc3RhcnQiLAotICAgICAgICBkZWZhdWx0PSJGYWxzZSIpCi0gICAgYXJndl9wYXJzZXIuYWRkX2FyZ3VtZW50KAotICAgICAgICAiLWRjIiwKLSAgICAgICAgIi0tZGVmYXVsdC1jb2RlYyIsCi0gICAgICAgIGhlbHA9InNldCBhIGRlZmF1bHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMuIiwKLSAgICAgICAgZGVzdD0iY29kZWMiLAotICAgICAgICBkZWZhdWx0PSJHNzIyIikKLSAgICBhcmd2X3BhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICItYSIsCi0gICAgICAgICItLWF0dHItaGFuZGxlIiwKLSAgICAgICAgaGVscD0iZm9yY2UgdG8gc2VsZWN0IGF1ZGlvIGNvbnRyb2wgYXR0ciBoYW5kbGUuIiwKLSAgICAgICAgZGVzdD0iYXVkaW9fY29udHJvbF9hdHRyX2hhbmRsZSIsCi0gICAgICAgIHR5cGU9aW50KQotICAgIGFyZ3ZfcGFyc2VyLmFkZF9hcmd1bWVudCgKLSAgICAgICAgIi1kIiwgIi0tZGVidWciLCBoZWxwPSJkdW1wIGZ1bGwgZGVidWcgYnVmZmVyIGNvbnRlbnQuIiwgZGVzdD0iZnVsbF9kZWJ1ZyIsIGRlZmF1bHQ9IkZhbHNlIikKLSAgICBhcmd2X3BhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICItc2QiLCAiLS1zaW1wbGUtZGVidWciLCBoZWxwPSJkdW1wIGRlYnVnIGJ1ZmZlciBoZWFkZXIgY29udGVudC4iLCBkZXN0PSJzaW1wbGVfZGVidWciLCBkZWZhdWx0PSJGYWxzZSIpCi0gICAgYXJnID0gYXJndl9wYXJzZXIucGFyc2VfYXJncygpCi0KLSAgICBpZiBhcmcuZm9sZGVyIGlzIG5vdCBOb25lOgotICAgICAgICBnbG9iYWwgZm9sZGVyCi0gICAgICAgIGZvbGRlciA9IGFyZy5mb2xkZXIKLQotICAgIGlmIGFyZy5jb25uZWN0aW9uX2hhbmRsZTEgaXMgbm90IE5vbmUgYW5kIGFyZy5jb25uZWN0aW9uX2hhbmRsZTIgaXMgbm90IE5vbmUgXAotICAgICAgICBhbmQgYXJnLmNvbm5lY3Rpb25faGFuZGxlMSA9PSBhcmcuY29ubmVjdGlvbl9oYW5kbGUyOgotICAgICAgICBhcmd2X3BhcnNlci5lcnJvcigiY29ubmVjdGlvbl9oYW5kbGUxIGNhbid0IGJlIHNhbWUgd2l0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25faGFuZGxlMiIpCi0gICAgICAgIGV4aXQoMSkKLQotICAgIGlmIG5vdCAoYXJnLm5vX3N0YXJ0Lmxvd2VyKCkgPT0gInRydWUiIG9yIGFyZy5ub19zdGFydC5sb3dlcigpID09ICJmYWxzZSIpOgotICAgICAgICBhcmd2X3BhcnNlci5lcnJvcigiLW5zLy0tbm8tc3RhcnQgYXJnIGlzIGludmFsaWQsIGl0IHNob3VsZCBiZSB0cnVlL2ZhbHNlLiIpCi0gICAgICAgIGV4aXQoMSkKLQotICAgIGlmIGFyZy5jb25uZWN0aW9uX2hhbmRsZTEgaXMgbm90IE5vbmU6Ci0gICAgICAgIGZha2VfbmFtZSA9ICJDb25uZWN0aW9uSGFuZGxlIiArIHN0cihhcmcuY29ubmVjdGlvbl9oYW5kbGUxKQotICAgICAgICB1cGRhdGVfYXVkaW9fZGF0YSgiIiwgIiIsIFBFRVJfQUREUkVTUywgZmFrZV9uYW1lKQotICAgICAgICB1cGRhdGVfYXVkaW9fZGF0YShQRUVSX0FERFJFU1MsIGZha2VfbmFtZSwgQ09OTkVDVElPTl9IQU5ETEUsIGFyZy5jb25uZWN0aW9uX2hhbmRsZTEpCi0gICAgICAgIGlmIGFyZy5ub19zdGFydC5sb3dlcigpID09ICJ0cnVlIjoKLSAgICAgICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKFBFRVJfQUREUkVTUywgZmFrZV9uYW1lLCBTVEFSVCwgVHJ1ZSkKLSAgICAgICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKFBFRVJfQUREUkVTUywgZmFrZV9uYW1lLCBUSU1FU1RBTVBfU1RSX0ZPUk1BVCwgIlVua25vd24iKQotICAgICAgICAgICAgdXBkYXRlX2F1ZGlvX2RhdGEoUEVFUl9BRERSRVNTLCBmYWtlX25hbWUsIENPREVDLCBhcmcuY29kZWMpCi0gICAgICAgICAgICB1cGRhdGVfYXVkaW9fZGF0YShQRUVSX0FERFJFU1MsIGZha2VfbmFtZSwgU0FNUExFX1JBVEUsICJVbmtub3duIikKLSAgICAgICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKFBFRVJfQUREUkVTUywgZmFrZV9uYW1lLCBBVURJT19UWVBFLCAiVW5rbm93biIpCi0KLSAgICBpZiBhcmcuY29ubmVjdGlvbl9oYW5kbGUyIGlzIG5vdCBOb25lOgotICAgICAgICBmYWtlX25hbWUgPSAiQ29ubmVjdGlvbkhhbmRsZSIgKyBzdHIoYXJnLmNvbm5lY3Rpb25faGFuZGxlMikKLSAgICAgICAgdXBkYXRlX2F1ZGlvX2RhdGEoIiIsICIiLCBQRUVSX0FERFJFU1MsIGZha2VfbmFtZSkKLSAgICAgICAgdXBkYXRlX2F1ZGlvX2RhdGEoUEVFUl9BRERSRVNTLCBmYWtlX25hbWUsIENPTk5FQ1RJT05fSEFORExFLCBhcmcuY29ubmVjdGlvbl9oYW5kbGUyKQotICAgICAgICBpZiBhcmcubm9fc3RhcnQubG93ZXIoKSA9PSAidHJ1ZSI6Ci0gICAgICAgICAgICB1cGRhdGVfYXVkaW9fZGF0YShQRUVSX0FERFJFU1MsIGZha2VfbmFtZSwgU1RBUlQsIFRydWUpCi0gICAgICAgICAgICB1cGRhdGVfYXVkaW9fZGF0YShQRUVSX0FERFJFU1MsIGZha2VfbmFtZSwgVElNRVNUQU1QX1NUUl9GT1JNQVQsICJVbmtub3duIikKLSAgICAgICAgICAgIHVwZGF0ZV9hdWRpb19kYXRhKFBFRVJfQUREUkVTUywgZmFrZV9uYW1lLCBDT0RFQywgYXJnLmNvZGVjKQotICAgICAgICAgICAgdXBkYXRlX2F1ZGlvX2RhdGEoUEVFUl9BRERSRVNTLCBmYWtlX25hbWUsIFNBTVBMRV9SQVRFLCAiVW5rbm93biIpCi0gICAgICAgICAgICB1cGRhdGVfYXVkaW9fZGF0YShQRUVSX0FERFJFU1MsIGZha2VfbmFtZSwgQVVESU9fVFlQRSwgIlVua25vd24iKQotCi0gICAgaWYgYXJnLmF1ZGlvX2NvbnRyb2xfYXR0cl9oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgIGdsb2JhbCBmb3JjZV9hdWRpb19jb250cm9sX2F0dHJfaGFuZGxlCi0gICAgICAgIGZvcmNlX2F1ZGlvX2NvbnRyb2xfYXR0cl9oYW5kbGUgPSBhcmcuYXVkaW9fY29udHJvbF9hdHRyX2hhbmRsZQotCi0gICAgZ2xvYmFsIGZ1bGxfZGVidWcKLSAgICBnbG9iYWwgc2ltcGxlX2RlYnVnCi0gICAgaWYgYXJnLmZ1bGxfZGVidWcubG93ZXIoKSA9PSAidHJ1ZSI6Ci0gICAgICAgIGZ1bGxfZGVidWcgPSBUcnVlCi0gICAgICAgIHNpbXBsZV9kZWJ1ZyA9IFRydWUKLSAgICBlbGlmIGFyZy5zaW1wbGVfZGVidWcubG93ZXIoKSA9PSAidHJ1ZSI6Ci0gICAgICAgIHNpbXBsZV9kZWJ1ZyA9IFRydWUKLQotICAgIGlmIG9zLnBhdGguaXNmaWxlKGFyZy5CVFNOT09QKToKLSAgICAgICAgcmV0dXJuIGFyZy5CVFNOT09QCi0gICAgZWxzZToKLSAgICAgICAgYXJndl9wYXJzZXIuZXJyb3IoIkJUU05PT1AgZmlsZSBub3QgZm91bmQ6ICVzIiAlIGFyZy5CVFNOT09QKQotICAgICAgICBleGl0KDEpCi0KLQotZGVmIG1haW4oKToKLSAgICBidHNub29wX2ZpbGVfbmFtZSA9IHNldF9jb25maWcoKQotCi0gICAgd2l0aCBvcGVuKGJ0c25vb3BfZmlsZV9uYW1lLCAicmIiKSBhcyBidHNub29wX2ZpbGU6Ci0gICAgICAgIGlkZW50aWZpY2F0aW9uID0gYnRzbm9vcF9maWxlLnJlYWQoOCkKLSAgICAgICAgaWYgaWRlbnRpZmljYXRpb24gIT0gImJ0c25vb3BcMCI6Ci0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDaGVjayBpZGVudGlmaWNhdGlvbiBmYWlsLiBJdCBpcyBub3QgY29ycmVjdCBidHNub29wIGZpbGUuIikKLSAgICAgICAgICAgIGV4aXQoMSkKLQotICAgICAgICB2ZXIsIGRhdGFfbGluayA9IHN0cnVjdC51bnBhY2soIj5JSSIsIGJ0c25vb3BfZmlsZS5yZWFkKDQgKyA0KSkKLSAgICAgICAgaWYgKHZlciAhPSAxKSBvciAoZGF0YV9saW5rICE9IDEwMDIpOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2hlY2sgdmVyIG9yIGRhdGFMaW5rIGZhaWwuIEl0IGlzIG5vdCBjb3JyZWN0IGJ0c25vb3AgZmlsZS4iKQotICAgICAgICAgICAgZXhpdCgxKQotCi0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICBpZiBub3QgcGFyc2VfcGFja2V0KGJ0c25vb3BfZmlsZSk6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICBmb3IgaSBpbiBhdWRpb19kYXRhOgotICAgICAgICAgICAgaWYgYXVkaW9fZGF0YVtpXS5nZXQoU1RBUlQsIEZhbHNlKToKLSAgICAgICAgICAgICAgICBkdW1wX2F1ZGlvX2RhdGEoYXVkaW9fZGF0YVtpXSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy9kdW1wX2xlX2F1ZGlvLnB5IGIvdG9vbHMvc2NyaXB0cy9kdW1wX2xlX2F1ZGlvLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YzQxZGYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvZHVtcF9sZV9hdWRpby5weQorKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSMgdGhlIExpY2Vuc2UuCi0jCi0jCi0jIFRoaXMgc2NyaXB0IGV4dHJhY3RzIExFIEF1ZGlvIGF1ZGlvIGRhdGEgZnJvbSBidHNub29wLgotIyBHZW5lcmF0ZXMgYSBhdWRpbyBkdW1wIGZpbGUgd2hlcmUgZWFjaCBmcmFtZSBjb25zaXN0cyBvZiBhIHR3by1ieXRlIGZyYW1lCi0jIGxlbmd0aCBpbmZvcm1hdGlvbiBhbmQgdGhlIGNvZGVkIGZyYW1lCi0jCi0jIEF1ZGlvIEZpbGUgTmFtZSBGb3JtYXQ6Ci0jIFtDb250ZXh0XV9zZltTYW1wbGUgZnJlcXVlbmN5XV9mZFtGcmFtZSBkdXJhdGlvbl1fW0NoYW5uZWwgYWxsb2NhdGlvbl1fCi0jIGZyYW1lW09jdGV0cyBwZXIgZnJhbWVdX1tTdHJlYW0gc3RhcnQgdGltZXN0YW1wXV9bRGlyZWN0aW9uXS5iaW4KLSMKLSMKLSMgVXNhZ2U6Ci0jIC4vZHVtcF9sZV9hdWRpby5weSBCVFNOT09QLmNmYQotIwotIyAtdiwgLS12ZXJib3NlIHRvIGVuYWJsZSB0aGUgdmVyYm9zZSBsb2cKLSMgLS1oZWFkZXIsIEFkZCB0aGUgaGVhZGVyIGZvciBMQzMgQ29uZm9ybWFuY2UgSW50ZXJvcGVyYWJpbGl0eSBUZXN0IFNvZnR3YXJlIFYuMS4wLjMgZnJvbSBMQzMgdGVzdCBzcGVjaWZpY2F0aW9uLgotIwotIyBOT1RFOgotIyBQbGVhc2UgbWFrZSBzdXJlIHlvdSBIQ0kgU25vb3AgZGF0YSBmaWxlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgZnJhbWVzOgotIyBHQVRUIHNlcnZpY2UgZGlzY292ZXJ5IGZvciAiQVNFIENvbnRyb2wgUG9pbnQiIGNocmFjdGVyaXN0aWMKLSMgR0FUVCBjb25maWcgY29kZWMgdmlhIEFTRSBDb250cm9sIFBvaW50Ci0jIEhDSSBjcmVhdGUgQ0lTIHRvIHBvaW50IG91dCB0aGUgIlN0YXJ0IHN0cmVhbSIsIGFuZCB0aGUgZGF0YSBmcmFtZXMuCi0jIEhDSSByZW1vdmUgSVNPIGRhdGEgcGF0aCB3b3VsZCB0cmlnZ2VyIGR1bXAgYXVkaW8gZGF0YSBvbmNlCi0jIEFmdGVyIGFsbCBoY2kgcGFja2V0IHBhcnNlIGZpbmlzaGVkLCB3b3VsZCBkdW1wIGFsbCByZW1haW4gYXVkaW8gZGF0YSBhcyB3ZWxsCi0jCi0jIENvcnJlc3BvbmRzaW5nIFNwZWMuCi0jIEFTQ1NfMS4wCi0jIFBBQ1NfMS4wCi0jIEJBUF8xLjAKLSMgTEMzLlRTIFYxLjAuMwotIwotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKLWZyb20gb3MgaW1wb3J0IFhfT0sKLQotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3lzCi1pbXBvcnQgdGltZQotCi1CVFNOT09QX0ZJTEVfTkFNRSA9ICIiCi1CVFNOT09QX0hFQURFUiA9IGInYnRzbm9vcFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAzXHhlYScKLQotQ09NTUFETl9QQUNLRVQgPSAxCi1BQ0xfUEFDS0VUID0gMgotU0NPX1BBQ0tFVCA9IDMKLUVWRU5UX1BBQ0tFVCA9IDQKLUlTT19QQUNLRVQgPSA1Ci0KLVNFTlQgPSAwCi1SRUNFSVZFRCA9IDEKLQotTDJDQVBfQVRUX0NJRCA9IDQKLQotIyBvcGNvZGUgZm9yIGF0dCBwcm90b2NvbAotT1BDT0RFX0FUVF9SRUFEX0JZX1RZUEVfUlNQID0gMHgwOQotT1BDT0RFX0FUVF9XUklURV9DTUQgPSAweDUyCi0KLVVVSURfQVNFX0NPTlRST0xfUE9JTlQgPSAweDJCQzYKLQotIyBvcGNvZGUgZm9yIGFzZSBjb250cm9sCi1PUENPREVfQ09ORklHX0NPREVDID0gMHgwMQotT1BDT0RFX0VOQUJMRSA9IDB4MDMKLU9QQ09ERV9SRUxFQVNFID0gMHgwOAotCi0jIG9wY29kZSBmb3IgaGNpIGNvbW1hbmQKLU9QQ09ERV9IQ0lfQ1JFQVRFX0NJUyA9IDB4MjA2NAotT1BDT0RFX1JFTU9WRV9JU09fREFUQV9QQVRIID0gMHgyMDZGCi0KLVRZUEVfU1RSRUFNSU5HX0FVRElPX0NPTlRFWFRTID0gMHgwMgotCi1UWVBFX1NBTVBMSU5HX0ZSRVFVRU5DSUVTID0gMHgwMQotVFlQRV9GUkFNRV9EVVJBVElPTiA9IDB4MDIKLVRZUEVfQ0hBTk5FTF9BTExPQ0FUSU9OID0gMHgwMwotVFlQRV9PQ1RFVFNfUEVSX0ZSQU1FID0gMHgwNAotCi1DT05URVhUX1RZUEVfQ09OVkVSU0FUSU9OQUwgPSAweDAwMDIKLUNPTlRFWFRfVFlQRV9NRURJQSA9IDB4MDAwNAotQ09OVEVYVF9UWVBFX1JJTkdUT05FID0gMHgwMjAwCi0KLSMgc2FtcGxlIGZyZXF1ZW5jeQotU0FNUExFX0ZSRVFVRU5DWV84MDAwID0gMHgwMQotU0FNUExFX0ZSRVFVRU5DWV8xMTAyNSA9IDB4MDIKLVNBTVBMRV9GUkVRVUVOQ1lfMTYwMDAgPSAweDAzCi1TQU1QTEVfRlJFUVVFTkNZXzIyMDUwID0gMHgwNAotU0FNUExFX0ZSRVFVRU5DWV8yNDAwMCA9IDB4MDUKLVNBTVBMRV9GUkVRVUVOQ1lfMzIwMDAgPSAweDA2Ci1TQU1QTEVfRlJFUVVFTkNZXzQ0MTAwID0gMHgwNwotU0FNUExFX0ZSRVFVRU5DWV80ODAwMCA9IDB4MDgKLVNBTVBMRV9GUkVRVUVOQ1lfODgyMDAgPSAweDA5Ci1TQU1QTEVfRlJFUVVFTkNZXzk2MDAwID0gMHgwYQotU0FNUExFX0ZSRVFVRU5DWV8xNzY0MDAgPSAweDBiCi1TQU1QTEVfRlJFUVVFTkNZXzE5MjAwMCA9IDB4MGMKLVNBTVBMRV9GUkVRVUVOQ1lfMzg0MDAwID0gMHgwZAotCi1GUkFNRV9EVVJBVElPTl83XzUgPSAweDAwCi1GUkFNRV9EVVJBVElPTl8xMCA9IDB4MDEKLQotQVVESU9fTE9DQVRJT05fTU9OTyA9IDB4MDAKLUFVRElPX0xPQ0FUSU9OX0xFRlQgPSAweDAxCi1BVURJT19MT0NBVElPTl9SSUdIVCA9IDB4MDIKLUFVRElPX0xPQ0FUSU9OX0NFTlRFUiA9IDB4MDQKLQotcGFja2V0X251bWJlciA9IDAKLWRlYnVnX2VuYWJsZSA9IEZhbHNlCi1hZGRfaGVhZGVyID0gRmFsc2UKLQotCi1jbGFzcyBDb25uZWN0aW9uOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmFzZV9oYW5kbGUgPSAweEZGRkYKLSAgICAgICAgc2VsZi5udW1iZXJfb2ZfYXNlcyA9IDAKLSAgICAgICAgc2VsZi5hc2UgPSBkZWZhdWx0ZGljdChBc2VTdHJlYW0pCi0gICAgICAgIHNlbGYuY29udGV4dCA9IDB4RkZGRgotICAgICAgICBzZWxmLmNpc19oYW5kbGUgPSAweEZGRkYKLSAgICAgICAgc2VsZi5pbnB1dF9kdW1wID0gW10KLSAgICAgICAgc2VsZi5vdXRwdXRfZHVtcCA9IFtdCi0gICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IDB4RkZGRkZGRkYKLQotICAgIGRlZiBkdW1wKHNlbGYpOgotICAgICAgICBwcmludCgic3RhcnRfdGltZTogIiArIHN0cihzZWxmLnN0YXJ0X3RpbWUpKQotICAgICAgICBwcmludCgiYXNlX2hhbmRsZTogIiArIHN0cihzZWxmLmFzZV9oYW5kbGUpKQotICAgICAgICBwcmludCgiY29udGV4dCB0eXBlOiAiICsgc3RyKHNlbGYuY29udGV4dCkpCi0gICAgICAgIHByaW50KCJudW1iZXJfb2ZfYXNlczogICIgKyBzdHIoc2VsZi5udW1iZXJfb2ZfYXNlcykpCi0gICAgICAgIHByaW50KCJjaXNfaGFuZGxlOiAgIiArIHN0cihzZWxmLmNpc19oYW5kbGUpKQotICAgICAgICBmb3IgaWQsIGFzZV9zdHJlYW0gaW4gc2VsZi5hc2UuaXRlbXMoKToKLSAgICAgICAgICAgIHByaW50KCJhc2UgaWQ6ICIgKyBzdHIoaWQpKQotICAgICAgICAgICAgYXNlX3N0cmVhbS5kdW1wKCkKLQotCi1jbGFzcyBBc2VTdHJlYW06Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuc2FtcGxpbmdfZnJlcXVlbmNpZXMgPSAweEZGCi0gICAgICAgIHNlbGYuZnJhbWVfZHVyYXRpb24gPSAweEZGCi0gICAgICAgIHNlbGYuY2hhbm5lbF9hbGxvY2F0aW9uID0gMHhGRkZGRkZGRgotICAgICAgICBzZWxmLm9jdGV0c19wZXJfZnJhbWUgPSAweEZGRkYKLQotICAgIGRlZiBkdW1wKHNlbGYpOgotICAgICAgICBwcmludCgic2FtcGxpbmdfZnJlcXVlbmNpZXM6ICIgKyBzdHIoc2VsZi5zYW1wbGluZ19mcmVxdWVuY2llcykpCi0gICAgICAgIHByaW50KCJmcmFtZV9kdXJhdGlvbjogIiArIHN0cihzZWxmLmZyYW1lX2R1cmF0aW9uKSkKLSAgICAgICAgcHJpbnQoImNoYW5uZWxfYWxsb2NhdGlvbjogIiArIHN0cihzZWxmLmNoYW5uZWxfYWxsb2NhdGlvbikpCi0gICAgICAgIHByaW50KCJvY3RldHNfcGVyX2ZyYW1lOiAiICsgc3RyKHNlbGYub2N0ZXRzX3Blcl9mcmFtZSkpCi0KLQotY29ubmVjdGlvbl9tYXAgPSBkZWZhdWx0ZGljdChDb25uZWN0aW9uKQotY2lzX2FjbF9tYXAgPSBkZWZhdWx0ZGljdChpbnQpCi0KLQotZGVmIGdlbmVyYXRlX2hlYWRlcihmaWxlLCBjb25uZWN0aW9uKToKLSAgICBoZWFkZXIgPSBieXRlYXJyYXkuZnJvbWhleCgnMWNjYzEyMDAnKQotICAgIGZvciBhc2UgaW4gY29ubmVjdGlvbi5hc2UudmFsdWVzKCk6Ci0gICAgICAgIHNmX2Nhc2UgPSB7Ci0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzgwMDA6IDgwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8xMTAyNTogMTEwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8xNjAwMDogMTYwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8yMjA1MDogMjIwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8yNDAwMDogMjQwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8zMjAwMDogMzIwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV80NDEwMDogNDQxLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV80ODAwMDogNDgwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV84ODIwMDogODgyLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV85NjAwMDogOTYwLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8xNzY0MDA6IDE3NjQsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzE5MjAwMDogMTkyMCwKLSAgICAgICAgICAgIFNBTVBMRV9GUkVRVUVOQ1lfMzg0MDAwOiAyODQwLAotICAgICAgICB9Ci0gICAgICAgIGhlYWRlciA9IGhlYWRlciArIHN0cnVjdC5wYWNrKCI8SCIsIHNmX2Nhc2VbYXNlLnNhbXBsaW5nX2ZyZXF1ZW5jaWVzXSkKLSAgICAgICAgZmRfY2FzZSA9IHtGUkFNRV9EVVJBVElPTl83XzU6IDcuNSwgRlJBTUVfRFVSQVRJT05fMTA6IDEwfQotICAgICAgICBoZWFkZXIgPSBoZWFkZXIgKyBzdHJ1Y3QucGFjaygiPEgiLCBhc2Uub2N0ZXRzX3Blcl9mcmFtZSAqIDggKiAxMCAvIGZkX2Nhc2VbYXNlLmZyYW1lX2R1cmF0aW9uXSkKLSAgICAgICAgYWxfY2FzZSA9IHtBVURJT19MT0NBVElPTl9NT05POiAxLCBBVURJT19MT0NBVElPTl9MRUZUOiAxLCBBVURJT19MT0NBVElPTl9SSUdIVDogMSwgQVVESU9fTE9DQVRJT05fQ0VOVEVSOiAyfQotICAgICAgICBoZWFkZXIgPSBoZWFkZXIgKyBzdHJ1Y3QucGFjaygiPEhISEwiLCBhbF9jYXNlW2FzZS5jaGFubmVsX2FsbG9jYXRpb25dLCBmZF9jYXNlW2FzZS5mcmFtZV9kdXJhdGlvbl0gKiAxMDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwMDAwKQotICAgICAgICBicmVhawotICAgIGZpbGUud3JpdGUoaGVhZGVyKQotCi0KLWRlZiBwYXJzZV9jb2RlY19pbmZvcm1hdGlvbihjb25uZWN0aW9uX2hhbmRsZSwgYXNlX2lkLCBwYWNrZXQpOgotICAgIGxlbmd0aCwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAxLCBGYWxzZSkKLSAgICBpZiBsZW4ocGFja2V0KSA8IGxlbmd0aDoKLSAgICAgICAgZGVidWdfcHJpbnQoIkludmFsaWQgY29kZWMgY29uZmlndXJhdGlvbiBsZW5ndGgiKQotICAgICAgICByZXR1cm4gcGFja2V0Ci0gICAgYXNlID0gY29ubmVjdGlvbl9tYXBbY29ubmVjdGlvbl9oYW5kbGVdLmFzZVthc2VfaWRdCi0gICAgd2hpbGUgbGVuZ3RoID4gMDoKLSAgICAgICAgY29uZmlnX2xlbmd0aCwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAxLCBGYWxzZSkKLSAgICAgICAgY29uZmlnX3R5cGUsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgIHZhbHVlLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIGNvbmZpZ19sZW5ndGggLSAxLCBGYWxzZSkKLSAgICAgICAgaWYgY29uZmlnX3R5cGUgPT0gVFlQRV9TQU1QTElOR19GUkVRVUVOQ0lFUzoKLSAgICAgICAgICAgIGFzZS5zYW1wbGluZ19mcmVxdWVuY2llcyA9IHZhbHVlCi0gICAgICAgIGVsaWYgY29uZmlnX3R5cGUgPT0gVFlQRV9GUkFNRV9EVVJBVElPTjoKLSAgICAgICAgICAgIGFzZS5mcmFtZV9kdXJhdGlvbiA9IHZhbHVlCi0gICAgICAgIGVsaWYgY29uZmlnX3R5cGUgPT0gVFlQRV9DSEFOTkVMX0FMTE9DQVRJT046Ci0gICAgICAgICAgICBhc2UuY2hhbm5lbF9hbGxvY2F0aW9uID0gdmFsdWUKLSAgICAgICAgZWxpZiBUWVBFX09DVEVUU19QRVJfRlJBTUU6Ci0gICAgICAgICAgICBhc2Uub2N0ZXRzX3Blcl9mcmFtZSA9IHZhbHVlCi0gICAgICAgIGxlbmd0aCAtPSAoY29uZmlnX2xlbmd0aCArIDEpCi0KLSAgICByZXR1cm4gcGFja2V0Ci0KLQotZGVmIHBhcnNlX2F0dF9yZWFkX2J5X3R5cGVfcnNwKHBhY2tldCwgY29ubmVjdGlvbl9oYW5kbGUpOgotICAgIGxlbmd0aCwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAxLCBGYWxzZSkKLSAgICBpZiBsZW5ndGggPiBsZW4ocGFja2V0KToKLSAgICAgICAgZGVidWdfcHJpbnQoIkludmFsaWQgYXR0IHBhY2tldCBsZW5ndGgiKQotICAgICAgICByZXR1cm4KLQotICAgIGF0dHJpYnV0ZV9oYW5kbGUsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMiwgRmFsc2UpCi0gICAgaWYgZGVidWdfZW5hYmxlOgotICAgICAgICBkZWJ1Z19wcmludCgiYXR0cmlidXRlX2hhbmRsZSAtICIgKyBzdHIoYXR0cmlidXRlX2hhbmRsZSkpCi0gICAgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAxLCBUcnVlKQotICAgIHZhbHVlX2hhbmRsZSwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAyLCBGYWxzZSkKLSAgICBjaGFyYWN0ZXJpc3RpY191dWlkLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDIsIEZhbHNlKQotICAgIGlmIGNoYXJhY3RlcmlzdGljX3V1aWQgPT0gVVVJRF9BU0VfQ09OVFJPTF9QT0lOVDoKLSAgICAgICAgZGVidWdfcHJpbnQoIkFTRSBDb250cm9sIHBvaW50IGZvdW5kISIpCi0gICAgICAgIGNvbm5lY3Rpb25fbWFwW2Nvbm5lY3Rpb25faGFuZGxlXS5hc2VfaGFuZGxlID0gdmFsdWVfaGFuZGxlCi0KLQotZGVmIHBhcnNlX2F0dF93cml0ZV9jbWQocGFja2V0LCBjb25uZWN0aW9uX2hhbmRsZSwgdGltZXN0YW1wKToKLSAgICBhdHRyaWJ1dGVfaGFuZGxlLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDIsIEZhbHNlKQotICAgIGlmIGNvbm5lY3Rpb25fbWFwW2Nvbm5lY3Rpb25faGFuZGxlXS5hc2VfaGFuZGxlID09IGF0dHJpYnV0ZV9oYW5kbGU6Ci0gICAgICAgIGlmIGRlYnVnX2VuYWJsZToKLSAgICAgICAgICAgIGRlYnVnX3ByaW50KCJBY3Rpb24gd2l0aCBBU0UgQ29udHJvbCBwb2ludCIpCi0gICAgICAgIG9wY29kZSwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAxLCBGYWxzZSkKLSAgICAgICAgaWYgb3Bjb2RlID09IE9QQ09ERV9DT05GSUdfQ09ERUM6Ci0gICAgICAgICAgICBkZWJ1Z19wcmludCgiY29uZmlnX2NvZGVjIikKLSAgICAgICAgICAgIChjb25uZWN0aW9uX21hcFtjb25uZWN0aW9uX2hhbmRsZV0ubnVtYmVyX29mX2FzZXMsIHBhY2tldCkgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDEsIEZhbHNlKQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY29ubmVjdGlvbl9tYXBbY29ubmVjdGlvbl9oYW5kbGVdLm51bWJlcl9vZl9hc2VzKToKLSAgICAgICAgICAgICAgICBhc2VfaWQsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgICAgICAgICAgIyBpZ25vcmUgdGFyZ2V0X2xhdGVuY3ksIHRhcmdldF9waHksIGNvZGVjX2lkCi0gICAgICAgICAgICAgICAgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCA3LCBUcnVlKQotICAgICAgICAgICAgICAgIHBhY2tldCA9IHBhcnNlX2NvZGVjX2luZm9ybWF0aW9uKGNvbm5lY3Rpb25faGFuZGxlLCBhc2VfaWQsIHBhY2tldCkKLSAgICAgICAgZWxpZiBvcGNvZGUgPT0gT1BDT0RFX0VOQUJMRToKLSAgICAgICAgICAgIGRlYnVnX3ByaW50KCJlbmFibGUiKQotICAgICAgICAgICAgbnVtYmVyc19vZl9hc2VzLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDEsIEZhbHNlKQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtYmVyc19vZl9hc2VzKToKLSAgICAgICAgICAgICAgICBhc2VfaWQsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgICAgICAgICAgbWV0YWRhdGFfbGVuZ3RoLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDEsIEZhbHNlKQotICAgICAgICAgICAgICAgIGlmIG1ldGFkYXRhX2xlbmd0aCA+IGxlbihwYWNrZXQpOgotICAgICAgICAgICAgICAgICAgICBkZWJ1Z19wcmludCgiSW52YWxpZCBtZXRhZGF0YSBsZW5ndGgiKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBsZW5ndGgsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgICAgICAgICAgaWYgbGVuZ3RoID4gbGVuKHBhY2tldCk6Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnX3ByaW50KCJJbnZhbGlkIG1ldGFkYXRhIHZhbHVlIGxlbmd0aCIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIG1ldGFkYXRhX3R5cGUsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgICAgICAgICAgaWYgbWV0YWRhdGFfdHlwZSA9PSBUWVBFX1NUUkVBTUlOR19BVURJT19DT05URVhUUzoKLSAgICAgICAgICAgICAgICAgICAgKGNvbm5lY3Rpb25fbWFwW2Nvbm5lY3Rpb25faGFuZGxlXS5jb250ZXh0LCBwYWNrZXQpID0gdW5wYWNrX2RhdGEocGFja2V0LCAyLCBGYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgY29ubmVjdGlvbl9tYXBbY29ubmVjdGlvbl9oYW5kbGVdLnN0YXJ0X3RpbWUgPSB0aW1lc3RhbXAKLSAgICAgICAgICAgIGlmIGRlYnVnX2VuYWJsZToKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uX21hcFtjb25uZWN0aW9uX2hhbmRsZV0uZHVtcCgpCi0KLQotZGVmIHBhcnNlX2F0dF9wYWNrZXQocGFja2V0LCBjb25uZWN0aW9uX2hhbmRsZSwgZmxhZ3MsIHRpbWVzdGFtcCk6Ci0gICAgb3Bjb2RlLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDEsIEZhbHNlKQotICAgIHBhY2tldF9oYW5kbGUgPSB7Ci0gICAgICAgIChPUENPREVfQVRUX1JFQURfQllfVFlQRV9SU1AsIFJFQ0VJVkVEKTogKGxhbWJkYSB4LCB5LCB6OiBwYXJzZV9hdHRfcmVhZF9ieV90eXBlX3JzcCh4LCB5KSksCi0gICAgICAgIChPUENPREVfQVRUX1dSSVRFX0NNRCwgU0VOVCk6IChsYW1iZGEgeCwgeSwgejogcGFyc2VfYXR0X3dyaXRlX2NtZCh4LCB5LCB6KSkKLSAgICB9Ci0gICAgcGFja2V0X2hhbmRsZS5nZXQoKG9wY29kZSwgZmxhZ3MpLCBsYW1iZGEgeCwgeSwgejogTm9uZSkocGFja2V0LCBjb25uZWN0aW9uX2hhbmRsZSwgdGltZXN0YW1wKQotCi0KLWRlZiBkZWJ1Z19wcmludChsb2cpOgotICAgIGdsb2JhbCBwYWNrZXRfbnVtYmVyCi0gICAgcHJpbnQoIiMiICsgc3RyKHBhY2tldF9udW1iZXIpICsgIjogIiArIGxvZykKLQotCi1kZWYgdW5wYWNrX2RhdGEoZGF0YSwgYnl0ZSwgaWdub3JlKToKLSAgICBpZiBpZ25vcmU6Ci0gICAgICAgIHJldHVybiBkYXRhW2J5dGU6XQotCi0gICAgdmFsdWUgPSAwCi0gICAgaWYgYnl0ZSA9PSAxOgotICAgICAgICB2YWx1ZSA9IHN0cnVjdC51bnBhY2soIjxCIiwgZGF0YVs6Ynl0ZV0pWzBdCi0gICAgZWxpZiBieXRlID09IDI6Ci0gICAgICAgIHZhbHVlID0gc3RydWN0LnVucGFjaygiPEgiLCBkYXRhWzpieXRlXSlbMF0KLSAgICBlbGlmIGJ5dGUgPT0gNDoKLSAgICAgICAgdmFsdWUgPSBzdHJ1Y3QudW5wYWNrKCI8SSIsIGRhdGFbOmJ5dGVdKVswXQotICAgIHJldHVybiB2YWx1ZSwgZGF0YVtieXRlOl0KLQotCi1kZWYgcGFyc2VfY29tbWFuZF9wYWNrZXQocGFja2V0KToKLSAgICBvcGNvZGUsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMiwgRmFsc2UpCi0gICAgaWYgb3Bjb2RlID09IE9QQ09ERV9IQ0lfQ1JFQVRFX0NJUzoKLSAgICAgICAgZGVidWdfcHJpbnQoIk9QQ09ERV9IQ0lfQ1JFQVRFX0NJUyIpCi0KLSAgICAgICAgbGVuZ3RoLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDEsIEZhbHNlKQotICAgICAgICBpZiBsZW5ndGggIT0gbGVuKHBhY2tldCk6Ci0gICAgICAgICAgICBkZWJ1Z19wcmludCgiSW52YWxpZCBjbWQgbGVuZ3RoIikKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBjaXNfY291bnQsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGNpc19jb3VudCk6Ci0gICAgICAgICAgICBjaXNfaGFuZGxlLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDIsIEZhbHNlKQotICAgICAgICAgICAgY2lzX2hhbmRsZSAmPSAweDBFRkYKLSAgICAgICAgICAgIGFjbF9oYW5kbGUsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMiwgRmFsc2UpCi0gICAgICAgICAgICBjb25uZWN0aW9uX21hcFthY2xfaGFuZGxlXS5jaXNfaGFuZGxlID0gY2lzX2hhbmRsZQotICAgICAgICAgICAgY2lzX2FjbF9tYXBbY2lzX2hhbmRsZV0gPSBhY2xfaGFuZGxlCi0KLSAgICAgICAgaWYgZGVidWdfZW5hYmxlOgotICAgICAgICAgICAgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0uZHVtcCgpCi0gICAgZWxpZiBvcGNvZGUgPT0gT1BDT0RFX1JFTU9WRV9JU09fREFUQV9QQVRIOgotICAgICAgICBkZWJ1Z19wcmludCgiT1BDT0RFX1JFTU9WRV9JU09fREFUQV9QQVRIIikKLQotICAgICAgICBsZW5ndGgsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMSwgRmFsc2UpCi0gICAgICAgIGlmIGxlbmd0aCAhPSBsZW4ocGFja2V0KToKLSAgICAgICAgICAgIGRlYnVnX3ByaW50KCJJbnZhbGlkIGNtZCBsZW5ndGgiKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgY2lzX2hhbmRsZSwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAyLCBGYWxzZSkKLSAgICAgICAgYWNsX2hhbmRsZSA9IGNpc19hY2xfbWFwW2Npc19oYW5kbGVdCi0gICAgICAgIGR1bXBfYXVkaW9fZGF0YV90b19maWxlKGFjbF9oYW5kbGUpCi0KLQotZGVmIGNvbnZlcnRfdGltZV9zdHIodGltZXN0YW1wKToKLSAgICAiIiJUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRpbWUgdG8gc3RyaW5nIGZvcm1hdC4iIiIKLSAgICB0aW1lc3RhbXBfc2VjID0gZmxvYXQodGltZXN0YW1wKSAvIDEwMDAwMDAKLSAgICBsb2NhbF90aW1lc3RhbXAgPSB0aW1lLmxvY2FsdGltZSh0aW1lc3RhbXBfc2VjKQotICAgIG1zID0gdGltZXN0YW1wX3NlYyAtIGxvbmcodGltZXN0YW1wX3NlYykKLSAgICBtc19zdHIgPSAiezA6MDZ9Ii5mb3JtYXQoaW50KHJvdW5kKG1zICogMTAwMDAwMCkpKQotCi0gICAgc3RyX2Zvcm1hdCA9IHRpbWUuc3RyZnRpbWUoIiVtXyVkX18lSF8lTV8lUyIsIGxvY2FsX3RpbWVzdGFtcCkKLSAgICBmdWxsX3N0cl9mb3JtYXQgPSBzdHJfZm9ybWF0ICsgIl8iICsgbXNfc3RyCi0KLSAgICByZXR1cm4gZnVsbF9zdHJfZm9ybWF0Ci0KLQotZGVmIGR1bXBfYXVkaW9fZGF0YV90b19maWxlKGFjbF9oYW5kbGUpOgotICAgIGlmIGRlYnVnX2VuYWJsZToKLSAgICAgICAgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0uZHVtcCgpCi0gICAgZmlsZV9uYW1lID0gIiIKLSAgICBjb250ZXh0X2Nhc2UgPSB7Ci0gICAgICAgIENPTlRFWFRfVFlQRV9DT05WRVJTQVRJT05BTDogIkNvbnZlcnNhdGlvbmFsIiwKLSAgICAgICAgQ09OVEVYVF9UWVBFX01FRElBOiAiTWVkaWEiLAotICAgICAgICBDT05URVhUX1RZUEVfUklOR1RPTkU6ICJSaW5ndG9uZSIKLSAgICB9Ci0gICAgZmlsZV9uYW1lICs9IGNvbnRleHRfY2FzZS5nZXQoY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0uY29udGV4dCwgIlVua25vd24iKQotICAgIGZvciBhc2UgaW4gY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0uYXNlLnZhbHVlcygpOgotICAgICAgICBzZl9jYXNlID0gewotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV84MDAwOiAiODAwMCIsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzExMDI1OiAiMTEwMjUiLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8xNjAwMDogIjE2MDAwIiwKLSAgICAgICAgICAgIFNBTVBMRV9GUkVRVUVOQ1lfMjIwNTA6ICIyMjA1MCIsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzI0MDAwOiAiMjQwMDAiLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV8zMjAwMDogIjMyMDAwIiwKLSAgICAgICAgICAgIFNBTVBMRV9GUkVRVUVOQ1lfNDQxMDA6ICI0NDEwMCIsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzQ4MDAwOiAiNDgwMDAiLAotICAgICAgICAgICAgU0FNUExFX0ZSRVFVRU5DWV84ODIwMDogIjg4MjAwIiwKLSAgICAgICAgICAgIFNBTVBMRV9GUkVRVUVOQ1lfOTYwMDA6ICI5NjAwMCIsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzE3NjQwMDogIjE3NjQwMCIsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzE5MjAwMDogIjE5MjAwMCIsCi0gICAgICAgICAgICBTQU1QTEVfRlJFUVVFTkNZXzM4NDAwMDogIjI4NDAwMCIKLSAgICAgICAgfQotICAgICAgICBmaWxlX25hbWUgKz0gKCJfc2YiICsgc2ZfY2FzZVthc2Uuc2FtcGxpbmdfZnJlcXVlbmNpZXNdKQotICAgICAgICBmZF9jYXNlID0ge0ZSQU1FX0RVUkFUSU9OXzdfNTogIjdfNSIsIEZSQU1FX0RVUkFUSU9OXzEwOiAiMTAifQotICAgICAgICBmaWxlX25hbWUgKz0gKCJfZmQiICsgZmRfY2FzZVthc2UuZnJhbWVfZHVyYXRpb25dKQotICAgICAgICBhbF9jYXNlID0gewotICAgICAgICAgICAgQVVESU9fTE9DQVRJT05fTU9OTzogIm1vbm8iLAotICAgICAgICAgICAgQVVESU9fTE9DQVRJT05fTEVGVDogImxlZnQiLAotICAgICAgICAgICAgQVVESU9fTE9DQVRJT05fUklHSFQ6ICJyaWdodCIsCi0gICAgICAgICAgICBBVURJT19MT0NBVElPTl9DRU5URVI6ICJjZW50ZXIiCi0gICAgICAgIH0KLSAgICAgICAgZmlsZV9uYW1lICs9ICgiXyIgKyBhbF9jYXNlW2FzZS5jaGFubmVsX2FsbG9jYXRpb25dKQotICAgICAgICBmaWxlX25hbWUgKz0gKCJfZnJhbWUiICsgc3RyKGFzZS5vY3RldHNfcGVyX2ZyYW1lKSkKLSAgICAgICAgZmlsZV9uYW1lICs9ICgiXyIgKyBjb252ZXJ0X3RpbWVfc3RyKGNvbm5lY3Rpb25fbWFwW2FjbF9oYW5kbGVdLnN0YXJ0X3RpbWUpKQotICAgICAgICBicmVhawotCi0gICAgaWYgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0uaW5wdXRfZHVtcCAhPSBbXToKLSAgICAgICAgZGVidWdfcHJpbnQoIkR1bXAgaW5wdXQuLi4iKQotICAgICAgICBmID0gb3BlbihmaWxlX25hbWUgKyAiX2lucHV0LmJpbiIsICd3YicpCi0gICAgICAgIGlmIGFkZF9oZWFkZXIgPT0gVHJ1ZToKLSAgICAgICAgICAgIGdlbmVyYXRlX2hlYWRlcihmLCBjb25uZWN0aW9uX21hcFthY2xfaGFuZGxlXSkKLSAgICAgICAgYXJyID0gYnl0ZWFycmF5KGNvbm5lY3Rpb25fbWFwW2FjbF9oYW5kbGVdLmlucHV0X2R1bXApCi0gICAgICAgIGYud3JpdGUoYXJyKQotICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0uaW5wdXRfZHVtcCA9IFtdCi0KLSAgICBpZiBjb25uZWN0aW9uX21hcFthY2xfaGFuZGxlXS5vdXRwdXRfZHVtcCAhPSBbXToKLSAgICAgICAgZGVidWdfcHJpbnQoIkR1bXAgb3V0cHV0Li4uIikKLSAgICAgICAgZiA9IG9wZW4oZmlsZV9uYW1lICsgIl9vdXRwdXQuYmluIiwgJ3diJykKLSAgICAgICAgaWYgYWRkX2hlYWRlciA9PSBUcnVlOgotICAgICAgICAgICAgZ2VuZXJhdGVfaGVhZGVyKGYsIGNvbm5lY3Rpb25fbWFwW2FjbF9oYW5kbGVdKQotICAgICAgICBhcnIgPSBieXRlYXJyYXkoY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0ub3V0cHV0X2R1bXApCi0gICAgICAgIGYud3JpdGUoYXJyKQotICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0ub3V0cHV0X2R1bXAgPSBbXQotCi0gICAgcmV0dXJuCi0KLQotZGVmIHBhcnNlX2FjbF9wYWNrZXQocGFja2V0LCBmbGFncywgdGltZXN0YW1wKToKLSAgICAjIENoZWNrIHRoZSBtaW5pbXVtIGFjbCBsZW5ndGgsIEhDSSBsZWFkZXIgKDQgYnl0ZXMpCi0gICAgIyArIEwyQ0FQIGhlYWRlciAoNCBieXRlcykKLSAgICBpZiBsZW4ocGFja2V0KSA8IDg6Ci0gICAgICAgIGRlYnVnX3ByaW50KCJJbnZhbGlkIGFjbCBkYXRhIGxlbmd0aC4iKQotICAgICAgICByZXR1cm4KLQotICAgIGNvbm5lY3Rpb25faGFuZGxlLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDIsIEZhbHNlKQotICAgIGNvbm5lY3Rpb25faGFuZGxlID0gY29ubmVjdGlvbl9oYW5kbGUgJiAweDBGRkYKLSAgICBpZiBjb25uZWN0aW9uX2hhbmRsZSA+IDB4MEVGRjoKLSAgICAgICAgZGVidWdfcHJpbnQoIkludmFsaWQgcGFja2V0IGhhbmRsZSwgc2tpcCIpCi0gICAgICAgIHJldHVybgotICAgIHRvdGFsX2xlbmd0aCwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAyLCBGYWxzZSkKLSAgICBpZiB0b3RhbF9sZW5ndGggIT0gbGVuKHBhY2tldCk6Ci0gICAgICAgIGRlYnVnX3ByaW50KCJJbnZhbGlkIHRvdGFsIGxlbmd0aCwgc2tpcCIpCi0gICAgICAgIHJldHVybgotICAgIHBkdV9sZW5ndGgsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMiwgRmFsc2UpCi0gICAgY2hhbm5lbF9pZCwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAyLCBGYWxzZSkKLSAgICBpZiBwZHVfbGVuZ3RoICE9IGxlbihwYWNrZXQpOgotICAgICAgICBkZWJ1Z19wcmludCgiSW52YWxpZCBwZHUgbGVuZ3RoLCBza2lwIikKLSAgICAgICAgcmV0dXJuCi0KLSAgICBpZiBkZWJ1Z19lbmFibGU6Ci0gICAgICAgIGRlYnVnX3ByaW50KCJBQ0wgY29ubmVjdGlvbl9oYW5kbGUgLSAiICsgc3RyKGNvbm5lY3Rpb25faGFuZGxlKSkKLSAgICAjIFBhcnNlIEFUVCBwcm90b2NvbAotICAgIGlmIGNoYW5uZWxfaWQgPT0gTDJDQVBfQVRUX0NJRDoKLSAgICAgICAgcGFyc2VfYXR0X3BhY2tldChwYWNrZXQsIGNvbm5lY3Rpb25faGFuZGxlLCBmbGFncywgdGltZXN0YW1wKQotCi0KLWRlZiBwYXJzZV9pc29fcGFja2V0KHBhY2tldCwgZmxhZ3MpOgotICAgIGNpc19oYW5kbGUsIHBhY2tldCA9IHVucGFja19kYXRhKHBhY2tldCwgMiwgRmFsc2UpCi0gICAgY2lzX2hhbmRsZSAmPSAweDBFRkYKLSAgICBpc29fZGF0YV9sb2FkX2xlbmd0aCwgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCAyLCBGYWxzZSkKLSAgICBpZiBpc29fZGF0YV9sb2FkX2xlbmd0aCAhPSBsZW4ocGFja2V0KToKLSAgICAgICAgZGVidWdfcHJpbnQoIkludmFsaWQgaXNvIGRhdGEgbG9hZCBsZW5ndGgiKQotICAgICAgICByZXR1cm4KLQotICAgICMgSWdub3JlIHRpbWVzdGFtcCwgc2VxdWVuY2UgbnVtYmVyCi0gICAgcGFja2V0ID0gdW5wYWNrX2RhdGEocGFja2V0LCA2LCBUcnVlKQotICAgIGlzb19zZHVfbGVuZ3RoLCBwYWNrZXQgPSB1bnBhY2tfZGF0YShwYWNrZXQsIDIsIEZhbHNlKQotICAgIGlmIGlzb19zZHVfbGVuZ3RoICE9IGxlbihwYWNrZXQpOgotICAgICAgICBkZWJ1Z19wcmludCgiSW52YWxpZCBpc28gc2R1IGxlbmd0aCIpCi0gICAgICAgIHJldHVybgotCi0gICAgYWNsX2hhbmRsZSA9IGNpc19hY2xfbWFwW2Npc19oYW5kbGVdCi0gICAgaWYgZmxhZ3MgPT0gU0VOVDoKLSAgICAgICAgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0ub3V0cHV0X2R1bXAuZXh0ZW5kKHN0cnVjdC5wYWNrKCI8SCIsIGxlbihwYWNrZXQpKSkKLSAgICAgICAgY29ubmVjdGlvbl9tYXBbYWNsX2hhbmRsZV0ub3V0cHV0X2R1bXAuZXh0ZW5kKGxpc3QocGFja2V0KSkKLSAgICBlbGlmIGZsYWdzID09IFJFQ0VJVkVEOgotICAgICAgICBjb25uZWN0aW9uX21hcFthY2xfaGFuZGxlXS5pbnB1dF9kdW1wLmV4dGVuZChzdHJ1Y3QucGFjaygiPEgiLCBsZW4ocGFja2V0KSkpCi0gICAgICAgIGNvbm5lY3Rpb25fbWFwW2FjbF9oYW5kbGVdLmlucHV0X2R1bXAuZXh0ZW5kKGxpc3QocGFja2V0KSkKLQotCi1kZWYgcGFyc2VfbmV4dF9wYWNrZXQoYnRzbm9vcF9maWxlKToKLSAgICBnbG9iYWwgcGFja2V0X251bWJlcgotICAgIHBhY2tldF9udW1iZXIgKz0gMQotICAgIHBhY2tldF9oZWFkZXIgPSBidHNub29wX2ZpbGUucmVhZCgyNSkKLSAgICBpZiBsZW4ocGFja2V0X2hlYWRlcikgIT0gMjU6Ci0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgKGxlbmd0aF9vcmlnaW5hbCwgbGVuZ3RoX2NhcHR1cmVkLCBmbGFncywgZHJvcHBlZF9wYWNrZXRzLCB0aW1lc3RhbXAsIHR5cGUpID0gc3RydWN0LnVucGFjaygKLSAgICAgICAgIj5JSUlJcUIiLCBwYWNrZXRfaGVhZGVyKQotCi0gICAgaWYgbGVuZ3RoX29yaWdpbmFsICE9IGxlbmd0aF9jYXB0dXJlZDoKLSAgICAgICAgZGVidWdfcHJpbnQoIkZpbHRlcmVkIGJ0bnNvb3AsIGNhbiBub3QgYmUgcGFyc2VkIikKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBwYWNrZXQgPSBidHNub29wX2ZpbGUucmVhZChsZW5ndGhfY2FwdHVyZWQgLSAxKQotICAgIGlmIGxlbihwYWNrZXQpICE9IGxlbmd0aF9vcmlnaW5hbCAtIDE6Ci0gICAgICAgIGRlYnVnX3ByaW50KCJJbnZhbGlkIHBhY2tldCBsZW5ndGghIikKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBpZiBkcm9wcGVkX3BhY2tldHM6Ci0gICAgICAgIGRlYnVnX3ByaW50KCJJbnZhbGlkIGRyb3BlZCB2YWx1ZSIpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgcGFja2V0X2hhbmRsZSA9IHsKLSAgICAgICAgQ09NTUFETl9QQUNLRVQ6IChsYW1iZGEgeCwgeSwgejogcGFyc2VfY29tbWFuZF9wYWNrZXQoeCkpLAotICAgICAgICBBQ0xfUEFDS0VUOiAobGFtYmRhIHgsIHksIHo6IHBhcnNlX2FjbF9wYWNrZXQoeCwgeSwgeikpLAotICAgICAgICBTQ09fUEFDS0VUOiAobGFtYmRhIHgsIHksIHo6IE5vbmUpLAotICAgICAgICBFVkVOVF9QQUNLRVQ6IChsYW1iZGEgeCwgeSwgejogTm9uZSksCi0gICAgICAgIElTT19QQUNLRVQ6IChsYW1iZGEgeCwgeSwgejogcGFyc2VfaXNvX3BhY2tldCh4LCB5KSkKLSAgICB9Ci0gICAgcGFja2V0X2hhbmRsZS5nZXQodHlwZSwgbGFtYmRhIHgsIHksIHo6IE5vbmUpKHBhY2tldCwgZmxhZ3MsIHRpbWVzdGFtcCkKLSAgICByZXR1cm4gVHJ1ZQotCi0KLWRlZiBtYWluKCk6Ci0gICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoImJ0c25vb3BfZmlsZSIsIGhlbHA9ImJ0c25vb3AgZmlsZSBjb250YWlucyBMRSBhdWRpbyBzdGFydCBwcm9jZWR1cmUiKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi12IiwgIi0tdmVyYm9zZSIsIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZy4iLCBhY3Rpb249InN0b3JlX3RydWUiKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICItLWhlYWRlciIsCi0gICAgICAgIGhlbHA9IkFkZCB0aGUgaGVhZGVyIGZvciBMQzMgQ29uZm9ybWFuY2UgSW50ZXJvcGVyYWJpbGl0eSBUZXN0IFNvZnR3YXJlIFYuMS4wLjMuIiwKLSAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIikKLQotICAgIGFyZ3YgPSBwYXJzZXIucGFyc2VfYXJncygpCi0gICAgQlRTTk9PUF9GSUxFX05BTUUgPSBhcmd2LmJ0c25vb3BfZmlsZQotCi0gICAgZ2xvYmFsIGRlYnVnX2VuYWJsZQotICAgIGdsb2JhbCBhZGRfaGVhZGVyCi0gICAgaWYgYXJndi52ZXJib3NlOgotICAgICAgICBkZWJ1Z19lbmFibGUgPSBUcnVlCi0KLSAgICBpZiBhcmd2LmhlYWRlcjoKLSAgICAgICAgYWRkX2hlYWRlciA9IFRydWUKLQotICAgIHdpdGggb3BlbihCVFNOT09QX0ZJTEVfTkFNRSwgInJiIikgYXMgYnRzbm9vcF9maWxlOgotICAgICAgICBpZiBidHNub29wX2ZpbGUucmVhZCgxNikgIT0gQlRTTk9PUF9IRUFERVI6Ci0gICAgICAgICAgICBwcmludCgiSW52YWxpZCBidHNub29wIGhlYWRlciIpCi0gICAgICAgICAgICBleGl0KDEpCi0KLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGlmIG5vdCBwYXJzZV9uZXh0X3BhY2tldChidHNub29wX2ZpbGUpOgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICBmb3IgaGFuZGxlIGluIGNvbm5lY3Rpb25fbWFwLmtleXMoKToKLSAgICAgICAgZHVtcF9hdWRpb19kYXRhX3RvX2ZpbGUoaGFuZGxlKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9zY3JpcHRzL2R1bXBfbWV0cmljc19hc2NpaS5weSBiL3Rvb2xzL3NjcmlwdHMvZHVtcF9tZXRyaWNzX2FzY2lpLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWRiMjc4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NjcmlwdHMvZHVtcF9tZXRyaWNzX2FzY2lpLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSMgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSMgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBiYXNlNjQKLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgb3MKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi1pbXBvcnQgdGVtcGZpbGUKLWZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKLWltcG9ydCBnb29nbGUucHJvdG9idWYudGV4dF9mb3JtYXQgYXMgdGV4dF9mb3JtYXQKLWZyb20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCi0KLQotZGVmIGNvbXBpbGVfcHJvdG8ocHJvdG9fcGF0aCwgb3V0cHV0X2Rpcik6Ci0gICAgIiIiSW52b2tlIFByb3RvY29sIENvbXBpbGVyIHRvIGdlbmVyYXRlIHB5dGhvbiBmcm9tIGdpdmVuIHNvdXJjZSAucHJvdG8uIiIiCi0gICAgIyBGaW5kIGNvbXBpbGVyIHBhdGgKLSAgICBwcm90b2MgPSBOb25lCi0gICAgaWYgJ1BST1RPQycgaW4gb3MuZW52aXJvbiBhbmQgb3MucGF0aC5leGlzdHMob3MuZW52aXJvblsnUFJPVE9DJ10pOgotICAgICAgICBwcm90b2MgPSBvcy5lbnZpcm9uWydQUk9UT0MnXQotICAgIGlmIG5vdCBwcm90b2M6Ci0gICAgICAgIHByb3RvYyA9IGZpbmRfZXhlY3V0YWJsZSgncHJvdG9jJykKLSAgICBpZiBub3QgcHJvdG9jOgotICAgICAgICBsb2dnaW5nLmVycm9yKCJDYW5ub3QgZmluZCBQcm90b2J1ZiBjb21waWxlciAoPj0zLjAuMCksIHBsZWFzZSBpbnN0YWxsIgotICAgICAgICAgICAgICAgICAgICAgICJwcm90b2J1Zi1jb21waWxlciBwYWNrYWdlLiBQcmVmZXIgY29weWluZyBmcm9tIDx0b3A+L3ByZWJ1aWx0cy90b29scyIpCi0gICAgICAgIGxvZ2dpbmcuZXJyb3IoIiAgICBwcmVidWlsdHMvdG9vbHMvbGludXgteDg2XzY0L3Byb3RvYy9iaW4vcHJvdG9jIikKLSAgICAgICAgbG9nZ2luZy5lcnJvcigiSWYgcHJlYnVpbHRzIGFyZSBub3QgYXZhaWxhYmxlLCB1c2UgYXB0LWdldDoiKQotICAgICAgICBsb2dnaW5nLmVycm9yKCIgICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgcHJvdG9idWYtY29tcGlsZXIiKQotICAgICAgICByZXR1cm4gTm9uZQotICAgICMgVmFsaWRhdGUgaW5wdXQgcHJvdG8gcGF0aAotICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwcm90b19wYXRoKToKLSAgICAgICAgbG9nZ2luZy5lcnJvcignQ2FuXCd0IGZpbmQgcmVxdWlyZWQgZmlsZTogJXNcbicgJSBwcm90b19wYXRoKQotICAgICAgICByZXR1cm4gTm9uZQotICAgICMgVmFsaWRhdGUgb3V0cHV0IHB5LXByb3RvIHBhdGgKLSAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3V0cHV0X2Rpcik6Ci0gICAgICAgIG9zLm1rZGlycyhvdXRwdXRfZGlyKQotICAgIGVsaWYgbm90IG9zLnBhdGguaXNkaXIob3V0cHV0X2Rpcik6Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoIk91dHB1dCBwYXRoIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeTogJXMiICUgKG91dHB1dF9kaXIpKQotICAgICAgICByZXR1cm4gTm9uZQotICAgIGlucHV0X2RpciA9IG9zLnBhdGguZGlybmFtZShwcm90b19wYXRoKQotICAgIG91dHB1dF9maWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocHJvdG9fcGF0aCkucmVwbGFjZSgnLnByb3RvJywgJ19wYjIucHknKQotICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIG91dHB1dF9maWxlbmFtZSkKLSAgICBwcm90b2NfY29tbWFuZCA9IFtwcm90b2MsICctST0lcycgJSAoaW5wdXRfZGlyKSwgJy0tcHl0aG9uX291dD0lcycgJSAob3V0cHV0X2RpciksIHByb3RvX3BhdGhdCi0gICAgaWYgc3VicHJvY2Vzcy5jYWxsKHByb3RvY19jb21tYW5kLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpICE9IDA6Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoIkZhaWwgdG8gY29tcGlsZSBwcm90byIpCi0gICAgICAgIHJldHVybiBOb25lCi0gICAgb3V0cHV0X21vZHVsZV9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvdXRwdXRfZmlsZW5hbWUpWzBdCi0gICAgcmV0dXJuIG91dHB1dF9tb2R1bGVfbmFtZQotCi0KLWRlZiBjb21waWxlX2ltcG9ydF9wcm90byhvdXRwdXRfZGlyLCBwcm90b19wYXRoKToKLSAgICAiIiIKLSAgICBDb21waWxlIHByb3RvYnVmIGZyb20gUFJPVE9fUEFUSCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gT1VUUFVUX0RJUi4KLSAgICBSZXR1cm4gdGhlIGltcG9ydGVkIG1vZHVsZSB0byBjYWxsZXIuCi0gICAgOnBhcmFtIG91dHB1dF9kaXI6IFRvIHN0b3JlIGdlbmVyYXRlZCBweXRob24gcHJvdG8gbGlicmFyeQotICAgIDpwYXJhbSBwcm90b19wYXRoOiBQYXRoIHRvIHRoZSAucHJvdG8gZmlsZSB0aGF0IG5lZWRzIHRvIGJlIGNvbXBpbGVkCi0gICAgOnJldHVybjogcHl0aG9uIHByb3RvIG1vZHVsZQotICAgICIiIgotICAgIG91dHB1dF9tb2R1bGVfbmFtZSA9IGNvbXBpbGVfcHJvdG8ocHJvdG9fcGF0aCwgb3V0cHV0X2RpcikKLSAgICBpZiBub3Qgb3V0cHV0X21vZHVsZV9uYW1lOgotICAgICAgICByZXR1cm4gTm9uZQotICAgIHN5cy5wYXRoLmFwcGVuZChvdXRwdXRfZGlyKQotICAgIG91dHB1dF9tb2R1bGUgPSBOb25lCi0gICAgdHJ5OgotICAgICAgICBvdXRwdXRfbW9kdWxlID0gaW1wb3J0X21vZHVsZShvdXRwdXRfbW9kdWxlX25hbWUpCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBsb2dnaW5nLmVycm9yKCJDYW5ub3QgaW1wb3J0IGdlbmVyYXRlZCBweS1wcm90byAlcyIgJSAob3V0cHV0X21vZHVsZV9uYW1lKSkKLSAgICByZXR1cm4gb3V0cHV0X21vZHVsZQotCi0KLWRlZiBwYXJzZV9wcm90b190b19hc2NpaShiaW5hcnlfcHJvdG9fbXNnKToKLSAgICAiIiIKLSAgICBQYXJzZSBiaW5hcnkgcHJvdG9idWYgbWVzc2FnZSB0byBodW1hbiByZWFkYWJsZSBhc2NpaSBzdHJpbmcKLSAgICA6cGFyYW0gYmluYXJ5X3Byb3RvX21zZzoKLSAgICA6cmV0dXJuOiBhc2NpaSBzdHJpbmcgb2YgdGhlIG1lc3NhZ2UKLSAgICAiIiIKLSAgICByZXR1cm4gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKGJpbmFyeV9wcm90b19tc2cpCi0KLQotZGVmIGR1bXBfbWV0cmljcygpOgotICAgIG9zLnN5c3RlbSgnYWRiIHdhaXQtZm9yLWRldmljZScpCi0gICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgICJhZGIgc2hlbGwgZHVtcHN5cyBibHVldG9vdGhfbWFuYWdlciAtLXByb3RvLWJpbiIsCi0gICAgICAgIHNoZWxsPVRydWUsCi0gICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKLSAgICByZXR1cm4gcC5jb21tdW5pY2F0ZSgpCi0KLQotZGVmIGdldF9ibHVldG9vdGhfbWV0cmljcyhwcm90b19uYXRpdmVfc3RyXzY0LCBibHVldG9vdGhfcHJvdG9fbW9kdWxlKToKLSAgICBibHVldG9vdGhfbG9nID0gYmx1ZXRvb3RoX3Byb3RvX21vZHVsZS5CbHVldG9vdGhMb2coKQotICAgIHByb3RvX25hdGl2ZV9zdHIgPSBiYXNlNjQuYjY0ZGVjb2RlKHByb3RvX25hdGl2ZV9zdHJfNjQpCi0gICAgYmx1ZXRvb3RoX2xvZy5NZXJnZUZyb21TdHJpbmcocHJvdG9fbmF0aXZlX3N0cikKLSAgICByZXR1cm4gYmx1ZXRvb3RoX2xvZwotCi0KLWRlZiBtYWluKCk6Ci0gICAgcm9vdCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKLSAgICByb290LnNldExldmVsKGxvZ2dpbmcuREVCVUcpCi0gICAgbG9nX2hhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZGVycikKLSAgICBsb2dfaGFuZGxlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQotICAgIGZvcm1hdHRlciA9IGxvZ2dpbmcuRm9ybWF0dGVyKCIlKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzICUobWVzc2FnZSlzIikKLSAgICBsb2dfaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQotICAgIHJvb3QuYWRkSGFuZGxlcihsb2dfaGFuZGxlcikKLSAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKLSAgICAgICAgbG9nZ2luZy5lcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMuIE5lZWQgYXQgbGVhc3QgMiIpCi0gICAgICAgIGxvZ2dpbmcuZXJyb3IoIlVzYWdlOiAiICsgc3lzLmFyZ3ZbMF0gKyAiIDxwYXRoX3RvX21ldHJpY19wcm90bz4iKQotICAgICAgICBzeXMuZXhpdCgxKQotICAgIGlmIHN5cy5hcmd2WzFdID09ICItaCI6Ci0gICAgICAgIGxvZ2dpbmcuaW5mbygiVXNhZ2U6ICIgKyBzeXMuYXJndlswXSArICIgPHBhdGhfdG9fbWV0cmljX3Byb3RvPiIpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiUmVxdWlyZXMgUHJvdG9idWYgY29tcGlsZXIsIHByb3RvYywgdmVyc2lvbiA+PTMuMC4wIikKLSAgICAgICAgc3lzLmV4aXQoMCkKLSAgICBibHVldG9vdGhfcHJvdG9fbW9kdWxlID0gY29tcGlsZV9pbXBvcnRfcHJvdG8odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCBzeXMuYXJndlsxXSkKLSAgICBpZiBub3QgYmx1ZXRvb3RoX3Byb3RvX21vZHVsZToKLSAgICAgICAgbG9nZ2luZy5lcnJvcigiQ2Fubm90IGNvbXBpbGUgIiArIHN5cy5hcmd2WzFdKQotICAgICAgICBzeXMuZXhpdCgxKQotICAgIHN0ZG91dCwgc3RkZXJyID0gZHVtcF9tZXRyaWNzKCkKLSAgICBzdGRvdXQgPSBzdGRvdXQuc3RyaXAoKQotICAgIHN0ZGVyciA9IHN0ZGVyci5zdHJpcCgpCi0gICAgYmx1ZXRvb3RoX2xvZyA9IGdldF9ibHVldG9vdGhfbWV0cmljcyhzdGRvdXQsIGJsdWV0b290aF9wcm90b19tb2R1bGUpCi0gICAgYmx1ZXRvb3RoX2xvZ19hc2NpaSA9IHBhcnNlX3Byb3RvX3RvX2FzY2lpKGJsdWV0b290aF9sb2cpCi0gICAgcHJpbnQoYmx1ZXRvb3RoX2xvZ19hc2NpaSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2NyaXB0cy92aWV3YnRzbm9vcC5zaCBiL3Rvb2xzL3NjcmlwdHMvdmlld2J0c25vb3Auc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxZjI0ODUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy92aWV3YnRzbm9vcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMgVGhpcyBpcyBhIHNjcmlwdCB0aGF0IHdpbGwgYWxsb3cgeW91IHRvIG9wZW4gYSBidHNub296IGxvZwotIyBpbiB3aXJlc2hhcmsgZGlyZWN0bHkgZnJvbSBhIHppcCBmaWxlLiBUaGlzIHNjcmlwdCB3aWxsIGhhbmRsZQotIyB0aGUgdW56aXBwaW5nIGlmIGl0IGlzIGEgemlwIGZpbGUsIG9yIHdpbGwgY29udmVydCB0aGUgYnRzbm9vegotIyBkaXJlY3RseSBpbiB0aGUgY2FzZSBvZiBhIHBsYWluIHRleHQgZmlsZSBmb3IgdXNlIHdpdGggd2lyZXNoYXJrLgotIyBBZnRlciB3aXJlc2hhcmsgY2xvc2VzLCBpdCB3aWxsIGNsZWFuIHVwIGFsbCB0aGUgdGVtcG9yYXJ5IGZpbGVzCi0jIHVzZWQuCi0KLVdJUkVTSEFSSz0iJHtXSVJFU0hBUks6LXdpcmVzaGFya30iCi1CVFNOT09aPSIke0JUU05PT1o6LWJ0c25vb3oucHl9IgotCi1pZiAhIGhhc2ggIiR7V0lSRVNIQVJLfSIgMj4vZGV2L251bGw7Ci10aGVuCi0gICAgZWNobyAiUGxlYXNlIG1ha2Ugc3VyZSB3aXJlc2hhcmsgaXMgaW4geW91ciBwYXRoIGJlZm9yZSBydW5uaW5nLiIKLSAgICBleGl0IDE7Ci1maQotCi1pZiAhIGhhc2ggYnRzbm9vei5weSAyPi9kZXYvbnVsbDsKLXRoZW4KLSAgICBlY2hvICJQbGVhc2UgbWFrZSBzdXJlIGJ0c25vb3oucHkgaXMgaW4geW91ciBwYXRoIGJlZm9yZSBydW5uaW5nLiIKLSAgICBleGl0IDI7Ci1maQotCi1pZiBbICQjIC1lcSAwIF07Ci10aGVuCi0gICAgZWNobyAiVXNhZ2U6ICQwIGJ1Z3JlcG9ydCgudHh0fC56aXApIgotICAgIGV4aXQgMzsKLWZpCi0KLUJVR1JFUE9SVD0iJDEiCi1GSUxFTkFNRT0iJChiYXNlbmFtZSAke0JVR1JFUE9SVH0pIgotVE1QRElSPSQobWt0ZW1wIC0tdG1wZGlyIC1kICJ2aWV3YnRzbm9vel9YWFhYWCIpCi1MT0dGSUxFPSIke1RNUERJUn0vJHtGSUxFTkFNRSUuKn0uYnRzbm9veiIKLQotdHJhcCBjdHJsX2MgSU5UCi1mdW5jdGlvbiBjdHJsX2MoKSB7Ci0gICAgcm0gLXJmICIke1RNUERJUn0iCi19Ci0KLWlmIFsgISAtZiAiJHtCVUdSRVBPUlR9IiBdOwotdGhlbgotICAgIGVjaG8gIkZpbGUgJHtCVUdSRVBPUlR9IGRvZXMgbm90IGV4aXN0LiIKLSAgICBleGl0IDQ7Ci1maQotCi1pZiBbICEgLWQgIiR7VE1QRElSfSIgXTsKLXRoZW4KLSAgICBlY2hvICJVbmFibGUgdG8gY3JlYXRlIHRlbXAuIGRpciAoJHtUTVBESVJ9KSA6KCIKLSAgICBleGl0IDU7Ci1maQotCi1pZiBbICIke0JVR1JFUE9SVDogLTR9IiA9PSAiLnppcCIgXTsKLXRoZW4KLSAgICB1bnppcCAiJHtCVUdSRVBPUlR9IiAtZCAiJHtUTVBESVJ9IgotICAgIEJVR1JFUE9SVD0iJHtUTVBESVJ9LyR7RklMRU5BTUUlLip9LnR4dCIKLWZpCi0KLWlmIFsgLWYgIiR7QlVHUkVQT1JUfSIgXTsKLXRoZW4KLSAgICAke0JUU05PT1p9ICIke0JVR1JFUE9SVH0iID4gIiR7TE9HRklMRX0iCi0gICAgaWYgWyAhICQ/IC1lcSAwIF07Ci0gICAgdGhlbgotICAgICAgICBlY2hvICJDb3VsZCBub3QgZXh0cmFjdCBidHNub296IGRhdGEgZnJvbSAke0JVR1JFUE9SVH0uIgotICAgICAgICBybSAtcmYgIiR7VE1QRElSfSIKLSAgICAgICAgZXhpdCA2OwotICAgIGZpCi0KLSAgICAke1dJUkVTSEFSS30gIiR7TE9HRklMRX0iCi1lbHNlCi0gICAgZWNobyAiTG9va3MgbGlrZSB0aGVyZSBpcyBubyBwbGFpbiB0ZXh0IGJ1Z3JlcG9ydCAoJHtCVUdSRVBPUlR9KT8iCi1maQotCi1ybSAtcmYgIiR7VE1QRElSfSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NjcmlwdHMveWFwZl9jaGVja2VyLnB5IGIvdG9vbHMvc2NyaXB0cy95YXBmX2NoZWNrZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyYTc1M2UuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2NyaXB0cy95YXBmX2NoZWNrZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICAgQ29weXJpZ2h0IDIwMTkgLSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgb3MKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi0KLVBZVEhPTlBBVEhfS0VZID0gJ1BZVEhPTlBBVEgnCi1DT01NSVRfSURfRU5WX0tFWSA9ICdQUkVVUExPQURfQ09NTUlUJwotQU5EUk9JRF9CVUlMRF9UT1BfS0VZID0gJ0FORFJPSURfQlVJTERfVE9QJwotREVGQVVMVF9ZQVBGX0RJUiA9ICdleHRlcm5hbC95YXBmJwotR0lUX0NPTU1BTkQgPSBbJ2dpdCcsICdkaWZmLXRyZWUnLCAnLS1uby1jb21taXQtaWQnLCAnLS1uYW1lLW9ubHknLCAnLS1kaWZmLWZpbHRlcj1kJ10KLQotCi1kZWYgbWFpbigpOgotICAgICIiIgotICAgIEEgUHl0aG9uIGNvbW1pdCBmb3JtYXR0ZXIgdXNpbmcgWUFQRgotCi0gICAgQ2F2ZWF0OiBpZiB5b3UgbW9kaWZ5IGEgZmlsZSwgdGhlIGVudGlyZSBmaWxlIHdpbGwgYmUgZm9ybWF0dGVkLCBpbnN0ZWFkIG9mCi0gICAgICAgICAgICB0aGUgZGlmZgotICAgIDpyZXR1cm46Ci0gICAgIiIiCi0gICAgaWYgQ09NTUlUX0lEX0VOVl9LRVkgbm90IGluIG9zLmVudmlyb246Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoJ01pc3NpbmcgUFJFVVBMT0FEX0NPTU1JVCBpbiBlbnZpcm9ubWVudC4nKQotICAgICAgICBleGl0KDEpCi0KLSAgICBpZiBBTkRST0lEX0JVSUxEX1RPUF9LRVkgbm90IGluIG9zLmVudmlyb246Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoJ01pc3NpbmcgQU5EUk9JRF9CVUlMRF9UT1AgaW4gZW52aXJvbm1lbnQuJykKLSAgICAgICAgZXhpdCgxKQotCi0gICAgIyBHYXRoZXIgY2hhbmdlZCBQeXRob24gZmlsZXMKLSAgICBjb21taXRfaWQgPSBvcy5lbnZpcm9uW0NPTU1JVF9JRF9FTlZfS0VZXQotICAgIGZ1bGxfZ2l0X2NvbW1hbmQgPSBHSVRfQ09NTUFORCArIFsnLXInLCBjb21taXRfaWRdCi0gICAgZmlsZXMgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChmdWxsX2dpdF9jb21tYW5kKS5kZWNvZGUoJ3V0Zi04Jykuc3BsaXRsaW5lcygpCi0gICAgZnVsbF9maWxlcyA9IFtvcy5wYXRoLmFic3BhdGgoZikgZm9yIGYgaW4gZmlsZXMgaWYgZi5lbmRzd2l0aCgnLnB5JyldCi0gICAgaWYgbm90IGZ1bGxfZmlsZXM6Ci0gICAgICAgIHJldHVybgotCi0gICAgIyBGaW5kIHlhcGYgaW4gQW5kcm9pZCBjb2RlIHRyZWUKLSAgICB5YXBmX2RpciA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uW0FORFJPSURfQlVJTERfVE9QX0tFWV0sIERFRkFVTFRfWUFQRl9ESVIpCi0gICAgeWFwZl9iaW5hcnkgPSBvcy5wYXRoLmpvaW4oeWFwZl9kaXIsICd5YXBmJykKLQotICAgICMgUnVuIFlBUEYKLSAgICBmdWxsX3lhcGZfY29tbWFuZCA9IFsiJXM9JCVzOiVzIiAlIChQWVRIT05QQVRIX0tFWSwgUFlUSE9OUEFUSF9LRVksIHlhcGZfZGlyKSwgJ3B5dGhvbjMnLCB5YXBmX2JpbmFyeSwgJy1kJywgJy1wJwotICAgICAgICAgICAgICAgICAgICAgICAgXSArIGZ1bGxfZmlsZXMKLSAgICBlbnZpcm9ubWVudCA9IG9zLmVudmlyb24uY29weSgpCi0gICAgZW52aXJvbm1lbnRbUFlUSE9OUEFUSF9LRVldID0gZW52aXJvbm1lbnRbUFlUSE9OUEFUSF9LRVldICsgIjoiICsgeWFwZl9kaXIKLSAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bihmdWxsX3lhcGZfY29tbWFuZFsxOl0sIGVudj1lbnZpcm9ubWVudCwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotCi0gICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMCBvciByZXN1bHQuc3Rkb3V0OgotICAgICAgICBsb2dnaW5nLmVycm9yKHJlc3VsdC5zdGRvdXQuZGVjb2RlKCd1dGYtOCcpLnN0cmlwKCkpCi0gICAgICAgIGxvZ2dpbmcuZXJyb3IoJ0lOVkFMSUQgRk9STUFUVElORywgcmV0dXJuIGNvZGUgJWQnLCByZXN1bHQucmV0dXJuY29kZSkKLSAgICAgICAgbG9nZ2luZy5lcnJvcignVG8gcmUtcnVuIHRoZSBmb3JtYXQgY29tbWFuZDpcblxuJyAnICAgICVzXG4nICUgJyAnLmpvaW4oZnVsbF95YXBmX2NvbW1hbmQpKQotICAgICAgICB5YXBmX2lucGxhY2VfZm9ybWF0ID0gJyAnLmpvaW4oCi0gICAgICAgICAgICBbIiVzPSQlczolcyIgJSAoUFlUSE9OUEFUSF9LRVksIFBZVEhPTlBBVEhfS0VZLCB5YXBmX2RpciksICdweXRob24zJywgeWFwZl9iaW5hcnksICctcCcsICctaSddICsgZnVsbF9maWxlcykKLSAgICAgICAgbG9nZ2luZy5lcnJvcignSWYgdGhpcyBpcyBhIGxlZ2l0aW1hdGUgZm9ybWF0IGVycm9yLCBwbGVhc2UgcnVuOlxuXG4nICcgICAgJXNcbicgJSB5YXBmX2lucGxhY2VfZm9ybWF0KQotICAgICAgICBsb2dnaW5nLmVycm9yKCdDQVZFQVQ6IEN1cnJlbnRseSwgdGhpcyBmb3JtYXQgdGhlIGVudGlyZSBQeXRob24gZmlsZSBpZiB5b3UgbW9kaWZ5IGV2ZW4gcGFydCBvZiBpdCcpCi0gICAgICAgIGV4aXQoMSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdHlwZXMvQW5kcm9pZC5icCBiL3R5cGVzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMmYwZjAuLjAwMDAwMDAKLS0tIGEvdHlwZXMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vIEJsdWV0b290aCB0eXBlcwotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9oZWFkZXJzIHsKLSAgICBuYW1lOiAibGliYmx1ZXRvb3RoLXR5cGVzLWhlYWRlciIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuLyJdLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgLy8gVE9ETyhiLzE1MzYwOTUzMSk6IHJlbW92ZSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgYXBleF9hdmFpbGFibGU6IFsKLSAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAotICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCi0gICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIgotICAgIF0sCi0gICAgLy8gQXMgcGFydCBvZiB1cGRhdGFibGUgbWFpbmxpbmUgbW9kdWxlcyhtZWRpYSwgc3djb2RlYyksIGl0IHNob3VsZCBzdXBwb3J0IGF0IGxlYXN0IDI5KFEpCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJsdWV0b290aC10eXBlcyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV90eXBlc19kZWZhdWx0cyJdLAotICAgIGNmbGFnczogWwotICAgICAgICAvKiB3ZSBleHBvcnQgYWxsIGNsYXNzZXMsIHNvIGNoYW5nZSBkZWZhdWx0IHZpc2liaWxpdHksIGluc3RlYWQgb2YgaGF2aW5nIEVYUE9SVF9TWU1CT0wgb24gZWFjaCBjbGFzcyovCi0gICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJjbGFzc19vZl9kZXZpY2UuY2MiLAotICAgICAgICAicmF3X2FkZHJlc3MuY2MiLAotICAgICAgICAiYmx1ZXRvb3RoL3V1aWQuY2MiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmx1ZXRvb3RoLXR5cGVzLWhlYWRlciJdLAotICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYmx1ZXRvb3RoLXR5cGVzLWhlYWRlciJdLAotfQotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibmV0X3Rlc3RfdHlwZXMiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAidGVzdC9jbGFzc19vZl9kZXZpY2VfdW5pdHRlc3QuY2MiLAotICAgICAgICAidGVzdC9yYXdfYWRkcmVzc191bml0dGVzdC5jYyIsCi0gICAgICAgICJ0ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvdHlwZXMvQlVJTEQuZ24gYi90eXBlcy9CVUlMRC5nbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNDdiNi4uMDAwMDAwMAotLS0gYS90eXBlcy9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE3IEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zdGF0aWNfbGlicmFyeSgidHlwZXMiKSB7Ci0gIGNmbGFncyA9IFsKLSAgICAgIi1mdmlzaWJpbGl0eT1kZWZhdWx0IiwKLSAgXQotCi0gIHNvdXJjZXMgPSBbCi0gICAgImNsYXNzX29mX2RldmljZS5jYyIsCi0gICAgImJsdWV0b290aC91dWlkLmNjIiwKLSAgICAicmF3X2FkZHJlc3MuY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvL2J0LyIsCi0gIF0KLQotICBjb25maWdzICs9IFsKLSAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICBdCi19Ci0KLWlmICh1c2UudGVzdCkgewotICBleGVjdXRhYmxlKCJuZXRfdGVzdF90eXBlcyIpIHsKLSAgICBzb3VyY2VzID0gWwotICAgICAgInRlc3QvY2xhc3Nfb2ZfZGV2aWNlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L3Jhd19hZGRyZXNzX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjIiwKLSAgICBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgICAiLy9idC8iLAotICAgIF0KLQotICAgIGxpYnMgPSBbCi0gICAgICAiZGwiLAotICAgICAgInB0aHJlYWQiLAotICAgICAgInJlc29sdiIsCi0gICAgICAicnQiLAotICAgICAgInoiLAotICAgIF0KLQotICAgICMgRm9yIHNvbWUgcmVhc29uLCB0aGlzIGlzIHJlcXVpcmVkIGZvciBob3N0IGJ1aWxkLiBPdGhlcndpc2UsIEkgZ2V0Ci0gICAgIyBhIGNvbXBsYWludCBmcm9tIGdtb2NrOgotICAgICMgICB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIHN5bWJvbCAncHRocmVhZF9nZXRzcGVjaWZpY0BAR0xJQkNfMi4yLjUnCi0gICAgbGRmbGFncyA9IFsKLSAgICAgICItbHB0aHJlYWQiCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICI6dHlwZXMiLAotICAgIF0KLQotICAgIGNvbmZpZ3MgKz0gWwotICAgICAgIi8vYnQ6ZXh0ZXJuYWxfZ21vY2tfbWFpbiIsCi0gICAgICAiLy9idDp0YXJnZXRfZGVmYXVsdHMiLAotICAgIF0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdHlwZXMvYmxlX2FkZHJlc3Nfd2l0aF90eXBlLmggYi90eXBlcy9ibGVfYWRkcmVzc193aXRoX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUwYWJiOS4uMDAwMDAwMAotLS0gYS90eXBlcy9ibGVfYWRkcmVzc193aXRoX3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidHlwZXMvcmF3X2FkZHJlc3MuaCIKLQotI2RlZmluZSBCTEVfQUREUl9QVUJMSUMgMHgwMAotI2RlZmluZSBCTEVfQUREUl9SQU5ET00gMHgwMQotI2RlZmluZSBCTEVfQUREUl9QVUJMSUNfSUQgMHgwMgotI2RlZmluZSBCTEVfQUREUl9SQU5ET01fSUQgMHgwMwotI2RlZmluZSBCTEVfQUREUl9BTk9OWU1PVVMgMHhGRgotdHlwZWRlZiB1aW50OF90IHRCTEVfQUREUl9UWVBFOwotI2lmZGVmIF9fY3BsdXNwbHVzCi1pbmxpbmUgc3RkOjpzdHJpbmcgQWRkcmVzc1R5cGVUZXh0KHRCTEVfQUREUl9UWVBFIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBCTEVfQUREUl9QVUJMSUM6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInB1YmxpYyIpOwotICAgIGNhc2UgQkxFX0FERFJfUkFORE9NOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJyYW5kb20iKTsKLSAgICBjYXNlIEJMRV9BRERSX1BVQkxJQ19JRDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygicHVibGljIGlkZW50aXR5Iik7Ci0gICAgY2FzZSBCTEVfQUREUl9SQU5ET01fSUQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInJhbmRvbSBpZGVudGl0eSIpOwotICAgIGNhc2UgQkxFX0FERFJfQU5PTllNT1VTOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJhbm9ueW1vdXMiKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJ1bmtub3duIik7Ci0gIH0KLX0KLSNlbmRpZiAgLy8gX19jcGx1c3BsdXMKLQotLyogQkxFIEFERFIgdHlwZSBJRCBiaXQgKi8KLSNkZWZpbmUgQkxFX0FERFJfVFlQRV9JRF9CSVQgMHgwMgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWNvbnN0ZXhwciB1aW50OF90IGtCbGVBZGRyZXNzUHVibGljRGV2aWNlID0gQkxFX0FERFJfUFVCTElDOwotY29uc3RleHByIHVpbnQ4X3Qga0JsZUFkZHJlc3NSYW5kb21EZXZpY2UgPSBCTEVfQUREUl9SQU5ET007Ci1jb25zdGV4cHIgdWludDhfdCBrQmxlQWRkcmVzc0lkZW50aXR5Qml0ID0gQkxFX0FERFJfVFlQRV9JRF9CSVQ7Ci1jb25zdGV4cHIgdWludDhfdCBrQmxlQWRkcmVzc1B1YmxpY0lkZW50aXR5ID0KLSAgICBrQmxlQWRkcmVzc0lkZW50aXR5Qml0IHwga0JsZUFkZHJlc3NQdWJsaWNEZXZpY2U7Ci1jb25zdGV4cHIgdWludDhfdCBrQmxlQWRkcmVzc1JhbmRvbUlkZW50aXR5ID0KLSAgICBrQmxlQWRkcmVzc0lkZW50aXR5Qml0IHwga0JsZUFkZHJlc3NSYW5kb21EZXZpY2U7Ci0KLWNvbnN0ZXhwciB1aW50OF90IGtSZXNvbHZhYmxlQWRkcmVzc01hc2sgPSAweGMwOwotY29uc3RleHByIHVpbnQ4X3Qga1Jlc29sdmFibGVBZGRyZXNzTXNiID0gMHg0MDsKLQotc3RydWN0IHRCTEVfQkRfQUREUiB7Ci0gIHRCTEVfQUREUl9UWVBFIHR5cGU7Ci0gIFJhd0FkZHJlc3MgYmRhOwotICBib29sIEFkZHJlc3NFcXVhbHMoY29uc3QgUmF3QWRkcmVzcyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG90aGVyID09IGJkYTsgfQotICBib29sIElzUHVibGljRGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGUgPT0ga0JsZUFkZHJlc3NQdWJsaWNEZXZpY2U7IH0KLSAgYm9vbCBJc1JhbmRvbURldmljZVR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlID09IGtCbGVBZGRyZXNzUmFuZG9tRGV2aWNlOyB9Ci0gIGJvb2wgSXNQdWJsaWNJZGVudGl0eVR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGUgPT0ga0JsZUFkZHJlc3NQdWJsaWNJZGVudGl0eTsKLSAgfQotICBib29sIGxzUmFuZG9tSWRlbnRpdHlUeXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlID09IGtCbGVBZGRyZXNzUmFuZG9tSWRlbnRpdHk7Ci0gIH0KLSAgYm9vbCBJc0FkZHJlc3NSZXNvbHZhYmxlKCkgY29uc3QgewotICAgIHJldHVybiAoKGJkYS5hZGRyZXNzKVswXSAmIGtSZXNvbHZhYmxlQWRkcmVzc01hc2spID09IGtSZXNvbHZhYmxlQWRkcmVzc01zYjsKLSAgfQotICBib29sIElzUHVibGljKCkgY29uc3QgeyByZXR1cm4gdHlwZSAmIDB4MDE7IH0KLSAgYm9vbCBJc1Jlc29sdmFibGVQcml2YXRlQWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gSXNBZGRyZXNzUmVzb2x2YWJsZSgpICYmIElzUmFuZG9tRGV2aWNlVHlwZSgpOwotICB9Ci0gIGJvb2wgSXNJZGVudGl0eVR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIElzUHVibGljSWRlbnRpdHlUeXBlKCkgfHwgbHNSYW5kb21JZGVudGl0eVR5cGUoKTsKLSAgfQotICBib29sIFR5cGVXaXRob3V0SWRlbnRpdHlFcXVhbHMoY29uc3QgdEJMRV9BRERSX1RZUEUgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gKG90aGVyICYgfmtCbGVBZGRyZXNzSWRlbnRpdHlCaXQpID09Ci0gICAgICAgICAgICh0eXBlICYgfmtCbGVBZGRyZXNzSWRlbnRpdHlCaXQpOwotICB9Ci0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnN0cmluZyhiZGEuVG9TdHJpbmcoKSArICJbIiArIEFkZHJlc3NUeXBlVGV4dCh0eXBlKSArICJdIik7Ci0gIH0KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3R5cGVzL2JsdWV0b290aC91dWlkLmNjIGIvdHlwZXMvYmx1ZXRvb3RoL3V1aWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWY0MzcuLjAwMDAwMDAKLS0tIGEvdHlwZXMvYmx1ZXRvb3RoL3V1aWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ1dWlkLmgiCi0KLSNpbmNsdWRlIDxiYXNlL3JhbmRfdXRpbC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihVdWlkKSA9PSAxNiwgIlV1aWQgbXVzdCBiZSAxNiBieXRlcyBsb25nISIpOwotCi11c2luZyBVVUlEMTI4Qml0ID0gVXVpZDo6VVVJRDEyOEJpdDsKLQotY29uc3QgVXVpZCBVdWlkOjprRW1wdHkgPSBVdWlkOjpGcm9tMTI4Qml0QkUoVVVJRDEyOEJpdHt7MHgwMH19KTsKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBVdWlkIGtCYXNlID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFVVSUQxMjhCaXR7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsCi0gICAgICAgICAgICAgICAgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn19KTsKLX0gIC8vIG5hbWVzcGFjZQotCi1zaXplX3QgVXVpZDo6R2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBjb25zdCB7Ci0gIGlmIChtZW1jbXAodXUuZGF0YSgpICsga051bUJ5dGVzMzIsIGtCYXNlLnV1LmRhdGEoKSArIGtOdW1CeXRlczMyLAotICAgICAgICAgICAgIGtOdW1CeXRlczEyOCAtIGtOdW1CeXRlczMyKSAhPSAwKSB7Ci0gICAgcmV0dXJuIGtOdW1CeXRlczEyODsKLSAgfQotCi0gIGlmICh1dVswXSA9PSAwICYmIHV1WzFdID09IDApIHJldHVybiBrTnVtQnl0ZXMxNjsKLQotICByZXR1cm4ga051bUJ5dGVzMzI7Ci19Ci0KLWJvb2wgVXVpZDo6SXMxNkJpdCgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgPT0ga051bUJ5dGVzMTY7Ci19Ci0KLXVpbnQxNl90IFV1aWQ6OkFzMTZCaXQoKSBjb25zdCB7IHJldHVybiAoKCh1aW50MTZfdCl1dVsyXSkgPDwgOCkgKyB1dVszXTsgfQotCi11aW50MzJfdCBVdWlkOjpBczMyQml0KCkgY29uc3QgewotICByZXR1cm4gKCgodWludDMyX3QpdXVbMF0pIDw8IDI0KSArICgoKHVpbnQzMl90KXV1WzFdKSA8PCAxNikgKwotICAgICAgICAgKCgodWludDMyX3QpdXVbMl0pIDw8IDgpICsgdXVbM107Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgdXVpZCwgYm9vbCogaXNfdmFsaWQpIHsKLSAgaWYgKGlzX3ZhbGlkKSAqaXNfdmFsaWQgPSBmYWxzZTsKLSAgVXVpZCByZXQgPSBrQmFzZTsKLQotICBpZiAodXVpZC5lbXB0eSgpKSByZXR1cm4gcmV0OwotCi0gIHVpbnQ4X3QqIHAgPSByZXQudXUuZGF0YSgpOwotICBpZiAodXVpZC5zaXplKCkgPT0ga1N0cmluZzEyOEJpdExlbikgewotICAgIGlmICh1dWlkWzhdICE9ICctJyB8fCB1dWlkWzEzXSAhPSAnLScgfHwgdXVpZFsxOF0gIT0gJy0nIHx8Ci0gICAgICAgIHV1aWRbMjNdICE9ICctJykgewotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpbnQgYzsKLSAgICBpbnQgcmMgPQotICAgICAgICBzc2NhbmYodXVpZC5jX3N0cigpLAotICAgICAgICAgICAgICAgIiUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeC0lMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4IgotICAgICAgICAgICAgICAgIi0lMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JW4iLAotICAgICAgICAgICAgICAgJnBbMF0sICZwWzFdLCAmcFsyXSwgJnBbM10sICZwWzRdLCAmcFs1XSwgJnBbNl0sICZwWzddLCAmcFs4XSwKLSAgICAgICAgICAgICAgICZwWzldLCAmcFsxMF0sICZwWzExXSwgJnBbMTJdLCAmcFsxM10sICZwWzE0XSwgJnBbMTVdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDE2KSByZXR1cm4gcmV0OwotICAgIGlmIChjICE9IGtTdHJpbmcxMjhCaXRMZW4pIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoaXNfdmFsaWQpICppc192YWxpZCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodXVpZC5zaXplKCkgPT0gOCkgewotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZih1dWlkLmNfc3RyKCksICIlMDJoaHglMDJoaHglMDJoaHglMDJoaHglbiIsICZwWzBdLCAmcFsxXSwKLSAgICAgICAgICAgICAgICAgICAgJnBbMl0sICZwWzNdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDQpIHJldHVybiByZXQ7Ci0gICAgaWYgKGMgIT0gOCkgcmV0dXJuIHJldDsKLQotICAgIGlmIChpc192YWxpZCkgKmlzX3ZhbGlkID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICh1dWlkLnNpemUoKSA9PSA0KSB7Ci0gICAgaW50IGM7Ci0gICAgaW50IHJjID0gc3NjYW5mKHV1aWQuY19zdHIoKSwgIiUwMmhoeCUwMmhoeCVuIiwgJnBbMl0sICZwWzNdLCAmYyk7Ci0gICAgaWYgKHJjICE9IDIpIHJldHVybiByZXQ7Ci0gICAgaWYgKGMgIT0gNCkgcmV0dXJuIHJldDsKLQotICAgIGlmIChpc192YWxpZCkgKmlzX3ZhbGlkID0gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTE2Qml0KHVpbnQxNl90IHV1aWQxNikgewotICBVdWlkIHUgPSBrQmFzZTsKLQotICB1LnV1WzJdID0gKHVpbnQ4X3QpKCgweEZGMDAgJiB1dWlkMTYpID4+IDgpOwotICB1LnV1WzNdID0gKHVpbnQ4X3QpKDB4MDBGRiAmIHV1aWQxNik7Ci0gIHJldHVybiB1OwotfQotCi1VdWlkIFV1aWQ6OkZyb20zMkJpdCh1aW50MzJfdCB1dWlkMzIpIHsKLSAgVXVpZCB1ID0ga0Jhc2U7Ci0KLSAgdS51dVswXSA9ICh1aW50OF90KSgoMHhGRjAwMDAwMCAmIHV1aWQzMikgPj4gMjQpOwotICB1LnV1WzFdID0gKHVpbnQ4X3QpKCgweDAwRkYwMDAwICYgdXVpZDMyKSA+PiAxNik7Ci0gIHUudXVbMl0gPSAodWludDhfdCkoKDB4MDAwMEZGMDAgJiB1dWlkMzIpID4+IDgpOwotICB1LnV1WzNdID0gKHVpbnQ4X3QpKDB4MDAwMDAwRkYgJiB1dWlkMzIpOwotICByZXR1cm4gdTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tMTI4Qml0QkUoY29uc3QgdWludDhfdCogdXVpZCkgewotICBVVUlEMTI4Qml0IHRtcDsKLSAgbWVtY3B5KHRtcC5kYXRhKCksIHV1aWQsIGtOdW1CeXRlczEyOCk7Ci0gIHJldHVybiBGcm9tMTI4Qml0QkUodG1wKTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tMTI4Qml0TEUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCkgewotICBVdWlkIHU7Ci0gIHN0ZDo6cmV2ZXJzZV9jb3B5KHV1aWQuZGF0YSgpLCB1dWlkLmRhdGEoKSArIGtOdW1CeXRlczEyOCwgdS51dS5iZWdpbigpKTsKLSAgcmV0dXJuIHU7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTEyOEJpdExFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpIHsKLSAgVVVJRDEyOEJpdCB0bXA7Ci0gIG1lbWNweSh0bXAuZGF0YSgpLCB1dWlkLCBrTnVtQnl0ZXMxMjgpOwotICByZXR1cm4gRnJvbTEyOEJpdExFKHRtcCk7Ci19Ci0KLWNvbnN0IFVVSUQxMjhCaXQgVXVpZDo6VG8xMjhCaXRMRSgpIGNvbnN0IHsKLSAgVVVJRDEyOEJpdCBsZTsKLSAgc3RkOjpyZXZlcnNlX2NvcHkodXUuZGF0YSgpLCB1dS5kYXRhKCkgKyBrTnVtQnl0ZXMxMjgsIGxlLmJlZ2luKCkpOwotICByZXR1cm4gbGU7Ci19Ci0KLWNvbnN0IFVVSUQxMjhCaXQmIFV1aWQ6OlRvMTI4Qml0QkUoKSBjb25zdCB7IHJldHVybiB1dTsgfQotCi1VdWlkIFV1aWQ6OkdldFJhbmRvbSgpIHsKLSAgVXVpZCB1dWlkOwotICBiYXNlOjpSYW5kQnl0ZXModXVpZC51dS5kYXRhKCksIHV1aWQudXUuc2l6ZSgpKTsKLSAgcmV0dXJuIHV1aWQ7Ci19Ci0KLWJvb2wgVXVpZDo6SXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzID09IGtFbXB0eTsgfQotCi12b2lkIFV1aWQ6OlVwZGF0ZVV1aWQoY29uc3QgVXVpZCYgdXVpZCkgewotICB1dSA9IHV1aWQudXU7Ci19Ci0KLWJvb2wgVXVpZDo6b3BlcmF0b3I8KGNvbnN0IFV1aWQmIHJocykgY29uc3QgewotICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSh1dS5iZWdpbigpLCB1dS5lbmQoKSwgcmhzLnV1LmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocy51dS5lbmQoKSk7Ci19Ci0KLWJvb2wgVXVpZDo6b3BlcmF0b3I9PShjb25zdCBVdWlkJiByaHMpIGNvbnN0IHsgcmV0dXJuIHV1ID09IHJocy51dTsgfQotCi1ib29sIFV1aWQ6Om9wZXJhdG9yIT0oY29uc3QgVXVpZCYgcmhzKSBjb25zdCB7IHJldHVybiB1dSAhPSByaHMudXU7IH0KLQotc3RkOjpzdHJpbmcgVXVpZDo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAiJTAyeCUwMnglMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgdXVbMF0sIHV1WzFdLCB1dVsyXSwgdXVbM10sIHV1WzRdLCB1dVs1XSwgdXVbNl0sIHV1WzddLCB1dVs4XSwgdXVbOV0sCi0gICAgICB1dVsxMF0sIHV1WzExXSwgdXVbMTJdLCB1dVsxM10sIHV1WzE0XSwgdXVbMTVdKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKZGlmZiAtLWdpdCBhL3R5cGVzL2JsdWV0b290aC91dWlkLmggYi90eXBlcy9ibHVldG9vdGgvdXVpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmU1YjViLi4wMDAwMDAwCi0tLSBhL3R5cGVzL2JsdWV0b290aC91dWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gVGhpcyBjbGFzcyBpcyByZXByZXNlbnRpbmcgQmx1ZXRvb3RoIFVVSURzIGFjcm9zcyB3aG9sZSBzdGFjay4KLS8vIEhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBlbmRpYW5uZXNzIHJ1bGVzOgotLy8gMS4gVVVJRCBpcyBpbnRlcm5hbGx5IGtlcHQgYXMgYXMgQmlnIEVuZGlhbi4KLS8vIDIuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIHVwcGVyIGxheWVycywgSmF2YSBvciBCaW5kZXIsIGFyZSBCaWcKLS8vICAgIEVuZGlhbi4KLS8vIDMuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIGxvd2VyIGxheWVyLCBIQ0kgcGFja2V0cywgYXJlIExpdHRsZQotLy8gICAgRW5kaWFuLgotLy8gNC4gVVVJRCBpbiBzdG9yYWdlIGlzIGFsd2F5cyBzdHJpbmcuCi1jbGFzcyBVdWlkIGZpbmFsIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczEyOCA9IDE2OwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtQnl0ZXMzMiA9IDQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczE2ID0gMjsKLQotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU3RyaW5nMTI4Qml0TGVuID0gMzY7Ci0KLSAgc3RhdGljIGNvbnN0IFV1aWQga0VtcHR5OyAgLy8gMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwCi0KLSAgdXNpbmcgVVVJRDEyOEJpdCA9IHN0ZDo6YXJyYXk8dWludDhfdCwga051bUJ5dGVzMTI4PjsKLQotICBVdWlkKCkgPSBkZWZhdWx0OwotCi0gIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSByYW5kb20gMTI4LWJpdCBVVUlELgotICBzdGF0aWMgVXVpZCBHZXRSYW5kb20oKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQgaW4gYnl0ZXMuIEVpdGhlcgotICAvLyBrTnVtQnl0ZXMxNiwga051bUJ5dGVzMzIsIG9yIGtOdW1CeXRlczEyOAotICBzaXplX3QgR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBVVUlEIGNhbiBiZSByZXByZXNlbnRlZCBhcyAxNiBiaXQuCi0gIGJvb2wgSXMxNkJpdCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMTYgYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlELiBVc2UKLSAgLy8gR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBvciBJczE2Qml0KCkgYmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kLgotICB1aW50MTZfdCBBczE2Qml0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyAzMiBiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQuIFVzZQotICAvLyBHZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpIGJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZC4KLSAgdWludDMyX3QgQXMzMkJpdCgpIGNvbnN0OwotCi0gIC8vIENvbnZlcnRzIHN0cmluZyByZXByZXNlbnRpbmcgMTI4LCAzMiwgb3IgMTYgYml0IFVVSUQgaW4KLSAgLy8geHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4LCB4eHh4eHh4eCwgb3IgeHh4eCBmb3JtYXQgdG8gVVVJRC4gSWYKLSAgLy8gc2V0LCBvcHRpb25hbCBpc192YWxpZCBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiBjb252ZXJzaW9uIGlzCi0gIC8vIHN1Y2Nlc3NmdWxsLCBmYWxzZSBvdGhlcndpc2UuCi0gIHN0YXRpYyBVdWlkIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHV1aWQsIGJvb2wqIGlzX3ZhbGlkID0gbnVsbHB0cik7Ci0KLSAgLy8gQ29udmVydHMgMTZiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiBVVUlEIHRvIFVVSUQKLSAgc3RhdGljIFV1aWQgRnJvbTE2Qml0KHVpbnQxNl90IHV1aWQxNmJpdCk7Ci0KLSAgLy8gQ29udmVydHMgMzJiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiBVVUlEIHRvIFVVSUQKLSAgc3RhdGljIFV1aWQgRnJvbTMyQml0KHVpbnQzMl90IHV1aWQzMmJpdCk7Ci0KLSAgLy8gQ29udmVydHMgMTI4IGJpdCBCaWcgRW5kaWFuIGFycmF5IHJlcHJlc2VudGluZyBVVUlEIHRvIFVVSUQuCi0gIHN0YXRpYyBjb25zdGV4cHIgVXVpZCBGcm9tMTI4Qml0QkUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCkgewotICAgIFV1aWQgdSh1dWlkKTsKLSAgICByZXR1cm4gdTsKLSAgfQotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgQmlnIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELiB8dXVpZHwgcG9pbnRzCi0gIC8vIHRvIGJlZ2lubmluZyBvZiBhcnJheS4KLSAgc3RhdGljIFV1aWQgRnJvbTEyOEJpdEJFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpOwotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgTGl0dGxlIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELgotICBzdGF0aWMgVXVpZCBGcm9tMTI4Qml0TEUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCk7Ci0KLSAgLy8gQ29udmVydHMgMTI4IGJpdCBMaXR0bGUgRW5kaWFuIGFycmF5IHJlcHJlc2VudGluZyBVVUlEIHRvIFVVSUQuIHx1dWlkfAotICAvLyBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIGFycmF5LgotICBzdGF0aWMgVXVpZCBGcm9tMTI4Qml0TEUoY29uc3QgdWludDhfdCogdXVpZCk7Ci0KLSAgLy8gUmV0dXJucyAxMjggYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlECi0gIGNvbnN0IFVVSUQxMjhCaXQgVG8xMjhCaXRMRSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMTI4IGJpdCBCaWcgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVVJRAotICBjb25zdCBVVUlEMTI4Qml0JiBUbzEyOEJpdEJFKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgVVVJRCBpbgotICAvLyB4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHggZm9ybWF0LCBsb3dlcmNhc2UuCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgVVVJRCBpcyBlcXVhbCB0byBrRW1wdHkKLSAgYm9vbCBJc0VtcHR5KCkgY29uc3Q7Ci0KLSAgLy8gVXBkYXRlIFVVSUQgd2l0aCBuZXcgdmFsdWUKLSAgdm9pZCBVcGRhdGVVdWlkKGNvbnN0IFV1aWQmIHV1aWQpOwotCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFV1aWQmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVdWlkJiByaHMpIGNvbnN0OwotICBib29sIG9wZXJhdG9yIT0oY29uc3QgVXVpZCYgcmhzKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0ZXhwciBVdWlkKGNvbnN0IFVVSUQxMjhCaXQmIHZhbCkgOiB1dXt2YWx9IHt9OwotCi0gIC8vIE5ldHdvcmstYnl0ZS1vcmRlcmVkIElEIChCaWcgRW5kaWFuKS4KLSAgVVVJRDEyOEJpdCB1dTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBhKSB7Ci0gIG9zIDw8IGEuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi0vLyBDdXN0b20gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgYmx1ZXRvb3RoOjpVVUlEIGNhbiBiZSB1c2VkIGFzIGEga2V5Ci0vLyBpbiBzdGQ6OnVub3JkZXJlZF9tYXAuCi1uYW1lc3BhY2Ugc3RkIHsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGJsdWV0b290aDo6VXVpZD4gewotICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGJsdWV0b290aDo6VXVpZCYga2V5KSBjb25zdCB7Ci0gICAgY29uc3QgYXV0byYgdXVpZF9ieXRlcyA9IGtleS5UbzEyOEJpdEJFKCk7Ci0gICAgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPiBoYXNoX2ZuOwotICAgIHJldHVybiBoYXNoX2ZuKHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHV1aWRfYnl0ZXMuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2J5dGVzLnNpemUoKSkpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS90eXBlcy9idF90cmFuc3BvcnQuaCBiL3R5cGVzL2J0X3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTM3ZmRjLi4wMDAwMDAwCi0tLSBhL3R5cGVzL2J0X3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNkZWZpbmUgQlRfVFJBTlNQT1JUX0FVVE8gMAotI2RlZmluZSBCVF9UUkFOU1BPUlRfQlJfRURSIDEKLSNkZWZpbmUgQlRfVFJBTlNQT1JUX0xFIDIKLXR5cGVkZWYgdWludDhfdCB0QlRfVFJBTlNQT1JUOwotCi0jZGVmaW5lIENBU0VfUkVUVVJOX1RFWFQoY29kZSkgXAotICBjYXNlIGNvZGU6ICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI2NvZGUKLQotaW5saW5lIHN0ZDo6c3RyaW5nIGJ0X3RyYW5zcG9ydF90ZXh0KGNvbnN0IHRCVF9UUkFOU1BPUlQmIHRyYW5zcG9ydCkgewotICBzd2l0Y2ggKHRyYW5zcG9ydCkgewotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfVFJBTlNQT1JUX0FVVE8pOwotICAgIENBU0VfUkVUVVJOX1RFWFQoQlRfVFJBTlNQT1JUX0JSX0VEUik7Ci0gICAgQ0FTRV9SRVRVUk5fVEVYVChCVF9UUkFOU1BPUlRfTEUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlVOS05PV05bIikgKyBzdGQ6OnRvX3N0cmluZyh0cmFuc3BvcnQpICsKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZygiXSIpOwotICB9Ci19Ci0jdW5kZWYgQ0FTRV9SRVRVUk5fVEVYVApkaWZmIC0tZ2l0IGEvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmNjIGIvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVhNDEyLi4wMDAwMDAwCi0tLSBhL3R5cGVzL2NsYXNzX29mX2RldmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjbGFzc19vZl9kZXZpY2UuaCIKLQotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfc3BsaXQuaD4KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotc3RhdGljX2Fzc2VydChzaXplb2YoQ2xhc3NPZkRldmljZSkgPT0gQ2xhc3NPZkRldmljZTo6a0xlbmd0aCwKLSAgICAgICAgICAgICAgIkNsYXNzT2ZEZXZpY2UgbXVzdCBiZSAzIGJ5dGVzIGxvbmchIik7Ci0KLUNsYXNzT2ZEZXZpY2U6OkNsYXNzT2ZEZXZpY2UoY29uc3QgdWludDhfdCAoJmNsYXNzX29mX2RldmljZSlba0xlbmd0aF0pIHsKLSAgc3RkOjpjb3B5KGNsYXNzX29mX2RldmljZSwgY2xhc3Nfb2ZfZGV2aWNlICsga0xlbmd0aCwgY29kKTsKLX07Ci0KLXN0ZDo6c3RyaW5nIENsYXNzT2ZEZXZpY2U6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gYmFzZTo6U3RyaW5nUHJpbnRmKCIlMDN4LSUwMXgtJTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb2RbMl0pIDw8IDQpIHwgY29kWzFdID4+IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kWzFdICYgMHgwZiwgY29kWzBdKTsKLX0KLQotYm9vbCBDbGFzc09mRGV2aWNlOjpGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBDbGFzc09mRGV2aWNlJiB0bykgewotICBDbGFzc09mRGV2aWNlIG5ld19jb2Q7Ci0gIGlmIChmcm9tLmxlbmd0aCgpICE9IDgpIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYnl0ZV90b2tlbnMgPQotICAgICAgYmFzZTo6U3BsaXRTdHJpbmcoZnJvbSwgIi0iLCBiYXNlOjpUUklNX1dISVRFU1BBQ0UsIGJhc2U6OlNQTElUX1dBTlRfQUxMKTsKLQotICBpZiAoYnl0ZV90b2tlbnMuc2l6ZSgpICE9IDMpIHJldHVybiBmYWxzZTsKLSAgaWYgKGJ5dGVfdG9rZW5zWzBdLmxlbmd0aCgpICE9IDMpIHJldHVybiBmYWxzZTsKLSAgaWYgKGJ5dGVfdG9rZW5zWzFdLmxlbmd0aCgpICE9IDEpIHJldHVybiBmYWxzZTsKLSAgaWYgKGJ5dGVfdG9rZW5zWzJdLmxlbmd0aCgpICE9IDIpIHJldHVybiBmYWxzZTsKLQotICB1aW50MTZfdCB2YWx1ZXNbM107Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTGVuZ3RoOyBpKyspIHsKLSAgICBjb25zdCBhdXRvJiB0b2tlbiA9IGJ5dGVfdG9rZW5zW2ldOwotCi0gICAgY2hhciogdGVtcCA9IG51bGxwdHI7Ci0gICAgdmFsdWVzW2ldID0gc3RydG9sKHRva2VuLmNfc3RyKCksICZ0ZW1wLCAxNik7Ci0gICAgaWYgKCp0ZW1wICE9ICdcMCcpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG5ld19jb2QuY29kWzBdID0gdmFsdWVzWzJdOwotICBuZXdfY29kLmNvZFsxXSA9IHZhbHVlc1sxXSB8ICgodmFsdWVzWzBdICYgMHhmKSA8PCA0KTsKLSAgbmV3X2NvZC5jb2RbMl0gPSB2YWx1ZXNbMF0gPj4gNDsKLQotICB0byA9IG5ld19jb2Q7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgQ2xhc3NPZkRldmljZTo6RnJvbU9jdGV0cyhjb25zdCB1aW50OF90KiBmcm9tKSB7Ci0gIHN0ZDo6Y29weShmcm9tLCBmcm9tICsga0xlbmd0aCwgY29kKTsKLSAgcmV0dXJuIGtMZW5ndGg7Ci19OwotCi1ib29sIENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvZCkgewotICBDbGFzc09mRGV2aWNlIHRtcDsKLSAgcmV0dXJuIENsYXNzT2ZEZXZpY2U6OkZyb21TdHJpbmcoY29kLCB0bXApOwotfQpkaWZmIC0tZ2l0IGEvdHlwZXMvY2xhc3Nfb2ZfZGV2aWNlLmggYi90eXBlcy9jbGFzc19vZl9kZXZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmZmZjOC4uMDAwMDAwMAotLS0gYS90eXBlcy9jbGFzc19vZl9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHR5cGVzIHsKLQotLyoqIEJsdWV0b290aCBDbGFzcyBvZiBEZXZpY2UgKi8KLWNsYXNzIENsYXNzT2ZEZXZpY2UgZmluYWwgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga0xlbmd0aCA9IDM7Ci0KLSAgdWludDhfdCBjb2Rba0xlbmd0aF07Ci0KLSAgQ2xhc3NPZkRldmljZSgpID0gZGVmYXVsdDsKLSAgQ2xhc3NPZkRldmljZShjb25zdCB1aW50OF90ICgmY2xhc3Nfb2ZfZGV2aWNlKVtrTGVuZ3RoXSk7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENsYXNzT2ZEZXZpY2UmIHJocykgY29uc3QgewotICAgIHJldHVybiAoc3RkOjptZW1jbXAoY29kLCByaHMuY29kLCBzaXplb2YoY29kKSkgPT0gMCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotCi0gIC8vIENvbnZlcnRzIHxzdHJpbmd8IHRvIENsYXNzT2ZEZXZpY2UgYW5kIHBsYWNlcyBpdCBpbiB8dG98LiBJZiB8ZnJvbXwgZG9lcwotICAvLyBub3QgcmVwcmVzZW50IGEgQ2xhc3Mgb2YgRGV2aWNlLCB8dG98IGlzIG5vdCBtb2RpZmllZCBhbmQgdGhpcyBmdW5jdGlvbgotICAvLyByZXR1cm5zIGZhbHNlLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KLSAgc3RhdGljIGJvb2wgRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwgQ2xhc3NPZkRldmljZSYgdG8pOwotCi0gIC8vIENvcGllcyB8ZnJvbXwgcmF3IENsYXNzIG9mIERldmljZSBvY3RldHMgdG8gdGhlIGxvY2FsIG9iamVjdC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcGllZCBvY3RldHMgKGFsd2F5cyBDbGFzc09mRGV2aWNlOjprTGVuZ3RoKQotICBzaXplX3QgRnJvbU9jdGV0cyhjb25zdCB1aW50OF90KiBmcm9tKTsKLQotICBzdGF0aWMgYm9vbCBJc1ZhbGlkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbGFzc19vZl9kZXZpY2UpOwotfTsKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDbGFzc09mRGV2aWNlJiBjKSB7Ci0gIG9zIDw8IGMuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdHlwZXMKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotdXNpbmcgOjpibHVldG9vdGg6OnR5cGVzOjpDbGFzc09mRGV2aWNlOyAgLy8gVE9ETywgcmVtb3ZlCmRpZmYgLS1naXQgYS90eXBlcy9oY2lfcm9sZS5oIGIvdHlwZXMvaGNpX3JvbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1ODJiOC4uMDAwMDAwMAotLS0gYS90eXBlcy9oY2lfcm9sZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qIEhDSSByb2xlIGRlZmluaXRpb25zICovCi10eXBlZGVmIGVudW0gOiB1aW50OF90IHsKLSAgSENJX1JPTEVfQ0VOVFJBTCA9IDB4MDAsCi0gIEhDSV9ST0xFX1BFUklQSEVSQUwgPSAweDAxLAotICBIQ0lfUk9MRV9VTktOT1dOID0gMHhmZiwKLX0gdEhDSV9ST0xFOwotCi1pbmxpbmUgc3RkOjpzdHJpbmcgaGNpX3JvbGVfdGV4dChjb25zdCB0SENJX1JPTEUmIHJvbGUpIHsKLSAgc3dpdGNoIChyb2xlKSB7Ci0gICAgY2FzZSBIQ0lfUk9MRV9DRU5UUkFMOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJjZW50cmFsIik7Ci0gICAgY2FzZSBIQ0lfUk9MRV9QRVJJUEhFUkFMOgotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJwZXJpcGhlcmFsIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygidW5rbm93biIpOwotICB9Ci19Ci0KLWlubGluZSB0SENJX1JPTEUgdG9faGNpX3JvbGUoY29uc3QgdWludDhfdCYgcm9sZSkgewotICBpZiAocm9sZSA9PSAwKQotICAgIHJldHVybiBIQ0lfUk9MRV9DRU5UUkFMOwotICBlbHNlIGlmIChyb2xlID09IDEpCi0gICAgcmV0dXJuIEhDSV9ST0xFX1BFUklQSEVSQUw7Ci0gIGVsc2UKLSAgICByZXR1cm4gSENJX1JPTEVfVU5LTk9XTjsKLX0KLQotdHlwZWRlZiB0SENJX1JPTEUgaGNpX3JvbGVfdDsgICAgICAgICAvLyBMRUdBQ1kKLWNvbnN0IGF1dG8gUm9sZVRleHQgPSBoY2lfcm9sZV90ZXh0OyAgLy8gTEVHQUNZCmRpZmYgLS1naXQgYS90eXBlcy9yYXdfYWRkcmVzcy5jYyBiL3R5cGVzL3Jhd19hZGRyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFmNGVmLi4wMDAwMDAwCi0tLSBhL3R5cGVzL3Jhd19hZGRyZXNzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInJhd19hZGRyZXNzLmgiCi0KLSNpbmNsdWRlIDxiYXNlL3N0cmluZ3Mvc3RyaW5nX3NwbGl0Lmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLXN0YXRpY19hc3NlcnQoc2l6ZW9mKFJhd0FkZHJlc3MpID09IDYsICJSYXdBZGRyZXNzIG11c3QgYmUgNiBieXRlcyBsb25nISIpOwotCi1jb25zdCBSYXdBZGRyZXNzIFJhd0FkZHJlc3M6OmtBbnl7ezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9fTsKLWNvbnN0IFJhd0FkZHJlc3MgUmF3QWRkcmVzczo6a0VtcHR5e3sweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfX07Ci0KLVJhd0FkZHJlc3M6OlJhd0FkZHJlc3MoY29uc3QgdWludDhfdCAoJmFkZHIpWzZdKSB7Ci0gIHN0ZDo6Y29weShhZGRyLCBhZGRyICsga0xlbmd0aCwgYWRkcmVzcyk7Ci19Ci0KLVJhd0FkZHJlc3M6OlJhd0FkZHJlc3MoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCBrTGVuZ3RoPiBtYWMpIHsKLSAgc3RkOjpjb3B5KG1hYy5iZWdpbigpLCBtYWMuZW5kKCksIGFkZHJlc3MpOwotfQotCi1zdGQ6OnN0cmluZyBSYXdBZGRyZXNzOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIGJhc2U6OlN0cmluZ1ByaW50ZigiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCBhZGRyZXNzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbMV0sIGFkZHJlc3NbMl0sIGFkZHJlc3NbM10sIGFkZHJlc3NbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1s1XSk7Ci19Ci0KLXN0ZDo6YXJyYXk8dWludDhfdCwgUmF3QWRkcmVzczo6a0xlbmd0aD4gUmF3QWRkcmVzczo6VG9BcnJheSgpIGNvbnN0IHsKLSAgc3RkOjphcnJheTx1aW50OF90LCBrTGVuZ3RoPiBtYWM7Ci0gIHN0ZDo6Y29weShzdGQ6OmJlZ2luKGFkZHJlc3MpLCBzdGQ6OmVuZChhZGRyZXNzKSwgc3RkOjpiZWdpbihtYWMpKTsKLSAgcmV0dXJuIG1hYzsKLX0KLQotYm9vbCBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBSYXdBZGRyZXNzJiB0bykgewotICBSYXdBZGRyZXNzIG5ld19hZGRyOwotICBpZiAoZnJvbS5sZW5ndGgoKSAhPSAxNykgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBieXRlX3Rva2VucyA9Ci0gICAgICBiYXNlOjpTcGxpdFN0cmluZyhmcm9tLCAiOiIsIGJhc2U6OlRSSU1fV0hJVEVTUEFDRSwgYmFzZTo6U1BMSVRfV0FOVF9BTEwpOwotCi0gIGlmIChieXRlX3Rva2Vucy5zaXplKCkgIT0gNikgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgY29uc3QgYXV0byYgdG9rZW4gPSBieXRlX3Rva2Vuc1tpXTsKLQotICAgIGlmICh0b2tlbi5sZW5ndGgoKSAhPSAyKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBjaGFyKiB0ZW1wID0gbnVsbHB0cjsKLSAgICBuZXdfYWRkci5hZGRyZXNzW2ldID0gc3RydG9sKHRva2VuLmNfc3RyKCksICZ0ZW1wLCAxNik7Ci0gICAgaWYgKCp0ZW1wICE9ICdcMCcpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHRvID0gbmV3X2FkZHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgUmF3QWRkcmVzczo6RnJvbU9jdGV0cyhjb25zdCB1aW50OF90KiBmcm9tKSB7Ci0gIHN0ZDo6Y29weShmcm9tLCBmcm9tICsga0xlbmd0aCwgYWRkcmVzcyk7Ci0gIHJldHVybiBrTGVuZ3RoOwotfTsKLQotYm9vbCBSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcykgewotICBSYXdBZGRyZXNzIHRtcDsKLSAgcmV0dXJuIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoYWRkcmVzcywgdG1wKTsKLX0KZGlmZiAtLWdpdCBhL3R5cGVzL3Jhd19hZGRyZXNzLmggYi90eXBlcy9yYXdfYWRkcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U3NTMwLi4wMDAwMDAwCi0tLSBhL3R5cGVzL3Jhd19hZGRyZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLQotLyoqIEJsdWV0b290aCBBZGRyZXNzICovCi1jbGFzcyBSYXdBZGRyZXNzIGZpbmFsIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtMZW5ndGggPSA2OwotCi0gIHVpbnQ4X3QgYWRkcmVzc1trTGVuZ3RoXTsKLQotICBSYXdBZGRyZXNzKCkgPSBkZWZhdWx0OwotICBSYXdBZGRyZXNzKGNvbnN0IHVpbnQ4X3QgKCZhZGRyKVtrTGVuZ3RoXSk7Ci0gIFJhd0FkZHJlc3MoY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCBrTGVuZ3RoPiBhcnJheSk7Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmF3QWRkcmVzcyYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIChzdGQ6Om1lbWNtcChhZGRyZXNzLCByaHMuYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKSA8IDApOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSYXdBZGRyZXNzJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gKHN0ZDo6bWVtY21wKGFkZHJlc3MsIHJocy5hZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpID09IDApOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJhd0FkZHJlc3MmIHJocykgY29uc3QgeyByZXR1cm4gKHJocyA8ICp0aGlzKTsgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF3QWRkcmVzcyYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID4gcmhzKTsgfQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgUmF3QWRkcmVzcyYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzIDwgcmhzKTsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF3QWRkcmVzcyYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KLQotICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiAqdGhpcyA9PSBrRW1wdHk7IH0KLQotICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotCi0gIC8vIENvbnZlcnRzIHxzdHJpbmd8IHRvIFJhd0FkZHJlc3MgYW5kIHBsYWNlcyBpdCBpbiB8dG98LiBJZiB8ZnJvbXwgZG9lcwotICAvLyBub3QgcmVwcmVzZW50IGEgQmx1ZXRvb3RoIGFkZHJlc3MsIHx0b3wgaXMgbm90IG1vZGlmaWVkIGFuZCB0aGlzIGZ1bmN0aW9uCi0gIC8vIHJldHVybnMgZmFsc2UuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgotICBzdGF0aWMgYm9vbCBGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBSYXdBZGRyZXNzJiB0byk7Ci0KLSAgLy8gQ29waWVzIHxmcm9tfCByYXcgQmx1ZXRvb3RoIGFkZHJlc3Mgb2N0ZXRzIHRvIHRoZSBsb2NhbCBvYmplY3QuCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZWQgb2N0ZXRzIC0gc2hvdWxkIGJlIGFsd2F5cyBSYXdBZGRyZXNzOjprTGVuZ3RoCi0gIHNpemVfdCBGcm9tT2N0ZXRzKGNvbnN0IHVpbnQ4X3QqIGZyb20pOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwga0xlbmd0aD4gVG9BcnJheSgpIGNvbnN0OwotCi0gIHN0YXRpYyBib29sIElzVmFsaWRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKLQotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyBrRW1wdHk7ICAvLyAwMDowMDowMDowMDowMDowMAotICBzdGF0aWMgY29uc3QgUmF3QWRkcmVzcyBrQW55OyAgICAvLyBGRjpGRjpGRjpGRjpGRjpGRgotfTsKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBSYXdBZGRyZXNzJiBhKSB7Ci0gIG9zIDw8IGEuVG9TdHJpbmcoKTsKLSAgcmV0dXJuIG9zOwotfQotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IHN0ZDo6aGFzaDxSYXdBZGRyZXNzPiB7Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUmF3QWRkcmVzcyYgdmFsKSBjb25zdCB7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDY0X3QpID49IFJhd0FkZHJlc3M6OmtMZW5ndGgpOwotICAgIHVpbnQ2NF90IGludF9hZGRyID0gMDsKLSAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmludF9hZGRyKSwgdmFsLmFkZHJlc3MsCi0gICAgICAgICAgIFJhd0FkZHJlc3M6OmtMZW5ndGgpOwotICAgIHJldHVybiBzdGQ6Omhhc2g8dWludDY0X3Q+e30oaW50X2FkZHIpOwotICB9Ci19OwotCi0jZGVmaW5lIEJEX0FERFJfTEVOIDYgLyogRGV2aWNlIGFkZHJlc3MgbGVuZ3RoICovCi0KLWlubGluZSB2b2lkIEJEQUREUl9UT19TVFJFQU0odWludDhfdComIHAsIGNvbnN0IFJhd0FkZHJlc3MmIGEpIHsKLSAgZm9yIChpbnQgaWprID0gMDsgaWprIDwgQkRfQUREUl9MRU47IGlqaysrKQotICAgICoocCkrKyA9ICh1aW50OF90KShhLmFkZHJlc3MpW0JEX0FERFJfTEVOIC0gMSAtIGlqa107Ci19Ci0KLWlubGluZSB2b2lkIFNUUkVBTV9UT19CREFERFIoUmF3QWRkcmVzcyYgYSwgY29uc3QgdWludDhfdComIHApIHsKLSAgdWludDhfdCogcGJkYSA9ICh1aW50OF90KikoYS5hZGRyZXNzKSArIEJEX0FERFJfTEVOIC0gMTsKLSAgZm9yIChpbnQgaWprID0gMDsgaWprIDwgQkRfQUREUl9MRU47IGlqaysrKSAqcGJkYS0tID0gKihwKSsrOwotfQotCi0vLyBERVBSRUNBVEVECi1pbmxpbmUgdm9pZCBTVFJFQU1fVE9fQkRBRERSKFJhd0FkZHJlc3MmIGEsIHVpbnQ4X3QqJiBwKSB7Ci0gIHVpbnQ4X3QqIHBiZGEgPSAodWludDhfdCopKGEuYWRkcmVzcykgKyBCRF9BRERSX0xFTiAtIDE7Ci0gIGZvciAoaW50IGlqayA9IDA7IGlqayA8IEJEX0FERFJfTEVOOyBpamsrKykgKnBiZGEtLSA9ICoocCkrKzsKLX0KZGlmZiAtLWdpdCBhL3R5cGVzL3Rlc3QvYmx1ZXRvb3RoL3V1aWRfdW5pdHRlc3QuY2MgYi90eXBlcy90ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2RhZjU0Li4wMDAwMDAwCi0tLSBhL3R5cGVzL3Rlc3QvYmx1ZXRvb3RoL3V1aWRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgR29vZ2xlLCBJbmMuCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGJsdWV0b290aC91dWlkLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotdXNpbmcgYmx1ZXRvb3RoOjpVdWlkOwotCi1zdGF0aWMgY29uc3QgVXVpZCBPTkVTID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFV1aWQ6OlVVSUQxMjhCaXR7ezB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsCi0gICAgICAgICAgICAgICAgICAgICAgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMX19KTsKLQotc3RhdGljIGNvbnN0IFV1aWQgU0VRVUVOVElBTCA9IFV1aWQ6OkZyb20xMjhCaXRCRSgKLSAgICBVdWlkOjpVVUlEMTI4Qml0e3sweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweGFiLAotICAgICAgICAgICAgICAgICAgICAgIDB4Y2QsIDB4ZWYsIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODl9fSk7Ci0KLWNvbnN0ZXhwciBVdWlkIGtCYXNlID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFV1aWQ6OlVVSUQxMjhCaXR7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn19KTsKLQotVEVTVChVdWlkVGVzdCwgSXNFbXB0eSkgewotICBFWFBFQ1RfVFJVRShVdWlkOjprRW1wdHkuSXNFbXB0eSgpKTsKLSAgRVhQRUNUX0ZBTFNFKGtCYXNlLklzRW1wdHkoKSk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIEdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKSB7Ci0gIEVYUEVDVF9UUlVFKFV1aWQ6OmtOdW1CeXRlczE2ID09IGtCYXNlLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkpOwotICBFWFBFQ1RfVFJVRShVdWlkOjprTnVtQnl0ZXMzMiA9PQotICAgICAgICAgICAgICBVdWlkOjpGcm9tMzJCaXQoMHgwMTIzNDU2NykuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFV1aWQ6OmtOdW1CeXRlczEyOCA9PQotICAgICAgICAgICAgICBVdWlkOjprRW1wdHkuR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIEFzMTZCaXQpIHsKLSAgLy8gRXZlbiB0aG91Z2ggdGhpcyBpcyBpcyBub3QgMTZiaXQgVVVJRCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHByb3BlciBiaXRzCi0gIEVYUEVDVF9FUSgodWludDE2X3QpMHgxMTExLCBPTkVTLkFzMTZCaXQoKSk7Ci0gIEVYUEVDVF9FUSgodWludDE2X3QpMHg0NTY3LCBTRVFVRU5USUFMLkFzMTZCaXQoKSk7Ci0gIEVYUEVDVF9FUSgodWludDE2X3QpMHgwMDAwLCBrQmFzZS5BczE2Qml0KCkpOwotfQotCi1URVNUKFV1aWRUZXN0LCBBczMyQml0KSB7Ci0gIC8vIEV2ZW4gdGhvdWdoIHRoaXMgaXMgaXMgbm90IDMyYml0IFVVSUQsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCBwcm9wZXIgYml0cwotICBFWFBFQ1RfRVEoKHVpbnQzMl90KTB4MTExMTExMTEsIE9ORVMuQXMzMkJpdCgpKTsKLSAgRVhQRUNUX0VRKCh1aW50MzJfdCkweDAxMjM0NTY3LCBTRVFVRU5USUFMLkFzMzJCaXQoKSk7Ci0gIEVYUEVDVF9FUSgodWludDMyX3QpMHgwMDAwMDAwMCwga0Jhc2UuQXMzMkJpdCgpKTsKLSAgRVhQRUNUX0VRKCh1aW50MzJfdCkweDEyMzQ1Njc4LCBVdWlkOjpGcm9tMzJCaXQoMHgxMjM0NTY3OCkuQXMzMkJpdCgpKTsKLX0KLQotVEVTVChVdWlkVGVzdCwgSXMxNkJpdCkgewotICBFWFBFQ1RfRkFMU0UoT05FUy5JczE2Qml0KCkpOwotICBFWFBFQ1RfRkFMU0UoU0VRVUVOVElBTC5JczE2Qml0KCkpOwotICBFWFBFQ1RfVFJVRShrQmFzZS5JczE2Qml0KCkpOwotICBFWFBFQ1RfVFJVRShVdWlkOjpGcm9tU3RyaW5nKCIxYWU4IikuSXMxNkJpdCgpKTsKLX0KLQotVEVTVChVdWlkVGVzdCwgRnJvbTE2Qml0KSB7Ci0gIEVYUEVDVF9FUShVdWlkOjpGcm9tMTZCaXQoMHgwMDAwKSwga0Jhc2UpOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTJbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIFV1aWQgdXVpZCA9IFV1aWQ6OkZyb20xNkJpdCgweDAwMDEpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgwMCwgMHgwMCwgMHg1NSwgMHgzZSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9OwotICB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KDB4NTUzZSk7Ci0gIEVYUEVDVF9UUlVFKG1lbWNtcCgmdXVpZCwgdTMsIHNpemVvZih1MykpID09IDApOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTRbXSA9IHsweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDEwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIHV1aWQgPSBVdWlkOjpGcm9tMTZCaXQoMHhmZmZmKTsKLSAgRVhQRUNUX1RSVUUobWVtY21wKCZ1dWlkLCB1NCwgc2l6ZW9mKHU0KSkgPT0gMCk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIEZyb20zMkJpdCkgewotICBFWFBFQ1RfRVEoVXVpZDo6RnJvbTMyQml0KDB4MDAwMDAwMDApLCBrQmFzZSk7Ci0KLSAgY29uc3QgdWludDhfdCB1MltdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTMyQml0KDB4MDAwMDAwMDEpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgzMywgMHg0NCwgMHg1NSwgMHgzZSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9OwotICB1dWlkID0gVXVpZDo6RnJvbTMyQml0KDB4MzM0NDU1M2UpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUzLCBzaXplb2YodTMpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHU0W10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9OwotICB1dWlkID0gVXVpZDo6RnJvbTMyQml0KDB4ZmZmZmZmZmYpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHU0LCBzaXplb2YodTQpKSA9PSAwKTsKLX0KLQotVEVTVChVdWlkVGVzdCwgVG9TdHJpbmcpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgVVVJRF9CQVNFX1NUUiA9ICIwMDAwMDAwMC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiOwotICBjb25zdCBzdGQ6OnN0cmluZyBVVUlEX0VNUF9TVFIgPSAiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgVVVJRF9PTkVTX1NUUiA9ICIxMTExMTExMS0xMTExLTExMTEtMTExMS0xMTExMTExMTExMTEiOwotICBjb25zdCBzdGQ6OnN0cmluZyBVVUlEX1NFUV9TVFIgPSAiMDEyMzQ1NjctODlhYi1jZGVmLWFiY2QtZWYwMTIzNDU2Nzg5IjsKLQotICBFWFBFQ1RfRVEoVVVJRF9CQVNFX1NUUiwga0Jhc2UuVG9TdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShVVUlEX0VNUF9TVFIsIFV1aWQ6OmtFbXB0eS5Ub1N0cmluZygpKTsKLSAgRVhQRUNUX0VRKFVVSURfT05FU19TVFIsIE9ORVMuVG9TdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShVVUlEX1NFUV9TVFIsIFNFUVVFTlRJQUwuVG9TdHJpbmcoKSk7Ci0KLSAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTMyQml0KDB4MTIzNDU2NzgpOwotICBFWFBFQ1RfRVEoIjEyMzQ1Njc4LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIsIHV1aWQuVG9TdHJpbmcoKSk7Ci19Ci0KLVRFU1QoQnRpZlN0b3JhZ2VUZXN0LCB0ZXN0X3N0cmluZ190b191dWlkKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgdTFbXSA9IHsweGUzLCAweDljLCAweDYyLCAweDg1LCAweDg2LCAweDdmLCAweDRiLCAweDFkLAotICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZCwgMHhiMCwgMHgzNSwgMHhmYiwgMHhkOSwgMHhhZSwgMHhiZiwgMHgyMn07Ci0gIGJvb2wgaXNfdmFsaWQgPSBmYWxzZTsKLSAgVXVpZCB1dWlkID0KLSAgICAgIFV1aWQ6OkZyb21TdHJpbmcoImUzOWM2Mjg1LTg2N2YtNGIxZC05ZGIwLTM1ZmJkOWFlYmYyMiIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9UUlVFKGlzX3ZhbGlkKTsKLSAgRVhQRUNUX1RSVUUobWVtY21wKCZ1dWlkLCB1MSwgc2l6ZW9mKHUxKSkgPT0gMCk7Ci0KLSAgY29uc3QgdWludDhfdCB1MltdID0gezB4MDAsIDB4MDAsIDB4MWEsIDB4ZTgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIjFBZTgiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfVFJVRShpc192YWxpZCk7Ci0gIEVYUEVDVF9UUlVFKG1lbWNtcCgmdXVpZCwgdTIsIHNpemVvZih1MikpID09IDApOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTNbXSA9IHsweDEyLCAweDM0LCAweDExLCAweDI4LCAweDAwLCAweDAwLCAweDEwLCAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIGlzX3ZhbGlkID0gZmFsc2U7Ci0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxMjM0MTEyOCIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9UUlVFKGlzX3ZhbGlkKTsKLSAgRVhQRUNUX1RSVUUobWVtY21wKCZ1dWlkLCB1Mywgc2l6ZW9mKHUzKSkgPT0gMCk7Ci19Ci0KLVRFU1QoQnRpZlN0b3JhZ2VUZXN0LCB0ZXN0X3N0cmluZ190b191dWlkX2ludmFsaWQpIHsKLSAgYm9vbCBpc192YWxpZCA9IGZhbHNlOwotICBVdWlkIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCJUaGlzIGlzIG5vdCBhIFVVSUQiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotCi0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxMTIxMiIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9GQUxTRShpc192YWxpZCk7Ci0KLSAgdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIjExMjEgIiwgJmlzX3ZhbGlkKTsKLSAgRVhQRUNUX0ZBTFNFKGlzX3ZhbGlkKTsKLQotICB1dWlkID0gVXVpZDo6RnJvbVN0cmluZygiQUdGRSIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9GQUxTRShpc192YWxpZCk7Ci0KLSAgdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIkFCRkciLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotCi0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCJlMzljNjI4NTg2N2YxNGIxZDlkYjAzNWZiZDlhZWJmMjIiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotCi0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxMjIzNDU2Ny04OWFiLWNkZWYtYWJjZC1lZjAxMjM0NTY3WloiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotfQpkaWZmIC0tZ2l0IGEvdHlwZXMvdGVzdC9jbGFzc19vZl9kZXZpY2VfdW5pdHRlc3QuY2MgYi90eXBlcy90ZXN0L2NsYXNzX29mX2RldmljZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2NTJhNS4uMDAwMDAwMAotLS0gYS90eXBlcy90ZXN0L2NsYXNzX29mX2RldmljZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiY2xhc3Nfb2ZfZGV2aWNlLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyKiB0ZXN0X2NsYXNzID0gImVmYy1kLWFiIjsKLXN0YXRpYyBjb25zdCB1aW50OF90IHRlc3RfYnl0ZXNbXXsweGFiLCAweGNkLCAweGVmfTsKLQotVEVTVChDbGFzc09mRGV2aWNlVW5pdHRlc3QsIHRlc3RfY29uc3RydWN0b3JfYXJyYXkpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2QodGVzdF9ieXRlcyk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfYnl0ZXNbMF0sIGNvZC5jb2RbMF0pOwotICBBU1NFUlRfRVEodGVzdF9ieXRlc1sxXSwgY29kLmNvZFsxXSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X2J5dGVzWzJdLCBjb2QuY29kWzJdKTsKLQotICBzdGQ6OnN0cmluZyByZXQgPSBjb2QuVG9TdHJpbmcoKTsKLQotICBBU1NFUlRfU1RSRVEodGVzdF9jbGFzcywgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKENsYXNzT2ZEZXZpY2VVbml0dGVzdCwgdGVzdF90b19mcm9tX3N0cikgewotICBDbGFzc09mRGV2aWNlIGNvZDsKLSAgQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZyh0ZXN0X2NsYXNzLCBjb2QpOwotCi0gIEFTU0VSVF9FUSh0ZXN0X2J5dGVzWzBdLCBjb2QuY29kWzBdKTsKLSAgQVNTRVJUX0VRKHRlc3RfYnl0ZXNbMV0sIGNvZC5jb2RbMV0pOwotICBBU1NFUlRfRVEodGVzdF9ieXRlc1syXSwgY29kLmNvZFsyXSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0ID0gY29kLlRvU3RyaW5nKCk7Ci0KLSAgQVNTRVJUX1NUUkVRKHRlc3RfY2xhc3MsIHJldC5jX3N0cigpKTsKLX0KLQotVEVTVChDbGFzc09mRGV2aWNlVW5pdHRlc3QsIHRlc3RfZnJvbV9vY3RldHMpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2Q7Ci0gIHNpemVfdCBleHBlY3RlZF9yZXN1bHQgPSBDbGFzc09mRGV2aWNlOjprTGVuZ3RoOwotICBBU1NFUlRfRVEoZXhwZWN0ZWRfcmVzdWx0LCBjb2QuRnJvbU9jdGV0cyh0ZXN0X2J5dGVzKSk7Ci0KLSAgQVNTRVJUX0VRKHRlc3RfYnl0ZXNbMF0sIGNvZC5jb2RbMF0pOwotICBBU1NFUlRfRVEodGVzdF9ieXRlc1sxXSwgY29kLmNvZFsxXSk7Ci0gIEFTU0VSVF9FUSh0ZXN0X2J5dGVzWzJdLCBjb2QuY29kWzJdKTsKLQotICBzdGQ6OnN0cmluZyByZXQgPSBjb2QuVG9TdHJpbmcoKTsKLQotICBBU1NFUlRfU1RSRVEodGVzdF9jbGFzcywgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKENsYXNzT2ZEZXZpY2VUZXN0LCB0ZXN0X2NvcHkpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2QxOwotICBDbGFzc09mRGV2aWNlIGNvZDI7Ci0gIENsYXNzT2ZEZXZpY2U6OkZyb21TdHJpbmcodGVzdF9jbGFzcywgY29kMSk7Ci0gIGNvZDIgPSBjb2QxOwotCi0gIEFTU0VSVF9FUShjb2QxLmNvZFswXSwgY29kMi5jb2RbMF0pOwotICBBU1NFUlRfRVEoY29kMS5jb2RbMV0sIGNvZDIuY29kWzFdKTsKLSAgQVNTRVJUX0VRKGNvZDEuY29kWzJdLCBjb2QyLmNvZFsyXSk7Ci19Ci0KLVRFU1QoQ2xhc3NPZkRldmljZVRlc3QsIElzVmFsaWQpIHsKLSAgRVhQRUNUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIiIpKTsKLSAgRVhQRUNUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIjAwMDAwMCIpKTsKLSAgRVhQRUNUX0ZBTFNFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIjAwLTAwLTAwIikpOwotICBFWFBFQ1RfRkFMU0UoQ2xhc3NPZkRldmljZTo6SXNWYWxpZCgiMDAwLTAtMCIpKTsKLSAgRVhQRUNUX1RSVUUoQ2xhc3NPZkRldmljZTo6SXNWYWxpZCgiMDAwLTAtMDAiKSk7Ci0gIEVYUEVDVF9UUlVFKENsYXNzT2ZEZXZpY2U6OklzVmFsaWQoIkFCYy1kLTAwIikpOwotICBFWFBFQ1RfVFJVRShDbGFzc09mRGV2aWNlOjpJc1ZhbGlkKCJhQmMtRC1lRiIpKTsKLX0KLQotVEVTVChDbGFzc09mRGV2aWNlVGVzdCwgY2xhc3NPZkRldmljZUZyb21TdHJpbmcpIHsKLSAgQ2xhc3NPZkRldmljZSBjb2Q7Ci0KLSAgRVhQRUNUX1RSVUUoQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZygiMDAwLTAtMDAiLCBjb2QpKTsKLSAgY29uc3QgQ2xhc3NPZkRldmljZSByZXN1bHQwID0ge3sweDAwLCAweDAwLCAweDAwfX07Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoJmNvZCwgJnJlc3VsdDAsIHNpemVvZihjb2QpKSk7Ci0KLSAgRVhQRUNUX1RSVUUoQ2xhc3NPZkRldmljZTo6RnJvbVN0cmluZygiYWIyLTEtNEMiLCBjb2QpKTsKLSAgY29uc3QgQ2xhc3NPZkRldmljZSByZXN1bHQxID0ge3sweDRjLCAweDIxLCAweGFifX07Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoJmNvZCwgJnJlc3VsdDEsIHNpemVvZihjb2QpKSk7Ci19CmRpZmYgLS1naXQgYS90eXBlcy90ZXN0L3Jhd19hZGRyZXNzX3VuaXR0ZXN0LmNjIGIvdHlwZXMvdGVzdC9yYXdfYWRkcmVzc191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNDI5NS4uMDAwMDAwMAotLS0gYS90eXBlcy90ZXN0L3Jhd19hZGRyZXNzX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAicmF3X2FkZHJlc3MuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIqIHRlc3RfYWRkciA9ICIxMjozNDo1Njo3ODo5YTpiYyI7Ci1zdGF0aWMgY29uc3QgY2hhciogdGVzdF9hZGRyMiA9ICJjYjphOTo4Nzo2NTo0MzoyMSI7Ci0KLVRFU1QoUmF3QWRkcmVzc1VuaXR0ZXN0LCB0ZXN0X2NvbnN0cnVjdG9yX2FycmF5KSB7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyKHsweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjfSk7Ci0KLSAgQVNTRVJUX0VRKDB4MTIsIGJkYWRkci5hZGRyZXNzWzBdKTsKLSAgQVNTRVJUX0VRKDB4MzQsIGJkYWRkci5hZGRyZXNzWzFdKTsKLSAgQVNTRVJUX0VRKDB4NTYsIGJkYWRkci5hZGRyZXNzWzJdKTsKLSAgQVNTRVJUX0VRKDB4NzgsIGJkYWRkci5hZGRyZXNzWzNdKTsKLSAgQVNTRVJUX0VRKDB4OUEsIGJkYWRkci5hZGRyZXNzWzRdKTsKLSAgQVNTRVJUX0VRKDB4QkMsIGJkYWRkci5hZGRyZXNzWzVdKTsKLQotICBzdGQ6OnN0cmluZyByZXQgPSBiZGFkZHIuVG9TdHJpbmcoKTsKLQotICBBU1NFUlRfU1RSRVEodGVzdF9hZGRyLCByZXQuY19zdHIoKSk7Ci19Ci0KLVRFU1QoUmF3QWRkcmVzc1VuaXR0ZXN0LCB0ZXN0X2lzX2VtcHR5KSB7Ci0gIFJhd0FkZHJlc3MgZW1wdHk7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcoIjAwOjAwOjAwOjAwOjAwOjAwIiwgZW1wdHkpOwotICBBU1NFUlRfVFJVRShlbXB0eS5Jc0VtcHR5KCkpOwotCi0gIFJhd0FkZHJlc3Mgbm90X2VtcHR5OwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKCIwMDowMDowMDowMDowMDowMSIsIG5vdF9lbXB0eSk7Ci0gIEFTU0VSVF9GQUxTRShub3RfZW1wdHkuSXNFbXB0eSgpKTsKLX0KLQotVEVTVChSYXdBZGRyZXNzVW5pdHRlc3QsIHRlc3RfdG9fZnJvbV9zdHIpIHsKLSAgUmF3QWRkcmVzcyBiZGFkZHI7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIpOwotCi0gIEFTU0VSVF9FUSgweDEyLCBiZGFkZHIuYWRkcmVzc1swXSk7Ci0gIEFTU0VSVF9FUSgweDM0LCBiZGFkZHIuYWRkcmVzc1sxXSk7Ci0gIEFTU0VSVF9FUSgweDU2LCBiZGFkZHIuYWRkcmVzc1syXSk7Ci0gIEFTU0VSVF9FUSgweDc4LCBiZGFkZHIuYWRkcmVzc1szXSk7Ci0gIEFTU0VSVF9FUSgweDlBLCBiZGFkZHIuYWRkcmVzc1s0XSk7Ci0gIEFTU0VSVF9FUSgweEJDLCBiZGFkZHIuYWRkcmVzc1s1XSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0ID0gYmRhZGRyLlRvU3RyaW5nKCk7Ci0KLSAgQVNTRVJUX1NUUkVRKHRlc3RfYWRkciwgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKFJhd0FkZHJlc3NVbml0dGVzdCwgdGVzdF9mcm9tX29jdGV0cykgewotICBzdGF0aWMgY29uc3QgdWludDhfdCB0ZXN0X2FkZHJfYXJyYXlbXSA9IHsweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjfTsKLQotICBSYXdBZGRyZXNzIGJkYWRkcjsKLSAgc2l6ZV90IGV4cGVjdGVkX3Jlc3VsdCA9IFJhd0FkZHJlc3M6OmtMZW5ndGg7Ci0gIEFTU0VSVF9FUShleHBlY3RlZF9yZXN1bHQsIGJkYWRkci5Gcm9tT2N0ZXRzKHRlc3RfYWRkcl9hcnJheSkpOwotCi0gIEFTU0VSVF9FUSgweDEyLCBiZGFkZHIuYWRkcmVzc1swXSk7Ci0gIEFTU0VSVF9FUSgweDM0LCBiZGFkZHIuYWRkcmVzc1sxXSk7Ci0gIEFTU0VSVF9FUSgweDU2LCBiZGFkZHIuYWRkcmVzc1syXSk7Ci0gIEFTU0VSVF9FUSgweDc4LCBiZGFkZHIuYWRkcmVzc1szXSk7Ci0gIEFTU0VSVF9FUSgweDlBLCBiZGFkZHIuYWRkcmVzc1s0XSk7Ci0gIEFTU0VSVF9FUSgweEJDLCBiZGFkZHIuYWRkcmVzc1s1XSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0ID0gYmRhZGRyLlRvU3RyaW5nKCk7Ci0KLSAgQVNTRVJUX1NUUkVRKHRlc3RfYWRkciwgcmV0LmNfc3RyKCkpOwotfQotCi1URVNUKFJhd0FkZHJlc3NUZXN0LCB0ZXN0X2VxdWFscykgewotICBSYXdBZGRyZXNzIGJkYWRkcjE7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyMjsKLSAgUmF3QWRkcmVzcyBiZGFkZHIzOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMSk7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIyKTsKLSAgRVhQRUNUX1RSVUUoYmRhZGRyMSA9PSBiZGFkZHIyKTsKLSAgRVhQRUNUX0ZBTFNFKGJkYWRkcjEgIT0gYmRhZGRyMik7Ci0gIEVYUEVDVF9UUlVFKGJkYWRkcjEgPT0gYmRhZGRyMSk7Ci0gIEVYUEVDVF9GQUxTRShiZGFkZHIxICE9IGJkYWRkcjEpOwotCi0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyMiwgYmRhZGRyMyk7Ci0gIEVYUEVDVF9GQUxTRShiZGFkZHIyID09IGJkYWRkcjMpOwotICBFWFBFQ1RfVFJVRShiZGFkZHIyICE9IGJkYWRkcjMpOwotfQotCi1URVNUKFJhd0FkZHJlc3NUZXN0LCB0ZXN0X2xlc3NfdGhhbikgewotICBSYXdBZGRyZXNzIGJkYWRkcjE7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyMjsKLSAgUmF3QWRkcmVzcyBiZGFkZHIzOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMSk7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIyKTsKLSAgRVhQRUNUX0ZBTFNFKGJkYWRkcjEgPCBiZGFkZHIyKTsKLSAgRVhQRUNUX0ZBTFNFKGJkYWRkcjEgPCBiZGFkZHIxKTsKLQotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkcjIsIGJkYWRkcjMpOwotICBFWFBFQ1RfVFJVRShiZGFkZHIyIDwgYmRhZGRyMyk7Ci0gIEVYUEVDVF9GQUxTRShiZGFkZHIzIDwgYmRhZGRyMik7Ci19Ci0KLVRFU1QoUmF3QWRkcmVzc1Rlc3QsIHRlc3RfbW9yZV90aGFuKSB7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyMTsKLSAgUmF3QWRkcmVzcyBiZGFkZHIyOwotICBSYXdBZGRyZXNzIGJkYWRkcjM7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIxKTsKLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIsIGJkYWRkcjIpOwotICBFWFBFQ1RfRkFMU0UoYmRhZGRyMSA+IGJkYWRkcjIpOwotICBFWFBFQ1RfRkFMU0UoYmRhZGRyMSA+IGJkYWRkcjEpOwotCi0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyMiwgYmRhZGRyMyk7Ci0gIEVYUEVDVF9GQUxTRShiZGFkZHIyID4gYmRhZGRyMyk7Ci0gIEVYUEVDVF9UUlVFKGJkYWRkcjMgPiBiZGFkZHIyKTsKLX0KLQotVEVTVChSYXdBZGRyZXNzVGVzdCwgdGVzdF9sZXNzX3RoYW5fb3JfZXF1YWwpIHsKLSAgUmF3QWRkcmVzcyBiZGFkZHIxOwotICBSYXdBZGRyZXNzIGJkYWRkcjI7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyMzsKLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIsIGJkYWRkcjEpOwotICBSYXdBZGRyZXNzOjpGcm9tU3RyaW5nKHRlc3RfYWRkciwgYmRhZGRyMik7Ci0gIEVYUEVDVF9UUlVFKGJkYWRkcjEgPD0gYmRhZGRyMik7Ci0gIEVYUEVDVF9UUlVFKGJkYWRkcjEgPD0gYmRhZGRyMSk7Ci0KLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIyLCBiZGFkZHIzKTsKLSAgRVhQRUNUX1RSVUUoYmRhZGRyMiA8PSBiZGFkZHIzKTsKLSAgRVhQRUNUX0ZBTFNFKGJkYWRkcjMgPD0gYmRhZGRyMik7Ci19Ci0KLVRFU1QoUmF3QWRkcmVzc1Rlc3QsIHRlc3RfbW9yZV90aGFuX29yX2VxdWFsKSB7Ci0gIFJhd0FkZHJlc3MgYmRhZGRyMTsKLSAgUmF3QWRkcmVzcyBiZGFkZHIyOwotICBSYXdBZGRyZXNzIGJkYWRkcjM7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIxKTsKLSAgUmF3QWRkcmVzczo6RnJvbVN0cmluZyh0ZXN0X2FkZHIsIGJkYWRkcjIpOwotICBFWFBFQ1RfVFJVRShiZGFkZHIxID49IGJkYWRkcjIpOwotICBFWFBFQ1RfVFJVRShiZGFkZHIxID49IGJkYWRkcjEpOwotCi0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyMiwgYmRhZGRyMyk7Ci0gIEVYUEVDVF9GQUxTRShiZGFkZHIyID49IGJkYWRkcjMpOwotICBFWFBFQ1RfVFJVRShiZGFkZHIzID49IGJkYWRkcjIpOwotfQotCi1URVNUKFJhd0FkZHJlc3NUZXN0LCB0ZXN0X2NvcHkpIHsKLSAgUmF3QWRkcmVzcyBiZGFkZHIxOwotICBSYXdBZGRyZXNzIGJkYWRkcjI7Ci0gIFJhd0FkZHJlc3M6OkZyb21TdHJpbmcodGVzdF9hZGRyLCBiZGFkZHIxKTsKLSAgYmRhZGRyMiA9IGJkYWRkcjE7Ci0KLSAgRVhQRUNUX1RSVUUoYmRhZGRyMSA9PSBiZGFkZHIyKTsKLX0KLQotVEVTVChSYXdBZGRyZXNzVGVzdCwgSXNWYWxpZEFkZHJlc3MpIHsKLSAgRVhQRUNUX0ZBTFNFKFJhd0FkZHJlc3M6OklzVmFsaWRBZGRyZXNzKCIiKSk7Ci0gIEVYUEVDVF9GQUxTRShSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcygiMDAwMDAwMDAwMDAwIikpOwotICBFWFBFQ1RfRkFMU0UoUmF3QWRkcmVzczo6SXNWYWxpZEFkZHJlc3MoIjAwOjAwOjAwOjAwOjAwMDAiKSk7Ci0gIEVYUEVDVF9GQUxTRShSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcygiMDA6MDA6MDA6MDA6MDA6MCIpKTsKLSAgRVhQRUNUX0ZBTFNFKFJhd0FkZHJlc3M6OklzVmFsaWRBZGRyZXNzKCIwMDowMDowMDowMDowMDowOyIpKTsKLSAgRVhQRUNUX1RSVUUoUmF3QWRkcmVzczo6SXNWYWxpZEFkZHJlc3MoIjAwOjAwOjAwOjAwOjAwOjAwIikpOwotICBFWFBFQ1RfVFJVRShSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcygiQUI6Y2Q6MDA6MDA6MDA6MDAiKSk7Ci0gIEVYUEVDVF9GQUxTRShSYXdBZGRyZXNzOjpJc1ZhbGlkQWRkcmVzcygiYUI6Y0Q6ZUY6R2g6aUo6S2wiKSk7Ci19Ci0KLVRFU1QoUmF3QWRkcmVzc1Rlc3QsIEJkQWRkckZyb21TdHJpbmcpIHsKLSAgUmF3QWRkcmVzcyBhZGRyOwotICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0KLSAgRVhQRUNUX1RSVUUoUmF3QWRkcmVzczo6RnJvbVN0cmluZygiMDA6MDA6MDA6MDA6MDA6MDAiLCBhZGRyKSk7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgcmVzdWx0MCA9IHt7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH19OwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKCZhZGRyLCAmcmVzdWx0MCwgc2l6ZW9mKGFkZHIpKSk7Ci0KLSAgRVhQRUNUX1RSVUUoUmF3QWRkcmVzczo6RnJvbVN0cmluZygiYWI6MDE6NEM6ZDU6MjE6OWYiLCBhZGRyKSk7Ci0gIGNvbnN0IFJhd0FkZHJlc3MgcmVzdWx0MSA9IHt7MHhhYiwgMHgwMSwgMHg0YywgMHhkNSwgMHgyMSwgMHg5Zn19OwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKCZhZGRyLCAmcmVzdWx0MSwgc2l6ZW9mKGFkZHIpKSk7Ci19Ci0KLVRFU1QoUmF3QWRkcmVzc1Rlc3QsIEJkQWRkckZyb21BcnJheSkgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDY+IG1hYyA9IHsweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2fTsKLSAgUmF3QWRkcmVzcyBiZGFkZHIobWFjKTsKLQotICBzdGQ6OnN0cmluZyByZXQgPSBiZGFkZHIuVG9TdHJpbmcoKTsKLSAgQVNTRVJUX1NUUkVRKCIxMToyMjozMzo0NDo1NTo2NiIsIHJldC5jX3N0cigpKTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDY+IG1hYzIgPSBiZGFkZHIuVG9BcnJheSgpOwotICBBU1NFUlRfRVEobWFjLCBtYWMyKTsKLX0KZGlmZiAtLWdpdCBhL3VkcnYvQW5kcm9pZC5icCBiL3VkcnYvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxMWQ4My4uMDAwMDAwMAotLS0gYS91ZHJ2L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnVkcnYtdWlwYyIsCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ1bGludXgvdWlwYy5jYyIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgICAgICAic3lzdGVtL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3V0aWxzL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQpkaWZmIC0tZ2l0IGEvdWRydi9CVUlMRC5nbiBiL3VkcnYvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODY4YmYuLjAwMDAwMDAKLS0tIGEvdWRydi9CVUlMRC5nbgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDE1IEdvb2dsZSwgSW5jLgotIwotIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0jCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zb3VyY2Vfc2V0KCJ1ZHJ2IikgewotICBzb3VyY2VzID0gWwotICAgICJ1bGludXgvdWlwYy5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgImluY2x1ZGUiLAotICAgICJ1aXBjIiwKLSAgICAiLy9idC8iLAotICAgICIvL2J0L2ludGVybmFsX2luY2x1ZGUiLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgICIvL2J0L3V0aWxzL2luY2x1ZGUiLAotICBdCi0KLSAgY29uZmlncyArPSBbCi0gICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2Q6Z2RfZGVmYXVsdF9kZXBzIgotICBdCi19CmRpZmYgLS1naXQgYS91ZHJ2L2luY2x1ZGUvdWlwYy5oIGIvdWRydi9pbmNsdWRlL3VpcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3NzkzNS4uMDAwMDAwMAotLS0gYS91ZHJ2L2luY2x1ZGUvdWlwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDctMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIFVJUENfSAotI2RlZmluZSBVSVBDX0gKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2luY2x1ZGUgInN0YWNrL2luY2x1ZGUvYnRfaGRyLmgiCi0KLSNkZWZpbmUgVUlQQ19DSF9JRF9BVl9DVFJMIDAKLSNkZWZpbmUgVUlQQ19DSF9JRF9BVl9BVURJTyAxCi0jZGVmaW5lIFVJUENfQ0hfTlVNIDIKLQotI2RlZmluZSBVSVBDX0NIX0lEX0FMTCAzIC8qIHVzZWQgdG8gYWRkcmVzcyBhbGwgdGhlIGNoIGlkIGF0IG9uY2UgKi8KLQotI2RlZmluZSBERUZBVUxUX1JFQURfUE9MTF9UTU9fTVMgMTAwCi0KLXR5cGVkZWYgdWludDhfdCB0VUlQQ19DSF9JRDsKLQotLyogRXZlbnRzIGdlbmVyYXRlZCAqLwotdHlwZWRlZiBlbnVtIHsKLSAgVUlQQ19PUEVOX0VWVCA9IDB4MDAwMSwKLSAgVUlQQ19DTE9TRV9FVlQgPSAweDAwMDIsCi0gIFVJUENfUlhfREFUQV9FVlQgPSAweDAwMDQsCi0gIFVJUENfUlhfREFUQV9SRUFEWV9FVlQgPSAweDAwMDgsCi0gIFVJUENfVFhfREFUQV9SRUFEWV9FVlQgPSAweDAwMTAKLX0gdFVJUENfRVZFTlQ7Ci0KLS8qCi0gKiBVSVBDIElPQ1RMIFJlcXVlc3RzCi0gKi8KLQotI2RlZmluZSBVSVBDX1JFUV9SWF9GTFVTSCAxCi0jZGVmaW5lIFVJUENfUkVHX1JFTU9WRV9BQ1RJVkVfUkVBRFNFVCAzCi0jZGVmaW5lIFVJUENfU0VUX1JFQURfUE9MTF9UTU8gNAotCi10eXBlZGVmIHZvaWQodFVJUENfUkNWX0NCQUNLKSgKLSAgICB0VUlQQ19DSF9JRCBjaF9pZCwKLSAgICB0VUlQQ19FVkVOVCBldmVudCk7IC8qIHBvaW50cyB0byBCVF9IRFIgd2hpY2ggZGVzY3JpYmVzIGV2ZW50IHR5cGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggb2YgZGF0YTsgbGVuIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZSBtZXNzYWdlIChzaXplb2YoQlRfSERSKSArIG9mZnNldCArIHNpemUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpICovCi0KLWNvbnN0IGNoYXIqIGR1bXBfdWlwY19ldmVudCh0VUlQQ19FVkVOVCBldmVudCk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHNydmZkOwotICBpbnQgZmQ7Ci0gIGludCByZWFkX3BvbGxfdG1vX21zOwotICBpbnQgdGFza19ldnRfZmxhZ3M7IC8qIGV2ZW50IGZsYWdzIHBlbmRpbmcgdG8gYmUgcHJvY2Vzc2VkIGluIHJlYWQgdGFzayAqLwotICB0VUlQQ19SQ1ZfQ0JBQ0sqIGNiYWNrOwotfSB0VUlQQ19DSEFOOwotCi1zdHJ1Y3QgdFVJUENfU1RBVEUgewotICBwdGhyZWFkX3QgdGlkOyAvKiBtYWluIHRocmVhZCBpZCAqLwotICBpbnQgcnVubmluZzsKLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbXV0ZXg7Ci0KLSAgZmRfc2V0IGFjdGl2ZV9zZXQ7Ci0gIGZkX3NldCByZWFkX3NldDsKLSAgaW50IG1heF9mZDsKLSAgaW50IHNpZ25hbF9mZHNbMl07Ci0KLSAgdFVJUENfQ0hBTiBjaFtVSVBDX0NIX05VTV07Ci19OwotCi0vKioKLSAqIEluaXRpYWxpemUgVUlQQyBtb2R1bGUKLSAqCi0gKiBAcGFyYW0gdXNlciBVc2VyIElEIHdobyB1c2VzIFVJUEMKLSAqLwotc3RkOjp1bmlxdWVfcHRyPHRVSVBDX1NUQVRFPiBVSVBDX0luaXQoKTsKLQotLyoqCi0gKiBPcGVuIGEgVUlQQyBjaGFubmVsCi0gKgotICogQHBhcmFtIGNoX2lkIENoYW5uZWwgSUQKLSAqIEBwYXJhbSBwX2NiYWNrIENhbGxiYWNrIGhhbmRsZXIKLSAqIEBwYXJhbSBzb2NrZXRfcGF0aCBQYXRoIHRvIHRoZSBzb2NrZXQKLSAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAqLwotYm9vbCBVSVBDX09wZW4odFVJUENfU1RBVEUmIHVpcGMsIHRVSVBDX0NIX0lEIGNoX2lkLCB0VUlQQ19SQ1ZfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzb2NrZXRfcGF0aCk7Ci0KLS8qKgotICogQ2xvc2VzIGEgY2hhbm5lbCBpbiBVSVBDIG9yIHRoZSBlbnRpcmUgVUlQQyBtb2R1bGUKLSAqCi0gKiBAcGFyYW0gY2hfaWQgQ2hhbm5lbCBJRDsgaWYgY2hfaWQgaXMgVUlQQ19DSF9JRF9BTEwsIHRoZW4gY2xlYW51cCBVSVBDCi0gKi8KLXZvaWQgVUlQQ19DbG9zZSh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQpOwotCi0vKioKLSAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgVUlQQwotICoKLSAqIEBwYXJhbSBjaF9pZCBDaGFubmVsIElECi0gKiBAcGFyYW0gbXNnX2V2dCBNZXNzYWdlIGV2ZW50IHR5cGUKLSAqIEBwYXJhbSBwX2J1ZiBCdWZmZXIgZm9yIHRoZSBtZXNzYWdlCi0gKiBAcGFyYW0gbXNnbGVuIE1lc3NhZ2UgbGVuZ3RoCi0gKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCi0gKi8KLWJvb2wgVUlQQ19TZW5kKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCwgdWludDE2X3QgbXNnX2V2dCwKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBfYnVmLCB1aW50MTZfdCBtc2dsZW4pOwotCi0vKioKLSAqIFJlYWQgYSBtZXNzYWdlIGZyb20gVUlQQwotICoKLSAqIEBwYXJhbSBjaF9pZCBDaGFubmVsIElECi0gKiBAcGFyYW0gcF9tc2dfZXZ0IE1lc3NhZ2UgZXZlbnQgdHlwZQotICogQHBhcmFtIHBfYnVmIEJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKLSAqIEBwYXJhbSBsZW4gQnl0ZXMgdG8gcmVhZAotICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICovCi11aW50MzJfdCBVSVBDX1JlYWQodFVJUENfU1RBVEUmIHVpcGMsIHRVSVBDX0NIX0lEIGNoX2lkLCB1aW50OF90KiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW4pOwotCi0vKioKLSAqIENvbnRyb2wgdGhlIFVJUEMgcGFyYW1ldGVyCi0gKgotICogQHBhcmFtIGNoX2lkIENoYW5uZWwgSUQKLSAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgdHlwZQotICogQHBhcmFtIHBhcmFtIE9wdGlvbmFsIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAqLwotYm9vbCBVSVBDX0lvY3RsKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCwgdWludDMyX3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSk7Ci0KLSNlbmRpZiAvKiBVSVBDX0ggKi8KZGlmZiAtLWdpdCBhL3VkcnYvdWxpbnV4L3VpcGMuY2MgYi91ZHJ2L3VsaW51eC91aXBjLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTkzMjM1Li4wMDAwMDAwCi0tLSBhL3VkcnYvdWxpbnV4L3VpcGMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZpbGVuYW1lOiAgICAgIHVpcGMuY2MKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgVUlQQyBpbXBsZW1lbnRhdGlvbiBmb3IgZmx1b3JpZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiYXVkaW9fYTJkcF9ody9pbmNsdWRlL2F1ZGlvX2EyZHBfaHcuaCIKLSNpbmNsdWRlICJidF91dGlscy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL3NvY2tldF91dGlscy9zb2NrZXRzLmgiCi0jaW5jbHVkZSAidWlwYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb25zdGFudHMgJiBNYWNyb3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotI2RlZmluZSBDQVNFX1JFVFVSTl9TVFIoY29uc3QpIFwKLSAgY2FzZSBjb25zdDogICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICNjb25zdDsKLQotI2RlZmluZSBVSVBDX0RJU0NPTk5FQ1RFRCAoLTEpCi0KLSNkZWZpbmUgU0FGRV9GRF9JU1NFVChmZCwgc2V0KSAoKChmZCkgPT0gLTEpID8gZmFsc2UgOiBGRF9JU1NFVCgoZmQpLCAoc2V0KSkpCi0KLSNkZWZpbmUgVUlQQ19GTFVTSF9CVUZGRVJfU0laRSAxMDI0Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgVUlQQ19UQVNLX0ZMQUdfRElTQ09OTkVDVF9DSEFOID0gMHgxLAotfSB0VUlQQ19UQVNLX0ZMQUdTOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHVpcGNfY2xvc2VfY2hfbG9ja2VkKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEV4dGVybnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgIEhlbHBlciBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgY2hhciogZHVtcF91aXBjX2V2ZW50KHRVSVBDX0VWRU5UIGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBDQVNFX1JFVFVSTl9TVFIoVUlQQ19PUEVOX0VWVCkKLSAgICBDQVNFX1JFVFVSTl9TVFIoVUlQQ19DTE9TRV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKFVJUENfUlhfREFUQV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKFVJUENfUlhfREFUQV9SRUFEWV9FVlQpCi0gICAgQ0FTRV9SRVRVUk5fU1RSKFVJUENfVFhfREFUQV9SRUFEWV9FVlQpCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTiBNU0cgSUQiOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBzb2NrZXQgaGVscGVyIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9zZXJ2ZXJfc29ja2V0KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgaW50IHMgPSBzb2NrZXQoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwKTsKLSAgaWYgKHMgPCAwKSByZXR1cm4gLTE7Ci0KLSAgTE9HX0RFQlVHKCJjcmVhdGVfc2VydmVyX3NvY2tldCAlcyIsIG5hbWUpOwotCi0gIGlmIChvc2lfc29ja2V0X2xvY2FsX3NlcnZlcl9iaW5kKHMsIG5hbWUsCi0jaWYgZGVmaW5lZChPU19HRU5FUklDKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfRklMRVNZU1RFTQotI2Vsc2UgICAvLyAhZGVmaW5lZChPU19HRU5FUklDKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfQUJTVFJBQ1QKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19HRU5FUklDKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDwgMCkgewotICAgIExPR19ERUJVRygic29ja2V0IGZhaWxlZCB0byBjcmVhdGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgY2xvc2Uocyk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGxpc3RlbihzLCA1KSA8IDApIHsKLSAgICBMT0dfREVCVUcoImxpc3RlbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBjbG9zZShzKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBMT0dfREVCVUcoImNyZWF0ZWQgc29ja2V0IGZkICVkIiwgcyk7Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgaW50IGFjY2VwdF9zZXJ2ZXJfc29ja2V0KGludCBzZmQpIHsKLSAgc3RydWN0IHNvY2thZGRyX3VuIHJlbW90ZTsKLSAgc3RydWN0IHBvbGxmZCBwZmQ7Ci0gIGludCBmZDsKLSAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOwotCi0gIExPR19ERUJVRygiYWNjZXB0IGZkICVkIiwgc2ZkKTsKLQotICAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgZGF0YSB0byBwcm9jZXNzICovCi0gIHBmZC5mZCA9IHNmZDsKLSAgcGZkLmV2ZW50cyA9IFBPTExJTjsKLQotICBpbnQgcG9sbF9yZXQ7Ci0gIE9TSV9OT19JTlRSKHBvbGxfcmV0ID0gcG9sbCgmcGZkLCAxLCAwKSk7Ci0gIGlmIChwb2xsX3JldCA9PSAwKSB7Ci0gICAgTE9HX1dBUk4oImFjY2VwdCBwb2xsIHRpbWVvdXQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBPU0lfTk9fSU5UUihmZCA9IGFjY2VwdChzZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZyZW1vdGUsICZsZW4pKTsKLSAgaWYgKGZkID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCJzb2NrIGFjY2VwdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gbWF0Y2ggc29ja2V0IGJ1ZmZlciBzaXplIG9wdGlvbiB3aXRoIGNsaWVudAotICBjb25zdCBpbnQgc2l6ZSA9IEFVRElPX1NUUkVBTV9PVVRQVVRfQlVGRkVSX1NaOwotICBpbnQgcmV0ID0KLSAgICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZzaXplLCAoaW50KXNpemVvZihzaXplKSk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HX0VSUk9SKCJzZXRzb2Nrb3B0IGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotCi0gIHJldHVybiBmZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICB1aXBjIGhlbHBlciBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCB1aXBjX21haW5faW5pdCh0VUlQQ19TVEFURSYgdWlwYykgewotICBpbnQgaTsKLQotICBMT0dfREVCVUcoIiMjIyB1aXBjX21haW5faW5pdCAjIyMiKTsKLQotICB1aXBjLnRpZCA9IDA7Ci0gIHVpcGMucnVubmluZyA9IDA7Ci0gIG1lbXNldCgmdWlwYy5hY3RpdmVfc2V0LCAwLCBzaXplb2YodWlwYy5hY3RpdmVfc2V0KSk7Ci0gIG1lbXNldCgmdWlwYy5yZWFkX3NldCwgMCwgc2l6ZW9mKHVpcGMucmVhZF9zZXQpKTsKLSAgdWlwYy5tYXhfZmQgPSAwOwotICBtZW1zZXQoJnVpcGMuc2lnbmFsX2ZkcywgMCwgc2l6ZW9mKHVpcGMuc2lnbmFsX2ZkcykpOwotICBtZW1zZXQoJnVpcGMuY2gsIDAsIHNpemVvZih1aXBjLmNoKSk7Ci0KLSAgLyogc2V0dXAgaW50ZXJydXB0IHNvY2tldCBwYWlyICovCi0gIGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCB1aXBjLnNpZ25hbF9mZHMpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIEZEX1NFVCh1aXBjLnNpZ25hbF9mZHNbMF0sICZ1aXBjLmFjdGl2ZV9zZXQpOwotICB1aXBjLm1heF9mZCA9IE1BWCh1aXBjLm1heF9mZCwgdWlwYy5zaWduYWxfZmRzWzBdKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgVUlQQ19DSF9OVU07IGkrKykgewotICAgIHRVSVBDX0NIQU4qIHAgPSAmdWlwYy5jaFtpXTsKLSAgICBwLT5zcnZmZCA9IFVJUENfRElTQ09OTkVDVEVEOwotICAgIHAtPmZkID0gVUlQQ19ESVNDT05ORUNURUQ7Ci0gICAgcC0+dGFza19ldnRfZmxhZ3MgPSAwOwotICAgIHAtPmNiYWNrID0gTlVMTDsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi12b2lkIHVpcGNfbWFpbl9jbGVhbnVwKHRVSVBDX1NUQVRFJiB1aXBjKSB7Ci0gIGludCBpOwotCi0gIExPR19ERUJVRygidWlwY19tYWluX2NsZWFudXAiKTsKLQotICBjbG9zZSh1aXBjLnNpZ25hbF9mZHNbMF0pOwotICBjbG9zZSh1aXBjLnNpZ25hbF9mZHNbMV0pOwotCi0gIC8qIGNsb3NlIGFueSBvcGVuIGNoYW5uZWxzICovCi0gIGZvciAoaSA9IDA7IGkgPCBVSVBDX0NIX05VTTsgaSsrKSB1aXBjX2Nsb3NlX2NoX2xvY2tlZCh1aXBjLCBpKTsKLX0KLQotLyogY2hlY2sgcGVuZGluZyBldmVudHMgaW4gcmVhZCB0YXNrICovCi1zdGF0aWMgdm9pZCB1aXBjX2NoZWNrX3Rhc2tfZmxhZ3NfbG9ja2VkKHRVSVBDX1NUQVRFJiB1aXBjKSB7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBVSVBDX0NIX05VTTsgaSsrKSB7Ci0gICAgaWYgKHVpcGMuY2hbaV0udGFza19ldnRfZmxhZ3MgJiBVSVBDX1RBU0tfRkxBR19ESVNDT05ORUNUX0NIQU4pIHsKLSAgICAgIHVpcGMuY2hbaV0udGFza19ldnRfZmxhZ3MgJj0gflVJUENfVEFTS19GTEFHX0RJU0NPTk5FQ1RfQ0hBTjsKLSAgICAgIHVpcGNfY2xvc2VfY2hfbG9ja2VkKHVpcGMsIGkpOwotICAgIH0KLQotICAgIC8qIGFkZCBoZXJlICovCi0gIH0KLX0KLQotc3RhdGljIGludCB1aXBjX2NoZWNrX2ZkX2xvY2tlZCh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQpIHsKLSAgaWYgKGNoX2lkID49IFVJUENfQ0hfTlVNKSByZXR1cm4gLTE7Ci0KLSAgaWYgKFNBRkVfRkRfSVNTRVQodWlwYy5jaFtjaF9pZF0uc3J2ZmQsICZ1aXBjLnJlYWRfc2V0KSkgewotICAgIExPR19ERUJVRygiSU5DT01JTkcgQ09OTkVDVElPTiBPTiBDSCAlZCIsIGNoX2lkKTsKLQotICAgIC8vIENsb3NlIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uCi0gICAgaWYgKHVpcGMuY2hbY2hfaWRdLmZkICE9IFVJUENfRElTQ09OTkVDVEVEKSB7Ci0gICAgICBMT0dfREVCVUcoIkNMT1NFIENPTk5FQ1RJT04gKEZEICVkKSIsIHVpcGMuY2hbY2hfaWRdLmZkKTsKLSAgICAgIGNsb3NlKHVpcGMuY2hbY2hfaWRdLmZkKTsKLSAgICAgIEZEX0NMUih1aXBjLmNoW2NoX2lkXS5mZCwgJnVpcGMuYWN0aXZlX3NldCk7Ci0gICAgICB1aXBjLmNoW2NoX2lkXS5mZCA9IFVJUENfRElTQ09OTkVDVEVEOwotICAgIH0KLQotICAgIHVpcGMuY2hbY2hfaWRdLmZkID0gYWNjZXB0X3NlcnZlcl9zb2NrZXQodWlwYy5jaFtjaF9pZF0uc3J2ZmQpOwotCi0gICAgTE9HX0RFQlVHKCJORVcgRkQgJWQiLCB1aXBjLmNoW2NoX2lkXS5mZCk7Ci0KLSAgICBpZiAoKHVpcGMuY2hbY2hfaWRdLmZkID49IDApICYmIHVpcGMuY2hbY2hfaWRdLmNiYWNrKSB7Ci0gICAgICAvKiAgaWYgd2UgaGF2ZSBhIGNhbGxiYWNrIHdlIHNob3VsZCBhZGQgdGhpcyBmZCB0byB0aGUgYWN0aXZlIHNldAotICAgICAgICAgIGFuZCBub3RpZnkgdXNlciB3aXRoIGNhbGxiYWNrIGV2ZW50ICovCi0gICAgICBMT0dfREVCVUcoIkFERCBGRCAlZCBUTyBBQ1RJVkUgU0VUIiwgdWlwYy5jaFtjaF9pZF0uZmQpOwotICAgICAgRkRfU0VUKHVpcGMuY2hbY2hfaWRdLmZkLCAmdWlwYy5hY3RpdmVfc2V0KTsKLSAgICAgIHVpcGMubWF4X2ZkID0gTUFYKHVpcGMubWF4X2ZkLCB1aXBjLmNoW2NoX2lkXS5mZCk7Ci0gICAgfQotCi0gICAgaWYgKHVpcGMuY2hbY2hfaWRdLmZkIDwgMCkgewotICAgICAgTE9HX0VSUk9SKCJGQUlMRUQgVE8gQUNDRVBUIENIICVkIiwgY2hfaWQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICh1aXBjLmNoW2NoX2lkXS5jYmFjaykgdWlwYy5jaFtjaF9pZF0uY2JhY2soY2hfaWQsIFVJUENfT1BFTl9FVlQpOwotICB9Ci0KLSAgaWYgKFNBRkVfRkRfSVNTRVQodWlwYy5jaFtjaF9pZF0uZmQsICZ1aXBjLnJlYWRfc2V0KSkgewotCi0gICAgaWYgKHVpcGMuY2hbY2hfaWRdLmNiYWNrKQotICAgICAgdWlwYy5jaFtjaF9pZF0uY2JhY2soY2hfaWQsIFVJUENfUlhfREFUQV9SRUFEWV9FVlQpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB1aXBjX2NoZWNrX2ludGVycnVwdF9sb2NrZWQodFVJUENfU1RBVEUmIHVpcGMpIHsKLSAgaWYgKFNBRkVfRkRfSVNTRVQodWlwYy5zaWduYWxfZmRzWzBdLCAmdWlwYy5yZWFkX3NldCkpIHsKLSAgICBjaGFyIHNpZ19yZWN2ID0gMDsKLSAgICBPU0lfTk9fSU5UUigKLSAgICAgICAgcmVjdih1aXBjLnNpZ25hbF9mZHNbMF0sICZzaWdfcmVjdiwgc2l6ZW9mKHNpZ19yZWN2KSwgTVNHX1dBSVRBTEwpKTsKLSAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdWlwY193YWtldXBfbG9ja2VkKHRVSVBDX1NUQVRFJiB1aXBjKSB7Ci0gIGNoYXIgc2lnX29uID0gMTsKLSAgTE9HX0RFQlVHKCJVSVBDIFNFTkQgV0FLRSBVUCIpOwotCi0gIE9TSV9OT19JTlRSKHNlbmQodWlwYy5zaWduYWxfZmRzWzFdLCAmc2lnX29uLCBzaXplb2Yoc2lnX29uKSwgMCkpOwotfQotCi1zdGF0aWMgaW50IHVpcGNfc2V0dXBfc2VydmVyX2xvY2tlZCh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCB0VUlQQ19SQ1ZfQ0JBQ0sqIGNiYWNrKSB7Ci0gIGludCBmZDsKLQotICBMT0dfREVCVUcoIlNFVFVQIENIQU5ORUwgU0VSVkVSICVkIiwgY2hfaWQpOwotCi0gIGlmIChjaF9pZCA+PSBVSVBDX0NIX05VTSkgcmV0dXJuIC0xOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gZ3VhcmQodWlwYy5tdXRleCk7Ci0KLSAgZmQgPSBjcmVhdGVfc2VydmVyX3NvY2tldChuYW1lKTsKLQotICBpZiAoZmQgPCAwKSB7Ci0gICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gc2V0dXAgJXM6ICVzIiwgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBMT0dfREVCVUcoIkFERCBTRVJWRVIgRkQgVE8gQUNUSVZFIFNFVCAlZCIsIGZkKTsKLSAgRkRfU0VUKGZkLCAmdWlwYy5hY3RpdmVfc2V0KTsKLSAgdWlwYy5tYXhfZmQgPSBNQVgodWlwYy5tYXhfZmQsIGZkKTsKLQotICB1aXBjLmNoW2NoX2lkXS5zcnZmZCA9IGZkOwotICB1aXBjLmNoW2NoX2lkXS5jYmFjayA9IGNiYWNrOwotICB1aXBjLmNoW2NoX2lkXS5yZWFkX3BvbGxfdG1vX21zID0gREVGQVVMVF9SRUFEX1BPTExfVE1PX01TOwotCi0gIC8qIHRyaWdnZXIgbWFpbiB0aHJlYWQgdG8gdXBkYXRlIHJlYWQgc2V0ICovCi0gIHVpcGNfd2FrZXVwX2xvY2tlZCh1aXBjKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdWlwY19mbHVzaF9jaF9sb2NrZWQodFVJUENfU1RBVEUmIHVpcGMsIHRVSVBDX0NIX0lEIGNoX2lkKSB7Ci0gIGNoYXIgYnVmW1VJUENfRkxVU0hfQlVGRkVSX1NJWkVdOwotICBzdHJ1Y3QgcG9sbGZkIHBmZDsKLQotICBwZmQuZXZlbnRzID0gUE9MTElOOwotICBwZmQuZmQgPSB1aXBjLmNoW2NoX2lkXS5mZDsKLQotICBpZiAodWlwYy5jaFtjaF9pZF0uZmQgPT0gVUlQQ19ESVNDT05ORUNURUQpIHsKLSAgICBMT0dfREVCVUcoIiVzKCkgLSBmZCBkaXNjb25uZWN0ZWQuIEV4aXRpbmciLCBfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgd2hpbGUgKDEpIHsKLSAgICBpbnQgcmV0OwotICAgIE9TSV9OT19JTlRSKHJldCA9IHBvbGwoJnBmZCwgMSwgMSkpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgTE9HX1ZFUkJPU0UoIiVzKCk6IHBvbGwoKSB0aW1lb3V0IC0gbm90aGluZyB0byBkby4gRXhpdGluZyIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgIExPR19XQVJOKCIlcygpIC0gcG9sbCgpIGZhaWxlZDogcmV0dXJuICVkIGVycm5vICVkICglcykuIEV4aXRpbmciLAotICAgICAgICAgICAgICAgX19mdW5jX18sIHJldCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIExPR19WRVJCT1NFKCIlcygpIC0gcG9sbGluZyBmZCAlZCwgcmV2ZW50czogMHgleCwgcmV0ICVkIiwgX19mdW5jX18sIHBmZC5mZCwKLSAgICAgICAgICAgICAgICBwZmQucmV2ZW50cywgcmV0KTsKLSAgICBpZiAocGZkLnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExIVVApKSB7Ci0gICAgICBMT0dfV0FSTigiJXMoKSAtIFBPTExFUlIgb3IgUE9MTEhVUC4gRXhpdGluZyIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiByZWFkIHN1ZmZpY2llbnRseSBsYXJnZSBidWZmZXIgdG8gZW5zdXJlIGZsdXNoIGVtcHRpZXMgc29ja2V0IGZhc3RlciB0aGFuCi0gICAgICAgaXQgaXMgZ2V0dGluZyByZWZpbGxlZCAqLwotICAgICh2b2lkKXJlYWQocGZkLmZkLCAmYnVmLCBVSVBDX0ZMVVNIX0JVRkZFUl9TSVpFKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB1aXBjX2ZsdXNoX2xvY2tlZCh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQpIHsKLSAgaWYgKGNoX2lkID49IFVJUENfQ0hfTlVNKSByZXR1cm47Ci0KLSAgc3dpdGNoIChjaF9pZCkgewotICAgIGNhc2UgVUlQQ19DSF9JRF9BVl9DVFJMOgotICAgICAgdWlwY19mbHVzaF9jaF9sb2NrZWQodWlwYywgVUlQQ19DSF9JRF9BVl9DVFJMKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBVSVBDX0NIX0lEX0FWX0FVRElPOgotICAgICAgdWlwY19mbHVzaF9jaF9sb2NrZWQodWlwYywgVUlQQ19DSF9JRF9BVl9BVURJTyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgaW50IHVpcGNfY2xvc2VfY2hfbG9ja2VkKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCkgewotICBpbnQgd2FrZXVwID0gMDsKLQotICBMT0dfREVCVUcoIkNMT1NFIENIQU5ORUwgJWQiLCBjaF9pZCk7Ci0KLSAgaWYgKGNoX2lkID49IFVJUENfQ0hfTlVNKSByZXR1cm4gLTE7Ci0KLSAgaWYgKHVpcGMuY2hbY2hfaWRdLnNydmZkICE9IFVJUENfRElTQ09OTkVDVEVEKSB7Ci0gICAgTE9HX0RFQlVHKCJDTE9TRSBTRVJWRVIgKEZEICVkKSIsIHVpcGMuY2hbY2hfaWRdLnNydmZkKTsKLSAgICBjbG9zZSh1aXBjLmNoW2NoX2lkXS5zcnZmZCk7Ci0gICAgRkRfQ0xSKHVpcGMuY2hbY2hfaWRdLnNydmZkLCAmdWlwYy5hY3RpdmVfc2V0KTsKLSAgICB1aXBjLmNoW2NoX2lkXS5zcnZmZCA9IFVJUENfRElTQ09OTkVDVEVEOwotICAgIHdha2V1cCA9IDE7Ci0gIH0KLQotICBpZiAodWlwYy5jaFtjaF9pZF0uZmQgIT0gVUlQQ19ESVNDT05ORUNURUQpIHsKLSAgICBMT0dfREVCVUcoIkNMT1NFIENPTk5FQ1RJT04gKEZEICVkKSIsIHVpcGMuY2hbY2hfaWRdLmZkKTsKLSAgICBjbG9zZSh1aXBjLmNoW2NoX2lkXS5mZCk7Ci0gICAgRkRfQ0xSKHVpcGMuY2hbY2hfaWRdLmZkLCAmdWlwYy5hY3RpdmVfc2V0KTsKLSAgICB1aXBjLmNoW2NoX2lkXS5mZCA9IFVJUENfRElTQ09OTkVDVEVEOwotICAgIHdha2V1cCA9IDE7Ci0gIH0KLQotICAvKiBub3RpZnkgdGhpcyBjb25uZWN0aW9uIGlzIGNsb3NlZCAqLwotICBpZiAodWlwYy5jaFtjaF9pZF0uY2JhY2spIHVpcGMuY2hbY2hfaWRdLmNiYWNrKGNoX2lkLCBVSVBDX0NMT1NFX0VWVCk7Ci0KLSAgLyogdHJpZ2dlciBtYWluIHRocmVhZCB1cGRhdGUgaWYgc29tZXRoaW5nIHdhcyB1cGRhdGVkICovCi0gIGlmICh3YWtldXApIHVpcGNfd2FrZXVwX2xvY2tlZCh1aXBjKTsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCB1aXBjX2Nsb3NlX2xvY2tlZCh0VUlQQ19TVEFURSYgdWlwYywgdFVJUENfQ0hfSUQgY2hfaWQpIHsKLSAgaWYgKHVpcGMuY2hbY2hfaWRdLnNydmZkID09IFVJUENfRElTQ09OTkVDVEVEKSB7Ci0gICAgTE9HX0RFQlVHKCJDSEFOTkVMICVkIEFMUkVBRFkgQ0xPU0VEIiwgY2hfaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIHNjaGVkdWxlIGNsb3NlIG9uIHRoaXMgY2hhbm5lbCAqLwotICB1aXBjLmNoW2NoX2lkXS50YXNrX2V2dF9mbGFncyB8PSBVSVBDX1RBU0tfRkxBR19ESVNDT05ORUNUX0NIQU47Ci0gIHVpcGNfd2FrZXVwX2xvY2tlZCh1aXBjKTsKLX0KLQotc3RhdGljIHZvaWQqIHVpcGNfcmVhZF90YXNrKHZvaWQqIGFyZykgewotICB0VUlQQ19TVEFURSYgdWlwYyA9ICooKHRVSVBDX1NUQVRFKilhcmcpOwotICBpbnQgY2hfaWQ7Ci0gIGludCByZXN1bHQ7Ci0KLSAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJ1aXBjLW1haW4iLCAwLCAwLCAwKTsKLQotICByYWlzZV9wcmlvcml0eV9hMmRwKFRBU0tfVUlQQ19SRUFEKTsKLQotICB3aGlsZSAodWlwYy5ydW5uaW5nKSB7Ci0gICAgdWlwYy5yZWFkX3NldCA9IHVpcGMuYWN0aXZlX3NldDsKLQotICAgIHJlc3VsdCA9IHNlbGVjdCh1aXBjLm1heF9mZCArIDEsICZ1aXBjLnJlYWRfc2V0LCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgTE9HX0RFQlVHKCJzZWxlY3QgdGltZW91dCIpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgTE9HX0RFQlVHKCJzZWxlY3QgZmFpbGVkICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gZ3VhcmQodWlwYy5tdXRleCk7Ci0KLSAgICAgIC8qIGNsZWFyIGFueSB3YWtldXAgaW50ZXJydXB0ICovCi0gICAgICB1aXBjX2NoZWNrX2ludGVycnVwdF9sb2NrZWQodWlwYyk7Ci0KLSAgICAgIC8qIGNoZWNrIHBlbmRpbmcgdGFzayBldmVudHMgKi8KLSAgICAgIHVpcGNfY2hlY2tfdGFza19mbGFnc19sb2NrZWQodWlwYyk7Ci0KLSAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBzZXJ2aWNlIGF1ZGlvIGNoYW5uZWwgZmlyc3QgKi8KLSAgICAgIHVpcGNfY2hlY2tfZmRfbG9ja2VkKHVpcGMsIFVJUENfQ0hfSURfQVZfQVVESU8pOwotCi0gICAgICAvKiBjaGVjayBmb3Igb3RoZXIgY29ubmVjdGlvbnMgKi8KLSAgICAgIGZvciAoY2hfaWQgPSAwOyBjaF9pZCA8IFVJUENfQ0hfTlVNOyBjaF9pZCsrKSB7Ci0gICAgICAgIGlmIChjaF9pZCAhPSBVSVBDX0NIX0lEX0FWX0FVRElPKSB1aXBjX2NoZWNrX2ZkX2xvY2tlZCh1aXBjLCBjaF9pZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgTE9HX0RFQlVHKCJVSVBDIFJFQUQgVEhSRUFEIEVYSVRJTkciKTsKLQotICB1aXBjX21haW5fY2xlYW51cCh1aXBjKTsKLQotICB1aXBjLnRpZCA9IDA7Ci0KLSAgTE9HX0RFQlVHKCJVSVBDIFJFQUQgVEhSRUFEIERPTkUiKTsKLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotaW50IHVpcGNfc3RhcnRfbWFpbl9zZXJ2ZXJfdGhyZWFkKHRVSVBDX1NUQVRFJiB1aXBjKSB7Ci0gIHVpcGMucnVubmluZyA9IDE7Ci0KLSAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ1aXBjLnRpZCwgKGNvbnN0IHB0aHJlYWRfYXR0cl90KilOVUxMLCB1aXBjX3JlYWRfdGFzaywKLSAgICAgICAgICAgICAgICAgICAgICZ1aXBjKSAhPSAwKSB7Ci0gICAgTE9HX0VSUk9SKCJ1aXBjX3RocmVhZF9jcmVhdGUgcHRocmVhZF9jcmVhdGUgZmFpbGVkOiVkIiwgZXJybm8pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBibG9ja2luZyBjYWxsICovCi12b2lkIHVpcGNfc3RvcF9tYWluX3NlcnZlcl90aHJlYWQodFVJUENfU1RBVEUmIHVpcGMpIHsKLSAgLyogcmVxdWVzdCBzaHV0ZG93biBvZiByZWFkIHRocmVhZCAqLwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHVpcGMubXV0ZXgpOwotICAgIHVpcGMucnVubmluZyA9IDA7Ci0gICAgdWlwY193YWtldXBfbG9ja2VkKHVpcGMpOwotICB9Ci0KLSAgLyogd2FpdCB1bnRpbCByZWFkIHRocmVhZCBpcyBmdWxseSB0ZXJtaW5hdGVkICovCi0gIC8qIHRpZCBtaWdodCBob2xkIHBvaW50ZXIgdmFsdWUgd2hlcmUgaXQncyB2YWx1ZQotICAgICBpcyBuZWdhdGl2ZSB2YXVsZSB3aXRoIHNpbmdlZCBiaXQgaXMgc2V0LCBzbwotICAgICBjb3JyZWN0ZWQgdGhlIGxvZ2ljIHRvIGNoZWNrIHplcm8gb3Igbm9uIHplcm8gKi8KLSAgaWYgKHVpcGMudGlkKSBwdGhyZWFkX2pvaW4odWlwYy50aWQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqCi0gKiogRnVuY3Rpb24gICAgICAgICBVSVBDX0luaXQKLSAqKgotICoqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZSBVSVBDIG1vZHVsZQotICoqCi0gKiogUmV0dXJucyAgICAgICAgICB2b2lkCi0gKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGQ6OnVuaXF1ZV9wdHI8dFVJUENfU1RBVEU+IFVJUENfSW5pdCgpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPHRVSVBDX1NUQVRFPiB1aXBjID0gc3RkOjptYWtlX3VuaXF1ZTx0VUlQQ19TVEFURT4oKTsKLSAgTE9HX0RFQlVHKCJVSVBDX0luaXQiKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sodWlwYy0+bXV0ZXgpOwotCi0gIHVpcGNfbWFpbl9pbml0KCp1aXBjKTsKLSAgdWlwY19zdGFydF9tYWluX3NlcnZlcl90aHJlYWQoKnVpcGMpOwotCi0gIHJldHVybiB1aXBjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqCi0gKiogRnVuY3Rpb24gICAgICAgICBVSVBDX09wZW4KLSAqKgotICoqIERlc2NyaXB0aW9uICAgICAgT3BlbiBVSVBDIGludGVyZmFjZQotICoqCi0gKiogUmV0dXJucyAgICAgICAgICB0cnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2UgaW4gY2FzZSBvZiBmYWlsdXJlLgotICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBVSVBDX09wZW4odFVJUENfU1RBVEUmIHVpcGMsIHRVSVBDX0NIX0lEIGNoX2lkLCB0VUlQQ19SQ1ZfQ0JBQ0sqIHBfY2JhY2ssCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzb2NrZXRfcGF0aCkgewotICBMT0dfREVCVUcoIlVJUENfT3BlbiA6IGNoX2lkICVkIiwgY2hfaWQpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayh1aXBjLm11dGV4KTsKLQotICBpZiAoY2hfaWQgPj0gVUlQQ19DSF9OVU0pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAodWlwYy5jaFtjaF9pZF0uc3J2ZmQgIT0gVUlQQ19ESVNDT05ORUNURUQpIHsKLSAgICBMT0dfREVCVUcoIkNIQU5ORUwgJWQgQUxSRUFEWSBPUEVOIiwgY2hfaWQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWlwY19zZXR1cF9zZXJ2ZXJfbG9ja2VkKHVpcGMsIGNoX2lkLCBzb2NrZXRfcGF0aCwgcF9jYmFjayk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioKLSAqKiBGdW5jdGlvbiAgICAgICAgIFVJUENfQ2xvc2UKLSAqKgotICoqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgVUlQQyBpbnRlcmZhY2UKLSAqKgotICoqIFJldHVybnMgICAgICAgICAgdm9pZAotICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBVSVBDX0Nsb3NlKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCkgewotICBMT0dfREVCVUcoIlVJUENfQ2xvc2UgOiBjaF9pZCAlZCIsIGNoX2lkKTsKLQotICAvKiBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgdWlwYyBzaHV0ZG93biAqLwotICBpZiAoY2hfaWQgIT0gVUlQQ19DSF9JRF9BTEwpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sodWlwYy5tdXRleCk7Ci0gICAgdWlwY19jbG9zZV9sb2NrZWQodWlwYywgY2hfaWQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19ERUJVRygiVUlQQ19DbG9zZSA6IHdhaXRpbmcgZm9yIHNodXRkb3duIHRvIGNvbXBsZXRlIik7Ci0gIHVpcGNfc3RvcF9tYWluX3NlcnZlcl90aHJlYWQodWlwYyk7Ci0gIExPR19ERUJVRygiVUlQQ19DbG9zZSA6IHNodXRkb3duIGNvbXBsZXRlIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioKLSAqKiBGdW5jdGlvbiAgICAgICAgIFVJUENfU2VuZAotICoqCi0gKiogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgdG8gdHJhbnNtaXQgYSBtZXNzYWdlIG92ZXIgVUlQQy4KLSAqKgotICoqIFJldHVybnMgICAgICAgICAgdHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSAqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgVUlQQ19TZW5kKHRVSVBDX1NUQVRFJiB1aXBjLCB0VUlQQ19DSF9JRCBjaF9pZCwKLSAgICAgICAgICAgICAgIFVOVVNFRF9BVFRSIHVpbnQxNl90IG1zZ19ldnQsIGNvbnN0IHVpbnQ4X3QqIHBfYnVmLAotICAgICAgICAgICAgICAgdWludDE2X3QgbXNnbGVuKSB7Ci0gIExPR19ERUJVRygiVUlQQ19TZW5kIDogY2hfaWQ6JWQgJWQgYnl0ZXMiLCBjaF9pZCwgbXNnbGVuKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sodWlwYy5tdXRleCk7Ci0KLSAgc3NpemVfdCByZXQ7Ci0gIE9TSV9OT19JTlRSKHJldCA9IHdyaXRlKHVpcGMuY2hbY2hfaWRdLmZkLCBwX2J1ZiwgbXNnbGVuKSk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgTE9HX0VSUk9SKCJmYWlsZWQgdG8gd3JpdGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioKLSAqKiBGdW5jdGlvbiAgICAgICAgIFVJUENfUmVhZAotICoqCi0gKiogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgdG8gcmVhZCBhIG1lc3NhZ2UgZnJvbSBVSVBDLgotICoqCi0gKiogUmV0dXJucyAgICAgICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11aW50MzJfdCBVSVBDX1JlYWQodFVJUENfU1RBVEUmIHVpcGMsIHRVSVBDX0NIX0lEIGNoX2lkLCB1aW50OF90KiBwX2J1ZiwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKGNoX2lkID49IFVJUENfQ0hfTlVNKSB7Ci0gICAgTE9HX0VSUk9SKCJVSVBDX1JlYWQgOiBpbnZhbGlkIGNoIGlkICVkIiwgY2hfaWQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaW50IG5fcmVhZCA9IDA7Ci0gIGludCBmZCA9IHVpcGMuY2hbY2hfaWRdLmZkOwotICBzdHJ1Y3QgcG9sbGZkIHBmZDsKLQotICBpZiAoZmQgPT0gVUlQQ19ESVNDT05ORUNURUQpIHsKLSAgICBMT0dfRVJST1IoIlVJUENfUmVhZCA6IGNoYW5uZWwgJWQgY2xvc2VkIiwgY2hfaWQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgd2hpbGUgKG5fcmVhZCA8IChpbnQpbGVuKSB7Ci0gICAgcGZkLmZkID0gZmQ7Ci0gICAgcGZkLmV2ZW50cyA9IFBPTExJTiB8IFBPTExIVVA7Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgZGF0YSBwcmlvciB0byBhdHRlbXB0aW5nIHJlYWQgdG8gYXZvaWQgYmxvY2tpbmcKLSAgICAgICBhIHJlYWQgZm9yIG1vcmUgdGhhbiBwb2xsIHRpbWVvdXQgKi8KLQotICAgIGludCBwb2xsX3JldDsKLSAgICBPU0lfTk9fSU5UUihwb2xsX3JldCA9IHBvbGwoJnBmZCwgMSwgdWlwYy5jaFtjaF9pZF0ucmVhZF9wb2xsX3Rtb19tcykpOwotICAgIGlmIChwb2xsX3JldCA9PSAwKSB7Ci0gICAgICBMT0dfV0FSTigicG9sbCB0aW1lb3V0ICglZCBtcykiLCB1aXBjLmNoW2NoX2lkXS5yZWFkX3BvbGxfdG1vX21zKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAocG9sbF9yZXQgPCAwKSB7Ci0gICAgICBMT0dfRVJST1IoIiVzKCk6IHBvbGwoKSBmYWlsZWQ6IHJldHVybiAlZCBlcnJubyAlZCAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgcG9sbF9yZXQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHBmZC5yZXZlbnRzICYgKFBPTExIVVAgfCBQT0xMTlZBTCkpIHsKLSAgICAgIExPR19XQVJOKCJwb2xsIDogY2hhbm5lbCBkZXRhY2hlZCByZW1vdGVseSIpOwotICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHVpcGMubXV0ZXgpOwotICAgICAgdWlwY19jbG9zZV9sb2NrZWQodWlwYywgY2hfaWQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc3NpemVfdCBuOwotICAgIE9TSV9OT19JTlRSKG4gPSByZWN2KGZkLCBwX2J1ZiArIG5fcmVhZCwgbGVuIC0gbl9yZWFkLCAwKSk7Ci0KLSAgICBpZiAobiA9PSAwKSB7Ci0gICAgICBMT0dfV0FSTigiVUlQQ19SZWFkIDogY2hhbm5lbCBkZXRhY2hlZCByZW1vdGVseSIpOwotICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKHVpcGMubXV0ZXgpOwotICAgICAgdWlwY19jbG9zZV9sb2NrZWQodWlwYywgY2hfaWQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICBMT0dfV0FSTigiVUlQQ19SZWFkIDogcmVhZCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBuX3JlYWQgKz0gbjsKLSAgfQotCi0gIHJldHVybiBuX3JlYWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgICBVSVBDX0lvY3RsCi0gKgotICogRGVzY3JpcHRpb24gICAgICBDYWxsZWQgdG8gY29udHJvbCBVSVBDLgotICoKLSAqIFJldHVybnMgICAgICAgICAgdm9pZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBib29sIFVJUENfSW9jdGwodFVJUENfU1RBVEUmIHVpcGMsIHRVSVBDX0NIX0lEIGNoX2lkLCB1aW50MzJfdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgewotICBMT0dfREVCVUcoIiMjIyMgVUlQQ19Jb2N0bCA6IGNoX2lkICVkLCByZXF1ZXN0ICVkICMjIyMiLCBjaF9pZCwgcmVxdWVzdCk7Ci0gIHN0ZDo6bG9ja19ndWFyZDxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayh1aXBjLm11dGV4KTsKLQotICBzd2l0Y2ggKHJlcXVlc3QpIHsKLSAgICBjYXNlIFVJUENfUkVRX1JYX0ZMVVNIOgotICAgICAgdWlwY19mbHVzaF9sb2NrZWQodWlwYywgY2hfaWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFVJUENfUkVHX1JFTU9WRV9BQ1RJVkVfUkVBRFNFVDoKLSAgICAgIC8qIHVzZXIgd2lsbCByZWFkIGRhdGEgZGlyZWN0bHkgYW5kIG5vdCB1c2Ugc2VsZWN0IGxvb3AgKi8KLSAgICAgIGlmICh1aXBjLmNoW2NoX2lkXS5mZCAhPSBVSVBDX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAvKiByZW1vdmUgdGhpcyBjaGFubmVsIGZyb20gYWN0aXZlIHNldCAqLwotICAgICAgICBGRF9DTFIodWlwYy5jaFtjaF9pZF0uZmQsICZ1aXBjLmFjdGl2ZV9zZXQpOwotCi0gICAgICAgIC8qIHJlZnJlc2ggYWN0aXZlIHNldCAqLwotICAgICAgICB1aXBjX3dha2V1cF9sb2NrZWQodWlwYyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVUlQQ19TRVRfUkVBRF9QT0xMX1RNTzoKLSAgICAgIHVpcGMuY2hbY2hfaWRdLnJlYWRfcG9sbF90bW9fbXMgPSAoaW50cHRyX3QpcGFyYW07Ci0gICAgICBMT0dfREVCVUcoIlVJUENfU0VUX1JFQURfUE9MTF9UTU8gOiBDSCAlZCwgVE1PICVkIG1zIiwgY2hfaWQsCi0gICAgICAgICAgICAgICAgdWlwYy5jaFtjaF9pZF0ucmVhZF9wb2xsX3Rtb19tcyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfREVCVUcoIlVJUENfSW9jdGwgOiByZXF1ZXN0IG5vdCBoYW5kbGVkICglZCkiLCByZXF1ZXN0KTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdXRpbHMvQW5kcm9pZC5icCBiL3V0aWxzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTBhNWYuLjAwMDAwMDAKLS0tIGEvdXRpbHMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIFV0aWxzIHN0YXRpYyBsaWJyYXJ5IGZvciB0YXJnZXQKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYnQtdXRpbHMiLAotICAgIGRlZmF1bHRzOiBbImZsdW9yaWRlX2RlZmF1bHRzIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgICAgICJzeXN0ZW0vYnQvYnRjb3JlL2luY2x1ZGUiLAotICAgICAgICAic3lzdGVtL2J0L3N0YWNrL2luY2x1ZGUiLAotICAgIF0sCi0gICAgc3JjczogWyJzcmMvYnRfdXRpbHMuY2MiXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLX0KZGlmZiAtLWdpdCBhL3V0aWxzL0JVSUxELmduIGIvdXRpbHMvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYmM2NjAuLjAwMDAwMDAKLS0tIGEvdXRpbHMvQlVJTEQuZ24KKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAxNSBHb29nbGUsIEluYy4KLSMKLSMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotIwotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc3RhdGljX2xpYnJhcnkoInV0aWxzIikgewotICBzb3VyY2VzID0gWwotICAgICJzcmMvYnRfdXRpbHMuY2MiLAotICBdCi0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICJpbmNsdWRlIiwKLSAgICAiLy9idC8iLAotICAgICIvL2J0L3N0YWNrL2luY2x1ZGUiLAotICBdCi0KLSAgY29uZmlncyArPSBbCi0gICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgXQotCi0gIGRlcHMgPSBbCi0gICAgIi8vYnQvZ2QvcnVzdC9zaGltOmluaXRfZmxhZ3NfYnJpZGdlX2hlYWRlciIsCi0gIF0KLX0KZGlmZiAtLWdpdCBhL3V0aWxzL2luY2x1ZGUvYnRfdXRpbHMuaCBiL3V0aWxzL2luY2x1ZGUvYnRfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZTUxYy4uMDAwMDAwMAotLS0gYS91dGlscy9pbmNsdWRlL2J0X3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDA5LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJUX1VUSUxTX0gKLSNkZWZpbmUgQlRfVVRJTFNfSAotCi1zdGF0aWMgY29uc3QgY2hhciBCVF9VVElMU19NT0RVTEVbXSA9ICJidF91dGlsc19tb2R1bGUiOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFR5cGUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFRBU0tfSElHSF9NRURJQSA9IDAsCi0gIFRBU0tfVUlQQ19SRUFELAotICBUQVNLX0hJR0hfTUFYCi19IHRISUdIX1BSSU9SSVRZX1RBU0s7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHJhaXNlX3ByaW9yaXR5X2EyZHAodEhJR0hfUFJJT1JJVFlfVEFTSyBoaWdoX3Rhc2spOwotCi0jZW5kaWYgLyogQlRfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvdXRpbHMvc3JjL2J0X3V0aWxzLmNjIGIvdXRpbHMvc3JjL2J0X3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI2N2MxLi4wMDAwMDAwCi0tLSBhL3V0aWxzL3NyYy9idF91dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIENvcHlyaWdodCAyMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgRmlsZW5hbWU6ICAgICAgYnRfdXRpbHMuY2MKLSAqCi0gKiAgRGVzY3JpcHRpb246ICAgTWlzY2VsbGFuZW91cyBoZWxwZXIgZnVuY3Rpb25zCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYnRfdXRpbHMiCi0KLSNpbmNsdWRlICJidF91dGlscy5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxtdXRleD4KLQotI2RlZmluZSBBMkRQX1JUX1BSSU9SSVRZIDEKLSNpZmRlZiBPU19BTkRST0lECi0jaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJidGNvcmUvaW5jbHVkZS9tb2R1bGUuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9jb21wYXQuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9wcm9wZXJ0aWVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgVHlwZSBkZWZpbml0aW9ucyBmb3IgY2FsbGJhY2sgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHB0aHJlYWRfb25jZV90IGdfRG9TY2hlZHVsaW5nR3JvdXBPbmNlW1RBU0tfSElHSF9NQVhdOwotc3RhdGljIGJvb2wgZ19Eb1NjaGVkdWxpbmdHcm91cFtUQVNLX0hJR0hfTUFYXTsKLXN0YXRpYyBzdGQ6Om11dGV4IGdJZHhMb2NrOwotc3RhdGljIGludCBnX1Rhc2tJZHg7Ci1zdGF0aWMgaW50IGdfVGFza0lEc1tUQVNLX0hJR0hfTUFYXTsKLSNkZWZpbmUgSU5WQUxJRF9UQVNLX0lEICgtMSkKLQotc3RhdGljIGZ1dHVyZV90KiBpbml0KHZvaWQpIHsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFRBU0tfSElHSF9NQVg7IGkrKykgewotICAgIGdfRG9TY2hlZHVsaW5nR3JvdXBPbmNlW2ldID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci0gICAgZ19Eb1NjaGVkdWxpbmdHcm91cFtpXSA9IHRydWU7Ci0gICAgZ19UYXNrSURzW2ldID0gSU5WQUxJRF9UQVNLX0lEOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBmdXR1cmVfdCogY2xlYW5fdXAodm9pZCkgewotICByZXR1cm4gTlVMTDsKLX0KLQotRVhQT1JUX1NZTUJPTCBleHRlcm4gY29uc3QgbW9kdWxlX3QgYnRfdXRpbHNfbW9kdWxlID0gey5uYW1lID0gQlRfVVRJTFNfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0ID0gaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRfdXAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaHV0X2Rvd24gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbGVhbl91cCA9IGNsZWFuX3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZXBlbmRlbmNpZXMgPSB7TlVMTH19OwotCi0jaWZkZWYgT1NfQU5EUk9JRAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb24gICAgICAgIGNoZWNrX2RvX3NjaGVkdWxpbmdfZ3JvdXAKLSAqCi0gKiBEZXNjcmlwdGlvbiAgICAgY2hlY2sgaWYgaXQgaXMgb2sgdG8gY2hhbmdlIHNjaGVkdWxlIGdyb3VwCi0gKgotICogUmV0dXJucyAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY2hlY2tfZG9fc2NoZWR1bGluZ19ncm91cCh2b2lkKSB7Ci0gIGNoYXIgYnVmW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gIGludCBsZW4gPSBvc2lfcHJvcGVydHlfZ2V0KCJkZWJ1Zy5zeXMubm9zY2hlZGdyb3VwcyIsIGJ1ZiwgIiIpOwotICBpZiAobGVuID4gMCkgewotICAgIGludCB0ZW1wOwotICAgIGlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdGVtcCkgPT0gMSkgewotICAgICAgZ19Eb1NjaGVkdWxpbmdHcm91cFtnX1Rhc2tJZHhdID0gdGVtcCA9PSAwOwotICAgIH0KLSAgfQotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9uICAgICAgICByYWlzZV9wcmlvcml0eV9hMmRwCi0gKgotICogRGVzY3JpcHRpb24gICAgIFJhaXNlIHRhc2sgcHJpb3JpdHkgZm9yIEEyRFAgc3RyZWFtaW5nCi0gKgotICogUmV0dXJucyAgICAgICAgIHZvaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByYWlzZV9wcmlvcml0eV9hMmRwKHRISUdIX1BSSU9SSVRZX1RBU0sgaGlnaF90YXNrKSB7Ci0gIGludCByYyA9IDA7Ci0gIGludCB0aWQgPSBnZXR0aWQoKTsKLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lkeExvY2spOwotICAgIGdfVGFza0lkeCA9IGhpZ2hfdGFzazsKLQotLy8gVE9ETyhhcm1hbnNpdG8pOiBSZW1vdmUgdGhpcyBjb25kaXRpb25hbCBjaGVjayBvbmNlIHdlIGZpbmQgYSBzb2x1dGlvbgotLy8gZm9yIHN5c3RlbS9jb3JlIG9uIG5vbi1BbmRyb2lkIHBsYXRmb3Jtcy4KLSNpZm5kZWYgT1NfQU5EUk9JRAotICAgIHJjID0gLTE7Ci0jZWxzZSAgIC8vIGRlZmluZWQoT1NfQU5EUk9JRCkKLSAgICBwdGhyZWFkX29uY2UoJmdfRG9TY2hlZHVsaW5nR3JvdXBPbmNlW2dfVGFza0lkeF0sCi0gICAgICAgICAgICAgICAgIGNoZWNrX2RvX3NjaGVkdWxpbmdfZ3JvdXApOwotICAgIGlmIChnX0RvU2NoZWR1bGluZ0dyb3VwW2dfVGFza0lkeF0pIHsKLSAgICAgIC8vIHNldF9zY2hlZF9wb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCB0aWQgPT0gMAotICAgICAgcmMgPSBzZXRfc2NoZWRfcG9saWN5KHRpZCwgU1BfQVVESU9fU1lTKTsKLSAgICB9Ci0jZW5kaWYgIC8vIGlmbmRlZihPU19BTkRST0lEKQotCi0gICAgZ19UYXNrSURzW2hpZ2hfdGFza10gPSB0aWQ7Ci0gIH0KLQotICBpZiAocmMpIHsKLSAgICBMT0dfV0FSTigiZmFpbGVkIHRvIGNoYW5nZSBzY2hlZCBwb2xpY3ksIHRpZCAlZCwgZXJyOiAlZCIsIHRpZCwgZXJybm8pOwotICB9Ci0KLSAgLy8gbWFrZSBBMkRQIHRocmVhZHMgdXNlIFJUIHNjaGVkdWxpbmcgcG9saWN5IHNpbmNlIHRoZXkgYXJlIHBhcnQgb2YgdGhlCi0gIC8vIGF1ZGlvIHBpcGVsaW5lCi0gIHsKLSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcnRfcGFyYW1zOwotICAgIHJ0X3BhcmFtcy5zY2hlZF9wcmlvcml0eSA9IEEyRFBfUlRfUFJJT1JJVFk7Ci0KLSAgICBjb25zdCBpbnQgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIodGlkLCBTQ0hFRF9GSUZPLCAmcnRfcGFyYW1zKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgTE9HX0VSUk9SKCIlcyB1bmFibGUgdG8gc2V0IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgZm9yIHRpZCAlZCwgZXJyb3IgJXMiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBMkRQX1JUX1BSSU9SSVRZLCB0aWQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy9BbmRyb2lkLmJwIGIvdmVuZG9yX2xpYnMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2M2U5Yi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotc3ViZGlycyA9IFsKLSAgICAidGVzdF92ZW5kb3JfbGliIiwKLSAgICAibGludXgiLAotXQpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvQW5kcm9pZC5icCBiL3ZlbmRvcl9saWJzL2xpbnV4L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTY2ZGYuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvbGludXgvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLXN1YmRpcnMgPSBbCi0gICAgImludGVyZmFjZSIsCi1dCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvQW5kcm9pZC5icCBiL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWZkZTdkLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMS1zZXJ2aWNlLmJ0bGludXgiLAotICAgIHByb3ByaWV0YXJ5OiB0cnVlLAotICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJoY2lfcGFja2V0aXplci5jYyIsCi0gICAgICAgICJoNF9wcm90b2NvbC5jYyIsCi0gICAgICAgICJibHVldG9vdGhfaGNpLmNjIiwKLSAgICAgICAgInNlcnZpY2UuY2MiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYmJsdWV0b290aF9oZWFkZXJzIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhc3luY19mZF93YXRjaGVyIiwKLSAgICBdLAotICAgIGNvbmx5ZmxhZ3M6IFsKLSAgICAgICAgIi1zdGQ9Yzk5IiwKLSAgICBdLAotICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLXNlcnZpY2UuYnRsaW51eC5yYyJdLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImFzeW5jX2ZkX3dhdGNoZXIiLAotICAgIHByb3ByaWV0YXJ5OiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFzeW5jX2ZkX3dhdGNoZXIuY2MiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwotICAgICAgICAiLiIsCi0gICAgXSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLXNlcnZpY2UuYnRsaW51eC5yYyBiL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9hbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEtc2VydmljZS5idGxpbnV4LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAzZGUyLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9hbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEtc2VydmljZS5idGxpbnV4LnJjCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zZXJ2aWNlIGJ0bGludXgtMS4xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoQDEuMS1zZXJ2aWNlLmJ0bGludXgKLSAgICBjbGFzcyBoYWwKLSAgICB1c2VyIGJsdWV0b290aAotICAgIGdyb3VwIGJsdWV0b290aCBuZXRfYWRtaW4gbmV0X2J0X2FkbWluCi0gICAgY2FwYWJpbGl0aWVzIE5FVF9BRE1JTgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2FzeW5jX2ZkX3dhdGNoZXIuY2MgYi92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvYXN5bmNfZmRfd2F0Y2hlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkMjUwNi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvYXN5bmNfZmRfd2F0Y2hlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiYXN5bmNfZmRfd2F0Y2hlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImZjbnRsLmgiCi0jaW5jbHVkZSAic3lzL3NlbGVjdC5oIgotI2luY2x1ZGUgInVuaXN0ZC5oIgotCi1zdGF0aWMgY29uc3QgaW50IElOVkFMSURfRkQgPSAtMTsKLXN0YXRpYyBjb25zdCBpbnQgQlRfUlRfUFJJT1JJVFkgPSAxOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXN5bmMgewotCi1pbnQgQXN5bmNGZFdhdGNoZXI6OldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKAotICAgIGludCBmaWxlX2Rlc2NyaXB0b3IsIGNvbnN0IFJlYWRDYWxsYmFjayYgb25fcmVhZF9mZF9yZWFkeV9jYWxsYmFjaykgewotICAvLyBBZGQgZmlsZSBkZXNjcmlwdG9yIGFuZCBjYWxsYmFjawotICB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChpbnRlcm5hbF9tdXRleF8pOwotICAgIHdhdGNoZWRfZmRzX1tmaWxlX2Rlc2NyaXB0b3JdID0gb25fcmVhZF9mZF9yZWFkeV9jYWxsYmFjazsKLSAgfQotCi0gIC8vIFN0YXJ0IHRoZSB0aHJlYWQgaWYgbm90IHN0YXJ0ZWQgeWV0Ci0gIHJldHVybiB0cnlTdGFydFRocmVhZCgpOwotfQotCi1pbnQgQXN5bmNGZFdhdGNoZXI6OkNvbmZpZ3VyZVRpbWVvdXQoCi0gICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0LAotICAgIGNvbnN0IFRpbWVvdXRDYWxsYmFjayYgb25fdGltZW91dF9jYWxsYmFjaykgewotICAvLyBBZGQgdGltZW91dCBhbmQgY2FsbGJhY2sKLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQodGltZW91dF9tdXRleF8pOwotICAgIHRpbWVvdXRfY2JfID0gb25fdGltZW91dF9jYWxsYmFjazsKLSAgICB0aW1lb3V0X21zXyA9IHRpbWVvdXQ7Ci0gIH0KLQotICBub3RpZnlUaHJlYWQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQXN5bmNGZFdhdGNoZXI6OlN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9ycygpIHsgc3RvcFRocmVhZCgpOyB9Ci0KLUFzeW5jRmRXYXRjaGVyOjp+QXN5bmNGZFdhdGNoZXIoKSB7fQotCi0vLyBNYWtlIHN1cmUgdG8gY2FsbCB0aGlzIHdpdGggYXQgbGVhc3Qgb25lIGZpbGUgZGVzY3JpcHRvciByZWFkeSB0byBiZQotLy8gd2F0Y2hlZCB1cG9uIG9yIHRoZSB0aHJlYWQgcm91dGluZSB3aWxsIHJldHVybiBpbW1lZGlhdGVseQotaW50IEFzeW5jRmRXYXRjaGVyOjp0cnlTdGFydFRocmVhZCgpIHsKLSAgaWYgKHN0ZDo6YXRvbWljX2V4Y2hhbmdlKCZydW5uaW5nXywgdHJ1ZSkpIHJldHVybiAwOwotCi0gIC8vIFNldCB1cCB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsCi0gIGludCBwaXBlX2Zkc1syXTsKLSAgaWYgKHBpcGUyKHBpcGVfZmRzLCBPX05PTkJMT0NLKSkgcmV0dXJuIC0xOwotCi0gIG5vdGlmaWNhdGlvbl9saXN0ZW5fZmRfID0gcGlwZV9mZHNbMF07Ci0gIG5vdGlmaWNhdGlvbl93cml0ZV9mZF8gPSBwaXBlX2Zkc1sxXTsKLQotICB0aHJlYWRfID0gc3RkOjp0aHJlYWQoW3RoaXNdKCkgeyBUaHJlYWRSb3V0aW5lKCk7IH0pOwotICBpZiAoIXRocmVhZF8uam9pbmFibGUoKSkgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgQXN5bmNGZFdhdGNoZXI6OnN0b3BUaHJlYWQoKSB7Ci0gIGlmICghc3RkOjphdG9taWNfZXhjaGFuZ2UoJnJ1bm5pbmdfLCBmYWxzZSkpIHJldHVybiAwOwotCi0gIG5vdGlmeVRocmVhZCgpOwotICBpZiAoc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgIT0gdGhyZWFkXy5nZXRfaWQoKSkgewotICAgIHRocmVhZF8uam9pbigpOwotICB9Ci0KLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgICB3YXRjaGVkX2Zkc18uY2xlYXIoKTsKLSAgfQotCi0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKHRpbWVvdXRfbXV0ZXhfKTsKLSAgICB0aW1lb3V0X2NiXyA9IG51bGxwdHI7Ci0gIH0KLQotICBjbG9zZShub3RpZmljYXRpb25fbGlzdGVuX2ZkXyk7Ci0gIGNsb3NlKG5vdGlmaWNhdGlvbl93cml0ZV9mZF8pOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgQXN5bmNGZFdhdGNoZXI6Om5vdGlmeVRocmVhZCgpIHsKLSAgdWludDhfdCBidWZmZXJbXSA9IHswfTsKLSAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShub3RpZmljYXRpb25fd3JpdGVfZmRfLCAmYnVmZmVyLCAxKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIEFzeW5jRmRXYXRjaGVyOjpUaHJlYWRSb3V0aW5lKCkgewotCi0gIC8vIE1ha2Ugd2F0Y2hpbmcgdGhyZWFkIFJULgotICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcnRfcGFyYW1zOwotICBydF9wYXJhbXMuc2NoZWRfcHJpb3JpdHkgPSBCVF9SVF9QUklPUklUWTsKLSAgaWYgKHNjaGVkX3NldHNjaGVkdWxlcihnZXR0aWQoKSwgU0NIRURfRklGTywgJnJ0X3BhcmFtcykpIHsKLSAgICBBTE9HRSgiJXMgdW5hYmxlIHRvIHNldCBTQ0hFRF9GSUZPIGZvciBwaWQgJWQsIHRpZCAlZCwgZXJyb3IgJXMiLCBfX2Z1bmNfXywKLSAgICAgICAgICBnZXRwaWQoKSwgZ2V0dGlkKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLQotICB3aGlsZSAocnVubmluZ18pIHsKLSAgICBmZF9zZXQgcmVhZF9mZHM7Ci0gICAgRkRfWkVSTygmcmVhZF9mZHMpOwotICAgIEZEX1NFVChub3RpZmljYXRpb25fbGlzdGVuX2ZkXywgJnJlYWRfZmRzKTsKLSAgICBpbnQgbWF4X3JlYWRfZmQgPSBJTlZBTElEX0ZEOwotICAgIGZvciAoYXV0byYgaXQgOiB3YXRjaGVkX2Zkc18pIHsKLSAgICAgIEZEX1NFVChpdC5maXJzdCwgJnJlYWRfZmRzKTsKLSAgICAgIG1heF9yZWFkX2ZkID0gc3RkOjptYXgobWF4X3JlYWRfZmQsIGl0LmZpcnN0KTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OwotICAgIHN0cnVjdCB0aW1ldmFsKiB0aW1lb3V0X3B0ciA9IE5VTEw7Ci0gICAgaWYgKHRpbWVvdXRfbXNfID4gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSkgewotICAgICAgdGltZW91dC50dl9zZWMgPSB0aW1lb3V0X21zXy5jb3VudCgpIC8gMTAwMDsKLSAgICAgIHRpbWVvdXQudHZfdXNlYyA9ICh0aW1lb3V0X21zXy5jb3VudCgpICUgMTAwMCkgKiAxMDAwOwotICAgICAgdGltZW91dF9wdHIgPSAmdGltZW91dDsKLSAgICB9Ci0KLSAgICAvLyBXYWl0IHVudGlsIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgb24gc29tZSBGRC4KLSAgICBpbnQgbmZkcyA9IHN0ZDo6bWF4KG5vdGlmaWNhdGlvbl9saXN0ZW5fZmRfLCBtYXhfcmVhZF9mZCk7Ci0gICAgaW50IHJldHZhbCA9IHNlbGVjdChuZmRzICsgMSwgJnJlYWRfZmRzLCBOVUxMLCBOVUxMLCB0aW1lb3V0X3B0cik7Ci0KLSAgICAvLyBUaGVyZSB3YXMgc29tZSBlcnJvci4KLSAgICBpZiAocmV0dmFsIDwgMCkgY29udGludWU7Ci0KLSAgICAvLyBUaW1lb3V0LgotICAgIGlmIChyZXR2YWwgPT0gMCkgewotICAgICAgLy8gQWxsb3cgdGhlIHRpbWVvdXQgY2FsbGJhY2sgdG8gbW9kaWZ5IHRoZSB0aW1lb3V0LgotICAgICAgVGltZW91dENhbGxiYWNrIHNhdmVkX2NiOwotICAgICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKHRpbWVvdXRfbXV0ZXhfKTsKLSAgICAgICAgaWYgKHRpbWVvdXRfbXNfID4gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSkKLSAgICAgICAgICBzYXZlZF9jYiA9IHRpbWVvdXRfY2JfOwotICAgICAgfQotICAgICAgaWYgKHNhdmVkX2NiICE9IG51bGxwdHIpCi0gICAgICAgIHNhdmVkX2NiKCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBSZWFkIGRhdGEgZnJvbSB0aGUgbm90aWZpY2F0aW9uIEZELgotICAgIGlmIChGRF9JU1NFVChub3RpZmljYXRpb25fbGlzdGVuX2ZkXywgJnJlYWRfZmRzKSkgewotICAgICAgY2hhciBidWZmZXJbXSA9IHswfTsKLSAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKG5vdGlmaWNhdGlvbl9saXN0ZW5fZmRfLCBidWZmZXIsIDEpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEludm9rZSB0aGUgZGF0YSByZWFkeSBjYWxsYmFja3MgaWYgYXBwcm9wcmlhdGUuCi0gICAgewotICAgICAgLy8gSG9sZCB0aGUgbXV0ZXggdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNhbGxiYWNrcyBhcmUgc3RpbGwgdmFsaWQuCi0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0gICAgICBmb3IgKGF1dG8mIGl0IDogd2F0Y2hlZF9mZHNfKSB7Ci0gICAgICAgIGlmIChGRF9JU1NFVChpdC5maXJzdCwgJnJlYWRfZmRzKSkgewotICAgICAgICBpdC5zZWNvbmQoaXQuZmlyc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzeW5jCi19IC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvYXN5bmNfZmRfd2F0Y2hlci5oIGIvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2FzeW5jX2ZkX3dhdGNoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4Y2JjMy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvYXN5bmNfZmRfd2F0Y2hlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgYXN5bmMgewotCi11c2luZyBSZWFkQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT47Ci11c2luZyBUaW1lb3V0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+OwotCi1jbGFzcyBBc3luY0ZkV2F0Y2hlciB7Ci0gcHVibGljOgotICBBc3luY0ZkV2F0Y2hlcigpID0gZGVmYXVsdDsKLSAgfkFzeW5jRmRXYXRjaGVyKCk7Ci0KLSAgaW50IFdhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKGludCBmaWxlX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFkQ2FsbGJhY2smIG9uX3JlYWRfZmRfcmVhZHlfY2FsbGJhY2spOwotICBpbnQgQ29uZmlndXJlVGltZW91dChjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXRDYWxsYmFjayYgb25fdGltZW91dF9jYWxsYmFjayk7Ci0gIHZvaWQgU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3JzKCk7Ci0KLSBwcml2YXRlOgotICBBc3luY0ZkV2F0Y2hlcihjb25zdCBBc3luY0ZkV2F0Y2hlciYpID0gZGVsZXRlOwotICBBc3luY0ZkV2F0Y2hlciYgb3BlcmF0b3I9KGNvbnN0IEFzeW5jRmRXYXRjaGVyJikgPSBkZWxldGU7Ci0KLSAgaW50IHRyeVN0YXJ0VGhyZWFkKCk7Ci0gIGludCBzdG9wVGhyZWFkKCk7Ci0gIGludCBub3RpZnlUaHJlYWQoKTsKLSAgdm9pZCBUaHJlYWRSb3V0aW5lKCk7Ci0KLSAgc3RkOjphdG9taWNfYm9vbCBydW5uaW5nX3tmYWxzZX07Ci0gIHN0ZDo6dGhyZWFkIHRocmVhZF87Ci0gIHN0ZDo6bXV0ZXggaW50ZXJuYWxfbXV0ZXhfOwotICBzdGQ6Om11dGV4IHRpbWVvdXRfbXV0ZXhfOwotCi0gIHN0ZDo6bWFwPGludCwgUmVhZENhbGxiYWNrPiB3YXRjaGVkX2Zkc187Ci0gIGludCBub3RpZmljYXRpb25fbGlzdGVuX2ZkXzsKLSAgaW50IG5vdGlmaWNhdGlvbl93cml0ZV9mZF87Ci0gIFRpbWVvdXRDYWxsYmFjayB0aW1lb3V0X2NiXzsKLSAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0X21zXzsKLX07Ci0KLQotfSAvLyBuYW1lc3BhY2UgYXN5bmMKLX0gLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9ibHVldG9vdGhfaGNpLmNjIGIvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2JsdWV0b290aF9oY2kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWE4NmEuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2JsdWV0b290aF9oY2kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aEAxLjEtYnRsaW51eCIKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJibHVldG9vdGhfaGNpLmgiCi0KLSNkZWZpbmUgQlRQUk9UT19IQ0kgMQotCi0jZGVmaW5lIEhDSV9DSEFOTkVMX1VTRVIgMQotI2RlZmluZSBIQ0lfQ0hBTk5FTF9DT05UUk9MIDMKLSNkZWZpbmUgSENJX0RFVl9OT05FIDB4ZmZmZgotCi0vKiByZWZlcmVuY2UgZnJvbSA8a2VybmVsPi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oICovCi0jZGVmaW5lIE1HTVRfT1BfSU5ERVhfTElTVCAweDAwMDMKLSNkZWZpbmUgTUdNVF9FVl9JTkRFWF9BRERFRCAweDAwMDQKLSNkZWZpbmUgTUdNVF9FVl9DT01NQU5EX0NPTVAgMHgwMDAxCi0jZGVmaW5lIE1HTVRfRVZfU0laRV9NQVggMTAyNAotI2RlZmluZSBXUklURV9OT19JTlRSKGZuKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKChmbikgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0KLXN0cnVjdCBzb2NrYWRkcl9oY2kgewotICAgIHNhX2ZhbWlseV90IGhjaV9mYW1pbHk7Ci0gICAgdW5zaWduZWQgc2hvcnQgaGNpX2RldjsKLSAgICB1bnNpZ25lZCBzaG9ydCBoY2lfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBtZ210X3BrdCB7Ci0gICAgdWludDE2X3Qgb3Bjb2RlOwotICAgIHVpbnQxNl90IGluZGV4OwotICAgIHVpbnQxNl90IGxlbjsKLSAgICB1aW50OF90IGRhdGFbTUdNVF9FVl9TSVpFX01BWF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgbWdtdF9ldmVudF9yZWFkX2luZGV4IHsKLSAgICB1aW50MTZfdCBjY19vcGNvZGU7Ci0gICAgdWludDhfdCBzdGF0dXM7Ci0gICAgdWludDE2X3QgbnVtX2ludGY7Ci0gICAgdWludDE2X3QgaW5kZXhbMF07Ci0gIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBoYXJkd2FyZSB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBWMV8xIHsKLW5hbWVzcGFjZSBidGxpbnV4IHsKLQotaW50IEJsdWV0b290aEhjaTo6b3BlbkJ0SGNpKCkgewotCi0gIEFMT0dJKCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLSAgaW50IGhjaV9pbnRlcmZhY2UgPSAwOwotICByZmtpbGxfc3RhdGVfID0gTlVMTDsKLSAgcmZLaWxsKDEpOwotCi0gIGludCBmZCA9IHNvY2tldChBRl9CTFVFVE9PVEgsIFNPQ0tfUkFXLCBCVFBST1RPX0hDSSk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICBBTE9HRSggIkJsdWV0b290aCBzb2NrZXQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgYnRfc29jX2ZkXyA9IGZkOwotCi0gIGlmICh3YWl0SGNpRGV2KGhjaV9pbnRlcmZhY2UpKSB7Ci0gICAgQUxPR0UoICJIQ0kgaW50ZXJmYWNlICglZCkgbm90IGZvdW5kIiwgaGNpX2ludGVyZmFjZSk7Ci0gICAgOjpjbG9zZShmZCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHN0cnVjdCBzb2NrYWRkcl9oY2kgYWRkcjsKLSAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICBhZGRyLmhjaV9mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gIGFkZHIuaGNpX2RldiA9IGhjaV9pbnRlcmZhY2U7Ci0gIGFkZHIuaGNpX2NoYW5uZWwgPSBIQ0lfQ0hBTk5FTF9VU0VSOwotICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgQUxPR0UoICJIQ0kgQ2hhbm5lbCBDb250cm9sOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgOjpjbG9zZShmZCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIEFMT0dJKCAiSENJIGRldmljZSByZWFkeSIpOwotICByZXR1cm4gZmQ7Ci19Ci0KLXZvaWQgQmx1ZXRvb3RoSGNpOjpjbG9zZUJ0SGNpKCkgewotICBpZiAoYnRfc29jX2ZkXyAhPSAtMSkgewotICAgIDo6Y2xvc2UoYnRfc29jX2ZkXyk7Ci0gICAgYnRfc29jX2ZkXyA9IC0xOwotICB9Ci0gIHJmS2lsbCgwKTsKLSAgZnJlZShyZmtpbGxfc3RhdGVfKTsKLX0KLQotaW50IEJsdWV0b290aEhjaTo6d2FpdEhjaURldihpbnQgaGNpX2ludGVyZmFjZSkgewotICBzdHJ1Y3Qgc29ja2FkZHJfaGNpIGFkZHI7Ci0gIHN0cnVjdCBwb2xsZmQgZmRzWzFdOwotICBzdHJ1Y3QgbWdtdF9wa3QgZXY7Ci0gIGludCBmZDsKLSAgaW50IHJldCA9IDA7Ci0KLSAgQUxPR0koICIlcyIsIF9fZnVuY19fKTsKLSAgZmQgPSBzb2NrZXQoUEZfQkxVRVRPT1RILCBTT0NLX1JBVywgQlRQUk9UT19IQ0kpOwotICBpZiAoZmQgPCAwKSB7Ci0gICAgQUxPR0UoICJCbHVldG9vdGggc29ja2V0IGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgYWRkci5oY2lfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICBhZGRyLmhjaV9kZXYgPSBIQ0lfREVWX05PTkU7Ci0gIGFkZHIuaGNpX2NoYW5uZWwgPSBIQ0lfQ0hBTk5FTF9DT05UUk9MOwotICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgQUxPR0UoICJIQ0kgQ2hhbm5lbCBDb250cm9sOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0ID0gLTE7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotICBmZHNbMF0uZmQgPSBmZDsKLSAgZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKLQotICAvKiBSZWFkIENvbnRyb2xsZXIgSW5kZXggTGlzdCBDb21tYW5kICovCi0gIGV2Lm9wY29kZSA9IE1HTVRfT1BfSU5ERVhfTElTVDsKLSAgZXYuaW5kZXggPSBIQ0lfREVWX05PTkU7Ci0gIGV2LmxlbiA9IDA7Ci0KLSAgc3NpemVfdCB3cm90ZTsKLSAgV1JJVEVfTk9fSU5UUih3cm90ZSA9IHdyaXRlKGZkLCAmZXYsIDYpKTsKLSAgaWYgKHdyb3RlICE9IDYpIHsKLSAgICBBTE9HRSggIlVuYWJsZSB0byB3cml0ZSBtZ210IGNvbW1hbmQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXQgPSAtMTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICAvKiB2YWxpZGF0ZSBtZW50aW9uZWQgaGNpIGludGVyZmFjZSBpcyBwcmVzZW50IGFuZCByZWdpc3RlcmVkIHdpdGggc29jayBzeXN0ZW0gKi8KLSAgd2hpbGUgKDEpIHsKLSAgICBpbnQgbjsKLSAgICBXUklURV9OT19JTlRSKG4gPSBwb2xsKGZkcywgMSwgLTEpKTsKLSAgICBpZiAobiA9PSAtMSkgewotICAgICAgQUxPR0UoICJQb2xsIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICByZXQgPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICBBTE9HRSggIlRpbWVvdXQsIG5vIEhDSSBkZXZpY2UgZGV0ZWN0ZWQiKTsKLSAgICAgIHJldCA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSB7Ci0gICAgICBXUklURV9OT19JTlRSKG4gPSByZWFkKGZkLCAmZXYsIHNpemVvZihzdHJ1Y3QgbWdtdF9wa3QpKSk7Ci0gICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgQUxPR0UoICJFcnJvciByZWFkaW5nIGNvbnRyb2wgY2hhbm5lbDogJXMiLAotICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAoZXYub3Bjb2RlID09IE1HTVRfRVZfSU5ERVhfQURERUQgJiYgZXYuaW5kZXggPT0gaGNpX2ludGVyZmFjZSkgewotICAgICAgICBnb3RvIGVuZDsKLSAgICAgIH0gZWxzZSBpZiAoZXYub3Bjb2RlID09IE1HTVRfRVZfQ09NTUFORF9DT01QKSB7Ci0gICAgICAgIHN0cnVjdCBtZ210X2V2ZW50X3JlYWRfaW5kZXgqIGNjOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBjYyA9IChzdHJ1Y3QgbWdtdF9ldmVudF9yZWFkX2luZGV4Killdi5kYXRhOwotCi0gICAgICAgIGlmIChjYy0+Y2Nfb3Bjb2RlICE9IE1HTVRfT1BfSU5ERVhfTElTVCB8fCBjYy0+c3RhdHVzICE9IDApIGNvbnRpbnVlOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYy0+bnVtX2ludGY7IGkrKykgewotICAgICAgICAgIGlmIChjYy0+aW5kZXhbaV0gPT0gaGNpX2ludGVyZmFjZSkgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotZW5kOgotICA6OmNsb3NlKGZkKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotaW50IEJsdWV0b290aEhjaTo6ZmluZFJmS2lsbCgpIHsKLSAgICBjaGFyIHJma2lsbF90eXBlWzY0XTsKLSAgICBjaGFyIHR5cGVbMTZdOwotICAgIGludCBmZCwgc2l6ZSwgaTsKLSAgICBmb3IoaSA9IDA7IHJma2lsbF9zdGF0ZV8gPT0gTlVMTDsgaSsrKQotICAgIHsKLSAgICAgICAgc25wcmludGYocmZraWxsX3R5cGUsIHNpemVvZihyZmtpbGxfdHlwZSksICIvc3lzL2NsYXNzL3Jma2lsbC9yZmtpbGwlZC90eXBlIiwgaSk7Ci0gICAgICAgIGlmICgoZmQgPSBvcGVuKHJma2lsbF90eXBlLCBPX1JET05MWSkpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0UoIm9wZW4oJXMpIGZhaWxlZDogJXMgKCVkKVxuIiwgcmZraWxsX3R5cGUsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZSA9IHJlYWQoZmQsICZ0eXBlLCBzaXplb2YodHlwZSkpOwotICAgICAgICA6OmNsb3NlKGZkKTsKLQotICAgICAgICBpZiAoKHNpemUgPj0gOSkgJiYgIW1lbWNtcCh0eXBlLCAiYmx1ZXRvb3RoIiwgOSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIDo6YXNwcmludGYoJnJma2lsbF9zdGF0ZV8sICIvc3lzL2NsYXNzL3Jma2lsbC9yZmtpbGwlZC9zdGF0ZSIsIGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBCbHVldG9vdGhIY2k6OnJmS2lsbChpbnQgYmxvY2spIHsKLSAgaW50IGZkOwotICBjaGFyIG9uID0gKGJsb2NrKT8nMSc6JzAnOwotICBpZiAoZmluZFJmS2lsbCgpICE9IDApIHJldHVybiAwOwotCi0gIGZkID0gb3BlbihyZmtpbGxfc3RhdGVfLCBPX1dST05MWSk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICBBTE9HRSggIlVuYWJsZSB0byBvcGVuIC9kZXYvcmZraWxsIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHNzaXplX3QgbGVuOwotICBXUklURV9OT19JTlRSKGxlbiA9IHdyaXRlKGZkLCAmb24sIDEpKTsKLSAgaWYgKGxlbiA8IDApIHsKLSAgICBBTE9HRSggIkZhaWxlZCB0byBjaGFuZ2UgcmZraWxsIHN0YXRlIik7Ci0gICAgOjpjbG9zZShmZCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIDo6Y2xvc2UoZmQpOwotICByZXR1cm4gMDsKLX0KLQotY2xhc3MgQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGlkbF9kZWF0aF9yZWNpcGllbnQgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQoY29uc3Qgc3A8SUJsdWV0b290aEhjaT4gaGNpKSA6IG1IY2koaGNpKSB7fQotCi0gIHZvaWQgc2VydmljZURpZWQoCi0gICAgICB1aW50NjRfdCAvKmNvb2tpZSovLAotICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qd2hvKi8pIG92ZXJyaWRlIHsKLSAgICBBTE9HRSgiQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQ6OnNlcnZpY2VEaWVkIC0gQmx1ZXRvb3RoIHNlcnZpY2UgZGllZCIpOwotICAgIGhhc19kaWVkXyA9IHRydWU7Ci0gICAgbUhjaS0+Y2xvc2UoKTsKLSAgfQotICBzcDxJQmx1ZXRvb3RoSGNpPiBtSGNpOwotICBib29sIGdldEhhc0RpZWQoKSBjb25zdCB7IHJldHVybiBoYXNfZGllZF87IH0KLSAgdm9pZCBzZXRIYXNEaWVkKGJvb2wgaGFzX2RpZWQpIHsgaGFzX2RpZWRfID0gaGFzX2RpZWQ7IH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgaGFzX2RpZWRfOwotfTsKLQotQmx1ZXRvb3RoSGNpOjpCbHVldG9vdGhIY2koKQotICAgIDogZGVhdGhfcmVjaXBpZW50XyhuZXcgQmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQodGhpcykpIHt9Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OmluaXRpYWxpemUoCi0gICAgY29uc3QgOjphbmRyb2lkOjpzcDxWMV8wOjpJQmx1ZXRvb3RoSGNpQ2FsbGJhY2tzPiYgY2IpIHsKLSAgcmV0dXJuIGluaXRpYWxpemVfaW1wbChjYiwgbnVsbHB0cik7Ci19Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OmluaXRpYWxpemVfMV8xKAotICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8VjFfMTo6SUJsdWV0b290aEhjaUNhbGxiYWNrcz4mIGNiKSB7Ci0gIHJldHVybiBpbml0aWFsaXplX2ltcGwoY2IsIGNiKTsKLX0KLQotUmV0dXJuPHZvaWQ+IEJsdWV0b290aEhjaTo6aW5pdGlhbGl6ZV9pbXBsKAotICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8VjFfMDo6SUJsdWV0b290aEhjaUNhbGxiYWNrcz4mIGNiLAotICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8VjFfMTo6SUJsdWV0b290aEhjaUNhbGxiYWNrcz4mIGNiXzFfMSkgewotICBBTE9HSSgiQmx1ZXRvb3RoSGNpOjppbml0aWFsaXplKCkiKTsKLSAgaWYgKGNiID09IG51bGxwdHIpIHsKLSAgICBBTE9HRSgiY2IgPT0gbnVsbHB0ciEgLT4gVW5hYmxlIHRvIGNhbGwgaW5pdGlhbGl6YXRpb25Db21wbGV0ZShFUlIpIik7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLSAgfQotICBpZiAoaGNpX2hhbmRsZV8gIT0gbnVsbHB0cikgewotICAgIEFMT0dFKCJoY2lfaGFuZGxlICE9IG51bGxwdHIhIC0+IERvdWJsZSBhdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIEhBTCIpOwotICAgIGF1dG8gaGlkbF9zdGF0dXMgPQotICAgICAgICBjYi0+aW5pdGlhbGl6YXRpb25Db21wbGV0ZShWMV8wOjpTdGF0dXM6OklOSVRJQUxJWkFUSU9OX0VSUk9SKTsKLSAgICBpZiAoIWhpZGxfc3RhdHVzLmlzT2soKSkgewotICAgICAgQUxPR0UoIlZlbmRvckludGVyZmFjZSAtPiBVbmFibGUgdG8gY2FsbCBpbml0aWFsaXphdGlvbkNvbXBsZXRlKEVSUikiKTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLSAgfQotCi0gIGRlYXRoX3JlY2lwaWVudF8tPnNldEhhc0RpZWQoZmFsc2UpOwotICBjYi0+bGlua1RvRGVhdGgoZGVhdGhfcmVjaXBpZW50XywgMCk7Ci0gIGludCBoY2lfZmQgPSBvcGVuQnRIY2koKTsKLSAgYXV0byBoaWRsX3N0YXR1cyA9IGNiLT5pbml0aWFsaXphdGlvbkNvbXBsZXRlKAotICAgICAgaGNpX2ZkID4gMCA/IFYxXzA6OlN0YXR1czo6U1VDQ0VTUyA6IFYxXzA6OlN0YXR1czo6SU5JVElBTElaQVRJT05fRVJST1IpOwotICBpZiAoIWhpZGxfc3RhdHVzLmlzT2soKSkgewotICAgICAgQUxPR0UoIlZlbmRvckludGVyZmFjZSAtPiBVbmFibGUgdG8gY2FsbCBpbml0aWFsaXphdGlvbkNvbXBsZXRlKEVSUikiKTsKLSAgfQotICBoY2k6Okg0UHJvdG9jb2wqIGg0X2hjaSA9IG5ldyBoY2k6Okg0UHJvdG9jb2woCi0gICAgICBoY2lfZmQsCi0gICAgICBbY2JdKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBwYWNrZXQpIHsgY2ItPmhjaUV2ZW50UmVjZWl2ZWQocGFja2V0KTsgfSwKLSAgICAgIFtjYl0oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgeyBjYi0+YWNsRGF0YVJlY2VpdmVkKHBhY2tldCk7IH0sCi0gICAgICBbY2JdKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBwYWNrZXQpIHsgY2ItPnNjb0RhdGFSZWNlaXZlZChwYWNrZXQpOyB9LAotICAgICAgW2NiXzFfMV0oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHBhY2tldCkgewotICAgICAgICBjYl8xXzEtPmlzb0RhdGFSZWNlaXZlZChwYWNrZXQpOwotICAgICAgfSk7Ci0KLSAgZmRfd2F0Y2hlcl8uV2F0Y2hGZEZvck5vbkJsb2NraW5nUmVhZHMoCi0gICAgICAgICAgaGNpX2ZkLCBbaDRfaGNpXShpbnQgZmQpIHsgaDRfaGNpLT5PbkRhdGFSZWFkeShmZCk7IH0pOwotICBoY2lfaGFuZGxlXyA9IGg0X2hjaTsKLQotICB1bmxpbmtfY2JfID0gW2NiXShzcDxCbHVldG9vdGhEZWF0aFJlY2lwaWVudD4mIGRlYXRoX3JlY2lwaWVudCkgewotICAgIGlmIChkZWF0aF9yZWNpcGllbnQtPmdldEhhc0RpZWQoKSkKLSAgICAgIEFMT0dJKCJTa2lwcGluZyB1bmxpbmsgY2FsbCwgc2VydmljZSBkaWVkLiIpOwotICAgIGVsc2UKLSAgICAgIGNiLT51bmxpbmtUb0RlYXRoKGRlYXRoX3JlY2lwaWVudCk7Ci0gIH07Ci0KLSAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IEJsdWV0b290aEhjaTo6Y2xvc2UoKSB7Ci0gIEFMT0dJKCJCbHVldG9vdGhIY2k6OmNsb3NlKCkiKTsKLSAgdW5saW5rX2NiXyhkZWF0aF9yZWNpcGllbnRfKTsKLSAgZmRfd2F0Y2hlcl8uU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3JzKCk7Ci0KLSAgaWYgKGhjaV9oYW5kbGVfICE9IG51bGxwdHIpIHsKLSAgICBkZWxldGUgaGNpX2hhbmRsZV87Ci0gICAgaGNpX2hhbmRsZV8gPSBudWxscHRyOwotICB9Ci0gIGNsb3NlQnRIY2koKTsKLSAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IEJsdWV0b290aEhjaTo6c2VuZEhjaUNvbW1hbmQoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGNvbW1hbmQpIHsKLSAgc2VuZERhdGFUb0NvbnRyb2xsZXIoSENJX0RBVEFfVFlQRV9DT01NQU5ELCBjb21tYW5kKTsKLSAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IEJsdWV0b290aEhjaTo6c2VuZEFjbERhdGEoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIHsKLSAgc2VuZERhdGFUb0NvbnRyb2xsZXIoSENJX0RBVEFfVFlQRV9BQ0wsIGRhdGEpOwotICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48dm9pZD4gQmx1ZXRvb3RoSGNpOjpzZW5kU2NvRGF0YShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSkgewotICBzZW5kRGF0YVRvQ29udHJvbGxlcihIQ0lfREFUQV9UWVBFX1NDTywgZGF0YSk7Ci0gIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBCbHVldG9vdGhIY2k6OnNlbmRJc29EYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gIHNlbmREYXRhVG9Db250cm9sbGVyKEhDSV9EQVRBX1RZUEVfSVNPLCBkYXRhKTsKLSAgcmV0dXJuIFZvaWQoKTsKLX0KLQotdm9pZCBCbHVldG9vdGhIY2k6OnNlbmREYXRhVG9Db250cm9sbGVyKGNvbnN0IHVpbnQ4X3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSkgewotICBoY2lfaGFuZGxlXy0+U2VuZCh0eXBlLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotfQotCi1JQmx1ZXRvb3RoSGNpKiBISURMX0ZFVENIX0lCbHVldG9vdGhIY2koY29uc3QgY2hhciogLyogbmFtZSAqLykgewotICByZXR1cm4gbmV3IEJsdWV0b290aEhjaSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYnRsaW51eAotfSAgLy8gbmFtZXNwYWNlIFYxXzEKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9ibHVldG9vdGhfaGNpLmggYi92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvYmx1ZXRvb3RoX2hjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTVjMTBjLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9ibHVldG9vdGhfaGNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaWZuZGVmIEhJRExfR0VORVJBVEVEX2FuZHJvaWRfaGFyZHdhcmVfYmx1ZXRvb3RoX1YxXzFfQmx1ZXRvb3RoSGNpX0hfCi0jZGVmaW5lIEhJRExfR0VORVJBVEVEX2FuZHJvaWRfaGFyZHdhcmVfYmx1ZXRvb3RoX1YxXzFfQmx1ZXRvb3RoSGNpX0hfCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2JsdWV0b290aC8xLjAvSUJsdWV0b290aEhjaS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoLzEuMS9JQmx1ZXRvb3RoSGNpLmg+Ci0KLSNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgotCi0jaW5jbHVkZSAiYXN5bmNfZmRfd2F0Y2hlci5oIgotI2luY2x1ZGUgImg0X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaGNpX2ludGVybmFscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgVjFfMSB7Ci1uYW1lc3BhY2UgYnRsaW51eCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1jbGFzcyBCbHVldG9vdGhEZWF0aFJlY2lwaWVudDsKLQotY2xhc3MgQmx1ZXRvb3RoSGNpIDogcHVibGljIElCbHVldG9vdGhIY2kgewotIHB1YmxpYzoKLSAgQmx1ZXRvb3RoSGNpKCk7Ci0gIFJldHVybjx2b2lkPiBpbml0aWFsaXplKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDxWMV8wOjpJQmx1ZXRvb3RoSGNpQ2FsbGJhY2tzPiYgY2IpIG92ZXJyaWRlOwotICBSZXR1cm48dm9pZD4gaW5pdGlhbGl6ZV8xXzEoCi0gICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPFYxXzE6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYikgb3ZlcnJpZGU7Ci0gIFJldHVybjx2b2lkPiBzZW5kSGNpQ29tbWFuZChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcGFja2V0KSBvdmVycmlkZTsKLSAgUmV0dXJuPHZvaWQ+IHNlbmRBY2xEYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSBvdmVycmlkZTsKLSAgUmV0dXJuPHZvaWQ+IHNlbmRTY29EYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSBvdmVycmlkZTsKLSAgUmV0dXJuPHZvaWQ+IHNlbmRJc29EYXRhKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSBvdmVycmlkZTsKLSAgUmV0dXJuPHZvaWQ+IGNsb3NlKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBSZXR1cm48dm9pZD4gaW5pdGlhbGl6ZV9pbXBsKAotICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDxWMV8wOjpJQmx1ZXRvb3RoSGNpQ2FsbGJhY2tzPiYgY2IsCi0gICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPFYxXzE6OklCbHVldG9vdGhIY2lDYWxsYmFja3M+JiBjYl8xXzEpOwotCi0gIGFzeW5jOjpBc3luY0ZkV2F0Y2hlciBmZF93YXRjaGVyXzsKLSAgaGNpOjpINFByb3RvY29sKiBoY2lfaGFuZGxlXzsKLSAgaW50IGJ0X3NvY19mZF87Ci0gIGNoYXIgKnJma2lsbF9zdGF0ZV87Ci0KLSAgY29uc3QgdWludDhfdCBIQ0lfREFUQV9UWVBFX0NPTU1BTkQgPSAxOwotICBjb25zdCB1aW50OF90IEhDSV9EQVRBX1RZUEVfQUNMID0gMjsKLSAgY29uc3QgdWludDhfdCBIQ0lfREFUQV9UWVBFX1NDTyA9IDM7Ci0gIGNvbnN0IHVpbnQ4X3QgSENJX0RBVEFfVFlQRV9JU08gPSA1OwotCi0gIGludCB3YWl0SGNpRGV2KGludCBoY2lfaW50ZXJmYWNlKTsKLSAgaW50IGZpbmRSZktpbGwodm9pZCk7Ci0gIGludCByZktpbGwoaW50IGJsb2NrKTsKLSAgaW50IG9wZW5CdEhjaSh2b2lkKTsKLSAgdm9pZCBjbG9zZUJ0SGNpKHZvaWQpOwotCi0gIHZvaWQgc2VuZERhdGFUb0NvbnRyb2xsZXIoY29uc3QgdWludDhfdCB0eXBlLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7Ci0gIDo6YW5kcm9pZDo6c3A8Qmx1ZXRvb3RoRGVhdGhSZWNpcGllbnQ+IGRlYXRoX3JlY2lwaWVudF87Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzcDxCbHVldG9vdGhEZWF0aFJlY2lwaWVudD4mKT4gdW5saW5rX2NiXzsKLX07Ci0KLWV4dGVybiAiQyIgSUJsdWV0b290aEhjaSogSElETF9GRVRDSF9JQmx1ZXRvb3RoSGNpKGNvbnN0IGNoYXIqIG5hbWUpOwotCi19ICAvLyBuYW1lc3BhY2UgYnRsaW51eAotfSAgLy8gbmFtZXNwYWNlIFYxXzEKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLX0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBISURMX0dFTkVSQVRFRF9hbmRyb2lkX2hhcmR3YXJlX2JsdWV0b290aF9WMV8xX0JsdWV0b290aEhjaV9IXwpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2g0X3Byb3RvY29sLmNjIGIvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2g0X3Byb3RvY29sLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc5MmI5Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9oNF9wcm90b2NvbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiaDRfcHJvdG9jb2wuaCIKLQotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC1oY2ktaDQiCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXNpemVfdCBINFByb3RvY29sOjpTZW5kKHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIC8qIEZvciBIQ0kgY29tbXVuaWNhdGlvbiBvdmVyIFVTQiBkb25nbGUsIG11bHRpcGxlIHdyaXRlIHJlc3VsdHMgaW4KLSAgICAgKiByZXNwb25zZSB0aW1lb3V0IGFzIGRyaXZlciBleHBlY3QgdHlwZSArIGRhdGEgYXQgb25jZSB0byBwcm9jZXNzCi0gICAgICogdGhlIGNvbW1hbmQsIHNvIHVzaW5nICJ3cml0ZXYiKGZvciBhdG9taWNpdHkpIGhlcmUuCi0gICAgICovCi0gICAgc3RydWN0IGlvdmVjIGlvdlsyXTsKLSAgICBzc2l6ZV90IHJldCA9IDA7Ci0gICAgaW92WzBdLmlvdl9iYXNlID0gJnR5cGU7Ci0gICAgaW92WzBdLmlvdl9sZW4gPSBzaXplb2YodHlwZSk7Ci0gICAgaW92WzFdLmlvdl9iYXNlID0gKHZvaWQgKilkYXRhOwotICAgIGlvdlsxXS5pb3ZfbGVuID0gbGVuZ3RoOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZXYodWFydF9mZF8sIGlvdiwgMikpOwotICAgICAgICBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIGVycm9yIHdyaXRpbmcgdG8gVUFSVCAoJXMpIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgd3JpdHRlbiA6KAotICAgICAgICAgICAgQUxPR0UoIiVzIHplcm8gYnl0ZXMgd3JpdHRlbiAtIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uIiwgX19mdW5jX18pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgSDRQcm90b2NvbDo6T25QYWNrZXRSZWFkeSgpIHsKLSAgc3dpdGNoIChoY2lfcGFja2V0X3R5cGVfKSB7Ci0gICAgY2FzZSBIQ0lfUEFDS0VUX1RZUEVfRVZFTlQ6Ci0gICAgICBldmVudF9jYl8oaGNpX3BhY2tldGl6ZXJfLkdldFBhY2tldCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSENJX1BBQ0tFVF9UWVBFX0FDTF9EQVRBOgotICAgICAgYWNsX2NiXyhoY2lfcGFja2V0aXplcl8uR2V0UGFja2V0KCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfUEFDS0VUX1RZUEVfU0NPX0RBVEE6Ci0gICAgICBzY29fY2JfKGhjaV9wYWNrZXRpemVyXy5HZXRQYWNrZXQoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9QQUNLRVRfVFlQRV9JU09fREFUQToKLSAgICAgIGlzb19jYl8oaGNpX3BhY2tldGl6ZXJfLkdldFBhY2tldCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IHsKLSAgICAgIGJvb2wgYmFkX3BhY2tldF90eXBlID0gdHJ1ZTsKLSAgICAgIENIRUNLKCFiYWRfcGFja2V0X3R5cGUpOwotICAgIH0KLSAgfQotICAvLyBHZXQgcmVhZHkgZm9yIHRoZSBuZXh0IHR5cGUgYnl0ZS4KLSAgaGNpX3BhY2tldF90eXBlXyA9IEhDSV9QQUNLRVRfVFlQRV9VTktOT1dOOwotfQotCi12b2lkIEg0UHJvdG9jb2w6Ok9uRGF0YVJlYWR5KGludCBmZCkgewotICAgIGlmIChoY2lfcGFja2V0X3R5cGVfID09IEhDSV9QQUNLRVRfVFlQRV9VTktOT1dOKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiByZWFkIGZ1bGwgYnVmZmVyLiBBQ0wgbWF4IGxlbmd0aCBpcyAyIGJ5dGVzLCBhbmQgU0NPIG1heCBsZW5ndGggaXMgMgotICAgICAgICAgKiBieXRlLiBzbyB0YWtpbmcgNjRLIGFzIGJ1ZmZlciBsZW5ndGguCi0gICAgICAgICAqIFF1ZXN0aW9uIDogV2h5IHRvIHJlYWQgaW4gc2luZ2xlIGNodW5rIHJhdGhlciB0aGFuIG11bHRpcGxlIHJlYWRzLAotICAgICAgICAgKiB3aGljaCBjYW4gZ2l2ZSBwYXJhbWV0ZXIgbGVuZ3RoIGFycml2aW5nIGluIHJlc3BvbnNlID8KLSAgICAgICAgICogQW5zd2VyOiBUaGUgbXVsdGlwbGUgcmVhZHMgZG9lcyBub3Qgd29yayB3aXRoIEJUIFVTQiBkb25nbGUuIEF0IGxlYXN0Ci0gICAgICAgICAqIHdpdGggQmx1ZXRvb3RoIDIuMCBzdXBwb3J0ZWQgVVNCIGRvbmdsZS4gQWZ0ZXIgZmlyc3QgcmVhZCwgZWl0aGVyCi0gICAgICAgICAqIGZpcm13YXJlL2tlcm5lbCAoZG8gbm90IGtub3cgd2hvIGlzIHJlc3BvbnNpYmxlIC0gaW5wdXRzID8/KSBkcml2ZXIKLSAgICAgICAgICogZGlzY2FyZCB0aGUgd2hvbGUgbWVzc2FnZSBhbmQgc3VjY2Vzc2l2ZSByZWFkIHJlc3VsdHMgaW4gZm9yZXZlcgotICAgICAgICAgKiBibG9ja2luZyBsb29wLiAtIElzIHRoZXJlIGFueSBvdGhlciB3YXkgdG8gbWFrZSBpdCB3b3JrIHdpdGggbXVsdGlwbGUKLSAgICAgICAgICogcmVhZHMsIGRvIG5vdCBrbm93IHlldCAoaXQgY2FuIGVsaW1pbmF0ZSBuZWVkIG9mIHRoaXMgZnVuY3Rpb24pID8KLSAgICAgICAgICogUmVhZGluZyBpbiBzaW5nbGUgc2hvdCBnaXZlcyBleHBlY3RlZCByZXNwb25zZS4KLSAgICAgICAgICovCi0gICAgICAgIGNvbnN0IHNpemVfdCBtYXhfcGxlbiA9IDY0KjEwMjQ7Ci0gICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHRwa3Q7Ci0gICAgICAgIHRwa3QucmVzaXplKG1heF9wbGVuKTsKLSAgICAgICAgc3NpemVfdCBieXRlc19yZWFkID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQsIHRwa3QuZGF0YSgpLCBtYXhfcGxlbikpOwotICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HSSgiTm8gYnl0ZXMgcmVhZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlc19yZWFkIDwgMCkgewotICAgICAgICAgICAgQUxPR1coImVycm9yIHJlYWRpbmcgZnJvbSBVQVJUICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGhjaV9wYWNrZXRfdHlwZV8gPSBzdGF0aWNfY2FzdDxIY2lQYWNrZXRUeXBlPih0cGt0LmRhdGEoKVswXSk7Ci0gICAgICAgIGhjaV9wYWNrZXRpemVyXy5DYkhjaVBhY2tldCh0cGt0LmRhdGEoKSsxLCBieXRlc19yZWFkLTEpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2g0X3Byb3RvY29sLmggYi92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvaDRfcHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNjY5OC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvaDRfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotCi0jaW5jbHVkZSAiYXN5bmNfZmRfd2F0Y2hlci5oIgotI2luY2x1ZGUgImhjaV9pbnRlcm5hbHMuaCIKLSNpbmNsdWRlICJoY2lfcGFja2V0aXplci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2UgaGNpIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBQYWNrZXRSZWFkQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mKT47Ci0KLWNsYXNzIEg0UHJvdG9jb2wgewotIHB1YmxpYzoKLSAgSDRQcm90b2NvbChpbnQgZmQsIFBhY2tldFJlYWRDYWxsYmFjayBldmVudF9jYiwgUGFja2V0UmVhZENhbGxiYWNrIGFjbF9jYiwKLSAgICAgICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2sgc2NvX2NiLCBQYWNrZXRSZWFkQ2FsbGJhY2sgaXNvX2NiKQotICAgICAgOiB1YXJ0X2ZkXyhmZCksCi0gICAgICAgIGV2ZW50X2NiXyhldmVudF9jYiksCi0gICAgICAgIGFjbF9jYl8oYWNsX2NiKSwKLSAgICAgICAgc2NvX2NiXyhzY29fY2IpLAotICAgICAgICBpc29fY2JfKGlzb19jYiksCi0gICAgICAgIGhjaV9wYWNrZXRpemVyXyhbdGhpc10oKSB7IE9uUGFja2V0UmVhZHkoKTsgfSkge30KLQotICBzaXplX3QgU2VuZCh1aW50OF90IHR5cGUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpOwotCi0gIHZvaWQgT25QYWNrZXRSZWFkeSgpOwotCi0gIHZvaWQgT25EYXRhUmVhZHkoaW50IGZkKTsKLQotIHByaXZhdGU6Ci0gIGludCB1YXJ0X2ZkXzsKLQotICBQYWNrZXRSZWFkQ2FsbGJhY2sgZXZlbnRfY2JfOwotICBQYWNrZXRSZWFkQ2FsbGJhY2sgYWNsX2NiXzsKLSAgUGFja2V0UmVhZENhbGxiYWNrIHNjb19jYl87Ci0gIFBhY2tldFJlYWRDYWxsYmFjayBpc29fY2JfOwotCi0gIEhjaVBhY2tldFR5cGUgaGNpX3BhY2tldF90eXBlX3tIQ0lfUEFDS0VUX1RZUEVfVU5LTk9XTn07Ci0gIEhjaVBhY2tldGl6ZXIgaGNpX3BhY2tldGl6ZXJfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2hjaV9pbnRlcm5hbHMuaCBiL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9oY2lfaW50ZXJuYWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTk0NGYuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2hjaV9pbnRlcm5hbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8vIEhDSSBVQVJUIHRyYW5zcG9ydCBwYWNrZXQgdHlwZXMgKFZvbHVtZSA0LCBQYXJ0IEEsIDIpCi1lbnVtIEhjaVBhY2tldFR5cGUgewotICBIQ0lfUEFDS0VUX1RZUEVfVU5LTk9XTiA9IDAsCi0gIEhDSV9QQUNLRVRfVFlQRV9DT01NQU5EID0gMSwKLSAgSENJX1BBQ0tFVF9UWVBFX0FDTF9EQVRBID0gMiwKLSAgSENJX1BBQ0tFVF9UWVBFX1NDT19EQVRBID0gMywKLSAgSENJX1BBQ0tFVF9UWVBFX0VWRU5UID0gNCwKLSAgSENJX1BBQ0tFVF9UWVBFX0lTT19EQVRBID0gNSwKLX07Ci0KLS8vIDIgYnl0ZXMgZm9yIG9wY29kZSwgMSBieXRlIGZvciBwYXJhbWV0ZXIgbGVuZ3RoIChWb2x1bWUgMiwgUGFydCBFLCA1LjQuMSkKLWNvbnN0IHNpemVfdCBIQ0lfQ09NTUFORF9QUkVBTUJMRV9TSVpFID0gMzsKLWNvbnN0IHNpemVfdCBIQ0lfTEVOR1RIX09GRlNFVF9DTUQgPSAyOwotCi0vLyAyIGJ5dGVzIGZvciBoYW5kbGUsIDIgYnl0ZXMgZm9yIGRhdGEgbGVuZ3RoIChWb2x1bWUgMiwgUGFydCBFLCA1LjQuMikKLWNvbnN0IHNpemVfdCBIQ0lfQUNMX1BSRUFNQkxFX1NJWkUgPSA0OwotY29uc3Qgc2l6ZV90IEhDSV9MRU5HVEhfT0ZGU0VUX0FDTCA9IDI7Ci0KLS8vIDIgYnl0ZXMgZm9yIGhhbmRsZSwgMSBieXRlIGZvciBkYXRhIGxlbmd0aCAoVm9sdW1lIDIsIFBhcnQgRSwgNS40LjMpCi1jb25zdCBzaXplX3QgSENJX1NDT19QUkVBTUJMRV9TSVpFID0gMzsKLWNvbnN0IHNpemVfdCBIQ0lfTEVOR1RIX09GRlNFVF9TQ08gPSAyOwotCi0vLyAxIGJ5dGUgZm9yIGV2ZW50IGNvZGUsIDEgYnl0ZSBmb3IgcGFyYW1ldGVyIGxlbmd0aCAoVm9sdW1lIDIsIFBhcnQgRSwgNS40LjQpCi1jb25zdCBzaXplX3QgSENJX0VWRU5UX1BSRUFNQkxFX1NJWkUgPSAyOwotY29uc3Qgc2l6ZV90IEhDSV9MRU5HVEhfT0ZGU0VUX0VWVCA9IDE7Ci0KLWNvbnN0IHNpemVfdCBIQ0lfUFJFQU1CTEVfU0laRV9NQVggPSBIQ0lfQUNMX1BSRUFNQkxFX1NJWkU7Ci0KLS8vIEV2ZW50IGNvZGVzIChWb2x1bWUgMiwgUGFydCBFLCA3LjcuMTQpCi1jb25zdCB1aW50OF90IEhDSV9DT01NQU5EX0NPTVBMRVRFX0VWRU5UID0gMHgwRTsKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9oY2lfcGFja2V0aXplci5jYyBiL3ZlbmRvcl9saWJzL2xpbnV4L2ludGVyZmFjZS9oY2lfcGFja2V0aXplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwYTk3OS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvaGNpX3BhY2tldGl6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAiaGNpX3BhY2tldGl6ZXIuaCIKLQotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aC5oY2lfcGFja2V0aXplciIKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBzaXplX3QgcHJlYW1ibGVfc2l6ZV9mb3JfdHlwZVtdID0gewotICAgIDAsIEhDSV9DT01NQU5EX1BSRUFNQkxFX1NJWkUsIEhDSV9BQ0xfUFJFQU1CTEVfU0laRSwgSENJX1NDT19QUkVBTUJMRV9TSVpFLAotICAgIEhDSV9FVkVOVF9QUkVBTUJMRV9TSVpFfTsKLWNvbnN0IHNpemVfdCBwYWNrZXRfbGVuZ3RoX29mZnNldF9mb3JfdHlwZVtdID0gewotICAgIDAsIEhDSV9MRU5HVEhfT0ZGU0VUX0NNRCwgSENJX0xFTkdUSF9PRkZTRVRfQUNMLCBIQ0lfTEVOR1RIX09GRlNFVF9TQ08sCi0gICAgSENJX0xFTkdUSF9PRkZTRVRfRVZUfTsKLQotc2l6ZV90IEhjaUdldFBhY2tldExlbmd0aEZvclR5cGUoSGNpUGFja2V0VHlwZSB0eXBlLCBjb25zdCB1aW50OF90KiBwcmVhbWJsZSkgewotICBzaXplX3Qgb2Zmc2V0ID0gcGFja2V0X2xlbmd0aF9vZmZzZXRfZm9yX3R5cGVbdHlwZV07Ci0gIGlmICh0eXBlICE9IEhDSV9QQUNLRVRfVFlQRV9BQ0xfREFUQSkgcmV0dXJuIHByZWFtYmxlW29mZnNldF07Ci0gIHJldHVybiAoKChwcmVhbWJsZVtvZmZzZXQgKyAxXSkgPDwgOCkgfCBwcmVhbWJsZVtvZmZzZXRdKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBoYXJkd2FyZSB7Ci1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLW5hbWVzcGFjZSBoY2kgewotCi1jb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgSGNpUGFja2V0aXplcjo6R2V0UGFja2V0KCkgY29uc3QgeyByZXR1cm4gcGFja2V0XzsgfQotCi12b2lkIEhjaVBhY2tldGl6ZXI6OkNiSGNpUGFja2V0KHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pIHsKLSAgICBwYWNrZXRfLnNldFRvRXh0ZXJuYWwoZGF0YSwgbGVuKTsKLSAgICBwYWNrZXRfcmVhZHlfY2JfKCk7Ci19Ci0KLXZvaWQgSGNpUGFja2V0aXplcjo6T25EYXRhUmVhZHkoaW50IGZkLCBIY2lQYWNrZXRUeXBlIHBhY2tldF90eXBlKSB7Ci0gIHN3aXRjaCAoc3RhdGVfKSB7Ci0gICAgY2FzZSBIQ0lfUFJFQU1CTEU6IHsKLSAgICAgIHNpemVfdCBieXRlc19yZWFkID0gVEVNUF9GQUlMVVJFX1JFVFJZKAotICAgICAgICAgIHJlYWQoZmQsIHByZWFtYmxlXyArIGJ5dGVzX3JlYWRfLAotICAgICAgICAgICAgICAgcHJlYW1ibGVfc2l6ZV9mb3JfdHlwZVtwYWNrZXRfdHlwZV0gLSBieXRlc19yZWFkXykpOwotICAgICAgQ0hFQ0soYnl0ZXNfcmVhZCA+IDApOwotICAgICAgYnl0ZXNfcmVhZF8gKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmIChieXRlc19yZWFkXyA9PSBwcmVhbWJsZV9zaXplX2Zvcl90eXBlW3BhY2tldF90eXBlXSkgewotICAgICAgICBzaXplX3QgcGFja2V0X2xlbmd0aCA9Ci0gICAgICAgICAgICBIY2lHZXRQYWNrZXRMZW5ndGhGb3JUeXBlKHBhY2tldF90eXBlLCBwcmVhbWJsZV8pOwotICAgICAgICBwYWNrZXRfLnJlc2l6ZShwcmVhbWJsZV9zaXplX2Zvcl90eXBlW3BhY2tldF90eXBlXSArIHBhY2tldF9sZW5ndGgpOwotICAgICAgICBtZW1jcHkocGFja2V0Xy5kYXRhKCksIHByZWFtYmxlXywgcHJlYW1ibGVfc2l6ZV9mb3JfdHlwZVtwYWNrZXRfdHlwZV0pOwotICAgICAgICBieXRlc19yZW1haW5pbmdfID0gcGFja2V0X2xlbmd0aDsKLSAgICAgICAgc3RhdGVfID0gSENJX1BBWUxPQUQ7Ci0gICAgICAgIGJ5dGVzX3JlYWRfID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgSENJX1BBWUxPQUQ6IHsKLSAgICAgIHNpemVfdCBieXRlc19yZWFkID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoCi0gICAgICAgICAgZmQsCi0gICAgICAgICAgcGFja2V0Xy5kYXRhKCkgKyBwcmVhbWJsZV9zaXplX2Zvcl90eXBlW3BhY2tldF90eXBlXSArIGJ5dGVzX3JlYWRfLAotICAgICAgICAgIGJ5dGVzX3JlbWFpbmluZ18pKTsKLSAgICAgIENIRUNLKGJ5dGVzX3JlYWQgPiAwKTsKLSAgICAgIGJ5dGVzX3JlbWFpbmluZ18gLT0gYnl0ZXNfcmVhZDsKLSAgICAgIGJ5dGVzX3JlYWRfICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAoYnl0ZXNfcmVtYWluaW5nXyA9PSAwKSB7Ci0gICAgICAgIHBhY2tldF9yZWFkeV9jYl8oKTsKLSAgICAgICAgc3RhdGVfID0gSENJX1BSRUFNQkxFOwotICAgICAgICBieXRlc19yZWFkXyA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL2hjaV9wYWNrZXRpemVyLmggYi92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvaGNpX3BhY2tldGl6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkZTcwZi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2UvaGNpX3BhY2tldGl6ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLQotI2luY2x1ZGUgImhjaV9pbnRlcm5hbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIGhjaSB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgSGNpUGFja2V0UmVhZHlDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT47Ci0KLWNsYXNzIEhjaVBhY2tldGl6ZXIgewotIHB1YmxpYzoKLSAgSGNpUGFja2V0aXplcihIY2lQYWNrZXRSZWFkeUNhbGxiYWNrIHBhY2tldF9jYikKLSAgICAgIDogcGFja2V0X3JlYWR5X2NiXyhwYWNrZXRfY2Ipe307Ci0gIHZvaWQgT25EYXRhUmVhZHkoaW50IGZkLCBIY2lQYWNrZXRUeXBlIHBhY2tldF90eXBlKTsKLSAgdm9pZCBDYkhjaVBhY2tldCh1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIEdldFBhY2tldCgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBlbnVtIFN0YXRlIHsgSENJX1BSRUFNQkxFLCBIQ0lfUEFZTE9BRCB9OwotICBTdGF0ZSBzdGF0ZV97SENJX1BSRUFNQkxFfTsKLSAgdWludDhfdCBwcmVhbWJsZV9bSENJX1BSRUFNQkxFX1NJWkVfTUFYXTsKLSAgaGlkbF92ZWM8dWludDhfdD4gcGFja2V0XzsKLSAgc2l6ZV90IGJ5dGVzX3JlbWFpbmluZ197MH07Ci0gIHNpemVfdCBieXRlc19yZWFkX3swfTsKLSAgSGNpUGFja2V0UmVhZHlDYWxsYmFjayBwYWNrZXRfcmVhZHlfY2JfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGhjaQotfSAgLy8gbmFtZXNwYWNlIGJsdWV0b290aAotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvbGludXgvaW50ZXJmYWNlL3NlcnZpY2UuY2MgYi92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2Uvc2VydmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmZDVlNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy9saW51eC9pbnRlcmZhY2Uvc2VydmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGhAMS4xLXNlcnZpY2UuYnRsaW51eCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYmx1ZXRvb3RoLzEuMS9JQmx1ZXRvb3RoSGNpLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImJsdWV0b290aF9oY2kuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpzcDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6VjFfMTo6SUJsdWV0b290aEhjaTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJsdWV0b290aDo6VjFfMTo6YnRsaW51eDo6Qmx1ZXRvb3RoSGNpOwotCi1pbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKLSAgc3A8SUJsdWV0b290aEhjaT4gYmx1ZXRvb3RoID0gbmV3IEJsdWV0b290aEhjaTsKLSAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCB0cnVlKTsKLSAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gYmx1ZXRvb3RoLT5yZWdpc3RlckFzU2VydmljZSgpOwotICBpZiAoc3RhdHVzID09IGFuZHJvaWQ6Ok9LKQotICAgIGpvaW5ScGNUaHJlYWRwb29sKCk7Ci0gIGVsc2UKLSAgICBBTE9HRSgiQ291bGQgbm90IHJlZ2lzdGVyIGFzIGEgc2VydmljZSEiKTsKLX0KZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9BbmRyb2lkLmJwIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTIyYzQuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLy8gc2ltdWxhdGlvbiBsaWJyYXJ5IGZvciB0ZXN0aW5nIHZpcnR1YWwgZGV2aWNlcwotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAotICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gInN5c3RlbV9idF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2J0X2xpY2Vuc2UiXSwKLX0KLQotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJidC1yb290Y2FuYWwiLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJnZF9kZWZhdWx0cyIsCi0gICAgICAgICJnZF9jbGFuZ190aWR5IiwKLSAgICAgICAgImdkX2NsYW5nX3RpZHlfaWdub3JlX2FuZHJvaWQiLAotICAgIF0sCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgcHJvcHJpZXRhcnk6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAibW9kZWwvY29udHJvbGxlci9hY2xfY29ubmVjdGlvbi5jYyIsCi0gICAgICAgICJtb2RlbC9jb250cm9sbGVyL2FjbF9jb25uZWN0aW9uX2hhbmRsZXIuY2MiLAotICAgICAgICAibW9kZWwvY29udHJvbGxlci9kdWFsX21vZGVfY29udHJvbGxlci5jYyIsCi0gICAgICAgICJtb2RlbC9jb250cm9sbGVyL2lzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlci5jYyIsCi0gICAgICAgICJtb2RlbC9jb250cm9sbGVyL2xlX2FkdmVydGlzZXIuY2MiLAotICAgICAgICAibW9kZWwvY29udHJvbGxlci9saW5rX2xheWVyX2NvbnRyb2xsZXIuY2MiLAotICAgICAgICAibW9kZWwvY29udHJvbGxlci9zZWN1cml0eV9tYW5hZ2VyLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvYmVhY29uLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvYmVhY29uX3N3YXJtLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvYnJva2VuX2Fkdi5jYyIsCi0gICAgICAgICJtb2RlbC9kZXZpY2VzL2Nhcl9raXQuY2MiLAotICAgICAgICAibW9kZWwvZGV2aWNlcy9jbGFzc2ljLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvZGV2aWNlLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvZGV2aWNlX3Byb3BlcnRpZXMuY2MiLAotICAgICAgICAibW9kZWwvZGV2aWNlcy9oNF9kYXRhX2NoYW5uZWxfcGFja2V0aXplci5jYyIsCi0gICAgICAgICJtb2RlbC9kZXZpY2VzL2g0X3BhY2tldGl6ZXIuY2MiLAotICAgICAgICAibW9kZWwvZGV2aWNlcy9oNF9wYXJzZXIuY2MiLAotICAgICAgICAibW9kZWwvZGV2aWNlcy9oY2lfcHJvdG9jb2wuY2MiLAotICAgICAgICAibW9kZWwvZGV2aWNlcy9oY2lfc29ja2V0X2RldmljZS5jYyIsCi0gICAgICAgICJtb2RlbC9kZXZpY2VzL2tleWJvYXJkLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvbGlua19sYXllcl9zb2NrZXRfZGV2aWNlLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvbG9vcGJhY2suY2MiLAotICAgICAgICAibW9kZWwvZGV2aWNlcy9yZW1vdGVfbG9vcGJhY2tfZGV2aWNlLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvc2NyaXB0ZWRfYmVhY29uLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvc25pZmZlci5jYyIsCi0gICAgICAgICJtb2RlbC9zZXR1cC9hc3luY19tYW5hZ2VyLmNjIiwKLSAgICAgICAgIm1vZGVsL3NldHVwL2RldmljZV9ib3V0aXF1ZS5jYyIsCi0gICAgICAgICJtb2RlbC9zZXR1cC9waHlfbGF5ZXJfZmFjdG9yeS5jYyIsCi0gICAgICAgICJtb2RlbC9zZXR1cC90ZXN0X2NoYW5uZWxfdHJhbnNwb3J0LmNjIiwKLSAgICAgICAgIm1vZGVsL3NldHVwL3Rlc3RfY29tbWFuZF9oYW5kbGVyLmNjIiwKLSAgICAgICAgIm1vZGVsL3NldHVwL3Rlc3RfbW9kZWwuY2MiLAotICAgICAgICAibmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldC5jYyIsCi0gICAgICAgICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X2Nvbm5lY3Rvci5jYyIsCi0gICAgICAgICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X3NlcnZlci5jYyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoUGFja2V0U291cmNlcyIsCi0gICAgICAgICI6Qmx1ZXRvb3RoSGNpQ2xhc3NTb3VyY2VzIiwKLSAgICAgICAgIjpCbHVldG9vdGhDcnlwdG9Ub29sYm94U291cmNlcyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXh0cmEiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKLSAgICBdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICAgICAgIi4iLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIlJvb3RDYW5hbEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgICAgICAibGliYnRfaW5pdF9mbGFnc19icmlkZ2VfaGVhZGVyIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJqc29uY3BwIiwKLSAgICAgICAgImxpYmJ0LXJvb3RjYW5hbC10eXBlcyIsCi0gICAgICAgICJsaWJzY3JpcHRlZGJlYWNvbnBheWxvYWQtcHJvdG9zLWxpdGUiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic2NyaXB0ZWRiZWFjb25wYXlsb2FkLXByb3Rvcy1saXRlIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBwcm9wcmlldGFyeTogdHJ1ZSwKLSAgICBwcm90bzogewotICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKLSAgICAgICAgdHlwZTogImxpdGUiLAotICAgIH0sCi0gICAgc3JjczogWyJtb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbl9ibGVfcGF5bG9hZC5wcm90byJdLAotfQotCi0vLyB0ZXN0LXZlbmRvciB1bml0IHRlc3RzIGZvciBob3N0Ci1jY190ZXN0X2hvc3QgewotICAgIG5hbWU6ICJ0ZXN0LXZlbmRvcl90ZXN0X2hvc3QiLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJjbGFuZ19maWxlX2NvdmVyYWdlIiwKLSAgICAgICAgImNsYW5nX2NvdmVyYWdlX2JpbiIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2FzeW5jX21hbmFnZXJfdW5pdHRlc3QuY2MiLAotICAgICAgICAidGVzdC9oNF9wYXJzZXJfdW5pdHRlc3QuY2MiLAotICAgICAgICAidGVzdC9wb3NpeF9zb2NrZXRfdW5pdHRlc3QuY2MiLAotICAgICAgICAidGVzdC9zZWN1cml0eV9tYW5hZ2VyX3VuaXR0ZXN0LmNjIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJibHVldG9vdGhfaGVhZGVycyIsCi0gICAgXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzeXN0ZW0vYnQiLAotICAgICAgICAic3lzdGVtL2J0L2dkIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmJ0LXJvb3RjYW5hbC10eXBlcyIsCi0gICAgICAgICJsaWJidC1yb290Y2FuYWwiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItRExPR19OREVCVUc9MSIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCi0vLyBMaW51eCBSb290Q2FuYWwgRXhlY3V0YWJsZQotY2NfYmluYXJ5X2hvc3QgewotICAgIG5hbWU6ICJyb290LWNhbmFsIiwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZ2RfY2xhbmdfdGlkeSIsCi0gICAgXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJkZXNrdG9wL3Jvb3RfY2FuYWxfbWFpbi5jYyIsCi0gICAgICAgICJkZXNrdG9wL3Rlc3RfZW52aXJvbm1lbnQuY2MiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmJsdWV0b290aF9oZWFkZXJzIiwKLSAgICBdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInN5c3RlbS9idCIsCi0gICAgICAgICJzeXN0ZW0vYnQvZ2QiLAotICAgIF0sCi0gICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKLSAgICAgICAgIlJvb3RDYW5hbEdlbmVyYXRlZFBhY2tldHNfaCIsCi0gICAgICAgICJCbHVldG9vdGhHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJiYWNrdHJhY2UiLAotICAgIF0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmpzb25jcHAiLAotICAgICAgICAibGliYnQtcm9vdGNhbmFsLXR5cGVzIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYnNjcmlwdGVkYmVhY29ucGF5bG9hZC1wcm90b3MtbGl0ZSIsCi0gICAgICAgICJsaWJidC1yb290Y2FuYWwiLAotICAgICAgICAiYnJlYWtwYWRfY2xpZW50IiwKLSAgICAgICAgImxpYmdmbGFncyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXh0cmEiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBhZGRyZXNzOiB0cnVlLAotICAgICAgICBhbGxfdW5kZWZpbmVkOiB0cnVlLAotICAgIH0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIC8vIFRPRE8oYi8xODEyOTAxNzgpIHJlbW92ZSBpdCB3aGVuIHNhbml0aXplIG9wdGlvbiBpcyBzdXBwb3J0ZWQgYnkgbGludXhfYmlvbmljIGFzIHdlbGwKLSAgICAgICAgbGludXhfYmlvbmljOiB7Ci0gICAgICAgICAgICBzYW5pdGl6ZTogewotICAgICAgICAgICAgICAgIGFkZHJlc3M6IGZhbHNlLAotICAgICAgICAgICAgICAgIGNmaTogZmFsc2UsCi0gICAgICAgICAgICAgICAgYWxsX3VuZGVmaW5lZDogZmFsc2UsCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KLWdlbnJ1bGUgewotICAgIG5hbWU6ICJSb290Q2FuYWxHZW5lcmF0ZWRQYWNrZXRzX2giLAotICAgIHRvb2xzOiBbCi0gICAgICAgICJibHVldG9vdGhfcGFja2V0Z2VuIiwKLSAgICBdLAotICAgIGNtZDogIiQobG9jYXRpb24gYmx1ZXRvb3RoX3BhY2tldGdlbikgLS1yb290X25hbWVzcGFjZT1tb2RlbCAtLWluY2x1ZGU9c3lzdGVtL2J0L3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYiAtLW91dD0kKGdlbkRpcikgJChpbikiLAotICAgIHNyY3M6IFsKLSAgICAgICAgInBhY2tldHMvbGlua19sYXllcl9wYWNrZXRzLnBkbCIsCi0gICAgXSwKLSAgICBvdXQ6IFsKLSAgICAgICAgInBhY2tldHMvbGlua19sYXllcl9wYWNrZXRzLmgiLAotICAgIF0sCi19Ci0KLS8vIGJ0X3ZoY2lfZm9yd2FyZGVyIGluIGN1dHRsZWZpc2ggZGVwZW5kcyBvbiB0aGlzIEg0UGFja2V0aXplciBpbXBsZW1lbnRhdGlvbi4KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAiaDRfcGFja2V0aXplcl9saWIiLAotICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBkZWZhdWx0czogWwotICAgICAgICAiZ2RfZGVmYXVsdHMiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAibW9kZWwvZGV2aWNlcy9oNF9wYWNrZXRpemVyLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvaDRfcGFyc2VyLmNjIiwKLSAgICAgICAgIm1vZGVsL2RldmljZXMvaGNpX3Byb3RvY29sLmNjIiwKLSAgICBdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgICAgICAiLiIsCi0gICAgXSwKLSAgICBnZW5lcmF0ZWRfaGVhZGVyczogWwotICAgICAgICAibGliYnRfaW5pdF9mbGFnc19icmlkZ2VfaGVhZGVyIiwKLSAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL2J0IiwKLSAgICAgICAgInN5c3RlbS9idC9nZCIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kYXRhL0FuZHJvaWQuYnAgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvZGF0YS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTYzNGFmLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kYXRhL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2J0X2xpY2Vuc2UiCi0gICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgotICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJzeXN0ZW1fYnRfbGljZW5zZSJdLAotfQotCi1wcmVidWlsdF9ldGNfaG9zdCB7Ci0gICAgbmFtZTogImNvbnRyb2xsZXJfcHJvcGVydGllcy5qc29uIiwKLSAgICBzcmM6ICJjb250cm9sbGVyX3Byb3BlcnRpZXMuanNvbiIsCi0gICAgc3ViX2RpcjogInJvb3RjYW5hbC9kYXRhIiwKLX0KLQotcHJlYnVpbHRfZXRjIHsKLSAgICBuYW1lOiAiYnRfY29udHJvbGxlcl9wcm9wZXJ0aWVzIiwKLSAgICBzcmM6ICJjb250cm9sbGVyX3Byb3BlcnRpZXMuanNvbiIsCi0gICAgdmVuZG9yOiB0cnVlLAotICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLAotICAgIHN1Yl9kaXI6ICJibHVldG9vdGgiLAotfQpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL2RhdGEvY29udHJvbGxlcl9wcm9wZXJ0aWVzLmpzb24gYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvZGF0YS9jb250cm9sbGVyX3Byb3BlcnRpZXMuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0ZWZkMy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvZGF0YS9jb250cm9sbGVyX3Byb3BlcnRpZXMuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXsKLSAgIkFjbERhdGFQYWNrZXRTaXplIjogIjEwMjQiLAotICAiRW5jcnlwdGlvbktleVNpemUiOiAiMTAiLAotICAiU2NvRGF0YVBhY2tldFNpemUiOiAiMjU1IiwKLSAgIk51bUFjbERhdGFQYWNrZXRzIjogIjEwIiwKLSAgIk51bVNjb0RhdGFQYWNrZXRzIjogIjEwIiwKLSAgIlZlcnNpb24iOiAiNCIsCi0gICJSZXZpc2lvbiI6ICIwIiwKLSAgIkxtcFBhbFZlcnNpb24iOiAiMCIsCi0gICJNYW51ZmFjdHVyZXJOYW1lIjogIjAiLAotICAiTG1wUGFsU3VidmVyc2lvbiI6ICIwIiwKLSAgIk1heGltdW1QYWdlTnVtYmVyIjogIjAiLAotICAiQmRBZGRyZXNzIjogIjEyMzQ1NiIKLX0KZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kZXNrdG9wL3Jvb3RfY2FuYWxfbWFpbi5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kZXNrdG9wL3Jvb3RfY2FuYWxfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhYTI2NC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvZGVza3RvcC9yb290X2NhbmFsX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLSNpbmNsdWRlICJ0ZXN0X2Vudmlyb25tZW50LmgiCi0KLSNpbmNsdWRlIDxiYWNrdHJhY2UvQmFja3RyYWNlLmg+Ci0jaW5jbHVkZSA8YmFja3RyYWNlL2JhY2t0cmFjZV9jb25zdGFudHMuaD4KLSNpbmNsdWRlIDxjbGllbnQvbGludXgvaGFuZGxlci9leGNlcHRpb25faGFuZGxlci5oPgotI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KLQotI2luY2x1ZGUgPGZ1dHVyZT4KLQotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaCIKLSNpbmNsdWRlICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X2Nvbm5lY3Rvci5oIgotI2luY2x1ZGUgIm5ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfc2VydmVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6Ymx1ZXRvb3RoOjpyb290X2NhbmFsOjpUZXN0RW52aXJvbm1lbnQ7Ci11c2luZyA6OmFuZHJvaWQ6Om5ldDo6UG9zaXhBc3luY1NvY2tldENvbm5lY3RvcjsKLXVzaW5nIDo6YW5kcm9pZDo6bmV0OjpQb3NpeEFzeW5jU29ja2V0U2VydmVyOwotdXNpbmcgdGVzdF92ZW5kb3JfbGliOjpBc3luY01hbmFnZXI7Ci0KLURFRklORV9zdHJpbmcoY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUsICIiLAotICAgICAgICAgICAgICAiY29udHJvbGxlcl9wcm9wZXJ0aWVzLmpzb24gZmlsZSBwYXRoIik7Ci1ERUZJTkVfc3RyaW5nKGRlZmF1bHRfY29tbWFuZHNfZmlsZSwgIiIsCi0gICAgICAgICAgICAgICJjb21tYW5kcyBmaWxlIHdoaWNoIHJvb3QtY2FuYWwgcnVucyBpdCBhcyBkZWZhdWx0Iik7Ci0KLWNvbnN0ZXhwciB1aW50MTZfdCBrVGVzdFBvcnQgPSA2NDAxOwotY29uc3RleHByIHVpbnQxNl90IGtIY2lTZXJ2ZXJQb3J0ID0gNjQwMjsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGlua1NlcnZlclBvcnQgPSA2NDAzOwotY29uc3RleHByIHVpbnQxNl90IGtMaW5rQmxlU2VydmVyUG9ydCA9IDY0MDQ7Ci0KLWV4dGVybiAiQyIgY29uc3QgY2hhciogX19hc2FuX2RlZmF1bHRfb3B0aW9ucygpIHsKLSAgcmV0dXJuICJkZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAiOwotfQotCi1ib29sIGNyYXNoX2NhbGxiYWNrKGNvbnN0IHZvaWQqIGNyYXNoX2NvbnRleHQsIHNpemVfdCBjcmFzaF9jb250ZXh0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIC8qIGNvbnRleHQgKi8pIHsKLSAgcGlkX3QgdGlkID0gQkFDS1RSQUNFX0NVUlJFTlRfVEhSRUFEOwotICBpZiAoY3Jhc2hfY29udGV4dF9zaXplID49Ci0gICAgICBzaXplb2YoZ29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyOjpDcmFzaENvbnRleHQpKSB7Ci0gICAgYXV0byogY3R4ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgZ29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyOjpDcmFzaENvbnRleHQqPigKLSAgICAgICAgICAgIGNyYXNoX2NvbnRleHQpOwotICAgIHRpZCA9IGN0eC0+dGlkOwotICAgIGludCBzaWduYWxfbnVtYmVyID0gY3R4LT5zaWdpbmZvLnNpX3NpZ25vOwotICAgIExPR19FUlJPUigiUHJvY2VzcyBjcmFzaGVkLCBzaWduYWw6ICVzWyVkXSwgdGlkOiAlZCIsCi0gICAgICAgICAgICAgIHN0cnNpZ25hbChzaWduYWxfbnVtYmVyKSwgc2lnbmFsX251bWJlciwgY3R4LT50aWQpOwotICB9IGVsc2UgewotICAgIExPR19FUlJPUigiUHJvY2VzcyBjcmFzaGVkLCBzaWduYWw6IHVua25vd24sIHRpZDogdW5rbm93biIpOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxCYWNrdHJhY2U+IGJhY2t0cmFjZSgKLSAgICAgIEJhY2t0cmFjZTo6Q3JlYXRlKEJBQ0tUUkFDRV9DVVJSRU5UX1BST0NFU1MsIHRpZCkpOwotICBpZiAoYmFja3RyYWNlID09IG51bGxwdHIpIHsKLSAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgYmFja3RyYWNlIG9iamVjdCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWJhY2t0cmFjZS0+VW53aW5kKDApKSB7Ci0gICAgTE9HX0VSUk9SKCJiYWNrdHJhY2UtPlVud2luZCBmYWlsZWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTE9HX0VSUk9SKCJCYWNrdHJhY2U6Iik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmFja3RyYWNlLT5OdW1GcmFtZXMoKTsgaSsrKSB7Ci0gICAgTE9HX0VSUk9SKCIlcyIsIGJhY2t0cmFjZS0+Rm9ybWF0RnJhbWVEYXRhKGkpLmNfc3RyKCkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgZ29vZ2xlX2JyZWFrcGFkOjpNaW5pZHVtcERlc2NyaXB0b3IgZGVzY3JpcHRvcigKLSAgICAgIGdvb2dsZV9icmVha3BhZDo6TWluaWR1bXBEZXNjcmlwdG9yOjprTWljcm9kdW1wT25Db25zb2xlKTsKLSAgZ29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyIGVoKGRlc2NyaXB0b3IsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAtMSk7Ci0gIGVoLnNldF9jcmFzaF9oYW5kbGVyKGNyYXNoX2NhbGxiYWNrKTsKLQotICBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIHRydWUpOwotCi0gIExPR19JTkZPKCJtYWluIik7Ci0gIHVpbnQxNl90IHRlc3RfcG9ydCA9IGtUZXN0UG9ydDsKLSAgdWludDE2X3QgaGNpX3NlcnZlcl9wb3J0ID0ga0hjaVNlcnZlclBvcnQ7Ci0gIHVpbnQxNl90IGxpbmtfc2VydmVyX3BvcnQgPSBrTGlua1NlcnZlclBvcnQ7Ci0gIHVpbnQxNl90IGxpbmtfYmxlX3NlcnZlcl9wb3J0ID0ga0xpbmtCbGVTZXJ2ZXJQb3J0OwotCi0gIGZvciAoaW50IGFyZyA9IDA7IGFyZyA8IGFyZ2M7IGFyZysrKSB7Ci0gICAgaW50IHBvcnQgPSAoaW50KXN0cnRvbChhcmd2W2FyZ10sIG51bGxwdHIsIDApOwotICAgIExPR19JTkZPKCIlZDogJXMgKCVkKSIsIGFyZywgYXJndlthcmddLCBwb3J0KTsKLSAgICBpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDB4ZmZmZikgewotICAgICAgTE9HX1dBUk4oIiVzIG91dCBvZiByYW5nZSIsIGFyZ3ZbYXJnXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaCAoYXJnKSB7Ci0gICAgICAgIGNhc2UgMDogIC8vIGV4ZWN1dGFibGUgbmFtZQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgdGVzdF9wb3J0ID0gcG9ydDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIGhjaV9zZXJ2ZXJfcG9ydCA9IHBvcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICBsaW5rX3NlcnZlcl9wb3J0ID0gcG9ydDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIGxpbmtfYmxlX3NlcnZlcl9wb3J0ID0gcG9ydDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfV0FSTigiSWdub3JlZCBvcHRpb24gJXMiLCBhcmd2W2FyZ10pOwotICAgICAgfQotICAgIH0KLSAgfQotICBBc3luY01hbmFnZXIgYW07Ci0gIFRlc3RFbnZpcm9ubWVudCByb290X2NhbmFsKAotICAgICAgc3RkOjptYWtlX3NoYXJlZDxQb3NpeEFzeW5jU29ja2V0U2VydmVyPih0ZXN0X3BvcnQsICZhbSksCi0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXI+KGhjaV9zZXJ2ZXJfcG9ydCwgJmFtKSwKLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UG9zaXhBc3luY1NvY2tldFNlcnZlcj4obGlua19zZXJ2ZXJfcG9ydCwgJmFtKSwKLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UG9zaXhBc3luY1NvY2tldFNlcnZlcj4obGlua19ibGVfc2VydmVyX3BvcnQsICZhbSksCi0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBvc2l4QXN5bmNTb2NrZXRDb25uZWN0b3I+KCZhbSksCi0gICAgICBGTEFHU19jb250cm9sbGVyX3Byb3BlcnRpZXNfZmlsZSwgRkxBR1NfZGVmYXVsdF9jb21tYW5kc19maWxlKTsKLSAgc3RkOjpwcm9taXNlPHZvaWQ+IGJhcnJpZXI7Ci0gIHN0ZDo6ZnV0dXJlPHZvaWQ+IGJhcnJpZXJfZnV0dXJlID0gYmFycmllci5nZXRfZnV0dXJlKCk7Ci0gIHJvb3RfY2FuYWwuaW5pdGlhbGl6ZShzdGQ6Om1vdmUoYmFycmllcikpOwotICBiYXJyaWVyX2Z1dHVyZS53YWl0KCk7Ci0gIHJvb3RfY2FuYWwuY2xvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kZXNrdG9wL3Rlc3RfZW52aXJvbm1lbnQuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvZGVza3RvcC90ZXN0X2Vudmlyb25tZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2IyMDcyLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kZXNrdG9wL3Rlc3RfZW52aXJvbm1lbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInRlc3RfZW52aXJvbm1lbnQuaCIKLQotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAgLy8gZm9yIHJlbW92ZV9leHRlbnRfdAotI2luY2x1ZGUgPHV0aWxpdHk+ICAgICAgLy8gZm9yIG1vdmUKLSNpbmNsdWRlIDx2ZWN0b3I+ICAgICAgIC8vIGZvciB2ZWN0b3IKLQotI2luY2x1ZGUgIm5ldC9hc3luY19kYXRhX2NoYW5uZWwuaCIgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0jaW5jbHVkZSAib3MvbG9nLmgiICAgICAgICAgICAgICAgICAgLy8gZm9yIExPR19JTkZPLCBMT0dfRVJST1IsIExPR19XQVJOCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBibHVldG9vdGggewotbmFtZXNwYWNlIHJvb3RfY2FuYWwgewotCi11c2luZyB0ZXN0X3ZlbmRvcl9saWI6OkFzeW5jVGFza0lkOwotdXNpbmcgdGVzdF92ZW5kb3JfbGliOjpUYXNrQ2FsbGJhY2s7Ci0KLXZvaWQgVGVzdEVudmlyb25tZW50Ojppbml0aWFsaXplKHN0ZDo6cHJvbWlzZTx2b2lkPiBiYXJyaWVyKSB7Ci0gIExPR19JTkZPKCJJbml0aWFsaXplZCBiYXJyaWVyIik7Ci0KLSAgYmFycmllcl8gPSBzdGQ6Om1vdmUoYmFycmllcik7Ci0KLSAgYXV0byB1c2VyX2lkID0gYXN5bmNfbWFuYWdlcl8uR2V0TmV4dFVzZXJJZCgpOwotICB0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0Xy5SZWdpc3RlckNvbW1hbmRIYW5kbGVyKAotICAgICAgW3RoaXMsIHVzZXJfaWRdKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICAgICAgICBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcl9pZCwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLCBuYW1lLCBhcmdzXSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gIkVORF9TSU1VTEFUSU9OIikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXJfLnNldF92YWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2hhbm5lbF8uSGFuZGxlQ29tbWFuZChuYW1lLCBhcmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICB9KTsKLQotICBTZXRVcFRlc3RDaGFubmVsKCk7Ci0gIFNldFVwSGNpU2VydmVyKFt0aGlzXShzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciogc3J2KSB7Ci0gICAgdGVzdF9tb2RlbF8uSW5jb21pbmdIY2lDb25uZWN0aW9uKHNvY2tldCwgY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGVfKTsKLSAgICBzcnYtPlN0YXJ0TGlzdGVuaW5nKCk7Ci0gIH0pOwotICBTZXRVcExpbmtMYXllclNlcnZlcigpOwotICBTZXRVcExpbmtCbGVMYXllclNlcnZlcigpOwotCi0gIExPR19JTkZPKCIlczogRmluaXNoZWQiLCBfX2Z1bmNfXyk7Ci19Ci0KLXZvaWQgVGVzdEVudmlyb25tZW50OjpjbG9zZSgpIHsKLSAgTE9HX0lORk8oIiVzIiwgX19mdW5jX18pOwotICB0ZXN0X21vZGVsXy5SZXNldCgpOwotfQotCi12b2lkIFRlc3RFbnZpcm9ubWVudDo6U2V0VXBIY2lTZXJ2ZXIoQ29ubmVjdENhbGxiYWNrIGNvbm5lY3Rpb25fY2FsbGJhY2spIHsKLSAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZShbXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICBMT0dfSU5GTygiTm8gSENJIFJlc3BvbnNlIGNoYW5uZWw6ICVzIiwgcmVzcG9uc2UuY19zdHIoKSk7Ci0gIH0pOwotCi0gIGlmICghcmVtb3RlX2hjaV90cmFuc3BvcnRfLlNldFVwKGhjaV9zb2NrZXRfc2VydmVyXywgY29ubmVjdGlvbl9jYWxsYmFjaykpIHsKLSAgICBMT0dfRVJST1IoIlJlbW90ZSBIQ0kgY2hhbm5lbCBTZXRVcCBmYWlsZWQuIik7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgVGVzdEVudmlyb25tZW50OjpTZXRVcExpbmtCbGVMYXllclNlcnZlcigpIHsKLSAgcmVtb3RlX2xpbmtfbGF5ZXJfdHJhbnNwb3J0Xy5TZXRVcCgKLSAgICAgIGxpbmtfYmxlX3NvY2tldF9zZXJ2ZXJfLCBbdGhpc10oc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciogc3J2KSB7Ci0gICAgICAgIHRlc3RfbW9kZWxfLkluY29taW5nTGlua0JsZUxheWVyQ29ubmVjdGlvbihzb2NrZXQpOwotICAgICAgICBzcnYtPlN0YXJ0TGlzdGVuaW5nKCk7Ci0gICAgICB9KTsKLQotICB0ZXN0X2NoYW5uZWxfLlJlZ2lzdGVyU2VuZFJlc3BvbnNlKFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSkgewotICAgIExPR19JTkZPKCJObyBMaW5rTGF5ZXIgUmVzcG9uc2UgY2hhbm5lbDogJXMiLCByZXNwb25zZS5jX3N0cigpKTsKLSAgfSk7Ci19Ci0KLXZvaWQgVGVzdEVudmlyb25tZW50OjpTZXRVcExpbmtMYXllclNlcnZlcigpIHsKLSAgcmVtb3RlX2xpbmtfbGF5ZXJfdHJhbnNwb3J0Xy5TZXRVcCgKLSAgICAgIGxpbmtfc29ja2V0X3NlcnZlcl8sIFt0aGlzXShzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIqIHNydikgewotICAgICAgICB0ZXN0X21vZGVsXy5JbmNvbWluZ0xpbmtMYXllckNvbm5lY3Rpb24oc29ja2V0KTsKLSAgICAgICAgc3J2LT5TdGFydExpc3RlbmluZygpOwotICAgICAgfSk7Ci0KLSAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZShbXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICBMT0dfSU5GTygiTm8gTGlua0xheWVyIFJlc3BvbnNlIGNoYW5uZWw6ICVzIiwgcmVzcG9uc2UuY19zdHIoKSk7Ci0gIH0pOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gVGVzdEVudmlyb25tZW50OjpDb25uZWN0VG9SZW1vdGVTZXJ2ZXIoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZlciwgaW50IHBvcnQpIHsKLSAgcmV0dXJuIGNvbm5lY3Rvcl8tPkNvbm5lY3RUb1JlbW90ZVNlcnZlcihzZXJ2ZXIsIHBvcnQpOwotfQotCi12b2lkIFRlc3RFbnZpcm9ubWVudDo6U2V0VXBUZXN0Q2hhbm5lbCgpIHsKLSAgYm9vbCB0cmFuc3BvcnRfY29uZmlndXJlZCA9IHRlc3RfY2hhbm5lbF90cmFuc3BvcnRfLlNldFVwKAotICAgICAgdGVzdF9zb2NrZXRfc2VydmVyXywgW3RoaXNdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBjb25uX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIqIHNlcnZlcikgewotICAgICAgICBMT0dfSU5GTygiVGVzdCBjaGFubmVsIGNvbm5lY3Rpb24gYWNjZXB0ZWQuIik7Ci0gICAgICAgIHNlcnZlci0+U3RhcnRMaXN0ZW5pbmcoKTsKLSAgICAgICAgaWYgKHRlc3RfY2hhbm5lbF9vcGVuXykgewotICAgICAgICAgIExPR19XQVJOKCJPbmx5IG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZSBpcyBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICB0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0Xy5TZW5kUmVzcG9uc2UoY29ubl9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjb25uZWN0aW9uIGlzIGJyb2tlbiIpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0X2NoYW5uZWxfb3Blbl8gPSB0cnVlOwotICAgICAgICB0ZXN0X2NoYW5uZWxfLlJlZ2lzdGVyU2VuZFJlc3BvbnNlKAotICAgICAgICAgICAgW3RoaXMsIGNvbm5fZmRdKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNwb25zZSkgewotICAgICAgICAgICAgICB0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0Xy5TZW5kUmVzcG9uc2UoY29ubl9mZCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgY29ubl9mZC0+V2F0Y2hGb3JOb25CbG9ja2luZ1JlYWQoW3RoaXNdKEFzeW5jRGF0YUNoYW5uZWwqIGNvbm5fZmQpIHsKLSAgICAgICAgICB0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0Xy5PbkNvbW1hbmRSZWFkeSgKLSAgICAgICAgICAgICAgY29ubl9mZCwgW3RoaXNdKCkgeyB0ZXN0X2NoYW5uZWxfb3Blbl8gPSBmYWxzZTsgfSk7Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9KTsKLSAgdGVzdF9jaGFubmVsXy5SZWdpc3RlclNlbmRSZXNwb25zZShbXShjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIHsKLSAgICBMT0dfSU5GTygiTm8gdGVzdCBjaGFubmVsOiAlcyIsIHJlc3BvbnNlLmNfc3RyKCkpOwotICB9KTsKLSAgdGVzdF9jaGFubmVsXy5BZGRQaHkoeyJCUl9FRFIifSk7Ci0gIHRlc3RfY2hhbm5lbF8uQWRkUGh5KHsiTE9XX0VORVJHWSJ9KTsKLSAgdGVzdF9jaGFubmVsXy5TZXRUaW1lclBlcmlvZCh7IjUifSk7Ci0gIHRlc3RfY2hhbm5lbF8uU3RhcnRUaW1lcih7fSk7Ci0KLSAgdGVzdF9jaGFubmVsXy5Gcm9tRmlsZShkZWZhdWx0X2NvbW1hbmRzX2ZpbGVfKTsKLQotICBpZiAoIXRyYW5zcG9ydF9jb25maWd1cmVkKSB7Ci0gICAgTE9HX0VSUk9SKCJUZXN0IGNoYW5uZWwgU2V0VXAgZmFpbGVkLiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19JTkZPKCJUZXN0IGNoYW5uZWwgU2V0VXAoKSBzdWNjZXNzZnVsIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSByb290X2NhbmFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL2Rlc2t0b3AvdGVzdF9lbnZpcm9ubWVudC5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL2Rlc2t0b3AvdGVzdF9lbnZpcm9ubWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWYwMGJlLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9kZXNrdG9wL3Rlc3RfZW52aXJvbm1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNocm9ubz4gICAgICAvLyBmb3IgbWlsbGlzZWNvbmRzCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4gIC8vIGZvciBfX2Jhc2UsIGZ1bmN0aW9uCi0jaW5jbHVkZSA8ZnV0dXJlPiAgICAgIC8vIGZvciBwcm9taXNlCi0jaW5jbHVkZSA8bWVtb3J5PiAgICAgIC8vIGZvciBzaGFyZWRfcHRyLCBtYWtlXy4uLgotI2luY2x1ZGUgPHN0cmluZz4gICAgICAvLyBmb3Igc3RyaW5nCi0KLSNpbmNsdWRlICJtb2RlbC9jb250cm9sbGVyL2R1YWxfbW9kZV9jb250cm9sbGVyLmgiICAvLyBmb3IgRHVhbE1vZGVDb250cm9sbGVyCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvYXN5bmNfbWFuYWdlci5oIiAgICAgICAgICAgICAgLy8gZm9yIEFzeW5jVGFza0lkLCBBc3luLi4uCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvdGVzdF9jaGFubmVsX3RyYW5zcG9ydC5oIiAgICAgLy8gZm9yIFRlc3RDaGFubmVsVHJhbnNwb3J0Ci0jaW5jbHVkZSAibW9kZWwvc2V0dXAvdGVzdF9jb21tYW5kX2hhbmRsZXIuaCIgICAgICAgLy8gZm9yIFRlc3RDb21tYW5kSGFuZGxlcgotI2luY2x1ZGUgIm1vZGVsL3NldHVwL3Rlc3RfbW9kZWwuaCIgICAgICAgICAgICAgICAgIC8vIGZvciBUZXN0TW9kZWwKLSNpbmNsdWRlICJuZXQvYXN5bmNfZGF0YV9jaGFubmVsX3NlcnZlci5oIiAgICAgICAgICAvLyBmb3IgQXN5bmNEYXRhQ2hhbm5lbFMuLi4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG5ldCB7Ci1jbGFzcyBBc3luY0RhdGFDaGFubmVsOwotY2xhc3MgQXN5bmNEYXRhQ2hhbm5lbENvbm5lY3RvcjsKLX0gIC8vIG5hbWVzcGFjZSBuZXQKLQotbmFtZXNwYWNlIGJsdWV0b290aCB7Ci1uYW1lc3BhY2Ugcm9vdF9jYW5hbCB7Ci0KLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbDsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbENvbm5lY3RvcjsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbFNlcnZlcjsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6Q29ubmVjdENhbGxiYWNrOwotCi1jbGFzcyBUZXN0RW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgVGVzdEVudmlyb25tZW50KHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsU2VydmVyPiB0ZXN0X3BvcnQsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbFNlcnZlcj4gaGNpX3NlcnZlcl9wb3J0LAotICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXI+IGxpbmtfc2VydmVyX3BvcnQsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbFNlcnZlcj4gbGlua19ibGVfc2VydmVyX3BvcnQsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbENvbm5lY3Rvcj4gY29ubmVjdG9yLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xsZXJfcHJvcGVydGllc19maWxlID0gIiIsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF9jb21tYW5kc19maWxlID0gIiIpCi0gICAgICA6IHRlc3Rfc29ja2V0X3NlcnZlcl8odGVzdF9wb3J0KSwKLSAgICAgICAgaGNpX3NvY2tldF9zZXJ2ZXJfKGhjaV9zZXJ2ZXJfcG9ydCksCi0gICAgICAgIGxpbmtfc29ja2V0X3NlcnZlcl8obGlua19zZXJ2ZXJfcG9ydCksCi0gICAgICAgIGxpbmtfYmxlX3NvY2tldF9zZXJ2ZXJfKGxpbmtfYmxlX3NlcnZlcl9wb3J0KSwKLSAgICAgICAgY29ubmVjdG9yXyhjb25uZWN0b3IpLAotICAgICAgICBjb250cm9sbGVyX3Byb3BlcnRpZXNfZmlsZV8oY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUpLAotICAgICAgICBkZWZhdWx0X2NvbW1hbmRzX2ZpbGVfKGRlZmF1bHRfY29tbWFuZHNfZmlsZSksCi0gICAgICAgIGNvbnRyb2xsZXJfKHN0ZDo6bWFrZV9zaGFyZWQ8dGVzdF92ZW5kb3JfbGliOjpEdWFsTW9kZUNvbnRyb2xsZXI+KAotICAgICAgICAgICAgY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGUpKSB7fQotCi0gIHZvaWQgaW5pdGlhbGl6ZShzdGQ6OnByb21pc2U8dm9pZD4gYmFycmllcik7Ci0KLSAgdm9pZCBjbG9zZSgpOwotCi0gcHJpdmF0ZToKLSAgdGVzdF92ZW5kb3JfbGliOjpBc3luY01hbmFnZXIgYXN5bmNfbWFuYWdlcl87Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsU2VydmVyPiB0ZXN0X3NvY2tldF9zZXJ2ZXJfOwotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbFNlcnZlcj4gaGNpX3NvY2tldF9zZXJ2ZXJfOwotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbFNlcnZlcj4gbGlua19zb2NrZXRfc2VydmVyXzsKLSAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXI+IGxpbmtfYmxlX3NvY2tldF9zZXJ2ZXJfOwotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbENvbm5lY3Rvcj4gY29ubmVjdG9yXzsKLSAgc3RkOjpzdHJpbmcgY29udHJvbGxlcl9wcm9wZXJ0aWVzX2ZpbGVfOwotICBzdGQ6OnN0cmluZyBkZWZhdWx0X2NvbW1hbmRzX2ZpbGVfOwotICBib29sIHRlc3RfY2hhbm5lbF9vcGVuX3tmYWxzZX07Ci0gIHN0ZDo6cHJvbWlzZTx2b2lkPiBiYXJyaWVyXzsKLQotCi0gIHZvaWQgU2V0VXBUZXN0Q2hhbm5lbCgpOwotICB2b2lkIFNldFVwSGNpU2VydmVyKENvbm5lY3RDYWxsYmFjayBvbl9jb25uZWN0KTsKLSAgdm9pZCBTZXRVcExpbmtMYXllclNlcnZlcigpOwotICB2b2lkIFNldFVwTGlua0JsZUxheWVyU2VydmVyKCk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBDb25uZWN0VG9SZW1vdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmVyLCBpbnQgcG9ydCk7Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPHRlc3RfdmVuZG9yX2xpYjo6RHVhbE1vZGVDb250cm9sbGVyPiBjb250cm9sbGVyXzsKLQotICB0ZXN0X3ZlbmRvcl9saWI6OlRlc3RDaGFubmVsVHJhbnNwb3J0IHRlc3RfY2hhbm5lbF90cmFuc3BvcnRfOwotICB0ZXN0X3ZlbmRvcl9saWI6OlRlc3RDaGFubmVsVHJhbnNwb3J0IHJlbW90ZV9oY2lfdHJhbnNwb3J0XzsKLSAgdGVzdF92ZW5kb3JfbGliOjpUZXN0Q2hhbm5lbFRyYW5zcG9ydCByZW1vdGVfbGlua19sYXllcl90cmFuc3BvcnRfOwotICB0ZXN0X3ZlbmRvcl9saWI6OlRlc3RDaGFubmVsVHJhbnNwb3J0IHJlbW90ZV9saW5rX2JsZV9sYXllcl90cmFuc3BvcnRfOwotCi0gIHRlc3RfdmVuZG9yX2xpYjo6VGVzdE1vZGVsIHRlc3RfbW9kZWxfewotICAgICAgW3RoaXNdKCkgeyByZXR1cm4gYXN5bmNfbWFuYWdlcl8uR2V0TmV4dFVzZXJJZCgpOyB9LAotICAgICAgW3RoaXNdKHRlc3RfdmVuZG9yX2xpYjo6QXN5bmNVc2VySWQgdXNlcl9pZCwKLSAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LAotICAgICAgICAgICAgIGNvbnN0IHRlc3RfdmVuZG9yX2xpYjo6VGFza0NhbGxiYWNrJiB0YXNrKSB7Ci0gICAgICAgIHJldHVybiBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcl9pZCwgZGVsYXksIHRhc2spOwotICAgICAgfSwKLQotICAgICAgW3RoaXNdKHRlc3RfdmVuZG9yX2xpYjo6QXN5bmNVc2VySWQgdXNlcl9pZCwKLSAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHBlcmlvZCwKLSAgICAgICAgICAgICBjb25zdCB0ZXN0X3ZlbmRvcl9saWI6OlRhc2tDYWxsYmFjayYgdGFzaykgewotICAgICAgICByZXR1cm4gYXN5bmNfbWFuYWdlcl8uRXhlY0FzeW5jUGVyaW9kaWNhbGx5KHVzZXJfaWQsIGRlbGF5LCBwZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayk7Ci0gICAgICB9LAotCi0gICAgICBbdGhpc10odGVzdF92ZW5kb3JfbGliOjpBc3luY1VzZXJJZCB1c2VyKSB7Ci0gICAgICAgIGFzeW5jX21hbmFnZXJfLkNhbmNlbEFzeW5jVGFza3NGcm9tVXNlcih1c2VyKTsKLSAgICAgIH0sCi0KLSAgICAgIFt0aGlzXSh0ZXN0X3ZlbmRvcl9saWI6OkFzeW5jVGFza0lkIHRhc2spIHsKLSAgICAgICAgYXN5bmNfbWFuYWdlcl8uQ2FuY2VsQXN5bmNUYXNrKHRhc2spOwotICAgICAgfSwKLQotICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2ZXIsIGludCBwb3J0KSB7Ci0gICAgICAgIHJldHVybiBDb25uZWN0VG9SZW1vdGVTZXJ2ZXIoc2VydmVyLCBwb3J0KTsKLSAgICAgIH19OwotCi0gIHRlc3RfdmVuZG9yX2xpYjo6VGVzdENvbW1hbmRIYW5kbGVyIHRlc3RfY2hhbm5lbF97dGVzdF9tb2RlbF99OwotfTsKLX0gIC8vIG5hbWVzcGFjZSByb290X2NhbmFsCi19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL2lucXVpcnkuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL2lucXVpcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4OWFmNC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvaW5jbHVkZS9pbnF1aXJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIElucXVpcnkgewotIHB1YmxpYzoKLSAgZW51bSBjbGFzcyBJbnF1aXJ5U3RhdGUgOiB1aW50OF90IHsKLSAgICBTVEFOREJZID0gMHgwMCwKLSAgICBJTlFVSVJZID0gMHgwMSwKLSAgfTsKLSAgZW51bSBjbGFzcyBJbnF1aXJ5VHlwZSA6IHVpbnQ4X3QgewotICAgIFNUQU5EQVJEID0gMHgwMCwKLSAgICBSU1NJID0gMHgwMSwKLSAgICBFWFRFTkRFRCA9IDB4MDIsCi0gIH07Ci19OwotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL2luY2x1ZGUvbGVfYWR2ZXJ0aXNlbWVudC5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL2luY2x1ZGUvbGVfYWR2ZXJ0aXNlbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWMxMzk2Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL2xlX2FkdmVydGlzZW1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIExlQWR2ZXJ0aXNlbWVudCB7Ci0gcHVibGljOgotICBlbnVtIGNsYXNzIEFkdmVydGlzZW1lbnRUeXBlIDogdWludDhfdCB7Ci0gICAgQURWX0lORCA9IDAsICAgICAgICAgIC8vIENvbm5lY3RhYmxlIGFuZCBzY2FubmFibGUKLSAgICBBRFZfRElSRUNUX0lORCA9IDEsICAgLy8gQ29ubmVjdGFibGUgZGlyZWN0ZWQKLSAgICBBRFZfU0NBTl9JTkQgPSAyLCAgICAgLy8gU2Nhbm5hYmxlIHVuZGlyZWN0ZWQKLSAgICBBRFZfTk9OQ09OTl9JTkQgPSAzLCAgLy8gTm9uIGNvbm5lY3RhYmxlIHVuZGlyZWN0ZWQKLSAgICBTQ0FOX1JFU1BPTlNFID0gNCwKLSAgfTsKLSAgZW51bSBjbGFzcyBBZGRyZXNzVHlwZSA6IHVpbnQ4X3QgewotICAgIFBVQkxJQyA9IDAsCi0gICAgUkFORE9NID0gMSwKLSAgICBQVUJMSUNfSURFTlRJVFkgPSAyLAotICAgIFJBTkRPTV9JREVOVElUWSA9IDMsCi0gIH07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvaW5jbHVkZS9waHkuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL3BoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM2NzNjLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL3BoeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1jbGFzcyBQaHkgewotIHB1YmxpYzoKLSAgZW51bSBjbGFzcyBUeXBlIHsKLSAgICBMT1dfRU5FUkdZLAotICAgIEJSX0VEUiwKLSAgfTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvaW5jbHVkZS9zY28uaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL3Njby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY5MWNmLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9pbmNsdWRlL3Njby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLW5hbWVzcGFjZSBzY28gewotCi0vLyBTQ08gZGF0YSBwYWNrZXRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24gVmVyc2lvbgotLy8gNC4yLCBWb2x1bWUgMiwgUGFydCBFLCBTZWN0aW9uIDUuNC4zCi1lbnVtIGNsYXNzIFBhY2tldFN0YXR1c0ZsYWdzVHlwZSA6IHVpbnQ4X3QgewotICBDT1JSRUNUTFlfUkVDRUlWRUQgPSAwLAotICBQT1NTSUJMWV9JTkNPTVBMRVRFID0gMSwKLSAgTk9fREFUQSA9IDIsCi0gIFBBUlRJQUxMWV9MT1NUID0gMwotfTsKLX0gIC8vIG5hbWVzcGFjZSBzY28KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2FjbF9jb25uZWN0aW9uLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvYWNsX2Nvbm5lY3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjdhNjAuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvYWNsX2Nvbm5lY3Rpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYWNsX2Nvbm5lY3Rpb24uaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci1BY2xDb25uZWN0aW9uOjpBY2xDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyLCBBZGRyZXNzV2l0aFR5cGUgb3duX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeTo6VHlwZSBwaHlfdHlwZSkKLSAgICA6IGFkZHJlc3NfKGFkZHIpLCBvd25fYWRkcmVzc18ob3duX2FkZHIpLCB0eXBlXyhwaHlfdHlwZSkge30KLQotdm9pZCBBY2xDb25uZWN0aW9uOjpFbmNyeXB0KCkgeyBlbmNyeXB0ZWRfID0gdHJ1ZTsgfTsKLQotYm9vbCBBY2xDb25uZWN0aW9uOjpJc0VuY3J5cHRlZCgpIGNvbnN0IHsgcmV0dXJuIGVuY3J5cHRlZF87IH07Ci0KLUFkZHJlc3NXaXRoVHlwZSBBY2xDb25uZWN0aW9uOjpHZXRBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gYWRkcmVzc187IH0KLQotdm9pZCBBY2xDb25uZWN0aW9uOjpTZXRBZGRyZXNzKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKSB7IGFkZHJlc3NfID0gYWRkcmVzczsgfQotCi1BZGRyZXNzV2l0aFR5cGUgQWNsQ29ubmVjdGlvbjo6R2V0T3duQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG93bl9hZGRyZXNzXzsgfQotCi12b2lkIEFjbENvbm5lY3Rpb246OlNldE93bkFkZHJlc3MoQWRkcmVzc1dpdGhUeXBlIG93bl9hZGRyKSB7Ci0gIG93bl9hZGRyZXNzXyA9IG93bl9hZGRyOwotfQotCi1QaHk6OlR5cGUgQWNsQ29ubmVjdGlvbjo6R2V0UGh5VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2FjbF9jb25uZWN0aW9uLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9hY2xfY29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUxNzc5Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2FjbF9jb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJwaHkuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZTsKLQotLy8gTW9kZWwgdGhlIGNvbm5lY3Rpb24gb2YgYSBkZXZpY2UgdG8gdGhlIGNvbnRyb2xsZXIuCi1jbGFzcyBBY2xDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIEFjbENvbm5lY3Rpb24oQWRkcmVzc1dpdGhUeXBlIGFkZHIsIEFkZHJlc3NXaXRoVHlwZSBvd25fYWRkciwKLSAgICAgICAgICAgICAgICBQaHk6OlR5cGUgcGh5X3R5cGUpOwotCi0gIHZpcnR1YWwgfkFjbENvbm5lY3Rpb24oKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBFbmNyeXB0KCk7Ci0KLSAgYm9vbCBJc0VuY3J5cHRlZCgpIGNvbnN0OwotCi0gIEFkZHJlc3NXaXRoVHlwZSBHZXRBZGRyZXNzKCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRBZGRyZXNzKEFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzKTsKLQotICBBZGRyZXNzV2l0aFR5cGUgR2V0T3duQWRkcmVzcygpIGNvbnN0OwotCi0gIHZvaWQgU2V0T3duQWRkcmVzcyhBZGRyZXNzV2l0aFR5cGUgb3duX2FkZHIpOwotCi0gIFBoeTo6VHlwZSBHZXRQaHlUeXBlKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc187Ci0gIEFkZHJlc3NXaXRoVHlwZSBvd25fYWRkcmVzc187Ci0gIFBoeTo6VHlwZSB0eXBlX3tQaHk6OlR5cGU6OkJSX0VEUn07Ci0KLSAgLy8gU3RhdGUgdmFyaWFibGVzCi0gIGJvb2wgZW5jcnlwdGVkX3tmYWxzZX07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9hY2xfY29ubmVjdGlvbl9oYW5kbGVyLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvYWNsX2Nvbm5lY3Rpb25faGFuZGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhNmQ5ZS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9hY2xfY29ubmVjdGlvbl9oYW5kbGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhY2xfY29ubmVjdGlvbl9oYW5kbGVyLmgiCi0KLSNpbmNsdWRlIDxoY2kvaGNpX3BhY2tldHMuaD4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyA6OmJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgOjpibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU7Ci11c2luZyA6OmJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGU7Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6Okhhc0hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgcmV0dXJuIGFjbF9jb25uZWN0aW9uc18uY291bnQoaGFuZGxlKSAhPSAwOwotfQotCi11aW50MTZfdCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6R2V0VW51c2VkSGFuZGxlKCkgewotICB3aGlsZSAoSGFzSGFuZGxlKGxhc3RfaGFuZGxlXykgfHwKLSAgICAgICAgIGlzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlcl8uSGFzSGFuZGxlKGxhc3RfaGFuZGxlXykpIHsKLSAgICBsYXN0X2hhbmRsZV8gPSAobGFzdF9oYW5kbGVfICsgMSkgJSBrUmVzZXJ2ZWRIYW5kbGU7Ci0gIH0KLSAgdWludDE2X3QgdW51c2VkX2hhbmRsZSA9IGxhc3RfaGFuZGxlXzsKLSAgbGFzdF9oYW5kbGVfID0gKGxhc3RfaGFuZGxlXyArIDEpICUga1Jlc2VydmVkSGFuZGxlOwotICByZXR1cm4gdW51c2VkX2hhbmRsZTsKLX0KLQotYm9vbCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6Q3JlYXRlUGVuZGluZ0Nvbm5lY3Rpb24oCi0gICAgQWRkcmVzcyBhZGRyLCBib29sIGF1dGhlbnRpY2F0ZV9vbl9jb25uZWN0KSB7Ci0gIGlmIChjbGFzc2ljX2Nvbm5lY3Rpb25fcGVuZGluZ18pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY2xhc3NpY19jb25uZWN0aW9uX3BlbmRpbmdfID0gdHJ1ZTsKLSAgcGVuZGluZ19jb25uZWN0aW9uX2FkZHJlc3NfID0gYWRkcjsKLSAgYXV0aGVudGljYXRlX3BlbmRpbmdfY2xhc3NpY19jb25uZWN0aW9uXyA9IGF1dGhlbnRpY2F0ZV9vbl9jb25uZWN0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6SGFzUGVuZGluZ0Nvbm5lY3Rpb24oQWRkcmVzcyBhZGRyKSBjb25zdCB7Ci0gIHJldHVybiBjbGFzc2ljX2Nvbm5lY3Rpb25fcGVuZGluZ18gJiYgcGVuZGluZ19jb25uZWN0aW9uX2FkZHJlc3NfID09IGFkZHI7Ci19Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkF1dGhlbnRpY2F0ZVBlbmRpbmdDb25uZWN0aW9uKCkgY29uc3QgewotICByZXR1cm4gYXV0aGVudGljYXRlX3BlbmRpbmdfY2xhc3NpY19jb25uZWN0aW9uXzsKLX0KLQotYm9vbCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6Q2FuY2VsUGVuZGluZ0Nvbm5lY3Rpb24oQWRkcmVzcyBhZGRyKSB7Ci0gIGlmICghY2xhc3NpY19jb25uZWN0aW9uX3BlbmRpbmdfIHx8IHBlbmRpbmdfY29ubmVjdGlvbl9hZGRyZXNzXyAhPSBhZGRyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNsYXNzaWNfY29ubmVjdGlvbl9wZW5kaW5nXyA9IGZhbHNlOwotICBwZW5kaW5nX2Nvbm5lY3Rpb25fYWRkcmVzc18gPSBBZGRyZXNzOjprRW1wdHk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpDcmVhdGVQZW5kaW5nTGVDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyKSB7Ci0gIGJvb2wgZGV2aWNlX2Nvbm5lY3RlZCA9IGZhbHNlOwotICBmb3IgKGF1dG8gcGFpciA6IGFjbF9jb25uZWN0aW9uc18pIHsKLSAgICBhdXRvIGNvbm5lY3Rpb24gPSBzdGQ6OmdldDxBY2xDb25uZWN0aW9uPihwYWlyKTsKLSAgICBpZiAoY29ubmVjdGlvbi5HZXRBZGRyZXNzKCkgPT0gYWRkcikgewotICAgICAgZGV2aWNlX2Nvbm5lY3RlZCA9IHRydWU7Ci0gICAgfQotICB9Ci0gIGlmIChkZXZpY2VfY29ubmVjdGVkKSB7Ci0gICAgTE9HX0lORk8oIiVzOiAlcyBpcyBhbHJlYWR5IGNvbm5lY3RlZCIsIF9fZnVuY19fLCBhZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChsZV9jb25uZWN0aW9uX3BlbmRpbmdfKSB7Ci0gICAgTE9HX0lORk8oIiVzOiBjb25uZWN0aW9uIGFscmVhZHkgcGVuZGluZyIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbGVfY29ubmVjdGlvbl9wZW5kaW5nXyA9IHRydWU7Ci0gIHBlbmRpbmdfbGVfY29ubmVjdGlvbl9hZGRyZXNzXyA9IGFkZHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpIYXNQZW5kaW5nTGVDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyKSBjb25zdCB7Ci0gIHJldHVybiBsZV9jb25uZWN0aW9uX3BlbmRpbmdfICYmIHBlbmRpbmdfbGVfY29ubmVjdGlvbl9hZGRyZXNzXyA9PSBhZGRyOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpDYW5jZWxQZW5kaW5nTGVDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyKSB7Ci0gIGlmICghbGVfY29ubmVjdGlvbl9wZW5kaW5nXyB8fCBwZW5kaW5nX2xlX2Nvbm5lY3Rpb25fYWRkcmVzc18gIT0gYWRkcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBsZV9jb25uZWN0aW9uX3BlbmRpbmdfID0gZmFsc2U7Ci0gIHBlbmRpbmdfbGVfY29ubmVjdGlvbl9hZGRyZXNzXyA9Ci0gICAgICBBZGRyZXNzV2l0aFR5cGV7QWRkcmVzczo6a0VtcHR5LCBBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTfTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQxNl90IEFjbENvbm5lY3Rpb25IYW5kbGVyOjpDcmVhdGVDb25uZWN0aW9uKEFkZHJlc3MgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3Mgb3duX2FkZHIpIHsKLSAgaWYgKENhbmNlbFBlbmRpbmdDb25uZWN0aW9uKGFkZHIpKSB7Ci0gICAgdWludDE2X3QgaGFuZGxlID0gR2V0VW51c2VkSGFuZGxlKCk7Ci0gICAgYWNsX2Nvbm5lY3Rpb25zXy5lbXBsYWNlKAotICAgICAgICBoYW5kbGUsCi0gICAgICAgIEFjbENvbm5lY3Rpb257Ci0gICAgICAgICAgICBBZGRyZXNzV2l0aFR5cGV7YWRkciwgQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTU30sCi0gICAgICAgICAgICBBZGRyZXNzV2l0aFR5cGV7b3duX2FkZHIsIEFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1N9LAotICAgICAgICAgICAgUGh5OjpUeXBlOjpCUl9FRFJ9KTsKLSAgICByZXR1cm4gaGFuZGxlOwotICB9Ci0gIHJldHVybiBrUmVzZXJ2ZWRIYW5kbGU7Ci19Ci0KLXVpbnQxNl90IEFjbENvbm5lY3Rpb25IYW5kbGVyOjpDcmVhdGVMZUNvbm5lY3Rpb24oQWRkcmVzc1dpdGhUeXBlIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NXaXRoVHlwZSBvd25fYWRkcikgewotICBpZiAoQ2FuY2VsUGVuZGluZ0xlQ29ubmVjdGlvbihhZGRyKSkgewotICAgIHVpbnQxNl90IGhhbmRsZSA9IEdldFVudXNlZEhhbmRsZSgpOwotICAgIGFjbF9jb25uZWN0aW9uc18uZW1wbGFjZSgKLSAgICAgICAgaGFuZGxlLCBBY2xDb25uZWN0aW9ue2FkZHIsIG93bl9hZGRyLCBQaHk6OlR5cGU6OkxPV19FTkVSR1l9KTsKLSAgICByZXR1cm4gaGFuZGxlOwotICB9Ci0gIHJldHVybiBrUmVzZXJ2ZWRIYW5kbGU7Ci19Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkRpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlKSB7Ci0gIHJldHVybiBhY2xfY29ubmVjdGlvbnNfLmVyYXNlKGhhbmRsZSkgPiAwOwotfQotCi11aW50MTZfdCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6R2V0SGFuZGxlKEFkZHJlc3NXaXRoVHlwZSBhZGRyKSBjb25zdCB7Ci0gIGZvciAoYXV0byBwYWlyIDogYWNsX2Nvbm5lY3Rpb25zXykgewotICAgIGlmIChzdGQ6OmdldDxBY2xDb25uZWN0aW9uPihwYWlyKS5HZXRBZGRyZXNzKCkgPT0gYWRkcikgewotICAgICAgcmV0dXJuIHN0ZDo6Z2V0PDA+KHBhaXIpOwotICAgIH0KLSAgfQotICByZXR1cm4ga1Jlc2VydmVkSGFuZGxlOwotfQotCi11aW50MTZfdCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6R2V0SGFuZGxlT25seUFkZHJlc3MoCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcikgY29uc3QgewotICBmb3IgKGF1dG8gcGFpciA6IGFjbF9jb25uZWN0aW9uc18pIHsKLSAgICBpZiAoc3RkOjpnZXQ8QWNsQ29ubmVjdGlvbj4ocGFpcikuR2V0QWRkcmVzcygpLkdldEFkZHJlc3MoKSA9PSBhZGRyKSB7Ci0gICAgICByZXR1cm4gc3RkOjpnZXQ8MD4ocGFpcik7Ci0gICAgfQotICB9Ci0gIHJldHVybiBrUmVzZXJ2ZWRIYW5kbGU7Ci19Ci0KLUFkZHJlc3NXaXRoVHlwZSBBY2xDb25uZWN0aW9uSGFuZGxlcjo6R2V0QWRkcmVzcyh1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgQVNTRVJUX0xPRyhIYXNIYW5kbGUoaGFuZGxlKSwgIkhhbmRsZSB1bmtub3duICVoZCIsIGhhbmRsZSk7Ci0gIHJldHVybiBhY2xfY29ubmVjdGlvbnNfLmF0KGhhbmRsZSkuR2V0QWRkcmVzcygpOwotfQotCi1BZGRyZXNzV2l0aFR5cGUgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkdldE93bkFkZHJlc3ModWludDE2X3QgaGFuZGxlKSBjb25zdCB7Ci0gIEFTU0VSVF9MT0coSGFzSGFuZGxlKGhhbmRsZSksICJIYW5kbGUgdW5rbm93biAlaGQiLCBoYW5kbGUpOwotICByZXR1cm4gYWNsX2Nvbm5lY3Rpb25zXy5hdChoYW5kbGUpLkdldE93bkFkZHJlc3MoKTsKLX0KLQotdm9pZCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6RW5jcnlwdCh1aW50MTZfdCBoYW5kbGUpIHsKLSAgaWYgKCFIYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHJldHVybjsKLSAgfQotICBhY2xfY29ubmVjdGlvbnNfLmF0KGhhbmRsZSkuRW5jcnlwdCgpOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpJc0VuY3J5cHRlZCh1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgaWYgKCFIYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gYWNsX2Nvbm5lY3Rpb25zXy5hdChoYW5kbGUpLklzRW5jcnlwdGVkKCk7Ci19Ci0KLXZvaWQgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OlNldEFkZHJlc3ModWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcykgewotICBpZiAoIUhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gY29ubmVjdGlvbiA9IGFjbF9jb25uZWN0aW9uc18uYXQoaGFuZGxlKTsKLSAgY29ubmVjdGlvbi5TZXRBZGRyZXNzKGFkZHJlc3MpOwotfQotCi1QaHk6OlR5cGUgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkdldFBoeVR5cGUodWludDE2X3QgaGFuZGxlKSBjb25zdCB7Ci0gIGlmICghSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICByZXR1cm4gUGh5OjpUeXBlOjpCUl9FRFI7Ci0gIH0KLSAgcmV0dXJuIGFjbF9jb25uZWN0aW9uc18uYXQoaGFuZGxlKS5HZXRQaHlUeXBlKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OmhjaTo6TGVTZXRDaWdQYXJhbWV0ZXJzQ29tcGxldGVCdWlsZGVyPgotQWNsQ29ubmVjdGlvbkhhbmRsZXI6OlNldENpZ1BhcmFtZXRlcnMoCi0gICAgdWludDhfdCBpZCwgdWludDMyX3Qgc2R1X2ludGVydmFsX21fdG9fcywgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICBibHVldG9vdGg6OmhjaTo6Q2xvY2tBY2N1cmFjeSAvKiBhY2N1cmFjeSAqLywKLSAgICBibHVldG9vdGg6OmhjaTo6UGFja2luZyBwYWNraW5nLCBibHVldG9vdGg6OmhjaTo6RW5hYmxlIGZyYW1lZCwKLSAgICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zXywKLSAgICB1aW50MTZfdCBtYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tXywKLSAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6Q2lzUGFyYW1ldGVyc0NvbmZpZz4mIHN0cmVhbXMpIHsKLSAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGhhbmRsZXM7Ci0gIEdyb3VwUGFyYW1ldGVycyBncm91cF9wYXJhbWV0ZXJzewotICAgICAgLmlkID0gaWQsCi0gICAgICAuc2R1X2ludGVydmFsX21fdG9fcyA9IHNkdV9pbnRlcnZhbF9tX3RvX3MsCi0gICAgICAuc2R1X2ludGVydmFsX3NfdG9fbSA9IHNkdV9pbnRlcnZhbF9zX3RvX20sCi0gICAgICAuaW50ZXJsZWF2ZWQgPSBwYWNraW5nID09IGJsdWV0b290aDo6aGNpOjpQYWNraW5nOjpJTlRFUkxFQVZFRCwKLSAgICAgIC5mcmFtZWQgPSBmcmFtZWQgPT0gYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZTo6RU5BQkxFRCwKLSAgICAgIC5tYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zID0gbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fc18sCi0gICAgICAubWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSA9IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX21ffTsKLSAgc3RkOjp2ZWN0b3I8U3RyZWFtUGFyYW1ldGVycz4gc3RyZWFtX3BhcmFtZXRlcnM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgIGF1dG8gaGFuZGxlID0gR2V0VW51c2VkSGFuZGxlKCk7Ci0gICAgU3RyZWFtUGFyYW1ldGVycyBhey5ncm91cF9pZCA9IGdyb3VwX3BhcmFtZXRlcnMuaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW1faWQgPSBzdHJlYW1zW2ldLmNpc19pZF8sCi0gICAgICAgICAgICAgICAgICAgICAgIC5tYXhfc2R1X21fdG9fcyA9IHN0cmVhbXNbaV0ubWF4X3NkdV9tX3RvX3NfLAotICAgICAgICAgICAgICAgICAgICAgICAubWF4X3NkdV9zX3RvX20gPSBzdHJlYW1zW2ldLm1heF9zZHVfc190b19tXywKLSAgICAgICAgICAgICAgICAgICAgICAgLnJ0bl9tX3RvX3MgPSBzdHJlYW1zW2ldLnJ0bl9tX3RvX3NfLAotICAgICAgICAgICAgICAgICAgICAgICAucnRuX3NfdG9fbSA9IHN0cmVhbXNbaV0ucnRuX3NfdG9fbV8sCi0gICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBoYW5kbGV9OwotICAgIGhhbmRsZXMucHVzaF9iYWNrKGhhbmRsZSk7Ci0gICAgc3RyZWFtX3BhcmFtZXRlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShhKSk7Ci0gIH0KLQotICByZXR1cm4gaXNvY2hyb25vdXNfY29ubmVjdGlvbl9oYW5kbGVyXy5TZXRDaWdQYXJhbWV0ZXJzKAotICAgICAgZ3JvdXBfcGFyYW1ldGVycywgc3RyZWFtX3BhcmFtZXRlcnMsIHN0ZDo6bW92ZShoYW5kbGVzKSk7Ci19Ci0KLXZvaWQgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkNyZWF0ZVBlbmRpbmdDaXMoCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkNyZWF0ZUNpc0NvbmZpZyBjb25maWcpIHsKLSAgQ2lzSGFuZGxlcyBoYW5kbGVzOwotICBoYW5kbGVzLmNpc19oYW5kbGVfID0gY29uZmlnLmNpc19jb25uZWN0aW9uX2hhbmRsZV87Ci0gIGhhbmRsZXMuYWNsX2hhbmRsZV8gPSBjb25maWcuYWNsX2Nvbm5lY3Rpb25faGFuZGxlXzsKLSAgaGFuZGxlcy5yZW1vdGVfY2lzX2hhbmRsZV8gPSBrUmVzZXJ2ZWRIYW5kbGU7Ci0gIHBlbmRpbmdfc3RyZWFtc18uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShoYW5kbGVzKSk7Ci19Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkNvbm5lY3RDaXModWludDE2X3QgaGFuZGxlKSB7Ci0gIHNpemVfdCBwb3NpdGlvbjsKLSAgQ2lzSGFuZGxlcyBjb25uZWN0aW9uOwotICBmb3IgKHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBwZW5kaW5nX3N0cmVhbXNfLnNpemUoKTsgcG9zaXRpb24rKykgewotICAgIGlmIChoYW5kbGUgPT0gcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl0uY2lzX2hhbmRsZV8pIHsKLSAgICAgIExPR19JTkZPKCJGb3VuZCBoYW5kbGUgMHglMDRoeCIsIGhhbmRsZSk7Ci0gICAgICBjb25uZWN0aW9uID0gcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl07Ci0gICAgICBwZW5kaW5nX3N0cmVhbXNfLmVyYXNlKHBlbmRpbmdfc3RyZWFtc18uYmVnaW4oKSArIHBvc2l0aW9uKTsKLSAgICAgIGNvbm5lY3RlZF9zdHJlYW1zXy5wdXNoX2JhY2soY29ubmVjdGlvbik7Ci0gICAgICBBU1NFUlQoY29ubmVjdGlvbi5jaXNfaGFuZGxlXyAhPSBrUmVzZXJ2ZWRIYW5kbGUpOwotICAgICAgQVNTRVJUKGNvbm5lY3Rpb24uYWNsX2hhbmRsZV8gIT0ga1Jlc2VydmVkSGFuZGxlKTsKLSAgICAgIEFTU0VSVChjb25uZWN0aW9uLnJlbW90ZV9jaXNfaGFuZGxlXyAhPSBrUmVzZXJ2ZWRIYW5kbGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgTE9HX0lORk8oIk5vIHBlbmRpbmcgQ0lTIGNvbm5lY3Rpb24gd2l0aCBoYW5kbGUgMHglMDRoeCIsIGhhbmRsZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBY2xDb25uZWN0aW9uSGFuZGxlcjo6U2V0UmVtb3RlQ2lzSGFuZGxlKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCByZW1vdGVfaGFuZGxlKSB7Ci0gIGZvciAoc2l6ZV90IHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBwZW5kaW5nX3N0cmVhbXNfLnNpemUoKTsgcG9zaXRpb24rKykgewotICAgIGlmIChoYW5kbGUgPT0gcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl0uY2lzX2hhbmRsZV8pIHsKLSAgICAgIExPR19JTkZPKCJBZGRlZCByZW1vdGUgaGFuZGxlIDB4JTA0aHggdG8gaGFuZGxlIDB4JTA0aHgiLCByZW1vdGVfaGFuZGxlLAotICAgICAgICAgICAgICAgcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl0uY2lzX2hhbmRsZV8pOwotICAgICAgcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl0ucmVtb3RlX2Npc19oYW5kbGVfID0gcmVtb3RlX2hhbmRsZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgTE9HX0lORk8oIkNvdWxkbid0IGZpbmQgQ0lTIGNvbm5lY3Rpb24gd2l0aCBoYW5kbGUgMHglMDRoeCIsIGhhbmRsZSk7Ci19Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OlJlamVjdENpcyh1aW50MTZfdCBoYW5kbGUpIHsKLSAgc2l6ZV90IHBvc2l0aW9uOwotICBmb3IgKHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBwZW5kaW5nX3N0cmVhbXNfLnNpemUoKTsgcG9zaXRpb24rKykgewotICAgIGlmIChoYW5kbGUgPT0gcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl0uY2lzX2hhbmRsZV8pIHsKLSAgICAgIHBlbmRpbmdfc3RyZWFtc18uZXJhc2UocGVuZGluZ19zdHJlYW1zXy5iZWdpbigpICsgcG9zaXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChwb3NpdGlvbiA9PSBwZW5kaW5nX3N0cmVhbXNfLnNpemUoKSkgewotICAgIExPR19JTkZPKCJObyBwZW5kaW5nIGNvbm5lY3Rpb24gd2l0aCBoYW5kbGUgMHglaHgiLCBoYW5kbGUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDE2X3QgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkdldFBlbmRpbmdBY2xIYW5kbGUodWludDE2X3QgY2lzX2hhbmRsZSkgY29uc3QgewotICBzaXplX3QgcG9zaXRpb247Ci0gIHVpbnQxNl90IGhhbmRsZSA9IDB4ZmZmZjsKLSAgZm9yIChwb3NpdGlvbiA9IDA7IHBvc2l0aW9uIDwgcGVuZGluZ19zdHJlYW1zXy5zaXplKCk7IHBvc2l0aW9uKyspIHsKLSAgICBpZiAoY2lzX2hhbmRsZSA9PSBwZW5kaW5nX3N0cmVhbXNfW3Bvc2l0aW9uXS5jaXNfaGFuZGxlXykgewotICAgICAgaGFuZGxlID0gcGVuZGluZ19zdHJlYW1zX1twb3NpdGlvbl0uYWNsX2hhbmRsZV87Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHBvc2l0aW9uID09IHBlbmRpbmdfc3RyZWFtc18uc2l6ZSgpKSB7Ci0gICAgTE9HX0lORk8oIk5vIHBlbmRpbmcgY29ubmVjdGlvbiB3aXRoIGhhbmRsZSAweCVoeCIsIGNpc19oYW5kbGUpOwotICB9Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkRpc2Nvbm5lY3RDaXModWludDE2X3QgY2lzX2hhbmRsZSkgewotICBzaXplX3QgcG9zaXRpb247Ci0gIGZvciAocG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IGNvbm5lY3RlZF9zdHJlYW1zXy5zaXplKCk7IHBvc2l0aW9uKyspIHsKLSAgICBpZiAoY2lzX2hhbmRsZSA9PSBjb25uZWN0ZWRfc3RyZWFtc19bcG9zaXRpb25dLmNpc19oYW5kbGVfKSB7Ci0gICAgICBjb25uZWN0ZWRfc3RyZWFtc18uZXJhc2UoY29ubmVjdGVkX3N0cmVhbXNfLmJlZ2luKCkgKyBwb3NpdGlvbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHBvc2l0aW9uID09IGNvbm5lY3RlZF9zdHJlYW1zXy5zaXplKCkpIHsKLSAgICBMT0dfSU5GTygiTm8gY29ubmVjdGVkIHN0cmVhbSAweCVoeCIsIGNpc19oYW5kbGUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYmx1ZXRvb3RoOjpoY2k6OkVycm9yQ29kZSBBY2xDb25uZWN0aW9uSGFuZGxlcjo6UmVtb3ZlQ2lnKHVpbnQ4X3QgY2lnX2lkKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogY29ubmVjdGVkX3N0cmVhbXNfKSB7Ci0gICAgaWYgKGlzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlcl8uR2V0R3JvdXBJZChzdHJlYW0uY2lzX2hhbmRsZV8pID09Ci0gICAgICAgIGNpZ19pZCkgewotICAgICAgcmV0dXJuIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLSAgICB9Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBwZW5kaW5nX3N0cmVhbXNfKSB7Ci0gICAgaWYgKGlzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlcl8uR2V0R3JvdXBJZChzdHJlYW0uY2lzX2hhbmRsZV8pID09Ci0gICAgICAgIGNpZ19pZCkgewotICAgICAgcmV0dXJuIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLSAgICB9Ci0gIH0KLSAgYXV0byBzdGF0dXMgPSBpc29jaHJvbm91c19jb25uZWN0aW9uX2hhbmRsZXJfLlJlbW92ZUNpZyhjaWdfaWQpOwotICBpZiAoc3RhdHVzID09IGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGU6OlNVQ0NFU1MpIHsKLSAgICAvLyBDbGVhbiB1cD8KLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpIYXNQZW5kaW5nQ2lzQ29ubmVjdGlvbih1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgZm9yIChjb25zdCBhdXRvJiBjb25maWcgOiBwZW5kaW5nX3N0cmVhbXNfKSB7Ci0gICAgaWYgKGNvbmZpZy5jaXNfaGFuZGxlXyA9PSBoYW5kbGUpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQWNsQ29ubmVjdGlvbkhhbmRsZXI6Okhhc1BlbmRpbmdDaXMoKSBjb25zdCB7Ci0gIHJldHVybiAhcGVuZGluZ19zdHJlYW1zXy5lbXB0eSgpOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpIYXNDb25uZWN0ZWRDaXModWludDE2X3QgaGFuZGxlKSBjb25zdCB7Ci0gIGZvciAoY29uc3QgYXV0byYgY3MgOiBjb25uZWN0ZWRfc3RyZWFtc18pIHsKLSAgICBpZiAoaGFuZGxlID09IGNzLmNpc19oYW5kbGVfKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpIYXNDaXNIYW5kbGUodWludDE2X3QgaGFuZGxlKSBjb25zdCB7Ci0gIGZvciAoY29uc3QgYXV0byYgY3MgOiBwZW5kaW5nX3N0cmVhbXNfKSB7Ci0gICAgaWYgKGhhbmRsZSA9PSBjcy5jaXNfaGFuZGxlXykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgY3MgOiBjb25uZWN0ZWRfc3RyZWFtc18pIHsKLSAgICBpZiAoaGFuZGxlID09IGNzLmNpc19oYW5kbGVfKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlcl8uSGFzSGFuZGxlKGhhbmRsZSk7Ci19Ci0KLXVpbnQxNl90IEFjbENvbm5lY3Rpb25IYW5kbGVyOjpHZXRBY2xIYW5kbGVGb3JDaXNIYW5kbGUoCi0gICAgdWludDE2X3QgY2lzX2hhbmRsZSkgY29uc3QgewotICBmb3IgKGNvbnN0IGF1dG8mIGNzIDogY29ubmVjdGVkX3N0cmVhbXNfKSB7Ci0gICAgaWYgKGNpc19oYW5kbGUgPT0gY3MuY2lzX2hhbmRsZV8pIHsKLSAgICAgIHJldHVybiBjcy5hY2xfaGFuZGxlXzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGtSZXNlcnZlZEhhbmRsZTsKLX0KLQotdWludDE2X3QgQWNsQ29ubmVjdGlvbkhhbmRsZXI6OkdldFJlbW90ZUNpc0hhbmRsZUZvckNpc0hhbmRsZSgKLSAgICB1aW50MTZfdCBjaXNfaGFuZGxlKSBjb25zdCB7Ci0gIGZvciAoY29uc3QgYXV0byYgY3MgOiBjb25uZWN0ZWRfc3RyZWFtc18pIHsKLSAgICBpZiAoY2lzX2hhbmRsZSA9PSBjcy5jaXNfaGFuZGxlXykgewotICAgICAgcmV0dXJuIGNzLnJlbW90ZV9jaXNfaGFuZGxlXzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGtSZXNlcnZlZEhhbmRsZTsKLX0KLQotR3JvdXBQYXJhbWV0ZXJzIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpHZXRHcm91cFBhcmFtZXRlcnModWludDhfdCBpZCkgY29uc3QgewotICByZXR1cm4gaXNvY2hyb25vdXNfY29ubmVjdGlvbl9oYW5kbGVyXy5HZXRHcm91cFBhcmFtZXRlcnMoaWQpOwotfQotCi1TdHJlYW1QYXJhbWV0ZXJzIEFjbENvbm5lY3Rpb25IYW5kbGVyOjpHZXRTdHJlYW1QYXJhbWV0ZXJzKAotICAgIHVpbnQxNl90IGhhbmRsZSkgY29uc3QgewotICByZXR1cm4gaXNvY2hyb25vdXNfY29ubmVjdGlvbl9oYW5kbGVyXy5HZXRTdHJlYW1QYXJhbWV0ZXJzKGhhbmRsZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2FjbF9jb25uZWN0aW9uX2hhbmRsZXIuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2FjbF9jb25uZWN0aW9uX2hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYTAzYy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9hY2xfY29ubmVjdGlvbl9oYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAiYWNsX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9hZGRyZXNzX3dpdGhfdHlwZS5oIgotI2luY2x1ZGUgImlzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlci5oIgotI2luY2x1ZGUgInBoeS5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLXN0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga1Jlc2VydmVkSGFuZGxlID0gMHhGMDA7Ci0KLWNsYXNzIEFjbENvbm5lY3Rpb25IYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIEFjbENvbm5lY3Rpb25IYW5kbGVyKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgfkFjbENvbm5lY3Rpb25IYW5kbGVyKCkgPSBkZWZhdWx0OwotCi0gIGJvb2wgQ3JlYXRlUGVuZGluZ0Nvbm5lY3Rpb24oYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dGhlbnRpY2F0ZV9vbl9jb25uZWN0KTsKLSAgYm9vbCBIYXNQZW5kaW5nQ29ubmVjdGlvbihibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyKSBjb25zdDsKLSAgYm9vbCBDYW5jZWxQZW5kaW5nQ29ubmVjdGlvbihibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyKTsKLSAgYm9vbCBBdXRoZW50aWNhdGVQZW5kaW5nQ29ubmVjdGlvbigpIGNvbnN0OwotCi0gIGJvb2wgQ3JlYXRlUGVuZGluZ0xlQ29ubmVjdGlvbihibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIGFkZHIpOwotICBib29sIEhhc1BlbmRpbmdMZUNvbm5lY3Rpb24oYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyKSBjb25zdDsKLSAgYm9vbCBDYW5jZWxQZW5kaW5nTGVDb25uZWN0aW9uKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcik7Ci0KLSAgdWludDE2X3QgQ3JlYXRlQ29ubmVjdGlvbihibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIG93bl9hZGRyKTsKLSAgdWludDE2X3QgQ3JlYXRlTGVDb25uZWN0aW9uKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgb3duX2FkZHIpOwotICBib29sIERpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlKTsKLSAgYm9vbCBIYXNIYW5kbGUodWludDE2X3QgaGFuZGxlKSBjb25zdDsKLQotICB1aW50MTZfdCBHZXRIYW5kbGUoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyKSBjb25zdDsKLSAgdWludDE2X3QgR2V0SGFuZGxlT25seUFkZHJlc3MoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3MgYWRkcikgY29uc3Q7Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgR2V0QWRkcmVzcyh1aW50MTZfdCBoYW5kbGUpIGNvbnN0OwotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldE93bkFkZHJlc3ModWludDE2X3QgaGFuZGxlKSBjb25zdDsKLQotICB2b2lkIEVuY3J5cHQodWludDE2X3QgaGFuZGxlKTsKLSAgYm9vbCBJc0VuY3J5cHRlZCh1aW50MTZfdCBoYW5kbGUpIGNvbnN0OwotCi0gIHZvaWQgU2V0QWRkcmVzcyh1aW50MTZfdCBoYW5kbGUsIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcyk7Ci0KLSAgUGh5OjpUeXBlIEdldFBoeVR5cGUodWludDE2X3QgaGFuZGxlKSBjb25zdDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpoY2k6OkxlU2V0Q2lnUGFyYW1ldGVyc0NvbXBsZXRlQnVpbGRlcj4KLSAgU2V0Q2lnUGFyYW1ldGVycyh1aW50OF90IGlkLCB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNkdV9pbnRlcnZhbF9zX3RvX20sCi0gICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkNsb2NrQWNjdXJhY3kgYWNjdXJhY3ksCi0gICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlBhY2tpbmcgcGFja2luZywKLSAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6RW5hYmxlIGZyYW1pbmcsCi0gICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fc18sCi0gICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbV8sCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpoY2k6OkNpc1BhcmFtZXRlcnNDb25maWc+JiBzdHJlYW1zKTsKLQotICB2b2lkIENyZWF0ZVBlbmRpbmdDaXMoYmx1ZXRvb3RoOjpoY2k6OkNyZWF0ZUNpc0NvbmZpZyBjb25maWcpOwotCi0gIGJvb2wgQ29ubmVjdENpcyh1aW50MTZfdCBoYW5kbGUpOwotCi0gIHZvaWQgU2V0UmVtb3RlQ2lzSGFuZGxlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgcmVtb3RlX2hhbmRsZSk7Ci0KLSAgdWludDE2X3QgR2V0UGVuZGluZ0FjbEhhbmRsZSh1aW50MTZfdCBjaXNfaGFuZGxlKSBjb25zdDsKLQotICBib29sIFJlamVjdENpcyh1aW50MTZfdCBoYW5kbGUpOwotCi0gIGJvb2wgRGlzY29ubmVjdENpcyh1aW50MTZfdCBoYW5kbGUpOwotCi0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgUmVtb3ZlQ2lnKHVpbnQ4X3QgY2lnX2lkKTsKLQotICBib29sIEhhc1BlbmRpbmdDaXMoKSBjb25zdDsKLQotICBib29sIEhhc1BlbmRpbmdDaXNDb25uZWN0aW9uKHVpbnQxNl90IGhhbmRsZSkgY29uc3Q7Ci0KLSAgYm9vbCBIYXNDaXNIYW5kbGUodWludDE2X3QgaGFuZGxlKSBjb25zdDsKLQotICBib29sIEhhc0Nvbm5lY3RlZENpcyh1aW50MTZfdCBoYW5kbGUpIGNvbnN0OwotCi0gIHVpbnQxNl90IEdldEFjbEhhbmRsZUZvckNpc0hhbmRsZSh1aW50MTZfdCBjaXNfaGFuZGxlKSBjb25zdDsKLSAgdWludDE2X3QgR2V0UmVtb3RlQ2lzSGFuZGxlRm9yQ2lzSGFuZGxlKHVpbnQxNl90IGNpc19oYW5kbGUpIGNvbnN0OwotCi0gIFN0cmVhbVBhcmFtZXRlcnMgR2V0U3RyZWFtUGFyYW1ldGVycyh1aW50MTZfdCBoYW5kbGUpIGNvbnN0OwotICBHcm91cFBhcmFtZXRlcnMgR2V0R3JvdXBQYXJhbWV0ZXJzKHVpbnQ4X3QgaWQpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBBY2xDb25uZWN0aW9uPiBhY2xfY29ubmVjdGlvbnNfOwotICBib29sIGNsYXNzaWNfY29ubmVjdGlvbl9wZW5kaW5nX3tmYWxzZX07Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIHBlbmRpbmdfY29ubmVjdGlvbl9hZGRyZXNzX3sKLSAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOjprRW1wdHl9OwotICBib29sIGF1dGhlbnRpY2F0ZV9wZW5kaW5nX2NsYXNzaWNfY29ubmVjdGlvbl97ZmFsc2V9OwotICBib29sIGxlX2Nvbm5lY3Rpb25fcGVuZGluZ197ZmFsc2V9OwotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIHBlbmRpbmdfbGVfY29ubmVjdGlvbl9hZGRyZXNzX3sKLSAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOjprRW1wdHksCi0gICAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTU307Ci0KLSAgdWludDE2X3QgR2V0VW51c2VkSGFuZGxlKCk7Ci0gIHVpbnQxNl90IGxhc3RfaGFuZGxlX3trUmVzZXJ2ZWRIYW5kbGUgLSAyfTsKLSAgSXNvY2hyb25vdXNDb25uZWN0aW9uSGFuZGxlciBpc29jaHJvbm91c19jb25uZWN0aW9uX2hhbmRsZXJfOwotICBzdHJ1Y3QgQ2lzSGFuZGxlcyB7Ci0gICAgdWludDE2X3QgYWNsX2hhbmRsZV8gPSBrUmVzZXJ2ZWRIYW5kbGU7Ci0gICAgdWludDE2X3QgY2lzX2hhbmRsZV8gPSBrUmVzZXJ2ZWRIYW5kbGU7Ci0gICAgdWludDE2X3QgcmVtb3RlX2Npc19oYW5kbGVfID0ga1Jlc2VydmVkSGFuZGxlOwotICB9OwotICBzdGQ6OnZlY3RvcjxDaXNIYW5kbGVzPiBjb25uZWN0ZWRfc3RyZWFtc187Ci0gIHN0ZDo6dmVjdG9yPENpc0hhbmRsZXM+IHBlbmRpbmdfc3RyZWFtc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9jb25uZWN0ZWRfaXNvY2hyb25vdXNfZ3JvdXAuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2Nvbm5lY3RlZF9pc29jaHJvbm91c19ncm91cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2RmODBhLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2Nvbm5lY3RlZF9pc29jaHJvbm91c19ncm91cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1jbGFzcyBHcm91cFBhcmFtZXRlcnMgewotIHB1YmxpYzoKLSAgdWludDhfdCBpZDsKLSAgdWludDMyX3Qgc2R1X2ludGVydmFsX21fdG9fczsKLSAgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbTsKLSAgYm9vbCBpbnRlcmxlYXZlZDsKLSAgYm9vbCBmcmFtZWQ7Ci0gIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3M7Ci0gIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX207Ci19OwotCi1jbGFzcyBDb25uZWN0ZWRJc29jaHJvbm91c0dyb3VwIHsKLSBwdWJsaWM6Ci0gIENvbm5lY3RlZElzb2Nocm9ub3VzR3JvdXAoR3JvdXBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW0+IHN0cmVhbXMpCi0gICAgICA6IHBhcmFtZXRlcnNfKHBhcmFtZXRlcnMpLCBzdHJlYW1zXyhzdGQ6Om1vdmUoc3RyZWFtcykpIHt9Ci0KLSAgdmlydHVhbCB+Q29ubmVjdGVkSXNvY2hyb25vdXNHcm91cCgpID0gZGVmYXVsdDsKLQotICBib29sIEhhc0Nvbm5lY3RlZFN0cmVhbSgpIGNvbnN0IHsKLSAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IHN0cmVhbXNfKSB7Ci0gICAgICBpZiAoc3RyZWFtLklzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgU3RyZWFtSXNDb25uZWN0ZWQodWludDE2X3QgaGFuZGxlKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmVhbXNfLmF0KGhhbmRsZSkuSXNDb25uZWN0ZWQoKTsKLSAgfQotCi0gIGJvb2wgSGFzU3RyZWFtcygpIGNvbnN0IHsgcmV0dXJuICFzdHJlYW1zXy5lbXB0eSgpOyB9Ci0KLSAgR3JvdXBQYXJhbWV0ZXJzIEdldFBhcmFtZXRlcnMoKSBjb25zdCB7IHJldHVybiBwYXJhbWV0ZXJzXzsgfQotCi0gIFN0cmVhbVBhcmFtZXRlcnMgR2V0U3RyZWFtUGFyYW1ldGVycyh1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IHN0cmVhbXNfKSB7Ci0gICAgICBpZiAoc3RyZWFtLkdldEhhbmRsZSgpID09IGhhbmRsZSkgewotICAgICAgICByZXR1cm4gc3RyZWFtLkdldENvbmZpZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gU3RyZWFtUGFyYW1ldGVyc3t9OwotICB9Ci0KLSBwcml2YXRlOgotICBHcm91cFBhcmFtZXRlcnMgcGFyYW1ldGVyc187Ci0gIHN0ZDo6dmVjdG9yPENvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtPiBzdHJlYW1zXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW0uaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2Nvbm5lY3RlZF9pc29jaHJvbm91c19zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhODM5NC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIFN0cmVhbVBhcmFtZXRlcnMgewotIHB1YmxpYzoKLSAgdWludDhfdCBncm91cF9pZDsKLSAgdWludDhfdCBzdHJlYW1faWQ7Ci0gIHVpbnQxNl90IG1heF9zZHVfbV90b19zOwotICB1aW50MTZfdCBtYXhfc2R1X3NfdG9fbTsKLSAgdWludDhfdCBydG5fbV90b19zOwotICB1aW50OF90IHJ0bl9zX3RvX207Ci0gIHVpbnQxNl90IGhhbmRsZTsKLX07Ci0KLWNsYXNzIENvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIENvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtKFN0cmVhbVBhcmFtZXRlcnMmIHN0cmVhbV9wYXJhbSkKLSAgICAgIDogY29uZmlnXyhzdHJlYW1fcGFyYW0pIHt9Ci0KLSAgdmlydHVhbCB+Q29ubmVjdGVkSXNvY2hyb25vdXNTdHJlYW0oKSA9IGRlZmF1bHQ7Ci0KLSAgYm9vbCBJc0Nvbm5lY3RlZCgpIGNvbnN0IHsgcmV0dXJuIGlzX2Nvbm5lY3RlZF87IH0KLSAgU3RyZWFtUGFyYW1ldGVycyBHZXRDb25maWcoKSBjb25zdCB7IHJldHVybiBjb25maWdfOyB9Ci0KLSAgdWludDE2X3QgR2V0SGFuZGxlKCkgY29uc3QgeyByZXR1cm4gY29uZmlnXy5oYW5kbGU7IH0KLSAgdm9pZCBDb25uZWN0KCkgeyBpc19jb25uZWN0ZWRfID0gdHJ1ZTsgfQotCi0gIHZvaWQgRGlzY29ubmVjdCgpIHsgaXNfY29ubmVjdGVkXyA9IGZhbHNlOyB9Ci0KLSBwcml2YXRlOgotICBib29sIGlzX2Nvbm5lY3RlZF97ZmFsc2V9OwotICBTdHJlYW1QYXJhbWV0ZXJzIGNvbmZpZ187Ci19OwotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvZHVhbF9tb2RlX2NvbnRyb2xsZXIuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9kdWFsX21vZGVfY29udHJvbGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkM2ZjNS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9kdWFsX21vZGVfY29udHJvbGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImR1YWxfbW9kZV9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8cmFuZG9tPgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLW5hbWVzcGFjZSBnZF9oY2kgPSA6OmJsdWV0b290aDo6aGNpOwotdXNpbmcgZ2RfaGNpOjpFcnJvckNvZGU7Ci11c2luZyBnZF9oY2k6Okxvb3BiYWNrTW9kZTsKLXVzaW5nIGdkX2hjaTo6T3BDb2RlOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotY29uc3RleHByIGNoYXIgRHVhbE1vZGVDb250cm9sbGVyOjprQ29udHJvbGxlclByb3BlcnRpZXNGaWxlW107Ci1jb25zdGV4cHIgdWludDE2X3QgRHVhbE1vZGVDb250cm9sbGVyOjprU2VjdXJpdHlNYW5hZ2VyTnVtS2V5czsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTnVtQ29tbWFuZFBhY2tldHMgPSAweDAxOwotY29uc3RleHByIHVpbnQxNl90IGtMZU1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGggPSAyNTY7Ci1jb25zdGV4cHIgdWludDE2X3Qga0xlTWF4aW11bURhdGFMZW5ndGggPSA2NDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrTGVNYXhpbXVtRGF0YVRpbWUgPSAweDE0ODsKLQotLy8gRGV2aWNlIG1ldGhvZHMuCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6SW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMikgcmV0dXJuOwotCi0gIEFkZHJlc3MgYWRkcnt9OwotICBpZiAoQWRkcmVzczo6RnJvbVN0cmluZyhhcmdzWzFdLCBhZGRyKSkgewotICAgIHByb3BlcnRpZXNfLlNldEFkZHJlc3MoYWRkcik7Ci0gIH0gZWxzZSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBhZGRyZXNzOiAlcyIsIGFyZ3NbMV0uY19zdHIoKSk7Ci0gIH0KLX07Ci0KLXN0ZDo6c3RyaW5nIER1YWxNb2RlQ29udHJvbGxlcjo6R2V0VHlwZVN0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICJTaW11bGF0ZWQgQmx1ZXRvb3RoIENvbnRyb2xsZXIiOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6SW5jb21pbmdQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5JbmNvbWluZ1BhY2tldChpbmNvbWluZyk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpUaW1lclRpY2soKSB7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uVGltZXJUaWNrKCk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpTZW5kQ29tbWFuZENvbXBsZXRlVW5rbm93bk9wQ29kZUV2ZW50KHVpbnQxNl90IGNvbW1hbmRfb3Bjb2RlKSBjb25zdCB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcmF3X2J1aWxkZXJfcHRyID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KCk7Ci0gIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMShrTnVtQ29tbWFuZFBhY2tldHMpOwotICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czIoY29tbWFuZF9vcGNvZGUpOwotICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQpKTsKLQotICBhdXRvIHBhY2tldCA9IGdkX2hjaTo6RXZlbnRCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkV2ZW50Q29kZTo6Q09NTUFORF9DT01QTEVURSwgc3RkOjptb3ZlKHJhd19idWlsZGVyX3B0cikpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLUR1YWxNb2RlQ29udHJvbGxlcjo6RHVhbE1vZGVDb250cm9sbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0aWVzX2ZpbGVuYW1lLCB1aW50MTZfdCBudW1fa2V5cykKLSAgICA6IERldmljZShwcm9wZXJ0aWVzX2ZpbGVuYW1lKSwgc2VjdXJpdHlfbWFuYWdlcl8obnVtX2tleXMpIHsKLSAgbG9vcGJhY2tfbW9kZV8gPSBMb29wYmFja01vZGU6Ok5PX0xPT1BCQUNLOwotCi0gIEFkZHJlc3MgcHVibGljX2FkZHJlc3N7fTsKLSAgQVNTRVJUKEFkZHJlc3M6OkZyb21TdHJpbmcoIjNDOjVBOkI0OjA0OjA1OjA2IiwgcHVibGljX2FkZHJlc3MpKTsKLSAgcHJvcGVydGllc18uU2V0QWRkcmVzcyhwdWJsaWNfYWRkcmVzcyk7Ci0KLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5SZWdpc3RlclJlbW90ZUNoYW5uZWwoCi0gICAgICBbdGhpc10oc3RkOjpzaGFyZWRfcHRyPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiBwYWNrZXQsCi0gICAgICAgICAgICAgUGh5OjpUeXBlIHBoeV90eXBlKSB7Ci0gICAgICAgIER1YWxNb2RlQ29udHJvbGxlcjo6U2VuZExpbmtMYXllclBhY2tldChwYWNrZXQsIHBoeV90eXBlKTsKLSAgICAgIH0pOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgNjQ+IHN1cHBvcnRlZF9jb21tYW5kczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0gICAgc3VwcG9ydGVkX2NvbW1hbmRzW2ldID0gMDsKLSAgfQotCi0jZGVmaW5lIFNFVF9IQU5ETEVSKG5hbWUsIG1ldGhvZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBhY3RpdmVfaGNpX2NvbW1hbmRzX1tPcENvZGU6Om5hbWVdID0gW3RoaXNdKENvbW1hbmRWaWV3IHBhcmFtKSB7IFwKLSAgICBtZXRob2Qoc3RkOjptb3ZlKHBhcmFtKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgU0VUX1NVUFBPUlRFRChuYW1lLCBtZXRob2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0VUX0hBTkRMRVIobmFtZSwgbWV0aG9kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50MTZfdCBpbmRleCA9ICh1aW50MTZfdClibHVldG9vdGg6OmhjaTo6T3BDb2RlSW5kZXg6Om5hbWU7ICAgICAgICAgIFwKLSAgICB1aW50MTZfdCBieXRlX2luZGV4ID0gaW5kZXggLyAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50OF90IGJpdCA9IDEgPDwgKGluZGV4ICUgMTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdXBwb3J0ZWRfY29tbWFuZHNbYnl0ZV9pbmRleF0gPSBzdXBwb3J0ZWRfY29tbWFuZHNbYnl0ZV9pbmRleF0gfCBiaXQ7IFwKLSAgfQotCi0gIFNFVF9TVVBQT1JURUQoUkVTRVQsIFJlc2V0KTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX0JVRkZFUl9TSVpFLCBSZWFkQnVmZmVyU2l6ZSk7Ci0gIFNFVF9TVVBQT1JURUQoSE9TVF9CVUZGRVJfU0laRSwgSG9zdEJ1ZmZlclNpemUpOwotICBTRVRfU1VQUE9SVEVEKFNOSUZGX1NVQlJBVElORywgU25pZmZTdWJyYXRpbmcpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfRU5DUllQVElPTl9LRVlfU0laRSwgUmVhZEVuY3J5cHRpb25LZXlTaXplKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT04sIFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbik7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9CRF9BRERSLCBSZWFkQmRBZGRyKTsKLSAgU0VUX0hBTkRMRVIoUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFMsIFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUywgUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfTE9DQUxfU1VQUE9SVEVEX0NPREVDU19WMSwgUmVhZExvY2FsU3VwcG9ydGVkQ29kZWNzKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX0xPQ0FMX0VYVEVOREVEX0ZFQVRVUkVTLCBSZWFkTG9jYWxFeHRlbmRlZEZlYXR1cmVzKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUywgUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXMpOwotICBTRVRfU1VQUE9SVEVEKFNXSVRDSF9ST0xFLCBTd2l0Y2hSb2xlKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVMsIFJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9DTE9DS19PRkZTRVQsIFJlYWRDbG9ja09mZnNldCk7Ci0gIFNFVF9TVVBQT1JURUQoSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZLCBJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFksIFVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFVTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksCi0gICAgICAgICAgICAgICAgVXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5KTsKLSAgU0VUX1NVUFBPUlRFRChVU0VSX1BBU1NLRVlfUkVRVUVTVF9SRVBMWSwgVXNlclBhc3NrZXlSZXF1ZXN0UmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFVTRVJfUEFTU0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLAotICAgICAgICAgICAgICAgIFVzZXJQYXNza2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFBJTl9DT0RFX1JFUVVFU1RfUkVQTFksIFBpbkNvZGVSZXF1ZXN0UmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFBJTl9DT0RFX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksIFBpbkNvZGVSZXF1ZXN0TmVnYXRpdmVSZXBseSk7Ci0gIFNFVF9TVVBQT1JURUQoUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFksIFJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFJFTU9URV9PT0JfREFUQV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLAotICAgICAgICAgICAgICAgIFJlbW90ZU9vYkRhdGFSZXF1ZXN0TmVnYXRpdmVSZXBseSk7Ci0gIFNFVF9TVVBQT1JURUQoSU9fQ0FQQUJJTElUWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLAotICAgICAgICAgICAgICAgIElvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5KTsKLSAgU0VUX1NVUFBPUlRFRChSRU1PVEVfT09CX0VYVEVOREVEX0RBVEFfUkVRVUVTVF9SRVBMWSwKLSAgICAgICAgICAgICAgICBSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfSU5RVUlSWV9SRVNQT05TRV9UUkFOU01JVF9QT1dFUl9MRVZFTCwKLSAgICAgICAgICAgICAgICBSZWFkSW5xdWlyeVJlc3BvbnNlVHJhbnNtaXRQb3dlckxldmVsKTsKLSAgU0VUX1NVUFBPUlRFRChTRU5EX0tFWVBSRVNTX05PVElGSUNBVElPTiwgU2VuZEtleXByZXNzTm90aWZpY2F0aW9uKTsKLSAgU0VUX0hBTkRMRVIoU0VUX0VWRU5UX01BU0tfUEFHRV8yLCBTZXRFdmVudE1hc2tQYWdlMik7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9MT0NBTF9PT0JfREFUQSwgUmVhZExvY2FsT29iRGF0YSk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9MT0NBTF9PT0JfRVhURU5ERURfREFUQSwgUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhKTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9TSU1QTEVfUEFJUklOR19NT0RFLCBXcml0ZVNpbXBsZVBhaXJpbmdNb2RlKTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9MRV9IT1NUX1NVUFBPUlQsIFdyaXRlTGVIb3N0U3VwcG9ydCk7Ci0gIFNFVF9TVVBQT1JURUQoV1JJVEVfU0VDVVJFX0NPTk5FQ1RJT05TX0hPU1RfU1VQUE9SVCwKLSAgICAgICAgICAgICAgICBXcml0ZVNlY3VyZUNvbm5lY3Rpb25zSG9zdFN1cHBvcnQpOwotICBTRVRfU1VQUE9SVEVEKFNFVF9FVkVOVF9NQVNLLCBTZXRFdmVudE1hc2spOwotICBTRVRfU1VQUE9SVEVEKFJFQURfSU5RVUlSWV9NT0RFLCBSZWFkSW5xdWlyeU1vZGUpOwotICBTRVRfU1VQUE9SVEVEKFdSSVRFX0lOUVVJUllfTU9ERSwgV3JpdGVJbnF1aXJ5TW9kZSk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9QQUdFX1NDQU5fVFlQRSwgUmVhZFBhZ2VTY2FuVHlwZSk7Ci0gIFNFVF9TVVBQT1JURUQoV1JJVEVfUEFHRV9TQ0FOX1RZUEUsIFdyaXRlUGFnZVNjYW5UeXBlKTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9JTlFVSVJZX1NDQU5fVFlQRSwgV3JpdGVJbnF1aXJ5U2NhblR5cGUpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfSU5RVUlSWV9TQ0FOX1RZUEUsIFJlYWRJbnF1aXJ5U2NhblR5cGUpOwotICBTRVRfU1VQUE9SVEVEKEFVVEhFTlRJQ0FUSU9OX1JFUVVFU1RFRCwgQXV0aGVudGljYXRpb25SZXF1ZXN0ZWQpOwotICBTRVRfU1VQUE9SVEVEKFNFVF9DT05ORUNUSU9OX0VOQ1JZUFRJT04sIFNldENvbm5lY3Rpb25FbmNyeXB0aW9uKTsKLSAgU0VUX1NVUFBPUlRFRChDSEFOR0VfQ09OTkVDVElPTl9MSU5LX0tFWSwgQ2hhbmdlQ29ubmVjdGlvbkxpbmtLZXkpOwotICBTRVRfU1VQUE9SVEVEKENFTlRSQUxfTElOS19LRVksIENlbnRyYWxMaW5rS2V5KTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9BVVRIRU5USUNBVElPTl9FTkFCTEUsIFdyaXRlQXV0aGVudGljYXRpb25FbmFibGUpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFLCBSZWFkQXV0aGVudGljYXRpb25FbmFibGUpOwotICBTRVRfU1VQUE9SVEVEKFdSSVRFX0NMQVNTX09GX0RFVklDRSwgV3JpdGVDbGFzc09mRGV2aWNlKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX1BBR0VfVElNRU9VVCwgUmVhZFBhZ2VUaW1lb3V0KTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9QQUdFX1RJTUVPVVQsIFdyaXRlUGFnZVRpbWVvdXQpOwotICBTRVRfU1VQUE9SVEVEKFdSSVRFX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVCwgV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KTsKLSAgU0VUX1NVUFBPUlRFRChIT0xEX01PREUsIEhvbGRNb2RlKTsKLSAgU0VUX1NVUFBPUlRFRChTTklGRl9NT0RFLCBTbmlmZk1vZGUpOwotICBTRVRfU1VQUE9SVEVEKEVYSVRfU05JRkZfTU9ERSwgRXhpdFNuaWZmTW9kZSk7Ci0gIFNFVF9TVVBQT1JURUQoUU9TX1NFVFVQLCBRb3NTZXR1cCk7Ci0gIFNFVF9TVVBQT1JURUQoUk9MRV9ESVNDT1ZFUlksIFJvbGVEaXNjb3ZlcnkpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUywKLSAgICAgICAgICAgICAgICBSZWFkRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncyk7Ci0gIFNFVF9TVVBQT1JURUQoV1JJVEVfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUywKLSAgICAgICAgICAgICAgICBXcml0ZURlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MpOwotICBTRVRfU1VQUE9SVEVEKEZMT1dfU1BFQ0lGSUNBVElPTiwgRmxvd1NwZWNpZmljYXRpb24pOwotICBTRVRfU1VQUE9SVEVEKFdSSVRFX0xJTktfUE9MSUNZX1NFVFRJTkdTLCBXcml0ZUxpbmtQb2xpY3lTZXR0aW5ncyk7Ci0gIFNFVF9TVVBQT1JURUQoQ0hBTkdFX0NPTk5FQ1RJT05fUEFDS0VUX1RZUEUsIENoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlKTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9MT0NBTF9OQU1FLCBXcml0ZUxvY2FsTmFtZSk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9MT0NBTF9OQU1FLCBSZWFkTG9jYWxOYW1lKTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9FWFRFTkRFRF9JTlFVSVJZX1JFU1BPTlNFLCBXcml0ZUV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlKTsKLSAgU0VUX1NVUFBPUlRFRChSRUZSRVNIX0VOQ1JZUFRJT05fS0VZLCBSZWZyZXNoRW5jcnlwdGlvbktleSk7Ci0gIFNFVF9TVVBQT1JURUQoV1JJVEVfVk9JQ0VfU0VUVElORywgV3JpdGVWb2ljZVNldHRpbmcpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfTlVNQkVSX09GX1NVUFBPUlRFRF9JQUMsIFJlYWROdW1iZXJPZlN1cHBvcnRlZElhYyk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9DVVJSRU5UX0lBQ19MQVAsIFJlYWRDdXJyZW50SWFjTGFwKTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9DVVJSRU5UX0lBQ19MQVAsIFdyaXRlQ3VycmVudElhY0xhcCk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9QQUdFX1NDQU5fQUNUSVZJVFksIFJlYWRQYWdlU2NhbkFjdGl2aXR5KTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9QQUdFX1NDQU5fQUNUSVZJVFksIFdyaXRlUGFnZVNjYW5BY3Rpdml0eSk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9JTlFVSVJZX1NDQU5fQUNUSVZJVFksIFJlYWRJbnF1aXJ5U2NhbkFjdGl2aXR5KTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9JTlFVSVJZX1NDQU5fQUNUSVZJVFksIFdyaXRlSW5xdWlyeVNjYW5BY3Rpdml0eSk7Ci0gIFNFVF9TVVBQT1JURUQoUkVBRF9TQ0FOX0VOQUJMRSwgUmVhZFNjYW5FbmFibGUpOwotICBTRVRfU1VQUE9SVEVEKFdSSVRFX1NDQU5fRU5BQkxFLCBXcml0ZVNjYW5FbmFibGUpOwotICBTRVRfU1VQUE9SVEVEKFNFVF9FVkVOVF9GSUxURVIsIFNldEV2ZW50RmlsdGVyKTsKLSAgU0VUX1NVUFBPUlRFRChJTlFVSVJZLCBJbnF1aXJ5KTsKLSAgU0VUX1NVUFBPUlRFRChJTlFVSVJZX0NBTkNFTCwgSW5xdWlyeUNhbmNlbCk7Ci0gIFNFVF9TVVBQT1JURUQoQUNDRVBUX0NPTk5FQ1RJT05fUkVRVUVTVCwgQWNjZXB0Q29ubmVjdGlvblJlcXVlc3QpOwotICBTRVRfU1VQUE9SVEVEKFJFSkVDVF9DT05ORUNUSU9OX1JFUVVFU1QsIFJlamVjdENvbm5lY3Rpb25SZXF1ZXN0KTsKLSAgU0VUX1NVUFBPUlRFRChMSU5LX0tFWV9SRVFVRVNUX1JFUExZLCBMaW5rS2V5UmVxdWVzdFJlcGx5KTsKLSAgU0VUX1NVUFBPUlRFRChMSU5LX0tFWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZLCBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkpOwotICBTRVRfU1VQUE9SVEVEKERFTEVURV9TVE9SRURfTElOS19LRVksIERlbGV0ZVN0b3JlZExpbmtLZXkpOwotICBTRVRfU1VQUE9SVEVEKFJFTU9URV9OQU1FX1JFUVVFU1QsIFJlbW90ZU5hbWVSZXF1ZXN0KTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfRVZFTlRfTUFTSywgTGVTZXRFdmVudE1hc2spOwotICBTRVRfU1VQUE9SVEVEKExFX1JFQURfQlVGRkVSX1NJWkVfVjEsIExlUmVhZEJ1ZmZlclNpemUpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFQURfQlVGRkVSX1NJWkVfVjIsIExlUmVhZEJ1ZmZlclNpemVWMik7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVMsIExlUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMpOwotICBTRVRfU1VQUE9SVEVEKExFX1NFVF9SQU5ET01fQUREUkVTUywgTGVTZXRSYW5kb21BZGRyZXNzKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfQURWRVJUSVNJTkdfUEFSQU1FVEVSUywgTGVTZXRBZHZlcnRpc2luZ1BhcmFtZXRlcnMpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFQURfQURWRVJUSVNJTkdfUEhZU0lDQUxfQ0hBTk5FTF9UWF9QT1dFUiwKLSAgICAgICAgICAgICAgICBMZVJlYWRBZHZlcnRpc2luZ1BoeXNpY2FsQ2hhbm5lbFR4UG93ZXIpOwotICBTRVRfU1VQUE9SVEVEKExFX1NFVF9BRFZFUlRJU0lOR19EQVRBLCBMZVNldEFkdmVydGlzaW5nRGF0YSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfU0VUX1NDQU5fUkVTUE9OU0VfREFUQSwgTGVTZXRTY2FuUmVzcG9uc2VEYXRhKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfQURWRVJUSVNJTkdfRU5BQkxFLCBMZVNldEFkdmVydGlzaW5nRW5hYmxlKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfU0NBTl9QQVJBTUVURVJTLCBMZVNldFNjYW5QYXJhbWV0ZXJzKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfU0NBTl9FTkFCTEUsIExlU2V0U2NhbkVuYWJsZSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfQ1JFQVRFX0NPTk5FQ1RJT04sIExlQ3JlYXRlQ29ubmVjdGlvbik7Ci0gIFNFVF9TVVBQT1JURUQoQ1JFQVRFX0NPTk5FQ1RJT04sIENyZWF0ZUNvbm5lY3Rpb24pOwotICBTRVRfU1VQUE9SVEVEKENSRUFURV9DT05ORUNUSU9OX0NBTkNFTCwgQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbCk7Ci0gIFNFVF9TVVBQT1JURUQoRElTQ09OTkVDVCwgRGlzY29ubmVjdCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMLCBMZUNvbm5lY3Rpb25DYW5jZWwpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFQURfQ09OTkVDVF9MSVNUX1NJWkUsIExlUmVhZENvbm5lY3RMaXN0U2l6ZSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfQ0xFQVJfQ09OTkVDVF9MSVNULCBMZUNsZWFyQ29ubmVjdExpc3QpOwotICBTRVRfU1VQUE9SVEVEKExFX0FERF9ERVZJQ0VfVE9fQ09OTkVDVF9MSVNULCBMZUFkZERldmljZVRvQ29ubmVjdExpc3QpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFTU9WRV9ERVZJQ0VfRlJPTV9DT05ORUNUX0xJU1QsCi0gICAgICAgICAgICAgICAgTGVSZW1vdmVEZXZpY2VGcm9tQ29ubmVjdExpc3QpOwotICBTRVRfU1VQUE9SVEVEKExFX1JBTkQsIExlUmFuZCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9TVVBQT1JURURfU1RBVEVTLCBMZVJlYWRTdXBwb3J0ZWRTdGF0ZXMpOwotICBTRVRfSEFORExFUihMRV9HRVRfVkVORE9SX0NBUEFCSUxJVElFUywgTGVWZW5kb3JDYXApOwotICBTRVRfSEFORExFUihMRV9SRU1PVEVfQ09OTkVDVElPTl9QQVJBTUVURVJfUkVRVUVTVF9SRVBMWSwKLSAgICAgICAgICAgICAgTGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdFJlcGx5KTsKLSAgU0VUX0hBTkRMRVIoTEVfUkVNT1RFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksCi0gICAgICAgICAgICAgIExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3ROZWdhdGl2ZVJlcGx5KTsKLSAgU0VUX0hBTkRMRVIoTEVfTVVMVElfQURWVCwgTGVWZW5kb3JNdWx0aUFkdik7Ci0gIFNFVF9IQU5ETEVSKExFX0FEVl9GSUxURVIsIExlQWR2ZXJ0aXNpbmdGaWx0ZXIpOwotICBTRVRfSEFORExFUihMRV9FTkVSR1lfSU5GTywgTGVFbmVyZ3lJbmZvKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfRVhURU5ERURfQURWRVJUSVNJTkdfUkFORE9NX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzcyk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVycyk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0RBVEEsIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGEpOwotICBTRVRfU1VQUE9SVEVEKExFX1NFVF9FWFRFTkRFRF9BRFZFUlRJU0lOR19TQ0FOX1JFU1BPTlNFLAotICAgICAgICAgICAgICAgIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfU0VUX0VYVEVOREVEX0FEVkVSVElTSU5HX0VOQUJMRSwKLSAgICAgICAgICAgICAgICBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGUpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFQURfTUFYSU1VTV9BRFZFUlRJU0lOR19EQVRBX0xFTkdUSCwKLSAgICAgICAgICAgICAgICBMZVJlYWRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9SRUFEX05VTUJFUl9PRl9TVVBQT1JURURfQURWRVJUSVNJTkdfU0VUUywKLSAgICAgICAgICAgICAgICBMZVJlYWROdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0cyk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVNT1ZFX0FEVkVSVElTSU5HX1NFVCwgTGVSZW1vdmVBZHZlcnRpc2luZ1NldCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfQ0xFQVJfQURWRVJUSVNJTkdfU0VUUywgTGVDbGVhckFkdmVydGlzaW5nU2V0cyk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9SRU1PVEVfRkVBVFVSRVMsIExlUmVhZFJlbW90ZUZlYXR1cmVzKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OLCBSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9DT05ORUNUSU9OX1VQREFURSwgTGVDb25uZWN0aW9uVXBkYXRlKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TVEFSVF9FTkNSWVBUSU9OLCBMZVN0YXJ0RW5jcnlwdGlvbik7Ci0gIFNFVF9TVVBQT1JURUQoTEVfTE9OR19URVJNX0tFWV9SRVFVRVNUX1JFUExZLCBMZUxvbmdUZXJtS2V5UmVxdWVzdFJlcGx5KTsKLSAgU0VUX1NVUFBPUlRFRChMRV9MT05HX1RFUk1fS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFksCi0gICAgICAgICAgICAgICAgTGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KTsKLSAgU0VUX1NVUFBPUlRFRChMRV9BRERfREVWSUNFX1RPX1JFU09MVklOR19MSVNULCBMZUFkZERldmljZVRvUmVzb2x2aW5nTGlzdCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVNT1ZFX0RFVklDRV9GUk9NX1JFU09MVklOR19MSVNULAotICAgICAgICAgICAgICAgIExlUmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3QpOwotICBTRVRfU1VQUE9SVEVEKExFX0NMRUFSX1JFU09MVklOR19MSVNULCBMZUNsZWFyUmVzb2x2aW5nTGlzdCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9SRVNPTFZJTkdfTElTVF9TSVpFLCBMZVJlYWRSZXNvbHZpbmdMaXN0U2l6ZSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9NQVhJTVVNX0RBVEFfTEVOR1RILCBMZVJlYWRNYXhpbXVtRGF0YUxlbmd0aCk7Ci0KLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfRVhURU5ERURfU0NBTl9QQVJBTUVURVJTLCBMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnMpOwotICBTRVRfU1VQUE9SVEVEKExFX1NFVF9FWFRFTkRFRF9TQ0FOX0VOQUJMRSwgTGVTZXRFeHRlbmRlZFNjYW5FbmFibGUpOwotICBTRVRfU1VQUE9SVEVEKExFX0VYVEVOREVEX0NSRUFURV9DT05ORUNUSU9OLCBMZUV4dGVuZGVkQ3JlYXRlQ29ubmVjdGlvbik7Ci0gIFNFVF9TVVBQT1JURUQoTEVfU0VUX1BSSVZBQ1lfTU9ERSwgTGVTZXRQcml2YWN5TW9kZSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9TVUdHRVNURURfREVGQVVMVF9EQVRBX0xFTkdUSCwKLSAgICAgICAgICAgICAgICBMZVJlYWRTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfV1JJVEVfU1VHR0VTVEVEX0RFRkFVTFRfREFUQV9MRU5HVEgsCi0gICAgICAgICAgICAgICAgTGVXcml0ZVN1Z2dlc3RlZERlZmF1bHREYXRhTGVuZ3RoKTsKLSAgLy8gSVNPIENvbW1hbmRzCi0gIFNFVF9TVVBQT1JURUQoTEVfUkVBRF9JU09fVFhfU1lOQywgTGVSZWFkSXNvVHhTeW5jKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfQ0lHX1BBUkFNRVRFUlMsIExlU2V0Q2lnUGFyYW1ldGVycyk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfQ1JFQVRFX0NJUywgTGVDcmVhdGVDaXMpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFTU9WRV9DSUcsIExlUmVtb3ZlQ2lnKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9BQ0NFUFRfQ0lTX1JFUVVFU1QsIExlQWNjZXB0Q2lzUmVxdWVzdCk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfUkVKRUNUX0NJU19SRVFVRVNULCBMZVJlamVjdENpc1JlcXVlc3QpOwotICBTRVRfU1VQUE9SVEVEKExFX0NSRUFURV9CSUcsIExlQ3JlYXRlQmlnKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9URVJNSU5BVEVfQklHLCBMZVRlcm1pbmF0ZUJpZyk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfQklHX0NSRUFURV9TWU5DLCBMZUJpZ0NyZWF0ZVN5bmMpOwotICBTRVRfU1VQUE9SVEVEKExFX0JJR19URVJNSU5BVEVfU1lOQywgTGVCaWdUZXJtaW5hdGVTeW5jKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9SRVFVRVNUX1BFRVJfU0NBLCBMZVJlcXVlc3RQZWVyU2NhKTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRVUF9JU09fREFUQV9QQVRILCBMZVNldHVwSXNvRGF0YVBhdGgpOwotICBTRVRfU1VQUE9SVEVEKExFX1JFTU9WRV9JU09fREFUQV9QQVRILCBMZVJlbW92ZUlzb0RhdGFQYXRoKTsKLSAgLy8gVGVzdGluZyBDb21tYW5kcwotICBTRVRfU1VQUE9SVEVEKFJFQURfTE9PUEJBQ0tfTU9ERSwgUmVhZExvb3BiYWNrTW9kZSk7Ci0gIFNFVF9TVVBQT1JURUQoV1JJVEVfTE9PUEJBQ0tfTU9ERSwgV3JpdGVMb29wYmFja01vZGUpOwotCi0gIFNFVF9TVVBQT1JURUQoUkVBRF9DTEFTU19PRl9ERVZJQ0UsIFJlYWRDbGFzc09mRGV2aWNlKTsKLSAgU0VUX1NVUFBPUlRFRChSRUFEX1ZPSUNFX1NFVFRJTkcsIFJlYWRWb2ljZVNldHRpbmcpOwotICBTRVRfU1VQUE9SVEVEKFJFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCwgUmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KTsKLSAgU0VUX1NVUFBPUlRFRChXUklURV9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VULCBXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KTsKLSAgU0VUX1NVUFBPUlRFRChMRV9TRVRfQUREUkVTU19SRVNPTFVUSU9OX0VOQUJMRSwgTGVTZXRBZGRyZXNzUmVzb2x1dGlvbkVuYWJsZSk7Ci0gIFNFVF9TVVBQT1JURUQoTEVfU0VUX1JFU09MVkFCTEVfUFJJVkFURV9BRERSRVNTX1RJTUVPVVQsIExlU2V0UmVzb3ZhbGFibGVQcml2YXRlQWRkcmVzc1RpbWVvdXQpOwotI3VuZGVmIFNFVF9IQU5ETEVSCi0jdW5kZWYgU0VUX1NVUFBPUlRFRAotICBwcm9wZXJ0aWVzXy5TZXRTdXBwb3J0ZWRDb21tYW5kcyhzdXBwb3J0ZWRfY29tbWFuZHMpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6U25pZmZTdWJyYXRpbmcoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6U25pZmZTdWJyYXRpbmdWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHNlbmRfZXZlbnRfKGdkX2hjaTo6U25pZmZTdWJyYXRpbmdDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVnaXN0ZXJUYXNrU2NoZWR1bGVyKAotICAgIHN0ZDo6ZnVuY3Rpb248QXN5bmNUYXNrSWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywgY29uc3QgVGFza0NhbGxiYWNrJik+IG9uZXNob3Rfc2NoZWR1bGVyKSB7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVnaXN0ZXJUYXNrU2NoZWR1bGVyKG9uZXNob3Rfc2NoZWR1bGVyKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlZ2lzdGVyUGVyaW9kaWNUYXNrU2NoZWR1bGVyKAotICAgIHN0ZDo6ZnVuY3Rpb248QXN5bmNUYXNrSWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywgY29uc3QgVGFza0NhbGxiYWNrJik+Ci0gICAgICAgIHBlcmlvZGljX3NjaGVkdWxlcikgewotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlZ2lzdGVyUGVyaW9kaWNUYXNrU2NoZWR1bGVyKHBlcmlvZGljX3NjaGVkdWxlcik7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWdpc3RlclRhc2tDYW5jZWwoc3RkOjpmdW5jdGlvbjx2b2lkKEFzeW5jVGFza0lkKT4gdGFza19jYW5jZWwpIHsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5SZWdpc3RlclRhc2tDYW5jZWwodGFza19jYW5jZWwpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6SGFuZGxlQWNsKHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0KSB7Ci0gIGJsdWV0b290aDo6aGNpOjpQYWNrZXRWaWV3PGJsdWV0b290aDo6aGNpOjprTGl0dGxlRW5kaWFuPiByYXdfcGFja2V0KHBhY2tldCk7Ci0gIGF1dG8gYWNsX3BhY2tldCA9IGJsdWV0b290aDo6aGNpOjpBY2xWaWV3OjpDcmVhdGUocmF3X3BhY2tldCk7Ci0gIEFTU0VSVChhY2xfcGFja2V0LklzVmFsaWQoKSk7Ci0gIGlmIChsb29wYmFja19tb2RlXyA9PSBMb29wYmFja01vZGU6OkVOQUJMRV9MT0NBTCkgewotICAgIHVpbnQxNl90IGhhbmRsZSA9IGFjbF9wYWNrZXQuR2V0SGFuZGxlKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6Q29tcGxldGVkUGFja2V0cz4gY29tcGxldGVkX3BhY2tldHM7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkNvbXBsZXRlZFBhY2tldHMgY3A7Ci0gICAgY3AuY29ubmVjdGlvbl9oYW5kbGVfID0gaGFuZGxlOwotICAgIGNwLmhvc3RfbnVtX29mX2NvbXBsZXRlZF9wYWNrZXRzXyA9IGtOdW1Db21tYW5kUGFja2V0czsKLSAgICBjb21wbGV0ZWRfcGFja2V0cy5wdXNoX2JhY2soY3ApOwotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTKSkgewotICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6Ok51bWJlck9mQ29tcGxldGVkUGFja2V0c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBjb21wbGV0ZWRfcGFja2V0cykpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNlbmRBY2xUb1JlbW90ZShhY2xfcGFja2V0KTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkhhbmRsZVNjbyhzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICBibHVldG9vdGg6OmhjaTo6UGFja2V0VmlldzxibHVldG9vdGg6OmhjaTo6a0xpdHRsZUVuZGlhbj4gcmF3X3BhY2tldChwYWNrZXQpOwotICBhdXRvIHNjb19wYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6U2NvVmlldzo6Q3JlYXRlKHJhd19wYWNrZXQpOwotICBpZiAobG9vcGJhY2tfbW9kZV8gPT0gTG9vcGJhY2tNb2RlOjpFTkFCTEVfTE9DQUwpIHsKLSAgICB1aW50MTZfdCBoYW5kbGUgPSBzY29fcGFja2V0LkdldEhhbmRsZSgpOwotICAgIGF1dG8gc2NvX2J1aWxkZXIgPSBibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBoYW5kbGUsIHNjb19wYWNrZXQuR2V0UGFja2V0U3RhdHVzRmxhZygpLCBzY29fcGFja2V0LkdldERhdGEoKSk7Ci0gICAgc2VuZF9zY29fKHN0ZDo6bW92ZShzY29fYnVpbGRlcikpOwotICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6aGNpOjpDb21wbGV0ZWRQYWNrZXRzPiBjb21wbGV0ZWRfcGFja2V0czsKLSAgICBibHVldG9vdGg6OmhjaTo6Q29tcGxldGVkUGFja2V0cyBjcDsKLSAgICBjcC5jb25uZWN0aW9uX2hhbmRsZV8gPSBoYW5kbGU7Ci0gICAgY3AuaG9zdF9udW1fb2ZfY29tcGxldGVkX3BhY2tldHNfID0ga051bUNvbW1hbmRQYWNrZXRzOwotICAgIGNvbXBsZXRlZF9wYWNrZXRzLnB1c2hfYmFjayhjcCk7Ci0gICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpOVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFMpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TnVtYmVyT2ZDb21wbGV0ZWRQYWNrZXRzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGNvbXBsZXRlZF9wYWNrZXRzKSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6SGFuZGxlSXNvKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0KSB7Ci0gIGJsdWV0b290aDo6aGNpOjpQYWNrZXRWaWV3PGJsdWV0b290aDo6aGNpOjprTGl0dGxlRW5kaWFuPiByYXdfcGFja2V0KHBhY2tldCk7Ci0gIGF1dG8gaXNvID0gYmx1ZXRvb3RoOjpoY2k6Oklzb1ZpZXc6OkNyZWF0ZShyYXdfcGFja2V0KTsKLSAgQVNTRVJUKGlzby5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkhhbmRsZUlzbyhpc28pOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6SGFuZGxlQ29tbWFuZChzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICBibHVldG9vdGg6OmhjaTo6UGFja2V0VmlldzxibHVldG9vdGg6OmhjaTo6a0xpdHRsZUVuZGlhbj4gcmF3X3BhY2tldChwYWNrZXQpOwotICBhdXRvIGNvbW1hbmRfcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRWaWV3OjpDcmVhdGUocmF3X3BhY2tldCk7Ci0gIEFTU0VSVChjb21tYW5kX3BhY2tldC5Jc1ZhbGlkKCkpOwotICBhdXRvIG9wID0gY29tbWFuZF9wYWNrZXQuR2V0T3BDb2RlKCk7Ci0KLSAgaWYgKGxvb3BiYWNrX21vZGVfID09IExvb3BiYWNrTW9kZTo6RU5BQkxFX0xPQ0FMICYmCi0gICAgICAvLyBMb29wYmFjayBleGNlcHRpb25zLgotICAgICAgb3AgIT0gT3BDb2RlOjpSRVNFVCAmJgotICAgICAgb3AgIT0gT3BDb2RlOjpTRVRfQ09OVFJPTExFUl9UT19IT1NUX0ZMT1dfQ09OVFJPTCAmJgotICAgICAgb3AgIT0gT3BDb2RlOjpIT1NUX0JVRkZFUl9TSVpFICYmCi0gICAgICBvcCAhPSBPcENvZGU6OkhPU1RfTlVNX0NPTVBMRVRFRF9QQUNLRVRTICYmCi0gICAgICBvcCAhPSBPcENvZGU6OlJFQURfQlVGRkVSX1NJWkUgJiYgb3AgIT0gT3BDb2RlOjpSRUFEX0xPT1BCQUNLX01PREUgJiYKLSAgICAgIG9wICE9IE9wQ29kZTo6V1JJVEVfTE9PUEJBQ0tfTU9ERSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcmF3X2J1aWxkZXJfcHRyID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4oMjU1KTsKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0cygqcGFja2V0KTsKLSAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TG9vcGJhY2tDb21tYW5kQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBzdGQ6Om1vdmUocmF3X2J1aWxkZXJfcHRyKSkpOwotICB9IGVsc2UgaWYgKGFjdGl2ZV9oY2lfY29tbWFuZHNfLmNvdW50KG9wKSA+IDApIHsKLSAgICBhY3RpdmVfaGNpX2NvbW1hbmRzX1tvcF0oY29tbWFuZF9wYWNrZXQpOwotICB9IGVsc2UgewotICAgIHVpbnQxNl90IG9wY29kZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihvcCk7Ci0gICAgU2VuZENvbW1hbmRDb21wbGV0ZVVua25vd25PcENvZGVFdmVudChvcGNvZGUpOwotICAgIExPR19JTkZPKCJVbmtub3duIGNvbW1hbmQsIG9wY29kZTogMHglMDRYLCBPR0Y6IDB4JTA0WCwgT0NGOiAweCUwNFgiLAotICAgICAgICAgICAgIG9wY29kZSwgKG9wY29kZSAmIDB4RkMwMCkgPj4gMTAsIG9wY29kZSAmIDB4MDNGRik7Ci0gIH0KLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlZ2lzdGVyRXZlbnRDaGFubmVsKAotICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+KT4mIGNhbGxiYWNrKSB7Ci0gIHNlbmRfZXZlbnRfID0KLSAgICAgIFtjYWxsYmFja10oc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpFdmVudEJ1aWxkZXI+IGV2ZW50KSB7Ci0gICAgICAgIGF1dG8gYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICAgICAgICBibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXIgYml0X2luc2VydGVyKCpieXRlcyk7Ci0gICAgICAgIGJ5dGVzLT5yZXNlcnZlKGV2ZW50LT5zaXplKCkpOwotICAgICAgICBldmVudC0+U2VyaWFsaXplKGJpdF9pbnNlcnRlcik7Ci0gICAgICAgIGNhbGxiYWNrKHN0ZDo6bW92ZShieXRlcykpOwotICAgICAgfTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5SZWdpc3RlckV2ZW50Q2hhbm5lbChzZW5kX2V2ZW50Xyk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWdpc3RlckFjbENoYW5uZWwoCi0gICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4pPiYgY2FsbGJhY2spIHsKLSAgc2VuZF9hY2xfID0gW2NhbGxiYWNrXShzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpoY2k6OkFjbEJ1aWxkZXI+IGFjbF9kYXRhKSB7Ci0gICAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OkJpdEluc2VydGVyIGJpdF9pbnNlcnRlcigqYnl0ZXMpOwotICAgIGJ5dGVzLT5yZXNlcnZlKGFjbF9kYXRhLT5zaXplKCkpOwotICAgIGFjbF9kYXRhLT5TZXJpYWxpemUoYml0X2luc2VydGVyKTsKLSAgICBjYWxsYmFjayhzdGQ6Om1vdmUoYnl0ZXMpKTsKLSAgfTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5SZWdpc3RlckFjbENoYW5uZWwoc2VuZF9hY2xfKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlZ2lzdGVyU2NvQ2hhbm5lbCgKLSAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pik+JiBjYWxsYmFjaykgewotICBzZW5kX3Njb18gPSBbY2FsbGJhY2tdKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcj4gc2NvX2RhdGEpIHsKLSAgICBhdXRvIGJ5dGVzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgICBibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXIgYml0X2luc2VydGVyKCpieXRlcyk7Ci0gICAgYnl0ZXMtPnJlc2VydmUoc2NvX2RhdGEtPnNpemUoKSk7Ci0gICAgc2NvX2RhdGEtPlNlcmlhbGl6ZShiaXRfaW5zZXJ0ZXIpOwotICAgIGNhbGxiYWNrKHN0ZDo6bW92ZShieXRlcykpOwotICB9OwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlZ2lzdGVyU2NvQ2hhbm5lbChzZW5kX3Njb18pOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVnaXN0ZXJJc29DaGFubmVsKAotICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+KT4mCi0gICAgICAgIGNhbGxiYWNrKSB7Ci0gIHNlbmRfaXNvXyA9IFtjYWxsYmFja10oc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpJc29CdWlsZGVyPiBpc29fZGF0YSkgewotICAgIGF1dG8gYnl0ZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PigpOwotICAgIGJsdWV0b290aDo6cGFja2V0OjpCaXRJbnNlcnRlciBiaXRfaW5zZXJ0ZXIoKmJ5dGVzKTsKLSAgICBieXRlcy0+cmVzZXJ2ZShpc29fZGF0YS0+c2l6ZSgpKTsKLSAgICBpc29fZGF0YS0+U2VyaWFsaXplKGJpdF9pbnNlcnRlcik7Ci0gICAgY2FsbGJhY2soc3RkOjptb3ZlKGJ5dGVzKSk7Ci0gIH07Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVnaXN0ZXJJc29DaGFubmVsKHNlbmRfaXNvXyk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZXNldChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZXNldFZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlc2V0KCk7Ci0gIGlmIChsb29wYmFja19tb2RlXyA9PSBMb29wYmFja01vZGU6OkVOQUJMRV9MT0NBTCkgewotICAgIGxvb3BiYWNrX21vZGVfID0gTG9vcGJhY2tNb2RlOjpOT19MT09QQkFDSzsKLSAgfQotCi0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpSZXNldENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKGtOdW1Db21tYW5kUGFja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkQnVmZmVyU2l6ZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkQnVmZmVyU2l6ZVZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlJlYWRCdWZmZXJTaXplQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgIHByb3BlcnRpZXNfLkdldEFjbERhdGFQYWNrZXRTaXplKCksCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRTeW5jaHJvbm91c0RhdGFQYWNrZXRTaXplKCksCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRUb3RhbE51bUFjbERhdGFQYWNrZXRzKCksCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRUb3RhbE51bVN5bmNocm9ub3VzRGF0YVBhY2tldHMoKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRFbmNyeXB0aW9uS2V5U2l6ZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkRW5jcnlwdGlvbktleVNpemVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkRW5jcnlwdGlvbktleVNpemVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSwgcHJvcGVydGllc18uR2V0RW5jcnlwdGlvbktleVNpemUoKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6Okhvc3RCdWZmZXJTaXplKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6Okhvc3RCdWZmZXJTaXplVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6Okhvc3RCdWZmZXJTaXplQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbihDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb25WaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBibHVldG9vdGg6OmhjaTo6TG9jYWxWZXJzaW9uSW5mb3JtYXRpb24gbG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbjsKLSAgbG9jYWxfdmVyc2lvbl9pbmZvcm1hdGlvbi5oY2lfdmVyc2lvbl8gPQotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkhjaVZlcnNpb24+KHByb3BlcnRpZXNfLkdldFZlcnNpb24oKSk7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24uaGNpX3JldmlzaW9uXyA9IHByb3BlcnRpZXNfLkdldFJldmlzaW9uKCk7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3ZlcnNpb25fID0KLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpMbXBWZXJzaW9uPihwcm9wZXJ0aWVzXy5HZXRMbXBQYWxWZXJzaW9uKCkpOwotICBsb2NhbF92ZXJzaW9uX2luZm9ybWF0aW9uLm1hbnVmYWN0dXJlcl9uYW1lXyA9Ci0gICAgICBwcm9wZXJ0aWVzXy5HZXRNYW51ZmFjdHVyZXJOYW1lKCk7Ci0gIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24ubG1wX3N1YnZlcnNpb25fID0gcHJvcGVydGllc18uR2V0TG1wUGFsU3VidmVyc2lvbigpOwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6UmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGxvY2FsX3ZlcnNpb25faW5mb3JtYXRpb24pOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25WaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5TZW5kQ29tbWFuZFRvUmVtb3RlQnlIYW5kbGUoCi0gICAgICBPcENvZGU6OlJFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT04sIGNvbW1hbmQuR2V0UGF5bG9hZCgpLAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSk7Ci0KLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25TdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkQmRBZGRyKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRCZEFkZHJWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZEJkQWRkckNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCA2ND4gc3VwcG9ydGVkX2NvbW1hbmRze307Ci0gIHN1cHBvcnRlZF9jb21tYW5kcy5maWxsKDB4MDApOwotICBzaXplX3QgbGVuID0gcHJvcGVydGllc18uR2V0U3VwcG9ydGVkQ29tbWFuZHMoKS5zaXplKCk7Ci0gIGlmIChsZW4gPiA2NCkgewotICAgIGxlbiA9IDY0OwotICB9Ci0gIHN0ZDo6Y29weV9uKHByb3BlcnRpZXNfLkdldFN1cHBvcnRlZENvbW1hbmRzKCkuYmVnaW4oKSwgbGVuLAotICAgICAgICAgICAgICBzdXBwb3J0ZWRfY29tbWFuZHMuYmVnaW4oKSk7Ci0KLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIHN1cHBvcnRlZF9jb21tYW5kcyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAgIHByb3BlcnRpZXNfLkdldFN1cHBvcnRlZEZlYXR1cmVzKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkTG9jYWxTdXBwb3J0ZWRDb2RlY3MoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZExvY2FsU3VwcG9ydGVkQ29kZWNzVjFWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWRMb2NhbFN1cHBvcnRlZENvZGVjc1YxQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0U3VwcG9ydGVkQ29kZWNzKCksCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0VmVuZG9yU3BlY2lmaWNDb2RlY3MoKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRMb2NhbEV4dGVuZGVkRmVhdHVyZXMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc1ZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50OF90IHBhZ2VfbnVtYmVyID0gY29tbWFuZF92aWV3LkdldFBhZ2VOdW1iZXIoKTsKLQotICBhdXRvIHBha2NldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6UmVhZExvY2FsRXh0ZW5kZWRGZWF0dXJlc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBwYWdlX251bWJlciwKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRFeHRlbmRlZEZlYXR1cmVzTWF4aW11bVBhZ2VOdW1iZXIoKSwKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRFeHRlbmRlZEZlYXR1cmVzKHBhZ2VfbnVtYmVyKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWtjZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2VuZENvbW1hbmRUb1JlbW90ZUJ5SGFuZGxlKAotICAgICAgT3BDb2RlOjpSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUywgY29tbWFuZF92aWV3LkdldFBheWxvYWQoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCkpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzU3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpTd2l0Y2hSb2xlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlN3aXRjaFJvbGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5Td2l0Y2hSb2xlKAotICAgICAgY29tbWFuZF92aWV3LkdldEJkQWRkcigpLCBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0Um9sZSgpKSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6U3dpdGNoUm9sZVN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc1ZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNlbmRDb21tYW5kVG9SZW1vdGVCeUhhbmRsZSgKLSAgICAgIE9wQ29kZTo6UkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTLCBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSk7Ci0KLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc1N0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRDbG9ja09mZnNldChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkQ2xvY2tPZmZzZXRWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNlbmRDb21tYW5kVG9SZW1vdGVCeUhhbmRsZSgKLSAgICAgIE9wQ29kZTo6UkVBRF9DTE9DS19PRkZTRVQsIGNvbW1hbmRfdmlldy5HZXRQYXlsb2FkKCksIGhhbmRsZSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZENsb2NrT2Zmc2V0U3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgQWRkcmVzcyBwZWVyID0gY29tbWFuZF92aWV3LkdldEJkQWRkcigpOwotICB1aW50OF90IGlvX2NhcGFiaWxpdHkgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0SW9DYXBhYmlsaXR5KCkpOwotICB1aW50OF90IG9vYl9kYXRhX3ByZXNlbnRfZmxhZyA9Ci0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0T29iUHJlc2VudCgpKTsKLSAgdWludDhfdCBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMgPQotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldEF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzKCkpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5Jb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHkoCi0gICAgICBwZWVyLCBpb19jYXBhYmlsaXR5LCBvb2JfZGF0YV9wcmVzZW50X2ZsYWcsIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RSZXBseUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIHBlZXIpOwotCi0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFkZHJlc3MgcGVlciA9IGNvbW1hbmRfdmlldy5HZXRCZEFkZHIoKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uVXNlckNvbmZpcm1hdGlvblJlcXVlc3RSZXBseShwZWVyKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgcGVlcik7Ci0KLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFkZHJlc3MgcGVlciA9IGNvbW1hbmRfdmlldy5HZXRCZEFkZHIoKTsKLQotICBhdXRvIHN0YXR1cyA9Ci0gICAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseShwZWVyKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0TmVnYXRpdmVSZXBseUNvbXBsZXRlQnVpbGRlcjo6Ci0gICAgICAgICAgQ3JlYXRlKGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzLCBwZWVyKTsKLQotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpQaW5Db2RlUmVxdWVzdFJlcGx5KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlBpbkNvZGVSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIiVzIiwgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgQWRkcmVzcyBwZWVyID0gY29tbWFuZF92aWV3LkdldEJkQWRkcigpOwotICB1aW50OF90IHBpbl9sZW5ndGggPSBjb21tYW5kX3ZpZXcuR2V0UGluQ29kZUxlbmd0aCgpOwotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBwaW4gPSBjb21tYW5kX3ZpZXcuR2V0UGluQ29kZSgpOwotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpJTlZBTElEX0hDSV9DT01NQU5EX1BBUkFNRVRFUlM7Ci0gIGlmIChwaW5fbGVuZ3RoID49IDEgJiYgcGluX2xlbmd0aCA8PSAweDEwKSB7Ci0gICAgc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5QaW5Db2RlUmVxdWVzdFJlcGx5KAotICAgICAgICBwZWVyLCBzdGQ6OnZlY3Rvcjx1aW50OF90PihwaW4uYmVnaW4oKSwgcGluLmJlZ2luKCkgKyBwaW5fbGVuZ3RoKSk7Ci0gIH0KLQotICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6UGluQ29kZVJlcXVlc3RSZXBseUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIHBlZXIpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlBpbkNvZGVSZXF1ZXN0TmVnYXRpdmVSZXBseShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpQaW5Db2RlUmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIiVzIiwgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgQWRkcmVzcyBwZWVyID0gY29tbWFuZF92aWV3LkdldEJkQWRkcigpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5QaW5Db2RlUmVxdWVzdE5lZ2F0aXZlUmVwbHkocGVlcik7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpQaW5Db2RlUmVxdWVzdE5lZ2F0aXZlUmVwbHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgcGVlcik7Ci0KLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6VXNlclBhc3NrZXlSZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6VXNlclBhc3NrZXlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBBZGRyZXNzIHBlZXIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gIHVpbnQzMl90IG51bWVyaWNfdmFsdWUgPSBjb21tYW5kX3ZpZXcuR2V0TnVtZXJpY1ZhbHVlKCk7Ci0KLSAgYXV0byBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5Vc2VyUGFzc2tleVJlcXVlc3RSZXBseShwZWVyLCBudW1lcmljX3ZhbHVlKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6VXNlclBhc3NrZXlSZXF1ZXN0UmVwbHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzLCBwZWVyKTsKLQotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlVzZXJQYXNza2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBBZGRyZXNzIHBlZXIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlVzZXJQYXNza2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkocGVlcik7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIHBlZXIpOwotCi0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFkZHJlc3MgcGVlciA9IGNvbW1hbmRfdmlldy5HZXRCZEFkZHIoKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseSgKLSAgICAgIHBlZXIsIGNvbW1hbmRfdmlldy5HZXRDKCksIGNvbW1hbmRfdmlldy5HZXRSKCkpOwotCi0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpSZW1vdGVPb2JEYXRhUmVxdWVzdFJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgcGVlcikpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFkZHJlc3MgcGVlciA9IGNvbW1hbmRfdmlldy5HZXRCZEFkZHIoKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5KHBlZXIpOwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIHBlZXIpOwotCi0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OklvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgQWRkcmVzcyBwZWVyID0gY29tbWFuZF92aWV3LkdldEJkQWRkcigpOwotICBFcnJvckNvZGUgcmVhc29uID0gY29tbWFuZF92aWV3LkdldFJlYXNvbigpOwotCi0gIGF1dG8gc3RhdHVzID0KLSAgICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uSW9DYXBhYmlsaXR5UmVxdWVzdE5lZ2F0aXZlUmVwbHkocGVlciwgcmVhc29uKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIHBlZXIpOwotCi0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlbW90ZU9vYkV4dGVuZGVkRGF0YVJlcXVlc3RSZXBseSgKLSAgICBDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBBZGRyZXNzIHBlZXIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlbW90ZU9vYkV4dGVuZGVkRGF0YVJlcXVlc3RSZXBseSgKLSAgICAgIHBlZXIsIGNvbW1hbmRfdmlldy5HZXRDMTkyKCksIGNvbW1hbmRfdmlldy5HZXRSMTkyKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QzI1NigpLCBjb21tYW5kX3ZpZXcuR2V0UjI1NigpKTsKLQotICBzZW5kX2V2ZW50XygKLSAgICAgIGJsdWV0b290aDo6aGNpOjpSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgcGVlcikpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZElucXVpcnlSZXNwb25zZVRyYW5zbWl0UG93ZXJMZXZlbCgKLSAgICBDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkSW5xdWlyeVJlc3BvbnNlVHJhbnNtaXRQb3dlckxldmVsVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQ4X3QgdHhfcG93ZXIgPSAyMDsgIC8vIG1heGltdW0KLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWRJbnF1aXJ5UmVzcG9uc2VUcmFuc21pdFBvd2VyTGV2ZWxDb21wbGV0ZUJ1aWxkZXI6OgotICAgICAgICAgIENyZWF0ZShrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgdHhfcG93ZXIpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpTZW5kS2V5cHJlc3NOb3RpZmljYXRpb24oQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6U2VuZEtleXByZXNzTm90aWZpY2F0aW9uVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgYXV0byBwZWVyID0gY29tbWFuZF92aWV3LkdldEJkQWRkcigpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5TZW5kS2V5cHJlc3NOb3RpZmljYXRpb24oCi0gICAgICBwZWVyLCBjb21tYW5kX3ZpZXcuR2V0Tm90aWZpY2F0aW9uVHlwZSgpKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIHBlZXIpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlNldEV2ZW50TWFza1BhZ2UyKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBwYXlsb2FkID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KAotICAgICAgICAgIHtzdGF0aWNfY2FzdDx1aW50OF90PihibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKX0pKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgY29tbWFuZC5HZXRPcENvZGUoKSwgc3RkOjptb3ZlKHBheWxvYWQpKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkTG9jYWxPb2JEYXRhKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRMb2NhbE9vYkRhdGFWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVhZExvY2FsT29iRGF0YSgpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZExvY2FsT29iRXh0ZW5kZWREYXRhKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRMb2NhbE9vYkV4dGVuZGVkRGF0YVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5SZWFkTG9jYWxPb2JFeHRlbmRlZERhdGEoKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlU2ltcGxlUGFpcmluZ01vZGUoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6V3JpdGVTaW1wbGVQYWlyaW5nTW9kZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIGF1dG8gZW5hYmxlZCA9IGNvbW1hbmRfdmlldy5HZXRTaW1wbGVQYWlyaW5nTW9kZSgpID09IGdkX2hjaTo6RW5hYmxlOjpFTkFCTEVEOwotICBwcm9wZXJ0aWVzXy5TZXRTZWN1cmVTaW1wbGVQYWlyaW5nU3VwcG9ydChlbmFibGVkKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVTaW1wbGVQYWlyaW5nTW9kZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgdWludDE2X3QgaGFuZGxlID0gY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgdWludDE2X3QgcGFja2V0X3R5cGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29tbWFuZF92aWV3LkdldFBhY2tldFR5cGUoKSk7Ci0KLSAgYXV0byBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5DaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZShoYW5kbGUsIHBhY2tldF90eXBlKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZVN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVMZUhvc3RTdXBwb3J0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlTGVIb3N0U3VwcG9ydFZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGxlX3N1cHBvcnQgPQotICAgICAgY29tbWFuZF92aWV3LkdldExlU3VwcG9ydGVkSG9zdCgpID09IGdkX2hjaTo6RW5hYmxlOjpFTkFCTEVEOwotICBwcm9wZXJ0aWVzXy5TZXRMZUhvc3RTdXBwb3J0KGxlX3N1cHBvcnQpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpXcml0ZUxlSG9zdFN1cHBvcnRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0KAotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlU2VjdXJlQ29ubmVjdGlvbnNIb3N0U3VwcG9ydFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBwcm9wZXJ0aWVzXy5TZXRTZWN1cmVDb25uZWN0aW9ucygKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0KCkgPT0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpFbmFibGU6OkVOQUJMRUQpOwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6V3JpdGVTZWN1cmVDb25uZWN0aW9uc0hvc3RTdXBwb3J0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpTZXRFdmVudE1hc2soQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6U2V0RXZlbnRNYXNrVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHByb3BlcnRpZXNfLlNldEV2ZW50TWFzayhjb21tYW5kX3ZpZXcuR2V0RXZlbnRNYXNrKCkpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpTZXRFdmVudE1hc2tDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZElucXVpcnlNb2RlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRJbnF1aXJ5TW9kZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgZ2RfaGNpOjpJbnF1aXJ5TW9kZSBpbnF1aXJ5X21vZGUgPSBnZF9oY2k6OklucXVpcnlNb2RlOjpTVEFOREFSRDsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZElucXVpcnlNb2RlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaW5xdWlyeV9tb2RlKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVJbnF1aXJ5TW9kZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpXcml0ZUlucXVpcnlNb2RlVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldElucXVpcnlNb2RlKAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldElucXVpcnlNb2RlKCkpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVJbnF1aXJ5TW9kZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkUGFnZVNjYW5UeXBlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRQYWdlU2NhblR5cGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGdkX2hjaTo6UGFnZVNjYW5UeXBlIHBhZ2Vfc2Nhbl90eXBlID0gZ2RfaGNpOjpQYWdlU2NhblR5cGU6OlNUQU5EQVJEOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkUGFnZVNjYW5UeXBlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgcGFnZV9zY2FuX3R5cGUpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpXcml0ZVBhZ2VTY2FuVHlwZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpXcml0ZVBhZ2VTY2FuVHlwZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVQYWdlU2NhblR5cGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZElucXVpcnlTY2FuVHlwZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkSW5xdWlyeVNjYW5UeXBlVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBnZF9oY2k6OklucXVpcnlTY2FuVHlwZSBpbnF1aXJ5X3NjYW5fdHlwZSA9IGdkX2hjaTo6SW5xdWlyeVNjYW5UeXBlOjpTVEFOREFSRDsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZElucXVpcnlTY2FuVHlwZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGlucXVpcnlfc2Nhbl90eXBlKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVJbnF1aXJ5U2NhblR5cGUoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6V3JpdGVJbnF1aXJ5U2NhblR5cGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OldyaXRlSW5xdWlyeVNjYW5UeXBlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKGhhbmRsZSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6QXV0aGVudGljYXRpb25SZXF1ZXN0ZWRTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlNldENvbm5lY3Rpb25FbmNyeXB0aW9uKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlNldENvbm5lY3Rpb25FbmNyeXB0aW9uVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgdWludDhfdCBlbmNyeXB0aW9uX2VuYWJsZSA9Ci0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0RW5jcnlwdGlvbkVuYWJsZSgpKTsKLSAgYXV0byBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRDb25uZWN0aW9uRW5jcnlwdGlvbihoYW5kbGUsIGVuY3J5cHRpb25fZW5hYmxlKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpTZXRDb25uZWN0aW9uRW5jcnlwdGlvblN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5DaGFuZ2VDb25uZWN0aW9uTGlua0tleShoYW5kbGUpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNoYW5nZUNvbm5lY3Rpb25MaW5rS2V5U3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpDZW50cmFsTGlua0tleShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpDZW50cmFsTGlua0tleVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHVpbnQ4X3Qga2V5X2ZsYWcgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0S2V5RmxhZygpKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uQ2VudHJhbExpbmtLZXkoa2V5X2ZsYWcpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNlbnRyYWxMaW5rS2V5U3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpXcml0ZUF1dGhlbnRpY2F0aW9uRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlQXV0aGVudGljYXRpb25FbmFibGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgcHJvcGVydGllc18uU2V0QXV0aGVudGljYXRpb25FbmFibGUoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0QXV0aGVudGljYXRpb25FbmFibGUoKSkpOwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6V3JpdGVBdXRoZW50aWNhdGlvbkVuYWJsZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZEF1dGhlbnRpY2F0aW9uRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRBdXRoZW50aWNhdGlvbkVuYWJsZVZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkQXV0aGVudGljYXRpb25FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uRW5hYmxlPigKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRBdXRoZW50aWNhdGlvbkVuYWJsZSgpKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlQ2xhc3NPZkRldmljZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpXcml0ZUNsYXNzT2ZEZXZpY2VWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIENsYXNzT2ZEZXZpY2UgY2xhc3Nfb2ZfZGV2aWNlID0gY29tbWFuZF92aWV3LkdldENsYXNzT2ZEZXZpY2UoKTsKLSAgcHJvcGVydGllc18uU2V0Q2xhc3NPZkRldmljZShjbGFzc19vZl9kZXZpY2UuY29kWzBdLCBjbGFzc19vZl9kZXZpY2UuY29kWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX29mX2RldmljZS5jb2RbMl0pOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpXcml0ZUNsYXNzT2ZEZXZpY2VDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZFBhZ2VUaW1lb3V0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRQYWdlVGltZW91dFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgdWludDE2X3QgcGFnZV90aW1lb3V0ID0gMHgyMDAwOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkUGFnZVRpbWVvdXRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBwYWdlX3RpbWVvdXQpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpXcml0ZVBhZ2VUaW1lb3V0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlUGFnZVRpbWVvdXRWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OldyaXRlUGFnZVRpbWVvdXRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6SG9sZE1vZGUoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6SG9sZE1vZGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICB1aW50MTZfdCBob2xkX21vZGVfbWF4X2ludGVydmFsID0gY29tbWFuZF92aWV3LkdldEhvbGRNb2RlTWF4SW50ZXJ2YWwoKTsKLSAgdWludDE2X3QgaG9sZF9tb2RlX21pbl9pbnRlcnZhbCA9IGNvbW1hbmRfdmlldy5HZXRIb2xkTW9kZU1pbkludGVydmFsKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkhvbGRNb2RlKGhhbmRsZSwgaG9sZF9tb2RlX21heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRfbW9kZV9taW5faW50ZXJ2YWwpOwotCi0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpIb2xkTW9kZVN0YXR1c0J1aWxkZXI6OkNyZWF0ZShzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlNuaWZmTW9kZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpTbmlmZk1vZGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICB1aW50MTZfdCBzbmlmZl9tYXhfaW50ZXJ2YWwgPSBjb21tYW5kX3ZpZXcuR2V0U25pZmZNYXhJbnRlcnZhbCgpOwotICB1aW50MTZfdCBzbmlmZl9taW5faW50ZXJ2YWwgPSBjb21tYW5kX3ZpZXcuR2V0U25pZmZNaW5JbnRlcnZhbCgpOwotICB1aW50MTZfdCBzbmlmZl9hdHRlbXB0ID0gY29tbWFuZF92aWV3LkdldFNuaWZmQXR0ZW1wdCgpOwotICB1aW50MTZfdCBzbmlmZl90aW1lb3V0ID0gY29tbWFuZF92aWV3LkdldFNuaWZmVGltZW91dCgpOwotCi0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5TbmlmZk1vZGUoaGFuZGxlLCBzbmlmZl9tYXhfaW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25pZmZfbWluX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuaWZmX2F0dGVtcHQsIHNuaWZmX3RpbWVvdXQpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlNuaWZmTW9kZVN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6RXhpdFNuaWZmTW9kZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpFeGl0U25pZmZNb2RlVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBhdXRvIHN0YXR1cyA9Ci0gICAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkV4aXRTbmlmZk1vZGUoY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6RXhpdFNuaWZmTW9kZVN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UW9zU2V0dXAoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UW9zU2V0dXBWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICB1aW50OF90IHNlcnZpY2VfdHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRTZXJ2aWNlVHlwZSgpKTsKLSAgdWludDMyX3QgdG9rZW5fcmF0ZSA9IGNvbW1hbmRfdmlldy5HZXRUb2tlblJhdGUoKTsKLSAgdWludDMyX3QgcGVha19iYW5kd2lkdGggPSBjb21tYW5kX3ZpZXcuR2V0UGVha0JhbmR3aWR0aCgpOwotICB1aW50MzJfdCBsYXRlbmN5ID0gY29tbWFuZF92aWV3LkdldExhdGVuY3koKTsKLSAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uID0gY29tbWFuZF92aWV3LkdldERlbGF5VmFyaWF0aW9uKCk7Ci0KLSAgYXV0byBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5Rb3NTZXR1cChoYW5kbGUsIHNlcnZpY2VfdHlwZSwgdG9rZW5fcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVha19iYW5kd2lkdGgsIGxhdGVuY3ksIGRlbGF5X3ZhcmlhdGlvbik7Ci0KLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlFvc1NldHVwU3RhdHVzQnVpbGRlcjo6Q3JlYXRlKHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6Um9sZURpc2NvdmVyeShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSb2xlRGlzY292ZXJ5Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUm9sZURpc2NvdmVyeShoYW5kbGUpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlJvbGVEaXNjb3ZlcnlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzLCBoYW5kbGUsIGJsdWV0b290aDo6aGNpOjpSb2xlOjpDRU5UUkFMKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZERlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZERlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3NWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBzZXR0aW5ncyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVhZERlZmF1bHRMaW5rUG9saWN5U2V0dGluZ3MoKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIHNldHRpbmdzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5nc1ZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLldyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncygKLSAgICAgIGNvbW1hbmRfdmlldy5HZXREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKCkpOwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6V3JpdGVEZWZhdWx0TGlua1BvbGljeVNldHRpbmdzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpGbG93U3BlY2lmaWNhdGlvbihDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpGbG93U3BlY2lmaWNhdGlvblZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gIHVpbnQ4X3QgZmxvd19kaXJlY3Rpb24gPQotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldEZsb3dEaXJlY3Rpb24oKSk7Ci0gIHVpbnQ4X3Qgc2VydmljZV90eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldFNlcnZpY2VUeXBlKCkpOwotICB1aW50MzJfdCB0b2tlbl9yYXRlID0gY29tbWFuZF92aWV3LkdldFRva2VuUmF0ZSgpOwotICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSA9IGNvbW1hbmRfdmlldy5HZXRUb2tlbkJ1Y2tldFNpemUoKTsKLSAgdWludDMyX3QgcGVha19iYW5kd2lkdGggPSBjb21tYW5kX3ZpZXcuR2V0UGVha0JhbmR3aWR0aCgpOwotICB1aW50MzJfdCBhY2Nlc3NfbGF0ZW5jeSA9IGNvbW1hbmRfdmlldy5HZXRBY2Nlc3NMYXRlbmN5KCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkZsb3dTcGVjaWZpY2F0aW9uKAotICAgICAgaGFuZGxlLCBmbG93X2RpcmVjdGlvbiwgc2VydmljZV90eXBlLCB0b2tlbl9yYXRlLCB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgIHBlYWtfYmFuZHdpZHRoLCBhY2Nlc3NfbGF0ZW5jeSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6Rmxvd1NwZWNpZmljYXRpb25TdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlTGlua1BvbGljeVNldHRpbmdzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlTGlua1BvbGljeVNldHRpbmdzVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICB1aW50MTZfdCBzZXR0aW5ncyA9IGNvbW1hbmRfdmlldy5HZXRMaW5rUG9saWN5U2V0dGluZ3MoKTsKLQotICBhdXRvIHN0YXR1cyA9Ci0gICAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLldyaXRlTGlua1BvbGljeVNldHRpbmdzKGhhbmRsZSwgc2V0dGluZ3MpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OldyaXRlTGlua1BvbGljeVNldHRpbmdzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgaGFuZGxlKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgdWludDE2X3QgaGFuZGxlID0gY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgdWludDE2X3QgdGltZW91dCA9IGNvbW1hbmRfdmlldy5HZXRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KCk7Ci0KLSAgYXV0byBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5Xcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQoaGFuZGxlLCB0aW1lb3V0KTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OldyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzLCBoYW5kbGUpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkTG9jYWxOYW1lKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRMb2NhbE5hbWVWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDI0OD4gbG9jYWxfbmFtZXt9OwotICBsb2NhbF9uYW1lLmZpbGwoMHgwMCk7Ci0gIHNpemVfdCBsZW4gPSBwcm9wZXJ0aWVzXy5HZXROYW1lKCkuc2l6ZSgpOwotICBpZiAobGVuID4gMjQ3KSB7Ci0gICAgbGVuID0gMjQ3OyAgLy8gb25lIGJ5dGUgZm9yIE5VTEwgb2N0ZXQgKDB4MDApCi0gIH0KLSAgc3RkOjpjb3B5X24ocHJvcGVydGllc18uR2V0TmFtZSgpLmJlZ2luKCksIGxlbiwgbG9jYWxfbmFtZS5iZWdpbigpKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkTG9jYWxOYW1lQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgbG9jYWxfbmFtZSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlTG9jYWxOYW1lKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlTG9jYWxOYW1lVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGNvbnN0IGF1dG8gbG9jYWxfbmFtZSA9IGNvbW1hbmRfdmlldy5HZXRMb2NhbE5hbWUoKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmFtZV92ZWMoMjQ4KTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAyNDg7IGkrKykgewotICAgIG5hbWVfdmVjW2ldID0gbG9jYWxfbmFtZVtpXTsKLSAgfQotICBwcm9wZXJ0aWVzXy5TZXROYW1lKG5hbWVfdmVjKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVMb2NhbE5hbWVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVFeHRlbmRlZElucXVpcnlSZXNwb25zZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpXcml0ZUV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHByb3BlcnRpZXNfLlNldEV4dGVuZGVkSW5xdWlyeURhdGEoc3RkOjp2ZWN0b3I8dWludDhfdD4oCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLmJlZ2luKCkgKyAxLCBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLmVuZCgpKSk7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpXcml0ZUV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWZyZXNoRW5jcnlwdGlvbktleShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWZyZXNoRW5jcnlwdGlvbktleVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICBhdXRvIHN0YXR1c19wYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlZnJlc2hFbmNyeXB0aW9uS2V5U3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHN0YXR1c19wYWNrZXQpKTsKLSAgLy8gVE9ETzogU3VwcG9ydCB0aGlzIGluIHRoZSBsaW5rIGxheWVyCi0gIGF1dG8gY29tcGxldGVfcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKGNvbXBsZXRlX3BhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVWb2ljZVNldHRpbmcoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6V3JpdGVWb2ljZVNldHRpbmdWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBwcm9wZXJ0aWVzXy5TZXRWb2ljZVNldHRpbmcoY29tbWFuZF92aWV3LkdldFZvaWNlU2V0dGluZygpKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpXcml0ZVZvaWNlU2V0dGluZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkTnVtYmVyT2ZTdXBwb3J0ZWRJYWMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZE51bWJlck9mU3VwcG9ydGVkSWFjVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50OF90IG51bV9zdXBwb3J0X2lhYyA9IDB4MTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZE51bWJlck9mU3VwcG9ydGVkSWFjQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgbnVtX3N1cHBvcnRfaWFjKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZEN1cnJlbnRJYWNMYXAoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZEN1cnJlbnRJYWNMYXBWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGdkX2hjaTo6TGFwIGxhcDsKLSAgbGFwLmxhcF8gPSAweDMwOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkQ3VycmVudElhY0xhcENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIHtsYXB9KTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVDdXJyZW50SWFjTGFwKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlQ3VycmVudElhY0xhcFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVDdXJyZW50SWFjTGFwQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlJlYWRQYWdlU2NhbkFjdGl2aXR5KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRQYWdlU2NhbkFjdGl2aXR5Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICB1aW50MTZfdCBpbnRlcnZhbCA9IDB4MTAwMDsKLSAgdWludDE2X3Qgd2luZG93ID0gMHgwMDEyOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkUGFnZVNjYW5BY3Rpdml0eUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGludGVydmFsLCB3aW5kb3cpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpXcml0ZVBhZ2VTY2FuQWN0aXZpdHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6V3JpdGVQYWdlU2NhbkFjdGl2aXR5Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpEaXNjb3ZlcnlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpXcml0ZVBhZ2VTY2FuQWN0aXZpdHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZElucXVpcnlTY2FuQWN0aXZpdHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZElucXVpcnlTY2FuQWN0aXZpdHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHVpbnQxNl90IGludGVydmFsID0gMHgxMDAwOwotICB1aW50MTZfdCB3aW5kb3cgPSAweDAwMTI7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlJlYWRJbnF1aXJ5U2NhbkFjdGl2aXR5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgaW50ZXJ2YWwsIHdpbmRvdyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlSW5xdWlyeVNjYW5BY3Rpdml0eShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpXcml0ZUlucXVpcnlTY2FuQWN0aXZpdHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OldyaXRlSW5xdWlyeVNjYW5BY3Rpdml0eUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkU2NhbkVuYWJsZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpSZWFkU2NhbkVuYWJsZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZFNjYW5FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBnZF9oY2k6OlNjYW5FbmFibGU6Ok5PX1NDQU5TKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6V3JpdGVTY2FuRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlU2NhbkVuYWJsZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRJbnF1aXJ5U2NhbkVuYWJsZSgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRTY2FuRW5hYmxlKCkgPT0KLSAgICAgICAgICBnZF9oY2k6OlNjYW5FbmFibGU6OklOUVVJUllfQU5EX1BBR0VfU0NBTiB8fAotICAgICAgY29tbWFuZF92aWV3LkdldFNjYW5FbmFibGUoKSA9PSBnZF9oY2k6OlNjYW5FbmFibGU6OklOUVVJUllfU0NBTl9PTkxZKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRQYWdlU2NhbkVuYWJsZSgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRTY2FuRW5hYmxlKCkgPT0KLSAgICAgICAgICBnZF9oY2k6OlNjYW5FbmFibGU6OklOUVVJUllfQU5EX1BBR0VfU0NBTiB8fAotICAgICAgY29tbWFuZF92aWV3LkdldFNjYW5FbmFibGUoKSA9PSBnZF9oY2k6OlNjYW5FbmFibGU6OlBBR0VfU0NBTl9PTkxZKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVTY2FuRW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OlNldEV2ZW50RmlsdGVyKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlNldEV2ZW50RmlsdGVyVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlNldEV2ZW50RmlsdGVyQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OklucXVpcnkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6SW5xdWlyeVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRJbnF1aXJ5TEFQKGNvbW1hbmRfdmlldy5HZXRMYXAoKS5sYXBfKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRJbnF1aXJ5TWF4UmVzcG9uc2VzKGNvbW1hbmRfdmlldy5HZXROdW1SZXNwb25zZXMoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU3RhcnRJbnF1aXJ5KAotICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhjb21tYW5kX3ZpZXcuR2V0SW5xdWlyeUxlbmd0aCgpICogMTI4MCkpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OklucXVpcnlTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OklucXVpcnlDYW5jZWwoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6SW5xdWlyeUNhbmNlbFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6RGlzY292ZXJ5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5JbnF1aXJ5Q2FuY2VsKCk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OklucXVpcnlDYW5jZWxDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6QWNjZXB0Q29ubmVjdGlvblJlcXVlc3QoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6QWNjZXB0Q29ubmVjdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBZGRyZXNzIGFkZHIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gIGJvb2wgdHJ5X3JvbGVfc3dpdGNoID0gY29tbWFuZF92aWV3LkdldFJvbGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgIGdkX2hjaTo6QWNjZXB0Q29ubmVjdGlvblJlcXVlc3RSb2xlOjpCRUNPTUVfQ0VOVFJBTDsKLSAgYXV0byBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5BY2NlcHRDb25uZWN0aW9uUmVxdWVzdChhZGRyLCB0cnlfcm9sZV9zd2l0Y2gpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpBY2NlcHRDb25uZWN0aW9uUmVxdWVzdFN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVqZWN0Q29ubmVjdGlvblJlcXVlc3QoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVqZWN0Q29ubmVjdGlvblJlcXVlc3RWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBZGRyZXNzIGFkZHIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gIHVpbnQ4X3QgcmVhc29uID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldFJlYXNvbigpKTsKLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlamVjdENvbm5lY3Rpb25SZXF1ZXN0KGFkZHIsIHJlYXNvbik7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlJlamVjdENvbm5lY3Rpb25SZXF1ZXN0U3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMaW5rS2V5UmVxdWVzdFJlcGx5KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxpbmtLZXlSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OlNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQWRkcmVzcyBhZGRyID0gY29tbWFuZF92aWV3LkdldEJkQWRkcigpOwotICBhdXRvIGtleSA9IGNvbW1hbmRfdmlldy5HZXRMaW5rS2V5KCk7Ci0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5MaW5rS2V5UmVxdWVzdFJlcGx5KGFkZHIsIGtleSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxpbmtLZXlSZXF1ZXN0UmVwbHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzLCBhZGRyKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxpbmtLZXlSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBBZGRyZXNzIGFkZHIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gIGF1dG8gc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5MaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoYWRkcik7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHlDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgYWRkcik7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkRlbGV0ZVN0b3JlZExpbmtLZXkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6RGVsZXRlU3RvcmVkTGlua0tleVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQxNl90IGRlbGV0ZWRfa2V5cyA9IDA7Ci0KLSAgYXV0byBmbGFnID0gY29tbWFuZF92aWV3LkdldERlbGV0ZUFsbEZsYWcoKTsKLSAgaWYgKGZsYWcgPT0gZ2RfaGNpOjpEZWxldGVTdG9yZWRMaW5rS2V5RGVsZXRlQWxsRmxhZzo6U1BFQ0lGSUVEX0JEX0FERFIpIHsKLSAgICBBZGRyZXNzIGFkZHIgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0gICAgZGVsZXRlZF9rZXlzID0gc2VjdXJpdHlfbWFuYWdlcl8uRGVsZXRlS2V5KGFkZHIpOwotICB9Ci0KLSAgaWYgKGZsYWcgPT0gZ2RfaGNpOjpEZWxldGVTdG9yZWRMaW5rS2V5RGVsZXRlQWxsRmxhZzo6QUxMKSB7Ci0gICAgc2VjdXJpdHlfbWFuYWdlcl8uRGVsZXRlQWxsS2V5cygpOwotICB9Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6RGVsZXRlU3RvcmVkTGlua0tleUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGRlbGV0ZWRfa2V5cyk7Ci0KLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVtb3RlTmFtZVJlcXVlc3QoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVtb3RlTmFtZVJlcXVlc3RWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgQWRkcmVzcyByZW1vdGVfYWRkciA9IGNvbW1hbmRfdmlldy5HZXRCZEFkZHIoKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2VuZENvbW1hbmRUb1JlbW90ZUJ5QWRkcmVzcygKLSAgICAgIE9wQ29kZTo6UkVNT1RFX05BTUVfUkVRVUVTVCwgY29tbWFuZF92aWV3LkdldFBheWxvYWQoKSwgcmVtb3RlX2FkZHIpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OlJlbW90ZU5hbWVSZXF1ZXN0U3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldEV2ZW50TWFzayhDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVNldEV2ZW50TWFza1ZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBwcm9wZXJ0aWVzXy5TZXRMZUV2ZW50TWFzayhjb21tYW5kX3ZpZXcuR2V0TGVFdmVudE1hc2soKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlU2V0RXZlbnRNYXNrQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVhZEJ1ZmZlclNpemUoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVSZWFkQnVmZmVyU2l6ZVYxVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6OkxlQnVmZmVyU2l6ZSBsZV9idWZmZXJfc2l6ZTsKLSAgbGVfYnVmZmVyX3NpemUubGVfZGF0YV9wYWNrZXRfbGVuZ3RoXyA9IHByb3BlcnRpZXNfLkdldExlRGF0YVBhY2tldExlbmd0aCgpOwotICBsZV9idWZmZXJfc2l6ZS50b3RhbF9udW1fbGVfcGFja2V0c18gPSBwcm9wZXJ0aWVzXy5HZXRUb3RhbE51bUxlRGF0YVBhY2tldHMoKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpMZVJlYWRCdWZmZXJTaXplVjFDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBsZV9idWZmZXJfc2l6ZSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVhZEJ1ZmZlclNpemVWMihDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVJlYWRCdWZmZXJTaXplVjJWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBibHVldG9vdGg6OmhjaTo6TGVCdWZmZXJTaXplIGxlX2J1ZmZlcl9zaXplOwotICBsZV9idWZmZXJfc2l6ZS5sZV9kYXRhX3BhY2tldF9sZW5ndGhfID0gcHJvcGVydGllc18uR2V0TGVEYXRhUGFja2V0TGVuZ3RoKCk7Ci0gIGxlX2J1ZmZlcl9zaXplLnRvdGFsX251bV9sZV9wYWNrZXRzXyA9IHByb3BlcnRpZXNfLkdldFRvdGFsTnVtTGVEYXRhUGFja2V0cygpOwotICBibHVldG9vdGg6OmhjaTo6TGVCdWZmZXJTaXplIGlzb19idWZmZXJfc2l6ZTsKLSAgaXNvX2J1ZmZlcl9zaXplLmxlX2RhdGFfcGFja2V0X2xlbmd0aF8gPSBwcm9wZXJ0aWVzXy5HZXRJc29EYXRhUGFja2V0TGVuZ3RoKCk7Ci0gIGlzb19idWZmZXJfc2l6ZS50b3RhbF9udW1fbGVfcGFja2V0c18gPQotICAgICAgcHJvcGVydGllc18uR2V0VG90YWxOdW1Jc29EYXRhUGFja2V0cygpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlUmVhZEJ1ZmZlclNpemVWMkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIGxlX2J1ZmZlcl9zaXplLCBpc29fYnVmZmVyX3NpemUpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldEFkZHJlc3NSZXNvbHV0aW9uRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlU2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlU2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6U2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlU2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGUoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGUoKSA9PQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZTo6RU5BQkxFRCk7Ci0gIHNlbmRfZXZlbnRfKAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlU2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRSZXNvdmFsYWJsZVByaXZhdGVBZGRyZXNzVGltZW91dChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gICAgLy8gTk9QCi0gICAgYXV0byBwYXlsb2FkID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KAotICAgICAgICAgIHtzdGF0aWNfY2FzdDx1aW50OF90PihibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlOjpTVUNDRVNTKX0pKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgY29tbWFuZC5HZXRPcENvZGUoKSwgc3RkOjptb3ZlKHBheWxvYWQpKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXNWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZVN1cHBvcnRlZEZlYXR1cmVzKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldFJhbmRvbUFkZHJlc3MoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVTZXRSYW5kb21BZGRyZXNzVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZGRyZXNzKGNvbW1hbmRfdmlldy5HZXRSYW5kb21BZGRyZXNzKCkpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpMZVNldFJhbmRvbUFkZHJlc3NDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRBZHZlcnRpc2luZ1BhcmFtZXRlcnMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVTZXRBZHZlcnRpc2luZ1BhcmFtZXRlcnNWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHBlZXJfYWRkcmVzcyA9IGNvbW1hbmRfdmlldy5HZXRQZWVyQWRkcmVzcygpOwotICBhdXRvIHR5cGUgPSBjb21tYW5kX3ZpZXcuR2V0QWR2dFR5cGUoKTsKLSAgaWYgKHR5cGUgIT0gYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nVHlwZTo6QURWX0RJUkVDVF9JTkQgJiYKLSAgICAgIHR5cGUgIT0gYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nVHlwZTo6QURWX0RJUkVDVF9JTkRfTE9XKSB7Ci0gICAgcGVlcl9hZGRyZXNzID0gQWRkcmVzczo6a0VtcHR5OwotICB9Ci0gIHByb3BlcnRpZXNfLlNldExlQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKAotICAgICAgY29tbWFuZF92aWV3LkdldEludGVydmFsTWluKCksIGNvbW1hbmRfdmlldy5HZXRJbnRlcnZhbE1heCgpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4odHlwZSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0T3duQWRkcmVzc1R5cGUoKSksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3NUeXBlKCkpLCBwZWVyX2FkZHJlc3MsCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0Q2hhbm5lbE1hcCgpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldEZpbHRlclBvbGljeSgpKSk7Ci0KLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlU2V0QWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlYWRBZHZlcnRpc2luZ1BoeXNpY2FsQ2hhbm5lbFR4UG93ZXIoCi0gICAgQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9Ci0gICAgICBnZF9oY2k6OkxlUmVhZEFkdmVydGlzaW5nUGh5c2ljYWxDaGFubmVsVHhQb3dlclZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6TGVSZWFkQWR2ZXJ0aXNpbmdQaHlzaWNhbENoYW5uZWxUeFBvd2VyQ29tcGxldGVCdWlsZGVyOjoKLSAgICAgICAgICBDcmVhdGUoa051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAgICAgICAgICAgIHByb3BlcnRpZXNfLkdldExlQWR2ZXJ0aXNpbmdQaHlzaWNhbENoYW5uZWxUeFBvd2VyKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldEFkdmVydGlzaW5nRGF0YShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVNldEFkdmVydGlzaW5nRGF0YVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVBZHZlcnRpc2luZ0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBhdXRvIHBheWxvYWQgPSBjb21tYW5kLkdldFBheWxvYWQoKTsKLSAgYXV0byBkYXRhX3NpemUgPSAqcGF5bG9hZC5iZWdpbigpOwotICBhdXRvIGZpcnN0X2RhdGEgPSBwYXlsb2FkLmJlZ2luKCkgKyAxOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkX2J5dGVze2ZpcnN0X2RhdGEsIGZpcnN0X2RhdGEgKyBkYXRhX3NpemV9OwotICBBU1NFUlRfTE9HKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCksICIlcyBjb21tYW5kLnNpemUoKSA9ICV6dSIsCi0gICAgICAgICAgICAgZ2RfaGNpOjpPcENvZGVUZXh0KGNvbW1hbmQuR2V0T3BDb2RlKCkpLmNfc3RyKCksIGNvbW1hbmQuc2l6ZSgpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpID09IDMyKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50KHBheWxvYWRfYnl0ZXMpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpMZVNldEFkdmVydGlzaW5nRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldFNjYW5SZXNwb25zZURhdGEoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVTZXRTY2FuUmVzcG9uc2VEYXRhVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5HZXRQYXlsb2FkKCkuc2l6ZSgpID09IDMyKTsKLSAgcHJvcGVydGllc18uU2V0TGVTY2FuUmVzcG9uc2Uoc3RkOjp2ZWN0b3I8dWludDhfdD4oCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLmJlZ2luKCkgKyAxLCBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLmVuZCgpKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlU2V0U2NhblJlc3BvbnNlRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldEFkdmVydGlzaW5nRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlU2V0QWR2ZXJ0aXNpbmdFbmFibGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVBZHZlcnRpc2luZ0VuYWJsZSgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRBZHZlcnRpc2luZ0VuYWJsZSgpID09IGdkX2hjaTo6RW5hYmxlOjpFTkFCTEVEKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlU2V0QWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldFNjYW5QYXJhbWV0ZXJzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlU2V0U2NhblBhcmFtZXRlcnNWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlU2Nhbm5pbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhblR5cGUoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0TGVTY2FuVHlwZSgpKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVTY2FuSW50ZXJ2YWwoY29tbWFuZF92aWV3LkdldExlU2NhbkludGVydmFsKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbldpbmRvdyhjb21tYW5kX3ZpZXcuR2V0TGVTY2FuV2luZG93KCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlQWRkcmVzc1R5cGUoY29tbWFuZF92aWV3LkdldE93bkFkZHJlc3NUeXBlKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbkZpbHRlclBvbGljeSgKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRTY2FubmluZ0ZpbHRlclBvbGljeSgpKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlU2V0U2NhblBhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRTY2FuRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlU2V0U2NhbkVuYWJsZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVTY2FubmluZ0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGlmIChjb21tYW5kX3ZpZXcuR2V0TGVTY2FuRW5hYmxlKCkgPT0gZ2RfaGNpOjpFbmFibGU6OkVOQUJMRUQpIHsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbkVuYWJsZShnZF9oY2k6Ok9wQ29kZTo6TEVfU0VUX1NDQU5fRU5BQkxFKTsKLSAgfSBlbHNlIHsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbkVuYWJsZShnZF9oY2k6Ok9wQ29kZTo6Tk9ORSk7Ci0gIH0KLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZUZpbHRlckR1cGxpY2F0ZXMoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0RmlsdGVyRHVwbGljYXRlcygpID09IGdkX2hjaTo6RW5hYmxlOjpFTkFCTEVEKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGVTZXRTY2FuRW5hYmxlQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlQ3JlYXRlQ29ubmVjdGlvbihDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUNyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVTY2FuSW50ZXJ2YWwoY29tbWFuZF92aWV3LkdldExlU2NhbkludGVydmFsKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbldpbmRvdyhjb21tYW5kX3ZpZXcuR2V0TGVTY2FuV2luZG93KCkpOwotICB1aW50OF90IGluaXRpYXRvcl9maWx0ZXJfcG9saWN5ID0KLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRJbml0aWF0b3JGaWx0ZXJQb2xpY3koKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVJbml0aWF0b3JGaWx0ZXJQb2xpY3koaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kpOwotCi0gIGlmIChpbml0aWF0b3JfZmlsdGVyX3BvbGljeSA9PSAwKSB7ICAvLyBDb25uZWN0IGxpc3Qgbm90IHVzZWQKLSAgICB1aW50OF90IHBlZXJfYWRkcmVzc190eXBlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzVHlwZSgpKTsKLSAgICBBZGRyZXNzIHBlZXJfYWRkcmVzcyA9IGNvbW1hbmRfdmlldy5HZXRQZWVyQWRkcmVzcygpOwotICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVQZWVyQWRkcmVzc1R5cGUocGVlcl9hZGRyZXNzX3R5cGUpOwotICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVQZWVyQWRkcmVzcyhwZWVyX2FkZHJlc3MpOwotICB9Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVBZGRyZXNzVHlwZShjb21tYW5kX3ZpZXcuR2V0T3duQWRkcmVzc1R5cGUoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVDb25uZWN0aW9uSW50ZXJ2YWxNaW4oCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0Q29ubkludGVydmFsTWluKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlQ29ubmVjdGlvbkludGVydmFsTWF4KAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5JbnRlcnZhbE1heCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZUNvbm5lY3Rpb25MYXRlbmN5KGNvbW1hbmRfdmlldy5HZXRDb25uTGF0ZW5jeSgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZVN1cGVydmlzaW9uVGltZW91dCgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRTdXBlcnZpc2lvblRpbWVvdXQoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVNaW5pbXVtQ2VMZW5ndGgoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0TWluaW11bUNlTGVuZ3RoKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlTWF4aW11bUNlTGVuZ3RoKAotICAgICAgY29tbWFuZF92aWV3LkdldE1heGltdW1DZUxlbmd0aCgpKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVDb25uZWN0KHRydWUpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlQ3JlYXRlQ29ubmVjdGlvblN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVDb25uZWN0aW9uVXBkYXRlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlQ29ubmVjdGlvblVwZGF0ZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVDb25uZWN0aW9uVXBkYXRlKAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSwgY29tbWFuZF92aWV3LkdldENvbm5JbnRlcnZhbE1pbigpLAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5JbnRlcnZhbE1heCgpLCBjb21tYW5kX3ZpZXcuR2V0Q29ubkxhdGVuY3koKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRTdXBlcnZpc2lvblRpbWVvdXQoKSk7Ci0KLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlQ29ubmVjdGlvblVwZGF0ZVN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpDcmVhdGVDb25uZWN0aW9uKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkNyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIEFkZHJlc3MgYWRkcmVzcyA9IGNvbW1hbmRfdmlldy5HZXRCZEFkZHIoKTsKLSAgdWludDE2X3QgcGFja2V0X3R5cGUgPSBjb21tYW5kX3ZpZXcuR2V0UGFja2V0VHlwZSgpOwotICB1aW50OF90IHBhZ2Vfc2Nhbl9tb2RlID0KLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCkpOwotICB1aW50MTZfdCBjbG9ja19vZmZzZXQgPQotICAgICAgKGNvbW1hbmRfdmlldy5HZXRDbG9ja09mZnNldFZhbGlkKCkgPT0gZ2RfaGNpOjpDbG9ja09mZnNldFZhbGlkOjpWQUxJRAotICAgICAgICAgICA/IGNvbW1hbmRfdmlldy5HZXRDbG9ja09mZnNldCgpCi0gICAgICAgICAgIDogMCk7Ci0gIHVpbnQ4X3QgYWxsb3dfcm9sZV9zd2l0Y2ggPQotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldEFsbG93Um9sZVN3aXRjaCgpKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uQ3JlYXRlQ29ubmVjdGlvbigKLSAgICAgIGFkZHJlc3MsIHBhY2tldF90eXBlLCBwYWdlX3NjYW5fbW9kZSwgY2xvY2tfb2Zmc2V0LCBhbGxvd19yb2xlX3N3aXRjaCk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6Q3JlYXRlQ29ubmVjdGlvblN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6Q3JlYXRlQ29ubmVjdGlvbkNhbmNlbChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpDcmVhdGVDb25uZWN0aW9uQ2FuY2VsVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBBZGRyZXNzIGFkZHJlc3MgPSBjb21tYW5kX3ZpZXcuR2V0QmRBZGRyKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkNyZWF0ZUNvbm5lY3Rpb25DYW5jZWwoYWRkcmVzcyk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6Q3JlYXRlQ29ubmVjdGlvbkNhbmNlbENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIGFkZHJlc3MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpEaXNjb25uZWN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkRpc2Nvbm5lY3RWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0gIHVpbnQ4X3QgcmVhc29uID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldFJlYXNvbigpKTsKLQotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uRGlzY29ubmVjdChoYW5kbGUsIHJlYXNvbik7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6RGlzY29ubmVjdFN0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVDb25uZWN0aW9uQ2FuY2VsKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVDb25uZWN0KGZhbHNlKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlQ3JlYXRlQ29ubmVjdGlvbkNhbmNlbENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMpKTsKLQotICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTiwga1Jlc2VydmVkSGFuZGxlLAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJvbGU6OkNFTlRSQUwsCi0gICAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUywKLSAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzKCksIDEgLyogY29ubmVjdGlvbl9pbnRlcnZhbCAqLywKLSAgICAgIDIgLyogY29ubmVjdGlvbl9sYXRlbmN5ICovLCAzIC8qIHN1cGVydmlzaW9uX3RpbWVvdXQqLywKLSAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpDbG9ja0FjY3VyYWN5PigweDAwKSkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZWFkQ29ubmVjdExpc3RTaXplKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlUmVhZENvbm5lY3RMaXN0U2l6ZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGVSZWFkQ29ubmVjdExpc3RTaXplQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgIHByb3BlcnRpZXNfLkdldExlQ29ubmVjdExpc3RTaXplKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZUNsZWFyQ29ubmVjdExpc3QoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVDbGVhckNvbm5lY3RMaXN0Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlQ29ubmVjdExpc3RDbGVhcigpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpMZUNsZWFyQ29ubmVjdExpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlQWRkRGV2aWNlVG9Db25uZWN0TGlzdFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB1aW50OF90IGFkZHJfdHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRBZGRyZXNzVHlwZSgpKTsKLSAgQWRkcmVzcyBhZGRyZXNzID0gY29tbWFuZF92aWV3LkdldEFkZHJlc3MoKTsKLSAgRXJyb3JDb2RlIHJlc3VsdCA9Ci0gICAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlQ29ubmVjdExpc3RBZGREZXZpY2UoYWRkcmVzcywgYWRkcl90eXBlKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGVBZGREZXZpY2VUb0Nvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHJlc3VsdCk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlUmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQ4X3QgYWRkcl90eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldEFkZHJlc3NUeXBlKCkpOwotICBBZGRyZXNzIGFkZHJlc3MgPSBjb21tYW5kX3ZpZXcuR2V0QWRkcmVzcygpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlQ29ubmVjdExpc3RSZW1vdmVEZXZpY2UoYWRkcmVzcywgYWRkcl90eXBlKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlUmVtb3ZlRGV2aWNlRnJvbUNvbm5lY3RMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZUNsZWFyUmVzb2x2aW5nTGlzdChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUNsZWFyUmVzb2x2aW5nTGlzdFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVSZXNvbHZpbmdMaXN0Q2xlYXIoKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGVDbGVhclJlc29sdmluZ0xpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZWFkUmVzb2x2aW5nTGlzdFNpemUoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVSZWFkUmVzb2x2aW5nTGlzdFNpemVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlU2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpMZVJlYWRSZXNvbHZpbmdMaXN0U2l6ZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRMZVJlc29sdmluZ0xpc3RTaXplKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlYWRNYXhpbXVtRGF0YUxlbmd0aChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVJlYWRNYXhpbXVtRGF0YUxlbmd0aFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGJsdWV0b290aDo6aGNpOjpMZU1heGltdW1EYXRhTGVuZ3RoIGRhdGFfbGVuZ3RoOwotICBkYXRhX2xlbmd0aC5zdXBwb3J0ZWRfbWF4X3J4X29jdGV0c18gPSBrTGVNYXhpbXVtRGF0YUxlbmd0aDsKLSAgZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF9yeF90aW1lXyA9IGtMZU1heGltdW1EYXRhVGltZTsKLSAgZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF90eF9vY3RldHNfID0ga0xlTWF4aW11bURhdGFMZW5ndGggKyAxMDsKLSAgZGF0YV9sZW5ndGguc3VwcG9ydGVkX21heF90eF90aW1lXyA9IGtMZU1heGltdW1EYXRhVGltZSArIDEwOwotICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVSZWFkTWF4aW11bURhdGFMZW5ndGhDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBkYXRhX2xlbmd0aCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZWFkU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGgoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVSZWFkU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGhWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHNlbmRfZXZlbnRfKAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlUmVhZFN1Z2dlc3RlZERlZmF1bHREYXRhTGVuZ3RoQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAgICAgbGVfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV9ieXRlc18sIGxlX3N1Z2dlc3RlZF9kZWZhdWx0X2RhdGFfdGltZV8pKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlV3JpdGVTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aCgKLSAgICBDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVdyaXRlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGhWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHVpbnQxNl90IGJ5dGVzID0gY29tbWFuZF92aWV3LkdldFR4T2N0ZXRzKCk7Ci0gIHVpbnQxNl90IHRpbWUgPSBjb21tYW5kX3ZpZXcuR2V0VHhUaW1lKCk7Ci0gIGlmIChieXRlcyA+IDB4RkIgfHwgYnl0ZXMgPCAweDFCIHx8IHRpbWUgPCAweDE0OCB8fCB0aW1lID4gMHg0MjkwKSB7Ci0gICAgc2VuZF9ldmVudF8oCi0gICAgICAgIGJsdWV0b290aDo6aGNpOjpMZVdyaXRlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGhDb21wbGV0ZUJ1aWxkZXI6OgotICAgICAgICAgICAgQ3JlYXRlKGtOdW1Db21tYW5kUGFja2V0cywKLSAgICAgICAgICAgICAgICAgICBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUykpOwotICAgIHJldHVybjsKLSAgfQotICBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2J5dGVzXyA9IGJ5dGVzOwotICBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX3RpbWVfID0gdGltZTsKLSAgc2VuZF9ldmVudF8oCi0gICAgICBibHVldG9vdGg6OmhjaTo6TGVXcml0ZVN1Z2dlc3RlZERlZmF1bHREYXRhTGVuZ3RoQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZVNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBhdXRvIGFkZHJfdHlwZSA9Ci0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0UGVlcklkZW50aXR5QWRkcmVzc1R5cGUoKSk7Ci0gIEFkZHJlc3MgYWRkcmVzcyA9IGNvbW1hbmRfdmlldy5HZXRQZWVySWRlbnRpdHlBZGRyZXNzKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlUmVzb2x2aW5nTGlzdEFkZERldmljZSgKLSAgICAgIGFkZHJlc3MsIGFkZHJfdHlwZSwgY29tbWFuZF92aWV3LkdldFBlZXJJcmsoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRMb2NhbElyaygpKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlQWRkRGV2aWNlVG9SZXNvbHZpbmdMaXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlbW92ZURldmljZUZyb21SZXNvbHZpbmdMaXN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlUmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3RWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlU2VjdXJpdHlDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQ4X3QgYWRkcl90eXBlID0KLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRQZWVySWRlbnRpdHlBZGRyZXNzVHlwZSgpKTsKLSAgQWRkcmVzcyBhZGRyZXNzID0gY29tbWFuZF92aWV3LkdldFBlZXJJZGVudGl0eUFkZHJlc3MoKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZVJlc29sdmluZ0xpc3RSZW1vdmVEZXZpY2UoYWRkcmVzcywgYWRkcl90eXBlKTsKLSAgYXV0byBwYWNrZXQgPQotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlUmVtb3ZlRGV2aWNlRnJvbVJlc29sdmluZ0xpc3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlU2V0RXh0ZW5kZWRTY2FuUGFyYW1ldGVycyhDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnNWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlU2Nhbm5pbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHBhcmFtZXRlcnMgPSBjb21tYW5kX3ZpZXcuR2V0UGFyYW1ldGVycygpOwotICAvLyBNdWx0aXBsZSBwaHlzIGFyZSBub3Qgc3VwcG9ydGVkLgotICBBU1NFUlQoY29tbWFuZF92aWV3LkdldFNjYW5uaW5nUGh5cygpID09IDEpOwotICBBU1NFUlQocGFyYW1ldGVycy5zaXplKCkgPT0gMSk7Ci0KLSAgYXV0byBzdGF0dXMgPSBFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGlmIChsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkdldExlU2NhbkVuYWJsZSgpID09IE9wQ29kZTo6Tk9ORSkgewotICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVTY2FuVHlwZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFyYW1ldGVyc1swXS5sZV9zY2FuX3R5cGVfKSk7Ci0gICAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZVNjYW5JbnRlcnZhbChwYXJhbWV0ZXJzWzBdLmxlX3NjYW5faW50ZXJ2YWxfKTsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbldpbmRvdyhwYXJhbWV0ZXJzWzBdLmxlX3NjYW5fd2luZG93Xyk7Ci0gICAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZUFkZHJlc3NUeXBlKGNvbW1hbmRfdmlldy5HZXRPd25BZGRyZXNzVHlwZSgpKTsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU2NhbkZpbHRlclBvbGljeSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tbWFuZF92aWV3LkdldFNjYW5uaW5nRmlsdGVyUG9saWN5KCkpKTsKLSAgfSBlbHNlIHsKLSAgICBzdGF0dXMgPSBFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLSAgfQotICBzZW5kX2V2ZW50XygKLSAgICAgIGJsdWV0b290aDo6aGNpOjpMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRFeHRlbmRlZFNjYW5FbmFibGUoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVTZXRFeHRlbmRlZFNjYW5FbmFibGVWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlU2Nhbm5pbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBpZiAoY29tbWFuZF92aWV3LkdldEVuYWJsZSgpID09IGdkX2hjaTo6RW5hYmxlOjpFTkFCTEVEKSB7Ci0gICAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZVNjYW5FbmFibGUoCi0gICAgICAgIGdkX2hjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUpOwotICB9IGVsc2UgewotICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVTY2FuRW5hYmxlKGdkX2hjaTo6T3BDb2RlOjpOT05FKTsKLSAgfQotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlRmlsdGVyRHVwbGljYXRlcygKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRGaWx0ZXJEdXBsaWNhdGVzKCkgPT0gZ2RfaGNpOjpGaWx0ZXJEdXBsaWNhdGVzOjpFTkFCTEVEKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGVTZXRFeHRlbmRlZFNjYW5FbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb24oQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25WaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEFTU0VSVF9MT0coY29tbWFuZF92aWV3LkdldEluaXRpYXRpbmdQaHlzKCkgPT0gMSwgIk9ubHkgTEVfMU0gaXMgc3VwcG9ydGVkIik7Ci0gIGF1dG8gcGFyYW1zID0gY29tbWFuZF92aWV3LkdldFBoeVNjYW5QYXJhbWV0ZXJzKCk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVTY2FuSW50ZXJ2YWwocGFyYW1zWzBdLnNjYW5faW50ZXJ2YWxfKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZVNjYW5XaW5kb3cocGFyYW1zWzBdLnNjYW5fd2luZG93Xyk7Ci0gIGF1dG8gaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kgPSBjb21tYW5kX3ZpZXcuR2V0SW5pdGlhdG9yRmlsdGVyUG9saWN5KCk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVJbml0aWF0b3JGaWx0ZXJQb2xpY3koCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihpbml0aWF0b3JfZmlsdGVyX3BvbGljeSkpOwotCi0gIGlmIChpbml0aWF0b3JfZmlsdGVyX3BvbGljeSA9PQotICAgICAgZ2RfaGNpOjpJbml0aWF0b3JGaWx0ZXJQb2xpY3k6OlVTRV9QRUVSX0FERFJFU1MpIHsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlUGVlckFkZHJlc3NUeXBlKAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3NUeXBlKCkpKTsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlUGVlckFkZHJlc3MoY29tbWFuZF92aWV3LkdldFBlZXJBZGRyZXNzKCkpOwotICB9Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVBZGRyZXNzVHlwZShjb21tYW5kX3ZpZXcuR2V0T3duQWRkcmVzc1R5cGUoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVDb25uZWN0aW9uSW50ZXJ2YWxNaW4oCi0gICAgICBwYXJhbXNbMF0uY29ubl9pbnRlcnZhbF9taW5fKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZUNvbm5lY3Rpb25JbnRlcnZhbE1heCgKLSAgICAgIHBhcmFtc1swXS5jb25uX2ludGVydmFsX21heF8pOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlQ29ubmVjdGlvbkxhdGVuY3kocGFyYW1zWzBdLmNvbm5fbGF0ZW5jeV8pOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlU3VwZXJ2aXNpb25UaW1lb3V0KAotICAgICAgcGFyYW1zWzBdLnN1cGVydmlzaW9uX3RpbWVvdXRfKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZU1pbmltdW1DZUxlbmd0aChwYXJhbXNbMF0ubWluX2NlX2xlbmd0aF8pOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlTWF4aW11bUNlTGVuZ3RoKHBhcmFtc1swXS5tYXhfY2VfbGVuZ3RoXyk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlQ29ubmVjdCh0cnVlKTsKLQotICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb25TdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRQcml2YWN5TW9kZShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVNldFByaXZhY3lNb2RlVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZVNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB1aW50OF90IHBlZXJfaWRlbnRpdHlfYWRkcmVzc190eXBlID0KLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRQZWVySWRlbnRpdHlBZGRyZXNzVHlwZSgpKTsKLSAgQWRkcmVzcyBwZWVyX2lkZW50aXR5X2FkZHJlc3MgPSBjb21tYW5kX3ZpZXcuR2V0UGVlcklkZW50aXR5QWRkcmVzcygpOwotICB1aW50OF90IHByaXZhY3lfbW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbW1hbmRfdmlldy5HZXRQcml2YWN5TW9kZSgpKTsKLQotICBpZiAobGlua19sYXllcl9jb250cm9sbGVyXy5MZVJlc29sdmluZ0xpc3RDb250YWluc0RldmljZSgKLSAgICAgICAgICBwZWVyX2lkZW50aXR5X2FkZHJlc3MsIHBlZXJfaWRlbnRpdHlfYWRkcmVzc190eXBlKSkgewotICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVTZXRQcml2YWN5TW9kZSgKLSAgICAgICAgcGVlcl9pZGVudGl0eV9hZGRyZXNzX3R5cGUsIHBlZXJfaWRlbnRpdHlfYWRkcmVzcywgcHJpdmFjeV9tb2RlKTsKLSAgfQotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlU2V0UHJpdmFjeU1vZGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZWFkSXNvVHhTeW5jKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVSZWFkSXNvVHhTeW5jVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShpc29fY29tbWFuZF92aWV3KSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZVJlYWRJc29UeFN5bmMoY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldENpZ1BhcmFtZXRlcnMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGlzb19jb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlSXNvQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGlzb19jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZVNldENpZ1BhcmFtZXRlcnNWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGlzb19jb21tYW5kX3ZpZXcpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlU2V0Q2lnUGFyYW1ldGVycygKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRDaWdJZCgpLCBjb21tYW5kX3ZpZXcuR2V0U2R1SW50ZXJ2YWxNVG9TKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0U2R1SW50ZXJ2YWxTVG9NKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0UGVyaXBoZXJhbHNDbG9ja0FjY3VyYWN5KCksIGNvbW1hbmRfdmlldy5HZXRQYWNraW5nKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0RnJhbWluZygpLCBjb21tYW5kX3ZpZXcuR2V0TWF4VHJhbnNwb3J0TGF0ZW5jeU1Ub1MoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRNYXhUcmFuc3BvcnRMYXRlbmN5U1RvTSgpLCBjb21tYW5kX3ZpZXcuR2V0Q2lzQ29uZmlnKCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVDcmVhdGVDaXMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGlzb19jb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlSXNvQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGlzb19jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZUNyZWF0ZUNpc1ZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoaXNvX2NvbW1hbmRfdmlldykpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPQotICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZUNyZWF0ZUNpcyhjb21tYW5kX3ZpZXcuR2V0Q2lzQ29uZmlnKCkpOwotICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVDcmVhdGVDaXNTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZW1vdmVDaWcoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGlzb19jb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlSXNvQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGlzb19jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZVJlbW92ZUNpZ1ZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoaXNvX2NvbW1hbmRfdmlldykpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIHVpbnQ4X3QgY2lnID0gY29tbWFuZF92aWV3LkdldENpZ0lkKCk7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlUmVtb3ZlQ2lnKGNpZyk7Ci0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZVJlbW92ZUNpZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIGNpZykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVBY2NlcHRDaXNSZXF1ZXN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVBY2NlcHRDaXNSZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShpc29fY29tbWFuZF92aWV3KSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVBY2NlcHRDaXNSZXF1ZXN0KAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSk7Ci0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUFjY2VwdENpc1JlcXVlc3RTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZWplY3RDaXNSZXF1ZXN0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVSZWplY3RDaXNSZXF1ZXN0Vmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShpc29fY29tbWFuZF92aWV3KSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZVJlamVjdENpc1JlcXVlc3QoY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF92aWV3LkdldFJlYXNvbigpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlQ3JlYXRlQmlnKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVDcmVhdGVCaWdWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGlzb19jb21tYW5kX3ZpZXcpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBFcnJvckNvZGUgc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5MZUNyZWF0ZUJpZygKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRCaWdIYW5kbGUoKSwgY29tbWFuZF92aWV3LkdldEFkdmVydGlzaW5nSGFuZGxlKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0TnVtQmlzKCksIGNvbW1hbmRfdmlldy5HZXRTZHVJbnRlcnZhbCgpLAotICAgICAgY29tbWFuZF92aWV3LkdldE1heFNkdSgpLCBjb21tYW5kX3ZpZXcuR2V0TWF4VHJhbnNwb3J0TGF0ZW5jeSgpLAotICAgICAgY29tbWFuZF92aWV3LkdldFJ0bigpLCBjb21tYW5kX3ZpZXcuR2V0UGh5KCksIGNvbW1hbmRfdmlldy5HZXRQYWNraW5nKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0RnJhbWluZygpLCBjb21tYW5kX3ZpZXcuR2V0RW5jcnlwdGlvbigpLAotICAgICAgY29tbWFuZF92aWV3LkdldEJyb2FkY2FzdENvZGUoKSk7Ci0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUNyZWF0ZUJpZ1N0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVRlcm1pbmF0ZUJpZyhDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gaXNvX2NvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVJc29Db21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoaXNvX2NvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIGNvbW1hbmRfdmlldyA9Ci0gICAgICBnZF9oY2k6OkxlVGVybWluYXRlQmlnVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShpc29fY29tbWFuZF92aWV3KSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVUZXJtaW5hdGVCaWcoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QmlnSGFuZGxlKCksIGNvbW1hbmRfdmlldy5HZXRSZWFzb24oKSk7Ci0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZVRlcm1pbmF0ZUJpZ1N0YXR1c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXR1cywga051bUNvbW1hbmRQYWNrZXRzKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZUJpZ0NyZWF0ZVN5bmMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGlzb19jb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlSXNvQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKTsKLSAgQVNTRVJUKGlzb19jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZUJpZ0NyZWF0ZVN5bmNWaWV3OjpDcmVhdGUoc3RkOjptb3ZlKGlzb19jb21tYW5kX3ZpZXcpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBFcnJvckNvZGUgc3RhdHVzID0gbGlua19sYXllcl9jb250cm9sbGVyXy5MZUJpZ0NyZWF0ZVN5bmMoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QmlnSGFuZGxlKCksIGNvbW1hbmRfdmlldy5HZXRTeW5jSGFuZGxlKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0RW5jcnlwdGlvbigpLCBjb21tYW5kX3ZpZXcuR2V0QnJvYWRjYXN0Q29kZSgpLAotICAgICAgY29tbWFuZF92aWV3LkdldE1zZSgpLCBjb21tYW5kX3ZpZXcuR2V0QmlnU3luY1RpbWVvdXQoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRCaXMoKSk7Ci0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUJpZ0NyZWF0ZVN5bmNTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVCaWdUZXJtaW5hdGVTeW5jKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVCaWdUZXJtaW5hdGVTeW5jVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShpc29fY29tbWFuZF92aWV3KSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZUJpZ1Rlcm1pbmF0ZVN5bmMoY29tbWFuZF92aWV3LkdldEJpZ0hhbmRsZSgpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVxdWVzdFBlZXJTY2EoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVSZXF1ZXN0UGVlclNjYVZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlUmVxdWVzdFBlZXJTY2EoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlUmVxdWVzdFBlZXJTY2FTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXR1cElzb0RhdGFQYXRoKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVTZXR1cElzb0RhdGFQYXRoVmlldzo6Q3JlYXRlKHN0ZDo6bW92ZShpc29fY29tbWFuZF92aWV3KSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZVNldHVwSXNvRGF0YVBhdGgoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpLCBjb21tYW5kX3ZpZXcuR2V0RGF0YVBhdGhEaXJlY3Rpb24oKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXREYXRhUGF0aElkKCksIGNvbW1hbmRfdmlldy5HZXRDb2RlY0lkKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0Q29udHJvbGxlckRlbGF5KCksIGNvbW1hbmRfdmlldy5HZXRDb2RlY0NvbmZpZ3VyYXRpb24oKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlbW92ZUlzb0RhdGFQYXRoKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBpc29fY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUlzb0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChpc29fY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVSZW1vdmVJc29EYXRhUGF0aFZpZXc6OkNyZWF0ZShzdGQ6Om1vdmUoaXNvX2NvbW1hbmRfdmlldykpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVSZW1vdmVJc29EYXRhUGF0aCgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCksIGNvbW1hbmRfdmlldy5HZXREYXRhUGF0aERpcmVjdGlvbigpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVhZFJlbW90ZUZlYXR1cmVzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlUmVhZFJlbW90ZUZlYXR1cmVzVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCk7Ci0KLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNlbmRDb21tYW5kVG9SZW1vdGVCeUhhbmRsZSgKLSAgICAgIE9wQ29kZTo6TEVfUkVBRF9SRU1PVEVfRkVBVFVSRVMsIGNvbW1hbmRfdmlldy5HZXRQYXlsb2FkKCksIGhhbmRsZSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGVSZWFkUmVtb3RlRmVhdHVyZXNTdGF0dXNCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBzdGF0dXMsIGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotCi1zdGF0aWMgc3RkOjpyYW5kb21fZGV2aWNlIHJke307Ci1zdGF0aWMgc3RkOjptdDE5OTM3XzY0IHNfbXR7cmQoKX07Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJhbmQoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVSYW5kVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZVNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB1aW50NjRfdCByYW5kb21fdmFsID0gc19tdCgpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlUmFuZENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsIHJhbmRvbV92YWwpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlYWRTdXBwb3J0ZWRTdGF0ZXMoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVSZWFkU3VwcG9ydGVkU3RhdGVzVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlUmVhZFN1cHBvcnRlZFN0YXRlc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRMZVN1cHBvcnRlZFN0YXRlcygpKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdFJlcGx5KAotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZVJlbW90ZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0UmVwbHlWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpMZUNvbm5lY3Rpb25NYW5hZ2VtZW50Q29tbWFuZFZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBzdGF0dXMgPSBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RSZXBseSgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCksIGNvbW1hbmRfdmlldy5HZXRJbnRlcnZhbE1pbigpLAotICAgICAgY29tbWFuZF92aWV3LkdldEludGVydmFsTWF4KCksIGNvbW1hbmRfdmlldy5HZXRUaW1lb3V0KCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0TGF0ZW5jeSgpLCBjb21tYW5kX3ZpZXcuR2V0TWluaW11bUNlTGVuZ3RoKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0TWF4aW11bUNlTGVuZ3RoKCkpOwotICBzZW5kX2V2ZW50XygKLSAgICAgIGdkX2hjaTo6TGVSZW1vdGVDb25uZWN0aW9uUGFyYW1ldGVyUmVxdWVzdFJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCkpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZVJlbW90ZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0TmVnYXRpdmVSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkxlQ29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgICAgICBnZF9oY2k6OkFjbENvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHN0YXR1cyA9Ci0gICAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgICAgICAgIGNvbW1hbmRfdmlldy5HZXRDb25uZWN0aW9uSGFuZGxlKCksIGNvbW1hbmRfdmlldy5HZXRSZWFzb24oKSk7Ci0gIHNlbmRfZXZlbnRfKAotICAgICAgZ2RfaGNpOjpMZVJlbW90ZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0TmVnYXRpdmVSZXBseUNvbXBsZXRlQnVpbGRlcjo6Ci0gICAgICAgICAgQ3JlYXRlKGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzLAotICAgICAgICAgICAgICAgICBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVZlbmRvckNhcChDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUdldFZlbmRvckNhcGFiaWxpdGllc1ZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6VmVuZG9yQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgdmVjdG9yPHVpbnQ4X3Q+IGNhcHMgPSBwcm9wZXJ0aWVzXy5HZXRMZVZlbmRvckNhcCgpOwotICBpZiAoY2Fwcy5zaXplKCkgPT0gMCkgewotICAgIFNlbmRDb21tYW5kQ29tcGxldGVVbmtub3duT3BDb2RlRXZlbnQoCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihPcENvZGU6OkxFX0dFVF9WRU5ET1JfQ0FQQUJJTElUSUVTKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPiByYXdfYnVpbGRlcl9wdHIgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4oKTsKLSAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEVycm9yQ29kZTo6U1VDQ0VTUykpOwotICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0cyhwcm9wZXJ0aWVzXy5HZXRMZVZlbmRvckNhcCgpKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpDb21tYW5kQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIE9wQ29kZTo6TEVfR0VUX1ZFTkRPUl9DQVBBQklMSVRJRVMsCi0gICAgICBzdGQ6Om1vdmUocmF3X2J1aWxkZXJfcHRyKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlVmVuZG9yTXVsdGlBZHYoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVNdWx0aUFkdnRWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBTZW5kQ29tbWFuZENvbXBsZXRlVW5rbm93bk9wQ29kZUV2ZW50KAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE9wQ29kZTo6TEVfTVVMVElfQURWVCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVBZHZlcnRpc2luZ0ZpbHRlcihDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZUFkdkZpbHRlclZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVTY2FubmluZ0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIFNlbmRDb21tYW5kQ29tcGxldGVVbmtub3duT3BDb2RlRXZlbnQoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oT3BDb2RlOjpMRV9BRFZfRklMVEVSKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZUVuZXJneUluZm8oQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVFbmVyZ3lJbmZvVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpWZW5kb3JDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBTZW5kQ29tbWFuZENvbXBsZXRlVW5rbm93bk9wQ29kZUV2ZW50KAotICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE9wQ29kZTo6TEVfRU5FUkdZX0lORk8pKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3MoCi0gICAgQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzc1ZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVBZHZlcnRpc2luZ0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVFeHRlbmRlZEFkZHJlc3MoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QWR2ZXJ0aXNpbmdIYW5kbGUoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3MoKSk7Ci0gIHNlbmRfZXZlbnRfKAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1JhbmRvbUFkZHJlc3NDb21wbGV0ZUJ1aWxkZXI6OgotICAgICAgICAgIENyZWF0ZShrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUGFyYW1ldGVycygKLSAgICBDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0KLSAgICAgIGdkX2hjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nTGVnYWN5UGFyYW1ldGVyc1ZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgLy8gVE9ETzogU3VwcG9ydCBub24tbGVnYWN5IHBhcmFtZXRlcnMKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlNldExlRXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnMoCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QWR2ZXJ0aXNpbmdIYW5kbGUoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRQcmltYXJ5QWR2ZXJ0aXNpbmdJbnRlcnZhbE1pbigpLAotICAgICAgY29tbWFuZF92aWV3LkdldFByaW1hcnlBZHZlcnRpc2luZ0ludGVydmFsTWF4KCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0QWR2ZXJ0aXNpbmdFdmVudExlZ2FjeVByb3BlcnRpZXMoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRPd25BZGRyZXNzVHlwZSgpLCBjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3NUeXBlKCksCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0UGVlckFkZHJlc3MoKSwgY29tbWFuZF92aWV3LkdldEFkdmVydGlzaW5nRmlsdGVyUG9saWN5KCkpOwotCi0gIHNlbmRfZXZlbnRfKAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgMHhhNSkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRGF0YShDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byByYXdfY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhUmF3Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChyYXdfY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVFeHRlbmRlZEFkdmVydGlzaW5nRGF0YSgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRBZHZlcnRpc2luZ0hhbmRsZSgpLAotICAgICAgcmF3X2NvbW1hbmRfdmlldy5HZXRBZHZlcnRpc2luZ0RhdGEoKSk7Ci0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdTY2FuUmVzcG9uc2UoCi0gICAgQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgcHJvcGVydGllc18uU2V0TGVTY2FuUmVzcG9uc2Uoc3RkOjp2ZWN0b3I8dWludDhfdD4oCi0gICAgICBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLmJlZ2luKCkgKyAxLCBjb21tYW5kX3ZpZXcuR2V0UGF5bG9hZCgpLmVuZCgpKSk7Ci0gIGF1dG8gcmF3X2NvbW1hbmRfdmlldyA9Ci0gICAgICBnZF9oY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ1NjYW5SZXNwb25zZVJhd1ZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKHJhd19jb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5TZXRMZUV4dGVuZGVkU2NhblJlc3BvbnNlRGF0YSgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRBZHZlcnRpc2luZ0hhbmRsZSgpLAotICAgICAgcmF3X2NvbW1hbmRfdmlldy5HZXRTY2FuUmVzcG9uc2VEYXRhKCkpOwotICBzZW5kX2V2ZW50XygKLSAgICAgIGJsdWV0b290aDo6aGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdTY2FuUmVzcG9uc2VDb21wbGV0ZUJ1aWxkZXI6OgotICAgICAgICAgIENyZWF0ZShrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVBZHZlcnRpc2luZ0NvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGF1dG8gZW5hYmxlZF9zZXRzID0gY29tbWFuZF92aWV3LkdldEVuYWJsZWRTZXRzKCk7Ci0gIEVycm9yQ29kZSBzdGF0dXMgPSBFcnJvckNvZGU6OlNVQ0NFU1M7Ci0gIGlmIChlbmFibGVkX3NldHMuc2l6ZSgpID09IDApIHsKLSAgICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLkxlRGlzYWJsZUFkdmVydGlzaW5nU2V0cygpOwotICB9IGVsc2UgewotICAgIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uU2V0TGVFeHRlbmRlZEFkdmVydGlzaW5nRW5hYmxlKAotICAgICAgICBjb21tYW5kX3ZpZXcuR2V0RW5hYmxlKCksIGNvbW1hbmRfdmlldy5HZXRFbmFibGVkU2V0cygpKTsKLSAgfQotICBzZW5kX2V2ZW50XygKLSAgICAgIGJsdWV0b290aDo6aGNpOjpMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cykpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6TGVSZWFkTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aCgKLSAgICBDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVJlYWRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZUFkdmVydGlzaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgc2VuZF9ldmVudF8oCi0gICAgICBibHVldG9vdGg6OmhjaTo6TGVSZWFkTWF4aW11bUFkdmVydGlzaW5nRGF0YUxlbmd0aENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLAotICAgICAgICAgIGtMZU1heGltdW1BZHZlcnRpc2luZ0RhdGFMZW5ndGgpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzKAotICAgIENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPQotICAgICAgZ2RfaGNpOjpMZVJlYWROdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0c1ZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBzZW5kX2V2ZW50XygKLSAgICAgIGJsdWV0b290aDo6aGNpOjpMZVJlYWROdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0c0NvbXBsZXRlQnVpbGRlcjo6Ci0gICAgICAgICAgQ3JlYXRlKAotICAgICAgICAgICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywKLSAgICAgICAgICAgICAgbGlua19sYXllcl9jb250cm9sbGVyXy5MZVJlYWROdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0cygpKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVJlbW92ZUFkdmVydGlzaW5nU2V0KENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlUmVtb3ZlQWR2ZXJ0aXNpbmdTZXRWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVSZW1vdmVBZHZlcnRpc2luZ1NldCgKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRBZHZlcnRpc2luZ0hhbmRsZSgpKTsKLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlUmVtb3ZlQWR2ZXJ0aXNpbmdTZXRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgc3RhdHVzKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZUNsZWFyQWR2ZXJ0aXNpbmdTZXRzKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlQ2xlYXJBZHZlcnRpc2luZ1NldHNWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkxlQWR2ZXJ0aXNpbmdDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKTsKLSAgQVNTRVJUKGNvbW1hbmRfdmlldy5Jc1ZhbGlkKCkpOwotICBhdXRvIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVDbGVhckFkdmVydGlzaW5nU2V0cygpOwotICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVDbGVhckFkdmVydGlzaW5nU2V0c0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlRXh0ZW5kZWRTY2FuUGFyYW1zKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OkxlRXh0ZW5kZWRTY2FuUGFyYW1zVmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZVNjYW5uaW5nQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgU2VuZENvbW1hbmRDb21wbGV0ZVVua25vd25PcENvZGVFdmVudCgKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihPcENvZGU6OkxFX0VYVEVOREVEX1NDQU5fUEFSQU1TKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZVN0YXJ0RW5jcnlwdGlvbihDb21tYW5kVmlldyBjb21tYW5kKSB7Ci0gIGF1dG8gY29tbWFuZF92aWV3ID0gZ2RfaGNpOjpMZVN0YXJ0RW5jcnlwdGlvblZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgRXJyb3JDb2RlIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVFbmFibGVFbmNyeXB0aW9uKAotICAgICAgY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKSwgY29tbWFuZF92aWV3LkdldFJhbmQoKSwKLSAgICAgIGNvbW1hbmRfdmlldy5HZXRFZGl2KCksIGNvbW1hbmRfdmlldy5HZXRMdGsoKSk7Ci0KLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlU3RhcnRFbmNyeXB0aW9uU3RhdHVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgc3RhdHVzLCBrTnVtQ29tbWFuZFBhY2tldHMpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OkxlTG9uZ1Rlcm1LZXlSZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVMb25nVGVybUtleVJlcXVlc3RSZXBseVZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6TGVTZWN1cml0eUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgdWludDE2X3QgaGFuZGxlID0gY29tbWFuZF92aWV3LkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgRXJyb3JDb2RlIHN0YXR1cyA9IGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVMb25nVGVybUtleVJlcXVlc3RSZXBseSgKLSAgICAgIGhhbmRsZSwgY29tbWFuZF92aWV3LkdldExvbmdUZXJtS2V5KCkpOwotCi0gIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUxvbmdUZXJtS2V5UmVxdWVzdFJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIHN0YXR1cywgaGFuZGxlKSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpMZUxvbmdUZXJtS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoCi0gICAgQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6TGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpMZVNlY3VyaXR5Q29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICB1aW50MTZfdCBoYW5kbGUgPSBjb21tYW5kX3ZpZXcuR2V0Q29ubmVjdGlvbkhhbmRsZSgpOwotICBFcnJvckNvZGUgc3RhdHVzID0KLSAgICAgIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uTGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KGhhbmRsZSk7Ci0KLSAgc2VuZF9ldmVudF8oCi0gICAgICBibHVldG9vdGg6OmhjaTo6TGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBzdGF0dXMsIGhhbmRsZSkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6UmVhZENsYXNzT2ZEZXZpY2UoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZENsYXNzT2ZEZXZpY2VWaWV3OjpDcmVhdGUoCi0gICAgICBnZF9oY2k6OkRpc2NvdmVyeUNvbW1hbmRWaWV3OjpDcmVhdGUoY29tbWFuZCkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZENsYXNzT2ZEZXZpY2VDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTLCBwcm9wZXJ0aWVzXy5HZXRDbGFzc09mRGV2aWNlKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkVm9pY2VTZXR0aW5nKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRWb2ljZVNldHRpbmdWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpSZWFkVm9pY2VTZXR0aW5nQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBrTnVtQ29tbWFuZFBhY2tldHMsIEVycm9yQ29kZTo6U1VDQ0VTUywgcHJvcGVydGllc18uR2V0Vm9pY2VTZXR0aW5nKCkpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6UmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0Vmlldzo6Q3JlYXRlKAotICAgICAgZ2RfaGNpOjpDb25uZWN0aW9uTWFuYWdlbWVudENvbW1hbmRWaWV3OjpDcmVhdGUoCi0gICAgICAgICAgZ2RfaGNpOjpBY2xDb21tYW5kVmlldzo6Q3JlYXRlKGNvbW1hbmQpKSk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBhdXRvIHBhY2tldCA9Ci0gICAgICBibHVldG9vdGg6OmhjaTo6UmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0Q29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoQ29tbWFuZFZpZXcgY29tbWFuZCkgewotICBhdXRvIGNvbW1hbmRfdmlldyA9IGdkX2hjaTo6V3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dFZpZXc6OkNyZWF0ZSgKLSAgICAgIGdkX2hjaTo6Q29ubmVjdGlvbk1hbmFnZW1lbnRDb21tYW5kVmlldzo6Q3JlYXRlKAotICAgICAgICAgIGdkX2hjaTo6QWNsQ29tbWFuZFZpZXc6OkNyZWF0ZShjb21tYW5kKSkpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0KLSAgcHJvcGVydGllc18uU2V0Q29ubmVjdGlvbkFjY2VwdFRpbWVvdXQoY29tbWFuZF92aWV3LkdldENvbm5BY2NlcHRUaW1lb3V0KCkpOwotCi0gIGF1dG8gcGFja2V0ID0KLSAgICAgIGJsdWV0b290aDo6aGNpOjpXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MpOwotICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLXZvaWQgRHVhbE1vZGVDb250cm9sbGVyOjpSZWFkTG9vcGJhY2tNb2RlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OlJlYWRMb29wYmFja01vZGVWaWV3OjpDcmVhdGUoY29tbWFuZCk7Ci0gIEFTU0VSVChjb21tYW5kX3ZpZXcuSXNWYWxpZCgpKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6UmVhZExvb3BiYWNrTW9kZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAga051bUNvbW1hbmRQYWNrZXRzLCBFcnJvckNvZGU6OlNVQ0NFU1MsCi0gICAgICBzdGF0aWNfY2FzdDxMb29wYmFja01vZGU+KGxvb3BiYWNrX21vZGVfKSk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLX0KLQotdm9pZCBEdWFsTW9kZUNvbnRyb2xsZXI6OldyaXRlTG9vcGJhY2tNb2RlKENvbW1hbmRWaWV3IGNvbW1hbmQpIHsKLSAgYXV0byBjb21tYW5kX3ZpZXcgPSBnZF9oY2k6OldyaXRlTG9vcGJhY2tNb2RlVmlldzo6Q3JlYXRlKGNvbW1hbmQpOwotICBBU1NFUlQoY29tbWFuZF92aWV3LklzVmFsaWQoKSk7Ci0gIGxvb3BiYWNrX21vZGVfID0gY29tbWFuZF92aWV3LkdldExvb3BiYWNrTW9kZSgpOwotICAvLyBBQ0wgY2hhbm5lbAotICB1aW50MTZfdCBhY2xfaGFuZGxlID0gMHgxMjM7Ci0gIGF1dG8gcGFja2V0X2FjbCA9IGJsdWV0b290aDo6aGNpOjpDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGFjbF9oYW5kbGUsIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpMaW5rVHlwZTo6QUNMLCBibHVldG9vdGg6OmhjaTo6RW5hYmxlOjpESVNBQkxFRCk7Ci0gIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXRfYWNsKSk7Ci0gIC8vIFNDTyBjaGFubmVsCi0gIHVpbnQxNl90IHNjb19oYW5kbGUgPSAweDM0NTsKLSAgYXV0byBwYWNrZXRfc2NvID0gYmx1ZXRvb3RoOjpoY2k6OkNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgc2NvX2hhbmRsZSwgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxpbmtUeXBlOjpTQ08sIGJsdWV0b290aDo6aGNpOjpFbmFibGU6OkRJU0FCTEVEKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldF9zY28pKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6V3JpdGVMb29wYmFja01vZGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGtOdW1Db21tYW5kUGFja2V0cywgRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotfQotCi12b2lkIER1YWxNb2RlQ29udHJvbGxlcjo6U2V0QWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKLSAgcHJvcGVydGllc18uU2V0QWRkcmVzcyhhZGRyZXNzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvZHVhbF9tb2RlX2NvbnRyb2xsZXIuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2R1YWxfbW9kZV9jb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWJjOTMuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvZHVhbF9tb2RlX2NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAibGlua19sYXllcl9jb250cm9sbGVyLmgiCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9kZXZpY2UuaCIKLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9hc3luY19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAic2VjdXJpdHlfbWFuYWdlci5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotdXNpbmcgOjpibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRWaWV3OwotCi0vLyBFbXVsYXRlcyBhIGR1YWwgbW9kZSBCUi9FRFIgKyBMRSBjb250cm9sbGVyIGJ5IG1haW50YWluaW5nIHRoZSBsaW5rIGxheWVyCi0vLyBzdGF0ZSBtYWNoaW5lIGRldGFpbGVkIGluIHRoZSBCbHVldG9vdGggQ29yZSBTcGVjaWZpY2F0aW9uIFZlcnNpb24gNC4yLAotLy8gVm9sdW1lIDYsIFBhcnQgQiwgU2VjdGlvbiAxLjEgKHBhZ2UgMzApLiBQcm92aWRlcyBtZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8KLS8vIGNvbW1hbmRzIHNlbnQgYnkgdGhlIEhDSS4gVGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgY2FsbGJhY2tzIGZyb20KLS8vIGEgY29udHJvbGxlciBpbnN0YW5jZSB3aXRoIHRoZSBIY2lIYW5kbGVyLiBUbyBpbXBsZW1lbnQgYSBuZXcgQmx1ZXRvb3RoCi0vLyBjb21tYW5kLCBzaW1wbHkgYWRkIHRoZSBtZXRob2QgZGVjbGFyYXRpb24gYmVsb3csIHdpdGggcmV0dXJuIHR5cGUgdm9pZCBhbmQgYQotLy8gc2luZ2xlIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBhcmd1bWVudC4gQWZ0ZXIgaW1wbGVtZW50aW5nIHRoZQotLy8gbWV0aG9kLCBzaW1wbHkgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgSGNpSGFuZGxlciB1c2luZyB0aGUgU0VUX0hBTkRMRVIgbWFjcm8gaW4KLS8vIHRoZSBjb250cm9sbGVyJ3MgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQmUgc3VyZSB0byBuYW1lIHlvdXIgbWV0aG9kIGFmdGVyIHRoZQotLy8gY29ycmVzcG9uZGluZyBCbHVldG9vdGggY29tbWFuZCBpbiB0aGUgQ29yZSBTcGVjaWZpY2F0aW9uIHdpdGggdGhlIHByZWZpeAotLy8gIkhjaSIgdG8gZGlzdGluZ3Vpc2ggaXQgYXMgYSBjb250cm9sbGVyIGNvbW1hbmQuCi1jbGFzcyBEdWFsTW9kZUNvbnRyb2xsZXIgOiBwdWJsaWMgRGV2aWNlIHsKLSAgLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBsb2FkZWQgdG8gcG9wdWxhdGUgY29udHJvbGxlciBhdHRyaWJ1dGVzLgotICBzdGF0aWMgY29uc3RleHByIGNoYXIga0NvbnRyb2xsZXJQcm9wZXJ0aWVzRmlsZVtdID0KLSAgICAgICIvdmVuZG9yL2V0Yy9ibHVldG9vdGgvY29udHJvbGxlcl9wcm9wZXJ0aWVzLmpzb24iOwotICBzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtTZWN1cml0eU1hbmFnZXJOdW1LZXlzID0gMTU7Ci0KLSBwdWJsaWM6Ci0gIC8vIFNldHMgYWxsIG9mIHRoZSBtZXRob2RzIHRvIGJlIHVzZWQgYXMgY2FsbGJhY2tzIGluIHRoZSBIY2lIYW5kbGVyLgotICBEdWFsTW9kZUNvbnRyb2xsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnRpZXNfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZyhrQ29udHJvbGxlclByb3BlcnRpZXNGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG51bV9rZXlzID0ga1NlY3VyaXR5TWFuYWdlck51bUtleXMpOwotCi0gIH5EdWFsTW9kZUNvbnRyb2xsZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gRGV2aWNlIG1ldGhvZHMuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRUeXBlU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEluY29taW5nUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBUaW1lclRpY2soKSBvdmVycmlkZTsKLQotICAvLyBSb3V0ZSBjb21tYW5kcyBhbmQgZGF0YSBmcm9tIHRoZSBzdGFjay4KLSAgdm9pZCBIYW5kbGVBY2woc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBhY2xfcGFja2V0KTsKLSAgdm9pZCBIYW5kbGVDb21tYW5kKHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gY29tbWFuZF9wYWNrZXQpOwotICB2b2lkIEhhbmRsZVNjbyhzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHNjb19wYWNrZXQpOwotICB2b2lkIEhhbmRsZUlzbyhzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IGlzb19wYWNrZXQpOwotCi0gIC8vIFNldCB0aGUgY2FsbGJhY2tzIGZvciBzY2hlZHVsaW5nIHRhc2tzLgotICB2b2lkIFJlZ2lzdGVyVGFza1NjaGVkdWxlcihzdGQ6OmZ1bmN0aW9uPEFzeW5jVGFza0lkKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIGNvbnN0IFRhc2tDYWxsYmFjayYpPiBldnRTY2hlZHVsZXIpOwotCi0gIHZvaWQgUmVnaXN0ZXJQZXJpb2RpY1Rhc2tTY2hlZHVsZXIoCi0gICAgICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVGFza0lkKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIGNvbnN0IFRhc2tDYWxsYmFjayYpPgotICAgICAgICAgIHBlcmlvZGljRXZ0U2NoZWR1bGVyKTsKLQotICB2b2lkIFJlZ2lzdGVyVGFza0NhbmNlbChzdGQ6OmZ1bmN0aW9uPHZvaWQoQXN5bmNUYXNrSWQpPiBjYW5jZWwpOwotCi0gIC8vIFNldCB0aGUgY2FsbGJhY2tzIGZvciBzZW5kaW5nIHBhY2tldHMgdG8gdGhlIEhDSS4KLSAgdm9pZCBSZWdpc3RlckV2ZW50Q2hhbm5lbCgKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+KT4mCi0gICAgICAgICAgc2VuZF9ldmVudCk7Ci0KLSAgdm9pZCBSZWdpc3RlckFjbENoYW5uZWwoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4pPiYgc2VuZF9hY2wpOwotCi0gIHZvaWQgUmVnaXN0ZXJTY29DaGFubmVsKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+KT4mIHNlbmRfc2NvKTsKLQotICB2b2lkIFJlZ2lzdGVySXNvQ2hhbm5lbCgKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+KT4mCi0gICAgICAgICAgc2VuZF9pc28pOwotCi0gIC8vIFNldCB0aGUgZGV2aWNlJ3MgYWRkcmVzcy4KLSAgdm9pZCBTZXRBZGRyZXNzKEFkZHJlc3MgYWRkcmVzcykgb3ZlcnJpZGU7Ci0KLSAgLy8gQ29udHJvbGxlciBjb21tYW5kcy4gRm9yIGVycm9yIGNvZGVzLCBzZWUgdGhlIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24sCi0gIC8vIFZlcnNpb24gNC4yLCBWb2x1bWUgMiwgUGFydCBEIChwYWdlIDM3MCkuCi0KLSAgLy8gTGluayBDb250cm9sIENvbW1hbmRzCi0gIC8vIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIgVm9sdW1lIDIgUGFydCBFIDcuMQotCi0gIC8vIDcuMS4xCi0gIHZvaWQgSW5xdWlyeShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjEuMgotICB2b2lkIElucXVpcnlDYW5jZWwoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjUKLSAgdm9pZCBDcmVhdGVDb25uZWN0aW9uKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS42Ci0gIHZvaWQgRGlzY29ubmVjdChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjEuNwotICB2b2lkIENyZWF0ZUNvbm5lY3Rpb25DYW5jZWwoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjgKLSAgdm9pZCBBY2NlcHRDb25uZWN0aW9uUmVxdWVzdChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjEuOQotICB2b2lkIFJlamVjdENvbm5lY3Rpb25SZXF1ZXN0KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xMAotICB2b2lkIExpbmtLZXlSZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjExCi0gIHZvaWQgTGlua0tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xMgotICB2b2lkIFBpbkNvZGVSZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjEzCi0gIHZvaWQgUGluQ29kZVJlcXVlc3ROZWdhdGl2ZVJlcGx5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xNAotICB2b2lkIENoYW5nZUNvbm5lY3Rpb25QYWNrZXRUeXBlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xNQotICB2b2lkIEF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xNgotICB2b2lkIFNldENvbm5lY3Rpb25FbmNyeXB0aW9uKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xNwotICB2b2lkIENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xOAotICB2b2lkIENlbnRyYWxMaW5rS2V5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4xOQotICB2b2lkIFJlbW90ZU5hbWVSZXF1ZXN0KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMi44Ci0gIHZvaWQgU3dpdGNoUm9sZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjEuMjEKLSAgdm9pZCBSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjIyCi0gIHZvaWQgUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXMoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjIzCi0gIHZvaWQgUmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbihDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjEuMjQKLSAgdm9pZCBSZWFkQ2xvY2tPZmZzZXQoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjI5Ci0gIHZvaWQgSW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4zMAotICB2b2lkIFVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjMxCi0gIHZvaWQgVXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4zMgotICB2b2lkIFVzZXJQYXNza2V5UmVxdWVzdFJlcGx5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMS4zMwotICB2b2lkIFVzZXJQYXNza2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjM0Ci0gIHZvaWQgUmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjEuMzUKLSAgdm9pZCBSZW1vdGVPb2JEYXRhUmVxdWVzdE5lZ2F0aXZlUmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjM2Ci0gIHZvaWQgSW9DYXBhYmlsaXR5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4xLjUzCi0gIHZvaWQgUmVtb3RlT29iRXh0ZW5kZWREYXRhUmVxdWVzdFJlcGx5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIExpbmsgUG9saWN5IENvbW1hbmRzCi0gIC8vIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIgVm9sdW1lIDIgUGFydCBFIDcuMgotCi0gIC8vIDcuMi4xCi0gIHZvaWQgSG9sZE1vZGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4yLjIKLSAgdm9pZCBTbmlmZk1vZGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4yLjMKLSAgdm9pZCBFeGl0U25pZmZNb2RlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMi42Ci0gIHZvaWQgUW9zU2V0dXAoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4yLjcKLSAgdm9pZCBSb2xlRGlzY292ZXJ5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMi4xMAotICB2b2lkIFdyaXRlTGlua1BvbGljeVNldHRpbmdzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMi4xMQotICB2b2lkIFJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMi4xMgotICB2b2lkIFdyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjIuMTMKLSAgdm9pZCBGbG93U3BlY2lmaWNhdGlvbihDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjIuMTQKLSAgdm9pZCBTbmlmZlN1YnJhdGluZyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyBMaW5rIENvbnRyb2xsZXIgQ29tbWFuZHMKLSAgLy8gQmx1ZXRvb3RoIENvcmUgU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDQuMiBWb2x1bWUgMiBQYXJ0IEUgNy4zCi0KLSAgLy8gNy4zLjEKLSAgdm9pZCBTZXRFdmVudE1hc2soQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjIKLSAgdm9pZCBSZXNldChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuMwotICB2b2lkIFNldEV2ZW50RmlsdGVyKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy4xMAotICB2b2lkIERlbGV0ZVN0b3JlZExpbmtLZXkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjExCi0gIHZvaWQgV3JpdGVMb2NhbE5hbWUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjEyCi0gIHZvaWQgUmVhZExvY2FsTmFtZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuMTUKLSAgdm9pZCBSZWFkUGFnZVRpbWVvdXQoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjE2Ci0gIHZvaWQgV3JpdGVQYWdlVGltZW91dChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuMTcKLSAgdm9pZCBSZWFkU2NhbkVuYWJsZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuMTgKLSAgdm9pZCBXcml0ZVNjYW5FbmFibGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjE5Ci0gIHZvaWQgUmVhZFBhZ2VTY2FuQWN0aXZpdHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjIwCi0gIHZvaWQgV3JpdGVQYWdlU2NhbkFjdGl2aXR5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy4yMQotICB2b2lkIFJlYWRJbnF1aXJ5U2NhbkFjdGl2aXR5KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy4yMgotICB2b2lkIFdyaXRlSW5xdWlyeVNjYW5BY3Rpdml0eShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuMjMKLSAgdm9pZCBSZWFkQXV0aGVudGljYXRpb25FbmFibGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjI0Ci0gIHZvaWQgV3JpdGVBdXRoZW50aWNhdGlvbkVuYWJsZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuMjYKLSAgdm9pZCBXcml0ZUNsYXNzT2ZEZXZpY2UoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjI4Ci0gIHZvaWQgV3JpdGVWb2ljZVNldHRpbmcoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjM5Ci0gIHZvaWQgSG9zdEJ1ZmZlclNpemUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjQyCi0gIHZvaWQgV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy40MwotICB2b2lkIFJlYWROdW1iZXJPZlN1cHBvcnRlZElhYyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuNDQKLSAgdm9pZCBSZWFkQ3VycmVudElhY0xhcChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuNDUKLSAgdm9pZCBXcml0ZUN1cnJlbnRJYWNMYXAoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjQ3Ci0gIHZvaWQgUmVhZElucXVpcnlTY2FuVHlwZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuNDgKLSAgdm9pZCBXcml0ZUlucXVpcnlTY2FuVHlwZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuNDkKLSAgdm9pZCBSZWFkSW5xdWlyeU1vZGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjUwCi0gIHZvaWQgV3JpdGVJbnF1aXJ5TW9kZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuNTIKLSAgdm9pZCBSZWFkUGFnZVNjYW5UeXBlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy41MgotICB2b2lkIFdyaXRlUGFnZVNjYW5UeXBlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy41NgotICB2b2lkIFdyaXRlRXh0ZW5kZWRJbnF1aXJ5UmVzcG9uc2UoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjU3Ci0gIHZvaWQgUmVmcmVzaEVuY3J5cHRpb25LZXkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjU5Ci0gIHZvaWQgV3JpdGVTaW1wbGVQYWlyaW5nTW9kZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuNjAKLSAgdm9pZCBSZWFkTG9jYWxPb2JEYXRhKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy42MQotICB2b2lkIFJlYWRJbnF1aXJ5UmVzcG9uc2VUcmFuc21pdFBvd2VyTGV2ZWwoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjYzCi0gIHZvaWQgU2VuZEtleXByZXNzTm90aWZpY2F0aW9uKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy42OQotICB2b2lkIFNldEV2ZW50TWFza1BhZ2UyKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuMy43OQotICB2b2lkIFdyaXRlTGVIb3N0U3VwcG9ydChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjMuOTIKLSAgdm9pZCBXcml0ZVNlY3VyZUNvbm5lY3Rpb25zSG9zdFN1cHBvcnQoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy4zLjk1Ci0gIHZvaWQgUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIEluZm9ybWF0aW9uYWwgUGFyYW1ldGVycyBDb21tYW5kcwotICAvLyBCbHVldG9vdGggQ29yZSBTcGVjaWZpY2F0aW9uIFZlcnNpb24gNC4yIFZvbHVtZSAyIFBhcnQgRSA3LjQKLQotICAvLyA3LjQuNQotICB2b2lkIFJlYWRCdWZmZXJTaXplKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuNC4xCi0gIHZvaWQgUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuNC42Ci0gIHZvaWQgUmVhZEJkQWRkcihDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjQuMgotICB2b2lkIFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuNC4zCi0gIHZvaWQgUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy40LjQKLSAgdm9pZCBSZWFkTG9jYWxFeHRlbmRlZEZlYXR1cmVzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuNC44Ci0gIHZvaWQgUmVhZExvY2FsU3VwcG9ydGVkQ29kZWNzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIFN0YXR1cyBQYXJhbWV0ZXJzIENvbW1hbmRzCi0gIC8vIEJsdWV0b290aCBDb3JlIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIgVm9sdW1lIDIgUGFydCBFIDcuNQotCi0gIC8vIDcuNS43Ci0gIHZvaWQgUmVhZEVuY3J5cHRpb25LZXlTaXplKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIFRlc3QgQ29tbWFuZHMKLSAgLy8gQmx1ZXRvb3RoIENvcmUgU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDQuMiBWb2x1bWUgMiBQYXJ0IEUgNy43Ci0KLSAgLy8gNy43LjEKLSAgdm9pZCBSZWFkTG9vcGJhY2tNb2RlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuNy4yCi0gIHZvaWQgV3JpdGVMb29wYmFja01vZGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gTEUgQ29udHJvbGxlciBDb21tYW5kcwotICAvLyBCbHVldG9vdGggQ29yZSBTcGVjaWZpY2F0aW9uIFZlcnNpb24gNC4yIFZvbHVtZSAyIFBhcnQgRSA3LjgKLQotICAvLyA3LjguMQotICB2b2lkIExlU2V0RXZlbnRNYXNrKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC4yCi0gIHZvaWQgTGVSZWFkQnVmZmVyU2l6ZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMwotICB2b2lkIExlUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjQKLSAgdm9pZCBMZVNldFJhbmRvbUFkZHJlc3MoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjUKLSAgdm9pZCBMZVNldEFkdmVydGlzaW5nUGFyYW1ldGVycyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNgotICB2b2lkIExlUmVhZEFkdmVydGlzaW5nUGh5c2ljYWxDaGFubmVsVHhQb3dlcihDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNwotICB2b2lkIExlU2V0QWR2ZXJ0aXNpbmdEYXRhKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC44Ci0gIHZvaWQgTGVTZXRTY2FuUmVzcG9uc2VEYXRhKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC45Ci0gIHZvaWQgTGVTZXRBZHZlcnRpc2luZ0VuYWJsZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMTAKLSAgdm9pZCBMZVNldFNjYW5QYXJhbWV0ZXJzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC4xMQotICB2b2lkIExlU2V0U2NhbkVuYWJsZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMTIKLSAgdm9pZCBMZUNyZWF0ZUNvbm5lY3Rpb24oQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjE4Ci0gIHZvaWQgTGVDb25uZWN0aW9uVXBkYXRlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC4xMwotICB2b2lkIExlQ29ubmVjdGlvbkNhbmNlbChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMTQKLSAgdm9pZCBMZVJlYWRDb25uZWN0TGlzdFNpemUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjE1Ci0gIHZvaWQgTGVDbGVhckNvbm5lY3RMaXN0KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC4xNgotICB2b2lkIExlQWRkRGV2aWNlVG9Db25uZWN0TGlzdChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMTcKLSAgdm9pZCBMZVJlbW92ZURldmljZUZyb21Db25uZWN0TGlzdChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMjEKLSAgdm9pZCBMZVJlYWRSZW1vdGVGZWF0dXJlcyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMjMKLSAgdm9pZCBMZVJhbmQoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjI0Ci0gIHZvaWQgTGVTdGFydEVuY3J5cHRpb24oQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjI1Ci0gIHZvaWQgTGVMb25nVGVybUtleVJlcXVlc3RSZXBseShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMjYKLSAgdm9pZCBMZUxvbmdUZXJtS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjI3Ci0gIHZvaWQgTGVSZWFkU3VwcG9ydGVkU3RhdGVzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC4zMQotICB2b2lkIExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RSZXBseShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMzIKLSAgdm9pZCBMZVJlbW90ZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0TmVnYXRpdmVSZXBseShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMzQKLSAgdm9pZCBMZVJlYWRTdWdnZXN0ZWREZWZhdWx0RGF0YUxlbmd0aChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguMzUKLSAgdm9pZCBMZVdyaXRlU3VnZ2VzdGVkRGVmYXVsdERhdGFMZW5ndGgoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjM4Ci0gIHZvaWQgTGVBZGREZXZpY2VUb1Jlc29sdmluZ0xpc3QoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjM5Ci0gIHZvaWQgTGVSZW1vdmVEZXZpY2VGcm9tUmVzb2x2aW5nTGlzdChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNDAKLSAgdm9pZCBMZUNsZWFyUmVzb2x2aW5nTGlzdChDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNDEKLSAgdm9pZCBMZVJlYWRSZXNvbHZpbmdMaXN0U2l6ZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNDQKLSAgdm9pZCBMZVNldEFkZHJlc3NSZXNvbHV0aW9uRW5hYmxlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC40NQotICB2b2lkIExlU2V0UmVzb3ZhbGFibGVQcml2YXRlQWRkcmVzc1RpbWVvdXQoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjQ2Ci0gIHZvaWQgTGVSZWFkTWF4aW11bURhdGFMZW5ndGgoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjUyCi0gIHZvaWQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nUmFuZG9tQWRkcmVzcyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNTMKLSAgdm9pZCBMZVNldEV4dGVuZGVkQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC41NAotICB2b2lkIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGEoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjU1Ci0gIHZvaWQgTGVTZXRFeHRlbmRlZEFkdmVydGlzaW5nU2NhblJlc3BvbnNlKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC41NgotICB2b2lkIExlU2V0RXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNTcKLSAgdm9pZCBMZVJlYWRNYXhpbXVtQWR2ZXJ0aXNpbmdEYXRhTGVuZ3RoKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC41OAotICB2b2lkIExlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIDcuOC41OQotICB2b2lkIExlUmVtb3ZlQWR2ZXJ0aXNpbmdTZXQoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjYwCi0gIHZvaWQgTGVDbGVhckFkdmVydGlzaW5nU2V0cyhDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguNjQKLSAgdm9pZCBMZVNldEV4dGVuZGVkU2NhblBhcmFtZXRlcnMoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjY1Ci0gIHZvaWQgTGVTZXRFeHRlbmRlZFNjYW5FbmFibGUoQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44LjY2Ci0gIHZvaWQgTGVFeHRlbmRlZENyZWF0ZUNvbm5lY3Rpb24oQ29tbWFuZFZpZXcgYXJncyk7Ci0KLSAgLy8gNy44Ljc3Ci0gIHZvaWQgTGVTZXRQcml2YWN5TW9kZShDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguOTMgKG1vdmVkIHRvIDcuOC4yKQotICB2b2lkIExlUmVhZEJ1ZmZlclNpemVWMihDb21tYW5kVmlldyBhcmdzKTsKLQotICAvLyA3LjguOTYgLSA3LjguMTEwCi0gIHZvaWQgTGVSZWFkSXNvVHhTeW5jKENvbW1hbmRWaWV3IHBhY2tldF92aWV3KTsKLSAgdm9pZCBMZVNldENpZ1BhcmFtZXRlcnMoQ29tbWFuZFZpZXcgcGFja2V0X3ZpZXcpOwotICB2b2lkIExlQ3JlYXRlQ2lzKENvbW1hbmRWaWV3IHBhY2tldF92aWV3KTsKLSAgdm9pZCBMZVJlbW92ZUNpZyhDb21tYW5kVmlldyBwYWNrZXRfdmlldyk7Ci0gIHZvaWQgTGVBY2NlcHRDaXNSZXF1ZXN0KENvbW1hbmRWaWV3IHBhY2tldF92aWV3KTsKLSAgdm9pZCBMZVJlamVjdENpc1JlcXVlc3QoQ29tbWFuZFZpZXcgcGFja2V0X3ZpZXcpOwotICB2b2lkIExlQ3JlYXRlQmlnKENvbW1hbmRWaWV3IHBhY2tldF92aWV3KTsKLSAgdm9pZCBMZVRlcm1pbmF0ZUJpZyhDb21tYW5kVmlldyBwYWNrZXRfdmlldyk7Ci0gIHZvaWQgTGVCaWdDcmVhdGVTeW5jKENvbW1hbmRWaWV3IHBhY2tldF92aWV3KTsKLSAgdm9pZCBMZUJpZ1Rlcm1pbmF0ZVN5bmMoQ29tbWFuZFZpZXcgcGFja2V0X3ZpZXcpOwotICB2b2lkIExlUmVxdWVzdFBlZXJTY2EoQ29tbWFuZFZpZXcgcGFja2V0X3ZpZXcpOwotICB2b2lkIExlU2V0dXBJc29EYXRhUGF0aChDb21tYW5kVmlldyBwYWNrZXRfdmlldyk7Ci0gIHZvaWQgTGVSZW1vdmVJc29EYXRhUGF0aChDb21tYW5kVmlldyBwYWNrZXRfdmlldyk7Ci0KLSAgLy8gVmVuZG9yLXNwZWNpZmljIENvbW1hbmRzCi0KLSAgdm9pZCBMZVZlbmRvclNsZWVwTW9kZShDb21tYW5kVmlldyBhcmdzKTsKLSAgdm9pZCBMZVZlbmRvckNhcChDb21tYW5kVmlldyBhcmdzKTsKLSAgdm9pZCBMZVZlbmRvck11bHRpQWR2KENvbW1hbmRWaWV3IGFyZ3MpOwotICB2b2lkIExlVmVuZG9yMTU1KENvbW1hbmRWaWV3IGFyZ3MpOwotICB2b2lkIExlVmVuZG9yMTU3KENvbW1hbmRWaWV3IGFyZ3MpOwotICB2b2lkIExlRW5lcmd5SW5mbyhDb21tYW5kVmlldyBhcmdzKTsKLSAgdm9pZCBMZUFkdmVydGlzaW5nRmlsdGVyKENvbW1hbmRWaWV3IGFyZ3MpOwotICB2b2lkIExlRXh0ZW5kZWRTY2FuUGFyYW1zKENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIC8vIFJlcXVpcmVkIGNvbW1hbmRzIGZvciBoYW5kc2hha2luZyB3aXRoIGhjaSBkcml2ZXIKLSAgdm9pZCBSZWFkQ2xhc3NPZkRldmljZShDb21tYW5kVmlldyBhcmdzKTsKLSAgdm9pZCBSZWFkVm9pY2VTZXR0aW5nKENvbW1hbmRWaWV3IGFyZ3MpOwotICB2b2lkIFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dChDb21tYW5kVmlldyBhcmdzKTsKLSAgdm9pZCBXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KENvbW1hbmRWaWV3IGFyZ3MpOwotCi0gIHZvaWQgU2V0VGltZXJQZXJpb2Qoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBuZXdfcGVyaW9kKTsKLSAgdm9pZCBTdGFydFRpbWVyKCk7Ci0gIHZvaWQgU3RvcFRpbWVyKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIExpbmtMYXllckNvbnRyb2xsZXIgbGlua19sYXllcl9jb250cm9sbGVyX3twcm9wZXJ0aWVzX307Ci0KLSBwcml2YXRlOgotICAvLyBTZXQgYSB0aW1lciBmb3IgYSBmdXR1cmUgYWN0aW9uCi0gIHZvaWQgQWRkQ29udHJvbGxlckV2ZW50KHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIGNvbnN0IFRhc2tDYWxsYmFjayYgY2FsbGJhY2spOwotCi0gIHZvaWQgQWRkQ29ubmVjdGlvbkFjdGlvbihjb25zdCBUYXNrQ2FsbGJhY2smIGNhbGxiYWNrLCB1aW50MTZfdCBoYW5kbGUpOwotCi0gIHZvaWQgU2VuZENvbW1hbmRDb21wbGV0ZVVua25vd25PcENvZGVFdmVudCh1aW50MTZfdCBjb21tYW5kX29wY29kZSkgY29uc3Q7Ci0KLSAgLy8gVW51c2VkIHN0YXRlIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGZvciB0aGUgSG9zdAotICB1aW50MTZfdCBsZV9zdWdnZXN0ZWRfZGVmYXVsdF9kYXRhX2J5dGVzX3sweDIwfTsKLSAgdWludDE2X3QgbGVfc3VnZ2VzdGVkX2RlZmF1bHRfZGF0YV90aW1lX3sweDE0OH07Ci0KLSAgLy8gQ2FsbGJhY2tzIHRvIHNlbmQgcGFja2V0cyBiYWNrIHRvIHRoZSBIQ0kuCi0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpoY2k6OkFjbEJ1aWxkZXI+KT4gc2VuZF9hY2xfOwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpFdmVudEJ1aWxkZXI+KT4KLSAgICAgIHNlbmRfZXZlbnRfOwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpTY29CdWlsZGVyPik+IHNlbmRfc2NvXzsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6SXNvQnVpbGRlcj4pPiBzZW5kX2lzb187Ci0KLSAgLy8gTWFpbnRhaW5zIHRoZSBjb21tYW5kcyB0byBiZSByZWdpc3RlcmVkIGFuZCB1c2VkIGluIHRoZSBIY2lIYW5kbGVyIG9iamVjdC4KLSAgLy8gS2V5cyBhcmUgY29tbWFuZCBvcGNvZGVzIGFuZCB2YWx1ZXMgYXJlIHRoZSBjYWxsYmFja3MgdG8gaGFuZGxlIGVhY2gKLSAgLy8gY29tbWFuZC4KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPGJsdWV0b290aDo6aGNpOjpPcENvZGUsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYmx1ZXRvb3RoOjpoY2k6OkNvbW1hbmRWaWV3KT4+Ci0gICAgICBhY3RpdmVfaGNpX2NvbW1hbmRzXzsKLQotICBibHVldG9vdGg6OmhjaTo6TG9vcGJhY2tNb2RlIGxvb3BiYWNrX21vZGVfOwotCi0gIFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eV9tYW5hZ2VyXzsKLQotICBEdWFsTW9kZUNvbnRyb2xsZXIoY29uc3QgRHVhbE1vZGVDb250cm9sbGVyJiBjbWRQY2t0KSA9IGRlbGV0ZTsKLSAgRHVhbE1vZGVDb250cm9sbGVyJiBvcGVyYXRvcj0oY29uc3QgRHVhbE1vZGVDb250cm9sbGVyJiBjbWRQY2t0KSA9IGRlbGV0ZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2lzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlci5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2lzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhMjc2Mi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9pc29jaHJvbm91c19jb25uZWN0aW9uX2hhbmRsZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9pc29jaHJvbm91c19jb25uZWN0aW9uX2hhbmRsZXIuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLXVzaW5nIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGU7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OmhjaTo6TGVTZXRDaWdQYXJhbWV0ZXJzQ29tcGxldGVCdWlsZGVyPgotSXNvY2hyb25vdXNDb25uZWN0aW9uSGFuZGxlcjo6U2V0Q2lnUGFyYW1ldGVycygKLSAgICBHcm91cFBhcmFtZXRlcnMgZ3JvdXBfcGFyYW1ldGVycywgc3RkOjp2ZWN0b3I8U3RyZWFtUGFyYW1ldGVycz4mIHN0cmVhbXMsCi0gICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGhhbmRsZXMpIHsKLSAgaWYgKGdyb3Vwc18uY291bnQoZ3JvdXBfcGFyYW1ldGVycy5pZCkgIT0gMCkgewotICAgIGlmIChncm91cHNfLmF0KGdyb3VwX3BhcmFtZXRlcnMuaWQpLkhhc1N0cmVhbXMoKSkgewotICAgICAgcmV0dXJuIGJsdWV0b290aDo6aGNpOjpMZVNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAxLCBFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRCwgZ3JvdXBfcGFyYW1ldGVycy5pZCwge30pOwotICAgIH0KLSAgICBncm91cHNfLmVyYXNlKGdyb3VwX3BhcmFtZXRlcnMuaWQpOwotICB9Ci0KLSAgLy8gVE9ETzogTGltaXQgZ3JvdXBzIGFuZCByZXR1cm4gRXJyb3JDb2RlOjpNRU1PUllfQ0FQQUNJVFlfRVhDRUVERUQKLSAgLy8gVE9ETzogTGltaXQgY29ubmVjdGlvbnMgcmV0dXJuIEVycm9yQ29kZTo6Q09OTkVDVElPTl9MSU1JVF9FWENFRURFRAotCi0gIHN0ZDo6dmVjdG9yPENvbm5lY3RlZElzb2Nocm9ub3VzU3RyZWFtPiBjcmVhdGVkX3N0cmVhbXM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgIHN0cmVhbXNbaV0uaGFuZGxlID0gaGFuZGxlc1tpXTsKLSAgICBzdHJlYW1zW2ldLmdyb3VwX2lkID0gZ3JvdXBfcGFyYW1ldGVycy5pZDsKLSAgICBjcmVhdGVkX3N0cmVhbXMuZW1wbGFjZV9iYWNrKHN0cmVhbXNbaV0pOwotICAgIGNpc190b19ncm91cF8uZW1wbGFjZShoYW5kbGVzW2ldLCBncm91cF9wYXJhbWV0ZXJzLmlkKTsKLSAgfQotCi0gIGdyb3Vwc18uZW1wbGFjZShzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoZ3JvdXBfcGFyYW1ldGVycy5pZCksCi0gICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoZ3JvdXBfcGFyYW1ldGVycywgY3JlYXRlZF9zdHJlYW1zKSk7Ci0KLSAgcmV0dXJuIGJsdWV0b290aDo6aGNpOjpMZVNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIDEsIEVycm9yQ29kZTo6U1VDQ0VTUywgZ3JvdXBfcGFyYW1ldGVycy5pZCwgaGFuZGxlcyk7Ci19Ci0KLWJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgSXNvY2hyb25vdXNDb25uZWN0aW9uSGFuZGxlcjo6UmVtb3ZlQ2lnKAotICAgIHVpbnQ4X3QgY2lnX2lkKSB7Ci0gIGlmIChncm91cHNfLmNvdW50KGNpZ19pZCkgIT0gMCkgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotICBpZiAoZ3JvdXBzXy5hdChjaWdfaWQpLkhhc0Nvbm5lY3RlZFN0cmVhbSgpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotICB9Ci0gIGdyb3Vwc18uZXJhc2UoY2lnX2lkKTsKLSAgYXV0byBjb3B5ID0gY2lzX3RvX2dyb3VwXzsKLSAgY2lzX3RvX2dyb3VwXy5jbGVhcigpOwotICBmb3IgKGF1dG8gcGFpciA6IGNpc190b19ncm91cF8pIHsKLSAgICBpZiAocGFpci5zZWNvbmQgIT0gY2lnX2lkKSB7Ci0gICAgICBjaXNfdG9fZ3JvdXBfLmVtcGxhY2UocGFpci5maXJzdCwgcGFpci5zZWNvbmQpOwotICAgIH0KLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1ib29sIElzb2Nocm9ub3VzQ29ubmVjdGlvbkhhbmRsZXI6Okhhc0hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgcmV0dXJuIGNpc190b19ncm91cF8uY291bnQoaGFuZGxlKSAhPSAwOwotfQotCi11aW50OF90IElzb2Nocm9ub3VzQ29ubmVjdGlvbkhhbmRsZXI6OkdldEdyb3VwSWQodWludDE2X3QgaGFuZGxlKSBjb25zdCB7Ci0gIHJldHVybiBjaXNfdG9fZ3JvdXBfLmF0KGhhbmRsZSk7Ci19Ci0KLVN0cmVhbVBhcmFtZXRlcnMgSXNvY2hyb25vdXNDb25uZWN0aW9uSGFuZGxlcjo6R2V0U3RyZWFtUGFyYW1ldGVycygKLSAgICB1aW50MTZfdCBoYW5kbGUpIGNvbnN0IHsKLSAgcmV0dXJuIGdyb3Vwc18uYXQoY2lzX3RvX2dyb3VwXy5hdChoYW5kbGUpKS5HZXRTdHJlYW1QYXJhbWV0ZXJzKGhhbmRsZSk7Ci19Ci0KLUdyb3VwUGFyYW1ldGVycyBJc29jaHJvbm91c0Nvbm5lY3Rpb25IYW5kbGVyOjpHZXRHcm91cFBhcmFtZXRlcnMoCi0gICAgdWludDhfdCBpZCkgY29uc3QgewotICByZXR1cm4gZ3JvdXBzXy5hdChpZCkuR2V0UGFyYW1ldGVycygpOwotfQotCi1ib29sIElzb2Nocm9ub3VzQ29ubmVjdGlvbkhhbmRsZXI6OkdldFN0cmVhbUlzQ29ubmVjdGVkKHVpbnQxNl90IGhhbmRsZSkgY29uc3QgewotICByZXR1cm4gZ3JvdXBzXy5hdChjaXNfdG9fZ3JvdXBfLmF0KGhhbmRsZSkpLlN0cmVhbUlzQ29ubmVjdGVkKGhhbmRsZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2lzb2Nocm9ub3VzX2Nvbm5lY3Rpb25faGFuZGxlci5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvaXNvY2hyb25vdXNfY29ubmVjdGlvbl9oYW5kbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTY3NTAuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvaXNvY2hyb25vdXNfY29ubmVjdGlvbl9oYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZGVsL2NvbnRyb2xsZXIvY29ubmVjdGVkX2lzb2Nocm9ub3VzX2dyb3VwLmgiCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9jb25uZWN0ZWRfaXNvY2hyb25vdXNfc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1jbGFzcyBJc29jaHJvbm91c0Nvbm5lY3Rpb25IYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIElzb2Nocm9ub3VzQ29ubmVjdGlvbkhhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfklzb2Nocm9ub3VzQ29ubmVjdGlvbkhhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPGJsdWV0b290aDo6aGNpOjpMZVNldENpZ1BhcmFtZXRlcnNDb21wbGV0ZUJ1aWxkZXI+Ci0gIFNldENpZ1BhcmFtZXRlcnMoR3JvdXBQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyZWFtUGFyYW1ldGVycz4mIHN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGhhbmRsZXMpOwotCi0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgUmVtb3ZlQ2lnKHVpbnQ4X3QgY2lnX2lkKTsKLQotICBib29sIEhhc0hhbmRsZSh1aW50MTZfdCBoYW5kbGUpIGNvbnN0OwotCi0gIHVpbnQ4X3QgR2V0R3JvdXBJZCh1aW50MTZfdCkgY29uc3Q7Ci0KLSAgU3RyZWFtUGFyYW1ldGVycyBHZXRTdHJlYW1QYXJhbWV0ZXJzKHVpbnQxNl90IGhhbmRsZSkgY29uc3Q7Ci0gIEdyb3VwUGFyYW1ldGVycyBHZXRHcm91cFBhcmFtZXRlcnModWludDhfdCBpZCkgY29uc3Q7Ci0KLSAgYm9vbCBHZXRTdHJlYW1Jc0Nvbm5lY3RlZCh1aW50MTZfdCBoYW5kbGUpIGNvbnN0OwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBHZXRDaWdIYW5kbGVzKHVpbnQ4X3QgaWQpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjptYXA8dWludDhfdCwgQ29ubmVjdGVkSXNvY2hyb25vdXNHcm91cD4gZ3JvdXBzXzsKLSAgc3RkOjptYXA8dWludDE2X3QsIHVpbnQ4X3Q+IGNpc190b19ncm91cF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9sZV9hZHZlcnRpc2VyLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvbGVfYWR2ZXJ0aXNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiNGNiNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9sZV9hZHZlcnRpc2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsZV9hZHZlcnRpc2VyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBibHVldG9vdGg6OmhjaTsKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci12b2lkIExlQWR2ZXJ0aXNlcjo6SW5pdGlhbGl6ZShBZGRyZXNzV2l0aFR5cGUgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NXaXRoVHlwZSBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZVNjYW5uaW5nRmlsdGVyUG9saWN5IGZpbHRlcl9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBhZHZlcnRpc2VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNjYW5fcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBpbnRlcnZhbCkgewotICBhZGRyZXNzXyA9IGFkZHJlc3M7Ci0gIHBlZXJfYWRkcmVzc18gPSBwZWVyX2FkZHJlc3M7Ci0gIGZpbHRlcl9wb2xpY3lfID0gZmlsdGVyX3BvbGljeTsKLSAgdHlwZV8gPSB0eXBlOwotICBhZHZlcnRpc2VtZW50XyA9IGFkdmVydGlzZW1lbnQ7Ci0gIHNjYW5fcmVzcG9uc2VfID0gc2Nhbl9yZXNwb25zZTsKLSAgaW50ZXJ2YWxfID0gaW50ZXJ2YWw7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2VyOjpJbml0aWFsaXplRXh0ZW5kZWQoCi0gICAgQWRkcmVzc1R5cGUgYWRkcmVzc190eXBlLCBBZGRyZXNzV2l0aFR5cGUgcGVlcl9hZGRyZXNzLAotICAgIExlU2Nhbm5pbmdGaWx0ZXJQb2xpY3kgZmlsdGVyX3BvbGljeSwKLSAgICBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGUgdHlwZSwKLSAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBpbnRlcnZhbCkgewotICBhZGRyZXNzXyA9IEFkZHJlc3NXaXRoVHlwZShhZGRyZXNzXy5HZXRBZGRyZXNzKCksIGFkZHJlc3NfdHlwZSk7Ci0gIHBlZXJfYWRkcmVzc18gPSBwZWVyX2FkZHJlc3M7Ci0gIGZpbHRlcl9wb2xpY3lfID0gZmlsdGVyX3BvbGljeTsKLSAgdHlwZV8gPSB0eXBlOwotICBpbnRlcnZhbF8gPSBpbnRlcnZhbDsKLSAgTE9HX0lORk8oIiVzIC0+ICVzIHR5cGUgPSAlaGh4IGludGVydmFsID0gJWQgbXMiLCBhZGRyZXNzXy5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgIHBlZXJfYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIHR5cGVfLAotICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGludGVydmFsXy5jb3VudCgpKSk7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2VyOjpDbGVhcigpIHsKLSAgYWRkcmVzc18gPSBBZGRyZXNzV2l0aFR5cGV7fTsKLSAgcGVlcl9hZGRyZXNzXyA9IEFkZHJlc3NXaXRoVHlwZXt9OwotICBmaWx0ZXJfcG9saWN5XyA9IExlU2Nhbm5pbmdGaWx0ZXJQb2xpY3k6OkFDQ0VQVF9BTEw7Ci0gIHR5cGVfID0gbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfSU5EOwotICBhZHZlcnRpc2VtZW50Xy5jbGVhcigpOwotICBzY2FuX3Jlc3BvbnNlXy5jbGVhcigpOwotICBpbnRlcnZhbF8gPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApOwotICBlbmFibGVkXyA9IGZhbHNlOwotfQotCi12b2lkIExlQWR2ZXJ0aXNlcjo6U2V0QWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKLSAgTE9HX0lORk8oInNldCBhZGRyZXNzICVzIiwgYWRkcmVzc18uVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgYWRkcmVzc18gPSBBZGRyZXNzV2l0aFR5cGUoYWRkcmVzcywgYWRkcmVzc18uR2V0QWRkcmVzc1R5cGUoKSk7Ci19Ci0KLUFkZHJlc3NXaXRoVHlwZSBMZUFkdmVydGlzZXI6OkdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBhZGRyZXNzXzsgfQotCi12b2lkIExlQWR2ZXJ0aXNlcjo6U2V0RGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSkgewotICBhZHZlcnRpc2VtZW50XyA9IGRhdGE7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2VyOjpTZXRTY2FuUmVzcG9uc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpIHsKLSAgc2Nhbl9yZXNwb25zZV8gPSBkYXRhOwotfQotCi12b2lkIExlQWR2ZXJ0aXNlcjo6RW5hYmxlKCkgewotICBlbmFibGVkXyA9IHRydWU7Ci0gIGxhc3RfbGVfYWR2ZXJ0aXNlbWVudF8gPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIGludGVydmFsXzsKLSAgbnVtX2V2ZW50c18gPSAwOwotICBMT0dfSU5GTygiJXMgLT4gJXMgdHlwZSA9ICVoaHggYWQgbGVuZ3RoICV6dSwgc2NhbiBsZW5ndGggJXp1IiwKLSAgICAgICAgICAgYWRkcmVzc18uVG9TdHJpbmcoKS5jX3N0cigpLCBwZWVyX2FkZHJlc3NfLlRvU3RyaW5nKCkuY19zdHIoKSwgdHlwZV8sCi0gICAgICAgICAgIGFkdmVydGlzZW1lbnRfLnNpemUoKSwgc2Nhbl9yZXNwb25zZV8uc2l6ZSgpKTsKLX0KLQotdm9pZCBMZUFkdmVydGlzZXI6OkVuYWJsZUV4dGVuZGVkKAotICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGR1cmF0aW9uKSB7Ci0gIEVuYWJsZSgpOwotICBpZiAoZHVyYXRpb24gIT0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSkgewotICAgIGVuZGluZ190aW1lXyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgZHVyYXRpb247Ci0gIH0KLSAgZXh0ZW5kZWRfID0gdHJ1ZTsKLSAgTE9HX0lORk8oIiVzIC0+ICVzIHR5cGUgPSAlaGh4IGFkIGxlbmd0aCAlenUsIHNjYW4gbGVuZ3RoICV6dSIsCi0gICAgICAgICAgIGFkZHJlc3NfLlRvU3RyaW5nKCkuY19zdHIoKSwgcGVlcl9hZGRyZXNzXy5Ub1N0cmluZygpLmNfc3RyKCksIHR5cGVfLAotICAgICAgICAgICBhZHZlcnRpc2VtZW50Xy5zaXplKCksIHNjYW5fcmVzcG9uc2VfLnNpemUoKSk7Ci19Ci0KLXZvaWQgTGVBZHZlcnRpc2VyOjpEaXNhYmxlKCkgeyBlbmFibGVkXyA9IGZhbHNlOyB9Ci0KLWJvb2wgTGVBZHZlcnRpc2VyOjpJc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBlbmFibGVkXzsgfQotCi1ib29sIExlQWR2ZXJ0aXNlcjo6SXNFeHRlbmRlZCgpIGNvbnN0IHsgcmV0dXJuIGV4dGVuZGVkXzsgfQotCi11aW50OF90IExlQWR2ZXJ0aXNlcjo6R2V0TnVtQWR2ZXJ0aXNpbmdFdmVudHMoKSBjb25zdCB7IHJldHVybiBudW1fZXZlbnRzXzsgfQotCi1zdGQ6OnVuaXF1ZV9wdHI8bW9kZWw6OnBhY2tldHM6OkxlQWR2ZXJ0aXNlbWVudEJ1aWxkZXI+Ci1MZUFkdmVydGlzZXI6OkdldEFkdmVydGlzZW1lbnQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cpIHsKLSAgaWYgKCFlbmFibGVkXykgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgaWYgKG5vdyAtIGxhc3RfbGVfYWR2ZXJ0aXNlbWVudF8gPCBpbnRlcnZhbF8pIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIGlmIChsYXN0X2xlX2FkdmVydGlzZW1lbnRfIDwgZW5kaW5nX3RpbWVfICYmIGVuZGluZ190aW1lXyA8IG5vdykgewotICAgIGVuYWJsZWRfID0gZmFsc2U7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBsYXN0X2xlX2FkdmVydGlzZW1lbnRfID0gbm93OwotICBudW1fZXZlbnRzXyArPSAobnVtX2V2ZW50c18gPCAyNTUgPyAxIDogMCk7Ci0gIHJldHVybiBtb2RlbDo6cGFja2V0czo6TGVBZHZlcnRpc2VtZW50QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgYWRkcmVzc18uR2V0QWRkcmVzcygpLCBwZWVyX2FkZHJlc3NfLkdldEFkZHJlc3MoKSwKLSAgICAgIHN0YXRpY19jYXN0PG1vZGVsOjpwYWNrZXRzOjpBZGRyZXNzVHlwZT4oYWRkcmVzc18uR2V0QWRkcmVzc1R5cGUoKSksCi0gICAgICB0eXBlXywgYWR2ZXJ0aXNlbWVudF8pOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8bW9kZWw6OnBhY2tldHM6OkxlU2NhblJlc3BvbnNlQnVpbGRlcj4KLUxlQWR2ZXJ0aXNlcjo6R2V0U2NhblJlc3BvbnNlKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIHNjYW5uZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBzY2FubmVyKSB7Ci0gIGlmIChzY2FubmVkICE9IGFkZHJlc3NfLkdldEFkZHJlc3MoKSB8fCAhZW5hYmxlZF8pIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBzd2l0Y2ggKGZpbHRlcl9wb2xpY3lfKSB7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeTo6Ci0gICAgICAgIENPTk5FQ1RfTElTVF9BTkRfSU5JVElBVE9SU19JREVOVElUWToKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpMZVNjYW5uaW5nRmlsdGVyUG9saWN5OjpDT05ORUNUX0xJU1RfT05MWToKLSAgICAgIExPR19XQVJOKCJTY2FuUmVzcG9uc2VzIGRvbid0IGhhbmRsZSBjb25uZWN0IGxpc3QgZmlsdGVycyIpOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeTo6Q0hFQ0tfSU5JVElBVE9SU19JREVOVElUWToKLSAgICAgIGlmIChzY2FubmVyICE9IHBlZXJfYWRkcmVzc18uR2V0QWRkcmVzcygpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeTo6QUNDRVBUX0FMTDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBtb2RlbDo6cGFja2V0czo6TGVTY2FuUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBhZGRyZXNzXy5HZXRBZGRyZXNzKCksIHBlZXJfYWRkcmVzc18uR2V0QWRkcmVzcygpLAotICAgICAgc3RhdGljX2Nhc3Q8bW9kZWw6OnBhY2tldHM6OkFkZHJlc3NUeXBlPihhZGRyZXNzXy5HZXRBZGRyZXNzVHlwZSgpKSwKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpBZHZlcnRpc2VtZW50VHlwZTo6U0NBTl9SRVNQT05TRSwgc2Nhbl9yZXNwb25zZV8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9sZV9hZHZlcnRpc2VyLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9sZV9hZHZlcnRpc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTFjMjUuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvbGVfYWR2ZXJ0aXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzc193aXRoX3R5cGUuaCIKLSNpbmNsdWRlICJoY2kvaGNpX3BhY2tldHMuaCIKLSNpbmNsdWRlICJwYWNrZXRzL2xpbmtfbGF5ZXJfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotLy8gVHJhY2sgYSBzaW5nbGUgYWR2ZXJ0aXNpbmcgaW5zdGFuY2UKLWNsYXNzIExlQWR2ZXJ0aXNlciB7Ci0gcHVibGljOgotICBMZUFkdmVydGlzZXIoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfkxlQWR2ZXJ0aXNlcigpID0gZGVmYXVsdDsKLQotICB2b2lkIEluaXRpYWxpemUoYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZSBwZWVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeSBmaWx0ZXJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYWR2ZXJ0aXNlbWVudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzY2FuX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwpOwotCi0gIHZvaWQgSW5pdGlhbGl6ZUV4dGVuZGVkKGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZSBhZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgcGVlcl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeSBmaWx0ZXJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwpOwotCi0gIHZvaWQgU2V0QWRkcmVzcyhibHVldG9vdGg6OmhjaTo6QWRkcmVzcyBhZGRyZXNzKTsKLQotICB2b2lkIFNldERhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRhdGEpOwotCi0gIHZvaWQgU2V0U2NhblJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8bW9kZWw6OnBhY2tldHM6OkxlQWR2ZXJ0aXNlbWVudEJ1aWxkZXI+IEdldEFkdmVydGlzZW1lbnQoCi0gICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50KTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8bW9kZWw6OnBhY2tldHM6OkxlU2NhblJlc3BvbnNlQnVpbGRlcj4gR2V0U2NhblJlc3BvbnNlKAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3Mgc2Nhbm5lZF9hZGRyZXNzLAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3Mgc2Nhbm5lcl9hZGRyZXNzKTsKLQotICB2b2lkIENsZWFyKCk7Ci0KLSAgdm9pZCBEaXNhYmxlKCk7Ci0KLSAgdm9pZCBFbmFibGUoKTsKLQotICB2b2lkIEVuYWJsZUV4dGVuZGVkKHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGR1cmF0aW9uKTsKLQotICBib29sIElzRW5hYmxlZCgpIGNvbnN0OwotCi0gIGJvb2wgSXNFeHRlbmRlZCgpIGNvbnN0OwotCi0gIHVpbnQ4X3QgR2V0TnVtQWR2ZXJ0aXNpbmdFdmVudHMoKSBjb25zdDsKLQotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIEdldEFkZHJlc3MoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUgYWRkcmVzc197fTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NXaXRoVHlwZQotICAgICAgcGVlcl9hZGRyZXNzX3t9OyAgLy8gRm9yIGRpcmVjdGVkIGFkdmVydGlzZW1lbnRzCi0gIGJsdWV0b290aDo6aGNpOjpMZVNjYW5uaW5nRmlsdGVyUG9saWN5IGZpbHRlcl9wb2xpY3lfe307Ci0gIG1vZGVsOjpwYWNrZXRzOjpBZHZlcnRpc2VtZW50VHlwZSB0eXBlX3t9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VtZW50XzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Nhbl9yZXNwb25zZV87Ci0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGludGVydmFsX3t9OwotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGVuZGluZ190aW1lX3t9OwotICB1aW50OF90IG51bV9ldmVudHNfezB9OwotICBib29sIGV4dGVuZGVkX3tmYWxzZX07Ci0gIGJvb2wgZW5hYmxlZF97ZmFsc2V9OwotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGxhc3RfbGVfYWR2ZXJ0aXNlbWVudF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9saW5rX2xheWVyX2NvbnRyb2xsZXIuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9saW5rX2xheWVyX2NvbnRyb2xsZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MWI3MDAuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvbGlua19sYXllcl9jb250cm9sbGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzM3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibGlua19sYXllcl9jb250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxoY2kvaGNpX3BhY2tldHMuaD4KLQotI2luY2x1ZGUgImNyeXB0b190b29sYm94L2NyeXB0b190b29sYm94LmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9sZV9hZHZlcnRpc2VtZW50LmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAicGFja2V0L3Jhd19idWlsZGVyLmgiCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU7Ci11c2luZyBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlOwotdXNpbmcgYmx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTsKLQotdXNpbmcgbmFtZXNwYWNlIG1vZGVsOjpwYWNrZXRzOwotdXNpbmcgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1jb25zdGV4cHIgdWludDE2X3Qga051bUNvbW1hbmRQYWNrZXRzID0gMHgwMTsKLQotLy8gVE9ETzogTW9kZWwgUnNzaT8KLXN0YXRpYyB1aW50OF90IEdldFJzc2koKSB7Ci0gIHN0YXRpYyB1aW50OF90IHJzc2kgPSAwOwotICByc3NpICs9IDU7Ci0gIGlmIChyc3NpID4gMTI4KSB7Ci0gICAgcnNzaSA9IHJzc2kgJSA3OwotICB9Ci0gIHJldHVybiAtKHJzc2kpOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlNlbmRMZUxpbmtMYXllclBhY2tldCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHBhY2tldCkgewotICBzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHNoYXJlZF9wYWNrZXQgPQotICAgICAgc3RkOjptb3ZlKHBhY2tldCk7Ci0gIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNTApLCBbdGhpcywgc2hhcmVkX3BhY2tldF0oKSB7Ci0gICAgc2VuZF90b19yZW1vdGVfKHNoYXJlZF9wYWNrZXQsIFBoeTo6VHlwZTo6TE9XX0VORVJHWSk7Ci0gIH0pOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlNlbmRMaW5rTGF5ZXJQYWNrZXQoCi0gICAgc3RkOjp1bmlxdWVfcHRyPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgc3RkOjpzaGFyZWRfcHRyPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiBzaGFyZWRfcGFja2V0ID0KLSAgICAgIHN0ZDo6bW92ZShwYWNrZXQpOwotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUwKSwgW3RoaXMsIHNoYXJlZF9wYWNrZXRdKCkgewotICAgIHNlbmRfdG9fcmVtb3RlXyhzaGFyZWRfcGFja2V0LCBQaHk6OlR5cGU6OkJSX0VEUik7Ci0gIH0pOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6U2VuZExlQ29tbWFuZFRvUmVtb3RlQnlBZGRyZXNzKAotICAgIE9wQ29kZSBvcGNvZGUsIGNvbnN0IEFkZHJlc3MmIHJlbW90ZSwgY29uc3QgQWRkcmVzcyYgbG9jYWwpIHsKLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBjYXNlIChPcENvZGU6OkxFX1JFQURfUkVNT1RFX0ZFQVRVUkVTKToKLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICAgICAgbW9kZWw6OnBhY2tldHM6OkxlUmVhZFJlbW90ZUZlYXR1cmVzQnVpbGRlcjo6Q3JlYXRlKGxvY2FsLCByZW1vdGUpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfSU5GTygiRHJvcHBpbmcgdW5oYW5kbGVkIGNvbW1hbmQgMHglMDR4IiwKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PihvcGNvZGUpKTsKLSAgICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fSENJX0NPTU1BTkQ7Ci0gIH0KLQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6U2VuZENvbW1hbmRUb1JlbW90ZUJ5QWRkcmVzcygKLSAgICBPcENvZGUgb3Bjb2RlLCBibHVldG9vdGg6OnBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBhcmdzLAotICAgIGNvbnN0IEFkZHJlc3MmIHJlbW90ZSkgewotICBBZGRyZXNzIGxvY2FsX2FkZHJlc3MgPSBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCk7Ci0KLSAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICBjYXNlIChPcENvZGU6OlJFTU9URV9OQU1FX1JFUVVFU1QpOgotICAgICAgLy8gTE1QIGZlYXR1cmVzIGdldCByZXF1ZXN0ZWQgd2l0aCByZW1vdGUgbmFtZSByZXF1ZXN0cy4KLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVMbXBGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBsb2NhbF9hZGRyZXNzLCByZW1vdGUpKTsKLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OlJlbW90ZU5hbWVSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGxvY2FsX2FkZHJlc3MsIHJlbW90ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAoT3BDb2RlOjpSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVMpOgotICAgICAgU2VuZExpbmtMYXllclBhY2tldCgKLSAgICAgICAgICBtb2RlbDo6cGFja2V0czo6UmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgICBsb2NhbF9hZGRyZXNzLCByZW1vdGUpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKE9wQ29kZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVMpOiB7Ci0gICAgICB1aW50OF90IHBhZ2VfbnVtYmVyID0KLSAgICAgICAgICAoYXJncy5iZWdpbigpICsgMikuZXh0cmFjdDx1aW50OF90PigpOyAgLy8gc2tpcCB0aGUgaGFuZGxlCi0gICAgICBTZW5kTGlua0xheWVyUGFja2V0KAotICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlc0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgbG9jYWxfYWRkcmVzcywgcmVtb3RlLCBwYWdlX251bWJlcikpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSAoT3BDb2RlOjpSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OKToKLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICAgICAgbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25CdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICAgIGxvY2FsX2FkZHJlc3MsIHJlbW90ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAoT3BDb2RlOjpSRUFEX0NMT0NLX09GRlNFVCk6Ci0gICAgICBTZW5kTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpSZWFkQ2xvY2tPZmZzZXRCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgbG9jYWxfYWRkcmVzcywgcmVtb3RlKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0lORk8oIkRyb3BwaW5nIHVuaGFuZGxlZCBjb21tYW5kIDB4JTA0eCIsCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4ob3Bjb2RlKSk7Ci0gICAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0hDSV9DT01NQU5EOwotICB9Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlNlbmRDb21tYW5kVG9SZW1vdGVCeUhhbmRsZSgKLSAgICBPcENvZGUgb3Bjb2RlLCBibHVldG9vdGg6OnBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBhcmdzLCB1aW50MTZfdCBoYW5kbGUpIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLQotICBzd2l0Y2ggKG9wY29kZSkgewotICAgIGNhc2UgKE9wQ29kZTo6TEVfUkVBRF9SRU1PVEVfRkVBVFVSRVMpOgotICAgICAgcmV0dXJuIFNlbmRMZUNvbW1hbmRUb1JlbW90ZUJ5QWRkcmVzcygKLSAgICAgICAgICBvcGNvZGUsIGNvbm5lY3Rpb25zXy5HZXRBZGRyZXNzKGhhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgICAgIGNvbm5lY3Rpb25zXy5HZXRPd25BZGRyZXNzKGhhbmRsZSkuR2V0QWRkcmVzcygpKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIFNlbmRDb21tYW5kVG9SZW1vdGVCeUFkZHJlc3MoCi0gICAgICAgICAgb3Bjb2RlLCBhcmdzLCBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpLkdldEFkZHJlc3MoKSk7Ci0gIH0KLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlNlbmRBY2xUb1JlbW90ZSgKLSAgICBibHVldG9vdGg6OmhjaTo6QWNsVmlldyBhY2xfcGFja2V0KSB7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IGFjbF9wYWNrZXQuR2V0SGFuZGxlKCk7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgQWRkcmVzc1dpdGhUeXBlIG15X2FkZHJlc3MgPSBjb25uZWN0aW9uc18uR2V0T3duQWRkcmVzcyhoYW5kbGUpOwotICBBZGRyZXNzV2l0aFR5cGUgZGVzdGluYXRpb24gPSBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpOwotICBQaHk6OlR5cGUgcGh5ID0gY29ubmVjdGlvbnNfLkdldFBoeVR5cGUoaGFuZGxlKTsKLQotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDEpLCBbdGhpcywgaGFuZGxlXSgpIHsKLSAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6Q29tcGxldGVkUGFja2V0cz4gY29tcGxldGVkX3BhY2tldHM7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkNvbXBsZXRlZFBhY2tldHMgY3A7Ci0gICAgY3AuY29ubmVjdGlvbl9oYW5kbGVfID0gaGFuZGxlOwotICAgIGNwLmhvc3RfbnVtX29mX2NvbXBsZXRlZF9wYWNrZXRzXyA9IGtOdW1Db21tYW5kUGFja2V0czsKLSAgICBjb21wbGV0ZWRfcGFja2V0cy5wdXNoX2JhY2soY3ApOwotICAgIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6Ok51bWJlck9mQ29tcGxldGVkUGFja2V0c0J1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgY29tcGxldGVkX3BhY2tldHMpOwotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTKSkgewotICAgICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICAgIH0KLSAgfSk7Ci0KLSAgYXV0byBhY2xfcGF5bG9hZCA9IGFjbF9wYWNrZXQuR2V0UGF5bG9hZCgpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcmF3X2J1aWxkZXJfcHRyID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWRfYnl0ZXMoYWNsX3BheWxvYWQuYmVnaW4oKSwgYWNsX3BheWxvYWQuZW5kKCkpOwotCi0gIHVpbnQxNl90IGZpcnN0X3R3b19ieXRlcyA9Ci0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYWNsX3BhY2tldC5HZXRIYW5kbGUoKSkgKwotICAgICAgKHN0YXRpY19jYXN0PHVpbnQxNl90PihhY2xfcGFja2V0LkdldFBhY2tldEJvdW5kYXJ5RmxhZygpKSA8PCAxMikgKwotICAgICAgKHN0YXRpY19jYXN0PHVpbnQxNl90PihhY2xfcGFja2V0LkdldEJyb2FkY2FzdEZsYWcoKSkgPDwgMTQpOwotICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czIoZmlyc3RfdHdvX2J5dGVzKTsKLSAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMyKHN0YXRpY19jYXN0PHVpbnQxNl90PihwYXlsb2FkX2J5dGVzLnNpemUoKSkpOwotICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0cyhwYXlsb2FkX2J5dGVzKTsKLQotICBhdXRvIGFjbCA9IG1vZGVsOjpwYWNrZXRzOjpBY2xCdWlsZGVyOjpDcmVhdGUobXlfYWRkcmVzcy5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocmF3X2J1aWxkZXJfcHRyKSk7Ci0KLSAgc3dpdGNoIChwaHkpIHsKLSAgICBjYXNlIFBoeTo6VHlwZTo6QlJfRURSOgotICAgICAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUoYWNsKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBoeTo6VHlwZTo6TE9XX0VORVJHWToKLSAgICAgIFNlbmRMZUxpbmtMYXllclBhY2tldChzdGQ6Om1vdmUoYWNsKSk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIEFTU0VSVChpbmNvbWluZy5Jc1ZhbGlkKCkpOwotICBhdXRvIGRlc3RpbmF0aW9uX2FkZHJlc3MgPSBpbmNvbWluZy5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKTsKLQotICAvLyBNYXRjaCBicm9hZGNhc3RzCi0gIGJvb2wgYWRkcmVzc19tYXRjaGVzID0gKGRlc3RpbmF0aW9uX2FkZHJlc3MgPT0gQWRkcmVzczo6a0VtcHR5KTsKLQotICAvLyBNYXRjaCBhZGRyZXNzZXMgZnJvbSBkZXZpY2UgcHJvcGVydGllcwotICBpZiAoZGVzdGluYXRpb25fYWRkcmVzcyA9PSBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCkgfHwKLSAgICAgIGRlc3RpbmF0aW9uX2FkZHJlc3MgPT0gcHJvcGVydGllc18uR2V0TGVBZGRyZXNzKCkpIHsKLSAgICBhZGRyZXNzX21hdGNoZXMgPSB0cnVlOwotICB9Ci0KLSAgLy8gQ2hlY2sgYWR2ZXJ0aXNpbmcgYWRkcmVzc2VzCi0gIGZvciAoY29uc3QgYXV0byYgYWR2ZXJ0aXNlciA6IGFkdmVydGlzZXJzXykgewotICAgIGlmIChhZHZlcnRpc2VyLklzRW5hYmxlZCgpICYmCi0gICAgICAgIGFkdmVydGlzZXIuR2V0QWRkcmVzcygpLkdldEFkZHJlc3MoKSA9PSBkZXN0aW5hdGlvbl9hZGRyZXNzKSB7Ci0gICAgICBhZGRyZXNzX21hdGNoZXMgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIGNvbm5lY3Rpb24gYWRkcmVzc2VzCi0gIGF1dG8gc291cmNlX2FkZHJlc3MgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIGF1dG8gaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHNvdXJjZV9hZGRyZXNzKTsKLSAgaWYgKGhhbmRsZSAhPSBrUmVzZXJ2ZWRIYW5kbGUpIHsKLSAgICBpZiAoY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoaGFuZGxlKS5HZXRBZGRyZXNzKCkgPT0KLSAgICAgICAgZGVzdGluYXRpb25fYWRkcmVzcykgewotICAgICAgYWRkcmVzc19tYXRjaGVzID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBEcm9wIHBhY2tldHMgbm90IGFkZHJlc3NlZCB0byBtZQotICBpZiAoIWFkZHJlc3NfbWF0Y2hlcykgewotICAgIExPR19JTkZPKCJEcm9wcGluZyBwYWNrZXQgbm90IGFkZHJlc3NlZCB0byBtZSAlcy0+JXMiLAotICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICBkZXN0aW5hdGlvbl9hZGRyZXNzLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChpbmNvbWluZy5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpBQ0w6Ci0gICAgICBJbmNvbWluZ0FjbFBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpESVNDT05ORUNUOgotICAgICAgSW5jb21pbmdEaXNjb25uZWN0UGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkVOQ1JZUFRfQ09OTkVDVElPTjoKLSAgICAgIEluY29taW5nRW5jcnlwdENvbm5lY3Rpb24oaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6RU5DUllQVF9DT05ORUNUSU9OX1JFU1BPTlNFOgotICAgICAgSW5jb21pbmdFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OklOUVVJUlk6Ci0gICAgICBpZiAoaW5xdWlyeV9zY2Fuc19lbmFibGVkXykgewotICAgICAgICBJbmNvbWluZ0lucXVpcnlQYWNrZXQoaW5jb21pbmcpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6SU5RVUlSWV9SRVNQT05TRToKLSAgICAgIEluY29taW5nSW5xdWlyeVJlc3BvbnNlUGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OklPX0NBUEFCSUxJVFlfUkVRVUVTVDoKLSAgICAgIEluY29taW5nSW9DYXBhYmlsaXR5UmVxdWVzdFBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFOgotICAgICAgSW5jb21pbmdJb0NhcGFiaWxpdHlSZXNwb25zZVBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpJT19DQVBBQklMSVRZX05FR0FUSVZFX1JFU1BPTlNFOgotICAgICAgSW5jb21pbmdJb0NhcGFiaWxpdHlOZWdhdGl2ZVJlc3BvbnNlUGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFja2V0VHlwZTo6SVNPOgotICAgICAgSW5jb21pbmdJc29QYWNrZXQoaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWNrZXRUeXBlOjpJU09fQ09OTkVDVElPTl9SRVFVRVNUOgotICAgICAgSW5jb21pbmdJc29Db25uZWN0aW9uUmVxdWVzdFBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhY2tldFR5cGU6OklTT19DT05ORUNUSU9OX1JFU1BPTlNFOgotICAgICAgSW5jb21pbmdJc29Db25uZWN0aW9uUmVzcG9uc2VQYWNrZXQoaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWNrZXRUeXBlOjpLRVlQUkVTU19OT1RJRklDQVRJT046Ci0gICAgICBJbmNvbWluZ0tleXByZXNzTm90aWZpY2F0aW9uUGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkxFX0FEVkVSVElTRU1FTlQ6Ci0gICAgICBpZiAobGVfc2Nhbl9lbmFibGVfICE9IGJsdWV0b290aDo6aGNpOjpPcENvZGU6Ok5PTkUgfHwgbGVfY29ubmVjdF8pIHsKLSAgICAgICAgSW5jb21pbmdMZUFkdmVydGlzZW1lbnRQYWNrZXQoaW5jb21pbmcpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6TEVfQ09OTkVDVDoKLSAgICAgIEluY29taW5nTGVDb25uZWN0UGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkxFX0NPTk5FQ1RfQ09NUExFVEU6Ci0gICAgICBJbmNvbWluZ0xlQ29ubmVjdENvbXBsZXRlUGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkxFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1Q6Ci0gICAgICBJbmNvbWluZ0xlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3QoaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6TEVfQ09OTkVDVElPTl9QQVJBTUVURVJfVVBEQVRFOgotICAgICAgSW5jb21pbmdMZUNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGUoaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6TEVfRU5DUllQVF9DT05ORUNUSU9OOgotICAgICAgSW5jb21pbmdMZUVuY3J5cHRDb25uZWN0aW9uKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkxFX0VOQ1JZUFRfQ09OTkVDVElPTl9SRVNQT05TRToKLSAgICAgIEluY29taW5nTGVFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpMRV9SRUFEX1JFTU9URV9GRUFUVVJFUyk6Ci0gICAgICBJbmNvbWluZ0xlUmVhZFJlbW90ZUZlYXR1cmVzKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpMRV9SRUFEX1JFTU9URV9GRUFUVVJFU19SRVNQT05TRSk6Ci0gICAgICBJbmNvbWluZ0xlUmVhZFJlbW90ZUZlYXR1cmVzUmVzcG9uc2UoaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6TEVfU0NBTjoKLSAgICAgIC8vIFRPRE86IENoZWNrIEFkdmVydGlzaW5nIGZsYWdzIGFuZCBzZWUgaWYgd2UgYXJlIHNjYW5uYWJsZS4KLSAgICAgIEluY29taW5nTGVTY2FuUGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkxFX1NDQU5fUkVTUE9OU0U6Ci0gICAgICBpZiAobGVfc2Nhbl9lbmFibGVfICE9IGJsdWV0b290aDo6aGNpOjpPcENvZGU6Ok5PTkUgJiYKLSAgICAgICAgICBsZV9zY2FuX3R5cGVfID09IDEpIHsKLSAgICAgICAgSW5jb21pbmdMZVNjYW5SZXNwb25zZVBhY2tldChpbmNvbWluZyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpQQUdFOgotICAgICAgaWYgKHBhZ2Vfc2NhbnNfZW5hYmxlZF8pIHsKLSAgICAgICAgSW5jb21pbmdQYWdlUGFja2V0KGluY29taW5nKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OlBBR0VfUkVTUE9OU0U6Ci0gICAgICBJbmNvbWluZ1BhZ2VSZXNwb25zZVBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpQQUdFX1JFSkVDVDoKLSAgICAgIEluY29taW5nUGFnZVJlamVjdFBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UEFTU0tFWSk6Ci0gICAgICBJbmNvbWluZ1Bhc3NrZXlQYWNrZXQoaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAobW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OlBBU1NLRVlfRkFJTEVEKToKLSAgICAgIEluY29taW5nUGFzc2tleUZhaWxlZFBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UElOX1JFUVVFU1QpOgotICAgICAgSW5jb21pbmdQaW5SZXF1ZXN0UGFja2V0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpQSU5fUkVTUE9OU0UpOgotICAgICAgSW5jb21pbmdQaW5SZXNwb25zZVBhY2tldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UkVNT1RFX05BTUVfUkVRVUVTVCk6Ci0gICAgICBJbmNvbWluZ1JlbW90ZU5hbWVSZXF1ZXN0KGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpSRU1PVEVfTkFNRV9SRVFVRVNUX1JFU1BPTlNFKToKLSAgICAgIEluY29taW5nUmVtb3RlTmFtZVJlcXVlc3RSZXNwb25zZShpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTKToKLSAgICAgIEluY29taW5nUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVNfUkVTUE9OU0UpOgotICAgICAgSW5jb21pbmdSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXNSZXNwb25zZShpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UkVBRF9SRU1PVEVfTE1QX0ZFQVRVUkVTKToKLSAgICAgIEluY29taW5nUmVhZFJlbW90ZUxtcEZlYXR1cmVzKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpSRUFEX1JFTU9URV9MTVBfRkVBVFVSRVNfUkVTUE9OU0UpOgotICAgICAgSW5jb21pbmdSZWFkUmVtb3RlTG1wRmVhdHVyZXNSZXNwb25zZShpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVMpOgotICAgICAgSW5jb21pbmdSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcyhpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVNfUkVTUE9OU0UpOgotICAgICAgSW5jb21pbmdSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlc1Jlc3BvbnNlKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OKToKLSAgICAgIEluY29taW5nUmVhZFJlbW90ZVZlcnNpb24oaW5jb21pbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAobW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OlJFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT05fUkVTUE9OU0UpOgotICAgICAgSW5jb21pbmdSZWFkUmVtb3RlVmVyc2lvblJlc3BvbnNlKGluY29taW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpSRUFEX0NMT0NLX09GRlNFVCk6Ci0gICAgICBJbmNvbWluZ1JlYWRDbG9ja09mZnNldChpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6UkVBRF9DTE9DS19PRkZTRVRfUkVTUE9OU0UpOgotICAgICAgSW5jb21pbmdSZWFkQ2xvY2tPZmZzZXRSZXNwb25zZShpbmNvbWluZyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIkRyb3BwaW5nIHVuaGFuZGxlZCBwYWNrZXQgb2YgdHlwZSAlcyIsCi0gICAgICAgICAgICAgICBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZVRleHQoaW5jb21pbmcuR2V0VHlwZSgpKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nQWNsUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIExPR19JTkZPKCJBY2wgUGFja2V0ICVzIC0+ICVzIiwKLSAgICAgICAgICAgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgaW5jb21pbmcuR2V0RGVzdGluYXRpb25BZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICBhdXRvIGFjbCA9IG1vZGVsOjpwYWNrZXRzOjpBY2xWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQoYWNsLklzVmFsaWQoKSk7Ci0gIGF1dG8gcGF5bG9hZCA9IGFjbC5HZXRQYXlsb2FkKCk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGF5bG9hZF9ieXRlcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PihwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpOwotCi0gIGJsdWV0b290aDo6aGNpOjpQYWNrZXRWaWV3PGJsdWV0b290aDo6aGNpOjprTGl0dGxlRW5kaWFuPiByYXdfcGFja2V0KAotICAgICAgcGF5bG9hZF9ieXRlcyk7Ci0gIGF1dG8gYWNsX3ZpZXcgPSBibHVldG9vdGg6OmhjaTo6QWNsVmlldzo6Q3JlYXRlKHJhd19wYWNrZXQpOwotICBBU1NFUlQoYWNsX3ZpZXcuSXNWYWxpZCgpKTsKLQotICBMT0dfSU5GTygiUmVtb3RlIGhhbmRsZSAweCV4IHNpemUgJWQiLCBhY2xfdmlldy5HZXRIYW5kbGUoKSwKLSAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihhY2xfdmlldy5zaXplKCkpKTsKLSAgdWludDE2X3QgbG9jYWxfaGFuZGxlID0KLSAgICAgIGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkpOwotICBMT0dfSU5GTygiTG9jYWwgaGFuZGxlIDB4JXgiLCBsb2NhbF9oYW5kbGUpOwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBheWxvYWRfZGF0YShhY2xfdmlldy5HZXRQYXlsb2FkKCkuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjbF92aWV3LkdldFBheWxvYWQoKS5lbmQoKSk7Ci0gIHVpbnQxNl90IGFjbF9idWZmZXJfc2l6ZSA9IHByb3BlcnRpZXNfLkdldEFjbERhdGFQYWNrZXRTaXplKCk7Ci0gIGludCBudW1fcGFja2V0cyA9Ci0gICAgICAocGF5bG9hZF9kYXRhLnNpemUoKSArIGFjbF9idWZmZXJfc2l6ZSAtIDEpIC8gYWNsX2J1ZmZlcl9zaXplOwotCi0gIGF1dG8gcGJfZmxhZ19jb250cm9sbGVyX3RvX2hvc3QgPSBhY2xfdmlldy5HZXRQYWNrZXRCb3VuZGFyeUZsYWcoKTsKLSAgaWYgKHBiX2ZsYWdfY29udHJvbGxlcl90b19ob3N0ID09Ci0gICAgICBibHVldG9vdGg6OmhjaTo6UGFja2V0Qm91bmRhcnlGbGFnOjpGSVJTVF9OT05fQVVUT01BVElDQUxMWV9GTFVTSEFCTEUpIHsKLSAgICBwYl9mbGFnX2NvbnRyb2xsZXJfdG9faG9zdCA9Ci0gICAgICAgIGJsdWV0b290aDo6aGNpOjpQYWNrZXRCb3VuZGFyeUZsYWc6OkZJUlNUX0FVVE9NQVRJQ0FMTFlfRkxVU0hBQkxFOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3BhY2tldHM7IGkrKykgewotICAgIHNpemVfdCBzdGFydF9pbmRleCA9IGFjbF9idWZmZXJfc2l6ZSAqIGk7Ci0gICAgc2l6ZV90IGVuZF9pbmRleCA9Ci0gICAgICAgIHN0ZDo6bWluKHN0YXJ0X2luZGV4ICsgYWNsX2J1ZmZlcl9zaXplLCBwYXlsb2FkX2RhdGEuc2l6ZSgpKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBmcmFnbWVudCgmcGF5bG9hZF9kYXRhW3N0YXJ0X2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF5bG9hZF9kYXRhW2VuZF9pbmRleF0pOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcmF3X2J1aWxkZXJfcHRyID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4oZnJhZ21lbnQpOwotICAgIGF1dG8gYWNsX3BhY2tldCA9IGJsdWV0b290aDo6aGNpOjpBY2xCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIGxvY2FsX2hhbmRsZSwgcGJfZmxhZ19jb250cm9sbGVyX3RvX2hvc3QsIGFjbF92aWV3LkdldEJyb2FkY2FzdEZsYWcoKSwKLSAgICAgICAgc3RkOjptb3ZlKHJhd19idWlsZGVyX3B0cikpOwotICAgIHBiX2ZsYWdfY29udHJvbGxlcl90b19ob3N0ID0KLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlBhY2tldEJvdW5kYXJ5RmxhZzo6Q09OVElOVUlOR19GUkFHTUVOVDsKLQotICAgIHNlbmRfYWNsXyhzdGQ6Om1vdmUoYWNsX3BhY2tldCkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdSZW1vdGVOYW1lUmVxdWVzdCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgYXV0byB2aWV3ID0gbW9kZWw6OnBhY2tldHM6OlJlbW90ZU5hbWVSZXF1ZXN0Vmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0KLSAgU2VuZExpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6UmVtb3RlTmFtZVJlcXVlc3RSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHBhY2tldC5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKSwgcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgIHByb3BlcnRpZXNfLkdldE5hbWUoKSkpOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nUmVtb3RlTmFtZVJlcXVlc3RSZXNwb25zZSgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgYXV0byB2aWV3ID0gbW9kZWw6OnBhY2tldHM6OlJlbW90ZU5hbWVSZXF1ZXN0UmVzcG9uc2VWaWV3OjpDcmVhdGUocGFja2V0KTsKLSAgQVNTRVJUKHZpZXcuSXNWYWxpZCgpKTsKLQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlJFTU9URV9OQU1FX1JFUVVFU1RfQ09NUExFVEUpKSB7Ci0gICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlJlbW90ZU5hbWVSZXF1ZXN0Q29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKSwgdmlldy5HZXROYW1lKCkpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nUmVhZFJlbW90ZUxtcEZlYXR1cmVzKAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICBTZW5kTGlua0xheWVyUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVMbXBGZWF0dXJlc1Jlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIHBhY2tldC5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKSwgcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRFeHRlbmRlZEZlYXR1cmVzKDEpKSk7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdSZWFkUmVtb3RlTG1wRmVhdHVyZXNSZXNwb25zZSgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgYXV0byB2aWV3ID0gbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVMbXBGZWF0dXJlc1Jlc3BvbnNlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKAotICAgICAgICAgIEV2ZW50Q29kZTo6UkVNT1RFX0hPU1RfU1VQUE9SVEVEX0ZFQVRVUkVTX05PVElGSUNBVElPTikpIHsKLSAgICBzZW5kX2V2ZW50XygKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlbW90ZUhvc3RTdXBwb3J0ZWRGZWF0dXJlc05vdGlmaWNhdGlvbkJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCksIHZpZXcuR2V0RmVhdHVyZXMoKSkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXMoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSB7Ci0gIFNlbmRMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICBtb2RlbDo6cGFja2V0czo6UmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgcGFja2V0LkdldERlc3RpbmF0aW9uQWRkcmVzcygpLCBwYWNrZXQuR2V0U291cmNlQWRkcmVzcygpLAotICAgICAgICAgIHByb3BlcnRpZXNfLkdldFN1cHBvcnRlZEZlYXR1cmVzKCkpKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1JlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc1Jlc3BvbnNlKAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICBhdXRvIHZpZXcgPQotICAgICAgbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc1Jlc3BvbnNlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gIEFkZHJlc3Mgc291cmNlID0gcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHNvdXJjZSk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkRpc2NhcmRpbmcgcmVzcG9uc2UgZnJvbSBhIGRpc2Nvbm5lY3RlZCBkZXZpY2UgJXMiLAotICAgICAgICAgICAgIHNvdXJjZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZCgKLSAgICAgICAgICBFdmVudENvZGU6OlJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFU19DT01QTEVURSkpIHsKLSAgICBzZW5kX2V2ZW50XygKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlc0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGUsIHZpZXcuR2V0RmVhdHVyZXMoKSkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgYXV0byB2aWV3ID0gbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gIHVpbnQ4X3QgcGFnZV9udW1iZXIgPSB2aWV3LkdldFBhZ2VOdW1iZXIoKTsKLSAgdWludDhfdCBlcnJvcl9jb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpTVUNDRVNTKTsKLSAgaWYgKHBhZ2VfbnVtYmVyID4gcHJvcGVydGllc18uR2V0RXh0ZW5kZWRGZWF0dXJlc01heGltdW1QYWdlTnVtYmVyKCkpIHsKLSAgICBlcnJvcl9jb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpJTlZBTElEX0xNUF9PUl9MTF9QQVJBTUVURVJTKTsKLSAgfQotICBTZW5kTGlua0xheWVyUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgcGFja2V0LkdldERlc3RpbmF0aW9uQWRkcmVzcygpLCBwYWNrZXQuR2V0U291cmNlQWRkcmVzcygpLCBlcnJvcl9jb2RlLAotICAgICAgICAgIHBhZ2VfbnVtYmVyLCBwcm9wZXJ0aWVzXy5HZXRFeHRlbmRlZEZlYXR1cmVzTWF4aW11bVBhZ2VOdW1iZXIoKSwKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRFeHRlbmRlZEZlYXR1cmVzKHZpZXcuR2V0UGFnZU51bWJlcigpKSkpOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNSZXNwb25zZSgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgYXV0byB2aWV3ID0KLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlc1Jlc3BvbnNlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gIEFkZHJlc3Mgc291cmNlID0gcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHNvdXJjZSk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkRpc2NhcmRpbmcgcmVzcG9uc2UgZnJvbSBhIGRpc2Nvbm5lY3RlZCBkZXZpY2UgJXMiLAotICAgICAgICAgICAgIHNvdXJjZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZCgKLSAgICAgICAgICBFdmVudENvZGU6OlJFQURfUkVNT1RFX0VYVEVOREVEX0ZFQVRVUkVTX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKAotICAgICAgICBibHVldG9vdGg6OmhjaTo6UmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVycm9yQ29kZT4odmlldy5HZXRTdGF0dXMoKSksIGhhbmRsZSwKLSAgICAgICAgICAgIHZpZXcuR2V0UGFnZU51bWJlcigpLCB2aWV3LkdldE1heFBhZ2VOdW1iZXIoKSwgdmlldy5HZXRGZWF0dXJlcygpKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1JlYWRSZW1vdGVWZXJzaW9uKAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICBTZW5kTGlua0xheWVyUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBwYWNrZXQuR2V0RGVzdGluYXRpb25BZGRyZXNzKCksIHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0TG1wUGFsVmVyc2lvbigpLCBwcm9wZXJ0aWVzXy5HZXRMbXBQYWxTdWJ2ZXJzaW9uKCksCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0TWFudWZhY3R1cmVyTmFtZSgpKSk7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdSZWFkUmVtb3RlVmVyc2lvblJlc3BvbnNlKAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICBhdXRvIHZpZXcgPQotICAgICAgbW9kZWw6OnBhY2tldHM6OlJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb25SZXNwb25zZVZpZXc6OkNyZWF0ZShwYWNrZXQpOwotICBBU1NFUlQodmlldy5Jc1ZhbGlkKCkpOwotICBBZGRyZXNzIHNvdXJjZSA9IHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhzb3VyY2UpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJEaXNjYXJkaW5nIHJlc3BvbnNlIGZyb20gYSBkaXNjb25uZWN0ZWQgZGV2aWNlICVzIiwKLSAgICAgICAgICAgICBzb3VyY2UuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoCi0gICAgICAgICAgRXZlbnRDb2RlOjpSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKAotICAgICAgICBibHVldG9vdGg6OmhjaTo6UmVhZFJlbW90ZVZlcnNpb25JbmZvcm1hdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGUsIHZpZXcuR2V0TG1wVmVyc2lvbigpLAotICAgICAgICAgICAgdmlldy5HZXRNYW51ZmFjdHVyZXJOYW1lKCksIHZpZXcuR2V0TG1wU3VidmVyc2lvbigpKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1JlYWRDbG9ja09mZnNldCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgU2VuZExpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6UmVhZENsb2NrT2Zmc2V0UmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBwYWNrZXQuR2V0RGVzdGluYXRpb25BZGRyZXNzKCksIHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRDbG9ja09mZnNldCgpKSk7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdSZWFkQ2xvY2tPZmZzZXRSZXNwb25zZSgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgYXV0byB2aWV3ID0gbW9kZWw6OnBhY2tldHM6OlJlYWRDbG9ja09mZnNldFJlc3BvbnNlVmlldzo6Q3JlYXRlKHBhY2tldCk7Ci0gIEFTU0VSVCh2aWV3LklzVmFsaWQoKSk7Ci0gIEFkZHJlc3Mgc291cmNlID0gcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHNvdXJjZSk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkRpc2NhcmRpbmcgcmVzcG9uc2UgZnJvbSBhIGRpc2Nvbm5lY3RlZCBkZXZpY2UgJXMiLAotICAgICAgICAgICAgIHNvdXJjZS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlJFQURfQ0xPQ0tfT0ZGU0VUX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpSZWFkQ2xvY2tPZmZzZXRDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGUsIHZpZXcuR2V0T2Zmc2V0KCkpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nRGlzY29ubmVjdFBhY2tldCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBMT0dfSU5GTygiRGlzY29ubmVjdCBQYWNrZXQiKTsKLSAgYXV0byBkaXNjb25uZWN0ID0gbW9kZWw6OnBhY2tldHM6OkRpc2Nvbm5lY3RWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQoZGlzY29ubmVjdC5Jc1ZhbGlkKCkpOwotCi0gIEFkZHJlc3MgcGVlciA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHBlZXIpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJEaXNjYXJkaW5nIGRpc2Nvbm5lY3QgZnJvbSBhIGRpc2Nvbm5lY3RlZCBkZXZpY2UgJXMiLAotICAgICAgICAgICAgIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQVNTRVJUX0xPRyhjb25uZWN0aW9uc18uRGlzY29ubmVjdChoYW5kbGUpLAotICAgICAgICAgICAgICJHZXRIYW5kbGUoKSByZXR1cm5lZCBpbnZhbGlkIGhhbmRsZSAlaHgiLCBoYW5kbGUpOwotCi0gIHVpbnQ4X3QgcmVhc29uID0gZGlzY29ubmVjdC5HZXRSZWFzb24oKTsKLSAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcygyMCksCi0gICAgICAgICAgICAgICBbdGhpcywgaGFuZGxlLCByZWFzb25dKCkgeyBEaXNjb25uZWN0Q2xlYW51cChoYW5kbGUsIHJlYXNvbik7IH0pOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nRW5jcnlwdENvbm5lY3Rpb24oCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgTE9HX0lORk8oIkluY29taW5nRW5jcnlwdENvbm5lY3Rpb24iKTsKLQotICAvLyBUT0RPOiBDaGVjayBrZXlzCi0gIEFkZHJlc3MgcGVlciA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHBlZXIpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJVbmtub3duIGNvbm5lY3Rpb24gQCVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkVOQ1JZUFRJT05fQ0hBTkdFKSkgewotICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZSwgYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpPTikpOwotICB9Ci0KLSAgdWludDE2X3QgY291bnQgPSBzZWN1cml0eV9tYW5hZ2VyXy5SZWFkS2V5KHBlZXIpOwotICBpZiAoY291bnQgPT0gMCkgewotICAgIExPR19FUlJPUigiTk8gS0VZIEhFUkUgZm9yICVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvIGFycmF5ID0gc2VjdXJpdHlfbWFuYWdlcl8uR2V0S2V5KHBlZXIpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlfdmVje2FycmF5LmJlZ2luKCksIGFycmF5LmVuZCgpfTsKLSAgYXV0byByZXNwb25zZSA9IG1vZGVsOjpwYWNrZXRzOjpFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLCBrZXlfdmVjKTsKLSAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUocmVzcG9uc2UpKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0VuY3J5cHRDb25uZWN0aW9uUmVzcG9uc2UoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgTE9HX0lORk8oIkluY29taW5nRW5jcnlwdENvbm5lY3Rpb25SZXNwb25zZSIpOwotICAvLyBUT0RPOiBDaGVjayBrZXlzCi0gIHVpbnQxNl90IGhhbmRsZSA9Ci0gICAgICBjb25uZWN0aW9uc18uR2V0SGFuZGxlT25seUFkZHJlc3MoaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpKTsKLSAgaWYgKGhhbmRsZSA9PSBrUmVzZXJ2ZWRIYW5kbGUpIHsKLSAgICBMT0dfSU5GTygiVW5rbm93biBjb25uZWN0aW9uIEAlcyIsCi0gICAgICAgICAgICAgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25DaGFuZ2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZSwgYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpPTik7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6RU5DUllQVElPTl9DSEFOR0UpKSB7Ci0gICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdJbnF1aXJ5UGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIGF1dG8gaW5xdWlyeSA9IG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5Vmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKGlucXVpcnkuSXNWYWxpZCgpKTsKLQotICBBZGRyZXNzIHBlZXIgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0KLSAgc3dpdGNoIChpbnF1aXJ5LkdldElucXVpcnlUeXBlKCkpIHsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6SW5xdWlyeVR5cGU6OlNUQU5EQVJEKTogewotICAgICAgYXV0byBpbnF1aXJ5X3Jlc3BvbnNlID0gbW9kZWw6OnBhY2tldHM6OklucXVpcnlSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCksIHBlZXIsCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0UGFnZVNjYW5SZXBldGl0aW9uTW9kZSgpLAotICAgICAgICAgIHByb3BlcnRpZXNfLkdldENsYXNzT2ZEZXZpY2UoKSwgcHJvcGVydGllc18uR2V0Q2xvY2tPZmZzZXQoKSk7Ci0gICAgICBTZW5kTGlua0xheWVyUGFja2V0KHN0ZDo6bW92ZShpbnF1aXJ5X3Jlc3BvbnNlKSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6SW5xdWlyeVR5cGU6OlJTU0kpOiB7Ci0gICAgICBhdXRvIGlucXVpcnlfcmVzcG9uc2UgPQotICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5UmVzcG9uc2VXaXRoUnNzaUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLAotICAgICAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCksCi0gICAgICAgICAgICAgIHByb3BlcnRpZXNfLkdldENsYXNzT2ZEZXZpY2UoKSwgcHJvcGVydGllc18uR2V0Q2xvY2tPZmZzZXQoKSwKLSAgICAgICAgICAgICAgR2V0UnNzaSgpKTsKLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQoc3RkOjptb3ZlKGlucXVpcnlfcmVzcG9uc2UpKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5VHlwZTo6RVhURU5ERUQpOiB7Ci0gICAgICBhdXRvIGlucXVpcnlfcmVzcG9uc2UgPQotICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpFeHRlbmRlZElucXVpcnlSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLAotICAgICAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCksCi0gICAgICAgICAgICAgIHByb3BlcnRpZXNfLkdldENsYXNzT2ZEZXZpY2UoKSwgcHJvcGVydGllc18uR2V0Q2xvY2tPZmZzZXQoKSwKLSAgICAgICAgICAgICAgR2V0UnNzaSgpLCBwcm9wZXJ0aWVzXy5HZXRFeHRlbmRlZElucXVpcnlEYXRhKCkpOwotICAgICAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUoaW5xdWlyeV9yZXNwb25zZSkpOwotCi0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX1dBUk4oIlVuaGFuZGxlZCBJbmNvbWluZyBJbnF1aXJ5IG9mIHR5cGUgJWQiLAotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihpbnF1aXJ5LkdldFR5cGUoKSkpOwotICAgICAgcmV0dXJuOwotICB9Ci0gIC8vIFRPRE86IFNlbmQgYW4gSW5xdWlyeSBSZXNwb25zZSBOb3RpZmljYXRpb24gRXZlbnQgNy43Ljc0Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdJbnF1aXJ5UmVzcG9uc2VQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byBiYXNpY19pbnF1aXJ5X3Jlc3BvbnNlID0KLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpCYXNpY0lucXVpcnlSZXNwb25zZVZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChiYXNpY19pbnF1aXJ5X3Jlc3BvbnNlLklzVmFsaWQoKSk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGVpcjsKLQotICBzd2l0Y2ggKGJhc2ljX2lucXVpcnlfcmVzcG9uc2UuR2V0SW5xdWlyeVR5cGUoKSkgewotICAgIGNhc2UgKG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5VHlwZTo6U1RBTkRBUkQpOiB7Ci0gICAgICAvLyBUT0RPOiBTdXBwb3J0IG11bHRpcGxlIGlucXVpcmllcyBpbiB0aGUgc2FtZSBwYWNrZXQuCi0gICAgICBhdXRvIGlucXVpcnlfcmVzcG9uc2UgPQotICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5UmVzcG9uc2VWaWV3OjpDcmVhdGUoYmFzaWNfaW5xdWlyeV9yZXNwb25zZSk7Ci0gICAgICBBU1NFUlQoaW5xdWlyeV9yZXNwb25zZS5Jc1ZhbGlkKCkpOwotCi0gICAgICBhdXRvIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUgPQotICAgICAgICAgIChibHVldG9vdGg6OmhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZSkKLSAgICAgICAgICAgICAgaW5xdWlyeV9yZXNwb25zZS5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCk7Ci0KLSAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6aGNpOjpJbnF1aXJ5UmVzdWx0PiByZXNwb25zZXM7Ci0gICAgICByZXNwb25zZXMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICByZXNwb25zZXMuYmFjaygpLmJkX2FkZHJfID0gaW5xdWlyeV9yZXNwb25zZS5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gICAgICByZXNwb25zZXMuYmFjaygpLnBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGVfID0gcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZTsKLSAgICAgIHJlc3BvbnNlcy5iYWNrKCkuY2xhc3Nfb2ZfZGV2aWNlXyA9IGlucXVpcnlfcmVzcG9uc2UuR2V0Q2xhc3NPZkRldmljZSgpOwotICAgICAgcmVzcG9uc2VzLmJhY2soKS5jbG9ja19vZmZzZXRfID0gaW5xdWlyeV9yZXNwb25zZS5HZXRDbG9ja09mZnNldCgpOwotICAgICAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6SW5xdWlyeVJlc3VsdEJ1aWxkZXI6OkNyZWF0ZShyZXNwb25zZXMpOwotICAgICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVCkpIHsKLSAgICAgICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIChtb2RlbDo6cGFja2V0czo6SW5xdWlyeVR5cGU6OlJTU0kpOiB7Ci0gICAgICBhdXRvIGlucXVpcnlfcmVzcG9uc2UgPQotICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5UmVzcG9uc2VXaXRoUnNzaVZpZXc6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgYmFzaWNfaW5xdWlyeV9yZXNwb25zZSk7Ci0gICAgICBBU1NFUlQoaW5xdWlyeV9yZXNwb25zZS5Jc1ZhbGlkKCkpOwotCi0gICAgICBhdXRvIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUgPQotICAgICAgICAgIChibHVldG9vdGg6OmhjaTo6UGFnZVNjYW5SZXBldGl0aW9uTW9kZSkKLSAgICAgICAgICAgICAgaW5xdWlyeV9yZXNwb25zZS5HZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKCk7Ci0KLSAgICAgIHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6aGNpOjpJbnF1aXJ5UmVzdWx0V2l0aFJzc2k+IHJlc3BvbnNlczsKLSAgICAgIHJlc3BvbnNlcy5lbXBsYWNlX2JhY2soKTsKLSAgICAgIHJlc3BvbnNlcy5iYWNrKCkuYWRkcmVzc18gPSBpbnF1aXJ5X3Jlc3BvbnNlLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgICAgIHJlc3BvbnNlcy5iYWNrKCkucGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZV8gPSBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlOwotICAgICAgcmVzcG9uc2VzLmJhY2soKS5jbGFzc19vZl9kZXZpY2VfID0gaW5xdWlyeV9yZXNwb25zZS5HZXRDbGFzc09mRGV2aWNlKCk7Ci0gICAgICByZXNwb25zZXMuYmFjaygpLmNsb2NrX29mZnNldF8gPSBpbnF1aXJ5X3Jlc3BvbnNlLkdldENsb2NrT2Zmc2V0KCk7Ci0gICAgICByZXNwb25zZXMuYmFjaygpLnJzc2lfID0gaW5xdWlyeV9yZXNwb25zZS5HZXRSc3NpKCk7Ci0gICAgICBhdXRvIHBhY2tldCA9Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OklucXVpcnlSZXN1bHRXaXRoUnNzaUJ1aWxkZXI6OkNyZWF0ZShyZXNwb25zZXMpOwotICAgICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpJTlFVSVJZX1JFU1VMVF9XSVRIX1JTU0kpKSB7Ci0gICAgICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSAobW9kZWw6OnBhY2tldHM6OklucXVpcnlUeXBlOjpFWFRFTkRFRCk6IHsKLSAgICAgIGF1dG8gaW5xdWlyeV9yZXNwb25zZSA9Ci0gICAgICAgICAgbW9kZWw6OnBhY2tldHM6OkV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlVmlldzo6Q3JlYXRlKAotICAgICAgICAgICAgICBiYXNpY19pbnF1aXJ5X3Jlc3BvbnNlKTsKLSAgICAgIEFTU0VSVChpbnF1aXJ5X3Jlc3BvbnNlLklzVmFsaWQoKSk7Ci0KLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcmF3X2J1aWxkZXJfcHRyID0KLSAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPigpOwotICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKGtOdW1Db21tYW5kUGFja2V0cyk7Ci0gICAgICByYXdfYnVpbGRlcl9wdHItPkFkZEFkZHJlc3MoaW5xdWlyeV9yZXNwb25zZS5HZXRTb3VyY2VBZGRyZXNzKCkpOwotICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKGlucXVpcnlfcmVzcG9uc2UuR2V0UGFnZVNjYW5SZXBldGl0aW9uTW9kZSgpKTsKLSAgICAgIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMSgweDAwKTsgIC8vIF9yZXNlcnZlZF8KLSAgICAgIGF1dG8gY2xhc3Nfb2ZfZGV2aWNlID0gaW5xdWlyeV9yZXNwb25zZS5HZXRDbGFzc09mRGV2aWNlKCk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNsYXNzX29mX2RldmljZS5rTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKGNsYXNzX29mX2RldmljZS5jb2RbaV0pOwotICAgICAgfQotICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMyKGlucXVpcnlfcmVzcG9uc2UuR2V0Q2xvY2tPZmZzZXQoKSk7Ci0gICAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoaW5xdWlyeV9yZXNwb25zZS5HZXRSc3NpKCkpOwotICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMoaW5xdWlyeV9yZXNwb25zZS5HZXRFeHRlbmRlZERhdGEoKSk7Ci0KLSAgICAgIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkV2ZW50QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkVYVEVOREVEX0lOUVVJUllfUkVTVUxULAotICAgICAgICAgIHN0ZDo6bW92ZShyYXdfYnVpbGRlcl9wdHIpKTsKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6RVhURU5ERURfSU5RVUlSWV9SRVNVTFQpKSB7Ci0gICAgICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBMT0dfV0FSTigiVW5oYW5kbGVkIEluY29taW5nIElucXVpcnkgUmVzcG9uc2Ugb2YgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJhc2ljX2lucXVpcnlfcmVzcG9uc2UuR2V0SW5xdWlyeVR5cGUoKSkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdJb0NhcGFiaWxpdHlSZXF1ZXN0UGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIEFkZHJlc3MgcGVlciA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZShBZGRyZXNzV2l0aFR5cGUoCi0gICAgICBwZWVyLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUykpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJEZXZpY2Ugbm90IGNvbm5lY3RlZCAlcyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXByb3BlcnRpZXNfLkdldFNlY3VyZVNpbXBsZVBhaXJpbmdTdXBwb3J0ZWQoKSkgewotICAgIExPR19XQVJOKCJUcnlpbmcgUElOIHBhaXJpbmcgZm9yICVzIiwKLSAgICAgICAgICAgICBpbmNvbWluZy5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICAgIG1vZGVsOjpwYWNrZXRzOjpJb0NhcGFiaWxpdHlOZWdhdGl2ZVJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgaW5jb21pbmcuR2V0RGVzdGluYXRpb25BZGRyZXNzKCksIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KAotICAgICAgICAgICAgICAgIEVycm9yQ29kZTo6VU5TVVBQT1JURURfUkVNT1RFX09SX0xNUF9GRUFUVVJFKSkpOwotICAgIGlmICghc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25JblByb2dyZXNzKCkpIHsKLSAgICAgIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdChpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBmYWxzZSk7Ci0gICAgfQotICAgIHNlY3VyaXR5X21hbmFnZXJfLlNldFBpblJlcXVlc3RlZChwZWVyKTsKLSAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlBJTl9DT0RFX1JFUVVFU1QpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6UGluQ29kZVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpKSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gcmVxdWVzdCA9IG1vZGVsOjpwYWNrZXRzOjpJb0NhcGFiaWxpdHlSZXF1ZXN0Vmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKHJlcXVlc3QuSXNWYWxpZCgpKTsKLQotICB1aW50OF90IGlvX2NhcGFiaWxpdHkgPSByZXF1ZXN0LkdldElvQ2FwYWJpbGl0eSgpOwotICB1aW50OF90IG9vYl9kYXRhX3ByZXNlbnQgPSByZXF1ZXN0LkdldE9vYkRhdGFQcmVzZW50KCk7Ci0gIHVpbnQ4X3QgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gcmVxdWVzdC5HZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cygpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcGVlciwgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eT4oaW9fY2FwYWJpbGl0eSksCi0gICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6T29iRGF0YVByZXNlbnQ+KG9vYl9kYXRhX3ByZXNlbnQpLAotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzPigKLSAgICAgICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpKTsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotCi0gIGJvb2wgcGFpcmluZ19zdGFydGVkID0gc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25JblByb2dyZXNzKCk7Ci0gIGlmICghcGFpcmluZ19zdGFydGVkKSB7Ci0gICAgc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25SZXF1ZXN0KHBlZXIsIGhhbmRsZSwgZmFsc2UpOwotICAgIFN0YXJ0U2ltcGxlUGFpcmluZyhwZWVyKTsKLSAgfQotCi0gIHNlY3VyaXR5X21hbmFnZXJfLlNldFBlZXJJb0NhcGFiaWxpdHkocGVlciwgaW9fY2FwYWJpbGl0eSwgb29iX2RhdGFfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpOwotICBpZiAocGFpcmluZ19zdGFydGVkKSB7Ci0gICAgUGFpcmluZ1R5cGUgcGFpcmluZ190eXBlID0gc2VjdXJpdHlfbWFuYWdlcl8uR2V0U2ltcGxlUGFpcmluZ1R5cGUoKTsKLSAgICBpZiAocGFpcmluZ190eXBlICE9IFBhaXJpbmdUeXBlOjpJTlZBTElEKSB7Ci0gICAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlciwgcGFpcmluZ190eXBlXSgpIHsKLSAgICAgICAgQXV0aGVudGljYXRlUmVtb3RlU3RhZ2UxKHBlZXIsIHBhaXJpbmdfdHlwZSk7Ci0gICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgTE9HX0lORk8oIlNlY3VyaXR5IE1hbmFnZXIgcmV0dXJuZWQgSU5WQUxJRCIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nSW9DYXBhYmlsaXR5UmVzcG9uc2VQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byByZXNwb25zZSA9IG1vZGVsOjpwYWNrZXRzOjpJb0NhcGFiaWxpdHlSZXNwb25zZVZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChyZXNwb25zZS5Jc1ZhbGlkKCkpOwotICBpZiAoIXByb3BlcnRpZXNfLkdldFNlY3VyZVNpbXBsZVBhaXJpbmdTdXBwb3J0ZWQoKSkgewotICAgIExPR19XQVJOKCJPbmx5IHNpbXBsZSBwYWlyaW5nIG1vZGUgaXMgaW1wbGVtZW50ZWQiKTsKLSAgICBTZW5kTGlua0xheWVyUGFja2V0KAotICAgICAgICBtb2RlbDo6cGFja2V0czo6SW9DYXBhYmlsaXR5TmVnYXRpdmVSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpLCBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigKLSAgICAgICAgICAgICAgICBFcnJvckNvZGU6OlVOU1VQUE9SVEVEX1JFTU9URV9PUl9MTVBfRkVBVFVSRSkpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBBZGRyZXNzIHBlZXIgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIHVpbnQ4X3QgaW9fY2FwYWJpbGl0eSA9IHJlc3BvbnNlLkdldElvQ2FwYWJpbGl0eSgpOwotICB1aW50OF90IG9vYl9kYXRhX3ByZXNlbnQgPSByZXNwb25zZS5HZXRPb2JEYXRhUHJlc2VudCgpOwotICB1aW50OF90IGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA9Ci0gICAgICByZXNwb25zZS5HZXRBdXRoZW50aWNhdGlvblJlcXVpcmVtZW50cygpOwotCi0gIHNlY3VyaXR5X21hbmFnZXJfLlNldFBlZXJJb0NhcGFiaWxpdHkocGVlciwgaW9fY2FwYWJpbGl0eSwgb29iX2RhdGFfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eVJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcGVlciwgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eT4oaW9fY2FwYWJpbGl0eSksCi0gICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6T29iRGF0YVByZXNlbnQ+KG9vYl9kYXRhX3ByZXNlbnQpLAotICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkF1dGhlbnRpY2F0aW9uUmVxdWlyZW1lbnRzPigKLSAgICAgICAgICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpKTsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpJT19DQVBBQklMSVRZX1JFU1BPTlNFKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotCi0gIFBhaXJpbmdUeXBlIHBhaXJpbmdfdHlwZSA9IHNlY3VyaXR5X21hbmFnZXJfLkdldFNpbXBsZVBhaXJpbmdUeXBlKCk7Ci0gIGlmIChwYWlyaW5nX3R5cGUgIT0gUGFpcmluZ1R5cGU6OklOVkFMSUQpIHsKLSAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlciwgcGFpcmluZ190eXBlXSgpIHsKLSAgICAgIEF1dGhlbnRpY2F0ZVJlbW90ZVN0YWdlMShwZWVyLCBwYWlyaW5nX3R5cGUpOwotICAgIH0pOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJTZWN1cml0eSBNYW5hZ2VyIHJldHVybmVkIElOVkFMSUQiKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nSW9DYXBhYmlsaXR5TmVnYXRpdmVSZXNwb25zZVBhY2tldCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBBZGRyZXNzIHBlZXIgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0KLSAgQVNTRVJUKHNlY3VyaXR5X21hbmFnZXJfLkdldEF1dGhlbnRpY2F0aW9uQWRkcmVzcygpID09IHBlZXIpOwotCi0gIHNlY3VyaXR5X21hbmFnZXJfLkludmFsaWRhdGVJb0NhcGFiaWxpdGllcygpOwotICBMT0dfSU5GTygiJXMgZG9lc24ndCBzdXBwb3J0IFNTUCwgdHJ5IFBJTiIsCi0gICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBzZWN1cml0eV9tYW5hZ2VyXy5TZXRQaW5SZXF1ZXN0ZWQocGVlcik7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVCkpIHsKLSAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6UGluQ29kZVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdJc29QYWNrZXQoTGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBhdXRvIGlzbyA9IElzb0RhdGFQYWNrZXRWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQoaXNvLklzVmFsaWQoKSk7Ci0KLSAgdWludDE2X3QgY2lzX2hhbmRsZSA9IGlzby5HZXRIYW5kbGUoKTsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzQ2lzSGFuZGxlKGNpc19oYW5kbGUpKSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nIElTTyBwYWNrZXQgdG8gdW5rbm93biBoYW5kbGUgMHglaHgiLCBjaXNfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzQ29ubmVjdGVkQ2lzKGNpc19oYW5kbGUpKSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nIElTTyBwYWNrZXQgdG8gYSBkaXNjb25uZWN0ZWQgaGFuZGxlIDB4JWh4IiwgY2lzX2hhbmRsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBzYyA9IGlzby5HZXRTYygpOwotICBzd2l0Y2ggKHNjKSB7Ci0gICAgY2FzZSBTdGFydENvbnRpbnVhdGlvbjo6U1RBUlQ6IHsKLSAgICAgIGF1dG8gaXNvX3N0YXJ0ID0gSXNvU3RhcnRWaWV3OjpDcmVhdGUoaXNvKTsKLSAgICAgIEFTU0VSVChpc29fc3RhcnQuSXNWYWxpZCgpKTsKLSAgICAgIGlmIChpc28uR2V0Q21wbHQoKSA9PSBDb21wbGV0ZTo6Q09NUExFVEUpIHsKLSAgICAgICAgc2VuZF9pc29fKGJsdWV0b290aDo6aGNpOjpJc29XaXRob3V0VGltZXN0YW1wQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgY2lzX2hhbmRsZSwgYmx1ZXRvb3RoOjpoY2k6Oklzb1BhY2tldEJvdW5kYXJ5RmxhZzo6Q09NUExFVEVfU0RVLAotICAgICAgICAgICAgMCAvKiBzZXEgbnVtICovLCBibHVldG9vdGg6OmhjaTo6SXNvUGFja2V0U3RhdHVzRmxhZzo6VkFMSUQsCi0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPigKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pihpc29fc3RhcnQuR2V0UGF5bG9hZCgpLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvX3N0YXJ0LkdldFBheWxvYWQoKS5lbmQoKSkpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZW5kX2lzb18oYmx1ZXRvb3RoOjpoY2k6Oklzb1dpdGhvdXRUaW1lc3RhbXBCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBjaXNfaGFuZGxlLCBibHVldG9vdGg6OmhjaTo6SXNvUGFja2V0Qm91bmRhcnlGbGFnOjpGSVJTVF9GUkFHTUVOVCwKLSAgICAgICAgICAgIDAgLyogc2VxIG51bSAqLywgYmx1ZXRvb3RoOjpoY2k6Oklzb1BhY2tldFN0YXR1c0ZsYWc6OlZBTElELAotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4oCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4oaXNvX3N0YXJ0LkdldFBheWxvYWQoKS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb19zdGFydC5HZXRQYXlsb2FkKCkuZW5kKCkpKSkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBTdGFydENvbnRpbnVhdGlvbjo6Q09OVElOVUFUSU9OOiB7Ci0gICAgICBhdXRvIGNvbnRpbnVhdGlvbiA9IElzb0NvbnRpbnVhdGlvblZpZXc6OkNyZWF0ZShpc28pOwotICAgICAgQVNTRVJUKGNvbnRpbnVhdGlvbi5Jc1ZhbGlkKCkpOwotICAgICAgaWYgKGlzby5HZXRDbXBsdCgpID09IENvbXBsZXRlOjpDT01QTEVURSkgewotICAgICAgICBzZW5kX2lzb18oYmx1ZXRvb3RoOjpoY2k6Oklzb1dpdGhvdXRUaW1lc3RhbXBCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBjaXNfaGFuZGxlLCBibHVldG9vdGg6OmhjaTo6SXNvUGFja2V0Qm91bmRhcnlGbGFnOjpMQVNUX0ZSQUdNRU5ULAotICAgICAgICAgICAgMCAvKiBzZXEgbnVtICovLCBibHVldG9vdGg6OmhjaTo6SXNvUGFja2V0U3RhdHVzRmxhZzo6VkFMSUQsCi0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPigKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pihjb250aW51YXRpb24uR2V0UGF5bG9hZCgpLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uLkdldFBheWxvYWQoKS5lbmQoKSkpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZW5kX2lzb18oYmx1ZXRvb3RoOjpoY2k6Oklzb1dpdGhvdXRUaW1lc3RhbXBCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBjaXNfaGFuZGxlLAotICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Oklzb1BhY2tldEJvdW5kYXJ5RmxhZzo6Q09OVElOVUFUSU9OX0ZSQUdNRU5ULAotICAgICAgICAgICAgMCAvKiBzZXEgbnVtICovLCBibHVldG9vdGg6OmhjaTo6SXNvUGFja2V0U3RhdHVzRmxhZzo6VkFMSUQsCi0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPigKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pihjb250aW51YXRpb24uR2V0UGF5bG9hZCgpLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uLkdldFBheWxvYWQoKS5lbmQoKSkpKSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkhhbmRsZUlzbyhibHVldG9vdGg6OmhjaTo6SXNvVmlldyBpc28pIHsKLSAgYXV0byBjaXNfaGFuZGxlID0gaXNvLkdldENvbm5lY3Rpb25IYW5kbGUoKTsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzQ2lzSGFuZGxlKGNpc19oYW5kbGUpKSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nIElTTyBwYWNrZXQgdG8gdW5rbm93biBoYW5kbGUgMHglaHgiLCBjaXNfaGFuZGxlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzQ29ubmVjdGVkQ2lzKGNpc19oYW5kbGUpKSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nIElTTyBwYWNrZXQgdG8gZGlzY29ubmVjdGVkIGhhbmRsZSAweCVoeCIsIGNpc19oYW5kbGUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gYWNsX2hhbmRsZSA9IGNvbm5lY3Rpb25zXy5HZXRBY2xIYW5kbGVGb3JDaXNIYW5kbGUoY2lzX2hhbmRsZSk7Ci0gIHVpbnQxNl90IHJlbW90ZV9oYW5kbGUgPQotICAgICAgY29ubmVjdGlvbnNfLkdldFJlbW90ZUNpc0hhbmRsZUZvckNpc0hhbmRsZShjaXNfaGFuZGxlKTsKLSAgbW9kZWw6OnBhY2tldHM6OlN0YXJ0Q29udGludWF0aW9uIHN0YXJ0X2ZsYWcgPQotICAgICAgbW9kZWw6OnBhY2tldHM6OlN0YXJ0Q29udGludWF0aW9uOjpTVEFSVDsKLSAgbW9kZWw6OnBhY2tldHM6OkNvbXBsZXRlIGNvbXBsZXRlX2ZsYWcgPSBtb2RlbDo6cGFja2V0czo6Q29tcGxldGU6OkNPTVBMRVRFOwotICBzd2l0Y2ggKGlzby5HZXRQYkZsYWcoKSkgewotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Oklzb1BhY2tldEJvdW5kYXJ5RmxhZzo6Q09NUExFVEVfU0RVOgotICAgICAgc3RhcnRfZmxhZyA9IG1vZGVsOjpwYWNrZXRzOjpTdGFydENvbnRpbnVhdGlvbjo6U1RBUlQ7Ci0gICAgICBjb21wbGV0ZV9mbGFnID0gbW9kZWw6OnBhY2tldHM6OkNvbXBsZXRlOjpDT01QTEVURTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Oklzb1BhY2tldEJvdW5kYXJ5RmxhZzo6Q09OVElOVUFUSU9OX0ZSQUdNRU5UOgotICAgICAgc3RhcnRfZmxhZyA9IG1vZGVsOjpwYWNrZXRzOjpTdGFydENvbnRpbnVhdGlvbjo6Q09OVElOVUFUSU9OOwotICAgICAgY29tcGxldGVfZmxhZyA9IG1vZGVsOjpwYWNrZXRzOjpDb21wbGV0ZTo6SU5DT01QTEVURTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Oklzb1BhY2tldEJvdW5kYXJ5RmxhZzo6RklSU1RfRlJBR01FTlQ6Ci0gICAgICBzdGFydF9mbGFnID0gbW9kZWw6OnBhY2tldHM6OlN0YXJ0Q29udGludWF0aW9uOjpTVEFSVDsKLSAgICAgIGNvbXBsZXRlX2ZsYWcgPSBtb2RlbDo6cGFja2V0czo6Q29tcGxldGU6OklOQ09NUExFVEU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpJc29QYWNrZXRCb3VuZGFyeUZsYWc6OkxBU1RfRlJBR01FTlQ6Ci0gICAgICBzdGFydF9mbGFnID0gbW9kZWw6OnBhY2tldHM6OlN0YXJ0Q29udGludWF0aW9uOjpDT05USU5VQVRJT047Ci0gICAgICBjb21wbGV0ZV9mbGFnID0gbW9kZWw6OnBhY2tldHM6OkNvbXBsZXRlOjpJTkNPTVBMRVRFOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHN0YXJ0X2ZsYWcgPT0gbW9kZWw6OnBhY2tldHM6OlN0YXJ0Q29udGludWF0aW9uOjpTVEFSVCkgewotICAgIGlmIChpc28uR2V0VHNGbGFnKCkgPT0gYmx1ZXRvb3RoOjpoY2k6OlRpbWVTdGFtcEZsYWc6OlBSRVNFTlQpIHsKLSAgICAgIGF1dG8gdGltZXN0YW1wZWQgPSBibHVldG9vdGg6OmhjaTo6SXNvV2l0aFRpbWVzdGFtcFZpZXc6OkNyZWF0ZShpc28pOwotICAgICAgQVNTRVJUKHRpbWVzdGFtcGVkLklzVmFsaWQoKSk7Ci0gICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSB0aW1lc3RhbXBlZC5HZXRUaW1lU3RhbXAoKTsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4gcGF5bG9hZCA9Ci0gICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcj4oKTsKLSAgICAgIGZvciAoY29uc3QgYXV0byBpdCA6IHRpbWVzdGFtcGVkLkdldFBheWxvYWQoKSkgewotICAgICAgICBwYXlsb2FkLT5BZGRPY3RldHMxKGl0KTsKLSAgICAgIH0KLQotICAgICAgU2VuZExlTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpJc29TdGFydEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBjb25uZWN0aW9uc18uR2V0T3duQWRkcmVzcyhhY2xfaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgY29ubmVjdGlvbnNfLkdldEFkZHJlc3MoYWNsX2hhbmRsZSkuR2V0QWRkcmVzcygpLCByZW1vdGVfaGFuZGxlLAotICAgICAgICAgIGNvbXBsZXRlX2ZsYWcsIHRpbWVzdGFtcCwgc3RkOjptb3ZlKHBheWxvYWQpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF1dG8gcGt0ID0gYmx1ZXRvb3RoOjpoY2k6Oklzb1dpdGhvdXRUaW1lc3RhbXBWaWV3OjpDcmVhdGUoaXNvKTsKLSAgICAgIEFTU0VSVChwa3QuSXNWYWxpZCgpKTsKLQotICAgICAgYXV0byBwYXlsb2FkID0KLSAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPihzdGQ6OnZlY3Rvcjx1aW50OF90PigKLSAgICAgICAgICAgICAgcGt0LkdldFBheWxvYWQoKS5iZWdpbigpLCBwa3QuR2V0UGF5bG9hZCgpLmVuZCgpKSk7Ci0KLSAgICAgIFNlbmRMZUxpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6SXNvU3RhcnRCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoYWNsX2hhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgICAgIGNvbm5lY3Rpb25zXy5HZXRBZGRyZXNzKGFjbF9oYW5kbGUpLkdldEFkZHJlc3MoKSwgcmVtb3RlX2hhbmRsZSwKLSAgICAgICAgICBjb21wbGV0ZV9mbGFnLCAwLCBzdGQ6Om1vdmUocGF5bG9hZCkpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYXV0byBwa3QgPSBibHVldG9vdGg6OmhjaTo6SXNvV2l0aG91dFRpbWVzdGFtcFZpZXc6OkNyZWF0ZShpc28pOwotICAgIEFTU0VSVChwa3QuSXNWYWxpZCgpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+IHBheWxvYWQgPQotICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGJsdWV0b290aDo6cGFja2V0OjpSYXdCdWlsZGVyPihzdGQ6OnZlY3Rvcjx1aW50OF90PigKLSAgICAgICAgICAgIHBrdC5HZXRQYXlsb2FkKCkuYmVnaW4oKSwgcGt0LkdldFBheWxvYWQoKS5lbmQoKSkpOwotICAgIFNlbmRMZUxpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6SXNvQ29udGludWF0aW9uQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBjb25uZWN0aW9uc18uR2V0T3duQWRkcmVzcyhhY2xfaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICAgIGNvbm5lY3Rpb25zXy5HZXRBZGRyZXNzKGFjbF9oYW5kbGUpLkdldEFkZHJlc3MoKSwgcmVtb3RlX2hhbmRsZSwKLSAgICAgICAgY29tcGxldGVfZmxhZywgc3RkOjptb3ZlKHBheWxvYWQpKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0lzb0Nvbm5lY3Rpb25SZXF1ZXN0UGFja2V0KAotICAgIExpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byByZXEgPSBJc29Db25uZWN0aW9uUmVxdWVzdFZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChyZXEuSXNWYWxpZCgpKTsKLSAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpoY2k6OkNpc1BhcmFtZXRlcnNDb25maWc+IHN0cmVhbV9jb25maWdzOwotICBibHVldG9vdGg6OmhjaTo6Q2lzUGFyYW1ldGVyc0NvbmZpZyBzdHJlYW1fY29uZmlnOwotCi0gIHN0cmVhbV9jb25maWcubWF4X3NkdV9tX3RvX3NfID0gcmVxLkdldE1heFNkdU1Ub1MoKTsKLSAgc3RyZWFtX2NvbmZpZy5tYXhfc2R1X3NfdG9fbV8gPSByZXEuR2V0TWF4U2R1U1RvTSgpOwotCi0gIHN0cmVhbV9jb25maWdzLnB1c2hfYmFjayhzdHJlYW1fY29uZmlnKTsKLQotICB1aW50OF90IGdyb3VwX2lkID0gcmVxLkdldENpZ0lkKCk7Ci0KLSAgLyogQ0lHIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZSBsb2NhbCBob3N0IGJlZm9yZSB1c2UgKi8KLSAgYmx1ZXRvb3RoOjpoY2k6OkNyZWF0ZUNpc0NvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfID0gcmVxLkdldFJlcXVlc3RlckNpc0hhbmRsZSgpOwotCi0gIGNvbmZpZy5hY2xfY29ubmVjdGlvbl9oYW5kbGVfID0KLSAgICAgIGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkpOwotICBjb25uZWN0aW9uc18uQ3JlYXRlUGVuZGluZ0Npcyhjb25maWcpOwotICBjb25uZWN0aW9uc18uU2V0UmVtb3RlQ2lzSGFuZGxlKGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5HZXRSZXF1ZXN0ZXJDaXNIYW5kbGUoKSk7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkpIHsKLSAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVDaXNSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBjb25maWcuYWNsX2Nvbm5lY3Rpb25faGFuZGxlXywgY29uZmlnLmNpc19jb25uZWN0aW9uX2hhbmRsZV8sIGdyb3VwX2lkLAotICAgICAgICByZXEuR2V0SWQoKSkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdJc29Db25uZWN0aW9uUmVzcG9uc2VQYWNrZXQoCi0gICAgTGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBhdXRvIHJlc3BvbnNlID0gSXNvQ29ubmVjdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKHJlc3BvbnNlLklzVmFsaWQoKSk7Ci0KLSAgYmx1ZXRvb3RoOjpoY2k6OkNyZWF0ZUNpc0NvbmZpZyBjb25maWc7Ci0gIGNvbmZpZy5hY2xfY29ubmVjdGlvbl9oYW5kbGVfID0gcmVzcG9uc2UuR2V0UmVxdWVzdGVyQWNsSGFuZGxlKCk7Ci0gIGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfID0gcmVzcG9uc2UuR2V0UmVxdWVzdGVyQ2lzSGFuZGxlKCk7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc1BlbmRpbmdDaXNDb25uZWN0aW9uKGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfKSkgewotICAgIExPR19JTkZPKCJJZ25vcmluZyBjb25uZWN0aW9uIHJlc3BvbnNlIHdpdGggdW5rbm93biBDSVMgaGFuZGxlIDB4JTA0aHgiLAotICAgICAgICAgICAgIGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRXJyb3JDb2RlIHN0YXR1cyA9IHN0YXRpY19jYXN0PEVycm9yQ29kZT4ocmVzcG9uc2UuR2V0U3RhdHVzKCkpOwotICBpZiAoc3RhdHVzICE9IEVycm9yQ29kZTo6U1VDQ0VTUykgewotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUNpc0VzdGFibGlzaGVkQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIHN0YXR1cywgY29uZmlnLmNpc19jb25uZWN0aW9uX2hhbmRsZV8sIDAsIDAsIDAsIDAsCi0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlNlY29uZGFyeVBoeVR5cGU6Ok5PX1BBQ0tFVFMsCi0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlNlY29uZGFyeVBoeVR5cGU6Ok5PX1BBQ0tFVFMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgMCkpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgY29ubmVjdGlvbnNfLlNldFJlbW90ZUNpc0hhbmRsZShjb25maWcuY2lzX2Nvbm5lY3Rpb25faGFuZGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5HZXRSZXNwb25kZXJDaXNIYW5kbGUoKSk7Ci0gIGNvbm5lY3Rpb25zXy5Db25uZWN0Q2lzKGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfKTsKLSAgYXV0byBzdHJlYW1fcGFyYW1ldGVycyA9Ci0gICAgICBjb25uZWN0aW9uc18uR2V0U3RyZWFtUGFyYW1ldGVycyhjb25maWcuY2lzX2Nvbm5lY3Rpb25faGFuZGxlXyk7Ci0gIGF1dG8gZ3JvdXBfcGFyYW1ldGVycyA9Ci0gICAgICBjb25uZWN0aW9uc18uR2V0R3JvdXBQYXJhbWV0ZXJzKHN0cmVhbV9wYXJhbWV0ZXJzLmdyb3VwX2lkKTsKLSAgLy8gVE9ETzogV2hpY2ggb2YgdGhlc2UgYXJlIGltcG9ydGFudCBlbm91Z2ggdG8gZmFrZT8KLSAgdWludDMyX3QgY2lnX3N5bmNfZGVsYXkgPSAweDEwMDsKLSAgdWludDMyX3QgY2lzX3N5bmNfZGVsYXkgPSAweDIwMDsKLSAgdWludDMyX3QgbGF0ZW5jeV9tX3RvX3MgPSBncm91cF9wYXJhbWV0ZXJzLm1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3M7Ci0gIHVpbnQzMl90IGxhdGVuY3lfc190b19tID0gZ3JvdXBfcGFyYW1ldGVycy5tYXhfdHJhbnNwb3J0X2xhdGVuY3lfc190b19tOwotICB1aW50OF90IG5zZSA9IDE7Ci0gIHVpbnQ4X3QgYm5fbV90b19zID0gMDsKLSAgdWludDhfdCBibl9zX3RvX20gPSAwOwotICB1aW50OF90IGZ0X21fdG9fcyA9IDA7Ci0gIHVpbnQ4X3QgZnRfc190b19tID0gMDsKLSAgdWludDhfdCBtYXhfcGR1X21fdG9fcyA9IDB4NDA7Ci0gIHVpbnQ4X3QgbWF4X3BkdV9zX3RvX20gPSAweDQwOwotICB1aW50MTZfdCBpc29faW50ZXJ2YWwgPSAweDEwMDsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSkgewotICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUNpc0VzdGFibGlzaGVkQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBzdGF0dXMsIGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfLCBjaWdfc3luY19kZWxheSwgY2lzX3N5bmNfZGVsYXksCi0gICAgICAgIGxhdGVuY3lfbV90b19zLCBsYXRlbmN5X3NfdG9fbSwKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlNlY29uZGFyeVBoeVR5cGU6Ok5PX1BBQ0tFVFMsCi0gICAgICAgIGJsdWV0b290aDo6aGNpOjpTZWNvbmRhcnlQaHlUeXBlOjpOT19QQUNLRVRTLCBuc2UsIGJuX21fdG9fcywgYm5fc190b19tLAotICAgICAgICBmdF9tX3RvX3MsIGZ0X3NfdG9fbSwgbWF4X3BkdV9tX3RvX3MsIG1heF9wZHVfc190b19tLCBpc29faW50ZXJ2YWwpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nS2V5cHJlc3NOb3RpZmljYXRpb25QYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byBrZXlwcmVzcyA9IG1vZGVsOjpwYWNrZXRzOjpLZXlwcmVzc05vdGlmaWNhdGlvblZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChrZXlwcmVzcy5Jc1ZhbGlkKCkpOwotICBhdXRvIG5vdGlmaWNhdGlvbl90eXBlID0ga2V5cHJlc3MuR2V0Tm90aWZpY2F0aW9uVHlwZSgpOwotICBpZiAobm90aWZpY2F0aW9uX3R5cGUgPgotICAgICAgbW9kZWw6OnBhY2tldHM6OlBhc3NrZXlOb3RpZmljYXRpb25UeXBlOjpFTlRSWV9DT01QTEVURUQpIHsKLSAgICBMT0dfV0FSTigiRHJvcHBpbmcgdW5rbm93biBub3RpZmljYXRpb24gdHlwZSAlZCIsCi0gICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihub3RpZmljYXRpb25fdHlwZSkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OktFWVBSRVNTX05PVElGSUNBVElPTikpIHsKLSAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6S2V5cHJlc3NOb3RpZmljYXRpb25CdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OktleXByZXNzTm90aWZpY2F0aW9uVHlwZT4oCi0gICAgICAgICAgICBub3RpZmljYXRpb25fdHlwZSkpKTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBycGFfbWF0Y2hlc19pcmsoCi0gICAgQWRkcmVzcyBycGEsIHN0ZDo6YXJyYXk8dWludDhfdCwgTGlua0xheWVyQ29udHJvbGxlcjo6a0lya1NpemU+IGlyaykgewotICAvLyAxLjMuMi4zIFByaXZhdGUgZGV2aWNlIGFkZHJlc3MgcmVzb2x1dGlvbgotICB1aW50OF90IGhhc2hbM10gPSB7cnBhLmFkZHJlc3NbMF0sIHJwYS5hZGRyZXNzWzFdLCBycGEuYWRkcmVzc1syXX07Ci0gIHVpbnQ4X3QgcHJhbmRbM10gPSB7cnBhLmFkZHJlc3NbM10sIHJwYS5hZGRyZXNzWzRdLCBycGEuYWRkcmVzc1s1XX07Ci0KLSAgLy8gZ2VuZXJhdGUgWCA9IEUgaXJrKFIwLCBSMSwgUjIpIGFuZCBSIGlzIHJhbmRvbSBhZGRyZXNzIDMgTFNPCi0gIGF1dG8geCA9IGJsdWV0b290aDo6Y3J5cHRvX3Rvb2xib3g6OmFlc18xMjgoaXJrLCAmcHJhbmRbMF0sIDMpOwotCi0gIC8vIElmIHRoZSBoYXNoZXMgbWF0Y2gsIHRoaXMgaXMgdGhlIElSSwotICByZXR1cm4gKG1lbWNtcCh4LmRhdGEoKSwgJmhhc2hbMF0sIDMpID09IDApOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nTGVBZHZlcnRpc2VtZW50UGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIC8vIFRPRE86IEhhbmRsZSBtdWx0aXBsZSBhZHZlcnRpc2VtZW50cyBwZXIgcGFja2V0LgotCi0gIEFkZHJlc3MgYWRkcmVzcyA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgYXV0byBhZHZlcnRpc2VtZW50ID0gbW9kZWw6OnBhY2tldHM6OkxlQWR2ZXJ0aXNlbWVudFZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChhZHZlcnRpc2VtZW50LklzVmFsaWQoKSk7Ci0gIGF1dG8gYWRkcmVzc190eXBlID0gYWR2ZXJ0aXNlbWVudC5HZXRBZGRyZXNzVHlwZSgpOwotICBhdXRvIGFkdl90eXBlID0gYWR2ZXJ0aXNlbWVudC5HZXRBZHZlcnRpc2VtZW50VHlwZSgpOwotCi0gIGlmIChsZV9zY2FuX2VuYWJsZV8gPT0gYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZTo6TEVfU0VUX1NDQU5fRU5BQkxFKSB7Ci0gICAgdmVjdG9yPHVpbnQ4X3Q+IGFkID0gYWR2ZXJ0aXNlbWVudC5HZXREYXRhKCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+IHJhd19idWlsZGVyX3B0ciA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KCk7Ci0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpBRFZFUlRJU0lOR19SRVBPUlQpKTsKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoMHgwMSk7ICAvLyBudW0gcmVwb3J0cwotICAgIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMShzdGF0aWNfY2FzdDx1aW50OF90PihhZHZfdHlwZSkpOwotICAgIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMShzdGF0aWNfY2FzdDx1aW50OF90PihhZGRyZXNzX3R5cGUpKTsKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKGFkLnNpemUoKSk7Ci0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMoYWQpOwotICAgIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMShHZXRSc3NpKCkpOwotICAgIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkV2ZW50QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBibHVldG9vdGg6OmhjaTo6RXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5ULCBzdGQ6Om1vdmUocmF3X2J1aWxkZXJfcHRyKSk7Ci0gICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSkgewotICAgICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICAgIH0KLSAgfQotCi0gIGlmIChsZV9zY2FuX2VuYWJsZV8gPT0gYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZTo6TEVfU0VUX0VYVEVOREVEX1NDQU5fRU5BQkxFKSB7Ci0gICAgdmVjdG9yPHVpbnQ4X3Q+IGFkID0gYWR2ZXJ0aXNlbWVudC5HZXREYXRhKCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+IHJhd19idWlsZGVyX3B0ciA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Ymx1ZXRvb3RoOjpwYWNrZXQ6OlJhd0J1aWxkZXI+KCk7Ci0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KAotICAgICAgICBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpFWFRFTkRFRF9BRFZFUlRJU0lOR19SRVBPUlQpKTsKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoMHgwMSk7ICAvLyBudW0gcmVwb3J0cwotICAgIHN3aXRjaCAoYWR2X3R5cGUpIHsKLSAgICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfSU5EOgotICAgICAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoMHgxMyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGU6OkFEVl9ESVJFQ1RfSU5EOgotICAgICAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoMHgxNSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGU6OkFEVl9TQ0FOX0lORDoKLSAgICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKDB4MTIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfTk9OQ09OTl9JTkQ6Ci0gICAgICAgIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMSgweDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpBZHZlcnRpc2VtZW50VHlwZTo6U0NBTl9SRVNQT05TRToKLSAgICAgICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKDB4MWIpOyAgLy8gMHgxYSBmb3IgQURWX1NDQU5fSU5EIHNjYW4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoMHgwMCk7ICAvLyBSZXNlcnZlZAotICAgIHJhd19idWlsZGVyX3B0ci0+QWRkT2N0ZXRzMShzdGF0aWNfY2FzdDx1aW50OF90PihhZGRyZXNzX3R5cGUpKTsKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKDEpOyAgICAgLy8gUHJpbWFyeV9QSFkKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoMCk7ICAgICAvLyBTZWNvbmRhcnlfUEhZCi0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKDB4RkYpOyAgLy8gQWR2ZXJ0aXNpbmdfU0lEIC0gbm90IHByb3ZpZGVkCi0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKDB4N0YpOyAgLy8gVHhfUG93ZXIgLSBOb3QgYXZhaWxhYmxlCi0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKEdldFJzc2koKSk7Ci0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMyKDApOyAgLy8gUGVyaW9kaWNfQWR2ZXJ0aXNpbmdfSW50ZXJ2YWwgLSBOb25lCi0gICAgcmF3X2J1aWxkZXJfcHRyLT5BZGRPY3RldHMxKDApOyAgLy8gRGlyZWN0X0FkZHJlc3NfVHlwZSAtIFBVQkxJQwotICAgIHJhd19idWlsZGVyX3B0ci0+QWRkQWRkcmVzcyhBZGRyZXNzOjprRW1wdHkpOyAgLy8gRGlyZWN0X0FkZHJlc3MKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0czEoYWQuc2l6ZSgpKTsKLSAgICByYXdfYnVpbGRlcl9wdHItPkFkZE9jdGV0cyhhZCk7Ci0gICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSkgewotICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkV2ZW50QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpFdmVudENvZGU6OkxFX01FVEFfRVZFTlQsCi0gICAgICAgICAgc3RkOjptb3ZlKHJhd19idWlsZGVyX3B0cikpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBY3RpdmUgc2Nhbm5pbmcKLSAgaWYgKGxlX3NjYW5fZW5hYmxlXyAhPSBibHVldG9vdGg6OmhjaTo6T3BDb2RlOjpOT05FICYmIGxlX3NjYW5fdHlwZV8gPT0gMSkgewotICAgIGF1dG8gdG9fc2VuZCA9IG1vZGVsOjpwYWNrZXRzOjpMZVNjYW5CdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIHByb3BlcnRpZXNfLkdldExlQWRkcmVzcygpLCBhZGRyZXNzKTsKLSAgICBTZW5kTGVMaW5rTGF5ZXJQYWNrZXQoc3RkOjptb3ZlKHRvX3NlbmQpKTsKLSAgfQotCi0gIEFkZHJlc3MgcmVzb2x2ZWRfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIHVpbnQ4X3QgcmVzb2x2ZWRfYWRkcmVzc190eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYWRkcmVzc190eXBlKTsKLSAgYm9vbCByZXNvbHZlZCA9IGZhbHNlOwotICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogbGVfcmVzb2x2aW5nX2xpc3RfKSB7Ci0gICAgaWYgKHJwYV9tYXRjaGVzX2lyayhhZGRyZXNzLCBlbnRyeS5wZWVyX2lyaykpIHsKLSAgICAgIHJlc29sdmVkID0gdHJ1ZTsKLSAgICAgIHJlc29sdmVkX2FkZHJlc3MgPSBlbnRyeS5hZGRyZXNzOwotICAgICAgcmVzb2x2ZWRfYWRkcmVzc190eXBlID0gZW50cnkuYWRkcmVzc190eXBlOwotICAgIH0KLSAgfQotCi0gIC8vIENvbm5lY3QKLSAgaWYgKChsZV9jb25uZWN0XyAmJiBsZV9wZWVyX2FkZHJlc3NfID09IGFkZHJlc3MgJiYKLSAgICAgICBsZV9wZWVyX2FkZHJlc3NfdHlwZV8gPT0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYWRkcmVzc190eXBlKSAmJgotICAgICAgIChhZHZfdHlwZSA9PSBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGU6OkFEVl9JTkQgfHwKLSAgICAgICAgYWR2X3R5cGUgPT0gbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfRElSRUNUX0lORCkpIHx8Ci0gICAgICAoTGVDb25uZWN0TGlzdENvbnRhaW5zRGV2aWNlKGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFkZHJlc3NfdHlwZSkpKSB8fAotICAgICAgKHJlc29sdmVkICYmCi0gICAgICAgTGVDb25uZWN0TGlzdENvbnRhaW5zRGV2aWNlKAotICAgICAgICAgICByZXNvbHZlZF9hZGRyZXNzLCBzdGF0aWNfY2FzdDx1aW50OF90PihyZXNvbHZlZF9hZGRyZXNzX3R5cGUpKSkpIHsKLSAgICBpZiAoIWNvbm5lY3Rpb25zXy5DcmVhdGVQZW5kaW5nTGVDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICAgIGFkZHJlc3MsIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZT4oYWRkcmVzc190eXBlKSkpKSB7Ci0gICAgICBMT0dfV0FSTigKLSAgICAgICAgICAiQ3JlYXRlUGVuZGluZ0xlQ29ubmVjdGlvbiBmYWlsZWQgZm9yIGNvbm5lY3Rpb24gdG8gJXMgKHR5cGUgJWhoeCkiLAotICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIGFkZHJlc3NfdHlwZSk7Ci0gICAgfQotICAgIEFkZHJlc3Mgb3duX2FkZHJlc3M7Ci0gICAgYXV0byBvd25fYWRkcmVzc190eXBlID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlPihsZV9hZGRyZXNzX3R5cGVfKTsKLSAgICBzd2l0Y2ggKG93bl9hZGRyZXNzX3R5cGUpIHsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M6Ci0gICAgICAgIG93bl9hZGRyZXNzID0gcHJvcGVydGllc18uR2V0QWRkcmVzcygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1M6Ci0gICAgICAgIG93bl9hZGRyZXNzID0gcHJvcGVydGllc18uR2V0TGVBZGRyZXNzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgKLSAgICAgICAgICAgICJVbmhhbmRsZWQgY29ubmVjdGlvbiBhZGRyZXNzIHR5cGUgJXMiLAotICAgICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlVGV4dChvd25fYWRkcmVzc190eXBlKS5jX3N0cigpKTsKLSAgICB9Ci0gICAgTE9HX0lORk8oIkNvbm5lY3RpbmcgdG8gJXMgKHR5cGUgJWhoeCkgb3duX2FkZHJlc3MgJXMgKHR5cGUgJWhoeCkiLAotICAgICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksIGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICBvd25fYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCksIGxlX2FkZHJlc3NfdHlwZV8pOwotICAgIGxlX2Nvbm5lY3RfID0gZmFsc2U7Ci0gICAgbGVfc2Nhbl9lbmFibGVfID0gYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZTo6Tk9ORTsKLQotICAgIGF1dG8gdG9fc2VuZCA9IG1vZGVsOjpwYWNrZXRzOjpMZUNvbm5lY3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIG93bl9hZGRyZXNzLCBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCksIGxlX2Nvbm5lY3Rpb25faW50ZXJ2YWxfbWluXywKLSAgICAgICAgbGVfY29ubmVjdGlvbl9pbnRlcnZhbF9tYXhfLCBsZV9jb25uZWN0aW9uX2xhdGVuY3lfLAotICAgICAgICBsZV9jb25uZWN0aW9uX3N1cGVydmlzaW9uX3RpbWVvdXRfLAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihsZV9hZGRyZXNzX3R5cGVfKSk7Ci0KLSAgICBTZW5kTGVMaW5rTGF5ZXJQYWNrZXQoc3RkOjptb3ZlKHRvX3NlbmQpKTsKLSAgfQotfQotCi11aW50MTZfdCBMaW5rTGF5ZXJDb250cm9sbGVyOjpIYW5kbGVMZUNvbm5lY3Rpb24oQWRkcmVzc1dpdGhUeXBlIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc1dpdGhUeXBlIG93bl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbm5lY3Rpb25fbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0KSB7Ci0gIC8vIFRPRE86IENob29zZSBiZXR3ZWVuIExlQ29ubmVjdGlvbkNvbXBsZXRlIGFuZCBMZUVuaGFuY2VkQ29ubmVjdGlvbkNvbXBsZXRlCi0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbm5lY3Rpb25zXy5DcmVhdGVMZUNvbm5lY3Rpb24oYWRkcmVzcywgb3duX2FkZHJlc3MpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19XQVJOKCJObyBwZW5kaW5nIGNvbm5lY3Rpb24gZm9yIGNvbm5lY3Rpb24gZnJvbSAlcyIsCi0gICAgICAgICAgICAgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBrUmVzZXJ2ZWRIYW5kbGU7Ci0gIH0KLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSkgewotICAgIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkxlQ29ubmVjdGlvbkNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZSwgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OlJvbGU+KHJvbGUpLAotICAgICAgICBhZGRyZXNzLkdldEFkZHJlc3NUeXBlKCksIGFkZHJlc3MuR2V0QWRkcmVzcygpLCBjb25uZWN0aW9uX2ludGVydmFsLAotICAgICAgICBjb25uZWN0aW9uX2xhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQsCi0gICAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpDbG9ja0FjY3VyYWN5PigweDAwKSk7Ci0gICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICB9Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdMZUNvbm5lY3RQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byBjb25uZWN0ID0gbW9kZWw6OnBhY2tldHM6OkxlQ29ubmVjdFZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChjb25uZWN0LklzVmFsaWQoKSk7Ci0gIHVpbnQxNl90IGNvbm5lY3Rpb25faW50ZXJ2YWwgPSAoY29ubmVjdC5HZXRMZUNvbm5lY3Rpb25JbnRlcnZhbE1heCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0LkdldExlQ29ubmVjdGlvbkludGVydmFsTWluKCkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI7Ci0gIGlmICghY29ubmVjdGlvbnNfLkNyZWF0ZVBlbmRpbmdMZUNvbm5lY3Rpb24oQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSwgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0LkdldEFkZHJlc3NUeXBlKCkpKSkpIHsKLSAgICBMT0dfV0FSTigKLSAgICAgICAgIkNyZWF0ZVBlbmRpbmdMZUNvbm5lY3Rpb24gZmFpbGVkIGZvciBjb25uZWN0aW9uIGZyb20gJXMgKHR5cGUgIgotICAgICAgICAiJWhoeCkiLAotICAgICAgICBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICBjb25uZWN0LkdldEFkZHJlc3NUeXBlKCkpOwotICAgIHJldHVybjsKLSAgfQotICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1dpdGhUeXBlIG15X2FkZHJlc3N7fTsKLSAgYm9vbCBtYXRjaGVkX2FkdmVydGlzZXIgPSBmYWxzZTsKLSAgc2l6ZV90IHNldCA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWR2ZXJ0aXNlcnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgQWRkcmVzc1dpdGhUeXBlIGFkdmVydGlzZXJfYWRkcmVzcyA9IGFkdmVydGlzZXJzX1tpXS5HZXRBZGRyZXNzKCk7Ci0gICAgaWYgKGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpID09IGFkdmVydGlzZXJfYWRkcmVzcy5HZXRBZGRyZXNzKCkpIHsKLSAgICAgIG15X2FkZHJlc3MgPSBhZHZlcnRpc2VyX2FkZHJlc3M7Ci0gICAgICBtYXRjaGVkX2FkdmVydGlzZXIgPSB0cnVlOwotICAgICAgc2V0ID0gaTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIW1hdGNoZWRfYWR2ZXJ0aXNlcikgewotICAgIExPR19JTkZPKCJEcm9wcGluZyB1bm1hdGNoZWQgY29ubmVjdGlvbiByZXF1ZXN0IHRvICVzIiwKLSAgICAgICAgICAgICBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCBoYW5kbGUgPSBIYW5kbGVMZUNvbm5lY3Rpb24oCi0gICAgICBBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpLAotICAgICAgICAgIHN0YXRpY19jYXN0PGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZT4oY29ubmVjdC5HZXRBZGRyZXNzVHlwZSgpKSksCi0gICAgICBteV9hZGRyZXNzLCBzdGF0aWNfY2FzdDx1aW50OF90PihibHVldG9vdGg6OmhjaTo6Um9sZTo6UEVSSVBIRVJBTCksCi0gICAgICBjb25uZWN0aW9uX2ludGVydmFsLCBjb25uZWN0LkdldExlQ29ubmVjdGlvbkxhdGVuY3koKSwKLSAgICAgIGNvbm5lY3QuR2V0TGVDb25uZWN0aW9uU3VwZXJ2aXNpb25UaW1lb3V0KCkpOwotCi0gIGF1dG8gdG9fc2VuZCA9IG1vZGVsOjpwYWNrZXRzOjpMZUNvbm5lY3RDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpLCBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICBjb25uZWN0aW9uX2ludGVydmFsLCBjb25uZWN0LkdldExlQ29ubmVjdGlvbkxhdGVuY3koKSwKLSAgICAgIGNvbm5lY3QuR2V0TGVDb25uZWN0aW9uU3VwZXJ2aXNpb25UaW1lb3V0KCksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihteV9hZGRyZXNzLkdldEFkZHJlc3NUeXBlKCkpKTsKLSAgU2VuZExlTGlua0xheWVyUGFja2V0KHN0ZDo6bW92ZSh0b19zZW5kKSk7Ci0KLSAgaWYgKGFkdmVydGlzZXJzX1tzZXRdLklzRXh0ZW5kZWQoKSkgewotICAgIHVpbnQ4X3QgbnVtX2FkdmVydGlzZW1lbnRzID0gYWR2ZXJ0aXNlcnNfW3NldF0uR2V0TnVtQWR2ZXJ0aXNpbmdFdmVudHMoKTsKLSAgICBhZHZlcnRpc2Vyc19bc2V0XS5EaXNhYmxlKCk7Ci0gICAgaWYgKHByb3BlcnRpZXNfLkdldExlRXZlbnRTdXBwb3J0ZWQoCi0gICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpBRFZFUlRJU0lOR19TRVRfVEVSTUlOQVRFRCkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUFkdmVydGlzaW5nU2V0VGVybWluYXRlZEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIHNldCwgaGFuZGxlLCBudW1fYWR2ZXJ0aXNlbWVudHMpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0xlQ29ubmVjdENvbXBsZXRlUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIGF1dG8gY29tcGxldGUgPSBtb2RlbDo6cGFja2V0czo6TGVDb25uZWN0Q29tcGxldGVWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQoY29tcGxldGUuSXNWYWxpZCgpKTsKLSAgSGFuZGxlTGVDb25uZWN0aW9uKAotICAgICAgQWRkcmVzc1dpdGhUeXBlKAotICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU+KGNvbXBsZXRlLkdldEFkZHJlc3NUeXBlKCkpKSwKLSAgICAgIEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICBpbmNvbWluZy5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU+KGxlX2FkZHJlc3NfdHlwZV8pKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJsdWV0b290aDo6aGNpOjpSb2xlOjpDRU5UUkFMKSwKLSAgICAgIGNvbXBsZXRlLkdldExlQ29ubmVjdGlvbkludGVydmFsKCksIGNvbXBsZXRlLkdldExlQ29ubmVjdGlvbkxhdGVuY3koKSwKLSAgICAgIGNvbXBsZXRlLkdldExlQ29ubmVjdGlvblN1cGVydmlzaW9uVGltZW91dCgpKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0xlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3QoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byByZXF1ZXN0ID0KLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0Vmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKHJlcXVlc3QuSXNWYWxpZCgpKTsKLSAgQWRkcmVzcyBwZWVyID0gaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpOwotICB1aW50MTZfdCBoYW5kbGUgPSBjb25uZWN0aW9uc18uR2V0SGFuZGxlT25seUFkZHJlc3MocGVlcik7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkAlczogVW5rbm93biBjb25uZWN0aW9uIEAlcyIsCi0gICAgICAgICAgICAgaW5jb21pbmcuR2V0RGVzdGluYXRpb25BZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSAmJgotICAgICAgcHJvcGVydGllc18uR2V0TGVFdmVudFN1cHBvcnRlZCgKLSAgICAgICAgICBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpDT05ORUNUSU9OX1VQREFURV9DT01QTEVURSkpIHsKLSAgICBzZW5kX2V2ZW50XygKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBoYW5kbGUsIHJlcXVlc3QuR2V0SW50ZXJ2YWxNaW4oKSwgcmVxdWVzdC5HZXRJbnRlcnZhbE1heCgpLAotICAgICAgICAgICAgcmVxdWVzdC5HZXRMYXRlbmN5KCksIHJlcXVlc3QuR2V0VGltZW91dCgpKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0xlQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBhdXRvIHVwZGF0ZSA9Ci0gICAgICBtb2RlbDo6cGFja2V0czo6TGVDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlVmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKHVwZGF0ZS5Jc1ZhbGlkKCkpOwotICBBZGRyZXNzIHBlZXIgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIHVpbnQxNl90IGhhbmRsZSA9IGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhwZWVyKTsKLSAgaWYgKGhhbmRsZSA9PSBrUmVzZXJ2ZWRIYW5kbGUpIHsKLSAgICBMT0dfSU5GTygiQCVzOiBVbmtub3duIGNvbm5lY3Rpb24gQCVzIiwKLSAgICAgICAgICAgICBpbmNvbWluZy5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkxFX01FVEFfRVZFTlQpICYmCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRMZUV2ZW50U3VwcG9ydGVkKAotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkNPTk5FQ1RJT05fVVBEQVRFX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpMZUNvbm5lY3Rpb25VcGRhdGVDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8RXJyb3JDb2RlPih1cGRhdGUuR2V0U3RhdHVzKCkpLCBoYW5kbGUsCi0gICAgICAgIHVwZGF0ZS5HZXRJbnRlcnZhbCgpLCB1cGRhdGUuR2V0TGF0ZW5jeSgpLCB1cGRhdGUuR2V0VGltZW91dCgpKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0xlRW5jcnlwdENvbm5lY3Rpb24oCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgTE9HX0lORk8oIkluY29taW5nTGVFbmNyeXB0Q29ubmVjdGlvbiIpOwotCi0gIEFkZHJlc3MgcGVlciA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgdWludDE2X3QgaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZU9ubHlBZGRyZXNzKHBlZXIpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJAJXM6IFVua25vd24gY29ubmVjdGlvbiBAJXMiLAotICAgICAgICAgICAgIGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gbGVfZW5jcnlwdCA9IG1vZGVsOjpwYWNrZXRzOjpMZUVuY3J5cHRDb25uZWN0aW9uVmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKGxlX2VuY3J5cHQuSXNWYWxpZCgpKTsKLQotICAvLyBUT0RPOiBTYXZlIGtleXMgdG8gY2hlY2sKLQotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkxFX01FVEFfRVZFTlQpKSB7Ci0gICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlTG9uZ1Rlcm1LZXlSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBoYW5kbGUsIGxlX2VuY3J5cHQuR2V0UmFuZCgpLCBsZV9lbmNyeXB0LkdldEVkaXYoKSkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdMZUVuY3J5cHRDb25uZWN0aW9uUmVzcG9uc2UoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgTE9HX0lORk8oIkluY29taW5nTGVFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlIik7Ci0gIC8vIFRPRE86IENoZWNrIGtleXMKLSAgdWludDE2X3QgaGFuZGxlID0KLSAgICAgIGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJAJXM6IFVua25vd24gY29ubmVjdGlvbiBAJXMiLAotICAgICAgICAgICAgIGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRXJyb3JDb2RlIHN0YXR1cyA9IEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgYXV0byByZXNwb25zZSA9Ci0gICAgICBtb2RlbDo6cGFja2V0czo6TGVFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlVmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKHJlc3BvbnNlLklzVmFsaWQoKSk7Ci0KLSAgLy8gWmVybyBMVEsgaXMgYSByZWplY3Rpb24KLSAgaWYgKHJlc3BvbnNlLkdldEx0aygpID09IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+KCkpIHsKLSAgICBzdGF0dXMgPSBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU7Ci0gIH0KLQotICBpZiAoY29ubmVjdGlvbnNfLklzRW5jcnlwdGVkKGhhbmRsZSkpIHsKLSAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkVOQ1JZUFRJT05fS0VZX1JFRlJFU0hfQ09NUExFVEUpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6RW5jcnlwdGlvbktleVJlZnJlc2hDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBzdGF0dXMsIGhhbmRsZSkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb25uZWN0aW9uc18uRW5jcnlwdChoYW5kbGUpOwotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6RU5DUllQVElPTl9DSEFOR0UpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6RW5jcnlwdGlvbkNoYW5nZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBzdGF0dXMsIGhhbmRsZSwgYmx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25FbmFibGVkOjpPTikpOwotICAgIH0KLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nTGVSZWFkUmVtb3RlRmVhdHVyZXMoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgdWludDE2X3QgaGFuZGxlID0KLSAgICAgIGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkpOwotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpTVUNDRVNTOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19XQVJOKCJAJXM6IFVua25vd24gY29ubmVjdGlvbiBAJXMiLAotICAgICAgICAgICAgIGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpLlRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotICBTZW5kTGlua0xheWVyUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxlUmVhZFJlbW90ZUZlYXR1cmVzUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgaW5jb21pbmcuR2V0RGVzdGluYXRpb25BZGRyZXNzKCksIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZVN1cHBvcnRlZEZlYXR1cmVzKCksIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0YXR1cykpKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ0xlUmVhZFJlbW90ZUZlYXR1cmVzUmVzcG9uc2UoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgdWludDE2X3QgaGFuZGxlID0KLSAgICAgIGNvbm5lY3Rpb25zXy5HZXRIYW5kbGVPbmx5QWRkcmVzcyhpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkpOwotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpTVUNDRVNTOwotICBhdXRvIHJlc3BvbnNlID0KLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMZVJlYWRSZW1vdGVGZWF0dXJlc1Jlc3BvbnNlVmlldzo6Q3JlYXRlKGluY29taW5nKTsKLSAgQVNTRVJUKHJlc3BvbnNlLklzVmFsaWQoKSk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkAlczogVW5rbm93biBjb25uZWN0aW9uIEAlcyIsCi0gICAgICAgICAgICAgaW5jb21pbmcuR2V0RGVzdGluYXRpb25BZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHN0YXR1cyA9IEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9IGVsc2UgewotICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PEVycm9yQ29kZT4ocmVzcG9uc2UuR2V0U3RhdHVzKCkpOwotICB9Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkpIHsKLSAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVSZWFkUmVtb3RlRmVhdHVyZXNDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgc3RhdHVzLCBoYW5kbGUsIHJlc3BvbnNlLkdldEZlYXR1cmVzKCkpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nTGVTY2FuUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIGZvciAoYXV0byYgYWR2ZXJ0aXNlciA6IGFkdmVydGlzZXJzXykgewotICAgIGF1dG8gdG9fc2VuZCA9IGFkdmVydGlzZXIuR2V0U2NhblJlc3BvbnNlKGluY29taW5nLkdldERlc3RpbmF0aW9uQWRkcmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSk7Ci0gICAgaWYgKHRvX3NlbmQgIT0gbnVsbHB0cikgewotICAgICAgU2VuZExlTGlua0xheWVyUGFja2V0KHN0ZDo6bW92ZSh0b19zZW5kKSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5jb21pbmdMZVNjYW5SZXNwb25zZVBhY2tldCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBhdXRvIHNjYW5fcmVzcG9uc2UgPSBtb2RlbDo6cGFja2V0czo6TGVTY2FuUmVzcG9uc2VWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQoc2Nhbl9yZXNwb25zZS5Jc1ZhbGlkKCkpOwotICB2ZWN0b3I8dWludDhfdD4gYWQgPSBzY2FuX3Jlc3BvbnNlLkdldERhdGEoKTsKLSAgYXV0byBhZHZfdHlwZSA9IHNjYW5fcmVzcG9uc2UuR2V0QWR2ZXJ0aXNlbWVudFR5cGUoKTsKLSAgYXV0byBhZGRyZXNzX3R5cGUgPQotICAgICAgc3RhdGljX2Nhc3Q8TGVBZHZlcnRpc2VtZW50OjpBZGRyZXNzVHlwZT4oc2Nhbl9yZXNwb25zZS5HZXRBZGRyZXNzVHlwZSgpKTsKLSAgaWYgKGxlX3NjYW5fZW5hYmxlXyA9PSBibHVldG9vdGg6OmhjaTo6T3BDb2RlOjpMRV9TRVRfU0NBTl9FTkFCTEUpIHsKLSAgICBpZiAoYWR2X3R5cGUgIT0gbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpTQ0FOX1JFU1BPTlNFKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJsdWV0b290aDo6aGNpOjpMZUFkdmVydGlzaW5nUmVwb3J0UmF3IHJlcG9ydDsKLSAgICByZXBvcnQuZXZlbnRfdHlwZV8gPSBibHVldG9vdGg6OmhjaTo6QWR2ZXJ0aXNpbmdFdmVudFR5cGU6OlNDQU5fUkVTUE9OU0U7Ci0gICAgcmVwb3J0LmFkZHJlc3NfID0gaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpOwotICAgIHJlcG9ydC5hZGRyZXNzX3R5cGVfID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlPihhZGRyZXNzX3R5cGUpOwotICAgIHJlcG9ydC5hZHZlcnRpc2luZ19kYXRhXyA9IHNjYW5fcmVzcG9uc2UuR2V0RGF0YSgpOwotICAgIHJlcG9ydC5yc3NpXyA9IEdldFJzc2koKTsKLQotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkgJiYKLSAgICAgICAgcHJvcGVydGllc18uR2V0TGVFdmVudFN1cHBvcnRlZCgKLSAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpTdWJldmVudENvZGU6OkFEVkVSVElTSU5HX1JFUE9SVCkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKAotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpMZUFkdmVydGlzaW5nUmVwb3J0UmF3QnVpbGRlcjo6Q3JlYXRlKHtyZXBvcnR9KSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGxlX3NjYW5fZW5hYmxlXyA9PSBibHVldG9vdGg6OmhjaTo6T3BDb2RlOjpMRV9TRVRfRVhURU5ERURfU0NBTl9FTkFCTEUgJiYKLSAgICAgIHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpMRV9NRVRBX0VWRU5UKSAmJgotICAgICAgcHJvcGVydGllc18uR2V0TGVFdmVudFN1cHBvcnRlZCgKLSAgICAgICAgICBibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlOjpFWFRFTkRFRF9BRFZFUlRJU0lOR19SRVBPUlQpKSB7Ci0gICAgYmx1ZXRvb3RoOjpoY2k6OkxlRXh0ZW5kZWRBZHZlcnRpc2luZ1JlcG9ydCByZXBvcnR7fTsKLSAgICByZXBvcnQuYWRkcmVzc18gPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gICAgcmVwb3J0LmFkZHJlc3NfdHlwZV8gPQotICAgICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6RGlyZWN0QWR2ZXJ0aXNpbmdBZGRyZXNzVHlwZT4oYWRkcmVzc190eXBlKTsKLSAgICByZXBvcnQubGVnYWN5XyA9IHRydWU7Ci0gICAgcmVwb3J0LnNjYW5uYWJsZV8gPSB0cnVlOwotICAgIHJlcG9ydC5jb25uZWN0YWJsZV8gPSB0cnVlOyAgLy8gVE9ETzogZmFsc2UgaWYgQURWX1NDQU5fSU5ECi0gICAgcmVwb3J0LnNjYW5fcmVzcG9uc2VfID0gdHJ1ZTsKLSAgICByZXBvcnQucHJpbWFyeV9waHlfID0gYmx1ZXRvb3RoOjpoY2k6OlByaW1hcnlQaHlUeXBlOjpMRV8xTTsKLSAgICByZXBvcnQuYWR2ZXJ0aXNpbmdfc2lkXyA9IDB4RkY7Ci0gICAgcmVwb3J0LnR4X3Bvd2VyXyA9IDB4N0Y7Ci0gICAgcmVwb3J0LmFkdmVydGlzaW5nX2RhdGFfID0gYWQ7Ci0gICAgcmVwb3J0LnJzc2lfID0gR2V0UnNzaSgpOwotICAgIHNlbmRfZXZlbnRfKAotICAgICAgICBibHVldG9vdGg6OmhjaTo6TGVFeHRlbmRlZEFkdmVydGlzaW5nUmVwb3J0QnVpbGRlcjo6Q3JlYXRlKHtyZXBvcnR9KSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1Bhc3NrZXlQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byBwYXNza2V5ID0gbW9kZWw6OnBhY2tldHM6OlBhc3NrZXlWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQocGFzc2tleS5Jc1ZhbGlkKCkpOwotICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdQJywgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1Bhc3NrZXlGYWlsZWRQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byBmYWlsZWQgPSBtb2RlbDo6cGFja2V0czo6UGFzc2tleUZhaWxlZFZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChmYWlsZWQuSXNWYWxpZCgpKTsKLSAgYXV0byBjdXJyZW50X3BlZXIgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0gIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBjdXJyZW50X3BlZXJdKCkgewotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6U0lNUExFX1BBSVJJTkdfQ09NUExFVEUpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6QVVUSEVOVElDQVRJT05fRkFJTFVSRSwgY3VycmVudF9wZWVyKSk7Ci0gICAgfQotICB9KTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1BpblJlcXVlc3RQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byByZXF1ZXN0ID0gbW9kZWw6OnBhY2tldHM6OlBpblJlcXVlc3RWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQocmVxdWVzdC5Jc1ZhbGlkKCkpOwotICBhdXRvIHBlZXIgPSBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIGF1dG8gaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldEhhbmRsZShBZGRyZXNzV2l0aFR5cGUoCi0gICAgICBwZWVyLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUykpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJEcm9wcGluZyAlcyByZXF1ZXN0IChubyBjb25uZWN0aW9uKSIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBhdXRvIHdyb25nX3BpbiA9IHJlcXVlc3QuR2V0UGluQ29kZSgpOwotICAgIHdyb25nX3BpblswXSA9IHdyb25nX3BpblswXSsrOwotICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OlBpblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCksIHBlZXIsIHdyb25nX3BpbikpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25JblByb2dyZXNzKCkpIHsKLSAgICBhdXRvIGN1cnJlbnRfcGVlciA9IHNlY3VyaXR5X21hbmFnZXJfLkdldEF1dGhlbnRpY2F0aW9uQWRkcmVzcygpOwotICAgIGlmIChjdXJyZW50X3BlZXIgIT0gcGVlcikgewotICAgICAgTE9HX0lORk8oIkRyb3BwaW5nICVzIHJlcXVlc3QgKCVzIGluIHByb2dyZXNzKSIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgY3VycmVudF9wZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBhdXRvIHdyb25nX3BpbiA9IHJlcXVlc3QuR2V0UGluQ29kZSgpOwotICAgICAgd3JvbmdfcGluWzBdID0gd3JvbmdfcGluWzBdKys7Ci0gICAgICBTZW5kTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpQaW5SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCksIHBlZXIsIHdyb25nX3BpbikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiSW5jb21pbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdCAlcyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBzZWN1cml0eV9tYW5hZ2VyXy5BdXRoZW50aWNhdGlvblJlcXVlc3QocGVlciwgaGFuZGxlLCBmYWxzZSk7Ci0gIH0KLSAgYXV0byBjdXJyZW50X3BlZXIgPSBzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKTsKLSAgc2VjdXJpdHlfbWFuYWdlcl8uU2V0UmVtb3RlUGluKHBlZXIsIHJlcXVlc3QuR2V0UGluQ29kZSgpKTsKLSAgaWYgKHNlY3VyaXR5X21hbmFnZXJfLkdldFBpblJlcXVlc3RlZChwZWVyKSkgewotICAgIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5HZXRMb2NhbFBpblJlc3BvbnNlUmVjZWl2ZWQocGVlcikpIHsKLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OlBpblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwgcGVlciwgcmVxdWVzdC5HZXRQaW5Db2RlKCkpKTsKLSAgICAgIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5QaW5Db21wYXJlKCkpIHsKLSAgICAgICAgTE9HX0lORk8oIkF1dGhlbnRpY2F0aW5nICVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdMJywgcGVlcik7ICAvLyBMZWdhY3kKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0gICAgICAgIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBwZWVyXSgpIHsKLSAgICAgICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFKSkgewotICAgICAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsIHBlZXIpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiUElOIHBhaXJpbmcgJXMiLCBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlcl0oKSB7Ci0gICAgICBzZWN1cml0eV9tYW5hZ2VyXy5TZXRQaW5SZXF1ZXN0ZWQocGVlcik7Ci0gICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlBJTl9DT0RFX1JFUVVFU1QpKSB7Ci0gICAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpQaW5Db2RlUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShwZWVyKSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1BpblJlc3BvbnNlUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIGF1dG8gcmVxdWVzdCA9IG1vZGVsOjpwYWNrZXRzOjpQaW5SZXNwb25zZVZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChyZXF1ZXN0LklzVmFsaWQoKSk7Ci0gIGF1dG8gcGVlciA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgYXV0byBoYW5kbGUgPSBjb25uZWN0aW9uc18uR2V0SGFuZGxlKEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgIHBlZXIsIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZTo6UFVCTElDX0RFVklDRV9BRERSRVNTKSk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkRyb3BwaW5nICVzIHJlcXVlc3QgKG5vIGNvbm5lY3Rpb24pIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25JblByb2dyZXNzKCkpIHsKLSAgICBhdXRvIGN1cnJlbnRfcGVlciA9IHNlY3VyaXR5X21hbmFnZXJfLkdldEF1dGhlbnRpY2F0aW9uQWRkcmVzcygpOwotICAgIGlmIChjdXJyZW50X3BlZXIgIT0gcGVlcikgewotICAgICAgTE9HX0lORk8oIkRyb3BwaW5nICVzIHJlcXVlc3QgKCVzIGluIHByb2dyZXNzKSIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgY3VycmVudF9wZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJEcm9wcGluZyByZXNwb25zZSB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgJXMiLAotICAgICAgICAgICAgIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBjdXJyZW50X3BlZXIgPSBzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKTsKLSAgc2VjdXJpdHlfbWFuYWdlcl8uU2V0UmVtb3RlUGluKHBlZXIsIHJlcXVlc3QuR2V0UGluQ29kZSgpKTsKLSAgaWYgKHNlY3VyaXR5X21hbmFnZXJfLkdldFBpblJlcXVlc3RlZChwZWVyKSkgewotICAgIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5HZXRMb2NhbFBpblJlc3BvbnNlUmVjZWl2ZWQocGVlcikpIHsKLSAgICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OlBpblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwgcGVlciwgcmVxdWVzdC5HZXRQaW5Db2RlKCkpKTsKLSAgICAgIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5QaW5Db21wYXJlKCkpIHsKLSAgICAgICAgTE9HX0lORk8oIkF1dGhlbnRpY2F0aW5nICVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdMJywgcGVlcik7ICAvLyBMZWdhY3kKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0gICAgICAgIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBwZWVyXSgpIHsKLSAgICAgICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFKSkgewotICAgICAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsIHBlZXIpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBMT0dfSU5GTygiUElOIHBhaXJpbmcgJXMiLCBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlcl0oKSB7Ci0gICAgICBzZWN1cml0eV9tYW5hZ2VyXy5TZXRQaW5SZXF1ZXN0ZWQocGVlcik7Ci0gICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlBJTl9DT0RFX1JFUVVFU1QpKSB7Ci0gICAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpQaW5Db2RlUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZShwZWVyKSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbmNvbWluZ1BhZ2VQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpIHsKLSAgYXV0byBwYWdlID0gbW9kZWw6OnBhY2tldHM6OlBhZ2VWaWV3OjpDcmVhdGUoaW5jb21pbmcpOwotICBBU1NFUlQocGFnZS5Jc1ZhbGlkKCkpOwotICBMT0dfSU5GTygiZnJvbSAlcyIsIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmICghY29ubmVjdGlvbnNfLkNyZWF0ZVBlbmRpbmdDb25uZWN0aW9uKAotICAgICAgICAgIGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKSwgcHJvcGVydGllc18uR2V0QXV0aGVudGljYXRpb25FbmFibGUoKSkpIHsKLSAgICAvLyBTZW5kIGEgcmVzcG9uc2UgdG8gaW5kaWNhdGUgdGhhdCB3ZSdyZSBidXN5LCBvciBkcm9wIHRoZSBwYWNrZXQ/Ci0gICAgTE9HX1dBUk4oIkZhaWxlZCB0byBjcmVhdGUgYSBwZW5kaW5nIGNvbm5lY3Rpb24gZm9yICVzIiwKLSAgICAgICAgICAgICBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotCi0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzIHNvdXJjZV9hZGRyZXNze307Ci0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzOjpGcm9tU3RyaW5nKHBhZ2UuR2V0U291cmNlQWRkcmVzcygpLlRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzKTsKLQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpDb25uZWN0aW9uUmVxdWVzdEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHNvdXJjZV9hZGRyZXNzLCBwYWdlLkdldENsYXNzT2ZEZXZpY2UoKSwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpDb25uZWN0aW9uUmVxdWVzdExpbmtUeXBlOjpBQ0wpOwotCi0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6Q09OTkVDVElPTl9SRVFVRVNUKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nUGFnZVJlamVjdFBhY2tldCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBpbmNvbWluZykgewotICBMT0dfSU5GTygiJXMiLCBpbmNvbWluZy5HZXRTb3VyY2VBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgYXV0byByZWplY3QgPSBtb2RlbDo6cGFja2V0czo6UGFnZVJlamVjdFZpZXc6OkNyZWF0ZShpbmNvbWluZyk7Ci0gIEFTU0VSVChyZWplY3QuSXNWYWxpZCgpKTsKLSAgTE9HX0lORk8oIlNlbmRpbmcgQ3JlYXRlQ29ubmVjdGlvbkNvbXBsZXRlIik7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXRpY19jYXN0PEVycm9yQ29kZT4ocmVqZWN0LkdldFJlYXNvbigpKSwgMHgwZWZmLAotICAgICAgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpLCBibHVldG9vdGg6OmhjaTo6TGlua1R5cGU6OkFDTCwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpFbmFibGU6OkRJU0FCTEVEKTsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkluY29taW5nUGFnZVJlc3BvbnNlUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IGluY29taW5nKSB7Ci0gIEFkZHJlc3MgcGVlciA9IGluY29taW5nLkdldFNvdXJjZUFkZHJlc3MoKTsKLSAgTE9HX0lORk8oIiVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBib29sIGF3YWl0aW5nX2F1dGhlbnRpY2F0aW9uID0gY29ubmVjdGlvbnNfLkF1dGhlbnRpY2F0ZVBlbmRpbmdDb25uZWN0aW9uKCk7Ci0gIHVpbnQxNl90IGhhbmRsZSA9Ci0gICAgICBjb25uZWN0aW9uc18uQ3JlYXRlQ29ubmVjdGlvbihwZWVyLCBpbmNvbWluZy5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKSk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX1dBUk4oIk5vIGZyZWUgaGFuZGxlcyIpOwotICAgIHJldHVybjsKLSAgfQotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpDb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZSwgaW5jb21pbmcuR2V0U291cmNlQWRkcmVzcygpLAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkxpbmtUeXBlOjpBQ0wsIGJsdWV0b290aDo6aGNpOjpFbmFibGU6OkRJU0FCTEVEKTsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotCi0gIGlmIChhd2FpdGluZ19hdXRoZW50aWNhdGlvbikgewotICAgIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBwZWVyLCBoYW5kbGVdKCkgewotICAgICAgSGFuZGxlQXV0aGVudGljYXRpb25SZXF1ZXN0KHBlZXIsIGhhbmRsZSk7Ci0gICAgfSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpUaW1lclRpY2soKSB7Ci0gIGlmIChpbnF1aXJ5X3RpbWVyX3Rhc2tfaWRfICE9IGtJbnZhbGlkVGFza0lkKSBJbnF1aXJ5KCk7Ci0gIExlQWR2ZXJ0aXNpbmcoKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZUFkdmVydGlzaW5nKCkgewotICBzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbm93ID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgZm9yIChhdXRvJiBhZHZlcnRpc2VyIDogYWR2ZXJ0aXNlcnNfKSB7Ci0gICAgYXV0byBhZCA9IGFkdmVydGlzZXIuR2V0QWR2ZXJ0aXNlbWVudChub3cpOwotICAgIGlmIChhZCA9PSBudWxscHRyKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgU2VuZExlTGlua0xheWVyUGFja2V0KHN0ZDo6bW92ZShhZCkpOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6UmVnaXN0ZXJFdmVudENoYW5uZWwoCi0gICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6RXZlbnRCdWlsZGVyPik+JgotICAgICAgICBjYWxsYmFjaykgewotICBzZW5kX2V2ZW50XyA9IGNhbGxiYWNrOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlJlZ2lzdGVyQWNsQ2hhbm5lbCgKLSAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpBY2xCdWlsZGVyPik+JgotICAgICAgICBjYWxsYmFjaykgewotICBzZW5kX2FjbF8gPSBjYWxsYmFjazsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpSZWdpc3RlclNjb0NoYW5uZWwoCi0gICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcj4pPiYKLSAgICAgICAgY2FsbGJhY2spIHsKLSAgc2VuZF9zY29fID0gY2FsbGJhY2s7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6UmVnaXN0ZXJJc29DaGFubmVsKAotICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpoY2k6Oklzb0J1aWxkZXI+KT4mCi0gICAgICAgIGNhbGxiYWNrKSB7Ci0gIHNlbmRfaXNvXyA9IGNhbGxiYWNrOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlJlZ2lzdGVyUmVtb3RlQ2hhbm5lbCgKLSAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoCi0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4sIFBoeTo6VHlwZSk+JgotICAgICAgICBjYWxsYmFjaykgewotICBzZW5kX3RvX3JlbW90ZV8gPSBjYWxsYmFjazsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpSZWdpc3RlclRhc2tTY2hlZHVsZXIoCi0gICAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChtaWxsaXNlY29uZHMsIGNvbnN0IFRhc2tDYWxsYmFjayYpPgotICAgICAgICBldmVudF9zY2hlZHVsZXIpIHsKLSAgc2NoZWR1bGVfdGFza18gPSBldmVudF9zY2hlZHVsZXI7Ci19Ci0KLUFzeW5jVGFza0lkIExpbmtMYXllckNvbnRyb2xsZXI6OlNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMgZGVsYXlfbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFza0NhbGxiYWNrJiBjYWxsYmFjaykgewotICBpZiAoc2NoZWR1bGVfdGFza18pIHsKLSAgICByZXR1cm4gc2NoZWR1bGVfdGFza18oZGVsYXlfbXMsIGNhbGxiYWNrKTsKLSAgfSBlbHNlIHsKLSAgICBjYWxsYmFjaygpOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6UmVnaXN0ZXJQZXJpb2RpY1Rhc2tTY2hlZHVsZXIoCi0gICAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChtaWxsaXNlY29uZHMsIG1pbGxpc2Vjb25kcywgY29uc3QgVGFza0NhbGxiYWNrJik+Ci0gICAgICAgIHBlcmlvZGljX2V2ZW50X3NjaGVkdWxlcikgewotICBzY2hlZHVsZV9wZXJpb2RpY190YXNrXyA9IHBlcmlvZGljX2V2ZW50X3NjaGVkdWxlcjsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpDYW5jZWxTY2hlZHVsZWRUYXNrKEFzeW5jVGFza0lkIHRhc2tfaWQpIHsKLSAgaWYgKHNjaGVkdWxlX3Rhc2tfICYmIGNhbmNlbF90YXNrXykgewotICAgIGNhbmNlbF90YXNrXyh0YXNrX2lkKTsKLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlJlZ2lzdGVyVGFza0NhbmNlbCgKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQXN5bmNUYXNrSWQpPiB0YXNrX2NhbmNlbCkgewotICBjYW5jZWxfdGFza18gPSB0YXNrX2NhbmNlbDsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpTdGFydFNpbXBsZVBhaXJpbmcoY29uc3QgQWRkcmVzcyYgYWRkcmVzcykgewotICAvLyBJTyBDYXBhYmlsaXR5IEV4Y2hhbmdlIChTZWUgdGhlIERpYWdyYW0gaW4gdGhlIFNwZWMpCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OklvQ2FwYWJpbGl0eVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcyk7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6SU9fQ0FQQUJJTElUWV9SRVFVRVNUKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotCi0gIC8vIEdldCBhIEtleSwgdGhlbiBhdXRoZW50aWNhdGUKLSAgLy8gUHVibGljS2V5RXhjaGFuZ2UoYWRkcmVzcyk7Ci0gIC8vIEF1dGhlbnRpY2F0ZVJlbW90ZVN0YWdlMShhZGRyZXNzKTsKLSAgLy8gQXV0aGVudGljYXRlUmVtb3RlU3RhZ2UyKGFkZHJlc3MpOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkF1dGhlbnRpY2F0ZVJlbW90ZVN0YWdlMShjb25zdCBBZGRyZXNzJiBwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcmluZ1R5cGUgcGFpcmluZ190eXBlKSB7Ci0gIEFTU0VSVChzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKSA9PSBwZWVyKTsKLSAgLy8gVE9ETzogUHVibGljIGtleSBleGNoYW5nZSBmaXJzdD8KLSAgc3dpdGNoIChwYWlyaW5nX3R5cGUpIHsKLSAgICBjYXNlIFBhaXJpbmdUeXBlOjpBVVRPX0NPTkZJUk1BVElPTjoKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVCkpIHsKLSAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgcGVlciwgMTIzNDU2KSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhaXJpbmdUeXBlOjpDT05GSVJNX1lfTjoKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6VVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVCkpIHsKLSAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgcGVlciwgMTIzNDU2KSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhaXJpbmdUeXBlOjpESVNQTEFZX1BJTjoKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX05PVElGSUNBVElPTikpIHsKLSAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlVzZXJQYXNza2V5Tm90aWZpY2F0aW9uQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgcGVlciwgMTIzNDU2KSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhaXJpbmdUeXBlOjpESVNQTEFZX0FORF9DT05GSVJNOgotICAgICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpVU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUKSkgewotICAgICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBwZWVyLCAxMjM0NTYpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFpcmluZ1R5cGU6OklOUFVUX1BJTjoKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6VVNFUl9QQVNTS0VZX1JFUVVFU1QpKSB7Ci0gICAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpVc2VyUGFzc2tleVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUocGVlcikpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWlyaW5nVHlwZTo6T1VUX09GX0JBTkQ6Ci0gICAgICBMT0dfSU5GTygiT29iIGRhdGEgcmVxdWVzdCBmb3IgJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlJFTU9URV9PT0JfREFUQV9SRVFVRVNUKSkgewotICAgICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6UmVtb3RlT29iRGF0YVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUocGVlcikpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWlyaW5nVHlwZTo6UEVFUl9IQVNfT1VUX09GX0JBTkQ6Ci0gICAgICBMT0dfSU5GTygiVHJ1c3RpbmcgdGhhdCAlcyBoYXMgT09CIGRhdGEiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdQJywgcGVlcik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBQYWlyaW5nVHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFpcmluZ190eXBlKSk7Ci0gIH0KLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpBdXRoZW50aWNhdGVSZW1vdGVTdGFnZTIoY29uc3QgQWRkcmVzcyYgcGVlcikgewotICB1aW50MTZfdCBoYW5kbGUgPSBzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkhhbmRsZSgpOwotICBBU1NFUlQoc2VjdXJpdHlfbWFuYWdlcl8uR2V0QXV0aGVudGljYXRpb25BZGRyZXNzKCkgPT0gcGVlcik7Ci0gIC8vIENoZWNrIGtleSBpbiBzZWN1cml0eV9tYW5hZ2VyXyA/Ci0gIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5Jc0luaXRpYXRvcigpKSB7Ci0gICAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6QXV0aGVudGljYXRpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLCBoYW5kbGUpOwotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6QVVUSEVOVElDQVRJT05fQ09NUExFVEUpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgfQotICB9Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpMaW5rS2V5UmVxdWVzdFJlcGx5KAotICAgIGNvbnN0IEFkZHJlc3MmIHBlZXIsIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiBrZXkpIHsKLSAgc2VjdXJpdHlfbWFuYWdlcl8uV3JpdGVLZXkocGVlciwga2V5KTsKLSAgc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25SZXF1ZXN0RmluaXNoZWQoKTsKLQotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLAotICAgICAgICAgICAgICAgW3RoaXMsIHBlZXJdKCkgeyBBdXRoZW50aWNhdGVSZW1vdGVTdGFnZTIocGVlcik7IH0pOwotCi0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoCi0gICAgY29uc3QgQWRkcmVzcyYgYWRkcmVzcykgewotICBzZWN1cml0eV9tYW5hZ2VyXy5EZWxldGVLZXkoYWRkcmVzcyk7Ci0gIC8vIFNpbXBsZSBwYWlyaW5nIHRvIGdldCBhIGtleQotICB1aW50MTZfdCBoYW5kbGUgPSBjb25uZWN0aW9uc18uR2V0SGFuZGxlT25seUFkZHJlc3MoYWRkcmVzcyk7Ci0gIGlmIChoYW5kbGUgPT0ga1Jlc2VydmVkSGFuZGxlKSB7Ci0gICAgTE9HX0lORk8oIkRldmljZSBub3QgY29ubmVjdGVkICVzIiwgYWRkcmVzcy5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIGlmIChwcm9wZXJ0aWVzXy5HZXRTZWN1cmVTaW1wbGVQYWlyaW5nU3VwcG9ydGVkKCkpIHsKLSAgICBpZiAoIXNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uSW5Qcm9ncmVzcygpKSB7Ci0gICAgICBzZWN1cml0eV9tYW5hZ2VyXy5BdXRoZW50aWNhdGlvblJlcXVlc3QoYWRkcmVzcywgaGFuZGxlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcyg1KSwKLSAgICAgICAgICAgICAgICAgW3RoaXMsIGFkZHJlc3NdKCkgeyBTdGFydFNpbXBsZVBhaXJpbmcoYWRkcmVzcyk7IH0pOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJQSU4gcGFpcmluZyAlcyIsIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBhZGRyZXNzXSgpIHsKLSAgICAgIHNlY3VyaXR5X21hbmFnZXJfLlNldFBpblJlcXVlc3RlZChhZGRyZXNzKTsKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6UElOX0NPREVfUkVRVUVTVCkpIHsKLSAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlBpbkNvZGVSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKGFkZHJlc3MpKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6SW9DYXBhYmlsaXR5UmVxdWVzdFJlcGx5KAotICAgIGNvbnN0IEFkZHJlc3MmIHBlZXIsIHVpbnQ4X3QgaW9fY2FwYWJpbGl0eSwgdWludDhfdCBvb2JfZGF0YV9wcmVzZW50X2ZsYWcsCi0gICAgdWludDhfdCBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpIHsKLSAgc2VjdXJpdHlfbWFuYWdlcl8uU2V0TG9jYWxJb0NhcGFiaWxpdHkoCi0gICAgICBwZWVyLCBpb19jYXBhYmlsaXR5LCBvb2JfZGF0YV9wcmVzZW50X2ZsYWcsIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyk7Ci0KLSAgUGFpcmluZ1R5cGUgcGFpcmluZ190eXBlID0gc2VjdXJpdHlfbWFuYWdlcl8uR2V0U2ltcGxlUGFpcmluZ1R5cGUoKTsKLQotICBpZiAocGFpcmluZ190eXBlICE9IFBhaXJpbmdUeXBlOjpJTlZBTElEKSB7Ci0gICAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcyg1KSwgW3RoaXMsIHBlZXIsIHBhaXJpbmdfdHlwZV0oKSB7Ci0gICAgICBBdXRoZW50aWNhdGVSZW1vdGVTdGFnZTEocGVlciwgcGFpcmluZ190eXBlKTsKLSAgICB9KTsKLSAgICBTZW5kTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpJb0NhcGFiaWxpdHlSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLCBpb19jYXBhYmlsaXR5LCBvb2JfZGF0YV9wcmVzZW50X2ZsYWcsCi0gICAgICAgIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cykpOwotICB9IGVsc2UgewotICAgIExPR19JTkZPKCJSZXF1ZXN0aW5nIHJlbW90ZSBjYXBhYmlsaXR5Iik7Ci0KLSAgICBTZW5kTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpJb0NhcGFiaWxpdHlSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCksIHBlZXIsIGlvX2NhcGFiaWxpdHksIG9vYl9kYXRhX3ByZXNlbnRfZmxhZywKLSAgICAgICAgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzKSk7Ci0gIH0KLQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6SW9DYXBhYmlsaXR5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoCi0gICAgY29uc3QgQWRkcmVzcyYgcGVlciwgRXJyb3JDb2RlIHJlYXNvbikgewotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uR2V0QXV0aGVudGljYXRpb25BZGRyZXNzKCkgIT0gcGVlcikgewotICAgIHJldHVybiBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU7Ci0gIH0KLQotICBzZWN1cml0eV9tYW5hZ2VyXy5JbnZhbGlkYXRlSW9DYXBhYmlsaXRpZXMoKTsKLQotICBhdXRvIHBhY2tldCA9IG1vZGVsOjpwYWNrZXRzOjpJb0NhcGFiaWxpdHlOZWdhdGl2ZVJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLCBzdGF0aWNfY2FzdDx1aW50OF90PihyZWFzb24pKTsKLSAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUocGFja2V0KSk7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpTYXZlS2V5QW5kQXV0aGVudGljYXRlKHVpbnQ4X3Qga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWRkcmVzcyYgcGVlcikgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBrZXlfdmVjeydrJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oa2V5X2lkXyA+PiA4dSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oa2V5X2lkXyl9OwotICBrZXlfaWRfICs9IDE7Ci0gIHNlY3VyaXR5X21hbmFnZXJfLldyaXRlS2V5KHBlZXIsIGtleV92ZWMpOwotCi0gIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0KLSAgaWYgKGtleV90eXBlID09ICdMJykgewotICAgIC8vIExlZ2FjeQotICAgIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBwZWVyLCBrZXlfdmVjXSgpIHsKLSAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TElOS19LRVlfTk9USUZJQ0FUSU9OKSkgewotICAgICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGlua0tleU5vdGlmaWNhdGlvbkJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIHBlZXIsIGtleV92ZWMsIGJsdWV0b290aDo6aGNpOjpLZXlUeXBlOjpBVVRIRU5USUNBVEVEX1AxOTIpKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfSBlbHNlIHsKLSAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlcl0oKSB7Ci0gICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFKSkgewotICAgICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLCBwZWVyKSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlciwga2V5X3ZlY10oKSB7Ci0gICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkxJTktfS0VZX05PVElGSUNBVElPTikpIHsKLSAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxpbmtLZXlOb3RpZmljYXRpb25CdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgICBwZWVyLCBrZXlfdmVjLCBibHVldG9vdGg6OmhjaTo6S2V5VHlwZTo6QVVUSEVOVElDQVRFRF9QMjU2KSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDE1KSwKLSAgICAgICAgICAgICAgIFt0aGlzLCBwZWVyXSgpIHsgQXV0aGVudGljYXRlUmVtb3RlU3RhZ2UyKHBlZXIpOyB9KTsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlBpbkNvZGVSZXF1ZXN0UmVwbHkoY29uc3QgQWRkcmVzcyYgcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBpbikgewotICBMT0dfSU5GTygiJXMiLCBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgYXV0byBjdXJyZW50X3BlZXIgPSBzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKTsKLSAgaWYgKHBlZXIgIT0gY3VycmVudF9wZWVyKSB7Ci0gICAgTE9HX0lORk8oIiVzOiAlcyAhPSAlcyIsIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKS5Ub1N0cmluZygpLmNfc3RyKCksCi0gICAgICAgICAgICAgcGVlci5Ub1N0cmluZygpLmNfc3RyKCksIGN1cnJlbnRfcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0gICAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcyg1KSwgW3RoaXMsIGN1cnJlbnRfcGVlcl0oKSB7Ci0gICAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFKSkgewotICAgICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgICAgRXJyb3JDb2RlOjpBVVRIRU5USUNBVElPTl9GQUlMVVJFLCBjdXJyZW50X3BlZXIpKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLSAgaWYgKCFzZWN1cml0eV9tYW5hZ2VyXy5HZXRQaW5SZXF1ZXN0ZWQocGVlcikpIHsKLSAgICBMT0dfSU5GTygiTm8gUGluIFJlcXVlc3RlZCBmb3IgJXMiLCBwZWVyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotICB9Ci0gIHNlY3VyaXR5X21hbmFnZXJfLlNldExvY2FsUGluKHBlZXIsIHBpbik7Ci0gIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5HZXRSZW1vdGVQaW5SZXNwb25zZVJlY2VpdmVkKHBlZXIpKSB7Ci0gICAgaWYgKHNlY3VyaXR5X21hbmFnZXJfLlBpbkNvbXBhcmUoKSkgewotICAgICAgTE9HX0lORk8oIkF1dGhlbnRpY2F0aW5nICVzIiwgcGVlci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgU2F2ZUtleUFuZEF1dGhlbnRpY2F0ZSgnTCcsIHBlZXIpOyAgLy8gTGVnYWN5Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0gICAgICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgcGVlcl0oKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6U0lNUExFX1BBSVJJTkdfQ09NUExFVEUpKSB7Ci0gICAgICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgRXJyb3JDb2RlOjpBVVRIRU5USUNBVElPTl9GQUlMVVJFLCBwZWVyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBTZW5kTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpQaW5SZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCksIHBlZXIsIHBpbikpOwotICB9Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpQaW5Db2RlUmVxdWVzdE5lZ2F0aXZlUmVwbHkoCi0gICAgY29uc3QgQWRkcmVzcyYgcGVlcikgewotICBhdXRvIGN1cnJlbnRfcGVlciA9IHNlY3VyaXR5X21hbmFnZXJfLkdldEF1dGhlbnRpY2F0aW9uQWRkcmVzcygpOwotICBzZWN1cml0eV9tYW5hZ2VyXy5BdXRoZW50aWNhdGlvblJlcXVlc3RGaW5pc2hlZCgpOwotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgY3VycmVudF9wZWVyXSgpIHsKLSAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFKSkgewotICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsIGN1cnJlbnRfcGVlcikpOwotICAgIH0KLSAgfSk7Ci0gIGlmIChwZWVyICE9IGN1cnJlbnRfcGVlcikgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotICBpZiAoIXNlY3VyaXR5X21hbmFnZXJfLkdldFBpblJlcXVlc3RlZChwZWVyKSkgewotICAgIExPR19JTkZPKCJObyBQaW4gUmVxdWVzdGVkIGZvciAlcyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci0gIH0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHkoCi0gICAgY29uc3QgQWRkcmVzcyYgcGVlcikgewotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uR2V0QXV0aGVudGljYXRpb25BZGRyZXNzKCkgIT0gcGVlcikgewotICAgIHJldHVybiBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU7Ci0gIH0KLSAgU2F2ZUtleUFuZEF1dGhlbnRpY2F0ZSgnVScsIHBlZXIpOwotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6VXNlckNvbmZpcm1hdGlvblJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgIGNvbnN0IEFkZHJlc3MmIHBlZXIpIHsKLSAgYXV0byBjdXJyZW50X3BlZXIgPSBzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKTsKLSAgc2VjdXJpdHlfbWFuYWdlcl8uQXV0aGVudGljYXRpb25SZXF1ZXN0RmluaXNoZWQoKTsKLSAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcyg1KSwgW3RoaXMsIGN1cnJlbnRfcGVlcl0oKSB7Ci0gICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpTSU1QTEVfUEFJUklOR19DT01QTEVURSkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpTaW1wbGVQYWlyaW5nQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgRXJyb3JDb2RlOjpBVVRIRU5USUNBVElPTl9GQUlMVVJFLCBjdXJyZW50X3BlZXIpKTsKLSAgICB9Ci0gIH0pOwotICBpZiAocGVlciAhPSBjdXJyZW50X3BlZXIpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlVzZXJQYXNza2V5UmVxdWVzdFJlcGx5KGNvbnN0IEFkZHJlc3MmIHBlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtZXJpY192YWx1ZSkgewotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uR2V0QXV0aGVudGljYXRpb25BZGRyZXNzKCkgIT0gcGVlcikgewotICAgIHJldHVybiBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU7Ci0gIH0KLSAgU2VuZExpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6UGFzc2tleUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwgcGVlciwgbnVtZXJpY192YWx1ZSkpOwotICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdQJywgcGVlcik7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlVzZXJQYXNza2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoCi0gICAgY29uc3QgQWRkcmVzcyYgcGVlcikgewotICBhdXRvIGN1cnJlbnRfcGVlciA9IHNlY3VyaXR5X21hbmFnZXJfLkdldEF1dGhlbnRpY2F0aW9uQWRkcmVzcygpOwotICBzZWN1cml0eV9tYW5hZ2VyXy5BdXRoZW50aWNhdGlvblJlcXVlc3RGaW5pc2hlZCgpOwotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgY3VycmVudF9wZWVyXSgpIHsKLSAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OlNJTVBMRV9QQUlSSU5HX0NPTVBMRVRFKSkgewotICAgICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlNpbXBsZVBhaXJpbmdDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsIGN1cnJlbnRfcGVlcikpOwotICAgIH0KLSAgfSk7Ci0gIGlmIChwZWVyICE9IGN1cnJlbnRfcGVlcikgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6UmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseSgKLSAgICBjb25zdCBBZGRyZXNzJiBwZWVyLCBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgYywKLSAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgcikgewotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uR2V0QXV0aGVudGljYXRpb25BZGRyZXNzKCkgIT0gcGVlcikgewotICAgIHJldHVybiBFcnJvckNvZGU6OkFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU7Ci0gIH0KLSAgTE9HX0lORk8oIlRPRE86RG8gc29tZXRoaW5nIHdpdGggdGhlIE9PQiBkYXRhIGM9JWQgcj0lZCIsIGNbMF0sIHJbMF0pOwotICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdvJywgcGVlcik7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlJlbW90ZU9vYkRhdGFSZXF1ZXN0TmVnYXRpdmVSZXBseSgKLSAgICBjb25zdCBBZGRyZXNzJiBwZWVyKSB7Ci0gIGF1dG8gY3VycmVudF9wZWVyID0gc2VjdXJpdHlfbWFuYWdlcl8uR2V0QXV0aGVudGljYXRpb25BZGRyZXNzKCk7Ci0gIHNlY3VyaXR5X21hbmFnZXJfLkF1dGhlbnRpY2F0aW9uUmVxdWVzdEZpbmlzaGVkKCk7Ci0gIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCBjdXJyZW50X3BlZXJdKCkgewotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6U0lNUExFX1BBSVJJTkdfQ09NUExFVEUpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6U2ltcGxlUGFpcmluZ0NvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6QVVUSEVOVElDQVRJT05fRkFJTFVSRSwgY3VycmVudF9wZWVyKSk7Ci0gICAgfQotICB9KTsKLSAgaWYgKHBlZXIgIT0gY3VycmVudF9wZWVyKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpSZW1vdGVPb2JFeHRlbmRlZERhdGFSZXF1ZXN0UmVwbHkoCi0gICAgY29uc3QgQWRkcmVzcyYgcGVlciwgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGMxOTIsCi0gICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIHIxOTIsIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiBjMjU2LAotICAgIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiByMjU2KSB7Ci0gIGlmIChzZWN1cml0eV9tYW5hZ2VyXy5HZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKSAhPSBwZWVyKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6QVVUSEVOVElDQVRJT05fRkFJTFVSRTsKLSAgfQotICBMT0dfSU5GTygKLSAgICAgICJUT0RPOkRvIHNvbWV0aGluZyB3aXRoIHRoZSBPT0IgZGF0YSBjMTkyPSVkIHIxOTI9JWQgYzI1Nj0lZCByMjU2PSVkIiwKLSAgICAgIGMxOTJbMF0sIHIxOTJbMF0sIGMyNTZbMF0sIHIyNTZbMF0pOwotICBTYXZlS2V5QW5kQXV0aGVudGljYXRlKCdPJywgcGVlcik7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbigKLSAgICBjb25zdCBBZGRyZXNzJiBwZWVyLAotICAgIGJsdWV0b290aDo6aGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblR5cGUgbm90aWZpY2F0aW9uX3R5cGUpIHsKLSAgaWYgKG5vdGlmaWNhdGlvbl90eXBlID4KLSAgICAgIGJsdWV0b290aDo6aGNpOjpLZXlwcmVzc05vdGlmaWNhdGlvblR5cGU6OkVOVFJZX0NPTVBMRVRFRCkgewotICAgIHJldHVybiBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzsKLSAgfQotCi0gIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OktleXByZXNzTm90aWZpY2F0aW9uQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLAotICAgICAgc3RhdGljX2Nhc3Q8bW9kZWw6OnBhY2tldHM6OlBhc3NrZXlOb3RpZmljYXRpb25UeXBlPihub3RpZmljYXRpb25fdHlwZSkpKTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpIYW5kbGVBdXRoZW50aWNhdGlvblJlcXVlc3QoY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhhbmRsZSkgewotICBzZWN1cml0eV9tYW5hZ2VyXy5BdXRoZW50aWNhdGlvblJlcXVlc3QoYWRkcmVzcywgaGFuZGxlLCB0cnVlKTsKLSAgYXV0byBwYWNrZXQgPSBibHVldG9vdGg6OmhjaTo6TGlua0tleVJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoYWRkcmVzcyk7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TElOS19LRVlfUkVRVUVTVCkpIHsKLSAgICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci0gIH0KLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKHVpbnQxNl90IGhhbmRsZSkgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIExPR19JTkZPKCJBdXRoZW50aWNhdGlvbiBSZXF1ZXN0ZWQgZm9yIHVua25vd24gaGFuZGxlICUwNHgiLCBoYW5kbGUpOwotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIEFkZHJlc3NXaXRoVHlwZSByZW1vdGUgPSBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpOwotCi0gIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoNSksIFt0aGlzLCByZW1vdGUsIGhhbmRsZV0oKSB7Ci0gICAgSGFuZGxlQXV0aGVudGljYXRpb25SZXF1ZXN0KHJlbW90ZS5HZXRBZGRyZXNzKCksIGhhbmRsZSk7Ci0gIH0pOwotCi0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SGFuZGxlU2V0Q29ubmVjdGlvbkVuY3J5cHRpb24oCi0gICAgY29uc3QgQWRkcmVzcyYgcGVlciwgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGVuY3J5cHRpb25fZW5hYmxlKSB7Ci0gIC8vIFRPRE86IEJsb2NrIEFDTCB0cmFmZmljIG9yIGF0IGxlYXN0IGd1YXJkIGFnYWluc3QgaXQKLQotICBpZiAoY29ubmVjdGlvbnNfLklzRW5jcnlwdGVkKGhhbmRsZSkgJiYgZW5jcnlwdGlvbl9lbmFibGUpIHsKLSAgICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkVuY3J5cHRpb25FbmFibGVkPihlbmNyeXB0aW9uX2VuYWJsZSkpOwotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6RU5DUllQVElPTl9DSEFOR0UpKSB7Ci0gICAgICBzZW5kX2V2ZW50XyhzdGQ6Om1vdmUocGFja2V0KSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQxNl90IGNvdW50ID0gc2VjdXJpdHlfbWFuYWdlcl8uUmVhZEtleShwZWVyKTsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICBMT0dfRVJST1IoIk5PIEtFWSBIRVJFIGZvciAlcyIsIHBlZXIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBhcnJheSA9IHNlY3VyaXR5X21hbmFnZXJfLkdldEtleShwZWVyKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5X3ZlY3thcnJheS5iZWdpbigpLCBhcnJheS5lbmQoKX07Ci0gIGF1dG8gcGFja2V0ID0gbW9kZWw6OnBhY2tldHM6OkVuY3J5cHRDb25uZWN0aW9uQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBwZWVyLCBrZXlfdmVjKTsKLSAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUocGFja2V0KSk7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpTZXRDb25uZWN0aW9uRW5jcnlwdGlvbigKLSAgICB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZW5jcnlwdGlvbl9lbmFibGUpIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICBMT0dfSU5GTygiU2V0IENvbm5lY3Rpb24gRW5jcnlwdGlvbiBmb3IgdW5rbm93biBoYW5kbGUgJTA0eCIsIGhhbmRsZSk7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgaWYgKGNvbm5lY3Rpb25zXy5Jc0VuY3J5cHRlZChoYW5kbGUpICYmICFlbmNyeXB0aW9uX2VuYWJsZSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OkVOQ1JZUFRJT05fTU9ERV9OT1RfQUNDRVBUQUJMRTsKLSAgfQotICBBZGRyZXNzV2l0aFR5cGUgcmVtb3RlID0gY29ubmVjdGlvbnNfLkdldEFkZHJlc3MoaGFuZGxlKTsKLQotICBpZiAoc2VjdXJpdHlfbWFuYWdlcl8uUmVhZEtleShyZW1vdGUuR2V0QWRkcmVzcygpKSA9PSAwKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6UElOX09SX0tFWV9NSVNTSU5HOwotICB9Ci0KLSAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcyg1KSwgW3RoaXMsIHJlbW90ZSwgaGFuZGxlLCBlbmNyeXB0aW9uX2VuYWJsZV0oKSB7Ci0gICAgSGFuZGxlU2V0Q29ubmVjdGlvbkVuY3J5cHRpb24ocmVtb3RlLkdldEFkZHJlc3MoKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25fZW5hYmxlKTsKLSAgfSk7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpBY2NlcHRDb25uZWN0aW9uUmVxdWVzdChjb25zdCBBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJ5X3JvbGVfc3dpdGNoKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc1BlbmRpbmdDb25uZWN0aW9uKGFkZHIpKSB7Ci0gICAgTE9HX0lORk8oIk5vIHBlbmRpbmcgY29ubmVjdGlvbiBmb3IgJXMiLCBhZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgTE9HX0lORk8oIkFjY2VwdCBpbiAyMDBtcyIpOwotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDIwMCksIFt0aGlzLCBhZGRyLCB0cnlfcm9sZV9zd2l0Y2hdKCkgewotICAgIExPR19JTkZPKCJBY2NlcHRlZCIpOwotICAgIE1ha2VQZXJpcGhlcmFsQ29ubmVjdGlvbihhZGRyLCB0cnlfcm9sZV9zd2l0Y2gpOwotICB9KTsKLQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6Ok1ha2VQZXJpcGhlcmFsQ29ubmVjdGlvbihjb25zdCBBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0cnlfcm9sZV9zd2l0Y2gpIHsKLSAgTE9HX0lORk8oIlNlbmRpbmcgcGFnZSByZXNwb25zZSB0byAlcyIsIGFkZHIuVG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgYXV0byB0b19zZW5kID0gbW9kZWw6OnBhY2tldHM6OlBhZ2VSZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwgYWRkciwgdHJ5X3JvbGVfc3dpdGNoKTsKLSAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUodG9fc2VuZCkpOwotCi0gIHVpbnQxNl90IGhhbmRsZSA9Ci0gICAgICBjb25uZWN0aW9uc18uQ3JlYXRlQ29ubmVjdGlvbihhZGRyLCBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCkpOwotICBpZiAoaGFuZGxlID09IGtSZXNlcnZlZEhhbmRsZSkgewotICAgIExPR19JTkZPKCJDcmVhdGVDb25uZWN0aW9uIGZhaWxlZCIpOwotICAgIHJldHVybjsKLSAgfQotICBMT0dfSU5GTygiQ3JlYXRlQ29ubmVjdGlvbiByZXR1cm5lZCBoYW5kbGUgMHgleCIsIGhhbmRsZSk7Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlLCBhZGRyLCBibHVldG9vdGg6OmhjaTo6TGlua1R5cGU6OkFDTCwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpFbmFibGU6OkRJU0FCTEVEKTsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpDT05ORUNUSU9OX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6UmVqZWN0Q29ubmVjdGlvblJlcXVlc3QoY29uc3QgQWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlYXNvbikgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNQZW5kaW5nQ29ubmVjdGlvbihhZGRyKSkgewotICAgIExPR19JTkZPKCJObyBwZW5kaW5nIGNvbm5lY3Rpb24gZm9yICVzIiwgYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoMjAwKSwgW3RoaXMsIGFkZHIsIHJlYXNvbl0oKSB7Ci0gICAgUmVqZWN0UGVyaXBoZXJhbENvbm5lY3Rpb24oYWRkciwgcmVhc29uKTsKLSAgfSk7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpSZWplY3RQZXJpcGhlcmFsQ29ubmVjdGlvbihjb25zdCBBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlYXNvbikgewotICBhdXRvIHRvX3NlbmQgPSBtb2RlbDo6cGFja2V0czo6UGFnZVJlamVjdEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwgYWRkciwgcmVhc29uKTsKLSAgTE9HX0lORk8oIlNlbmRpbmcgcGFnZSByZWplY3QgdG8gJXMgKHJlYXNvbiAweCUwMmhoeCkiLAotICAgICAgICAgICBhZGRyLlRvU3RyaW5nKCkuY19zdHIoKSwgcmVhc29uKTsKLSAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUodG9fc2VuZCkpOwotCi0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNvbm5lY3Rpb25Db21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIHN0YXRpY19jYXN0PEVycm9yQ29kZT4ocmVhc29uKSwgMHhlZmYsIGFkZHIsCi0gICAgICBibHVldG9vdGg6OmhjaTo6TGlua1R5cGU6OkFDTCwgYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZTo6RElTQUJMRUQpOwotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkNPTk5FQ1RJT05fQ09NUExFVEUpKSB7Ci0gICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICB9Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpDcmVhdGVDb25uZWN0aW9uKGNvbnN0IEFkZHJlc3MmIGFkZHIsIHVpbnQxNl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCwgdWludDE2X3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsbG93X3JvbGVfc3dpdGNoKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkNyZWF0ZVBlbmRpbmdDb25uZWN0aW9uKAotICAgICAgICAgIGFkZHIsIHByb3BlcnRpZXNfLkdldEF1dGhlbnRpY2F0aW9uRW5hYmxlKCkgPT0gMSkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpDT05UUk9MTEVSX0JVU1k7Ci0gIH0KLSAgYXV0byBwYWdlID0gbW9kZWw6OnBhY2tldHM6OlBhZ2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCksIGFkZHIsIHByb3BlcnRpZXNfLkdldENsYXNzT2ZEZXZpY2UoKSwKLSAgICAgIGFsbG93X3JvbGVfc3dpdGNoKTsKLSAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUocGFnZSkpOwotCi0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpDcmVhdGVDb25uZWN0aW9uQ2FuY2VsKGNvbnN0IEFkZHJlc3MmIGFkZHIpIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uQ2FuY2VsUGVuZGluZ0Nvbm5lY3Rpb24oYWRkcikpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkRpc2Nvbm5lY3QodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIGNvbnN0IEFkZHJlc3NXaXRoVHlwZSByZW1vdGUgPSBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpOwotICBpZiAoY29ubmVjdGlvbnNfLkdldFBoeVR5cGUoaGFuZGxlKSA9PSBQaHk6OlR5cGU6OkJSX0VEUikgewotICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQobW9kZWw6OnBhY2tldHM6OkRpc2Nvbm5lY3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIHByb3BlcnRpZXNfLkdldEFkZHJlc3MoKSwgcmVtb3RlLkdldEFkZHJlc3MoKSwgcmVhc29uKSk7Ci0gIH0gZWxzZSB7Ci0gICAgU2VuZExlTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpEaXNjb25uZWN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBjb25uZWN0aW9uc18uR2V0T3duQWRkcmVzcyhoYW5kbGUpLkdldEFkZHJlc3MoKSwgcmVtb3RlLkdldEFkZHJlc3MoKSwKLSAgICAgICAgcmVhc29uKSk7Ci0gIH0KLSAgQVNTRVJUX0xPRyhjb25uZWN0aW9uc18uRGlzY29ubmVjdChoYW5kbGUpLCAiRGlzY29ubmVjdGluZyAlaHgiLCBoYW5kbGUpOwotCi0gIFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHMoMjApLCBbdGhpcywgaGFuZGxlXSgpIHsKLSAgICBEaXNjb25uZWN0Q2xlYW51cCgKLSAgICAgICAgaGFuZGxlLAotICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihFcnJvckNvZGU6OkNPTk5FQ1RJT05fVEVSTUlOQVRFRF9CWV9MT0NBTF9IT1NUKSk7Ci0gIH0pOwotCi0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6RGlzY29ubmVjdENsZWFudXAodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJlYXNvbikgewotICAvLyBUT0RPOiBDbGVhbiB1cCBvdGhlciBjb25uZWN0aW9uIHN0YXRlLgotICBhdXRvIHBhY2tldCA9IGJsdWV0b290aDo6aGNpOjpEaXNjb25uZWN0aW9uQ29tcGxldGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBFcnJvckNvZGU6OlNVQ0NFU1MsIGhhbmRsZSwgc3RhdGljX2Nhc3Q8RXJyb3JDb2RlPihyZWFzb24pKTsKLSAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpESVNDT05ORUNUSU9OX0NPTVBMRVRFKSkgewotICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgfQotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6Q2hhbmdlQ29ubmVjdGlvblBhY2tldFR5cGUodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHR5cGVzKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0gIGF1dG8gcGFja2V0ID0gYmx1ZXRvb3RoOjpoY2k6OkNvbm5lY3Rpb25QYWNrZXRUeXBlQ2hhbmdlZEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlLCB0eXBlcyk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6Q29ubmVjdGlvblBhY2tldFR5cGVDaGFuZ2VkQnVpbGRlcj4KLSAgICAgIHNoYXJlZF9wYWNrZXQgPSBzdGQ6Om1vdmUocGFja2V0KTsKLSAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcygyMCksIFt0aGlzLCBzaGFyZWRfcGFja2V0XSgpIHsKLSAgICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkNPTk5FQ1RJT05fUEFDS0VUX1RZUEVfQ0hBTkdFRCkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKHN0ZDo6bW92ZShzaGFyZWRfcGFja2V0KSk7Ci0gICAgfQotICB9KTsKLQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6Q2hhbmdlQ29ubmVjdGlvbkxpbmtLZXkodWludDE2X3QgaGFuZGxlKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgLy8gVE9ETzogaW1wbGVtZW50IHJlYWwgbG9naWMKLSAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6Q2VudHJhbExpbmtLZXkodWludDhfdCAvKiBrZXlfZmxhZyAqLykgewotICAvLyBUT0RPOiBpbXBsZW1lbnQgcmVhbCBsb2dpYwotICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpIb2xkTW9kZSh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgaG9sZF9tb2RlX21heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBob2xkX21vZGVfbWluX2ludGVydmFsKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgaWYgKGhvbGRfbW9kZV9tYXhfaW50ZXJ2YWwgPCBob2xkX21vZGVfbWluX2ludGVydmFsKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6SU5WQUxJRF9IQ0lfQ09NTUFORF9QQVJBTUVURVJTOwotICB9Ci0KLSAgLy8gVE9ETzogaW1wbGVtZW50IHJlYWwgbG9naWMKLSAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6U25pZmZNb2RlKHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc25pZmZfbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzbmlmZl9taW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNuaWZmX2F0dGVtcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNuaWZmX3RpbWVvdXQpIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLQotICBpZiAoc25pZmZfbWF4X2ludGVydmFsIDwgc25pZmZfbWluX2ludGVydmFsIHx8IHNuaWZmX2F0dGVtcHQgPCAweDAwMDEgfHwKLSAgICAgIHNuaWZmX2F0dGVtcHQgPiAweDdGRkYgfHwgc25pZmZfdGltZW91dCA+IDB4N0ZGRikgewotICAgIHJldHVybiBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzsKLSAgfQotCi0gIC8vIFRPRE86IGltcGxlbWVudCByZWFsIGxvZ2ljCi0gIHJldHVybiBFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkV4aXRTbmlmZk1vZGUodWludDE2X3QgaGFuZGxlKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgLy8gVE9ETzogaW1wbGVtZW50IHJlYWwgbG9naWMKLSAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6UW9zU2V0dXAodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHNlcnZpY2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKiB0b2tlbl9yYXRlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qIHBlYWtfYmFuZHdpZHRoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qIGxhdGVuY3kgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgLyogZGVsYXlfdmFyaWF0aW9uICovKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc0hhbmRsZShoYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgaWYgKHNlcnZpY2VfdHlwZSA+IDB4MDIpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpJTlZBTElEX0hDSV9DT01NQU5EX1BBUkFNRVRFUlM7Ci0gIH0KLQotICAvLyBUT0RPOiBpbXBsZW1lbnQgcmVhbCBsb2dpYwotICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpSb2xlRGlzY292ZXJ5KHVpbnQxNl90IGhhbmRsZSkgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIC8vIFRPRE86IEltcGxlbWVudCByZWFsIGxvZ2ljCi0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpTd2l0Y2hSb2xlKEFkZHJlc3MgLyogYmRfYWRkciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgLyogcm9sZSAqLykgewotICAvLyBUT0RPOiBpbXBsZW1lbnQgcmVhbCBsb2dpYwotICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpXcml0ZUxpbmtQb2xpY3lTZXR0aW5ncyh1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QpIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OldyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncygKLSAgICB1aW50MTZfdCBzZXR0aW5ncykgewotICBpZiAoc2V0dGluZ3MgPiA3IC8qIFNuaWZmICsgSG9sZCArIFJvbGUgc3dpdGNoICovKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6SU5WQUxJRF9IQ0lfQ09NTUFORF9QQVJBTUVURVJTOwotICB9Ci0gIGRlZmF1bHRfbGlua19wb2xpY3lfc2V0dGluZ3NfID0gc2V0dGluZ3M7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLXVpbnQxNl90IExpbmtMYXllckNvbnRyb2xsZXI6OlJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKCkgewotICByZXR1cm4gZGVmYXVsdF9saW5rX3BvbGljeV9zZXR0aW5nc187Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6UmVhZExvY2FsT29iRGF0YSgpIHsKLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gY19hcnJheSgKLSAgICAgIHsnYycsICcgJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICcgJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pigob29iX2lkXyAlIDB4MTAwMDApID4+IDh1KSwKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihvb2JfaWRfICUgMHgxMDApfSk7Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gcl9hcnJheSgKLSAgICAgIHsncicsICcgJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICcgJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pigob29iX2lkXyAlIDB4MTAwMDApID4+IDh1KSwKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihvb2JfaWRfICUgMHgxMDApfSk7Ci0KLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlJlYWRMb2NhbE9vYkRhdGFDb21wbGV0ZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgIDEsIEVycm9yQ29kZTo6U1VDQ0VTUywgY19hcnJheSwgcl9hcnJheSkpOwotICBvb2JfaWRfICs9IDE7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6UmVhZExvY2FsT29iRXh0ZW5kZWREYXRhKCkgewotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBjXzE5Ml9hcnJheSgKLSAgICAgIHsnYycsICcgJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICcgJywgJzEnLCAnOScsICcyJywgJzAnLCAnMCcsICcwJywKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pigob29iX2lkXyAlIDB4MTAwMDApID4+IDh1KSwKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihvb2JfaWRfICUgMHgxMDApfSk7Ci0KLSAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gcl8xOTJfYXJyYXkoCi0gICAgICB7J3InLCAnICcsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnICcsICcxJywgJzknLCAnMicsICcwJywgJzAnLCAnMCcsCi0gICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKG9vYl9pZF8gJSAweDEwMDAwKSA+PiA4dSksCi0gICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4ob29iX2lkXyAlIDB4MTAwKX0pOwotCi0gIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGNfMjU2X2FycmF5KAotICAgICAgeydjJywgJyAnLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJyAnLCAnMicsICc1JywgJzYnLCAnMCcsICcwJywgJzAnLAotICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChvb2JfaWRfICUgMHgxMDAwMCkgPj4gOHUpLAotICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG9vYl9pZF8gJSAweDEwMCl9KTsKLQotICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiByXzI1Nl9hcnJheSgKLSAgICAgIHsncicsICcgJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICcgJywgJzInLCAnNScsICc2JywgJzAnLCAnMCcsICcwJywKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pigob29iX2lkXyAlIDB4MTAwMDApID4+IDh1KSwKLSAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pihvb2JfaWRfICUgMHgxMDApfSk7Ci0KLSAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OlJlYWRMb2NhbE9vYkV4dGVuZGVkRGF0YUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgMSwgRXJyb3JDb2RlOjpTVUNDRVNTLCBjXzE5Ml9hcnJheSwgcl8xOTJfYXJyYXksIGNfMjU2X2FycmF5LAotICAgICAgcl8yNTZfYXJyYXkpKTsKLSAgb29iX2lkXyArPSAxOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6Rmxvd1NwZWNpZmljYXRpb24oCi0gICAgdWludDE2X3QgaGFuZGxlLCB1aW50OF90IGZsb3dfZGlyZWN0aW9uLCB1aW50OF90IHNlcnZpY2VfdHlwZSwKLSAgICB1aW50MzJfdCAvKiB0b2tlbl9yYXRlICovLCB1aW50MzJfdCAvKiB0b2tlbl9idWNrZXRfc2l6ZSAqLywKLSAgICB1aW50MzJfdCAvKiBwZWFrX2JhbmR3aWR0aCAqLywgdWludDMyX3QgLyogYWNjZXNzX2xhdGVuY3kgKi8pIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLQotICBpZiAoZmxvd19kaXJlY3Rpb24gPiAweDAxIHx8IHNlcnZpY2VfdHlwZSA+IDB4MDIpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpJTlZBTElEX0hDSV9DT01NQU5EX1BBUkFNRVRFUlM7Ci0gIH0KLQotICAvLyBUT0RPOiBpbXBsZW1lbnQgcmVhbCBsb2dpYwotICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQodWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCkgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6U2V0TGVFeHRlbmRlZEFkZHJlc3ModWludDhfdCBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBhZGRyZXNzKSB7Ci0gIGFkdmVydGlzZXJzX1tzZXRdLlNldEFkZHJlc3MoYWRkcmVzcyk7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpTZXRMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdEYXRhKAotICAgIHVpbnQ4X3Qgc2V0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSkgewotICBhZHZlcnRpc2Vyc19bc2V0XS5TZXREYXRhKGRhdGEpOwotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6U2V0TGVFeHRlbmRlZFNjYW5SZXNwb25zZURhdGEoCi0gICAgdWludDhfdCBzZXQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gIGFkdmVydGlzZXJzX1tzZXRdLlNldFNjYW5SZXNwb25zZShkYXRhKTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlNldExlRXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnMoCi0gICAgdWludDhfdCBzZXQsIHVpbnQxNl90IGludGVydmFsX21pbiwgdWludDE2X3QgaW50ZXJ2YWxfbWF4LAotICAgIGJsdWV0b290aDo6aGNpOjpMZWdhY3lBZHZlcnRpc2luZ1Byb3BlcnRpZXMgdHlwZSwKLSAgICBibHVldG9vdGg6OmhjaTo6T3duQWRkcmVzc1R5cGUgb3duX2FkZHJlc3NfdHlwZSwKLSAgICBibHVldG9vdGg6OmhjaTo6UGVlckFkZHJlc3NUeXBlIHBlZXJfYWRkcmVzc190eXBlLCBBZGRyZXNzIHBlZXIsCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nRmlsdGVyUG9saWN5IGZpbHRlcl9wb2xpY3kpIHsKLSAgbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlIGFkX3R5cGU7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkxlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllczo6QURWX0lORDoKLSAgICAgIGFkX3R5cGUgPSBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGU6OkFEVl9JTkQ7Ci0gICAgICBwZWVyID0gQWRkcmVzczo6a0VtcHR5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6TGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzOjpBRFZfTk9OQ09OTl9JTkQ6Ci0gICAgICBhZF90eXBlID0gbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfTk9OQ09OTl9JTkQ7Ci0gICAgICBwZWVyID0gQWRkcmVzczo6a0VtcHR5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6TGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzOjpBRFZfU0NBTl9JTkQ6Ci0gICAgICBhZF90eXBlID0gbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfU0NBTl9JTkQ7Ci0gICAgICBwZWVyID0gQWRkcmVzczo6a0VtcHR5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6TGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzOjpBRFZfRElSRUNUX0lORF9ISUdIOgotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkxlZ2FjeUFkdmVydGlzaW5nUHJvcGVydGllczo6QURWX0RJUkVDVF9JTkRfTE9XOgotICAgICAgYWRfdHlwZSA9IG1vZGVsOjpwYWNrZXRzOjpBZHZlcnRpc2VtZW50VHlwZTo6QURWX0RJUkVDVF9JTkQ7Ci0gICAgICBicmVhazsKLSAgfQotICBhdXRvIGludGVydmFsX21zID0KLSAgICAgIHN0YXRpY19jYXN0PGludD4oKGludGVydmFsX21heCArIGludGVydmFsX21pbikgKiAwLjYyNSAvIDIpOwotCi0gIEFkZHJlc3NXaXRoVHlwZSBwZWVyX2FkZHJlc3M7Ci0gIHN3aXRjaCAocGVlcl9hZGRyZXNzX3R5cGUpIHsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpQZWVyQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUzoKLSAgICAgIHBlZXJfYWRkcmVzcyA9IEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICBwZWVyLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpQZWVyQWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfT1JfSURFTlRJVFlfQUREUkVTUzoKLSAgICAgIHBlZXJfYWRkcmVzcyA9IEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgICAgICBwZWVyLCBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUyk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZSBvd25fYWRkcmVzc19hZGRyZXNzX3R5cGU7Ci0gIHN3aXRjaCAob3duX2FkZHJlc3NfdHlwZSkgewotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlOjpSQU5ET01fREVWSUNFX0FERFJFU1M6Ci0gICAgICBvd25fYWRkcmVzc19hZGRyZXNzX3R5cGUgPQotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0RFVklDRV9BRERSRVNTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6T3duQWRkcmVzc1R5cGU6OlBVQkxJQ19ERVZJQ0VfQUREUkVTUzoKLSAgICAgIG93bl9hZGRyZXNzX2FkZHJlc3NfdHlwZSA9Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfREVWSUNFX0FERFJFU1M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpPd25BZGRyZXNzVHlwZTo6UkVTT0xWQUJMRV9PUl9QVUJMSUNfQUREUkVTUzoKLSAgICAgIG93bl9hZGRyZXNzX2FkZHJlc3NfdHlwZSA9Ci0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlOjpQVUJMSUNfSURFTlRJVFlfQUREUkVTUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlOjpSRVNPTFZBQkxFX09SX1JBTkRPTV9BRERSRVNTOgotICAgICAgb3duX2FkZHJlc3NfYWRkcmVzc190eXBlID0KLSAgICAgICAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlJBTkRPTV9JREVOVElUWV9BRERSRVNTOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeSBzY2FubmluZ19maWx0ZXJfcG9saWN5OwotICBzd2l0Y2ggKGZpbHRlcl9wb2xpY3kpIHsKLSAgICBjYXNlIGJsdWV0b290aDo6aGNpOjpBZHZlcnRpc2luZ0ZpbHRlclBvbGljeTo6QUxMX0RFVklDRVM6Ci0gICAgICBzY2FubmluZ19maWx0ZXJfcG9saWN5ID0KLSAgICAgICAgICBibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeTo6QUNDRVBUX0FMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nRmlsdGVyUG9saWN5OjpMSVNURURfU0NBTjoKLSAgICAgIHNjYW5uaW5nX2ZpbHRlcl9wb2xpY3kgPQotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpMZVNjYW5uaW5nRmlsdGVyUG9saWN5OjpDT05ORUNUX0xJU1RfT05MWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmx1ZXRvb3RoOjpoY2k6OkFkdmVydGlzaW5nRmlsdGVyUG9saWN5OjpMSVNURURfQ09OTkVDVDoKLSAgICAgIHNjYW5uaW5nX2ZpbHRlcl9wb2xpY3kgPQotICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpMZVNjYW5uaW5nRmlsdGVyUG9saWN5OjpDSEVDS19JTklUSUFUT1JTX0lERU5USVRZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBibHVldG9vdGg6OmhjaTo6QWR2ZXJ0aXNpbmdGaWx0ZXJQb2xpY3k6OkxJU1RFRF9TQ0FOX0FORF9DT05ORUNUOgotICAgICAgc2Nhbm5pbmdfZmlsdGVyX3BvbGljeSA9IGJsdWV0b290aDo6aGNpOjpMZVNjYW5uaW5nRmlsdGVyUG9saWN5OjoKLSAgICAgICAgICBDT05ORUNUX0xJU1RfQU5EX0lOSVRJQVRPUlNfSURFTlRJVFk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGFkdmVydGlzZXJzX1tzZXRdLkluaXRpYWxpemVFeHRlbmRlZChvd25fYWRkcmVzc19hZGRyZXNzX3R5cGUsIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uaW5nX2ZpbHRlcl9wb2xpY3ksIGFkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGludGVydmFsX21zKSk7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVtb3ZlQWR2ZXJ0aXNpbmdTZXQodWludDhfdCBzZXQpIHsKLSAgaWYgKHNldCA+PSBhZHZlcnRpc2Vyc18uc2l6ZSgpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6SU5WQUxJRF9IQ0lfQ09NTUFORF9QQVJBTUVURVJTOwotICB9Ci0gIGFkdmVydGlzZXJzX1tzZXRdLkRpc2FibGUoKTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlQ2xlYXJBZHZlcnRpc2luZ1NldHMoKSB7Ci0gIGZvciAoYXV0byYgYWR2ZXJ0aXNlciA6IGFkdmVydGlzZXJzXykgewotICAgIGlmIChhZHZlcnRpc2VyLklzRW5hYmxlZCgpKSB7Ci0gICAgICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci0gICAgfQotICB9Ci0gIGZvciAoYXV0byYgYWR2ZXJ0aXNlciA6IGFkdmVydGlzZXJzXykgewotICAgIGFkdmVydGlzZXIuQ2xlYXIoKTsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkxlQ29ubmVjdGlvblVwZGF0ZUNvbXBsZXRlKAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaW50ZXJ2YWxfbWluLCB1aW50MTZfdCBpbnRlcnZhbF9tYXgsCi0gICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCkgewotICBFcnJvckNvZGUgc3RhdHVzID0gRXJyb3JDb2RlOjpTVUNDRVNTOwotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHN0YXR1cyA9IEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgaWYgKGludGVydmFsX21pbiA8IDYgfHwgaW50ZXJ2YWxfbWF4ID4gMHhDODAgfHwgaW50ZXJ2YWxfbWluID4gaW50ZXJ2YWxfbWF4IHx8Ci0gICAgICBpbnRlcnZhbF9tYXggPCBpbnRlcnZhbF9taW4gfHwgbGF0ZW5jeSA+IDB4MUYzIHx8Ci0gICAgICBzdXBlcnZpc2lvbl90aW1lb3V0IDwgMHhBIHx8IHN1cGVydmlzaW9uX3RpbWVvdXQgPiAweEM4MCB8fAotICAgICAgLy8gVGhlIFN1cGVydmlzaW9uX1RpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICgqMTApIHNoYWxsIGJlIGxhcmdlciB0aGFuICgxICsKLSAgICAgIC8vIENvbm5lY3Rpb25fTGF0ZW5jeSkgKiBDb25uZWN0aW9uX0ludGVydmFsX01heCAoKiA1LzQpICogMgotICAgICAgc3VwZXJ2aXNpb25fdGltZW91dCA8PSAoKCgoMSArIGxhdGVuY3kpICogaW50ZXJ2YWxfbWF4ICogMTApIC8gNCkgLyAxMCkpIHsKLSAgICBzdGF0dXMgPSBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzsKLSAgfQotICB1aW50MTZfdCBpbnRlcnZhbCA9IChpbnRlcnZhbF9taW4gKyBpbnRlcnZhbF9tYXgpIC8gMjsKLQotICBTZW5kTGVMaW5rTGF5ZXJQYWNrZXQoTGVDb25uZWN0aW9uUGFyYW1ldGVyVXBkYXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpLkdldEFkZHJlc3MoKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEVycm9yQ29kZTo6U1VDQ0VTUyksIGludGVydmFsLCBsYXRlbmN5LAotICAgICAgc3VwZXJ2aXNpb25fdGltZW91dCkpOwotCi0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkgJiYKLSAgICAgIHByb3BlcnRpZXNfLkdldExlRXZlbnRTdXBwb3J0ZWQoCi0gICAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlN1YmV2ZW50Q29kZTo6Q09OTkVDVElPTl9VUERBVEVfQ09NUExFVEUpKSB7Ci0gICAgc2VuZF9ldmVudF8oYmx1ZXRvb3RoOjpoY2k6OkxlQ29ubmVjdGlvblVwZGF0ZUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBzdGF0dXMsIGhhbmRsZSwgaW50ZXJ2YWwsIGxhdGVuY3ksIHN1cGVydmlzaW9uX3RpbWVvdXQpKTsKLSAgfQotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVDb25uZWN0aW9uVXBkYXRlKAotICAgIHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaW50ZXJ2YWxfbWluLCB1aW50MTZfdCBpbnRlcnZhbF9tYXgsCi0gICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCkgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIFNlbmRMZUxpbmtMYXllclBhY2tldChMZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpLkdldEFkZHJlc3MoKSwgaW50ZXJ2YWxfbWluLCBpbnRlcnZhbF9tYXgsCi0gICAgICBsYXRlbmN5LCBzdXBlcnZpc2lvbl90aW1lb3V0KSk7Ci0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3RSZXBseSgKLSAgICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSwgdWludDE2X3QgaW50ZXJ2YWxfbWluLCB1aW50MTZfdCBpbnRlcnZhbF9tYXgsCi0gICAgdWludDE2X3QgdGltZW91dCwgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgbWluaW11bV9jZV9sZW5ndGgsCi0gICAgdWludDE2X3QgbWF4aW11bV9jZV9sZW5ndGgpIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGNvbm5lY3Rpb25faGFuZGxlKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgfQotCi0gIGlmICgoaW50ZXJ2YWxfbWluID4gaW50ZXJ2YWxfbWF4KSB8fAotICAgICAgKG1pbmltdW1fY2VfbGVuZ3RoID4gbWF4aW11bV9jZV9sZW5ndGgpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6SU5WQUxJRF9IQ0lfQ09NTUFORF9QQVJBTUVURVJTOwotICB9Ci0KLSAgU2NoZWR1bGVUYXNrKG1pbGxpc2Vjb25kcygyNSksIFt0aGlzLCBjb25uZWN0aW9uX2hhbmRsZSwgaW50ZXJ2YWxfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsX21heCwgbGF0ZW5jeSwgdGltZW91dF0oKSB7Ci0gICAgTGVDb25uZWN0aW9uVXBkYXRlQ29tcGxldGUoY29ubmVjdGlvbl9oYW5kbGUsIGludGVydmFsX21pbiwgaW50ZXJ2YWxfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3ksIHRpbWVvdXQpOwotICB9KTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgIHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlLCBibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlIHJlYXNvbikgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoY29ubmVjdGlvbl9oYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0KLSAgdWludDE2X3QgaW50ZXJ2YWwgPSAwOwotICB1aW50MTZfdCBsYXRlbmN5ID0gMDsKLSAgdWludDE2X3QgdGltZW91dCA9IDA7Ci0gIFNlbmRMZUxpbmtMYXllclBhY2tldChMZUNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGVCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBjb25uZWN0aW9uc18uR2V0T3duQWRkcmVzcyhjb25uZWN0aW9uX2hhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgY29ubmVjdGlvbnNfLkdldEFkZHJlc3MoY29ubmVjdGlvbl9oYW5kbGUpLkdldEFkZHJlc3MoKSwKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlYXNvbiksIGludGVydmFsLCBsYXRlbmN5LCB0aW1lb3V0KSk7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZUNvbm5lY3RMaXN0Q2xlYXIoKSB7Ci0gIGlmIChDb25uZWN0TGlzdEJ1c3koKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLSAgfQotCi0gIGxlX2Nvbm5lY3RfbGlzdF8uY2xlYXIoKTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlU2V0QWRkcmVzc1Jlc29sdXRpb25FbmFibGUoYm9vbCBlbmFibGUpIHsKLSAgaWYgKFJlc29sdmluZ0xpc3RCdXN5KCkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci0gIH0KLQotICBsZV9yZXNvbHZpbmdfbGlzdF9lbmFibGVkXyA9IGVuYWJsZTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVzb2x2aW5nTGlzdENsZWFyKCkgewotICBpZiAoUmVzb2x2aW5nTGlzdEJ1c3koKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLSAgfQotCi0gIGxlX3Jlc29sdmluZ19saXN0Xy5jbGVhcigpOwotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVDb25uZWN0TGlzdEFkZERldmljZShBZGRyZXNzIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkZHJfdHlwZSkgewotICBpZiAoQ29ubmVjdExpc3RCdXN5KCkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci0gIH0KLSAgc3RkOjp0dXBsZTxBZGRyZXNzLCB1aW50OF90PiBuZXdfdHVwbGUgPSBzdGQ6Om1ha2VfdHVwbGUoYWRkciwgYWRkcl90eXBlKTsKLSAgZm9yIChhdXRvIGRldiA6IGxlX2Nvbm5lY3RfbGlzdF8pIHsKLSAgICBpZiAoZGV2ID09IG5ld190dXBsZSkgewotICAgICAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgICB9Ci0gIH0KLSAgaWYgKExlQ29ubmVjdExpc3RGdWxsKCkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpNRU1PUllfQ0FQQUNJVFlfRVhDRUVERUQ7Ci0gIH0KLSAgbGVfY29ubmVjdF9saXN0Xy5lbXBsYWNlX2JhY2sobmV3X3R1cGxlKTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVzb2x2aW5nTGlzdEFkZERldmljZSgKLSAgICBBZGRyZXNzIGFkZHIsIHVpbnQ4X3QgYWRkcl90eXBlLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIGtJcmtTaXplPiBwZWVySXJrLAotICAgIHN0ZDo6YXJyYXk8dWludDhfdCwga0lya1NpemU+IGxvY2FsSXJrKSB7Ci0gIGlmIChSZXNvbHZpbmdMaXN0QnVzeSgpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotICB9Ci0gIGlmIChMZVJlc29sdmluZ0xpc3RGdWxsKCkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpNRU1PUllfQ0FQQUNJVFlfRVhDRUVERUQ7Ci0gIH0KLSAgbGVfcmVzb2x2aW5nX2xpc3RfLmVtcGxhY2VfYmFjaygKLSAgICAgIFJlc29sdmluZ0xpc3RFbnRyeXthZGRyLCBhZGRyX3R5cGUsIHBlZXJJcmssIGxvY2FsSXJrfSk7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6TGVTZXRQcml2YWN5TW9kZSh1aW50OF90IGFkZHJlc3NfdHlwZSwgQWRkcmVzcyBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9kZSkgewotICAvLyBzZXQgbW9kZSBmb3IgYWRkcgotICBMT0dfSU5GTygiYWRkcmVzcyB0eXBlID0gJWQgIiwgYWRkcmVzc190eXBlKTsKLSAgTE9HX0lORk8oImFkZHJlc3MgPSAlcyAiLCBhZGRyLlRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gIExPR19JTkZPKCJtb2RlID0gJWQgIiwgbW9kZSk7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6TGVSZWFkSXNvVHhTeW5jKHVpbnQxNl90IC8qIGhhbmRsZSAqLykge30KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZVNldENpZ1BhcmFtZXRlcnMoCi0gICAgdWludDhfdCBjaWdfaWQsIHVpbnQzMl90IHNkdV9pbnRlcnZhbF9tX3RvX3MsIHVpbnQzMl90IHNkdV9pbnRlcnZhbF9zX3RvX20sCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkNsb2NrQWNjdXJhY3kgY2xvY2tfYWNjdXJhY3ksCi0gICAgYmx1ZXRvb3RoOjpoY2k6OlBhY2tpbmcgcGFja2luZywgYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZSBmcmFtaW5nLAotICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsCi0gICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X3NfdG9fbSwKLSAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6Q2lzUGFyYW1ldGVyc0NvbmZpZz4gY2lzX2NvbmZpZykgewotICBpZiAocHJvcGVydGllc18uSXNVbm1hc2tlZChFdmVudENvZGU6OkxFX01FVEFfRVZFTlQpKSB7Ci0gICAgc2VuZF9ldmVudF8oY29ubmVjdGlvbnNfLlNldENpZ1BhcmFtZXRlcnMoCi0gICAgICAgIGNpZ19pZCwgc2R1X2ludGVydmFsX21fdG9fcywgc2R1X2ludGVydmFsX3NfdG9fbSwgY2xvY2tfYWNjdXJhY3ksCi0gICAgICAgIHBhY2tpbmcsIGZyYW1pbmcsIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9tX3RvX3MsCi0gICAgICAgIG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sIGNpc19jb25maWcpKTsKLSAgfQotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVDcmVhdGVDaXMoCi0gICAgc3RkOjp2ZWN0b3I8Ymx1ZXRvb3RoOjpoY2k6OkNyZWF0ZUNpc0NvbmZpZz4gY2lzX2NvbmZpZykgewotICBpZiAoY29ubmVjdGlvbnNfLkhhc1BlbmRpbmdDaXMoKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OkNPTU1BTkRfRElTQUxMT1dFRDsKLSAgfQotICBmb3IgKGF1dG8mIGNvbmZpZyA6IGNpc19jb25maWcpIHsKLSAgICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoY29uZmlnLmFjbF9jb25uZWN0aW9uX2hhbmRsZV8pKSB7Ci0gICAgICBMT0dfSU5GTygiVW5rbm93biBBQ0wgaGFuZGxlICUwNHgiLCBjb25maWcuYWNsX2Nvbm5lY3Rpb25faGFuZGxlXyk7Ci0gICAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gICAgfQotICAgIGlmICghY29ubmVjdGlvbnNfLkhhc0Npc0hhbmRsZShjb25maWcuY2lzX2Nvbm5lY3Rpb25faGFuZGxlXykpIHsKLSAgICAgIExPR19JTkZPKCJVbmtub3duIENJUyBoYW5kbGUgJTA0eCIsIGNvbmZpZy5jaXNfY29ubmVjdGlvbl9oYW5kbGVfKTsKLSAgICAgIHJldHVybiBFcnJvckNvZGU6OlVOS05PV05fQ09OTkVDVElPTjsKLSAgICB9Ci0gIH0KLSAgZm9yIChhdXRvJiBjb25maWcgOiBjaXNfY29uZmlnKSB7Ci0gICAgY29ubmVjdGlvbnNfLkNyZWF0ZVBlbmRpbmdDaXMoY29uZmlnKTsKLSAgICBhdXRvIG93bl9hZGRyZXNzID0KLSAgICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoY29uZmlnLmFjbF9jb25uZWN0aW9uX2hhbmRsZV8pOwotICAgIGF1dG8gcGVlcl9hZGRyZXNzID0gY29ubmVjdGlvbnNfLkdldEFkZHJlc3MoY29uZmlnLmFjbF9jb25uZWN0aW9uX2hhbmRsZV8pOwotICAgIFN0cmVhbVBhcmFtZXRlcnMgc3RyZWFtX3BhcmFtZXRlcnMgPQotICAgICAgICBjb25uZWN0aW9uc18uR2V0U3RyZWFtUGFyYW1ldGVycyhjb25maWcuY2lzX2Nvbm5lY3Rpb25faGFuZGxlXyk7Ci0gICAgR3JvdXBQYXJhbWV0ZXJzIGdyb3VwX3BhcmFtZXRlcnMgPQotICAgICAgICBjb25uZWN0aW9uc18uR2V0R3JvdXBQYXJhbWV0ZXJzKHN0cmVhbV9wYXJhbWV0ZXJzLmdyb3VwX2lkKTsKLQotICAgIFNlbmRMZUxpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6SXNvQ29ubmVjdGlvblJlcXVlc3RCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgIG93bl9hZGRyZXNzLkdldEFkZHJlc3MoKSwgcGVlcl9hZGRyZXNzLkdldEFkZHJlc3MoKSwKLSAgICAgICAgc3RyZWFtX3BhcmFtZXRlcnMuZ3JvdXBfaWQsIGdyb3VwX3BhcmFtZXRlcnMuc2R1X2ludGVydmFsX21fdG9fcywKLSAgICAgICAgZ3JvdXBfcGFyYW1ldGVycy5zZHVfaW50ZXJ2YWxfc190b19tLCBncm91cF9wYXJhbWV0ZXJzLmludGVybGVhdmVkLAotICAgICAgICBncm91cF9wYXJhbWV0ZXJzLmZyYW1lZCwgZ3JvdXBfcGFyYW1ldGVycy5tYXhfdHJhbnNwb3J0X2xhdGVuY3lfbV90b19zLAotICAgICAgICBncm91cF9wYXJhbWV0ZXJzLm1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICAgIHN0cmVhbV9wYXJhbWV0ZXJzLnN0cmVhbV9pZCwgc3RyZWFtX3BhcmFtZXRlcnMubWF4X3NkdV9tX3RvX3MsCi0gICAgICAgIHN0cmVhbV9wYXJhbWV0ZXJzLm1heF9zZHVfc190b19tLCBjb25maWcuY2lzX2Nvbm5lY3Rpb25faGFuZGxlXywKLSAgICAgICAgY29uZmlnLmFjbF9jb25uZWN0aW9uX2hhbmRsZV8pKTsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVSZW1vdmVDaWcodWludDhfdCBjaWdfaWQpIHsKLSAgcmV0dXJuIGNvbm5lY3Rpb25zXy5SZW1vdmVDaWcoY2lnX2lkKTsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlQWNjZXB0Q2lzUmVxdWVzdCh1aW50MTZfdCBjaXNfaGFuZGxlKSB7Ci0gIGlmICghY29ubmVjdGlvbnNfLkhhc1BlbmRpbmdDaXNDb25uZWN0aW9uKGNpc19oYW5kbGUpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6VU5LTk9XTl9DT05ORUNUSU9OOwotICB9Ci0gIGF1dG8gYWNsX2hhbmRsZSA9IGNvbm5lY3Rpb25zXy5HZXRQZW5kaW5nQWNsSGFuZGxlKGNpc19oYW5kbGUpOwotCi0gIGNvbm5lY3Rpb25zXy5Db25uZWN0Q2lzKGNpc19oYW5kbGUpOwotCi0gIFNlbmRMZUxpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6SXNvQ29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoYWNsX2hhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgY29ubmVjdGlvbnNfLkdldEFkZHJlc3MoYWNsX2hhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oRXJyb3JDb2RlOjpTVUNDRVNTKSwgY2lzX2hhbmRsZSwgYWNsX2hhbmRsZSwKLSAgICAgIGNvbm5lY3Rpb25zXy5HZXRSZW1vdGVDaXNIYW5kbGVGb3JDaXNIYW5kbGUoY2lzX2hhbmRsZSkpKTsKLQotICAvLyBCb3RoIHNpZGVzIGhhdmUgdG8gc2VuZCBMZUNpc0VzdGFibGlzaGVkIGV2ZW50Ci0KLSAgdWludDMyX3QgY2lnX3N5bmNfZGVsYXkgPSAweDEwMDsKLSAgdWludDMyX3QgY2lzX3N5bmNfZGVsYXkgPSAweDIwMDsKLSAgdWludDMyX3QgbGF0ZW5jeV9tX3RvX3MgPSAweDIwMDsKLSAgdWludDMyX3QgbGF0ZW5jeV9zX3RvX20gPSAweDIwMDsKLSAgdWludDhfdCBuc2UgPSAxOwotICB1aW50OF90IGJuX21fdG9fcyA9IDA7Ci0gIHVpbnQ4X3QgYm5fc190b19tID0gMDsKLSAgdWludDhfdCBmdF9tX3RvX3MgPSAwOwotICB1aW50OF90IGZ0X3NfdG9fbSA9IDA7Ci0gIHVpbnQ4X3QgbWF4X3BkdV9tX3RvX3MgPSAweDQwOwotICB1aW50OF90IG1heF9wZHVfc190b19tID0gMHg0MDsKLSAgdWludDE2X3QgaXNvX2ludGVydmFsID0gMHgxMDA7Ci0gIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6TEVfTUVUQV9FVkVOVCkpIHsKLSAgICBzZW5kX2V2ZW50XyhibHVldG9vdGg6OmhjaTo6TGVDaXNFc3RhYmxpc2hlZEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgRXJyb3JDb2RlOjpTVUNDRVNTLCBjaXNfaGFuZGxlLCBjaWdfc3luY19kZWxheSwgY2lzX3N5bmNfZGVsYXksCi0gICAgICAgIGxhdGVuY3lfbV90b19zLCBsYXRlbmN5X3NfdG9fbSwKLSAgICAgICAgYmx1ZXRvb3RoOjpoY2k6OlNlY29uZGFyeVBoeVR5cGU6Ok5PX1BBQ0tFVFMsCi0gICAgICAgIGJsdWV0b290aDo6aGNpOjpTZWNvbmRhcnlQaHlUeXBlOjpOT19QQUNLRVRTLCBuc2UsIGJuX21fdG9fcywgYm5fc190b19tLAotICAgICAgICBmdF9tX3RvX3MsIGZ0X3NfdG9fbSwgbWF4X3BkdV9tX3RvX3MsIG1heF9wZHVfc190b19tLCBpc29faW50ZXJ2YWwpKTsKLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVSZWplY3RDaXNSZXF1ZXN0KHVpbnQxNl90IGNpc19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSByZWFzb24pIHsKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzUGVuZGluZ0Npc0Nvbm5lY3Rpb24oY2lzX2hhbmRsZSkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLSAgYXV0byBhY2xfaGFuZGxlID0gY29ubmVjdGlvbnNfLkdldFBlbmRpbmdBY2xIYW5kbGUoY2lzX2hhbmRsZSk7Ci0KLSAgU2VuZExlTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpJc29Db25uZWN0aW9uUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICBjb25uZWN0aW9uc18uR2V0T3duQWRkcmVzcyhhY2xfaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhhY2xfaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihyZWFzb24pLCBhY2xfaGFuZGxlLCBjaXNfaGFuZGxlLCBrUmVzZXJ2ZWRIYW5kbGUpKTsKLSAgY29ubmVjdGlvbnNfLlJlamVjdENpcyhjaXNfaGFuZGxlKTsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlQ3JlYXRlQmlnKAotICAgIHVpbnQ4X3QgLyogYmlnX2hhbmRsZSAqLywgdWludDhfdCAvKiBhZHZlcnRpc2luZ19oYW5kbGUgKi8sCi0gICAgdWludDhfdCAvKiBudW1fYmlzICovLCB1aW50MzJfdCAvKiBzZHVfaW50ZXJ2YWwgKi8sIHVpbnQxNl90IC8qIG1heF9zZHUgKi8sCi0gICAgdWludDE2X3QgLyogbWF4X3RyYW5zcG9ydF9sYXRlbmN5ICovLCB1aW50OF90IC8qIHJ0biAqLywKLSAgICBibHVldG9vdGg6OmhjaTo6U2Vjb25kYXJ5UGh5VHlwZSAvKiBwaHkgKi8sCi0gICAgYmx1ZXRvb3RoOjpoY2k6OlBhY2tpbmcgLyogcGFja2luZyAqLywgYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZSAvKiBmcmFtaW5nICovLAotICAgIGJsdWV0b290aDo6aGNpOjpFbmFibGUgLyogZW5jcnlwdGlvbiAqLywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gLyogYnJvYWRjYXN0X2NvZGUgKi8pIHsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlVGVybWluYXRlQmlnKHVpbnQ4X3QgLyogYmlnX2hhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgLyogcmVhc29uICovKSB7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZUJpZ0NyZWF0ZVN5bmMoCi0gICAgdWludDhfdCAvKiBiaWdfaGFuZGxlICovLCB1aW50MTZfdCAvKiBzeW5jX2hhbmRsZSAqLywKLSAgICBibHVldG9vdGg6OmhjaTo6RW5hYmxlIC8qIGVuY3J5cHRpb24gKi8sCi0gICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IC8qIGJyb2FkY2FzdF9jb2RlICovLCB1aW50OF90IC8qIG1zZSAqLywKLSAgICB1aW50MTZfdCAvKiBiaWdfc3luY190aW1lb3V0ICovLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAvKiBiaXMgKi8pIHsKLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZUJpZ1Rlcm1pbmF0ZVN5bmModWludDhfdCAvKiBiaWdfaGFuZGxlICovKSB7fQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVSZXF1ZXN0UGVlclNjYSh1aW50MTZfdCAvKiByZXF1ZXN0X2hhbmRsZSAqLykgewotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkxlU2V0dXBJc29EYXRhUGF0aCgKLSAgICB1aW50MTZfdCAvKiBjb25uZWN0aW9uX2hhbmRsZSAqLywKLSAgICBibHVldG9vdGg6OmhjaTo6RGF0YVBhdGhEaXJlY3Rpb24gLyogZGF0YV9wYXRoX2RpcmVjdGlvbiAqLywKLSAgICB1aW50OF90IC8qIGRhdGFfcGF0aF9pZCAqLywgdWludDY0X3QgLyogY29kZWNfaWQgKi8sCi0gICAgdWludDMyX3QgLyogY29udHJvbGxlcl9EZWxheSAqLywKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAvKiBjb2RlY19jb25maWd1cmF0aW9uICovKSB7fQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVtb3ZlSXNvRGF0YVBhdGgoCi0gICAgdWludDE2X3QgLyogY29ubmVjdGlvbl9oYW5kbGUgKi8sCi0gICAgYmx1ZXRvb3RoOjpoY2k6OkRhdGFQYXRoRGlyZWN0aW9uIC8qIGRhdGFfcGF0aF9kaXJlY3Rpb24gKi8pIHt9Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SGFuZGxlTGVFbmFibGVFbmNyeXB0aW9uKAotICAgIHVpbnQxNl90IGhhbmRsZSwgc3RkOjphcnJheTx1aW50OF90LCA4PiByYW5kLCB1aW50MTZfdCBlZGl2LAotICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGx0aykgewotICAvLyBUT0RPOiBDaGVjayBrZXlzCi0gIC8vIFRPRE86IEJsb2NrIEFDTCB0cmFmZmljIG9yIGF0IGxlYXN0IGd1YXJkIGFnYWluc3QgaXQKLSAgaWYgKCFjb25uZWN0aW9uc18uSGFzSGFuZGxlKGhhbmRsZSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgU2VuZExlTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMZUVuY3J5cHRDb25uZWN0aW9uQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICBjb25uZWN0aW9uc18uR2V0QWRkcmVzcyhoYW5kbGUpLkdldEFkZHJlc3MoKSwgcmFuZCwgZWRpdiwgbHRrKSk7Ci19Ci0KLUVycm9yQ29kZSBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZUVuYWJsZUVuY3J5cHRpb24odWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDg+IHJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVkaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGx0aykgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIExPR19JTkZPKCJVbmtub3duIGhhbmRsZSAlMDR4IiwgaGFuZGxlKTsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLQotICBTY2hlZHVsZVRhc2sobWlsbGlzZWNvbmRzKDUpLCBbdGhpcywgaGFuZGxlLCByYW5kLCBlZGl2LCBsdGtdKCkgewotICAgIEhhbmRsZUxlRW5hYmxlRW5jcnlwdGlvbihoYW5kbGUsIHJhbmQsIGVkaXYsIGx0ayk7Ci0gIH0pOwotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVMb25nVGVybUtleVJlcXVlc3RSZXBseSgKLSAgICB1aW50MTZfdCBoYW5kbGUsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGx0aykgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIExPR19JTkZPKCJVbmtub3duIGhhbmRsZSAlMDR4IiwgaGFuZGxlKTsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLQotICAvLyBUT0RPOiBDaGVjayBrZXlzCi0gIGlmIChjb25uZWN0aW9uc18uSXNFbmNyeXB0ZWQoaGFuZGxlKSkgewotICAgIGlmIChwcm9wZXJ0aWVzXy5Jc1VubWFza2VkKEV2ZW50Q29kZTo6RU5DUllQVElPTl9LRVlfUkVGUkVTSF9DT01QTEVURSkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uS2V5UmVmcmVzaENvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvbm5lY3Rpb25zXy5FbmNyeXB0KGhhbmRsZSk7Ci0gICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpFTkNSWVBUSU9OX0NIQU5HRSkpIHsKLSAgICAgIHNlbmRfZXZlbnRfKGJsdWV0b290aDo6aGNpOjpFbmNyeXB0aW9uQ2hhbmdlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIEVycm9yQ29kZTo6U1VDQ0VTUywgaGFuZGxlLCBibHVldG9vdGg6OmhjaTo6RW5jcnlwdGlvbkVuYWJsZWQ6Ok9OKSk7Ci0gICAgfQotICB9Ci0gIFNlbmRMZUxpbmtMYXllclBhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMZUVuY3J5cHRDb25uZWN0aW9uUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUoCi0gICAgICAgICAgY29ubmVjdGlvbnNfLkdldE93bkFkZHJlc3MoaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgY29ubmVjdGlvbnNfLkdldEFkZHJlc3MoaGFuZGxlKS5HZXRBZGRyZXNzKCksCi0gICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCA4PigpLCB1aW50MTZfdCgpLCBsdGspKTsKLQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgIHVpbnQxNl90IGhhbmRsZSkgewotICBpZiAoIWNvbm5lY3Rpb25zXy5IYXNIYW5kbGUoaGFuZGxlKSkgewotICAgIExPR19JTkZPKCJVbmtub3duIGhhbmRsZSAlMDR4IiwgaGFuZGxlKTsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpVTktOT1dOX0NPTk5FQ1RJT047Ci0gIH0KLQotICBTZW5kTGVMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGVFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlQnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICAgIGNvbm5lY3Rpb25zXy5HZXRPd25BZGRyZXNzKGhhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgICAgIGNvbm5lY3Rpb25zXy5HZXRBZGRyZXNzKGhhbmRsZSkuR2V0QWRkcmVzcygpLAotICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4oKSwgdWludDE2X3QoKSwgc3RkOjphcnJheTx1aW50OF90LCAxNj4oKSkpOwotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6U2V0TGVBZHZlcnRpc2luZ0VuYWJsZSgKLSAgICB1aW50OF90IGxlX2FkdmVydGlzaW5nX2VuYWJsZSkgewotICBpZiAoIWxlX2FkdmVydGlzaW5nX2VuYWJsZSkgewotICAgIGFkdmVydGlzZXJzX1swXS5EaXNhYmxlKCk7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgfQotICBhdXRvIGludGVydmFsX21zID0gKHByb3BlcnRpZXNfLkdldExlQWR2ZXJ0aXNpbmdJbnRlcnZhbE1heCgpICsKLSAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZUFkdmVydGlzaW5nSW50ZXJ2YWxNaW4oKSkgKgotICAgICAgICAgICAgICAgICAgICAgMC42MjUgLyAyOwotCi0gIEFkZHJlc3Mgb3duX2FkZHJlc3MgPSBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCk7Ci0gIGlmIChwcm9wZXJ0aWVzXy5HZXRMZUFkdmVydGlzaW5nT3duQWRkcmVzc1R5cGUoKSA9PQotICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KAotICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU6OlJBTkRPTV9ERVZJQ0VfQUREUkVTUykgfHwKLSAgICAgIHByb3BlcnRpZXNfLkdldExlQWR2ZXJ0aXNpbmdPd25BZGRyZXNzVHlwZSgpID09Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oCi0gICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzVHlwZTo6UkFORE9NX0lERU5USVRZX0FERFJFU1MpKSB7Ci0gICAgaWYgKHByb3BlcnRpZXNfLkdldExlQWRkcmVzcygpLlRvU3RyaW5nKCkgPT0gImJiOmJiOmJiOmJhOmQwOjFlIiB8fAotICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKSA9PSBBZGRyZXNzOjprRW1wdHkpIHsKLSAgICAgIHJldHVybiBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzsKLSAgICB9Ci0gICAgb3duX2FkZHJlc3MgPSBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKTsKLSAgfQotICBhdXRvIG93bl9hZGRyZXNzX3dpdGhfdHlwZSA9IEFkZHJlc3NXaXRoVHlwZSgKLSAgICAgIG93bl9hZGRyZXNzLCBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6QWRkcmVzc1R5cGU+KAotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZUFkdmVydGlzaW5nT3duQWRkcmVzc1R5cGUoKSkpOwotCi0gIGF1dG8gaW50ZXJ2YWwgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHN0YXRpY19jYXN0PHVpbnQ2NF90PihpbnRlcnZhbF9tcykpOwotICBpZiAoaW50ZXJ2YWwgPCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSkgewotICAgIHJldHVybiBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzsKLSAgfQotICBhZHZlcnRpc2Vyc19bMF0uSW5pdGlhbGl6ZSgKLSAgICAgIG93bl9hZGRyZXNzX3dpdGhfdHlwZSwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpBZGRyZXNzV2l0aFR5cGUoCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0TGVBZHZlcnRpc2luZ1BlZXJBZGRyZXNzKCksCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3NUeXBlPigKLSAgICAgICAgICAgICAgcHJvcGVydGllc18uR2V0TGVBZHZlcnRpc2luZ1BlZXJBZGRyZXNzVHlwZSgpKSksCi0gICAgICBzdGF0aWNfY2FzdDxibHVldG9vdGg6OmhjaTo6TGVTY2FubmluZ0ZpbHRlclBvbGljeT4oCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0TGVBZHZlcnRpc2luZ0ZpbHRlclBvbGljeSgpKSwKLSAgICAgIHN0YXRpY19jYXN0PG1vZGVsOjpwYWNrZXRzOjpBZHZlcnRpc2VtZW50VHlwZT4oCi0gICAgICAgICAgcHJvcGVydGllc18uR2V0TGVBZHZlcnRpc2VtZW50VHlwZSgpKSwKLSAgICAgIHByb3BlcnRpZXNfLkdldExlQWR2ZXJ0aXNlbWVudCgpLCBwcm9wZXJ0aWVzXy5HZXRMZVNjYW5SZXNwb25zZSgpLAotICAgICAgaW50ZXJ2YWwpOwotICBhZHZlcnRpc2Vyc19bMF0uRW5hYmxlKCk7Ci0gIHJldHVybiBFcnJvckNvZGU6OlNVQ0NFU1M7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6TGVEaXNhYmxlQWR2ZXJ0aXNpbmdTZXRzKCkgewotICBmb3IgKGF1dG8mIGFkdmVydGlzZXIgOiBhZHZlcnRpc2Vyc18pIHsKLSAgICBhZHZlcnRpc2VyLkRpc2FibGUoKTsKLSAgfQotfQotCi11aW50OF90IExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVhZE51bWJlck9mU3VwcG9ydGVkQWR2ZXJ0aXNpbmdTZXRzKCkgewotICByZXR1cm4gYWR2ZXJ0aXNlcnNfLnNpemUoKTsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OlNldExlRXh0ZW5kZWRBZHZlcnRpc2luZ0VuYWJsZSgKLSAgICBibHVldG9vdGg6OmhjaTo6RW5hYmxlIGVuYWJsZSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6RW5hYmxlZFNldD4mIGVuYWJsZWRfc2V0cykgewotICBmb3IgKGNvbnN0IGF1dG8mIHNldCA6IGVuYWJsZWRfc2V0cykgewotICAgIGlmIChzZXQuYWR2ZXJ0aXNpbmdfaGFuZGxlXyA+IGFkdmVydGlzZXJzXy5zaXplKCkpIHsKLSAgICAgIHJldHVybiBFcnJvckNvZGU6OklOVkFMSURfSENJX0NPTU1BTkRfUEFSQU1FVEVSUzsKLSAgICB9Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiBzZXQgOiBlbmFibGVkX3NldHMpIHsKLSAgICBhdXRvIGhhbmRsZSA9IHNldC5hZHZlcnRpc2luZ19oYW5kbGVfOwotICAgIGlmIChlbmFibGUgPT0gYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZTo6RU5BQkxFRCkgewotICAgICAgYWR2ZXJ0aXNlcnNfW2hhbmRsZV0uRW5hYmxlRXh0ZW5kZWQoCi0gICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMCAqIHNldC5kdXJhdGlvbl8pKTsKLSAgICB9IGVsc2UgewotICAgICAgYWR2ZXJ0aXNlcnNfW2hhbmRsZV0uRGlzYWJsZSgpOwotICAgIH0KLSAgfQotICByZXR1cm4gRXJyb3JDb2RlOjpTVUNDRVNTOwotfQotCi1ib29sIExpbmtMYXllckNvbnRyb2xsZXI6OkNvbm5lY3RMaXN0QnVzeSgpIHsKLSAgaWYgKGxlX2Nvbm5lY3RfKSBMT0dfSU5GTygibGVfY29ubmVjdF8iKTsKLSAgaWYgKGxlX3NjYW5fZW5hYmxlXyAhPSBibHVldG9vdGg6OmhjaTo6T3BDb2RlOjpOT05FKQotICAgIExPR19JTkZPKCJsZV9zY2FuX2VuYWJsZSIpOwotICBmb3IgKGF1dG8gYWR2ZXJ0aXNlciA6IGFkdmVydGlzZXJzXykKLSAgICBpZiAoYWR2ZXJ0aXNlci5Jc0VuYWJsZWQoKSkgewotICAgICAgTE9HX0lORk8oIkFkdmVydGlzaW5nIik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBsZV9jb25uZWN0XyB8fCBsZV9zY2FuX2VuYWJsZV8gIT0gYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZTo6Tk9ORTsKLX0KLQotYm9vbCBMaW5rTGF5ZXJDb250cm9sbGVyOjpSZXNvbHZpbmdMaXN0QnVzeSgpIHsKLSAgcmV0dXJuIENvbm5lY3RMaXN0QnVzeSgpOyAgLy8gVE9ETzogQWRkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDSV9MRV9QZXJpb2RpY19BZHZlcnRpc2luZ19DcmVhdGVfU3luYwotfQotCi1FcnJvckNvZGUgTGlua0xheWVyQ29udHJvbGxlcjo6TGVDb25uZWN0TGlzdFJlbW92ZURldmljZShBZGRyZXNzIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkZHJfdHlwZSkgewotICBpZiAoQ29ubmVjdExpc3RCdXN5KCkpIHsKLSAgICByZXR1cm4gRXJyb3JDb2RlOjpDT01NQU5EX0RJU0FMTE9XRUQ7Ci0gIH0KLSAgc3RkOjp0dXBsZTxBZGRyZXNzLCB1aW50OF90PiBlcmFzZV90dXBsZSA9IHN0ZDo6bWFrZV90dXBsZShhZGRyLCBhZGRyX3R5cGUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlX2Nvbm5lY3RfbGlzdF8uc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAobGVfY29ubmVjdF9saXN0X1tpXSA9PSBlcmFzZV90dXBsZSkgewotICAgICAgbGVfY29ubmVjdF9saXN0Xy5lcmFzZShsZV9jb25uZWN0X2xpc3RfLmJlZ2luKCkgKyBpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotRXJyb3JDb2RlIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVzb2x2aW5nTGlzdFJlbW92ZURldmljZShBZGRyZXNzIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWRkcl90eXBlKSB7Ci0gIGlmIChSZXNvbHZpbmdMaXN0QnVzeSgpKSB7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotICB9Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVfY29ubmVjdF9saXN0Xy5zaXplKCk7IGkrKykgewotICAgIGF1dG8gY3VyciA9IGxlX2Nvbm5lY3RfbGlzdF9baV07Ci0gICAgaWYgKHN0ZDo6Z2V0PDA+KGN1cnIpID09IGFkZHIgJiYgc3RkOjpnZXQ8MT4oY3VycikgPT0gYWRkcl90eXBlKSB7Ci0gICAgICBsZV9yZXNvbHZpbmdfbGlzdF8uZXJhc2UobGVfcmVzb2x2aW5nX2xpc3RfLmJlZ2luKCkgKyBpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLX0KLQotYm9vbCBMaW5rTGF5ZXJDb250cm9sbGVyOjpMZUNvbm5lY3RMaXN0Q29udGFpbnNEZXZpY2UoQWRkcmVzcyBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZGRyX3R5cGUpIHsKLSAgc3RkOjp0dXBsZTxBZGRyZXNzLCB1aW50OF90PiBzb3VnaHRfdHVwbGUgPSBzdGQ6Om1ha2VfdHVwbGUoYWRkciwgYWRkcl90eXBlKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZV9jb25uZWN0X2xpc3RfLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKGxlX2Nvbm5lY3RfbGlzdF9baV0gPT0gc291Z2h0X3R1cGxlKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVzb2x2aW5nTGlzdENvbnRhaW5zRGV2aWNlKEFkZHJlc3MgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZGRyX3R5cGUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZV9jb25uZWN0X2xpc3RfLnNpemUoKTsgaSsrKSB7Ci0gICAgYXV0byBjdXJyID0gbGVfY29ubmVjdF9saXN0X1tpXTsKLSAgICBpZiAoc3RkOjpnZXQ8MD4oY3VycikgPT0gYWRkciAmJiBzdGQ6OmdldDwxPihjdXJyKSA9PSBhZGRyX3R5cGUpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTGlua0xheWVyQ29udHJvbGxlcjo6TGVDb25uZWN0TGlzdEZ1bGwoKSB7Ci0gIHJldHVybiBsZV9jb25uZWN0X2xpc3RfLnNpemUoKSA+PSBwcm9wZXJ0aWVzXy5HZXRMZUNvbm5lY3RMaXN0U2l6ZSgpOwotfQotCi1ib29sIExpbmtMYXllckNvbnRyb2xsZXI6OkxlUmVzb2x2aW5nTGlzdEZ1bGwoKSB7Ci0gIHJldHVybiBsZV9yZXNvbHZpbmdfbGlzdF8uc2l6ZSgpID49IHByb3BlcnRpZXNfLkdldExlUmVzb2x2aW5nTGlzdFNpemUoKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpSZXNldCgpIHsKLSAgaWYgKGlucXVpcnlfdGltZXJfdGFza19pZF8gIT0ga0ludmFsaWRUYXNrSWQpIHsKLSAgICBDYW5jZWxTY2hlZHVsZWRUYXNrKGlucXVpcnlfdGltZXJfdGFza19pZF8pOwotICAgIGlucXVpcnlfdGltZXJfdGFza19pZF8gPSBrSW52YWxpZFRhc2tJZDsKLSAgfQotICBsYXN0X2lucXVpcnlfID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgbGVfc2Nhbl9lbmFibGVfID0gYmx1ZXRvb3RoOjpoY2k6Ok9wQ29kZTo6Tk9ORTsKLSAgTGVEaXNhYmxlQWR2ZXJ0aXNpbmdTZXRzKCk7Ci0gIGxlX2Nvbm5lY3RfID0gMDsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpTdGFydElucXVpcnkobWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKLSAgaW5xdWlyeV90aW1lcl90YXNrX2lkXyA9IFNjaGVkdWxlVGFzayhtaWxsaXNlY29uZHModGltZW91dCksIFt0aGlzXSgpIHsKLSAgICBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbnF1aXJ5VGltZW91dCgpOwotICB9KTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbnF1aXJ5Q2FuY2VsKCkgewotICBBU1NFUlQoaW5xdWlyeV90aW1lcl90YXNrX2lkXyAhPSBrSW52YWxpZFRhc2tJZCk7Ci0gIENhbmNlbFNjaGVkdWxlZFRhc2soaW5xdWlyeV90aW1lcl90YXNrX2lkXyk7Ci0gIGlucXVpcnlfdGltZXJfdGFza19pZF8gPSBrSW52YWxpZFRhc2tJZDsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpJbnF1aXJ5VGltZW91dCgpIHsKLSAgaWYgKGlucXVpcnlfdGltZXJfdGFza19pZF8gIT0ga0ludmFsaWRUYXNrSWQpIHsKLSAgICBpbnF1aXJ5X3RpbWVyX3Rhc2tfaWRfID0ga0ludmFsaWRUYXNrSWQ7Ci0gICAgYXV0byBwYWNrZXQgPQotICAgICAgICBibHVldG9vdGg6OmhjaTo6SW5xdWlyeUNvbXBsZXRlQnVpbGRlcjo6Q3JlYXRlKEVycm9yQ29kZTo6U1VDQ0VTUyk7Ci0gICAgaWYgKHByb3BlcnRpZXNfLklzVW5tYXNrZWQoRXZlbnRDb2RlOjpJTlFVSVJZX0NPTVBMRVRFKSkgewotICAgICAgc2VuZF9ldmVudF8oc3RkOjptb3ZlKHBhY2tldCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlNldElucXVpcnlNb2RlKHVpbnQ4X3QgbW9kZSkgewotICBpbnF1aXJ5X21vZGVfID0gc3RhdGljX2Nhc3Q8bW9kZWw6OnBhY2tldHM6OklucXVpcnlUeXBlPihtb2RlKTsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpTZXRJbnF1aXJ5TEFQKHVpbnQ2NF90IGxhcCkgeyBpbnF1aXJ5X2xhcF8gPSBsYXA7IH0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpTZXRJbnF1aXJ5TWF4UmVzcG9uc2VzKHVpbnQ4X3QgbWF4KSB7Ci0gIGlucXVpcnlfbWF4X3Jlc3BvbnNlc18gPSBtYXg7Ci19Ci0KLXZvaWQgTGlua0xheWVyQ29udHJvbGxlcjo6SW5xdWlyeSgpIHsKLSAgc3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG5vdyA9IHN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIGlmIChkdXJhdGlvbl9jYXN0PG1pbGxpc2Vjb25kcz4obm93IC0gbGFzdF9pbnF1aXJ5XykgPCBtaWxsaXNlY29uZHMoMjAwMCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIHBhY2tldCA9IG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgcHJvcGVydGllc18uR2V0QWRkcmVzcygpLCBBZGRyZXNzOjprRW1wdHksIGlucXVpcnlfbW9kZV8pOwotICBTZW5kTGlua0xheWVyUGFja2V0KHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgbGFzdF9pbnF1aXJ5XyA9IG5vdzsKLX0KLQotdm9pZCBMaW5rTGF5ZXJDb250cm9sbGVyOjpTZXRJbnF1aXJ5U2NhbkVuYWJsZShib29sIGVuYWJsZSkgewotICBpbnF1aXJ5X3NjYW5zX2VuYWJsZWRfID0gZW5hYmxlOwotfQotCi12b2lkIExpbmtMYXllckNvbnRyb2xsZXI6OlNldFBhZ2VTY2FuRW5hYmxlKGJvb2wgZW5hYmxlKSB7Ci0gIHBhZ2Vfc2NhbnNfZW5hYmxlZF8gPSBlbmFibGU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL2xpbmtfbGF5ZXJfY29udHJvbGxlci5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvbGlua19sYXllcl9jb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWIyOTguLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvbGlua19sYXllcl9jb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgImluY2x1ZGUvaW5xdWlyeS5oIgotI2luY2x1ZGUgImluY2x1ZGUvcGh5LmgiCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9hY2xfY29ubmVjdGlvbl9oYW5kbGVyLmgiCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9sZV9hZHZlcnRpc2VyLmgiCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9kZXZpY2VfcHJvcGVydGllcy5oIgotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaCIKLSNpbmNsdWRlICJwYWNrZXRzL2xpbmtfbGF5ZXJfcGFja2V0cy5oIgotI2luY2x1ZGUgInNlY3VyaXR5X21hbmFnZXIuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLXVzaW5nIDo6Ymx1ZXRvb3RoOjpoY2k6OkFkZHJlc3M7Ci11c2luZyA6OmJsdWV0b290aDo6aGNpOjpFcnJvckNvZGU7Ci11c2luZyA6OmJsdWV0b290aDo6aGNpOjpPcENvZGU7Ci0KLWNsYXNzIExpbmtMYXllckNvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0lya1NpemUgPSAxNjsKLQotICBMaW5rTGF5ZXJDb250cm9sbGVyKGNvbnN0IERldmljZVByb3BlcnRpZXMmIHByb3BlcnRpZXMpIDogcHJvcGVydGllc18ocHJvcGVydGllcykge30KLSAgRXJyb3JDb2RlIFNlbmRDb21tYW5kVG9SZW1vdGVCeUFkZHJlc3MoCi0gICAgICBPcENvZGUgb3Bjb2RlLCBibHVldG9vdGg6OnBhY2tldDo6UGFja2V0Vmlldzx0cnVlPiBhcmdzLAotICAgICAgY29uc3QgQWRkcmVzcyYgcmVtb3RlKTsKLSAgRXJyb3JDb2RlIFNlbmRMZUNvbW1hbmRUb1JlbW90ZUJ5QWRkcmVzcyhPcENvZGUgb3Bjb2RlLCBjb25zdCBBZGRyZXNzJiByZW1vdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWRkcmVzcyYgbG9jYWwpOwotICBFcnJvckNvZGUgU2VuZENvbW1hbmRUb1JlbW90ZUJ5SGFuZGxlKAotICAgICAgT3BDb2RlIG9wY29kZSwgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc8dHJ1ZT4gYXJncywgdWludDE2X3QgaGFuZGxlKTsKLSAgRXJyb3JDb2RlIFNlbmRTY29Ub1JlbW90ZShibHVldG9vdGg6OmhjaTo6U2NvVmlldyBzY29fcGFja2V0KTsKLSAgRXJyb3JDb2RlIFNlbmRBY2xUb1JlbW90ZShibHVldG9vdGg6OmhjaTo6QWNsVmlldyBhY2xfcGFja2V0KTsKLQotICB2b2lkIFN0YXJ0U2ltcGxlUGFpcmluZyhjb25zdCBBZGRyZXNzJiBhZGRyZXNzKTsKLSAgdm9pZCBBdXRoZW50aWNhdGVSZW1vdGVTdGFnZTEoY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgUGFpcmluZ1R5cGUgcGFpcmluZ190eXBlKTsKLSAgdm9pZCBBdXRoZW50aWNhdGVSZW1vdGVTdGFnZTIoY29uc3QgQWRkcmVzcyYgYWRkcmVzcyk7Ci0gIHZvaWQgU2F2ZUtleUFuZEF1dGhlbnRpY2F0ZSh1aW50OF90IGtleV90eXBlLCBjb25zdCBBZGRyZXNzJiBwZWVyKTsKLSAgRXJyb3JDb2RlIExpbmtLZXlSZXF1ZXN0UmVwbHkoY29uc3QgQWRkcmVzcyYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGtleSk7Ci0gIEVycm9yQ29kZSBMaW5rS2V5UmVxdWVzdE5lZ2F0aXZlUmVwbHkoY29uc3QgQWRkcmVzcyYgYWRkcmVzcyk7Ci0gIEVycm9yQ29kZSBJb0NhcGFiaWxpdHlSZXF1ZXN0UmVwbHkoY29uc3QgQWRkcmVzcyYgcGVlciwgdWludDhfdCBpb19jYXBhYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb29iX2RhdGFfcHJlc2VudF9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzKTsKLSAgRXJyb3JDb2RlIElvQ2FwYWJpbGl0eVJlcXVlc3ROZWdhdGl2ZVJlcGx5KGNvbnN0IEFkZHJlc3MmIHBlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgcmVhc29uKTsKLSAgRXJyb3JDb2RlIFBpbkNvZGVSZXF1ZXN0UmVwbHkoY29uc3QgQWRkcmVzcyYgcGVlciwgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGluKTsKLSAgRXJyb3JDb2RlIFBpbkNvZGVSZXF1ZXN0TmVnYXRpdmVSZXBseShjb25zdCBBZGRyZXNzJiBwZWVyKTsKLSAgRXJyb3JDb2RlIFVzZXJDb25maXJtYXRpb25SZXF1ZXN0UmVwbHkoY29uc3QgQWRkcmVzcyYgcGVlcik7Ci0gIEVycm9yQ29kZSBVc2VyQ29uZmlybWF0aW9uUmVxdWVzdE5lZ2F0aXZlUmVwbHkoY29uc3QgQWRkcmVzcyYgcGVlcik7Ci0gIEVycm9yQ29kZSBVc2VyUGFzc2tleVJlcXVlc3RSZXBseShjb25zdCBBZGRyZXNzJiBwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtZXJpY192YWx1ZSk7Ci0gIEVycm9yQ29kZSBVc2VyUGFzc2tleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KGNvbnN0IEFkZHJlc3MmIHBlZXIpOwotICBFcnJvckNvZGUgUmVtb3RlT29iRGF0YVJlcXVlc3RSZXBseShjb25zdCBBZGRyZXNzJiBwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiYgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIHIpOwotICBFcnJvckNvZGUgUmVtb3RlT29iRGF0YVJlcXVlc3ROZWdhdGl2ZVJlcGx5KGNvbnN0IEFkZHJlc3MmIHBlZXIpOwotICBFcnJvckNvZGUgUmVtb3RlT29iRXh0ZW5kZWREYXRhUmVxdWVzdFJlcGx5KAotICAgICAgY29uc3QgQWRkcmVzcyYgcGVlciwgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGNfMTkyLAotICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIHJfMTkyLAotICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGNfMjU2LAotICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIHJfMjU2KTsKLSAgRXJyb3JDb2RlIFNlbmRLZXlwcmVzc05vdGlmaWNhdGlvbigKLSAgICAgIGNvbnN0IEFkZHJlc3MmIHBlZXIsCi0gICAgICBibHVldG9vdGg6OmhjaTo6S2V5cHJlc3NOb3RpZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbl90eXBlKTsKLSAgdm9pZCBIYW5kbGVTZXRDb25uZWN0aW9uRW5jcnlwdGlvbihjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCB1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgZW5jcnlwdGlvbl9lbmFibGUpOwotICBFcnJvckNvZGUgU2V0Q29ubmVjdGlvbkVuY3J5cHRpb24odWludDE2X3QgaGFuZGxlLCB1aW50OF90IGVuY3J5cHRpb25fZW5hYmxlKTsKLSAgdm9pZCBIYW5kbGVBdXRoZW50aWNhdGlvblJlcXVlc3QoY29uc3QgQWRkcmVzcyYgYWRkcmVzcywgdWludDE2X3QgaGFuZGxlKTsKLSAgRXJyb3JDb2RlIEF1dGhlbnRpY2F0aW9uUmVxdWVzdGVkKHVpbnQxNl90IGhhbmRsZSk7Ci0KLSAgRXJyb3JDb2RlIEFjY2VwdENvbm5lY3Rpb25SZXF1ZXN0KGNvbnN0IEFkZHJlc3MmIGFkZHIsIGJvb2wgdHJ5X3JvbGVfc3dpdGNoKTsKLSAgdm9pZCBNYWtlUGVyaXBoZXJhbENvbm5lY3Rpb24oY29uc3QgQWRkcmVzcyYgYWRkciwgYm9vbCB0cnlfcm9sZV9zd2l0Y2gpOwotICBFcnJvckNvZGUgUmVqZWN0Q29ubmVjdGlvblJlcXVlc3QoY29uc3QgQWRkcmVzcyYgYWRkciwgdWludDhfdCByZWFzb24pOwotICB2b2lkIFJlamVjdFBlcmlwaGVyYWxDb25uZWN0aW9uKGNvbnN0IEFkZHJlc3MmIGFkZHIsIHVpbnQ4X3QgcmVhc29uKTsKLSAgRXJyb3JDb2RlIENyZWF0ZUNvbm5lY3Rpb24oY29uc3QgQWRkcmVzcyYgYWRkciwgdWludDE2X3QgcGFja2V0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFnZV9zY2FuX21vZGUsIHVpbnQxNl90IGNsb2NrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbGxvd19yb2xlX3N3aXRjaCk7Ci0gIEVycm9yQ29kZSBDcmVhdGVDb25uZWN0aW9uQ2FuY2VsKGNvbnN0IEFkZHJlc3MmIGFkZHIpOwotICBFcnJvckNvZGUgRGlzY29ubmVjdCh1aW50MTZfdCBoYW5kbGUsIHVpbnQ4X3QgcmVhc29uKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRGlzY29ubmVjdENsZWFudXAodWludDE2X3QgaGFuZGxlLCB1aW50OF90IHJlYXNvbik7Ci0KLSBwdWJsaWM6Ci0gIHZvaWQgSW5jb21pbmdQYWNrZXQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgaW5jb21pbmcpOwotCi0gIHZvaWQgVGltZXJUaWNrKCk7Ci0KLSAgQXN5bmNUYXNrSWQgU2NoZWR1bGVUYXNrKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZGVsYXlfbXMsIGNvbnN0IFRhc2tDYWxsYmFjayYgdGFzayk7Ci0KLSAgdm9pZCBDYW5jZWxTY2hlZHVsZWRUYXNrKEFzeW5jVGFza0lkIHRhc2spOwotCi0gIC8vIFNldCB0aGUgY2FsbGJhY2tzIGZvciBzZW5kaW5nIHBhY2tldHMgdG8gdGhlIEhDSS4KLSAgdm9pZCBSZWdpc3RlckV2ZW50Q2hhbm5lbCgKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpoY2k6OkV2ZW50QnVpbGRlcj4pPiYKLSAgICAgICAgICBzZW5kX2V2ZW50KTsKLQotICB2b2lkIFJlZ2lzdGVyQWNsQ2hhbm5lbCgKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpoY2k6OkFjbEJ1aWxkZXI+KT4mCi0gICAgICAgICAgc2VuZF9hY2wpOwotCi0gIHZvaWQgUmVnaXN0ZXJTY29DaGFubmVsKAotICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcj4pPiYKLSAgICAgICAgICBzZW5kX3Njbyk7Ci0KLSAgdm9pZCBSZWdpc3Rlcklzb0NoYW5uZWwoCi0gICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpJc29CdWlsZGVyPik+JgotICAgICAgICAgIHNlbmRfaXNvKTsKLQotICB2b2lkIFJlZ2lzdGVyUmVtb3RlQ2hhbm5lbCgKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+LCBQaHk6OlR5cGUpPiYKLSAgICAgICAgICBzZW5kX3RvX3JlbW90ZSk7Ci0KLSAgLy8gU2V0IHRoZSBjYWxsYmFja3MgZm9yIHNjaGVkdWxpbmcgdGFza3MuCi0gIHZvaWQgUmVnaXN0ZXJUYXNrU2NoZWR1bGVyKAotICAgICAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLCBjb25zdCBUYXNrQ2FsbGJhY2smKT4gZXZlbnRfc2NoZWR1bGVyKTsKLQotICB2b2lkIFJlZ2lzdGVyUGVyaW9kaWNUYXNrU2NoZWR1bGVyKAotICAgICAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLCBjb25zdCBUYXNrQ2FsbGJhY2smKT4KLSAgICAgICAgICBwZXJpb2RpY19ldmVudF9zY2hlZHVsZXIpOwotCi0gIHZvaWQgUmVnaXN0ZXJUYXNrQ2FuY2VsKHN0ZDo6ZnVuY3Rpb248dm9pZChBc3luY1Rhc2tJZCk+IGNhbmNlbCk7Ci0gIHZvaWQgUmVzZXQoKTsKLQotICB2b2lkIExlQWR2ZXJ0aXNpbmcoKTsKLQotICBFcnJvckNvZGUgU2V0TGVFeHRlbmRlZEFkZHJlc3ModWludDhfdCBoYW5kbGUsIEFkZHJlc3MgYWRkcmVzcyk7Ci0KLSAgRXJyb3JDb2RlIFNldExlRXh0ZW5kZWRBZHZlcnRpc2luZ0RhdGEodWludDhfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKTsKLQotICBFcnJvckNvZGUgU2V0TGVFeHRlbmRlZFNjYW5SZXNwb25zZURhdGEodWludDhfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGF0YSk7Ci0KLSAgRXJyb3JDb2RlIFNldExlRXh0ZW5kZWRBZHZlcnRpc2luZ1BhcmFtZXRlcnMoCi0gICAgICB1aW50OF90IHNldCwgdWludDE2X3QgaW50ZXJ2YWxfbWluLCB1aW50MTZfdCBpbnRlcnZhbF9tYXgsCi0gICAgICBibHVldG9vdGg6OmhjaTo6TGVnYWN5QWR2ZXJ0aXNpbmdQcm9wZXJ0aWVzIHR5cGUsCi0gICAgICBibHVldG9vdGg6OmhjaTo6T3duQWRkcmVzc1R5cGUgb3duX2FkZHJlc3NfdHlwZSwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpQZWVyQWRkcmVzc1R5cGUgcGVlcl9hZGRyZXNzX3R5cGUsIEFkZHJlc3MgcGVlciwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpBZHZlcnRpc2luZ0ZpbHRlclBvbGljeSBmaWx0ZXJfcG9saWN5KTsKLSAgRXJyb3JDb2RlIExlUmVtb3ZlQWR2ZXJ0aXNpbmdTZXQodWludDhfdCBzZXQpOwotICBFcnJvckNvZGUgTGVDbGVhckFkdmVydGlzaW5nU2V0cygpOwotICB2b2lkIExlQ29ubmVjdGlvblVwZGF0ZUNvbXBsZXRlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaW50ZXJ2YWxfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsX21heCwgdWludDE2X3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0KTsKLSAgRXJyb3JDb2RlIExlQ29ubmVjdGlvblVwZGF0ZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IGludGVydmFsX21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBpbnRlcnZhbF9tYXgsIHVpbnQxNl90IGxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3VwZXJ2aXNpb25fdGltZW91dCk7Ci0gIEVycm9yQ29kZSBMZVJlbW90ZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0UmVwbHkoCi0gICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2hhbmRsZSwgdWludDE2X3QgaW50ZXJ2YWxfbWluLCB1aW50MTZfdCBpbnRlcnZhbF9tYXgsCi0gICAgICB1aW50MTZfdCB0aW1lb3V0LCB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCBtaW5pbXVtX2NlX2xlbmd0aCwKLSAgICAgIHVpbnQxNl90IG1heGltdW1fY2VfbGVuZ3RoKTsKLSAgRXJyb3JDb2RlIExlUmVtb3RlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3ROZWdhdGl2ZVJlcGx5KAotICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUsIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgcmVhc29uKTsKLSAgdWludDE2X3QgSGFuZGxlTGVDb25uZWN0aW9uKEFkZHJlc3NXaXRoVHlwZSBhZGRyLCBBZGRyZXNzV2l0aFR5cGUgb3duX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJvbGUsIHVpbnQxNl90IGNvbm5lY3Rpb25faW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb25uZWN0aW9uX2xhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0KTsKLQotICBib29sIENvbm5lY3RMaXN0QnVzeSgpOwotICBFcnJvckNvZGUgTGVDb25uZWN0TGlzdENsZWFyKCk7Ci0gIEVycm9yQ29kZSBMZUNvbm5lY3RMaXN0QWRkRGV2aWNlKEFkZHJlc3MgYWRkciwgdWludDhfdCBhZGRyX3R5cGUpOwotICBFcnJvckNvZGUgTGVDb25uZWN0TGlzdFJlbW92ZURldmljZShBZGRyZXNzIGFkZHIsIHVpbnQ4X3QgYWRkcl90eXBlKTsKLSAgYm9vbCBMZUNvbm5lY3RMaXN0Q29udGFpbnNEZXZpY2UoQWRkcmVzcyBhZGRyLCB1aW50OF90IGFkZHJfdHlwZSk7Ci0gIGJvb2wgTGVDb25uZWN0TGlzdEZ1bGwoKTsKLSAgYm9vbCBSZXNvbHZpbmdMaXN0QnVzeSgpOwotICBFcnJvckNvZGUgTGVTZXRBZGRyZXNzUmVzb2x1dGlvbkVuYWJsZShib29sIGVuYWJsZSk7Ci0gIEVycm9yQ29kZSBMZVJlc29sdmluZ0xpc3RDbGVhcigpOwotICBFcnJvckNvZGUgTGVSZXNvbHZpbmdMaXN0QWRkRGV2aWNlKEFkZHJlc3MgYWRkciwgdWludDhfdCBhZGRyX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCBrSXJrU2l6ZT4gcGVlcklyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIGtJcmtTaXplPiBsb2NhbElyayk7Ci0gIEVycm9yQ29kZSBMZVJlc29sdmluZ0xpc3RSZW1vdmVEZXZpY2UoQWRkcmVzcyBhZGRyLCB1aW50OF90IGFkZHJfdHlwZSk7Ci0gIGJvb2wgTGVSZXNvbHZpbmdMaXN0Q29udGFpbnNEZXZpY2UoQWRkcmVzcyBhZGRyLCB1aW50OF90IGFkZHJfdHlwZSk7Ci0gIGJvb2wgTGVSZXNvbHZpbmdMaXN0RnVsbCgpOwotICB2b2lkIExlU2V0UHJpdmFjeU1vZGUodWludDhfdCBhZGRyZXNzX3R5cGUsIEFkZHJlc3MgYWRkciwgdWludDhfdCBtb2RlKTsKLQotICB2b2lkIExlUmVhZElzb1R4U3luYyh1aW50MTZfdCBoYW5kbGUpOwotICB2b2lkIExlU2V0Q2lnUGFyYW1ldGVycygKLSAgICAgIHVpbnQ4X3QgY2lnX2lkLCB1aW50MzJfdCBzZHVfaW50ZXJ2YWxfbV90b19zLAotICAgICAgdWludDMyX3Qgc2R1X2ludGVydmFsX3NfdG9fbSwKLSAgICAgIGJsdWV0b290aDo6aGNpOjpDbG9ja0FjY3VyYWN5IGNsb2NrX2FjY3VyYWN5LAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OlBhY2tpbmcgcGFja2luZywgYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZSBmcmFtaW5nLAotICAgICAgdWludDE2X3QgbWF4X3RyYW5zcG9ydF9sYXRlbmN5X21fdG9fcywKLSAgICAgIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeV9zX3RvX20sCi0gICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6Q2lzUGFyYW1ldGVyc0NvbmZpZz4gY2lzX2NvbmZpZyk7Ci0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgTGVDcmVhdGVDaXMoCi0gICAgICBzdGQ6OnZlY3RvcjxibHVldG9vdGg6OmhjaTo6Q3JlYXRlQ2lzQ29uZmlnPiBjaXNfY29uZmlnKTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkVycm9yQ29kZSBMZVJlbW92ZUNpZyh1aW50OF90IGNpZ19pZCk7Ci0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgTGVBY2NlcHRDaXNSZXF1ZXN0KHVpbnQxNl90IGhhbmRsZSk7Ci0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgTGVSZWplY3RDaXNSZXF1ZXN0KAotICAgICAgdWludDE2X3QgaGFuZGxlLCBibHVldG9vdGg6OmhjaTo6RXJyb3JDb2RlIHJlYXNvbik7Ci0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgTGVDcmVhdGVCaWcoCi0gICAgICB1aW50OF90IGJpZ19oYW5kbGUsIHVpbnQ4X3QgYWR2ZXJ0aXNpbmdfaGFuZGxlLCB1aW50OF90IG51bV9iaXMsCi0gICAgICB1aW50MzJfdCBzZHVfaW50ZXJ2YWwsIHVpbnQxNl90IG1heF9zZHUsIHVpbnQxNl90IG1heF90cmFuc3BvcnRfbGF0ZW5jeSwKLSAgICAgIHVpbnQ4X3QgcnRuLCBibHVldG9vdGg6OmhjaTo6U2Vjb25kYXJ5UGh5VHlwZSBwaHksCi0gICAgICBibHVldG9vdGg6OmhjaTo6UGFja2luZyBwYWNraW5nLCBibHVldG9vdGg6OmhjaTo6RW5hYmxlIGZyYW1pbmcsCi0gICAgICBibHVldG9vdGg6OmhjaTo6RW5hYmxlIGVuY3J5cHRpb24sIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBicm9hZGNhc3RfY29kZSk7Ci0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgTGVUZXJtaW5hdGVCaWcodWludDhfdCBiaWdfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgcmVhc29uKTsKLSAgYmx1ZXRvb3RoOjpoY2k6OkVycm9yQ29kZSBMZUJpZ0NyZWF0ZVN5bmMoCi0gICAgICB1aW50OF90IGJpZ19oYW5kbGUsIHVpbnQxNl90IHN5bmNfaGFuZGxlLAotICAgICAgYmx1ZXRvb3RoOjpoY2k6OkVuYWJsZSBlbmNyeXB0aW9uLCBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gYnJvYWRjYXN0X2NvZGUsCi0gICAgICB1aW50OF90IG1zZSwgdWludDE2X3QgYmlnX3N5dW5jX3RpbWVvdXQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJpcyk7Ci0gIHZvaWQgTGVCaWdUZXJtaW5hdGVTeW5jKHVpbnQ4X3QgYmlnX2hhbmRsZSk7Ci0gIGJsdWV0b290aDo6aGNpOjpFcnJvckNvZGUgTGVSZXF1ZXN0UGVlclNjYSh1aW50MTZfdCByZXF1ZXN0X2hhbmRsZSk7Ci0gIHZvaWQgTGVTZXR1cElzb0RhdGFQYXRoKHVpbnQxNl90IGNvbm5lY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGg6OmhjaTo6RGF0YVBhdGhEaXJlY3Rpb24gZGF0YV9wYXRoX2RpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhX3BhdGhfaWQsIHVpbnQ2NF90IGNvZGVjX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb250cm9sbGVyX0RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2RlY19jb25maWd1cmF0aW9uKTsKLSAgdm9pZCBMZVJlbW92ZUlzb0RhdGFQYXRoKAotICAgICAgdWludDE2X3QgY29ubmVjdGlvbl9oYW5kbGUsCi0gICAgICBibHVldG9vdGg6OmhjaTo6RGF0YVBhdGhEaXJlY3Rpb24gZGF0YV9wYXRoX2RpcmVjdGlvbik7Ci0KLSAgdm9pZCBIYW5kbGVMZUVuYWJsZUVuY3J5cHRpb24odWludDE2X3QgaGFuZGxlLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDg+IHJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVkaXYsIHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+IGx0ayk7Ci0KLSAgRXJyb3JDb2RlIExlRW5hYmxlRW5jcnlwdGlvbih1aW50MTZfdCBoYW5kbGUsIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4gcmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlZGl2LCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PiBsdGspOwotCi0gIEVycm9yQ29kZSBMZUxvbmdUZXJtS2V5UmVxdWVzdFJlcGx5KHVpbnQxNl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gbHRrKTsKLQotICBFcnJvckNvZGUgTGVMb25nVGVybUtleVJlcXVlc3ROZWdhdGl2ZVJlcGx5KHVpbnQxNl90IGhhbmRsZSk7Ci0KLSAgRXJyb3JDb2RlIFNldExlQWR2ZXJ0aXNpbmdFbmFibGUodWludDhfdCBsZV9hZHZlcnRpc2luZ19lbmFibGUpOwotCi0gIHZvaWQgTGVEaXNhYmxlQWR2ZXJ0aXNpbmdTZXRzKCk7Ci0KLSAgdWludDhfdCBMZVJlYWROdW1iZXJPZlN1cHBvcnRlZEFkdmVydGlzaW5nU2V0cygpOwotCi0gIEVycm9yQ29kZSBTZXRMZUV4dGVuZGVkQWR2ZXJ0aXNpbmdFbmFibGUoCi0gICAgICBibHVldG9vdGg6OmhjaTo6RW5hYmxlIGVuYWJsZSwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJsdWV0b290aDo6aGNpOjpFbmFibGVkU2V0PiYgZW5hYmxlZF9zZXRzKTsKLQotICBibHVldG9vdGg6OmhjaTo6T3BDb2RlIEdldExlU2NhbkVuYWJsZSgpIHsgcmV0dXJuIGxlX3NjYW5fZW5hYmxlXzsgfQotCi0gIHZvaWQgU2V0TGVTY2FuRW5hYmxlKGJsdWV0b290aDo6aGNpOjpPcENvZGUgZW5hYmxpbmdfb3Bjb2RlKSB7Ci0gICAgbGVfc2Nhbl9lbmFibGVfID0gZW5hYmxpbmdfb3Bjb2RlOwotICB9Ci0gIHZvaWQgU2V0TGVTY2FuVHlwZSh1aW50OF90IGxlX3NjYW5fdHlwZSkgewotICAgIGxlX3NjYW5fdHlwZV8gPSBsZV9zY2FuX3R5cGU7Ci0gIH0KLSAgdm9pZCBTZXRMZVNjYW5JbnRlcnZhbCh1aW50MTZfdCBsZV9zY2FuX2ludGVydmFsKSB7Ci0gICAgbGVfc2Nhbl9pbnRlcnZhbF8gPSBsZV9zY2FuX2ludGVydmFsOwotICB9Ci0gIHZvaWQgU2V0TGVTY2FuV2luZG93KHVpbnQxNl90IGxlX3NjYW5fd2luZG93KSB7Ci0gICAgbGVfc2Nhbl93aW5kb3dfID0gbGVfc2Nhbl93aW5kb3c7Ci0gIH0KLSAgdm9pZCBTZXRMZVNjYW5GaWx0ZXJQb2xpY3kodWludDhfdCBsZV9zY2FuX2ZpbHRlcl9wb2xpY3kpIHsKLSAgICBsZV9zY2FuX2ZpbHRlcl9wb2xpY3lfID0gbGVfc2Nhbl9maWx0ZXJfcG9saWN5OwotICB9Ci0gIHZvaWQgU2V0TGVGaWx0ZXJEdXBsaWNhdGVzKHVpbnQ4X3QgbGVfc2Nhbl9maWx0ZXJfZHVwbGljYXRlcykgewotICAgIGxlX3NjYW5fZmlsdGVyX2R1cGxpY2F0ZXNfID0gbGVfc2Nhbl9maWx0ZXJfZHVwbGljYXRlczsKLSAgfQotICB2b2lkIFNldExlQWRkcmVzc1R5cGUoYmx1ZXRvb3RoOjpoY2k6Ok93bkFkZHJlc3NUeXBlIGxlX2FkZHJlc3NfdHlwZSkgewotICAgIGxlX2FkZHJlc3NfdHlwZV8gPSBsZV9hZGRyZXNzX3R5cGU7Ci0gIH0KLSAgRXJyb3JDb2RlIFNldExlQ29ubmVjdChib29sIGxlX2Nvbm5lY3QpIHsKLSAgICBpZiAobGVfY29ubmVjdF8gPT0gbGVfY29ubmVjdCkgewotICAgICAgcmV0dXJuIEVycm9yQ29kZTo6Q09NTUFORF9ESVNBTExPV0VEOwotICAgIH0KLSAgICBsZV9jb25uZWN0XyA9IGxlX2Nvbm5lY3Q7Ci0gICAgcmV0dXJuIEVycm9yQ29kZTo6U1VDQ0VTUzsKLSAgfQotICB2b2lkIFNldExlQ29ubmVjdGlvbkludGVydmFsTWluKHVpbnQxNl90IG1pbikgewotICAgIGxlX2Nvbm5lY3Rpb25faW50ZXJ2YWxfbWluXyA9IG1pbjsKLSAgfQotICB2b2lkIFNldExlQ29ubmVjdGlvbkludGVydmFsTWF4KHVpbnQxNl90IG1heCkgewotICAgIGxlX2Nvbm5lY3Rpb25faW50ZXJ2YWxfbWF4XyA9IG1heDsKLSAgfQotICB2b2lkIFNldExlQ29ubmVjdGlvbkxhdGVuY3kodWludDE2X3QgbGF0ZW5jeSkgewotICAgIGxlX2Nvbm5lY3Rpb25fbGF0ZW5jeV8gPSBsYXRlbmN5OwotICB9Ci0gIHZvaWQgU2V0TGVTdXBlcnZpc2lvblRpbWVvdXQodWludDE2X3QgdGltZW91dCkgewotICAgIGxlX2Nvbm5lY3Rpb25fc3VwZXJ2aXNpb25fdGltZW91dF8gPSB0aW1lb3V0OwotICB9Ci0gIHZvaWQgU2V0TGVNaW5pbXVtQ2VMZW5ndGgodWludDE2X3QgbWluKSB7Ci0gICAgbGVfY29ubmVjdGlvbl9taW5pbXVtX2NlX2xlbmd0aF8gPSBtaW47Ci0gIH0KLSAgdm9pZCBTZXRMZU1heGltdW1DZUxlbmd0aCh1aW50MTZfdCBtYXgpIHsKLSAgICBsZV9jb25uZWN0aW9uX21heGltdW1fY2VfbGVuZ3RoXyA9IG1heDsKLSAgfQotICB2b2lkIFNldExlSW5pdGlhdG9yRmlsdGVyUG9saWN5KHVpbnQ4X3QgbGVfaW5pdGlhdG9yX2ZpbHRlcl9wb2xpY3kpIHsKLSAgICBsZV9pbml0aWF0b3JfZmlsdGVyX3BvbGljeV8gPSBsZV9pbml0aWF0b3JfZmlsdGVyX3BvbGljeTsKLSAgfQotICB2b2lkIFNldExlUGVlckFkZHJlc3NUeXBlKHVpbnQ4X3QgcGVlcl9hZGRyZXNzX3R5cGUpIHsKLSAgICBsZV9wZWVyX2FkZHJlc3NfdHlwZV8gPSBwZWVyX2FkZHJlc3NfdHlwZTsKLSAgfQotICB2b2lkIFNldExlUGVlckFkZHJlc3MoY29uc3QgQWRkcmVzcyYgcGVlcl9hZGRyZXNzKSB7Ci0gICAgbGVfcGVlcl9hZGRyZXNzXyA9IHBlZXJfYWRkcmVzczsKLSAgfQotCi0gIC8vIENsYXNzaWMKLSAgdm9pZCBTdGFydElucXVpcnkoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKLSAgdm9pZCBJbnF1aXJ5Q2FuY2VsKCk7Ci0gIHZvaWQgSW5xdWlyeVRpbWVvdXQoKTsKLSAgdm9pZCBTZXRJbnF1aXJ5TW9kZSh1aW50OF90IG1vZGUpOwotICB2b2lkIFNldElucXVpcnlMQVAodWludDY0X3QgbGFwKTsKLSAgdm9pZCBTZXRJbnF1aXJ5TWF4UmVzcG9uc2VzKHVpbnQ4X3QgbWF4KTsKLSAgdm9pZCBJbnF1aXJ5KCk7Ci0KLSAgdm9pZCBTZXRJbnF1aXJ5U2NhbkVuYWJsZShib29sIGVuYWJsZSk7Ci0gIHZvaWQgU2V0UGFnZVNjYW5FbmFibGUoYm9vbCBlbmFibGUpOwotCi0gIEVycm9yQ29kZSBDaGFuZ2VDb25uZWN0aW9uUGFja2V0VHlwZSh1aW50MTZfdCBoYW5kbGUsIHVpbnQxNl90IHR5cGVzKTsKLSAgRXJyb3JDb2RlIENoYW5nZUNvbm5lY3Rpb25MaW5rS2V5KHVpbnQxNl90IGhhbmRsZSk7Ci0gIEVycm9yQ29kZSBDZW50cmFsTGlua0tleSh1aW50OF90IGtleV9mbGFnKTsKLSAgRXJyb3JDb2RlIEhvbGRNb2RlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3QgaG9sZF9tb2RlX21heF9pbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGhvbGRfbW9kZV9taW5faW50ZXJ2YWwpOwotICBFcnJvckNvZGUgU25pZmZNb2RlKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3Qgc25pZmZfbWF4X2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNuaWZmX21pbl9pbnRlcnZhbCwgdWludDE2X3Qgc25pZmZfYXR0ZW1wdCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzbmlmZl90aW1lb3V0KTsKLSAgRXJyb3JDb2RlIEV4aXRTbmlmZk1vZGUodWludDE2X3QgaGFuZGxlKTsKLSAgRXJyb3JDb2RlIFFvc1NldHVwKHVpbnQxNl90IGhhbmRsZSwgdWludDhfdCBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZWFrX2JhbmR3aWR0aCwgdWludDMyX3QgbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5X3ZhcmlhdGlvbik7Ci0gIEVycm9yQ29kZSBSb2xlRGlzY292ZXJ5KHVpbnQxNl90IGhhbmRsZSk7Ci0gIEVycm9yQ29kZSBTd2l0Y2hSb2xlKEFkZHJlc3MgYmRfYWRkciwgdWludDhfdCByb2xlKTsKLSAgRXJyb3JDb2RlIFdyaXRlTGlua1BvbGljeVNldHRpbmdzKHVpbnQxNl90IGhhbmRsZSwgdWludDE2X3Qgc2V0dGluZ3MpOwotICBFcnJvckNvZGUgRmxvd1NwZWNpZmljYXRpb24odWludDE2X3QgaGFuZGxlLCB1aW50OF90IGZsb3dfZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZXJ2aWNlX3R5cGUsIHVpbnQzMl90IHRva2VuX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b2tlbl9idWNrZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBlYWtfYmFuZHdpZHRoLCB1aW50MzJfdCBhY2Nlc3NfbGF0ZW5jeSk7Ci0gIEVycm9yQ29kZSBXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQodWludDE2X3QgaGFuZGxlLCB1aW50MTZfdCB0aW1lb3V0KTsKLSAgRXJyb3JDb2RlIFdyaXRlRGVmYXVsdExpbmtQb2xpY3lTZXR0aW5ncyh1aW50MTZfdCBzZXR0aW5ncyk7Ci0gIHVpbnQxNl90IFJlYWREZWZhdWx0TGlua1BvbGljeVNldHRpbmdzKCk7Ci0KLSAgdm9pZCBSZWFkTG9jYWxPb2JEYXRhKCk7Ci0gIHZvaWQgUmVhZExvY2FsT29iRXh0ZW5kZWREYXRhKCk7Ci0KLSAgdm9pZCBIYW5kbGVJc28oYmx1ZXRvb3RoOjpoY2k6Oklzb1ZpZXcgaXNvKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZW5kTGVMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHBhY2tldCk7Ci0gIHZvaWQgU2VuZExpbmtMYXllclBhY2tldCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4gcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0FjbFBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nRGlzY29ubmVjdFBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nRW5jcnlwdENvbm5lY3Rpb24obW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0VuY3J5cHRDb25uZWN0aW9uUmVzcG9uc2UoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nSW5xdWlyeVBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nSW5xdWlyeVJlc3BvbnNlUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0lvQ2FwYWJpbGl0eVJlcXVlc3RQYWNrZXQoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nSW9DYXBhYmlsaXR5UmVzcG9uc2VQYWNrZXQoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nSW9DYXBhYmlsaXR5TmVnYXRpdmVSZXNwb25zZVBhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdJc29QYWNrZXQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0lzb0Nvbm5lY3Rpb25SZXF1ZXN0UGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0lzb0Nvbm5lY3Rpb25SZXNwb25zZVBhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdLZXlwcmVzc05vdGlmaWNhdGlvblBhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdMZUFkdmVydGlzZW1lbnRQYWNrZXQoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nTGVDb25uZWN0UGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdMZUNvbm5lY3RDb21wbGV0ZVBhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdMZUNvbm5lY3Rpb25QYXJhbWV0ZXJSZXF1ZXN0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0xlQ29ubmVjdGlvblBhcmFtZXRlclVwZGF0ZSgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdMZUVuY3J5cHRDb25uZWN0aW9uKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdMZUVuY3J5cHRDb25uZWN0aW9uUmVzcG9uc2UoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nTGVSZWFkUmVtb3RlRmVhdHVyZXMobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ0xlUmVhZFJlbW90ZUZlYXR1cmVzUmVzcG9uc2UoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nTGVTY2FuUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdMZVNjYW5SZXNwb25zZVBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nUGFnZVBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nUGFnZVJlamVjdFBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nUGFnZVJlc3BvbnNlUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdQYXNza2V5UGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdQYXNza2V5RmFpbGVkUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdQaW5SZXF1ZXN0UGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdQaW5SZXNwb25zZVBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nUmVhZFJlbW90ZUxtcEZlYXR1cmVzKAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ1JlYWRSZW1vdGVMbXBGZWF0dXJlc1Jlc3BvbnNlKAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ1JlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcygKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdSZWFkUmVtb3RlU3VwcG9ydGVkRmVhdHVyZXNSZXNwb25zZSgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlcygKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdSZWFkUmVtb3RlRXh0ZW5kZWRGZWF0dXJlc1Jlc3BvbnNlKAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ1JlYWRSZW1vdGVWZXJzaW9uKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCk7Ci0gIHZvaWQgSW5jb21pbmdSZWFkUmVtb3RlVmVyc2lvblJlc3BvbnNlKAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ1JlYWRDbG9ja09mZnNldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nUmVhZENsb2NrT2Zmc2V0UmVzcG9uc2UoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotICB2b2lkIEluY29taW5nUmVtb3RlTmFtZVJlcXVlc3QobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KTsKLSAgdm9pZCBJbmNvbWluZ1JlbW90ZU5hbWVSZXF1ZXN0UmVzcG9uc2UoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpOwotCi0gcHJpdmF0ZToKLSAgY29uc3QgRGV2aWNlUHJvcGVydGllcyYgcHJvcGVydGllc187Ci0gIEFjbENvbm5lY3Rpb25IYW5kbGVyIGNvbm5lY3Rpb25zXzsKLSAgLy8gQWRkIHRpbWVzdGFtcHM/Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4+Ci0gICAgICBjb21tYW5kc19hd2FpdGluZ19yZXNwb25zZXNfOwotCi0gIC8vIFRpbWluZyByZWxhdGVkIHN0YXRlCi0gIHN0ZDo6dmVjdG9yPEFzeW5jVGFza0lkPiBjb250cm9sbGVyX2V2ZW50c187Ci0gIEFzeW5jVGFza0lkIHRpbWVyX3RpY2tfdGFza197fTsKLSAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lcl9wZXJpb2RfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApOwotCi0gIC8vIENhbGxiYWNrcyB0byBzY2hlZHVsZSB0YXNrcy4KLSAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLCBjb25zdCBUYXNrQ2FsbGJhY2smKT4gc2NoZWR1bGVfdGFza187Ci0gIHN0ZDo6ZnVuY3Rpb248QXN5bmNUYXNrSWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywgY29uc3QgVGFza0NhbGxiYWNrJik+Ci0gICAgICBzY2hlZHVsZV9wZXJpb2RpY190YXNrXzsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKEFzeW5jVGFza0lkKT4gY2FuY2VsX3Rhc2tfOwotCi0gIC8vIENhbGxiYWNrcyB0byBzZW5kIHBhY2tldHMgYmFjayB0byB0aGUgSENJLgotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpBY2xCdWlsZGVyPik+IHNlbmRfYWNsXzsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6RXZlbnRCdWlsZGVyPik+Ci0gICAgICBzZW5kX2V2ZW50XzsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxibHVldG9vdGg6OmhjaTo6U2NvQnVpbGRlcj4pPiBzZW5kX3Njb187Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8Ymx1ZXRvb3RoOjpoY2k6Oklzb0J1aWxkZXI+KT4gc2VuZF9pc29fOwotCi0gIC8vIENhbGxiYWNrIHRvIHNlbmQgcGFja2V0cyB0byByZW1vdGUgZGV2aWNlcy4KLSAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4sCi0gICAgICAgICAgICAgICAgICAgICBQaHk6OlR5cGUgcGh5X3R5cGUpPgotICAgICAgc2VuZF90b19yZW1vdGVfOwotCi0gIHVpbnQzMl90IG9vYl9pZF8gPSAxOwotICB1aW50MzJfdCBrZXlfaWRfID0gMTsKLQotICAvLyBMRSBzdGF0ZQotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV9ldmVudF9tYXNrXzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPEFkZHJlc3MsIHVpbnQ4X3Q+PiBsZV9jb25uZWN0X2xpc3RfOwotICBzdHJ1Y3QgUmVzb2x2aW5nTGlzdEVudHJ5IHsKLSAgICBBZGRyZXNzIGFkZHJlc3M7Ci0gICAgdWludDhfdCBhZGRyZXNzX3R5cGU7Ci0gICAgc3RkOjphcnJheTx1aW50OF90LCBrSXJrU2l6ZT4gcGVlcl9pcms7Ci0gICAgc3RkOjphcnJheTx1aW50OF90LCBrSXJrU2l6ZT4gbG9jYWxfaXJrOwotICB9OwotICBzdGQ6OnZlY3RvcjxSZXNvbHZpbmdMaXN0RW50cnk+IGxlX3Jlc29sdmluZ19saXN0XzsKLSAgYm9vbCBsZV9yZXNvbHZpbmdfbGlzdF9lbmFibGVkX3tmYWxzZX07Ci0KLSAgc3RkOjphcnJheTxMZUFkdmVydGlzZXIsIDc+IGFkdmVydGlzZXJzXzsKLQotICBibHVldG9vdGg6OmhjaTo6T3BDb2RlIGxlX3NjYW5fZW5hYmxlX3tibHVldG9vdGg6OmhjaTo6T3BDb2RlOjpOT05FfTsKLSAgdWludDhfdCBsZV9zY2FuX3R5cGVfe307Ci0gIHVpbnQxNl90IGxlX3NjYW5faW50ZXJ2YWxfe307Ci0gIHVpbnQxNl90IGxlX3NjYW5fd2luZG93X3t9OwotICB1aW50OF90IGxlX3NjYW5fZmlsdGVyX3BvbGljeV97fTsKLSAgdWludDhfdCBsZV9zY2FuX2ZpbHRlcl9kdXBsaWNhdGVzX3t9OwotICBibHVldG9vdGg6OmhjaTo6T3duQWRkcmVzc1R5cGUgbGVfYWRkcmVzc190eXBlX3t9OwotCi0gIGJvb2wgbGVfY29ubmVjdF97ZmFsc2V9OwotICB1aW50MTZfdCBsZV9jb25uZWN0aW9uX2ludGVydmFsX21pbl97fTsKLSAgdWludDE2X3QgbGVfY29ubmVjdGlvbl9pbnRlcnZhbF9tYXhfe307Ci0gIHVpbnQxNl90IGxlX2Nvbm5lY3Rpb25fbGF0ZW5jeV97fTsKLSAgdWludDE2X3QgbGVfY29ubmVjdGlvbl9zdXBlcnZpc2lvbl90aW1lb3V0X3t9OwotICB1aW50MTZfdCBsZV9jb25uZWN0aW9uX21pbmltdW1fY2VfbGVuZ3RoX3t9OwotICB1aW50MTZfdCBsZV9jb25uZWN0aW9uX21heGltdW1fY2VfbGVuZ3RoX3t9OwotICB1aW50OF90IGxlX2luaXRpYXRvcl9maWx0ZXJfcG9saWN5X3t9OwotCi0gIEFkZHJlc3MgbGVfcGVlcl9hZGRyZXNzX3t9OwotICB1aW50OF90IGxlX3BlZXJfYWRkcmVzc190eXBlX3t9OwotCi0gIC8vIENsYXNzaWMgc3RhdGUKLQotICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlfbWFuYWdlcl97MTB9OwotICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGxhc3RfaW5xdWlyeV87Ci0gIG1vZGVsOjpwYWNrZXRzOjpJbnF1aXJ5VHlwZSBpbnF1aXJ5X21vZGVfewotICAgICAgbW9kZWw6OnBhY2tldHM6OklucXVpcnlUeXBlOjpTVEFOREFSRH07Ci0gIEFzeW5jVGFza0lkIGlucXVpcnlfdGltZXJfdGFza19pZF8gPSBrSW52YWxpZFRhc2tJZDsKLSAgdWludDY0X3QgaW5xdWlyeV9sYXBfe307Ci0gIHVpbnQ4X3QgaW5xdWlyeV9tYXhfcmVzcG9uc2VzX3t9OwotICB1aW50MTZfdCBkZWZhdWx0X2xpbmtfcG9saWN5X3NldHRpbmdzXyA9IDA7Ci0KLSAgYm9vbCBwYWdlX3NjYW5zX2VuYWJsZWRfe2ZhbHNlfTsKLSAgYm9vbCBpbnF1aXJ5X3NjYW5zX2VuYWJsZWRfe2ZhbHNlfTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL3NlY3VyaXR5X21hbmFnZXIuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9zZWN1cml0eV9tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2Y4OWUxLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9jb250cm9sbGVyL3NlY3VyaXR5X21hbmFnZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNlY3VyaXR5X21hbmFnZXIuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLXVpbnQxNl90IFNlY3VyaXR5TWFuYWdlcjo6RGVsZXRlQWxsS2V5cygpIHsKLSAgdWludDE2X3Qgc2l6ZSA9IGtleV9zdG9yZV8uc2l6ZSgpOwotICBrZXlfc3RvcmVfLmNsZWFyKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MTZfdCBTZWN1cml0eU1hbmFnZXI6OkRlbGV0ZUtleShjb25zdCBBZGRyZXNzJiBhZGRyKSB7Ci0gIHVpbnQxNl90IGNvdW50ID0ga2V5X3N0b3JlXy5jb3VudChhZGRyLlRvU3RyaW5nKCkpOwotICBpZiAoY291bnQpIHsKLSAgICBrZXlfc3RvcmVfLmVyYXNlKGFkZHIuVG9TdHJpbmcoKSk7Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi11aW50MTZfdCBTZWN1cml0eU1hbmFnZXI6OlJlYWRBbGxLZXlzKCkgY29uc3QgewotICByZXR1cm4ga2V5X3N0b3JlXy5zaXplKCk7Ci19Ci0KLXVpbnQxNl90IFNlY3VyaXR5TWFuYWdlcjo6UmVhZEtleShjb25zdCBBZGRyZXNzJiBhZGRyKSBjb25zdCB7Ci0gIHJldHVybiBrZXlfc3RvcmVfLmNvdW50KGFkZHIuVG9TdHJpbmcoKSk7Ci19Ci0KLXVpbnQxNl90IFNlY3VyaXR5TWFuYWdlcjo6V3JpdGVLZXkoY29uc3QgQWRkcmVzcyYgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIGtleSkgewotICBpZiAoa2V5X3N0b3JlXy5zaXplKCkgPj0gbWF4X2tleXNfKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAga2V5X3N0b3JlX1thZGRyLlRvU3RyaW5nKCldID0ga2V5OwotICByZXR1cm4gMTsKLX0KLQotY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIFNlY3VyaXR5TWFuYWdlcjo6R2V0S2V5KAotICAgIGNvbnN0IEFkZHJlc3MmIGFkZHIpIGNvbnN0IHsKLSAgQVNTRVJUX0xPRyhSZWFkS2V5KGFkZHIpLCAiTm8gc3VjaCBrZXkiKTsKLSAgcmV0dXJuIGtleV9zdG9yZV8uYXQoYWRkci5Ub1N0cmluZygpKTsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OkF1dGhlbnRpY2F0aW9uUmVxdWVzdChjb25zdCBBZGRyZXNzJiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBoYW5kbGUsIGJvb2wgaW5pdGlhdG9yKSB7Ci0gIGF1dGhlbnRpY2F0aW5nXyA9IHRydWU7Ci0gIGN1cnJlbnRfaGFuZGxlXyA9IGhhbmRsZTsKLSAgcGVlcl9hZGRyZXNzXyA9IGFkZHI7Ci0gIGluaXRpYXRvcl8gPSBpbml0aWF0b3I7Ci0gIHBlZXJfcGluX3JlcXVlc3RlZF8gPSBmYWxzZTsKLSAgcGVlcl9waW5fcmVjZWl2ZWRfID0gZmFsc2U7Ci0gIGhvc3RfcGluX3JlY2VpdmVkXyA9IGZhbHNlOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6QXV0aGVudGljYXRpb25SZXF1ZXN0RmluaXNoZWQoKSB7Ci0gIGF1dGhlbnRpY2F0aW5nXyA9IGZhbHNlOwotfQotCi1ib29sIFNlY3VyaXR5TWFuYWdlcjo6QXV0aGVudGljYXRpb25JblByb2dyZXNzKCkgewotICByZXR1cm4gYXV0aGVudGljYXRpbmdfOwotfQotCi1ib29sIFNlY3VyaXR5TWFuYWdlcjo6SXNJbml0aWF0b3IoKSB7IHJldHVybiBpbml0aWF0b3JfOyB9Ci0KLXVpbnQxNl90IFNlY3VyaXR5TWFuYWdlcjo6R2V0QXV0aGVudGljYXRpb25IYW5kbGUoKSB7Ci0gIHJldHVybiBjdXJyZW50X2hhbmRsZV87Ci19Ci0KLUFkZHJlc3MgU2VjdXJpdHlNYW5hZ2VyOjpHZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKSB7Ci0gIHJldHVybiBwZWVyX2FkZHJlc3NfOwotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6U2V0UGVlcklvQ2FwYWJpbGl0eShjb25zdCBBZGRyZXNzJiBhZGRyLCB1aW50OF90IGlvX2NhcGFiaWxpdHksIHVpbnQ4X3Qgb29iX3ByZXNlbnRfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzKSB7Ci0gIEFTU0VSVChhZGRyID09IHBlZXJfYWRkcmVzc18pOwotICBwZWVyX2NhcGFiaWxpdGllc192YWxpZF8gPSB0cnVlOwotICBpZiAoaW9fY2FwYWJpbGl0eSA8PSBzdGF0aWNfY2FzdDx1aW50OF90PihJb0NhcGFiaWxpdHlUeXBlOjpOT19JTlBVVF9OT19PVVRQVVQpKSB7Ci0gICAgcGVlcl9pb19jYXBhYmlsaXR5XyA9IHN0YXRpY19jYXN0PElvQ2FwYWJpbGl0eVR5cGU+KGlvX2NhcGFiaWxpdHkpOwotICB9IGVsc2UgewotICAgIHBlZXJfaW9fY2FwYWJpbGl0eV8gPSBJb0NhcGFiaWxpdHlUeXBlOjpJTlZBTElEOwotICAgIHBlZXJfY2FwYWJpbGl0aWVzX3ZhbGlkXyA9IGZhbHNlOwotICB9Ci0gIHBlZXJfb29iX3ByZXNlbnRfZmxhZ18gPSBvb2JfcHJlc2VudF9mbGFnOwotICBpZiAoYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzIDw9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEF1dGhlbnRpY2F0aW9uVHlwZTo6R0VORVJBTF9CT05ESU5HX01JVE0pKSB7Ci0gICAgcGVlcl9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID0gc3RhdGljX2Nhc3Q8QXV0aGVudGljYXRpb25UeXBlPihhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpOwotICB9IGVsc2UgewotICAgIHBlZXJfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9IEF1dGhlbnRpY2F0aW9uVHlwZTo6SU5WQUxJRDsKLSAgICBwZWVyX2NhcGFiaWxpdGllc192YWxpZF8gPSBmYWxzZTsKLSAgfQotfQotCi12b2lkIFNlY3VyaXR5TWFuYWdlcjo6U2V0TG9jYWxJb0NhcGFiaWxpdHkoY29uc3QgQWRkcmVzcyYgcGVlciwgdWludDhfdCBpb19jYXBhYmlsaXR5LCB1aW50OF90IG9vYl9wcmVzZW50X2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpIHsKLSAgQVNTRVJUKHBlZXIgPT0gcGVlcl9hZGRyZXNzXyk7Ci0gIEFTU0VSVF9MT0coaW9fY2FwYWJpbGl0eSA8PSBzdGF0aWNfY2FzdDx1aW50OF90PihJb0NhcGFiaWxpdHlUeXBlOjpOT19JTlBVVF9OT19PVVRQVVQpLCAiaW9fY2FwYWJpbGl0eSA9ICVkIiwKLSAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGlvX2NhcGFiaWxpdHkpKTsKLSAgQVNTRVJUX0xPRyhvb2JfcHJlc2VudF9mbGFnIDw9IDMsICJvb2JfcHJlc2VudF9mbGFnID0gJWhoeCAiLAotICAgICAgICAgICAgIG9vYl9wcmVzZW50X2ZsYWcpOwotICBBU1NFUlRfTE9HKGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA8PSBzdGF0aWNfY2FzdDx1aW50OF90PihBdXRoZW50aWNhdGlvblR5cGU6OkdFTkVSQUxfQk9ORElOR19NSVRNKSwKLSAgICAgICAgICAgICAiYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cykpOwotICBob3N0X2lvX2NhcGFiaWxpdHlfID0gc3RhdGljX2Nhc3Q8SW9DYXBhYmlsaXR5VHlwZT4oaW9fY2FwYWJpbGl0eSk7Ci0gIGhvc3Rfb29iX3ByZXNlbnRfZmxhZ18gPSBvb2JfcHJlc2VudF9mbGFnOwotICBob3N0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPSBzdGF0aWNfY2FzdDxBdXRoZW50aWNhdGlvblR5cGU+KGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyk7Ci0gIGhvc3RfY2FwYWJpbGl0aWVzX3ZhbGlkXyA9IHRydWU7Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyOjpJbnZhbGlkYXRlSW9DYXBhYmlsaXRpZXMoKSB7Ci0gIGhvc3RfY2FwYWJpbGl0aWVzX3ZhbGlkXyA9IGZhbHNlOwotICBwZWVyX2NhcGFiaWxpdGllc192YWxpZF8gPSBmYWxzZTsKLX0KLQotUGFpcmluZ1R5cGUgU2VjdXJpdHlNYW5hZ2VyOjpHZXRTaW1wbGVQYWlyaW5nVHlwZSgpIHsKLSAgaWYgKCFob3N0X2NhcGFiaWxpdGllc192YWxpZF8gfHwgIXBlZXJfY2FwYWJpbGl0aWVzX3ZhbGlkXykgewotICAgIHJldHVybiBQYWlyaW5nVHlwZTo6SU5WQUxJRDsKLSAgfQotICBib29sIGhvc3RfcmVxdWlyZXNfbWl0bSA9IChob3N0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPT0gQXV0aGVudGljYXRpb25UeXBlOjpOT19CT05ESU5HX01JVE0pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3RfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBBdXRoZW50aWNhdGlvblR5cGU6OkRFRElDQVRFRF9CT05ESU5HX01JVE0pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3RfYXV0aGVudGljYXRpb25fcmVxdWlyZW1lbnRzXyA9PSBBdXRoZW50aWNhdGlvblR5cGU6OkdFTkVSQUxfQk9ORElOR19NSVRNKTsKLSAgYm9vbCBwZWVyX3JlcXVpcmVzX21pdG0gPSAocGVlcl9hdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHNfID09IEF1dGhlbnRpY2F0aW9uVHlwZTo6Tk9fQk9ORElOR19NSVRNKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZWVyX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPT0gQXV0aGVudGljYXRpb25UeXBlOjpERURJQ0FURURfQk9ORElOR19NSVRNKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZWVyX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c18gPT0gQXV0aGVudGljYXRpb25UeXBlOjpHRU5FUkFMX0JPTkRJTkdfTUlUTSk7Ci0gIGlmIChwZWVyX29vYl9wcmVzZW50X2ZsYWdfICE9IDAgfHwgaG9zdF9vb2JfcHJlc2VudF9mbGFnXyAhPSAwKSB7Ci0gICAgaWYgKGhvc3Rfb29iX3ByZXNlbnRfZmxhZ18gPT0gMCkgewotICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpQRUVSX0hBU19PVVRfT0ZfQkFORDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpPVVRfT0ZfQkFORDsKLSAgICB9Ci0gIH0KLSAgaWYgKCEocGVlcl9yZXF1aXJlc19taXRtIHx8IGhvc3RfcmVxdWlyZXNfbWl0bSkpIHsKLSAgICByZXR1cm4gUGFpcmluZ1R5cGU6OkFVVE9fQ09ORklSTUFUSU9OOwotICB9Ci0gIExPR19JTkZPKCIlczogaG9zdCBkb2VzJXMgcmVxdWlyZSBwZWVyIGRvZXMlcyByZXF1aXJlIE1JVE0iLAotICAgICAgICAgICBwZWVyX2FkZHJlc3NfLlRvU3RyaW5nKCkuY19zdHIoKSwgaG9zdF9yZXF1aXJlc19taXRtID8gIiIgOiAibid0IiwKLSAgICAgICAgICAgcGVlcl9yZXF1aXJlc19taXRtID8gIiIgOiAibid0Iik7Ci0gIHN3aXRjaCAocGVlcl9pb19jYXBhYmlsaXR5XykgewotICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6RElTUExBWV9PTkxZOgotICAgICAgc3dpdGNoIChob3N0X2lvX2NhcGFiaWxpdHlfKSB7Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6RElTUExBWV9PTkxZOgotICAgICAgICBjYXNlIElvQ2FwYWJpbGl0eVR5cGU6OkRJU1BMQVlfWUVTX05POgotICAgICAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6QVVUT19DT05GSVJNQVRJT047Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6S0VZQk9BUkRfT05MWToKLSAgICAgICAgICByZXR1cm4gUGFpcmluZ1R5cGU6OklOUFVUX1BJTjsKLSAgICAgICAgY2FzZSBJb0NhcGFiaWxpdHlUeXBlOjpOT19JTlBVVF9OT19PVVRQVVQ6Ci0gICAgICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpBVVRPX0NPTkZJUk1BVElPTjsKLSAgICAgICAgY2FzZSBJb0NhcGFiaWxpdHlUeXBlOjpJTlZBTElEOgotICAgICAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6SU5WQUxJRDsKLSAgICAgIH0KLSAgICBjYXNlIElvQ2FwYWJpbGl0eVR5cGU6OkRJU1BMQVlfWUVTX05POgotICAgICAgc3dpdGNoIChob3N0X2lvX2NhcGFiaWxpdHlfKSB7Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6RElTUExBWV9PTkxZOgotICAgICAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6QVVUT19DT05GSVJNQVRJT047Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6RElTUExBWV9ZRVNfTk86Ci0gICAgICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpESVNQTEFZX0FORF9DT05GSVJNOwotICAgICAgICBjYXNlIElvQ2FwYWJpbGl0eVR5cGU6OktFWUJPQVJEX09OTFk6Ci0gICAgICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpJTlBVVF9QSU47Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6Tk9fSU5QVVRfTk9fT1VUUFVUOgotICAgICAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6QVVUT19DT05GSVJNQVRJT047Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6SU5WQUxJRDoKLSAgICAgICAgICByZXR1cm4gUGFpcmluZ1R5cGU6OklOVkFMSUQ7Ci0gICAgICB9Ci0gICAgY2FzZSBJb0NhcGFiaWxpdHlUeXBlOjpLRVlCT0FSRF9PTkxZOgotICAgICAgc3dpdGNoIChob3N0X2lvX2NhcGFiaWxpdHlfKSB7Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6RElTUExBWV9PTkxZOgotICAgICAgICBjYXNlIElvQ2FwYWJpbGl0eVR5cGU6OkRJU1BMQVlfWUVTX05POgotICAgICAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6RElTUExBWV9QSU47Ci0gICAgICAgIGNhc2UgSW9DYXBhYmlsaXR5VHlwZTo6S0VZQk9BUkRfT05MWToKLSAgICAgICAgICByZXR1cm4gUGFpcmluZ1R5cGU6OklOUFVUX1BJTjsKLSAgICAgICAgY2FzZSBJb0NhcGFiaWxpdHlUeXBlOjpOT19JTlBVVF9OT19PVVRQVVQ6Ci0gICAgICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpBVVRPX0NPTkZJUk1BVElPTjsKLSAgICAgICAgY2FzZSBJb0NhcGFiaWxpdHlUeXBlOjpJTlZBTElEOgotICAgICAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6SU5WQUxJRDsKLSAgICAgIH0KLSAgICBjYXNlIElvQ2FwYWJpbGl0eVR5cGU6Ok5PX0lOUFVUX05PX09VVFBVVDoKLSAgICAgIHJldHVybiBQYWlyaW5nVHlwZTo6QVVUT19DT05GSVJNQVRJT047Ci0gICAgY2FzZSBJb0NhcGFiaWxpdHlUeXBlOjpJTlZBTElEOgotICAgICAgcmV0dXJuIFBhaXJpbmdUeXBlOjpJTlZBTElEOwotICB9Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyOjpTZXRQaW5SZXF1ZXN0ZWQoY29uc3QgQWRkcmVzcyYgYWRkcikgewotICBBU1NFUlQoYWRkciA9PSBwZWVyX2FkZHJlc3NfKTsKLSAgcGVlcl9waW5fcmVxdWVzdGVkXyA9IHRydWU7Ci19Ci0KLWJvb2wgU2VjdXJpdHlNYW5hZ2VyOjpHZXRQaW5SZXF1ZXN0ZWQoY29uc3QgQWRkcmVzcyYgYWRkcikgewotICBBU1NFUlQoYWRkciA9PSBwZWVyX2FkZHJlc3NfKTsKLSAgcmV0dXJuIHBlZXJfcGluX3JlcXVlc3RlZF87Ci19Ci0KLXZvaWQgU2VjdXJpdHlNYW5hZ2VyOjpTZXRMb2NhbFBpbihjb25zdCBBZGRyZXNzJiBwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwaW4pIHsKLSAgQVNTRVJUKHBlZXIgPT0gcGVlcl9hZGRyZXNzXyk7Ci0gIGhvc3RfcGluX3JlY2VpdmVkXyA9IHRydWU7Ci0gIGhvc3RfcGluXyA9IHBpbjsKLX0KLQotdm9pZCBTZWN1cml0eU1hbmFnZXI6OlNldFJlbW90ZVBpbihjb25zdCBBZGRyZXNzJiBwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGluKSB7Ci0gIEFTU0VSVChwZWVyID09IHBlZXJfYWRkcmVzc18pOwotICBwZWVyX3Bpbl9yZWNlaXZlZF8gPSB0cnVlOwotICBwZWVyX3Bpbl8gPSBwaW47Ci19Ci0KLWJvb2wgU2VjdXJpdHlNYW5hZ2VyOjpHZXRMb2NhbFBpblJlc3BvbnNlUmVjZWl2ZWQoY29uc3QgQWRkcmVzcyYgcGVlcikgewotICBBU1NFUlQocGVlciA9PSBwZWVyX2FkZHJlc3NfKTsKLSAgcmV0dXJuIGhvc3RfcGluX3JlY2VpdmVkXzsKLX0KLQotYm9vbCBTZWN1cml0eU1hbmFnZXI6OkdldFJlbW90ZVBpblJlc3BvbnNlUmVjZWl2ZWQoY29uc3QgQWRkcmVzcyYgcGVlcikgewotICBBU1NFUlQocGVlciA9PSBwZWVyX2FkZHJlc3NfKTsKLSAgcmV0dXJuIHBlZXJfcGluX3JlY2VpdmVkXzsKLX0KLQotYm9vbCBTZWN1cml0eU1hbmFnZXI6OlBpbkNvbXBhcmUoKSB7Ci0gIHJldHVybiBob3N0X3Bpbl9yZWNlaXZlZF8gJiYgcGVlcl9waW5fcmVjZWl2ZWRfICYmIHBlZXJfcGluXyA9PSBob3N0X3Bpbl87Ci19Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9zZWN1cml0eV9tYW5hZ2VyLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvY29udHJvbGxlci9zZWN1cml0eV9tYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzI4ZGUuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2NvbnRyb2xsZXIvc2VjdXJpdHlfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotdXNpbmcgOjpibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLQotZW51bSBjbGFzcyBQYWlyaW5nVHlwZSA6IHVpbnQ4X3QgewotICBBVVRPX0NPTkZJUk1BVElPTiwKLSAgQ09ORklSTV9ZX04sCi0gIERJU1BMQVlfUElOLAotICBESVNQTEFZX0FORF9DT05GSVJNLAotICBJTlBVVF9QSU4sCi0gIE9VVF9PRl9CQU5ELAotICBQRUVSX0hBU19PVVRfT0ZfQkFORCwKLSAgSU5WQUxJRCA9IDB4ZmYsCi19OwotCi1lbnVtIGNsYXNzIElvQ2FwYWJpbGl0eVR5cGUgOiB1aW50OF90IHsKLSAgRElTUExBWV9PTkxZID0gMCwKLSAgRElTUExBWV9ZRVNfTk8gPSAxLAotICBLRVlCT0FSRF9PTkxZID0gMiwKLSAgTk9fSU5QVVRfTk9fT1VUUFVUID0gMywKLSAgSU5WQUxJRCA9IDB4ZmYsCi19OwotCi1lbnVtIGNsYXNzIEF1dGhlbnRpY2F0aW9uVHlwZSA6IHVpbnQ4X3QgewotICBOT19CT05ESU5HID0gMCwKLSAgTk9fQk9ORElOR19NSVRNID0gMSwKLSAgREVESUNBVEVEX0JPTkRJTkcgPSAyLAotICBERURJQ0FURURfQk9ORElOR19NSVRNID0gMywKLSAgR0VORVJBTF9CT05ESU5HID0gNCwKLSAgR0VORVJBTF9CT05ESU5HX01JVE0gPSA1LAotICBJTlZBTElEID0gMHhmZiwKLX07Ci0KLS8vIEVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcga2V5cy4KLWNsYXNzIFNlY3VyaXR5TWFuYWdlciB7Ci0gcHVibGljOgotICBTZWN1cml0eU1hbmFnZXIodWludDE2X3QgbnVtX2tleXMpIDogbWF4X2tleXNfKG51bV9rZXlzKSB7fQotICB2aXJ0dWFsIH5TZWN1cml0eU1hbmFnZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgdWludDE2X3QgRGVsZXRlQWxsS2V5cygpOwotICB1aW50MTZfdCBEZWxldGVLZXkoY29uc3QgQWRkcmVzcyYgYWRkcik7Ci0gIHVpbnQxNl90IFJlYWRBbGxLZXlzKCkgY29uc3Q7Ci0gIHVpbnQxNl90IFJlYWRLZXkoY29uc3QgQWRkcmVzcyYgYWRkcikgY29uc3Q7Ci0gIHVpbnQxNl90IFdyaXRlS2V5KGNvbnN0IEFkZHJlc3MmIGFkZHIsIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+JiBrZXkpOwotICB1aW50MTZfdCBSZWFkQ2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtYXhfa2V5c187IH07Ci0KLSAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4mIEdldEtleShjb25zdCBBZGRyZXNzJiBhZGRyKSBjb25zdDsKLQotICB2b2lkIEF1dGhlbnRpY2F0aW9uUmVxdWVzdChjb25zdCBBZGRyZXNzJiBhZGRyLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdGlhdG9yKTsKLSAgdm9pZCBBdXRoZW50aWNhdGlvblJlcXVlc3RGaW5pc2hlZCgpOwotCi0gIGJvb2wgQXV0aGVudGljYXRpb25JblByb2dyZXNzKCk7Ci0gIGJvb2wgSXNJbml0aWF0b3IoKTsKLSAgdWludDE2X3QgR2V0QXV0aGVudGljYXRpb25IYW5kbGUoKTsKLSAgQWRkcmVzcyBHZXRBdXRoZW50aWNhdGlvbkFkZHJlc3MoKTsKLQotICB2b2lkIFNldFBpblJlcXVlc3RlZChjb25zdCBBZGRyZXNzJiBhZGRyKTsKLSAgYm9vbCBHZXRQaW5SZXF1ZXN0ZWQoY29uc3QgQWRkcmVzcyYgYWRkcik7Ci0gIHZvaWQgU2V0TG9jYWxQaW4oY29uc3QgQWRkcmVzcyYgcGVlciwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBpbik7Ci0gIHZvaWQgU2V0UmVtb3RlUGluKGNvbnN0IEFkZHJlc3MmIHBlZXIsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwaW4pOwotICBib29sIEdldExvY2FsUGluUmVzcG9uc2VSZWNlaXZlZChjb25zdCBBZGRyZXNzJiBwZWVyKTsKLSAgYm9vbCBHZXRSZW1vdGVQaW5SZXNwb25zZVJlY2VpdmVkKGNvbnN0IEFkZHJlc3MmIHBlZXIpOwotICBib29sIFBpbkNvbXBhcmUoKTsKLQotICB2b2lkIFNldFBlZXJJb0NhcGFiaWxpdHkoY29uc3QgQWRkcmVzcyYgYWRkciwgdWludDhfdCBpb19jYXBhYmlsaXR5LCB1aW50OF90IG9vYl9wcmVzZW50X2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyk7Ci0gIHZvaWQgU2V0TG9jYWxJb0NhcGFiaWxpdHkoY29uc3QgQWRkcmVzcyYgcGVlciwgdWludDhfdCBpb19jYXBhYmlsaXR5LCB1aW50OF90IG9vYl9wcmVzZW50X2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMpOwotCi0gIFBhaXJpbmdUeXBlIEdldFNpbXBsZVBhaXJpbmdUeXBlKCk7Ci0KLSAgdm9pZCBJbnZhbGlkYXRlSW9DYXBhYmlsaXRpZXMoKTsKLQotIHByaXZhdGU6Ci0gIHVpbnQxNl90IG1heF9rZXlzXzsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2Pj4ga2V5X3N0b3JlXzsKLQotICBib29sIHBlZXJfY2FwYWJpbGl0aWVzX3ZhbGlkX3tmYWxzZX07Ci0gIElvQ2FwYWJpbGl0eVR5cGUgcGVlcl9pb19jYXBhYmlsaXR5X3tJb0NhcGFiaWxpdHlUeXBlOjpESVNQTEFZX09OTFl9OwotICB1aW50OF90IHBlZXJfb29iX3ByZXNlbnRfZmxhZ197MH07Ci0gIEF1dGhlbnRpY2F0aW9uVHlwZSBwZWVyX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c197Ci0gICAgICBBdXRoZW50aWNhdGlvblR5cGU6Ok5PX0JPTkRJTkd9OwotICBib29sIHBlZXJfcGluX3JlcXVlc3RlZF97ZmFsc2V9OwotICBib29sIHBlZXJfcGluX3JlY2VpdmVkX3tmYWxzZX07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlZXJfcGluXzsKLQotICBib29sIGhvc3RfY2FwYWJpbGl0aWVzX3ZhbGlkX3tmYWxzZX07Ci0gIElvQ2FwYWJpbGl0eVR5cGUgaG9zdF9pb19jYXBhYmlsaXR5X3tJb0NhcGFiaWxpdHlUeXBlOjpESVNQTEFZX09OTFl9OwotICB1aW50OF90IGhvc3Rfb29iX3ByZXNlbnRfZmxhZ197MH07Ci0gIEF1dGhlbnRpY2F0aW9uVHlwZSBob3N0X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50c197Ci0gICAgICBBdXRoZW50aWNhdGlvblR5cGU6Ok5PX0JPTkRJTkd9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBob3N0X3Bpbl87Ci0gIGJvb2wgaG9zdF9waW5fcmVjZWl2ZWRfe2ZhbHNlfTsKLQotICBib29sIGF1dGhlbnRpY2F0aW5nX3tmYWxzZX07Ci0gIHVpbnQxNl90IGN1cnJlbnRfaGFuZGxlX3t9OwotICBBZGRyZXNzIHBlZXJfYWRkcmVzc197fTsKLSAgYm9vbCBpbml0aWF0b3Jfe2ZhbHNlfTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2JlYWNvbi5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2JlYWNvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhYzRiZC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9iZWFjb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYmVhY29uLmgiCi0KLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9kZXZpY2VfYm91dGlxdWUuaCIKLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1ib29sIEJlYWNvbjo6cmVnaXN0ZXJlZF8gPSBEZXZpY2VCb3V0aXF1ZTo6UmVnaXN0ZXIoImJlYWNvbiIsICZCZWFjb246OkNyZWF0ZSk7Ci0KLUJlYWNvbjo6QmVhY29uKCkgewotICBhZHZlcnRpc2luZ19pbnRlcnZhbF9tc18gPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEyODApOwotICBwcm9wZXJ0aWVzXy5TZXRMZUFkdmVydGlzZW1lbnRUeXBlKDB4MDMgLyogTk9OX0NPTk5FQ1QgKi8pOwotICBwcm9wZXJ0aWVzXy5TZXRMZUFkdmVydGlzZW1lbnQoezB4MEYsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5IC8qIFRZUEVfTkFNRV9DTVBMICovLCAnZycsICdEJywgJ2UnLCAndicsICdpJywgJ2MnLCAnZScsICctJywgJ2InLCAnZScsICdhJywgJ2MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJywgJ24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxIC8qIFRZUEVfRkxBRyAqLywgMHg0IC8qIEJSRURSX05PVF9TUFQgKi8gfCAweDIgLyogR0VOX0RJU0NfRkxBRyAqL30pOwotCi0gIHByb3BlcnRpZXNfLlNldExlU2NhblJlc3BvbnNlKHsweDA1LCAgLy8gTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4IC8qIFRZUEVfTkFNRV9TSE9SVCAqLywgJ2InLCAnZScsICdhJywgJ2MnfSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEJlYWNvbjo6R2V0VHlwZVN0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICJiZWFjb24iOwotfQotCi1zdGQ6OnN0cmluZyBCZWFjb246OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZyBkZXYgPSBHZXRUeXBlU3RyaW5nKCkgKyAiQCIgKyBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKS5Ub1N0cmluZygpOwotCi0gIHJldHVybiBkZXY7Ci19Ci0KLXZvaWQgQmVhY29uOjpJbml0aWFsaXplKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMikgcmV0dXJuOwotCi0gIEFkZHJlc3MgYWRkcnt9OwotICBpZiAoQWRkcmVzczo6RnJvbVN0cmluZyhhcmdzWzFdLCBhZGRyKSkgcHJvcGVydGllc18uU2V0TGVBZGRyZXNzKGFkZHIpOwotCi0gIGlmIChhcmdzLnNpemUoKSA8IDMpIHJldHVybjsKLQotICBTZXRBZHZlcnRpc2VtZW50SW50ZXJ2YWwoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhzdGQ6OnN0b2koYXJnc1syXSkpKTsKLX0KLQotdm9pZCBCZWFjb246OlRpbWVyVGljaygpIHsKLSAgaWYgKElzQWR2ZXJ0aXNlbWVudEF2YWlsYWJsZSgpKSB7Ci0gICAgbGFzdF9hZHZlcnRpc2VtZW50XyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgIGF1dG8gYWQgPSBtb2RlbDo6cGFja2V0czo6TGVBZHZlcnRpc2VtZW50QnVpbGRlcjo6Q3JlYXRlKAotICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKSwgQWRkcmVzczo6a0VtcHR5LAotICAgICAgICBtb2RlbDo6cGFja2V0czo6QWRkcmVzc1R5cGU6OlBVQkxJQywKLSAgICAgICAgc3RhdGljX2Nhc3Q8bW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlPigKLSAgICAgICAgICAgIHByb3BlcnRpZXNfLkdldExlQWR2ZXJ0aXNlbWVudFR5cGUoKSksCi0gICAgICAgIHByb3BlcnRpZXNfLkdldExlQWR2ZXJ0aXNlbWVudCgpKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHRvX3NlbmQgPQotICAgICAgICBzdGQ6Om1vdmUoYWQpOwotCi0gICAgU2VuZExpbmtMYXllclBhY2tldCh0b19zZW5kLCBQaHk6OlR5cGU6OkxPV19FTkVSR1kpOwotICB9Ci19Ci0KLXZvaWQgQmVhY29uOjpJbmNvbWluZ1BhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgaWYgKHBhY2tldC5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKSA9PSBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKSAmJgotICAgICAgcGFja2V0LkdldFR5cGUoKSA9PSBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZTo6TEVfU0NBTikgewotICAgIGF1dG8gc2Nhbl9yZXNwb25zZSA9IG1vZGVsOjpwYWNrZXRzOjpMZVNjYW5SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgcHJvcGVydGllc18uR2V0TGVBZGRyZXNzKCksIHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICAgIG1vZGVsOjpwYWNrZXRzOjpBZGRyZXNzVHlwZTo6UFVCTElDLAotICAgICAgICBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGU6OlNDQU5fUkVTUE9OU0UsCi0gICAgICAgIHByb3BlcnRpZXNfLkdldExlU2NhblJlc3BvbnNlKCkpOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4gdG9fc2VuZCA9Ci0gICAgICAgIHN0ZDo6bW92ZShzY2FuX3Jlc3BvbnNlKTsKLQotICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQodG9fc2VuZCwgUGh5OjpUeXBlOjpMT1dfRU5FUkdZKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9iZWFjb24uaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2JlYWNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JiMjI4Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2JlYWNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImRldmljZS5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotLy8gQSBzaW1wbGUgZGV2aWNlIHRoYXQgYWR2ZXJ0aXNlcyBwZXJpb2RpY2FsbHkgYW5kIGlzIG5vdCBjb25uZWN0YWJsZS4KLWNsYXNzIEJlYWNvbiA6IHB1YmxpYyBEZXZpY2UgewotIHB1YmxpYzoKLSAgQmVhY29uKCk7Ci0gIHZpcnR1YWwgfkJlYWNvbigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPERldmljZT4gQ3JlYXRlKCkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEJlYWNvbj4oKTsKLSAgfQotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VHlwZVN0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gU2V0IHRoZSBhZGRyZXNzIGFuZCBhZHZlcnRpc2luZyBpbnRlcnZhbCBmcm9tIHN0cmluZyBhcmdzLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBJbmNvbWluZ1BhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGJvb2wgcmVnaXN0ZXJlZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9iZWFjb25fc3dhcm0uY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9iZWFjb25fc3dhcm0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTYyYWQuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvYmVhY29uX3N3YXJtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImJlYWNvbl9zd2FybS5oIgotCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmgiCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLWJvb2wgQmVhY29uU3dhcm06OnJlZ2lzdGVyZWRfID0gRGV2aWNlQm91dGlxdWU6OlJlZ2lzdGVyKCJiZWFjb25fc3dhcm0iLCAmQmVhY29uU3dhcm06OkNyZWF0ZSk7Ci0KLUJlYWNvblN3YXJtOjpCZWFjb25Td2FybSgpIHsKLSAgYWR2ZXJ0aXNpbmdfaW50ZXJ2YWxfbXNfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMjgwKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50VHlwZSgweDAzIC8qIE5PTl9DT05ORUNUICovKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50KHsKLSAgICAgIDB4MTUsICAvLyBMZW5ndGgKLSAgICAgIDB4MDkgLyogVFlQRV9OQU1FX0NNUEwgKi8sCi0gICAgICAnZycsCi0gICAgICAnRCcsCi0gICAgICAnZScsCi0gICAgICAndicsCi0gICAgICAnaScsCi0gICAgICAnYycsCi0gICAgICAnZScsCi0gICAgICAnLScsCi0gICAgICAnYicsCi0gICAgICAnZScsCi0gICAgICAnYScsCi0gICAgICAnYycsCi0gICAgICAnbycsCi0gICAgICAnbicsCi0gICAgICAnXycsCi0gICAgICAncycsCi0gICAgICAndycsCi0gICAgICAnYScsCi0gICAgICAncicsCi0gICAgICAnbScsCi0gICAgICAweDAyLCAgLy8gTGVuZ3RoCi0gICAgICAweDAxIC8qIFRZUEVfRkxBRyAqLywKLSAgICAgIDB4NCAvKiBCUkVEUl9OT1RfU1BUICovIHwgMHgyIC8qIEdFTl9ESVNDX0ZMQUcgKi8sCi0gIH0pOwotCi0gIHByb3BlcnRpZXNfLlNldExlU2NhblJlc3BvbnNlKHsweDA2LCAgLy8gTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4IC8qIFRZUEVfTkFNRV9TSE9SVCAqLywgJ2MnLCAnYicsICdlJywgJ2EnLCAnYyd9KTsKLX0KLQotdm9pZCBCZWFjb25Td2FybTo6SW5pdGlhbGl6ZShjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gIGlmIChhcmdzLnNpemUoKSA8IDIpIHJldHVybjsKLQotICBBZGRyZXNzIGFkZHJ7fTsKLSAgaWYgKEFkZHJlc3M6OkZyb21TdHJpbmcoYXJnc1sxXSwgYWRkcikpIHByb3BlcnRpZXNfLlNldExlQWRkcmVzcyhhZGRyKTsKLQotICBpZiAoYXJncy5zaXplKCkgPCAzKSByZXR1cm47Ci0KLSAgU2V0QWR2ZXJ0aXNlbWVudEludGVydmFsKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc3RkOjpzdG9pKGFyZ3NbMl0pKSk7Ci19Ci0KLXZvaWQgQmVhY29uU3dhcm06OlRpbWVyVGljaygpIHsKLSAgQWRkcmVzcyBiZWFjb25fYWRkciA9IHByb3BlcnRpZXNfLkdldExlQWRkcmVzcygpOwotICB1aW50OF90KiBsb3dfb3JkZXJfYnl0ZSA9ICh1aW50OF90KikoJmJlYWNvbl9hZGRyKTsKLSAgKmxvd19vcmRlcl9ieXRlICs9IDE7Ci0gIHByb3BlcnRpZXNfLlNldExlQWRkcmVzcyhiZWFjb25fYWRkcik7Ci0gIEJlYWNvbjo6VGltZXJUaWNrKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2JlYWNvbl9zd2FybS5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvYmVhY29uX3N3YXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYmZkNzUuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvYmVhY29uX3N3YXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiYmVhY29uLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi0vLyBQcmV0ZW5kIHRvIGJlIGEgbG90IG9mIGJlYWNvbnMgYnkgY2hhbmdpbmcgdGhlIGFkdmVydGlzaW5nIGFkZHJlc3MuCi1jbGFzcyBCZWFjb25Td2FybSA6IHB1YmxpYyBCZWFjb24gewotIHB1YmxpYzoKLSAgQmVhY29uU3dhcm0oKTsKLSAgdmlydHVhbCB+QmVhY29uU3dhcm0oKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IENyZWF0ZSgpIHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxCZWFjb25Td2FybT4oKTsKLSAgfQotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VHlwZVN0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gImJlYWNvbl9zd2FybSI7Ci0gIH0KLQotICAvLyBTZXQgdGhlIGFkZHJlc3MgYW5kIGFkdmVydGlzaW5nIGludGVydmFsIGZyb20gc3RyaW5nIGFyZ3MuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGJvb2wgcmVnaXN0ZXJlZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9icm9rZW5fYWR2LmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvYnJva2VuX2Fkdi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkYzJkMS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9icm9rZW5fYWR2LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJicm9rZW5fYWR2LmgiCi0KLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9kZXZpY2VfYm91dGlxdWUuaCIKLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1ib29sIEJyb2tlbkFkdjo6cmVnaXN0ZXJlZF8gPSBEZXZpY2VCb3V0aXF1ZTo6UmVnaXN0ZXIoImJyb2tlbl9hZHYiLCAmQnJva2VuQWR2OjpDcmVhdGUpOwotCi1Ccm9rZW5BZHY6OkJyb2tlbkFkdigpIHsKLSAgYWR2ZXJ0aXNpbmdfaW50ZXJ2YWxfbXNfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMjgwKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50VHlwZSgweDAzIC8qIE5PTl9DT05ORUNUICovKTsKLSAgY29uc3RhbnRfYWR2X2RhdGFfID0gewotICAgICAgMHgwMiwgICAgICAgLy8gTGVuZ3RoCi0gICAgICAweDAxLCAgICAgICAvLyBUWVBFX0ZMQUcKLSAgICAgIDB4NCB8IDB4MiwgIC8vIEJSRURSX05PVF9TUFQgfCAgR0VOX0RJU0NfRkxBRwotICAgICAgMHgxMywgICAgICAgLy8gTGVuZ3RoCi0gICAgICAweDA5LCAgICAgICAvLyBUWVBFX05BTUVfQ01QTAotICAgICAgJ2cnLCAgICAgICAnRCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnLCAnLScsICdiJywgJ3InLCAnbycsICdrJywgJ2UnLCAnbicsICdfJywgJ2EnLCAnZCcsICd2JywKLSAgfTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50KGNvbnN0YW50X2Fkdl9kYXRhXyk7Ci0KLSAgcHJvcGVydGllc18uU2V0TGVTY2FuUmVzcG9uc2UoezB4MGIsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgsICAvLyBUWVBFX05BTUVfU0hPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJywgJ3InLCAnbycsICdrJywgJ2UnLCAnbicsICduJywgJ2UnLCAncycsICdzJ30pOwotCi0gIHByb3BlcnRpZXNfLlNldEV4dGVuZGVkSW5xdWlyeURhdGEoezB4MDcsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwgIC8vIFRZUEVfTkFNRV9DT01QTEVURQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicsICdSJywgJzAnLCAnSycsICczJywgJ04nfSk7Ci0gIHByb3BlcnRpZXNfLlNldFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUoMCk7Ci0gIHBhZ2Vfc2Nhbl9kZWxheV9tc18gPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDYwMCk7Ci19Ci0KLXZvaWQgQnJva2VuQWR2OjpJbml0aWFsaXplKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMikgcmV0dXJuOwotCi0gIEFkZHJlc3MgYWRkcnt9OwotICBpZiAoQWRkcmVzczo6RnJvbVN0cmluZyhhcmdzWzFdLCBhZGRyKSkgcHJvcGVydGllc18uU2V0TGVBZGRyZXNzKGFkZHIpOwotCi0gIGlmIChhcmdzLnNpemUoKSA8IDMpIHJldHVybjsKLQotICBTZXRBZHZlcnRpc2VtZW50SW50ZXJ2YWwoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhzdGQ6OnN0b2koYXJnc1syXSkpKTsKLX0KLQotLy8gTW9zdGx5IHJldHVybiB0aGUgY29ycmVjdCBsZW5ndGgKLXN0YXRpYyB1aW50OF90IHJhbmRvbV9sZW5ndGgoc2l6ZV90IGJ5dGVzX3JlbWFpbmluZykgewotICB1aW50MzJfdCByYW5kb21uZXNzID0gcmFuZCgpOwotCi0gIHN3aXRjaCAoKHJhbmRvbW5lc3MgJiAweGYwMDAwMDApID4+IDI0KSB7Ci0gICAgY2FzZSAoMCk6Ci0gICAgICByZXR1cm4gYnl0ZXNfcmVtYWluaW5nICsgKHJhbmRvbW5lc3MgJiAweGZmKTsKLSAgICBjYXNlICgxKToKLSAgICAgIHJldHVybiBieXRlc19yZW1haW5pbmcgLSAocmFuZG9tbmVzcyAmIDB4ZmYpOwotICAgIGNhc2UgKDIpOgotICAgICAgcmV0dXJuIGJ5dGVzX3JlbWFpbmluZyArIChyYW5kb21uZXNzICYgMHhmKTsKLSAgICBjYXNlICgzKToKLSAgICAgIHJldHVybiBieXRlc19yZW1haW5pbmcgLSAocmFuZG9tbmVzcyAmIDB4Zik7Ci0gICAgY2FzZSAoNSk6Ci0gICAgY2FzZSAoNik6Ci0gICAgICByZXR1cm4gYnl0ZXNfcmVtYWluaW5nICsgKHJhbmRvbW5lc3MgJiAweDMpOwotICAgIGNhc2UgKDcpOgotICAgIGNhc2UgKDgpOgotICAgICAgcmV0dXJuIGJ5dGVzX3JlbWFpbmluZyAtIChyYW5kb21uZXNzICYgMHgzKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJ5dGVzX3JlbWFpbmluZzsKLSAgfQotfQotCi1zdGF0aWMgc2l6ZV90IHJhbmRvbV9hZHZfdHlwZSgpIHsKLSAgdWludDMyX3QgcmFuZG9tbmVzcyA9IHJhbmQoKTsKLQotICBzd2l0Y2ggKChyYW5kb21uZXNzICYgMHhmMDAwMDAwKSA+PiAyNCkgewotICAgIGNhc2UgKDApOgotICAgICAgcmV0dXJuIDB4ZmY7ICAvLyBUWVBFX01BTlVGQUNUVVJFUl9TUEVDSUZJQwotICAgIGNhc2UgKDEpOgotICAgICAgcmV0dXJuIChyYW5kb21uZXNzICYgMHhmZik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmFuZG9tbmVzcyAmIDB4MWYpOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgcmFuZG9tX2RhdGFfbGVuZ3RoKHNpemVfdCBsZW5ndGgsIHNpemVfdCBieXRlc19yZW1haW5pbmcpIHsKLSAgdWludDMyX3QgcmFuZG9tbmVzcyA9IHJhbmQoKTsKLQotICBzd2l0Y2ggKChyYW5kb21uZXNzICYgMHhmMDAwMDAwKSA+PiAyNCkgewotICAgIGNhc2UgKDApOgotICAgICAgcmV0dXJuIGJ5dGVzX3JlbWFpbmluZzsKLSAgICBjYXNlICgxKToKLSAgICAgIHJldHVybiAobGVuZ3RoICsgKHJhbmRvbW5lc3MgJiAweGZmKSkgJSBieXRlc19yZW1haW5pbmc7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAobGVuZ3RoIDw9IGJ5dGVzX3JlbWFpbmluZyA/IGxlbmd0aCA6IGJ5dGVzX3JlbWFpbmluZyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgUmFuZG9taXplQWR2ZXJ0aXNlbWVudCh2ZWN0b3I8dWludDhfdD4mIGFkLCBzaXplX3QgbWF4KSB7Ci0gIHVpbnQ4X3QgbGVuZ3RoID0gcmFuZG9tX2xlbmd0aChtYXgpOwotICB1aW50OF90IGRhdGFfbGVuZ3RoID0gcmFuZG9tX2RhdGFfbGVuZ3RoKGxlbmd0aCwgbWF4KTsKLQotICBhZC5wdXNoX2JhY2socmFuZG9tX2Fkdl90eXBlKCkpOwotICBhZC5wdXNoX2JhY2sobGVuZ3RoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhX2xlbmd0aDsgaSsrKSBhZC5wdXNoX2JhY2socmFuZCgpICYgMHhmZik7Ci19Ci0KLXZvaWQgQnJva2VuQWR2OjpVcGRhdGVBZHZlcnRpc2VtZW50KCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZfZGF0YTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdGFudF9hZHZfZGF0YV8uc2l6ZSgpOyBpKyspIGFkdl9kYXRhLnB1c2hfYmFjayhjb25zdGFudF9hZHZfZGF0YV9baV0pOwotCi0gIFJhbmRvbWl6ZUFkdmVydGlzZW1lbnQoYWR2X2RhdGEsIDMxIC0gYWR2X2RhdGEuc2l6ZSgpKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50KGFkdl9kYXRhKTsKLQotICBhZHZfZGF0YS5jbGVhcigpOwotICBSYW5kb21pemVBZHZlcnRpc2VtZW50KGFkdl9kYXRhLCAzMSk7Ci0gIHByb3BlcnRpZXNfLlNldExlU2NhblJlc3BvbnNlKGFkdl9kYXRhKTsKLQotICBBZGRyZXNzIGxlX2FkZHIgPSBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKTsKLSAgdWludDhfdCogbG93X29yZGVyX2J5dGUgPSAodWludDhfdCopKCZsZV9hZGRyKTsKLSAgKmxvd19vcmRlcl9ieXRlICs9IDE7Ci0gIHByb3BlcnRpZXNfLlNldExlQWRkcmVzcyhsZV9hZGRyKTsKLX0KLQotc3RkOjpzdHJpbmcgQnJva2VuQWR2OjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgc3RyID0KLSAgICAgIERldmljZTo6VG9TdHJpbmcoKSArIHN0ZDo6c3RyaW5nKCI6IEludGVydmFsID0gIikgKyBzdGQ6OnRvX3N0cmluZyhhZHZlcnRpc2luZ19pbnRlcnZhbF9tc18uY291bnQoKSk7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLXZvaWQgQnJva2VuQWR2OjpVcGRhdGVQYWdlU2NhbigpIHsKLSAgUmFuZG9taXplQWR2ZXJ0aXNlbWVudChjb25zdGFudF9zY2FuX2RhdGFfLCAzMSk7Ci0KLSAgQWRkcmVzcyBwYWdlX2FkZHIgPSBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCk7Ci0gIHVpbnQ4X3QqIGxvd19vcmRlcl9ieXRlID0gKHVpbnQ4X3QqKSgmcGFnZV9hZGRyKTsKLSAgKmxvd19vcmRlcl9ieXRlICs9IDE7Ci0gIHByb3BlcnRpZXNfLlNldEFkZHJlc3MocGFnZV9hZGRyKTsKLX0KLQotdm9pZCBCcm9rZW5BZHY6OlRpbWVyVGljaygpIHsKLSAgVXBkYXRlUGFnZVNjYW4oKTsKLSAgVXBkYXRlQWR2ZXJ0aXNlbWVudCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9icm9rZW5fYWR2LmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9icm9rZW5fYWR2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzE2NzYuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvYnJva2VuX2Fkdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImRldmljZS5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgQnJva2VuQWR2IDogcHVibGljIERldmljZSB7Ci0gcHVibGljOgotICBCcm9rZW5BZHYoKTsKLSAgfkJyb2tlbkFkdigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPERldmljZT4gQ3JlYXRlKCkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEJyb2tlbkFkdj4oKTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgdGhlIGRldmljZSBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIHxhcmdzfC4KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSBvdmVycmlkZTsKLQotICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgb2YgZGV2aWNlLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFR5cGVTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJicm9rZW5fYWR2IjsKLSAgfQotCi0gIC8vIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBVc2UgdGhlIHRpbWVyIHRpY2sgdG8gdXBkYXRlIGFkdmVydGlzZW1lbnRzLgotICB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlOwotCi0gIC8vIENoYW5nZSB3aGljaCBhZHZlcnRpc2VtZW50cyBhcmUgYnJva2VuIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLgotICB2b2lkIFVwZGF0ZUFkdmVydGlzZW1lbnQoKTsKLQotICAvLyBDaGFuZ2Ugd2hpY2ggZGF0YSBpcyBicm9rZW4gYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCi0gIHZvaWQgVXBkYXRlUGFnZVNjYW4oKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbnN0YW50X2Fkdl9kYXRhXzsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29uc3RhbnRfc2Nhbl9kYXRhXzsKLSAgc3RhdGljIGJvb2wgcmVnaXN0ZXJlZF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9jYXJfa2l0LmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvY2FyX2tpdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwYmUwZC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9jYXJfa2l0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjYXJfa2l0LmgiCi0KLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9kZXZpY2VfYm91dGlxdWUuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1ib29sIENhcktpdDo6cmVnaXN0ZXJlZF8gPSBEZXZpY2VCb3V0aXF1ZTo6UmVnaXN0ZXIoImNhcl9raXQiLCAmQ2FyS2l0OjpDcmVhdGUpOwotY29uc3Qgc3RkOjpzdHJpbmcga0NhcktpdFByb3BlcnRpZXNGaWxlID0KLSAgICAiL2V0Yy9ibHVldG9vdGgvY2FyX2tpdF9jb250cm9sbGVyX3Byb3BlcnRpZXMuanNvbiI7Ci0KLUNhcktpdDo6Q2FyS2l0KCkgOiBEZXZpY2Uoa0NhcktpdFByb3BlcnRpZXNGaWxlKSB7Ci0gIGFkdmVydGlzaW5nX2ludGVydmFsX21zXyA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCk7Ci0KLSAgcGFnZV9zY2FuX2RlbGF5X21zXyA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNjAwKTsKLQotICAvLyBTdHViIGluIHBhY2tldCBoYW5kbGluZyBmb3Igbm93Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVnaXN0ZXJBY2xDaGFubmVsKAotICAgICAgW10oc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpBY2xCdWlsZGVyPikge30pOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlZ2lzdGVyRXZlbnRDaGFubmVsKAotICAgICAgW10oc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpFdmVudEJ1aWxkZXI+KSB7fSk7Ci0gIGxpbmtfbGF5ZXJfY29udHJvbGxlcl8uUmVnaXN0ZXJTY29DaGFubmVsKAotICAgICAgW10oc3RkOjpzaGFyZWRfcHRyPGJsdWV0b290aDo6aGNpOjpTY29CdWlsZGVyPikge30pOwotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlJlZ2lzdGVyUmVtb3RlQ2hhbm5lbCgKLSAgICAgIFt0aGlzXShzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHBhY2tldCwKLSAgICAgICAgICAgICBQaHk6OlR5cGUgcGh5X3R5cGUpIHsKLSAgICAgICAgQ2FyS2l0OjpTZW5kTGlua0xheWVyUGFja2V0KHBhY2tldCwgcGh5X3R5cGUpOwotICAgICAgfSk7Ci0KLSAgcHJvcGVydGllc18uU2V0UGFnZVNjYW5SZXBldGl0aW9uTW9kZSgwKTsKLSAgcHJvcGVydGllc18uU2V0Q2xhc3NPZkRldmljZSgweDYwMDQyMCk7Ci0gIHByb3BlcnRpZXNfLlNldEV4dGVuZGVkRmVhdHVyZXMoMHg4Nzc5ZmY5YmZlOGRlZmZmLCAwKTsKLSAgcHJvcGVydGllc18uU2V0RXh0ZW5kZWRJbnF1aXJ5RGF0YSh7Ci0gICAgICAxNiwgIC8vIGxlbmd0aAotICAgICAgOSwgICAvLyBUeXBlOiBEZXZpY2UgTmFtZQotICAgICAgJ2cnLCAgJ0QnLCAnZScsICd2JywgJ2knLCAnYycsICdlJywgJy0nLCAnYycsICdhJywgJ3InLCAnXycsICdrJywgJ2knLCAndCcsCi0gICAgICA3LCAgICAgLy8gbGVuZ3RoCi0gICAgICAzLCAgICAgLy8gVHlwZTogMTYtYml0IFVVSURzCi0gICAgICAweDBlLCAgLy8gQVZSQwotICAgICAgMHgxMSwKLSAgICAgIDB4MEIsICAvLyBBdWRpbyBTaW5rCi0gICAgICAweDExLAotICAgICAgMHgwMCwgIC8vIFBuUCBJbmZvcm1hdGlvbgotICAgICAgMHgxMiwKLSAgfSk7Ci0gIHByb3BlcnRpZXNfLlNldE5hbWUoewotICAgICAgJ2cnLAotICAgICAgJ0QnLAotICAgICAgJ2UnLAotICAgICAgJ3YnLAotICAgICAgJ2knLAotICAgICAgJ2MnLAotICAgICAgJ2UnLAotICAgICAgJy0nLAotICAgICAgJ0MnLAotICAgICAgJ2EnLAotICAgICAgJ3InLAotICAgICAgJ18nLAotICAgICAgJ0snLAotICAgICAgJ2knLAotICAgICAgJ3QnLAotICB9KTsKLX0KLQotdm9pZCBDYXJLaXQ6OkluaXRpYWxpemUoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPCAyKSByZXR1cm47Ci0KLSAgQWRkcmVzcyBhZGRye307Ci0gIGlmIChBZGRyZXNzOjpGcm9tU3RyaW5nKGFyZ3NbMV0sIGFkZHIpKSBwcm9wZXJ0aWVzXy5TZXRBZGRyZXNzKGFkZHIpOwotICBMT0dfSU5GTygiJXMgU2V0QWRkcmVzcyAlcyIsIFRvU3RyaW5nKCkuY19zdHIoKSwgYWRkci5Ub1N0cmluZygpLmNfc3RyKCkpOwotCi0gIGlmIChhcmdzLnNpemUoKSA8IDMpIHJldHVybjsKLQotICBwcm9wZXJ0aWVzXy5TZXRDbG9ja09mZnNldChzdGQ6OnN0b2koYXJnc1syXSkpOwotfQotCi12b2lkIENhcktpdDo6VGltZXJUaWNrKCkgewotICBsaW5rX2xheWVyX2NvbnRyb2xsZXJfLlRpbWVyVGljaygpOwotfQotCi12b2lkIENhcktpdDo6SW5jb21pbmdQYWNrZXQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSB7Ci0gIExPR19XQVJOKCJJbmNvbWluZyBQYWNrZXQiKTsKLSAgbGlua19sYXllcl9jb250cm9sbGVyXy5JbmNvbWluZ1BhY2tldChwYWNrZXQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9jYXJfa2l0LmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9jYXJfa2l0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmQ0MzEuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvY2FyX2tpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImRldmljZS5oIgotI2luY2x1ZGUgImhjaS9oY2lfcGFja2V0cy5oIgotI2luY2x1ZGUgIm1vZGVsL2NvbnRyb2xsZXIvbGlua19sYXllcl9jb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1jbGFzcyBDYXJLaXQgOiBwdWJsaWMgRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIENhcktpdCgpOwotICB+Q2FyS2l0KCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q2FyS2l0PiBDcmVhdGUoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FyS2l0PigpOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgfGFyZ3N8LgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VHlwZVN0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gImNhcl9raXQiOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIEluY29taW5nUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgVGltZXJUaWNrKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBMaW5rTGF5ZXJDb250cm9sbGVyIGxpbmtfbGF5ZXJfY29udHJvbGxlcl97cHJvcGVydGllc199OwotICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2NsYXNzaWMuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9jbGFzc2ljLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY5NTE3Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2NsYXNzaWMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY2xhc3NpYy5oIgotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2RldmljZV9ib3V0aXF1ZS5oIgotCi11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWJvb2wgQ2xhc3NpYzo6cmVnaXN0ZXJlZF8gPSBEZXZpY2VCb3V0aXF1ZTo6UmVnaXN0ZXIoImNsYXNzaWMiLCAmQ2xhc3NpYzo6Q3JlYXRlKTsKLQotQ2xhc3NpYzo6Q2xhc3NpYygpIHsKLSAgYWR2ZXJ0aXNpbmdfaW50ZXJ2YWxfbXNfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKTsKLSAgcHJvcGVydGllc18uU2V0Q2xhc3NPZkRldmljZSgweDMwMjAxKTsKLQotICBwcm9wZXJ0aWVzXy5TZXRFeHRlbmRlZElucXVpcnlEYXRhKHsweDEwLCAgLy8gTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksICAvLyBUWVBFX05BTUVfQ01QTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycsICdEJywgJ2UnLCAndicsICdpJywgJ2MnLCAnZScsICctJywgJ2MnLCAnbCcsICdhJywgJ3MnLCAncycsICdpJywgJ2MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXDAnfSk7ICAvLyBFbmQgb2YgZGF0YQotICBwcm9wZXJ0aWVzXy5TZXRQYWdlU2NhblJlcGV0aXRpb25Nb2RlKDApOwotICBwcm9wZXJ0aWVzXy5TZXRFeHRlbmRlZEZlYXR1cmVzKDB4ODc1OTNGOWJGRThGRkVGRiwgMCk7Ci0KLSAgcGFnZV9zY2FuX2RlbGF5X21zXyA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNjAwKTsKLX0KLQotdm9pZCBDbGFzc2ljOjpJbml0aWFsaXplKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMikgcmV0dXJuOwotCi0gIEFkZHJlc3MgYWRkcnt9OwotICBpZiAoQWRkcmVzczo6RnJvbVN0cmluZyhhcmdzWzFdLCBhZGRyKSkgcHJvcGVydGllc18uU2V0QWRkcmVzcyhhZGRyKTsKLQotICBpZiAoYXJncy5zaXplKCkgPCAzKSByZXR1cm47Ci0KLSAgcHJvcGVydGllc18uU2V0Q2xvY2tPZmZzZXQoc3RkOjpzdG9pKGFyZ3NbMl0pKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvY2xhc3NpYy5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvY2xhc3NpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI0NjZiLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2NsYXNzaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJkZXZpY2UuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIENsYXNzaWMgOiBwdWJsaWMgRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIENsYXNzaWMoKTsKLSAgfkNsYXNzaWMoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IENyZWF0ZSgpIHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDbGFzc2ljPigpOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgfGFyZ3N8LgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VHlwZVN0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gImNsYXNzaWMiOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZS5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5Y2MxNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9kZXZpY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1zdGQ6OnN0cmluZyBEZXZpY2U6OlRvU3RyaW5nKCkgY29uc3QgewotICBzdGQ6OnN0cmluZyBkZXYgPSBHZXRUeXBlU3RyaW5nKCkgKyAiQCIgKyBwcm9wZXJ0aWVzXy5HZXRBZGRyZXNzKCkuVG9TdHJpbmcoKTsKLQotICByZXR1cm4gZGV2OwotfQotCi12b2lkIERldmljZTo6UmVnaXN0ZXJQaHlMYXllcihzdGQ6OnNoYXJlZF9wdHI8UGh5TGF5ZXI+IHBoeSkgewotICBwaHlfbGF5ZXJzXy5wdXNoX2JhY2socGh5KTsKLX0KLQotdm9pZCBEZXZpY2U6OlVucmVnaXN0ZXJQaHlMYXllcnMoKSB7Ci0gIGZvciAoYXV0byBwaHkgOiBwaHlfbGF5ZXJzXykgewotICAgIGlmIChwaHkgIT0gbnVsbHB0cikgewotICAgICAgcGh5LT5VbnJlZ2lzdGVyKCk7Ci0gICAgfQotICB9Ci0gIHBoeV9sYXllcnNfLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpVbnJlZ2lzdGVyUGh5TGF5ZXIoUGh5OjpUeXBlIHBoeV90eXBlLCB1aW50MzJfdCBmYWN0b3J5X2lkKSB7Ci0gIGZvciAoYXV0byYgcGh5IDogcGh5X2xheWVyc18pIHsKLSAgICBpZiAocGh5ICE9IG51bGxwdHIgJiYgcGh5LT5Jc0ZhY3RvcnlJZChmYWN0b3J5X2lkKSAmJgotICAgICAgICBwaHktPkdldFR5cGUoKSA9PSBwaHlfdHlwZSkgewotICAgICAgcGh5LT5VbnJlZ2lzdGVyKCk7Ci0gICAgICBwaHkucmVzZXQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBEZXZpY2U6OklzQWR2ZXJ0aXNlbWVudEF2YWlsYWJsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChhZHZlcnRpc2luZ19pbnRlcnZhbF9tc18gPiBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApKSAmJgotICAgICAgICAgKHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpID49IGxhc3RfYWR2ZXJ0aXNlbWVudF8gKyBhZHZlcnRpc2luZ19pbnRlcnZhbF9tc18pOwotfQotCi12b2lkIERldmljZTo6U2VuZExpbmtMYXllclBhY2tldCgKLSAgICBzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHRvX3NlbmQsCi0gICAgUGh5OjpUeXBlIHBoeV90eXBlKSB7Ci0gIGZvciAoYXV0byBwaHkgOiBwaHlfbGF5ZXJzXykgewotICAgIGlmIChwaHkgIT0gbnVsbHB0ciAmJiBwaHktPkdldFR5cGUoKSA9PSBwaHlfdHlwZSkgewotICAgICAgcGh5LT5TZW5kKHRvX3NlbmQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIERldmljZTo6U2VuZExpbmtMYXllclBhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyB0b19zZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5OjpUeXBlIHBoeV90eXBlKSB7Ci0gIGZvciAoYXV0byBwaHkgOiBwaHlfbGF5ZXJzXykgewotICAgIGlmIChwaHkgIT0gbnVsbHB0ciAmJiBwaHktPkdldFR5cGUoKSA9PSBwaHlfdHlwZSkgewotICAgICAgcGh5LT5TZW5kKHRvX3NlbmQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIERldmljZTo6Q2xvc2UoKSAgewotICBpZiAoY2xvc2VfY2FsbGJhY2tfKSB7Ci0gICAgY2xvc2VfY2FsbGJhY2tfKCk7Ci0gIH0KLX0KLQotdm9pZCBEZXZpY2U6OlJlZ2lzdGVyQ2xvc2VDYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY2xvc2VfY2FsbGJhY2spIHsKLSAgIGNsb3NlX2NhbGxiYWNrXyA9IGNsb3NlX2NhbGxiYWNrOwotfQotCi12b2lkIERldmljZTo6U2V0QWRkcmVzcyhBZGRyZXNzKSB7Ci0gIExPR19JTkZPKCIlcyBkb2VzIG5vdCBpbXBsZW1lbnQgJXMiLCBHZXRUeXBlU3RyaW5nKCkuY19zdHIoKSwgX19mdW5jX18pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9kZXZpY2UuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzVlN2U2Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJoY2kvYWRkcmVzcy5oIgotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvZGV2aWNlX3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9waHlfbGF5ZXIuaCIKLQotI2luY2x1ZGUgInBhY2tldHMvbGlua19sYXllcl9wYWNrZXRzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyA6OmJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotCi0vLyBSZXByZXNlbnQgYSBCbHVldG9vdGggRGV2aWNlCi0vLyAgLSBQcm92aWRlIEdldCooKSBhbmQgU2V0KigpIGZ1bmN0aW9ucyBmb3IgZGV2aWNlIGF0dHJpYnV0ZXMuCi1jbGFzcyBEZXZpY2UgewotIHB1YmxpYzoKLSAgRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nIHByb3BlcnRpZXNfZmlsZW5hbWUgPSAiIikKLSAgICAgIDogbGFzdF9hZHZlcnRpc2VtZW50XyhzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSksIHByb3BlcnRpZXNfKHByb3BlcnRpZXNfZmlsZW5hbWUpIHt9Ci0gIHZpcnR1YWwgfkRldmljZSgpID0gZGVmYXVsdDsKLQotICAvLyBJbml0aWFsaXplIHRoZSBkZXZpY2UgYmFzZWQgb24gdGhlIHZhbHVlcyBvZiB8YXJnc3wuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgPSAwOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VHlwZVN0cmluZygpIGNvbnN0ID0gMDsKLQotICAvLyBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gYWNjZXB0IGEgY29ubmVjdGlvbiByZXF1ZXN0Ci0gIC8vIE1heSBuZWVkIHRvIGJlIGV4dGVuZGVkIHRvIGNoZWNrIHBlZXIgYWRkcmVzcyAmIHR5cGUsIGFuZCBvdGhlcgotICAvLyBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCi0gIC8vIFJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgYWNjZXB0cyB0aGUgY29ubmVjdGlvbiByZXF1ZXN0LgotICB2aXJ0dWFsIGJvb2wgTGVDb25uZWN0KCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNldCB0aGUgZGV2aWNlJ3MgQmx1ZXRvb3RoIGFkZHJlc3MuCi0gIHZpcnR1YWwgdm9pZCBTZXRBZGRyZXNzKEFkZHJlc3MgYWRkcmVzcyk7Ci0KLSAgLy8gU2V0IHRoZSBhZHZlcnRpc2VtZW50IGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4KLSAgdm9pZCBTZXRBZHZlcnRpc2VtZW50SW50ZXJ2YWwoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtcykgewotICAgIGFkdmVydGlzaW5nX2ludGVydmFsX21zXyA9IG1zOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBob3N0IGNvdWxkIHNlZSBhbiBhZHZlcnRpc2VtZW50IGFib3V0IG5vdy4KLSAgdmlydHVhbCBib29sIElzQWR2ZXJ0aXNlbWVudEF2YWlsYWJsZSgpIGNvbnN0OwotCi0gIC8vIExldCB0aGUgZGV2aWNlIGtub3cgdGhhdCB0aW1lIGhhcyBwYXNzZWQuCi0gIHZpcnR1YWwgdm9pZCBUaW1lclRpY2soKSB7fQotCi0gIHZvaWQgUmVnaXN0ZXJQaHlMYXllcihzdGQ6OnNoYXJlZF9wdHI8UGh5TGF5ZXI+IHBoeSk7Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyUGh5TGF5ZXJzKCk7Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyUGh5TGF5ZXIoUGh5OjpUeXBlIHBoeV90eXBlLCB1aW50MzJfdCBmYWN0b3J5X2lkKTsKLQotICB2aXJ0dWFsIHZvaWQgSW5jb21pbmdQYWNrZXQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcpe307Ci0KLSAgdmlydHVhbCB2b2lkIFNlbmRMaW5rTGF5ZXJQYWNrZXQoCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHBhY2tldCwKLSAgICAgIFBoeTo6VHlwZSBwaHlfdHlwZSk7Ci0gIHZpcnR1YWwgdm9pZCBTZW5kTGlua0xheWVyUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5OjpUeXBlIHBoeV90eXBlKTsKLQotCi0gIHZpcnR1YWwgdm9pZCBDbG9zZSgpOwotCi0gIHZvaWQgUmVnaXN0ZXJDbG9zZUNhbGxiYWNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQaHlMYXllcj4+IHBoeV9sYXllcnNfOwotCi0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdF9hZHZlcnRpc2VtZW50XzsKLQotICAvLyBUaGUgdGltZSBiZXR3ZWVuIHBhZ2Ugc2NhbnMuCi0gIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgcGFnZV9zY2FuX2RlbGF5X21zX3t9OwotCi0gIC8vIFRoZSBzcGVjIGRlZmluZXMgdGhlIGFkdmVydGlzaW5nIGludGVydmFsIGFzIGEgMTYtYml0IHZhbHVlLCBidXQgc2luY2UgaXQKLSAgLy8gaXMgbmV2ZXIgc2VudCBpbiBwYWNrZXRzLCB3ZSB1c2Ugc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcy4KLSAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBhZHZlcnRpc2luZ19pbnRlcnZhbF9tc197fTsKLQotICBEZXZpY2VQcm9wZXJ0aWVzIHByb3BlcnRpZXNfOwotCi0gIC8vIENhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGlzIGRldmljZSBpcyBjbG9zZWQuCi0gIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjbG9zZV9jYWxsYmFja187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9kZXZpY2VfcHJvcGVydGllcy5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZV9wcm9wZXJ0aWVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzA5M2U4Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZV9wcm9wZXJ0aWVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImRldmljZV9wcm9wZXJ0aWVzLmgiCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImpzb24vanNvbi5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiCi0KLXN0YXRpYyB2b2lkIFBhcnNlVWludDh0KEpzb246OlZhbHVlIHZhbHVlLCB1aW50OF90KiBmaWVsZCkgewotICBpZiAodmFsdWUuaXNTdHJpbmcoKSkgewotICAgICpmaWVsZCA9IHN0ZDo6c3RvaSh2YWx1ZS5hc1N0cmluZygpLCBudWxscHRyLCAwKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBQYXJzZVVpbnQxNnQoSnNvbjo6VmFsdWUgdmFsdWUsIHVpbnQxNl90KiBmaWVsZCkgewotICBpZiAodmFsdWUuaXNTdHJpbmcoKSkgewotICAgICpmaWVsZCA9IHN0ZDo6c3RvaSh2YWx1ZS5hc1N0cmluZygpLCBudWxscHRyLCAwKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBQYXJzZUhleDY0KEpzb246OlZhbHVlIHZhbHVlLCB1aW50NjRfdCogZmllbGQpIHsKLSAgaWYgKHZhbHVlLmlzU3RyaW5nKCkpIHsKLSAgICBzaXplX3QgZW5kX2NoYXIgPSAwOwotICAgIHVpbnQ2NF90IHBhcnNlZCA9IHN0ZDo6c3RvbGwodmFsdWUuYXNTdHJpbmcoKSwgJmVuZF9jaGFyLCAxNik7Ci0gICAgaWYgKGVuZF9jaGFyID4gMCkgewotICAgICAgKmZpZWxkID0gcGFyc2VkOwotICAgIH0KLSAgfQotfQotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotRGV2aWNlUHJvcGVydGllczo6RGV2aWNlUHJvcGVydGllcyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKQotICAgIDogYWNsX2RhdGFfcGFja2V0X3NpemVfKDEwMjQpLAotICAgICAgc2NvX2RhdGFfcGFja2V0X3NpemVfKDI1NSksCi0gICAgICBudW1fYWNsX2RhdGFfcGFja2V0c18oMTApLAotICAgICAgbnVtX3Njb19kYXRhX3BhY2tldHNfKDEwKSwKLSAgICAgIHZlcnNpb25fKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJsdWV0b290aDo6aGNpOjpIY2lWZXJzaW9uOjpWXzRfMSkpLAotICAgICAgcmV2aXNpb25fKDApLAotICAgICAgbG1wX3BhbF92ZXJzaW9uXyhzdGF0aWNfY2FzdDx1aW50OF90PihibHVldG9vdGg6OmhjaTo6TG1wVmVyc2lvbjo6Vl80XzEpKSwKLSAgICAgIG1hbnVmYWN0dXJlcl9uYW1lXygwKSwKLSAgICAgIGxtcF9wYWxfc3VidmVyc2lvbl8oMCksCi0gICAgICBsZV9kYXRhX3BhY2tldF9sZW5ndGhfKDI3KSwKLSAgICAgIG51bV9sZV9kYXRhX3BhY2tldHNfKDIwKSwKLSAgICAgIGxlX2Nvbm5lY3RfbGlzdF9zaXplXygxNSksCi0gICAgICBsZV9yZXNvbHZpbmdfbGlzdF9zaXplXygxNSkgewotICBzdGQ6OnN0cmluZyBwcm9wZXJ0aWVzX3JhdzsKLQotICBBU1NFUlQoQWRkcmVzczo6RnJvbVN0cmluZygiQkI6QkI6QkI6QkI6QkI6QUQiLCBhZGRyZXNzXykpOwotICBBU1NFUlQoQWRkcmVzczo6RnJvbVN0cmluZygiQkI6QkI6QkI6QkI6QUQ6MUUiLCBsZV9hZGRyZXNzXykpOwotICBuYW1lXyA9IHsnRCcsICdlJywgJ2YnLCAnYScsICd1JywgJ2wnLCAndCd9OwotCi0gIHN1cHBvcnRlZF9jb2RlY3NfID0gezB9OyAgLy8gT25seSBTQkMgaXMgc3VwcG9ydGVkLgotICB2ZW5kb3Jfc3BlY2lmaWNfY29kZWNzXyA9IHt9OwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzU7IGkrKykgc3VwcG9ydGVkX2NvbW1hbmRzX1tpXSA9IDB4ZmY7Ci0gIC8vIE1hcmsgSENJX0xFX1RyYW5zbWl0dGVyX1Rlc3RbdjJdIGFuZCBuZXdlciBjb21tYW5kcyBhcyB1bnN1cHBvcnRlZAotICAvLyBVc2UgU2V0U3VwcG9ydGVkQ29tYW5kcygpIHRvIGNoYW5nZSB3aGF0J3Mgc3VwcG9ydGVkLgotICBmb3IgKGludCBpID0gMzU7IGkgPCA2NDsgaSsrKSBzdXBwb3J0ZWRfY29tbWFuZHNfW2ldID0gMHgwMDsKLQotICBsZV9zdXBwb3J0ZWRfZmVhdHVyZXNfID0gMHgxZjsKLSAgbGVfc3VwcG9ydGVkX3N0YXRlc18gPSAweDNmZmZmZmZmZmZmOwotICBsZV92ZW5kb3JfY2FwXyA9IHt9OwotCi0gIGlmIChmaWxlX25hbWUuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19JTkZPKCJSZWFkaW5nIGNvbnRyb2xsZXIgcHJvcGVydGllcyBmcm9tICVzLiIsIGZpbGVfbmFtZS5jX3N0cigpKTsKLQotICBzdGQ6Omlmc3RyZWFtIGZpbGUoZmlsZV9uYW1lKTsKLQotICBKc29uOjpWYWx1ZSByb290OwotICBKc29uOjpDaGFyUmVhZGVyQnVpbGRlciBidWlsZGVyOwotCi0gIHN0ZDo6c3RyaW5nIGVycnM7Ci0gIGlmICghSnNvbjo6cGFyc2VGcm9tU3RyZWFtKGJ1aWxkZXIsIGZpbGUsICZyb290LCAmZXJycykpIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIHJlYWRpbmcgY29udHJvbGxlciBwcm9wZXJ0aWVzIGZyb20gZmlsZTogJXMgZXJyb3I6ICVzIiwKLSAgICAgICAgICAgICAgZmlsZV9uYW1lLmNfc3RyKCksIGVycnMuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgUGFyc2VVaW50MTZ0KHJvb3RbIkFjbERhdGFQYWNrZXRTaXplIl0sICZhY2xfZGF0YV9wYWNrZXRfc2l6ZV8pOwotICBQYXJzZVVpbnQ4dChyb290WyJTY29EYXRhUGFja2V0U2l6ZSJdLCAmc2NvX2RhdGFfcGFja2V0X3NpemVfKTsKLSAgUGFyc2VVaW50OHQocm9vdFsiRW5jcnlwdGlvbktleVNpemUiXSwgJmVuY3J5cHRpb25fa2V5X3NpemVfKTsKLSAgUGFyc2VVaW50MTZ0KHJvb3RbIk51bUFjbERhdGFQYWNrZXRzIl0sICZudW1fYWNsX2RhdGFfcGFja2V0c18pOwotICBQYXJzZVVpbnQxNnQocm9vdFsiTnVtU2NvRGF0YVBhY2tldHMiXSwgJm51bV9zY29fZGF0YV9wYWNrZXRzXyk7Ci0gIFBhcnNlVWludDh0KHJvb3RbIlZlcnNpb24iXSwgJnZlcnNpb25fKTsKLSAgUGFyc2VVaW50MTZ0KHJvb3RbIlJldmlzaW9uIl0sICZyZXZpc2lvbl8pOwotICBQYXJzZVVpbnQ4dChyb290WyJMbXBQYWxWZXJzaW9uIl0sICZsbXBfcGFsX3ZlcnNpb25fKTsKLSAgUGFyc2VVaW50MTZ0KHJvb3RbIk1hbnVmYWN0dXJlck5hbWUiXSwgJm1hbnVmYWN0dXJlcl9uYW1lXyk7Ci0gIFBhcnNlVWludDE2dChyb290WyJMbXBQYWxTdWJ2ZXJzaW9uIl0sICZsbXBfcGFsX3N1YnZlcnNpb25fKTsKLSAgSnNvbjo6VmFsdWUgc3VwcG9ydGVkX2NvbW1hbmRzID0gcm9vdFsic3VwcG9ydGVkX2NvbW1hbmRzIl07Ci0gIGlmICghc3VwcG9ydGVkX2NvbW1hbmRzLmVtcHR5KCkpIHsKLSAgICB1c2Vfc3VwcG9ydGVkX2NvbW1hbmRzX2Zyb21fZmlsZV8gPSB0cnVlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzdXBwb3J0ZWRfY29tbWFuZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHN0ZDo6c3RyaW5nIG91dCA9IHN1cHBvcnRlZF9jb21tYW5kc1tpXS5hc1N0cmluZygpOwotICAgICAgdWludDhfdCBudW1iZXIgPSBzdG9pKG91dCwgbnVsbHB0ciwgMTYpOwotICAgICAgc3VwcG9ydGVkX2NvbW1hbmRzX1tpXSA9IG51bWJlcjsKLSAgICB9Ci0gIH0KLSAgUGFyc2VIZXg2NChyb290WyJMZVN1cHBvcnRlZEZlYXR1cmVzIl0sICZsZV9zdXBwb3J0ZWRfZmVhdHVyZXNfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvZGV2aWNlX3Byb3BlcnRpZXMuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2RldmljZV9wcm9wZXJ0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjFiNWYuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvZGV2aWNlX3Byb3BlcnRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiCi0jaW5jbHVkZSAiaGNpL2hjaV9wYWNrZXRzLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyA6OmJsdWV0b290aDo6aGNpOjpBZGRyZXNzOwotdXNpbmcgOjpibHVldG9vdGg6OmhjaTo6Q2xhc3NPZkRldmljZTsKLXVzaW5nIDo6Ymx1ZXRvb3RoOjpoY2k6OkV2ZW50Q29kZTsKLQotY2xhc3MgRGV2aWNlUHJvcGVydGllcyB7Ci0gcHVibGljOgotICBleHBsaWNpdCBEZXZpY2VQcm9wZXJ0aWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUgPSAiIik7Ci0KLSAgLy8gQWNjZXNzIHByaXZhdGUgY29uZmlndXJhdGlvbiBkYXRhCi0KLSAgLy8gU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDQuMiwgVm9sdW1lIDIsIFBhcnQgRSwgU2VjdGlvbiA3LjQuMQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgR2V0VmVyc2lvbkluZm9ybWF0aW9uKCkgY29uc3Q7Ci0KLSAgLy8gU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDQuMiwgVm9sdW1lIDIsIFBhcnQgRSwgU2VjdGlvbiA3LjQuMgotICBjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDY0PiYgR2V0U3VwcG9ydGVkQ29tbWFuZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN1cHBvcnRlZF9jb21tYW5kc187Ci0gIH0KLQotICB2b2lkIFNldFN1cHBvcnRlZENvbW1hbmRzKGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgNjQ+JiBjb21tYW5kcykgewotICAgIGlmICghdXNlX3N1cHBvcnRlZF9jb21tYW5kc19mcm9tX2ZpbGVfKSB7Ci0gICAgICBzdXBwb3J0ZWRfY29tbWFuZHNfID0gY29tbWFuZHM7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDQuMiwgVm9sdW1lIDIsIFBhcnQgRSwgU2VjdGlvbiA3LjQuMwotICB1aW50NjRfdCBHZXRTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gZXh0ZW5kZWRfZmVhdHVyZXNfWzBdOwotICB9Ci0KLSAgdm9pZCBTZXRFeHRlbmRlZEZlYXR1cmVzKHVpbnQ2NF90IGZlYXR1cmVzLCB1aW50OF90IHBhZ2VfbnVtYmVyKSB7Ci0gICAgQVNTRVJUKHBhZ2VfbnVtYmVyIDwgZXh0ZW5kZWRfZmVhdHVyZXNfLnNpemUoKSk7Ci0gICAgZXh0ZW5kZWRfZmVhdHVyZXNfW3BhZ2VfbnVtYmVyXSA9IGZlYXR1cmVzOwotICB9Ci0KLSAgYm9vbCBHZXRTZWN1cmVTaW1wbGVQYWlyaW5nU3VwcG9ydGVkKCkgY29uc3QgewotICAgIHVpbnQ2NF90IHNzcF9iaXQgPSAweDE7Ci0gICAgcmV0dXJuIGV4dGVuZGVkX2ZlYXR1cmVzX1sxXSAmIHNzcF9iaXQ7Ci0gIH0KLQotICB2b2lkIFNldFNlY3VyZVNpbXBsZVBhaXJpbmdTdXBwb3J0KGJvb2wgc3VwcG9ydGVkKSB7Ci0gICAgdWludDY0X3Qgc3NwX2JpdCA9IDB4MTsKLSAgICBleHRlbmRlZF9mZWF0dXJlc19bMV0gJj0gfnNzcF9iaXQ7Ci0gICAgaWYgKHN1cHBvcnRlZCkgewotICAgICAgZXh0ZW5kZWRfZmVhdHVyZXNfWzFdID0gZXh0ZW5kZWRfZmVhdHVyZXNfWzFdIHwgc3NwX2JpdDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNldExlSG9zdFN1cHBvcnQoYm9vbCBsZV9zdXBwb3J0ZWQpIHsKLSAgICB1aW50NjRfdCBsZV9iaXQgPSAweDI7Ci0gICAgZXh0ZW5kZWRfZmVhdHVyZXNfWzFdICY9IH5sZV9iaXQ7Ci0gICAgaWYgKGxlX3N1cHBvcnRlZCkgewotICAgICAgZXh0ZW5kZWRfZmVhdHVyZXNfWzFdID0gZXh0ZW5kZWRfZmVhdHVyZXNfWzFdIHwgbGVfYml0OwotICAgIH0KLSAgfQotCi0gIHZvaWQgU2V0U2VjdXJlQ29ubmVjdGlvbnMoYm9vbCBzdXBwb3J0ZWQpIHsKLSAgICB1aW50NjRfdCBzZWN1cmVfYml0ID0gMHg4OwotICAgIGV4dGVuZGVkX2ZlYXR1cmVzX1sxXSAmPSB+c2VjdXJlX2JpdDsKLSAgICBpZiAoc3VwcG9ydGVkKSB7Ci0gICAgICBleHRlbmRlZF9mZWF0dXJlc19bMV0gPSBleHRlbmRlZF9mZWF0dXJlc19bMV0gfCBzZWN1cmVfYml0OwotICAgIH0KLSAgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIsIFZvbHVtZSAyLCBQYXJ0IEUsIFNlY3Rpb24gNy40LjQKLSAgdWludDhfdCBHZXRFeHRlbmRlZEZlYXR1cmVzTWF4aW11bVBhZ2VOdW1iZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4dGVuZGVkX2ZlYXR1cmVzXy5zaXplKCkgLSAxOwotICB9Ci0KLSAgdWludDY0X3QgR2V0RXh0ZW5kZWRGZWF0dXJlcyh1aW50OF90IHBhZ2VfbnVtYmVyKSBjb25zdCB7Ci0gICAgQVNTRVJUKHBhZ2VfbnVtYmVyIDwgZXh0ZW5kZWRfZmVhdHVyZXNfLnNpemUoKSk7Ci0gICAgcmV0dXJuIGV4dGVuZGVkX2ZlYXR1cmVzX1twYWdlX251bWJlcl07Ci0gIH0KLQotICAvLyBTcGVjaWZpY2F0aW9uIFZlcnNpb24gNC4yLCBWb2x1bWUgMiwgUGFydCBFLCBTZWN0aW9uIDcuNC41Ci0gIHVpbnQxNl90IEdldEFjbERhdGFQYWNrZXRTaXplKCkgY29uc3QgewotICAgIHJldHVybiBhY2xfZGF0YV9wYWNrZXRfc2l6ZV87Ci0gIH0KLQotICB1aW50OF90IEdldFN5bmNocm9ub3VzRGF0YVBhY2tldFNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNjb19kYXRhX3BhY2tldF9zaXplXzsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0RW5jcnlwdGlvbktleVNpemUoKSBjb25zdCB7IHJldHVybiBlbmNyeXB0aW9uX2tleV9zaXplXzsgfQotCi0gIHVpbnQxNl90IEdldFZvaWNlU2V0dGluZygpIGNvbnN0IHsgcmV0dXJuIHZvaWNlX3NldHRpbmdfOyB9Ci0KLSAgdm9pZCBTZXRWb2ljZVNldHRpbmcodWludDE2X3Qgdm9pY2Vfc2V0dGluZykgewotICAgIHZvaWNlX3NldHRpbmdfID0gdm9pY2Vfc2V0dGluZzsKLSAgfQotCi0gIHVpbnQxNl90IEdldENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KCkgY29uc3QgewotICAgIHJldHVybiBjb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0XzsKLSAgfQotCi0gIHZvaWQgU2V0Q29ubmVjdGlvbkFjY2VwdFRpbWVvdXQodWludDE2X3QgY29ubmVjdGlvbl9hY2NlcHRfdGltZW91dCkgewotICAgIGNvbm5lY3Rpb25fYWNjZXB0X3RpbWVvdXRfID0gY29ubmVjdGlvbl9hY2NlcHRfdGltZW91dDsKLSAgfQotCi0gIHVpbnQxNl90IEdldFRvdGFsTnVtQWNsRGF0YVBhY2tldHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bV9hY2xfZGF0YV9wYWNrZXRzXzsKLSAgfQotCi0gIHVpbnQxNl90IEdldFRvdGFsTnVtU3luY2hyb25vdXNEYXRhUGFja2V0cygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtX3Njb19kYXRhX3BhY2tldHNfOwotICB9Ci0KLSAgY29uc3QgQWRkcmVzcyYgR2V0QWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gYWRkcmVzc187Ci0gIH0KLQotICB2b2lkIFNldEFkZHJlc3MoY29uc3QgQWRkcmVzcyYgYWRkcmVzcykgewotICAgIGFkZHJlc3NfID0gYWRkcmVzczsKLSAgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIsIFZvbHVtZSAyLCBQYXJ0IEUsIFNlY3Rpb24gNy40LjgKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIEdldFN1cHBvcnRlZENvZGVjcygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3VwcG9ydGVkX2NvZGVjc187Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIEdldFZlbmRvclNwZWNpZmljQ29kZWNzKCkgY29uc3QgewotICAgIHJldHVybiB2ZW5kb3Jfc3BlY2lmaWNfY29kZWNzXzsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0VmVyc2lvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gdmVyc2lvbl87Ci0gIH0KLQotICB1aW50MTZfdCBHZXRSZXZpc2lvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gcmV2aXNpb25fOwotICB9Ci0KLSAgdWludDhfdCBHZXRMbXBQYWxWZXJzaW9uKCkgY29uc3QgewotICAgIHJldHVybiBsbXBfcGFsX3ZlcnNpb25fOwotICB9Ci0KLSAgdWludDE2X3QgR2V0TG1wUGFsU3VidmVyc2lvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbG1wX3BhbF9zdWJ2ZXJzaW9uXzsKLSAgfQotCi0gIHVpbnQxNl90IEdldE1hbnVmYWN0dXJlck5hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hbnVmYWN0dXJlcl9uYW1lXzsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0QXV0aGVudGljYXRpb25FbmFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uX2VuYWJsZV87Ci0gIH0KLQotICB2b2lkIFNldEF1dGhlbnRpY2F0aW9uRW5hYmxlKHVpbnQ4X3QgZW5hYmxlKSB7Ci0gICAgYXV0aGVudGljYXRpb25fZW5hYmxlXyA9IGVuYWJsZTsKLSAgfQotCi0gIENsYXNzT2ZEZXZpY2UgR2V0Q2xhc3NPZkRldmljZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2xhc3Nfb2ZfZGV2aWNlXzsKLSAgfQotCi0gIHZvaWQgU2V0Q2xhc3NPZkRldmljZSh1aW50OF90IGIwLCB1aW50OF90IGIxLCB1aW50OF90IGIyKSB7Ci0gICAgY2xhc3Nfb2ZfZGV2aWNlXy5jb2RbMF0gPSBiMDsKLSAgICBjbGFzc19vZl9kZXZpY2VfLmNvZFsxXSA9IGIxOwotICAgIGNsYXNzX29mX2RldmljZV8uY29kWzJdID0gYjI7Ci0gIH0KLQotICB2b2lkIFNldENsYXNzT2ZEZXZpY2UodWludDMyX3QgY2xhc3Nfb2ZfZGV2aWNlKSB7Ci0gICAgY2xhc3Nfb2ZfZGV2aWNlXy5jb2RbMF0gPSBjbGFzc19vZl9kZXZpY2UgJiAweGZmOwotICAgIGNsYXNzX29mX2RldmljZV8uY29kWzFdID0gKGNsYXNzX29mX2RldmljZSA+PiA4KSAmIDB4ZmY7Ci0gICAgY2xhc3Nfb2ZfZGV2aWNlXy5jb2RbMl0gPSAoY2xhc3Nfb2ZfZGV2aWNlID4+IDE2KSAmIDB4ZmY7Ci0gIH0KLQotICB2b2lkIFNldE5hbWUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG5hbWUpIHsKLSAgICBuYW1lXy5maWxsKDApOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMjQ4ICYmIGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgICBuYW1lX1tpXSA9IG5hbWVbaV07Ci0gICAgfQotICB9Ci0KLSAgY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAyNDg+JiBHZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICB2b2lkIFNldEV4dGVuZGVkSW5xdWlyeURhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGVpZCkgewotICAgIGV4dGVuZGVkX2lucXVpcnlfZGF0YV8gPSBlaWQ7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgR2V0RXh0ZW5kZWRJbnF1aXJ5RGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZXh0ZW5kZWRfaW5xdWlyeV9kYXRhXzsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0UGFnZVNjYW5SZXBldGl0aW9uTW9kZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZV87Ci0gIH0KLQotICB2b2lkIFNldFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUodWludDhfdCBtb2RlKSB7Ci0gICAgcGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZV8gPSBtb2RlOwotICB9Ci0KLSAgdWludDE2X3QgR2V0Q2xvY2tPZmZzZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNsb2NrX29mZnNldF87Ci0gIH0KLQotICB2b2lkIFNldENsb2NrT2Zmc2V0KHVpbnQxNl90IG9mZnNldCkgewotICAgIGNsb2NrX29mZnNldF8gPSBvZmZzZXQ7Ci0gIH0KLQotICB1aW50NjRfdCBHZXRFdmVudE1hc2soKSBjb25zdCB7IHJldHVybiBldmVudF9tYXNrXzsgfQotCi0gIHZvaWQgU2V0RXZlbnRNYXNrKHVpbnQ2NF90IG1hc2spIHsgZXZlbnRfbWFza18gPSBtYXNrOyB9Ci0KLSAgYm9vbCBJc1VubWFza2VkKEV2ZW50Q29kZSBldmVudCkgY29uc3QgewotICAgIHVpbnQ2NF90IGJpdCA9IFVJTlQ2NF9DKDEpIDw8IChzdGF0aWNfY2FzdDx1aW50OF90PihldmVudCkgLSAxKTsKLSAgICByZXR1cm4gKGV2ZW50X21hc2tfICYgYml0KSAhPSAwOwotICB9Ci0KLSAgLy8gTG93LUVuZXJneSBmdW5jdGlvbnMKLSAgY29uc3QgQWRkcmVzcyYgR2V0TGVBZGRyZXNzKCkgY29uc3QgewotICAgIHJldHVybiBsZV9hZGRyZXNzXzsKLSAgfQotCi0gIHZvaWQgU2V0TGVBZGRyZXNzKGNvbnN0IEFkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICBsZV9hZGRyZXNzXyA9IGFkZHJlc3M7Ci0gIH0KLQotICB1aW50OF90IEdldExlQWRkcmVzc1R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxlX2FkZHJlc3NfdHlwZV87Ci0gIH0KLQotICB2b2lkIFNldExlQWRkcmVzc1R5cGUodWludDhfdCBhZGRyX3R5cGUpIHsKLSAgICBsZV9hZGRyZXNzX3R5cGVfID0gYWRkcl90eXBlOwotICB9Ci0KLSAgdWludDhfdCBHZXRMZUFkdmVydGlzZW1lbnRUeXBlKCkgY29uc3QgewotICAgIHJldHVybiBsZV9hZHZlcnRpc2VtZW50X3R5cGVfOwotICB9Ci0KLSAgdWludDE2X3QgR2V0TGVBZHZlcnRpc2luZ0ludGVydmFsTWluKCkgY29uc3QgewotICAgIHJldHVybiBsZV9hZHZlcnRpc2luZ19pbnRlcnZhbF9taW5fOwotICB9Ci0KLSAgdWludDE2X3QgR2V0TGVBZHZlcnRpc2luZ0ludGVydmFsTWF4KCkgY29uc3QgewotICAgIHJldHVybiBsZV9hZHZlcnRpc2luZ19pbnRlcnZhbF9tYXhfOwotICB9Ci0KLSAgdWludDhfdCBHZXRMZUFkdmVydGlzaW5nT3duQWRkcmVzc1R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxlX2FkdmVydGlzaW5nX293bl9hZGRyZXNzX3R5cGVfOwotICB9Ci0KLSAgdWludDhfdCBHZXRMZUFkdmVydGlzaW5nUGVlckFkZHJlc3NUeXBlKCkgY29uc3QgewotICAgIHJldHVybiBsZV9hZHZlcnRpc2luZ19wZWVyX2FkZHJlc3NfdHlwZV87Ci0gIH0KLQotICBBZGRyZXNzIEdldExlQWR2ZXJ0aXNpbmdQZWVyQWRkcmVzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVfYWR2ZXJ0aXNpbmdfcGVlcl9hZGRyZXNzXzsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0TGVBZHZlcnRpc2luZ0NoYW5uZWxNYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxlX2FkdmVydGlzaW5nX2NoYW5uZWxfbWFwXzsKLSAgfQotCi0gIHVpbnQ4X3QgR2V0TGVBZHZlcnRpc2luZ0ZpbHRlclBvbGljeSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVfYWR2ZXJ0aXNpbmdfZmlsdGVyX3BvbGljeV87Ci0gIH0KLQotICB2b2lkIFNldExlQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzKHVpbnQxNl90IGludGVydmFsX21pbiwgdWludDE2X3QgaW50ZXJ2YWxfbWF4LCB1aW50OF90IGFkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBvd25fYWRkcmVzc190eXBlLCB1aW50OF90IHBlZXJfYWRkcmVzc190eXBlLCBBZGRyZXNzIHBlZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwLCB1aW50OF90IGZpbHRlcl9wb2xpY3kpIHsKLSAgICBsZV9hZHZlcnRpc2VtZW50X3R5cGVfID0gYWRfdHlwZTsKLSAgICBsZV9hZHZlcnRpc2luZ19pbnRlcnZhbF9taW5fID0gaW50ZXJ2YWxfbWluOwotICAgIGxlX2FkdmVydGlzaW5nX2ludGVydmFsX21heF8gPSBpbnRlcnZhbF9tYXg7Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfb3duX2FkZHJlc3NfdHlwZV8gPSBvd25fYWRkcmVzc190eXBlOwotICAgIGxlX2FkdmVydGlzaW5nX3BlZXJfYWRkcmVzc190eXBlXyA9IHBlZXJfYWRkcmVzc190eXBlOwotICAgIGxlX2FkdmVydGlzaW5nX3BlZXJfYWRkcmVzc18gPSBwZWVyX2FkZHJlc3M7Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfY2hhbm5lbF9tYXBfID0gY2hhbm5lbF9tYXA7Ci0gICAgbGVfYWR2ZXJ0aXNpbmdfZmlsdGVyX3BvbGljeV8gPSBmaWx0ZXJfcG9saWN5OwotICB9Ci0KLSAgdm9pZCBTZXRMZUFkdmVydGlzZW1lbnRUeXBlKHVpbnQ4X3QgYWRfdHlwZSkgewotICAgIGxlX2FkdmVydGlzZW1lbnRfdHlwZV8gPSBhZF90eXBlOwotICB9Ci0KLSAgdm9pZCBTZXRMZUFkdmVydGlzZW1lbnQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGFkKSB7Ci0gICAgbGVfYWR2ZXJ0aXNlbWVudF8gPSBhZDsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBHZXRMZUFkdmVydGlzZW1lbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxlX2FkdmVydGlzZW1lbnRfOwotICB9Ci0KLSAgdm9pZCBTZXRMZVNjYW5SZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKLSAgICBsZV9zY2FuX3Jlc3BvbnNlXyA9IHJlc3BvbnNlOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIEdldExlU2NhblJlc3BvbnNlKCkgY29uc3QgewotICAgIHJldHVybiBsZV9zY2FuX3Jlc3BvbnNlXzsKLSAgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIsIFZvbHVtZSAyLCBQYXJ0IEUsIFNlY3Rpb24gNy44LjIKLSAgdWludDE2X3QgR2V0TGVEYXRhUGFja2V0TGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBsZV9kYXRhX3BhY2tldF9sZW5ndGhfOwotICB9Ci0KLSAgdWludDhfdCBHZXRUb3RhbE51bUxlRGF0YVBhY2tldHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bV9sZV9kYXRhX3BhY2tldHNfOwotICB9Ci0KLSAgdWludDE2X3QgR2V0SXNvRGF0YVBhY2tldExlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNvX2RhdGFfcGFja2V0X2xlbmd0aF87Ci0gIH0KLQotICB1aW50OF90IEdldFRvdGFsTnVtSXNvRGF0YVBhY2tldHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bV9pc29fZGF0YV9wYWNrZXRzXzsKLSAgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIsIFZvbHVtZSAyLCBQYXJ0IEUsIFNlY3Rpb24gNy44LjMKLSAgdWludDY0X3QgR2V0TGVTdXBwb3J0ZWRGZWF0dXJlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVfc3VwcG9ydGVkX2ZlYXR1cmVzXzsKLSAgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA1LjIsIFZvbHVtZSA0LCBQYXJ0IEUsIFNlY3Rpb24gNy44LjYKLSAgaW50OF90IEdldExlQWR2ZXJ0aXNpbmdQaHlzaWNhbENoYW5uZWxUeFBvd2VyKCkgY29uc3QgewotICAgIHJldHVybiBsZV9hZHZlcnRpc2luZ19waHlzaWNhbF9jaGFubmVsX3R4X3Bvd2VyXzsKLSAgfQotCi0gIHZvaWQgU2V0TGVTdXBwb3J0ZWRGZWF0dXJlcyh1aW50NjRfdCBmZWF0dXJlcykgewotICAgIGxlX3N1cHBvcnRlZF9mZWF0dXJlc18gPSBmZWF0dXJlczsKLSAgfQotCi0gIGJvb2wgR2V0TGVFdmVudFN1cHBvcnRlZChibHVldG9vdGg6OmhjaTo6U3ViZXZlbnRDb2RlIHN1YmV2ZW50X2NvZGUpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVfZXZlbnRfbWFza18gJiAoMXUgPDwgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdWJldmVudF9jb2RlKSAtIDEpKTsKLSAgfQotCi0gIHVpbnQ2NF90IEdldExlRXZlbnRNYXNrKCkgY29uc3QgeyByZXR1cm4gbGVfZXZlbnRfbWFza187IH0KLQotICB2b2lkIFNldExlRXZlbnRNYXNrKHVpbnQ2NF90IG1hc2spIHsgbGVfZXZlbnRfbWFza18gPSBtYXNrOyB9Ci0KLSAgLy8gU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDQuMiwgVm9sdW1lIDIsIFBhcnQgRSwgU2VjdGlvbiA3LjguMTQKLSAgdWludDhfdCBHZXRMZUNvbm5lY3RMaXN0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxlX2Nvbm5lY3RfbGlzdF9zaXplXzsgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIsIFZvbHVtZSAyLCBQYXJ0IEUsIFNlY3Rpb24gNy44LjI3Ci0gIHVpbnQ2NF90IEdldExlU3VwcG9ydGVkU3RhdGVzKCkgY29uc3QgewotICAgIHJldHVybiBsZV9zdXBwb3J0ZWRfc3RhdGVzXzsKLSAgfQotCi0gIC8vIFNwZWNpZmljYXRpb24gVmVyc2lvbiA0LjIsIFZvbHVtZSAyLCBQYXJ0IEUsIFNlY3Rpb24gNy44LjQxCi0gIHVpbnQ4X3QgR2V0TGVSZXNvbHZpbmdMaXN0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxlX3Jlc29sdmluZ19saXN0X3NpemVfOyB9Ci0KLSAgLy8gVmVuZG9yLXNwZWNpZmljIGNvbW1hbmRzCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBHZXRMZVZlbmRvckNhcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVfdmVuZG9yX2NhcF87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIENsYXNzaWMKLSAgdWludDE2X3QgYWNsX2RhdGFfcGFja2V0X3NpemVfOwotICB1aW50OF90IHNjb19kYXRhX3BhY2tldF9zaXplXzsKLSAgdWludDE2X3QgbnVtX2FjbF9kYXRhX3BhY2tldHNfOwotICB1aW50MTZfdCBudW1fc2NvX2RhdGFfcGFja2V0c187Ci0gIHVpbnQ4X3QgdmVyc2lvbl87Ci0gIHVpbnQxNl90IHJldmlzaW9uXzsKLSAgdWludDhfdCBsbXBfcGFsX3ZlcnNpb25fOwotICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbmFtZV87Ci0gIHVpbnQxNl90IGxtcF9wYWxfc3VidmVyc2lvbl87Ci0gIHVpbnQ2NF90IHN1cHBvcnRlZF9mZWF0dXJlc197fTsKLSAgdWludDY0X3QgZXZlbnRfbWFza197MHgwMDAwMWZmZmZmZmZmZmZmfTsKLSAgdWludDhfdCBhdXRoZW50aWNhdGlvbl9lbmFibGVfe307Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN1cHBvcnRlZF9jb2RlY3NfOwotICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdmVuZG9yX3NwZWNpZmljX2NvZGVjc187Ci0gIHN0ZDo6YXJyYXk8dWludDhfdCwgNjQ+IHN1cHBvcnRlZF9jb21tYW5kc187Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBleHRlbmRlZF9mZWF0dXJlc197ezB4ODc1YjNmZDhmZThmZmVmZiwgMHgwNH19OwotICBDbGFzc09mRGV2aWNlIGNsYXNzX29mX2RldmljZV97ezAsIDAsIDB9fTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXh0ZW5kZWRfaW5xdWlyeV9kYXRhXzsKLSAgc3RkOjphcnJheTx1aW50OF90LCAyNDg+IG5hbWVfe307Ci0gIEFkZHJlc3MgYWRkcmVzc197fTsKLSAgdWludDhfdCBwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlX3t9OwotICB1aW50MTZfdCBjbG9ja19vZmZzZXRfe307Ci0gIHVpbnQ4X3QgZW5jcnlwdGlvbl9rZXlfc2l6ZV97MTB9OwotICB1aW50MTZfdCB2b2ljZV9zZXR0aW5nX3sweDAwNjB9OwotICB1aW50MTZfdCBjb25uZWN0aW9uX2FjY2VwdF90aW1lb3V0X3sweDdkMDB9OwotICBib29sIHVzZV9zdXBwb3J0ZWRfY29tbWFuZHNfZnJvbV9maWxlXyA9IGZhbHNlOwotCi0gIC8vIExvdyBFbmVyZ3kKLSAgdWludDE2X3QgbGVfZGF0YV9wYWNrZXRfbGVuZ3RoXzsKLSAgdWludDhfdCBudW1fbGVfZGF0YV9wYWNrZXRzXzsKLSAgdWludDhfdCBsZV9jb25uZWN0X2xpc3Rfc2l6ZV87Ci0gIHVpbnQ4X3QgbGVfcmVzb2x2aW5nX2xpc3Rfc2l6ZV87Ci0gIHVpbnQ2NF90IGxlX3N1cHBvcnRlZF9mZWF0dXJlc197MHgwNzViM2ZkOGZlOGZmZWZmfTsKLSAgaW50OF90IGxlX2FkdmVydGlzaW5nX3BoeXNpY2FsX2NoYW5uZWxfdHhfcG93ZXJfezB4MDB9OwotICB1aW50NjRfdCBsZV9zdXBwb3J0ZWRfc3RhdGVzXzsKLSAgdWludDY0X3QgbGVfZXZlbnRfbWFza197MHgwMWZ9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBsZV92ZW5kb3JfY2FwXzsKLSAgQWRkcmVzcyBsZV9hZGRyZXNzX3t9OwotICB1aW50OF90IGxlX2FkZHJlc3NfdHlwZV97fTsKLQotICB1aW50MTZfdCBsZV9hZHZlcnRpc2luZ19pbnRlcnZhbF9taW5fe307Ci0gIHVpbnQxNl90IGxlX2FkdmVydGlzaW5nX2ludGVydmFsX21heF97fTsKLSAgdWludDhfdCBsZV9hZHZlcnRpc2luZ19vd25fYWRkcmVzc190eXBlX3t9OwotICB1aW50OF90IGxlX2FkdmVydGlzaW5nX3BlZXJfYWRkcmVzc190eXBlX3t9OwotICBBZGRyZXNzIGxlX2FkdmVydGlzaW5nX3BlZXJfYWRkcmVzc197fTsKLSAgdWludDhfdCBsZV9hZHZlcnRpc2luZ19jaGFubmVsX21hcF97fTsKLSAgdWludDhfdCBsZV9hZHZlcnRpc2luZ19maWx0ZXJfcG9saWN5X3t9OwotICB1aW50OF90IGxlX2FkdmVydGlzZW1lbnRfdHlwZV97fTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbGVfYWR2ZXJ0aXNlbWVudF87Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxlX3NjYW5fcmVzcG9uc2VfOwotCi0gIC8vIElTTwotICB1aW50MTZfdCBpc29fZGF0YV9wYWNrZXRfbGVuZ3RoX3sxMDIxfTsKLSAgdWludDhfdCBudW1faXNvX2RhdGFfcGFja2V0c197MTJ9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfZGF0YV9jaGFubmVsX3BhY2tldGl6ZXIuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oNF9kYXRhX2NoYW5uZWxfcGFja2V0aXplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlZTRiNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oNF9kYXRhX2NoYW5uZWxfcGFja2V0aXplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJoNF9kYXRhX2NoYW5uZWxfcGFja2V0aXplci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvLyBmb3Igc3RyZXJyb3IsIHNpemVfdAotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLy8gZm9yIHNzaXplX3QKLSNpbmNsdWRlIDxjZXJybm8+ICAgICAgIC8vIGZvciBlcnJubywgRUFHQUlOLCBFQ09OTlJFU0VUCi0jaW5jbHVkZSA8Y3N0ZGludD4gICAgICAvLyBmb3IgdWludDhfdAotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+ICAgLy8gZm9yIGZ1bmN0aW9uCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+ICAvLyBmb3IgcmVtb3ZlX2V4dGVudF90Ci0jaW5jbHVkZSA8dXRpbGl0eT4gICAgICAvLyBmb3IgbW92ZQotI2luY2x1ZGUgPHZlY3Rvcj4gICAgICAgLy8gZm9yIHZlY3RvcgotCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9oNF9wYXJzZXIuaCIgIC8vIGZvciBINFBhcnNlciwgQ2xpZW50RGlzY29ubmVjdENhLi4uCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9oY2lfcHJvdG9jb2wuaCIgIC8vIGZvciBQYWNrZXRSZWFkQ2FsbGJhY2ssIEFzeW5jRGF0YUNoYW5uZWwKLSNpbmNsdWRlICJuZXQvYXN5bmNfZGF0YV9jaGFubmVsLmgiICAgICAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWwKLSNpbmNsdWRlICJvcy9sb2cuaCIgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIExPR19FUlJPUiwgTE9HX0FMV0FZU19GQVRBTAotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotSDREYXRhQ2hhbm5lbFBhY2tldGl6ZXI6Okg0RGF0YUNoYW5uZWxQYWNrZXRpemVyKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsIFBhY2tldFJlYWRDYWxsYmFjayBjb21tYW5kX2NiLAotICAgIFBhY2tldFJlYWRDYWxsYmFjayBldmVudF9jYiwgUGFja2V0UmVhZENhbGxiYWNrIGFjbF9jYiwKLSAgICBQYWNrZXRSZWFkQ2FsbGJhY2sgc2NvX2NiLCBQYWNrZXRSZWFkQ2FsbGJhY2sgaXNvX2NiLAotICAgIENsaWVudERpc2Nvbm5lY3RDYWxsYmFjayBkaXNjb25uZWN0X2NiKQotICAgIDogdWFydF9zb2NrZXRfKHNvY2tldCksCi0gICAgICBoNF9wYXJzZXJfKGNvbW1hbmRfY2IsIGV2ZW50X2NiLCBhY2xfY2IsIHNjb19jYiwgaXNvX2NiKSwKLSAgICAgIGRpc2Nvbm5lY3RfY2JfKHN0ZDo6bW92ZShkaXNjb25uZWN0X2NiKSkge30KLQotc2l6ZV90IEg0RGF0YUNoYW5uZWxQYWNrZXRpemVyOjpTZW5kKHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0gIHNzaXplX3QgcmV0ID0gdWFydF9zb2NrZXRfLT5TZW5kKCZ0eXBlLCBzaXplb2YodHlwZSkpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgTE9HX0VSUk9SKCJFcnJvciB3cml0aW5nIHRvIFVBUlQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLSAgc2l6ZV90IHRvX2JlX3dyaXR0ZW4gPSByZXQ7Ci0KLSAgcmV0ID0gdWFydF9zb2NrZXRfLT5TZW5kKGRhdGEsIGxlbmd0aCk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBMT0dfRVJST1IoIkVycm9yIHdyaXRpbmcgdG8gVUFSVCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotICB0b19iZV93cml0dGVuICs9IHJldDsKLQotICBpZiAodG9fYmVfd3JpdHRlbiAhPSBsZW5ndGggKyBzaXplb2YodHlwZSkpIHsKLSAgICBMT0dfRVJST1IoIiVkIC8gJWQgYnl0ZXMgd3JpdHRlbiAtIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uIiwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0b19iZV93cml0dGVuKSwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggKyBzaXplb2YodHlwZSkpKTsKLSAgfQotICByZXR1cm4gdG9fYmVfd3JpdHRlbjsKLX0KLQotdm9pZCBINERhdGFDaGFubmVsUGFja2V0aXplcjo6T25EYXRhUmVhZHkoCi0gICAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldCkgewotICBzc2l6ZV90IGJ5dGVzX3RvX3JlYWQgPSBoNF9wYXJzZXJfLkJ5dGVzUmVxdWVzdGVkKCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihieXRlc190b19yZWFkKTsKLQotICBzc2l6ZV90IGJ5dGVzX3JlYWQgPSBzb2NrZXQtPlJlY3YoYnVmZmVyLmRhdGEoKSwgYnl0ZXNfdG9fcmVhZCk7Ci0gIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICBMT0dfSU5GTygicmVtb3RlIGRpc2Nvbm5lY3RlZCEiKTsKLSAgICBkaXNjb25uZWN0ZWRfID0gdHJ1ZTsKLSAgICBkaXNjb25uZWN0X2NiXygpOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChieXRlc19yZWFkIDwgMCkgewotICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKLSAgICAgIC8vIE5vIGRhdGEsIHRyeSBhZ2FpbiBsYXRlci4KLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGVycm5vID09IEVDT05OUkVTRVQpIHsKLSAgICAgIC8vIFRoZXkgcHJvYmFibHkgcmVqZWN0ZWQgb3VyIHBhY2tldAotICAgICAgZGlzY29ubmVjdGVkXyA9IHRydWU7Ci0gICAgICBkaXNjb25uZWN0X2NiXygpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJSZWFkIGVycm9yIGluICV1OiAlcyIsIGg0X3BhcnNlcl8uQ3VycmVudFN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICB9Ci0gIGg0X3BhcnNlcl8uQ29uc3VtZShidWZmZXIuZGF0YSgpLCBieXRlc19yZWFkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfZGF0YV9jaGFubmVsX3BhY2tldGl6ZXIuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2g0X2RhdGFfY2hhbm5lbF9wYWNrZXRpemVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjhlZGEuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfZGF0YV9jaGFubmVsX3BhY2tldGl6ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBmb3Igc2l6ZV90Ci0jaW5jbHVkZSA8c3RkaW50Lmg+ICAvLyBmb3IgdWludDhfdAotCi0jaW5jbHVkZSA8bWVtb3J5PiAgLy8gZm9yIHNoYXJlZF9wdHIKLQotI2luY2x1ZGUgImg0X3BhcnNlci5oIiAgICAgLy8gZm9yIENsaWVudERpc2Nvbm5lY3RDYWxsYmFjaywgSDRQYXJzZXIKLSNpbmNsdWRlICJoY2lfcHJvdG9jb2wuaCIgIC8vIGZvciBQYWNrZXRSZWFkQ2FsbGJhY2ssIEFzeW5jRGF0YUNoYW5uZWwsIEhjaVByb3RvY29sCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIiAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWwKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbDsKLQotLy8gQSBzb2NrZXQgYmFzZWQgSDREYXRhQ2hhbm5lbFBhY2tldGl6ZXIuIENhbGwgT25EYXRhUmVhZHkgd2hlbmV2ZXIKLS8vIGRhdGEgY2FuIGJlIHJlYWQgZnJvbSB0aGUgc29ja2V0LgotY2xhc3MgSDREYXRhQ2hhbm5lbFBhY2tldGl6ZXIgOiBwdWJsaWMgSGNpUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgSDREYXRhQ2hhbm5lbFBhY2tldGl6ZXIoc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0UmVhZENhbGxiYWNrIGNvbW1hbmRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayBldmVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0UmVhZENhbGxiYWNrIGFjbF9jYiwgUGFja2V0UmVhZENhbGxiYWNrIHNjb19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0UmVhZENhbGxiYWNrIGlzb19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RGlzY29ubmVjdENhbGxiYWNrIGRpc2Nvbm5lY3RfY2IpOwotCi0gIHNpemVfdCBTZW5kKHVpbnQ4X3QgdHlwZSwgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBPbkRhdGFSZWFkeShzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0KTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiB1YXJ0X3NvY2tldF87Ci0gIEg0UGFyc2VyIGg0X3BhcnNlcl87Ci0KLSAgQ2xpZW50RGlzY29ubmVjdENhbGxiYWNrIGRpc2Nvbm5lY3RfY2JfOwotICBib29sIGRpc2Nvbm5lY3RlZF97ZmFsc2V9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfcGFja2V0aXplci5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2g0X3BhY2tldGl6ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGVjNjkuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfcGFja2V0aXplci5jYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJoNF9wYWNrZXRpemVyLmgiCi0KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotSDRQYWNrZXRpemVyOjpINFBhY2tldGl6ZXIoaW50IGZkLCBQYWNrZXRSZWFkQ2FsbGJhY2sgY29tbWFuZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayBldmVudF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayBhY2xfY2IsIFBhY2tldFJlYWRDYWxsYmFjayBzY29fY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2sgaXNvX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RGlzY29ubmVjdENhbGxiYWNrIGRpc2Nvbm5lY3RfY2IpCi0gICAgOiB1YXJ0X2ZkXyhmZCksCi0gICAgICBoNF9wYXJzZXJfKGNvbW1hbmRfY2IsIGV2ZW50X2NiLCBhY2xfY2IsIHNjb19jYiwgaXNvX2NiKSwKLSAgICAgIGRpc2Nvbm5lY3RfY2JfKHN0ZDo6bW92ZShkaXNjb25uZWN0X2NiKSkge30KLQotc2l6ZV90IEg0UGFja2V0aXplcjo6U2VuZCh1aW50OF90IHR5cGUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgc3RydWN0IGlvdmVjIGlvdltdID0ge3smdHlwZSwgc2l6ZW9mKHR5cGUpfSwge2NvbnN0X2Nhc3Q8dWludDhfdCo+KGRhdGEpLCBsZW5ndGh9fTsKLSAgc3NpemVfdCByZXQgPSAwOwotICBkbyB7Ci0gICAgT1NJX05PX0lOVFIocmV0ID0gd3JpdGV2KHVhcnRfZmRfLCBpb3YsIHNpemVvZihpb3YpIC8gc2l6ZW9mKGlvdlswXSkpKTsKLSAgfSB3aGlsZSAoLTEgPT0gcmV0ICYmIEVBR0FJTiA9PSBlcnJubyk7Ci0KLSAgaWYgKHJldCA9PSAtMSkgewotICAgIExPR19FUlJPUigiRXJyb3Igd3JpdGluZyB0byBVQVJUICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICB9IGVsc2UgaWYgKHJldCA8IHN0YXRpY19jYXN0PHNzaXplX3Q+KGxlbmd0aCArIDEpKSB7Ci0gICAgTE9HX0VSUk9SKCIlZCAvICVkIGJ5dGVzIHdyaXR0ZW4gLSBzb21ldGhpbmcgd2VudCB3cm9uZy4uLiIsCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocmV0KSwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggKyAxKSk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotCi12b2lkIEg0UGFja2V0aXplcjo6T25EYXRhUmVhZHkoaW50IGZkKSB7Ci0gIGlmIChkaXNjb25uZWN0ZWRfKSByZXR1cm47Ci0gIHNzaXplX3QgYnl0ZXNfdG9fcmVhZCA9IGg0X3BhcnNlcl8uQnl0ZXNSZXF1ZXN0ZWQoKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKGJ5dGVzX3RvX3JlYWQpOwotCi0gIHNzaXplX3QgYnl0ZXNfcmVhZDsKLSAgT1NJX05PX0lOVFIoYnl0ZXNfcmVhZCA9IHJlYWQoZmQsIGJ1ZmZlci5kYXRhKCksIGJ5dGVzX3RvX3JlYWQpKTsKLSAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgIExPR19JTkZPKCJyZW1vdGUgZGlzY29ubmVjdGVkISIpOwotICAgIGRpc2Nvbm5lY3RlZF8gPSB0cnVlOwotICAgIGRpc2Nvbm5lY3RfY2JfKCk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7Ci0gICAgaWYgKGVycm5vID09IEVBR0FJTikgewotICAgICAgLy8gTm8gZGF0YSwgdHJ5IGFnYWluIGxhdGVyLgotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRUNPTk5SRVNFVCkgewotICAgICAgLy8gVGhleSBwcm9iYWJseSByZWplY3RlZCBvdXIgcGFja2V0Ci0gICAgICBkaXNjb25uZWN0ZWRfID0gdHJ1ZTsKLSAgICAgIGRpc2Nvbm5lY3RfY2JfKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19BTFdBWVNfRkFUQUwoIlJlYWQgZXJyb3IgaW4gJWQ6ICVzIiwgaDRfcGFyc2VyXy5DdXJyZW50U3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gIH0KLSAgaDRfcGFyc2VyXy5Db25zdW1lKGJ1ZmZlci5kYXRhKCksIGJ5dGVzX3JlYWQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oNF9wYWNrZXRpemVyLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oNF9wYWNrZXRpemVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MGRjZDMuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfcGFja2V0aXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImg0X3BhcnNlci5oIgotI2luY2x1ZGUgImhjaV9wcm90b2NvbC5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotLy8gQSBzb2NrZXQgYmFzZWQgSDRQYWNrZXRpemVyLiBDYWxsIE9uRGF0YVJlYWR5IHdoZW5ldmVyCi0vLyBkYXRhIGNhbiBiZSByZWFkIGZyb20gZmlsZSBkZXNjcmlwdG9yIGZkLgotLy8KLS8vIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgb24gdW5peC4KLWNsYXNzIEg0UGFja2V0aXplciA6IHB1YmxpYyBIY2lQcm90b2NvbCB7Ci0gcHVibGljOgotICBINFBhY2tldGl6ZXIoaW50IGZkLCBQYWNrZXRSZWFkQ2FsbGJhY2sgY29tbWFuZF9jYiwKLSAgICAgICAgICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayBldmVudF9jYiwgUGFja2V0UmVhZENhbGxiYWNrIGFjbF9jYiwKLSAgICAgICAgICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayBzY29fY2IsIFBhY2tldFJlYWRDYWxsYmFjayBpc29fY2IsCi0gICAgICAgICAgICAgICBDbGllbnREaXNjb25uZWN0Q2FsbGJhY2sgZGlzY29ubmVjdF9jYik7Ci0KLSAgc2l6ZV90IFNlbmQodWludDhfdCB0eXBlLCBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKLQotICB2b2lkIE9uRGF0YVJlYWR5KGludCBmZCk7Ci0KLSBwcml2YXRlOgotICBpbnQgdWFydF9mZF87Ci0gIEg0UGFyc2VyIGg0X3BhcnNlcl87Ci0KLSAgQ2xpZW50RGlzY29ubmVjdENhbGxiYWNrIGRpc2Nvbm5lY3RfY2JfOwotICBib29sIGRpc2Nvbm5lY3RlZF97ZmFsc2V9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfcGFyc2VyLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfcGFyc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IzYjMzLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2g0X3BhcnNlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvaDRfcGFyc2VyLmgiICAvLyBmb3IgSDRQYXJzZXIsIFBhY2tldFR5cGUsIEg0UGFycy4uLgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+ICAgIC8vIGZvciBzaXplX3QKLSNpbmNsdWRlIDxjc3RkaW50PiAgICAgLy8gZm9yIHVpbnQ4X3QsIGludDMyX3QKLSNpbmNsdWRlIDxmdW5jdGlvbmFsPiAgLy8gZm9yIGZ1bmN0aW9uCi0jaW5jbHVkZSA8dXRpbGl0eT4gICAgIC8vIGZvciBtb3ZlCi0jaW5jbHVkZSA8dmVjdG9yPiAgICAgIC8vIGZvciB2ZWN0b3IKLQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvaGNpX3Byb3RvY29sLmgiICAvLyBmb3IgUGFja2V0UmVhZENhbGxiYWNrCi0jaW5jbHVkZSAib3MvbG9nLmgiICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBMT0dfQUxXQVlTX0ZBVEFMLCBMT0dfSU5GTwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotdm9pZCBINFBhcnNlcjo6UmVzZXQoKSB7Ci0gIHN0YXRlXyA9IEhDSV9UWVBFOwotICBwYWNrZXRfLmNsZWFyKCk7Ci0gIGJ5dGVzX3dhbnRlZF8gPSAwOwotICBwYWNrZXRfdHlwZV8gPSAwOwotfQotCi1zaXplX3QgSDRQYXJzZXI6OkhjaUdldFBhY2tldExlbmd0aEZvclR5cGUoUGFja2V0VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHByZWFtYmxlKSBjb25zdCB7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QKLSAgICAgIHBhY2tldF9sZW5ndGhfb2Zmc2V0W3N0YXRpY19jYXN0PHNpemVfdD4oUGFja2V0VHlwZTo6SVNPKSArIDFdID0gewotICAgICAgICAgIDAsCi0gICAgICAgICAgSDRQYXJzZXI6OkNPTU1BTkRfTEVOR1RIX09GRlNFVCwKLSAgICAgICAgICBINFBhcnNlcjo6QUNMX0xFTkdUSF9PRkZTRVQsCi0gICAgICAgICAgSDRQYXJzZXI6OlNDT19MRU5HVEhfT0ZGU0VULAotICAgICAgICAgIEg0UGFyc2VyOjpFVkVOVF9MRU5HVEhfT0ZGU0VULAotICAgICAgICAgIEg0UGFyc2VyOjpJU09fTEVOR1RIX09GRlNFVCwKLSAgICAgIH07Ci0KLSAgc2l6ZV90IG9mZnNldCA9IHBhY2tldF9sZW5ndGhfb2Zmc2V0W3N0YXRpY19jYXN0PHNpemVfdD4odHlwZSldOwotICBzaXplX3Qgc2l6ZSA9IHByZWFtYmxlW29mZnNldF07Ci0gIGlmICh0eXBlID09IFBhY2tldFR5cGU6OkFDTCkgewotICAgIHNpemUgfD0gKChzaXplX3QpcHJlYW1ibGVbb2Zmc2V0ICsgMV0pIDw8IDh1OwotICB9Ci0gIGlmICh0eXBlID09IFBhY2tldFR5cGU6OklTTykgewotICAgIHNpemUgfD0gKChzaXplX3QpcHJlYW1ibGVbb2Zmc2V0ICsgMV0gJiAweDBmdSkgPDwgOHU7Ci0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLUg0UGFyc2VyOjpINFBhcnNlcihQYWNrZXRSZWFkQ2FsbGJhY2sgY29tbWFuZF9jYiwgUGFja2V0UmVhZENhbGxiYWNrIGV2ZW50X2NiLAotICAgICAgICAgICAgICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayBhY2xfY2IsIFBhY2tldFJlYWRDYWxsYmFjayBzY29fY2IsCi0gICAgICAgICAgICAgICAgICAgUGFja2V0UmVhZENhbGxiYWNrIGlzb19jYikKLSAgICA6IGNvbW1hbmRfY2JfKHN0ZDo6bW92ZShjb21tYW5kX2NiKSksCi0gICAgICBldmVudF9jYl8oc3RkOjptb3ZlKGV2ZW50X2NiKSksCi0gICAgICBhY2xfY2JfKHN0ZDo6bW92ZShhY2xfY2IpKSwKLSAgICAgIHNjb19jYl8oc3RkOjptb3ZlKHNjb19jYikpLAotICAgICAgaXNvX2NiXyhzdGQ6Om1vdmUoaXNvX2NiKSkge30KLQotdm9pZCBINFBhcnNlcjo6T25QYWNrZXRSZWFkeSgpIHsKLSAgc3dpdGNoIChoY2lfcGFja2V0X3R5cGVfKSB7Ci0gICAgY2FzZSBQYWNrZXRUeXBlOjpDT01NQU5EOgotICAgICAgY29tbWFuZF9jYl8ocGFja2V0Xyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhY2tldFR5cGU6OkFDTDoKLSAgICAgIGFjbF9jYl8ocGFja2V0Xyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhY2tldFR5cGU6OlNDTzoKLSAgICAgIHNjb19jYl8ocGFja2V0Xyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBhY2tldFR5cGU6OkVWRU5UOgotICAgICAgZXZlbnRfY2JfKHBhY2tldF8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWNrZXRUeXBlOjpJU086Ci0gICAgICBpc29fY2JfKHBhY2tldF8pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuaW1wbGVtZW50ZWQgcGFja2V0IHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGhjaV9wYWNrZXRfdHlwZV8pKTsKLSAgfQotICAvLyBHZXQgcmVhZHkgZm9yIHRoZSBuZXh0IHR5cGUgYnl0ZS4KLSAgaGNpX3BhY2tldF90eXBlXyA9IFBhY2tldFR5cGU6OlVOS05PV047Ci19Ci0KLXNpemVfdCBINFBhcnNlcjo6Qnl0ZXNSZXF1ZXN0ZWQoKSB7Ci0gIHN3aXRjaCAoc3RhdGVfKSB7Ci0gICAgY2FzZSBIQ0lfVFlQRToKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgSENJX1BSRUFNQkxFOgotICAgIGNhc2UgSENJX1BBWUxPQUQ6Ci0gICAgICByZXR1cm4gYnl0ZXNfd2FudGVkXzsKLSAgfQotfQotCi1ib29sIEg0UGFyc2VyOjpDb25zdW1lKHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBieXRlc19yZWFkKSB7Ci0gIHNpemVfdCBieXRlc190b19yZWFkID0gQnl0ZXNSZXF1ZXN0ZWQoKTsKLSAgaWYgKGJ5dGVzX3JlYWQgPD0gMCkgewotICAgIExPR19JTkZPKCJyZW1vdGUgZGlzY29ubmVjdGVkLCBvciB1bmhhbmRsZWQgZXJyb3I/Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKCh1aW50MzJfdClieXRlc19yZWFkID4gQnl0ZXNSZXF1ZXN0ZWQoKSkgewotICAgIExPR19BTFdBWVNfRkFUQUwoIk1vcmUgYnl0ZXMgcmVhZCAoJXUpIHRoYW4gZXhwZWN0ZWQgKCV1KSEiLAotICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihieXRlc19yZWFkKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYnl0ZXNfdG9fcmVhZCkpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBwcmVhbWJsZV9zaXplW3N0YXRpY19jYXN0PHNpemVfdD4oUGFja2V0VHlwZTo6SVNPKSArIDFdID0KLSAgICAgIHsKLSAgICAgICAgICAwLAotICAgICAgICAgIEg0UGFyc2VyOjpDT01NQU5EX1BSRUFNQkxFX1NJWkUsCi0gICAgICAgICAgSDRQYXJzZXI6OkFDTF9QUkVBTUJMRV9TSVpFLAotICAgICAgICAgIEg0UGFyc2VyOjpTQ09fUFJFQU1CTEVfU0laRSwKLSAgICAgICAgICBINFBhcnNlcjo6RVZFTlRfUFJFQU1CTEVfU0laRSwKLSAgICAgICAgICBINFBhcnNlcjo6SVNPX1BSRUFNQkxFX1NJWkUsCi0gICAgICB9OwotICBzd2l0Y2ggKHN0YXRlXykgewotICAgIGNhc2UgSENJX1RZUEU6Ci0gICAgICAvLyBieXRlc19yZWFkID49IDEKLSAgICAgIHBhY2tldF90eXBlXyA9ICpidWZmZXI7Ci0gICAgICBwYWNrZXRfLmNsZWFyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9QUkVBTUJMRToKLSAgICBjYXNlIEhDSV9QQVlMT0FEOgotICAgICAgcGFja2V0Xy5pbnNlcnQocGFja2V0Xy5lbmQoKSwgYnVmZmVyLCBidWZmZXIgKyBieXRlc19yZWFkKTsKLSAgICAgIGJ5dGVzX3dhbnRlZF8gLT0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc3dpdGNoIChzdGF0ZV8pIHsKLSAgICBjYXNlIEhDSV9UWVBFOgotICAgICAgaGNpX3BhY2tldF90eXBlXyA9IHN0YXRpY19jYXN0PFBhY2tldFR5cGU+KHBhY2tldF90eXBlXyk7Ci0gICAgICBpZiAoaGNpX3BhY2tldF90eXBlXyAhPSBQYWNrZXRUeXBlOjpBQ0wgJiYKLSAgICAgICAgICBoY2lfcGFja2V0X3R5cGVfICE9IFBhY2tldFR5cGU6OlNDTyAmJgotICAgICAgICAgIGhjaV9wYWNrZXRfdHlwZV8gIT0gUGFja2V0VHlwZTo6Q09NTUFORCAmJgotICAgICAgICAgIGhjaV9wYWNrZXRfdHlwZV8gIT0gUGFja2V0VHlwZTo6RVZFTlQgJiYKLSAgICAgICAgICBoY2lfcGFja2V0X3R5cGVfICE9IFBhY2tldFR5cGU6OklTTykgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmltcGxlbWVudGVkIHBhY2tldCB0eXBlICVoaGQiLCBwYWNrZXRfdHlwZV8pOwotICAgICAgfQotICAgICAgc3RhdGVfID0gSENJX1BSRUFNQkxFOwotICAgICAgYnl0ZXNfd2FudGVkXyA9IHByZWFtYmxlX3NpemVbc3RhdGljX2Nhc3Q8c2l6ZV90PihoY2lfcGFja2V0X3R5cGVfKV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhDSV9QUkVBTUJMRToKLQotICAgICAgaWYgKGJ5dGVzX3dhbnRlZF8gPT0gMCkgewotICAgICAgICBzaXplX3QgcGF5bG9hZF9zaXplID0KLSAgICAgICAgICAgIEhjaUdldFBhY2tldExlbmd0aEZvclR5cGUoaGNpX3BhY2tldF90eXBlXywgcGFja2V0Xy5kYXRhKCkpOwotICAgICAgICBpZiAocGF5bG9hZF9zaXplID09IDApIHsKLSAgICAgICAgICBPblBhY2tldFJlYWR5KCk7Ci0gICAgICAgICAgc3RhdGVfID0gSENJX1RZUEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnl0ZXNfd2FudGVkXyA9IHBheWxvYWRfc2l6ZTsKLSAgICAgICAgICBzdGF0ZV8gPSBIQ0lfUEFZTE9BRDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQ0lfUEFZTE9BRDoKLSAgICAgIGlmIChieXRlc193YW50ZWRfID09IDApIHsKLSAgICAgICAgT25QYWNrZXRSZWFkeSgpOwotICAgICAgICBzdGF0ZV8gPSBIQ0lfVFlQRTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaDRfcGFyc2VyLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oNF9wYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyZjc5ZS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oNF9wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAvLyBmb3Igc2l6ZV90Ci0jaW5jbHVkZSA8Y3N0ZGludD4gICAgIC8vIGZvciB1aW50OF90LCBpbnQzMl90Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4gIC8vIGZvciBmdW5jdGlvbgotI2luY2x1ZGUgPG9zdHJlYW0+ICAgICAvLyBmb3Igb3BlcmF0b3I8PCwgb3N0cmVhbQotI2luY2x1ZGUgPHZlY3Rvcj4gICAgICAvLyBmb3IgdmVjdG9yCi0KLSNpbmNsdWRlICJtb2RlbC9kZXZpY2VzL2hjaV9wcm90b2NvbC5oIiAgLy8gZm9yIFBhY2tldFJlYWRDYWxsYmFjawotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotdXNpbmcgSGNpUGFja2V0UmVhZHlDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT47Ci11c2luZyBDbGllbnREaXNjb25uZWN0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT47Ci0KLWVudW0gY2xhc3MgUGFja2V0VHlwZSA6IHVpbnQ4X3QgewotICBVTktOT1dOID0gMCwKLSAgQ09NTUFORCA9IDEsCi0gIEFDTCA9IDIsCi0gIFNDTyA9IDMsCi0gIEVWRU5UID0gNCwKLSAgSVNPID0gNSwKLX07Ci0KLS8vIEFuIEg0IFBhcnNlciBjYW4gcGFyc2UgSDQgUGFja2V0cyBhbmQgd2lsbCBpbnZva2UgdGhlIHByb3BlciBjYWxsYmFjawotLy8gb25jZSBhIHBhY2tldCBoYXMgYmVlbiBwYXJzZWQuCi0vLwotLy8gWW91IHVzZSBpdCBhcyBmb2xsb3dzOgotLy8KLS8vIEg0UGFyc2VyIGg0KC4uLi4pOwotLy8gc2l6ZV90IG5yX2J5dGVzID0gaDQuQnl0ZXNSZXF1ZXN0ZWQoKTsKLS8vIHN0ZDo6dmVjdG9yIGZpbGxfdGhpc192ZWN0b3Jfd2l0aF9hdF9tb3N0X25yX2J5dGVzKG5yX2J5dGVzKTsKLS8vIGg0LkNvbnN1bWUoZmlsbF90aGlzX3ZlY3Rvcl93aXRoX2F0X21vc3RfbnJfYnl0ZXMuZGF0YSgpLCBucl9ieXRlcy5zaXplKCkpOwotLy8KLS8vIFRoZSBwYXJzZXIgd2lsbCBpbnZva2UgdGhlIHByb3BlciBjYWxsYmFja3Mgb25jZSBhIHBhY2tldCBoYXMgYmVlbiBwYXJzZWQuCi0vLyBUaGUgcGFyc2VyIGtlZXBzIGludGVybmFsIHN0YXRlIGFuZCBpcyBub3QgdGhyZWFkIHNhZmUuCi1jbGFzcyBINFBhcnNlciB7Ci0gcHVibGljOgotICBlbnVtIFN0YXRlIHsgSENJX1RZUEUsIEhDSV9QUkVBTUJMRSwgSENJX1BBWUxPQUQgfTsKLQotICBINFBhcnNlcihQYWNrZXRSZWFkQ2FsbGJhY2sgY29tbWFuZF9jYiwgUGFja2V0UmVhZENhbGxiYWNrIGV2ZW50X2NiLAotICAgICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2sgYWNsX2NiLCBQYWNrZXRSZWFkQ2FsbGJhY2sgc2NvX2NiLAotICAgICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2sgaXNvX2NiKTsKLQotICAvLyBDb25zdW1lcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCByZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KLSAgYm9vbCBDb25zdW1lKHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBieXRlcyk7Ci0KLSAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoZSBwYXJzZXIgY2FuIGNvbnN1bWUgaW4gdGhlIGN1cnJlbnQgc3RhdGUuCi0gIHNpemVfdCBCeXRlc1JlcXVlc3RlZCgpOwotCi0gIC8vIFJlc2V0cyB0aGUgcGFyc2VyIHRvIHRoZSBlbXB0eSwgaW5pdGlhbCBzdGF0ZS4KLSAgdm9pZCBSZXNldCgpOwotCi0gIFN0YXRlIEN1cnJlbnRTdGF0ZSgpIHsgcmV0dXJuIHN0YXRlXzsgfTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgT25QYWNrZXRSZWFkeSgpOwotCi0gIC8vIDIgYnl0ZXMgZm9yIG9wY29kZSwgMSBieXRlIGZvciBwYXJhbWV0ZXIgbGVuZ3RoIChWb2x1bWUgMiwgUGFydCBFLCA1LjQuMSkKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQ09NTUFORF9QUkVBTUJMRV9TSVpFID0gMzsKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQ09NTUFORF9MRU5HVEhfT0ZGU0VUID0gMjsKLQotICAvLyAyIGJ5dGVzIGZvciBoYW5kbGUsIDIgYnl0ZXMgZm9yIGRhdGEgbGVuZ3RoIChWb2x1bWUgMiwgUGFydCBFLCA1LjQuMikKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQUNMX1BSRUFNQkxFX1NJWkUgPSA0OwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBBQ0xfTEVOR1RIX09GRlNFVCA9IDI7Ci0KLSAgLy8gMiBieXRlcyBmb3IgaGFuZGxlLCAxIGJ5dGUgZm9yIGRhdGEgbGVuZ3RoIChWb2x1bWUgMiwgUGFydCBFLCA1LjQuMykKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgU0NPX1BSRUFNQkxFX1NJWkUgPSAzOwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBTQ09fTEVOR1RIX09GRlNFVCA9IDI7Ci0KLSAgLy8gMSBieXRlIGZvciBldmVudCBjb2RlLCAxIGJ5dGUgZm9yIHBhcmFtZXRlciBsZW5ndGggKFZvbHVtZSAyLCBQYXJ0Ci0gIC8vIEUsIDUuNC40KQotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBFVkVOVF9QUkVBTUJMRV9TSVpFID0gMjsKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgRVZFTlRfTEVOR1RIX09GRlNFVCA9IDE7Ci0KLSAgLy8gMiBieXRlcyBmb3IgaGFuZGxlIGFuZCBmbGFncywgMTIgYml0cyBmb3IgbGVuZ3RoIChWb2x1bWUgMiwgUGFydCBFLCA1LjQuNSkKLSAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgSVNPX1BSRUFNQkxFX1NJWkUgPSA0OwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBJU09fTEVOR1RIX09GRlNFVCA9IDI7Ci0KLSAgUGFja2V0UmVhZENhbGxiYWNrIGNvbW1hbmRfY2JfOwotICBQYWNrZXRSZWFkQ2FsbGJhY2sgZXZlbnRfY2JfOwotICBQYWNrZXRSZWFkQ2FsbGJhY2sgYWNsX2NiXzsKLSAgUGFja2V0UmVhZENhbGxiYWNrIHNjb19jYl87Ci0gIFBhY2tldFJlYWRDYWxsYmFjayBpc29fY2JfOwotCi0gIHNpemVfdCBIY2lHZXRQYWNrZXRMZW5ndGhGb3JUeXBlKFBhY2tldFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcHJlYW1ibGUpIGNvbnN0OwotCi0gIFBhY2tldFR5cGUgaGNpX3BhY2tldF90eXBlX3tQYWNrZXRUeXBlOjpVTktOT1dOfTsKLQotICBTdGF0ZSBzdGF0ZV97SENJX1RZUEV9OwotICB1aW50OF90IHBhY2tldF90eXBlX3t9OwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZXRfOwotICBzaXplX3QgYnl0ZXNfd2FudGVkX3swfTsKLX07Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDRQYXJzZXI6OlN0YXRlIGNvbnN0JiBzdGF0ZV8pIHsKLSAgb3MgPDwgKHN0YXRlXyA9PSBINFBhcnNlcjo6U3RhdGU6OkhDSV9UWVBFCi0gICAgICAgICAgICAgPyAiSENJX1RZUEUiCi0gICAgICAgICAgICAgOiBzdGF0ZV8gPT0gSDRQYXJzZXI6OlN0YXRlOjpIQ0lfUFJFQU1CTEUgPyAiSENJX1BSRUFNQkxFIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkhDSV9QQVlMT0FEIik7Ci0gIHJldHVybiBvczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaGNpX3Byb3RvY29sLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvaGNpX3Byb3RvY29sLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWRjNTFhLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9wcm90b2NvbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJoY2lfcHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotc2l6ZV90IEhjaVByb3RvY29sOjpXcml0ZVNhZmVseShBc3luY0RhdGFDaGFubmVsKiBzb2NrZXQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgc2l6ZV90IHRyYW5zbWl0dGVkX2xlbmd0aCA9IDA7Ci0gIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgc3NpemVfdCByZXQgPSBzb2NrZXQtPlNlbmQoZGF0YSArIHRyYW5zbWl0dGVkX2xlbmd0aCwgbGVuZ3RoKTsKLQotICAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIGNvbnRpbnVlOwotICAgICAgTE9HX0VSUk9SKCIlcyBlcnJvciB3cml0aW5nIHRvIFVBUlQgKCVzKSIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAvLyBOb3RoaW5nIHdyaXR0ZW4gOigKLSAgICAgIExPR19FUlJPUigiJXMgemVybyBieXRlcyB3cml0dGVuIC0gc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4iLCBfX2Z1bmNfXyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB0cmFuc21pdHRlZF9sZW5ndGggKz0gcmV0OwotICAgIGxlbmd0aCAtPSByZXQ7Ci0gIH0KLQotICByZXR1cm4gdHJhbnNtaXR0ZWRfbGVuZ3RoOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oY2lfcHJvdG9jb2wuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9wcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwMmNjLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9wcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIm5ldC9hc3luY19kYXRhX2NoYW5uZWwuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLXVzaW5nIFBhY2tldFJlYWRDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYpPjsKLXVzaW5nIGFuZHJvaWQ6Om5ldDo6QXN5bmNEYXRhQ2hhbm5lbDsKLQotLy8gSW1wbGVtZW50YXRpb24gb2YgSENJIHByb3RvY29sIGJpdHMgY29tbW9uIHRvIGRpZmZlcmVudCB0cmFuc3BvcnRzCi1jbGFzcyBIY2lQcm90b2NvbCB7Ci0gcHVibGljOgotICBIY2lQcm90b2NvbCgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+SGNpUHJvdG9jb2woKXt9OwotCi0gIC8vIFByb3RvY29sLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHNlbmRpbmcgcGFja2V0cy4KLSAgdmlydHVhbCBzaXplX3QgU2VuZCh1aW50OF90IHR5cGUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgc3RhdGljIHNpemVfdCBXcml0ZVNhZmVseShBc3luY0RhdGFDaGFubmVsKiBzb2NrZXQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oY2lfc29ja2V0X2RldmljZS5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9zb2NrZXRfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZkZjNlLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9zb2NrZXRfZGV2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJoY2lfc29ja2V0X2RldmljZS5oIgotCi0jaW5jbHVkZSA8Y2hyb25vPiAgICAgICAvLyBmb3IgbWlsbGlzZWNvbmRzCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+ICAvLyBmb3IgcmVtb3ZlX2V4dGVudF90Ci0KLSNpbmNsdWRlICJtb2RlbC9kZXZpY2VzL2RldmljZV9wcm9wZXJ0aWVzLmgiICAvLyBmb3IgRGV2aWNlUHJvcGVydGllcwotI2luY2x1ZGUgIm9zL2xvZy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBMT0dfSU5GTywgTE9HX0FMV0FZU19GQVRBTAotCi11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLUhjaVNvY2tldERldmljZTo6SGNpU29ja2V0RGV2aWNlKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydGllc19maWxlbmFtZSkKLSAgICA6IER1YWxNb2RlQ29udHJvbGxlcihwcm9wZXJ0aWVzX2ZpbGVuYW1lKSwgc29ja2V0Xyhzb2NrZXQpIHsKLSAgYWR2ZXJ0aXNpbmdfaW50ZXJ2YWxfbXNfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKTsKLQotICBwYWdlX3NjYW5fZGVsYXlfbXNfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg2MDApOwotCi0gIHByb3BlcnRpZXNfLlNldFBhZ2VTY2FuUmVwZXRpdGlvbk1vZGUoMCk7Ci0gIHByb3BlcnRpZXNfLlNldENsYXNzT2ZEZXZpY2UoMHg2MDA0MjApOwotICBwcm9wZXJ0aWVzXy5TZXRFeHRlbmRlZElucXVpcnlEYXRhKHsKLSAgICAgIDE2LCAgLy8gbGVuZ3RoCi0gICAgICA5LCAgIC8vIFR5cGU6IERldmljZSBOYW1lCi0gICAgICAnZycsCi0gICAgICAnRCcsCi0gICAgICAnZScsCi0gICAgICAndicsCi0gICAgICAnaScsCi0gICAgICAnYycsCi0gICAgICAnZScsCi0gICAgICAnLScsCi0gICAgICAnaCcsCi0gICAgICAnYycsCi0gICAgICAnaScsCi0gICAgICAnXycsCi0gICAgICAnbicsCi0gICAgICAnZScsCi0gICAgICAndCcsCi0gIH0pOwotICBwcm9wZXJ0aWVzXy5TZXROYW1lKHsKLSAgICAgICdnJywKLSAgICAgICdEJywKLSAgICAgICdlJywKLSAgICAgICd2JywKLSAgICAgICdpJywKLSAgICAgICdjJywKLSAgICAgICdlJywKLSAgICAgICctJywKLSAgICAgICdIJywKLSAgICAgICdDJywKLSAgICAgICdJJywKLSAgICAgICdfJywKLSAgICAgICdOJywKLSAgICAgICdlJywKLSAgICAgICd0JywKLSAgfSk7Ci0KLSAgaDRfID0gSDREYXRhQ2hhbm5lbFBhY2tldGl6ZXIoCi0gICAgICBzb2NrZXQsCi0gICAgICBbdGhpc10oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJhd19jb21tYW5kKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4ocmF3X2NvbW1hbmQpOwotICAgICAgICBIYW5kbGVDb21tYW5kKHBhY2tldF9jb3B5KTsKLSAgICAgIH0sCi0gICAgICBbXShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBFdmVudCBpbiBIY2lTb2NrZXREZXZpY2UhIik7Ci0gICAgICB9LAotICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByYXdfYWNsKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4ocmF3X2FjbCk7Ci0gICAgICAgIEhhbmRsZUFjbChwYWNrZXRfY29weSk7Ci0gICAgICB9LAotICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByYXdfc2NvKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4ocmF3X3Njbyk7Ci0gICAgICAgIEhhbmRsZVNjbyhwYWNrZXRfY29weSk7Ci0gICAgICB9LAotICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByYXdfaXNvKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0X2NvcHkgPQotICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4ocmF3X2lzbyk7Ci0gICAgICAgIEhhbmRsZUlzbyhwYWNrZXRfY29weSk7Ci0gICAgICB9LAotICAgICAgW3RoaXNdKCkgewotICAgICAgICBMT0dfSU5GTygiSENJIHNvY2tldCBkZXZpY2UgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIENsb3NlKCk7Ci0gICAgICB9KTsKLQotICBSZWdpc3RlckV2ZW50Q2hhbm5lbChbdGhpc10oc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXQpIHsKLSAgICBTZW5kSGNpKFBhY2tldFR5cGU6OkVWRU5ULCBwYWNrZXQpOwotICB9KTsKLSAgUmVnaXN0ZXJBY2xDaGFubmVsKFt0aGlzXShzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICAgIFNlbmRIY2koUGFja2V0VHlwZTo6QUNMLCBwYWNrZXQpOwotICB9KTsKLSAgUmVnaXN0ZXJTY29DaGFubmVsKFt0aGlzXShzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICAgIFNlbmRIY2koUGFja2V0VHlwZTo6U0NPLCBwYWNrZXQpOwotICB9KTsKLSAgUmVnaXN0ZXJJc29DaGFubmVsKFt0aGlzXShzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHBhY2tldCkgewotICAgIFNlbmRIY2koUGFja2V0VHlwZTo6SVNPLCBwYWNrZXQpOwotICB9KTsKLX0KLQotdm9pZCBIY2lTb2NrZXREZXZpY2U6OlRpbWVyVGljaygpIHsKLSAgaDRfLk9uRGF0YVJlYWR5KHNvY2tldF8pOwotICBEdWFsTW9kZUNvbnRyb2xsZXI6OlRpbWVyVGljaygpOwotfQotCi12b2lkIEhjaVNvY2tldERldmljZTo6U2VuZEhjaSgKLSAgICBQYWNrZXRUeXBlIHBhY2tldF90eXBlLAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gcGFja2V0KSB7Ci0gIGlmICghc29ja2V0XyB8fCAhc29ja2V0Xy0+Q29ubmVjdGVkKCkpIHsKLSAgICBMT0dfSU5GTygiQ2xvc2VkIHNvY2tldC4gRHJvcHBpbmcgcGFja2V0IG9mIHR5cGUgJWQiLAotICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFja2V0X3R5cGUpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCB0eXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFja2V0X3R5cGUpOwotICBoNF8uU2VuZCh0eXBlLCBwYWNrZXQtPmRhdGEoKSwgcGFja2V0LT5zaXplKCkpOwotfQotCi12b2lkIEhjaVNvY2tldERldmljZTo6Q2xvc2UoKSAgewotICBpZiAoc29ja2V0XykgewotICAgIHNvY2tldF8tPkNsb3NlKCk7Ci0gIH0KLSAgRGV2aWNlOjpDbG9zZSgpOwotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9zb2NrZXRfZGV2aWNlLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9oY2lfc29ja2V0X2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWEzNzUyLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2hjaV9zb2NrZXRfZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+ICAgICAvLyBmb3IgdWludDhfdAotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+ICAvLyBmb3IgX19iYXNlLCBmdW5jdGlvbgotI2luY2x1ZGUgPG1lbW9yeT4gICAgICAvLyBmb3Igc2hhcmVkX3B0ciwgbWFrZV8uLi4KLSNpbmNsdWRlIDxzdHJpbmc+ICAgICAgLy8gZm9yIHN0cmluZwotI2luY2x1ZGUgPHZlY3Rvcj4gICAgICAvLyBmb3IgdmVjdG9yCi0KLSNpbmNsdWRlICJtb2RlbC9jb250cm9sbGVyL2R1YWxfbW9kZV9jb250cm9sbGVyLmgiICAgICAvLyBmb3IgRHVhbE1vZGVDb250cm9sbGVyCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9oNF9kYXRhX2NoYW5uZWxfcGFja2V0aXplci5oIiAgLy8gZm9yIENsaWVudERpc2Nvbm5lY3RDLi4uCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9oY2lfcHJvdG9jb2wuaCIgICAgICAgICAgICAgICAgLy8gZm9yIFBhY2tldFJlYWRDYWxsYmFjawotI2luY2x1ZGUgIm5ldC9hc3luY19kYXRhX2NoYW5uZWwuaCIgICAgICAgICAgICAgICAgICAgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyBhbmRyb2lkOjpuZXQ6OkFzeW5jRGF0YUNoYW5uZWw7Ci0KLWNsYXNzIEhjaVNvY2tldERldmljZSA6IHB1YmxpYyBEdWFsTW9kZUNvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgSGNpU29ja2V0RGV2aWNlKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydGllc19maWxlbmFtZSk7Ci0gIH5IY2lTb2NrZXREZXZpY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxIY2lTb2NrZXREZXZpY2U+IENyZWF0ZSgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydGllc19maWxlbmFtZSkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhjaVNvY2tldERldmljZT4oc29ja2V0LCBwcm9wZXJ0aWVzX2ZpbGVuYW1lKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIEdldFR5cGVTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJoY2lfc29ja2V0X2RldmljZSI7Ci0gIH0KLQotICB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlOwotCi0gIHZvaWQgU2VuZEhjaShQYWNrZXRUeXBlIHBhY2tldF90eXBlLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXQpOwotCi0gIHZvaWQgQ2xvc2UoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXRfOwotICBINERhdGFDaGFubmVsUGFja2V0aXplciBoNF97c29ja2V0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Jikge30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYpIHt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mKSB7fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Jikge30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYpIHt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10ge319OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMva2V5Ym9hcmQuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9rZXlib2FyZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4OTcwNC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9rZXlib2FyZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJrZXlib2FyZC5oIgotCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmgiCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLWJvb2wgS2V5Ym9hcmQ6OnJlZ2lzdGVyZWRfID0gRGV2aWNlQm91dGlxdWU6OlJlZ2lzdGVyKCJrZXlib2FyZCIsICZLZXlib2FyZDo6Q3JlYXRlKTsKLQotS2V5Ym9hcmQ6OktleWJvYXJkKCkgewotICBwcm9wZXJ0aWVzXy5TZXRMZUFkdmVydGlzZW1lbnRUeXBlKDB4MDAgLyogQ09OTkVDVEFCTEUgKi8pOwotICBwcm9wZXJ0aWVzXy5TZXRMZUFkdmVydGlzZW1lbnQoezB4MTEsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5IC8qIFRZUEVfTkFNRV9DTVBMICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLCAgLy8gTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMywgIC8vIExlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxIC8qIFRZUEVfRkxBR1MgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAvKiBCUkVEUl9OT1RfU1BUICovIHwgMHgwMiAvKiBHRU5fRElTQ19GTEFHICovfSk7Ci0KLSAgcHJvcGVydGllc18uU2V0TGVTY2FuUmVzcG9uc2UoezB4MDQsICAvLyBMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggLyogVFlQRV9OQU1FX1NIT1JUICovLCAnaycsICdlJywgJ3knfSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEtleWJvYXJkOjpHZXRUeXBlU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gImtleWJvYXJkIjsKLX0KLQotdm9pZCBLZXlib2FyZDo6SW5pdGlhbGl6ZShjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gIGlmIChhcmdzLnNpemUoKSA8IDIpIHJldHVybjsKLQotICBBZGRyZXNzIGFkZHJ7fTsKLSAgaWYgKEFkZHJlc3M6OkZyb21TdHJpbmcoYXJnc1sxXSwgYWRkcikpIHByb3BlcnRpZXNfLlNldExlQWRkcmVzcyhhZGRyKTsKLQotICBpZiAoYXJncy5zaXplKCkgPCAzKSByZXR1cm47Ci0KLSAgU2V0QWR2ZXJ0aXNlbWVudEludGVydmFsKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc3RkOjpzdG9pKGFyZ3NbMl0pKSk7Ci19Ci0KLXZvaWQgS2V5Ym9hcmQ6OlRpbWVyVGljaygpIHsKLSAgaWYgKCFjb25uZWN0ZWRfKSB7Ci0gICAgQmVhY29uOjpUaW1lclRpY2soKTsKLSAgfQotfQotCi12b2lkIEtleWJvYXJkOjpJbmNvbWluZ1BhY2tldChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgaWYgKCFjb25uZWN0ZWRfKSB7Ci0gICAgQmVhY29uOjpJbmNvbWluZ1BhY2tldChwYWNrZXQpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2tleWJvYXJkLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9rZXlib2FyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjAwZGZlLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2tleWJvYXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZGV2aWNlLmgiCi0KLSNpbmNsdWRlICJiZWFjb24uaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIEtleWJvYXJkIDogcHVibGljIEJlYWNvbiB7Ci0gcHVibGljOgotICBLZXlib2FyZCgpOwotICB2aXJ0dWFsIH5LZXlib2FyZCgpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPERldmljZT4gQ3JlYXRlKCkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEtleWJvYXJkPigpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIGRldmljZS4KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRUeXBlU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgfGFyZ3N8LgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBJbmNvbWluZ1BhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBjb25uZWN0ZWRfe2ZhbHNlfTsKLSAgc3RhdGljIGJvb2wgcmVnaXN0ZXJlZF87Ci19OwotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvbGlua19sYXllcl9zb2NrZXRfZGV2aWNlLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvbGlua19sYXllcl9zb2NrZXRfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZkNDcyLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2xpbmtfbGF5ZXJfc29ja2V0X2RldmljZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAibGlua19sYXllcl9zb2NrZXRfZGV2aWNlLmgiCi0KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gIC8vIGZvciByZW1vdmVfZXh0ZW50X3QKLQotI2luY2x1ZGUgIm9zL2xvZy5oIiAgICAgICAgICAgICAgIC8vIGZvciBBU1NFUlQsIExPR19JTkZPLCBMT0dfRVJST1IsIExPR19XQVJOCi0jaW5jbHVkZSAicGFja2V0L2JpdF9pbnNlcnRlci5oIiAgLy8gZm9yIEJpdEluc2VydGVyCi0jaW5jbHVkZSAicGFja2V0L2l0ZXJhdG9yLmgiICAgICAgLy8gZm9yIEl0ZXJhdG9yCi0jaW5jbHVkZSAicGFja2V0L3BhY2tldF92aWV3LmgiICAgLy8gZm9yIFBhY2tldFZpZXcsIGtMaXR0bGVFbmRpYW4KLSNpbmNsdWRlICJwYWNrZXQvcmF3X2J1aWxkZXIuaCIgICAvLyBmb3IgUmF3QnVpbGRlcgotI2luY2x1ZGUgInBhY2tldC92aWV3LmgiICAgICAgICAgIC8vIGZvciBWaWV3Ci0jaW5jbHVkZSAicGh5LmgiICAgICAgICAgICAgICAgICAgLy8gZm9yIFBoeSwgUGh5OjpUeXBlCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotTGlua0xheWVyU29ja2V0RGV2aWNlOjpMaW5rTGF5ZXJTb2NrZXREZXZpY2UoCi0gICAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldF9mZCwgUGh5OjpUeXBlIHBoeV90eXBlKQotICAgIDogc29ja2V0Xyhzb2NrZXRfZmQpLAotICAgICAgcGh5X3R5cGVfKHBoeV90eXBlKSwKLSAgICAgIHNpemVfYnl0ZXNfKHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGtTaXplQnl0ZXMpKSB7fQotCi12b2lkIExpbmtMYXllclNvY2tldERldmljZTo6VGltZXJUaWNrKCkgewotICBpZiAocmVjZWl2aW5nX3NpemVfKSB7Ci0gICAgc3NpemVfdCBieXRlc19yZWNlaXZlZCA9Ci0gICAgICAgIHNvY2tldF8tPlJlY3Yoc2l6ZV9ieXRlc18tPmRhdGEoKSArIG9mZnNldF8sIGtTaXplQnl0ZXMpOwotICAgIGlmIChieXRlc19yZWNlaXZlZCA8PSAwKSB7Ci0gICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgYXZhaWxhYmxlIHlldC4KLSAgICAgICAgLy8gTE9HX0RFQlVHKCJOb3RoaW5nIGF2YWlsYWJsZSB5ZXQuLi4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgTE9HX0lORk8oIkNsb3Npbmcgc29ja2V0LCByZWNlaXZlZDogJXpkLCAlcyIsIGJ5dGVzX3JlY2VpdmVkLAotICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIENsb3NlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgoc2l6ZV90KWJ5dGVzX3JlY2VpdmVkIDwgYnl0ZXNfbGVmdF8pIHsKLSAgICAgIGJ5dGVzX2xlZnRfIC09IGJ5dGVzX3JlY2VpdmVkOwotICAgICAgb2Zmc2V0XyArPSBieXRlc19yZWNlaXZlZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc8Ymx1ZXRvb3RoOjpwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+IHNpemUoCi0gICAgICAgIHtibHVldG9vdGg6OnBhY2tldDo6VmlldyhzaXplX2J5dGVzXywgMCwga1NpemVCeXRlcyl9KTsKLSAgICBieXRlc19sZWZ0XyA9IHNpemUuYmVnaW4oKS5leHRyYWN0PHVpbnQzMl90PigpOwotICAgIHJlY2VpdmVkXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KGJ5dGVzX2xlZnRfKTsKLSAgICBvZmZzZXRfID0gMDsKLSAgICByZWNlaXZpbmdfc2l6ZV8gPSBmYWxzZTsKLSAgfQotICBzc2l6ZV90IGJ5dGVzX3JlY2VpdmVkID0KLSAgICAgIHNvY2tldF8tPlJlY3YocmVjZWl2ZWRfLT5kYXRhKCkgKyBvZmZzZXRfLCBieXRlc19sZWZ0Xyk7Ci0gIGlmIChieXRlc19yZWNlaXZlZCA8PSAwKSB7Ci0gICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgewotICAgICAgICAvLyBOb3RoaW5nIGF2YWlsYWJsZSB5ZXQuCi0gICAgICAgIC8vIExPR19ERUJVRygiTm90aGluZyBhdmFpbGFibGUgeWV0Li4uIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICBMT0dfSU5GTygiQ2xvc2luZyBzb2NrZXQsIHJlY2VpdmVkOiAlemQsICVzIiwgYnl0ZXNfcmVjZWl2ZWQsCi0gICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBDbG9zZSgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoKHNpemVfdClieXRlc19yZWNlaXZlZCA8IGJ5dGVzX2xlZnRfKSB7Ci0gICAgYnl0ZXNfbGVmdF8gLT0gYnl0ZXNfcmVjZWl2ZWQ7Ci0gICAgb2Zmc2V0XyArPSBieXRlc19yZWNlaXZlZDsKLSAgICByZXR1cm47Ci0gIH0KLSAgYnl0ZXNfbGVmdF8gPSBrU2l6ZUJ5dGVzOwotICBvZmZzZXRfID0gMDsKLSAgcmVjZWl2aW5nX3NpemVfID0gdHJ1ZTsKLSAgYXV0byBwYWNrZXQgPSBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0Vmlldzo6Q3JlYXRlKAotICAgICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc8Ymx1ZXRvb3RoOjpwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KAotICAgICAgICAgIHJlY2VpdmVkXykpOwotICBBU1NFUlQocGFja2V0LklzVmFsaWQoKSk7Ci0gIFNlbmRMaW5rTGF5ZXJQYWNrZXQocGFja2V0LCBwaHlfdHlwZV8pOwotfQotCi12b2lkIExpbmtMYXllclNvY2tldERldmljZTo6Q2xvc2UoKQotewotICBpZiAoc29ja2V0XykgewotICAgIHNvY2tldF8tPkNsb3NlKCk7Ci0gIH0KLSAgRGV2aWNlOjpDbG9zZSgpOwotfQotCi12b2lkIExpbmtMYXllclNvY2tldERldmljZTo6SW5jb21pbmdQYWNrZXQoCi0gICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSB7Ci0gIGF1dG8gc2l6ZV9wYWNrZXQgPSBibHVldG9vdGg6OnBhY2tldDo6UmF3QnVpbGRlcigpOwotICBzaXplX3BhY2tldC5BZGRPY3RldHM0KHBhY2tldC5zaXplKCkpOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaXplX2J5dGVzOwotICBibHVldG9vdGg6OnBhY2tldDo6Qml0SW5zZXJ0ZXIgYml0X2luc2VydGVyKHNpemVfYnl0ZXMpOwotICBzaXplX3BhY2tldC5TZXJpYWxpemUoYml0X2luc2VydGVyKTsKLQotICBpZiAoc29ja2V0Xy0+U2VuZChzaXplX2J5dGVzLmRhdGEoKSwgc2l6ZV9ieXRlcy5zaXplKCkpID09IGtTaXplQnl0ZXMpIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXlsb2FkX2J5dGVze3BhY2tldC5iZWdpbigpLCBwYWNrZXQuZW5kKCl9OwotICAgIHNvY2tldF8tPlNlbmQocGF5bG9hZF9ieXRlcy5kYXRhKCksIHBheWxvYWRfYnl0ZXMuc2l6ZSgpKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9saW5rX2xheWVyX3NvY2tldF9kZXZpY2UuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2xpbmtfbGF5ZXJfc29ja2V0X2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBlNmI5Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL2xpbmtfbGF5ZXJfc29ja2V0X2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBzaXplX3QKLQotI2luY2x1ZGUgPGNzdGRpbnQ+ICAvLyBmb3IgdWludDhfdCwgdWludDMyX3QKLSNpbmNsdWRlIDxtZW1vcnk+ICAgLy8gZm9yIHNoYXJlZF9wdHIsIG1ha2Vfc2hhcmVkCi0jaW5jbHVkZSA8c3RyaW5nPiAgIC8vIGZvciBzdHJpbmcKLSNpbmNsdWRlIDx2ZWN0b3I+ICAgLy8gZm9yIHZlY3RvcgotCi0jaW5jbHVkZSAiZGV2aWNlLmgiICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBEZXZpY2UKLSNpbmNsdWRlICJpbmNsdWRlL3BoeS5oIiAgICAgICAgICAgICAgICAgLy8gZm9yIFBoeSwgUGh5OjpUeXBlCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIiAgICAgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0jaW5jbHVkZSAicGFja2V0cy9saW5rX2xheWVyX3BhY2tldHMuaCIgIC8vIGZvciBMaW5rTGF5ZXJQYWNrZXRWaWV3Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyBhbmRyb2lkOjpuZXQ6OkFzeW5jRGF0YUNoYW5uZWw7Ci0KLWNsYXNzIExpbmtMYXllclNvY2tldERldmljZSA6IHB1YmxpYyBEZXZpY2UgewotIHB1YmxpYzoKLSAgTGlua0xheWVyU29ja2V0RGV2aWNlKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXRfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBQaHk6OlR5cGUgcGh5X3R5cGUpOwotICBMaW5rTGF5ZXJTb2NrZXREZXZpY2UoTGlua0xheWVyU29ja2V0RGV2aWNlJiYgcykgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5MaW5rTGF5ZXJTb2NrZXREZXZpY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IENyZWF0ZSgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXRfZmQsIFBoeTo6VHlwZSBwaHlfdHlwZSkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPExpbmtMYXllclNvY2tldERldmljZT4oc29ja2V0X2ZkLCBwaHlfdHlwZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFR5cGVTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJsaW5rX2xheWVyX3NvY2tldF9kZXZpY2UiOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Jikgb3ZlcnJpZGUge30KLQotICB2aXJ0dWFsIHZvaWQgSW5jb21pbmdQYWNrZXQoCi0gICAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBUaW1lclRpY2soKSBvdmVycmlkZTsKLQotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU2l6ZUJ5dGVzID0gc2l6ZW9mKHVpbnQzMl90KTsKLQotICB2b2lkIFJlZ2lzdGVyQ2xvc2VDYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4pOwotCi0gIHZvaWQgQ2xvc2UoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXRfOwotICBQaHk6OlR5cGUgcGh5X3R5cGVfOwotICBib29sIHJlY2VpdmluZ19zaXplX3t0cnVlfTsKLSAgc2l6ZV90IGJ5dGVzX2xlZnRfe2tTaXplQnl0ZXN9OwotICBzaXplX3Qgb2Zmc2V0X3swfTsKLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBzaXplX2J5dGVzXzsKLSAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiByZWNlaXZlZF87Ci0gIHN0ZDo6dmVjdG9yPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3PiBwYWNrZXRfcXVldWVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvbG9vcGJhY2suY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9sb29wYmFjay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzZjk1ZC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9sb29wYmFjay5jYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJsb29wYmFjay5oIgotCi0jaW5jbHVkZSAibGVfYWR2ZXJ0aXNlbWVudC5oIgotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2RldmljZV9ib3V0aXF1ZS5oIgotI2luY2x1ZGUgIm9zL2xvZy5oIgotCi11c2luZyBzdGQ6OnZlY3RvcjsKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWJvb2wgTG9vcGJhY2s6OnJlZ2lzdGVyZWRfID0gRGV2aWNlQm91dGlxdWU6OlJlZ2lzdGVyKCJsb29wYmFjayIsICZMb29wYmFjazo6Q3JlYXRlKTsKLQotTG9vcGJhY2s6Okxvb3BiYWNrKCkgewotICBhZHZlcnRpc2luZ19pbnRlcnZhbF9tc18gPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEyODApOwotICBwcm9wZXJ0aWVzXy5TZXRMZUFkdmVydGlzZW1lbnRUeXBlKDB4MDMpOyAgLy8gTk9OX0NPTk5FQ1QKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50KHsKLSAgICAgIDB4MTEsICAvLyBMZW5ndGgKLSAgICAgIDB4MDksICAvLyBOQU1FX0NNUEwKLSAgICAgICdnJywgICAgICAgICAnRCcsICdlJywgJ3YnLCAnaScsICdjJywgJ2UnLCAnLScsICdsJywgJ28nLCAnbycsICdwJywgJ2InLCAnYScsICdjJywgJ2snLAotICAgICAgMHgwMiwgICAgICAgICAvLyBMZW5ndGgKLSAgICAgIDB4MDEsICAgICAgICAgLy8gVFlQRV9GTEFHCi0gICAgICAweDA0IHwgMHgwMiwgIC8vIEJSRURSX05PVF9TUFQgfCBHRU5fRElTQwotICB9KTsKLQotICBwcm9wZXJ0aWVzXy5TZXRMZVNjYW5SZXNwb25zZSh7MHgwNSwgIC8vIExlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgIC8vIE5BTUVfU0hPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJywgJ28nLCAnbycsICdwJ30pOwotfQotCi1zdGQ6OnN0cmluZyBMb29wYmFjazo6R2V0VHlwZVN0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuICJsb29wYmFjayI7Ci19Ci0KLXN0ZDo6c3RyaW5nIExvb3BiYWNrOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgZGV2ID0gR2V0VHlwZVN0cmluZygpICsgIkAiICsgcHJvcGVydGllc18uR2V0TGVBZGRyZXNzKCkuVG9TdHJpbmcoKTsKLQotICByZXR1cm4gZGV2OwotfQotCi12b2lkIExvb3BiYWNrOjpJbml0aWFsaXplKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMikgcmV0dXJuOwotCi0gIEFkZHJlc3MgYWRkcnt9OwotICBpZiAoQWRkcmVzczo6RnJvbVN0cmluZyhhcmdzWzFdLCBhZGRyKSkgcHJvcGVydGllc18uU2V0TGVBZGRyZXNzKGFkZHIpOwotCi0gIGlmIChhcmdzLnNpemUoKSA8IDMpIHJldHVybjsKLQotICBTZXRBZHZlcnRpc2VtZW50SW50ZXJ2YWwoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhzdGQ6OnN0b2koYXJnc1syXSkpKTsKLX0KLQotdm9pZCBMb29wYmFjazo6VGltZXJUaWNrKCkge30KLQotdm9pZCBMb29wYmFjazo6SW5jb21pbmdQYWNrZXQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSB7Ci0gIExPR19JTkZPKCJHb3QgYSBwYWNrZXQgb2YgdHlwZSAlZCIsIHN0YXRpY19jYXN0PGludD4ocGFja2V0LkdldFR5cGUoKSkpOwotICBpZiAocGFja2V0LkdldERlc3RpbmF0aW9uQWRkcmVzcygpID09IHByb3BlcnRpZXNfLkdldExlQWRkcmVzcygpICYmCi0gICAgICBwYWNrZXQuR2V0VHlwZSgpID09IG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpMRV9TQ0FOKSB7Ci0gICAgTE9HX0lORk8oIkdvdCBhIHNjYW4iKTsKLQotICAgIGF1dG8gc2Nhbl9yZXNwb25zZSA9IG1vZGVsOjpwYWNrZXRzOjpMZVNjYW5SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgcHJvcGVydGllc18uR2V0TGVBZGRyZXNzKCksIHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCksCi0gICAgICAgIG1vZGVsOjpwYWNrZXRzOjpBZGRyZXNzVHlwZTo6UFVCTElDLAotICAgICAgICBtb2RlbDo6cGFja2V0czo6QWR2ZXJ0aXNlbWVudFR5cGU6OlNDQU5fUkVTUE9OU0UsCi0gICAgICAgIHByb3BlcnRpZXNfLkdldExlU2NhblJlc3BvbnNlKCkpOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4gdG9fc2VuZCA9Ci0gICAgICAgIHN0ZDo6bW92ZShzY2FuX3Jlc3BvbnNlKTsKLQotICAgIFNlbmRMaW5rTGF5ZXJQYWNrZXQodG9fc2VuZCwgUGh5OjpUeXBlOjpMT1dfRU5FUkdZKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9sb29wYmFjay5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvbG9vcGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YzA2OS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9sb29wYmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImRldmljZS5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotLy8gQSBzaW1wbGUgZGV2aWNlIHRoYXQgYWR2ZXJ0aXNlcyBwZXJpb2RpY2FsbHkgYW5kIGlzIG5vdCBjb25uZWN0YWJsZS4KLWNsYXNzIExvb3BiYWNrIDogcHVibGljIERldmljZSB7Ci0gcHVibGljOgotICBMb29wYmFjaygpOwotICB2aXJ0dWFsIH5Mb29wYmFjaygpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPERldmljZT4gQ3JlYXRlKCkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPExvb3BiYWNrPigpOwotICB9Ci0KLSAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIGRldmljZS4KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRUeXBlU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotICAvLyBTZXQgdGhlIGFkZHJlc3MgYW5kIGFkdmVydGlzaW5nIGludGVydmFsIGZyb20gc3RyaW5nIGFyZ3MuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIEluY29taW5nUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgVGltZXJUaWNrKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3JlbW90ZV9sb29wYmFja19kZXZpY2UuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9yZW1vdGVfbG9vcGJhY2tfZGV2aWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk5YTdjLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3JlbW90ZV9sb29wYmFja19kZXZpY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicmVtb3RlX2xvb3BiYWNrX2RldmljZS5oIgotCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotdXNpbmcgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXc7Ci11c2luZyBtb2RlbDo6cGFja2V0czo6UGFnZVJlc3BvbnNlQnVpbGRlcjsKLQotYm9vbCBSZW1vdGVMb29wYmFja0RldmljZTo6cmVnaXN0ZXJlZF8gPSBEZXZpY2VCb3V0aXF1ZTo6UmVnaXN0ZXIoInJlbW90ZV9sb29wYmFjayIsICZSZW1vdGVMb29wYmFja0RldmljZTo6Q3JlYXRlKTsKLQotUmVtb3RlTG9vcGJhY2tEZXZpY2U6OlJlbW90ZUxvb3BiYWNrRGV2aWNlKCkge30KLQotc3RkOjpzdHJpbmcgUmVtb3RlTG9vcGJhY2tEZXZpY2U6OlRvU3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gR2V0VHlwZVN0cmluZygpICsgIiAobm8gYWRkcmVzcykiOwotfQotCi12b2lkIFJlbW90ZUxvb3BiYWNrRGV2aWNlOjpJbml0aWFsaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPCAyKSByZXR1cm47Ci0KLSAgQWRkcmVzcyBhZGRye307Ci0gIGlmIChBZGRyZXNzOjpGcm9tU3RyaW5nKGFyZ3NbMV0sIGFkZHIpKSBwcm9wZXJ0aWVzXy5TZXRBZGRyZXNzKGFkZHIpOwotfQotCi12b2lkIFJlbW90ZUxvb3BiYWNrRGV2aWNlOjpJbmNvbWluZ1BhY2tldCgKLSAgICBtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIHsKLSAgLy8gVE9ETzogQ2hlY2sgc2VuZGVyPwotICAvLyBUT0RPOiBIYW5kbGUgb3RoZXIgcGFja2V0IHR5cGVzCi0gIFBoeTo6VHlwZSBwaHlfdHlwZSA9IFBoeTo6VHlwZTo6QlJfRURSOwotCi0gIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlIHR5cGUgPSBwYWNrZXQuR2V0VHlwZSgpOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIG1vZGVsOjpwYWNrZXRzOjpQYWNrZXRUeXBlOjpQQUdFOgotICAgICAgU2VuZExpbmtMYXllclBhY2tldCgKLSAgICAgICAgICBQYWdlUmVzcG9uc2VCdWlsZGVyOjpDcmVhdGUocGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKSwgdHJ1ZSksCi0gICAgICAgICAgUGh5OjpUeXBlOjpCUl9FRFIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogewotICAgICAgTE9HX1dBUk4oIlJlc2VuZCA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihwYWNrZXQuc2l6ZSgpKSk7Ci0gICAgICBTZW5kTGlua0xheWVyUGFja2V0KHBhY2tldCwgcGh5X3R5cGUpOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9yZW1vdGVfbG9vcGJhY2tfZGV2aWNlLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9yZW1vdGVfbG9vcGJhY2tfZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YzlhODMuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL2RldmljZXMvcmVtb3RlX2xvb3BiYWNrX2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImRldmljZS5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgUmVtb3RlTG9vcGJhY2tEZXZpY2UgOiBwdWJsaWMgRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIFJlbW90ZUxvb3BiYWNrRGV2aWNlKCk7Ci0gIHZpcnR1YWwgflJlbW90ZUxvb3BiYWNrRGV2aWNlKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPiBDcmVhdGUoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8UmVtb3RlTG9vcGJhY2tEZXZpY2U+KCk7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFR5cGVTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJyZW1vdGVfbG9vcGJhY2tfZGV2aWNlIjsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBJbmNvbWluZ1BhY2tldCgKLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbi5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZWQ1YS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zY3JpcHRlZF9iZWFjb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNjcmlwdGVkX2JlYWNvbi5oIgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9zY3JpcHRlZF9iZWFjb25fYmxlX3BheWxvYWQucGIuaCIKLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9kZXZpY2VfYm91dGlxdWUuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBGX09LIDAwCi0jZGVmaW5lIFJfT0sgMDQKLSNlbmRpZgotCi11c2luZyBzdGQ6OnZlY3RvcjsKLXVzaW5nIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s7Ci11c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLWJvb2wgU2NyaXB0ZWRCZWFjb246OnJlZ2lzdGVyZWRfID0KLSAgICBEZXZpY2VCb3V0aXF1ZTo6UmVnaXN0ZXIoInNjcmlwdGVkX2JlYWNvbiIsICZTY3JpcHRlZEJlYWNvbjo6Q3JlYXRlKTsKLVNjcmlwdGVkQmVhY29uOjpTY3JpcHRlZEJlYWNvbigpIHsKLSAgYWR2ZXJ0aXNpbmdfaW50ZXJ2YWxfbXNfID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMjgwKTsKLSAgcHJvcGVydGllc18uU2V0TGVBZHZlcnRpc2VtZW50VHlwZSgweDAyIC8qIFNDQU5OQUJMRSAqLyk7Ci0gIHByb3BlcnRpZXNfLlNldExlQWR2ZXJ0aXNlbWVudCh7Ci0gICAgICAweDE4LCAgLy8gTGVuZ3RoCi0gICAgICAweDA5IC8qIFRZUEVfTkFNRV9DTVBMICovLAotICAgICAgJ2cnLAotICAgICAgJ0QnLAotICAgICAgJ2UnLAotICAgICAgJ3YnLAotICAgICAgJ2knLAotICAgICAgJ2MnLAotICAgICAgJ2UnLAotICAgICAgJy0nLAotICAgICAgJ3MnLAotICAgICAgJ2MnLAotICAgICAgJ3InLAotICAgICAgJ2knLAotICAgICAgJ3AnLAotICAgICAgJ3QnLAotICAgICAgJ2UnLAotICAgICAgJ2QnLAotICAgICAgJy0nLAotICAgICAgJ2InLAotICAgICAgJ2UnLAotICAgICAgJ2EnLAotICAgICAgJ2MnLAotICAgICAgJ28nLAotICAgICAgJ24nLAotICAgICAgMHgwMiwgIC8vIExlbmd0aAotICAgICAgMHgwMSAvKiBUWVBFX0ZMQUcgKi8sCi0gICAgICAweDQgLyogQlJFRFJfTk9UX1NQVCAqLyB8IDB4MiAvKiBHRU5fRElTQ19GTEFHICovLAotICB9KTsKLQotICBwcm9wZXJ0aWVzXy5TZXRMZVNjYW5SZXNwb25zZSh7MHgwNSwgIC8vIExlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgIC8vIFRZUEVfTkFNRV9TSE9SVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAnYicsICdlJywgJ2EnfSk7Ci0gIExPR19JTkZPKCJTY3JpcHRlZF9iZWFjb24gcmVnaXN0ZXJlZCAlcyIsIHJlZ2lzdGVyZWRfID8gInRydWUiIDogImZhbHNlIik7Ci19Ci0KLWJvb2wgaGFzX3RpbWVfZWxhcHNlZChzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgdGltZV9wb2ludCkgewotICByZXR1cm4gc3RlYWR5X2Nsb2NrOjpub3coKSA+IHRpbWVfcG9pbnQ7Ci19Ci0KLXZvaWQgU2NyaXB0ZWRCZWFjb246OkluaXRpYWxpemUoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPCAyKSB7Ci0gICAgTE9HX0VSUk9SKAotICAgICAgICAiSW5pdGlhbGl6YXRpb24gZmFpbGVkLCBuZWVkIG1hYyBhZGRyZXNzLCBwbGF5YmFjayBhbmQgcGxheWJhY2sgZXZlbnRzICIKLSAgICAgICAgImZpbGUgYXJndW1lbnRzIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQWRkcmVzcyBhZGRye307Ci0gIGlmIChBZGRyZXNzOjpGcm9tU3RyaW5nKGFyZ3NbMV0sIGFkZHIpKSBwcm9wZXJ0aWVzXy5TZXRMZUFkZHJlc3MoYWRkcik7Ci0KLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgNCkgewotICAgIExPR19FUlJPUigKLSAgICAgICAgIkluaXRpYWxpemF0aW9uIGZhaWxlZCwgbmVlZCBwbGF5YmFjayBhbmQgcGxheWJhY2sgZXZlbnRzIGZpbGUgIgotICAgICAgICAiYXJndW1lbnRzIik7Ci0gIH0KLSAgY29uZmlnX2ZpbGVfID0gYXJnc1syXTsKLSAgZXZlbnRzX2ZpbGVfID0gYXJnc1szXTsKLSAgc2V0X3N0YXRlKFBsYXliYWNrRXZlbnQ6OklOSVRJQUxJWkVEKTsKLX0KLQotdm9pZCBTY3JpcHRlZEJlYWNvbjo6cG9wdWxhdGVfZXZlbnQoUGxheWJhY2tFdmVudCAqIGV2ZW50LCBQbGF5YmFja0V2ZW50OjpQbGF5YmFja0V2ZW50VHlwZSB0eXBlKSB7Ci0gIExPR19JTkZPKCJBZGRpbmcgZXZlbnQ6ICVkIiwgdHlwZSk7Ci0gIGV2ZW50LT5zZXRfdHlwZSh0eXBlKTsKLSAgZXZlbnQtPnNldF9zZWNzX3NpbmNlX2Vwb2NoKHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwotfQotCi0vLyBBZGRzIGV2ZW50cyB0byBldmVudHMgZmlsZTsgd2Ugd29uJ3QgYmUgYWJsZSB0byBwb3N0IGFueXRoaW5nIHRvIHRoZSBmaWxlCi0vLyB1bnRpbCB3ZSBzZXQgdG8gcGVybWlzc2l2ZSBtb2RlIGluIHRlc3RzLiBObyBldmVudHMgYXJlIHBvc3RlZCB1bnRpbCB0aGVuLgotdm9pZCBTY3JpcHRlZEJlYWNvbjo6c2V0X3N0YXRlKFBsYXliYWNrRXZlbnQ6OlBsYXliYWNrRXZlbnRUeXBlIHN0YXRlKSB7Ci0gIFBsYXliYWNrRXZlbnQgZXZlbnQ7Ci0gIGN1cnJlbnRfc3RhdGVfID0gc3RhdGU7Ci0gIGlmICghZXZlbnRzX29zdHJlYW1fLmlzX29wZW4oKSkgewotICAgIGV2ZW50c19vc3RyZWFtXy5vcGVuKGV2ZW50c19maWxlXywgc3RkOjppb3M6Om91dCB8IHN0ZDo6aW9zOjpiaW5hcnkgfCBzdGQ6Omlvczo6dHJ1bmMpOwotICAgIGlmICghZXZlbnRzX29zdHJlYW1fLmlzX29wZW4oKSkgewotICAgICAgTE9HX0lORk8oIkV2ZW50cyBmaWxlIG5vdCBvcGVuZWQgeWV0LCBmb3IgZXZlbnQ6ICVkIiwgc3RhdGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBwb3B1bGF0ZV9ldmVudCgmZXZlbnQsIHN0YXRlKTsKLSAgZXZlbnQuU2VyaWFsaXplVG9Pc3RyZWFtKCZldmVudHNfb3N0cmVhbV8pOwotICBldmVudHNfb3N0cmVhbV8uZmx1c2goKTsKLX0KLQotdm9pZCBTY3JpcHRlZEJlYWNvbjo6VGltZXJUaWNrKCkgewotICBzd2l0Y2ggKGN1cnJlbnRfc3RhdGVfKSB7Ci0gICAgY2FzZSBQbGF5YmFja0V2ZW50OjpJTklUSUFMSVpFRDoKLSAgICAgIEJlYWNvbjo6VGltZXJUaWNrKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBsYXliYWNrRXZlbnQ6OlNDQU5ORURfT05DRToKLSAgICAgIG5leHRfY2hlY2tfdGltZV8gPQotICAgICAgICAgIHN0ZWFkeV9jbG9jazo6bm93KCkgKyBzdGVhZHlfY2xvY2s6OmR1cmF0aW9uKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKLSAgICAgIHNldF9zdGF0ZShQbGF5YmFja0V2ZW50OjpXQUlUSU5HX0ZPUl9GSUxFKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUGxheWJhY2tFdmVudDo6V0FJVElOR19GT1JfRklMRToKLSAgICAgIGlmICghaGFzX3RpbWVfZWxhcHNlZChuZXh0X2NoZWNrX3RpbWVfKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBuZXh0X2NoZWNrX3RpbWVfID0KLSAgICAgICAgICBzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RlYWR5X2Nsb2NrOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7Ci0gICAgICBpZiAoYWNjZXNzKGNvbmZpZ19maWxlXy5jX3N0cigpLCBGX09LKSA9PSAtMSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzZXRfc3RhdGUoUGxheWJhY2tFdmVudDo6V0FJVElOR19GT1JfRklMRV9UT19CRV9SRUFEQUJMRSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBsYXliYWNrRXZlbnQ6OldBSVRJTkdfRk9SX0ZJTEVfVE9fQkVfUkVBREFCTEU6Ci0gICAgICBpZiAoYWNjZXNzKGNvbmZpZ19maWxlXy5jX3N0cigpLCBSX09LKSA9PSAtMSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzZXRfc3RhdGUoUGxheWJhY2tFdmVudDo6UEFSU0lOR19GSUxFKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUGxheWJhY2tFdmVudDo6UEFSU0lOR19GSUxFOiB7Ci0gICAgICBpZiAoIWhhc190aW1lX2VsYXBzZWQobmV4dF9jaGVja190aW1lXykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc3RkOjpmc3RyZWFtIGlucHV0KGNvbmZpZ19maWxlXywgc3RkOjppb3M6OmluIHwgc3RkOjppb3M6OmJpbmFyeSk7Ci0gICAgICBpZiAoIWJsZV9hZF9saXN0Xy5QYXJzZUZyb21Jc3RyZWFtKCZpbnB1dCkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgcGFyc2UgcGxheWJhY2sgZmlsZSAlcyIsIGNvbmZpZ19maWxlXy5jX3N0cigpKTsKLSAgICAgICAgc2V0X3N0YXRlKFBsYXliYWNrRXZlbnQ6OkZJTEVfUEFSU0lOR19GQUlMRUQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZXRfc3RhdGUoUGxheWJhY2tFdmVudDo6UExBWUJBQ0tfU1RBUlRFRCk7Ci0gICAgICAgIExPR19JTkZPKCJTdGFydGluZyBCbGUgYWR2ZXJ0aXNlbWVudCBwbGF5YmFjayBmcm9tIGZpbGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGVfLmNfc3RyKCkpOwotICAgICAgICBuZXh0X2FkXy5hZF90aW1lID0gc3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICAgICAgZ2V0X25leHRfYWR2ZXJ0aXNlbWVudCgpOwotICAgICAgICBpbnB1dC5jbG9zZSgpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBQbGF5YmFja0V2ZW50OjpQTEFZQkFDS19TVEFSVEVEOiB7Ci0gICAgICB3aGlsZSAoaGFzX3RpbWVfZWxhcHNlZChuZXh0X2FkXy5hZF90aW1lKSkgewotICAgICAgICBhdXRvIGFkID0gbW9kZWw6OnBhY2tldHM6OkxlQWR2ZXJ0aXNlbWVudEJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICAgIG5leHRfYWRfLmFkZHJlc3MsIEFkZHJlc3M6OmtFbXB0eSAvKiBEZXN0aW5hdGlvbiAqLywKLSAgICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpBZGRyZXNzVHlwZTo6UkFORE9NLAotICAgICAgICAgICAgbW9kZWw6OnBhY2tldHM6OkFkdmVydGlzZW1lbnRUeXBlOjpBRFZfTk9OQ09OTl9JTkQsIG5leHRfYWRfLmFkKTsKLSAgICAgICAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUoYWQpLCBQaHk6OlR5cGU6OkxPV19FTkVSR1kpOwotICAgICAgICBpZiAocGFja2V0X251bV8gPCBibGVfYWRfbGlzdF8uYWR2ZXJ0aXNlbWVudHMoKS5zaXplKCkpIHsKLSAgICAgICAgICBnZXRfbmV4dF9hZHZlcnRpc2VtZW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2V0X3N0YXRlKFBsYXliYWNrRXZlbnQ6OlBMQVlCQUNLX0VOREVEKTsKLSAgICAgICAgICBpZiAoZXZlbnRzX29zdHJlYW1fLmlzX29wZW4oKSkgewotICAgICAgICAgICAgZXZlbnRzX29zdHJlYW1fLmNsb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIExPR19JTkZPKAotICAgICAgICAgICAgICAiQ29tcGxldGVkIEJsZSBhZHZlcnRpc2VtZW50IHBsYXliYWNrIGZyb20gZmlsZTogJXMgd2l0aCAlZCAiCi0gICAgICAgICAgICAgICJwYWNrZXRzIiwKLSAgICAgICAgICAgICAgY29uZmlnX2ZpbGVfLmNfc3RyKCksIHBhY2tldF9udW1fKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBQbGF5YmFja0V2ZW50OjpGSUxFX1BBUlNJTkdfRkFJTEVEOgotICAgIGNhc2UgUGxheWJhY2tFdmVudDo6UExBWUJBQ0tfRU5ERUQ6Ci0gICAgY2FzZSBQbGF5YmFja0V2ZW50OjpVTktOT1dOOgotICAgICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgU2NyaXB0ZWRCZWFjb246OkluY29taW5nUGFja2V0KAotICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICBpZiAoY3VycmVudF9zdGF0ZV8gPT0gUGxheWJhY2tFdmVudDo6SU5JVElBTElaRUQpIHsKLSAgICBpZiAocGFja2V0LkdldERlc3RpbmF0aW9uQWRkcmVzcygpID09IHByb3BlcnRpZXNfLkdldExlQWRkcmVzcygpICYmCi0gICAgICAgIHBhY2tldC5HZXRUeXBlKCkgPT0gbW9kZWw6OnBhY2tldHM6OlBhY2tldFR5cGU6OkxFX1NDQU4pIHsKLSAgICAgIGF1dG8gc2Nhbl9yZXNwb25zZSA9IG1vZGVsOjpwYWNrZXRzOjpMZVNjYW5SZXNwb25zZUJ1aWxkZXI6OkNyZWF0ZSgKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3MoKSwgcGFja2V0LkdldFNvdXJjZUFkZHJlc3MoKSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxtb2RlbDo6cGFja2V0czo6QWRkcmVzc1R5cGU+KAotICAgICAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZUFkZHJlc3NUeXBlKCkpLAotICAgICAgICAgIG1vZGVsOjpwYWNrZXRzOjpBZHZlcnRpc2VtZW50VHlwZTo6U0NBTl9SRVNQT05TRSwKLSAgICAgICAgICBwcm9wZXJ0aWVzXy5HZXRMZVNjYW5SZXNwb25zZSgpKTsKLSAgICAgIHNldF9zdGF0ZShQbGF5YmFja0V2ZW50OjpTQ0FOTkVEX09OQ0UpOwotICAgICAgU2VuZExpbmtMYXllclBhY2tldChzdGQ6Om1vdmUoc2Nhbl9yZXNwb25zZSksIFBoeTo6VHlwZTo6TE9XX0VORVJHWSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgU2NyaXB0ZWRCZWFjb246OmdldF9uZXh0X2FkdmVydGlzZW1lbnQoKSB7Ci0gIHN0ZDo6c3RyaW5nIHBheWxvYWQgPSBibGVfYWRfbGlzdF8uYWR2ZXJ0aXNlbWVudHMocGFja2V0X251bV8pLnBheWxvYWQoKTsKLSAgc3RkOjpzdHJpbmcgbWFjX2FkZHJlc3MgPQotICAgICAgYmxlX2FkX2xpc3RfLmFkdmVydGlzZW1lbnRzKHBhY2tldF9udW1fKS5tYWNfYWRkcmVzcygpOwotICB1aW50MzJfdCBkZWxheV9iZWZvcmVfc2VuZF9tcyA9Ci0gICAgICBibGVfYWRfbGlzdF8uYWR2ZXJ0aXNlbWVudHMocGFja2V0X251bV8pLmRlbGF5X2JlZm9yZV9zZW5kX21zKCk7Ci0gIG5leHRfYWRfLmFkLmFzc2lnbihwYXlsb2FkLmJlZ2luKCksIHBheWxvYWQuZW5kKCkpOwotICBpZiAoQWRkcmVzczo6SXNWYWxpZEFkZHJlc3MobWFjX2FkZHJlc3MpKSB7Ci0gICAgLy8gZm9ybWF0dGVkIHN0cmluZyB3aXRoIGNvbG9ucyBsaWtlICIxMjozNDo1Njo3ODo5YTpiYyIKLSAgICBBZGRyZXNzOjpGcm9tU3RyaW5nKG1hY19hZGRyZXNzLCBuZXh0X2FkXy5hZGRyZXNzKTsKLSAgfSBlbHNlIGlmIChtYWNfYWRkcmVzcy5zaXplKCkgPT0gQWRkcmVzczo6a0xlbmd0aCkgewotICAgIC8vIHNpeC1ieXRlIGJpbmFyeSBhZGRyZXNzCi0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWFjX3ZlY3RvcihtYWNfYWRkcmVzcy5jYmVnaW4oKSwgbWFjX2FkZHJlc3MuY2VuZCgpKTsKLSAgICBuZXh0X2FkXy5hZGRyZXNzLkFkZHJlc3M6OkZyb21PY3RldHMobWFjX3ZlY3Rvci5kYXRhKCkpOwotICB9IGVsc2UgewotICAgIEFkZHJlc3M6OkZyb21TdHJpbmcoIkJBOkQwOkFEOkJBOkQwOkFEIiwgbmV4dF9hZF8uYWRkcmVzcyk7Ci0gIH0KLSAgbmV4dF9hZF8uYWRfdGltZSArPQotICAgICAgc3RlYWR5X2Nsb2NrOjpkdXJhdGlvbihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGRlbGF5X2JlZm9yZV9zZW5kX21zKSk7Ci0gIHBhY2tldF9udW1fKys7Ci19Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zY3JpcHRlZF9iZWFjb24uaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQwNmQwLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9zY3JpcHRlZF9iZWFjb25fYmxlX3BheWxvYWQucGIuaCIKLSNpbmNsdWRlICJiZWFjb24uaCIKLQotdXNpbmcgYW5kcm9pZDo6Ymx1ZXRvb3RoOjp0ZXN0X3ZlbmRvcl9saWI6Om1vZGVsOjpkZXZpY2VzOjpTY3JpcHRlZEJlYWNvbkJsZUFkUHJvdG86OlBsYXliYWNrRXZlbnQ7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotLy8gUHJldGVuZCB0byBiZSBhIGxvdCBvZiBiZWFjb25zIGJ5IGFkdmVydGlzaW5nIGZyb20gYSBmaWxlLgotY2xhc3MgU2NyaXB0ZWRCZWFjb24gOiBwdWJsaWMgQmVhY29uIHsKLSBwdWJsaWM6Ci0gIFNjcmlwdGVkQmVhY29uKCk7Ci0gIHZpcnR1YWwgflNjcmlwdGVkQmVhY29uKCkgPSBkZWZhdWx0OwotCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPiBDcmVhdGUoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8U2NyaXB0ZWRCZWFjb24+KCk7Ci0gIH0KLQotICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgb2YgZGV2aWNlLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFR5cGVTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuICJzY3JpcHRlZF9iZWFjb24iOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gInNjcmlwdGVkX2JlYWNvbiAiICsgY29uZmlnX2ZpbGVfOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBhZGRyZXNzIGFuZCBhZHZlcnRpc2luZyBpbnRlcnZhbCBmcm9tIHN0cmluZyBhcmdzLgotICB2b2lkIEluaXRpYWxpemUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSBvdmVycmlkZTsKLQotICB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlOwotCi0gIHZvaWQgSW5jb21pbmdQYWNrZXQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0X3ZpZXcpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGJvb2wgcmVnaXN0ZXJlZF87Ci0gIHN0ZDo6c3RyaW5nIGNvbmZpZ19maWxlX3t9OwotICBzdGQ6OnN0cmluZyBldmVudHNfZmlsZV97fTsKLSAgc3RkOjpvZnN0cmVhbSBldmVudHNfb3N0cmVhbV87Ci0gIHN0cnVjdCBBZHZlcnRpc2VtZW50IHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZDsKLSAgICBBZGRyZXNzIGFkZHJlc3M7Ci0gICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBhZF90aW1lOwotICB9OwotCi0gIHZvaWQgcG9wdWxhdGVfZXZlbnQoUGxheWJhY2tFdmVudCAqIGV2ZW50LCBQbGF5YmFja0V2ZW50OjpQbGF5YmFja0V2ZW50VHlwZSB0eXBlKTsKLQotICB2b2lkIGdldF9uZXh0X2FkdmVydGlzZW1lbnQoKTsKLQotICB2b2lkIHNldF9zdGF0ZSgKLSAgICAgIGFuZHJvaWQ6OmJsdWV0b290aDo6dGVzdF92ZW5kb3JfbGliOjptb2RlbDo6ZGV2aWNlczo6Ci0gICAgICAgICAgU2NyaXB0ZWRCZWFjb25CbGVBZFByb3RvOjpQbGF5YmFja0V2ZW50OjpQbGF5YmFja0V2ZW50VHlwZSB0eXBlKTsKLQotICBBZHZlcnRpc2VtZW50IG5leHRfYWRfe307Ci0gIGludCBwYWNrZXRfbnVtX3swfTsKLSAgUGxheWJhY2tFdmVudDo6UGxheWJhY2tFdmVudFR5cGUgY3VycmVudF9zdGF0ZV97UGxheWJhY2tFdmVudDo6VU5LTk9XTn07Ci0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbmV4dF9jaGVja190aW1lX3t9OwotICBhbmRyb2lkOjpibHVldG9vdGg6OnRlc3RfdmVuZG9yX2xpYjo6bW9kZWw6OmRldmljZXM6OlNjcmlwdGVkQmVhY29uQmxlQWRQcm90bzo6QmxlQWR2ZXJ0aXNlbWVudExpc3QgYmxlX2FkX2xpc3RfOwotfTsKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbl9ibGVfcGF5bG9hZC5wcm90byBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NjcmlwdGVkX2JlYWNvbl9ibGVfcGF5bG9hZC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4NTE5Yy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zY3JpcHRlZF9iZWFjb25fYmxlX3BheWxvYWQucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aC50ZXN0X3ZlbmRvcl9saWIubW9kZWwuZGV2aWNlcy5TY3JpcHRlZEJlYWNvbkJsZUFkUHJvdG87Ci0KLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLW1lc3NhZ2UgQmxlQWR2ZXJ0aXNlbWVudCB7Ci0gIG9wdGlvbmFsIGJ5dGVzIHBheWxvYWQgPSAxOwotICBvcHRpb25hbCBieXRlcyBtYWNfYWRkcmVzcyA9IDI7Ci0gIG9wdGlvbmFsIHVpbnQzMiBkZWxheV9iZWZvcmVfc2VuZF9tcyA9IDM7Ci19Ci0KLW1lc3NhZ2UgQmxlQWR2ZXJ0aXNlbWVudExpc3QgewotICByZXBlYXRlZCBCbGVBZHZlcnRpc2VtZW50IGFkdmVydGlzZW1lbnRzID0gMTsKLX0KLQotbWVzc2FnZSBQbGF5YmFja0V2ZW50IHsKLSAgLy8gVGhlc2UgZXZlbnRzIHNob3VsZCBvY2N1ciBpbiBvcmRlciwgc3RhcnRpbmcgZnJvbSBJTklUSUFMSVpFRAotICBlbnVtIFBsYXliYWNrRXZlbnRUeXBlIHsKLSAgICBVTktOT1dOID0gMDsKLSAgICBJTklUSUFMSVpFRCA9IDE7Ci0gICAgU0NBTk5FRF9PTkNFID0gMjsKLSAgICBXQUlUSU5HX0ZPUl9GSUxFID0gMzsKLSAgICBXQUlUSU5HX0ZPUl9GSUxFX1RPX0JFX1JFQURBQkxFID0gNDsKLSAgICBQQVJTSU5HX0ZJTEUgPSA1OwotICAgIFBMQVlCQUNLX1NUQVJURUQgPSA2OwotICAgIFBMQVlCQUNLX0VOREVEID0gNzsKLSAgICAvLyBFcnJvciBjb25kaXRpb25zCi0gICAgRklMRV9QQVJTSU5HX0ZBSUxFRCA9IDg7Ci0gIH0KLSAgb3B0aW9uYWwgUGxheWJhY2tFdmVudFR5cGUgdHlwZSA9IDE7Ci0gIG9wdGlvbmFsIHVpbnQ2NCBzZWNzX3NpbmNlX2Vwb2NoID0gMjsKLX0KZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NlcnZlcl9wb3J0X2ZhY3RvcnkuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zZXJ2ZXJfcG9ydF9mYWN0b3J5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGIyMTY1Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NlcnZlcl9wb3J0X2ZhY3RvcnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNlcnZlcl9wb3J0X2ZhY3RvcnkuaCIKLQotI2luY2x1ZGUgIm9zL2xvZy5oIgotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotbmFtZXNwYWNlIG5ldCB7Ci0KLVNlcnZlclBvcnRGYWN0b3J5OjpTZXJ2ZXJQb3J0RmFjdG9yeShpbnQgcG9ydCwgc3RkOjpmdW5jdGlvbjx2b2lkKGludCBmZCk+JiBjYWxsYmFjaykgewotICBwb3J0XyA9IHBvcnQ7Ci0gIGNhbGxiYWNrXyA9IGNhbGxiYWNrOwotfQotCi1pbnQgU2VydmVyUG9ydEZhY3Rvcnk6OlNldFVwKGludCBwb3J0KSB7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBsaXN0ZW5fYWRkcmVzczsKLSAgc29ja2xlbl90IHNvY2thZGRyX2luX3NpemUgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLSAgbWVtc2V0KCZsaXN0ZW5fYWRkcmVzcywgMCwgc29ja2FkZHJfaW5fc2l6ZSk7Ci0KLSAgT1NJX05PX0lOVFIobGlzdGVuX2ZkXyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpOwotICBpZiAobGlzdGVuX2ZkXyA8IDApIHsKLSAgICBMT0dfSU5GTygiRXJyb3IgY3JlYXRpbmcgc29ja2V0IGZvciB0ZXN0IGNoYW5uZWwuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgTE9HX0lORk8oInBvcnQ6ICVkIiwgcG9ydCk7Ci0gIGxpc3Rlbl9hZGRyZXNzLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBsaXN0ZW5fYWRkcmVzcy5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICBsaXN0ZW5fYWRkcmVzcy5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLQotICBpZiAoYmluZChsaXN0ZW5fZmRfLCByZWludGVycHJldF9jYXN0PHNvY2thZGRyKj4oJmxpc3Rlbl9hZGRyZXNzKSwgc29ja2FkZHJfaW5fc2l6ZSkgPCAwKSB7Ci0gICAgTE9HX0lORk8oIkVycm9yIGJpbmRpbmcgdGVzdCBjaGFubmVsIGxpc3RlbmVyIHNvY2tldCB0byBhZGRyZXNzLiIpOwotICAgIGNsb3NlKGxpc3Rlbl9mZF8pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChsaXN0ZW4obGlzdGVuX2ZkXywgMSkgPCAwKSB7Ci0gICAgTE9HX0lORk8oIkVycm9yIGxpc3RlbmluZyBmb3IgdGVzdCBjaGFubmVsLiIpOwotICAgIGNsb3NlKGxpc3Rlbl9mZF8pOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gbGlzdGVuX2ZkXzsKLX0KLQotdm9pZCBTZXJ2ZXJQb3J0RmFjdG9yeTo6Q2xlYW5VcCgpIHsKLSAgaWYgKGxpc3Rlbl9mZF8gPT0gLTEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGNsb3NlKGxpc3Rlbl9mZF8pKSB7Ci0gICAgTE9HX0VSUk9SKCJFcnJvciBjbG9zaW5nIGxpc3Rlbl9mZF8uIik7Ci0gIH0KLSAgbGlzdGVuX2ZkXyA9IC0xOwotfQotCi1pbnQgU2VydmVyUG9ydEZhY3Rvcnk6OkFjY2VwdChpbnQgbGlzdGVuX2ZkXykgewotICBpbnQgYWNjZXB0X2ZkID0gLTE7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiB0ZXN0X2NoYW5uZWxfYWRkcmVzczsKLSAgc29ja2xlbl90IHNvY2thZGRyX2luX3NpemUgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLSAgbWVtc2V0KCZ0ZXN0X2NoYW5uZWxfYWRkcmVzcywgMCwgc29ja2FkZHJfaW5fc2l6ZSk7Ci0KLSAgT1NJX05PX0lOVFIoYWNjZXB0X2ZkID0gYWNjZXB0KGxpc3Rlbl9mZF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHIqPigmdGVzdF9jaGFubmVsX2FkZHJlc3MpLCAmc29ja2FkZHJfaW5fc2l6ZSkpOwotICBpZiAoYWNjZXB0X2ZkIDwgMCkgewotICAgIExPR19JTkZPKCJFcnJvciBhY2NlcHRpbmcgdGVzdCBjaGFubmVsIGNvbm5lY3Rpb24gZXJybm89JWQgKCVzKS4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgIGlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0spIHsKLSAgICAgIExPR19FUlJPUigiQ2xvc2luZyBsaXN0ZW5fZmRfICh3b24ndCB0cnkgYWdhaW4pLiIpOwotICAgICAgY2xvc2UobGlzdGVuX2ZkXyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgTE9HX0lORk8oImFjY2VwdF9mZCA9ICVkLiIsIGFjY2VwdF9mZCk7Ci0KLSAgcmV0dXJuIGFjY2VwdF9mZDsKLX0KLQotdm9pZCBTZXJ2ZXJQb3J0RmFjdG9yeTo6T25Db21tYW5kUmVhZHkoaW50IGZkLCBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IHVud2F0Y2gpIHsKLSAgdWludDhfdCBjb21tYW5kX25hbWVfc2l6ZSA9IDA7Ci0gIHJlYWQoZmQsICZjb21tYW5kX25hbWVfc2l6ZSwgMSk7Ci0gIHZlY3Rvcjx1aW50OF90PiBjb21tYW5kX25hbWVfcmF3OwotICBjb21tYW5kX25hbWVfcmF3LnJlc2l6ZShjb21tYW5kX25hbWVfc2l6ZSk7Ci0gIHJlYWQoZmQsICZjb21tYW5kX25hbWVfcmF3WzBdLCBjb21tYW5kX25hbWVfc2l6ZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvbW1hbmRfbmFtZShjb21tYW5kX25hbWVfcmF3LmJlZ2luKCksIGNvbW1hbmRfbmFtZV9yYXcuZW5kKCkpOwotCi0gIGlmIChjb21tYW5kX25hbWUgPT0gIkNMT1NFX1RFU1RfQ0hBTk5FTCIgfHwgY29tbWFuZF9uYW1lID09ICIiKSB7Ci0gICAgTE9HX0lORk8oIlRlc3QgY2hhbm5lbCBjbG9zZWQiKTsKLSAgICB1bndhdGNoKCk7Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQ4X3QgbnVtX2FyZ3MgPSAwOwotICByZWFkKGZkLCAmbnVtX2FyZ3MsIDEpOwotICB2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3M7Ci0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICB1aW50OF90IGFyZ19zaXplID0gMDsKLSAgICByZWFkKGZkLCAmYXJnX3NpemUsIDEpOwotICAgIHZlY3Rvcjx1aW50OF90PiBhcmc7Ci0gICAgYXJnLnJlc2l6ZShhcmdfc2l6ZSk7Ci0gICAgcmVhZChmZCwgJmFyZ1swXSwgYXJnX3NpemUpOwotICAgIGFyZ3MucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGFyZy5iZWdpbigpLCBhcmcuZW5kKCkpKTsKLSAgfQotCi0gIGNvbW1hbmRfaGFuZGxlcl8oY29tbWFuZF9uYW1lLCBhcmdzKTsKLX0KLQotdm9pZCBTZXJ2ZXJQb3J0RmFjdG9yeTo6U2VuZFJlc3BvbnNlKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlc3BvbnNlKSBjb25zdCB7Ci0gIHNpemVfdCBzaXplID0gcmVzcG9uc2Uuc2l6ZSgpOwotICAvLyBDYXAgdG8gNjRLCi0gIGlmIChzaXplID4gMHhmZmZmKSB7Ci0gICAgc2l6ZSA9IDB4ZmZmZjsKLSAgfQotICBjaGFyIHNpemVfYnVmWzRdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNpemUgJiAweGZmKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHNpemUgPj4gOCkgJiAweGZmKSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pigoc2l6ZSA+PiAxNikgJiAweGZmKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHNpemUgPj4gMjQpICYgMHhmZil9OwotICBpbnQgd3JpdHRlbiA9IHdyaXRlKGZkLCBzaXplX2J1ZiwgNCk7Ci0gIEFTU0VSVF9MT0cod3JpdHRlbiA9PSA0LCAiV2hhdCBoYXBwZW5lZD8gd3JpdHRlbiA9ICVkIGVycm5vID0gJWQiLCB3cml0dGVuLCBlcnJubyk7Ci0gIHdyaXR0ZW4gPSB3cml0ZShmZCwgcmVzcG9uc2UuY19zdHIoKSwgc2l6ZSk7Ci0gIEFTU0VSVF9MT0cod3JpdHRlbiA9PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemUpLCAiV2hhdCBoYXBwZW5lZD8gd3JpdHRlbiA9ICVkIGVycm5vID0gJWQiLCB3cml0dGVuLCBlcnJubyk7Ci19Ci0KLXZvaWQgU2VydmVyUG9ydEZhY3Rvcnk6OlJlZ2lzdGVyQ29tbWFuZEhhbmRsZXIoCi0gICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Jik+JiBjYWxsYmFjaykgewotICBjb21tYW5kX2hhbmRsZXJfID0gY2FsbGJhY2s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBuZXQKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NlcnZlcl9wb3J0X2ZhY3RvcnkuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NlcnZlcl9wb3J0X2ZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxOWM0OS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zZXJ2ZXJfcG9ydF9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotbmFtZXNwYWNlIG5ldCB7Ci0KLS8vIFN0YXJ0cyBhIHNlcnZlciBhbmQgY2FsbHMgdGhlIHJlZ2lzdGVyZWQgbGFtYmRhIGZvciBlYWNoIGNvbm5lY3Rpb24uCi1jbGFzcyBTZXJ2ZXJQb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICAvLyBPcGVucyBhIHNlcnZlciBwb3J0IGFuZCBzZXRzIHRoZSBsaXN0ZW4gZmlsZSBkZXNjcmlwdG9yLgotICBTZXJ2ZXJQb3J0RmFjdG9yeShpbnQgcG9ydCwgc3RkOjpmdW5jdGlvbjx2b2lkKGludCBmZCk+JiBvbl9jb25uZWN0aW9uKTsKLQotICAvLyBDbG9zZXMgdGhlIHBvcnQgKGlmIHN1Y2Nlc2Z1bGx5IG9wZW5lZCBpbiBTZXRVcCkuCi0gIH5TZXJ2ZXJQb3J0RmFjdG9yeSgpIHt9Ci0KLSAgLy8gV2FpdHMgZm9yIGEgY29ubmVjdGlvbiByZXF1ZXN0IGFuZCByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd2F0Y2guCi0gIC8vIFJldHVybnMgLTEgb24gYW4gZXJyb3IuCi0gIHZvaWQgQWNjZXB0KGludCBsaXN0ZW5fZmQpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGludCBmZCk+IG9uX2Nvbm5lY3Rpb25fOwotCi0gIGludCBwb3J0OwotICBpbnQgbGlzdGVuX2ZkXyA9IC0xOwotCi0gIFNlcnZlclBvcnRGYWN0b3J5KGNvbnN0IFNlcnZlclBvcnRGYWN0b3J5JikgPSBkZWxldGU7Ci0gIFNlcnZlclBvcnRGYWN0b3J5JiBvcGVyYXRvcj0oY29uc3QgU2VydmVyUG9ydEZhY3RvcnkmKSA9IGRlbGV0ZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBuZXQKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NuaWZmZXIuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zbmlmZmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRjYTg3Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NuaWZmZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic25pZmZlci5oIgotCi0jaW5jbHVkZSAibW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotYm9vbCBTbmlmZmVyOjpyZWdpc3RlcmVkXyA9IERldmljZUJvdXRpcXVlOjpSZWdpc3Rlcigic25pZmZlciIsICZTbmlmZmVyOjpDcmVhdGUpOwotCi1TbmlmZmVyOjpTbmlmZmVyKCkge30KLQotdm9pZCBTbmlmZmVyOjpJbml0aWFsaXplKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMikgcmV0dXJuOwotCi0gIGlmIChBZGRyZXNzOjpGcm9tU3RyaW5nKGFyZ3NbMV0sIGRldmljZV90b19zbmlmZl8pKSB7Ci0gICAgcHJvcGVydGllc18uU2V0QWRkcmVzcyhkZXZpY2VfdG9fc25pZmZfKTsKLSAgfQotCi0gIGlmIChhcmdzLnNpemUoKSA8IDMpIHJldHVybjsKLX0KLQotdm9pZCBTbmlmZmVyOjpUaW1lclRpY2soKSB7fQotCi12b2lkIFNuaWZmZXI6OkluY29taW5nUGFja2V0KG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICBBZGRyZXNzIHNvdXJjZSA9IHBhY2tldC5HZXRTb3VyY2VBZGRyZXNzKCk7Ci0gIEFkZHJlc3MgZGVzdCA9IHBhY2tldC5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKTsKLSAgYm9vbCBtYXRjaF9zb3VyY2UgPSBkZXZpY2VfdG9fc25pZmZfID09IHNvdXJjZTsKLSAgYm9vbCBtYXRjaF9kZXN0ID0gZGV2aWNlX3RvX3NuaWZmXyA9PSBkZXN0OwotICBpZiAoIW1hdGNoX3NvdXJjZSAmJiAhbWF0Y2hfZGVzdCkgewotICAgIHJldHVybjsKLSAgfQotICBMT0dfSU5GTygiJXMgJXMgLT4gJXMgKFR5cGUgJXMpIiwKLSAgICAgICAgICAgKG1hdGNoX3NvdXJjZSA/IChtYXRjaF9kZXN0ID8gIjwtPiIgOiAiPC0tIikgOiAiLS0+IiksCi0gICAgICAgICAgIHNvdXJjZS5Ub1N0cmluZygpLmNfc3RyKCksIGRlc3QuVG9TdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICBtb2RlbDo6cGFja2V0czo6UGFja2V0VHlwZVRleHQocGFja2V0LkdldFR5cGUoKSkuY19zdHIoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NuaWZmZXIuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9kZXZpY2VzL3NuaWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwYjE4Mi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvZGV2aWNlcy9zbmlmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZGV2aWNlLmgiCi0jaW5jbHVkZSAiaGNpL2FkZHJlc3MuaCIKLSNpbmNsdWRlICJwYWNrZXRzL2xpbmtfbGF5ZXJfcGFja2V0cy5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotdXNpbmcgOjpibHVldG9vdGg6OmhjaTo6QWRkcmVzczsKLQotY2xhc3MgU25pZmZlciA6IHB1YmxpYyBEZXZpY2UgewotIHB1YmxpYzoKLSAgU25pZmZlcigpOwotICB+U25pZmZlcigpID0gZGVmYXVsdDsKLQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFNuaWZmZXI+IENyZWF0ZSgpIHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTbmlmZmVyPigpOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgfGFyZ3N8LgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBkZXZpY2UuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0VHlwZVN0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICByZXR1cm4gInNuaWZmZXIiOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIEluY29taW5nUGFja2V0KAotICAgICAgbW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgVGltZXJUaWNrKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgYm9vbCByZWdpc3RlcmVkXzsKLSAgQWRkcmVzcyBkZXZpY2VfdG9fc25pZmZfe307Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvYXN5bmNfbWFuYWdlci5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC9hc3luY19tYW5hZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTU3ZjExLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC9hc3luY19tYW5hZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhc3luY19tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZmNudGwuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJzeXMvc2VsZWN0LmgiCi0jaW5jbHVkZSAidW5pc3RkLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotLy8gSW1wbGVtZW50YXRpb24gb2YgQXN5bmNNYW5hZ2VyIGlzIGRpdmlkZWQgYmV0d2VlbiB0d28gY2xhc3NlcywgdGhyZWUgaWYKLS8vIEFzeW5jTWFuYWdlciBpdHNlbGYgaXMgdGFrZW4gaW50byBhY2NvdW50LCBidXQgaXRzIG9ubHkgcmVzcG9uc2FiaWxpdHkKLS8vIGJlc2lkZXMgYmVpbmcgYSBwcm94eSBmb3IgdGhlIG90aGVyIHR3byBjbGFzc2VzIGlzIHRvIHByb3ZpZGUgYSBnbG9iYWwKLS8vIHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc20gZm9yIGNhbGxiYWNrcyBhbmQgY2xpZW50IGNvZGUgdG8gdXNlLgotCi0vLyBUaGUgd2F0Y2hpbmcgb2YgZmlsZSBkZXNjcmlwdG9ycyBpcyBkb25lIHRocm91Z2ggQXN5bmNGZFdhdGNoZXIuIFNldmVyYWwKLS8vIG9iamVjdHMgb2YgdGhpcyBjbGFzcyBtYXkgY29leGlzdCBzaW11bHRhbmVvc2x5IGFzIHRoZXkgc2hhcmUgbm8gc3RhdGUuCi0vLyBBZnRlciBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3RzIG5vdGhpbmcgaGFwcGVucyBiZXlvbmQgc29tZSB2ZXJ5IHNpbXBsZQotLy8gbWVtYmVyIGluaXRpYWxpemF0aW9uLiBXaGVuIHRoZSBmaXJzdCBGRCBpcyBzZXQgdXAgZm9yIHdhdGNoaW5nIHRoZSBvYmplY3QKLS8vIHN0YXJ0cyBhIG5ldyB0aHJlYWQgd2hpY2ggd2F0Y2hlcyB0aGUgZ2l2ZW4gKGFuZCBsYXRlciBwcm92aWRlZCkgRkRzIHVzaW5nCi0vLyBzZWxlY3QoKSBpbnNpZGUgYSBsb29wLiBBIHNwZWNpYWwgRkQgKGEgcGlwZSkgaXMgYWxzbyB3YXRjaGVkIHdoaWNoIGlzCi0vLyB1c2VkIHRvIG5vdGlmeSB0aGUgdGhyZWFkIG9mIGludGVybmFsIGNoYW5nZXMgb24gdGhlIG9iamVjdCBzdGF0ZSAobGlrZQotLy8gdGhlIGFkZGl0aW9uIG9mIG5ldyBGRHMgdG8gd2F0Y2ggb24pLiBFdmVyeSBhY2Nlc3MgdG8gaW50ZXJuYWwgc3RhdGUgaXMKLS8vIHN5bmNocm9uaXplZCB1c2luZyBhIHNpbmdsZSBpbnRlcm5hbCBtdXRleC4gVGhlIHRocmVhZCBpcyBvbmx5IHN0b3BwZWQgb24KLS8vIGRlc3RydWN0aW9uIG9mIHRoZSBvYmplY3QsIGJ5IG1vZGlmeWluZyBhIGZsYWcsIHdoaWNoIGlzIHRoZSBvbmx5IG1lbWJlcgotLy8gdmFyaWFibGUgYWNjZXNzZWQgd2l0aG91dCBhY3F1aXJpbmcgdGhlIGxvY2sgKGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbiB0bwotLy8gdGhlIHRocmVhZCBpcyBkb25lIGxhdGVyIGJ5IHdyaXRpbmcgdG8gYSBwaXBlIHdoaWNoIG1lYW5zIHRoZSB0aHJlYWQgd2lsbAotLy8gYmUgbm90aWZpZWQgcmVnYXJkbGVzcyBvZiB3aGF0IHBoYXNlIG9mIHRoZSBsb29wIGl0IGlzIGluIHRoYXQgbW9tZW50KQotCi0vLyBUaGUgc2NoZWR1bGluZyBvZiBhc3luY2hyb25vdXMgdGFza3MsIHBlcmlvZGljIG9yIG5vdCwgaXMgaGFuZGxlZCBieSB0aGUKLS8vIEFzeW5jVGFza01hbmFnZXIgY2xhc3MuIExpa2UgdGhlIG9uZSBmb3IgRkRzLCB0aGlzIGNsYXNzIHNoYXJlcyBubyBpbnRlcm5hbAotLy8gc3RhdGUgYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFuY2VzIHNvIGl0IGlzIHNhZmUgdG8gdXNlIHNldmVyYWwgb2JqZWN0cyBvZgotLy8gdGhpcyBjbGFzcywgYWxzbyBub3RoaW5nIGludGVyZXN0aW5nIGhhcHBlbnMgdXBvbiBjb25zdHJ1Y3Rpb24sIGJ1dCBvbmx5Ci0vLyBhZnRlciBhIFRhc2sgaGFzIGJlZW4gc2NoZWR1bGVkIGFuZCBhY2Nlc3MgdG8gaW50ZXJuYWwgc3RhdGUgaXMgc3luY2hyb25pemVkCi0vLyB1c2luZyBhIHNpbmdsZSBpbnRlcm5hbCBtdXRleC4gV2hlbiB0aGUgZmlyc3QgdGFzayBpcyBzY2hlZHVsZWQgYSB0aHJlYWQKLS8vIGlzIHN0YXJ0ZWQgd2hpY2ggbW9uaXRvcnMgYSBxdWV1ZSBvZiB0YXNrcy4gVGhlIHF1ZXVlIGlzIHBlZWtlZCB0byBzZWUKLS8vIHdoZW4gdGhlIG5leHQgdGFzayBzaG91bGQgYmUgY2FycmllZCBvdXQgYW5kIHRoZW4gdGhlIHRocmVhZCBwZXJmb3JtcyBhCi0vLyAoYWJzb2x1dGUpIHRpbWVkIHdhaXQgb24gYSBjb25kaXRpb24gdmFyaWFibGUuIFRoZSB3YWl0IGVuZHMgYmVjYXVzZSBvZiBhCi0vLyB0aW1lIG91dCBvciBhIG5vdGlmeSBvbiB0aGUgY29uZCB2YXIsIHRoZSBmb3JtZXIgbWVhbnMgYSB0YXNrIGlzIGR1ZQotLy8gZm9yIGV4ZWN1dGlvbiB3aGlsZSB0aGUgbGF0ZXIgbWVhbnMgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gaW50ZXJuYWwKLS8vIHN0YXRlLCBsaWtlIGEgdGFzayBoYXMgYmVlbiBzY2hlZHVsZWQvY2FuY2VsZWQgb3IgdGhlIGZsYWcgdG8gc3RvcCBoYXMKLS8vIGJlZW4gc2V0LiBTZXR0aW5nIGFuZCBxdWVyeWluZyB0aGUgc3RvcCBmbGFnIG9yIG1vZGlmeWluZyB0aGUgdGFzayBxdWV1ZQotLy8gYW5kIHN1YnNlcXVlbnQgbm90aWZpY2F0aW9uIG9uIHRoZSBjb25kIHZhciBpcyBkb25lIGF0b21pY2FsbHkgKGUuZyB3aGlsZQotLy8gaG9sZGluZyB0aGUgbG9jayBvbiB0aGUgaW50ZXJuYWwgbXV0ZXgpIHRvIGVuc3VyZSB0aGF0IHRoZSB0aHJlYWQgbmV2ZXIKLS8vIG1pc3NlcyB0aGUgbm90aWZpY2F0aW9uLCBzaW5jZSBub3RpZnlpbmcgYSBjb25kIHZhciBpcyBub3QgcGVyc2lzdGVudCBhcwotLy8gd3JpdGluZyBvbiBhIHBpcGUgKGlmIG5vdCBkb25lIHRoaXMgd2F5LCB0aGUgdGhyZWFkIGNvdWxkIHF1ZXJ5IHRoZQotLy8gc3RvcHBpbmcgZmxhZyBhbmQgYmUgcHV0IGFzaWRlIGJ5IHRoZSBPUyBzY2hlZHVsZXIgcmlnaHQgYWZ0ZXIsIHRoZW4gdGhlCi0vLyAnc3RvcCB0aHJlYWQnIHByb2NlZHVyZSBjb3VsZCBydW4sIHNldHRpbmcgdGhlIGZsYWcsIG5vdGlmeWluZyBhIGNvbmQKLS8vIHZhciB0aGF0IG5vIG9uZSBpcyB3YWl0aW5nIG9uIGFuZCBqb2luaW5nIHRoZSB0aHJlYWQsIHRoZSB0aHJlYWQgdGhlbgotLy8gcmVzdW1lcyBleGVjdXRpb24gYmVsaWV2aW5nIHRoYXQgaXQgbmVlZHMgdG8gY29udGludWUgYW5kIHdhaXRzIG9uIHRoZQotLy8gY29uZCB2YXIgcG9zc2libHkgZm9yZXZlciBpZiB0aGVyZSBhcmUgbm8gdGFza3Mgc2NoZWR1bGVkLCBlZmVjdGl2ZWx5Ci0vLyBjYXVzaW5nIGEgZGVhZGxvY2spLgotCi0vLyBUaGlzIG51bWJlciBhbHNvIHN0YXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIHRhc2tzIHdlIGNhbiBoYW5kbGUKLS8vIGF0IGEgZ2l2ZW4gdGltZQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtNYXhUYXNrSWQgPSAtMTsgLyogMl4xNiAtIDEsIHBlcm1pc2libGUgaWRzIGFyZSB7MS4uMl4xNi0xfSovCi1zdGF0aWMgaW5saW5lIEFzeW5jVGFza0lkIE5leHRBc3luY1Rhc2tJZChjb25zdCBBc3luY1Rhc2tJZCBpZCkgewotICByZXR1cm4gKGlkID09IGtNYXhUYXNrSWQpID8gMSA6IGlkICsgMTsKLX0KLS8vIFRoZSBidWZmZXIgaXMgb25seSAxMCBieXRlcyBiZWNhdXNlIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgYnl0ZXMKLS8vIHdyaXR0ZW4gb24gdGhpcyBzb2NrZXQgaXMgMS4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdGhyZWFkIGlzIG5vdGlmaWVkCi0vLyBtb3JlIHRoYW4gb25jZSBidXQgaGlnaGx5IHVubGlrZWx5LCBzbyBhIGJ1ZmZlciBvZiBzaXplIDEwIHNlZW1zIGVub3VnaAotLy8gYW5kIHRoZSByZWFkcyBhcmUgcGVyZm9ybWVkIGluc2lkZSBhIHdoaWxlIGp1c3QgaW4gY2FzZSBpdCBpc24ndC4gRnJvbQotLy8gdGhlIHRocmVhZCByb3V0aW5lJ3MgcG9pbnQgb2YgdmlldyBpdCBpcyB0aGUgc2FtZSB0byBoYXZlIGJlZW4gbm90aWZpZWQKLS8vIGp1c3Qgb25jZSBvciAxMDAgdGltZXMgc28gaXQganVzdCB0cmllcyB0byBjb25zdW1lIHRoZSBlbnRpcmUgYnVmZmVyLgotLy8gSW4gdGhlIGNhc2VzIHdoZXJlIGFuIGludGVycnVwdCB3b3VsZCBjYXVzZSByZWFkIHRvIHJldHVybiB3aXRob3V0Ci0vLyBoYXZpbmcgcmVhZCBldmVyeXRoaW5nIHRoYXQgd2FzIGF2YWlsYWJsZSBhIG5ldyBpdGVyYXRpb24gb2YgdGhlIHRocmVhZAotLy8gbG9vcCB3aWxsIGJyaW5nIGV4ZWN1dGlvbiB0byB0aGlzIHBvaW50IGFsbW9zdCBpbW1lZGlhdGVseSwgc28gdGhlcmUgaXMKLS8vIG5vIG5lZWQgdG8gdHJlYXQgdGhhdCBjYXNlLgotc3RhdGljIGNvbnN0IGludCBrTm90aWZpY2F0aW9uQnVmZmVyU2l6ZSA9IDEwOwotCi0vLyBBc3luYyBGaWxlIERlc2NyaXB0b3IgV2F0Y2hlciBJbXBsZW1lbnRhdGlvbjoKLWNsYXNzIEFzeW5jTWFuYWdlcjo6QXN5bmNGZFdhdGNoZXIgewotIHB1YmxpYzoKLSAgaW50IFdhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKGludCBmaWxlX2Rlc2NyaXB0b3IsIGNvbnN0IFJlYWRDYWxsYmFjayYgb25fcmVhZF9mZF9yZWFkeV9jYWxsYmFjaykgewotICAgIC8vIGFkZCBmaWxlIGRlc2NyaXB0b3IgYW5kIGNhbGxiYWNrCi0gICAgewotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgICAgIHdhdGNoZWRfc2hhcmVkX2Zkc19bZmlsZV9kZXNjcmlwdG9yXSA9IG9uX3JlYWRfZmRfcmVhZHlfY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLy8gc3RhcnQgdGhlIHRocmVhZCBpZiBub3Qgc3RhcnRlZCB5ZXQKLSAgICBpbnQgc3RhcnRlZCA9IHRyeVN0YXJ0VGhyZWFkKCk7Ci0gICAgaWYgKHN0YXJ0ZWQgIT0gMCkgewotICAgICAgTE9HX0VSUk9SKCIlczogVW5hYmxlIHRvIHN0YXJ0IHRocmVhZCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiBzdGFydGVkOwotICAgIH0KLQotICAgIC8vIG5vdGlmeSB0aGUgdGhyZWFkIHNvIHRoYXQgaXQga25vd3Mgb2YgdGhlIG5ldyBGRAotICAgIG5vdGlmeVRocmVhZCgpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2b2lkIFN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBndWFyZChpbnRlcm5hbF9tdXRleF8pOwotICAgIHdhdGNoZWRfc2hhcmVkX2Zkc18uZXJhc2UoZmlsZV9kZXNjcmlwdG9yKTsKLSAgfQotCi0gIEFzeW5jRmRXYXRjaGVyKCkgPSBkZWZhdWx0OwotICBBc3luY0ZkV2F0Y2hlcihjb25zdCBBc3luY0ZkV2F0Y2hlciYpID0gZGVsZXRlOwotICBBc3luY0ZkV2F0Y2hlciYgb3BlcmF0b3I9KGNvbnN0IEFzeW5jRmRXYXRjaGVyJikgPSBkZWxldGU7Ci0KLSAgfkFzeW5jRmRXYXRjaGVyKCkgPSBkZWZhdWx0OwotCi0gIGludCBzdG9wVGhyZWFkKCkgewotICAgIGlmICghc3RkOjphdG9taWNfZXhjaGFuZ2UoJnJ1bm5pbmdfLCBmYWxzZSkpIHsKLSAgICAgIHJldHVybiAwOyAgLy8gaWYgbm90IHJ1bm5pbmcgYWxyZWFkeQotICAgIH0KLQotICAgIG5vdGlmeVRocmVhZCgpOwotCi0gICAgaWYgKHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpICE9IHRocmVhZF8uZ2V0X2lkKCkpIHsKLSAgICAgIHRocmVhZF8uam9pbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBMT0dfV0FSTigiJXM6IFN0YXJ0aW5nIHRocmVhZCBzdG9wIGZyb20gaW5zaWRlIHRoZSByZWFkaW5nIHRocmVhZCBpdHNlbGYiLCBfX2Z1bmNfXyk7Ci0gICAgfQotCi0gICAgewotICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgICAgIHdhdGNoZWRfc2hhcmVkX2Zkc18uY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgdGhpcyB3aXRoIGF0IGxlYXN0IG9uZSBmaWxlIGRlc2NyaXB0b3IgcmVhZHkgdG8gYmUKLSAgLy8gd2F0Y2hlZCB1cG9uIG9yIHRoZSB0aHJlYWQgcm91dGluZSB3aWxsIHJldHVybiBpbW1lZGlhdGVseQotICBpbnQgdHJ5U3RhcnRUaHJlYWQoKSB7Ci0gICAgaWYgKHN0ZDo6YXRvbWljX2V4Y2hhbmdlKCZydW5uaW5nXywgdHJ1ZSkpIHsKLSAgICAgIHJldHVybiAwOyAgLy8gaWYgYWxyZWFkeSBydW5uaW5nCi0gICAgfQotICAgIC8vIHNldCB1cCB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsCi0gICAgaW50IHBpcGVfZmRzWzJdOwotICAgIGlmIChwaXBlMihwaXBlX2ZkcywgT19OT05CTE9DSykpIHsKLSAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAiJXM6VW5hYmxlIHRvIGVzdGFibGlzaCBhIGNvbW11bmljYXRpb24gY2hhbm5lbCB0byB0aGUgcmVhZGluZyAiCi0gICAgICAgICAgInRocmVhZCIsCi0gICAgICAgICAgX19mdW5jX18pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBub3RpZmljYXRpb25fbGlzdGVuX2ZkXyA9IHBpcGVfZmRzWzBdOwotICAgIG5vdGlmaWNhdGlvbl93cml0ZV9mZF8gPSBwaXBlX2Zkc1sxXTsKLQotICAgIHRocmVhZF8gPSBzdGQ6OnRocmVhZChbdGhpc10oKSB7IFRocmVhZFJvdXRpbmUoKTsgfSk7Ci0gICAgaWYgKCF0aHJlYWRfLmpvaW5hYmxlKCkpIHsKLSAgICAgIExPR19FUlJPUigiJXM6IFVuYWJsZSB0byBzdGFydCByZWFkaW5nIHRocmVhZCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgbm90aWZ5VGhyZWFkKCkgewotICAgIGNoYXIgYnVmZmVyID0gJzAnOwotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUobm90aWZpY2F0aW9uX3dyaXRlX2ZkXywgJmJ1ZmZlciwgMSkpIDwgMCkgewotICAgICAgTE9HX0VSUk9SKCIlczogVW5hYmxlIHRvIHNlbmQgbWVzc2FnZSB0byByZWFkaW5nIHRocmVhZCIsIF9fZnVuY19fKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgc2V0VXBGaWxlRGVzY3JpcHRvclNldChmZF9zZXQmIHJlYWRfZmRzKSB7Ci0gICAgLy8gYWRkIGNvbW0gY2hhbm5lbCB0byB0aGUgc2V0Ci0gICAgRkRfU0VUKG5vdGlmaWNhdGlvbl9saXN0ZW5fZmRfLCAmcmVhZF9mZHMpOwotICAgIGludCBuZmRzID0gbm90aWZpY2F0aW9uX2xpc3Rlbl9mZF87Ci0KLSAgICAvLyBhZGQgd2F0Y2hlZCBGRHMgdG8gdGhlIHNldAotICAgIHsKLSAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0gICAgICBmb3IgKGF1dG8mIGZkcCA6IHdhdGNoZWRfc2hhcmVkX2Zkc18pIHsKLSAgICAgICAgRkRfU0VUKGZkcC5maXJzdCwgJnJlYWRfZmRzKTsKLSAgICAgICAgbmZkcyA9IHN0ZDo6bWF4KGZkcC5maXJzdCwgbmZkcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZmRzOwotICB9Ci0KLSAgLy8gY2hlY2sgdGhlIGNvbW0gY2hhbm5lbCBhbmQgcmVhZCBldmVyeXRoaW5nIHRoZXJlCi0gIGJvb2wgY29uc3VtZVRocmVhZE5vdGlmaWNhdGlvbnMoZmRfc2V0JiByZWFkX2ZkcykgewotICAgIGlmIChGRF9JU1NFVChub3RpZmljYXRpb25fbGlzdGVuX2ZkXywgJnJlYWRfZmRzKSkgewotICAgICAgY2hhciBidWZmZXJba05vdGlmaWNhdGlvbkJ1ZmZlclNpemVdOwotICAgICAgd2hpbGUgKFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKG5vdGlmaWNhdGlvbl9saXN0ZW5fZmRfLCBidWZmZXIsIGtOb3RpZmljYXRpb25CdWZmZXJTaXplKSkgPT0KLSAgICAgICAgICAgICBrTm90aWZpY2F0aW9uQnVmZmVyU2l6ZSkgewotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGNoZWNrIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGFuZCBjYWxsIGNhbGxiYWNrcyBpZiBuZWNlc2FyeQotICB2b2lkIHJ1bkFwcHJvcHJpYXRlQ2FsbGJhY2tzKGZkX3NldCYgcmVhZF9mZHMpIHsKLSAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZSh3YXRjaGVkX3NoYXJlZF9mZHNfKTo6dmFsdWVfdHlwZT4gZmRzOwotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0gICAgZm9yIChhdXRvJiBmZGMgOiB3YXRjaGVkX3NoYXJlZF9mZHNfKSB7Ci0gICAgICBpZiAoRkRfSVNTRVQoZmRjLmZpcnN0LCAmcmVhZF9mZHMpKSB7Ci0gICAgICAgIGZkcy5wdXNoX2JhY2soZmRjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvJiBwIDogZmRzKSB7Ci0gICAgICBwLnNlY29uZChwLmZpcnN0KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFRocmVhZFJvdXRpbmUoKSB7Ci0gICAgd2hpbGUgKHJ1bm5pbmdfKSB7Ci0gICAgICBmZF9zZXQgcmVhZF9mZHM7Ci0gICAgICBGRF9aRVJPKCZyZWFkX2Zkcyk7Ci0gICAgICBpbnQgbmZkcyA9IHNldFVwRmlsZURlc2NyaXB0b3JTZXQocmVhZF9mZHMpOwotCi0gICAgICAvLyB3YWl0IHVudGlsIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgb24gc29tZSBGRAotICAgICAgaW50IHJldHZhbCA9IHNlbGVjdChuZmRzICsgMSwgJnJlYWRfZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgIGlmIChyZXR2YWwgPD0gMCkgeyAgLy8gdGhlcmUgd2FzIHNvbWUgZXJyb3Igb3IgYSB0aW1lb3V0Ci0gICAgICAgIExPR19FUlJPUigKLSAgICAgICAgICAgICIlczogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIGRhdGEgb24gdGhlIGZpbGUgIgotICAgICAgICAgICAgImRlc2NyaXB0b3JzOiAlcyIsCi0gICAgICAgICAgICBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNvbnN1bWVUaHJlYWROb3RpZmljYXRpb25zKHJlYWRfZmRzKTsKLQotICAgICAgLy8gRG8gbm90IHJlYWQgaWYgdGhlcmUgd2FzIGEgY2FsbCB0byBzdG9wIHJ1bm5pbmcKLSAgICAgIGlmICghcnVubmluZ18pIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHJ1bkFwcHJvcHJpYXRlQ2FsbGJhY2tzKHJlYWRfZmRzKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OmF0b21pY19ib29sIHJ1bm5pbmdfe2ZhbHNlfTsKLSAgc3RkOjp0aHJlYWQgdGhyZWFkXzsKLSAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggaW50ZXJuYWxfbXV0ZXhfOwotCi0gIHN0ZDo6bWFwPGludCwgUmVhZENhbGxiYWNrPiB3YXRjaGVkX3NoYXJlZF9mZHNfOwotCi0gIC8vIEEgcGFpciBvZiBGRCB0byBzZW5kIGluZm9ybWF0aW9uIHRvIHRoZSByZWFkaW5nIHRocmVhZAotICBpbnQgbm90aWZpY2F0aW9uX2xpc3Rlbl9mZF97fTsKLSAgaW50IG5vdGlmaWNhdGlvbl93cml0ZV9mZF97fTsKLX07Ci0KLS8vIEFzeW5jIHRhc2sgbWFuYWdlciBpbXBsZW1lbnRhdGlvbgotY2xhc3MgQXN5bmNNYW5hZ2VyOjpBc3luY1Rhc2tNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIEFzeW5jVXNlcklkIEdldE5leHRVc2VySWQoKSB7IHJldHVybiBsYXN0VXNlcklkXysrOyB9Ci0KLSAgQXN5bmNUYXNrSWQgRXhlY0FzeW5jKEFzeW5jVXNlcklkIHVzZXJfaWQsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIHNjaGVkdWxlVGFzayhzdGQ6Om1ha2Vfc2hhcmVkPFRhc2s+KAotICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIGRlbGF5LCBjYWxsYmFjaywgdXNlcl9pZCkpOwotICB9Ci0KLSAgQXN5bmNUYXNrSWQgRXhlY0FzeW5jUGVyaW9kaWNhbGx5KEFzeW5jVXNlcklkIHVzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBwZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIHNjaGVkdWxlVGFzayhzdGQ6Om1ha2Vfc2hhcmVkPFRhc2s+KAotICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIGRlbGF5LCBwZXJpb2QsIGNhbGxiYWNrLCB1c2VyX2lkKSk7Ci0gIH0KLQotICBib29sIENhbmNlbEFzeW5jVGFzayhBc3luY1Rhc2tJZCBhc3luY190YXNrX2lkKSB7Ci0gICAgLy8gcmVtb3ZlIHRhc2sgZnJvbSBxdWV1ZSAoYW5kIHRhc2sgaWQgYXNzb2NpYXRpb24pIHdoaWxlIGhvbGRpbmcgbG9jawotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgICByZXR1cm4gY2FuY2VsX3Rhc2tfd2l0aF9sb2NrX2hlbGQoYXN5bmNfdGFza19pZCk7Ci0gIH0KLQotICBib29sIENhbmNlbEFzeW5jVGFza3NGcm9tVXNlcihBc3luY1VzZXJJZCB1c2VyX2lkKSB7Ci0gICAgLy8gcmVtb3ZlIHRhc2sgZnJvbSBxdWV1ZSAoYW5kIHRhc2sgaWQgYXNzb2NpYXRpb24pIHdoaWxlIGhvbGRpbmcgbG9jawotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgICBpZiAodGFza3NfYnlfdXNlcl9pZF8uY291bnQodXNlcl9pZCkgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKGF1dG8gdGFzayA6IHRhc2tzX2J5X3VzZXJfaWRfW3VzZXJfaWRdKSB7Ci0gICAgICBjYW5jZWxfdGFza193aXRoX2xvY2tfaGVsZCh0YXNrKTsKLSAgICB9Ci0gICAgdGFza3NfYnlfdXNlcl9pZF8uZXJhc2UodXNlcl9pZCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBBc3luY1Rhc2tNYW5hZ2VyKCkgPSBkZWZhdWx0OwotICBBc3luY1Rhc2tNYW5hZ2VyKGNvbnN0IEFzeW5jVGFza01hbmFnZXImKSA9IGRlbGV0ZTsKLSAgQXN5bmNUYXNrTWFuYWdlciYgb3BlcmF0b3I9KGNvbnN0IEFzeW5jVGFza01hbmFnZXImKSA9IGRlbGV0ZTsKLQotICB+QXN5bmNUYXNrTWFuYWdlcigpID0gZGVmYXVsdDsKLQotICBpbnQgc3RvcFRocmVhZCgpIHsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0gICAgICB0YXNrc19ieV9pZF8uY2xlYXIoKTsKLSAgICAgIHRhc2tfcXVldWVfLmNsZWFyKCk7Ci0gICAgICBpZiAoIXJ1bm5pbmdfKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgcnVubmluZ18gPSBmYWxzZTsKLSAgICAgIC8vIG5vdGlmeSB0aGUgdGhyZWFkCi0gICAgICBpbnRlcm5hbF9jb25kX3Zhcl8ubm90aWZ5X29uZSgpOwotICAgIH0gIC8vIHJlbGVhc2UgdGhlIGxvY2sgYmVmb3JlIGpvaW5pbmcgYSB0aHJlYWQgdGhhdCBpcyBsaWtlbHkgd2FpdGluZyBmb3IgaXQKLSAgICBpZiAoc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgIT0gdGhyZWFkXy5nZXRfaWQoKSkgewotICAgICAgdGhyZWFkXy5qb2luKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPR19XQVJOKCIlczogU3RhcnRpbmcgdGhyZWFkIHN0b3AgZnJvbSBpbnNpZGUgdGhlIHRhc2sgdGhyZWFkIGl0c2VsZiIsIF9fZnVuY19fKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEhvbGRzIHRoZSBkYXRhIGZvciBlYWNoIHRhc2sKLSAgY2xhc3MgVGFzayB7Ci0gICBwdWJsaWM6Ci0gICAgVGFzayhzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHRpbWUsCi0gICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHBlcmlvZCwgY29uc3QgVGFza0NhbGxiYWNrJiBjYWxsYmFjaywKLSAgICAgICAgIEFzeW5jVXNlcklkIHVzZXIpCi0gICAgICAgIDogdGltZSh0aW1lKSwKLSAgICAgICAgICBwZXJpb2RpYyh0cnVlKSwKLSAgICAgICAgICBwZXJpb2QocGVyaW9kKSwKLSAgICAgICAgICBjYWxsYmFjayhjYWxsYmFjayksCi0gICAgICAgICAgdGFza19pZChrSW52YWxpZFRhc2tJZCksCi0gICAgICAgICAgdXNlcl9pZCh1c2VyKSB7fQotICAgIFRhc2soc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCB0aW1lLAotICAgICAgICAgY29uc3QgVGFza0NhbGxiYWNrJiBjYWxsYmFjaywgQXN5bmNVc2VySWQgdXNlcikKLSAgICAgICAgOiB0aW1lKHRpbWUpLAotICAgICAgICAgIHBlcmlvZGljKGZhbHNlKSwKLSAgICAgICAgICBjYWxsYmFjayhjYWxsYmFjayksCi0gICAgICAgICAgdGFza19pZChrSW52YWxpZFRhc2tJZCksCi0gICAgICAgICAgdXNlcl9pZCh1c2VyKSB7fQotCi0gICAgLy8gT3BlcmF0b3JzIG5lZWRlZCB0byBiZSBpbiBhIGNvbGxlY3Rpb24KLSAgICBib29sIG9wZXJhdG9yPChjb25zdCBUYXNrJiBhbm90aGVyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodGltZSwgdGFza19pZCkgPCBzdGQ6Om1ha2VfcGFpcihhbm90aGVyLnRpbWUsIGFub3RoZXIudGFza19pZCk7Ci0gICAgfQotCi0gICAgYm9vbCBpc1BlcmlvZGljKCkgY29uc3QgewotICAgICAgcmV0dXJuIHBlcmlvZGljOwotICAgIH0KLQotICAgIC8vIFRoZXNlIGZpZWxkcyBzaG91bGQgbm8gbG9uZ2VyIGJlIHB1YmxpYyBpZiB0aGUgY2xhc3MgZXZlciBiZWNvbWVzCi0gICAgLy8gcHVibGljIG9yIGdldHMgbW9yZSBjb21wbGV4Ci0gICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCB0aW1lOwotICAgIGJvb2wgcGVyaW9kaWM7Ci0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBwZXJpb2R7fTsKLSAgICBUYXNrQ2FsbGJhY2sgY2FsbGJhY2s7Ci0gICAgQXN5bmNUYXNrSWQgdGFza19pZDsKLSAgICBBc3luY1VzZXJJZCB1c2VyX2lkOwotICB9OwotCi0gIC8vIEEgY29tcGFyYXRvciBjbGFzcyB0byBwdXQgc2hhcmVkIHBvaW50ZXJzIHRvIHRhc2tzIGluIGFuIG9yZGVyZWQgc2V0Ci0gIHN0cnVjdCB0YXNrX3BfY29tcGFyYXRvciB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUYXNrPiYgdDEsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUYXNrPiYgdDIpIGNvbnN0IHsKLSAgICAgIHJldHVybiAqdDEgPCAqdDI7Ci0gICAgfQotICB9OwotCi0gIGJvb2wgY2FuY2VsX3Rhc2tfd2l0aF9sb2NrX2hlbGQoQXN5bmNUYXNrSWQgYXN5bmNfdGFza19pZCkgewotICAgIGlmICh0YXNrc19ieV9pZF8uY291bnQoYXN5bmNfdGFza19pZCkgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB0YXNrX3F1ZXVlXy5lcmFzZSh0YXNrc19ieV9pZF9bYXN5bmNfdGFza19pZF0pOwotICAgIHRhc2tzX2J5X2lkXy5lcmFzZShhc3luY190YXNrX2lkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEFzeW5jVGFza0lkIHNjaGVkdWxlVGFzayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGFzaz4mIHRhc2spIHsKLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0gICAgICAvLyBubyBtb3JlIHJvb20gZm9yIG5ldyB0YXNrcywgd2UgbmVlZCBhIGxhcmdlciB0eXBlIGZvciBJRHMKLSAgICAgIGlmICh0YXNrc19ieV9pZF8uc2l6ZSgpID09IGtNYXhUYXNrSWQpICAvLyBUT0RPIHBvdGVudGlhbGx5IHR5cGUgdW5zYWZlCi0gICAgICAgIHJldHVybiBrSW52YWxpZFRhc2tJZDsKLSAgICAgIGRvIHsKLSAgICAgICAgbGFzdFRhc2tJZF8gPSBOZXh0QXN5bmNUYXNrSWQobGFzdFRhc2tJZF8pOwotICAgICAgfSB3aGlsZSAoaXNUYXNrSWRJblVzZShsYXN0VGFza0lkXykpOwotICAgICAgdGFzay0+dGFza19pZCA9IGxhc3RUYXNrSWRfOwotICAgICAgLy8gYWRkIHRhc2sgdG8gdGhlIHF1ZXVlIGFuZCBtYXAKLSAgICAgIHRhc2tzX2J5X2lkX1tsYXN0VGFza0lkX10gPSB0YXNrOwotICAgICAgdGFza3NfYnlfdXNlcl9pZF9bdGFzay0+dXNlcl9pZF0uaW5zZXJ0KHRhc2stPnRhc2tfaWQpOwotICAgICAgdGFza19xdWV1ZV8uaW5zZXJ0KHRhc2spOwotICAgIH0KLSAgICAvLyBzdGFydCB0aHJlYWQgaWYgbmVjZXNzYXJ5Ci0gICAgaW50IHN0YXJ0ZWQgPSB0cnlTdGFydFRocmVhZCgpOwotICAgIGlmIChzdGFydGVkICE9IDApIHsKLSAgICAgIExPR19FUlJPUigiJXM6IFVuYWJsZSB0byBzdGFydCB0aHJlYWQiLCBfX2Z1bmNfXyk7Ci0gICAgICByZXR1cm4ga0ludmFsaWRUYXNrSWQ7Ci0gICAgfQotICAgIC8vIG5vdGlmeSB0aGUgdGhyZWFkIHNvIHRoYXQgaXQga25vd3Mgb2YgdGhlIG5ldyB0YXNrCi0gICAgaW50ZXJuYWxfY29uZF92YXJfLm5vdGlmeV9vbmUoKTsKLSAgICAvLyByZXR1cm4gdGFzayBpZAotICAgIHJldHVybiB0YXNrLT50YXNrX2lkOwotICB9Ci0KLSAgYm9vbCBpc1Rhc2tJZEluVXNlKGNvbnN0IEFzeW5jVGFza0lkJiB0YXNrX2lkKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRhc2tzX2J5X2lkXy5jb3VudCh0YXNrX2lkKSAhPSAwOwotICB9Ci0KLSAgaW50IHRyeVN0YXJ0VGhyZWFkKCkgewotICAgIC8vIG5lZWQgdGhlIGxvY2sgYmVjYXVzZSBvZiB0aGUgcnVubmluZyBmbGFnIGFuZCB0aGUgY29uZCB2YXIKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGd1YXJkKGludGVybmFsX211dGV4Xyk7Ci0gICAgLy8gY2hlY2sgdGhhdCB0aGUgdGhyZWFkIGlzIG5vdCB5ZXQgcnVubmluZwotICAgIGlmIChydW5uaW5nXykgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIHN0YXJ0IHRoZSB0aHJlYWQKLSAgICBydW5uaW5nXyA9IHRydWU7Ci0gICAgdGhyZWFkXyA9IHN0ZDo6dGhyZWFkKFt0aGlzXSgpIHsgVGhyZWFkUm91dGluZSgpOyB9KTsKLSAgICBpZiAoIXRocmVhZF8uam9pbmFibGUoKSkgewotICAgICAgTE9HX0VSUk9SKCIlczogVW5hYmxlIHRvIHN0YXJ0IHRhc2sgdGhyZWFkIiwgX19mdW5jX18pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgVGhyZWFkUm91dGluZSgpIHsKLSAgICB3aGlsZSAocnVubmluZ18pIHsKLSAgICAgIFRhc2tDYWxsYmFjayBjYWxsYmFjazsKLSAgICAgIGJvb2wgcnVuX2l0ID0gZmFsc2U7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoaW50ZXJuYWxfbXV0ZXhfKTsKLSAgICAgICAgaWYgKCF0YXNrX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRhc2s+IHRhc2tfcCA9ICoodGFza19xdWV1ZV8uYmVnaW4oKSk7Ci0gICAgICAgICAgaWYgKHRhc2tfcC0+dGltZSA8IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSB7Ci0gICAgICAgICAgICBydW5faXQgPSB0cnVlOwotICAgICAgICAgICAgY2FsbGJhY2sgPSB0YXNrX3AtPmNhbGxiYWNrOwotICAgICAgICAgICAgdGFza19xdWV1ZV8uZXJhc2UodGFza19wKTsgIC8vIG5lZWQgdG8gcmVtb3ZlIGFuZCBhZGQgYWdhaW4gaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJpb2RpYyB0byB1cGRhdGUgb3JkZXIKLSAgICAgICAgICAgIGlmICh0YXNrX3AtPmlzUGVyaW9kaWMoKSkgewotICAgICAgICAgICAgICB0YXNrX3AtPnRpbWUgKz0gdGFza19wLT5wZXJpb2Q7Ci0gICAgICAgICAgICAgIHRhc2tfcXVldWVfLmluc2VydCh0YXNrX3ApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdGFza3NfYnlfdXNlcl9pZF9bdGFza19wLT51c2VyX2lkXS5lcmFzZSh0YXNrX3AtPnRhc2tfaWQpOwotICAgICAgICAgICAgICB0YXNrc19ieV9pZF8uZXJhc2UodGFza19wLT50YXNrX2lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChydW5faXQpIHsKLSAgICAgICAgY2FsbGJhY2soKTsKLSAgICAgIH0KLSAgICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChpbnRlcm5hbF9tdXRleF8pOwotICAgICAgICAvLyBjaGVjayBmb3IgdGVybWluYXRpb24gcmlnaHQgYmVmb3JlIHdhaXRpbmcKLSAgICAgICAgaWYgKCFydW5uaW5nXykgYnJlYWs7Ci0gICAgICAgIC8vIHdhaXQgdW50aWwgdGltZSBmb3IgdGhlIG5leHQgdGFzayAoaWYgYW55KQotICAgICAgICBpZiAodGFza19xdWV1ZV8uc2l6ZSgpID4gMCkgewotICAgICAgICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSB0aW1lX3BvaW50IGJlY2F1c2Ugd2FpdF91bnRpbCB0YWtlcyBhIHJlZmVyZW5jZQotICAgICAgICAgIC8vIHRvIGl0IGFuZCBtYXkgcmVhZCBpdCBhZnRlciB3YWl0aW5nLCBieSB3aGljaCB0aW1lIHRoZSB0YXNrIG1heQotICAgICAgICAgIC8vIGhhdmUgYmVlbiBmcmVlZCAoZS5nLiB2aWEgQ2FuY2VsQXN5bmNUYXNrKS4KLSAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHRpbWUgPQotICAgICAgICAgICAgICAoKnRhc2tfcXVldWVfLmJlZ2luKCkpLT50aW1lOwotICAgICAgICAgIGludGVybmFsX2NvbmRfdmFyXy53YWl0X3VudGlsKGd1YXJkLCB0aW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnRlcm5hbF9jb25kX3Zhcl8ud2FpdChndWFyZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBib29sIHJ1bm5pbmdfID0gZmFsc2U7Ci0gIHN0ZDo6dGhyZWFkIHRocmVhZF87Ci0gIHN0ZDo6bXV0ZXggaW50ZXJuYWxfbXV0ZXhfOwotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBpbnRlcm5hbF9jb25kX3Zhcl87Ci0KLSAgQXN5bmNUYXNrSWQgbGFzdFRhc2tJZF8gPSBrSW52YWxpZFRhc2tJZDsKLSAgQXN5bmNVc2VySWQgbGFzdFVzZXJJZF97MX07Ci0gIHN0ZDo6bWFwPEFzeW5jVGFza0lkLCBzdGQ6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrc19ieV9pZF87Ci0gIHN0ZDo6bWFwPEFzeW5jVXNlcklkLCBzdGQ6OnNldDxBc3luY1Rhc2tJZD4+IHRhc2tzX2J5X3VzZXJfaWRfOwotICBzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGFzaz4sIHRhc2tfcF9jb21wYXJhdG9yPiB0YXNrX3F1ZXVlXzsKLX07Ci0KLS8vIEFzeW5jIE1hbmFnZXIgSW1wbGVtZW50YXRpb246Ci1Bc3luY01hbmFnZXI6OkFzeW5jTWFuYWdlcigpIDogZmRXYXRjaGVyX3BfKG5ldyBBc3luY0ZkV2F0Y2hlcigpKSwgdGFza01hbmFnZXJfcF8obmV3IEFzeW5jVGFza01hbmFnZXIoKSkge30KLQotQXN5bmNNYW5hZ2VyOjp+QXN5bmNNYW5hZ2VyKCkgewotICAvLyBNYWtlIHN1cmUgdGhlIHRocmVhZHMgYXJlIHN0b3BwZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIG9iamVjdC4KLSAgLy8gVGhlIHRocmVhZHMgbmVlZCB0byBiZSBzdG9wcGVkIGhlcmUgYW5kIG5vdCBpbiBlYWNoIGludGVybmFsIGNsYXNzJwotICAvLyBkZXN0cnVjdG9yIGJlY2F1c2UgdW5pcXVlX3B0cidzIHJlc2V0KCkgZmlyc3QgYXNzaWducyBudWxscHRyIHRvIHRoZQotICAvLyBwb2ludGVyIGFuZCBvbmx5IHRoZW4gY2FsbHMgdGhlIGRlc3RydWN0b3IsIHNvIGFueSBjYWxsYmFjayBydW5uaW5nCi0gIC8vIG9uIHRoZXNlIHRocmVhZHMgd291bGQgZGVyZWZlcmVuY2UgYSBudWxsIHBvaW50ZXIgaWYgdGhleSBjYWxsZWQgYSBtZW1iZXIKLSAgLy8gZnVuY3Rpb24gb2YgdGhpcyBjbGFzcy4KLSAgZmRXYXRjaGVyX3BfLT5zdG9wVGhyZWFkKCk7Ci0gIHRhc2tNYW5hZ2VyX3BfLT5zdG9wVGhyZWFkKCk7Ci19Ci0KLWludCBBc3luY01hbmFnZXI6OldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKGludCBmaWxlX2Rlc2NyaXB0b3IsIGNvbnN0IFJlYWRDYWxsYmFjayYgb25fcmVhZF9mZF9yZWFkeV9jYWxsYmFjaykgewotICByZXR1cm4gZmRXYXRjaGVyX3BfLT5XYXRjaEZkRm9yTm9uQmxvY2tpbmdSZWFkcyhmaWxlX2Rlc2NyaXB0b3IsIG9uX3JlYWRfZmRfcmVhZHlfY2FsbGJhY2spOwotfQotCi12b2lkIEFzeW5jTWFuYWdlcjo6U3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgewotICBmZFdhdGNoZXJfcF8tPlN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9yKGZpbGVfZGVzY3JpcHRvcik7Ci19Ci0KLUFzeW5jVXNlcklkIEFzeW5jTWFuYWdlcjo6R2V0TmV4dFVzZXJJZCgpIHsKLSAgcmV0dXJuIHRhc2tNYW5hZ2VyX3BfLT5HZXROZXh0VXNlcklkKCk7Ci19Ci0KLUFzeW5jVGFza0lkIEFzeW5jTWFuYWdlcjo6RXhlY0FzeW5jKEFzeW5jVXNlcklkIHVzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFza0NhbGxiYWNrJiBjYWxsYmFjaykgewotICByZXR1cm4gdGFza01hbmFnZXJfcF8tPkV4ZWNBc3luYyh1c2VyX2lkLCBkZWxheSwgY2FsbGJhY2spOwotfQotCi1Bc3luY1Rhc2tJZCBBc3luY01hbmFnZXI6OkV4ZWNBc3luY1BlcmlvZGljYWxseSgKLSAgICBBc3luY1VzZXJJZCB1c2VyX2lkLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LAotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgcGVyaW9kLCBjb25zdCBUYXNrQ2FsbGJhY2smIGNhbGxiYWNrKSB7Ci0gIHJldHVybiB0YXNrTWFuYWdlcl9wXy0+RXhlY0FzeW5jUGVyaW9kaWNhbGx5KHVzZXJfaWQsIGRlbGF5LCBwZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKLX0KLQotYm9vbCBBc3luY01hbmFnZXI6OkNhbmNlbEFzeW5jVGFzayhBc3luY1Rhc2tJZCBhc3luY190YXNrX2lkKSB7Ci0gIHJldHVybiB0YXNrTWFuYWdlcl9wXy0+Q2FuY2VsQXN5bmNUYXNrKGFzeW5jX3Rhc2tfaWQpOwotfQotCi1ib29sIEFzeW5jTWFuYWdlcjo6Q2FuY2VsQXN5bmNUYXNrc0Zyb21Vc2VyKAotICAgIHRlc3RfdmVuZG9yX2xpYjo6QXN5bmNVc2VySWQgdXNlcl9pZCkgewotICByZXR1cm4gdGFza01hbmFnZXJfcF8tPkNhbmNlbEFzeW5jVGFza3NGcm9tVXNlcih1c2VyX2lkKTsKLX0KLQotdm9pZCBBc3luY01hbmFnZXI6OlN5bmNocm9uaXplKGNvbnN0IENyaXRpY2FsQ2FsbGJhY2smIGNyaXRpY2FsKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQoc3luY2hyb25pemF0aW9uX211dGV4Xyk7Ci0gIGNyaXRpY2FsKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvYXN5bmNfbWFuYWdlci5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjYmI2OS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvYXN5bmNfbWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSNpZm5kZWYgVEVTVF9WRU5ET1JfTElCX0FTWU5DX01BTkFHRVJfSF8KLSNkZWZpbmUgVEVTVF9WRU5ET1JfTElCX0FTWU5DX01BTkFHRVJfSF8KLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSAiZXJybm8uaCIKLSNpbmNsdWRlICJzdGRpby5oIgotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyBUYXNrQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+OwotdXNpbmcgUmVhZENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+OwotdXNpbmcgQ3JpdGljYWxDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT47Ci11c2luZyBBc3luY1Rhc2tJZCA9IHVpbnQxNl90OwotdXNpbmcgQXN5bmNVc2VySWQgPSB1aW50MTZfdDsKLWNvbnN0ZXhwciB1aW50MTZfdCBrSW52YWxpZFRhc2tJZCA9IDA7Ci0KLS8vIE1hbmFnZXMgdGFza3MgdGhhdCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgZnV0dXJlLiBJdCBjYW4gd2F0Y2ggZmlsZQotLy8gZGVzY3JpcHRvcnMgdG8gY2FsbCBhIGdpdmVuIGNhbGxiYWNrIHdoZW4gaXQgaXMgY2VydGFpbiB0aGF0IGEgbm9uLWJsb2NraW5nCi0vLyByZWFkIGlzIHBvc3NpYmxlIG9yIGNhbiBjYWxsIGEgY2FsbGJhY2sgYXQgYSBzcGVjaWZpYyB0aW1lIChhcHByb3hpbWF0ZWx5KQotLy8gYW5kIChvcHRpb25hbGx5KSByZXBlYXQgdGhlIGNhbGwgcGVyaW9kaWNhbGx5LgotLy8gVGhlIGNsYXNzIGlzIHRocmVhZCBzYWZlIGluIHRoZSBzZW5zZSB0aGF0IGFsbCBpdHMgbWVtYmVyIGZ1bmN0aW9ucyBjYW4gYmUKLS8vIGNhbGxlZCBzaW11bHRhbmVvdXNseSBmcm9tIGRpZmZlcmVudCBjb25jdXJyZW50IHRocmVhZHMuIFRoZSBleGNlcHRpb24gdG8KLS8vIHRoaXMgcnVsZSBpcyB0aGUgY2xhc3MgZGVzdHJ1Y3Rvciwgd2hpY2ggaXMgdW5zYWZlIHRvIGNhbGwgY29uY3VycmVudGx5IHdpdGgKLS8vIGNhbGxzIHRvIG90aGVyIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMuIFRoaXMgZXhjZXB0aW9uIGFsc28gaGFzIGl0cyBvd24KLS8vIGV4Y2VwdGlvbjogaXQgaXMgc2FmZSB0byBkZXN0cm95IHRoZSBvYmplY3QgZXZlbiBpZiBzb21lIG9mIGl0cyBjYWxsYmFja3MgbWF5Ci0vLyBjYWxsIGl0cyBtZW1iZXIgZnVuY3Rpb25zLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIHdpbGwgbWFrZSBzdXJlIGFsbCBjYWxsYmFjawotLy8gY2FsbGluZyB0aHJlYWRzIGFyZSBzdG9wcGVkIGJlZm9yZSBhY3R1YWxseSBkZXN0cm95aW5nIGFueXRoaW5nLiBDYWxsYmFja3MKLS8vIHRoYXQgd2FpdCBmb3IgZmlsZSBkZXNjcmlwdG9yIGFsd2F5cyBydW4gb24gdGhlIHNhbWUgdGhyZWFkLCBzbyB0aGVyZSBpcyBubwotLy8gbmVlZCBvZiBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHRoZW0uIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGFzawotLy8gY2FsbGJhY2tzIHNpbmNlIHRoZXkgYWxzbyBydW4gb24gYSB0aHJlYWQgb2YgdGhlaXIgb3duLCBob3dldmVyIGl0IGlzCi0vLyBwb3NzaWJsZSBmb3IgYSByZWFkIGNhbGxiYWNrIGFuZCBhIHRhc2sgY2FsbGJhY2sgdG8gZXhlY3V0ZSBhdCB0aGUgc2FtZSB0aW1lCi0vLyAodGhleSBhcmUgZ3VhcmFudGVlZCB0byBydW4gaW4gZGlmZmVyZW50IHRocmVhZHMpIHNvIHN5bmNocm9uaXphdGlvbiBpcwotLy8gbmVlZGVkIHRvIGFjY2VzcyBjb21tb24gc3RhdGUgKG90aGVyIHRoYW4gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZQotLy8gQXN5bmNNYW5hZ2VyIGNsYXNzKS4gV2hpbGUgbm90IHJlcXVpcmVkLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byB1c2UKLS8vIHRoZSBTeW5jaHJvbml6ZShjb25zdCBDcml0aWNhbENhbGxiYWNrJikgbWVtYmVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgY29kZQotLy8gaW5zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLiBDYWxsYmFja3MgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG9uIHRoZSBzYW1lCi0vLyBBc3luY01hbmFnZXIgb2JqZWN0IGZyb20gZGlmZmVyZW50IHRocmVhZHMgYXJlIGdyYW50ZWQgdG8gKk5PVCogcnVuCi0vLyBjb25jdXJyZW50bHkuCi1jbGFzcyBBc3luY01hbmFnZXIgewotIHB1YmxpYzoKLSAgLy8gU3RhcnRzIHdhdGNoaW5nIGEgZmlsZSBkZXNjcmlwdG9yIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBUaGUKLSAgLy8gb25fcmVhZF9mZF9yZWFkeV9jYWxsYmFjaygpIHdpbGwgYmUgYXN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gaXQgaXMKLSAgLy8gZ3VhcmFudGVlZCB0aGF0IGEgY2FsbCB0byByZWFkKCkgb24gdGhlIEZEIHdpbGwgbm90IGJsb2NrLiBObyBwcm9taXNlIGlzCi0gIC8vIG1hZGUgYWJvdXQgd2hlbiBpbiB0aGUgZnV0dXJlIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCwgaW4gcGFydGljdWxhciwKLSAgLy8gaXQgaXMgcGVyZmVjdGx5IHBvc3NpYmxlIHRvIGhhdmUgaXQgY2FsbGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIEEKLSAgLy8gcmV0dXJuIG9mIDAgbWVhbnMgc3VjY2VzcywgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZCBvdGhlcndpc2UuCi0gIGludCBXYXRjaEZkRm9yTm9uQmxvY2tpbmdSZWFkcyhpbnQgZmlsZV9kZXNjcmlwdG9yLCBjb25zdCBSZWFkQ2FsbGJhY2smIG9uX3JlYWRfZmRfcmVhZHlfY2FsbGJhY2spOwotCi0gIC8vIElmIHRoZSBmZCB3YXMgbm90IGJlaW5nIHdhdGNoZWQgYmVmb3JlIHRoZSBjYWxsIHdpbGwgYmUgaWdub3JlZC4KLSAgdm9pZCBTdG9wV2F0Y2hpbmdGaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKTsKLQotICAvLyBHZXQgYW4gaWRlbnRpZmllciBmb3IgdGhlIHNjaGVkdWxlciBzbyB0aGF0IHRhc2tzIGNhbiBiZSBjYW5jZWxsZWQgcGVyIHVzZXIKLSAgQXN5bmNVc2VySWQgR2V0TmV4dFVzZXJJZCgpOwotCi0gIC8vIFNjaGVkdWxlcyBhbiBhY3Rpb24gdG8gb2NjdXIgaW4gdGhlIGZ1dHVyZS4gRXZlbiBpZiB0aGUgZGVsYXkgZ2l2ZW4gaXMgbm90Ci0gIC8vIHBvc2l0aXZlIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseS4KLSAgQXN5bmNUYXNrSWQgRXhlY0FzeW5jKEFzeW5jVXNlcklkIHVzZXJfaWQsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgZGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smIGNhbGxiYWNrKTsKLQotICAvLyBTY2hlZHVsZXMgYW4gYWN0aW9uIHRvIG9jY3VyIHBlcmlvZGljYWxseSBpbiB0aGUgZnV0dXJlLiBJZiB0aGUgZGVsYXkgZ2l2ZW4KLSAgLy8gaXMgbm90IHBvc2l0aXZlIHRoZSBjYWxsYmFjayB3aWxsIGJlIGFzeW5jaHJvbm91c2x5IGNhbGxlZCBvbmNlIGZvciBlYWNoCi0gIC8vIHRpbWUgaW4gdGhlIHBhc3QgdGhhdCBpdCBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCBhbmQgdGhlbiBzY2hlZHVsZWQgZm9yCi0gIC8vIGZ1dHVyZSB0aW1lcy4KLSAgQXN5bmNUYXNrSWQgRXhlY0FzeW5jUGVyaW9kaWNhbGx5KEFzeW5jVXNlcklkIHVzZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBwZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smIGNhbGxiYWNrKTsKLQotICAvLyBDYW5jZWxzIHRoZS9ldmVyeSBmdXR1cmUgb2NjdXJyZW5jZSBvZiB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSB0aGlzIGlkLiBJdAotICAvLyBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIGFzc29jaWF0ZWQgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMKLSAgLy8gbWV0aG9kIHJldHVybnMgKGl0IGNvdWxkIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kKS4KLSAgLy8gVGhlIGNhbGxpbmcgdGhyZWFkIG1heSBibG9jayB1bnRpbCB0aGUgc2NoZWR1bGluZyB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZQotICAvLyBjYW5jZWxsYXRpb24uCi0gIGJvb2wgQ2FuY2VsQXN5bmNUYXNrKEFzeW5jVGFza0lkIGFzeW5jX3Rhc2tfaWQpOwotCi0gIC8vIENhbmNlbHMgdGhlL2V2ZXJ5IGZ1dHVyZSBvY2N1cnJlbmNlIG9mIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGJ5IHRoaXMgaWQuIEl0Ci0gIC8vIGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgYXNzb2NpYXRlZCBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcwotICAvLyBtZXRob2QgcmV0dXJucyAoaXQgY291bGQgYmUgY2FsbGVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2QpLgotICAvLyBUaGUgY2FsbGluZyB0aHJlYWQgbWF5IGJsb2NrIHVudGlsIHRoZSBzY2hlZHVsaW5nIHRocmVhZCBhY2tub3dsZWRnZXMgdGhlCi0gIC8vIGNhbmNlbGxhdGlvbi4KLSAgYm9vbCBDYW5jZWxBc3luY1Rhc2tzRnJvbVVzZXIoQXN5bmNVc2VySWQgdXNlcl9pZCk7Ci0KLSAgLy8gRXhlY3MgdGhlIGdpdmVuIGNvZGUgaW4gYSBzeW5jaHJvbml6ZWQgbWFubmVyLiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgY29kZQotICAvLyBnaXZlbiBvbiAocG9zc2libHkpY29uY3VycmVudCBjYWxscyB0byB0aGlzIG1lbWJlciBmdW5jdGlvbiBvbiB0aGUgc2FtZQotICAvLyBBc3luY01hbmFnZXIgb2JqZWN0IHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQgc2ltdWx0YW5lb3VzbHkuIEl0IGlzIHRoZQotICAvLyBjbGFzcydzIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBubyBjYWxscyB0byBTeW5jaHJvbml6ZSBhcmUKLSAgLy8gbWFkZSBmcm9tIGluc2lkZSBhIENyaXRpY2FsQ2FsbGJhY2ssIHNpbmNlIHRoYXQgd291bGQgY2F1c2UgYSBsb2NrIHRvIGJlCi0gIC8vIGFjcXVpcmVkIHR3aWNlIHdpdGggdW5wcmVkaWN0YWJsZSByZXN1bHRzLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0bwotICAvLyBoYXZlIHZlcnkgc2ltcGxlIENyaXRpY2FsQ2FsbGJhY2tzLCBwcmVmZXJhYmx5IHVzaW5nIGxhbWJkYSBleHByZXNzaW9ucy4KLSAgdm9pZCBTeW5jaHJvbml6ZShjb25zdCBDcml0aWNhbENhbGxiYWNrJik7Ci0KLSAgQXN5bmNNYW5hZ2VyKCk7Ci0gIEFzeW5jTWFuYWdlcihjb25zdCBBc3luY01hbmFnZXImKSA9IGRlbGV0ZTsKLSAgQXN5bmNNYW5hZ2VyJiBvcGVyYXRvcj0oY29uc3QgQXN5bmNNYW5hZ2VyJikgPSBkZWxldGU7Ci0KLSAgfkFzeW5jTWFuYWdlcigpOwotCi0gcHJpdmF0ZToKLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEZEIHdhdGNoaW5nIHBhcnQgb2YgQXN5bmNNYW5hZ2VyLCBleHRyYWN0ZWQgdG8gaXRzCi0gIC8vIG93biBjbGFzcyBmb3IgY2xhcml0eSBwdXJwb3Nlcy4KLSAgY2xhc3MgQXN5bmNGZFdhdGNoZXI7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGFzeW5jaHJvbm91cyB0YXNrcyBwYXJ0IG9mIEFzeW5jTWFuYWdlciwgZXh0cmFjdGVkIHRvCi0gIC8vIGl0cyBvd24gY2xhc3MgZm9yIGNsYXJpdHkgcHVycG9zZXMuCi0gIGNsYXNzIEFzeW5jVGFza01hbmFnZXI7Ci0KLSAgLy8gS2VwdCBhcyBwb2ludGVycyBiZWNhdXNlIHdlIG1heSB3YW50IHRvIHN1cHBvcnQgcmVzZXR0aW5nIGVpdGhlciB3aXRob3V0Ci0gIC8vIGRlc3Ryb3lpbmcgdGhlIG90aGVyIG9uZQotICBzdGQ6OnVuaXF1ZV9wdHI8QXN5bmNGZFdhdGNoZXI+IGZkV2F0Y2hlcl9wXzsKLSAgc3RkOjp1bmlxdWVfcHRyPEFzeW5jVGFza01hbmFnZXI+IHRhc2tNYW5hZ2VyX3BfOwotCi0gIHN0ZDo6bXV0ZXggc3luY2hyb25pemF0aW9uX211dGV4XzsKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCi0jZW5kaWYgIC8vIFRFU1RfVkVORE9SX0xJQl9BU1lOQ19NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL2RldmljZV9ib3V0aXF1ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYjFjYy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImRldmljZV9ib3V0aXF1ZS5oIgotCi0jaW5jbHVkZSAib3MvbG9nLmgiCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+KCk+PiYgRGV2aWNlQm91dGlxdWU6OkdldE1hcCgpIHsKLSAgc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPigpPj4gaW1wbDsKLSAgcmV0dXJuIGltcGw7Ci19Ci0KLS8vIFJlZ2lzdGVyIGEgY29uc3RydWN0b3IgZm9yIGEgZGV2aWNlIHR5cGUuCi1ib29sIERldmljZUJvdXRpcXVlOjpSZWdpc3Rlcihjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+KCk+IGRldmljZV9jb25zdHJ1Y3RvcikgewotICBMT0dfSU5GTygiUmVnaXN0ZXJpbmcgJXMiLCBkZXZpY2VfdHlwZS5jX3N0cigpKTsKLSAgR2V0TWFwKClbZGV2aWNlX3R5cGVdID0gZGV2aWNlX2NvbnN0cnVjdG9yOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPERldmljZT4gRGV2aWNlQm91dGlxdWU6OkNyZWF0ZShjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gIEFTU0VSVCghYXJncy5lbXB0eSgpKTsKLQotICBpZiAoR2V0TWFwKCkuZmluZChhcmdzWzBdKSA9PSBHZXRNYXAoKS5lbmQoKSkgewotICAgIExPR19XQVJOKCJObyBjb25zdHJ1Y3RvciByZWdpc3RlcmVkIGZvciAlcyIsIGFyZ3NbMF0uY19zdHIoKSk7Ci0gICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+KG51bGxwdHIpOwotICB9Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPERldmljZT4gbmV3X2RldmljZSA9IEdldE1hcCgpW2FyZ3NbMF1dKCk7Ci0gIGlmIChuZXdfZGV2aWNlICE9IG51bGxwdHIpIG5ld19kZXZpY2UtPkluaXRpYWxpemUoYXJncyk7Ci0KLSAgcmV0dXJuIG5ld19kZXZpY2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC9kZXZpY2VfYm91dGlxdWUuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC9kZXZpY2VfYm91dGlxdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlZGIzZC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvZGV2aWNlX2JvdXRpcXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvZGV2aWNlLmgiCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi0vLyBDcmVhdGUgY3VzdG9taXplZCBkZXZpY2VzIGZyb20gYSBjZW50cmFsaXplZCBzaG9wLgotY2xhc3MgRGV2aWNlQm91dGlxdWUgewotIHB1YmxpYzoKLSAgRGV2aWNlQm91dGlxdWUoKTsKLSAgdmlydHVhbCB+RGV2aWNlQm91dGlxdWUoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBjb25zdHJ1Y3RvciBmb3IgYSBkZXZpY2UgdHlwZS4KLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV90eXBlLCBjb25zdCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+KCk+IG1ldGhvZCk7Ci0KLSAgLy8gQ2FsbCB0aGUgY29uc3RydWN0b3IgdGhhdCBtYXRjaGVzIGFyZ1swXSwgdGhlbiBjYWxsIGRldi0+SW5pdGlhbGl6ZShhcmdzKS4KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IENyZWF0ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBEPgotICBzdHJ1Y3QgUmVnaXN0cmFyIHsKLSAgICBleHBsaWNpdCBSZWdpc3RyYXIoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpIHsKLSAgICAgIERldmljZUJvdXRpcXVlOjpSZWdpc3RlcihuYW1lLCAmRDo6Q3JlYXRlKTsKLSAgICB9Ci0gICAgc3RhdGljIFJlZ2lzdHJhcjxEPiByZWdpc3RyYXJfOwotICB9OwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8RGV2aWNlPigpPj4mIEdldE1hcCgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3BoeV9sYXllci5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3BoeV9sYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMDY3Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC9waHlfbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiaW5jbHVkZS9waHkuaCIKLQotI2luY2x1ZGUgInBhY2tldHMvbGlua19sYXllcl9wYWNrZXRzLmgiCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgUGh5TGF5ZXIgewotIHB1YmxpYzoKLSAgUGh5TGF5ZXIoUGh5OjpUeXBlIHBoeV90eXBlLCB1aW50MzJfdCBpZCwKLSAgICAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3KT4mCi0gICAgICAgICAgICAgICBkZXZpY2VfcmVjZWl2ZSwKLSAgICAgICAgICAgdWludDMyX3QgZGV2aWNlX2lkKQotICAgICAgOiBwaHlfdHlwZV8ocGh5X3R5cGUpLAotICAgICAgICBpZF8oaWQpLAotICAgICAgICBkZXZpY2VfaWRfKGRldmljZV9pZCksCi0gICAgICAgIHRyYW5zbWl0X3RvX2RldmljZV8oZGV2aWNlX3JlY2VpdmUpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIFNlbmQoCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8bW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI+IHBhY2tldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2VuZChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgUmVjZWl2ZShtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgVGltZXJUaWNrKCkgPSAwOwotCi0gIHZpcnR1YWwgYm9vbCBJc0ZhY3RvcnlJZCh1aW50MzJfdCBmYWN0b3J5X2lkKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXIoKSA9IDA7Ci0KLSAgUGh5OjpUeXBlIEdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIHBoeV90eXBlXzsKLSAgfQotCi0gIHVpbnQzMl90IEdldElkKCkgewotICAgIHJldHVybiBpZF87Ci0gIH0KLQotICB1aW50MzJfdCBHZXREZXZpY2VJZCgpIHsgcmV0dXJuIGRldmljZV9pZF87IH0KLQotICB2aXJ0dWFsIH5QaHlMYXllcigpID0gZGVmYXVsdDsKLQotIHByaXZhdGU6Ci0gIFBoeTo6VHlwZSBwaHlfdHlwZV87Ci0gIHVpbnQzMl90IGlkXzsKLSAgdWludDMyX3QgZGV2aWNlX2lkXzsKLQotIHByb3RlY3RlZDoKLSAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3KT4KLSAgICAgIHRyYW5zbWl0X3RvX2RldmljZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvcGh5X2xheWVyX2ZhY3RvcnkuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvcGh5X2xheWVyX2ZhY3RvcnkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTU0NDIuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3BoeV9sYXllcl9mYWN0b3J5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJwaHlfbGF5ZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1QaHlMYXllckZhY3Rvcnk6OlBoeUxheWVyRmFjdG9yeShQaHk6OlR5cGUgcGh5X3R5cGUsIHVpbnQzMl90IGZhY3RvcnlfaWQpCi0gICAgOiBwaHlfdHlwZV8ocGh5X3R5cGUpLCBmYWN0b3J5X2lkXyhmYWN0b3J5X2lkKSB7fQotCi1QaHk6OlR5cGUgUGh5TGF5ZXJGYWN0b3J5OjpHZXRUeXBlKCkgewotICByZXR1cm4gcGh5X3R5cGVfOwotfQotCi11aW50MzJfdCBQaHlMYXllckZhY3Rvcnk6OkdldEZhY3RvcnlJZCgpIHsKLSAgcmV0dXJuIGZhY3RvcnlfaWRfOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8UGh5TGF5ZXI+IFBoeUxheWVyRmFjdG9yeTo6R2V0UGh5TGF5ZXIoCi0gICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3KT4mCi0gICAgICAgIGRldmljZV9yZWNlaXZlLAotICAgIHVpbnQzMl90IGRldmljZV9pZCkgewotICBzdGQ6OnNoYXJlZF9wdHI8UGh5TGF5ZXI+IG5ld19waHkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBoeUxheWVySW1wbD4oCi0gICAgICBwaHlfdHlwZV8sIG5leHRfaWRfKyssIGRldmljZV9yZWNlaXZlLCBkZXZpY2VfaWQsIHRoaXMpOwotICBwaHlfbGF5ZXJzXy5wdXNoX2JhY2sobmV3X3BoeSk7Ci0gIHJldHVybiBuZXdfcGh5OwotfQotCi12b2lkIFBoeUxheWVyRmFjdG9yeTo6VW5yZWdpc3RlclBoeUxheWVyKHVpbnQzMl90IGlkKSB7Ci0gIGZvciAoYXV0byBwaHkgOiBwaHlfbGF5ZXJzXykgewotICAgIGlmIChwaHktPkdldElkKCkgPT0gaWQpIHsKLSAgICAgIHBoeV9sYXllcnNfLnJlbW92ZShwaHkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi12b2lkIFBoeUxheWVyRmFjdG9yeTo6VW5yZWdpc3RlckFsbFBoeUxheWVycygpIHsKLSAgd2hpbGUgKCFwaHlfbGF5ZXJzXy5lbXB0eSgpKSB7Ci0gICAgaWYgKHBoeV9sYXllcnNfLmJlZ2luKCkgIT0gcGh5X2xheWVyc18uZW5kKCkpIHsKLSAgICAgIGF1dG8gaWQgPSAoKnBoeV9sYXllcnNfLmJlZ2luKCkpLT5HZXRJZCgpOwotICAgICAgVW5yZWdpc3RlclBoeUxheWVyKGlkKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBQaHlMYXllckZhY3Rvcnk6OlNlbmQoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiBwYWNrZXQsCi0gICAgdWludDMyX3QgaWQpIHsKLSAgLy8gQ29udmVydCBmcm9tIGEgQnVpbGRlciB0byBhIFZpZXcKLSAgYXV0byBieXRlcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+KCk7Ci0gIGJsdWV0b290aDo6cGFja2V0OjpCaXRJbnNlcnRlciBpKCpieXRlcyk7Ci0gIGJ5dGVzLT5yZXNlcnZlKHBhY2tldC0+c2l6ZSgpKTsKLSAgcGFja2V0LT5TZXJpYWxpemUoaSk7Ci0gIGF1dG8gcGFja2V0X3ZpZXcgPQotICAgICAgYmx1ZXRvb3RoOjpwYWNrZXQ6OlBhY2tldFZpZXc8Ymx1ZXRvb3RoOjpwYWNrZXQ6OmtMaXR0bGVFbmRpYW4+KGJ5dGVzKTsKLSAgYXV0byBsaW5rX2xheWVyX3BhY2tldF92aWV3ID0KLSAgICAgIG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3OjpDcmVhdGUocGFja2V0X3ZpZXcpOwotICBBU1NFUlQobGlua19sYXllcl9wYWNrZXRfdmlldy5Jc1ZhbGlkKCkpOwotCi0gIFNlbmQobGlua19sYXllcl9wYWNrZXRfdmlldywgaWQpOwotfQotCi12b2lkIFBoeUxheWVyRmFjdG9yeTo6U2VuZChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHBoeSA6IHBoeV9sYXllcnNfKSB7Ci0gICAgaWYgKGlkICE9IHBoeS0+R2V0SWQoKSkgewotICAgICAgcGh5LT5SZWNlaXZlKHBhY2tldCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUGh5TGF5ZXJGYWN0b3J5OjpUaW1lclRpY2soKSB7Ci0gIGZvciAoYXV0byYgcGh5IDogcGh5X2xheWVyc18pIHsKLSAgICBwaHktPlRpbWVyVGljaygpOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIFBoeUxheWVyRmFjdG9yeTo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIGZhY3Rvcnk7Ci0gIHN3aXRjaCAocGh5X3R5cGVfKSB7Ci0gICAgY2FzZSBQaHk6OlR5cGU6OkxPV19FTkVSR1k6Ci0gICAgICBmYWN0b3J5IDw8ICJMT1dfRU5FUkdZOiAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQaHk6OlR5cGU6OkJSX0VEUjoKLSAgICAgIGZhY3RvcnkgPDwgIkJSX0VEUjogIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmYWN0b3J5IDw8ICJVbmtub3duOiAiOwotICB9Ci0gIGZvciAoYXV0byYgcGh5IDogcGh5X2xheWVyc18pIHsKLSAgICBmYWN0b3J5IDw8IHBoeS0+R2V0RGV2aWNlSWQoKTsKLSAgICBmYWN0b3J5IDw8ICIsIjsKLSAgfQotCi0gIHJldHVybiBmYWN0b3J5LnN0cigpOwotfQotCi1QaHlMYXllckltcGw6OlBoeUxheWVySW1wbCgKLSAgICBQaHk6OlR5cGUgcGh5X3R5cGUsIHVpbnQzMl90IGlkLAotICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0Vmlldyk+JgotICAgICAgICBkZXZpY2VfcmVjZWl2ZSwKLSAgICB1aW50MzJfdCBkZXZpY2VfaWQsIFBoeUxheWVyRmFjdG9yeSogZmFjdG9yeSkKLSAgICA6IFBoeUxheWVyKHBoeV90eXBlLCBpZCwgZGV2aWNlX3JlY2VpdmUsIGRldmljZV9pZCksIGZhY3RvcnlfKGZhY3RvcnkpIHt9Ci0KLVBoeUxheWVySW1wbDo6flBoeUxheWVySW1wbCgpIHsKLX0KLQotdm9pZCBQaHlMYXllckltcGw6OlNlbmQoCi0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiBwYWNrZXQpIHsKLSAgZmFjdG9yeV8tPlNlbmQocGFja2V0LCBHZXRJZCgpKTsKLX0KLQotdm9pZCBQaHlMYXllckltcGw6OlNlbmQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSB7Ci0gIGZhY3RvcnlfLT5TZW5kKHBhY2tldCwgR2V0SWQoKSk7Ci19Ci0KLXZvaWQgUGh5TGF5ZXJJbXBsOjpVbnJlZ2lzdGVyKCkgewotICBmYWN0b3J5Xy0+VW5yZWdpc3RlclBoeUxheWVyKEdldElkKCkpOwotfQotCi1ib29sIFBoeUxheWVySW1wbDo6SXNGYWN0b3J5SWQodWludDMyX3QgaWQpIHsKLSAgcmV0dXJuIGZhY3RvcnlfLT5HZXRGYWN0b3J5SWQoKSA9PSBpZDsKLX0KLQotdm9pZCBQaHlMYXllckltcGw6OlJlY2VpdmUobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcgcGFja2V0KSB7Ci0gIHRyYW5zbWl0X3RvX2RldmljZV8ocGFja2V0KTsKLX0KLQotdm9pZCBQaHlMYXllckltcGw6OlRpbWVyVGljaygpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC9waHlfbGF5ZXJfZmFjdG9yeS5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3BoeV9sYXllcl9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOWZkZjEuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3BoeV9sYXllcl9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImluY2x1ZGUvcGh5LmgiCi0jaW5jbHVkZSAicGFja2V0cy9saW5rX2xheWVyX3BhY2tldHMuaCIKLSNpbmNsdWRlICJwaHlfbGF5ZXIuaCIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIFBoeUxheWVyRmFjdG9yeSB7Ci0gIGZyaWVuZCBjbGFzcyBQaHlMYXllckltcGw7Ci0KLSBwdWJsaWM6Ci0gIFBoeUxheWVyRmFjdG9yeShQaHk6OlR5cGUgcGh5X3R5cGUsIHVpbnQzMl90IGZhY3RvcnlfaWQpOwotCi0gIHZpcnR1YWwgflBoeUxheWVyRmFjdG9yeSgpID0gZGVmYXVsdDsKLQotICBQaHk6OlR5cGUgR2V0VHlwZSgpOwotCi0gIHVpbnQzMl90IEdldEZhY3RvcnlJZCgpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxQaHlMYXllcj4gR2V0UGh5TGF5ZXIoCi0gICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcpPiYKLSAgICAgICAgICBkZXZpY2VfcmVjZWl2ZSwKLSAgICAgIHVpbnQzMl90IGRldmljZV9pZCk7Ci0KLSAgdm9pZCBVbnJlZ2lzdGVyUGh5TGF5ZXIodWludDMyX3QgaWQpOwotCi0gIHZvaWQgVW5yZWdpc3RlckFsbFBoeUxheWVycygpOwotCi0gIHZpcnR1YWwgdm9pZCBUaW1lclRpY2soKTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZW5kKAotICAgICAgc3RkOjpzaGFyZWRfcHRyPG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiBwYWNrZXQsCi0gICAgICB1aW50MzJfdCBpZCk7Ci0gIHZpcnR1YWwgdm9pZCBTZW5kKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCwgdWludDMyX3QgaWQpOwotCi0gcHJpdmF0ZToKLSAgUGh5OjpUeXBlIHBoeV90eXBlXzsKLSAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxQaHlMYXllcj4+IHBoeV9sYXllcnNfOwotICB1aW50MzJfdCBuZXh0X2lkX3sxfTsKLSAgY29uc3QgdWludDMyX3QgZmFjdG9yeV9pZF87Ci19OwotCi1jbGFzcyBQaHlMYXllckltcGwgOiBwdWJsaWMgUGh5TGF5ZXIgewotIHB1YmxpYzoKLSAgUGh5TGF5ZXJJbXBsKFBoeTo6VHlwZSBwaHlfdHlwZSwgdWludDMyX3QgaWQsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQobW9kZWw6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXcpPiYKLSAgICAgICAgICAgICAgICAgICBkZXZpY2VfcmVjZWl2ZSwKLSAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZV9pZCwgUGh5TGF5ZXJGYWN0b3J5KiBmYWN0b3J5KTsKLSAgflBoeUxheWVySW1wbCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgU2VuZCgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0QnVpbGRlcj4gcGFja2V0KSBvdmVycmlkZTsKLSAgdm9pZCBTZW5kKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVjZWl2ZShtb2RlbDo6cGFja2V0czo6TGlua0xheWVyUGFja2V0VmlldyBwYWNrZXQpIG92ZXJyaWRlOwotICB2b2lkIFVucmVnaXN0ZXIoKSBvdmVycmlkZTsKLSAgYm9vbCBJc0ZhY3RvcnlJZCh1aW50MzJfdCBmYWN0b3J5X2lkKSBvdmVycmlkZTsKLSAgdm9pZCBUaW1lclRpY2soKSBvdmVycmlkZTsKLQotCi0gcHJpdmF0ZToKLSAgUGh5TGF5ZXJGYWN0b3J5KiBmYWN0b3J5XzsKLX07Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9jaGFubmVsX3RyYW5zcG9ydC5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC90ZXN0X2NoYW5uZWxfdHJhbnNwb3J0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhkMzI5Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC90ZXN0X2NoYW5uZWxfdHJhbnNwb3J0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0LmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPiAgIC8vIGZvciBlcnJubywgRUJBREYKLSNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBzaXplX3QKLQotI2luY2x1ZGUgPGNzdGRpbnQ+ICAgICAgLy8gZm9yIHVpbnQ4X3QKLSNpbmNsdWRlIDxjc3RyaW5nPiAgICAgIC8vIGZvciBzdHJlcnJvcgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAgLy8gZm9yIHJlbW92ZV9leHRlbnRfdAotCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIiAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWwKLSNpbmNsdWRlICJvcy9sb2cuaCIgICAgICAgICAgICAgICAgICAvLyBmb3IgTE9HX0lORk8sIEFTU0VSVF9MT0csIExPR19XQVJOCi0KLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotYm9vbCBUZXN0Q2hhbm5lbFRyYW5zcG9ydDo6U2V0VXAoc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXI+IHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RDYWxsYmFjayBjb25uZWN0aW9uX2NhbGxiYWNrKSB7Ci0gIHNvY2tldF9zZXJ2ZXJfID0gc2VydmVyOwotICBzb2NrZXRfc2VydmVyXy0+U2V0T25Db25uZWN0Q2FsbGJhY2soY29ubmVjdGlvbl9jYWxsYmFjayk7Ci0gIHNvY2tldF9zZXJ2ZXJfLT5TdGFydExpc3RlbmluZygpOwotICByZXR1cm4gc29ja2V0X3NlcnZlcl8uZ2V0KCkgIT0gbnVsbHB0cjsKLX0KLQotdm9pZCBUZXN0Q2hhbm5lbFRyYW5zcG9ydDo6Q2xlYW5VcCgpIHsKLSAgc29ja2V0X3NlcnZlcl8tPlN0b3BMaXN0ZW5pbmcoKTsKLSAgc29ja2V0X3NlcnZlcl8tPkNsb3NlKCk7Ci19Ci0KLXZvaWQgVGVzdENoYW5uZWxUcmFuc3BvcnQ6Ok9uQ29tbWFuZFJlYWR5KEFzeW5jRGF0YUNoYW5uZWwqIHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gdW53YXRjaCkgewotICB1aW50OF90IGNvbW1hbmRfbmFtZV9zaXplID0gMDsKLSAgc3NpemVfdCBieXRlc19yZWFkID0gc29ja2V0LT5SZWN2KCZjb21tYW5kX25hbWVfc2l6ZSwgMSk7Ci0gIGlmIChieXRlc19yZWFkICE9IDEpIHsKLSAgICBMT0dfSU5GTygiVW5leHBlY3RlZCAoY29tbWFuZF9uYW1lX3NpemUpIGJ5dGVzX3JlYWQ6ICV6ZCAhPSAlZCwgJXMiLAotICAgICAgICAgICAgIGJ5dGVzX3JlYWQsIDEsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgc29ja2V0LT5DbG9zZSgpOwotICB9Ci0gIHZlY3Rvcjx1aW50OF90PiBjb21tYW5kX25hbWVfcmF3OwotICBjb21tYW5kX25hbWVfcmF3LnJlc2l6ZShjb21tYW5kX25hbWVfc2l6ZSk7Ci0gIGJ5dGVzX3JlYWQgPSBzb2NrZXQtPlJlY3YoJmNvbW1hbmRfbmFtZV9yYXdbMF0sIGNvbW1hbmRfbmFtZV9zaXplKTsKLSAgaWYgKGJ5dGVzX3JlYWQgIT0gY29tbWFuZF9uYW1lX3NpemUpIHsKLSAgICBMT0dfSU5GTygiVW5leHBlY3RlZCAoY29tbWFuZF9uYW1lKSBieXRlc19yZWFkOiAlemQgIT0gJWQsICVzIiwgYnl0ZXNfcmVhZCwKLSAgICAgICAgICAgICBjb21tYW5kX25hbWVfc2l6ZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotICBzdGQ6OnN0cmluZyBjb21tYW5kX25hbWUoY29tbWFuZF9uYW1lX3Jhdy5iZWdpbigpLCBjb21tYW5kX25hbWVfcmF3LmVuZCgpKTsKLQotICBpZiAoY29tbWFuZF9uYW1lID09ICJDTE9TRV9URVNUX0NIQU5ORUwiIHx8IGNvbW1hbmRfbmFtZSA9PSAiIikgewotICAgIExPR19JTkZPKCJUZXN0IGNoYW5uZWwgY2xvc2VkIik7Ci0gICAgdW53YXRjaCgpOwotICAgIHNvY2tldC0+Q2xvc2UoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IG51bV9hcmdzID0gMDsKLSAgYnl0ZXNfcmVhZCA9IHNvY2tldC0+UmVjdigmbnVtX2FyZ3MsIDEpOwotICBpZiAoYnl0ZXNfcmVhZCAhPSAxKSB7Ci0gICAgTE9HX0lORk8oIlVuZXhwZWN0ZWQgKG51bV9hcmdzKSBieXRlc19yZWFkOiAlemQgIT0gJWQsICVzIiwgYnl0ZXNfcmVhZCwgMSwKLSAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICB9Ci0gIHZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnczsKLSAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgIHVpbnQ4X3QgYXJnX3NpemUgPSAwOwotICAgIGJ5dGVzX3JlYWQgPSBzb2NrZXQtPlJlY3YoJmFyZ19zaXplLCAxKTsKLSAgICBpZiAoYnl0ZXNfcmVhZCAhPSAxKSB7Ci0gICAgICBMT0dfSU5GTygiVW5leHBlY3RlZCAoYXJnX3NpemUpIGJ5dGVzX3JlYWQ6ICV6ZCAhPSAlZCwgJXMiLCBieXRlc19yZWFkLCAxLAotICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgdmVjdG9yPHVpbnQ4X3Q+IGFyZzsKLSAgICBhcmcucmVzaXplKGFyZ19zaXplKTsKLSAgICBieXRlc19yZWFkID0gc29ja2V0LT5SZWN2KCZhcmdbMF0sIGFyZ19zaXplKTsKLSAgICBpZiAoYnl0ZXNfcmVhZCAhPSBhcmdfc2l6ZSkgewotICAgICAgTE9HX0lORk8oIlVuZXhwZWN0ZWQgKGFyZykgYnl0ZXNfcmVhZDogJXpkICE9ICVkLCAlcyIsIGJ5dGVzX3JlYWQsCi0gICAgICAgICAgICAgICBhcmdfc2l6ZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgYXJncy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoYXJnLmJlZ2luKCksIGFyZy5lbmQoKSkpOwotICB9Ci0KLSAgY29tbWFuZF9oYW5kbGVyXyhjb21tYW5kX25hbWUsIGFyZ3MpOwotfQotCi12b2lkIFRlc3RDaGFubmVsVHJhbnNwb3J0OjpTZW5kUmVzcG9uc2UoCi0gICAgc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldCwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzcG9uc2UpIGNvbnN0IHsKLSAgc2l6ZV90IHNpemUgPSByZXNwb25zZS5zaXplKCk7Ci0gIC8vIENhcCB0byA2NEsKLSAgaWYgKHNpemUgPiAweGZmZmYpIHsKLSAgICBzaXplID0gMHhmZmZmOwotICB9Ci0gIHVpbnQ4X3Qgc2l6ZV9idWZbNF0gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc2l6ZSAmIDB4ZmYpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChzaXplID4+IDgpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHNpemUgPj4gMTYpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHNpemUgPj4gMjQpICYgMHhmZil9OwotICBzc2l6ZV90IHdyaXR0ZW4gPSBzb2NrZXQtPlNlbmQoc2l6ZV9idWYsIDQpOwotICBpZiAod3JpdHRlbiA9PSAtMSAmJiBlcnJubyA9PSBFQkFERikgewotICAgIExPR19XQVJOKCJVbmFibGUgdG8gc2VuZCBhIHJlc3BvbnNlLiAgRUJBREYiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQVNTRVJUX0xPRyh3cml0dGVuID09IDQsICJXaGF0IGhhcHBlbmVkPyB3cml0dGVuID0gJXpkIGVycm5vID0gJWQiLCB3cml0dGVuLAotICAgICAgICAgICAgIGVycm5vKTsKLSAgd3JpdHRlbiA9Ci0gICAgICBzb2NrZXQtPlNlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVzcG9uc2UuY19zdHIoKSksIHNpemUpOwotICBBU1NFUlRfTE9HKHdyaXR0ZW4gPT0gc3RhdGljX2Nhc3Q8aW50PihzaXplKSwKLSAgICAgICAgICAgICAiV2hhdCBoYXBwZW5lZD8gd3JpdHRlbiA9ICV6ZCBlcnJubyA9ICVkIiwgd3JpdHRlbiwgZXJybm8pOwotfQotCi12b2lkIFRlc3RDaGFubmVsVHJhbnNwb3J0OjpSZWdpc3RlckNvbW1hbmRIYW5kbGVyKAotICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYpPiYgY2FsbGJhY2spIHsKLSAgY29tbWFuZF9oYW5kbGVyXyA9IGNhbGxiYWNrOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9jaGFubmVsX3RyYW5zcG9ydC5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3Rlc3RfY2hhbm5lbF90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0OGEzZC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9jaGFubmVsX3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPiAgLy8gZm9yIGZ1bmN0aW9uCi0jaW5jbHVkZSA8bWVtb3J5PiAgICAgIC8vIGZvciBzaGFyZWRfcHRyCi0jaW5jbHVkZSA8c3RyaW5nPiAgICAgIC8vIGZvciBzdHJpbmcKLSNpbmNsdWRlIDx2ZWN0b3I+ICAgICAgLy8gZm9yIHZlY3RvcgotCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIiAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWwKLSNpbmNsdWRlICJuZXQvYXN5bmNfZGF0YV9jaGFubmVsX3NlcnZlci5oIiAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIgKHB0ciBvbmx5KSwgQ29uLi4uCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi11c2luZyBhbmRyb2lkOjpuZXQ6OkFzeW5jRGF0YUNoYW5uZWw7Ci11c2luZyBhbmRyb2lkOjpuZXQ6OkFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXI7Ci11c2luZyBhbmRyb2lkOjpuZXQ6OkNvbm5lY3RDYWxsYmFjazsKLQotLy8gTWFuYWdlcyBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHRlc3QgY2hhbm5lbCBhbmQgdGhlIGNvbnRyb2xsZXIuIE1pcnJvcnMgdGhlCi0vLyBIY2lUcmFuc3BvcnQgZm9yIHRoZSB0ZXN0IGNoYW5uZWwuCi1jbGFzcyBUZXN0Q2hhbm5lbFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUZXN0Q2hhbm5lbFRyYW5zcG9ydCgpIHt9Ci0KLSAgflRlc3RDaGFubmVsVHJhbnNwb3J0KCkge30KLQotICAvLyBPcGVucyBhIHBvcnQgYW5kIHJldHVybnMgYW5kIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLgotICBib29sIFNldFVwKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsU2VydmVyPiBzZXJ2ZXIsCi0gICAgICAgICAgICAgQ29ubmVjdENhbGxiYWNrIGNvbm5lY3Rpb25fY2FsbGJhY2spOwotCi0gIC8vIENsb3NlcyB0aGUgcG9ydCAoaWYgc3VjY2VzZnVsbHkgb3BlbmVkIGluIFNldFVwKS4KLSAgdm9pZCBDbGVhblVwKCk7Ci0KLSAgLy8gU2V0cyB0aGUgY2FsbGJhY2sgdGhhdCBmaXJlcyB3aGVuIGRhdGEgaXMgcmVhZCBpbiBXYXRjaEZkKCkuCi0gIHZvaWQgUmVnaXN0ZXJDb21tYW5kSGFuZGxlcigKLSAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Jik+JiBjYWxsYmFjayk7Ci0KLSAgLy8gU2VuZCBkYXRhIGJhY2sgdG8gdGhlIHRlc3QgY2hhbm5lbC4KLSAgdm9pZCBTZW5kUmVzcG9uc2Uoc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmKSBjb25zdDsKLQotICB2b2lkIE9uQ29tbWFuZFJlYWR5KEFzeW5jRGF0YUNoYW5uZWwqIHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IHVud2F0Y2gpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Jik+Ci0gICAgICBjb21tYW5kX2hhbmRsZXJfOwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+KT4gY29ubmVjdGlvbl9jYWxsYmFja187Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsU2VydmVyPiBzb2NrZXRfc2VydmVyXzsKLQotICBUZXN0Q2hhbm5lbFRyYW5zcG9ydChjb25zdCBUZXN0Q2hhbm5lbFRyYW5zcG9ydCYgY21kUGNrdCkgPSBkZWxldGU7Ci0gIFRlc3RDaGFubmVsVHJhbnNwb3J0JiBvcGVyYXRvcj0oY29uc3QgVGVzdENoYW5uZWxUcmFuc3BvcnQmIGNtZFBja3QpID0gZGVsZXRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3Rlc3RfY29tbWFuZF9oYW5kbGVyLmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3Rlc3RfY29tbWFuZF9oYW5kbGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk1Y2MzLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC90ZXN0X2NvbW1hbmRfaGFuZGxlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGVzdF9jb21tYW5kX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJkZXZpY2VfYm91dGlxdWUuaCIKLSNpbmNsdWRlICJwaHkuaCIKLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHJlZ2V4PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJvcy9sb2cuaCIKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIKLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1UZXN0Q29tbWFuZEhhbmRsZXI6OlRlc3RDb21tYW5kSGFuZGxlcihUZXN0TW9kZWwmIHRlc3RfbW9kZWwpIDogbW9kZWxfKHRlc3RfbW9kZWwpIHsKLSNkZWZpbmUgU0VUX0hBTkRMRVIoY29tbWFuZF9uYW1lLCBtZXRob2QpIFwKLSAgYWN0aXZlX2NvbW1hbmRzX1tjb21tYW5kX25hbWVdID0gW3RoaXNdKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhcmFtKSB7IG1ldGhvZChwYXJhbSk7IH07Ci0gIFNFVF9IQU5ETEVSKCJhZGQiLCBBZGQpOwotICBTRVRfSEFORExFUigiYWRkX3JlbW90ZSIsIEFkZFJlbW90ZSk7Ci0gIFNFVF9IQU5ETEVSKCJkZWwiLCBEZWwpOwotICBTRVRfSEFORExFUigiYWRkX3BoeSIsIEFkZFBoeSk7Ci0gIFNFVF9IQU5ETEVSKCJkZWxfcGh5IiwgRGVsUGh5KTsKLSAgU0VUX0hBTkRMRVIoImFkZF9kZXZpY2VfdG9fcGh5IiwgQWRkRGV2aWNlVG9QaHkpOwotICBTRVRfSEFORExFUigiZGVsX2RldmljZV9mcm9tX3BoeSIsIERlbERldmljZUZyb21QaHkpOwotICBTRVRfSEFORExFUigibGlzdCIsIExpc3QpOwotICBTRVRfSEFORExFUigic2V0X2RldmljZV9hZGRyZXNzIiwgU2V0RGV2aWNlQWRkcmVzcyk7Ci0gIFNFVF9IQU5ETEVSKCJzZXRfdGltZXJfcGVyaW9kIiwgU2V0VGltZXJQZXJpb2QpOwotICBTRVRfSEFORExFUigic3RhcnRfdGltZXIiLCBTdGFydFRpbWVyKTsKLSAgU0VUX0hBTkRMRVIoInN0b3BfdGltZXIiLCBTdG9wVGltZXIpOwotICBTRVRfSEFORExFUigicmVzZXQiLCBSZXNldCk7Ci0jdW5kZWYgU0VUX0hBTkRMRVIKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6OkFkZERlZmF1bHRzKCkgewotICAvLyBBZGQgYSBwaHkgZm9yIExFIGFuZCBvbmUgZm9yIEJSL0VEUgotICBBZGRQaHkoeyJMT1dfRU5FUkdZIn0pOwotICBBZGRQaHkoeyJCUl9FRFIifSk7Ci0KLSAgLy8gQWRkIHRoZSBjb250cm9sbGVyIHRvIHRoZSBQaHlzCi0gIEFkZERldmljZVRvUGh5KHsiMSIsICIxIn0pOwotICBBZGREZXZpY2VUb1BoeSh7IjEiLCAiMiJ9KTsKLQotICAvLyBBZGQgZGVmYXVsdCB0ZXN0IGRldmljZXMgYW5kIGFkZCB0aGUgZGV2aWNlcyB0byB0aGUgcGh5cwotICAvLyBBZGQoeyJiZWFjb24iLCAiYmU6YWM6MTA6MDA6MDA6MDEiLCAiMTAwMCJ9KTsKLSAgLy8gQWRkRGV2aWNlVG9QaHkoeyIyIiwgIjEifSk7Ci0KLSAgLy8gQWRkKHsia2V5Ym9hcmQiLCAiY2M6MWM6ZWI6MGE6MTI6ZDEiLCAiNTAwIn0pOwotICAvLyBBZGREZXZpY2VUb1BoeSh7IjMiLCAiMSJ9KTsKLQotICAvLyBBZGQoeyJjbGFzc2ljIiwgImMxOmE1OjUxOmMwOjAwOjAxIiwgIjIyIn0pOwotICAvLyBBZGREZXZpY2VUb1BoeSh7IjQiLCAiMiJ9KTsKLQotICAvLyBBZGQoeyJjYXJfa2l0IiwgImNhOjEyOjFjOjE3OjAwOjAxIiwgIjIzOCJ9KTsKLSAgLy8gQWRkRGV2aWNlVG9QaHkoeyI1IiwgIjIifSk7Ci0KLSAgLy8gQWRkKHsic25pZmZlciIsICJjYToxMjoxYzoxNzowMDowMSJ9KTsKLSAgLy8gQWRkRGV2aWNlVG9QaHkoeyI2IiwgIjIifSk7Ci0KLSAgLy8gQWRkKHsic25pZmZlciIsICIzYzo1YTpiNDowNDowNTowNiJ9KTsKLSAgLy8gQWRkRGV2aWNlVG9QaHkoeyI3IiwgIjIifSk7Ci0gIC8vIEFkZCh7InJlbW90ZV9sb29wYmFja19kZXZpY2UiLCAiMTA6MGQ6MDA6YmE6YzE6MDYifSk7Ci0gIC8vIEFkZERldmljZVRvUGh5KHsiOCIsICIyIn0pOwotICBMaXN0KHt9KTsKLQotICBTZXRUaW1lclBlcmlvZCh7IjEwIn0pOwotICBTdGFydFRpbWVyKHt9KTsKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6OkhhbmRsZUNvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFjdGl2ZV9jb21tYW5kc18uY291bnQobmFtZSkgPT0gMCkgewotICAgIHJlc3BvbnNlX3N0cmluZ18gPSAiVW5oYW5kbGVkIGNvbW1hbmQ6ICIgKyBuYW1lOwotICAgIHNlbmRfcmVzcG9uc2VfKHJlc3BvbnNlX3N0cmluZ18pOwotICAgIHJldHVybjsKLSAgfQotICBhY3RpdmVfY29tbWFuZHNfW25hbWVdKGFyZ3MpOwotfQotCi12b2lkIFRlc3RDb21tYW5kSGFuZGxlcjo6RnJvbUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSkgewotICBpZiAoZmlsZV9uYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjppZnN0cmVhbSBmaWxlKGZpbGVfbmFtZS5jX3N0cigpKTsKLQotICBjb25zdCBzdGQ6OnJlZ2V4IHJlKCJcXHMrIik7Ci0KLSAgc3RkOjpzdHJpbmcgbGluZTsKLSAgd2hpbGUgKHN0ZDo6Z2V0bGluZShmaWxlLCBsaW5lKSkgewotICAgIGF1dG8gYmVnaW4gPSBzdGQ6OnNyZWdleF90b2tlbl9pdGVyYXRvcihsaW5lLmJlZ2luKCksIGxpbmUuZW5kKCksIHJlLCAtMSk7Ci0gICAgYXV0byBlbmQgPSBzdGQ6OnNyZWdleF90b2tlbl9pdGVyYXRvcigpOwotICAgIGF1dG8gcGFyYW1zID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KHN0ZDo6bmV4dChiZWdpbiksIGVuZCk7Ci0KLSAgICBIYW5kbGVDb21tYW5kKCpiZWdpbiwgcGFyYW1zKTsKLSAgfQotCi0gIGlmIChmaWxlLmZhaWwoKSkgewotICAgIExPR19FUlJPUigiRXJyb3IgcmVhZGluZyBjb21tYW5kcyBmcm9tIGZpbGUuIik7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgVGVzdENvbW1hbmRIYW5kbGVyOjpSZWdpc3RlclNlbmRSZXNwb25zZShjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gY2FsbGJhY2spIHsKLSAgc2VuZF9yZXNwb25zZV8gPSBjYWxsYmFjazsKLSAgc2VuZF9yZXNwb25zZV8oIlJlZ2lzdGVyU2VuZFJlc3BvbnNlIGNhbGxlZCIpOwotfQotCi12b2lkIFRlc3RDb21tYW5kSGFuZGxlcjo6QWRkKGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3Muc2l6ZSgpIDwgMSkgewotICAgIHJlc3BvbnNlX3N0cmluZ18gPSAiVGVzdENvbW1hbmRIYW5kbGVyICdhZGQnIHRha2VzIGFuIGFyZ3VtZW50IjsKLSAgICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjpzaGFyZWRfcHRyPERldmljZT4gbmV3X2RldiA9IERldmljZUJvdXRpcXVlOjpDcmVhdGUoYXJncyk7Ci0KLSAgaWYgKG5ld19kZXYgPT0gTlVMTCkgewotICAgIHJlc3BvbnNlX3N0cmluZ18gPSAiVGVzdENvbW1hbmRIYW5kbGVyICdhZGQnICIgKyBhcmdzWzBdICsgIiBmYWlsZWQhIjsKLSAgICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLSAgICBMT0dfV0FSTigiJXMiLCByZXNwb25zZV9zdHJpbmdfLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIExPR19JTkZPKCJBZGQgJXMiLCBuZXdfZGV2LT5Ub1N0cmluZygpLmNfc3RyKCkpOwotICBzaXplX3QgZGV2X2luZGV4ID0gbW9kZWxfLkFkZChuZXdfZGV2KTsKLSAgcmVzcG9uc2Vfc3RyaW5nXyA9IHN0ZDo6dG9fc3RyaW5nKGRldl9pbmRleCkgKyBzdGQ6OnN0cmluZygiOiIpICsgbmV3X2Rldi0+VG9TdHJpbmcoKTsKLSAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci19Ci0KLXZvaWQgVGVzdENvbW1hbmRIYW5kbGVyOjpBZGRSZW1vdGUoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPCAzKSB7Ci0gICAgcmVzcG9uc2Vfc3RyaW5nXyA9ICJUZXN0Q29tbWFuZEhhbmRsZXIgdXNhZ2U6IGFkZF9yZW1vdGUgaG9zdCBwb3J0IHBoeV90eXBlIjsKLSAgICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzaXplX3QgcG9ydCA9IHN0ZDo6c3RvaShhcmdzWzFdKTsKLSAgUGh5OjpUeXBlIHBoeV90eXBlID0gUGh5OjpUeXBlOjpCUl9FRFI7Ci0gIGlmICgiTE9XX0VORVJHWSIgPT0gYXJnc1syXSkgewotICAgIHBoeV90eXBlID0gUGh5OjpUeXBlOjpMT1dfRU5FUkdZOwotICB9Ci0gIGlmIChwb3J0ID09IDAgfHwgcG9ydCA+IDB4ZmZmZiB8fCBhcmdzWzBdLnNpemUoKSA8IDIpIHsKLSAgICByZXNwb25zZV9zdHJpbmdfID0gIlRlc3RDb21tYW5kSGFuZGxlciBiYWQgYXJndW1lbnRzIHRvICdhZGRfcmVtb3RlJzogIjsKLSAgICByZXNwb25zZV9zdHJpbmdfICs9IGFyZ3NbMF07Ci0gICAgcmVzcG9uc2Vfc3RyaW5nXyArPSAiQCI7Ci0gICAgcmVzcG9uc2Vfc3RyaW5nXyArPSBhcmdzWzFdOwotICAgIHNlbmRfcmVzcG9uc2VfKHJlc3BvbnNlX3N0cmluZ18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1vZGVsXy5BZGRSZW1vdGUoYXJnc1swXSwgcG9ydCwgcGh5X3R5cGUpOwotCi0gIHJlc3BvbnNlX3N0cmluZ18gPSBhcmdzWzBdICsgc3RkOjpzdHJpbmcoIkAiKSArIHN0ZDo6dG9fc3RyaW5nKHBvcnQpOwotICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6OkRlbChjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gIHNpemVfdCBkZXZfaW5kZXggPSBzdGQ6OnN0b2koYXJnc1swXSk7Ci0KLSAgbW9kZWxfLkRlbChkZXZfaW5kZXgpOwotICByZXNwb25zZV9zdHJpbmdfID0gIlRlc3RDb21tYW5kSGFuZGxlciAnZGVsJyBjYWxsZWQgd2l0aCBkZXZpY2UgYXQgaW5kZXggIiArIHN0ZDo6dG9fc3RyaW5nKGRldl9pbmRleCk7Ci0gIHNlbmRfcmVzcG9uc2VfKHJlc3BvbnNlX3N0cmluZ18pOwotfQotCi12b2lkIFRlc3RDb21tYW5kSGFuZGxlcjo6QWRkUGh5KGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgaWYgKGFyZ3NbMF0gPT0gIkxPV19FTkVSR1kiKSB7Ci0gICAgbW9kZWxfLkFkZFBoeShQaHk6OlR5cGU6OkxPV19FTkVSR1kpOwotICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gIkJSX0VEUiIpIHsKLSAgICBtb2RlbF8uQWRkUGh5KFBoeTo6VHlwZTo6QlJfRURSKTsKLSAgfSBlbHNlIHsKLSAgICByZXNwb25zZV9zdHJpbmdfID0gIlRlc3RDb21tYW5kSGFuZGxlciAnYWRkX3BoeScgd2l0aCB1bnJlY29nbml6ZWQgdHlwZSAiICsgYXJnc1swXTsKLSAgICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLSAgfQotfQotCi12b2lkIFRlc3RDb21tYW5kSGFuZGxlcjo6RGVsUGh5KGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgc2l6ZV90IHBoeV9pbmRleCA9IHN0ZDo6c3RvaShhcmdzWzBdKTsKLQotICBtb2RlbF8uRGVsUGh5KHBoeV9pbmRleCk7Ci0gIHJlc3BvbnNlX3N0cmluZ18gPSAiVGVzdENvbW1hbmRIYW5kbGVyICdkZWxfcGh5JyBjYWxsZWQgd2l0aCBwaHkgYXQgaW5kZXggIiArIHN0ZDo6dG9fc3RyaW5nKHBoeV9pbmRleCk7Ci0gIHNlbmRfcmVzcG9uc2VfKHJlc3BvbnNlX3N0cmluZ18pOwotfQotCi12b2lkIFRlc3RDb21tYW5kSGFuZGxlcjo6QWRkRGV2aWNlVG9QaHkoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgIT0gMikgewotICAgIHJlc3BvbnNlX3N0cmluZ18gPSAiVGVzdENvbW1hbmRIYW5kbGVyICdhZGRfZGV2aWNlX3RvX3BoeScgdGFrZXMgdHdvIGFyZ3VtZW50cyI7Ci0gICAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNpemVfdCBkZXZfaW5kZXggPSBzdGQ6OnN0b2koYXJnc1swXSk7Ci0gIHNpemVfdCBwaHlfaW5kZXggPSBzdGQ6OnN0b2koYXJnc1sxXSk7Ci0gIG1vZGVsXy5BZGREZXZpY2VUb1BoeShkZXZfaW5kZXgsIHBoeV9pbmRleCk7Ci0gIHJlc3BvbnNlX3N0cmluZ18gPSAiVGVzdENvbW1hbmRIYW5kbGVyICdhZGRfZGV2aWNlX3RvX3BoeScgY2FsbGVkIHdpdGggZGV2aWNlICIgKyBzdGQ6OnRvX3N0cmluZyhkZXZfaW5kZXgpICsKLSAgICAgICAgICAgICAgICAgICAgICIgYW5kIHBoeSAiICsgc3RkOjp0b19zdHJpbmcocGh5X2luZGV4KTsKLSAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci0gIHJldHVybjsKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6OkRlbERldmljZUZyb21QaHkoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgIT0gMikgewotICAgIHJlc3BvbnNlX3N0cmluZ18gPSAiVGVzdENvbW1hbmRIYW5kbGVyICdkZWxfZGV2aWNlX2Zyb21fcGh5JyB0YWtlcyB0d28gYXJndW1lbnRzIjsKLSAgICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2l6ZV90IGRldl9pbmRleCA9IHN0ZDo6c3RvaShhcmdzWzBdKTsKLSAgc2l6ZV90IHBoeV9pbmRleCA9IHN0ZDo6c3RvaShhcmdzWzFdKTsKLSAgbW9kZWxfLkRlbERldmljZUZyb21QaHkoZGV2X2luZGV4LCBwaHlfaW5kZXgpOwotICByZXNwb25zZV9zdHJpbmdfID0gIlRlc3RDb21tYW5kSGFuZGxlciAnZGVsX2RldmljZV9mcm9tX3BoeScgY2FsbGVkIHdpdGggZGV2aWNlICIgKyBzdGQ6OnRvX3N0cmluZyhkZXZfaW5kZXgpICsKLSAgICAgICAgICAgICAgICAgICAgICIgYW5kIHBoeSAiICsgc3RkOjp0b19zdHJpbmcocGh5X2luZGV4KTsKLSAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci0gIHJldHVybjsKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6Okxpc3QoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPiAwKSB7Ci0gICAgTE9HX0lORk8oIlVudXNlZCBhcmdzOiBhcmdbMF0gPSAlcyIsIGFyZ3NbMF0uY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNlbmRfcmVzcG9uc2VfKG1vZGVsXy5MaXN0KCkpOwotfQotCi12b2lkIFRlc3RDb21tYW5kSGFuZGxlcjo6U2V0RGV2aWNlQWRkcmVzcyhjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gIGlmIChhcmdzLnNpemUoKSAhPSAyKSB7Ci0gICAgcmVzcG9uc2Vfc3RyaW5nXyA9ICJUZXN0Q29tbWFuZEhhbmRsZXIgJ3NldF9kZXZpY2VfYWRkcmVzcycgdGFrZXMgdHdvIGFyZ3VtZW50cyI7Ci0gICAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNpemVfdCBkZXZpY2VfaWQgPSBzdGQ6OnN0b2koYXJnc1swXSk7Ci0gIEFkZHJlc3MgZGV2aWNlX2FkZHJlc3N7fTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyhhcmdzWzFdLCBkZXZpY2VfYWRkcmVzcyk7Ci0gIG1vZGVsXy5TZXREZXZpY2VBZGRyZXNzKGRldmljZV9pZCwgZGV2aWNlX2FkZHJlc3MpOwotICByZXNwb25zZV9zdHJpbmdfID0gInNldF9kZXZpY2VfYWRkcmVzcyAiICsgYXJnc1swXTsKLSAgcmVzcG9uc2Vfc3RyaW5nXyArPSAiICI7Ci0gIHJlc3BvbnNlX3N0cmluZ18gKz0gYXJnc1sxXTsKLSAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci19Ci0KLXZvaWQgVGVzdENvbW1hbmRIYW5kbGVyOjpTZXRUaW1lclBlcmlvZChjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gIGlmIChhcmdzLnNpemUoKSAhPSAxKSB7Ci0gICAgTE9HX0lORk8oIlNldFRpbWVyUGVyaW9kIHRha2VzIDEgYXJndW1lbnQiKTsKLSAgfQotICBzaXplX3QgcGVyaW9kID0gc3RkOjpzdG9pKGFyZ3NbMF0pOwotICBpZiAocGVyaW9kICE9IDApIHsKLSAgICByZXNwb25zZV9zdHJpbmdfID0gInNldCB0aW1lciBwZXJpb2QgdG8gIjsKLSAgICByZXNwb25zZV9zdHJpbmdfICs9IGFyZ3NbMF07Ci0gICAgbW9kZWxfLlNldFRpbWVyUGVyaW9kKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMocGVyaW9kKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzcG9uc2Vfc3RyaW5nXyA9ICJpbnZhbGlkIHRpbWVyIHBlcmlvZCAiOwotICAgIHJlc3BvbnNlX3N0cmluZ18gKz0gYXJnc1swXTsKLSAgfQotICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6OlN0YXJ0VGltZXIoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPiAwKSB7Ci0gICAgTE9HX0lORk8oIlVudXNlZCBhcmdzOiBhcmdbMF0gPSAlcyIsIGFyZ3NbMF0uY19zdHIoKSk7Ci0gIH0KLSAgbW9kZWxfLlN0YXJ0VGltZXIoKTsKLSAgcmVzcG9uc2Vfc3RyaW5nXyA9ICJ0aW1lciBzdGFydGVkIjsKLSAgc2VuZF9yZXNwb25zZV8ocmVzcG9uc2Vfc3RyaW5nXyk7Ci19Ci0KLXZvaWQgVGVzdENvbW1hbmRIYW5kbGVyOjpTdG9wVGltZXIoY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPiAwKSB7Ci0gICAgTE9HX0lORk8oIlVudXNlZCBhcmdzOiBhcmdbMF0gPSAlcyIsIGFyZ3NbMF0uY19zdHIoKSk7Ci0gIH0KLSAgbW9kZWxfLlN0b3BUaW1lcigpOwotICByZXNwb25zZV9zdHJpbmdfID0gInRpbWVyIHN0b3BwZWQiOwotICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLX0KLQotdm9pZCBUZXN0Q29tbWFuZEhhbmRsZXI6OlJlc2V0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewotICBpZiAoYXJncy5zaXplKCkgPiAwKSB7Ci0gICAgTE9HX0lORk8oIlVudXNlZCBhcmdzOiBhcmdbMF0gPSAlcyIsIGFyZ3NbMF0uY19zdHIoKSk7Ci0gIH0KLSAgbW9kZWxfLlJlc2V0KCk7Ci0gIHJlc3BvbnNlX3N0cmluZ18gPSAibW9kZWwgcmVzZXQiOwotICBzZW5kX3Jlc3BvbnNlXyhyZXNwb25zZV9zdHJpbmdfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3Rlc3RfY29tbWFuZF9oYW5kbGVyLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9jb21tYW5kX2hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5Y2EwYy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9jb21tYW5kX2hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvZGV2aWNlLmgiCi0jaW5jbHVkZSAicGh5X2xheWVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJ0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidGVzdF9tb2RlbC5oIgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgVGVzdENvbW1hbmRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFNldHMgYWxsIG9mIHRoZSBtZXRob2RzIHRvIGJlIHVzZWQgYXMgY2FsbGJhY2tzIGluIHRoZSBIY2lIYW5kbGVyLgotICBUZXN0Q29tbWFuZEhhbmRsZXIoVGVzdE1vZGVsJiB0ZXN0X21vZGVsKTsKLQotICB+VGVzdENvbW1hbmRIYW5kbGVyKCkgPSBkZWZhdWx0OwotCi0gIC8vIERpc3BhdGNoZXMgdGhlIGFjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSB8bmFtZXwuCi0gIHZvaWQgSGFuZGxlQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLQotICAvLyBEaXNwYXRjaGVzIHRoZSBhY3Rpb24gZnJvbSBhIGZpbGUKLSAgdm9pZCBGcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKTsKLQotICAvLyBEaXNwYXRjaGVzIHRoZSBhY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgY29tbWFuZCBzcGVjaWZpZWQgYnkgfG5hbWV8LgotICB2b2lkIFJlZ2lzdGVyU2VuZFJlc3BvbnNlKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiBjYWxsYmFjayk7Ci0KLSAgLy8gQ29tbWFuZHM6Ci0KLSAgLy8gQWRkIGEgZGV2aWNlCi0gIHZvaWQgQWRkKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7Ci0KLSAgLy8gQWRkIGEgcmVtb3RlIGRldmljZQotICB2b2lkIEFkZFJlbW90ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIC8vIFJlbW92ZSBkZXZpY2VzIGJ5IGluZGV4Ci0gIHZvaWQgRGVsKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7Ci0KLSAgLy8gQWRkIHBoeQotICB2b2lkIEFkZFBoeShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIC8vIFJlbW92ZSBwaHkgYnkgbmFtZQotICB2b2lkIERlbFBoeShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIC8vIEFkZCBkZXZpY2UgdG8gcGh5Ci0gIHZvaWQgQWRkRGV2aWNlVG9QaHkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLQotICAvLyBSZW1vdmUgZGV2aWNlIGZyb20gcGh5Ci0gIHZvaWQgRGVsRGV2aWNlRnJvbVBoeShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIC8vIExpc3QgdGhlIGRldmljZXMgdGhhdCB0aGUgdGVzdCBrbm93cyBhYm91dAotICB2b2lkIExpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLQotICAvLyBDaGFuZ2UgdGhlIGRldmljZSdzIE1BQyBhZGRyZXNzCi0gIHZvaWQgU2V0RGV2aWNlQWRkcmVzcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIC8vIFRpbWVyIG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0gIHZvaWQgU2V0VGltZXJQZXJpb2QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLQotICB2b2lkIFN0YXJ0VGltZXIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLQotICB2b2lkIFN0b3BUaW1lcihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwotCi0gIHZvaWQgUmVzZXQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLQotICAvLyBGb3IgbWFudWFsIHRlc3RpbmcKLSAgdm9pZCBBZGREZWZhdWx0cygpOwotCi0gcHJpdmF0ZToKLSAgVGVzdE1vZGVsJiBtb2RlbF87Ci0KLSAgc3RkOjpzdHJpbmcgcmVzcG9uc2Vfc3RyaW5nXzsKLQotICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mKT4+IGFjdGl2ZV9jb21tYW5kc187Ci0KLSAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJik+IHNlbmRfcmVzcG9uc2VfOwotCi0gIFRlc3RDb21tYW5kSGFuZGxlcihjb25zdCBUZXN0Q29tbWFuZEhhbmRsZXImIGNtZFBja3QpID0gZGVsZXRlOwotICBUZXN0Q29tbWFuZEhhbmRsZXImIG9wZXJhdG9yPShjb25zdCBUZXN0Q29tbWFuZEhhbmRsZXImIGNtZFBja3QpID0gZGVsZXRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL21vZGVsL3NldHVwL3Rlc3RfbW9kZWwuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9tb2RlbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjYzEwMy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9tb2RlbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGVzdF9tb2RlbC5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3Igc2l6ZV90Ci0KLSNpbmNsdWRlIDxpb21hbmlwPiAgICAgIC8vIGZvciBvcGVyYXRvcjw8LCBzZXRmaWxsCi0jaW5jbHVkZSA8aW9zdHJlYW0+ICAgICAvLyBmb3IgYmFzaWNfb3N0cmVhbQotI2luY2x1ZGUgPG1lbW9yeT4gICAgICAgLy8gZm9yIHNoYXJlZF9wdHIsIG1ha2UuLi4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gIC8vIGZvciByZW1vdmVfZXh0ZW50X3QKLSNpbmNsdWRlIDx1dGlsaXR5PiAgICAgIC8vIGZvciBtb3ZlCi0KLSNpbmNsdWRlICJpbmNsdWRlL3BoeS5oIgotI2luY2x1ZGUgImluY2x1ZGUvcGh5LmgiICAvLyBmb3IgUGh5LCBQaHk6OlR5cGUKLSNpbmNsdWRlICJtb2RlbC9kZXZpY2VzL2hjaV9zb2NrZXRfZGV2aWNlLmgiCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9saW5rX2xheWVyX3NvY2tldF9kZXZpY2UuaCIKLSNpbmNsdWRlICJvcy9sb2cuaCIKLS8vIFRPRE86IFJlbW92ZSB3aGVuIHJlZ2lzdHJhdGlvbiB3b3JrcwotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvYmVhY29uLmgiICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQmVhY29uCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9iZWFjb25fc3dhcm0uaCIgICAgICAgICAgICAgIC8vIGZvciBCZWFjb25Td2FybQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvY2FyX2tpdC5oIiAgICAgICAgICAgICAgICAgICAvLyBmb3IgQ2FyS2l0Ci0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9jbGFzc2ljLmgiICAgICAgICAgICAgICAgICAgIC8vIGZvciBDbGFzc2ljCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9oY2lfc29ja2V0X2RldmljZS5oIiAgICAgICAgIC8vIGZvciBIY2lTb2NrZXREZXZpY2UKLSNpbmNsdWRlICJtb2RlbC9kZXZpY2VzL2tleWJvYXJkLmgiICAgICAgICAgICAgICAgICAgLy8gZm9yIEtleWJvYXJkCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9saW5rX2xheWVyX3NvY2tldF9kZXZpY2UuaCIgIC8vIGZvciBMaW5rTGF5ZXJTb2NrZXRELi4uCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9yZW1vdGVfbG9vcGJhY2tfZGV2aWNlLmgiICAgIC8vIGZvciBSZW1vdGVMb29wYmFja0RlLi4uCi0jaW5jbHVkZSAibW9kZWwvZGV2aWNlcy9zY3JpcHRlZF9iZWFjb24uaCIgICAgICAgICAgIC8vIGZvciBTY3JpcHRlZEJlYWNvbgotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvc25pZmZlci5oIiAgICAgICAgICAgICAgICAgICAvLyBmb3IgU25pZmZlcgotI2luY2x1ZGUgIm1vZGVsL3NldHVwL3BoeV9sYXllcl9mYWN0b3J5LmgiICAgICAgICAgICAvLyBmb3IgUGh5TGF5ZXJGYWN0b3J5Ci0jaW5jbHVkZSAibW9kZWwvc2V0dXAvdGVzdF9jaGFubmVsX3RyYW5zcG9ydC5oIiAgICAgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIiAgICAgICAgICAgICAgICAgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0jaW5jbHVkZSAib3MvbG9nLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBMT0dfV0FSTiwgTE9HX0lORk8KLSNpbmNsdWRlICJwYWNrZXRzL2xpbmtfbGF5ZXJfcGFja2V0cy5oIiAgICAgICAgICAgICAgLy8gZm9yIExpbmtMYXllclBhY2tldFZpZXcKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci1jbGFzcyBEZXZpY2U7Ci0KLVRlc3RNb2RlbDo6VGVzdE1vZGVsKAotICAgIHN0ZDo6ZnVuY3Rpb248QXN5bmNVc2VySWQoKT4gZ2V0X3VzZXJfaWQsCi0gICAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChBc3luY1VzZXJJZCwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhc2tDYWxsYmFjayYpPgotICAgICAgICBldmVudF9zY2hlZHVsZXIsCi0KLSAgICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVGFza0lkKEFzeW5jVXNlcklkLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywgY29uc3QgVGFza0NhbGxiYWNrJik+Ci0gICAgICAgIHBlcmlvZGljX2V2ZW50X3NjaGVkdWxlciwKLQotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChBc3luY1VzZXJJZCk+IGNhbmNlbF90YXNrc19mcm9tX3VzZXIsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKEFzeW5jVGFza0lkKT4gY2FuY2VsLAotICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+KGNvbnN0IHN0ZDo6c3RyaW5nJiwgaW50KT4KLSAgICAgICAgY29ubmVjdF90b19yZW1vdGUpCi0gICAgOiBnZXRfdXNlcl9pZF8oc3RkOjptb3ZlKGdldF91c2VyX2lkKSksCi0gICAgICBzY2hlZHVsZV90YXNrXyhzdGQ6Om1vdmUoZXZlbnRfc2NoZWR1bGVyKSksCi0gICAgICBzY2hlZHVsZV9wZXJpb2RpY190YXNrXyhzdGQ6Om1vdmUocGVyaW9kaWNfZXZlbnRfc2NoZWR1bGVyKSksCi0gICAgICBjYW5jZWxfdGFza18oc3RkOjptb3ZlKGNhbmNlbCkpLAotICAgICAgY2FuY2VsX3Rhc2tzX2Zyb21fdXNlcl8oc3RkOjptb3ZlKGNhbmNlbF90YXNrc19mcm9tX3VzZXIpKSwKLSAgICAgIGNvbm5lY3RfdG9fcmVtb3RlXyhzdGQ6Om1vdmUoY29ubmVjdF90b19yZW1vdGUpKSB7Ci0gIG1vZGVsX3VzZXJfaWRfID0gZ2V0X3VzZXJfaWRfKCk7Ci0gIC8vIFRPRE86IFJlbW92ZSB3aGVuIHJlZ2lzdHJhdGlvbiB3b3JrcyEKLSAgZXhhbXBsZV9kZXZpY2VzXy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxCZWFjb24+KCkpOwotICBleGFtcGxlX2RldmljZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPEJlYWNvblN3YXJtPigpKTsKLSAgZXhhbXBsZV9kZXZpY2VzXy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxLZXlib2FyZD4oKSk7Ci0gIGV4YW1wbGVfZGV2aWNlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8Q2FyS2l0PigpKTsKLSAgZXhhbXBsZV9kZXZpY2VzXy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDbGFzc2ljPigpKTsKLSAgZXhhbXBsZV9kZXZpY2VzXy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxTbmlmZmVyPigpKTsKLSAgZXhhbXBsZV9kZXZpY2VzXy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxTY3JpcHRlZEJlYWNvbj4oKSk7Ci0gIGV4YW1wbGVfZGV2aWNlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8UmVtb3RlTG9vcGJhY2tEZXZpY2U+KCkpOwotfQotCi12b2lkIFRlc3RNb2RlbDo6U2V0VGltZXJQZXJpb2Qoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBuZXdfcGVyaW9kKSB7Ci0gIHRpbWVyX3BlcmlvZF8gPSBuZXdfcGVyaW9kOwotCi0gIGlmICh0aW1lcl90aWNrX3Rhc2tfID09IGtJbnZhbGlkVGFza0lkKSByZXR1cm47Ci0KLSAgLy8gUmVzdGFydCB0aGUgdGltZXIgd2l0aCB0aGUgbmV3IHBlcmlvZAotICBTdG9wVGltZXIoKTsKLSAgU3RhcnRUaW1lcigpOwotfQotCi12b2lkIFRlc3RNb2RlbDo6U3RhcnRUaW1lcigpIHsKLSAgTE9HX0lORk8oIlN0YXJ0VGltZXIoKSIpOwotICB0aW1lcl90aWNrX3Rhc2tfID0gc2NoZWR1bGVfcGVyaW9kaWNfdGFza18oCi0gICAgICBtb2RlbF91c2VyX2lkXywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSwgdGltZXJfcGVyaW9kXywKLSAgICAgIFt0aGlzXSgpIHsgVGVzdE1vZGVsOjpUaW1lclRpY2soKTsgfSk7Ci19Ci0KLXZvaWQgVGVzdE1vZGVsOjpTdG9wVGltZXIoKSB7Ci0gIExPR19JTkZPKCJTdG9wVGltZXIoKSIpOwotICBjYW5jZWxfdGFza18odGltZXJfdGlja190YXNrXyk7Ci0gIHRpbWVyX3RpY2tfdGFza18gPSBrSW52YWxpZFRhc2tJZDsKLX0KLQotc2l6ZV90IFRlc3RNb2RlbDo6QWRkKHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IG5ld19kZXYpIHsKLSAgZGV2aWNlc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXdfZGV2KSk7Ci0gIHJldHVybiBkZXZpY2VzXy5zaXplKCkgLSAxOwotfQotCi12b2lkIFRlc3RNb2RlbDo6RGVsKHNpemVfdCBkZXZfaW5kZXgpIHsKLSAgaWYgKGRldl9pbmRleCA+PSBkZXZpY2VzXy5zaXplKCkgfHwgZGV2aWNlc19bZGV2X2luZGV4XSA9PSBudWxscHRyKSB7Ci0gICAgTE9HX1dBUk4oIlVua25vd24gZGV2aWNlICV6dSIsIGRldl9pbmRleCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNjaGVkdWxlX3Rhc2tfKG1vZGVsX3VzZXJfaWRfLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDApLAotICAgICAgICAgICAgICAgICBbdGhpcywgZGV2X2luZGV4XSgpIHsKLSAgICAgICAgICAgICAgICAgICBkZXZpY2VzX1tkZXZfaW5kZXhdLT5VbnJlZ2lzdGVyUGh5TGF5ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgZGV2aWNlc19bZGV2X2luZGV4XSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgIH0pOwotfQotCi1zaXplX3QgVGVzdE1vZGVsOjpBZGRQaHkoUGh5OjpUeXBlIHBoeV90eXBlKSB7Ci0gIHNpemVfdCBmYWN0b3J5X2lkID0gcGh5c18uc2l6ZSgpOwotICBwaHlzXy5lbXBsYWNlX2JhY2socGh5X3R5cGUsIGZhY3RvcnlfaWQpOwotICByZXR1cm4gZmFjdG9yeV9pZDsKLX0KLQotdm9pZCBUZXN0TW9kZWw6OkRlbFBoeShzaXplX3QgcGh5X2luZGV4KSB7Ci0gIGlmIChwaHlfaW5kZXggPj0gcGh5c18uc2l6ZSgpKSB7Ci0gICAgTE9HX1dBUk4oIlVua25vd24gcGh5IGF0IGluZGV4ICV6dSIsIHBoeV9pbmRleCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNjaGVkdWxlX3Rhc2tfKAotICAgICAgbW9kZWxfdXNlcl9pZF8sIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksCi0gICAgICBbdGhpcywgcGh5X2luZGV4XSgpIHsgcGh5c19bcGh5X2luZGV4XS5VbnJlZ2lzdGVyQWxsUGh5TGF5ZXJzKCk7IH0pOwotfQotCi12b2lkIFRlc3RNb2RlbDo6QWRkRGV2aWNlVG9QaHkoc2l6ZV90IGRldl9pbmRleCwgc2l6ZV90IHBoeV9pbmRleCkgewotICBpZiAoZGV2X2luZGV4ID49IGRldmljZXNfLnNpemUoKSB8fCBkZXZpY2VzX1tkZXZfaW5kZXhdID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5rbm93biBkZXZpY2UgJXp1IiwgZGV2X2luZGV4KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBoeV9pbmRleCA+PSBwaHlzXy5zaXplKCkpIHsKLSAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBwaHkgJXp1IiwgcGh5X2luZGV4KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXV0byBkZXYgPSBkZXZpY2VzX1tkZXZfaW5kZXhdOwotICBkZXYtPlJlZ2lzdGVyUGh5TGF5ZXIocGh5c19bcGh5X2luZGV4XS5HZXRQaHlMYXllcigKLSAgICAgIFtkZXZdKG1vZGVsOjpwYWNrZXRzOjpMaW5rTGF5ZXJQYWNrZXRWaWV3IHBhY2tldCkgewotICAgICAgICBkZXYtPkluY29taW5nUGFja2V0KHN0ZDo6bW92ZShwYWNrZXQpKTsKLSAgICAgIH0sCi0gICAgICBkZXZfaW5kZXgpKTsKLX0KLQotdm9pZCBUZXN0TW9kZWw6OkRlbERldmljZUZyb21QaHkoc2l6ZV90IGRldl9pbmRleCwgc2l6ZV90IHBoeV9pbmRleCkgewotICBpZiAoZGV2X2luZGV4ID49IGRldmljZXNfLnNpemUoKSB8fCBkZXZpY2VzX1tkZXZfaW5kZXhdID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiVW5rbm93biBkZXZpY2UgJXp1IiwgZGV2X2luZGV4KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBoeV9pbmRleCA+PSBwaHlzXy5zaXplKCkpIHsKLSAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBwaHkgJXp1IiwgcGh5X2luZGV4KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2NoZWR1bGVfdGFza18obW9kZWxfdXNlcl9pZF8sIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgIFt0aGlzLCBkZXZfaW5kZXgsIHBoeV9pbmRleF0oKSB7Ci0gICAgICAgICAgICAgICAgICAgZGV2aWNlc19bZGV2X2luZGV4XS0+VW5yZWdpc3RlclBoeUxheWVyKAotICAgICAgICAgICAgICAgICAgICAgICBwaHlzX1twaHlfaW5kZXhdLkdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5c19bcGh5X2luZGV4XS5HZXRGYWN0b3J5SWQoKSk7Ci0gICAgICAgICAgICAgICAgIH0pOwotfQotCi12b2lkIFRlc3RNb2RlbDo6QWRkTGlua0xheWVyQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5OjpUeXBlIHBoeV90eXBlKSB7Ci0gIExPR19JTkZPKCJBZGRpbmcgYSBuZXcgbGluayBsYXllciBjb25uZWN0aW9uIG9mIHR5cGU6ICVzIiwKLSAgICAgICAgICAgcGh5X3R5cGUgPT0gUGh5OjpUeXBlOjpCUl9FRFIgPyAiQlJfRURSIiA6ICJMT1dfRU5FUkdZIik7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IGRldiA9IExpbmtMYXllclNvY2tldERldmljZTo6Q3JlYXRlKHNvY2tldCwgcGh5X3R5cGUpOwotCi0gIGludCBpbmRleCA9IEFkZChkZXYpOwotICBBc3luY1VzZXJJZCB1c2VyX2lkID0gZ2V0X3VzZXJfaWRfKCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzXy5zaXplKCk7IGkrKykgewotICAgIGlmIChwaHlfdHlwZSA9PSBwaHlzX1tpXS5HZXRUeXBlKCkpIHsKLSAgICAgIEFkZERldmljZVRvUGh5KGluZGV4LCBpKTsKLSAgICB9Ci0gIH0KLQotICBkZXYtPlJlZ2lzdGVyQ2xvc2VDYWxsYmFjayhbdGhpcywgc29ja2V0LCBpbmRleCwgdXNlcl9pZF0gewotICAgIHNjaGVkdWxlX3Rhc2tfKHVzZXJfaWQsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgW3RoaXMsIHNvY2tldCwgaW5kZXgsIHVzZXJfaWRdKCkgewotICAgICAgICAgICAgICAgICAgICAgT25Db25uZWN0aW9uQ2xvc2VkKHNvY2tldCwgaW5kZXgsIHVzZXJfaWQpOwotICAgICAgICAgICAgICAgICAgIH0pOwotICB9KTsKLQotfQotCi12b2lkIFRlc3RNb2RlbDo6SW5jb21pbmdMaW5rTGF5ZXJDb25uZWN0aW9uKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQpIHsKLSAgTE9HX0lORk8oIkEgbmV3IGxpbmsgbGF5ZXIgY29ubmVjdGlvbiBoYXMgYXJyaXZlZC4iKTsKLSAgQWRkTGlua0xheWVyQ29ubmVjdGlvbihzb2NrZXQsIFBoeTo6VHlwZTo6QlJfRURSKTsKLX0KLQotdm9pZCBUZXN0TW9kZWw6OkluY29taW5nTGlua0JsZUxheWVyQ29ubmVjdGlvbigKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0KSB7Ci0gIExPR19JTkZPKCJBIG5ldyBsb3cgZW5lcmdlcnkgbGluayBsYXllciAoQkxFKSBjb25uZWN0aW9uIGhhcyBhcnJpdmVkLiIpOwotICBBZGRMaW5rTGF5ZXJDb25uZWN0aW9uKHNvY2tldCwgUGh5OjpUeXBlOjpMT1dfRU5FUkdZKTsKLX0KLQotdm9pZCBUZXN0TW9kZWw6OkFkZFJlbW90ZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmVyLCBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5OjpUeXBlIHBoeV90eXBlKSB7Ci0gIExPR19JTkZPKCJDb25uZWN0aW5nIHRvICVzOiVkIiwgc2VydmVyLmNfc3RyKCksIHBvcnQpOwotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0ID0gY29ubmVjdF90b19yZW1vdGVfKHNlcnZlciwgcG9ydCk7Ci0gIGlmICghc29ja2V0LT5Db25uZWN0ZWQoKSkgewotICAgIHJldHVybjsKLSAgfQotICBBZGRMaW5rTGF5ZXJDb25uZWN0aW9uKHNvY2tldCwgcGh5X3R5cGUpOwotfQotCi12b2lkIFRlc3RNb2RlbDo6SW5jb21pbmdIY2lDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByb3BlcnRpZXNfZmlsZW5hbWUpIHsKLSAgYXV0byBkZXYgPSBIY2lTb2NrZXREZXZpY2U6OkNyZWF0ZShzb2NrZXQsIHByb3BlcnRpZXNfZmlsZW5hbWUpOwotICBzaXplX3QgaW5kZXggPSBBZGQoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PERldmljZT4oZGV2KSk7Ci0gIHN0ZDo6c3RyaW5nIGFkZHIgPSAiZGE6NGM6MTA6ZGU6MTc6IjsgIC8vIERhIEhDSSBkZXYKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICBzdHJlYW0gPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6aGV4IDw8IChpbmRleCAlIDI1Nik7Ci0gIGFkZHIgKz0gc3RyZWFtLnN0cigpOwotCi0gIGRldi0+SW5pdGlhbGl6ZSh7Iklnbm9yZWRUeXBlTmFtZSIsIGFkZHJ9KTsKLSAgTE9HX0lORk8oImluaXRpYWxpemVkICVzIiwgYWRkci5jX3N0cigpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzXy5zaXplKCk7IGkrKykgewotICAgIEFkZERldmljZVRvUGh5KGluZGV4LCBpKTsKLSAgfQotICBBc3luY1VzZXJJZCB1c2VyX2lkID0gZ2V0X3VzZXJfaWRfKCk7Ci0gIGRldi0+UmVnaXN0ZXJUYXNrU2NoZWR1bGVyKFt1c2VyX2lkLCB0aGlzXShzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0NhbGxiYWNrIHRhc2tfY2FsbGJhY2spIHsKLSAgICByZXR1cm4gc2NoZWR1bGVfdGFza18odXNlcl9pZCwgZGVsYXksIHN0ZDo6bW92ZSh0YXNrX2NhbGxiYWNrKSk7Ci0gIH0pOwotICBkZXYtPlJlZ2lzdGVyVGFza0NhbmNlbChjYW5jZWxfdGFza18pOwotICBkZXYtPlJlZ2lzdGVyQ2xvc2VDYWxsYmFjayhbdGhpcywgc29ja2V0LCBpbmRleCwgdXNlcl9pZF0gewotICAgIHNjaGVkdWxlX3Rhc2tfKHVzZXJfaWQsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksCi0gICAgICAgICAgICAgICAgICAgW3RoaXMsIHNvY2tldCwgaW5kZXgsIHVzZXJfaWRdKCkgewotICAgICAgICAgICAgICAgICAgICAgT25Db25uZWN0aW9uQ2xvc2VkKHNvY2tldCwgaW5kZXgsIHVzZXJfaWQpOwotICAgICAgICAgICAgICAgICAgIH0pOwotICB9KTsKLX0KLQotdm9pZCBUZXN0TW9kZWw6Ok9uQ29ubmVjdGlvbkNsb3NlZChzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5kZXgsIEFzeW5jVXNlcklkIHVzZXJfaWQpIHsKLSAgaWYgKGluZGV4ID49IGRldmljZXNfLnNpemUoKSB8fCBkZXZpY2VzX1tpbmRleF0gPT0gbnVsbHB0cikgewotICAgIExPR19XQVJOKCJVbmtub3duIGRldmljZSAlenUiLCBpbmRleCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNvY2tldC0+Q2xvc2UoKTsKLQotICBjYW5jZWxfdGFza3NfZnJvbV91c2VyXyh1c2VyX2lkKTsKLSAgZGV2aWNlc19baW5kZXhdLT5VbnJlZ2lzdGVyUGh5TGF5ZXJzKCk7Ci0gIGRldmljZXNfW2luZGV4XSA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgVGVzdE1vZGVsOjpTZXREZXZpY2VBZGRyZXNzKHNpemVfdCBpbmRleCwgQWRkcmVzcyBhZGRyZXNzKSB7Ci0gIGlmIChpbmRleCA+PSBkZXZpY2VzXy5zaXplKCkgfHwgZGV2aWNlc19baW5kZXhdID09IG51bGxwdHIpIHsKLSAgICBMT0dfV0FSTigiQ2FuJ3QgZmluZCBkZXZpY2UgJXp1IiwgaW5kZXgpOwotICAgIHJldHVybjsKLSAgfQotICBkZXZpY2VzX1tpbmRleF0tPlNldEFkZHJlc3Moc3RkOjptb3ZlKGFkZHJlc3MpKTsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcmIFRlc3RNb2RlbDo6TGlzdCgpIHsKLSAgbGlzdF9zdHJpbmdfID0gIiI7Ci0gIGxpc3Rfc3RyaW5nXyArPSAiIERldmljZXM6IFxyXG4iOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgbGlzdF9zdHJpbmdfICs9ICIgICIgKyBzdGQ6OnRvX3N0cmluZyhpKSArICI6IjsKLSAgICBpZiAoZGV2aWNlc19baV0gPT0gbnVsbHB0cikgewotICAgICAgbGlzdF9zdHJpbmdfICs9ICIgZGVsZXRlZCBcclxuIjsKLSAgICB9IGVsc2UgewotICAgICAgbGlzdF9zdHJpbmdfICs9IGRldmljZXNfW2ldLT5Ub1N0cmluZygpICsgIiBcclxuIjsKLSAgICB9Ci0gIH0KLSAgbGlzdF9zdHJpbmdfICs9ICIgUGh5czogXHJcbiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c18uc2l6ZSgpOyBpKyspIHsKLSAgICBsaXN0X3N0cmluZ18gKz0gIiAgIiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIjoiOwotICAgIGxpc3Rfc3RyaW5nXyArPSBwaHlzX1tpXS5Ub1N0cmluZygpICsgIiBcclxuIjsKLSAgfQotICByZXR1cm4gbGlzdF9zdHJpbmdfOwotfQotCi12b2lkIFRlc3RNb2RlbDo6VGltZXJUaWNrKCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKGRldmljZXNfW2ldICE9IG51bGxwdHIpIHsKLSAgICAgIGRldmljZXNfW2ldLT5UaW1lclRpY2soKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUZXN0TW9kZWw6OlJlc2V0KCkgewotICBTdG9wVGltZXIoKTsKLSAgc2NoZWR1bGVfdGFza18obW9kZWxfdXNlcl9pZF8sIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksIFt0aGlzXSgpIHsKLSAgICBMT0dfSU5GTygiUnVubmluZyBSZXNldCB0YXNrIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzXy5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGRldmljZXNfW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGV2aWNlc19baV0tPlVucmVnaXN0ZXJQaHlMYXllcnMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZGV2aWNlc18uY2xlYXIoKTsKLSAgfSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC90ZXN0X21vZGVsLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbW9kZWwvc2V0dXAvdGVzdF9tb2RlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU2OGJiLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9tb2RlbC9zZXR1cC90ZXN0X21vZGVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBzaXplX3QKLQotI2luY2x1ZGUgPGNocm9ubz4gICAgICAvLyBmb3IgbWlsbGlzZWNvbmRzCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4gIC8vIGZvciBmdW5jdGlvbgotI2luY2x1ZGUgPG1lbW9yeT4gICAgICAvLyBmb3Igc2hhcmVkX3B0cgotI2luY2x1ZGUgPHN0cmluZz4gICAgICAvLyBmb3Igc3RyaW5nCi0jaW5jbHVkZSA8dmVjdG9yPiAgICAgIC8vIGZvciB2ZWN0b3IKLQotI2luY2x1ZGUgImhjaS9hZGRyZXNzLmgiICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQWRkcmVzcwotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvZGV2aWNlX3Byb3BlcnRpZXMuaCIgICAvLyBmb3IgQWRkcmVzcwotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaCIgICAgICAgICAvLyBmb3IgQXN5bmNVc2VySWQsIEFzeW5jVGFza0lkCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIiAgICAgICAgICAgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0jaW5jbHVkZSAibmV0L2FzeW5jX2RhdGFfY2hhbm5lbF9jb25uZWN0b3IuaCIgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsQ29ubmVjdG9yCi0jaW5jbHVkZSAicGh5LmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBQaHksIFBoeTo6VHlwZQotI2luY2x1ZGUgInBoeV9sYXllcl9mYWN0b3J5LmgiICAgICAgICAgICAgICAgICAvLyBmb3IgUGh5TGF5ZXJGYWN0b3J5Ci0jaW5jbHVkZSAidGVzdF9jaGFubmVsX3RyYW5zcG9ydC5oIiAgICAgICAgICAgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsCi0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotY2xhc3MgRGV2aWNlOwotCi11c2luZyBhbmRyb2lkOjpuZXQ6OkFzeW5jRGF0YUNoYW5uZWw7Ci11c2luZyBhbmRyb2lkOjpuZXQ6OkFzeW5jRGF0YUNoYW5uZWxDb25uZWN0b3I7Ci0KLWNsYXNzIFRlc3RNb2RlbCB7Ci0gcHVibGljOgotICBUZXN0TW9kZWwoCi0gICAgICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVXNlcklkKCk+IGdldE5leHRVc2VySWQsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVGFza0lkKEFzeW5jVXNlcklkLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smKT4KLSAgICAgICAgICBldnRTY2hlZHVsZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVGFza0lkKEFzeW5jVXNlcklkLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLCBjb25zdCBUYXNrQ2FsbGJhY2smKT4KLSAgICAgICAgICBwZXJpb2RpY0V2dFNjaGVkdWxlciwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChBc3luY1VzZXJJZCk+IGNhbmNlbF91c2VyX3Rhc2tzLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEFzeW5jVGFza0lkKT4gY2FuY2VsLAotICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4oY29uc3Qgc3RkOjpzdHJpbmcmLCBpbnQpPgotICAgICAgICAgIGNvbm5lY3RfdG9fcmVtb3RlKTsKLSAgflRlc3RNb2RlbCgpID0gZGVmYXVsdDsKLQotICBUZXN0TW9kZWwoVGVzdE1vZGVsJiBtb2RlbCkgPSBkZWxldGU7Ci0gIFRlc3RNb2RlbCYgb3BlcmF0b3I9KGNvbnN0IFRlc3RNb2RlbCYgbW9kZWwpID0gZGVsZXRlOwotCi0gIC8vIENvbW1hbmRzOgotCi0gIC8vIEFkZCBhIGRldmljZSwgcmV0dXJuIGl0cyBpbmRleAotICBzaXplX3QgQWRkKHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+IGRldmljZSk7Ci0KLSAgLy8gUmVtb3ZlIGRldmljZXMgYnkgaW5kZXgKLSAgdm9pZCBEZWwoc2l6ZV90IGRldmljZV9pbmRleCk7Ci0KLSAgLy8gQWRkIHBoeSwgcmV0dXJuIGl0cyBpbmRleAotICBzaXplX3QgQWRkUGh5KFBoeTo6VHlwZSBwaHlfdHlwZSk7Ci0KLSAgLy8gUmVtb3ZlIHBoeSBieSBpbmRleAotICB2b2lkIERlbFBoeShzaXplX3QgcGh5X2luZGV4KTsKLQotICAvLyBBZGQgZGV2aWNlIHRvIHBoeQotICB2b2lkIEFkZERldmljZVRvUGh5KHNpemVfdCBkZXZpY2VfaW5kZXgsIHNpemVfdCBwaHlfaW5kZXgpOwotCi0gIC8vIFJlbW92ZSBkZXZpY2UgZnJvbSBwaHkKLSAgdm9pZCBEZWxEZXZpY2VGcm9tUGh5KHNpemVfdCBkZXZpY2VfaW5kZXgsIHNpemVfdCBwaHlfaW5kZXgpOwotCi0gIC8vIEhhbmRsZSBpbmNvbWluZyByZW1vdGUgY29ubmVjdGlvbnMKLSAgdm9pZCBBZGRMaW5rTGF5ZXJDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXRfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHk6OlR5cGUgcGh5X3R5cGUpOwotICB2b2lkIEluY29taW5nTGlua0xheWVyQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29ja2V0X2ZkKTsKLSAgdm9pZCBJbmNvbWluZ0xpbmtCbGVMYXllckNvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldF9mZCk7Ci0gIHZvaWQgSW5jb21pbmdIY2lDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrZXRfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByb3BlcnRpZXNfZmlsZW5hbWUgPSAiIik7Ci0KLSAgLy8gSGFuZGxlIGNsb3NlZCByZW1vdGUgY29ubmVjdGlvbnMgKGJvdGggaGNpICYgbGluayBsYXllcikKLSAgdm9pZCBPbkNvbm5lY3Rpb25DbG9zZWQoc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+IHNvY2tldF9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4LCBBc3luY1VzZXJJZCB1c2VyX2lkKTsKLQotICAvLyBDb25uZWN0IHRvIGEgcmVtb3RlIGRldmljZQotICB2b2lkIEFkZFJlbW90ZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmVyLCBpbnQgcG9ydCwgUGh5OjpUeXBlIHBoeV90eXBlKTsKLQotICAvLyBTZXQgdGhlIGRldmljZSdzIEJsdWV0b290aCBhZGRyZXNzCi0gIHZvaWQgU2V0RGV2aWNlQWRkcmVzcyhzaXplX3QgZGV2aWNlX2luZGV4LCBBZGRyZXNzIGRldmljZV9hZGRyZXNzKTsKLQotICAvLyBMZXQgZGV2aWNlcyBrbm93IGFib3V0IHRoZSBwYXNzYWdlIG9mIHRpbWUKLSAgdm9pZCBUaW1lclRpY2soKTsKLSAgdm9pZCBTdGFydFRpbWVyKCk7Ci0gIHZvaWQgU3RvcFRpbWVyKCk7Ci0gIHZvaWQgU2V0VGltZXJQZXJpb2Qoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBuZXdfcGVyaW9kKTsKLQotICAvLyBMaXN0IHRoZSBkZXZpY2VzIHRoYXQgdGhlIHRlc3Qga25vd3MgYWJvdXQKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIExpc3QoKTsKLQotICAvLyBDbGVhciBhbGwgZGV2aWNlcyBhbmQgcGh5cy4KLSAgdm9pZCBSZXNldCgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8UGh5TGF5ZXJGYWN0b3J5PiBwaHlzXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERldmljZT4+IGRldmljZXNfOwotICBzdGQ6OnN0cmluZyBsaXN0X3N0cmluZ187Ci0KLSAgLy8gQ2FsbGJhY2tzIHRvIHNjaGVkdWxlIHRhc2tzLgotICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVXNlcklkKCk+IGdldF91c2VyX2lkXzsKLSAgc3RkOjpmdW5jdGlvbjxBc3luY1Rhc2tJZChBc3luY1VzZXJJZCwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXNrQ2FsbGJhY2smKT4KLSAgICAgIHNjaGVkdWxlX3Rhc2tfOwotICBzdGQ6OmZ1bmN0aW9uPEFzeW5jVGFza0lkKEFzeW5jVXNlcklkLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMsIGNvbnN0IFRhc2tDYWxsYmFjayYpPgotICAgICAgc2NoZWR1bGVfcGVyaW9kaWNfdGFza187Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChBc3luY1Rhc2tJZCk+IGNhbmNlbF90YXNrXzsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKEFzeW5jVXNlcklkKT4gY2FuY2VsX3Rhc2tzX2Zyb21fdXNlcl87Ci0gIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+KGNvbnN0IHN0ZDo6c3RyaW5nJiwgaW50KT4KLSAgICAgIGNvbm5lY3RfdG9fcmVtb3RlXzsKLQotICBBc3luY1VzZXJJZCBtb2RlbF91c2VyX2lkXzsKLSAgQXN5bmNUYXNrSWQgdGltZXJfdGlja190YXNrX3trSW52YWxpZFRhc2tJZH07Ci0gIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZXJfcGVyaW9kX3t9OwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEZXZpY2U+PiBleGFtcGxlX2RldmljZXNfOwotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbENvbm5lY3Rvcj4gc29ja2V0X2Nvbm5lY3Rvcl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9hc3luY19kYXRhX2NoYW5uZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzNThlYS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L2FzeW5jX2RhdGFfY2hhbm5lbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI3ByYWdtYSBvbmNlCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSAibXN2Yy1wb3NpeC5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBuZXQgewotCi1jbGFzcyBBc3luY0RhdGFDaGFubmVsOwotCi0vLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBub3RpZnkgdGhhdCBuZXcgZGF0YQotLy8gY2FuIGJlIHJlYWQuCi11c2luZyBSZWFkQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQXN5bmNEYXRhQ2hhbm5lbCopPjsKLQotLy8gQSBjb25uZWN0ZWQgYXN5bmNocm9ub3VzIHNvY2tldCBhYnN0cmFjdGlvbi4KLS8vCi0vLyBUaGlzIGlzIHJlYWxseSBhIHNpbXBsZSBkYXRhIGNoYW5uZWwgdGhhdCBjYW4gYmUgdXNlZCB0byByZWFkIGFuZCB3cml0ZQotLy8gZGF0YS4gQXN5bmMgU29ja2V0cyBhcmUgdXN1YWxseSBub24tYmxvY2tpbmcgcG9zaXgvd2luIHNvY2tldHMsIGJ1dCBjb3VsZCBiZQotLy8gb3RoZXIgdHlwZXMgb2YgZGF0YWNoYW5uZWxzIChnUlBDLCBxZW11IHBpcGUpCi1jbGFzcyBBc3luY0RhdGFDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkFzeW5jRGF0YUNoYW5uZWwoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gUmVjZWl2ZSBkYXRhIGluIHRoZSBnaXZlbiBidWZmZXIuIFByb3Blcmx5IGhhbmRsaW5nIEVJTlRSIHdoZXJlCi0gIC8vIGFwcGxpY2FibGUuCi0gIC8vCi0gIC8vIFJldHVybnM6Ci0gIC8vIC0gPjA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgLy8gLSAgMDogVGhlIHNvY2tldCBpcyBjbG9zZWQsIG5vIGZ1cnRoZXIgcmVhZHMvd3JpdGUgYXJlIHBvc3NpYmxlCi0gIC8vIC0gPDA6IEFuIGVycm9yIG9jY3VycmVkLiBEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiBlcnJubzoKLSAgLy8gICAgLSAgRUFHQUlOOiBObyBkYXRhLCB0cnkgYWdhaW4gbGF0ZXIuCi0gIC8vCi0gIC8vIEltcGxlbWVudG9ycyBzaG91bGQgdGFrZSBjYXJlIG9mIHRyYW5zbGF0aW5nIEVXT1VMREJMT0NLIGludG8gRUFHQUlOCi0gIC8vIGlmIG5lZWRlZC4KLSAgdmlydHVhbCBzc2l6ZV90IFJlY3YodWludDhfdCogYnVmZmVyLCB1aW50NjRfdCBidWZmZXJTaXplKSA9IDA7Ci0KLSAgLy8gU2VuZCBkYXRhIGluIHRoZSBnaXZlbiBidWZmZXIuIFByb3Blcmx5IGhhbmRsaW5nIEVJTlRSLCBFUElQRSB3aGVyZQotICAvLyBhcHBsaWNhYmxlLgotICAvLwotICAvLyBSZXR1cm5zOgotICAvLyAtID4wOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHRoaXMgY2FuIGJlIDwgYnVmZmVyU2l6ZS4KLSAgLy8gLSA8MDogQW4gZXJyb3Igb2NjdXJyZWQuIERldGFpbHMgY2FuIGJlIGZvdW5kIGluIGVycm5vOgotICAvLyAgICAtIEVBR0FJTjogVGhlIHdyaXRlIHdvdWxkIGJsb2NrLCB0cnkgYWdhaW4gbGF0ZXIuCi0gIC8vICAgIC0gRUJBREY6IFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAgLy8KLSAgLy8gSW1wbGVtZW50b3JzIHNob3VsZCB0YWtlIGNhcmUgb2YgdHJhbnNsYXRpbmcgRVdPVUxEQkxPQ0sgaW50byBFQUdBSU4KLSAgLy8gaWYgbmVlZGVkLgotICB2aXJ0dWFsIHNzaXplX3QgU2VuZChjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpID0gMDsKLQotICAvLyBUcnVlIGlmIHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZAotICB2aXJ0dWFsIGJvb2wgQ29ubmVjdGVkKCkgPSAwOwotCi0gIC8vIENsb3NlcyB0aGlzIHNvY2tldC4gVXBvbiByZXR1cm4gdGhlIGZvbGxvd2luZyB3aWxsIGhvbGQ6Ci0gIC8vCi0gIC8vIC0gTm8gbW9yZSBSZWFkQ2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZC4KLSAgLy8gLSBTZW5kL1JlY3YgY2FsbHMgd2lsbCByZXR1cm4gMC4KLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgPSAwOwotCi0gIC8vIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEgcmVjdiBjYWxsIGNhbiBiZSBtYWRlCi0gIC8vIHRvIHJlYWQgZGF0YSBmcm9tIHRoaXMgc29ja2V0LiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIGNhbGwgdG8gUmVjdiB3aWxsCi0gIC8vIG5vdCByZXR1cm4gRUFHQUlOLiBSZXR1cm5zIGZhbHNlIGlmIHJlZ2lzdHJhdGlvbiBvZiB0aGUgd2F0Y2hlciBmYWlsZWQuCi0gIC8vCi0gIC8vIE9ubHkgb25lIGNhbGxiYWNrIGNhbiBiZSByZWdpc3RlcmVkIHBlciBzb2NrZXQuCi0gIHZpcnR1YWwgYm9vbCBXYXRjaEZvck5vbkJsb2NraW5nUmVhZCgKLSAgICAgIGNvbnN0IFJlYWRDYWxsYmFjayYgb25fcmVhZF9yZWFkeV9jYWxsYmFjaykgPSAwOwotCi0gIC8vIFN0b3BzIHdhdGNoaW5nIHRoaXMgc29ja2V0LCB5b3Ugd2lsbCBub3QgcmVjZWl2ZSBhbnkgY2FsbGJhY2tzIGFueSBsb25nZXIuCi0gIHZpcnR1YWwgdm9pZCBTdG9wV2F0Y2hpbmcoKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbmV0Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9hc3luY19kYXRhX2NoYW5uZWxfY29ubmVjdG9yLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L2FzeW5jX2RhdGFfY2hhbm5lbF9jb25uZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwYWVlNC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L2FzeW5jX2RhdGFfY2hhbm5lbF9jb25uZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLQotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIm5ldC9hc3luY19kYXRhX2NoYW5uZWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG5ldCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKLQotLy8gQW4gQXN5bmNEYXRhQ2hhbm5lbENvbm5lY3RvciBpcyBjYXBhYmxlIG9mIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgc2VydmVyLgotY2xhc3MgQXN5bmNEYXRhQ2hhbm5lbENvbm5lY3RvciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Bc3luY0RhdGFDaGFubmVsQ29ubmVjdG9yKCkgPSBkZWZhdWx0OwotCi0gIC8vIEJsb2NrcyBhbmQgd2FpdHMgdW50aWwgYSBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgc2VydmVyIGhhcyBiZWVuCi0gIC8vIGVzdGFibGlzaGVkLCBvciBhIHRpbWVvdXQgaGFzIGJlZW4gcmVhY2hlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQKLSAgLy8gbm90IHJldHVybiBudWxscHRyLCBidXQgYSBEYXRhQ2hhbm5lbCBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgaW4gY2FzZSBvZgotICAvLyBmYWlsdXJlLgotICAvLwotICAvLyBJbiBjYXNlIG9mIGEgZGlzY29ubmVjdGVkIERhdGFDaGFubmVsIChzb2NrZXQtPkNvbm5lY3RlZCgpID09IGZhbHNlKQotICAvLyB0aGUgZXJybm8gdmFyaWFibGUgY2FuIGJlIHNldCB3aXRoIHRoZSBlbmNvdW50ZXJlZCBlcnJvci4KLSAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gQ29ubmVjdFRvUmVtb3RlU2VydmVyKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZlciwgaW50IHBvcnQsCi0gICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQgPSA1MDAwbXMpID0gMDsKLX07Ci19ICAvLyBuYW1lc3BhY2UgbmV0Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9hc3luY19kYXRhX2NoYW5uZWxfc2VydmVyLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L2FzeW5jX2RhdGFfY2hhbm5lbF9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4MjFlZS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L2FzeW5jX2RhdGFfY2hhbm5lbF9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJuZXQvYXN5bmNfZGF0YV9jaGFubmVsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBuZXQgewotCi1jbGFzcyBBc3luY0RhdGFDaGFubmVsU2VydmVyOwotCi0vLyBDYWxsYmFjayB0aGFzIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBjb25uZWN0aW9uIGhhcyBiZWVuIGFjY2VwdGVkLgotdXNpbmcgQ29ubmVjdENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0RhdGFDaGFubmVsU2VydmVyKiBzZXJ2ZXIpPjsKLQotLy8gQW4gQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciBpcyBjYXBhYmxlIG9mIGxpc3RlbmluZyB0byBpbmNvbWluZyBjb25uZWN0aW9ucy4KLS8vCi0vLyBBIENhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhIG5ldyBjb25uZWN0aW9uIGhhcyBiZWVuIGFjY2VwdGVkLgotY2xhc3MgQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciB7Ci0gcHVibGljOgotICAvLyBEZXN0cnVjdG9yLgotICB2aXJ0dWFsIH5Bc3luY0RhdGFDaGFubmVsU2VydmVyKCkgPSBkZWZhdWx0OwotCi0gIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkCi0gIC8vIHdoZW4gYSBuZXcgc29ja2V0IGhhcyBiZWVuIGFjY2VwdGVkLgotICAvLwotICAvLyBlcnJubyB3aWxsIGJlIHNldCBpbiBjYXNlIG9mIGZhaWx1cmUuCi0gIHZpcnR1YWwgYm9vbCBTdGFydExpc3RlbmluZygpID0gMDsKLQotICAvLyBTdG9wIGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBUaGUgY2FsbGJhY2sgd2lsbCBub3QgYmUKLSAgLy8gaW52b2tlZCwgYW5kIHNvY2tldHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuCi0gIC8vCi0gIC8vIFRoaXMgRE9FUyBub3QgZGlzY29ubmVjdCB0aGUgc2VydmVyLCBhbmQgY29ubmVjdGlvbnMgY2FuIHN0aWxsCi0gIC8vIGJlIHF1ZXVlZCB1cC4KLSAgdmlydHVhbCB2b2lkIFN0b3BMaXN0ZW5pbmcoKSA9IDA7Ci0KLSAgLy8gRGlzY29ubmVjdHMgdGhlIHNlcnZlciwgbm8gbmV3IGNvbm5lY3Rpb25zIGFyZSBwb3NzaWJsZS4KLSAgLy8gVGhlIGNhbGxiYWNrIHdpbGwgbmV2ZXIgYmUgaW52b2tlZCBhZ2Fpbi4KLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgPSAwOwotCi0gIC8vIFRydWUgaWYgdGhpcyBzZXJ2ZXIgaXMgY29ubmVjdGVkIGFuZCBjYW4gYWNjZXB0IGluY29taW5nCi0gIC8vIGNvbm5lY3Rpb25zLgotICB2aXJ0dWFsIGJvb2wgQ29ubmVjdGVkKCkgPSAwOwotCi0gIC8vIFJlZ2lzdGVycyB0aGUgY2FsbGJhY2sgdGhhdCBzaG91bGQgYmUgaW52b2tlZCB3aGVuZXZlciBhIG5ldyBzb2NrZXQgd2FzCi0gIC8vIGFjY2VwdGVkLgotICAvLwotICAvLyBCZWZvcmUgdGhlIGNhbGxiYWNrIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgc3RvcHBlZCBsaXN0ZW5pbmcgZm9yIG5ldwotICAvLyBpbmNvbWluZyBjb25uZWN0aW9ucy4gVGhlIGNhbGxlZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBTdGFydExpc3RlbmluZwotICAvLyBpZiBuZWVkZWQuCi0gIHZvaWQgU2V0T25Db25uZWN0Q2FsbGJhY2soY29uc3QgQ29ubmVjdENhbGxiYWNrJiBjYWxsYmFjaykgewotICAgIGNhbGxiYWNrXyA9IGNhbGxiYWNrOwotICB9OwotCi0gcHJvdGVjdGVkOgotICBDb25uZWN0Q2FsbGJhY2sgY2FsbGJhY2tfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG5ldAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9uZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0LmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZThhZjMuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI2luY2x1ZGUgIm5ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXQuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgIC8vIGZvciBlcnJubwotI2luY2x1ZGUgPGZjbnRsLmg+ICAgICAgIC8vIGZvciBmY250bCwgRkRfQ0xPRVhFQywgRl9HRVRGTAotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgIC8vIGZvciBzdHJlcnJvcgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gIC8vIGZvciBnZXRzb2Nrb3B0LCBzZW5kLCBNU0dfTk9TSUdOQUwKLSNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAvLyBmb3IgY2xvc2UsIHJlYWQKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+ICAvLyBmb3IgX19iYXNlCi0KLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9hc3luY19tYW5hZ2VyLmgiICAvLyBmb3IgQXN5bmNNYW5hZ2VyCi0jaW5jbHVkZSAib3MvbG9nLmgiICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIExPR19JTkZPCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAgICAgICAgICAgLy8gZm9yIE9TSV9OT19JTlRSCi0KLS8qIHNldCAgZm9yIHZlcnkgdmVyYm9zZSBkZWJ1Z2dpbmcgKi8KLSNpZm5kZWYgREVCVUcKLSNkZWZpbmUgREQoLi4uKSAodm9pZCkwCi0jZWxzZQotI2RlZmluZSBERCguLi4pIExPR19JTkZPKF9fVkFfQVJHU19fKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBuZXQgewotCi1Qb3NpeEFzeW5jU29ja2V0OjpQb3NpeEFzeW5jU29ja2V0KGludCBmZCwgQXN5bmNNYW5hZ2VyKiBhbSkKLSAgICA6IGZkXyhmZCksIGFtXyhhbSksIHdhdGNoaW5nXyhmYWxzZSkgewotICBpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCk7Ci0gIGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOwotCi0gIGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkQpOwotICBmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MgfCBPX0NMT0VYRUMpOwotCi0jaWZkZWYgU09fTk9TSUdQSVBFCi0gIC8vIERpc2FibGUgU0lHUElQRSBnZW5lcmF0aW9uIG9uIERhcndpbi4KLSAgLy8gV2hlbiB3cml0aW5nIHRvIGEgYnJva2VuIHBpcGUsIHNlbmQoKSB3aWxsIHJldHVybiAtMSBhbmQKLSAgLy8gc2V0IGVycm5vIHRvIEVQSVBFLgotICBmbGFncyA9IDE7Ci0gIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgKGNvbnN0IGNoYXIqKSZmbGFncywgc2l6ZW9mKGZsYWdzKSk7Ci0jZW5kaWYKLX0KLQotUG9zaXhBc3luY1NvY2tldDo6UG9zaXhBc3luY1NvY2tldChQb3NpeEFzeW5jU29ja2V0JiYgb3RoZXIpIHsKLSAgZmRfID0gb3RoZXIuZmRfOwotICB3YXRjaGluZ18gPSBvdGhlci53YXRjaGluZ18ubG9hZCgpOwotICBhbV8gPSBvdGhlci5hbV87Ci0KLSAgb3RoZXIuZmRfID0gLTE7Ci0gIG90aGVyLndhdGNoaW5nXyA9IGZhbHNlOwotfQotUG9zaXhBc3luY1NvY2tldDo6flBvc2l4QXN5bmNTb2NrZXQoKSB7IENsb3NlKCk7IH0KLQotc3NpemVfdCBQb3NpeEFzeW5jU29ja2V0OjpSZWN2KHVpbnQ4X3QqIGJ1ZmZlciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICBlcnJubyA9IDA7Ci0gIHNzaXplX3QgcmVzID0gMDsKLSAgT1NJX05PX0lOVFIocmVzID0gcmVhZChmZF8sIGJ1ZmZlciwgYnVmZmVyU2l6ZSkpOwotICBpZiAocmVzIDwgMCkgewotICAgIEREKCJSZWN2IDwgMDogJXMgKCVkKSIsIHN0cmVycm9yKGVycm5vKSwgZmRfKTsKLSAgfQotICBERCgiJXpkIGJ5dGVzICglZCkiLCByZXMsIGZkXyk7Ci0gIHJldHVybiByZXM7Ci19OwotCi1zc2l6ZV90IFBvc2l4QXN5bmNTb2NrZXQ6OlNlbmQoY29uc3QgdWludDhfdCogYnVmZmVyLCB1aW50NjRfdCBidWZmZXJTaXplKSB7Ci0gIGVycm5vID0gMDsKLSAgc3NpemVfdCByZXMgPSAwOwotI2lmZGVmIE1TR19OT1NJR05BTAotICAvLyBQcmV2ZW50IFNJR1BJUEUgZ2VuZXJhdGlvbiBvbiBMaW51eCB3aGVuIHdyaXRpbmcgdG8gYSBicm9rZW4gcGlwZS4KLSAgLy8gOjpzZW5kKCkgd2lsbCByZXR1cm4gLTEvRVBJUEUgaW5zdGVhZC4KLSAgY29uc3QgaW50IHNlbmRGbGFncyA9IE1TR19OT1NJR05BTDsKLSNlbHNlCi0gIC8vIEZvciBEYXJ3aW4sIHRoaXMgaXMgaGFuZGxlZCBieSBzZXR0aW5nIFNPX05PU0lHUElQRSB3aGVuIGNyZWF0aW5nCi0gIC8vIHRoZSBzb2NrZXQuCi0gIGNvbnN0IGludCBzZW5kRmxhZ3MgPSAwOwotI2VuZGlmCi0gIE9TSV9OT19JTlRSKHJlcyA9IHNlbmQoZmRfLCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlbmRGbGFncykpOwotCi0gIEREKCIlemQgYnl0ZXMgKCVkKSIsIHJlcywgZmRfKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotYm9vbCBQb3NpeEFzeW5jU29ja2V0OjpDb25uZWN0ZWQoKSB7Ci0gIGlmIChmZF8gPT0gLTEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY2hhciBidWY7Ci0gIGlmIChyZWN2KGZkXywgJmJ1ZiwgMSwgTVNHX1BFRUsgfCBNU0dfRE9OVFdBSVQpICE9IDEpIHsKLSAgICBERCgiUmVjdiBub3QgMSwgY291bGQgYmUgY29ubmVjdGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoZXJybm8pLCBmZF8pOwotICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBXZSBzYXcgYSBieXRlIGluIHRoZSBxdWV1ZSwgd2UgYXJlIGxpa2VseSBjb25uZWN0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBvc2l4QXN5bmNTb2NrZXQ6OkNsb3NlKCkgewotICBpZiAoZmRfID09IC0xKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU3RvcFdhdGNoaW5nKCk7Ci0KLSAgLy8gQ2xlYXIgb3V0IGVycm9yCi0gIGludCBlcnJvcl9jb2RlID0gMDsKLSAgc29ja2xlbl90IGVycm9yX2NvZGVfc2l6ZSA9IHNpemVvZihlcnJvcl9jb2RlKTsKLSAgZ2V0c29ja29wdChmZF8sIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCByZWludGVycHJldF9jYXN0PHZvaWQqPigmZXJyb3JfY29kZSksCi0gICAgICAgICAgICAgJmVycm9yX2NvZGVfc2l6ZSk7Ci0KLSAgLy8gc2h1dGRvd24gc29ja2V0cyBpZiBwb3NzaWJsZSwKLSAgT1NJX05PX0lOVFIoc2h1dGRvd24oZmRfLCBTSFVUX1JEV1IpKTsKLQotICBlcnJvcl9jb2RlID0gOjpjbG9zZShmZF8pOwotICBpZiAoZXJyb3JfY29kZSA9PSAtMSkgewotICAgIExPR19JTkZPKCJGYWlsZWQgdG8gY2xvc2U6ICVzICglZCkiLCBzdHJlcnJvcihlcnJubyksIGZkXyk7Ci0gIH0KLSAgTE9HX0lORk8oIiglZCkiLCBmZF8pOwotICBmZF8gPSAtMTsKLX0KLQotYm9vbCBQb3NpeEFzeW5jU29ja2V0OjpXYXRjaEZvck5vbkJsb2NraW5nUmVhZCgKLSAgICBjb25zdCBSZWFkQ2FsbGJhY2smIG9uX3JlYWRfcmVhZHlfY2FsbGJhY2spIHsKLSAgYm9vbCBleHBlY3RlZCA9IGZhbHNlOwotICBpZiAod2F0Y2hpbmdfLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGV4cGVjdGVkLCB0cnVlKSkgewotICAgIHJldHVybiBhbV8tPldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKAotICAgICAgICAgICAgICAgZmRfLCBbb25fcmVhZF9yZWFkeV9jYWxsYmFjaywgdGhpc10oaW50IC8qIGZkICovKSB7Ci0gICAgICAgICAgICAgICAgIG9uX3JlYWRfcmVhZHlfY2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICAgICB9KSA9PSAwOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQb3NpeEFzeW5jU29ja2V0OjpTdG9wV2F0Y2hpbmcoKSB7Ci0gIGJvb2wgZXhwZWN0ZWQgPSB0cnVlOwotICBpZiAod2F0Y2hpbmdfLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGV4cGVjdGVkLCBmYWxzZSkpIHsKLSAgICBhbV8tPlN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9yKGZkXyk7Ci0gIH0KLX0KLX0gIC8vIG5hbWVzcGFjZSBuZXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldC5oIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3ZTc3MS4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8c3RkaW50Lmg+ICAgICAvLyBmb3IgdWludDY0X3QsIHVpbnQ4X3QKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8vIGZvciBzc2l6ZV90Ci0KLSNpbmNsdWRlIDxhdG9taWM+ICAvLyBmb3IgYXRvbWljX2Jvb2wKLQotI2luY2x1ZGUgIm5ldC9hc3luY19kYXRhX2NoYW5uZWwuaCIgIC8vIGZvciBBc3luY0RhdGFDaGFubmVsLCBSZWFkQ2FsbGJhY2sKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci1jbGFzcyBBc3luY01hbmFnZXI7Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBuZXQgewotCi11c2luZyB0ZXN0X3ZlbmRvcl9saWI6OkFzeW5jTWFuYWdlcjsKLQotLy8gQSBQb3NpeCBjb21wbGlhbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFzeW5jRGF0YUNoYW5uZWwgaW50ZXJmYWNlLgotLy8KLS8vIFN1cHBvcnRzIGJvdGggRGFyd2luIGFuZCBMaW51eC4KLWNsYXNzIFBvc2l4QXN5bmNTb2NrZXQgOiBwdWJsaWMgQXN5bmNEYXRhQ2hhbm5lbCB7Ci0gcHVibGljOgotICAvLyBUaGUgQXN5bmNNYW5hZ2VyIG11c3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nOgotICAvLwotICAvLyAtIElmIGEgY2FsbGJhY2sgaGFwcGVucyBvbiB0aHJlYWQgdCwgYW5kCi0gIC8vICAgYW0tPlN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9yKGZkKQotICAvLyAgIGlzIGNhbGxlZCBmcm9tIHQgdGhlbiBhbSB3aWxsIG5ldmVyIGZpcmUgYW4gZXZlbnQgZm9yIGZkIHVwb24gcmV0dXJuLgotICBQb3NpeEFzeW5jU29ja2V0KGludCBmZCwgQXN5bmNNYW5hZ2VyKiBhbSk7Ci0gIFBvc2l4QXN5bmNTb2NrZXQoY29uc3QgUG9zaXhBc3luY1NvY2tldCYgb3RoZXIpID0gZGVsZXRlOwotICBQb3NpeEFzeW5jU29ja2V0KFBvc2l4QXN5bmNTb2NrZXQmJiBvdGhlcik7Ci0KLSAgLy8gTWFrZSBzdXJlIHRvIGNsb3NlIHRoZSBzb2NrZXQgYmVmb3JlIGhhbmQuCi0gIH5Qb3NpeEFzeW5jU29ja2V0KCk7Ci0KLSAgLy8gUmVjZWl2ZSBkYXRhIGluIHRoZSBnaXZlbiBidWZmZXIuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLAotICAvLyBvciBhIG5lZ2F0aXZlIG51bWJlciBpbiBjYXNlIG9mIGZhaWx1cmUuIENoZWNrIHRoZSBlcnJubyB2YXJpYWJsZSB0bwotICAvLyBsZWFybiB3aHkgdGhlIGNhbGwgZmFpbGVkLgotICBzc2l6ZV90IFJlY3YodWludDhfdCogYnVmZmVyLCB1aW50NjRfdCBidWZmZXJTaXplKSBvdmVycmlkZTsKLQotICAvLyBTZW5kIGRhdGEgaW4gdGhlIGdpdmVuIGJ1ZmZlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsCi0gIC8vIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGluIGNhc2Ugb2YgZmFpbHVyZS4gQ2hlY2sgdGhlIGVycm5vIHZhcmlhYmxlIHRvCi0gIC8vIGxlYXJuIHdoeSB0aGUgY2FsbCBmYWlsZWQuIE5vdGU6IFRoaXMgY2FuIGJlIEVBR0FJTiBpZiB3ZSBjYW5ub3QKLSAgLy8gd3JpdGUgdG8gdGhlIHNvY2tldCBhdCB0aGlzIHRpbWUgYXMgaXQgd291bGQgYmxvY2suCi0gIHNzaXplX3QgU2VuZChjb25zdCB1aW50OF90KiBidWZmZXIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIG92ZXJyaWRlOwotCi0gIC8vIFRydWUgaWYgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkCi0gIGJvb2wgQ29ubmVjdGVkKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ2xvc2VzIHRoaXMgc29ja2V0LiBZb3UgbXVzdCBjYWxsIHRoaXMgYmVmb3JlIGRlbGV0aW5nIHRoZSBzb2NrZXQuCi0gIC8vCi0gIC8vIC0gT24gTGludXgsIHRoZSBzb2NrZXQgaXMgYWx3YXlzIGNsb3NlZCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICAvLyAtIE9uIE9TIFgsIHdoZXRoZXIgdGhlIHNvY2tldCB0aGUgdW5kZXJseWluZyBmZCBiZWNvbWVzIGF2YWlsYWJsZSBzZWVtcwotICAvLyAgIHByZXR0eSBtdWNoIHJhbmRvbSEgKFlvdSBtaWdodCB3YW50IHRvIGRyYWluIHRoZSBzb2NrZXQgZmlyc3QuKQotICB2b2lkIENsb3NlKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gUmVnaXN0ZXJzIHRoZSBnaXZlbiBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSByZWN2IGNhbGwgY2FuIGJlIG1hZGUKLSAgLy8gdG8gcmVhZCBkYXRhIGZyb20gdGhpcyBzb2NrZXQuCi0gIC8vIE9ubHkgb25lIGNhbGxiYWNrIGNhbiBiZSByZWdpc3RlcmVkIHBlciBzb2NrZXQuCi0gIGJvb2wgV2F0Y2hGb3JOb25CbG9ja2luZ1JlYWQoCi0gICAgICBjb25zdCBSZWFkQ2FsbGJhY2smIG9uX3JlYWRfcmVhZHlfY2FsbGJhY2spIG92ZXJyaWRlOwotCi0gIHZvaWQgU3RvcFdhdGNoaW5nKCkgb3ZlcnJpZGU7Ci0KLSAgaW50IGZkKCkgeyByZXR1cm4gZmRfOyB9Ci0KLSBwcml2YXRlOgotICB2b2lkIE9uUmVhZENhbGxiYWNrKCk7Ci0KLSAgaW50IGZkXzsKLSAgQXN5bmNNYW5hZ2VyKiBhbV87Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgd2F0Y2hpbmdfOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBuZXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9jb25uZWN0b3IuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9jb25uZWN0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGU4YTUuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfY29ubmVjdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLQotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI2luY2x1ZGUgIm5ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfY29ubmVjdG9yLmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4gICAvLyBmb3IgaW5ldF9hZGRyLCBpbmV0X250b2EKLSNpbmNsdWRlIDxlcnJuby5oPiAgICAgICAvLyBmb3IgZXJybm8sIEVBR0FJTiwgRUlOUFJPR1JFU1MKLSNpbmNsdWRlIDxuZXRkYi5oPiAgICAgICAvLyBmb3IgZ2V0aG9zdGJ5bmFtZSwgYWRkcmluZm8KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAvLyBmb3Igc29ja2FkZHJfaW4sIGluX2FkZHIKLSNpbmNsdWRlIDxwb2xsLmg+ICAgICAgICAvLyBmb3IgcG9sbCwgUE9MTEhVUCwgUE9MTElOLCBQT0wuLi4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAvLyBmb3Igc3RyZXJyb3IsIE5VTEwKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ICAvLyBmb3IgY29ubmVjdCwgZ2V0cGVlcm5hbWUsIGdldHMuLi4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gICAvLyBmb3IgcmVtb3ZlX2V4dGVudF90Ci0KLSNpbmNsdWRlICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0LmgiICAvLyBmb3IgUG9zaXhBc3luY1NvY2tldAotI2luY2x1ZGUgIm9zL2xvZy5oIiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBMT0dfSU5GTwotI2luY2x1ZGUgIm9zaS9pbmNsdWRlL29zaS5oIiAgICAgICAgICAgICAgIC8vIGZvciBPU0lfTk9fSU5UUgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbmV0IHsKLQotUG9zaXhBc3luY1NvY2tldENvbm5lY3Rvcjo6UG9zaXhBc3luY1NvY2tldENvbm5lY3RvcihBc3luY01hbmFnZXIqIGFtKQotICAgIDogYW1fKGFtKSB7fQotCi1zdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4KLVBvc2l4QXN5bmNTb2NrZXRDb25uZWN0b3I6OkNvbm5lY3RUb1JlbW90ZVNlcnZlcigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmVyLCBpbnQgcG9ydCwKLSAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKLSAgTE9HX0lORk8oIkNvbm5lY3RpbmcgdG8gJXM6JWQgaW4gJWQgbXMiLCBzZXJ2ZXIuY19zdHIoKSwgcG9ydCwKLSAgICAgICAgICAgKGludCl0aW1lb3V0LmNvdW50KCkpOwotICBpbnQgc29ja2V0X2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFBvc2l4QXN5bmNTb2NrZXQ+IHBhcyA9Ci0gICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBvc2l4QXN5bmNTb2NrZXQ+KHNvY2tldF9mZCwgYW1fKTsKLQotICBpZiAoc29ja2V0X2ZkIDwgMSkgewotICAgIExPR19JTkZPKCJzb2NrZXQoKSBjYWxsIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBwYXM7Ci0gIH0KLQotICBzdHJ1Y3QgaG9zdGVudCogaG9zdDsKLSAgaG9zdCA9IGdldGhvc3RieW5hbWUoc2VydmVyLmNfc3RyKCkpOwotICBpZiAoaG9zdCA9PSBOVUxMKSB7Ci0gICAgTE9HX0lORk8oImdldGhvc3RieW5hbWUoKSBmYWlsZWQgZm9yICVzOiAlcyIsIHNlcnZlci5jX3N0cigpLAotICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcGFzLT5DbG9zZSgpOwotICAgIHJldHVybiBwYXM7Ci0gIH0KLQotICBzdHJ1Y3QgaW5fYWRkcioqIGFkZHJfbGlzdCA9IChzdHJ1Y3QgaW5fYWRkcioqKWhvc3QtPmhfYWRkcl9saXN0OwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2Vydl9hZGRyIHt9OwotICBzZXJ2X2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHNlcnZfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoaW5ldF9udG9hKCphZGRyX2xpc3RbMF0pKTsKLSAgc2Vydl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0KLSAgaW50IHJlc3VsdCA9Ci0gICAgICBjb25uZWN0KHNvY2tldF9mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNlcnZfYWRkciwgc2l6ZW9mKHNlcnZfYWRkcikpOwotCi0gIGlmIChyZXN1bHQgIT0gMCAmJgotICAgICAgIShlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOUFJPR1JFU1MpKSB7Ci0gICAgTE9HX0lORk8oIkZhaWxlZCB0byBjb25uZWN0IHRvICVzOiVkLCBlcnJvcjogICVzIiwgc2VydmVyLmNfc3RyKCksIHBvcnQsCi0gICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBwYXMtPkNsb3NlKCk7Ci0gICAgcmV0dXJuIHBhczsKLSAgfQotCi0gIC8vIHdhaXQgZm9yIHRoZSBjb25uZWN0aW9uLgotICBzdHJ1Y3QgcG9sbGZkIGZkc1tdID0gewotICAgICAgewotICAgICAgICAgIC5mZCA9IHNvY2tldF9mZCwKLSAgICAgICAgICAuZXZlbnRzID0gUE9MTElOIHwgUE9MTE9VVCB8IFBPTExIVVAsCi0gICAgICAgICAgLnJldmVudHMgPSAwLAotICAgICAgfSwKLSAgfTsKLSAgaW50IG51bUZkc1JlYWR5ID0gMDsKLSAgT1NJX05PX0lOVFIobnVtRmRzUmVhZHkgPSA6OnBvbGwoZmRzLCAxLCB0aW1lb3V0LmNvdW50KCkpKTsKLSAgaWYgKG51bUZkc1JlYWR5IDw9IDApIHsKLSAgICBMT0dfSU5GTygiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJXM6JWQsIGVycm9yOiAgJXMiLCBzZXJ2ZXIuY19zdHIoKSwgcG9ydCwKLSAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHBhcy0+Q2xvc2UoKTsKLSAgICByZXR1cm4gcGFzOwotICB9Ci0KLSAgLy8gQXMgcGVyIGh0dHBzOi8vY3IueXAudG8vZG9jcy9jb25uZWN0Lmh0bWwsIHdlIHNob3VsZCBnZXQgdGhlIHBlZXJuYW1lCi0gIC8vIGZvciB2YWxpZGF0aW5nIGlmIGEgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQuCi0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOwotICBzb2NrbGVuX3Qgc3NsZW4gPSBzaXplb2Yoc3MpOwotCi0gIGlmIChnZXRwZWVybmFtZShzb2NrZXRfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzcywgJnNzbGVuKSA8IDApIHsKLSAgICBMT0dfSU5GTygiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJXM6JWQsIGVycm9yOiAgJXMiLCBzZXJ2ZXIuY19zdHIoKSwgcG9ydCwKLSAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHBhcy0+Q2xvc2UoKTsKLSAgICByZXR1cm4gcGFzOwotICB9Ci0KLSAgaW50IGVyciA9IDA7Ci0gIHNvY2tsZW5fdCBvcHRMZW4gPSBzaXplb2YoZXJyKTsKLSAgaWYgKGdldHNvY2tvcHQoc29ja2V0X2ZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmVyciksCi0gICAgICAgICAgICAgICAgICZvcHRMZW4pIHx8Ci0gICAgICBlcnIpIHsKLSAgICAvLyBFaXRoZXIgZ2V0c29ja29wdCBmYWlsZWQgb3IgdGhlcmUgd2FzIGFuIGVycm9yIGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBzb2NrZXQuIFRoZSBjb25uZWN0aW9uIGRpZCBub3Qgc3VjY2VlZC4KLSAgICBMT0dfSU5GTygiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJXM6JWQsIGVycm9yOiAgJXMiLCBzZXJ2ZXIuY19zdHIoKSwgcG9ydCwKLSAgICAgICAgICAgICBzdHJlcnJvcihlcnIpKTsKLSAgICBwYXMtPkNsb3NlKCk7Ci0gICAgcmV0dXJuIHBhczsKLSAgfQotCi0gIExPR19JTkZPKCJDb25uZWN0ZWQgdG8gJXM6JWQgKCVkKSIsIHNlcnZlci5jX3N0cigpLCBwb3J0LCBzb2NrZXRfZmQpOwotICByZXR1cm4gcGFzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbmV0Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfY29ubmVjdG9yLmggYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9jb25uZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1MzY3OC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9jb25uZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8Y2hyb25vPiAgLy8gZm9yIG9wZXJhdG9yIiJtcywgY2hyb25vX2xpdGVyYWxzCi0jaW5jbHVkZSA8bWVtb3J5PiAgLy8gZm9yIHNoYXJlZF9wdHIKLSNpbmNsdWRlIDxzdHJpbmc+ICAvLyBmb3Igc3RyaW5nCi0KLSNpbmNsdWRlICJuZXQvYXN5bmNfZGF0YV9jaGFubmVsX2Nvbm5lY3Rvci5oIiAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWxDb25uZWN0b3IKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG5ldCB7Ci1jbGFzcyBBc3luY0RhdGFDaGFubmVsOwotfSAgLy8gbmFtZXNwYWNlIG5ldAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci1jbGFzcyBBc3luY01hbmFnZXI7Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCi0KLXVzaW5nIHRlc3RfdmVuZG9yX2xpYjo6QXN5bmNNYW5hZ2VyOwotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG5ldCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKLQotLy8gQSBQb3NpeCBjb21wbGlhbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFzeW5jRGF0YUNoYW5uZWxDb25uZWN0b3IgaW50ZXJmYWNlLgotLy8KLS8vIFN1cHBvcnRzIGJvdGggRGFyd2luIChmcmVlYnNkKSBhbmQgbGludXguCi1jbGFzcyBQb3NpeEFzeW5jU29ja2V0Q29ubmVjdG9yIDogcHVibGljIEFzeW5jRGF0YUNoYW5uZWxDb25uZWN0b3IgewotIHB1YmxpYzoKLSAgUG9zaXhBc3luY1NvY2tldENvbm5lY3RvcihBc3luY01hbmFnZXIqIGFtKTsKLSAgflBvc2l4QXN5bmNTb2NrZXRDb25uZWN0b3IoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gQmxvY2tzIGFuZCB3YWl0cyB1bnRpbCBhIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgaGFzIGJlZW4KLSAgLy8gZXN0YWJsaXNoZWQuIFJldHVybnMgbnVsbCBpbiBjYXNlIG9mIGZhaWx1cmUuIEluIGNhc2Ugb2YgbnVsbCB0aGUgZXJybm8KLSAgLy8gdmFyaWFibGUgd2lsbCBiZSBzZXQgd2l0aCB0aGUgZW5jb3VudGVyZWQgZXJyb3IuCi0gIC8vCi0gIC8vIE5vdGU6IFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBzb2NrZXQgaXMgZnVsbHkgb3BlbmVkISBBIHNlcnZlcgotICAvLyBtaWdodCBub3QgKHlldD8pIGhhdmUgY2FsbGVkIGFjY2VwdCBvbiB0aGUgc29ja2V0LgotICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gQ29ubmVjdFRvUmVtb3RlU2VydmVyKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZlciwgaW50IHBvcnQsCi0gICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQgPSA1MDAwbXMpOwotCi0gcHJpdmF0ZToKLSAgQXN5bmNNYW5hZ2VyKiBhbV87Ci19OwotfSAgLy8gbmFtZXNwYWNlIG5ldAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9zZXJ2ZXIuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9zZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Y2E3MWEuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL25ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfc2VydmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLQotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotI2luY2x1ZGUgIm5ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPiAgICAgICAvLyBmb3IgZXJybm8KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAvLyBmb3Igc29ja2FkZHJfaW4sIElOQUREUl9BTlkKLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAvLyBmb3Igc3RyZXJyb3IsIE5VTEwKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ICAvLyBmb3IgYWNjZXB0LCBiaW5kLCBnZXRzb2NrbmFtZQotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgIC8vIGZvciBjbG9zZQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+ICAgIC8vIGZvciBfX2Jhc2UsIGZ1bmN0aW9uCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+ICAgLy8gZm9yIHJlbW92ZV9leHRlbnRfdAotCi0jaW5jbHVkZSAibmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldC5oIiAgLy8gZm9yIFBvc2l4QXN5bmNTb2NrZXQsIEFzeW5jTWFuLi4uCi0jaW5jbHVkZSAib3MvbG9nLmgiICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIExPR19JTkZPLCBMT0dfRVJST1IKLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgICAgICAgICAgICAgICAvLyBmb3IgT1NJX05PX0lOVFIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG5ldCB7Ci1jbGFzcyBBc3luY0RhdGFDaGFubmVsOwotCi1Qb3NpeEFzeW5jU29ja2V0U2VydmVyOjpQb3NpeEFzeW5jU29ja2V0U2VydmVyKGludCBwb3J0LCBBc3luY01hbmFnZXIqIGFtKQotICAgIDogcG9ydF8ocG9ydCksIGFtXyhhbSkgewotICBpbnQgbGlzdGVuX2ZkID0gMDsKLSAgc3RydWN0IHNvY2thZGRyX2luIGxpc3Rlbl9hZGRyZXNzIHt9OwotICBzb2NrbGVuX3Qgc29ja2FkZHJfaW5fc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwotCi0gIE9TSV9OT19JTlRSKGxpc3Rlbl9mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpOwotICBpZiAobGlzdGVuX2ZkIDwgMCkgewotICAgIExPR19JTkZPKCJFcnJvciBjcmVhdGluZyBzb2NrZXQgZm9yIHRlc3QgY2hhbm5lbC4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQgZW5hYmxlID0gMTsKLSAgaWYgKHNldHNvY2tvcHQobGlzdGVuX2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZlbmFibGUsIHNpemVvZihpbnQpKSA8Ci0gICAgICAwKSB7Ci0gICAgTE9HX0VSUk9SKCJzZXRzb2Nrb3B0KFNPX1JFVVNFQUREUikgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLQotICBsaXN0ZW5fYWRkcmVzcy5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgbGlzdGVuX2FkZHJlc3Muc2luX3BvcnQgPSBodG9ucyhwb3J0Xyk7Ci0gIGxpc3Rlbl9hZGRyZXNzLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotCi0gIGlmIChiaW5kKGxpc3Rlbl9mZCwgcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KCZsaXN0ZW5fYWRkcmVzcyksCi0gICAgICAgICAgIHNvY2thZGRyX2luX3NpemUpIDwgMCkgewotICAgIExPR19JTkZPKCJFcnJvciBiaW5kaW5nIHRlc3QgY2hhbm5lbCBsaXN0ZW5lciBzb2NrZXQgdG8gcG9ydDogJWQsICVzIiwgcG9ydCwKLSAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIGNsb3NlKGxpc3Rlbl9mZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGxpc3RlbihsaXN0ZW5fZmQsIDEpIDwgMCkgewotICAgIExPR19JTkZPKCJFcnJvciBsaXN0ZW5pbmcgZm9yIHRlc3QgY2hhbm5lbDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIGNsb3NlKGxpc3Rlbl9mZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLSAgc29ja2xlbl90IHNsZW4gPSBzaXplb2Yoc2luKTsKLSAgaWYgKGdldHNvY2tuYW1lKGxpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNpbiwgJnNsZW4pID09IC0xKQotICAgIExPR19JTkZPKCJFcnJvciByZXRyaWV2aW5nIGFjdHVhbCBwb3J0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gIGVsc2UKLSAgICBwb3J0XyA9IG50b2hzKHNpbi5zaW5fcG9ydCk7Ci0KLSAgTE9HX0lORk8oIkxpc3RlbmluZyBvbjogJWQgKCVkKSIsIHBvcnRfLCBsaXN0ZW5fZmQpOwotICBzZXJ2ZXJfc29ja2V0XyA9IHN0ZDo6bWFrZV9zaGFyZWQ8UG9zaXhBc3luY1NvY2tldD4obGlzdGVuX2ZkLCBhbV8pOwotfQotCi1ib29sIFBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXI6OlN0YXJ0TGlzdGVuaW5nKCkgewotICBpZiAoIXNlcnZlcl9zb2NrZXRfIHx8ICFjYWxsYmFja18pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzZXJ2ZXJfc29ja2V0Xy0+V2F0Y2hGb3JOb25CbG9ja2luZ1JlYWQoCi0gICAgICBbdGhpc10oQXN5bmNEYXRhQ2hhbm5lbCogLyogc29ja2V0ICovKSB7IEFjY2VwdFNvY2tldCgpOyB9KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUG9zaXhBc3luY1NvY2tldFNlcnZlcjo6Q2xvc2UoKSB7Ci0gIGlmIChzZXJ2ZXJfc29ja2V0XykgewotICAgIHNlcnZlcl9zb2NrZXRfLT5DbG9zZSgpOwotICB9Ci19Ci0KLWJvb2wgUG9zaXhBc3luY1NvY2tldFNlcnZlcjo6Q29ubmVjdGVkKCkgewotICByZXR1cm4gc2VydmVyX3NvY2tldF8gJiYgc2VydmVyX3NvY2tldF8tPkNvbm5lY3RlZCgpOwotfQotCi12b2lkIFBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXI6OkFjY2VwdFNvY2tldCgpIHsKLSAgaW50IGFjY2VwdF9mZCA9IDA7Ci0gIE9TSV9OT19JTlRSKGFjY2VwdF9mZCA9IGFjY2VwdChzZXJ2ZXJfc29ja2V0Xy0+ZmQoKSwgTlVMTCwgTlVMTCkpOwotCi0gIGlmIChhY2NlcHRfZmQgPCAwKSB7Ci0gICAgTE9HX0lORk8oIkVycm9yIGFjY2VwdGluZyB0ZXN0IGNoYW5uZWwgY29ubmVjdGlvbiBlcnJubz0lZCAoJXMpLiIsIGVycm5vLAotICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTE9HX0lORk8oImFjY2VwdF9mZCA9ICVkLiIsIGFjY2VwdF9mZCk7Ci0gIFN0b3BMaXN0ZW5pbmcoKTsKLSAgY2FsbGJhY2tfKHN0ZDo6bWFrZV9zaGFyZWQ8UG9zaXhBc3luY1NvY2tldD4oYWNjZXB0X2ZkLCBhbV8pLCB0aGlzKTsKLX0KLQotdm9pZCBQb3NpeEFzeW5jU29ja2V0U2VydmVyOjpTdG9wTGlzdGVuaW5nKCkgeyBzZXJ2ZXJfc29ja2V0Xy0+U3RvcFdhdGNoaW5nKCk7IH0KLX0gIC8vIG5hbWVzcGFjZSBuZXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvbmV0L3Bvc2l4L3Bvc2l4X2FzeW5jX3NvY2tldF9zZXJ2ZXIuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9uZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ1M2I1Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9uZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotCi0vLyBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4gIC8vIGZvciBzaGFyZWRfcHRyCi0KLSNpbmNsdWRlICJuZXQvYXN5bmNfZGF0YV9jaGFubmVsX3NlcnZlci5oIiAgLy8gZm9yIEFzeW5jRGF0YUNoYW5uZWxTZXJ2ZXIKLSNpbmNsdWRlICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0LmgiICAgLy8gZm9yIEFzeW5jTWFuYWdlciwgUG9zaXhBc3luY1MuLi4KLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci1jbGFzcyBBc3luY01hbmFnZXI7Ci19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCi0KLXVzaW5nIHRlc3RfdmVuZG9yX2xpYjo6QXN5bmNNYW5hZ2VyOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbmV0IHsKLQotLy8gQW4gQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciB0aGF0IGJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzIG9uIHRoZSBnaXZlbiBwb3J0IGFuZAotLy8gbGlzdGVucyBmb3IgaW5jb21pbmcgc29ja2V0IGNvbm5lY3Rpb25zLgotLy8KLS8vIEl0IHVzZXMgdGhlIEFzeW5jTWFuYWdlciBmb3Igd2F0Y2hpbmcgdGhlIHNvY2tldC4KLWNsYXNzIFBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXIgOiBwdWJsaWMgQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciB7Ci0gcHVibGljOgotICAvLyBCaW5kcyB0byB0aGUgZ2l2ZW4gcG9ydCBvbiBhbGwgaW50ZXJmYWNlcy4KLSAgLy8gTm90ZTogZG8gbm90IHVzZSBwb3J0IDAhCi0gIFBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXIoaW50IHBvcnQsIEFzeW5jTWFuYWdlciogYW0pOwotCi0gIC8vIFJldHVybiB0aGUgcG9ydCB0aGF0IHRoaXMgc2VydmVyIHdhcyBpbml0aWFsaXplZCB3aXRoLgotICBpbnQgcG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9OwotCi0gIGJvb2wgU3RhcnRMaXN0ZW5pbmcoKSBvdmVycmlkZTsKLQotICB2b2lkIFN0b3BMaXN0ZW5pbmcoKSBvdmVycmlkZTsKLQotICB2b2lkIENsb3NlKCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBDb25uZWN0ZWQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQWNjZXB0U29ja2V0KCk7Ci0KLSAgaW50IHBvcnRfOwotICBzdGQ6OnNoYXJlZF9wdHI8UG9zaXhBc3luY1NvY2tldD4gc2VydmVyX3NvY2tldF87Ci0gIEFzeW5jTWFuYWdlciogYW1fOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG5ldAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9wYWNrZXRzL2xpbmtfbGF5ZXJfcGFja2V0cy5wZGwgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvcGFja2V0cy9saW5rX2xheWVyX3BhY2tldHMucGRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdkMDRjLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9wYWNrZXRzL2xpbmtfbGF5ZXJfcGFja2V0cy5wZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotbGl0dGxlX2VuZGlhbl9wYWNrZXRzCi0KLWN1c3RvbV9maWVsZCBBZGRyZXNzIDogNDggImhjaS8iCi1jdXN0b21fZmllbGQgQ2xhc3NPZkRldmljZSA6IDI0ICJoY2kvIgotCi1lbnVtIFBhY2tldFR5cGUgOiA4IHsKLSAgICBVTktOT1dOID0gMHgwMCwKLSAgICBBQ0wgPSAweDAxLAotICAgIERJU0NPTk5FQ1QgPSAweDAyLAotICAgIEVOQ1JZUFRfQ09OTkVDVElPTiA9IDB4MDMsCi0gICAgRU5DUllQVF9DT05ORUNUSU9OX1JFU1BPTlNFID0gMHgwNCwKLSAgICBFVkVOVCA9IDB4MDUsCi0gICAgSU5RVUlSWSA9IDB4MDYsCi0gICAgSU5RVUlSWV9SRVNQT05TRSA9IDB4MDcsCi0gICAgSU9fQ0FQQUJJTElUWV9SRVFVRVNUID0gMHgwOCwKLSAgICBJT19DQVBBQklMSVRZX1JFU1BPTlNFID0gMHgwOSwKLSAgICBJT19DQVBBQklMSVRZX05FR0FUSVZFX1JFU1BPTlNFID0gMHgwQSwKLSAgICBMRV9BRFZFUlRJU0VNRU5UID0gMHgwQiwKLSAgICBMRV9DT05ORUNUID0gMHgwQywKLSAgICBMRV9DT05ORUNUX0NPTVBMRVRFID0gMHgwRCwKLSAgICBMRV9TQ0FOID0gMHgwRSwKLSAgICBMRV9TQ0FOX1JFU1BPTlNFID0gMHgwRiwKLSAgICBQQUdFID0gMHgxMCwKLSAgICBQQUdFX1JFU1BPTlNFID0gMHgxMSwKLSAgICBQQUdFX1JFSkVDVCA9IDB4MTIsCi0gICAgUkVBRF9DTE9DS19PRkZTRVQgPSAweDEzLAotICAgIFJFQURfQ0xPQ0tfT0ZGU0VUX1JFU1BPTlNFID0gMHgxNCwKLSAgICBSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVMgPSAweDE1LAotICAgIFJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFU19SRVNQT05TRSA9IDB4MTYsCi0gICAgUkVBRF9SRU1PVEVfTE1QX0ZFQVRVUkVTID0gMHgxNywKLSAgICBSRUFEX1JFTU9URV9MTVBfRkVBVFVSRVNfUkVTUE9OU0UgPSAweDE4LAotICAgIFJFQURfUkVNT1RFX0VYVEVOREVEX0ZFQVRVUkVTID0gMHgxOSwKLSAgICBSRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFU19SRVNQT05TRSA9IDB4MUEsCi0gICAgUkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTiA9IDB4MUIsCi0gICAgUkVBRF9SRU1PVEVfVkVSU0lPTl9JTkZPUk1BVElPTl9SRVNQT05TRSA9IDB4MUMsCi0gICAgUkVNT1RFX05BTUVfUkVRVUVTVCA9IDB4MUQsCi0gICAgUkVNT1RFX05BTUVfUkVRVUVTVF9SRVNQT05TRSA9IDB4MUUsCi0gICAgU0NPID0gMHgxRiwKLSAgICBMRV9FTkNSWVBUX0NPTk5FQ1RJT04gPSAweDIwLAotICAgIExFX0VOQ1JZUFRfQ09OTkVDVElPTl9SRVNQT05TRSA9IDB4MjEsCi0gICAgSVNPID0gMHgyMiwKLSAgICBJU09fQ09OTkVDVElPTl9SRVFVRVNUID0gMHgyMywKLSAgICBJU09fQ09OTkVDVElPTl9SRVNQT05TRSA9IDB4MjQsCi0gICAgT09CX0RBVEEgPSAweDI1LAotICAgIE9PQl9EQVRBX1JFU1BPTlNFID0gMHgyNiwKLSAgICBQQVNTS0VZID0gMHgyNywKLSAgICBQQVNTS0VZX0ZBSUxFRCA9IDB4MjgsCi0gICAgS0VZUFJFU1NfTk9USUZJQ0FUSU9OID0gMHgyOSwKLSAgICBQSU5fUkVRVUVTVCA9IDB4MkEsCi0gICAgUElOX1JFU1BPTlNFID0gMHgyQiwKLSAgICBMRV9SRUFEX1JFTU9URV9GRUFUVVJFUyA9IDB4MkMsCi0gICAgTEVfUkVBRF9SRU1PVEVfRkVBVFVSRVNfUkVTUE9OU0UgPSAweDJELAotICAgIExFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1JFUVVFU1QgPSAweDJFLAotICAgIExFX0NPTk5FQ1RJT05fUEFSQU1FVEVSX1VQREFURSA9IDB4MkYsCi19Ci0KLXBhY2tldCBMaW5rTGF5ZXJQYWNrZXQgewotICB0eXBlIDogUGFja2V0VHlwZSwKLSAgc291cmNlX2FkZHJlc3MgOiBBZGRyZXNzLAotICBkZXN0aW5hdGlvbl9hZGRyZXNzIDogQWRkcmVzcywKLSAgX2JvZHlfLAotfQotCi1wYWNrZXQgQWNsIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gQUNMKSB7Ci0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IERpc2Nvbm5lY3QgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBESVNDT05ORUNUKSB7Ci0gIHJlYXNvbiA6IDgsCi19Ci0KLXBhY2tldCBFbmNyeXB0Q29ubmVjdGlvbiA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IEVOQ1JZUFRfQ09OTkVDVElPTikgewotICBrZXkgOiA4W10sCi19Ci0KLXBhY2tldCBFbmNyeXB0Q29ubmVjdGlvblJlc3BvbnNlIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gRU5DUllQVF9DT05ORUNUSU9OX1JFU1BPTlNFKSB7Ci0gIGtleSA6IDhbXSwKLX0KLQotZW51bSBJbnF1aXJ5U3RhdGUgOiA4IHsKLSAgU1RBTkRCWSA9IDB4MDAsCi0gIElOUVVJUlkgPSAweDAxLAotfQotCi1lbnVtIElucXVpcnlUeXBlIDogOCB7Ci0gIFNUQU5EQVJEID0gMHgwMCwKLSAgUlNTSSA9IDB4MDEsCi0gIEVYVEVOREVEID0gMHgwMiwKLX0KLQotcGFja2V0IElucXVpcnkgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBJTlFVSVJZKSB7Ci0gIGlucXVpcnlfdHlwZSA6IElucXVpcnlUeXBlLAotfQotCi1wYWNrZXQgQmFzaWNJbnF1aXJ5UmVzcG9uc2UgOiBMaW5rTGF5ZXJQYWNrZXQodHlwZSA9IElOUVVJUllfUkVTUE9OU0UpIHsKLSAgaW5xdWlyeV90eXBlIDogSW5xdWlyeVR5cGUsCi0gIHBhZ2Vfc2Nhbl9yZXBldGl0aW9uX21vZGUgOiA4LAotICBjbGFzc19vZl9kZXZpY2UgOiBDbGFzc09mRGV2aWNlLAotICBjbG9ja19vZmZzZXQgOiAxNSwKLSAgX3Jlc2VydmVkXyA6IDEsCi0gIF9ib2R5XywKLX0KLQotcGFja2V0IElucXVpcnlSZXNwb25zZSA6IEJhc2ljSW5xdWlyeVJlc3BvbnNlIChpbnF1aXJ5X3R5cGUgPSBTVEFOREFSRCkgewotfQotCi1wYWNrZXQgSW5xdWlyeVJlc3BvbnNlV2l0aFJzc2kgOiBCYXNpY0lucXVpcnlSZXNwb25zZSAoaW5xdWlyeV90eXBlID0gUlNTSSkgIHsKLSAgcnNzaTogOCwKLX0KLQotcGFja2V0IEV4dGVuZGVkSW5xdWlyeVJlc3BvbnNlIDogQmFzaWNJbnF1aXJ5UmVzcG9uc2UgKGlucXVpcnlfdHlwZSA9IEVYVEVOREVEKSAgewotICByc3NpOiA4LAotICBleHRlbmRlZF9kYXRhIDogOFtdLAotfQotCi1wYWNrZXQgSW9DYXBhYmlsaXR5UmVxdWVzdCA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IElPX0NBUEFCSUxJVFlfUkVRVUVTVCkgewotICBpb19jYXBhYmlsaXR5IDogOCwKLSAgb29iX2RhdGFfcHJlc2VudCA6IDgsCi0gIGF1dGhlbnRpY2F0aW9uX3JlcXVpcmVtZW50cyA6IDgsCi19Ci0KLXBhY2tldCBJb0NhcGFiaWxpdHlSZXNwb25zZSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IElPX0NBUEFCSUxJVFlfUkVTUE9OU0UpIHsKLSAgaW9fY2FwYWJpbGl0eSA6IDgsCi0gIG9vYl9kYXRhX3ByZXNlbnQgOiA4LAotICBhdXRoZW50aWNhdGlvbl9yZXF1aXJlbWVudHMgOiA4LAotfQotCi1wYWNrZXQgSW9DYXBhYmlsaXR5TmVnYXRpdmVSZXNwb25zZSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IElPX0NBUEFCSUxJVFlfTkVHQVRJVkVfUkVTUE9OU0UpIHsKLSAgcmVhc29uIDogOCwKLX0KLQotZW51bSBBZGRyZXNzVHlwZSA6IDggewotICBQVUJMSUMgPSAwLAotICBSQU5ET00gPSAxLAotICBQVUJMSUNfSURFTlRJVFkgPSAyLAotICBSQU5ET01fSURFTlRJVFkgPSAzLAotfQotCi1lbnVtIEFkdmVydGlzZW1lbnRUeXBlIDogOCB7Ci0gICAgQURWX0lORCA9IDAsICAgICAgICAgIC8vIENvbm5lY3RhYmxlIGFuZCBzY2FubmFibGUKLSAgICBBRFZfRElSRUNUX0lORCA9IDEsICAgLy8gQ29ubmVjdGFibGUgZGlyZWN0ZWQKLSAgICBBRFZfU0NBTl9JTkQgPSAyLCAgICAgLy8gU2Nhbm5hYmxlIHVuZGlyZWN0ZWQKLSAgICBBRFZfTk9OQ09OTl9JTkQgPSAzLCAgLy8gTm9uIGNvbm5lY3RhYmxlIHVuZGlyZWN0ZWQKLSAgICBTQ0FOX1JFU1BPTlNFID0gNCwKLX0KLQotcGFja2V0IExlQWR2ZXJ0aXNlbWVudCA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IExFX0FEVkVSVElTRU1FTlQpIHsKLSAgYWRkcmVzc190eXBlIDogQWRkcmVzc1R5cGUsCi0gIGFkdmVydGlzZW1lbnRfdHlwZSA6IEFkdmVydGlzZW1lbnRUeXBlLAotICBkYXRhIDogOFtdLAotfQotCi1wYWNrZXQgTGVDb25uZWN0IDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gTEVfQ09OTkVDVCkgewotICBsZV9jb25uZWN0aW9uX2ludGVydmFsX21pbiA6IDE2LAotICBsZV9jb25uZWN0aW9uX2ludGVydmFsX21heCA6IDE2LAotICBsZV9jb25uZWN0aW9uX2xhdGVuY3kgOiAxNiwKLSAgbGVfY29ubmVjdGlvbl9zdXBlcnZpc2lvbl90aW1lb3V0IDogMTYsCi0gIGFkZHJlc3NfdHlwZSA6IDgsCi19Ci0KLXBhY2tldCBMZUNvbm5lY3RDb21wbGV0ZSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IExFX0NPTk5FQ1RfQ09NUExFVEUpIHsKLSAgbGVfY29ubmVjdGlvbl9pbnRlcnZhbCA6IDE2LAotICBsZV9jb25uZWN0aW9uX2xhdGVuY3kgOiAxNiwKLSAgbGVfY29ubmVjdGlvbl9zdXBlcnZpc2lvbl90aW1lb3V0IDogMTYsCi0gIGFkZHJlc3NfdHlwZSA6IDgsCi19Ci0KLXBhY2tldCBMZVNjYW4gOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBMRV9TQ0FOKSB7Ci19Ci0KLXBhY2tldCBMZVNjYW5SZXNwb25zZSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IExFX1NDQU5fUkVTUE9OU0UpIHsKLSAgYWRkcmVzc190eXBlIDogQWRkcmVzc1R5cGUsCi0gIGFkdmVydGlzZW1lbnRfdHlwZSA6IEFkdmVydGlzZW1lbnRUeXBlLAotICBkYXRhIDogOFtdLAotfQotCi1wYWNrZXQgUGFnZSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IFBBR0UpIHsKLSAgY2xhc3Nfb2ZfZGV2aWNlIDogQ2xhc3NPZkRldmljZSwKLSAgYWxsb3dfcm9sZV9zd2l0Y2ggOiA4LAotfQotCi1wYWNrZXQgUGFnZVJlc3BvbnNlIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gUEFHRV9SRVNQT05TRSkgewotICB0cnlfcm9sZV9zd2l0Y2ggOiA4LAotfQotCi1wYWNrZXQgUGFnZVJlamVjdCA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IFBBR0VfUkVKRUNUKSB7Ci0gIHJlYXNvbiA6IDgsCi19Ci0KLXBhY2tldCBSZWFkQ2xvY2tPZmZzZXQgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRUFEX0NMT0NLX09GRlNFVCkgewotfQotCi1wYWNrZXQgUmVhZENsb2NrT2Zmc2V0UmVzcG9uc2UgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRUFEX0NMT0NLX09GRlNFVF9SRVNQT05TRSkgewotICBvZmZzZXQgOiAxNiwKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVTdXBwb3J0ZWRGZWF0dXJlcyA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IFJFQURfUkVNT1RFX1NVUFBPUlRFRF9GRUFUVVJFUykgewotfQotCi1wYWNrZXQgUmVhZFJlbW90ZVN1cHBvcnRlZEZlYXR1cmVzUmVzcG9uc2UgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVNfUkVTUE9OU0UpIHsKLSAgZmVhdHVyZXMgOiA2NCwKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVMbXBGZWF0dXJlcyA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IFJFQURfUkVNT1RFX0xNUF9GRUFUVVJFUykgewotfQotCi1wYWNrZXQgUmVhZFJlbW90ZUxtcEZlYXR1cmVzUmVzcG9uc2UgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRUFEX1JFTU9URV9MTVBfRkVBVFVSRVNfUkVTUE9OU0UpIHsKLSAgZmVhdHVyZXMgOiA2NCwKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVFeHRlbmRlZEZlYXR1cmVzIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gUkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVMpIHsKLSAgcGFnZV9udW1iZXIgOiA4LAotfQotCi1wYWNrZXQgUmVhZFJlbW90ZUV4dGVuZGVkRmVhdHVyZXNSZXNwb25zZSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IFJFQURfUkVNT1RFX0VYVEVOREVEX0ZFQVRVUkVTX1JFU1BPTlNFKSB7Ci0gIHN0YXR1cyA6IDgsCi0gIHBhZ2VfbnVtYmVyIDogOCwKLSAgbWF4X3BhZ2VfbnVtYmVyIDogOCwKLSAgZmVhdHVyZXMgOiA2NCwKLX0KLQotcGFja2V0IFJlYWRSZW1vdGVWZXJzaW9uSW5mb3JtYXRpb24gOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OKSB7Ci19Ci0KLXBhY2tldCBSZWFkUmVtb3RlVmVyc2lvbkluZm9ybWF0aW9uUmVzcG9uc2UgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OX1JFU1BPTlNFKSB7Ci0gIGxtcF92ZXJzaW9uIDogOCwKLSAgbG1wX3N1YnZlcnNpb24gOiA4LAotICBtYW51ZmFjdHVyZXJfbmFtZSA6IDE2LAotfQotCi1wYWNrZXQgUmVtb3RlTmFtZVJlcXVlc3QgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBSRU1PVEVfTkFNRV9SRVFVRVNUKSB7Ci19Ci0KLXBhY2tldCBSZW1vdGVOYW1lUmVxdWVzdFJlc3BvbnNlIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gUkVNT1RFX05BTUVfUkVRVUVTVF9SRVNQT05TRSkgewotICBuYW1lIDogOFsyNDhdLAotfQotCi1wYWNrZXQgU2NvUGFja2V0IDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gU0NPKSB7Ci0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IExlRW5jcnlwdENvbm5lY3Rpb24gOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBMRV9FTkNSWVBUX0NPTk5FQ1RJT04pIHsKLSAgcmFuZCA6IDhbOF0sCi0gIGVkaXYgOiAxNiwKLSAgbHRrIDogOFsxNl0sCi19Ci0KLXBhY2tldCBMZUVuY3J5cHRDb25uZWN0aW9uUmVzcG9uc2UgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBMRV9FTkNSWVBUX0NPTk5FQ1RJT05fUkVTUE9OU0UpIHsKLSAgcmFuZCA6IDhbOF0sCi0gIGVkaXYgOiAxNiwKLSAgbHRrIDogOFsxNl0sCi19Ci0KLWVudW0gU3RhcnRDb250aW51YXRpb24gOiAxIHsKLSAgU1RBUlQgPSAwLAotICBDT05USU5VQVRJT04gPSAxLAotfQotCi1lbnVtIENvbXBsZXRlIDogMSB7Ci0gIElOQ09NUExFVEUgPSAwLAotICBDT01QTEVURSA9IDEsCi19Ci0KLXBhY2tldCBJc29EYXRhUGFja2V0IDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gSVNPKSB7Ci0gIGhhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgc2MgOiBTdGFydENvbnRpbnVhdGlvbiwKLSAgY21wbHQgOiBDb21wbGV0ZSwKLSAgX3Jlc2VydmVkXyA6IDYsCi0gIF9zaXplXyhfcGF5bG9hZF8pIDogMTYsCi0gIF9wYXlsb2FkXywKLX0KLQotcGFja2V0IElzb1N0YXJ0IDogSXNvRGF0YVBhY2tldCAoc2MgPSBTVEFSVCkgewotICB0aW1lX29mZnNldCA6IDI0LAotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBJc29Db250aW51YXRpb24gOiBJc29EYXRhUGFja2V0IChzYyA9IENPTlRJTlVBVElPTikgewotICBfcGF5bG9hZF8sCi19Ci0KLXBhY2tldCBJc29Db25uZWN0aW9uUmVxdWVzdCA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IElTT19DT05ORUNUSU9OX1JFUVVFU1QpIHsKLSAgLy8gR3JvdXAKLSAgY2lnX2lkIDogOCwKLSAgc2R1X2ludGVydmFsX21fdG9fcyA6IDMyLAotICBzZHVfaW50ZXJ2YWxfc190b19tIDogMzIsCi0gIGludGVybGVhdmVkIDogMSwKLSAgZnJhbWVkIDogMSwKLSAgX3Jlc2VydmVkXyA6IDYsCi0gIGxhdGVuY3lfbV90b19zIDogMTYsCi0gIGxhdGVuY3lfc190b19tIDogMTYsCi0gIC8vIFN0cmVhbSBwYXJhbWV0ZXJzCi0gIGlkIDogOCwKLSAgbWF4X3NkdV9tX3RvX3NfIDogMTYsCi0gIG1heF9zZHVfc190b19tXyA6IDE2LAotICAvLyBGb3IgdGhlIHJlc3BvbnNlCi0gIHJlcXVlc3Rlcl9jaXNfaGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICByZXF1ZXN0ZXJfYWNsX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IElzb0Nvbm5lY3Rpb25SZXNwb25zZSAgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBJU09fQ09OTkVDVElPTl9SRVNQT05TRSl7Ci0gIHN0YXR1cyA6IDgsIC8vIEVycm9yQ29kZSAoU1VDQ0VTUyA9PSBjb25uZWN0ZWQpCi0gIHJlcXVlc3Rlcl9jaXNfaGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotICByZXF1ZXN0ZXJfYWNsX2hhbmRsZSA6IDEyLAotICBfcmVzZXJ2ZWRfIDogNCwKLSAgLy8gRm9yIHRoZSBsaW5rIGxheWVyCi0gIHJlc3BvbmRlcl9jaXNfaGFuZGxlIDogMTIsCi0gIF9yZXNlcnZlZF8gOiA0LAotfQotCi1wYWNrZXQgT29iRGF0YSA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IE9PQl9EQVRBKXsKLSAgY19wXzE5NCA6IDhbMTZdLAotICByX3BfMTk0IDogOFsxNl0sCi0gIGNfcF8yNTYgOiA4WzE2XSwKLSAgcl9wXzI1NiA6IDhbMTZdLAotfQotCi1wYWNrZXQgT29iRGF0YVJlc3BvbnNlIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gT09CX0RBVEFfUkVTUE9OU0UpewotICBtYXRjaGVkIDogMSwKLSAgX3Jlc2VydmVkXyA6IDcsCi19Ci0KLWVudW0gUGFzc2tleU5vdGlmaWNhdGlvblR5cGUgOiA4IHsKLSAgRU5UUllfU1RBUlRFRCA9IDB4MDAsCi0gIERJR0lUX0VOVEVSRUQgPSAweDAxLAotICBESUdJVF9FUkFTRUQgPSAweDAyLAotICBDTEVBUkVEID0gMHgwMywKLSAgRU5UUllfQ09NUExFVEVEID0gMHgwNCwKLX0KLQotcGFja2V0IFBhc3NrZXkgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBQQVNTS0VZKXsKLSAgcGFzc2tleSA6IDIwLAotICBfcmVzZXJ2ZWRfIDogNCwKLX0KLQotcGFja2V0IFBhc3NrZXlGYWlsZWQgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBQQVNTS0VZX0ZBSUxFRCl7Ci19Ci0KLXBhY2tldCBLZXlwcmVzc05vdGlmaWNhdGlvbiA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IEtFWVBSRVNTX05PVElGSUNBVElPTil7Ci0gIG5vdGlmaWNhdGlvbl90eXBlIDogUGFzc2tleU5vdGlmaWNhdGlvblR5cGUsCi19Ci0KLXBhY2tldCBQaW5SZXF1ZXN0IDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gUElOX1JFUVVFU1QpIHsKLSAgX3NpemVfKHBpbl9jb2RlKSA6IDUsIC8vIDB4MDEgLSAweDEwCi0gIF9yZXNlcnZlZF8gOiAzLAotICBwaW5fY29kZSA6IDhbXSwgLy8gc3RyaW5nIHBhcmFtZXRlciwgZmlyc3Qgb2N0ZXQgZmlyc3QKLX0KLQotcGFja2V0IFBpblJlc3BvbnNlIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gUElOX1JFU1BPTlNFKSB7Ci0gIF9zaXplXyhwaW5fY29kZSkgOiA1LCAvLyAweDAxIC0gMHgxMAotICBfcmVzZXJ2ZWRfIDogMywKLSAgcGluX2NvZGUgOiA4W10sIC8vIHN0cmluZyBwYXJhbWV0ZXIsIGZpcnN0IG9jdGV0IGZpcnN0Ci19Ci0KLXBhY2tldCBMZVJlYWRSZW1vdGVGZWF0dXJlcyA6IExpbmtMYXllclBhY2tldCAodHlwZSA9IExFX1JFQURfUkVNT1RFX0ZFQVRVUkVTKSB7Ci19Ci0KLXBhY2tldCBMZVJlYWRSZW1vdGVGZWF0dXJlc1Jlc3BvbnNlIDogTGlua0xheWVyUGFja2V0ICh0eXBlID0gTEVfUkVBRF9SRU1PVEVfRkVBVFVSRVNfUkVTUE9OU0UpIHsKLSAgZmVhdHVyZXMgOiA2NCwKLSAgc3RhdHVzIDogOCwKLX0KLQotcGFja2V0IExlQ29ubmVjdGlvblBhcmFtZXRlclJlcXVlc3QgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBMRV9DT05ORUNUSU9OX1BBUkFNRVRFUl9SRVFVRVNUKSB7Ci0gIGludGVydmFsX21pbiA6IDE2LAotICBpbnRlcnZhbF9tYXggOiAxNiwKLSAgbGF0ZW5jeSA6IDE2LAotICB0aW1lb3V0IDogMTYsCi19Ci0KLXBhY2tldCBMZUNvbm5lY3Rpb25QYXJhbWV0ZXJVcGRhdGUgOiBMaW5rTGF5ZXJQYWNrZXQgKHR5cGUgPSBMRV9DT05ORUNUSU9OX1BBUkFNRVRFUl9VUERBVEUpIHsKLSAgc3RhdHVzIDogOCwKLSAgaW50ZXJ2YWwgOiAxNiwKLSAgbGF0ZW5jeSA6IDE2LAotICB0aW1lb3V0IDogMTYsCi19CmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9idWlsZF9hbmRfcnVuLnNoIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvYnVpbGRfYW5kX3J1bi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg3YTE3Zi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9idWlsZF9hbmRfcnVuLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMKLSMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgQnVpbGRzIGFuZCBwdXNoZXMgdGhlIHRlc3QgdmVuZG9yIGxpYnJhcnkgdG8gYSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBzdGFydHMKLSMgbG9nY2F0IHdpdGggcHJvamVjdC1zcGVjaWZpYyB0YWcgZmlsdGVycy4gSWYgdGhlIC0tdGVzdC1jaGFubmVsIGZsYWcgaXMgc2V0LAotIyBsb2djYXQgaXMgc3RhcnRlZCBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgYW5kIHRoZSB0ZXN0IGNoYW5uZWwgaXMgcnVuIGluIHRoZQotIyBjdXJyZW50IHNoZWxsLiBUaGUga1Rlc3RDaGFubmVsRW5hYmxlZCBmbGFnIG11c3QgYmUgc2V0IGluIHRoZSB2ZW5kb3IgbWFuYWdlcgotIyBpZiB0aGUgdGVzdCBjaGFubmVsIGlzIHRvIGJlIHVzZWQuIEFsc28gZW5zdXJlIHRoYXQgJ2x1bmNoJyBoYXMgYmVlbiBydW4gZm9yCi0jIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UuCi0KLWlmIFtbICIkIyIgLW5lIDIgJiYgIiQjIiAtbmUgNCBdXTsgdGhlbgotICBlY2hvICJVc2FnZToiCi0gIGVjaG8gIi4vYnVpbGRfYW5kX3J1bi5zaCBbL3BhdGgvdG8vYW9zcF0gW2RldmljZV9uYW1lXSBvciIKLSAgZWNobyAiLi9idWlsZF9hbmRfcnVuLnNoIFsvcGF0aC90by9hb3NwXSBbZGV2aWNlX25hbWVdIC0tdGVzdC1jaGFubmVsIFtwb3J0XSIKLSAgZXhpdCAxCi1maQotCi0jIEV4aXQgdGhlIHNjcmlwdCBpZiBhbnkgY29tbWFuZCBmYWlscy4KLXNldCAtZQotCi0jIFRoZSBob21lIGRpcmVjdG9yeSBmb3IgQU9TUC4KLUFPU1BfQUJTPSQxCi0jIFRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gYnVpbGQgZm9yLgotREVWSUNFPSQyCi0KLSMgVGhlIGxvY2F0aW9uIG9mIEJsdWV0b290aCB3aXRoaW4gQU9TUC4KLUJUX1JFTD0vc3lzdGVtL2J0Ci1CVF9BQlM9JHtBT1NQX0FCU30ke0JUX1JFTH0KLQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHRlc3QgdmVuZG9yIGxpYnJhcnkuCi1URVNUX1ZFTkRPUl9MSUJfUkVMPS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIKLVRFU1RfVkVORE9SX0xJQl9BQlM9JHtCVF9BQlN9JHtURVNUX1ZFTkRPUl9MSUJfUkVMfQotCi1ERVZJQ0VfVEFSR0VUX1JFTD0vb3V0L3RhcmdldC9wcm9kdWN0Ci1ERVZJQ0VfVEFSR0VUX0FCUz0ke0FPU1BfQUJTfSR7REVWSUNFX1RBUkdFVF9SRUx9Ci0KLVZFTkRPUl9TWU1CT0xTX1JFTD0vc3ltYm9scy9zeXN0ZW0vdmVuZG9yL2xpYgotVkVORE9SX1NZTUJPTFNfQUJTPSR7REVWSUNFX1RBUkdFVF9BQlN9LyR7REVWSUNFfS8ke1ZFTkRPUl9TWU1CT0xTX1JFTH0KLQotIyBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0IGJ1aWx0IGJ5IHRoZSB0ZXN0IHZlbmRvciBsaWJyYXJ5LgotVEVTVF9WRU5ET1JfTElCPXRlc3QtdmVuZG9yLnNvCi0jIFRoZSBuYW1lIG9mIHRoZSByZWd1bGFyIHZlbmRvciBvYmplY3QgdG8gYmUgcmVwbGFjZWQgYnkgJFRFU1RfVkVORE9SX0xJQi4KLVZFTkRPUl9MSUI9bGliYnQtdmVuZG9yLnNvCi0jIFRoZSBjb25maWcgZmlsZSBzcGVjaWZ5aW5nIGNvbnRyb2xsZXIgcHJvcGVydGllcy4KLUNPTlRST0xMRVJfUFJPUEVSVElFUz1jb250cm9sbGVyX3Byb3BlcnRpZXMuanNvbgotCi1pZiBbWyAiJCMiIC1lcSA0ICYmICQzID09ICItLXRlc3QtY2hhbm5lbCIgXV07IHRoZW4KLSAgVEVTVF9DSEFOTkVMX1BPUlQ9JDQKLSAgVEVTVF9DSEFOTkVMX1JFTD0vc2NyaXB0cwotICBURVNUX0NIQU5ORUxfQUJTPSR7VEVTVF9WRU5ET1JfTElCX0FCU30ke1RFU1RfQ0hBTk5FTF9SRUx9Ci0KLSAgIyBTdGFydCBsb2djYXQgaW4gYSBzdWJzaGVsbC4KLSAgeC10ZXJtaW5hbC1lbXVsYXRvciAtZSAic2NyaXB0cy9idWlsZF9hbmRfcnVuLnNoICR7QU9TUF9BQlN9ICR7REVWSUNFfSIKLQotICBlY2hvICJTZXR0aW5nIHVwIGJ1aWxkIGVudmlyb25tZW50LiIKLSAgY2QgJHtBT1NQX0FCU30KLSAgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoCi0KLSAgIyBGb3J3YXJkIGxvY2FsIHBvcnQgdG8gdGhlIHNhbWUgcG9ydCBvbiB0aGUgZGV2aWNlLgotICBlY2hvICJGb3J3YXJkaW5nIHBvcnQgJHtURVNUX0NIQU5ORUxfUE9SVH0gdG8gZGV2aWNlLiIKLSAgYWRiIGZvcndhcmQgdGNwOiR7VEVTVF9DSEFOTkVMX1BPUlR9IHRjcDoke1RFU1RfQ0hBTk5FTF9QT1JUfQotCi0gICMgVHVybiBCbHVldG9vdGggb24uIFJlcXVpcmVzIHVzZXIgYXBwcm92YWwgdmlhIGEgZGlhbG9nIG9uIHRoZSBkZXZpY2UuCi0gIGVjaG8gIkVuYWJsaW5nIEJsdWV0b290aC4gUGxlYXNlIHNlZSBkaWFsb2cgb24gZGV2aWNlLiIKLSAgYWRiIHNoZWxsIGFtIHN0YXJ0IC1hIGFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuYWN0aW9uLlJFUVVFU1RfRU5BQkxFCi0KLSAgIyBTdGFydCB0aGUgdGVzdCBjaGFubmVsIG9uY2UgQmx1ZXRvb3RoIGlzIG9uIGFuZCBsb2djYXQgaGFzIHN0YXJ0ZWQuCi0gIHJlYWQgLXAgIlByZXNzIFtFTlRFUl0gb25jZSBCbHVldG9vdGggaXMgZW5hYmxpbmcgQU5EIGxvZ2NhdCBoYXMgc3RhcnRlZC4iCi0KLSAgIyBTdGFydCB0aGUgdGVzdCBjaGFubmVsLgotICBweXRob24gJHtURVNUX0NIQU5ORUxfQUJTfS90ZXN0X2NoYW5uZWwucHkgbG9jYWxob3N0ICR7VEVTVF9DSEFOTkVMX1BPUlR9Ci1lbHNlCi0gIGVjaG8gIlNldHRpbmcgdXAgYnVpbGQgZW52aXJvbm1lbnQuIgotICBjZCAke0FPU1BfQUJTfQotICBzb3VyY2UgYnVpbGQvZW52c2V0dXAuc2gKLQotICBlY2hvICJOYXZpZ2F0aW5nIHRvIHRlc3QgdmVuZG9yIGxpYnJhcnk6ICR7VEVTVF9WRU5ET1JfTElCX0FCU30iCi0gIGNkICR7VEVTVF9WRU5ET1JfTElCX0FCU30KLQotICBlY2hvICJCdWlsZGluZyB0ZXN0IHZlbmRvciBsaWJyYXJ5LiIKLSAgbW0KLQotICBlY2hvICJSZW1vdW50aW5nIGRldmljZSByb290ZnMuIgotICBhZGIgc2hlbGwgbW91bnQgLW8gcmVtb3VudCxydyAvCi0gIGFkYiByZW1vdW50Ci0KLSAgIyBSZXBsYWNlIHRoZSBhY3R1YWwgdmVuZG9yIGxpYnJhcnkgd2l0aCB0aGUgdGVzdCB2ZW5kb3IgbGlicmFyeS4KLSAgbXYgJHtERVZJQ0VfVEFSR0VUX0FCU30vJHtERVZJQ0V9L3N5c3RlbS9saWIvJHtURVNUX1ZFTkRPUl9MSUJ9IFwKLSAgICAke1ZFTkRPUl9TWU1CT0xTX0FCU30vJHtWRU5ET1JfTElCfQotCi0gICMgUHVzaCB0aGUgdGVzdCB2ZW5kb3IgbGlicmFyeSB0byB0aGUgZGV2aWNlLgotICBlY2hvICJQdXNoaW5nIHRoZSB0ZXN0IHZlbmRvciBsaWJyYXJ5IHRvIGRldmljZTogJERFVklDRSIKLSAgYWRiIHB1c2ggJHtWRU5ET1JfU1lNQk9MU19BQlN9LyR7VkVORE9SX0xJQn0gL3ZlbmRvci9saWIKLQotICBlY2hvICJQdXNoaW5nIGNvbnRyb2xsZXIgcHJvcGVydGllcy4iCi0gIGFkYiBwdXNoICR7VEVTVF9WRU5ET1JfTElCX0FCU30vZGF0YS8ke0NPTlRST0xMRVJfUFJPUEVSVElFU30gL3ZlbmRvci9ldGMvYmx1ZXRvb3RoLwotCi0gIGVjaG8gIlB1c2hpbmcgbGliZXZlbnQuIgotICBhZGIgcHVzaCAke0RFVklDRV9UQVJHRVRfQUJTfS8ke0RFVklDRX0vc3lzdGVtL2xpYi9saWJldmVudC5zbyAvc3lzdGVtL2xpYi8KLQotICBlY2hvICJQdXNoaW5nIGxpYmNocm9tZS4iCi0gIGFkYiBwdXNoICR7REVWSUNFX1RBUkdFVF9BQlN9LyR7REVWSUNFfS9zeXN0ZW0vbGliL2xpYmNocm9tZS5zbyAvc3lzdGVtL2xpYi8KLQotICAjIENsZWFyIGxvZ2NhdC4KLSAgYWRiIGxvZ2NhdCAtYwotCi0gICMgUnVuIGxvZ2NhdCB3aXRoIGZpbHRlcnMuCi0gIGFkYiBsb2djYXQgYnRfYnRpZjpEIGJ0X2J0aWZfY29yZTpEIGJ0X2hjaTpEIGJ0X21haW46RCBidF92ZW5kb3I6RCBcCi0gICBidGVfbG9nbXNnOkQgY29tbWFuZF9wYWNrZXQ6RCBkdWFsX21vZGVfY29udHJvbGxlcjpEIGV2ZW50X3BhY2tldDpEIFwKLSAgIGhjaV90cmFuc3BvcnQ6RCBoY2lfaGFuZGxlcjpEIHBhY2tldDpEIHBhY2tldF9zdHJlYW06RCBcCi0gICB0ZXN0X2NoYW5uZWxfdHJhbnNwb3J0OkQgdmVuZG9yX21hbmFnZXI6RCAqOlMKLWZpCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9oY2lfc29ja2V0LnB5IGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvaGNpX3NvY2tldC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjU3Ny4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9oY2lfc29ja2V0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0iIiJTY3JpcHQgZm9yIHNlbmRpbmcgZGF0YSB0byBhIHBvcnQuCi0KLVRoaXMgc2NyaXB0IHByb3ZpZGVzIGEgc2ltcGxlIHNoZWxsIGludGVyZmFjZSBmb3Igc2VuZGluZyBkYXRhIGF0IHJ1bi10aW1lIHRvIGEKLXBvcnQuCi0KLVVzYWdlOgotICAgIDEuIENob29zZSBhIHBvcnQgdG8gdXNlLiBVc2UgJ2FkYiBmb3J3YXJkIHRjcDo8cG9ydD4KLSAgICB0Y3A6PHBvcnQ+JyB0byBmb3J3YXJkIHRoZSBwb3J0IHRvIHRoZSBkZXZpY2UuCi0gICAgMi4gSW4gYSBzZXBhcmF0ZSBzaGVsbCwgYnVpbGQgYW5kIHB1c2ggdGhlIHRlc3QgdmVuZG9yIGxpYnJhcnkgdG8gdGhlIGRldmljZQotICAgIHVzaW5nIHRoZSBzY3JpcHQgbWVudGlvbmVkIGluIG9wdGlvbiBBIChpLmUuIHdpdGhvdXQgdGhlIC0tdGVzdC1jaGFubmVsIGZsYWcKLSAgICBzZXQpLgotICAgIDMuIE9uY2UgbG9nY2F0IGhhcyBzdGFydGVkLCB0dXJuIEJsdWV0b290aCBvbiBmcm9tIHRoZSBkZXZpY2UuCi0gICAgNC4gUnVuIHRoaXMgcHJvZ3JhbSwgaW4gdGhlIHNoZWxsIGZyb20gc3RlcCAxLCAgdGhlIHBvcnQsIGFsc28gZnJvbSBzdGVwIDEsCi0gICAgYXMgYXJndW1lbnRzLgotCi0gICAgc2NhcHkgaXMgdGhlIHRvb2wgd2UgdXNlIHRvIGJ1aWxkIHBhY2tldHMgaW4gUHl0aG9uLgotCi0gICAgPj4+IGQgPSBIQ0lfSGRyKHR5cGU9MSkgLyBIQ0lfQ29tbWFuZF9IZHIob3Bjb2RlID0gMHgxMDA0KSAvCi0gICAgUmF3KGxvYWQ9J1x4MDEnKQotICAgID4+PiBwcmludChkKQotICAgIDxIQ0lfSGRyICB0eXBlPUNvbW1hbmQgfDxIQ0lfQ29tbWFuZF9IZHIgIG9wY29kZT0weDEwMDQgfDxSYXcgIGxvYWQ9J1x4MDEnCi0gICAgfD4+PgotICAgID4+PiByYXcoZCkKLSAgICAnXHgwMVx4MDRceDEwXHgwMVx4MDEnCi0gICAgPj4+IGhleGR1bXAoZCkKLSAgICAwMDAwICAwMTA0MTAwMTAxICAgICAgICAgICAgICAgICAgICAgICAuLi4uLgotCi0KLSAgICA+Pj4gcGt0ID0gSENJX0hkcignXHgwMlx4MDJceDIwXHgwYVx4MDBceDA2XHgwMFx4MDFceDAwJykgLwotICAgIEwyQ0FQX0NtZEhkcihjb2RlPTEwLCBpZD0yLCBsZW49MikgL0wyQ0FQX0luZm9SZXEodHlwZT0yKQotICAgID4+PiBwa3QKLSAgICA8SENJX0hkciAgdHlwZT1BQ0wgRGF0YSB8PEhDSV9BQ0xfSGRyICBoYW5kbGU9MiBQQj0wIEJDPTIgbGVuPTEwIHw8TDJDQVBfSGRyCi0gICAgbGVuPTYgY2lkPWNvbnRyb2wgfDxMMkNBUF9DbWRIZHIgIGNvZGU9aW5mb19yZXEgaWQ9MiBsZW49MiB8PEwyQ0FQX0luZm9SZXEKLSAgICB0eXBlPUZFQVRfTUFTSyB8Pj4+Pj4KLSAgICA+Pj4gcGt0ID0gSENJX0hkcih0eXBlPSdBQ0wgRGF0YScpIC8gSENJX0FDTF9IZHIoaGFuZGxlPTIsIFBCPTAsIEJDPTIsCi0gICAgbGVuPTEwKSAvIEwyQ0FQX0hkcihsZW49NiwgY2lkPSdjb250cm9sJykgLyBMMkNBUF9DbWRIZHIoY29kZT0naW5mb19yZXEnLAotICAgIGlkPTIsIGxlbj0yKSAvIEwyQ0FQX0luZm9SZXEodHlwZT0nRkVBVF9NQVNLJykKLSAgICA+Pj4gcmF3KHBrdCkKLSAgICAnXHgwMlx4MDIgXG5ceDAwXHgwNlx4MDBceDAxXHgwMFxuXHgwMlx4MDJceDAwXHgwMlx4MDAnCi0gICAgPj4+IGhleGR1bXAocGt0KQotICAgIDAwMDAgIDAyMDIyMDBBMDAwNjAwMDEwMDBBMDIwMjAwMDIwMCAgIC4uIC4uLi4uLi4uLi4uLgotCi0KLSIiIgotCi0jIS91c3IvYmluL2VudiBweXRob24zCi0KLWltcG9ydCBiaW5hc2NpaQotaW1wb3J0IGNtZAotaW1wb3J0IHF1ZXVlCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3lzCi1mcm9tIHNjYXB5LmFsbCBpbXBvcnQgKgotaW1wb3J0IHRpbWUKLSIiIiBBZGQgc29tZSBtb3JlIFNDQVBZIHN0dWZmIiIiCi0KLQotY2xhc3MgSENJX0NtZF9DcmVhdGVfQ29ubmVjdGlvbihQYWNrZXQpOgotICAgIG5hbWUgPSAnQ3JlYXRlIENvbm5lY3Rpb24nCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIExFTUFDRmllbGQoJ2FkZHInLCBOb25lKSwKLSAgICAgICAgTEVTaG9ydEZpZWxkKCdwYWNrZXRfdHlwZScsIDgpLAotICAgICAgICBCeXRlRW51bUZpZWxkKCdwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlJywgMCwgewotICAgICAgICAgICAgMDogJ1IwJywKLSAgICAgICAgICAgIDE6ICdSMScsCi0gICAgICAgICAgICAyOiAnUjInCi0gICAgICAgIH0pLAotICAgICAgICBCeXRlRW51bUZpZWxkKCdyc3ZkJywgMCwgezA6ICdSZXNlcnZlZCd9KSwKLSAgICAgICAgTEVTaG9ydEZpZWxkKCdjbG9ja19vZmZzZXQnLCAwKSwKLSAgICAgICAgQnl0ZUVudW1GaWVsZCgnYWxsb3dfcm9sZV9zd2l0Y2gnLCAxLCB7Ci0gICAgICAgICAgICAwOiAnZmFsc2UnLAotICAgICAgICAgICAgMTogJ3RydWUnCi0gICAgICAgIH0pLAotICAgIF0KLQotCi1jbGFzcyBIQ0lfQ21kX0lucXVpcnkoUGFja2V0KToKLSAgICBuYW1lID0gJ0lucXVpcnknCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIFgzQnl0ZXNGaWVsZCgnTEFQJywgMHg5ZThiMCksCi0gICAgICAgIEJ5dGVGaWVsZCgnbGVuZ3RoJywgMSksCi0gICAgICAgIEJ5dGVGaWVsZCgnbWF4X3Jlc3BvbnNlcycsIDApLAotICAgIF0KLQotCi1iaW5kX2xheWVycyhIQ0lfQ29tbWFuZF9IZHIsIEhDSV9DbWRfSW5xdWlyeSwgb3Bjb2RlPTB4MDQwMSkKLWJpbmRfbGF5ZXJzKEhDSV9Db21tYW5kX0hkciwgSENJX0NtZF9DcmVhdGVfQ29ubmVjdGlvbiwgb3Bjb2RlPTB4MDQwNSkKLQotCi1jbGFzcyBIQ0lfRXZlbnRfSW5xdWlyeV9SZXN1bHQoUGFja2V0KToKLSAgICBuYW1lID0gJ0lucXVpcnkgUmVzdWx0JwotICAgIGZpZWxkc19kZXNjID0gWwotICAgICAgICBCeXRlRmllbGQoJ251bV9yZXNwb25zZXMnLCAwKSwKLSAgICAgICAgTEVNQUNGaWVsZCgnYWRkcicsIE5vbmUpLAotICAgICAgICBCeXRlRW51bUZpZWxkKCdwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlJywgMCwgewotICAgICAgICAgICAgMDogJ1IwJywKLSAgICAgICAgICAgIDE6ICdSMScsCi0gICAgICAgICAgICAyOiAnUjInCi0gICAgICAgIH0pLAotICAgICAgICBMRVNob3J0RW51bUZpZWxkKCdyc3ZkJywgMCwgezA6ICdSZXNlcnZlZCd9KSwKLSAgICAgICAgWDNCeXRlc0ZpZWxkKCdjbGFzc19vZl9kZXZpY2UnLCAwKSwKLSAgICAgICAgTEVTaG9ydEZpZWxkKCdjbG9ja19vZmZzZXQnLCAwKSwKLSAgICBdCi0KLQotY2xhc3MgSENJX0V2ZW50X0Nvbm5lY3Rpb25fQ29tcGxldGUoUGFja2V0KToKLSAgICBuYW1lID0gJ0Nvbm5lY3Rpb24gQ29tcGxldGUnCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIEJ5dGVGaWVsZCgnc3RhdHVzJywgMCksCi0gICAgICAgIExFU2hvcnRGaWVsZCgnaGFuZGxlJywgMHhmZmZmKSwKLSAgICAgICAgTEVNQUNGaWVsZCgnYWRkcicsIE5vbmUpLAotICAgICAgICBCeXRlRmllbGQoJ2xpbmtfdHlwZScsIDEpLAotICAgICAgICBCeXRlRmllbGQoJ2VuY3J5cHRpb25fbW9kZScsIDApLAotICAgIF0KLQotCi1jbGFzcyBIQ0lfRXZlbnRfUmVtb3RlX05hbWVfUmVxdWVzdF9Db21wbGV0ZShQYWNrZXQpOgotICAgIG5hbWUgPSAnUmVtb3RlIE5hbWUgUmVxdWVzdCBDb21wbGV0ZScKLSAgICBmaWVsZHNfZGVzYyA9IFsKLSAgICAgICAgQnl0ZUZpZWxkKCdzdGF0dXMnLCAwKSwKLSAgICAgICAgTEVNQUNGaWVsZCgnYWRkcicsIE5vbmUpLAotICAgIF0KLQotCi1jbGFzcyBIQ0lfRXZlbnRfUmVhZF9SZW1vdGVfU3VwcG9ydGVkX0ZlYXR1cmVzX0NvbXBsZXRlKFBhY2tldCk6Ci0gICAgbmFtZSA9ICdSZWFkIFJlbW90ZSBTdXBwb3J0ZWQgRmVhdHVyZXMgQ29tcGxldGUnCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIEJ5dGVGaWVsZCgnc3RhdHVzJywgMCksCi0gICAgICAgIExFU2hvcnRGaWVsZCgnaGFuZGxlJywgMHhmZmZmKSwKLSAgICAgICAgWExFTG9uZ0ZpZWxkKCdmZWF0dXJlcycsIDB4MDEyMzQ1Njc4OWFiY2RlZiksCi0gICAgXQotCi0KLWNsYXNzIEhDSV9FdmVudF9SZWFkX1JlbW90ZV9WZXJzaW9uX0luZm9ybWF0aW9uX0NvbXBsZXRlKFBhY2tldCk6Ci0gICAgbmFtZSA9ICdSZWFkIFJlbW90ZSBWZXJzaW9uIEluZm9ybWF0aW9uIENvbXBsZXRlJwotICAgIGZpZWxkc19kZXNjID0gWwotICAgICAgICBCeXRlRmllbGQoJ3N0YXR1cycsIDApLAotICAgICAgICBMRVNob3J0RmllbGQoJ2hhbmRsZScsIDB4ZmZmZiksCi0gICAgICAgIEJ5dGVGaWVsZCgndmVyc2lvbicsIDApLAotICAgICAgICBMRVNob3J0RmllbGQoJ21hbnVmYWN0dXJlcl9uYW1lJywgMCksCi0gICAgICAgIExFU2hvcnRGaWVsZCgnc3VidmVyc2lvbicsIDApLAotICAgIF0KLQotCi1jbGFzcyBIQ0lfRXZlbnRfUmVhZF9DbG9ja19PZmZzZXRfQ29tcGxldGUoUGFja2V0KToKLSAgICBuYW1lID0gJ1JlYWQgQ2xvY2sgT2Zmc2V0IENvbXBsZXRlJwotICAgIGZpZWxkc19kZXNjID0gWwotICAgICAgICBCeXRlRmllbGQoJ3N0YXR1cycsIDApLAotICAgICAgICBMRVNob3J0RmllbGQoJ2hhbmRsZScsIDB4ZmZmZiksCi0gICAgICAgIExFU2hvcnRGaWVsZCgnb2Zmc2V0JywgMHhmZmZmKSwKLSAgICBdCi0KLQotY2xhc3MgSENJX0V2ZW50X1JlYWRfUmVtb3RlX0V4dGVuZGVkX0ZlYXR1cmVzX0NvbXBsZXRlKFBhY2tldCk6Ci0gICAgbmFtZSA9ICdSZWFkIFJlbW90ZSBTdXBwb3J0ZWQgRmVhdHVyZXMgQ29tcGxldGUnCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIEJ5dGVGaWVsZCgnc3RhdHVzJywgMCksCi0gICAgICAgIExFU2hvcnRGaWVsZCgnaGFuZGxlJywgMHhmZmZmKSwKLSAgICAgICAgQnl0ZUZpZWxkKCdwYWdlX251bWJlcicsIDApLAotICAgICAgICBCeXRlRmllbGQoJ21heF9wYWdlX251bWJlcicsIDApLAotICAgICAgICBYTEVMb25nRmllbGQoJ2ZlYXR1cmVzJywgMHgwMTIzNDU2Nzg5YWJjZGVmKSwKLSAgICBdCi0KLQotY2xhc3MgSENJX0V2ZW50X0V4dGVuZGVkX0lucXVpcnlfUmVzdWx0KFBhY2tldCk6Ci0gICAgbmFtZSA9ICdFeHRlbmRlZCBJbnF1aXJ5IFJlc3VsdCcKLSAgICBmaWVsZHNfZGVzYyA9IFsKLSAgICAgICAgQnl0ZUZpZWxkKCdudW1fcmVzcG9uc2VzJywgMSksCi0gICAgICAgIExFTUFDRmllbGQoJ2FkZHInLCBOb25lKSwKLSAgICAgICAgQnl0ZUVudW1GaWVsZCgncGFnZV9zY2FuX3JlcGV0aXRpb25fbW9kZScsIDAsIHsKLSAgICAgICAgICAgIDA6ICdSMCcsCi0gICAgICAgICAgICAxOiAnUjEnLAotICAgICAgICAgICAgMjogJ1IyJwotICAgICAgICB9KSwKLSAgICAgICAgQnl0ZUVudW1GaWVsZCgncnN2ZCcsIDAsIHswOiAnUmVzZXJ2ZWQnfSksCi0gICAgICAgIFgzQnl0ZXNGaWVsZCgnY2xhc3Nfb2ZfZGV2aWNlJywgMCksCi0gICAgICAgIExFU2hvcnRGaWVsZCgnY2xvY2tfb2Zmc2V0JywgMCksCi0gICAgICAgIFNpZ25lZEJ5dGVGaWVsZCgncnNzaScsIC0yMCksCi0gICAgICAgIFBhY2tldExpc3RGaWVsZCgnZXh0ZW5kZWRfaW5xdWlyeV9yZXNwb25zZScsIFtdLCBFSVJfSGRyLCAxKSwKLSAgICBdCi0KLQotYmluZF9sYXllcnMoSENJX0V2ZW50X0hkciwgSENJX0V2ZW50X0lucXVpcnlfUmVzdWx0LCBjb2RlPTB4MDIpCi1iaW5kX2xheWVycyhIQ0lfRXZlbnRfSGRyLCBIQ0lfRXZlbnRfQ29ubmVjdGlvbl9Db21wbGV0ZSwgY29kZT0weDAzKQotYmluZF9sYXllcnMoSENJX0V2ZW50X0hkciwgSENJX0V2ZW50X1JlbW90ZV9OYW1lX1JlcXVlc3RfQ29tcGxldGUsIGNvZGU9MHgwNykKLWJpbmRfbGF5ZXJzKEhDSV9FdmVudF9IZHIsIEhDSV9FdmVudF9SZWFkX1JlbW90ZV9TdXBwb3J0ZWRfRmVhdHVyZXNfQ29tcGxldGUsIGNvZGU9MHgwYikKLWJpbmRfbGF5ZXJzKEhDSV9FdmVudF9IZHIsIEhDSV9FdmVudF9SZWFkX1JlbW90ZV9WZXJzaW9uX0luZm9ybWF0aW9uX0NvbXBsZXRlLCBjb2RlPTB4MGMpCi1iaW5kX2xheWVycyhIQ0lfRXZlbnRfSGRyLCBIQ0lfRXZlbnRfUmVhZF9DbG9ja19PZmZzZXRfQ29tcGxldGUsIGNvZGU9MHgxYykKLWJpbmRfbGF5ZXJzKEhDSV9FdmVudF9IZHIsIEhDSV9FdmVudF9SZWFkX1JlbW90ZV9FeHRlbmRlZF9GZWF0dXJlc19Db21wbGV0ZSwgY29kZT0weDIzKQotYmluZF9sYXllcnMoSENJX0V2ZW50X0hkciwgSENJX0V2ZW50X0V4dGVuZGVkX0lucXVpcnlfUmVzdWx0LCBjb2RlPTB4MmYpCi0iIiIgRU5EIFNDQVBZIHN0dWZmIiIiCi0KLQotY2xhc3MgSENJU29ja2V0KFN1cGVyU29ja2V0KToKLSAgICAiIiJTaW1wbGUgd3JhcHBlciBjbGFzcyBmb3IgYSBzb2NrZXQgb2JqZWN0LgotCi0gIEF0dHJpYnV0ZXM6Ci0gICAgc29ja2V0OiBUaGUgdW5kZXJseWluZyBzb2NrZXQgY3JlYXRlZCBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFuZCBwb3J0LgotICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0KToKLSAgICAgICAgc2VsZi5kb25lXyA9IEZhbHNlCi0gICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgICAgIHMuY29ubmVjdCgoJ2xvY2FsaG9zdCcsIHBvcnQpKQotICAgICAgICBzZWxmLmlucyA9IHNlbGYub3V0cyA9IHMKLSAgICAgICAgc2VsZi5wYWNrZXRzXyA9IHF1ZXVlLlF1ZXVlKCkKLSAgICAgICAgc2VsZi5yeF90aHJlYWRfID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5yeF90aHJlYWRfYm9keSkKLSAgICAgICAgc2VsZi5yeF90aHJlYWRfLnN0YXJ0KCkKLQotICAgIGRlZiByeF9ieXRlcyhzZWxmLCBzaXplKToKLSAgICAgICAgd2hpbGUgbm90IHNlbGYuZG9uZV86Ci0gICAgICAgICAgICByYXdfYnl0ZXMgPSBiJycKLSAgICAgICAgICAgIHdoaWxlIGxlbihyYXdfYnl0ZXMpIDwgc2l6ZSBhbmQgbm90IHNlbGYuZG9uZV86Ci0gICAgICAgICAgICAgICAgbW9yZV9yYXdfYnl0ZXMgPSBzZWxmLmlucy5yZWN2KG1pbihzaXplIC0gbGVuKHJhd19ieXRlcyksIDIwNDgpKQotICAgICAgICAgICAgICAgIGlmIG1vcmVfcmF3X2J5dGVzOgotICAgICAgICAgICAgICAgICAgICByYXdfYnl0ZXMgKz0gbW9yZV9yYXdfYnl0ZXMKLSAgICAgICAgICAgIHJldHVybiByYXdfYnl0ZXMKLQotICAgIGRlZiByeF90aHJlYWRfYm9keShzZWxmKToKLSAgICAgICAgd2hpbGUgbm90IHNlbGYuZG9uZV86Ci0gICAgICAgICAgICBwYXlsb2FkX2xlbmd0aCA9IDAKLSAgICAgICAgICAgICMgUmVhZCB0aGUgdHlwZQotICAgICAgICAgICAgdHlwZV9ieXRlID0gc2VsZi5yeF9ieXRlcygxKQotICAgICAgICAgICAgaWYgbm90IHR5cGVfYnl0ZToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgIyBSZWFkIHRoZSBIZWFkZXIKLSAgICAgICAgICAgIGhlYWRlciA9IGInJwotICAgICAgICAgICAgaWYgdHlwZV9ieXRlID09IGInXHgwMSc6ICAjIENvbW1hbmQKLSAgICAgICAgICAgICAgICBoZWFkZXIgPSBzZWxmLnJ4X2J5dGVzKDMpCi0gICAgICAgICAgICAgICAgaWYgbm90IGhlYWRlcjoKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBwYXlsb2FkX2xlbmd0aCA9IGhlYWRlclsyXQotICAgICAgICAgICAgZWxpZiB0eXBlX2J5dGUgPT0gYidceDAyJzogICMgQUNMCi0gICAgICAgICAgICAgICAgaGVhZGVyID0gc2VsZi5yeF9ieXRlcyg0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBoZWFkZXI6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGggPSBoZWFkZXJbM10gPDwgOAotICAgICAgICAgICAgICAgIHBheWxvYWRfbGVuZ3RoIHw9IGhlYWRlclsyXQotICAgICAgICAgICAgZWxpZiB0eXBlX2J5dGUgPT0gYidceDAzJzogICMgU0NPCi0gICAgICAgICAgICAgICAgaGVhZGVyID0gc2VsZi5yeF9ieXRlcygzKQotICAgICAgICAgICAgICAgIGlmIG5vdCBoZWFkZXI6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGggPSBoZWFkZXJbMl0KLSAgICAgICAgICAgIGVsaWYgdHlwZV9ieXRlID09IGInXHgwNCc6ICAjIEV2ZW50Ci0gICAgICAgICAgICAgICAgaGVhZGVyID0gc2VsZi5yeF9ieXRlcygyKQotICAgICAgICAgICAgICAgIGlmIG5vdCBoZWFkZXI6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGggPSBoZWFkZXJbMV0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5kb25lXyA9IFRydWUKLSAgICAgICAgICAgICAgICBwcmludCgnUng6IHR5cGVfYnl0ZSAnICsgaGV4KHR5cGVfYnl0ZVswXSkpCi0gICAgICAgICAgICAjIFJlYWQgdGhlIFBheWxvYWQKLSAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLnJ4X2J5dGVzKHBheWxvYWRfbGVuZ3RoKSBpZiBwYXlsb2FkX2xlbmd0aCAhPSAwIGVsc2UgYicnCi0gICAgICAgICAgICBwYWNrZXRfYnl0ZXMgPSB0eXBlX2J5dGUgKyBoZWFkZXIgKyBwYXlsb2FkCi0gICAgICAgICAgICBwYWNrZXQgPSBIQ0lfSGRyKHBhY2tldF9ieXRlcykKLSAgICAgICAgICAgIHByaW50KCdSeDogJyArIHBhY2tldC5fX3JlcHJfXygpKQotICAgICAgICAgICAgc2VsZi5wYWNrZXRzXy5wdXQocGFja2V0KQotCi0gICAgZGVmIGdldF9wYWNrZXQoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYucGFja2V0c18uZW1wdHkoKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gc2VsZi5wYWNrZXRzXy5nZXQoKQotCi0gICAgZGVmIHRlbGxfcnhfdGhyZWFkX3RvX3F1aXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZG9uZV8gPSBUcnVlCi0gICAgICAgIHNlbGYucnhfdGhyZWFkXy5qb2luKCkKLQotCi1jbGFzcyBIQ0lTaGVsbChjbWQuQ21kKToKLSAgICAiIiJTaGVsbCBmb3Igc2VuZGluZyBiaW5hcnkgZGF0YSB0byBhIHBvcnQuCi0KLSAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaGNpKToKLSAgICAgICAgY21kLkNtZC5fX2luaXRfXyhzZWxmKQotICAgICAgICBzZWxmLl9oY2kgPSBoY2kKLQotICAgIGRlZiBkb19zZW5kKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IGRldl90eXBlX3N0ciBBZGQgYSBuZXcgZGV2aWNlIG9mIHR5cGUgZGV2X3R5cGVfc3RyLgotCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX2hjaS5zZW5kX2JpbmFyeShhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fY29ubmVjdChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBibHVldG9vdGhfYWRkcmVzcyB4eDp4eDp4eDp4eDp4eDp4eCwgdGltZW91dCAoc2Vjb25kcykKLQotICAgICIiIgotICAgICAgICBzcGxpdF9hcmdzID0gYXJncy5zcGxpdCgpCi0gICAgICAgIGFkZHJlc3MgPSBzcGxpdF9hcmdzWzBdIGlmIGxlbihzcGxpdF9hcmdzKSA+IDAgZWxzZSAnTlVMTCcKLSAgICAgICAgdGltZW91dCA9IGludChzcGxpdF9hcmdzWzFdKSBpZiBsZW4oc3BsaXRfYXJncykgPiAxIGVsc2UgMgotICAgICAgICBudW1fcmVzcG9uc2VzID0gMAotICAgICAgICBjb25uZWN0ID0gSENJX0hkcih0eXBlPSdDb21tYW5kJykgLyBIQ0lfQ29tbWFuZF9IZHIob3Bjb2RlPTB4MDQwNSkgLyBIQ0lfQ21kX0NyZWF0ZV9Db25uZWN0aW9uKGFkZHI9YWRkcmVzcykKLSAgICAgICAgc2VsZi5faGNpLnNlbmQoY29ubmVjdCkKLSAgICAgICAgc3RhdHVzID0gTm9uZQotICAgICAgICB3aGlsZSBzdGF0dXMgPT0gTm9uZToKLSAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5faGNpLmdldF9wYWNrZXQoKQotICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gRmFsc2U6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIHJlc3BvbnNlW0hDSV9IZHJdLnR5cGUgPT0gSENJX0hkcigKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0nRXZlbnQnCi0gICAgICAgICAgICApLnR5cGUgYW5kIHJlc3BvbnNlW0hDSV9FdmVudF9IZHJdLmNvZGUgPT0gMHhmIGFuZCByZXNwb25zZVtIQ0lfRXZlbnRfQ29tbWFuZF9TdGF0dXNdLm9wY29kZSA9PSBjb25uZWN0W0hDSV9Db21tYW5kX0hkcl0ub3Bjb2RlOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlW0hDSV9FdmVudF9Db21tYW5kX1N0YXR1c10uc3RhdHVzCi0gICAgICAgIGlmIHN0YXR1cyAhPSBIQ0lfRXZlbnRfQ29tbWFuZF9TdGF0dXMoc3RhdHVzPSdwZW5kaW5nJykuc3RhdHVzOgotICAgICAgICAgICAgcHJpbnQoJ0Nvbm5lY3Rpb24gZmFpbGVkIHdpdGggc3RhdHVzID0gJyArIHN0cihzdGF0dXMpKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgaGFuZGxlID0gTm9uZQotICAgICAgICB3aGlsZSBoYW5kbGUgPT0gTm9uZToKLSAgICAgICAgICAgIGNvbm5lY3Rpb25fY29tcGxldGUgPSBzZWxmLl9oY2kuZ2V0X3BhY2tldCgpCi0gICAgICAgICAgICBpZiBjb25uZWN0aW9uX2NvbXBsZXRlID09IEZhbHNlOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiAoY29ubmVjdGlvbl9jb21wbGV0ZVtIQ0lfSGRyXS50eXBlID09IEhDSV9IZHIodHlwZT0nRXZlbnQnKS50eXBlKSBhbmQgKAotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX2NvbXBsZXRlW0hDSV9FdmVudF9IZHJdLmNvZGUgPT0gMHgzKToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb25uZWN0aW9uX2NvbXBsZXRlW0hDSV9FdmVudF9Db25uZWN0aW9uX0NvbXBsZXRlXS5zdGF0dXMKLSAgICAgICAgICAgICAgICBpZiBzdGF0dXMgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ0Nvbm5lY3Rpb24gY29tcGxldGUgd2l0aCBmYWlsZWQgc3RhdHVzID0gJyArIHN0cihzdGF0dXMpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBjb25uZWN0aW9uX2NvbXBsZXRlW0hDSV9FdmVudF9Db25uZWN0aW9uX0NvbXBsZXRlXS5oYW5kbGUKLSAgICAgICAgICAgICAgICBwcmludCgnQ29ubmVjdGlvbiBlc3RhYmxpc2hlZCB3aXRoIGhhbmRsZSAnICsgc3RyKGhhbmRsZSkpCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbl9jb21wbGV0ZS5zaG93KCkKLSAgICAgICAgICAgICAgICBoZXhkdW1wKGNvbm5lY3Rpb25fY29tcGxldGUpCi0KLSAgICAgICAgbDJjYXBfZG9uZSA9IEZhbHNlCi0gICAgICAgIHdoaWxlIGwyY2FwX2RvbmUgPT0gTm9uZToKLSAgICAgICAgICAgIGwyY2FwX3JlcSA9IHNlbGYuX2hjaS5nZXRfcGFja2V0KCkKLSAgICAgICAgICAgIGlmIGwyY2FwX3JlcSA9PSBGYWxzZToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgKGwyY2FwX3JlcVtIQ0lfSGRyXS50eXBlID09IEhDSV9IZHIodHlwZT0nQUNMIERhdGEnKS50eXBlKSBhbmQgKGwyY2FwX3JlcVtMMkNBUF9IZHJdLmNpZCA9PSBMMkNBUF9IZHIoCi0gICAgICAgICAgICAgICAgICAgIGNpZD0nY29udHJvbCcpLmNpZCkgYW5kIChsMmNhcF9yZXFbTDJDQVBfQ21kSGRyXS5jb2RlID09IEwyQ0FQX0NtZEhkcihjb2RlPSdpbmZvX3JlcScpLmNvZGUpIGFuZCAoCi0gICAgICAgICAgICAgICAgICAgICAgICBsMmNhcF9yZXFbTDJDQVBfSW5mb1JlcV0udHlwZSA9PSBMMkNBUF9JbmZvUmVxKHR5cGU9J0ZFQVRfTUFTSycpLnR5cGUpOgotICAgICAgICAgICAgICAgIHByaW50KCdTZW5kIEZlYXR1cmVzIHBhY2tldCcgKwotICAgICAgICAgICAgICAgICAgICAgIEhDSV9IZHIodHlwZT0nQUNMIERhdGEnKSAvIEhDSV9BQ0xfSGRyKGhhbmRsZT1sMmNhcF9yZXFbSENJX0FDTF9IZHJdLmhhbmRsZSwgUEI9MCwgQkM9MiwgbGVuPTE2KSAvCi0gICAgICAgICAgICAgICAgICAgICAgTDJDQVBfSGRyKGxlbj0xMiwgY2lkPSdjb250cm9sJykgLyBMMkNBUF9DbWRIZHIoY29kZT0naW5mb19yZXNwJywgaWQ9MTQ2LCBsZW49OCkgLyBMMkNBUF9JbmZvUmVzcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1sMmNhcF9yZXFbTDJDQVBfSW5mb1Jlc3BdLnR5cGUsIHJlc3VsdD0nc3VjY2VzcycsIGRhdGE9YidceGI4XHgwMFx4MDBceDAwJykuX19yZXByX18oKSkKLSAgICAgICAgICAgICAgICBzZWxmLl9oY2kuc2VuZCgKLSAgICAgICAgICAgICAgICAgICAgSENJX0hkcih0eXBlPSdBQ0wgRGF0YScpIC8gSENJX0FDTF9IZHIoaGFuZGxlPWwyY2FwX3JlcVtIQ0lfQUNMX0hkcl0uaGFuZGxlLCBQQj0wLCBCQz0yLCBsZW49MTYpIC8KLSAgICAgICAgICAgICAgICAgICAgTDJDQVBfSGRyKGxlbj0xMiwgY2lkPSdjb250cm9sJykgLyBMMkNBUF9DbWRIZHIoY29kZT0naW5mb19yZXNwJywgaWQ9MTQ2LCBsZW49OCkgLyBMMkNBUF9JbmZvUmVzcCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9bDJjYXBfcmVxW0wyQ0FQX0luZm9SZXNwXS50eXBlLCByZXN1bHQ9J3N1Y2Nlc3MnLCBkYXRhPWInXHhiOFx4MDBceDAwXHgwMCcpKQotCi0gICAgZGVmIGRvX2xlX3NjYW4oc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogZW5hYmxlICgwIG9yIDEpLCBmaWx0ZXIgZHVwbGljYXRlcyAoMCBvciAxKSBQcmludCB0aGUgc2NhbiByZXNwb25zZXMgZnJvbSByZWFjaGFibGUgZGV2aWNlcwotCi0gICAgIiIiCi0gICAgICAgIHNwbGl0X2FyZ3MgPSBhcmdzLnNwbGl0KCkKLSAgICAgICAgZW5hYmxlID0gaW50KHNwbGl0X2FyZ3NbMF0pIGlmIGxlbihzcGxpdF9hcmdzKSA+IDAgZWxzZSAxCi0gICAgICAgIGZpbHRlcl9kdXBzID0gaW50KHNwbGl0X2FyZ3NbMV0pIGlmIGxlbihzcGxpdF9hcmdzKSA+IDEgZWxzZSAxCi0gICAgICAgIHNldF9zY2FuX3BhcmFtZXRlcnMgPSBIQ0lfSGRyKHR5cGU9MSkgLyBIQ0lfQ29tbWFuZF9IZHIob3Bjb2RlPTB4MjAwYikgLyBIQ0lfQ21kX0xFX1NldF9TY2FuX1BhcmFtZXRlcnModHlwZT0xKQotICAgICAgICBwcmludCgnVHg6ICcgKyBzZXRfc2Nhbl9wYXJhbWV0ZXJzLl9fcmVwcl9fKCkpCi0gICAgICAgIHNlbGYuX2hjaS5zZW5kKHNldF9zY2FuX3BhcmFtZXRlcnMpCi0gICAgICAgIHNldF9zY2FuX2VuYWJsZSA9IEhDSV9IZHIodHlwZT0xKSAvIEhDSV9Db21tYW5kX0hkcihvcGNvZGU9MHgyMDBjKSAvIEhDSV9DbWRfTEVfU2V0X1NjYW5fRW5hYmxlKAotICAgICAgICAgICAgZW5hYmxlPWVuYWJsZSwgZmlsdGVyX2R1cHM9ZmlsdGVyX2R1cHMpCi0gICAgICAgIHByaW50KCdUeDogJyArIHNldF9zY2FuX2VuYWJsZS5fX3JlcHJfXygpKQotICAgICAgICBzZWxmLl9oY2kuc2VuZChzZXRfc2Nhbl9lbmFibGUpCi0KLSAgICBkZWYgZG9fc2NhbihzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiB0aW1lb3V0IChzZWNvbmRzKSwgbWF4X3Jlc3VsdHMgUHJpbnQgdGhlIHNjYW4gcmVzcG9uc2VzIGZyb20gcmVhY2hhYmxlIGRldmljZXMKLQotICAgICIiIgotICAgICAgICBzcGxpdF9hcmdzID0gYXJncy5zcGxpdCgpCi0gICAgICAgIHNjYW5fdGltZSA9IGludChzcGxpdF9hcmdzWzBdKSBpZiBsZW4oc3BsaXRfYXJncykgPiAwIGVsc2UgMAotICAgICAgICBtYXhfcmVzcG9uc2VzID0gaW50KHNwbGl0X2FyZ3NbMV0pIGlmIGxlbihzcGxpdF9hcmdzKSA+IDEgZWxzZSAwCi0gICAgICAgIG51bV9yZXNwb25zZXMgPSAwCi0gICAgICAgIGlucXVpcnkgPSBIQ0lfSGRyKHR5cGU9J0NvbW1hbmQnKSAvIEhDSV9Db21tYW5kX0hkcihvcGNvZGU9MHgwNDAxKSAvIEhDSV9DbWRfSW5xdWlyeSgKLSAgICAgICAgICAgIGxlbmd0aD1zY2FuX3RpbWUsIG1heF9yZXNwb25zZXM9bWF4X3Jlc3BvbnNlcykKLSAgICAgICAgcHJpbnQoJ1R4OiAnICsgaW5xdWlyeS5fX3JlcHJfXygpKQotICAgICAgICBzZWxmLl9oY2kuc2VuZChpbnF1aXJ5KQotCi0gICAgZGVmIGRvX3dhaXQoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogdGltZSBpbiBzZWNvbmRzIChmbG9hdCkuCi0gICAgIiIiCi0gICAgICAgIHNsZWVwX3RpbWUgPSBmbG9hdChhcmdzLnNwbGl0KClbMF0pCi0gICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfdGltZSkKLQotICAgIGRlZiBkb19xdWl0KHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IE5vbmUuCi0KLSAgICBFeGl0cy4KLSAgICAiIiIKLSAgICAgICAgc2VsZi5faGNpLnRlbGxfcnhfdGhyZWFkX3RvX3F1aXQoKQotICAgICAgICBzZWxmLl9oY2kuY2xvc2UoKQotICAgICAgICBwcmludCgnR29vZGJ5ZS4nKQotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIGRvX2hlbHAoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogW2Rldl9udW0gW2F0dHJdXSBMaXN0IHRoZSBjb21tYW5kcyBhdmFpbGFibGUsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgZGV2aWNlIGFuZCBhdHRyLgotCi0gICAgIiIiCi0gICAgICAgIGlmIChsZW4oYXJncykgPT0gMCk6Ci0gICAgICAgICAgICBjbWQuQ21kLmRvX2hlbHAoc2VsZiwgYXJncykKLQotCi1kZWYgbWFpbihhcmd2KToKLSAgICBpZiBsZW4oYXJndikgIT0gMjoKLSAgICAgICAgcHJpbnQoJ1VzYWdlOiBweXRob24gaGNpX3NvY2tldC5weSBbcG9ydF0nKQotICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIHBvcnQgPSBpbnQoYXJndlsxXSkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcHJpbnQoJ0Vycm9yIHBhcnNpbmcgcG9ydC4nKQotICAgIGVsc2U6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGhjaSA9IEhDSVNvY2tldChwb3J0KQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6Ci0gICAgICAgICAgICBwcmludCgnRXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQ6ICVzJyAlIGUpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50KCdFcnJvciBjcmVhdGluZyAoY2hlY2sgYXJndW1lbnRzKS4nKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaGNpX3NoZWxsID0gSENJU2hlbGwoaGNpKQotICAgICAgICAgICAgaGNpX3NoZWxsLnByb21wdCA9ICckICcKLSAgICAgICAgICAgIGhjaV9zaGVsbC5jbWRsb29wKCdXZWxjb21lIHRvIHRoZSBSb290Q2FuYWwgSENJIENvbnNvbGUgXG4nICsgJ1R5cGUgXCdoZWxwXCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJykKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9saW5rX2xheWVyX3NvY2tldC5weSBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL2xpbmtfbGF5ZXJfc29ja2V0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzNlZjA4Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL2xpbmtfbGF5ZXJfc29ja2V0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0iIiJTY3JpcHQgZm9yIHNlbmRpbmcgZGF0YSB0byBhIHBvcnQuCi0KLVRoaXMgc2NyaXB0IHByb3ZpZGVzIGEgc2ltcGxlIHNoZWxsIGludGVyZmFjZSBmb3Igc2VuZGluZyBkYXRhIGF0IHJ1bi10aW1lIHRvIGEKLXBvcnQuCi0KLVVzYWdlOgotICAgIDEuIENob29zZSBhIHBvcnQgdG8gdXNlLiBVc2UgJ2FkYiBmb3J3YXJkIHRjcDo8cG9ydD4KLSAgICB0Y3A6PHBvcnQ+JyB0byBmb3J3YXJkIHRoZSBwb3J0IHRvIHRoZSBkZXZpY2UuCi0gICAgMi4gSW4gYSBzZXBhcmF0ZSBzaGVsbCwgYnVpbGQgYW5kIHB1c2ggdGhlIHRlc3QgdmVuZG9yIGxpYnJhcnkgdG8gdGhlIGRldmljZQotICAgIHVzaW5nIHRoZSBzY3JpcHQgbWVudGlvbmVkIGluIG9wdGlvbiBBIChpLmUuIHdpdGhvdXQgdGhlIC0tdGVzdC1jaGFubmVsIGZsYWcKLSAgICBzZXQpLgotICAgIDMuIE9uY2UgbG9nY2F0IGhhcyBzdGFydGVkLCB0dXJuIEJsdWV0b290aCBvbiBmcm9tIHRoZSBkZXZpY2UuCi0gICAgNC4gUnVuIHRoaXMgcHJvZ3JhbSwgaW4gdGhlIHNoZWxsIGZyb20gc3RlcCAxLCAgdGhlIHBvcnQsIGFsc28gZnJvbSBzdGVwIDEsCi0gICAgYXMgYXJndW1lbnRzLgotCi0gICAgc2NhcHkgaXMgdGhlIHRvb2wgd2UgdXNlIHRvIGJ1aWxkIHBhY2tldHMgaW4gUHl0aG9uLgotCi0gICAgPj4+IGQgPSBIQ0lfSGRyKHR5cGU9MSkgLyBIQ0lfQ29tbWFuZF9IZHIob3Bjb2RlID0gMHgxMDA0KSAvCi0gICAgUmF3KGxvYWQ9J1x4MDEnKQotICAgID4+PiBwcmludChkKQotICAgIDxIQ0lfSGRyICB0eXBlPUNvbW1hbmQgfDxIQ0lfQ29tbWFuZF9IZHIgIG9wY29kZT0weDEwMDQgfDxSYXcgIGxvYWQ9J1x4MDEnCi0gICAgfD4+PgotICAgID4+PiByYXcoZCkKLSAgICAnXHgwMVx4MDRceDEwXHgwMVx4MDEnCi0gICAgPj4+IGhleGR1bXAoZCkKLSAgICAwMDAwICAwMTA0MTAwMTAxICAgICAgICAgICAgICAgICAgICAgICAuLi4uLgotCi0KLSAgICA+Pj4gcGt0ID0gSENJX0hkcignXHgwMlx4MDJceDIwXHgwYVx4MDBceDA2XHgwMFx4MDFceDAwJykgLwotICAgIEwyQ0FQX0NtZEhkcihjb2RlPTEwLCBpZD0yLCBsZW49MikgL0wyQ0FQX0luZm9SZXEodHlwZT0yKQotICAgID4+PiBwa3QKLSAgICA8SENJX0hkciAgdHlwZT1BQ0wgRGF0YSB8PEhDSV9BQ0xfSGRyICBoYW5kbGU9MiBQQj0wIEJDPTIgbGVuPTEwIHw8TDJDQVBfSGRyCi0gICAgbGVuPTYgY2lkPWNvbnRyb2wgfDxMMkNBUF9DbWRIZHIgIGNvZGU9aW5mb19yZXEgaWQ9MiBsZW49MiB8PEwyQ0FQX0luZm9SZXEKLSAgICB0eXBlPUZFQVRfTUFTSyB8Pj4+Pj4KLSAgICA+Pj4gcGt0ID0gSENJX0hkcih0eXBlPSdBQ0wgRGF0YScpIC8gSENJX0FDTF9IZHIoaGFuZGxlPTIsIFBCPTAsIEJDPTIsCi0gICAgbGVuPTEwKSAvIEwyQ0FQX0hkcihsZW49NiwgY2lkPSdjb250cm9sJykgLyBMMkNBUF9DbWRIZHIoY29kZT0naW5mb19yZXEnLAotICAgIGlkPTIsIGxlbj0yKSAvIEwyQ0FQX0luZm9SZXEodHlwZT0nRkVBVF9NQVNLJykKLSAgICA+Pj4gcmF3KHBrdCkKLSAgICAnXHgwMlx4MDIgXG5ceDAwXHgwNlx4MDBceDAxXHgwMFxuXHgwMlx4MDJceDAwXHgwMlx4MDAnCi0gICAgPj4+IGhleGR1bXAocGt0KQotICAgIDAwMDAgIDAyMDIyMDBBMDAwNjAwMDEwMDBBMDIwMjAwMDIwMCAgIC4uIC4uLi4uLi4uLi4uLgotCi0KLSIiIgotCi0jIS91c3IvYmluL2VudiBweXRob24zCi0KLWltcG9ydCBiaW5hc2NpaQotaW1wb3J0IGNtZAotaW1wb3J0IHF1ZXVlCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3lzCi0KLQotY2xhc3MgTGlua0xheWVyU29ja2V0KG9iamVjdCk6Ci0gICAgIiIiU2ltcGxlIHdyYXBwZXIgY2xhc3MgZm9yIGEgc29ja2V0IG9iamVjdC4KLQotICBBdHRyaWJ1dGVzOgotICAgIHNvY2tldDogVGhlIHVuZGVybHlpbmcgc29ja2V0IGNyZWF0ZWQgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQgcG9ydC4KLSAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCk6Ci0gICAgICAgIHByaW50KCdwb3J0ID0gJyArIHBvcnQpCi0gICAgICAgIHNlbGYuZG9uZV8gPSBGYWxzZQotICAgICAgICBzZWxmLl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgICAgIHNlbGYuX3NvY2tldC5jb25uZWN0KCgnbG9jYWxob3N0JywgcG9ydCkpCi0gICAgICAgICMgU2hvdWxkIGl0IGJlIGEgbm9uLWJsb2NraW5nIHNvY2tldD8KLSAgICAgICAgIyBzZWxmLl9zb2NrZXQuc2V0YmxvY2tpbmcoMCkKLSAgICAgICAgc2VsZi5wYWNrZXRzXyA9IHF1ZXVlLlF1ZXVlKCkKLSAgICAgICAgc2VsZi5yeF90aHJlYWRfID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5yeF90aHJlYWRfYm9keSkKLSAgICAgICAgc2VsZi5yeF90aHJlYWRfLnN0YXJ0KCkKLQotICAgIGRlZiByeF9ieXRlcyhzZWxmLCBzaXplKToKLSAgICAgICAgd2hpbGUgbm90IHNlbGYuZG9uZV86Ci0gICAgICAgICAgICByYXdfYnl0ZXMgPSBiJycKLSAgICAgICAgICAgIHdoaWxlIGxlbihyYXdfYnl0ZXMpIDwgc2l6ZSBhbmQgbm90IHNlbGYuZG9uZV86Ci0gICAgICAgICAgICAgICAgbW9yZV9yYXdfYnl0ZXMgPSBzZWxmLl9zb2NrZXQucmVjdihtaW4oc2l6ZSAtIGxlbihyYXdfYnl0ZXMpLCAyMDQ4KSkKLSAgICAgICAgICAgICAgICBpZiBtb3JlX3Jhd19ieXRlczoKLSAgICAgICAgICAgICAgICAgICAgcmF3X2J5dGVzICs9IG1vcmVfcmF3X2J5dGVzCi0gICAgICAgICAgICByZXR1cm4gcmF3X2J5dGVzCi0KLSAgICBkZWYgcnhfdGhyZWFkX2JvZHkoc2VsZik6Ci0gICAgICAgIHdoaWxlIG5vdCBzZWxmLmRvbmVfOgotICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGggPSAwCi0gICAgICAgICAgICAjIFJlYWQgdGhlIHNpemUgKDRCKSwgdGhlIHR5cGUgKDFCKSwgYW5kIHRoZSBhZGRyZXNzZXMgKDIqNkIpCi0gICAgICAgICAgICBoZWFkZXIgPSBzZWxmLnJ4X2J5dGVzKDE3KQotICAgICAgICAgICAgaWYgbm90IGhlYWRlcjoKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGggPSBoZWFkZXJbMF0KLSAgICAgICAgICAgIHBheWxvYWRfbGVuZ3RoIHw9IGhlYWRlclsxXSA8PCA4Ci0gICAgICAgICAgICBwYXlsb2FkX2xlbmd0aCB8PSBoZWFkZXJbMl0gPDwgMTYKLSAgICAgICAgICAgIHBheWxvYWRfbGVuZ3RoIHw9IGhlYWRlclszXSA8PCAyNAotICAgICAgICAgICAgcHJpbnQoJ1J4OiB0eXBlX2J5dGUgJyArIGhleChoZWFkZXJbNF0pKQotICAgICAgICAgICAgcHJpbnQoJ1J4OiBmcm9tICcgKyBoZXgoaGVhZGVyWzVdKSArICc6JyArIGhleChoZWFkZXJbNl0pICsgJzonICsgaGV4KGhlYWRlcls3XSkgKyAnOicgKyBoZXgoaGVhZGVyWzhdKSArCi0gICAgICAgICAgICAgICAgICAnOicgKyBoZXgoaGVhZGVyWzldKSArICc6JyArIGhleChoZWFkZXJbMTBdKSkKLSAgICAgICAgICAgIHByaW50KCdSeDogdG8gJyArIGhleChoZWFkZXJbMTFdKSArICc6JyArIGhleChoZWFkZXJbMTJdKSArICc6JyArIGhleChoZWFkZXJbMTNdKSArICc6JyArIGhleChoZWFkZXJbMTRdKSArCi0gICAgICAgICAgICAgICAgICAnOicgKyBoZXgoaGVhZGVyWzE1XSkgKyAnOicgKyBoZXgoaGVhZGVyWzE2XSkpCi0gICAgICAgICAgICAjIFJlYWQgdGhlIFBheWxvYWQKLSAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLnJ4X2J5dGVzKHBheWxvYWRfbGVuZ3RoKSBpZiBwYXlsb2FkX2xlbmd0aCAhPSAwIGVsc2UgYicnCi0gICAgICAgICAgICBwYWNrZXRfYnl0ZXMgPSBoZWFkZXIgKyBwYXlsb2FkCi0gICAgICAgICAgICBzZWxmLnBhY2tldHNfLnB1dChwYWNrZXRfYnl0ZXMpCi0KLSAgICBkZWYgZ2V0X3BhY2tldChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5wYWNrZXRzXy5lbXB0eSgpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIHJldHVybiBzZWxmLnBhY2tldHNfLmdldCgpCi0KLSAgICBkZWYgc2VuZF9iaW5hcnkoc2VsZiwgYXJncyk6Ci0gICAgICAgIGpvaW5lZF9hcmdzID0gJycuam9pbihhcmcgZm9yIGFyZyBpbiBhcmdzKQotICAgICAgICBwcmludChqb2luZWRfYXJncykKLSAgICAgICAgcGFja2V0ID0gYmluYXNjaWkuYTJiX2hleChqb2luZWRfYXJncykKLSAgICAgICAgaWYgc2VsZi5fZG9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uLnNlbmQocGFja2V0KQotCi0gICAgZGVmIHRlbGxfcnhfdGhyZWFkX3RvX3F1aXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZG9uZV8gPSBUcnVlCi0gICAgICAgIHNlbGYucnhfdGhyZWFkXy5qb2luKCkKLQotCi1jbGFzcyBMaW5rTGF5ZXJTaGVsbChjbWQuQ21kKToKLSAgICAiIiJTaGVsbCBmb3Igc2VuZGluZyBiaW5hcnkgZGF0YSB0byBhIHBvcnQuCi0KLSAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbGlua19sYXllcik6Ci0gICAgICAgIGNtZC5DbWQuX19pbml0X18oc2VsZikKLSAgICAgICAgc2VsZi5fbGlua19sYXllciA9IGxpbmtfbGF5ZXIKLQotICAgIGRlZiBkb19zZW5kKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhIHBhY2tldC4KLQotICAgICIiIgotICAgICAgICBzZWxmLl9saW5rX2xheWVyLnNlbmRfYmluYXJ5KGFyZ3Muc3BsaXQoKSkKLQotICAgIGRlZiBkb19xdWl0KHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IE5vbmUuCi0KLSAgICBFeGl0cy4KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fbGlua19sYXllci50ZWxsX3J4X3RocmVhZF90b19xdWl0KCkKLSAgICAgICAgc2VsZi5fbGlua19sYXllci5jbG9zZSgpCi0gICAgICAgIHByaW50KCdHb29kYnllLicpCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgZG9faGVscChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBbZGV2X251bSBbYXR0cl1dIExpc3QgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBkZXZpY2UgYW5kIGF0dHIuCi0KLSAgICAiIiIKLSAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAwKToKLSAgICAgICAgICAgIGNtZC5DbWQuZG9faGVscChzZWxmLCBhcmdzKQotCi0KLWRlZiBtYWluKGFyZ3YpOgotICAgIGlmIGxlbihhcmd2KSAhPSAyOgotICAgICAgICBwcmludCgnVXNhZ2U6IHB5dGhvbiBsaW5rX2xheWVyX3NvY2tldC5weSBbcG9ydF0nKQotICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIHBvcnQgPSBpbnQoYXJndlsxXSkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcHJpbnQoJ0Vycm9yIHBhcnNpbmcgcG9ydC4nKQotICAgIGVsc2U6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGxpbmtfbGF5ZXIgPSBMaW5rTGF5ZXJTb2NrZXQocG9ydCkKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgotICAgICAgICAgICAgcHJpbnQoJ0Vycm9yIGNvbm5lY3RpbmcgdG8gc29ja2V0OiAlcycgJSBlKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCgnRXJyb3IgY3JlYXRpbmcgKGNoZWNrIGFyZ3VtZW50cykuJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxpbmtfbGF5ZXJfc2hlbGwgPSBMaW5rTGF5ZXJTaGVsbChsaW5rX2xheWVyKQotICAgICAgICAgICAgbGlua19sYXllcl9zaGVsbC5wcm9tcHQgPSAnJCAnCi0gICAgICAgICAgICBsaW5rX2xheWVyX3NoZWxsLmNtZGxvb3AoJ1dlbGNvbWUgdG8gdGhlIFJvb3RDYW5hbCBMaW5rTGF5ZXIgQ29uc29sZSBcbicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUeXBlIFwnaGVscFwnIGZvciBtb3JlIGluZm9ybWF0aW9uLicpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvUmVhZG1lLnR4dCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L1JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjVkYTcuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvUmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVRoaXMgdGVzdDoKLQotLSBTdGFydHMgUm9vdENhbmFsCi0tIEFkZHMgc2NyaXB0ZWQgYmVhY29ucwotLSBTZXRzIHRoZSBwZXJtaXNzaW9ucyBmb3Igc29tZSBvZiB0aGUgZmlsZXMKLS0gRHVtcHMgdGhlIHByb3RvIG91dHB1dCBmb3IgbWFudWFsIHZlcmlmaWNhdGlvbgotCi0KLWNkICRBTkRST0lEX0JVSUxEX1RPUC9zeXN0ZW0vYnQvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliCi0uIHNjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvcnVuX3Rlc3Quc2gKLQpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvYWRkX2JlYWNvbnMgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9hZGRfYmVhY29ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlYmY2OC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9hZGRfYmVhY29ucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXdhaXQgMQotYWRkIHNjcmlwdGVkX2JlYWNvbiBiZTphYzowMTo1NTowMDowMSBzY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L3Rlc3RfZXZlbnRzLnBiIC90bXAvbG9ncy9zY3JpcHRlZF9iZWFjb25fdGVzdC9iZWFjb24ucGIKLWFkZF9kZXZpY2VfdG9fcGh5IDEgMQotYWRkIHNjcmlwdGVkX2JlYWNvbiBiZTphYzowMTo1NTowMDowMiBzY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L25vX3Blcm1pc3Npb24ucGIgL3RtcC9sb2dzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L25vX3Blcm1pc3Npb24ucGIKLWFkZF9kZXZpY2VfdG9fcGh5IDIgMQotYWRkIHNjcmlwdGVkX2JlYWNvbiBiZTphYzowMTo1NTowMDowMiBzY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L2dyYW50X3Blcm1pc3Npb24ucGIgL3RtcC9sb2dzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L2dyYW50X3Blcm1pc3Npb24ucGIKLWFkZF9kZXZpY2VfdG9fcGh5IDMgMQotbGlzdAotd2FpdCAxMAotcXVpdApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvZ3JhbnRfcGVybWlzc2lvbi5wYiBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L2dyYW50X3Blcm1pc3Npb24ucGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDY1ZDcuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvZ3JhbnRfcGVybWlzc2lvbi5wYgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQotFwotCwIBGgMDb/0TFm/9EgUBAgMEBRjoBwotLAotHwIBGgMDb/0TFm/9AaqqqqqqqqqqqqqqqqqqqgGqqqoSBgECAwQFARjoBwotLAotHwIBGgMDb/0TFm/9AqqqqqqqqqqqqqqqqqqqqgKqqqoSBgECAwQFAhjoBwotLAotHwIBGgMDb/0TFm/9A6qqqqqqqqqqqqqqqqqqqgOqqqoSBgECAwQFAxjoBwotLAotHwIBGgMDb/0TFm/9BKqqqqqqqqqqqqqqqqqqqgSqqqoSBgECAwQFBBjoBwotLAotHwIBGgMDb/0TFm/9BaqqqqqqqqqqqqqqqqqqqgWqqqoSBgECAwQFBRjoBwotLAotHwIBGgMDb/0TFm/9BqqqqqqqqqqqqqqqqqqqqgaqqqoSBgECAwQFBhjoBwotLAotHwIBGgMDb/0TFm/9B6qqqqqqqqqqqqqqqqqqqgeqqqoSBgECAwQFBxjoBwotLAotHwIBGgMDb/0TFm/9CKqqqqqqqqqqqqqqqqqqqgiqqqoSBgECAwQFCBjoBwotLAotHwIBGgMDb/0TFm/9CaqqqqqqqqqqqqqqqqqqqgmqqqoSBgECAwQFCRjoBwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L25vX3Blcm1pc3Npb24ucGIgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9ub19wZXJtaXNzaW9uLnBiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTA2NWQ3Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L25vX3Blcm1pc3Npb24ucGIKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0KLRcKLQsCARoDA2/9ExZv/RIFAQIDBAUY6AcKLSwKLR8CARoDA2/9ExZv/QGqqqqqqqqqqqqqqqqqqqoBqqqqEgYBAgMEBQEY6AcKLSwKLR8CARoDA2/9ExZv/QKqqqqqqqqqqqqqqqqqqqoCqqqqEgYBAgMEBQIY6AcKLSwKLR8CARoDA2/9ExZv/QOqqqqqqqqqqqqqqqqqqqoDqqqqEgYBAgMEBQMY6AcKLSwKLR8CARoDA2/9ExZv/QSqqqqqqqqqqqqqqqqqqqoEqqqqEgYBAgMEBQQY6AcKLSwKLR8CARoDA2/9ExZv/QWqqqqqqqqqqqqqqqqqqqoFqqqqEgYBAgMEBQUY6AcKLSwKLR8CARoDA2/9ExZv/QaqqqqqqqqqqqqqqqqqqqoGqqqqEgYBAgMEBQYY6AcKLSwKLR8CARoDA2/9ExZv/QeqqqqqqqqqqqqqqqqqqqoHqqqqEgYBAgMEBQcY6AcKLSwKLR8CARoDA2/9ExZv/QiqqqqqqqqqqqqqqqqqqqoIqqqqEgYBAgMEBQgY6AcKLSwKLR8CARoDA2/9ExZv/QmqqqqqqqqqqqqqqqqqqqoJqqqqEgYBAgMEBQkY6AcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9ydW5fdGVzdC5zaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L3J1bl90ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2VkZWRiLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L3J1bl90ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCi1ta2RpciAtcCAvdG1wL2xvZ3Mvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvCi1jaG1vZCAyMDAgc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9ub19wZXJtaXNzaW9uLnBiCi1jaG1vZCAyMDAgc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9ncmFudF9wZXJtaXNzaW9uLnBiCi0jIGxzIC1sIHNjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvKi5wYgotJEFORFJPSURfQlVJTERfVE9QL291dC9ob3N0L2xpbnV4LXg4Ni9iaW4vcm9vdC1jYW5hbCAyPiAvdG1wL2xvZ3Mvc2NyaXB0ZWRfYmVhY29uX3Rlc3Qvcm9vdF9jYW5hbC5sb2cgJgotc2xlZXAgMQotcHl0aG9uMyBzY3JpcHRzL3Rlc3RfY2hhbm5lbC5weSA2NDAxIDwgc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9hZGRfYmVhY29ucyA+IC90bXAvbG9ncy9zY3JpcHRlZF9iZWFjb25fdGVzdC90ZXN0X2NoYW5uZWwubG9nICYKLXB5dGhvbjMgc2NyaXB0cy9oY2lfc29ja2V0LnB5IDY0MDIgPCBzY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L3N0YXJ0X3NjYW4gPiAvdG1wL2xvZ3Mvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvaGNpX2RldmljZS5sb2cgJgotc2xlZXAgNQotY2htb2QgNjQwIHNjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvZ3JhbnRfcGVybWlzc2lvbi5wYgotIyBscyAtbCBzY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0LyoucGIKLXNsZWVwIDE1Ci1lY2hvICJEb25lIgotY2htb2QgNjQwIHNjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3Qvbm9fcGVybWlzc2lvbi5wYgotIyBscyAtbCBzY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0LyoucGIKLWdxdWkgL3RtcC9sb2dzL3NjcmlwdGVkX2JlYWNvbl90ZXN0LyoucGIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L3N0YXJ0X3NjYW4gYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC9zdGFydF9zY2FuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQ1ODM1Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NjcmlwdGVkX2JlYWNvbl90ZXN0L3N0YXJ0X3NjYW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWxlX3NjYW4gMQotd2FpdCAxMAotcXVpdApkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2NyaXB0ZWRfYmVhY29uX3Rlc3QvdGVzdF9ldmVudHMucGIgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC90ZXN0X2V2ZW50cy5wYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwNjVkNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zY3JpcHRlZF9iZWFjb25fdGVzdC90ZXN0X2V2ZW50cy5wYgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQotFwotCwIBGgMDb/0TFm/9EgUBAgMEBRjoBwotLAotHwIBGgMDb/0TFm/9AaqqqqqqqqqqqqqqqqqqqgGqqqoSBgECAwQFARjoBwotLAotHwIBGgMDb/0TFm/9AqqqqqqqqqqqqqqqqqqqqgKqqqoSBgECAwQFAhjoBwotLAotHwIBGgMDb/0TFm/9A6qqqqqqqqqqqqqqqqqqqgOqqqoSBgECAwQFAxjoBwotLAotHwIBGgMDb/0TFm/9BKqqqqqqqqqqqqqqqqqqqgSqqqoSBgECAwQFBBjoBwotLAotHwIBGgMDb/0TFm/9BaqqqqqqqqqqqqqqqqqqqgWqqqoSBgECAwQFBRjoBwotLAotHwIBGgMDb/0TFm/9BqqqqqqqqqqqqqqqqqqqqgaqqqoSBgECAwQFBhjoBwotLAotHwIBGgMDb/0TFm/9B6qqqqqqqqqqqqqqqqqqqgeqqqoSBgECAwQFBxjoBwotLAotHwIBGgMDb/0TFm/9CKqqqqqqqqqqqqqqqqqqqgiqqqoSBgECAwQFCBjoBwotLAotHwIBGgMDb/0TFm/9CaqqqqqqqqqqqqqqqqqqqgmqqqoSBgECAwQFCRjoBwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NlbmRfc2ltcGxlX2NvbW1hbmRzLnB5IGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2VuZF9zaW1wbGVfY29tbWFuZHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDBhMDAuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3NjcmlwdHMvc2VuZF9zaW1wbGVfY29tbWFuZHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSIiIlNjcmlwdCBmb3Igc2VuZGluZyBkYXRhIHRvIGEgcG9ydC4KLQotVGhpcyBzY3JpcHQgcHJvdmlkZXMgYSBzaW1wbGUgc2hlbGwgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGRhdGEgYXQgcnVuLXRpbWUgdG8gYQotcG9ydC4KLQotVXNhZ2U6Ci0gICAgMS4gQ2hvb3NlIGEgcG9ydCB0byB1c2UuIFVzZSAnYWRiIGZvcndhcmQgdGNwOjxwb3J0PgotICAgIHRjcDo8cG9ydD4nIHRvIGZvcndhcmQgdGhlIHBvcnQgdG8gdGhlIGRldmljZS4KLSAgICAyLiBJbiBhIHNlcGFyYXRlIHNoZWxsLCBidWlsZCBhbmQgcHVzaCB0aGUgdGVzdCB2ZW5kb3IgbGlicmFyeSB0byB0aGUgZGV2aWNlCi0gICAgdXNpbmcgdGhlIHNjcmlwdCBtZW50aW9uZWQgaW4gb3B0aW9uIEEgKGkuZS4gd2l0aG91dCB0aGUgLS10ZXN0LWNoYW5uZWwgZmxhZwotICAgIHNldCkuCi0gICAgMy4gT25jZSBsb2djYXQgaGFzIHN0YXJ0ZWQsIHR1cm4gQmx1ZXRvb3RoIG9uIGZyb20gdGhlIGRldmljZS4KLSAgICA0LiBSdW4gdGhpcyBwcm9ncmFtLCBpbiB0aGUgc2hlbGwgZnJvbSBzdGVwIDEsICB0aGUgcG9ydCwgYWxzbyBmcm9tIHN0ZXAgMSwKLSAgICBhcyBhcmd1bWVudHMuCi0KLSAgICBzY2FweSBpcyB0aGUgdG9vbCB3ZSB1c2UgdG8gYnVpbGQgcGFja2V0cyBpbiBQeXRob24uCi0KLSAgICA+Pj4gZCA9IEhDSV9IZHIodHlwZT0xKSAvIEhDSV9Db21tYW5kX0hkcihvcGNvZGUgPSAweDEwMDQpIC8KLSAgICBSYXcobG9hZD0nXHgwMScpCi0gICAgPj4+IHByaW50KGQpCi0gICAgPEhDSV9IZHIgIHR5cGU9Q29tbWFuZCB8PEhDSV9Db21tYW5kX0hkciAgb3Bjb2RlPTB4MTAwNCB8PFJhdyAgbG9hZD0nXHgwMScKLSAgICB8Pj4+Ci0gICAgPj4+IHJhdyhkKQotICAgICdceDAxXHgwNFx4MTBceDAxXHgwMScKLSAgICA+Pj4gaGV4ZHVtcChkKQotICAgIDAwMDAgIDAxMDQxMDAxMDEgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uCi0KLQotICAgID4+PiBwa3QgPSBIQ0lfSGRyKCdceDAyXHgwMlx4MjBceDBhXHgwMFx4MDZceDAwXHgwMVx4MDAnKSAvCi0gICAgTDJDQVBfQ21kSGRyKGNvZGU9MTAsIGlkPTIsIGxlbj0yKSAvTDJDQVBfSW5mb1JlcSh0eXBlPTIpCi0gICAgPj4+IHBrdAotICAgIDxIQ0lfSGRyICB0eXBlPUFDTCBEYXRhIHw8SENJX0FDTF9IZHIgIGhhbmRsZT0yIFBCPTAgQkM9MiBsZW49MTAgfDxMMkNBUF9IZHIKLSAgICBsZW49NiBjaWQ9Y29udHJvbCB8PEwyQ0FQX0NtZEhkciAgY29kZT1pbmZvX3JlcSBpZD0yIGxlbj0yIHw8TDJDQVBfSW5mb1JlcQotICAgIHR5cGU9RkVBVF9NQVNLIHw+Pj4+PgotICAgID4+PiBwa3QgPSBIQ0lfSGRyKHR5cGU9IkFDTCBEYXRhIikgLyBIQ0lfQUNMX0hkcihoYW5kbGU9MiwgUEI9MCwgQkM9MiwKLSAgICBsZW49MTApIC8gTDJDQVBfSGRyKGxlbj02LCBjaWQ9ImNvbnRyb2wiKSAvIEwyQ0FQX0NtZEhkcihjb2RlPSJpbmZvX3JlcSIsCi0gICAgaWQ9MiwgbGVuPTIpIC8gTDJDQVBfSW5mb1JlcSh0eXBlPSJGRUFUX01BU0siKQotICAgID4+PiByYXcocGt0KQotICAgICdceDAyXHgwMiBcblx4MDBceDA2XHgwMFx4MDFceDAwXG5ceDAyXHgwMlx4MDBceDAyXHgwMCcKLSAgICA+Pj4gaGV4ZHVtcChwa3QpCi0gICAgMDAwMCAgMDIwMjIwMEEwMDA2MDAwMTAwMEEwMjAyMDAwMjAwICAgLi4gLi4uLi4uLi4uLi4uCi0KLQotIiIiCi0KLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotaW1wb3J0IGJpbmFzY2lpCi1pbXBvcnQgY21kCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3lzCi1mcm9tIHNjYXB5LmFsbCBpbXBvcnQgKgotCi1ERVZJQ0VfTkFNRV9MRU5HVEggPSA2Ci1ERVZJQ0VfQUREUkVTU19MRU5HVEggPSA2Ci0KLQotIyBVc2VkIHRvIGdlbmVyYXRlIGZha2UgZGV2aWNlIG5hbWVzIGFuZCBhZGRyZXNzZXMgZHVyaW5nIGRpc2NvdmVyeS4KLWRlZiBnZW5lcmF0ZV9yYW5kb21fbmFtZSgpOgotICAgIHJldHVybiAnJy5qb2luKHJhbmRvbS5TeXN0ZW1SYW5kb20oKS5jaG9pY2Uoc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArIFwKLSAgICAgIHN0cmluZy5kaWdpdHMpIGZvciBfIGluIHJhbmdlKERFVklDRV9OQU1FX0xFTkdUSCkpCi0KLQotZGVmIGdlbmVyYXRlX3JhbmRvbV9hZGRyZXNzKCk6Ci0gICAgcmV0dXJuICcnLmpvaW4ocmFuZG9tLlN5c3RlbVJhbmRvbSgpLmNob2ljZShzdHJpbmcuZGlnaXRzKSBmb3IgXyBpbiBcCi0gICAgICByYW5nZShERVZJQ0VfQUREUkVTU19MRU5HVEgpKQotCi0KLWNsYXNzIENvbm5lY3Rpb24ob2JqZWN0KToKLSAgICAiIiJTaW1wbGUgd3JhcHBlciBjbGFzcyBmb3IgYSBzb2NrZXQgb2JqZWN0LgotCi0gIEF0dHJpYnV0ZXM6Ci0gICAgc29ja2V0OiBUaGUgdW5kZXJseWluZyBzb2NrZXQgY3JlYXRlZCBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFuZCBwb3J0LgotICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0KToKLSAgICAgICAgc2VsZi5fc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICAgICBzZWxmLl9zb2NrZXQuY29ubmVjdCgoJ2xvY2FsaG9zdCcsIHBvcnQpKQotICAgICAgICBzZWxmLl9zb2NrZXQuc2V0YmxvY2tpbmcoMCkKLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5fc29ja2V0LmNsb3NlKCkKLQotICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLl9zb2NrZXQuc2VuZGFsbChkYXRhKQotCi0gICAgZGVmIHJlY2VpdmUoc2VsZiwgc2l6ZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9zb2NrZXQucmVjdihzaXplKQotCi0KLWNsYXNzIFJhd1BvcnQob2JqZWN0KToKLSAgICAiIiJDaGVja3Mgb3V0Z29pbmcgY29tbWFuZHMgYW5kIHNlbmRzIHRoZW0gb25jZSB2ZXJpZmllZC4KLQotICBBdHRyaWJ1dGVzOgotICAgIGNvbm5lY3Rpb246IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBIQ0kgcG9ydC4KLSAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCk6Ci0gICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBDb25uZWN0aW9uKHBvcnQpCi0gICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY2xvc2UoKQotICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCi0KLSAgICBkZWYgc2VuZF9iaW5hcnkoc2VsZiwgYXJncyk6Ci0gICAgICAgIGpvaW5lZF9hcmdzID0gJycuam9pbihhcmcgZm9yIGFyZyBpbiBhcmdzKQotICAgICAgICBwcmludChqb2luZWRfYXJncykKLSAgICAgICAgcGFja2V0ID0gYmluYXNjaWkuYTJiX2hleChqb2luZWRfYXJncykKLSAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uc2VuZChwYWNrZXQpCi0gICAgICAgIHJlY2VpdmVkID0gc2VsZi5yZWNlaXZlX3Jlc3BvbnNlKCkKLSAgICAgICAgcmVjZWl2ZWRfYnl0ZXMgPSBieXRlYXJyYXkocmVjZWl2ZWQpCi0gICAgICAgIHByaW50KHJhdyhyZWNlaXZlZF9ieXRlcykpCi0KLSAgICBkZWYgcmVjZWl2ZV9yZXNwb25zZShzZWxmKToKLSAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNpemVfY2hhcnMgPSBzZWxmLl9jb25uZWN0aW9uLnJlY2VpdmUoNCkKLSAgICAgICAgaWYgbm90IHNpemVfY2hhcnM6Ci0gICAgICAgICAgICBwcmludCgnRGVidWc6IE5vIHJlc3BvbnNlJykKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBzaXplX2J5dGVzID0gYnl0ZWFycmF5KHNpemVfY2hhcnMpCi0gICAgICAgIHJlc3BvbnNlX3NpemUgPSAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzaXplX2NoYXJzKSAtIDEpOgotICAgICAgICAgICAgcmVzcG9uc2Vfc2l6ZSB8PSBvcmQoc2l6ZV9jaGFyc1tpXSkgPDwgKDggKiBpKQotICAgICAgICByZXNwb25zZSA9IHNlbGYuX2Nvbm5lY3Rpb24ucmVjZWl2ZShyZXNwb25zZV9zaXplKQotICAgICAgICByZXR1cm4gcmVzcG9uc2UKLQotICAgIGRlZiBsaW50X2NvbW1hbmQoc2VsZiwgbmFtZSwgYXJncywgbmFtZV9zaXplLCBhcmdzX3NpemUpOgotICAgICAgICBhc3NlcnQgbmFtZV9zaXplID09IGxlbihuYW1lKSBhbmQgYXJnc19zaXplID09IGxlbihhcmdzKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuYW1lLmVuY29kZSgndXRmLTgnKQotICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgotICAgICAgICAgICAgICAgIGFyZy5lbmNvZGUoJ3V0Zi04JykKLSAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCdVbnJlY29nbml6ZWQgY2hhcmFjdGVycy4nKQotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgaWYgbmFtZV9zaXplID4gMjU1IG9yIGFyZ3Nfc2l6ZSA+IDI1NToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IgICMgU2l6ZSBtdXN0IGJlIGVuY29kYWJsZSBpbiBvbmUgb2N0ZXQuCi0gICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgIGlmIGxlbihhcmcpID4gMjU1OgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IgICMgU2l6ZSBtdXN0IGJlIGVuY29kYWJsZSBpbiBvbmUgb2N0ZXQuCi0KLQotY2xhc3MgUmF3UG9ydFNoZWxsKGNtZC5DbWQpOgotICAgICIiIlNoZWxsIGZvciBzZW5kaW5nIGJpbmFyeSBkYXRhIHRvIGEgcG9ydC4KLQotICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYXdfcG9ydCk6Ci0gICAgICAgIGNtZC5DbWQuX19pbml0X18oc2VsZikKLSAgICAgICAgc2VsZi5fcmF3X3BvcnQgPSByYXdfcG9ydAotCi0gICAgZGVmIGRvX3NlbmQoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogZGV2X3R5cGVfc3RyIEFkZCBhIG5ldyBkZXZpY2Ugb2YgdHlwZSBkZXZfdHlwZV9zdHIuCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fcmF3X3BvcnQuc2VuZF9iaW5hcnkoYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX3F1aXQoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogTm9uZS4KLQotICAgIEV4aXRzLgotICAgICIiIgotICAgICAgICBzZWxmLl9yYXdfcG9ydC5jbG9zZSgpCi0gICAgICAgIHByaW50KCdHb29kYnllLicpCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgZG9faGVscChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBbZGV2X251bSBbYXR0cl1dIExpc3QgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBkZXZpY2UgYW5kIGF0dHIuCi0KLSAgICAiIiIKLSAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAwKToKLSAgICAgICAgICAgIGNtZC5DbWQuZG9faGVscChzZWxmLCBhcmdzKQotCi0KLWRlZiBtYWluKGFyZ3YpOgotICAgIGlmIGxlbihhcmd2KSAhPSAyOgotICAgICAgICBwcmludCgnVXNhZ2U6IHB5dGhvbiByYXdfcG9ydC5weSBbcG9ydF0nKQotICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIHBvcnQgPSBpbnQoYXJndlsxXSkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcHJpbnQoJ0Vycm9yIHBhcnNpbmcgcG9ydC4nKQotICAgIGVsc2U6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJhd19wb3J0ID0gUmF3UG9ydChwb3J0KQotICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgZSk6Ci0gICAgICAgICAgICBwcmludCgnRXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQ6ICVzJyAlIGUpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50KCdFcnJvciBjcmVhdGluZyAoY2hlY2sgYXJndW1lbnRzKS4nKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmF3X3BvcnRfc2hlbGwgPSBSYXdQb3J0U2hlbGwocmF3X3BvcnQpCi0gICAgICAgICAgICByYXdfcG9ydF9zaGVsbC5wcm9tcHQgPSAnJCAnCi0gICAgICAgICAgICByYXdfcG9ydF9zaGVsbC5jbWRsb29wKCdXZWxjb21lIHRvIHRoZSBSb290Q2FuYWwgQ29uc29sZSBcbicgKyAnVHlwZSBcJ2hlbHBcJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NpbXBsZV9saW5rX2xheWVyX3NvY2tldC5weSBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NpbXBsZV9saW5rX2xheWVyX3NvY2tldC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhYWJiNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zaW1wbGVfbGlua19sYXllcl9zb2NrZXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSIiIlNjcmlwdCBmb3Igc2VuZGluZyBkYXRhIHRvIGEgcG9ydC4KLQotVGhpcyBzY3JpcHQgcHJvdmlkZXMgYSBzaW1wbGUgc2hlbGwgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGRhdGEgYXQgcnVuLXRpbWUgdG8gYQotcG9ydC4KLQotVXNhZ2U6Ci0gICAgMS4gQ2hvb3NlIGEgcG9ydCB0byB1c2UuIFVzZSAnYWRiIGZvcndhcmQgdGNwOjxwb3J0PgotICAgIHRjcDo8cG9ydD4nIHRvIGZvcndhcmQgdGhlIHBvcnQgdG8gdGhlIGRldmljZS4KLSAgICAyLiBJbiBhIHNlcGFyYXRlIHNoZWxsLCBidWlsZCBhbmQgcHVzaCB0aGUgdGVzdCB2ZW5kb3IgbGlicmFyeSB0byB0aGUgZGV2aWNlCi0gICAgdXNpbmcgdGhlIHNjcmlwdCBtZW50aW9uZWQgaW4gb3B0aW9uIEEgKGkuZS4gd2l0aG91dCB0aGUgLS10ZXN0LWNoYW5uZWwgZmxhZwotICAgIHNldCkuCi0gICAgMy4gT25jZSBsb2djYXQgaGFzIHN0YXJ0ZWQsIHR1cm4gQmx1ZXRvb3RoIG9uIGZyb20gdGhlIGRldmljZS4KLSAgICA0LiBSdW4gdGhpcyBwcm9ncmFtLCBpbiB0aGUgc2hlbGwgZnJvbSBzdGVwIDEsICB0aGUgcG9ydCwgYWxzbyBmcm9tIHN0ZXAgMSwKLSAgICBhcyBhcmd1bWVudHMuCi0KLQotICAgICBsZW5ndGggICB0eXBlICAgc291cmNlICAgIGRlc3QgICAgICBhZGRyX3R5cGUgIGFkdl90eXBlICAgICBFSVIgRGF0YQotCi0gICAgICAgICAgICAgIGFkdiAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBjb25uZWN0YWJsZSAgTmFtZSAoVEFUQSkKLXNlbmQgMTgwMDAwMDAgMDcgMDEwMjAzMDQwNTA2IDAwMDAwMDAwMDAwMCAgIDAwICAgICAgMDAgICAgICAgICAwNTA5NTQ0MTU0NDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMjAxMDYKLQotICAgICBsZW5ndGggICBhZHYgICBzb3VyY2UgICAgZGVzdCAgICAgICAgcHVibGljICAgbm9uLWNvbm4gICAgIE5hbWUgKFRFVEUpCi1zZW5kIDE4MDAwMDAwIDA3IDAxMDIwMzA0MDUwNyAwMDAwMDAwMDAwMDAgICAwMCAgICAgICAwMyAgICAgICAgMDUwOTU0NDU1NDQ1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDIwMTA2Ci0KLSAgICAgbGVuZ3RoIHNjYW5fcnNwICBzb3VyY2UgICAgZGVzdCAgICAgICAgcHVibGljICBzY2FuX3JzcCAgICBOYW1lIChURlRGKQotc2VuZCAxODAwMDAwMCAwOSAwMTAyMDMwNDA1MDYgNGRlMjRjNjc0NTRiICAgIDAwICAgICAgMDQgICAgICAgIDA1MDk1NDQ2NTQ0NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAyMDEwNgotCi0iIiIKLQotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi1pbXBvcnQgYmluYXNjaWkKLWltcG9ydCBjbWQKLWltcG9ydCByYW5kb20KLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzdHJpbmcKLWltcG9ydCBzdHJ1Y3QKLWltcG9ydCBzeXMKLQotREVWSUNFX05BTUVfTEVOR1RIID0gNgotREVWSUNFX0FERFJFU1NfTEVOR1RIID0gNgotCi0KLSMgVXNlZCB0byBnZW5lcmF0ZSBmYWtlIGRldmljZSBuYW1lcyBhbmQgYWRkcmVzc2VzIGR1cmluZyBkaXNjb3ZlcnkuCi1kZWYgZ2VuZXJhdGVfcmFuZG9tX25hbWUoKToKLSAgICByZXR1cm4gJycuam9pbihyYW5kb20uU3lzdGVtUmFuZG9tKCkuY2hvaWNlKHN0cmluZy5hc2NpaV91cHBlcmNhc2UgKyBcCi0gICAgICBzdHJpbmcuZGlnaXRzKSBmb3IgXyBpbiByYW5nZShERVZJQ0VfTkFNRV9MRU5HVEgpKQotCi0KLWRlZiBnZW5lcmF0ZV9yYW5kb21fYWRkcmVzcygpOgotICAgIHJldHVybiAnJy5qb2luKHJhbmRvbS5TeXN0ZW1SYW5kb20oKS5jaG9pY2Uoc3RyaW5nLmRpZ2l0cykgZm9yIF8gaW4gXAotICAgICAgcmFuZ2UoREVWSUNFX0FERFJFU1NfTEVOR1RIKSkKLQotCi1jbGFzcyBDb25uZWN0aW9uKG9iamVjdCk6Ci0gICAgIiIiU2ltcGxlIHdyYXBwZXIgY2xhc3MgZm9yIGEgc29ja2V0IG9iamVjdC4KLQotICBBdHRyaWJ1dGVzOgotICAgIHNvY2tldDogVGhlIHVuZGVybHlpbmcgc29ja2V0IGNyZWF0ZWQgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQgcG9ydC4KLSAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCk6Ci0gICAgICAgIHNlbGYuX3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgc2VsZi5fc29ja2V0LmNvbm5lY3QoKCdsb2NhbGhvc3QnLCBwb3J0KSkKLSAgICAgICAgc2VsZi5fc29ja2V0LnNldGJsb2NraW5nKDApCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuX3NvY2tldC5jbG9zZSgpCi0KLSAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5fc29ja2V0LnNlbmRhbGwoZGF0YSkKLQotICAgIGRlZiByZWNlaXZlKHNlbGYsIHNpemUpOgotICAgICAgICByZXR1cm4gc2VsZi5fc29ja2V0LnJlY3Yoc2l6ZSkKLQotCi1jbGFzcyBSYXdQb3J0KG9iamVjdCk6Ci0gICAgIiIiQ2hlY2tzIG91dGdvaW5nIGNvbW1hbmRzIGFuZCBzZW5kcyB0aGVtIG9uY2UgdmVyaWZpZWQuCi0KLSAgQXR0cmlidXRlczoKLSAgICBjb25uZWN0aW9uOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgSENJIHBvcnQuCi0gICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gQ29ubmVjdGlvbihwb3J0KQotICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKLSAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQotCi0gICAgZGVmIHNlbmRfYmluYXJ5KHNlbGYsIGFyZ3MpOgotICAgICAgICBqb2luZWRfYXJncyA9ICcnLmpvaW4oYXJnIGZvciBhcmcgaW4gYXJncykKLSAgICAgICAgcHJpbnQoam9pbmVkX2FyZ3MpCi0gICAgICAgIHBhY2tldCA9IGJpbmFzY2lpLmEyYl9oZXgoam9pbmVkX2FyZ3MpCi0gICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uLnNlbmQocGFja2V0KQotCi0gICAgZGVmIHJlY2VpdmVfcmVzcG9uc2Uoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzaXplX2NoYXJzID0gc2VsZi5fY29ubmVjdGlvbi5yZWNlaXZlKDQpCi0gICAgICAgIGlmIG5vdCBzaXplX2NoYXJzOgotICAgICAgICAgICAgcHJpbnQoJ0RlYnVnOiBObyByZXNwb25zZScpCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgc2l6ZV9ieXRlcyA9IGJ5dGVhcnJheShzaXplX2NoYXJzKQotICAgICAgICByZXNwb25zZV9zaXplID0gMAotICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oc2l6ZV9jaGFycykgLSAxKToKLSAgICAgICAgICAgIHJlc3BvbnNlX3NpemUgfD0gb3JkKHNpemVfY2hhcnNbaV0pIDw8ICg4ICogaSkKLSAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jb25uZWN0aW9uLnJlY2VpdmUocmVzcG9uc2Vfc2l6ZSkKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlCi0KLSAgICBkZWYgbGludF9jb21tYW5kKHNlbGYsIG5hbWUsIGFyZ3MsIG5hbWVfc2l6ZSwgYXJnc19zaXplKToKLSAgICAgICAgYXNzZXJ0IG5hbWVfc2l6ZSA9PSBsZW4obmFtZSkgYW5kIGFyZ3Nfc2l6ZSA9PSBsZW4oYXJncykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbmFtZS5lbmNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgICAgICBhcmcuZW5jb2RlKCd1dGYtOCcpCi0gICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6Ci0gICAgICAgICAgICBwcmludCgnVW5yZWNvZ25pemVkIGNoYXJhY3RlcnMuJykKLSAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIGlmIG5hbWVfc2l6ZSA+IDI1NSBvciBhcmdzX3NpemUgPiAyNTU6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yICAjIFNpemUgbXVzdCBiZSBlbmNvZGFibGUgaW4gb25lIG9jdGV0LgotICAgICAgICBmb3IgYXJnIGluIGFyZ3M6Ci0gICAgICAgICAgICBpZiBsZW4oYXJnKSA+IDI1NToKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yICAjIFNpemUgbXVzdCBiZSBlbmNvZGFibGUgaW4gb25lIG9jdGV0LgotCi0KLWNsYXNzIFJhd1BvcnRTaGVsbChjbWQuQ21kKToKLSAgICAiIiJTaGVsbCBmb3Igc2VuZGluZyBiaW5hcnkgZGF0YSB0byBhIHBvcnQuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcmF3X3BvcnQpOgotICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIHNlbGYuX3Jhd19wb3J0ID0gcmF3X3BvcnQKLQotICAgIGRlZiBkb19zZW5kKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IGRldl90eXBlX3N0ciBBZGQgYSBuZXcgZGV2aWNlIG9mIHR5cGUgZGV2X3R5cGVfc3RyLiIiIgotICAgICAgICBzZWxmLl9yYXdfcG9ydC5zZW5kX2JpbmFyeShhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fcXVpdChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBOb25lLgotCi0gICAgRXhpdHMuCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Jhd19wb3J0LmNsb3NlKCkKLSAgICAgICAgcHJpbnQoJ0dvb2RieWUuJykKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBkb19oZWxwKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IFtkZXZfbnVtIFthdHRyXV0gTGlzdCB0aGUgY29tbWFuZHMgYXZhaWxhYmxlLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGRldmljZSBhbmQgYXR0ci4iIiIKLSAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAwKToKLSAgICAgICAgICAgIGNtZC5DbWQuZG9faGVscChzZWxmLCBhcmdzKQotCi0KLWRlZiBtYWluKGFyZ3YpOgotICAgIGlmIGxlbihhcmd2KSAhPSAyOgotICAgICAgICBwcmludCgnVXNhZ2U6IHB5dGhvbiByYXdfcG9ydC5weSBbcG9ydF0nKQotICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIHBvcnQgPSBpbnQoYXJndlsxXSkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcHJpbnQoJ0Vycm9yIHBhcnNpbmcgcG9ydC4nKQotICAgIGVsc2U6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJhd19wb3J0ID0gUmF3UG9ydChwb3J0KQotICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgZSk6Ci0gICAgICAgICAgICBwcmludCgnRXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQ6ICVzJyAlIGUpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50KCdFcnJvciBjcmVhdGluZyAoY2hlY2sgYXJndW1lbnRzKS4nKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmF3X3BvcnRfc2hlbGwgPSBSYXdQb3J0U2hlbGwocmF3X3BvcnQpCi0gICAgICAgICAgICByYXdfcG9ydF9zaGVsbC5wcm9tcHQgPSAnJCAnCi0gICAgICAgICAgICByYXdfcG9ydF9zaGVsbC5jbWRsb29wKCdXZWxjb21lIHRvIHRoZSBSb290Q2FuYWwgQ29uc29sZSBcbicgKyAnVHlwZSBcJ2hlbHBcJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NpbXBsZV9zdGFjay5weSBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3NpbXBsZV9zdGFjay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwODllYi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy9zaW1wbGVfc3RhY2sucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSIiIlNjcmlwdCBmb3Igc2VuZGluZyBkYXRhIHRvIGEgcG9ydC4KLQotVGhpcyBzY3JpcHQgcHJvdmlkZXMgYSBzaW1wbGUgc2hlbGwgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGRhdGEgYXQgcnVuLXRpbWUgdG8gYQotcG9ydC4KLQotVXNhZ2U6Ci0gICAgMS4gQ2hvb3NlIGEgcG9ydCB0byB1c2UuIFVzZSAnYWRiIGZvcndhcmQgdGNwOjxwb3J0PgotICAgIHRjcDo8cG9ydD4nIHRvIGZvcndhcmQgdGhlIHBvcnQgdG8gdGhlIGRldmljZS4KLSAgICAyLiBJbiBhIHNlcGFyYXRlIHNoZWxsLCBidWlsZCBhbmQgcHVzaCB0aGUgdGVzdCB2ZW5kb3IgbGlicmFyeSB0byB0aGUgZGV2aWNlCi0gICAgdXNpbmcgdGhlIHNjcmlwdCBtZW50aW9uZWQgaW4gb3B0aW9uIEEgKGkuZS4gd2l0aG91dCB0aGUgLS10ZXN0LWNoYW5uZWwgZmxhZwotICAgIHNldCkuCi0gICAgMy4gT25jZSBsb2djYXQgaGFzIHN0YXJ0ZWQsIHR1cm4gQmx1ZXRvb3RoIG9uIGZyb20gdGhlIGRldmljZS4KLSAgICA0LiBSdW4gdGhpcyBwcm9ncmFtLCBpbiB0aGUgc2hlbGwgZnJvbSBzdGVwIDEsICB0aGUgcG9ydCwgYWxzbyBmcm9tIHN0ZXAgMSwKLSAgICBhcyBhcmd1bWVudHMuCi0KLSAgICBzY2FweSBpcyB0aGUgdG9vbCB3ZSB1c2UgdG8gYnVpbGQgcGFja2V0cyBpbiBQeXRob24uCi0KLSAgICA+Pj4gZCA9IEhDSV9IZHIodHlwZT0xKSAvIEhDSV9Db21tYW5kX0hkcihvcGNvZGUgPSAweDEwMDQpIC8KLSAgICBSYXcobG9hZD0nXHgwMScpCi0gICAgPj4+IHByaW50KGQpCi0gICAgPEhDSV9IZHIgIHR5cGU9Q29tbWFuZCB8PEhDSV9Db21tYW5kX0hkciAgb3Bjb2RlPTB4MTAwNCB8PFJhdyAgbG9hZD0nXHgwMScKLSAgICB8Pj4+Ci0gICAgPj4+IHJhdyhkKQotICAgICdceDAxXHgwNFx4MTBceDAxXHgwMScKLSAgICA+Pj4gaGV4ZHVtcChkKQotICAgIDAwMDAgIDAxMDQxMDAxMDEgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uCi0KLQotICAgID4+PiBwa3QgPSBIQ0lfSGRyKCdceDAyXHgwMlx4MjBceDBhXHgwMFx4MDZceDAwXHgwMVx4MDAnKSAvCi0gICAgTDJDQVBfQ21kSGRyKGNvZGU9MTAsIGlkPTIsIGxlbj0yKSAvTDJDQVBfSW5mb1JlcSh0eXBlPTIpCi0gICAgPj4+IHBrdAotICAgIDxIQ0lfSGRyICB0eXBlPUFDTCBEYXRhIHw8SENJX0FDTF9IZHIgIGhhbmRsZT0yIFBCPTAgQkM9MiBsZW49MTAgfDxMMkNBUF9IZHIKLSAgICBsZW49NiBjaWQ9Y29udHJvbCB8PEwyQ0FQX0NtZEhkciAgY29kZT1pbmZvX3JlcSBpZD0yIGxlbj0yIHw8TDJDQVBfSW5mb1JlcQotICAgIHR5cGU9RkVBVF9NQVNLIHw+Pj4+PgotICAgID4+PiBwa3QgPSBIQ0lfSGRyKHR5cGU9IkFDTCBEYXRhIikgLyBIQ0lfQUNMX0hkcihoYW5kbGU9MiwgUEI9MCwgQkM9MiwKLSAgICBsZW49MTApIC8gTDJDQVBfSGRyKGxlbj02LCBjaWQ9ImNvbnRyb2wiKSAvIEwyQ0FQX0NtZEhkcihjb2RlPSJpbmZvX3JlcSIsCi0gICAgaWQ9MiwgbGVuPTIpIC8gTDJDQVBfSW5mb1JlcSh0eXBlPSJGRUFUX01BU0siKQotICAgID4+PiByYXcocGt0KQotICAgICdceDAyXHgwMiBcblx4MDBceDA2XHgwMFx4MDFceDAwXG5ceDAyXHgwMlx4MDBceDAyXHgwMCcKLSAgICA+Pj4gaGV4ZHVtcChwa3QpCi0gICAgMDAwMCAgMDIwMjIwMEEwMDA2MDAwMTAwMEEwMjAyMDAwMjAwICAgLi4gLi4uLi4uLi4uLi4uCi0KLQotIiIiCi0KLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotaW1wb3J0IGJpbmFzY2lpCi1pbXBvcnQgY21kCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgc3RydWN0Ci1pbXBvcnQgc3lzCi1mcm9tIHNjYXB5LmFsbCBpbXBvcnQgKgotIiIiIEFkZCBzb21lIG1vcmUgU0NBUFkgc3R1ZmYiIiIKLQotCi1jbGFzcyBIQ0lfQ21kX0Nvbm5lY3QoUGFja2V0KToKLSAgICBuYW1lID0gIkNvbm5lY3QiCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIEJ5dGVFbnVtRmllbGQoImZpbHRlciIsIDAsIHswOiAiYWRkcmVzcyJ9KSwKLSAgICAgICAgTEVTaG9ydEZpZWxkKCJwYWNrZXRfdHlwZSIsIDgpLAotICAgICAgICBCeXRlRW51bUZpZWxkKCJwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlIiwgMCwgewotICAgICAgICAgICAgMDogIlIwIiwKLSAgICAgICAgICAgIDE6ICJSMSIsCi0gICAgICAgICAgICAyOiAiUjIiCi0gICAgICAgIH0pLAotICAgICAgICBCeXRlRW51bUZpZWxkKCJwYWdlX3NjYW5fcmVwZXRpdGlvbl9tb2RlIiwgMCwgezA6ICJSZXNlcnZlZCJ9KSwKLSAgICAgICAgTEVTaG9ydEZpZWxkKCJjbG9ja19vZmZzZXQiLCAwKSwKLSAgICAgICAgQnl0ZUVudW1GaWVsZCgiYWxsb3dfcm9sZV9zd2l0Y2giLCAwLCB7Ci0gICAgICAgICAgICAwOiAiZmFsc2UiLAotICAgICAgICAgICAgMTogInRydWUiCi0gICAgICAgIH0pLAotICAgIF0KLQotCi1jbGFzcyBIQ0lfQ21kX0lucXVpcnkoUGFja2V0KToKLSAgICBuYW1lID0gIklucXVpcnkiCi0gICAgZmllbGRzX2Rlc2MgPSBbCi0gICAgICAgIFhCeXRlRmllbGQoIkxBUDAiLCAwKSwKLSAgICAgICAgWEJ5dGVGaWVsZCgiTEFQMSIsIDB4OEIpLAotICAgICAgICBYQnl0ZUZpZWxkKCJMQVAyIiwgMHg5RSksCi0gICAgICAgIEJ5dGVGaWVsZCgibGVuZ3RoIiwgMSksCi0gICAgICAgIEJ5dGVGaWVsZCgibWF4X3Jlc3BvbnNlcyIsIDApLAotICAgIF0KLQotCi0iIiIgRU5EIFNDQVBZIHN0dWZmIiIiCi0KLQotY2xhc3MgQ29ubmVjdGlvbihvYmplY3QpOgotICAgICIiIlNpbXBsZSB3cmFwcGVyIGNsYXNzIGZvciBhIHNvY2tldCBvYmplY3QuCi0KLSAgQXR0cmlidXRlczoKLSAgICBzb2NrZXQ6IFRoZSB1bmRlcmx5aW5nIHNvY2tldCBjcmVhdGVkIGZvciB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIHBvcnQuCi0gICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgotICAgICAgICBzZWxmLl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgICAgIHNlbGYuX3NvY2tldC5jb25uZWN0KCgibG9jYWxob3N0IiwgcG9ydCkpCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuX3NvY2tldC5jbG9zZSgpCi0KLSAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5fc29ja2V0LnNlbmRhbGwoZGF0YSkKLQotICAgIGRlZiByZWNlaXZlKHNlbGYsIHNpemUpOgotICAgICAgICByZXR1cm4gc2VsZi5fc29ja2V0LnJlY3Yoc2l6ZSkKLQotCi1jbGFzcyBSYXdQb3J0KG9iamVjdCk6Ci0gICAgIiIiQ29udmVydHMgb3V0Z29pbmcgcGFja2V0cyB0byBiaW5hcnkgYW5kIHNlbmRzIHRoZW0uCi0KLSAgQXR0cmlidXRlczoKLSAgICBjb25uZWN0aW9uOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgSENJIHBvcnQuCi0gICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gQ29ubmVjdGlvbihwb3J0KQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKLQotICAgIGRlZiBzZW5kX2JpbmFyeShzZWxmLCBhcmdzKToKLSAgICAgICAgam9pbmVkX2FyZ3MgPSAiIi5qb2luKGFyZyBmb3IgYXJnIGluIGFyZ3MpCi0gICAgICAgIHByaW50KGpvaW5lZF9hcmdzKQotICAgICAgICBwYWNrZXQgPSBiaW5hc2NpaS5hMmJfaGV4KGpvaW5lZF9hcmdzKQotICAgICAgICBzZWxmLl9jb25uZWN0aW9uLnNlbmQocGFja2V0KQotCi0gICAgZGVmIHJlY2VpdmVfcmVzcG9uc2Uoc2VsZik6Ci0gICAgICAgIHJlYWR5X3RvX3JlYWQsIHJlYWR5X3RvX3dyaXRlLCBpbl9lcnJvciA9IFwKLSAgICAgICAgICAgICAgICAgICBzZWxlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgWyBzZWxmLl9jb25uZWN0aW9uLl9zb2NrZXQgXSwKLSAgICAgICAgICAgICAgICAgICAgICBbIF0sCi0gICAgICAgICAgICAgICAgICAgICAgWyBzZWxmLl9jb25uZWN0aW9uLl9zb2NrZXQgXSwKLSAgICAgICAgICAgICAgICAgICAgICAxLjUpCi0gICAgICAgIGlmIGxlbihpbl9lcnJvcikgPiAwOgotICAgICAgICAgICAgcHJpbnQoIkVycm9yIikKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBpZiBsZW4ocmVhZHlfdG9fcmVhZCkgPiAwOgotICAgICAgICAgICAgcHJpbnQoIlJlYWR5IHRvIFJlYWQiKQotICAgICAgICAgICAgdHlwZV9zdHIgPSBzZWxmLl9jb25uZWN0aW9uLnJlY2VpdmUoNTEyKQotICAgICAgICAgICAgcHJpbnQobGVuKHR5cGVfc3RyKSkKLSAgICAgICAgICAgIHByaW50KHR5cGVfc3RyKQotICAgICAgICAgICAgcmV0dXJuIHR5cGVfc3RyCi0gICAgICAgIHByaW50KCJSZXR1cm5pbmcgZmFsc2UgYXQgdGhlIGVuZCIpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0KLWNsYXNzIFJhd1BvcnRTaGVsbChjbWQuQ21kKToKLSAgICAiIiJTaGVsbCBmb3Igc2VuZGluZyBiaW5hcnkgZGF0YSB0byBhIHBvcnQuCi0KLSAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcmF3X3BvcnQpOgotICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIHNlbGYuX3Jhd19wb3J0ID0gcmF3X3BvcnQKLQotICAgIGRlZiBkb19zZW5kKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IGRldl90eXBlX3N0ciBBZGQgYSBuZXcgZGV2aWNlIG9mIHR5cGUgZGV2X3R5cGVfc3RyLgotCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Jhd19wb3J0LnNlbmRfYmluYXJ5KGFyZ3Muc3BsaXQoKSkKLQotICAgIGRlZiBkb19zY2FuKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IHRpbWVvdXQgKHNlY29uZHMpIFByaW50IHRoZSBzY2FuIHJlc3BvbnNlcyBmcm9tIHJlYWNoYWJsZSBkZXZpY2VzCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fcmF3X3BvcnQuc2VuZF9iaW5hcnkoYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX3F1aXQoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogTm9uZS4KLQotICAgIEV4aXRzLgotICAgICIiIgotICAgICAgICBzZWxmLl9yYXdfcG9ydC5jbG9zZSgpCi0gICAgICAgIHByaW50KCJHb29kYnllLiIpCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgZG9faGVscChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBbZGV2X251bSBbYXR0cl1dIExpc3QgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBkZXZpY2UgYW5kIGF0dHIuCi0KLSAgICAiIiIKLSAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAwKToKLSAgICAgICAgICAgIGNtZC5DbWQuZG9faGVscChzZWxmLCBhcmdzKQotCi0gICAgZGVmIHBvc3RjbWQoc2VsZiwgc3RvcCwgbGluZSk6Ci0gICAgICAgICIiIkNhbGxlZCBhZnRlciBlYWNoIGNvbW1hbmQgc3RvcCA6IHdoZXRoZXIgd2Ugd2lsbCBzdG9wIGFmdGVyIHRoaXMgY29tbWFuZCBsaW5lIDogdGhlIHByZXZpb3VzIGlucHV0IGxpbmUgUmV0dXJuIFRydWUgdG8gc3RvcCwgRmFsc2UgdG8gY29udGludWUKLQotICAgICIiIgotICAgICAgICBpZiBzdG9wOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9yYXdfcG9ydC5yZWNlaXZlX3Jlc3BvbnNlKCkKLSAgICAgICAgcHJpbnQocmVzcG9uc2UpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiBtYWluKGFyZ3YpOgotICAgIGlmIGxlbihhcmd2KSAhPSAyOgotICAgICAgICBwcmludCgiVXNhZ2U6IHB5dGhvbiByYXdfcG9ydC5weSBbcG9ydF0iKQotICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIHBvcnQgPSBpbnQoYXJndlsxXSkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcHJpbnQoIkVycm9yIHBhcnNpbmcgcG9ydC4iKQotICAgIGVsc2U6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJhd19wb3J0ID0gUmF3UG9ydChwb3J0KQotICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgZSk6Ci0gICAgICAgICAgICBwcmludCgiRXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQ6ICVzIiAlIGUpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50KCJFcnJvciBjcmVhdGluZyAoY2hlY2sgYXJndW1lbnRzKS4iKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmF3X3BvcnRfc2hlbGwgPSBSYXdQb3J0U2hlbGwocmF3X3BvcnQpCi0gICAgICAgICAgICByYXdfcG9ydF9zaGVsbC5wcm9tcHQgPSAiJCAiCi0gICAgICAgICAgICByYXdfcG9ydF9zaGVsbC5jbWRsb29wKCJXZWxjb21lIHRvIHRoZSBSb290Q2FuYWwgQ29uc29sZSBcbiIgKyAnVHlwZSBcJ2hlbHBcJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3Rlc3RfY2hhbm5lbC5weSBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi9zY3JpcHRzL3Rlc3RfY2hhbm5lbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZDhmOC4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvc2NyaXB0cy90ZXN0X2NoYW5uZWwucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSIiIlNjcmlwdCBmb3Igc2VuZGluZyB0ZXN0aW5nIHBhcmFtZXRlcnMgYW5kIGNvbW1hbmRzIHRvIGEgQmx1ZXRvb3RoIGRldmljZS4KLQotVGhpcyBzY3JpcHQgcHJvdmlkZXMgYSBzaW1wbGUgc2hlbGwgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGRhdGEgYXQgcnVuLXRpbWUgdG8gYQotQmx1ZXRvb3RoIGRldmljZS4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0YW5kZW0gd2l0aCB0aGUgdGVzdCB2ZW5kb3IKLWxpYnJhcnkgcHJvamVjdC4KLQotVXNhZ2U6Ci0gIE9wdGlvbiBBOiBTY3JpcHQKLSAgICAxLiBSdW4gYnVpbGRfYW5kX3J1bi5zaCBpbiBzY3JpcHRzLyB3aXRoIHRoZSAtLXRlc3QtY2hhbm5lbCBmbGFnIHNldCBhbmQgdGhlCi0gICAgcG9ydCB0byB1c2UgZm9yIHRoZSB0ZXN0IGNoYW5uZWwuCi0gIE9wdGlvbiBCOiBNYW51YWwKLSAgICAxLiBDaG9vc2UgYSBwb3J0IHRvIHVzZSBmb3IgdGhlIHRlc3QgY2hhbm5lbC4gVXNlICdhZGIgZm9yd2FyZCB0Y3A6PHBvcnQ+Ci0gICAgdGNwOjxwb3J0PicgdG8gZm9yd2FyZCB0aGUgcG9ydCB0byB0aGUgZGV2aWNlLgotICAgIDIuIEluIGEgc2VwYXJhdGUgc2hlbGwsIGJ1aWxkIGFuZCBwdXNoIHRoZSB0ZXN0IHZlbmRvciBsaWJyYXJ5IHRvIHRoZSBkZXZpY2UKLSAgICB1c2luZyB0aGUgc2NyaXB0IG1lbnRpb25lZCBpbiBvcHRpb24gQSAoaS5lLiB3aXRob3V0IHRoZSAtLXRlc3QtY2hhbm5lbCBmbGFnCi0gICAgc2V0KS4KLSAgICAzLiBPbmNlIGxvZ2NhdCBoYXMgc3RhcnRlZCwgdHVybiBCbHVldG9vdGggb24gZnJvbSB0aGUgZGV2aWNlLgotICAgIDQuIFJ1biB0aGlzIHByb2dyYW0sIGluIHRoZSBzaGVsbCBmcm9tIHN0ZXAgMSwgIHRoZSBwb3J0LCBhbHNvIGZyb20gc3RlcCAxLAotICAgIGFzIGFyZ3VtZW50cy4KLSIiIgotCi0jIS91c3IvYmluL2VudiBweXRob24zCi0KLWltcG9ydCBjbWQKLWltcG9ydCByYW5kb20KLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzdHJpbmcKLWltcG9ydCBzdHJ1Y3QKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi0KLURFVklDRV9OQU1FX0xFTkdUSCA9IDYKLURFVklDRV9BRERSRVNTX0xFTkdUSCA9IDYKLQotCi0jIFVzZWQgdG8gZ2VuZXJhdGUgZmFrZSBkZXZpY2UgbmFtZXMgYW5kIGFkZHJlc3NlcyBkdXJpbmcgZGlzY292ZXJ5LgotZGVmIGdlbmVyYXRlX3JhbmRvbV9uYW1lKCk6Ci0gICAgcmV0dXJuICcnLmpvaW4ocmFuZG9tLlN5c3RlbVJhbmRvbSgpLmNob2ljZShzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgXAotICAgICAgc3RyaW5nLmRpZ2l0cykgZm9yIF8gaW4gcmFuZ2UoREVWSUNFX05BTUVfTEVOR1RIKSkKLQotCi1kZWYgZ2VuZXJhdGVfcmFuZG9tX2FkZHJlc3MoKToKLSAgICByZXR1cm4gJycuam9pbihyYW5kb20uU3lzdGVtUmFuZG9tKCkuY2hvaWNlKHN0cmluZy5kaWdpdHMpIGZvciBfIGluIFwKLSAgICAgIHJhbmdlKERFVklDRV9BRERSRVNTX0xFTkdUSCkpCi0KLQotY2xhc3MgQ29ubmVjdGlvbihvYmplY3QpOgotICAgICIiIlNpbXBsZSB3cmFwcGVyIGNsYXNzIGZvciBhIHNvY2tldCBvYmplY3QuCi0KLSAgQXR0cmlidXRlczoKLSAgICBzb2NrZXQ6IFRoZSB1bmRlcmx5aW5nIHNvY2tldCBjcmVhdGVkIGZvciB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIHBvcnQuCi0gICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgotICAgICAgICBzZWxmLl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgICAgIHNlbGYuX3NvY2tldC5jb25uZWN0KCgnbG9jYWxob3N0JywgcG9ydCkpCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuX3NvY2tldC5jbG9zZSgpCi0KLSAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5fc29ja2V0LnNlbmRhbGwoZGF0YS5lbmNvZGUoKSkKLQotICAgIGRlZiByZWNlaXZlKHNlbGYsIHNpemUpOgotICAgICAgICByZXR1cm4gc2VsZi5fc29ja2V0LnJlY3Yoc2l6ZSkKLQotCi1jbGFzcyBUZXN0Q2hhbm5lbChvYmplY3QpOgotICAgICIiIkNoZWNrcyBvdXRnb2luZyBjb21tYW5kcyBhbmQgc2VuZHMgdGhlbSBvbmNlIHZlcmlmaWVkLgotCi0gIEF0dHJpYnV0ZXM6Ci0gICAgY29ubmVjdGlvbjogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIHRlc3QgdmVuZG9yIGxpYnJhcnkgdGhhdCBjb21tYW5kcyBhcmUgc2VudAotICAgICAgb24uCi0gICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gQ29ubmVjdGlvbihwb3J0KQotICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKLSAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQotCi0gICAgZGVmIHNlbmRfY29tbWFuZChzZWxmLCBuYW1lLCBhcmdzKToKLSAgICAgICAgbmFtZV9zaXplID0gbGVuKG5hbWUpCi0gICAgICAgIGFyZ3Nfc2l6ZSA9IGxlbihhcmdzKQotICAgICAgICBzZWxmLmxpbnRfY29tbWFuZChuYW1lLCBhcmdzLCBuYW1lX3NpemUsIGFyZ3Nfc2l6ZSkKLSAgICAgICAgZW5jb2RlZF9uYW1lID0gY2hyKG5hbWVfc2l6ZSkgKyBuYW1lCi0gICAgICAgIGVuY29kZWRfYXJncyA9IGNocihhcmdzX3NpemUpICsgJycuam9pbihjaHIobGVuKGFyZykpICsgYXJnIGZvciBhcmcgaW4gYXJncykKLSAgICAgICAgY29tbWFuZCA9IGVuY29kZWRfbmFtZSArIGVuY29kZWRfYXJncwotICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5fY29ubmVjdGlvbi5zZW5kKGNvbW1hbmQpCi0gICAgICAgIGlmIG5hbWUgIT0gJ0NMT1NFX1RFU1RfQ0hBTk5FTCc6Ci0gICAgICAgICAgICBwcmludChzZWxmLnJlY2VpdmVfcmVzcG9uc2UoKS5kZWNvZGUoKSkKLQotICAgIGRlZiByZWNlaXZlX3Jlc3BvbnNlKHNlbGYpOgotICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICByZXR1cm4gYidDbG9zZWQnCi0gICAgICAgIHNpemVfY2hhcnMgPSBzZWxmLl9jb25uZWN0aW9uLnJlY2VpdmUoNCkKLSAgICAgICAgc2l6ZV9ieXRlcyA9IGJ5dGVhcnJheShzaXplX2NoYXJzKQotICAgICAgICBpZiBub3Qgc2l6ZV9jaGFyczoKLSAgICAgICAgICAgIHJldHVybiBiJ05vIHJlc3BvbnNlLCBhc3N1bWluZyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGJyb2tlbicKLSAgICAgICAgcmVzcG9uc2Vfc2l6ZSA9IDAKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHNpemVfY2hhcnMpIC0gMSk6Ci0gICAgICAgICAgICByZXNwb25zZV9zaXplIHw9IChzaXplX2NoYXJzW2ldIDw8ICg4ICogaSkpCi0gICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY29ubmVjdGlvbi5yZWNlaXZlKHJlc3BvbnNlX3NpemUpCi0gICAgICAgIHJldHVybiByZXNwb25zZQotCi0gICAgZGVmIGxpbnRfY29tbWFuZChzZWxmLCBuYW1lLCBhcmdzLCBuYW1lX3NpemUsIGFyZ3Nfc2l6ZSk6Ci0gICAgICAgIGFzc2VydCBuYW1lX3NpemUgPT0gbGVuKG5hbWUpIGFuZCBhcmdzX3NpemUgPT0gbGVuKGFyZ3MpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG5hbWUuZW5jb2RlKCkKLSAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgICAgICBhcmcuZW5jb2RlKCkKLSAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCdVbnJlY29nbml6ZWQgY2hhcmFjdGVycy4nKQotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgaWYgbmFtZV9zaXplID4gMjU1IG9yIGFyZ3Nfc2l6ZSA+IDI1NToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IgICMgU2l6ZSBtdXN0IGJlIGVuY29kYWJsZSBpbiBvbmUgb2N0ZXQuCi0gICAgICAgIGZvciBhcmcgaW4gYXJnczoKLSAgICAgICAgICAgIGlmIGxlbihhcmcpID4gMjU1OgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IgICMgU2l6ZSBtdXN0IGJlIGVuY29kYWJsZSBpbiBvbmUgb2N0ZXQuCi0KLQotY2xhc3MgVGVzdENoYW5uZWxTaGVsbChjbWQuQ21kKToKLSAgICAiIiJTaGVsbCBmb3Igc2VuZGluZyB0ZXN0IGNoYW5uZWwgZGF0YSB0byBjb250cm9sbGVyLgotCi0gIE1hbmFnZXMgdGhlIHRlc3QgY2hhbm5lbCB0byB0aGUgY29udHJvbGxlciBhbmQgZGVmaW5lcyBhIHNldCBvZiBjb21tYW5kcyB0aGUKLSAgdXNlciBjYW4gc2VuZCB0byB0aGUgY29udHJvbGxlciBhcyB3ZWxsLiBUaGVzZSBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkIHBhcmFsbGVsCi0gIHRvIGNvbW1hbmRzIHNlbnQgZnJvbSB0aGUgZGV2aWNlIHN0YWNrIGFuZCB1c2VkIHRvIHByb3ZpZGUgYWRkaXRpb25hbAotICBkZWJ1Z2dpbmcvdGVzdGluZyBjYXBhYmlsaXRpZXMuCi0KLSAgQXR0cmlidXRlczoKLSAgICB0ZXN0X2NoYW5uZWw6IFRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgdG8gc2VuZCBkYXRhIHRvIHRoZSBjb250cm9sbGVyLgotICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2NoYW5uZWwpOgotICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbCA9IHRlc3RfY2hhbm5lbAotCi0gICAgZGVmIGRvX2FkZChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBkZXZfdHlwZV9zdHIgQWRkIGEgbmV3IGRldmljZSBvZiB0eXBlIGRldl90eXBlX3N0ci4KLQotICAgICIiIgotICAgICAgICBzZWxmLl90ZXN0X2NoYW5uZWwuc2VuZF9jb21tYW5kKCdhZGQnLCBhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fZGVsKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IGRldmljZSBpbmRleCBEZWxldGUgdGhlIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnZGVsJywgYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX2FkZF9waHkoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogZGV2X3R5cGVfc3RyIEFkZCBhIG5ldyBkZXZpY2Ugb2YgdHlwZSBkZXZfdHlwZV9zdHIuCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnYWRkX3BoeScsIGFyZ3Muc3BsaXQoKSkKLQotICAgIGRlZiBkb19kZWxfcGh5KHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IHBoeSBpbmRleCBEZWxldGUgdGhlIHBoeSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnZGVsX3BoeScsIGFyZ3Muc3BsaXQoKSkKLQotICAgIGRlZiBkb19hZGRfZGV2aWNlX3RvX3BoeShzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBkZXZpY2UgaW5kZXggcGh5IGluZGV4IEFkZCBhIG5ldyBkZXZpY2Ugb2YgdHlwZSBkZXZfdHlwZV9zdHIuCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnYWRkX2RldmljZV90b19waHknLCBhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fZGVsX2RldmljZV9mcm9tX3BoeShzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBwaHkgaW5kZXggRGVsZXRlIHRoZSBwaHkgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbC5zZW5kX2NvbW1hbmQoJ2RlbF9kZXZpY2VfZnJvbV9waHknLCBhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fYWRkX3JlbW90ZShzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBkZXZfdHlwZV9zdHIgQ29ubmVjdCB0byBhIHJlbW90ZSBkZXZpY2UgYXQgYXJnMUBhcmcyLgotCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbC5zZW5kX2NvbW1hbmQoJ2FkZF9yZW1vdGUnLCBhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fZ2V0KHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IGRldl9udW0gYXR0cl9zdHIgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGF0dHJfc3RyIGZyb20gZGV2aWNlIGRldl9udW0uCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnZ2V0JywgYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX3NldChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBkZXZfbnVtIGF0dHJfc3RyIHZhbCBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYXR0cl9zdHIgZnJvbSBkZXZpY2UgZGV2X251bSBlcXVhbCB0byB2YWwuCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnc2V0JywgYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX3NldF9kZXZpY2VfYWRkcmVzcyhzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBkZXZfbnVtIGFkZHIgU2V0IHRoZSBhZGRyZXNzIG9mIGRldmljZSBkZXZfbnVtIGVxdWFsIHRvIGFkZHIuCi0KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnc2V0X2RldmljZV9hZGRyZXNzJywgYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX2xpc3Qoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogW2Rldl9udW0gW2F0dHJdXSBMaXN0IHRoZSBkZXZpY2VzIGZyb20gdGhlIGNvbnRyb2xsZXIsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgZGV2aWNlIGFuZCBhdHRyLgotCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbC5zZW5kX2NvbW1hbmQoJ2xpc3QnLCBhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fc2V0X3RpbWVyX3BlcmlvZChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBwZXJpb2RfbXMgU2V0IHRoZSB0aW1lciB0byBmaXJlIGV2ZXJ5IHBlcmlvZF9tcyBtaWxsaXNlY29uZHMKLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnc2V0X3RpbWVyX3BlcmlvZCcsIGFyZ3Muc3BsaXQoKSkKLQotICAgIGRlZiBkb19zdGFydF90aW1lcihzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiBOb25lLiBTdGFydCB0aGUgdGltZXIuCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbC5zZW5kX2NvbW1hbmQoJ3N0YXJ0X3RpbWVyJywgYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIGRvX3N0b3BfdGltZXIoc2VsZiwgYXJncyk6Ci0gICAgICAgICIiIkFyZ3VtZW50czogTm9uZS4gU3RvcCB0aGUgdGltZXIuCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbC5zZW5kX2NvbW1hbmQoJ3N0b3BfdGltZXInLCBhcmdzLnNwbGl0KCkpCi0KLSAgICBkZWYgZG9fd2FpdChzZWxmLCBhcmdzKToKLSAgICAgICAgIiIiQXJndW1lbnRzOiB0aW1lIGluIHNlY29uZHMgKGZsb2F0KS4KLSAgICAiIiIKLSAgICAgICAgc2xlZXBfdGltZSA9IGZsb2F0KGFyZ3Muc3BsaXQoKVswXSkKLSAgICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQotCi0gICAgZGVmIGRvX3Jlc2V0KHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IE5vbmUuCi0KLSAgICBSZXNldHMgdGhlIHNpbXVsYXRpb24uCi0gICAgIiIiCi0gICAgICAgIHNlbGYuX3Rlc3RfY2hhbm5lbC5zZW5kX2NvbW1hbmQoJ3Jlc2V0JywgW10pCi0KLSAgICBkZWYgZG9fZW5kKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IE5vbmUuCi0KLSAgICBFbmRzIHRoZSBzaW11bGF0aW9uIGFuZCBleGl0cy4KLSAgICAiIiIKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLnNlbmRfY29tbWFuZCgnRU5EX1NJTVVMQVRJT04nLCBbXSkKLSAgICAgICAgcHJpbnQoJ0dvb2RieWUuJykKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBkb19xdWl0KHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IE5vbmUuCi0KLSAgICBFeGl0cyB0aGUgdGVzdCBjaGFubmVsLgotICAgICIiIgotICAgICAgICBzZWxmLl90ZXN0X2NoYW5uZWwuc2VuZF9jb21tYW5kKCdDTE9TRV9URVNUX0NIQU5ORUwnLCBbXSkKLSAgICAgICAgc2VsZi5fdGVzdF9jaGFubmVsLmNsb3NlKCkKLSAgICAgICAgcHJpbnQoJ0dvb2RieWUuJykKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBkb19oZWxwKHNlbGYsIGFyZ3MpOgotICAgICAgICAiIiJBcmd1bWVudHM6IFtkZXZfbnVtIFthdHRyXV0gTGlzdCB0aGUgY29tbWFuZHMgYXZhaWxhYmxlLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGRldmljZSBhbmQgYXR0ci4KLQotICAgICIiIgotICAgICAgICBpZiAobGVuKGFyZ3MpID09IDApOgotICAgICAgICAgICAgY21kLkNtZC5kb19oZWxwKHNlbGYsIGFyZ3MpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl90ZXN0X2NoYW5uZWwuc2VuZF9jb21tYW5kKCdoZWxwJywgYXJncy5zcGxpdCgpKQotCi0gICAgZGVmIHByZWxvb3Aoc2VsZik6Ci0gICAgICAgICIiIkNsZWFyIG91dCB0aGUgYnVmZmVyCi0KLSAgICAiIiIKLSAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl90ZXN0X2NoYW5uZWwucmVjZWl2ZV9yZXNwb25zZSgpCi0KLSAgICAjZGVmIHBvc3RjbWQoc2VsZiwgc3RvcCwgbGluZSk6Ci0gICAgIyIiIgotICAgICNDYWxsZWQgYWZ0ZXIgZWFjaCBjb21tYW5kCi0gICAgI3N0b3AgOiB3aGV0aGVyIHdlIHdpbGwgc3RvcCBhZnRlciB0aGlzIGNvbW1hbmQKLSAgICAjbGluZSA6IHRoZSBwcmV2aW91cyBpbnB1dCBsaW5lCi0gICAgI1JldHVybiBUcnVlIHRvIHN0b3AsIEZhbHNlIHRvIGNvbnRpbnVlCi0gICAgIyIiIgotICAgICNpZiBzdG9wOgotICAgICNyZXR1cm4gVHJ1ZQotICAgICNyZXNwb25zZSA9IHNlbGYuX3Rlc3RfY2hhbm5lbC5yZWNlaXZlX3Jlc3BvbnNlKCkKLSAgICAjaWYgbm90IHJlc3BvbnNlOgotICAgICNyZXR1cm4gVHJ1ZQotICAgICNwcmludCByZXNwb25zZQotICAgICNyZXR1cm4gRmFsc2UKLQotCi1kZWYgbWFpbihhcmd2KToKLSAgICBpZiBsZW4oYXJndikgIT0gMjoKLSAgICAgICAgcHJpbnQoJ1VzYWdlOiBweXRob24gdGVzdF9jaGFubmVsLnB5IFtwb3J0XScpCi0gICAgICAgIHJldHVybgotICAgIHRyeToKLSAgICAgICAgcG9ydCA9IGludChhcmd2WzFdKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICBwcmludCgnRXJyb3IgcGFyc2luZyBwb3J0LicpCi0gICAgZWxzZToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9jaGFubmVsID0gVGVzdENoYW5uZWwocG9ydCkKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgotICAgICAgICAgICAgcHJpbnQoJ0Vycm9yIGNvbm5lY3RpbmcgdG8gc29ja2V0OiAlcycgJSBlKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCgnRXJyb3IgY3JlYXRpbmcgdGVzdCBjaGFubmVsIChjaGVjayBhcmd1bWVudCkuJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRlc3RfY2hhbm5lbF9zaGVsbCA9IFRlc3RDaGFubmVsU2hlbGwodGVzdF9jaGFubmVsKQotICAgICAgICAgICAgdGVzdF9jaGFubmVsX3NoZWxsLnByb21wdCA9ICckICcKLSAgICAgICAgICAgIHRlc3RfY2hhbm5lbF9zaGVsbC5jbWRsb29wKCdXZWxjb21lIHRvIHRoZSBSb290Q2FuYWwgQ29uc29sZSBcbicgKyAnVHlwZSBcJ2hlbHBcJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2FzeW5jX21hbmFnZXJfdW5pdHRlc3QuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9hc3luY19tYW5hZ2VyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExOWFiLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2FzeW5jX21hbmFnZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaCIKLQotI2luY2x1ZGUgPGZjbnRsLmg+ICAgICAgICAvLyBmb3IgZmNudGwsIEZfU0VURkwsIE9fTk9OQkxPQ0sKLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPiAgLy8gZm9yIE1lc3NhZ2UsIFRlc3RQYXJ0UmVzdWx0LCBTdWl0ZUFwaS4uLgotI2luY2x1ZGUgPG5ldGRiLmg+ICAgICAgICAvLyBmb3IgZ2V0aG9zdGJ5bmFtZSwgaF9hZGRyLCBob3N0ZW50Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgIC8vIGZvciBzb2NrYWRkcl9pbiwgaW5fYWRkciwgSU5BRERSX0FOWQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAvLyBmb3IgcHJpbnRmCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgIC8vIGZvciBzb2NrZXQsIEFGX0lORVQsIGFjY2VwdCwgYmluZAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAvLyBmb3IgaW5fYWRkcl90Ci0jaW5jbHVkZSA8dGltZS5oPiAgICAgICAgIC8vIGZvciBOVUxMLCBzaXplX3QKLSNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgLy8gZm9yIGNsb3NlLCB3cml0ZSwgcmVhZAotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPiAgLy8gZm9yIGNvbmRpdGlvbl92YXJpYWJsZQotI2luY2x1ZGUgPGNzdGRpbnQ+ICAgICAgICAgICAgIC8vIGZvciB1aW50MTZfdAotI2luY2x1ZGUgPGNzdHJpbmc+ICAgICAgICAgICAgIC8vIGZvciBtZW1zZXQsIHN0cmNtcCwgc3RyY3B5LCBzdHJsZW4KLSNpbmNsdWRlIDxtdXRleD4gICAgICAgICAgICAgICAvLyBmb3IgbXV0ZXgKLSNpbmNsdWRlIDxyYXRpbz4gICAgICAgICAgICAgICAvLyBmb3IgcmF0aW8KLSNpbmNsdWRlIDxzdHJpbmc+ICAgICAgICAgICAgICAvLyBmb3Igc3RyaW5nCi0jaW5jbHVkZSA8dHVwbGU+ICAgICAgICAgICAgICAgLy8gZm9yIHR1cGxlCi0KLSNpbmNsdWRlICJvc2kvaW5jbHVkZS9vc2kuaCIgIC8vIGZvciBPU0lfTk9fSU5UUgotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgRXZlbnQgewotIHB1YmxpYzoKLSAgdm9pZCBzZXQoYm9vbCBzZXQgPSB0cnVlKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhtXyk7Ci0gICAgc2V0XyA9IHNldDsKLSAgICBjdl8ubm90aWZ5X2FsbCgpOwotICB9Ci0KLSAgdm9pZCByZXNldCgpIHsgc2V0KGZhbHNlKTsgfQotCi0gIGJvb2wgd2FpdF9mb3Ioc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyB0aW1lb3V0KSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhtXyk7Ci0gICAgcmV0dXJuIGN2Xy53YWl0X2ZvcihsaywgdGltZW91dCwgWyZdIHsgcmV0dXJuIHNldF87IH0pOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvciooKSB7IHJldHVybiBzZXRfOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6Om11dGV4IG1fOwotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdl87Ci0gIGJvb2wgc2V0X3tmYWxzZX07Ci19OwotCi1jbGFzcyBBc3luY01hbmFnZXJTb2NrZXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgdWludDE2X3Qga1BvcnQgPSA2MTExOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJTaXplID0gMTY7Ci0KLSAgYm9vbCBDaGVja0J1ZmZlckVxdWFscygpIHsKLSAgICByZXR1cm4gc3RyY21wKHNlcnZlcl9idWZmZXJfLCBjbGllbnRfYnVmZmVyXykgPT0gMDsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBpbnQgU3RhcnRTZXJ2ZXIoKSB7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZfYWRkciA9IHt9OwotICAgIGludCBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0gICAgRVhQRUNUX0ZBTFNFKGZkIDwgMCk7Ci0KLSAgICBzZXJ2X2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgc2Vydl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci0gICAgc2Vydl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoa1BvcnQpOwotICAgIGludCByZXVzZV9mbGFnID0gMTsKLSAgICBFWFBFQ1RfRkFMU0Uoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmcmV1c2VfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmV1c2VfZmxhZykpIDwgMCk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJpbmQoZmQsIChzb2NrYWRkciopJnNlcnZfYWRkciwgc2l6ZW9mKHNlcnZfYWRkcikpIDwgMCk7Ci0KLSAgICBsaXN0ZW4oZmQsIDEpOwotICAgIHJldHVybiBmZDsKLSAgfQotCi0gIGludCBBY2NlcHRDb25uZWN0aW9uKGludCBmZCkgewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGlfYWRkcjsKLSAgICBtZW1zZXQoJmNsaV9hZGRyLCAwLCBzaXplb2YoY2xpX2FkZHIpKTsKLSAgICBzb2NrbGVuX3QgY2xpbGVuID0gc2l6ZW9mKGNsaV9hZGRyKTsKLQotICAgIGludCBjb25uZWN0aW9uX2ZkID0gYWNjZXB0KGZkLCAoc3RydWN0IHNvY2thZGRyKikmY2xpX2FkZHIsICZjbGlsZW4pOwotICAgIEVYUEVDVF9GQUxTRShjb25uZWN0aW9uX2ZkIDwgMCk7Ci0KLSAgICByZXR1cm4gY29ubmVjdGlvbl9mZDsKLSAgfQotCi0gIHN0ZDo6dHVwbGU8aW50LCBpbnQ+IENvbm5lY3RTb2NrZXRQYWlyKCkgewotICAgIGludCBjbGkgPSBDb25uZWN0Q2xpZW50KCk7Ci0gICAgV3JpdGVGcm9tQ2xpZW50KGNsaSk7Ci0gICAgQXdhaXRTZXJ2ZXJSZXNwb25zZShjbGkpOwotICAgIGludCBzZXIgPSBjb25uZWN0aW9uX2ZkXzsKLSAgICBjb25uZWN0aW9uX2ZkXyA9IC0xOwotICAgIHJldHVybiB7Y2xpLCBzZXJ9OwotICB9Ci0KLSAgdm9pZCBSZWFkSW5jb21pbmdNZXNzYWdlKGludCBmZCkgewotICAgIGludCBuOwotICAgIE9TSV9OT19JTlRSKG4gPSByZWFkKGZkLCBzZXJ2ZXJfYnVmZmVyXywga0J1ZmZlclNpemUgLSAxKSk7Ci0gICAgQVNTRVJUX0dFKG4sIDApIDw8IHN0cmVycm9yKGVycm5vKTsKLQotICAgIGlmIChuID09IDApIHsgIC8vIGdvdCBFT0YKLSAgICAgIGFzeW5jX21hbmFnZXJfLlN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9yKGZkKTsKLSAgICAgIGNsb3NlKGZkKTsKLSAgICB9IGVsc2UgewotICAgICAgbiA9IHdyaXRlKGZkLCAiMSIsIDEpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgbWVtc2V0KHNlcnZlcl9idWZmZXJfLCAwLCBrQnVmZmVyU2l6ZSk7Ci0KLSAgICBzb2NrZXRfZmRfID0gU3RhcnRTZXJ2ZXIoKTsKLQotICAgIGFzeW5jX21hbmFnZXJfLldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKHNvY2tldF9mZF8sIFt0aGlzXShpbnQgZmQpIHsKLSAgICAgIGNvbm5lY3Rpb25fZmRfID0gQWNjZXB0Q29ubmVjdGlvbihmZCk7Ci0KLSAgICAgIGFzeW5jX21hbmFnZXJfLldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKAotICAgICAgICAgIGNvbm5lY3Rpb25fZmRfLCBbdGhpc10oaW50IGZkKSB7IFJlYWRJbmNvbWluZ01lc3NhZ2UoZmQpOyB9KTsKLSAgICB9KTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgYXN5bmNfbWFuYWdlcl8uU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3Ioc29ja2V0X2ZkXyk7Ci0gICAgY2xvc2Uoc29ja2V0X2ZkXyk7Ci0gICAgQVNTRVJUX1RSVUUoQ2hlY2tCdWZmZXJFcXVhbHMoKSk7Ci0gIH0KLQotICBpbnQgQ29ubmVjdENsaWVudCgpIHsKLSAgICBpbnQgc29ja2V0X2NsaV9mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0gICAgRVhQRUNUX0dFKHNvY2tldF9jbGlfZmQsIDApIDw8IHN0cmVycm9yKGVycm5vKTsKLQotICAgIHN0cnVjdCBob3N0ZW50KiBzZXJ2ZXI7Ci0gICAgc2VydmVyID0gZ2V0aG9zdGJ5bmFtZSgibG9jYWxob3N0Iik7Ci0gICAgRVhQRUNUX0ZBTFNFKHNlcnZlciA9PSBOVUxMKSA8PCBzdHJlcnJvcihlcnJubyk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2Vydl9hZGRyOwotICAgIG1lbXNldCgodm9pZCopJnNlcnZfYWRkciwgMCwgc2l6ZW9mKHNlcnZfYWRkcikpOwotICAgIHNlcnZfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBzZXJ2X2FkZHIuc2luX2FkZHIuc19hZGRyID0gKihyZWludGVycHJldF9jYXN0PGluX2FkZHJfdCo+KHNlcnZlci0+aF9hZGRyKSk7Ci0gICAgc2Vydl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoa1BvcnQpOwotCi0gICAgaW50IHJlc3VsdCA9Ci0gICAgICAgIGNvbm5lY3Qoc29ja2V0X2NsaV9mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNlcnZfYWRkciwgc2l6ZW9mKHNlcnZfYWRkcikpOwotICAgIEVYUEVDVF9HRShyZXN1bHQsIDApIDw8IHN0cmVycm9yKGVycm5vKTsKLQotICAgIHJldHVybiBzb2NrZXRfY2xpX2ZkOwotICB9Ci0KLSAgdm9pZCBXcml0ZUZyb21DbGllbnQoaW50IHNvY2tldF9jbGlfZmQpIHsKLSAgICBzdHJjcHkoY2xpZW50X2J1ZmZlcl8sICIxIik7Ci0gICAgaW50IG4gPSB3cml0ZShzb2NrZXRfY2xpX2ZkLCBjbGllbnRfYnVmZmVyXywgc3RybGVuKGNsaWVudF9idWZmZXJfKSk7Ci0gICAgQVNTRVJUX0dUKG4sIDApIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfQotCi0gIHZvaWQgQXdhaXRTZXJ2ZXJSZXNwb25zZShpbnQgc29ja2V0X2NsaV9mZCkgewotICAgIGludCBuID0gcmVhZChzb2NrZXRfY2xpX2ZkLCBjbGllbnRfYnVmZmVyXywgMSk7Ci0gICAgQVNTRVJUX0dUKG4sIDApIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBBc3luY01hbmFnZXIgYXN5bmNfbWFuYWdlcl87Ci0gIGludCBzb2NrZXRfZmRfOwotICBpbnQgY29ubmVjdGlvbl9mZF87Ci0gIGNoYXIgc2VydmVyX2J1ZmZlcl9ba0J1ZmZlclNpemVdOwotICBjaGFyIGNsaWVudF9idWZmZXJfW2tCdWZmZXJTaXplXTsKLX07Ci0KLVRFU1RfRihBc3luY01hbmFnZXJTb2NrZXRUZXN0LCBUZXN0T25lQ29ubmVjdGlvbikgewotICBpbnQgc29ja2V0X2NsaV9mZCA9IENvbm5lY3RDbGllbnQoKTsKLQotICBXcml0ZUZyb21DbGllbnQoc29ja2V0X2NsaV9mZCk7Ci0KLSAgQXdhaXRTZXJ2ZXJSZXNwb25zZShzb2NrZXRfY2xpX2ZkKTsKLQotICBjbG9zZShzb2NrZXRfY2xpX2ZkKTsKLX0KLQotVEVTVF9GKEFzeW5jTWFuYWdlclNvY2tldFRlc3QsIENhblVuc3Vic2NyaWJlSW5DYWxsYmFjaykgewotICBpbnQgc29ja2V0X2NsaV9mZCA9IENvbm5lY3RDbGllbnQoKTsKLSAgV3JpdGVGcm9tQ2xpZW50KHNvY2tldF9jbGlfZmQpOwotICBBd2FpdFNlcnZlclJlc3BvbnNlKHNvY2tldF9jbGlfZmQpOwotICBmY250bChjb25uZWN0aW9uX2ZkXywgRl9TRVRGTCwgT19OT05CTE9DSyk7Ci0KLSAgc3RkOjpzdHJpbmcgZGF0YSgneCcsIDMyKTsKLQotICBib29sIHN0b3BwZWQgPSBmYWxzZTsKLSAgYXN5bmNfbWFuYWdlcl8uV2F0Y2hGZEZvck5vbkJsb2NraW5nUmVhZHMoY29ubmVjdGlvbl9mZF8sIFsmXShpbnQgZmQpIHsKLSAgICBhc3luY19tYW5hZ2VyXy5TdG9wV2F0Y2hpbmdGaWxlRGVzY3JpcHRvcihmZCk7Ci0gICAgY2hhciBidWZbMzJdOwotICAgIHdoaWxlIChyZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA+IDApCi0gICAgICA7Ci0gICAgc3RvcHBlZCA9IHRydWU7Ci0gIH0pOwotCi0gIHdoaWxlICghc3RvcHBlZCkgewotICAgIHdyaXRlKHNvY2tldF9jbGlfZmQsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gIH0KLQotICBTVUNDRUVEKCk7Ci0gIGNsb3NlKHNvY2tldF9jbGlfZmQpOwotfQotCi1URVNUX0YoQXN5bmNNYW5hZ2VyU29ja2V0VGVzdCwgTm9FdmVudHNBZnRlclVuc3Vic2NyaWJlKSB7Ci0gIC8vIFRoaXMgdGVzdHMgbWFrZXMgc3VyZSB0aGUgQXN5bmNNYW5hZ2VyIG5ldmVyIGZpcmVzIGFuIGV2ZW50Ci0gIC8vIGFmdGVyIGNhbGxpbmcgU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3IuCi0gIHVzaW5nIGNsb2NrID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwotCi0gIGNsb2NrOjp0aW1lX3BvaW50IHRpbWVfZmFzdF9jYWxsZWQ7Ci0gIGNsb2NrOjp0aW1lX3BvaW50IHRpbWVfc2xvd19jYWxsZWQ7Ci0gIGNsb2NrOjp0aW1lX3BvaW50IHRpbWVfc3RvcHBlZF9saXN0ZW5pbmc7Ci0KLSAgaW50IHJvdW5kID0gMDsKLSAgYXV0byBbc2xvd19jbGlfZmQsIHNsb3dfc19mZF0gPSBDb25uZWN0U29ja2V0UGFpcigpOwotICBmY250bChzbG93X3NfZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotCi0gIGF1dG8gW2Zhc3RfY2xpX2ZkLCBmYXN0X3NfZmRdID0gQ29ubmVjdFNvY2tldFBhaXIoKTsKLSAgZmNudGwoZmFzdF9zX2ZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLQotICBzdGQ6OnN0cmluZyBkYXRhKDEsICd4Jyk7Ci0KLSAgLy8gVGhlIGlkZWEgaGVyZSBpcyBhcyBmb2xsb3dzOgotICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFuIHVuc3Vic2NyaWJlZCBjYWxsYmFjayBuZXZlciBnZXRzIGNhbGxlZC4KLSAgLy8gVGhpcyBpcyB0byBtYWtlIHN1cmUgd2UgY2FuIHNhZmVseSBkbyB0aGluZ3MgbGlrZSB0aGlzOgotICAvLwotICAvLyBjbGFzcyBGb28gewotICAvLyAgIEZvbyhpbnQgZmQsIEFzeW5jTWFuYWdlciogYW0pIDogZmRfKGZkKSwgYW1fKGFtKSB7Ci0gIC8vICAgICBhbV8tPldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKAotICAvLyAgICAgICAgIGZkLCBbJl0oaW50IGZkKSB7IHByaW50ZigiVGhpcyBzaG91bGRuJ3QgY3Jhc2ghICVwXG4iLCB0aGlzKTsgfSk7Ci0gIC8vICAgfQotICAvLyAgIH5Gb28oKSB7IGFtXy0+U3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3IoZmRfKTsgfQotICAvLwotICAvLyAgIEFzeW5jTWFuYWdlciogYW1fOwotICAvLyAgIGludCBmZF87Ci0gIC8vIH07Ci0gIC8vCi0gIC8vIFdlIGFyZSBnb2luZyB0byBmb3JjZSBhIGZhaWx1cmUgYXMgZm9sbG93czoKLSAgLy8KLSAgLy8gVGhlIHNsb3cgY2FsbGJhY2sgbmVlZHMgdG8gYmUgY2FsbGVkIGZpcnN0LCBpZiBpdCBkb2VzIG5vdCB3ZSBjYW5ub3QKLSAgLy8gZm9yY2UgZmFpbHVyZSwgc28gd2UgaGF2ZSB0byB0cnkgbXVsdGlwbGUgdGltZXMuCi0gIC8vCi0gIC8vIHQxLCBpcyB0aGUgdGhyZWFkIGRvaW5nIHRoZSBsb29wLgotICAvLyB0MiwgaXMgdGhlIGFzeW5jIG1hbmFnZXIgaGFuZGxlciB0aHJlYWQuCi0gIC8vCi0gIC8vIHQxIHdpbGwgYmxvY2sgdW50aWwgdGhlIHNsb3djYWxsYmFjay4KLSAgLy8gdDIgd2lsbCBub3cgYmxvY2sgKGZvciBhdCBtb3N0IDI1MCBtcykuCi0gIC8vIHQxIHdpbGwgdW5zdWJzY3JpYmUgdGhlIGZhc3QgY2FsbGJhY2suCi0gIC8vIDIgY2FzZXM6Ci0gIC8vICAgd2l0aCBidWc6Ci0gIC8vICAgICAgLSB0MSB0YWtlcyBhIHRpbWVzdGFtcCwgdW5ibG9ja3MgdDIsCi0gIC8vICAgICAgLSB0MiBpbnZva2VzIHRoZSBmYXN0IGNhbGxiYWNrLCBhbmQgZ2V0cyBhIHRpbWVzdGFtcC4KLSAgLy8gICAgICAtIE5vdyB0aGUgdW5zdWJzY3JpYmUgdGltZSBpcyBiZWZvcmUgdGhlIGNhbGxiYWNrIHRpbWUuCi0gIC8vICAgd2l0aG91dCBidWcuOgotICAvLyAgICAgIC0gdDEgbG9ja3MgdW4gdW5zdXNiY3JpYmUgaW4gYXN5biBtYW5hZ2VyCi0gIC8vICAgICAgLSB0MiB1bmxvY2tzIGR1ZSB0byB0aW1lb3V0LAotICAvLyAgICAgIC0gdDIgaW52b2tlcyB0aGUgZmFzdCBjYWxsYmFjaywgYW5kIGdldHMgYSB0aW1lc3RhbXAuCi0gIC8vICAgICAgLSB0MSBpcyB1bmxvY2tlZCBhbmQgZ2V0cyBhIHRpbWVzdGFtcC4KLSAgLy8gICAgICAtIE5vdyB0aGUgdW5zdWJzY3JpYmUgdGltZSBpcyBhZnRlciB0aGUgY2FsbGJhY2sgdGltZS4uCi0KLSAgZG8gewotICAgIEV2ZW50IHVuYmxvY2tfc2xvdywgaW5zbG93LCBpbmZhc3Q7Ci0gICAgdGltZV9mYXN0X2NhbGxlZCA9IHt9OwotICAgIHRpbWVfc2xvd19jYWxsZWQgPSB7fTsKLSAgICB0aW1lX3N0b3BwZWRfbGlzdGVuaW5nID0ge307Ci0gICAgcHJpbnRmKCJyb3VuZDogJWRcbiIsIHJvdW5kKyspOwotCi0gICAgLy8gUmVnaXN0ZXIgZmQgZXZlbnRzCi0gICAgYXN5bmNfbWFuYWdlcl8uV2F0Y2hGZEZvck5vbkJsb2NraW5nUmVhZHMoc2xvd19zX2ZkLCBbJl0oaW50IC8qZmQqLykgewotICAgICAgaWYgKCppbnNsb3cpIHJldHVybjsKLSAgICAgIHRpbWVfc2xvd19jYWxsZWQgPSBjbG9jazo6bm93KCk7Ci0gICAgICBwcmludGYoInNsb3c6ICVsbGRcbiIsCi0gICAgICAgICAgICAgdGltZV9zbG93X2NhbGxlZC50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSAlIDEwMDAwKTsKLSAgICAgIGluc2xvdy5zZXQoKTsKLSAgICAgIHVuYmxvY2tfc2xvdy53YWl0X2ZvcigyNW1zKTsKLSAgICB9KTsKLQotICAgIGFzeW5jX21hbmFnZXJfLldhdGNoRmRGb3JOb25CbG9ja2luZ1JlYWRzKGZhc3Rfc19mZCwgWyZdKGludCAvKmZkKi8pIHsKLSAgICAgIGlmICgqaW5mYXN0KSByZXR1cm47Ci0gICAgICB0aW1lX2Zhc3RfY2FsbGVkID0gY2xvY2s6Om5vdygpOwotICAgICAgcHJpbnRmKCJmYXN0OiAlbGxkXG4iLAotICAgICAgICAgICAgIHRpbWVfZmFzdF9jYWxsZWQudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkgJSAxMDAwMCk7Ci0gICAgICBpbmZhc3Quc2V0KCk7Ci0gICAgfSk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBmZCBldmVudHMKLSAgICB3cml0ZShmYXN0X2NsaV9mZCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgICB3cml0ZShzbG93X2NsaV9mZCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLQotICAgIC8vIEJsb2NrIGluIHRoZSByaWdodCBwbGFjZXMuCi0gICAgaWYgKGluc2xvdy53YWl0X2ZvcigyNW1zKSkgewotICAgICAgYXN5bmNfbWFuYWdlcl8uU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3IoZmFzdF9zX2ZkKTsKLSAgICAgIHRpbWVfc3RvcHBlZF9saXN0ZW5pbmcgPSBjbG9jazo6bm93KCk7Ci0gICAgICBwcmludGYoInN0b3A6ICVsbGRcbiIsCi0gICAgICAgICAgICAgdGltZV9zdG9wcGVkX2xpc3RlbmluZy50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSAlIDEwMDAwKTsKLSAgICAgIHVuYmxvY2tfc2xvdy5zZXQoKTsKLSAgICB9Ci0KLSAgICBpbmZhc3Qud2FpdF9mb3IoMjVtcyk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyLgotICAgIGFzeW5jX21hbmFnZXJfLlN0b3BXYXRjaGluZ0ZpbGVEZXNjcmlwdG9yKGZhc3Rfc19mZCk7Ci0gICAgYXN5bmNfbWFuYWdlcl8uU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3Ioc2xvd19zX2ZkKTsKLSAgfSB3aGlsZSAodGltZV9mYXN0X2NhbGxlZCA8IHRpbWVfc2xvd19jYWxsZWQpOwotCi0gIC8vIGZhc3QgYmVmb3JlIHN0b3AgbGlzdGVuaW5nLgotICBBU1NFUlRfTFQodGltZV9mYXN0X2NhbGxlZC50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSwKLSAgICAgICAgICAgIHRpbWVfc3RvcHBlZF9saXN0ZW5pbmcudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwotCi0gIC8vIENsZWFudXAKLSAgY2xvc2UoZmFzdF9jbGlfZmQpOwotICBjbG9zZShmYXN0X3NfZmQpOwotICBjbG9zZShzbG93X2NsaV9mZCk7Ci0gIGNsb3NlKHNsb3dfc19mZCk7Ci19Ci0KLVRFU1RfRihBc3luY01hbmFnZXJTb2NrZXRUZXN0LCBUZXN0UmVwZWF0ZWRDb25uZWN0aW9ucykgewotICBzdGF0aWMgY29uc3QgaW50IG51bV9jb25uZWN0aW9ucyA9IDMwOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jb25uZWN0aW9uczsgaSsrKSB7Ci0gICAgaW50IHNvY2tldF9jbGlfZmQgPSBDb25uZWN0Q2xpZW50KCk7Ci0gICAgV3JpdGVGcm9tQ2xpZW50KHNvY2tldF9jbGlfZmQpOwotICAgIEF3YWl0U2VydmVyUmVzcG9uc2Uoc29ja2V0X2NsaV9mZCk7Ci0gICAgY2xvc2Uoc29ja2V0X2NsaV9mZCk7Ci0gIH0KLX0KLQotVEVTVF9GKEFzeW5jTWFuYWdlclNvY2tldFRlc3QsIFRlc3RNdWx0aXBsZUNvbm5lY3Rpb25zKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgbnVtX2Nvbm5lY3Rpb25zID0gMzA7Ci0gIGludCBzb2NrZXRfY2xpX2ZkW251bV9jb25uZWN0aW9uc107Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2Nvbm5lY3Rpb25zOyBpKyspIHsKLSAgICBzb2NrZXRfY2xpX2ZkW2ldID0gQ29ubmVjdENsaWVudCgpOwotICAgIEFTU0VSVF9UUlVFKHNvY2tldF9jbGlfZmRbaV0gPiAwKTsKLSAgICBXcml0ZUZyb21DbGllbnQoc29ja2V0X2NsaV9mZFtpXSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY29ubmVjdGlvbnM7IGkrKykgewotICAgIEF3YWl0U2VydmVyUmVzcG9uc2Uoc29ja2V0X2NsaV9mZFtpXSk7Ci0gICAgY2xvc2Uoc29ja2V0X2NsaV9mZFtpXSk7Ci0gIH0KLX0KLQotY2xhc3MgQXN5bmNNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQXN5bmNNYW5hZ2VyIGFzeW5jX21hbmFnZXJfOwotfTsKLQotVEVTVF9GKEFzeW5jTWFuYWdlclRlc3QsIFRlc3RTZXR1cFRlYXJkb3duKSB7fQotCi1URVNUX0YoQXN5bmNNYW5hZ2VyVGVzdCwgVGVzdENhbmNlbFRhc2spIHsKLSAgQXN5bmNVc2VySWQgdXNlcjEgPSBhc3luY19tYW5hZ2VyXy5HZXROZXh0VXNlcklkKCk7Ci0gIGJvb2wgdGFzazFfcmFuID0gZmFsc2U7Ci0gIGJvb2wqIHRhc2sxX3Jhbl9wdHIgPSAmdGFzazFfcmFuOwotICBBc3luY1Rhc2tJZCB0YXNrMV9pZCA9Ci0gICAgICBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcjEsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2sxX3Jhbl9wdHJdKCkgeyAqdGFzazFfcmFuX3B0ciA9IHRydWU7IH0pOwotICBBU1NFUlRfVFJVRShhc3luY19tYW5hZ2VyXy5DYW5jZWxBc3luY1Rhc2sodGFzazFfaWQpKTsKLSAgQVNTRVJUX0ZBTFNFKHRhc2sxX3Jhbik7Ci19Ci0KLVRFU1RfRihBc3luY01hbmFnZXJUZXN0LCBUZXN0Q2FuY2VsTG9uZ1Rhc2spIHsKLSAgQXN5bmNVc2VySWQgdXNlcjEgPSBhc3luY19tYW5hZ2VyXy5HZXROZXh0VXNlcklkKCk7Ci0gIGJvb2wgdGFzazFfcmFuID0gZmFsc2U7Ci0gIGJvb2wqIHRhc2sxX3Jhbl9wdHIgPSAmdGFzazFfcmFuOwotICBBc3luY1Rhc2tJZCB0YXNrMV9pZCA9Ci0gICAgICBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcjEsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2sxX3Jhbl9wdHJdKCkgeyAqdGFzazFfcmFuX3B0ciA9IHRydWU7IH0pOwotICBib29sIHRhc2syX3JhbiA9IGZhbHNlOwotICBib29sKiB0YXNrMl9yYW5fcHRyID0gJnRhc2syX3JhbjsKLSAgQXN5bmNUYXNrSWQgdGFzazJfaWQgPQotICAgICAgYXN5bmNfbWFuYWdlcl8uRXhlY0FzeW5jKHVzZXIxLCBzdGQ6OmNocm9ubzo6c2Vjb25kcygyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFzazJfcmFuX3B0cl0oKSB7ICp0YXNrMl9yYW5fcHRyID0gdHJ1ZTsgfSk7Ci0gIEFTU0VSVF9GQUxTRSh0YXNrMV9yYW4pOwotICBBU1NFUlRfRkFMU0UodGFzazJfcmFuKTsKLSAgd2hpbGUgKCF0YXNrMV9yYW4pCi0gICAgOwotICBBU1NFUlRfRkFMU0UoYXN5bmNfbWFuYWdlcl8uQ2FuY2VsQXN5bmNUYXNrKHRhc2sxX2lkKSk7Ci0gIEFTU0VSVF9GQUxTRSh0YXNrMl9yYW4pOwotICBBU1NFUlRfVFJVRShhc3luY19tYW5hZ2VyXy5DYW5jZWxBc3luY1Rhc2sodGFzazJfaWQpKTsKLX0KLQotVEVTVF9GKEFzeW5jTWFuYWdlclRlc3QsIFRlc3RDYW5jZWxBc3luY1Rhc2tzRnJvbVVzZXIpIHsKLSAgQXN5bmNVc2VySWQgdXNlcjEgPSBhc3luY19tYW5hZ2VyXy5HZXROZXh0VXNlcklkKCk7Ci0gIEFzeW5jVXNlcklkIHVzZXIyID0gYXN5bmNfbWFuYWdlcl8uR2V0TmV4dFVzZXJJZCgpOwotICBib29sIHRhc2sxX3JhbiA9IGZhbHNlOwotICBib29sKiB0YXNrMV9yYW5fcHRyID0gJnRhc2sxX3JhbjsKLSAgYm9vbCB0YXNrMl9yYW4gPSBmYWxzZTsKLSAgYm9vbCogdGFzazJfcmFuX3B0ciA9ICZ0YXNrMl9yYW47Ci0gIGJvb2wgdGFzazNfcmFuID0gZmFsc2U7Ci0gIGJvb2wqIHRhc2szX3Jhbl9wdHIgPSAmdGFzazNfcmFuOwotICBib29sIHRhc2s0X3JhbiA9IGZhbHNlOwotICBib29sKiB0YXNrNF9yYW5fcHRyID0gJnRhc2s0X3JhbjsKLSAgYm9vbCB0YXNrNV9yYW4gPSBmYWxzZTsKLSAgYm9vbCogdGFzazVfcmFuX3B0ciA9ICZ0YXNrNV9yYW47Ci0gIEFzeW5jVGFza0lkIHRhc2sxX2lkID0KLSAgICAgIGFzeW5jX21hbmFnZXJfLkV4ZWNBc3luYyh1c2VyMSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFzazFfcmFuX3B0cl0oKSB7ICp0YXNrMV9yYW5fcHRyID0gdHJ1ZTsgfSk7Ci0gIEFzeW5jVGFza0lkIHRhc2syX2lkID0KLSAgICAgIGFzeW5jX21hbmFnZXJfLkV4ZWNBc3luYyh1c2VyMSwgc3RkOjpjaHJvbm86OnNlY29uZHMoMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2syX3Jhbl9wdHJdKCkgeyAqdGFzazJfcmFuX3B0ciA9IHRydWU7IH0pOwotICBBc3luY1Rhc2tJZCB0YXNrM19pZCA9Ci0gICAgICBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcjEsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2szX3Jhbl9wdHJdKCkgeyAqdGFzazNfcmFuX3B0ciA9IHRydWU7IH0pOwotICBBc3luY1Rhc2tJZCB0YXNrNF9pZCA9Ci0gICAgICBhc3luY19tYW5hZ2VyXy5FeGVjQXN5bmModXNlcjEsIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YXNrNF9yYW5fcHRyXSgpIHsgKnRhc2s0X3Jhbl9wdHIgPSB0cnVlOyB9KTsKLSAgQXN5bmNUYXNrSWQgdGFzazVfaWQgPQotICAgICAgYXN5bmNfbWFuYWdlcl8uRXhlY0FzeW5jKHVzZXIyLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YXNrNV9yYW5fcHRyXSgpIHsgKnRhc2s1X3Jhbl9wdHIgPSB0cnVlOyB9KTsKLSAgQVNTRVJUX0ZBTFNFKHRhc2sxX3Jhbik7Ci0gIHdoaWxlICghdGFzazFfcmFuIHx8ICF0YXNrM19yYW4gfHwgIXRhc2s1X3JhbikKLSAgICA7Ci0gIEFTU0VSVF9UUlVFKHRhc2sxX3Jhbik7Ci0gIEFTU0VSVF9GQUxTRSh0YXNrMl9yYW4pOwotICBBU1NFUlRfVFJVRSh0YXNrM19yYW4pOwotICBBU1NFUlRfRkFMU0UodGFzazRfcmFuKTsKLSAgQVNTRVJUX1RSVUUodGFzazVfcmFuKTsKLSAgYXN5bmNfbWFuYWdlcl8uQ2FuY2VsQXN5bmNUYXNrc0Zyb21Vc2VyKHVzZXIxKTsKLSAgQVNTRVJUX0ZBTFNFKGFzeW5jX21hbmFnZXJfLkNhbmNlbEFzeW5jVGFzayh0YXNrMV9pZCkpOwotICBBU1NFUlRfRkFMU0UoYXN5bmNfbWFuYWdlcl8uQ2FuY2VsQXN5bmNUYXNrKHRhc2syX2lkKSk7Ci0gIEFTU0VSVF9GQUxTRShhc3luY19tYW5hZ2VyXy5DYW5jZWxBc3luY1Rhc2sodGFzazNfaWQpKTsKLSAgQVNTRVJUX0ZBTFNFKGFzeW5jX21hbmFnZXJfLkNhbmNlbEFzeW5jVGFzayh0YXNrNF9pZCkpOwotICBBU1NFUlRfRkFMU0UoYXN5bmNfbWFuYWdlcl8uQ2FuY2VsQXN5bmNUYXNrKHRhc2s1X2lkKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2g0X3BhcnNlcl91bml0dGVzdC5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2g0X3BhcnNlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2MTY5Ni4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9oNF9wYXJzZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvaDRfcGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAib3NpL2luY2x1ZGUvb3NpLmgiICAvLyBmb3IgT1NJX05PX0lOVFIKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci11c2luZyBQYWNrZXREYXRhID0gc3RkOjp2ZWN0b3I8dWludDhfdD47Ci0KLWNsYXNzIEg0UGFyc2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgcGFja2V0Xy5jbGVhcigpOwotICAgIHBhcnNlcl8uUmVzZXQoKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IHBhcnNlcl8uUmVzZXQoKTsgfQotCi0gIHZvaWQgUGFja2V0UmVhZENhbGxiYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYWNrZXQpIHsKLSAgICBwYWNrZXRfID0gc3RkOjptb3ZlKHBhY2tldCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgSDRQYXJzZXIgcGFyc2VyX3sKLSAgICAgIFsmXShhdXRvIHApIHsKLSAgICAgICAgdHlwZV8gPSBQYWNrZXRUeXBlOjpDT01NQU5EOwotICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2socCk7Ci0gICAgICB9LAotICAgICAgWyZdKGF1dG8gcCkgewotICAgICAgICB0eXBlXyA9IFBhY2tldFR5cGU6OkVWRU5UOwotICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2socCk7Ci0gICAgICB9LAotICAgICAgWyZdKGF1dG8gcCkgewotICAgICAgICB0eXBlXyA9IFBhY2tldFR5cGU6OkFDTDsKLSAgICAgICAgUGFja2V0UmVhZENhbGxiYWNrKHApOwotICAgICAgfSwKLSAgICAgIFsmXShhdXRvIHApIHsKLSAgICAgICAgdHlwZV8gPSBQYWNrZXRUeXBlOjpTQ087Ci0gICAgICAgIFBhY2tldFJlYWRDYWxsYmFjayhwKTsKLSAgICAgIH0sCi0gICAgICBbJl0oYXV0byBwKSB7Ci0gICAgICAgIHR5cGVfID0gUGFja2V0VHlwZTo6SVNPOwotICAgICAgICBQYWNrZXRSZWFkQ2FsbGJhY2socCk7Ci0gICAgICB9LAotICB9OwotICBQYWNrZXREYXRhIHBhY2tldF87Ci0gIFBhY2tldFR5cGUgdHlwZV87Ci19OwotCi1URVNUX0YoSDRQYXJzZXJUZXN0LCBJbml0aWFsbHlFeHBlY3RPbmVCeXRlKSB7Ci0gIEFTU0VSVF9FUSgxLCAoaW50KXBhcnNlcl8uQnl0ZXNSZXF1ZXN0ZWQoKSk7Ci19Ci0KLVRFU1RfRihINFBhcnNlclRlc3QsIFN3aXRjaFN0YXRlQWZ0ZXJUeXBlKSB7Ci0gIHVpbnQ4X3QgdHlwID0gKHVpbnQ4X3QpUGFja2V0VHlwZTo6QUNMOwotICBBU1NFUlRfVFJVRShwYXJzZXJfLkNvbnN1bWUoJnR5cCwgMSkpOwotICBBU1NFUlRfRVEocGFyc2VyXy5DdXJyZW50U3RhdGUoKSwgSDRQYXJzZXI6OlN0YXRlOjpIQ0lfUFJFQU1CTEUpOwotfQotCi1URVNUX0YoSDRQYXJzZXJUZXN0LCBSZXF1ZXN0ZWRCeXRlc0RlY3JlYXNlcykgewotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIGJ5dGVzIGlzIG1vbm90b25pY2FsbHkgZGVjcmVhc2luZwotICAvLyBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlcy4KLSAgdWludDhfdCB0eXAgPSAodWludDhfdClQYWNrZXRUeXBlOjpBQ0w7Ci0gIEFTU0VSVF9UUlVFKHBhcnNlcl8uQ29uc3VtZSgmdHlwLCAxKSk7Ci0gIGF1dG8gd2FudGVkID0gcGFyc2VyXy5CeXRlc1JlcXVlc3RlZCgpOwotICB3aGlsZSAod2FudGVkID4gMCkgewotICAgIEFTU0VSVF9FUSh3YW50ZWQsIHBhcnNlcl8uQnl0ZXNSZXF1ZXN0ZWQoKSk7Ci0gICAgQVNTRVJUX1RSVUUocGFyc2VyXy5Db25zdW1lKCZ0eXAsIDEpKTsKLSAgICB3YW50ZWQtLTsKLSAgfQotCi0gIEFTU0VSVF9FUShwYXJzZXJfLkN1cnJlbnRTdGF0ZSgpLCBINFBhcnNlcjo6U3RhdGU6OkhDSV9QQVlMT0FEKTsKLSAgd2FudGVkID0gcGFyc2VyXy5CeXRlc1JlcXVlc3RlZCgpOwotICB3aGlsZSAod2FudGVkID4gMCkgewotICAgIEFTU0VSVF9FUSh3YW50ZWQsIHBhcnNlcl8uQnl0ZXNSZXF1ZXN0ZWQoKSk7Ci0gICAgQVNTRVJUX1RSVUUocGFyc2VyXy5Db25zdW1lKCZ0eXAsIDEpKTsKLSAgICB3YW50ZWQtLTsKLSAgfQotCi0gIC8vIEEgY2FsbGJhY2sgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkLgotICBBU1NFUlRfTFQoMCwgKGludClwYWNrZXRfLnNpemUoKSk7Ci19Ci0KLVRFU1RfRihINFBhcnNlclRlc3QsIFJlamVjdE5vRGF0YSkgewotICAvLyBZb3UgbmVlZCB0byBnaXZlIHVzIHNvbWV0aGluZyEKLSAgUGFja2V0RGF0YSBiYWRfYml0OwotICBBU1NFUlRfRkFMU0UocGFyc2VyXy5Db25zdW1lKGJhZF9iaXQuZGF0YSgpLCBiYWRfYml0LnNpemUoKSkpOwotfQotCi1URVNUX0YoSDRQYXJzZXJUZXN0LCBUb29NdWNoSXNEZWF0aCkgewotICBQYWNrZXREYXRhIGJhZF9iaXQoezB4ZmR9KTsKLSAgQVNTRVJUX0RFQVRIKHBhcnNlcl8uQ29uc3VtZShiYWRfYml0LmRhdGEoKSwgcGFyc2VyXy5CeXRlc1JlcXVlc3RlZCgpICsgMSksCi0gICAgICAgICAgICAgICAiTW9yZSBieXRlcyByZWFkIC4qIHRoYW4gZXhwZWN0ZWQgLiohIik7Ci19Ci0KLVRFU1RfRihINFBhcnNlclRlc3QsIFdyb25nVHlwZUlzRGVhdGgpIHsKLSAgUGFja2V0RGF0YSBiYWRfYml0KHsweGZkfSk7Ci0gIEFTU0VSVF9ERUFUSChwYXJzZXJfLkNvbnN1bWUoYmFkX2JpdC5kYXRhKCksIGJhZF9iaXQuc2l6ZSgpKSwKLSAgICAgICAgICAgICAgICJVbmltcGxlbWVudGVkIHBhY2tldCB0eXBlLioiKTsKLX0KLQotVEVTVF9GKEg0UGFyc2VyVGVzdCwgQ2FsbHNUaGVSaWdodENhbGxiYWNrcykgewotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcHJvcGVyIHR5cGUgb2YgY2FsbGJhY2sgaXMgaW52b2tlZC4KLSAgc3RkOjp2ZWN0b3I8UGFja2V0VHlwZT4gdHlwZXMoe1BhY2tldFR5cGU6OkFDTCwgUGFja2V0VHlwZTo6U0NPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0VHlwZTo6Q09NTUFORCwgUGFja2V0VHlwZTo6RVZFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRUeXBlOjpJU099KTsKLSAgZm9yIChhdXRvIHBhY2tldFR5cGUgOiB0eXBlcykgewotICAgIC8vIENvbmZpZ3VyZSB0aGUgaW5jb21pbmcgcGFja2V0LgotICAgIHVpbnQ4X3QgdHlwID0gKHVpbnQ4X3QpcGFja2V0VHlwZTsKLSAgICBBU1NFUlRfVFJVRShwYXJzZXJfLkNvbnN1bWUoJnR5cCwgMSkpOwotCi0gICAgLy8gRmVlZCBkYXRhIGFzIGxvbmcgYXMgdGhpcyBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLgotICAgIHdoaWxlIChwYXJzZXJfLkN1cnJlbnRTdGF0ZSgpICE9IEg0UGFyc2VyOjpTdGF0ZTo6SENJX1RZUEUpIHsKLSAgICAgIFBhY2tldERhdGEgZGF0YTsKLSAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwYXJzZXJfLkJ5dGVzUmVxdWVzdGVkKCk7IGkrKykgewotICAgICAgICBkYXRhLnB1c2hfYmFjaygodWludDhfdClpKTsKLSAgICAgIH0KLSAgICAgIEFTU0VSVF9UUlVFKHBhcnNlcl8uQ29uc3VtZShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgcHJvcGVyIGNhbGxiYWNrcyBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQuCi0gICAgQVNTRVJUX0xUKDAsIChpbnQpcGFja2V0Xy5zaXplKCkpOwotICAgIEFTU0VSVF9FUShwYWNrZXRUeXBlLCB0eXBlXyk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYgpkaWZmIC0tZ2l0IGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvaXRlcmF0b3JfdGVzdC5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2l0ZXJhdG9yX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2I2N2MuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvaXRlcmF0b3JfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaGNpX3BhY2tldC5oIgotI2luY2x1ZGUgImwyY2FwX3Rlc3RfcGFja2V0cy5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLXVzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIFRlc3RQYWNrZXQgOiBwdWJsaWMgSGNpUGFja2V0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGVzdFBhY2tldD4gbWFrZV9uZXdfcGFja2V0KHZlY3Rvcjx1aW50OF90PiB2KSB7Ci0gICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUZXN0UGFja2V0PihuZXcgVGVzdFBhY2tldCh2KSk7Ci0gIH0KLSAgc2l6ZV90IGdldF9sZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHRlc3RfdmVjdG9yXy5zaXplKCk7Ci0gIH0KLSAgdWludDhfdCYgZ2V0X2F0X2luZGV4KHNpemVfdCBpbmRleCkgewotICAgIHJldHVybiB0ZXN0X3ZlY3Rvcl9baW5kZXhdOwotICB9Ci0KLSBwcml2YXRlOgotICBUZXN0UGFja2V0KHZlY3Rvcjx1aW50OF90PiB2KSB7Ci0gICAgdGVzdF92ZWN0b3JfID0gdjsKLSAgfQotICB2ZWN0b3I8dWludDhfdD4gdGVzdF92ZWN0b3JfOwotfTsKLQotY2xhc3MgSXRlcmF0b3JUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBJdGVyYXRvclRlc3QoKSA9IGRlZmF1bHQ7Ci0gIH5JdGVyYXRvclRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBwYWNrZXQgPSBUZXN0UGFja2V0OjptYWtlX25ld19wYWNrZXQoY29tcGxldGVfbDJjYXBfcGFja2V0KTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgcGFja2V0LnJlc2V0KCk7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFBhY2tldD4gcGFja2V0OwotfTsKLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgZXh0cmFjdFRlc3QpIHsKLSAgSXRlcmF0b3IgZ2VuZXJhbF9jYXNlID0gcGFja2V0LT5nZXRfYmVnaW4oKTsKLQotICBBU1NFUlRfRVEoMHg5NSwgZ2VuZXJhbF9jYXNlLmV4dHJhY3Q8dWludDhfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDQ3MWYsIGdlbmVyYWxfY2FzZS5leHRyYWN0PHVpbnQxNl90PigpKTsKLSAgQVNTRVJUX0VRKDB4OTUxZjAyMDB1LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50MzJfdD4oKSk7Ci0gIEFTU0VSVF9FUSgweDMzMDAwMTAxMDAwMDAwY2J1LCBnZW5lcmFsX2Nhc2UuZXh0cmFjdDx1aW50NjRfdD4oKSk7Ci19Ci0KLVRFU1RfRihJdGVyYXRvclRlc3QsIGV4dHJhY3RCb3VuZHNEZWF0aFRlc3QpIHsKLSAgSXRlcmF0b3IgYm91bmRzX3Rlc3QgPSBwYWNrZXQtPmdldF9lbmQoKTsKLQotICBBU1NFUlRfREVBVEgoYm91bmRzX3Rlc3QuZXh0cmFjdDx1aW50OF90PigpLCAiIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0PHVpbnQxNl90PigpLCAiIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0PHVpbnQzMl90PigpLCAiIik7Ci0gIEFTU0VSVF9ERUFUSChib3VuZHNfdGVzdC5leHRyYWN0PHVpbnQ2NF90PigpLCAiIik7Ci19Ci0KLVRFU1RfRihJdGVyYXRvclRlc3QsIGRlcmVmZXJlbmNlRGVhdGhUZXN0KSB7Ci0gIEl0ZXJhdG9yIGRlcmVmZXJlbmNlX3Rlc3QgPSBwYWNrZXQtPmdldF9lbmQoKTsKLQotICBBU1NFUlRfRVEoMHg0NSwgKihkZXJlZmVyZW5jZV90ZXN0IC0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxKSkpOwotICBBU1NFUlRfREVBVEgoKmRlcmVmZXJlbmNlX3Rlc3QsICIiKTsKLX0KLVRFU1RfRihJdGVyYXRvclRlc3QsIHBsdXNFcVRlc3QpIHsKLSAgSXRlcmF0b3IgcGx1c19lcSA9IHBhY2tldC0+Z2V0X2JlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcGxldGVfbDJjYXBfcGFja2V0LnNpemUoKTsgaSArPSAyKSB7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFtpXSwgKnBsdXNfZXEpCi0gICAgICAgIDw8ICIrPSB0ZXN0OiBEZXJlZmVyZW5jZWQgaXRlcmF0b3IgZG9lcyBub3QgZXF1YWwgZXhwZWN0ZWQgYXQgaW5kZXggIiA8PCBpOwotICAgIHBsdXNfZXEgKz0gMjsKLSAgfQotfQotCi1URVNUX0YoSXRlcmF0b3JUZXN0LCBwcmVJbmNyZW1lbnRUZXN0KSB7Ci0gIEl0ZXJhdG9yIHBsdXNfcGx1cyA9IHBhY2tldC0+Z2V0X2JlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcGxldGVfbDJjYXBfcGFja2V0LnNpemUoKSAtIDE7IGkrKykgewotICAgIEFTU0VSVF9FUShjb21wbGV0ZV9sMmNhcF9wYWNrZXRbaSArIDFdLCAqKCsrcGx1c19wbHVzKSkKLSAgICAgICAgPDwgIlByZS1pbmNyZW1lbnQgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICIKLSAgICAgICAgPDwgImF0IGluZGV4ICIgPDwgaTsKLSAgfQotfQotCi1URVNUX0YoSXRlcmF0b3JUZXN0LCBwb3N0SW5jcmVtZW50VGVzdCkgewotICBJdGVyYXRvciBwbHVzX3BsdXMgPSBwYWNrZXQtPmdldF9iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBsZXRlX2wyY2FwX3BhY2tldC5zaXplKCk7IGkrKykgewotICAgIEFTU0VSVF9FUShjb21wbGV0ZV9sMmNhcF9wYWNrZXRbaV0sICoocGx1c19wbHVzKyspKQotICAgICAgICA8PCAiUG9zdC1pbmNyZW1lbnQgdGVzdDogRGVyZWZlcmVuY2VkIGl0ZXJhdG9yIGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkICIKLSAgICAgICAgPDwgImF0IGluZGV4ICIgPDwgaTsKLSAgfQotfQotCi1URVNUX0YoSXRlcmF0b3JUZXN0LCBhZGRpdGlvblRlc3QpIHsKLSAgSXRlcmF0b3IgcGx1cyA9IHBhY2tldC0+Z2V0X2JlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcGxldGVfbDJjYXBfcGFja2V0LnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFtpXSwgKnBsdXMpCi0gICAgICAgIDw8ICIrIHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCBhdCBpbmRleCAiIDw8IGk7Ci0gICAgcGx1cyA9IHBsdXMgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpOwotICB9Ci19Ci0KLVRFU1RfRihJdGVyYXRvclRlc3QsIG1pbnVzRXFUZXN0KSB7Ci0gIEl0ZXJhdG9yIG1pbnVzX2VxID0gcGFja2V0LT5nZXRfZW5kKCk7Ci0gIG1pbnVzX2VxIC09IDE7Ci0gIGZvciAoc2l6ZV90IGkgPSBjb21wbGV0ZV9sMmNhcF9wYWNrZXQuc2l6ZSgpIC0gMTsgaSA+IDA7IGkgLT0gMikgewotICAgIEFTU0VSVF9FUShjb21wbGV0ZV9sMmNhcF9wYWNrZXRbaV0sICptaW51c19lcSkKLSAgICAgICAgPDwgIi09IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCBhdCBpbmRleCAiIDw8IGk7Ci0gICAgbWludXNfZXEgLT0gMjsKLSAgfQotfQotCi1URVNUX0YoSXRlcmF0b3JUZXN0LCBwcmVEZWNyZW1lbnRUZXN0KSB7Ci0gIEl0ZXJhdG9yIG1pbnVzX21pbnVzID0gcGFja2V0LT5nZXRfZW5kKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSBjb21wbGV0ZV9sMmNhcF9wYWNrZXQuc2l6ZSgpOyBpID4gMDsgaS0tKSB7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFtpIC0gMV0sICooLS1taW51c19taW51cykpCi0gICAgICAgIDw8ICJQcmUtZGVjcmVtZW50IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCAiCi0gICAgICAgIDw8ICJhdCBpbmRleCAiIDw8IGk7Ci0gIH0KLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgcG9zdERlY3JlbWVudFRlc3QpIHsKLSAgSXRlcmF0b3IgbWludXNfbWludXMgPSBwYWNrZXQtPmdldF9lbmQoKTsKLSAgbWludXNfbWludXMtLTsKLSAgZm9yIChzaXplX3QgaSA9IGNvbXBsZXRlX2wyY2FwX3BhY2tldC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFtpXSwgKihtaW51c19taW51cy0tKSkKLSAgICAgICAgPDwgIlBvc3QtZGVjcmVtZW50IHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCAiCi0gICAgICAgIDw8ICJhdCBpbmRleCAiIDw8IGk7Ci0gIH0KLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgc3VidHJhY3Rpb25UZXN0KSB7Ci0gIEl0ZXJhdG9yIG1pbnVzID0gcGFja2V0LT5nZXRfZW5kKCk7Ci0gIG1pbnVzID0gbWludXMgLSBzdGF0aWNfY2FzdDxzaXplX3Q+KDEpOwotICBmb3IgKHNpemVfdCBpID0gY29tcGxldGVfbDJjYXBfcGFja2V0LnNpemUoKSAtIDE7IGkgPiAwOyBpLS0pIHsKLSAgICBBU1NFUlRfRVEoY29tcGxldGVfbDJjYXBfcGFja2V0W2ldLCAqbWludXMpCi0gICAgICAgIDw8ICItIHRlc3Q6IERlcmVmZXJlbmNlZCBpdGVyYXRvciBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCBhdCBpbmRleCAiIDw8IGk7Ci0gICAgbWludXMgPSBtaW51cyAtIHN0YXRpY19jYXN0PHNpemVfdD4oMSk7Ci0gIH0KLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgcGx1c0VxQm91bmRzVGVzdCkgewotICBJdGVyYXRvciBwbHVzX2VxID0gcGFja2V0LT5nZXRfZW5kKCk7Ci0gIHBsdXNfZXEtLTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIHBsdXNfZXEgKz0gaTsKLSAgICBBU1NFUlRfRVEocGFja2V0LT5nZXRfZW5kKCksIHBsdXNfZXEpIDw8ICIrPSB0ZXN0OiBJdGVyYXRvciBleGNlZWRlZCB0aGUgdXBwZXIgYm91bmQgc2V0IGJ5IGdldF9sZW5ndGgoKSI7Ci0gIH0KLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgcHJlSW5jcmVtZW50Qm91bmRzVGVzdCkgewotICBJdGVyYXRvciBwbHVzX3BsdXMgPSBwYWNrZXQtPmdldF9lbmQoKTsKLSAgcGx1c19wbHVzLS07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocGFja2V0LT5nZXRfZW5kKCksICsrcGx1c19wbHVzKSA8PCAiUHJlLWluY3JlbWVudCB0ZXN0OiBJdGVyYXRvciBleGNlZWRlZCB0aGUgdXBwZXIgYm91bmQgc2V0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgZ2V0X2xlbmd0aCgpIjsKLSAgfQotfQotCi1URVNUX0YoSXRlcmF0b3JUZXN0LCBwb3N0SW5jcmVtZW50Qm91bmRzVGVzdCkgewotICBJdGVyYXRvciBwbHVzX3BsdXMgPSBwYWNrZXQtPmdldF9lbmQoKTsKLSAgcGx1c19wbHVzLS07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBBU1NFUlRfRVEocGFja2V0LT5nZXRfZW5kKCksIHBsdXNfcGx1cysrKSA8PCAiUG9zdC1pbmNyZW1lbnQgdGVzdDogSXRlcmF0b3IgZXhjZWVkZWQgdGhlIHVwcGVyIGJvdW5kIHNldCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IGdldF9sZW5ndGgoKSI7Ci0gIH0KLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgYWRkaXRpb25Cb3VuZHNUZXN0KSB7Ci0gIEl0ZXJhdG9yIHBsdXMgPSBwYWNrZXQtPmdldF9lbmQoKTsKLSAgcGx1cy0tOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgcGx1cyA9IHBsdXMgKyBzdGF0aWNfY2FzdDxzaXplX3Q+KGkpOwotICAgIEFTU0VSVF9FUShwYWNrZXQtPmdldF9lbmQoKSwgcGx1cykgPDwgIisgdGVzdDogSXRlcmF0b3IgZXhjZWVkZWQgdGhlIHVwcGVyIGJvdW5kIHNldCBieSBnZXRfbGVuZ3RoKCkiOwotICB9Ci19Ci0KLVRFU1RfRihJdGVyYXRvclRlc3QsIG1pbnVzRXFCb3VuZHNUZXN0KSB7Ci0gIEl0ZXJhdG9yIG1pbnVzX2VxID0gcGFja2V0LT5nZXRfYmVnaW4oKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIG1pbnVzX2VxIC09IGk7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFswXSwgKm1pbnVzX2VxKSA8PCAiLT0gdGVzdDogSXRlcmF0b3IgaXMgbGVzcyB0aGFuIHRoZSBsb3dlciBib3VuZCBzZXQgYnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2tldC0+Z2V0X2JlZ2luKCkiOwotICB9Ci19Ci0KLVRFU1RfRihJdGVyYXRvclRlc3QsIHByZURlY3JlbWVudEJvdW5kc1Rlc3QpIHsKLSAgSXRlcmF0b3IgbWludXNfbWludXMgPSBwYWNrZXQtPmdldF9iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFswXSwgKigtLW1pbnVzX21pbnVzKSkKLSAgICAgICAgPDwgIlByZS1kZWNyZW1lbnQgdGVzdDogSXRlcmF0b3IgaXMgbGVzcyB0aGFuIHRoZSBsb3dlciBib3VuZCBzZXQgYnkgIgotICAgICAgICAgICAicGFja2V0LT5nZXRfYmVnaW4oKSI7Ci0gIH0KLX0KLQotVEVTVF9GKEl0ZXJhdG9yVGVzdCwgcG9zdERlY3JlbWVudEJvdW5kc1Rlc3QpIHsKLSAgSXRlcmF0b3IgbWludXNfbWludXMgPSBwYWNrZXQtPmdldF9iZWdpbigpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgQVNTRVJUX0VRKGNvbXBsZXRlX2wyY2FwX3BhY2tldFswXSwgKihtaW51c19taW51cy0tKSkKLSAgICAgICAgPDwgIlBvc3QtZGVjcmVtZW50IHRlc3Q6IEl0ZXJhdG9yIGlzIGxlc3MgdGhhbiB0aGUgbG93ZXIgYm91bmQgc2V0IGJ5ICIKLSAgICAgICAgICAgInBhY2tldC0+Z2V0X2JlZ2luKCkiOwotICB9Ci19Ci0KLVRFU1RfRihJdGVyYXRvclRlc3QsIHN1YnRyYWN0aW9uQm91bmRzVGVzdCkgewotICBJdGVyYXRvciBtaW51cyA9IHBhY2tldC0+Z2V0X2JlZ2luKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICBtaW51cyA9IG1pbnVzIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihpKTsKLSAgICBBU1NFUlRfRVEoY29tcGxldGVfbDJjYXBfcGFja2V0WzBdLCAqbWludXMpIDw8ICItIHRlc3Q6IEl0ZXJhdG9yIGlzIGxlc3MgdGhhbiB0aGUgbG93ZXIgYm91bmQgc2V0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieSBwYWNrZXQtPmdldF9iZWdpbigpIjsKLSAgfQotfQotfTsgIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2wyY2FwX3NkdV90ZXN0LmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvbDJjYXBfc2R1X3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTBlYzYuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvbDJjYXBfc2R1X3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImwyY2FwX3NkdS5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJsMmNhcF90ZXN0X3BhY2tldHMuaCIKLQotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLW5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIgewotCi1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF8xID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMSk7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF8yID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMik7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF8zID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMyk7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF80ID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNCk7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF81ID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNSk7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF82ID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNik7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF83ID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNyk7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF84ID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOCk7Ci1zdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+IHBhY2tldF85ID0gTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOSk7Ci0KLWNsYXNzIEwyY2FwU2R1VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgTDJjYXBTZHVUZXN0KCl7fTsKLQotICB+TDJjYXBTZHVUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi19OyAgLy8gTDJjYXBTZHVUZXN0Ci0KLVRFU1RfRihMMmNhcFNkdVRlc3QsIGdldEZjc1Rlc3QpIHsKLSAgRVhQRUNUX0VRKDB4NzJhYSwgcGFja2V0XzEtPmdldF9mY3MoKSk7Ci0gIEVYUEVDVF9FUSgweDViNTcsIHBhY2tldF8yLT5nZXRfZmNzKCkpOwotICBFWFBFQ1RfRVEoMHhlNjQ0LCBwYWNrZXRfMy0+Z2V0X2ZjcygpKTsKLSAgRVhQRUNUX0VRKDB4MjFiMCwgcGFja2V0XzQtPmdldF9mY3MoKSk7Ci0gIEVYUEVDVF9FUSgweGFlOTYsIHBhY2tldF81LT5nZXRfZmNzKCkpOwotICBFWFBFQ1RfRVEoMHg5MjU0LCBwYWNrZXRfNi0+Z2V0X2ZjcygpKTsKLSAgRVhQRUNUX0VRKDB4ZjZmYSwgcGFja2V0XzctPmdldF9mY3MoKSk7Ci0gIEVYUEVDVF9FUSgweDFkYTQsIHBhY2tldF84LT5nZXRfZmNzKCkpOwotICBFWFBFQ1RfRVEoMHg3ODFhLCBwYWNrZXRfOS0+Z2V0X2ZjcygpKTsKLX0KLQotVEVTVF9GKEwyY2FwU2R1VGVzdCwgZ2V0UGF5bG9hZExlbmd0aFRlc3QpIHsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzEuc2l6ZSgpIC0gNCwgcGFja2V0XzEtPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzIuc2l6ZSgpIC0gNCwgcGFja2V0XzItPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzMuc2l6ZSgpIC0gNCwgcGFja2V0XzMtPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzQuc2l6ZSgpIC0gNCwgcGFja2V0XzQtPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzUuc2l6ZSgpIC0gNCwgcGFja2V0XzUtPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzYuc2l6ZSgpIC0gNCwgcGFja2V0XzYtPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0Xzcuc2l6ZSgpIC0gNCwgcGFja2V0XzctPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0Xzguc2l6ZSgpIC0gNCwgcGFja2V0XzgtPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0Xzkuc2l6ZSgpIC0gNCwgcGFja2V0XzktPmdldF9wYXlsb2FkX2xlbmd0aCgpKTsKLX0KLQotVEVTVF9GKEwyY2FwU2R1VGVzdCwgY2FsY3VsYXRlRmNzVGVzdCkgewotICBFWFBFQ1RfRVEoMHg3MmFhLCBwYWNrZXRfMS0+Y2FsY3VsYXRlX2ZjcygpKTsKLSAgRVhQRUNUX0VRKDB4NWI1NywgcGFja2V0XzItPmNhbGN1bGF0ZV9mY3MoKSk7Ci0gIEVYUEVDVF9FUSgweGU2NDQsIHBhY2tldF8zLT5jYWxjdWxhdGVfZmNzKCkpOwotICBFWFBFQ1RfRVEoMHgyMWIwLCBwYWNrZXRfNC0+Y2FsY3VsYXRlX2ZjcygpKTsKLSAgRVhQRUNUX0VRKDB4YWU5NiwgcGFja2V0XzUtPmNhbGN1bGF0ZV9mY3MoKSk7Ci0gIEVYUEVDVF9FUSgweDkyNTQsIHBhY2tldF82LT5jYWxjdWxhdGVfZmNzKCkpOwotICBFWFBFQ1RfRVEoMHhmNmZhLCBwYWNrZXRfNy0+Y2FsY3VsYXRlX2ZjcygpKTsKLSAgRVhQRUNUX0VRKDB4MWRhNCwgcGFja2V0XzgtPmNhbGN1bGF0ZV9mY3MoKSk7Ci0gIEVYUEVDVF9FUSgweDc4MWEsIHBhY2tldF85LT5jYWxjdWxhdGVfZmNzKCkpOwotfQotCi1URVNUX0YoTDJjYXBTZHVUZXN0LCBnZXRDb250cm9sc1Rlc3QpIHsKLSAgRVhQRUNUX0VRKDB4NDEwMiwgcGFja2V0XzEtPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzEwNCwgcGFja2V0XzItPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzEwNiwgcGFja2V0XzMtPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzEwOCwgcGFja2V0XzQtPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzEwYSwgcGFja2V0XzUtPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzEwYywgcGFja2V0XzYtPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzEwZSwgcGFja2V0XzctPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4YzExMCwgcGFja2V0XzgtPmdldF9jb250cm9scygpKTsKLSAgRVhQRUNUX0VRKDB4ODExMiwgcGFja2V0XzktPmdldF9jb250cm9scygpKTsKLX0KLQotVEVTVF9GKEwyY2FwU2R1VGVzdCwgZ2V0VG90YWxMZW5ndGhUZXN0KSB7Ci0gIEVYUEVDVF9FUSgweDFmOTUsIHBhY2tldF8xLT5nZXRfdG90YWxfbDJjYXBfbGVuZ3RoKCkpOwotfQotCi1URVNUX0YoTDJjYXBTZHVUZXN0LCBnZXRWZWN0b3JTaXplVGVzdCkgewotICBFWFBFQ1RfRVEobDJjYXBfdGVzdF9wYWNrZXRfMS5zaXplKCksIHBhY2tldF8xLT5nZXRfdmVjdG9yX3NpemUoKSk7Ci0gIEVYUEVDVF9FUShsMmNhcF90ZXN0X3BhY2tldF8yLnNpemUoKSwgcGFja2V0XzItPmdldF92ZWN0b3Jfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzMuc2l6ZSgpLCBwYWNrZXRfMy0+Z2V0X3ZlY3Rvcl9zaXplKCkpOwotICBFWFBFQ1RfRVEobDJjYXBfdGVzdF9wYWNrZXRfNC5zaXplKCksIHBhY2tldF80LT5nZXRfdmVjdG9yX3NpemUoKSk7Ci0gIEVYUEVDVF9FUShsMmNhcF90ZXN0X3BhY2tldF81LnNpemUoKSwgcGFja2V0XzUtPmdldF92ZWN0b3Jfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0XzYuc2l6ZSgpLCBwYWNrZXRfNi0+Z2V0X3ZlY3Rvcl9zaXplKCkpOwotICBFWFBFQ1RfRVEobDJjYXBfdGVzdF9wYWNrZXRfNy5zaXplKCksIHBhY2tldF83LT5nZXRfdmVjdG9yX3NpemUoKSk7Ci0gIEVYUEVDVF9FUShsMmNhcF90ZXN0X3BhY2tldF84LnNpemUoKSwgcGFja2V0XzgtPmdldF92ZWN0b3Jfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGwyY2FwX3Rlc3RfcGFja2V0Xzkuc2l6ZSgpLCBwYWNrZXRfOS0+Z2V0X3ZlY3Rvcl9zaXplKCkpOwotfQotCi1URVNUX0YoTDJjYXBTZHVUZXN0LCBnZXRDaWRUZXN0KSB7Ci0gIEVYUEVDVF9FUSgweDAwNDcsIHBhY2tldF8xLT5nZXRfY2hhbm5lbF9pZCgpKTsKLSAgRVhQRUNUX0VRKDB4MDA0NywgcGFja2V0XzItPmdldF9jaGFubmVsX2lkKCkpOwotICBFWFBFQ1RfRVEoMHgwMDQ3LCBwYWNrZXRfMy0+Z2V0X2NoYW5uZWxfaWQoKSk7Ci0gIEVYUEVDVF9FUSgweDAwNDcsIHBhY2tldF80LT5nZXRfY2hhbm5lbF9pZCgpKTsKLSAgRVhQRUNUX0VRKDB4MDA0NywgcGFja2V0XzUtPmdldF9jaGFubmVsX2lkKCkpOwotICBFWFBFQ1RfRVEoMHgwMDQ3LCBwYWNrZXRfNi0+Z2V0X2NoYW5uZWxfaWQoKSk7Ci0gIEVYUEVDVF9FUSgweDAwNDcsIHBhY2tldF83LT5nZXRfY2hhbm5lbF9pZCgpKTsKLSAgRVhQRUNUX0VRKDB4MDA0NywgcGFja2V0XzgtPmdldF9jaGFubmVsX2lkKCkpOwotICBFWFBFQ1RfRVEoMHgwMDQ3LCBwYWNrZXRfOS0+Z2V0X2NoYW5uZWxfaWQoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2wyY2FwX3Rlc3QuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9sMmNhcF90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE4Mjg3Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2wyY2FwX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaGNpX3BhY2tldC5oIgotI2luY2x1ZGUgImwyY2FwX3BhY2tldC5oIgotI2luY2x1ZGUgImwyY2FwX3Rlc3RfcGFja2V0cy5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLXVzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgVGVzdFBhY2tldCA6IHB1YmxpYyBIY2lQYWNrZXQgewotIHB1YmxpYzoKLSAgVGVzdFBhY2tldChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFja2V0KSB7Ci0gICAgY29tcGxldGVfcGFja2V0XyA9IHBhY2tldDsKLSAgfQotICBUZXN0UGFja2V0KCkgPSBkZWZhdWx0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29tcGxldGVfcGFja2V0XzsKLSAgc2l6ZV90IGdldF9sZW5ndGgoKSB7Ci0gICAgcmV0dXJuIGNvbXBsZXRlX3BhY2tldF8uc2l6ZSgpOwotICB9Ci0gIHVpbnQ4X3QmIGdldF9hdF9pbmRleChzaXplX3QgaW5kZXgpIHsKLSAgICByZXR1cm4gY29tcGxldGVfcGFja2V0X1tpbmRleF07Ci0gIH0KLX07Ci0KLWNsYXNzIEwyY2FwVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiB1cGRhdGVfZmNzKHZlY3Rvcjx1aW50OF90PiBzZHUpIHsKLSAgICBzZHUucmVzaXplKHNkdS5zaXplKCkgLSAyKTsKLQotICAgIHJldHVybiBMMmNhcFNkdTo6TDJjYXBTZHVCdWlsZGVyKHNkdSk7Ci0gIH0KLQotICB2b2lkIGNvbXBhcmVfcGFja2V0cyhzaGFyZWRfcHRyPEhjaVBhY2tldD4gZXhwZWN0ZWQsIHNoYXJlZF9wdHI8SGNpUGFja2V0PiByZWNlaXZlZCkgewotICAgIEl0ZXJhdG9yIGV4cGVjdGVkX2JlZ2luID0gZXhwZWN0ZWQtPmdldF9iZWdpbigpOwotICAgIEl0ZXJhdG9yIGV4cGVjdGVkX2VuZCA9IGV4cGVjdGVkLT5nZXRfZW5kKCk7Ci0KLSAgICBJdGVyYXRvciByZWNlaXZlZF9iZWdpbiA9IHJlY2VpdmVkLT5nZXRfYmVnaW4oKTsKLSAgICBJdGVyYXRvciByZWNlaXZlZF9lbmQgPSByZWNlaXZlZC0+Z2V0X2VuZCgpOwotCi0gICAgQVNTRVJUX0VRKGV4cGVjdGVkX2VuZCAtIGV4cGVjdGVkX2JlZ2luLCByZWNlaXZlZF9lbmQgLSByZWNlaXZlZF9iZWdpbik7Ci0KLSAgICB3aGlsZSAoZXhwZWN0ZWRfYmVnaW4gPCBleHBlY3RlZF9lbmQpIHsKLSAgICAgIEFTU0VSVF9FUSgqZXhwZWN0ZWRfYmVnaW4sICpyZWNlaXZlZF9iZWdpbik7Ci0gICAgICBleHBlY3RlZF9iZWdpbisrOwotICAgICAgcmVjZWl2ZWRfYmVnaW4rKzsKLSAgICB9Ci0gIH0KLX07Ci0KLVRFU1RfRihMMmNhcFRlc3QsIGFzc2VtYmxlR29vZFBhY2tldHMpIHsKLSAgdmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxMMmNhcFNkdT4gPiB0ZXN0X3BhY2tldDsKLQotICAvLyBUZXN0IDE6IFBhc3MgY29ycmVjdCBwYWNrZXRzLgotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMF0pKTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzFdKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsyXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfMSA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9ORSh0ZXN0XzEsIG51bGxwdHIpOwotCi0gIHNoYXJlZF9wdHI8VGVzdFBhY2tldD4gZXhwZWN0ZWQobmV3IFRlc3RQYWNrZXQoZ29vZF9sMmNhcF9wYWNrZXQpKTsKLQotICBjb21wYXJlX3BhY2tldHMoZXhwZWN0ZWQsIHRlc3RfMSk7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLQotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMikpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMykpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNCkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNikpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNykpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOCkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOSkpOwotCi0gIHRlc3RfMSA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9ORSh0ZXN0XzEsIG51bGxwdHIpOwotCi0gIGV4cGVjdGVkLnJlc2V0KG5ldyBUZXN0UGFja2V0KGNvbXBsZXRlX2wyY2FwX3BhY2tldCkpOwotICBjb21wYXJlX3BhY2tldHMoZXhwZWN0ZWQsIHRlc3RfMSk7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwVGVzdCwgYXNzZW1ibGVPdXRvZk9yZGVyUGFja2V0cykgewotICB2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiA+IHRlc3RfcGFja2V0OwotCi0gIC8vIFRlc3QgMjogUGFzcyBvdXQgb2Ygb3JkZXIgcGFja2V0cy4KLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzFdKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVswXSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMl0pKTsKLQotICBzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiB0ZXN0XzIgPSBMMmNhcFBhY2tldDo6YXNzZW1ibGUodGVzdF9wYWNrZXQpOwotICBFWFBFQ1RfRVEodGVzdF8yLCBudWxscHRyKTsKLQotICB0ZXN0X3BhY2tldC5jbGVhcigpOwotCi0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8xKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8zKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8yKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF82KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF81KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF80KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF84KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF83KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF85KSk7Ci0KLSAgdGVzdF8yID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHRlc3RfcGFja2V0KTsKLSAgRVhQRUNUX0VRKHRlc3RfMiwgbnVsbHB0cik7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwVGVzdCwgYXNzZW1ibGVCYWRDb250cm9sQnl0ZXMpIHsKLSAgdmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxMMmNhcFNkdT4gPiB0ZXN0X3BhY2tldDsKLQotICAvLyBUZXN0IDM6IFBhc3MgcGFja2V0cyBtaXNzaW5nIHRoZSBmaW5pc2hlZCBjb250cm9sIGJ5dGVzLgotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMF0pKTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzFdKSk7Ci0KLSAgc2hhcmVkX3B0cjxMMmNhcFBhY2tldD4gdGVzdF8zID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHRlc3RfcGFja2V0KTsKLSAgRVhQRUNUX0VRKHRlc3RfMywgbnVsbHB0cik7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLQotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMikpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMykpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNCkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNikpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNykpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOCkpOwotCi0gIHRlc3RfMyA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEVYUEVDVF9FUSh0ZXN0XzMsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcFRlc3QsIGFzc2VtYmxlQmFkRkNTKSB7Ci0gIHZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gdGVzdF9wYWNrZXQ7Ci0KLSAgLy8gVGVzdCA0OiBQYXNzIHBhY2tldHMgd2l0aCBpbmNvcnJlY3QgZnJhbWUgY2hlY2sgc2VxdWVuY2VzLgotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMF0pKTsKLSAgZ29vZF9zZHVbMV1bZ29vZF9zZHVbMV0uc2l6ZSgpIC0gMV0rKzsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzFdKSk7Ci0gIGdvb2Rfc2R1WzFdW2dvb2Rfc2R1WzFdLnNpemUoKSAtIDFdLS07Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsyXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfNCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEVYUEVDVF9FUSh0ZXN0XzQsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci0KLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzEpKTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzIpKTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzMpKTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzQpKTsKLSAgbDJjYXBfdGVzdF9wYWNrZXRfNVtsMmNhcF90ZXN0X3BhY2tldF81LnNpemUoKSAtIDFdKys7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF81KSk7Ci0gIGwyY2FwX3Rlc3RfcGFja2V0XzVbbDJjYXBfdGVzdF9wYWNrZXRfNS5zaXplKCkgLSAxXS0tOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNikpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNykpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOCkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOSkpOwotCi0gIHRlc3RfNCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEVYUEVDVF9FUSh0ZXN0XzQsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcFRlc3QsIGFzc2VtYmxlRW1wdHlQYXlsb2FkKSB7Ci0gIHZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gdGVzdF9wYWNrZXQ7Ci0KLSAgLy8gVGVzdCA1OiBQYXNzIGEgcGFja2V0IHdpdGggYW4gZW1wdHkgcGF5bG9hZC4KLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGVtcHR5X3NkdV9wYXlsb2FkWzBdKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihlbXB0eV9zZHVfcGF5bG9hZFsxXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfNSA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEFTU0VSVF9ORSh0ZXN0XzUsIG51bGxwdHIpOwotCi0gIHNoYXJlZF9wdHI8VGVzdFBhY2tldD4gZXhwZWN0ZWQobmV3IFRlc3RQYWNrZXQoZW1wdHlfbDJjYXBfcGF5bG9hZCkpOwotICBjb21wYXJlX3BhY2tldHMoZXhwZWN0ZWQsIHRlc3RfNSk7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwVGVzdCwgYXNzZW1ibGVBbGxTdGFydGluZ0NvbnRyb2xFcnJvcikgewotICB2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiA+IHRlc3RfcGFja2V0OwotCi0gIC8vIFRlc3QgNjogUGFzcyBhIFNEVSB3aXRoIGFsbCB0aGUgY29udHJvbCBieXRlcyBzZXQgdG8gYXMgdGhlIHN0YXJ0aW5nIGJ5dGVzLgotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoYWxsX2ZpcnN0X3BhY2tldFswXSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoYWxsX2ZpcnN0X3BhY2tldFsxXSkpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoYWxsX2ZpcnN0X3BhY2tldFsyXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfNiA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEVYUEVDVF9FUSh0ZXN0XzYsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcFRlc3QsIGFzc2VtYmxlQmFkQ0lEKSB7Ci0gIHZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gdGVzdF9wYWNrZXQ7Ci0KLSAgLy8gVGVzdCA3OiBQYXNzIFNEVXMgd2l0aCBtaXhlZCBjaGFubmVsIGlkcy4KLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzBdKSk7Ci0gIGdvb2Rfc2R1WzFdWzJdKys7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayh1cGRhdGVfZmNzKGdvb2Rfc2R1WzFdKSk7Ci0gIGdvb2Rfc2R1WzFdWzJdLS07Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsyXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfNyA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEVYUEVDVF9FUSh0ZXN0XzcsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci0KLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzEpKTsKLSAgbDJjYXBfdGVzdF9wYWNrZXRfMlsyXSsrOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soKHVwZGF0ZV9mY3MobDJjYXBfdGVzdF9wYWNrZXRfMikpKTsKLSAgbDJjYXBfdGVzdF9wYWNrZXRfMlsyXS0tOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMykpOwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNCkpOwotICBsMmNhcF90ZXN0X3BhY2tldF81WzJdKys7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjaygodXBkYXRlX2ZjcyhsMmNhcF90ZXN0X3BhY2tldF81KSkpOwotICBsMmNhcF90ZXN0X3BhY2tldF81WzJdLS07Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF82KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF83KSk7Ci0gIGwyY2FwX3Rlc3RfcGFja2V0XzhbMl0tLTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKCh1cGRhdGVfZmNzKGwyY2FwX3Rlc3RfcGFja2V0XzgpKSk7Ci0gIGwyY2FwX3Rlc3RfcGFja2V0XzhbMl0rKzsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzkpKTsKLQotICB0ZXN0XzcgPSBMMmNhcFBhY2tldDo6YXNzZW1ibGUodGVzdF9wYWNrZXQpOwotICBFWFBFQ1RfRVEodGVzdF83LCBudWxscHRyKTsKLQotICB0ZXN0X3BhY2tldC5jbGVhcigpOwotfQotCi1URVNUX0YoTDJjYXBUZXN0LCBhc3NlbWJsZVVuc2VnbWVudGVkU0RVKSB7Ci0gIHZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gdGVzdF9wYWNrZXQ7Ci0KLSAgLy8gVGVzdCA4OiBQYXNzIGEgY29tcGxldGUgbDJjYXAgcGFja2V0LgotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3Iob25lX3NkdVswXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfOCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0gIEVYUEVDVF9ORSh0ZXN0XzgsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci19Ci0KLVRFU1RfRihMMmNhcFRlc3QsIGFzc2VtYmxlQmFkVHhTZXEpIHsKLSAgdmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxMMmNhcFNkdT4gPiB0ZXN0X3BhY2tldDsKLQotICAvLyBUZXN0IDk6IFBhc3MgU0RVcyB3aXRoIGluY29ycmVjdCBUeFNlcS4KLSAgZ29vZF9zZHVbMF1bNF0gKz0gNDsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKCh1cGRhdGVfZmNzKGdvb2Rfc2R1WzBdKSkpOwotICBnb29kX3NkdVswXVs0XSAtPSA0OwotICB0ZXN0X3BhY2tldC5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMV0pKTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzJdKSk7Ci0KLSAgc2hhcmVkX3B0cjxMMmNhcFBhY2tldD4gdGVzdF85ID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHRlc3RfcGFja2V0KTsKLSAgRVhQRUNUX0VRKHRlc3RfOSwgbnVsbHB0cik7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLX0KLQotVEVTVF9GKEwyY2FwVGVzdCwgYXNzZW1ibGVCYWRUb3RhbFNEVUxlbmd0aCkgewotICB2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiA+IHRlc3RfcGFja2V0OwotCi0gIC8vIFRlc3QgMTA6IFBhc3MgU0RVcyB3aXRoIGFuIGluY29ycmVjdCB0b3RhbCBTRFUgbGVuZ3RoCi0gIGdvb2Rfc2R1WzBdWzddKys7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjaygodXBkYXRlX2Zjcyhnb29kX3NkdVswXSkpKTsKLSAgZ29vZF9zZHVbMF1bN10tLTsKLSAgdGVzdF9wYWNrZXQucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzFdKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsyXSkpOwotCi0gIHNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IHRlc3RfMTAgPSBMMmNhcFBhY2tldDo6YXNzZW1ibGUodGVzdF9wYWNrZXQpOwotICBFWFBFQ1RfRVEodGVzdF8xMCwgbnVsbHB0cik7Ci0KLSAgdGVzdF9wYWNrZXQuY2xlYXIoKTsKLQotICBsMmNhcF90ZXN0X3BhY2tldF8xWzZdKys7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjaygodXBkYXRlX2ZjcyhsMmNhcF90ZXN0X3BhY2tldF8xKSkpOwotICBsMmNhcF90ZXN0X3BhY2tldF8xWzZdLS07Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8yKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8zKSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF80KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF81KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF82KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF83KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF84KSk7Ci0gIHRlc3RfcGFja2V0LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF85KSk7Ci0KLSAgdGVzdF8xMCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZSh0ZXN0X3BhY2tldCk7Ci0KLSAgRVhQRUNUX0VRKHRlc3RfMTAsIG51bGxwdHIpOwotCi0gIHRlc3RfcGFja2V0LmNsZWFyKCk7Ci19Ci0KLS8vIEJlZ2luIEZyYWdtZW50IFRlc3QxCi1URVNUX0YoTDJjYXBUZXN0LCBmcmFnbWVudFNtYWxsU2VnbWVudFRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiA+IHNkdTsKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiBsMmNhcF9leHBlY3RlZDsKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiBsMmNhcF9yZWNlaXZlZDsKLQotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzBdKSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMV0pKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsyXSkpOwotCi0gIGwyY2FwX2V4cGVjdGVkID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHNkdSk7Ci0KLSAgc2R1LmNsZWFyKCk7Ci0KLSAgLy8gVGVzdDE6IFNtYWxsIHNlZ21lbnRzCi0gIHNkdSA9IGwyY2FwX2V4cGVjdGVkLT5mcmFnbWVudCgxNiwgMHgwMiwgMHg0MSk7Ci0KLSAgbDJjYXBfcmVjZWl2ZWQgPSBMMmNhcFBhY2tldDo6YXNzZW1ibGUoc2R1KTsKLSAgQVNTRVJUX05FKGwyY2FwX3JlY2VpdmVkLCBudWxscHRyKSA8PCAicGFja2V0IHJlYXNzZW1ibHkgZmFpbGVkIGFmdGVyIGZyYWdtZW50IiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVGVzdDE6IFNtYWxsIFNlZ21lbnQgcmVxdWVzdCIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInNkdSB1c2VkOiBnb29kX3NkdSIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZ1bmN0aW9uIGNhbGw6IGZyYWdtZW50KDE2LCAweDAyLCAweDQxKSIgPDwgc3RkOjplbmRsOwotCi0gIGNvbXBhcmVfcGFja2V0cyhsMmNhcF9leHBlY3RlZCwgbDJjYXBfcmVjZWl2ZWQpOwotCi0gIHNkdS5jbGVhcigpOwotICBsMmNhcF9leHBlY3RlZC5yZXNldCgpOwotICBsMmNhcF9yZWNlaXZlZC5yZXNldCgpOwotfSAgLy8gRW5kIEZyYWdtZW50IFRlc3QxCi0KLS8vIEJlZ2luIEZyYWdtZW50IFRlc3QyCi1URVNUX0YoTDJjYXBUZXN0LCBmcmFnbWVudExhcmdlU2VnbWVudFRlc3QpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiA+IHNkdTsKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiBsMmNhcF9leHBlY3RlZDsKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiBsMmNhcF9yZWNlaXZlZDsKLQotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzEpKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8yKSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMykpOwotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzQpKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF81KSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNikpOwotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzcpKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF84KSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOSkpOwotCi0gIGwyY2FwX2V4cGVjdGVkID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHNkdSk7Ci0KLSAgc2R1LmNsZWFyKCk7Ci0KLSAgLy8gVGVzdDI6IExhcmdlIFNlZ21lbnRzCi0gIHNkdSA9IGwyY2FwX2V4cGVjdGVkLT5mcmFnbWVudCgxMDI0LCAweDAyLCAweDQxKTsKLQotICBsMmNhcF9yZWNlaXZlZCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZShzZHUpOwotICBBU1NFUlRfTkUobDJjYXBfcmVjZWl2ZWQsIG51bGxwdHIpIDw8ICJwYWNrZXQgcmVhc3NlbWJseSBmYWlsZWQgYWZ0ZXIgZnJhZ21lbnQiIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUZXN0MjogTGFyZ2UgU2VnbWVudCByZXF1ZXN0IiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic2R1IHVzZWQ6IGwyY2FwX3Rlc3RfcGFja2V0WzEtOV0iIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJmdW5jdGlvbiBjYWxsOiBmcmFnbWVudCgxMDI0LCAweDAyLCAweDQxKSIgPDwgc3RkOjplbmRsOwotCi0gIGNvbXBhcmVfcGFja2V0cyhsMmNhcF9leHBlY3RlZCwgbDJjYXBfcmVjZWl2ZWQpOwotCi0gIHNkdS5jbGVhcigpOwotICBsMmNhcF9leHBlY3RlZC5yZXNldCgpOwotICBsMmNhcF9yZWNlaXZlZC5yZXNldCgpOwotfSAgLy8gRW5kIEZyYWdtZW50IFRlc3QyCi0KLS8vIEJlZ2luIEZyYWdtZW50IFRlc3QzCi1URVNUX0YoTDJjYXBUZXN0LCBmcmFnbWVudFR4U2VxVGVzdCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gc2R1OwotICBzdGQ6OnNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IGwyY2FwX2V4cGVjdGVkOwotICBzdGQ6OnNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IGwyY2FwX3JlY2VpdmVkOwotCi0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMF0pKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsxXSkpOwotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzJdKSk7Ci0KLSAgbDJjYXBfZXhwZWN0ZWQgPSBMMmNhcFBhY2tldDo6YXNzZW1ibGUoc2R1KTsKLQotICBzZHUuY2xlYXIoKTsKLQotICAvLyBUZXN0MzogTm9uLXplcm8gc3RhcnRpbmcgVHhTZXEKLSAgc2R1ID0gbDJjYXBfZXhwZWN0ZWQtPmZyYWdtZW50KDI0LCAweDA4LCAweDQxKTsKLQotICBsMmNhcF9yZWNlaXZlZCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZShzZHUpOwotICBBU1NFUlRfTkUobDJjYXBfcmVjZWl2ZWQsIG51bGxwdHIpIDw8ICJwYWNrZXQgcmVhc3NlbWJseSBmYWlsZWQgYWZ0ZXIgZnJhZ21lbnQiIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUZXN0MzogTm9uLXplcm8gc3RhcnRpbmcgVHhTZXEiIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzZHUgdXNlZDogZ29vZF9zZHUiIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJmdW5jdGlvbiBjYWxsOiBmcmFnbWVudCgyNCwgMHgwOCwgMHg0MSkiIDw8IHN0ZDo6ZW5kbDsKLQotICBjb21wYXJlX3BhY2tldHMobDJjYXBfZXhwZWN0ZWQsIGwyY2FwX3JlY2VpdmVkKTsKLQotICBzZHUuY2xlYXIoKTsKLSAgbDJjYXBfZXhwZWN0ZWQucmVzZXQoKTsKLSAgbDJjYXBfcmVjZWl2ZWQucmVzZXQoKTsKLX0gIC8vIEVuZCBGcmFnbWVudCBUZXN0MwotCi0vLyBCZWdpbiBGcmFnbWVudCBUZXN0NAotVEVTVF9GKEwyY2FwVGVzdCwgZnJhZ21lbnRQYXlsb2FkVGVzdCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gc2R1OwotICBzdGQ6OnNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IGwyY2FwX2V4cGVjdGVkOwotICBzdGQ6OnNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IGwyY2FwX3JlY2VpdmVkOwotCi0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZW1wdHlfc2R1X3BheWxvYWRbMF0pKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihlbXB0eV9zZHVfcGF5bG9hZFsxXSkpOwotCi0gIGwyY2FwX2V4cGVjdGVkID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHNkdSk7Ci0KLSAgc2R1LmNsZWFyKCk7Ci0KLSAgLy8gVGVzdDQ6IFBhY2tldCB3aXRoIG5vIHBheWxvYWQKLSAgc2R1ID0gbDJjYXBfZXhwZWN0ZWQtPmZyYWdtZW50KDE2LCAweDAyLCAweDQxKTsKLQotICBsMmNhcF9yZWNlaXZlZCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZShzZHUpOwotICBBU1NFUlRfTkUobDJjYXBfcmVjZWl2ZWQsIG51bGxwdHIpIDw8ICJwYWNrZXQgcmVhc3NlbWJseSBmYWlsZWQgYWZ0ZXIgZnJhZ21lbnQiIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUZXN0NDogUGFja2V0IHdpdGggbm8gcGF5bG9hZCIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInNkdSB1c2VkOiBlbXB0eV9zZHVfcGF5bG9hZCIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZ1bmN0aW9uIGNhbGw6IGZyYWdtZW50KDE2LCAweDAyLCAweDQxKSIgPDwgc3RkOjplbmRsOwotCi0gIGNvbXBhcmVfcGFja2V0cyhsMmNhcF9leHBlY3RlZCwgbDJjYXBfcmVjZWl2ZWQpOwotCi0gIHNkdS5jbGVhcigpOwotICBsMmNhcF9leHBlY3RlZC5yZXNldCgpOwotICBsMmNhcF9yZWNlaXZlZC5yZXNldCgpOwotfSAgLy8gRW5kIEZyYWdtZW50IFRlc3Q0Ci0KLS8vIEJlZ2luIEZyYWdtZW50IFRlc3Q1Ci1URVNUX0YoTDJjYXBUZXN0LCBmcmFnbWVudFNlZ21lbnRTaXplVGVzdCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TDJjYXBTZHU+ID4gc2R1OwotICBzdGQ6OnNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IGwyY2FwX2V4cGVjdGVkOwotICBzdGQ6OnNoYXJlZF9wdHI8TDJjYXBQYWNrZXQ+IGwyY2FwX3JlY2VpdmVkOwotCi0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IoZ29vZF9zZHVbMF0pKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3Rvcihnb29kX3NkdVsxXSkpOwotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGdvb2Rfc2R1WzJdKSk7Ci0KLSAgbDJjYXBfZXhwZWN0ZWQgPSBMMmNhcFBhY2tldDo6YXNzZW1ibGUoc2R1KTsKLQotICBzZHUuY2xlYXIoKTsKLQotICAvLyBUZXN0NTogTGFyZ2VyIHNlZ21lbnQgc2l6ZSB0aGFuIHBhY2tldCBzaXplCi0gIHNkdSA9IGwyY2FwX2V4cGVjdGVkLT5mcmFnbWVudCgyNTYsIDB4MDIsIDB4NDEpOwotCi0gIGwyY2FwX3JlY2VpdmVkID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHNkdSk7Ci0gIEFTU0VSVF9ORShsMmNhcF9yZWNlaXZlZCwgbnVsbHB0cikgPDwgInBhY2tldCByZWFzc2VtYmx5IGZhaWxlZCBhZnRlciBmcmFnbWVudCIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRlc3Q1OiBTZWdtZW50IHNpemUgPiBQYXlsb2FkIiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic2R1IHVzZWQ6IGdvb2Rfc2R1IiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZnVuY3Rpb24gY2FsbDogZnJhZ21lbnQoMjU2LCAweDAyLCAweDQxKSIgPDwgc3RkOjplbmRsOwotCi0gIGNvbXBhcmVfcGFja2V0cyhsMmNhcF9leHBlY3RlZCwgbDJjYXBfcmVjZWl2ZWQpOwotCi0gIHNkdS5jbGVhcigpOwotICBsMmNhcF9leHBlY3RlZC5yZXNldCgpOwotICBsMmNhcF9yZWNlaXZlZC5yZXNldCgpOwotfSAgLy8gRW5kIEZyYWdtZW50IFRlc3Q1Ci0KLS8vIEJlZ2luIEZyYWdtZW50IFRlc3Q2Ci1URVNUX0YoTDJjYXBUZXN0LCBmcmFnbWVudFNlZ21lbnRTaXplVGVzdDIpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEwyY2FwU2R1PiA+IHNkdTsKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiBsMmNhcF9leHBlY3RlZDsKLSAgc3RkOjpzaGFyZWRfcHRyPEwyY2FwUGFja2V0PiBsMmNhcF9yZWNlaXZlZDsKLQotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzEpKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF8yKSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfMykpOwotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzQpKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF81KSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfNikpOwotICBzZHUucHVzaF9iYWNrKEwyY2FwU2R1OjpMMmNhcFNkdUNvbnN0cnVjdG9yKGwyY2FwX3Rlc3RfcGFja2V0XzcpKTsKLSAgc2R1LnB1c2hfYmFjayhMMmNhcFNkdTo6TDJjYXBTZHVDb25zdHJ1Y3RvcihsMmNhcF90ZXN0X3BhY2tldF84KSk7Ci0gIHNkdS5wdXNoX2JhY2soTDJjYXBTZHU6OkwyY2FwU2R1Q29uc3RydWN0b3IobDJjYXBfdGVzdF9wYWNrZXRfOSkpOwotCi0gIGwyY2FwX2V4cGVjdGVkID0gTDJjYXBQYWNrZXQ6OmFzc2VtYmxlKHNkdSk7Ci0gIHNkdS5jbGVhcigpOwotCi0gIC8vIFRlc3Q2OiBTbWFsbCBzZWdtZW50IHNpemUgb24gbGFyZ2UgcGFja2V0LgotICBzZHUgPSBsMmNhcF9leHBlY3RlZC0+ZnJhZ21lbnQoNTEyLCAweDAyLCAweDQxKTsKLQotICBsMmNhcF9yZWNlaXZlZCA9IEwyY2FwUGFja2V0Ojphc3NlbWJsZShzZHUpOwotICBBU1NFUlRfTkUobDJjYXBfcmVjZWl2ZWQsIG51bGxwdHIpIDw8ICJwYWNrZXQgcmVhc3NlbWJseSBmYWlsZWQgYWZ0ZXIgZnJhZ21lbnQiIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUZXN0NjogU21hbGwgU2VnbWVudCByZXF1ZXN0IG9uIGxhcmdlIHBhY2tldCIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInNkdSB1c2VkOiBsMmNhcF90ZXN0X3BhY2tldF9bMS05XSIgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZ1bmN0aW9uIGNhbGw6IGZyYWdtZW50KDY0LCAweDAyLCAweDQxKSIgPDwgc3RkOjplbmRsOwotCi0gIGNvbXBhcmVfcGFja2V0cyhsMmNhcF9leHBlY3RlZCwgbDJjYXBfcmVjZWl2ZWQpOwotCi0gIHNkdS5jbGVhcigpOwotICBsMmNhcF9leHBlY3RlZC5yZXNldCgpOwotICBsMmNhcF9yZWNlaXZlZC5yZXNldCgpOwotfSAgLy8gRW5kIEZyYWdtZW50IFRlc3Q2Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L2xpbmtfbGF5ZXJfc29ja2V0X2RldmljZV90ZXN0LmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvbGlua19sYXllcl9zb2NrZXRfZGV2aWNlX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGVlNDkuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvbGlua19sYXllcl9zb2NrZXRfZGV2aWNlX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIm1vZGVsL2RldmljZXMvbGlua19sYXllcl9zb2NrZXRfZGV2aWNlLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJtb2RlbC9zZXR1cC9hc3luY19tYW5hZ2VyLmgiCi0jaW5jbHVkZSAicGFja2V0cy9saW5rX2xheWVyL2NvbW1hbmRfdmlldy5oIgotCi1zdGQ6OnZlY3Rvcjx1aW50OF90PiBjb3VudCA9IHsKLSAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAotICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCi0gICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwKLSAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLAotfTsKLQotdXNpbmcgdGVzdF92ZW5kb3JfbGliOjpwYWNrZXRzOjpDb21tYW5kQnVpbGRlcjsKLXVzaW5nIHRlc3RfdmVuZG9yX2xpYjo6cGFja2V0czo6Q29tbWFuZFZpZXc7Ci11c2luZyB0ZXN0X3ZlbmRvcl9saWI6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldEJ1aWxkZXI7Ci11c2luZyB0ZXN0X3ZlbmRvcl9saWI6OnBhY2tldHM6OkxpbmtMYXllclBhY2tldFZpZXc7Ci11c2luZyB0ZXN0X3ZlbmRvcl9saWI6OnBhY2tldHM6OlBhY2tldFZpZXc7Ci11c2luZyB0ZXN0X3ZlbmRvcl9saWI6OnBhY2tldHM6OlZpZXc7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga01heENvbm5lY3Rpb25zID0gMzAwOwotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgTGlua0xheWVyU29ja2V0RGV2aWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtQb3J0ID0gNjEyMzsKLQotIHByb3RlY3RlZDoKLSAgY2xhc3MgTW9ja1BoeUxheWVyIDogcHVibGljIFBoeUxheWVyIHsKLSAgIHB1YmxpYzoKLSAgICBNb2NrUGh5TGF5ZXIoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPik+JiBvbl9yZWNlaXZlKQotICAgICAgICA6IFBoeUxheWVyKFBoeTo6VHlwZTo6TE9XX0VORVJHWSwgMCwgW10oTGlua0xheWVyUGFja2V0Vmlldykge30pLCBvbl9yZWNlaXZlXyhvbl9yZWNlaXZlKSB7fQotICAgIHZvaWQgU2VuZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlua0xheWVyUGFja2V0QnVpbGRlcj4gcGFja2V0KSBvdmVycmlkZSB7Ci0gICAgICBvbl9yZWNlaXZlXyhwYWNrZXQpOwotICAgIH0KLSAgICB2b2lkIFJlY2VpdmUoTGlua0xheWVyUGFja2V0Vmlldykgb3ZlcnJpZGUge30KLSAgICB2b2lkIFRpbWVyVGljaygpIG92ZXJyaWRlIHt9Ci0KLSAgIHByaXZhdGU6Ci0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPik+IG9uX3JlY2VpdmVfOwotICB9OwotCi0gIGludCBTdGFydFNlcnZlcigpIHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2Vydl9hZGRyOwotICAgIGludCBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0gICAgRVhQRUNUX0ZBTFNFKGZkIDwgMCk7Ci0KLSAgICBtZW1zZXQoJnNlcnZfYWRkciwgMCwgc2l6ZW9mKHNlcnZfYWRkcikpOwotICAgIHNlcnZfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBzZXJ2X2FkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKLSAgICBzZXJ2X2FkZHIuc2luX3BvcnQgPSBodG9ucyhrUG9ydCk7Ci0gICAgaW50IHJldXNlX2ZsYWcgPSAxOwotICAgIEVYUEVDVF9GQUxTRShzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZyZXVzZV9mbGFnLCBzaXplb2YocmV1c2VfZmxhZykpIDwgMCk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJpbmQoZmQsIChzb2NrYWRkciopJnNlcnZfYWRkciwgc2l6ZW9mKHNlcnZfYWRkcikpIDwgMCk7Ci0KLSAgICBsaXN0ZW4oZmQsIDEpOwotICAgIHJldHVybiBmZDsKLSAgfQotCi0gIGludCBBY2NlcHRDb25uZWN0aW9uKGludCBmZCkgewotICAgIHJldHVybiBhY2NlcHQoZmQsIE5VTEwsIE5VTEwpOwotICB9Ci0KLSAgdm9pZCBWYWxpZGF0ZVBhY2tldChzaXplX3QgaW5kZXgsIGJvb2wgYXRfc2VydmVyLCBzdGQ6OnNoYXJlZF9wdHI8TGlua0xheWVyUGFja2V0QnVpbGRlcj4gcmVjZWl2ZWQpIHsKLSAgICAvKiBDb252ZXJ0IHRoZSBCdWlsZGVyIGludG8gYSBWaWV3ICovCi0gICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBwYWNrZXRfcHRyID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oKTsKLSAgICBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBpdCgqcGFja2V0X3B0cik7Ci0gICAgcmVjZWl2ZWQtPlNlcmlhbGl6ZShpdCk7Ci0gICAgTGlua0xheWVyUGFja2V0VmlldyByZWNlaXZlZF92aWV3ID0gTGlua0xheWVyUGFja2V0Vmlldzo6Q3JlYXRlKHBhY2tldF9wdHIpOwotCi0gICAgLyogVmFsaWRhdGUgcmVjZWl2ZWQgcGFja2V0ICovCi0gICAgQVNTRVJUX0VRKHJlY2VpdmVkX3ZpZXcuR2V0U291cmNlQWRkcmVzcygpLCBzb3VyY2VfKTsKLSAgICBBU1NFUlRfRVEocmVjZWl2ZWRfdmlldy5HZXREZXN0aW5hdGlvbkFkZHJlc3MoKSwgZGVzdF8pOwotICAgIEFTU0VSVF9FUShMaW5rOjpQYWNrZXRUeXBlOjpDT01NQU5ELCByZWNlaXZlZF92aWV3LkdldFR5cGUoKSk7Ci0gICAgQ29tbWFuZFZpZXcgY29tbWFuZF92aWV3ID0gQ29tbWFuZFZpZXc6OkdldENvbW1hbmQocmVjZWl2ZWRfdmlldyk7Ci0gICAgaWYgKGF0X3NlcnZlcikgewotICAgICAgQVNTRVJUX0VRKGNsaWVudF9vcGNvZGVzX1tpbmRleF0sIGNvbW1hbmRfdmlldy5HZXRPcGNvZGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVF9FUShzZXJ2ZXJfb3Bjb2Rlc19baW5kZXhdLCBjb21tYW5kX3ZpZXcuR2V0T3Bjb2RlKCkpOwotICAgIH0KLSAgICBhdXRvIGFyZ3NfaXRyID0gY29tbWFuZF92aWV3LkdldERhdGEoKTsKLSAgICBBU1NFUlRfRVEoYXJnc19pdHIuTnVtQnl0ZXNSZW1haW5pbmcoKSwgY291bnQuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50LnNpemUoKTsgaSsrKSB7Ci0gICAgICBBU1NFUlRfRVEoKmFyZ3NfaXRyKyssIGNvdW50W2ldKTsKLSAgICB9Ci0gICAgaWYgKGF0X3NlcnZlcikgewotICAgICAgdmFsaWRhdGVkX2NsaWVudF9wYWNrZXRzX1tpbmRleF0rKzsKLSAgICB9IGVsc2UgewotICAgICAgdmFsaWRhdGVkX3NlcnZlcl9wYWNrZXRzX1tpbmRleF0rKzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHNlcnZlcnNfLnJlc2VydmUoa01heENvbm5lY3Rpb25zKTsKLSAgICBjbGllbnRzXy5yZXNlcnZlKGtNYXhDb25uZWN0aW9ucyk7Ci0gICAgc29ja2V0X2ZkXyA9IFN0YXJ0U2VydmVyKCk7Ci0KLSAgICBhc3luY19tYW5hZ2VyXy5XYXRjaEZkRm9yTm9uQmxvY2tpbmdSZWFkcyhzb2NrZXRfZmRfLCBbdGhpc10oaW50IGZkKSB7Ci0gICAgICBpbnQgY29ubmVjdGlvbl9mZCA9IEFjY2VwdENvbm5lY3Rpb24oZmQpOwotICAgICAgQVNTRVJUX0dFKGNvbm5lY3Rpb25fZmQsIDApOwotICAgICAgc2l6ZV90IGluZGV4ID0gc2VydmVyc18uc2l6ZSgpOwotICAgICAgc2VydmVyc18uZW1wbGFjZV9iYWNrKGNvbm5lY3Rpb25fZmQsIFBoeTo6VHlwZTo6TE9XX0VORVJHWSk7Ci0gICAgICBBU1NFUlRfRVEoc2VydmVyc18uc2l6ZSgpIC0gMSwgaW5kZXgpIDw8ICJSYWNlIGNvbmRpdGlvbiI7Ci0gICAgICBzdGQ6OnNoYXJlZF9wdHI8TW9ja1BoeUxheWVyPiBtb2NrX3BoeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TW9ja1BoeUxheWVyPigKLSAgICAgICAgICBbdGhpcywgaW5kZXhdKHN0ZDo6c2hhcmVkX3B0cjxMaW5rTGF5ZXJQYWNrZXRCdWlsZGVyPiByZWNlaXZlZCkgeyBWYWxpZGF0ZVBhY2tldChpbmRleCwgdHJ1ZSwgcmVjZWl2ZWQpOyB9KTsKLSAgICAgIHNlcnZlcnNfW2luZGV4XS5SZWdpc3RlclBoeUxheWVyKG1vY2tfcGh5KTsKLSAgICB9KTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgYXN5bmNfbWFuYWdlcl8uU3RvcFdhdGNoaW5nRmlsZURlc2NyaXB0b3Ioc29ja2V0X2ZkXyk7Ci0gICAgY2xvc2Uoc29ja2V0X2ZkXyk7Ci0gIH0KLQotICBpbnQgQ29ubmVjdENsaWVudCgpIHsKLSAgICBpbnQgc29ja2V0X2NsaV9mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHNvY2tldF9jbGlfZmQgPCAwKTsKLQotICAgIHN0cnVjdCBob3N0ZW50KiBzZXJ2ZXI7Ci0gICAgc2VydmVyID0gZ2V0aG9zdGJ5bmFtZSgibG9jYWxob3N0Iik7Ci0gICAgRVhQRUNUX0ZBTFNFKHNlcnZlciA9PSBOVUxMKTsKLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2X2FkZHI7Ci0gICAgbWVtc2V0KCh2b2lkKikmc2Vydl9hZGRyLCAwLCBzaXplb2Yoc2Vydl9hZGRyKSk7Ci0gICAgc2Vydl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHNlcnZfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotICAgIHNlcnZfYWRkci5zaW5fcG9ydCA9IGh0b25zKGtQb3J0KTsKLQotICAgIGludCByZXN1bHQgPSBjb25uZWN0KHNvY2tldF9jbGlfZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2X2FkZHIsIHNpemVvZihzZXJ2X2FkZHIpKTsKLSAgICBFWFBFQ1RfRkFMU0UocmVzdWx0IDwgMCk7Ci0KLSAgICBFWFBFQ1RfR0Uoc29ja2V0X2NsaV9mZCwgMCk7Ci0KLSAgICByZXR1cm4gc29ja2V0X2NsaV9mZDsKLSAgfQotCi0gIHZvaWQgVmFsaWRhdGVDb25uZWN0aW9uKHNpemVfdCBwYWlyX2lkKSB7Ci0gICAgQVNTRVJUX0dUKGNsaWVudHNfLnNpemUoKSwgcGFpcl9pZCk7Ci0gICAgQVNTRVJUX0dUKHNlcnZlcnNfLnNpemUoKSwgcGFpcl9pZCk7Ci0gIH0KLQotICBzaXplX3QgQ3JlYXRlQ29ubmVjdGlvbigpIHsKLSAgICBpbnQgZmQgPSBDb25uZWN0Q2xpZW50KCk7Ci0gICAgc2l6ZV90IGluZGV4ID0gY2xpZW50c18uc2l6ZSgpOwotICAgIGNsaWVudHNfLmVtcGxhY2VfYmFjayhmZCwgUGh5OjpUeXBlOjpMT1dfRU5FUkdZKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TW9ja1BoeUxheWVyPiBtb2NrX3BoeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TW9ja1BoeUxheWVyPigKLSAgICAgICAgW3RoaXMsIGluZGV4XShzdGQ6OnNoYXJlZF9wdHI8TGlua0xheWVyUGFja2V0QnVpbGRlcj4gcmVjZWl2ZWQpIHsgVmFsaWRhdGVQYWNrZXQoaW5kZXgsIGZhbHNlLCByZWNlaXZlZCk7IH0pOwotICAgIGNsaWVudHNfW2luZGV4XS5SZWdpc3RlclBoeUxheWVyKG1vY2tfcGh5KTsKLSAgICBmb3IgKHNpemVfdCB0aW1lb3V0ID0gMTA7IHRpbWVvdXQgPiAwICYmIGNsaWVudHNfLnNpemUoKSA+IHNlcnZlcnNfLnNpemUoKTsgdGltZW91dC0tKSB7Ci0gICAgICBzbGVlcCgwKTsgIC8vIFdhaXQgZm9yIHNlcnZlciB0byBiZSBjcmVhdGVkCi0gICAgfQotICAgIFZhbGlkYXRlQ29ubmVjdGlvbihpbmRleCk7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgTGlua0xheWVyUGFja2V0VmlldyBOZXh0UGFja2V0KCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gY291bnRfc2hhcmVkID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4oY291bnQpOwotICAgIExpbmtMYXllclBhY2tldFZpZXcgdmlldyA9IExpbmtMYXllclBhY2tldFZpZXc6OkNyZWF0ZShjb3VudF9zaGFyZWQpOwotICAgIHJldHVybiB2aWV3OwotICB9Ci0KLSAgdm9pZCBTZW5kRnJvbUNsaWVudChzaXplX3QgcGFpcl9pZCkgewotICAgIEFTU0VSVF9HVChjbGllbnRzXy5zaXplKCksIHBhaXJfaWQpOwotICAgIExpbmtMYXllclBhY2tldFZpZXcgdmlldyA9IE5leHRQYWNrZXQoKTsKLSAgICBjbGllbnRfb3Bjb2Rlc19bcGFpcl9pZF0gPSBDb21tYW5kVmlldzo6R2V0Q29tbWFuZCh2aWV3KS5HZXRPcGNvZGUoKTsKLSAgICBjbGllbnRzX1twYWlyX2lkXS5JbmNvbWluZ1BhY2tldCh2aWV3KTsKLSAgfQotCi0gIHZvaWQgU2VuZEZyb21TZXJ2ZXIoc2l6ZV90IHBhaXJfaWQpIHsKLSAgICBBU1NFUlRfR1Qoc2VydmVyc18uc2l6ZSgpLCBwYWlyX2lkKTsKLSAgICBMaW5rTGF5ZXJQYWNrZXRWaWV3IHZpZXcgPSBOZXh0UGFja2V0KCk7Ci0gICAgc2VydmVyX29wY29kZXNfW3BhaXJfaWRdID0gQ29tbWFuZFZpZXc6OkdldENvbW1hbmQodmlldykuR2V0T3Bjb2RlKCk7Ci0gICAgc2VydmVyc19bcGFpcl9pZF0uSW5jb21pbmdQYWNrZXQodmlldyk7Ci0gIH0KLQotICB2b2lkIFJlYWRGcm9tQ2xpZW50KHNpemVfdCBwYWlyX2lkKSB7Ci0gICAgQVNTRVJUX0dUKGNsaWVudHNfLnNpemUoKSwgcGFpcl9pZCk7Ci0gICAgc2l6ZV90IHZhbGlkYXRlZF9wYWNrZXRzID0gdmFsaWRhdGVkX3NlcnZlcl9wYWNrZXRzX1twYWlyX2lkXTsKLSAgICBmb3IgKHNpemVfdCB0cmllcyA9IDA7IHRyaWVzIDwgMTAgJiYgdmFsaWRhdGVkX3NlcnZlcl9wYWNrZXRzX1twYWlyX2lkXSA9PSB2YWxpZGF0ZWRfcGFja2V0czsgdHJpZXMrKykgewotICAgICAgY2xpZW50c19bcGFpcl9pZF0uVGltZXJUaWNrKCk7Ci0gICAgfQotICAgIEFTU0VSVF9FUSh2YWxpZGF0ZWRfc2VydmVyX3BhY2tldHNfW3BhaXJfaWRdLCB2YWxpZGF0ZWRfcGFja2V0cyArIDEpOwotICB9Ci0KLSAgdm9pZCBSZWFkRnJvbVNlcnZlcihzaXplX3QgcGFpcl9pZCkgewotICAgIEFTU0VSVF9HVChzZXJ2ZXJzXy5zaXplKCksIHBhaXJfaWQpOwotICAgIHNpemVfdCB2YWxpZGF0ZWRfcGFja2V0cyA9IHZhbGlkYXRlZF9jbGllbnRfcGFja2V0c19bcGFpcl9pZF07Ci0gICAgZm9yIChzaXplX3QgdHJpZXMgPSAwOyB0cmllcyA8IDEwICYmIHZhbGlkYXRlZF9jbGllbnRfcGFja2V0c19bcGFpcl9pZF0gPT0gdmFsaWRhdGVkX3BhY2tldHM7IHRyaWVzKyspIHsKLSAgICAgIHNlcnZlcnNfW3BhaXJfaWRdLlRpbWVyVGljaygpOwotICAgIH0KLSAgICBBU1NFUlRfRVEodmFsaWRhdGVkX2NsaWVudF9wYWNrZXRzX1twYWlyX2lkXSwgdmFsaWRhdGVkX3BhY2tldHMgKyAxKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdWludDE2X3QgcGFja2V0X2lkX3sxfTsKLSAgQXN5bmNNYW5hZ2VyIGFzeW5jX21hbmFnZXJfOwotICBpbnQgc29ja2V0X2ZkXzsKLSAgc3RkOjp2ZWN0b3I8TGlua0xheWVyU29ja2V0RGV2aWNlPiBzZXJ2ZXJzXzsKLSAgc3RkOjp2ZWN0b3I8TGlua0xheWVyU29ja2V0RGV2aWNlPiBjbGllbnRzXzsKLSAgdWludDE2X3Qgc2VydmVyX29wY29kZXNfW2tNYXhDb25uZWN0aW9uc117MH07Ci0gIHVpbnQxNl90IGNsaWVudF9vcGNvZGVzX1trTWF4Q29ubmVjdGlvbnNdezB9OwotICBzaXplX3QgdmFsaWRhdGVkX3NlcnZlcl9wYWNrZXRzX1trTWF4Q29ubmVjdGlvbnNdezB9OwotICBzaXplX3QgdmFsaWRhdGVkX2NsaWVudF9wYWNrZXRzX1trTWF4Q29ubmVjdGlvbnNdezB9OwotICBBZGRyZXNzIHNvdXJjZV97ezEsIDIsIDMsIDQsIDUsIDZ9fTsKLSAgQWRkcmVzcyBkZXN0X3t7NiwgNSwgNCwgMywgMiwgMX19OwotfTsKLQotVEVTVF9GKExpbmtMYXllclNvY2tldERldmljZVRlc3QsIFRlc3RDbGllbnRGaXJzdCkgewotICBzaXplX3QgcGFpcl9pZCA9IENyZWF0ZUNvbm5lY3Rpb24oKTsKLSAgQVNTRVJUX0VRKHBhaXJfaWQsIDB1KTsKLSAgVmFsaWRhdGVDb25uZWN0aW9uKHBhaXJfaWQpOwotCi0gIFNlbmRGcm9tQ2xpZW50KHBhaXJfaWQpOwotICBSZWFkRnJvbVNlcnZlcihwYWlyX2lkKTsKLX0KLQotVEVTVF9GKExpbmtMYXllclNvY2tldERldmljZVRlc3QsIFRlc3RTZXJ2ZXJGaXJzdCkgewotICBzaXplX3QgcGFpcl9pZCA9IENyZWF0ZUNvbm5lY3Rpb24oKTsKLSAgQVNTRVJUX0VRKHBhaXJfaWQsIDB1KTsKLQotICBTZW5kRnJvbVNlcnZlcihwYWlyX2lkKTsKLSAgUmVhZEZyb21DbGllbnQocGFpcl9pZCk7Ci19Ci0KLVRFU1RfRihMaW5rTGF5ZXJTb2NrZXREZXZpY2VUZXN0LCBUZXN0TXVsdGlwbGVQYWNrZXRzKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgbnVtX3BhY2tldHMgPSAzMDsKLSAgc2l6ZV90IHBhaXJfaWQgPSBDcmVhdGVDb25uZWN0aW9uKCk7Ci0gIEFTU0VSVF9FUShwYWlyX2lkLCAwdSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3BhY2tldHM7IGkrKykgewotICAgIFNlbmRGcm9tQ2xpZW50KHBhaXJfaWQpOwotICAgIFNlbmRGcm9tU2VydmVyKHBhaXJfaWQpOwotICAgIFJlYWRGcm9tU2VydmVyKHBhaXJfaWQpOwotICAgIFJlYWRGcm9tQ2xpZW50KHBhaXJfaWQpOwotICB9Ci19Ci0KLVRFU1RfRihMaW5rTGF5ZXJTb2NrZXREZXZpY2VUZXN0LCBUZXN0TXVsdGlwbGVDb25uZWN0aW9uc0Zyb21TZXJ2ZXIpIHsKLSAgc3RhdGljIHNpemVfdCBsYXN0X3BhaXJfaWQgPSAtMTsKLSAgc2l6ZV90IHBhaXJfaWQ7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heENvbm5lY3Rpb25zOyBpKyspIHsKLSAgICBwYWlyX2lkID0gQ3JlYXRlQ29ubmVjdGlvbigpOwotICAgIEFTU0VSVF9FUShwYWlyX2lkLCBsYXN0X3BhaXJfaWQgKyAxKTsKLSAgICBsYXN0X3BhaXJfaWQgPSBwYWlyX2lkOwotICAgIFNlbmRGcm9tU2VydmVyKHBhaXJfaWQpOwotICAgIFJlYWRGcm9tQ2xpZW50KHBhaXJfaWQpOwotICB9Ci19Ci0KLVRFU1RfRihMaW5rTGF5ZXJTb2NrZXREZXZpY2VUZXN0LCBUZXN0TXVsdGlwbGVDb25uZWN0aW9uc0Zyb21DbGllbnQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4Q29ubmVjdGlvbnM7IGkrKykgewotICAgIHNpemVfdCBwYWlyX2lkID0gQ3JlYXRlQ29ubmVjdGlvbigpOwotICAgIEFTU0VSVF9FUShwYWlyX2lkLCBpKTsKLSAgICBTZW5kRnJvbUNsaWVudChwYWlyX2lkKTsKLSAgICBSZWFkRnJvbVNlcnZlcihwYWlyX2lkKTsKLSAgfQotfQotCi1URVNUX0YoTGlua0xheWVyU29ja2V0RGV2aWNlVGVzdCwgVGVzdE11bHRpcGxlQ29ubmVjdGlvbnMpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4Q29ubmVjdGlvbnM7IGkrKykgewotICAgIHNpemVfdCBwYWlyX2lkID0gQ3JlYXRlQ29ubmVjdGlvbigpOwotICAgIEFTU0VSVF9FUShwYWlyX2lkLCBpKTsKLSAgICBTZW5kRnJvbUNsaWVudChwYWlyX2lkKTsKLSAgICBTZW5kRnJvbVNlcnZlcihwYWlyX2lkKTsKLSAgICBSZWFkRnJvbUNsaWVudChwYWlyX2lkKTsKLSAgICBSZWFkRnJvbVNlcnZlcihwYWlyX2lkKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9wYWNrZXRfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3Rlc3QvcGFja2V0X3N0cmVhbV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyZDc2Ny4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9wYWNrZXRfc3RyZWFtX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlICJwYWNrZXRfc3RyZWFtLmgiCi0jaW5jbHVkZSAiY29tbWFuZF9wYWNrZXQuaCIKLSNpbmNsdWRlICJldmVudF9wYWNrZXQuaCIKLSNpbmNsdWRlICJwYWNrZXQuaCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLSNpbmNsdWRlICJoY2kvaW5jbHVkZS9oY2lfaGFsLmgiCi0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBjaGFyIHNtYWxsX3BheWxvYWRbXSA9ICJmb28gYmFyIGJheiI7Ci1jb25zdCBjaGFyIGxhcmdlX3BheWxvYWRbXSA9Ci0gICAgIkFyaXN0b3RsZSdzIHByaW5jaXBsZXMgd2lsbCB0aGVuIGJlIG5vIG1vcmUgcHJpbmNpcGxlcyB0byBoaW0sIHRoYW4gdGhvc2UgIgotICAgICJvZiBFcGljdXJ1cyBhbmQgdGhlIFN0b2ljczogbGV0IHRoaXMgZGl2ZXJzaXR5IG9mIG9waW5pb25zIGJlIHByb3BvdW5kZWQgIgotICAgICJ0bywgYW5kIGxhaWQgYmVmb3JlIGhpbTsgaGUgd2lsbCBoaW1zZWxmIGNob29zZSwgaWYgaGUgYmUgYWJsZTsgaWYgbm90LCAiCi0gICAgImhlIHdpbGwgcmVtYWluIGluIGRvdWJ0LiI7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIHRlc3RfdmVuZG9yX2xpYiB7Ci0KLWNsYXNzIFBhY2tldFN0cmVhbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIFBhY2tldFN0cmVhbVRlc3QoKSB7Ci0gICAgc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHNvY2tldHBhaXJfZmRzXyk7Ci0gICAgQ2hlY2tTb2NrZXRwYWlySW5pdCgpOwotICB9Ci0KLSAgflBhY2tldFN0cmVhbVRlc3QoKSBvdmVycmlkZSB7Ci0gICAgY2xvc2Uoc29ja2V0cGFpcl9mZHNfWzBdKTsKLSAgICBjbG9zZShzb2NrZXRwYWlyX2Zkc19bMV0pOwotICB9Ci0KLSAgdm9pZCBDaGVja2VkUmVjZWl2ZUNvbW1hbmQoY29uc3QgY2hhciogcGF5bG9hZCwgdWludDE2X3Qgb3Bjb2RlKSB7Ci0gICAgdWludDhfdCBwYXlsb2FkX3NpemUgPSBzdHJsZW4ocGF5bG9hZCk7Ci0gICAgdmVjdG9yPHVpbnQ4X3Q+IHBhY2tldDsKLQotICAgIHBhY2tldC5wdXNoX2JhY2soREFUQV9UWVBFX0NPTU1BTkQpOwotICAgIHBhY2tldC5wdXNoX2JhY2sob3Bjb2RlKTsKLSAgICBwYWNrZXQucHVzaF9iYWNrKG9wY29kZSA+PiA4KTsKLSAgICBwYWNrZXQucHVzaF9iYWNrKHBheWxvYWRfc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIHBhY2tldCdzIHBheWxvYWQuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXlsb2FkX3NpemU7ICsraSkgcGFja2V0LnB1c2hfYmFjayhwYXlsb2FkW2ldKTsKLQotICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB8cGFja2V0X3N0cmVhbV98LgotICAgIHdyaXRlKHNvY2tldHBhaXJfZmRzX1sxXSwgJnBhY2tldFsxXSwgcGFja2V0LnNpemUoKSk7Ci0KLSAgICAvLyBSZWFkIHRoZSBjb21tYW5kIHBhY2tldC4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFBhY2tldD4gY29tbWFuZCA9IHBhY2tldF9zdHJlYW1fLlJlY2VpdmVDb21tYW5kKHNvY2tldHBhaXJfZmRzX1swXSk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dWludDhfdD4gcmVjZWl2ZWRfcGF5bG9hZCA9IGNvbW1hbmQtPkdldFBheWxvYWQoKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBwYWNrZXQgYnkgY2hlY2tpbmcgdGhhdCBpdCdzIHRoZSBhcHByb3ByaWF0ZSBzaXplIGFuZCB0aGVuCi0gICAgLy8gY2hlY2tpbmcgZWFjaCBieXRlLgotICAgIEVYUEVDVF9FUShwYWNrZXQuc2l6ZSgpLCBjb21tYW5kLT5HZXRQYWNrZXRTaXplKCkpOwotICAgIEVYUEVDVF9FUShEQVRBX1RZUEVfQ09NTUFORCwgY29tbWFuZC0+R2V0VHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEob3Bjb2RlLCBjb21tYW5kLT5HZXRPcGNvZGUoKSk7Ci0gICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4ocGF5bG9hZF9zaXplICsgMSksIGNvbW1hbmQtPkdldFBheWxvYWRTaXplKCkpOwotICAgIEVYUEVDVF9FUShwYXlsb2FkX3NpemUsIHJlY2VpdmVkX3BheWxvYWRbMF0pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF5bG9hZF9zaXplOyArK2kpIEVYUEVDVF9FUShwYWNrZXRbNCArIGldLCByZWNlaXZlZF9wYXlsb2FkW2kgKyAxXSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgUGFja2V0U3RyZWFtIHBhY2tldF9zdHJlYW1fOwotCi0gIGludCBzb2NrZXRwYWlyX2Zkc19bMl07Ci0KLSBwcml2YXRlOgotICAvLyBXb3JrYXJvdW5kIGJlY2F1c2UgQVNTRVJUIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5IGluIGEgY29uc3RydWN0b3IKLSAgdm9pZCBDaGVja1NvY2tldHBhaXJJbml0KCkgewotICAgIEFTU0VSVF9UUlVFKHNvY2tldHBhaXJfZmRzX1swXSA+IDApOwotICAgIEFTU0VSVF9UUlVFKHNvY2tldHBhaXJfZmRzX1sxXSA+IDApOwotICB9Ci19OwotCi1URVNUX0YoUGFja2V0U3RyZWFtVGVzdCwgUmVjZWl2ZVBhY2tldFR5cGUpIHsKLSAgc2VyaWFsX2RhdGFfdHlwZV90IGNvbW1hbmRfdHlwZSA9IERBVEFfVFlQRV9DT01NQU5EOwotICB3cml0ZShzb2NrZXRwYWlyX2Zkc19bMV0sICZjb21tYW5kX3R5cGUsIDEpOwotICBFWFBFQ1RfRVEoY29tbWFuZF90eXBlLCBwYWNrZXRfc3RyZWFtXy5SZWNlaXZlUGFja2V0VHlwZShzb2NrZXRwYWlyX2Zkc19bMF0pKTsKLX0KLQotVEVTVF9GKFBhY2tldFN0cmVhbVRlc3QsIFJlY2VpdmVFbXB0eUNvbW1hbmQpIHsKLSAgQ2hlY2tlZFJlY2VpdmVDb21tYW5kKCIiLCBIQ0lfUkVTRVQpOwotfQotCi1URVNUX0YoUGFja2V0U3RyZWFtVGVzdCwgUmVjZWl2ZVNtYWxsQ29tbWFuZCkgewotICBDaGVja2VkUmVjZWl2ZUNvbW1hbmQoc21hbGxfcGF5bG9hZCwgSENJX1JFU0VUKTsKLX0KLQotVEVTVF9GKFBhY2tldFN0cmVhbVRlc3QsIFJlY2VpdmVMYXJnZUNvbW1hbmQpIHsKLSAgQ2hlY2tlZFJlY2VpdmVDb21tYW5kKGxhcmdlX3BheWxvYWQsIEhDSV9SRVNFVCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L3Bvc2l4X3NvY2tldF91bml0dGVzdC5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L3Bvc2l4X3NvY2tldF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZmVhNy4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9wb3NpeF9zb2NrZXRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotCi0vLyBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8cmFuZG9tPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIm1vZGVsL3NldHVwL2FzeW5jX21hbmFnZXIuaCIKLSNpbmNsdWRlICJuZXQvcG9zaXgvcG9zaXhfYXN5bmNfc29ja2V0X2Nvbm5lY3Rvci5oIgotI2luY2x1ZGUgIm5ldC9wb3NpeC9wb3NpeF9hc3luY19zb2NrZXRfc2VydmVyLmgiCi0jaW5jbHVkZSAib3MvbG9nLmgiICAvLyBmb3IgTE9HX0lORk8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG5ldCB7Ci0KLXVzaW5nIGNsb2NrID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazsKLQotY2xhc3MgU2lnUGlwZVNpZ25hbEhhbmRsZXIgewotIHB1YmxpYzoKLSAgU2lnUGlwZVNpZ25hbEhhbmRsZXIoKSB7Ci0gICAgc1NpZ25hbCA9IC0xOwotICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0ID0ge307Ci0gICAgYWN0LnNhX2hhbmRsZXIgPSBteUhhbmRsZXI7Ci0gICAgOjpzaWdhY3Rpb24oU0lHUElQRSwgJmFjdCwgJm1PbGRBY3Rpb24pOwotICB9Ci0KLSAgflNpZ1BpcGVTaWduYWxIYW5kbGVyKCkgeyA6OnNpZ2FjdGlvbihTSUdQSVBFLCAmbU9sZEFjdGlvbiwgbnVsbHB0cik7IH0KLQotICBpbnQgc2lnbmFsZWQoKSBjb25zdCB7IHJldHVybiBzU2lnbmFsOyB9Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3Qgc2lnYWN0aW9uIG1PbGRBY3Rpb247Ci0KLSAgc3RhdGljIGludCBzU2lnbmFsOwotCi0gIHN0YXRpYyB2b2lkIG15SGFuZGxlcihpbnQgc2lnKSB7IHNTaWduYWwgPSBzaWc7IH0KLX07Ci0KLS8vIHN0YXRpYwotaW50IFNpZ1BpcGVTaWduYWxIYW5kbGVyOjpzU2lnbmFsID0gMDsKLQotdXNpbmcgU29ja2V0Q29uID0gc3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+OwotCi1jbGFzcyBQb3NpeFNvY2tldFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBQb3NpeFNvY2tldFRlc3QoKSA6IHBhc2NfKCZhc3luY19tYW5hZ2VyXyksIHBhc3NfKDAsICZhc3luY19tYW5hZ2VyXykge30KLQotICB+UG9zaXhTb2NrZXRUZXN0KCkgeyBwYXNzXy5DbG9zZSgpOyB9Ci0KLSAgc3RkOjp0dXBsZTxTb2NrZXRDb24sIFNvY2tldENvbj4gY29ubmVjdFBhaXIoCi0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQgPSA1MDBtcykgewotICAgIHN0ZDo6bXV0ZXggbTsKLSAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrMTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29jazI7Ci0KLSAgICBwYXNzXy5TZXRPbkNvbm5lY3RDYWxsYmFjaygKLSAgICAgICAgWyZdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY0RhdGFDaGFubmVsPiBzb2NrLCBBc3luY0RhdGFDaGFubmVsU2VydmVyKikgewotICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gZ3VhcmQobSk7Ci0gICAgICAgICAgc29jazEgPSBzb2NrOwotICAgICAgICAgIGN2Lm5vdGlmeV9hbGwoKTsKLSAgICAgICAgfSk7Ci0gICAgRVhQRUNUX1RSVUUocGFzc18uU3RhcnRMaXN0ZW5pbmcoKSk7Ci0KLSAgICBzb2NrMiA9IHBhc2NfLkNvbm5lY3RUb1JlbW90ZVNlcnZlcigibG9jYWxob3N0IiwgcGFzc18ucG9ydCgpLCAxMDAwbXMpOwotICAgIEVYUEVDVF9UUlVFKHNvY2syLmdldCgpICE9IG51bGxwdHIpOwotICAgIEVYUEVDVF9UUlVFKHNvY2syLT5Db25uZWN0ZWQoKSk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKG0pOwotICAgIEVYUEVDVF9UUlVFKAotICAgICAgICBjdi53YWl0X2ZvcihsaywgdGltZW91dCwgWyZdIHsgcmV0dXJuIHNvY2sxLmdldCgpICE9IG51bGxwdHI7IH0pKTsKLSAgICBFWFBFQ1RfVFJVRShzb2NrMSk7Ci0gICAgRVhQRUNUX1RSVUUoc29jazEtPkNvbm5lY3RlZCgpKTsKLQotICAgIHJldHVybiB7c29jazEsIHNvY2syfTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBBc3luY01hbmFnZXIgYXN5bmNfbWFuYWdlcl87Ci0gIFBvc2l4QXN5bmNTb2NrZXRDb25uZWN0b3IgcGFzY187Ci0gIFBvc2l4QXN5bmNTb2NrZXRTZXJ2ZXIgcGFzc187Ci19OwotCi1URVNUX0YoUG9zaXhTb2NrZXRUZXN0LCBjYW5Db25uZWN0KSB7Ci0gIGF1dG8gW3NvY2sxLCBzb2NrMl0gPSBjb25uZWN0UGFpcigpOwotICBBU1NFUlRfVFJVRShzb2NrMS0+Q29ubmVjdGVkKCkpOwotICBBU1NFUlRfVFJVRShzb2NrMi0+Q29ubmVjdGVkKCkpOwotCi0gIHNvY2sxLT5DbG9zZSgpOwotICBzb2NrMi0+Q2xvc2UoKTsKLQotICBBU1NFUlRfRkFMU0Uoc29jazEtPkNvbm5lY3RlZCgpKTsKLSAgQVNTRVJUX0ZBTFNFKHNvY2syLT5Db25uZWN0ZWQoKSk7Ci19Ci0KLVRFU1RfRihQb3NpeFNvY2tldFRlc3QsIHNvY2tldFNlbmREb2VzTm90R2VuZXJhdGVTaWdQaXBlKSB7Ci0gIC8vIENoZWNrIHRoYXQgd3JpdGluZyB0byBhIGJyb2tlbiBwaXBlIGRvZXMgbm90IGdlbmVyYXRlIGEgU0lHUElQRQotICAvLyBzaWduYWwuCi0gIFNpZ1BpcGVTaWduYWxIYW5kbGVyIGhhbmRsZXI7Ci0gIEFTU0VSVF9FUSgtMSwgaGFuZGxlci5zaWduYWxlZCgpKTsKLSAgYXV0byBbc29jazEsIHNvY2syXSA9IGNvbm5lY3RQYWlyKCk7Ci0KLSAgLy8gczEgYW5kIHMyIGFyZSBub3cgY29ubmVjdGVkLiBDbG9zZSBzMSBpbW1lZGlhdGVseSwgdGhlbiB0cnkgdG8KLSAgLy8gc2VuZCBkYXRhIHRocm91Z2ggczIuCi0gIHNvY2sxLT5DbG9zZSgpOwotICBBU1NFUlRfRkFMU0Uoc29jazEtPkNvbm5lY3RlZCgpKTsKLSAgLy8gVGhlIEVQSVBFIG1pZ2h0IG5vdCBoYXBwZW4gb24gdGhlIGZpcnN0IHNlbmQgZHVlIHRvCi0gIC8vIFRDUCBwYWNrZXQgYnVmZmVyaW5nIGluIHRoZSBrZXJuZWwuIFBlcmZvcm0gbXVsdGlwbGUgc2VuZCgpCi0gIC8vIGluIGEgbG9vcCB0byB3b3JrLWFyb3VuZCB0aGlzLgotICBlcnJubyA9IDA7Ci0gIGNvbnN0IGludCBrTWF4U2VuZENvdW50ID0gMTAwMDsKLSAgaW50IG4gPSAwOwotICB3aGlsZSAobiA8IGtNYXhTZW5kQ291bnQpIHsKLSAgICBpbnQgcmV0ID0gc29jazItPlNlbmQoKHVpbnQ4X3QqKSJ4eHh4IiwgNCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSNpZmRlZiBfX0FQUExFX18KLSAgICAgIC8vIE9uIE9TIFgsIGVycm5vIGlzIHNvbWV0aW1lcyBFUFJPVE9UWVBFIGluc3RlYWQgb2YgRVBJUEUKLSAgICAgIC8vIHdoZW4gdGhpcyBoYXBwZW5zLgotICAgICAgQVNTRVJUX1RSVUUoZXJybm8gPT0gRVBJUEUgfHwgZXJybm8gPT0gRVBST1RPVFlQRSkgPDwgc3RyZXJyb3IoZXJybm8pOwotI2Vsc2UKLSAgICAgIEFTU0VSVF9FUShFUElQRSwgZXJybm8pIDw8IHN0cmVycm9yKGVycm5vKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG4rKzsKLSAgfQotCi0gIC8vIE9uIE1hY09TIHlvdSB1c3VhbGx5IGhhdmUgbiA8IDMwCi0gIEFTU0VSVF9MVChuLCBrTWF4U2VuZENvdW50KTsKLQotICAvLyBObyBzaWduYWxzIHdlcmUgcmFpc2VkLgotICBBU1NFUlRfRVEoLTEsIGhhbmRsZXIuc2lnbmFsZWQoKSk7Ci19Ci0KLVRFU1RfRihQb3NpeFNvY2tldFRlc3QsIGNhbl9zZW5kX2RhdGFfYXJvdW5kX3BvbGwpIHsKLSAgYXV0byBbc29jazEsIHNvY2syXSA9IGNvbm5lY3RQYWlyKCk7Ci0gIHN0ZDo6c3RyaW5nIHdvcmQgPSAiSGVsbG8gV29ybGQiOwotICBzdGQ6OnN0cmluZyBpbnB1dCA9ICIgICAgICAgICAgICI7Ci0KLSAgQVNTRVJUX0VRKHdvcmQuc2l6ZSgpLCBpbnB1dC5zaXplKCkpOwotICBBU1NFUlRfTkUod29yZCwgaW5wdXQpOwotCi0gIHNzaXplX3Qgc25kID0gc29jazEtPlNlbmQoKHVpbnQ4X3QqKXdvcmQuZGF0YSgpLCB3b3JkLnNpemUoKSk7Ci0gIEFTU0VSVF9FUSgoc3NpemVfdCl3b3JkLnNpemUoKSwgc25kKTsKLQotICB1aW50OF90KiBidWZmZXIgPSAodWludDhfdCopaW5wdXQuZGF0YSgpOwotICBpbnQgYnVmbGVuID0gaW5wdXQuc2l6ZSgpOwotCi0gIC8vIFBvbGwgZm9yIGF0IG1vc3QgMjUwbXMuCi0gIGNsb2NrOjp0aW1lX3BvaW50IHVudGlsID0gY2xvY2s6Om5vdygpICsgMjUwbXM7Ci0gIGRvIHsKLSAgICBpbnQgcmVjdiA9IHNvY2syLT5SZWN2KGJ1ZmZlciwgYnVmbGVuKTsKLSAgICBpZiAocmVjdiA+IDApIHsKLSAgICAgIGJ1ZmxlbiAtPSByZWN2OwotICAgICAgYnVmZmVyICs9IHJlY3Y7Ci0gICAgfQotICB9IHdoaWxlIChidWZsZW4gPiAwICYmIGNsb2NrOjpub3coKSA8IHVudGlsKTsKLQotICBBU1NFUlRfRVEod29yZCwgaW5wdXQpOwotfQotCi1URVNUX0YoUG9zaXhTb2NrZXRUZXN0LCBkYXRhX3Jlc3VsdHNfaW5fcmVhZF9ldmVudCkgewotICBhdXRvIFtzb2NrMSwgc29jazJdID0gY29ubmVjdFBhaXIoKTsKLSAgc3RkOjptdXRleCBtOwotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKLSAgc3RkOjpzdHJpbmcgd29yZCA9ICJIZWxsbyBXb3JsZCI7Ci0gIHN0ZDo6c3RyaW5nIGlucHV0ID0gIiAgICAgICAgICAgIjsKLQotICBib29sIHJlY2VpdmVkID0gZmFsc2U7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0aGF0IG9ubHkgZ2V0cyBjYWxsZWQgb25jZS4uCi0gIHNvY2syLT5XYXRjaEZvck5vbkJsb2NraW5nUmVhZChbJl0oYXV0byBzb2NrKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChtKTsKLSAgICByZWNlaXZlZCA9IHRydWU7Ci0gICAgLy8gVW5yZWdpc3RlciwgdG8gcHJldmVudCBzdXJwcmlzZXMuLgotICAgIHNvY2stPlN0b3BXYXRjaGluZygpOwotICAgIGN2Lm5vdGlmeV9hbGwoKTsKLSAgfSk7Ci0KLSAgc3NpemVfdCBzbmQgPSBzb2NrMS0+U2VuZCgodWludDhfdCopd29yZC5kYXRhKCksIHdvcmQuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKChzc2l6ZV90KXdvcmQuc2l6ZSgpLCBzbmQpOwotCi0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKG0pOwotCi0gICAgLy8gVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGhpbiAyNTBtcy4KLSAgICBBU1NFUlRfVFJVRShjdi53YWl0X2ZvcihsaywgMjUwbXMsIFsmXSB7IHJldHVybiByZWNlaXZlZDsgfSkpOwotCi0gICAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKWlucHV0LmRhdGEoKTsKLSAgICBpbnQgYnVmbGVuID0gaW5wdXQuc2l6ZSgpOwotCi0gICAgLy8gQXQgbGVhc3QgMSBieXRlIGlzIGNvbWluZyBpbi4gKE5vdGUsIHdlIG1pZ2h0IGdldCBqdXN0IGEgZmV3Ci0gICAgLy8gYnl0ZXMuIHZzIHRoZSB3aG9sZSB0aGluZyBhcyB5b3UgbmV2ZXIga25vdyB3aGF0IGhhcHBlbnMgaW4gdGhlCi0gICAgLy8gaXAgc3RhY2suKQotICAgIEFTU0VSVF9HVChzb2NrMi0+UmVjdihidWZmZXIsIGJ1ZmxlbiksIDApOwotICB9Ci19Ci0KLVRFU1RfRihQb3NpeFNvY2tldFRlc3QsIGNvbm5lY3RGYWlscykgewotICBpbnQgcG9ydCA9IHBhc3NfLnBvcnQoKTsKLQotICAvLyBDbG9zZSB0aGUgcG9ydCwgd2Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QKLSAgcGFzc18uQ2xvc2UoKTsKLSAgQVNTRVJUX0ZBTFNFKHBhc3NfLkNvbm5lY3RlZCgpKTsKLQotICAvLyBNYXggMjUwbXMgdG8gZ28gdG8gbm93aGVyZS4uLgotICBhdXRvIHNvY2tldCA9IHBhc2NfLkNvbm5lY3RUb1JlbW90ZVNlcnZlcigibG9jYWxob3N0IiwgcG9ydCwgMjUwbXMpOwotICBBU1NFUlRfRkFMU0Uoc29ja2V0LT5Db25uZWN0ZWQoKSk7Ci19Ci0KLVRFU1RfRihQb3NpeFNvY2tldFRlc3QsIGNhbkNvbm5lY3RNdWx0aXBsZSkgewotICBpbnQgcG9ydCA9IHBhc3NfLnBvcnQoKTsKLSAgaW50IENPTk5FQ1RJT05fQ09VTlQgPSAxMDsKLSAgc3RkOjptdXRleCBtOwotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+PiBjb25uZWN0aW9uczsKLSAgYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKLQotICBwYXNzXy5TZXRPbkNvbm5lY3RDYWxsYmFjaygKLSAgICAgIFsmXShzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29jaywgQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciopIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChtKTsKLSAgICAgICAgY29ubmVjdGlvbnMucHVzaF9iYWNrKHNvY2spOwotICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICBBU1NFUlRfVFJVRShwYXNzXy5TdGFydExpc3RlbmluZygpKTsKLSAgICAgICAgY3Yubm90aWZ5X2FsbCgpOwotICAgICAgfSk7Ci0gIEFTU0VSVF9UUlVFKHBhc3NfLlN0YXJ0TGlzdGVuaW5nKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgQ09OTkVDVElPTl9DT1VOVDsgaSsrKSB7Ci0gICAgY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgYXV0byBzb2NrZXQgPSBwYXNjXy5Db25uZWN0VG9SZW1vdGVTZXJ2ZXIoImxvY2FsaG9zdCIsIHBvcnQsIDI1MG1zKTsKLSAgICBBU1NFUlRfVFJVRShzb2NrZXQtPkNvbm5lY3RlZCgpKTsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKG0pOwotICAgIEFTU0VSVF9UUlVFKGN2LndhaXRfZm9yKGxrLCAyNTBtcywgWyZdIHsgcmV0dXJuIGNvbm5lY3RlZDsgfSkpOwotICAgIGNvbm5lY3RlZCA9IGZhbHNlOwotICB9Ci0KLSAgQVNTRVJUX0VRKENPTk5FQ1RJT05fQ09VTlQsIChpbnQpY29ubmVjdGlvbnMuc2l6ZSgpKTsKLX0KLQotVEVTVF9GKFBvc2l4U29ja2V0VGVzdCwgbm9Db25uZWN0V2hlbk5vdENhbGxpbmdTdGFydCkgewotICBpbnQgcG9ydCA9IHBhc3NfLnBvcnQoKTsKLSAgc3RkOjptdXRleCBtOwotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFzeW5jRGF0YUNoYW5uZWw+PiBjb25uZWN0aW9uczsKLSAgYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKLQotICBwYXNzXy5TZXRPbkNvbm5lY3RDYWxsYmFjaygKLSAgICAgIFsmXShzdGQ6OnNoYXJlZF9wdHI8QXN5bmNEYXRhQ2hhbm5lbD4gc29jaywgQXN5bmNEYXRhQ2hhbm5lbFNlcnZlciopIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBndWFyZChtKTsKLSAgICAgICAgY29ubmVjdGlvbnMucHVzaF9iYWNrKHNvY2spOwotICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICBjdi5ub3RpZnlfYWxsKCk7Ci0gICAgICB9KTsKLSAgQVNTRVJUX1RSVUUocGFzc18uU3RhcnRMaXN0ZW5pbmcoKSk7Ci0KLSAgewotICAgIGNvbm5lY3RlZCA9IGZhbHNlOwotICAgIGF1dG8gc29ja2V0ID0gcGFzY18uQ29ubmVjdFRvUmVtb3RlU2VydmVyKCJsb2NhbGhvc3QiLCBwb3J0LCAyNTBtcyk7Ci0gICAgQVNTRVJUX1RSVUUoc29ja2V0LT5Db25uZWN0ZWQoKSk7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhtKTsKLSAgICBBU1NFUlRfVFJVRShjdi53YWl0X2ZvcihsaywgMjUwbXMsIFsmXSB7IHJldHVybiBjb25uZWN0ZWQ7IH0pKTsKLSAgfQotCi0gIC8vIEFmdGVyIHRoZSBmaXJzdCBjb25uZWN0aW9uIHRoZXJlIHdhcyBubyBjYWxsIHRvIHN0YXJ0TGlzdGVuaW5nLCBhbmQgaGVuY2UKLSAgLy8gbm8gbmV3IHNvY2tldHMgc2hvdWxkIGJlIGFjY2VwdGVkLgotICB7Ci0gICAgY29ubmVjdGVkID0gZmFsc2U7Ci0gICAgYXV0byBzb2NrZXQgPSBwYXNjXy5Db25uZWN0VG9SZW1vdGVTZXJ2ZXIoImxvY2FsaG9zdCIsIHBvcnQsIDI1MG1zKTsKLQotICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcGFydGlhbCBjb25uZWN0aW9uLCBzbyB3ZSBkb24ndCBrbm93IHlldCB0aGF0IGl0IGlzIG5vdAotICAgIC8vIHdvcmtpbmcuLgotICAgIEFTU0VSVF9UUlVFKHNvY2tldC0+Q29ubmVjdGVkKCkpOwotICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbGsobSk7Ci0KLSAgICAvLyBTaG91bGQgdGltZW91dCwgYXMgd2UgbmV2ZXIgaW52b2tlIHRoZSBjYWxsYmFjayB0aGF0IGFjY2VwdHMgdGhlIHNvY2tldC4KLSAgICBBU1NFUlRfRkFMU0UoY3Yud2FpdF9mb3IobGssIDI1MG1zLCBbJl0geyByZXR1cm4gY29ubmVjdGVkOyB9KSk7Ci0gIH0KLQotICBBU1NFUlRfRVEoMSwgKGludCljb25uZWN0aW9ucy5zaXplKCkpOwotfQotfSAgLy8gbmFtZXNwYWNlIG5ldAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L3NlY3VyaXR5X21hbmFnZXJfdW5pdHRlc3QuY2MgYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdGVzdC9zZWN1cml0eV9tYW5hZ2VyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE5YzRmLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90ZXN0L3NlY3VyaXR5X21hbmFnZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgMjAxNyBHb29nbGUsIEluYy4KLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibW9kZWwvY29udHJvbGxlci9zZWN1cml0eV9tYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIHsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0QWRkcjEgPSAiMTI6MzQ6NTY6Nzg6OWE6YmMiOwotY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RBZGRyMiA9ICJjYjphOTo4Nzo2NTo0MzoyMSI7Ci1jb25zdCBzdGQ6OnN0cmluZyBrVGVzdEFkZHIzID0gImNiOmE5OjU2Ojc4OjlhOmJjIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0QWRkcjQgPSAiMTI6MzQ6NTY6Nzg6OWE6YmMiOwotY29uc3Qgc3RkOjphcnJheTx1aW50OF90LCAxNj4ga1Rlc3RLZXkgPSB7MHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkLCAweDBlLCAweDBmLCAweDEwfTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgdGVzdF92ZW5kb3JfbGliIHsKLQotY2xhc3MgU2VjdXJpdHlNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgU2VjdXJpdHlNYW5hZ2VyVGVzdCgpIHt9Ci0gIH5TZWN1cml0eU1hbmFnZXJUZXN0KCkgb3ZlcnJpZGUge30KLX07Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJUZXN0LCBXcml0ZUtleSkgewotICBBZGRyZXNzIGJ0YWRkcjE7Ci0gIEFkZHJlc3MgYnRhZGRyMjsKLSAgQWRkcmVzcyBidGFkZHIzOwotICBBZGRyZXNzIGJ0YWRkcjQ7Ci0gIFNlY3VyaXR5TWFuYWdlciBzbSgzKTsKLQotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjEsIGJ0YWRkcjEpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjIsIGJ0YWRkcjIpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjMsIGJ0YWRkcjMpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjQsIGJ0YWRkcjQpOwotCi0gIEVYUEVDVF9FUSgxLCBzbS5Xcml0ZUtleShidGFkZHIxLCBrVGVzdEtleSkpOwotICBFWFBFQ1RfRVEoMSwgc20uV3JpdGVLZXkoYnRhZGRyMiwga1Rlc3RLZXkpKTsKLSAgRVhQRUNUX0VRKDEsIHNtLldyaXRlS2V5KGJ0YWRkcjMsIGtUZXN0S2V5KSk7Ci0gIC8vIEtleSBzdG9yYWdlIGlzIGZ1bGwuCi0gIEVYUEVDVF9FUSgwLCBzbS5Xcml0ZUtleShidGFkZHI0LCBrVGVzdEtleSkpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyVGVzdCwgUmVhZEtleSkgewotICBBZGRyZXNzIGJ0YWRkcjE7Ci0gIEFkZHJlc3MgYnRhZGRyMjsKLSAgQWRkcmVzcyBidGFkZHIzOwotICBTZWN1cml0eU1hbmFnZXIgc20oMyk7Ci0KLSAgQWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIxLCBidGFkZHIxKTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIyLCBidGFkZHIyKTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIzLCBidGFkZHIzKTsKLQotICBzbS5Xcml0ZUtleShidGFkZHIxLCBrVGVzdEtleSk7Ci0gIHNtLldyaXRlS2V5KGJ0YWRkcjIsIGtUZXN0S2V5KTsKLQotICBFWFBFQ1RfRVEoMSwgc20uUmVhZEtleShidGFkZHIxKSk7Ci0gIEVYUEVDVF9FUSgxLCBzbS5SZWFkS2V5KGJ0YWRkcjIpKTsKLSAgRVhQRUNUX0VRKDAsIHNtLlJlYWRLZXkoYnRhZGRyMykpOwotfQotCi1URVNUX0YoU2VjdXJpdHlNYW5hZ2VyVGVzdCwgUmVhZEFsbEtleXMpIHsKLSAgQWRkcmVzcyBidGFkZHIxOwotICBBZGRyZXNzIGJ0YWRkcjI7Ci0gIFNlY3VyaXR5TWFuYWdlciBzbSgzKTsKLQotICBFWFBFQ1RfRVEoMCwgc20uUmVhZEFsbEtleXMoKSk7Ci0KLSAgQWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIxLCBidGFkZHIxKTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIyLCBidGFkZHIxKTsKLSAgQWRkcmVzczo6RnJvbVN0cmluZyhrVGVzdEFkZHIzLCBidGFkZHIxKTsKLQotICBzbS5Xcml0ZUtleShidGFkZHIxLCBrVGVzdEtleSk7Ci0KLSAgRVhQRUNUX0VRKDEsIHNtLlJlYWRBbGxLZXlzKCkpOwotCi0gIHNtLldyaXRlS2V5KGJ0YWRkcjIsIGtUZXN0S2V5KTsKLQotICBFWFBFQ1RfRVEoMiwgc20uUmVhZEFsbEtleXMoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJUZXN0LCBEZWxldGVLZXkpIHsKLSAgQWRkcmVzcyBidGFkZHIxOwotICBBZGRyZXNzIGJ0YWRkcjI7Ci0gIEFkZHJlc3MgYnRhZGRyMzsKLSAgU2VjdXJpdHlNYW5hZ2VyIHNtKDMpOwotCi0gIEFkZHJlc3M6OkZyb21TdHJpbmcoa1Rlc3RBZGRyMSwgYnRhZGRyMSk7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcoa1Rlc3RBZGRyMiwgYnRhZGRyMik7Ci0gIEFkZHJlc3M6OkZyb21TdHJpbmcoa1Rlc3RBZGRyMywgYnRhZGRyMyk7Ci0KLSAgRVhQRUNUX0VRKDAsIHNtLkRlbGV0ZUtleShidGFkZHIyKSk7Ci0KLSAgc20uV3JpdGVLZXkoYnRhZGRyMSwga1Rlc3RLZXkpOwotCi0gIEVYUEVDVF9FUSgxLCBzbS5SZWFkQWxsS2V5cygpKTsKLQotICBFWFBFQ1RfRVEoMSwgc20uRGVsZXRlS2V5KGJ0YWRkcjEpKTsKLQotICBFWFBFQ1RfRVEoMCwgc20uUmVhZEFsbEtleXMoKSk7Ci0KLSAgc20uV3JpdGVLZXkoYnRhZGRyMSwga1Rlc3RLZXkpOwotICBzbS5Xcml0ZUtleShidGFkZHIyLCBrVGVzdEtleSk7Ci0KLSAgRVhQRUNUX0VRKDIsIHNtLlJlYWRBbGxLZXlzKCkpOwotCi0gIEVYUEVDVF9FUSgxLCBzbS5EZWxldGVLZXkoYnRhZGRyMikpOwotCi0gIEVYUEVDVF9FUSgxLCBzbS5SZWFkQWxsS2V5cygpKTsKLQotICBFWFBFQ1RfRVEoMCwgc20uRGVsZXRlS2V5KGJ0YWRkcjIpKTsKLQotICBFWFBFQ1RfRVEoMSwgc20uUmVhZEFsbEtleXMoKSk7Ci19Ci0KLVRFU1RfRihTZWN1cml0eU1hbmFnZXJUZXN0LCBEZWxldGVBbGxLZXlzKSB7Ci0gIEFkZHJlc3MgYnRhZGRyMTsKLSAgQWRkcmVzcyBidGFkZHIyOwotICBBZGRyZXNzIGJ0YWRkcjM7Ci0gIFNlY3VyaXR5TWFuYWdlciBzbSgzKTsKLQotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjEsIGJ0YWRkcjEpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjIsIGJ0YWRkcjIpOwotICBBZGRyZXNzOjpGcm9tU3RyaW5nKGtUZXN0QWRkcjMsIGJ0YWRkcjMpOwotCi0gIEVYUEVDVF9FUSgwLCBzbS5EZWxldGVBbGxLZXlzKCkpOwotCi0gIHNtLldyaXRlS2V5KGJ0YWRkcjEsIGtUZXN0S2V5KTsKLQotICBFWFBFQ1RfRVEoMSwgc20uUmVhZEFsbEtleXMoKSk7Ci0KLSAgRVhQRUNUX0VRKDEsIHNtLkRlbGV0ZUFsbEtleXMoKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIHNtLlJlYWRBbGxLZXlzKCkpOwotCi0gIHNtLldyaXRlS2V5KGJ0YWRkcjEsIGtUZXN0S2V5KTsKLSAgc20uV3JpdGVLZXkoYnRhZGRyMiwga1Rlc3RLZXkpOwotCi0gIEVYUEVDVF9FUSgyLCBzbS5SZWFkQWxsS2V5cygpKTsKLQotICBFWFBFQ1RfRVEoMiwgc20uRGVsZXRlQWxsS2V5cygpKTsKLQotICBFWFBFQ1RfRVEoMCwgc20uUmVhZEFsbEtleXMoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0X3ZlbmRvcl9saWIKZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy9BbmRyb2lkLmJwIGIvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3R5cGVzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGFmMmEuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3R5cGVzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyBCbHVldG9vdGggdHlwZXMKLXBhY2thZ2UgewotICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLSAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKLSAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJzeXN0ZW1fYnRfbGljZW5zZSIKLSAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6Ci0gICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbInN5c3RlbV9idF9saWNlbnNlIl0sCi19Ci0KLWNjX2xpYnJhcnlfaGVhZGVycyB7Ci0gICAgbmFtZTogImxpYmJ0LXJvb3RjYW5hbC10eXBlcy1oZWFkZXIiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLi8iXSwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotfQotCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJ0LXJvb3RjYW5hbC10eXBlcyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBkZWZhdWx0czogWyJmbHVvcmlkZV90eXBlc19kZWZhdWx0cyJdLAotICAgIGNmbGFnczogWwotICAgICAgICAvKiB3ZSBleHBvcnQgYWxsIGNsYXNzZXMsIHNvIGNoYW5nZSBkZWZhdWx0IHZpc2liaWxpdHksIGluc3RlYWQgb2YgaGF2aW5nIEVYUE9SVF9TWU1CT0wgb24gZWFjaCBjbGFzcyovCi0gICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJibHVldG9vdGgvdXVpZC5jYyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJidC1yb290Y2FuYWwtdHlwZXMtaGVhZGVyIl0sCi0gICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJidC1yb290Y2FuYWwtdHlwZXMtaGVhZGVyIl0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJyb290Y2FuYWwtdGVzdF90eXBlcyIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCi0gICAgZGVmYXVsdHM6IFsiZmx1b3JpZGVfZGVmYXVsdHMiXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJ0ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjIiwKLSAgICBdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJidC1yb290Y2FuYWwtdHlwZXMiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdHlwZXMvQlVJTEQuZ24gYi92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdHlwZXMvQlVJTEQuZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZjdlMWUuLjAwMDAwMDAKLS0tIGEvdmVuZG9yX2xpYnMvdGVzdF92ZW5kb3JfbGliL3R5cGVzL0JVSUxELmduCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMTcgR29vZ2xlLCBJbmMuCi0jCi0jICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSMKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXN0YXRpY19saWJyYXJ5KCJ0eXBlcyIpIHsKLSAgY2ZsYWdzID0gWwotICAgICAiLWZ2aXNpYmlsaXR5PWRlZmF1bHQiLAotICBdCi0KLSAgc291cmNlcyA9IFsKLSAgICAiYmx1ZXRvb3RoL3V1aWQuY2MiLAotICAgICJsZV9hZGRyZXNzLmNjIiwKLSAgICAiYWRkcmVzcy5jYyIsCi0gIF0KLQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vYnQiLAotICBdCi0KLSAgY29uZmlncyArPSBbCi0gICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgXQotfQotCi1pZiAodXNlLnRlc3QpIHsKLSAgZXhlY3V0YWJsZSgidHlwZXNfdW5pdHRlc3RzIikgewotICAgIHNvdXJjZXMgPSBbCi0gICAgICAidGVzdC9hZGRyZXNzX3VuaXR0ZXN0LmNjIiwKLSAgICAgICJ0ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjIiwKLSAgICBdCi0KLSAgICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgICAiLy9idCIsCi0gICAgXQotCi0gICAgbGlicyA9IFsKLSAgICAgICJkbCIsCi0gICAgICAicHRocmVhZCIsCi0gICAgICAicmVzb2x2IiwKLSAgICAgICJydCIsCi0gICAgICAieiIsCi0gICAgXQotCi0gICAgZGVwcyA9IFsKLSAgICAgICIvL2J0L3R5cGVzIiwKLSAgICBdCi0KLSAgICBjb25maWdzICs9IFsKLSAgICAgICIvL2J0OmV4dGVybmFsX2dtb2NrX21haW4iLAotICAgICAgIi8vYnQ6dGFyZ2V0X2RlZmF1bHRzIiwKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy9ibHVldG9vdGgvdXVpZC5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy9ibHVldG9vdGgvdXVpZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxNDIwNi4uMDAwMDAwMAotLS0gYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdHlwZXMvYmx1ZXRvb3RoL3V1aWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ1dWlkLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxyYW5kb20+Ci0KLW5hbWVzcGFjZSBibHVldG9vdGggewotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihVdWlkKSA9PSAxNiwgIlV1aWQgbXVzdCBiZSAxNiBieXRlcyBsb25nISIpOwotCi11c2luZyBVVUlEMTI4Qml0ID0gVXVpZDo6VVVJRDEyOEJpdDsKLQotY29uc3QgVXVpZCBVdWlkOjprRW1wdHkgPSBVdWlkOjpGcm9tMTI4Qml0QkUoVVVJRDEyOEJpdHt7MHgwMH19KTsKLQotbmFtZXNwYWNlIHsKLWNvbnN0ZXhwciBVdWlkIGtCYXNlID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFVVSUQxMjhCaXR7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9fSk7Ci19ICAvLyBuYW1lc3BhY2UKLQotc2l6ZV90IFV1aWQ6OkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkgY29uc3QgewotICBpZiAobWVtY21wKHV1LmRhdGEoKSArIGtOdW1CeXRlczMyLCBrQmFzZS51dS5kYXRhKCkgKyBrTnVtQnl0ZXMzMiwga051bUJ5dGVzMTI4IC0ga051bUJ5dGVzMzIpICE9IDApIHsKLSAgICByZXR1cm4ga051bUJ5dGVzMTI4OwotICB9Ci0KLSAgaWYgKHV1WzBdID09IDAgJiYgdXVbMV0gPT0gMCkgcmV0dXJuIGtOdW1CeXRlczE2OwotCi0gIHJldHVybiBrTnVtQnl0ZXMzMjsKLX0KLQotYm9vbCBVdWlkOjpJczE2Qml0KCkgY29uc3QgewotICByZXR1cm4gR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSA9PSBrTnVtQnl0ZXMxNjsKLX0KLQotdWludDE2X3QgVXVpZDo6QXMxNkJpdCgpIGNvbnN0IHsKLSAgcmV0dXJuICgoKHVpbnQxNl90KXV1WzJdKSA8PCA4KSArIHV1WzNdOwotfQotCi11aW50MzJfdCBVdWlkOjpBczMyQml0KCkgY29uc3QgewotICByZXR1cm4gKCgodWludDMyX3QpdXVbMF0pIDw8IDI0KSArICgoKHVpbnQzMl90KXV1WzFdKSA8PCAxNikgKyAoKCh1aW50MzJfdCl1dVsyXSkgPDwgOCkgKyB1dVszXTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB1dWlkLCBib29sKiBpc192YWxpZCkgewotICBpZiAoaXNfdmFsaWQpICppc192YWxpZCA9IGZhbHNlOwotICBVdWlkIHJldCA9IGtCYXNlOwotCi0gIGlmICh1dWlkLmVtcHR5KCkpIHJldHVybiByZXQ7Ci0KLSAgdWludDhfdCogcCA9IHJldC51dS5kYXRhKCk7Ci0gIGlmICh1dWlkLnNpemUoKSA9PSBrU3RyaW5nMTI4Qml0TGVuKSB7Ci0gICAgaWYgKHV1aWRbOF0gIT0gJy0nIHx8IHV1aWRbMTNdICE9ICctJyB8fCB1dWlkWzE4XSAhPSAnLScgfHwgdXVpZFsyM10gIT0gJy0nKSB7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZih1dWlkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICIlMDJoaHglMDJoaHglMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4LSUwMmhoeCUwMmhoeCIKLSAgICAgICAgICAgICAgICAgICAgIi0lMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JW4iLAotICAgICAgICAgICAgICAgICAgICAmcFswXSwgJnBbMV0sICZwWzJdLCAmcFszXSwgJnBbNF0sICZwWzVdLCAmcFs2XSwgJnBbN10sICZwWzhdLCAmcFs5XSwgJnBbMTBdLCAmcFsxMV0sICZwWzEyXSwKLSAgICAgICAgICAgICAgICAgICAgJnBbMTNdLCAmcFsxNF0sICZwWzE1XSwgJmMpOwotICAgIGlmIChyYyAhPSAxNikgcmV0dXJuIHJldDsKLSAgICBpZiAoYyAhPSBrU3RyaW5nMTI4Qml0TGVuKSByZXR1cm4gcmV0OwotCi0gICAgaWYgKGlzX3ZhbGlkKSAqaXNfdmFsaWQgPSB0cnVlOwotICB9IGVsc2UgaWYgKHV1aWQuc2l6ZSgpID09IDgpIHsKLSAgICBpbnQgYzsKLSAgICBpbnQgcmMgPSBzc2NhbmYodXVpZC5jX3N0cigpLCAiJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JW4iLCAmcFswXSwgJnBbMV0sICZwWzJdLCAmcFszXSwgJmMpOwotICAgIGlmIChyYyAhPSA0KSByZXR1cm4gcmV0OwotICAgIGlmIChjICE9IDgpIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoaXNfdmFsaWQpICppc192YWxpZCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodXVpZC5zaXplKCkgPT0gNCkgewotICAgIGludCBjOwotICAgIGludCByYyA9IHNzY2FuZih1dWlkLmNfc3RyKCksICIlMDJoaHglMDJoaHglbiIsICZwWzJdLCAmcFszXSwgJmMpOwotICAgIGlmIChyYyAhPSAyKSByZXR1cm4gcmV0OwotICAgIGlmIChjICE9IDQpIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoaXNfdmFsaWQpICppc192YWxpZCA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi1VdWlkIFV1aWQ6OkZyb20xNkJpdCh1aW50MTZfdCB1dWlkMTYpIHsKLSAgVXVpZCB1ID0ga0Jhc2U7Ci0KLSAgdS51dVsyXSA9ICh1aW50OF90KSgoMHhGRjAwICYgdXVpZDE2KSA+PiA4KTsKLSAgdS51dVszXSA9ICh1aW50OF90KSgweDAwRkYgJiB1dWlkMTYpOwotICByZXR1cm4gdTsKLX0KLQotVXVpZCBVdWlkOjpGcm9tMzJCaXQodWludDMyX3QgdXVpZDMyKSB7Ci0gIFV1aWQgdSA9IGtCYXNlOwotCi0gIHUudXVbMF0gPSAodWludDhfdCkoKDB4RkYwMDAwMDAgJiB1dWlkMzIpID4+IDI0KTsKLSAgdS51dVsxXSA9ICh1aW50OF90KSgoMHgwMEZGMDAwMCAmIHV1aWQzMikgPj4gMTYpOwotICB1LnV1WzJdID0gKHVpbnQ4X3QpKCgweDAwMDBGRjAwICYgdXVpZDMyKSA+PiA4KTsKLSAgdS51dVszXSA9ICh1aW50OF90KSgweDAwMDAwMEZGICYgdXVpZDMyKTsKLSAgcmV0dXJuIHU7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTEyOEJpdEJFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpIHsKLSAgVVVJRDEyOEJpdCB0bXA7Ci0gIG1lbWNweSh0bXAuZGF0YSgpLCB1dWlkLCBrTnVtQnl0ZXMxMjgpOwotICByZXR1cm4gRnJvbTEyOEJpdEJFKHRtcCk7Ci19Ci0KLVV1aWQgVXVpZDo6RnJvbTEyOEJpdExFKGNvbnN0IFVVSUQxMjhCaXQmIHV1aWQpIHsKLSAgVXVpZCB1OwotICBzdGQ6OnJldmVyc2VfY29weSh1dWlkLmRhdGEoKSwgdXVpZC5kYXRhKCkgKyBrTnVtQnl0ZXMxMjgsIHUudXUuYmVnaW4oKSk7Ci0gIHJldHVybiB1OwotfQotCi1VdWlkIFV1aWQ6OkZyb20xMjhCaXRMRShjb25zdCB1aW50OF90KiB1dWlkKSB7Ci0gIFVVSUQxMjhCaXQgdG1wOwotICBtZW1jcHkodG1wLmRhdGEoKSwgdXVpZCwga051bUJ5dGVzMTI4KTsKLSAgcmV0dXJuIEZyb20xMjhCaXRMRSh0bXApOwotfQotCi1jb25zdCBVVUlEMTI4Qml0IFV1aWQ6OlRvMTI4Qml0TEUoKSBjb25zdCB7Ci0gIFVVSUQxMjhCaXQgbGU7Ci0gIHN0ZDo6cmV2ZXJzZV9jb3B5KHV1LmRhdGEoKSwgdXUuZGF0YSgpICsga051bUJ5dGVzMTI4LCBsZS5iZWdpbigpKTsKLSAgcmV0dXJuIGxlOwotfQotCi1jb25zdCBVVUlEMTI4Qml0JiBVdWlkOjpUbzEyOEJpdEJFKCkgY29uc3QgewotICByZXR1cm4gdXU7Ci19Ci0KLVV1aWQgVXVpZDo6R2V0UmFuZG9tKCkgewotICBVdWlkIHV1aWQ7Ci0gIHN0ZDo6aW5kZXBlbmRlbnRfYml0c19lbmdpbmU8c3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUsIDgsIHVuc2lnbmVkIGludD4KLSAgICAgIGVuZ2luZTsKLSAgc3RkOjpnZW5lcmF0ZShzdGQ6OmJlZ2luKHV1aWQudXUpLCBzdGQ6OmVuZCh1dWlkLnV1KSwgc3RkOjpyZWYoZW5naW5lKSk7Ci0gIHJldHVybiB1dWlkOwotfQotCi1ib29sIFV1aWQ6OklzRW1wdHkoKSBjb25zdCB7Ci0gIHJldHVybiAqdGhpcyA9PSBrRW1wdHk7Ci19Ci0KLWJvb2wgVXVpZDo6b3BlcmF0b3I8KGNvbnN0IFV1aWQmIHJocykgY29uc3QgewotICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSh1dS5iZWdpbigpLCB1dS5lbmQoKSwgcmhzLnV1LmJlZ2luKCksIHJocy51dS5lbmQoKSk7Ci19Ci0KLWJvb2wgVXVpZDo6b3BlcmF0b3I9PShjb25zdCBVdWlkJiByaHMpIGNvbnN0IHsKLSAgcmV0dXJuIHV1ID09IHJocy51dTsKLX0KLQotYm9vbCBVdWlkOjpvcGVyYXRvciE9KGNvbnN0IFV1aWQmIHJocykgY29uc3QgewotICByZXR1cm4gdXUgIT0gcmhzLnV1OwotfQotCi1zdGQ6OnN0cmluZyBVdWlkOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgY2hhciBidWZmZXJbMzddOwotCi0gIHNucHJpbnRmKAotICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLSAgICAgICIlMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICB1dVswXSwgdXVbMV0sIHV1WzJdLCB1dVszXSwgdXVbNF0sIHV1WzVdLCB1dVs2XSwgdXVbN10sIHV1WzhdLCB1dVs5XSwKLSAgICAgIHV1WzEwXSwgdXVbMTFdLCB1dVsxMl0sIHV1WzEzXSwgdXVbMTRdLCB1dVsxNV0pOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci19ICAvLyBuYW1lc3BhY2UgYmx1ZXRvb3RoCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdHlwZXMvYmx1ZXRvb3RoL3V1aWQuaCBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy9ibHVldG9vdGgvdXVpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEyY2Y0Li4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy9ibHVldG9vdGgvdXVpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPG9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYmx1ZXRvb3RoIHsKLQotLy8gVGhpcyBjbGFzcyBpcyByZXByZXNlbnRpbmcgQmx1ZXRvb3RoIFVVSURzIGFjcm9zcyB3aG9sZSBzdGFjay4KLS8vIEhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBlbmRpYW5uZXNzIHJ1bGVzOgotLy8gMS4gVVVJRCBpcyBpbnRlcm5hbGx5IGtlcHQgYXMgYXMgQmlnIEVuZGlhbi4KLS8vIDIuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIHVwcGVyIGxheWVycywgSmF2YSBvciBCaW5kZXIsIGFyZSBCaWcKLS8vICAgIEVuZGlhbi4KLS8vIDMuIEJ5dGVzIHJlcHJlc2VudGluZyBVVUlEIGNvbWluZyBmcm9tIGxvd2VyIGxheWVyLCBIQ0kgcGFja2V0cywgYXJlIExpdHRsZQotLy8gICAgRW5kaWFuLgotLy8gNC4gVVVJRCBpbiBzdG9yYWdlIGlzIGFsd2F5cyBzdHJpbmcuCi1jbGFzcyBVdWlkIGZpbmFsIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczEyOCA9IDE2OwotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtQnl0ZXMzMiA9IDQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1CeXRlczE2ID0gMjsKLQotICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrU3RyaW5nMTI4Qml0TGVuID0gMzY7Ci0KLSAgc3RhdGljIGNvbnN0IFV1aWQga0VtcHR5OyAgLy8gMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwCi0KLSAgdXNpbmcgVVVJRDEyOEJpdCA9IHN0ZDo6YXJyYXk8dWludDhfdCwga051bUJ5dGVzMTI4PjsKLQotICBVdWlkKCkgPSBkZWZhdWx0OwotCi0gIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSByYW5kb20gMTI4LWJpdCBVVUlELgotICBzdGF0aWMgVXVpZCBHZXRSYW5kb20oKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQgaW4gYnl0ZXMuIEVpdGhlcgotICAvLyBrTnVtQnl0ZXMxNiwga051bUJ5dGVzMzIsIG9yIGtOdW1CeXRlczEyOAotICBzaXplX3QgR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBVVUlEIGNhbiBiZSByZXByZXNlbnRlZCBhcyAxNiBiaXQuCi0gIGJvb2wgSXMxNkJpdCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMTYgYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlELiBVc2UKLSAgLy8gR2V0U2hvcnRlc3RSZXByZXNlbnRhdGlvblNpemUoKSBvciBJczE2Qml0KCkgYmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kLgotICB1aW50MTZfdCBBczE2Qml0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyAzMiBiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVVSUQuIFVzZQotICAvLyBHZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpIGJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZC4KLSAgdWludDMyX3QgQXMzMkJpdCgpIGNvbnN0OwotCi0gIC8vIENvbnZlcnRzIHN0cmluZyByZXByZXNlbnRpbmcgMTI4LCAzMiwgb3IgMTYgYml0IFVVSUQgaW4KLSAgLy8geHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4LCB4eHh4eHh4eCwgb3IgeHh4eCBmb3JtYXQgdG8gVVVJRC4gSWYKLSAgLy8gc2V0LCBvcHRpb25hbCBpc192YWxpZCBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiBjb252ZXJzaW9uIGlzCi0gIC8vIHN1Y2Nlc3NmdWxsLCBmYWxzZSBvdGhlcndpc2UuCi0gIHN0YXRpYyBVdWlkIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHV1aWQsIGJvb2wqIGlzX3ZhbGlkID0gbnVsbHB0cik7Ci0KLSAgLy8gQ29udmVydHMgMTZiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiBVVUlEIHRvIFVVSUQKLSAgc3RhdGljIFV1aWQgRnJvbTE2Qml0KHVpbnQxNl90IHV1aWQxNmJpdCk7Ci0KLSAgLy8gQ29udmVydHMgMzJiaXQgTGl0dGxlIEVuZGlhbiByZXByZXNlbnRhdGlvbiBvZiBVVUlEIHRvIFVVSUQKLSAgc3RhdGljIFV1aWQgRnJvbTMyQml0KHVpbnQzMl90IHV1aWQzMmJpdCk7Ci0KLSAgLy8gQ29udmVydHMgMTI4IGJpdCBCaWcgRW5kaWFuIGFycmF5IHJlcHJlc2VudGluZyBVVUlEIHRvIFVVSUQuCi0gIHN0YXRpYyBjb25zdGV4cHIgVXVpZCBGcm9tMTI4Qml0QkUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCkgewotICAgIFV1aWQgdSh1dWlkKTsKLSAgICByZXR1cm4gdTsKLSAgfQotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgQmlnIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELiB8dXVpZHwgcG9pbnRzCi0gIC8vIHRvIGJlZ2lubmluZyBvZiBhcnJheS4KLSAgc3RhdGljIFV1aWQgRnJvbTEyOEJpdEJFKGNvbnN0IHVpbnQ4X3QqIHV1aWQpOwotCi0gIC8vIENvbnZlcnRzIDEyOCBiaXQgTGl0dGxlIEVuZGlhbiBhcnJheSByZXByZXNlbnRpbmcgVVVJRCB0byBVVUlELgotICBzdGF0aWMgVXVpZCBGcm9tMTI4Qml0TEUoY29uc3QgVVVJRDEyOEJpdCYgdXVpZCk7Ci0KLSAgLy8gQ29udmVydHMgMTI4IGJpdCBMaXR0bGUgRW5kaWFuIGFycmF5IHJlcHJlc2VudGluZyBVVUlEIHRvIFVVSUQuIHx1dWlkfAotICAvLyBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIGFycmF5LgotICBzdGF0aWMgVXVpZCBGcm9tMTI4Qml0TEUoY29uc3QgdWludDhfdCogdXVpZCk7Ci0KLSAgLy8gUmV0dXJucyAxMjggYml0IExpdHRsZSBFbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVVUlECi0gIGNvbnN0IFVVSUQxMjhCaXQgVG8xMjhCaXRMRSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgMTI4IGJpdCBCaWcgRW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVVJRAotICBjb25zdCBVVUlEMTI4Qml0JiBUbzEyOEJpdEJFKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgVVVJRCBpbgotICAvLyB4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHggZm9ybWF0LCBsb3dlcmNhc2UuCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgVVVJRCBpcyBlcXVhbCB0byBrRW1wdHkKLSAgYm9vbCBJc0VtcHR5KCkgY29uc3Q7Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVXVpZCYgcmhzKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFV1aWQmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVdWlkJiByaHMpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3RleHByIFV1aWQoY29uc3QgVVVJRDEyOEJpdCYgdmFsKSA6IHV1e3ZhbH0ge307Ci0KLSAgLy8gTmV0d29yay1ieXRlLW9yZGVyZWQgSUQgKEJpZyBFbmRpYW4pLgotICBVVUlEMTI4Qml0IHV1OwotfTsKLX0gIC8vIG5hbWVzcGFjZSBibHVldG9vdGgKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBibHVldG9vdGg6OlV1aWQmIGEpIHsKLSAgb3MgPDwgYS5Ub1N0cmluZygpOwotICByZXR1cm4gb3M7Ci19Ci0KLS8vIEN1c3RvbSBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gc28gdGhhdCBibHVldG9vdGg6OlVVSUQgY2FuIGJlIHVzZWQgYXMgYSBrZXkKLS8vIGluIHN0ZDo6dW5vcmRlcmVkX21hcC4KLW5hbWVzcGFjZSBzdGQgewotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IGhhc2g8Ymx1ZXRvb3RoOjpVdWlkPiB7Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgYmx1ZXRvb3RoOjpVdWlkJiBrZXkpIGNvbnN0IHsKLSAgICBjb25zdCBhdXRvJiB1dWlkX2J5dGVzID0ga2V5LlRvMTI4Qml0QkUoKTsKLSAgICBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+IGhhc2hfZm47Ci0gICAgcmV0dXJuIGhhc2hfZm4oc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odXVpZF9ieXRlcy5kYXRhKCkpLCB1dWlkX2J5dGVzLnNpemUoKSkpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS92ZW5kb3JfbGlicy90ZXN0X3ZlbmRvcl9saWIvdHlwZXMvdGVzdC9ibHVldG9vdGgvdXVpZF91bml0dGVzdC5jYyBiL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy90ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJlZjEwLi4wMDAwMDAwCi0tLSBhL3ZlbmRvcl9saWJzL3Rlc3RfdmVuZG9yX2xpYi90eXBlcy90ZXN0L2JsdWV0b290aC91dWlkX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxibHVldG9vdGgvdXVpZC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLXVzaW5nIGJsdWV0b290aDo6VXVpZDsKLQotc3RhdGljIGNvbnN0IFV1aWQgT05FUyA9IFV1aWQ6OkZyb20xMjhCaXRCRSgKLSAgICBVdWlkOjpVVUlEMTI4Qml0e3sweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExfX0pOwotCi1zdGF0aWMgY29uc3QgVXVpZCBTRVFVRU5USUFMID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFV1aWQ6OlVVSUQxMjhCaXR7ezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODl9fSk7Ci0KLWNvbnN0ZXhwciBVdWlkIGtCYXNlID0gVXVpZDo6RnJvbTEyOEJpdEJFKAotICAgIFV1aWQ6OlVVSUQxMjhCaXR7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9fSk7Ci0KLVRFU1QoVXVpZFRlc3QsIElzRW1wdHkpIHsKLSAgRVhQRUNUX1RSVUUoVXVpZDo6a0VtcHR5LklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9GQUxTRShrQmFzZS5Jc0VtcHR5KCkpOwotfQotCi1URVNUKFV1aWRUZXN0LCBHZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSkgewotICBFWFBFQ1RfVFJVRShVdWlkOjprTnVtQnl0ZXMxNiA9PSBrQmFzZS5HZXRTaG9ydGVzdFJlcHJlc2VudGF0aW9uU2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoVXVpZDo6a051bUJ5dGVzMzIgPT0gVXVpZDo6RnJvbTMyQml0KDB4MDEyMzQ1NjcpLkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkpOwotICBFWFBFQ1RfVFJVRShVdWlkOjprTnVtQnl0ZXMxMjggPT0gVXVpZDo6a0VtcHR5LkdldFNob3J0ZXN0UmVwcmVzZW50YXRpb25TaXplKCkpOwotfQotCi1URVNUKFV1aWRUZXN0LCBBczE2Qml0KSB7Ci0gIC8vIEV2ZW4gdGhvdWdoIHRoaXMgaXMgaXMgbm90IDE2Yml0IFVVSUQsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCBwcm9wZXIgYml0cwotICBFWFBFQ1RfRVEoKHVpbnQxNl90KTB4MTExMSwgT05FUy5BczE2Qml0KCkpOwotICBFWFBFQ1RfRVEoKHVpbnQxNl90KTB4NDU2NywgU0VRVUVOVElBTC5BczE2Qml0KCkpOwotICBFWFBFQ1RfRVEoKHVpbnQxNl90KTB4MDAwMCwga0Jhc2UuQXMxNkJpdCgpKTsKLX0KLQotVEVTVChVdWlkVGVzdCwgQXMzMkJpdCkgewotICAvLyBFdmVuIHRob3VnaCB0aGlzIGlzIGlzIG5vdCAzMmJpdCBVVUlELCB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgcHJvcGVyIGJpdHMKLSAgRVhQRUNUX0VRKCh1aW50MzJfdCkweDExMTExMTExLCBPTkVTLkFzMzJCaXQoKSk7Ci0gIEVYUEVDVF9FUSgodWludDMyX3QpMHgwMTIzNDU2NywgU0VRVUVOVElBTC5BczMyQml0KCkpOwotICBFWFBFQ1RfRVEoKHVpbnQzMl90KTB4MDAwMDAwMDAsIGtCYXNlLkFzMzJCaXQoKSk7Ci0gIEVYUEVDVF9FUSgodWludDMyX3QpMHgxMjM0NTY3OCwgVXVpZDo6RnJvbTMyQml0KDB4MTIzNDU2NzgpLkFzMzJCaXQoKSk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIElzMTZCaXQpIHsKLSAgRVhQRUNUX0ZBTFNFKE9ORVMuSXMxNkJpdCgpKTsKLSAgRVhQRUNUX0ZBTFNFKFNFUVVFTlRJQUwuSXMxNkJpdCgpKTsKLSAgRVhQRUNUX1RSVUUoa0Jhc2UuSXMxNkJpdCgpKTsKLSAgRVhQRUNUX1RSVUUoVXVpZDo6RnJvbVN0cmluZygiMWFlOCIpLklzMTZCaXQoKSk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIEZyb20xNkJpdCkgewotICBFWFBFQ1RfRVEoVXVpZDo6RnJvbTE2Qml0KDB4MDAwMCksIGtCYXNlKTsKLQotICBjb25zdCB1aW50OF90IHUyW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIFV1aWQgdXVpZCA9IFV1aWQ6OkZyb20xNkJpdCgweDAwMDEpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgwMCwgMHgwMCwgMHg1NSwgMHgzZSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIHV1aWQgPSBVdWlkOjpGcm9tMTZCaXQoMHg1NTNlKTsKLSAgRVhQRUNUX1RSVUUobWVtY21wKCZ1dWlkLCB1Mywgc2l6ZW9mKHUzKSkgPT0gMCk7Ci0KLSAgY29uc3QgdWludDhfdCB1NFtdID0gezB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWYsIDB4OWIsIDB4MzQsIDB4ZmJ9OwotICB1dWlkID0gVXVpZDo6RnJvbTE2Qml0KDB4ZmZmZik7Ci0gIEVYUEVDVF9UUlVFKG1lbWNtcCgmdXVpZCwgdTQsIHNpemVvZih1NCkpID09IDApOwotfQotCi1URVNUKFV1aWRUZXN0LCBGcm9tMzJCaXQpIHsKLSAgRVhQRUNUX0VRKFV1aWQ6OkZyb20zMkJpdCgweDAwMDAwMDAwKSwga0Jhc2UpOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTJbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbTMyQml0KDB4MDAwMDAwMDEpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgzMywgMHg0NCwgMHg1NSwgMHgzZSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIHV1aWQgPSBVdWlkOjpGcm9tMzJCaXQoMHgzMzQ0NTUzZSk7Ci0gIEVYUEVDVF9UUlVFKG1lbWNtcCgmdXVpZCwgdTMsIHNpemVvZih1MykpID09IDApOwotCi0gIGNvbnN0IHVpbnQ4X3QgdTRbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDVmLCAweDliLCAweDM0LCAweGZifTsKLSAgdXVpZCA9IFV1aWQ6OkZyb20zMkJpdCgweGZmZmZmZmZmKTsKLSAgRVhQRUNUX1RSVUUobWVtY21wKCZ1dWlkLCB1NCwgc2l6ZW9mKHU0KSkgPT0gMCk7Ci19Ci0KLVRFU1QoVXVpZFRlc3QsIFRvU3RyaW5nKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIFVVSURfQkFTRV9TVFIgPSAiMDAwMDAwMDAtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgVVVJRF9FTVBfU1RSID0gIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCI7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIFVVSURfT05FU19TVFIgPSAiMTExMTExMTEtMTExMS0xMTExLTExMTEtMTExMTExMTExMTExIjsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgVVVJRF9TRVFfU1RSID0gIjAxMjM0NTY3LTg5YWItY2RlZi1hYmNkLWVmMDEyMzQ1Njc4OSI7Ci0KLSAgRVhQRUNUX0VRKFVVSURfQkFTRV9TVFIsIGtCYXNlLlRvU3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoVVVJRF9FTVBfU1RSLCBVdWlkOjprRW1wdHkuVG9TdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShVVUlEX09ORVNfU1RSLCBPTkVTLlRvU3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoVVVJRF9TRVFfU1RSLCBTRVFVRU5USUFMLlRvU3RyaW5nKCkpOwotCi0gIFV1aWQgdXVpZCA9IFV1aWQ6OkZyb20zMkJpdCgweDEyMzQ1Njc4KTsKLSAgRVhQRUNUX0VRKCIxMjM0NTY3OC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiLCB1dWlkLlRvU3RyaW5nKCkpOwotfQotCi1URVNUKEJ0aWZTdG9yYWdlVGVzdCwgdGVzdF9zdHJpbmdfdG9fdXVpZCkgewotICBjb25zdCB1aW50OF90IHUxW10gPSB7MHhlMywgMHg5YywgMHg2MiwgMHg4NSwgMHg4NiwgMHg3ZiwgMHg0YiwgMHgxZCwgMHg5ZCwgMHhiMCwgMHgzNSwgMHhmYiwgMHhkOSwgMHhhZSwgMHhiZiwgMHgyMn07Ci0gIGJvb2wgaXNfdmFsaWQgPSBmYWxzZTsKLSAgVXVpZCB1dWlkID0gVXVpZDo6RnJvbVN0cmluZygiZTM5YzYyODUtODY3Zi00YjFkLTlkYjAtMzVmYmQ5YWViZjIyIiwgJmlzX3ZhbGlkKTsKLSAgRVhQRUNUX1RSVUUoaXNfdmFsaWQpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUxLCBzaXplb2YodTEpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUyW10gPSB7MHgwMCwgMHgwMCwgMHgxYSwgMHhlOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIGlzX3ZhbGlkID0gZmFsc2U7Ci0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxQWU4IiwgJmlzX3ZhbGlkKTsKLSAgRVhQRUNUX1RSVUUoaXNfdmFsaWQpOwotICBFWFBFQ1RfVFJVRShtZW1jbXAoJnV1aWQsIHUyLCBzaXplb2YodTIpKSA9PSAwKTsKLQotICBjb25zdCB1aW50OF90IHUzW10gPSB7MHgxMiwgMHgzNCwgMHgxMSwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg1ZiwgMHg5YiwgMHgzNCwgMHhmYn07Ci0gIGlzX3ZhbGlkID0gZmFsc2U7Ci0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxMjM0MTEyOCIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9UUlVFKGlzX3ZhbGlkKTsKLSAgRVhQRUNUX1RSVUUobWVtY21wKCZ1dWlkLCB1Mywgc2l6ZW9mKHUzKSkgPT0gMCk7Ci19Ci0KLVRFU1QoQnRpZlN0b3JhZ2VUZXN0LCB0ZXN0X3N0cmluZ190b191dWlkX2ludmFsaWQpIHsKLSAgYm9vbCBpc192YWxpZCA9IGZhbHNlOwotICBVdWlkIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCJUaGlzIGlzIG5vdCBhIFVVSUQiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotCi0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxMTIxMiIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9GQUxTRShpc192YWxpZCk7Ci0KLSAgdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIjExMjEgIiwgJmlzX3ZhbGlkKTsKLSAgRVhQRUNUX0ZBTFNFKGlzX3ZhbGlkKTsKLQotICB1dWlkID0gVXVpZDo6RnJvbVN0cmluZygiQUdGRSIsICZpc192YWxpZCk7Ci0gIEVYUEVDVF9GQUxTRShpc192YWxpZCk7Ci0KLSAgdXVpZCA9IFV1aWQ6OkZyb21TdHJpbmcoIkFCRkciLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotCi0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCJlMzljNjI4NTg2N2YxNGIxZDlkYjAzNWZiZDlhZWJmMjIiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotCi0gIHV1aWQgPSBVdWlkOjpGcm9tU3RyaW5nKCIxMjIzNDU2Ny04OWFiLWNkZWYtYWJjZC1lZjAxMjM0NTY3WloiLCAmaXNfdmFsaWQpOwotICBFWFBFQ1RfRkFMU0UoaXNfdmFsaWQpOwotfQpkaWZmIC0tZ2l0IGEvdm5kL2JsZS92ZW5kb3JfaGNpZGVmcy5oIGIvdm5kL2JsZS92ZW5kb3JfaGNpZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc4MmFmLi4wMDAwMDAwCi0tLSBhL3ZuZC9ibGUvdmVuZG9yX2hjaWRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDMtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBOYW1lICAgICAgICB2ZW5kb3JfaGNpZGVmcy5oCi0gKgotICogIEZ1bmN0aW9uICAgIFRoaXMgZmlsZSBjb250YWlucyBCcm9hZGNvbSBTcGVjaWZpYyBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgZGVmaW5pdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFZFTkRPUl9IQ0lERUZTX0gKLSNkZWZpbmUgVkVORE9SX0hDSURFRlNfSAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFByaXZhdGUgYWRkcmVzcyByZXNvbHV0aW9uIFZTQwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBWU0MgKi8KLSNkZWZpbmUgSENJX1ZFTkRPUl9CTEVfUlBBX1ZTQyAoMHgwMTU1IHwgSENJX0dSUF9WRU5ET1JfU1BFQ0lGSUMpCi0KLS8qIFN1YiBjb2RlcyAqLwotI2RlZmluZSBIQ0lfVkVORE9SX0JMRV9SUEFfRU5BQkxFIDB4MDEKLSNkZWZpbmUgSENJX1ZFTkRPUl9CTEVfUlBBX0FERF9JUksgMHgwMgotI2RlZmluZSBIQ0lfVkVORE9SX0JMRV9SUEFfUkVNT1ZFX0lSSyAweDAzCi0jZGVmaW5lIEhDSV9WRU5ET1JfQkxFX1JQQV9DTEVBUl9JUksgMHgwNAotI2RlZmluZSBIQ0lfVkVORE9SX0JMRV9SUEFfUkVBRF9JUksgMHgwNQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFkdmVydGlzaW5nIGRhdGEgcGF5bG9hZCBmaWx0ZXIgVlNDCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFZTQyAqLwotI2RlZmluZSBIQ0lfVkVORE9SX0JMRV9QQ0ZfVlNDICgweDAxNTcgfCBIQ0lfR1JQX1ZFTkRPUl9TUEVDSUZJQykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bmQvaW5jbHVkZS92ZW5kb3JfYXBpLmggYi92bmQvaW5jbHVkZS92ZW5kb3JfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTA3NzguLjAwMDAwMDAKLS0tIGEvdm5kL2luY2x1ZGUvdmVuZG9yX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOYW1lOiAgICAgICAgIHZlbmRvcl9hcGkuaAotICoKLSAqIERlc2NyaXB0aW9uOiAgVmVuZG9yIHNwZWNpZmljIEJURSBBUEkgZnVuY3Rpb24gZXh0ZXJuYWwgZGVmaW5pdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIEJST0FEQ09NIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBCcm9hZGNvbSBCbHVldG9vdGggQ29yZS4gUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIFZFTkRPUl9BUElfSAotI2RlZmluZSBWRU5ET1JfQVBJX0gKLQotI2luY2x1ZGUgImJ0bV9hcGkuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBSZXNvbHZhYmxlIHByaXZhdGUgYWRkcmVzcyBvZmZsb2FkIFZTQyBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1lbnVtIHsgQlRNX0JMRV9QUklWQUNZX0VOQUJMRSwgQlRNX0JMRV9QUklWQUNZX0RJU0FCTEUgfTsKLQotI2VuZGlmCg==